ZGlmZiAtLWdpdCBhL3NyYy9iYXNlL3N0cmluZ191dGlsX3N0YXJib2FyZC5oIGIvc3JjL2Jhc2Uvc3RyaW5nX3V0aWxfc3RhcmJvYXJkLmgKaW5kZXggNTMzZjQ5My4uMTJmOTc4YiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2Uvc3RyaW5nX3V0aWxfc3RhcmJvYXJkLmgKKysrIGIvc3JjL2Jhc2Uvc3RyaW5nX3V0aWxfc3RhcmJvYXJkLmgKQEAgLTM1LDYgKzM1LDEwIEBACiAgIHJldHVybiBTYlN0cmluZ0NvbXBhcmVOb0Nhc2VOKHN0cmluZzEsIHN0cmluZzIsIGNvdW50KTsKIH0KIAorI2lmIGRlZmluZWQodnNucHJpbnRmKQorI3VuZGVmIHZzbnByaW50ZgorI2VuZGlmCisKIGlubGluZSBpbnQgdnNucHJpbnRmKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJndW1lbnRzKSB7CiAgIHJldHVybiBTYlN0cmluZ0Zvcm1hdChidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJndW1lbnRzKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvQ0hBTkdFTE9HLm1kIGIvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKaW5kZXggNDMzZTU2NS4uMDNjNDc1MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKKysrIGIvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKQEAgLTcsNiArNywxOCBAQAogICAtIEZpeCBidWcgd2hlcmUgQ29iYWx0IHdvdWxkIG5vdCByZWZyZXNoIHRoZSBsYXlvdXQgd2hlbiB0aGUgdGV4dENvbnRlbnQKICAgICBwcm9wZXJ0eSBvZiBhIERPTSBUZXh0Tm9kZSBpcyBtb2RpZmllZC4KIAorIC0gKipBZGQgc3VwcG9ydCBmb3IgZGVjb2RpbmcgSlBFRyBpbWFnZXMgYXMgbXVsdGktcGxhbmUgWVVWKioKKworICAgSlBFRyBpbWFnZXMgYXJlIGRlY29kZWQgaW50byBSR0JBIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIENvYmFsdC4gIFRoZSBuYXRpdmUKKyAgIGZvcm1hdCBvZiBtb3N0IEpQRUcgaW1hZ2VzIGlzIFlWMTIsIHdoaWNoIHRha2VzIG9ubHkgMy84IG9mIG1lbW9yeSBjb21wYXJlIHRvCisgICBSR0JBLiAgTm93IEpQRUcgaW1hZ2VzIGFyZSBkZWNvZGVkIGludG8gbXVsdGktcGxhbmUgWVVWIGltYWdlcyBvbiBwbGF0Zm9ybXMKKyAgIHdpdGggInJhc3Rlcml6ZXJfdHlwZSIgc2V0IHRvICJkaXJlY3QtZ2xlcyIuICBBcyBhIHJlc3VsdCwgd2hlbiBkZWNvZGluZyB0bworICAgbXVsdGktcGxhbmUgaW1hZ2UgaXMgZW5hYmxlZCwgaW1hZ2UgY2FjaGUgc2l6ZSBzZXQgYnkgQXV0b01lbSB3aWxsIGJlIHJlZHVjZWQKKyAgIGJ5IGhhbGYgZHVlIHRvIHRoZSBtb3JlIGNvbXBhY3QgbmF0dXJlIG9mIHRoZSBZVVYgaW1hZ2UgZm9ybWF0IHZlcnN1cyBSR0IuCisgICBUaGlzIGZlYXR1cmUgY2FuIGFsc28gYmUgZW5hYmxlZC9kaXNhYmxlZCBleHBsaWNpdGx5IGJ5IHBhc3NpbmcgY29tbWFuZCBsaW5lCisgICBwYXJhbWV0ZXIgImFsbG93X2ltYWdlX2RlY29kaW5nX3RvX211bHRpX3BsYW5lIiB0byBDb2JhbHQgd2l0aCB2YWx1ZSAidHJ1ZSIKKyAgIG9yICJmYWxzZSIuCisKICMjIFZlcnNpb24gMTkKICAtICoqQWRkIHN1cHBvcnQgZm9yIFY4IEphdmFTY3JpcHQgRW5naW5lKioKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpby5neXAgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cAppbmRleCBjNjFiMTBkLi44NmE5NzMyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cApAQCAtMTcsNiArMTcsMjIgQEAKICAgICAnc2JfcGVkYW50aWNfd2FybmluZ3MnOiAxLAogICB9LAogICAndGFyZ2V0cyc6IFsKKyAgICAjIFRoaXMgdGFyZ2V0IGNhbiBjaG9vc2UgdGhlIGNvcnJlY3QgbWVkaWEgZGVwZW5kZW5jeS4KKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVkaWFfYXVkaW8nLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsnY29iYWx0X21lZGlhX3NvdXJjZV8yMDE2PT0xJywgeworICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhL21lZGlhMi5neXA6bWVkaWEyJywKKyAgICAgICAgICBdLAorICAgICAgICB9LCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWEvbWVkaWEuZ3lwOm1lZGlhJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgIF0sCisgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnYXVkaW8nLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLApAQCAtNDYsNiArNjIsNyBAQAogICAgICAgICAnYXVkaW9fbm9kZV9vdXRwdXQuaCcsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ21lZGlhX2F1ZGlvJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwOmdlbmVyYXRlZF90eXBlcycsCiAgICAgICBdLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5jYwppbmRleCBiNjk0NzkyLi5lNTE3YTlkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5jYwpAQCAtMTQsMTcgKzE0LDIyIEBACiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmgiCiAKKyNpbmNsdWRlIDxtYXRoLmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5oIgorI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfb3V0cHV0LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGF1ZGlvIHsKIAogI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQordHlwZWRlZiBtZWRpYTo6SW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIEludGVybGVhdmVkU2luY1Jlc2FtcGxlcjsKIHR5cGVkZWYgbWVkaWE6OlNoZWxsQXVkaW9CdXMgU2hlbGxBdWRpb0J1czsKICNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCit0eXBlZGVmIDo6bWVkaWE6OkludGVybGVhdmVkU2luY1Jlc2FtcGxlciBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI7CiB0eXBlZGVmIDo6bWVkaWE6OlNoZWxsQXVkaW9CdXMgU2hlbGxBdWRpb0J1czsKICNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAKQEAgLTQ5LDYgKzU0LDEzIEBACiAgIEF1ZGlvTG9jazo6QXV0b0xvY2sgbG9jayhhdWRpb19sb2NrKCkpOwogCiAgIGJ1ZmZlcl8gPSBidWZmZXI7CisKKyAgaWYgKGJ1ZmZlcl8tPnNhbXBsZV9yYXRlKCkgIT0gY29udGV4dCgpLT5zYW1wbGVfcmF0ZSgpKSB7CisgICAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyXyA9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI+KG5ldyBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXIoCisgICAgICAgICAgICBidWZmZXJfLT5zYW1wbGVfcmF0ZSgpIC8gY29udGV4dCgpLT5zYW1wbGVfcmF0ZSgpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzI+KGJ1ZmZlcl8tPmF1ZGlvX2J1cygpLT5jaGFubmVscygpKSkpOworICB9CiB9CiAKIHZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpTdGFydChkb3VibGUgd2hlbiwgZG91YmxlIG9mZnNldCwKQEAgLTEwOSw3ICsxMjEsOSBAQAogICAgIHJldHVybiBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+KCk7CiAgIH0KIAotICBpZiAoc3RhdGVfID09IGtTdG9wcGVkIHx8IGJ1ZmZlcl8tPmxlbmd0aCgpID09IHJlYWRfaW5kZXhfKSB7CisgIGlmIChzdGF0ZV8gPT0ga1N0b3BwZWQgfHwKKyAgICAgICghaW50ZXJsZWF2ZWRfcmVzYW1wbGVyXyAmJiByZWFkX2luZGV4XyA9PSBidWZmZXJfLT5sZW5ndGgoKSkgfHwKKyAgICAgIChpbnRlcmxlYXZlZF9yZXNhbXBsZXJfICYmIGludGVybGVhdmVkX3Jlc2FtcGxlcl8tPlJlYWNoZWRFT1MoKSkpIHsKICAgICAqZmluaXNoZWQgPSB0cnVlOwogICAgIHJldHVybiBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+KCk7CiAgIH0KQEAgLTEyMCwyNSArMTM0LDkzIEBACiAgIERDSEVDS19FUShzYW1wbGVfdHlwZSwgYXVkaW9fYnVzLT5zYW1wbGVfdHlwZSgpKTsKIAogICBpbnQzMiBmcmFtZXNfdG9fZW5kID0gYnVmZmVyXy0+bGVuZ3RoKCkgLSByZWFkX2luZGV4XzsKLSAgbnVtYmVyX29mX2ZyYW1lcyA9IHN0ZDo6bWluKG51bWJlcl9vZl9mcmFtZXMsIGZyYW1lc190b19lbmQpOworICBpbnQzMiBjaGFubmVsX2NvdW50ID0gc3RhdGljX2Nhc3Q8aW50MzI+KGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSk7CiAKICAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiByZXN1bHQ7CiAKKyAgaWYgKCFpbnRlcmxlYXZlZF9yZXNhbXBsZXJfKSB7CisgICAgaW50MzIgYXVkaW9fYnVzX2ZyYW1lcyA9IHN0ZDo6bWluKG51bWJlcl9vZl9mcmFtZXMsIGZyYW1lc190b19lbmQpOworICAgIGlmIChzYW1wbGVfdHlwZSA9PSBrU2FtcGxlVHlwZUludDE2KSB7CisgICAgICByZXN1bHQucmVzZXQobmV3IFNoZWxsQXVkaW9CdXMoCisgICAgICAgICAgY2hhbm5lbF9jb3VudCwgYXVkaW9fYnVzX2ZyYW1lcywKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2Kj4oYXVkaW9fYnVzLT5pbnRlcmxlYXZlZF9kYXRhKCkpICsKKyAgICAgICAgICAgICAgcmVhZF9pbmRleF8gKiBjaGFubmVsX2NvdW50KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERDSEVDS19FUShzYW1wbGVfdHlwZSwga1NhbXBsZVR5cGVGbG9hdDMyKTsKKworICAgICAgcmVzdWx0LnJlc2V0KG5ldyBTaGVsbEF1ZGlvQnVzKAorICAgICAgICAgIGNoYW5uZWxfY291bnQsIGF1ZGlvX2J1c19mcmFtZXMsCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGF1ZGlvX2J1cy0+aW50ZXJsZWF2ZWRfZGF0YSgpKSArCisgICAgICAgICAgICAgIHJlYWRfaW5kZXhfICogY2hhbm5lbF9jb3VudCkpOworICAgIH0KKyAgICByZWFkX2luZGV4XyArPSBhdWRpb19idXNfZnJhbWVzOworICAgIHJldHVybiByZXN1bHQuUGFzcygpOworICB9CisKKyAgLy8gUmVzYW1wbGUgYXVkaW8gaWYgdGhlIGF1ZGlvIGJ1ZmZlciBzYW1wbGUgcmF0ZSBpcyBub3QgZXF1YWwgdG8gdGhlIGF1ZGlvCisgIC8vIGNvbnRleHQgc2FtcGxlIHJhdGUuCisKKyAgLy8gUXVldWUgZnJhbWVzLgorICB3aGlsZSAoIWludGVybGVhdmVkX3Jlc2FtcGxlcl8tPkhhc0Vub3VnaERhdGEobnVtYmVyX29mX2ZyYW1lcykpIHsKKyAgICBpbnQzMiBmcmFtZXNfdG9fcXVldWUgPSBzdGF0aWNfY2FzdDxpbnQzMj4oY2VpbCgKKyAgICAgICAgbnVtYmVyX29mX2ZyYW1lcyAqIGJ1ZmZlcl8tPnNhbXBsZV9yYXRlKCkgLyBjb250ZXh0KCktPnNhbXBsZV9yYXRlKCkpKTsKKworICAgIGZyYW1lc190b19xdWV1ZSA9IHN0ZDo6bWluKGZyYW1lc190b19xdWV1ZSwgZnJhbWVzX3RvX2VuZCk7CisKKyAgICBpZiAoc2FtcGxlX3R5cGUgPT0ga1NhbXBsZVR5cGVJbnQxNikgeworICAgICAgaW50MTYqIHNhbXBsZXNfaW5faW50MTYgPQorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTYqPihhdWRpb19idXMtPmludGVybGVhdmVkX2RhdGEoKSkgKworICAgICAgICAgIHJlYWRfaW5kZXhfICogY2hhbm5lbF9jb3VudDsKKyAgICAgIHNjb3BlZF9hcnJheTxmbG9hdD4gc2FtcGxlc19pbl9mbG9hdCgKKyAgICAgICAgICBuZXcgZmxvYXRbZnJhbWVzX3RvX3F1ZXVlICogY2hhbm5lbF9jb3VudF0pOworICAgICAgZm9yIChpbnQzMiBpID0gMDsgaSA8IGZyYW1lc190b19xdWV1ZSAqIGNoYW5uZWxfY291bnQ7ICsraSkgeworICAgICAgICBzYW1wbGVzX2luX2Zsb2F0W2ldID0gQ29udmVydFNhbXBsZTxpbnQxNiwgZmxvYXQ+KHNhbXBsZXNfaW5faW50MTZbaV0pOworICAgICAgfQorCisgICAgICBpbnRlcmxlYXZlZF9yZXNhbXBsZXJfLT5RdWV1ZUJ1ZmZlcihzYW1wbGVzX2luX2Zsb2F0LlBhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc190b19xdWV1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERDSEVDS19FUShzYW1wbGVfdHlwZSwga1NhbXBsZVR5cGVGbG9hdDMyKTsKKworICAgICAgZmxvYXQqIHNhbXBsZXNfaW5fZmxvYXQgPQorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihhdWRpb19idXMtPmludGVybGVhdmVkX2RhdGEoKSkgKworICAgICAgICAgIHJlYWRfaW5kZXhfICogY2hhbm5lbF9jb3VudDsKKyAgICAgIGludGVybGVhdmVkX3Jlc2FtcGxlcl8tPlF1ZXVlQnVmZmVyKHNhbXBsZXNfaW5fZmxvYXQsIGZyYW1lc190b19xdWV1ZSk7CisgICAgfQorCisgICAgcmVhZF9pbmRleF8gKz0gZnJhbWVzX3RvX3F1ZXVlOworICAgIGZyYW1lc190b19lbmQgPSBidWZmZXJfLT5sZW5ndGgoKSAtIHJlYWRfaW5kZXhfOworCisgICAgLy8gTGFzdCB0aW1lIHF1ZXVlaW5nIGJ1ZmZlcjogc2lnbmlmeSBlbmQgb2Ygc3RyZWFtLgorICAgIGlmIChyZWFkX2luZGV4XyA9PSBidWZmZXJfLT5sZW5ndGgoKSkgeworICAgICAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyXy0+UXVldWVCdWZmZXIoTlVMTCwgMCk7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgcmVzYW1wbGVkIGZyYW1lcy4KICAgaWYgKHNhbXBsZV90eXBlID09IGtTYW1wbGVUeXBlSW50MTYpIHsKLSAgICByZXN1bHQucmVzZXQobmV3IG1lZGlhOjpTaGVsbEF1ZGlvQnVzKAotICAgICAgICBhdWRpb19idXMtPmNoYW5uZWxzKCksIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTYqPihhdWRpb19idXMtPmludGVybGVhdmVkX2RhdGEoKSkgKwotICAgICAgICAgICAgcmVhZF9pbmRleF8gKiBhdWRpb19idXMtPmNoYW5uZWxzKCkpKTsKKyAgICBzY29wZWRfYXJyYXk8ZmxvYXQ+IGludGVybGVhdmVkX291dHB1dCgKKyAgICAgICAgbmV3IGZsb2F0W251bWJlcl9vZl9mcmFtZXMgKiBjaGFubmVsX2NvdW50XSk7CisgICAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyXy0+UmVzYW1wbGUoaW50ZXJsZWF2ZWRfb3V0cHV0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9mcmFtZXMpOworCisgICAgcmVzdWx0LnJlc2V0KG5ldyBTaGVsbEF1ZGlvQnVzKGNoYW5uZWxfY291bnQsIG51bWJlcl9vZl9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYW1wbGVUeXBlSW50MTYsIGtTdG9yYWdlVHlwZUludGVybGVhdmVkKSk7CisgICAgZm9yIChpbnQzMiBpID0gMDsgaSA8IGNoYW5uZWxfY291bnQgKiBudW1iZXJfb2ZfZnJhbWVzOyArK2kpIHsKKyAgICAgIHVpbnQ4KiBkZXN0X3B0ciA9IHJlc3VsdC0+aW50ZXJsZWF2ZWRfZGF0YSgpICsgc2l6ZW9mKGludDE2KSAqIGk7CisgICAgICAqcmVpbnRlcnByZXRfY2FzdDxpbnQxNio+KGRlc3RfcHRyKSA9CisgICAgICAgICAgQ29udmVydFNhbXBsZTxmbG9hdCwgaW50MTY+KGludGVybGVhdmVkX291dHB1dFtpXSk7CisgICAgfQogICB9IGVsc2UgewogICAgIERDSEVDS19FUShzYW1wbGVfdHlwZSwga1NhbXBsZVR5cGVGbG9hdDMyKTsKIAotICAgIHJlc3VsdC5yZXNldChuZXcgbWVkaWE6OlNoZWxsQXVkaW9CdXMoCi0gICAgICAgIGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSwgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGF1ZGlvX2J1cy0+aW50ZXJsZWF2ZWRfZGF0YSgpKSArCi0gICAgICAgICAgICByZWFkX2luZGV4XyAqIGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSkpOworICAgIHJlc3VsdC5yZXNldChuZXcgU2hlbGxBdWRpb0J1cyhjaGFubmVsX2NvdW50LCBudW1iZXJfb2ZfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2FtcGxlVHlwZUZsb2F0MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTdG9yYWdlVHlwZUludGVybGVhdmVkKSk7CisgICAgaW50ZXJsZWF2ZWRfcmVzYW1wbGVyXy0+UmVzYW1wbGUoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihyZXN1bHQtPmludGVybGVhdmVkX2RhdGEoKSksIG51bWJlcl9vZl9mcmFtZXMpOwogICB9CiAKLSAgcmVhZF9pbmRleF8gKz0gbnVtYmVyX29mX2ZyYW1lczsKICAgcmV0dXJuIHJlc3VsdC5QYXNzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmggYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5oCmluZGV4IDNkMmI0ODUuLjIyNjM0YjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuaApAQCAtMjEsOCArMjEsMTAgQEAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fbm9kZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgogI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmgiCiAjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAibWVkaWEvYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmgiCiAjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCkBAIC0zNSw4ICszNywxMCBAQAogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvQnVmZmVyU291cmNlTm9kZQogY2xhc3MgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIDogcHVibGljIEF1ZGlvTm9kZSB7CiAjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIHR5cGVkZWYgbWVkaWE6OkludGVybGVhdmVkU2luY1Jlc2FtcGxlciBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI7CiAgIHR5cGVkZWYgbWVkaWE6OlNoZWxsQXVkaW9CdXMgU2hlbGxBdWRpb0J1czsKICNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIHR5cGVkZWYgOjptZWRpYTo6SW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIEludGVybGVhdmVkU2luY1Jlc2FtcGxlcjsKICAgdHlwZWRlZiA6Om1lZGlhOjpTaGVsbEF1ZGlvQnVzIFNoZWxsQXVkaW9CdXM7CiAjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCkBAIC0xMDIsNiArMTA2LDEwIEBACiAgIC8vIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24uCiAgIGludDMyIHJlYWRfaW5kZXhfOwogCisgIC8vIHxpbnRlcmxlYXZlZF9yZXNhbXBsZXJffCBpcyB0aGUgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIG9iamVjdCB0aGF0IHdpbGwKKyAgLy8gYmUgdXNlZCBpZiByZXNhbXBsaW5nIG5lZWRzIHRvIG9jY3VyLgorICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyPiBpbnRlcmxlYXZlZF9yZXNhbXBsZXJfOworCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0J1ZmZlclNvdXJjZU5vZGUpOwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmNjCmluZGV4IGY2ZTNmOWEuLjU0ZjhmZWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2NvbnRleHQuY2MKQEAgLTIzLDcgKzIzLDkgQEAKICAgICA6IEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVCh3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSksCiAgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoCiAgICAgICAgICAgd2Vha190aGlzXyh3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKSwKLSAgICAgIHNhbXBsZV9yYXRlXygwLjBmKSwKKyAgICAgIHNhbXBsZV9yYXRlXygKKyAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oU2JBdWRpb1NpbmtHZXROZWFyZXN0U3VwcG9ydGVkU2FtcGxlRnJlcXVlbmN5KAorICAgICAgICAgICAgICBrU3RhbmRhcmRPdXRwdXRTYW1wbGVSYXRlKSkpLAogICAgICAgY3VycmVudF90aW1lXygwLjBmKSwKICAgICAgIGF1ZGlvX2xvY2tfKG5ldyBBdWRpb0xvY2soKSksCiAgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2RldmljZS5jYyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmNjCmluZGV4IGY1OTY5YjAuLjJiOTlkYzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmNjCkBAIC00Niw3ICs0Niw2IEBACiBuYW1lc3BhY2UgewogY29uc3QgaW50IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzID0gMTAyNDsKIGNvbnN0IGludCBrRnJhbWVzUGVyQ2hhbm5lbCA9IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzICogODsKLWNvbnN0IGludCBrU3RhbmRhcmRPdXRwdXRTYW1wbGVSYXRlID0gNDgwMDA7CiB9ICAvLyBuYW1lc3BhY2UKIAogI2lmIGRlZmluZWQoU0JfVVNFX1NCX0FVRElPX1NJTkspCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9faGVscGVycy5oCmluZGV4IDM5ZjU4NDcuLjI5MTQzNjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9faGVscGVycy5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9faGVscGVycy5oCkBAIC01MCw2ICs1MCw4IEBACiAKIGNvbnN0IGZsb2F0IGtNYXhJbnQxNkFzRmxvYXQzMiA9IDMyNzY3LjBmOwogCitjb25zdCBpbnQga1N0YW5kYXJkT3V0cHV0U2FtcGxlUmF0ZSA9IDQ4MDAwOworCiAjaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCiAvLyBHZXQgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZS4KIGlubGluZSBzaXplX3QgR2V0U3RhcmJvYXJkU2FtcGxlVHlwZVNpemUoU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0X291dHB1dF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0X291dHB1dF90ZXN0LmNjCmluZGV4IDc4NjE3ODhjLi44ZjZjMzZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXRfb3V0cHV0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0X291dHB1dF90ZXN0LmNjCkBAIC0xMiw2ICsxMiw4IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorI2luY2x1ZGUgPG1hdGguaD4KKwogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuaCIKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19oZWxwZXJzLmgiCkBAIC0zMSw3ICszMyw3IEBACiB0eXBlZGVmIDo6bWVkaWE6OlNoZWxsQXVkaW9CdXMgU2hlbGxBdWRpb0J1czsKICNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAKLWNvbnN0IGludCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcyA9IDMyOworY29uc3RleHByIGludCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcyA9IDMyOwogCiBjbGFzcyBBdWRpb0Rlc3RpbmF0aW9uTm9kZU1vY2sgOiBwdWJsaWMgQXVkaW9Ob2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEF1ZGlvRGV2aWNlOjpSZW5kZXJDYWxsYmFjayB7CkBAIC03Niw3ICs3OCw4IEBACiAgIHNjb3BlZF9yZWZwdHI8QXVkaW9Db250ZXh0PiBhdWRpb19jb250ZXh0KG5ldyBBdWRpb0NvbnRleHQoKSk7CiAgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXJTb3VyY2VOb2RlPiBzb3VyY2UoCiAgICAgICBhdWRpb19jb250ZXh0LT5DcmVhdGVCdWZmZXJTb3VyY2UoKSk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcihuZXcgQXVkaW9CdWZmZXIoNDQxMDAsIHNyY19kYXRhLlBhc3MoKSkpOworICBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyPiBidWZmZXIoCisgICAgICBuZXcgQXVkaW9CdWZmZXIoYXVkaW9fY29udGV4dC0+c2FtcGxlX3JhdGUoKSwgc3JjX2RhdGEuUGFzcygpKSk7CiAgIHNvdXJjZS0+c2V0X2J1ZmZlcihidWZmZXIpOwogCiAgIHNjb3BlZF9yZWZwdHI8QXVkaW9EZXN0aW5hdGlvbk5vZGVNb2NrPiBkZXN0aW5hdGlvbigKQEAgLTExNiw5ICsxMTksOSBAQAogfTsKIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgU3RlcmVvVG9TdGVyZW9TcGVha2Vyc0xheW91dFRlc3QpIHsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDI7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDI7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKICAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uU3BlYWtlcnM7CiAKQEAgLTE1Nyw5ICsxNjAsOSBAQAogfQogCiBURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBTdGVyZW9Ub1N0ZXJlb0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAyOwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIApAQCAtMTk5LDkgKzIwMiw5IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIE1vbm9Ub1N0ZXJlb1NwZWFrZXJzTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAxOwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMTsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKIApAQCAtMjM0LDkgKzIzNyw5IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIE1vbm9Ub1N0ZXJlb0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAxOwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMTsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIApAQCAtMjY5LDkgKzI3Miw5IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIFF1YWRUb1N0ZXJlb1NwZWFrZXJzTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA0OwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNDsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKIApAQCAtMzExLDkgKzMxNCw5IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIFF1YWRUb1N0ZXJlb0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA0OwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNDsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIApAQCAtMzUzLDkgKzM1Niw5IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIEZpdmVQb2ludE9uZVRvU3RlcmVvU3BlYWtlcnNMYXlvdXRUZXN0KSB7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDY7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOwotICBjb25zdCBzaXplX3Qga051bU9mRnJhbWVzID0gMTA7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA2OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDI7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRnJhbWVzID0gMTA7CiAgIGNvbnN0IEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiBrSW50ZXJwcmV0YXRpb24gPQogICAgICAga0F1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvblNwZWFrZXJzOwogCkBAIC0zOTUsOSArMzk4LDkgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgRml2ZVBvaW50T25lVG9TdGVyZW9EaXNjcmV0ZUxheW91dFRlc3QpIHsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDI7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAxMDsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDY7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAxMDsKICAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uRGlzY3JldGU7CiAKQEAgLTQzNyw5ICs0NDAsOSBAQAogfQogCiBURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBTdGVyZW9Ub01vbm9TcGVha2Vyc0xheW91dFRlc3QpIHsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDE7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDI7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKICAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uU3BlYWtlcnM7CiAKQEAgLTQ3NSw5ICs0NzgsOSBAQAogfQogCiBURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBTdGVyZW9Ub01vbm9EaXNjcmV0ZUxheW91dFRlc3QpIHsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDE7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDI7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKICAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uRGlzY3JldGU7CiAKQEAgLTUxMyw5ICs1MTYsOSBAQAogfQogCiBURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBRdWFkVG9Nb25vU3BlYWtlcnNMYXlvdXRUZXN0KSB7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDQ7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAxOwotICBjb25zdCBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA0OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDE7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7CiAgIGNvbnN0IEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiBrSW50ZXJwcmV0YXRpb24gPQogICAgICAga0F1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvblNwZWFrZXJzOwogCkBAIC01NTEsOSArNTU0LDkgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgUXVhZFRvTW9ub0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA0OwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNDsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAxOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIApAQCAtNTg5LDkgKzU5Miw5IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIEZpdmVQb2ludE9uZVRvTW9ub1NwZWFrZXJzTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA2OwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDEwOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAxOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDEwOwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKIApAQCAtNjI3LDkgKzYzMCw5IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIEZpdmVQb2ludE9uZVRvTW9ub0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA2OwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDEwOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAxOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDEwOwogICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIApAQCAtNjY3LDEyICs2NzAsMTIgQEAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIE11bHRpcGxlSW5wdXROb2Rlc0xheW91dFRlc3QpIHsKICAgc2NvcGVkX3JlZnB0cjxBdWRpb0NvbnRleHQ+IGF1ZGlvX2NvbnRleHQobmV3IEF1ZGlvQ29udGV4dCgpKTsKIAotICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAyOwotICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDI7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKICAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uU3BlYWtlcnM7CiAKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lc18xID0gMjU7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRnJhbWVzXzEgPSAyNTsKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRfMVs1MF07CiAgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgewogICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXNfMTsgKytmcmFtZSkgewpAQCAtNjg2LDEwICs2ODksMTAgQEAKICAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IHNvdXJjZV8xKAogICAgICAgYXVkaW9fY29udGV4dC0+Q3JlYXRlQnVmZmVyU291cmNlKCkpOwogICBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyPiBidWZmZXJfMSgKLSAgICAgIG5ldyBBdWRpb0J1ZmZlcig0NDEwMCwgc3JjX2RhdGFfMS5QYXNzKCkpKTsKKyAgICAgIG5ldyBBdWRpb0J1ZmZlcihhdWRpb19jb250ZXh0LT5zYW1wbGVfcmF0ZSgpLCBzcmNfZGF0YV8xLlBhc3MoKSkpOwogICBzb3VyY2VfMS0+c2V0X2J1ZmZlcihidWZmZXJfMSk7CiAKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lc18yID0gNTA7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRnJhbWVzXzIgPSA1MDsKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRfMlsxMDBdOwogICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtOdW1PZlNyY0NoYW5uZWxzOyArK2NoYW5uZWwpIHsKICAgICBmb3IgKHNpemVfdCBmcmFtZSA9IDA7IGZyYW1lIDwga051bU9mRnJhbWVzXzI7ICsrZnJhbWUpIHsKQEAgLTcwMyw3ICs3MDYsNyBAQAogICBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyU291cmNlTm9kZT4gc291cmNlXzIoCiAgICAgICBhdWRpb19jb250ZXh0LT5DcmVhdGVCdWZmZXJTb3VyY2UoKSk7CiAgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcl8yKAotICAgICAgbmV3IEF1ZGlvQnVmZmVyKDQ0MTAwLCBzcmNfZGF0YV8yLlBhc3MoKSkpOworICAgICAgbmV3IEF1ZGlvQnVmZmVyKGF1ZGlvX2NvbnRleHQtPnNhbXBsZV9yYXRlKCksIHNyY19kYXRhXzIuUGFzcygpKSk7CiAgIHNvdXJjZV8yLT5zZXRfYnVmZmVyKGJ1ZmZlcl8yKTsKIAogICBzY29wZWRfcmVmcHRyPEF1ZGlvRGVzdGluYXRpb25Ob2RlTW9jaz4gZGVzdGluYXRpb24oCkBAIC03NDMsMjQgKzc0NiwyMyBAQAogICB9CiB9CiAKLVRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENyZWF0ZUJ1ZmZlclRlc3QpIHsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkNoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwotICBjb25zdCBzaXplX3Qga1NhbXBsZVJhdGUgPSA0NDEwMDsKK1RFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENyZWF0ZUJ1ZmZlckxheW91dFRlc3QpIHsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZDaGFubmVscyA9IDI7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7CiAKICAgc2NvcGVkX3JlZnB0cjxBdWRpb0NvbnRleHQ+IGF1ZGlvX2NvbnRleHQobmV3IEF1ZGlvQ29udGV4dCgpKTsKLSAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKAotICAgICAgYXVkaW9fY29udGV4dC0+Q3JlYXRlQnVmZmVyKGtOdW1PZkNoYW5uZWxzLCBrTnVtT2ZGcmFtZXMsIGtTYW1wbGVSYXRlKSk7CisgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcihhdWRpb19jb250ZXh0LT5DcmVhdGVCdWZmZXIoCisgICAgICBrTnVtT2ZDaGFubmVscywga051bU9mRnJhbWVzLCBhdWRpb19jb250ZXh0LT5zYW1wbGVfcmF0ZSgpKSk7CiAKICAgRVhQRUNUX0VRKGJ1ZmZlci0+bnVtYmVyX29mX2NoYW5uZWxzKCksIGtOdW1PZkNoYW5uZWxzKTsKICAgRVhQRUNUX0VRKGJ1ZmZlci0+bGVuZ3RoKCksIGtOdW1PZkZyYW1lcyk7Ci0gIEVYUEVDVF9FUShidWZmZXItPnNhbXBsZV9yYXRlKCksIGtTYW1wbGVSYXRlKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlci0+c2FtcGxlX3JhdGUoKSwgYXVkaW9fY29udGV4dC0+c2FtcGxlX3JhdGUoKSk7CiB9CiAKLVRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENvcHlUb0NoYW5uZWxQbGFuYXJGbG9hdDMyVGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mQ2hhbm5lbHMgPSAyOwotICBjb25zdCBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7Ci0gIGNvbnN0IHNpemVfdCBrT2Zmc2V0ID0gODsKK1RFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENvcHlUb0NoYW5uZWxQbGFuYXJGbG9hdDMyTGF5b3V0VGVzdCkgeworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkNoYW5uZWxzID0gMjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKKyAgY29uc3RleHByIHNpemVfdCBrT2Zmc2V0ID0gODsKIAogICBmbG9hdCBzcmNfYXJyW2tOdW1PZkNoYW5uZWxzXVtrTnVtT2ZGcmFtZXNdOwogICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtOdW1PZkNoYW5uZWxzOyArK2NoYW5uZWwpIHsKQEAgLTc3OSw3ICs3ODEsOCBAQAogICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mQ2hhbm5lbHMsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcihuZXcgQXVkaW9CdWZmZXIoNDQxMDAsIGF1ZGlvX2J1cy5QYXNzKCkpKTsKKyAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKAorICAgICAgbmV3IEF1ZGlvQnVmZmVyKGF1ZGlvX2NvbnRleHQtPnNhbXBsZV9yYXRlKCksIGF1ZGlvX2J1cy5QYXNzKCkpKTsKICAgYnVmZmVyLT5Db3B5VG9DaGFubmVsKGNoYW5uZWwwX2FyciwgMCwga09mZnNldCwgTlVMTCk7CiAgIGJ1ZmZlci0+Q29weVRvQ2hhbm5lbChjaGFubmVsMV9hcnIsIDEsIGtPZmZzZXQsIE5VTEwpOwogCkBAIC03OTUsMTAgKzc5OCwxMCBAQAogICB9CiB9CiAKLVRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENvcHlUb0NoYW5uZWxJbnRlcmxlYXZlZEZsb2F0MzJUZXN0KSB7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZDaGFubmVscyA9IDI7Ci0gIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKLSAgY29uc3Qgc2l6ZV90IGtPZmZzZXQgPSA4OworVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgQ29weVRvQ2hhbm5lbEludGVybGVhdmVkRmxvYXQzMkxheW91dFRlc3QpIHsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZDaGFubmVscyA9IDI7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7CisgIGNvbnN0ZXhwciBzaXplX3Qga09mZnNldCA9IDg7CiAKICAgZmxvYXQgc3JjX2FycltrTnVtT2ZDaGFubmVsc11ba051bU9mRnJhbWVzXTsKICAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrTnVtT2ZDaGFubmVsczsgKytjaGFubmVsKSB7CkBAIC04MTcsNyArODIwLDggQEAKICAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkNoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcihuZXcgQXVkaW9CdWZmZXIoNDQxMDAsIGF1ZGlvX2J1cy5QYXNzKCkpKTsKKyAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKAorICAgICAgbmV3IEF1ZGlvQnVmZmVyKGF1ZGlvX2NvbnRleHQtPnNhbXBsZV9yYXRlKCksIGF1ZGlvX2J1cy5QYXNzKCkpKTsKICAgYnVmZmVyLT5Db3B5VG9DaGFubmVsKGNoYW5uZWwwX2FyciwgMCwga09mZnNldCwgTlVMTCk7CiAgIGJ1ZmZlci0+Q29weVRvQ2hhbm5lbChjaGFubmVsMV9hcnIsIDEsIGtPZmZzZXQsIE5VTEwpOwogCkBAIC04MzMsMTAgKzgzNywxMCBAQAogICB9CiB9CiAKLVRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENvcHlUb0NoYW5uZWxQbGFuYXJJbnQxNlRlc3QpIHsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkNoYW5uZWxzID0gMjsKLSAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OwotICBjb25zdCBzaXplX3Qga09mZnNldCA9IDg7CitURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBDb3B5VG9DaGFubmVsUGxhbmFySW50MTZMYXlvdXRUZXN0KSB7CisgIGNvbnN0ZXhwciBzaXplX3Qga051bU9mQ2hhbm5lbHMgPSAyOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdGV4cHIgc2l6ZV90IGtPZmZzZXQgPSA4OwogCiAgIGZsb2F0IHNyY19hcnJba051bU9mQ2hhbm5lbHNdW2tOdW1PZkZyYW1lc107CiAgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mQ2hhbm5lbHM7ICsrY2hhbm5lbCkgewpAQCAtODU1LDcgKzg1OSw4IEBACiAgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZDaGFubmVscywga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprSW50MTYsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcihuZXcgQXVkaW9CdWZmZXIoNDQxMDAsIGF1ZGlvX2J1cy5QYXNzKCkpKTsKKyAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKAorICAgICAgbmV3IEF1ZGlvQnVmZmVyKGF1ZGlvX2NvbnRleHQtPnNhbXBsZV9yYXRlKCksIGF1ZGlvX2J1cy5QYXNzKCkpKTsKICAgYnVmZmVyLT5Db3B5VG9DaGFubmVsKGNoYW5uZWwwX2FyciwgMCwga09mZnNldCwgTlVMTCk7CiAgIGJ1ZmZlci0+Q29weVRvQ2hhbm5lbChjaGFubmVsMV9hcnIsIDEsIGtPZmZzZXQsIE5VTEwpOwogCkBAIC04NzMsMTAgKzg3OCwxMCBAQAogICB9CiB9CiAKLVRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENvcHlUb0NoYW5uZWxJbnRlcmxlYXZlZEludDE2VGVzdCkgewotICBjb25zdCBzaXplX3Qga051bU9mQ2hhbm5lbHMgPSAyOwotICBjb25zdCBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7Ci0gIGNvbnN0IHNpemVfdCBrT2Zmc2V0ID0gODsKK1RFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIENvcHlUb0NoYW5uZWxJbnRlcmxlYXZlZEludDE2TGF5b3V0VGVzdCkgeworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZkNoYW5uZWxzID0gMjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKKyAgY29uc3RleHByIHNpemVfdCBrT2Zmc2V0ID0gODsKIAogICBmbG9hdCBzcmNfYXJyW2tOdW1PZkNoYW5uZWxzXVtrTnVtT2ZGcmFtZXNdOwogICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtOdW1PZkNoYW5uZWxzOyArK2NoYW5uZWwpIHsKQEAgLTg5NSw3ICs5MDAsOCBAQAogICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mQ2hhbm5lbHMsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0ludDE2LCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcihuZXcgQXVkaW9CdWZmZXIoNDQxMDAsIGF1ZGlvX2J1cy5QYXNzKCkpKTsKKyAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gYnVmZmVyKAorICAgICAgbmV3IEF1ZGlvQnVmZmVyKGF1ZGlvX2NvbnRleHQtPnNhbXBsZV9yYXRlKCksIGF1ZGlvX2J1cy5QYXNzKCkpKTsKICAgYnVmZmVyLT5Db3B5VG9DaGFubmVsKGNoYW5uZWwwX2FyciwgMCwga09mZnNldCwgTlVMTCk7CiAgIGJ1ZmZlci0+Q29weVRvQ2hhbm5lbChjaGFubmVsMV9hcnIsIDEsIGtPZmZzZXQsIE5VTEwpOwogCkBAIC05MTMsNSArOTE5LDk4IEBACiAgIH0KIH0KIAorVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgUmVzYW1wbGVCdWZmZXJTYW1wbGVSYXRlTGF5b3V0VGVzdCkgeworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMjsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdGV4cHIgc2l6ZV90IGtOdW1PZlNyY0ZyYW1lcyA9IDUwMDsKKyAgY29uc3RleHByIHNpemVfdCBrTnVtT2ZEZXN0RnJhbWVzID0gNjQwOworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KKyAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKKyAgY29uc3Qgc2l6ZV90IGtCdWZmZXJTYW1wbGVSYXRlQXJyWzJdID0gezQ0MTAwLCA1MjIwMH07CisgIGNvbnN0IFNhbXBsZVR5cGUga1NhbXBsZVR5cGVBcnJbMl0gPSB7a1NhbXBsZVR5cGVGbG9hdDMyLCBrU2FtcGxlVHlwZUludDE2fTsKKyAgY29uc3RleHByIGZsb2F0IGtNYXhBdmdFcnJvciA9IDAuMDFmOworCisgIGZsb2F0IHNyY19hcnJba051bU9mU3JjQ2hhbm5lbHNdW2tOdW1PZlNyY0ZyYW1lc107CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZTcmNGcmFtZXM7ICsrZnJhbWUpIHsKKyAgICAgIC8vIFZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMQorICAgICAgZmxvYXQgZnVuY19hcmcgPSAoY2hhbm5lbCArIGtOdW1PZlNyY0NoYW5uZWxzICogZnJhbWUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGtOdW1PZlNyY0ZyYW1lcyAqIGtOdW1PZlNyY0NoYW5uZWxzKTsKKyAgICAgIC8vIFZhbHVlcyByYW5nZSBmcm9tIC0xIHRvIDEKKyAgICAgIHNyY19hcnJbY2hhbm5lbF1bZnJhbWVdID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpbigyICogTV9QSSAqIGZ1bmNfYXJnKSk7CisgICAgfQorICB9CisKKyAgc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpGbG9hdDMyQXJyYXk+IGNoYW5uZWxfMF9hcnIgPQorICAgICAgc2NyaXB0OjpGbG9hdDMyQXJyYXk6Ok5ldyhnbG9iYWxfZW52aXJvbm1lbnQoKSwgc3JjX2FyclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bU9mU3JjRnJhbWVzKTsKKyAgc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpGbG9hdDMyQXJyYXk+IGNoYW5uZWxfMV9hcnIgPQorICAgICAgc2NyaXB0OjpGbG9hdDMyQXJyYXk6Ok5ldyhnbG9iYWxfZW52aXJvbm1lbnQoKSwgc3JjX2FyclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bU9mU3JjRnJhbWVzKTsKKworICBmb3IgKHNpemVfdCBidWZmZXJfc2FtcGxlX3JhdGUgOiBrQnVmZmVyU2FtcGxlUmF0ZUFycikgeworICAgIGZvciAoU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSA6IGtTYW1wbGVUeXBlQXJyKSB7CisgICAgICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhKAorICAgICAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZlNyY0NoYW5uZWxzLCBrTnVtT2ZTcmNGcmFtZXMsIHNhbXBsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtJbnRlcmxlYXZlZCkpOworICAgICAgc3JjX2RhdGEtPlplcm9BbGxGcmFtZXMoKTsKKyAgICAgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcigKKyAgICAgICAgICBuZXcgQXVkaW9CdWZmZXIoYnVmZmVyX3NhbXBsZV9yYXRlLCBzcmNfZGF0YS5QYXNzKCkpKTsKKyAgICAgIGJ1ZmZlci0+Q29weVRvQ2hhbm5lbChjaGFubmVsXzBfYXJyLCAwLCAwLCBOVUxMKTsKKyAgICAgIGJ1ZmZlci0+Q29weVRvQ2hhbm5lbChjaGFubmVsXzFfYXJyLCAxLCAwLCBOVUxMKTsKKworICAgICAgc2NvcGVkX3JlZnB0cjxBdWRpb0NvbnRleHQ+IGF1ZGlvX2NvbnRleHQobmV3IEF1ZGlvQ29udGV4dCgpKTsKKyAgICAgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXJTb3VyY2VOb2RlPiBzb3VyY2UoCisgICAgICAgICAgYXVkaW9fY29udGV4dC0+Q3JlYXRlQnVmZmVyU291cmNlKCkpOworICAgICAgc291cmNlLT5zZXRfYnVmZmVyKGJ1ZmZlcik7CisKKyAgICAgIHNjb3BlZF9yZWZwdHI8QXVkaW9EZXN0aW5hdGlvbk5vZGVNb2NrPiBkZXN0aW5hdGlvbigKKyAgICAgICAgICBuZXcgQXVkaW9EZXN0aW5hdGlvbk5vZGVNb2NrKGF1ZGlvX2NvbnRleHQuZ2V0KCkpKTsKKyAgICAgIGRlc3RpbmF0aW9uLT5zZXRfY2hhbm5lbF9pbnRlcnByZXRhdGlvbihrSW50ZXJwcmV0YXRpb24pOworICAgICAgc291cmNlLT5Db25uZWN0KGRlc3RpbmF0aW9uLCAwLCAwLCBOVUxMKTsKKyAgICAgIHNvdXJjZS0+U3RhcnQoMCwgMCwgTlVMTCk7CisKKyAgICAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAorICAgICAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkRlc3RDaGFubmVscywga051bU9mRGVzdEZyYW1lcywgc2FtcGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CisgICAgICBhdWRpb19idXMtPlplcm9BbGxGcmFtZXMoKTsKKyAgICAgIGJvb2wgc2lsZW5jZSA9IHRydWU7CisgICAgICBkZXN0aW5hdGlvbi0+RmlsbEF1ZGlvQnVzKHRydWUsIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICAgICAgRVhQRUNUX0ZBTFNFKHNpbGVuY2UpOworCisgICAgICBzaXplX3QgbnVtX291dHB1dF9mcmFtZXMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KAorICAgICAgICAgIGtOdW1PZlNyY0ZyYW1lcyAqIGF1ZGlvX2NvbnRleHQtPnNhbXBsZV9yYXRlKCkgLyBidWZmZXJfc2FtcGxlX3JhdGUpOworICAgICAgZmxvYXQgc3VtX29mX2Vycm9ycyA9IDA7CisgICAgICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtOdW1PZkRlc3RDaGFubmVsczsgKytjaGFubmVsKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZEZXN0RnJhbWVzOyArK2ZyYW1lKSB7CisgICAgICAgICAgZmxvYXQgZnVuY19hcmcgPQorICAgICAgICAgICAgICAoY2hhbm5lbCArIGtOdW1PZlNyY0NoYW5uZWxzICogZnJhbWUpIC8KKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KChudW1fb3V0cHV0X2ZyYW1lcyAqIGtOdW1PZlNyY0NoYW5uZWxzKSk7CisgICAgICAgICAgaWYgKHNhbXBsZV90eXBlID09IGtTYW1wbGVUeXBlRmxvYXQzMikgeworICAgICAgICAgICAgZmxvYXQgYWN0dWFsX3ZhbCA9IGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjaGFubmVsLCBmcmFtZSk7CisgICAgICAgICAgICBmbG9hdCBleHBlY3RlZF92YWwgPSAwLjBmOworICAgICAgICAgICAgaWYgKGZyYW1lIDwgbnVtX291dHB1dF9mcmFtZXMpIHsKKyAgICAgICAgICAgICAgZXhwZWN0ZWRfdmFsID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpbigyICogTV9QSSAqIGZ1bmNfYXJnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW1fb2ZfZXJyb3JzICs9IGZhYnMoYWN0dWFsX3ZhbCAtIGV4cGVjdGVkX3ZhbCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDE2IGFjdHVhbF92YWwgPSBhdWRpb19idXMtPkdldEludDE2U2FtcGxlKGNoYW5uZWwsIGZyYW1lKTsKKyAgICAgICAgICAgIGludDE2IGV4cGVjdGVkX3ZhbCA9IDA7CisgICAgICAgICAgICBpZiAoZnJhbWUgPCBudW1fb3V0cHV0X2ZyYW1lcykgeworICAgICAgICAgICAgICBleHBlY3RlZF92YWwgPSBDb252ZXJ0U2FtcGxlPGZsb2F0LCBpbnQxNj4oCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oc2luKDIgKiBNX1BJICogZnVuY19hcmcpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW1fb2ZfZXJyb3JzICs9IENvbnZlcnRTYW1wbGU8aW50MTYsIGZsb2F0PigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNj4oYWJzKGFjdHVhbF92YWwgLSBleHBlY3RlZF92YWwpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZsb2F0IGF2Z19lcnJvciA9IHN1bV9vZl9lcnJvcnMgLyBrTnVtT2ZEZXN0RnJhbWVzOworICAgICAgRVhQRUNUX0xFKGF2Z19lcnJvciwga01heEF2Z0Vycm9yKTsKKyAgICB9CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb190ZXN0Lmd5cAppbmRleCBmM2IzMDIwLi4xZTdjNzQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX3Rlc3QuZ3lwCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fdGVzdC5neXAKQEAgLTE5LDcgKzE5LDcgQEAKICAgJ3RhcmdldHMnOiBbCiAgICAgIyBUaGlzIHRhcmdldCBjYW4gY2hvb3NlIHRoZSBjb3JyZWN0IG1lZGlhIGRlcGVuZGVuY3kuCiAgICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ21lZGlhJywKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdtZWRpYV9hdWRpb190ZXN0JywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICBbJ2NvYmFsdF9tZWRpYV9zb3VyY2VfMjAxNj09MScsIHsKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgJ2F1ZGlvX25vZGVfaW5wdXRfb3V0cHV0X3Rlc3QuY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICdtZWRpYScsCisgICAgICAgICdtZWRpYV9hdWRpb190ZXN0JywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwIGIvc3JjL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwCmluZGV4IDRiNzBmOTMuLmNmZmQwMWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9iYXNlLmd5cAorKysgYi9zcmMvY29iYWx0L2Jhc2UvYmFzZS5neXAKQEAgLTIwLDYgKzIwLDEwIEBACiAgICAgICAjIGdlbmVyYXRpbmcgUERCcy4KICAgICAgICdwcm9kdWN0X25hbWUnOiAnY29iYWx0X2Jhc2UnLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2RlZmluZXMnOiBbIkNPQkFMVF9FTkFCTEVfVkVSU0lPTl9DT01QQVRJQklMSVRZX1ZBTElEQVRJT05TPTEiXSwKKyAgICAgICdkaXJlY3RfZGVwZW5kZW50X3NldHRpbmdzJzogeworICAgICAgICAgJ2RlZmluZXMnOiBbIkNPQkFMVF9FTkFCTEVfVkVSU0lPTl9DT01QQVRJQklMSVRZX1ZBTElEQVRJT05TPTEiXSwKKyAgICAgIH0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ2FjY2Vzc2liaWxpdHlfY2hhbmdlZF9ldmVudC5oJywKICAgICAgICAgJ2FkZHJlc3Nfc2FuaXRpemVyLmgnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3Rva2VuLmNjIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2VuLmNjCmluZGV4IGJhNWI4NTIuLjc4YmI5ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS90b2tlbi5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uY2MKQEAgLTY4LDYgKzY4LDEwIEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCisjaWZkZWYgRU5BQkxFX1RPS0VOX0FMUEhBQkVUSUNBTF9TT1JUSU5HCitib29sIFRva2VuOjpzb3J0X2FscGhhYmV0aWNhbGx5XyA9IGZhbHNlOworI2VuZGlmICAvLyBFTkFCTEVfVE9LRU5fVEVYVF9TT1JUSU5HCisKIFRva2VuOjpUb2tlbigpIDogc3RyXyhUb2tlblN0b3JhZ2U6OkdldEluc3RhbmNlKCktPkdldFN0b3JhZ2UoIiIpKSB7fQogCiBUb2tlbjo6VG9rZW4oY29uc3QgY2hhciogc3RyKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3Rva2VuLmggYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uaAppbmRleCAxYmIzOTI1Li44ZjFlZmI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uaApAQCAtMjAsNiArMjAsOCBAQAogCiAjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCiAjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKIAogbmFtZXNwYWNlIGJhc2UgewogCkBAIC00NiwxNCArNDgsMzkgQEAKICAgdm9pZCBJbml0aWFsaXplKGNvbnN0IGNoYXIqIHN0cik7CiAKICAgY29uc3QgY2hhciogc3RyXzsKKworI2lmZGVmIEVOQUJMRV9UT0tFTl9BTFBIQUJFVElDQUxfU09SVElORworCisgcHVibGljOgorICAvLyBGb3IgdW5pdCB0ZXN0cyB0byBzb3J0IGluIGEgcHJlZGljdGFibGUgb3JkZXIgYXQgdGhlIGNvc3Qgb2YgZWZmaWNpZW5jeS4KKyAgLy8gVGhpcyBpcyBub3QgdGhyZWFkIHNhZmUhCisgIGNsYXNzIFNjb3BlZEFscGhhYmV0aWNhbFNvcnRpbmcgeworICAgcHVibGljOgorICAgIFNjb3BlZEFscGhhYmV0aWNhbFNvcnRpbmcoKSB7CisgICAgICBETE9HKFdBUk5JTkcpCisgICAgICAgICAgPDwgIlNjb3BlZEFscGhhYmV0aWNhbFNvcnRpbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZy4iOworICAgICAgRENIRUNLKCFUb2tlbjo6c29ydF9hbHBoYWJldGljYWxseV8pOworICAgICAgVG9rZW46OnNvcnRfYWxwaGFiZXRpY2FsbHlfID0gdHJ1ZTsKKyAgICB9CisgICAgflNjb3BlZEFscGhhYmV0aWNhbFNvcnRpbmcoKSB7CisgICAgICBEQ0hFQ0soVG9rZW46OnNvcnRfYWxwaGFiZXRpY2FsbHlfKTsKKyAgICAgIFRva2VuOjpzb3J0X2FscGhhYmV0aWNhbGx5XyA9IGZhbHNlOworICAgIH0KKyAgfTsKKworICBzdGF0aWMgYm9vbCBzb3J0X2FscGhhYmV0aWNhbGx5KCkgeyByZXR1cm4gc29ydF9hbHBoYWJldGljYWxseV87IH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBib29sIHNvcnRfYWxwaGFiZXRpY2FsbHlfOworI2VuZGlmICAvLyBFTkFCTEVfVE9LRU5fQUxQSEFCRVRJQ0FMX1NPUlRJTkcKIH07CiAKIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVG9rZW4mIGxocywgY29uc3Qgc3RkOjpzdHJpbmcmIHJocykgewotICByZXR1cm4gc3RyY21wKGxocy5jX3N0cigpLCByaHMuY19zdHIoKSkgPT0gMDsKKyAgcmV0dXJuIFNiU3RyaW5nQ29tcGFyZUFsbChsaHMuY19zdHIoKSwgcmhzLmNfc3RyKCkpID09IDA7CiB9CiAKIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpzdHJpbmcmIGxocywgY29uc3QgVG9rZW4mIHJocykgewotICByZXR1cm4gc3RyY21wKGxocy5jX3N0cigpLCByaHMuY19zdHIoKSkgPT0gMDsKKyAgcmV0dXJuIFNiU3RyaW5nQ29tcGFyZUFsbChsaHMuY19zdHIoKSwgcmhzLmNfc3RyKCkpID09IDA7CiB9CiAKIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVG9rZW4mIGxocywgY29uc3QgVG9rZW4mIHJocykgewpAQCAtNjksMTAgKzk2LDIwIEBACiB9CiAKIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBUb2tlbiYgbGhzLCBjb25zdCBUb2tlbiYgcmhzKSB7CisjaWZkZWYgRU5BQkxFX1RPS0VOX0FMUEhBQkVUSUNBTF9TT1JUSU5HCisgIGlmIChUb2tlbjo6c29ydF9hbHBoYWJldGljYWxseSgpKSB7CisgICAgcmV0dXJuIFNiU3RyaW5nQ29tcGFyZUFsbChsaHMuY19zdHIoKSwgcmhzLmNfc3RyKCkpIDwgMDsKKyAgfQorI2VuZGlmICAvLyBFTkFCTEVfVE9LRU5fQUxQSEFCRVRJQ0FMX1NPUlRJTkcKICAgcmV0dXJuIGxocy5jX3N0cigpIDwgcmhzLmNfc3RyKCk7CiB9CiAKIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBUb2tlbiYgbGhzLCBjb25zdCBUb2tlbiYgcmhzKSB7CisjaWZkZWYgRU5BQkxFX1RPS0VOX0FMUEhBQkVUSUNBTF9TT1JUSU5HCisgIGlmIChUb2tlbjo6c29ydF9hbHBoYWJldGljYWxseSgpKSB7CisgICAgcmV0dXJuIFNiU3RyaW5nQ29tcGFyZUFsbChsaHMuY19zdHIoKSwgcmhzLmNfc3RyKCkpID4gMDsKKyAgfQorI2VuZGlmICAvLyBFTkFCTEVfVE9LRU5fQUxQSEFCRVRJQ0FMX1NPUlRJTkcKICAgcmV0dXJuIGxocy5jX3N0cigpID4gcmhzLmNfc3RyKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS90b2tlbl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2VuX3Rlc3QuY2MKaW5kZXggYTA0YjE3Zi4uYTMxOTU0MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3Rva2VuX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2VuX3Rlc3QuY2MKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKIAogbmFtZXNwYWNlIGJhc2UgewogbmFtZXNwYWNlIHsKQEAgLTU0LDYgKzU1LDUwIEBACiAgIEVYUEVDVF9ORShlbXB0eSwgbm9uX2VtcHR5KTsKIH0KIAorVEVTVChUb2tlblRlc3QsIENvbXBhcmVTb3J0ZWQpIHsKKyAgc3RkOjp2ZWN0b3I8VG9rZW4+IHRva2VuczsKKworICAvLyBUb2tlbnMgY29uc3RydWN0ZWQgaW4gbm8gcGFydGljdWxhciBvcmRlciBzbyB0aGUgc3RvcmFnZSBpc24ndCBpbiBvcmRlci4KKyAgdG9rZW5zLnB1c2hfYmFjayhUb2tlbigiQ29iYWx0IikpOworICB0b2tlbnMucHVzaF9iYWNrKFRva2VuKCJDaHJvbWUiKSk7CisgIHRva2Vucy5wdXNoX2JhY2soVG9rZW4oIkZpcmVmb3giKSk7CisgIHRva2Vucy5wdXNoX2JhY2soVG9rZW4oIk1vemlsbGEiKSk7CisgIHRva2Vucy5wdXNoX2JhY2soVG9rZW4oIk5hdmlnYXRvciIpKTsKKyAgdG9rZW5zLnB1c2hfYmFjayhUb2tlbigiU2FmYXJpIikpOworICB0b2tlbnMucHVzaF9iYWNrKFRva2VuKCJFeHBsb3JlciIpKTsKKyAgdG9rZW5zLnB1c2hfYmFjayhUb2tlbigiT3BlcmEiKSk7CisKKyAgLy8gU29ydCB0aGUgdmVjdG9yIHNvIHdlIGl0ZXJhdGUgaXQgYWxwaGFiZXRpY2FsbHkuCisgIHN0ZDo6c29ydCh0b2tlbnMuYmVnaW4oKSwgdG9rZW5zLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgVG9rZW4mIGwsIGNvbnN0IFRva2VuJiByKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgcmV0dXJuIFNiU3RyaW5nQ29tcGFyZUFsbChsLmNfc3RyKCksIHIuY19zdHIoKSkgPCAwOworICAgICAgICAgICAgfSk7CisKKyAgLy8gVGhlIG5hdHVyYWwgb3JkZXIgb2YgdGhlIHRva2VucyBpcyBub3QgYWxwaGFiZXRpY2FsLgorICBUb2tlbiBwcmV2X3Rva2VuOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCBpbl9vcmRlciA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byB0b2tlbiA6IHRva2VucykgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluX29yZGVyICY9IChwcmV2X3Rva2VuIDwgdG9rZW4pOworICAgIH0KKyAgICBwcmV2X3Rva2VuID0gdG9rZW47CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBFWFBFQ1RfRkFMU0UoaW5fb3JkZXIpOworCisgIC8vIFRoZSBvcmRlciBvZiB0aGUgdG9rZW5zIHNob3VsZCBiZSBhbHBoYWJldGljYWwgdXNpbmcgYSBzb3J0IHNjb3BlLgorICBUb2tlbjo6U2NvcGVkQWxwaGFiZXRpY2FsU29ydGluZyBzb3J0X3Njb3BlOworICBmaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byB0b2tlbiA6IHRva2VucykgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIEVYUEVDVF9MVChwcmV2X3Rva2VuLCB0b2tlbik7CisgICAgfQorICAgIHByZXZfdG9rZW4gPSB0b2tlbjsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9Cit9CisKIFRFU1QoVG9rZW5UZXN0LCBDb2xsaXNpb24pIHsKICAgY29uc3QgY2hhciBrVGVzdFN0cmluZ1tdID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKICAgY29uc3QgdWludDMyIGtFeHRyYVRva2VucyA9IDEwMDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuaCBiL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuaAppbmRleCAzZDEyZWUyLi4yNmMzNWRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2Vucy5oCkBAIC0xMDksNiArMTA5LDcgQEAKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlc3VtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNjcm9sbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlY3VyaXR5cG9saWN5dmlvbGF0aW9uKSAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlZWtlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlZWtpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS93cmFwX21haW5fc3RhcmJvYXJkLmggYi9zcmMvY29iYWx0L2Jhc2Uvd3JhcF9tYWluX3N0YXJib2FyZC5oCmluZGV4IDc1ZTI3NDkuLjMyZTUwYWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS93cmFwX21haW5fc3RhcmJvYXJkLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3dyYXBfbWFpbl9zdGFyYm9hcmQuaApAQCAtMTAxLDggKzEwMSwxMCBAQAogICAgIGNhc2Uga1NiRXZlbnRUeXBlVXNlcjoKICAgICBjYXNlIGtTYkV2ZW50VHlwZUxpbms6CiAgICAgY2FzZSBrU2JFdmVudFR5cGVWZXJ0aWNhbFN5bmM6CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfRElTQ09OTkVDVF9WRVJTSU9OCiAgICAgY2FzZSBrU2JFdmVudFR5cGVOZXR3b3JrRGlzY29ubmVjdDoKICAgICBjYXNlIGtTYkV2ZW50VHlwZU5ldHdvcmtDb25uZWN0OgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9ESVNDT05ORUNUX1ZFUlNJT04KICAgICBjYXNlIGtTYkV2ZW50VHlwZVNjaGVkdWxlZDoKICAgICBjYXNlIGtTYkV2ZW50VHlwZUFjY2Vzc2libGl0eVNldHRpbmdzQ2hhbmdlZDoKICNpZiBTQl9BUElfVkVSU0lPTiA+PSA2CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MKaW5kZXggNzkzOGM5MC4uMjM4MTBmYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYwpAQCAtMTIsNiArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkaW9fbGVha3NfcG9lbS5oIgorI2VuZGlmCisKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgpAQCAtNTcsNyArNjEsNiBAQAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L21hdGgvc2l6ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2phdmFzY3JpcHRfZW5naW5lLmgiCiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX2Zha2UuaCIKQEAgLTcyMCwxMCArNzIzLDYgQEAKICAgYXBwX3N0YXR1c18gPSAoc2hvdWxkX3ByZWxvYWQgPyBrUHJlbG9hZGluZ0FwcFN0YXR1cyA6IGtSdW5uaW5nQXBwU3RhdHVzKTsKIAogICAvLyBSZWdpc3RlciBldmVudCBjYWxsYmFja3MuCi0gIG5ldHdvcmtfZXZlbnRfY2FsbGJhY2tfID0KLSAgICAgIGJhc2U6OkJpbmQoJkFwcGxpY2F0aW9uOjpPbk5ldHdvcmtFdmVudCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7Ci0gIGV2ZW50X2Rpc3BhdGNoZXJfLkFkZEV2ZW50Q2FsbGJhY2sobmV0d29yazo6TmV0d29ya0V2ZW50OjpUeXBlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX2V2ZW50X2NhbGxiYWNrXyk7CiAgIGRlZXBfbGlua19ldmVudF9jYWxsYmFja18gPQogICAgICAgYmFzZTo6QmluZCgmQXBwbGljYXRpb246Ok9uRGVlcExpbmtFdmVudCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CiAgIGV2ZW50X2Rpc3BhdGNoZXJfLkFkZEV2ZW50Q2FsbGJhY2soYmFzZTo6RGVlcExpbmtFdmVudDo6VHlwZUlkKCksCkBAIC04MjMsOCArODIyLDYgQEAKICAgbWVtb3J5X3RyYWNrZXJfdG9vbF8ucmVzZXQoTlVMTCk7CiAKICAgLy8gVW5yZWdpc3RlciBldmVudCBjYWxsYmFja3MuCi0gIGV2ZW50X2Rpc3BhdGNoZXJfLlJlbW92ZUV2ZW50Q2FsbGJhY2sobmV0d29yazo6TmV0d29ya0V2ZW50OjpUeXBlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX2V2ZW50X2NhbGxiYWNrXyk7CiAgIGV2ZW50X2Rpc3BhdGNoZXJfLlJlbW92ZUV2ZW50Q2FsbGJhY2soYmFzZTo6RGVlcExpbmtFdmVudDo6VHlwZUlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcF9saW5rX2V2ZW50X2NhbGxiYWNrXyk7CiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gOApAQCAtOTQwLDE0ICs5MzcsNiBAQAogICAgICAgYnJlYWs7CiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCiAjZW5kaWYgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCi0gICAgY2FzZSBrU2JFdmVudFR5cGVOZXR3b3JrQ29ubmVjdDoKLSAgICAgIERpc3BhdGNoRXZlbnRJbnRlcm5hbCgKLSAgICAgICAgICBuZXcgbmV0d29yazo6TmV0d29ya0V2ZW50KG5ldHdvcms6Ok5ldHdvcmtFdmVudDo6a0Nvbm5lY3Rpb24pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1NiRXZlbnRUeXBlTmV0d29ya0Rpc2Nvbm5lY3Q6Ci0gICAgICBEaXNwYXRjaEV2ZW50SW50ZXJuYWwoCi0gICAgICAgICAgbmV3IG5ldHdvcms6Ok5ldHdvcmtFdmVudChuZXR3b3JrOjpOZXR3b3JrRXZlbnQ6OmtEaXNjb25uZWN0aW9uKSk7Ci0gICAgICBicmVhazsKICAgICBjYXNlIGtTYkV2ZW50VHlwZUxpbms6IHsKICAgICAgIGNvbnN0IGNoYXIqIGxpbmsgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc3RhcmJvYXJkX2V2ZW50LT5kYXRhKTsKICAgICAgIERpc3BhdGNoRXZlbnRJbnRlcm5hbChuZXcgYmFzZTo6RGVlcExpbmtFdmVudChsaW5rKSk7CkBAIC05NjgsNiArOTU3LDEwIEBACiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNgogICAgIGNhc2Uga1NiRXZlbnRUeXBlUHJlbG9hZDoKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNgorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX0RJU0NPTk5FQ1RfVkVSU0lPTgorICAgIGNhc2Uga1NiRXZlbnRUeXBlTmV0d29ya0Nvbm5lY3Q6CisgICAgY2FzZSBrU2JFdmVudFR5cGVOZXR3b3JrRGlzY29ubmVjdDoKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfRElTQ09OTkVDVF9WRVJTSU9OCiAgICAgY2FzZSBrU2JFdmVudFR5cGVTY2hlZHVsZWQ6CiAgICAgY2FzZSBrU2JFdmVudFR5cGVTdGFydDoKICAgICBjYXNlIGtTYkV2ZW50VHlwZVN0b3A6CkBAIC05NzgsMjggKzk3MSw2IEBACiAgIH0KIH0KIAotdm9pZCBBcHBsaWNhdGlvbjo6T25OZXR3b3JrRXZlbnQoY29uc3QgYmFzZTo6RXZlbnQqIGV2ZW50KSB7Ci0gIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwgIkFwcGxpY2F0aW9uOjpPbk5ldHdvcmtFdmVudCgpIik7Ci0gIERDSEVDSyhuZXR3b3JrX2V2ZW50X3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBjb25zdCBuZXR3b3JrOjpOZXR3b3JrRXZlbnQqIG5ldHdvcmtfZXZlbnQgPQotICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8Y29uc3QgbmV0d29yazo6TmV0d29ya0V2ZW50Kj4oZXZlbnQpOwotICBpZiAobmV0d29ya19ldmVudC0+dHlwZSgpID09IG5ldHdvcms6Ok5ldHdvcmtFdmVudDo6a0Rpc2Nvbm5lY3Rpb24pIHsKLSAgICBMT0coSU5GTykgPDwgIkRldGVjdGVkIGEgbmV0d29yayBkaXNjb25uZWN0aW9uLiI7Ci0gICAgbmV0d29ya19zdGF0dXNfID0ga0Rpc2Nvbm5lY3RlZE5ldHdvcmtTdGF0dXM7Ci0gICAgKytuZXR3b3JrX2Rpc2Nvbm5lY3RfY291bnRfOwotICAgIGJyb3dzZXJfbW9kdWxlXy0+TmF2aWdhdGUoR1VSTCgiaDV2Y2M6Ly9uZXR3b3JrLWZhaWx1cmUiKSk7Ci0gIH0gZWxzZSBpZiAobmV0d29ya19ldmVudC0+dHlwZSgpID09IG5ldHdvcms6Ok5ldHdvcmtFdmVudDo6a0Nvbm5lY3Rpb24pIHsKLSAgICBuZXR3b3JrX3N0YXR1c18gPSBrQ29ubmVjdGVkTmV0d29ya1N0YXR1czsKLSAgICArK25ldHdvcmtfY29ubmVjdF9jb3VudF87Ci0gICAgaWYgKG5ldHdvcmtfZGlzY29ubmVjdF9jb3VudF8gPiAwKSB7Ci0gICAgICBETE9HKElORk8pIDw8ICJHb3QgbmV0d29yayBjb25uZWN0aW9uIGV2ZW50LCByZWxvYWRpbmcgYnJvd3Nlci4iOwotICAgICAgYnJvd3Nlcl9tb2R1bGVfLT5SZWxvYWQoKTsKLSAgICB9IGVsc2UgewotICAgICAgRExPRyhJTkZPKSA8PCAiR290IG5ldHdvcmsgY29ubmVjdGlvbiBldmVudCwgTk9UIHJlbG9hZGluZyBicm93c2VyLiI7Ci0gICAgfQotICB9Ci19Ci0KIHZvaWQgQXBwbGljYXRpb246Ok9uQXBwbGljYXRpb25FdmVudChTYkV2ZW50VHlwZSBldmVudF90eXBlKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwgIkFwcGxpY2F0aW9uOjpPbkFwcGxpY2F0aW9uRXZlbnQoKSIpOwogICBEQ0hFQ0soYXBwbGljYXRpb25fZXZlbnRfdGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CkBAIC0xMDc0LDggKzEwNDUsMTAgQEAKICAgICBjYXNlIGtTYkV2ZW50VHlwZUFjY2Vzc2libGl0eVNldHRpbmdzQ2hhbmdlZDoKICAgICBjYXNlIGtTYkV2ZW50VHlwZUlucHV0OgogICAgIGNhc2Uga1NiRXZlbnRUeXBlTGluazoKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9ESVNDT05ORUNUX1ZFUlNJT04KICAgICBjYXNlIGtTYkV2ZW50VHlwZU5ldHdvcmtDb25uZWN0OgogICAgIGNhc2Uga1NiRXZlbnRUeXBlTmV0d29ya0Rpc2Nvbm5lY3Q6CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX0RJU0NPTk5FQ1RfVkVSU0lPTgogICAgIGNhc2Uga1NiRXZlbnRUeXBlU2NoZWR1bGVkOgogICAgIGNhc2Uga1NiRXZlbnRUeXBlVXNlcjoKICAgICBjYXNlIGtTYkV2ZW50VHlwZVZlcnRpY2FsU3luYzoKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cAppbmRleCA5ZmY2ZjYwLi4wOWI2MDdjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXAKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXIuZ3lwCkBAIC0zMCw4ICszMCw2IEBACiAgICAgICAgICdicm93c2VyX21vZHVsZS5oJywKICAgICAgICAgJ2RlYnVnX2NvbnNvbGUuY2MnLAogICAgICAgICAnZGVidWdfY29uc29sZS5oJywKLSAgICAgICAgJ2g1dmNjX3VybF9oYW5kbGVyLmNjJywKLSAgICAgICAgJ2g1dmNjX3VybF9oYW5kbGVyLmgnLAogICAgICAgICAnbGlmZWN5Y2xlX2NvbnNvbGVfY29tbWFuZHMuY2MnLAogICAgICAgICAnbGlmZWN5Y2xlX2NvbnNvbGVfY29tbWFuZHMuaCcsCiAgICAgICAgICdsaWZlY3ljbGVfb2JzZXJ2ZXIuaCcsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cAppbmRleCA0ODI2NjkzLi4wMjgxYmQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXAKQEAgLTE2Nyw2ICsxNjcsNyBAQAogICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnX2FycmF5LmlkbCcsCiAgICAgICAgICcuLi9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaWRsJywKICAgICAgICAgJy4uL2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuaWRsJywKKyAgICAgICAgJy4uL2g1dmNjL2g1dmNjX3BsYXRmb3JtX3NlcnZpY2UuaWRsJywKICAgICAgICAgJy4uL2g1dmNjL2g1dmNjX3J1bnRpbWUuaWRsJywKICAgICAgICAgJy4uL2g1dmNjL2g1dmNjX3J1bnRpbWVfZXZlbnRfdGFyZ2V0LmlkbCcsCiAgICAgICAgICcuLi9oNXZjYy9oNXZjY19zZXR0aW5ncy5pZGwnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjCmluZGV4IGFmZmNjZjguLmQ2NTUyOWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MKQEAgLTI4OSw4ICsyODksNiBAQAogICAvLyBBcHBseSBwbGF0Zm9ybSBtZW1vcnkgc2V0dGluZyBhZGp1c3RtZW50cyBhbmQgZGVmYXVsdHMuCiAgIEFwcGx5QXV0b01lbVNldHRpbmdzKCk7CiAKLSAgaDV2Y2NfdXJsX2hhbmRsZXJfLnJlc2V0KG5ldyBINXZjY1VSTEhhbmRsZXIodGhpcykpOwotCiAjaWYgU0JfSEFTKENPUkVfRFVNUF9IQU5ETEVSX1NVUFBPUlQpCiAgIFNiQ29yZUR1bXBSZWdpc3RlckhhbmRsZXIoQnJvd3Nlck1vZHVsZTo6Q29yZUR1bXBIYW5kbGVyLCB0aGlzKTsKICAgb25fZXJyb3JfdHJpZ2dlcmVkX2NvdW50XyA9IDA7CkBAIC00NTksMTMgKzQ1NywxMyBAQAogICAvLyBzaW1wbHkgc2V0IHRoZSBwZW5kaW5nIG5hdmlnYXRlIHVybCwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgbmF2aWdhdGlvbiB0bwogICAvLyBvY2N1ciB3aGVuIENvYmFsdCByZXN1bWVzLCBhbmQgcmV0dXJuLgogICBpZiAoYXBwbGljYXRpb25fc3RhdGVfID09IGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3VzcGVuZGVkKSB7Ci0gICAgcGVuZGluZ19uYXZpZ2F0ZV91cmxfID0gdXJsLnNwZWMoKTsKKyAgICBwZW5kaW5nX25hdmlnYXRlX3VybF8gPSB1cmw7CiAgICAgcmV0dXJuOwogICB9CiAKICAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGUgbmF2aWdhdGlvbiBpcyBvY2N1cnJpbmcsIGNsZWFyIG91dAogICAvLyB8cGVuZGluZ19uYXZpZ2F0ZV91cmxffC4KLSAgcGVuZGluZ19uYXZpZ2F0ZV91cmxfLmNsZWFyKCk7CisgIHBlbmRpbmdfbmF2aWdhdGVfdXJsXyA9IEdVUkw6OkVtcHR5R1VSTCgpOwogCiAgIC8vIERlc3Ryb3kgb2xkIFdlYk1vZHVsZSBmaXJzdCwgc28gd2UgZG9uJ3QgZ2V0IGEgbWVtb3J5IGhpZ2gtd2F0ZXJtYXJrIGFmdGVyCiAgIC8vIHRoZSBzZWNvbmQgV2ViTW9kdWxlJ3MgY29uc3RydWN0b3IgcnVucywgYnV0IGJlZm9yZSBzY29wZWRfcHRyOjpyZXNldCgpIGlzCkBAIC0xMTc1LDcgKzExNzMsNyBAQAogICAvLyBwb3NpdGl2ZSByZXNwb25zZTsgb3RoZXJ3aXNlLCBpZiBDb2JhbHQgaXMgY3VycmVudGx5IHByZWxvYWRlZCBvcgogICAvLyBzdXNwZW5kZWQsIHRoZW4gdGhpcyBpcyB0aGUgdXJsIHRoYXQgQ29iYWx0IHdpbGwgbmF2aWdhdGUgdG8gd2hlbiBpdCBzdGFydHMKICAgLy8gb3IgcmVzdW1lcy4KLSAgcGVuZGluZ19uYXZpZ2F0ZV91cmxfID0gdXJsLnNwZWMoKTsKKyAgcGVuZGluZ19uYXZpZ2F0ZV91cmxfID0gdXJsOwogCiAgIC8vIFN0YXJ0IHRoZSBPbkVycm9yUmV0cnkoKSB0aW1lciBpZiBpdCBpc24ndCBhbHJlYWR5IHJ1bm5pbmcuCiAgIC8vIFRoZSBtaW5pbXVtIGRlbGF5IGJldHdlZW4gY2FsbHMgdG8gT25FcnJvclJldHJ5KCkgZXhwb25lbnRpYWxseSBncm93cyBhcwpAQCAtMTIwMyw4ICsxMjAxLDI4IEBACiAgICsrb25fZXJyb3JfcmV0cnlfY291bnRfOwogICBvbl9lcnJvcl9yZXRyeV90aW1lXyA9IGJhc2U6OlRpbWVUaWNrczo6Tm93KCk7CiAgIHdhaXRpbmdfZm9yX2Vycm9yX3JldHJ5XyA9IHRydWU7Ci0gIFRyeVVSTEhhbmRsZXJzKAotICAgICAgR1VSTCgiaDV2Y2M6Ly9uZXR3b3JrLWZhaWx1cmU/cmV0cnktdXJsPSIgKyBwZW5kaW5nX25hdmlnYXRlX3VybF8pKTsKKworICBTeXN0ZW1QbGF0Zm9ybUVycm9ySGFuZGxlcjo6U3lzdGVtUGxhdGZvcm1FcnJvck9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5lcnJvcl90eXBlID0ga1NiU3lzdGVtUGxhdGZvcm1FcnJvclR5cGVDb25uZWN0aW9uRXJyb3I7CisgIG9wdGlvbnMuY2FsbGJhY2sgPQorICAgICAgYmFzZTo6QmluZCgmQnJvd3Nlck1vZHVsZTo6T25OZXR3b3JrRmFpbHVyZVN5c3RlbVBsYXRmb3JtUmVzcG9uc2UsCisgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOworICBzeXN0ZW1fcGxhdGZvcm1fZXJyb3JfaGFuZGxlcl8uUmFpc2VTeXN0ZW1QbGF0Zm9ybUVycm9yKG9wdGlvbnMpOworfQorCit2b2lkIEJyb3dzZXJNb2R1bGU6Ok9uTmV0d29ya0ZhaWx1cmVTeXN0ZW1QbGF0Zm9ybVJlc3BvbnNlKAorICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlIHJlc3BvbnNlKSB7CisgIC8vIEEgcG9zaXRpdmUgcmVzcG9uc2UgbWVhbnMgd2Ugc2hvdWxkIHJldHJ5LCBhbnl0aGluZyBlbHNlIHdlIHN0b3AuCisgIGlmIChyZXNwb25zZSA9PSBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2VQb3NpdGl2ZSkgeworICAgIC8vIFdlIHNob3VsZG4ndCBiZSBoZXJlIGlmIHdlIGRvbid0IGhhdmUgYSBwZW5kaW5nIFVSTCBmcm9tIGFuIGVycm9yLgorICAgIERDSEVDSyhwZW5kaW5nX25hdmlnYXRlX3VybF8uaXNfdmFsaWQoKSk7CisgICAgaWYgKHBlbmRpbmdfbmF2aWdhdGVfdXJsXy5pc192YWxpZCgpKSB7CisgICAgICBOYXZpZ2F0ZShwZW5kaW5nX25hdmlnYXRlX3VybF8pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBMT0coRVJST1IpIDw8ICJTdG9wIGFmdGVyIG5ldHdvcmsgZXJyb3IiOworICAgIFNiU3lzdGVtUmVxdWVzdFN0b3AoMCk7CisgIH0KIH0KIAogYm9vbCBCcm93c2VyTW9kdWxlOjpGaWx0ZXJLZXlFdmVudChiYXNlOjpUb2tlbiB0eXBlLApAQCAtMTY3MCw4ICsxNjg4LDggQEAKICAgICAgICAgICAgICAgICJCcm93c2VyTW9kdWxlOjpTdGFydE9yUmVzdW1lSW50ZXJuYWxQb3N0U3RhdGVVcGRhdGUiKTsKICAgLy8gSWYgdGhlcmUncyBhIG5hdmlnYXRpb24gdGhhdCdzIHBlbmRpbmcsIHRoZW4gYXR0ZW1wdCB0byBuYXZpZ2F0ZSB0byBpdHMKICAgLy8gc3BlY2lmaWVkIFVSTCBub3csIHVubGVzcyB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciBhbiBlcnJvciByZXRyeS4KLSAgaWYgKCFwZW5kaW5nX25hdmlnYXRlX3VybF8uZW1wdHkoKSAmJiAhd2FpdGluZ19mb3JfZXJyb3JfcmV0cnlfKSB7Ci0gICAgTmF2aWdhdGUoR1VSTChwZW5kaW5nX25hdmlnYXRlX3VybF8pKTsKKyAgaWYgKHBlbmRpbmdfbmF2aWdhdGVfdXJsXy5pc192YWxpZCgpICYmICF3YWl0aW5nX2Zvcl9lcnJvcl9yZXRyeV8pIHsKKyAgICBOYXZpZ2F0ZShwZW5kaW5nX25hdmlnYXRlX3VybF8pOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmgKaW5kZXggYmE3MDI5Ni4uN2Q1MWQ3OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmgKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9vbl9zY3JlZW5fa2V5Ym9hcmRfaGlkZGVuX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2Uvb25fc2NyZWVuX2tleWJvYXJkX3Nob3duX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2Uvb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zX3VwZGF0ZWRfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL2xpZmVjeWNsZV9jb25zb2xlX2NvbW1hbmRzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbGlmZWN5Y2xlX29ic2VydmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2F1dG9fbWVtLmgiCkBAIC0yOTEsMTAgKzI5MCwxNiBAQAogICAvLyBFcnJvciBjYWxsYmFjayBmb3IgYW55IGVycm9yIHRoYXQgc3RvcHMgdGhlIHByb2dyYW0uCiAgIHZvaWQgT25FcnJvcihjb25zdCBHVVJMJiB1cmwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcik7CiAKLSAgLy8gT25FcnJvclJldHJ5KCkgcnVucyBhIHJldHJ5IFVSTCB0aHJvdWdoIHRoZSBVUkwgaGFuZGxlcnMuIEl0IHNob3VsZCBvbmx5IGJlCi0gIC8vIGNhbGxlZCBieSB8b25fZXJyb3JfcmV0cnlfdGltZXJffC4KKyAgLy8gT25FcnJvclJldHJ5KCkgc2hvd3MgYSBwbGF0Zm9ybSBuZXR3b3JrIGVycm9yIHRvIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UgdG8KKyAgLy8gZml4IGJyb2tlbiBuZXR3b3JrIHNldHRpbmdzIGJlZm9yZSByZXRyeWluZy4gSXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5CisgIC8vIHxvbl9lcnJvcl9yZXRyeV90aW1lcl98LgogICB2b2lkIE9uRXJyb3JSZXRyeSgpOwogCisgIC8vIE5hdmlnYXRlcyBiYWNrIHRvIHRoZSBVUkwgdGhhdCBjYXVzZWQgYW4gZXJyb3IgaWYgdGhlIHJlc3BvbnNlIGZyb20gdGhlCisgIC8vIHBsYXRmb3JtIGVycm9yIHdhcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIHN0b3BzIHRoZSBhcHAuCisgIHZvaWQgT25OZXR3b3JrRmFpbHVyZVN5c3RlbVBsYXRmb3JtUmVzcG9uc2UoCisgICAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JSZXNwb25zZSByZXNwb25zZSk7CisKICAgLy8gRmlsdGVycyBhIGtleSBldmVudC4KICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIG90aGVyIGhhbmRsZXJzLAogICAvLyBmYWxzZSBpZiBpdCB3YXMgY29uc3VtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24uCkBAIC01NTEsOSArNTU2LDYgQEAKICAgTGlmZWN5Y2xlQ29uc29sZUNvbW1hbmRzIGxpZmVjeWNsZV9jb25zb2xlX2NvbW1hbmRzXzsKICNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKIAotICAvLyBIYW5kbGVyIG9iamVjdCBmb3IgaDV2Y2MgVVJMcy4KLSAgc2NvcGVkX3B0cjxINXZjY1VSTEhhbmRsZXI+IGg1dmNjX3VybF9oYW5kbGVyXzsKLQogICAvLyBUaGUgc3BsYXNoIHNjcmVlbi4gVGhlIHBvaW50ZXIgd3JhcHBlZCBoZXJlIHNob3VsZCBiZSBub24tTlVMTCBpZmYKICAgLy8gdGhlIHNwbGFzaCBzY3JlZW4gaXMgY3VycmVudGx5IGRpc3BsYXllZC4KICAgc2NvcGVkX3B0cjxTcGxhc2hTY3JlZW4+IHNwbGFzaF9zY3JlZW5fOwpAQCAtNTc3LDcgKzU3OSw3IEBACiAgIC8vIHN0YXRlLiBUaGlzIHVybCBpcyBzZXQgd2l0aGluIE9uRXJyb3IoKSBhbmQgYWxzbyB3aGVuIGEgbmF2aWdhdGlvbiBpcwogICAvLyBkZWZlcnJlZCBhcyBhIHJlc3VsdCBvZiBDb2JhbHQgYmVpbmcgc3VzcGVuZGVkOyBpdCBpcyBjbGVhcmVkIHdoZW4gYQogICAvLyBuYXZpZ2F0aW9uIG9jY3Vycy4KLSAgc3RkOjpzdHJpbmcgcGVuZGluZ19uYXZpZ2F0ZV91cmxfOworICBHVVJMIHBlbmRpbmdfbmF2aWdhdGVfdXJsXzsKIAogICAvLyBUaGUgbnVtYmVyIG9mIE9uRXJyb3JSZXRyeSgpIGNhbGxzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgbGFzdAogICAvLyBPbkRvbmUoKSBjYWxsLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBleHBvbmVudGlhbCBiYWNrb2ZmIGRlbGF5CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvY29iYWx0Lmd5cCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9jb2JhbHQuZ3lwCmluZGV4IDgxOGM5OTEuLjY3OTBmNzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9jb2JhbHQuZ3lwCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9jb2JhbHQuZ3lwCkBAIC0yMCwzMyArMjAsNDkgQEAKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnY29iYWx0JywKICAgICAgICd0eXBlJzogJzwoZmluYWxfZXhlY3V0YWJsZV90eXBlKScsCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3NlcicsCi0gICAgICBdLAogICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgIFsnY2xhbmcgYW5kIHRhcmdldF9vcyBub3QgaW4gWyJ0dm9zIiwgImFuZHJvaWQiLCAib3JiaXMiXSBhbmQgc2JfdGFyZ2V0X3BsYXRmb3JtIG5vdCBpbiBbImxpbnV4LXg2NHgxMS1jbGFuZy0zLTYiLCAibGludXgteDg2eDExIl0nLCB7CisgICAgICAgIFsnc2JfZXZlcmdyZWVuICE9IDEnLCB7CiAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9tdXNsL211c2wuZ3lwOmMnCisgICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3NlcicsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgICAgIFsnY2xhbmcgYW5kIHRhcmdldF9vcyBub3QgaW4gWyJ0dm9zIiwgImFuZHJvaWQiLCAib3JiaXMiXSBhbmQgc2JfdGFyZ2V0X3BsYXRmb3JtIG5vdCBpbiBbImxpbnV4LXg2NHgxMS1jbGFuZy0zLTYiLCAibGludXgteDg2eDExIl0nLCB7CisgICAgICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L211c2wvbXVzbC5neXA6YycKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgWydjb2JhbHRfZW5hYmxlX2xpYiA9PSAxJywgeworICAgICAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICAgICAnbGliL2NvYmFsdC5kZWYnLAorICAgICAgICAgICAgICAgICdsaWIvbWFpbi5jYycsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgICAgICdtYWluLmNjJywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgWydjb2JhbHRfc3BsYXNoX3NjcmVlbl9maWxlICE9ICIiJywgeworICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuL3NwbGFzaF9zY3JlZW4uZ3lwOmNvcHlfc3BsYXNoX3NjcmVlbicsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9XSwKICAgICAgICAgICBdLAogICAgICAgICB9XSwKLSAgICAgICAgWydjb2JhbHRfZW5hYmxlX2xpYiA9PSAxJywgewotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2xpYi9jb2JhbHQuZGVmJywKLSAgICAgICAgICAgICdsaWIvbWFpbi5jYycsCisgICAgICAgIFsnc2JfZXZlcmdyZWVuID09IDEnLCB7CisgICAgICAgICAgJ2xkZmxhZ3MnOiBbCisgICAgICAgICAgICAnLVdsLC0tZHluYW1pYy1saXN0PTwoREVQVEgpL3N0YXJib2FyZC9zdGFyYm9hcmQuc3ltcycsCisgICAgICAgICAgICAnLVdsLC0td2hvbGUtYXJjaGl2ZScsCisgICAgICAgICAgICAjIFRPRE86IEZpZ3VyZSBvdXQgaG93IHRvIHRha2UgdGhlIGd5cCBvdXRwdXQgZnJvbSBhIHZhcmlhYmxlLgorICAgICAgICAgICAgJ29iai9zdGFyYm9hcmQvbGludXgveDY0eDExL2V2ZXJncmVlbi9saWJzdGFyYm9hcmRfcGxhdGZvcm0uYScsCisgICAgICAgICAgICAnLVdsLC0tbm8td2hvbGUtYXJjaGl2ZScsCiAgICAgICAgICAgXSwKLSAgICAgICAgfSwgewotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ21haW4uY2MnLAotICAgICAgICAgIF0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ2NvYmFsdF9zcGxhc2hfc2NyZWVuX2ZpbGUgIT0gIiInLCB7CiAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuL3NwbGFzaF9zY3JlZW4uZ3lwOmNvcHlfc3BsYXNoX3NjcmVlbicsCisgICAgICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3N0YXJib2FyZC5neXA6c3RhcmJvYXJkX2Z1bGwnLAorICAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2NvYmFsdC5neXA6Y29iYWx0X2V2ZXJncmVlbicsCiAgICAgICAgICAgXSwKICAgICAgICAgfV0sCiAgICAgICBdLAogICAgIH0sCi0KICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnY29iYWx0X2RlcGxveScsCiAgICAgICAndHlwZSc6ICdub25lJywKQEAgLTU4LDcgKzc0LDYgQEAKICAgICAgIH0sCiAgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCiAgICAgfSwKLQogICAgIHsKICAgICAgICMgQ29udmVuaWVuY2UgdGFyZ2V0IHRvIGJ1aWxkIGNvYmFsdCBhbmQgY29weSB0aGUgZGVtb3MgaW50bwogICAgICAgIyBjb250ZW50L2RhdGEvdGVzdC9jb2JhbHQvZGVtb3MKQEAgLTcxLDYgKzg2LDQzIEBACiAgICAgfSwKICAgXSwKICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgWydzYl9ldmVyZ3JlZW4gPT0gMScsIHsKKyAgICAgICd0YXJnZXRzJzogWworICAgICAgICB7CisgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvYmFsdF9ldmVyZ3JlZW4nLAorICAgICAgICAgICd0eXBlJzogJ3NoYXJlZF9saWJyYXJ5JywKKyAgICAgICAgICAnbGlicmFyaWVzLyc6IFsKKyAgICAgICAgICAgIFsnZXhjbHVkZScsICcuKiddLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKKyAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cDpicm93c2VyJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJ21haW4uY2MnLAorICAgICAgICAgIF0sCisgICAgICAgICAgIyBUT0RPOiBSZW1vdmUgb25jZSB0aGUgbG9nLmggaXMgcmVmYWN0b3JlZCB0byBoYXZlIG9ubHkgQyBsaW5rYWdlIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAnbGRmbGFncyc6IFsKKyAgICAgICAgICAgICdvYmovc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3RhcmJvYXJkX3BsYXRmb3JtLmxvZ19tZXNzYWdlLmNjLm8nLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2xkZmxhZ3MvJzogWworICAgICAgICAgICAgWydleGNsdWRlJywgJy1XbCwtLXdyYXA9ZWdsU3dhcEJ1ZmZlcnMnXSwKKyAgICAgICAgICBdLAorICAgICAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICAgICAgWydjbGFuZyBhbmQgdGFyZ2V0X29zIG5vdCBpbiBbInR2b3MiLCAiYW5kcm9pZCIsICJvcmJpcyJdIGFuZCBzYl90YXJnZXRfcGxhdGZvcm0gbm90IGluIFsibGludXgteDY0eDExLWNsYW5nLTMtNiIsICJsaW51eC14ODZ4MTEiXScsIHsKKyAgICAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbXVzbC9tdXNsLmd5cDpjJworICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfV0sCisgICAgICAgICAgICBbJ2NvYmFsdF9zcGxhc2hfc2NyZWVuX2ZpbGUgIT0gIiInLCB7CisgICAgICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4vc3BsYXNoX3NjcmVlbi5neXA6Y29weV9zcGxhc2hfc2NyZWVuJywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICBdCisgICAgfV0sCiAgICAgWydidWlsZF9zbmFwc2hvdF9hcHBfc3RhdHMnLCB7CiAgICAgICAndGFyZ2V0cyc6IFsKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2g1dmNjX3VybF9oYW5kbGVyLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL2g1dmNjX3VybF9oYW5kbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI5NWY0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9zeXN0ZW1fcGxhdGZvcm1fZXJyb3JfaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBicm93c2VyIHsKLQotbmFtZXNwYWNlIHsKLS8vIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGdldCBpbmZvIGZyb20gYSBHVVJMLiBCZWNhdXNlIG91ciBzY2hlbWUgaXMKLS8vIG5vbi1zdGFuZGFyZCwgdGhlIG1ldGhvZHMgaW4gR1VSTCB3aWxsIG5vdCBwYXJzZSB0aGUgY29tcG9uZW50cyBmb3IgdXMuCi1zdGQ6OnN0cmluZyBHZXRINXZjY1VybFR5cGUoY29uc3QgR1VSTCYgdXJsKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGggPSB1cmwucGF0aCgpOwotICBzaXplX3Qgc3RhcnQgPSBwYXRoLmZpbmRfZmlyc3Rfbm90X29mKCIvIik7Ci0gIGlmIChzdGFydCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIERMT0coV0FSTklORykgPDwgIkNhbm5vdCBkZXRlcm1pbmUgdHlwZSBvZiBVUkwuIjsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc2l6ZV90IGVuZCA9IHBhdGguZmluZF9maXJzdF9vZigiLz8mIiwgc3RhcnQpOwotICBpZiAoZW5kICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgZW5kIC09IHN0YXJ0OwotICB9Ci0gIHJldHVybiBwYXRoLnN1YnN0cihzdGFydCwgZW5kKTsKLX0KLQotc3RkOjpzdHJpbmcgR2V0SDV2Y2NVcmxRdWVyeShjb25zdCBHVVJMJiB1cmwpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9IHVybC5wYXRoKCk7Ci0gIHNpemVfdCBzdGFydCA9IHBhdGguZmluZCgiPyIpOwotICBpZiAoc3RhcnQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgZmluZCBxdWVyeSBzdHJpbmcgaW4gVVJMLiI7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHJldHVybiBwYXRoLnN1YnN0cihzdGFydCArIDEpOwotfQotCi1zdGQ6OnN0cmluZyBHZXRINXZjY1VybFF1ZXJ5UGFyYW0oY29uc3QgR1VSTCYgdXJsLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBxdWVyeSA9IEdldEg1dmNjVXJsUXVlcnkodXJsKTsKLSAgc2l6ZV90IG5hbWVfc3RhcnQgPSBxdWVyeS5maW5kKG5hbWUpOwotICBpZiAobmFtZV9zdGFydCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIERMT0coV0FSTklORykgPDwgIlF1ZXJ5IHBhcmFtZXRlciAiIDw8IG5hbWUgPDwgIiBub3QgZm91bmQgaW4gVVJMLiI7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHNpemVfdCBuYW1lX2VuZCA9IHF1ZXJ5LmZpbmQoJz0nLCBuYW1lX3N0YXJ0KTsKLSAgaWYgKG5hbWVfZW5kID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiVmFsdWUgb2YgIiA8PCBuYW1lIDw8ICIgbm90IGZvdW5kIGluIFVSTC4iOwotICAgIHJldHVybiAiIjsKLSAgfQotICBzaXplX3QgdmFsdWVfc3RhcnQgPSBuYW1lX2VuZCAtIG5hbWVfc3RhcnQgKyAxOwotICBzaXplX3QgdmFsdWVfZW5kID0gcXVlcnkuZmluZF9maXJzdF9vZignJicsIHZhbHVlX3N0YXJ0KTsKLSAgaWYgKHZhbHVlX2VuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIHZhbHVlX2VuZCAtPSB2YWx1ZV9zdGFydDsKLSAgfQotICByZXR1cm4gcXVlcnkuc3Vic3RyKHZhbHVlX3N0YXJ0LCB2YWx1ZV9lbmQpOwotfQotCi1jb25zdCBjaGFyIGtINXZjY1NjaGVtZVtdID0gImg1dmNjIjsKLWNvbnN0IGNoYXIga05ldHdvcmtGYWlsdXJlW10gPSAibmV0d29yay1mYWlsdXJlIjsKLQotY29uc3QgY2hhciBrUmV0cnlQYXJhbVtdID0gInJldHJ5LXVybCI7Ci19ICAvLyBuYW1lc3BhY2UKLQotSDV2Y2NVUkxIYW5kbGVyOjpINXZjY1VSTEhhbmRsZXIoQnJvd3Nlck1vZHVsZSogYnJvd3Nlcl9tb2R1bGUpCi0gICAgOiBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoVVJMSGFuZGxlcigKLSAgICAgICAgICBicm93c2VyX21vZHVsZSwKLSAgICAgICAgICBiYXNlOjpCaW5kKCZINXZjY1VSTEhhbmRsZXI6OkhhbmRsZVVSTCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKSB7fQotCi1ib29sIEg1dmNjVVJMSGFuZGxlcjo6SGFuZGxlVVJMKGNvbnN0IEdVUkwmIHVybCkgewotICBib29sIHdhc19oYW5kbGVkID0gZmFsc2U7Ci0gIGlmICh1cmwuU2NoZW1lSXMoa0g1dmNjU2NoZW1lKSkgewotICAgIHVybF8gPSB1cmw7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgdHlwZSA9IEdldEg1dmNjVXJsVHlwZSh1cmwpOwotICAgIGlmICh0eXBlID09IGtOZXR3b3JrRmFpbHVyZSkgewotICAgICAgd2FzX2hhbmRsZWQgPSBIYW5kbGVOZXR3b3JrRmFpbHVyZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIlVua25vd24gaDV2Y2MgVVJMIHR5cGU6ICIgPDwgdHlwZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHdhc19oYW5kbGVkOwotfQotCi1ib29sIEg1dmNjVVJMSGFuZGxlcjo6SGFuZGxlTmV0d29ya0ZhaWx1cmUoKSB7Ci0gIFN5c3RlbVBsYXRmb3JtRXJyb3JIYW5kbGVyOjpTeXN0ZW1QbGF0Zm9ybUVycm9yT3B0aW9ucyBvcHRpb25zOwotICBvcHRpb25zLmVycm9yX3R5cGUgPSBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZUNvbm5lY3Rpb25FcnJvcjsKLSAgb3B0aW9ucy5jYWxsYmFjayA9Ci0gICAgICBiYXNlOjpCaW5kKCZINXZjY1VSTEhhbmRsZXI6Ok9uTmV0d29ya0ZhaWx1cmVTeXN0ZW1QbGF0Zm9ybVJlc3BvbnNlLAotICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKLSAgYnJvd3Nlcl9tb2R1bGUoKS0+c3lzdGVtX3BsYXRmb3JtX2Vycm9yX2hhbmRsZXIoKS0+UmFpc2VTeXN0ZW1QbGF0Zm9ybUVycm9yKAotICAgICAgb3B0aW9ucyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEg1dmNjVVJMSGFuZGxlcjo6T25OZXR3b3JrRmFpbHVyZVN5c3RlbVBsYXRmb3JtUmVzcG9uc2UoCi0gICAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcmV0cnlfdXJsID0gR2V0SDV2Y2NVcmxRdWVyeVBhcmFtKHVybF8sIGtSZXRyeVBhcmFtKTsKLSAgLy8gQSBwb3NpdGl2ZSByZXNwb25zZSBtZWFucyB3ZSBzaG91bGQgcmV0cnkuCi0gIGlmIChyZXNwb25zZSA9PSBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2VQb3NpdGl2ZSAmJgotICAgICAgcmV0cnlfdXJsLmxlbmd0aCgpID4gMCkgewotICAgIEdVUkwgdXJsKHJldHJ5X3VybCk7Ci0gICAgaWYgKHVybC5pc192YWxpZCgpKSB7Ci0gICAgICBicm93c2VyX21vZHVsZSgpLT5OYXZpZ2F0ZShHVVJMKHJldHJ5X3VybCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAvLyBXZSB3ZXJlIHRvbGQgbm90IHRvIHJldHJ5LCBvciBkb24ndCBoYXZlIGEgcmV0cnkgVVJMLCBzbyBsZWF2ZSB0aGUgYXBwLgotICBMT0coRVJST1IpIDw8ICJTdG9wIGFmdGVyIG5ldHdvcmsgZXJyb3IiOwotICBTYlN5c3RlbVJlcXVlc3RTdG9wKDApOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2g1dmNjX3VybF9oYW5kbGVyLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvaDV2Y2NfdXJsX2hhbmRsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzODA4Zi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvaDV2Y2NfdXJsX2hhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9INVZDQ19VUkxfSEFORExFUl9IXwotI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9INVZDQ19VUkxfSEFORExFUl9IXwotCi0jaW5jbHVkZSAiY29iYWx0L2FjY291bnQvYWNjb3VudF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvdXJsX2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYnJvd3NlciB7Ci0KLS8vIEhhbmRsZXIgZm9yIFVSTHMgd2l0aCB0aGUgc2NoZW1lIGg1dmNjOi8vLiBUaGVzZSBVUkxzIGFyZSBub3QgbG9hZGVkIGludG8gYQotLy8gd2ViIG1vZHVsZSB1c2luZyB0aGUgdXN1YWwgbG9hZGVyL2ZldGNoZXIgbWVjaGFuaXNtLCBidXQgYXJlIGluc3RlYWQKLS8vIGhhbmRsZWQgc2VwYXJhdGVseSwgZS5nLiBieSBzaG93aW5nIGEgc3lzdGVtIGRpYWxvZy4KLWNsYXNzIEg1dmNjVVJMSGFuZGxlciA6IHB1YmxpYyBVUkxIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEg1dmNjVVJMSGFuZGxlcihCcm93c2VyTW9kdWxlKiBicm93c2VyX21vZHVsZSk7Ci0gIH5INXZjY1VSTEhhbmRsZXIoKSB7fQotCi0gcHJpdmF0ZToKLSAgYm9vbCBIYW5kbGVVUkwoY29uc3QgR1VSTCYgdXJsKTsKLSAgYm9vbCBIYW5kbGVOZXR3b3JrRmFpbHVyZSgpOwotCi0gIHZvaWQgT25OZXR3b3JrRmFpbHVyZVN5c3RlbVBsYXRmb3JtUmVzcG9uc2UoCi0gICAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JSZXNwb25zZSByZXNwb25zZSk7Ci0KLSAgR1VSTCB1cmxfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBDT0JBTFRfQlJPV1NFUl9INVZDQ19VUkxfSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9hdXRvX21lbS5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvYXV0b19tZW0uY2MKaW5kZXggZDFlNjBiZC4uNWNmOTMwNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9hdXRvX21lbS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2F1dG9fbWVtLmNjCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL3ByZXR0eV9wcmludC5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9zY2FsaW5nX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbWF0aC9jbGFtcC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTQ0OCw3ICs0NDksOSBAQAogICAgICAgc3dpdGNoZXM6OmtJbWFnZUNhY2hlU2l6ZUluQnl0ZXMsCiAgICAgICBjb21tYW5kX2xpbmVfc2V0dGluZ3MuY29iYWx0X2ltYWdlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICBidWlsZF9zZXR0aW5ncy5jb2JhbHRfaW1hZ2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgIENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplKHVpX3Jlc29sdXRpb24pKTsKKyAgICAgIENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplKAorICAgICAgICAgIHVpX3Jlc29sdXRpb24sCisgICAgICAgICAgbG9hZGVyOjppbWFnZTo6SW1hZ2VEZWNvZGVyOjpBbGxvd0RlY29kaW5nVG9NdWx0aVBsYW5lKCkpKTsKICAgRW5zdXJlVmFsdWVQb3NpdGl2ZShpbWFnZV9jYWNoZV9zaXplX2luX2J5dGVzXy5nZXQoKSk7CiAgIGltYWdlX2NhY2hlX3NpemVfaW5fYnl0ZXNfLT5zZXRfbWVtb3J5X3R5cGUoTWVtb3J5U2V0dGluZzo6a0dQVSk7CiAgIC8vIEltYWdlQ2FjaGUgcmVsZWFzZXMgbWVtb3J5IGxpbmVhcmx5IHVudGlsIGEgcHJvZ3Jlc3MgdmFsdWUgb2YgNzUlLCB0aGVuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2F1dG9fbWVtX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2F1dG9fbWVtX3Rlc3QuY2MKaW5kZXggMzc1ZDQwOS4uYjdiN2M4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9hdXRvX21lbV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvYXV0b19tZW1fdGVzdC5jYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9jYWxjdWxhdGlvbnMuaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvdGVzdF9jb21tb24uaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvYmFsdC9tYXRoL3NpemUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCkBAIC0xMzAsNyArMTMxLDcgQEAKIH0KIAogLy8gVGVzdHMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgaWYgdGhlIGNvbW1hbmQgbGluZSBzcGVjaWZpZXMgdGhhdCB0aGUgdmFyaWFibGUKLS8vIGlzICJhdXRvc2V0IiB0aGF0IHRoZSBidWlsdGluIHNldHRpbmcgaXMgb3ZlcnJpZGVuLgorLy8gaXMgImF1dG9zZXQiIHRoYXQgdGhlIGJ1aWx0aW4gc2V0dGluZyBpcyBvdmVycmlkZGVuLgogVEVTVChBdXRvTWVtLCBDb21tYW5kTGluZVNwZWNpZmllc0F1dG9zZXQpIHsKICAgQXV0b01lbVNldHRpbmdzIGNvbW1hbmRfbGluZV9zZXR0aW5ncyhBdXRvTWVtU2V0dGluZ3M6OmtUeXBlQ29tbWFuZExpbmUpOwogICBjb21tYW5kX2xpbmVfc2V0dGluZ3MuY29iYWx0X2ltYWdlX2NhY2hlX3NpemVfaW5fYnl0ZXMgPSAtMTsKQEAgLTEzOSw5ICsxNDAsMTIgQEAKIAogICBBdXRvTWVtIGF1dG9fbWVtKGtSZXNvbHV0aW9uMTA4MHAsIGNvbW1hbmRfbGluZV9zZXR0aW5ncywgYnVpbGRfc2V0dGluZ3MpOwogCi0gIEVYUEVDVF9NRU1PUllfU0VUVElORyhhdXRvX21lbS5pbWFnZV9jYWNoZV9zaXplX2luX2J5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlTZXR0aW5nOjprQXV0b1NldCwgTWVtb3J5U2V0dGluZzo6a0dQVSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplKGtSZXNvbHV0aW9uMTA4MHApKTsKKyAgRVhQRUNUX01FTU9SWV9TRVRUSU5HKAorICAgICAgYXV0b19tZW0uaW1hZ2VfY2FjaGVfc2l6ZV9pbl9ieXRlcygpLCBNZW1vcnlTZXR0aW5nOjprQXV0b1NldCwKKyAgICAgIE1lbW9yeVNldHRpbmc6OmtHUFUsCisgICAgICBDYWxjdWxhdGVJbWFnZUNhY2hlU2l6ZSgKKyAgICAgICAgICBrUmVzb2x1dGlvbjEwODBwLAorICAgICAgICAgIGxvYWRlcjo6aW1hZ2U6OkltYWdlRGVjb2Rlcjo6QWxsb3dEZWNvZGluZ1RvTXVsdGlQbGFuZSgpKSk7CiB9CiAKIC8vIFRlc3RzIHRoYXQgc2tpYSBhdGxhcyB0ZXh0dXJlIHdpbGwgYmUgYmluZCB0byB0aGUgYnVpbHQgaW4gdmFsdWUsIGlmZiBpdCBoYXMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvY2FsY3VsYXRpb25zLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9jYWxjdWxhdGlvbnMuY2MKaW5kZXggNTM4YmI4Ny4uN2I1YTM1ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9jYWxjdWxhdGlvbnMuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9jYWxjdWxhdGlvbnMuY2MKQEAgLTEwNSw5ICsxMDUsMTcgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLWludDY0X3QgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoY29uc3QgbWF0aDo6U2l6ZSYgZGltZW5zaW9ucykgeworaW50NjRfdCBDYWxjdWxhdGVJbWFnZUNhY2hlU2l6ZShjb25zdCBtYXRoOjpTaXplJiBkaW1lbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X2ltYWdlX2RlY29kaW5nX3RvX211bHRpX3BsYW5lKSB7CiAgIGNvbnN0IGRvdWJsZSBkaXNwbGF5X3NjYWxlID0gRGlzcGxheVNjYWxlVG8xMDgwcChkaW1lbnNpb25zKTsKLSAgc3RhdGljIGNvbnN0IGludDY0X3Qga1JlZmVyZW5jZVNpemUxMDgwcCA9IDMyICogMTAyNCAqIDEwMjQ7CisgIGNvbnN0IGludDY0X3Qga1JlZmVyZW5jZVNpemUxMDgwcCA9CisgICAgICBhbGxvd19pbWFnZV9kZWNvZGluZ190b19tdWx0aV9wbGFuZQorICAgICAgICAgID8ga0ltYWdlQ2FjaGVTaXplMTA4MHBXaXRoRGVjb2RpbmdUb011bHRpUGxhbmUKKyAgICAgICAgICA6IGtJbWFnZUNhY2hlU2l6ZTEwODBwV2l0aG91dERlY29kaW5nVG9NdWx0aVBsYW5lOworICBjb25zdCBpbnQ2NF90IGtNaW5JbWFnZUNhY2hlU2l6ZSA9CisgICAgICBhbGxvd19pbWFnZV9kZWNvZGluZ190b19tdWx0aV9wbGFuZQorICAgICAgICAgID8ga01pbkltYWdlQ2FjaGVTaXplV2l0aERlY29kaW5nVG9NdWx0aVBsYW5lCisgICAgICAgICAgOiBrTWluSW1hZ2VDYWNoZVNpemVXaXRob3V0RGVjb2RpbmdUb011bHRpUGxhbmU7CiAgIGRvdWJsZSBvdXRwdXRfYnl0ZXMgPSBrUmVmZXJlbmNlU2l6ZTEwODBwICogZGlzcGxheV9zY2FsZTsKIAogICByZXR1cm4gbWF0aDo6Q2xhbXA8aW50NjRfdD4oc3RhdGljX2Nhc3Q8aW50NjRfdD4ob3V0cHV0X2J5dGVzKSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvY2FsY3VsYXRpb25zLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2NhbGN1bGF0aW9ucy5oCmluZGV4IDg1NDQzODYuLmQwMzRmYTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvY2FsY3VsYXRpb25zLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9jYWxjdWxhdGlvbnMuaApAQCAtMzAsOCArMzAsMTIgQEAKIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3NlZCBoZXJlIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQKIC8vIGRpcmVjdGx5LgogLy8gQ2FsY3VsYXRlcyB0aGUgSW1hZ2VDYWNoZVNpemUgaW4gYnl0ZXMuCi0vLyBUaGUgcmV0dXJuIHJhbmdlcyBmcm9tIFtrTWluSW1hZ2VDYWNoZVNpemUsIGtNYXhJbWFnZUNhY2hlU2l6ZV0uCi1pbnQ2NF90IENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplKGNvbnN0IG1hdGg6OlNpemUmIGRpbWVuc2lvbnMpOworLy8gV2hlbiB8YWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmV8IGlzIHNldCB0byB0cnVlLCB0aGUgcmV0dXJuIHJhbmdlcworLy8gZnJvbSBba01pbkltYWdlQ2FjaGVTaXplV2l0aERlY29kaW5nVG9NdWx0aVBsYW5lLCBrTWF4SW1hZ2VDYWNoZVNpemVdLgorLy8gV2hlbiB8YWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmV8IGlzIHNldCB0byBmYWxzZSwgdGhlIHJldHVybiByYW5nZXMKKy8vIGZyb20gW2tNaW5JbWFnZUNhY2hlU2l6ZVdpdGhvdXREZWNvZGluZ1RvTXVsdGlQbGFuZSwga01heEltYWdlQ2FjaGVTaXplXS4KK2ludDY0X3QgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoY29uc3QgbWF0aDo6U2l6ZSYgZGltZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd19pbWFnZV9kZWNvZGluZ190b19tdWx0aV9wbGFuZSk7CiAKIC8vIENhbGN1bGF0ZXMgdGhlIFNraWFBdGxhc0dseXBoVGV4dHVyZVNpemUuCiAvLyBXaGVuIHRoZSB1aSByZXNvbHV0aW9uIGlzIDE5MjB4MTA4MCwgdGhlbiB0aGUgcmV0dXJuZWQgYXRsYXMgdGV4dHVyZSBzaXplCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2NhbGN1bGF0aW9uc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9jYWxjdWxhdGlvbnNfdGVzdC5jYwppbmRleCA5ZWQyZWEzLi5mZGM0NTczIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2NhbGN1bGF0aW9uc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvY2FsY3VsYXRpb25zX3Rlc3QuY2MKQEAgLTg4LDIwICs4OCw0NyBAQAogfQogCiAvLyBUZXN0cyB0aGUgZXhwZWN0YXRpb24gdGhhdCBDYWxjdWxhdGVJbWFnZUNhY2hlU2l6ZSgpIGlzIGEgcHVyZSBmdW5jdGlvbgotLy8gKHNpZGUgZWZmZWN0IGZyZWUpIGFuZCB3aWxsIHByb2R1Y2UgdGhlIGV4cGVjdGVkIHJlc3VsdHMuCi1URVNUKE1lbW9yeUNhbGN1bGF0aW9ucywgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUpIHsKLSAgRVhQRUNUX0VRKGtNaW5JbWFnZUNhY2hlU2l6ZSwgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrNzIwcCkpKTsKLSAgRVhQRUNUX0VRKDMyICogMTAyNCAqIDEwMjQsICAvLyAzMk1CLgotICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrMTA4MHApKSk7Ci0gIEVYUEVDVF9FUShrTWF4SW1hZ2VDYWNoZVNpemUsIENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplKEdldERpbWVuc2lvbnMoa1VIRDRrKSkpOworLy8gKHNpZGUgZWZmZWN0IGZyZWUpIGFuZCB3aWxsIHByb2R1Y2UgdGhlIGV4cGVjdGVkIHJlc3VsdHMgd2hlbiBkZWNvZGluZyB0bworLy8gbXVsdGktcGxhbmUgaW1hZ2UgaXMgZW5hYmxlZC4KK1RFU1QoTWVtb3J5Q2FsY3VsYXRpb25zLCBDYWxjdWxhdGVJbWFnZUNhY2hlU2l6ZVdpdGhEZWNvZGluZ1RvTXVsdGlQbGFuZSkgeworICBFWFBFQ1RfRVEoa01pbkltYWdlQ2FjaGVTaXplV2l0aERlY29kaW5nVG9NdWx0aVBsYW5lLAorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrNzIwcCksIHRydWUpKTsKKyAgRVhQRUNUX0VRKGtJbWFnZUNhY2hlU2l6ZTEwODBwV2l0aERlY29kaW5nVG9NdWx0aVBsYW5lLAorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrMTA4MHApLCB0cnVlKSk7CisgIEVYUEVDVF9FUShrTWF4SW1hZ2VDYWNoZVNpemUsCisgICAgICAgICAgICBDYWxjdWxhdGVJbWFnZUNhY2hlU2l6ZShHZXREaW1lbnNpb25zKGtVSEQ0ayksIHRydWUpKTsKIAogICAvLyBFeHBlY3QgdGhhdCB0aGUgZmxvb3IgaXMgaGl0IGZvciBzbWFsbGVyIHZhbHVlcy4KLSAgRVhQRUNUX0VRKGtNaW5JbWFnZUNhY2hlU2l6ZSwgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrNDgwcCkpKTsKKyAgRVhQRUNUX0VRKGtNaW5JbWFnZUNhY2hlU2l6ZVdpdGhEZWNvZGluZ1RvTXVsdGlQbGFuZSwKKyAgICAgICAgICAgIENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplKEdldERpbWVuc2lvbnMoazQ4MHApLCB0cnVlKSk7CiAKICAgLy8gRXhwZWN0IHRoYXQgdGhlIGNlaWxpbmcgaXMgaGl0IGZvciBsYXJnZXIgdmFsdWVzLgogICBFWFBFQ1RfRVEoa01heEltYWdlQ2FjaGVTaXplLAotICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrQ2luZW1hNGspKSk7Ci0gIEVYUEVDVF9FUShrTWF4SW1hZ2VDYWNoZVNpemUsIENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplKEdldERpbWVuc2lvbnMoazhrKSkpOworICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrQ2luZW1hNGspLCB0cnVlKSk7CisgIEVYUEVDVF9FUShrTWF4SW1hZ2VDYWNoZVNpemUsCisgICAgICAgICAgICBDYWxjdWxhdGVJbWFnZUNhY2hlU2l6ZShHZXREaW1lbnNpb25zKGs4ayksIHRydWUpKTsKK30KKworLy8gVGVzdHMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoKSBpcyBhIHB1cmUgZnVuY3Rpb24KKy8vIChzaWRlIGVmZmVjdCBmcmVlKSBhbmQgd2lsbCBwcm9kdWNlIHRoZSBleHBlY3RlZCByZXN1bHRzIHdoZW4gZGVjb2RpbmcgdG8KKy8vIG11bHRpLXBsYW5lIGltYWdlIGlzIGRpc2FibGVkLgorVEVTVChNZW1vcnlDYWxjdWxhdGlvbnMsIENhbGN1bGF0ZUltYWdlQ2FjaGVTaXplV2l0aG91dERlY29kaW5nVG9NdWx0aVBsYW5lKSB7CisgIEVYUEVDVF9FUShrTWluSW1hZ2VDYWNoZVNpemVXaXRob3V0RGVjb2RpbmdUb011bHRpUGxhbmUsCisgICAgICAgICAgICBDYWxjdWxhdGVJbWFnZUNhY2hlU2l6ZShHZXREaW1lbnNpb25zKGs3MjBwKSwgZmFsc2UpKTsKKyAgRVhQRUNUX0VRKGtJbWFnZUNhY2hlU2l6ZTEwODBwV2l0aG91dERlY29kaW5nVG9NdWx0aVBsYW5lLAorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrMTA4MHApLCBmYWxzZSkpOworICBFWFBFQ1RfRVEoa01heEltYWdlQ2FjaGVTaXplLAorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrVUhENGspLCBmYWxzZSkpOworCisgIC8vIEV4cGVjdCB0aGF0IHRoZSBmbG9vciBpcyBoaXQgZm9yIHNtYWxsZXIgdmFsdWVzLgorICBFWFBFQ1RfRVEoa01pbkltYWdlQ2FjaGVTaXplV2l0aG91dERlY29kaW5nVG9NdWx0aVBsYW5lLAorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrNDgwcCksIGZhbHNlKSk7CisKKyAgLy8gRXhwZWN0IHRoYXQgdGhlIGNlaWxpbmcgaXMgaGl0IGZvciBsYXJnZXIgdmFsdWVzLgorICBFWFBFQ1RfRVEoa01heEltYWdlQ2FjaGVTaXplLAorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrQ2luZW1hNGspLCBmYWxzZSkpOworICBFWFBFQ1RfRVEoa01heEltYWdlQ2FjaGVTaXplLAorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VDYWNoZVNpemUoR2V0RGltZW5zaW9ucyhrOGspLCBmYWxzZSkpOwogfQogCiAvLyBUZXN0cyB0aGUgZXhwZWN0YXRpb24gdGhhdCBDYWxjdWxhdGVTa2lhR2x5cGhBdGxhc1RleHR1cmVTaXplKCkgaXMgYSBwdXJlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2NvbnN0YW50cy5oIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9jb25zdGFudHMuaAppbmRleCAyY2VlMzBhLi43NDYzMWIzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2NvbnN0YW50cy5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvY29uc3RhbnRzLmgKQEAgLTI3LDE2ICsyNywzMyBAQAogICAvLyBUaGlzIHdhcyBleHBlcmltZW50YWxseSBzZWxlY3RlZC4KICAga01pc2NDb2JhbHRDcHVTaXplSW5CeXRlcyA9IDExOSAqIDEwMjQgKiAxMDI0LAogCi0gIGtNaW5JbWFnZUNhY2hlU2l6ZSA9IDIwICogMTAyNCAqIDEwMjQsICAvLyAyMG1iLgorICAvLyBEZWNvZGluZyBpbWFnZSB0byBtdWx0aS1wbGFuZSBhbGxvd3MgdGhlIGRlY29kZWQgaW1hZ2VzIHRvIHVzZSAzLzggb2YKKyAgLy8gbWVtb3J5IGNvbXBhcmUgdG8gdGhlaXIgUkdCQSBjb3VudGVyIHBhcnQgZHVlIHRvIHRoZSBtb3JlIGNvbXBhY3QgbmF0dXJlIG9mCisgIC8vIHRoZSBZVVYgaW1hZ2VzIHZlcnN1cyBSR0JBLiAgQXMgbW9zdCBpbWFnZXMgaW4gdGhlIGltYWdlIGNhY2hlIGFyZSBqcGVncywKKyAgLy8gdGhpcyBlZmZlY3RpdmVseSByZWR1Y2VzIHRoZSBpbWFnZSBjYWNoZSBzaXplIHJlcXVpcmVtZW50cyBieSAyLiAgU28gd2UKKyAgLy8gcmVkdWNlIHRoZSBpbWFnZSBjYWNoZSBzaXplIGF0IDEwODBwIGFuZCB0aGUgbWluaW11bSByZXF1aXJlbWVudCBvZiBpbWFnZQorICAvLyBjYWNoZSBieSBoYWxmIHdoZW4gZGVjb2RpbmcgdG8gbXVsdGktcGxhbmUgaXMgZW5hYmxlZC4KKworICAvLyBUaGUgaW1hZ2UgY2FjaGUgc2l6ZSB3aGVuIHRoZSBvdXRwdXQgcmVzb2x1dGlvbiBpcyAxMDgwcC4gIFdoZW4gY2FsY3VsYXRpbmcKKyAgLy8gdGhlIGltYWdlIGNhY2hlIHNpemUgZm9yIG90aGVyIG91dHB1dCByZXNvbHV0aW9ucywgd2Ugc2NhbGUgdGhlIGltYWdlIGNhY2hlCisgIC8vIHNpemUgYXQgMTA4MHAgcHJvcG9ydGlvbmFsbHkgdG8gdGhlIG51bWJlciBvZiBwaXhlbHMgb2Ygb3RoZXIgcmVzb2x1dGlvbnMuCisgIC8vIFNvIHdoZW4gdGhlIHBpeGVscyBhcmUgZG91YmxlZCwgdGhlIGltYWdlIGNhY2hlIHNpemUgaXMgYWxzbyBkb3VibGVkLAorICAvLyBzdWJqZWN0IHRvIGNsYW1waW5nIGJldHdlZW4gbWluaW11bSBzaXplIGFuZCBtYXhpbXVtIHNpemUgbGlzdGVkIGJlbG93LgorICBrSW1hZ2VDYWNoZVNpemUxMDgwcFdpdGhEZWNvZGluZ1RvTXVsdGlQbGFuZSA9IDE2ICogMTAyNCAqIDEwMjQsICAgICAvLyAxNm1iCisgIGtJbWFnZUNhY2hlU2l6ZTEwODBwV2l0aG91dERlY29kaW5nVG9NdWx0aVBsYW5lID0gMzIgKiAxMDI0ICogMTAyNCwgIC8vIDMybWIKKworICBrTWluSW1hZ2VDYWNoZVNpemVXaXRoRGVjb2RpbmdUb011bHRpUGxhbmUgPSAxMCAqIDEwMjQgKiAxMDI0LCAgICAgLy8gMTBtYgorICBrTWluSW1hZ2VDYWNoZVNpemVXaXRob3V0RGVjb2RpbmdUb011bHRpUGxhbmUgPSAyMCAqIDEwMjQgKiAxMDI0LCAgLy8gMjBtYgorCiAgIGtNYXhJbWFnZUNhY2hlU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQsICAvLyA2NG1iCiAKICAga01pblNraWFHbHlwaFRleHR1cmVBdGxhc1dpZHRoID0gMjA0OCwKICAga01pblNraWFHbHlwaFRleHR1cmVBdGxhc0hlaWdodCA9IDIwNDgsCiAgIGtTa2lhR2x5cGhBdGxhc1RleHR1cmVCeXRlc1BlclBpeGVsID0gMiwKLSAga0RlZmF1bHRSZW1vdGVUeXBlRmFjZUNhY2hlU2l6ZSA9IDQgKiAxMDI0ICogMTAyNCwgIC8vIDRtYi4KKyAga0RlZmF1bHRSZW1vdGVUeXBlRmFjZUNhY2hlU2l6ZSA9IDQgKiAxMDI0ICogMTAyNCwgICAgICAgICAgIC8vIDRtYgogICBrRGVmYXVsdEpzR2FyYmFnZUNvbGxlY3Rpb25UaHJlc2hvbGRTaXplID0gOCAqIDEwMjQgKiAxMDI0LCAgLy8gOG1iCiAKLSAga01pblNraWFDYWNoZVNpemUgPSA0ICogMTAyNCAqIDEwMjQsICAvLyA0bWIuCisgIGtNaW5Ta2lhQ2FjaGVTaXplID0gNCAqIDEwMjQgKiAxMDI0LCAgLy8gNG1iCiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbWVtb3J5X3NldHRpbmdzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvb25fc2NyZWVuX2tleWJvYXJkX3N0YXJib2FyZF9icmlkZ2UuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvb25fc2NyZWVuX2tleWJvYXJkX3N0YXJib2FyZF9icmlkZ2UuY2MKaW5kZXggMTY5YTNkMC4uYTVkZTE5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL29uX3NjcmVlbl9rZXlib2FyZF9zdGFyYm9hcmRfYnJpZGdlLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9vbl9zY3JlZW5fa2V5Ym9hcmRfc3RhcmJvYXJkX2JyaWRnZS5jYwpAQCAtNTIsMTQgKzUyLDEzIEBACiAgICAgc3VnZ2VzdGlvbnNfZGF0YVtpXSA9IHN1Z2dlc3Rpb25zLmF0KGkpLmNfc3RyKCk7CiAgIH0KICAgLy8gRGVsYXkgcHJvdmlkaW5nIHRoZSBTYldpbmRvdyB1bnRpbCBhcyBsYXRlIGFzIHBvc3NpYmxlLgotICAvLyBUT0RPOiBVbmNvbW1lbnQgdGhpcyB3aGVuIHRoZXJlJ3MgYSBTdGFyYm9hcmQgaW1wbGVtZW50YXRpb24uCi0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIodGlja2V0KTsKLSAgLy8gU2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMoCi0gIC8vICAgICBzYl93aW5kb3dfcHJvdmlkZXJfLlJ1bigpLCBzdWdnZXN0aW9uc19kYXRhLmdldCgpLAotICAvLyAgICAgc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXplKCkpLCB0aWNrZXQpOworICBTYldpbmRvd1VwZGF0ZU9uU2NyZWVuS2V5Ym9hcmRTdWdnZXN0aW9ucygKKyAgICAgIHNiX3dpbmRvd19wcm92aWRlcl8uUnVuKCksIHN1Z2dlc3Rpb25zX2RhdGEuZ2V0KCksCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN1Z2dlc3Rpb25zLnNpemUoKSksIHRpY2tldCk7CiAjZWxzZQotICBMT0coV0FSTklORykgPDwgIlN0YXJib2FyZCB2ZXJzaW9uICIgPDwgU0JfQVBJX1ZFUlNJT04KLSAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3Qgc3VwcG9ydCBvbi1zY3JlZW4ga2V5Ym9hcmQgc3VnZ2VzdGlvbnMuIjsKKyAgTE9HKFdBUk5JTkcpCisgICAgICA8PCAiU3RhcmJvYXJkIHZlcnNpb24gIiA8PCBTQl9BUElfVkVSU0lPTgorICAgICAgPDwgIiBkb2VzIG5vdCBzdXBwb3J0IG9uLXNjcmVlbiBrZXlib2FyZCBzdWdnZXN0aW9ucyBvbiB0aGlzIHBsYXRmb3JtLiI7CiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCiB9CiAKQEAgLTY4LDYgKzY3LDE5IEBACiAgIHJldHVybiBTYldpbmRvd0lzT25TY3JlZW5LZXlib2FyZFNob3duKHNiX3dpbmRvd19wcm92aWRlcl8uUnVuKCkpOwogfQogCitib29sIE9uU2NyZWVuS2V5Ym9hcmRTdGFyYm9hcmRCcmlkZ2U6OlN1Z2dlc3Rpb25zU3VwcG9ydGVkKCkgY29uc3QgeworLy8gRGVsYXkgcHJvdmlkaW5nIHRoZSBTYldpbmRvdyB1bnRpbCBhcyBsYXRlIGFzIHBvc3NpYmxlLgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCisgIHJldHVybiBTYldpbmRvd09uU2NyZWVuS2V5Ym9hcmRTdWdnZXN0aW9uc1N1cHBvcnRlZCgKKyAgICAgIHNiX3dpbmRvd19wcm92aWRlcl8uUnVuKCkpOworI2Vsc2UKKyAgTE9HKFdBUk5JTkcpCisgICAgICA8PCAiU3RhcmJvYXJkIHZlcnNpb24gIiA8PCBTQl9BUElfVkVSU0lPTgorICAgICAgPDwgIiBkb2VzIG5vdCBzdXBwb3J0IG9uLXNjcmVlbiBrZXlib2FyZCBzdWdnZXN0aW9ucyBvbiB0aGlzIHBsYXRmb3JtLiI7CisgIHJldHVybiBmYWxzZTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfT05fU0NSRUVOX0tFWUJPQVJEX1NVR0dFU1RJT05TX1ZFUlNJT04KK30KKwogc2NvcGVkX3JlZnB0cjxkb206OkRPTVJlY3Q+CiBPblNjcmVlbktleWJvYXJkU3RhcmJvYXJkQnJpZGdlOjpCb3VuZGluZ1JlY3QoKSBjb25zdCB7CiAgIC8vIERlbGF5IHByb3ZpZGluZyB0aGUgU2JXaW5kb3cgdW50aWwgYXMgbGF0ZSBhcyBwb3NzaWJsZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9vbl9zY3JlZW5fa2V5Ym9hcmRfc3RhcmJvYXJkX2JyaWRnZS5oIGIvc3JjL2NvYmFsdC9icm93c2VyL29uX3NjcmVlbl9rZXlib2FyZF9zdGFyYm9hcmRfYnJpZGdlLmgKaW5kZXggYWM4Nzc4Mi4uMmI2YmRhMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL29uX3NjcmVlbl9rZXlib2FyZF9zdGFyYm9hcmRfYnJpZGdlLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL29uX3NjcmVlbl9rZXlib2FyZF9zdGFyYm9hcmRfYnJpZGdlLmgKQEAgLTQ5LDYgKzQ5LDggQEAKIAogICBib29sIElzU2hvd24oKSBjb25zdCBvdmVycmlkZTsKIAorICBib29sIFN1Z2dlc3Rpb25zU3VwcG9ydGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKICAgc2NvcGVkX3JlZnB0cjxkb206OkRPTVJlY3Q+IEJvdW5kaW5nUmVjdCgpIGNvbnN0IG92ZXJyaWRlOwogCiAgIGJvb2wgSXNWYWxpZFRpY2tldChpbnQgdGlja2V0KSBjb25zdCBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zeXN0ZW1fcGxhdGZvcm1fZXJyb3JfaGFuZGxlci5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zeXN0ZW1fcGxhdGZvcm1fZXJyb3JfaGFuZGxlci5jYwppbmRleCAyMmRiMjA0Li4zMzlkZjYzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3lzdGVtX3BsYXRmb3JtX2Vycm9yX2hhbmRsZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N5c3RlbV9wbGF0Zm9ybV9lcnJvcl9oYW5kbGVyLmNjCkBAIC0yNSw2ICsyNSw3IEBACiAKICAgQ2FsbGJhY2tEYXRhKiBjYWxsYmFja19kYXRhID0gbmV3IENhbGxiYWNrRGF0YXsgJm11dGV4Xywgb3B0aW9ucy5jYWxsYmFjayB9OwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfQ0xFQVJfUExBVEZPUk1fRVJST1JfVkVSU0lPTgogICBTYlN5c3RlbVBsYXRmb3JtRXJyb3IgaGFuZGxlID0gU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3Iob3B0aW9ucy5lcnJvcl90eXBlLAogICAgICAgJlN5c3RlbVBsYXRmb3JtRXJyb3JIYW5kbGVyOjpIYW5kbGVTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2UsCiAgICAgICBjYWxsYmFja19kYXRhKTsKQEAgLTMzLDYgKzM0LDE2IEBACiAgICAgZGVsZXRlIGNhbGxiYWNrX2RhdGE7CiAgICAgY2FsbGJhY2tfZGF0YSA9IG51bGxwdHI7CiAgIH0KKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfQ0xFQVJfUExBVEZPUk1fRVJST1JfVkVSU0lPTgorICBpZiAoIVNiU3lzdGVtUmFpc2VQbGF0Zm9ybUVycm9yKAorICAgICAgICAgIG9wdGlvbnMuZXJyb3JfdHlwZSwKKyAgICAgICAgICAmU3lzdGVtUGxhdGZvcm1FcnJvckhhbmRsZXI6OkhhbmRsZVN5c3RlbVBsYXRmb3JtRXJyb3JSZXNwb25zZSwKKyAgICAgICAgICBjYWxsYmFja19kYXRhKSkgeworICAgIERMT0coV0FSTklORykgPDwgIkRpZCBub3QgaGFuZGxlIGVycm9yOiAiIDw8IG9wdGlvbnMuZXJyb3JfdHlwZTsKKyAgICBkZWxldGUgY2FsbGJhY2tfZGF0YTsKKyAgICBjYWxsYmFja19kYXRhID0gbnVsbHB0cjsKKyAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9DTEVBUl9QTEFURk9STV9FUlJPUl9WRVJTSU9OCiAKICAgLy8gSW4gY2FzZSB0aGUgcmVzcG9uc2UgY2FsbGJhY2sgaXMgbmV2ZXIgY2FsbGVkLCB0cmFjayB0aGUgY2FsbGJhY2sgZGF0YQogICAvLyBmb3IgYWxsIGFjdGl2ZSBlcnJvcnMuIFdoZW4gdGhpcyBvYmplY3QgaXMgZGVzdHJveWVkLCBhbGwgZGFuZ2xpbmcgZGF0YQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYwppbmRleCBlM2ViYThkLi42MzgwYTgzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYwpAQCAtNjA2LDYgKzYwNiw3IEBACiAgIC8vIGFjY2Vzc2libGUgZnJvbSB8V2luZG93fCwgc28gd2UgbXVzdCBleHBsaWNpdGx5IGFkZCB0aGVtIGFzIHJvb3RzLgogICBnbG9iYWxfZW52aXJvbm1lbnRfLT5BZGRSb290KCZtdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXJfKTsKICAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+QWRkUm9vdChtZWRpYV9zb3VyY2VfcmVnaXN0cnlfLmdldCgpKTsKKyAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+QWRkUm9vdChibG9iX3JlZ2lzdHJ5Xy5nZXQoKSk7CiAKICNpZiBkZWZpbmVkKEVOQUJMRV9SRU1PVEVfREVCVUdHSU5HKQogICBpZiAoZGF0YS5vcHRpb25zLndhaXRfZm9yX3dlYl9kZWJ1Z2dlcikgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZCBiL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQKaW5kZXggN2FlODhkNS4uYmFlNjA2MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZAorKysgYi9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkCkBAIC0xICsxIEBACi0xOTQ3MTAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisyMDM5OTUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvY29iYWx0L2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLmd5cGkKaW5kZXggZTdmZmE5OC4uYTk0YmFjOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9jb2JhbHRfY29uZmlndXJhdGlvbi5neXBpCisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvY29iYWx0X2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtNDg2LDYgKzQ4Niw3IEBACiAgICAgICAnRU5BQkxFX1BBUlRJQUxfTEFZT1VUX0NPTlRST0wnLAogICAgICAgJ0VOQUJMRV9URVNUX0RBVEEnLAogICAgICAgJ0VOQUJMRV9URVNUX1JVTk5FUicsCisgICAgICAnRU5BQkxFX1RPS0VOX0FMUEhBQkVUSUNBTF9TT1JUSU5HJywKIAogICAgICAgIyBUT0RPOiBSZW5hbWUgdG8gQ09CQUxUX0xPR0dJTkdfRU5BQkxFRC4KICAgICAgICdfX0xCX1NIRUxMX19GT1JDRV9MT0dHSU5HX18nLApAQCAtNTA1LDYgKzUwNiw3IEBACiAgICAgICAnRU5BQkxFX1BBUlRJQUxfTEFZT1VUX0NPTlRST0wnLAogICAgICAgJ0VOQUJMRV9URVNUX0RBVEEnLAogICAgICAgJ0VOQUJMRV9URVNUX1JVTk5FUicsCisgICAgICAnRU5BQkxFX1RPS0VOX0FMUEhBQkVUSUNBTF9TT1JUSU5HJywKICAgICAgICdfX0xCX1NIRUxMX19GT1JDRV9MT0dHSU5HX18nLAogICAgICAgJ1NLX0RFVkVMT1BFUicsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLnkgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvZ3JhbW1hci55CmluZGV4IDRjZTRiNjcuLjAzNzhhMTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLnkKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2dyYW1tYXIueQpAQCAtMjUyLDYgKzI1Miw3IEBACiAldG9rZW4ga1JldmVyc2VUb2tlbiAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZQogLy8gJXRva2VuIGtSaWdodFRva2VuICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0IC0gYWxzbyBwcm9wZXJ0eSBuYW1lIHRva2VuCiAldG9rZW4ga1NhbnNTZXJpZlRva2VuICAgICAgICAgICAgICAgICAgLy8gc2Fucy1zZXJpZgorJXRva2VuIGtTY3JvbGxUb2tlbiAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbAogJXRva2VuIGtTZXJpZlRva2VuICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcmlmCiAldG9rZW4ga1NpbHZlclRva2VuICAgICAgICAgICAgICAgICAgICAgLy8gc2lsdmVyCiAldG9rZW4ga1NvbGlkVG9rZW4gICAgICAgICAgICAgICAgICAgICAgLy8gc29saWQKQEAgLTE4ODEsNiArMTg4Miw5IEBACiAgIHwga1NhbnNTZXJpZlRva2VuIHsKICAgICAkJCA9IFRyaXZpYWxTdHJpbmdQaWVjZTo6RnJvbUNTdHJpbmcoY3Nzb206OmtTYW5zU2VyaWZLZXl3b3JkTmFtZSk7CiAgIH0KKyAgfCBrU2Nyb2xsVG9rZW4geworICAgICQkID0gVHJpdmlhbFN0cmluZ1BpZWNlOjpGcm9tQ1N0cmluZyhjc3NvbTo6a1Njcm9sbEtleXdvcmROYW1lKTsKKyAgfQogICB8IGtTZXJpZlRva2VuIHsKICAgICAkJCA9IFRyaXZpYWxTdHJpbmdQaWVjZTo6RnJvbUNTdHJpbmcoY3Nzb206OmtTZXJpZktleXdvcmROYW1lKTsKICAgfQpAQCAtNDE1OCwxMiArNDE2MiwxOSBAQAogICA7CiAKIC8vIFNwZWNpZmllcyB3aGV0aGVyIGNvbnRlbnQgb2YgYSBibG9jayBjb250YWluZXIgZWxlbWVudCBpcyBjbGlwcGVkIHdoZW4gaXQKLS8vIG92ZXJmbG93cyB0aGUgZWxlbWVudCdzIGJveC4KKy8vIG92ZXJmbG93cyB0aGUgZWxlbWVudCdzIGJveCBhbmQgd2hldGhlciBhIHNjcm9sbGluZyBtZWNoYW5pc20gc2hvdWxkIGJlCisvLyBwcm92aWRlZC4KIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIvdmlzdWZ4Lmh0bWwjb3ZlcmZsb3cKIG92ZXJmbG93X3Byb3BlcnR5X3ZhbHVlOgotICAgIGtIaWRkZW5Ub2tlbiBtYXliZV93aGl0ZXNwYWNlIHsKKyAgICBrQXV0b1Rva2VuIG1heWJlX3doaXRlc3BhY2UgeworICAgICQkID0gQWRkUmVmKGNzc29tOjpLZXl3b3JkVmFsdWU6OkdldEF1dG8oKS5nZXQoKSk7CisgIH0KKyAgfCBrSGlkZGVuVG9rZW4gbWF5YmVfd2hpdGVzcGFjZSB7CiAgICAgJCQgPSBBZGRSZWYoY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0SGlkZGVuKCkuZ2V0KCkpOwogICB9CisgIHwga1Njcm9sbFRva2VuIG1heWJlX3doaXRlc3BhY2UgeworICAgICQkID0gQWRkUmVmKGNzc29tOjpLZXl3b3JkVmFsdWU6OkdldFNjcm9sbCgpLmdldCgpKTsKKyAgfQogICB8IGtWaXNpYmxlVG9rZW4gbWF5YmVfd2hpdGVzcGFjZSB7CiAgICAgJCQgPSBBZGRSZWYoY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0VmlzaWJsZSgpLmdldCgpKTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlcl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlcl90ZXN0LmNjCmluZGV4IGY0MWQ1MjAuLjY0NGY4ZTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wYXJzZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyX3Rlc3QuY2MKQEAgLTU1NzUsNiArNTU3NSwxNCBAQAogICAgICAgICAgICAgc3R5bGUtPkdldFByb3BlcnR5VmFsdWUoY3Nzb206OmtPdmVyZmxvd1dyYXBQcm9wZXJ0eSkpOwogfQogCitURVNUX0YoUGFyc2VyVGVzdCwgUGFyc2VzQXV0b092ZXJmbG93KSB7CisgIHNjb3BlZF9yZWZwdHI8Y3Nzb206OkNTU0RlY2xhcmVkU3R5bGVEYXRhPiBzdHlsZSA9CisgICAgICBwYXJzZXJfLlBhcnNlU3R5bGVEZWNsYXJhdGlvbkxpc3QoIm92ZXJmbG93OiBhdXRvOyIsIHNvdXJjZV9sb2NhdGlvbl8pOworCisgIEVYUEVDVF9FUShjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRBdXRvKCksCisgICAgICAgICAgICBzdHlsZS0+R2V0UHJvcGVydHlWYWx1ZShjc3NvbTo6a092ZXJmbG93UHJvcGVydHkpKTsKK30KKwogVEVTVF9GKFBhcnNlclRlc3QsIFBhcnNlc0hpZGRlbk92ZXJmbG93KSB7CiAgIHNjb3BlZF9yZWZwdHI8Y3Nzb206OkNTU0RlY2xhcmVkU3R5bGVEYXRhPiBzdHlsZSA9CiAgICAgICBwYXJzZXJfLlBhcnNlU3R5bGVEZWNsYXJhdGlvbkxpc3QoIm92ZXJmbG93OiBoaWRkZW47Iiwgc291cmNlX2xvY2F0aW9uXyk7CkBAIC01NTgzLDYgKzU1OTEsMTQgQEAKICAgICAgICAgICAgIHN0eWxlLT5HZXRQcm9wZXJ0eVZhbHVlKGNzc29tOjprT3ZlcmZsb3dQcm9wZXJ0eSkpOwogfQogCitURVNUX0YoUGFyc2VyVGVzdCwgUGFyc2VzU2Nyb2xsT3ZlcmZsb3cpIHsKKyAgc2NvcGVkX3JlZnB0cjxjc3NvbTo6Q1NTRGVjbGFyZWRTdHlsZURhdGE+IHN0eWxlID0KKyAgICAgIHBhcnNlcl8uUGFyc2VTdHlsZURlY2xhcmF0aW9uTGlzdCgib3ZlcmZsb3c6IHNjcm9sbDsiLCBzb3VyY2VfbG9jYXRpb25fKTsKKworICBFWFBFQ1RfRVEoY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0U2Nyb2xsKCksCisgICAgICAgICAgICBzdHlsZS0+R2V0UHJvcGVydHlWYWx1ZShjc3NvbTo6a092ZXJmbG93UHJvcGVydHkpKTsKK30KKwogVEVTVF9GKFBhcnNlclRlc3QsIFBhcnNlc1Zpc2libGVPdmVyZmxvdykgewogICBzY29wZWRfcmVmcHRyPGNzc29tOjpDU1NEZWNsYXJlZFN0eWxlRGF0YT4gc3R5bGUgPQogICAgICAgcGFyc2VyXy5QYXJzZVN0eWxlRGVjbGFyYXRpb25MaXN0KCJvdmVyZmxvdzogdmlzaWJsZTsiLCBzb3VyY2VfbG9jYXRpb25fKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyLmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuY2MKaW5kZXggMTZkOTA5NC4uOTNkNjA5ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuY2MKQEAgLTY3MSw4ICs2NzEsMTggQEAKIAogICAvLyBOZWdhdGl2ZSBudW1iZXJzIGFyZSBoYW5kbGVkIGluIHRoZSBncmFtbWFyLgogICBib29sIGRvdF9zZWVuKGZhbHNlKTsKKyAgZG91YmxlIGludGVnZXJfcGFydCgwKTsKKyAgZG91YmxlIGZyYWN0aW9uYWxfcGFydCgwKTsKKyAgaW50IGZyYWN0aW9uYWxfZGlnaXRzKDApOwogICB3aGlsZSAodHJ1ZSkgewotICAgIGlmICghSXNBc2NpaURpZ2l0KGlucHV0X2l0ZXJhdG9yX1swXSkpIHsKKyAgICBpZiAoSXNBc2NpaURpZ2l0KGlucHV0X2l0ZXJhdG9yX1swXSkpIHsKKyAgICAgIGlmIChkb3Rfc2VlbikgeworICAgICAgICArK2ZyYWN0aW9uYWxfZGlnaXRzOworICAgICAgICBmcmFjdGlvbmFsX3BhcnQgPSAoZnJhY3Rpb25hbF9wYXJ0ICogMTApICsgKGlucHV0X2l0ZXJhdG9yX1swXSAtICcwJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnRlZ2VyX3BhcnQgPSAoaW50ZWdlcl9wYXJ0ICogMTApICsgKGlucHV0X2l0ZXJhdG9yX1swXSAtICcwJyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAgIC8vIE9ubHkgb25lIGRvdCBpcyBhbGxvd2VkIGZvciBhIG51bWJlciwKICAgICAgIC8vIGFuZCBpdCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGlnaXQuCiAgICAgICBpZiAoaW5wdXRfaXRlcmF0b3JfWzBdICE9ICcuJyB8fCBkb3Rfc2VlbiB8fApAQCAtNjk5LDQwICs3MDksMzUgQEAKIAogICAvLyBIYW5kbGUgbnVtYmVycyBpbiBzY2llbnRpZmljIG5vdGF0aW9uLgogICBib29sIGlzX3NjaWVudGlmaWMoZmFsc2UpOwotICBpZiAoSXNBc2NpaUFscGhhQ2FzZWxlc3NFcXVhbCgqaW5wdXRfaXRlcmF0b3JfLCAnZScpKSB7Ci0gICAgLy8gT25seSBvbmUgZXhwb25lbnQgc3ltYm9sIGlzIGFsbG93ZWQgZm9yIGEgbnVtYmVyLAotICAgIC8vIGFuZCBpdCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc2lnbiBhbmQgZGlnaXRzLCBvciBqdXN0IGRpZ2l0cy4KLSAgICBpbnQgZXhwb25lbnRfcHJlZml4ID0gMDsKLSAgICBpZiAoKGlucHV0X2l0ZXJhdG9yX1sxXSA9PSAnLScgfHwgaW5wdXRfaXRlcmF0b3JfWzFdID09ICcrJykgJiYKLSAgICAgICAgIElzQXNjaWlEaWdpdChpbnB1dF9pdGVyYXRvcl9bMl0pKSB7Ci0gICAgICBleHBvbmVudF9wcmVmaXggPSAzOworICBkb3VibGUgZXhwb25lbnRfcGFydCgwKTsKKyAgaW50IGV4cG9uZW50X3NpZ24oMSk7CisgIGlmIChJc0FzY2lpQWxwaGFDYXNlbGVzc0VxdWFsKGlucHV0X2l0ZXJhdG9yX1swXSwgJ2UnKSkgeworICAgIGludCBleHBvbmVudF9wcmVmaXgoMSk7CisgICAgaWYgKGlucHV0X2l0ZXJhdG9yX1sxXSA9PSAnLScpIGV4cG9uZW50X3NpZ24gPSAtMTsKKyAgICBpZiAoaW5wdXRfaXRlcmF0b3JfWzFdID09ICctJyB8fCBpbnB1dF9pdGVyYXRvcl9bMV0gPT0gJysnKSB7CisgICAgICArK2V4cG9uZW50X3ByZWZpeDsKICAgICB9Ci0gICAgaWYgKElzQXNjaWlEaWdpdChpbnB1dF9pdGVyYXRvcl9bMV0pKSB7Ci0gICAgICBleHBvbmVudF9wcmVmaXggPSAyOwotICAgIH0KLSAgICBpZiAoZXhwb25lbnRfcHJlZml4ID4gMCkgeworICAgIGlmIChJc0FzY2lpRGlnaXQoaW5wdXRfaXRlcmF0b3JfW2V4cG9uZW50X3ByZWZpeF0pKSB7CiAgICAgICBpc19zY2llbnRpZmljID0gdHJ1ZTsKICAgICAgIGlucHV0X2l0ZXJhdG9yXyA9IGlucHV0X2l0ZXJhdG9yXyArIGV4cG9uZW50X3ByZWZpeDsKICAgICB9CiAgICAgd2hpbGUgKElzQXNjaWlEaWdpdChpbnB1dF9pdGVyYXRvcl9bMF0pKSB7CisgICAgICBleHBvbmVudF9wYXJ0ID0gKGV4cG9uZW50X3BhcnQgKiAxMCkgKyAoaW5wdXRfaXRlcmF0b3JfWzBdIC0gJzAnKTsKICAgICAgICsraW5wdXRfaXRlcmF0b3JfOwogICAgIH0KICAgfQogCiAgIG51bWJlci5lbmQgPSBpbnB1dF9pdGVyYXRvcl87Ci0gIGNoYXIqIG51bWJlcl9lbmQoY29uc3RfY2FzdDxjaGFyKj4obnVtYmVyLmVuZCkpOwotICAvLyBXZSBwYXJzZSBpbnRvIHxkb3VibGV8IGZvciB0d28gcmVhc29uczoKLSAgLy8gICAtIEMrKzAzIGRvZXNuJ3QgaGF2ZSBzdGQ6OnN0cnRvZigpIGZ1bmN0aW9uOwotICAvLyAgIC0gfGZsb2F0fCdzIHNpZ25pZmljYW5kIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gcmVwcmVzZW50IHxpbnR8IHByZWNpc2VseS4KLSAgLy8gfG51bWJlcl9lbmR8IGlzIHVzZWQgYnkgc3RkOjpzdHJ0b2QoKSBhcyBhIHB1cmUgb3V0cHV0IHBhcmFtZXRlciAtIGl0J3MKLSAgLy8gaW5wdXQgdmFsdWUgaXMgbm90IHVzZWQuIHN0ZDo6c3RydG9kKCkgbWF5IHBhcnNlIG1vcmUgb2YgdGhlIG51bWJlciB0aGFuCi0gIC8vIHdlIGV4cGVjdCwgZS5nLiBpbiB0aGUgY2FzZSBvZiBoZXhhZGVjaW1hbCBmb3JtYXQuIEluIHRoZXNlIGNhc2VzCi0gIC8vIChudW1iZXJfZW5kICE9IG51bWJlci5lbmQpLCByZXR1cm4gYW4gaW52YWxpZCBudW1iZXIgdG9rZW4uCi0gIGRvdWJsZSByZWFsX2FzX2RvdWJsZShzdHJ0b2QobnVtYmVyLmJlZ2luLCAmbnVtYmVyX2VuZCkpOwotICBpZiAobnVtYmVyX2VuZCAhPSBudW1iZXIuZW5kIHx8Ci0gICAgICByZWFsX2FzX2RvdWJsZSAhPSByZWFsX2FzX2RvdWJsZSB8fCAgLy8gbiAhPSBuIGlmIGFuZCBvbmx5IGlmIGl0J3MgTmFOLgotICAgICAgcmVhbF9hc19kb3VibGUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkgfHwKLSAgICAgIHJlYWxfYXNfZG91YmxlID4gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpKSB7CisKKyAgLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIGZyb20gaXRzIHBhcnRzIGNvbGxlY3RlZCBhYm92ZSBhY2NvcmRpbmcgdG86CisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2NvbnZlcnQtYS1zdHJpbmctdG8tYS1udW1iZXIKKyAgLy8gV2UgcGFyc2UgaW50byB8ZG91YmxlfCBiZWNhdXNlIHxmbG9hdHwncyBzaWduaWZpY2FuZCBpcyBub3QgbGFyZ2UgZW5vdWdoCisgIC8vIHRvIHJlcHJlc2VudCB8aW50fCBwcmVjaXNlbHkuCisgIGRvdWJsZSByZWFsX2FzX2RvdWJsZSA9CisgICAgICBpbnRlZ2VyX3BhcnQgKyBmcmFjdGlvbmFsX3BhcnQgKiBwb3coMTAsIC1mcmFjdGlvbmFsX2RpZ2l0cyk7CisgIGlmIChpc19zY2llbnRpZmljKSByZWFsX2FzX2RvdWJsZSAqPSBwb3coMTAsIGV4cG9uZW50X3NpZ24gKiBleHBvbmVudF9wYXJ0KTsKKworICBpZiAocmVhbF9hc19kb3VibGUgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCkpIHsKICAgICB0b2tlbl92YWx1ZS0+c3RyaW5nLmJlZ2luID0gbnVtYmVyLmJlZ2luOwogICAgIHRva2VuX3ZhbHVlLT5zdHJpbmcuZW5kID0gbnVtYmVyLmVuZDsKICAgICByZXR1cm4ga0ludmFsaWROdW1iZXJUb2tlbjsKQEAgLTIxMzQsNiArMjEzOSwxMCBAQAogICAgICAgICAqcHJvcGVydHlfdmFsdWVfdG9rZW4gPSBrUmVwZWF0VG9rZW47CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQorICAgICAgaWYgKElzRXF1YWxUb0Nzc0lkZW50aWZpZXIobmFtZS5iZWdpbiwgY3Nzb206OmtTY3JvbGxLZXl3b3JkTmFtZSkpIHsKKyAgICAgICAgKnByb3BlcnR5X3ZhbHVlX3Rva2VuID0ga1Njcm9sbFRva2VuOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KICAgICAgIGlmIChJc0VxdWFsVG9Dc3NJZGVudGlmaWVyKG5hbWUuYmVnaW4sIGNzc29tOjprU2lsdmVyS2V5d29yZE5hbWUpKSB7CiAgICAgICAgICpwcm9wZXJ0eV92YWx1ZV90b2tlbiA9IGtTaWx2ZXJUb2tlbjsKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc2Nhbm5lcl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXJfdGVzdC5jYwppbmRleCA1MDg5YzcxLi43ODc5MjU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc2Nhbm5lcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyX3Rlc3QuY2MKQEAgLTE0LDYgKzE0LDggQEAKIAogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuaCIKIAorI2luY2x1ZGUgPGxvY2FsZS5oPgorCiAjaW5jbHVkZSAiY29iYWx0L2Nzc19wYXJzZXIvZ3JhbW1hci5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL3N0cmluZ19wb29sLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCkBAIC0yNCwxMyArMjYsNTggQEAKIC8vIFdoZW4gd2Ugc3VwcG9ydCBhbnkgb2YgdGhlIGF0IHJ1bGUgd2hpY2ggYWxyZWFkeSBoYXMgYSBESVNBQkxFRCB0ZXN0IGxpc3RlZAogLy8gYmVsb3csIHRoaXMgRElTQUJMRUQgdGVzdCBzaG91bGQgYmUgZW5hYmxlZC4KIAotY2xhc3MgU2Nhbm5lclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK2NvbnN0IGNoYXIqIGtOdW1lcmljTG9jYWxlc1tdID0geworICAiIiwgICAgICAgLy8gZGVmYXVsdCBsb2NhbGUKKyAgIkMiLCAgICAgIC8vIGRvdCByYWRpeCBzZXBhcmF0b3IKKyAgImRlX0RFIiwgIC8vIGNvbW1hIHJhZGl4IHNlcGFyYXRvcgorfTsKKworY2xhc3MgU2Nhbm5lclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0LAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Y29uc3QgY2hhcio+IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBEb24ndCBtZXNzIHdpdGggdGhlIGxvY2FsZSBmb3Igbm9uLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgaWYgKCF0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKS0+dmFsdWVfcGFyYW0oKSkgeworICAgICAgb2xkX2xvY2FsZV8uY2xlYXIoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTYXZlIHRoZSBvbGQgbG9jYWxlLgorICAgIGNoYXIqIG9sZF9sb2NhbGVfY3N0ciA9IHNldGxvY2FsZShMQ19OVU1FUklDLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfVFJVRShvbGRfbG9jYWxlX2NzdHIgIT0gbnVsbHB0cikgPDwgIkNhbnQnIHNhdmUgb3JpZ2luYWwgbG9jYWxlIjsKKyAgICBvbGRfbG9jYWxlXyA9IG9sZF9sb2NhbGVfY3N0cjsKKworICAgIC8vIEtlZXAgdGhlIGRlZmF1bHQgbG9jYWxlIHdoZW4gdGhlIHBhcmFtIGlzIGVtcHR5LCBhbmQgZm9yIG90aGVyIHBhcmFtCisgICAgLy8gdmFsdWVzIHdlJ2xsIHNraXAgdGhlIHRlc3QgaWYgd2UgY2FuJ3QgY2hhbmdlIHRoZSBsb2NhbGUgdG8gaXQuCisgICAgbG9jYWxlX29rYXlfID0KKyAgICAgICAgKEdldFBhcmFtKClbMF0gPT0gMCB8fCBzZXRsb2NhbGUoTENfTlVNRVJJQywgR2V0UGFyYW0oKSkgIT0gbnVsbHB0cik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgaWYgKCFvbGRfbG9jYWxlXy5lbXB0eSgpKSBzZXRsb2NhbGUoTENfTlVNRVJJQywgb2xkX2xvY2FsZV8uY19zdHIoKSk7CisgIH0KKworICAvLyBUT0RPOiBVc2UgR1RFU1RfU0tJUCBpbiB8U2V0VXB8IHdoZW4gd2UgaGF2ZSBhIG5ld2VyIHZlcnNpb24gb2YgZ3Rlc3QuCisgIGJvb2wgU2tpcExvY2FsZSgpIHsKKyAgICBpZiAoIWxvY2FsZV9va2F5XykgeworICAgICAgc3RkOjpjb3V0IDw8ICJbICBTS0lQUEVEIF0gQ2FuJ3Qgc2V0IGxvY2FsZSB0byAiIDw8IEdldFBhcmFtKCkKKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHJldHVybiAhbG9jYWxlX29rYXlfOworICB9CisKICBwcm90ZWN0ZWQ6CisgIHN0ZDo6c3RyaW5nIG9sZF9sb2NhbGVfOworICBib29sIGxvY2FsZV9va2F5XzsKKwogICBTdHJpbmdQb29sIHN0cmluZ19wb29sXzsKICAgVG9rZW5WYWx1ZSB0b2tlbl92YWx1ZV87CiAgIFlZTFRZUEUgdG9rZW5fbG9jYXRpb25fOwogfTsKIAorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTG9jYWxlTnVtZXJpYywgU2Nhbm5lclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGtOdW1lcmljTG9jYWxlcykpOworCiBURVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zU2luZ2xlQ29kZVBvaW50VW5pY29kZVJhbmdlKSB7CiAgIFNjYW5uZXIgc2Nhbm5lcigidSsxZjRhOSBVKzFGNEE5IiwgJnN0cmluZ19wb29sXyk7CiAKQEAgLTMxNyw3ICszNjQsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zUGVyY2VudGFnZSkgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc1BlcmNlbnRhZ2UpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkgcmV0dXJuOwogICBTY2FubmVyIHNjYW5uZXIoIjIuNzE4MjglIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtQZXJjZW50YWdlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0zMzUsNyArMzgzLDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc1JlYWwpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNSZWFsKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCIyLjcxODI4IiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtSZWFsVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0zNDQsNyArMzkzLDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc05lZ2F0aXZlUmVhbCkgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc05lZ2F0aXZlUmVhbCkgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiLTMuMTQxNTkiLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoJy0nLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwpAQCAtMzkwLDcgKzQ0MCw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNTY2llbnRpZmljTm90YXRpb25OdW1iZXJXaXRoUG9zaXRpdmVFeHBvbmVudCkgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc1NjaWVudGlmaWNOb3RhdGlvbk51bWJlcldpdGhQb3NpdGl2ZUV4cG9uZW50KSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCIyLjVlKzYiLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa1JlYWxUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKQEAgLTQwOCwyOSArNDU5LDI4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKK1RFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNTY2llbnRpZmljTm90YXRpb25OdW1iZXJXaXRoU2NpZW50aWZpY0V4cG9uZW50KSB7CisgIC8vIFRoaXMgc2hvdWxkIGJlIHBhcnNlZCBhcyB0aGUgbnVtYmVyICIzMDAwMCIgYW5kIGludmFsaWQgZGltZW5zaW9uICJlNSIsCisgIC8vIG5vdCAzKjEwXjQwMDAwMCBub3IgMzAwMDAqMTBeNS4KKyAgU2Nhbm5lciBzY2FubmVyKCIzZTRlNSIsICZzdHJpbmdfcG9vbF8pOworCisgIEFTU0VSVF9FUShrSW52YWxpZERpbWVuc2lvblRva2VuLAorICAgICAgICAgICAgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKKyAgQVNTRVJUX0VRKCIzZTRlNSIsIHRva2VuX3ZhbHVlXy5zdHJpbmcpOworCisgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7Cit9CisKIFRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNIZXhhZGVjaW1hbE51bWJlcikgewogICAvLyBXZSBkb24ndCBzdXBwb3J0IHNjYW5uaW5nIG9mIGhleGFkZWNpbWFsIG51bWJlcnMuIFRoaXMgdGVzdCBpcyBqdXN0IHRvCiAgIC8vIGNvbmZpcm0gdGhhdCB3ZSByZWNvdmVyIHdpdGhvdXQgY3Jhc2hpbmcuCiAgIFNjYW5uZXIgc2Nhbm5lcigiMHgwIiwgJnN0cmluZ19wb29sXyk7CiAKLSNpZiBkZWZpbmVkKENPQkFMVF9XSU4pICYmIF9NU0NfVkVSIDwgMTkwMAotICAvLyBPbiBXaW5kb3dzLCB3aXRoIGEgTVNWUyB2ZXJzaW9uIHByaW9yIHRvIFZTMjAxNSwgdGhlIGJlaGF2aW9yIG9mCi0gIC8vIHxzdGQ6OnN0cnRvZHwgdXNlZCB0byBzY2FuIGEgbnVtYmVyIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgc3RhbmRhcmQsIHNvCi0gIC8vIHdlIGdldCBhIGRpZmZlcmVudCByZXN1bHQgb24gdGhhdCBwbGF0Zm9ybS4KKyAgLy8gIngwIiBpcyBhbiBpbnZhbGlkIGRpbWVuc2lvbi4KICAgQVNTRVJUX0VRKGtJbnZhbGlkRGltZW5zaW9uVG9rZW4sCiAgICAgICAgICAgICB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogICBBU1NFUlRfRVEoIjB4MCIsIHRva2VuX3ZhbHVlXy5zdHJpbmcpOwogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwotI2Vsc2UKLSAgQVNTRVJUX0VRKGtJbnZhbGlkTnVtYmVyVG9rZW4sCi0gICAgICAgICAgICB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwotICBBU1NFUlRfRVEoIjAiLCB0b2tlbl92YWx1ZV8uc3RyaW5nKTsKLQotICBBU1NFUlRfRVEoa0lkZW50aWZpZXJUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKLSAgQVNTRVJUX0VRKCJ4MCIsIHRva2VuX3ZhbHVlXy5zdHJpbmcpOwotCi0gIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7Ci0jZW5kaWYKIH0KIAogVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc1Vua25vd25EYXNoRnVuY3Rpb24pIHsKQEAgLTExMTMsNyArMTE2Myw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNDZW50aW1ldGVycykgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc0NlbnRpbWV0ZXJzKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0Y20iLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa0NlbnRpbWV0ZXJzVG9rZW4sCkBAIC0xMTIzLDcgKzExNzQsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zWmVyb0dseXBoV2lkdGhzQWthQ2gpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNaZXJvR2x5cGhXaWR0aHNBa2FDaCkgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNGNoIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtaZXJvR2x5cGhXaWR0aHNBa2FDaFRva2VuLApAQCAtMTEzMyw3ICsxMTg1LDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc0RlZ3JlZXMpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNEZWdyZWVzKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0ZGVnIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtEZWdyZWVzVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0xMTQyLDcgKzExOTUsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zRG90c1BlclBpeGVsKSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5zRG90c1BlclBpeGVsKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0ZHBweCIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrRG90c1BlclBpeGVsVG9rZW4sCkBAIC0xMTUyLDcgKzEyMDYsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zRG90c1BlckNlbnRpbWV0ZXIpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNEb3RzUGVyQ2VudGltZXRlcikgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNGRwY20iLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa0RvdHNQZXJDZW50aW1ldGVyVG9rZW4sCkBAIC0xMTYyLDcgKzEyMTcsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zRG90c1BlckluY2gpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNEb3RzUGVySW5jaCkgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNGRwaSIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrRG90c1BlckluY2hUb2tlbiwKQEAgLTExNzIsNyArMTIyOCw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNGb250U2l6ZXNBa2FFbSkgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc0ZvbnRTaXplc0FrYUVtKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0ZW0iLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa0ZvbnRTaXplc0FrYUVtVG9rZW4sCkBAIC0xMTgyLDcgKzEyMzksOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zWEhlaWdodHNBa2FFeCkgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc1hIZWlnaHRzQWthRXgpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkgcmV0dXJuOwogICBTY2FubmVyIHNjYW5uZXIoIjguMjRleCIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrWEhlaWdodHNBa2FFeFRva2VuLApAQCAtMTE5Miw3ICsxMjUwLDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc0ZyYWN0aW9ucykgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc0ZyYWN0aW9ucykgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNGZyIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtGcmFjdGlvbnNUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKQEAgLTEyMDEsNyArMTI2MCw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNHcmFkaWFucykgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc0dyYWRpYW5zKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0Z3JhZCIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrR3JhZGlhbnNUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKQEAgLTEyMTAsNyArMTI3MCw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNIZXJ0eikgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc0hlcnR6KSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0aHoiLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa0hlcnR6VG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0xMjE5LDcgKzEyODAsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zSW5jaGVzKSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5zSW5jaGVzKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0aW4iLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa0luY2hlc1Rva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwpAQCAtMTIyOCw3ICsxMjkwLDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc0tpbG9oZXJ0eikgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc0tpbG9oZXJ0eikgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNGtoeiIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrS2lsb2hlcnR6VG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0xMjM3LDcgKzEzMDAsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zTWlsbGltZXRlcnMpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNNaWxsaW1ldGVycykgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNG1tIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtNaWxsaW1ldGVyc1Rva2VuLApAQCAtMTI0Nyw3ICsxMzExLDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc01pbGxpc2Vjb25kcykgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc01pbGxpc2Vjb25kcykgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNG1zIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtNaWxsaXNlY29uZHNUb2tlbiwKQEAgLTEyNTcsNyArMTMyMiw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNQaXhlbHMpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNQaXhlbHMpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkgcmV0dXJuOwogICBTY2FubmVyIHNjYW5uZXIoIjguMjRweCIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrUGl4ZWxzVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0xMjY2LDcgKzEzMzIsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zUG9pbnRzKSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5zUG9pbnRzKSB7CisgIGlmIChTa2lwTG9jYWxlKCkpIHJldHVybjsKICAgU2Nhbm5lciBzY2FubmVyKCI4LjI0cHQiLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa1BvaW50c1Rva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwpAQCAtMTI3NSw3ICsxMzQyLDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc1BpY2FzKSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5zUGljYXMpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkgcmV0dXJuOwogICBTY2FubmVyIHNjYW5uZXIoIjguMjRwYyIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrUGljYXNUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKQEAgLTEyODQsNyArMTM1Miw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNSYWRpYW5zKSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5zUmFkaWFucykgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNHJhZCIsICZzdHJpbmdfcG9vbF8pOwogCiAgIEFTU0VSVF9FUShrUmFkaWFuc1Rva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwpAQCAtMTI5Myw3ICsxMzYyLDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc1Jvb3RFbGVtZW50Rm9udFNpemVzQWthUmVtKSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5zUm9vdEVsZW1lbnRGb250U2l6ZXNBa2FSZW0pIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkgcmV0dXJuOwogICBTY2FubmVyIHNjYW5uZXIoIjguMjRyZW0iLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa1Jvb3RFbGVtZW50Rm9udFNpemVzQWthUmVtVG9rZW4sCkBAIC0xMzAzLDcgKzEzNzMsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zU2Vjb25kcykgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc1NlY29uZHMpIHsKKyAgaWYgKFNraXBMb2NhbGUoKSkgcmV0dXJuOwogICBTY2FubmVyIHNjYW5uZXIoIjguMjRzIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtTZWNvbmRzVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0xMzEyLDcgKzEzODMsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zVHVybnMpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNUdXJucykgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNHR1cm4iLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa1R1cm5zVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CkBAIC0xMzIxLDcgKzEzOTMsOCBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCi1URVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zVmlld3BvcnRXaWR0aFBlcmNlbnRzQWthVncpIHsKK1RFU1RfUChTY2FubmVyVGVzdCwgU2NhbnNWaWV3cG9ydFdpZHRoUGVyY2VudHNBa2FWdykgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNHZ3IiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtWaWV3cG9ydFdpZHRoUGVyY2VudHNBa2FWd1Rva2VuLApAQCAtMTMzMSw3ICsxNDA0LDggQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAotVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc1ZpZXdwb3J0SGVpZ2h0UGVyY2VudHNBa2FWaCkgeworVEVTVF9QKFNjYW5uZXJUZXN0LCBTY2Fuc1ZpZXdwb3J0SGVpZ2h0UGVyY2VudHNBa2FWaCkgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNHZoIiwgJnN0cmluZ19wb29sXyk7CiAKICAgQVNTRVJUX0VRKGtWaWV3cG9ydEhlaWdodFBlcmNlbnRzQWthVmhUb2tlbiwKQEAgLTEzNDEsNyArMTQxNSw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNWaWV3cG9ydFNtYWxsZXJTaXplUGVyY2VudHNBa2FWbWluKSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5zVmlld3BvcnRTbWFsbGVyU2l6ZVBlcmNlbnRzQWthVm1pbikgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNHZtaW4iLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa1ZpZXdwb3J0U21hbGxlclNpemVQZXJjZW50c0FrYVZtaW5Ub2tlbiwKQEAgLTEzNTEsNyArMTQyNiw4IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKLVRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNrVmlld3BvcnRMYXJnZXJTaXplUGVyY2VudHNBa2FWbWF4KSB7CitURVNUX1AoU2Nhbm5lclRlc3QsIFNjYW5za1ZpZXdwb3J0TGFyZ2VyU2l6ZVBlcmNlbnRzQWthVm1heCkgeworICBpZiAoU2tpcExvY2FsZSgpKSByZXR1cm47CiAgIFNjYW5uZXIgc2Nhbm5lcigiOC4yNHZtYXgiLCAmc3RyaW5nX3Bvb2xfKTsKIAogICBBU1NFUlRfRVEoa1ZpZXdwb3J0TGFyZ2VyU2l6ZVBlcmNlbnRzQWthVm1heFRva2VuLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jb21wb3VuZF9zZWxlY3Rvci5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY29tcG91bmRfc2VsZWN0b3IuY2MKaW5kZXggZmIwNjdmYy4uZWI0NDFkZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jb21wb3VuZF9zZWxlY3Rvci5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXBvdW5kX3NlbGVjdG9yLmNjCkBAIC0zMSwxMiArMzEsNiBAQAogICBpZiAocmhzLT50eXBlKCkgPCBsaHMtPnR5cGUoKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBpZiAobGhzLT5wcmVmaXgoKSA8IHJocy0+cHJlZml4KCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAocmhzLT5wcmVmaXgoKSA8IGxocy0+cHJlZml4KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KICAgaWYgKGxocy0+dGV4dCgpIDwgcmhzLT50ZXh0KCkpIHsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtMTIxLDE0ICsxMTUsMTIgQEAKICAgICAgICFzaW1wbGVfc2VsZWN0b3JzXy5lbXB0eSgpIHx8CiAgICAgICBzaW1wbGVfc2VsZWN0b3ItPkFsd2F5c1JlcXVpcmVzUnVsZU1hdGNoaW5nVmVyaWZpY2F0aW9uVmlzaXQoKTsKIAotICBib29sIHNob3VsZF9zb3J0ID0KLSAgICAgICFzaW1wbGVfc2VsZWN0b3JzXy5lbXB0eSgpICYmCi0gICAgICBTaW1wbGVTZWxlY3RvcnNMZXNzVGhhbihzaW1wbGVfc2VsZWN0b3IuZ2V0KCksIHNpbXBsZV9zZWxlY3RvcnNfLmJhY2soKSk7Ci0gIHNpbXBsZV9zZWxlY3RvcnNfLnB1c2hfYmFjayhzaW1wbGVfc2VsZWN0b3IucmVsZWFzZSgpKTsKLSAgaWYgKHNob3VsZF9zb3J0KSB7Ci0gICAgc3RkOjpzb3J0KHNpbXBsZV9zZWxlY3RvcnNfLmJlZ2luKCksIHNpbXBsZV9zZWxlY3RvcnNfLmVuZCgpLAotICAgICAgICAgICAgICBTaW1wbGVTZWxlY3RvcnNMZXNzVGhhbik7Ci0gIH0KKyAgLy8gSW5zZXJ0IHRoZSBuZXcgc2VsZWN0b3IgaW4gc29ydGVkIG9yZGVyLgorICBTaW1wbGVTZWxlY3RvciogbmV3X3NlbGVjdG9yID0gc2ltcGxlX3NlbGVjdG9yLnJlbGVhc2UoKTsKKyAgYXV0byBwb3MgPQorICAgICAgc3RkOjpsb3dlcl9ib3VuZChzaW1wbGVfc2VsZWN0b3JzXy5iZWdpbigpLCBzaW1wbGVfc2VsZWN0b3JzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NlbGVjdG9yLCBTaW1wbGVTZWxlY3RvcnNMZXNzVGhhbik7CisgIHNpbXBsZV9zZWxlY3RvcnNfLmluc2VydChwb3MsIG5ld19zZWxlY3Rvcik7CiB9CiAKIHZvaWQgQ29tcG91bmRTZWxlY3Rvcjo6c2V0X3JpZ2h0X2NvbWJpbmF0b3Ioc2NvcGVkX3B0cjxDb21iaW5hdG9yPiBjb21iaW5hdG9yKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2NvbXB1dGVkX3N0eWxlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wdXRlZF9zdHlsZS5jYwppbmRleCAxOGY1MWU5Li43YmIzMGZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2NvbXB1dGVkX3N0eWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGUuY2MKQEAgLTM3Myw2ICszNzMsNyBAQAogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmV2ZXJzZToKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JpZ2h0OgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmOgorICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Nyb2xsOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2VyaWY6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1N0YXJ0OgpAQCAtNDcyLDYgKzQ3Myw3IEBACiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTY3JvbGw6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU3RhcnQ6CkBAIC01NzgsNiArNTgwLDcgQEAKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JldmVyc2U6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSaWdodDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NhbnNTZXJpZjoKKyAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NlcmlmOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU29saWQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTdGFydDoKQEAgLTcwNyw2ICs3MTAsNyBAQAogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmV2ZXJzZToKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JpZ2h0OgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmOgorICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Nyb2xsOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2VyaWY6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1N0YXJ0OgpAQCAtODMxLDYgKzgzNSw3IEBACiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTY3JvbGw6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU3RhcnQ6CkBAIC05NTMsNiArOTU4LDcgQEAKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JldmVyc2U6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSaWdodDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NhbnNTZXJpZjoKKyAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NlcmlmOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU29saWQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTdGFydDoKQEAgLTEwNjksNiArMTA3NSw3IEBACiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTY3JvbGw6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU3RhcnQ6CkBAIC0xMTc5LDYgKzExODYsNyBAQAogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmV2ZXJzZToKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JpZ2h0OgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmOgorICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Nyb2xsOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2VyaWY6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1N0YXJ0OgpAQCAtMTU5MCw2ICsxNTk4LDcgQEAKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JldmVyc2U6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSaWdodDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NhbnNTZXJpZjoKKyAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NlcmlmOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU29saWQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTdGFydDoKQEAgLTE4NjcsNiArMTg3Niw3IEBACiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTY3JvbGw6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU3RhcnQ6CkBAIC0yMTE2LDYgKzIxMjYsNyBAQAogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprUmV2ZXJzZToKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JpZ2h0OgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmOgorICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2Nyb2xsOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU2VyaWY6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1N0YXJ0OgpAQCAtMjUwMCw2ICsyNTExLDcgQEAKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1JldmVyc2U6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtSaWdodDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NhbnNTZXJpZjoKKyAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIEtleXdvcmRWYWx1ZTo6a1NlcmlmOgogICAgIGNhc2UgS2V5d29yZFZhbHVlOjprU29saWQ6CiAgICAgY2FzZSBLZXl3b3JkVmFsdWU6OmtTdGFydDoKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9ydWxlLmNjCmluZGV4IDllOTcyNTMuLjQ1N2UzYjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5jYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfcnVsZV9zdHlsZV9kZWNsYXJhdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfcnVsZV92aXNpdG9yLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9zaGVldC5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9zZXJpYWxpemVyLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGNzc29tIHsKQEAgLTMzLDYgKzM0LDEzIEBACiAgIH0KIH0KIAorc3RkOjpzdHJpbmcgQ1NTU3R5bGVSdWxlOjpzZWxlY3Rvcl90ZXh0KCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIFNlcmlhbGl6ZXIgc2VyaWFsaXplcigmb3V0cHV0KTsKKyAgc2VyaWFsaXplci5TZXJpYWxpemVTZWxlY3RvcnMoc2VsZWN0b3JzXyk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKIGNvbnN0IHNjb3BlZF9yZWZwdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gQ1NTU3R5bGVSdWxlOjpzdHlsZSgpIGNvbnN0IHsKICAgcmV0dXJuIHN0eWxlXzsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaAppbmRleCBkODJlNGU1Li5jNGI0Mzc5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9ydWxlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5oCkBAIC00NSw2ICs0NSw3IEBACiAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPENTU1J1bGVTdHlsZURlY2xhcmF0aW9uPiYgc3R5bGUpOwogCiAgIC8vIFdlYiBBUEk6IENTU1N0eWxlUnVsZQorICBzdGQ6OnN0cmluZyBzZWxlY3Rvcl90ZXh0KCkgY29uc3Q7CiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gc3R5bGUoKSBjb25zdDsKIAogICAvLyBXZWIgQVBJOiBDU1NSdWxlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9ydWxlLmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaWRsCmluZGV4IDk5Zjc1ZDguLmYzOWE0NWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaWRsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaWRsCkBAIC0xNSw1ICsxNSw2IEBACiAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLWNzc3N0eWxlcnVsZS1pbnRlcmZhY2UKIAogaW50ZXJmYWNlIENTU1N0eWxlUnVsZSA6IENTU1J1bGUgeworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNlbGVjdG9yVGV4dDsgIC8vIFRPRE86IHJlbW92ZSByZWFkb25seQogICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIENTU1N0eWxlRGVjbGFyYXRpb24gc3R5bGU7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbS5neXAgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc29tLmd5cAppbmRleCA4ZTUyN2IzLi4zNmY3OGYzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc29tLmd5cAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc29tLmd5cApAQCAtMTk4LDYgKzE5OCw4IEBACiAgICAgICAgICdzaW1wbGVfc2VsZWN0b3IuaCcsCiAgICAgICAgICdzcGVjaWZpY2l0eS5jYycsCiAgICAgICAgICdzcGVjaWZpY2l0eS5oJywKKyAgICAgICAgJ3NlcmlhbGl6ZXIuY2MnLAorICAgICAgICAnc2VyaWFsaXplci5oJywKICAgICAgICAgJ3N0cmluZ192YWx1ZS5jYycsCiAgICAgICAgICdzdHJpbmdfdmFsdWUuaCcsCiAgICAgICAgICdzdHlsZV9zaGVldC5jYycsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc29tX3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbV90ZXN0Lmd5cAppbmRleCBkMDZjNGQwLi5kMDhmM2Q4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc29tX3Rlc3QuZ3lwCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3Nzb21fdGVzdC5neXAKQEAgLTQ4LDEyICs0OCwxNCBAQAogICAgICAgICAnc2VsZWN0b3JfdGVzdC5jYycsCiAgICAgICAgICdzZWxlY3Rvcl90cmVlX3Rlc3QuY2MnLAogICAgICAgICAnc2VsZWN0b3JfdmlzaXRvcl90ZXN0LmNjJywKKyAgICAgICAgJ3NlcmlhbGl6ZXJfdGVzdC5jYycsCiAgICAgICAgICdzcGVjaWZpY2l0eV90ZXN0LmNjJywKICAgICAgICAgJ3N0eWxlX3NoZWV0X2xpc3RfdGVzdC5jYycsCiAgICAgICAgICd0aW1pbmdfZnVuY3Rpb25fdGVzdC5jYycsCiAgICAgICAgICd0cmFuc2Zvcm1fZnVuY3Rpb25fdmlzaXRvcl90ZXN0LmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvY3NzX3BhcnNlci9jc3NfcGFyc2VyLmd5cDpjc3NfcGFyc2VyJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9jc3NvbS9jc3NvbS5neXA6Y3Nzb20nLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmNjCmluZGV4IDdhMmMxOTkuLmQyMmEzMGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF9uYW1lcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfbmFtZXMuY2MKQEAgLTk0LDYgKzk0LDcgQEAKIGNvbnN0IGNoYXIga1JldmVyc2VLZXl3b3JkTmFtZVtdID0gInJldmVyc2UiOwogY29uc3QgY2hhciBrUmlnaHRLZXl3b3JkTmFtZVtdID0gInJpZ2h0IjsKIGNvbnN0IGNoYXIga1NhbnNTZXJpZktleXdvcmROYW1lW10gPSAic2Fucy1zZXJpZiI7Citjb25zdCBjaGFyIGtTY3JvbGxLZXl3b3JkTmFtZVtdID0gInNjcm9sbCI7CiBjb25zdCBjaGFyIGtTZXJpZktleXdvcmROYW1lW10gPSAic2VyaWYiOwogY29uc3QgY2hhciBrU2lsdmVyS2V5d29yZE5hbWVbXSA9ICJzaWx2ZXIiOwogY29uc3QgY2hhciBrU29saWRLZXl3b3JkTmFtZVtdID0gInNvbGlkIjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF9uYW1lcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmgKaW5kZXggZmU3NTFkMS4uMzkwZDJjNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmgKQEAgLTk2LDYgKzk2LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyIGtSZXZlcnNlS2V5d29yZE5hbWVbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtSaWdodEtleXdvcmROYW1lW107CiBleHRlcm4gY29uc3QgY2hhciBrU2Fuc1NlcmlmS2V5d29yZE5hbWVbXTsKK2V4dGVybiBjb25zdCBjaGFyIGtTY3JvbGxLZXl3b3JkTmFtZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga1NlcmlmS2V5d29yZE5hbWVbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtTaWx2ZXJLZXl3b3JkTmFtZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga1NvbGlkS2V5d29yZE5hbWVbXTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5jYwppbmRleCAxOTg3M2RiLi5hMmFkZmY5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmNjCkBAIC02OSw2ICs2OSw3IEBACiAgICAgICAgIHJldmVyc2VfdmFsdWUobmV3IEtleXdvcmRWYWx1ZShLZXl3b3JkVmFsdWU6OmtSZXZlcnNlKSksCiAgICAgICAgIHJpZ2h0X3ZhbHVlKG5ldyBLZXl3b3JkVmFsdWUoS2V5d29yZFZhbHVlOjprUmlnaHQpKSwKICAgICAgICAgc2Fuc19zZXJpZl92YWx1ZShuZXcgS2V5d29yZFZhbHVlKEtleXdvcmRWYWx1ZTo6a1NhbnNTZXJpZikpLAorICAgICAgICBzY3JvbGxfdmFsdWUobmV3IEtleXdvcmRWYWx1ZShLZXl3b3JkVmFsdWU6OmtTY3JvbGwpKSwKICAgICAgICAgc2VyaWZfdmFsdWUobmV3IEtleXdvcmRWYWx1ZShLZXl3b3JkVmFsdWU6OmtTZXJpZikpLAogICAgICAgICBzb2xpZF92YWx1ZShuZXcgS2V5d29yZFZhbHVlKEtleXdvcmRWYWx1ZTo6a1NvbGlkKSksCiAgICAgICAgIHN0YXJ0X3ZhbHVlKG5ldyBLZXl3b3JkVmFsdWUoS2V5d29yZFZhbHVlOjprU3RhcnQpKSwKQEAgLTEyNiw2ICsxMjcsNyBAQAogICBjb25zdCBzY29wZWRfcmVmcHRyPEtleXdvcmRWYWx1ZT4gcmV2ZXJzZV92YWx1ZTsKICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+IHJpZ2h0X3ZhbHVlOwogICBjb25zdCBzY29wZWRfcmVmcHRyPEtleXdvcmRWYWx1ZT4gc2Fuc19zZXJpZl92YWx1ZTsKKyAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+IHNjcm9sbF92YWx1ZTsKICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+IHNlcmlmX3ZhbHVlOwogICBjb25zdCBzY29wZWRfcmVmcHRyPEtleXdvcmRWYWx1ZT4gc29saWRfdmFsdWU7CiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8S2V5d29yZFZhbHVlPiBzdGFydF92YWx1ZTsKQEAgLTMyNyw2ICszMjksMTAgQEAKICAgcmV0dXJuIG5vbl90cml2aWFsX3N0YXRpY19maWVsZHMuR2V0KCkuc2Fuc19zZXJpZl92YWx1ZTsKIH0KIAorY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+JiBLZXl3b3JkVmFsdWU6OkdldFNjcm9sbCgpIHsKKyAgcmV0dXJuIG5vbl90cml2aWFsX3N0YXRpY19maWVsZHMuR2V0KCkuc2Nyb2xsX3ZhbHVlOworfQorCiBjb25zdCBzY29wZWRfcmVmcHRyPEtleXdvcmRWYWx1ZT4mIEtleXdvcmRWYWx1ZTo6R2V0U2VyaWYoKSB7CiAgIHJldHVybiBub25fdHJpdmlhbF9zdGF0aWNfZmllbGRzLkdldCgpLnNlcmlmX3ZhbHVlOwogfQpAQCAtNDU3LDYgKzQ2Myw4IEBACiAgICAgICByZXR1cm4ga1JldmVyc2VLZXl3b3JkTmFtZTsKICAgICBjYXNlIGtSaWdodDoKICAgICAgIHJldHVybiBrUmlnaHRLZXl3b3JkTmFtZTsKKyAgICBjYXNlIGtTY3JvbGw6CisgICAgICByZXR1cm4ga1Njcm9sbEtleXdvcmROYW1lOwogICAgIGNhc2Uga1NhbnNTZXJpZjoKICAgICAgIHJldHVybiBrU2Fuc1NlcmlmS2V5d29yZE5hbWU7CiAgICAgY2FzZSBrU2VyaWY6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oCmluZGV4IDYyYzVlMDAuLjhmZTdjNWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oCkBAIC00OSw2ICs0OSwxMCBAQAogICAgIC8vIHByb3BlcnRpZXMuCiAgICAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvdmlzdWRldC5odG1sI3RoZS13aWR0aC1wcm9wZXJ0eQogICAgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL3Zpc3VkZXQuaHRtbCN0aGUtaGVpZ2h0LXByb3BlcnR5CisgICAgLy8gImF1dG8iIGlzIGEgdmFsdWUgb2YgdGhlICJvdmVyZmxvdyIgcHJvcGVydHkgd2hvc2UgYmVoYXZpb3IgaXMgZGVwZW5kZW50CisgICAgLy8gb24gdGhlIHVzZXIgYWdlbnQ7IGl0IGdlbmVyYWxseSBzaG91bGQgcHJvdmlkZSBhIHNjcm9sbGluZyBtZWNoYW5pc20gZm9yCisgICAgLy8gb3ZlcmZsb3dpbmcgYm94ZXMuCisgICAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvdmlzdWZ4Lmh0bWwjb3ZlcmZsb3cKICAgICBrQXV0bywKIAogICAgIC8vICJiYWNrd2FyZHMiIGlzIGEgdmFsdWUgb2YgImFuaW1hdGlvbi1maWxsLW1vZGUiIHByb3BlcnR5IHdoaWNoIGNhdXNlcyB0aGUKQEAgLTI3Nyw2ICsyODEsMTEgQEAKICAgICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWZvbnRzLyNnZW5lcmljLWZvbnQtZmFtaWxpZXMKICAgICBrU2Fuc1NlcmlmLAogCisgICAgLy8gInNjcm9sbCIgaXMgYSB2YWx1ZSBvZiB0aGUgIm92ZXJmbG93IiBwcm9wZXJ0eSB3aGljaCBpbmRpY2F0ZXMgdGhhdAorICAgIC8vIGNvbnRlbnQgaXMgY2xpcHBlZCBhbmQgYSBzY3JvbGxpbmcgbWVjaGFuaXNtIHNob3VsZCBiZSBwcm92aWRlZC4KKyAgICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMS92aXN1ZnguaHRtbCNvdmVyZmxvdworICAgIGtTY3JvbGwsCisKICAgICAvLyAic2VyaWYiIGlzIGEgdmFsdWUgb2YgImZvbnRfZmFtaWx5IiBwcm9wZXJ0eSB3aGljaCBpbmRpY2F0ZXMgYSBnZW5lcmljCiAgICAgLy8gZm9udCBmYW1pbHkgcmVwcmVzZW50aW5nIHRoZSBmb3JtYWwgdGV4dCBzdHlsZSBmb3Igc2NyaXB0LgogICAgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2NzczMtZm9udHMvI2dlbmVyaWMtZm9udC1mYW1pbGllcwpAQCAtMzc2LDYgKzM4NSw3IEBACiAgIHN0YXRpYyBjb25zdCBzY29wZWRfcmVmcHRyPEtleXdvcmRWYWx1ZT4mIEdldFJldmVyc2UoKTsKICAgc3RhdGljIGNvbnN0IHNjb3BlZF9yZWZwdHI8S2V5d29yZFZhbHVlPiYgR2V0UmlnaHQoKTsKICAgc3RhdGljIGNvbnN0IHNjb3BlZF9yZWZwdHI8S2V5d29yZFZhbHVlPiYgR2V0U2Fuc1NlcmlmKCk7CisgIHN0YXRpYyBjb25zdCBzY29wZWRfcmVmcHRyPEtleXdvcmRWYWx1ZT4mIEdldFNjcm9sbCgpOwogICBzdGF0aWMgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+JiBHZXRTZXJpZigpOwogICBzdGF0aWMgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+JiBHZXRTb2xpZCgpOwogICBzdGF0aWMgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+JiBHZXRTdGFydCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWVfdGVzdC5jYwppbmRleCA0MjFlOTkyLi41NTY2ODUyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWVfdGVzdC5jYwpAQCAtNTAsNiArNTAsNyBAQAogICBFWFBFQ1RfRVEoS2V5d29yZFZhbHVlOjprUmVwZWF0LCBLZXl3b3JkVmFsdWU6OkdldFJlcGVhdCgpLT52YWx1ZSgpKTsKICAgRVhQRUNUX0VRKEtleXdvcmRWYWx1ZTo6a1JpZ2h0LCBLZXl3b3JkVmFsdWU6OkdldFJpZ2h0KCktPnZhbHVlKCkpOwogICBFWFBFQ1RfRVEoS2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmLCBLZXl3b3JkVmFsdWU6OkdldFNhbnNTZXJpZigpLT52YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKEtleXdvcmRWYWx1ZTo6a1Njcm9sbCwgS2V5d29yZFZhbHVlOjpHZXRTY3JvbGwoKS0+dmFsdWUoKSk7CiAgIEVYUEVDVF9FUShLZXl3b3JkVmFsdWU6OmtTZXJpZiwgS2V5d29yZFZhbHVlOjpHZXRTZXJpZigpLT52YWx1ZSgpKTsKICAgRVhQRUNUX0VRKEtleXdvcmRWYWx1ZTo6a1N0YXJ0LCBLZXl3b3JkVmFsdWU6OkdldFN0YXJ0KCktPnZhbHVlKCkpOwogICBFWFBFQ1RfRVEoS2V5d29yZFZhbHVlOjprU3RhdGljLCBLZXl3b3JkVmFsdWU6OkdldFN0YXRpYygpLT52YWx1ZSgpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbm90X3BzZXVkb19jbGFzcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgKaW5kZXggZjNjNjcwYi4uMDhjYWRjZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgKQEAgLTM0LDcgKzM0LDcgQEAKIGNsYXNzIE5vdFBzZXVkb0NsYXNzIDogcHVibGljIFBzZXVkb0NsYXNzIHsKICBwdWJsaWM6CiAgIE5vdFBzZXVkb0NsYXNzKCkKLSAgICAgIDogUHNldWRvQ2xhc3MoYmFzZTo6VG9rZW5zOjpwc2V1ZG9fY2xhc3Nfc2VsZWN0b3JfcHJlZml4KCkpIHt9CisgICAgICA6IFBzZXVkb0NsYXNzKGJhc2U6OlRva2Vuczo6bm90X3BzZXVkb19jbGFzc19zZWxlY3RvcigpKSB7fQogICB+Tm90UHNldWRvQ2xhc3MoKSBvdmVycmlkZSB7fQogCiAgIC8vIEZyb20gU2VsZWN0b3IuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fY2xhc3MuaAppbmRleCA4ZmJkMTFkLi5hYTVjZWEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzcy5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2NsYXNzLmgKQEAgLTE2LDYgKzE2LDggQEAKICNkZWZpbmUgQ09CQUxUX0NTU09NX1BTRVVET19DTEFTU19IXwogCiAjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2VuLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW5zLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3NpbXBsZV9zZWxlY3Rvci5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9zcGVjaWZpY2l0eS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3NlcmlhbGl6ZXIuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3NlcmlhbGl6ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNDI1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VyaWFsaXplci5jYwpAQCAtMCwwICsxLDQ1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3NlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vYWN0aXZlX3BzZXVkb19jbGFzcy5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9hZnRlcl9wc2V1ZG9fZWxlbWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9hdHRyaWJ1dGVfc2VsZWN0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vYmVmb3JlX3BzZXVkb19lbGVtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2NsYXNzX3NlbGVjdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2NvbXBsZXhfc2VsZWN0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY29tcG91bmRfc2VsZWN0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZW1wdHlfcHNldWRvX2NsYXNzLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZvY3VzX3BzZXVkb19jbGFzcy5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9ob3Zlcl9wc2V1ZG9fY2xhc3MuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vaWRfc2VsZWN0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbm90X3BzZXVkb19jbGFzcy5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9zaW1wbGVfc2VsZWN0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdHlwZV9zZWxlY3Rvci5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBjc3NvbSB7CisKK25hbWVzcGFjZSB7CisvLyBVc2VkIHRvIHJlcGxhY2UgYW4gdW5rbm93biwgdW5yZWNvZ25pemVkIG9yIHVucmVwcmVzZW50YWJsZSBjaGFyYWN0ZXIuCitjb25zdGV4cHIgaW50IGtVbmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXIgPSAweEZGRkQ7Citjb25zdGV4cHIgY2hhciBrVW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyVXRmOFtdID0gdTgiXHVGRkZEIjsKK30gIC8vIG5hbWVzcGFjZQorCitTZXJpYWxpemVyOjpTZXJpYWxpemVyKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIDogb3V0cHV0XyhvdXRwdXQpIHt9CisKK3ZvaWQgU2VyaWFsaXplcjo6U2VyaWFsaXplSWRlbnRpZmllcihiYXNlOjpUb2tlbiBpZGVudGlmaWVyKSB7CisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3NvbS8jc2VyaWFsaXplLWFuLWlkZW50aWZpZXIKKyAgLy8KKyAgLy8gVG8gc2VyaWFsaXplIGFuIGlkZW50aWZpZXIgbWVhbnMgdG8gY3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IHRoZQorICAvLyBjb25jYXRlbmF0aW9uIG9mLCBmb3IgZWFjaCBjaGFyYWN0ZXIgb2YgdGhlIGlkZW50aWZpZXI6IEZvciBlYWNoIGNoYXJhY3RlcgorICAvLyBvZiB0aGUgaWRlbnRpZmllcjoKKyAgaW50IGNoYXJfbnVtID0gMDsKKyAgdWludDMyX3QgZmlyc3RfY2hhciA9IDA7CisgIGNvbnN0IHVpbnQ4X3QqIG5leHRfcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGlkZW50aWZpZXIuY19zdHIoKSk7CisgIHdoaWxlICgqbmV4dF9wKSB7CisgICAgdWludDMyX3QgYzsgIC8vIGNvZGUgcG9pbnQKKyAgICBjb25zdCB1aW50OF90KiBjdXJyX3AgPSBuZXh0X3A7CisgICAgbmV4dF9wICs9IERlY29kZVVURjgoY3Vycl9wLCAmYyk7CisKKyAgICBjaGFyX251bSsrOworICAgIGlmIChjaGFyX251bSA9PSAxKSBmaXJzdF9jaGFyID0gYzsKKworICAgIC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgTlVMTCAoVSswMDAwKSwgdGhlbiB0aGUgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSCisgICAgLy8gKFUrRkZGRCkuCisgICAgaWYgKGMgPT0gMHgwMCkgeworICAgICAgb3V0cHV0Xy0+YXBwZW5kKGtVbmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJVdGY4KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgaW4gdGhlIHJhbmdlIFtcMS1cMWZdIChVKzAwMDEgdG8gVSswMDFGKSBvciBpcworICAgIC8vIFUrMDA3RiwgdGhlbiB0aGUgY2hhcmFjdGVyIGVzY2FwZWQgYXMgY29kZSBwb2ludC4KKyAgICBpZiAoKDB4MDEgPD0gYyAmJiBjIDw9IDB4MUYpIHx8IGMgPT0gMHg3ZikgeworICAgICAgRXNjYXBlQ29kZVBvaW50KGMpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGNoYXJhY3RlciBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBpcyBpbiB0aGUgcmFuZ2UgWzAtOV0gKFUrMDAzMAorICAgIC8vIHRvIFUrMDAzOSksIHRoZW4gdGhlIGNoYXJhY3RlciBlc2NhcGVkIGFzIGNvZGUgcG9pbnQuCisgICAgYm9vbCBpc19udW1lcmljID0gKCcwJyA8PSBjICYmIGMgPD0gJzknKTsKKyAgICBpZiAoY2hhcl9udW0gPT0gMSAmJiBpc19udW1lcmljKSB7CisgICAgICBFc2NhcGVDb2RlUG9pbnQoYyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGFuZCBpcyBpbiB0aGUgcmFuZ2UgWzAtOV0KKyAgICAvLyAoVSswMDMwIHRvIFUrMDAzOSkgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSAiLSIgKFUrMDAyRCksIHRoZW4gdGhlCisgICAgLy8gY2hhcmFjdGVyIGVzY2FwZWQgYXMgY29kZSBwb2ludC4KKyAgICBpZiAoY2hhcl9udW0gPT0gMiAmJiBpc19udW1lcmljICYmIGZpcnN0X2NoYXIgPT0gJy0nKSB7CisgICAgICBFc2NhcGVDb2RlUG9pbnQoYyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYW5kIGlzIGEgIi0iIChVKzAwMkQpLCBhbmQgdGhlcmUKKyAgICAvLyBpcyBubyBzZWNvbmQgY2hhcmFjdGVyLCB0aGVuIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KKyAgICBpZiAoY2hhcl9udW0gPT0gMSAmJiBjID09ICctJyAmJiAqbmV4dF9wID09ICdcMCcpIHsKKyAgICAgIEVzY2FwZUNoYXJhY3RlcihjKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGhhbmRsZWQgYnkgb25lIG9mIHRoZSBhYm92ZSBydWxlcyBhbmQgaXMgZ3JlYXRlcgorICAgIC8vIHRoYW4gb3IgZXF1YWwgdG8gVSswMDgwLCBpcyAiLSIgKFUrMDAyRCkgb3IgIl8iIChVKzAwNUYpLCBvciBpcyBpbiBvbmUgb2YKKyAgICAvLyB0aGUgcmFuZ2VzIFswLTldIChVKzAwMzAgdG8gVSswMDM5KSwgW0EtWl0gKFUrMDA0MSB0byBVKzAwNUEpLCBvciBcW2Etel0KKyAgICAvLyAoVSswMDYxIHRvIFUrMDA3QSksIHRoZW4gdGhlIGNoYXJhY3RlciBpdHNlbGYuCisgICAgaWYgKGMgPj0gMHg4MCB8fCBjID09ICctJyB8fCBjID09ICdfJyB8fCBpc19udW1lcmljIHx8CisgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSkgeworICAgICAgZG8geworICAgICAgICBvdXRwdXRfLT5wdXNoX2JhY2soKmN1cnJfcCk7CisgICAgICB9IHdoaWxlICgrK2N1cnJfcCA8IG5leHRfcCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KKyAgICBFc2NhcGVDaGFyYWN0ZXIoYyk7CisgIH0KK30KKwordm9pZCBTZXJpYWxpemVyOjpTZXJpYWxpemVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZykgeworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3Nzb20vI3NlcmlhbGl6ZS1hLXN0cmluZworICAvLworICAvLyBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgJyInIChVKzAwMjIpLCBmb2xsb3dlZCBieSB0aGUgcmVzdWx0IG9mCisgIC8vIGFwcGx5aW5nIHRoZSBydWxlcyBiZWxvdyB0byBlYWNoIGNoYXJhY3RlciBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCBmb2xsb3dlZCBieQorICAvLyAnIicgKFUrMDAyMik6CisgIG91dHB1dF8tPnB1c2hfYmFjaygnIicpOworCisgIGNvbnN0IHVpbnQ4X3QqIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzdHJpbmcuY19zdHIoKSk7CisgIGZvciAoc2l6ZV90IG4gPSAwLCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7IG4gPCBsZW5ndGg7ICsrbikgeworICAgIHVpbnQ4X3QgYyA9IHBbbl07CisKKyAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIE5VTEwgKFUrMDAwMCksIHRoZW4gdGhlIFJFUExBQ0VNRU5UIENIQVJBQ1RFUgorICAgIC8vIChVK0ZGRkQpIGVzY2FwZWQgYXMgY29kZSBwb2ludC4KKyAgICBpZiAoYyA9PSAweDAwKSB7CisgICAgICBFc2NhcGVDb2RlUG9pbnQoa1VuaWNvZGVSZXBsYWNlbWVudENoYXJhY3Rlcik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIGluIHRoZSByYW5nZSBbXDEtXDFmXSAoVSswMDAxIHRvIFUrMDAxRikgb3IgaXMKKyAgICAvLyBVKzAwN0YsIHRoZSBjaGFyYWN0ZXIgZXNjYXBlZCBhcyBjb2RlIHBvaW50LgorICAgIGlmICgoMHgwMSA8PSBjICYmIGMgPD0gMHgxRikgfHwgYyA9PSAweDdmKSB7CisgICAgICBFc2NhcGVDb2RlUG9pbnQoYyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIGlzICciJyAoVSswMDIyKSBvciAiXCIgKFUrMDA1QyksIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KKyAgICBpZiAoYyA9PSAweDIyIHx8IGMgPT0gMHg1YykgeworICAgICAgRXNjYXBlQ2hhcmFjdGVyKGMpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgY2hhcmFjdGVyIGl0c2VsZi4KKyAgICBvdXRwdXRfLT5wdXNoX2JhY2soYyk7CisgIH0KKworICAvLyAuLi5mb2xsb3dlZCBieSAnIicgKFUrMDAyMikKKyAgb3V0cHV0Xy0+cHVzaF9iYWNrKCciJyk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6U2VyaWFsaXplU2VsZWN0b3JzKGNvbnN0IFNlbGVjdG9ycyYgc2VsZWN0b3JzKSB7CisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3NvbS8jc2VyaWFsaXppbmctc2VsZWN0b3JzCisgIC8vCisgIC8vIFRvIHNlcmlhbGl6ZSBhIGdyb3VwIG9mIHNlbGVjdG9ycyBzZXJpYWxpemUgZWFjaCBzZWxlY3RvciBpbiB0aGUgZ3JvdXAgb2YKKyAgLy8gc2VsZWN0b3JzIGFuZCB0aGVuIHNlcmlhbGl6ZSB0aGUgZ3JvdXAuCisgIGZvciAoYXV0byBpdCA9IHNlbGVjdG9ycy5iZWdpbigpOyBpdCAhPSBzZWxlY3RvcnMuZW5kKCk7IGl0KyspIHsKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3Nzb20vI3NlcmlhbGl6ZS1hLWNvbW1hLXNlcGFyYXRlZC1saXN0CisgICAgLy8KKyAgICAvLyBUbyBzZXJpYWxpemUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBjb25jYXRlbmF0ZSBhbGwgaXRlbXMgb2YgdGhlIGxpc3QgaW4KKyAgICAvLyBsaXN0IG9yZGVyIHdoaWxlIHNlcGFyYXRpbmcgdGhlbSBieSAiLCAiLCBpLmUuLCBDT01NQSAoVSswMDJDKSBmb2xsb3dlZAorICAgIC8vIGJ5IGEgc2luZ2xlIFNQQUNFIChVKzAwMjApLgorICAgIGlmIChpdCAhPSBzZWxlY3RvcnMuYmVnaW4oKSkgeworICAgICAgb3V0cHV0Xy0+YXBwZW5kKCIsICIpOworICAgIH0KKyAgICBTZXJpYWxpemVTZWxlY3RvcigqKml0KTsKKyAgfQorfQorCit2b2lkIFNlcmlhbGl6ZXI6OlNlcmlhbGl6ZVNlbGVjdG9yKGNvbnN0IFNlbGVjdG9yJiBzZWxlY3RvcikgeworICBjb25zdF9jYXN0PFNlbGVjdG9yKj4oJnNlbGVjdG9yKS0+QWNjZXB0KHRoaXMpOworfQorCitpbnQgU2VyaWFsaXplcjo6RGVjb2RlVVRGOChjb25zdCB1aW50OF90KiBwLCB1aW50MzJfdCogb3V0X2MpIHsKKyAgRENIRUNLKHAgJiYgKnApOworICB1aW50MzJfdCBjOworICBpbnQgbGVuOworICBpZiAocFswXSA8IDB4ODApIHsKKyAgICAqb3V0X2MgPSBwWzBdOworICAgIHJldHVybiAxOworICB9IGVsc2UgaWYgKHBbMF0gPCAweEMwKSB7CisgICAgRExPRyhFUlJPUikgPDwgIkJhZCBVVEYtOCBmaXJzdCBieXRlIjsKKyAgICAqb3V0X2MgPSBrVW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOworICAgIHJldHVybiAxOworICB9IGVsc2UgaWYgKHBbMF0gPCAweEUwKSB7CisgICAgYyA9IHBbMF0gJiAweDFGOworICAgIGxlbiA9IDI7CisgIH0gZWxzZSBpZiAocFswXSA8IDB4RjApIHsKKyAgICBjID0gcFswXSAmIDB4MEY7CisgICAgbGVuID0gMzsKKyAgfSBlbHNlIGlmIChwWzBdIDwgMHhGOCkgeworICAgIGMgPSBwWzBdICYgMHgwNzsKKyAgICBsZW4gPSA0OworICB9IGVsc2UgeworICAgIERMT0coRVJST1IpIDw8ICJCYWQgVVRGLTggZmlyc3QgYnl0ZSI7CisgICAgKm91dF9jID0ga1VuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlcjsKKyAgICByZXR1cm4gMTsKKyAgfQorICBmb3IgKGludCBuID0gMTsgbiA8IGxlbjsgKytuKSB7CisgICAgaWYgKChwW25dICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgRExPRyhFUlJPUikgPDwgIkJhZCBVVEYtOCBieXRlICIgPDwgbjsKKyAgICAgICpvdXRfYyA9IGtVbmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI7CisgICAgICByZXR1cm4gbjsKKyAgICB9CisgICAgYyA8PD0gNjsKKyAgICBjIHw9IHBbbl0gJiAweDNGOworICB9CisgICpvdXRfYyA9IGM7CisgIHJldHVybiBsZW47Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6RXNjYXBlQ29kZVBvaW50KHVpbnQzMl90IGMpIHsKKyAgLy8gSGlnaGVzdCB2YWxpZCBjb2RlIHBvaW50IGluIFVuaWNvZGUuCisgIERDSEVDS19MRShjLCAweDEwRkZGRnUpOworCisgIC8vIFRvIGVzY2FwZSBhIGNoYXJhY3RlciBhcyBjb2RlIHBvaW50IG1lYW5zIHRvIGNyZWF0ZSBhIHN0cmluZyBvZiAiXCIKKyAgLy8gKFUrMDA1QyksIGZvbGxvd2VkIGJ5IHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgYXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlCisgIC8vIG51bWJlciBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgaW4gdGhlIHJhbmdlIDAtOSBhLWYgKFUrMDAzMCB0byBVKzAwMzkgYW5kCisgIC8vIFUrMDA2MSB0byBVKzAwNjYpIHRvIHJlcHJlc2VudCB0aGUgY29kZSBwb2ludCBpbiBiYXNlIDE2LCBmb2xsb3dlZCBieSBhCisgIC8vIHNpbmdsZSBTUEFDRSAoVSswMDIwKS4KKyAgb3V0cHV0Xy0+cHVzaF9iYWNrKCdcXCcpOworCisgIGNvbnN0ZXhwciBjaGFyIGtIZXhEaWdpdHNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgY2hhciBidWZmZXJbOV07CisgIGludCBwb3MgPSBzaXplb2YoYnVmZmVyKTsKKyAgYnVmZmVyWy0tcG9zXSA9ICdcMCc7CisgIHdoaWxlIChjICE9IDApIHsKKyAgICBidWZmZXJbLS1wb3NdID0ga0hleERpZ2l0c1tjICYgMHgwRl07CisgICAgYyA+Pj0gNDsKKyAgfQorICBpZiAocG9zICsgMSA9PSBzaXplb2YoYnVmZmVyKSkgYnVmZmVyWy0tcG9zXSA9ICcwJzsKKyAgb3V0cHV0Xy0+YXBwZW5kKGJ1ZmZlciArIHBvcyk7CisKKyAgLy8gLi4uZm9sbG93ZWQgYnkgYSBzaW5nbGUgU1BBQ0UgKFUrMDAyMCkuCisgIG91dHB1dF8tPnB1c2hfYmFjaygnICcpOworfQorCit2b2lkIFNlcmlhbGl6ZXI6OkVzY2FwZUNoYXJhY3Rlcih1aW50MzJfdCBjKSB7CisgIC8vIFRvIGVzY2FwZSBhIGNoYXJhY3RlciBtZWFucyB0byBjcmVhdGUgYSBzdHJpbmcgb2YgIlwiIChVKzAwNUMpLCBmb2xsb3dlZCBieQorICAvLyB0aGUgY2hhcmFjdGVyLgorICBEQ0hFQ0tfR0UoYywgMHgyMHUpOworICBEQ0hFQ0tfTEUoYywgMHg3RnUpOworICBvdXRwdXRfLT5wdXNoX2JhY2soJ1xcJyk7CisgIG91dHB1dF8tPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihjKSk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXRVbml2ZXJzYWxTZWxlY3RvcihVbml2ZXJzYWxTZWxlY3RvciogdW5pdmVyc2FsX3NlbGVjdG9yKSB7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIodW5pdmVyc2FsX3NlbGVjdG9yKTsKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzc29tLyNzZXJpYWxpemUtYS1zZWxlY3RvcgorICAvLyBJZiB0aGlzIGlzIGEgdW5pdmVyc2FsIHNlbGVjdG9yIGFwcGVuZCAiKiIgKFUrMDAyQSkgdG8gcy4KKyAgb3V0cHV0Xy0+cHVzaF9iYWNrKCcqJyk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXRUeXBlU2VsZWN0b3IoVHlwZVNlbGVjdG9yKiB0eXBlX3NlbGVjdG9yKSB7CisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3NvbS8jc2VyaWFsaXplLWEtc2VsZWN0b3IKKyAgLy8gSWYgdGhpcyBpcyBhIHR5cGUgc2VsZWN0b3IgYXBwZW5kIHRoZSBlc2NhcGVkIGVsZW1lbnQgbmFtZSB0byBzLgorICBTZXJpYWxpemVJZGVudGlmaWVyKHR5cGVfc2VsZWN0b3ItPmVsZW1lbnRfbmFtZSgpKTsKK30KKwordm9pZCBTZXJpYWxpemVyOjpWaXNpdEF0dHJpYnV0ZVNlbGVjdG9yKEF0dHJpYnV0ZVNlbGVjdG9yKiBhdHRyaWJ1dGVfc2VsZWN0b3IpIHsKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzc29tLyNzZXJpYWxpemUtYS1zZWxlY3RvcgorCisgIC8vIDEuIEFwcGVuZCAiWyIgKFUrMDA1QikgdG8gcy4KKyAgb3V0cHV0Xy0+cHVzaF9iYWNrKCdbJyk7CisKKyAgLy8gMi4gSWYgdGhlIG5hbWVzcGFjZSBwcmVmaXggbWFwcyB0byBhIG5hbWVzcGFjZSB0aGF0IGlzIG5vdCB0aGUgbnVsbAorICAvLyBuYW1lc3BhY2UgKG5vdCBpbiBhIG5hbWVzcGFjZSkgYXBwZW5kIHRoZSBlc2NhcGVkIG5hbWVzcGFjZSBwcmVmaXgsCisgIC8vIGZvbGxvd2VkIGJ5IGEgInwiIChVKzAwN0MpIHRvIHMuCisgIC8vIFtDb2JhbHQgZG9lc24ndCBzdXBwb3J0IEBuYW1lc3BhY2VdCisKKyAgLy8gMy4gQXBwZW5kIHRoZSBlc2NhcGVkIGF0dHJpYnV0ZSBuYW1lIHRvIHMuCisgIFNlcmlhbGl6ZUlkZW50aWZpZXIoYXR0cmlidXRlX3NlbGVjdG9yLT5hdHRyaWJ1dGVfbmFtZSgpKTsKKworICAvLyA0LiBJZiB0aGVyZSBpcyBhbiBhdHRyaWJ1dGUgdmFsdWUgc3BlY2lmaWVkLCBhcHBlbmQgIj0iLCAifj0iLCAifD0iLCAiXj0iLAorICAvLyAiJD0iLCBvciAiKj0iIGFzIGFwcHJvcHJpYXRlIChkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYXR0cmlidXRlIHNlbGVjdG9yKSwKKyAgLy8gZm9sbG93ZWQgYnkgdGhlIHN0cmluZyBlc2NhcGVkIGF0dHJpYnV0ZSB2YWx1ZSwgdG8gcy4KKyAgY29uc3QgY2hhciogbWF0Y2hfb3AgPSBudWxscHRyOworICBzd2l0Y2ggKGF0dHJpYnV0ZV9zZWxlY3Rvci0+dmFsdWVfbWF0Y2hfdHlwZSgpKSB7CisgICAgY2FzZSBBdHRyaWJ1dGVTZWxlY3Rvcjo6a05vTWF0Y2g6CisgICAgICBtYXRjaF9vcCA9IG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZVNlbGVjdG9yOjprRXF1YWxzOgorICAgICAgbWF0Y2hfb3AgPSAiPSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZVNlbGVjdG9yOjprSW5jbHVkZXM6CisgICAgICBtYXRjaF9vcCA9ICJ+PSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZVNlbGVjdG9yOjprRGFzaE1hdGNoOgorICAgICAgbWF0Y2hfb3AgPSAifD0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBdHRyaWJ1dGVTZWxlY3Rvcjo6a0JlZ2luc1dpdGg6CisgICAgICBtYXRjaF9vcCA9ICJePSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZVNlbGVjdG9yOjprRW5kc1dpdGg6CisgICAgICBtYXRjaF9vcCA9ICIkPSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZVNlbGVjdG9yOjprQ29udGFpbnM6CisgICAgICBtYXRjaF9vcCA9ICIqPSI7CisgICAgICBicmVhazsKKyAgfQorICBpZiAobWF0Y2hfb3AgIT0gbnVsbHB0cikgeworICAgIG91dHB1dF8tPmFwcGVuZChtYXRjaF9vcCk7CisgICAgU2VyaWFsaXplU3RyaW5nKGF0dHJpYnV0ZV9zZWxlY3Rvci0+YXR0cmlidXRlX3ZhbHVlKCkpOworICB9CisKKyAgLy8gNS4gSWYgdGhlIGF0dHJpYnV0ZSBzZWxlY3RvciBoYXMgdGhlIGNhc2Utc2Vuc2l0aXZpdHkgZmxhZyBwcmVzZW50LCBhcHBlbmQKKyAgLy8gIiBpIiAoVSswMDIwIFUrMDA2OSkgdG8gcy4KKyAgLy8gW0NvYmFsdCBkb2Vzbid0IHN1cHBvcnQgdGhlIENTUzQgY2FzZS1zZW5zaXRpdml0eSBhdHRyaWJ1dGVzLl0KKworICAvLyA2LiBBcHBlbmQgIl0iIChVKzAwNUQpIHRvIHMuCisgIG91dHB1dF8tPnB1c2hfYmFjaygnXScpOworfQorCit2b2lkIFNlcmlhbGl6ZXI6OlZpc2l0Q2xhc3NTZWxlY3RvcihDbGFzc1NlbGVjdG9yKiBjbGFzc19zZWxlY3RvcikgeworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3Nzb20vI3NlcmlhbGl6ZS1hLXNlbGVjdG9yCisgIC8vIEFwcGVuZCBhICIuIiAoVSswMDJFKSwgZm9sbG93ZWQgYnkgdGhlIGVzY2FwZWQgY2xhc3MgbmFtZSB0byBzLgorICBvdXRwdXRfLT5wdXNoX2JhY2soJy4nKTsKKyAgU2VyaWFsaXplSWRlbnRpZmllcihjbGFzc19zZWxlY3Rvci0+Y2xhc3NfbmFtZSgpKTsKK30KKwordm9pZCBTZXJpYWxpemVyOjpWaXNpdElkU2VsZWN0b3IoSWRTZWxlY3RvciogaWRfc2VsZWN0b3IpIHsKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzc29tLyNzZXJpYWxpemUtYS1zZWxlY3RvcgorICAvLyBBcHBlbmQgYSAiIyIgKFUrMDAyMyksIGZvbGxvd2VkIGJ5IHRoZSBlc2NhcGVkIElEIHRvIHMuCisgIG91dHB1dF8tPnB1c2hfYmFjaygnIycpOworICBTZXJpYWxpemVJZGVudGlmaWVyKGlkX3NlbGVjdG9yLT5pZCgpKTsKK30KKwordm9pZCBTZXJpYWxpemVyOjpWaXNpdFBzZXVkb0NsYXNzKFBzZXVkb0NsYXNzKiBwc2V1ZG9fY2xhc3MpIHsKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzc29tLyNzZXJpYWxpemUtYS1zZWxlY3RvcgorICAvLyBJZiB0aGUgcHNldWRvLWNsYXNzIGRvZXMgbm90IGFjY2VwdCBhcmd1bWVudHMgYXBwZW5kICI6IiAoVSswMDNBKSwKKyAgLy8gZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBzZXVkby1jbGFzcywgdG8gcy4KKyAgb3V0cHV0Xy0+cHVzaF9iYWNrKCc6Jyk7CisgIG91dHB1dF8tPmFwcGVuZChwc2V1ZG9fY2xhc3MtPnRleHQoKS5jX3N0cigpKTsKK30KKwordm9pZCBTZXJpYWxpemVyOjpWaXNpdEFjdGl2ZVBzZXVkb0NsYXNzKAorICAgIEFjdGl2ZVBzZXVkb0NsYXNzKiBhY3RpdmVfcHNldWRvX2NsYXNzKSB7CisgIFZpc2l0UHNldWRvQ2xhc3MoYWN0aXZlX3BzZXVkb19jbGFzcyk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXRFbXB0eVBzZXVkb0NsYXNzKEVtcHR5UHNldWRvQ2xhc3MqIGVtcHR5X3BzZXVkb19jbGFzcykgeworICBWaXNpdFBzZXVkb0NsYXNzKGVtcHR5X3BzZXVkb19jbGFzcyk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXRGb2N1c1BzZXVkb0NsYXNzKEZvY3VzUHNldWRvQ2xhc3MqIGZvY3VzX3BzZXVkb19jbGFzcykgeworICBWaXNpdFBzZXVkb0NsYXNzKGZvY3VzX3BzZXVkb19jbGFzcyk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXRIb3ZlclBzZXVkb0NsYXNzKEhvdmVyUHNldWRvQ2xhc3MqIGhvdmVyX3BzZXVkb19jbGFzcykgeworICBWaXNpdFBzZXVkb0NsYXNzKGhvdmVyX3BzZXVkb19jbGFzcyk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXROb3RQc2V1ZG9DbGFzcyhOb3RQc2V1ZG9DbGFzcyogbm90X3BzZXVkb19jbGFzcykgeworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3Nzb20vI3NlcmlhbGl6ZS1hLXNpbXBsZS1zZWxlY3RvcgorICAvLworICAvLyBBcHBlbmQgIjoiIChVKzAwM0EpLCBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgcHNldWRvLWNsYXNzLCBmb2xsb3dlZCBieQorICAvLyAiKCIgKFUrMDAyOCksIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgcHNldWRvLWNsYXNzIGFyZ3VtZW50KHMpCisgIC8vIGRldGVybWluZWQgYXMgcGVyIGJlbG93LCBmb2xsb3dlZCBieSAiKSIgKFUrMDAyOSksIHRvIHMuCisgIC8vIC4uLgorICAvLyA6bm90KCkgLSBUaGUgcmVzdWx0IG9mIHNlcmlhbGl6aW5nIHRoZSB2YWx1ZSB1c2luZyB0aGUgcnVsZXMgZm9yCisgIC8vIHNlcmlhbGl6aW5nIGEgZ3JvdXAgb2Ygc2VsZWN0b3JzLgorICBWaXNpdFBzZXVkb0NsYXNzKG5vdF9wc2V1ZG9fY2xhc3MpOworICBvdXRwdXRfLT5wdXNoX2JhY2soJygnKTsKKyAgbm90X3BzZXVkb19jbGFzcy0+c2VsZWN0b3IoKS0+QWNjZXB0KHRoaXMpOworICBvdXRwdXRfLT5wdXNoX2JhY2soJyknKTsKK30KKwordm9pZCBTZXJpYWxpemVyOjpWaXNpdFBzZXVkb0VsZW1lbnQoUHNldWRvRWxlbWVudCogcHNldWRvX2VsZW1lbnQpIHsKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzc29tLyNzZXJpYWxpemUtYS1zZWxlY3RvcgorICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGNoYWluIG9mIHRoZSBzZWxlY3RvciBhbmQgdGhlcmUgaXMgYQorICAvLyBwc2V1ZG8tZWxlbWVudCwgYXBwZW5kICI6OiIgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBzZXVkby1lbGVtZW50LAorICAvLyB0byBzLgorICBvdXRwdXRfLT5hcHBlbmQoIjo6Iik7CisgIG91dHB1dF8tPmFwcGVuZChwc2V1ZG9fZWxlbWVudC0+dGV4dCgpLmNfc3RyKCkpOworfQorCit2b2lkIFNlcmlhbGl6ZXI6OlZpc2l0QWZ0ZXJQc2V1ZG9FbGVtZW50KAorICAgIEFmdGVyUHNldWRvRWxlbWVudCogYWZ0ZXJfcHNldWRvX2VsZW1lbnQpIHsKKyAgVmlzaXRQc2V1ZG9FbGVtZW50KGFmdGVyX3BzZXVkb19lbGVtZW50KTsKK30KKwordm9pZCBTZXJpYWxpemVyOjpWaXNpdEJlZm9yZVBzZXVkb0VsZW1lbnQoCisgICAgQmVmb3JlUHNldWRvRWxlbWVudCogYmVmb3JlX3BzZXVkb19lbGVtZW50KSB7CisgIFZpc2l0UHNldWRvRWxlbWVudChiZWZvcmVfcHNldWRvX2VsZW1lbnQpOworfQorCit2b2lkIFNlcmlhbGl6ZXI6OlZpc2l0Q29tcG91bmRTZWxlY3RvcihDb21wb3VuZFNlbGVjdG9yKiBjb21wb3VuZF9zZWxlY3RvcikgeworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3Nzb20vI3NlcmlhbGl6ZS1hLXNlbGVjdG9yCisgIC8vCisgIC8vIDEuIElmIHRoZXJlIGlzIG9ubHkgb25lIHNpbXBsZSBzZWxlY3RvciBpbiB0aGUgY29tcG91bmQgc2VsZWN0b3JzIHdoaWNoIGlzCisgIC8vIGEgdW5pdmVyc2FsIHNlbGVjdG9yLCBhcHBlbmQgdGhlIHJlc3VsdCBvZiBzZXJpYWxpemluZyB0aGUgdW5pdmVyc2FsCisgIC8vIHNlbGVjdG9yIHRvIHMuCisgIGlmIChjb21wb3VuZF9zZWxlY3Rvci0+c2ltcGxlX3NlbGVjdG9ycygpLnNpemUoKSA9PSAxICYmCisgICAgICBjb21wb3VuZF9zZWxlY3Rvci0+c2ltcGxlX3NlbGVjdG9ycygpLmZyb250KCktPkFzVW5pdmVyc2FsU2VsZWN0b3IoKSkgeworICAgIGNvbXBvdW5kX3NlbGVjdG9yLT5zaW1wbGVfc2VsZWN0b3JzKCkuZnJvbnQoKS0+QWNjZXB0KHRoaXMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIDIuIE90aGVyd2lzZSwgZm9yIGVhY2ggc2ltcGxlIHNlbGVjdG9yIGluIHRoZSBjb21wb3VuZCBzZWxlY3RvcnMgdGhhdCBpcworICAvLyBub3QgYSB1bml2ZXJzYWwgc2VsZWN0b3Igb2Ygd2hpY2ggdGhlIG5hbWVzcGFjZSBwcmVmaXggbWFwcyB0byBhIG5hbWVzcGFjZQorICAvLyB0aGF0IGlzIG5vdCB0aGUgZGVmYXVsdCBuYW1lc3BhY2Ugc2VyaWFsaXplIHRoZSBzaW1wbGUgc2VsZWN0b3IgYW5kIGFwcGVuZAorICAvLyB0aGUgcmVzdWx0IHRvIHMuCisgIC8vIFtDb2JhbHQgZG9lc24ndCBzdXBwb3J0IEBuYW1lc3BhY2VdCisgIGZvciAoQ29tcG91bmRTZWxlY3Rvcjo6U2ltcGxlU2VsZWN0b3JzOjpjb25zdF9pdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgY29tcG91bmRfc2VsZWN0b3ItPnNpbXBsZV9zZWxlY3RvcnMoKS5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gY29tcG91bmRfc2VsZWN0b3ItPnNpbXBsZV9zZWxlY3RvcnMoKS5lbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCgqaXRlciktPkFzVW5pdmVyc2FsU2VsZWN0b3IoKSA9PSBOVUxMKSB7CisgICAgICAoKml0ZXIpLT5BY2NlcHQodGhpcyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXRDb21wbGV4U2VsZWN0b3IoQ29tcGxleFNlbGVjdG9yKiBjb21wbGV4X3NlbGVjdG9yKSB7CisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3NvbS8jc2VyaWFsaXplLWEtc2VsZWN0b3IKKyAgLy8KKyAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcGFydCBvZiB0aGUgY2hhaW4gb2YgdGhlIHNlbGVjdG9yIGFwcGVuZCBhIHNpbmdsZQorICAvLyBTUEFDRSAoVSswMDIwKSwgZm9sbG93ZWQgYnkgdGhlIGNvbWJpbmF0b3IgIj4iLCAiKyIsICJ+IiwgIj4+IiwgInx8IiwgYXMKKyAgLy8gYXBwcm9wcmlhdGUsIGZvbGxvd2VkIGJ5IGFub3RoZXIgc2luZ2xlIFNQQUNFIChVKzAwMjApIGlmIHRoZSBjb21iaW5hdG9yCisgIC8vIHdhcyBub3Qgd2hpdGVzcGFjZSwgdG8gcy4KKyAgQ29tcG91bmRTZWxlY3Rvciogc2VsZWN0b3IgPSBjb21wbGV4X3NlbGVjdG9yLT5maXJzdF9zZWxlY3RvcigpOworICBpZiAoIXNlbGVjdG9yKSByZXR1cm47CisgIHNlbGVjdG9yLT5BY2NlcHQodGhpcyk7CisgIENvbWJpbmF0b3IqIGNvbWJpbmF0b3IgPSBzZWxlY3Rvci0+cmlnaHRfY29tYmluYXRvcigpOworICB3aGlsZSAoY29tYmluYXRvcikgeworICAgIC8vIFRoZSB8VmlzaXRGb29Db21iaW5hdG9yfCBtZXRob2RzIGJlbG93IGFkZCB0aGUgc3BhY2VzIGJlZm9yZSAmIGFmdGVyLgorICAgIGNvbWJpbmF0b3ItPkFjY2VwdCh0aGlzKTsKKyAgICBzZWxlY3RvciA9IGNvbWJpbmF0b3ItPnJpZ2h0X3NlbGVjdG9yKCk7CisgICAgc2VsZWN0b3ItPkFjY2VwdCh0aGlzKTsKKyAgICBjb21iaW5hdG9yID0gc2VsZWN0b3ItPnJpZ2h0X2NvbWJpbmF0b3IoKTsKKyAgfQorfQorCit2b2lkIFNlcmlhbGl6ZXI6OlZpc2l0Q2hpbGRDb21iaW5hdG9yKENoaWxkQ29tYmluYXRvciogY2hpbGRfY29tYmluYXRvcikgeworICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGNoaWxkX2NvbWJpbmF0b3IpOworICBvdXRwdXRfLT5hcHBlbmQoIiA+ICIpOworfQorCit2b2lkIFNlcmlhbGl6ZXI6OlZpc2l0TmV4dFNpYmxpbmdDb21iaW5hdG9yKAorICAgIE5leHRTaWJsaW5nQ29tYmluYXRvciogbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IpIHsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihuZXh0X3NpYmxpbmdfY29tYmluYXRvcik7CisgIG91dHB1dF8tPmFwcGVuZCgiICsgIik7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXREZXNjZW5kYW50Q29tYmluYXRvcigKKyAgICBEZXNjZW5kYW50Q29tYmluYXRvciogZGVzY2VuZGFudF9jb21iaW5hdG9yKSB7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZGVzY2VuZGFudF9jb21iaW5hdG9yKTsKKyAgb3V0cHV0Xy0+cHVzaF9iYWNrKCcgJyk7Cit9CisKK3ZvaWQgU2VyaWFsaXplcjo6VmlzaXRGb2xsb3dpbmdTaWJsaW5nQ29tYmluYXRvcigKKyAgICBGb2xsb3dpbmdTaWJsaW5nQ29tYmluYXRvciogZm9sbG93aW5nX3NpYmxpbmdfY29tYmluYXRvcikgeworICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGZvbGxvd2luZ19zaWJsaW5nX2NvbWJpbmF0b3IpOworICBvdXRwdXRfLT5hcHBlbmQoIiB+ICIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3Nzb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2VyaWFsaXplci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9zZXJpYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhNzIzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VyaWFsaXplci5oCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0NTU09NX1NFUklBTElaRVJfSF8KKyNkZWZpbmUgQ09CQUxUX0NTU09NX1NFUklBTElaRVJfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2VuLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2NvbWJpbmF0b3JfdmlzaXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9zZWxlY3Rvci5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9zZWxlY3Rvcl92aXNpdG9yLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGNzc29tIHsKKworY2xhc3MgUHNldWRvQ2xhc3M7CitjbGFzcyBQc2V1ZG9FbGVtZW50OworCisvLyBTZXJpYWxpemVzIHZhcmlvdXMgdHlwZXMgaW4gdGhlIENTU09NIHRvIGEgc3RyaW5nLiBDdXJyZW50bHkgb25seSBpbXBsZW1lbnRzCisvLyBzZWxlY3RvciBzZXJpYWxpemF0aW9uOyBkZWNsYXJhdGlvbnMsIHJ1bGVzLCBhbmQgd2hvbGUgc2hlZXRzIGFyZW4ndCB5ZXQKKy8vIGltcGxlbWVudGVkLgorY2xhc3MgU2VyaWFsaXplciA6IHB1YmxpYyBTZWxlY3RvclZpc2l0b3IsIHB1YmxpYyBDb21iaW5hdG9yVmlzaXRvciB7CisgcHVibGljOgorICBTZXJpYWxpemVyKGNvbnN0IFNlcmlhbGl6ZXImIG90aGVyKSA9IGRlbGV0ZTsKKyAgU2VyaWFsaXplciYgb3BlcmF0b3I9KGNvbnN0IFNlcmlhbGl6ZXImIG90aGVyKSA9IGRlbGV0ZTsKKworICBleHBsaWNpdCBTZXJpYWxpemVyKHN0ZDo6c3RyaW5nKiBvdXRwdXQpOworCisgIHZvaWQgU2VyaWFsaXplSWRlbnRpZmllcihiYXNlOjpUb2tlbiBpZGVudGlmaWVyKTsKKyAgdm9pZCBTZXJpYWxpemVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZyk7CisgIHZvaWQgU2VyaWFsaXplU2VsZWN0b3JzKGNvbnN0IFNlbGVjdG9ycyYgc2VsZWN0b3JzKTsKKyAgdm9pZCBTZXJpYWxpemVTZWxlY3Rvcihjb25zdCBTZWxlY3RvciYgc2VsZWN0b3IpOworCisgcHJpdmF0ZToKKyAgLy8gRGVjb2RlIGEgVVRGLTggY2hhcmFjdGVyIHBvaW50ZWQgdG8gYnkgfHB8IGludG8gfG91dF9jfC4KKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkLgorICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gYSBwbGFjZSBpdCBjYW4gYmUgc2hhcmVkLCBvciB1c2UgYW5vdGhlciBzaGFyZWQgaW1wbC4KKyAgaW50IERlY29kZVVURjgoY29uc3QgdWludDhfdCogcCwgdWludDMyX3QqIG91dF9jKTsKKworICAvLyBFc2NhcGUgYSBVbmljb2RlIGNvZGUgcG9pbnQgd2l0aCBpdHMgaGV4IHZhbHVlLgorICB2b2lkIEVzY2FwZUNvZGVQb2ludCh1aW50MzJfdCBjKTsKKworICAvLyBFc2NhcGUgYW4gQVNDSUkgY2hhcmFjdGVyIHdpdGggYSBiYWNrc2xhc2guCisgIHZvaWQgRXNjYXBlQ2hhcmFjdGVyKHVpbnQzMl90IGMpOworCisgIC8vIFNpbXBsZSBzZWxlY3RvcnMgLSBPdmVycmlkZXMgZnJvbSBTZWxlY3RvclZpc2l0b3IuCisgIHZvaWQgVmlzaXRVbml2ZXJzYWxTZWxlY3RvcihVbml2ZXJzYWxTZWxlY3RvciogdW5pdmVyc2FsX3NlbGVjdG9yKSBvdmVycmlkZTsKKyAgdm9pZCBWaXNpdFR5cGVTZWxlY3RvcihUeXBlU2VsZWN0b3IqIHR5cGVfc2VsZWN0b3IpIG92ZXJyaWRlOworICB2b2lkIFZpc2l0QXR0cmlidXRlU2VsZWN0b3IoQXR0cmlidXRlU2VsZWN0b3IqIGF0dHJpYnV0ZV9zZWxlY3Rvcikgb3ZlcnJpZGU7CisgIHZvaWQgVmlzaXRDbGFzc1NlbGVjdG9yKENsYXNzU2VsZWN0b3IqIGNsYXNzX3NlbGVjdG9yKSBvdmVycmlkZTsKKyAgdm9pZCBWaXNpdElkU2VsZWN0b3IoSWRTZWxlY3RvciogaWRfc2VsZWN0b3IpIG92ZXJyaWRlOworCisgIC8vIFBzZXVkbyBjbGFzc2VzIC0gT3ZlcnJpZGVzIGZyb20gU2VsZWN0b3JWaXNpdG9yLgorICB2b2lkIFZpc2l0UHNldWRvQ2xhc3MoUHNldWRvQ2xhc3MqIHBzZXVkb19jbGFzcyk7CisgIHZvaWQgVmlzaXRBY3RpdmVQc2V1ZG9DbGFzcyhBY3RpdmVQc2V1ZG9DbGFzcyogYWN0aXZlX3BzZXVkb19jbGFzcykgb3ZlcnJpZGU7CisgIHZvaWQgVmlzaXRFbXB0eVBzZXVkb0NsYXNzKEVtcHR5UHNldWRvQ2xhc3MqIGVtcHR5X3BzZXVkb19jbGFzcykgb3ZlcnJpZGU7CisgIHZvaWQgVmlzaXRGb2N1c1BzZXVkb0NsYXNzKEZvY3VzUHNldWRvQ2xhc3MqIGZvY3VzX3BzZXVkb19jbGFzcykgb3ZlcnJpZGU7CisgIHZvaWQgVmlzaXRIb3ZlclBzZXVkb0NsYXNzKEhvdmVyUHNldWRvQ2xhc3MqIGhvdmVyX3BzZXVkb19jbGFzcykgb3ZlcnJpZGU7CisgIHZvaWQgVmlzaXROb3RQc2V1ZG9DbGFzcyhOb3RQc2V1ZG9DbGFzcyogbm90X3BzZXVkb19jbGFzcykgb3ZlcnJpZGU7CisKKyAgLy8gUHNldWRvIGVsZW1lbnRzIC0gT3ZlcnJpZGVzIGZyb20gU2VsZWN0b3JWaXNpdG9yLgorICB2b2lkIFZpc2l0UHNldWRvRWxlbWVudChQc2V1ZG9FbGVtZW50KiBwc2V1ZG9fZWxlbWVudCk7CisgIHZvaWQgVmlzaXRBZnRlclBzZXVkb0VsZW1lbnQoCisgICAgICBBZnRlclBzZXVkb0VsZW1lbnQqIGFmdGVyX3BzZXVkb19lbGVtZW50KSBvdmVycmlkZTsKKyAgdm9pZCBWaXNpdEJlZm9yZVBzZXVkb0VsZW1lbnQoCisgICAgICBCZWZvcmVQc2V1ZG9FbGVtZW50KiBiZWZvcmVfcHNldWRvX2VsZW1lbnQpIG92ZXJyaWRlOworCisgIC8vIENvbXBvdW5kIHNlbGVjdG9yIC0gT3ZlcnJpZGVzIGZyb20gU2VsZWN0b3JWaXNpdG9yLgorICB2b2lkIFZpc2l0Q29tcG91bmRTZWxlY3RvcihDb21wb3VuZFNlbGVjdG9yKiBjb21wb3VuZF9zZWxlY3Rvcikgb3ZlcnJpZGU7CisKKyAgLy8gQ29tcGxleCBzZWxlY3RvciAtIE92ZXJyaWRlcyBmcm9tIFNlbGVjdG9yVmlzaXRvci4KKyAgdm9pZCBWaXNpdENvbXBsZXhTZWxlY3RvcihDb21wbGV4U2VsZWN0b3IqIGNvbXBsZXhfc2VsZWN0b3IpIG92ZXJyaWRlOworCisgIC8vIENvbWJpbmF0b3JzIC0gT3ZlcnJpZGVzIGZyb20gQ29tYmluYXRvclZpc2l0b3IuCisgIHZvaWQgVmlzaXRDaGlsZENvbWJpbmF0b3IoQ2hpbGRDb21iaW5hdG9yKiBjaGlsZF9jb21iaW5hdG9yKSBvdmVycmlkZTsKKyAgdm9pZCBWaXNpdE5leHRTaWJsaW5nQ29tYmluYXRvcigKKyAgICAgIE5leHRTaWJsaW5nQ29tYmluYXRvciogbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IpIG92ZXJyaWRlOworICB2b2lkIFZpc2l0RGVzY2VuZGFudENvbWJpbmF0b3IoCisgICAgICBEZXNjZW5kYW50Q29tYmluYXRvciogZGVzY2VuZGFudF9jb21iaW5hdG9yKSBvdmVycmlkZTsKKyAgdm9pZCBWaXNpdEZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKAorICAgICAgRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IqIGZvbGxvd2luZ19zaWJsaW5nX2NvbWJpbmF0b3IpIG92ZXJyaWRlOworCisgIC8vIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCisgIHN0ZDo6c3RyaW5nKiBvdXRwdXRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzc29tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0NTU09NX1NFUklBTElaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2VyaWFsaXplcl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9zZXJpYWxpemVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0NTU0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VyaWFsaXplcl90ZXN0LmNjCkBAIC0wLDAgKzEsMjQ0IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vc2VyaWFsaXplci5oIgorCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW4uaCIKKyNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgY3Nzb20geworCituYW1lc3BhY2Ugeworc3RydWN0IFRlc3RQYWlyIHsKKyAgLy8gTm9uLW5vcm1hbGl6ZWQgc291cmNlOiB0aGUgZXhwZWN0ZWQgc2VyaWFsaXplZCBvdXRwdXQgZGlmZmVycy4KKyAgVGVzdFBhaXIoY29uc3QgY2hhciogc2VyaWFsaXplZCwgY29uc3QgY2hhciogc291cmNlKQorICAgICAgOiBzZXJpYWxpemVkKHNlcmlhbGl6ZWQpLCBzb3VyY2Uoc291cmNlKSB7fQorICAvLyBOb3JtYWxpemVkIHNvdXJjZTogdGhlIGV4cGVjdGVkIHNlcmlhbGl6ZWQgb3V0cHV0IGlzIGlkZW50aWNhbC4KKyAgVGVzdFBhaXIoY29uc3QgY2hhciogbm9ybWFsaXplZCkgIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQorICAgICAgOiBzZXJpYWxpemVkKG5vcm1hbGl6ZWQpLCBzb3VyY2Uobm9ybWFsaXplZCkge30KKyAgY29uc3QgY2hhciogc2VyaWFsaXplZDsKKyAgY29uc3QgY2hhciogc291cmNlOworfTsKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKFNlcmlhbGl6ZXJUZXN0LCBTZXJpYWxpemVTZWxlY3RvcnNUZXN0KSB7CisgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgY29uc3QgVGVzdFBhaXIgc2VsZWN0b3JzW10gPSB7CisgICAgICAvLyBTaW1wbGUgc2VsZWN0b3JzCisgICAgICAiKiIsCisgICAgICAidGFnIiwKKyAgICAgICJbYXR0cl0iLAorICAgICAgIlthdHRyPVwidmFsdWVcIl0iLAorICAgICAgIlthdHRyfj1cInZhbHVlXCJdIiwKKyAgICAgICJbYXR0cnw9XCJ2YWx1ZVwiXSIsCisgICAgICAiW2F0dHJePVwidmFsdWVcIl0iLAorICAgICAgIlthdHRyJD1cInZhbHVlXCJdIiwKKyAgICAgICJbYXR0cio9XCJ2YWx1ZVwiXSIsCisgICAgICAiLmNsYXNzIiwKKyAgICAgICIjaWQiLAorICAgICAgIjphY3RpdmUiLAorICAgICAgIjplbXB0eSIsCisgICAgICAiOmZvY3VzIiwKKyAgICAgICI6aG92ZXIiLAorICAgICAgIjpub3QodGFnKSIsCisgICAgICAiOjpiZWZvcmUiLAorICAgICAgIjo6YWZ0ZXIiLAorCisgICAgICAvLyBDb21wb3VuZCBzZWxlY3RvcnMKKyAgICAgICJ0YWdbYXR0cj1cInZhbHVlXCJdIiwKKyAgICAgICJ0YWcuY2xhc3MiLAorICAgICAgInRhZyNpZCIsCisgICAgICAidGFnOmhvdmVyIiwKKyAgICAgICJ0YWc6OmFmdGVyIiwKKyAgICAgICJbYXR0cl0uY2xhc3MiLAorICAgICAgIlthdHRyPVwidmFsdWVcIl0jaWQiLAorICAgICAgIlthdHRyfj1cInZhbHVlXCJdOmFjdGl2ZSIsCisgICAgICAiW2F0dHJ8PVwidmFsdWVcIl06OmFmdGVyIiwKKyAgICAgICIuY2xhc3MjaWQiLAorICAgICAgIi5jbGFzczplbXB0eSIsCisgICAgICAiLmNsYXNzOjpiZWZvcmUiLAorICAgICAgIiNpZDpob3ZlciIsCisgICAgICAiI2lkOjphZnRlciIsCisgICAgICAiOmZvY3VzOjpiZWZvcmUiLAorICAgICAgInRhZ1thdHRyPVwidmFsdWVcIl0uY2xhc3MiLAorICAgICAgInRhZ1thdHRyXj1cInZhbHVlXCJdLmNsYXNzI2lkIiwKKyAgICAgICJ0YWdbYXR0ciQ9XCJ2YWx1ZVwiXS5jbGFzcyNpZDphY3RpdmUiLAorICAgICAgInRhZ1thdHRyKj1cInZhbHVlXCJdLmNsYXNzI2lkOmFjdGl2ZTo6YmVmb3JlIiwKKworICAgICAgLy8gVW5pdmVyc2FsIHNlbGVjdG9yIGlzIGRyb3BwZWQgZnJvbSBhIGNvbXBvdW5kIHNlbGVjdG9yLgorICAgICAgeyJ0YWciLCAgICAgICAgICAgICAgICAgICAgICAgICAgIip0YWcifSwKKyAgICAgIHsiW2F0dHI9XCJ2YWx1ZVwiXSIsICAgICAgICAgICAgICIqW2F0dHI9XCJ2YWx1ZVwiXSJ9LAorICAgICAgeyIuY2xhc3MiLCAgICAgICAgICAgICAgICAgICAgICAgIiouY2xhc3MifSwKKyAgICAgIHsiI2lkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICIqI2lkIn0sCisgICAgICB7Ijpmb2N1cyIsICAgICAgICAgICAgICAgICAgICAgICAiKjpmb2N1cyJ9LAorICAgICAgeyI6OmJlZm9yZSIsICAgICAgICAgICAgICAgICAgICAgIio6OmJlZm9yZSJ9LAorICAgICAgeyJ0YWdbYXR0cj1cInZhbHVlXCJdLmNsYXNzI2lkOmVtcHR5OjpiZWZvcmUiLAorICAgICAgICIqdGFnW2F0dHI9XCJ2YWx1ZVwiXS5jbGFzcyNpZDplbXB0eTo6YmVmb3JlIn0sCisKKyAgICAgIC8vIE9sZCBzeW50YXggcHNldWRvLWVsZW1lbnQgd2l0aCBvbmUgJzonIGlzIG5vcm1hbGl6ZWQgdG8gdXNlICc6OicuCisgICAgICB7ImRpdjo6YmVmb3JlIiwgICAgICAgICAgICAgICAgICAiZGl2OmJlZm9yZSJ9LAorICAgICAgeyJkaXY6OmFmdGVyIiwgICAgICAgICAgICAgICAgICAgImRpdjphZnRlciJ9LAorCisgICAgICAvLyBDb21wb3VuZCBjbGFzc2VzL2lkcy9hdHRyaWJ1dGVzIGFyZSBzb3J0ZWQsIGFuZCBubyB3aGl0ZXNwYWNlIGluIGF0dHJzLgorICAgICAgeyIuYWEuYmIuY2MuZGQuZWUuZmYuZ2cuaGguaWkiLCAgIi5mZi5kZC5hYS5iYi5nZy5oaC5lZS5paS5jYyJ9LAorICAgICAgeyIjYWEjYmIjY2MjZGQjZWUjZmYjZ2cjaGgjaWkiLCAgIiNmZiNkZCNhYSNiYiNnZyNoaCNlZSNpaSNjYyJ9LAorICAgICAgeyJbYT1cInhcIl1bYl1bYz1cInpcIl1bZD1cIndcIl1bZT1cInlcIl0iLAorICAgICAgICJbIGQgPSB3IF1bYSA9eF1bZT0geV1bIGM9el1bIGIgXSJ9LAorCisgICAgICAvLyBXaGl0ZXNwYWNlIGlzIG5vcm1hbGl6ZWQgYXJvdW5kIGNvbWJpbmF0b3JzLgorICAgICAgeyJkaXYgaW1nIiwgICAgICAgICAgICAgICAgICAgICAgImRpdiAgICAgICBpbWcifSwKKyAgICAgIHsiZGl2ID4gaW1nIiwgICAgICAgICAgICAgICAgICAgICJkaXYgICA+ICAgaW1nIn0sCisgICAgICB7ImRpdiArIGltZyIsICAgICAgICAgICAgICAgICAgICAiZGl2ICAgKyAgIGltZyJ9LAorICAgICAgeyJkaXYgfiBpbWciLCAgICAgICAgICAgICAgICAgICAgImRpdiAgIH4gICBpbWcifSwKKyAgICAgIHsiZGl2ID4gaW1nIiwgICAgICAgICAgICAgICAgICAgICJkaXY+aW1nIn0sCisgICAgICB7ImRpdiArIGltZyIsICAgICAgICAgICAgICAgICAgICAiZGl2K2ltZyJ9LAorICAgICAgeyJkaXYgfiBpbWciLCAgICAgICAgICAgICAgICAgICAgImRpdn5pbWcifSwKKyAgICAgIHsiZGl2IGltZyIsICAgICAgICAgICAgICAgICAgICAgICJkaXYgICAgaW1nICAifSwKKyAgICAgIHsiZGl2ICsgaW1nID4gLmNsYXNzIiwgICAgICAgICAgICJkaXYgICAraW1nPiAgIC5jbGFzcyJ9LAorICAgICAgeyJbYXR0cl49XCJ2YWx1ZVwiXSArIGRpdiIsICAgICAgIlthdHRyIF49IHZhbHVlXSAgICArZGl2ICJ9LAorICAgICAgeyJkaXY6ZW1wdHkgfiBbYXR0cj1cInZhbHVlXCJdIiwgImRpdjplbXB0eX5bYXR0ciA9IHZhbHVlXSJ9LAorCisgICAgICAvLyBUYWdzL2NsYXNzZXMvaWRzIHdpdGggYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IgYXJlIG5vdCBzb3J0ZWQuCisgICAgICAidGFnMSB0YWcyIiwKKyAgICAgICJ0YWcyIHRhZzEiLAorICAgICAgIi5jbGFzczEgLmNsYXNzMiIsCisgICAgICAiLmNsYXNzMiAuY2xhc3MxIiwKKyAgICAgICIjaWQxICNpZDIiLAorICAgICAgIiNpZDIgI2lkMSIsCisKKyAgICAgIC8vIFR5cGUgaXMgc29ydGVkIGZpcnN0LCB0aGVuIHRleHQgb2Ygc2FtZS10eXBlZCBzaW1wbGUgc2VsZWN0b3JzLgorICAgICAgeyJJW0NePVwieVwiXVtHPVwieFwiXVtKXS5CLkUuSCNBI0QjRiIsICJbSl1JLkhbRz14XSNGLkUjRFtDXj15XS5CI0EifSwKKworICAgICAgLy8gUHNldWRvLWNsYXNzZXMgYXJlIHNvcnRlZCwgOm5vdCgpIGlzIHNvcnRlZCBieSBpdHMgYXJndW1lbnQsIGFuZCBhbGwKKyAgICAgIC8vIHBzZXVkby1jbGFzc2VzIGFyZSBzb3J0ZWQgYmVmb3JlICgnOicgb3IgJzo6JykgcHNldWRvLWVsZW1lbnRzLgorICAgICAgeyI6YWN0aXZlOmVtcHR5OmZvY3VzOmhvdmVyOm5vdChhYSk6bm90KGJiKTpub3QoY2MpOjphZnRlcjo6YmVmb3JlIiwKKyAgICAgICAiOm5vdChiYik6ZW1wdHk6OmJlZm9yZTpmb2N1czpub3QoYWEpOmFmdGVyOmFjdGl2ZTpob3Zlcjpub3QoY2MpIn0sCisKKyAgICAgIC8vIERpZmZlcmVudCB0eXBlcyBvZiBzZWxlY3RvcnMgY2FuIGJlIGluIGEgY29tbWEtc2VwYXJhdGVkIGdyb3VwLgorICAgICAgInRhZywgOm5vdCguY2xhc3MpLCBvdXRlciBpbm5lciwgcGFyZW50ID4gY2hpbGQsIFthdHRyPVwidmFsdWVcIl0sICNpZCIsCisKKyAgICAgIC8vIFRoZSB0aGUgb3JkZXIgb2YgdGhlIGdyb3VwIGlzIG5vdCByZWFycmFuZ2VkLgorICAgICAgIi5jbGFzc0EuY2xhc3NCLCB0YWc6aG92ZXIiLAorICAgICAgInRhZzpob3ZlciwgLmNsYXNzQS5jbGFzc0IiLAorCisgICAgICAvLyBTcGFjaW5nIG9mIGEgY29tbWEtc2VwYXJhdGVkIGdyb3VwIGlzIG5vcm1hbGl6ZWQsIGJ1dCBpdCdzIG5vdCBzb3J0ZWQuCisgICAgICB7InBpZywgY293LCBob3JzZSwgc2hlZXAsIGdvYXQiLCAgIiBwaWcsY293ICxob3JzZSAsIHNoZWVwLCBnb2F0ICJ9LAorCisgICAgICAvLyBFYWNoIGNvbXBvdW5kIHNlbGVjdG9yIGluIGEgZ3JvdXAgaXMgaW5kaXZpZHVhbGx5IHNvcnRlZC4KKyAgICAgIHsiLmNvdy5waWcsIC5ob3JzZSwgLmdvYXQuc2hlZXAiLCAiLnBpZy5jb3csIC5ob3JzZSwgLnNoZWVwLmdvYXQifSwKKworICAgICAgLy8gVW5uZWNlc3NhcmlseSBlc2NhcGVkIGlkZW50aWZpZXIgaXMgbm9ybWFsaXplZC4KKyAgICAgIHsiWF95LTEiLCAiXFxYXFxfXFx5XFwtXFwzMSJ9LAorCisgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBxdW90ZWQuCisgICAgICB7IltxdW90ZXM9XCJ2YWx1ZVwiXSIsICJbcXVvdGVzPXZhbHVlXSJ9LAorCisgICAgICAvLyBBdHRyaWJ1dGVzIHdpdGggdW4tZXNjYXBlZCBzdHJpbmcgdmFsdWVzLgorICAgICAgIltlbXB0eT1cIlwiXSIsCisgICAgICAiW2FscGhhPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiXSIsCisgICAgICAiW251bWVyaWM9XCIwMTIzNDU2Nzg5XCJdIiwKKyAgICAgICJbYXNjaWk9XCIgISMkJSYnKCkqKywtLi86Ozw9Pj9AW11eX2B7fH1+XCJdIiwKKyAgICAgIHU4Ilt1bmljb2RlPVwiMi1cdTAwYTMgMy1cdTFkMDEgNC1cVTAwMDIwNzBlXCJdIiwKKworICAgICAgLy8gQXR0cmlidXRlcyB3aXRoIGVzY2FwZWQgc3RyaW5nIHZhbHVlcy4KKyAgICAgICJbbG93PVwiXFwxIFxcMiBcXDMgXFw0IFxcNSBcXDYgXFw3IFxcOCBcXDkgXFxhIFxcYiBcXGMgXFxkIFxcZSBcXGYgXCJdIiwKKyAgICAgICJbbG93PVwiXFwxMCBcXDExIFxcMTIgXFwxMyBcXDE0IFxcMTUgXFwxNiBcXDE3IFwiXSIsCisgICAgICAiW2xvdz1cIlxcMTggXFwxOSBcXDFhIFxcMWIgXFwxYyBcXDFkIFxcMWUgXFwxZiBcIl0iLAorICAgICAgeyJbcXVvdGVfYmFja3NsYXNoPVwiLVxcXCItXFxcXC1cIl0iLAorICAgICAgICJbcXVvdGVfYmFja3NsYXNoPVwiLVxcMjIgLVxcNWMgLVwiXSJ9LAorICB9OworICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgYmFzZTo6VG9rZW46OlNjb3BlZEFscGhhYmV0aWNhbFNvcnRpbmcgc29ydF9zY29wZTsKKyAgc2NvcGVkX3B0cjxjc3NfcGFyc2VyOjpQYXJzZXI+IGNzc19wYXJzZXIgPSBjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpOworICBiYXNlOjpTb3VyY2VMb2NhdGlvbiBsb2MoIltvYmplY3QgU2VsZWN0b3JUZXN0XSIsIDEsIDEpOworICBmb3IgKGNvbnN0IFRlc3RQYWlyJiBzZWxlY3RvciA6IHNlbGVjdG9ycykgeworICAgIHNjb3BlZF9yZWZwdHI8Q1NTU3R5bGVSdWxlPiBjc3Nfc3R5bGVfcnVsZSA9CisgICAgICAgIGNzc19wYXJzZXItPlBhcnNlUnVsZShzdGQ6OnN0cmluZyhzZWxlY3Rvci5zb3VyY2UpICsgIiB7fSIsIGxvYykKKyAgICAgICAgICAgIC0+QXNDU1NTdHlsZVJ1bGUoKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3Iuc2VyaWFsaXplZCwgY3NzX3N0eWxlX3J1bGUtPnNlbGVjdG9yX3RleHQoKSkKKyAgICAgICAgPDwgIiAgU291cmNlOiBcIiIgPDwgc2VsZWN0b3Iuc291cmNlIDw8ICciJzsKKyAgfQorfQorCitURVNUKFNlcmlhbGl6ZXJUZXN0LCBTZXJpYWxpemVJZGVudGlmaWVyVGVzdCkgeworICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgIGNvbnN0IFRlc3RQYWlyIGlkZW50aWZpZXJzW10gPSB7CisgICAgICAvLyBOb24tZXNjYXBlZCBBU0NJSS4KKyAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0wMTIzNDY3ODkiLAorCisgICAgICAvLyBFc2NhcGVkIEFTQ0lJLgorICAgICAgeyJsb3dcXDEgXFwyIFxcMyBcXDQgXFw1IFxcNiBcXDcgXFw4IFxcOSBcXGEgXFxiIFxcYyBcXGQgXFxlIFxcZiAiLAorICAgICAgICJsb3dceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYifSwKKyAgICAgIHsibG93XFwxMCBcXDExIFxcMTIgXFwxMyBcXDE0IFxcMTUgXFwxNiBcXDE3ICIsCisgICAgICAgImxvd1x4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3In0sCisgICAgICB7Imxvd1xcMTggXFwxOSBcXDFhIFxcMWIgXFwxYyBcXDFkIFxcMWUgXFwxZiAiLAorICAgICAgICJsb3dceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiJ9LAorICAgICAgeyJkZWxcXDdmICIsCisgICAgICAgImRlbFx4N2YifSwKKyAgICAgIHsidmlzXFwgXFwhXFxcIlxcI1xcJFxcJVxcJlxcJ1xcKFxcKVxcKlxcK1xcLFxcLlxcLyIsCisgICAgICAgInZpcyAhXCIjJCUmJygpKissLi8ifSwKKyAgICAgIHsidmlzXFw6XFw7XFw8XFw9XFw+XFw/XFxAXFxbXFxcXFxcXVxcXlxcYFxce1xcfFxcfVxcfiIsCisgICAgICAgInZpczo7PD0+P0BbXFxdXmB7fH1+In0sCisKKyAgICAgIC8vIEluaXRpYWwgaHlwaGVuIGlzIGVzY2FwZWQgaWYgaXQncyB0aGUgb25seSBjaGFyYWN0ZXIuCisgICAgICB7IlxcLSIsICItIn0sCisKKyAgICAgIC8vIEluaXRpYWwgaHlwaGVuIGlzIG5vdCBlc2NhcGVkIGlmIHRoZXJlJ3MgbW9yZSBhZnRlciBpdC4KKyAgICAgICIteHl6IiwKKworICAgICAgLy8gTGVhZGluZyBudW1lcmljIGlzIGVzY2FwZWQsIHdpdGggb3Igd2l0aG91dCBpbml0aWFsIGh5cGhlbi4KKyAgICAgIHsiXFwzMCAwIiwgIjAwIn0sCisgICAgICB7IlxcMzEgMCIsICIxMCJ9LAorICAgICAgeyJcXDMyIDAiLCAiMjAifSwKKyAgICAgIHsiXFwzMyAwIiwgIjMwIn0sCisgICAgICB7IlxcMzQgMCIsICI0MCJ9LAorICAgICAgeyJcXDM1IDAiLCAiNTAifSwKKyAgICAgIHsiXFwzNiAwIiwgIjYwIn0sCisgICAgICB7IlxcMzcgMCIsICI3MCJ9LAorICAgICAgeyJcXDM4IDAiLCAiODAifSwKKyAgICAgIHsiXFwzOSAwIiwgIjkwIn0sCisgICAgICB7Ii1cXDMwIDAiLCAiLTAwIn0sCisgICAgICB7Ii1cXDMxIDAiLCAiLTEwIn0sCisgICAgICB7Ii1cXDMyIDAiLCAiLTIwIn0sCisgICAgICB7Ii1cXDMzIDAiLCAiLTMwIn0sCisgICAgICB7Ii1cXDM0IDAiLCAiLTQwIn0sCisgICAgICB7Ii1cXDM1IDAiLCAiLTUwIn0sCisgICAgICB7Ii1cXDM2IDAiLCAiLTYwIn0sCisgICAgICB7Ii1cXDM3IDAiLCAiLTcwIn0sCisgICAgICB7Ii1cXDM4IDAiLCAiLTgwIn0sCisgICAgICB7Ii1cXDM5IDAiLCAiLTkwIn0sCisKKyAgICAgIC8vIDItLCAzLSwgYW5kIDQtYnl0ZSBVVEYtOCAoaS5lLiA+PSBVKzAwODApIGlzIG5vdCBlc2NhcGVkLgorICAgICAgdTgidXRmOF8yYnl0ZS1cdTAwYTMiLAorICAgICAgdTgidXRmOF8zYnl0ZS1cdTFkMDEiLAorICAgICAgdTgidXRmOF80Ynl0ZS1cVTAwMDIwNzBlIiwKKworICAgICAgLy8gRW1iZWRkZWQgTlVMIGNoYXJhY3RlciBpcyBjaGFuZ2VkIHRvIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuCisgICAgICB7dTgiWFhcdUZGRkRZWSIsICJYWFx4YzBceDgwWVkifQorICB9OworICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgZm9yIChjb25zdCBUZXN0UGFpciYgaWRlbnRpZmllciA6IGlkZW50aWZpZXJzKSB7CisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZF9pZGVudGlmaWVyOworICAgIFNlcmlhbGl6ZXIgc2VyaWFsaXplcigmc2VyaWFsaXplZF9pZGVudGlmaWVyKTsKKyAgICBzZXJpYWxpemVyLlNlcmlhbGl6ZUlkZW50aWZpZXIoYmFzZTo6VG9rZW4oaWRlbnRpZmllci5zb3VyY2UpKTsKKyAgICBFWFBFQ1RfRVEoaWRlbnRpZmllci5zZXJpYWxpemVkLCBzZXJpYWxpemVkX2lkZW50aWZpZXIpCisgICAgICAgIDw8ICIgIFNvdXJjZTogXCIiIDw8IGlkZW50aWZpZXIuc291cmNlIDw8ICciJzsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3Nzb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2ltcGxlX3NlbGVjdG9yLmggYi9zcmMvY29iYWx0L2Nzc29tL3NpbXBsZV9zZWxlY3Rvci5oCmluZGV4IDc2OGRkZjMuLmEyY2QwOGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc2ltcGxlX3NlbGVjdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zaW1wbGVfc2VsZWN0b3IuaApAQCAtMzMsNiArMzMsNyBAQAogY2xhc3MgUHNldWRvQ2xhc3M7CiBjbGFzcyBQc2V1ZG9FbGVtZW50OwogY2xhc3MgVHlwZVNlbGVjdG9yOworY2xhc3MgVW5pdmVyc2FsU2VsZWN0b3I7CiAKIC8vIEEgc2ltcGxlIHNlbGVjdG9yIGlzIGVpdGhlciBhIHR5cGUgc2VsZWN0b3IsIHVuaXZlcnNhbCBzZWxlY3RvciwgYXR0cmlidXRlCiAvLyBzZWxlY3RvciwgY2xhc3Mgc2VsZWN0b3IsIElEIHNlbGVjdG9yLCBvciBwc2V1ZG8tY2xhc3MuCkBAIC01Niw2ICs1Nyw3IEBACiAgIGJhc2U6OlRva2VuIHRleHQoKSBjb25zdCB7IHJldHVybiB0ZXh0XzsgfQogCiAgIHZpcnR1YWwgUHNldWRvRWxlbWVudCogQXNQc2V1ZG9FbGVtZW50KCkgeyByZXR1cm4gTlVMTDsgfQorICB2aXJ0dWFsIFVuaXZlcnNhbFNlbGVjdG9yKiBBc1VuaXZlcnNhbFNlbGVjdG9yKCkgeyByZXR1cm4gTlVMTDsgfQogCiAgIHZpcnR1YWwgYm9vbCBBbHdheXNSZXF1aXJlc1J1bGVNYXRjaGluZ1ZlcmlmaWNhdGlvblZpc2l0KCkgY29uc3QgewogICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdW5pdmVyc2FsX3NlbGVjdG9yLmggYi9zcmMvY29iYWx0L2Nzc29tL3VuaXZlcnNhbF9zZWxlY3Rvci5oCmluZGV4IDg2ZWI1NmYuLjg1OGI0NGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdW5pdmVyc2FsX3NlbGVjdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS91bml2ZXJzYWxfc2VsZWN0b3IuaApAQCAtNDIsNiArNDIsNyBAQAogICBTcGVjaWZpY2l0eSBHZXRTcGVjaWZpY2l0eSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFNwZWNpZmljaXR5KDAsIDAsIDApOyB9CiAKICAgLy8gRnJvbSBTaW1wbGVTZWxlY3Rvci4KKyAgVW5pdmVyc2FsU2VsZWN0b3IqIEFzVW5pdmVyc2FsU2VsZWN0b3IoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CiAgIHZvaWQgSW5kZXhTZWxlY3RvclRyZWVOb2RlKFNlbGVjdG9yVHJlZTo6Tm9kZSogcGFyZW50X25vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yVHJlZTo6Tm9kZSogY2hpbGRfbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluYXRvclR5cGUgY29tYmluYXRvcikgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29tbWFuZF9tYXAuaCBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb21tYW5kX21hcC5oCmluZGV4IGYyOTMwOGYuLjRlMDE5OTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb21tYW5kX21hcC5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb21tYW5kX21hcC5oCkBAIC0zNiwxMiArMzYsMjAgQEAKIHRlbXBsYXRlIDxjbGFzcyBUPgogY2xhc3MgQ29tbWFuZE1hcCA6IHB1YmxpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29tbWFuZEZuPFQ+PiB7CiAgcHVibGljOgotICBleHBsaWNpdCBDb21tYW5kTWFwKFQqIGFnZW50KSA6IGFnZW50XyhhZ2VudCkge30KKyAgLy8gSWYgfGRvbWFpbnwgaXMgc3BlY2lmaWVkLCB0aGVuIGNvbW1hbmRzIGZvciB0aGF0IGRvbWFpbiBzaG91bGQgYmUgbWFwcGVkCisgIC8vIHVzaW5nIGp1c3QgdGhlIHRoZSBzaW1wbGUgbWV0aG9kIG5hbWUgKGkuZS4gIm1ldGhvZCIgbm90ICJEb21haW4ubWV0aG9kIikuCisgIGV4cGxpY2l0IENvbW1hbmRNYXAoVCogYWdlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb21haW4gPSBzdGQ6OnN0cmluZygpKQorICAgICAgOiBhZ2VudF8oYWdlbnQpLCBkb21haW5fKGRvbWFpbikge30KIAogICAvLyBDYWxscyB0aGUgbWFwcGVkIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KICAgLy8gUmV0dXJucyBhIHRydWUgaWZmIHRoZSBjb21tYW5kIG1ldGhvZCBpcyBtYXBwZWQgYW5kIGhhcyBiZWVuIHJ1bi4KICAgYm9vbCBSdW5Db21tYW5kKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKLSAgICBhdXRvIGl0ZXIgPSB0aGlzLT5maW5kKGNvbW1hbmQuR2V0TWV0aG9kKCkpOworICAgIC8vIElmIHRoZSBkb21haW4gbWF0Y2hlcywgdHJpbSBpdCBhbmQgdGhlIGRvdCBmcm9tIHRoZSBtZXRob2QgbmFtZS4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kID0KKyAgICAgICAgKGRvbWFpbl8gPT0gY29tbWFuZC5HZXREb21haW4oKSkKKyAgICAgICAgICAgID8gY29tbWFuZC5HZXRNZXRob2QoKS5zdWJzdHIoZG9tYWluXy5zaXplKCkgKyAxKQorICAgICAgICAgICAgOiBjb21tYW5kLkdldE1ldGhvZCgpOworICAgIGF1dG8gaXRlciA9IHRoaXMtPmZpbmQobWV0aG9kKTsKICAgICBpZiAoaXRlciA9PSB0aGlzLT5lbmQoKSkgcmV0dXJuIGZhbHNlOwogICAgIGF1dG8gY29tbWFuZF9mbiA9IGl0ZXItPnNlY29uZDsKICAgICAoYWdlbnRfLT4qY29tbWFuZF9mbikoY29tbWFuZCk7CkBAIC01NSw2ICs2Myw3IEBACiAKICBwcml2YXRlOgogICBUKiBhZ2VudF87CisgIHN0ZDo6c3RyaW5nIGRvbWFpbl87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYmFja2VuZApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnNvbGVfYWdlbnQuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29uc29sZV9hZ2VudC5jYwppbmRleCAzMTQzNmFiLi4zODBkMTE4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29uc29sZV9hZ2VudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29uc29sZV9hZ2VudC5jYwpAQCAtMjQsMjEgKzI0LDExIEBACiBuYW1lc3BhY2UgewogLy8gRGVmaW5pdGlvbnMgZnJvbSB0aGUgc2V0IHNwZWNpZmllZCBoZXJlOgogLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0NvbnNvbGUKLS8vCitjb25zdGV4cHIgY2hhciBrSW5zcGVjdG9yRG9tYWluW10gPSAiQ29uc29sZSI7CisKIC8vIFRoZSAiQ29uc29sZSIgcHJvdG9jb2wgZG9tYWluIGlzIGRlcHJlY2F0ZWQsIGJ1dCB3ZSBzdGlsbCB1c2UgaXQgdG8gZm9yd2FyZAogLy8gY29uc29sZSBtZXNzYWdlcyBmcm9tIG91ciBjb25zb2xlIHdlYiBBUEkgaW1wbGVtZW50YXRpb24gKHVzZWQgb25seSB3aXRoCiAvLyBtb3pqcykgdG8gYXZvaWQgYmx1cnJpbmcgdGhlIGxpbmUgdG8gdGhlICJSdW50aW1lIiBkb21haW4gaW1wbGVtZW50YXRpb24uCi0KLS8vIFBhcmFtZXRlciBmaWVsZHM6Ci1jb25zdCBjaGFyIGtNZXNzYWdlVGV4dFtdID0gIm1lc3NhZ2UudGV4dCI7Ci1jb25zdCBjaGFyIGtNZXNzYWdlTGV2ZWxbXSA9ICJtZXNzYWdlLmxldmVsIjsKLWNvbnN0IGNoYXIga01lc3NhZ2VTb3VyY2VbXSA9ICJtZXNzYWdlLnNvdXJjZSI7Ci0KLS8vIENvbnN0YW50IHBhcmFtZXRlciB2YWx1ZXM6Ci1jb25zdCBjaGFyIGtNZXNzYWdlU291cmNlVmFsdWVbXSA9ICJjb25zb2xlLWFwaSI7Ci0KLS8vIEV2ZW50czoKLWNvbnN0IGNoYXIga01lc3NhZ2VBZGRlZFtdID0gIkNvbnNvbGUubWVzc2FnZUFkZGVkIjsKIH0gIC8vIG5hbWVzcGFjZQogCiBDb25zb2xlQWdlbnQ6Okxpc3RlbmVyOjpMaXN0ZW5lcihkb206OkNvbnNvbGUqIGNvbnNvbGUsCkBAIC01MywxNCArNDMsMTYgQEAKIENvbnNvbGVBZ2VudDo6Q29uc29sZUFnZW50KERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwgZG9tOjpDb25zb2xlKiBjb25zb2xlKQogICAgIDogZGlzcGF0Y2hlcl8oZGlzcGF0Y2hlciksCiAgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoY29uc29sZV9saXN0ZW5lcl8oY29uc29sZSwgdGhpcykpLAotICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNvbW1hbmRzXyh0aGlzKSkgeworICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNvbW1hbmRzXyh0aGlzLCBrSW5zcGVjdG9yRG9tYWluKSkgewogICBEQ0hFQ0soZGlzcGF0Y2hlcl8pOwotICBjb21tYW5kc19bIkNvbnNvbGUuZGlzYWJsZSJdID0gJkNvbnNvbGVBZ2VudDo6RGlzYWJsZTsKLSAgY29tbWFuZHNfWyJDb25zb2xlLmVuYWJsZSJdID0gJkNvbnNvbGVBZ2VudDo6RW5hYmxlOworICBjb21tYW5kc19bImRpc2FibGUiXSA9ICZDb25zb2xlQWdlbnQ6OkRpc2FibGU7CisgIGNvbW1hbmRzX1siZW5hYmxlIl0gPSAmQ29uc29sZUFnZW50OjpFbmFibGU7CiAKLSAgZGlzcGF0Y2hlcl8tPkFkZERvbWFpbigiQ29uc29sZSIsIGNvbW1hbmRzXy5CaW5kKCkpOworICBkaXNwYXRjaGVyXy0+QWRkRG9tYWluKGtJbnNwZWN0b3JEb21haW4sIGNvbW1hbmRzXy5CaW5kKCkpOwogfQogCitDb25zb2xlQWdlbnQ6On5Db25zb2xlQWdlbnQoKSB7IGRpc3BhdGNoZXJfLT5SZW1vdmVEb21haW4oa0luc3BlY3RvckRvbWFpbik7IH0KKwogdm9pZCBDb25zb2xlQWdlbnQ6OkRpc2FibGUoY29uc3QgQ29tbWFuZCYgY29tbWFuZCkgeyBjb21tYW5kLlNlbmRSZXNwb25zZSgpOyB9CiAKIHZvaWQgQ29uc29sZUFnZW50OjpFbmFibGUoY29uc3QgQ29tbWFuZCYgY29tbWFuZCkgeyBjb21tYW5kLlNlbmRSZXNwb25zZSgpOyB9CkBAIC02OCwxMCArNjAsMTEgQEAKIHZvaWQgQ29uc29sZUFnZW50OjpPbk1lc3NhZ2VBZGRlZChjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb206OkNvbnNvbGU6OkxldmVsIGxldmVsKSB7CiAgIEpTT05PYmplY3QgcGFyYW1zKG5ldyBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7Ci0gIHBhcmFtcy0+U2V0U3RyaW5nKGtNZXNzYWdlVGV4dCwgdGV4dCk7Ci0gIHBhcmFtcy0+U2V0U3RyaW5nKGtNZXNzYWdlTGV2ZWwsIGRvbTo6Q29uc29sZTo6R2V0TGV2ZWxBc1N0cmluZyhsZXZlbCkpOwotICBwYXJhbXMtPlNldFN0cmluZyhrTWVzc2FnZVNvdXJjZSwga01lc3NhZ2VTb3VyY2VWYWx1ZSk7Ci0gIGRpc3BhdGNoZXJfLT5TZW5kRXZlbnQoa01lc3NhZ2VBZGRlZCwgcGFyYW1zKTsKKyAgcGFyYW1zLT5TZXRTdHJpbmcoIm1lc3NhZ2UudGV4dCIsIHRleHQpOworICBwYXJhbXMtPlNldFN0cmluZygibWVzc2FnZS5sZXZlbCIsIGRvbTo6Q29uc29sZTo6R2V0TGV2ZWxBc1N0cmluZyhsZXZlbCkpOworICBwYXJhbXMtPlNldFN0cmluZygibWVzc2FnZS5zb3VyY2UiLCAiY29uc29sZS1hcGkiKTsKKyAgZGlzcGF0Y2hlcl8tPlNlbmRFdmVudChzdGQ6OnN0cmluZyhrSW5zcGVjdG9yRG9tYWluKSArICIubWVzc2FnZUFkZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYmFja2VuZApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnNvbGVfYWdlbnQuaCBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb25zb2xlX2FnZW50LmgKaW5kZXggNzhlYTZkOS4uMzJmN2ExMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnNvbGVfYWdlbnQuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29uc29sZV9hZ2VudC5oCkBAIC0zMyw2ICszMyw3IEBACiBjbGFzcyBDb25zb2xlQWdlbnQgewogIHB1YmxpYzoKICAgQ29uc29sZUFnZW50KERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwgZG9tOjpDb25zb2xlKiBjb25zb2xlKTsKKyAgfkNvbnNvbGVBZ2VudCgpOwogCiAgcHJpdmF0ZToKICAgY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgZG9tOjpDb25zb2xlOjpMaXN0ZW5lciB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29udGVudC9jc3NfYWdlbnQuanMgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29udGVudC9jc3NfYWdlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyMWI3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L2Nzc19hZ2VudC5qcwpAQCAtMCwwICsxLDEzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZnVuY3Rpb24oZGVidWdTY3JpcHRSdW5uZXIpIHsKKworLy8gQXR0YWNoIG1ldGhvZHMgdG8gaGFuZGxlIGNvbW1hbmRzIGluIHRoZSAnQ1NTJyBkZXZ0b29scyBkb21haW4uCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvQ1NTCit2YXIgY29tbWFuZHMgPSBkZWJ1Z1NjcmlwdFJ1bm5lci5DU1MgPSB7fTsKKworLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0NTUyNtZXRob2QtZ2V0Q29tcHV0ZWRTdHlsZUZvck5vZGUKK2NvbW1hbmRzLmdldENvbXB1dGVkU3R5bGVGb3JOb2RlID0gZnVuY3Rpb24ocGFyYW1zKSB7CisgIHZhciBub2RlID0gZGVidWdTY3JpcHRSdW5uZXIuRE9NLl9maW5kTm9kZShwYXJhbXMpOworICByZXR1cm4gJ3t9JzsKK30KKworLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0NTUyNtZXRob2QtZ2V0SW5saW5lU3R5bGVzRm9yTm9kZQorY29tbWFuZHMuZ2V0SW5saW5lU3R5bGVzRm9yTm9kZSA9IGZ1bmN0aW9uKHBhcmFtcykgeworICB2YXIgbm9kZSA9IGRlYnVnU2NyaXB0UnVubmVyLkRPTS5fZmluZE5vZGUocGFyYW1zKTsKKyAgcmV0dXJuICd7fSc7Cit9CisKKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9DU1MjbWV0aG9kLWdldE1hdGNoZWRTdHlsZXNGb3JOb2RlCitjb21tYW5kcy5nZXRNYXRjaGVkU3R5bGVzRm9yTm9kZSA9IGZ1bmN0aW9uKHBhcmFtcykgeworICB2YXIgbm9kZSA9IGRlYnVnU2NyaXB0UnVubmVyLkRPTS5fZmluZE5vZGUocGFyYW1zKTsKKyAgaWYgKCFub2RlKSB7CisgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtlcnJvcjoge21lc3NhZ2U6ICdJbnZhbGlkIE5vZGUnfX0pOworICB9CisKKyAgdmFyIHJlc3VsdCA9IHt9OworICByZXN1bHQubWF0Y2hlZENTU1J1bGVzID0gX21hdGNoZWRSdWxlcyhub2RlKTsKKyAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7Cit9CisKK3ZhciBfbWF0Y2hlZFJ1bGVzID0gZnVuY3Rpb24obm9kZSkgeworICAvLyBUT0RPOiBVc2UgZGVidWdTY3JpcHRSdW5uZXIgdG8gZ2V0IHRoZSBtYXRjaGVzIGNhY2hlZCBpbiBDKysuCisgIHJldHVybiBfYWxsUnVsZXMoKS5yZWR1Y2UoCisgICAgICBmdW5jdGlvbihhY2N1bSwgY3NzUnVsZSkgeworICAgICAgICAvLyBUT0RPOiBSZXBvcnQgb3RoZXIgcnVsZSB0eXBlcworICAgICAgICBpZiAoY3NzUnVsZS50eXBlID09PSBDU1NSdWxlLlNUWUxFX1JVTEUKKyAgICAgICAgICAgICYmIG5vZGUubWF0Y2hlcyhjc3NSdWxlLnNlbGVjdG9yVGV4dCkpIHsKKyAgICAgICAgICBhY2N1bS5wdXNoKG5ldyBkZXZ0b29scy5SdWxlTWF0Y2goY3NzUnVsZSwgbm9kZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhY2N1bTsKKyAgICAgIH0sIFtdKTsKK30KKworLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgQ1NTUnVsZSBvYmplY3RzIGZyb20gYWxsIHN0eWxlc2hlZXRzIGluIHRoZSBkb2N1bWVudC4KK3ZhciBfYWxsUnVsZXMgPSBmdW5jdGlvbigpIHsKKyAgLy8gQXJyYXkuc2xpY2UoKSBjb252ZXJ0cyBkb2N1bWVudC5zdHlsZVNoZWV0cyB0byBhIHByb3BlciBhcnJheSwgd2hpY2ggd2UgY2FuCisgIC8vIGl0ZXJhdGUgd2l0aCByZWR1Y2UoKS4KKyAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQuc3R5bGVTaGVldHMpLnJlZHVjZSgKKyAgICAgIGZ1bmN0aW9uKGFjY3VtLCBzdHlsZVNoZWV0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgLy8gRG8gdGhlIHNsaWNlKCkgdHJpY2sgdG8gZ2V0IHRoZSBjc3NSdWxlcyBmcm9tIGVhY2ggc3R5bGVTaGVldCBhcyBhbgorICAgICAgICAgIC8vIGFycmF5IHRoYXQgd2UgY29uY2F0KCkgaW50byBhIHNpbmdsZSByZWR1Y2VkIGFycmF5IHdpdGggYWxsIHJ1bGVzLgorICAgICAgICAgIHJldHVybiBhY2N1bS5jb25jYXQoW10uc2xpY2UuY2FsbChzdHlsZVNoZWV0LmNzc1J1bGVzKSk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAvLyBDU1AgYmxvY2tzIHJlYWRpbmcgc29tZSBydWxlcywgYnV0IHRoZSBkZWJ1Z2dlciBzaG91bGQgYmUgYWxsb3dlZC4KKyAgICAgICAgICBjb25zb2xlLmVycm9yKHN0eWxlU2hlZXQuaHJlZiwgJ1xuJywgZSk7CisgICAgICAgICAgcmV0dXJuIGFjY3VtOworICAgICAgICB9CisgICAgICB9LCBbXSk7Cit9CisKKy8vIE5hbWVzcGFjZSBmb3IgY29uc3RydWN0b3JzIG9mIHR5cGVzIGRlZmluZWQgaW4gdGhlIERldnRvb2xzIHByb3RvY29sLgordmFyIGRldnRvb2xzID0ge307CisKKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9DU1MjdHlwZS1SdWxlTWF0Y2gKK2RldnRvb2xzLlJ1bGVNYXRjaCA9IGZ1bmN0aW9uKGNzc1J1bGUsIG5vZGUpIHsKKyAgdGhpcy5ydWxlID0gbmV3IGRldnRvb2xzLkNTU1J1bGUoY3NzUnVsZSk7CisgIHRoaXMubWF0Y2hpbmdTZWxlY3RvcnMgPSBbXTsKKworICB2YXIgc2VsZWN0b3JzID0gdGhpcy5ydWxlLnNlbGVjdG9yTGlzdC5zZWxlY3RvcnM7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgaWYgKG5vZGUubWF0Y2hlcyhzZWxlY3RvcnNbaV0udGV4dCkpIHsKKyAgICAgIHRoaXMubWF0Y2hpbmdTZWxlY3RvcnMucHVzaChpKTsKKyAgICB9CisgIH0KK30KKworLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0NTUyN0eXBlLUNTU1J1bGUKK2RldnRvb2xzLkNTU1J1bGUgPSBmdW5jdGlvbihjc3NSdWxlKSB7CisgIC8vIFRPRE86IHRoaXMuc3R5bGVTaGVldElkCisgIHRoaXMub3JpZ2luID0gJ3JlZ3VsYXInOyAvLyBUT0RPCisgIHRoaXMuc2VsZWN0b3JMaXN0ID0gbmV3IGRldnRvb2xzLlNlbGVjdG9yTGlzdChjc3NSdWxlLnNlbGVjdG9yVGV4dCk7CisgIGlmIChjc3NSdWxlLnR5cGUgPT09IENTU1J1bGUuU1RZTEVfUlVMRSkgeworICAgIHRoaXMuc3R5bGUgPSBuZXcgZGV2dG9vbHMuQ1NTU3R5bGUoY3NzUnVsZS5zdHlsZSk7CisgIH0KK30KKworLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0NTUyN0eXBlLVNlbGVjdG9yTGlzdAorZGV2dG9vbHMuU2VsZWN0b3JMaXN0ID0gZnVuY3Rpb24oY3NzU2VsZWN0b3JUZXh0KSB7CisgIHRoaXMudGV4dCA9IGNzc1NlbGVjdG9yVGV4dDsKKyAgdGhpcy5zZWxlY3RvcnMgPSBjc3NTZWxlY3RvclRleHQuc3BsaXQoJywnKS5tYXAoCisgICAgICBzZWxlY3RvciA9PiBuZXcgZGV2dG9vbHMuVmFsdWUoc2VsZWN0b3IudHJpbSgpKSk7Cit9CisKKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9DU1MjdHlwZS1WYWx1ZQorZGV2dG9vbHMuVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgeworICB0aGlzLnRleHQgPSB2YWx1ZTsKKyAgLy8gVE9ETzogdGhpcy5yYW5nZQorfQorCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvQ1NTI3R5cGUtQ1NTU3R5bGUKK2RldnRvb2xzLkNTU1N0eWxlID0gZnVuY3Rpb24oY3NzU3R5bGVEZWNsKSB7CisgIHRoaXMuc2hvcnRoYW5kRW50cmllcyA9IFtdOyAgLy8gVE9ETworICB0aGlzLnRleHQgPSBjc3NTdHlsZURlY2wuY3NzVGV4dDsKKyAgdGhpcy5jc3NQcm9wZXJ0aWVzID0gW10uc2xpY2UuYXBwbHkoY3NzU3R5bGVEZWNsKS5tYXAoCisgICAgICBwcm9wZXJ0eSA9PiBuZXcgZGV2dG9vbHMuQ1NTUHJvcGVydHkoY3NzU3R5bGVEZWNsLCBwcm9wZXJ0eSkpOworfQorCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvQ1NTI3R5cGUtQ1NTUHJvcGVydHkKK2RldnRvb2xzLkNTU1Byb3BlcnR5ID0gZnVuY3Rpb24oY3NzU3R5bGVEZWNsLCBwcm9wZXJ0eSkgeworICB0aGlzLm5hbWUgPSBwcm9wZXJ0eTsKKyAgdGhpcy52YWx1ZSA9IGNzc1N0eWxlRGVjbC5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTsKKyAgLy8gdGhpcy5pbXBvcnRhbnQgPSBjc3NTdHlsZURlY2wuZ2V0UHJvcGVydHlQcmlvcml0eShwcm9wZXJ0eSkgPT09ICdpbXBvcnRhbnQnOworfQorCisvLyBQb2x5ZmlsbCBFbGVtZW50Lm1hdGNoZXMoKQorLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlcworRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgfHwgZnVuY3Rpb24ocykgeworICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocyksIGkgPSBtYXRjaGVzLmxlbmd0aDsKKyAgd2hpbGUgKC0taSA+PSAwICYmIG1hdGNoZXMuaXRlbShpKSAhPSB0aGlzKSB7fQorICByZXR1cm4gaSA+IC0xOworfTsKKworLy8gVE9ETzogUGFzcyBkZWJ1Z1NjcmlwdFJ1bm5lciBmcm9tIEMrKyBpbnN0ZWFkIG9mIGdldHRpbmcgaXQgZnJvbSB0aGUgd2luZG93LgorfSkod2luZG93LmRlYnVnU2NyaXB0UnVubmVyKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L2RvbS5qcyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L2RvbS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5NWVlMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29udGVudC9kb20uanMKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBKYXZhU2NyaXB0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBDaHJvbWUgZGVidWdnaW5nIHByb3RvY29sIERPTSBkb21haW46Ci0vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvRE9NCi0KLWRldnRvb2xzQmFja2VuZC5kb20gPSB7fTsKLQotLy8gQWxpYXMgdG8gbWF0Y2ggdGhlIHVwcGVyY2FzZSBkb21haW4gb2YgdGhlIGRldnRvb2xzIHByb3RvY29sLgotZGV2dG9vbHNCYWNrZW5kLkRPTSA9IGRldnRvb2xzQmFja2VuZC5kb207Ci0KLS8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgTm9kZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZG9jdW1lbnQgbm9kZSwKLS8vIGluY2x1ZGluZyBpdHMgY2hpbGRyZW4gdXAgdG8gYSBkZWZhdWx0IGRlcHRoLgotLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL0RPTSNtZXRob2QtZ2V0RG9jdW1lbnQKLWRldnRvb2xzQmFja2VuZC5kb20uZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbihwYXJhbXMpIHsKLSAgdmFyIHJlc3VsdCA9IHt9OwotICByZXN1bHQucm9vdCA9IHRoaXMuZ2V0Tm9kZVdpdGhDaGlsZHJlbihkb2N1bWVudCwgMik7Ci0gIHJlc3VsdC5yb290LmRvY3VtZW50VVJMID0gZG9jdW1lbnQuVVJMOwotICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhcnJheSBvZiBOb2RlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgY2hpbGRyZW4gb2YgdGhlCi0vLyBzcGVjaWZpZWQgbm9kZSwgYW5kIHJldHVybnMgdGhlbSB2aWEgYW4gZXZlbnQuIEEgZGVwdGggbWF5IGJlIHNwZWNpZmllZCwKLS8vIHdoZXJlIGEgbmVnYXRpdmUgZGVwdGggbWVhbnMgdG8gcmV0dXJuIGFsbCBkZXNjZW5kYW50cy4gSWYgbm8gZGVwdGggaXMKLS8vIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgMSwgYSBzaW5nbGUgbGV2ZWwuCi0vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvRE9NI21ldGhvZC1yZXF1ZXN0Q2hpbGROb2RlcwotZGV2dG9vbHNCYWNrZW5kLmRvbS5yZXF1ZXN0Q2hpbGROb2RlcyA9IGZ1bmN0aW9uKHBhcmFtcykgewotICB2YXIgbm9kZSA9IHRoaXMuZmluZE5vZGUocGFyYW1zKTsKLSAgdmFyIGRlcHRoID0gcGFyYW1zLmRlcHRoIHx8IDE7Ci0gIHZhciByZXN1bHQgPSB7fTsKLSAgcmVzdWx0LnBhcmVudElkID0gcGFyYW1zLm5vZGVJZDsKLSAgcmVzdWx0Lm5vZGVzID0gdGhpcy5nZXRDaGlsZE5vZGVzKG5vZGUsIGRlcHRoKTsKLQotICAvLyBTZW5kIHRoZSByZXN1bHQgdmlhIGFuIGV2ZW50LCBhbmQgYW4gZW1wdHkgcmVzcG9uc2UuCi0gIGRldnRvb2xzQmFja2VuZC5zZW5kRXZlbnQoJ0RPTS5zZXRDaGlsZE5vZGVzJywgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7Ci0gIHJldHVybiAne30nOwotfQotCi0vLyBGaW5kcyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIGEgcmVtb3RlIG9iamVjdElkLiBBbHNvIHNlbmRzIGFsbCBub2RlcyBvbgotLy8gdGhlIHBhdGggZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSB0byB0aGUgcm9vdCBhcyBhIHNlcmllcyBvZiBzZXRDaGlsZE5vZGVzCi0vLyBldmVudHMuCi0vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvRE9NI21ldGhvZC1yZXF1ZXN0Tm9kZQotZGV2dG9vbHNCYWNrZW5kLmRvbS5yZXF1ZXN0Tm9kZSA9IGZ1bmN0aW9uKHBhcmFtcykgewotICB2YXIgbm9kZSA9IHRoaXMuZmluZE5vZGUocGFyYW1zKTsKLSAgdmFyIG5vZGVJbmZvID0gbmV3IHRoaXMuTm9kZShub2RlKTsKLSAgdmFyIHJlc3VsdCA9IHt9OwotICByZXN1bHQubm9kZUlkID0gbm9kZUluZm8ubm9kZUlkOwotCi0gIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7Ci0gIHdoaWxlIChwYXJlbnQpIHsKLSAgICB2YXIgcGFyZW50SW5mbyA9IG5ldyB0aGlzLk5vZGUocGFyZW50KTsKLSAgICB2YXIgcGFyYW1zID0ge307Ci0gICAgcGFyYW1zLnBhcmVudElkID0gcGFyZW50SW5mby5ub2RlSWQ7Ci0gICAgcGFyYW1zLm5vZGVzID0gW107Ci0gICAgcGFyYW1zLm5vZGVzLnB1c2gobm9kZUluZm8pOwotICAgIGRldnRvb2xzQmFja2VuZC5zZW5kRXZlbnQoJ0RPTS5zZXRDaGlsZE5vZGVzJywgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSk7Ci0gICAgbm9kZSA9IHBhcmVudDsKLSAgICBub2RlSW5mbyA9IHBhcmVudEluZm87Ci0gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7Ci0gIH0KLQotICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTsKLX0KLQotLy8gUmV0dXJucyBhIFJ1bnRpbWUuUmVtb3RlT2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlLgotLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL0RPTSNtZXRob2QtcmVzb2x2ZU5vZGUKLWRldnRvb2xzQmFja2VuZC5kb20ucmVzb2x2ZU5vZGUgPSBmdW5jdGlvbihwYXJhbXMpIHsKLSAgdmFyIG5vZGUgPSB0aGlzLmZpbmROb2RlKHBhcmFtcyk7Ci0gIHZhciByZXR1cm5CeVZhbHVlID0gdHJ1ZTsKLSAgdmFyIHJlc3VsdCA9IHt9OwotICByZXN1bHQub2JqZWN0ID0gbmV3IGRldnRvb2xzQmFja2VuZC5ydW50aW1lLlJlbW90ZU9iamVjdCgKLSAgICAgICAgbm9kZSwgcGFyYW1zLm9iamVjdEdyb3VwLCByZXR1cm5CeVZhbHVlKTsKLQotICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTsKLX0KLQotLy8gUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IG9mIGEgbm9kZS4gVXNlZCBmb3Igbm9kZSBoaWdobGlnaHRpbmcuCi1kZXZ0b29sc0JhY2tlbmQuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9IGZ1bmN0aW9uKHBhcmFtcykgewotICB2YXIgbm9kZSA9IHRoaXMuZmluZE5vZGUocGFyYW1zKTsKLSAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpOwotfQotCi0vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgTm9kZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzcGVjaWZpZWQgbm9kZS4KLS8vIEFkZHMgdGhlIG5vZGUncyBjaGlsZHJlbiB1cCB0byB0aGUgc3BlY2lmaWVkIGRlcHRoLiBBIG5lZ2F0aXZlIGRlcHRoIHdpbGwKLS8vIGNhdXNlIGFsbCBkZXNjZW5kYW50cyB0byBiZSBhZGRlZC4KLWRldnRvb2xzQmFja2VuZC5kb20uZ2V0Tm9kZVdpdGhDaGlsZHJlbiA9IGZ1bmN0aW9uKG5vZGUsIGRlcHRoKSB7Ci0gIHZhciByZXN1bHQgPSBuZXcgdGhpcy5Ob2RlKG5vZGUpOwotICBpZiAoZGVwdGggIT0gMCkgewotICAgIHJlc3VsdC5jaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGROb2Rlcyhub2RlLCBkZXB0aCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBOb2RlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgY2hpbGRyZW4KLS8vIG9mIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmVjdXJzaW5nIG9uIGVhY2ggb24gdXAgdG8gdGhlIHNwZWNpZmllZCBkZXB0aC4KLWRldnRvb2xzQmFja2VuZC5kb20uZ2V0Q2hpbGROb2RlcyA9IGZ1bmN0aW9uKG5vZGUsIGRlcHRoKSB7Ci0gIGlmICghbm9kZS5jaGlsZE5vZGVzKSB7Ci0gICAgcmV0dXJuIFtdOwotICB9Ci0KLSAgdmFyIGNoaWxkcmVuID0gW107Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW2ldOwotICAgIGlmICghdGhpcy5ub2RlSXNJZ25vcmFibGUoY2hpbGQpKSB7Ci0gICAgICBjaGlsZHJlbi5wdXNoKHRoaXMuZ2V0Tm9kZVdpdGhDaGlsZHJlbihjaGlsZCwgZGVwdGggLSAxKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjaGlsZHJlbjsKLX0KLQotLy8gRmluZHMgYSBub2RlIHNwZWNpZmllZCBieSBlaXRoZXIgbm9kZUlkIG9yIG9iamVjdElkICh0byBnZXQgYSBub2RlCi0vLyBmcm9tIGl0cyBjb3JyZXNwb25kaW5nIHJlbW90ZSBvYmplY3QpLgotZGV2dG9vbHNCYWNrZW5kLmRvbS5maW5kTm9kZSA9IGZ1bmN0aW9uKHBhcmFtcykgewotICBpZiAocGFyYW1zLm5vZGVJZCAhPSBudWxsKSB7Ci0gICAgcmV0dXJuIHRoaXMubm9kZVN0b3JlW3BhcmFtcy5ub2RlSWRdOwotICB9Ci0KLSAgaWYgKHBhcmFtcy5vYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgcmV0dXJuIGRldnRvb2xzQmFja2VuZC5ydW50aW1lLmdldE9iamVjdChwYXJhbXMub2JqZWN0SWQpOwotICB9Ci0KLSAgLy8gRWl0aGVyIG5vZGVJZCBvciBvYmplY3RJZCBtdXN0IGJlIHNwZWNpZmllZC4KLSAgcmV0dXJuIG51bGw7Ci19Ci0KLS8vIEFkZHMgYSBub2RlIHRvIHRoZSBpbnRlcm5hbCBub2RlIHN0b3JlIGFuZCByZXR1cm5zIGEgdW5pcXVlIGlkIHRoYXQgY2FuCi0vLyBiZSB1c2VkIHRvIGFjY2VzcyBpdCBhZ2Fpbi4KLWRldnRvb2xzQmFja2VuZC5kb20uYWRkTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHsKLSAgLy8gSWYgd2UndmUgYWxyZWFkeSBhZGRlZCB0aGlzIG5vZGUsIHRoZW4gdXNlIHRoZSBzYW1lIG5vZGVJZC4KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGVTdG9yZS5sZW5ndGg7IGkrKykgewotICAgIGlmICh0aGlzLm5vZGVTdG9yZVtpXSA9PT0gbm9kZSkgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0KLSAgdmFyIG5vZGVJZCA9IHRoaXMubmV4dE5vZGVJZCsrOwotICB0aGlzLm5vZGVTdG9yZVtub2RlSWRdID0gbm9kZTsKLSAgcmV0dXJuIG5vZGVJZDsKLX0KLQotLy8gV2hldGhlciBhIG5vZGUgaXMgaWdub3JhYmxlLiBXZSBpZ25vcmUgdGV4dCBub2RlcyB3aXRoIHdoaXRlLXNwYWNlIG9ubHkKLS8vIGNvbnRlbnQsIGFzIHRoZXkganVzdCBjbHV0dGVyIHVwIHRoZSBET00gdHJlZS4KLWRldnRvb2xzQmFja2VuZC5kb20ubm9kZUlzSWdub3JhYmxlID0gZnVuY3Rpb24obm9kZSkgewotICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJgotICAgICAgISgvW15cdFxuXHIgXS8udGVzdChub2RlLnRleHRDb250ZW50KSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBuZXcgTm9kZSBvYmplY3QsIHdoaWNoIGlzIHRoZSB0eXBlIHVzZWQgdG8gcmV0dXJuIGluZm9ybWF0aW9uCi0vLyBhYm91dCBub2RlcyB0byBkZXZ0b29scy4gQWxsIE5vZGUgb2JqZWN0cyBhcmUgYWRkZWQgdG8gfG5vZGVTdG9yZXwsCi0vLyBzbyB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgbGF0ZXIgdmlhIHxub2RlSWR8LgotZGV2dG9vbHNCYWNrZW5kLmRvbS5Ob2RlID0gZnVuY3Rpb24obm9kZSkgewotICB0aGlzLm5vZGVJZCA9IGRldnRvb2xzQmFja2VuZC5kb20uYWRkTm9kZShub2RlKTsKLSAgdGhpcy5sb2NhbE5hbWUgPSBub2RlLm5vZGVOYW1lOwotICB0aGlzLm5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZTsKLSAgdGhpcy5ub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7Ci0gIHRoaXMubm9kZVZhbHVlID0gbm9kZS5ub2RlVmFsdWUgfHwgIiI7Ci0gIHRoaXMuY2hpbGROb2RlQ291bnQgPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOwotCi0gIGlmIChub2RlLmF0dHJpYnV0ZXMpIHsKLSAgICB0aGlzLmF0dHJpYnV0ZXMgPSBbXTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgdGhpcy5hdHRyaWJ1dGVzLnB1c2gobm9kZS5hdHRyaWJ1dGVzW2ldLm5hbWUpOwotICAgICAgdGhpcy5hdHRyaWJ1dGVzLnB1c2gobm9kZS5hdHRyaWJ1dGVzW2ldLnZhbHVlKTsKLSAgICB9Ci0gIH0KLX0KLQotZGV2dG9vbHNCYWNrZW5kLmRvbS5ub2RlU3RvcmUgPSBbXTsKLWRldnRvb2xzQmFja2VuZC5kb20ubmV4dE5vZGVJZCA9IDA7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29udGVudC9kb21fYWdlbnQuanMgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29udGVudC9kb21fYWdlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5OWI3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L2RvbV9hZ2VudC5qcwpAQCAtMCwwICsxLDE4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZnVuY3Rpb24oZGVidWdTY3JpcHRSdW5uZXIpIHsKKworLy8gQXR0YWNoIG1ldGhvZHMgdG8gaGFuZGxlIGNvbW1hbmRzIGluIHRoZSAnRE9NJyBkZXZ0b29scyBkb21haW4uCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvRE9NCit2YXIgY29tbWFuZHMgPSBkZWJ1Z1NjcmlwdFJ1bm5lci5ET00gPSB7fTsKKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBOb2RlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBkb2N1bWVudCBub2RlLAorLy8gaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiB1cCB0byBhIGRlZmF1bHQgZGVwdGguCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvRE9NI21ldGhvZC1nZXREb2N1bWVudAorY29tbWFuZHMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbihwYXJhbXMpIHsKKyAgdmFyIHJlc3VsdCA9IHt9OworICByZXN1bHQucm9vdCA9IF9nZXROb2RlV2l0aENoaWxkcmVuKGRvY3VtZW50LCAyKTsKKyAgcmVzdWx0LnJvb3QuZG9jdW1lbnRVUkwgPSBkb2N1bWVudC5VUkw7CisgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXN1bHQpOworfQorCisvLyBDcmVhdGVzIGFuIGFycmF5IG9mIE5vZGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUKKy8vIHNwZWNpZmllZCBub2RlLCBhbmQgcmV0dXJucyB0aGVtIHZpYSBhbiBldmVudC4gQSBkZXB0aCBtYXkgYmUgc3BlY2lmaWVkLAorLy8gd2hlcmUgYSBuZWdhdGl2ZSBkZXB0aCBtZWFucyB0byByZXR1cm4gYWxsIGRlc2NlbmRhbnRzLiBJZiBubyBkZXB0aCBpcworLy8gc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyAxLCBhIHNpbmdsZSBsZXZlbC4KKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sLzEtMy9ET00jbWV0aG9kLXJlcXVlc3RDaGlsZE5vZGVzCitjb21tYW5kcy5yZXF1ZXN0Q2hpbGROb2RlcyA9IGZ1bmN0aW9uKHBhcmFtcykgeworICB2YXIgbm9kZSA9IGNvbW1hbmRzLl9maW5kTm9kZShwYXJhbXMpOworICB2YXIgZGVwdGggPSBwYXJhbXMuZGVwdGggfHwgMTsKKyAgdmFyIHJlc3VsdCA9IHt9OworICByZXN1bHQucGFyZW50SWQgPSBwYXJhbXMubm9kZUlkOworICByZXN1bHQubm9kZXMgPSBfZ2V0Q2hpbGROb2Rlcyhub2RlLCBkZXB0aCk7CisKKyAgLy8gU2VuZCB0aGUgcmVzdWx0IHZpYSBhbiBldmVudCwgYW5kIGFuIGVtcHR5IHJlc3BvbnNlLgorICBkZWJ1Z1NjcmlwdFJ1bm5lci5zZW5kRXZlbnQoJ0RPTS5zZXRDaGlsZE5vZGVzJywgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7CisgIHJldHVybiAne30nOworfQorCisvLyBGaW5kcyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIGEgcmVtb3RlIG9iamVjdElkLiBBbHNvIHNlbmRzIGFsbCBub2RlcyBvbgorLy8gdGhlIHBhdGggZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSB0byB0aGUgcm9vdCBhcyBhIHNlcmllcyBvZiBzZXRDaGlsZE5vZGVzCisvLyBldmVudHMuCisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvRE9NI21ldGhvZC1yZXF1ZXN0Tm9kZQorY29tbWFuZHMucmVxdWVzdE5vZGUgPSBmdW5jdGlvbihwYXJhbXMpIHsKKyAgdmFyIG5vZGUgPSBjb21tYW5kcy5fZmluZE5vZGUocGFyYW1zKTsKKyAgdmFyIG5vZGVJbmZvID0gbmV3IGRldnRvb2xzLk5vZGUobm9kZSk7CisgIHZhciByZXN1bHQgPSB7fTsKKyAgcmVzdWx0Lm5vZGVJZCA9IG5vZGVJbmZvLm5vZGVJZDsKKworICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOworICB3aGlsZSAocGFyZW50KSB7CisgICAgdmFyIHBhcmVudEluZm8gPSBuZXcgZGV2dG9vbHMuTm9kZShwYXJlbnQpOworICAgIHZhciBwYXJhbXMgPSB7fTsKKyAgICBwYXJhbXMucGFyZW50SWQgPSBwYXJlbnRJbmZvLm5vZGVJZDsKKyAgICBwYXJhbXMubm9kZXMgPSBbXTsKKyAgICBwYXJhbXMubm9kZXMucHVzaChub2RlSW5mbyk7CisgICAgZGVidWdTY3JpcHRSdW5uZXIuc2VuZEV2ZW50KCdET00uc2V0Q2hpbGROb2RlcycsIEpTT04uc3RyaW5naWZ5KHBhcmFtcykpOworICAgIG5vZGUgPSBwYXJlbnQ7CisgICAgbm9kZUluZm8gPSBwYXJlbnRJbmZvOworICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOworICB9CisKKyAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7Cit9CisKKy8vIFJldHVybnMgYSBSdW50aW1lLlJlbW90ZU9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGEgbm9kZS4KKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sLzEtMy9ET00jbWV0aG9kLXJlc29sdmVOb2RlCitjb21tYW5kcy5yZXNvbHZlTm9kZSA9IGZ1bmN0aW9uKHBhcmFtcykgeworICB2YXIgbm9kZSA9IGNvbW1hbmRzLl9maW5kTm9kZShwYXJhbXMpOworICB2YXIgcmVzdWx0ID0ge307CisgIHJlc3VsdC5vYmplY3QgPQorICAgICAgZGVidWdTY3JpcHRSdW5uZXIuY3JlYXRlUmVtb3RlT2JqZWN0KG5vZGUsIHBhcmFtcy5vYmplY3RHcm91cCk7CisKKyAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiBhIG5vZGUuIFRoaXMgcHNldWRvLWNvbW1hbmQgaW4gdGhlIERPTSBkb21haW4gaXMKKy8vIGEgaGVscGVyIGZvciB0aGUgQysrIHxET01BZ2VudDo6SGlnaGxpZ2h0Tm9kZXwuCitjb21tYW5kcy5fZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID0gZnVuY3Rpb24ocGFyYW1zKSB7CisgIHZhciBub2RlID0gY29tbWFuZHMuX2ZpbmROb2RlKHBhcmFtcyk7CisgIHJldHVybiBKU09OLnN0cmluZ2lmeShub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTsKK30KKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIE5vZGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLyBBZGRzIHRoZSBub2RlJ3MgY2hpbGRyZW4gdXAgdG8gdGhlIHNwZWNpZmllZCBkZXB0aC4gQSBuZWdhdGl2ZSBkZXB0aCB3aWxsCisvLyBjYXVzZSBhbGwgZGVzY2VuZGFudHMgdG8gYmUgYWRkZWQuCit2YXIgX2dldE5vZGVXaXRoQ2hpbGRyZW4gPSBmdW5jdGlvbihub2RlLCBkZXB0aCkgeworICB2YXIgcmVzdWx0ID0gbmV3IGRldnRvb2xzLk5vZGUobm9kZSk7CisgIGlmIChkZXB0aCAhPSAwKSB7CisgICAgcmVzdWx0LmNoaWxkcmVuID0gX2dldENoaWxkTm9kZXMobm9kZSwgZGVwdGgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgTm9kZSBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNoaWxkcmVuCisvLyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUsIHJlY3Vyc2luZyBvbiBlYWNoIG9uIHVwIHRvIHRoZSBzcGVjaWZpZWQgZGVwdGguCit2YXIgX2dldENoaWxkTm9kZXMgPSBmdW5jdGlvbihub2RlLCBkZXB0aCkgeworICBpZiAoIW5vZGUuY2hpbGROb2RlcykgeworICAgIHJldHVybiBbXTsKKyAgfQorCisgIHZhciBjaGlsZHJlbiA9IFtdOworICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tpXTsKKyAgICBpZiAoIV9ub2RlSXNJZ25vcmFibGUoY2hpbGQpKSB7CisgICAgICBjaGlsZHJlbi5wdXNoKF9nZXROb2RlV2l0aENoaWxkcmVuKGNoaWxkLCBkZXB0aCAtIDEpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNoaWxkcmVuOworfQorCisvLyBGaW5kcyBhIG5vZGUgc3BlY2lmaWVkIGJ5IGVpdGhlciBub2RlSWQgb3Igb2JqZWN0SWQgKHRvIGdldCBhIG5vZGUgZnJvbSBpdHMKKy8vIGNvcnJlc3BvbmRpbmcgcmVtb3RlIG9iamVjdCkuIFRoaXMgaXMgImV4cG9ydGVkIiBhcyBhIHBzZXVkby1jb21tYW5kIGluIHRoZQorLy8gRE9NIGRvbWFpbiBmb3Igb3RoZXIgYWdlbnRzIHRvIHVzZS4KK2NvbW1hbmRzLl9maW5kTm9kZSA9IGZ1bmN0aW9uKHBhcmFtcykgeworICBpZiAocGFyYW1zLm5vZGVJZCAhPSBudWxsKSB7CisgICAgcmV0dXJuIF9ub2RlU3RvcmVbcGFyYW1zLm5vZGVJZF07CisgIH0KKworICBpZiAocGFyYW1zLm9iamVjdElkICE9IG51bGwpIHsKKyAgICAvLyBUT0RPOiBBZGQgYW4gSURMIG1ldGhvZCB0byBkZWJ1Z1NjcmlwdFJ1bm5lci4KKyAgICByZXR1cm4gZGVidWdTY3JpcHRSdW5uZXIucnVudGltZS5nZXRPYmplY3QocGFyYW1zLm9iamVjdElkKTsKKyAgfQorCisgIC8vIEVpdGhlciBub2RlSWQgb3Igb2JqZWN0SWQgbXVzdCBiZSBzcGVjaWZpZWQuCisgIHJldHVybiBudWxsOworfQorCisvLyBBZGRzIGEgbm9kZSB0byB0aGUgaW50ZXJuYWwgbm9kZSBzdG9yZSBhbmQgcmV0dXJucyBhIHVuaXF1ZSBpZCB0aGF0IGNhbgorLy8gYmUgdXNlZCB0byBhY2Nlc3MgaXQgYWdhaW4uCit2YXIgX2FkZE5vZGUgPSBmdW5jdGlvbihub2RlKSB7CisgIC8vIElmIHdlJ3ZlIGFscmVhZHkgYWRkZWQgdGhpcyBub2RlLCB0aGVuIHVzZSB0aGUgc2FtZSBub2RlSWQuCisgIGZvciAodmFyIGkgPSAwOyBpIDwgX25vZGVTdG9yZS5sZW5ndGg7IGkrKykgeworICAgIGlmIChfbm9kZVN0b3JlW2ldID09PSBub2RlKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKworICB2YXIgbm9kZUlkID0gX25leHROb2RlSWQrKzsKKyAgX25vZGVTdG9yZVtub2RlSWRdID0gbm9kZTsKKyAgcmV0dXJuIG5vZGVJZDsKK30KKworLy8gV2hldGhlciBhIG5vZGUgaXMgaWdub3JhYmxlLiBXZSBpZ25vcmUgdGV4dCBub2RlcyB3aXRoIHdoaXRlLXNwYWNlIG9ubHkKKy8vIGNvbnRlbnQsIGFzIHRoZXkganVzdCBjbHV0dGVyIHVwIHRoZSBET00gdHJlZS4KK3ZhciBfbm9kZUlzSWdub3JhYmxlID0gZnVuY3Rpb24obm9kZSkgeworICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJgorICAgICAgISgvW15cdFxuXHIgXS8udGVzdChub2RlLnRleHRDb250ZW50KSk7Cit9CisKK3ZhciBfbm9kZVN0b3JlID0gW107Cit2YXIgX25leHROb2RlSWQgPSAwOworCisvLyBOYW1lc3BhY2UgZm9yIGNvbnN0cnVjdG9ycyBvZiB0eXBlcyBkZWZpbmVkIGluIHRoZSBEZXZ0b29scyBwcm90b2NvbC4KK3ZhciBkZXZ0b29scyA9IHt9OworCisvLyBDcmVhdGVzIGEgbmV3IE5vZGUgb2JqZWN0LCB3aGljaCBpcyB0aGUgdHlwZSB1c2VkIHRvIHJldHVybiBpbmZvcm1hdGlvbgorLy8gYWJvdXQgbm9kZXMgdG8gZGV2dG9vbHMuIEFsbCBOb2RlIG9iamVjdHMgYXJlIGFkZGVkIHRvIHxub2RlU3RvcmV8LAorLy8gc28gdGhleSBjYW4gYmUgcmV0cmlldmVkIGxhdGVyIHZpYSB8bm9kZUlkfC4KKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9ET00jdHlwZS1Ob2RlCitkZXZ0b29scy5Ob2RlID0gZnVuY3Rpb24obm9kZSkgeworICB0aGlzLm5vZGVJZCA9IF9hZGROb2RlKG5vZGUpOworICB0aGlzLmxvY2FsTmFtZSA9IG5vZGUubm9kZU5hbWU7CisgIHRoaXMubm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lOworICB0aGlzLm5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZTsKKyAgdGhpcy5ub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZSB8fCAnJzsKKyAgdGhpcy5jaGlsZE5vZGVDb3VudCA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7CisKKyAgaWYgKG5vZGUuYXR0cmlidXRlcykgeworICAgIHRoaXMuYXR0cmlidXRlcyA9IFtdOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChub2RlLmF0dHJpYnV0ZXNbaV0ubmFtZSk7CisgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChub2RlLmF0dHJpYnV0ZXNbaV0udmFsdWUpOworICAgIH0KKyAgfQorfQorCisvLyBUT0RPOiBQYXNzIGRlYnVnU2NyaXB0UnVubmVyIGZyb20gQysrIGluc3RlYWQgb2YgZ2V0dGluZyBpdCBmcm9tIHRoZSB3aW5kb3cuCit9KSh3aW5kb3cuZGVidWdTY3JpcHRSdW5uZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnRlbnQvcnVudGltZS5qcyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jb250ZW50L3J1bnRpbWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZjRhZjMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbnRlbnQvcnVudGltZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vIFRvcCBsZXZlbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgYW55IGNvbXBvbmVudCB0byBjcmVhdGUKLS8vIGEgUnVudGltZS5SZW1vdGVPYmplY3QgZnJvbSBhIEpTIG9iamVjdCBwYXNzZWQgaW4gZnJvbSBDKysuCi1kZXZ0b29sc0JhY2tlbmQuY3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2sgPSBmdW5jdGlvbihvYmplY3QsIHBhcmFtcykgewotICB2YXIgcmVtb3RlT2JqZWN0ID0gbnVsbDsKLSAgdHJ5IHsKLSAgICByZW1vdGVPYmplY3QgPSBuZXcgZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuUmVtb3RlT2JqZWN0KAotICAgICAgICBvYmplY3QsIHBhcmFtcy5vYmplY3RHcm91cCwgcGFyYW1zLnJldHVybkJ5VmFsdWUpOwotICB9IGNhdGNoKGUpIHsKLSAgICBjb25zb2xlLmxvZygnRXhjZXB0aW9uIGNyZWF0aW5nIHJlbW90ZSBvYmplY3Q6ICcgKyBlKTsKLSAgfQotCi0gIHZhciBqc29uID0gIiI7Ci0gIHRyeSB7Ci0gICAganNvbiA9IEpTT04uc3RyaW5naWZ5KHJlbW90ZU9iamVjdCk7Ci0gIH0gY2F0Y2goZSkgewotICAgIGNvbnNvbGUubG9nKCdFeGNlcHRpb24gc3RyaW5naWZ5aW5nIHJlbW90ZSBvYmplY3Q6ICcgKyBlKQotICB9Ci0gIHJldHVybiBqc29uOwotfQotCi0vLyBKYXZhU2NyaXB0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBDaHJvbWUgZGVidWdnaW5nIHByb3RvY29sIFJ1bnRpbWUgZG9tYWluOgotLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL1J1bnRpbWUKLQotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUgPSB7fTsKLQotLy8gQWxpYXMgdG8gbWF0Y2ggdGhlIHVwcGVyY2FzZSBkb21haW4gb2YgdGhlIGRldnRvb2xzIHByb3RvY29sLgotZGV2dG9vbHNCYWNrZW5kLlJ1bnRpbWUgPSBkZXZ0b29sc0JhY2tlbmQucnVudGltZTsKLQotLy8gQ3JlYXRlcyBhbiBleGVjdXRpb25Db250ZXh0Q3JlYXRlZCBldmVudC4KLS8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sLzEtMy9SdW50aW1lI2V2ZW50LWV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5leGVjdXRpb25Db250ZXh0Q3JlYXRlZEV2ZW50ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBldmVudCA9IHsKLSAgICBjb250ZXh0OiB7Ci0gICAgICBpZDogMSwKLSAgICAgIG9yaWdpbjogd2luZG93LmxvY2F0aW9uLm9yaWdpbiwKLSAgICAgIG5hbWU6ICJDb2JhbHQiLAotICAgICAgYXV4RGF0YTogewotICAgICAgICBpc0RlZmF1bHQ6IHRydWUKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0gIHJldHVybiBKU09OLnN0cmluZ2lmeShldmVudCk7Ci19Ci0KLS8vIENhbGxzIGEgZnVuY3Rpb24gb24gYSBwcmV2aW91c2x5IGFjY2Vzc2VkIFJlbW90ZU9iamVjdCB3aXRoIGFuIGFyZ3VtZW50IGxpc3QKLS8vIGFuZCByZXR1cm5zIGEgbmV3IFJlbW90ZU9iamVjdC4gVXNlZCBleHRlbnNpdmVseSBieSBkZXZ0b29scyBmb3IKLS8vIGF1dG8tY29tcGxldGlvbi4gVGhlIG5ldyBSZW1vdGVPYmplY3QgdXNlcyB0aGUgc2FtZSB8b2JqZWN0R3JvdXB8IGFzIHRoZQotLy8gb3JpZ2luYWwgb2JqZWN0LgotLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL1J1bnRpbWUjbWV0aG9kLWNhbGxGdW5jdGlvbk9uCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5jYWxsRnVuY3Rpb25PbiA9IGZ1bmN0aW9uKHBhcmFtcykgewotICB2YXIgcmVzdWx0ID0ge307Ci0gIHZhciB2YWx1ZSA9IG51bGw7Ci0gIHRyeSB7Ci0gICAgZXZhbCgndmFyIGYgPSAnICsgcGFyYW1zLmZ1bmN0aW9uRGVjbGFyYXRpb24pOwotICAgIHZhciBvYmplY3RFbnRyeSA9IHRoaXMuX29iamVjdFN0b3JlW3BhcmFtcy5vYmplY3RJZF07Ci0gICAgdmFyIHRoaXNBcmcgPSBvYmplY3RFbnRyeS5vYmplY3Q7Ci0gICAgdmFyIG9iamVjdEdyb3VwID0gb2JqZWN0RW50cnkub2JqZWN0R3JvdXA7Ci0gICAgdmFsdWUgPSBmLmFwcGx5KHRoaXNBcmcsIHBhcmFtcy5hcmd1bWVudHMpOwotICAgIHJlc3VsdC53YXNUaHJvd24gPSBmYWxzZTsKLSAgfSBjYXRjaChlKSB7Ci0gICAgdmFsdWUgPSBlOwotICAgIHJlc3VsdC5leGNlcHRpb25EZXRhaWxzID0gZTsKLSAgICByZXN1bHQud2FzVGhyb3duID0gdHJ1ZTsKLSAgfQotCi0gIHJlc3VsdC5yZXN1bHQgPQotICAgICAgbmV3IHRoaXMuUmVtb3RlT2JqZWN0KHZhbHVlLCBvYmplY3RHcm91cCwgcGFyYW1zLnJldHVybkJ5VmFsdWUpOwotICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTsKLX0KLQotLy8gRXZhbHVhdGVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgUmVtb3RlT2JqZWN0LgotLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL1J1bnRpbWUjbWV0aG9kLWV2YWx1YXRlCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uKHBhcmFtcykgewotICB2YXIgcmVzdWx0ID0ge307Ci0gIHZhciB2YWx1ZSA9IG51bGw7Ci0gIHRyeSB7Ci0gICAgaWYgKHBhcmFtcy5pbmNsdWRlQ29tbWFuZExpbmVBUEkpIHsKLSAgICAgIHRoaXMuX2FkZENvbW1hbmRMaW5lQVBJKCk7Ci0gICAgfQotCi0gICAgLy8gVXNlIHxldmFsfCBpbmRpcmVjdGx5LCB0byBjYXVzZSBldmFsdWF0aW9uIGF0IGdsb2JhbCBzY29wZS4KLSAgICAvLyBUaGlzIGlzIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIGFjY2VzcyB2YXJpYWJsZXMgZGVjbGFyZWQgaGVyZSwgZXRjLgotICAgIHZhciBnZXZhbCA9IGV2YWw7Ci0gICAgdmFsdWUgPSBnZXZhbChwYXJhbXMuZXhwcmVzc2lvbik7Ci0KLSAgICAvLyBTdG9yZSB0aGUgbGFzdCByZXN1bHQgaWYgd2UncmUgZG9pbmcgYSAicmVhbCIgZXZhbHVhdGlvbiwgbm90IGFuCi0gICAgLy8gYXV0by1jb21wbGV0ZS4gU2VlbXMgYSBsaXR0bGUgc3BlY2lhbCBjYXNlLXksIGJ1dCB0aGlzIGlzIHRha2VuIGZyb20KLSAgICAvLyBDaHJvbWUncyBpbXBsZW1lbnRhdGlvbiwgYW5kIGxvb2tzIGxpa2UgdGhlIG9ubHkgd2F5IHRvIGRpZmZlcmVudGlhdGUuCi0gICAgaWYgKHBhcmFtcy5vYmplY3RHcm91cCA9PSAnY29uc29sZScpIHsKLSAgICAgIHRoaXMuX2xhc3RSZXN1bHQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICByZXN1bHQud2FzVGhyb3duID0gZmFsc2U7Ci0gIH0gY2F0Y2goZSkgewotICAgIHZhbHVlID0gZTsKLSAgICByZXN1bHQuZXhjZXB0aW9uRGV0YWlscyA9IGU7Ci0gICAgcmVzdWx0Lndhc1Rocm93biA9IHRydWU7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIFJlbW90ZU9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXN1bHQuCi0gIHJlc3VsdC5yZXN1bHQgPQotICAgICAgbmV3IHRoaXMuUmVtb3RlT2JqZWN0KHZhbHVlLCBwYXJhbXMub2JqZWN0R3JvdXAsIHBhcmFtcy5yZXR1cm5CeVZhbHVlKTsKLQotICAvLyBBZGQgdGhlIHByZXZpZXcsIGlmIHJlcXVlc3RlZC4KLSAgaWYgKHBhcmFtcy5nZW5lcmF0ZVByZXZpZXcpIHsKLSAgICB2YXIgcHJldmlldyA9IHRoaXMuZ2VuZXJhdGVQcmV2aWV3KHZhbHVlKTsKLSAgICBpZiAocHJldmlldykgewotICAgICAgcmVzdWx0LnJlc3VsdC5wcmV2aWV3ID0gcHJldmlldzsKLSAgICB9Ci0gIH0KLQotICBpZiAocGFyYW1zLmluY2x1ZGVDb21tYW5kTGluZUFQSSkgewotICAgIHRoaXMuX3JlbW92ZUNvbW1hbmRMaW5lQVBJKCk7Ci0gIH0KLQotICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTsKLX0KLQotLy8gUmV0dXJucyBhbGwgbGV0LCBjb25zdCBhbmQgY2xhc3MgdmFyaWFibGVzIGZyb20gZ2xvYmFsIHNjb3BlLgotLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL1J1bnRpbWUjbWV0aG9kLWdsb2JhbExleGljYWxTY29wZU5hbWVzCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5nbG9iYWxMZXhpY2FsU2NvcGVOYW1lcyA9IGZ1bmN0aW9uKHBhcmFtcykgewotICB2YXIgcmVzdWx0ID0gW107Ci0gIC8vIFRPRE86IEdldCB0aGUgZ2xvYmFscy4KLSAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIHByb3BlcnRpZXMgb2YgYSBwcmV2aW91c2x5IGFjY2Vzc2VkIG9iamVjdCBhcyBhbiBhcnJheSBvZgotLy8gUHJvcGVydHlEZXNjcmlwdG9yIG9iamVjdHMuCi0vLyBUaGUgcGFyYW1ldGVycyBzcGVjaWZpZnkgc2V2ZXJhbCBvcHRpb25zOgotLy8gKiBvd25Qcm9wZXJ0aWVzIC0gb25seSBpbmNsdWRlIGltbWVkaWF0ZSBwcm9wZXJ0aWVzLCBub3QgdGhlIHByb3RvdHlwZSBjaGFpbi4KLS8vICogYWNjZXNzb3JQcm9wZXJ0aWVzT25seSAtIG9ubHkgaW5jbHVkZSBhY2Nlc3NvciBwcm9wZXJ0aWVzLgotLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL1J1bnRpbWUjbWV0aG9kLWdldFByb3BlcnRpZXMKLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLmdldFByb3BlcnRpZXMgPSBmdW5jdGlvbihwYXJhbXMpIHsKLSAgdmFyIHJlc3VsdCA9IHt9OwotICB2YXIgcHJvcGVydGllcyA9IFtdOwotICB0cnkgewotICAgIHZhciBvYmplY3RFbnRyeSA9IHRoaXMuX29iamVjdFN0b3JlW3BhcmFtcy5vYmplY3RJZF07Ci0gICAgdmFyIG9iamVjdCA9IG9iamVjdEVudHJ5Lm9iamVjdDsKLSAgICB2YXIgb2JqZWN0R3JvdXAgPSBvYmplY3RFbnRyeS5vYmplY3RHcm91cDsKLSAgICB0aGlzLmFkZFByb3BlcnRpZXMob2JqZWN0LCBvYmplY3RHcm91cCwgIXBhcmFtcy5vd25Qcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTsKLQotICAgIGlmIChwYXJhbXMuYWNjZXNzb3JQcm9wZXJ0aWVzT25seSkgewotICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewotICAgICAgICAgIHJldHVybiAoZWxlbWVudC5nZXQgfHwgZWxlbWVudC5zZXQpOwotICAgICAgICB9KTsKLSAgICB9Ci0gICAgcmVzdWx0Lndhc1Rocm93biA9IGZhbHNlOwotICB9IGNhdGNoKGUpIHsKLSAgICB2YWx1ZSA9IGU7Ci0gICAgcmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMgPSBlOwotICAgIHJlc3VsdC53YXNUaHJvd24gPSB0cnVlOwotICB9Ci0KLSAgcmVzdWx0LnJlc3VsdCA9IHByb3BlcnRpZXM7Ci0gIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXN1bHQpOwotfQotCi0vLyBSZWxlYXNlcyBvdXIgcmVmZXJlbmNlIHRvIGEgcHJldmlvdXNseSBhY2Nlc3NlZCBvYmplY3QuCi0vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvUnVudGltZSNtZXRob2QtcmVsZWFzZU9iamVjdAotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUucmVsZWFzZU9iamVjdCA9IGZ1bmN0aW9uKHBhcmFtcykgewotICBkZWxldGUgdGhpcy5fb2JqZWN0U3RvcmVbcGFyYW1zLm9iamVjdElkXTsKLX0KLQotLy8gUmVsZWFzZXMgb3VyIHJlZmVyZW5jZXMgdG8gYSBncm91cCBvZiBwcmV2aW91c2x5IGFjY2Vzc2VkIG9iamVjdHMuCi0vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC8xLTMvUnVudGltZSNtZXRob2QtcmVsZWFzZU9iamVjdEdyb3VwCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5yZWxlYXNlT2JqZWN0R3JvdXAgPSBmdW5jdGlvbihwYXJhbXMpIHsKLSAgZm9yICh2YXIgb2JqZWN0SWQgaW4gdGhpcy5fb2JqZWN0U3RvcmUpIHsKLSAgICB2YXIgb2JqZWN0RW50cnkgPSB0aGlzLl9vYmplY3RTdG9yZVtvYmplY3RJZF07Ci0gICAgaWYgKG9iamVjdEVudHJ5ICYmIG9iamVjdEVudHJ5Lm9iamVjdEdyb3VwID09IHBhcmFtcy5vYmplY3RHcm91cCkgewotICAgICAgZGVsZXRlIHRoaXMuX29iamVjdFN0b3JlW29iamVjdElkXTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gQWRkcyB0aGUgcHJvcGVydGllcyBvZiB8b2JqZWN0fCB0byB0aGUgfHJlc3VsdHwgYXJyYXkgYXMgbmV3Ci0vLyBQcm9wZXJ0eURlc2NyaXB0b3Igb2JqZWN0cy4gU29tZSBwcm9wZXJ0aWVzIG1heSBiZSBvYmplY3RzIHRoZW1zZWx2ZXMsCi0vLyBpbiB3aGljaCBjYXNlIG5ldyBSZW1vdGVPYmplY3RzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQKLS8vIHxvYmplY3RHcm91cHwsIHdoaWNoIHNob3VsZCBiZSB0aGF0IG9mIHxvYmplY3R8LgotLy8gSWYgfGluY2x1ZGVQcm90b3R5cGV8IGlzIHNldCwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5IG9uCi0vLyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIHRoZSBvYmplY3QuCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5hZGRQcm9wZXJ0aWVzID0KLSAgICBmdW5jdGlvbihvYmplY3QsIG9iamVjdEdyb3VwLCBpbmNsdWRlUHJvdG90eXBlLCByZXN1bHQpIHsKLSAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmplY3QpOwotICB2YXIgZm91bmRQcm90byA9IGZhbHNlOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICB2YXIga2V5ID0gcHJvcGVydGllc1tpXTsKLSAgICBmb3VuZFByb3RvID0gZm91bmRQcm90byB8fCAoa2V5ID09ICdfX3Byb3RvX18nKTsKLQotICAgIC8vIElmIHdlIGNhbid0IGZpbmQgdGhlIHByb3BlcnR5LCBhbmQgaXRzIG5hbWUgY29ycmVzcG9uZHMgdG8gYSBudW1iZXIsCi0gICAgLy8gdHJ5IGl0IGFzIGFuIGFycmF5IGluZGV4IChpbnRlZ2VyIGluc3RlYWQgb2Ygc3RyaW5nKS4KLSAgICBpZiAob2JqZWN0W2tleV0gPT0gbnVsbCkgewotICAgICAgaWYgKCFpc05hTihrZXkpKSB7Ci0gICAgICAgIGtleSA9IHBhcnNlSW50KGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2YXIgcHJvcGVydHlEZXNjcmlwdG9yID0KLSAgICAgICAgbmV3IHRoaXMuUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgb2JqZWN0R3JvdXAsIGtleSk7Ci0gICAgcmVzdWx0LnB1c2gocHJvcGVydHlEZXNjcmlwdG9yKTsKLSAgfQotCi0gIHZhciBwcm90byA9IG51bGw7Ci0gIHRyeSB7Ci0gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsKLSAgfSBjYXRjaCAoZSkge30KLQotICBpZiAoaW5jbHVkZVByb3RvdHlwZSkgewotICAgIC8vIFJlY3Vyc2l2ZWx5IGFkZCB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBwcm90b3R5cGUgY2hhaW4uCi0gICAgaWYgKHByb3RvKSB7Ci0gICAgICB0aGlzLmFkZFByb3BlcnRpZXMocHJvdG8sIG9iamVjdEdyb3VwLCBpbmNsdWRlUHJvdG90eXBlLCByZXN1bHQpOwotICAgIH0KLSAgfSBlbHNlIGlmIChwcm90byAmJiAhZm91bmRQcm90bykgewotICAgIC8vIHxnZXRPd25Qcm9wZXJ0eU5hbWVzfCBtYXkgbm90IGluY2x1ZGUgdGhlIG9iamVjdCBwcm90b3R5cGUsCi0gICAgLy8gc28gaWYgdGhhdCdzIHRoZSBjYXNlLCBhZGQgaXQgbm93LiBJdCdzIGEgZGVwcmVjYXRlZCBuYW1lLCBidXQgZGV2dG9vbHMKLSAgICAvLyBzdGlsbCB1c2VzIGl0LgotICAgIHZhciBwcm9wZXJ0eURlc2NyaXB0b3IgPQotICAgICAgICBuZXcgdGhpcy5Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBvYmplY3RHcm91cCwgJ19fcHJvdG9fXycpOwotICAgIHJlc3VsdC5wdXNoKHByb3BlcnR5RGVzY3JpcHRvcik7Ci0gIH0KLX0KLQotLy8gR2V0cyBhbiBvYmplY3QgZnJvbSB0aGUgaW50ZXJuYWwgb2JqZWN0IHN0b3JlLgotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuZ2V0T2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0SWQpIHsKLSAgcmV0dXJuIHRoaXMuX29iamVjdFN0b3JlW29iamVjdElkXS5vYmplY3Q7Ci19Ci0KLS8vIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBpbnRlcm5hbCBvYmplY3Qgc3RvcmUgYW5kIHJldHVybnMgYSB1bmlxdWUgaWQgdGhhdCBjYW4KLS8vIGJlIHVzZWQgdG8gYWNjZXNzIGl0IGFnYWluLgotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuYWRkT2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0LCBvYmplY3RHcm91cCkgewotICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgb2JqZWN0LCB0aGVuIHVzZSB0aGUgc2FtZSBvYmplY3RJZC4KLSAgZm9yICh2YXIgb2JqZWN0SWQgaW4gdGhpcy5fb2JqZWN0U3RvcmUpIHsKLSAgICB2YXIgb2JqZWN0RW50cnkgPSB0aGlzLl9vYmplY3RTdG9yZVtvYmplY3RJZF07Ci0gICAgaWYgKG9iamVjdEVudHJ5Lm9iamVjdCA9PT0gb2JqZWN0ICYmCi0gICAgICAgIG9iamVjdEVudHJ5Lm9iamVjdEdyb3VwID09IG9iamVjdEdyb3VwKSB7Ci0gICAgICByZXR1cm4gb2JqZWN0SWQ7Ci0gICAgfQotICB9Ci0KLSAgdmFyIG9iamVjdElkID0gdGhpcy5fbmV4dE9iamVjdElkLnRvU3RyaW5nKCk7Ci0gIHRoaXMuX25leHRPYmplY3RJZCArPSAxOwotICB0aGlzLl9vYmplY3RTdG9yZVtvYmplY3RJZF0gPSB7fTsKLSAgdGhpcy5fb2JqZWN0U3RvcmVbb2JqZWN0SWRdLm9iamVjdCA9IG9iamVjdDsKLSAgdGhpcy5fb2JqZWN0U3RvcmVbb2JqZWN0SWRdLm9iamVjdEdyb3VwID0gb2JqZWN0R3JvdXA7Ci0gIHJldHVybiBvYmplY3RJZDsKLX0KLQotLy8gR2VuZXJhdGVzIGFuIG9iamVjdCBwcmV2aWV3LCB3aGljaCBtYXkgYmUgcmVxdWVzdGVkIGZvciB0aGUgZXZhbHVhdGUKLS8vIGNvbW1hbmQuCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5nZW5lcmF0ZVByZXZpZXcgPSBmdW5jdGlvbihvYmplY3QpIHsKLSAgaWYgKCFvYmplY3QgfHwgKHR5cGVvZiBvYmplY3QgIT0gJ29iamVjdCcpKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5ldyB0aGlzLk9iamVjdFByZXZpZXcob2JqZWN0KTsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRoZSBzdWJ0eXBlIG9mIGFuIG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIG5vdCBhbgotLy8gb2JqZWN0LgotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuZ2V0U3VidHlwZSA9IGZ1bmN0aW9uKG9iamVjdCkgewotICBpZiAodHlwZW9mIG9iamVjdCA9PSAnb2JqZWN0JykgewotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheSkgewotICAgICAgcmV0dXJuICdhcnJheSc7Ci0gICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlKSB7Ci0gICAgICByZXR1cm4gJ2RhdGUnOwotICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRXJyb3IpIHsKLSAgICAgIHJldHVybiAnZXJyb3InOwotICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotICAgICAgcmV0dXJuICdub2RlJzsKLSAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlZ0V4cCkgewotICAgICAgcmV0dXJuICdyZWdleHAnOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbDsKLX0KLQotLy8gVHJpZXMgdG8gZ2V0IHRoZSBjbGFzc25hbWUgb2YgYW4gb2JqZWN0IGJ5IGZvbGxvd2luZyB0aGUgcHJvdG90eXBlIGNoYWluCi0vLyBhbmQgbG9va2luZyBmb3IgYSBjb25zdHJ1Y3Rvci4KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLmdldENsYXNzTmFtZSA9IGZ1bmN0aW9uKG9iamVjdCkgewotICB0cnkgewotICAgIGZvciAodmFyIG9iaiA9IG9iamVjdDsgb2JqICYmICF0aGlzLmNsYXNzTmFtZTsKLSAgICAgICAgIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7Ci0gICAgICBpZiAob2JqLmNvbnN0cnVjdG9yKSB7Ci0gICAgICAgIHJldHVybiBvYmouY29uc3RydWN0b3IubmFtZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gY2F0Y2goZSkge30KLQotICByZXR1cm4gbnVsbDsKLX0KLQotLy8gQ3JlYXRlcyBhIFJlbW90ZU9iamVjdCwgd2hpY2ggaXMgdGhlIHR5cGUgdXNlZCB0byByZXR1cm4gbWFueSB2YWx1ZXMgdG8KLS8vIGRldnRvb2xzLiBJZiB8dmFsdWV8IGlzIGFuIG9iamVjdCwgdGhlbiBpcyBpdCBpbnNlcnRlZCBpbnRvCi0vLyB8ZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuX29iamVjdFN0b3JlfCBhbmQgdGhlIHxvYmplY3RJZHwga2V5IHVzZWQgdG8KLS8vIGFjY2VzcyBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgUmVtb3RlT2JqZWN0LiBJZiB8dmFsdWV8IGlzIG5vdCBhbiBvYmplY3QsCi0vLyBvciB8cmV0dXJuQnlWYWx1ZXwgaXMgdHJ1ZSwgdGhlbiB8dmFsdWV8IGlzIGRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZQotLy8gUmVtb3RlT2JqZWN0LgotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuUmVtb3RlT2JqZWN0ID0gZnVuY3Rpb24odmFsdWUsIG9iamVjdEdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSkgewotICB0aGlzLnR5cGUgPSB0eXBlb2YgdmFsdWU7Ci0KLSAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICB0aGlzLnN1YnR5cGUgPT0gJ251bGwnOwotICAgIHRoaXMudmFsdWUgPSBudWxsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICh0aGlzLnR5cGUgPT0gJ29iamVjdCcpIHsKLSAgICB0aGlzLm9iamVjdElkID0gZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuYWRkT2JqZWN0KHZhbHVlLCBvYmplY3RHcm91cCk7Ci0gICAgdGhpcy5zdWJ0eXBlID0gZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuZ2V0U3VidHlwZSh2YWx1ZSk7Ci0gICAgdGhpcy5jbGFzc05hbWUgPSBkZXZ0b29sc0JhY2tlbmQucnVudGltZS5nZXRDbGFzc05hbWUodmFsdWUpOwotICB9Ci0KLSAgLy8gRmlsbCBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQuIERldnRvb2xzIHdpbGwgb25seSBkaXNwbGF5IGFycmF5cwotICAvLyBjb3JyZWN0bHkgaWYgdGhlaXIgZGVzY3JpcHRpb24gZm9sbG93cyBhIHBhcnRpY3VsYXIgZm9ybWF0LiBGb3Igb3RoZXIKLSAgLy8gdmFsdWVzLCB0cnkgdG8gdXNlIHRoZSBnZW5lcmljIHN0cmluZyBjb252ZXJzaW9uLCBhbmQgZmFsbCBiYWNrIHRvIHRoZQotICAvLyBjbGFzc05hbWUgaWYgdGhhdCBmYWlscy4KLSAgaWYgKHRoaXMuc3VidHlwZSA9PSAnYXJyYXknKSB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9ICdBcnJheVsnICsgdmFsdWUubGVuZ3RoICsgJ10nOwotICB9IGVsc2UgewotICAgIHRyeSB7Ci0gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICB9IGNhdGNoKGUpIHsKLSAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLmNsYXNzTmFtZTsKLSAgICB9Ci0gIH0KLQotICBpZiAocmV0dXJuQnlWYWx1ZSB8fCB0aGlzLnR5cGUgIT0gJ29iamVjdCcpIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLX0KLQotLy8gQ3JlYXRlcyBhIFByb3BlcnR5RGVzY3JpcHRvciBmb3IgfHByb3BlcnR5fCBvZiB8b2JqZWN0fCwKLS8vIHdoaWNoIGlzIHRoZSB0eXBlIHVzZWQgdG8gcmV0dXJuIG9iamVjdCBwcm9wZXJ0aWVzIHRvIGRldnRvb2xzLgotLy8gU29tZSBwcm9wZXJ0aWVzIG1heSBiZSBvYmplY3RzLCBpbiB3aGljaCBjYXNlIG5ldyBSZW1vdGVPYmplY3RzIGFyZSBjcmVhdGVkCi0vLyBhbmQgaW5zZXJ0ZWQgaW50byB8ZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuX29iamVjdFN0b3JlfCB1c2luZyB0aGUgc3BlY2lmaWVkCi0vLyB8b2JqZWN0R3JvdXB8LCB3aGljaCBzaG91bGQgYmUgdGhhdCBvZiB8b2JqZWN0fC4KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLlByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uKG9iamVjdCwgb2JqZWN0R3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSkgewotICB0aGlzLm5hbWUgPSBwcm9wZXJ0eS50b1N0cmluZygpOwotICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7Ci0gIC8vIFNvbWUgQ29iYWx0IG9iamVjdHMgZG9uJ3Qgc2VlbSB0byBzdXBwb3J0IHxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3J8LAotICAvLyBzbyB3ZSBoYW5kbGUgdGhhdCBjYXNlIGluIHRoZSBlbHNlIGNsYXVzZSBiZWxvdy4KLSAgaWYgKGRlc2NyaXB0b3IpIHsKLSAgICB0aGlzLmNvbmZpZ3VyYWJsZSA9IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlOwotICAgIHRoaXMuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZTsKLSAgICBpZiAoZGVzY3JpcHRvci5nZXQpIHsKLSAgICAgIHRoaXMuZ2V0ID0gbmV3IGRldnRvb2xzQmFja2VuZC5ydW50aW1lLlJlbW90ZU9iamVjdChkZXNjcmlwdG9yLmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICAgIGlmIChkZXNjcmlwdG9yLnNldCkgewotICAgICAgdGhpcy5zZXQgPSBuZXcgZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuUmVtb3RlT2JqZWN0KGRlc2NyaXB0b3Iuc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdEdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gICAgaWYgKGRlc2NyaXB0b3IudmFsdWUgIT0gbnVsbCkgewotICAgICAgdGhpcy52YWx1ZSA9IG5ldyBkZXZ0b29sc0JhY2tlbmQucnVudGltZS5SZW1vdGVPYmplY3QoZGVzY3JpcHRvci52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdEdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgICB0aGlzLndyaXRhYmxlID0gZGVzY3JpcHRvci53cml0YWJsZTsKLSAgfSBlbHNlIGlmIChvYmplY3RbcHJvcGVydHldICE9IG51bGwpIHsKLSAgICB0aGlzLmNvbmZpZ3VyYWJsZSA9IGZhbHNlOwotICAgIHRoaXMuZW51bWVyYWJsZSA9IG9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZShwcm9wZXJ0eSk7Ci0gICAgaWYgKG9iamVjdC5fX2xvb2t1cEdldHRlcl9fKHByb3BlcnR5KSkgewotICAgICAgdGhpcy5nZXQgPSBvYmplY3QuX19sb29rdXBHZXR0ZXJfXyhwcm9wZXJ0eSk7Ci0gICAgfQotICAgIGlmIChvYmplY3QuX19sb29rdXBTZXR0ZXJfXyhwcm9wZXJ0eSkpIHsKLSAgICAgIHRoaXMuc2V0ID0gb2JqZWN0Ll9fbG9va3VwU2V0dGVyX18ocHJvcGVydHkpOwotICAgIH0KLSAgICB0aGlzLnZhbHVlID0gbmV3IGRldnRvb2xzQmFja2VuZC5ydW50aW1lLlJlbW90ZU9iamVjdChvYmplY3RbcHJvcGVydHldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdEdyb3VwLCBmYWxzZSk7Ci0gIH0KLX0KLQotLy8gQ3JlYXRlcyBhbiBPYmplY3RQcmV2aWV3LCB0aGUgdHlwZSB0byByZXByZXNlbnQgYSBwcmV2aWV3IG9mIGFuIG9iamVjdCwKLS8vIHdoaWNoIG1heSBiZSByZXF1ZXN0ZWQgYnkgZGV2dG9vbHMgaW4gdGhlIGV2YWx1YXRlIGNvbW1hbmQuCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5PYmplY3RQcmV2aWV3ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgdGhpcy50eXBlID0gdHlwZW9mIHZhbHVlOwotICB0aGlzLnN1YnR5cGUgPSBkZXZ0b29sc0JhY2tlbmQucnVudGltZS5nZXRTdWJ0eXBlKHZhbHVlKTsKLSAgdGhpcy5sb3NzbGVzcyA9IHRydWU7Ci0gIHRoaXMub3ZlcmZsb3cgPSBmYWxzZTsKLSAgdGhpcy5wcm9wZXJ0aWVzID0gW107Ci0KLSAgLy8gVXNlIHRoZSBjbGFzc05hbWUgYXMgdGhlIHByZXZpZXcgZGVzY3JpcHRpb24uIFRoaXMgbWF0Y2hlcyBDaHJvbWUuCi0gIHRoaXMuZGVzY3JpcHRpb24gPSBkZXZ0b29sc0JhY2tlbmQucnVudGltZS5nZXRDbGFzc05hbWUodmFsdWUpOwotCi0gIC8vIElmIHdlIGhhdmUgYW4gYXJyYXktbGlrZSBvYmplY3QsIGFkZCB0aGUgYXJyYXkgaXRlbXMsIG9yIGFwcGVuZCB0aGUKLSAgLy8gbGVuZ3RoIHRvIHRoZSBkZXNjcmlwdGlvbiBpZiB0aGVyZSdzIHRvbyBtYW55LgotICBpZiAodmFsdWUubGVuZ3RoICE9IG51bGwpIHsKLSAgICB2YXIgTUFYX0FSUkFZX0lURU1TID0gOTk7Ci0gICAgaWYgKHZhbHVlLmxlbmd0aCA8PSBNQVhfQVJSQVlfSVRFTVMpIHsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdmFyIHByb3BlcnR5ID0gbmV3IGRldnRvb2xzQmFja2VuZC5ydW50aW1lLlByb3BlcnR5UHJldmlldyhpLCB2YWx1ZVtpXSk7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKLSAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtpXSA9PSAnb2JqZWN0JykgewotICAgICAgICAgIHRoaXMubG9zc2xlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmRlc2NyaXB0aW9uICs9ICdbJyArIHZhbHVlLmxlbmd0aCArICddJzsKLSAgICAgIHRoaXMubG9zc2xlc3MgPSBmYWxzZTsKLSAgICAgIHRoaXMub3ZlcmZsb3cgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBBZGQgb2JqZWN0IHByb3BlcnRpZXMsIHVwIHRvIGEgbWF4aW11bS4KLSAgdmFyIE1BWF9QUk9QRVJUSUVTID0gNTsKLSAgdmFyIG51bVByb3BlcnRpZXMgPSAwOwotICBmb3IgKHZhciBuYW1lIGluIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlW25hbWVdICE9IG51bGwpIHsKLSAgICAgIGlmICgrK251bVByb3BlcnRpZXMgPiBNQVhfUFJPUEVSVElFUykgewotICAgICAgICB0aGlzLmxvc3NsZXNzID0gZmFsc2U7Ci0gICAgICAgIHRoaXMub3ZlcmZsb3cgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT0gJ29iamVjdCcpIHsKLSAgICAgICAgdGhpcy5sb3NzbGVzcyA9IGZhbHNlOwotICAgICAgfQotICAgICAgdmFyIHByb3BlcnR5ID0gbmV3IGRldnRvb2xzQmFja2VuZC5ydW50aW1lLlByb3BlcnR5UHJldmlldyhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtuYW1lXSk7Ci0gICAgICB0aGlzLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIENyZWF0ZXMgYSBQcm9wZXJ0eVByZXZpZXcsIHRoZSB0eXBlIHRvIHJlcHJlc2VudCBhIHByZXZpZXcgb2YgYSBzaW5nbGUKLS8vIG9iamVjdCBwcm9wZXJ0eS4KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLlByb3BlcnR5UHJldmlldyA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7Ci0gIHRoaXMubmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKLSAgdGhpcy50eXBlID0gdHlwZW9mIHZhbHVlOwotCi0gIHRyeSB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gIH0gY2F0Y2goZSkge30KLQotICBpZiAodGhpcy50eXBlID09ICdvYmplY3QnKSB7Ci0gICAgdGhpcy5zdWJ0eXBlID0gZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuZ2V0U3VidHlwZSh2YWx1ZSk7Ci0gIH0KLX0KLQotLy8gVGhlIG9iamVjdCBzdG9yZSB1c2VkIHRvIHJlZmVyZW5jZSBvYmplY3RzIGJ5IGludGVybmFsbHkgZ2VuZXJhdGVkIGlkLgotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuX29iamVjdFN0b3JlID0ge307Ci1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5fbmV4dE9iamVjdElkID0gMDsKLQotLy8gVGhlIGxhc3QgZXZhbHVhdGVkIHJlc3VsdC4KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLl9sYXN0UmVzdWx0ID0gbnVsbDsKLQotLy8gVmFsdWVzIGluIHRoZSBnbG9iYWwgc2NvcGUgdGhhdCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nCi0vLyBtZW1iZXJzIG9mIHRoZSBDb21tYW5kIExpbmUgQVBJIGZvciB0aGUgZHVyYXRpb24gb2YgYW4gZXZhbHVhdGlvbi4gV2UgdXNlCi0vLyB0aGlzIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHZhbHVlcyBhZnRlciB0aGUgZXZhbHVhdGlvbi4KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLl9nbG9iYWxPdmVycmlkZXMgPSB7fTsKLQotLy8gQ29tbWFuZCBMaW5lIEFQSSBpbXBsZW1lbnRhdGlvbi4KLS8vIFRoaXMgaXMgYSBzZXQgb2YgY29udmVuaWVuY2UgdmFyaWFibGVzL2Z1bmN0aW9ucyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbgotLy8gdGhlIGdsb2JhbCBzY29wZSBieSBkZWZhdWx0LCBidXQgY2FuIGJlIHNwZWNpZmllZCBhcyBhdmFpbGFibGUgdG8gdGhlCi0vLyBSdW50aW1lLmV2YWx1YXRlIGZ1bmN0aW9uIGJ5IHRoZSBpbmNsdWRlQ29tbWFuZExpbmVBUEkgcGFyYW1ldGVyLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2Nocm9tZS1kZXZ0b29scy9kZWJ1Zy9jb21tYW5kLWxpbmUvY29tbWFuZC1saW5lLXJlZmVyZW5jZQotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuX2NvbW1hbmRMaW5lQVBJID0ge307Ci0KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLl9jb21tYW5kTGluZUFQSS4kXyA9Ci0gICAgZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuX2xhc3RSZXN1bHQ7Ci0KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLl9jb21tYW5kTGluZUFQSS4kID0KLSAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yLmJpbmQoZG9jdW1lbnQpOwotCi1kZXZ0b29sc0JhY2tlbmQucnVudGltZS5fY29tbWFuZExpbmVBUEkuJCQgPQotICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwuYmluZChkb2N1bWVudCk7Ci0KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLl9jb21tYW5kTGluZUFQSS5rZXlzID0gT2JqZWN0LmtleXM7Ci0KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLl9jb21tYW5kTGluZUFQSS52YWx1ZXMgPSBmdW5jdGlvbihvYmplY3QpIHsKLSAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOwotICB2YXIgcmVzdWx0ID0gW107Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgIHJlc3VsdC5wdXNoKG9iamVjdFtrZXlzW2ldXSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotZGV2dG9vbHNCYWNrZW5kLnJ1bnRpbWUuX2FkZENvbW1hbmRMaW5lQVBJID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMuX2NvbW1hbmRMaW5lQVBJLiRfID0gdGhpcy5fbGFzdFJlc3VsdDsKLSAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcy5fY29tbWFuZExpbmVBUEkpIHsKLSAgICBpZiAodGhpcy5fY29tbWFuZExpbmVBUEkuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7Ci0gICAgICB0aGlzLl9nbG9iYWxPdmVycmlkZXNbcHJvcGVydHldID0gd2luZG93W3Byb3BlcnR5XTsKLSAgICAgIHdpbmRvd1twcm9wZXJ0eV0gPSB0aGlzLl9jb21tYW5kTGluZUFQSVtwcm9wZXJ0eV07Ci0gICAgfQotICB9Ci19Ci0KLWRldnRvb2xzQmFja2VuZC5ydW50aW1lLl9yZW1vdmVDb21tYW5kTGluZUFQSSA9IGZ1bmN0aW9uKCkgewotICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzLl9nbG9iYWxPdmVycmlkZXMpIHsKLSAgICBpZiAodGhpcy5fZ2xvYmFsT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkgewotICAgICAgd2luZG93W3Byb3BlcnR5XSA9IHRoaXMuX2dsb2JhbE92ZXJyaWRlc1twcm9wZXJ0eV07Ci0gICAgICBkZWxldGUgdGhpcy5fZ2xvYmFsT3ZlcnJpZGVzW3Byb3BlcnR5XTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9jc3NfYWdlbnQuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY3NzX2FnZW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNmYyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY3NzX2FnZW50LmNjCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2Nzc19hZ2VudC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkZWJ1ZyB7CituYW1lc3BhY2UgYmFja2VuZCB7CisKK25hbWVzcGFjZSB7CisvLyBEZWZpbml0aW9ucyBmcm9tIHRoZSBzZXQgc3BlY2lmaWVkIGhlcmU6CisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvRE9NCitjb25zdGV4cHIgY2hhciBrSW5zcGVjdG9yRG9tYWluW10gPSAiQ1NTIjsKKworLy8gRmlsZSB0byBsb2FkIEphdmFTY3JpcHQgQ1NTIGRlYnVnZ2luZyBkb21haW4gaW1wbGVtZW50YXRpb24gZnJvbS4KK2NvbnN0ZXhwciBjaGFyIGtTY3JpcHRGaWxlW10gPSAiY3NzX2FnZW50LmpzIjsKK30gIC8vIG5hbWVzcGFjZQorCitDU1NBZ2VudDo6Q1NTQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyKQorICAgIDogZGlzcGF0Y2hlcl8oZGlzcGF0Y2hlciksCisgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoY29tbWFuZHNfKHRoaXMsIGtJbnNwZWN0b3JEb21haW4pKSB7CisgIERDSEVDSyhkaXNwYXRjaGVyXyk7CisKKyAgY29tbWFuZHNfWyJkaXNhYmxlIl0gPSAmQ1NTQWdlbnQ6OkRpc2FibGU7CisgIGNvbW1hbmRzX1siZW5hYmxlIl0gPSAmQ1NTQWdlbnQ6OkVuYWJsZTsKKworICBkaXNwYXRjaGVyXy0+QWRkRG9tYWluKGtJbnNwZWN0b3JEb21haW4sIGNvbW1hbmRzXy5CaW5kKCkpOworfQorCitDU1NBZ2VudDo6fkNTU0FnZW50KCkgeyBkaXNwYXRjaGVyXy0+UmVtb3ZlRG9tYWluKGtJbnNwZWN0b3JEb21haW4pOyB9CisKK3ZvaWQgQ1NTQWdlbnQ6OkVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7CisgIGJvb2wgaW5pdGlhbGl6ZWQgPSBkaXNwYXRjaGVyXy0+UnVuU2NyaXB0RmlsZShrU2NyaXB0RmlsZSk7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7CisgIH0gZWxzZSB7CisgICAgY29tbWFuZC5TZW5kRXJyb3JSZXNwb25zZShDb21tYW5kOjprSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIENTUyBpbnNwZWN0b3IuIik7CisgIH0KK30KKwordm9pZCBDU1NBZ2VudDo6RGlzYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7IGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7IH0KKworfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKK30gIC8vIG5hbWVzcGFjZSBkZWJ1ZworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2Nzc19hZ2VudC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2Nzc19hZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNGYwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvY3NzX2FnZW50LmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI2lmbmRlZiBDT0JBTFRfREVCVUdfQkFDS0VORF9DU1NfQUdFTlRfSF8KKyNkZWZpbmUgQ09CQUxUX0RFQlVHX0JBQ0tFTkRfQ1NTX0FHRU5UX0hfCisKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9jb21tYW5kX21hcC5oIgorI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29tbWFuZC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkZWJ1ZyB7CituYW1lc3BhY2UgYmFja2VuZCB7CisKK2NsYXNzIENTU0FnZW50IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENTU0FnZW50KERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlcik7CisgIH5DU1NBZ2VudCgpOworCisgcHJpdmF0ZToKKyAgdm9pZCBFbmFibGUoY29uc3QgQ29tbWFuZCYgY29tbWFuZCk7CisgIHZvaWQgRGlzYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKKworICAvLyBIZWxwZXIgb2JqZWN0IHRvIGNvbm5lY3QgdG8gdGhlIGRlYnVnIGRpc3BhdGNoZXIsIGV0Yy4KKyAgRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyXzsKKworICAvLyBNYXAgb2YgbWVtYmVyIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgY29tbWFuZHMuCisgIENvbW1hbmRNYXA8Q1NTQWdlbnQ+IGNvbW1hbmRzXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCit9ICAvLyBuYW1lc3BhY2UgZGVidWcKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfREVCVUdfQkFDS0VORF9DU1NfQUdFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19kaXNwYXRjaGVyLmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuY2MKaW5kZXggMzA5OGNiNy4uZTE2ODI0MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuY2MKQEAgLTMwLDEwICszMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9tOjpDc3BEZWxlZ2F0ZSogY3NwX2RlbGVnYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpTY3JpcHREZWJ1Z2dlciogc2NyaXB0X2RlYnVnZ2VyKQogICAgIDogc2NyaXB0X2RlYnVnZ2VyXyhzY3JpcHRfZGVidWdnZXIpLAotICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKHNjcmlwdF9ydW5uZXJfKAotICAgICAgICAgIG5ldyBEZWJ1Z1NjcmlwdFJ1bm5lcihnbG9iYWxfZW52aXJvbm1lbnQsIGNzcF9kZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmRGVidWdEaXNwYXRjaGVyOjpTZW5kRXZlbnRJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpKSwKKyAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVChzY3JpcHRfcnVubmVyXyhuZXcgRGVidWdTY3JpcHRSdW5uZXIoCisgICAgICAgICAgZ2xvYmFsX2Vudmlyb25tZW50LCBzY3JpcHRfZGVidWdnZXIsIGNzcF9kZWxlZ2F0ZSwKKyAgICAgICAgICBiYXNlOjpCaW5kKCZEZWJ1Z0Rpc3BhdGNoZXI6OlNlbmRFdmVudEludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKSksCiAgICAgICBtZXNzYWdlX2xvb3BfKE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpLAogICAgICAgaXNfcGF1c2VkXyhmYWxzZSksCiAgICAgICAvLyBObyBtYW51YWwgcmVzZXQsIG5vdCBpbml0aWFsbHkgc2lnbmFsZWQuCkBAIC00OCw2ICs0OCw4IEBACiAgICAgICAgaXQgIT0gY2xpZW50c18uZW5kKCk7ICsraXQpIHsKICAgICAoKml0KS0+T25EZXRhY2goZGV0YWNoX3JlYXNvbik7CiAgIH0KKyAgRENIRUNLKGRvbWFpbl9yZWdpc3RyeV8uZW1wdHkoKSkKKyAgICAgIDw8IGRvbWFpbl9yZWdpc3RyeV8uYmVnaW4oKS0+Zmlyc3QgPDwgIiBkb21haW4gc3RpbGwgcmVnaXN0ZXJlZC4iOwogICBmb3IgKERvbWFpblJlZ2lzdHJ5OjppdGVyYXRvciBpdCA9IGRvbWFpbl9yZWdpc3RyeV8uYmVnaW4oKTsKICAgICAgICBpdCAhPSBkb21haW5fcmVnaXN0cnlfLmVuZCgpOyArK2l0KSB7CiAgICAgUmVtb3ZlRG9tYWluKGl0LT5maXJzdCk7CkBAIC02MiwyNyArNjQsNiBAQAogICBjbGllbnRzXy5lcmFzZShjbGllbnQpOwogfQogCi1KU09OT2JqZWN0IERlYnVnRGlzcGF0Y2hlcjo6Q3JlYXRlUmVtb3RlT2JqZWN0KAotICAgIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIG9iamVjdCkgewotICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgLy8gVXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcGFyYW1ldGVycyBpbiB0aGUgSlMgY3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2suCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBrRGVmYXVsdFBhcmFtcyA9ICJ7fSI7Ci0KLSAgLy8gVGhpcyB3aWxsIGV4ZWN1dGUgYSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFJ1bnRpbWUuUmVtb3RlIG9iamVjdAotICAvLyB0aGF0IGRlc2NyaWJlcyB0aGUgb3BhcXVlIEphdmFTY3JpcHQgb2JqZWN0LgotICBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4ganNvbl9yZXN1bHQgPQotICAgICAgc2NyaXB0X3J1bm5lcl8tPkNyZWF0ZVJlbW90ZU9iamVjdChvYmplY3QsIGtEZWZhdWx0UGFyYW1zKTsKLQotICAvLyBQYXJzZSB0aGUgc2VyaWFsaXplZCBKU09OIHJlc3VsdC4KLSAgaWYgKGpzb25fcmVzdWx0KSB7Ci0gICAgcmV0dXJuIEpTT05QYXJzZShqc29uX3Jlc3VsdC52YWx1ZSgpKTsKLSAgfSBlbHNlIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJDb3VsZCBub3QgY3JlYXRlIFJ1bnRpbWUuUmVtb3RlT2JqZWN0IjsKLSAgICByZXR1cm4gSlNPTk9iamVjdChuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOwotICB9Ci19Ci0KIHZvaWQgRGVidWdEaXNwYXRjaGVyOjpTZW5kQ29tbWFuZChjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7CiAgIC8vIENyZWF0ZSBhIGNsb3N1cmUgdGhhdCB3aWxsIHJ1biB0aGUgY29tbWFuZCBhbmQgdGhlIHJlc3BvbnNlIGNhbGxiYWNrLgogICAvLyBUaGUgdGFzayBpcyBlaXRoZXIgcG9zdGVkIHRvIHRoZSBkZWJ1ZyB0YXJnZXQgKFdlYk1vZHVsZSkgdGhyZWFkIGlmCkBAIC0xNjgsMjQgKzE0OSw2IEBACiAgIFNlbmRFdmVudEludGVybmFsKG1ldGhvZCwganNvbl9wYXJhbXMpOwogfQogCi12b2lkIERlYnVnRGlzcGF0Y2hlcjo6U2VuZFNjcmlwdEV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25fcGFyYW1zKSB7Ci0gIHNjcmlwdDo6U2NyaXB0RGVidWdnZXI6OlNjb3BlZFBhdXNlT25FeGNlcHRpb25zU3RhdGUgbm9fcGF1c2UoCi0gICAgICBzY3JpcHRfZGVidWdnZXJfLCBzY3JpcHQ6OlNjcmlwdERlYnVnZ2VyOjprTm9uZSk7Ci0KLSAgc3RkOjpzdHJpbmcganNvbl9yZXN1bHQ7Ci0gIGJvb2wgc3VjY2VzcyA9IHNjcmlwdF9ydW5uZXJfLT5SdW5Db21tYW5kKG1ldGhvZCwganNvbl9wYXJhbXMsICZqc29uX3Jlc3VsdCk7Ci0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIlNjcmlwdCBldmVudCBmYWlsZWQgKCIgPDwgbWV0aG9kIDw8ICIpOiAiIDw8IGpzb25fcmVzdWx0OwotICB9IGVsc2UgaWYgKGpzb25fcmVzdWx0LmVtcHR5KCkpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiU2NyaXB0IGV2ZW50IG1ldGhvZCBub3QgZGVmaW5lZDogIiA8PCBtZXRob2Q7Ci0gIH0gZWxzZSB7Ci0gICAgU2VuZEV2ZW50SW50ZXJuYWwoZXZlbnQsIGpzb25fcmVzdWx0KTsKLSAgfQotfQotCiB2b2lkIERlYnVnRGlzcGF0Y2hlcjo6U2VuZEV2ZW50SW50ZXJuYWwoCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwgY29uc3QgYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBqc29uX3BhcmFtcykgewogICBmb3IgKHN0ZDo6c2V0PERlYnVnQ2xpZW50Kj46Oml0ZXJhdG9yIGl0ID0gY2xpZW50c18uYmVnaW4oKTsKQEAgLTIxNCwxNyArMTc3LDE3IEBACiAgIGJvb2wgc3VjY2VzcyA9IHNjcmlwdF9ydW5uZXJfLT5SdW5Db21tYW5kKG1ldGhvZCwganNvbl9wYXJhbXMsICZqc29uX3Jlc3VsdCk7CiAKICAgSlNPTk9iamVjdCByZXNwb25zZShuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOwotICBpZiAoanNvbl9yZXN1bHQuZW1wdHkoKSkgewotICAgIC8vIEFuIGVtcHR5IHJlc3VsdCBtZWFucyB0aGUgbWV0aG9kIGlzbid0IGltcGxlbWVudGVkIHNvIHJldHVybiBubyByZXNwb25zZS4KLSAgICByZXNwb25zZS5yZXNldCgpOwotICB9IGVsc2UgaWYgKCFzdWNjZXNzKSB7Ci0gICAgLy8gT24gZXJyb3IsIHxqc29uX3Jlc3VsdHwgaXMgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgcmVzcG9uc2UtPlNldFN0cmluZygiZXJyb3IubWVzc2FnZSIsIGpzb25fcmVzdWx0KTsKLSAgfSBlbHNlIHsKKyAgaWYgKHN1Y2Nlc3MpIHsKICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IEpTT05QYXJzZShqc29uX3Jlc3VsdCk7CiAgICAgaWYgKHJlc3VsdCkgewogICAgICAgcmVzcG9uc2UtPlNldCgicmVzdWx0IiwgcmVzdWx0LnJlbGVhc2UoKSk7CiAgICAgfQorICB9IGVsc2UgaWYgKCFqc29uX3Jlc3VsdC5lbXB0eSgpKSB7CisgICAgLy8gT24gZXJyb3IsIHxqc29uX3Jlc3VsdHwgaXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgcmVzcG9uc2UtPlNldFN0cmluZygiZXJyb3IubWVzc2FnZSIsIGpzb25fcmVzdWx0KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBBbiBlbXB0eSBlcnJvciBtZWFucyB0aGUgbWV0aG9kIGlzbid0IGltcGxlbWVudGVkIHNvIHJldHVybiBubyByZXNwb25zZS4KKyAgICByZXNwb25zZS5yZXNldCgpOwogICB9CiAgIHJldHVybiByZXNwb25zZS5QYXNzKCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfZGlzcGF0Y2hlci5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuaAppbmRleCBkMTQ4ZmY3Li4yMDVlNTU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfZGlzcGF0Y2hlci5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19kaXNwYXRjaGVyLmgKQEAgLTEwMywxOSArMTAzLDExIEBACiAgIC8vIGFnZW50cyBwcm92aWRpbmcgdGhlIHByb3RvY29sIGNvbW1hbmQgaW1wbGVtZW50YXRpb25zLgogICB2b2lkIFJlbW92ZURvbWFpbihjb25zdCBzdGQ6OnN0cmluZyYgZG9tYWluKTsKIAotICAvLyBDcmVhdGVzIGEgUnVudGltZS5SZW1vdGVPYmplY3QgZnJvbSBhbiBlbmdpbmUgb2JqZWN0LgotICBKU09OT2JqZWN0IENyZWF0ZVJlbW90ZU9iamVjdChjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyKiBvYmplY3QpOwotCiAgIC8vIENhbGxlZCBieSB0aGUgZGVidWcgYWdlbnRzIHdoZW4gYW4gZXZlbnQgb2NjdXJzLgogICAvLyBTZXJpYWxpemVzIHRoZSBtZXRob2QgYW5kIHBhcmFtcyBvYmplY3QgdG8gYSBKU09OIHN0cmluZyBhbmQKICAgLy8gY2FsbHMgfFNlbmRFdmVudEludGVybmFsfC4KICAgdm9pZCBTZW5kRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwgY29uc3QgSlNPTk9iamVjdCYgcGFyYW1zKTsKIAotICAvLyBSdW5zIGEgSmF2YVNjcmlwdCBmdW5jdGlvbiB3aXRoIG9wdGlvbmFsIEpTT04gcGFyYW1ldGVycywgYW5kIHNlbmRzIHRoZQotICAvLyBldmVudCBpdCByZXR1cm5zIHdpdGggfFNlbmRFdmVudHwuCi0gIHZvaWQgU2VuZFNjcmlwdEV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25fcGFyYW1zID0gIiIpOwotCiAgIC8vIENhbGxzIHxtZXRob2R8IGluIHxzY3JpcHRfcnVubmVyX3wgYW5kIGNyZWF0ZXMgYSByZXNwb25zZSBvYmplY3QgZnJvbQogICAvLyB0aGUgcmVzdWx0LgogICBKU09OT2JqZWN0IFJ1blNjcmlwdENvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19tb2R1bGUuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmNjCmluZGV4IDA0MDYwNmYuLmU1NjExYTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5jYwpAQCAtOTksMTAgKzk5LDYgQEAKICAgc2NyaXB0X2RlYnVnZ2VyX2FnZW50Xy5yZXNldCgKICAgICAgIG5ldyBTY3JpcHREZWJ1Z2dlckFnZW50KGRlYnVnX2Rpc3BhdGNoZXJfLmdldCgpLCBzY3JpcHRfZGVidWdnZXJfLmdldCgpKSk7CiAKLSAgaWYgKCFzY3JpcHRfZGVidWdnZXJfYWdlbnRfLT5Jc1N1cHBvcnRlZERvbWFpbigiUnVudGltZSIpKSB7Ci0gICAgcnVudGltZV9hZ2VudF8ucmVzZXQobmV3IFJ1bnRpbWVBZ2VudChkZWJ1Z19kaXNwYXRjaGVyXy5nZXQoKSkpOwotICB9Ci0KICAgY29uc29sZV9hZ2VudF8ucmVzZXQobmV3IENvbnNvbGVBZ2VudChkZWJ1Z19kaXNwYXRjaGVyXy5nZXQoKSwgZGF0YS5jb25zb2xlKSk7CiAKICAgbG9nX2FnZW50Xy5yZXNldChuZXcgTG9nQWdlbnQoZGVidWdfZGlzcGF0Y2hlcl8uZ2V0KCkpKTsKQEAgLTExMCw2ICsxMDYsOCBAQAogICBkb21fYWdlbnRfLnJlc2V0KAogICAgICAgbmV3IERPTUFnZW50KGRlYnVnX2Rpc3BhdGNoZXJfLmdldCgpLCBkb21fcmVuZGVyX2xheWVyLlBhc3MoKSkpOwogCisgIGNzc19hZ2VudF8ucmVzZXQobmV3IENTU0FnZW50KGRlYnVnX2Rpc3BhdGNoZXJfLmdldCgpKSk7CisKICAgcGFnZV9hZ2VudF8ucmVzZXQobmV3IFBhZ2VBZ2VudChkZWJ1Z19kaXNwYXRjaGVyXy5nZXQoKSwgZGF0YS53aW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9yZW5kZXJfbGF5ZXIuUGFzcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzb3VyY2VfcHJvdmlkZXIpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19tb2R1bGUuaCBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19tb2R1bGUuaAppbmRleCAzZTQxNjEyLi5kOWJhMGEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5oCkBAIC0yMCwxMiArMjAsMTIgQEAKICNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvY29uc29sZV9hZ2VudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2Nzc19hZ2VudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9kb21fYWdlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9sb2dfYWdlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9wYWdlX2FnZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvcmVuZGVyX292ZXJsYXkuaCIKLSNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9ydW50aW1lX2FnZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvdHJhY2luZ19hZ2VudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vY29uc29sZS5oIgpAQCAtMTExLDggKzExMSw4IEBACiAgIHNjb3BlZF9wdHI8Q29uc29sZUFnZW50PiBjb25zb2xlX2FnZW50XzsKICAgc2NvcGVkX3B0cjxMb2dBZ2VudD4gbG9nX2FnZW50XzsKICAgc2NvcGVkX3B0cjxET01BZ2VudD4gZG9tX2FnZW50XzsKKyAgc2NvcGVkX3B0cjxDU1NBZ2VudD4gY3NzX2FnZW50XzsKICAgc2NvcGVkX3B0cjxQYWdlQWdlbnQ+IHBhZ2VfYWdlbnRfOwotICBzY29wZWRfcHRyPFJ1bnRpbWVBZ2VudD4gcnVudGltZV9hZ2VudF87CiAgIHNjb3BlZF9wdHI8U2NyaXB0RGVidWdnZXJBZ2VudD4gc2NyaXB0X2RlYnVnZ2VyX2FnZW50XzsKICAgc2NvcGVkX3B0cjxUcmFjaW5nQWdlbnQ+IHRyYWNpbmdfYWdlbnRfOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19zY3JpcHRfcnVubmVyLmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX3NjcmlwdF9ydW5uZXIuY2MKaW5kZXggZjk3ZmFiNy4uYzhkYjI3YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX3NjcmlwdF9ydW5uZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX3NjcmlwdF9ydW5uZXIuY2MKQEAgLTI4LDE0ICsyOCwxNiBAQAogCiBuYW1lc3BhY2UgewogY29uc3QgY2hhciBrQ29udGVudERpcltdID0gImNvYmFsdC9kZWJ1Zy9iYWNrZW5kIjsKLWNvbnN0IGNoYXIga09iamVjdElkZW50aWZpZXJbXSA9ICJkZXZ0b29sc0JhY2tlbmQiOworY29uc3QgY2hhciBrT2JqZWN0SWRlbnRpZmllcltdID0gImRlYnVnU2NyaXB0UnVubmVyIjsKIH0gIC8vIG5hbWVzcGFjZQogCiBEZWJ1Z1NjcmlwdFJ1bm5lcjo6RGVidWdTY3JpcHRSdW5uZXIoCiAgICAgc2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50LAorICAgIHNjcmlwdDo6U2NyaXB0RGVidWdnZXIqIHNjcmlwdF9kZWJ1Z2dlciwKICAgICBjb25zdCBkb206OkNzcERlbGVnYXRlKiBjc3BfZGVsZWdhdGUsCiAgICAgY29uc3QgT25FdmVudENhbGxiYWNrJiBvbl9ldmVudF9jYWxsYmFjaykKICAgICA6IGdsb2JhbF9lbnZpcm9ubWVudF8oZ2xvYmFsX2Vudmlyb25tZW50KSwKKyAgICAgIHNjcmlwdF9kZWJ1Z2dlcl8oc2NyaXB0X2RlYnVnZ2VyKSwKICAgICAgIGNzcF9kZWxlZ2F0ZV8oY3NwX2RlbGVnYXRlKSwKICAgICAgIG9uX2V2ZW50X2NhbGxiYWNrXyhvbl9ldmVudF9jYWxsYmFjaykgewogICAvLyBCaW5kIHRoaXMgb2JqZWN0IHRvIHRoZSBnbG9iYWwgb2JqZWN0IHNvIGl0IGNhbiBwZXJzaXN0IHN0YXRlIGFuZCBiZQpAQCAtNDMsMjEgKzQ1LDYgQEAKICAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+QmluZChrT2JqZWN0SWRlbnRpZmllciwgbWFrZV9zY29wZWRfcmVmcHRyKHRoaXMpKTsKIH0KIAotYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IERlYnVnU2NyaXB0UnVubmVyOjpDcmVhdGVSZW1vdGVPYmplY3QoCi0gICAgY29uc3Qgc2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlciogb2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1zKSB7Ci0gIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGJlZW4gc2V0IGJ5IHJ1bnRpbWUuanMuCi0gIERDSEVDSyhjcmVhdGVfcmVtb3RlX29iamVjdF9jYWxsYmFja18pOwotCi0gIENyZWF0ZVJlbW90ZU9iamVjdENhbGxiYWNrOjpSZXR1cm5WYWx1ZSByZXN1bHQgPQotICAgICAgY3JlYXRlX3JlbW90ZV9vYmplY3RfY2FsbGJhY2tfLT52YWx1ZSgpLlJ1bihvYmplY3QsIHBhcmFtcyk7Ci0gIGlmIChyZXN1bHQuZXhjZXB0aW9uKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCAiRXhjZXB0aW9uIGNyZWF0aW5nIHJlbW90ZSBvYmplY3QuIjsKLSAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDsKLSAgfQotfQotCiBib29sIERlYnVnU2NyaXB0UnVubmVyOjpSdW5Db21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uX3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGpzb25fcmVzdWx0KSB7CkBAIC03MCwzNCArNTcsMTEgQEAKICAgICAgICIgICAgPyAnJyA6ICVzLiVzKCVzKTsiLAogICAgICAga09iamVjdElkZW50aWZpZXIsIGRvbWFpbi5jX3N0cigpLCBrT2JqZWN0SWRlbnRpZmllciwgbWV0aG9kLmNfc3RyKCksCiAgICAgICBrT2JqZWN0SWRlbnRpZmllciwgbWV0aG9kLmNfc3RyKCksIGpzb25fcGFyYW1zLmNfc3RyKCkpOwotICByZXR1cm4gRXZhbHVhdGVTY3JpcHQoc2NyaXB0LCBqc29uX3Jlc3VsdCk7CisgIHJldHVybiBFdmFsdWF0ZURlYnVnZ2VyU2NyaXB0KHNjcmlwdCwganNvbl9yZXN1bHQpICYmICFqc29uX3Jlc3VsdC0+ZW1wdHkoKTsKIH0KIAogYm9vbCBEZWJ1Z1NjcmlwdFJ1bm5lcjo6UnVuU2NyaXB0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICBib29sIHN1Y2Nlc3MgPSBFdmFsdWF0ZVNjcmlwdEZpbGUoZmlsZW5hbWUsICZyZXN1bHQpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcnVuIHNjcmlwdCBmaWxlICIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCByZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWJvb2wgRGVidWdTY3JpcHRSdW5uZXI6OkV2YWx1YXRlU2NyaXB0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc19jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3VsdCkgewotICBEQ0hFQ0soZ2xvYmFsX2Vudmlyb25tZW50Xyk7Ci0gIERDSEVDSyhyZXN1bHQpOwotICBzY29wZWRfcmVmcHRyPHNjcmlwdDo6U291cmNlQ29kZT4gc291cmNlX2NvZGUgPQotICAgICAgc2NyaXB0OjpTb3VyY2VDb2RlOjpDcmVhdGVTb3VyY2VDb2RlKGpzX2NvZGUsIEdldElubGluZVNvdXJjZUxvY2F0aW9uKCkpOwotCi0gIEZvcmNlRW5hYmxlRXZhbCgpOwotICBib29sIHN1Y2NlZWRlZCA9IGdsb2JhbF9lbnZpcm9ubWVudF8tPkV2YWx1YXRlU2NyaXB0KHNvdXJjZV9jb2RlLCByZXN1bHQpOwotICBTZXRFdmFsQWxsb3dlZEZyb21Dc3AoKTsKLSAgcmV0dXJuIHN1Y2NlZWRlZDsKLX0KLQotYm9vbCBEZWJ1Z1NjcmlwdFJ1bm5lcjo6RXZhbHVhdGVTY3JpcHRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogcmVzdWx0KSB7Ci0gIERDSEVDSyhyZXN1bHQpOwogCiAgIEZpbGVQYXRoIGZpbGVfcGF0aDsKICAgUGF0aFNlcnZpY2U6OkdldChwYXRoczo6RElSX0NPQkFMVF9XRUJfUk9PVCwgJmZpbGVfcGF0aCk7CkBAIC0xMTAsNyArNzQsMjAgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICByZXR1cm4gRXZhbHVhdGVTY3JpcHQoc2NyaXB0LCByZXN1bHQpOworICBpZiAoIUV2YWx1YXRlRGVidWdnZXJTY3JpcHQoc2NyaXB0LCBudWxscHRyKSkgeworICAgIERMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcnVuIHNjcmlwdCBmaWxlICIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCByZXN1bHQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIERlYnVnU2NyaXB0UnVubmVyOjpFdmFsdWF0ZURlYnVnZ2VyU2NyaXB0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfcmVzdWx0X3V0ZjgpIHsKKyAgRm9yY2VFbmFibGVFdmFsKCk7CisgIGJvb2wgc3VjY2VzcyA9CisgICAgICBzY3JpcHRfZGVidWdnZXJfLT5FdmFsdWF0ZURlYnVnZ2VyU2NyaXB0KHNjcmlwdCwgb3V0X3Jlc3VsdF91dGY4KTsKKyAgU2V0RXZhbEFsbG93ZWRGcm9tQ3NwKCk7CisgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkIERlYnVnU2NyaXB0UnVubmVyOjpTZW5kRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwKQEAgLTExOCw2ICs5NSwxMSBAQAogICBvbl9ldmVudF9jYWxsYmFja18uUnVuKG1ldGhvZCwgcGFyYW1zKTsKIH0KIAorc3RkOjpzdHJpbmcgRGVidWdTY3JpcHRSdW5uZXI6OkNyZWF0ZVJlbW90ZU9iamVjdCgKKyAgICBjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyJiBvYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBncm91cCkgeworICByZXR1cm4gc2NyaXB0X2RlYnVnZ2VyXy0+Q3JlYXRlUmVtb3RlT2JqZWN0KG9iamVjdCwgZ3JvdXApOworfQorCiB2b2lkIERlYnVnU2NyaXB0UnVubmVyOjpGb3JjZUVuYWJsZUV2YWwoKSB7CiAgIGdsb2JhbF9lbnZpcm9ubWVudF8tPkVuYWJsZUV2YWwoKTsKICAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+U2V0UmVwb3J0RXZhbENhbGxiYWNrKGJhc2U6OkNsb3N1cmUoKSk7CkBAIC0xMzYsMjAgKzExOCw2IEBACiAgICAgICAmZG9tOjpDc3BEZWxlZ2F0ZTo6UmVwb3J0RXZhbCwgYmFzZTo6VW5yZXRhaW5lZChjc3BfZGVsZWdhdGVfKSkpOwogfQogCi1jb25zdCBEZWJ1Z1NjcmlwdFJ1bm5lcjo6Q3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2tIb2xkZXIqCi1EZWJ1Z1NjcmlwdFJ1bm5lcjo6Y3JlYXRlX3JlbW90ZV9vYmplY3RfY2FsbGJhY2soKSB7Ci0gIGlmIChjcmVhdGVfcmVtb3RlX29iamVjdF9jYWxsYmFja18pIHsKLSAgICByZXR1cm4gJihjcmVhdGVfcmVtb3RlX29iamVjdF9jYWxsYmFja18tPnJlZmVyZW5jZWRfdmFsdWUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotdm9pZCBEZWJ1Z1NjcmlwdFJ1bm5lcjo6c2V0X2NyZWF0ZV9yZW1vdGVfb2JqZWN0X2NhbGxiYWNrKAotICAgIGNvbnN0IENyZWF0ZVJlbW90ZU9iamVjdENhbGxiYWNrSG9sZGVyJiBjYWxsYmFjaykgewotICBjcmVhdGVfcmVtb3RlX29iamVjdF9jYWxsYmFja18uZW1wbGFjZSh0aGlzLCBjYWxsYmFjayk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCiB9ICAvLyBuYW1lc3BhY2UgZGVidWcKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19zY3JpcHRfcnVubmVyLmggYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfc2NyaXB0X3J1bm5lci5oCmluZGV4IGY3ODNhMDcuLjU4ODUxNWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19zY3JpcHRfcnVubmVyLmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX3NjcmlwdF9ydW5uZXIuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vY3NwX2RlbGVnYXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfZGVidWdnZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdmFsdWVfaGFuZGxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKQEAgLTQ2LDI3ICs0NywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBwYXJhbXMpPgogICAgICAgT25FdmVudENhbGxiYWNrOwogCi0gIC8vIENhbGxiYWNrIHRvIGNyZWF0ZSBhIEphdmFTY3JpcHQgUnVudGltZS5SZW1vdGVPYmplY3QgZnJvbSBhbiBvcGFxdWUgSlMKLSAgLy8gb2JqZWN0LgotICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjxzdGQ6OnN0cmluZyhjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmKT4KLSAgICAgIENyZWF0ZVJlbW90ZU9iamVjdENhbGxiYWNrOwotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8Q3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2s+Ci0gICAgICBDcmVhdGVSZW1vdGVPYmplY3RDYWxsYmFja0hvbGRlcjsKLQogICBEZWJ1Z1NjcmlwdFJ1bm5lcihzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6U2NyaXB0RGVidWdnZXIqIHNjcmlwdF9kZWJ1Z2dlciwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9tOjpDc3BEZWxlZ2F0ZSogY3NwX2RlbGVnYXRlLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBPbkV2ZW50Q2FsbGJhY2smIG9uX2V2ZW50X2NhbGxiYWNrKTsKIAotICAvLyBDcmVhdGVzIGEgUnVudGltZS5SZW1vdGVPYmplY3QgY29ycmVzcG9uZGluZyB0byBhbiBvcGFxdWUgSlMgb2JqZWN0LCBieQotICAvLyBjYWxsaW5nIHRoZSB8Y3JlYXRlX3JlbW90ZV9vYmplY3RfY2FsbGJhY2tffCBzY3JpcHQgZnVuY3Rpb24uCi0gIC8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sLzEtMy9SdW50aW1lI3R5cGUtUmVtb3RlT2JqZWN0Ci0gIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBDcmVhdGVSZW1vdGVPYmplY3QoCi0gICAgICBjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyKiBvYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbXMpOwotCi0gIC8vIFJ1bnMgfG1ldGhvZHwgb24gdGhlIEphdmFTY3JpcHQgfHJ1bnRpbWVJbnNwZWN0b3J8IG9iamVjdCwgcGFzc2luZyBpbgotICAvLyB8anNvbl9wYXJhbXN8IGFuZCBwdXR0aW5nIHRoZSByZXN1bHQgaW4gfGpzb25fcmVzdWx0fC4KLSAgLy8gUmV0dXJucyB8dHJ1ZXwgaWYgZXhlY3V0aW9uIHdhcyBzdWNjZXNzZnVsLCB8ZmFsc2V8IG90aGVyd2lzZS4KKyAgLy8gUnVucyB8bWV0aG9kfCBvbiB0aGUgSmF2YVNjcmlwdCB8ZGV2dG9vbHNCYWNrZW5kfCBvYmplY3QsIHBhc3NpbmcgaW4KKyAgLy8gfGpzb25fcGFyYW1zfC4gSWYgfGpzb25fcmVzdWx0fCBpcyBub24tTlVMTCBpdCByZWNlaXZlcyB0aGUgcmVzdWx0LgorICAvLyBSZXR1cm5zIHx0cnVlfCBpZiB0aGUgbWV0aG9kIHdhcyBleGVjdXRlZDsgfGpzb25fcmVzdWx0fCBpcyB0aGUgdmFsdWUKKyAgLy8gcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC4KKyAgLy8gUmV0dXJucyB8ZmFsc2V8IGlmIHRoZSBtZXRob2Qgd2Fzbid0IGV4ZWN1dGVkOyBpZiB0aGUgbWV0aG9kIGlzbid0IGRlZmluZWQKKyAgLy8gfGpzb25fcmVzdWx0fCBpcyBlbXB0eSwgb3RoZXJ3aXNlIGl0J3MgYW4gZXJyb3IgbWVzc2FnZS4KICAgYm9vbCBSdW5Db21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uX3BhcmFtcywKICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBqc29uX3Jlc3VsdCk7CiAKQEAgLTc0LDIxICs2NSwyMSBAQAogICAvLyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBKUyBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIGNsYXNzLgogICBib29sIFJ1blNjcmlwdEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKIAotICAvLyBOb24tc3RhbmRhcmQgSmF2YVNjcmlwdCBleHRlbnNpb24gQVBJLgotICAvLyBDYWxsZWQgdG8gc2VuZCBhbiBldmVudCB2aWEgdGhlIGNhbGxiYWNrIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIC8vIElETDogU2VuZHMgYSBwcm90b2NvbCBldmVudCB0byB0aGUgZGVidWdnZXIgZnJvbnRlbmQuCiAgIHZvaWQgU2VuZEV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgcGFyYW1zKTsKIAotICAvLyBHZXQvU2V0IHxjcmVhdGVfcmVtb3RlX29iamVjdF9jYWxsYmFja198LgotICBjb25zdCBDcmVhdGVSZW1vdGVPYmplY3RDYWxsYmFja0hvbGRlciogY3JlYXRlX3JlbW90ZV9vYmplY3RfY2FsbGJhY2soKTsKLSAgdm9pZCBzZXRfY3JlYXRlX3JlbW90ZV9vYmplY3RfY2FsbGJhY2soCi0gICAgICBjb25zdCBDcmVhdGVSZW1vdGVPYmplY3RDYWxsYmFja0hvbGRlciYgY2FsbGJhY2spOworICAvLyBJREw6IFJldHVybnMgdGhlIFJlbW90ZU9iamVjdCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBvYmplY3QgZm9yCisgIC8vIHRoZSBkZWJ1Z2dlciBmcm9udGVuZC4KKyAgLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL1J1bnRpbWUjdHlwZS1SZW1vdGVPYmplY3QKKyAgc3RkOjpzdHJpbmcgQ3JlYXRlUmVtb3RlT2JqZWN0KGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXImIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBncm91cCk7CiAKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKERlYnVnU2NyaXB0UnVubmVyKTsKIAogIHByaXZhdGU6Ci0gIGJvb2wgRXZhbHVhdGVTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzX2NvZGUsIHN0ZDo6c3RyaW5nKiByZXN1bHQpOwotICBib29sIEV2YWx1YXRlU2NyaXB0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIHN0ZDo6c3RyaW5nKiByZXN1bHQpOworICBib29sIEV2YWx1YXRlRGVidWdnZXJTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfcmVzdWx0X3V0ZjgpOwogCiAgIC8vIEVuc3VyZXMgdGhlIEpTIGV2YWwgY29tbWFuZCBpcyBlbmFibGVkLCBvdmVycmlkaW5nIENTUCBpZiBuZWNlc3NhcnkuCiAgIHZvaWQgRm9yY2VFbmFibGVFdmFsKCk7CkBAIC05OCwxNSArODksMTQgQEAKICAgLy8gTm8gb3duZXJzaGlwLgogICBzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnRfOwogCisgIC8vIEVuZ2luZS1zcGVjaWZpYyBkZWJ1Z2dlciBpbXBsZW1lbnRhdGlvbi4KKyAgc2NyaXB0OjpTY3JpcHREZWJ1Z2dlciogc2NyaXB0X2RlYnVnZ2VyXzsKKwogICAvLyBOb24tb3duZWQgcmVmZXJlbmNlIHRvIGxldCB0aGlzIG9iamVjdCBxdWVyeSB3aGV0aGVyIENTUCBhbGxvd3MgZXZhbC4KICAgY29uc3QgZG9tOjpDc3BEZWxlZ2F0ZSogY3NwX2RlbGVnYXRlXzsKIAogICAvLyBDYWxsYmFjayB0byBzZW5kIGV2ZW50cy4KICAgT25FdmVudENhbGxiYWNrIG9uX2V2ZW50X2NhbGxiYWNrXzsKLQotICAvLyBDYWxsYmFjayB0byBjcmVhdGUgYSBSdW50aW1lLlJlbW90ZU9iamVjdC4KLSAgYmFzZTo6b3B0aW9uYWw8Q3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2tIb2xkZXI6OlJlZmVyZW5jZT4KLSAgICAgIGNyZWF0ZV9yZW1vdGVfb2JqZWN0X2NhbGxiYWNrXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfc2NyaXB0X3J1bm5lci5pZGwgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfc2NyaXB0X3J1bm5lci5pZGwKaW5kZXggNzQwNzhjYy4uZDQzNDE2YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX3NjcmlwdF9ydW5uZXIuaWRsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19zY3JpcHRfcnVubmVyLmlkbApAQCAtMTcsOCArMTcsNSBAQAogXQogaW50ZXJmYWNlIERlYnVnU2NyaXB0UnVubmVyIHsKICAgdm9pZCBzZW5kRXZlbnQoRE9NU3RyaW5nIG1ldGhvZCwgRE9NU3RyaW5nPyBwYXJhbXMpOwotICBhdHRyaWJ1dGUgQ3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2sgY3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2s7CisgIERPTVN0cmluZyBjcmVhdGVSZW1vdGVPYmplY3QoYW55IG9iaiwgRE9NU3RyaW5nIGdyb3VwKTsKIH07Ci0KLWNhbGxiYWNrIENyZWF0ZVJlbW90ZU9iamVjdENhbGxiYWNrID0KLSAgICBET01TdHJpbmcob2JqZWN0IG9iaiwgRE9NU3RyaW5nIGpzb25QYXJhbXMpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5jYyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kb21fYWdlbnQuY2MKaW5kZXggYzg1NGI5Mi4uYTllOTI2NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZG9tX2FnZW50LmNjCkBAIC0yOCwzMyArMjgsMzEgQEAKIG5hbWVzcGFjZSBiYWNrZW5kIHsKIAogbmFtZXNwYWNlIHsKLS8vIEZpbGUgdG8gbG9hZCBKYXZhU2NyaXB0IERPTSBkZWJ1Z2dpbmcgZG9tYWluIGltcGxlbWVudGF0aW9uIGZyb20uCi1jb25zdCBjaGFyIGtTY3JpcHRGaWxlW10gPSAiZG9tLmpzIjsKKy8vIERlZmluaXRpb25zIGZyb20gdGhlIHNldCBzcGVjaWZpZWQgaGVyZToKKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9ET00KK2NvbnN0ZXhwciBjaGFyIGtJbnNwZWN0b3JEb21haW5bXSA9ICJET00iOwogCi0vLyBQYXJhbWV0ZXIgbmFtZXM6Ci1jb25zdCBjaGFyIGtBW10gPSAiYSI7Ci1jb25zdCBjaGFyIGtCW10gPSAiYiI7Ci1jb25zdCBjaGFyIGtDb250ZW50Q29sb3JbXSA9ICJjb250ZW50Q29sb3IiOwotY29uc3QgY2hhciBrR1tdID0gImciOwotY29uc3QgY2hhciBrSGlnaGxpZ2h0Q29uZmlnW10gPSAiaGlnaGxpZ2h0Q29uZmlnIjsKLWNvbnN0IGNoYXIga1JbXSA9ICJyIjsKKy8vIEZpbGUgdG8gbG9hZCBKYXZhU2NyaXB0IERPTSBkZWJ1Z2dpbmcgZG9tYWluIGltcGxlbWVudGF0aW9uIGZyb20uCitjb25zdGV4cHIgY2hhciBrU2NyaXB0RmlsZVtdID0gImRvbV9hZ2VudC5qcyI7CiB9ICAvLyBuYW1lc3BhY2UKIAogRE9NQWdlbnQ6OkRPTUFnZW50KERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwKICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPFJlbmRlckxheWVyPiByZW5kZXJfbGF5ZXIpCiAgICAgOiBkaXNwYXRjaGVyXyhkaXNwYXRjaGVyKSwKICAgICAgIHJlbmRlcl9sYXllcl8ocmVuZGVyX2xheWVyLlBhc3MoKSksCi0gICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoY29tbWFuZHNfKHRoaXMpKSB7CisgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoY29tbWFuZHNfKHRoaXMsIGtJbnNwZWN0b3JEb21haW4pKSB7CiAgIERDSEVDSyhkaXNwYXRjaGVyXyk7CiAKLSAgY29tbWFuZHNfWyJET00uZGlzYWJsZSJdID0gJkRPTUFnZW50OjpEaXNhYmxlOwotICBjb21tYW5kc19bIkRPTS5lbmFibGUiXSA9ICZET01BZ2VudDo6RW5hYmxlOwotICBjb21tYW5kc19bIkRPTS5oaWdobGlnaHROb2RlIl0gPSAmRE9NQWdlbnQ6OkhpZ2hsaWdodE5vZGU7Ci0gIGNvbW1hbmRzX1siRE9NLmhpZGVIaWdobGlnaHQiXSA9ICZET01BZ2VudDo6SGlkZUhpZ2hsaWdodDsKKyAgY29tbWFuZHNfWyJkaXNhYmxlIl0gPSAmRE9NQWdlbnQ6OkRpc2FibGU7CisgIGNvbW1hbmRzX1siZW5hYmxlIl0gPSAmRE9NQWdlbnQ6OkVuYWJsZTsKKyAgY29tbWFuZHNfWyJoaWdobGlnaHROb2RlIl0gPSAmRE9NQWdlbnQ6OkhpZ2hsaWdodE5vZGU7CisgIGNvbW1hbmRzX1siaGlkZUhpZ2hsaWdodCJdID0gJkRPTUFnZW50OjpIaWRlSGlnaGxpZ2h0OwogCi0gIGRpc3BhdGNoZXJfLT5BZGREb21haW4oIkRPTSIsIGNvbW1hbmRzXy5CaW5kKCkpOworICBkaXNwYXRjaGVyXy0+QWRkRG9tYWluKGtJbnNwZWN0b3JEb21haW4sIGNvbW1hbmRzXy5CaW5kKCkpOwogfQogCitET01BZ2VudDo6fkRPTUFnZW50KCkgeyBkaXNwYXRjaGVyXy0+UmVtb3ZlRG9tYWluKGtJbnNwZWN0b3JEb21haW4pOyB9CisKIHZvaWQgRE9NQWdlbnQ6OkVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7CiAgIGJvb2wgaW5pdGlhbGl6ZWQgPSBkaXNwYXRjaGVyXy0+UnVuU2NyaXB0RmlsZShrU2NyaXB0RmlsZSk7CiAgIGlmIChpbml0aWFsaXplZCkgewpAQCAtNzUsNyArNzMsNyBAQAogdm9pZCBET01BZ2VudDo6SGlnaGxpZ2h0Tm9kZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7CiAgIC8vIEdldCB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KICAgSlNPTk9iamVjdCBqc29uX2RvbV9yZWN0ID0gZGlzcGF0Y2hlcl8tPlJ1blNjcmlwdENvbW1hbmQoCi0gICAgICAiZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIGNvbW1hbmQuR2V0UGFyYW1zKCkpOworICAgICAgImRvbS5fZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgY29tbWFuZC5HZXRQYXJhbXMoKSk7CiAgIGRvdWJsZSB4ID0gMC4wOwogICBkb3VibGUgeSA9IDAuMDsKICAgZG91YmxlIHdpZHRoID0gMC4wOwpAQCAtOTMsNyArOTEsNyBAQAogICBKU09OT2JqZWN0IHBhcmFtcyA9IEpTT05QYXJzZShjb21tYW5kLkdldFBhcmFtcygpKTsKICAgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBoaWdobGlnaHRfY29uZmlnX3ZhbHVlID0gTlVMTDsKICAgYm9vbCBnb3RfaGlnaGxpZ2h0X2NvbmZpZyA9Ci0gICAgICBwYXJhbXMtPkdldERpY3Rpb25hcnkoa0hpZ2hsaWdodENvbmZpZywgJmhpZ2hsaWdodF9jb25maWdfdmFsdWUpOworICAgICAgcGFyYW1zLT5HZXREaWN0aW9uYXJ5KCJoaWdobGlnaHRDb25maWciLCAmaGlnaGxpZ2h0X2NvbmZpZ192YWx1ZSk7CiAgIERDSEVDSyhnb3RfaGlnaGxpZ2h0X2NvbmZpZyk7CiAgIERDSEVDSyhoaWdobGlnaHRfY29uZmlnX3ZhbHVlKTsKIApAQCAtMTE5LDEyICsxMTcsMTIgQEAKICAgZG91YmxlIGEgPSAwLjY2OwogICBjb25zdCBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUqIGNvbnRlbnRfY29sb3IgPSBOVUxMOwogICBib29sIGdvdF9jb250ZW50X2NvbG9yID0KLSAgICAgIGhpZ2hsaWdodF9jb25maWdfdmFsdWUtPkdldERpY3Rpb25hcnkoa0NvbnRlbnRDb2xvciwgJmNvbnRlbnRfY29sb3IpOworICAgICAgaGlnaGxpZ2h0X2NvbmZpZ192YWx1ZS0+R2V0RGljdGlvbmFyeSgiY29udGVudENvbG9yIiwgJmNvbnRlbnRfY29sb3IpOwogICBpZiAoZ290X2NvbnRlbnRfY29sb3IgJiYgY29udGVudF9jb2xvcikgewotICAgIGNvbnRlbnRfY29sb3ItPkdldEludGVnZXIoa1IsICZyKTsKLSAgICBjb250ZW50X2NvbG9yLT5HZXRJbnRlZ2VyKGtHLCAmZyk7Ci0gICAgY29udGVudF9jb2xvci0+R2V0SW50ZWdlcihrQiwgJmIpOwotICAgIGNvbnRlbnRfY29sb3ItPkdldERvdWJsZShrQSwgJmEpOworICAgIGNvbnRlbnRfY29sb3ItPkdldEludGVnZXIoInIiLCAmcik7CisgICAgY29udGVudF9jb2xvci0+R2V0SW50ZWdlcigiZyIsICZnKTsKKyAgICBjb250ZW50X2NvbG9yLT5HZXRJbnRlZ2VyKCJiIiwgJmIpOworICAgIGNvbnRlbnRfY29sb3ItPkdldERvdWJsZSgiYSIsICZhKTsKICAgfQogICByZW5kZXJfdHJlZTo6Q29sb3JSR0JBIGNvbG9yKHIgLyAyNTUuMGYsIGcgLyAyNTUuMGYsIGIgLyAyNTUuMGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kb21fYWdlbnQuaCBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9kb21fYWdlbnQuaAppbmRleCA2NGNmZDc5Li44MDliZDQ0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvZG9tX2FnZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RvbV9hZ2VudC5oCkBAIC0zMiw2ICszMiw3IEBACiBjbGFzcyBET01BZ2VudCB7CiAgcHVibGljOgogICBET01BZ2VudChEZWJ1Z0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXIsIHNjb3BlZF9wdHI8UmVuZGVyTGF5ZXI+IHJlbmRlcl9sYXllcik7CisgIH5ET01BZ2VudCgpOwogCiAgcHJpdmF0ZToKICAgdm9pZCBFbmFibGUoY29uc3QgQ29tbWFuZCYgY29tbWFuZCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvamF2YXNjcmlwdF9kZWJ1Z2dlcl9hZ2VudC5jYyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9qYXZhc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTlkMTY0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9qYXZhc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2phdmFzY3JpcHRfZGVidWdnZXJfYWdlbnQuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKLSNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGRlYnVnIHsKLW5hbWVzcGFjZSBiYWNrZW5kIHsKLQotbmFtZXNwYWNlIHsKLS8vIENvbW1hbmQsIHBhcmFtZXRlciBhbmQgZXZlbnQgbmFtZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBwcm90b2NvbDoKLS8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sLzEtMy9EZWJ1Z2dlcgotCi0vLyBQYXJhbWV0ZXIgbmFtZXMuCi1jb25zdCBjaGFyIGtDYWxsRnJhbWVJZFtdID0gImNhbGxGcmFtZUlkIjsKLWNvbnN0IGNoYXIga0NhbGxGcmFtZXNbXSA9ICJjYWxsRnJhbWVzIjsKLWNvbnN0IGNoYXIga0NvbHVtbk51bWJlcltdID0gImNvbHVtbk51bWJlciI7Ci1jb25zdCBjaGFyIGtFcnJvckxpbmVbXSA9ICJlcnJvckxpbmUiOwotY29uc3QgY2hhciBrRXJyb3JNZXNzYWdlW10gPSAiZXJyb3JNZXNzYWdlIjsKLWNvbnN0IGNoYXIga0Z1bmN0aW9uTmFtZVtdID0gImZ1bmN0aW9uTmFtZSI7Ci1jb25zdCBjaGFyIGtMaW5lTnVtYmVyW10gPSAibGluZU51bWJlciI7Ci1jb25zdCBjaGFyIGtMb2NhdGlvbkNvbHVtbk51bWJlcltdID0gImxvY2F0aW9uLmNvbHVtbk51bWJlciI7Ci1jb25zdCBjaGFyIGtMb2NhdGlvbkxpbmVOdW1iZXJbXSA9ICJsb2NhdGlvbi5saW5lTnVtYmVyIjsKLWNvbnN0IGNoYXIga0xvY2F0aW9uU2NyaXB0SWRbXSA9ICJsb2NhdGlvbi5zY3JpcHRJZCI7Ci1jb25zdCBjaGFyIGtPYmplY3RbXSA9ICJvYmplY3QiOwotY29uc3QgY2hhciBrUmVhc29uW10gPSAicmVhc29uIjsKLWNvbnN0IGNoYXIga1Njb3BlQ2hhaW5bXSA9ICJzY29wZUNoYWluIjsKLWNvbnN0IGNoYXIga1NjcmlwdElkW10gPSAic2NyaXB0SWQiOwotY29uc3QgY2hhciBrU3RhdGVbXSA9ICJzdGF0ZSI7Ci1jb25zdCBjaGFyIGtUaGlzW10gPSAidGhpcyI7Ci1jb25zdCBjaGFyIGtUeXBlW10gPSAidHlwZSI7Ci1jb25zdCBjaGFyIGtVcmxbXSA9ICJ1cmwiOwotCi0vLyBQYXJhbWV0ZXIgdmFsdWVzLgotY29uc3QgY2hhciBrRGVidWdDb21tYW5kW10gPSAiZGVidWdDb21tYW5kIjsKLQotLy8gUmVzdWx0IHBhcmFtZXRlcnMuCi1jb25zdCBjaGFyIGtCcmVha3BvaW50SWRbXSA9ICJyZXN1bHQuYnJlYWtwb2ludElkIjsKLWNvbnN0IGNoYXIga0xvY2F0aW9uc1tdID0gInJlc3VsdC5sb2NhdGlvbnMiOwotY29uc3QgY2hhciBrU2NyaXB0U291cmNlW10gPSAicmVzdWx0LnNjcmlwdFNvdXJjZSI7Ci0KLS8vIEV2ZW50cy4KLWNvbnN0IGNoYXIga1BhdXNlZFtdID0gIkRlYnVnZ2VyLnBhdXNlZCI7Ci1jb25zdCBjaGFyIGtSZXN1bWVkW10gPSAiRGVidWdnZXIucmVzdW1lZCI7Ci1jb25zdCBjaGFyIGtTY3JpcHRGYWlsZWRUb1BhcnNlW10gPSAiRGVidWdnZXIuc2NyaXB0RmFpbGVkVG9QYXJzZSI7Ci1jb25zdCBjaGFyIGtTY3JpcHRQYXJzZWRbXSA9ICJEZWJ1Z2dlci5zY3JpcHRQYXJzZWQiOwotCi0vLyBDb25zdHJ1Y3QgYSB1bmlxdWUgYnJlYWtwb2ludCBpZCBmcm9tIHVybCBhbmQgc291cmNlIGxvY2F0aW9uLgotLy8gVXNlIHRoZSBzYW1lIGZvcm1hdCBhcyBDaHJvbWUuCi1zdGQ6OnN0cmluZyBCcmVha3BvaW50SWQoY29uc3Qgc3RkOjpzdHJpbmcgdXJsLCBpbnQgbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbl9udW1iZXIpIHsKLSAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZigiJXM6JWQ6JWQiLCB1cmwuY19zdHIoKSwgbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX251bWJlcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1KYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6SmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyKQotICAgIDogZGlzcGF0Y2hlcl8oZGlzcGF0Y2hlciksCi0gICAgICBzb3VyY2VfcHJvdmlkZXJzX2RlbGV0ZXJfKCZzb3VyY2VfcHJvdmlkZXJzXyksCi0gICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoY29tbWFuZHNfKHRoaXMpKSB7Ci0gIERDSEVDSyhkaXNwYXRjaGVyXyk7Ci0KLSAgY29tbWFuZHNfWyJEZWJ1Z2dlci5kaXNhYmxlIl0gPSAmSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OkRpc2FibGU7Ci0gIGNvbW1hbmRzX1siRGVidWdnZXIuZW5hYmxlIl0gPSAmSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OkVuYWJsZTsKLSAgY29tbWFuZHNfWyJEZWJ1Z2dlci5nZXRTY3JpcHRTb3VyY2UiXSA9Ci0gICAgICAmSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OkdldFNjcmlwdFNvdXJjZTsKLSAgY29tbWFuZHNfWyJEZWJ1Z2dlci5wYXVzZSJdID0gJkphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpQYXVzZTsKLSAgY29tbWFuZHNfWyJEZWJ1Z2dlci5yZXN1bWUiXSA9ICZKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6UmVzdW1lOwotICBjb21tYW5kc19bIkRlYnVnZ2VyLnN0ZXBJbnRvIl0gPSAmSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OlN0ZXBJbnRvOwotICBjb21tYW5kc19bIkRlYnVnZ2VyLnNldEJyZWFrcG9pbnRCeVVybCJdID0KLSAgICAgICZKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6U2V0QnJlYWtwb2ludEJ5VXJsOwotICBjb21tYW5kc19bIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIl0gPQotICAgICAgJkphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpTZXRQYXVzZU9uRXhjZXB0aW9uczsKLSAgY29tbWFuZHNfWyJEZWJ1Z2dlci5zdGVwT3V0Il0gPSAmSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OlN0ZXBPdXQ7Ci0gIGNvbW1hbmRzX1siRGVidWdnZXIuc3RlcE92ZXIiXSA9ICZKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6U3RlcE92ZXI7Ci0KLSAgZGlzcGF0Y2hlcl8tPkFkZERvbWFpbigiRGVidWdnZXIiLCBjb21tYW5kc18uQmluZCgpKTsKLX0KLQotSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6On5KYXZhU2NyaXB0RGVidWdnZXJBZ2VudCgpIHt9Ci0KLXZvaWQgSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OkVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7Ci0gIERDSEVDSyhkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCkpOwotICBkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCktPkF0dGFjaCgpOwotICBjb21tYW5kLlNlbmRSZXNwb25zZSgpOwotfQotCi12b2lkIEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpEaXNhYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKLSAgRENIRUNLKGRpc3BhdGNoZXJfLT5zY3JpcHRfZGVidWdnZXIoKSk7Ci0gIGRpc3BhdGNoZXJfLT5zY3JpcHRfZGVidWdnZXIoKS0+RGV0YWNoKCk7Ci0gIGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7Ci19Ci0KLXZvaWQgSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OkdldFNjcmlwdFNvdXJjZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7Ci0gIEpTT05PYmplY3QgcGFyYW1zID0gSlNPTlBhcnNlKGNvbW1hbmQuR2V0UGFyYW1zKCkpOwotICAvLyBHZXQgdGhlIHNjcmlwdElkIGZyb20gdGhlIHBhcmFtZXRlcnMuCi0gIHN0ZDo6c3RyaW5nIHNjcmlwdF9pZDsKLSAgYm9vbCBnb3Rfc2NyaXB0X2lkID0gcGFyYW1zLT5HZXRTdHJpbmcoa1NjcmlwdElkLCAmc2NyaXB0X2lkKTsKLSAgaWYgKCFnb3Rfc2NyaXB0X2lkKSB7Ci0gICAgY29tbWFuZC5TZW5kRXJyb3JSZXNwb25zZShDb21tYW5kOjprSW52YWxpZFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBzY3JpcHRJZCBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycy4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBGaW5kIHRoZSBzb3VyY2UgcHJvdmlkZXIgd2l0aCBhIG1hdGNoaW5nIHNjcmlwdElkLgotICBTb3VyY2VQcm92aWRlck1hcDo6aXRlcmF0b3IgaXQgPSBzb3VyY2VfcHJvdmlkZXJzXy5maW5kKHNjcmlwdF9pZCk7Ci0gIGlmIChpdCA9PSBzb3VyY2VfcHJvdmlkZXJzXy5lbmQoKSkgewotICAgIGNvbW1hbmQuU2VuZEVycm9yUmVzcG9uc2UoQ29tbWFuZDo6a0ludmFsaWRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gc2NyaXB0IGZvdW5kIHdpdGggc3BlY2lmaWVkIHNjcmlwdElkLiIpOwotICAgIHJldHVybjsKLSAgfQotICBzY3JpcHQ6OlNvdXJjZVByb3ZpZGVyKiBzb3VyY2VfcHJvdmlkZXIgPSBpdC0+c2Vjb25kOwotICBEQ0hFQ0soc291cmNlX3Byb3ZpZGVyKTsKLQotICAvLyBCdWlsZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0gIEpTT05PYmplY3QgcmVzdWx0KG5ldyBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7Ci0gIHJlc3VsdC0+U2V0U3RyaW5nKGtTY3JpcHRTb3VyY2UsIHNvdXJjZV9wcm92aWRlci0+R2V0U2NyaXB0U291cmNlKCkpOwotICBjb21tYW5kLlNlbmRSZXNwb25zZShyZXN1bHQpOwotfQotCi12b2lkIEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpQYXVzZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7Ci0gIERDSEVDSyhkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCkpOwotICBkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCktPlBhdXNlKCk7Ci0gIGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7Ci19Ci0KLXZvaWQgSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OlJlc3VtZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7Ci0gIERDSEVDSyhkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCkpOwotICBkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCktPlJlc3VtZSgpOwotICBkaXNwYXRjaGVyXy0+U2V0UGF1c2VkKGZhbHNlKTsKLSAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKLX0KLQotdm9pZCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6U2V0QnJlYWtwb2ludEJ5VXJsKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKLSAgRENIRUNLKGRpc3BhdGNoZXJfLT5zY3JpcHRfZGVidWdnZXIoKSk7Ci0gIEpTT05PYmplY3QgcGFyYW1zID0gSlNPTlBhcnNlKGNvbW1hbmQuR2V0UGFyYW1zKCkpOwotCi0gIHN0ZDo6c3RyaW5nIHVybDsKLSAgYm9vbCBnb3RfdXJsID0gcGFyYW1zLT5HZXRTdHJpbmcoa1VybCwgJnVybCk7Ci0gIGlmICghZ290X3VybCkgewotICAgIGNvbW1hbmQuU2VuZEVycm9yUmVzcG9uc2UoQ29tbWFuZDo6a0ludmFsaWRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtwb2ludCBVUkwgbXVzdCBiZSBzcGVjaWZpZWQuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVE9ETzogU2hvdWxkIGFsc28gaGFuZGxlIHNldHRpbmcgb2YgYnJlYWtwb2ludCBieSB1cmxSZWdleAotCi0gIGludCBsaW5lX251bWJlcjsKLSAgYm9vbCBnb3RfbGluZV9udW1iZXIgPSBwYXJhbXMtPkdldEludGVnZXIoa0xpbmVOdW1iZXIsICZsaW5lX251bWJlcik7Ci0gIGlmICghZ290X2xpbmVfbnVtYmVyKSB7Ci0gICAgY29tbWFuZC5TZW5kRXJyb3JSZXNwb25zZShDb21tYW5kOjprSW52YWxpZFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5lIG51bWJlciBtdXN0IGJlIHNwZWNpZmllZC4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gSWYgbm8gY29sdW1uIG51bWJlciBpcyBzcGVjaWZpZWQsIGp1c3QgZGVmYXVsdCB0byAwLgotICBpbnQgY29sdW1uX251bWJlciA9IDA7Ci0gIHBhcmFtcy0+R2V0SW50ZWdlcihrQ29sdW1uTnVtYmVyLCAmY29sdW1uX251bWJlcik7Ci0KLSAgLy8gVE9ETzogU2hvdWxkIGFsc28gaGFuZGxlIGNvbmRpdGlvbiBhbmQgaXNBbnRpYnJlYWtwb2ludC4KLQotICAvLyBDcmVhdGUgYSBuZXcgbG9naWNhbCBicmVha3BvaW50IGFuZCBzdG9yZSBpdCBpbiBvdXIgbWFwLgotICBjb25zdCBzdGQ6OnN0cmluZyBicmVha3BvaW50X2lkID0KLSAgICAgIEJyZWFrcG9pbnRJZCh1cmwsIGxpbmVfbnVtYmVyLCBjb2x1bW5fbnVtYmVyKTsKLSAgQnJlYWtwb2ludCBicmVha3BvaW50KHVybCwgbGluZV9udW1iZXIsIGNvbHVtbl9udW1iZXIpOwotICBicmVha3BvaW50c19bYnJlYWtwb2ludF9pZF0gPSBicmVha3BvaW50OwotCi0gIC8vIENoZWNrIHRoZSBsb2dpY2FsIGJyZWFrcG9pbnQgYWdhaW5zdCBhbGwgY3VycmVudGx5IGxvYWRlZCBzb3VyY2UgcHJvdmlkZXJzCi0gIC8vIGFuZCBnZXQgYW4gYXJyYXkgb2YgbWF0Y2hpbmcgYnJlYWtwb2ludCBsb2NhdGlvbnMuCi0gIHN0ZDo6dmVjdG9yPFNjcmlwdExvY2F0aW9uPiBsb2NhdGlvbnM7Ci0gIFJlc29sdmVCcmVha3BvaW50KGJyZWFrcG9pbnQsICZsb2NhdGlvbnMpOwotCi0gIC8vIENvbnN0cnVjdCBhIHJlc3VsdCBvYmplY3QgZnJvbSB0aGUgbG9naWNhbCBicmVha3BvaW50IGlkIGFuZCByZXNvbHZlZAotICAvLyBzb3VyY2UgbG9jYXRpb25zLgotICBKU09OT2JqZWN0IHJlc3VsdChuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOwotICByZXN1bHQtPlNldFN0cmluZyhrQnJlYWtwb2ludElkLCBicmVha3BvaW50X2lkKTsKLSAgSlNPTkxpc3QgbG9jYXRpb25fb2JqZWN0cyhuZXcgYmFzZTo6TGlzdFZhbHVlKCkpOwotICBmb3IgKHN0ZDo6dmVjdG9yPFNjcmlwdExvY2F0aW9uPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsb2NhdGlvbnMuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBsb2NhdGlvbnMuZW5kKCk7ICsraXQpIHsKLSAgICBKU09OT2JqZWN0IGxvY2F0aW9uKG5ldyBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7Ci0gICAgbG9jYXRpb24tPlNldFN0cmluZyhrU2NyaXB0SWQsIGl0LT5zY3JpcHRfaWQpOwotICAgIGxvY2F0aW9uLT5TZXRJbnRlZ2VyKGtMaW5lTnVtYmVyLCBpdC0+bGluZV9udW1iZXIpOwotICAgIGxvY2F0aW9uLT5TZXRJbnRlZ2VyKGtDb2x1bW5OdW1iZXIsIGl0LT5jb2x1bW5fbnVtYmVyKTsKLSAgICBsb2NhdGlvbl9vYmplY3RzLT5BcHBlbmQobG9jYXRpb24ucmVsZWFzZSgpKTsKLSAgfQotICByZXN1bHQtPlNldChrTG9jYXRpb25zLCBsb2NhdGlvbl9vYmplY3RzLnJlbGVhc2UoKSk7Ci0gIGNvbW1hbmQuU2VuZFJlc3BvbnNlKHJlc3VsdCk7Ci19Ci0KLXZvaWQgSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OlNldFBhdXNlT25FeGNlcHRpb25zKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKLSAgRENIRUNLKGRpc3BhdGNoZXJfLT5zY3JpcHRfZGVidWdnZXIoKSk7Ci0gIEpTT05PYmplY3QgcGFyYW1zID0gSlNPTlBhcnNlKGNvbW1hbmQuR2V0UGFyYW1zKCkpOwotCi0gIHN0ZDo6c3RyaW5nIHN0YXRlOwotICBEQ0hFQ0socGFyYW1zLT5HZXRTdHJpbmcoa1N0YXRlLCAmc3RhdGUpKTsKLSAgaWYgKHN0YXRlID09ICJhbGwiKSB7Ci0gICAgZGlzcGF0Y2hlcl8tPnNjcmlwdF9kZWJ1Z2dlcigpLT5TZXRQYXVzZU9uRXhjZXB0aW9ucygKLSAgICAgICAgc2NyaXB0OjpTY3JpcHREZWJ1Z2dlcjo6a0FsbCk7Ci0gIH0gZWxzZSBpZiAoc3RhdGUgPT0gIm5vbmUiKSB7Ci0gICAgZGlzcGF0Y2hlcl8tPnNjcmlwdF9kZWJ1Z2dlcigpLT5TZXRQYXVzZU9uRXhjZXB0aW9ucygKLSAgICAgICAgc2NyaXB0OjpTY3JpcHREZWJ1Z2dlcjo6a05vbmUpOwotICB9IGVsc2UgaWYgKHN0YXRlID09ICJ1bmNhdWdodCIpIHsKLSAgICBkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCktPlNldFBhdXNlT25FeGNlcHRpb25zKAotICAgICAgICBzY3JpcHQ6OlNjcmlwdERlYnVnZ2VyOjprVW5jYXVnaHQpOwotICB9IGVsc2UgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotICBjb21tYW5kLlNlbmRSZXNwb25zZSgpOwotfQotCi12b2lkIEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpTdGVwSW50byhjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7Ci0gIERDSEVDSyhkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCkpOwotICBkaXNwYXRjaGVyXy0+c2NyaXB0X2RlYnVnZ2VyKCktPlN0ZXBJbnRvKCk7Ci0gIGRpc3BhdGNoZXJfLT5TZXRQYXVzZWQoZmFsc2UpOwotICBjb21tYW5kLlNlbmRSZXNwb25zZSgpOwotfQotCi12b2lkIEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpTdGVwT3V0KGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKLSAgRENIRUNLKGRpc3BhdGNoZXJfLT5zY3JpcHRfZGVidWdnZXIoKSk7Ci0gIGRpc3BhdGNoZXJfLT5zY3JpcHRfZGVidWdnZXIoKS0+U3RlcE91dCgpOwotICBkaXNwYXRjaGVyXy0+U2V0UGF1c2VkKGZhbHNlKTsKLSAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKLX0KLQotdm9pZCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6U3RlcE92ZXIoY29uc3QgQ29tbWFuZCYgY29tbWFuZCkgewotICBEQ0hFQ0soZGlzcGF0Y2hlcl8tPnNjcmlwdF9kZWJ1Z2dlcigpKTsKLSAgZGlzcGF0Y2hlcl8tPnNjcmlwdF9kZWJ1Z2dlcigpLT5TdGVwT3ZlcigpOwotICBkaXNwYXRjaGVyXy0+U2V0UGF1c2VkKGZhbHNlKTsKLSAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKLX0KLQotdm9pZCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6T25TY3JpcHREZWJ1Z2dlckRldGFjaCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKSB7Ci0gIERMT0coSU5GTykgPDwgIkphdmFTY3JpcHQgZGVidWdnZXIgZGV0YWNoZWQ6ICIgPDwgcmVhc29uOwotfQotCi12b2lkIEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpPblNjcmlwdERlYnVnZ2VyUGF1c2UoCi0gICAgc2NvcGVkX3B0cjxzY3JpcHQ6OkNhbGxGcmFtZT4gY2FsbF9mcmFtZSkgewotICAvLyBOb3RpZnkgdGhlIGNsaWVudHMgd2UncmUgYWJvdXQgdG8gcGF1c2UuCi0gIFNlbmRQYXVzZWRFdmVudChjYWxsX2ZyYW1lLlBhc3MoKSk7Ci0KLSAgLy8gVGVsbCB0aGUgZGVidWcgZGlzcGF0Y2hlciB0byBlbnRlciBwYXVzZWQgc3RhdGUgLSBibG9jayB0aGlzIHRocmVhZC4KLSAgZGlzcGF0Y2hlcl8tPlNldFBhdXNlZCh0cnVlKTsKLQotICAvLyBOb3RpZnkgdGhlIGNsaWVudHMgd2UndmUgcmVzdW1lZC4KLSAgU2VuZFJlc3VtZWRFdmVudCgpOwotfQotCi12b2lkIEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpPblNjcmlwdEZhaWxlZFRvUGFyc2UoCi0gICAgc2NvcGVkX3B0cjxzY3JpcHQ6OlNvdXJjZVByb3ZpZGVyPiBzb3VyY2VfcHJvdmlkZXIpIHsKLSAgRENIRUNLKHNvdXJjZV9wcm92aWRlcik7Ci0gIEhhbmRsZVNjcmlwdEV2ZW50KGtTY3JpcHRGYWlsZWRUb1BhcnNlLCBzb3VyY2VfcHJvdmlkZXIuUGFzcygpKTsKLX0KLQotdm9pZCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6T25TY3JpcHRQYXJzZWQoCi0gICAgc2NvcGVkX3B0cjxzY3JpcHQ6OlNvdXJjZVByb3ZpZGVyPiBzb3VyY2VfcHJvdmlkZXIpIHsKLSAgRENIRUNLKHNvdXJjZV9wcm92aWRlcik7Ci0gIEhhbmRsZVNjcmlwdEV2ZW50KGtTY3JpcHRQYXJzZWQsIHNvdXJjZV9wcm92aWRlci5QYXNzKCkpOwotfQotCi1KU09OT2JqZWN0IEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpDcmVhdGVDYWxsRnJhbWVEYXRhKAotICAgIGNvbnN0IHNjb3BlZF9wdHI8c2NyaXB0OjpDYWxsRnJhbWU+JiBjYWxsX2ZyYW1lKSB7Ci0gIERDSEVDSyhjYWxsX2ZyYW1lKTsKLQotICAvLyBDcmVhdGUgdGhlIEpTT04gb2JqZWN0IGFuZCBhZGQgdGhlIGRhdGEgZm9yIHRoaXMgY2FsbCBmcmFtZS4KLSAgSlNPTk9iamVjdCBjYWxsX2ZyYW1lX2RhdGEobmV3IGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSgpKTsKLSAgY2FsbF9mcmFtZV9kYXRhLT5TZXRTdHJpbmcoa0NhbGxGcmFtZUlkLCBjYWxsX2ZyYW1lLT5HZXRDYWxsRnJhbWVJZCgpKTsKLSAgY2FsbF9mcmFtZV9kYXRhLT5TZXRTdHJpbmcoa0Z1bmN0aW9uTmFtZSwgY2FsbF9mcmFtZS0+R2V0RnVuY3Rpb25OYW1lKCkpOwotCi0gIC8vIE9mZnNldCB0aGUgbGluZSBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBzdGFydCBsaW5lIG9mIHRoZSBzb3VyY2UuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIHNjcmlwdF9pZCA9IGNhbGxfZnJhbWUtPkdldFNjcmlwdElkKCk7Ci0gIGludCBsaW5lX251bWJlciA9IGNhbGxfZnJhbWUtPkdldExpbmVOdW1iZXIoKTsKLSAgRENIRUNLKHNvdXJjZV9wcm92aWRlcnNfW3NjcmlwdF9pZF0pOwotICBiYXNlOjpvcHRpb25hbDxpbnQ+IHN0YXJ0X2xpbmUgPSBzb3VyY2VfcHJvdmlkZXJzX1tzY3JpcHRfaWRdLT5HZXRTdGFydExpbmUoKTsKLSAgbGluZV9udW1iZXIgLT0gc3RhcnRfbGluZS52YWx1ZV9vcigxKTsKLQotICAvLyBBZGQgdGhlIGxvY2F0aW9uIGRhdGEuCi0gIGNhbGxfZnJhbWVfZGF0YS0+U2V0U3RyaW5nKGtMb2NhdGlvblNjcmlwdElkLCBzY3JpcHRfaWQpOwotICBjYWxsX2ZyYW1lX2RhdGEtPlNldEludGVnZXIoa0xvY2F0aW9uTGluZU51bWJlciwgbGluZV9udW1iZXIpOwotICBiYXNlOjpvcHRpb25hbDxpbnQ+IGNvbHVtbl9udW1iZXIgPSBjYWxsX2ZyYW1lLT5HZXRDb2x1bW5OdW1iZXIoKTsKLSAgaWYgKGNvbHVtbl9udW1iZXIpIHsKLSAgICBjYWxsX2ZyYW1lX2RhdGEtPlNldEludGVnZXIoa0xvY2F0aW9uQ29sdW1uTnVtYmVyLCBjb2x1bW5fbnVtYmVyLnZhbHVlKCkpOwotICB9Ci0KLSAgLy8gQWRkIHRoZSBzY29wZSBjaGFpbiBkYXRhLgotICBKU09OTGlzdCBzY29wZV9jaGFpbl9kYXRhKENyZWF0ZVNjb3BlQ2hhaW5EYXRhKGNhbGxfZnJhbWUtPkdldFNjb3BlQ2hhaW4oKSkpOwotICBjYWxsX2ZyYW1lX2RhdGEtPlNldChrU2NvcGVDaGFpbiwgc2NvcGVfY2hhaW5fZGF0YS5yZWxlYXNlKCkpOwotCi0gIC8vIEFkZCB0aGUgInRoaXMiIG9iamVjdCBkYXRhLgotICBjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyKiB0aGlzX29iamVjdCA9IGNhbGxfZnJhbWUtPkdldFRoaXMoKTsKLSAgaWYgKHRoaXNfb2JqZWN0KSB7Ci0gICAgSlNPTk9iamVjdCB0aGlzX29iamVjdF9kYXRhKGRpc3BhdGNoZXJfLT5DcmVhdGVSZW1vdGVPYmplY3QodGhpc19vYmplY3QpKTsKLSAgICBjYWxsX2ZyYW1lX2RhdGEtPlNldChrVGhpcywgdGhpc19vYmplY3RfZGF0YS5yZWxlYXNlKCkpOwotICB9Ci0KLSAgcmV0dXJuIGNhbGxfZnJhbWVfZGF0YS5QYXNzKCk7Ci19Ci0KLUpTT05MaXN0IEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpDcmVhdGVDYWxsU3RhY2tEYXRhKAotICAgIHNjb3BlZF9wdHI8c2NyaXB0OjpDYWxsRnJhbWU+IGNhbGxfZnJhbWUpIHsKLSAgSlNPTkxpc3QgY2FsbF9mcmFtZV9saXN0KG5ldyBiYXNlOjpMaXN0VmFsdWUoKSk7Ci0KLSAgLy8gQ29uc3VtZSB0aGUgc2NvcGVkIENhbGxGcmFtZSBvYmplY3RzIGFzIHdlIGl0ZXJhdGUgb3ZlciB0aGVtLgotICB3aGlsZSAoY2FsbF9mcmFtZSkgewotICAgIEpTT05PYmplY3QgY2FsbF9mcmFtZV9kYXRhKENyZWF0ZUNhbGxGcmFtZURhdGEoY2FsbF9mcmFtZSkpOwotICAgIERDSEVDSyhjYWxsX2ZyYW1lX2RhdGEpOwotICAgIGNhbGxfZnJhbWVfbGlzdC0+QXBwZW5kKGNhbGxfZnJhbWVfZGF0YS5yZWxlYXNlKCkpOwotICAgIHNjb3BlZF9wdHI8c2NyaXB0OjpDYWxsRnJhbWU+IG5leHRfY2FsbF9mcmFtZShjYWxsX2ZyYW1lLT5HZXRDYWxsZXIoKSk7Ci0gICAgY2FsbF9mcmFtZSA9IG5leHRfY2FsbF9mcmFtZS5QYXNzKCk7Ci0gIH0KLQotICByZXR1cm4gY2FsbF9mcmFtZV9saXN0LlBhc3MoKTsKLX0KLQotSlNPTk9iamVjdCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6Q3JlYXRlU2NvcGVEYXRhKAotICAgIGNvbnN0IHNjb3BlZF9wdHI8c2NyaXB0OjpTY29wZT4mIHNjb3BlKSB7Ci0gIERDSEVDSyhzY29wZSk7Ci0gIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIHNjb3BlX29iamVjdCA9IHNjb3BlLT5HZXRPYmplY3QoKTsKLSAgSlNPTk9iamVjdCBzY29wZV9kYXRhKG5ldyBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7Ci0gIHNjb3BlX2RhdGEtPlNldChrT2JqZWN0LAotICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcl8tPkNyZWF0ZVJlbW90ZU9iamVjdChzY29wZV9vYmplY3QpLnJlbGVhc2UoKSk7Ci0gIHNjb3BlX2RhdGEtPlNldFN0cmluZyhrVHlwZSwgc2NyaXB0OjpTY29wZTo6VHlwZVRvU3RyaW5nKHNjb3BlLT5HZXRUeXBlKCkpKTsKLSAgcmV0dXJuIHNjb3BlX2RhdGEuUGFzcygpOwotfQotCi1KU09OTGlzdCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6Q3JlYXRlU2NvcGVDaGFpbkRhdGEoCi0gICAgc2NvcGVkX3B0cjxzY3JpcHQ6OlNjb3BlPiBzY29wZSkgewotICBKU09OTGlzdCBzY29wZV9jaGFpbl9saXN0KG5ldyBiYXNlOjpMaXN0VmFsdWUoKSk7Ci0KLSAgLy8gQ29uc3VtZSB0aGUgc2NvcGVkIFNjb3BlIG9iamVjdHMgYXMgd2UgaXRlcmF0ZSBvdmVyIHRoZW0uCi0gIHdoaWxlIChzY29wZSkgewotICAgIEpTT05PYmplY3Qgc2NvcGVfZGF0YShDcmVhdGVTY29wZURhdGEoc2NvcGUpKTsKLSAgICBEQ0hFQ0soc2NvcGVfZGF0YSk7Ci0gICAgc2NvcGVfY2hhaW5fbGlzdC0+QXBwZW5kKHNjb3BlX2RhdGEucmVsZWFzZSgpKTsKLSAgICBzY29wZWRfcHRyPHNjcmlwdDo6U2NvcGU+IG5leHRfc2NvcGUoc2NvcGUtPkdldE5leHQoKSk7Ci0gICAgc2NvcGUgPSBuZXh0X3Njb3BlLlBhc3MoKTsKLSAgfQotCi0gIHJldHVybiBzY29wZV9jaGFpbl9saXN0LlBhc3MoKTsKLX0KLQotdm9pZCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6SGFuZGxlU2NyaXB0RXZlbnQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwKLSAgICBzY29wZWRfcHRyPHNjcmlwdDo6U291cmNlUHJvdmlkZXI+IHNvdXJjZV9wcm92aWRlcikgewotICBEQ0hFQ0soc291cmNlX3Byb3ZpZGVyKTsKLQotICAvLyBTZW5kIHRoZSBldmVudCBub3RpZmljYXRpb24gdG8gdGhlIGRlYnVnZ2VyIGNsaWVudHMuCi0gIEpTT05PYmplY3QgcGFyYW1zKG5ldyBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7Ci0gIHBhcmFtcy0+U2V0U3RyaW5nKGtTY3JpcHRJZCwgc291cmNlX3Byb3ZpZGVyLT5HZXRTY3JpcHRJZCgpKTsKLSAgcGFyYW1zLT5TZXRTdHJpbmcoa1VybCwgc291cmNlX3Byb3ZpZGVyLT5HZXRVcmwoKSk7Ci0gIGJhc2U6Om9wdGlvbmFsPGludD4gZXJyb3JfbGluZSA9IHNvdXJjZV9wcm92aWRlci0+R2V0RXJyb3JMaW5lKCk7Ci0gIGlmIChlcnJvcl9saW5lKSB7Ci0gICAgRENIRUNLX0VRKG1ldGhvZCwga1NjcmlwdEZhaWxlZFRvUGFyc2UpOwotICAgIHBhcmFtcy0+U2V0SW50ZWdlcihrRXJyb3JMaW5lLCBlcnJvcl9saW5lLnZhbHVlKCkpOwotICB9Ci0gIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBlcnJvcl9tZXNzYWdlID0KLSAgICAgIHNvdXJjZV9wcm92aWRlci0+R2V0RXJyb3JNZXNzYWdlKCk7Ci0gIGlmIChlcnJvcl9tZXNzYWdlKSB7Ci0gICAgRENIRUNLX0VRKG1ldGhvZCwga1NjcmlwdEZhaWxlZFRvUGFyc2UpOwotICAgIHBhcmFtcy0+U2V0U3RyaW5nKGtFcnJvck1lc3NhZ2UsIGVycm9yX21lc3NhZ2UudmFsdWUoKSk7Ci0gIH0KLSAgZGlzcGF0Y2hlcl8tPlNlbmRFdmVudChtZXRob2QsIHBhcmFtcyk7Ci0KLSAgLy8gU3RvcmUgdGhlIHJhdyBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcHJvdmlkZXIgaW4gdGhlIG1hcC4KLSAgLy8gVGhlIHZhbHVlcyBpbiB0aGUgbWFwIHdpbGwgYmUgZGVsZXRlZCBvbiBkZXN0cnVjdGlvbiBieQotICAvLyB8c291cmNlX3Byb3ZpZGVyc19kZWxldGVyX3wuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIHNjcmlwdF9pZCA9IHNvdXJjZV9wcm92aWRlci0+R2V0U2NyaXB0SWQoKTsKLSAgU291cmNlUHJvdmlkZXJNYXA6Oml0ZXJhdG9yIGl0ID0gc291cmNlX3Byb3ZpZGVyc18uZmluZChzY3JpcHRfaWQpOwotICBpZiAoaXQgIT0gc291cmNlX3Byb3ZpZGVyc18uZW5kKCkpIHsKLSAgICBkZWxldGUgaXQtPnNlY29uZDsKLSAgfQotICBzb3VyY2VfcHJvdmlkZXJzX1tzY3JpcHRfaWRdID0gc291cmNlX3Byb3ZpZGVyLnJlbGVhc2UoKTsKLX0KLQotdm9pZCBKYXZhU2NyaXB0RGVidWdnZXJBZ2VudDo6UmVzb2x2ZUJyZWFrcG9pbnQoCi0gICAgY29uc3QgQnJlYWtwb2ludCYgYnJlYWtwb2ludCwgc3RkOjp2ZWN0b3I8U2NyaXB0TG9jYXRpb24+KiBsb2NhdGlvbnMpIHsKLSAgZm9yIChTb3VyY2VQcm92aWRlck1hcDo6aXRlcmF0b3IgaXQgPSBzb3VyY2VfcHJvdmlkZXJzXy5iZWdpbigpOwotICAgICAgIGl0ICE9IHNvdXJjZV9wcm92aWRlcnNfLmVuZCgpOyArK2l0KSB7Ci0gICAgc2NyaXB0OjpTb3VyY2VQcm92aWRlciogc2NyaXB0ID0gaXQtPnNlY29uZDsKLSAgICBpZiAoc2NyaXB0LT5HZXRVcmwoKSA9PSBicmVha3BvaW50LnVybCkgewotICAgICAgZGlzcGF0Y2hlcl8tPnNjcmlwdF9kZWJ1Z2dlcigpLT5TZXRCcmVha3BvaW50KAotICAgICAgICAgIHNjcmlwdC0+R2V0U2NyaXB0SWQoKSwKLSAgICAgICAgICBicmVha3BvaW50LmxpbmVfbnVtYmVyICsgc2NyaXB0LT5HZXRTdGFydExpbmUoKS52YWx1ZV9vcigxKSwKLSAgICAgICAgICBicmVha3BvaW50LmNvbHVtbl9udW1iZXIpOwotICAgICAgbG9jYXRpb25zLT5wdXNoX2JhY2soU2NyaXB0TG9jYXRpb24oc2NyaXB0LT5HZXRTY3JpcHRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludC5saW5lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQuY29sdW1uX251bWJlcikpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEphdmFTY3JpcHREZWJ1Z2dlckFnZW50OjpTZW5kUGF1c2VkRXZlbnQoCi0gICAgc2NvcGVkX3B0cjxzY3JpcHQ6OkNhbGxGcmFtZT4gY2FsbF9mcmFtZSkgewotICBzdGQ6OnN0cmluZyBldmVudF9tZXRob2QgPSBrUGF1c2VkOwotICBKU09OT2JqZWN0IGV2ZW50X3BhcmFtcyhuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOwotICBKU09OTGlzdCBjYWxsX3N0YWNrX2RhdGEoQ3JlYXRlQ2FsbFN0YWNrRGF0YShjYWxsX2ZyYW1lLlBhc3MoKSkpOwotICBEQ0hFQ0soY2FsbF9zdGFja19kYXRhKTsKLSAgZXZlbnRfcGFyYW1zLT5TZXQoa0NhbGxGcmFtZXMsIGNhbGxfc3RhY2tfZGF0YS5yZWxlYXNlKCkpOwotICBldmVudF9wYXJhbXMtPlNldFN0cmluZyhrUmVhc29uLCBrRGVidWdDb21tYW5kKTsKLSAgZGlzcGF0Y2hlcl8tPlNlbmRFdmVudChldmVudF9tZXRob2QsIGV2ZW50X3BhcmFtcyk7Ci19Ci0KLXZvaWQgSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ6OlNlbmRSZXN1bWVkRXZlbnQoKSB7Ci0gIC8vIFNlbmQgdGhlIGV2ZW50IHRvIHRoZSBjbGllbnRzLiBObyBwYXJhbWV0ZXJzLgotICBzdGQ6OnN0cmluZyBldmVudF9tZXRob2QgPSBrUmVzdW1lZDsKLSAgc2NvcGVkX3B0cjxiYXNlOjpEaWN0aW9uYXJ5VmFsdWU+IGV2ZW50X3BhcmFtcyhuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOwotICBkaXNwYXRjaGVyXy0+U2VuZEV2ZW50KGV2ZW50X21ldGhvZCwgZXZlbnRfcGFyYW1zKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKLX0gIC8vIG5hbWVzcGFjZSBkZWJ1ZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2phdmFzY3JpcHRfZGVidWdnZXJfYWdlbnQuaCBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9qYXZhc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTlmZTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2phdmFzY3JpcHRfZGVidWdnZXJfYWdlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jaWZuZGVmIENPQkFMVF9ERUJVR19CQUNLRU5EX0pBVkFTQ1JJUFRfREVCVUdHRVJfQUdFTlRfSF8KLSNkZWZpbmUgQ09CQUxUX0RFQlVHX0JBQ0tFTkRfSkFWQVNDUklQVF9ERUJVR0dFUl9BR0VOVF9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImJhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9jb21tYW5kX21hcC5oIgotI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29tbWFuZC5oIgotI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9qc29uX29iamVjdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbF9mcmFtZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NvcGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9kZWJ1Z2dlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc291cmNlX3Byb3ZpZGVyLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGRlYnVnIHsKLW5hbWVzcGFjZSBiYWNrZW5kIHsKLQotY2xhc3MgSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyKTsKLQotICB2aXJ0dWFsIH5KYXZhU2NyaXB0RGVidWdnZXJBZ2VudCgpOwotCi0gIC8vIEZvcm1lcmx5IFNjcmlwdERlYnVnZ2VyOjpEZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBPblNjcmlwdERlYnVnZ2VyRGV0YWNoKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pOwotICB2b2lkIE9uU2NyaXB0RGVidWdnZXJQYXVzZShzY29wZWRfcHRyPHNjcmlwdDo6Q2FsbEZyYW1lPiBjYWxsX2ZyYW1lKTsKLSAgdm9pZCBPblNjcmlwdEZhaWxlZFRvUGFyc2UoCi0gICAgICBzY29wZWRfcHRyPHNjcmlwdDo6U291cmNlUHJvdmlkZXI+IHNvdXJjZV9wcm92aWRlcik7Ci0gIHZvaWQgT25TY3JpcHRQYXJzZWQoCi0gICAgICBzY29wZWRfcHRyPHNjcmlwdDo6U291cmNlUHJvdmlkZXI+IHNvdXJjZV9wcm92aWRlcik7Ci0KLSBwcml2YXRlOgotICAvLyBNYXAgb2YgU291cmNlUHJvdmlkZXIgcG9pbnRlcnMsIGtleWVkIGJ5IHN0cmluZyBJRC4KLSAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc2NyaXB0OjpTb3VyY2VQcm92aWRlcio+IFNvdXJjZVByb3ZpZGVyTWFwOwotCi0gIC8vIExvZ2ljYWwgYnJlYWtwb2ludC4gQSBsb2dpY2FsIGJyZWFrcG9pbnQgZXhpc3RzIGluZGVwZW5kZW50bHkgb2YgYW55Ci0gIC8vIHBhcnRpY3VsYXIgc2NyaXB0LCBhbmQgd2lsbCBiZSBjaGVja2VkIGVhY2ggdGltZSBhIG5ldyBzY3JpcHQgaXMgcGFyc2VkLgotICAvLyBJdCBjYW4gZXZlbiBjb3JyZXNwb25kIHRvIG11bHRpcGxlIHBoeXNpY2FsIGJyZWFrcG9pbnRzLCBhdCBsZWFzdCBvbmNlIHdlCi0gIC8vIHN1cHBvcnQgdXJsIHJlZ2V4ZXMuCi0gIHN0cnVjdCBCcmVha3BvaW50IHsKLSAgICBCcmVha3BvaW50KCkgOiBsaW5lX251bWJlcigwKSwgY29sdW1uX251bWJlcigwKSB7fQotICAgIEJyZWFrcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwgaW50IGxpbmVfbnVtYmVyLCBpbnQgY29sdW1uX251bWJlcikKLSAgICAgICAgOiB1cmwodXJsKSwgbGluZV9udW1iZXIobGluZV9udW1iZXIpLCBjb2x1bW5fbnVtYmVyKGNvbHVtbl9udW1iZXIpIHt9Ci0gICAgc3RkOjpzdHJpbmcgdXJsOwotICAgIGludCBsaW5lX251bWJlcjsKLSAgICBpbnQgY29sdW1uX251bWJlcjsKLSAgICBzdGQ6OnN0cmluZyBjb25kaXRpb247Ci0gIH07Ci0KLSAgLy8gU2NyaXB0IGxvY2F0aW9uLCBjb3JyZXNwb25kaW5nIHRvIHBoeXNpY2FsIGJyZWFrcG9pbnQsIGV0Yy4KLSAgc3RydWN0IFNjcmlwdExvY2F0aW9uIHsKLSAgICBTY3JpcHRMb2NhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgc2NyaXB0X2lkLCBpbnQgbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbl9udW1iZXIpCi0gICAgICAgIDogc2NyaXB0X2lkKHNjcmlwdF9pZCksCi0gICAgICAgICAgbGluZV9udW1iZXIobGluZV9udW1iZXIpLAotICAgICAgICAgIGNvbHVtbl9udW1iZXIoY29sdW1uX251bWJlcikge30KLSAgICBzdGQ6OnN0cmluZyBzY3JpcHRfaWQ7Ci0gICAgaW50IGxpbmVfbnVtYmVyOwotICAgIGludCBjb2x1bW5fbnVtYmVyOwotICB9OwotCi0gIC8vIE1hcCBvZiBsb2dpY2FsIGJyZWFrcG9pbnRzLCBrZXllZCBieSBhIHN0cmluZyBJRC4KLSAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQnJlYWtwb2ludD4gQnJlYWtwb2ludE1hcDsKLQotICB2b2lkIEVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLSAgdm9pZCBEaXNhYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOwotCi0gIC8vIEdldHMgdGhlIHNvdXJjZSBvZiBhIHNwZWNpZmllZCBzY3JpcHQuCi0gIHZvaWQgR2V0U2NyaXB0U291cmNlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOwotCi0gIC8vIENvZGUgZXhlY3V0aW9uIGNvbnRyb2wgY29tbWFuZHMuCi0gIHZvaWQgUGF1c2UoY29uc3QgQ29tbWFuZCYgY29tbWFuZCk7Ci0gIHZvaWQgUmVzdW1lKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOwotICB2b2lkIFNldEJyZWFrcG9pbnRCeVVybChjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLSAgdm9pZCBTZXRQYXVzZU9uRXhjZXB0aW9ucyhjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLSAgdm9pZCBTdGVwSW50byhjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLSAgdm9pZCBTdGVwT3V0KGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOwotICB2b2lkIFN0ZXBPdmVyKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOwotCi0gIC8vIENyZWF0ZXMgYSBKU09OIG9iamVjdCBkZXNjcmliaW5nIGEgc2luZ2xlIGNhbGwgZnJhbWUuCi0gIEpTT05PYmplY3QgQ3JlYXRlQ2FsbEZyYW1lRGF0YSgKLSAgICAgIGNvbnN0IHNjb3BlZF9wdHI8c2NyaXB0OjpDYWxsRnJhbWU+JiBjYWxsX2ZyYW1lKTsKLQotICAvLyBDcmVhdGVzIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0cyBkZXNjcmliaW5nIHRoZSBjYWxsIHN0YWNrIHN0YXJ0aW5nIGZyb20KLSAgLy8gdGhlIHNwZWNpZmllZCBjYWxsIGZyYW1lLiBUYWtlcyBvd25lcnNoaXAgb2YgfGNhbGxfZnJhbWV8LgotICBKU09OTGlzdCBDcmVhdGVDYWxsU3RhY2tEYXRhKHNjb3BlZF9wdHI8c2NyaXB0OjpDYWxsRnJhbWU+IGNhbGxfZnJhbWUpOwotCi0gIC8vIENyZWF0ZXMgYSBKU09OIG9iamVjdCBkZXNjcmliaW5nIGEgc2luZ2xlIHNjb3BlIG9iamVjdC4KLSAgSlNPTk9iamVjdCBDcmVhdGVTY29wZURhdGEoY29uc3Qgc2NvcGVkX3B0cjxzY3JpcHQ6OlNjb3BlPiYgc2NvcGUpOwotCi0gIC8vIENyZWF0ZXMgYW4gYXJyYXkgb2YgSlNPTiBvYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNjb3BlIGNoYWluIHN0YXJ0aW5nIGZyb20KLSAgLy8gdGhlIHNwZWNpZmllZCBzY29wZSBvYmplY3QuIFRha2VzIG93bmVyc2hpcCBvZiB8c2NvcGV8LgotICBKU09OTGlzdCBDcmVhdGVTY29wZUNoYWluRGF0YShzY29wZWRfcHRyPHNjcmlwdDo6U2NvcGU+IHNjb3BlKTsKLQotICAvLyBDYWxsZWQgYnkgfE9uU2NyaXB0RmFpbGVkVG9QYXJzZXwgYW5kIHxPblNjcmlwdFBhcnNlZHwuCi0gIC8vIFN0b3JlcyB0aGUgc291cmNlIHByb3ZpZGVyIGluIHxzb3VyY2VfcHJvdmlkZXJzX3wgYW5kIGRpc3BhdGNoZXMgdGhlCi0gIC8vIHNwZWNpZmllZCBldmVudCBub3RpZmljYXRpb24gdG8gdGhlIGNsaWVudHMuCi0gIHZvaWQgSGFuZGxlU2NyaXB0RXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPHNjcmlwdDo6U291cmNlUHJvdmlkZXI+IHNvdXJjZV9wcm92aWRlcik7Ci0KLSAgLy8gUmVzb2x2ZXMgYSBsb2dpY2FsIGJyZWFrcG9pbnQgaW50byBhbiBhcnJheSBvZiBzb3VyY2UgbG9jYXRpb25zLCBvbmUgZm9yCi0gIC8vIGVhY2ggbWF0Y2hpbmcgc2NyaXB0LgotICB2b2lkIFJlc29sdmVCcmVha3BvaW50KGNvbnN0IEJyZWFrcG9pbnQmIGJyZWFrcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2NyaXB0TG9jYXRpb24+KiBsb2NhdGlvbnMpOwotCi0gIC8vIFNlbmRzIGEgRGVidWdnZXIucGF1c2VkIGV2ZW50IHRvIHRoZSBjbGllbnRzIHdpdGggY2FsbCBzdGFjayBkYXRhLgotICB2b2lkIFNlbmRQYXVzZWRFdmVudChzY29wZWRfcHRyPHNjcmlwdDo6Q2FsbEZyYW1lPiBjYWxsX2ZyYW1lKTsKLQotICAvLyBTZW5kcyBhIERlYnVnZ2VyLnJlc3VtZWQgZXZlbnQgdG8gdGhlIGNsaWVudHMgd2l0aCBubyBwYXJhbWV0ZXJzLgotICB2b2lkIFNlbmRSZXN1bWVkRXZlbnQoKTsKLQotICAvLyBIZWxwZXIgb2JqZWN0IHRvIGNvbm5lY3QgdG8gdGhlIGRlYnVnIGRpc3BhdGNoZXIsIGV0Yy4KLSAgRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyXzsKLQotICAvLyBNYXAgb2Ygc291cmNlIHByb3ZpZGVycyB3aXRoIHNjb3BlZCBkZWxldGVyIHRvIGNsZWFuIHVwIG9uIGRlc3RydWN0aW9uLgotICBTb3VyY2VQcm92aWRlck1hcCBzb3VyY2VfcHJvdmlkZXJzXzsKLSAgU1RMVmFsdWVEZWxldGVyPFNvdXJjZVByb3ZpZGVyTWFwPiBzb3VyY2VfcHJvdmlkZXJzX2RlbGV0ZXJfOwotCi0gIC8vIE1hcCBvZiBsb2dpY2FsIGJyZWFrcG9pbnRzLgotICBCcmVha3BvaW50TWFwIGJyZWFrcG9pbnRzXzsKLQotICAvLyBNYXAgb2YgbWVtYmVyIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgY29tbWFuZHMuCi0gIENvbW1hbmRNYXA8SmF2YVNjcmlwdERlYnVnZ2VyQWdlbnQ+IGNvbW1hbmRzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCi19ICAvLyBuYW1lc3BhY2UgZGVidWcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBDT0JBTFRfREVCVUdfQkFDS0VORF9KQVZBU0NSSVBUX0RFQlVHR0VSX0FHRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvbG9nX2FnZW50LmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2xvZ19hZ2VudC5jYwppbmRleCA4OGM3YmE1Li5mZjM2OTEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvbG9nX2FnZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9sb2dfYWdlbnQuY2MKQEAgLTIzLDE1ICsyMyw3IEBACiBuYW1lc3BhY2UgewogLy8gRGVmaW5pdGlvbnMgZnJvbSB0aGUgc2V0IHNwZWNpZmllZCBoZXJlOgogLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL0xvZwotCi0vLyBQYXJhbWV0ZXIgZmllbGRzOgotY29uc3RleHByIGNoYXIga0VudHJ5VGV4dFtdID0gImVudHJ5LnRleHQiOwotY29uc3RleHByIGNoYXIga0VudHJ5TGV2ZWxbXSA9ICJlbnRyeS5sZXZlbCI7Ci0KLS8vIEV2ZW50czoKLS8vIE91ciBjdXN0b20gIkxvZy5icm93c2VyRW50cnlBZGRlZCIgZXZlbnQgaXMganVzdCBsaWtlICJMb2cuZW50cnlBZGRlZCIKLS8vIGV4Y2VwdCBpdCBvbmx5IHNob3dzIHVwIGluIHRoZSBkZWJ1ZyBjb25zb2xlIGFuZCBub3QgaW4gcmVtb3RlIGRldnRvb2xzLgotY29uc3RleHByIGNoYXIga0Jyb3dzZXJFbnRyeUFkZGVkW10gPSAiTG9nLmJyb3dzZXJFbnRyeUFkZGVkIjsKK2NvbnN0ZXhwciBjaGFyIGtJbnNwZWN0b3JEb21haW5bXSA9ICJMb2ciOwogCiAvLyBFcnJvciBsZXZlbHM6CiBjb25zdGV4cHIgY2hhciBrSW5mb0xldmVsW10gPSAiaW5mbyI7CkBAIC01NywxNCArNDksMTQgQEAKIAogTG9nQWdlbnQ6OkxvZ0FnZW50KERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlcikKICAgICA6IGRpc3BhdGNoZXJfKGRpc3BhdGNoZXIpLAotICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNvbW1hbmRzXyh0aGlzKSksCisgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoY29tbWFuZHNfKHRoaXMsIGtJbnNwZWN0b3JEb21haW4pKSwKICAgICAgIGVuYWJsZWRfKGZhbHNlKSB7CiAgIERDSEVDSyhkaXNwYXRjaGVyXyk7CiAKLSAgY29tbWFuZHNfWyJMb2cuZW5hYmxlIl0gPSAmTG9nQWdlbnQ6OkVuYWJsZTsKLSAgY29tbWFuZHNfWyJMb2cuZGlzYWJsZSJdID0gJkxvZ0FnZW50OjpEaXNhYmxlOworICBjb21tYW5kc19bImVuYWJsZSJdID0gJkxvZ0FnZW50OjpFbmFibGU7CisgIGNvbW1hbmRzX1siZGlzYWJsZSJdID0gJkxvZ0FnZW50OjpEaXNhYmxlOwogCi0gIGRpc3BhdGNoZXJfLT5BZGREb21haW4oIkxvZyIsIGNvbW1hbmRzXy5CaW5kKCkpOworICBkaXNwYXRjaGVyXy0+QWRkRG9tYWluKGtJbnNwZWN0b3JEb21haW4sIGNvbW1hbmRzXy5CaW5kKCkpOwogCiAgIC8vIEdldCBsb2cgb3V0cHV0IHdoaWxlIHN0aWxsIG1ha2luZyBpdCBhdmFpbGFibGUgZWxzZXdoZXJlLgogICBsb2dfbWVzc2FnZV9oYW5kbGVyX2NhbGxiYWNrX2lkXyA9CkBAIC03NSw2ICs2Nyw4IEBACiBMb2dBZ2VudDo6fkxvZ0FnZW50KCkgewogICBiYXNlOjpMb2dNZXNzYWdlSGFuZGxlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlQ2FsbGJhY2soCiAgICAgICBsb2dfbWVzc2FnZV9oYW5kbGVyX2NhbGxiYWNrX2lkXyk7CisKKyAgZGlzcGF0Y2hlcl8tPlJlbW92ZURvbWFpbihrSW5zcGVjdG9yRG9tYWluKTsKIH0KIAogdm9pZCBMb2dBZ2VudDo6RW5hYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKQEAgLTk1LDExICs4OSwxNCBAQAogICBEQ0hFQ0sodGhpcyk7CiAKICAgaWYgKGVuYWJsZWRfKSB7CisgICAgLy8gT3VyIGN1c3RvbSAiTG9nLmJyb3dzZXJFbnRyeUFkZGVkIiBldmVudCBpcyBqdXN0IGxpa2UgIkxvZy5lbnRyeUFkZGVkIgorICAgIC8vIGV4Y2VwdCBpdCBvbmx5IHNob3dzIHVwIGluIHRoZSBkZWJ1ZyBjb25zb2xlIGFuZCBub3QgaW4gcmVtb3RlIGRldnRvb2xzLgogICAgIC8vIFRPRE86IEZsZXNoIG91dCB0aGUgcmVzdCBvZiBMb2dFbnRyeSBwcm9wZXJ0aWVzIChzb3VyY2UsIHRpbWVzdGFtcCkKICAgICBKU09OT2JqZWN0IHBhcmFtcyhuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOwotICAgIHBhcmFtcy0+U2V0U3RyaW5nKGtFbnRyeVRleHQsIHN0cik7Ci0gICAgcGFyYW1zLT5TZXRTdHJpbmcoa0VudHJ5TGV2ZWwsIEdldExvZ0xldmVsRnJvbVNldmVyaXR5KHNldmVyaXR5KSk7Ci0gICAgZGlzcGF0Y2hlcl8tPlNlbmRFdmVudChrQnJvd3NlckVudHJ5QWRkZWQsIHBhcmFtcyk7CisgICAgcGFyYW1zLT5TZXRTdHJpbmcoImVudHJ5LnRleHQiLCBzdHIpOworICAgIHBhcmFtcy0+U2V0U3RyaW5nKCJlbnRyeS5sZXZlbCIsIEdldExvZ0xldmVsRnJvbVNldmVyaXR5KHNldmVyaXR5KSk7CisgICAgZGlzcGF0Y2hlcl8tPlNlbmRFdmVudChzdGQ6OnN0cmluZyhrSW5zcGVjdG9yRG9tYWluKSArICIuYnJvd3NlckVudHJ5QWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKICAgfQogCiAgIC8vIERvbid0IHN1cHByZXNzIHRoZSBsb2cgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9wYWdlX2FnZW50LmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3BhZ2VfYWdlbnQuY2MKaW5kZXggOWZmODAwZS4uYzA0Y2Q1NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3BhZ2VfYWdlbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3BhZ2VfYWdlbnQuY2MKQEAgLTMxLDE4ICszMSw5IEBACiBuYW1lc3BhY2UgYmFja2VuZCB7CiAKIG5hbWVzcGFjZSB7Ci0vLyBQYXJhbWV0ZXIgZmllbGQgbmFtZXM6Ci1jb25zdCBjaGFyIGtGcmFtZUlkW10gPSAicmVzdWx0LmZyYW1lVHJlZS5mcmFtZS5pZCI7Ci1jb25zdCBjaGFyIGtMb2FkZXJJZFtdID0gInJlc3VsdC5mcmFtZVRyZWUuZnJhbWUubG9hZGVySWQiOwotY29uc3QgY2hhciBrTWltZVR5cGVbXSA9ICJyZXN1bHQuZnJhbWVUcmVlLmZyYW1lLm1pbWVUeXBlIjsKLWNvbnN0IGNoYXIga1Jlc291cmNlc1tdID0gInJlc3VsdC5mcmFtZVRyZWUucmVzb3VyY2VzIjsKLWNvbnN0IGNoYXIga1NlY3VyaXR5T3JpZ2luW10gPSAicmVzdWx0LmZyYW1lVHJlZS5mcmFtZS5zZWN1cml0eU9yaWdpbiI7Ci1jb25zdCBjaGFyIGtVcmxbXSA9ICJyZXN1bHQuZnJhbWVUcmVlLmZyYW1lLnVybCI7Ci0KLS8vIENvbnN0YW50IHBhcmFtZXRlciB2YWx1ZXM6Ci1jb25zdCBjaGFyIGtGcmFtZUlkVmFsdWVbXSA9ICJDb2JhbHQiOwotY29uc3QgY2hhciBrTG9hZGVySWRWYWx1ZVtdID0gIkNvYmFsdCI7Ci1jb25zdCBjaGFyIGtNaW1lVHlwZVZhbHVlW10gPSAidGV4dC9odG1sIjsKKy8vIERlZmluaXRpb25zIGZyb20gdGhlIHNldCBzcGVjaWZpZWQgaGVyZToKKy8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9QYWdlCitjb25zdGV4cHIgY2hhciBrSW5zcGVjdG9yRG9tYWluW10gPSAiUGFnZSI7CiB9ICAvLyBuYW1lc3BhY2UKIAogUGFnZUFnZW50OjpQYWdlQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyLCBkb206OldpbmRvdyogd2luZG93LApAQCAtNTEsMzMgKzQyLDM4IEBACiAgICAgOiB3aW5kb3dfKHdpbmRvdyksCiAgICAgICByZW5kZXJfbGF5ZXJfKHJlbmRlcl9sYXllci5QYXNzKCkpLAogICAgICAgcmVzb3VyY2VfcHJvdmlkZXJfKHJlc291cmNlX3Byb3ZpZGVyKSwKLSAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVChjb21tYW5kc18odGhpcykpIHsKLSAgRENIRUNLKGRpc3BhdGNoZXIpOworICAgICAgZGlzcGF0Y2hlcl8oZGlzcGF0Y2hlciksCisgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QoY29tbWFuZHNfKHRoaXMsIGtJbnNwZWN0b3JEb21haW4pKSB7CisgIERDSEVDSyhkaXNwYXRjaGVyXyk7CiAgIERDSEVDSyh3aW5kb3dfKTsKICAgRENIRUNLKHdpbmRvd18tPmRvY3VtZW50KCkpOwogICBEQ0hFQ0socmVuZGVyX2xheWVyXyk7CiAgIERDSEVDSyhyZXNvdXJjZV9wcm92aWRlcl8pOwogCi0gIGNvbW1hbmRzX1siUGFnZS5kaXNhYmxlIl0gPSAmUGFnZUFnZW50OjpEaXNhYmxlOwotICBjb21tYW5kc19bIlBhZ2UuZW5hYmxlIl0gPSAmUGFnZUFnZW50OjpFbmFibGU7Ci0gIGNvbW1hbmRzX1siUGFnZS5nZXRSZXNvdXJjZVRyZWUiXSA9ICZQYWdlQWdlbnQ6OkdldFJlc291cmNlVHJlZTsKLSAgY29tbWFuZHNfWyJQYWdlLnNldE92ZXJsYXlNZXNzYWdlIl0gPSAmUGFnZUFnZW50OjpTZXRPdmVybGF5TWVzc2FnZTsKKyAgY29tbWFuZHNfWyJkaXNhYmxlIl0gPSAmUGFnZUFnZW50OjpEaXNhYmxlOworICBjb21tYW5kc19bImVuYWJsZSJdID0gJlBhZ2VBZ2VudDo6RW5hYmxlOworICBjb21tYW5kc19bImdldFJlc291cmNlVHJlZSJdID0gJlBhZ2VBZ2VudDo6R2V0UmVzb3VyY2VUcmVlOworICBjb21tYW5kc19bInNldE92ZXJsYXlNZXNzYWdlIl0gPSAmUGFnZUFnZW50OjpTZXRPdmVybGF5TWVzc2FnZTsKIAotICBkaXNwYXRjaGVyLT5BZGREb21haW4oIlBhZ2UiLCBjb21tYW5kc18uQmluZCgpKTsKKyAgZGlzcGF0Y2hlcl8tPkFkZERvbWFpbihrSW5zcGVjdG9yRG9tYWluLCBjb21tYW5kc18uQmluZCgpKTsKIH0KIAorUGFnZUFnZW50Ojp+UGFnZUFnZW50KCkgeyBkaXNwYXRjaGVyXy0+UmVtb3ZlRG9tYWluKGtJbnNwZWN0b3JEb21haW4pOyB9CisKIHZvaWQgUGFnZUFnZW50OjpEaXNhYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsgfQogCiB2b2lkIFBhZ2VBZ2VudDo6RW5hYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsgfQogCiB2b2lkIFBhZ2VBZ2VudDo6R2V0UmVzb3VyY2VUcmVlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKICAgSlNPTk9iamVjdCByZXNwb25zZShuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOwotICByZXNwb25zZS0+U2V0U3RyaW5nKGtGcmFtZUlkLCBrRnJhbWVJZFZhbHVlKTsKLSAgcmVzcG9uc2UtPlNldFN0cmluZyhrTG9hZGVySWQsIGtMb2FkZXJJZFZhbHVlKTsKLSAgcmVzcG9uc2UtPlNldFN0cmluZyhrTWltZVR5cGUsIGtNaW1lVHlwZVZhbHVlKTsKLSAgcmVzcG9uc2UtPlNldFN0cmluZyhrU2VjdXJpdHlPcmlnaW4sIHdpbmRvd18tPmRvY3VtZW50KCktPnVybCgpKTsKLSAgcmVzcG9uc2UtPlNldFN0cmluZyhrVXJsLCB3aW5kb3dfLT5kb2N1bWVudCgpLT51cmwoKSk7Ci0gIHJlc3BvbnNlLT5TZXQoa1Jlc291cmNlcywgbmV3IGJhc2U6Okxpc3RWYWx1ZSgpKTsKKyAgSlNPTk9iamVjdCBmcmFtZShuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOworICBmcmFtZS0+U2V0U3RyaW5nKCJpZCIsICJDb2JhbHQiKTsKKyAgZnJhbWUtPlNldFN0cmluZygibG9hZGVySWQiLCAiQ29iYWx0Iik7CisgIGZyYW1lLT5TZXRTdHJpbmcoIm1pbWVUeXBlIiwgInRleHQvaHRtbCIpOworICBmcmFtZS0+U2V0U3RyaW5nKCJzZWN1cml0eU9yaWdpbiIsIHdpbmRvd18tPmRvY3VtZW50KCktPnVybCgpKTsKKyAgZnJhbWUtPlNldFN0cmluZygidXJsIiwgd2luZG93Xy0+ZG9jdW1lbnQoKS0+dXJsKCkpOworICByZXNwb25zZS0+U2V0KCJyZXN1bHQuZnJhbWVUcmVlLmZyYW1lIiwgZnJhbWUucmVsZWFzZSgpKTsKKyAgcmVzcG9uc2UtPlNldCgicmVzdWx0LmZyYW1lVHJlZS5yZXNvdXJjZXMiLCBuZXcgYmFzZTo6TGlzdFZhbHVlKCkpOwogICBjb21tYW5kLlNlbmRSZXNwb25zZShyZXNwb25zZSk7CiB9CiAKQEAgLTk2LDggKzkyLDggQEAKICAgICByZW5kZXJfdHJlZTo6Q29sb3JSR0JBIHRleHRfY29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMS4wZik7CiAKICAgICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpGb250PiBmb250ID0KLSAgICAgICAgcmVzb3VyY2VfcHJvdmlkZXJfLT5HZXRMb2NhbFR5cGVmYWNlKCJtb25vc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX3RyZWU6OkZvbnRTdHlsZSgpKQorICAgICAgICByZXNvdXJjZV9wcm92aWRlcl8KKyAgICAgICAgICAgIC0+R2V0TG9jYWxUeXBlZmFjZSgibW9ub3NwYWNlIiwgcmVuZGVyX3RyZWU6OkZvbnRTdHlsZSgpKQogICAgICAgICAgICAgLT5DcmVhdGVGb250V2l0aFNpemUoZm9udF9zaXplKTsKICAgICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpHbHlwaEJ1ZmZlcj4gZ2x5cGhfYnVmZmVyKAogICAgICAgICByZXNvdXJjZV9wcm92aWRlcl8tPkNyZWF0ZUdseXBoQnVmZmVyKG1lc3NhZ2UsIGZvbnQpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9wYWdlX2FnZW50LmggYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvcGFnZV9hZ2VudC5oCmluZGV4IDkwZWU5NzguLjU0OTA0NTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9wYWdlX2FnZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3BhZ2VfYWdlbnQuaApAQCAtMzcsNiArMzcsNyBAQAogICBQYWdlQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyLCBkb206OldpbmRvdyogd2luZG93LAogICAgICAgICAgICAgc2NvcGVkX3B0cjxSZW5kZXJMYXllcj4gcmVuZGVyX2xheWVyLAogICAgICAgICAgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKKyAgflBhZ2VBZ2VudCgpOwogCiAgcHJpdmF0ZToKICAgdm9pZCBFbmFibGUoY29uc3QgQ29tbWFuZCYgY29tbWFuZCk7CkBAIC00OCw2ICs0OSw4IEBACiAgIHNjb3BlZF9wdHI8UmVuZGVyTGF5ZXI+IHJlbmRlcl9sYXllcl87CiAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcl87CiAKKyAgRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyXzsKKwogICAvLyBNYXAgb2YgbWVtYmVyIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgY29tbWFuZHMuCiAgIENvbW1hbmRNYXA8UGFnZUFnZW50PiBjb21tYW5kc187CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3J1bnRpbWVfYWdlbnQuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvcnVudGltZV9hZ2VudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxNmNkMC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvcnVudGltZV9hZ2VudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL3J1bnRpbWVfYWdlbnQuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBkZWJ1ZyB7Ci1uYW1lc3BhY2UgYmFja2VuZCB7Ci0KLW5hbWVzcGFjZSB7Ci0vLyBGaWxlIHRvIGxvYWQgSmF2YVNjcmlwdCBydW50aW1lIGltcGxlbWVudGF0aW9uIGZyb20uCi1jb25zdCBjaGFyIGtTY3JpcHRGaWxlW10gPSAicnVudGltZS5qcyI7Ci0KLS8vIEV2ZW50ICJtZXRob2RzIiAobmFtZXMpOgotY29uc3QgY2hhciBrRXhlY3V0aW9uQ29udGV4dENyZWF0ZWRbXSA9ICJSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkIjsKLX0gIC8vIG5hbWVzcGFjZQotCi1SdW50aW1lQWdlbnQ6OlJ1bnRpbWVBZ2VudChEZWJ1Z0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXIpCi0gICAgOiBkaXNwYXRjaGVyXyhkaXNwYXRjaGVyKSwgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNvbW1hbmRzXyh0aGlzKSkgewotICBEQ0hFQ0soZGlzcGF0Y2hlcl8pOwotICBpZiAoIWRpc3BhdGNoZXJfLT5SdW5TY3JpcHRGaWxlKGtTY3JpcHRGaWxlKSkgewotICAgIERMT0coV0FSTklORykgPDwgIkNhbm5vdCBleGVjdXRlIFJ1bnRpbWUgaW5pdGlhbGl6YXRpb24gc2NyaXB0LiI7Ci0gIH0KLQotICBjb21tYW5kc19bIlJ1bnRpbWUuZW5hYmxlIl0gPSAmUnVudGltZUFnZW50OjpFbmFibGU7Ci0gIGNvbW1hbmRzX1siUnVudGltZS5kaXNhYmxlIl0gPSAmUnVudGltZUFnZW50OjpEaXNhYmxlOwotICBjb21tYW5kc19bIlJ1bnRpbWUuY29tcGlsZVNjcmlwdCJdID0gJlJ1bnRpbWVBZ2VudDo6Q29tcGlsZVNjcmlwdDsKLQotICBkaXNwYXRjaGVyXy0+QWRkRG9tYWluKCJSdW50aW1lIiwgY29tbWFuZHNfLkJpbmQoKSk7Ci19Ci0KLXZvaWQgUnVudGltZUFnZW50OjpDb21waWxlU2NyaXB0KGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpIHsKLSAgLy8gVE9ETzogUGFyc2UgdGhlIEpTIHdpdGhvdXQgZXZhbC1pbmcgaXQuLi4gVGhpcyBpcyB0byBzdXBwb3J0OgotICAvLyBhKSBNdWx0aS1saW5lIGlucHV0IGZyb20gdGhlIGRldnRvb2xzIGNvbnNvbGUKLSAgLy8gYikgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2Nocm9tZS1kZXZ0b29scy9zbmlwcGV0cwotICBjb21tYW5kLlNlbmRSZXNwb25zZSgpOwotfQotCi12b2lkIFJ1bnRpbWVBZ2VudDo6RGlzYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7IGNvbW1hbmQuU2VuZFJlc3BvbnNlKCk7IH0KLQotdm9pZCBSdW50aW1lQWdlbnQ6OkVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7Ci0gIGRpc3BhdGNoZXJfLT5TZW5kU2NyaXB0RXZlbnQoa0V4ZWN1dGlvbkNvbnRleHRDcmVhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW50aW1lLmV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkRXZlbnQiKTsKLSAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKLX0gIC8vIG5hbWVzcGFjZSBkZWJ1ZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3J1bnRpbWVfYWdlbnQuaCBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9ydW50aW1lX2FnZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYjMzZTMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3J1bnRpbWVfYWdlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBDT0JBTFRfREVCVUdfQkFDS0VORF9SVU5USU1FX0FHRU5UX0hfCi0jZGVmaW5lIENPQkFMVF9ERUJVR19CQUNLRU5EX1JVTlRJTUVfQUdFTlRfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgotI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvbW1hbmRfbWFwLmgiCi0jaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfZGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX3NjcmlwdF9ydW5uZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29tbWFuZC5oIgotI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9qc29uX29iamVjdC5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBkZWJ1ZyB7Ci1uYW1lc3BhY2UgYmFja2VuZCB7Ci0KLWNsYXNzIFJ1bnRpbWVBZ2VudCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBSdW50aW1lQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQ29tcGlsZVNjcmlwdChjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLSAgdm9pZCBEaXNhYmxlKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQpOwotICB2b2lkIEVuYWJsZShjb25zdCBDb21tYW5kJiBjb21tYW5kKTsKLQotICBEZWJ1Z0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXJfOwotCi0gIC8vIE1hcCBvZiBtZW1iZXIgZnVuY3Rpb25zIGltcGxlbWVudGluZyBjb21tYW5kcy4KLSAgQ29tbWFuZE1hcDxSdW50aW1lQWdlbnQ+IGNvbW1hbmRzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCi19ICAvLyBuYW1lc3BhY2UgZGVidWcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBDT0JBTFRfREVCVUdfQkFDS0VORF9SVU5USU1FX0FHRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3NjcmlwdF9kZWJ1Z2dlcl9hZ2VudC5jYwppbmRleCA3YWQwMzE0Li4zMGFlYTAzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9zY3JpcHRfZGVidWdnZXJfYWdlbnQuY2MKQEAgLTUxLDYgKzUxLDEzIEBACiAgIH0KIH0KIAorU2NyaXB0RGVidWdnZXJBZ2VudDo6flNjcmlwdERlYnVnZ2VyQWdlbnQoKSB7CisgIGZvciAoYXV0byBpdCA9IHJlZ2lzdGVyZWRfZG9tYWluc18uYmVnaW4oKTsgaXQgIT0gcmVnaXN0ZXJlZF9kb21haW5zXy5lbmQoKTsKKyAgICAgICArK2l0KSB7CisgICAgZGlzcGF0Y2hlcl8tPlJlbW92ZURvbWFpbigqaXQpOworICB9Cit9CisKIGJvb2wgU2NyaXB0RGVidWdnZXJBZ2VudDo6UnVuQ29tbWFuZChjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3NjcmlwdF9kZWJ1Z2dlcl9hZ2VudC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3NjcmlwdF9kZWJ1Z2dlcl9hZ2VudC5oCmluZGV4IDcyODA4NGMuLjZmODM3NmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC9zY3JpcHRfZGVidWdnZXJfYWdlbnQuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmgKQEAgLTM0LDYgKzM0LDcgQEAKICBwdWJsaWM6CiAgIFNjcmlwdERlYnVnZ2VyQWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6U2NyaXB0RGVidWdnZXIqIHNjcmlwdF9kZWJ1Z2dlcik7CisgIH5TY3JpcHREZWJ1Z2dlckFnZW50KCk7CiAKICAgYm9vbCBJc1N1cHBvcnRlZERvbWFpbihjb25zdCBzdGQ6OnN0cmluZyYgZG9tYWluKSB7CiAgICAgcmV0dXJuIHJlZ2lzdGVyZWRfZG9tYWluc18uY291bnQoZG9tYWluKSAhPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3RyYWNpbmdfYWdlbnQuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvdHJhY2luZ19hZ2VudC5jYwppbmRleCA1M2ZmZTdlLi4wNWI0Y2Y0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvdHJhY2luZ19hZ2VudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvdHJhY2luZ19hZ2VudC5jYwpAQCAtMjQsMTYgKzI0LDEyIEBACiBuYW1lc3BhY2UgYmFja2VuZCB7CiAKIG5hbWVzcGFjZSB7CisvLyBEZWZpbml0aW9ucyBmcm9tIHRoZSBzZXQgc3BlY2lmaWVkIGhlcmU6CisvLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvVHJhY2luZworY29uc3RleHByIGNoYXIga0luc3BlY3RvckRvbWFpbltdID0gIlRyYWNpbmciOworCiAvLyBTaXplIGluIGNoYXJhY3RlcnMgb2YgSlNPTiB0byBiYXRjaCBkYXRhQ29sbGVjdGVkIGV2ZW50cy4KIGNvbnN0ZXhwciBzaXplX3Qga0RhdGFDb2xsZWN0ZWRTaXplID0gMjQgKiAxMDI0OwotCi0vLyBQYXJhbWV0ZXIgZmllbGRzOgotY29uc3RleHByIGNoYXIga1ZhbHVlW10gPSAidmFsdWUiOwotY29uc3RleHByIGNoYXIga0NhdGVnb3JpZXNbXSA9ICJjYXRlZ29yaWVzIjsKLQotLy8gRXZlbnRzOgotY29uc3RleHByIGNoYXIga0RhdGFDb2xsZWN0ZWRbXSA9ICJUcmFjaW5nLmRhdGFDb2xsZWN0ZWQiOwotY29uc3RleHByIGNoYXIga1RyYWNpbmdDb21wbGV0ZVtdID0gIlRyYWNpbmcudHJhY2luZ0NvbXBsZXRlIjsKIH0gIC8vIG5hbWVzcGFjZQogCiBUcmFjaW5nQWdlbnQ6OlRyYWNpbmdBZ2VudChEZWJ1Z0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXIsCkBAIC00MiwxNSArMzgsMTcgQEAKICAgICAgIHNjcmlwdF9kZWJ1Z2dlcl8oc2NyaXB0X2RlYnVnZ2VyKSwKICAgICAgIHRyYWNpbmdfc3RhcnRlZF8oZmFsc2UpLAogICAgICAgY29sbGVjdGVkX3NpemVfKDApLAotICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNvbW1hbmRzXyh0aGlzKSkgeworICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGNvbW1hbmRzXyh0aGlzLCBrSW5zcGVjdG9yRG9tYWluKSkgewogICBEQ0hFQ0soZGlzcGF0Y2hlcl8pOwogCi0gIGNvbW1hbmRzX1siVHJhY2luZy5lbmQiXSA9ICZUcmFjaW5nQWdlbnQ6OkVuZDsKLSAgY29tbWFuZHNfWyJUcmFjaW5nLnN0YXJ0Il0gPSAmVHJhY2luZ0FnZW50OjpTdGFydDsKKyAgY29tbWFuZHNfWyJlbmQiXSA9ICZUcmFjaW5nQWdlbnQ6OkVuZDsKKyAgY29tbWFuZHNfWyJzdGFydCJdID0gJlRyYWNpbmdBZ2VudDo6U3RhcnQ7CiAKLSAgZGlzcGF0Y2hlcl8tPkFkZERvbWFpbigiVHJhY2luZyIsIGNvbW1hbmRzXy5CaW5kKCkpOworICBkaXNwYXRjaGVyXy0+QWRkRG9tYWluKGtJbnNwZWN0b3JEb21haW4sIGNvbW1hbmRzXy5CaW5kKCkpOwogfQogCitUcmFjaW5nQWdlbnQ6On5UcmFjaW5nQWdlbnQoKSB7IGRpc3BhdGNoZXJfLT5SZW1vdmVEb21haW4oa0luc3BlY3RvckRvbWFpbik7IH0KKwogdm9pZCBUcmFjaW5nQWdlbnQ6OkVuZChjb25zdCBDb21tYW5kJiBjb21tYW5kKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKICAgaWYgKCF0cmFjaW5nX3N0YXJ0ZWRfKSB7CkBAIC03Nyw3ICs3NSw3IEBACiAgIC8vIFBhcnNlIGNvbW1hLXNlcGFyYXRlZCB0cmFjaW5nIGNhdGVnb3JpZXMgcGFyYW1ldGVyLgogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2F0ZWdvcmllczsKICAgc3RkOjpzdHJpbmcgY2F0ZWdvcnlfcGFyYW07Ci0gIGlmIChwYXJhbXMtPkdldFN0cmluZyhrQ2F0ZWdvcmllcywgJmNhdGVnb3J5X3BhcmFtKSkgeworICBpZiAocGFyYW1zLT5HZXRTdHJpbmcoImNhdGVnb3JpZXMiLCAmY2F0ZWdvcnlfcGFyYW0pKSB7CiAgICAgZm9yIChzaXplX3QgcG9zID0gMCwgY29tbWE7IHBvcyA8IGNhdGVnb3J5X3BhcmFtLnNpemUoKTsgcG9zID0gY29tbWEgKyAxKSB7CiAgICAgICBjb21tYSA9IGNhdGVnb3J5X3BhcmFtLmZpbmQoJywnLCBwb3MpOwogICAgICAgaWYgKGNvbW1hID09IHN0ZDo6c3RyaW5nOjpucG9zKSBjb21tYSA9IGNhdGVnb3J5X3BhcmFtLnNpemUoKTsKQEAgLTExMSw3ICsxMDksOCBAQAogCiB2b2lkIFRyYWNpbmdBZ2VudDo6Rmx1c2hUcmFjZUV2ZW50cygpIHsKICAgU2VuZERhdGFDb2xsZWN0ZWRFdmVudCgpOwotICBkaXNwYXRjaGVyXy0+U2VuZEV2ZW50KGtUcmFjaW5nQ29tcGxldGUsIEpTT05PYmplY3QoKSk7CisgIGRpc3BhdGNoZXJfLT5TZW5kRXZlbnQoc3RkOjpzdHJpbmcoa0luc3BlY3RvckRvbWFpbikgKyAiLnRyYWNpbmdDb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCgpKTsKIH0KIAogdm9pZCBUcmFjaW5nQWdlbnQ6OlNlbmREYXRhQ29sbGVjdGVkRXZlbnQoKSB7CkBAIC0xMTksOCArMTE4LDkgQEAKICAgICBjb2xsZWN0ZWRfc2l6ZV8gPSAwOwogICAgIEpTT05PYmplY3QgcGFyYW1zKG5ldyBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7CiAgICAgLy8gUmVsZWFzaW5nIHRoZSBsaXN0IGludG8gdGhlIHZhbHVlIHBhcmFtIGF2b2lkcyBjb3B5aW5nIGl0LgotICAgIHBhcmFtcy0+U2V0KGtWYWx1ZSwgY29sbGVjdGVkX2V2ZW50c18ucmVsZWFzZSgpKTsKLSAgICBkaXNwYXRjaGVyXy0+U2VuZEV2ZW50KGtEYXRhQ29sbGVjdGVkLCBwYXJhbXMpOworICAgIHBhcmFtcy0+U2V0KCJ2YWx1ZSIsIGNvbGxlY3RlZF9ldmVudHNfLnJlbGVhc2UoKSk7CisgICAgZGlzcGF0Y2hlcl8tPlNlbmRFdmVudChzdGQ6OnN0cmluZyhrSW5zcGVjdG9yRG9tYWluKSArICIuZGF0YUNvbGxlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC90cmFjaW5nX2FnZW50LmggYi9zcmMvY29iYWx0L2RlYnVnL2JhY2tlbmQvdHJhY2luZ19hZ2VudC5oCmluZGV4IGJkMzFhNTAuLjQ3YjJkNzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvYmFja2VuZC90cmFjaW5nX2FnZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL3RyYWNpbmdfYWdlbnQuaApAQCAtMzIsNiArMzIsNyBAQAogIHB1YmxpYzoKICAgZXhwbGljaXQgVHJhY2luZ0FnZW50KERlYnVnRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwKICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6U2NyaXB0RGVidWdnZXIqIHNjcmlwdF9kZWJ1Z2dlcik7CisgIH5UcmFjaW5nQWdlbnQoKTsKIAogICAvLyBUcmFjZURlbGVnYXRlCiAgIHZvaWQgQXBwZW5kVHJhY2VFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgdHJhY2VfZXZlbnRfanNvbikgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnLmd5cCBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWcuZ3lwCmluZGV4IGNlMjBmODUuLmNhODFkZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWcuZ3lwCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWcuZ3lwCkBAIC0yNCw2ICsyNCw4IEBACiAgICAgICAgICdiYWNrZW5kL2NvbW1hbmRfbWFwLmgnLAogICAgICAgICAnYmFja2VuZC9jb25zb2xlX2FnZW50LmNjJywKICAgICAgICAgJ2JhY2tlbmQvY29uc29sZV9hZ2VudC5oJywKKyAgICAgICAgJ2JhY2tlbmQvY3NzX2FnZW50LmNjJywKKyAgICAgICAgJ2JhY2tlbmQvY3NzX2FnZW50LmgnLAogICAgICAgICAnYmFja2VuZC9kZWJ1Z19kaXNwYXRjaGVyLmNjJywKICAgICAgICAgJ2JhY2tlbmQvZGVidWdfZGlzcGF0Y2hlci5oJywKICAgICAgICAgJ2JhY2tlbmQvZGVidWdfbW9kdWxlLmNjJywKQEAgLTMyLDggKzM0LDYgQEAKICAgICAgICAgJ2JhY2tlbmQvZGVidWdfc2NyaXB0X3J1bm5lci5oJywKICAgICAgICAgJ2JhY2tlbmQvZG9tX2FnZW50LmNjJywKICAgICAgICAgJ2JhY2tlbmQvZG9tX2FnZW50LmgnLAotICAgICAgICAnYmFja2VuZC9qYXZhc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmNjJywKLSAgICAgICAgJ2JhY2tlbmQvamF2YXNjcmlwdF9kZWJ1Z2dlcl9hZ2VudC5oJywKICAgICAgICAgJ2JhY2tlbmQvbG9nX2FnZW50LmNjJywKICAgICAgICAgJ2JhY2tlbmQvbG9nX2FnZW50LmgnLAogICAgICAgICAnYmFja2VuZC9wYWdlX2FnZW50LmNjJywKQEAgLTQyLDggKzQyLDYgQEAKICAgICAgICAgJ2JhY2tlbmQvcmVuZGVyX2xheWVyLmgnLAogICAgICAgICAnYmFja2VuZC9yZW5kZXJfb3ZlcmxheS5jYycsCiAgICAgICAgICdiYWNrZW5kL3JlbmRlcl9vdmVybGF5LmgnLAotICAgICAgICAnYmFja2VuZC9ydW50aW1lX2FnZW50LmNjJywKLSAgICAgICAgJ2JhY2tlbmQvcnVudGltZV9hZ2VudC5oJywKICAgICAgICAgJ2JhY2tlbmQvc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmNjJywKICAgICAgICAgJ2JhY2tlbmQvc2NyaXB0X2RlYnVnZ2VyX2FnZW50LmgnLAogICAgICAgICAnYmFja2VuZC90cmFjaW5nX2FnZW50LmNjJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvcmVtb3RlL2RlYnVnX3dlYl9zZXJ2ZXIuY2MgYi9zcmMvY29iYWx0L2RlYnVnL3JlbW90ZS9kZWJ1Z193ZWJfc2VydmVyLmNjCmluZGV4IGIxYWFmNGUuLjc2NDczMDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvcmVtb3RlL2RlYnVnX3dlYl9zZXJ2ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9yZW1vdGUvZGVidWdfd2ViX3NlcnZlci5jYwpAQCAtMzQyLDEwICszNDIsMTUgQEAKICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKICAgaW50IHJlc3VsdCA9IEdldExvY2FsQWRkcmVzcygmYWRkcmVzcyk7CiAgIGlmIChyZXN1bHQgPT0gbmV0OjpPSykgewotICAgIERMT0coSU5GTykgPDwgIkRlYnVnIHdlYiBzZXJ2ZXIgcnVubmluZyBhdDogIiA8PCBhZGRyZXNzOworICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICBMT0coSU5GTykgPDwgIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgICA8PCAiXG4gQ29ubmVjdCB0byB0aGUgd2ViIGRlYnVnZ2VyIGF0OiIKKyAgICAgICAgICAgICAgPDwgIlxuICIgPDwgYWRkcmVzcworICAgICAgICAgICAgICA8PCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOworICAgIC8vIGNsYW5nLWZvcm1hdCBvbgogICAgIGxvY2FsX2FkZHJlc3NfID0gYWRkcmVzczsKICAgfSBlbHNlIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJDb3VsZCBub3Qgc3RhcnQgZGVidWcgd2ViIHNlcnZlciI7CisgICAgTE9HKFdBUk5JTkcpIDw8ICJDb3VsZCBub3Qgc3RhcnQgZGVidWcgd2ViIHNlcnZlciI7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb2MvcGVyZm9ybWFuY2VfdHVuaW5nLm1kIGIvc3JjL2NvYmFsdC9kb2MvcGVyZm9ybWFuY2VfdHVuaW5nLm1kCmluZGV4IDNhM2I4NWIuLjgyZGFjMmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9jL3BlcmZvcm1hbmNlX3R1bmluZy5tZAorKysgYi9zcmMvY29iYWx0L2RvYy9wZXJmb3JtYW5jZV90dW5pbmcubWQKQEAgLTIwMiw3ICsyMDIsMTYgQEAKIHZhbHVlIG9mIGBTQl9NVVNUX0ZSRVFVRU5UTFlfRkxJUF9ESVNQTEFZX0JVRkZFUmAgaW4geW91ciBwbGF0Zm9ybSdzCiBgY29uZmlndXJhdGlvbl9wdWJsaWMuaGAgZmlsZS4gIFVubGVzcyB5b3VyIHBsYXRmb3JtIGlzIHJlc3RyaWN0ZWQgaW4gdGhpcwogYXNwZWN0LCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IGBTQl9NVVNUX0ZSRVFVRU5UTFlfRkxJUF9ESVNQTEFZX0JVRkZFUmAKLWlzIHNldCB0byBgMGAuCitpcyBzZXQgdG8gYDBgLiAgSWYgdGhlIHBsYXRmb3JtIG5lZWRzIGEgbmV3IGZyYW1lIHN1Ym1pdHRlZCBwZXJpb2RpY2FsbHksCithbiBhbHRlcm5hdGl2ZSB0byBzZXR0aW5nIGBTQl9NVVNUX0ZSRVFVRU5UTFlfRkxJUF9ESVNQTEFZX0JVRkZFUmAgdG8gYDFgCitmb3IgT3BlbkdMIEVTIHBsYXRmb3JtcyBpcyB0byBoYXZlIGBlZ2xHZXRQcm9jQWRkcmVzcygpYCByZXR1cm4gYSBmdW5jdGlvbgord2hlbiBxdWVyaWVkIGZvciBgZWdsR2V0TWluaW11bUZyYW1lc1BlclNlY29uZENPQkFMVGA6CisKK2BFR0xpbnQgZWdsR2V0TWluaW11bUZyYW1lc1BlclNlY29uZENPQkFMVChFR0xEaXNwbGF5IGRpc3BsYXkpYAorCitFdmVyeSBgY29iYWx0X21pbmltdW1fZnJhbWVfdGltZV9pbl9taWxsaXNlY29uZHNgLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcXVlcmllZAordG8gZGV0ZXJtaW5lIGlmIGEgbmV3IGZyYW1lIHNob3VsZCBiZSBwcmVzZW50ZWQgZXZlbiBpZiB0aGUgc2NlbmUgaGFzIG5vdAorY2hhbmdlZC4KIAogKipUYWdzOioqICpjb25maWd1cmF0aW9uX3B1YmxpYy5oLCBzdGFydHVwLCBicm93c2UtdG8td2F0Y2gsIGlucHV0IGxhdGVuY3ksCiAgICAgICAgICAgIGZyYW1lcmF0ZS4qCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5jYwppbmRleCA5MzNiZDMyLi5iM2I2Y2Q3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuY2MKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW5zLmgiCkBAIC0xOTAsNiArMTkxLDggQEAKIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvV0QtZG9tLTIwMTQwNzEwLyNkb20tZWxlbWVudC1zZXRhdHRyaWJ1dGUKIHZvaWQgRWxlbWVudDo6U2V0QXR0cmlidXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJET00iKTsKKyAgVFJBQ0VfRVZFTlQyKCJjb2JhbHQ6OmRvbSIsICJFbGVtZW50OjpTZXRBdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgIm5hbWUiLCBuYW1lLCAidmFsdWUiLCB2YWx1ZSk7CiAgIERvY3VtZW50KiBkb2N1bWVudCA9IG5vZGVfZG9jdW1lbnQoKTsKIAogICAvLyAxLiBOb3QgbmVlZGVkIGJ5IENvYmFsdC4KQEAgLTI2OCw2ICsyNzEsNyBAQAogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNC9XRC1kb20tMjAxNDA3MTAvI2RvbS1lbGVtZW50LXJlbW92ZWF0dHJpYnV0ZQogdm9pZCBFbGVtZW50OjpSZW1vdmVBdHRyaWJ1dGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJET00iKTsKKyAgVFJBQ0VfRVZFTlQxKCJjb2JhbHQ6OmRvbSIsICJFbGVtZW50OjpSZW1vdmVBdHRyaWJ1dGUiLCAibmFtZSIsIG5hbWUpOwogICBEb2N1bWVudCogZG9jdW1lbnQgPSBub2RlX2RvY3VtZW50KCk7CiAKICAgLy8gMS4gSWYgdGhlIGNvbnRleHQgb2JqZWN0IGlzIGluIHRoZSBIVE1MIG5hbWVzcGFjZSBhbmQgaXRzIG5vZGUgZG9jdW1lbnQgaXMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgKaW5kZXggOTA3N2YzMi4uMWFkZjFhOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgKQEAgLTI3Myw2ICsyNzMsMTMgQEAKICAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6cmVzaXplKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25zY3JvbGwoKSB7CisgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpzY3JvbGwoKSk7CisgIH0KKyAgdm9pZCBzZXRfb25zY3JvbGwoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgeworICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpzY3JvbGwoKSwgZXZlbnRfbGlzdGVuZXIpOworICB9CisKICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbmdvdHBvaW50ZXJjYXB0dXJlKCkgewogICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6Z290cG9pbnRlcmNhcHR1cmUoKSk7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfZmFjZV91cGRhdGVyLmNjIGIvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlX3VwZGF0ZXIuY2MKaW5kZXggYTQ1YmE5NC4uYmEzNmMxOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlX3VwZGF0ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlX3VwZGF0ZXIuY2MKQEAgLTE2OSw2ICsxNjksNyBAQAogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1JlcGVhdDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1JpZ2h0OgorICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTdGFydDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTdGF0aWM6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9nbG9iYWxfZXZlbnRfaGFuZGxlcnMuaWRsIGIvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX2V2ZW50X2hhbmRsZXJzLmlkbAppbmRleCA1ZTFhYjZhLi42YTllN2VmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9nbG9iYWxfZXZlbnRfaGFuZGxlcnMuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2dsb2JhbF9ldmVudF9oYW5kbGVycy5pZGwKQEAgLTQzLDYgKzQzLDcgQEAKICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnBsYXlpbmc7CiAKICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnJlc2l6ZTsKKyAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnNjcm9sbDsKIAogICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9udHJhbnNpdGlvbmVuZDsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmNjCmluZGV4IDU5MDNmZmQuLjNiZGYwMjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfaW1hZ2VfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2ltYWdlX2VsZW1lbnQuY2MKQEAgLTE1Niw3ICsxNTYsNyBAQAogdm9pZCBIVE1MSW1hZ2VFbGVtZW50OjpPbkxvYWRpbmdTdWNjZXNzKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIkhUTUxJbWFnZUVsZW1lbnQ6Ok9uTG9hZGluZ1N1Y2Nlc3MoKSIpOwogICBBbGxvd0dhcmJhZ2VDb2xsZWN0aW9uQWZ0ZXJFdmVudElzRGlzcGF0Y2hlZCgKLSAgICAgIGJhc2U6OlRva2Vuczo6bG9hZCgpLCAmcHJldmVudF9nY191bnRpbF9sb2FkX2NvbXBsZXRlXyk7CisgICAgICBiYXNlOjpUb2tlbnM6OmxvYWQoKSwgcHJldmVudF9nY191bnRpbF9sb2FkX2NvbXBsZXRlXy5QYXNzKCkpOwogICBpZiAobm9kZV9kb2N1bWVudCgpKSB7CiAgICAgbm9kZV9kb2N1bWVudCgpLT5EZWNyZWFzZUxvYWRpbmdDb3VudGVyQW5kTWF5YmVEaXNwYXRjaExvYWRFdmVudCgpOwogICB9CkBAIC0xNjYsNyArMTY2LDcgQEAKIHZvaWQgSFRNTEltYWdlRWxlbWVudDo6T25Mb2FkaW5nRXJyb3IoKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpkb20iLCAiSFRNTEltYWdlRWxlbWVudDo6T25Mb2FkaW5nRXJyb3IoKSIpOwogICBBbGxvd0dhcmJhZ2VDb2xsZWN0aW9uQWZ0ZXJFdmVudElzRGlzcGF0Y2hlZCgKLSAgICAgIGJhc2U6OlRva2Vuczo6ZXJyb3IoKSwgJnByZXZlbnRfZ2NfdW50aWxfbG9hZF9jb21wbGV0ZV8pOworICAgICAgYmFzZTo6VG9rZW5zOjplcnJvcigpLCBwcmV2ZW50X2djX3VudGlsX2xvYWRfY29tcGxldGVfLlBhc3MoKSk7CiAgIGlmIChub2RlX2RvY3VtZW50KCkpIHsKICAgICBub2RlX2RvY3VtZW50KCktPkRlY3JlYXNlTG9hZGluZ0NvdW50ZXJBbmRNYXliZURpc3BhdGNoTG9hZEV2ZW50KCk7CiAgIH0KQEAgLTE3NSwyOSArMTc1LDMwIEBACiAKIHZvaWQgSFRNTEltYWdlRWxlbWVudDo6UHJldmVudEdhcmJhZ2VDb2xsZWN0aW9uVW50aWxFdmVudElzRGlzcGF0Y2hlZCgKICAgICBiYXNlOjpUb2tlbiBldmVudF9uYW1lKSB7Ci0gIERDSEVDSyghcHJldmVudF9nY191bnRpbF9ldmVudF9kaXNwYXRjaF8pOwotICBwcmV2ZW50X2djX3VudGlsX2V2ZW50X2Rpc3BhdGNoXy5yZXNldCgKLSAgICAgIG5ldyBzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OjpTY29wZWRQcmV2ZW50R2FyYmFnZUNvbGxlY3Rpb24oCi0gICAgICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHQoKS0+c2NyaXB0X3J1bm5lcigpLT5HZXRHbG9iYWxFbnZpcm9ubWVudCgpLAotICAgICAgICAgIHRoaXMpKTsKKyAgc2NvcGVkX3B0cjxzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OjpTY29wZWRQcmV2ZW50R2FyYmFnZUNvbGxlY3Rpb24+CisgICAgICBwcmV2ZW50X2djX3VudGlsX2V2ZW50X2Rpc3BhdGNoKAorICAgICAgICAgIG5ldyBzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OjpTY29wZWRQcmV2ZW50R2FyYmFnZUNvbGxlY3Rpb24oCisgICAgICAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0KCktPnNjcmlwdF9ydW5uZXIoKS0+R2V0R2xvYmFsRW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgICAgdGhpcykpOwogICBBbGxvd0dhcmJhZ2VDb2xsZWN0aW9uQWZ0ZXJFdmVudElzRGlzcGF0Y2hlZCgKLSAgICAgIGV2ZW50X25hbWUsICZwcmV2ZW50X2djX3VudGlsX2V2ZW50X2Rpc3BhdGNoXyk7CisgICAgICBldmVudF9uYW1lLCBwcmV2ZW50X2djX3VudGlsX2V2ZW50X2Rpc3BhdGNoLlBhc3MoKSk7CiB9CiAKIHZvaWQgSFRNTEltYWdlRWxlbWVudDo6QWxsb3dHYXJiYWdlQ29sbGVjdGlvbkFmdGVyRXZlbnRJc0Rpc3BhdGNoZWQoCiAgICAgYmFzZTo6VG9rZW4gZXZlbnRfbmFtZSwKLSAgICBzY29wZWRfcHRyPHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ6OlNjb3BlZFByZXZlbnRHYXJiYWdlQ29sbGVjdGlvbj4qCisgICAgc2NvcGVkX3B0cjxzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OjpTY29wZWRQcmV2ZW50R2FyYmFnZUNvbGxlY3Rpb24+CiAgICAgICAgIHNjb3BlZF9wcmV2ZW50X2djKSB7CiAgIFBvc3RUb0Rpc3BhdGNoRXZlbnRBbmRSdW5DYWxsYmFjaygKICAgICAgIEZST01fSEVSRSwgZXZlbnRfbmFtZSwKICAgICAgIGJhc2U6OkJpbmQoJkhUTUxJbWFnZUVsZW1lbnQ6OkRlc3Ryb3lTY29wZWRQcmV2ZW50R0MsCi0gICAgICAgICAgICAgICAgIGJhc2U6OkFzV2Vha1B0cjxIVE1MSW1hZ2VFbGVtZW50Pih0aGlzKSwgc2NvcGVkX3ByZXZlbnRfZ2MpKTsKKyAgICAgICAgICAgICAgICAgYmFzZTo6QXNXZWFrUHRyPEhUTUxJbWFnZUVsZW1lbnQ+KHRoaXMpLAorICAgICAgICAgICAgICAgICBiYXNlOjpQYXNzZWQoJnNjb3BlZF9wcmV2ZW50X2djKSkpOwogfQogCiB2b2lkIEhUTUxJbWFnZUVsZW1lbnQ6OkRlc3Ryb3lTY29wZWRQcmV2ZW50R0MoCi0gICAgc2NvcGVkX3B0cjxzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OjpTY29wZWRQcmV2ZW50R2FyYmFnZUNvbGxlY3Rpb24+KgorICAgIHNjb3BlZF9wdHI8c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDo6U2NvcGVkUHJldmVudEdhcmJhZ2VDb2xsZWN0aW9uPgogICAgICAgICBzY29wZWRfcHJldmVudF9nYykgewotICBzY29wZWRfcHJldmVudF9nYy0+cmVzZXQoKTsKKyAgc2NvcGVkX3ByZXZlbnRfZ2MucmVzZXQoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGRvbQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2ltYWdlX2VsZW1lbnQuaAppbmRleCA4NjEwMWEzLi41MzFhN2Q0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2ltYWdlX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2ltYWdlX2VsZW1lbnQuaApAQCAtNjcsMTkgKzY3LDE2IEBACiAgIHZvaWQgUHJldmVudEdhcmJhZ2VDb2xsZWN0aW9uVW50aWxFdmVudElzRGlzcGF0Y2hlZChiYXNlOjpUb2tlbiBldmVudF9uYW1lKTsKICAgdm9pZCBBbGxvd0dhcmJhZ2VDb2xsZWN0aW9uQWZ0ZXJFdmVudElzRGlzcGF0Y2hlZCgKICAgICAgIGJhc2U6OlRva2VuIGV2ZW50X25hbWUsCi0gICAgICBzY29wZWRfcHRyPHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ6OlNjb3BlZFByZXZlbnRHYXJiYWdlQ29sbGVjdGlvbj4qCisgICAgICBzY29wZWRfcHRyPHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ6OlNjb3BlZFByZXZlbnRHYXJiYWdlQ29sbGVjdGlvbj4KICAgICAgICAgICBzY29wZWRfcHJldmVudF9nYyk7CiAgIHZvaWQgRGVzdHJveVNjb3BlZFByZXZlbnRHQygKLSAgICAgIHNjb3BlZF9wdHI8c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDo6U2NvcGVkUHJldmVudEdhcmJhZ2VDb2xsZWN0aW9uPioKKyAgICAgIHNjb3BlZF9wdHI8c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDo6U2NvcGVkUHJldmVudEdhcmJhZ2VDb2xsZWN0aW9uPgogICAgICAgICAgIHNjb3BlZF9wcmV2ZW50X2djKTsKIAogICBzY29wZWRfcHRyPGxvYWRlcjo6aW1hZ2U6OkNhY2hlZEltYWdlOjpPbkxvYWRlZENhbGxiYWNrSGFuZGxlcj4KICAgICAgIGNhY2hlZF9pbWFnZV9sb2FkZWRfY2FsbGJhY2tfaGFuZGxlcl87CiAKICAgc2NvcGVkX3B0cjxzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OjpTY29wZWRQcmV2ZW50R2FyYmFnZUNvbGxlY3Rpb24+Ci0gICAgICBwcmV2ZW50X2djX3VudGlsX2V2ZW50X2Rpc3BhdGNoXzsKLQotICBzY29wZWRfcHRyPHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ6OlNjb3BlZFByZXZlbnRHYXJiYWdlQ29sbGVjdGlvbj4KICAgICAgIHByZXZlbnRfZ2NfdW50aWxfbG9hZF9jb21wbGV0ZV87CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5jYyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmNjCmluZGV4IDFlNTM1MDcuLmZjMjBiM2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmNjCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmgiCiAKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyLmgiCkBAIC0xMzEsMTEgKzEzMiwxMyBAQAogCiB2b2lkIE11dGF0aW9uT2JzZXJ2ZXI6OlF1ZXVlTXV0YXRpb25SZWNvcmQoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNdXRhdGlvblJlY29yZD4mIHJlY29yZCkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk11dGF0aW9uT2JzZXJ2ZXI6OlF1ZXVlTXV0YXRpb25SZWNvcmQoKSIpOwogICByZWNvcmRfcXVldWVfLnB1c2hfYmFjayhyZWNvcmQpOwogICB0YXNrX21hbmFnZXJfLT5RdWV1ZU11dGF0aW9uT2JzZXJ2ZXJNaWNyb3Rhc2soKTsKIH0KIAogYm9vbCBNdXRhdGlvbk9ic2VydmVyOjpOb3RpZnkoKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpkb20iLCAiTXV0YXRpb25PYnNlcnZlcjo6Tm90aWZ5KCkiKTsKICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jbXV0YXRpb25vYnNlcnZlcgogICAvLyBTdGVwIDMgb2YgIm5vdGlmeSBtdXRhdGlvbiBvYnNlcnZlcnMiIHN0ZXBzOgogICAvLyAgICAgMS4gTGV0IHF1ZXVlIGJlIGEgY29weSBvZiBtbydzIHJlY29yZCBxdWV1ZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5jYyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5jYwppbmRleCA0ZTQ3ZWY2Li4zZTEwNjMxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyLmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuaCIKIAogI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmgiCiAKQEAgLTI1LDYgKzI2LDggQEAKICAgICBNdXRhdGlvbk9ic2VydmVyKiBvYnNlcnZlcikgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIERDSEVDSyhvYnNlcnZlcnNfLmZpbmQob2JzZXJ2ZXIpID09IG9ic2VydmVyc18uZW5kKCkpOworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwKKyAgICAgICAgICAgICAgICJNdXRhdGlvbk9ic2VydmVyVGFza01hbmFnZXI6Ok9uTXV0YXRpb25PYnNlcnZlckNyZWF0ZWQoKSIpOwogICBvYnNlcnZlcnNfLmluc2VydChvYnNlcnZlcik7CiB9CiAKQEAgLTMyLDExICszNSwxNiBAQAogICAgIE11dGF0aW9uT2JzZXJ2ZXIqIG9ic2VydmVyKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKICAgRENIRUNLKG9ic2VydmVyc18uZmluZChvYnNlcnZlcikgIT0gb2JzZXJ2ZXJzXy5lbmQoKSk7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpkb20iLAorICAgICAgICAgICAgICAgIk11dGF0aW9uT2JzZXJ2ZXJUYXNrTWFuYWdlcjo6T25NdXRhdGlvbk9ic2VydmVyRGVzdHJveWVkKCkiKTsKICAgb2JzZXJ2ZXJzXy5lcmFzZShvYnNlcnZlcik7CiB9CiAKIHZvaWQgTXV0YXRpb25PYnNlcnZlclRhc2tNYW5hZ2VyOjpRdWV1ZU11dGF0aW9uT2JzZXJ2ZXJNaWNyb3Rhc2soKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmRvbSIsCisgICAgICAgICAgICAgICAiTXV0YXRpb25PYnNlcnZlclRhc2tNYW5hZ2VyOjpRdWV1ZU11dGF0aW9uT2JzZXJ2ZXJNaWNyb3Rhc2soKSIpOworCiAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI3F1ZXVlLWEtbXV0YXRpb24tb2JzZXJ2ZXItY29tcG91bmQtbWljcm90YXNrCiAgIC8vIFRvIHF1ZXVlIGEgbXV0YXRpb24gb2JzZXJ2ZXIgY29tcG91bmQgbWljcm90YXNrLCBydW4gdGhlc2Ugc3RlcHM6CiAgIC8vIDEuIElmIG11dGF0aW9uIG9ic2VydmVyIGNvbXBvdW5kIG1pY3JvdGFzayBxdWV1ZWQgZmxhZyBpcyBzZXQsIHRlcm1pbmF0ZQpAQCAtNTgsNiArNjYsOCBAQAogfQogCiB2b2lkIE11dGF0aW9uT2JzZXJ2ZXJUYXNrTWFuYWdlcjo6Tm90aWZ5TXV0YXRpb25PYnNlcnZlcnMoKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpkb20iLAorICAgICAgICAgICAgICAgIk11dGF0aW9uT2JzZXJ2ZXJUYXNrTWFuYWdlcjo6Tm90aWZ5TXV0YXRpb25PYnNlcnZlcnMoKSIpOwogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIERDSEVDSyh0YXNrX3Bvc3RlZF8pOwogICBEQ0hFQ0soTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9yZXBvcnRlci5jYyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmNjCmluZGV4IGU5ZTFjM2EuLjc3ZjNiMDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmNjCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmgiCiAKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX2luaXQuaCIKQEAgLTE1Myw2ICsxNTQsNyBAQAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIHRhcmdldCwKICAgICBNdXRhdGlvblJlcG9ydGVyOjpSZWdpc3RlcmVkT2JzZXJ2ZXJWZWN0b3IqIHJlZ2lzdGVyZWRfb2JzZXJ2ZXJzLAogICAgIE11dGF0aW9uUmVjb3JkQnVpbGRlciogcmVjb3JkX2J1aWxkZXIpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmRvbSIsICJSZXBvcnRUb0ludGVyZXN0ZWRPYnNlcnZlcnMoKSIpOwogICB0eXBlZGVmIGJhc2U6Omhhc2hfc2V0PE11dGF0aW9uT2JzZXJ2ZXIqPiBNdXRhdGlvbk9ic2VydmVyU2V0OwogICBNdXRhdGlvbk9ic2VydmVyU2V0IHJlcG9ydGVkX29ic2VydmVyczsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWdpc3RlcmVkX29ic2VydmVycy0+c2l6ZSgpOyArK2kpIHsKQEAgLTE5OCwxMiArMjAwLDE1IEBACiB2b2lkIE11dGF0aW9uUmVwb3J0ZXI6OlJlcG9ydEF0dHJpYnV0ZXNNdXRhdGlvbigKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIG9sZF92YWx1ZSkgY29uc3QgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk11dGF0aW9uUmVwb3J0ZXI6OlJlcG9ydEF0dHJpYnV0ZXNNdXRhdGlvbigpIik7CiAgIEF0dHJpYnV0ZU11dGF0aW9uUmVjb3JkQnVpbGRlciByZWNvcmRfYnVpbGRlcihuYW1lLCBvbGRfdmFsdWUpOwogICBSZXBvcnRUb0ludGVyZXN0ZWRPYnNlcnZlcnModGFyZ2V0Xywgb2JzZXJ2ZXJzXy5nZXQoKSwgJnJlY29yZF9idWlsZGVyKTsKIH0KIAogdm9pZCBNdXRhdGlvblJlcG9ydGVyOjpSZXBvcnRDaGFyYWN0ZXJEYXRhTXV0YXRpb24oCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9sZF92YWx1ZSkgY29uc3QgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwKKyAgICAgICAgICAgICAgICJNdXRhdGlvblJlcG9ydGVyOjpSZXBvcnRDaGFyYWN0ZXJEYXRhTXV0YXRpb24oKSIpOwogICBDaGFyYWN0ZXJEYXRhTXV0YXRpb25SZWNvcmRCdWlsZGVyIHJlY29yZF9idWlsZGVyKG9sZF92YWx1ZSk7CiAgIFJlcG9ydFRvSW50ZXJlc3RlZE9ic2VydmVycyh0YXJnZXRfLCBvYnNlcnZlcnNfLmdldCgpLCAmcmVjb3JkX2J1aWxkZXIpOwogfQpAQCAtMjEzLDYgKzIxOCw3IEBACiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206Ok5vZGVMaXN0PiYgcmVtb3ZlZF9ub2RlcywKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6Tm9kZT4mIHByZXZpb3VzX3NpYmxpbmcsCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206Ok5vZGU+JiBuZXh0X3NpYmxpbmcpIGNvbnN0IHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmRvbSIsICJNdXRhdGlvblJlcG9ydGVyOjpSZXBvcnRDaGlsZExpc3RNdXRhdGlvbigpIik7CiAgIENoaWxkTGlzdE11dGF0aW9uUmVjb3JkQnVpbGRlciByZWNvcmRfYnVpbGRlcihhZGRlZF9ub2RlcywgcmVtb3ZlZF9ub2RlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX3NpYmxpbmcsIG5leHRfc2libGluZyk7CiAgIFJlcG9ydFRvSW50ZXJlc3RlZE9ic2VydmVycyh0YXJnZXRfLCBvYnNlcnZlcnNfLmdldCgpLCAmcmVjb3JkX2J1aWxkZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbm9kZS5jYyBiL3NyYy9jb2JhbHQvZG9tL25vZGUuY2MKaW5kZXggYTJmZDY2OC4uYThkMTg0MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZS5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ub2RlLmNjCkBAIC0xOTksNiArMTk5LDcgQEAKIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0QtZG9tLTIwMTUwNjE4LyNkb20tbm9kZS1jbG9uZW5vZGUKIHNjb3BlZF9yZWZwdHI8Tm9kZT4gTm9kZTo6Q2xvbmVOb2RlKGJvb2wgZGVlcCkgY29uc3QgewogICBUUkFDS19NRU1PUllfU0NPUEUoIkRPTSIpOworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk5vZGU6OkNsb25lTm9kZSgpIik7CiAgIHNjb3BlZF9yZWZwdHI8Tm9kZT4gbmV3X25vZGUgPSBEdXBsaWNhdGUoKTsKICAgRENIRUNLKG5ld19ub2RlKTsKICAgaWYgKGRlZXApIHsKQEAgLTIyOSw2ICsyMzAsNyBAQAogc2NvcGVkX3JlZnB0cjxOb2RlPiBOb2RlOjpJbnNlcnRCZWZvcmUoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgbmV3X2NoaWxkLAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIHJlZmVyZW5jZV9jaGlsZCkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk5vZGU6Okluc2VydEJlZm9yZSgpIik7CiAgIC8vIFRoZSBpbnNlcnRCZWZvcmUobm9kZSwgY2hpbGQpIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgcmVzdWx0IG9mCiAgIC8vIHByZS1pbnNlcnRpbmcgbm9kZSBpbnRvIHRoZSBjb250ZXh0IG9iamVjdCBiZWZvcmUgY2hpbGQuCiAgIHJldHVybiBQcmVJbnNlcnQobmV3X2NoaWxkLCByZWZlcmVuY2VfY2hpbGQpOwpAQCAtMjM3LDYgKzIzOSw3IEBACiAvLyBBbGdvcml0aG0gZm9yIEFwcGVuZENoaWxkOgogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb20tbm9kZS1hcHBlbmRjaGlsZAogc2NvcGVkX3JlZnB0cjxOb2RlPiBOb2RlOjpBcHBlbmRDaGlsZChjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiBuZXdfY2hpbGQpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmRvbSIsICJOb2RlOjpBcHBlbmRDaGlsZCgpIik7CiAgIC8vIFRoZSBhcHBlbmRDaGlsZChub2RlKSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHJlc3VsdCBvZiBhcHBlbmRpbmcgbm9kZSB0bwogICAvLyB0aGUgY29udGV4dCBvYmplY3QuCiAgIC8vIFRvIGFwcGVuZCBhIG5vZGUgdG8gYSBwYXJlbnQsIHByZS1pbnNlcnQgbm9kZSBpbnRvIHBhcmVudCBiZWZvcmUgbnVsbC4KQEAgLTI0Nyw2ICsyNTAsNyBAQAogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb20tbm9kZS1yZXBsYWNlY2hpbGQKIHNjb3BlZF9yZWZwdHI8Tm9kZT4gTm9kZTo6UmVwbGFjZUNoaWxkKGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiBjaGlsZCkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk5vZGU6OlJlcGxhY2VDaGlsZCgpIik7CiAgIC8vIFRoZSByZXBsYWNlQ2hpbGQobm9kZSwgY2hpbGQpIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgcmVzdWx0IG9mIHJlcGxhY2luZwogICAvLyBjaGlsZCB3aXRoIG5vZGUgd2l0aGluIHRoZSBjb250ZXh0IG9iamVjdC4KICAgLy8gVG8gcmVwbGFjZSBhIGNoaWxkIHdpdGggbm9kZSB3aXRoaW4gYSBwYXJlbnQsIHJ1biB0aGVzZSBzdGVwczoKQEAgLTM0Myw2ICszNDcsNyBAQAogLy8gQWxnb3JpdGhtIGZvciBSZW1vdmVDaGlsZDoKIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jZG9tLW5vZGUtcmVtb3ZlY2hpbGQKIHNjb3BlZF9yZWZwdHI8Tm9kZT4gTm9kZTo6UmVtb3ZlQ2hpbGQoY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgbm9kZSkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk5vZGU6OlJlbW92ZUNoaWxkKCkiKTsKICAgLy8gVGhlIHJlbW92ZUNoaWxkKGNoaWxkKSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHJlc3VsdCBvZiBwcmUtcmVtb3ZpbmcgY2hpbGQKICAgLy8gZnJvbSB0aGUgY29udGV4dCBvYmplY3QuCiAgIHJldHVybiBQcmVSZW1vdmUobm9kZSk7CkBAIC00MjQsNiArNDI5LDcgQEAKIC8vIEFsZ29yaXRobSBmb3IgQWRvcHRJbnRvRG9jdW1lbnQ6CiAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2NvbmNlcHQtbm9kZS1hZG9wdAogdm9pZCBOb2RlOjpBZG9wdEludG9Eb2N1bWVudChEb2N1bWVudCogZG9jdW1lbnQpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmRvbSIsICJOb2RlOjpBZG9wdEludG9Eb2N1bWVudCgpIik7CiAgIERDSEVDSyghSXNEb2N1bWVudCgpKTsKICAgaWYgKCFkb2N1bWVudCkgewogICAgIHJldHVybjsKQEAgLTY3Miw2ICs2NzgsNyBAQAogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNjb25jZXB0LW5vZGUtcHJlLWluc2VydAogc2NvcGVkX3JlZnB0cjxOb2RlPiBOb2RlOjpQcmVJbnNlcnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIGNoaWxkKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpkb20iLCAiTm9kZTo6UHJlSW5zZXJ0KCkiKTsKICAgLy8gMS4gRW5zdXJlIHByZS1pbnNlcnRpb24gdmFsaWRpdHkgb2Ygbm9kZSBpbnRvIHBhcmVudCBiZWZvcmUgY2hpbGQuCiAgIGlmICghRW5zdXJlUHJlSW5zZXJ0aW9uVmFsaWRpdHkobm9kZSwgY2hpbGQpKSB7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC02OTIsNiArNjk5LDcgQEAKIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jY29uY2VwdC1ub2RlLWluc2VydAogdm9pZCBOb2RlOjpJbnNlcnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgbm9kZSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIGNoaWxkLCBib29sIHN1cHByZXNzX29ic2VydmVycykgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk5vZGU6Okluc2VydCgpIik7CiAgIC8vIDEuIDIuIE5vdCBuZWVkZWQgYnkgQ29iYWx0LgogICAvLyAzLiBMZXQgbm9kZXMgYmUgbm9kZSdzIGNoaWxkcmVuIGlmIG5vZGUgaXMgYSBEb2N1bWVudEZyYWdtZW50IG5vZGUsIGFuZCBhCiAgIC8vIGxpc3QgY29udGFpbmluZyBzb2xlbHkgbm9kZSBvdGhlcndpc2UuCkBAIC03NjIsNiArNzcwLDcgQEAKIC8vIEFsZ29yaXRobSBmb3IgUHJlUmVtb3ZlOgogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNjb25jZXB0LW5vZGUtcHJlLXJlbW92ZQogc2NvcGVkX3JlZnB0cjxOb2RlPiBOb2RlOjpQcmVSZW1vdmUoY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgY2hpbGQpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmRvbSIsICJOb2RlOjpQcmVSZW1vdmUoKSIpOwogICAvLyAxLiBJZiBjaGlsZCdzIHBhcmVudCBpcyBub3QgcGFyZW50LCB0aHJvdyBhICJOb3RGb3VuZEVycm9yIiBleGNlcHRpb24uCiAgIGlmICghY2hpbGQgfHwgY2hpbGQtPnBhcmVudF8gIT0gdGhpcykgewogICAgIC8vIFRPRE86IFRocm93IEpTIE5vdEZvdW5kRXJyb3IuCkBAIC03NzksNiArNzg4LDcgQEAKIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jY29uY2VwdC1ub2RlLXJlbW92ZQogdm9pZCBOb2RlOjpSZW1vdmUoY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgbm9kZSwgYm9vbCBzdXBwcmVzc19vYnNlcnZlcnMpIHsKICAgRENIRUNLKG5vZGUpOworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIk5vZGU6OlJlbW92ZSgpIik7CiAKICAgT25NdXRhdGlvbigpOwogICBub2RlLT5VcGRhdGVHZW5lcmF0aW9uRm9yTm9kZUFuZEFuY2VzdG9ycygpOwpAQCAtODU4LDYgKzg2OCw3IEBACiAvLyBBbGdvcml0aG0gZm9yIFJlcGxhY2VBbGw6CiAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2NvbmNlcHQtbm9kZS1yZXBsYWNlLWFsbAogdm9pZCBOb2RlOjpSZXBsYWNlQWxsKGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIG5vZGUpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmRvbSIsICJOb2RlOjpSZXBsYWNlQWxsKCkiKTsKICAgLy8gMS4gSWYgbm9kZSBpcyBub3QgbnVsbCwgYWRvcHQgbm9kZSBpbnRvIHBhcmVudCdzIG5vZGUgZG9jdW1lbnQuCiAgIGlmIChub2RlKSB7CiAgICAgbm9kZS0+QWRvcHRJbnRvRG9jdW1lbnQodGhpcy0+bm9kZV9kb2N1bWVudCgpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZC5jYyBiL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZC5jYwppbmRleCA3NjdlM2I4Li4xZmNkODk2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9vbl9zY3JlZW5fa2V5Ym9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkLmNjCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICBzY3JpcHRfdmFsdWVfZmFjdG9yeV8oc2NyaXB0X3ZhbHVlX2ZhY3RvcnkpLAogICAgICAgbmV4dF90aWNrZXRfKDApIHsKICAgRENIRUNLKGJyaWRnZV8pIDw8ICJPblNjcmVlbktleWJvYXJkQnJpZGdlIG11c3Qgbm90IGJlIE5VTEwiOworICBzdWdnZXN0aW9uc19zdXBwb3J0ZWRfID0gYnJpZGdlXy0+U3VnZ2VzdGlvbnNTdXBwb3J0ZWQoKTsKIH0KIAogc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpQcm9taXNlPHZvaWQ+PiBPblNjcmVlbktleWJvYXJkOjpTaG93KCkgewpAQCAtOTEsMjIgKzkyLDI5IEBACiAgICAgY29uc3Qgc2NyaXB0OjpTZXF1ZW5jZTxzdGQ6OnN0cmluZz4mIHN1Z2dlc3Rpb25zKSB7CiAgIHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6UHJvbWlzZTx2b2lkPj4gcHJvbWlzZSA9CiAgICAgICBzY3JpcHRfdmFsdWVfZmFjdG9yeV8tPkNyZWF0ZUJhc2ljUHJvbWlzZTx2b2lkPigpOwotCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfT05fU0NSRUVOX0tFWUJPQVJEX1NVR0dFU1RJT05TX1ZFUlNJT04KLSAgaW50IHRpY2tldCA9IG5leHRfdGlja2V0XysrOwotICBib29sIGlzX2VtcGxhY2VkID0KLSAgICAgIHRpY2tldF90b191cGRhdGVfc3VnZ2VzdGlvbnNfcHJvbWlzZV9tYXBfCi0gICAgICAgICAgLmVtcGxhY2UodGlja2V0LCBzdGQ6OnVuaXF1ZV9wdHI8Vm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKHRoaXMsIHByb21pc2UpKSkKLSAgICAgICAgICAuc2Vjb25kOwotICBEQ0hFQ0soaXNfZW1wbGFjZWQpOwotICBicmlkZ2VfLT5VcGRhdGVTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucywgdGlja2V0KTsKKyAgaWYgKHN1Z2dlc3Rpb25zX3N1cHBvcnRlZF8pIHsKKyAgICBpbnQgdGlja2V0ID0gbmV4dF90aWNrZXRfKys7CisgICAgYm9vbCBpc19lbXBsYWNlZCA9CisgICAgICAgIHRpY2tldF90b191cGRhdGVfc3VnZ2VzdGlvbnNfcHJvbWlzZV9tYXBfCisgICAgICAgICAgICAuZW1wbGFjZSh0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Vm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKHRoaXMsIHByb21pc2UpKSkKKyAgICAgICAgICAgIC5zZWNvbmQ7CisgICAgRENIRUNLKGlzX2VtcGxhY2VkKTsKKyAgICBicmlkZ2VfLT5VcGRhdGVTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucywgdGlja2V0KTsKKyAgfSBlbHNlIHsKKyAgICBMT0coV0FSTklORykKKyAgICAgICAgPDwgIlN0YXJib2FyZCB2ZXJzaW9uICIgPDwgU0JfQVBJX1ZFUlNJT04KKyAgICAgICAgPDwgIiBkb2VzIG5vdCBzdXBwb3J0IG9uLXNjcmVlbiBrZXlib2FyZCBzdWdnZXN0aW9ucyBvbiB0aGlzIHBsYXRmb3JtLiI7CisgICAgcHJvbWlzZS0+UmVqZWN0KCk7CisgIH0KICNlbHNlCiAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoc3VnZ2VzdGlvbnMpOwotICBMT0coV0FSTklORykgPDwgIlN0YXJib2FyZCB2ZXJzaW9uICIgPDwgU0JfQVBJX1ZFUlNJT04KLSAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3Qgc3VwcG9ydCBvbi1zY3JlZW4ga2V5Ym9hcmQgc3VnZ2VzdGlvbnMuIjsKLSAgcHJvbWlzZS0+UmVzb2x2ZSgpOwotICBEaXNwYXRjaEV2ZW50KG5ldyBkb206OkV2ZW50KGJhc2U6OlRva2Vuczo6c3VnZ2VzdGlvbnNVcGRhdGVkKCkpKTsKKyAgTE9HKFdBUk5JTkcpCisgICAgICA8PCAiU3RhcmJvYXJkIHZlcnNpb24gIiA8PCBTQl9BUElfVkVSU0lPTgorICAgICAgPDwgIiBkb2VzIG5vdCBzdXBwb3J0IG9uLXNjcmVlbiBrZXlib2FyZCBzdWdnZXN0aW9ucyBvbiB0aGlzIHBsYXRmb3JtLiI7CisgIHByb21pc2UtPlJlamVjdCgpOwogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9PTl9TQ1JFRU5fS0VZQk9BUkRfU1VHR0VTVElPTlNfVkVSU0lPTgogICByZXR1cm4gcHJvbWlzZTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZC5oIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkLmgKaW5kZXggZjdjMjJkNi4uNTdhMDQ4NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkLmgKQEAgLTY1LDYgKzY1LDExIEBACiAgIHN0ZDo6c3RyaW5nIGRhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQogICB2b2lkIHNldF9kYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKSB7IGRhdGFfID0gZGF0YTsgfQogCisgIGJvb2wgaXNfY29tcG9zaW5nKCkgY29uc3QgeyByZXR1cm4gaXNfY29tcG9zaW5nXzsgfQorICB2b2lkIHNldF9pc19jb21wb3NpbmcoY29uc3QgYm9vbCBpc19jb21wb3NpbmcpIHsKKyAgICBpc19jb21wb3NpbmdfID0gaXNfY29tcG9zaW5nOworICB9CisKICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbnNob3coKSBjb25zdDsKICAgdm9pZCBzZXRfb25zaG93KGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgZXZlbnRfbGlzdGVuZXIpOwogCkBAIC04Myw2ICs4OCw5IEBACiAgIC8vIElmIHRoZSBrZXlib2FyZCBpcyBzaG93bi4KICAgYm9vbCBzaG93bigpIGNvbnN0OwogCisgIC8vIElmIHRoZSBrZXlib2FyZCBoYXMgc3VnZ2VzdGlvbnMgaW1wbGVtZW50ZWQuCisgIGJvb2wgc3VnZ2VzdGlvbnNfc3VwcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gc3VnZ2VzdGlvbnNfc3VwcG9ydGVkXzsgfQorCiAgIC8vIFRoZSByZWN0YW5nbGUgb2YgdGhlIGtleWJvYXJkIGluIHNjcmVlbiBwaXhlbCBjb29yZGluYXRlcy4KICAgc2NvcGVkX3JlZnB0cjxET01SZWN0PiBib3VuZGluZ19yZWN0KCkgY29uc3Q7CiAKQEAgLTExNywxMSArMTI1LDE0IEBACiAgIHNjcmlwdDo6U2NyaXB0VmFsdWVGYWN0b3J5KiBjb25zdCBzY3JpcHRfdmFsdWVfZmFjdG9yeV87CiAKICAgc3RkOjpzdHJpbmcgZGF0YV87CisgIGJvb2wgaXNfY29tcG9zaW5nXzsKIAogICBpbnQgbmV4dF90aWNrZXRfOwogCiAgIGJvb2wga2VlcF9mb2N1c18gPSBmYWxzZTsKIAorICBib29sIHN1Z2dlc3Rpb25zX3N1cHBvcnRlZF87CisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE9uU2NyZWVuS2V5Ym9hcmQpOwogfTsKIH0gIC8vIG5hbWVzcGFjZSBkb20KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZC5pZGwgYi9zcmMvY29iYWx0L2RvbS9vbl9zY3JlZW5fa2V5Ym9hcmQuaWRsCmluZGV4IGUxNzdlYzcuLmViZTYzMmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZC5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkLmlkbApAQCAtMjQsNyArMjQsOSBAQAogICBQcm9taXNlPHZvaWQ+IGJsdXIoKTsKICAgUHJvbWlzZTx2b2lkPiB1cGRhdGVTdWdnZXN0aW9ucyhzZXF1ZW5jZTxET01TdHJpbmc+IHN1Z2dlc3Rpb25zKTsKICAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gc2hvd247Ci0gIC8vIFRPRE86IEFkZCBoYXNTdWdnZXN0aW9uc0FiaWxpdHkgYm9vbGVhbi4KKyAgLy8gSWYgdGhlIGtleWJvYXJkIGhhcyBzdWdnZXN0aW9ucyBpbXBsZW1lbnRlZC4gSWYgZmFsc2UsIGNhbGxpbmcKKyAgLy8gdXBkYXRlU3VnZ2VzdGlvbnMoKSB3aWxsIHJlc3VsdCBpbiB0aGUgcHJvbWlzZSBiZWluZyBpbW1lZGlhdGVseSByZWplY3RlZC4KKyAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gc3VnZ2VzdGlvbnNTdXBwb3J0ZWQ7CiAKICAgLy8gSWYgdGhlIGtleWJvYXJkIGlzIHNob3duLCByZXR1cm4gYm91bmRpbmcgcmVjdGFuZ2xlIGluIHNjcmVlbiBwaXhlbAogICAvLyBjb29yZGluYXRlcywgb3RoZXJ3aXNlIHJldHVybiBOVUxMLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkX2JyaWRnZS5oIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkX2JyaWRnZS5oCmluZGV4IDVmM2Q3YTMuLmQ1OGMwYWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZF9icmlkZ2UuaAorKysgYi9zcmMvY29iYWx0L2RvbS9vbl9zY3JlZW5fa2V5Ym9hcmRfYnJpZGdlLmgKQEAgLTM1LDYgKzM1LDcgQEAKICAgdmlydHVhbCB2b2lkIFVwZGF0ZVN1Z2dlc3Rpb25zKAogICAgICAgY29uc3Qgc2NyaXB0OjpTZXF1ZW5jZTxzdGQ6OnN0cmluZz4mIHN1Z2dlc3Rpb25zLCBpbnQgdGlja2V0KSA9IDA7CiAgIHZpcnR1YWwgYm9vbCBJc1Nob3duKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgU3VnZ2VzdGlvbnNTdXBwb3J0ZWQoKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxET01SZWN0PiBCb3VuZGluZ1JlY3QoKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgdm9pZCBTZXRLZWVwRm9jdXMoYm9vbCBrZWVwX2ZvY3VzKSA9IDA7CiAgIHZpcnR1YWwgYm9vbCBJc1ZhbGlkVGlja2V0KGludCB0aWNrZXQpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkX3Rlc3QuY2MKaW5kZXggMjA3YmY1NS4uNDBhZjhiZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkX3Rlc3QuY2MKQEAgLTEwMiw2ICsxMDIsMTIgQEAKICAgICBsYXN0X3RpY2tldF8gPSAtMTsKICAgfQogCisgIGJvb2wgU3VnZ2VzdGlvbnNTdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50IGFuZCB0ZXN0IHRoaXMuCisgICAgU0JfTk9USU1QTEVNRU5URUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICB2b2lkIFVwZGF0ZVN1Z2dlc3Rpb25zKGNvbnN0IHNjcmlwdDo6U2VxdWVuY2U8c3RkOjpzdHJpbmc+JiBzdWdnZXN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0KSBvdmVycmlkZSB7CiAgICAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihzdWdnZXN0aW9ucyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vcHNldWRvX2VsZW1lbnQuaAppbmRleCA4NmU0ZDg0Li40OTFjYTdjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BzZXVkb19lbGVtZW50LmgKQEAgLTYwLDcgKzYwLDYgQEAKICAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBtYXRjaGluZ19ydWxlcygpIHsKICAgICByZXR1cm4gJm1hdGNoaW5nX3J1bGVzXzsKICAgfQotICB2b2lkIENsZWFyTWF0Y2hpbmdSdWxlcygpIHsgbWF0Y2hpbmdfcnVsZXNfLmNsZWFyKCk7IH0KIAogICBib29sIGNvbXB1dGVkX3N0eWxlX2ludmFsaWQoKSBjb25zdCB7IHJldHVybiBjb21wdXRlZF9zdHlsZV9pbnZhbGlkXzsgfQogICB2b2lkIHNldF9jb21wdXRlZF9zdHlsZV9pbnZhbGlkKCkgeyBjb21wdXRlZF9zdHlsZV9pbnZhbGlkXyA9IHRydWU7IH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuY2MgYi9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmNjCmluZGV4IDg2YWU4NWIuLjMyZTJjMWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZy5jYwpAQCAtODA3LDcgKzgwNyw3IEBACiAgIC8vIHRoZXkgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgbWF0Y2hpbmcgcnVsZXMgYWZ0ZXIgdGhleSBhcmUgZ2VuZXJhdGVkLgogICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIGVsZW1lbnRfb2xkX21hdGNoaW5nX3J1bGVzID0KICAgICAgIGVsZW1lbnRfZG9jdW1lbnQtPnNjcmF0Y2hwYWRfaHRtbF9lbGVtZW50X21hdGNoaW5nX3J1bGVzKCk7Ci0gICplbGVtZW50X29sZF9tYXRjaGluZ19ydWxlcyA9ICplbGVtZW50LT5tYXRjaGluZ19ydWxlcygpOworICAqZWxlbWVudF9vbGRfbWF0Y2hpbmdfcnVsZXMgPSBzdGQ6Om1vdmUoKmVsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCkpOwogICBlbGVtZW50LT5tYXRjaGluZ19ydWxlcygpLT5jbGVhcigpOwogCiAgIGZvciAoaW50IHR5cGUgPSAwOyB0eXBlIDwga01heFBzZXVkb0VsZW1lbnRUeXBlOyArK3R5cGUpIHsKQEAgLTgxNyw4ICs4MTcsOSBAQAogICAgICAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBvbGRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMgPQogICAgICAgICAgIGVsZW1lbnRfZG9jdW1lbnQtPnNjcmF0Y2hwYWRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMoCiAgICAgICAgICAgICAgIFBzZXVkb0VsZW1lbnRUeXBlKHR5cGUpKTsKLSAgICAgICpvbGRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMgPSAqcHNldWRvX2VsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCk7Ci0gICAgICBwc2V1ZG9fZWxlbWVudC0+Q2xlYXJNYXRjaGluZ1J1bGVzKCk7CisgICAgICAqb2xkX3BzZXVkb19lbGVtZW50X21hdGNoaW5nX3J1bGVzID0KKyAgICAgICAgICBzdGQ6Om1vdmUoKnBzZXVkb19lbGVtZW50LT5tYXRjaGluZ19ydWxlcygpKTsKKyAgICAgIHBzZXVkb19lbGVtZW50LT5tYXRjaGluZ19ydWxlcygpLT5jbGVhcigpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2V4dGVuc2lvbi9wbGF0Zm9ybV9zZXJ2aWNlLmggYi9zcmMvY29iYWx0L2V4dGVuc2lvbi9wbGF0Zm9ybV9zZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkMjVlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZXh0ZW5zaW9uL3BsYXRmb3JtX3NlcnZpY2UuaApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0VYVEVOU0lPTl9QTEFURk9STV9TRVJWSUNFX0hfCisjZGVmaW5lIENPQkFMVF9FWFRFTlNJT05fUExBVEZPUk1fU0VSVklDRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZVByaXZhdGUKKyAgICBDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VQcml2YXRlOwordHlwZWRlZiBDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VQcml2YXRlKiBDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2U7CisKKy8vIFdlbGwtZGVmaW5lZCB2YWx1ZSBmb3IgYW4gaW52YWxpZCB8U2VydmljZXwuCisjZGVmaW5lIGtDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VJbnZhbGlkIFwKKyAgKChDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2UpMCkKKworI2RlZmluZSBrQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlTmFtZSBcCisgICJkZXYuY29iYWx0LmV4dGVuc2lvbi5QbGF0Zm9ybVNlcnZpY2UiCisKKy8vIENoZWNrcyB3aGV0aGVyIGEgfENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZXwgaXMgdmFsaWQuCitzdGF0aWMgU0JfQ19JTkxJTkUgYm9vbCBDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VJc1ZhbGlkKAorICAgIENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZSBzZXJ2aWNlKSB7CisgIHJldHVybiBzZXJ2aWNlICE9IGtDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VJbnZhbGlkOworfQorCisvLyBXaGVuIGEgY2xpZW50IHJlY2VpdmVzIGEgbWVzc2FnZSBmcm9tIGEgc2VydmljZSwgdGhlIHNlcnZpY2Ugd2lsbCBiZSBwYXNzZWQKKy8vIGluIGFzIHRoZSB8Y29udGV4dHwgaGVyZSwgd2l0aCB8ZGF0YXwsIHdoaWNoIGhhcyBsZW5ndGggfGxlbmd0aHwuCit0eXBlZGVmIHZvaWQgKCpSZWNlaXZlTWVzc2FnZUNhbGxiYWNrKSh2b2lkKiBjb250ZXh0LCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbGVuZ3RoKTsKKwordHlwZWRlZiBzdHJ1Y3QgQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlQXBpIHsKKyAgLy8gVGhpcyBuYW1lIHdpbGwgYmUgImRldi5jb2JhbHQuZXh0ZW5zaW9ucy5QbGF0Zm9ybVNlcnZpY2UiLgorICBjb25zdCBjaGFyKiBrTmFtZTsKKyAgdWludDY0X3Qga1ZlcnNpb247CisKKyAgLy8gVGhlIGZpZWxkcyBiZWxvdyB0aGlzIHBvaW50IHdlcmUgYWRkZWQgaW4gdmVyc2lvbiAxIG9yIGxhdGVyLgorCisgIC8vIFJldHVybiB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBoYXMgc2VydmljZSBpbmRpY2F0ZWQgYnkgfG5hbWV8LgorICBib29sICgqSGFzKShjb25zdCBjaGFyKiBuYW1lKTsKKworICAvLyBPcGVuIGFuZCByZXR1cm4gYSBzZXJ2aWNlIGJ5IG5hbWUuCisgIC8vCisgIC8vIHxjb250ZXh0fDogcG9pbnRlciB0byBjb250ZXh0IG9iamVjdCBmb3IgY2FsbGJhY2suCisgIC8vIHxuYW1lfDogbmFtZSBvZiB0aGUgc2VydmljZS4KKyAgLy8gfHJlY2VpdmVfY2FsbGJhY2t8OiBjYWxsYmFjayB0byBydW4gd2hlbiBDb2JhbHQgc2hvdWxkIHJlY2VpdmUgZGF0YS4KKyAgQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlICgqT3BlbikoCisgICAgICB2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBuYW1lLCBSZWNlaXZlTWVzc2FnZUNhbGxiYWNrIHJlY2VpdmVfY2FsbGJhY2spOworCisgIC8vIENsb3NlIHRoZSBzZXJ2aWNlIHBhc3NlZCBpbiBhcyB8c2VydmljZXwuCisgIHZvaWQgKCpDbG9zZSkoQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlIHNlcnZpY2UpOworCisgIC8vIFNlbmQgfGRhdGF8IG9mIGxlbmd0aCB8bGVuZ3RofCB0byB8c2VydmljZXwuIElmIHRoZXJlIGlzIGEgc3luY2hyb25vdXMKKyAgLy8gcmVzcG9uc2UsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdmlhIHZvaWQqIGFuZCB8b3V0cHV0X2xlbmd0aHwgd2lsbCBiZSBzZXQKKyAgLy8gdG8gaXRzIGxlbmd0aC4gVGhlIHJldHVybmVkIHZvaWQqIHdpbGwgYmUgb3duZWQgYnkgdGhlIGNhbGxlciwgYW5kIG11c3QKKyAgLy8gYmUgZGVhbGxvY2F0ZWQgdmlhIFNiTWVtb3J5RGVhbGxvY2F0ZSgpIGJ5IHRoZSBjYWxsZXIgd2hlbiBhcHByb3ByaWF0ZS4KKyAgLy8gSWYgdGhlcmUgaXMgbm8gc3luY2hyb25vdXMgcmVzcG9uc2UsIE5VTEwgd2lsbCBiZSByZXR1cm5lZCBhbmQKKyAgLy8gfG91dHB1dF9sZW5ndGh8IHdpbGwgYmUgMC4gVGhlIHxpbnZhbGlkX3N0YXRlfCB3aWxsIGJlIHNldCB0byB0cnVlIGlmIHRoZQorICAvLyBzZXJ2aWNlIGlzIG5vdCBjdXJyZW50bHkgYWJsZSB0byBhY2NlcHQgZGF0YSwgYW5kIG90aGVyd2lzZSB3aWxsIGJlIHNldCB0bworICAvLyBmYWxzZS4KKyAgdm9pZCogKCpTZW5kKShDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2Ugc2VydmljZSwgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBsZW5ndGgsIHVpbnQ2NF90KiBvdXRwdXRfbGVuZ3RoLCBib29sKiBpbnZhbGlkX3N0YXRlKTsKK30gQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlQXBpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIENPQkFMVF9FWFRFTlNJT05fUExBVEZPUk1fU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjYy5neXAgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjLmd5cAppbmRleCBlYTdhZTYxLi41NDcwOWIxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjLmd5cAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjLmd5cApAQCAtNDAsNiArNDAsOCBAQAogICAgICAgICAnaDV2Y2NfZGVlcF9saW5rX2V2ZW50X3RhcmdldC5jYycsCiAgICAgICAgICdoNXZjY19kZWVwX2xpbmtfZXZlbnRfdGFyZ2V0LmgnLAogICAgICAgICAnaDV2Y2NfZXZlbnRfbGlzdGVuZXJfY29udGFpbmVyLmgnLAorICAgICAgICAnaDV2Y2NfcGxhdGZvcm1fc2VydmljZS5jYycsCisgICAgICAgICdoNXZjY19wbGF0Zm9ybV9zZXJ2aWNlLmgnLAogICAgICAgICAnaDV2Y2NfcnVudGltZS5jYycsCiAgICAgICAgICdoNXZjY19ydW50aW1lLmgnLAogICAgICAgICAnaDV2Y2NfcnVudGltZV9ldmVudF90YXJnZXQuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19wbGF0Zm9ybV9zZXJ2aWNlLmNjIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19wbGF0Zm9ybV9zZXJ2aWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2YwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3BsYXRmb3JtX3NlcnZpY2UuY2MKQEAgLTAsMCArMSwxNzcgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19wbGF0Zm9ybV9zZXJ2aWNlLmgiCisKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3NldHRpbmdzLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGg1dmNjIHsKKworLy8gc3RhdGljCitzY29wZWRfcmVmcHRyPEg1dmNjUGxhdGZvcm1TZXJ2aWNlPiBINXZjY1BsYXRmb3JtU2VydmljZTo6T3BlbigKKyAgICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLCBjb25zdCBzdGQ6OnN0cmluZyBzZXJ2aWNlX25hbWUsCisgICAgY29uc3QgUmVjZWl2ZUNhbGxiYWNrQXJnJiByZWNlaXZlX2NhbGxiYWNrKSB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9FWFRFTlNJT05TX0FQSV9WRVJTSU9OCisgIFNCX0RMT0coV0FSTklORykKKyAgICAgIDw8ICJQbGF0Zm9ybVNlcnZpY2Ugbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiBvZiBTdGFyYm9hcmQuIjsKKyAgcmV0dXJuIE5VTEw7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfRVhURU5TSU9OU19BUElfVkVSU0lPTgorICBEQ0hFQ0soc2V0dGluZ3MpOworICBkb206OkRPTVNldHRpbmdzKiBkb21fc2V0dGluZ3MgPQorICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8ZG9tOjpET01TZXR0aW5ncyo+KHNldHRpbmdzKTsKKyAgYXV0byogZ2xvYmFsX2Vudmlyb25tZW50ID0gZG9tX3NldHRpbmdzLT5nbG9iYWxfZW52aXJvbm1lbnQoKTsKKyAgRENIRUNLKGdsb2JhbF9lbnZpcm9ubWVudCk7CisKKyAgRXh0UGxhdGZvcm1TZXJ2aWNlQXBpKiBwbGF0Zm9ybV9zZXJ2aWNlX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxFeHRQbGF0Zm9ybVNlcnZpY2VBcGkqPigKKyAgICAgICAgICBTYlN5c3RlbUdldEV4dGVuc2lvbihrQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlTmFtZSkpOworICBpZiAoIXBsYXRmb3JtX3NlcnZpY2VfYXBpKSB7CisgICAgU0JfRExPRyhXQVJOSU5HKSA8PCAiUGxhdGZvcm1TZXJ2aWNlIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtLiI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc2NvcGVkX3JlZnB0cjxINXZjY1BsYXRmb3JtU2VydmljZT4gc2VydmljZSA9IG5ldyBINXZjY1BsYXRmb3JtU2VydmljZSgKKyAgICAgIGdsb2JhbF9lbnZpcm9ubWVudCwgcGxhdGZvcm1fc2VydmljZV9hcGksIHJlY2VpdmVfY2FsbGJhY2spOworICBjaGFyKiBzZXJ2aWNlX25hbWVfY19zdHIgPSBuZXcgY2hhcltrTWF4TmFtZUxlbmd0aF07CisgIFNiU3RyaW5nQ29weShzZXJ2aWNlX25hbWVfY19zdHIsIHNlcnZpY2VfbmFtZS5jX3N0cigpLCBrTWF4TmFtZUxlbmd0aCk7CisKKyAgRXh0UGxhdGZvcm1TZXJ2aWNlIHBsYXRmb3JtX3NlcnZpY2UgPSBwbGF0Zm9ybV9zZXJ2aWNlX2FwaS0+T3BlbigKKyAgICAgIHNlcnZpY2UsIHNlcnZpY2VfbmFtZV9jX3N0ciwgJkg1dmNjUGxhdGZvcm1TZXJ2aWNlOjpSZWNlaXZlKTsKKyAgaWYgKCFwbGF0Zm9ybV9zZXJ2aWNlKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc2VydmljZS0+ZXh0X3NlcnZpY2VfID0gcGxhdGZvcm1fc2VydmljZTsKKyAgcmV0dXJuIHNlcnZpY2U7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfRVhURU5TSU9OU19BUElfVkVSU0lPTgorfQorCitINXZjY1BsYXRmb3JtU2VydmljZTo6SDV2Y2NQbGF0Zm9ybVNlcnZpY2UoCisgICAgc2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudCogZW52aXJvbm1lbnQsCisgICAgRXh0UGxhdGZvcm1TZXJ2aWNlQXBpKiBwbGF0Zm9ybV9zZXJ2aWNlX2FwaSwKKyAgICBjb25zdCBSZWNlaXZlQ2FsbGJhY2tBcmcmIHJlY2VpdmVfY2FsbGJhY2spCisgICAgOiBlbnZpcm9ubWVudF8oZW52aXJvbm1lbnQpLAorICAgICAgcGxhdGZvcm1fc2VydmljZV9hcGlfKHBsYXRmb3JtX3NlcnZpY2VfYXBpKSwKKyAgICAgIHJlY2VpdmVfY2FsbGJhY2tfKHRoaXMsIHJlY2VpdmVfY2FsbGJhY2spLAorICAgICAgbWFpbl9tZXNzYWdlX2xvb3BfKGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSksCisgICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1Qod2Vha19wdHJfZmFjdG9yeV8odGhpcykpLAorICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKAorICAgICAgICAgIHdlYWtfdGhpc18od2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSkgeworICBEQ0hFQ0socGxhdGZvcm1fc2VydmljZV9hcGlfKTsKKyAgRENIRUNLKG1haW5fbWVzc2FnZV9sb29wXyk7Cit9CisKK0g1dmNjUGxhdGZvcm1TZXJ2aWNlOjp+SDV2Y2NQbGF0Zm9ybVNlcnZpY2UoKSB7CisgIGlmIChJc09wZW4oKSkgeworICAgIExPRyhXQVJOSU5HKSA8PCAiQ2xvc2luZyBzZXJ2aWNlIGR1ZSB0byBkZXN0cnVjdGlvbiI7CisgICAgQ2xvc2UoKTsKKyAgfQorfQorCisvLyBzdGF0aWMKK2Jvb2wgSDV2Y2NQbGF0Zm9ybVNlcnZpY2U6Okhhcyhjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKSB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9FWFRFTlNJT05TX0FQSV9WRVJTSU9OCisgIERMT0coV0FSTklORykKKyAgICAgIDw8ICJQbGF0Zm9ybVNlcnZpY2Ugbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiBvZiBTdGFyYm9hcmQuIjsKKyAgcmV0dXJuIGZhbHNlOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0VYVEVOU0lPTlNfQVBJX1ZFUlNJT04KKyAgRXh0UGxhdGZvcm1TZXJ2aWNlQXBpKiBwbGF0Zm9ybV9zZXJ2aWNlX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxFeHRQbGF0Zm9ybVNlcnZpY2VBcGkqPigKKyAgICAgICAgICBTYlN5c3RlbUdldEV4dGVuc2lvbihrQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlTmFtZSkpOworICBpZiAoIXBsYXRmb3JtX3NlcnZpY2VfYXBpKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAiUGxhdGZvcm1TZXJ2aWNlIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBwbGF0Zm9ybV9zZXJ2aWNlX2FwaS0+SGFzKHNlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9FWFRFTlNJT05TX0FQSV9WRVJTSU9OCit9CisKK3NjcmlwdDo6SGFuZGxlPHNjcmlwdDo6QXJyYXlCdWZmZXI+IEg1dmNjUGxhdGZvcm1TZXJ2aWNlOjpTZW5kKAorICAgIGNvbnN0IHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6QXJyYXlCdWZmZXI+JiBkYXRhLAorICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAoIUlzT3BlbigpKSB7CisgICAgZG9tOjpET01FeGNlcHRpb246OlJhaXNlKGRvbTo6RE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xvc2VkIHNlcnZpY2Ugc2hvdWxkIG5vdCBTZW5kLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuIHNjcmlwdDo6QXJyYXlCdWZmZXI6Ok5ldyhlbnZpcm9ubWVudF8sIDApOworICB9CisgIHVpbnQ2NF90IG91dHB1dF9sZW5ndGggPSAwOworICBib29sIGludmFsaWRfc3RhdGUgPSAwOworICB2b2lkKiBvdXRwdXRfZGF0YSA9IHBsYXRmb3JtX3NlcnZpY2VfYXBpXy0+U2VuZCgKKyAgICAgIGV4dF9zZXJ2aWNlXywgZGF0YS0+RGF0YSgpLCBkYXRhLT5CeXRlTGVuZ3RoKCksICZvdXRwdXRfbGVuZ3RoLAorICAgICAgJmludmFsaWRfc3RhdGUpOworICBpZiAoaW52YWxpZF9zdGF0ZSkgeworICAgIGRvbTo6RE9NRXhjZXB0aW9uOjpSYWlzZShkb206OkRPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgdW5hYmxlIHRvIGFjY2VwdCBkYXRhIGN1cnJlbnRseS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fc3RhdGUpOworICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShvdXRwdXRfZGF0YSk7CisgICAgcmV0dXJuIHNjcmlwdDo6QXJyYXlCdWZmZXI6Ok5ldyhlbnZpcm9ubWVudF8sIDApOworICB9CisgIGF1dG8gb3V0cHV0X2J1ZmZlciA9CisgICAgICBzY3JpcHQ6OkFycmF5QnVmZmVyOjpOZXcoZW52aXJvbm1lbnRfLCBvdXRwdXRfZGF0YSwgb3V0cHV0X2xlbmd0aCk7CisgIC8vIERlYWxsb2NhdGUgfG91dHB1dF9kYXRhfCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW50byB0aGUgQXJyYXlCdWZmZXIuCisgIFNiTWVtb3J5RGVhbGxvY2F0ZShvdXRwdXRfZGF0YSk7CisgIHJldHVybiBvdXRwdXRfYnVmZmVyOworfQorCisvLyBzdGF0aWMKK3ZvaWQgSDV2Y2NQbGF0Zm9ybVNlcnZpY2U6OlJlY2VpdmUodm9pZCogY29udGV4dCwgdm9pZCogZGF0YSwgdWludDY0X3QgbGVuZ3RoKSB7CisgIERDSEVDSyhjb250ZXh0KSA8PCAiUGxhdGZvcm0gc2hvdWxkIG5vdCBjYWxsIFJlY2VpdmUgd2l0aCBOVUxMIGNvbnRleHQiOworICBzdGF0aWNfY2FzdDxINXZjY1BsYXRmb3JtU2VydmljZSo+KGNvbnRleHQpLT5SZWNlaXZlSW50ZXJuYWwoZGF0YSwgbGVuZ3RoKTsKK30KKwordm9pZCBINXZjY1BsYXRmb3JtU2VydmljZTo6UmVjZWl2ZUludGVybmFsKHZvaWQqIGRhdGEsIHVpbnQ2NF90IGxlbmd0aCkgeworICAvLyBSZWNlaXZlSW50ZXJuYWwgbWF5IGJlIGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KKyAgaWYgKCFtYWluX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICAgIG1haW5fbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmSDV2Y2NQbGF0Zm9ybVNlcnZpY2U6OlJlY2VpdmVJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfdGhpc18sIGRhdGEsIGxlbmd0aCkpOworICAgIHJldHVybjsKKyAgfQorICBEQ0hFQ0sobWFpbl9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBpZiAoIUlzT3BlbigpKSB7CisgICAgTE9HKEVSUk9SKSA8PCAiQ2xvc2VkIHNlcnZpY2UgY2Fubm90IFJlY2VpdmUuIjsKKyAgICByZXR1cm47CisgIH0KKyAgc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpBcnJheUJ1ZmZlcj4gZGF0YV9hcnJheV9idWZmZXI7CisgIGlmIChsZW5ndGgpIHsKKyAgICBkYXRhX2FycmF5X2J1ZmZlciA9IHNjcmlwdDo6QXJyYXlCdWZmZXI6Ok5ldyhlbnZpcm9ubWVudF8sIGRhdGEsIGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgZGF0YV9hcnJheV9idWZmZXIgPSBzY3JpcHQ6OkFycmF5QnVmZmVyOjpOZXcoZW52aXJvbm1lbnRfLCAwKTsKKyAgfQorCisgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SDV2Y2NQbGF0Zm9ybVNlcnZpY2U+JiBzZXJ2aWNlKHRoaXMpOworICByZWNlaXZlX2NhbGxiYWNrXy52YWx1ZSgpLlJ1bihzZXJ2aWNlLCBkYXRhX2FycmF5X2J1ZmZlcik7Cit9CisKK3ZvaWQgSDV2Y2NQbGF0Zm9ybVNlcnZpY2U6OkNsb3NlKCkgeworICBEQ0hFQ0sobWFpbl9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGlmICghSXNPcGVuKCkpIHsKKyAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY2xvc2Ugc2VydmljZSB0aGF0IGlzIG5vdCBvcGVuLiI7CisgICAgcmV0dXJuOworICB9CisKKyAgcGxhdGZvcm1fc2VydmljZV9hcGlfLT5DbG9zZShleHRfc2VydmljZV8pOworICBleHRfc2VydmljZV8gPSBrQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlSW52YWxpZDsKK30KKworYm9vbCBINXZjY1BsYXRmb3JtU2VydmljZTo6SXNPcGVuKCkgeworICByZXR1cm4gQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlSXNWYWxpZChleHRfc2VydmljZV8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgaDV2Y2MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcGxhdGZvcm1fc2VydmljZS5oIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19wbGF0Zm9ybV9zZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyNTM4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcGxhdGZvcm1fc2VydmljZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfSDVWQ0NfSDVWQ0NfUExBVEZPUk1fU0VSVklDRV9IXworI2RlZmluZSBDT0JBTFRfSDVWQ0NfSDVWQ0NfUExBVEZPUk1fU0VSVklDRV9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCisjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9leHRlbnNpb24vcGxhdGZvcm1fc2VydmljZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvYXJyYXlfYnVmZmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgaDV2Y2MgeworCitjbGFzcyBINXZjY1BsYXRmb3JtU2VydmljZSA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CisgcHVibGljOgorICB1c2luZyBFeHRQbGF0Zm9ybVNlcnZpY2UgPSBDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2U7CisgIHVzaW5nIEV4dFBsYXRmb3JtU2VydmljZUFwaSA9IENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZUFwaTsKKworICB1c2luZyBSZWNlaXZlQ2FsbGJhY2sgPSBzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb248dm9pZCgKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SDV2Y2NQbGF0Zm9ybVNlcnZpY2U+JiwKKyAgICAgIGNvbnN0IHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6QXJyYXlCdWZmZXI+Jik+OworICB1c2luZyBSZWNlaXZlQ2FsbGJhY2tBcmcgPSBzY3JpcHQ6OlNjcmlwdFZhbHVlPFJlY2VpdmVDYWxsYmFjaz47CisgIHVzaW5nIFJlY2VpdmVDYWxsYmFja1JlZmVyZW5jZSA9IFJlY2VpdmVDYWxsYmFja0FyZzo6UmVmZXJlbmNlOworCisgIEg1dmNjUGxhdGZvcm1TZXJ2aWNlKHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQqIGVudmlyb25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICBFeHRQbGF0Zm9ybVNlcnZpY2VBcGkqIHBsYXRmb3JtX3NlcnZpY2VfYXBpLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNlaXZlQ2FsbGJhY2tBcmcmIHJlY2VpdmVfY2FsbGJhY2spOworCisgIH5INXZjY1BsYXRmb3JtU2VydmljZSgpOworCisgIHN0YXRpYyBib29sIEhhcyhjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKTsKKworICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxINXZjY1BsYXRmb3JtU2VydmljZT4gT3BlbigKKyAgICAgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MsIGNvbnN0IHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZSwKKyAgICAgIGNvbnN0IFJlY2VpdmVDYWxsYmFja0FyZyYgcmVjZWl2ZV9jYWxsYmFjayk7CisKKyAgc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpBcnJheUJ1ZmZlcj4gU2VuZCgKKyAgICAgIGNvbnN0IHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6QXJyYXlCdWZmZXI+JiBkYXRhLAorICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKworICB2b2lkIENsb3NlKCk7CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKEg1dmNjUGxhdGZvcm1TZXJ2aWNlKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhOYW1lTGVuZ3RoID0gMTAyNDsKKworICB2b2lkIFJlY2VpdmVJbnRlcm5hbCh2b2lkKiBkYXRhLCB1aW50NjRfdCBsZW5ndGgpOworCisgIHN0YXRpYyB2b2lkIFJlY2VpdmUodm9pZCogY29udGV4dCwgdm9pZCogZGF0YSwgdWludDY0X3QgbGVuZ3RoKTsKKworICBib29sIElzT3BlbigpOworCisgIHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQqIGVudmlyb25tZW50XzsKKyAgRXh0UGxhdGZvcm1TZXJ2aWNlQXBpKiBwbGF0Zm9ybV9zZXJ2aWNlX2FwaV87CisgIGNvbnN0IFJlY2VpdmVDYWxsYmFja1JlZmVyZW5jZSByZWNlaXZlX2NhbGxiYWNrXzsKKyAgLy8gVGhlIG1haW4gbWVzc2FnZSBsb29wLgorICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IGNvbnN0IG1haW5fbWVzc2FnZV9sb29wXzsKKworICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxINXZjY1BsYXRmb3JtU2VydmljZT4gd2Vha19wdHJfZmFjdG9yeV87CisgIC8vIFdlIGNvbnN0cnVjdCBhIFdlYWtQdHIgdXBvbiBINXZjY1BsYXRmb3JtU2VydmljZSdzIGNvbnN0cnVjdGlvbiBpbiBvcmRlciB0bworICAvLyBhc3NvY2lhdGUgdGhlIFdlYWtQdHIgd2l0aCB0aGUgY29uc3RydWN0aW5nIHRocmVhZC4KKyAgYmFzZTo6V2Vha1B0cjxINXZjY1BsYXRmb3JtU2VydmljZT4gd2Vha190aGlzXzsKKworICBFeHRQbGF0Zm9ybVNlcnZpY2UgZXh0X3NlcnZpY2VfID0ga0NvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZUludmFsaWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaDV2Y2MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfSDVWQ0NfSDVWQ0NfUExBVEZPUk1fU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19wbGF0Zm9ybV9zZXJ2aWNlLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcGxhdGZvcm1fc2VydmljZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMmE2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcGxhdGZvcm1fc2VydmljZS5pZGwKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitbCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncworXQorCitpbnRlcmZhY2UgSDV2Y2NQbGF0Zm9ybVNlcnZpY2UgeworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZpY2UgZXhpc3RzIG9uIHRoZSBwbGF0Zm9ybSwgZmFsc2Ugb3RoZXJ3aXNlLgorICBzdGF0aWMgYm9vbGVhbiBoYXMoRE9NU3RyaW5nIHNlcnZpY2VfbmFtZSk7CisKKyAgLy8gT3BlbnMgYW5kIHJldHVybnMgYSBzZXJ2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAvLyBSZXR1cm5zIG51bGwgaWYgbm8gc2VydmljZSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgZXhpc3RzLgorICAvLyBEYXRhIG1heSBiZSByZWNlaXZlZCB2aWEgdGhlIHxyZWNlaXZlX2NhbGxiYWNrfCB0aGUgbW9tZW50IGFmdGVyIHRoaXMKKyAgLy8gZnVuY3Rpb24gcmV0dXJucyBub24tbnVsbC4KKyAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHN0YXRpYyBINXZjY1BsYXRmb3JtU2VydmljZT8gb3BlbihET01TdHJpbmcgc2VydmljZV9uYW1lLCBSZWNlaXZlQ2FsbGJhY2sgcmVjZWl2ZV9jYWxsYmFjayk7CisKKyAgLy8gU2VuZHMgdGhlIHNwZWNpZmllZCBkYXRhIHRvIHRoZSBzZXJ2aWNlLiBUaGUgc2VydmljZQorICAvLyBtYXkgb3B0aW9uYWxseSBzeW5jaHJvbm91c2x5IHJldHVybiBkYXRhLiBGb3IgYXN5bmNocm9ub3VzCisgIC8vIHJlc3BvbnNlcyB0aGUgc2VydmljZSBzaG91bGQgdXRpbGl6ZSB0aGUgfHJlY2VpdmVfY2FsbGJhY2t8LgorICAvLyBJZiB0aGUgc2VydmljZSBoYXMgYmVlbiBjbG9zZWQsIHRoZW4ga0ludmFsaWRTdGF0ZUVyciBpcyByYWlzZWQuCisgIC8vIElmIHRoZSBzZXJ2aWNlIGlzIG9wZW4gYnV0IG5vdCBjdXJyZW50bHkgYWJsZSB0byBhY2NlcHQgZGF0YSwgdGhlbgorICAvLyBrSW52YWxpZFN0YXRlRXJyIGlzIHJhaXNlZC4KKyAgW1JhaXNlc0V4Y2VwdGlvbl0gQXJyYXlCdWZmZXI/IHNlbmQoQXJyYXlCdWZmZXIgZGF0YSk7CisKKyAgLy8gQ2xvc2VzIHRoZSBzcGVjaWZpZWQgc2VydmljZS4gIEFmdGVyIGNhbGxpbmcgQ2xvc2UoKSwgaXQgaXMKKyAgLy8gZ3VhcmFudGVlZCB0aGF0IHxyZWNlaXZlX2NhbGxiYWNrfCB3aWxsIG5vIGxvbmdlciBiZSBjYWxsZWQsIGFuZAorICAvLyBzdWJzZXF1ZW50IGNhbGxzIHRvIHNlbmQoKSBhcmUgY29uc2lkZXJlZCBlcnJvcnMuCisgIHZvaWQgY2xvc2UoKTsKK307CisKKy8vIFdoZW4gYSBzZXJ2aWNlIGlzIG9wZW5lZCBhIGNhbGxiYWNrIG11c3QgYmUgcmVnaXN0ZXJlZCB0byBlbmFibGUgcHVzaAorLy8gY29tbXVuaWNhdGlvbnMgZnJvbSB0aGUgc2VydmljZS4gIEEgc2VydmljZSBtYXkgdXNlIHRoZSByZWNlaXZlIGNhbGxiYWNrCisvLyB0byBhc3luY2hyb25vdXNseSByZXNwb25kIHRvIGEgcHJldmlvdXMgU2VuZCgpIGNhbGwuCitjYWxsYmFjayBSZWNlaXZlQ2FsbGJhY2sgPSB2b2lkIChINXZjY1BsYXRmb3JtU2VydmljZSBzZXJ2aWNlLCBBcnJheUJ1ZmZlciBkYXRhKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5jYyBiL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5jYwppbmRleCA2ZDYyNzM5Li41ZjgyNGNmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Rlc2t0b3AuY2MKKysrIGIvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmNjCkBAIC0zMTAsOSArMzEwLDcgQEAKICAgZG9tOjpJbnB1dEV2ZW50SW5pdCBpbnB1dF9ldmVudDsKICAgVXBkYXRlRXZlbnRJbml0KGV2ZW50LCAmaW5wdXRfZXZlbnQpOwogICBpbnB1dF9ldmVudC5zZXRfZGF0YShldmVudC0+aW5wdXRfdGV4dCgpKTsKLSAgLy8gV2UgZG8gbm90IGhhbmRsZSBjb21wb3NpdGlvbiBzZXNzaW9ucyBjdXJyZW50bHksIHNvIGlzQ29tcG9zaW5nIHNob3VsZAotICAvLyBhbHdheXMgYmUgZmFsc2UuCi0gIGlucHV0X2V2ZW50LnNldF9pc19jb21wb3NpbmcoZmFsc2UpOworICBpbnB1dF9ldmVudC5zZXRfaXNfY29tcG9zaW5nKGV2ZW50LT5pc19jb21wb3NpbmcoKSk7CiAgIGlucHV0X2V2ZW50X2NhbGxiYWNrXy5SdW4odHlwZSwgaW5wdXRfZXZlbnQpOwogfQogI2VuZGlmICAvLyBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvYm94LmNjCmluZGV4IDk4ZTM0NmEuLmJkOTc0YmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9ib3guY2MKQEAgLTk1LDYgKzk1LDEyIEBACiAKIEJveDo6fkJveCgpIHsgbGF5b3V0X3N0YXRfdHJhY2tlcl8tPk9uQm94RGVzdHJveWVkKCk7IH0KIAorYm9vbCBCb3g6OklzT3ZlcmZsb3dIaWRkZW4oKSBjb25zdCB7CisgIHJldHVybiBjb21wdXRlZF9zdHlsZSgpLT5vdmVyZmxvdygpID09IGNzc29tOjpLZXl3b3JkVmFsdWU6OkdldEF1dG8oKSB8fAorICAgICAgICAgY29tcHV0ZWRfc3R5bGUoKS0+b3ZlcmZsb3coKSA9PSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRIaWRkZW4oKSB8fAorICAgICAgICAgY29tcHV0ZWRfc3R5bGUoKS0+b3ZlcmZsb3coKSA9PSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRTY3JvbGwoKTsKK30KKwogYm9vbCBCb3g6OklzUG9zaXRpb25lZCgpIGNvbnN0IHsKICAgcmV0dXJuIGNvbXB1dGVkX3N0eWxlKCktPnBvc2l0aW9uKCkgIT0gY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0U3RhdGljKCk7CiB9CkBAIC02MDIsOCArNjA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3JkZXJfbm9kZV9idWlsZGVyLCAmYW5pbWF0ZV9ub2RlX2J1aWxkZXIpOwogICB9CiAKLSAgY29uc3QgYm9vbCBvdmVyZmxvd19oaWRkZW4gPQotICAgICAgY29tcHV0ZWRfc3R5bGUoKS0+b3ZlcmZsb3coKSA9PSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRIaWRkZW4oKTsKKyAgY29uc3QgYm9vbCBvdmVyZmxvd19oaWRkZW4gPSBJc092ZXJmbG93SGlkZGVuKCk7CiAKICAgYm9vbCBvdmVyZmxvd19oaWRkZW5fbmVlZHNfdG9fYmVfYXBwbGllZCA9IG92ZXJmbG93X2hpZGRlbjsKIApAQCAtMTYxNCw3ICsxNjE5LDcgQEAKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgY29udGVudF9ub2RlLAogICAgIEFuaW1hdGVOb2RlOjpCdWlsZGVyKiAvKiBhbmltYXRlX25vZGVfYnVpbGRlciAqLywKICAgICBjb25zdCBtYXRoOjpWZWN0b3IyZEYmIGJvcmRlcl9ub2RlX29mZnNldCkgewotICBEQ0hFQ0tfRVEoY29tcHV0ZWRfc3R5bGUoKS0+b3ZlcmZsb3coKSwgY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0SGlkZGVuKCkpOworICBEQ0hFQ0soSXNPdmVyZmxvd0hpZGRlbigpKTsKIAogICAvLyBUaGUgIm92ZXJmbG93IiBwcm9wZXJ0eSBzcGVjaWZpZXMgd2hldGhlciBhIGJveCBpcyBjbGlwcGVkIHRvIGl0cyBwYWRkaW5nCiAgIC8vIGVkZ2UuICBVc2UgYSByZW5kZXJfdHJlZSB2aWV3cG9ydCBmaWx0ZXIgdG8gaW1wbGVtZW50IGl0LgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94LmggYi9zcmMvY29iYWx0L2xheW91dC9ib3guaAppbmRleCAzOGM4ZGI3Li5jMDg2OWVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9ib3guaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9ib3guaApAQCAtMTkxLDYgKzE5MSwxMSBAQAogICAvLyBEbyBub3QgY29uZnVzZSB3aXRoIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgdGhhdCB0aGUgZWxlbWVudCBtYXkgZXN0YWJsaXNoLgogICB2aXJ0dWFsIExldmVsIEdldExldmVsKCkgY29uc3QgPSAwOwogCisgIC8vIFJldHVybnMgdHJ1ZSBpZiAib3ZlcmZsb3ciIHNob3VsZCBiZSB0cmVhdGVkIGFzIGhpZGRlbi4gVGhpcyBpcyB0cnVlIGZvcgorICAvLyBvdmVyZmxvdyAiYXV0byIsICJoaWRkZW4iLCBhbmQgInNjcm9sbCIuCisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL3Zpc3VmeC5odG1sI292ZXJmbG93CisgIGJvb2wgSXNPdmVyZmxvd0hpZGRlbigpIGNvbnN0OworCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYm94IGlzIHBvc2l0aW9uZWQgKGUuZy4gcG9zaXRpb24gaXMgbm9uLXN0YXRpYyBvcgogICAvLyB0cmFuc2Zvcm0gaXMgbm90IE5vbmUpLiAgSW50dWl0aXZlbHksIHRoaXMgaXMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBkb2VzCiAgIC8vIG5vdCBmb2xsb3cgc3RhbmRhcmQgbGF5b3V0IGZsb3cgcnVsZXMgZm9yIGRldGVybWluaW5nIGl0cyBwb3NpdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveF9nZW5lcmF0b3IuY2MgYi9zcmMvY29iYWx0L2xheW91dC9ib3hfZ2VuZXJhdG9yLmNjCmluZGV4IDA5MDk5MGYuLmQ3YzljMTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveF9nZW5lcmF0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvYm94X2dlbmVyYXRvci5jYwpAQCAtMjg4LDYgKzI4OCw3IEBACiAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprUmV2ZXJzZToKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtSaWdodDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU2Nyb2xsOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1NlcmlmOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1N0YXJ0OgpAQCAtNjAxLDYgKzYwMiw3IEBACiAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprUmV2ZXJzZToKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtSaWdodDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU2Nyb2xsOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1NlcmlmOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1N0YXJ0OgpAQCAtNzUwLDYgKzc1Miw3IEBACiAgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTY3JvbGw6CiAgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU3RhcnQ6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvY29udGFpbmVyX2JveC5jYwppbmRleCBjNzBjMjkwLi5lYzllYjM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2NvbnRhaW5lcl9ib3guY2MKQEAgLTE1Miw4ICsxNTIsNyBAQAogICAvLyAgIDIuIFN0YWNraW5nIGNvbnRleHQgY2hpbGRyZW4gY29udGFpbmVkIHdpdGhpbiB0aGlzIG92ZXJmbG93IGhpZGRlbgogICAvLyAgICAgIGNvbnRhaW5lciBhcmUgcG90ZW50aWFsbHkgbW92aW5nIHRvIHRoZSBzcGxpdCBzaWJsaW5nIG92ZXJmbG93IGhpZGRlbgogICAvLyAgICAgIGNvbnRhaW5lci4KLSAgaWYgKEhhc1N0YWNraW5nQ29udGV4dENoaWxkcmVuKCkgfHwKLSAgICAgIGNvbXB1dGVkX3N0eWxlKCktPm92ZXJmbG93KCkgPT0gY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0SGlkZGVuKCkpIHsKKyAgaWYgKEhhc1N0YWNraW5nQ29udGV4dENoaWxkcmVuKCkgfHwgSXNPdmVyZmxvd0hpZGRlbigpKSB7CiAgICAgLy8gV2FsayB1cCB0aGUgdHJlZSB1bnRpbCB0aGUgbmVhcmVzdCBzdGFja2luZyBjb250ZXh0IGlzIGZvdW5kLiBJZiB0aGlzIGJveAogICAgIC8vIGlzIGEgc3RhY2tpbmcgY29udGV4dCwgdGhlbiBpdCB3aWxsIGJlIHVzZWQuCiAgICAgQ29udGFpbmVyQm94KiBuZWFyZXN0X3N0YWNraW5nX2NvbnRleHQgPSB0aGlzOwpAQCAtNTc0LDggKzU3Myw3IEBACiAgIE92ZXJmbG93SGlkZGVuSW5mbyYgb3ZlcmZsb3dfaGlkZGVuX2luZm8gPSBvdmVyZmxvd19oaWRkZW5fc3RhY2tfLmJhY2soKTsKIAogICBDb250YWluZXJCb3gqIGNvbnRhaW5pbmdfYmxvY2sgPSBvdmVyZmxvd19oaWRkZW5faW5mby5jb250YWluaW5nX2Jsb2NrOwotICBEQ0hFQ0tfRVEoY29udGFpbmluZ19ibG9jay0+Y29tcHV0ZWRfc3R5bGUoKS0+b3ZlcmZsb3coKSwKLSAgICAgICAgICAgIGNzc29tOjpLZXl3b3JkVmFsdWU6OkdldEhpZGRlbigpKTsKKyAgRENIRUNLKGNvbnRhaW5pbmdfYmxvY2stPklzT3ZlcmZsb3dIaWRkZW4oKSk7CiAKICAgLy8gRGV0ZXJtaW5lIHRoZSBvZmZzZXQgZnJvbSB0aGUgY2hpbGQgY29udGFpbmVyIHRvIHRoaXMgY29udGFpbmluZyBibG9jaydzCiAgIC8vIGJvcmRlciBib3guCkBAIC03NjIsOCArNzYwLDcgQEAKIAogICAgIGJvb2wgaGFzX2Fic29sdXRlX3Bvc2l0aW9uID0KICAgICAgICAgY29tcHV0ZWRfc3R5bGUoKS0+cG9zaXRpb24oKSA9PSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRBYnNvbHV0ZSgpOwotICAgIGJvb2wgaGFzX292ZXJmbG93X2hpZGRlbiA9Ci0gICAgICAgIGNvbXB1dGVkX3N0eWxlKCktPm92ZXJmbG93KCkgPT0gY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0SGlkZGVuKCk7CisgICAgYm9vbCBoYXNfb3ZlcmZsb3dfaGlkZGVuID0gSXNPdmVyZmxvd0hpZGRlbigpOwogCiAgICAgc3RhY2tpbmdfY29udGV4dF9jb250YWluZXJfYm94X3N0YWNrLT5wdXNoX2JhY2soCiAgICAgICAgIFN0YWNraW5nQ29udGV4dENvbnRhaW5lckJveEluZm8oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC91c2VkX3N0eWxlLmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvdXNlZF9zdHlsZS5jYwppbmRleCAzMDYxYjAzLi5mODNmNzg5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC91c2VkX3N0eWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGUuY2MKQEAgLTI4Miw2ICsyODIsNyBAQAogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1JldmVyc2U6CiAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmOgorICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTdGFydDoKQEAgLTM3Miw2ICszNzMsNyBAQAogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1JlcGVhdDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1JpZ2h0OgorICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTdGFydDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTdGF0aWM6CkBAIC0xMTgyLDYgKzExODQsNyBAQAogICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1JldmVyc2U6CiAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmOgorICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1Njcm9sbDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTdGFydDoKQEAgLTEzNjcsNiArMTM3MCw3IEBACiAgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtSZXZlcnNlOgogICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprUmlnaHQ6CiAgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTYW5zU2VyaWY6CisgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTY3JvbGw6CiAgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTZXJpZjoKICAgICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1NvbGlkOgogICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU3RhcnQ6CkBAIC0xNDM5LDYgKzE0NDMsNyBAQAogICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprUmV2ZXJzZToKICAgICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1JpZ2h0OgogICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU2Fuc1NlcmlmOgorICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU2Nyb2xsOgogICAgICAgY2FzZSBjc3NvbTo6S2V5d29yZFZhbHVlOjprU2VyaWY6CiAgICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtTb2xpZDoKICAgICAgIGNhc2UgY3Nzb206OktleXdvcmRWYWx1ZTo6a1N0YXJ0OgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctYXV0by1kaXYtd2l0aC1wb3NpdGlvbi1hYnNvbHV0ZS1jaGlsZHJlbi1leHBlY3RlZC5wbmcgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLWRpdi13aXRoLXBvc2l0aW9uLWFic29sdXRlLWNoaWxkcmVuLWV4cGVjdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk3MTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctYXV0by1kaXYtd2l0aC1wb3NpdGlvbi1hYnNvbHV0ZS1jaGlsZHJlbi1leHBlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctYXV0by1kaXYtd2l0aC1wb3NpdGlvbi1hYnNvbHV0ZS1jaGlsZHJlbi5odG1sIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctYXV0by1kaXYtd2l0aC1wb3NpdGlvbi1hYnNvbHV0ZS1jaGlsZHJlbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2JkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLWRpdi13aXRoLXBvc2l0aW9uLWFic29sdXRlLWNoaWxkcmVuLmh0bWwKQEAgLTAsMCArMSw0NCBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzwhLS0KKyB8IE92ZXJmbG93IGF1dG8gZGl2IHdpdGggcG9zaXRpb24gYWJzb2x1dGUgY2hpbGRyZW4uCisgfCBPbmx5IHBhcnRpYWwgb2YgdGV4dCBpbiB0aGUgZmlyc3QgJ3JlZCcgY2xhc3MgZGlzcGxheWVkIGFuZCBhIGdyZWVuIHJlY3RhbmdsZQorIHwgYm94IGlzIGFsc28gZGlzcGxheWVkIGlmIHRoaXMgdGVzdCBwYXNzZWQuCisgfCBSZXN1bHRzIHNob3VsZCBiZSBzaW1pbGFyIHRvIG92ZXJmbG93IGhpZGRlbi4KKyB8ICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL3Zpc3VmeC5odG1sCisgLS0+Cis8aGVhZD4KKyAgPHN0eWxlPgorICAgIGJvZHkgeworICAgICAgZm9udC1mYW1pbHk6IFJvYm90bzsKKyAgICAgIGZvbnQtc2l6ZTogMTZweDsKKyAgICB9CisKKyAgICAucmVkIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGRjAwMDA7CisgICAgfQorCisgICAgLm92ZXJmbG93IHsKKyAgICAgIHdpZHRoOiAyMDBweDsKKyAgICAgIGhlaWdodDogMjBweDsKKyAgICAgIG92ZXJmbG93OiBhdXRvOworICAgIH0KKworICAgIC5wb3NpdGlvbmVkIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGxlZnQ6IDE1MHB4OworICAgICAgdG9wOiAxMDBweDsKKyAgICAgIHdpZHRoOiAxMDBweDsKKyAgICAgIGhlaWdodDogMTAwcHg7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDQzAwOworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2IGNsYXNzPSJvdmVyZmxvdyI+CisgICAgPGRpdiBjbGFzcz0icmVkIj4gRGVtb25zdHJhdGUgb3ZlcmZsb3cgYXV0byBwcm9wZXJ0eSB2YWx1ZS48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSdyZWQnPiBUaGlzIGxpbmUgaXMgaW52aXNpYmxlLiA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSdwb3NpdGlvbmVkJz48L2Rpdj4KKyAgPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLWV4cGVjdGVkLnBuZyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LWF1dG8tZXhwZWN0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWJjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLWZyb20tbm9uLXBvc2l0aW9uZWQtY29udGFpbmluZy1ibG9jay1zaG91bGQtYWZmZWN0LXJlbGF0aXZlLXBvc2l0aW9uZWQtY2hpbGQtZXhwZWN0ZWQucG5nIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctYXV0by1mcm9tLW5vbi1wb3NpdGlvbmVkLWNvbnRhaW5pbmctYmxvY2stc2hvdWxkLWFmZmVjdC1yZWxhdGl2ZS1wb3NpdGlvbmVkLWNoaWxkLWV4cGVjdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzJlYWNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctYXV0by1mcm9tLW5vbi1wb3NpdGlvbmVkLWNvbnRhaW5pbmctYmxvY2stc2hvdWxkLWFmZmVjdC1yZWxhdGl2ZS1wb3NpdGlvbmVkLWNoaWxkLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLWZyb20tbm9uLXBvc2l0aW9uZWQtY29udGFpbmluZy1ibG9jay1zaG91bGQtYWZmZWN0LXJlbGF0aXZlLXBvc2l0aW9uZWQtY2hpbGQuaHRtbCBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LWF1dG8tZnJvbS1ub24tcG9zaXRpb25lZC1jb250YWluaW5nLWJsb2NrLXNob3VsZC1hZmZlY3QtcmVsYXRpdmUtcG9zaXRpb25lZC1jaGlsZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNGQ3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLWZyb20tbm9uLXBvc2l0aW9uZWQtY29udGFpbmluZy1ibG9jay1zaG91bGQtYWZmZWN0LXJlbGF0aXZlLXBvc2l0aW9uZWQtY2hpbGQuaHRtbApAQCAtMCwwICsxLDM0IEBACis8IURPQ1RZUEUgaHRtbD4KKzwhLS0KKyB8ICJvdmVyZmxvdyIgcHJvcGVydHkgYWZmZWN0cyB0aGUgY2xpcHBpbmcgb2YgYWxsIG9mIHRoZSBlbGVtZW50J3MgY29udGVudAorIHwgZXhjZXB0IGFueSBkZXNjZW5kYW50IGVsZW1lbnRzIHdob3NlIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhlIHZpZXdwb3J0IG9yCisgfCBhbiBhbmNlc3RvciBvZiB0aGUgZWxlbWVudC4KKyB8IFJlc3VsdHMgc2hvdWxkIGJlIHNpbWlsYXIgdG8gb3ZlcmZsb3cgaGlkZGVuLgorIHwgICBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvdmlzdWZ4Lmh0bWwjb3ZlcmZsb3cKKyAtLT4KKzxodG1sPgorPGhlYWQ+CisgIDxzdHlsZT4KKyAgICAub3V0ZXIgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDYzLCA4MSwgMTgxKTsKKyAgICAgIG92ZXJmbG93OiBhdXRvOworICAgICAgd2lkdGg6IDEwMHB4OworICAgICAgaGVpZ2h0OiAxMDBweDsKKyAgICAgIG1hcmdpbi1ib3R0b206IDEwMHB4OworICAgIH0KKyAgICAuaW5uZXIgeworICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzIxOTZmMzsKKyAgICAgIHdpZHRoOiAxMDBweDsKKyAgICAgIGhlaWdodDogMTAwcHg7CisgICAgICBsZWZ0OiA1MHB4OworICAgICAgdG9wOiA1MHB4OworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2IGNsYXNzPSJvdXRlciI+CisgICAgPGRpdiBjbGFzcz0iaW5uZXIiPjwvZGl2PgorICA8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LWF1dG8tdHJhbnNmb3JtLWV4cGVjdGVkLnBuZyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LWF1dG8tdHJhbnNmb3JtLWV4cGVjdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjNjMWRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctYXV0by10cmFuc2Zvcm0tZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LWF1dG8tdHJhbnNmb3JtLmh0bWwgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLXRyYW5zZm9ybS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTVjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLXRyYW5zZm9ybS5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8IS0tCisgfCBBcHBseSB0cmFuc2Zvcm0gdG8gb3ZlcmZsb3cgYXV0by4KKyB8IFJlc3VsdHMgc2hvdWxkIGJlIHNpbWlsYXIgdG8gb3ZlcmZsb3cgaGlkZGVuLgorIHwgICBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvdmlzdWZ4Lmh0bWwKKyAtLT4KKzxoZWFkPgorICA8c3R5bGU+CisgICAgYm9keSB7CisgICAgICBmb250LWZhbWlseTogUm9ib3RvOworICAgICAgZm9udC1zaXplOiAxNnB4OworICAgIH0KKworICAgIC50cmFuc2Zvcm0geworICAgICAgd2lkdGg6IDU1MHB4OworICAgICAgaGVpZ2h0OiAyMHB4OworICAgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCwgMTI4LCAxMjgpOworICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwcHgpIHRyYW5zbGF0ZVkoNTBweCkgcm90YXRlKDdkZWcpOworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2IGNsYXNzPSJ0cmFuc2Zvcm0iPgorICAgIDxkaXY+IEFwcGx5IHRyYW5zZm9ybSB0byBvdmVyZmxvdyBhdXRvLiA8L2Rpdj4KKyAgICA8ZGl2PiBUaGlzIGxpbmUgaXMgaW52aXNpYmxlLiA8L2Rpdj4KKyAgPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLmh0bWwgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1hdXRvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyYTNmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LWF1dG8uaHRtbApAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPCEtLQorIHwgRGVtb25zdHJhdGUgb3ZlcmZsb3cgYXV0by4KKyB8IFJlc3VsdHMgc2hvdWxkIGJlIHNpbWlsYXIgdG8gb3ZlcmZsb3cgaGlkZGVuLgorIHwgICBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvdmlzdWZ4Lmh0bWwKKyAtLT4KKzxoZWFkPgorICA8c3R5bGU+CisgICAgYm9keSB7CisgICAgICBmb250LWZhbWlseTogUm9ib3RvOworICAgICAgZm9udC1zaXplOiAxNnB4OworICAgIH0KKworICAgIC5yZWQgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGMDAwMDsKKyAgICB9CisKKyAgICAub3ZlcmZsb3cgeworICAgICAgd2lkdGg6IDIwMHB4OworICAgICAgaGVpZ2h0OiAyMHB4OworICAgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgfQorICA8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgIDxkaXYgY2xhc3M9Im92ZXJmbG93Ij4KKyAgICA8ZGl2IGNsYXNzPSJyZWQiPiBEZW1vbnN0cmF0ZSBvdmVyZmxvdyBhdXRvIHByb3BlcnR5IHZhbHVlLjwvZGl2PgorICAgIDxkaXYgY2xhc3M9J3JlZCc+IFRoaXMgbGluZSBpcyBpbnZpc2libGUuIDwvZGl2PgorICA8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC1leHBlY3RlZC5wbmcgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1zY3JvbGwtZXhwZWN0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTBmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1zY3JvbGwtZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC1zaG91bGQtYWZmZWN0LWRlc2NlbmRhbnRzLXdpdGgtei1pbmRleC1leHBlY3RlZC5wbmcgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1zY3JvbGwtc2hvdWxkLWFmZmVjdC1kZXNjZW5kYW50cy13aXRoLXotaW5kZXgtZXhwZWN0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjQ0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1zY3JvbGwtc2hvdWxkLWFmZmVjdC1kZXNjZW5kYW50cy13aXRoLXotaW5kZXgtZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC1zaG91bGQtYWZmZWN0LWRlc2NlbmRhbnRzLXdpdGgtei1pbmRleC5odG1sIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctc2Nyb2xsLXNob3VsZC1hZmZlY3QtZGVzY2VuZGFudHMtd2l0aC16LWluZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzMmQzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC1zaG91bGQtYWZmZWN0LWRlc2NlbmRhbnRzLXdpdGgtei1pbmRleC5odG1sCkBAIC0wLDAgKzEsMTAzIEBACis8IURPQ1RZUEUgaHRtbD4KKzwhLS0KKyB8ICJvdmVyZmxvdyIgcHJvcGVydHkgYWZmZWN0cyB0aGUgY2xpcHBpbmcgb2YgYWxsIG9mIHRoZSBlbGVtZW50J3MgY29udGVudAorIHwgZXhjZXB0IGFueSBkZXNjZW5kYW50IGVsZW1lbnRzIHdob3NlIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhlIHZpZXdwb3J0IG9yCisgfCBhbiBhbmNlc3RvciBvZiB0aGUgZWxlbWVudC4KKyB8IFJlc3VsdHMgc2hvdWxkIGJlIHNpbWlsYXIgdG8gb3ZlcmZsb3cgaGlkZGVuLgorIHwgICBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvdmlzdWZ4Lmh0bWwjb3ZlcmZsb3cKKyAtLT4KKzxodG1sPgorPGhlYWQ+CisgIDxzdHlsZT4KKyAgICAub3V0ZXItY29tbW9uIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsIDgxLCAxODEsIDAuNSk7CisgICAgICB3aWR0aDogMTAwcHg7CisgICAgICBoZWlnaHQ6IDEwMHB4OworICAgIH0KKyAgICAub3V0ZXItMSB7CisgICAgICBvdmVyZmxvdzogc2Nyb2xsOworICAgICAgbWFyZ2luLWJvdHRvbTogMzBweDsKKyAgICB9CisgICAgLm91dGVyLTIgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKKyAgICB9CisgICAgLm91dGVyLTMgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgbGVmdDogMTQwcHg7CisgICAgICB0b3A6IDBweDsKKyAgICB9CisgICAgLm91dGVyLTQgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKKyAgICAgIGxlZnQ6IDE0MHB4OworICAgIH0KKyAgICAuaW5uZXItY29tbW9uIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIHotaW5kZXg6IC0xOworICAgICAgd2lkdGg6IDUwcHg7CisgICAgICBoZWlnaHQ6IDUwcHg7CisgICAgfQorICAgIC5pbm5lci0xIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICM3QkFBRjc7CisgICAgICBsZWZ0OiAyNXB4OworICAgICAgdG9wOiAyNXB4OworICAgIH0KKyAgICAuaW5uZXItMi1jb250YWluZXIgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKKyAgICAgIHdpZHRoOiAyNXB4OworICAgICAgaGVpZ2h0OiA1MHB4OworICAgICAgbGVmdDogMjVweDsKKyAgICAgIHRvcDogNzVweDsKKyAgICB9CisgICAgLmlubmVyLTIgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzMzNjdENjsKKyAgICB9CisgICAgLmlubmVyLTMgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzU3QkI4QTsKKyAgICAgIGxlZnQ6IDc1cHg7CisgICAgICB0b3A6IDI1cHg7CisgICAgfQorICAgIC5pbm5lci00IHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwQjgwNDM7CisgICAgICBsZWZ0OiA3NXB4OworICAgICAgdG9wOiA3NXB4OworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2IGNsYXNzPSJvdXRlci1jb21tb24gb3V0ZXItMSI+CisgICAgPGRpdiBjbGFzcz0iaW5uZXItY29tbW9uIGlubmVyLTEiPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImlubmVyLTItY29udGFpbmVyIj4KKyAgICAgIDxkaXYgY2xhc3M9ImlubmVyLWNvbW1vbiBpbm5lci0yIj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJpbm5lci1jb21tb24gaW5uZXItMyI+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iaW5uZXItY29tbW9uIGlubmVyLTQiPjwvZGl2PgorICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ib3V0ZXItY29tbW9uIG91dGVyLTIiPgorICAgIDxkaXYgY2xhc3M9ImlubmVyLWNvbW1vbiBpbm5lci0xIj48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJpbm5lci0yLWNvbnRhaW5lciI+CisgICAgICA8ZGl2IGNsYXNzPSJpbm5lci1jb21tb24gaW5uZXItMiI+PC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iaW5uZXItY29tbW9uIGlubmVyLTMiPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImlubmVyLWNvbW1vbiBpbm5lci00Ij48L2Rpdj4KKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9Im91dGVyLWNvbW1vbiBvdXRlci0zIj4KKyAgICA8ZGl2IGNsYXNzPSJpbm5lci1jb21tb24gaW5uZXItMSI+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iaW5uZXItMi1jb250YWluZXIiPgorICAgICAgPGRpdiBjbGFzcz0iaW5uZXItY29tbW9uIGlubmVyLTIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImlubmVyLWNvbW1vbiBpbm5lci0zIj48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJpbm5lci1jb21tb24gaW5uZXItNCI+PC9kaXY+CisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJvdXRlci1jb21tb24gb3V0ZXItNCI+CisgICAgPGRpdiBjbGFzcz0iaW5uZXItY29tbW9uIGlubmVyLTEiPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImlubmVyLTItY29udGFpbmVyIj4KKyAgICAgIDxkaXYgY2xhc3M9ImlubmVyLWNvbW1vbiBpbm5lci0yIj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJpbm5lci1jb21tb24gaW5uZXItMyI+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iaW5uZXItY29tbW9uIGlubmVyLTQiPjwvZGl2PgorICA8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC10cmFuc2Zvcm0tZXhwZWN0ZWQucG5nIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctc2Nyb2xsLXRyYW5zZm9ybS1leHBlY3RlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzYzFkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC10cmFuc2Zvcm0tZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC10cmFuc2Zvcm0uaHRtbCBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC10cmFuc2Zvcm0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2YxOTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLTEtb3ZlcmZsb3ctc2Nyb2xsLXRyYW5zZm9ybS5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8IS0tCisgfCBBcHBseSB0cmFuc2Zvcm0gdG8gb3ZlcmZsb3cgc2Nyb2xsLgorIHwgUmVzdWx0cyBzaG91bGQgYmUgc2ltaWxhciB0byBvdmVyZmxvdyBoaWRkZW4uCisgfCAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMS92aXN1ZnguaHRtbAorIC0tPgorPGhlYWQ+CisgIDxzdHlsZT4KKyAgICBib2R5IHsKKyAgICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87CisgICAgICBmb250LXNpemU6IDE2cHg7CisgICAgfQorCisgICAgLnRyYW5zZm9ybSB7CisgICAgICB3aWR0aDogNTUwcHg7CisgICAgICBoZWlnaHQ6IDIwcHg7CisgICAgICBvdmVyZmxvdzogc2Nyb2xsOworICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDAsIDEyOCwgMTI4KTsKKyAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1MHB4KSB0cmFuc2xhdGVZKDUwcHgpIHJvdGF0ZSg3ZGVnKTsKKyAgICB9CisgIDwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGRpdiBjbGFzcz0idHJhbnNmb3JtIj4KKyAgICA8ZGl2PiBBcHBseSB0cmFuc2Zvcm0gdG8gb3ZlcmZsb3cgc2Nyb2xsLiA8L2Rpdj4KKyAgICA8ZGl2PiBUaGlzIGxpbmUgaXMgaW52aXNpYmxlLiA8L2Rpdj4KKyAgPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1zY3JvbGwuaHRtbCBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS0xLW92ZXJmbG93LXNjcm9sbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTAyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtMS1vdmVyZmxvdy1zY3JvbGwuaHRtbApAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPCEtLQorIHwgRGVtb25zdHJhdGUgb3ZlcmZsb3cgc2Nyb2xsLgorIHwgUmVzdWx0cyBzaG91bGQgYmUgc2ltaWxhciB0byBvdmVyZmxvdyBoaWRkZW4uCisgfCAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMS92aXN1ZnguaHRtbAorIC0tPgorPGhlYWQ+CisgIDxzdHlsZT4KKyAgICBib2R5IHsKKyAgICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87CisgICAgICBmb250LXNpemU6IDE2cHg7CisgICAgfQorCisgICAgLnJlZCB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkYwMDAwOworICAgIH0KKworICAgIC5vdmVyZmxvdyB7CisgICAgICB3aWR0aDogMjAwcHg7CisgICAgICBoZWlnaHQ6IDIwcHg7CisgICAgICBvdmVyZmxvdzogc2Nyb2xsOworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2IGNsYXNzPSJvdmVyZmxvdyI+CisgICAgPGRpdiBjbGFzcz0icmVkIj4gRGVtb25zdHJhdGUgb3ZlcmZsb3cgc2Nyb2xsIHByb3BlcnR5IHZhbHVlLjwvZGl2PgorICAgIDxkaXYgY2xhc3M9J3JlZCc+IFRoaXMgbGluZSBpcyBpbnZpc2libGUuIDwvZGl2PgorICA8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS1hYnNvbHV0ZWx5LXBvc2l0aW9uZWQtY2hpbGRyZW4tb2Ytb3ZlcmZsb3ctc2Nyb2xsLWV4cGVjdGVkLnBuZyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS1hYnNvbHV0ZWx5LXBvc2l0aW9uZWQtY2hpbGRyZW4tb2Ytb3ZlcmZsb3ctc2Nyb2xsLWV4cGVjdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQxYTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS8xMS0xLWFic29sdXRlbHktcG9zaXRpb25lZC1jaGlsZHJlbi1vZi1vdmVyZmxvdy1zY3JvbGwtZXhwZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvMTEtMS1hYnNvbHV0ZWx5LXBvc2l0aW9uZWQtY2hpbGRyZW4tb2Ytb3ZlcmZsb3ctc2Nyb2xsLmh0bWwgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtYWJzb2x1dGVseS1wb3NpdGlvbmVkLWNoaWxkcmVuLW9mLW92ZXJmbG93LXNjcm9sbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzllMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xLzExLTEtYWJzb2x1dGVseS1wb3NpdGlvbmVkLWNoaWxkcmVuLW9mLW92ZXJmbG93LXNjcm9sbC5odG1sCkBAIC0wLDAgKzEsMzcgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8IS0tCisgfCBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQgY2hpbGRyZW4gb2Ygb3ZlcmZsb3c6IHNjcm9sbC4KKyB8IFJlc3VsdHMgc2hvdWxkIGJlIHNpbWlsYXIgdG8gb3ZlcmZsb3cgaGlkZGVuLgorIHwgICBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvdmlzdWZ4Lmh0bWwKKyAtLT4KKzxoZWFkPgorICA8c3R5bGU+CisgICAgYm9keSB7CisgICAgICBmb250LWZhbWlseTogUm9ib3RvOworICAgICAgZm9udC1zaXplOiAxNnB4OworICAgIH0KKworICAgIC5vdmVyZmxvdyB7CisgICAgICBvdmVyZmxvdzogc2Nyb2xsOworICAgICAgd2lkdGg6IDhlbTsKKyAgICAgIGhlaWdodDogOGVtOworICAgIH0KKworICAgIC5wb3NpdGlvbmVkIHsKKyAgICAgIGNvbG9yOiAjRkZGRkZGOworICAgICAgYmFja2dyb3VuZDogIzAwQ0MwMDsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIHRvcDogNWVtOworICAgICAgbGVmdDogNWVtOworICAgICAgd2lkdGg6IDVlbTsKKyAgICAgIGhlaWdodDogNWVtOworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2IGNsYXNzPSJvdmVyZmxvdyI+CisgICAgPGRpdiBjbGFzcz0icG9zaXRpb25lZCI+UEFTUzwvZGl2PgorICA8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvbGF5b3V0X3Rlc3RzLnR4dCBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2Nzcy0yLTEvbGF5b3V0X3Rlc3RzLnR4dAppbmRleCAwNWNmNmY3Li5iOWM3MzQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jc3MtMi0xL2xheW91dF90ZXN0cy50eHQKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY3NzLTItMS9sYXlvdXRfdGVzdHMudHh0CkBAIC02NSw2ICs2NSwxMCBAQAogMTAtOC1tYXJnaW4tYm94LXNob3VsZC1iZS11c2VkLWZvci12ZXJ0aWNhbC1hbGlnbi13aXRoLW1vc3QtYm94ZXMKIDEwLTgtdmVydGljYWwtYWxpZ24tdG9wLWFuZC1ib3R0b20tYWZmZWN0LWhlaWdodC1hbmQtYmFzZWxpbmUKIDExLTEtMS1vdmVyZmxvdy1mcm9tLW5vbi1wb3NpdGlvbmVkLWNvbnRhaW5pbmctYmxvY2stc2hvdWxkLWFmZmVjdC1yZWxhdGl2ZS1wb3NpdGlvbmVkLWNoaWxkCisxMS0xLTEtb3ZlcmZsb3ctYXV0bworMTEtMS0xLW92ZXJmbG93LWF1dG8tZGl2LXdpdGgtcG9zaXRpb24tYWJzb2x1dGUtY2hpbGRyZW4KKzExLTEtMS1vdmVyZmxvdy1hdXRvLWZyb20tbm9uLXBvc2l0aW9uZWQtY29udGFpbmluZy1ibG9jay1zaG91bGQtYWZmZWN0LXJlbGF0aXZlLXBvc2l0aW9uZWQtY2hpbGQKKzExLTEtMS1vdmVyZmxvdy1hdXRvLXRyYW5zZm9ybQogMTEtMS0xLW92ZXJmbG93LWhpZGRlbgogMTEtMS0xLW92ZXJmbG93LWhpZGRlbi1hbmQtb3BhY2l0eQogMTEtMS0xLW92ZXJmbG93LWhpZGRlbi1hbmQtcG9zaXRpb24tYWJzb2x1dGUtZGl2LXdpdGgtcG9zaXRpb24tYWJzb2x1dGUtY2hpbGRyZW4KQEAgLTc1LDEyICs3OSwxNiBAQAogMTEtMS0xLW92ZXJmbG93LWhpZGRlbi1tYXNrcy1wYWRkaW5nLWJveC1vbmx5CiAxMS0xLTEtb3ZlcmZsb3ctaGlkZGVuLXRyYW5zZm9ybQogMTEtMS0xLW92ZXJmbG93LWhpZGRlbi10cmFuc2xhdGUKKzExLTEtMS1vdmVyZmxvdy1zY3JvbGwKKzExLTEtMS1vdmVyZmxvdy1zY3JvbGwtc2hvdWxkLWFmZmVjdC1kZXNjZW5kYW50cy13aXRoLXotaW5kZXgKKzExLTEtMS1vdmVyZmxvdy1zY3JvbGwtdHJhbnNmb3JtCiAxMS0xLTEtb3ZlcmZsb3ctc2hvdWxkLWFmZmVjdC1kZXNjZW5kYW50cy13aXRoLXotaW5kZXgKIDExLTEtMS1vdmVyZmxvdy1zaG91bGQtbm90LWFmZmVjdC1kZXNjZW5kYW50cy1jb250YWluZWQtaW4tYW5vdGhlci1ibG9jawogMTEtMS0xLW92ZXJmbG93LXZpc2libGUKIDExLTEtYWJzb2x1dGVseS1wb3NpdGlvbmVkLWNoaWxkcmVuLW9mLW92ZXJmbG93LWhpZGRlbgogMTEtMS1hYnNvbHV0ZWx5LXBvc2l0aW9uZWQtY2hpbGRyZW4tb2Ytb3ZlcmZsb3ctaGlkZGVuLXRvLWxlZnQKIDExLTEtYWJzb2x1dGVseS1wb3NpdGlvbmVkLWNoaWxkcmVuLW9mLW92ZXJmbG93LWhpZGRlbi10by1yaWdodAorMTEtMS1hYnNvbHV0ZWx5LXBvc2l0aW9uZWQtY2hpbGRyZW4tb2Ytb3ZlcmZsb3ctc2Nyb2xsCiAxMS0yLXZpc2liaWxpdHktaGlkZGVuLXJlbmRlcnMtZ2VuZXJhdGVkLWJveC1pbnZpc2libGUKIDExLTItdmlzaWJpbGl0eS1oaWRkZW4tc2hvdWxkLWJlLW92ZXJyaWRhYmxlCiAxMS0yLXZpc2liaWxpdHktaGlkZGVuLXN0aWxsLWFmZmVjdHMtbGF5b3V0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYwppbmRleCBhZjFjNjdhLi40M2EwYjhmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuY2MKQEAgLTI1Myw3ICsyNTMsNyBAQAogfQogCiBuYW1lc3BhY2UgewotI2lmIFNCX0hBUyhHUkFQSElDUykKKyNpZiBTQl9IQVMoR1JBUEhJQ1MpICYmICFTQl9JUyhFVkVSR1JFRU4pCiBjb25zdCBjaGFyKiBHZXRNaW1lVHlwZUZyb21JbWFnZVR5cGUoSW1hZ2VEZWNvZGVyOjpJbWFnZVR5cGUgaW1hZ2VfdHlwZSkgewogICBzd2l0Y2ggKGltYWdlX3R5cGUpIHsKICAgICBjYXNlIEltYWdlRGVjb2Rlcjo6a0ltYWdlVHlwZUpQRUc6CkBAIC0zMTIsNyArMzEyLDcgQEAKICAgfQogICByZXR1cm4gc2NvcGVkX3B0cjxJbWFnZURhdGFEZWNvZGVyPigpOwogfQotI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCisjZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykgJiYgIVNCX0lTKEVWRVJHUkVFTikKIAogc2NvcGVkX3B0cjxJbWFnZURhdGFEZWNvZGVyPiBDcmVhdGVJbWFnZURlY29kZXJGcm9tSW1hZ2VUeXBlKAogICAgIEltYWdlRGVjb2Rlcjo6SW1hZ2VUeXBlIGltYWdlX3R5cGUsCkBAIC0zMjIsMzQgKzMyMiw4IEBACiAgICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxJbWFnZURhdGFEZWNvZGVyPigKICAgICAgICAgbmV3IFN0dWJJbWFnZURlY29kZXIocmVzb3VyY2VfcHJvdmlkZXIpKTsKICAgfSBlbHNlIGlmIChpbWFnZV90eXBlID09IEltYWdlRGVjb2Rlcjo6a0ltYWdlVHlwZUpQRUcpIHsKLSNpZiBTQl9IQVMoR0xFUzIpICYmIGRlZmluZWQoQ09CQUxUX0ZPUkNFX0RJUkVDVF9HTEVTX1JBU1RFUklaRVIpCi0gICAgLy8gTWFueSBpbWFnZSBmb3JtYXRzIGNhbiBwcm9kdWNlIG5hdGl2ZSBvdXRwdXQgaW4gbXVsdGkgcGxhbmUgaW1hZ2VzIGluIFlVVgotICAgIC8vIDQyMC4gIEFsbG93IHRoZXNlIGltYWdlcyB0byBiZSBkZWNvZGVkIGludG8gbXVsdGkgcGxhbmUgaW1hZ2Ugbm90IG9ubHkKLSAgICAvLyByZWR1Y2VzIHRoZSBzcGFjZSB0byBzdG9yZSB0aGUgZGVjb2RlZCBpbWFnZSB0byAzNy41JSwgYnV0IGFsc28gaW1wcm92ZXMKLSAgICAvLyBkZWNvZGluZyBwZXJmb3JtYW5jZSBieSBub3QgY29udmVydGluZyB0aGUgb3V0cHV0IGZyb20gWVVWIHRvIFJHQkEuCi0gICAgYm9vbCBhbGxvd19pbWFnZV9kZWNvZGluZ190b19tdWx0aV9wbGFuZSA9IHRydWU7Ci0jZWxzZSAgIC8vIFNCX0hBUyhHTEVTMikgJiYgZGVmaW5lZChDT0JBTFRfRk9SQ0VfRElSRUNUX0dMRVNfUkFTVEVSSVpFUikKLSAgICAvLyBEZWNvZGluZyB0byBzaW5nbGUgcGxhbmUgYnkgZGVmYXVsdCBiZWNhdXNlIGJsaXR0ZXIgcGxhdGZvcm1zIHVzdWFsbHkKLSAgICAvLyBkb24ndCBoYXZlIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gaGFyZHdhcmUgYWNjZWxlcmF0ZWQgWVVWLWZvcm1hdHRlZAotICAgIC8vIGltYWdlIGJsaXR0aW5nLgotICAgIC8vIFRoaXMgYWxzbyBhcHBsaWVzIHRvIHNraWEgYmFzZWQgImhhcmR3YXJlIiByYXN0ZXJpemVycyBhcyB0aGUgcmVuZGVyaW5nCi0gICAgLy8gb2YgbXVsdGkgcGxhbmUgaW1hZ2VzIGluIHN1Y2ggY2FzZXMgYXJlIG5vdCBvcHRpbWl6ZWQsIGJ1dCB0aGlzIG1heSBiZQotICAgIC8vIGltcHJvdmVkIGluIGZ1dHVyZS4KLSAgICBib29sIGFsbG93X2ltYWdlX2RlY29kaW5nX3RvX211bHRpX3BsYW5lID0gZmFsc2U7Ci0jZW5kaWYgIC8vIFNCX0hBUyhHTEVTMikgJiYgZGVmaW5lZChDT0JBTFRfRk9SQ0VfRElSRUNUX0dMRVNfUkFTVEVSSVpFUikKLSAgICBhdXRvIGNvbW1hbmRfbGluZSA9IENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwotICAgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChzd2l0Y2hlczo6a0FsbG93SW1hZ2VEZWNvZGluZ1RvTXVsdGlQbGFuZSkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gY29tbWFuZF9saW5lLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKAotICAgICAgICAgIHN3aXRjaGVzOjprQWxsb3dJbWFnZURlY29kaW5nVG9NdWx0aVBsYW5lKTsKLSAgICAgIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKLSAgICAgICAgYWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmUgPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRENIRUNLX0VRKHZhbHVlLCAiZmFsc2UiKTsKLSAgICAgICAgYWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmUgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9CiAgICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxJbWFnZURhdGFEZWNvZGVyPihuZXcgSlBFR0ltYWdlRGVjb2RlcigKLSAgICAgICAgcmVzb3VyY2VfcHJvdmlkZXIsIGFsbG93X2ltYWdlX2RlY29kaW5nX3RvX211bHRpX3BsYW5lKSk7CisgICAgICAgIHJlc291cmNlX3Byb3ZpZGVyLCBJbWFnZURlY29kZXI6OkFsbG93RGVjb2RpbmdUb011bHRpUGxhbmUoKSkpOwogICB9IGVsc2UgaWYgKGltYWdlX3R5cGUgPT0gSW1hZ2VEZWNvZGVyOjprSW1hZ2VUeXBlUE5HKSB7CiAgICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxJbWFnZURhdGFEZWNvZGVyPigKICAgICAgICAgbmV3IFBOR0ltYWdlRGVjb2RlcihyZXNvdXJjZV9wcm92aWRlcikpOwpAQCAtMzg0LDEwICszNTgsMTEgQEAKICAgICBpbWFnZV90eXBlXyA9IERldGVybWluZUltYWdlVHlwZShzaWduYXR1cmVfY2FjaGVfLmRhdGEpOwogICB9CiAKLSNpZiBTQl9IQVMoR1JBUEhJQ1MpCisvLyBUT0RPOiBSZW1vdmUgdGhlIEVWRVJHUkVFTiBjaGVjayBvbmNlIHRoZSBFR0wgd2lyaW5nIGlzIHJlYWR5LgorI2lmIFNCX0hBUyhHUkFQSElDUykgJiYgIVNCX0lTKEVWRVJHUkVFTikKICAgZGVjb2Rlcl8gPQogICAgICAgTWF5YmVDcmVhdGVTdGFyYm9hcmREZWNvZGVyKG1pbWVfdHlwZV8sIGltYWdlX3R5cGVfLCByZXNvdXJjZV9wcm92aWRlcl8pOwotI2VuZGlmICAvLyBTQl9IQVMoR1JBUEhJQ1MpCisjZW5kaWYgIC8vIFNCX0hBUyhHUkFQSElDUykgJiYgIVNCX0lTKEVWRVJHUkVFTikKIAogICBpZiAoIWRlY29kZXJfKSB7CiAgICAgZGVjb2Rlcl8gPSBDcmVhdGVJbWFnZURlY29kZXJGcm9tSW1hZ2VUeXBlKGltYWdlX3R5cGVfLCByZXNvdXJjZV9wcm92aWRlcl8pOwpAQCAtNDA0LDYgKzM3OSw0MSBAQAogLy8gc3RhdGljCiB2b2lkIEltYWdlRGVjb2Rlcjo6VXNlU3R1YkltYWdlRGVjb2RlcigpIHsgc191c2Vfc3R1Yl9pbWFnZV9kZWNvZGVyID0gdHJ1ZTsgfQogCisvLyBzdGF0aWMKK2Jvb2wgSW1hZ2VEZWNvZGVyOjpBbGxvd0RlY29kaW5nVG9NdWx0aVBsYW5lKCkgeworI2lmIFNCX0hBUyhHTEVTMikgJiYgZGVmaW5lZChDT0JBTFRfRk9SQ0VfRElSRUNUX0dMRVNfUkFTVEVSSVpFUikKKyAgLy8gTWFueSBpbWFnZSBmb3JtYXRzIGNhbiBwcm9kdWNlIG5hdGl2ZSBvdXRwdXQgaW4gbXVsdGkgcGxhbmUgaW1hZ2VzIGluIFlVVgorICAvLyA0MjAuICBBbGxvdyB0aGVzZSBpbWFnZXMgdG8gYmUgZGVjb2RlZCBpbnRvIG11bHRpIHBsYW5lIGltYWdlIG5vdCBvbmx5CisgIC8vIHJlZHVjZXMgdGhlIHNwYWNlIHRvIHN0b3JlIHRoZSBkZWNvZGVkIGltYWdlIHRvIDM3LjUlLCBidXQgYWxzbyBpbXByb3ZlcworICAvLyBkZWNvZGluZyBwZXJmb3JtYW5jZSBieSBub3QgY29udmVydGluZyB0aGUgb3V0cHV0IGZyb20gWVVWIHRvIFJHQkEuCisgIGJvb2wgYWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmUgPSB0cnVlOworI2Vsc2UgICAvLyBTQl9IQVMoR0xFUzIpICYmIGRlZmluZWQoQ09CQUxUX0ZPUkNFX0RJUkVDVF9HTEVTX1JBU1RFUklaRVIpCisgIC8vIERlY29kaW5nIHRvIHNpbmdsZSBwbGFuZSBieSBkZWZhdWx0IGJlY2F1c2UgYmxpdHRlciBwbGF0Zm9ybXMgdXN1YWxseQorICAvLyBkb24ndCBoYXZlIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gaGFyZHdhcmUgYWNjZWxlcmF0ZWQgWVVWLWZvcm1hdHRlZAorICAvLyBpbWFnZSBibGl0dGluZy4KKyAgLy8gVGhpcyBhbHNvIGFwcGxpZXMgdG8gc2tpYSBiYXNlZCAiaGFyZHdhcmUiIHJhc3Rlcml6ZXJzIGFzIHRoZSByZW5kZXJpbmcKKyAgLy8gb2YgbXVsdGkgcGxhbmUgaW1hZ2VzIGluIHN1Y2ggY2FzZXMgYXJlIG5vdCBvcHRpbWl6ZWQsIGJ1dCB0aGlzIG1heSBiZQorICAvLyBpbXByb3ZlZCBpbiBmdXR1cmUuCisgIGJvb2wgYWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmUgPSBmYWxzZTsKKyNlbmRpZiAgLy8gU0JfSEFTKEdMRVMyKSAmJiBkZWZpbmVkKENPQkFMVF9GT1JDRV9ESVJFQ1RfR0xFU19SQVNURVJJWkVSKQorCisjaWYgIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKyAgYXV0byBjb21tYW5kX2xpbmUgPSBDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKKyAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKHN3aXRjaGVzOjprQWxsb3dJbWFnZURlY29kaW5nVG9NdWx0aVBsYW5lKSkgeworICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gY29tbWFuZF9saW5lLT5HZXRTd2l0Y2hWYWx1ZUFTQ0lJKAorICAgICAgICBzd2l0Y2hlczo6a0FsbG93SW1hZ2VEZWNvZGluZ1RvTXVsdGlQbGFuZSk7CisgICAgaWYgKHZhbHVlID09ICJ0cnVlIikgeworICAgICAgYWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBEQ0hFQ0tfRVEodmFsdWUsICJmYWxzZSIpOworICAgICAgYWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmUgPSBmYWxzZTsKKyAgICB9CisgIH0KKyNlbmRpZiAgLy8gIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKworICByZXR1cm4gYWxsb3dfaW1hZ2VfZGVjb2RpbmdfdG9fbXVsdGlfcGxhbmU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBpbWFnZQogfSAgLy8gbmFtZXNwYWNlIGxvYWRlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oCmluZGV4IGVjNGQxNTUuLjc0ZDQ1N2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmgKQEAgLTc0LDYgKzc0LDkgQEAKICAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHVzZSB0aGUgU3R1YkltYWdlRGVjb2RlciB3aGljaCBwcm9kdWNlcyBhIHNtYWxsIGltYWdlCiAgIC8vIHdpdGhvdXQgZGVjb2RpbmcuCiAgIHN0YXRpYyB2b2lkIFVzZVN0dWJJbWFnZURlY29kZXIoKTsKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBhbGxvd3MgZGVjb2RpbmcgYW5kIHN0b3JpbmcgZGVjb2RlZCBpbWFnZXMKKyAgLy8gaW50byBtdWx0aS1wbGFuZS4KKyAgc3RhdGljIGJvb2wgQWxsb3dEZWNvZGluZ1RvTXVsdGlQbGFuZSgpOwogCiAgcHJpdmF0ZToKICAgZW51bSBTdGF0ZSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuY2MKaW5kZXggMmU0YjhlZC4uMTg0NmQxMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5jYwpAQCAtODYsNiArODYsOSBAQAogICBEQ0hFQ0soIWRlY29kZXJfY3JlYXRvcl8uaXNfbnVsbCgpKTsKICAgRENIRUNLKCFvbl9sb2FkX2NvbXBsZXRlXy5pc19udWxsKCkpOwogCisgIGRlY29kZXJfID0gZGVjb2Rlcl9jcmVhdG9yXy5SdW4oCisgICAgICBiYXNlOjpCaW5kKCZMb2FkZXI6OkxvYWRDb21wbGV0ZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOworCiAgIGlmICghaXNfc3VzcGVuZGVkXykgewogICAgIFN0YXJ0KCk7CiAgIH0KQEAgLTE0Niw4ICsxNDksNiBAQAogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIERDSEVDSyghaXNfc3VzcGVuZGVkXyk7CiAKLSAgZGVjb2Rlcl8gPSBkZWNvZGVyX2NyZWF0b3JfLlJ1bigKLSAgICAgIGJhc2U6OkJpbmQoJkxvYWRlcjo6TG9hZENvbXBsZXRlLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CiAgIGZldGNoZXJfdG9fZGVjb2Rlcl9hZGFwdG9yXy5yZXNldChuZXcgRmV0Y2hlclRvRGVjb2RlckFkYXB0ZXIoCiAgICAgICBkZWNvZGVyXy5nZXQoKSwKICAgICAgIGJhc2U6OkJpbmQoJkxvYWRlcjo6TG9hZENvbXBsZXRlLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmNjCmluZGV4IDY3NDE3MDQuLjczMGZmNTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuY2MKQEAgLTEsNiArMSwyMCBAQAogLy8gQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogLy8gSW5wdXQgYnVmZmVyIGxheW91dCwgZGl2aWRpbmcgdGhlIHRvdGFsIGJ1ZmZlciBpbnRvIHJlZ2lvbnMgKHIwXyAtIHI1Xyk6CiAvLwpAQCAtMzEsMTMgKzQ1LDE1IEBACiAvLyBOb3RlOiB3ZSdyZSBnbG9zc2luZyBvdmVyIGhvdyB0aGUgc3ViLXNhbXBsZSBoYW5kbGluZyB3b3JrcyB3aXRoCiAvLyB8dmlydHVhbF9zb3VyY2VfaWR4X3wsIGV0Yy4KIAotI2luY2x1ZGUgIm1lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNtYXRoPgogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogCituYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBtZWRpYSB7CiAKIG5hbWVzcGFjZSB7CkBAIC02NSw2ICs4MSwzMCBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAorY2xhc3MgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyOjpCdWZmZXIKKyAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxCdWZmZXI+IHsKKyBwdWJsaWM6CisgIEJ1ZmZlcigpIDogZGF0YV8oTlVMTCksIGZyYW1lc18oMCkge30KKyAgQnVmZmVyKGNvbnN0IGZsb2F0KiBkYXRhLCBpbnQgZnJhbWVzLCBpbnQgY2hhbm5lbF9jb3VudCkgOiBmcmFtZXNfKGZyYW1lcykgeworICAgIGRhdGFfLnJlc2V0KG5ldyBmbG9hdFtmcmFtZXMgKiBjaGFubmVsX2NvdW50XSk7CisgICAgU2JNZW1vcnlDb3B5KGRhdGFfLmdldCgpLCBkYXRhLCBmcmFtZXMgKiBjaGFubmVsX2NvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgIH0KKyAgQnVmZmVyKHNjb3BlZF9hcnJheTxmbG9hdD4gZGF0YSwgaW50IGZyYW1lcykKKyAgICAgIDogZGF0YV8oZGF0YS5QYXNzKCkpLCBmcmFtZXNfKGZyYW1lcykge30KKworICBjb25zdCBmbG9hdCogR2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfLmdldCgpOyB9CisKKyAgaW50IEdldE51bUZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIGZyYW1lc187IH0KKworICBib29sIElzRW5kT2ZTdHJlYW0oKSBjb25zdCB7IHJldHVybiBHZXREYXRhKCkgPT0gTlVMTDsgfQorCisgcHJpdmF0ZToKKyAgc2NvcGVkX2FycmF5PGZsb2F0PiBkYXRhXzsKKyAgaW50IGZyYW1lc187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJ1ZmZlcik7Cit9OworCiBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OkludGVybGVhdmVkU2luY1Jlc2FtcGxlcihkb3VibGUgaW9fc2FtcGxlX3JhdGVfcmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbF9jb3VudCkKICAgICA6IGlvX3NhbXBsZV9yYXRlX3JhdGlvXyhpb19zYW1wbGVfcmF0ZV9yYXRpbyksCkBAIC0xMDgsMTMgKzE0OCwxNSBAQAogICBEQ0hFQ0tfRVEocjVfICsga0Jsb2NrU2l6ZSAqIGNoYW5uZWxfY291bnRfLAogICAgICAgICAgICAgcjFfICsga0J1ZmZlclNpemUgKiBjaGFubmVsX2NvdW50Xyk7CiAKLSAgbWVtc2V0KGtlcm5lbF9zdG9yYWdlXy5nZXQoKSwgMCwKLSAgICAgICAgIHNpemVvZigqa2VybmVsX3N0b3JhZ2VfLmdldCgpKSAqIGtLZXJuZWxTdG9yYWdlU2l6ZSk7Ci0gIG1lbXNldChpbnB1dF9idWZmZXJfLmdldCgpLCAwLCBmcmFtZV9zaXplX2luX2J5dGVzXyAqIGtCdWZmZXJTaXplKTsKKyAgU2JNZW1vcnlTZXQoa2VybmVsX3N0b3JhZ2VfLmdldCgpLCAwLAorICAgICAgICAgICAgICBzaXplb2YoKmtlcm5lbF9zdG9yYWdlXy5nZXQoKSkgKiBrS2VybmVsU3RvcmFnZVNpemUpOworICBTYk1lbW9yeVNldChpbnB1dF9idWZmZXJfLmdldCgpLCAwLCBmcmFtZV9zaXplX2luX2J5dGVzXyAqIGtCdWZmZXJTaXplKTsKIAogICBJbml0aWFsaXplS2VybmVsKCk7CiB9CiAKK0ludGVybGVhdmVkU2luY1Jlc2FtcGxlcjo6fkludGVybGVhdmVkU2luY1Jlc2FtcGxlcigpIHt9CisKIHZvaWQgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyOjpJbml0aWFsaXplS2VybmVsKCkgewogICAvLyBCbGFja21hbiB3aW5kb3cgcGFyYW1ldGVycy4KICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrQWxwaGEgPSAwLjE2OwpAQCAtMTMxLDggKzE3Myw4IEBACiAgIC8vIHdpbmRvd2luZyBpdCB0aGUgdHJhbnNpdGlvbiBmcm9tIHBhc3MgdG8gc3RvcCBkb2VzIG5vdCBoYXBwZW4gcmlnaHQgYXdheS4KICAgLy8gU28gd2Ugc2hvdWxkIGFkanVzdCB0aGUgbG93IHBhc3MgZmlsdGVyIGN1dG9mZiBzbGlnaHRseSBkb3dud2FyZCB0byBhdm9pZAogICAvLyBzb21lIGFsaWFzaW5nIGF0IHRoZSB2ZXJ5IGhpZ2gtZW5kLgotICAvLyBUT0RPKGNyb2dlcnMpOiB0aGlzIHZhbHVlIGlzIGVtcGlyaWNhbCBhbmQgdG8gYmUgbW9yZSBleGFjdCBzaG91bGQgdmFyeQotICAvLyBkZXBlbmRpbmcgb24ga0tlcm5lbFNpemUuCisgIC8vIFRPRE86IHRoaXMgdmFsdWUgaXMgZW1waXJpY2FsIGFuZCB0byBiZSBtb3JlIGV4YWN0IHNob3VsZCB2YXJ5IGRlcGVuZGluZworICAvLyBvbiBrS2VybmVsU2l6ZS4KICAgc2luY19zY2FsZV9mYWN0b3IgKj0gMC45OwogCiAgIC8vIEdlbmVyYXRlcyBhIHNldCBvZiB3aW5kb3dlZCBzaW5jKCkga2VybmVscy4KQEAgLTE1OCwyOCArMjAwLDQ0IEBACiAgIH0KIH0KIAotdm9pZCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OlF1ZXVlQnVmZmVyKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8OjptZWRpYTo6QnVmZmVyPiYgYnVmZmVyKSB7Ci0gIERDSEVDSyhidWZmZXIpOwordm9pZCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OlF1ZXVlQnVmZmVyKGNvbnN0IGZsb2F0KiBkYXRhLCBpbnQgZnJhbWVzKSB7CiAgIERDSEVDSyhDYW5RdWV1ZUJ1ZmZlcigpKTsKIAogICBpZiAoIXBlbmRpbmdfYnVmZmVyc18uZW1wdHkoKSAmJiBwZW5kaW5nX2J1ZmZlcnNfLmJhY2soKS0+SXNFbmRPZlN0cmVhbSgpKSB7Ci0gICAgRENIRUNLKGJ1ZmZlci0+SXNFbmRPZlN0cmVhbSgpKTsKKyAgICBEQ0hFQ0soIWRhdGEpOwogICAgIHJldHVybjsKICAgfQogCi0gIGlmICghYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICBmcmFtZXNfcXVldWVkXyArPSBidWZmZXItPkdldERhdGFTaXplKCkgLyBmcmFtZV9zaXplX2luX2J5dGVzXzsKKyAgaWYgKCFkYXRhKSB7CisgICAgcGVuZGluZ19idWZmZXJzXy5wdXNoKG5ldyBCdWZmZXIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICBmcmFtZXNfcXVldWVkXyArPSBmcmFtZXM7CisgICAgcGVuZGluZ19idWZmZXJzXy5wdXNoKG5ldyBCdWZmZXIoZGF0YSwgZnJhbWVzLCBjaGFubmVsX2NvdW50XykpOwogICB9Ci0KLSAgcGVuZGluZ19idWZmZXJzXy5wdXNoKGJ1ZmZlcik7CiB9CiAKLWJvb2wgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyOjpSZXNhbXBsZShmbG9hdCogZGVzdGluYXRpb24sIGludCBmcmFtZXMpIHsKLSAgaWYgKCFIYXNFbm91Z2hEYXRhKGZyYW1lcykpIHsKLSAgICByZXR1cm4gZmFsc2U7Cit2b2lkIEludGVybGVhdmVkU2luY1Jlc2FtcGxlcjo6UXVldWVCdWZmZXIoc2NvcGVkX2FycmF5PGZsb2F0PiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXMpIHsKKyAgRENIRUNLKENhblF1ZXVlQnVmZmVyKCkpOworCisgIGlmICghcGVuZGluZ19idWZmZXJzXy5lbXB0eSgpICYmIHBlbmRpbmdfYnVmZmVyc18uYmFjaygpLT5Jc0VuZE9mU3RyZWFtKCkpIHsKKyAgICBEQ0hFQ0soIWRhdGEuZ2V0KCkpOworICAgIHJldHVybjsKICAgfQogCisgIGlmICghZGF0YS5nZXQoKSkgeworICAgIHBlbmRpbmdfYnVmZmVyc18ucHVzaChuZXcgQnVmZmVyKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgZnJhbWVzX3F1ZXVlZF8gKz0gZnJhbWVzOworICAgIHBlbmRpbmdfYnVmZmVyc18ucHVzaChuZXcgQnVmZmVyKGRhdGEuUGFzcygpLCBmcmFtZXMpKTsKKyAgfQorfQorCit2b2lkIEludGVybGVhdmVkU2luY1Jlc2FtcGxlcjo6UmVzYW1wbGUoZmxvYXQqIGRlc3RpbmF0aW9uLCBpbnQgZnJhbWVzKSB7CisgIERDSEVDSyhIYXNFbm91Z2hEYXRhKGZyYW1lcykpOworCiAgIGludCByZW1haW5pbmdfZnJhbWVzID0gZnJhbWVzOwogCiAgIC8vIFN0ZXAgKDEpIC0tIFByaW1lIHRoZSBpbnB1dCBidWZmZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBzdHJlYW0uCkBAIC0yMTksNyArMjc3LDcgQEAKIAogICAgICAgaWYgKCEtLXJlbWFpbmluZ19mcmFtZXMpIHsKICAgICAgICAgZnJhbWVzX3Jlc2FtcGxlZF8gKz0gZnJhbWVzOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KIApAQCAtMjI4LDggKzI4Niw4IEBACiAKICAgICAvLyBTdGVwICgzKSBDb3B5IHIzXyB0byByMV8gYW5kIHI0XyB0byByMl8uCiAgICAgLy8gVGhpcyB3cmFwcyB0aGUgbGFzdCBpbnB1dCBmcmFtZXMgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KLSAgICBtZW1jcHkocjFfLCByM18sIGZyYW1lX3NpemVfaW5fYnl0ZXNfICogKGtLZXJuZWxTaXplIC8gMikpOwotICAgIG1lbWNweShyMl8sIHI0XywgZnJhbWVfc2l6ZV9pbl9ieXRlc18gKiAoa0tlcm5lbFNpemUgLyAyKSk7CisgICAgU2JNZW1vcnlDb3B5KHIxXywgcjNfLCBmcmFtZV9zaXplX2luX2J5dGVzXyAqIChrS2VybmVsU2l6ZSAvIDIpKTsKKyAgICBTYk1lbW9yeUNvcHkocjJfLCByNF8sIGZyYW1lX3NpemVfaW5fYnl0ZXNfICogKGtLZXJuZWxTaXplIC8gMikpOwogCiAgICAgLy8gU3RlcCAoNCkKICAgICAvLyBSZWZyZXNoIHRoZSBidWZmZXIgd2l0aCBtb3JlIGlucHV0LgpAQCAtMjM3LDEzICsyOTUsMTIgQEAKICAgfQogCiAgIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEludGVybGVhdmVkU2luY1Jlc2FtcGxlcjo6Rmx1c2goKSB7CiAgIHZpcnR1YWxfc291cmNlX2lkeF8gPSAwOwogICBidWZmZXJfcHJpbWVkXyA9IGZhbHNlOwotICBtZW1zZXQoaW5wdXRfYnVmZmVyXy5nZXQoKSwgMCwgZnJhbWVfc2l6ZV9pbl9ieXRlc18gKiBrQnVmZmVyU2l6ZSk7CisgIFNiTWVtb3J5U2V0KGlucHV0X2J1ZmZlcl8uZ2V0KCksIDAsIGZyYW1lX3NpemVfaW5fYnl0ZXNfICoga0J1ZmZlclNpemUpOwogICB3aGlsZSAoIXBlbmRpbmdfYnVmZmVyc18uZW1wdHkoKSkgewogICAgIHBlbmRpbmdfYnVmZmVyc18ucG9wKCk7CiAgIH0KQEAgLTI4NywxNSArMzQ0LDE1IEBACiAgICAgc2NvcGVkX3JlZnB0cjxCdWZmZXI+IGJ1ZmZlciA9IHBlbmRpbmdfYnVmZmVyc18uZnJvbnQoKTsKICAgICBpZiAoYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKICAgICAgIC8vIFplcm8gZmlsbCB0aGUgYnVmZmVyIGFmdGVyIEVPUyBoYXMgcmVhY2hlZC4KLSAgICAgIG1lbXNldChkZXN0aW5hdGlvbiwgMCwgZnJhbWVfc2l6ZV9pbl9ieXRlc18gKiBmcmFtZXMpOworICAgICAgU2JNZW1vcnlTZXQoZGVzdGluYXRpb24sIDAsIGZyYW1lX3NpemVfaW5fYnl0ZXNfICogZnJhbWVzKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgLy8gQ29weSB0aGUgZGF0YSBvdmVyLgotICAgIGludCBmcmFtZXNfaW5fYnVmZmVyID0gYnVmZmVyLT5HZXREYXRhU2l6ZSgpIC8gZnJhbWVfc2l6ZV9pbl9ieXRlc187CisgICAgaW50IGZyYW1lc19pbl9idWZmZXIgPSBidWZmZXItPkdldE51bUZyYW1lcygpOwogICAgIGludCBmcmFtZXNfdG9fY29weSA9IHN0ZDo6bWluKGZyYW1lc19pbl9idWZmZXIgLSBvZmZzZXRfaW5fZnJhbWVzXywgZnJhbWVzKTsKLSAgICBjb25zdCB1aW50OCogc291cmNlID0gYnVmZmVyLT5HZXREYXRhKCk7Ci0gICAgc291cmNlICs9IGZyYW1lX3NpemVfaW5fYnl0ZXNfICogb2Zmc2V0X2luX2ZyYW1lc187Ci0gICAgbWVtY3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UsIGZyYW1lX3NpemVfaW5fYnl0ZXNfICogZnJhbWVzX3RvX2NvcHkpOworICAgIGNvbnN0IGZsb2F0KiBzb3VyY2UgPSBidWZmZXItPkdldERhdGEoKTsKKyAgICBzb3VyY2UgKz0gb2Zmc2V0X2luX2ZyYW1lc18gKiBjaGFubmVsX2NvdW50XzsKKyAgICBTYk1lbW9yeUNvcHkoZGVzdGluYXRpb24sIHNvdXJjZSwgZnJhbWVfc2l6ZV9pbl9ieXRlc18gKiBmcmFtZXNfdG9fY29weSk7CiAgICAgb2Zmc2V0X2luX2ZyYW1lc18gKz0gZnJhbWVzX3RvX2NvcHk7CiAgICAgLy8gUG9wIHRoZSBmaXJzdCBidWZmZXIgaWYgYWxsIGl0cyBjb250ZW50IGhhcyBiZWVuIHJlYWQuCiAgICAgaWYgKG9mZnNldF9pbl9mcmFtZXNfID09IGZyYW1lc19pbl9idWZmZXIpIHsKQEAgLTMxMiw4ICszNjksNyBAQAogfQogCiBmbG9hdCBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXI6OkNvbnZvbHZlKGNvbnN0IGZsb2F0KiBpbnB1dF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogazEsIGNvbnN0IGZsb2F0KiBrMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGtlcm5lbF9pbnRlcnBvbGF0aW9uX2ZhY3RvcikgewogICBmbG9hdCBzdW0xID0gMDsKICAgZmxvYXQgc3VtMiA9IDA7CkBAIC0zMzMsMyArMzg5LDQgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5oCmluZGV4IGVkZmRhZGEuLmExZWZmOGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5oCkBAIC0yLDM3ICsyLDUzIEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIE1FRElBX0JBU0VfSU5URVJMRUFWRURfU0lOQ19SRVNBTVBMRVJfSF8KLSNkZWZpbmUgTUVESUFfQkFTRV9JTlRFUkxFQVZFRF9TSU5DX1JFU0FNUExFUl9IXworLy8gTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX0JBU0VfSU5URVJMRUFWRURfU0lOQ19SRVNBTVBMRVJfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX0JBU0VfSU5URVJMRUFWRURfU0lOQ19SRVNBTVBMRVJfSF8KIAogI2luY2x1ZGUgPHF1ZXVlPgogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvYWxpZ25lZF9tZW1vcnkuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL2J1ZmZlcnMuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgorI2luY2x1ZGUgImNvYmFsdC9leHBvcnQuaCIKIAorbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbWVkaWEgewogCiAvLyBJbnRlcmxlYXZlZFNpbmNSZXNhbXBsZXIgaXMgYSBoaWdoLXF1YWxpdHkgaW50ZXJsZWF2ZWQgbXVsdGktY2hhbm5lbCBzYW1wbGUKLS8vLXJhdGUgY29udmVydGVyIG9wZXJhdGluZyBvbiBzYW1wbGVzIGluIGZsb2F0LiBJdCB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobSBhcworLy8gLXJhdGUgY29udmVydGVyIG9wZXJhdGluZyBvbiBzYW1wbGVzIGluIGZsb2F0LiBJdCB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobSBhcwogLy8gU2luY1Jlc2FtcGxlci4gVW5saWtlIFNpbmNSZXNhbXBsZXIsIGl0IHdvcmtzIGluIHB1c2ggbW9kZSBpbnN0ZWFkIG9mIHB1bGwKIC8vIG1vZGUuCi1jbGFzcyBNRURJQV9FWFBPUlQgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIHsKK2NsYXNzIENPQkFMVF9FWFBPUlQgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyIHsKICBwdWJsaWM6CiAgIC8vIHxpb19zYW1wbGVfcmF0ZV9yYXRpb3wgaXMgdGhlIHJhdGlvIG9mIGlucHV0IC8gb3V0cHV0IHNhbXBsZSByYXRlcy4KICAgLy8gfGNoYW5uZWxfY291bnR8IGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGludGVybGVhdmVkIGF1ZGlvIHN0cmVhbS4KICAgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyKGRvdWJsZSBpb19zYW1wbGVfcmF0ZV9yYXRpbywgaW50IGNoYW5uZWxfY291bnQpOworICB+SW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyKCk7CiAKICAgLy8gQXBwZW5kIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZS4gVGhlIHNhbXBsZXMgaW4gdGhlIGJ1ZmZlciBoYXMgdG8gYmUgZmxvYXRzLgotICB2b2lkIFF1ZXVlQnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyPiYgYnVmZmVyKTsKKyAgdm9pZCBRdWV1ZUJ1ZmZlcihjb25zdCBmbG9hdCogZGF0YSwgaW50IGZyYW1lcyk7CisgIHZvaWQgUXVldWVCdWZmZXIoc2NvcGVkX2FycmF5PGZsb2F0PiBkYXRhLCBpbnQgZnJhbWVzKTsKIAogICAvLyBSZXNhbXBsZSB8ZnJhbWVzfCBvZiBkYXRhIGZyb20gZW5xdWV1ZWQgYnVmZmVycy4gIFJldHVybiBmYWxzZSBpZiBubyBzYW1wbGUKICAgLy8gaXMgcmVhZC4gIFJldHVybiB0cnVlIGlmIGFsbCByZXF1ZXN0ZWQgc2FtcGxlcyBoYXZlIGJlZW4gd3JpdHRlbiBpbnRvCiAgIC8vIHxkZXN0aW5hdGlvbnwuICBJdCB3aWxsIG5ldmVyIGRvIGEgcGFydGlhbCByZWFkLiAgQWZ0ZXIgdGhlIHN0cmVhbSByZWFjaGVzCiAgIC8vIHRoZSBlbmQsIHRoZSBmdW5jdGlvbiB3aWxsIGZpbGwgdGhlIHJlc3Qgb2YgYnVmZmVyIHdpdGggMC4KLSAgYm9vbCBSZXNhbXBsZShmbG9hdCogZGVzdGluYXRpb24sIGludCBmcmFtZXMpOworICB2b2lkIFJlc2FtcGxlKGZsb2F0KiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lcyk7CiAKICAgLy8gRmx1c2ggYWxsIGJ1ZmZlcmVkIGRhdGEgYW5kIHJlc2V0IGludGVybmFsIGluZGljZXMuCiAgIHZvaWQgRmx1c2goKTsKQEAgLTQzLDE0ICs1OSwxNyBAQAogICAvLyBSZXR1cm5pbmcgdHJ1ZSB3aGVuIHdlIHN0YXJ0IHRvIHJldHVybiB6ZXJvIGZpbGxlZCBkYXRhIGJlY2F1c2Ugb2YgRU9TLgogICBib29sIFJlYWNoZWRFT1MoKSBjb25zdDsKIAotIHByaXZhdGU6Ci0gIHZvaWQgSW5pdGlhbGl6ZUtlcm5lbCgpOworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZW5xdWV1ZWQgYnVmZmVycyBoYXZlIGVub3VnaCBkYXRhIGZvciB1cyB0byByZXNhbXBsZSB0aGUKKyAgLy8gcmVxdWVzdGVkIG51bWJlciBvZiBmcmFtZXMuCiAgIGJvb2wgSGFzRW5vdWdoRGF0YShpbnQgZnJhbWVzX3RvX3Jlc2FtcGxlKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNsYXNzIEJ1ZmZlcjsKKworICB2b2lkIEluaXRpYWxpemVLZXJuZWwoKTsKICAgdm9pZCBSZWFkKGZsb2F0KiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lcyk7CiAKLSAgZmxvYXQgQ29udm9sdmUoY29uc3QgZmxvYXQqIGlucHV0X3B0ciwKLSAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGsxLAotICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogazIsCisgIGZsb2F0IENvbnZvbHZlKGNvbnN0IGZsb2F0KiBpbnB1dF9wdHIsIGNvbnN0IGZsb2F0KiBrMSwgY29uc3QgZmxvYXQqIGsyLAogICAgICAgICAgICAgICAgICBkb3VibGUga2VybmVsX2ludGVycG9sYXRpb25fZmFjdG9yKTsKIAogICAvLyBUaGUgcmF0aW8gb2YgaW5wdXQgLyBvdXRwdXQgc2FtcGxlIHJhdGVzLgpAQCAtNzgsNyArOTcsNyBAQAogICBzY29wZWRfcHRyX21hbGxvYzxmbG9hdCwgYmFzZTo6U2NvcGVkUHRyQWxpZ25lZEZyZWU+IGlucHV0X2J1ZmZlcl87CiAKICAgLy8gQSBxdWV1ZSBvZiBidWZmZXJzIHRvIGJlIHJlc2FtcGxlZC4KLSAgc3RkOjpxdWV1ZTxzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gPiBwZW5kaW5nX2J1ZmZlcnNfOworICBzdGQ6OnF1ZXVlPHNjb3BlZF9yZWZwdHI8QnVmZmVyPj4gcGVuZGluZ19idWZmZXJzXzsKIAogICAvLyBUaGUgY3VycmVudCBvZmZzZXQgdG8gcmVhZCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgZmlyc3QgcGVuZGluZyBidWZmZXIuCiAgIGludCBvZmZzZXRfaW5fZnJhbWVzXzsKQEAgLTEwMCw1ICsxMTksNiBAQAogfTsKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CiAKLSNlbmRpZiAgLy8gTUVESUFfQkFTRV9JTlRFUkxFQVZFRF9TSU5DX1JFU0FNUExFUl9IXworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfQkFTRV9JTlRFUkxFQVZFRF9TSU5DX1JFU0FNUExFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYwppbmRleCA4MTdlNDdjLi43ZDBkN2Q5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYwpAQCAtMjg4LDQzICsyODgsNyBAQAogICBEQ0hFQ0sodmlkZW9fZnJhbWVzX2RlY29kZWQgfHwgdmlkZW9fZnJhbWVzX2Ryb3BwZWQgfHwgbWVkaWFfdGltZSk7CiAKICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKLSAgaWYgKHN0YXRlXyA9PSBrU3VzcGVuZGVkKSB7Ci0gICAgaWYgKHZpZGVvX2ZyYW1lc19kZWNvZGVkKSB7Ci0gICAgICAqdmlkZW9fZnJhbWVzX2RlY29kZWQgPSBjYWNoZWRfdmlkZW9fZnJhbWVzX2RlY29kZWRfOwotICAgIH0KLSAgICBpZiAodmlkZW9fZnJhbWVzX2Ryb3BwZWQpIHsKLSAgICAgICp2aWRlb19mcmFtZXNfZHJvcHBlZCA9IGNhY2hlZF92aWRlb19mcmFtZXNfZHJvcHBlZF87Ci0gICAgfQotICAgIGlmIChtZWRpYV90aW1lKSB7Ci0gICAgICAqbWVkaWFfdGltZSA9IHByZXJvbGxfdGltZXN0YW1wXzsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRENIRUNLKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7Ci0KLSNpZiBTQl9BUElfVkVSU0lPTiA8IDEwCi0gIFNiUGxheWVySW5mbyBpbmZvOwotICBTYlBsYXllckdldEluZm8ocGxheWVyXywgJmluZm8pOwotICBpZiAobWVkaWFfdGltZSkgewotICAgICptZWRpYV90aW1lID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKAotICAgICAgICBTQl9NRURJQV9USU1FX1RPX1NCX1RJTUUoaW5mby5jdXJyZW50X21lZGlhX3B0cykpOwotICB9Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgMTAKLSAgU2JQbGF5ZXJJbmZvMiBpbmZvOwotICBTYlBsYXllckdldEluZm8yKHBsYXllcl8sICZpbmZvKTsKLQotICBpZiAobWVkaWFfdGltZSkgewotICAgICptZWRpYV90aW1lID0KLSAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKGluZm8uY3VycmVudF9tZWRpYV90aW1lc3RhbXApOwotICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgMTAKLSAgaWYgKHZpZGVvX2ZyYW1lc19kZWNvZGVkKSB7Ci0gICAgKnZpZGVvX2ZyYW1lc19kZWNvZGVkID0gaW5mby50b3RhbF92aWRlb19mcmFtZXM7Ci0gIH0KLSAgaWYgKHZpZGVvX2ZyYW1lc19kcm9wcGVkKSB7Ci0gICAgKnZpZGVvX2ZyYW1lc19kcm9wcGVkID0gaW5mby5kcm9wcGVkX3ZpZGVvX2ZyYW1lczsKLSAgfQorICBHZXRJbmZvX0xvY2tlZCh2aWRlb19mcmFtZXNfZGVjb2RlZCwgdmlkZW9fZnJhbWVzX2Ryb3BwZWQsIG1lZGlhX3RpbWUpOwogfQogCiAjaWYgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKQEAgLTQxNiw5ICszODAsOCBAQAogICBTYlBsYXllclNldFBsYXliYWNrUmF0ZShwbGF5ZXJfLCAwLjApOwogCiAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0KLSAgdGhpcy0+R2V0SW5mbygmY2FjaGVkX3ZpZGVvX2ZyYW1lc19kZWNvZGVkXywgJmNhY2hlZF92aWRlb19mcmFtZXNfZHJvcHBlZF8sCi0gICAgICAgICAgICAgICAgJnByZXJvbGxfdGltZXN0YW1wXyk7CisgIEdldEluZm9fTG9ja2VkKCZjYWNoZWRfdmlkZW9fZnJhbWVzX2RlY29kZWRfLCAmY2FjaGVkX3ZpZGVvX2ZyYW1lc19kcm9wcGVkXywKKyAgICAgICAgICAgICAgICAgJnByZXJvbGxfdGltZXN0YW1wXyk7CiAKICAgc3RhdGVfID0ga1N1c3BlbmRlZDsKIApAQCAtNjU2LDYgKzYxOSw0OSBAQAogICByZXR1cm4gb3V0cHV0X21vZGVfOwogfQogCit2b2lkIFN0YXJib2FyZFBsYXllcjo6R2V0SW5mb19Mb2NrZWQodWludDMyKiB2aWRlb19mcmFtZXNfZGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIqIHZpZGVvX2ZyYW1lc19kcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSogbWVkaWFfdGltZSkgeworICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOworICBpZiAoc3RhdGVfID09IGtTdXNwZW5kZWQpIHsKKyAgICBpZiAodmlkZW9fZnJhbWVzX2RlY29kZWQpIHsKKyAgICAgICp2aWRlb19mcmFtZXNfZGVjb2RlZCA9IGNhY2hlZF92aWRlb19mcmFtZXNfZGVjb2RlZF87CisgICAgfQorICAgIGlmICh2aWRlb19mcmFtZXNfZHJvcHBlZCkgeworICAgICAgKnZpZGVvX2ZyYW1lc19kcm9wcGVkID0gY2FjaGVkX3ZpZGVvX2ZyYW1lc19kcm9wcGVkXzsKKyAgICB9CisgICAgaWYgKG1lZGlhX3RpbWUpIHsKKyAgICAgICptZWRpYV90aW1lID0gcHJlcm9sbF90aW1lc3RhbXBfOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBEQ0hFQ0soU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcl8pKTsKKworI2lmIFNCX0FQSV9WRVJTSU9OIDwgMTAKKyAgU2JQbGF5ZXJJbmZvIGluZm87CisgIFNiUGxheWVyR2V0SW5mbyhwbGF5ZXJfLCAmaW5mbyk7CisgIGlmIChtZWRpYV90aW1lKSB7CisgICAgKm1lZGlhX3RpbWUgPSBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoCisgICAgICAgIFNCX01FRElBX1RJTUVfVE9fU0JfVElNRShpbmZvLmN1cnJlbnRfbWVkaWFfcHRzKSk7CisgIH0KKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCAxMAorICBTYlBsYXllckluZm8yIGluZm87CisgIFNiUGxheWVyR2V0SW5mbzIocGxheWVyXywgJmluZm8pOworCisgIGlmIChtZWRpYV90aW1lKSB7CisgICAgKm1lZGlhX3RpbWUgPQorICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMoaW5mby5jdXJyZW50X21lZGlhX3RpbWVzdGFtcCk7CisgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCAxMAorICBpZiAodmlkZW9fZnJhbWVzX2RlY29kZWQpIHsKKyAgICAqdmlkZW9fZnJhbWVzX2RlY29kZWQgPSBpbmZvLnRvdGFsX3ZpZGVvX2ZyYW1lczsKKyAgfQorICBpZiAodmlkZW9fZnJhbWVzX2Ryb3BwZWQpIHsKKyAgICAqdmlkZW9fZnJhbWVzX2Ryb3BwZWQgPSBpbmZvLmRyb3BwZWRfdmlkZW9fZnJhbWVzOworICB9Cit9CisKIHZvaWQgU3RhcmJvYXJkUGxheWVyOjpVcGRhdGVCb3VuZHNfTG9ja2VkKCkgewogICBsb2NrXy5Bc3NlcnRBY3F1aXJlZCgpOwogICBEQ0hFQ0soU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcl8pKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5oCmluZGV4IDg2MDdiMWYuLmY2NmY5MWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuaApAQCAtMTY5LDYgKzE2OSw5IEBACiAgIHZvaWQgV3JpdGVCdWZmZXJJbnRlcm5hbChEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpOwogCisgIHZvaWQgR2V0SW5mb19Mb2NrZWQodWludDMyKiB2aWRlb19mcmFtZXNfZGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzIqIHZpZGVvX2ZyYW1lc19kcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSogbWVkaWFfdGltZSk7CiAgIHZvaWQgVXBkYXRlQm91bmRzX0xvY2tlZCgpOwogCiAgIHZvaWQgQ2xlYXJEZWNvZGVyQnVmZmVyQ2FjaGUoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3V0aWxzLmNjCmluZGV4IGI5ZTdhMDEuLjZlNTIzNDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF91dGlscy5jYwpAQCAtMjcsMzYgKzI3LDU2IEBACiBuYW1lc3BhY2UgbWVkaWEgewogCiBTYk1lZGlhQXVkaW9Db2RlYyBNZWRpYUF1ZGlvQ29kZWNUb1NiTWVkaWFBdWRpb0NvZGVjKEF1ZGlvQ29kZWMgY29kZWMpIHsKLSAgaWYgKGNvZGVjID09IGtDb2RlY0FBQykgewotICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNBYWM7CisgIHN3aXRjaCAoY29kZWMpIHsKKyAgICBjYXNlIGtDb2RlY0FBQzoKKyAgICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNBYWM7CiAjaWYgU0JfSEFTKEFDM19BVURJTykKLSAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNBQzMpIHsKLSAgICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjQWMzOworICAgIGNhc2Uga0NvZGVjQUMzOgorICAgICAgcmV0dXJuIGtTYk1lZGlhQXVkaW9Db2RlY0FjMzsKKyAgICBjYXNlIGtDb2RlY0VBQzM6CisgICAgICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjRWFjMzsKICNlbmRpZiAgLy8gU0JfSEFTKEFDM19BVURJTykKLSAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNWb3JiaXMpIHsKLSAgICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjVm9yYmlzOwotICB9IGVsc2UgaWYgKGNvZGVjID09IGtDb2RlY09wdXMpIHsKLSAgICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjT3B1czsKKyAgICBjYXNlIGtDb2RlY1ZvcmJpczoKKyAgICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNWb3JiaXM7CisgICAgY2FzZSBrQ29kZWNPcHVzOgorICAgICAgcmV0dXJuIGtTYk1lZGlhQXVkaW9Db2RlY09wdXM7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIENvYmFsdCBvbmx5IHN1cHBvcnRzIGEgc3Vic2V0IG9mIGF1ZGlvIGNvZGVjcyBkZWZpbmVkIGJ5IENocm9taXVtLgorICAgICAgRExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIGF1ZGlvIGNvZGVjICIKKyAgICAgICAgICAgICAgICAgIDw8IGNvYmFsdDo6bWVkaWE6OkdldENvZGVjTmFtZShjb2RlYyk7CisgICAgICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjTm9uZTsKICAgfQotICBETE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gY29kZWMgIiA8PCBjb2RlYzsKKyAgTk9UUkVBQ0hFRCgpOwogICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjTm9uZTsKIH0KIAogU2JNZWRpYVZpZGVvQ29kZWMgTWVkaWFWaWRlb0NvZGVjVG9TYk1lZGlhVmlkZW9Db2RlYyhWaWRlb0NvZGVjIGNvZGVjKSB7Ci0gIGlmIChjb2RlYyA9PSBrQ29kZWNIMjY0KSB7Ci0gICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQ7Ci0gIH0gZWxzZSBpZiAoY29kZWMgPT0ga0NvZGVjVkMxKSB7Ci0gICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY1ZjMTsKLSAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNNUEVHMikgewotICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNNcGVnMjsKLSAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNUaGVvcmEpIHsKLSAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjVGhlb3JhOwotICB9IGVsc2UgaWYgKGNvZGVjID09IGtDb2RlY1ZQOCkgewotICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNWcDg7Ci0gIH0gZWxzZSBpZiAoY29kZWMgPT0ga0NvZGVjVlA5KSB7Ci0gICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY1ZwOTsKKyAgc3dpdGNoIChjb2RlYykgeworICAgIGNhc2Uga0NvZGVjSDI2NDoKKyAgICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0OworICAgIGNhc2Uga0NvZGVjVkMxOgorICAgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY1ZjMTsKKyAgICBjYXNlIGtDb2RlY01QRUcyOgorICAgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY01wZWcyOworICAgIGNhc2Uga0NvZGVjVGhlb3JhOgorICAgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY1RoZW9yYTsKKyAgICBjYXNlIGtDb2RlY1ZQODoKKyAgICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNWcDg7CisgICAgY2FzZSBrQ29kZWNWUDk6CisgICAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjVnA5OworICAgIGNhc2Uga0NvZGVjQVYxOgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0hBU19BVjFfVkVSU0lPTgorICAgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY0F2MTsKKyNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9IQVNfQVYxX1ZFUlNJT04KKyAgICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNWcDEwOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9IQVNfQVYxX1ZFUlNJT04KKyAgICBkZWZhdWx0OgorICAgICAgLy8gQ29iYWx0IG9ubHkgc3VwcG9ydHMgYSBzdWJzZXQgb2YgdmlkZW8gY29kZWNzIGRlZmluZWQgYnkgQ2hyb21pdW0uCisgICAgICBETE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgdmlkZW8gY29kZWMgIgorICAgICAgICAgICAgICAgICAgPDwgY29iYWx0OjptZWRpYTo6R2V0Q29kZWNOYW1lKGNvZGVjKTsKKyAgICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNOb25lOwogICB9Ci0gIERMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCB2aWRlbyBjb2RlYyAiIDw8IGNvZGVjOworICBOT1RSRUFDSEVEKCk7CiAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNOb25lOwogfQogCkBAIC03Myw3ICs5Myw3IEBACiAgIGF1ZGlvX2hlYWRlci5ibG9ja19hbGlnbm1lbnQgPSA0OwogICBhdWRpb19oZWFkZXIuYml0c19wZXJfc2FtcGxlID0gYXVkaW9fZGVjb2Rlcl9jb25maWcuYml0c19wZXJfY2hhbm5lbCgpOwogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNgorI2lmIFNCX0hBUyhBVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKICAgYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZ19zaXplID0KICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihhdWRpb19kZWNvZGVyX2NvbmZpZy5leHRyYV9kYXRhKCkuc2l6ZSgpKTsKICAgaWYgKGF1ZGlvX2hlYWRlci5hdWRpb19zcGVjaWZpY19jb25maWdfc2l6ZSA9PSAwKSB7CkBAIC04MSw3ICsxMDEsNyBAQAogICB9IGVsc2UgewogICAgIGF1ZGlvX2hlYWRlci5hdWRpb19zcGVjaWZpY19jb25maWcgPSAmYXVkaW9fZGVjb2Rlcl9jb25maWcuZXh0cmFfZGF0YSgpWzBdOwogICB9Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDYKKyNlbHNlICAgLy8gU0JfSEFTKEFVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQogICBhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oCiAgICAgICBzdGQ6Om1pbihhdWRpb19kZWNvZGVyX2NvbmZpZy5leHRyYV9kYXRhKCkuc2l6ZSgpLAogICAgICAgICAgICAgICAgc2l6ZW9mKGF1ZGlvX2hlYWRlci5hdWRpb19zcGVjaWZpY19jb25maWcpKSk7CkBAIC05MCw3ICsxMTAsNyBAQAogICAgICAgICAgICAgICAgICAmYXVkaW9fZGVjb2Rlcl9jb25maWcuZXh0cmFfZGF0YSgpWzBdLAogICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOwogICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDYKKyNlbmRpZiAgLy8gU0JfSEFTKEFVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQogCiAgIHJldHVybiBhdWRpb19oZWFkZXI7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY29kZWNzLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2NvZGVjcy5jYwppbmRleCBhODJlMDQxLi5hMTgyODNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY29kZWNzLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19jb2RlY3MuY2MKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJiYXNlL3N0cmluZ19zcGxpdC5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBtZWRpYSB7CkBAIC0yNCw2ICsyNSw4IEBACiAgICAgICByZXR1cm4gImgyNjQiOwogICAgIGNhc2Uga0NvZGVjSEVWQzoKICAgICAgIHJldHVybiAiaGV2YyI7CisgICAgY2FzZSBrQ29kZWNEb2xieVZpc2lvbjoKKyAgICAgIHJldHVybiAiZG9sYnl2aXNpb24iOwogICAgIGNhc2Uga0NvZGVjVkMxOgogICAgICAgcmV0dXJuICJ2YzEiOwogICAgIGNhc2Uga0NvZGVjTVBFRzI6CkBAIC0zNiw2ICszOSw4IEBACiAgICAgICByZXR1cm4gInZwOCI7CiAgICAgY2FzZSBrQ29kZWNWUDk6CiAgICAgICByZXR1cm4gInZwOSI7CisgICAgY2FzZSBrQ29kZWNBVjE6CisgICAgICByZXR1cm4gImF2MSI7CiAgIH0KICAgTk9UUkVBQ0hFRCgpOwogICByZXR1cm4gIiI7CkBAIC04MywxMSArODgsMjI4IEBACiAgICAgICByZXR1cm4gInZwOSBwcm9maWxlMiI7CiAgICAgY2FzZSBWUDlQUk9GSUxFX1BST0ZJTEUzOgogICAgICAgcmV0dXJuICJ2cDkgcHJvZmlsZTMiOworICAgIGNhc2UgRE9MQllWSVNJT05fUFJPRklMRTA6CisgICAgICByZXR1cm4gImRvbGJ5IHZpc2lvbiBwcm9maWxlIDAiOworICAgIGNhc2UgRE9MQllWSVNJT05fUFJPRklMRTQ6CisgICAgICByZXR1cm4gImRvbGJ5IHZpc2lvbiBwcm9maWxlIDQiOworICAgIGNhc2UgRE9MQllWSVNJT05fUFJPRklMRTU6CisgICAgICByZXR1cm4gImRvbGJ5IHZpc2lvbiBwcm9maWxlIDUiOworICAgIGNhc2UgRE9MQllWSVNJT05fUFJPRklMRTc6CisgICAgICByZXR1cm4gImRvbGJ5IHZpc2lvbiBwcm9maWxlIDciOworICAgIGNhc2UgVEhFT1JBUFJPRklMRV9BTlk6CisgICAgICByZXR1cm4gInRoZW9yYSI7CisgICAgY2FzZSBBVjFQUk9GSUxFX1BST0ZJTEVfTUFJTjoKKyAgICAgIHJldHVybiAiYXYxIHByb2ZpbGUgbWFpbiI7CisgICAgY2FzZSBBVjFQUk9GSUxFX1BST0ZJTEVfSElHSDoKKyAgICAgIHJldHVybiAiYXYxIHByb2ZpbGUgaGlnaCI7CisgICAgY2FzZSBBVjFQUk9GSUxFX1BST0ZJTEVfUFJPOgorICAgICAgcmV0dXJuICJhdjEgcHJvZmlsZSBwcm8iOwogICB9CiAgIE5PVFJFQUNIRUQoKTsKICAgcmV0dXJuICIiOwogfQogCitib29sIFBhcnNlQXYxQ29kZWNJZChjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsIFZpZGVvQ29kZWNQcm9maWxlKiBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogbGV2ZWxfaWRjLCBnZng6OkNvbG9yU3BhY2UqIGNvbG9yX3NwYWNlKSB7CisgIC8vIFRoZSBjb2RlY3MgcGFyYW1ldGVyIHN0cmluZyBmb3IgdGhlIEFPTSBBVjEgY29kZWMgaXMgYXMgZm9sbG93czoKKyAgLy8gU2VlIGh0dHBzOi8vYW9tZWRpYWNvZGVjLmdpdGh1Yi5pby9hdjEtaXNvYm1mZi8jY29kZWNzcGFyYW0uCisgIC8vCisgIC8vIDxzYW1wbGUgZW50cnk0Q0M+Ljxwcm9maWxlPi48bGV2ZWw+PHRpZXI+LjxiaXREZXB0aD4uPG1vbm9jaHJvbWU+LgorICAvLyA8Y2hyb21hU3Vic2FtcGxpbmc+Ljxjb2xvclByaW1hcmllcz4uPHRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzPi4KKyAgLy8gPG1hdHJpeENvZWZmaWNpZW50cz4uPHZpZGVvRnVsbFJhbmdlRmxhZz4KKworICAvLyBUT0RPOiBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgY29kZSB1c2luZworICAvLyAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWVsZHMgPSBiYXNlOjpTcGxpdFN0cmluZygKKyAgLy8gICAgICAgICAgICAgY29kZWNfaWQsICIuIiwgYmFzZTo6S0VFUF9XSElURVNQQUNFLCBiYXNlOjpTUExJVF9XQU5UX0FMTCk7CisgIC8vICAgICAgIG9uY2UgQ2hyb21pdW0gYmFzZSByZWJhc2UgaXMgZmluaXNoZWQuCisgIGlmIChTYlN0cmluZ0ZpbmRDaGFyYWN0ZXIoY29kZWNfaWQuY19zdHIoKSwgJyAnKSAhPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChTYlN0cmluZ0ZpbmRTdHJpbmcoY29kZWNfaWQuY19zdHIoKSwgIi4uIikgIT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmllbGRzOworICBiYXNlOjpTcGxpdFN0cmluZyhjb2RlY19pZCwgJy4nLCAmZmllbGRzKTsKKworICAvLyBUaGUgcGFyYW1ldGVycyBzYW1wbGUgZW50cnkgNENDLCBwcm9maWxlLCBsZXZlbCwgdGllciwgYW5kIGJpdERlcHRoIGFyZSBhbGwKKyAgLy8gbWFuZGF0b3J5IGZpZWxkcy4gSWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgZW1wdHksIG9yIG5vdCB3aXRoaW4gdGhlaXIKKyAgLy8gYWxsb3dlZCByYW5nZSwgdGhlIHByb2Nlc3NpbmcgZGV2aWNlIFNIT1VMRCB0cmVhdCBpdCBhcyBhbiBlcnJvci4KKyAgaWYgKGZpZWxkcy5zaXplKCkgPCA0IHx8IGZpZWxkcy5zaXplKCkgPiAxMCkgeworICAgIERWTE9HKDMpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBudW1iZXIgb2YgZmllbGRzICgiIDw8IGZpZWxkcy5zaXplKCkKKyAgICAgICAgICAgICA8PCAiKSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQWxsIHRoZSBvdGhlciBmaWVsZHMgKGluY2x1ZGluZyB0aGVpciBsZWFkaW5nICcuJykgYXJlIG9wdGlvbmFsLCBtdXR1YWxseQorICAvLyBpbmNsdXNpdmUgKGFsbCBvciBub25lKSBmaWVsZHMuIElmIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgdmFsdWVzIGxpc3RlZCBpbgorICAvLyB0aGUgdGFibGUgYmVsb3cgYXJlIGFzc3VtZWQuCisgIC8vCisgIC8vIG1vbm9fY2hyb21lICAgICAgICAgICAgICAwCisgIC8vIGNocm9tYVN1YnNhbXBsaW5nICAgICAgICAxMTIgKDQ6MjowIGNvbG9jYXRlZCB3aXRoIGx1bWEgKDAsMCkpCisgIC8vIGNvbG9yUHJpbWFyaWVzICAgICAgICAgICAxIChJVFUtUiBCVC43MDkpCisgIC8vIHRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzICAxIChJVFUtUiBCVC43MDkpCisgIC8vIG1hdHJpeENvZWZmaWNpZW50cyAgICAgICAxIChJVFUtUiBCVC43MDkpCisgIC8vIHZpZGVvRnVsbFJhbmdlRmxhZyAgICAgICAwIChzdHVkaW8gc3dpbmcgcmVwcmVzZW50YXRpb24pCisgICpjb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlUkVDNzA5KCk7CisKKyAgaWYgKGZpZWxkc1swXSAhPSAiYXYwMSIpIHsKKyAgICBEVkxPRygzKSA8PCBfX2Z1bmNfXyA8PCAiIEludmFsaWQgQVYxIDRDQyAoIiA8PCBmaWVsZHNbMF0gPDwgIikiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRoZSBsZXZlbCBwYXJhbWV0ZXIgdmFsdWUgU0hBTEwgZXF1YWwgdGhlIGZpcnN0IGxldmVsIHZhbHVlIGluZGljYXRlZCBieQorICAvLyBzZXFfbGV2ZWxfaWR4IGluIHRoZSBTZXF1ZW5jZSBIZWFkZXIuIFRoZSB0aWVyIHBhcmFtZXRlciB2YWx1ZSBTSEFMTCBiZQorICAvLyBlcXVhbCB0byBNIHdoZW4gdGhlIGZpcnN0IHNlcV90aWVyIHZhbHVlIGluIHRoZSBTZXF1ZW5jZSBIZWFkZXIgaXMgZXF1YWwgdG8KKyAgLy8gMCwgYW5kIEggd2hlbiBpdCBpcyBlcXVhbCB0byAxLgorICBpZiAoZmllbGRzWzJdLnNpemUoKSAhPSAzIHx8IChmaWVsZHNbMl1bMl0gIT0gJ00nICYmIGZpZWxkc1syXVsyXSAhPSAnSCcpKSB7CisgICAgRFZMT0coMykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIGxldmVsK3RpZXIgKCIgPDwgZmllbGRzWzJdIDw8ICIpIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBTaW5jZSB0aWVyIGhhcyBiZWVuIHZhbGlkYXRlZCwgc3RyaXAgdGhlIHRyYWlsaW5nIHRpZXIgaW5kaWNhdG9yIHRvIGFsbG93CisgIC8vIGludCBjb252ZXJzaW9uIGJlbG93LgorICBmaWVsZHNbMl0ucmVzaXplKDIpOworCisgIC8vIEZpbGwgd2l0aCBkdW1teSB2YWx1ZXMgdG8gZW5zdXJlIHBhcmFsbGVsIGluZGljZXMgd2l0aCBmaWVsZHMuCisgIHN0ZDo6dmVjdG9yPGludD4gdmFsdWVzKGZpZWxkcy5zaXplKCksIDApOworICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIGlmIChmaWVsZHNbaV0uZW1wdHkoKSkgeworICAgICAgRFZMT0coMykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIGVtcHR5IGZpZWxkIChwb3NpdGlvbjoiIDw8IGkgPDwgIikiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghYmFzZTo6U3RyaW5nVG9JbnQoZmllbGRzW2ldLCAmdmFsdWVzW2ldKSB8fCB2YWx1ZXNbaV0gPCAwKSB7CisgICAgICBEVkxPRygzKSA8PCBfX2Z1bmNfXyA8PCAiIEludmFsaWQgZmllbGQgdmFsdWUgKCIgPDwgdmFsdWVzW2ldIDw8ICIpIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBUaGUgcHJvZmlsZSBwYXJhbWV0ZXIgdmFsdWUsIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGRpZ2l0IGRlY2ltYWwsIFNIQUxMCisgIC8vIGVxdWFsIHRoZSB2YWx1ZSBvZiBzZXFfcHJvZmlsZSBpbiB0aGUgU2VxdWVuY2UgSGVhZGVyLgorICBjb25zdCBpbnQgcHJvZmlsZV9pZGMgPSBmaWVsZHNbMV0uc2l6ZSgpID09IDEgPyB2YWx1ZXNbMV0gOiAtMTsKKyAgc3dpdGNoIChwcm9maWxlX2lkYykgeworICAgIGNhc2UgMDoKKyAgICAgICpwcm9maWxlID0gQVYxUFJPRklMRV9QUk9GSUxFX01BSU47CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAqcHJvZmlsZSA9IEFWMVBST0ZJTEVfUFJPRklMRV9ISUdIOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgKnByb2ZpbGUgPSBBVjFQUk9GSUxFX1BST0ZJTEVfUFJPOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIERWTE9HKDMpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBwcm9maWxlICgiIDw8IGZpZWxkc1sxXSA8PCAiKSI7CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBUaGUgbGV2ZWwgcGFyYW1ldGVyIHZhbHVlIFNIQUxMIGVxdWFsIHRoZSBmaXJzdCBsZXZlbCB2YWx1ZSBpbmRpY2F0ZWQgYnkKKyAgLy8gc2VxX2xldmVsX2lkeCBpbiB0aGUgU2VxdWVuY2UgSGVhZGVyLiBOb3RlOiBXZSB2YWxpZGF0ZSB0aGF0IHRoaXMgZmllbGQgaGFzCisgIC8vIHRoZSByZXF1aXJlZCBsZWFkaW5nIHplcm9zIGFib3ZlLgorICAqbGV2ZWxfaWRjID0gdmFsdWVzWzJdOworICBpZiAoKmxldmVsX2lkYyA+IDMxKSB7CisgICAgRFZMT0coMykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIGxldmVsICgiIDw8ICpsZXZlbF9pZGMgPDwgIikiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRoZSBiaXREZXB0aCBwYXJhbWV0ZXIgdmFsdWUgU0hBTEwgZXF1YWwgdGhlIHZhbHVlIG9mIEJpdERlcHRoIHZhcmlhYmxlIGFzCisgIC8vIGRlZmluZWQgaW4gW0FWMV0gZGVyaXZlZCBmcm9tIHRoZSBTZXF1ZW5jZSBIZWFkZXIuIExlYWRpbmcgemVyb3MgcmVxdWlyZWQuCisgIGNvbnN0IGludCBiaXRfZGVwdGggPSB2YWx1ZXNbM107CisgIGlmIChmaWVsZHNbM10uc2l6ZSgpICE9IDIgfHwKKyAgICAgIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTAgJiYgYml0X2RlcHRoICE9IDEyKSkgeworICAgIERWTE9HKDMpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBiaXQtZGVwdGggKCIgPDwgZmllbGRzWzNdIDw8ICIpIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAodmFsdWVzLnNpemUoKSA8PSA0KSByZXR1cm4gdHJ1ZTsKKworICAvLyBUaGUgbW9ub2Nocm9tZSBwYXJhbWV0ZXIgdmFsdWUsIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGRpZ2l0IGRlY2ltYWwsCisgIC8vIFNIQUxMIGVxdWFsIHRoZSB2YWx1ZSBvZiBtb25vX2Nocm9tZSBpbiB0aGUgU2VxdWVuY2UgSGVhZGVyLgorICBjb25zdCBpbnQgbW9ub2Nocm9tZSA9IHZhbHVlc1s0XTsKKyAgaWYgKGZpZWxkc1s0XS5zaXplKCkgIT0gMSB8fCBtb25vY2hyb21lID4gMSkgeworICAgIERWTE9HKDMpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBtb25vY2hyb21lICgiIDw8IGZpZWxkc1s0XSA8PCAiKSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHZhbHVlcy5zaXplKCkgPD0gNSkgcmV0dXJuIHRydWU7CisKKyAgLy8gVGhlIGNocm9tYVN1YnNhbXBsaW5nIHBhcmFtZXRlciB2YWx1ZSwgcmVwcmVzZW50ZWQgYnkgYSB0aHJlZS1kaWdpdAorICAvLyBkZWNpbWFsLCBTSEFMTCBoYXZlIGl0cyBmaXJzdCBkaWdpdCBlcXVhbCB0byBzdWJzYW1wbGluZ194IGFuZCBpdHMgc2Vjb25kCisgIC8vIGRpZ2l0IGVxdWFsIHRvIHN1YnNhbXBsaW5nX3kuIElmIGJvdGggc3Vic2FtcGxpbmdfeCBhbmQgc3Vic2FtcGxpbmdfeSBhcmUKKyAgLy8gc2V0IHRvIDEsIHRoZW4gdGhlIHRoaXJkIGRpZ2l0IFNIQUxMIGJlIGVxdWFsIHRvIGNocm9tYV9zYW1wbGVfcG9zaXRpb24sCisgIC8vIG90aGVyd2lzZSBpdCBTSEFMTCBiZSBzZXQgdG8gMC4KKyAgaWYgKGZpZWxkc1s1XS5zaXplKCkgIT0gMykgeworICAgIERWTE9HKDMpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBjaHJvbWEgc3Vic2FtcGxpbmcgKCIgPDwgZmllbGRzWzVdIDw8ICIpIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBjaGFyIHN1YnNhbXBsaW5nX3ggPSBmaWVsZHNbNV1bMF07CisgIGNvbnN0IGNoYXIgc3Vic2FtcGxpbmdfeSA9IGZpZWxkc1s1XVsxXTsKKyAgY29uc3QgY2hhciBjaHJvbWFfc2FtcGxlX3Bvc2l0aW9uID0gZmllbGRzWzVdWzJdOworICBpZiAoKHN1YnNhbXBsaW5nX3ggPCAnMCcgfHwgc3Vic2FtcGxpbmdfeCA+ICcxJykgfHwKKyAgICAgIChzdWJzYW1wbGluZ195IDwgJzAnIHx8IHN1YnNhbXBsaW5nX3kgPiAnMScpIHx8CisgICAgICAoY2hyb21hX3NhbXBsZV9wb3NpdGlvbiA8ICcwJyB8fCBjaHJvbWFfc2FtcGxlX3Bvc2l0aW9uID4gJzMnKSkgeworICAgIERWTE9HKDMpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBjaHJvbWEgc3Vic2FtcGxpbmcgKCIgPDwgZmllbGRzWzVdIDw8ICIpIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoKChzdWJzYW1wbGluZ194ID09ICcwJyB8fCBzdWJzYW1wbGluZ195ID09ICcwJykgJiYKKyAgICAgICBjaHJvbWFfc2FtcGxlX3Bvc2l0aW9uICE9ICcwJykpIHsKKyAgICBEVkxPRygzKSA8PCBfX2Z1bmNfXyA8PCAiIEludmFsaWQgY2hyb21hIHN1YnNhbXBsaW5nICgiIDw8IGZpZWxkc1s1XSA8PCAiKSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHZhbHVlcy5zaXplKCkgPD0gNikgcmV0dXJuIHRydWU7CisKKyAgLy8gVGhlIGNvbG9yUHJpbWFyaWVzLCB0cmFuc2ZlckNoYXJhY3RlcmlzdGljcywgbWF0cml4Q29lZmZpY2llbnRzIGFuZAorICAvLyB2aWRlb0Z1bGxSYW5nZUZsYWcgcGFyYW1ldGVyIHZhbHVlcyBTSEFMTCBlcXVhbCB0aGUgdmFsdWUgb2YgbWF0Y2hpbmcKKyAgLy8gZmllbGRzIGluIHRoZSBTZXF1ZW5jZSBIZWFkZXIsIGlmIGNvbG9yX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyBpcyBzZXQgdG8KKyAgLy8gMSwgb3RoZXJ3aXNlIHRoZXkgU0hPVUxEIG5vdCBiZSBzZXQsIGRlZmF1bHRpbmcgdG8gdGhlIHZhbHVlcyBiZWxvdy4gVGhlCisgIC8vIHZpZGVvRnVsbFJhbmdlRmxhZyBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBkaWdpdC4KKyAgYXV0byBwcmltYXJpZXMgPSBnZng6OkNvbG9yU3BhY2U6OlByaW1hcnlJREZyb21JbnQodmFsdWVzWzZdKTsKKyAgaWYgKGZpZWxkc1s2XS5zaXplKCkgIT0gMiB8fAorICAgICAgcHJpbWFyaWVzID09IGdmeDo6Q29sb3JTcGFjZTo6a1ByaW1hcnlJZFJlc2VydmVkMCkgeworICAgIERWTE9HKDMpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBjb2xvciBwcmltYXJpZXMgKCIgPDwgZmllbGRzWzZdIDw8ICIpIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAodmFsdWVzLnNpemUoKSA8PSA3KSByZXR1cm4gdHJ1ZTsKKworICBhdXRvIHRyYW5zZmVyID0gZ2Z4OjpDb2xvclNwYWNlOjpUcmFuc2ZlcklERnJvbUludCh2YWx1ZXNbN10pOworICBpZiAoZmllbGRzWzddLnNpemUoKSAhPSAyIHx8CisgICAgICB0cmFuc2ZlciA9PSBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkUmVzZXJ2ZWQwKSB7CisgICAgRFZMT0coMykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIHRyYW5zZmVyIGZ1bmN0aW9uICgiIDw8IGZpZWxkc1s3XSA8PCAiKSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHZhbHVlcy5zaXplKCkgPD0gOCkgcmV0dXJuIHRydWU7CisKKyAgYXV0byBtYXRyaXggPSBnZng6OkNvbG9yU3BhY2U6Ok1hdHJpeElERnJvbUludCh2YWx1ZXNbOF0pOworICBpZiAoZmllbGRzWzhdLnNpemUoKSAhPSAyIHx8IG1hdHJpeCA9PSBnZng6OkNvbG9yU3BhY2U6OmtNYXRyaXhJZFVua25vd24pIHsKKyAgICAvLyBUT0RPOiBBVjEgYWxsb3dzIGEgZmV3IG1hdHJpY2VzIHdlIGRvbid0IHN1cHBvcnQgeWV0LgorICAgIC8vICAgICAgIGh0dHBzOi8vY3JidWcuY29tLzg1NDI5MAorICAgIGlmICh2YWx1ZXNbOF0gPT0gMTIgfHwgdmFsdWVzWzhdID09IDEzIHx8IHZhbHVlc1s4XSA9PSAxNCkgeworICAgICAgRFZMT0coMykgPDwgX19mdW5jX18gPDwgIiBVbnN1cHBvcnRlZCBtYXRyaXggY29lZmZpY2llbnRzICgiIDw8IGZpZWxkc1s4XQorICAgICAgICAgICAgICAgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBEVkxPRygzKSA8PCBfX2Z1bmNfXyA8PCAiIEludmFsaWQgbWF0cml4IGNvZWZmaWNpZW50cyAoIiA8PCBmaWVsZHNbOF0KKyAgICAgICAgICAgICAgIDw8ICIpIjsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHZhbHVlcy5zaXplKCkgPD0gOSkgcmV0dXJuIHRydWU7CisKKyAgY29uc3QgaW50IHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyA9IHZhbHVlc1s5XTsKKyAgaWYgKGZpZWxkc1s5XS5zaXplKCkgIT0gMSB8fCB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgPiAxKSB7CisgICAgRFZMT0coMykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIGZ1bGwgcmFuZ2UgZmxhZyAoIiA8PCBmaWVsZHNbOV0gPDwgIikiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBhdXRvIHJhbmdlID0gdmlkZW9fZnVsbF9yYW5nZV9mbGFnID09IDEgPyBnZng6OkNvbG9yU3BhY2U6OmtSYW5nZUlkRnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZng6OkNvbG9yU3BhY2U6OmtSYW5nZUlkTGltaXRlZDsKKyAgKmNvbG9yX3NwYWNlID0gZ2Z4OjpDb2xvclNwYWNlKHByaW1hcmllcywgdHJhbnNmZXIsIG1hdHJpeCwgcmFuZ2UpOworICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBQYXJzZUFWQ0NvZGVjSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLCBWaWRlb0NvZGVjUHJvZmlsZSogcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGxldmVsX2lkYykgewogICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhdmMxLnh4eHh4eCBvciBhdmMzLnh4eHh4eCAsIHdoZXJlIHh4eHh4eCBhcmUgaGV4IGRpZ2l0cwpAQCAtMjk0LDYgKzUxNiw5IEBACiAgICAgICBjb2RlY19pZCA9PSAidnA5LjIiKSB7CiAgICAgcmV0dXJuIGtDb2RlY1ZQOTsKICAgfQorICBnZng6OkNvbG9yU3BhY2UgY29sb3Jfc3BhY2U7CisgIGlmIChQYXJzZUF2MUNvZGVjSWQoY29kZWNfaWQsICZwcm9maWxlLCAmbGV2ZWwsICZjb2xvcl9zcGFjZSkpCisgICAgcmV0dXJuIGtDb2RlY0FWMTsKICAgaWYgKGNvZGVjX2lkID09ICJ0aGVvcmEiKSByZXR1cm4ga0NvZGVjVGhlb3JhOwogICBpZiAoUGFyc2VIRVZDQ29kZWNJZChjb2RlY19pZCwgJnByb2ZpbGUsICZsZXZlbCkpIHJldHVybiBrQ29kZWNIRVZDOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY29kZWNzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY29kZWNzLmgKaW5kZXggMDg1YWMxNS4uZjk0MWQ4MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2NvZGVjcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19jb2RlY3MuaApAQCAtNiw2ICs2LDggQEAKICNkZWZpbmUgQ09CQUxUX01FRElBX0JBU0VfVklERU9fQ09ERUNTX0hfCiAKICNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9jb2xvcl9zcGFjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgogCkBAIC0yNSwxMiArMjcsMTQgQEAKICAga0NvZGVjVlA4LAogICBrQ29kZWNWUDksCiAgIGtDb2RlY0hFVkMsCisgIGtDb2RlY0RvbGJ5VmlzaW9uLAorICBrQ29kZWNBVjEsCiAgIC8vIERPIE5PVCBBREQgUkFORE9NIFZJREVPIENPREVDUyEKICAgLy8KICAgLy8gVGhlIG9ubHkgYWNjZXB0YWJsZSB0aW1lIHRvIGFkZCBhIG5ldyBjb2RlYyBpcyBpZiB0aGVyZSBpcyBwcm9kdWN0aW9uIGNvZGUKICAgLy8gdGhhdCB1c2VzIHNhaWQgY29kZWMgaW4gdGhlIHNhbWUgQ0wuCiAKLSAga1ZpZGVvQ29kZWNNYXggPSBrQ29kZWNIRVZDICAvLyBNdXN0IGVxdWFsIHRoZSBsYXN0ICJyZWFsIiBjb2RlYyBhYm92ZS4KKyAga1ZpZGVvQ29kZWNNYXggPSBrQ29kZWNBVjEgIC8vIE11c3QgZXF1YWwgdGhlIGxhc3QgInJlYWwiIGNvZGVjIGFib3ZlLgogfTsKIAogLy8gVmlkZW8gY29kZWMgcHJvZmlsZXMuIEtlZXAgaW4gc3luYyB3aXRoIG1vam86OlZpZGVvQ29kZWNQcm9maWxlIChzZWUKQEAgLTcyLDEyICs3NiwzMSBAQAogICBIRVZDUFJPRklMRV9NQUlOMTAgPSAxNywKICAgSEVWQ1BST0ZJTEVfTUFJTl9TVElMTF9QSUNUVVJFID0gMTgsCiAgIEhFVkNQUk9GSUxFX01BWCA9IEhFVkNQUk9GSUxFX01BSU5fU1RJTExfUElDVFVSRSwKLSAgVklERU9fQ09ERUNfUFJPRklMRV9NQVggPSBIRVZDUFJPRklMRV9NQVgsCisgIERPTEJZVklTSU9OX01JTiA9IDE5LAorICBET0xCWVZJU0lPTl9QUk9GSUxFMCA9IERPTEJZVklTSU9OX01JTiwKKyAgRE9MQllWSVNJT05fUFJPRklMRTQgPSAyMCwKKyAgRE9MQllWSVNJT05fUFJPRklMRTUgPSAyMSwKKyAgRE9MQllWSVNJT05fUFJPRklMRTcgPSAyMiwKKyAgRE9MQllWSVNJT05fTUFYID0gRE9MQllWSVNJT05fUFJPRklMRTcsCisgIFRIRU9SQVBST0ZJTEVfTUlOID0gMjMsCisgIFRIRU9SQVBST0ZJTEVfQU5ZID0gVEhFT1JBUFJPRklMRV9NSU4sCisgIFRIRU9SQVBST0ZJTEVfTUFYID0gVEhFT1JBUFJPRklMRV9BTlksCisgIEFWMVBST0ZJTEVfTUlOID0gMjQsCisgIEFWMVBST0ZJTEVfUFJPRklMRV9NQUlOID0gQVYxUFJPRklMRV9NSU4sCisgIEFWMVBST0ZJTEVfUFJPRklMRV9ISUdIID0gMjUsCisgIEFWMVBST0ZJTEVfUFJPRklMRV9QUk8gPSAyNiwKKyAgQVYxUFJPRklMRV9NQVggPSBBVjFQUk9GSUxFX1BST0ZJTEVfUFJPLAorICBWSURFT19DT0RFQ19QUk9GSUxFX01BWCA9IEFWMVBST0ZJTEVfUFJPRklMRV9QUk8sCiB9OwogCiBzdGQ6OnN0cmluZyBNRURJQV9FWFBPUlQgR2V0Q29kZWNOYW1lKFZpZGVvQ29kZWMgY29kZWMpOwogc3RkOjpzdHJpbmcgTUVESUFfRVhQT1JUIEdldFByb2ZpbGVOYW1lKFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUpOwogCitNRURJQV9FWFBPUlQgYm9vbCBQYXJzZUF2MUNvZGVjSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ29kZWNQcm9maWxlKiBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGxldmVsX2lkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZng6OkNvbG9yU3BhY2UqIGNvbG9yX3NwYWNlKTsKKwogLy8gSGFuZGxlIHBhcnNpbmcgQVZDL0guMjY0IGNvZGVjIGlkcyBhcyBvdXRsaW5lZCBpbiBSRkMgNjM4MSBhbmQgSVNPLTE0NDk2LTEwLgogTUVESUFfRVhQT1JUIGJvb2wgUGFyc2VBVkNDb2RlY0lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2RlY19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0NvZGVjUHJvZmlsZSogcHJvZmlsZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5jYwppbmRleCA2OWE1NDQ2Li5kMzk5ZDM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmNjCkBAIC0zOSw2ICszOSwxNyBAQAogICAgIGNhc2UgVlA5UFJPRklMRV9QUk9GSUxFMjoKICAgICBjYXNlIFZQOVBST0ZJTEVfUFJPRklMRTM6CiAgICAgICByZXR1cm4ga0NvZGVjVlA5OworICAgIGNhc2UgRE9MQllWSVNJT05fUFJPRklMRTA6CisgICAgY2FzZSBET0xCWVZJU0lPTl9QUk9GSUxFNDoKKyAgICBjYXNlIERPTEJZVklTSU9OX1BST0ZJTEU1OgorICAgIGNhc2UgRE9MQllWSVNJT05fUFJPRklMRTc6CisgICAgICByZXR1cm4ga0NvZGVjRG9sYnlWaXNpb247CisgICAgY2FzZSBUSEVPUkFQUk9GSUxFX0FOWToKKyAgICAgIHJldHVybiBrQ29kZWNUaGVvcmE7CisgICAgY2FzZSBBVjFQUk9GSUxFX1BST0ZJTEVfTUFJTjoKKyAgICBjYXNlIEFWMVBST0ZJTEVfUFJPRklMRV9ISUdIOgorICAgIGNhc2UgQVYxUFJPRklMRV9QUk9GSUxFX1BSTzoKKyAgICAgIHJldHVybiBrQ29kZWNBVjE7CiAgIH0KICAgTk9UUkVBQ0hFRCgpOwogICByZXR1cm4ga1Vua25vd25WaWRlb0NvZGVjOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3N0cmVhbV9wYXJzZXJfZmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zdHJlYW1fcGFyc2VyX2ZhY3RvcnkuY2MKaW5kZXggNzlkZWZjNy4uZDBlOThhYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3N0cmVhbV9wYXJzZXJfZmFjdG9yeS5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc3RyZWFtX3BhcnNlcl9mYWN0b3J5LmNjCkBAIC00OSw3ICs0OSw4IEBACiAgICAgSElTVE9HUkFNX09QVVMsCiAgICAgSElTVE9HUkFNX0hFVkMsCiAgICAgSElTVE9HUkFNX0FDMywKLSAgICBISVNUT0dSQU1fTUFYID0gSElTVE9HUkFNX0FDMyAgLy8gTXVzdCBiZSBlcXVhbCB0byBsYXJnZXN0IGxvZ2dlZCBlbnRyeS4KKyAgICBISVNUT0dSQU1fQVYxLAorICAgIEhJU1RPR1JBTV9NQVggPSBISVNUT0dSQU1fQVYxICAvLyBNdXN0IGJlIGVxdWFsIHRvIGxhcmdlc3QgbG9nZ2VkIGVudHJ5LgogICB9OwogCiAgIGNvbnN0IGNoYXIqIHBhdHRlcm47CkBAIC03Nyw5ICs3OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjSW5mbzo6SElTVE9HUkFNX1ZPUkJJU307CiBzdGF0aWMgY29uc3QgQ29kZWNJbmZvIGtPcHVzQ29kZWNJbmZvID0geyJvcHVzIiwgQ29kZWNJbmZvOjpBVURJTywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNJbmZvOjpISVNUT0dSQU1fT1BVU307CisvLyBOb3RlOiBWYWxpZGF0aW9uIG9mIHRoZSBjb2RlYyBzdHJpbmcgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGVyLgorc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrQVYxQ29kZWNJbmZvID0geyJhdjAxLioiLCBDb2RlY0luZm86OlZJREVPLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjSW5mbzo6SElTVE9HUkFNX0FWMX07CiAKIHN0YXRpYyBjb25zdCBDb2RlY0luZm8qIGtWaWRlb1dlYk1Db2RlY3NbXSA9IHsKLSAgICAma1ZQOENvZGVjSW5mbywgJmtWUDlDb2RlY0luZm8sICZrVm9yYmlzQ29kZWNJbmZvLCAma09wdXNDb2RlY0luZm8sIE5VTEx9OworICAgICZrVlA4Q29kZWNJbmZvLCAgJmtWUDlDb2RlY0luZm8sICZrVm9yYmlzQ29kZWNJbmZvLAorICAgICZrT3B1c0NvZGVjSW5mbywgJmtBVjFDb2RlY0luZm8sIE5VTEx9OwogCiBzdGF0aWMgY29uc3QgQ29kZWNJbmZvKiBrQXVkaW9XZWJNQ29kZWNzW10gPSB7JmtWb3JiaXNDb2RlY0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtPcHVzQ29kZWNJbmZvLCBOVUxMfTsKQEAgLTE2OSwxMCArMTc0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjSW5mbzo6SElTVE9HUkFNX0VBQzN9OwogCiBzdGF0aWMgY29uc3QgQ29kZWNJbmZvKiBrVmlkZW9NUDRDb2RlY3NbXSA9IHsKLSAgICAma0gyNjRBVkMxQ29kZWNJbmZvLCAgICZrSDI2NEFWQzNDb2RlY0luZm8sCi0gICAgJmtIRVZDSEVWMUNvZGVjSW5mbywgICAma0hFVkNIVkMxQ29kZWNJbmZvLAotICAgICZrTVBFRzRWUDA5Q29kZWNJbmZvLCAgJmtNUEVHNEFBQ0NvZGVjSW5mbywKLSAgICAma01QRUcyQUFDTENDb2RlY0luZm8sIE5VTEx9OworICAgICZrSDI2NEFWQzFDb2RlY0luZm8sICAgJmtIMjY0QVZDM0NvZGVjSW5mbywgICZrSEVWQ0hFVjFDb2RlY0luZm8sCisgICAgJmtIRVZDSFZDMUNvZGVjSW5mbywgICAma01QRUc0VlAwOUNvZGVjSW5mbywgJmtNUEVHNEFBQ0NvZGVjSW5mbywKKyAgICAma01QRUcyQUFDTENDb2RlY0luZm8sICZrQVYxQ29kZWNJbmZvLCAgICAgICBOVUxMfTsKIAogc3RhdGljIGNvbnN0IENvZGVjSW5mbyoga0F1ZGlvTVA0Q29kZWNzW10gPSB7CiAgICAgJmtNUEVHNEFBQ0NvZGVjSW5mbywgJmtNUEVHMkFBQ0xDQ29kZWNJbmZvLCAma0FDM0NvZGVjSW5mbzEsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2JveF9kZWZpbml0aW9ucy5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X2RlZmluaXRpb25zLmNjCmluZGV4IGFmNjY4MTMuLmIzOWM1YzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X2RlZmluaXRpb25zLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X2RlZmluaXRpb25zLmNjCkBAIC01NDQsNiArNTQ0LDczIEBACiAgIHJldHVybiB0cnVlOwogfQogCitBVjFDb2RlY0NvbmZpZ3VyYXRpb25SZWNvcmQ6OkFWMUNvZGVjQ29uZmlndXJhdGlvblJlY29yZCgpCisgICAgOiBwcm9maWxlKFZJREVPX0NPREVDX1BST0ZJTEVfVU5LTk9XTikge30KKworQVYxQ29kZWNDb25maWd1cmF0aW9uUmVjb3JkOjp+QVYxQ29kZWNDb25maWd1cmF0aW9uUmVjb3JkKCkgPSBkZWZhdWx0OworCitGb3VyQ0MgQVYxQ29kZWNDb25maWd1cmF0aW9uUmVjb3JkOjpCb3hUeXBlKCkgY29uc3QgeyByZXR1cm4gRk9VUkNDX0FWMUM7IH0KKworLy8gUGFyc2UgdGhlIEFWMUNvZGVjQ29uZmlndXJhdGlvblJlY29yZCwgd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorLy8gdW5zaWduZWQgaW50ICgxKSBtYXJrZXIgPSAxOworLy8gdW5zaWduZWQgaW50ICg3KSB2ZXJzaW9uID0gMTsKKy8vIHVuc2lnbmVkIGludCAoMykgc2VxX3Byb2ZpbGU7CisvLyB1bnNpZ25lZCBpbnQgKDUpIHNlcV9sZXZlbF9pZHhfMDsKKy8vIHVuc2lnbmVkIGludCAoMSkgc2VxX3RpZXJfMDsKKy8vIHVuc2lnbmVkIGludCAoMSkgaGlnaF9iaXRkZXB0aDsKKy8vIHVuc2lnbmVkIGludCAoMSkgdHdlbHZlX2JpdDsKKy8vIHVuc2lnbmVkIGludCAoMSkgbW9ub2Nocm9tZTsKKy8vIHVuc2lnbmVkIGludCAoMSkgY2hyb21hX3N1YnNhbXBsaW5nX3g7CisvLyB1bnNpZ25lZCBpbnQgKDEpIGNocm9tYV9zdWJzYW1wbGluZ195OworLy8gdW5zaWduZWQgaW50ICgyKSBjaHJvbWFfc2FtcGxlX3Bvc2l0aW9uOworLy8gdW5zaWduZWQgaW50ICgzKSByZXNlcnZlZCA9IDA7CisvLworLy8gdW5zaWduZWQgaW50ICgxKSBpbml0aWFsX3ByZXNlbnRhdGlvbl9kZWxheV9wcmVzZW50OworLy8gaWYgKGluaXRpYWxfcHJlc2VudGF0aW9uX2RlbGF5X3ByZXNlbnQpIHsKKy8vICAgdW5zaWduZWQgaW50ICg0KSBpbml0aWFsX3ByZXNlbnRhdGlvbl9kZWxheV9taW51c19vbmU7CisvLyB9IGVsc2UgeworLy8gICB1bnNpZ25lZCBpbnQgKDQpIHJlc2VydmVkID0gMDsKKy8vIH0KKy8vCisvLyB1bnNpZ25lZCBpbnQgKDgpW10gY29uZmlnT0JVczsKK2Jvb2wgQVYxQ29kZWNDb25maWd1cmF0aW9uUmVjb3JkOjpQYXJzZShCb3hSZWFkZXIqIHJlYWRlcikgeworICB1aW50OF90IGF2MWNfYnl0ZSA9IDA7CisgIFJDSEVDSyhyZWFkZXItPlJlYWQxKCZhdjFjX2J5dGUpKTsKKyAgY29uc3QgdWludDhfdCBhdjFjX21hcmtlciA9IGF2MWNfYnl0ZSA+PiA3OworICBpZiAoIWF2MWNfbWFya2VyKSB7CisgICAgTUVESUFfTE9HKEVSUk9SLCByZWFkZXItPm1lZGlhX2xvZygpKSA8PCAiVW5zdXBwb3J0ZWQgYXYxQzogbWFya2VyIHVuc2V0LiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgdWludDhfdCBhdjFjX3ZlcnNpb24gPSBhdjFjX2J5dGUgJiAwYjAxMTExMTExOworICBpZiAoYXYxY192ZXJzaW9uICE9IDEpIHsKKyAgICBNRURJQV9MT0coRVJST1IsIHJlYWRlci0+bWVkaWFfbG9nKCkpCisgICAgICAgIDw8ICJVbnN1cHBvcnRlZCBhdjFDOiB1bmV4cGVjdGVkIHZlcnNpb24gbnVtYmVyOiAiIDw8IGF2MWNfdmVyc2lvbjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBSQ0hFQ0socmVhZGVyLT5SZWFkMSgmYXYxY19ieXRlKSk7CisgIGNvbnN0IHVpbnQ4X3Qgc2VxX3Byb2ZpbGUgPSBhdjFjX2J5dGUgPj4gNTsKKyAgc3dpdGNoIChzZXFfcHJvZmlsZSkgeworICAgIGNhc2UgMDoKKyAgICAgIHByb2ZpbGUgPSBBVjFQUk9GSUxFX1BST0ZJTEVfTUFJTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHByb2ZpbGUgPSBBVjFQUk9GSUxFX1BST0ZJTEVfSElHSDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHByb2ZpbGUgPSBBVjFQUk9GSUxFX1BST0ZJTEVfUFJPOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIE1FRElBX0xPRyhFUlJPUiwgcmVhZGVyLT5tZWRpYV9sb2coKSkKKyAgICAgICAgICA8PCAiVW5zdXBwb3J0ZWQgYXYxQzogdW5rbm93biBwcm9maWxlIDB4IiA8PCBzdGQ6OmhleCA8PCBzZXFfcHJvZmlsZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSBpZ25vcmVkIHNpbmNlIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlbSB5ZXQuCisgIHJldHVybiB0cnVlOworfQorCiBQaXhlbEFzcGVjdFJhdGlvQm94OjpQaXhlbEFzcGVjdFJhdGlvQm94KCkgOiBoX3NwYWNpbmcoMSksIHZfc3BhY2luZygxKSB7fQogUGl4ZWxBc3BlY3RSYXRpb0JveDo6flBpeGVsQXNwZWN0UmF0aW9Cb3goKSB7fQogRm91ckNDIFBpeGVsQXNwZWN0UmF0aW9Cb3g6OkJveFR5cGUoKSBjb25zdCB7IHJldHVybiBGT1VSQ0NfUEFTUDsgfQpAQCAtNjE0LDYgKzY4MSwxNSBAQAogICAgICAgICAgIG1ha2Vfc2NvcGVkX3JlZnB0cihuZXcgSEVWQ0JpdHN0cmVhbUNvbnZlcnRlcihoZXZjQ29uZmlnLlBhc3MoKSkpOwogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGNhc2UgRk9VUkNDX0FWMDE6IHsKKyAgICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgcmVhZGluZyBBVjEgY29uZmlndXJhdGlvbi4iOworICAgICAgQVYxQ29kZWNDb25maWd1cmF0aW9uUmVjb3JkIGF2MV9jb25maWc7CisgICAgICBSQ0hFQ0socmVhZGVyLT5SZWFkQ2hpbGQoJmF2MV9jb25maWcpKTsKKyAgICAgIGZyYW1lX2JpdHN0cmVhbV9jb252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgdmlkZW9fY29kZWMgPSBrQ29kZWNBVjE7CisgICAgICB2aWRlb19jb2RlY19wcm9maWxlID0gYXYxX2NvbmZpZy5wcm9maWxlOworICAgICAgYnJlYWs7CisgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICAvLyBVbmtub3duL3Vuc3VwcG9ydGVkIGZvcm1hdAogICAgICAgTUVESUFfTE9HKEVSUk9SLCByZWFkZXItPm1lZGlhX2xvZygpKSA8PCBfX0ZVTkNUSU9OX18KQEAgLTYzNCw2ICs3MTAsOCBAQAogICAgIGNhc2UgRk9VUkNDX0hFVjE6CiAgICAgY2FzZSBGT1VSQ0NfSFZDMToKICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgRk9VUkNDX0FWMDE6CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2JveF9kZWZpbml0aW9ucy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wNC9ib3hfZGVmaW5pdGlvbnMuaAppbmRleCBiMzE1MmYxLi45MDQxNWQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2JveF9kZWZpbml0aW9ucy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X2RlZmluaXRpb25zLmgKQEAgLTIyNiw2ICsyMjYsMTIgQEAKICAgVmlkZW9Db2RlY1Byb2ZpbGUgcHJvZmlsZTsKIH07CiAKK3N0cnVjdCBNRURJQV9FWFBPUlQgQVYxQ29kZWNDb25maWd1cmF0aW9uUmVjb3JkIDogQm94IHsKKyAgREVDTEFSRV9CT1hfTUVUSE9EUyhBVjFDb2RlY0NvbmZpZ3VyYXRpb25SZWNvcmQpOworCisgIFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGU7Cit9OworCiBzdHJ1Y3QgTUVESUFfRVhQT1JUIFBpeGVsQXNwZWN0UmF0aW9Cb3ggOiBCb3ggewogICBERUNMQVJFX0JPWF9NRVRIT0RTKFBpeGVsQXNwZWN0UmF0aW9Cb3gpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2ZvdXJjY3MuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvZm91cmNjcy5oCmluZGV4IDE2NDhmZjYuLmU3OWIwMDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvZm91cmNjcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvZm91cmNjcy5oCkBAIC0xNSw2ICsxNSw4IEBACiAgIEZPVVJDQ19OVUxMID0gMCwKICAgRk9VUkNDX0FDMyA9IDB4NjE2MzJkMzMsICAgLy8gImFjLTMiCiAgIEZPVVJDQ19FQUMzID0gMHg2NTYzMmQzMywgIC8vICJlYy0zIgorICBGT1VSQ0NfQVYwMSA9IDB4NjE3NjMwMzEsICAvLyAiYXYwMSIKKyAgRk9VUkNDX0FWMUMgPSAweDYxNzYzMTQzLCAgLy8gImF2MUMiCiAgIEZPVVJDQ19BVkMxID0gMHg2MTc2NjMzMSwKICAgRk9VUkNDX0FWQzMgPSAweDYxNzY2MzMzLAogICBGT1VSQ0NfQVZDQyA9IDB4NjE3NjYzNDMsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL21lZGlhMi5neXAgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhMi5neXAKaW5kZXggMjg5ZWYzYS4uYzM5YWNlOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYTIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWEyLmd5cApAQCAtNjcsNiArNjcsOCBAQAogICAgICAgICAnYmFzZS9lbmNyeXB0aW9uX3NjaGVtZS5oJywKICAgICAgICAgJ2Jhc2UvaGRyX21ldGFkYXRhLmNjJywKICAgICAgICAgJ2Jhc2UvaGRyX21ldGFkYXRhLmgnLAorICAgICAgICAnYmFzZS9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5jYycsCisgICAgICAgICdiYXNlL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmgnLAogICAgICAgICAnYmFzZS9tZWRpYV9sb2cuY2MnLAogICAgICAgICAnYmFzZS9tZWRpYV9sb2cuaCcsCiAgICAgICAgICdiYXNlL21lZGlhX3RyYWNrLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5jYwppbmRleCAxMzA4YjRkLi5kYWNmNjI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9oZWxwZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmNjCkBAIC02OSwxMSArNjksNyBAQAogICAgIDogY2xpZW50XyhuZXcgV2ViTWVkaWFQbGF5ZXJDbGllbnRTdHViKG9wZW5fY2IpKSwKICAgICAgIHBsYXllcl8obWVkaWFfbW9kdWxlLT5DcmVhdGVXZWJNZWRpYVBsYXllcihjbGllbnRfKSkgewogICBwbGF5ZXJfLT5TZXRSYXRlKDEuMCk7Ci0vLyBUT0RPOiBJbnZlc3RpZ2F0ZSBhIGJldHRlciB3YXkgdG8gZXhjbHVkZSB0aGlzIHdoZW4gU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKLS8vICAgICAgIGlzIGVuYWJsZWQuCi0jaWYgIVNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCiAgIHBsYXllcl8tPkxvYWRNZWRpYVNvdXJjZSgpOwotI2VuZGlmICAvLyAhU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKICAgcGxheWVyXy0+UGxheSgpOwogfQogCkBAIC04NywxMSArODMsNyBAQAogICAgICAgYmFzZTo6TWVzc2FnZUxvb3BQcm94eTo6Y3VycmVudCgpLCB2aWRlb191cmwsIGNzcDo6U2VjdXJpdHlDYWxsYmFjaygpLAogICAgICAgZmV0Y2hlcl9mYWN0b3J5LT5uZXR3b3JrX21vZHVsZSgpLCBsb2FkZXI6OmtOb0NPUlNNb2RlLAogICAgICAgbG9hZGVyOjpPcmlnaW4oKSkpOwotLy8gVE9ETzogSW52ZXN0aWdhdGUgYSBiZXR0ZXIgd2F5IHRvIGV4Y2x1ZGUgdGhpcyB3aGVuIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCi0vLyAgICAgICBpcyBlbmFibGVkLgotI2lmICFTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQogICBwbGF5ZXJfLT5Mb2FkUHJvZ3Jlc3NpdmUodmlkZW9fdXJsLCBkYXRhX3NvdXJjZS5QYXNzKCkpOwotI2VuZGlmICAvLyAhU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKICAgcGxheWVyXy0+UGxheSgpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9zYW5kYm94LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfc2FuZGJveC5jYwppbmRleCA3MTZiYjg0Li4yNWYzMjUwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9zYW5kYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX3NhbmRib3guY2MKQEAgLTMyOCw3ICszMjgsNyBAQAogICB2b2lkIEFwcGVuZERhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBTY29wZWRGaWxlKiBmaWxlLCBpbnQ2NCogb2Zmc2V0KSB7CiAgICAgY29uc3QgZmxvYXQga0xvd1dhdGVyTWFya0luU2Vjb25kcyA9IDUuZjsKICAgICBjb25zdCBpbnQ2NCBrTWF4Qnl0ZXNUb0FwcGVuZCA9IDEwMjQgKiAxMDI0OwotICAgIGNoYXIgYnVmZmVyW2tNYXhCeXRlc1RvQXBwZW5kXTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoa01heEJ5dGVzVG9BcHBlbmQpOwogCiAgICAgd2hpbGUgKCpvZmZzZXQgPCBmaWxlLT5HZXRTaXplKCkpIHsKICAgICAgIFJhbmdlczxUaW1lRGVsdGE+IHJhbmdlcyA9IGNodW5rX2RlbXV4ZXJfLT5HZXRCdWZmZXJlZFJhbmdlcyhpZCk7CkBAIC0zMzksMTQgKzMzOSwxNCBAQAogICAgICAgfQogICAgICAgaW50NjQgYnl0ZXNfdG9fYXBwZW5kID0KICAgICAgICAgICBzdGQ6Om1pbihrTWF4Qnl0ZXNUb0FwcGVuZCwgZmlsZS0+R2V0U2l6ZSgpIC0gKm9mZnNldCk7Ci0gICAgICBmaWxlLT5SZWFkKGJ1ZmZlciwgYnl0ZXNfdG9fYXBwZW5kKTsKKyAgICAgIGZpbGUtPlJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyLmRhdGEoKSksIGJ5dGVzX3RvX2FwcGVuZCk7CiAjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wX29mZnNldDsKLSAgICAgIGNodW5rX2RlbXV4ZXJfLT5BcHBlbmREYXRhKGlkLCByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYnVmZmVyKSwKKyAgICAgIGNodW5rX2RlbXV4ZXJfLT5BcHBlbmREYXRhKGlkLCBidWZmZXIuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fYXBwZW5kLCBiYXNlOjpUaW1lRGVsdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjprSW5maW5pdGVEdXJhdGlvbiwgJnRpbWVzdGFtcF9vZmZzZXQpOwogI2Vsc2UgICAvLyAgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCi0gICAgICBjaHVua19kZW11eGVyXy0+QXBwZW5kRGF0YShpZCwgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGJ1ZmZlciksCisgICAgICBjaHVua19kZW11eGVyXy0+QXBwZW5kRGF0YShpZCwgYnVmZmVyLmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX2FwcGVuZCk7CiAjZW5kaWYgIC8vICBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfZXZlbnQuaCBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX2V2ZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTU2OGUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfZXZlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBDT0JBTFRfTkVUV09SS19ORVRXT1JLX0VWRU5UX0hfCi0jZGVmaW5lIENPQkFMVF9ORVRXT1JLX05FVFdPUktfRVZFTlRfSF8KLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9ldmVudC5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBuZXR3b3JrIHsKLQotY2xhc3MgTmV0d29ya0V2ZW50IDogcHVibGljIGJhc2U6OkV2ZW50IHsKLSBwdWJsaWM6Ci0gIGVudW0gVHlwZSB7Ci0gICAga0Nvbm5lY3Rpb24sCi0gICAga0Rpc2Nvbm5lY3Rpb24sCi0gIH07Ci0KLSAgZXhwbGljaXQgTmV0d29ya0V2ZW50KFR5cGUgdHlwZSkgOiB0eXBlXyh0eXBlKSB7fQotICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQotCi0gIEJBU0VfRVZFTlRfU1VCQ0xBU1MoTmV0d29ya0V2ZW50KTsKLQotIHByaXZhdGU6Ci0gIFR5cGUgdHlwZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbmV0d29yawotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIENPQkFMVF9ORVRXT1JLX05FVFdPUktfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5jYwppbmRleCBmNTczNDZmLi40YTFhYzljIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmNjCkBAIC0xMzIsNyArMTMyLDcgQEAKICAgLy8gaW4gYW4gaW5jcmVhc2UgaW4gdW5yZXNwb25zaXZlbmVzcyBhbmQgaW5wdXQgbGF0ZW5jeSBvbiBzaW5nbGUtY29yZQogICAvLyBkZXZpY2VzLiAgS2VlcGluZyBpdCBhdCBub3JtYWwgc28gdGhhdCBpdCBkb2Vzbid0IHRha2UgcHJlY2VkZW5jZSBvdmVyCiAgIC8vIHVzZXIgaW50ZXJhY3Rpb24gcHJvY2Vzc2luZy4KLSAgdGhyZWFkX29wdGlvbnMucHJpb3JpdHkgPSBiYXNlOjprVGhyZWFkUHJpb3JpdHlfTm9ybWFsOworICB0aHJlYWRfb3B0aW9ucy5wcmlvcml0eSA9IGJhc2U6OmtUaHJlYWRQcmlvcml0eV9Mb3c7CiAgIHRocmVhZF8tPlN0YXJ0V2l0aE9wdGlvbnModGhyZWFkX29wdGlvbnMpOwogCiAgIGJhc2U6OldhaXRhYmxlRXZlbnQgY3JlYXRpb25fZXZlbnQodHJ1ZSwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvZ3JhcGhpY3NfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvZ3JhcGhpY3NfY29udGV4dC5oCmluZGV4IGQ5ZWEzYTcuLjE5ZmNjYzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX2NvbnRleHQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19jb250ZXh0LmgKQEAgLTM4LDYgKzM4LDggQEAKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UmVuZGVyVGFyZ2V0PiYgcmVuZGVyX3RhcmdldCkgb3ZlcnJpZGU7CiAgIHZvaWQgRmluaXNoKCkgb3ZlcnJpZGU7CiAKKyAgZmxvYXQgR2V0TWluaW11bUZyYW1lc1BlclNlY29uZCgpIG92ZXJyaWRlIHsgcmV0dXJuIDAuMGY7IH0KKwogICBTYkJsaXR0ZXJDb250ZXh0IEdldFNiQmxpdHRlckNvbnRleHQoKSBjb25zdCB7IHJldHVybiBjb250ZXh0XzsgfQogICBTYkJsaXR0ZXJEZXZpY2UgR2V0U2JCbGl0dGVyRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gZGV2aWNlXzsgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuY2MKaW5kZXggNDJjMDE5YS4uMjNkNGQ4NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5jYwpAQCAtODEsNiArODEsMTAgQEAKICAgICBBTk5PVEFURV9TQ09QRURfTUVNT1JZX0xFQUs7CiAgICAgQ29tcHV0ZVJlYWRQaXhlbHNOZWVkVmVydGljYWxGbGlwKCk7CiAgIH0KKworICBnZXRfbWluaW11bV9mcmFtZXNfcGVyX3NlY29uZF8gPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxkZWNsdHlwZShnZXRfbWluaW11bV9mcmFtZXNfcGVyX3NlY29uZF8pPigKKyAgICAgICAgICBlZ2xHZXRQcm9jQWRkcmVzcygiZWdsR2V0TWluaW11bUZyYW1lc1BlclNlY29uZENPQkFMVCIpKTsKIH0KIAogR3JhcGhpY3NTeXN0ZW1FR0wqIEdyYXBoaWNzQ29udGV4dEVHTDo6c3lzdGVtX2VnbCgpIHsKQEAgLTQ4NSw2ICs0ODksMTQgQEAKICAgR0xfQ0FMTChnbEZpbmlzaCgpKTsKIH0KIAorZmxvYXQgR3JhcGhpY3NDb250ZXh0RUdMOjpHZXRNaW5pbXVtRnJhbWVzUGVyU2Vjb25kKCkgeworICBpZiAoZ2V0X21pbmltdW1fZnJhbWVzX3Blcl9zZWNvbmRfKSB7CisgICAgcmV0dXJuIGdldF9taW5pbXVtX2ZyYW1lc19wZXJfc2Vjb25kXyhkaXNwbGF5Xyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKwogdm9pZCBHcmFwaGljc0NvbnRleHRFR0w6OkJsaXQoR0x1aW50IHRleHR1cmUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewogICAvLyBSZW5kZXIgYSB0ZXh0dXJlIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHJlY3RhbmdsZSBvbiB0aGUgcmVuZGVyIHRhcmdldC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgKaW5kZXggMmVkZDI5Ny4uZWVjZmJmYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgKQEAgLTY1LDYgKzY1LDggQEAKIAogICB2b2lkIEZpbmlzaCgpIG92ZXJyaWRlOwogCisgIGZsb2F0IEdldE1pbmltdW1GcmFtZXNQZXJTZWNvbmQoKSBvdmVycmlkZTsKKwogICAvLyBIZWxwZXIgY2xhc3MgdG8gYWxsb3cgb25lIHRvIGNyZWF0ZSBhIFJBSUkgb2JqZWN0IHRoYXQgd2lsbCBhY3F1aXJlIHRoZQogICAvLyBjdXJyZW50IGNvbnRleHQgdXBvbiBjb25zdHJ1Y3Rpb24gYW5kIHJlbGVhc2UgaXQgdXBvbiBkZXN0cnVjdGlvbi4KICAgY2xhc3MgU2NvcGVkTWFrZUN1cnJlbnQgewpAQCAtMTcyLDYgKzE3NCw5IEBACiAgIEdMdWludCBibGl0X3Byb2dyYW1fOwogICBHTHVpbnQgYmxpdF92ZXJ0ZXhfYnVmZmVyXzsKIAorICAvLyBDdXN0b20gRUdMIGV4dGVuc2lvbiB0byBhbGxvdyBwbGF0Zm9ybXMgdG8gcmVxdWVzdCBhIG1pbmltdW0gZnJhbWUgcmF0ZS4KKyAgRUdMaW50ICgqZ2V0X21pbmltdW1fZnJhbWVzX3Blcl9zZWNvbmRfKShFR0xEaXNwbGF5IGRpc3BsYXkpID0gbnVsbHB0cjsKKwogICAvLyBMYXppbHkgZXZhbHVhdGUgd2hldGhlciB3ZSBuZWVkIHRvIGRvIGEgdmVydGljYWwgZmxpcCB3aGVuIGNhbGxpbmcKICAgLy8gZ2xSZWFkUGl4ZWxzKCksIGFuZCBjYWNoZSB0aGUgcmVzdWx0IGhlcmUgd2hlbiB0aGF0IHF1ZXN0aW9uIGlzIGFuc3dlcmVkLgogICBiYXNlOjpvcHRpb25hbDxib29sPiByZWFkX3BpeGVsc19uZWVkc192ZXJ0aWNhbF9mbGlwXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5jYwppbmRleCBiNzQzMTNmLi4xZjU3OGZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YV9jcHUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfY3B1LmNjCkBAIC01OSwxNiArNTksMTMgQEAKICAgfQogCiAgIEdMaW50IG9yaWdpbmFsX3RleHR1cmVfYWxpZ25tZW50OwotICBnbEdldEludGVnZXJ2KEdMX1VOUEFDS19BTElHTk1FTlQsICZvcmlnaW5hbF90ZXh0dXJlX2FsaWdubWVudCk7Ci0gIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgIEdMX0NBTEwoZ2xHZXRJbnRlZ2VydihHTF9VTlBBQ0tfQUxJR05NRU5ULCAmb3JpZ2luYWxfdGV4dHVyZV9hbGlnbm1lbnQpKTsKKyAgR0xfQ0FMTChnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpKTsKIAogICAvLyBDb3B5IHBpeGVsIGRhdGEgb3ZlciBmcm9tIHRoZSB1c2VyIHByb3ZpZGVkIHNvdXJjZSBkYXRhIGludG8gdGhlIE9wZW5HTAogICAvLyBkcml2ZXIgdG8gYmUgdXNlZCBhcyBhIHRleHR1cmUgZnJvbSBub3cgb24uCiAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBmb3JtYXQsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgMCwgZm9ybWF0LAogICAgICAgICAgICAgICAgR0xfVU5TSUdORURfQllURSwgZGF0YSk7Ci0KLSAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBvcmlnaW5hbF90ZXh0dXJlX2FsaWdubWVudCk7Ci0KICAgaWYgKGdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUikgewogICAgIExPRyhFUlJPUikgPDwgIkVycm9yIGNhbGxpbmcgZ2xUZXhJbWFnZTJEKHNpemUgPSAoIiA8PCBzaXplLndpZHRoKCkgPDwgIiwgIgogICAgICAgICAgICAgICAgPDwgc2l6ZS5oZWlnaHQoKSA8PCAiKSkiOwpAQCAtNzcsNiArNzQsOCBAQAogICAgIHRleHR1cmVfaGFuZGxlID0gMDsKICAgfQogCisgIEdMX0NBTEwoZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBvcmlnaW5hbF90ZXh0dXJlX2FsaWdubWVudCkpOworCiAgIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKSk7CiAKICAgcmV0dXJuIHRleHR1cmVfaGFuZGxlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19jb250ZXh0LmgKaW5kZXggNjgzMDIzMi4uYmZjZmQ2MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3NfY29udGV4dC5oCkBAIC03NCw2ICs3NCwxNCBAQAogICAvLyBXYWl0cyB1bnRpbCBhbGwgZHJhd2luZyBpcyBmaW5pc2hlZC4KICAgdmlydHVhbCB2b2lkIEZpbmlzaCgpID0gMDsKIAorICAvLyBHZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyYW1lcyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCBwZXIgc2Vjb25kLiBUaGlzCisgIC8vIHZhbHVlIGNhbiBiZSBkeW5hbWljIGFuZCBtdXN0IGJlIHF1ZXJpZWQgcGVyaW9kaWNhbGx5LiBUaGlzIGNhbiBiZSB1c2VkCisgIC8vIHRvIGZvcmNlIHRoZSByYXN0ZXJpemVyIHRvIHByZXNlbnQgYSBuZXcgZnJhbWUgZXZlbiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkCisgIC8vIHZpc3VhbGx5LiBEdWUgdG8gdGhlIGltcHJlY2lzaW9uIG9mIHRocmVhZCBzY2hlZHVsaW5nLCBpdCBtYXkgYmUgbmVjZXNzYXJ5CisgIC8vIHRvIHNwZWNpZnkgYSBoaWdoZXIgbWluaW11bSBmcHMgdG8gZW5zdXJlIGZyYW1lcyBhcmVuJ3Qgc2tpcHBlZCB3aGVuIHRoZQorICAvLyB0aHJvdHRsaW5nIGxvZ2ljIGlzIGV4ZWN1dGVkIGEgbGl0dGxlIHRvbyBlYXJseS4KKyAgdmlydHVhbCBmbG9hdCBHZXRNaW5pbXVtRnJhbWVzUGVyU2Vjb25kKCkgPSAwOworCiAgcHJpdmF0ZToKICAgR3JhcGhpY3NTeXN0ZW0qIHN5c3RlbV87CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHRfc3R1Yi5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHRfc3R1Yi5oCmluZGV4IDkwZTkzNjMuLjgwMjNjYmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19jb250ZXh0X3N0dWIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3NfY29udGV4dF9zdHViLmgKQEAgLTQ1LDYgKzQ1LDggQEAKICAgfQogCiAgIHZvaWQgRmluaXNoKCkgb3ZlcnJpZGUge30KKworICBmbG9hdCBHZXRNaW5pbXVtRnJhbWVzUGVyU2Vjb25kKCkgb3ZlcnJpZGUgeyByZXR1cm4gMC4wZjsgfQogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmNjCmluZGV4IGRiY2ZkM2EuLjU0MmU4MTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZS5jYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAKICAgU3VibWlzc2lvbiBzdWJtaXNzaW9uID0gU3VibWlzc2lvbihhbmltYXRlX25vZGUpOwogICAvLyBSYXN0ZXJpemUgdGhpcyBzdWJtaXNzaW9uIGludG8gdGhlIG5ld2x5IGNyZWF0ZWQgdGFyZ2V0LgotICBSYXN0ZXJpemVTdWJtaXNzaW9uVG9SZW5kZXJUYXJnZXQoc3VibWlzc2lvbiwgb2Zmc2NyZWVuX3RhcmdldCk7CisgIFJhc3Rlcml6ZVN1Ym1pc3Npb25Ub1JlbmRlclRhcmdldChzdWJtaXNzaW9uLCBvZmZzY3JlZW5fdGFyZ2V0LCB0cnVlKTsKIAogICAvLyBMb2FkIHRoZSB0ZXh0dXJlJ3MgcGl4ZWwgZGF0YSBpbnRvIGEgQ1BVIG1lbW9yeSBidWZmZXIgYW5kIHJldHVybiBpdC4KICAgY29tcGxldGUuUnVuKGdyYXBoaWNzX2NvbnRleHRfLT5Eb3dubG9hZFBpeGVsRGF0YUFzUkdCQShvZmZzY3JlZW5fdGFyZ2V0KSwKQEAgLTMwOSwxMiArMzA5LDI0IEBACiAgIGJvb2wgaXNfbmV3X3JlbmRlcl90cmVlID0gc3VibWlzc2lvbi5yZW5kZXJfdHJlZSAhPSBsYXN0X3JlbmRlcl90cmVlXzsKICAgYm9vbCBoYXNfcmVuZGVyX3RyZWVfY2hhbmdlZCA9CiAgICAgICAhbGFzdF9hbmltYXRpb25zX2V4cGlyZWRfIHx8IGlzX25ld19yZW5kZXJfdHJlZTsKKyAgYm9vbCBmb3JjZV9yYXN0ZXJpemUgPSBzdWJtaXRfZXZlbl9pZl9yZW5kZXJfdHJlZV9pc191bmNoYW5nZWRfIHx8CisgICAgICBmcHNfb3ZlcmxheV91cGRhdGVfcGVuZGluZ187CisKKyAgZmxvYXQgbWluaW11bV9mcHMgPSBncmFwaGljc19jb250ZXh0XyA/CisgICAgICBncmFwaGljc19jb250ZXh0Xy0+R2V0TWluaW11bUZyYW1lc1BlclNlY29uZCgpIDogMDsKKyAgaWYgKG1pbmltdW1fZnBzID4gMCkgeworICAgIGJhc2U6OlRpbWVEZWx0YSBtYXhfdGltZV9iZXR3ZWVuX3Jhc3Rlcml6ZSA9CisgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHNEKDEuMCAvIG1pbmltdW1fZnBzKTsKKyAgICBpZiAoc3RhcnRfcmFzdGVyaXplX3RpbWUgLSBsYXN0X3Jhc3Rlcml6ZV90aW1lXyA+CisgICAgICAgIG1heF90aW1lX2JldHdlZW5fcmFzdGVyaXplKSB7CisgICAgICBmb3JjZV9yYXN0ZXJpemUgPSB0cnVlOworICAgIH0KKyAgfQogCiAgIC8vIElmIG91ciByZW5kZXIgdHJlZSBoYXNuJ3QgY2hhbmdlZCBmcm9tIHRoZSBvbmUgdGhhdCB3YXMgcHJldmlvdXNseQogICAvLyByZW5kZXJlZCBhbmQgaXQncyBva2F5IG9uIHRoaXMgc3lzdGVtIHRvIG5vdCBmbGlwIHRoZSBkaXNwbGF5IGJ1ZmZlcgogICAvLyBmcmVxdWVudGx5LCB0aGVuIHdlIGNhbiBqdXN0IG5vdCBkbyBhbnl0aGluZyBoZXJlLgotICBpZiAoZnBzX292ZXJsYXlfdXBkYXRlX3BlbmRpbmdfIHx8IHN1Ym1pdF9ldmVuX2lmX3JlbmRlcl90cmVlX2lzX3VuY2hhbmdlZF8gfHwKLSAgICAgIGhhc19yZW5kZXJfdHJlZV9jaGFuZ2VkKSB7CisgIGlmIChmb3JjZV9yYXN0ZXJpemUgfHwgaGFzX3JlbmRlcl90cmVlX2NoYW5nZWQpIHsKICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBhbmltYXRpb25zIGluIHRoZSByZW5kZXIgdHJlZSB0aGF0IGlzIGJlaW5nIHJhc3Rlcml6ZWQKICAgICAvLyBhcmUgYWN0aXZlLgogICAgIHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZSogYW5pbWF0ZV9ub2RlID0KQEAgLTMyMiw4ICszMzQsMTEgQEAKICAgICAgICAgICAgIHN1Ym1pc3Npb24ucmVuZGVyX3RyZWUuZ2V0KCkpOwogCiAgICAgLy8gUmFzdGVyaXplIHRoZSBsYXN0IHN1Ym1pdHRlZCByZW5kZXIgdHJlZS4KLSAgICBib29sIGRpZF9yYXN0ZXJpemUgPQotICAgICAgICBSYXN0ZXJpemVTdWJtaXNzaW9uVG9SZW5kZXJUYXJnZXQoc3VibWlzc2lvbiwgcmVuZGVyX3RhcmdldF8pOworICAgIGJvb2wgZGlkX3Jhc3Rlcml6ZSA9IFJhc3Rlcml6ZVN1Ym1pc3Npb25Ub1JlbmRlclRhcmdldCgKKyAgICAgICAgc3VibWlzc2lvbiwgcmVuZGVyX3RhcmdldF8sIGZvcmNlX3Jhc3Rlcml6ZSk7CisgICAgaWYgKGRpZF9yYXN0ZXJpemUpIHsKKyAgICAgIGxhc3RfcmFzdGVyaXplX3RpbWVfID0gc3RhcnRfcmFzdGVyaXplX3RpbWU7CisgICAgfQogCiAgICAgYm9vbCBhbmltYXRpb25zX2V4cGlyZWQgPSBhbmltYXRlX25vZGUtPmV4cGlyeSgpIDw9IHN1Ym1pc3Npb24udGltZV9vZmZzZXQ7CiAgICAgYm9vbCBzdGF0X3RyYWNrZWRfYW5pbWF0aW9uc19leHBpcmVkID0KQEAgLTQxMiw3ICs0MjcsOCBAQAogCiBib29sIFBpcGVsaW5lOjpSYXN0ZXJpemVTdWJtaXNzaW9uVG9SZW5kZXJUYXJnZXQoCiAgICAgY29uc3QgU3VibWlzc2lvbiYgc3VibWlzc2lvbiwKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhY2tlbmQ6OlJlbmRlclRhcmdldD4mIHJlbmRlcl90YXJnZXQpIHsKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhY2tlbmQ6OlJlbmRlclRhcmdldD4mIHJlbmRlcl90YXJnZXQsCisgICAgYm9vbCBmb3JjZV9yYXN0ZXJpemUpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwKICAgICAgICAgICAgICAgICJQaXBlbGluZTo6UmFzdGVyaXplU3VibWlzc2lvblRvUmVuZGVyVGFyZ2V0KCkiKTsKIApAQCAtNDQyLDkgKzQ1OCw3IEBACiAgIHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZTo6QW5pbWF0ZVJlc3VsdHMgcmVzdWx0cyA9CiAgICAgICBhbmltYXRlX25vZGUtPkFwcGx5KHN1Ym1pc3Npb24udGltZV9vZmZzZXQpOwogCi0gIGlmIChyZXN1bHRzLmFuaW1hdGVkID09IGxhc3RfYW5pbWF0ZWRfcmVuZGVyX3RyZWVfICYmCi0gICAgICAhc3VibWl0X2V2ZW5faWZfcmVuZGVyX3RyZWVfaXNfdW5jaGFuZ2VkXyAmJgotICAgICAgIWZwc19vdmVybGF5X3VwZGF0ZV9wZW5kaW5nXykgeworICBpZiAocmVzdWx0cy5hbmltYXRlZCA9PSBsYXN0X2FuaW1hdGVkX3JlbmRlcl90cmVlXyAmJiAhZm9yY2VfcmFzdGVyaXplKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIGxhc3RfYW5pbWF0ZWRfcmVuZGVyX3RyZWVfID0gcmVzdWx0cy5hbmltYXRlZDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuaAppbmRleCAwZTliOWFlLi42MDAwYjE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZS5oCkBAIC0xMzIsNyArMTMyLDggQEAKICAgLy8gUmV0dXJucyB0cnVlIG9ubHkgaWYgYSByYXN0ZXJpemF0aW9uIGFjdHVhbGx5IHRvb2sgcGxhY2UuCiAgIGJvb2wgUmFzdGVyaXplU3VibWlzc2lvblRvUmVuZGVyVGFyZ2V0KAogICAgICAgY29uc3QgU3VibWlzc2lvbiYgcmVuZGVyX3RyZWVfc3VibWlzc2lvbiwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFja2VuZDo6UmVuZGVyVGFyZ2V0PiYgcmVuZGVyX3RhcmdldCk7CisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhY2tlbmQ6OlJlbmRlclRhcmdldD4mIHJlbmRlcl90YXJnZXQsCisgICAgICBib29sIGZvcmNlX3Jhc3Rlcml6ZSk7CiAKICAgLy8gVXBkYXRlcyB0aGUgcmFzdGVyaXplciB0aW1lciBzdGF0cyBhY2NvcmRpbmcgdG8gdGhlIHxzdGFydF90aW1lfCBhbmQKICAgLy8gfGVuZF90aW1lfCBvZiB0aGUgbW9zdCByZWNlbnQgcmFzdGVyaXplIGNhbGwuCkBAIC0zMTEsNiArMzEyLDEyIEBACiAgIC8vIGEgZGlzY29udGludWl0eSBpbiBhbmltYXRpb25zIGFuZCByZXNldCBvdXIgc3VibWlzc2lvbiBxdWV1ZSwgcG9zc2libHkKICAgLy8gd2l0aCBuZXcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgbmV3IHxUaW1lbGluZUluZm98LgogICBTdWJtaXNzaW9uOjpUaW1lbGluZUluZm8gY3VycmVudF90aW1lbGluZV9pbmZvXzsKKworICAvLyBUaGlzIHRpbWVzdGFtcCByZXByZXNlbnRzIHRoZSBsYXN0IHRpbWUgdGhlIHBpcGVsaW5lIHJhc3Rlcml6ZWQgYQorICAvLyByZW5kZXIgdHJlZSB0byByZW5kZXJfdGFyZ2V0Xy4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBsYXN0X3JlbmRlcl90aW1lXworICAvLyB3aGljaCBpcyBzcGVjaWZpYyB0byB0aGUgY3VycmVudCBzdWJtaXNzaW9uIGFuZCBpcyByZXNldCB3aGVuZXZlciBhIG5ldworICAvLyByZW5kZXIgdHJlZSBpcyBzdWJtaXR0ZWQuCisgIGJhc2U6OlRpbWVUaWNrcyBsYXN0X3Jhc3Rlcml6ZV90aW1lXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC90ZXh0dXJlZF9tZXNoX3JlbmRlcmVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC90ZXh0dXJlZF9tZXNoX3JlbmRlcmVyLmNjCmluZGV4IGFiOTE0NzguLjIxOWUxYzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3RleHR1cmVkX21lc2hfcmVuZGVyZXIuY2MKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogbmFtZXNwYWNlIHsKIHZvaWQgQ29udmVydENvbnRlbnRSZWdpb25Ub1NjYWxlVHJhbnNsYXRlVmVjdG9yKAotICAgIGNvbnN0IG1hdGg6OlJlY3QqIGNvbnRlbnRfcmVnaW9uLCBjb25zdCBtYXRoOjpTaXplJiB0ZXh0dXJlX3NpemUsCisgICAgY29uc3QgbWF0aDo6UmVjdEYqIGNvbnRlbnRfcmVnaW9uLCBjb25zdCBtYXRoOjpTaXplJiB0ZXh0dXJlX3NpemUsCiAgICAgZmxvYXQqIG91dF92ZWM0KSB7CiAgIGlmICghY29udGVudF9yZWdpb24pIHsKICAgICAvLyBJZiBubyBjb250ZW50IHJlZ2lvbiBpcyBwcm92aWRlZCwgdXNlIHRoZSBpZGVudGl0eSBtYXRyaXguCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3RleHR1cmVkX21lc2hfcmVuZGVyZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5oCmluZGV4IGRhOGE5NmYuLjY1ZDg4NTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5oCkBAIC02OCw3ICs2OCw3IEBACiAKICAgICBzdHJ1Y3QgVGV4dHVyZSB7CiAgICAgICBjb25zdCBiYWNrZW5kOjpUZXh0dXJlRUdMKiB0ZXh0dXJlOwotICAgICAgbWF0aDo6UmVjdCBjb250ZW50X3JlZ2lvbjsKKyAgICAgIG1hdGg6OlJlY3RGIGNvbnRlbnRfcmVnaW9uOwogICAgIH07CiAKICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQgdGV4dHVyZXMgaW4gdGhpcyBpbWFnZSwgYmFzZWQgb24gaXRzIGZvcm1hdC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuY2MKaW5kZXggNTRmNjY0My4uODE1NTRiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuY2MKQEAgLTMyOSw3ICszMjksOCBAQAogICAgIHNjb3BlZF9wdHI8YmFja2VuZDo6VGV4dHVyZUVHTD4gdGV4dHVyZSwKICAgICByZW5kZXJfdHJlZTo6QWxwaGFGb3JtYXQgYWxwaGFfZm9ybWF0LAogICAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCogY29iYWx0X2NvbnRleHQsIEdyQ29udGV4dCogZ3JfY29udGV4dCwKLSAgICBzY29wZWRfcHRyPG1hdGg6OlJlY3Q+IGNvbnRlbnRfcmVnaW9uLCBNZXNzYWdlTG9vcCogcmFzdGVyaXplcl9tZXNzYWdlX2xvb3AsCisgICAgc2NvcGVkX3B0cjxtYXRoOjpSZWN0Rj4gY29udGVudF9yZWdpb24sCisgICAgTWVzc2FnZUxvb3AqIHJhc3Rlcml6ZXJfbWVzc2FnZV9sb29wLAogICAgIGJhc2U6Om9wdGlvbmFsPEFsdGVybmF0ZVJnYmFGb3JtYXQ+IGFsdGVybmF0ZV9yZ2JhX2Zvcm1hdCkKICAgICA6IGlzX29wYXF1ZV8oYWxwaGFfZm9ybWF0ID09IHJlbmRlcl90cmVlOjprQWxwaGFGb3JtYXRPcGFxdWUpLAogICAgICAgY29udGVudF9yZWdpb25fKGNvbnRlbnRfcmVnaW9uLlBhc3MoKSksCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuaAppbmRleCA3OTBiMTYyLi4wZmRlYWQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgc2NvcGVkX3B0cjxiYWNrZW5kOjpUZXh0dXJlRUdMPiB0ZXh0dXJlLAogICAgICAgcmVuZGVyX3RyZWU6OkFscGhhRm9ybWF0IGFscGhhX2Zvcm1hdCwKICAgICAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCogY29iYWx0X2NvbnRleHQsIEdyQ29udGV4dCogZ3JfY29udGV4dCwKLSAgICAgIHNjb3BlZF9wdHI8bWF0aDo6UmVjdD4gY29udGVudF9yZWdpb24sCisgICAgICBzY29wZWRfcHRyPG1hdGg6OlJlY3RGPiBjb250ZW50X3JlZ2lvbiwKICAgICAgIE1lc3NhZ2VMb29wKiByYXN0ZXJpemVyX21lc3NhZ2VfbG9vcCwKICAgICAgIGJhc2U6Om9wdGlvbmFsPEFsdGVybmF0ZVJnYmFGb3JtYXQ+IGFsdGVybmF0ZV9yZ2JhX2Zvcm1hdCk7CiAgIEhhcmR3YXJlRnJvbnRlbmRJbWFnZSgKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiAgIGNvbnN0IGJhY2tlbmQ6OlRleHR1cmVFR0wqIEdldFRleHR1cmVFR0woKSBjb25zdCBvdmVycmlkZTsKIAotICBjb25zdCBtYXRoOjpSZWN0KiBHZXRDb250ZW50UmVnaW9uKCkgY29uc3Qgb3ZlcnJpZGUgeworICBjb25zdCBtYXRoOjpSZWN0RiogR2V0Q29udGVudFJlZ2lvbigpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gY29udGVudF9yZWdpb25fLmdldCgpOwogICB9CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAvLyBBbiBvcHRpb25hbCByZWN0YW5nbGUsIGluIHBpeGVsIGNvb3JkaW5hdGVzICh3aXRoIHRoZSB0b3AtbGVmdCBhcyB0aGUKICAgLy8gb3JpZ2luKSB0aGF0IGluZGljYXRlcyB3aGVyZSBpbiB0aGlzIGltYWdlIHRoZSB2YWxpZCBjb250ZW50IGlzIGNvbnRhaW5lZC4KICAgLy8gVXN1YWxseSB0aGlzIGlzIG9ubHkgc2V0IGZyb20gcGxhdGZvcm0tc3BlY2lmaWMgU2JEZWNvZGVUYXJnZXRzLgotICBzY29wZWRfcHRyPG1hdGg6OlJlY3Q+IGNvbnRlbnRfcmVnaW9uXzsKKyAgc2NvcGVkX3B0cjxtYXRoOjpSZWN0Rj4gY29udGVudF9yZWdpb25fOwogCiAgIC8vIEluIHNvbWUgY2FzZXMgd2hlcmUgSGFyZHdhcmVGcm9udGVuZEltYWdlIHdyYXBzIGEgUkdCQSB0ZXh0dXJlLCB0aGUgdGV4dHVyZQogICAvLyBhY3R1YWxseSBjb250YWlucyBwaXhlbCBkYXRhIGluIGEgbm9uLVJHQkEgZm9ybWF0LCBsaWtlIFVZVlkgZm9yIGV4YW1wbGUuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9tZXNoLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfbWVzaC5jYwppbmRleCAwOGRlY2ViLi4zZDM5ZDlmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9tZXNoLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX21lc2guY2MKQEAgLTI5LDkgKzI5LDEyIEBACiAgIGlmICh2ZXJ0aWNlc18pIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPih2ZXJ0aWNlc18tPnNpemUoKSAqIHNpemVvZih2ZXJ0aWNlc18tPmZyb250KCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHJhd19tb2RlXykpOworICB9IGVsc2UgaWYgKHZib18pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPih2Ym9fLT5HZXRWZXJ0ZXhDb3VudCgpICogNSAqIHNpemVvZihmbG9hdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkcmF3X21vZGVfKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CiAgIH0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMj4odmJvXy0+R2V0VmVydGV4Q291bnQoKSAqIDUgKiBzaXplb2YoZmxvYXQpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRyYXdfbW9kZV8pKTsKIH0KIAogY29uc3QgVmVydGV4QnVmZmVyT2JqZWN0KiBIYXJkd2FyZU1lc2g6OkdldFZCTygpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IDY1Y2UxYzIuLmI0ZmIyYjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMjM3LDE2ICsyMzcsMTYgQEAKIC8vIEFjY29tbW9kYXRlIGZvciB0aGUgZmFjdCB0aGF0IGZvciBzb21lIGltYWdlIGZvcm1hdHMsIGxpa2UgVVlWWSwgb3VyIHRleHR1cmUKIC8vIHBpeGVsIHdpZHRoIGlzIGFjdHVhbGx5IGhhbGYgdGhlIHNpemUgc3BlY2lmaWVkIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBZCiAvLyB2YWx1ZXMgaW4gZWFjaCBwaXhlbC4KLW1hdGg6OlJlY3QgQWRqdXN0Q29udGVudFJlZ2lvbkZvckltYWdlVHlwZSgKK21hdGg6OlJlY3RGIEFkanVzdENvbnRlbnRSZWdpb25Gb3JJbWFnZVR5cGUoCiAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8QWx0ZXJuYXRlUmdiYUZvcm1hdD4mIGFsdGVybmF0ZV9yZ2JhX2Zvcm1hdCwKLSAgICBjb25zdCBtYXRoOjpSZWN0JiBjb250ZW50X3JlZ2lvbikgeworICAgIGNvbnN0IG1hdGg6OlJlY3RGJiBjb250ZW50X3JlZ2lvbikgewogICBpZiAoIWFsdGVybmF0ZV9yZ2JhX2Zvcm1hdCkgewogICAgIHJldHVybiBjb250ZW50X3JlZ2lvbjsKICAgfQogCiAgIHN3aXRjaCAoKmFsdGVybmF0ZV9yZ2JhX2Zvcm1hdCkgewogICAgIGNhc2UgQWx0ZXJuYXRlUmdiYUZvcm1hdF9VWVZZOiB7Ci0gICAgICBtYXRoOjpSZWN0IGFkanVzdGVkX2NvbnRlbnRfcmVnaW9uID0gY29udGVudF9yZWdpb247CisgICAgICBtYXRoOjpSZWN0RiBhZGp1c3RlZF9jb250ZW50X3JlZ2lvbiA9IGNvbnRlbnRfcmVnaW9uOwogICAgICAgYWRqdXN0ZWRfY29udGVudF9yZWdpb24uc2V0X3dpZHRoKGNvbnRlbnRfcmVnaW9uLndpZHRoKCkgLyAyKTsKICAgICAgIHJldHVybiBhZGp1c3RlZF9jb250ZW50X3JlZ2lvbjsKICAgICB9IGJyZWFrOwpAQCAtMjYyLDE5ICsyNjIsMTkgQEAKIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBhZGp1c3QgdGhlIGNvbnRlbnQgcmVnaW9uIHJlY3RhbmdsZSB0byBtYXRjaCBvbmx5IHRoZQogLy8gbGVmdCBleWUncyB2aWRlbyByZWdpb24sIHNpbmNlIHdlIGFyZSB1bHRpbWF0ZWx5IHByZXNlbnRpbmcgdG8gYSBtb25vc2NvcGljCiAvLyBkaXNwbGF5LgotbWF0aDo6UmVjdCBBZGp1c3RDb250ZW50UmVnaW9uRm9yU3RlcmVvTW9kZShyZW5kZXJfdHJlZTo6U3RlcmVvTW9kZSBzdGVyZW9fbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6UmVjdCYgY29udGVudF9yZWdpb24pIHsKK21hdGg6OlJlY3RGIEFkanVzdENvbnRlbnRSZWdpb25Gb3JTdGVyZW9Nb2RlKAorICAgIHJlbmRlcl90cmVlOjpTdGVyZW9Nb2RlIHN0ZXJlb19tb2RlLCBjb25zdCBtYXRoOjpSZWN0RiYgY29udGVudF9yZWdpb24pIHsKICAgc3dpdGNoIChzdGVyZW9fbW9kZSkgewogICAgIGNhc2UgcmVuZGVyX3RyZWU6OmtMZWZ0UmlnaHQ6IHsKICAgICAgIC8vIFVzZSB0aGUgbGVmdCBoYWxmIChsZWZ0IGV5ZSkgb2YgdGhlIHZpZGVvIG9ubHkuCi0gICAgICBtYXRoOjpSZWN0IGFkanVzdGVkX2NvbnRlbnRfcmVnaW9uKGNvbnRlbnRfcmVnaW9uKTsKKyAgICAgIG1hdGg6OlJlY3RGIGFkanVzdGVkX2NvbnRlbnRfcmVnaW9uKGNvbnRlbnRfcmVnaW9uKTsKICAgICAgIGFkanVzdGVkX2NvbnRlbnRfcmVnaW9uLnNldF93aWR0aChjb250ZW50X3JlZ2lvbi53aWR0aCgpIC8gMik7CiAgICAgICByZXR1cm4gYWRqdXN0ZWRfY29udGVudF9yZWdpb247CiAgICAgfQogCiAgICAgY2FzZSByZW5kZXJfdHJlZTo6a1RvcEJvdHRvbTogewogICAgICAgLy8gVXNlIHRoZSB0b3AgaGFsZiAobGVmdCBleWUpIG9mIHRoZSB2aWRlbyBvbmx5LgotICAgICAgbWF0aDo6UmVjdCBhZGp1c3RlZF9jb250ZW50X3JlZ2lvbihjb250ZW50X3JlZ2lvbik7CisgICAgICBtYXRoOjpSZWN0RiBhZGp1c3RlZF9jb250ZW50X3JlZ2lvbihjb250ZW50X3JlZ2lvbik7CiAgICAgICBhZGp1c3RlZF9jb250ZW50X3JlZ2lvbi5zZXRfaGVpZ2h0KGNvbnRlbnRfcmVnaW9uLmhlaWdodCgpIC8gMik7CiAgICAgICByZXR1cm4gYWRqdXN0ZWRfY29udGVudF9yZWdpb247CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5jYwppbmRleCAyNjMzOTU5Li5mYjNmMzUxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5jYwpAQCAtMzIxLDExICszMjEsMTEgQEAKICAgICAgICAgaW5mby5pc19vcGFxdWUgPyByZW5kZXJfdHJlZTo6a0FscGhhRm9ybWF0T3BhcXVlCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVuZGVyX3RyZWU6OmtBbHBoYUZvcm1hdFVucHJlbXVsdGlwbGllZDsKIAotICAgIHNjb3BlZF9wdHI8bWF0aDo6UmVjdD4gY29udGVudF9yZWdpb247CisgICAgc2NvcGVkX3B0cjxtYXRoOjpSZWN0Rj4gY29udGVudF9yZWdpb247CiAgICAgaWYgKHBsYW5lLmNvbnRlbnRfcmVnaW9uLmxlZnQgIT0gMCB8fCBwbGFuZS5jb250ZW50X3JlZ2lvbi50b3AgIT0gMCB8fAogICAgICAgICBwbGFuZS5jb250ZW50X3JlZ2lvbi5yaWdodCAhPSBwbGFuZS53aWR0aCB8fAogICAgICAgICBwbGFuZS5jb250ZW50X3JlZ2lvbi5ib3R0b20gIT0gcGxhbmUuaGVpZ2h0KSB7Ci0gICAgICBjb250ZW50X3JlZ2lvbi5yZXNldChuZXcgbWF0aDo6UmVjdCgKKyAgICAgIGNvbnRlbnRfcmVnaW9uLnJlc2V0KG5ldyBtYXRoOjpSZWN0RigKICAgICAgICAgICBwbGFuZS5jb250ZW50X3JlZ2lvbi5sZWZ0LCBwbGFuZS5jb250ZW50X3JlZ2lvbi50b3AsCiAgICAgICAgICAgcGxhbmUuY29udGVudF9yZWdpb24ucmlnaHQgLSBwbGFuZS5jb250ZW50X3JlZ2lvbi5sZWZ0LAogICAgICAgICAgIHBsYW5lLmNvbnRlbnRfcmVnaW9uLmJvdHRvbSAtIHBsYW5lLmNvbnRlbnRfcmVnaW9uLnRvcCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ltYWdlLmgKaW5kZXggMGM0MTRhMi4uNTVhYjg5MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9pbWFnZS5oCkBAIC04NCw3ICs4NCw3IEBACiAKICAgLy8gSWYgbm90LW51bGwsIGluZGljYXRlcyBhIHJlY3RhbmdsZSB3aXRoaW4gdGhlIGltYWdlIGluIHdoaWNoIHRoZSB2YWxpZAogICAvLyBwaXhlbCBkYXRhIGlzIHRvIGJlIGZvdW5kLgotICB2aXJ0dWFsIGNvbnN0IG1hdGg6OlJlY3QqIEdldENvbnRlbnRSZWdpb24oKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisgIHZpcnR1YWwgY29uc3QgbWF0aDo6UmVjdEYqIEdldENvbnRlbnRSZWdpb24oKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CiB9OwogCiAvLyBBIG11bHRpLXBsYW5lIGltYWdlIGlzIG9uZSB3aGVyZSBkaWZmZXJlbnQgY2hhbm5lbHMgbWF5IGhhdmUgZGlmZmVyZW50IHBsYW5lcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X2RlYnVnZ2VyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfZGVidWdnZXIuaAppbmRleCAwZDc0OWE2Li5lNDg2OWNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfZGVidWdnZXIuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfZGVidWdnZXIuaApAQCAtOTQsMjcgKzk0LDMwIEBACiAgIHZpcnR1YWwgdm9pZCBBdHRhY2goKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBEZXRhY2goKSA9IDA7CiAKKyAgLy8gRXZhbHVhdGUgSmF2YVNjcmlwdCBjb2RlIHRoYXQgaXMgcGFydCBvZiB0aGUgZGVidWdnZXIgaW1wbGVtZW50YXRpb24sIHN1Y2gKKyAgLy8gdGhhdCBpdCBkb2VzIG5vdCBnZXQgcmVwb3J0ZWQgYXMgZGVidWdnYWJsZSBzb3VyY2UuIFJldHVybnMgdHJ1ZSBvbgorICAvLyBzdWNjZXNzLCBmYWxzZSBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24uIElmIG91dF9yZXN1bHRfdXRmOCBpcyBub24tTlVMTCwgaXQKKyAgLy8gd2lsbCBiZSBzZXQgdG8gaG9sZCB0aGUgcmVzdWx0IG9mIHRoZSBzY3JpcHQgZXZhbHVhdGlvbiBpZiB0aGUgc2NyaXB0CisgIC8vIHN1Y2NlZWRzLCBvciBhbiBleGNlcHRpb24gbWVzc2FnZSBpZiBpdCBmYWlscy4KKyAgdmlydHVhbCBib29sIEV2YWx1YXRlRGVidWdnZXJTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfcmVzdWx0X3V0ZjgpID0gMDsKKwogICAvLyBGb3IgZW5naW5lcyBsaWtlIFY4IHRoYXQgZGlyZWN0bHkgaGFuZGxlIHByb3RvY29sIGNvbW1hbmRzLgogICB2aXJ0dWFsIGJvb2wgQ2FuRGlzcGF0Y2hQcm90b2NvbE1ldGhvZChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBEaXNwYXRjaFByb3RvY29sTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgPSAwOwogCisgIC8vIENyZWF0ZXMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4KKyAgLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvMS0zL1J1bnRpbWUjdHlwZS1SZW1vdGVPYmplY3QKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBDcmVhdGVSZW1vdGVPYmplY3QoY29uc3QgVmFsdWVIYW5kbGVIb2xkZXImIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdyb3VwKSA9IDA7CisKICAgLy8gRm9yIHBlcmZvcm1hbmNlIHRyYWNpbmcgb2YgSmF2YVNjcmlwdCBtZXRob2RzLgogICB2aXJ0dWFsIHZvaWQgU3RhcnRUcmFjaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2F0ZWdvcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjZURlbGVnYXRlKiB0cmFjZV9kZWxlZ2F0ZSkgPSAwOwogICB2aXJ0dWFsIHZvaWQgU3RvcFRyYWNpbmcoKSA9IDA7CiAKLSAgLy8gQ29kZSBleGVjdXRpb24gY29udHJvbC4gSW1wbGVtZW50YXRpb25zIG1heSB1c2UKLSAgLy8gfERlbGVnYXRlOjpPblNjcmlwdERlYnVnZ2VyUGF1c2V8IHRvIGhhdmUgdGhlIGRlbGVnYXRlIGhhbmRsZSB0aGUKLSAgLy8gYWN0dWFsIGJsb2NraW5nIG9mIHRoZSB0aHJlYWQgaW4gYW4gZW5naW5lLWluZGVwZW5kZW50IHdheS4KLSAgdmlydHVhbCB2b2lkIFBhdXNlKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVzdW1lKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0QnJlYWtwb2ludChjb25zdCBzdGQ6OnN0cmluZyYgc2NyaXB0X2lkLCBpbnQgbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5fbnVtYmVyKSA9IDA7CiAgIHZpcnR1YWwgUGF1c2VPbkV4Y2VwdGlvbnNTdGF0ZSBTZXRQYXVzZU9uRXhjZXB0aW9ucygKICAgICAgIFBhdXNlT25FeGNlcHRpb25zU3RhdGUgc3RhdGUpID0gMDsgIC8vIFJldHVybnMgdGhlIHByZXZpb3VzIHN0YXRlLgotICB2aXJ0dWFsIHZvaWQgU3RlcEludG8oKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTdGVwT3V0KCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgU3RlcE92ZXIoKSA9IDA7CiAKICBwcm90ZWN0ZWQ6CiAgIHZpcnR1YWwgflNjcmlwdERlYnVnZ2VyKCkge30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3NoYXJlZC9zdHViX3NjcmlwdF9kZWJ1Z2dlci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L3NoYXJlZC9zdHViX3NjcmlwdF9kZWJ1Z2dlci5jYwppbmRleCBkZmM1MzlmLi42N2YxYTQzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zaGFyZWQvc3R1Yl9zY3JpcHRfZGVidWdnZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2hhcmVkL3N0dWJfc2NyaXB0X2RlYnVnZ2VyLmNjCkBAIC0zMCw2ICszMCwxMSBAQAogICB2b2lkIEF0dGFjaCgpIG92ZXJyaWRlIHsgTk9USU1QTEVNRU5URUQoKTsgfQogICB2b2lkIERldGFjaCgpIG92ZXJyaWRlIHsgTk9USU1QTEVNRU5URUQoKTsgfQogCisgIGJvb2wgRXZhbHVhdGVEZWJ1Z2dlclNjcmlwdChjb25zdCBzdGQ6OnN0cmluZyYganNfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfcmVzdWx0X3V0ZjgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBib29sIENhbkRpc3BhdGNoUHJvdG9jb2xNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgb3ZlcnJpZGUgewogICAgIE5PVElNUExFTUVOVEVEKCk7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzgsMjYgKzQzLDIzIEBACiAgICAgTk9USU1QTEVNRU5URUQoKTsKICAgfQogCisgIHN0ZDo6c3RyaW5nIENyZWF0ZVJlbW90ZU9iamVjdChjb25zdCBWYWx1ZUhhbmRsZUhvbGRlciYgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdyb3VwKSBvdmVycmlkZSB7CisgICAgTk9USU1QTEVNRU5URUQoKTsKKyAgICByZXR1cm4gInt9IjsKKyAgfQorCiAgIHZvaWQgU3RhcnRUcmFjaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2F0ZWdvcmllcywKICAgICAgICAgICAgICAgICAgICAgVHJhY2VEZWxlZ2F0ZSogdHJhY2VfZGVsZWdhdGUpIHsKICAgICBOT1RJTVBMRU1FTlRFRCgpOwogICB9CiAgIHZvaWQgU3RvcFRyYWNpbmcoKSBvdmVycmlkZSB7IE5PVElNUExFTUVOVEVEKCk7IH0KIAotICB2b2lkIFBhdXNlKCkgb3ZlcnJpZGUgeyBOT1RJTVBMRU1FTlRFRCgpOyB9Ci0gIHZvaWQgUmVzdW1lKCkgb3ZlcnJpZGUgeyBOT1RJTVBMRU1FTlRFRCgpOyB9Ci0gIHZvaWQgU2V0QnJlYWtwb2ludChjb25zdCBzdGQ6OnN0cmluZyYgc2NyaXB0X2lkLCBpbnQgbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uX251bWJlcikgb3ZlcnJpZGUgewotICAgIE5PVElNUExFTUVOVEVEKCk7Ci0gIH0KICAgUGF1c2VPbkV4Y2VwdGlvbnNTdGF0ZSBTZXRQYXVzZU9uRXhjZXB0aW9ucygKICAgICAgIFBhdXNlT25FeGNlcHRpb25zU3RhdGUgc3RhdGUpIG92ZXJyaWRlIHsKICAgICBOT1RJTVBMRU1FTlRFRCgpOwogICAgIHJldHVybiBrTm9uZTsKICAgfQotICB2b2lkIFN0ZXBJbnRvKCkgb3ZlcnJpZGUgeyBOT1RJTVBMRU1FTlRFRCgpOyB9Ci0gIHZvaWQgU3RlcE91dCgpIG92ZXJyaWRlIHsgTk9USU1QTEVNRU5URUQoKTsgfQotICB2b2lkIFN0ZXBPdmVyKCkgb3ZlcnJpZGUgeyBOT1RJTVBMRU1FTlRFRCgpOyB9CiB9OwogCiAvLyBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZGVjbGFyZWQgaW4gcHVibGljIGludGVyZmFjZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfZ2xvYmFsX2Vudmlyb25tZW50LmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19nbG9iYWxfZW52aXJvbm1lbnQuY2MKaW5kZXggMDY0OGZjMC4uOWE1NDgyMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19nbG9iYWxfZW52aXJvbm1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19nbG9iYWxfZW52aXJvbm1lbnQuY2MKQEAgLTE5OCwxMCArMTk4LDE4IEBACiAgIHN0ZDo6dmVjdG9yPFN0YWNrRnJhbWU+IHJlc3VsdDsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFja190cmFjZS0+R2V0RnJhbWVDb3VudCgpOyBpKyspIHsKICAgICB2ODo6TG9jYWw8djg6OlN0YWNrRnJhbWU+IHN0YWNrX2ZyYW1lID0gc3RhY2tfdHJhY2UtPkdldEZyYW1lKGkpOwotICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soCi0gICAgICAgIHN0YWNrX2ZyYW1lLT5HZXRMaW5lTnVtYmVyKCksIHN0YWNrX2ZyYW1lLT5HZXRDb2x1bW4oKSwKLSAgICAgICAgKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgc3RhY2tfZnJhbWUtPkdldEZ1bmN0aW9uTmFtZSgpKSwKLSAgICAgICAgKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlXywgc3RhY2tfZnJhbWUtPkdldFNjcmlwdE5hbWUoKSkpOworICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBmdW5jdGlvbl9uYW1lKGlzb2xhdGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrX2ZyYW1lLT5HZXRGdW5jdGlvbk5hbWUoKSk7CisgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHNjcmlwdF9uYW1lKGlzb2xhdGVfLCBzdGFja19mcmFtZS0+R2V0U2NyaXB0TmFtZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9uYW1lX3N0ciwgc2NyaXB0X25hbWVfc3RyOworICAgIGlmICgqZnVuY3Rpb25fbmFtZSkgeworICAgICAgZnVuY3Rpb25fbmFtZV9zdHIgPSBzdGQ6OnN0cmluZygqZnVuY3Rpb25fbmFtZSk7CisgICAgfQorICAgIGlmICgqc2NyaXB0X25hbWUpIHsKKyAgICAgIHNjcmlwdF9uYW1lX3N0ciA9IHN0ZDo6c3RyaW5nKCpzY3JpcHRfbmFtZSk7CisgICAgfQorICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soc3RhY2tfZnJhbWUtPkdldExpbmVOdW1iZXIoKSwgc3RhY2tfZnJhbWUtPkdldENvbHVtbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZV9zdHIsIHNjcmlwdF9uYW1lX3N0cik7CiAgIH0KIAogICByZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19zY3JpcHRfZGVidWdnZXIuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX3NjcmlwdF9kZWJ1Z2dlci5jYwppbmRleCA3OTkxYzFmLi44YTI0YjRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX3NjcmlwdF9kZWJ1Z2dlci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX3NjcmlwdF9kZWJ1Z2dlci5jYwpAQCAtMTcsMTAgKzE3LDEzIEBACiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Y4Yy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Y4Yy92OGNfdHJhY2luZ19jb250cm9sbGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9pbnNwZWN0b3IvUnVudGltZS5oIiAgLy8gZ2VuZXJhdGVkCisjaW5jbHVkZSAibmIvbWVtb3J5X3Njb3BlLmgiCiAjaW5jbHVkZSAidjgvaW5jbHVkZS9saWJwbGF0Zm9ybS92OC10cmFjaW5nLmgiCiAjaW5jbHVkZSAidjgvaW5jbHVkZS92OC1pbnNwZWN0b3IuaCIKIApAQCAtMzcsNiArNDAsMjggQEAKICAgICAgIElzb2xhdGVGZWxsb3dzaGlwOjpHZXRJbnN0YW5jZSgpLT5wbGF0Zm9ybS0+R2V0VHJhY2luZ0NvbnRyb2xsZXIoKSk7CiB9CiAKKy8vIEluc3BpcmVkIGJ5IHxDb3B5Q2hhcnNVbnNpZ25lZHwgaW4gdjgvc3JjL3V0aWxzLmgKK3N0ZDo6c3RyaW5nIEZyb21TdHJpbmdWaWV3KGNvbnN0IHY4X2luc3BlY3Rvcjo6U3RyaW5nVmlldyYgc3RyaW5nX3ZpZXcpIHsKKyAgc3RkOjpzdHJpbmcgc3RyaW5nOworICBpZiAoc3RyaW5nX3ZpZXcuaXM4Qml0KCkpIHsKKyAgICBzdHJpbmcuYXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHN0cmluZ192aWV3LmNoYXJhY3RlcnM4KCkpLAorICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZpZXcubGVuZ3RoKCkpOworICB9IGVsc2UgeworICAgIHN0cmluZy5yZXNlcnZlKHN0cmluZ192aWV3Lmxlbmd0aCgpKTsKKyAgICBjb25zdCB1aW50MTZfdCogY2hhcnMgPQorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4oc3RyaW5nX3ZpZXcuY2hhcmFjdGVyczE2KCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nX3ZpZXcubGVuZ3RoKCk7IGkrKykgeworICAgICAgc3RyaW5nICs9IGNoYXJzW2ldOworICAgIH0KKyAgfQorICByZXR1cm4gc3RyaW5nOworfQorCit2OF9pbnNwZWN0b3I6OlN0cmluZ1ZpZXcgVG9TdHJpbmdWaWV3KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmcpIHsKKyAgcmV0dXJuIHY4X2luc3BlY3Rvcjo6U3RyaW5nVmlldygKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHN0cmluZy5jX3N0cigpKSwgc3RyaW5nLmxlbmd0aCgpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIFY4Y1NjcmlwdERlYnVnZ2VyOjpWOGNTY3JpcHREZWJ1Z2dlcigKQEAgLTY3LDYgKzkyLDQ4IEBACiAgIGluc3BlY3Rvcl8tPmNvbnRleHREZXN0cm95ZWQoY29udGV4dCk7CiB9CiAKK2Jvb2wgVjhjU2NyaXB0RGVidWdnZXI6OkV2YWx1YXRlRGVidWdnZXJTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfcmVzdWx0X3V0ZjgpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzY3JpcHQiLCAiVjhjU2NyaXB0RGVidWdnZXI6OkV2YWx1YXRlRGVidWdnZXJTY3JpcHQoKSIpOworCisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gZ2xvYmFsX2Vudmlyb25tZW50Xy0+aXNvbGF0ZSgpOworICBFbnRyeVNjb3BlIGVudHJ5X3Njb3BlKGlzb2xhdGUpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6VHJ5Q2F0Y2ggdHJ5X2NhdGNoKGlzb2xhdGUpOworICB2ODo6TWljcm90YXNrc1Njb3BlIG1pY3JvdGFza3NTY29wZShpc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TWljcm90YXNrc1Njb3BlOjprRG9Ob3RSdW5NaWNyb3Rhc2tzKTsKKworICB2ODo6TG9jYWw8djg6OlN0cmluZz4gc291cmNlOworICBpZiAoIXY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIGpzX2NvZGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCwganNfY29kZS5sZW5ndGgoKSkKKyAgICAgICAgICAgLlRvTG9jYWwoJnNvdXJjZSkpIHsKKyAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY29udmVydCBzb3VyY2UgY29kZSB0byBWOCBVVEYtOCBzdHJpbmcuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgIGlmICghaW5zcGVjdG9yXy0+Y29tcGlsZUFuZFJ1bkludGVybmFsU2NyaXB0KGNvbnRleHQsIHNvdXJjZSkKKyAgICAgICAgICAgLlRvTG9jYWwoJnJlc3VsdCkpIHsKKyAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXhjZXB0aW9uKHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CisgICAgc3RkOjpzdHJpbmcgc3RyaW5nKCpleGNlcHRpb24sIGV4Y2VwdGlvbi5sZW5ndGgoKSk7CisgICAgaWYgKHN0cmluZy5lbXB0eSgpKSBzdHJpbmcuYXNzaWduKCJVbmtub3duIGVycm9yIik7CisgICAgTE9HKEVSUk9SKSA8PCAiRGVidWdnZXIgc2NyaXB0IGVycm9yOiAiIDw8IHN0cmluZzsKKyAgICBpZiAob3V0X3Jlc3VsdF91dGY4KSB7CisgICAgICBvdXRfcmVzdWx0X3V0ZjgtPmFzc2lnbihzdGQ6Om1vdmUoc3RyaW5nKSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChvdXRfcmVzdWx0X3V0ZjgpIHsKKyAgICBWOGNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoaXNvbGF0ZSk7CisgICAgRnJvbUpTVmFsdWUoaXNvbGF0ZSwgcmVzdWx0LCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgb3V0X3Jlc3VsdF91dGY4KTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCiBTY3JpcHREZWJ1Z2dlcjo6UGF1c2VPbkV4Y2VwdGlvbnNTdGF0ZSBWOGNTY3JpcHREZWJ1Z2dlcjo6U2V0UGF1c2VPbkV4Y2VwdGlvbnMoCiAgICAgU2NyaXB0RGVidWdnZXI6OlBhdXNlT25FeGNlcHRpb25zU3RhdGUgc3RhdGUpIHsKICAgRENIRUNLKGluc3BlY3Rvcl9zZXNzaW9uXyk7CkBAIC04OCw2ICsxNTUsMjIgQEAKICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KG1lc3NhZ2UuY19zdHIoKSksIG1lc3NhZ2UubGVuZ3RoKCkpKTsKIH0KIAorc3RkOjpzdHJpbmcgVjhjU2NyaXB0RGVidWdnZXI6OkNyZWF0ZVJlbW90ZU9iamVjdCgKKyAgICBjb25zdCBWYWx1ZUhhbmRsZUhvbGRlciYgb2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyYgZ3JvdXApIHsKKyAgY29uc3QgVjhjVmFsdWVIYW5kbGVIb2xkZXIqIHY4X3ZhbHVlX2hhbmRsZV9ob2xkZXIgPQorICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8Y29uc3QgVjhjVmFsdWVIYW5kbGVIb2xkZXIqPigmb2JqZWN0KTsKKworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IHY4X3ZhbHVlX2hhbmRsZV9ob2xkZXItPmlzb2xhdGUoKTsKKyAgRW50cnlTY29wZSBlbnRyeV9zY29wZShpc29sYXRlKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdjhfdmFsdWUgPSB2OF92YWx1ZV9oYW5kbGVfaG9sZGVyLT52OF92YWx1ZSgpOworCisgIHN0ZDo6dW5pcXVlX3B0cjx2OF9pbnNwZWN0b3I6OnByb3RvY29sOjpSdW50aW1lOjpBUEk6OlJlbW90ZU9iamVjdD4KKyAgICAgIHJlbW90ZV9vYmplY3QgPSBpbnNwZWN0b3Jfc2Vzc2lvbl8tPndyYXBPYmplY3QoCisgICAgICAgICAgY29udGV4dCwgdjhfdmFsdWUsIFRvU3RyaW5nVmlldyhncm91cCksIGZhbHNlIC8qZ2VuZXJhdGVQcmV2aWV3Ki8pOworICByZXR1cm4gRnJvbVN0cmluZ1ZpZXcocmVtb3RlX29iamVjdC0+dG9KU09OU3RyaW5nKCktPnN0cmluZygpKTsKK30KKwogdm9pZCBWOGNTY3JpcHREZWJ1Z2dlcjo6U3RhcnRUcmFjaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2F0ZWdvcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjZURlbGVnYXRlKiB0cmFjZV9kZWxlZ2F0ZSkgewogICBWOGNUcmFjaW5nQ29udHJvbGxlciogdHJhY2luZ19jb250cm9sbGVyID0gR2V0VHJhY2luZ0NvbnRyb2xsZXIoKTsKQEAgLTE4MSwyNCArMjY0LDYgQEAKICAgfQogfQogCi0vLyBJbnNwaXJlZCBieSB8Q29weUNoYXJzVW5zaWduZWR8IGluIHY4L3NyYy91dGlscy5oCi1zdGQ6OnN0cmluZyBWOGNTY3JpcHREZWJ1Z2dlcjo6RnJvbVN0cmluZ1ZpZXcoCi0gICAgY29uc3QgdjhfaW5zcGVjdG9yOjpTdHJpbmdWaWV3JiBzdHJpbmdfdmlldykgewotICBzdGQ6OnN0cmluZyBzdHJpbmc7Ci0gIGlmIChzdHJpbmdfdmlldy5pczhCaXQoKSkgewotICAgIHN0cmluZy5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc3RyaW5nX3ZpZXcuY2hhcmFjdGVyczgoKSksCi0gICAgICAgICAgICAgICAgICBzdHJpbmdfdmlldy5sZW5ndGgoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nLnJlc2VydmUoc3RyaW5nX3ZpZXcubGVuZ3RoKCkpOwotICAgIGNvbnN0IHVpbnQxNl90KiBjaGFycyA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QqPihzdHJpbmdfdmlldy5jaGFyYWN0ZXJzMTYoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdfdmlldy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICBzdHJpbmcgKz0gY2hhcnNbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdHJpbmc7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSB2OGMKIAogLy8gU3RhdGljIGZhY3RvcnkgbWV0aG9kIGRlY2xhcmVkIGluIHB1YmxpYyBpbnRlcmZhY2UuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX3NjcmlwdF9kZWJ1Z2dlci5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19zY3JpcHRfZGVidWdnZXIuaAppbmRleCA1MDk3YTQ4Li5iYjMyNzY1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX3NjcmlwdF9kZWJ1Z2dlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfc2NyaXB0X2RlYnVnZ2VyLmgKQEAgLTM4LDI0ICszOCwyMSBAQAogICB2b2lkIEF0dGFjaCgpIG92ZXJyaWRlIHsgYXR0YWNoZWRfID0gdHJ1ZTsgfQogICB2b2lkIERldGFjaCgpIG92ZXJyaWRlIHsgYXR0YWNoZWRfID0gZmFsc2U7IH0KIAorICBib29sIEV2YWx1YXRlRGVidWdnZXJTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0X3Jlc3VsdF91dGY4KSBvdmVycmlkZTsKKwogICBib29sIENhbkRpc3BhdGNoUHJvdG9jb2xNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgb3ZlcnJpZGU7CiAgIHZvaWQgRGlzcGF0Y2hQcm90b2NvbE1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlOwogCisgIHN0ZDo6c3RyaW5nIENyZWF0ZVJlbW90ZU9iamVjdChjb25zdCBWYWx1ZUhhbmRsZUhvbGRlciYgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdyb3VwKSBvdmVycmlkZTsKKwogICB2b2lkIFN0YXJ0VHJhY2luZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNhdGVnb3JpZXMsCiAgICAgICAgICAgICAgICAgICAgIFRyYWNlRGVsZWdhdGUqIHRyYWNlX2RlbGVnYXRlKSBvdmVycmlkZTsKICAgdm9pZCBTdG9wVHJhY2luZygpIG92ZXJyaWRlOwogCi0gIHZvaWQgUGF1c2UoKSBvdmVycmlkZSB7IE5PVElNUExFTUVOVEVEKCk7IH0KLSAgdm9pZCBSZXN1bWUoKSBvdmVycmlkZSB7IE5PVElNUExFTUVOVEVEKCk7IH0KLSAgdm9pZCBTZXRCcmVha3BvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzY3JpcHRfaWQsIGludCBsaW5lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5fbnVtYmVyKSBvdmVycmlkZSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKTsKLSAgfQogICBQYXVzZU9uRXhjZXB0aW9uc1N0YXRlIFNldFBhdXNlT25FeGNlcHRpb25zKAogICAgICAgUGF1c2VPbkV4Y2VwdGlvbnNTdGF0ZSBzdGF0ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RlcEludG8oKSBvdmVycmlkZSB7IE5PVElNUExFTUVOVEVEKCk7IH0KLSAgdm9pZCBTdGVwT3V0KCkgb3ZlcnJpZGUgeyBOT1RJTVBMRU1FTlRFRCgpOyB9Ci0gIHZvaWQgU3RlcE92ZXIoKSBvdmVycmlkZSB7IE5PVElNUExFTUVOVEVEKCk7IH0KIAogICAvLyB2OF9pbnNwZWN0b3I6OlY4SW5zcGVjdG9yQ2xpZW50IGltcGxlbWVudGF0aW9uLgogICB2b2lkIHJ1bk1lc3NhZ2VMb29wT25QYXVzZShpbnQgY29udGV4dEdyb3VwSWQpIG92ZXJyaWRlOwpAQCAtNzgsOCArNzUsNiBAQAogICB2b2lkIGZsdXNoUHJvdG9jb2xOb3RpZmljYXRpb25zKCkgb3ZlcnJpZGUge30KIAogIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIEZyb21TdHJpbmdWaWV3KGNvbnN0IHY4X2luc3BlY3Rvcjo6U3RyaW5nVmlldyYgc3RyaW5nX3ZpZXcpOwotCiAgIFY4Y0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnRfOwogICBEZWxlZ2F0ZSogZGVsZWdhdGVfOwogICBzdGQ6OnVuaXF1ZV9wdHI8djhfaW5zcGVjdG9yOjpWOEluc3BlY3Rvcj4gaW5zcGVjdG9yXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2l0ZS9kb2NzL2RldmVsb3BtZW50L3NldHVwLWFuZHJvaWQubWQgYi9zcmMvY29iYWx0L3NpdGUvZG9jcy9kZXZlbG9wbWVudC9zZXR1cC1hbmRyb2lkLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDcxYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NpdGUvZG9jcy9kZXZlbG9wbWVudC9zZXR1cC1hbmRyb2lkLm1kCkBAIC0wLDAgKzEsMjU1IEBACistLS0KK2xheW91dDogZG9jCit0aXRsZTogIlNldCB1cCB5b3VyIGVudmlyb25tZW50IC0gQW5kcm9pZCIKKy0tLQorCitUaGVzZSBpbnN0cnVjdGlvbnMgZXhwbGFpbiBob3cgdG8gc2V0IHVwIENvYmFsdCBmb3IgeW91ciB3b3Jrc3RhdGlvbiBhbmQgQW5kcm9pZAorZGV2aWNlLiBUaGUgcGFja2FnZSBiZWluZyBidWlsdCBoZXJlIGlzIHJlZmVycmVkIHRvIGFzIENvQVQgKENvYmFsdCBvbiBBbmRyb2lkIFRWKS4KKworIyMgUHJlbGltaW5hcnkgU2V0dXAKKworMS4gIERvd25sb2FkICdkZXBvdF90b29scycsIHdoaWNoIGlzIHVzZWQgdG8gYnVpbGQgdGhlIENvYmFsdCBjb2RlLiBBbiBlYXN5CisgICAgb3B0aW9uIGlzIHRvIHB1dCB0aGVtIGluIGB+L2RlcG90X3Rvb2xzYC4gQ2xvbmUgdGhlIHRvb2xzLCBieSBydW5uaW5nIHRoZQorICAgIGZvbGxvd2luZyBjb21tYW5kOgorCisgICAgYGBgCisgICAgY2Qgfi8KKyAgICBnaXQgY2xvbmUgaHR0cHM6Ly9jb2JhbHQuZ29vZ2xlc291cmNlLmNvbS9kZXBvdF90b29scworICAgIGBgYAorCisxLiAgQWRkIHlvdXIgJ2RlcG90X3Rvb2xzJyBkaXJlY3RvcnkgdG8gdGhlIGVuZCBvZiB5b3VyIFBBVEggdmFyaWFibGUuIFdlCisgICAgcmVjb21tZW5kIGFkZGluZyBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHlvdXIgYC5iYXNocmNgIG9yIGAucHJvZmlsZWAgZmlsZToKKworICAgIGBgYAorICAgIFBBVEg9JHtQQVRIfTovcGF0aC90by9kZXBvdF90b29scworICAgIGBgYAorCisxLiAgRG93bmxvYWQgYW5kIGluc3RhbGwgW0FuZHJvaWQgU3R1ZGlvXShodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vKS4KKzEuICBSdW4gYGNvYmFsdC9idWlsZC9neXBfY29iYWx0IGFuZHJvaWQteDg2YCB0byBjb25maWd1cmUgdGhlIENvYmFsdCBidWlsZCwKKyAgICB3aGljaCBhbHNvIGluc3RhbGxzIHRoZSBTREsgYW5kIE5ESy4gKFRoaXMgc3RlcCB3aWxsIGhhdmUgdG8gYmUgcmVwZWF0ZWQKKyAgICB3aXRoICdhbmRyb2lkLWFybScgb3IgJ2FuZHJvaWQtYXJtNjQnIHRvIHRhcmdldCB0aG9zZSBhcmNoaXRlY3R1cmVzLikgVGhlCisgICAgU0RLIGFuZCBOREsgd2lsbCBiZSBkb3dubG9hZGVkIGFuZCBpbnN0YWxsZWQgaW50byBhIGBzdGFyYm9hcmQtdG9vbGNoYWluc2AKKyAgICBkaXJlY3RvcnkgYXMgbmVlZGVkLiBJZiBwcm9tcHRlZCwgcmVhZCBhbmQgYWNjZXB0IHRoZSBsaWNlbnNlIGFncmVlbWVudCB0bworICAgIHByb2NlZWQgZm9yd2FyZC4KKworICAgICoqTm90ZToqKiBJZiB5b3UgaGF2ZSB0cm91YmxlIGJ1aWxkaW5nIHdpdGggYW4gZXJyb3IgcmVmZXJlbmNpbmcgdGhlCisgICAgYGRlYnVnLmtleXN0b3JlYCB5b3UgbWF5IG5lZWQgdG8gc2V0IG9uZSB1cCBvbiB5b3VyIHN5c3RlbToKKworICAgIGBgYAorICAgIGtleXRvb2wgLWdlbmtleSAtdiAta2V5c3RvcmUgfi8uYW5kcm9pZC9kZWJ1Zy5rZXlzdG9yZSAtc3RvcmVwYXNzIGFuZHJvaWQgLWFsaWFzIGFuZHJvaWRkZWJ1Z2tleSAta2V5cGFzcyBhbmRyb2lkIC1rZXlhbGcgUlNBIC1rZXlzaXplIDIwNDggLXZhbGlkaXR5IDEwMDAwCisgICAgYGBgCisKKyMjIFNldHVwIHlvdXIgZGV2aWNlCisKK0NvbmZpZ3VyZSB5b3VyIGRldmljZSB0byBiZSBpbiBkZXZlbG9wZXIgbW9kZToKKworMS4gIEZyb20gYFNldHRpbmdzYCwgaW4gdGhlIGBEZXZpY2VgIHJvdywgc2VsZWN0IGBBYm91dGAuCisxLiAgU2Nyb2xsIGRvd24gdG8gYW5kIGNsaWNrIG9uIGBCdWlsZGAgc2V2ZXJhbCB0aW1lcyB1bnRpbCBhIHRvYXN0IGFwcGVhcnMgd2l0aAorICAgIHRoZSBtZXNzYWdlLCAiWW91IGFyZSBub3cgYSBkZXZlbG9wZXIuIgorMS4gIEluIHRoZSBuZXdseSBhZGRlZCAiZGV2ZWxvcGVyIG9wdGlvbnMiIHNldHRpbmdzIG1lbnUsIG1ha2Ugc3VyZSBVU0IKKyAgICBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4KKworIyMgU2V0dXAgeW91ciB3b3Jrc3RhdGlvbiBlbnZpcm9ubWVudAorCitGb3IgbWFudWFsbHkgaW5zdGFsbGluZyBBbmRyb2lkIFN0dWRpbyBhbmQgdGhlIFNESy4KKworKipOb3RlOioqIEluc3RydWN0aW9ucyBtb3ZpbmcgZm9yd2FyZCBhcmUgYXNzdW1pbmcgYSBMaW51eCBlbnZpcm9ubWVudC4KKworMS4gIENvbXBsZXRlIHRoZSBQcmVsaW1pbmFyeSBTZXR1cCBhYm92ZS4KKzEuICBMYXVuY2ggQW5kcm9pZCBTdHVkaW8uCisxLiAgQW5kcm9pZCBTdHVkaW8gbWF5IHN0aWxsIHByb21wdCB0byBpbnN0YWxsIGFuIFNESyBpZiB0aGlzIGlzIHRoZSB2ZXJ5IGZpcnN0CisgICAgdGltZSB5b3UndmUgcnVuIGl0LgorR28gYWhlYWQgYW5kIGNsaWNrICd5ZXMnIHRvIG9wZW4gdGhlIFNESyBtYW5hZ2VyIHRvIGluc3RhbGwgdGhlIGZvbGxvd2luZzoKKyAgICAqICAgRWRpdCAiQW5kcm9pZCBTREsgbG9jYXRpb24iIGFuZCBzZXQgdGhlIHBhdGggdG86CisgICAgYCRIT01FL3N0YXJib2FyZC10b29sY2hhaW5zL0FuZHJvaWRTZGtgCisgICAgICAqICBOT1RFOiBXZSB1c2UgdGhlIHNhbWUgU0RLIGZvciB0aGUgSURFIGFuZCB0aGUgZ3lwL25pbmphIGJ1aWxkLiBUaGlzCisgICAgICAgICBkaXJlY3Rvcnkgd2lsbCBhbHJlYWR5IGV4aXN0IHNpbmNlIHlvdSd2ZSBhbHJlYWR5IHJ1biBneXBfY29iYWx0IGZvciBhbgorICAgICAgICAgYW5kcm9pZCB0YXJnZXQsIHNvIHlvdSdsbCBzZWUgYSB3YXJuaW5nIGluIHRoZSBzZXR1cCB3aXphcmQgdGhhdCBhbiBTREsKKyAgICAgICAgIHdhcyBkZXRlY3RlZCwgd2hpY2ggaXMgb2theS4KKyAgICAgICAgICAqIFRoZSBwYXRoIG1heSBhbHNvIGJlIGAkSE9NRS9jb2JhbHQtdG9vbGNoYWlucy9BbmRyb2lkU2RrYCBpZiB5b3UKKyAgICAgICAgICAgIHByZXZpb3VzbHkgaGFkIGFuIG9sZGVyIGVudmlyb25tZW50IGNvbmZpZ3VyZWQgb24geW91ciBtYWNoaW5lIC0KKyAgICAgICAgICAgIHRoaXMgaXMgb2theS4KKyAgICAgICAgKiAgU2VsZWN0IGJvdGggYEFuZHJvaWQgU0RLYCBhbmQgYEFuZHJvaWQgU0RLIFBsYXRmb3JtYCAod2hhdGV2ZXIKKyAgICAgICAgICAgY3VycmVudCB2ZXJzaW9uIGlzIHByZXNlbnRlZCBzaG91bGQgYmUgZmluZSkKKyAgICAqICAgT24gdGhlIGBTREsgUGxhdGZvcm1zYCB0YWIgc2VsZWN0OgorICAgICAgICAqICBBbmRyb2lkIEFQSSAyOCAob3Igd2hhdGV2ZXIgd2FzIGFscmVhZHkgaW5zdGFsbGVkIGJ5IGRlZmF1bHQpCisgICAgKiAgIE9uIHRoZSAiU0RLIFRvb2xzIiB0YWIgc2VsZWN0CisobW9zdCBvZiB0aGVzZSBzaG91bGQgYWxyZWFkeSBiZSBpbnN0YWxsZWQgc2luY2UgeW91IGFscmVhZHkgcmFuIGd5cCk6CisgICAgICAgIDEuICBBbmRyb2lkIFNESyBCdWlsZC1Ub29scyAoZS5nLiAyOC4wLjMpCisgICAgICAgIDEuICBDTWFrZQorICAgICAgICAxLiAgTExEQgorICAgICAgICAxLiAgQW5kcm9pZCBFbXVsYXRvcgorICAgICAgICAxLiAgQW5kcm9pZCBTREsgUGxhdGZvcm0tVG9vbHMKKyAgICAgICAgMS4gIEFuZHJvaWQgU0RLIFRvb2xzCisgICAgICAgIDEuICBOREsKKyAgICAgICAgMS4gIFN1cHBvcnQgUmVwb3NpdG9yeSA+IEFuZHJvaWQgU3VwcG9ydCBSZXBvc2l0b3J5CisgICAgICAgIDEuICBTdXBwb3J0IFJlcG9zaXRvcnkgPiBHb29nbGUgUmVwb3NpdG9yeQorMS4gIEF0IHRoZSB3ZWxjb21lIHNjcmVlbiwgY2hvb3NlIHRvIG9wZW4gYW4gZXhpc3RpbmcgQW5kcm9pZCBTdHVkaW8gcHJvamVjdCwKKyAgICBhbmQgY2hvb3NlIHRoZSBwcm9qZWN0IGluIHlvdXIgQ29iYWx0IHJlcG8gYXQgYHN0YXJib2FyZC9hbmRyb2lkL2Fwa2AgKGp1c3QKKyAgICBzZWxlY3QgdGhlIGRpcmVjdG9yeSkuIFRoaXMgaXMgImNvYXQiIChDb2JhbHQgT24gQW5kcm9pZCBUVikuCisgICAgKiAgIE5PVEU6IERvIG5vdCBsZXQgaXQgdXBkYXRlIHRoZSAnQW5kcm9pZCBHcmFkbGUgUGx1Z2luJyBpZiBpdCBwcm9tcHRzIGZvcgorICAgICAgICB0aGF0LCB1c2UgdGhlICdEb24ndCByZW1pbmQgbWUgYWdhaW4nIGJ1dHRvbi4gSWYgeW91IGluYWR2ZXJ0ZW50bHkgbGV0CisgICAgICAgIGl0IHVwZ3JhZGUsIHlvdSBjYW4ganVzdCByZXZlcnQgdGhlIGNoYW5nZSB0byBgYnVpbGQuZ3JhZGxlYCBpbiB5b3VyIGdpdAorICAgICAgICByZXBvLgorMS4gIFlvdSBtYXkgc2VlIGEgcG9wdXAgIlVucmVnaXN0ZXJlZCBWQ1Mgcm9vdHMgZGV0ZWN0ZWQiIGluZGljYXRpbmcgdGhhdCBpdCBoYXMKKyAgICBkZXRlY3RlZCB0aGUgY29iYWx0IGdpdCByZXBvLiBJZiB5b3Ugd2FudCB0byB1c2UgZ2l0IGludGVncmF0aW9uIGluCisgICAgQW5kcm9pZCBTdHVkaW8sIHlvdSBjYW4gYWRkIHRoZSByb290cywgb3IgaWYgbm90IHRoZW4gY2hvb3NlIHRvIGlnbm9yZSB0aGVtLgorMS4gIElmIHlvdSBkaWRuJ3QgYWxyZWFkeSBnZXQgcHJvbXB0ZWQgdG8gaW5zdGFsbCB0aGUgU0RLLCBkbyBpdCBub3cgYnkgZ29pbmcgdG8KKyAgICBUb29scyAtPiBTREsgTWFuYWdlciAob3IKKyAgICA8aW1nIHNyYz0iL2ltYWdlcy9hbmRyb2lkLXNkay1tYW5hZ2VyLWljb24ucG5nIiBzdHlsZT0iZGlzcGxheTppbmxpbmU7Ij48L2ltZz4KKyAgICApIG9uIHRoZSB0b29sYmFyKSBhbmQgbWFraW5nIHRoZSBzYW1lIGNob2ljZXMgYXMgc2hvd24gaW4gc3RlcCA0LgorMS4gIE1ha2UgYSBuZXcgdmlydHVhbCBkZXZpY2UgKD0gZW11bGF0b3IpIHZpYQorICAgIFRvb2xzIC0+IEFWRCBNYW5hZ2VyIChvcgorICAgIDxpbWcgc3JjPSIvaW1hZ2VzL2FuZHJvaWQtYXZkLW1hbmFnZXItaWNvbi5wbmciIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmU7Ij48L2ltZz4KKyAgICBvbiB0aGUgdG9vbGJhcikuCisgICAgICAqICAgQ2F0ZWdvcnk6IFRWIC0+IEFuZHJvaWQgVFYgKDcyMHApCisgICAgICAqICAgU3lzdGVtIGltYWdlOiBQaWUgKEFQSSAyOCkgeDg2ICh5b3UnbGwgaGF2ZSB0byBkb3dubG9hZCB0aGUgaW1hZ2UpCisgICAgICAgICAgKFRoZSBjb2RlIHNob3VsZCB3b3JrIG9uIGFueSBBUEkgMjErLCBidXQgdGhlcmUncyBhIGJ1ZyBpbiB0aGUKKyAgICAgICAgICBlbXVsYXRvciBwcmV2ZW50aW5nIEFQSSAyMSBmcm9tIHdvcmtpbmcsIGJ1dCBpdCBkb2VzIHdvcmsgb24gQVBJIDIxCisgICAgICAgICAgaGFyZHdhcmUpCisgICAgICAqICAgWW91IG1heSBiZSBwcm9tcHRlZCB0byBpbnN0YWxsIHNvbWUgSW50ZWwgdmlydHVhbGl6YXRpb24gZHJpdmVycworICAgICAgICAgIGFuZC9vciBjaGFuZ2Ugc29tZSBCSU9TIHNldHRpbmdzIHRvIGVuYWJsZSBpdCwgd2hpY2ggd2lsbCByZXF1aXJlIHlvdQorICAgICAgICAgIHRvIHJlYm9vdCB5b3VyIG1hY2hpbmUuCisxLiAgUnVuIHRoaXMgQVZEIGRldmljZS4gWW91IGNhbiBrZWVwIGl0IHJ1bm5pbmcuIFJlbWVtYmVyIHRvIHJlc3RhcnQgaXQgaWYgeW91cgorICAgIG1hY2hpbmUgcmVib290cy4gKE9yIHlvdSBjYW4gc3RhcnQgaXQgd2hlbiBwcm9tcHRlZCBmb3IgdGhlIHRhcmdldCBkZXZpY2UgaWYKKyAgICBsYXVuY2hpbmcgdGhlIGFwcCBmcm9tIEFuZHJvaWQgU3R1ZGlvLikKKworIyMgQmFzaWMgQnVpbGQsIEluc3RhbGwsIGFuZCBSdW4gKGNvbW1hbmQtbGluZSBiYXNlZCkKKworMS4gIENvbXBsZXRlIHRoZSBQcmVsaW1pbmFyeSBTZXR1cCBhYm92ZQorMS4gIEdlbmVyYXRlIHRoZSBjb2JhbHQuYXBrIGJ5IGJ1aWxkaW5nIHRoZSAiY29iYWx0X2RlcGxveSIgdGFyZ2V0CisKKyAgICBgYGAKKyAgICBuaW5qYSAtQyBvdXQvYW5kcm9pZC14ODZfZ29sZCBjb2JhbHRfZGVwbG95CisgICAgYGBgCisKKyAgICBPdXRwdXQgY2FuIGJlIGZvdW5kIGluIHRoZSBjb3JyZXNwb25kaW5nIGBvdXQvYW5kcm9pZC14ODZfZ29sZGAgZGlyZWN0b3J5LgorCisgICAgKipOb3RlOioqIElmIHlvdSBoYXZlIHRyb3VibGUgYnVpbGRpbmcgd2l0aCBhbiBlcnJvciByZWZlcmVuY2luZyB0aGUKKyAgICBgZGVidWcua2V5c3RvcmVgIHlvdSBtYXkgbmVlZCB0byBzZXQgb25lIHVwIG9uIHlvdXIgc3lzdGVtOgorCisgICAgYGBgCisgICAga2V5dG9vbCAtZ2Vua2V5IC12IC1rZXlzdG9yZSB+Ly5hbmRyb2lkL2RlYnVnLmtleXN0b3JlIC1zdG9yZXBhc3MgYW5kcm9pZCAtYWxpYXMgYW5kcm9pZGRlYnVna2V5IC1rZXlwYXNzIGFuZHJvaWQgLWtleWFsZyBSU0EgLWtleXNpemUgMjA0OCAtdmFsaWRpdHkgMTAwMDAKKyAgICBgYGAKKworMS4gIEluc3RhbGwgdGhlIHJlc3VsdGluZyBBUEsgaW50byB5b3VyIHRlc3QgZGV2aWNlIHdpdGggYWRiOgorCisgICAgYGBgCisgICAgYWRiIGluc3RhbGwgb3V0L2FuZHJvaWQteDg2X2dvbGQvY29iYWx0LmFwaworICAgIGBgYAorCisxLiAgU3RhcnQgdGhlIGFwcGxpY2F0aW9uIHdpdGg6CisKKyAgICBgYGAKKyAgICBhZGIgc2hlbGwgYW0gc3RhcnQgZGV2LmNvYmFsdC5jb2F0L2Rldi5jb2JhbHQuYXBwLk1haW5BY3Rpdml0eQorICAgIGBgYAorCisxLiAgRm9yIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIHVzZSB0aGUgYC0tZXNhYCBmbGFnIHRvIHNwZWNpZnkgdGhlICJhcmdzIiBhcnJheQorICAgIGFzIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgKHdpdGggY2hhcmFjdGVycyBiYWNrc2xhc2gtZXNjYXBlZCBhcyBuZWVkZWQgdG8KKyAgICBtYWtlIGl0IHRocm91Z2ggYm90aCB0aGUgc2hlbGwgb24geW91ciB3b3Jrc3RhdGlvbiBhbmQgdGhlIHNoZWxsIG9uIHRoZQorICAgIGRldmljZSksIGUuZy46CisKKyAgICBgYGAKKyAgICBhZGIgc2hlbGwgYW0gc3RhcnQgLS1lc2EgYXJncyAtLWZsYWdfYXJnIC0tdmFsdWVfYXJnPXNvbWV0aGluZyBkZXYuY29iYWx0LmNvYXQKKyAgICBgYGAKKworMS4gIFRvIG1vbml0b3IgbG9nIG91dHB1dCwgd2F0Y2ggbG9nY2F0IGluIGFub3RoZXIgc2hlbGwgd2l0aCBhIGZpbHRlciBmb3IKKyAgICBzdGFyYm9hcmQgbWVzc2FnZXM6CisKKyAgICBgYGAKKyAgICBhZGIgbG9nY2F0IC1zIHN0YXJib2FyZDoqCisgICAgYGBgCisKKzEuICBUbyBraWxsIGFueSBleGlzdGluZyBydW5uaW5nIGFwcGxpY2F0aW9uIHByb2Nlc3MgKGV2ZW4gaWYgaXQncyBubyBsb25nZXIgdGhlCisgICAgYWN0aXZlIGFwcCkgdXNlOgorCisgICAgYGBgCisgICAgYWRiIHNoZWxsIGFtIGZvcmNlLXN0b3AgZGV2LmNvYmFsdC5jb2F0CisgICAgYGBgCisKKyMjIEJ1aWxkaW5nL3J1bm5pbmcvZGVidWdnaW5nIChBbmRyb2lkIFN0dWRpbyBJREUpCisKKzEuICBNYW51YWxseSBydW4gYGNvYmFsdC9idWlsZC9neXBfY29iYWx0IGFuZHJvaWQteDg2YCBpbiBhIHNoZWxsLiAoWW91IHNob3VsZAorICAgIGRvIHRoaXMgYWZ0ZXIgZWFjaCB0aW1lIHlvdSBzeW5jIHlvdXIgcmVwbykKKzEuICBGcm9tIHRoZSBpbml0aWFsIHNldHVwIGFib3ZlLCB5b3Ugc2hvdWxkIGhhdmUgb3BlbmVkIHRoZSBBbmRyb2lkIFN0dWRpbworICAgIHByb2plY3QgY2hlY2tlZCBpbiBhdCBgc3RhcmJvYXJkL2FuZHJvaWQvYXBrYC4KKzEuICBJbiB0aGUgc2lkZWJhciBvbiB0aGUgbGVmdCwgeW91IHNob3VsZCBzZWUgYGFwcGAgYXBwZWFyIGFzIGJvbGRlZCB0b3AtbGV2ZWwKKyAgICBpdGVtLiAgSWYgeW91IGRvbid0IHNlZSB0aGlzLCByZXN0YXJ0IEFuZHJvaWQgU3R1ZGlvLgorMS4gIElmIHlvdSBkaWRuJ3QgaW5zdGFsbCB5b3VyIENvYmFsdCBkZXBvdF90b29scyBpbiB0aGUgc3RhbmRhcmQgbG9jYXRpb24KKyAgICAoYCRIT01FL2RlcG90X3Rvb2xzYCksIHRoZW4gbWFrZSBgc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC8uY29iYWx0cmNgIGFuZAorICAgIHNldCB0aGUgYERFUE9UX1RPT0xTYCBlbnZ2YXIgdG8gdGhlIHBhdGggdG8gd2hlcmUgeW91IGluc3RhbGxlZCB0aGVtIChvcgorICAgIG1ha2UgYSBzeW1saW5rIGluIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiB0byB3aGVyZSB5b3UgaGF2ZSB0aGVtKS4KKzEuICBUbyBydW4gdGhlIGFwcCBhbmQgYXR0YWNoIHRoZSBkZWJ1Z2dlcjogUnVuIC0+IERlYnVnICdhcHAnIChvcgorICAgIDxpbWcgc3JjPSIvaW1hZ2VzL2FuZHJvaWQtZGVidWctaWNvbi5wbmciIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmU7Ij48L2ltZz4KKyAgICBpbiB0aGUgdG9vbGJhcikKKzEuICBJZiBpdCdzIHRha2luZyBhd2hpbGUsIGl0J3MgcHJvYmFibHkgdGhlIG5pbmphIGJ1aWxkLiBZb3UgY2FuIHNlZSB0aGF0IGl0IGlzCisgICAgc3RpbGwgcHJvY2Vzc2luZyBieSBsb29raW5nIGZvciBhIHJvdGF0aW5nIHNwaW5uZXIgbGFiZWxlZCAiR3JhZGxlIEJ1aWxkCisgICAgUnVubmluZyIgb24gdGhlIGJvdHRvbSBiYXIuCisKKyAgICAqKk5vdGU6KiogSWYgeW91IGhhdmUgdHJvdWJsZSBidWlsZGluZyB3aXRoIGFuIGVycm9yIHJlZmVyZW5jaW5nIHRoZQorICAgIGBkZWJ1Zy5rZXlzdG9yZWAgeW91IG1heSBuZWVkIHRvIHNldCBvbmUgdXAgb24geW91ciBzeXN0ZW06CisKKyAgICBgYGAKKyAgICBrZXl0b29sIC1nZW5rZXkgLXYgLWtleXN0b3JlIH4vLmFuZHJvaWQvZGVidWcua2V5c3RvcmUgLXN0b3JlcGFzcyBhbmRyb2lkIC1hbGlhcyBhbmRyb2lkZGVidWdrZXkgLWtleXBhc3MgYW5kcm9pZCAta2V5YWxnIFJTQSAta2V5c2l6ZSAyMDQ4IC12YWxpZGl0eSAxMDAwMAorICAgIGBgYAorCisxLiAgVG8gYWRkIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFkZCBgLS1lc2FgIHRvIHNwZWNpZnkgdGhlICJhcmdzIiBhcnJheSBhcworICAgIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgKHdpdGggY2hhcmFjdGVycyBsaWtlICcmJyBiYWNrc2xhc2gtZXNjYXBlZCB0byBtYWtlCisgICAgaXQgdGhyb3VnaCB0aGUgbGF1bmNoIGNvbW1hbmQpIHVuZGVyOgorCisgICAgUnVuIC0+IEVkaXQgQ29uZmlndXJhdGlvbnPigKYgLT4gImFwcCIgLT4gR2VuZXJhbCAtPiBMYXVuY2ggT3B0aW9ucyAtPiBMYXVuY2ggRmxhZ3MKKworICAgIGUuZy4gVG8gcnVuIHdpdGggYSBkaWZmZXJlbnQgVVJMOiBgLS1lc2EgYXJncyAtLXVybD08RElGRkVSRU5UX1VSTD5gCisxLiAgVG8gbW9uaXRvciBsb2cgb3V0cHV0LCBzZWUgdGhlIGBMb2djYXRgIG9uIHRoZSBib3R0b20tbGVmdCBvZiB0aGUgSURFLiBZb3UKKyAgICBjYW4gZW50ZXIgInN0YXJib2FyZCIgaW4gdGhlIHNlYXJjaCBidWJibGUgdG8gZmlsdGVyIHRoZSBvdXRwdXQuCisxLiAgVG8ga2lsbCB0aGUgYXBwIGdvIHRvIFJ1biAtPiBTdG9wLCBvciBjbGljayB0aGUgcmVkIHNxdWFyZSBzdG9wIGJ1dHRvbgorICAgIGVpdGhlciBvbiB0aGUgdG9wIHRvb2xiYXIsIG9yIGluIHRoZSBkZWJ1Z2dlciBvbiB0aGUgYm90dG9tLWxlZnQgb2YgdGhlIElERS4KKzEuICBUbyBzZXQgYnJlYWtwb2ludHMgaW4gbmF0aXZlIGNvZGUsIGp1c3Qgb3BlbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGUgd2l0aAorICAgIEZpbGUgLT4gT3BlbuKApiAoc29ycnksIGZpbGVzIG91dHNpZGUgdGhlIGFwayBwcm9qZWN0IGNhbid0IGFwcGVhciBpbiB0aGUKKyAgICBQcm9qZWN0IHBhbmVsIG9mIHRoZSBJREUpIGFuZCBjbGljayBpbiB0aGUgZ3V0dGVyIG9mIHRoZSByZWxldmFudCBsaW5lLgorICAgIChPbmNlIHlvdSBoYXZlIG9uZSBDKysgZmlsZSBvcGVuLCB0aGUgcGF0aCBicmVhZGNydW1icyBhdCB0aGUgdG9wIGFyZSB1c2VmdWwKKyAgICB0byBvcGVuIG90aGVyIG5lYXJieSBmaWxlcy4pCisKKworIyMgUnVubmluZyBUZXN0cworCitUaGUgdGVzdCB0YXJnZXQgaXRzZWxmIChlLmcuIG5wbGIpIGp1c3QgYnVpbGRzIGFuIC5zbyBmaWxlIChlLmcuIGxpYm5wbGIuc28pLiBUbworcnVuIHRoYXQgb24gYSBkZXZpY2UsIGl0IG5lZWRzIHRvIGJlIHBhY2thZ2VkIGludG8gYW4gQVBLLCB3aGljaCBpcyBkb25lIGJ5IHRoZQorYXNzb2NpYXRlZCAiZGVwbG95IiB0YXJnZXQgKGUuZy4gbnBsYl9kZXBsb3kpLiBUaGUgU3RhcmJvYXJkIHRlc3QgcnVubmVyIGRvZXMKK2FsbCB0aGlzIGZvciB5b3UsIHNvIGp1c3QgdXNlIHRoYXQgdG8gYnVpbGQgYW5kIHJ1biB0ZXN0cy4gRm9yIGV4YW1wbGUsIHRvCitidWlsZCBhbmQgcnVuICJkZXZlbCIgTlBMQiBvbiBhbiBBUk02NCBkZXZpY2UsIGZyb20gdGhlIHRvcCAnc3JjJyBkaXJlY3Rvcnk6CisKK2BgYAorc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9ydW5uZXIucHkgLXAgYW5kcm9pZC1hcm02NCAtYyBkZXZlbCAtYiAtciAtdCBucGxiCitgYGAKKworSWYgeW91IHdhbnQgdG8gZGVidWcgYSB0ZXN0LCB5b3UgY2FuIHJ1biBpdCBmcm9tIEFuZHJvaWQgU3R1ZGlvLiBFZGl0CitgYnVpbGQuZ3JhZGxlYCBpbiB0aGUgJ2FwcCcgbW9kdWxlIChub3QgdG8gdGhlIG9uZSBpbiB0aGUgdG9wICdhcGsnIG1vZHVsZSkgdG8KK2NoYW5nZSBgREVGQVVMVF9DT0JBTFRfVEFSR0VUYCB0byBiZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCB5b3Ugd2FudCB0byBkZWJ1ZworaW5zdGVhZCBvZiAnY29iYWx0Jy4gVGhlbiB5b3UgY2FuIHNldCBicmVha3BvaW50cywgZXRjLiBpbiB0aGUgdGVzdCB0aGUgc2FtZSBhcword2hlbiBkZWJ1Z2dpbmcgQ29iYWx0LgorCisjIyBSZW1vdmluZyB0aGUgQ29iYWx0IEFuZHJvaWQgRW52aXJvbm1lbnQKKworMS4gIFVuc2V0IEFORFJPSURfSE9NRSBhbmQgb3IgQU5EUk9JRF9OREtfSE9NRSBpbiB5b3VyIHNoZWxsIGFuZCBpbiAuYmFzaHJjCisxLiAgRGVsZXRlIHRoZSBTREs6CisKKyAgICBgYGAKKyAgICBybSAtcmYgfi9zdGFyYm9hcmQtdG9vbGNoYWlucy9BbmRyb2lkU2RrCisgICAgYGBgCisKKzEuICBEZWxldGUgTkRLIHRvb2xjaGFpbnM6CisKKyAgICBgYGAKKyAgICBybSAtcmYgIH4vc3RhcmJvYXJkLXRvb2xjaGFpbnMvYW5kcm9pZCoKKyAgICBgYGAKKworMS4gIERlbGV0ZSBjYWNoZWQgQW5kcm9pZCBmaWxlczoKKworICAgIGBgYAorICAgIHJtIC1yZiB+Ly5hbmRyb2lkCisgICAgYGBgCisKKyAgICAqKk5PVEU6KiogUmVtb3ZpbmcgdGhpcyBkaXJlY3Rvcnkgd2lsbCByZW1vdmUgYWxsIHNpZ25pbmcga2V5cyBldmVuIGZvcgorICAgIGRpZmZlcmVudCBwcm9qZWN0cywgc28gb25seSBkZWxldGUgdGhpcyBpZiB5b3UgdHJ1bHkgd2FudCB0byByZW1vdmUgdGhlCisgICAgZW50aXJlIENvYmFsdCBhbmQgQW5kcm9pZCBTdHVkaW8gZW52aXJvbm1lbnQuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NpdGUvZG9jcy9kZXZlbG9wbWVudC9zZXR1cC1saW51eC5tZCBiL3NyYy9jb2JhbHQvc2l0ZS9kb2NzL2RldmVsb3BtZW50L3NldHVwLWxpbnV4Lm1kCmluZGV4IDczMjBjMDAuLmVkNWFmZjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2l0ZS9kb2NzL2RldmVsb3BtZW50L3NldHVwLWxpbnV4Lm1kCisrKyBiL3NyYy9jb2JhbHQvc2l0ZS9kb2NzL2RldmVsb3BtZW50L3NldHVwLWxpbnV4Lm1kCkBAIC0zMSwxMSArMzEsMTEgQEAKIAogICAgIGBgYAogICAgICQgc3VkbyBhcHQtZ2V0IGluc3RhbGwgYmlzb24gYnVpbGQtZXNzZW50aWFsIGNvcmV1dGlscyBnaXQgZ3BlcmYgXAotICAgICAgICAgICBsaWJhc291bmQyLWRldiBsaWJhdmZvcm1hdC1kZXYgbGliYXZyZXNhbXBsZS1kZXYgXAorICAgICAgICAgICBsaWJhb20tZGV2IGxpYmFzb3VuZDItZGV2IGxpYmF2Zm9ybWF0LWRldiBsaWJhdnJlc2FtcGxlLWRldiBcCiAgICAgICAgICAgIGxpYmRpcmVjdGZiLWRldiBsaWJkaXJlY3RmYi1leHRyYSBsaWJwdWxzZS1kZXYgXAotICAgICAgICAgICBsaWJnbDEtbWVzYS1kZXYgbGliZ2xlczItbWVzYS1kZXYgbGlieDExLWRldiBcCisgICAgICAgICAgIGxpYmdsMS1tZXNhLWRldiBsaWJnbGVzMi1tZXNhLWRldiBsaWJ2cHgtZGV2IGxpYngxMS1kZXYgXAogICAgICAgICAgICBsaWJ4Y29tcG9zaXRlLWRldiBsaWJ4Y29tcG9zaXRlMSBsaWJ4cmVuZGVyLWRldiBsaWJ4cmVuZGVyMSBcCi0gICAgICAgICAgIGxpYnhwbS1kZXYgbTQgcnVieSB0YXIgeHNlcnZlci14ZXBoeXIgeHotdXRpbHMgeWFzbQorICAgICAgICAgICBsaWJ4cG0tZGV2IG00IHB5dGhvbiBydWJ5IHRhciB4c2VydmVyLXhlcGh5ciB4ei11dGlscyB5YXNtCiAgICAgYGBgCiAKIDEuICBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc3RhbmRhcmQgQysrIGhlYWRlciBmaWxlcyAoYGxpYnN0ZGMrK2ApLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zaXRlL2RvY3Mvb3ZlcnZpZXcubWQgYi9zcmMvY29iYWx0L3NpdGUvZG9jcy9vdmVydmlldy5tZAppbmRleCBkYjNmMDM4Li5lY2ZhZTllIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NpdGUvZG9jcy9vdmVydmlldy5tZAorKysgYi9zcmMvY29iYWx0L3NpdGUvZG9jcy9vdmVydmlldy5tZApAQCAtNDMsOCArNDMsOCBAQAogICAgICogICBDb2JhbHQgcHJlY29tcGlsZXMgYSBzZXQgb2Ygc2hhZGVycyB0aGF0IGFyZSBzdWZmaWNpZW50IHRvIGV4cHJlc3MgYWxsCiAgICAgICAgIGdyYXBoaWNhbCBlZmZlY3RzLCB0aGVyZWJ5IGFjY29tbW9kYXRpbmcgcGxhdGZvcm1zIHRoYXQgY2Fubm90IGNvbXBpbGUKICAgICAgICAgc2hhZGVycyBhdCBydW50aW1lLgotICAgICogICBDb2JhbHQgcmVxdWlyZXMgYSBjb21wbGlhbnQgQysrMDMgY29tcGlsZXIsIGFsbG93aW5nIGl0IHRvIHJlYWNoCi0gICAgICAgIHBsYXRmb3JtcyB3aXRoIGxlZ2FjeSB0b29sY2hhaW5zLgorICAgICogICBDb2JhbHQgcmVxdWlyZXMgYSBjb21wbGlhbnQgQysrMTEgY29tcGlsZXIsIGFsbG93aW5nIGl0IHRvIHJlYWNoCisgICAgICAgIHBsYXRmb3JtcyB3aXRoIHRvb2xjaGFpbnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuZXdlc3QgQysrMTcgZmVhdHVyZXMuCiAKICogICAqKlNtYWxsIGZvb3RwcmludCoqCiAgICAgKiAgIENvYmFsdCBpcyBvcHRpbWl6ZWQgZm9yIG1lbW9yeS4gSXRzIHN1cmZhY2UgY2FjaGUgbmV2ZXIgZXhjZWVkcyBhCkBAIC02OSwyMCArNjksMjAgQEAKIAogIyMjIFBvcnRlcnMKIAotUG9ydGVycyBzaG91bGQgYmVnaW4gd2l0aCB0aGUgW3BvcnRpbmcgZ3VpZGVdKC9jb2JhbHQvc3RhcmJvYXJkL3BvcnRpbmcuaHRtbCksCitQb3J0ZXJzIHNob3VsZCBiZWdpbiB3aXRoIHRoZSBbcG9ydGluZyBndWlkZV0oL3N0YXJib2FyZC9wb3J0aW5nLmh0bWwpLAogd2hpY2ggZXhwbGFpbnMgaG93IHRvIHVzZSBTdGFyYm9hcmQsIENvYmFsdCdzIHBvcnRpbmcgbGF5ZXIsIHRvIGN1c3RvbWl6ZSB0aGUKIHBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdGhhdCBDb2JhbHQgdXNlcy4gVGhlcmUgYXJlIHNldmVyYWwgcmVmZXJlbmNlCiBkb2N1bWVudHMgdG8gaGVscCBwb3J0ZXJzIGN1c3RvbWl6ZSBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCB0byBpbXBsZW1lbnQKIG1vZHVsZS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5LiBUaGUgW1Rlc3Rpbmcgd2l0aAotTlBMQl0oL2NvYmFsdC9zdGFyYm9hcmQvdGVzdGluZy5odG1sKSBkb2N1bWVudCBwcm92aWRlcyBhbiBvdmVydmlldyBvZgorTlBMQl0oL3N0YXJib2FyZC90ZXN0aW5nLmh0bWwpIGRvY3VtZW50IHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mCiBTdGFyYm9hcmQncyBjb21wbGlhbmNlIHRlc3Qgc3VpdGUuCiAKICMjIyBEZXZlbG9wZXJzCiAKIERldmVsb3BlcnMgY2FuIGZvbGxvdyB0aGUgc2V0dXAgaW5zdHJ1Y3Rpb25zIGZvcgotW0xpbnV4XSgvY29iYWx0L2RldmVsb3BtZW50L3NldHVwLWxpbnV4Lmh0bWwpIG9yCi1bUmFzUGldKC9jb2JhbHQvZGV2ZWxvcG1lbnQvc2V0dXAtcmFzcGkuaHRtbCkgdG8gc2V0IHVwIHRoZWlyIENvYmFsdCBkZXZlbG9wbWVudAorW0xpbnV4XSgvZGV2ZWxvcG1lbnQvc2V0dXAtbGludXguaHRtbCkgb3IKK1tSYXNQaV0oL2RldmVsb3BtZW50L3NldHVwLXJhc3BpLmh0bWwpIHRvIHNldCB1cCB0aGVpciBDb2JhbHQgZGV2ZWxvcG1lbnQKIGVudmlyb25tZW50LCBmZXRjaCBhIGNvcHkgb2YgdGhlIENvYmFsdCBjb2RlIHJlcG9zaXRvcnksIGFuZCBidWlsZCBhIENvYmFsdAotYmluYXJ5LiBUaGUgW0NvYmFsdCBzdXBwb3J0XSgvY29iYWx0L2RldmVsb3BtZW50L3JlZmVyZW5jZS9zdXBwb3J0ZWQtZmVhdHVyZXMuaHRtbCkKK2JpbmFyeS4gVGhlIFtDb2JhbHQgc3VwcG9ydF0oL2RldmVsb3BtZW50L3JlZmVyZW5jZS9zdXBwb3J0ZWQtZmVhdHVyZXMuaHRtbCkKIGd1aWRlIGxpc3RzIHRoZSBIVE1MIGVsZW1lbnRzLCBDU1MgcHJvcGVydGllcywgQ1NTIHNlbGVjdG9ycywgYW5kIEphdmFTY3JpcHQgV2ViCiBBUElzIHRoYXQgZGV2ZWxvcGVycyBjYW4gdXNlIGluIHRoZWlyIENvYmFsdCBhcHBsaWNhdGlvbnMuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NpdGUvaW1hZ2VzL2FuZHJvaWQtYXZkLW1hbmFnZXItaWNvbi5wbmcgYi9zcmMvY29iYWx0L3NpdGUvaW1hZ2VzL2FuZHJvaWQtYXZkLW1hbmFnZXItaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0YzAzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc2l0ZS9pbWFnZXMvYW5kcm9pZC1hdmQtbWFuYWdlci1pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NpdGUvaW1hZ2VzL2FuZHJvaWQtZGVidWctaWNvbi5wbmcgYi9zcmMvY29iYWx0L3NpdGUvaW1hZ2VzL2FuZHJvaWQtZGVidWctaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlN2I2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc2l0ZS9pbWFnZXMvYW5kcm9pZC1kZWJ1Zy1pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NpdGUvaW1hZ2VzL2FuZHJvaWQtc2RrLW1hbmFnZXItaWNvbi5wbmcgYi9zcmMvY29iYWx0L3NpdGUvaW1hZ2VzL2FuZHJvaWQtc2RrLW1hbmFnZXItaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjYWRkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc2l0ZS9pbWFnZXMvYW5kcm9pZC1zZGstbWFuYWdlci1pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3BlZWNoX3NlcnZpY2UuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3BlZWNoX3NlcnZpY2UuY2MKaW5kZXggOTQ5MzlkMi4uYzAxNDFiNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3NwZWVjaF9zZXJ2aWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5jYwpAQCAtMjUzLDYgKzI1MywxOSBAQAogICAvLyBuby1vcC4KIH0KIAorLy8gc3RhdGljCitiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gR29vZ2xlU3BlZWNoU2VydmljZTo6R2V0U3BlZWNoQVBJS2V5KCkgeworICBjb25zdCBpbnQga1NwZWVjaEFwaUtleUxlbmd0aCA9IDEwMDsKKyAgY2hhciBidWZmZXJba1NwZWVjaEFwaUtleUxlbmd0aF0gPSB7MH07CisgIGJvb2wgcmVzdWx0ID0gU2JTeXN0ZW1HZXRQcm9wZXJ0eShrU2JTeXN0ZW1Qcm9wZXJ0eVNwZWVjaEFwaUtleSwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfQVJSQVlfU0laRV9JTlQoYnVmZmVyKSk7CisgIGlmIChyZXN1bHQpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKKyAgfQorfQorCiB2b2lkIEdvb2dsZVNwZWVjaFNlcnZpY2U6OlN0YXJ0SW50ZXJuYWwoY29uc3QgU3BlZWNoUmVjb2duaXRpb25Db25maWcmIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX3JhdGUpIHsKICAgRENIRUNLX0VRKHRocmVhZF8ubWVzc2FnZV9sb29wKCksIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwpAQCAtMjg4LDE3ICszMDEsMTAgQEAKICAgdXBfdXJsID0gQXBwZW5kUXVlcnlQYXJhbWV0ZXIodXBfdXJsLCAicGFpciIsIHBhaXIpOwogICB1cF91cmwgPSBBcHBlbmRRdWVyeVBhcmFtZXRlcih1cF91cmwsICJvdXRwdXQiLCAicGIiKTsKIAotICBjb25zdCBjaGFyKiBzcGVlY2hfYXBpX2tleSA9ICIiOwotI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQotICBjb25zdCBpbnQga1NwZWVjaEFwaUtleUxlbmd0aCA9IDEwMDsKLSAgY2hhciBidWZmZXJba1NwZWVjaEFwaUtleUxlbmd0aF0gPSB7MH07Ci0gIGJvb2wgcmVzdWx0ID0gU2JTeXN0ZW1HZXRQcm9wZXJ0eShrU2JTeXN0ZW1Qcm9wZXJ0eVNwZWVjaEFwaUtleSwgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfQVJSQVlfU0laRV9JTlQoYnVmZmVyKSk7Ci0gIFNCX0RDSEVDSyhyZXN1bHQpOwotICBzcGVlY2hfYXBpX2tleSA9IHJlc3VsdCA/IGJ1ZmZlciA6ICIiOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKKyAgYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGFwaV9rZXkgPSBHZXRTcGVlY2hBUElLZXkoKTsKKyAgU0JfRENIRUNLKGFwaV9rZXkpOwogCi0gIHVwX3VybCA9IEFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHVwX3VybCwgImtleSIsIHNwZWVjaF9hcGlfa2V5KTsKKyAgdXBfdXJsID0gQXBwZW5kUXVlcnlQYXJhbWV0ZXIodXBfdXJsLCAia2V5IiwgYXBpX2tleS52YWx1ZV9vcigiIikpOwogCiAgIC8vIExhbmd1YWdlIGlzIHJlcXVpcmVkLiBJZiBubyBsYW5ndWFnZSBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgc3lzdGVtIGxhbmd1YWdlLgogICBpZiAoIWNvbmZpZy5sYW5nLmVtcHR5KCkpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3NwZWVjaF9zZXJ2aWNlLmgKaW5kZXggZDNmZWZjNS4uNWU5ZDMxMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3NwZWVjaF9zZXJ2aWNlLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3NwZWVjaF9zZXJ2aWNlLmgKQEAgLTc4LDYgKzc4LDggQEAKICAgdm9pZCBPblVSTEZldGNoVXBsb2FkUHJvZ3Jlc3MoY29uc3QgbmV0OjpVUkxGZXRjaGVyKiAvKnNvdXJjZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCAvKmN1cnJlbnQqLywgaW50NjQgLyp0b3RhbCovKSBvdmVycmlkZSB7fQogCisgIHN0YXRpYyBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gR2V0U3BlZWNoQVBJS2V5KCk7CisKICBwcml2YXRlOgogICB2b2lkIFN0YXJ0SW50ZXJuYWwoY29uc3QgU3BlZWNoUmVjb2duaXRpb25Db25maWcmIGNvbmZpZywgaW50IHNhbXBsZV9yYXRlKTsKICAgdm9pZCBTdG9wSW50ZXJuYWwoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9tYW5hZ2VyLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX21hbmFnZXIuY2MKaW5kZXggNmVlNGNjYi4uOGFiZTI4YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX21hbmFnZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX21hbmFnZXIuY2MKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL3NwZWVjaF9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fZXJyb3IuaCIKICNpZiBkZWZpbmVkKFNCX1VTRV9TQl9TUEVFQ0hfUkVDT0dOSVpFUikKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL3N0YXJib2FyZF9zcGVlY2hfcmVjb2duaXplci5oIgogI2Vsc2UKQEAgLTQwLDEwICs0MSwxMiBAQAogICByZWNvZ25pemVyXy5yZXNldChuZXcgU3RhcmJvYXJkU3BlZWNoUmVjb2duaXplcihiYXNlOjpCaW5kKAogICAgICAgJlNwZWVjaFJlY29nbml0aW9uTWFuYWdlcjo6T25FdmVudEF2YWlsYWJsZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKICNlbHNlCi0gIHJlY29nbml6ZXJfLnJlc2V0KG5ldyBDb2JhbHRTcGVlY2hSZWNvZ25pemVyKAotICAgICAgbmV0d29ya19tb2R1bGUsIG1pY3JvcGhvbmVfb3B0aW9ucywKLSAgICAgIGJhc2U6OkJpbmQoJlNwZWVjaFJlY29nbml0aW9uTWFuYWdlcjo6T25FdmVudEF2YWlsYWJsZSwKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKKyAgaWYgKEdvb2dsZVNwZWVjaFNlcnZpY2U6OkdldFNwZWVjaEFQSUtleSgpKSB7CisgICAgcmVjb2duaXplcl8ucmVzZXQobmV3IENvYmFsdFNwZWVjaFJlY29nbml6ZXIoCisgICAgICAgIG5ldHdvcmtfbW9kdWxlLCBtaWNyb3Bob25lX29wdGlvbnMsCisgICAgICAgIGJhc2U6OkJpbmQoJlNwZWVjaFJlY29nbml0aW9uTWFuYWdlcjo6T25FdmVudEF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpOworICB9CiAjZW5kaWYgIC8vIGRlZmluZWQoU0JfVVNFX1NCX1NQRUVDSF9SRUNPR05JWkVSKQogfQogCkBAIC02MSw2ICs2NCwxNSBAQAogICAgIHJldHVybjsKICAgfQogCisgIC8vIElmIG5vIHJlY29nbml6ZXIgaXMgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0sIGltbWVkaWF0ZWx5IGdlbmVyYXRlIGEKKyAgLy8gIm5vLXNwZWVjaCIgZXJyb3IuCisgIC8vICAgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3NwZWVjaC1hcGkvc3BlZWNoYXBpLmh0bWwjc3BlZWNocmVjby1ldmVudHMKKyAgaWYgKCFyZWNvZ25pemVyXykgeworICAgIE9uRXZlbnRBdmFpbGFibGUoCisgICAgICAgIG5ldyBTcGVlY2hSZWNvZ25pdGlvbkVycm9yKGtTcGVlY2hSZWNvZ25pdGlvbkVycm9yQ29kZU5vU3BlZWNoLCAiIikpOworICAgIHJldHVybjsKKyAgfQorCiAgIHJlY29nbml6ZXJfLT5TdGFydChjb25maWcpOwogICBzdGF0ZV8gPSBrU3RhcnRlZDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9pbnB1dF9ldmVudC5oIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2lucHV0X2V2ZW50LmgKaW5kZXggOTQ5MDM0My4uZTM4YjMxMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2lucHV0X2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2lucHV0X2V2ZW50LmgKQEAgLTU5LDE4ICs1OSwxOCBAQAogICAgIGtGb3J3YXJkQnV0dG9uID0gMSA8PCA4LAogICB9OwogCi0gIElucHV0RXZlbnQoU2JUaW1lTW9ub3RvbmljIHRpbWVzdGFtcCwgVHlwZSB0eXBlLCBpbnQgZGV2aWNlX2lkLAotICAgICAgICAgICAgIGludCBrZXlfY29kZSwgdWludDMyIG1vZGlmaWVycywgYm9vbCBpc19yZXBlYXQsCisgIElucHV0RXZlbnQoU2JUaW1lTW9ub3RvbmljIHRpbWVzdGFtcCwgVHlwZSB0eXBlLCBpbnQgZGV2aWNlX2lkLCBpbnQga2V5X2NvZGUsCisgICAgICAgICAgICAgdWludDMyIG1vZGlmaWVycywgYm9vbCBpc19yZXBlYXQsCiAgICAgICAgICAgICAgY29uc3QgbWF0aDo6UG9pbnRGJiBwb3NpdGlvbiA9IG1hdGg6OlBvaW50RigpLAogICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlBvaW50RiYgZGVsdGEgPSBtYXRoOjpQb2ludEYoKQogI2lmIFNCX0FQSV9WRVJTSU9OID49IDYKLSAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICBmbG9hdCBwcmVzc3VyZSA9IDAsIGNvbnN0IG1hdGg6OlBvaW50RiYgc2l6ZSA9IG1hdGg6OlBvaW50RigpLAogICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlBvaW50RiYgdGlsdCA9IG1hdGg6OlBvaW50RigpCiAjZW5kaWYKICNpZiBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQotICAgICAgICAgICAgICwKLSAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfdGV4dCA9ICIiCisgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfdGV4dCA9ICIiLCBib29sIGlzX2NvbXBvc2luZyA9IGZhbHNlCiAjZW5kaWYgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAgICAgICAgICAgICAgKQogICAgICAgOiB0aW1lc3RhbXBfKHRpbWVzdGFtcCksCkBAIC04OSw3ICs4OSw4IEBACiAjZW5kaWYKICNpZiBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQogICAgICAgICAsCi0gICAgICAgIGlucHV0X3RleHRfKGlucHV0X3RleHQpCisgICAgICAgIGlucHV0X3RleHRfKGlucHV0X3RleHQpLAorICAgICAgICBpc19jb21wb3NpbmdfKGlzX2NvbXBvc2luZykKICNlbmRpZiAgLy8gU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKICAgewogICB9CkBAIC0xMTEsNiArMTEyLDcgQEAKICNlbmRpZgogI2lmIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF90ZXh0KCkgY29uc3QgeyByZXR1cm4gaW5wdXRfdGV4dF87IH0KKyAgYm9vbCBpc19jb21wb3NpbmcoKSBjb25zdCB7IHJldHVybiBpc19jb21wb3NpbmdfOyB9CiAjZW5kaWYgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAKICAgQkFTRV9FVkVOVF9TVUJDTEFTUyhJbnB1dEV2ZW50KTsKQEAgLTEzMSw2ICsxMzMsNyBAQAogI2VuZGlmCiAjaWYgU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKICAgc3RkOjpzdHJpbmcgaW5wdXRfdGV4dF87CisgIGJvb2wgaXNfY29tcG9zaW5nXzsKICNlbmRpZiAgLy8gU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93LmNjIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuY2MKaW5kZXggYzRiNmEyNC4uNzZhY2NiOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuY2MKKysrIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuY2MKQEAgLTE1OSwxMyArMTU5LDEzIEBACiAKICNpZiBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQogICBzY29wZWRfcHRyPElucHV0RXZlbnQ+IGlucHV0X2V2ZW50KAotICAgICAgbmV3IElucHV0RXZlbnQodGltZXN0YW1wLCB0eXBlLCBkYXRhLmRldmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGtleV9jb2RlLCBtb2RpZmllcnMsIGlzX3JlcGVhdCwKLSAgICAgICAgICAgICAgICAgICAgIG1hdGg6OlBvaW50RihkYXRhLnBvc2l0aW9uLngsIGRhdGEucG9zaXRpb24ueSksCisgICAgICBuZXcgSW5wdXRFdmVudCh0aW1lc3RhbXAsIHR5cGUsIGRhdGEuZGV2aWNlX2lkLCBrZXlfY29kZSwgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgaXNfcmVwZWF0LCBtYXRoOjpQb2ludEYoZGF0YS5wb3NpdGlvbi54LCBkYXRhLnBvc2l0aW9uLnkpLAogICAgICAgICAgICAgICAgICAgICAgbWF0aDo6UG9pbnRGKGRhdGEuZGVsdGEueCwgZGF0YS5kZWx0YS55KSwgcHJlc3N1cmUsCiAgICAgICAgICAgICAgICAgICAgICBtYXRoOjpQb2ludEYoZGF0YS5zaXplLngsIGRhdGEuc2l6ZS55KSwKICAgICAgICAgICAgICAgICAgICAgIG1hdGg6OlBvaW50RihkYXRhLnRpbHQueCwgZGF0YS50aWx0LnkpLAotICAgICAgICAgICAgICAgICAgICAgZGF0YS5pbnB1dF90ZXh0ID8gZGF0YS5pbnB1dF90ZXh0IDogIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEuaW5wdXRfdGV4dCA/IGRhdGEuaW5wdXRfdGV4dCA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgZGF0YS5pc19jb21wb3NpbmcgPyBkYXRhLmlzX2NvbXBvc2luZyA6IGZhbHNlKSk7CiAjZWxzZSAgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAgIHNjb3BlZF9wdHI8SW5wdXRFdmVudD4gaW5wdXRfZXZlbnQoCiAgICAgICBuZXcgSW5wdXRFdmVudCh0aW1lc3RhbXAsIHR5cGUsIGRhdGEuZGV2aWNlX2lkLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC92ZXJzaW9uLmggYi9zcmMvY29iYWx0L3ZlcnNpb24uaAppbmRleCA1NWE3OGY0Li45YTNmNmY4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3ZlcnNpb24uaAorKysgYi9zcmMvY29iYWx0L3ZlcnNpb24uaApAQCAtMzUsNiArMzUsNiBAQAogLy8gICAgICAgICAgICAgICAgICByZWxlYXNlIGlzIGN1dC4KIC8vLgogCi0jZGVmaW5lIENPQkFMVF9WRVJTSU9OICIxOS5tYXN0ZXIuMCIKKyNkZWZpbmUgQ09CQUxUX1ZFUlNJT04gIjE5LmFuZHJvaWQuMSIKIAogI2VuZGlmICAvLyBDT0JBTFRfVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uY2MgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5jYwppbmRleCBmNjQwYjA0Li44YThjZjA0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5jYworKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5jYwpAQCAtMTIsOCArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5oIgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9zZXQuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWVfZWZmZWN0X3JlYWRfb25seS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTIyLDYgKzI0LDkgQEAKIEFuaW1hdGlvbjo6QW5pbWF0aW9uKGNvbnN0IHNjb3BlZF9yZWZwdHI8QW5pbWF0aW9uRWZmZWN0UmVhZE9ubHk+JiBlZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEFuaW1hdGlvblRpbWVsaW5lPiYgdGltZWxpbmUpCiAgICAgOiBlZmZlY3RfKGVmZmVjdCkgeworICAvLyBSZWdpc3RlciB3aXRoIHRoZSBrZXlmcmFtZSBlZmZlY3QncyB0YXJnZXQgc28gdGhhdCB0aGlzIEFuaW1hdGlvbiBjYW4KKyAgLy8gYmUgcmVmZXJlbmNlZCBmcm9tIHRoZSB0YXJnZXQsIGFzIHBlciB0aGUgd2ViIGFuaW1hdGlvbnMgc3BlY2lmaWNhdGlvbjoKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvd2ViLWFuaW1hdGlvbnMtMS8jZG9tLWFuaW1hdGFibGUtZ2V0YW5pbWF0aW9ucwogICBjb25zdCBLZXlmcmFtZUVmZmVjdFJlYWRPbmx5KiBrZXlmcmFtZV9lZmZlY3QgPQogICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8Y29uc3QgS2V5ZnJhbWVFZmZlY3RSZWFkT25seSo+KGVmZmVjdC5nZXQoKSk7CiAgIGlmIChrZXlmcmFtZV9lZmZlY3QpIHsKQEAgLTMxLDEwICszNiwxNCBAQAogfQogCiB2b2lkIEFuaW1hdGlvbjo6c2V0X3RpbWVsaW5lKGNvbnN0IHNjb3BlZF9yZWZwdHI8QW5pbWF0aW9uVGltZWxpbmU+JiB0aW1lbGluZSkgeworICAvLyBEZXJlZ2lzdGVyIGZyb20gdGhlIHRpbWVsaW5lIHdlIHdlcmUgcHJldmlvdXNseSByZWdpc3RlcmVkIHRvLgogICBpZiAodGltZWxpbmVfKSB7CiAgICAgdGltZWxpbmVfLT5EZXJlZ2lzdGVyKHRoaXMpOwogICB9CiAKKyAgLy8gUmVnaXN0ZXIgd2l0aCB0aGUgdGltZWxpbmUgc28gdGhhdCB0aGlzIEFuaW1hdGlvbiBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tCisgIC8vIHRoYXQgdGltZWxpbmUsIGFzIHBlciB0aGUgd2ViIGFuaW1hdGlvbnMgc3BlY2lmaWNhdGlvbnM6CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYi1hbmltYXRpb25zLTEvI2RvbS1kb2N1bWVudC1nZXRhbmltYXRpb25zCiAgIGlmICh0aW1lbGluZSkgewogICAgIHRpbWVsaW5lLT5SZWdpc3Rlcih0aGlzKTsKICAgfQpAQCAtMTMxLDYgKzE0MCwxNCBAQAogICBpZiAoa2V5ZnJhbWVfZWZmZWN0KSB7CiAgICAga2V5ZnJhbWVfZWZmZWN0LT50YXJnZXQoKS0+RGVyZWdpc3Rlcih0aGlzKTsKICAgfQorCisgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBhbmltYXRpb24gc2V0IHNvIHRoYXQgb3VyIGxvb3AgaXRlcmF0aW9uIGlzIHVuYWZmZWN0ZWQKKyAgLy8gYnkgdGhlIGFuaW1hdGlvbiByZW1vdmFscyBhcyB3ZSBtYWtlIHRoZW0uCisgIHN0ZDo6c2V0PHNjb3BlZF9yZWZwdHI8QW5pbWF0aW9uU2V0Pj4gY29udGFpbmVkX2luX2FuaW1hdGlvbl9zZXRzID0KKyAgICAgIGNvbnRhaW5lZF9pbl9hbmltYXRpb25fc2V0c187CisgIGZvciAoY29uc3QgYXV0byYgYW5pbWF0aW9uX3NldCA6IGNvbnRhaW5lZF9pbl9hbmltYXRpb25fc2V0cykgeworICAgIGFuaW1hdGlvbl9zZXQtPlJlbW92ZUFuaW1hdGlvbih0aGlzKTsKKyAgfQogfQogCiB2b2lkIEFuaW1hdGlvbjo6VXBkYXRlUGVuZGluZ1Rhc2tzKCkgewpAQCAtMTk1LDYgKzIxMiwxNSBAQAogICByZXR1cm4gZXZlbnRfaGFuZGxlci5QYXNzKCk7CiB9CiAKK3ZvaWQgQW5pbWF0aW9uOjpPbkFkZGVkVG9BbmltYXRpb25TZXQoY29uc3Qgc2NvcGVkX3JlZnB0cjxBbmltYXRpb25TZXQ+JiBzZXQpIHsKKyAgY29udGFpbmVkX2luX2FuaW1hdGlvbl9zZXRzXy5pbnNlcnQoc2V0KTsKK30KKwordm9pZCBBbmltYXRpb246Ok9uUmVtb3ZlZEZyb21BbmltYXRpb25TZXQoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBbmltYXRpb25TZXQ+JiBzZXQpIHsKKyAgY29udGFpbmVkX2luX2FuaW1hdGlvbl9zZXRzXy5lcmFzZShzZXQpOworfQorCiB2b2lkIEFuaW1hdGlvbjo6UmVtb3ZlRXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlciogaGFuZGxlcikgewogICAvLyBDYWxsZWQgd2hlbiB0aGUgRXZlbnRIYW5kbGVyIG9iamVjdCBpcyBkZXN0cnVjdGVkLCB0aGlzICJkZXJlZ2lzdGVycyIKICAgLy8gdGhlIGV2ZW50IGhhbmRsZXIgZnJvbSB0aGUgQW5pbWF0aW9uJ3MgZXZlbnQgaGFuZGxlciBzZXQuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5oIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uaAppbmRleCAzMTA3MTllLi45Y2RiNWIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5oCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uLmgKQEAgLTI5LDYgKzI5LDggQEAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHdlYl9hbmltYXRpb25zIHsKIAorY2xhc3MgQW5pbWF0aW9uU2V0OworCiAvLyBBbmltYXRpb25zIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgV2ViIEFuaW1hdGlvbnMgQVBJIGJ5IHRoZSBBbmltYXRpb24KIC8vIGludGVyZmFjZS4KIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWFuaW1hdGlvbi1pbnRlcmZhY2UKQEAgLTE2OSw4ICsxNzEsMjEgQEAKICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbidzIGVmZmVjdCBlbnRlcnMgaXRzIGFmdGVyIHBoYXNlLgogICB2b2lkIE9uRW50ZXJBZnRlclBoYXNlKCk7CiAKKyAgLy8gSXQgaXMgcG9zc2libGUgZm9yIGFuIEFuaW1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvIGEgQW5pbWF0aW9uU2V0LCBzdWNoCisgIC8vIHRoYXQgaXMgbm90IGRpc2NvdmVyYWJsZSBieSBXZWIgQVBJcywgc28gd2UgdHJhY2sgYWxsIG91ciByZWZlcmVuY2VzIGZyb20KKyAgLy8gYWxsIEFuaW1hdGlvblNldHMgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZW0gd2hlbiB0aGUKKyAgLy8gYW5pbWF0aW9uIGlzIHJlYWR5IHRvIGRlc3Ryb3kgaXRzZWxmLgorICB2b2lkIE9uQWRkZWRUb0FuaW1hdGlvblNldChjb25zdCBzY29wZWRfcmVmcHRyPEFuaW1hdGlvblNldD4mIHNldCk7CisKKyAgLy8gQ2FsbGVkIGJ5IEFuaW1hdGlvblNldCB3aGVuIHJlbW92ZWQgZnJvbSBhbiBBbmltYXRpb25TZXQuCisgIHZvaWQgT25SZW1vdmVkRnJvbUFuaW1hdGlvblNldChjb25zdCBzY29wZWRfcmVmcHRyPEFuaW1hdGlvblNldD4mIHNldCk7CisKICAgc2NvcGVkX3JlZnB0cjxBbmltYXRpb25FZmZlY3RSZWFkT25seT4gZWZmZWN0XzsKICAgc2NvcGVkX3JlZnB0cjxBbmltYXRpb25UaW1lbGluZT4gdGltZWxpbmVfOworCisgIC8vIEEgbGlzdCBvZiBhbmltYXRpb24gc2V0cyB0aGF0IGNvbnRhaW4gdGhpcyBhbmltYXRpb24uCisgIHN0ZDo6c2V0PHNjb3BlZF9yZWZwdHI8QW5pbWF0aW9uU2V0Pj4gY29udGFpbmVkX2luX2FuaW1hdGlvbl9zZXRzXzsKKwogICBEYXRhIGRhdGFfOwogCiAgIC8vIEEgbGlzdCBvZiBldmVudCBoYW5kbGVycyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHJlY2VpdmluZyBjYWxsYmFja3Mgd2hlbgpAQCAtMTg3LDYgKzIwMiw5IEBACiAKICAgZnJpZW5kIGNsYXNzIEV2ZW50SGFuZGxlcjsKIAorICAvLyBTbyB0aGF0IHdlIGNhbiB0cmFjayB3aGljaCBBbmltYXRpb25TZXRzIHRoaXMgYW5pbWF0aW9uIGlzIGFkZGVkIHRvLgorICBmcmllbmQgY2xhc3MgQW5pbWF0aW9uU2V0OworCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBbmltYXRpb24pOwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmNjIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmNjCmluZGV4IGJmYWU3NTUuLmJkNWRjZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3NldC5jYworKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9zZXQuY2MKQEAgLTIzLDEwICsyMywxMiBAQAogCiB2b2lkIEFuaW1hdGlvblNldDo6QWRkQW5pbWF0aW9uKEFuaW1hdGlvbiogYW5pbWF0aW9uKSB7CiAgIGFuaW1hdGlvbnNfLmluc2VydChhbmltYXRpb24pOworICBhbmltYXRpb24tPk9uQWRkZWRUb0FuaW1hdGlvblNldCh0aGlzKTsKIH0KIAogdm9pZCBBbmltYXRpb25TZXQ6OlJlbW92ZUFuaW1hdGlvbihBbmltYXRpb24qIGFuaW1hdGlvbikgewogICBhbmltYXRpb25zXy5lcmFzZShhbmltYXRpb24pOworICBhbmltYXRpb24tPk9uUmVtb3ZlZEZyb21BbmltYXRpb25TZXQodGhpcyk7CiB9CiAKIGJvb2wgQW5pbWF0aW9uU2V0OjpJc1Byb3BlcnR5QW5pbWF0ZWQoY3Nzb206OlByb3BlcnR5S2V5IHByb3BlcnR5X25hbWUpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3NldC5oIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmgKaW5kZXggMTZmZGZkZi4uMTMxMTQyNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmgKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmgKQEAgLTMzLDYgKzMzLDkgQEAKIC8vIGFjcXVpcmluZyB0aGUgc2V0IG9mIGFsbCBwcm9wZXJ0aWVzIGFmZmVjdGVkLgogY2xhc3MgQW5pbWF0aW9uU2V0IDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWQ8QW5pbWF0aW9uU2V0PiB7CiAgcHVibGljOgorICAvLyBXZSB1c2UgcmF3IHBvaW50ZXJzIGhlcmUgdG8gYXZvaWQgY3ljbGljIHJlZmVyZW5jZXM7IEFuaW1hdGlvblNldHMKKyAgLy8gYXJlIHJlZmVyZW5jZWQgYnkgQW5pbWF0aW9ucyB0aGVtc2VsdmVzIGFuZCBpdCdzIGV4cGVjdGVkIHRoYXQgdGhlCisgIC8vIEFuaW1hdGlvbiBkZXN0cnVjdG9yIHdpbGwgZGVyZWdpc3RlciBhbGwgc2V0cyBpdCdzIGNvbnRhaW5lZCB3aXRoaW4uCiAgIHR5cGVkZWYgc3RkOjpzZXQ8QW5pbWF0aW9uKj4gSW50ZXJuYWxTZXQ7CiAKICAgQW5pbWF0aW9uU2V0KCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmNjIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdC5jYwppbmRleCA4OTAwZmVlLi42NDc5N2FjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuY2MKQEAgLTcwOSw3ICs3MDksNiBAQAogICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKHNvdXJjZSk7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKICAgRENIRUNLX05FKHN0YXRlXywga0RvbmUpOwotICBDaGFuZ2VTdGF0ZShrTG9hZGluZyk7CiAKICAgLy8gUHJlc2VydmUgdGhlIHJlc3BvbnNlIGJvZHkgb25seSBmb3IgcmVndWxhciBYSFIgcmVxdWVzdHMuIEZldGNoIHJlcXVlc3RzCiAgIC8vIHByb2Nlc3MgdGhlIHJlc3BvbnNlIGluIHBpZWNlcywgc28gZG8gbm90IG5lZWQgdG8ga2VlcCB0aGUgd2hvbGUgcmVzcG9uc2UuCkBAIC03MTgsNiArNzE3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGF0YS0+c2l6ZSgpKTsKICAgfQogCisgIC8vIFNpZ25hbCB0byBKYXZhU2NyaXB0IHRoYXQgbmV3IGRhdGEgaXMgbm93IGF2YWlsYWJsZS4KKyAgQ2hhbmdlU3RhdGUoa0xvYWRpbmcpOworCiAgIGlmIChmZXRjaF9jYWxsYmFja18pIHsKICAgICBzY3JpcHQ6OkhhbmRsZTxzY3JpcHQ6OlVpbnQ4QXJyYXk+IGRhdGEgPQogICAgICAgICBzY3JpcHQ6OlVpbnQ4QXJyYXk6Ok5ldyhzZXR0aW5nc18tPmdsb2JhbF9lbnZpcm9ubWVudCgpLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jcnlwdG8uZ3lwIGIvc3JjL2NyeXB0by9jcnlwdG8uZ3lwCmluZGV4IGE2ZDg5ZTUuLjM3MDUwOTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY3J5cHRvLmd5cAorKysgYi9zcmMvY3J5cHRvL2NyeXB0by5neXAKQEAgLTEwLDggKzEwLDggQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICcuLi9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnLi4vYmFzZS90aGlyZF9wYXJ0eS9keW5hbWljX2Fubm90YXRpb25zL2R5bmFtaWNfYW5ub3RhdGlvbnMuZ3lwOmR5bmFtaWNfYW5ub3RhdGlvbnMnLAotICAgICAgICAnLi4vdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsLmd5cDpvcGVuc3NsJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zdGFyYm9hcmQuZ3lwOnN0YXJib2FyZCcsCisgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvYm9yaW5nc3NsLmd5cDpjcnlwdG8nLAogICAgICAgXSwKICAgICAgICdkZWZpbmVzJzogWwogICAgICAgICAnQ1JZUFRPX0lNUExFTUVOVEFUSU9OJywKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWNfc2lnbmF0dXJlX2NyZWF0b3JfdW5pdHRlc3QuY2MgYi9zcmMvY3J5cHRvL2VjX3NpZ25hdHVyZV9jcmVhdG9yX3VuaXR0ZXN0LmNjCmluZGV4IGRmNzNiZWMuLjk0ODllM2EgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWNfc2lnbmF0dXJlX2NyZWF0b3JfdW5pdHRlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9lY19zaWduYXR1cmVfY3JlYXRvcl91bml0dGVzdC5jYwpAQCAtNTMsMTcgKzUzLDkgQEAKICAgc3RkOjp2ZWN0b3I8dWludDg+IHB1YmxpY19rZXlfaW5mbzsKICAgQVNTRVJUX1RSVUUoa2V5X29yaWdpbmFsLT5FeHBvcnRQdWJsaWNLZXkoJnB1YmxpY19rZXlfaW5mbykpOwogCi0gIC8vIFRoaXMgaXMgdGhlIGFsZ29yaXRobSBJRCBmb3IgU0hBLTI1NiB3aXRoIEVDIGVuY3J5cHRpb24uCi0gIGNvbnN0IHVpbnQ4IGtFQ0RTQVdpdGhTSEEyNTZBbGdvcml0aG1JRFtdID0gewotICAgIDB4MzAsIDB4MGMsCi0gICAgICAweDA2LCAweDA4LAotICAgICAgICAweDJhLCAweDg2LCAweDQ4LCAweGNlLCAweDNkLCAweDA0LCAweDAzLCAweDAyLAotICAgICAgMHgwNSwgMHgwMAotICB9OwogICBjcnlwdG86OlNpZ25hdHVyZVZlcmlmaWVyIHZlcmlmaWVyOwogICBBU1NFUlRfVFJVRSh2ZXJpZmllci5WZXJpZnlJbml0KAotICAgICAga0VDRFNBV2l0aFNIQTI1NkFsZ29yaXRobUlELCBzaXplb2Yoa0VDRFNBV2l0aFNIQTI1NkFsZ29yaXRobUlEKSwKLSAgICAgICZzaWduYXR1cmVbMF0sIHNpZ25hdHVyZS5zaXplKCksCisgICAgICBjcnlwdG86OlNpZ25hdHVyZVZlcmlmaWVyOjpFQ0RTQV9TSEEyNTYsICZzaWduYXR1cmVbMF0sIHNpZ25hdHVyZS5zaXplKCksCiAgICAgICAmcHVibGljX2tleV9pbmZvLmZyb250KCksIHB1YmxpY19rZXlfaW5mby5zaXplKCkpKTsKIAogICB2ZXJpZmllci5WZXJpZnlVcGRhdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEuY19zdHIoKSksCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JzYV9wcml2YXRlX2tleV9vcGVuc3NsLmNjIGIvc3JjL2NyeXB0by9yc2FfcHJpdmF0ZV9rZXlfb3BlbnNzbC5jYwppbmRleCA2NGE2MjdlLi4wMDYxZGIxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYV9wcml2YXRlX2tleV9vcGVuc3NsLmNjCisrKyBiL3NyYy9jcnlwdG8vcnNhX3ByaXZhdGVfa2V5X29wZW5zc2wuY2MKQEAgLTEyNiwxMSArMTI2LDExIEBACiAKIFJTQVByaXZhdGVLZXkqIFJTQVByaXZhdGVLZXk6OkNvcHkoKSBjb25zdCB7CiAgIHNjb3BlZF9wdHI8UlNBUHJpdmF0ZUtleT4gY29weShuZXcgUlNBUHJpdmF0ZUtleSgpKTsKLSAgUlNBKiByc2EgPSBFVlBfUEtFWV9nZXQxX1JTQShrZXlfKTsKKyAgYnNzbDo6VW5pcXVlUHRyPFJTQT4gcnNhKEVWUF9QS0VZX2dldDFfUlNBKGtleV8pKTsKICAgaWYgKCFyc2EpCiAgICAgcmV0dXJuIE5VTEw7CiAgIGNvcHktPmtleV8gPSBFVlBfUEtFWV9uZXcoKTsKLSAgaWYgKCFFVlBfUEtFWV9zZXQxX1JTQShjb3B5LT5rZXlfLCByc2EpKQorICBpZiAoIUVWUF9QS0VZX3NldDFfUlNBKGNvcHktPmtleV8sIHJzYS5nZXQoKSkpCiAgICAgcmV0dXJuIE5VTEw7CiAgIHJldHVybiBjb3B5LnJlbGVhc2UoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc2lnbmF0dXJlX2NyZWF0b3JfdW5pdHRlc3QuY2MgYi9zcmMvY3J5cHRvL3NpZ25hdHVyZV9jcmVhdG9yX3VuaXR0ZXN0LmNjCmluZGV4IDJkNjkyMjMuLjg4MWRlOTEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vc2lnbmF0dXJlX2NyZWF0b3JfdW5pdHRlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9zaWduYXR1cmVfY3JlYXRvcl91bml0dGVzdC5jYwpAQCAtMzYsMTcgKzM2LDEwIEBACiAgIHN0ZDo6dmVjdG9yPHVpbnQ4PiBwdWJsaWNfa2V5X2luZm87CiAgIEFTU0VSVF9UUlVFKGtleV9vcmlnaW5hbC0+RXhwb3J0UHVibGljS2V5KCZwdWJsaWNfa2V5X2luZm8pKTsKIAotICAvLyBUaGlzIGlzIHRoZSBhbGdvcml0aG0gSUQgZm9yIFNIQS0xIHdpdGggUlNBIGVuY3J5cHRpb24uCi0gIC8vIFRPRE8oYWEpOiBGYWN0b3IgdGhpcyBvdXQgaW50byBzb21lIHNoYXJlZCBsb2NhdGlvbi4KLSAgY29uc3QgdWludDgga1NIQTFXaXRoUlNBQWxnb3JpdGhtSURbXSA9IHsKLSAgICAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDJhLCAweDg2LCAweDQ4LCAweDg2LAotICAgIDB4ZjcsIDB4MGQsIDB4MDEsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDAKLSAgfTsKICAgY3J5cHRvOjpTaWduYXR1cmVWZXJpZmllciB2ZXJpZmllcjsKICAgQVNTRVJUX1RSVUUodmVyaWZpZXIuVmVyaWZ5SW5pdCgKLSAgICAgIGtTSEExV2l0aFJTQUFsZ29yaXRobUlELCBzaXplb2Yoa1NIQTFXaXRoUlNBQWxnb3JpdGhtSUQpLAotICAgICAgJnNpZ25hdHVyZS5mcm9udCgpLCBzaWduYXR1cmUuc2l6ZSgpLAotICAgICAgJnB1YmxpY19rZXlfaW5mby5mcm9udCgpLCBwdWJsaWNfa2V5X2luZm8uc2l6ZSgpKSk7CisgICAgICBjcnlwdG86OlNpZ25hdHVyZVZlcmlmaWVyOjpSU0FfUEtDUzFfU0hBMSwgJnNpZ25hdHVyZS5mcm9udCgpLAorICAgICAgc2lnbmF0dXJlLnNpemUoKSwgJnB1YmxpY19rZXlfaW5mby5mcm9udCgpLCBwdWJsaWNfa2V5X2luZm8uc2l6ZSgpKSk7CiAKICAgdmVyaWZpZXIuVmVyaWZ5VXBkYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhLmNfc3RyKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaWduYXR1cmVfdmVyaWZpZXIuaCBiL3NyYy9jcnlwdG8vc2lnbmF0dXJlX3ZlcmlmaWVyLmgKaW5kZXggNTA1ZWQwYy4uZTE4MTMzMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaWduYXR1cmVfdmVyaWZpZXIuaAorKysgYi9zcmMvY3J5cHRvL3NpZ25hdHVyZV92ZXJpZmllci5oCkBAIC0yNSwyMSArMjUsMTcgQEAKICAgU2lnbmF0dXJlVmVyaWZpZXIoKTsKICAgflNpZ25hdHVyZVZlcmlmaWVyKCk7CiAKKyAgZW51bSBTaWduYXR1cmVBbGdvcml0aG0geworICAgIFJTQV9QS0NTMV9TSEExLAorICAgIFJTQV9QS0NTMV9TSEEyNTYsCisgICAgRUNEU0FfU0hBMjU2LAorICB9OworCiAgIC8vIFN0cmVhbWluZyBpbnRlcmZhY2U6CiAKICAgLy8gSW5pdGlhdGVzIGEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBvcGVyYXRpb24uICBUaGlzIHNob3VsZCBiZSBmb2xsb3dlZAogICAvLyBieSBvbmUgb3IgbW9yZSBWZXJpZnlVcGRhdGUgY2FsbHMgYW5kIGEgVmVyaWZ5RmluYWwgY2FsbC4KLSAgLy8KLSAgLy8gVGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gaXMgc3BlY2lmaWVkIGFzIGEgREVSIGVuY29kZWQgQVNOLjEKLSAgLy8gQWxnb3JpdGhtSWRlbnRpZmllciBzdHJ1Y3R1cmU6Ci0gIC8vICAgQWxnb3JpdGhtSWRlbnRpZmllciAgOjo9ICBTRVFVRU5DRSAgewotICAvLyAgICAgICBhbGdvcml0aG0gICAgICAgICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiwKLSAgLy8gICAgICAgcGFyYW1ldGVycyAgICAgICAgICAgICAgQU5ZIERFRklORUQgQlkgYWxnb3JpdGhtIE9QVElPTkFMICB9Ci0gIC8vCi0gIC8vIFRoZSBzaWduYXR1cmUgaXMgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0sIGJ1dCBpdAotICAvLyBtdXN0IG5vdCBiZSBmdXJ0aGVyIGVuY29kZWQgaW4gYW4gQVNOLjEgQklUIFNUUklORy4KLSAgLy8gTm90ZTogQW4gUlNBIHNpZ25hdHVyZXMgaXMgYWN0dWFsbHkgYSBiaWcgaW50ZWdlci4gIEl0IG11c3QgYmUgaW4gdGhlCi0gIC8vIGJpZy1lbmRpYW4gYnl0ZSBvcmRlci4KKyAgLy8gVGhlIHNpZ25hdHVyZSBpcyBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobS4KICAgLy8KICAgLy8gVGhlIHB1YmxpYyBrZXkgaXMgc3BlY2lmaWVkIGFzIGEgREVSIGVuY29kZWQgQVNOLjEgU3ViamVjdFB1YmxpY0tleUluZm8KICAgLy8gc3RydWN0dXJlLCB3aGljaCBjb250YWlucyBub3Qgb25seSB0aGUgcHVibGljIGtleSBidXQgYWxzbyBpdHMgdHlwZQpAQCAtNDcsOCArNDMsNyBAQAogICAvLyAgIFN1YmplY3RQdWJsaWNLZXlJbmZvICA6Oj0gIFNFUVVFTkNFICB7CiAgIC8vICAgICAgIGFsZ29yaXRobSAgICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCiAgIC8vICAgICAgIHN1YmplY3RQdWJsaWNLZXkgICAgIEJJVCBTVFJJTkcgIH0KLSAgYm9vbCBWZXJpZnlJbml0KGNvbnN0IHVpbnQ4KiBzaWduYXR1cmVfYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgaW50IHNpZ25hdHVyZV9hbGdvcml0aG1fbGVuLAorICBib29sIFZlcmlmeUluaXQoU2lnbmF0dXJlQWxnb3JpdGhtIHNpZ25hdHVyZV9hbGdvcml0aG0sCiAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogc2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgaW50IHNpZ25hdHVyZV9sZW4sCiAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogcHVibGljX2tleV9pbmZvLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaWduYXR1cmVfdmVyaWZpZXJfb3BlbnNzbC5jYyBiL3NyYy9jcnlwdG8vc2lnbmF0dXJlX3ZlcmlmaWVyX29wZW5zc2wuY2MKaW5kZXggY2FiNDVkYi4uMTEyYzRlMyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaWduYXR1cmVfdmVyaWZpZXJfb3BlbnNzbC5jYworKysgYi9zcmMvY3J5cHRvL3NpZ25hdHVyZV92ZXJpZmllcl9vcGVuc3NsLmNjCkBAIC0yOSw4ICsyOSw3IEBACiAgIFJlc2V0KCk7CiB9CiAKLWJvb2wgU2lnbmF0dXJlVmVyaWZpZXI6OlZlcmlmeUluaXQoY29uc3QgdWludDgqIHNpZ25hdHVyZV9hbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaWduYXR1cmVfYWxnb3JpdGhtX2xlbiwKK2Jvb2wgU2lnbmF0dXJlVmVyaWZpZXI6OlZlcmlmeUluaXQoU2lnbmF0dXJlQWxnb3JpdGhtIHNpZ25hdHVyZV9hbGdvcml0aG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaWduYXR1cmVfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OCogcHVibGljX2tleV9pbmZvLApAQCAtMzksMTIgKzM4LDE4IEBACiAgIHZlcmlmeV9jb250ZXh0XyA9IG5ldyBWZXJpZnlDb250ZXh0OwogICBPcGVuU1NMRXJyU3RhY2tUcmFjZXIgZXJyX3RyYWNlcihGUk9NX0hFUkUpOwogCi0gIFNjb3BlZE9wZW5TU0w8WDUwOV9BTEdPUiwgWDUwOV9BTEdPUl9mcmVlPiBhbGdvcml0aG0oCi0gICAgICBkMmlfWDUwOV9BTEdPUihOVUxMLCAmc2lnbmF0dXJlX2FsZ29yaXRobSwgc2lnbmF0dXJlX2FsZ29yaXRobV9sZW4pKTsKLSAgaWYgKCFhbGdvcml0aG0uZ2V0KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IEVWUF9NRCogZGlnZXN0ID0gRVZQX2dldF9kaWdlc3RieW9iaihhbGdvcml0aG0uZ2V0KCktPmFsZ29yaXRobSk7CisgIGNvbnN0IEVWUF9NRCogZGlnZXN0ID0gbnVsbHB0cjsKKyAgc3dpdGNoIChzaWduYXR1cmVfYWxnb3JpdGhtKSB7CisgICAgY2FzZSBSU0FfUEtDUzFfU0hBMToKKyAgICAgIGRpZ2VzdCA9IEVWUF9zaGExKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJTQV9QS0NTMV9TSEEyNTY6CisgICAgICBkaWdlc3QgPSBFVlBfc2hhMjU2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVDRFNBX1NIQTI1NjoKKyAgICAgIGRpZ2VzdCA9IEVWUF9zaGEyNTYoKTsKKyAgICAgIGJyZWFrOworICB9CiAgIERDSEVDSyhkaWdlc3QpOwogCiAgIHNpZ25hdHVyZV8uYXNzaWduKHNpZ25hdHVyZSwgc2lnbmF0dXJlICsgc2lnbmF0dXJlX2xlbik7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NpZ25hdHVyZV92ZXJpZmllcl91bml0dGVzdC5jYyBiL3NyYy9jcnlwdG8vc2lnbmF0dXJlX3ZlcmlmaWVyX3VuaXR0ZXN0LmNjCmluZGV4IDM2MGFmYTkuLmE2OTRhMWYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vc2lnbmF0dXJlX3ZlcmlmaWVyX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vc2lnbmF0dXJlX3ZlcmlmaWVyX3VuaXR0ZXN0LmNjCkBAIC0xMTEsMTkgKzExMSw2IEBACiAgICAgMHg3NCwgMHgyZSwgMHg2ZiwgMHg3MiwgMHg2NwogICB9OwogCi0gIC8vIFRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIGlzIHNwZWNpZmllZCBhcyB0aGUgZm9sbG93aW5nIEFTTi4xIHN0cnVjdHVyZToKLSAgLy8gICAgQWxnb3JpdGhtSWRlbnRpZmllciAgOjo9ICBTRVFVRU5DRSAgewotICAvLyAgICAgICAgYWxnb3JpdGhtICAgICAgICAgICAgICAgT0JKRUNUIElERU5USUZJRVIsCi0gIC8vICAgICAgICBwYXJhbWV0ZXJzICAgICAgICAgICAgICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwgIH0KLSAgLy8KLSAgY29uc3QgdWludDggc2lnbmF0dXJlX2FsZ29yaXRobVsxNV0gPSB7Ci0gICAgMHgzMCwgMHgwZCwgIC8vIGEgU0VRVUVOQ0Ugb2YgbGVuZ3RoIDEzICgweGQpCi0gICAgICAweDA2LCAweDA5LCAgLy8gYW4gT0JKRUNUIElERU5USUZJRVIgb2YgbGVuZ3RoIDkKLSAgICAgICAgLy8gMS4yLjg0MC4xMTM1NDkuMS4xLjUgLSBzaGExV2l0aFJTQUVuY3J5cHRpb24KLSAgICAgICAgMHgyYSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhmNywgMHgwZCwgMHgwMSwgMHgwMSwgMHgwNSwKLSAgICAgIDB4MDUsIDB4MDAsICAvLyBhIE5VTEwgb2YgbGVuZ3RoIDAKLSAgfTsKLQogICAvLyBSU0Egc2lnbmF0dXJlLCBhIGJpZyBpbnRlZ2VyIGluIHRoZSBiaWctZW5kaWFuIGJ5dGUgb3JkZXIuCiAgIGNvbnN0IHVpbnQ4IHNpZ25hdHVyZVsyNTZdID0gewogICAgIDB4MWUsIDB4NmEsIDB4ZTcsIDB4ZTAsIDB4NGYsIDB4ZTcsIDB4NGQsIDB4ZDAsIDB4NjksIDB4N2MsIDB4ZjgsIDB4OGYsCkBAIC0yMDUsMTAgKzE5Miw5IEBACiAKICAgLy8gVGVzdCAxOiBmZWVkIGFsbCBvZiB0aGUgZGF0YSB0byB0aGUgdmVyaWZpZXIgYXQgb25jZSAoYSBzaW5nbGUKICAgLy8gVmVyaWZ5VXBkYXRlIGNhbGwpLgotICBvayA9IHZlcmlmaWVyLlZlcmlmeUluaXQoc2lnbmF0dXJlX2FsZ29yaXRobSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzaWduYXR1cmVfYWxnb3JpdGhtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwgc2l6ZW9mKHNpZ25hdHVyZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfa2V5X2luZm8sIHNpemVvZihwdWJsaWNfa2V5X2luZm8pKTsKKyAgb2sgPSB2ZXJpZmllci5WZXJpZnlJbml0KGNyeXB0bzo6U2lnbmF0dXJlVmVyaWZpZXI6OlJTQV9QS0NTMV9TSEExLCBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2lnbmF0dXJlKSwgcHVibGljX2tleV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB1YmxpY19rZXlfaW5mbykpOwogICBFWFBFQ1RfVFJVRShvayk7CiAgIHZlcmlmaWVyLlZlcmlmeVVwZGF0ZSh0YnNfY2VydGlmaWNhdGUsIHNpemVvZih0YnNfY2VydGlmaWNhdGUpKTsKICAgb2sgPSB2ZXJpZmllci5WZXJpZnlGaW5hbCgpOwpAQCAtMjE2LDEwICsyMDIsOSBAQAogCiAgIC8vIFRlc3QgMjogZmVlZCB0aGUgZGF0YSB0byB0aGUgdmVyaWZpZXIgaW4gdGhyZWUgcGFydHMgKHRocmVlIFZlcmlmeVVwZGF0ZQogICAvLyBjYWxscykuCi0gIG9rID0gdmVyaWZpZXIuVmVyaWZ5SW5pdChzaWduYXR1cmVfYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNpZ25hdHVyZV9hbGdvcml0aG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaXplb2Yoc2lnbmF0dXJlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfaW5mbywgc2l6ZW9mKHB1YmxpY19rZXlfaW5mbykpOworICBvayA9IHZlcmlmaWVyLlZlcmlmeUluaXQoY3J5cHRvOjpTaWduYXR1cmVWZXJpZmllcjo6UlNBX1BLQ1MxX1NIQTEsIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzaWduYXR1cmUpLCBwdWJsaWNfa2V5X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHVibGljX2tleV9pbmZvKSk7CiAgIEVYUEVDVF9UUlVFKG9rKTsKICAgdmVyaWZpZXIuVmVyaWZ5VXBkYXRlKHRic19jZXJ0aWZpY2F0ZSwgICAgICAgMjU2KTsKICAgdmVyaWZpZXIuVmVyaWZ5VXBkYXRlKHRic19jZXJ0aWZpY2F0ZSArIDI1NiwgMjU2KTsKQEAgLTIzMSwxMCArMjE2LDkgQEAKICAgdWludDggYmFkX3Ric19jZXJ0aWZpY2F0ZVtzaXplb2YodGJzX2NlcnRpZmljYXRlKV07CiAgIG1lbWNweShiYWRfdGJzX2NlcnRpZmljYXRlLCB0YnNfY2VydGlmaWNhdGUsIHNpemVvZih0YnNfY2VydGlmaWNhdGUpKTsKICAgYmFkX3Ric19jZXJ0aWZpY2F0ZVsxMF0gKz0gMTsgIC8vIENvcnJ1cHQgb25lIGJ5dGUgb2YgdGhlIGRhdGEuCi0gIG9rID0gdmVyaWZpZXIuVmVyaWZ5SW5pdChzaWduYXR1cmVfYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNpZ25hdHVyZV9hbGdvcml0aG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaXplb2Yoc2lnbmF0dXJlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfaW5mbywgc2l6ZW9mKHB1YmxpY19rZXlfaW5mbykpOworICBvayA9IHZlcmlmaWVyLlZlcmlmeUluaXQoY3J5cHRvOjpTaWduYXR1cmVWZXJpZmllcjo6UlNBX1BLQ1MxX1NIQTEsIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzaWduYXR1cmUpLCBwdWJsaWNfa2V5X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHVibGljX2tleV9pbmZvKSk7CiAgIEVYUEVDVF9UUlVFKG9rKTsKICAgdmVyaWZpZXIuVmVyaWZ5VXBkYXRlKGJhZF90YnNfY2VydGlmaWNhdGUsIHNpemVvZihiYWRfdGJzX2NlcnRpZmljYXRlKSk7CiAgIG9rID0gdmVyaWZpZXIuVmVyaWZ5RmluYWwoKTsKQEAgLTI0NCw4ICsyMjgsNyBAQAogICB1aW50OCBiYWRfc2lnbmF0dXJlW3NpemVvZihzaWduYXR1cmUpXTsKICAgbWVtY3B5KGJhZF9zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKHNpZ25hdHVyZSkpOwogICBiYWRfc2lnbmF0dXJlWzEwXSArPSAxOyAgLy8gQ29ycnVwdCBvbmUgYnl0ZSBvZiB0aGUgc2lnbmF0dXJlLgotICBvayA9IHZlcmlmaWVyLlZlcmlmeUluaXQoc2lnbmF0dXJlX2FsZ29yaXRobSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzaWduYXR1cmVfYWxnb3JpdGhtKSwKKyAgb2sgPSB2ZXJpZmllci5WZXJpZnlJbml0KGNyeXB0bzo6U2lnbmF0dXJlVmVyaWZpZXI6OlJTQV9QS0NTMV9TSEExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkX3NpZ25hdHVyZSwgc2l6ZW9mKGJhZF9zaWduYXR1cmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2tleV9pbmZvLCBzaXplb2YocHVibGljX2tleV9pbmZvKSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9uZXQvYmFzZS9vcGVuc3NsX21lbW9yeV9wcml2YXRlX2tleV9zdG9yZS5jYyBiL3NyYy9uZXQvYmFzZS9vcGVuc3NsX21lbW9yeV9wcml2YXRlX2tleV9zdG9yZS5jYwppbmRleCA5MjcxNmYyLi40ODExNTcyIDEwMDY0NAotLS0gYS9zcmMvbmV0L2Jhc2Uvb3BlbnNzbF9tZW1vcnlfcHJpdmF0ZV9rZXlfc3RvcmUuY2MKKysrIGIvc3JjL25ldC9iYXNlL29wZW5zc2xfbWVtb3J5X3ByaXZhdGVfa2V5X3N0b3JlLmNjCkBAIC00LDEwICs0LDEwIEBACiAKIC8vIERlZmluZXMgYW4gaW4tbWVtb3J5IHByaXZhdGUga2V5IHN0b3JlLCBwcmltYXJpbHkgdXNlZCBmb3IgdGVzdGluZy4KIAotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KICNpbmNsdWRlICJuZXQvYmFzZS9vcGVuc3NsX3ByaXZhdGVfa2V5X3N0b3JlLmgiCiAKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2luZ2xldG9uLmgiCiAjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgpAQCAtMzQsNyArMzQsMTIgQEAKICAgfQogCiAgIHZpcnR1YWwgYm9vbCBTdG9yZVByaXZhdGVLZXkoY29uc3QgR1VSTCYgdXJsLCBFVlBfUEtFWSogcGtleSkgeworI2lmIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgICAgRVZQX1BLRVlfdXBfcmVmKHBrZXkpOworI2Vsc2UKICAgICBDUllQVE9fYWRkKCZwa2V5LT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19FVlBfUEtFWSk7CisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisKICAgICBiYXNlOjpBdXRvTG9jayBsb2NrKGxvY2tfKTsKICAgICBrZXlzXy5wdXNoX2JhY2socGtleSk7CiAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvbmV0L2Jhc2UveDUwOV9jZXJ0aWZpY2F0ZV9vcGVuc3NsLmNjIGIvc3JjL25ldC9iYXNlL3g1MDlfY2VydGlmaWNhdGVfb3BlbnNzbC5jYwppbmRleCBjMGRlZGJlLi4wN2U1MThiIDEwMDY0NAotLS0gYS9zcmMvbmV0L2Jhc2UveDUwOV9jZXJ0aWZpY2F0ZV9vcGVuc3NsLmNjCisrKyBiL3NyYy9uZXQvYmFzZS94NTA5X2NlcnRpZmljYXRlX29wZW5zc2wuY2MKQEAgLTI1MCwxMiArMjUwLDE4IEBACiBYNTA5Q2VydGlmaWNhdGU6Ok9TQ2VydEhhbmRsZSBYNTA5Q2VydGlmaWNhdGU6OkR1cE9TQ2VydEhhbmRsZSgKICAgICBPU0NlcnRIYW5kbGUgY2VydF9oYW5kbGUpIHsKICAgRENIRUNLKGNlcnRfaGFuZGxlKTsKKworI2lmIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgIFg1MDlfdXBfcmVmKGNlcnRfaGFuZGxlKTsKKyNlbHNlCiAgIC8vIFVzaW5nIFg1MDlfZHVwIGNhdXNlcyB0aGUgZW50aXJlIGNlcnRpZmljYXRlIHRvIGJlIHJlcGFyc2VkLiBUaGlzCiAgIC8vIGNvbnZlcnNpb24sIGJlc2lkZXMgYmVpbmcgbm9uLXRyaXZpYWwsIGRyb3BzIGFueSBhc3NvY2lhdGVkCiAgIC8vIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEgc2V0IGJ5IFg1MDlfc2V0X2V4X2RhdGEuIFVzaW5nIENSWVBUT19hZGQKICAgLy8ganVzdCBidW1wcyB1cCB0aGUgcmVmLWNvdW50IGZvciB0aGUgY2VydCwgd2l0aG91dCBjYXVzaW5nIGFueSBhbGxvY2F0aW9ucwogICAvLyBvciBkZWFsbG9jYXRpb25zLgogICBDUllQVE9fYWRkKCZjZXJ0X2hhbmRsZS0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOSk7CisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisKICAgcmV0dXJuIGNlcnRfaGFuZGxlOwogfQogCmRpZmYgLS1naXQgYS9zcmMvbmV0L2Jhc2UveDUwOV91dGlsX29wZW5zc2wuY2MgYi9zcmMvbmV0L2Jhc2UveDUwOV91dGlsX29wZW5zc2wuY2MKaW5kZXggMTQyYmY3Ny4uZmVhNWViYiAxMDA2NDQKLS0tIGEvc3JjL25ldC9iYXNlL3g1MDlfdXRpbF9vcGVuc3NsLmNjCisrKyBiL3NyYy9uZXQvYmFzZS94NTA5X3V0aWxfb3BlbnNzbC5jYwpAQCAtMiwxNCArMiwxNiBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgIm5ldC9iYXNlL3g1MDlfdXRpbC5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL3g1MDlfdXRpbF9vcGVuc3NsLmgiCiAKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdfcGllY2UuaCIKICNpbmNsdWRlICJuZXQvYmFzZS94NTA5X2NlcnRfdHlwZXMuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS94NTA5X3V0aWwuaCIKIAogbmFtZXNwYWNlIG5ldCB7CiAKZGlmZiAtLWdpdCBhL3NyYy9uZXQvaHR0cC9kZXMuY2MgYi9zcmMvbmV0L2h0dHAvZGVzLmNjCmluZGV4IDc5MjQwY2YuLjhlOGRmYzYgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvaHR0cC9kZXMuY2MKKysrIGIvc3JjL25ldC9odHRwL2Rlcy5jYwpAQCAtOTQsOSArOTQsOSBAQAogCiAgIERFU19rZXlfc2NoZWR1bGUga3M7CiAgIERFU19zZXRfa2V5X3VuY2hlY2tlZCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3RfREVTX2NibG9jayo+KGNvbnN0X2Nhc3Q8dWludDgqPihrZXkpKSwgJmtzKTsKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgREVTX2NibG9jayo+KGNvbnN0X2Nhc3Q8dWludDgqPihrZXkpKSwgJmtzKTsKIAotICBERVNfZWNiX2VuY3J5cHQocmVpbnRlcnByZXRfY2FzdDxjb25zdF9ERVNfY2Jsb2NrKj4oY29uc3RfY2FzdDx1aW50OCo+KHNyYykpLAorICBERVNfZWNiX2VuY3J5cHQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBERVNfY2Jsb2NrKj4oY29uc3RfY2FzdDx1aW50OCo+KHNyYykpLAogICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxERVNfY2Jsb2NrKj4oaGFzaCksICZrcywgREVTX0VOQ1JZUFQpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvbmV0L25ldC5neXAgYi9zcmMvbmV0L25ldC5neXAKaW5kZXggMmUxMDNiYS4uZWRiNzdhZCAxMDA2NDQKLS0tIGEvc3JjL25ldC9uZXQuZ3lwCisrKyBiL3NyYy9uZXQvbmV0Lmd5cApAQCAtMzcsOSArMzcsOSBAQAogICAgICAgICAnPChERVBUSCkvZ29vZ2xldXJsL2dvb2dsZXVybC5neXA6Z29vZ2xldXJsJywKICAgICAgICAgJzwoREVQVEgpL25iL25iLmd5cDpuYicsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cDpzdGFyYm9hcmQnLAorICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2JvcmluZ3NzbC5neXA6Y3J5cHRvJywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2ljdS9pY3UuZ3lwOmljdWkxOG4nLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvaWN1L2ljdS5neXA6aWN1dWMnLAotICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvb3BlbnNzbC9vcGVuc3NsLmd5cDpvcGVuc3NsJywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L3psaWIvemxpYi5neXA6emxpYicsCiAgICAgICBdLAogICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCkBAIC04MjAsOCArODIwLDggQEAKICAgICAgICAgJzwoREVQVEgpL2dvb2dsZXVybC9nb29nbGV1cmwuZ3lwOmdvb2dsZXVybCcsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCisgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvYm9yaW5nc3NsLmd5cDpjcnlwdG8nLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvemxpYi96bGliLmd5cDp6bGliJywKLSAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC5neXA6b3BlbnNzbCcsCiAgICAgICAgICdodHRwX3NlcnZlcicsICAjIFRoaXMgaXMgbmVlZGVkIGJ5IGRpYWxfaHR0cF9zZXJ2ZXIgaW4gbmV0CiAgICAgICAgICduZXQnLAogICAgICAgICAnbmV0X2NvcHlfdGVzdF9kYXRhJywKQEAgLTExMjUsNyArMTEyNSw3IEBACiAgICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDp0ZXN0X3N1cHBvcnRfYmFzZScsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCi0gICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wuZ3lwOm9wZW5zc2wnLAorICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2JvcmluZ3NzbC5neXA6Y3J5cHRvJywKICAgICAgICAgJ25ldCcsCiAgICAgICBdLAogICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCmRpZmYgLS1naXQgYS9zcmMvbmV0L3NvY2tldC9zc2xfY2xpZW50X3NvY2tldF9vcGVuc3NsLmNjIGIvc3JjL25ldC9zb2NrZXQvc3NsX2NsaWVudF9zb2NrZXRfb3BlbnNzbC5jYwppbmRleCBiZjUzMmFkLi5iMmNlMDA1IDEwMDY0NAotLS0gYS9zcmMvbmV0L3NvY2tldC9zc2xfY2xpZW50X3NvY2tldF9vcGVuc3NsLmNjCisrKyBiL3NyYy9uZXQvc29ja2V0L3NzbF9jbGllbnRfc29ja2V0X29wZW5zc2wuY2MKQEAgLTcsMTUgKzcsMTYgQEAKIAogI2luY2x1ZGUgIm5ldC9zb2NrZXQvc3NsX2NsaWVudF9zb2NrZXRfb3BlbnNzbC5oIgogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3NpbmdsZXRvbi5oIgogI2luY2x1ZGUgImJhc2UvbWV0cmljcy9oaXN0b2dyYW0uaCIKICNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCiAjaW5jbHVkZSAiY3J5cHRvL29wZW5zc2xfdXRpbC5oIgogI2luY2x1ZGUgIm5ldC9iYXNlL2NlcnRfdmVyaWZpZXIuaCIKICNpbmNsdWRlICJuZXQvYmFzZS9uZXRfZXJyb3JzLmgiCkBAIC0zMyw5ICszNCwxMSBAQAogCiAvLyBFbmFibGUgdGhpcyB0byBzZWUgbG9nZ2luZyBmb3Igc3RhdGUgbWFjaGluZSBzdGF0ZSB0cmFuc2l0aW9ucy4KICNpZiAwCi0jZGVmaW5lIEdvdG9TdGF0ZShzKSBkbyB7IERWTE9HKDIpIDw8ICh2b2lkICopdGhpcyA8PCAiICIgPDwgX19GVU5DVElPTl9fIDw8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIganVtcCB0byBzdGF0ZSAiIDw8IHM7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfaGFuZHNoYWtlX3N0YXRlXyA9IHM7IH0gd2hpbGUgKDApCisjZGVmaW5lIEdvdG9TdGF0ZShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRFZMT0coMikgPDwgKHZvaWQqKXRoaXMgPDwgIiAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiIGp1bXAgdG8gc3RhdGUgIiA8PCBzOyBcCisgICAgbmV4dF9oYW5kc2hha2Vfc3RhdGVfID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSBHb3RvU3RhdGUocykgbmV4dF9oYW5kc2hha2Vfc3RhdGVfID0gcwogI2VuZGlmCkBAIC00Nyw2ICs1MCw5IEBACiAjZWxzZQogY29uc3Qgc2l6ZV90IGtTZXNzaW9uQ2FjaGVNYXhFbnRpcmVzID0gMTAyNDsKICNlbmRpZiAgLy8gaWYgZGVmaW5lZChDT0JBTFQpCisjaWYgZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKK3NpemVfdCBleHBpcmF0aW9uX2NoZWNrX2NvdW50ID0gMjU2OworI2VuZGlmICAvLyBkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQogCiAvLyBJZiBhIGNsaWVudCBkb2Vzbid0IGhhdmUgYSBsaXN0IG9mIHByb3RvY29scyB0aGF0IGl0IHN1cHBvcnRzLCBidXQKIC8vIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgTlBOLCBjaG9vc2luZyAiaHR0cC8xLjEiIGlzIHRoZSBiZXN0IGFuc3dlci4KQEAgLTU0LDE5ICs2MCwxOSBAQAogCiAjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAwMDEwM2ZMCiAvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBtYWRlIGl0IGludG8gdGhlIE9wZW5TU0wgaGVhZGVycy4KLXVuc2lnbmVkIGxvbmcgU1NMX0NJUEhFUl9nZXRfaWQoY29uc3QgU1NMX0NJUEhFUiogY2lwaGVyKSB7IHJldHVybiBjaXBoZXItPmlkOyB9Cit1bnNpZ25lZCBsb25nIFNTTF9DSVBIRVJfZ2V0X2lkKGNvbnN0IFNTTF9DSVBIRVIqIGNpcGhlcikgeworICByZXR1cm4gY2lwaGVyLT5pZDsKK30KICNlbmRpZgogCiAvLyBVc2VkIGZvciBlbmNvZGluZyB0aGUgfGNvbm5lY3Rpb25fc3RhdHVzfCBmaWVsZCBvZiBhbiBTU0xJbmZvIG9iamVjdC4KLWludCBFbmNvZGVTU0xDb25uZWN0aW9uU3RhdHVzKGludCBjaXBoZXJfc3VpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbikgewotICByZXR1cm4gKChjaXBoZXJfc3VpdGUgJiBTU0xfQ09OTkVDVElPTl9DSVBIRVJTVUlURV9NQVNLKSA8PAotICAgICAgICAgIFNTTF9DT05ORUNUSU9OX0NJUEhFUlNVSVRFX1NISUZUKSB8Ci0gICAgICAgICAoKGNvbXByZXNzaW9uICYgU1NMX0NPTk5FQ1RJT05fQ09NUFJFU1NJT05fTUFTSykgPDwKLSAgICAgICAgICBTU0xfQ09OTkVDVElPTl9DT01QUkVTU0lPTl9TSElGVCkgfAotICAgICAgICAgKCh2ZXJzaW9uICYgU1NMX0NPTk5FQ1RJT05fVkVSU0lPTl9NQVNLKSA8PAotICAgICAgICAgIFNTTF9DT05ORUNUSU9OX1ZFUlNJT05fU0hJRlQpOworaW50IEVuY29kZVNTTENvbm5lY3Rpb25TdGF0dXMoaW50IGNpcGhlcl9zdWl0ZSwgaW50IGNvbXByZXNzaW9uLCBpbnQgdmVyc2lvbikgeworICByZXR1cm4gKChjaXBoZXJfc3VpdGUgJiBTU0xfQ09OTkVDVElPTl9DSVBIRVJTVUlURV9NQVNLKQorICAgICAgICAgIDw8IFNTTF9DT05ORUNUSU9OX0NJUEhFUlNVSVRFX1NISUZUKSB8CisgICAgICAgICAoKGNvbXByZXNzaW9uICYgU1NMX0NPTk5FQ1RJT05fQ09NUFJFU1NJT05fTUFTSykKKyAgICAgICAgICA8PCBTU0xfQ09OTkVDVElPTl9DT01QUkVTU0lPTl9TSElGVCkgfAorICAgICAgICAgKCh2ZXJzaW9uICYgU1NMX0NPTk5FQ1RJT05fVkVSU0lPTl9NQVNLKQorICAgICAgICAgIDw8IFNTTF9DT05ORUNUSU9OX1ZFUlNJT05fU0hJRlQpOwogfQogCiAvLyBSZXR1cm5zIHRoZSBuZXQgU1NMIHZlcnNpb24gbnVtYmVyIChzZWUgc3NsX2Nvbm5lY3Rpb25fc3RhdHVzX2ZsYWdzLmgpIGZvcgpAQCAtODcsNyArOTMsOTggQEAKICAgICAgIHJldHVybiBTU0xfQ09OTkVDVElPTl9WRVJTSU9OX1VOS05PV047CiAgIH0KIH0KKyNpZiBkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQoraW50IE1hcE9wZW5TU0xFcnJvclNTTCgpIHsKKyAgLy8gV2FsayBkb3duIHRoZSBlcnJvciBzdGFjayB0byBmaW5kIHRoZSBTU0xlcnIgZ2VuZXJhdGVkIHJlYXNvbi4KKyAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOworICBkbyB7CisgICAgZXJyb3JfY29kZSA9IEVSUl9nZXRfZXJyb3IoKTsKKyAgICBpZiAoZXJyb3JfY29kZSA9PSAwKSB7CisgICAgICByZXR1cm4gRVJSX1NTTF9QUk9UT0NPTF9FUlJPUjsKKyAgICB9CisgIH0gd2hpbGUgKEVSUl9HRVRfTElCKGVycm9yX2NvZGUpICE9IEVSUl9MSUJfU1NMKTsKIAorICBETE9HKEVSUk9SKSA8PCAiT3BlblNTTCBTU0wgZXJyb3IsIHJlYXNvbjogIiA8PCBFUlJfR0VUX1JFQVNPTihlcnJvcl9jb2RlKQorICAgICAgICAgICAgICA8PCAiLCBuYW1lOiAiIDw8IEVSUl9lcnJvcl9zdHJpbmcoZXJyb3JfY29kZSwgTlVMTCk7CisgIHN3aXRjaCAoRVJSX0dFVF9SRUFTT04oZXJyb3JfY29kZSkpIHsKKyAgICBjYXNlIFNTTF9SX1JFQURfVElNRU9VVF9FWFBJUkVEOgorICAgICAgcmV0dXJuIEVSUl9USU1FRF9PVVQ7CisgICAgY2FzZSBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFOgorICAgICAgcmV0dXJuIEVSUl9JTlZBTElEX0FSR1VNRU5UOworICAgIGNhc2UgU1NMX1JfVU5LTk9XTl9DRVJUSUZJQ0FURV9UWVBFOgorICAgIGNhc2UgU1NMX1JfVU5LTk9XTl9DSVBIRVJfVFlQRToKKyAgICBjYXNlIFNTTF9SX1VOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEU6CisgICAgY2FzZSBTU0xfUl9JTlZBTElEX09VVEVSX1JFQ09SRF9UWVBFOgorICAgIGNhc2UgU1NMX1JfTk9fQ09NTU9OX1NJR05BVFVSRV9BTEdPUklUSE1TOgorICAgIGNhc2UgU1NMX1JfVU5LTk9XTl9TU0xfVkVSU0lPTjoKKyAgICAgIHJldHVybiBFUlJfTk9UX0lNUExFTUVOVEVEOworICAgIGNhc2UgU1NMX1JfSU5WQUxJRF9BTFBOX1BST1RPQ09MOgorICAgIGNhc2UgU1NMX1JfTk9fQ0lQSEVSX01BVENIOgorICAgIGNhc2UgU1NMX1JfTk9fU0hBUkVEX0NJUEhFUjoKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX1BST1RPQ09MX1ZFUlNJT046CisgICAgY2FzZSBTU0xfUl9VTlNVUFBPUlRFRF9QUk9UT0NPTDoKKyAgICAgIHJldHVybiBFUlJfU1NMX1ZFUlNJT05fT1JfQ0lQSEVSX01JU01BVENIOworICAgIGNhc2UgU1NMX1JfU1NMVjNfQUxFUlRfQkFEX0NFUlRJRklDQVRFOgorICAgIGNhc2UgU1NMX1JfU1NMVjNfQUxFUlRfVU5TVVBQT1JURURfQ0VSVElGSUNBVEU6CisgICAgY2FzZSBTU0xfUl9TU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9SRVZPS0VEOgorICAgIGNhc2UgU1NMX1JfU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfRVhQSVJFRDoKKyAgICBjYXNlIFNTTF9SX1NTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1VOS05PV046CisgICAgY2FzZSBTU0xfUl9UTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVEOgorICAgIGNhc2UgU1NMX1JfVExTVjFfQUxFUlRfVU5LTk9XTl9DQToKKyAgICAgIHJldHVybiBFUlJfQkFEX1NTTF9DTElFTlRfQVVUSF9DRVJUOworICAgIGNhc2UgU1NMX1JfQkFEX0VDQ19DRVJUOgorICAgIGNhc2UgU1NMX1JfU1NMVjNfQUxFUlRfREVDT01QUkVTU0lPTl9GQUlMVVJFOgorICAgICAgcmV0dXJuIEVSUl9TU0xfREVDT01QUkVTU0lPTl9GQUlMVVJFX0FMRVJUOworICAgIGNhc2UgU1NMX1JfU1NMVjNfQUxFUlRfQkFEX1JFQ09SRF9NQUM6CisgICAgICByZXR1cm4gRVJSX1NTTF9CQURfUkVDT1JEX01BQ19BTEVSVDsKKyAgICBjYXNlIFNTTF9SX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTl9ESVNBQkxFRDoKKyAgICAgIHJldHVybiBFUlJfU1NMX1VOU0FGRV9ORUdPVElBVElPTjsKKyAgICBjYXNlIFNTTF9SX1JFTkVHT1RJQVRJT05fRU1TX01JU01BVENIOgorICAgICAgcmV0dXJuIEVSUl9TU0xfV0VBS19TRVJWRVJfRVBIRU1FUkFMX0RIX0tFWTsKKyAgICAvLyBTU0xfUl9VTktOT1dOX1BST1RPQ09MIGlzIHJlcG9ydGVkIGlmIHByZW1hdHVyZSBhcHBsaWNhdGlvbiBkYXRhIGlzCisgICAgLy8gcmVjZWl2ZWQgKHNlZSBodHRwOi8vY3JidWcuY29tLzQyNTM4KSwgYW5kIGFsc28gaWYgYWxsIHRoZSBwcm90b2NvbAorICAgIC8vIHZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHdlcmUgZGlzYWJsZWQgaW4gdGhpcyBzb2NrZXQgaW5zdGFuY2UuCisgICAgLy8gTWFwcGVkIHRvIEVSUl9TU0xfUFJPVE9DT0xfRVJST1IgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTU0wgc29ja2V0cworICAgIC8vIGluIHRoZSBmb3JtZXIgc2NlbmFyaW8uCisgICAgY2FzZSBTU0xfUl9VTktOT1dOX1BST1RPQ09MOgorICAgIGNhc2UgU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFOgorICAgIGNhc2UgU1NMX1JfREVDUllQVElPTl9GQUlMRUQ6CisgICAgY2FzZSBTU0xfUl9ERUNSWVBUSU9OX0ZBSUxFRF9PUl9CQURfUkVDT1JEX01BQzoKKyAgICBjYXNlIFNTTF9SX0RIX1BVQkxJQ19WQUxVRV9MRU5HVEhfSVNfV1JPTkc6CisgICAgY2FzZSBTU0xfUl9ESUdFU1RfQ0hFQ0tfRkFJTEVEOgorICAgIGNhc2UgU1NMX1JfRU5DUllQVEVEX0xFTkdUSF9UT09fTE9ORzoKKyAgICBjYXNlIFNTTF9SX0VSUk9SX0lOX1JFQ0VJVkVEX0NJUEhFUl9MSVNUOgorICAgIGNhc2UgU1NMX1JfRVhDRVNTSVZFX01FU1NBR0VfU0laRToKKyAgICBjYXNlIFNTTF9SX0VYVFJBX0RBVEFfSU5fTUVTU0FHRToKKyAgICBjYXNlIFNTTF9SX0hBTkRTSEFLRV9GQUlMVVJFX09OX0NMSUVOVF9IRUxMTzoKKyAgICBjYXNlIFNTTF9SX0lOVkFMSURfQ09NTUFORDoKKyAgICBjYXNlIFNTTF9SX1dST05HX1ZFUlNJT05fT05fRUFSTFlfREFUQToKKyAgICBjYXNlIFNTTF9SX0lOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RIOgorICAgIGNhc2UgU1NMX1JfU1JUUF9VTktOT1dOX1BST1RFQ1RJT05fUFJPRklMRToKKyAgICBjYXNlIFNTTF9SX1NTTFYzX0FMRVJUX1VORVhQRUNURURfTUVTU0FHRToKKyAgICAvLyBUT0RPKGpvdGgpOiBTU0xfUl9TU0xWM19BTEVSVF9IQU5EU0hBS0VfRkFJTFVSRSBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUKKyAgICAvLyBzZXJ2ZXIgYWZ0ZXIgcmVjZWl2aW5nIENsaWVudEhlbGxvIGlmIHRoZXJlJ3Mgbm8gY29tbW9uIHN1cHBvcnRlZCBjaXBoZXIuCisgICAgLy8gSWRlYWxseSB3ZSdkIG1hcCB0aGF0IHNwZWNpZmljIGNhc2UgdG8gRVJSX1NTTF9WRVJTSU9OX09SX0NJUEhFUl9NSVNNQVRDSAorICAgIC8vIHRvIG1hdGNoIHRoZSBOU1MgaW1wbGVtZW50YXRpb24uIFNlZSBhbHNvIGh0dHA6Ly9nb28uZ2wvb010WlcKKyAgICBjYXNlIFNTTF9SX1NTTFYzX0FMRVJUX0hBTkRTSEFLRV9GQUlMVVJFOgorICAgIGNhc2UgU1NMX1JfU1NMVjNfQUxFUlRfTk9fQ0VSVElGSUNBVEU6CisgICAgY2FzZSBTU0xfUl9TU0xWM19BTEVSVF9JTExFR0FMX1BBUkFNRVRFUjoKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX0RFQ09ERV9FUlJPUjoKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX0RFQ1JZUFRJT05fRkFJTEVEOgorICAgIGNhc2UgU1NMX1JfVExTVjFfQUxFUlRfREVDUllQVF9FUlJPUjoKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX0VYUE9SVF9SRVNUUklDVElPTjoKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX0lOVEVSTkFMX0VSUk9SOgorICAgIGNhc2UgU1NMX1JfVExTVjFfQUxFUlRfTk9fUkVORUdPVElBVElPTjoKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVzoKKyAgICBjYXNlIFNTTF9SX1RMU1YxX0FMRVJUX1VTRVJfQ0FOQ0VMTEVEOgorICAgICAgcmV0dXJuIEVSUl9TU0xfUFJPVE9DT0xfRVJST1I7CisgICAgZGVmYXVsdDoKKyAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5tYXBwZWQgZXJyb3IgcmVhc29uOiAiIDw8IEVSUl9HRVRfUkVBU09OKGVycm9yX2NvZGUpOworICAgICAgcmV0dXJuIEVSUl9GQUlMRUQ7CisgIH0KK30KKyNlbHNlICAgLy8gZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKIGludCBNYXBPcGVuU1NMRXJyb3JTU0woKSB7CiAgIC8vIFdhbGsgZG93biB0aGUgZXJyb3Igc3RhY2sgdG8gZmluZCB0aGUgU1NMZXJyIGdlbmVyYXRlZCByZWFzb24uCiAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKQEAgLTE4Myw2ICsyODAsNyBAQAogICAgICAgcmV0dXJuIEVSUl9GQUlMRUQ7CiAgIH0KIH0KKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKIAogLy8gQ29udmVydHMgYW4gT3BlblNTTCBlcnJvciBjb2RlIGludG8gYSBuZXQgZXJyb3IgY29kZSwgd2Fsa2luZyB0aGUgT3BlblNTTAogLy8gZXJyb3Igc3RhY2sgaWYgbmVlZGVkLiBOb3RlIHRoYXQgfHRyYWNlcnwgaXMgbm90IGN1cnJlbnRseSB1c2VkIGluIHRoZQpAQCAtMjA3LDcgKzMwNSw3IEBACiAKIC8vIFdlIGRvIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhZnRlciBoYW5kc2hha2UsIHNvIHdlIGRpc2FibGUgdGhlIGRlZmF1bHQKIC8vIGJ5IHJlZ2lzdGVyaW5nIGEgbm8tb3AgdmVyaWZ5IGZ1bmN0aW9uLgotaW50IE5vT3BWZXJpZnlDYWxsYmFjayhYNTA5X1NUT1JFX0NUWCosIHZvaWQgKikgeworaW50IE5vT3BWZXJpZnlDYWxsYmFjayhYNTA5X1NUT1JFX0NUWCosIHZvaWQqKSB7CiAgIERWTE9HKDMpIDw8ICJza2lwcGluZyBjZXJ0IHZlcmlmeSI7CiAgIHJldHVybiAxOwogfQpAQCAtMjE5LDYgKzMxNywxMCBAQAogIHB1YmxpYzoKICAgU1NMU2Vzc2lvbkNhY2hlKCkge30KIAorI2lmIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgIH5TU0xTZXNzaW9uQ2FjaGUoKSB7IEZsdXNoKCk7IH0KKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKKwogICB2b2lkIE9uU2Vzc2lvbkFkZGVkKGNvbnN0IEhvc3RQb3J0UGFpciYgaG9zdF9hbmRfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2hhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFU1NJT04qIHNlc3Npb24pIHsKQEAgLTIzNyw4ICszMzksOCBAQAogICAgICAgc2Vzc2lvbl9tYXBfLmVyYXNlKHNlc3Npb25fdG9fZnJlZS5nZXQoKSk7CiAgICAgICByZXMuZmlyc3QtPnNlY29uZCA9IHNlc3Npb247CiAgICAgfQotICAgIERWTE9HKDIpIDw8ICJBZGRpbmcgc2Vzc2lvbiAiIDw8IHNlc3Npb24gPDwgIiA9PiAiCi0gICAgICAgICAgICAgPDwgY2FjaGVfa2V5IDw8ICIsIG5ldyBlbnRyeSA9ICIgPDwgcmVzLnNlY29uZDsKKyAgICBEVkxPRygyKSA8PCAiQWRkaW5nIHNlc3Npb24gIiA8PCBzZXNzaW9uIDw8ICIgPT4gIiA8PCBjYWNoZV9rZXkKKyAgICAgICAgICAgICA8PCAiLCBuZXcgZW50cnkgPSAiIDw8IHJlcy5zZWNvbmQ7CiAgICAgRENIRUNLKGhvc3RfcG9ydF9tYXBfW2NhY2hlX2tleV0gPT0gc2Vzc2lvbik7CiAgICAgc2Vzc2lvbl9tYXBfW3Nlc3Npb25dID0gcmVzLmZpcnN0OwogICAgIERDSEVDS19FUShob3N0X3BvcnRfbWFwXy5zaXplKCksIHNlc3Npb25fbWFwXy5zaXplKCkpOwpAQCAtMjYyLDExICszNjQsMTkgQEAKICAgICBEQ0hFQ0tfRVEoaG9zdF9wb3J0X21hcF8uc2l6ZSgpLCBzZXNzaW9uX21hcF8uc2l6ZSgpKTsKICAgfQogCi0gIC8vIExvb2tzIHVwIHRoZSBob3N0OnBvcnQgaW4gdGhlIGNhY2hlLCBhbmQgaWYgYSBzZXNzaW9uIGlzIGZvdW5kIGl0IGlzIGFkZGVkCi0gIC8vIHRvIHxzc2x8LCByZXR1cm5pbmcgdHJ1ZSBvbiBzdWNjZXNzLgotICBib29sIFNldFNTTFNlc3Npb24oU1NMKiBzc2wsIGNvbnN0IEhvc3RQb3J0UGFpciYgaG9zdF9hbmRfcG9ydCwKKyAgLy8gTG9va3MgdXAgdGhlIGhvc3Q6cG9ydCBpbiB0aGUgY2FjaGUsIGFuZCBpZiBhIHNlc3Npb24gaXMgZm91bmQgaXQgaXMKKyAgLy8gYWRkZWQgdG8gfHNzbHwsIHJldHVybmluZyB0cnVlIG9uIHN1Y2Nlc3MuCisgIGJvb2wgU2V0U1NMU2Vzc2lvbihTU0wqIHNzbCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhvc3RQb3J0UGFpciYgaG9zdF9hbmRfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaGFyZCkgewogICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobG9ja18pOworI2lmIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgICAgbG9va3Vwc19zaW5jZV9mbHVzaF8rKzsKKyAgICBpZiAobG9va3Vwc19zaW5jZV9mbHVzaF8gPj0gZXhwaXJhdGlvbl9jaGVja19jb3VudCkgeworICAgICAgRmx1c2hFeHBpcmVkU2Vzc2lvbnMoKTsKKyAgICB9CisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisKICAgICBjb25zdCBzdGQ6OnN0cmluZyBjYWNoZV9rZXkgPSBHZXRDYWNoZUtleShob3N0X2FuZF9wb3J0LCBzaGFyZCk7CiAgICAgSG9zdFBvcnRNYXA6Oml0ZXJhdG9yIGl0ID0gaG9zdF9wb3J0X21hcF8uZmluZChjYWNoZV9rZXkpOwogICAgIGlmIChpdCA9PSBob3N0X3BvcnRfbWFwXy5lbmQoKSkKQEAgLTI3NSwxMSArMzg1LDE5IEBACiAgICAgU1NMX1NFU1NJT04qIHNlc3Npb24gPSBpdC0+c2Vjb25kOwogICAgIERDSEVDSyhzZXNzaW9uKTsKICAgICBEQ0hFQ0soc2Vzc2lvbl9tYXBfW3Nlc3Npb25dID09IGl0KTsKLSAgICAvLyBJZGVhbGx5IHdlJ2QgcmVsZWFzZSB8bG9ja198IGJlZm9yZSBjYWxsaW5nIGludG8gT3BlblNTTCBoZXJlLCBob3dldmVyCi0gICAgLy8gdGhhdCBvcGVucyBhIHNtYWxsIHJpc2sgfHNlc3Npb258IHdpbGwgZ28gb3V0IG9mIHNjb3BlIGJlZm9yZSBpdCBpcyB1c2VkLgotICAgIC8vIEFsdGVybmF0aXZlbHkgd2Ugd291bGQgdGFrZSBhIHRlbXBvcmFyeSBsb2NhbCByZWZjb3VudCBvbiB8c2Vzc2lvbnwsCi0gICAgLy8gZXhjZXB0IE9wZW5TU0wgZG9lcyBub3QgcHJvdmlkZSBhIHB1YmxpYyBBUEkgZm9yIGFkZGluZyBhIHJlZiAoYy5mLgotICAgIC8vIFNTTF9TRVNTSU9OX2ZyZWUgd2hpY2ggZGVjcmVtZW50cyB0aGUgcmVmKS4KKyNpZiBkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQorICAgIGlmIChJc0V4cGlyZWQoc2Vzc2lvbiwgYmFzZTo6VGltZTo6Tm93KCkuVG9UaW1lVCgpKSkgeworICAgICAgU1NMX1NFU1NJT05fZnJlZShzZXNzaW9uKTsKKyAgICAgIHNlc3Npb25fbWFwXy5lcmFzZShzZXNzaW9uKTsKKyAgICAgIGhvc3RfcG9ydF9tYXBfLmVyYXNlKGl0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgICAgLy8gSWRlYWxseSB3ZSdkIHJlbGVhc2UgfGxvY2tffCBiZWZvcmUgY2FsbGluZyBpbnRvIE9wZW5TU0wgaGVyZSwKKyAgICAvLyBob3dldmVyIHRoYXQgb3BlbnMgYSBzbWFsbCByaXNrIHxzZXNzaW9ufCB3aWxsIGdvIG91dCBvZiBzY29wZSBiZWZvcmUKKyAgICAvLyBpdCBpcyB1c2VkLiBBbHRlcm5hdGl2ZWx5IHdlIHdvdWxkIHRha2UgYSB0ZW1wb3JhcnkgbG9jYWwgcmVmY291bnQgb24KKyAgICAvLyB8c2Vzc2lvbnwsIGV4Y2VwdCBPcGVuU1NMIGRvZXMgbm90IHByb3ZpZGUgYSBwdWJsaWMgQVBJIGZvciBhZGRpbmcgYQorICAgIC8vIHJlZiAoYy5mLiBTU0xfU0VTU0lPTl9mcmVlIHdoaWNoIGRlY3JlbWVudHMgdGhlIHJlZikuCiAgICAgcmV0dXJuIFNTTF9zZXRfc2Vzc2lvbihzc2wsIHNlc3Npb24pID09IDE7CiAgIH0KIApAQCAtMjk5LDE0ICs0MTcsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaGFyZCkgewogICAgIHJldHVybiBob3N0X2FuZF9wb3J0LlRvU3RyaW5nKCkgKyAiLyIgKyBzaGFyZDsKICAgfQorI2lmIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgIHN0YXRpYyBib29sIElzRXhwaXJlZChTU0xfU0VTU0lPTiogc2Vzc2lvbiwgdGltZV90IG5vdykgeworICAgIGlmIChub3cgPCAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgdWludDY0X3Qgbm93X3U2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihub3cpOworICAgIHJldHVybiBub3dfdTY0IDwgU1NMX1NFU1NJT05fZ2V0X3RpbWUoc2Vzc2lvbikgfHwKKyAgICAgICAgICAgbm93X3U2NCA+PQorICAgICAgICAgICAgICAgU1NMX1NFU1NJT05fZ2V0X3RpbWUoc2Vzc2lvbikgKyBTU0xfU0VTU0lPTl9nZXRfdGltZW91dChzZXNzaW9uKTsKKyAgfQogCisgIHZvaWQgRmx1c2hFeHBpcmVkU2Vzc2lvbnMoKSB7CisgICAgdGltZV90IG5vdyA9IGJhc2U6OlRpbWU6Ok5vdygpLlRvVGltZVQoKTsKKyAgICBTZXNzaW9uTWFwOjppdGVyYXRvciBpdGVyID0gc2Vzc2lvbl9tYXBfLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ZXIgIT0gc2Vzc2lvbl9tYXBfLmVuZCgpKSB7CisgICAgICBpZiAoSXNFeHBpcmVkKGl0ZXItPmZpcnN0LCBub3cpKSB7CisgICAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoaXRlci0+Zmlyc3QpOworICAgICAgICBob3N0X3BvcnRfbWFwXy5lcmFzZShpdGVyLT5zZWNvbmQpOworICAgICAgICBpdGVyID0gc2Vzc2lvbl9tYXBfLmVyYXNlKGl0ZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytpdGVyOworICAgICAgfQorICAgIH0KKyAgICBsb29rdXBzX3NpbmNlX2ZsdXNoXyA9IDA7CisgIH0KKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKICAgLy8gQSBwYWlyIG9mIG1hcHMgdG8gYWxsb3cgYmktZGlyZWN0aW9uYWwgbG9va3VwcyBiZXR3ZWVuIGhvc3Q6cG9ydCBhbmQgYW4KICAgLy8gYXNzb2NpYXRlZCBzZXNzaW9uLgogICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBTU0xfU0VTU0lPTio+IEhvc3RQb3J0TWFwOwogICB0eXBlZGVmIHN0ZDo6bWFwPFNTTF9TRVNTSU9OKiwgSG9zdFBvcnRNYXA6Oml0ZXJhdG9yPiBTZXNzaW9uTWFwOwogICBIb3N0UG9ydE1hcCBob3N0X3BvcnRfbWFwXzsKICAgU2Vzc2lvbk1hcCBzZXNzaW9uX21hcF87Ci0KKyNpZiBkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQorICBzaXplX3QgbG9va3Vwc19zaW5jZV9mbHVzaF8gPSAwOworI2VuZGlmICAvLyBkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQogICAvLyBQcm90ZWN0cyBhY2Nlc3MgdG8gYm90aCB0aGUgYWJvdmUgbWFwcy4KICAgYmFzZTo6TG9jayBsb2NrXzsKIApAQCAtMzQwLDkgKzQ4NCwxOCBAQAogICAgIERDSEVDS19ORShzc2xfc29ja2V0X2RhdGFfaW5kZXhfLCAtMSk7CiAgICAgc3NsX2N0eF8ucmVzZXQoU1NMX0NUWF9uZXcoU1NMdjIzX2NsaWVudF9tZXRob2QoKSkpOwogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKHNzbF9jdHhfLmdldCgpLCBOb09wVmVyaWZ5Q2FsbGJhY2ssIE5VTEwpOworI2lmIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgICAgLy8gT3BlblNTTCBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlIGlzIHVzZWxlc3MuCisgICAgLy8gaHR0cHM6Ly9ib3Jpbmdzc2wuZ29vZ2xlc291cmNlLmNvbS9ib3Jpbmdzc2wuZ2l0LysvMTI2OWRkZDM3NzNmNTBkZmMyYzNjOWUyM2EyMjQ5ZGVkMTQxNWJhMworICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZSgKKyAgICAgICAgc3NsX2N0eF8uZ2V0KCksIFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCB8IFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMKTsKKyNlbHNlICAgLy8gZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKICAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoc3NsX2N0eF8uZ2V0KCksIFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCk7Ci0gICAgU1NMX0NUWF9zZXNzX3NldF9uZXdfY2Ioc3NsX2N0eF8uZ2V0KCksIE5ld1Nlc3Npb25DYWxsYmFja1N0YXRpYyk7CisgICAgLy8gUmVtb3ZlU2Vzc2lvbkNhbGxiYWNrU3RhdGljIHdpbGwgbm90IGJlIGNhbGxlZCBpbiBib3Jpbmdzc2wuCisgICAgLy8gaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL2RhZmU0ZTUzMDU4ZWQ4MDJmYWJjMTUxZTY3ZTc1ZmZkZWQ3NmZkMTgKICAgICBTU0xfQ1RYX3Nlc3Nfc2V0X3JlbW92ZV9jYihzc2xfY3R4Xy5nZXQoKSwgUmVtb3ZlU2Vzc2lvbkNhbGxiYWNrU3RhdGljKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX0lTX0JPUklOR1NTTCkKKyAgICBTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYihzc2xfY3R4Xy5nZXQoKSwgTmV3U2Vzc2lvbkNhbGxiYWNrU3RhdGljKTsKICAgICBTU0xfQ1RYX3NldF90aW1lb3V0KHNzbF9jdHhfLmdldCgpLCBrU2Vzc2lvbkNhY2hlVGltZW91dFNlY29uZHMpOwogICAgIFNTTF9DVFhfc2Vzc19zZXRfY2FjaGVfc2l6ZShzc2xfY3R4Xy5nZXQoKSwga1Nlc3Npb25DYWNoZU1heEVudGlyZXMpOwogICAgIFNTTF9DVFhfc2V0X2NsaWVudF9jZXJ0X2NiKHNzbF9jdHhfLmdldCgpLCBDbGllbnRDZXJ0Q2FsbGJhY2spOwpAQCAtMzYyLDggKzUxNSw3IEBACiAgIGludCBOZXdTZXNzaW9uQ2FsbGJhY2soU1NMKiBzc2wsIFNTTF9TRVNTSU9OKiBzZXNzaW9uKSB7CiAgICAgU1NMQ2xpZW50U29ja2V0T3BlblNTTCogc29ja2V0ID0gR2V0Q2xpZW50U29ja2V0RnJvbVNTTChzc2wpOwogICAgIHNlc3Npb25fY2FjaGVfLk9uU2Vzc2lvbkFkZGVkKHNvY2tldC0+aG9zdF9hbmRfcG9ydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC0+c3NsX3Nlc3Npb25fY2FjaGVfc2hhcmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQtPnNzbF9zZXNzaW9uX2NhY2hlX3NoYXJkKCksIHNlc3Npb24pOwogICAgIHJldHVybiAxOyAgLy8gMSA9PiBXZSB0b29rIG93bmVyc2hpcCBvZiB8c2Vzc2lvbnwuCiAgIH0KIApAQCAtMzgzLDkgKzUzNSwxMSBAQAogICB9CiAKICAgc3RhdGljIGludCBTZWxlY3ROZXh0UHJvdG9DYWxsYmFjayhTU0wqIHNzbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiogb3V0LCB1bnNpZ25lZCBjaGFyKiBvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcioqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBvdXRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlubGVuLCB2b2lkKiBhcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJnKSB7CiAgICAgU1NMQ2xpZW50U29ja2V0T3BlblNTTCogc29ja2V0ID0gR2V0SW5zdGFuY2UoKS0+R2V0Q2xpZW50U29ja2V0RnJvbVNTTChzc2wpOwogICAgIHJldHVybiBzb2NrZXQtPlNlbGVjdE5leHRQcm90b0NhbGxiYWNrKG91dCwgb3V0bGVuLCBpbiwgaW5sZW4pOwogICB9CkBAIC00NDMsOCArNTk3LDcgQEAKICAgICAgIHRyeWluZ19jYWNoZWRfc2Vzc2lvbl8oZmFsc2UpLAogICAgICAgbmV4dF9oYW5kc2hha2Vfc3RhdGVfKFNUQVRFX05PTkUpLAogICAgICAgbnBuX3N0YXR1c18oa05leHRQcm90b1Vuc3VwcG9ydGVkKSwKLSAgICAgIG5ldF9sb2dfKHRyYW5zcG9ydF9zb2NrZXQtPnNvY2tldCgpLT5OZXRMb2coKSkgewotfQorICAgICAgbmV0X2xvZ18odHJhbnNwb3J0X3NvY2tldC0+c29ja2V0KCktPk5ldExvZygpKSB7fQogCiBTU0xDbGllbnRTb2NrZXRPcGVuU1NMOjp+U1NMQ2xpZW50U29ja2V0T3BlblNTTCgpIHsKICAgRGlzY29ubmVjdCgpOwpAQCAtNDY0LDkgKzYxNyw4IEBACiAgIGlmICghU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKHNzbF8sIGhvc3RfYW5kX3BvcnRfLmhvc3QoKS5jX3N0cigpKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgdHJ5aW5nX2NhY2hlZF9zZXNzaW9uXyA9Ci0gICAgICBjb250ZXh0LT5zZXNzaW9uX2NhY2hlKCktPlNldFNTTFNlc3Npb24oc3NsXywgaG9zdF9hbmRfcG9ydF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3Nlc3Npb25fY2FjaGVfc2hhcmRfKTsKKyAgdHJ5aW5nX2NhY2hlZF9zZXNzaW9uXyA9IGNvbnRleHQtPnNlc3Npb25fY2FjaGUoKS0+U2V0U1NMU2Vzc2lvbigKKyAgICAgIHNzbF8sIGhvc3RfYW5kX3BvcnRfLCBzc2xfc2Vzc2lvbl9jYWNoZV9zaGFyZF8pOwogCiAgIEJJTyogc3NsX2JpbyA9IE5VTEw7CiAgIC8vIDAgPT4gdXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgpAQCAtNDk4LDYgKzY1MCwxMSBAQAogICAgICAgIHNzbF9jb25maWdfLnZlcnNpb25fbWF4ID49IFNTTF9QUk9UT0NPTF9WRVJTSU9OX1RMUzFfMik7CiAgIG9wdGlvbnMuQ29uZmlndXJlRmxhZyhTU0xfT1BfTk9fVExTdjFfMiwgIXRsczFfMl9lbmFibGVkKTsKICNlbmRpZgorI2lmIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCisgIC8vIFRoZSBvbGQgT3BlblNTTCB3ZSB1c2VkIGRvZXMgbm90IHN1cHBvcnQgVExTIDEuMy4gRGlzYWJsZSBUTFMgdjEuMy4KKyAgLy8gQXZvaWQgc2Vzc2lvbiB0byBiZSBzaW5nbGUgdXNlLCB3aGljaCBpcyBlbmFibGVkIGluIFRMUyAxLjMuCisgIG9wdGlvbnMuQ29uZmlndXJlRmxhZyhTU0xfT1BfTk9fVExTdjFfMywgdHJ1ZSk7CisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9JU19CT1JJTkdTU0wpCiAKICNpZiBkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikKICAgb3B0aW9ucy5Db25maWd1cmVGbGFnKFNTTF9PUF9OT19DT01QUkVTU0lPTiwgdHJ1ZSk7CkBAIC01NDMsMjMgKzcwMCwyNSBAQAogICAgIGJvb2wgZGlzYWJsZSA9IFNTTF9DSVBIRVJfZ2V0X2JpdHMoY2lwaGVyLCBOVUxMKSA8IDgwOwogICAgIGlmICghZGlzYWJsZSkgewogICAgICAgZGlzYWJsZSA9IHN0ZDo6ZmluZChzc2xfY29uZmlnXy5kaXNhYmxlZF9jaXBoZXJfc3VpdGVzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9jb25maWdfLmRpc2FibGVkX2NpcGhlcl9zdWl0ZXMuZW5kKCksIGlkKSAhPQotICAgICAgICAgICAgICAgICAgICBzc2xfY29uZmlnXy5kaXNhYmxlZF9jaXBoZXJfc3VpdGVzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfY29uZmlnXy5kaXNhYmxlZF9jaXBoZXJfc3VpdGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZCkgIT0gc3NsX2NvbmZpZ18uZGlzYWJsZWRfY2lwaGVyX3N1aXRlcy5lbmQoKTsKICAgICB9CiAgICAgaWYgKGRpc2FibGUpIHsKLSAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoZXIpOwotICAgICAgIERWTE9HKDMpIDw8ICJGb3VuZCBjaXBoZXIgdG8gcmVtb3ZlOiAnIiA8PCBuYW1lIDw8ICInLCBJRDogIiA8PCBpZAotICAgICAgICAgICAgICAgIDw8ICIgc3RyZW5ndGg6ICIgPDwgU1NMX0NJUEhFUl9nZXRfYml0cyhjaXBoZXIsIE5VTEwpOwotICAgICAgIGNvbW1hbmQuYXBwZW5kKCI6ISIpOwotICAgICAgIGNvbW1hbmQuYXBwZW5kKG5hbWUpOwotICAgICB9CisgICAgICBjb25zdCBjaGFyKiBuYW1lID0gU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoZXIpOworICAgICAgRFZMT0coMykgPDwgIkZvdW5kIGNpcGhlciB0byByZW1vdmU6ICciIDw8IG5hbWUgPDwgIicsIElEOiAiIDw8IGlkCisgICAgICAgICAgICAgICA8PCAiIHN0cmVuZ3RoOiAiIDw8IFNTTF9DSVBIRVJfZ2V0X2JpdHMoY2lwaGVyLCBOVUxMKTsKKyAgICAgIGNvbW1hbmQuYXBwZW5kKCI6ISIpOworICAgICAgY29tbWFuZC5hcHBlbmQobmFtZSk7CisgICAgfQogICB9CiAgIGludCBydiA9IFNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NsXywgY29tbWFuZC5jX3N0cigpKTsKICAgLy8gSWYgdGhpcyBmYWlscyAocnYgPSAwKSBpdCBtZWFucyB0aGVyZSBhcmUgbm8gY2lwaGVycyBlbmFibGVkIG9uIHRoaXMgU1NMLgogICAvLyBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSByZXN1bHQgaW4gdGhlIHNvY2tldCBmYWlsaW5nIHRvIGNvbXBsZXRlIHRoZQogICAvLyBoYW5kc2hha2UgYXQgd2hpY2ggcG9pbnQgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGlzIGJ1YmJsZWQgdXAgdG8gdGhlIGNsaWVudC4KLSAgTE9HX0lGKFdBUk5JTkcsIHJ2ICE9IDEpIDw8ICJTU0xfc2V0X2NpcGhlcl9saXN0KCciIDw8IGNvbW1hbmQgPDwgIicpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCAiIDw8IHJ2OworICBMT0dfSUYoV0FSTklORywgcnYgIT0gMSkgPDwgIlNTTF9zZXRfY2lwaGVyX2xpc3QoJyIgPDwgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBydjsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTU3OCw5ICs3MzcsOSBAQAogCiAgIC8vIFNlY29uZCBwYXNzOiBhIGNsaWVudCBjZXJ0aWZpY2F0ZSBzaG91bGQgaGF2ZSBiZWVuIHNlbGVjdGVkLgogICBpZiAoc3NsX2NvbmZpZ18uY2xpZW50X2NlcnQpIHsKLSAgICBFVlBfUEtFWSogcHJpdmtleSA9IE9wZW5TU0xQcml2YXRlS2V5U3RvcmU6OkdldEluc3RhbmNlKCktPkZldGNoUHJpdmF0ZUtleSgKLSAgICAgICAgWDUwOV9QVUJLRVlfZ2V0KFg1MDlfZ2V0X1g1MDlfUFVCS0VZKAotICAgICAgICAgICAgc3NsX2NvbmZpZ18uY2xpZW50X2NlcnQtPm9zX2NlcnRfaGFuZGxlKCkpKSk7CisgICAgRVZQX1BLRVkqIHByaXZrZXkgPQorICAgICAgICBPcGVuU1NMUHJpdmF0ZUtleVN0b3JlOjpHZXRJbnN0YW5jZSgpLT5GZXRjaFByaXZhdGVLZXkoWDUwOV9QVUJLRVlfZ2V0KAorICAgICAgICAgICAgWDUwOV9nZXRfWDUwOV9QVUJLRVkoc3NsX2NvbmZpZ18uY2xpZW50X2NlcnQtPm9zX2NlcnRfaGFuZGxlKCkpKSk7CiAgICAgaWYgKHByaXZrZXkpIHsKICAgICAgIC8vIFRPRE8oam90aCk6IChjb3BpZWQgZnJvbSBOU1MpIFdlIHNob3VsZCB3YWl0IGZvciBzZXJ2ZXIgY2VydGlmaWNhdGUKICAgICAgIC8vIHZlcmlmaWNhdGlvbiBiZWZvcmUgc2VuZGluZyBvdXIgY3JlZGVudGlhbHMuIFNlZSBodHRwOi8vY3JidWcuY29tLzEzOTM0CkBAIC02MDcsOCArNzY2LDcgQEAKICAgc3NsX2luZm8tPmNlcnRfc3RhdHVzID0gc2VydmVyX2NlcnRfdmVyaWZ5X3Jlc3VsdF8uY2VydF9zdGF0dXM7CiAgIHNzbF9pbmZvLT5pc19pc3N1ZWRfYnlfa25vd25fcm9vdCA9CiAgICAgICBzZXJ2ZXJfY2VydF92ZXJpZnlfcmVzdWx0Xy5pc19pc3N1ZWRfYnlfa25vd25fcm9vdDsKLSAgc3NsX2luZm8tPnB1YmxpY19rZXlfaGFzaGVzID0KLSAgICBzZXJ2ZXJfY2VydF92ZXJpZnlfcmVzdWx0Xy5wdWJsaWNfa2V5X2hhc2hlczsKKyAgc3NsX2luZm8tPnB1YmxpY19rZXlfaGFzaGVzID0gc2VydmVyX2NlcnRfdmVyaWZ5X3Jlc3VsdF8ucHVibGljX2tleV9oYXNoZXM7CiAgIHNzbF9pbmZvLT5jbGllbnRfY2VydF9zZW50ID0KICAgICAgIHNzbF9jb25maWdfLnNlbmRfY2xpZW50X2NlcnQgJiYgc3NsX2NvbmZpZ18uY2xpZW50X2NlcnQ7CiAgIHNzbF9pbmZvLT5jaGFubmVsX2lkX3NlbnQgPSBXYXNDaGFubmVsSURTZW50KCk7CkBAIC02MTYsMTIgKzc3NCwxOCBAQAogICBjb25zdCBTU0xfQ0lQSEVSKiBjaXBoZXIgPSBTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHNzbF8pOwogICBDSEVDSyhjaXBoZXIpOwogICBzc2xfaW5mby0+c2VjdXJpdHlfYml0cyA9IFNTTF9DSVBIRVJfZ2V0X2JpdHMoY2lwaGVyLCBOVUxMKTsKKyAgaW50IGNvbXByZXNzaW9uX3R5cGUgPSAwOworCisvLyBCb3JpbmdTU0wgaW1wbGVtZW50YXRpb24gb2YgU1NMX2dldF9jdXJyZW50X2NvbXByZXNzaW9uIHJldHVybnMgTlVMTAorI2lmICFkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQogICBjb25zdCBDT01QX01FVEhPRCogY29tcHJlc3Npb24gPSBTU0xfZ2V0X2N1cnJlbnRfY29tcHJlc3Npb24oc3NsXyk7CisgIGlmIChjb21wcmVzc2lvbikgeworICAgIGNvbXByZXNzaW9uX3R5cGUgPSBjb21wcmVzc2lvbi0+dHlwZTsKKyAgfQorI2VuZGlmICAvLyBkZWZpbmVkKE9QRU5TU0xfSVNfQk9SSU5HU1NMKQogCiAgIHNzbF9pbmZvLT5jb25uZWN0aW9uX3N0YXR1cyA9IEVuY29kZVNTTENvbm5lY3Rpb25TdGF0dXMoCi0gICAgICBTU0xfQ0lQSEVSX2dldF9pZChjaXBoZXIpLAotICAgICAgY29tcHJlc3Npb24gPyBjb21wcmVzc2lvbi0+dHlwZSA6IDAsCi0gICAgICBHZXROZXRTU0xWZXJzaW9uKHNzbF8pKTsKKyAgICAgIFNTTF9DSVBIRVJfZ2V0X2lkKGNpcGhlciksIGNvbXByZXNzaW9uX3R5cGUsIEdldE5ldFNTTFZlcnNpb24oc3NsXykpOwogCiAgIGJvb2wgcGVlcl9zdXBwb3J0c19yZW5lZ29fZXh0ID0gISFTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQoc3NsXyk7CiAgIGlmICghcGVlcl9zdXBwb3J0c19yZW5lZ29fZXh0KQpAQCAtNjMzLDExICs3OTcsMTEgQEAKICAgICBzc2xfaW5mby0+Y29ubmVjdGlvbl9zdGF0dXMgfD0gU1NMX0NPTk5FQ1RJT05fVkVSU0lPTl9GQUxMQkFDSzsKIAogICBEVkxPRygzKSA8PCAiRW5jb2RlZCBjb25uZWN0aW9uIHN0YXR1czogY2lwaGVyIHN1aXRlID0gIgotICAgICAgPDwgU1NMQ29ubmVjdGlvblN0YXR1c1RvQ2lwaGVyU3VpdGUoc3NsX2luZm8tPmNvbm5lY3Rpb25fc3RhdHVzKQotICAgICAgPDwgIiBjb21wcmVzc2lvbiA9ICIKLSAgICAgIDw8IFNTTENvbm5lY3Rpb25TdGF0dXNUb0NvbXByZXNzaW9uKHNzbF9pbmZvLT5jb25uZWN0aW9uX3N0YXR1cykKLSAgICAgIDw8ICIgdmVyc2lvbiA9ICIKLSAgICAgIDw8IFNTTENvbm5lY3Rpb25TdGF0dXNUb1ZlcnNpb24oc3NsX2luZm8tPmNvbm5lY3Rpb25fc3RhdHVzKTsKKyAgICAgICAgICAgPDwgU1NMQ29ubmVjdGlvblN0YXR1c1RvQ2lwaGVyU3VpdGUoc3NsX2luZm8tPmNvbm5lY3Rpb25fc3RhdHVzKQorICAgICAgICAgICA8PCAiIGNvbXByZXNzaW9uID0gIgorICAgICAgICAgICA8PCBTU0xDb25uZWN0aW9uU3RhdHVzVG9Db21wcmVzc2lvbihzc2xfaW5mby0+Y29ubmVjdGlvbl9zdGF0dXMpCisgICAgICAgICAgIDw8ICIgdmVyc2lvbiA9ICIKKyAgICAgICAgICAgPDwgU1NMQ29ubmVjdGlvblN0YXR1c1RvVmVyc2lvbihzc2xfaW5mby0+Y29ubmVjdGlvbl9zdGF0dXMpOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNjQ5LDIxICs4MTMsMjAgQEAKIAogaW50IFNTTENsaWVudFNvY2tldE9wZW5TU0w6OkV4cG9ydEtleWluZ01hdGVyaWFsKAogICAgIGNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlJiBsYWJlbCwKLSAgICBib29sIGhhc19jb250ZXh0LCBjb25zdCBiYXNlOjpTdHJpbmdQaWVjZSYgY29udGV4dCwKLSAgICB1bnNpZ25lZCBjaGFyKiBvdXQsIHVuc2lnbmVkIGludCBvdXRsZW4pIHsKKyAgICBib29sIGhhc19jb250ZXh0LAorICAgIGNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlJiBjb250ZXh0LAorICAgIHVuc2lnbmVkIGNoYXIqIG91dCwKKyAgICB1bnNpZ25lZCBpbnQgb3V0bGVuKSB7CiAgIGNyeXB0bzo6T3BlblNTTEVyclN0YWNrVHJhY2VyIGVycl90cmFjZXIoRlJPTV9IRVJFKTsKICAgaW50IHJ2ID0gU1NMX2V4cG9ydF9rZXlpbmdfbWF0ZXJpYWwoCi0gICAgICBzc2xfLCBvdXQsIG91dGxlbiwgY29uc3RfY2FzdDxjaGFyKj4obGFiZWwuZGF0YSgpKSwKLSAgICAgIGxhYmVsLnNpemUoKSwKKyAgICAgIHNzbF8sIG91dCwgb3V0bGVuLCBjb25zdF9jYXN0PGNoYXIqPihsYWJlbC5kYXRhKCkpLCBsYWJlbC5zaXplKCksCiAgICAgICByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihjb25zdF9jYXN0PGNoYXIqPihjb250ZXh0LmRhdGEoKSkpLAotICAgICAgY29udGV4dC5sZW5ndGgoKSwKLSAgICAgIGNvbnRleHQubGVuZ3RoKCkgPiAwKTsKKyAgICAgIGNvbnRleHQubGVuZ3RoKCksIGNvbnRleHQubGVuZ3RoKCkgPiAwKTsKIAogICBpZiAocnYgIT0gMSkgewogICAgIGludCBzc2xfZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJ2KTsKICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZXhwb3J0IGtleWluZyBtYXRlcmlhbDsiCi0gICAgICAgICAgICAgICA8PCAiIHJldHVybmVkICIgPDwgcnYKLSAgICAgICAgICAgICAgIDw8ICIsIFNTTCBlcnJvciBjb2RlICIgPDwgc3NsX2Vycm9yOworICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCAiIDw8IHJ2IDw8ICIsIFNTTCBlcnJvciBjb2RlICIgPDwgc3NsX2Vycm9yOwogICAgIHJldHVybiBNYXBPcGVuU1NMRXJyb3Ioc3NsX2Vycm9yLCBlcnJfdHJhY2VyKTsKICAgfQogICByZXR1cm4gT0s7CkBAIC02NzQsMTQgKzgzNywxNSBAQAogfQogCiBTU0xDbGllbnRTb2NrZXQ6Ok5leHRQcm90b1N0YXR1cyBTU0xDbGllbnRTb2NrZXRPcGVuU1NMOjpHZXROZXh0UHJvdG8oCi0gICAgc3RkOjpzdHJpbmcqIHByb3RvLCBzdGQ6OnN0cmluZyogc2VydmVyX3Byb3RvcykgeworICAgIHN0ZDo6c3RyaW5nKiBwcm90bywKKyAgICBzdGQ6OnN0cmluZyogc2VydmVyX3Byb3RvcykgewogICAqcHJvdG8gPSBucG5fcHJvdG9fOwogICAqc2VydmVyX3Byb3RvcyA9IHNlcnZlcl9wcm90b3NfOwogICByZXR1cm4gbnBuX3N0YXR1c187CiB9CiAKLVNlcnZlckJvdW5kQ2VydFNlcnZpY2UqCi1TU0xDbGllbnRTb2NrZXRPcGVuU1NMOjpHZXRTZXJ2ZXJCb3VuZENlcnRTZXJ2aWNlKCkgY29uc3QgeworU2VydmVyQm91bmRDZXJ0U2VydmljZSogU1NMQ2xpZW50U29ja2V0T3BlblNTTDo6R2V0U2VydmVyQm91bmRDZXJ0U2VydmljZSgpCisgICAgY29uc3QgewogICByZXR1cm4gTlVMTDsKIH0KIApAQCAtNzU3LDEwICs5MjEsMTAgQEAKICAgdXNlcl9jb25uZWN0X2NhbGxiYWNrXy5SZXNldCgpOwogICB1c2VyX3JlYWRfY2FsbGJhY2tfLlJlc2V0KCk7CiAgIHVzZXJfd3JpdGVfY2FsbGJhY2tfLlJlc2V0KCk7Ci0gIHVzZXJfcmVhZF9idWZfICAgICAgICAgPSBOVUxMOwotICB1c2VyX3JlYWRfYnVmX2xlbl8gICAgID0gMDsKLSAgdXNlcl93cml0ZV9idWZfICAgICAgICA9IE5VTEw7Ci0gIHVzZXJfd3JpdGVfYnVmX2xlbl8gICAgPSAwOworICB1c2VyX3JlYWRfYnVmXyA9IE5VTEw7CisgIHVzZXJfcmVhZF9idWZfbGVuXyA9IDA7CisgIHVzZXJfd3JpdGVfYnVmXyA9IE5VTEw7CisgIHVzZXJfd3JpdGVfYnVmX2xlbl8gPSAwOwogCiAgIHNlcnZlcl9jZXJ0X3ZlcmlmeV9yZXN1bHRfLlJlc2V0KCk7CiAgIGNvbXBsZXRlZF9oYW5kc2hha2VfID0gZmFsc2U7CkBAIC03ODcsNyArOTUxLDcgQEAKICAgICAgIGNhc2UgU1RBVEVfVkVSSUZZX0NFUlQ6CiAgICAgICAgIERDSEVDSyhydiA9PSBPSyk7CiAgICAgICAgIHJ2ID0gRG9WZXJpZnlDZXJ0KHJ2KTsKLSAgICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFNUQVRFX1ZFUklGWV9DRVJUX0NPTVBMRVRFOgogICAgICAgICBydiA9IERvVmVyaWZ5Q2VydENvbXBsZXRlKHJ2KTsKICAgICAgICAgYnJlYWs7CkBAIC04MzgsMTAgKzEwMDIsOSBAQAogICAgIC8vIFNTTCBoYW5kc2hha2UgaXMgY29tcGxldGVkLiAgTGV0J3MgdmVyaWZ5IHRoZSBjZXJ0aWZpY2F0ZS4KICAgICBjb25zdCBib29sIGdvdF9jZXJ0ID0gISFVcGRhdGVTZXJ2ZXJDZXJ0KCk7CiAgICAgRENIRUNLKGdvdF9jZXJ0KTsKLSAgICBuZXRfbG9nXy5BZGRFdmVudCgKLSAgICAgICAgTmV0TG9nOjpUWVBFX1NTTF9DRVJUSUZJQ0FURVNfUkVDRUlWRUQsCi0gICAgICAgIGJhc2U6OkJpbmQoJk5ldExvZ1g1MDlDZXJ0aWZpY2F0ZUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2VydmVyX2NlcnRfLmdldCgpKSkpOworICAgIG5ldF9sb2dfLkFkZEV2ZW50KE5ldExvZzo6VFlQRV9TU0xfQ0VSVElGSUNBVEVTX1JFQ0VJVkVELAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJk5ldExvZ1g1MDlDZXJ0aWZpY2F0ZUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzZXJ2ZXJfY2VydF8uZ2V0KCkpKSk7CiAgICAgR290b1N0YXRlKFNUQVRFX1ZFUklGWV9DRVJUKTsKICAgfSBlbHNlIHsKICAgICBpbnQgc3NsX2Vycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBydik7CkBAIC04NTEsMTIgKzEwMTQsMTAgQEAKICAgICBpZiAobmV0X2Vycm9yID09IEVSUl9JT19QRU5ESU5HKSB7CiAgICAgICBHb3RvU3RhdGUoU1RBVEVfSEFORFNIQUtFKTsKICAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAiaGFuZHNoYWtlIGZhaWxlZDsgcmV0dXJuZWQgIiA8PCBydgotICAgICAgICAgICAgICAgICA8PCAiLCBTU0wgZXJyb3IgY29kZSAiIDw8IHNzbF9lcnJvcgotICAgICAgICAgICAgICAgICA8PCAiLCBuZXRfZXJyb3IgIiA8PCBuZXRfZXJyb3I7Ci0gICAgICBuZXRfbG9nXy5BZGRFdmVudCgKLSAgICAgICAgICBOZXRMb2c6OlRZUEVfU1NMX0hBTkRTSEFLRV9FUlJPUiwKLSAgICAgICAgICBDcmVhdGVOZXRMb2dTU0xFcnJvckNhbGxiYWNrKG5ldF9lcnJvciwgc3NsX2Vycm9yKSk7CisgICAgICBMT0coRVJST1IpIDw8ICJoYW5kc2hha2UgZmFpbGVkOyByZXR1cm5lZCAiIDw8IHJ2IDw8ICIsIFNTTCBlcnJvciBjb2RlICIKKyAgICAgICAgICAgICAgICAgPDwgc3NsX2Vycm9yIDw8ICIsIG5ldF9lcnJvciAiIDw8IG5ldF9lcnJvcjsKKyAgICAgIG5ldF9sb2dfLkFkZEV2ZW50KE5ldExvZzo6VFlQRV9TU0xfSEFORFNIQUtFX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTmV0TG9nU1NMRXJyb3JDYWxsYmFjayhuZXRfZXJyb3IsIHNzbF9lcnJvcikpOwogICAgIH0KICAgfQogICByZXR1cm4gbmV0X2Vycm9yOwpAQCAtODg0LDExICsxMDQ1LDEwIEBACiAKICAgLy8gRm9yIGVhY2ggcHJvdG9jb2wgaW4gc2VydmVyIHByZWZlcmVuY2Ugb3JkZXIsIHNlZSBpZiB3ZSBzdXBwb3J0IGl0LgogICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGlubGVuOyBpICs9IGluW2ldICsgMSkgewotICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvcgotICAgICAgICAgICAgIGogPSBzc2xfY29uZmlnXy5uZXh0X3Byb3Rvcy5iZWdpbigpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBqID0KKyAgICAgICAgICAgICBzc2xfY29uZmlnXy5uZXh0X3Byb3Rvcy5iZWdpbigpOwogICAgICAgICAgaiAhPSBzc2xfY29uZmlnXy5uZXh0X3Byb3Rvcy5lbmQoKTsgKytqKSB7Ci0gICAgICBpZiAoaW5baV0gPT0gai0+c2l6ZSgpICYmCi0gICAgICAgICAgbWVtY21wKCZpbltpICsgMV0sIGotPmRhdGEoKSwgaW5baV0pID09IDApIHsKKyAgICAgIGlmIChpbltpXSA9PSBqLT5zaXplKCkgJiYgbWVtY21wKCZpbltpICsgMV0sIGotPmRhdGEoKSwgaW5baV0pID09IDApIHsKICAgICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaC4KICAgICAgICAgKm91dCA9IGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGluKSArIGkgKyAxOwogICAgICAgICAqb3V0bGVuID0gaW5baV07CkBAIC05MDIsOCArMTA2Miw4IEBACiAKICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYSBwcm90b2NvbCwgd2Ugc2VsZWN0IHRoZSBmaXJzdCBvbmUgZnJvbSBvdXIgbGlzdC4KICAgaWYgKG5wbl9zdGF0dXNfID09IGtOZXh0UHJvdG9Ob092ZXJsYXApIHsKLSAgICAqb3V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KAotICAgICAgICBzc2xfY29uZmlnXy5uZXh0X3Byb3Rvc1swXS5kYXRhKCkpKTsKKyAgICAqb3V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KAorICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihzc2xfY29uZmlnXy5uZXh0X3Byb3Rvc1swXS5kYXRhKCkpKTsKICAgICAqb3V0bGVuID0gc3NsX2NvbmZpZ18ubmV4dF9wcm90b3NbMF0uc2l6ZSgpOwogICB9CiAKQEAgLTkzNiw4ICsxMDk2LDcgQEAKICAgICBmbGFncyB8PSBDZXJ0VmVyaWZpZXI6OlZFUklGWV9DRVJUX0lPX0VOQUJMRUQ7CiAgIHZlcmlmaWVyXy5yZXNldChuZXcgU2luZ2xlUmVxdWVzdENlcnRWZXJpZmllcihjZXJ0X3ZlcmlmaWVyXykpOwogICByZXR1cm4gdmVyaWZpZXJfLT5WZXJpZnkoCi0gICAgICBzZXJ2ZXJfY2VydF8sIGhvc3RfYW5kX3BvcnRfLmhvc3QoKSwgZmxhZ3MsCi0gICAgICBOVUxMIC8qIG5vIENSTCBzZXQgKi8sCisgICAgICBzZXJ2ZXJfY2VydF8sIGhvc3RfYW5kX3BvcnRfLmhvc3QoKSwgZmxhZ3MsIE5VTEwgLyogbm8gQ1JMIHNldCAqLywKICAgICAgICZzZXJ2ZXJfY2VydF92ZXJpZnlfcmVzdWx0XywKICAgICAgIGJhc2U6OkJpbmQoJlNTTENsaWVudFNvY2tldE9wZW5TU0w6Ok9uSGFuZHNoYWtlSU9Db21wbGV0ZSwKICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCkBAIC05NTEsOCArMTExMCw4IEBACiAgICAgLy8gVE9ETyhqb3RoKTogV29yayBvdXQgaWYgd2UgbmVlZCB0byByZW1lbWJlciB0aGUgaW50ZXJtZWRpYXRlIENBIGNlcnRzCiAgICAgLy8gd2hlbiB0aGUgc2VydmVyIHNlbmRzIHRoZW0gdG8gdXMsIGFuZCBkbyBzbyBoZXJlLgogICB9IGVsc2UgewotICAgIERWTE9HKDEpIDw8ICJEb1ZlcmlmeUNlcnRDb21wbGV0ZSBlcnJvciAiIDw8IEVycm9yVG9TdHJpbmcocmVzdWx0KQotICAgICAgICAgICAgIDw8ICIgKCIgPDwgcmVzdWx0IDw8ICIpIjsKKyAgICBEVkxPRygxKSA8PCAiRG9WZXJpZnlDZXJ0Q29tcGxldGUgZXJyb3IgIiA8PCBFcnJvclRvU3RyaW5nKHJlc3VsdCkgPDwgIiAoIgorICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiKSI7CiAgIH0KIAogICBjb21wbGV0ZWRfaGFuZHNoYWtlXyA9IHRydWU7CkBAIC0xMDE4LDEwICsxMTc3LDkgQEAKICAgfQogCiAgIGludCBydiA9IHRyYW5zcG9ydF8tPnNvY2tldCgpLT5Xcml0ZSgKLSAgICAgICAgc2VuZF9idWZmZXJfLAotICAgICAgICBzZW5kX2J1ZmZlcl8tPkJ5dGVzUmVtYWluaW5nKCksCi0gICAgICAgIGJhc2U6OkJpbmQoJlNTTENsaWVudFNvY2tldE9wZW5TU0w6OkJ1ZmZlclNlbmRDb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CisgICAgICBzZW5kX2J1ZmZlcl8sIHNlbmRfYnVmZmVyXy0+Qnl0ZXNSZW1haW5pbmcoKSwKKyAgICAgIGJhc2U6OkJpbmQoJlNTTENsaWVudFNvY2tldE9wZW5TU0w6OkJ1ZmZlclNlbmRDb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwogICBpZiAocnYgPT0gRVJSX0lPX1BFTkRJTkcpIHsKICAgICB0cmFuc3BvcnRfc2VuZF9idXN5XyA9IHRydWU7CiAgIH0gZWxzZSB7CkBAIC0xMTM5LDI4ICsxMjk3LDI2IEBACiAgIGludCBydl93cml0ZSA9IEVSUl9JT19QRU5ESU5HOwogICBib29sIG5ldHdvcmtfbW92ZWQ7CiAgIGRvIHsKLSAgICAgIGlmICh1c2VyX3JlYWRfYnVmXykKLSAgICAgICAgICBydl9yZWFkID0gRG9QYXlsb2FkUmVhZCgpOwotICAgICAgaWYgKHVzZXJfd3JpdGVfYnVmXykKLSAgICAgICAgICBydl93cml0ZSA9IERvUGF5bG9hZFdyaXRlKCk7Ci0gICAgICBuZXR3b3JrX21vdmVkID0gRG9UcmFuc3BvcnRJTygpOwotICB9IHdoaWxlIChydl9yZWFkID09IEVSUl9JT19QRU5ESU5HICYmCi0gICAgICAgICAgIHJ2X3dyaXRlID09IEVSUl9JT19QRU5ESU5HICYmCi0gICAgICAgICAgICh1c2VyX3JlYWRfYnVmXyB8fCB1c2VyX3dyaXRlX2J1Zl8pICYmCi0gICAgICAgICAgIG5ldHdvcmtfbW92ZWQpOworICAgIGlmICh1c2VyX3JlYWRfYnVmXykKKyAgICAgIHJ2X3JlYWQgPSBEb1BheWxvYWRSZWFkKCk7CisgICAgaWYgKHVzZXJfd3JpdGVfYnVmXykKKyAgICAgIHJ2X3dyaXRlID0gRG9QYXlsb2FkV3JpdGUoKTsKKyAgICBuZXR3b3JrX21vdmVkID0gRG9UcmFuc3BvcnRJTygpOworICB9IHdoaWxlIChydl9yZWFkID09IEVSUl9JT19QRU5ESU5HICYmIHJ2X3dyaXRlID09IEVSUl9JT19QRU5ESU5HICYmCisgICAgICAgICAgICh1c2VyX3JlYWRfYnVmXyB8fCB1c2VyX3dyaXRlX2J1Zl8pICYmIG5ldHdvcmtfbW92ZWQpOwogCiAgIC8vIFBlcmZvcm1pbmcgdGhlIFJlYWQgY2FsbGJhY2sgbWF5IGNhdXNlIHx0aGlzfCB0byBiZSBkZWxldGVkLiBJZiB0aGlzCiAgIC8vIGhhcHBlbnMsIHRoZSBXcml0ZSBjYWxsYmFjayBzaG91bGQgbm90IGJlIGludm9rZWQuIEd1YXJkIGFnYWluc3QgdGhpcyBieQogICAvLyBob2xkaW5nIGEgV2Vha1B0ciB0byB8dGhpc3wgYW5kIGVuc3VyaW5nIGl0J3Mgc3RpbGwgdmFsaWQuCiAgIGJhc2U6OldlYWtQdHI8U1NMQ2xpZW50U29ja2V0T3BlblNTTD4gZ3VhcmQod2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpOwogICBpZiAodXNlcl9yZWFkX2J1Zl8gJiYgcnZfcmVhZCAhPSBFUlJfSU9fUEVORElORykKLSAgICAgIERvUmVhZENhbGxiYWNrKHJ2X3JlYWQpOworICAgIERvUmVhZENhbGxiYWNrKHJ2X3JlYWQpOwogCiAgIGlmICghZ3VhcmQuZ2V0KCkpCiAgICAgcmV0dXJuOwogCiAgIGlmICh1c2VyX3dyaXRlX2J1Zl8gJiYgcnZfd3JpdGUgIT0gRVJSX0lPX1BFTkRJTkcpCi0gICAgICBEb1dyaXRlQ2FsbGJhY2socnZfd3JpdGUpOworICAgIERvV3JpdGVDYWxsYmFjayhydl93cml0ZSk7CiB9CiAKIHZvaWQgU1NMQ2xpZW50U29ja2V0T3BlblNTTDo6T25SZWN2Q29tcGxldGUoaW50IHJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L2NvYXQvQ29iYWx0U2VydmljZS5qYXZhIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L2NvYXQvQ29iYWx0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MWY2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9Db2JhbHRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGRldi5jb2JhbHQuY29hdDsKKworaW1wb3J0IGRldi5jb2JhbHQudXRpbC5Vc2VkQnlOYXRpdmU7CisKKy8qKiBBYnN0cmFjdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgQ29iYWx0IHRvIGludGVyYWN0IHdpdGggYSBwbGF0Zm9ybSBzZXJ2aWNlLiAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvYmFsdFNlcnZpY2UgeworICAvKiogSW50ZXJmYWNlIHRoYXQgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBleHRlbmRzIENvYmFsdFNlcnZpY2UuICovCisgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgLyoqIENyZWF0ZSB0aGUgc2VydmljZS4gKi8KKyAgICBwdWJsaWMgQ29iYWx0U2VydmljZSBjcmVhdGVDb2JhbHRTZXJ2aWNlKGxvbmcgbmF0aXZlU2VydmljZSk7CisKKyAgICAvKiogR2V0IHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKTsKKyAgfQorICAvLyBMaWZlY3ljbGUKKyAgLyoqIFByZXBhcmUgc2VydmljZSBmb3Igc3RhcnQgb3IgcmVzdW1lLiAqLworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWZvcmVTdGFydE9yUmVzdW1lKCk7CisKKyAgLyoqIFByZXBhcmUgc2VydmljZSBmb3Igc3VzcGVuZC4gKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgYmVmb3JlU3VzcGVuZCgpOworCisgIC8qKiBQcmVwYXJlIHNlcnZpY2UgZm9yIHN0b3AuICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFmdGVyU3RvcHBlZCgpOworCisgIC8vIFNlcnZpY2UgQVBJCisgIC8qKiBSZXNwb25zZSB0byBjbGllbnQgZnJvbSBjYWxscyB0byByZWNlaXZlRnJvbUNsaWVudCgpLiAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgQFVzZWRCeU5hdGl2ZQorICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVG9DbGllbnQgeworICAgIC8qKiBJbmRpY2F0ZSBpZiB0aGUgc2VydmljZSB3YXMgdW5hYmxlIHRvIHJlY2VpdmUgZGF0YSBiZWNhdXNlIGl0IGlzIGluIGFuIGludmFsaWQgc3RhdGUuICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgQFVzZWRCeU5hdGl2ZQorICAgIHB1YmxpYyBib29sZWFuIGludmFsaWRTdGF0ZTsKKyAgICAvKiogVGhlIHN5bmNocm9ub3VzIHJlc3BvbnNlIGRhdGEgZnJvbSB0aGUgc2VydmljZS4gKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBAVXNlZEJ5TmF0aXZlCisgICAgcHVibGljIGJ5dGVbXSBkYXRhOworICB9CisKKyAgLyoqIFJlY2VpdmUgZGF0YSBmcm9tIGNsaWVudCBvZiB0aGUgc2VydmljZS4gKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgIEBVc2VkQnlOYXRpdmUKKyAgcHVibGljIGFic3RyYWN0IFJlc3BvbnNlVG9DbGllbnQgcmVjZWl2ZUZyb21DbGllbnQoYnl0ZVtdIGRhdGEpOworCisgIC8qKiBDbG9zZSB0aGUgc2VydmljZS4gKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKTsKKworICAvKiogU2VuZCBkYXRhIGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudC4gKi8KKyAgcHJvdGVjdGVkIHZvaWQgc2VuZFRvQ2xpZW50KGxvbmcgbmF0aXZlU2VydmljZSwgYnl0ZVtdIGRhdGEpIHsKKyAgICBuYXRpdmVTZW5kVG9DbGllbnQobmF0aXZlU2VydmljZSwgZGF0YSk7CisgIH0KKworICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNlbmRUb0NsaWVudChsb25nIG5hdGl2ZVNlcnZpY2UsIGJ5dGVbXSBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L0NvYmFsdFN5c3RlbUNvbmZpZ0NoYW5nZVJlY2VpdmVyLmphdmEgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9Db2JhbHRTeXN0ZW1Db25maWdDaGFuZ2VSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDc2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9Db2JhbHRTeXN0ZW1Db25maWdDaGFuZ2VSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBkZXYuY29iYWx0LmNvYXQ7CisKK2ltcG9ydCBzdGF0aWMgZGV2LmNvYmFsdC51dGlsLkxvZy5UQUc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGRldi5jb2JhbHQudXRpbC5Mb2c7CisKKy8vIEhlbHBlciBjbGFzcyB0byByZWNlaXZlIGFuZCBoYW5kbGUgYnJvYWRjYXN0IG5vdGlmaWNhdGlvbnMgb2Ygc3lzdGVtIGxvY2FsZQorLy8gY2hhbmdlcy4KK2ZpbmFsIGNsYXNzIENvYmFsdFN5c3RlbUNvbmZpZ0NoYW5nZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICBwcml2YXRlIGJvb2xlYW4gaXNGb3JlZ3JvdW5kOworICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIHN0b3BSZXF1ZXN0ZXI7CisKKyAgQ29iYWx0U3lzdGVtQ29uZmlnQ2hhbmdlUmVjZWl2ZXIoQ29udGV4dCBhcHBDb250ZXh0LCBSdW5uYWJsZSBzdG9wUmVxdWVzdGVyKSB7CisgICAgdGhpcy5pc0ZvcmVncm91bmQgPSB0cnVlOworICAgIHRoaXMuc3RvcFJlcXVlc3RlciA9IHN0b3BSZXF1ZXN0ZXI7CisgICAgYXBwQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHRoaXMsIG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9MT0NBTEVfQ0hBTkdFRCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICBpZiAoKCFJbnRlbnQuQUNUSU9OX0xPQ0FMRV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB8fCBpc0ZvcmVncm91bmQpIHJldHVybjsKKworICAgIExvZy53KFRBRywgIlN5c3RlbSBsb2NhbGUgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLiIpOworICAgIHN0b3BSZXF1ZXN0ZXIucnVuKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKGZpbmFsIGJvb2xlYW4gaXNGb3JlZ3JvdW5kKSB7CisgICAgdGhpcy5pc0ZvcmVncm91bmQgPSBpc0ZvcmVncm91bmQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L0tleWJvYXJkRWRpdG9yLmphdmEgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9LZXlib2FyZEVkaXRvci5qYXZhCmluZGV4IGJlNWFhMGYuLmIyODAzMGYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L0tleWJvYXJkRWRpdG9yLmphdmEKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L2NvYXQvS2V5Ym9hcmRFZGl0b3IuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwpAQCAtMzMsNiArMzQsOCBAQAogICBwcml2YXRlIGZpbmFsIENvbnRleHQgY29udGV4dDsKICAgcHJpdmF0ZSBFZGl0YWJsZSBlZGl0YWJsZTsKICAgcHJpdmF0ZSBLZXlib2FyZElucHV0Q29ubmVjdGlvbiBpbnB1dENvbm5lY3Rpb247CisgIHByaXZhdGUgYm9vbGVhbiBrZWVwRm9jdXM7CisgIHByaXZhdGUgYm9vbGVhbiBrZXlib2FyZFNob3dpbmc7CiAKICAgcHVibGljIEtleWJvYXJkRWRpdG9yKENvbnRleHQgY29udGV4dCkgewogICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CkBAIC00MSw2ICs0NCw4IEBACiAgIHB1YmxpYyBLZXlib2FyZEVkaXRvcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIHRoaXMua2VlcEZvY3VzID0gZmFsc2U7CisgICAgdGhpcy5rZXlib2FyZFNob3dpbmcgPSBmYWxzZTsKICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CiAgIH0KIApAQCAtNjAsNiArNjUsMjMgQEAKICAgICByZXR1cm4gaW5wdXRDb25uZWN0aW9uOwogICB9CiAKKyAgLyoqIFVwZGF0ZSB0aGUga2VlcEZvY3VzIGJvb2xlYW4uICovCisgIHB1YmxpYyB2b2lkIHVwZGF0ZUtlZXBGb2N1cyhib29sZWFuIGtlZXBGb2N1cykgeworICAgIHRoaXMua2VlcEZvY3VzID0ga2VlcEZvY3VzOworICB9CisKKyAgLyoqIElmIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQgaXMgc2hvd2luZy4gKi8KKyAgcHVibGljIGJvb2xlYW4gaXNLZXlib2FyZFNob3dpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMua2V5Ym9hcmRTaG93aW5nOworICB9CisKKyAgLyoqIEhpZGUgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCBpZiBrZWVwRm9jdXMgaXMgc2V0IHRvIGZhbHNlLiAqLworICBwdWJsaWMgdm9pZCBzZWFyY2goKSB7CisgICAgaWYgKCF0aGlzLmtlZXBGb2N1cykgeworICAgICAgaGlkZUtleWJvYXJkKCk7CisgICAgfQorICB9CisKICAgLyoqIFNob3cgdGhlIG9uLXNjcmVlbiBrZXlib2FyZC4gKi8KICAgcHVibGljIHZvaWQgc2hvd0tleWJvYXJkKCkgewogICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OwpAQCAtNzQsNyArOTYsMTAgQEAKIAogICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9CiAgICAgICAgICAgICAgICAgKElucHV0TWV0aG9kTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOwotICAgICAgICAgICAgaW1tLnNob3dTb2Z0SW5wdXQodmlldywgMCk7CisgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBpbW0uc2hvd1NvZnRJbnB1dCh2aWV3LCAwKTsKKyAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgIHZpZXcudXBkYXRlS2V5Ym9hcmRTaG93aW5nKHRydWUpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgIH0KQEAgLTkzLDcgKzExOCwxMCBAQAogCiAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0KICAgICAgICAgICAgICAgICAoSW5wdXRNZXRob2RNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7Ci0gICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3codmlldy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyh2aWV3LmdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgdmlldy51cGRhdGVLZXlib2FyZFNob3dpbmcoZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgIH0KQEAgLTEwNCw0ICsxMzIsMTUgQEAKICAgICAgICAgKElucHV0TWV0aG9kTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOwogICAgIGltbS51cGRhdGVTZWxlY3Rpb24odmlldywgc2VsU3RhcnQsIHNlbEVuZCwgY29tcFN0YXJ0LCBjb21wRW5kKTsKICAgfQorCisgIC8qKiBVcGRhdGUgdGhlIGN1c3RvbSBsaXN0IG9mIGNvbXBsZXRpb25zIHNob3duIHdpdGhpbiB0aGUgb24tc2NyZWVuIGtleWJvYXJkLiAqLworICBwdWJsaWMgdm9pZCB1cGRhdGVDdXN0b21Db21wbGV0aW9ucyhDb21wbGV0aW9uSW5mb1tdIGNvbXBsZXRpb25zKSB7CisgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9CisgICAgICAgIChJbnB1dE1ldGhvZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKKyAgICBpbW0uZGlzcGxheUNvbXBsZXRpb25zKHRoaXMsIGNvbXBsZXRpb25zKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB1cGRhdGVLZXlib2FyZFNob3dpbmcoYm9vbGVhbiBrZXlib2FyZFNob3dpbmcpIHsKKyAgICB0aGlzLmtleWJvYXJkU2hvd2luZyA9IGtleWJvYXJkU2hvd2luZzsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L2NvYXQvS2V5Ym9hcmRJbnB1dENvbm5lY3Rpb24uamF2YSBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L0tleWJvYXJkSW5wdXRDb25uZWN0aW9uLmphdmEKaW5kZXggOTlkYzk1YS4uNTRhNWE0NiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L2NvYXQvS2V5Ym9hcmRJbnB1dENvbm5lY3Rpb24uamF2YQorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9LZXlib2FyZElucHV0Q29ubmVjdGlvbi5qYXZhCkBAIC02OSw4ICs2OSw2IEBACiAKICAgICB1cGRhdGVFZGl0aW5nU3RhdGUoKTsKICAgICBFZGl0YWJsZSBlZGl0YWJsZSA9IGdldEVkaXRhYmxlKCk7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IGNvbXBvc2l0aW9uIGV2ZW50cyBmb3IgY29tcG9zaW5nIHRleHQuCi0gICAgbmF0aXZlU2VuZFRleHQoZWRpdGFibGUudG9TdHJpbmcoKSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCkBAIC0xMDQsNyArMTAyLDE0IEBACiAgICAgaW50IGNvbXBvc2luZ0VuZCA9IEJhc2VJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChlZGl0YWJsZSk7CiAgICAga2V5Ym9hcmRFZGl0b3IudXBkYXRlU2VsZWN0aW9uKAogICAgICAgICBrZXlib2FyZEVkaXRvciwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgY29tcG9zaW5nU3RhcnQsIGNvbXBvc2luZ0VuZCk7Ci0gICAgbmF0aXZlU2VuZFRleHQoZWRpdGFibGUudG9TdHJpbmcoKSk7CisKKyAgICBpZiAoY29tcG9zaW5nU3RhcnQgIT0gLTEpIHsKKyAgICAgIC8vIFNlbmQgdGhlIGNvbXBvc2luZyB0ZXh0IGFzIGFuIGlucHV0IGV2ZW50IHdpdGggaXNDb21wb3Npbmcgc2V0IHRvIHRydWUuCisgICAgICBuYXRpdmVTZW5kVGV4dChlZGl0YWJsZS50b1N0cmluZygpLnN1YnN0cmluZyhjb21wb3NpbmdTdGFydCwgY29tcG9zaW5nRW5kKSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNlbmQgdGhlIGNvbW1pdHRlZCB0ZXh0IGFzIGFuIGlucHV0IGV2ZW50IHdpdGggaXNDb21wb3Npbmcgc2V0IHRvIGZhbHNlLgorICAgICAgbmF0aXZlU2VuZFRleHQoZWRpdGFibGUudG9TdHJpbmcoKSwgZmFsc2UpOworICAgIH0KICAgfQogCiAgIC8qKiBTZW5kIHRleHQgdG8gdGhlIHNlYXJjaCBiYXIgYW5kIHNldCB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbi4gKi8KQEAgLTEzNiw3ICsxNDEsNyBAQAogICBwdWJsaWMgYm9vbGVhbiBzZW5kS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgIGlmIChldmVudC5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUikgewotICAgICAgICBrZXlib2FyZEVkaXRvci5oaWRlS2V5Ym9hcmQoKTsKKyAgICAgICAga2V5Ym9hcmRFZGl0b3Iuc2VhcmNoKCk7CiAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5LRVlDT0RFX0RFTCkgewogICAgICAgICBFZGl0YWJsZSBlZGl0YWJsZSA9IGdldEVkaXRhYmxlKCk7CiAgICAgICAgIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChlZGl0YWJsZSk7CkBAIC0xNjQsMTEgKzE2OSwxMCBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUVkaXRvckFjdGlvbihpbnQgZWRpdG9yQWN0aW9uKSB7CiAgICAgaWYgKGVkaXRvckFjdGlvbiA9PSBFZGl0b3JJbmZvLklNRV9BQ1RJT05fU0VBUkNIKSB7Ci0gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQga2VlcCBmb2N1cyB3aGVyZSB0aGUga2V5Ym9hcmQgaXMgb25seSBoaWRkZW4gaWYgdGhlcmUgYXJlIHNlYXJjaCByZXN1bHRzLgotICAgICAga2V5Ym9hcmRFZGl0b3IuaGlkZUtleWJvYXJkKCk7CisgICAgICBrZXlib2FyZEVkaXRvci5zZWFyY2goKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNlbmRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KTsKKyAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZW5kVGV4dChDaGFyU2VxdWVuY2UgdGV4dCwgYm9vbGVhbiBpc0NvbXBvc2luZyk7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9QbGF0Zm9ybUVycm9yLmphdmEgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9QbGF0Zm9ybUVycm9yLmphdmEKaW5kZXggNGFhODJlNy4uZGIwY2FlNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L2NvYXQvUGxhdGZvcm1FcnJvci5qYXZhCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L1BsYXRmb3JtRXJyb3IuamF2YQpAQCAtMjYsMTMgKzI2LDEwIEBACiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uSW50RGVmOwogaW1wb3J0IGRldi5jb2JhbHQudXRpbC5Ib2xkZXI7CiBpbXBvcnQgZGV2LmNvYmFsdC51dGlsLkxvZzsKLWltcG9ydCBkZXYuY29iYWx0LnV0aWwuVXNlZEJ5TmF0aXZlOwogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CiAKLS8qKgotICogU2hvd3MgYW4gRXJyb3JEaWFsb2cgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIGEgU3RhcmJvYXJkIHBsYXRmb3JtIGVycm9yLgotICovCisvKiogU2hvd3MgYW4gRXJyb3JEaWFsb2cgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIGEgU3RhcmJvYXJkIHBsYXRmb3JtIGVycm9yLiAqLwogcHVibGljIGNsYXNzIFBsYXRmb3JtRXJyb3IKICAgICBpbXBsZW1lbnRzIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIsIERpYWxvZ0ludGVyZmFjZS5PbkRpc21pc3NMaXN0ZW5lciB7CiAKQEAgLTcxLDE4ICs2OCwxOSBAQAogCiAgIC8qKiBEaXNwbGF5IHRoZSBlcnJvci4gKi8KICAgcHVibGljIHZvaWQgcmFpc2UoKSB7Ci0gICAgdWlUaHJlYWRIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHNob3dEaWFsb2dPblVpVGhyZWFkKCk7Ci0gICAgICB9Ci0gICAgfSk7CisgICAgdWlUaHJlYWRIYW5kbGVyLnBvc3QoCisgICAgICAgIG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzaG93RGlhbG9nT25VaVRocmVhZCgpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgc2hvd0RpYWxvZ09uVWlUaHJlYWQoKSB7CiAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBhY3Rpdml0eUhvbGRlci5nZXQoKTsKICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCkgewotICAgICAgb25DbGVhcmVkKENBTkNFTExFRCwgZGF0YSk7CisgICAgICBzZW5kUmVzcG9uc2UoQ0FOQ0VMTEVELCBkYXRhKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgRXJyb3JEaWFsb2cuQnVpbGRlciBkaWFsb2dCdWlsZGVyID0gbmV3IEVycm9yRGlhbG9nLkJ1aWxkZXIoYWN0aXZpdHkpOwpAQCAtOTcsMjggKzk1LDEwIEBACiAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gcGxhdGZvcm0gZXJyb3IgIiArIGVycm9yVHlwZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZGlhbG9nID0gZGlhbG9nQnVpbGRlcgotICAgICAgICAuc2V0QnV0dG9uQ2xpY2tMaXN0ZW5lcih0aGlzKQotICAgICAgICAuc2V0T25EaXNtaXNzTGlzdGVuZXIodGhpcykKLSAgICAgICAgLmNyZWF0ZSgpOworICAgIGRpYWxvZyA9IGRpYWxvZ0J1aWxkZXIuc2V0QnV0dG9uQ2xpY2tMaXN0ZW5lcih0aGlzKS5zZXRPbkRpc21pc3NMaXN0ZW5lcih0aGlzKS5jcmVhdGUoKTsKICAgICBkaWFsb2cuc2hvdygpOwogICB9CiAKLSAgLyoqIFByb2dyYW1tYXRpY2FsbHkgZGlzbWlzcyB0aGUgZXJyb3IuICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICBAVXNlZEJ5TmF0aXZlCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIHVpVGhyZWFkSGFuZGxlci5wb3N0KAotICAgICAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGRpYWxvZy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgfQotCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2dJbnRlcmZhY2UsIGludCB3aGljaEJ1dHRvbikgewogICAgIGlmIChlcnJvclR5cGUgPT0gQ09OTkVDVElPTl9FUlJPUikgewpAQCAtMTQxLDEzICsxMjEsMTMgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzcyhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nSW50ZXJmYWNlKSB7CiAgICAgZGlhbG9nID0gbnVsbDsKLSAgICBvbkNsZWFyZWQocmVzcG9uc2UsIGRhdGEpOworICAgIHNlbmRSZXNwb25zZShyZXNwb25zZSwgZGF0YSk7CiAgIH0KIAogICAvKiogSW5mb3JtcyBTdGFyYm9hcmQgd2hlbiB0aGUgZXJyb3IgaXMgZGlzbWlzc2VkLiAqLwotICBwcm90ZWN0ZWQgdm9pZCBvbkNsZWFyZWQoQFBsYXRmb3JtRXJyb3IuUmVzcG9uc2UgaW50IHJlc3BvbnNlLCBsb25nIGRhdGEpIHsKLSAgICBuYXRpdmVPbkNsZWFyZWQocmVzcG9uc2UsIGRhdGEpOworICBwcm90ZWN0ZWQgdm9pZCBzZW5kUmVzcG9uc2UoQFBsYXRmb3JtRXJyb3IuUmVzcG9uc2UgaW50IHJlc3BvbnNlLCBsb25nIGRhdGEpIHsKKyAgICBuYXRpdmVTZW5kUmVzcG9uc2UocmVzcG9uc2UsIGRhdGEpOwogICB9CiAKLSAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbkNsZWFyZWQoQFBsYXRmb3JtRXJyb3IuUmVzcG9uc2UgaW50IHJlc3BvbnNlLCBsb25nIGRhdGEpOworICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNlbmRSZXNwb25zZShAUGxhdGZvcm1FcnJvci5SZXNwb25zZSBpbnQgcmVzcG9uc2UsIGxvbmcgZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvY29hdC9TdGFyYm9hcmRCcmlkZ2UuamF2YSBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L1N0YXJib2FyZEJyaWRnZS5qYXZhCmluZGV4IDZlN2NiNGIuLmJlZTZlNmQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L1N0YXJib2FyZEJyaWRnZS5qYXZhCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9jb2F0L1N0YXJib2FyZEJyaWRnZS5qYXZhCkBAIC00NSwxMCArNDUsNiBAQAogaW1wb3J0IGRldi5jb2JhbHQudXRpbC5Mb2c7CiBpbXBvcnQgZGV2LmNvYmFsdC51dGlsLlVzZWRCeU5hdGl2ZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuSW50ZXJmYWNlQWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIApAQCAtNjIsNiArNTgsNyBAQAogICAgIFN0YXJib2FyZEJyaWRnZSBnZXRTdGFyYm9hcmRCcmlkZ2UoKTsKICAgfQogCisgIHByaXZhdGUgQ29iYWx0U3lzdGVtQ29uZmlnQ2hhbmdlUmVjZWl2ZXIgc3lzQ29uZmlnQ2hhbmdlUmVjZWl2ZXI7CiAgIHByaXZhdGUgQ29iYWx0VGV4dFRvU3BlZWNoSGVscGVyIHR0c0hlbHBlcjsKICAgcHJpdmF0ZSBVc2VyQXV0aG9yaXplciB1c2VyQXV0aG9yaXplcjsKICAgcHJpdmF0ZSBGZWVkYmFja1NlcnZpY2UgZmVlZGJhY2tTZXJ2aWNlOwpAQCAtOTEsNiArODgsOSBAQAogCiAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdGFyYm9hcmRTdG9wcGVkID0gZmFsc2U7CiAKKyAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ29iYWx0U2VydmljZS5GYWN0b3J5PiBjb2JhbHRTZXJ2aWNlRmFjdG9yaWVzID0gbmV3IEhhc2hNYXA8PigpOworICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb2JhbHRTZXJ2aWNlPiBjb2JhbHRTZXJ2aWNlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwogICBwdWJsaWMgU3RhcmJvYXJkQnJpZGdlKAogICAgICAgQ29udGV4dCBhcHBDb250ZXh0LAogICAgICAgSG9sZGVyPEFjdGl2aXR5PiBhY3Rpdml0eUhvbGRlciwKQEAgLTEwNyw2ICsxMDcsNyBAQAogICAgIHRoaXMuYWN0aXZpdHlIb2xkZXIgPSBhY3Rpdml0eUhvbGRlcjsKICAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgIHRoaXMuc3RhcnREZWVwTGluayA9IHN0YXJ0RGVlcExpbms7CisgICAgdGhpcy5zeXNDb25maWdDaGFuZ2VSZWNlaXZlciA9IG5ldyBDb2JhbHRTeXN0ZW1Db25maWdDaGFuZ2VSZWNlaXZlcihhcHBDb250ZXh0LCBzdG9wUmVxdWVzdGVyKTsKICAgICB0aGlzLnR0c0hlbHBlciA9IG5ldyBDb2JhbHRUZXh0VG9TcGVlY2hIZWxwZXIoYXBwQ29udGV4dCwgc3RvcFJlcXVlc3Rlcik7CiAgICAgdGhpcy51c2VyQXV0aG9yaXplciA9IHVzZXJBdXRob3JpemVyOwogICAgIHRoaXMuZmVlZGJhY2tTZXJ2aWNlID0gZmVlZGJhY2tTZXJ2aWNlOwpAQCAtMTIzLDEyICsxMjQsMTQgQEAKICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVN0YXJ0KEFjdGl2aXR5IGFjdGl2aXR5LCBLZXlib2FyZEVkaXRvciBrZXlib2FyZEVkaXRvcikgewogICAgIGFjdGl2aXR5SG9sZGVyLnNldChhY3Rpdml0eSk7CiAgICAgdGhpcy5rZXlib2FyZEVkaXRvciA9IGtleWJvYXJkRWRpdG9yOworICAgIHN5c0NvbmZpZ0NoYW5nZVJlY2VpdmVyLnNldEZvcmVncm91bmQodHJ1ZSk7CiAgIH0KIAogICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5U3RvcChBY3Rpdml0eSBhY3Rpdml0eSkgewogICAgIGlmIChhY3Rpdml0eUhvbGRlci5nZXQoKSA9PSBhY3Rpdml0eSkgewogICAgICAgYWN0aXZpdHlIb2xkZXIuc2V0KG51bGwpOwogICAgIH0KKyAgICBzeXNDb25maWdDaGFuZ2VSZWNlaXZlci5zZXRGb3JlZ3JvdW5kKGZhbHNlKTsKICAgfQogCiAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlEZXN0cm95KEFjdGl2aXR5IGFjdGl2aXR5KSB7CkBAIC0xNDksNiArMTUyLDkgQEAKICAgICAvLyB3aGF0ZXZlciB0aGUgd2ViIGFwcCB3YW50cyB0byBkbyB3aXRoIHRoZW0gYXMgcGFydCBvZiBpdHMgc3RhcnQvcmVzdW1lIGxvZ2ljLgogICAgIGNvYmFsdE1lZGlhU2Vzc2lvbi5yZXN1bWUoKTsKICAgICBmZWVkYmFja1NlcnZpY2UuY29ubmVjdCgpOworICAgIGZvciAoQ29iYWx0U2VydmljZSBzZXJ2aWNlIDogY29iYWx0U2VydmljZXMudmFsdWVzKCkpIHsKKyAgICAgIHNlcnZpY2UuYmVmb3JlU3RhcnRPclJlc3VtZSgpOworICAgIH0KICAgfQogCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQpAQCAtMTYwLDYgKzE2Niw5IEBACiAgICAgLy8gY2FuIHRha2UgdGhlaXIgdGltZSBzdXNwZW5kaW5nIGFmdGVyIHRoYXQuCiAgICAgY29iYWx0TWVkaWFTZXNzaW9uLnN1c3BlbmQoKTsKICAgICBmZWVkYmFja1NlcnZpY2UuZGlzY29ubmVjdCgpOworICAgIGZvciAoQ29iYWx0U2VydmljZSBzZXJ2aWNlIDogY29iYWx0U2VydmljZXMudmFsdWVzKCkpIHsKKyAgICAgIHNlcnZpY2UuYmVmb3JlU3VzcGVuZCgpOworICAgIH0KICAgfQogCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQpAQCAtMTY4LDYgKzE3Nyw5IEBACiAgICAgc3RhcmJvYXJkU3RvcHBlZCA9IHRydWU7CiAgICAgdHRzSGVscGVyLnNodXRkb3duKCk7CiAgICAgdXNlckF1dGhvcml6ZXIuc2h1dGRvd24oKTsKKyAgICBmb3IgKENvYmFsdFNlcnZpY2Ugc2VydmljZSA6IGNvYmFsdFNlcnZpY2VzLnZhbHVlcygpKSB7CisgICAgICBzZXJ2aWNlLmFmdGVyU3RvcHBlZCgpOworICAgIH0KICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IGFjdGl2aXR5SG9sZGVyLmdldCgpOwogICAgIGlmIChhY3Rpdml0eSAhPSBudWxsKSB7CiAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBhY3Rpdml0eSBpcyBkZXN0cm95ZWQgdG8gZXhpdC4KQEAgLTIxMywxMCArMjI1LDkgQEAKIAogICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgQFVzZWRCeU5hdGl2ZQotICBQbGF0Zm9ybUVycm9yIHJhaXNlUGxhdGZvcm1FcnJvcihAUGxhdGZvcm1FcnJvci5FcnJvclR5cGUgaW50IGVycm9yVHlwZSwgbG9uZyBkYXRhKSB7CisgIHZvaWQgcmFpc2VQbGF0Zm9ybUVycm9yKEBQbGF0Zm9ybUVycm9yLkVycm9yVHlwZSBpbnQgZXJyb3JUeXBlLCBsb25nIGRhdGEpIHsKICAgICBQbGF0Zm9ybUVycm9yIGVycm9yID0gbmV3IFBsYXRmb3JtRXJyb3IoYWN0aXZpdHlIb2xkZXIsIGVycm9yVHlwZSwgZGF0YSk7CiAgICAgZXJyb3IucmFpc2UoKTsKLSAgICByZXR1cm4gZXJyb3I7CiAgIH0KIAogICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBuYXRpdmUgY29kZSBpcyBjb21waWxlZCBmb3IgcmVsZWFzZSAoaS5lLiAnZ29sZCcgYnVpbGQpLiAqLwpAQCAtMjcwLDQ4ICsyODEsNiBAQAogICAgIHJldHVybiBhcHBDb250ZXh0LmdldENhY2hlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJucyBub24tbG9vcGJhY2sgbmV0d29yayBpbnRlcmZhY2UgYWRkcmVzcywgb3IgbnVsbCBpZiBub25lLgotICAgKgotICAgKiA8cD5BbiBJUHY0IGFkZHJlc3Mgd2lsbCBoYXZlIG9ubHkgYSA0IGJ5dGUgYXJyYXksIHdoaWxlIGFuIElQdjYgYWRkcmVzcyB3aWxsIGhhdmUgYSAxNiBieXRlCi0gICAqIGFycmF5LgotICAgKgotICAgKiA8cD5BIEphdmEgZnVuY3Rpb24gdG8gaGVscCBpbXBsZW1lbnQgU3RhcmJvYXJkJ3MgU2JTb2NrZXRHZXRMb2NhbEludGVyZmFjZUFkZHJlc3MuCi0gICAqCi0gICAqIDxwPlJlcXVpcmVkIGZvciBwbGF0Zm9ybXMgb2xkZXIgdGhhbiAyNC4gU2luY2UgMjQsIGJpb25pYyBpbmNsdWRlcyBnZXRpZmFkZHJzKCkgd2hpY2ggY2FuIGJlCi0gICAqIHVzZWQgYnkgdGhlIEMgbGF5ZXIgZGlyZWN0bHkuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgQFVzZWRCeU5hdGl2ZQotICBieXRlW10gZ2V0TG9jYWxJbnRlcmZhY2VBZGRyZXNzKCkgewotICAgIHRyeSB7Ci0gICAgICBFbnVtZXJhdGlvbjxOZXR3b3JrSW50ZXJmYWNlPiBpdCA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKLQotICAgICAgd2hpbGUgKGl0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgIE5ldHdvcmtJbnRlcmZhY2UgbmkgPSBpdC5uZXh0RWxlbWVudCgpOwotICAgICAgICBpZiAobmkuaXNMb29wYmFjaygpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuaS5pc1VwKCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmkuaXNQb2ludFRvUG9pbnQoKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJbnRlcmZhY2VBZGRyZXNzIGlhIDogbmkuZ2V0SW50ZXJmYWNlQWRkcmVzc2VzKCkpIHsKLSAgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgZmlyc3QgYWRkcmVzcy4KLSAgICAgICAgICByZXR1cm4gaWEuZ2V0QWRkcmVzcygpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBleCkgewotICAgICAgLy8gVE9ETyBzaG91bGQgd2UgaGF2ZSBhIGxvZ2dpbmcgc3RvcnkgdGhhdCBzdHJpcHMgbG9ncyBmb3IgcHJvZHVjdGlvbj8KLSAgICAgIExvZy53KFRBRywgInNiU29ja2V0R2V0TG9jYWxJbnRlcmZhY2VBZGRyZXNzIGV4Y2VwdGlvbiIsIGV4KTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICBAVXNlZEJ5TmF0aXZlCiAgIENvYmFsdFRleHRUb1NwZWVjaEhlbHBlciBnZXRUZXh0VG9TcGVlY2hIZWxwZXIoKSB7CkBAIC01NTQsNCArNTIzLDQwIEBACiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29iYWx0U2VydmljZShDb2JhbHRTZXJ2aWNlLkZhY3RvcnkgZmFjdG9yeSkgeworICAgIGNvYmFsdFNlcnZpY2VGYWN0b3JpZXMucHV0KGZhY3RvcnkuZ2V0U2VydmljZU5hbWUoKSwgZmFjdG9yeSk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgQFVzZWRCeU5hdGl2ZQorICBib29sZWFuIGhhc0NvYmFsdFNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgcmV0dXJuIGNvYmFsdFNlcnZpY2VGYWN0b3JpZXMuZ2V0KHNlcnZpY2VOYW1lKSAhPSBudWxsOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgIEBVc2VkQnlOYXRpdmUKKyAgQ29iYWx0U2VydmljZSBvcGVuQ29iYWx0U2VydmljZShsb25nIG5hdGl2ZVNlcnZpY2UsIFN0cmluZyBzZXJ2aWNlTmFtZSkgeworICAgIGlmIChjb2JhbHRTZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpICE9IG51bGwpIHsKKyAgICAgIC8vIEF0dGVtcHRpbmcgdG8gcmUtb3BlbiBhbiBhbHJlYWR5IG9wZW4gc2VydmljZSBmYWlscy4KKyAgICAgIExvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiQ2Fubm90IG9wZW4gYWxyZWFkeSBvcGVuIHNlcnZpY2UgJXMiLCBzZXJ2aWNlTmFtZSkpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIGZpbmFsIENvYmFsdFNlcnZpY2UuRmFjdG9yeSBmYWN0b3J5ID0gY29iYWx0U2VydmljZUZhY3Rvcmllcy5nZXQoc2VydmljZU5hbWUpOworICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIExvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiQ2Fubm90IG9wZW4gdW5yZWdpc3RlcmVkIHNlcnZpY2UgJXMiLCBzZXJ2aWNlTmFtZSkpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIENvYmFsdFNlcnZpY2Ugc2VydmljZSA9IGZhY3RvcnkuY3JlYXRlQ29iYWx0U2VydmljZShuYXRpdmVTZXJ2aWNlKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7CisgICAgICBjb2JhbHRTZXJ2aWNlcy5wdXQoc2VydmljZU5hbWUsIHNlcnZpY2UpOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBAVXNlZEJ5TmF0aXZlCisgIHZvaWQgY2xvc2VDb2JhbHRTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSkgeworICAgIGNvYmFsdFNlcnZpY2VzLnJlbW92ZShzZXJ2aWNlTmFtZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9tZWRpYS9BdWRpb1RyYWNrQnJpZGdlLmphdmEgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvbWVkaWEvQXVkaW9UcmFja0JyaWRnZS5qYXZhCmluZGV4IDU0ZDAwYWMuLjVmNTkwNjIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9tZWRpYS9BdWRpb1RyYWNrQnJpZGdlLmphdmEKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L21lZGlhL0F1ZGlvVHJhY2tCcmlkZ2UuamF2YQpAQCAtMjYsNyArMjYsOSBAQAogaW1wb3J0IGRldi5jb2JhbHQudXRpbC5Vc2VkQnlOYXRpdmU7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAotLyoqIEEgd3JhcHBlciBvZiB0aGUgYW5kcm9pZCBBdWRpb1RyYWNrIGNsYXNzLiAqLworLy8gQSB3cmFwcGVyIG9mIHRoZSBhbmRyb2lkIEF1ZGlvVHJhY2sgY2xhc3MuCisvLyBBbmRyb2lkIEF1ZGlvVHJhY2sgd291bGQgbm90IHN0YXJ0IHBsYXlpbmcgdW50aWwgdGhlIGJ1ZmZlciBpcyBmdWxseQorLy8gZmlsbGVkIG9uY2UuCiBAVXNlZEJ5TmF0aXZlCiBwdWJsaWMgY2xhc3MgQXVkaW9UcmFja0JyaWRnZSB7CiAgIHByaXZhdGUgQXVkaW9UcmFjayBhdWRpb1RyYWNrOwpAQCAtNzAsMTMgKzcyLDI1IEBACiAgICAgfQogICAgIHdoaWxlIChhdWRpb1RyYWNrQnVmZmVyU2l6ZSA+IDApIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIGF1ZGlvVHJhY2sgPQotICAgICAgICAgICAgbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgYXVkaW9UcmFja0J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjay5NT0RFX1NUUkVBTSwKLSAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuQVVESU9fU0VTU0lPTl9JRF9HRU5FUkFURSk7CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjYpIHsKKyAgICAgICAgICBhdWRpb1RyYWNrID0KKyAgICAgICAgICAgICAgbmV3IEF1ZGlvVHJhY2suQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpCisgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9Gb3JtYXQoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgLnNldEJ1ZmZlclNpemVJbkJ5dGVzKGF1ZGlvVHJhY2tCdWZmZXJTaXplKQorICAgICAgICAgICAgICAgICAgLnNldFRyYW5zZmVyTW9kZShBdWRpb1RyYWNrLk1PREVfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgLnNldFNlc3Npb25JZChBdWRpb01hbmFnZXIuQVVESU9fU0VTU0lPTl9JRF9HRU5FUkFURSkKKyAgICAgICAgICAgICAgICAgIC5zZXRQZXJmb3JtYW5jZU1vZGUoQXVkaW9UcmFjay5QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKQorICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXVkaW9UcmFjayA9CisgICAgICAgICAgICAgIG5ldyBBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2tCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjay5NT0RFX1NUUkVBTSwKKyAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5BVURJT19TRVNTSU9OX0lEX0dFTkVSQVRFKTsKKyAgICAgICAgfQogICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgYXVkaW9UcmFjayA9IG51bGw7CiAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvbWVkaWEvTWVkaWFDb2RlY0JyaWRnZS5qYXZhIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L21lZGlhL01lZGlhQ29kZWNCcmlkZ2UuamF2YQppbmRleCA1ZmQwYThiLi4zYmUzNWVmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvbWVkaWEvTWVkaWFDb2RlY0JyaWRnZS5qYXZhCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9tZWRpYS9NZWRpYUNvZGVjQnJpZGdlLmphdmEKQEAgLTcxLDcgKzcxLDkgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfQURKVVNUTUVOVF9GUFMgPSAzMDsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fSU5JVElBTF9GUFMgPSAzMDsKIAorICBwcml2YXRlIGxvbmcgbU5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2U7CiAgIHByaXZhdGUgTWVkaWFDb2RlYyBtTWVkaWFDb2RlYzsKKyAgcHJpdmF0ZSBNZWRpYUNvZGVjLkNhbGxiYWNrIG1DYWxsYmFjazsKICAgcHJpdmF0ZSBib29sZWFuIG1GbHVzaGVkOwogICBwcml2YXRlIGxvbmcgbUxhc3RQcmVzZW50YXRpb25UaW1lVXM7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NaW1lOwpAQCAtMzI5LDYgKzMzMSw3IEBACiAgIH0KIAogICBwcml2YXRlIE1lZGlhQ29kZWNCcmlkZ2UoCisgICAgICBsb25nIG5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2UsCiAgICAgICBNZWRpYUNvZGVjIG1lZGlhQ29kZWMsCiAgICAgICBTdHJpbmcgbWltZSwKICAgICAgIGJvb2xlYW4gYWRhcHRpdmVQbGF5YmFja1N1cHBvcnRlZCwKQEAgLTMzNiwxNyArMzM5LDczIEBACiAgICAgaWYgKG1lZGlhQ29kZWMgPT0gbnVsbCkgewogICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgIH0KKyAgICBtTmF0aXZlTWVkaWFDb2RlY0JyaWRnZSA9IG5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2U7CiAgICAgbU1lZGlhQ29kZWMgPSBtZWRpYUNvZGVjOwogICAgIG1NaW1lID0gbWltZTsgLy8gVE9ETzogRGVsZXRlIHRoZSB1bnVzZWQgbU1pbWUgZmllbGQKICAgICBtTGFzdFByZXNlbnRhdGlvblRpbWVVcyA9IDA7CiAgICAgbUZsdXNoZWQgPSB0cnVlOwogICAgIG1BZGFwdGl2ZVBsYXliYWNrU3VwcG9ydGVkID0gYWRhcHRpdmVQbGF5YmFja1N1cHBvcnRlZDsKICAgICBtQml0cmF0ZUFkanVzdG1lbnRUeXBlID0gYml0cmF0ZUFkanVzdG1lbnRUeXBlOworICAgIG1DYWxsYmFjayA9CisgICAgICAgIG5ldyBNZWRpYUNvZGVjLkNhbGxiYWNrKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFDb2RlYy5Db2RlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgaWYgKG1OYXRpdmVNZWRpYUNvZGVjQnJpZGdlID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbmF0aXZlT25NZWRpYUNvZGVjRXJyb3IoCisgICAgICAgICAgICAgICAgICBtTmF0aXZlTWVkaWFDb2RlY0JyaWRnZSwKKyAgICAgICAgICAgICAgICAgIGUuaXNSZWNvdmVyYWJsZSgpLAorICAgICAgICAgICAgICAgICAgZS5pc1RyYW5zaWVudCgpLAorICAgICAgICAgICAgICAgICAgZS5nZXREaWFnbm9zdGljSW5mbygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbklucHV0QnVmZmVyQXZhaWxhYmxlKE1lZGlhQ29kZWMgY29kZWMsIGludCBpbmRleCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgIGlmIChtTmF0aXZlTWVkaWFDb2RlY0JyaWRnZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG5hdGl2ZU9uTWVkaWFDb2RlY0lucHV0QnVmZmVyQXZhaWxhYmxlKG1OYXRpdmVNZWRpYUNvZGVjQnJpZGdlLCBpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25PdXRwdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICAgICAgICAgIE1lZGlhQ29kZWMgY29kZWMsIGludCBpbmRleCwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICBpZiAobU5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2UgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBuYXRpdmVPbk1lZGlhQ29kZWNPdXRwdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICAgICAgICAgICAgICBtTmF0aXZlTWVkaWFDb2RlY0JyaWRnZSwKKyAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgaW5mby5mbGFncywKKyAgICAgICAgICAgICAgICAgIGluZm8ub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgaW5mby5wcmVzZW50YXRpb25UaW1lVXMsCisgICAgICAgICAgICAgICAgICBpbmZvLnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uT3V0cHV0Rm9ybWF0Q2hhbmdlZChNZWRpYUNvZGVjIGNvZGVjLCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICBpZiAobU5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2UgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBuYXRpdmVPbk1lZGlhQ29kZWNPdXRwdXRGb3JtYXRDaGFuZ2VkKG1OYXRpdmVNZWRpYUNvZGVjQnJpZGdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgbU1lZGlhQ29kZWMuc2V0Q2FsbGJhY2sobUNhbGxiYWNrKTsKICAgfQogCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICBAVXNlZEJ5TmF0aXZlCiAgIHB1YmxpYyBzdGF0aWMgTWVkaWFDb2RlY0JyaWRnZSBjcmVhdGVBdWRpb01lZGlhQ29kZWNCcmlkZ2UoCisgICAgICBsb25nIG5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2UsCiAgICAgICBTdHJpbmcgbWltZSwKICAgICAgIGJvb2xlYW4gaXNTZWN1cmUsCiAgICAgICBib29sZWFuIHJlcXVpcmVTb2Z0d2FyZUNvZGVjLApAQCAtMzcwLDcgKzQyOSw4IEBACiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgTWVkaWFDb2RlY0JyaWRnZSBicmlkZ2UgPQotICAgICAgICBuZXcgTWVkaWFDb2RlY0JyaWRnZShtZWRpYUNvZGVjLCBtaW1lLCB0cnVlLCBCaXRyYXRlQWRqdXN0bWVudFR5cGVzLk5PX0FESlVTVE1FTlQpOworICAgICAgICBuZXcgTWVkaWFDb2RlY0JyaWRnZSgKKyAgICAgICAgICAgIG5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2UsIG1lZGlhQ29kZWMsIG1pbWUsIHRydWUsIEJpdHJhdGVBZGp1c3RtZW50VHlwZXMuTk9fQURKVVNUTUVOVCk7CiAKICAgICBNZWRpYUZvcm1hdCBtZWRpYUZvcm1hdCA9IGNyZWF0ZUF1ZGlvRm9ybWF0KG1pbWUsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CiAgICAgc2V0RnJhbWVIYXNBRFRTSGVhZGVyKG1lZGlhRm9ybWF0KTsKQEAgLTM5MSw2ICs0NTEsNyBAQAogICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgQFVzZWRCeU5hdGl2ZQogICBwdWJsaWMgc3RhdGljIE1lZGlhQ29kZWNCcmlkZ2UgY3JlYXRlVmlkZW9NZWRpYUNvZGVjQnJpZGdlKAorICAgICAgbG9uZyBuYXRpdmVNZWRpYUNvZGVjQnJpZGdlLAogICAgICAgU3RyaW5nIG1pbWUsCiAgICAgICBib29sZWFuIGlzU2VjdXJlLAogICAgICAgYm9vbGVhbiByZXF1aXJlU29mdHdhcmVDb2RlYywKQEAgLTQyNSw3ICs0ODYsOCBAQAogICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICAgIE1lZGlhQ29kZWNCcmlkZ2UgYnJpZGdlID0KLSAgICAgICAgbmV3IE1lZGlhQ29kZWNCcmlkZ2UobWVkaWFDb2RlYywgbWltZSwgdHJ1ZSwgQml0cmF0ZUFkanVzdG1lbnRUeXBlcy5OT19BREpVU1RNRU5UKTsKKyAgICAgICAgbmV3IE1lZGlhQ29kZWNCcmlkZ2UoCisgICAgICAgICAgICBuYXRpdmVNZWRpYUNvZGVjQnJpZGdlLCBtZWRpYUNvZGVjLCBtaW1lLCB0cnVlLCBCaXRyYXRlQWRqdXN0bWVudFR5cGVzLk5PX0FESlVTVE1FTlQpOwogICAgIE1lZGlhRm9ybWF0IG1lZGlhRm9ybWF0ID0KICAgICAgICAgY3JlYXRlVmlkZW9EZWNvZGVyRm9ybWF0KG1pbWUsIHdpZHRoLCBoZWlnaHQsIGZpbmRWaWRlb0RlY29kZXJSZXN1bHQudmlkZW9DYXBhYmlsaXRpZXMpOwogCkBAIC01MjIsNiArNTg0LDkgQEAKICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgIEBVc2VkQnlOYXRpdmUKICAgcHJpdmF0ZSB2b2lkIHN0b3AoKSB7CisgICAgc3luY2hyb25pemVkIChtQ2FsbGJhY2spIHsKKyAgICAgIG1OYXRpdmVNZWRpYUNvZGVjQnJpZGdlID0gMDsKKyAgICB9CiAgICAgdHJ5IHsKICAgICAgIG1NZWRpYUNvZGVjLnN0b3AoKTsKICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewpAQCAtOTUwLDQgKzEwMTUsMjMgQEAKICAgICAgICAgcmV0dXJuIEF1ZGlvRm9ybWF0LkNIQU5ORUxfT1VUX0RFRkFVTFQ7CiAgICAgfQogICB9CisKKyAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbk1lZGlhQ29kZWNFcnJvcigKKyAgICAgIGxvbmcgbmF0aXZlTWVkaWFDb2RlY0JyaWRnZSwKKyAgICAgIGJvb2xlYW4gaXNSZWNvdmVyYWJsZSwKKyAgICAgIGJvb2xlYW4gaXNUcmFuc2llbnQsCisgICAgICBTdHJpbmcgZGlhZ25vc3RpY0luZm8pOworCisgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25NZWRpYUNvZGVjSW5wdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICBsb25nIG5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2UsIGludCBidWZmZXJJbmRleCk7CisKKyAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbk1lZGlhQ29kZWNPdXRwdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICBsb25nIG5hdGl2ZU1lZGlhQ29kZWNCcmlkZ2UsCisgICAgICBpbnQgYnVmZmVySW5kZXgsCisgICAgICBpbnQgZmxhZ3MsCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgbG9uZyBwcmVzZW50YXRpb25UaW1lVXMsCisgICAgICBpbnQgc2l6ZSk7CisKKyAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbk1lZGlhQ29kZWNPdXRwdXRGb3JtYXRDaGFuZ2VkKGxvbmcgbmF0aXZlTWVkaWFDb2RlY0JyaWRnZSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuY2MKaW5kZXggOGU4YjJkYy4uYTUxZGRkZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hcHBsaWNhdGlvbl9hbmRyb2lkLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXBwbGljYXRpb25fYW5kcm9pZC5jYwpAQCAtNDA0LDggKzQwNCwxMCBAQAogICBqb2JqZWN0IGpfa2V5Ym9hcmRfZWRpdG9yID0gZW52LT5DYWxsU3RhcmJvYXJkT2JqZWN0TWV0aG9kT3JBYm9ydCgKICAgICAgICJnZXRLZXlib2FyZEVkaXRvciIsICIoKUxkZXYvY29iYWx0L2NvYXQvS2V5Ym9hcmRFZGl0b3I7Iik7CiAgIGVudi0+Q2FsbFZvaWRNZXRob2RPckFib3J0KGpfa2V5Ym9hcmRfZWRpdG9yLCAic2hvd0tleWJvYXJkIiwgIigpViIpOwotICAvLyBUT0RPOiBGaXJlIGtTYkV2ZW50VHlwZVdpbmRvd1NpemVDaGFuZ2UgYW5kCi0gIC8vIGtTYkV2ZW50VHlwZU9uU2NyZWVuS2V5Ym9hcmRTaG93biBpZiBuZWNlc3NhcnkuCisgIGludCogZGF0YSA9IG5ldyBpbnQ7CisgICpkYXRhID0gdGlja2V0OworICBJbmplY3QobmV3IEV2ZW50KGtTYkV2ZW50VHlwZU9uU2NyZWVuS2V5Ym9hcmRTaG93biwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAmRGVsZXRlRGVzdHJ1Y3RvcjxpbnQ+KSk7CiAgIHJldHVybjsKIH0KIApAQCAtNDE1LDggKzQxNywzOSBAQAogICBqb2JqZWN0IGpfa2V5Ym9hcmRfZWRpdG9yID0gZW52LT5DYWxsU3RhcmJvYXJkT2JqZWN0TWV0aG9kT3JBYm9ydCgKICAgICAgICJnZXRLZXlib2FyZEVkaXRvciIsICIoKUxkZXYvY29iYWx0L2NvYXQvS2V5Ym9hcmRFZGl0b3I7Iik7CiAgIGVudi0+Q2FsbFZvaWRNZXRob2RPckFib3J0KGpfa2V5Ym9hcmRfZWRpdG9yLCAiaGlkZUtleWJvYXJkIiwgIigpViIpOwotICAvLyBUT0RPOiBGaXJlIGtTYkV2ZW50VHlwZVdpbmRvd1NpemVDaGFuZ2UgYW5kCi0gIC8vIGtTYkV2ZW50VHlwZU9uU2NyZWVuS2V5Ym9hcmRIaWRkZW4gaWYgbmVjZXNzYXJ5LgorICBpbnQqIGRhdGEgPSBuZXcgaW50OworICAqZGF0YSA9IHRpY2tldDsKKyAgSW5qZWN0KG5ldyBFdmVudChrU2JFdmVudFR5cGVPblNjcmVlbktleWJvYXJkSGlkZGVuLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICZEZWxldGVEZXN0cnVjdG9yPGludD4pKTsKKyAgcmV0dXJuOworfQorCit2b2lkIEFwcGxpY2F0aW9uQW5kcm9pZDo6U2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMoCisgICAgU2JXaW5kb3cgd2luZG93LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgaW50IHRpY2tldCkgeworICBKbmlFbnZFeHQqIGVudiA9IEpuaUVudkV4dDo6R2V0KCk7CisgIGpvYmplY3RBcnJheSBjb21wbGV0aW9ucyA9IGVudi0+TmV3T2JqZWN0QXJyYXkoCisgICAgICBzdWdnZXN0aW9ucy5zaXplKCksCisgICAgICBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0NvbXBsZXRpb25JbmZvIiksIDApOworICBqc3RyaW5nIHN0cjsKKyAgam9iamVjdCBqX2NvbXBsZXRpb25faW5mbzsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWdnZXN0aW9ucy5zaXplKCk7IGkrKykgeworICAgIHN0ciA9IGVudi0+TmV3U3RyaW5nVVRGKHN1Z2dlc3Rpb25zW2ldLmNfc3RyKCkpOworICAgIGpfY29tcGxldGlvbl9pbmZvID0KKyAgICAgICAgZW52LT5OZXdPYmplY3RPckFib3J0KCJhbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvQ29tcGxldGlvbkluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihKSUxqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylWIiwgaSwgaSwgc3RyKTsKKyAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChjb21wbGV0aW9ucywgaSwgal9jb21wbGV0aW9uX2luZm8pOworICB9CisgIGpvYmplY3Qgal9rZXlib2FyZF9lZGl0b3IgPSBlbnYtPkNhbGxTdGFyYm9hcmRPYmplY3RNZXRob2RPckFib3J0KAorICAgICAgImdldEtleWJvYXJkRWRpdG9yIiwgIigpTGRldi9jb2JhbHQvY29hdC9LZXlib2FyZEVkaXRvcjsiKTsKKyAgZW52LT5DYWxsVm9pZE1ldGhvZE9yQWJvcnQoal9rZXlib2FyZF9lZGl0b3IsICJ1cGRhdGVDdXN0b21Db21wbGV0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoW0xhbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvQ29tcGxldGlvbkluZm87KVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucyk7CisgIGludCogZGF0YSA9IG5ldyBpbnQ7CisgICpkYXRhID0gdGlja2V0OworICBJbmplY3QobmV3IEV2ZW50KGtTYkV2ZW50VHlwZU9uU2NyZWVuS2V5Ym9hcmRTdWdnZXN0aW9uc1VwZGF0ZWQsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgJkRlbGV0ZURlc3RydWN0b3I8aW50PikpOwogICByZXR1cm47CiB9CiAKQEAgLTQyNCwxMCArNDU3LDEyIEBACiBKYXZhX2Rldl9jb2JhbHRfY29hdF9LZXlib2FyZElucHV0Q29ubmVjdGlvbl9uYXRpdmVTZW5kVGV4dCgKICAgICBKbmlFbnZFeHQqIGVudiwKICAgICBqb2JqZWN0IHVudXNlZF9jbGF6eiwKLSAgICBqc3RyaW5nIHRleHQpIHsKKyAgICBqc3RyaW5nIHRleHQsCisgICAgamJvb2xlYW4gaXNfY29tcG9zaW5nKSB7CiAgIGlmICh0ZXh0KSB7CiAgICAgc3RkOjpzdHJpbmcgdXRmX3N0ciA9IGVudi0+R2V0U3RyaW5nU3RhbmRhcmRVVEZPckFib3J0KHRleHQpOwotICAgIEFwcGxpY2F0aW9uQW5kcm9pZDo6R2V0KCktPlNiV2luZG93U2VuZElucHV0RXZlbnQodXRmX3N0ci5jX3N0cigpKTsKKyAgICBBcHBsaWNhdGlvbkFuZHJvaWQ6OkdldCgpLT5TYldpbmRvd1NlbmRJbnB1dEV2ZW50KHV0Zl9zdHIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbXBvc2luZyk7CiAgIH0KIH0KIApAQCAtNDM5LDcgKzQ3NCw4IEBACiAgIEFwcGxpY2F0aW9uQW5kcm9pZDo6RGVsZXRlRGVzdHJ1Y3RvcjxTYklucHV0RGF0YT4ocHRyKTsKIH0KIAotdm9pZCBBcHBsaWNhdGlvbkFuZHJvaWQ6OlNiV2luZG93U2VuZElucHV0RXZlbnQoY29uc3QgY2hhciogaW5wdXRfdGV4dCkgewordm9pZCBBcHBsaWNhdGlvbkFuZHJvaWQ6OlNiV2luZG93U2VuZElucHV0RXZlbnQoY29uc3QgY2hhciogaW5wdXRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY29tcG9zaW5nKSB7CiAgIGNoYXIqIHRleHQgPSBTYlN0cmluZ0R1cGxpY2F0ZShpbnB1dF90ZXh0KTsKICAgU2JJbnB1dERhdGEqIGRhdGEgPSBuZXcgU2JJbnB1dERhdGEoKTsKICAgU2JNZW1vcnlTZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CkBAIC00NDcsNiArNDgzLDcgQEAKICAgZGF0YS0+dHlwZSA9IGtTYklucHV0RXZlbnRUeXBlSW5wdXQ7CiAgIGRhdGEtPmRldmljZV90eXBlID0ga1NiSW5wdXREZXZpY2VUeXBlT25TY3JlZW5LZXlib2FyZDsKICAgZGF0YS0+aW5wdXRfdGV4dCA9IHRleHQ7CisgIGRhdGEtPmlzX2NvbXBvc2luZyA9IGlzX2NvbXBvc2luZzsKICAgSW5qZWN0KG5ldyBFdmVudChrU2JFdmVudFR5cGVJbnB1dCwgZGF0YSwgJkRlbGV0ZVNiSW5wdXREYXRhV2l0aFRleHQpKTsKICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hcHBsaWNhdGlvbl9hbmRyb2lkLmggYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuaAppbmRleCAzNjMxZTAzLi5hZDdhY2I3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuaAorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuaApAQCAtMTcsNiArMTcsOCBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9sb29wZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2lucHV0X2V2ZW50c19nZW5lcmF0b3IuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvam5pX2Vudl9leHQuaCIKQEAgLTc4LDcgKzgwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBpbnB1dF90ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCk7CiAgIHZvaWQgU2JXaW5kb3dIaWRlT25TY3JlZW5LZXlib2FyZChTYldpbmRvdyB3aW5kb3csIGludCB0aWNrZXQpOwotICB2b2lkIFNiV2luZG93U2VuZElucHV0RXZlbnQoY29uc3QgY2hhciogaW5wdXRfdGV4dCk7CisgIHZvaWQgU2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMoCisgICAgICBTYldpbmRvdyB3aW5kb3csCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN1Z2dlc3Rpb25zLAorICAgICAgaW50IHRpY2tldCk7CisgIHZvaWQgU2JXaW5kb3dTZW5kSW5wdXRFdmVudChjb25zdCBjaGFyKiBpbnB1dF90ZXh0LCBib29sIGlzX2NvbXBvc2luZyk7CiAKICBwcm90ZWN0ZWQ6CiAgIC8vIC0tLSBBcHBsaWNhdGlvbiBvdmVycmlkZXMgLS0tCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX2RlY29kZXIuY2MKaW5kZXggNWJkMDkwNS4uZTAyNWIzNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXVkaW9fZGVjb2Rlci5jYwpAQCAtMjIyLDYgKzIyMiw4IEBACiAgICAgICAgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdC5wcmVzZW50YXRpb25fdGltZV9taWNyb3NlY29uZHMsIHNpemUpOwogCiAgICAgU2JNZW1vcnlDb3B5KGRlY29kZWRfYXVkaW8tPmJ1ZmZlcigpLCBkYXRhLCBzaXplKTsKKyAgICBtZWRpYV9jb2RlY19icmlkZ2UtPlJlbGVhc2VPdXRwdXRCdWZmZXIoZGVxdWV1ZV9vdXRwdXRfcmVzdWx0LmluZGV4LCBmYWxzZSk7CisKICAgICB7CiAgICAgICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhkZWNvZGVkX2F1ZGlvc19tdXRleF8pOwogICAgICAgZGVjb2RlZF9hdWRpb3NfLnB1c2goZGVjb2RlZF9hdWRpbyk7CkBAIC0yMjksOSArMjMxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGVjb2RlZF9hdWRpb3NfLmZyb250KCktPnRpbWVzdGFtcCgpOwogICAgIH0KICAgICBTY2hlZHVsZShvdXRwdXRfY2JfKTsKKyAgfSBlbHNlIHsKKyAgICBtZWRpYV9jb2RlY19icmlkZ2UtPlJlbGVhc2VPdXRwdXRCdWZmZXIoZGVxdWV1ZV9vdXRwdXRfcmVzdWx0LmluZGV4LCBmYWxzZSk7CiAgIH0KLQotICBtZWRpYV9jb2RlY19icmlkZ2UtPlJlbGVhc2VPdXRwdXRCdWZmZXIoZGVxdWV1ZV9vdXRwdXRfcmVzdWx0LmluZGV4LCBmYWxzZSk7CiB9CiAKIHZvaWQgQXVkaW9EZWNvZGVyOjpSZWZyZXNoT3V0cHV0Rm9ybWF0KE1lZGlhQ29kZWNCcmlkZ2UqIG1lZGlhX2NvZGVjX2JyaWRnZSkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hdWRpb190cmFja19hdWRpb19zaW5rX3R5cGUuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3RyYWNrX2F1ZGlvX3NpbmtfdHlwZS5jYwppbmRleCA0M2NmNDdkLi5mNjBhNjY4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3RyYWNrX2F1ZGlvX3NpbmtfdHlwZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2F1ZGlvX3RyYWNrX2F1ZGlvX3NpbmtfdHlwZS5jYwpAQCAtMjE4LDMzICsyMTgsMzcgQEAKIAogdm9pZCBBdWRpb1RyYWNrQXVkaW9TaW5rOjpBdWRpb1RocmVhZEZ1bmMoKSB7CiAgIEpuaUVudkV4dCogZW52ID0gSm5pRW52RXh0OjpHZXQoKTsKLSAgZW52LT5DYWxsVm9pZE1ldGhvZE9yQWJvcnQoal9hdWRpb190cmFja19icmlkZ2VfLCAicGxheSIsICIoKVYiKTsKLQotICBib29sIHdhc19wbGF5aW5nID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcGxheWluZyA9IGZhbHNlOwogCiAgIHdoaWxlICghcXVpdF8pIHsKLSAgICBTY29wZWRMb2NhbEphdmFSZWY8am9iamVjdD4gal9hdWRpb190aW1lc3RhbXAoCi0gICAgICAgIGVudi0+Q2FsbE9iamVjdE1ldGhvZE9yQWJvcnQoal9hdWRpb190cmFja19icmlkZ2VfLCAiZ2V0QXVkaW9UaW1lc3RhbXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wOyIpKTsKKyAgICBpbnQgcGxheWJhY2tfaGVhZF9wb3NpdGlvbiA9IDA7CisgICAgU2JUaW1lIGZyYW1lc19jb25zdW1lZF9hdCA9IDA7CiAKLSAgICBpbnQgcGxheWJhY2tfaGVhZF9wb3NpdGlvbiA9Ci0gICAgICAgIGVudi0+R2V0TG9uZ0ZpZWxkT3JBYm9ydChqX2F1ZGlvX3RpbWVzdGFtcC5HZXQoKSwgImZyYW1lUG9zaXRpb24iLCAiSiIpOwotICAgIFNiVGltZSBmcmFtZXNfY29uc3VtZWRfYXQgPQotICAgICAgICBlbnYtPkdldExvbmdGaWVsZE9yQWJvcnQoal9hdWRpb190aW1lc3RhbXAuR2V0KCksICJuYW5vVGltZSIsICJKIikgLwotICAgICAgICAxMDAwOworICAgIGlmICh3YXNfcGxheWluZykgeworICAgICAgU2NvcGVkTG9jYWxKYXZhUmVmPGpvYmplY3Q+IGpfYXVkaW9fdGltZXN0YW1wKAorICAgICAgICAgIGVudi0+Q2FsbE9iamVjdE1ldGhvZE9yQWJvcnQoal9hdWRpb190cmFja19icmlkZ2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldEF1ZGlvVGltZXN0YW1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wOyIpKTsKKyAgICAgIHBsYXliYWNrX2hlYWRfcG9zaXRpb24gPSBlbnYtPkdldExvbmdGaWVsZE9yQWJvcnQoal9hdWRpb190aW1lc3RhbXAuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZVBvc2l0aW9uIiwgIkoiKTsKKyAgICAgIGZyYW1lc19jb25zdW1lZF9hdCA9CisgICAgICAgICAgZW52LT5HZXRMb25nRmllbGRPckFib3J0KGpfYXVkaW9fdGltZXN0YW1wLkdldCgpLCAibmFub1RpbWUiLCAiSiIpIC8KKyAgICAgICAgICAxMDAwOwogCi0gICAgU0JfRENIRUNLKHBsYXliYWNrX2hlYWRfcG9zaXRpb24gPj0gbGFzdF9wbGF5YmFja19oZWFkX3Bvc2l0aW9uXyk7CisgICAgICBTQl9EQ0hFQ0socGxheWJhY2tfaGVhZF9wb3NpdGlvbiA+PSBsYXN0X3BsYXliYWNrX2hlYWRfcG9zaXRpb25fKTsKIAotICAgIHBsYXliYWNrX2hlYWRfcG9zaXRpb24gPQotICAgICAgICBzdGQ6Om1heChwbGF5YmFja19oZWFkX3Bvc2l0aW9uLCBsYXN0X3BsYXliYWNrX2hlYWRfcG9zaXRpb25fKTsKLSAgICBpbnQgZnJhbWVzX2NvbnN1bWVkID0gcGxheWJhY2tfaGVhZF9wb3NpdGlvbiAtIGxhc3RfcGxheWJhY2tfaGVhZF9wb3NpdGlvbl87Ci0gICAgbGFzdF9wbGF5YmFja19oZWFkX3Bvc2l0aW9uXyA9IHBsYXliYWNrX2hlYWRfcG9zaXRpb247Ci0gICAgZnJhbWVzX2NvbnN1bWVkID0gc3RkOjptaW4oZnJhbWVzX2NvbnN1bWVkLCB3cml0dGVuX2ZyYW1lc18pOworICAgICAgcGxheWJhY2tfaGVhZF9wb3NpdGlvbiA9CisgICAgICAgICAgc3RkOjptYXgocGxheWJhY2tfaGVhZF9wb3NpdGlvbiwgbGFzdF9wbGF5YmFja19oZWFkX3Bvc2l0aW9uXyk7CisgICAgICBpbnQgZnJhbWVzX2NvbnN1bWVkID0KKyAgICAgICAgICBwbGF5YmFja19oZWFkX3Bvc2l0aW9uIC0gbGFzdF9wbGF5YmFja19oZWFkX3Bvc2l0aW9uXzsKKyAgICAgIGxhc3RfcGxheWJhY2tfaGVhZF9wb3NpdGlvbl8gPSBwbGF5YmFja19oZWFkX3Bvc2l0aW9uOworICAgICAgZnJhbWVzX2NvbnN1bWVkID0gc3RkOjptaW4oZnJhbWVzX2NvbnN1bWVkLCB3cml0dGVuX2ZyYW1lc18pOwogCi0gICAgaWYgKGZyYW1lc19jb25zdW1lZCAhPSAwKSB7Ci0gICAgICBTQl9EQ0hFQ0soZnJhbWVzX2NvbnN1bWVkID49IDApOwotICAgICAgY29uc3VtZV9mcmFtZV9mdW5jXyhmcmFtZXNfY29uc3VtZWQsIGZyYW1lc19jb25zdW1lZF9hdCwgY29udGV4dF8pOwotICAgICAgd3JpdHRlbl9mcmFtZXNfIC09IGZyYW1lc19jb25zdW1lZDsKKyAgICAgIGlmIChmcmFtZXNfY29uc3VtZWQgIT0gMCkgeworICAgICAgICBTQl9EQ0hFQ0soZnJhbWVzX2NvbnN1bWVkID49IDApOworICAgICAgICBjb25zdW1lX2ZyYW1lX2Z1bmNfKGZyYW1lc19jb25zdW1lZCwgZnJhbWVzX2NvbnN1bWVkX2F0LCBjb250ZXh0Xyk7CisgICAgICAgIHdyaXR0ZW5fZnJhbWVzXyAtPSBmcmFtZXNfY29uc3VtZWQ7CisgICAgICB9CiAgICAgfQogCiAgICAgaW50IGZyYW1lc19pbl9idWZmZXI7CkBAIC0yNTMsNyArMjU3LDYgQEAKICAgICBib29sIGlzX2Vvc19yZWFjaGVkOwogICAgIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmNfKCZmcmFtZXNfaW5fYnVmZmVyLCAmb2Zmc2V0X2luX2ZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfcGxheWluZywgJmlzX2Vvc19yZWFjaGVkLCBjb250ZXh0Xyk7Ci0KICAgICB7CiAgICAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKICAgICAgIGlmIChwbGF5YmFja19yYXRlXyA9PSAwLjApIHsKQEAgLTI5MCw2ICsyOTMsNyBAQAogICAgIGlmIChleHBlY3RlZF93cml0dGVuX2ZyYW1lcyA9PSAwKSB7CiAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IGFsbCB0aGUgZnJhbWVzIGluIGJ1ZmZlciBhcmUgd3JpdHRlbiB0byB0aGUKICAgICAgIC8vIHNvdW5kY2FyZCwgYnV0IHRob3NlIGFyZSBub3QgYmVpbmcgY29uc3VtZWQuCisgICAgICBTYlRocmVhZFNsZWVwKDEwICoga1NiVGltZU1pbGxpc2Vjb25kKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBTQl9EQ0hFQ0soZXhwZWN0ZWRfd3JpdHRlbl9mcmFtZXMgPiAwKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL1JFQURNRS5tZCBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRjZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTEgQEAKK1RoaXMgaXMgYSBwYXJ0aWFsIGZvcmsgb2YgdGhlIEFuZHJvaWQgYmlvbmljIEMgbGlicmFyeSwgdGFrZW4gZnJvbToKKworaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vYmlvbmljLysvNWU2MmIzNGMwZDZmYTU0NWI0ODdiOWI2NGZiNGEwNGEwNTg5YmMxMy9saWJjCisKKworVGhlIHB1cnBvc2UgaXMgdG8gYnVpbGQgaW50byB0aGUgQW5kcm9pZCBTdGFyYm9hcmQgcG9ydCBuZWNlc2FyeSBwYXJ0cyBvZiBiaW9uaWMKK3RoYXQgYXJlIG5vdCBhdmFpbGFibGUgb24gYWxsIHZlcnNpb25zIG9mIEFuZHJvaWQgdGhhdCB3ZSBzdXBwb3J0LCBpbmNsdWRpbmc6CisKKyogYGlmYWRkcnNgIChhbmQgaXRzIGRlcGVuZGVuY2llcykgLSBVc2VkIGJ5IGBTYlNvY2tldEdldEludGVyZmFjZUFkZHJlc3NgLCBidXQKKyAgbm90IGF2YWlsYWJsZSB1bnRpbCBBUEkgMjQuCisKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL2Jpb25pY19uZXRsaW5rLmNwcCBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL2Jpb25pY19uZXRsaW5rLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQ0OWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvYmlvbmljX25ldGxpbmsuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECisgKiBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImJpb25pY19uZXRsaW5rLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJwcml2YXRlL0Vycm5vUmVzdG9yZXIuaCIKKworTmV0bGlua0Nvbm5lY3Rpb246Ok5ldGxpbmtDb25uZWN0aW9uKCkgeworICBmZF8gPSAtMTsKKworICAvLyBUaGUga2VybmVsIGtlZXBzIHBhY2tldHMgdW5kZXIgOEtpQiAoTkxNU0dfR09PRFNJWkUpLAorICAvLyBidXQgdGhhdCdzIGEgYml0IHRvbyBsYXJnZSB0byBnbyBvbiB0aGUgc3RhY2suCisgIHNpemVfID0gODE5MjsKKyAgZGF0YV8gPSBuZXcgY2hhcltzaXplX107Cit9CisKK05ldGxpbmtDb25uZWN0aW9uOjp+TmV0bGlua0Nvbm5lY3Rpb24oKSB7CisgIEVycm5vUmVzdG9yZXIgZXJybm9fcmVzdG9yZXI7CisgIGlmIChmZF8gIT0gLTEpIGNsb3NlKGZkXyk7CisgIGRlbGV0ZVtdIGRhdGFfOworfQorCitib29sIE5ldGxpbmtDb25uZWN0aW9uOjpTZW5kUmVxdWVzdChpbnQgdHlwZSkgeworICAvLyBSYXRoZXIgdGhhbiBmb3JjZSBhbGwgY2FsbGVycyB0byBjaGVjayBmb3IgdGhlIHVubGlrZWx5IGV2ZW50IG9mIGJlaW5nCisgIC8vIHVuYWJsZSB0byBhbGxvY2F0ZSA4S2lCLCBjaGVjayBoZXJlLgorICBpZiAoZGF0YV8gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgIC8vIERpZCB3ZSBvcGVuIGEgbmV0bGluayBzb2NrZXQgeWV0PworICBpZiAoZmRfID09IC0xKSB7CisgICAgZmRfID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfUkFXIHwgU09DS19DTE9FWEVDLCBORVRMSU5LX1JPVVRFKTsKKyAgICBpZiAoZmRfID09IC0xKSByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDb25zdHJ1Y3QgYW5kIHNlbmQgdGhlIG1lc3NhZ2UuCisgIHN0cnVjdCBOZXRsaW5rTWVzc2FnZSB7CisgICAgbmxtc2doZHIgaGRyOworICAgIHJ0Z2VubXNnIG1zZzsKKyAgfSByZXF1ZXN0OworICBtZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisgIHJlcXVlc3QuaGRyLm5sbXNnX2ZsYWdzID0gTkxNX0ZfRFVNUCB8IE5MTV9GX1JFUVVFU1Q7CisgIHJlcXVlc3QuaGRyLm5sbXNnX3R5cGUgPSB0eXBlOworICByZXF1ZXN0Lmhkci5ubG1zZ19sZW4gPSBzaXplb2YocmVxdWVzdCk7CisgIHJlcXVlc3QubXNnLnJ0Z2VuX2ZhbWlseSA9IEFGX1VOU1BFQzsgLy8gQWxsIGZhbWlsaWVzLgorICByZXR1cm4gKFRFTVBfRkFJTFVSRV9SRVRSWShzZW5kKGZkXywgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgMCkpID09IHNpemVvZihyZXF1ZXN0KSk7Cit9CisKK2Jvb2wgTmV0bGlua0Nvbm5lY3Rpb246OlJlYWRSZXNwb25zZXModm9pZCBjYWxsYmFjayh2b2lkKiwgbmxtc2doZHIqKSwgdm9pZCogY29udGV4dCkgeworICAvLyBSZWFkIHRocm91Z2ggYWxsIHRoZSByZXNwb25zZXMsIGhhbmRpbmcgaW50ZXJlc3Rpbmcgb25lcyB0byB0aGUgY2FsbGJhY2suCisgIHNzaXplX3QgYnl0ZXNfcmVhZDsKKyAgd2hpbGUgKChieXRlc19yZWFkID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlY3YoZmRfLCBkYXRhXywgc2l6ZV8sIDApKSkgPiAwKSB7CisgICAgbmxtc2doZHIqIGhkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8bmxtc2doZHIqPihkYXRhXyk7CisgICAgZm9yICg7IE5MTVNHX09LKGhkciwgc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlc19yZWFkKSk7IGhkciA9IE5MTVNHX05FWFQoaGRyLCBieXRlc19yZWFkKSkgeworICAgICAgaWYgKGhkci0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChoZHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpIHsKKyAgICAgICAgbmxtc2dlcnIqIGVyciA9IHJlaW50ZXJwcmV0X2Nhc3Q8bmxtc2dlcnIqPihOTE1TR19EQVRBKGhkcikpOworICAgICAgICBlcnJubyA9IChoZHItPm5sbXNnX2xlbiA+PSBOTE1TR19MRU5HVEgoc2l6ZW9mKG5sbXNnZXJyKSkpID8gLWVyci0+ZXJyb3IgOiBFSU87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGNhbGxiYWNrKGNvbnRleHQsIGhkcik7CisgICAgfQorICB9CisKKyAgLy8gV2Ugb25seSBnZXQgaGVyZSBpZiByZWN2IGZhaWxzIGJlZm9yZSB3ZSBzZWUgYSBOTE1TR19ET05FLgorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Jpb25pYy9iaW9uaWNfbmV0bGluay5oIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvYmlvbmljX25ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjEyMDBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvYmlvbmljX25ldGxpbmsuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKK3N0cnVjdCBubG1zZ2hkcjsKKworY2xhc3MgTmV0bGlua0Nvbm5lY3Rpb24geworIHB1YmxpYzoKKyAgTmV0bGlua0Nvbm5lY3Rpb24oKTsKKyAgfk5ldGxpbmtDb25uZWN0aW9uKCk7CisKKyAgYm9vbCBTZW5kUmVxdWVzdChpbnQgdHlwZSk7CisgIGJvb2wgUmVhZFJlc3BvbnNlcyh2b2lkIGNhbGxiYWNrKHZvaWQqLCBubG1zZ2hkciopLCB2b2lkKiBjb250ZXh0KTsKKworIHByaXZhdGU6CisgIGludCBmZF87CisgIGNoYXIqIGRhdGFfOworICBzaXplX3Qgc2l6ZV87Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvaWZhZGRycy5jcHAgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Jpb25pYy9pZmFkZHJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWIwODBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvaWZhZGRycy5jcHAKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECisgKiBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGlmYWRkcnMuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJwcml2YXRlL0Vycm5vUmVzdG9yZXIuaCIKKworI2luY2x1ZGUgImJpb25pY19uZXRsaW5rLmgiCisKKy8vIFRoZSBwdWJsaWMgaWZhZGRycyBzdHJ1Y3QgaXMgZnVsbCBvZiBwb2ludGVycy4gUmF0aGVyIHRoYW4gdHJhY2sgc2V2ZXJhbAorLy8gZGlmZmVyZW50IGFsbG9jYXRpb25zLCB3ZSB1c2UgYSBtYXhpbWFsbHktc2l6ZWQgc3RydWN0dXJlIHdpdGggdGhlIHB1YmxpYworLy8gcGFydCBhdCBvZmZzZXQgMCwgYW5kIHBvaW50ZXJzIGludG8gaXRzIGhpZGRlbiB0YWlsLgorc3RydWN0IGlmYWRkcnNfc3RvcmFnZSB7CisgIC8vIE11c3QgY29tZSBmaXJzdCwgc28gdGhhdCBgaWZhZGRyc19zdG9yYWdlYCBpcy1hIGBpZmFkZHJzYC4KKyAgaWZhZGRycyBpZmE7CisKKyAgLy8gVGhlIGludGVyZmFjZSBpbmRleCwgc28gd2UgY2FuIG1hdGNoIFJUTV9ORVdBRERSIG1lc3NhZ2VzIHdpdGgKKyAgLy8gZWFybGllciBSVE1fTkVXTElOSyBtZXNzYWdlcyAodG8gY29weSB0aGUgaW50ZXJmYWNlIGZsYWdzKS4KKyAgaW50IGludGVyZmFjZV9pbmRleDsKKworICAvLyBTdG9yYWdlIGZvciB0aGUgcG9pbnRlcnMgaW4gYGlmYWAuCisgIHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgc29ja2FkZHJfc3RvcmFnZSBuZXRtYXNrOworICBzb2NrYWRkcl9zdG9yYWdlIGlmYV9pZnU7CisgIGNoYXIgbmFtZVtJRk5BTVNJWiArIDFdOworCisgIGV4cGxpY2l0IGlmYWRkcnNfc3RvcmFnZShpZmFkZHJzKiogbGlzdCkgeworICAgIG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKKworICAgIC8vIHB1c2hfZnJvbnQgb250byBgbGlzdGAuCisgICAgaWZhLmlmYV9uZXh0ID0gKmxpc3Q7CisgICAgKmxpc3QgPSByZWludGVycHJldF9jYXN0PGlmYWRkcnMqPih0aGlzKTsKKyAgfQorCisgIHZvaWQgU2V0QWRkcmVzcyhpbnQgZmFtaWx5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgYnl0ZUNvdW50KSB7CisgICAgLy8gVGhlIGtlcm5lbCBjdXJyZW50bHkgdXNlcyB0aGUgb3JkZXIgSUZBX0FERFJFU1MsIElGQV9MT0NBTCwgSUZBX0JST0FEQ0FTVAorICAgIC8vIGluIGluZXRfZmlsbF9pZmFkZHIsIGJ1dCBsZXQncyBub3QgYXNzdW1lIHRoYXQgd2lsbCBhbHdheXMgYmUgdHJ1ZS4uLgorICAgIGlmIChpZmEuaWZhX2FkZHIgPT0gbnVsbHB0cikgeworICAgICAgLy8gVGhpcyBpcyBhbiBJRkFfQUREUkVTUyBhbmQgaGF2ZW4ndCBzZWVuIGFuIElGQV9MT0NBTCB5ZXQsIHNvIGFzc3VtZSB0aGlzIGlzIHRoZQorICAgICAgLy8gbG9jYWwgYWRkcmVzcy4gU2V0TG9jYWxBZGRyZXNzIHdpbGwgZml4IHRoaW5ncyBpZiB3ZSBsYXRlciBzZWUgYW4gSUZBX0xPQ0FMLgorICAgICAgaWZhLmlmYV9hZGRyID0gQ29weUFkZHJlc3MoZmFtaWx5LCBkYXRhLCBieXRlQ291bnQsICZhZGRyKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgYWxyZWFkeSBzYXcgYW4gSUZBX0xPQ0FMLCB3aGljaCBpbXBsaWVzIHRoaXMgaXMgYSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICAgICAgaWZhLmlmYV9kc3RhZGRyID0gQ29weUFkZHJlc3MoZmFtaWx5LCBkYXRhLCBieXRlQ291bnQsICZpZmFfaWZ1KTsKKyAgICB9CisgIH0KKworICB2b2lkIFNldEJyb2FkY2FzdEFkZHJlc3MoaW50IGZhbWlseSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGJ5dGVDb3VudCkgeworICAgIC8vIGlmYV9icm9hZGFkZHIgYW5kIGlmYV9kc3RhZGRyIG92ZXJsYXAgaW4gYSB1bmlvbi4gVW5mb3J0dW5hdGVseSwgaXQncyBwb3NzaWJsZQorICAgIC8vIHRvIGhhdmUgYW4gaW50ZXJmYWNlIHdpdGggYm90aC4gS2VlcGluZyB0aGUgbGFzdCB0aGluZyB0aGUga2VybmVsIGdpdmVzIHVzIHNlZW1zCisgICAgLy8gdG8gYmUgZ2xpYmMgMi4xOSdzIGJlaGF2aW9yIHRvbywgc28gb3VyIGNob2ljZSBpcyBiZWluZyBzb3VyY2UgY29tcGF0aWJsZSB3aXRoCisgICAgLy8gYmFkbHktd3JpdHRlbiBjb2RlIHRoYXQgYXNzdW1lcyBpZmFfYnJvYWRhZGRyIGFuZCBpZmFfZHN0YWRkciBhcmUgaW50ZXJjaGFuZ2VhYmxlCisgICAgLy8gb3Igc3VwcG9ydGluZyBpbnRlcmZhY2VzIHdpdGggYm90aCBhZGRyZXNzZXMgY29uZmlndXJlZC4gTXkgYXNzdW1wdGlvbiBpcyB0aGF0CisgICAgLy8gYmFkIGNvZGUgaXMgbW9yZSBjb21tb24gdGhhbiB3ZWlyZCBuZXR3b3JrIGludGVyZmFjZXMuLi4KKyAgICBpZmEuaWZhX2Jyb2FkYWRkciA9IENvcHlBZGRyZXNzKGZhbWlseSwgZGF0YSwgYnl0ZUNvdW50LCAmaWZhX2lmdSk7CisgIH0KKworICB2b2lkIFNldExvY2FsQWRkcmVzcyhpbnQgZmFtaWx5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgYnl0ZUNvdW50KSB7CisgICAgLy8gVGhlIGtlcm5lbCBzb3VyY2Ugc2F5cyAiZm9yIHBvaW50LXRvLXBvaW50IElGQV9BRERSRVNTIGlzIERFU1RJTkFUSU9OIGFkZHJlc3MsCisgICAgLy8gbG9jYWwgYWRkcmVzcyBpcyBzdXBwbGllZCBpbiBJRkFfTE9DQUwgYXR0cmlidXRlIi4KKyAgICAvLyAgIC0tIGh0dHA6Ly9seHIuZnJlZS1lbGVjdHJvbnMuY29tL3NvdXJjZS9pbmNsdWRlL3VhcGkvbGludXgvaWZfYWRkci5oI0wxNworCisgICAgLy8gU28gY29weSBhbnkgZXhpc3RpbmcgSUZBX0FERFJFU1MgaW50byBpZmFfZHN0YWRkci4uLgorICAgIGlmIChpZmEuaWZhX2FkZHIgIT0gbnVsbHB0cikgeworICAgICAgaWZhLmlmYV9kc3RhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcio+KG1lbWNweSgmaWZhX2lmdSwgJmFkZHIsIHNpemVvZihhZGRyKSkpOworICAgIH0KKyAgICAvLyAuLi5hbmQgdGhlbiBwdXQgdGhpcyBJRkFfTE9DQUwgaW50byBpZmFfYWRkci4KKyAgICBpZmEuaWZhX2FkZHIgPSBDb3B5QWRkcmVzcyhmYW1pbHksIGRhdGEsIGJ5dGVDb3VudCwgJmFkZHIpOworICB9CisKKyAgLy8gTmV0bGluayBnaXZlcyB1cyB0aGUgcHJlZml4IGxlbmd0aCBhcyBhIGJpdCBjb3VudC4gV2UgbmVlZCB0byB0dXJuCisgIC8vIHRoYXQgaW50byBhIEJTRC1jb21wYXRpYmxlIG5ldG1hc2sgcmVwcmVzZW50ZWQgYnkgYSBzb2NrYWRkciouCisgIHZvaWQgU2V0TmV0bWFzayhpbnQgZmFtaWx5LCBzaXplX3QgcHJlZml4X2xlbmd0aCkgeworICAgIC8vIC4uLmFuZCB3b3JrIG91dCB0aGUgbmV0bWFzayBmcm9tIHRoZSBwcmVmaXggbGVuZ3RoLgorICAgIG5ldG1hc2suc3NfZmFtaWx5ID0gZmFtaWx5OworICAgIHVpbnQ4X3QqIGRzdCA9IFNvY2thZGRyQnl0ZXMoZmFtaWx5LCAmbmV0bWFzayk7CisgICAgbWVtc2V0KGRzdCwgMHhmZiwgcHJlZml4X2xlbmd0aCAvIDgpOworICAgIGlmICgocHJlZml4X2xlbmd0aCAlIDgpICE9IDApIHsKKyAgICAgIGRzdFtwcmVmaXhfbGVuZ3RoLzhdID0gKDB4ZmYgPDwgKDggLSAocHJlZml4X2xlbmd0aCAlIDgpKSk7CisgICAgfQorICAgIGlmYS5pZmFfbmV0bWFzayA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHIqPigmbmV0bWFzayk7CisgIH0KKworICB2b2lkIFNldFBhY2tldEF0dHJpYnV0ZXMoaW50IGlmaW5kZXgsIHVuc2lnbmVkIHNob3J0IGhhdHlwZSwgdW5zaWduZWQgY2hhciBoYWxlbikgeworICAgIHNvY2thZGRyX2xsKiBzbGwgPSByZWludGVycHJldF9jYXN0PHNvY2thZGRyX2xsKj4oJmFkZHIpOworICAgIHNsbC0+c2xsX2lmaW5kZXggPSBpZmluZGV4OworICAgIHNsbC0+c2xsX2hhdHlwZSA9IGhhdHlwZTsKKyAgICBzbGwtPnNsbF9oYWxlbiA9IGhhbGVuOworICB9CisKKyBwcml2YXRlOgorICBzb2NrYWRkciogQ29weUFkZHJlc3MoaW50IGZhbWlseSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGJ5dGVDb3VudCwgc29ja2FkZHJfc3RvcmFnZSogc3MpIHsKKyAgICAvLyBOZXRsaW5rIGdpdmVzIHVzIHRoZSBhZGRyZXNzIGZhbWlseSBpbiB0aGUgaGVhZGVyLCBhbmQgdGhlCisgICAgLy8gc29ja2FkZHJfaW4gb3Igc29ja2FkZHJfaW42IGJ5dGVzIGFzIHRoZSBwYXlsb2FkLiBXZSBuZWVkIHRvCisgICAgLy8gc3RpdGNoIHRoZSB0d28gYml0cyB0b2dldGhlciBpbnRvIHRoZSBzb2NrYWRkciB0aGF0J3MgcGFydCBvZgorICAgIC8vIG91ciBwb3J0YWJsZSBpbnRlcmZhY2UuCisgICAgc3MtPnNzX2ZhbWlseSA9IGZhbWlseTsKKyAgICBtZW1jcHkoU29ja2FkZHJCeXRlcyhmYW1pbHksIHNzKSwgZGF0YSwgYnl0ZUNvdW50KTsKKworICAgIC8vIEZvciBJUHY2IHdlIG1pZ2h0IGFsc28gaGF2ZSB0byBzZXQgdGhlIHNjb3BlIGlkLgorICAgIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYgJiYgKElONl9JU19BRERSX0xJTktMT0NBTChkYXRhKSB8fCBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoZGF0YSkpKSB7CisgICAgICByZWludGVycHJldF9jYXN0PHNvY2thZGRyX2luNio+KHNzKS0+c2luNl9zY29wZV9pZCA9IGludGVyZmFjZV9pbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcio+KHNzKTsKKyAgfQorCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBieXRlIGluIHRoZSBhZGRyZXNzIGRhdGEgKHdoaWNoIGlzCisgIC8vIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpLgorICB1aW50OF90KiBTb2NrYWRkckJ5dGVzKGludCBmYW1pbHksIHNvY2thZGRyX3N0b3JhZ2UqIHNzKSB7CisgICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICBzb2NrYWRkcl9pbiogc3M0ID0gcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcl9pbio+KHNzKTsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3M0LT5zaW5fYWRkcik7CisgICAgfSBlbHNlIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgIHNvY2thZGRyX2luNiogc3M2ID0gcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcl9pbjYqPihzcyk7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnNzNi0+c2luNl9hZGRyKTsKKyAgICB9IGVsc2UgaWYgKGZhbWlseSA9PSBBRl9QQUNLRVQpIHsKKyAgICAgIHNvY2thZGRyX2xsKiBzbGwgPSByZWludGVycHJldF9jYXN0PHNvY2thZGRyX2xsKj4oc3MpOworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzbGwtPnNsbF9hZGRyKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK307CisKK3N0YXRpYyB2b2lkIF9fZ2V0aWZhZGRyc19jYWxsYmFjayh2b2lkKiBjb250ZXh0LCBubG1zZ2hkciogaGRyKSB7CisgIGlmYWRkcnMqKiBvdXQgPSByZWludGVycHJldF9jYXN0PGlmYWRkcnMqKj4oY29udGV4dCk7CisKKyAgaWYgKGhkci0+bmxtc2dfdHlwZSA9PSBSVE1fTkVXTElOSykgeworICAgIGlmaW5mb21zZyogaWZpID0gcmVpbnRlcnByZXRfY2FzdDxpZmluZm9tc2cqPihOTE1TR19EQVRBKGhkcikpOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IGlmYWRkciBlbnRyeSwgYW5kIHNldCB0aGUgaW50ZXJmYWNlIGluZGV4IGFuZCBmbGFncy4KKyAgICBpZmFkZHJzX3N0b3JhZ2UqIG5ld19hZGRyID0gbmV3IGlmYWRkcnNfc3RvcmFnZShvdXQpOworICAgIG5ld19hZGRyLT5pbnRlcmZhY2VfaW5kZXggPSBpZmktPmlmaV9pbmRleDsKKyAgICBuZXdfYWRkci0+aWZhLmlmYV9mbGFncyA9IGlmaS0+aWZpX2ZsYWdzOworCisgICAgLy8gR28gdGhyb3VnaCB0aGUgdmFyaW91cyBiaXRzIG9mIGluZm9ybWF0aW9uIGFuZCBmaW5kIHRoZSBuYW1lLgorICAgIHJ0YXR0ciogcnRhID0gSUZMQV9SVEEoaWZpKTsKKyAgICBzaXplX3QgcnRhX2xlbiA9IElGTEFfUEFZTE9BRChoZHIpOworICAgIHdoaWxlIChSVEFfT0socnRhLCBydGFfbGVuKSkgeworICAgICAgaWYgKHJ0YS0+cnRhX3R5cGUgPT0gSUZMQV9BRERSRVNTKSB7CisgICAgICAgICAgaWYgKFJUQV9QQVlMT0FEKHJ0YSkgPCBzaXplb2YobmV3X2FkZHItPmFkZHIpKSB7CisgICAgICAgICAgICBuZXdfYWRkci0+U2V0QWRkcmVzcyhBRl9QQUNLRVQsIFJUQV9EQVRBKHJ0YSksIFJUQV9QQVlMT0FEKHJ0YSkpOworICAgICAgICAgICAgbmV3X2FkZHItPlNldFBhY2tldEF0dHJpYnV0ZXMoaWZpLT5pZmlfaW5kZXgsIGlmaS0+aWZpX3R5cGUsIFJUQV9QQVlMT0FEKHJ0YSkpOworICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocnRhLT5ydGFfdHlwZSA9PSBJRkxBX0JST0FEQ0FTVCkgeworICAgICAgICAgIGlmIChSVEFfUEFZTE9BRChydGEpIDwgc2l6ZW9mKG5ld19hZGRyLT5pZmFfaWZ1KSkgeworICAgICAgICAgICAgbmV3X2FkZHItPlNldEJyb2FkY2FzdEFkZHJlc3MoQUZfUEFDS0VULCBSVEFfREFUQShydGEpLCBSVEFfUEFZTE9BRChydGEpKTsKKyAgICAgICAgICAgIG5ld19hZGRyLT5TZXRQYWNrZXRBdHRyaWJ1dGVzKGlmaS0+aWZpX2luZGV4LCBpZmktPmlmaV90eXBlLCBSVEFfUEFZTE9BRChydGEpKTsKKyAgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHJ0YS0+cnRhX3R5cGUgPT0gSUZMQV9JRk5BTUUpIHsKKyAgICAgICAgICBpZiAoUlRBX1BBWUxPQUQocnRhKSA8IHNpemVvZihuZXdfYWRkci0+bmFtZSkpIHsKKyAgICAgICAgICAgIG1lbWNweShuZXdfYWRkci0+bmFtZSwgUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSk7CisgICAgICAgICAgICBuZXdfYWRkci0+aWZhLmlmYV9uYW1lID0gbmV3X2FkZHItPm5hbWU7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcnRhID0gUlRBX05FWFQocnRhLCBydGFfbGVuKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaGRyLT5ubG1zZ190eXBlID09IFJUTV9ORVdBRERSKSB7CisgICAgaWZhZGRybXNnKiBtc2cgPSByZWludGVycHJldF9jYXN0PGlmYWRkcm1zZyo+KE5MTVNHX0RBVEEoaGRyKSk7CisKKyAgICAvLyBXZSBzaG91bGQgYWxyZWFkeSBrbm93IGFib3V0IHRoaXMgZnJvbSBhbiBSVE1fTkVXTElOSyBtZXNzYWdlLgorICAgIGNvbnN0IGlmYWRkcnNfc3RvcmFnZSogYWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaWZhZGRyc19zdG9yYWdlKj4oKm91dCk7CisgICAgd2hpbGUgKGFkZHIgIT0gbnVsbHB0ciAmJiBhZGRyLT5pbnRlcmZhY2VfaW5kZXggIT0gc3RhdGljX2Nhc3Q8aW50Pihtc2ctPmlmYV9pbmRleCkpIHsKKyAgICAgIGFkZHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGlmYWRkcnNfc3RvcmFnZSo+KGFkZHItPmlmYS5pZmFfbmV4dCk7CisgICAgfQorICAgIC8vIElmIHRoaXMgaXMgYW4gdW5rbm93biBpbnRlcmZhY2UsIGlnbm9yZSB3aGF0ZXZlciB3ZSdyZSBiZWluZyB0b2xkIGFib3V0IGl0LgorICAgIGlmIChhZGRyID09IG51bGxwdHIpIHJldHVybjsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBpZmFkZHIgZW50cnkgYW5kIGNvcHkgd2hhdCB3ZSBhbHJlYWR5IGtub3cuCisgICAgaWZhZGRyc19zdG9yYWdlKiBuZXdfYWRkciA9IG5ldyBpZmFkZHJzX3N0b3JhZ2Uob3V0KTsKKyAgICAvLyBXZSBjYW4ganVzdCBjb3B5IHRoZSBuYW1lIHJhdGhlciB0aGFuIGxvb2sgZm9yIElGQV9MQUJFTC4KKyAgICBzdHJjcHkobmV3X2FkZHItPm5hbWUsIGFkZHItPm5hbWUpOworICAgIG5ld19hZGRyLT5pZmEuaWZhX25hbWUgPSBuZXdfYWRkci0+bmFtZTsKKyAgICBuZXdfYWRkci0+aWZhLmlmYV9mbGFncyA9IGFkZHItPmlmYS5pZmFfZmxhZ3M7CisgICAgbmV3X2FkZHItPmludGVyZmFjZV9pbmRleCA9IGFkZHItPmludGVyZmFjZV9pbmRleDsKKworICAgIC8vIEdvIHRocm91Z2ggdGhlIHZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiBhbmQgZmluZCB0aGUgYWRkcmVzcworICAgIC8vIGFuZCBhbnkgYnJvYWRjYXN0L2Rlc3RpbmF0aW9uIGFkZHJlc3MuCisgICAgcnRhdHRyKiBydGEgPSBJRkFfUlRBKG1zZyk7CisgICAgc2l6ZV90IHJ0YV9sZW4gPSBJRkFfUEFZTE9BRChoZHIpOworICAgIHdoaWxlIChSVEFfT0socnRhLCBydGFfbGVuKSkgeworICAgICAgaWYgKHJ0YS0+cnRhX3R5cGUgPT0gSUZBX0FERFJFU1MpIHsKKyAgICAgICAgaWYgKG1zZy0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUIHx8IG1zZy0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICAgIG5ld19hZGRyLT5TZXRBZGRyZXNzKG1zZy0+aWZhX2ZhbWlseSwgUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSk7CisgICAgICAgICAgbmV3X2FkZHItPlNldE5ldG1hc2sobXNnLT5pZmFfZmFtaWx5LCBtc2ctPmlmYV9wcmVmaXhsZW4pOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHJ0YS0+cnRhX3R5cGUgPT0gSUZBX0JST0FEQ0FTVCkgeworICAgICAgICBpZiAobXNnLT5pZmFfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgICAgICBuZXdfYWRkci0+U2V0QnJvYWRjYXN0QWRkcmVzcyhtc2ctPmlmYV9mYW1pbHksIFJUQV9EQVRBKHJ0YSksIFJUQV9QQVlMT0FEKHJ0YSkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHJ0YS0+cnRhX3R5cGUgPT0gSUZBX0xPQ0FMKSB7CisgICAgICAgIGlmIChtc2ctPmlmYV9mYW1pbHkgPT0gQUZfSU5FVCB8fCBtc2ctPmlmYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICBuZXdfYWRkci0+U2V0TG9jYWxBZGRyZXNzKG1zZy0+aWZhX2ZhbWlseSwgUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJ0YSA9IFJUQV9ORVhUKHJ0YSwgcnRhX2xlbik7CisgICAgfQorICB9Cit9CisKK2ludCBnZXRpZmFkZHJzKGlmYWRkcnMqKiBvdXQpIHsKKyAgLy8gV2UgY29uc3RydWN0IHRoZSByZXN1bHQgZGlyZWN0bHkgaW50byBgb3V0YCwgc28gdGVybWluYXRlIHRoZSBsaXN0LgorICAqb3V0ID0gbnVsbHB0cjsKKworICAvLyBPcGVuIHRoZSBuZXRsaW5rIHNvY2tldCBhbmQgYXNrIGZvciBhbGwgdGhlIGxpbmtzIGFuZCBhZGRyZXNzZXMuCisgIE5ldGxpbmtDb25uZWN0aW9uIG5jOworICBib29sIG9rYXkgPSBuYy5TZW5kUmVxdWVzdChSVE1fR0VUTElOSykgJiYgbmMuUmVhZFJlc3BvbnNlcyhfX2dldGlmYWRkcnNfY2FsbGJhY2ssIG91dCkgJiYKKyAgICAgICAgICAgICAgbmMuU2VuZFJlcXVlc3QoUlRNX0dFVEFERFIpICYmIG5jLlJlYWRSZXNwb25zZXMoX19nZXRpZmFkZHJzX2NhbGxiYWNrLCBvdXQpOworICBpZiAoIW9rYXkpIHsKKyAgICBmcmVlaWZhZGRycygqb3V0KTsKKyAgICAvLyBFbnN1cmUgdGhhdCBjYWxsZXJzIGNyYXNoIGlmIHRoZXkgZm9yZ2V0IHRvIGNoZWNrIGZvciBzdWNjZXNzLgorICAgICpvdXQgPSBudWxscHRyOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCit2b2lkIGZyZWVpZmFkZHJzKGlmYWRkcnMqIGxpc3QpIHsKKyAgd2hpbGUgKGxpc3QgIT0gbnVsbHB0cikgeworICAgIGlmYWRkcnMqIGN1cnJlbnQgPSBsaXN0OworICAgIGxpc3QgPSBsaXN0LT5pZmFfbmV4dDsKKyAgICBmcmVlKGN1cnJlbnQpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Jpb25pYy9pZmFkZHJzLmggYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Jpb25pYy9pZmFkZHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhYWJiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL2lmYWRkcnMuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisvKioKKyAqIEBmaWxlIGlmYWRkcnMuaAorICogQGJyaWVmIEFjY2VzcyB0byBuZXR3b3JrIGludGVyZmFjZSBhZGRyZXNzZXMuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyoqCisgKiBSZXR1cm5lZCBieSBnZXRpZmFkZHJzKCkgYW5kIGZyZWVkIGJ5IGZyZWVpZmFkZHJzKCkuCisgKi8KK3N0cnVjdCBpZmFkZHJzIHsKKyAgLyoqIFBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlua2VkIGxpc3QuICovCisgIHN0cnVjdCBpZmFkZHJzKiBpZmFfbmV4dDsKKworICAvKiogSW50ZXJmYWNlIG5hbWUuICovCisgIGNoYXIqIGlmYV9uYW1lOworICAvKiogSW50ZXJmYWNlIGZsYWdzIChsaWtlIGBTSU9DR0lGRkxBR1NgKS4gKi8KKyAgdW5zaWduZWQgaW50IGlmYV9mbGFnczsKKyAgLyoqIEludGVyZmFjZSBhZGRyZXNzLiAqLworICBzdHJ1Y3Qgc29ja2FkZHIqIGlmYV9hZGRyOworICAvKiogSW50ZXJmYWNlIG5ldG1hc2suICovCisgIHN0cnVjdCBzb2NrYWRkciogaWZhX25ldG1hc2s7CisKKyAgdW5pb24geworICAgIC8qKiBJbnRlcmZhY2UgYnJvYWRjYXN0IGFkZHJlc3MgKGlmIElGRl9CUk9BRENBU1QgaXMgc2V0KS4gKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIqIGlmdV9icm9hZGFkZHI7CisgICAgLyoqIEludGVyZmFjZSBkZXN0aW5hdGlvbiBhZGRyZXNzIChpZiBJRkZfUE9JTlRPUE9JTlQgaXMgc2V0KS4gKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIqIGlmdV9kc3RhZGRyOworICB9IGlmYV9pZnU7CisKKyAgLyoqIFVudXNlZC4gKi8KKyAgdm9pZCogaWZhX2RhdGE7Cit9OworCisvKiogU3lub255bSBmb3IgYGlmYV9pZnUuaWZ1X2Jyb2FkYWRkcmAgaW4gYHN0cnVjdCBpZmFkZHJzYC4gKi8KKyNkZWZpbmUgaWZhX2Jyb2FkYWRkciBpZmFfaWZ1LmlmdV9icm9hZGFkZHIKKy8qKiBTeW5vbnltIGZvciBgaWZhX2lmdS5pZnVfZHN0YWRkcmAgaW4gYHN0cnVjdCBpZmFkZHJzYC4gKi8KKyNkZWZpbmUgaWZhX2RzdGFkZHIgaWZhX2lmdS5pZnVfZHN0YWRkcgorCisvKioKKyAqIFtnZXRpZmFkZHJzKDMpXShodHRwOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjMvZ2V0aWZhZGRycy4zLmh0bWwpIGNyZWF0ZXMgYSBsaW5rZWQgbGlzdAorICogb2YgYHN0cnVjdCBpZmFkZHJzYC4gVGhlIGxpc3QgbXVzdCBiZSBmcmVlZCBieSBmcmVlaWZhZGRycygpLgorICoKKyAqIFJldHVybnMgMCBhbmQgc3RvcmVzIHRoZSBsaXN0IGluIGAqX19saXN0X3B0cmAgb24gc3VjY2VzcywKKyAqIGFuZCByZXR1cm5zIC0xIGFuZCBzZXRzIGBlcnJub2Agb24gZmFpbHVyZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI0LgorICovCitpbnQgZ2V0aWZhZGRycyhzdHJ1Y3QgaWZhZGRycyoqIF9fbGlzdF9wdHIpIF9fSU5UUk9EVUNFRF9JTigyNCk7CisKKy8qKgorICogW2ZyZWVpZmFkZHJzKDMpXShodHRwOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjMvZnJlZWlmYWRkcnMuMy5odG1sKSBmcmVlcyBhIGxpbmtlZCBsaXN0CisgKiBvZiBgc3RydWN0IGlmYWRkcnNgIHJldHVybmVkIGJ5IGdldGlmYWRkcnMoKS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI0LgorICovCit2b2lkIGZyZWVpZmFkZHJzKHN0cnVjdCBpZmFkZHJzKiBfX3B0cikgX19JTlRST0RVQ0VEX0lOKDI0KTsKKworX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL25ldF9pZi5jcHAgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Jpb25pYy9uZXRfaWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWM5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Jpb25pYy9uZXRfaWYuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8aWZhZGRycy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAicHJpdmF0ZS9FcnJub1Jlc3RvcmVyLmgiCisKKyNpbmNsdWRlICJiaW9uaWNfbmV0bGluay5oIgorCitjaGFyKiBpZl9pbmRleHRvbmFtZSh1bnNpZ25lZCBpZmluZGV4LCBjaGFyKiBpZm5hbWUpIHsKKyAgaW50IHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTXxTT0NLX0NMT0VYRUMsIDApOworICBpZiAocyA9PSAtMSkgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RydWN0IGlmcmVxIGlmcjsKKyAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKyAgaWZyLmlmcl9pZmluZGV4ID0gaWZpbmRleDsKKworICBpbnQgcmMgPSBpb2N0bChzLCBTSU9DR0lGTkFNRSwgJmlmcik7CisgIEVycm5vUmVzdG9yZXIgZXJybm9fcmVzdG9yZXI7CisgIGNsb3NlKHMpOworICByZXR1cm4gKHJjID09IC0xKSA/IG51bGxwdHIgOiBzdHJuY3B5KGlmbmFtZSwgaWZyLmlmcl9uYW1lLCBJRk5BTVNJWik7Cit9CisKK3Vuc2lnbmVkIGlmX25hbWV0b2luZGV4KGNvbnN0IGNoYXIqIGlmbmFtZSkgeworICBpbnQgcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNfFNPQ0tfQ0xPRVhFQywgMCk7CisgIGlmIChzID09IC0xKSByZXR1cm4gMDsKKworICBzdHJ1Y3QgaWZyZXEgaWZyOworICBtZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworICBzdHJuY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisgIGlmci5pZnJfbmFtZVtJRk5BTVNJWiAtIDFdID0gMDsKKworICBpbnQgcmMgPSBpb2N0bChzLCBTSU9DR0lGSU5ERVgsICZpZnIpOworICBFcnJub1Jlc3RvcmVyIGVycm5vX3Jlc3RvcmVyOworICBjbG9zZShzKTsKKyAgcmV0dXJuIChyYyA9PSAtMSkgPyAwIDogaWZyLmlmcl9pZmluZGV4OworfQorCitzdHJ1Y3QgaWZfbGlzdCB7CisgIGlmX2xpc3QqIG5leHQ7CisgIHN0cnVjdCBpZl9uYW1laW5kZXggZGF0YTsKKworICBleHBsaWNpdCBpZl9saXN0KGlmX2xpc3QqKiBsaXN0KSB7CisgICAgLy8gcHVzaF9mcm9udCBvbnRvIGBsaXN0YC4KKyAgICBuZXh0ID0gKmxpc3Q7CisgICAgKmxpc3QgPSB0aGlzOworICB9CisKKyAgc3RhdGljIHZvaWQgRnJlZShpZl9saXN0KiBsaXN0LCBib29sIG5hbWVzX3RvbykgeworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBpZl9saXN0KiBpdCA9IGxpc3Q7CisgICAgICBsaXN0ID0gaXQtPm5leHQ7CisgICAgICBpZiAobmFtZXNfdG9vKSBmcmVlKGl0LT5kYXRhLmlmX25hbWUpOworICAgICAgZnJlZShpdCk7CisgICAgfQorICB9Cit9OworCitzdGF0aWMgdm9pZCBfX2lmX25hbWVpbmRleF9jYWxsYmFjayh2b2lkKiBjb250ZXh0LCBubG1zZ2hkciogaGRyKSB7CisgIGlmX2xpc3QqKiBsaXN0ID0gcmVpbnRlcnByZXRfY2FzdDxpZl9saXN0Kio+KGNvbnRleHQpOworICBpZiAoaGRyLT5ubG1zZ190eXBlID09IFJUTV9ORVdMSU5LKSB7CisgICAgaWZpbmZvbXNnKiBpZmkgPSByZWludGVycHJldF9jYXN0PGlmaW5mb21zZyo+KE5MTVNHX0RBVEEoaGRyKSk7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZW50cnkgYW5kIHNldCB0aGUgaW50ZXJmYWNlIGluZGV4LgorICAgIGlmX2xpc3QqIG5ld19saW5rID0gbmV3IGlmX2xpc3QobGlzdCk7CisgICAgbmV3X2xpbmstPmRhdGEuaWZfaW5kZXggPSBpZmktPmlmaV9pbmRleDsKKworICAgIC8vIEdvIHRocm91Z2ggdGhlIHZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiBhbmQgZmluZCB0aGUgbmFtZS4KKyAgICBydGF0dHIqIHJ0YSA9IElGTEFfUlRBKGlmaSk7CisgICAgc2l6ZV90IHJ0YV9sZW4gPSBJRkxBX1BBWUxPQUQoaGRyKTsKKyAgICB3aGlsZSAoUlRBX09LKHJ0YSwgcnRhX2xlbikpIHsKKyAgICAgIGlmIChydGEtPnJ0YV90eXBlID09IElGTEFfSUZOQU1FKSB7CisgICAgICAgIG5ld19saW5rLT5kYXRhLmlmX25hbWUgPSBzdHJuZHVwKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFJUQV9EQVRBKHJ0YSkpLCBSVEFfUEFZTE9BRChydGEpKTsKKyAgICAgIH0KKyAgICAgIHJ0YSA9IFJUQV9ORVhUKHJ0YSwgcnRhX2xlbik7CisgICAgfQorICB9Cit9CisKK3N0cnVjdCBpZl9uYW1laW5kZXgqIGlmX25hbWVpbmRleCgpIHsKKyAgaWZfbGlzdCogbGlzdCA9IG51bGxwdHI7CisKKyAgLy8gT3BlbiB0aGUgbmV0bGluayBzb2NrZXQgYW5kIGFzayBmb3IgYWxsIHRoZSBsaW5rczsKKyAgTmV0bGlua0Nvbm5lY3Rpb24gbmM7CisgIGJvb2wgb2theSA9IG5jLlNlbmRSZXF1ZXN0KFJUTV9HRVRMSU5LKSAmJiBuYy5SZWFkUmVzcG9uc2VzKF9faWZfbmFtZWluZGV4X2NhbGxiYWNrLCAmbGlzdCk7CisgIGlmICghb2theSkgeworICAgIGlmX2xpc3Q6OkZyZWUobGlzdCwgdHJ1ZSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBDb3VudCB0aGUgaW50ZXJmYWNlcy4KKyAgc2l6ZV90IGludGVyZmFjZV9jb3VudCA9IDA7CisgIGZvciAoaWZfbGlzdCogaXQgPSBsaXN0OyBpdCAhPSBudWxscHRyOyBpdCA9IGl0LT5uZXh0KSB7CisgICAgKytpbnRlcmZhY2VfY291bnQ7CisgIH0KKworICAvLyBCdWlsZCB0aGUgYXJyYXkgUE9TSVggcmVxdWlyZXMgdXMgdG8gcmV0dXJuLgorICBzdHJ1Y3QgaWZfbmFtZWluZGV4KiByZXN1bHQgPSBuZXcgc3RydWN0IGlmX25hbWVpbmRleFtpbnRlcmZhY2VfY291bnQgKyAxXTsKKyAgaWYgKHJlc3VsdCkgeworICAgIHN0cnVjdCBpZl9uYW1laW5kZXgqIG91dCA9IHJlc3VsdDsKKyAgICBmb3IgKGlmX2xpc3QqIGl0ID0gbGlzdDsgaXQgIT0gbnVsbHB0cjsgaXQgPSBpdC0+bmV4dCkgeworICAgICAgb3V0LT5pZl9pbmRleCA9IGl0LT5kYXRhLmlmX2luZGV4OworICAgICAgb3V0LT5pZl9uYW1lID0gaXQtPmRhdGEuaWZfbmFtZTsKKyAgICAgICsrb3V0OworICAgIH0KKyAgICBvdXQtPmlmX2luZGV4ID0gMDsKKyAgICBvdXQtPmlmX25hbWUgPSBudWxscHRyOworICB9CisKKyAgLy8gRnJlZSB0ZW1wb3Jhcnkgc3RvcmFnZS4KKyAgaWZfbGlzdDo6RnJlZShsaXN0LCBmYWxzZSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBpZl9mcmVlbmFtZWluZGV4KHN0cnVjdCBpZl9uYW1laW5kZXgqIGFycmF5KSB7CisgIGlmIChhcnJheSA9PSBudWxscHRyKSByZXR1cm47CisKKyAgc3RydWN0IGlmX25hbWVpbmRleCogcHRyID0gYXJyYXk7CisgIHdoaWxlIChwdHItPmlmX2luZGV4ICE9IDAgfHwgcHRyLT5pZl9uYW1lICE9IG51bGxwdHIpIHsKKyAgICBmcmVlKHB0ci0+aWZfbmFtZSk7CisgICAgKytwdHI7CisgIH0KKworICBkZWxldGVbXSBhcnJheTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL3ByaXZhdGUvRXJybm9SZXN0b3Jlci5oIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvcHJpdmF0ZS9FcnJub1Jlc3RvcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlMTE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL3ByaXZhdGUvRXJybm9SZXN0b3Jlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJiaW9uaWNfbWFjcm9zLmgiCisKK2NsYXNzIEVycm5vUmVzdG9yZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXJybm9SZXN0b3JlcigpIDogc2F2ZWRfZXJybm9fKGVycm5vKSB7CisgIH0KKworICB+RXJybm9SZXN0b3JlcigpIHsKKyAgICBlcnJubyA9IHNhdmVkX2Vycm5vXzsKKyAgfQorCisgIHZvaWQgb3ZlcnJpZGUoaW50IG5ld19lcnJubykgeworICAgIHNhdmVkX2Vycm5vXyA9IG5ld19lcnJubzsKKyAgfQorCisgcHJpdmF0ZToKKyAgaW50IHNhdmVkX2Vycm5vXzsKKworICBCSU9OSUNfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEVycm5vUmVzdG9yZXIpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL3ByaXZhdGUvYmlvbmljX21hY3Jvcy5oIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9iaW9uaWMvcHJpdmF0ZS9iaW9uaWNfbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwMGUzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYmlvbmljL3ByaXZhdGUvYmlvbmljX21hY3Jvcy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEJJT05JQ19ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICAgICAgICAgXAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlCisKKyNkZWZpbmUgQklPTklDX0RJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhUeXBlTmFtZSkgXAorICBUeXBlTmFtZSgpID0gZGVsZXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJJT05JQ19ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpCisKKyNkZWZpbmUgQklPTklDX1JPVU5EX1VQX1BPV0VSX09GXzIodmFsdWUpIFwKKyAgKChzaXplb2YodmFsdWUpID09IDgpIFwKKyAgICA/ICgxVUwgPDwgKDY0IC0gX19idWlsdGluX2Nsemwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4odmFsdWUpKSkpIFwKKyAgICA6ICgxVUwgPDwgKDMyIC0gX19idWlsdGluX2NseihzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHZhbHVlKSkpKSkKKworc3RhdGljIGNvbnN0ZXhwciB1aW50cHRyX3QgYWxpZ25fZG93bih1aW50cHRyX3QgcCwgc2l6ZV90IGFsaWduKSB7CisgIHJldHVybiBwICYgfihhbGlnbiAtIDEpOworfQorCitzdGF0aWMgY29uc3RleHByIHVpbnRwdHJfdCBhbGlnbl91cCh1aW50cHRyX3QgcCwgc2l6ZV90IGFsaWduKSB7CisgIHJldHVybiAocCArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBUKiBhbGlnbl9kb3duKFQqIHAsIHNpemVfdCBhbGlnbikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oYWxpZ25fZG93bihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocCksIGFsaWduKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBUKiBhbGlnbl91cChUKiBwLCBzaXplX3QgYWxpZ24pIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGFsaWduX3VwKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwKSwgYWxpZ24pKTsKK30KKworI2lmIGRlZmluZWQoX19hcm1fXykKKy8vIERvIG5vdCBlbWl0IGFueXRoaW5nIGZvciBhcm0sIGNsYW5nIGRvZXMgbm90IGFsbG93IGVtaXRpbmcgYW4gYXJtIHVud2luZAorLy8gZGlyZWN0aXZlLgorLy8gI2RlZmluZSBCSU9OSUNfU1RPUF9VTldJTkQgYXNtIHZvbGF0aWxlKCIuY2FudHVud2luZCIpCisjZGVmaW5lIEJJT05JQ19TVE9QX1VOV0lORAorI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyNkZWZpbmUgQklPTklDX1NUT1BfVU5XSU5EIGFzbSB2b2xhdGlsZSgiLmNmaV91bmRlZmluZWQgeDMwIikKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIEJJT05JQ19TVE9QX1VOV0lORCBhc20gdm9sYXRpbGUoIi5jZmlfdW5kZWZpbmVkIFwlZWlwIikKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKyNkZWZpbmUgQklPTklDX1NUT1BfVU5XSU5EIGFzbSB2b2xhdGlsZSgiLmNmaV91bmRlZmluZWQgXCVyaXAiKQorI2VsaWYgZGVmaW5lZCAoX19taXBzX18pCisjZGVmaW5lIEJJT05JQ19TVE9QX1VOV0lORCBhc20gdm9sYXRpbGUoIi5jZmlfdW5kZWZpbmVkICRyYSIpCisjZW5kaWYKKworLy8gVGhlIGFycmF5c2l6ZShhcnIpIG1hY3JvIHJldHVybnMgdGhlICMgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXkgYXJyLgorLy8gVGhlIGV4cHJlc3Npb24gaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQsIGFuZCB0aGVyZWZvcmUgY2FuIGJlCisvLyB1c2VkIGluIGRlZmluaW5nIG5ldyBhcnJheXMsIGZvciBleGFtcGxlLiAgSWYgeW91IHVzZSBhcnJheXNpemUgb24KKy8vIGEgcG9pbnRlciBieSBtaXN0YWtlLCB5b3Ugd2lsbCBnZXQgYSBjb21waWxlLXRpbWUgZXJyb3IuCisvLworLy8gT25lIGNhdmVhdCBpcyB0aGF0IGFycmF5c2l6ZSgpIGRvZXNuJ3QgYWNjZXB0IGFueSBhcnJheSBvZiBhbgorLy8gYW5vbnltb3VzIHR5cGUgb3IgYSB0eXBlIGRlZmluZWQgaW5zaWRlIGEgZnVuY3Rpb24uCisvLworLy8gVGhpcyB0ZW1wbGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpcyB1c2VkIGluIGRlZmluaW5nIGFycmF5c2l6ZS4KKy8vIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb24gZG9lc24ndCBuZWVkIGFuIGltcGxlbWVudGF0aW9uLCBhcyB3ZSBvbmx5CisvLyB1c2UgaXRzIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitjaGFyICgmQXJyYXlTaXplSGVscGVyKFQgKCZhcnJheSlbTl0pKVtOXTsgIC8vIE5PTElOVChyZWFkYWJpbGl0eS9jYXN0aW5nKQorCisjZGVmaW5lIGFycmF5c2l6ZShhcnJheSkgKHNpemVvZihBcnJheVNpemVIZWxwZXIoYXJyYXkpKSkKKworLy8gVXNlZCB0byBpbmZvcm0gY2xhbmcncyAtV2ltcGxpY2l0LWZhbGx0aHJvdWdoIHRoYXQgYSBmYWxsdGhyb3VnaCBpcyBpbnRlbmRlZC4gVGhlcmUncyBubyB3YXkgdG8KKy8vIHNpbGVuY2UgKG9yIGVuYWJsZSwgYXBwYXJlbnRseSkgLVdpbXBsaWNpdC1mYWxsdGhyb3VnaCBpbiBDIHlldC4KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBfX0JJT05JQ19GQUxMVEhST1VHSCBbW2NsYW5nOjpmYWxsdGhyb3VnaF1dCisjZWxzZQorI2RlZmluZSBfX0JJT05JQ19GQUxMVEhST1VHSAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvYmFsdC9hbmRyb2lkX3dlYmFwaV9leHRlbnNpb24uZ3lwIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb2JhbHQvYW5kcm9pZF93ZWJhcGlfZXh0ZW5zaW9uLmd5cAppbmRleCAwYzk1MTFlLi5mM2ZkMmUwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvYmFsdC9hbmRyb2lkX3dlYmFwaV9leHRlbnNpb24uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvY29iYWx0L2FuZHJvaWRfd2ViYXBpX2V4dGVuc2lvbi5neXAKQEAgLTI0LDkgKzI0LDkgQEAKICAgICAgICAgJ2ZlZWRiYWNrX3NlcnZpY2UuY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc2NyaXB0L3NjcmlwdC5neXA6c2NyaXB0JywKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICBdLAogICAgIH0sCiAgIF0sCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvYmFsdC9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb2JhbHQvY29uZmlndXJhdGlvbi5weQppbmRleCA4YmYwOWUyLi4zMTJlY2I3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvYmFsdC9jb25maWd1cmF0aW9uLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvY29iYWx0L2NvbmZpZ3VyYXRpb24ucHkKQEAgLTIyLDExICsyMiw2IEBACiBjbGFzcyBDb2JhbHRBbmRyb2lkQ29uZmlndXJhdGlvbihjb2JhbHRfY29uZmlndXJhdGlvbi5Db2JhbHRDb25maWd1cmF0aW9uKToKICAgIiIiU3RhcmJvYXJkIEFuZHJvaWQgQ29iYWx0IHNoYXJlZCBjb25maWd1cmF0aW9uLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybV9jb25maWd1cmF0aW9uLCBhcHBsaWNhdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgYXBwbGljYXRpb25fZGlyZWN0b3J5KToKLSAgICBzdXBlcihDb2JhbHRBbmRyb2lkQ29uZmlndXJhdGlvbiwgc2VsZikuX19pbml0X18oCi0gICAgICAgIHBsYXRmb3JtX2NvbmZpZ3VyYXRpb24sIGFwcGxpY2F0aW9uX25hbWUsIGFwcGxpY2F0aW9uX2RpcmVjdG9yeSkKLQogICBkZWYgR2V0UG9zdEluY2x1ZGVzKHNlbGYpOgogICAgICMgSWYgdGhlcmUgaXNuJ3QgYSBjb25maWd1cmF0aW9uLmd5cGkgZm91bmQgaW4gdGhlIHVzdWFsIHBsYWNlLCB3ZSdsbAogICAgICMgc3VwcGxlbWVudCB3aXRoIG91ciBzaGFyZWQgaW1wbGVtZW50YXRpb24uCkBAIC00Niw3ICs0MSw3IEBACiAKICAgZGVmIEdldFRlc3RGaWx0ZXJzKHNlbGYpOgogICAgIGZpbHRlcnMgPSBzdXBlcihDb2JhbHRBbmRyb2lkQ29uZmlndXJhdGlvbiwgc2VsZikuR2V0VGVzdEZpbHRlcnMoKQotICAgIGZvciB0YXJnZXQsIHRlc3RzIGluIHNlbGYuX0ZBSUxJTkdfVEVTVFMuaXRlcml0ZW1zKCk6CisgICAgZm9yIHRhcmdldCwgdGVzdHMgaW4gc2VsZi5fX0ZJTFRFUkVEX1RFU1RTLml0ZXJpdGVtcygpOgogICAgICAgZmlsdGVycy5leHRlbmQodGVzdF9maWx0ZXIuVGVzdEZpbHRlcih0YXJnZXQsIHRlc3QpIGZvciB0ZXN0IGluIHRlc3RzKQogICAgIHJldHVybiBmaWx0ZXJzCiAKQEAgLTU4LDE0ICs1MywxMCBAQAogICAgIH0KIAogICAjIEEgbWFwIG9mIGZhaWxpbmcgb3IgY3Jhc2hpbmcgdGVzdHMgcGVyIHRhcmdldC4KLSAgX0ZBSUxJTkdfVEVTVFMgPSB7CisgIF9fRklMVEVSRURfVEVTVFMgPSB7CiAgICAgICAnbmV0X3VuaXR0ZXN0cyc6IFsKLSAgICAgICAgICAnRGlhbEh0dHBTZXJ2ZXJUZXN0LkFsbE90aGVyUmVxdWVzdHMnLAotICAgICAgICAgICdEaWFsSHR0cFNlcnZlclRlc3QuQ2FsbGJhY2tFeGNlcHRpb25JblNlcnZpY2VIYW5kbGVyJywKLSAgICAgICAgICAnRGlhbEh0dHBTZXJ2ZXJUZXN0LkNhbGxiYWNrSGFuZGxlUmVxdWVzdFJldHVybnNGYWxzZScsCi0gICAgICAgICAgJ0RpYWxIdHRwU2VydmVyVGVzdC5DYWxsYmFja05vcm1hbFRlc3QnLAotICAgICAgICAgICdEaWFsSHR0cFNlcnZlclRlc3QuQ3VycmVudFJ1bm5pbmdBcHBSZWRpcmVjdCcsCi0gICAgICAgICAgJ0RpYWxIdHRwU2VydmVyVGVzdC5TZW5kTWFuaWZlc3QnLAorICAgICAgICAgICMgVGhpcyB0ZXN0IGZhaWxzIG9uIG11bHRpcGxlIHBsYXRmb3JtcyB3aXRoIG91ciBjdXJyZW50IHZlcnNpb24gb2YKKyAgICAgICAgICAjIG5ldCBsaWJyYXJ5LCBhbmQgd2lsbCBiZSBmaXhlZCB3aGVuIG5ldCBpcyByZWJhc2VkLgogICAgICAgICAgICdIb3N0UmVzb2x2ZXJJbXBsRG5zVGVzdC5EbnNUYXNrVW5zcGVjJywKICAgICAgIF0sCiAgICAgICAncmVuZGVyZXJfdGVzdCc6IFsKQEAgLTc1LDQgKzY2LDggQEAKICAgICAgICAgICAjIHJ1biBpdCBvbiBBbmRyb2lkIHBsYXRmb3Jtcy4KICAgICAgICAgICAnU3RyZXNzVGVzdC5Ub29NYW55VGV4dHVyZXMnLAogICAgICAgXSwKKyAgICAgICd3ZWJfcGxhdGZvcm1fdGVzdHMnOiBbCisgICAgICAgICAgIyBUZXN0IG5hbWU6IGNvbnRlbnRfc2VjdXJpdHlfcG9saWN5X21lZGlhX3NyY19tZWRpYV9zcmNfYWxsb3dlZF9odG1sCisgICAgICAgICAgJ2NzcC9XZWJQbGF0Zm9ybVRlc3QuUnVuLzYzJywKKyAgICAgIF0sCiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLnB5CmluZGV4IDVjNzgzNjcuLmUzYWYwNjcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weQpAQCAtMjQyLDM4ICsyNDIsMjEgQEAKIAogICBkZWYgR2V0VGVzdEZpbHRlcnMoc2VsZik6CiAgICAgZmlsdGVycyA9IHN1cGVyKEFuZHJvaWRDb25maWd1cmF0aW9uLCBzZWxmKS5HZXRUZXN0RmlsdGVycygpCi0gICAgZm9yIHRhcmdldCwgdGVzdHMgaW4gc2VsZi5fRklMVEVSRURfVEVTVFMuaXRlcml0ZW1zKCk6CisgICAgZm9yIHRhcmdldCwgdGVzdHMgaW4gc2VsZi5fX0ZJTFRFUkVEX1RFU1RTLml0ZXJpdGVtcygpOgogICAgICAgZmlsdGVycy5leHRlbmQodGVzdF9maWx0ZXIuVGVzdEZpbHRlcih0YXJnZXQsIHRlc3QpIGZvciB0ZXN0IGluIHRlc3RzKQogICAgIHJldHVybiBmaWx0ZXJzCiAKICAgIyBBIG1hcCBvZiBmYWlsaW5nIG9yIGNyYXNoaW5nIHRlc3RzIHBlciB0YXJnZXQuCi0gIF9GSUxURVJFRF9URVNUUyA9IHsKLSAgICAgICducGxiJzogWwotICAgICAgICAgICdTYkF1ZGlvU2lua1Rlc3QuQWxsRnJhbWVzQ29uc3VtZWQnLAotICAgICAgICAgICdTYkF1ZGlvU2lua1Rlc3QuU29tZUZyYW1lc0NvbnN1bWVkJywKLSAgICAgICAgICAnU2JBdWRpb1NpbmtUZXN0LlVuZGVyZmxvdycsCi0gICAgICAgICAgJ1NiU29ja2V0QWRkcmVzc1R5cGVzL1NiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzc1Rlc3QnCi0gICAgICAgICAgJy5TdW5ueURheURlc3RpbmF0aW9uLzAnLAotICAgICAgICAgICdTYlNvY2tldEFkZHJlc3NUeXBlcy9TYlNvY2tldEdldEludGVyZmFjZUFkZHJlc3NUZXN0JwotICAgICAgICAgICcuU3VubnlEYXlTb3VyY2VGb3JEZXN0aW5hdGlvbi8wJywKLSAgICAgICAgICAnU2JTb2NrZXRBZGRyZXNzVHlwZXMvU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzVGVzdCcKLSAgICAgICAgICAnLlN1bm55RGF5U291cmNlRm9yRGVzdGluYXRpb24vMScsCi0gICAgICAgICAgJ1NiU29ja2V0QWRkcmVzc1R5cGVzL1NiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzc1Rlc3QnCi0gICAgICAgICAgJy5TdW5ueURheVNvdXJjZU5vdExvb3BiYWNrLzAnLAotICAgICAgICAgICdTYlNvY2tldEJpbmRUZXN0LlN1bm55RGF5TG9jYWxJbnRlcmZhY2UnLAotICAgICAgICAgICdTYlNvY2tldEdldExvY2FsQWRkcmVzc1Rlc3QuU3VubnlEYXlCb3VuZFNwZWNpZmllZCcsCi0gICAgICAgICAgJ1NwZWVjaFJlY29nbml6ZXJUZXN0LlN0YXJ0SXNDYWxsZWRNdWx0aXBsZVRpbWVzJywKLSAgICAgICAgICAnU3BlZWNoUmVjb2duaXplclRlc3QuU3RhcnRSZWNvZ25pemVyV2l0aDEwTWF4QWx0ZXJuYXRpdmVzJywKLSAgICAgICAgICAnU3BlZWNoUmVjb2duaXplclRlc3QuU3RhcnRSZWNvZ25pemVyV2l0aENvbnRpbnVvdXNSZWNvZ25pdGlvbicsCi0gICAgICAgICAgJ1NwZWVjaFJlY29nbml6ZXJUZXN0LlN0YXJ0UmVjb2duaXplcldpdGhJbnRlcmltUmVzdWx0cycsCi0gICAgICAgICAgJ1NwZWVjaFJlY29nbml6ZXJUZXN0LlN0YXJ0VGVzdFN1bm55RGF5JywKLSAgICAgIF0sCisgIF9fRklMVEVSRURfVEVTVFMgPSB7CiAgICAgICAncGxheWVyX2ZpbHRlcl90ZXN0cyc6IFsKICAgICAgICAgICAnQXVkaW9EZWNvZGVyVGVzdHMvQXVkaW9EZWNvZGVyVGVzdC5FbmRPZlN0cmVhbVdpdGhvdXRBbnlJbnB1dC8wJywKKyAgICAgICAgICAnQXVkaW9EZWNvZGVyVGVzdHMvQXVkaW9EZWNvZGVyVGVzdC5NdWx0aXBsZUlucHV0cy8wJywKICAgICAgICAgICAnQXVkaW9EZWNvZGVyVGVzdHMvQXVkaW9EZWNvZGVyVGVzdC5SZXNldEJlZm9yZUlucHV0LzAnLAogICAgICAgICAgICdBdWRpb0RlY29kZXJUZXN0cy9BdWRpb0RlY29kZXJUZXN0LlNpbmdsZUlucHV0LzAnLAogICAgICAgICAgICdWaWRlb0RlY29kZXJUZXN0cy9WaWRlb0RlY29kZXJUZXN0LkRlY29kZUZ1bGxHT1AvMCcsCiAgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuRGVjb2RlRnVsbEdPUC8xJywKKyAgICAgICAgICAnVmlkZW9EZWNvZGVyVGVzdHMvVmlkZW9EZWNvZGVyVGVzdC5EZWNvZGVGdWxsR09QLzInLAorICAgICAgICAgICdWaWRlb0RlY29kZXJUZXN0cy9WaWRlb0RlY29kZXJUZXN0LkRlY29kZUZ1bGxHT1AvMycsCiAgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuRW5kT2ZTdHJlYW1XaXRob3V0QW55SW5wdXQvMCcsCiAgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuRW5kT2ZTdHJlYW1XaXRob3V0QW55SW5wdXQvMScsCiAgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuRW5kT2ZTdHJlYW1XaXRob3V0QW55SW5wdXQvMicsCkBAIC0yODQsNiArMjY3LDE2IEBACiAgICAgICAgICAgJy5HZXRDdXJyZW50RGVjb2RlVGFyZ2V0QmVmb3JlV3JpdGVJbnB1dEJ1ZmZlci8yJywKICAgICAgICAgICAnVmlkZW9EZWNvZGVyVGVzdHMvVmlkZW9EZWNvZGVyVGVzdC5Ib2xkRnJhbWVzVW50aWxGdWxsLzAnLAogICAgICAgICAgICdWaWRlb0RlY29kZXJUZXN0cy9WaWRlb0RlY29kZXJUZXN0LkhvbGRGcmFtZXNVbnRpbEZ1bGwvMScsCisgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuUmVzZXRCZWZvcmVJbnB1dC8wJywKKyAgICAgICAgICAnVmlkZW9EZWNvZGVyVGVzdHMvVmlkZW9EZWNvZGVyVGVzdC5SZXNldEJlZm9yZUlucHV0LzEnLAorICAgICAgICAgICdWaWRlb0RlY29kZXJUZXN0cy9WaWRlb0RlY29kZXJUZXN0LlJlc2V0QmVmb3JlSW5wdXQvMicsCisgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuUmVzZXRCZWZvcmVJbnB1dC8zJywKKyAgICAgICAgICAnVmlkZW9EZWNvZGVyVGVzdHMvVmlkZW9EZWNvZGVyVGVzdC5QcmVyb2xsLzAnLAorICAgICAgICAgICdWaWRlb0RlY29kZXJUZXN0cy9WaWRlb0RlY29kZXJUZXN0LlByZXJvbGwvMScsCisgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuU2luZ2xlSW5wdXQvMCcsCisgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuU2luZ2xlSW5wdXQvMScsCisgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuU2luZ2xlSW5wdXQvMicsCisgICAgICAgICAgJ1ZpZGVvRGVjb2RlclRlc3RzL1ZpZGVvRGVjb2RlclRlc3QuU2luZ2xlSW5wdXQvMycsCiAKICAgICAgICAgICAjIE9uIHNvbWUgcGxhdGZvcm1zLCBhbmQgZm9yIHNvbWUgZGVjb2RlcnMgKHN1Y2ggYXMgQVZDKSwgQW5kcm9pZAogICAgICAgICAgICMgcmV0dXJucyBNRURJQV9DT0RFQ19ERVFVRVVFX09VVFBVVF9BR0FJTl9MQVRFUiBmb3IgdGhlIHRlc3QncwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9sYXVuY2hlci5weSBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbGF1bmNoZXIucHkKaW5kZXggYmQ0MzMyMC4uZmRhMWU5OSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9sYXVuY2hlci5weQorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2xhdW5jaGVyLnB5CkBAIC0yODcsNyArMjg3LDcgQEAKIAogICAgICMgU2VuZCB0aGUgd2FrZXVwIGtleSB0byBlbnN1cmUgZGF5ZHJlYW0gaXNuJ3QgcnVubmluZywgb3RoZXJ3aXNlIEFjdGl2aXR5CiAgICAgIyBNYW5hZ2VyIG1heSBnZXQgaW4gYSBsb29wIHJ1bm5pbmcgdGhlIHRlc3Qgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KLSAgICBzZWxmLl9DaGVja0NhbGxBZGIoJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgJ0tFWV9XQUtFVVAnKQorICAgIHNlbGYuX0NoZWNrQ2FsbEFkYignc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCAnS0VZQ09ERV9XQUtFVVAnKQogCiAgICAgIyBHcmFudCBydW50aW1lIHBlcm1pc3Npb25zIHRvIGF2b2lkIHByb21wdHMgZHVyaW5nIHRlc3RpbmcuCiAgICAgZm9yIHBlcm1pc3Npb24gaW4gX1JVTlRJTUVfUEVSTUlTU0lPTlM6CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2NvZGVjX2JyaWRnZS5jYyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29kZWNfYnJpZGdlLmNjCmluZGV4IDRhYzcwYzAuLjUxYzM1ODYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29kZWNfYnJpZGdlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29kZWNfYnJpZGdlLmNjCkBAIC03NywxMCArNzcsNjggQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKK2V4dGVybiAiQyIgU0JfRVhQT1JUX1BMQVRGT1JNIHZvaWQKK0phdmFfZGV2X2NvYmFsdF9tZWRpYV9NZWRpYUNvZGVjQnJpZGdlX25hdGl2ZU9uTWVkaWFDb2RlY0Vycm9yKAorICAgIEpuaUVudkV4dCogZW52LAorICAgIGpvYmplY3QgdW51c2VkX3RoaXMsCisgICAgamxvbmcgbmF0aXZlX21lZGlhX2NvZGVjX2JyaWRnZSwKKyAgICBqYm9vbGVhbiBpc19yZWNvdmVyYWJsZSwKKyAgICBqYm9vbGVhbiBpc190cmFuc2llbnQsCisgICAganN0cmluZyBkaWFnbm9zdGljX2luZm8pIHsKKyAgTWVkaWFDb2RlY0JyaWRnZSogbWVkaWFfY29kZWNfYnJpZGdlID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFDb2RlY0JyaWRnZSo+KG5hdGl2ZV9tZWRpYV9jb2RlY19icmlkZ2UpOworICBTQl9EQ0hFQ0sobWVkaWFfY29kZWNfYnJpZGdlKTsKKyAgc3RkOjpzdHJpbmcgZGlhZ25vc3RpY19pbmZvX2luX3N0ciA9CisgICAgICBlbnYtPkdldFN0cmluZ1N0YW5kYXJkVVRGT3JBYm9ydChkaWFnbm9zdGljX2luZm8pOworICBtZWRpYV9jb2RlY19icmlkZ2UtPk9uTWVkaWFDb2RlY0Vycm9yKGlzX3JlY292ZXJhYmxlLCBpc190cmFuc2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ25vc3RpY19pbmZvX2luX3N0cik7Cit9CisKK2V4dGVybiAiQyIgU0JfRVhQT1JUX1BMQVRGT1JNIHZvaWQKK0phdmFfZGV2X2NvYmFsdF9tZWRpYV9NZWRpYUNvZGVjQnJpZGdlX25hdGl2ZU9uTWVkaWFDb2RlY0lucHV0QnVmZmVyQXZhaWxhYmxlKAorICAgIEpOSUVudiogZW52LAorICAgIGpvYmplY3QgdW51c2VkX3RoaXMsCisgICAgamxvbmcgbmF0aXZlX21lZGlhX2NvZGVjX2JyaWRnZSwKKyAgICBqaW50IGJ1ZmZlcl9pbmRleCkgeworICBNZWRpYUNvZGVjQnJpZGdlKiBtZWRpYV9jb2RlY19icmlkZ2UgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxNZWRpYUNvZGVjQnJpZGdlKj4obmF0aXZlX21lZGlhX2NvZGVjX2JyaWRnZSk7CisgIFNCX0RDSEVDSyhtZWRpYV9jb2RlY19icmlkZ2UpOworICBtZWRpYV9jb2RlY19icmlkZ2UtPk9uTWVkaWFDb2RlY0lucHV0QnVmZmVyQXZhaWxhYmxlKGJ1ZmZlcl9pbmRleCk7Cit9CisKK2V4dGVybiAiQyIgU0JfRVhQT1JUX1BMQVRGT1JNIHZvaWQKK0phdmFfZGV2X2NvYmFsdF9tZWRpYV9NZWRpYUNvZGVjQnJpZGdlX25hdGl2ZU9uTWVkaWFDb2RlY091dHB1dEJ1ZmZlckF2YWlsYWJsZSgKKyAgICBKTklFbnYqIGVudiwKKyAgICBqb2JqZWN0IHVudXNlZF90aGlzLAorICAgIGpsb25nIG5hdGl2ZV9tZWRpYV9jb2RlY19icmlkZ2UsCisgICAgamludCBidWZmZXJfaW5kZXgsCisgICAgamludCBmbGFncywKKyAgICBqaW50IG9mZnNldCwKKyAgICBqbG9uZyBwcmVzZW50YXRpb25fdGltZV91cywKKyAgICBqaW50IHNpemUpIHsKKyAgTWVkaWFDb2RlY0JyaWRnZSogbWVkaWFfY29kZWNfYnJpZGdlID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFDb2RlY0JyaWRnZSo+KG5hdGl2ZV9tZWRpYV9jb2RlY19icmlkZ2UpOworICBTQl9EQ0hFQ0sobWVkaWFfY29kZWNfYnJpZGdlKTsKKyAgbWVkaWFfY29kZWNfYnJpZGdlLT5Pbk1lZGlhQ29kZWNPdXRwdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICBidWZmZXJfaW5kZXgsIGZsYWdzLCBvZmZzZXQsIHByZXNlbnRhdGlvbl90aW1lX3VzLCBzaXplKTsKK30KKworZXh0ZXJuICJDIiBTQl9FWFBPUlRfUExBVEZPUk0gdm9pZAorSmF2YV9kZXZfY29iYWx0X21lZGlhX01lZGlhQ29kZWNCcmlkZ2VfbmF0aXZlT25NZWRpYUNvZGVjT3V0cHV0Rm9ybWF0Q2hhbmdlZCgKKyAgICBKTklFbnYqIGVudiwKKyAgICBqb2JqZWN0IHVudXNlZF90aGlzLAorICAgIGpsb25nIG5hdGl2ZV9tZWRpYV9jb2RlY19icmlkZ2UpIHsKKyAgTWVkaWFDb2RlY0JyaWRnZSogbWVkaWFfY29kZWNfYnJpZGdlID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFDb2RlY0JyaWRnZSo+KG5hdGl2ZV9tZWRpYV9jb2RlY19icmlkZ2UpOworICBTQl9EQ0hFQ0sobWVkaWFfY29kZWNfYnJpZGdlKTsKKyAgbWVkaWFfY29kZWNfYnJpZGdlLT5Pbk1lZGlhQ29kZWNPdXRwdXRGb3JtYXRDaGFuZ2VkKCk7Cit9CisKIC8vIHN0YXRpYwogc2NvcGVkX3B0cjxNZWRpYUNvZGVjQnJpZGdlPiBNZWRpYUNvZGVjQnJpZGdlOjpDcmVhdGVBdWRpb01lZGlhQ29kZWNCcmlkZ2UoCiAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCiAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIsCisgICAgSGFuZGxlciogaGFuZGxlciwKICAgICBqb2JqZWN0IGpfbWVkaWFfY3J5cHRvKSB7CiAgIGNvbnN0IGNoYXIqIG1pbWUgPSBTdXBwb3J0ZWRBdWRpb0NvZGVjVG9NaW1lVHlwZShhdWRpb19jb2RlYyk7CiAgIGlmICghbWltZSkgewpAQCAtODgsMTEgKzE0NiwxNCBAQAogICB9CiAgIEpuaUVudkV4dCogZW52ID0gSm5pRW52RXh0OjpHZXQoKTsKICAgU2NvcGVkTG9jYWxKYXZhUmVmPGpzdHJpbmc+IGpfbWltZShlbnYtPk5ld1N0cmluZ1N0YW5kYXJkVVRGT3JBYm9ydChtaW1lKSk7CisgIHNjb3BlZF9wdHI8TWVkaWFDb2RlY0JyaWRnZT4gbmF0aXZlX21lZGlhX2NvZGVjX2JyaWRnZSgKKyAgICAgIG5ldyBNZWRpYUNvZGVjQnJpZGdlKGhhbmRsZXIpKTsKICAgam9iamVjdCBqX21lZGlhX2NvZGVjX2JyaWRnZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZE9yQWJvcnQoCiAgICAgICAiZGV2L2NvYmFsdC9tZWRpYS9NZWRpYUNvZGVjQnJpZGdlIiwgImNyZWF0ZUF1ZGlvTWVkaWFDb2RlY0JyaWRnZSIsCi0gICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1paSUlMYW5kcm9pZC9tZWRpYS9NZWRpYUNyeXB0bzspTGRldi9jb2JhbHQvbWVkaWEvIgorICAgICAgIihKTGphdmEvbGFuZy9TdHJpbmc7WlpJSUxhbmRyb2lkL21lZGlhL01lZGlhQ3J5cHRvOylMZGV2L2NvYmFsdC9tZWRpYS8iCiAgICAgICAiTWVkaWFDb2RlY0JyaWRnZTsiLAotICAgICAgal9taW1lLkdldCgpLCAhIWpfbWVkaWFfY3J5cHRvLCBmYWxzZSwgYXVkaW9faGVhZGVyLnNhbXBsZXNfcGVyX3NlY29uZCwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8amxvbmc+KG5hdGl2ZV9tZWRpYV9jb2RlY19icmlkZ2UuZ2V0KCkpLCBqX21pbWUuR2V0KCksCisgICAgICAhIWpfbWVkaWFfY3J5cHRvLCBmYWxzZSwgYXVkaW9faGVhZGVyLnNhbXBsZXNfcGVyX3NlY29uZCwKICAgICAgIGF1ZGlvX2hlYWRlci5udW1iZXJfb2ZfY2hhbm5lbHMsIGpfbWVkaWFfY3J5cHRvKTsKIAogICBpZiAoIWpfbWVkaWFfY29kZWNfYnJpZGdlKSB7CkBAIC0xMDAsOCArMTYxLDggQEAKICAgfQogCiAgIGpfbWVkaWFfY29kZWNfYnJpZGdlID0gZW52LT5Db252ZXJ0TG9jYWxSZWZUb0dsb2JhbFJlZihqX21lZGlhX2NvZGVjX2JyaWRnZSk7Ci0gIHJldHVybiBzY29wZWRfcHRyPE1lZGlhQ29kZWNCcmlkZ2U+KAotICAgICAgbmV3IE1lZGlhQ29kZWNCcmlkZ2Uoal9tZWRpYV9jb2RlY19icmlkZ2UpKTsKKyAgbmF0aXZlX21lZGlhX2NvZGVjX2JyaWRnZS0+SW5pdGlhbGl6ZShqX21lZGlhX2NvZGVjX2JyaWRnZSk7CisgIHJldHVybiBuYXRpdmVfbWVkaWFfY29kZWNfYnJpZGdlLlBhc3MoKTsKIH0KIAogLy8gc3RhdGljCkBAIC0xMDksNiArMTcwLDcgQEAKICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICBpbnQgd2lkdGgsCiAgICAgaW50IGhlaWdodCwKKyAgICBIYW5kbGVyKiBoYW5kbGVyLAogICAgIGpvYmplY3Qgal9zdXJmYWNlLAogICAgIGpvYmplY3Qgal9tZWRpYV9jcnlwdG8sCiAgICAgY29uc3QgU2JNZWRpYUNvbG9yTWV0YWRhdGEqIGNvbG9yX21ldGFkYXRhKSB7CkBAIC0xNDYsMjcgKzIwOCwzMiBAQAogICAgIH0KICAgfQogCisgIHNjb3BlZF9wdHI8TWVkaWFDb2RlY0JyaWRnZT4gbmF0aXZlX21lZGlhX2NvZGVjX2JyaWRnZSgKKyAgICAgIG5ldyBNZWRpYUNvZGVjQnJpZGdlKGhhbmRsZXIpKTsKICAgam9iamVjdCBqX21lZGlhX2NvZGVjX2JyaWRnZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZE9yQWJvcnQoCiAgICAgICAiZGV2L2NvYmFsdC9tZWRpYS9NZWRpYUNvZGVjQnJpZGdlIiwgImNyZWF0ZVZpZGVvTWVkaWFDb2RlY0JyaWRnZSIsCi0gICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1paSUlMYW5kcm9pZC92aWV3L1N1cmZhY2U7IgorICAgICAgIihKTGphdmEvbGFuZy9TdHJpbmc7WlpJSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTsiCiAgICAgICAiTGFuZHJvaWQvbWVkaWEvTWVkaWFDcnlwdG87IgogICAgICAgIkxkZXYvY29iYWx0L21lZGlhL01lZGlhQ29kZWNCcmlkZ2UkQ29sb3JJbmZvOykiCiAgICAgICAiTGRldi9jb2JhbHQvbWVkaWEvTWVkaWFDb2RlY0JyaWRnZTsiLAotICAgICAgal9taW1lLkdldCgpLCAhIWpfbWVkaWFfY3J5cHRvLCBmYWxzZSwgd2lkdGgsIGhlaWdodCwgal9zdXJmYWNlLAotICAgICAgal9tZWRpYV9jcnlwdG8sIGpfY29sb3JfaW5mby5HZXQoKSk7CisgICAgICByZWludGVycHJldF9jYXN0PGpsb25nPihuYXRpdmVfbWVkaWFfY29kZWNfYnJpZGdlLmdldCgpKSwgal9taW1lLkdldCgpLAorICAgICAgISFqX21lZGlhX2NyeXB0bywgZmFsc2UsIHdpZHRoLCBoZWlnaHQsIGpfc3VyZmFjZSwgal9tZWRpYV9jcnlwdG8sCisgICAgICBqX2NvbG9yX2luZm8uR2V0KCkpOwogCiAgIGlmICghal9tZWRpYV9jb2RlY19icmlkZ2UpIHsKICAgICByZXR1cm4gc2NvcGVkX3B0cjxNZWRpYUNvZGVjQnJpZGdlPihOVUxMKTsKICAgfQogCiAgIGpfbWVkaWFfY29kZWNfYnJpZGdlID0gZW52LT5Db252ZXJ0TG9jYWxSZWZUb0dsb2JhbFJlZihqX21lZGlhX2NvZGVjX2JyaWRnZSk7Ci0gIHJldHVybiBzY29wZWRfcHRyPE1lZGlhQ29kZWNCcmlkZ2U+KAotICAgICAgbmV3IE1lZGlhQ29kZWNCcmlkZ2Uoal9tZWRpYV9jb2RlY19icmlkZ2UpKTsKKyAgbmF0aXZlX21lZGlhX2NvZGVjX2JyaWRnZS0+SW5pdGlhbGl6ZShqX21lZGlhX2NvZGVjX2JyaWRnZSk7CisgIHJldHVybiBuYXRpdmVfbWVkaWFfY29kZWNfYnJpZGdlLlBhc3MoKTsKIH0KIAogTWVkaWFDb2RlY0JyaWRnZTo6fk1lZGlhQ29kZWNCcmlkZ2UoKSB7CiAgIEpuaUVudkV4dCogZW52ID0gSm5pRW52RXh0OjpHZXQoKTsKIAorICBlbnYtPkNhbGxWb2lkTWV0aG9kT3JBYm9ydChqX21lZGlhX2NvZGVjX2JyaWRnZV8sICJzdG9wIiwgIigpViIpOworCiAgIFNCX0RDSEVDSyhqX21lZGlhX2NvZGVjX2JyaWRnZV8pOwogICBlbnYtPkNhbGxWb2lkTWV0aG9kT3JBYm9ydChqX21lZGlhX2NvZGVjX2JyaWRnZV8sICJyZWxlYXNlIiwgIigpViIpOwogICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihqX21lZGlhX2NvZGVjX2JyaWRnZV8pOwpAQCAtMzI1LDEyICszOTIsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVsQ291bnQiLCAiKClJIil9OwogfQogCi1NZWRpYUNvZGVjQnJpZGdlOjpNZWRpYUNvZGVjQnJpZGdlKGpvYmplY3Qgal9tZWRpYV9jb2RlY19icmlkZ2UpCi0gICAgOiBqX21lZGlhX2NvZGVjX2JyaWRnZV8oal9tZWRpYV9jb2RlY19icmlkZ2UpLAotICAgICAgal9yZXVzZWRfZGVxdWV1ZV9pbnB1dF9yZXN1bHRfKE5VTEwpLAotICAgICAgal9yZXVzZWRfZGVxdWV1ZV9vdXRwdXRfcmVzdWx0XyhOVUxMKSwKLSAgICAgIGpfcmV1c2VkX2dldF9vdXRwdXRfZm9ybWF0X3Jlc3VsdF8oTlVMTCkgewotICBTQl9EQ0hFQ0soal9tZWRpYV9jb2RlY19icmlkZ2VfKTsKK3ZvaWQgTWVkaWFDb2RlY0JyaWRnZTo6T25NZWRpYUNvZGVjRXJyb3IoYm9vbCBpc19yZWNvdmVyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc190cmFuc2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaWFnbm9zdGljX2luZm8pIHsKKyAgaGFuZGxlcl8tPk9uTWVkaWFDb2RlY0Vycm9yKGlzX3JlY292ZXJhYmxlLCBpc190cmFuc2llbnQsIGRpYWdub3N0aWNfaW5mbyk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0JyaWRnZTo6T25NZWRpYUNvZGVjSW5wdXRCdWZmZXJBdmFpbGFibGUoaW50IGJ1ZmZlcl9pbmRleCkgeworICBoYW5kbGVyXy0+T25NZWRpYUNvZGVjSW5wdXRCdWZmZXJBdmFpbGFibGUoYnVmZmVyX2luZGV4KTsKK30KKwordm9pZCBNZWRpYUNvZGVjQnJpZGdlOjpPbk1lZGlhQ29kZWNPdXRwdXRCdWZmZXJBdmFpbGFibGUoCisgICAgaW50IGJ1ZmZlcl9pbmRleCwKKyAgICBpbnQgZmxhZ3MsCisgICAgaW50IG9mZnNldCwKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvbl90aW1lX3VzLAorICAgIGludCBzaXplKSB7CisgIGhhbmRsZXJfLT5Pbk1lZGlhQ29kZWNPdXRwdXRCdWZmZXJBdmFpbGFibGUoYnVmZmVyX2luZGV4LCBmbGFncywgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl90aW1lX3VzLCBzaXplKTsKK30KKwordm9pZCBNZWRpYUNvZGVjQnJpZGdlOjpPbk1lZGlhQ29kZWNPdXRwdXRGb3JtYXRDaGFuZ2VkKCkgeworICBoYW5kbGVyXy0+T25NZWRpYUNvZGVjT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpOworfQorCitNZWRpYUNvZGVjQnJpZGdlOjpNZWRpYUNvZGVjQnJpZGdlKEhhbmRsZXIqIGhhbmRsZXIpIDogaGFuZGxlcl8oaGFuZGxlcikgeworICBTQl9EQ0hFQ0soaGFuZGxlcl8pOworfQorCit2b2lkIE1lZGlhQ29kZWNCcmlkZ2U6OkluaXRpYWxpemUoam9iamVjdCBqX21lZGlhX2NvZGVjX2JyaWRnZSkgeworICBTQl9EQ0hFQ0soal9tZWRpYV9jb2RlY19icmlkZ2UpOworCisgIGpfbWVkaWFfY29kZWNfYnJpZGdlXyA9IGpfbWVkaWFfY29kZWNfYnJpZGdlOworCiAgIEpuaUVudkV4dCogZW52ID0gSm5pRW52RXh0OjpHZXQoKTsKICAgU0JfRENIRUNLKGVudi0+R2V0T2JqZWN0UmVmVHlwZShqX21lZGlhX2NvZGVjX2JyaWRnZV8pID09IEpOSUdsb2JhbFJlZlR5cGUpOwogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2NvZGVjX2JyaWRnZS5oIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb2RlY19icmlkZ2UuaAppbmRleCAzMTcyZTMzLi44NTcxMzc5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2NvZGVjX2JyaWRnZS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29kZWNfYnJpZGdlLmgKQEAgLTc0LDE1ICs3NCwzNiBAQAogCiBjbGFzcyBNZWRpYUNvZGVjQnJpZGdlIHsKICBwdWJsaWM6CisgIC8vIFRoZSBtZXRob2RzIGFyZSBjYWxsZWQgb24gdGhlIGRlZmF1bHQgTG9vcGVyLiAgVGhleSB3b24ndCBnZXQgY2FsbGVkIGFmdGVyCisgIC8vIEZsdXNoKCkgaXMgcmV0dXJuZWQuCisgIGNsYXNzIEhhbmRsZXIgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBPbk1lZGlhQ29kZWNFcnJvcihib29sIGlzX3JlY292ZXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3RyYW5zaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpYWdub3N0aWNfaW5mbykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBPbk1lZGlhQ29kZWNJbnB1dEJ1ZmZlckF2YWlsYWJsZShpbnQgYnVmZmVyX2luZGV4KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIE9uTWVkaWFDb2RlY091dHB1dEJ1ZmZlckF2YWlsYWJsZShpbnQgYnVmZmVyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHJlc2VudGF0aW9uX3RpbWVfdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBPbk1lZGlhQ29kZWNPdXRwdXRGb3JtYXRDaGFuZ2VkKCkgPSAwOworCisgICBwcm90ZWN0ZWQ6CisgICAgfkhhbmRsZXIoKSB7fQorICB9OworCiAgIHN0YXRpYyBzY29wZWRfcHRyPE1lZGlhQ29kZWNCcmlkZ2U+IENyZWF0ZUF1ZGlvTWVkaWFDb2RlY0JyaWRnZSgKICAgICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAogICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIsCisgICAgICBIYW5kbGVyKiBoYW5kbGVyLAogICAgICAgam9iamVjdCBqX21lZGlhX2NyeXB0byk7CiAKICAgc3RhdGljIHNjb3BlZF9wdHI8TWVkaWFDb2RlY0JyaWRnZT4gQ3JlYXRlVmlkZW9NZWRpYUNvZGVjQnJpZGdlKAogICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCiAgICAgICBpbnQgd2lkdGgsCiAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgSGFuZGxlciogaGFuZGxlciwKICAgICAgIGpvYmplY3Qgal9zdXJmYWNlLAogICAgICAgam9iamVjdCBqX21lZGlhX2NyeXB0bywKICAgICAgIGNvbnN0IFNiTWVkaWFDb2xvck1ldGFkYXRhKiBjb2xvcl9tZXRhZGF0YSk7CkBAIC0xMTQsMjAgKzEzNSwzMyBAQAogICBTdXJmYWNlRGltZW5zaW9ucyBHZXRPdXRwdXREaW1lbnNpb25zKCk7CiAgIEF1ZGlvT3V0cHV0Rm9ybWF0UmVzdWx0IEdldEF1ZGlvT3V0cHV0Rm9ybWF0KCk7CiAKKyAgdm9pZCBPbk1lZGlhQ29kZWNFcnJvcihib29sIGlzX3JlY292ZXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdHJhbnNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaWFnbm9zdGljX2luZm8pOworICB2b2lkIE9uTWVkaWFDb2RlY0lucHV0QnVmZmVyQXZhaWxhYmxlKGludCBidWZmZXJfaW5kZXgpOworICB2b2lkIE9uTWVkaWFDb2RlY091dHB1dEJ1ZmZlckF2YWlsYWJsZShpbnQgYnVmZmVyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHJlc2VudGF0aW9uX3RpbWVfdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKKyAgdm9pZCBPbk1lZGlhQ29kZWNPdXRwdXRGb3JtYXRDaGFuZ2VkKCk7CisKICBwcml2YXRlOgogICAvLyB8TWVkaWFDb2RlY0JyaWRnZXxzIG11c3Qgb25seSBiZSBjcmVhdGVkIHRocm91Z2ggaXRzIGZhY3RvcnkgbWV0aG9kcy4KLSAgZXhwbGljaXQgTWVkaWFDb2RlY0JyaWRnZShqb2JqZWN0IGpfbWVkaWFfY29kZWNfYnJpZGdlKTsKKyAgZXhwbGljaXQgTWVkaWFDb2RlY0JyaWRnZShIYW5kbGVyKiBoYW5kbGVyKTsKKyAgdm9pZCBJbml0aWFsaXplKGpvYmplY3Qgal9tZWRpYV9jb2RlY19icmlkZ2UpOwogCi0gIGpvYmplY3Qgal9tZWRpYV9jb2RlY19icmlkZ2VfOworICBIYW5kbGVyKiBoYW5kbGVyXyA9IE5VTEw7CisgIGpvYmplY3Qgal9tZWRpYV9jb2RlY19icmlkZ2VfID0gTlVMTDsKIAogICAvLyBQcm9maWxpbmcgYW5kIGFsbG9jYXRpb24gdHJhY2tpbmcgaGFzIGlkZW50aWZpZWQgdGhpcyBhcmVhIHRvIGJlIGhvdCwKICAgLy8gYW5kLCBjYXBhYmxlIG9mIGVub3VnaCB0byBjYXVzZSBHQyB0aW1lcyB0byByYWlzZSBoaWdoIGVub3VnaCB0byBpbXBhY3QKICAgLy8gcGxheWJhY2suICBXZSBtaXRpZ2F0ZSB0aGlzIGJ5IHJldXNpbmcgdGhlc2Ugb3V0cHV0IG9iamVjdHMgYmV0d2VlbiBjYWxscwogICAvLyB0byB8RGVxdWV1ZUlucHV0QnVmZmVyfCwgfERlcXVldWVPdXRwdXRCdWZmZXJ8LCBhbmQKICAgLy8gfEdldE91dHB1dERpbWVuc2lvbnN8LgotICBqb2JqZWN0IGpfcmV1c2VkX2RlcXVldWVfaW5wdXRfcmVzdWx0XzsKLSAgam9iamVjdCBqX3JldXNlZF9kZXF1ZXVlX291dHB1dF9yZXN1bHRfOwotICBqb2JqZWN0IGpfcmV1c2VkX2dldF9vdXRwdXRfZm9ybWF0X3Jlc3VsdF87CisgIGpvYmplY3Qgal9yZXVzZWRfZGVxdWV1ZV9pbnB1dF9yZXN1bHRfID0gTlVMTDsKKyAgam9iamVjdCBqX3JldXNlZF9kZXF1ZXVlX291dHB1dF9yZXN1bHRfID0gTlVMTDsKKyAgam9iamVjdCBqX3JldXNlZF9nZXRfb3V0cHV0X2Zvcm1hdF9yZXN1bHRfID0gTlVMTDsKIAogICBTQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFDb2RlY0JyaWRnZSk7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb21tb24uaCBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29tbW9uLmgKaW5kZXggNzhiYTc4My4uY2JjMjY2OCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb21tb24uaAorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2NvbW1vbi5oCkBAIC04NSwxMSArODUsNiBAQAogICAgIGRlcXVlXy5jbGVhcigpOwogICB9CiAKLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgcmV0dXJuIGRlcXVlXy5zaXplKCk7Ci0gIH0KLQogIHByaXZhdGU6CiAgIDo6c3RhcmJvYXJkOjpNdXRleCBtdXRleF87CiAgIHN0ZDo6ZGVxdWU8RT4gZGVxdWVfOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmNjCmluZGV4IDUwNzIzOWUuLjFiZWU2NTQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfZGVjb2Rlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2RlY29kZXIuY2MKQEAgLTE4LDcgKzE4LDExIEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2puaV91dGlscy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb21tb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvYXVkaW9fc2luay5oIgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OCisjaW5jbHVkZSAic3RhcmJvYXJkL2Zvcm1hdF9zdHJpbmcuaCIKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTU9WRV9GT1JNQVRfU1RSSU5HX1ZFUlNJT04KICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9wdGhyZWFkL3RocmVhZF9jcmVhdGVfcHJpb3JpdHkuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtNjQsNiArNjgsMTAgQEAKICAgfQogfQogCitjb25zdCBjaGFyKiBHZXREZWNvZGVyTmFtZShTYk1lZGlhVHlwZSBtZWRpYV90eXBlKSB7CisgIHJldHVybiBtZWRpYV90eXBlID09IGtTYk1lZGlhVHlwZUF1ZGlvID8gImF1ZGlvX2RlY29kZXIiIDogInZpZGVvX2RlY29kZXIiOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogTWVkaWFEZWNvZGVyOjpNZWRpYURlY29kZXIoSG9zdCogaG9zdCwKQEAgLTcyLDE2ICs4MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSkKICAgICA6IG1lZGlhX3R5cGVfKGtTYk1lZGlhVHlwZUF1ZGlvKSwKICAgICAgIGhvc3RfKGhvc3QpLAotICAgICAgZGVjb2Rlcl90aHJlYWRfKGtTYlRocmVhZEludmFsaWQpLAotICAgICAgbWVkaWFfY29kZWNfYnJpZGdlXyhOVUxMKSwKLSAgICAgIHN0cmVhbV9lbmRlZF8oZmFsc2UpLAotICAgICAgZHJtX3N5c3RlbV8oc3RhdGljX2Nhc3Q8RHJtU3lzdGVtKj4oZHJtX3N5c3RlbSkpIHsKKyAgICAgIGRybV9zeXN0ZW1fKHN0YXRpY19jYXN0PERybVN5c3RlbSo+KGRybV9zeXN0ZW0pKSwKKyAgICAgIGNvbmRpdGlvbl92YXJpYWJsZV8obXV0ZXhfKSB7CiAgIFNCX0RDSEVDSyhob3N0Xyk7CiAKICAgam9iamVjdCBqX21lZGlhX2NyeXB0byA9IGRybV9zeXN0ZW1fID8gZHJtX3N5c3RlbV8tPkdldE1lZGlhQ3J5cHRvKCkgOiBOVUxMOwogICBTQl9EQ0hFQ0soIWRybV9zeXN0ZW1fIHx8IGpfbWVkaWFfY3J5cHRvKTsKICAgbWVkaWFfY29kZWNfYnJpZGdlXyA9IE1lZGlhQ29kZWNCcmlkZ2U6OkNyZWF0ZUF1ZGlvTWVkaWFDb2RlY0JyaWRnZSgKLSAgICAgIGF1ZGlvX2NvZGVjLCBhdWRpb19oZWFkZXIsIGpfbWVkaWFfY3J5cHRvKTsKKyAgICAgIGF1ZGlvX2NvZGVjLCBhdWRpb19oZWFkZXIsIHRoaXMsIGpfbWVkaWFfY3J5cHRvKTsKICAgaWYgKCFtZWRpYV9jb2RlY19icmlkZ2VfKSB7CiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhdWRpbyBtZWRpYSBjb2RlYyBicmlkZ2UuIjsKICAgICByZXR1cm47CkBAIC04OSw5ICs5NSwxMCBAQAogICBpZiAoYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZ19zaXplID4gMCkgewogICAgIC8vIHxhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnfCBpcyBndWFyYW50ZWVkIHRvIGJlIG91dGxpdmVkIHRoZQogICAgIC8vIGRlY29kZXIgYXMgaXQgaXMgc3RvcmVkIGluIHxGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXJ8LgotICAgIGV2ZW50X3F1ZXVlXy5QdXNoQmFjayhFdmVudCgKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgaW50OF90Kj4oYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZyksCi0gICAgICAgIGF1ZGlvX2hlYWRlci5hdWRpb19zcGVjaWZpY19jb25maWdfc2l6ZSkpOworICAgIHBlbmRpbmdfdGFza3NfLnB1c2hfYmFjaygKKyAgICAgICAgRXZlbnQoc3RhdGljX2Nhc3Q8Y29uc3QgaW50OF90Kj4oYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZyksCisgICAgICAgICAgICAgIGF1ZGlvX2hlYWRlci5hdWRpb19zcGVjaWZpY19jb25maWdfc2l6ZSkpOworICAgIG51bWJlcl9vZl9wZW5kaW5nX3Rhc2tzXy5pbmNyZW1lbnQoKTsKICAgfQogfQogCkBAIC0xMDQsMTQgKzExMSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUNvbG9yTWV0YWRhdGEqIGNvbG9yX21ldGFkYXRhKQogICAgIDogbWVkaWFfdHlwZV8oa1NiTWVkaWFUeXBlVmlkZW8pLAogICAgICAgaG9zdF8oaG9zdCksCi0gICAgICBzdHJlYW1fZW5kZWRfKGZhbHNlKSwKICAgICAgIGRybV9zeXN0ZW1fKHN0YXRpY19jYXN0PERybVN5c3RlbSo+KGRybV9zeXN0ZW0pKSwKLSAgICAgIGRlY29kZXJfdGhyZWFkXyhrU2JUaHJlYWRJbnZhbGlkKSwKLSAgICAgIG1lZGlhX2NvZGVjX2JyaWRnZV8oTlVMTCkgeworICAgICAgY29uZGl0aW9uX3ZhcmlhYmxlXyhtdXRleF8pIHsKICAgam9iamVjdCBqX21lZGlhX2NyeXB0byA9IGRybV9zeXN0ZW1fID8gZHJtX3N5c3RlbV8tPkdldE1lZGlhQ3J5cHRvKCkgOiBOVUxMOwogICBTQl9EQ0hFQ0soIWRybV9zeXN0ZW1fIHx8IGpfbWVkaWFfY3J5cHRvKTsKICAgbWVkaWFfY29kZWNfYnJpZGdlXyA9IE1lZGlhQ29kZWNCcmlkZ2U6OkNyZWF0ZVZpZGVvTWVkaWFDb2RlY0JyaWRnZSgKLSAgICAgIHZpZGVvX2NvZGVjLCB3aWR0aCwgaGVpZ2h0LCBqX291dHB1dF9zdXJmYWNlLCBqX21lZGlhX2NyeXB0bywKKyAgICAgIHZpZGVvX2NvZGVjLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLCBqX291dHB1dF9zdXJmYWNlLCBqX21lZGlhX2NyeXB0bywKICAgICAgIGNvbG9yX21ldGFkYXRhKTsKICAgaWYgKCFtZWRpYV9jb2RlY19icmlkZ2VfKSB7CiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlbyBtZWRpYSBjb2RlYyBicmlkZ2UuIjsKQEAgLTEyMSw3ICsxMjYsNyBAQAogTWVkaWFEZWNvZGVyOjp+TWVkaWFEZWNvZGVyKCkgewogICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAKLSAgSm9pbk9uRGVjb2RlclRocmVhZCgpOworICBKb2luT25UaHJlYWRzKCk7CiB9CiAKIHZvaWQgTWVkaWFEZWNvZGVyOjpJbml0aWFsaXplKGNvbnN0IEVycm9yQ0ImIGVycm9yX2NiKSB7CkBAIC0xMzcsMzEgKzE0Miw0MyBAQAogICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIFNCX0RDSEVDSyhpbnB1dF9idWZmZXIpOwogCi0gIGlmIChzdHJlYW1fZW5kZWRfKSB7CisgIGlmIChzdHJlYW1fZW5kZWRfLmxvYWQoKSkgewogICAgIFNCX0xPRyhFUlJPUikgPDwgIkRlY29kZSgpIGlzIGNhbGxlZCBhZnRlciBXcml0ZUVuZE9mU3RyZWFtKCkgaXMgY2FsbGVkLiI7CiAgICAgcmV0dXJuOwogICB9CiAKICAgaWYgKCFTYlRocmVhZElzVmFsaWQoZGVjb2Rlcl90aHJlYWRfKSkgewogICAgIGRlY29kZXJfdGhyZWFkXyA9IFNiVGhyZWFkQ3JlYXRlKAotICAgICAgICAwLCBrU2JUaHJlYWRQcmlvcml0eU5vcm1hbCwga1NiVGhyZWFkTm9BZmZpbml0eSwgdHJ1ZSwKLSAgICAgICAgbWVkaWFfdHlwZV8gPT0ga1NiTWVkaWFUeXBlQXVkaW8gPyAiYXVkaW9fZGVjb2RlciIgOiAidmlkZW9fZGVjb2RlciIsCi0gICAgICAgICZNZWRpYURlY29kZXI6OlRocmVhZEVudHJ5UG9pbnQsIHRoaXMpOworICAgICAgICAwLAorICAgICAgICBtZWRpYV90eXBlXyA9PSBrU2JNZWRpYVR5cGVBdWRpbyA/IGtTYlRocmVhZFByaW9yaXR5Tm9ybWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1NiVGhyZWFkUHJpb3JpdHlIaWdoLAorICAgICAgICBrU2JUaHJlYWROb0FmZmluaXR5LCB0cnVlLCBHZXREZWNvZGVyTmFtZShtZWRpYV90eXBlXyksCisgICAgICAgICZNZWRpYURlY29kZXI6OkRlY29kZXJUaHJlYWRFbnRyeVBvaW50LCB0aGlzKTsKICAgICBTQl9EQ0hFQ0soU2JUaHJlYWRJc1ZhbGlkKGRlY29kZXJfdGhyZWFkXykpOwogICB9CiAKLSAgZXZlbnRfcXVldWVfLlB1c2hCYWNrKEV2ZW50KGlucHV0X2J1ZmZlcikpOworICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKG11dGV4Xyk7CisgIHBlbmRpbmdfdGFza3NfLnB1c2hfYmFjayhFdmVudChpbnB1dF9idWZmZXIpKTsKKyAgbnVtYmVyX29mX3BlbmRpbmdfdGFza3NfLmluY3JlbWVudCgpOworICBpZiAocGVuZGluZ190YXNrc18uc2l6ZSgpID09IDEpIHsKKyAgICBjb25kaXRpb25fdmFyaWFibGVfLlNpZ25hbCgpOworICB9CiB9CiAKIHZvaWQgTWVkaWFEZWNvZGVyOjpXcml0ZUVuZE9mU3RyZWFtKCkgewogICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAKLSAgc3RyZWFtX2VuZGVkXyA9IHRydWU7Ci0gIGV2ZW50X3F1ZXVlXy5QdXNoQmFjayhFdmVudChFdmVudDo6a1dyaXRlRW5kT2ZTdHJlYW0pKTsKKyAgc3RyZWFtX2VuZGVkXy5zdG9yZSh0cnVlKTsKKyAgU2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOworICBwZW5kaW5nX3Rhc2tzXy5wdXNoX2JhY2soRXZlbnQoRXZlbnQ6OmtXcml0ZUVuZE9mU3RyZWFtKSk7CisgIG51bWJlcl9vZl9wZW5kaW5nX3Rhc2tzXy5pbmNyZW1lbnQoKTsKKyAgaWYgKHBlbmRpbmdfdGFza3NfLnNpemUoKSA9PSAxKSB7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlXy5TaWduYWwoKTsKKyAgfQogfQogCiAvLyBzdGF0aWMKLXZvaWQqIE1lZGlhRGVjb2Rlcjo6VGhyZWFkRW50cnlQb2ludCh2b2lkKiBjb250ZXh0KSB7Cit2b2lkKiBNZWRpYURlY29kZXI6OkRlY29kZXJUaHJlYWRFbnRyeVBvaW50KHZvaWQqIGNvbnRleHQpIHsKICAgU0JfRENIRUNLKGNvbnRleHQpOwogICBNZWRpYURlY29kZXIqIGRlY29kZXIgPSBzdGF0aWNfY2FzdDxNZWRpYURlY29kZXIqPihjb250ZXh0KTsKICAgZGVjb2Rlci0+RGVjb2RlclRocmVhZEZ1bmMoKTsKQEAgLTE3MSw2NyArMTg4LDE1NSBAQAogdm9pZCBNZWRpYURlY29kZXI6OkRlY29kZXJUaHJlYWRGdW5jKCkgewogICBTQl9EQ0hFQ0soZXJyb3JfY2JfKTsKIAotICAvLyBUT0RPOiBSZXBsYWNlIHxwZW5kaW5nX3dvcmt8IHdpdGggYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgdXNpbmcgYSBkZXF1ZS4KLSAgc3RkOjpkZXF1ZTxFdmVudD4gcGVuZGluZ193b3JrOworICBpZiAobWVkaWFfdHlwZV8gPT0ga1NiTWVkaWFUeXBlQXVkaW8pIHsKKyAgICBzdGQ6OmRlcXVlPEV2ZW50PiBwZW5kaW5nX3Rhc2tzOworICAgIHN0ZDo6dmVjdG9yPGludD4gaW5wdXRfYnVmZmVyX2luZGljZXM7CiAKLSAgLy8gVE9ETzogUmVmYWN0b3IgdGhlIGkvbyBsb2dpYyB1c2luZyBhc3luYyBiYXNlZCBkZWNvZGVyLgotICB3aGlsZSAoIWRlc3Ryb3lpbmdfLmxvYWQoKSkgewotICAgIGlmIChwZW5kaW5nX3dvcmsuZW1wdHkoKSkgewotICAgICAgRXZlbnQgZXZlbnQgPSBldmVudF9xdWV1ZV8uUG9sbEZyb250KCk7CisgICAgd2hpbGUgKCFkZXN0cm95aW5nXy5sb2FkKCkpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPERlcXVldWVPdXRwdXRSZXN1bHQ+IGRlcXVldWVfb3V0cHV0X3Jlc3VsdHM7CisgICAgICB7CisgICAgICAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKKyAgICAgICAgYm9vbCBoYXNfaW5wdXQgPSAhcGVuZGluZ190YXNrcy5lbXB0eSgpIHx8ICFwZW5kaW5nX3Rhc2tzXy5lbXB0eSgpOworICAgICAgICBib29sIGhhc19pbnB1dF9idWZmZXIgPQorICAgICAgICAgICAgIWlucHV0X2J1ZmZlcl9pbmRpY2VzLmVtcHR5KCkgfHwgIWlucHV0X2J1ZmZlcl9pbmRpY2VzXy5lbXB0eSgpOworICAgICAgICBib29sIGNhbl9wcm9jZXNzX2lucHV0ID0KKyAgICAgICAgICAgIHBlbmRpbmdfcXVldWVfaW5wdXRfYnVmZmVyX3Rhc2tfIHx8IChoYXNfaW5wdXQgJiYgaGFzX2lucHV0X2J1ZmZlcik7CisgICAgICAgIGlmIChkZXF1ZXVlX291dHB1dF9yZXN1bHRzLmVtcHR5KCkgJiYgIWNhbl9wcm9jZXNzX2lucHV0KSB7CisgICAgICAgICAgaWYgKCFjb25kaXRpb25fdmFyaWFibGVfLldhaXRUaW1lZCg1ICoga1NiVGltZVNlY29uZCkpIHsKKyAgICAgICAgICAgIFNCX0xPR19JRihFUlJPUiwgIXN0cmVhbV9lbmRlZF8ubG9hZCgpKQorICAgICAgICAgICAgICAgIDw8IEdldERlY29kZXJOYW1lKG1lZGlhX3R5cGVfKSA8PCAiOiBXYWl0KCkgaGl0cyB0aW1lb3V0LiI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFNCX0RDSEVDSyhkZXF1ZXVlX291dHB1dF9yZXN1bHRzLmVtcHR5KCkpOworICAgICAgICBDb2xsZWN0UGVuZGluZ0RhdGFfTG9ja2VkKCZwZW5kaW5nX3Rhc2tzLCAmaW5wdXRfYnVmZmVyX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcXVldWVfb3V0cHV0X3Jlc3VsdHMpOworICAgICAgfQogCi0gICAgICBpZiAoZXZlbnQudHlwZSA9PSBFdmVudDo6a1dyaXRlSW5wdXRCdWZmZXIgfHwKLSAgICAgICAgICBldmVudC50eXBlID09IEV2ZW50OjprV3JpdGVFbmRPZlN0cmVhbSB8fAotICAgICAgICAgIGV2ZW50LnR5cGUgPT0gRXZlbnQ6OmtXcml0ZUNvZGVjQ29uZmlnKSB7Ci0gICAgICAgIHBlbmRpbmdfd29yay5wdXNoX2JhY2soZXZlbnQpOworICAgICAgZm9yIChhdXRvIGRlcXVldWVfb3V0cHV0X3Jlc3VsdCA6IGRlcXVldWVfb3V0cHV0X3Jlc3VsdHMpIHsKKyAgICAgICAgaWYgKGRlcXVldWVfb3V0cHV0X3Jlc3VsdC5pbmRleCA8IDApIHsKKyAgICAgICAgICBob3N0Xy0+UmVmcmVzaE91dHB1dEZvcm1hdChtZWRpYV9jb2RlY19icmlkZ2VfLmdldCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBob3N0Xy0+UHJvY2Vzc091dHB1dEJ1ZmZlcihtZWRpYV9jb2RlY19icmlkZ2VfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yICg7OykgeworICAgICAgICBib29sIGNhbl9wcm9jZXNzX2lucHV0ID0KKyAgICAgICAgICAgIHBlbmRpbmdfcXVldWVfaW5wdXRfYnVmZmVyX3Rhc2tfIHx8CisgICAgICAgICAgICAoIXBlbmRpbmdfdGFza3MuZW1wdHkoKSAmJiAhaW5wdXRfYnVmZmVyX2luZGljZXMuZW1wdHkoKSk7CisgICAgICAgIGlmICghY2FuX3Byb2Nlc3NfaW5wdXQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVByb2Nlc3NPbmVJbnB1dEJ1ZmZlcigmcGVuZGluZ190YXNrcywgJmlucHV0X2J1ZmZlcl9pbmRpY2VzKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICB9IGVsc2UgeworICAgIC8vIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnNvbGlkYXRlIHRoZSBsb2dpYyBmb3IgYXVkaW8gYW5kIHZpZGVvCisgICAgLy8gZGVjb2RlcnMsIGl0IGlzIGVhc3kgdG8gZmluZSB0dW5lIHRoZSBiZWhhdmlvciBvZiB2aWRlbyBkZWNvZGVyIGlmIHRoZXkKKyAgICAvLyBhcmUgc2VwYXJhdGVkLgorICAgIHN0ZDo6ZGVxdWU8RXZlbnQ+IHBlbmRpbmdfdGFza3M7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBpbnB1dF9idWZmZXJfaW5kaWNlczsKKyAgICBzdGQ6OnZlY3RvcjxEZXF1ZXVlT3V0cHV0UmVzdWx0PiBkZXF1ZXVlX291dHB1dF9yZXN1bHRzOwogCi0gICAgaWYgKG1lZGlhX3R5cGVfID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7Ci0gICAgICBpZiAoIVByb2Nlc3NPbmVJbnB1dEJ1ZmZlcigmcGVuZGluZ193b3JrKSAmJgotICAgICAgICAgICFEZXF1ZXVlQW5kUHJvY2Vzc091dHB1dEJ1ZmZlcigpKSB7Ci0gICAgICAgIFNiVGhyZWFkU2xlZXAoa1NiVGltZU1pbGxpc2Vjb25kKTsKKyAgICB3aGlsZSAoIWRlc3Ryb3lpbmdfLmxvYWQoKSkgeworICAgICAgYm9vbCBoYXNfaW5wdXQgPQorICAgICAgICAgIHBlbmRpbmdfcXVldWVfaW5wdXRfYnVmZmVyX3Rhc2tfIHx8CisgICAgICAgICAgKCFwZW5kaW5nX3Rhc2tzLmVtcHR5KCkgJiYgIWlucHV0X2J1ZmZlcl9pbmRpY2VzLmVtcHR5KCkpOworICAgICAgYm9vbCBoYXNfb3V0cHV0ID0gIWRlcXVldWVfb3V0cHV0X3Jlc3VsdHMuZW1wdHkoKTsKKyAgICAgIGlmICghaGFzX2lucHV0IHx8ICFoYXNfb3V0cHV0KSB7CisgICAgICAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKKyAgICAgICAgQ29sbGVjdFBlbmRpbmdEYXRhX0xvY2tlZCgmcGVuZGluZ190YXNrcywgJmlucHV0X2J1ZmZlcl9pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXF1ZXVlX291dHB1dF9yZXN1bHRzKTsKICAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KIAotICAgIFNCX0RDSEVDSyhtZWRpYV90eXBlXyA9PSBrU2JNZWRpYVR5cGVWaWRlbyk7Ci0gICAgLy8gQ2FsbCBUaWNrKCkgdG8gZ2l2ZSB0aGUgdmlkZW8gZGVjb2RlciBhIGNoYW5jZSB0byByZWxlYXNlIHRoZSBmcmFtZXMKLSAgICAvLyBhZnRlciBlYWNoIGlucHV0IG9yIG91dHB1dCBvcGVyYXRpb25zLgotICAgIGlmICghUHJvY2Vzc09uZUlucHV0QnVmZmVyKCZwZW5kaW5nX3dvcmspICYmCi0gICAgICAgICFob3N0Xy0+VGljayhtZWRpYV9jb2RlY19icmlkZ2VfLmdldCgpKSkgewotICAgICAgU2JUaHJlYWRTbGVlcChrU2JUaW1lTWlsbGlzZWNvbmQpOwotICAgIH0KLSAgICBpZiAoIURlcXVldWVBbmRQcm9jZXNzT3V0cHV0QnVmZmVyKCkgJiYKLSAgICAgICAgIWhvc3RfLT5UaWNrKG1lZGlhX2NvZGVjX2JyaWRnZV8uZ2V0KCkpKSB7Ci0gICAgICBTYlRocmVhZFNsZWVwKGtTYlRpbWVNaWxsaXNlY29uZCk7CisgICAgICBpZiAoIWRlcXVldWVfb3V0cHV0X3Jlc3VsdHMuZW1wdHkoKSkgeworICAgICAgICBhdXRvJiBkZXF1ZXVlX291dHB1dF9yZXN1bHQgPSBkZXF1ZXVlX291dHB1dF9yZXN1bHRzLmZyb250KCk7CisgICAgICAgIGlmIChkZXF1ZXVlX291dHB1dF9yZXN1bHQuaW5kZXggPCAwKSB7CisgICAgICAgICAgaG9zdF8tPlJlZnJlc2hPdXRwdXRGb3JtYXQobWVkaWFfY29kZWNfYnJpZGdlXy5nZXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaG9zdF8tPlByb2Nlc3NPdXRwdXRCdWZmZXIobWVkaWFfY29kZWNfYnJpZGdlXy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlX291dHB1dF9yZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdHMuZXJhc2UoZGVxdWV1ZV9vdXRwdXRfcmVzdWx0cy5iZWdpbigpKTsKKyAgICAgIH0KKyAgICAgIGhvc3RfLT5UaWNrKG1lZGlhX2NvZGVjX2JyaWRnZV8uZ2V0KCkpOworCisgICAgICBib29sIGNhbl9wcm9jZXNzX2lucHV0ID0KKyAgICAgICAgICBwZW5kaW5nX3F1ZXVlX2lucHV0X2J1ZmZlcl90YXNrXyB8fAorICAgICAgICAgICghcGVuZGluZ190YXNrcy5lbXB0eSgpICYmICFpbnB1dF9idWZmZXJfaW5kaWNlcy5lbXB0eSgpKTsKKyAgICAgIGlmIChjYW5fcHJvY2Vzc19pbnB1dCkgeworICAgICAgICBQcm9jZXNzT25lSW5wdXRCdWZmZXIoJnBlbmRpbmdfdGFza3MsICZpbnB1dF9idWZmZXJfaW5kaWNlcyk7CisgICAgICB9CisKKyAgICAgIGJvb2wgdGlja2VkID0gaG9zdF8tPlRpY2sobWVkaWFfY29kZWNfYnJpZGdlXy5nZXQoKSk7CisKKyAgICAgIGNhbl9wcm9jZXNzX2lucHV0ID0KKyAgICAgICAgICBwZW5kaW5nX3F1ZXVlX2lucHV0X2J1ZmZlcl90YXNrXyB8fAorICAgICAgICAgICghcGVuZGluZ190YXNrcy5lbXB0eSgpICYmICFpbnB1dF9idWZmZXJfaW5kaWNlcy5lbXB0eSgpKTsKKyAgICAgIGlmICghdGlja2VkICYmICFjYW5fcHJvY2Vzc19pbnB1dCAmJiBkZXF1ZXVlX291dHB1dF9yZXN1bHRzLmVtcHR5KCkpIHsKKyAgICAgICAgU2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOworICAgICAgICBDb2xsZWN0UGVuZGluZ0RhdGFfTG9ja2VkKCZwZW5kaW5nX3Rhc2tzLCAmaW5wdXRfYnVmZmVyX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcXVldWVfb3V0cHV0X3Jlc3VsdHMpOworICAgICAgICBjYW5fcHJvY2Vzc19pbnB1dCA9CisgICAgICAgICAgICAhcGVuZGluZ190YXNrcy5lbXB0eSgpICYmICFpbnB1dF9idWZmZXJfaW5kaWNlcy5lbXB0eSgpOworICAgICAgICBpZiAoIWNhbl9wcm9jZXNzX2lucHV0ICYmIGRlcXVldWVfb3V0cHV0X3Jlc3VsdHMuZW1wdHkoKSkgeworICAgICAgICAgIGNvbmRpdGlvbl92YXJpYWJsZV8uV2FpdFRpbWVkKGtTYlRpbWVNaWxsaXNlY29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAgIH0KIAogICBTQl9MT0coSU5GTykgPDwgIkRlc3Ryb3lpbmcgZGVjb2RlciB0aHJlYWQuIjsKK30KKwordm9pZCBNZWRpYURlY29kZXI6OkpvaW5PblRocmVhZHMoKSB7CisgIGRlc3Ryb3lpbmdfLnN0b3JlKHRydWUpOworICBjb25kaXRpb25fdmFyaWFibGVfLlNpZ25hbCgpOworCisgIGlmIChTYlRocmVhZElzVmFsaWQoZGVjb2Rlcl90aHJlYWRfKSkgeworICAgIFNiVGhyZWFkSm9pbihkZWNvZGVyX3RocmVhZF8sIE5VTEwpOworICAgIGRlY29kZXJfdGhyZWFkXyA9IGtTYlRocmVhZEludmFsaWQ7CisgIH0KKwogICBob3N0Xy0+T25GbHVzaGluZygpOwogICBqaW50IHN0YXR1cyA9IG1lZGlhX2NvZGVjX2JyaWRnZV8tPkZsdXNoKCk7CiAgIGlmIChzdGF0dXMgIT0gTUVESUFfQ09ERUNfT0spIHsKICAgICBTQl9MT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmx1c2ggbWVkaWEgY29kZWMuIjsKICAgfQorICBob3N0XyA9IE5VTEw7CiB9CiAKLXZvaWQgTWVkaWFEZWNvZGVyOjpKb2luT25EZWNvZGVyVGhyZWFkKCkgewotICBpZiAoIVNiVGhyZWFkSXNWYWxpZChkZWNvZGVyX3RocmVhZF8pKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGRlc3Ryb3lpbmdfLnN0b3JlKHRydWUpOwotICBTYlRocmVhZEpvaW4oZGVjb2Rlcl90aHJlYWRfLCBOVUxMKTsKLSAgZXZlbnRfcXVldWVfLkNsZWFyKCk7Ci0gIGRlY29kZXJfdGhyZWFkXyA9IGtTYlRocmVhZEludmFsaWQ7Cit2b2lkIE1lZGlhRGVjb2Rlcjo6Q29sbGVjdFBlbmRpbmdEYXRhX0xvY2tlZCgKKyAgICBzdGQ6OmRlcXVlPEV2ZW50PiogcGVuZGluZ190YXNrcywKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBpbnB1dF9idWZmZXJfaW5kaWNlcywKKyAgICBzdGQ6OnZlY3RvcjxEZXF1ZXVlT3V0cHV0UmVzdWx0PiogZGVxdWV1ZV9vdXRwdXRfcmVzdWx0cykgeworICBTQl9EQ0hFQ0socGVuZGluZ190YXNrcyk7CisgIFNCX0RDSEVDSyhpbnB1dF9idWZmZXJfaW5kaWNlcyk7CisgIFNCX0RDSEVDSyhkZXF1ZXVlX291dHB1dF9yZXN1bHRzKTsKKyAgbXV0ZXhfLkRDaGVja0FjcXVpcmVkKCk7CisKKyAgcGVuZGluZ190YXNrcy0+aW5zZXJ0KHBlbmRpbmdfdGFza3MtPmVuZCgpLCBwZW5kaW5nX3Rhc2tzXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ190YXNrc18uZW5kKCkpOworICBwZW5kaW5nX3Rhc2tzXy5jbGVhcigpOworCisgIGlucHV0X2J1ZmZlcl9pbmRpY2VzLT5pbnNlcnQoaW5wdXRfYnVmZmVyX2luZGljZXMtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2J1ZmZlcl9pbmRpY2VzXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2J1ZmZlcl9pbmRpY2VzXy5lbmQoKSk7CisgIGlucHV0X2J1ZmZlcl9pbmRpY2VzXy5jbGVhcigpOworCisgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdHMtPmluc2VydChkZXF1ZXVlX291dHB1dF9yZXN1bHRzLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdHNfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlX291dHB1dF9yZXN1bHRzXy5lbmQoKSk7CisgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdHNfLmNsZWFyKCk7CiB9CiAKLWJvb2wgTWVkaWFEZWNvZGVyOjpQcm9jZXNzT25lSW5wdXRCdWZmZXIoc3RkOjpkZXF1ZTxFdmVudD4qIHBlbmRpbmdfd29yaykgewotICBTQl9EQ0hFQ0socGVuZGluZ193b3JrKTsKLSAgaWYgKHBlbmRpbmdfd29yay0+ZW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNCX0NIRUNLKG1lZGlhX2NvZGVjX2JyaWRnZV8pOworYm9vbCBNZWRpYURlY29kZXI6OlByb2Nlc3NPbmVJbnB1dEJ1ZmZlcigKKyAgICBzdGQ6OmRlcXVlPEV2ZW50PiogcGVuZGluZ190YXNrcywKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBpbnB1dF9idWZmZXJfaW5kaWNlcykgeworICBTQl9EQ0hFQ0sobWVkaWFfY29kZWNfYnJpZGdlXyk7CiAKICAgLy8gRHVyaW5nIHNlY3VyZSBwbGF5YmFjaywgYW5kIG9ubHkgc2VjdXJlIHBsYXliYWNrLCBpcyBpcyBwb3NzaWJsZSB0aGF0IG91cgogICAvLyBhdHRlbXB0IHRvIGVucXVldWUgYW4gaW5wdXQgYnVmZmVyIHdpbGwgYmUgcmVqZWN0ZWQgYnkgTWVkaWFDb2RlYyBiZWNhdXNlCkBAIC0yNTUsMTQgKzM2MCwxMSBAQAogICAgIHBlbmRpbmdfcXVldWVfaW5wdXRfYnVmZmVyX3Rhc2tfID0gbnVsbG9wdF90KCk7CiAgICAgaW5wdXRfYnVmZmVyX2FscmVhZHlfd3JpdHRlbiA9IHRydWU7CiAgIH0gZWxzZSB7Ci0gICAgZGVxdWV1ZV9pbnB1dF9yZXN1bHQgPQotICAgICAgICBtZWRpYV9jb2RlY19icmlkZ2VfLT5EZXF1ZXVlSW5wdXRCdWZmZXIoa0RlcXVldWVUaW1lb3V0KTsKLSAgICBldmVudCA9IHBlbmRpbmdfd29yay0+ZnJvbnQoKTsKLSAgICBpZiAoZGVxdWV1ZV9pbnB1dF9yZXN1bHQuaW5kZXggPCAwKSB7Ci0gICAgICBIYW5kbGVFcnJvcigiZGVxdWV1ZUlucHV0QnVmZmVyIiwgZGVxdWV1ZV9pbnB1dF9yZXN1bHQuc3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcGVuZGluZ193b3JrLT5wb3BfZnJvbnQoKTsKKyAgICBkZXF1ZXVlX2lucHV0X3Jlc3VsdC5pbmRleCA9IGlucHV0X2J1ZmZlcl9pbmRpY2VzLT5mcm9udCgpOworICAgIGlucHV0X2J1ZmZlcl9pbmRpY2VzLT5lcmFzZShpbnB1dF9idWZmZXJfaW5kaWNlcy0+YmVnaW4oKSk7CisgICAgZXZlbnQgPSBwZW5kaW5nX3Rhc2tzLT5mcm9udCgpOworICAgIHBlbmRpbmdfdGFza3MtPnBvcF9mcm9udCgpOworICAgIG51bWJlcl9vZl9wZW5kaW5nX3Rhc2tzXy5kZWNyZW1lbnQoKTsKICAgfQogCiAgIFNCX0RDSEVDSyhldmVudC50eXBlID09IEV2ZW50OjprV3JpdGVDb2RlY0NvbmZpZyB8fApAQCAtMjcwLDcgKzM3Miw3IEBACiAgICAgICAgICAgICBldmVudC50eXBlID09IEV2ZW50OjprV3JpdGVFbmRPZlN0cmVhbSk7CiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIgPSBldmVudC5pbnB1dF9idWZmZXI7CiAgIGlmIChldmVudC50eXBlID09IEV2ZW50OjprV3JpdGVFbmRPZlN0cmVhbSkgewotICAgIFNCX0RDSEVDSyhwZW5kaW5nX3dvcmstPmVtcHR5KCkpOworICAgIFNCX0RDSEVDSyhwZW5kaW5nX3Rhc2tzLT5lbXB0eSgpKTsKICAgfQogICBjb25zdCB2b2lkKiBkYXRhID0gTlVMTDsKICAgaW50IHNpemUgPSAwOwpAQCAtMzMwLDM1ICs0MzIsNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBNZWRpYURlY29kZXI6OkRlcXVldWVBbmRQcm9jZXNzT3V0cHV0QnVmZmVyKCkgewotICBTQl9DSEVDSyhtZWRpYV9jb2RlY19icmlkZ2VfKTsKLQotICBEZXF1ZXVlT3V0cHV0UmVzdWx0IGRlcXVldWVfb3V0cHV0X3Jlc3VsdCA9Ci0gICAgICBtZWRpYV9jb2RlY19icmlkZ2VfLT5EZXF1ZXVlT3V0cHV0QnVmZmVyKGtEZXF1ZXVlVGltZW91dCk7Ci0KLSAgLy8gTm90ZSB0aGF0IGlmIHRoZSB8aW5kZXh8IGZpZWxkIG9mIHxEZXF1ZXVlT3V0cHV0UmVzdWx0fCBpcyBuZWdhdGl2ZSwgdGhlbgotICAvLyBhbGwgZmllbGRzIG90aGVyIHRoYW4gfHN0YXR1c3wgYW5kIHxpbmRleHwgYXJlIGludmFsaWQuICBUaGlzIGlzCi0gIC8vIGVzcGVjaWFsbHkgaW1wb3J0YW50LCBhcyB0aGUgSmF2YSBzaWRlIG9mIHxNZWRpYUNvZGVjQnJpZGdlfCB3aWxsIHJldXNlCi0gIC8vIG9iamVjdHMgZm9yIHJldHVybmVkIHJlc3VsdHMgYmVoaW5kIHRoZSBzY2VuZXMuCi0gIGlmIChkZXF1ZXVlX291dHB1dF9yZXN1bHQuaW5kZXggPCAwKSB7Ci0gICAgaWYgKGRlcXVldWVfb3V0cHV0X3Jlc3VsdC5zdGF0dXMgPT0gTUVESUFfQ09ERUNfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICBob3N0Xy0+UmVmcmVzaE91dHB1dEZvcm1hdChtZWRpYV9jb2RlY19icmlkZ2VfLmdldCgpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChkZXF1ZXVlX291dHB1dF9yZXN1bHQuc3RhdHVzID09IE1FRElBX0NPREVDX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKLSAgICAgIFNCX0RMT0coSU5GTykgPDwgIk91dHB1dCBidWZmZXJzIGNoYW5nZWQsIHRyeWluZyB0byBkZXF1ZXVlIGFnYWluLiI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBIYW5kbGVFcnJvcigiZGVxdWV1ZU91dHB1dEJ1ZmZlciIsIGRlcXVldWVfb3V0cHV0X3Jlc3VsdC5zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGhvc3RfLT5Qcm9jZXNzT3V0cHV0QnVmZmVyKG1lZGlhX2NvZGVjX2JyaWRnZV8uZ2V0KCksIGRlcXVldWVfb3V0cHV0X3Jlc3VsdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCiB2b2lkIE1lZGlhRGVjb2Rlcjo6SGFuZGxlRXJyb3IoY29uc3QgY2hhciogYWN0aW9uX25hbWUsIGppbnQgc3RhdHVzKSB7CiAgIFNCX0RDSEVDSyhzdGF0dXMgIT0gTUVESUFfQ09ERUNfT0spOwogCkBAIC0zODgsNiArNDYxLDY2IEBACiAgIH0KIH0KIAordm9pZCBNZWRpYURlY29kZXI6Ok9uTWVkaWFDb2RlY0Vycm9yKGJvb2wgaXNfcmVjb3ZlcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc190cmFuc2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpYWdub3N0aWNfaW5mbykgeworICBTQl9MT0coV0FSTklORykgPDwgIk1lZGlhRGVjb2RlciBlbmNvdW50ZXJlZCAiCisgICAgICAgICAgICAgICAgICA8PCAoaXNfcmVjb3ZlcmFibGUgPyAicmVjb3ZlcmFibGUsICIgOiAidW5yZWNvdmVyYWJsZSwgIikKKyAgICAgICAgICAgICAgICAgIDw8IChpc190cmFuc2llbnQgPyAidHJhbnNpZW50ICIgOiAiaW50cmFuc2llbnQgIikKKyAgICAgICAgICAgICAgICAgIDw8ICIgZXJyb3Igd2l0aCBtZXNzYWdlOiAiIDw8IGRpYWdub3N0aWNfaW5mbzsKKworICBpZiAoIWlzX3RyYW5zaWVudCkgeworICAgIGVycm9yX2NiXyhrU2JQbGF5ZXJFcnJvckRlY29kZSwgIk9uTWVkaWFDb2RlY0Vycm9yIik7CisgIH0KK30KKwordm9pZCBNZWRpYURlY29kZXI6Ok9uTWVkaWFDb2RlY0lucHV0QnVmZmVyQXZhaWxhYmxlKGludCBidWZmZXJfaW5kZXgpIHsKKyAgaWYgKG1lZGlhX3R5cGVfID09IGtTYk1lZGlhVHlwZVZpZGVvICYmIGZpcnN0X2NhbGxfb25faGFuZGxlcl90aHJlYWRfKSB7CisgICAgLy8gU2V0IHRoZSB0aHJlYWQgcHJpb3JpdHkgb2YgdGhlIEhhbmRsZXIgdGhyZWFkIHRvIGRpc3BhdGNoIHRoZSBhc3luYworICAgIC8vIGRlY29kZXIgY2FsbGJhY2tzIHRvIGhpZ2guCisgICAgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6cHRocmVhZDo6VGhyZWFkU2V0UHJpb3JpdHkoa1NiVGhyZWFkUHJpb3JpdHlIaWdoKTsKKyAgICBmaXJzdF9jYWxsX29uX2hhbmRsZXJfdGhyZWFkXyA9IGZhbHNlOworICB9CisgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKKyAgaW5wdXRfYnVmZmVyX2luZGljZXNfLnB1c2hfYmFjayhidWZmZXJfaW5kZXgpOworICBpZiAoaW5wdXRfYnVmZmVyX2luZGljZXNfLnNpemUoKSA9PSAxKSB7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlXy5TaWduYWwoKTsKKyAgfQorfQorCit2b2lkIE1lZGlhRGVjb2Rlcjo6T25NZWRpYUNvZGVjT3V0cHV0QnVmZmVyQXZhaWxhYmxlKAorICAgIGludCBidWZmZXJfaW5kZXgsCisgICAgaW50IGZsYWdzLAorICAgIGludCBvZmZzZXQsCisgICAgaW50NjRfdCBwcmVzZW50YXRpb25fdGltZV91cywKKyAgICBpbnQgc2l6ZSkgeworICBTQl9EQ0hFQ0sobWVkaWFfY29kZWNfYnJpZGdlXyk7CisgIFNCX0RDSEVDSyhidWZmZXJfaW5kZXggPj0gMCk7CisKKyAgRGVxdWV1ZU91dHB1dFJlc3VsdCBkZXF1ZXVlX291dHB1dF9yZXN1bHQ7CisgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdC5zdGF0dXMgPSAwOworICBkZXF1ZXVlX291dHB1dF9yZXN1bHQuaW5kZXggPSBidWZmZXJfaW5kZXg7CisgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdC5mbGFncyA9IGZsYWdzOworICBkZXF1ZXVlX291dHB1dF9yZXN1bHQub2Zmc2V0ID0gb2Zmc2V0OworICBkZXF1ZXVlX291dHB1dF9yZXN1bHQucHJlc2VudGF0aW9uX3RpbWVfbWljcm9zZWNvbmRzID0gcHJlc2VudGF0aW9uX3RpbWVfdXM7CisgIGRlcXVldWVfb3V0cHV0X3Jlc3VsdC5udW1fYnl0ZXMgPSBzaXplOworCisgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKKyAgZGVxdWV1ZV9vdXRwdXRfcmVzdWx0c18ucHVzaF9iYWNrKGRlcXVldWVfb3V0cHV0X3Jlc3VsdCk7CisgIGNvbmRpdGlvbl92YXJpYWJsZV8uU2lnbmFsKCk7Cit9CisKK3ZvaWQgTWVkaWFEZWNvZGVyOjpPbk1lZGlhQ29kZWNPdXRwdXRGb3JtYXRDaGFuZ2VkKCkgeworICBTQl9EQ0hFQ0sobWVkaWFfY29kZWNfYnJpZGdlXyk7CisKKyAgRGVxdWV1ZU91dHB1dFJlc3VsdCBkZXF1ZXVlX291dHB1dF9yZXN1bHQgPSB7fTsKKyAgZGVxdWV1ZV9vdXRwdXRfcmVzdWx0LmluZGV4ID0gLTE7CisKKyAgU2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOworICBkZXF1ZXVlX291dHB1dF9yZXN1bHRzXy5wdXNoX2JhY2soZGVxdWV1ZV9vdXRwdXRfcmVzdWx0KTsKKyAgY29uZGl0aW9uX3ZhcmlhYmxlXy5TaWduYWwoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfZGVjb2Rlci5oIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmgKaW5kZXggYjUwNGFlNi4uMzU3N2U4MyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmgKQEAgLTE4LDE1ICsxOCwxNyBAQAogI2luY2x1ZGUgPGpuaS5oPgogCiAjaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2RybV9zeXN0ZW0uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29kZWNfYnJpZGdlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vb3B0aW9uYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmRpdGlvbl92YXJpYWJsZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvY29tbW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oIgpAQCAtMzgsNyArNDAsNyBAQAogCiAvLyBUT0RPOiBCZXR0ZXIgZW5jYXBzdWxhdGlvbiB0aGUgTWVkaWFDb2RlY0JyaWRnZSBzbyB0aGUgZGVjb2RlcnMgbm8gbG9uZ2VyCiAvLyAgICAgICBuZWVkIHRvIHRhbGsgZGlyZWN0bHkgdG8gdGhlIE1lZGlhQ29kZWNCcmlkZ2UuCi1jbGFzcyBNZWRpYURlY29kZXIgeworY2xhc3MgTWVkaWFEZWNvZGVyIDogcHJpdmF0ZSBNZWRpYUNvZGVjQnJpZGdlOjpIYW5kbGVyIHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OmZpbHRlcjo6RXJyb3JDQiBFcnJvckNCOwogICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpJbnB1dEJ1ZmZlciBJbnB1dEJ1ZmZlcjsKQEAgLTgyLDcgKzg0LDkgQEAKICAgdm9pZCBXcml0ZUlucHV0QnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIpOwogICB2b2lkIFdyaXRlRW5kT2ZTdHJlYW0oKTsKIAotICBzaXplX3QgR2V0TnVtYmVyT2ZQZW5kaW5nVGFza3MoKSBjb25zdCB7IHJldHVybiBldmVudF9xdWV1ZV8uc2l6ZSgpOyB9CisgIHNpemVfdCBHZXROdW1iZXJPZlBlbmRpbmdUYXNrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtYmVyX29mX3BlbmRpbmdfdGFza3NfLmxvYWQoKTsKKyAgfQogCiAgIGJvb2wgaXNfdmFsaWQoKSBjb25zdCB7IHJldHVybiBtZWRpYV9jb2RlY19icmlkZ2VfICE9IE5VTEw7IH0KIApAQCAtMTE2LDQxICsxMjAsNjIgQEAKICAgICBFdmVudCBldmVudDsKICAgfTsKIAotICBzdGF0aWMgdm9pZCogVGhyZWFkRW50cnlQb2ludCh2b2lkKiBjb250ZXh0KTsKKyAgc3RhdGljIHZvaWQqIERlY29kZXJUaHJlYWRFbnRyeVBvaW50KHZvaWQqIGNvbnRleHQpOwogICB2b2lkIERlY29kZXJUaHJlYWRGdW5jKCk7Ci0gIHZvaWQgSm9pbk9uRGVjb2RlclRocmVhZCgpOworCisgIHZvaWQgSm9pbk9uVGhyZWFkcygpOwogCiAgIHZvaWQgVGVhcmRvd25Db2RlYygpOwogCi0gIGJvb2wgUHJvY2Vzc09uZUlucHV0QnVmZmVyKHN0ZDo6ZGVxdWU8RXZlbnQ+KiBwZW5kaW5nX3dvcmspOwotICAvLyBBdHRlbXB0IHRvIGRlcXVldWUgYSBtZWRpYSBjb2RlYyBvdXRwdXQgYnVmZmVyLiAgUmV0dXJucyB3aGV0aGVyIHRoZQotICAvLyBwcm9jZXNzaW5nIHNob3VsZCBjb250aW51ZS4gIElmIGEgdmFsaWQgYnVmZmVyIGlzIGRlcXVldWVkLCBpdCB3aWxsIGNhbGwKLSAgLy8gUHJvY2Vzc091dHB1dEJ1ZmZlcigpIG9uIGhvc3QgaW50ZXJuYWxseS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgotICAvLyBQcm9jZXNzT3V0cHV0QnVmZmVyKCkgdG8gcmVsZWFzZSB0aGUgb3V0cHV0IGJ1ZmZlciBiYWNrIHRvIHRoZSBzeXN0ZW0uCi0gIGJvb2wgRGVxdWV1ZUFuZFByb2Nlc3NPdXRwdXRCdWZmZXIoKTsKLQorICB2b2lkIENvbGxlY3RQZW5kaW5nRGF0YV9Mb2NrZWQoCisgICAgICBzdGQ6OmRlcXVlPEV2ZW50PiogcGVuZGluZ190YXNrcywKKyAgICAgIHN0ZDo6dmVjdG9yPGludD4qIGlucHV0X2J1ZmZlcl9pbmRpY2VzLAorICAgICAgc3RkOjp2ZWN0b3I8RGVxdWV1ZU91dHB1dFJlc3VsdD4qIGRlcXVldWVfb3V0cHV0X3Jlc3VsdHMpOworICBib29sIFByb2Nlc3NPbmVJbnB1dEJ1ZmZlcihzdGQ6OmRlcXVlPEV2ZW50PiogcGVuZGluZ190YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiogaW5wdXRfYnVmZmVyX2luZGljZXMpOwogICB2b2lkIEhhbmRsZUVycm9yKGNvbnN0IGNoYXIqIGFjdGlvbl9uYW1lLCBqaW50IHN0YXR1cyk7CiAKKyAgLy8gTWVkaWFDb2RlY0JyaWRnZTo6SGFuZGxlciBtZXRob2RzCisgIC8vIE5vdGUgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgZnJvbSB0aGUgZGVmYXVsdCBsb29wZXIgYW5kIGlzIG5vdCBvbgorICAvLyB0aGUgZGVjb2RlciB0aHJlYWQuCisgIHZvaWQgT25NZWRpYUNvZGVjRXJyb3IoYm9vbCBpc19yZWNvdmVyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3RyYW5zaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGlhZ25vc3RpY19pbmZvKSBvdmVycmlkZTsKKyAgdm9pZCBPbk1lZGlhQ29kZWNJbnB1dEJ1ZmZlckF2YWlsYWJsZShpbnQgYnVmZmVyX2luZGV4KSBvdmVycmlkZTsKKyAgdm9pZCBPbk1lZGlhQ29kZWNPdXRwdXRCdWZmZXJBdmFpbGFibGUoaW50IGJ1ZmZlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHByZXNlbnRhdGlvbl90aW1lX3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25NZWRpYUNvZGVjT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpIG92ZXJyaWRlOworCiAgIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CiAKICAgY29uc3QgU2JNZWRpYVR5cGUgbWVkaWFfdHlwZV87CiAgIEhvc3QqIGhvc3RfOwogICBFcnJvckNCIGVycm9yX2NiXzsKIAotICAvLyBXb3JraW5nIHRocmVhZCB0byBhdm9pZCBsZW5ndGh5IGRlY29kaW5nIHdvcmsgYmxvY2sgdGhlIHBsYXllciB0aHJlYWQuCi0gIFNiVGhyZWFkIGRlY29kZXJfdGhyZWFkXzsKLSAgc2NvcGVkX3B0cjxNZWRpYUNvZGVjQnJpZGdlPiBtZWRpYV9jb2RlY19icmlkZ2VfOwotCi0gIGJvb2wgc3RyZWFtX2VuZGVkXzsKKyAgYXRvbWljX2Jvb2wgc3RyZWFtX2VuZGVkXzsKIAogICBEcm1TeXN0ZW0qIGRybV9zeXN0ZW1fOwogCi0gIC8vIEV2ZW50cyBhcmUgcHJvY2Vzc2VkIGluIGEgcXVldWUsIGV4Y2VwdCBmb3Igd2hlbiBoYW5kbGluZyBldmVudHMgb2YgdHlwZQotICAvLyB8a1Jlc2V0fCwgd2hpY2ggYXJlIGFsbG93ZWQgdG8gY3V0IHRvIHRoZSBmcm9udC4KLSAgRXZlbnRRdWV1ZTxFdmVudD4gZXZlbnRfcXVldWVfOwogICBhdG9taWNfYm9vbCBkZXN0cm95aW5nXzsKIAogICBvcHRpb25hbDxRdWV1ZUlucHV0QnVmZmVyVGFzaz4gcGVuZGluZ19xdWV1ZV9pbnB1dF9idWZmZXJfdGFza187CisKKyAgYXRvbWljX2ludDMyX3QgbnVtYmVyX29mX3BlbmRpbmdfdGFza3NfOworCisgIE11dGV4IG11dGV4XzsKKyAgQ29uZGl0aW9uVmFyaWFibGUgY29uZGl0aW9uX3ZhcmlhYmxlXzsKKyAgc3RkOjpkZXF1ZTxFdmVudD4gcGVuZGluZ190YXNrc187CisgIHN0ZDo6dmVjdG9yPGludD4gaW5wdXRfYnVmZmVyX2luZGljZXNfOworICBzdGQ6OnZlY3RvcjxEZXF1ZXVlT3V0cHV0UmVzdWx0PiBkZXF1ZXVlX291dHB1dF9yZXN1bHRzXzsKKworICBib29sIGZpcnN0X2NhbGxfb25faGFuZGxlcl90aHJlYWRfID0gdHJ1ZTsKKworICAvLyBXb3JraW5nIHRocmVhZCB0byBhdm9pZCBsZW5ndGh5IGRlY29kaW5nIHdvcmsgYmxvY2sgdGhlIHBsYXllciB0aHJlYWQuCisgIFNiVGhyZWFkIGRlY29kZXJfdGhyZWFkXyA9IGtTYlRocmVhZEludmFsaWQ7CisgIHNjb3BlZF9wdHI8TWVkaWFDb2RlY0JyaWRnZT4gbWVkaWFfY29kZWNfYnJpZGdlXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9pc19hdWRpb19zdXBwb3J0ZWQuY2MKaW5kZXggODk5NDk2NS4uMjI3ODY1ZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9pc19hdWRpb19zdXBwb3J0ZWQuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9pc19hdWRpb19zdXBwb3J0ZWQuY2MKQEAgLTI1LDYgKzI1LDExIEBACiAKIFNCX0VYUE9SVCBib29sIFNiTWVkaWFJc0F1ZGlvU3VwcG9ydGVkKFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlKSB7CisgIC8vIEFuZHJvaWQgbm93IHVzZXMgbGlib3B1cyBiYXNlZCBvcHVzIGRlY29kZXIuCisgIGlmIChhdWRpb19jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzICYmCisgICAgICBiaXRyYXRlIDwgU0JfTUVESUFfTUFYX0FVRElPX0JJVFJBVEVfSU5fQklUU19QRVJfU0VDT05EKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KICAgY29uc3QgY2hhciogbWltZSA9IFN1cHBvcnRlZEF1ZGlvQ29kZWNUb01pbWVUeXBlKGF1ZGlvX2NvZGVjKTsKICAgaWYgKCFtaW1lKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9pc19zdXBwb3J0ZWQuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2lzX3N1cHBvcnRlZC5jYwppbmRleCBjN2IxNTBhLi40NzUwZDAzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2lzX3N1cHBvcnRlZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2lzX3N1cHBvcnRlZC5jYwpAQCAtMjIsNiArMjIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXlfc3lzdGVtKSB7CiAgIHVzaW5nIHN0YXJib2FyZDo6YW5kcm9pZDo6c2hhcmVkOjpJc1dpZGV2aW5lOwogICB1c2luZyBzdGFyYm9hcmQ6OmFuZHJvaWQ6OnNoYXJlZDo6Sm5pRW52RXh0OworICAvLyBGaWx0ZXIgYW55dGhpbmcgb3RoZXIgdGhlbiBhYWMgYXMgd2Ugb25seSBzdXBwb3J0IHBhaWQgY29udGVudCBvbiBhYWMuCisgIC8vIFRPRE86IEFkZCBzdXBwb3J0IG9mIE9wdXMgaWYgd2UgYXJlIGdvaW5nIHRvIHN1cHBvcnQgc29mdHdhcmUgYmFzZWQgZHJtCisgIC8vIHN5c3RlbXMuCisgIGlmIChhdWRpb19jb2RlYyAhPSBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lICYmCisgICAgICBhdWRpb19jb2RlYyAhPSBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KICAgaWYgKCFJc1dpZGV2aW5lKGtleV9zeXN0ZW0pKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX3NlcnZpY2UuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX3NlcnZpY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2NjI3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fc2VydmljZS5jYwpAQCAtMCwwICsxLDE2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX3NlcnZpY2UuaCIKKworI2luY2x1ZGUgImNvYmFsdC9leHRlbnNpb24vcGxhdGZvcm1fc2VydmljZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9qbmlfZW52X2V4dC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9qbmlfdXRpbHMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL29uY2UuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisKK3R5cGVkZWYgc3RydWN0IENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZVByaXZhdGUgeworICB2b2lkKiBjb250ZXh0OworICBSZWNlaXZlTWVzc2FnZUNhbGxiYWNrIHJlY2VpdmVfY2FsbGJhY2s7CisgIGNvbnN0IGNoYXIqIG5hbWU7CisgIGpvYmplY3QgY29iYWx0X3NlcnZpY2U7CisKKyAgfkNvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZVByaXZhdGUoKSB7CisgICAgaWYgKG5hbWUpIHsKKyAgICAgIGRlbGV0ZSBuYW1lOworICAgIH0KKyAgfQorfSBDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VQcml2YXRlOworCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworCituYW1lc3BhY2UgeworCit1c2luZyBzdGFyYm9hcmQ6OmFuZHJvaWQ6OnNoYXJlZDo6U2NvcGVkTG9jYWxKYXZhUmVmOwordXNpbmcgc3RhcmJvYXJkOjphbmRyb2lkOjpzaGFyZWQ6OkpuaUVudkV4dDsKKworYm9vbCBpc19pbml0aWFsaXplZCA9IGZhbHNlOworCitib29sIEhhcyhjb25zdCBjaGFyKiBuYW1lKSB7CisgIEpuaUVudkV4dCogZW52ID0gSm5pRW52RXh0OjpHZXQoKTsKKyAgU2NvcGVkTG9jYWxKYXZhUmVmPGpzdHJpbmc+IGpfbmFtZShlbnYtPk5ld1N0cmluZ1N0YW5kYXJkVVRGT3JBYm9ydChuYW1lKSk7CisgIGpib29sZWFuIGpfaGFzID0gZW52LT5DYWxsU3RhcmJvYXJkQm9vbGVhbk1ldGhvZE9yQWJvcnQoCisgICAgICAiaGFzQ29iYWx0U2VydmljZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCBqX25hbWUuR2V0KCkpOworICByZXR1cm4gal9oYXM7Cit9CisKK0NvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZSBPcGVuKHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZU1lc3NhZ2VDYWxsYmFjayByZWNlaXZlX2NhbGxiYWNrKSB7CisgIFNCX0RDSEVDSyhjb250ZXh0KTsKKyAgSm5pRW52RXh0KiBlbnYgPSBKbmlFbnZFeHQ6OkdldCgpOworCisgIGlmICghSGFzKG5hbWUpKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiQ2FuJ3Qgb3BlbiBTZXJ2aWNlICIgPDwgbmFtZTsKKyAgICByZXR1cm4ga0NvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZUludmFsaWQ7CisgIH0KKyAgQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlIHNlcnZpY2UgPQorICAgICAgbmV3IENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZVByaXZhdGUoCisgICAgICAgICAge2NvbnRleHQsIHJlY2VpdmVfY2FsbGJhY2ssIG5hbWV9KTsKKyAgU2NvcGVkTG9jYWxKYXZhUmVmPGpzdHJpbmc+IGpfbmFtZShlbnYtPk5ld1N0cmluZ1N0YW5kYXJkVVRGT3JBYm9ydChuYW1lKSk7CisgIGpvYmplY3QgY29iYWx0X3NlcnZpY2UgPSBlbnYtPkNhbGxTdGFyYm9hcmRPYmplY3RNZXRob2RPckFib3J0KAorICAgICAgIm9wZW5Db2JhbHRTZXJ2aWNlIiwKKyAgICAgICIoSkxqYXZhL2xhbmcvU3RyaW5nOylMZGV2L2NvYmFsdC9jb2F0L0NvYmFsdFNlcnZpY2U7IiwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8amxvbmc+KHNlcnZpY2UpLCBqX25hbWUuR2V0KCkpOworICBpZiAoIWNvYmFsdF9zZXJ2aWNlKSB7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZVByaXZhdGUqPihzZXJ2aWNlKTsKKyAgICByZXR1cm4ga0NvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZUludmFsaWQ7CisgIH0KKyAgc2VydmljZS0+Y29iYWx0X3NlcnZpY2UgPSBjb2JhbHRfc2VydmljZTsKKyAgcmV0dXJuIHNlcnZpY2U7Cit9CisKK3ZvaWQgQ2xvc2UoQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlIHNlcnZpY2UpIHsKKyAgSm5pRW52RXh0KiBlbnYgPSBKbmlFbnZFeHQ6OkdldCgpOworICBlbnYtPkNhbGxWb2lkTWV0aG9kT3JBYm9ydChzZXJ2aWNlLT5jb2JhbHRfc2VydmljZSwgImNsb3NlIiwgIigpViIpOworICBTY29wZWRMb2NhbEphdmFSZWY8anN0cmluZz4gal9uYW1lKAorICAgICAgZW52LT5OZXdTdHJpbmdTdGFuZGFyZFVURk9yQWJvcnQoc2VydmljZS0+bmFtZSkpOworICBlbnYtPkNhbGxTdGFyYm9hcmRWb2lkTWV0aG9kT3JBYm9ydCgiY2xvc2VDb2JhbHRTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZzspViIsIGpfbmFtZS5HZXQoKSk7CisgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VQcml2YXRlKj4oc2VydmljZSk7Cit9CisKK3ZvaWQqIFNlbmQoQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlIHNlcnZpY2UsCisgICAgICAgICAgIHZvaWQqIGRhdGEsCisgICAgICAgICAgIHVpbnQ2NF90IGxlbmd0aCwKKyAgICAgICAgICAgdWludDY0X3QqIG91dHB1dF9sZW5ndGgsCisgICAgICAgICAgIGJvb2wqIGludmFsaWRfc3RhdGUpIHsKKyAgU0JfRENIRUNLKGRhdGEpOworICBTQl9EQ0hFQ0sob3V0cHV0X2xlbmd0aCk7CisgIFNCX0RDSEVDSyhpbnZhbGlkX3N0YXRlKTsKKworICBKbmlFbnZFeHQqIGVudiA9IEpuaUVudkV4dDo6R2V0KCk7CisgIFNjb3BlZExvY2FsSmF2YVJlZjxqYnl0ZUFycmF5PiBkYXRhX2J5dGVfYXJyYXk7CisgIGRhdGFfYnl0ZV9hcnJheS5SZXNldCgKKyAgICAgIGVudi0+TmV3Qnl0ZUFycmF5RnJvbVJhdyhyZWludGVycHJldF9jYXN0PGNvbnN0IGpieXRlKj4oZGF0YSksIGxlbmd0aCkpOworICBqb2JqZWN0IGpfcmVzcG9uc2VfZnJvbV9jbGllbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8amJ5dGVBcnJheT4oZW52LT5DYWxsT2JqZWN0TWV0aG9kT3JBYm9ydCgKKyAgICAgICAgICBzZXJ2aWNlLT5jb2JhbHRfc2VydmljZSwgInJlY2VpdmVGcm9tQ2xpZW50IiwKKyAgICAgICAgICAiKFtCKUxkZXYvY29iYWx0L2NvYXQvQ29iYWx0U2VydmljZSRSZXNwb25zZVRvQ2xpZW50OyIsCisgICAgICAgICAgZGF0YV9ieXRlX2FycmF5LkdldCgpKSk7CisgIGlmICghal9yZXNwb25zZV9mcm9tX2NsaWVudCkgeworICAgICppbnZhbGlkX3N0YXRlID0gdHJ1ZTsKKyAgICAqb3V0cHV0X2xlbmd0aCA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgKmludmFsaWRfc3RhdGUgPQorICAgICAgZW52LT5HZXRCb29sZWFuRmllbGRPckFib3J0KGpfcmVzcG9uc2VfZnJvbV9jbGllbnQsICJpbnZhbGlkU3RhdGUiLCAiWiIpOworICBqYnl0ZUFycmF5IGpfb3V0X2RhdGFfYXJyYXkgPSBzdGF0aWNfY2FzdDxqYnl0ZUFycmF5PigKKyAgICAgIGVudi0+R2V0T2JqZWN0RmllbGRPckFib3J0KGpfcmVzcG9uc2VfZnJvbV9jbGllbnQsICJkYXRhIiwgIltCIikpOworICAqb3V0cHV0X2xlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoal9vdXRfZGF0YV9hcnJheSk7CisgIGNoYXIqIG91dHB1dCA9IG5ldyBjaGFyWypvdXRwdXRfbGVuZ3RoXTsKKyAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oal9vdXRfZGF0YV9hcnJheSwgMCwgKm91dHB1dF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8amJ5dGUqPihvdXRwdXQpKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworU0JfT05DRV9JTklUSUFMSVpFX0ZVTkNUSU9OKENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZUFwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRPckNyZWF0ZVBsYXRmb3JtU2VydmljZUFwaSk7Cit9ICAvLyBuYW1lc3BhY2UKKworZXh0ZXJuICJDIiBTQl9FWFBPUlRfUExBVEZPUk0gdm9pZAorSmF2YV9kZXZfY29iYWx0X2NvYXRfQ29iYWx0U2VydmljZV9uYXRpdmVTZW5kVG9DbGllbnQoSm5pRW52RXh0KiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGpjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyBuYXRpdmVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBqX2RhdGEpIHsKKyAgQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlIHNlcnZpY2UgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2U+KG5hdGl2ZVNlcnZpY2UpOworICBTQl9EQ0hFQ0soQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlSXNWYWxpZChzZXJ2aWNlKSk7CisKKyAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChqX2RhdGEpOworICBjaGFyKiBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oal9kYXRhLCAwLCBsZW5ndGgsIHJlaW50ZXJwcmV0X2Nhc3Q8amJ5dGUqPihkYXRhKSk7CisKKyAgc2VydmljZS0+cmVjZWl2ZV9jYWxsYmFjayhzZXJ2aWNlLT5jb250ZXh0LCBkYXRhLCBsZW5ndGgpOworfQorCit2b2lkKiBHZXRQbGF0Zm9ybVNlcnZpY2VBcGkoKSB7CisgIENvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZUFwaSogcGxhdGZvcm1fc2VydmljZV9hcGkgPQorICAgICAgR2V0T3JDcmVhdGVQbGF0Zm9ybVNlcnZpY2VBcGkoKTsKKyAgaWYgKCFpc19pbml0aWFsaXplZCkgeworICAgIHBsYXRmb3JtX3NlcnZpY2VfYXBpLT5rTmFtZSA9IGtDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VOYW1lOworICAgIHBsYXRmb3JtX3NlcnZpY2VfYXBpLT5rVmVyc2lvbiA9IGtQbGF0Zm9ybVNlcnZpY2VFeHRlbnNpb25WZXJzaW9uOworICAgIHBsYXRmb3JtX3NlcnZpY2VfYXBpLT5IYXMgPSAmSGFzOworICAgIHBsYXRmb3JtX3NlcnZpY2VfYXBpLT5PcGVuID0gJk9wZW47CisgICAgcGxhdGZvcm1fc2VydmljZV9hcGktPkNsb3NlID0gJkNsb3NlOworICAgIHBsYXRmb3JtX3NlcnZpY2VfYXBpLT5TZW5kID0gJlNlbmQ7CisKKyAgICBpc19pbml0aWFsaXplZCA9IHRydWU7CisgIH0KKyAgcmV0dXJuIHBsYXRmb3JtX3NlcnZpY2VfYXBpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9wbGF0Zm9ybV9zZXJ2aWNlLmggYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWI0NDhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9wbGF0Zm9ybV9zZXJ2aWNlLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFNUQVJCT0FSRF9BTkRST0lEX1NIQVJFRF9QTEFURk9STV9TRVJWSUNFX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9BTkRST0lEX1NIQVJFRF9QTEFURk9STV9TRVJWSUNFX0hfCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNoYXJlZCB7CisKK2NvbnN0ZXhwciBpbnQga1BsYXRmb3JtU2VydmljZUV4dGVuc2lvblZlcnNpb24gPSAxOworCit2b2lkKiBHZXRQbGF0Zm9ybVNlcnZpY2VBcGkoKTsKKworfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfQU5EUk9JRF9TSEFSRURfUExBVEZPUk1fU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjCmluZGV4IDBkMTQxMTMuLjZmZjZkM2IgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9vcHVzL29wdXNfYXVkaW9fZGVjb2Rlci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2luay5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2lua19pbXBsLmgiCkBAIC00MSwxOCArNDIsMjMgQEAKICAgICAgIGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgYXVkaW9fcGFyYW1ldGVycywKICAgICAgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiogYXVkaW9fZGVjb2RlciwKICAgICAgIHNjb3BlZF9wdHI8QXVkaW9SZW5kZXJlclNpbms+KiBhdWRpb19yZW5kZXJlcl9zaW5rKSBvdmVycmlkZSB7Ci0gICAgdXNpbmcgQXVkaW9EZWNvZGVySW1wbCA9IDo6c3RhcmJvYXJkOjphbmRyb2lkOjpzaGFyZWQ6OkF1ZGlvRGVjb2RlcjsKKyAgICB1c2luZyBBYWNBdWRpb0RlY29kZXIgPSA6OnN0YXJib2FyZDo6YW5kcm9pZDo6c2hhcmVkOjpBdWRpb0RlY29kZXI7CisgICAgdXNpbmcgT3B1c0F1ZGlvRGVjb2RlciA9IDo6c3RhcmJvYXJkOjpzaGFyZWQ6Om9wdXM6Ok9wdXNBdWRpb0RlY29kZXI7CiAKICAgICBTQl9EQ0hFQ0soYXVkaW9fZGVjb2Rlcik7CiAgICAgU0JfRENIRUNLKGF1ZGlvX3JlbmRlcmVyX3NpbmspOwogCi0gICAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXJJbXBsPiBhdWRpb19kZWNvZGVyX2ltcGwobmV3IEF1ZGlvRGVjb2RlckltcGwoCi0gICAgICAgIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9fY29kZWMsIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9faGVhZGVyLAotICAgICAgICBhdWRpb19wYXJhbWV0ZXJzLmRybV9zeXN0ZW0pKTsKLSAgICBpZiAoYXVkaW9fZGVjb2Rlcl9pbXBsLT5pc192YWxpZCgpKSB7Ci0gICAgICBhdWRpb19kZWNvZGVyLT5yZXNldChhdWRpb19kZWNvZGVyX2ltcGwucmVsZWFzZSgpKTsKKyAgICBpZiAoYXVkaW9fcGFyYW1ldGVycy5hdWRpb19jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzKSB7CisgICAgICBhdWRpb19kZWNvZGVyLT5yZXNldChuZXcgT3B1c0F1ZGlvRGVjb2RlcihhdWRpb19wYXJhbWV0ZXJzLmF1ZGlvX2hlYWRlcikpOwogICAgIH0gZWxzZSB7Ci0gICAgICBhdWRpb19kZWNvZGVyLT5yZXNldCgpOworICAgICAgc2NvcGVkX3B0cjxBYWNBdWRpb0RlY29kZXI+IGF1ZGlvX2RlY29kZXJfaW1wbChuZXcgQWFjQXVkaW9EZWNvZGVyKAorICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9fY29kZWMsIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9faGVhZGVyLAorICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnMuZHJtX3N5c3RlbSkpOworICAgICAgaWYgKGF1ZGlvX2RlY29kZXJfaW1wbC0+aXNfdmFsaWQoKSkgeworICAgICAgICBhdWRpb19kZWNvZGVyLT5yZXNldChhdWRpb19kZWNvZGVyX2ltcGwucmVsZWFzZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF1ZGlvX2RlY29kZXItPnJlc2V0KCk7CisgICAgICB9CiAgICAgfQogICAgIGF1ZGlvX3JlbmRlcmVyX3NpbmstPnJlc2V0KG5ldyBBdWRpb1JlbmRlcmVyU2lua0ltcGwpOwogICB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXllcl9jcmVhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXllcl9jcmVhdGUuY2MKaW5kZXggN2RiNGI2MS4uNGExYjE4OSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9wbGF5ZXJfY3JlYXRlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxheWVyX2NyZWF0ZS5jYwpAQCAtNjAsMTIgKzYwLDEzIEBACiAgIH0KIAogICBpZiAoYXVkaW9fY29kZWMgIT0ga1NiTWVkaWFBdWRpb0NvZGVjTm9uZSAmJgotICAgICAgYXVkaW9fY29kZWMgIT0ga1NiTWVkaWFBdWRpb0NvZGVjQWFjKSB7CisgICAgICBhdWRpb19jb2RlYyAhPSBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMgJiYKKyAgICAgIGF1ZGlvX2NvZGVjICE9IGtTYk1lZGlhQXVkaW9Db2RlY09wdXMpIHsKICAgICBTQl9MT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCBhdWRpbyBjb2RlYyAiIDw8IGF1ZGlvX2NvZGVjOwogICAgIHJldHVybiBrU2JQbGF5ZXJJbnZhbGlkOwogICB9CiAKLSAgaWYgKGF1ZGlvX2NvZGVjICE9IGtTYk1lZGlhQXVkaW9Db2RlY05vbmUgJiYgIWF1ZGlvX2hlYWRlcikgeworICBpZiAoYXVkaW9fY29kZWMgPT0ga1NiTWVkaWFBdWRpb0NvZGVjQWFjICYmICFhdWRpb19oZWFkZXIpIHsKICAgICBTQl9MT0coRVJST1IpIDw8ICJTYlBsYXllckNyZWF0ZSgpIHJlcXVpcmVzIGEgbm9uLU5VTEwgU2JNZWRpYUF1ZGlvSGVhZGVyICIKICAgICAgICAgICAgICAgICAgIDw8ICJ3aGVuIHxhdWRpb19jb2RlY3wgaXMgbm90IGtTYk1lZGlhQXVkaW9Db2RlY05vbmUiOwogICAgIHJldHVybiBrU2JQbGF5ZXJJbnZhbGlkOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc1MTE1Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIm5ldC9iYXNlL25ldF91dGlsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2puaV9lbnZfZXh0LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6YW5kcm9pZDo6c2hhcmVkOjpKbmlFbnZFeHQ7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHNpemVfdCBrRGVmYXVsdFByZWZpeExlbmd0aCA9IDg7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGFuIGluY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBmb3IKLS8vIFNiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzcy4gIFNwZWNpZmljYWxseSwgdGhpbmdzIG1pc3NpbmcgYXJlOgotLy8gV2Ugc2hvdWxkIHNlZSBpZiB0aGUgZGVzdGluYXRpb24gaXMgTlVMTCwgb3IgQU5ZIGFkZHJlc3MsIG9yIGEgcmVndWxhcgotLy8gdW5pY2FzdCBhZGRyZXNzLgotLy8gQWxzbywgY3VycmVudGx5LCB3ZSBhc3N1bWUgbmV0bWFzayBpcyAyNTUuMjU1LjI1NS4wIGluIElQdjQsIGFuZAotLy8gaGFzIGEgcHJlZml4IGxlbmd0aCBvZiA2NCBmb3IgSVB2Ni4KLS8vIEZvciBJUHY2LCB0aGVyZSBhcmUgYSBmZXcgcnVsZXMgYWJvdXQgd2hpY2ggSVBzIGFyZSB2YWxpZCAoYW5kIHByZWZlcmVkKS4KLS8vIEUuZy4gZ2xvYmFsbHkgcm91dGFibGUgSVAgYWRkcmVzc2VzIGFyZSBwcmVmZXJlZCBvdmVyIFVMQXMuCi1ib29sIFNiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzcyhjb25zdCBTYlNvY2tldEFkZHJlc3MqIGNvbnN0IC8qZGVzdGluYXRpb24qLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0QWRkcmVzcyogb3V0X3NvdXJjZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JTb2NrZXRBZGRyZXNzKiBvdXRfbmV0bWFzaykgewotICBpZiAob3V0X3NvdXJjZV9hZGRyZXNzID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTYk1lbW9yeVNldChvdXRfc291cmNlX2FkZHJlc3MtPmFkZHJlc3MsIDAsCi0gICAgICAgICAgICAgIHNpemVvZihvdXRfc291cmNlX2FkZHJlc3MtPmFkZHJlc3MpKTsKLSAgb3V0X3NvdXJjZV9hZGRyZXNzLT5wb3J0ID0gMDsKLQotICBKbmlFbnZFeHQqIGVudiA9IEpuaUVudkV4dDo6R2V0KCk7Ci0KLSAgamJ5dGVBcnJheSBzID0gKGpieXRlQXJyYXkpZW52LT5DYWxsU3RhcmJvYXJkT2JqZWN0TWV0aG9kT3JBYm9ydCgKLSAgICAgICJnZXRMb2NhbEludGVyZmFjZUFkZHJlc3MiLCAiKClbQiIpOwotICBpZiAocyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgamludCBzeiA9IGVudi0+R2V0QXJyYXlMZW5ndGgocyk7Ci0gIGlmIChzeiA+IHNpemVvZihvdXRfc291cmNlX2FkZHJlc3MtPmFkZHJlc3MpKSB7Ci0gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgU0JfTE9HKEVSUk9SKSA8PCAiU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzIGFkZHJlc3MgdG9vIGJpZyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN3aXRjaCAoc3opIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBvdXRfc291cmNlX2FkZHJlc3MtPnR5cGUgPSBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQ7Ci0gICAgICBpZiAob3V0X25ldG1hc2spIHsKLSAgICAgICAgb3V0X25ldG1hc2stPmFkZHJlc3NbMF0gPSAyNTU7Ci0gICAgICAgIG91dF9uZXRtYXNrLT5hZGRyZXNzWzFdID0gMjU1OwotICAgICAgICBvdXRfbmV0bWFzay0+YWRkcmVzc1syXSA9IDI1NTsKLSAgICAgICAgb3V0X25ldG1hc2stPmFkZHJlc3NbM10gPSAwOwotICAgICAgICBvdXRfbmV0bWFzay0+dHlwZSA9IGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvdXRfc291cmNlX2FkZHJlc3MtPnR5cGUgPSBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjY7Ci0gICAgICBpZiAob3V0X25ldG1hc2spIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRGVmYXVsdFByZWZpeExlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgb3V0X25ldG1hc2stPmFkZHJlc3NbaV0gPSAweGZmOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSBrRGVmYXVsdFByZWZpeExlbmd0aDsgaSA8IG5ldDo6a0lQdjZBZGRyZXNzU2l6ZTsgKytpKSB7Ci0gICAgICAgICAgb3V0X25ldG1hc2stPmFkZHJlc3NbaV0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIG91dF9uZXRtYXNrLT50eXBlID0ga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY2OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBqYnl0ZSogYnl0ZXMgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKHMsIE5VTEwpOwotICBTQl9DSEVDSyhieXRlcykgPDwgIkdldEJ5dGVBcnJheUVsZW1lbnRzIGZhaWxlZCI7Ci0gIFNiTWVtb3J5Q29weShvdXRfc291cmNlX2FkZHJlc3MtPmFkZHJlc3MsIGJ5dGVzLCBzeik7Ci0gIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKHMsIGJ5dGVzLCBKTklfQUJPUlQpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKaW5kZXggNjRiY2NhOS4uN2UyZDgzYiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCkBAIC00NCw2ICs0NCw5IEBACiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YXJib2FyZF9wbGF0Zm9ybScsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Jpb25pYycsCisgICAgICBdLAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICc8QChmaWx0ZXJfYmFzZWRfcGxheWVyX3NvdXJjZXMpJywKICAgICAgICAgJ2FjY2Vzc2liaWxpdHlfZ2V0X2NhcHRpb25fc2V0dGluZ3MuY2MnLApAQCAtNjMsNiArNjYsMTMgQEAKICAgICAgICAgJ2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjJywKICAgICAgICAgJ2F1ZGlvX3RyYWNrX2F1ZGlvX3NpbmtfdHlwZS5jYycsCiAgICAgICAgICdhdWRpb190cmFja19hdWRpb19zaW5rX3R5cGUuaCcsCisgICAgICAgICdiaW9uaWMvYmlvbmljX25ldGxpbmsuY3BwJywKKyAgICAgICAgJ2Jpb25pYy9iaW9uaWNfbmV0bGluay5oJywKKyAgICAgICAgJ2Jpb25pYy9pZmFkZHJzLmNwcCcsCisgICAgICAgICdiaW9uaWMvaWZhZGRycy5oJywKKyAgICAgICAgJ2Jpb25pYy9uZXRfaWYuY3BwJywKKyAgICAgICAgJ2Jpb25pYy9wcml2YXRlL2Jpb25pY19tYWNyb3MuaCcsCisgICAgICAgICdiaW9uaWMvcHJpdmF0ZS9FcnJub1Jlc3RvcmVyLmgnLAogICAgICAgICAnY29uZmlndXJhdGlvbl9wdWJsaWMuaCcsCiAgICAgICAgICdkZWNvZGVfdGFyZ2V0X2NyZWF0ZS5jYycsCiAgICAgICAgICdkZWNvZGVfdGFyZ2V0X2NyZWF0ZS5oJywKQEAgLTEyNiw3ICsxMzYsNiBAQAogICAgICAgICAncGxheWVyX3NldF9ib3VuZHMuY2MnLAogICAgICAgICAncGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjJywKICAgICAgICAgJ3Nhbml0aXplcl9vcHRpb25zLmNjJywKLSAgICAgICAgJ3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MnLAogICAgICAgICAnc3BlZWNoX3JlY29nbml6ZXJfaW1wbC5jYycsCiAgICAgICAgICdzcGVlY2hfc3ludGhlc2lzX2NhbmNlbC5jYycsCiAgICAgICAgICdzcGVlY2hfc3ludGhlc2lzX3NwZWFrLmNjJywKQEAgLTE1OSw0MyArMTY4LDE3IEBACiAgICAgICAgICd3aW5kb3dfZ2V0X3NpemUuY2MnLAogICAgICAgICAnd2luZG93X2ludGVybmFsLmgnLAogICAgICAgICAnPChTSEFSRURfSU5URVJNRURJQVRFX0RJUikvbmRrLXNvdXJjZXMvY3B1LWZlYXR1cmVzLmMnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2FjY2Vzc2liaWxpdHkuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYXRvbWljLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2F1ZGlvX3NpbmsuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2NvbmRpdGlvbl92YXJpYWJsZS5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvZGlyZWN0b3J5LmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2RybS5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9ldmVudC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9leHBvcnQuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvZmlsZS5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9pbnB1dC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9rZXkuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbG9nLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL21lZGlhLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL21lbW9yeS5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9tdXRleC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9vbmNlLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3BsYXllci5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9xdWV1ZS5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zb2NrZXQuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3BlZWNoX3N5bnRoZXNpcy5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zdHJpbmcuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3lzdGVtLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3RocmVhZC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC90aW1lX3pvbmUuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvdHlwZXMuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvd2luZG93LmgnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX3NlcnZpY2UuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3N5c3RlbV9nZXRfZXh0ZW5zaW9ucy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X2JsdXJfb25fc2NyZWVuX2tleWJvYXJkLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC8vd2luZG93X2ZvY3VzX29uX3NjcmVlbl9rZXlib2FyZC5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X2ZvY3VzX29uX3NjcmVlbl9rZXlib2FyZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X2dldF9vbl9zY3JlZW5fa2V5Ym9hcmRfYm91bmRpbmdfcmVjdC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X2hpZGVfb25fc2NyZWVuX2tleWJvYXJkLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfaXNfb25fc2NyZWVuX2tleWJvYXJkX3Nob3duLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zX3N1cHBvcnRlZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X3NldF9vbl9zY3JlZW5fa2V5Ym9hcmRfa2VlcF9mb2N1cy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X3Nob3dfb25fc2NyZWVuX2tleWJvYXJkLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfdXBkYXRlX29uX3NjcmVlbl9rZXlib2FyZF9zdWdnZXN0aW9ucy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9tYXAuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9tZW1vcnlfcHJvdGVjdC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV91bm1hcC5jYycsCkBAIC0yNTAsNiArMjMzLDcgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvYnl0ZV9zd2FwLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvbWVtb3J5X2dldF9zdGFja19ib3VuZHMuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9wYWdlX2ludGVybmFsLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGludXgvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3N5c3RlbV9nZXRfcmFuZG9tX2RhdGEuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zeXN0ZW1fZ2V0X3RvdGFsX2NwdV9tZW1vcnkuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9zeXN0ZW1fZ2V0X3VzZWRfY3B1X21lbW9yeS5jYycsCkBAIC0yNjIsNiArMjQ2LDggQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbm91c2VyL3VzZXJfZ2V0X3NpZ25lZF9pbi5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL25vdXNlci91c2VyX2ludGVybmFsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbm91c2VyL3VzZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvb3B1cy9vcHVzX2F1ZGlvX2RlY29kZXIuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3Bvc2l4L2RpcmVjdG9yeV9jcmVhdGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9wb3NpeC9pbXBsL2ZpbGVfY2FuX29wZW4uaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3Bvc2l4L2ltcGwvZmlsZV9jbG9zZS5oJywKQEAgLTQ3OSw2ICs0NjUsNyBAQAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jb21tb24vY29tbW9uLmd5cDpjb21tb24nLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbGliZXZlbnQvbGliZXZlbnQuZ3lwOmxpYmV2ZW50JywKKyAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L29wdXMvb3B1cy5neXA6b3B1cycsCiAgICAgICAgICdzdGFyYm9hcmRfYmFzZV9zeW1ib2xpemUnLAogICAgICAgXSwKICAgICB9LApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zeXN0ZW1fZ2V0X2V4dGVuc2lvbnMuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3N5c3RlbV9nZXRfZXh0ZW5zaW9ucy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmEzY2VkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zeXN0ZW1fZ2V0X2V4dGVuc2lvbnMuY2MKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgorCisjaW5jbHVkZSAiY29iYWx0L2V4dGVuc2lvbi9wbGF0Zm9ybV9zZXJ2aWNlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgorCit2b2lkKiBTYlN5c3RlbUdldEV4dGVuc2lvbihjb25zdCBjaGFyKiBuYW1lKSB7CisgIGlmIChTYlN0cmluZ0NvbXBhcmVBbGwobmFtZSwga0NvYmFsdEV4dGVuc2lvblBsYXRmb3JtU2VydmljZU5hbWUpID09IDApIHsKKyAgICByZXR1cm4gc3RhcmJvYXJkOjphbmRyb2lkOjpzaGFyZWQ6OkdldFBsYXRmb3JtU2VydmljZUFwaSgpOworICB9CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zeXN0ZW1fcGxhdGZvcm1fZXJyb3IuY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3N5c3RlbV9wbGF0Zm9ybV9lcnJvci5jYwppbmRleCAxZjY2OTgzLi4yODY0ODAwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3N5c3RlbV9wbGF0Zm9ybV9lcnJvci5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3N5c3RlbV9wbGF0Zm9ybV9lcnJvci5jYwpAQCAtMjMsMjAgKzIzLDExIEBACiB1c2luZyBzdGFyYm9hcmQ6OmFuZHJvaWQ6OnNoYXJlZDo6QXBwbGljYXRpb25BbmRyb2lkOwogdXNpbmcgc3RhcmJvYXJkOjphbmRyb2lkOjpzaGFyZWQ6OkpuaUVudkV4dDsKIAotc3RydWN0IFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUgewotICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlKFNiU3lzdGVtUGxhdGZvcm1FcnJvclR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpCi0gICAgICA6IGVycm9yX29iaihOVUxMKSwgdHlwZSh0eXBlKSwgY2FsbGJhY2soY2FsbGJhY2spLCB1c2VyX2RhdGEodXNlcl9kYXRhKSB7fQotCi0gIGpvYmplY3QgZXJyb3Jfb2JqOyAgLy8gZ2xvYmFsIHJlZiB0byBkZXYuY29iYWx0LlBsYXRmb3JtRXJyb3IgaW5zdGFuY2UKLSAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlOwotICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JDYWxsYmFjayBjYWxsYmFjazsKLSAgdm9pZCogdXNlcl9kYXRhOwotfTsKLQogbmFtZXNwYWNlIHsKIAordHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2UgZXJyb3JfcmVzcG9uc2UpPgorICAgIFNlbmRSZXNwb25zZUNhbGxiYWNrOworCiBlbnVtIHsKICAgLy8gVGhpcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIEphdmEgZGV2LmNvYmFsdC5QbGF0Zm9ybUVycm9yLkVycm9yVHlwZQogICBrSm5pRXJyb3JUeXBlQ29ubmVjdGlvbkVycm9yID0gMCwKQEAgLTQ0LDEwICszNSw5IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1TYlN5c3RlbVBsYXRmb3JtRXJyb3IgU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IoCi0gICAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlLAotICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAotICAgIHZvaWQqIHVzZXJfZGF0YSkgeworYm9vbCBTYlN5c3RlbVJhaXNlUGxhdGZvcm1FcnJvcihTYlN5c3RlbVBsYXRmb3JtRXJyb3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKICAgamludCBqbmlfZXJyb3JfdHlwZTsKICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZUNvbm5lY3Rpb25FcnJvcjoKQEAgLTU1LDM4ICs0NSw0MSBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIFNCX05PVFJFQUNIRUQoKTsKLSAgICAgIHJldHVybiBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9ySW52YWxpZDsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIFNiU3lzdGVtUGxhdGZvcm1FcnJvciBlcnJvcl9oYW5kbGUgPQotICAgICAgbmV3IFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUodHlwZSwgY2FsbGJhY2ssIHVzZXJfZGF0YSk7Ci0KICAgSm5pRW52RXh0KiBlbnYgPSBKbmlFbnZFeHQ6OkdldCgpOwotICBqb2JqZWN0IGVycm9yX29iaiA9IGVudi0+Q2FsbFN0YXJib2FyZE9iamVjdE1ldGhvZE9yQWJvcnQoCi0gICAgICAicmFpc2VQbGF0Zm9ybUVycm9yIiwgIihJSilMZGV2L2NvYmFsdC9jb2F0L1BsYXRmb3JtRXJyb3I7IiwKLSAgICAgIGpuaV9lcnJvcl90eXBlLCByZWludGVycHJldF9jYXN0PGpsb25nPihlcnJvcl9oYW5kbGUpKTsKLSAgZXJyb3JfaGFuZGxlLT5lcnJvcl9vYmogPSBlbnYtPk5ld0dsb2JhbFJlZihlcnJvcl9vYmopOwogCi0gIHJldHVybiBlcnJvcl9oYW5kbGU7CisgIGF1dG8gc2VuZF9yZXNwb25zZV9jYWxsYmFjayA9CisgICAgICBjYWxsYmFjayA/IG5ldyBTZW5kUmVzcG9uc2VDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgIFtjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGFdKFNiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlIGVycm9yX3Jlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yX3Jlc3BvbnNlLCB1c2VyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgIDogbnVsbHB0cjsKKworICBlbnYtPkNhbGxTdGFyYm9hcmRWb2lkTWV0aG9kT3JBYm9ydCgKKyAgICAgICJyYWlzZVBsYXRmb3JtRXJyb3IiLCAiKElKKVYiLCBqbmlfZXJyb3JfdHlwZSwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8amxvbmc+KHNlbmRfcmVzcG9uc2VfY2FsbGJhY2spKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgU2JTeXN0ZW1DbGVhclBsYXRmb3JtRXJyb3IoU2JTeXN0ZW1QbGF0Zm9ybUVycm9yIGhhbmRsZSkgewotICBKbmlFbnZFeHQqIGVudiA9IEpuaUVudkV4dDo6R2V0KCk7Ci0gIGVudi0+Q2FsbE9iamVjdE1ldGhvZE9yQWJvcnQoaGFuZGxlLT5lcnJvcl9vYmosICJjbGVhciIsICIoKVYiKTsKLX0KLQotZXh0ZXJuICJDIiBTQl9FWFBPUlRfUExBVEZPUk0KLXZvaWQgSmF2YV9kZXZfY29iYWx0X2NvYXRfUGxhdGZvcm1FcnJvcl9uYXRpdmVPbkNsZWFyZWQoCi0gICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdW51c2VkX3RoaXMsIGppbnQgam5pX3Jlc3BvbnNlLCBqbG9uZyBqbmlfZGF0YSkgeworZXh0ZXJuICJDIiBTQl9FWFBPUlRfUExBVEZPUk0gdm9pZAorSmF2YV9kZXZfY29iYWx0X2NvYXRfUGxhdGZvcm1FcnJvcl9uYXRpdmVTZW5kUmVzcG9uc2UoSk5JRW52KiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IHVudXNlZF90aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBqbmlfcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyBqbmlfZGF0YSkgewogICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHVudXNlZF90aGlzKTsKLSAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yIGVycm9yX2hhbmRsZSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PFNiU3lzdGVtUGxhdGZvcm1FcnJvcj4oam5pX2RhdGEpOwotICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihlcnJvcl9oYW5kbGUtPmVycm9yX29iaik7Ci0gIGlmIChlcnJvcl9oYW5kbGUtPmNhbGxiYWNrKSB7CisgIFNlbmRSZXNwb25zZUNhbGxiYWNrKiBzZW5kX3Jlc3BvbnNlX2NhbGxiYWNrID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2VuZFJlc3BvbnNlQ2FsbGJhY2sqPihqbmlfZGF0YSk7CisgIGlmIChzZW5kX3Jlc3BvbnNlX2NhbGxiYWNrKSB7CisgICAgU0JfRENIRUNLKCpzZW5kX3Jlc3BvbnNlX2NhbGxiYWNrKQorICAgICAgICA8PCAic2VuZF9yZXNwb25zZV9jYWxsYmFjayBzaG91bGQgbmV2ZXIgYmUgYW4gZW1wdHkgZnVuY3Rpb24iOwogICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlIGVycm9yX3Jlc3BvbnNlID0KICAgICAgICAgam5pX3Jlc3BvbnNlIDwgMCA/IGtTYlN5c3RlbVBsYXRmb3JtRXJyb3JSZXNwb25zZU5lZ2F0aXZlIDoKICAgICAgICAgam5pX3Jlc3BvbnNlID4gMCA/IGtTYlN5c3RlbVBsYXRmb3JtRXJyb3JSZXNwb25zZVBvc2l0aXZlIDoKICAgICAgICAga1NiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlQ2FuY2VsOwotICAgIGVycm9yX2hhbmRsZS0+Y2FsbGJhY2soZXJyb3JfcmVzcG9uc2UsIGVycm9yX2hhbmRsZS0+dXNlcl9kYXRhKTsKKyAgICAoKnNlbmRfcmVzcG9uc2VfY2FsbGJhY2spKGVycm9yX3Jlc3BvbnNlKTsKKyAgICBkZWxldGUgc2VuZF9yZXNwb25zZV9jYWxsYmFjazsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb19kZWNvZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb19kZWNvZGVyLmNjCmluZGV4IGEyN2Q2MzcuLjliYWZmYmQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdmlkZW9fZGVjb2Rlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3ZpZGVvX2RlY29kZXIuY2MKQEAgLTM1OSw2ICszNTksNyBAQAogdm9pZCBWaWRlb0RlY29kZXI6OlJlZnJlc2hPdXRwdXRGb3JtYXQoTWVkaWFDb2RlY0JyaWRnZSogbWVkaWFfY29kZWNfYnJpZGdlKSB7CiAgIFNCX0RDSEVDSyhtZWRpYV9jb2RlY19icmlkZ2UpOwogICBTQl9ETE9HKElORk8pIDw8ICJPdXRwdXQgZm9ybWF0IGNoYW5nZWQsIHRyeWluZyB0byBkZXF1ZXVlIGFnYWluLiI7CisgIHN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKGRlY29kZV90YXJnZXRfbXV0ZXhfKTsKICAgLy8gUmVjb3JkIHRoZSBsYXRlc3Qgd2lkdGgvaGVpZ2h0IG9mIHRoZSBkZWNvZGVkIGlucHV0LgogICBTdXJmYWNlRGltZW5zaW9ucyBvdXRwdXRfZGltZW5zaW9ucyA9CiAgICAgICBtZWRpYV9jb2RlY19icmlkZ2UtPkdldE91dHB1dERpbWVuc2lvbnMoKTsKQEAgLTQ0OSwxMyArNDUwLDEzIEBACiAgIG9yaWdpbl95ID0gMS4wZiAtIG9yaWdpbl95OwogICBleHRlbnRfeSA9IDEuMGYgLSBleHRlbnRfeTsKIAotICBjb250ZW50X3JlZ2lvbi0+bGVmdCA9IFJvdW5kVG9OZWFySW50ZWdlcihvcmlnaW5feCAqIHdpZHRoKTsKLSAgY29udGVudF9yZWdpb24tPnJpZ2h0ID0gUm91bmRUb05lYXJJbnRlZ2VyKGV4dGVudF94ICogd2lkdGgpOworICBjb250ZW50X3JlZ2lvbi0+bGVmdCA9IG9yaWdpbl94ICogd2lkdGg7CisgIGNvbnRlbnRfcmVnaW9uLT5yaWdodCA9IGV4dGVudF94ICogd2lkdGg7CiAKICAgLy8gTm90ZSB0aGF0IGluIEdMIGNvb3JkaW5hdGVzLCB0aGUgb3JpZ2luIGlzIHRoZSBib3R0b20gYW5kIHRoZSBleHRlbnQKICAgLy8gaXMgdGhlIHRvcC4KLSAgY29udGVudF9yZWdpb24tPnRvcCA9IFJvdW5kVG9OZWFySW50ZWdlcihleHRlbnRfeSAqIGhlaWdodCk7Ci0gIGNvbnRlbnRfcmVnaW9uLT5ib3R0b20gPSBSb3VuZFRvTmVhckludGVnZXIob3JpZ2luX3kgKiBoZWlnaHQpOworICBjb250ZW50X3JlZ2lvbi0+dG9wID0gZXh0ZW50X3kgKiBoZWlnaHQ7CisgIGNvbnRlbnRfcmVnaW9uLT5ib3R0b20gPSBvcmlnaW5feSAqIGhlaWdodDsKIH0KIH0gIC8vIG5hbWVzcGFjZQogCkBAIC00NzIsMTQgKzQ3MywxNyBAQAogICAgIGZsb2F0IG1hdHJpeDR4NFsxNl07CiAgICAgZ2V0VHJhbnNmb3JtTWF0cml4KGRlY29kZV90YXJnZXRfLT5kYXRhLT5zdXJmYWNlX3RleHR1cmUsIG1hdHJpeDR4NCk7CiAgICAgU2V0RGVjb2RlVGFyZ2V0Q29udGVudFJlZ2lvbkZyb21NYXRyaXgoCi0gICAgICAgICZkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5wbGFuZXNbMF0uY29udGVudF9yZWdpb24sIGZyYW1lX3dpZHRoXywKLSAgICAgICAgZnJhbWVfaGVpZ2h0XywgbWF0cml4NHg0KTsKKyAgICAgICAgJmRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLnBsYW5lc1swXS5jb250ZW50X3JlZ2lvbiwgMSwgMSwgbWF0cml4NHg0KTsKIAotICAgIC8vIFRha2UgdGhpcyBvcHBvcnR1bml0eSB0byB1cGRhdGUgdGhlIGRlY29kZSB0YXJnZXQncyB3aWR0aCBhbmQgaGVpZ2h0LgotICAgIGRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLnBsYW5lc1swXS53aWR0aCA9IGZyYW1lX3dpZHRoXzsKLSAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5wbGFuZXNbMF0uaGVpZ2h0ID0gZnJhbWVfaGVpZ2h0XzsKLSAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby53aWR0aCA9IGZyYW1lX3dpZHRoXzsKLSAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5oZWlnaHQgPSBmcmFtZV9oZWlnaHRfOworICAgIC8vIE1hcmsgdGhlIGRlY29kZSB0YXJnZXQncyB3aWR0aCBhbmQgaGVpZ2h0IGFzIDEsIHNvIHRoYXQgdGhlCisgICAgLy8gfGNvbnRlbnRfcmVnaW9ufCdzIGNvb3JkaW5hdGVzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgbm9ybWFsaXplZAorICAgIC8vIGNvb3JkaW5hdGVzLiAgVGhpcyBpcyBuaWNlIGJlY2F1c2Ugb24gQW5kcm9pZCB3ZSdyZSBuZXZlciBleHBsaWNpdGx5CisgICAgLy8gdG9sZCB0aGUgdGV4dHVyZSB3aWR0aC9oZWlnaHQsIGFuZCB3ZSBhcmUgb25seSBwcm92aWRlZCB0aGUgY29udGVudAorICAgIC8vIHJlZ2lvbiB2aWEgbm9ybWFsaXplZCBjb29yZGluYXRlcy4KKyAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5wbGFuZXNbMF0ud2lkdGggPSAxOworICAgIGRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLnBsYW5lc1swXS5oZWlnaHQgPSAxOworICAgIGRlY29kZV90YXJnZXRfLT5kYXRhLT5pbmZvLndpZHRoID0gMTsKKyAgICBkZWNvZGVfdGFyZ2V0Xy0+ZGF0YS0+aW5mby5oZWlnaHQgPSAxOwogCiAgICAgU2JEZWNvZGVUYXJnZXQgb3V0X2RlY29kZV90YXJnZXQgPSBuZXcgU2JEZWNvZGVUYXJnZXRQcml2YXRlOwogICAgIG91dF9kZWNvZGVfdGFyZ2V0LT5kYXRhID0gZGVjb2RlX3RhcmdldF8tPmRhdGE7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3dpbmRvd19pc19vbl9zY3JlZW5fa2V5Ym9hcmRfc2hvd24uY2MgYi9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3dpbmRvd19pc19vbl9zY3JlZW5fa2V5Ym9hcmRfc2hvd24uY2MKaW5kZXggNzExZjg1Yy4uN2FmZjAxMSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfaXNfb25fc2NyZWVuX2tleWJvYXJkX3Nob3duLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X2lzX29uX3NjcmVlbl9rZXlib2FyZF9zaG93bi5jYwpAQCAtMTQsOSArMTQsMTUgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKIAorI2luY2x1ZGUgInN0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9qbmlfZW52X2V4dC5oIgorCit1c2luZyBzdGFyYm9hcmQ6OmFuZHJvaWQ6OnNoYXJlZDo6Sm5pRW52RXh0OworCiAjaWYgU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKIGJvb2wgU2JXaW5kb3dJc09uU2NyZWVuS2V5Ym9hcmRTaG93bihTYldpbmRvdyB3aW5kb3cpIHsKLSAgLy8gU3R1Yi4KLSAgcmV0dXJuIHRydWU7CisgIEpuaUVudkV4dCogZW52ID0gSm5pRW52RXh0OjpHZXQoKTsKKyAgamJvb2xlYW4gaXNfa2V5Ym9hcmRfc2hvd24gPQorICAgICAgZW52LT5DYWxsU3RhcmJvYXJkQm9vbGVhbk1ldGhvZE9yQWJvcnQoImlzS2V5Ym9hcmRTaG93aW5nIiwgIigpWiIpOworICByZXR1cm4gaXNfa2V5Ym9hcmRfc2hvd247CiB9CiAjZW5kaWYgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3dpbmRvd19vbl9zY3JlZW5fa2V5Ym9hcmRfc3VnZ2VzdGlvbnNfc3VwcG9ydGVkLmNjIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zX3N1cHBvcnRlZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTEyY2EwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zX3N1cHBvcnRlZC5jYwpAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCisKKyNpZiBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCitib29sIFNiV2luZG93T25TY3JlZW5LZXlib2FyZFN1Z2dlc3Rpb25zU3VwcG9ydGVkKFNiV2luZG93IHdpbmRvdykgeworICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfT05fU0NSRUVOX0tFWUJPQVJEX1NVR0dFU1RJT05TX1ZFUlNJT04KKyNlbmRpZiAgLy8gU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X3NldF9vbl9zY3JlZW5fa2V5Ym9hcmRfa2VlcF9mb2N1cy5jYyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X3NldF9vbl9zY3JlZW5fa2V5Ym9hcmRfa2VlcF9mb2N1cy5jYwppbmRleCBmZDM4MjU2Li4yNGQ5NWViIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3dpbmRvd19zZXRfb25fc2NyZWVuX2tleWJvYXJkX2tlZXBfZm9jdXMuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfc2V0X29uX3NjcmVlbl9rZXlib2FyZF9rZWVwX2ZvY3VzLmNjCkBAIC0xNCw5ICsxNCwxNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgogCisjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2puaV9lbnZfZXh0LmgiCisKK3VzaW5nIHN0YXJib2FyZDo6YW5kcm9pZDo6c2hhcmVkOjpKbmlFbnZFeHQ7CisKICNpZiBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQogdm9pZCBTYldpbmRvd1NldE9uU2NyZWVuS2V5Ym9hcmRLZWVwRm9jdXMoU2JXaW5kb3cgd2luZG93LCBib29sIGtlZXBfZm9jdXMpIHsKLSAgLy8gU3R1Yi4KKyAgSm5pRW52RXh0KiBlbnYgPSBKbmlFbnZFeHQ6OkdldCgpOworICBqb2JqZWN0IGpfa2V5Ym9hcmRfZWRpdG9yID0gZW52LT5DYWxsU3RhcmJvYXJkT2JqZWN0TWV0aG9kT3JBYm9ydCgKKyAgICAgICJnZXRLZXlib2FyZEVkaXRvciIsICIoKUxkZXYvY29iYWx0L2NvYXQvS2V5Ym9hcmRFZGl0b3I7Iik7CisgIGVudi0+Q2FsbFZvaWRNZXRob2RPckFib3J0KGpfa2V5Ym9hcmRfZWRpdG9yLCAidXBkYXRlS2VlcEZvY3VzIiwgIihaKVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwX2ZvY3VzKTsKICAgcmV0dXJuOwogfQogI2VuZGlmICAvLyBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC93aW5kb3dfdXBkYXRlX29uX3NjcmVlbl9rZXlib2FyZF9zdWdnZXN0aW9ucy5jYyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X3VwZGF0ZV9vbl9zY3JlZW5fa2V5Ym9hcmRfc3VnZ2VzdGlvbnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2YjAxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvd2luZG93X3VwZGF0ZV9vbl9zY3JlZW5fa2V5Ym9hcmRfc3VnZ2VzdGlvbnMuY2MKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuaCIKKworI2lmIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfT05fU0NSRUVOX0tFWUJPQVJEX1NVR0dFU1RJT05TX1ZFUlNJT04KK3ZvaWQgU2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMoU2JXaW5kb3cgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWdnZXN0aW9uc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N1Z2dlc3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdWdnZXN0aW9uc19kYXRhOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9zdWdnZXN0aW9uczsgKytpKSB7CisgICAgc3VnZ2VzdGlvbnNfZGF0YS5wdXNoX2JhY2soc3VnZ2VzdGlvbnNbaV0pOworICB9CisgIHN0YXJib2FyZDo6YW5kcm9pZDo6c2hhcmVkOjpBcHBsaWNhdGlvbkFuZHJvaWQ6OkdldCgpCisgICAgICAtPlNiV2luZG93VXBkYXRlT25TY3JlZW5LZXlib2FyZFN1Z2dlc3Rpb25zKHdpbmRvdywgc3VnZ2VzdGlvbnNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja2V0KTsKKyAgcmV0dXJuOworfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9PTl9TQ1JFRU5fS0VZQk9BUkRfU1VHR0VTVElPTlNfVkVSU0lPTgorI2VuZGlmICAvLyBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9idWlsZC9iYXNlX2NvbmZpZ3VyYXRpb24uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvYnVpbGQvYmFzZV9jb25maWd1cmF0aW9uLmd5cGkKaW5kZXggZWIxNDM4My4uN2Y5ZGFkOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9idWlsZC9iYXNlX2NvbmZpZ3VyYXRpb24uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2J1aWxkL2Jhc2VfY29uZmlndXJhdGlvbi5neXBpCkBAIC02Nyw2ICs2Nyw5IEBACiAgICAgIyBUaGUgdGFyZ2V0IHBsYXRmb3JtIGlkIGFzIGEgc3RyaW5nLCBsaWtlICdsaW51eC14NjR4MTEnLCAnd2luMzInLCBldGMuLgogICAgICdzYl90YXJnZXRfcGxhdGZvcm0nOiAnJywKIAorICAgICMgV2hldGhlciB0aGlzIGlzIGFuIGV2ZXJncmVlbiBidWlsZC4KKyAgICAnc2JfZXZlcmdyZWVuJzogMCwKKwogICAgICMgVGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YgdGhlIHRhcmdldCwgc2VwYXJhdGUgZnJvbSB0aGUgdGFyZ2V0X2FyY2guIEluIG1hbnkKICAgICAjIGNhc2VzLCBhbiAndW5rbm93bicgdmFsdWUgaXMgZmluZSwgYnV0LCBpZiBzZXQgdG8gJ2xpbnV4JywgdGhlbiB3ZSBjYW4KICAgICAjIGFzc3VtZSBzb21lIHRoaW5ncywgYW5kIGl0J2xsIHNhdmUgdXMgc29tZSBjb25maWd1cmF0aW9uIHRpbWUuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2J1aWxkL2ZpbGVsaXN0LnB5IGIvc3JjL3N0YXJib2FyZC9idWlsZC9maWxlbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWY4YTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9idWlsZC9maWxlbGlzdC5weQpAQCAtMCwwICsxLDIwOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKKworaW1wb3J0IF9lbnYKKworZnJvbSBzdGFyYm9hcmQuYnVpbGQucG9ydF9zeW1saW5rIGltcG9ydCBcCisgICAgSXNTeW1MaW5rLCBSZWFkU3ltTGluaywgT3NXYWxrLCBSbXRyZWUsIE1ha2VTeW1MaW5rCisKK2NsYXNzIEZpbGVMaXN0OgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi5maWxlX2xpc3QgPSBbXQorICAgIHNlbGYuc3ltbGlua19kaXJfbGlzdCA9IFtdCisKKyAgZGVmIEFkZEFsbEZpbGVzSW5QYXRoKHNlbGYsIHJvb3RfZGlyLCBzdWJfZGlyKToKKyAgICBhbGxfZmlsZXMgPSBbXQorICAgIGFsbF9zeW1saW5rcyA9IFtdCisgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIE9zV2FsayhzdWJfZGlyKToKKyAgICAgIGZvciBmIGluIGZpbGVzOgorICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHJvb3QsIGYpKQorICAgICAgICBhbGxfZmlsZXMuYXBwZW5kKGZ1bGxfcGF0aCkKKyAgICAgIGZvciBkaXJfbmFtZSBpbiBkaXJzOgorICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHJvb3QsIGRpcl9uYW1lKSkKKyAgICAgICAgaWYgSXNTeW1MaW5rKGZ1bGxfcGF0aCk6CisgICAgICAgICAgYWxsX3N5bWxpbmtzLmFwcGVuZChmdWxsX3BhdGgpCisgICAgZm9yIGYgaW4gYWxsX2ZpbGVzICsgYWxsX3N5bWxpbmtzOgorICAgICAgc2VsZi5BZGRGaWxlKHJvb3RfZGlyLCBmKQorCisgIGRlZiBBZGRBbGxGaWxlc0luUGF0aHMoc2VsZiwgcm9vdF9kaXIsIHN1Yl9kaXJzKToKKyAgICBmb3Igc3ViX2QgaW4gc3ViX2RpcnM6CisgICAgICBzZWxmLkFkZEFsbEZpbGVzSW5QYXRoKHJvb3RfZGlyPXJvb3RfZGlyLCBzdWJfZGlyPXN1Yl9kKQorCisgIGRlZiBBZGRGaWxlKHNlbGYsIHJvb3RfcGF0aCwgZmlsZV9wYXRoKToKKyAgICBpZiBJc1N5bUxpbmsoZmlsZV9wYXRoKToKKyAgICAgIHNlbGYuQWRkU3ltTGluayhyb290X3BhdGgsIGZpbGVfcGF0aCkKKyAgICBlbHNlOgorICAgICAgYXJjaGl2ZV9uYW1lID0gb3MucGF0aC5yZWxwYXRoKGZpbGVfcGF0aCwgcm9vdF9wYXRoKQorICAgICAgc2VsZi5maWxlX2xpc3QuYXBwZW5kKFtmaWxlX3BhdGgsIGFyY2hpdmVfbmFtZV0pCisKKyAgZGVmIEFkZFN5bUxpbmsoc2VsZiwgcmVsYXRpdmVfZGlyLCBsaW5rX2ZpbGUpOgorICAgIHJlbF9saW5rX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgobGlua19maWxlLCByZWxhdGl2ZV9kaXIpCisgICAgcGh5X3BhdGggPSBSZWFkU3ltTGluayhsaW5rX2ZpbGUpCisgICAgYXNzZXJ0IG9zLnBhdGguaXNkaXIocGh5X3BhdGgpLCBwaHlfcGF0aAorICAgIHJlbF9waHlfcGF0aCA9IG9zLnBhdGgucmVscGF0aChwaHlfcGF0aCwgcmVsYXRpdmVfZGlyKQorICAgIHNlbGYuc3ltbGlua19kaXJfbGlzdC5hcHBlbmQoW3JlbGF0aXZlX2RpciwgcmVsX2xpbmtfcGF0aCwgcmVsX3BoeV9wYXRoXSkKKworICBkZWYgUHJpbnQoc2VsZik6CisgICAgZm9yIGYgaW4gc2VsZi5maWxlX2xpc3Q6CisgICAgICBwcmludCgnRmlsZTogICAgJyArIHN0cihmKSkKKyAgICBmb3IgcyBpbiBzZWxmLnN5bWxpbmtfZGlyX2xpc3Q6CisgICAgICBwcmludCgnU3ltbGluazogJyArIHN0cihzKSkKKworCitUWVBFX05PTkUgPSAnTk9ORScKK1RZUEVfU1lNTElOS19ESVIgPSAnU1lNTElOSyBESVInCitUWVBFX0RJUkVDVE9SWSA9ICdESVInCitUWVBFX0ZJTEUgPSAnRklMRScKKworCitkZWYgR2V0RmlsZVR5cGUoZik6CisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmKToKKyAgICByZXR1cm4gVFlQRV9OT05FCisgIGVsaWYgSXNTeW1MaW5rKGYpOgorICAgIHJldHVybiBUWVBFX1NZTUxJTktfRElSCisgIGVsaWYgb3MucGF0aC5pc2RpcihmKToKKyAgICByZXR1cm4gVFlQRV9ESVJFQ1RPUlkKKyAgZWxzZToKKyAgICBhc3NlcnQob3MucGF0aC5pc2ZpbGUoZikpCisgICAgcmV0dXJuIFRZUEVfRklMRQorCitkZWYgX01ha2VEaXJzKHBhdGgpOgorICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICBvcy5tYWtlZGlycyhwYXRoKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JVCBURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIFRPRE86IFRoZXJlIGlzIGVub3VnaCB0ZXN0IGNvdmVyYWdlIG5vdyB0byB3YXJyYW50IHVzaW5nIHRoZSBweXRob24gdW5pdHRlc3QKKyMgbW9kdWxlLgorY2xhc3MgVGVtcEZpbGVTeXN0ZW06CisgIGRlZiBfX2luaXRfXyhzZWxmLCByb290X3N1Yl9kaXI9J2J1bmRsZXInKToKKyAgICByb290X3N1Yl9kaXIgPSBvcy5wYXRoLm5vcm1wYXRoKHJvb3Rfc3ViX2RpcikKKyAgICBzZWxmLnJvb3RfdG1wID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgcm9vdF9zdWJfZGlyKQorICAgIHNlbGYucm9vdF9pbl90bXAgPSBvcy5wYXRoLmpvaW4oc2VsZi5yb290X3RtcCwgJ2luJykKKyAgICBzZWxmLnRlc3RfdHh0ID0gb3MucGF0aC5qb2luKHNlbGYucm9vdF9pbl90bXAsICdmcm9tX2RpcicsICd0ZXN0LnR4dCcpCisgICAgc2VsZi5zeW1fZGlyID0gb3MucGF0aC5qb2luKHNlbGYucm9vdF9pbl90bXAsICdmcm9tX2Rpcl9sbmsnKQorICAgIHNlbGYuZnJvbV9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5yb290X2luX3RtcCwgJ2Zyb21fZGlyJykKKworCisgIGRlZiBNYWtlKHNlbGYpOgorICAgIF9NYWtlRGlycyhzZWxmLnJvb3RfaW5fdG1wKQorICAgIF9NYWtlRGlycyhvcy5wYXRoLmRpcm5hbWUoc2VsZi50ZXN0X3R4dCkpCisgICAgTWFrZVN5bUxpbmsoc2VsZi5mcm9tX2Rpciwgc2VsZi5zeW1fZGlyKQorICAgIHdpdGggb3BlbihzZWxmLnRlc3RfdHh0LCAndycpIGFzIGZkOgorICAgICAgZmQud3JpdGUoJ1RFU1QnKQorCisgIGRlZiBDbGVhcihzZWxmKToKKyAgICBSbXRyZWUoc2VsZi5yb290X3RtcCkKKworICBkZWYgUHJpbnQoc2VsZik6CisgICAgZGVmIFAoZik6CisgICAgICB0ID0gR2V0RmlsZVR5cGUoZikKKyAgICAgIHByaW50KCd7OjwxM30ge30nLmZvcm1hdCh0LCBmKSkKKyAgICBQKHNlbGYucm9vdF90bXApCisgICAgUChzZWxmLnJvb3RfaW5fdG1wKQorICAgIFAoc2VsZi50ZXN0X3R4dCkKKyAgICBQKHNlbGYuZnJvbV9kaXIpCisgICAgUChzZWxmLnN5bV9kaXIpCisKKworZGVmIFVuaXRUZXN0VGVtcEZpbGVTeXN0ZW0oKToKKyAgdGYgPSBUZW1wRmlsZVN5c3RlbSgpCisgIHRmLkNsZWFyKCkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnN5bV9kaXIpID09IFRZUEVfTk9ORSkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnJvb3RfdG1wKSA9PSBUWVBFX05PTkUpCisgIGFzc2VydChHZXRGaWxlVHlwZSh0Zi5yb290X2luX3RtcCkgPT0gVFlQRV9OT05FKQorICBhc3NlcnQoR2V0RmlsZVR5cGUodGYuZnJvbV9kaXIpID09IFRZUEVfTk9ORSkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnRlc3RfdHh0KSA9PSBUWVBFX05PTkUpCisgIHRmLk1ha2UoKQorICBhc3NlcnQoR2V0RmlsZVR5cGUodGYuc3ltX2RpcikgPT0gVFlQRV9TWU1MSU5LX0RJUikKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnJvb3RfdG1wKSA9PSBUWVBFX0RJUkVDVE9SWSkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnJvb3RfaW5fdG1wKSA9PSBUWVBFX0RJUkVDVE9SWSkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLmZyb21fZGlyKSA9PSBUWVBFX0RJUkVDVE9SWSkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnRlc3RfdHh0KSA9PSBUWVBFX0ZJTEUpCisgIHRmLkNsZWFyKCkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnN5bV9kaXIpID09IFRZUEVfTk9ORSkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnJvb3RfdG1wKSA9PSBUWVBFX05PTkUpCisgIGFzc2VydChHZXRGaWxlVHlwZSh0Zi5yb290X2luX3RtcCkgPT0gVFlQRV9OT05FKQorICBhc3NlcnQoR2V0RmlsZVR5cGUodGYuZnJvbV9kaXIpID09IFRZUEVfTk9ORSkKKyAgYXNzZXJ0KEdldEZpbGVUeXBlKHRmLnRlc3RfdHh0KSA9PSBUWVBFX05PTkUpCisKKworZGVmIFVuaXRUZXN0RmlsZUxpc3RfQWRkRmlsZSgpOgorICBmbGlzdCA9IEZpbGVMaXN0KCkKKyAgZmxpc3QuQWRkRmlsZShyb290X3BhdGg9cidkMS9kMicsIGZpbGVfcGF0aD1yJ2QxL2QyL3Rlc3QudHh0JykKKyAgYXNzZXJ0KGZsaXN0LmZpbGVfbGlzdCA9PSBbWydkMS9kMi90ZXN0LnR4dCcsICd0ZXN0LnR4dCddXSkKKworCitkZWYgVW5pdFRlc3RGaWxlTGlzdF9BZGRBbGxGaWxlc0luUGF0aCgpOgorICB0ZiA9IFRlbXBGaWxlU3lzdGVtKCkKKyAgdGYuTWFrZSgpCisgIGZsaXN0ID0gRmlsZUxpc3QoKQorICBmbGlzdC5BZGRBbGxGaWxlc0luUGF0aCh0Zi5yb290X2luX3RtcCwgdGYucm9vdF9pbl90bXApCisgIGFzc2VydChmbGlzdC5zeW1saW5rX2Rpcl9saXN0KQorICBhc3NlcnQoZmxpc3QuZmlsZV9saXN0KQorCisKK2RlZiBVbml0VGVzdEZpbGVMaXN0X0FkZFN5bWxpbmsoKToKKyAgdGYgPSBUZW1wRmlsZVN5c3RlbSgpCisgIHRmLk1ha2UoKQorICBmbGlzdCA9IEZpbGVMaXN0KCkKKyAgZmxpc3QuQWRkRmlsZSh0Zi5yb290X3RtcCwgdGYuc3ltX2RpcikKKyAgZmxpc3QuUHJpbnQoKQorICBhc3NlcnQoZmxpc3Quc3ltbGlua19kaXJfbGlzdCkKKyAgYXNzZXJ0KG5vdCBmbGlzdC5maWxlX2xpc3QpCisKKworZGVmIFVuaXRUZXN0KCk6CisgIFVuaXRUZXN0VGVtcEZpbGVTeXN0ZW0oKQorICBVbml0VGVzdEZpbGVMaXN0X0FkZEZpbGUoKQorICBVbml0VGVzdEZpbGVMaXN0X0FkZEFsbEZpbGVzSW5QYXRoKCkKKyAgVW5pdFRlc3RGaWxlTGlzdF9BZGRTeW1saW5rKCkKKworCitkZWYgVW5pdFRlc3QoKToKKyAgdGVzdHMgPSBbCisgICAgWydVbml0VGVzdFRlbXBGaWxlU3lzdGVtJywgVW5pdFRlc3RUZW1wRmlsZVN5c3RlbV0sCisgICAgWydVbml0VGVzdEZpbGVMaXN0X0FkZEZpbGUnLCBVbml0VGVzdEZpbGVMaXN0X0FkZEZpbGVdLAorICAgIFsnVW5pdFRlc3RGaWxlTGlzdF9BZGRTeW1saW5rJywgVW5pdFRlc3RGaWxlTGlzdF9BZGRTeW1saW5rXSwKKyAgICBbJ1VuaXRUZXN0RmlsZUxpc3RfQWRkQWxsRmlsZXNJblBhdGgnLCBVbml0VGVzdEZpbGVMaXN0X0FkZEFsbEZpbGVzSW5QYXRoXSwKKyAgXQorICBmYWlsZWRfdGVzdHMgPSBbXQorICBmb3IgbmFtZSwgdGVzdCBpbiB0ZXN0czoKKyAgICB0cnk6CisgICAgICBwcmludCgnXG4nICsgbmFtZSArICcgc3RhcnRlZC4nKQorICAgICAgdGVzdCgpCisgICAgICBwcmludChuYW1lICsgJyBwYXNzZWQuJykKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgIGZhaWxlZF90ZXN0cy5hcHBlbmQobmFtZSkKKyAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgcHJpbnQoJ0Vycm9yIGhhcHBlbmVkIGR1cmluZyB0ZXN0ICcgKyBuYW1lKQorCisgIGlmIGZhaWxlZF90ZXN0czoKKyAgICBwcmludCAnXG5cblRoZSBmb2xsb3dpbmcgdGVzdHMgZmFpbGVkOiAnICsgJywnLmpvaW4oZmFpbGVkX3Rlc3RzKQorICAgIHJldHVybiAxCisgIGVsc2U6CisgICAgcmV0dXJuIDAKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBVbml0VGVzdCgpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2J1aWxkL2d5cF9ydW5uZXIucHkgYi9zcmMvc3RhcmJvYXJkL2J1aWxkL2d5cF9ydW5uZXIucHkKaW5kZXggNDMyMDMzNC4uNjUxYjY3NiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9idWlsZC9neXBfcnVubmVyLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvYnVpbGQvZ3lwX3J1bm5lci5weQpAQCAtMzQsNyArMzQsNyBAQAogICBob3N0X29zX25hbWVzID0gewogICAgICAgJ2xpbnV4Mic6ICdsaW51eCcsCiAgICAgICAnbGludXgzJzogJ2xpbnV4JywKLSAgICAgICdkYXJ3aW4nOiAnbGludXgnLAorICAgICAgJ2Rhcndpbic6ICdtYWMnLAogICAgICAgJ3dpbjMyJzogJ3dpbicsCiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9idWlsZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9idWlsZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uLnB5CmluZGV4IGU5YzczZmYuLmU0NjRhYTIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYnVpbGQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi5weQorKysgYi9zcmMvc3RhcmJvYXJkL2J1aWxkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTI3OCw4ICsyNzgsOSBAQAogICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5HZXRMYXVuY2hlclBhdGgoKSwgJ2xhdW5jaGVyLnB5JykpCiAgICAgdHJ5OgogICAgICAgcmV0dXJuIGltcC5sb2FkX3NvdXJjZSgnbGF1bmNoZXInLCBtb2R1bGVfcGF0aCkKLSAgICBleGNlcHQgKElPRXJyb3IsIEltcG9ydEVycm9yLCBSdW50aW1lRXJyb3IpOgotICAgICAgbG9nZ2luZy53YXJuaW5nKCdVbmFibGUgdG8gbG9hZCBsYXVuY2hlciBmcm9tICVzLicsIG1vZHVsZV9wYXRoKQorICAgIGV4Y2VwdCAoSU9FcnJvciwgSW1wb3J0RXJyb3IsIFJ1bnRpbWVFcnJvcikgYXMgZXJyb3I6CisgICAgICBsb2dnaW5nLmVycm9yKCdVbmFibGUgdG8gbG9hZCBsYXVuY2hlciBtb2R1bGUgZnJvbSAlcy4nLCBtb2R1bGVfcGF0aCkKKyAgICAgIGxvZ2dpbmcuZXJyb3IoZXJyb3IpCiAgICAgICByZXR1cm4gTm9uZQogCiAgIGRlZiBHZXRUZXN0RW52VmFyaWFibGVzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9idWlsZC9wb3J0X3N5bWxpbmsucHkgYi9zcmMvc3RhcmJvYXJkL2J1aWxkL3BvcnRfc3ltbGluay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2YwMmRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9idWlsZC9wb3J0X3N5bWxpbmsucHkKQEAgLTAsMCArMSwyMzYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2RlZiBJc1dpbmRvd3MoKToKKyAgcmV0dXJuIF9Jc1dpbmRvd3MoKQorCisKKyMgUGxhdGZvcm0gbmV1dHJhbCB2ZXJzaW9uIG9zIG9zLnBhdGguaXNsaW5rKCkKK2RlZiBJc1N5bUxpbmsocGF0aCk6CisgIHJldHVybiBfSXNTeW1MaW5rKHBhdGg9cGF0aCkKKworCitkZWYgTWFrZVN5bUxpbmsoZnJvbV9mb2xkZXIsIGxpbmtfZm9sZGVyKToKKyAgcmV0dXJuIF9NYWtlU3ltTGluayhmcm9tX2ZvbGRlcj1mcm9tX2ZvbGRlciwgbGlua19mb2xkZXI9bGlua19mb2xkZXIpCisKKworZGVmIFJlYWRTeW1MaW5rKGxpbmtfcGF0aCk6CisgIHJldHVybiBfUmVhZFN5bUxpbmsobGlua19wYXRoPWxpbmtfcGF0aCkKKworCitkZWYgRGVsU3ltTGluayhsaW5rX3BhdGgpOgorICByZXR1cm4gX0RlbFN5bUxpbmsobGlua19wYXRoPWxpbmtfcGF0aCkKKworCitkZWYgUm10cmVlKHBhdGgpOgorICByZXR1cm4gX1JtdHJlZShwYXRoPXBhdGgpCisKKworZGVmIE9zV2Fsayhyb290X2RpciwgdG9wZG93bj1UcnVlLCBvbmVycm9yPU5vbmUsIGZvbGxvd2xpbmtzPUZhbHNlKToKKyAgcmV0dXJuIF9Pc1dhbGsocm9vdF9kaXI9cm9vdF9kaXIsCisgICAgICAgICAgICAgICAgIHRvcGRvd249dG9wZG93biwKKyAgICAgICAgICAgICAgICAgb25lcnJvcj1vbmVycm9yLAorICAgICAgICAgICAgICAgICBmb2xsb3dsaW5rcz1mb2xsb3dsaW5rcykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2ltcG9ydCBfZW52CisKKworZGVmIF9Jc1dpbmRvd3MoKToKKyAgcmV0dXJuIHN5cy5wbGF0Zm9ybSBpbiBbJ3dpbjMyJywgJ2N5Z3dpbiddCisKKworZGVmIF9Jc1N5bUxpbmsocGF0aCk6CisgIGlmIF9Jc1dpbmRvd3MoKToKKyAgICBmcm9tIHN0YXJib2FyZC5idWlsZC53aW5fc3ltbGluayBpbXBvcnQgSXNSZXBhcnNlUG9pbnQKKyAgICByZXR1cm4gSXNSZXBhcnNlUG9pbnQocGF0aCkKKyAgZWxzZToKKyAgICByZXR1cm4gb3MucGF0aC5pc2xpbmsocGF0aCkKKworCitkZWYgX01ha2VTeW1MaW5rKGZyb21fZm9sZGVyLCBsaW5rX2ZvbGRlcik6CisgIGlmIF9Jc1dpbmRvd3MoKToKKyAgICBmcm9tIHN0YXJib2FyZC5idWlsZC53aW5fc3ltbGluayBpbXBvcnQgQ3JlYXRlUmVwYXJzZVBvaW50CisgICAgcmV0dXJuIENyZWF0ZVJlcGFyc2VQb2ludChmcm9tX2ZvbGRlciwgbGlua19mb2xkZXIpCisgIGVsc2U6CisgICAgb3MubGluayhmcm9tX2ZvbGRlciwgbGlua19mb2xkZXIpCisKKworZGVmIF9SZWFkU3ltTGluayhsaW5rX3BhdGgpOgorICAiIiJSZXR1cm5zIGEgYWJzb2x1dGUgcGF0aCB0byB0aGUgZm9sZGVyIHJlZmVycmVkIHRvIGJ5IHRoZSBsaW5rX3BhdGguIiIiCisgIGlmIElzV2luZG93cygpOgorICAgIGZyb20gc3RhcmJvYXJkLmJ1aWxkLndpbl9zeW1saW5rIGltcG9ydCBSZWFkUmVwYXJzZVBvaW50CisgICAgcGF0aCA9IFJlYWRSZXBhcnNlUG9pbnQobGlua19wYXRoKQorICBlbHNlOgorICAgIHBhdGggPSBvcy5yZWFkbGluayhsaW5rX3BhdGgpCisgIGlmIHBhdGggYW5kICcuLicgaW4gcGF0aDoKKyAgICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGxpbmtfcGF0aCwgcGF0aCkpKQorICByZXR1cm4gcGF0aAorCisKK2RlZiBfRGVsU3ltTGluayhsaW5rX3BhdGgpOgorICBpZiBJc1dpbmRvd3MoKToKKyAgICBmcm9tIHN0YXJib2FyZC5idWlsZC53aW5fc3ltbGluayBpbXBvcnQgVW5saW5rUmVwYXJzZVBvaW50CisgICAgVW5saW5rUmVwYXJzZVBvaW50KGxpbmtfcGF0aCkKKyAgZWxzZToKKyAgICBvcy51bmxpbmsobGlua19wYXRoKQorCisKKworZGVmIF9SbXRyZWUocGF0aCk6CisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICByZXR1cm4KKyAgaWYgX0lzV2luZG93cygpOgorICAgIGZyb20gc3RhcmJvYXJkLmJ1aWxkLndpbl9zeW1saW5rIGltcG9ydCBSbXRyZWVTaGFsbG93CisgICAgUm10cmVlU2hhbGxvdyhwYXRoKQorICBlbHNlOgorICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKworZGVmIF9Pc1dhbGsocm9vdF9kaXIsIHRvcGRvd249VHJ1ZSwgb25lcnJvcj1Ob25lLCBmb2xsb3dsaW5rcz1GYWxzZSk6CisgIGlmIElzV2luZG93cygpOgorICAgIGZyb20gc3RhcmJvYXJkLmJ1aWxkLndpbl9zeW1saW5rIGltcG9ydCBPc1dhbGsKKyAgICByZXR1cm4gT3NXYWxrKHJvb3RfZGlyLCB0b3Bkb3duLCBvbmVycm9yLCBmb2xsb3dsaW5rcykKKyAgZWxzZToKKyAgICByZXR1cm4gb3Mud2Fsayhyb290X2RpciwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpCisKKworZGVmIF9Jc1NhbWVQYXRoKHAxLCBwMik6CisgIGlmIG5vdCBwMToKKyAgICBwMSA9IE5vbmUKKyAgaWYgbm90IHAyOgorICAgIHAyID0gTm9uZQorICBpZiBwMSA9PSBwMjoKKyAgICByZXR1cm4gVHJ1ZQorICBpZiAobm90IHAxKSBvciAobm90IHAyKToKKyAgICByZXR1cm4gRmFsc2UKKyAgcDEgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChwMSkpCisgIHAyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgocDIpKQorICBpZiBwMSA9PSBwMjoKKyAgICByZXR1cm4gVHJ1ZQorICB0cnk6CisgICAgcmV0dXJuIG9zLnN0YXQocDEpID09IG9zLnN0YXQocDIpCisgIGV4Y2VwdDoKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgVW5pdFRlc3QoKToKKyAgIiIiVGVzdHMgdGhhdCBhIHNtYWxsIGRpcmVjdG9yeSBoaWVyYXJjaHkgY2FuIGJlIGNyZWF0ZWQgYW5kIHRoZW4gc3ltbGlua2VkLAorICBhbmQgdGhlbiByZW1vdmVkLiIiIgorICB0bXBfZGlyID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25bJ3RlbXAnXSwgJ3dpbl9zeW1saW5rJykKKyAgZnJvbV9kaXIgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2Zyb21fZGlyJykKKyAgdGVzdF90eHQgPSBvcy5wYXRoLmpvaW4oZnJvbV9kaXIsICd0ZXN0LnR4dCcpCisgIGlubmVyX2RpciA9IG9zLnBhdGguam9pbihmcm9tX2RpciwgJ2lubmVyX2RpcicpCisgIGxpbmtfZGlyID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdsaW5rJykKKyAgbGlua19kaXIyID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdsaW5rMicpCisgIGlmIElzU3ltTGluayhsaW5rX2Rpcik6CisgICAgcHJpbnQgIkRlbGV0aW5nIHByZXZpb3VzIGxpbmtfZGlyOiIsIGxpbmtfZGlyCisgICAgRGVsU3ltTGluayhsaW5rX2RpcikKKyAgZWxzZToKKyAgICBwcmludCAiUHJldmlvdXMgbGluayBkaXIgZG9lcyBub3QgZXhpc3QuIgorICBwcmludCAiZnJvbV9kaXI6Iiwgb3MucGF0aC5hYnNwYXRoKGZyb21fZGlyKQorICBwcmludCAibGlua19kaXI6Iiwgb3MucGF0aC5hYnNwYXRoKGxpbmtfZGlyKQorICBwcmludCAibGlua19kaXIgZXhpc3RzPyAiLCBSZWFkU3ltTGluayhsaW5rX2RpcikKKworICBpZiBub3Qgb3MucGF0aC5pc2Rpcihmcm9tX2Rpcik6CisgICAgb3MubWFrZWRpcnMoZnJvbV9kaXIpCisgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGlubmVyX2Rpcik6CisgICAgb3MubWFrZWRpcnMoaW5uZXJfZGlyKQorICB3aXRoIG9wZW4odGVzdF90eHQsICd3JykgYXMgZmQ6CisgICAgZmQud3JpdGUoJ2hlbGxvIHdvcmxkJykKKworICAjIENoZWNrIHRoYXQgdGhlIFJlYWRSZXBhcnNlUG9pbnQgaGFuZGxlcyBub24gbGluayBvYmplY3RzIG9rLgorICBpZiBSZWFkU3ltTGluayhmcm9tX2Rpcik6CisgICAgcmFpc2UgSU9FcnJvcigiRXhlcGVjdGVkIFJlYWRTeW1MaW5rKCkgdG8gcmV0dXJuIE5vbmUgZm9yICIgKyBmcm9tX2RpcikKKyAgaWYgUmVhZFN5bUxpbmsodGVzdF90eHQpOgorICAgIHJhaXNlIElPRXJyb3IoIkV4ZXBlY3RlZCBSZWFkU3ltTGluaygpIHRvIHJldHVybiBOb25lIGZvciAiICsgdGVzdF90eHQpCisKKyAgTWFrZVN5bUxpbmsoZnJvbV9kaXIsIGxpbmtfZGlyKQorCisgIGxpbmtfY3JlYXRlZF9vayA9IElzU3ltTGluayhsaW5rX2RpcikKKyAgaWYgbGlua19jcmVhdGVkX29rOgorICAgIHByaW50KCJMaW5rIGNyZWF0ZWQ6ICIgKyBzdHIobGlua19jcmVhdGVkX29rKSkKKyAgZWxzZToKKyAgICByYWlzZSBJT0Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxpbmsgIiArIGxpbmtfZGlyKQorCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsaW5rX2Rpcik6CisgICAgcmFpc2UgSU9FcnJvcignb3MucGF0aC5leGlzdHMobGlua19kaXIpIGlzIEZhbHNlLicpCisKKyAgTWFrZVN5bUxpbmsoZnJvbV9kaXIsIGxpbmtfZGlyMikKKyAgaWYgbm90IElzU3ltTGluayhsaW5rX2RpcjIpOgorICAgIHJhaXNlIElPRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgbGluayAiICsgbGlua19kaXIyKQorICBEZWxTeW1MaW5rKGxpbmtfZGlyMikKKyAgaWYgb3MucGF0aC5leGlzdHMobGlua19kaXIyKToKKyAgICByYWlzZSBJT0Vycm9yKCJTdGlsbCBleGlzdHM6ICIgKyBsaW5rX2RpcjIpCisKKyAgZnJvbV9kaXJfMiA9IFJlYWRTeW1MaW5rKGxpbmtfZGlyKQorICBpZiBfSXNTYW1lUGF0aChmcm9tX2Rpcl8yLCBmcm9tX2Rpcik6CisgICAgcHJpbnQgIkxpbmsgZXhpc3RzLiIKKyAgZWxzZToKKyAgICByYWlzZSBJT0Vycm9yKCJMaW5rIG1pc21hdGNoOiAiICsgZnJvbV9kaXJfMiArICcgIT0gJyArIGZyb21fZGlyKQorICBkZWYgR2V0QWxsUGF0aHMoc3RhcnRfZGlyLCBmb2xsb3dsaW5rcyk6CisgICAgcGF0aHMgPSBbXQorICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBPc1dhbGsodG1wX2RpciwgZm9sbG93bGlua3M9Zm9sbG93bGlua3MpOgorICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKKyAgICAgICAgcGF0aHMuYXBwZW5kKHBhdGgpCisgICAgICBmb3IgbmFtZSBpbiBkaXJzOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCisgICAgICAgIHBhdGhzLmFwcGVuZChwYXRoKQorICAgIHJldHVybiBwYXRocworICBkZWYgUGF0aFR5cGVUb1N0cmluZyhwYXRoKToKKyAgICBpZiBJc1N5bUxpbmsocGF0aCk6CisgICAgICByZXR1cm4gJ2xpbmsnCisgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgIHJldHVybiAnZGlyJworICAgIHJldHVybiAnZmlsZScKKyAgcGF0aHNfbm9mb2xsb3dfbGlua3MgPSBHZXRBbGxQYXRocyh0bXBfZGlyLCBmb2xsb3dsaW5rcz1GYWxzZSkKKyAgcGF0aHNfZm9sbG93X2xpbmtzID0gR2V0QWxsUGF0aHModG1wX2RpciwgZm9sbG93bGlua3M9VHJ1ZSkKKyAgcHJpbnQgJ1xuT3NXYWxrIEZvbGxvdyBsaW5rczonCisgIGZvciBwYXRoIGluIHBhdGhzX2ZvbGxvd19saW5rczoKKyAgICBwcmludCAnICAnICsgcGF0aCArICcgKCcgKyBQYXRoVHlwZVRvU3RyaW5nKHBhdGgpICsgJyknCisgIHByaW50ICdcbk9zV2FsayBOby1Gb2xsb3cgbGlua3M6JworICBmb3IgcGF0aCBpbiBwYXRoc19ub2ZvbGxvd19saW5rczoKKyAgICBwcmludCAnICAnICsgcGF0aCArICcgKCcgKyBQYXRoVHlwZVRvU3RyaW5nKHBhdGgpICsgJyknCisgIHByaW50ICcnCisKKyAgYXNzZXJ0KGxpbmtfZGlyIGluIHBhdGhzX25vZm9sbG93X2xpbmtzKQorICBhc3NlcnQobGlua19kaXIgaW4gcGF0aHNfZm9sbG93X2xpbmtzKQorICBhc3NlcnQob3MucGF0aC5qb2luKGxpbmtfZGlyLCAndGVzdC50eHQnKSBpbiBwYXRoc19mb2xsb3dfbGlua3MpCisgIGFzc2VydChub3Qgb3MucGF0aC5qb2luKGxpbmtfZGlyLCAndGVzdC50eHQnKSBpbiBwYXRoc19ub2ZvbGxvd19saW5rcykKKyAgUm10cmVlKGxpbmtfZGlyKQorICBpZiBvcy5wYXRoLmV4aXN0cyhsaW5rX2Rpcik6CisgICAgcmFpc2UgSU9FcnJvcigiTGluayBkaXIgIiArIGxpbmtfZGlyICsgIiBzdGlsbCBleGlzdHMuIikKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZyb21fZGlyKToKKyAgICByYWlzZSBJT0Vycm9yKCJGcm9tIERpciAiICsgZnJvbV9kaXIgKyAiIHdhcyBkZWxldGVkISIpCisgIHByaW50ICJUZXN0IGNvbXBsZXRlZC4iCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgVW5pdFRlc3QoKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9idWlsZC93aW5fc3ltbGluay5weSBiL3NyYy9zdGFyYm9hcmQvYnVpbGQvd2luX3N5bWxpbmsucHkKaW5kZXggYjM0MzEzMi4uNDYzMjNiMyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9idWlsZC93aW5fc3ltbGluay5weQorKysgYi9zcmMvc3RhcmJvYXJkL2J1aWxkL3dpbl9zeW1saW5rLnB5CkBAIC0zNiw3ICszNiw4IEBACiAKIAogZGVmIENyZWF0ZVJlcGFyc2VQb2ludChmcm9tX2ZvbGRlciwgbGlua19mb2xkZXIpOgotICAiIiIgTWltaWNzIG9zLnN5bWxpbmsgZm9yIHVzYWdlLiAiIiIKKyAgIiIiIE1pbWljcyBvcy5zeW1saW5rIGZvciB1c2FnZS4gSWYgbGluayBjYW5ub3QgYmUgY3JlYXRlZCB0aGVuIGFuIE9TRXJyb3IKKyAgaXMgcmFpc2VkLiIiIgogICByZXR1cm4gX0NyZWF0ZVJlcGFyc2VQb2ludChmcm9tX2ZvbGRlciwgbGlua19mb2xkZXIpCiAKIApAQCAtNjIsNiArNjMsMTQgQEAKICAgcmV0dXJuIF9SbXRyZWVTaGFsbG93KGRpcnBhdGgpCiAKIAorZGVmIE9zV2Fsayh0b3AsIHRvcGRvd249VHJ1ZSwgb25lcnJvcj1Ob25lLCBmb2xsb3dsaW5rcz1GYWxzZSk6CisgICIiIiBMaWtlIG9zLndhbGsoKSBidXQgY29ycmVjdGx5IGhhbmRsZXMgd2luZG93cyByZXBhcnNlIHBvaW50cyBhcyBzeW1saW5rcy4KKyAgQWxsIHN5bWxpbmsgZGlyZWN0b3JpZXMgYXJlIHJldHVybmVkIGluIHRoZSBkaXJlY3RvcnkgbGlzdCBhbmQgdGhlIGNhbGxlciBtdXN0CisgIGNhbGwgSXNSZXBhcnNlUG9pbnQoKSBvbiB0aGUgcGF0aCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGlyZWN0b3J5IGlzCisgIHJlYWwgb3IgYSBzeW1saW5rLiIiIgorICByZXR1cm4gX09zV2Fsayh0b3AsIHRvcGRvd24sIG9uZXJyb3IsIGZvbGxvd2xpbmtzKQorCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTkwLDkgKzk5LDMwIEBACiAgICAgICAgIHBhc3MKIAogCi1kZWYgX1JtdHJlZVNoYWxsb3cocGF0aCk6Ci0gIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKLSAgc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWydjbWQnLCAnL2MnLCAncm1kaXInLCAnL1MnLCAnL1EnLCBwYXRoXSkKK2RlZiBfUm10cmVlU2hhbGxvdyhyb290X2Rpcik6CisgIGRlbF9kaXJzID0gW10gICMgRGVmZXIgZGVsZXRpb24gb2YgZGlyZWN0b3JpZXMuCisgIGlmIF9Jc1JlcGFyc2VQb2ludChyb290X2Rpcik6CisgICAgX1VubGlua1JlcGFyc2VQb2ludChyb290X2RpcikKKyAgICByZXR1cm4KKyAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIE9zV2Fsayhyb290X2RpciwgZm9sbG93bGlua3M9RmFsc2UpOgorICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQorICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgZm9yIG5hbWUgaW4gZGlyczoKKyAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKKyAgICAgIGlmIF9Jc1JlcGFyc2VQb2ludChwYXRoKToKKyAgICAgICAgX1VubGlua1JlcGFyc2VQb2ludChwYXRoKQorICAgICAgZWxzZToKKyAgICAgICAgZGVsX2RpcnMuYXBwZW5kKHBhdGgpCisgICMgQXQgdGhpcyBwb2ludCwgYWxsIGZpbGVzIHNob3VsZCBiZSBkZWxldGVkIGFuZCBhbGwgc3ltbGlua3Mgc2hvdWxkIGJlCisgICMgdW5saW5rZWQuCisgIGZvciBkIGluIGRpcnMgKyBbcm9vdF9kaXJdOgorICAgIHRyeToKKyAgICAgIGlmIG9zLnBhdGguaXNkaXIoZCk6CisgICAgICAgIHNodXRpbC5ybXRyZWUoZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgcHJpbnQoJ0Vycm9yIHdoaWxlIGRlbGV0aW5nOiAnICsgc3RyKGVycikpCiAKIAogZGVmIF9SZWFkUmVwYXJzZVBvaW50U2hlbGwocGF0aCk6CkBAIC0xMzgsNyArMTY4LDYgQEAKIAogCiBkZWYgX0NyZWF0ZVJlcGFyc2VQb2ludChmcm9tX2ZvbGRlciwgbGlua19mb2xkZXIpOgotICBmcm9tX2ZvbGRlciA9IG9zLnBhdGguYWJzcGF0aChmcm9tX2ZvbGRlcikKICAgbGlua19mb2xkZXIgPSBvcy5wYXRoLmFic3BhdGgobGlua19mb2xkZXIpCiAgIGlmIG9zLnBhdGguaXNkaXIobGlua19mb2xkZXIpOgogICAgIF9SZW1vdmVFbXB0eURpcmVjdG9yeShsaW5rX2ZvbGRlcikKQEAgLTE0NywxNSArMTc2LDIyIEBACiAgIHRyeToKICAgICBmcm9tIHdpbl9zeW1saW5rX2Zhc3QgaW1wb3J0IEZhc3RDcmVhdGVSZXBhcnNlTGluawogICAgIEZhc3RDcmVhdGVSZXBhcnNlTGluayhmcm9tX2ZvbGRlciwgbGlua19mb2xkZXIpCisgICAgcmV0dXJuCisgIGV4Y2VwdCBPU0Vycm9yIGFzIG9zX2VycjoKKyAgICAjIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgY2FsbC4KKyAgICBwYXNzCiAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgotICAgIHByaW50KF9fZmlsZV9fICsgJyBlcnJvcjogJyArIHN0cihlcnIpICsgXAorICAgIHByaW50KF9fZmlsZV9fICsgJyB1bmV4cGVjdGVkIGVycm9yOiAnICsgc3RyKGVycikgKyBcCisgICAgICAgICAgJywgZnJvbT0nK2Zyb21fZm9sZGVyKycsIGxpbms9JytsaW5rX2ZvbGRlcisgXAogICAgICAgICAgICcsIGZhbGxpbmcgYmFjayB0byBjb21tYW5kIGxpbmUgdmVyc2lvbi4nKQotICAgIHBhcl9kaXIgPSBvcy5wYXRoLmRpcm5hbWUobGlua19mb2xkZXIpCi0gICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGFyX2Rpcik6Ci0gICAgICBvcy5tYWtlZGlycyhwYXJfZGlyKQotICAgIGNtZF9wYXJ0cyA9IFsnY21kJywgJy9jJywgJ21rbGluaycsICcvaicsIGxpbmtfZm9sZGVyLCBmcm9tX2ZvbGRlcl0KLSAgICBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWRfcGFydHMpCi0KKyAgcGFyX2RpciA9IG9zLnBhdGguZGlybmFtZShsaW5rX2ZvbGRlcikKKyAgaWYgbm90IG9zLnBhdGguaXNkaXIocGFyX2Rpcik6CisgICAgb3MubWFrZWRpcnMocGFyX2RpcikKKyAgY21kX3BhcnRzID0gWydjbWQnLCAnL2MnLCAnbWtsaW5rJywgJy9qJywgbGlua19mb2xkZXIsIGZyb21fZm9sZGVyXQorICBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWRfcGFydHMpCisgIGlmIG5vdCBfSXNSZXBhcnNlUG9pbnQobGlua19mb2xkZXIpOgorICAgIHJhaXNlIE9TRXJyb3IoJ0NvdWxkIG5vdCBjcmVhdGUgc3ltIGxpbmsgJyArIGxpbmtfZm9sZGVyICsgJyB0byAnICsgXAorICAgICAgICAgICAgICAgICAgZnJvbV9mb2xkZXIpCiAKIAogZGVmIF9VbmxpbmtSZXBhcnNlUG9pbnQobGlua19kaXIpOgpAQCAtMTk1LDYgKzIzMSwzMCBAQAogICAgIHJldHVybiBGYWxzZQogCiAKK2RlZiBfT3NXYWxrKHRvcCwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpOgorICB0cnk6CisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRvcCkKKyAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6CisgICAgICBvbmVycm9yKGVycikKKyAgICByZXR1cm4KKyAgZGlycywgbm9uZGlycyA9IFtdLCBbXQorICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbih0b3AsIG5hbWUpKToKKyAgICAgIGRpcnMuYXBwZW5kKG5hbWUpCisgICAgZWxzZToKKyAgICAgIG5vbmRpcnMuYXBwZW5kKG5hbWUpCisgIGlmIHRvcGRvd246CisgICAgeWllbGQgdG9wLCBkaXJzLCBub25kaXJzCisgIGZvciBuYW1lIGluIGRpcnM6CisgICAgbmV3X3BhdGggPSBvcy5wYXRoLmpvaW4odG9wLCBuYW1lKQorICAgIGlmIGZvbGxvd2xpbmtzIG9yIG5vdCBfSXNSZXBhcnNlUG9pbnQobmV3X3BhdGgpOgorICAgICAgZm9yIHggaW4gX09zV2FsayhuZXdfcGF0aCwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpOgorICAgICAgICB5aWVsZCB4CisgIGlmIG5vdCB0b3Bkb3duOgorICAgIHlpZWxkIHRvcCwgZGlycywgbm9uZGlycworCisKIGRlZiBVbml0VGVzdCgpOgogICAiIiJUZXN0cyB0aGF0IGEgc21hbGwgZGlyZWN0b3J5IGhpZXJhcmNoeSBjYW4gYmUgY3JlYXRlZCBhbmQgdGhlbiBzeW1saW5rZWQsCiAgIGFuZCB0aGVuIHJlbW92ZWQuIiIiCkBAIC0yNDksNyArMzA5LDM2IEBACiAgICAgcHJpbnQgIkxpbmsgZXhpc3RzLiIKICAgZWxzZToKICAgICByYWlzZSBJT0Vycm9yKCJMaW5rIG1pc21hdGNoOiAiICsgZnJvbV9kaXJfMiArICcgIT0gJyArIGZyb21fZGlyKQorICBkZWYgR2V0QWxsUGF0aHMoc3RhcnRfZGlyLCBmb2xsb3dsaW5rcyk6CisgICAgcGF0aHMgPSBbXQorICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBPc1dhbGsodG1wX2RpciwgZm9sbG93bGlua3M9Zm9sbG93bGlua3MpOgorICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKKyAgICAgICAgcGF0aHMuYXBwZW5kKHBhdGgpCisgICAgICBmb3IgbmFtZSBpbiBkaXJzOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCisgICAgICAgIHBhdGhzLmFwcGVuZChwYXRoKQorICAgIHJldHVybiBwYXRocworICBkZWYgUGF0aFR5cGVUb1N0cmluZyhwYXRoKToKKyAgICBpZiBJc1JlcGFyc2VQb2ludChwYXRoKToKKyAgICAgIHJldHVybiAnbGluaycKKyAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgcmV0dXJuICdkaXInCisgICAgcmV0dXJuICdmaWxlJworICBwYXRoc19ub2ZvbGxvd19saW5rcyA9IEdldEFsbFBhdGhzKHRtcF9kaXIsIGZvbGxvd2xpbmtzPUZhbHNlKQorICBwYXRoc19mb2xsb3dfbGlua3MgPSBHZXRBbGxQYXRocyh0bXBfZGlyLCBmb2xsb3dsaW5rcz1UcnVlKQorICBwcmludCAnXG5Pc1dhbGsgRm9sbG93IGxpbmtzOicKKyAgZm9yIHBhdGggaW4gcGF0aHNfZm9sbG93X2xpbmtzOgorICAgIHByaW50ICcgICcgKyBwYXRoICsgJyAoJyArIFBhdGhUeXBlVG9TdHJpbmcocGF0aCkgKyAnKScKKyAgcHJpbnQgJ1xuT3NXYWxrIE5vLUZvbGxvdyBsaW5rczonCisgIGZvciBwYXRoIGluIHBhdGhzX25vZm9sbG93X2xpbmtzOgorICAgIHByaW50ICcgICcgKyBwYXRoICsgJyAoJyArIFBhdGhUeXBlVG9TdHJpbmcocGF0aCkgKyAnKScKKyAgcHJpbnQgJycKIAorICBhc3NlcnQobGlua19kaXIgaW4gcGF0aHNfbm9mb2xsb3dfbGlua3MpCisgIGFzc2VydChsaW5rX2RpciBpbiBwYXRoc19mb2xsb3dfbGlua3MpCisgIGFzc2VydChvcy5wYXRoLmpvaW4obGlua19kaXIsICd0ZXN0LnR4dCcpIGluIHBhdGhzX2ZvbGxvd19saW5rcykKKyAgYXNzZXJ0KG5vdCBvcy5wYXRoLmpvaW4obGlua19kaXIsICd0ZXN0LnR4dCcpIGluIHBhdGhzX25vZm9sbG93X2xpbmtzKQogICBSbXRyZWVTaGFsbG93KGxpbmtfZGlyKQogICBpZiBvcy5wYXRoLmV4aXN0cyhsaW5rX2Rpcik6CiAgICAgcmFpc2UgSU9FcnJvcigiTGluayBkaXIgIiArIGxpbmtfZGlyICsgIiBzdGlsbCBleGlzdHMuIikKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYnVpbGQvd2luX3N5bWxpbmtfZmFzdC5weSBiL3NyYy9zdGFyYm9hcmQvYnVpbGQvd2luX3N5bWxpbmtfZmFzdC5weQppbmRleCAwZmQ3NmVmLi4yODczYjhiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2J1aWxkL3dpbl9zeW1saW5rX2Zhc3QucHkKKysrIGIvc3JjL3N0YXJib2FyZC9idWlsZC93aW5fc3ltbGlua19mYXN0LnB5CkBAIC0yNyw2ICsyNyw4IEBACiAKIAogZGVmIEZhc3RDcmVhdGVSZXBhcnNlTGluayhmcm9tX2ZvbGRlciwgbGlua19mb2xkZXIpOgorICAiIiJDcmVhdGVzIGEgcmVwYXJzZSBsaW5rLiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzIHRvIGNyZWF0ZSB0aGUgbGluayBkdWUgdG8KKyAgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gbm90IHN1cHBvcnRpbmcgaXQgdGhlbiBhbiBPU0Vycm9yIGlzIHJhaXNlZC4iIiIKICAgcmV0dXJuIF9GYXN0Q3JlYXRlUmVwYXJzZUxpbmsoZnJvbV9mb2xkZXIsIGxpbmtfZm9sZGVyKQogCiAKQEAgLTM0LDkgKzM2LDkgQEAKICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0KK2ltcG9ydCBvcwogZnJvbSBjdHlwZXMgaW1wb3J0IFwKLSAgICBQT0lOVEVSLCBjX2J1ZmZlciwgYnlyZWYsIGFkZHJlc3NvZiwgY191Ynl0ZSwgU3RydWN0dXJlLCBVbmlvbgorICAgIFBPSU5URVIsIGNfYnVmZmVyLCBieXJlZiwgYWRkcmVzc29mLCBjX3VieXRlLCBTdHJ1Y3R1cmUsIFVuaW9uLCB3aW5kbGwKIGZyb20gY3R5cGVzLndpbnR5cGVzIGltcG9ydCBcCiAgICAgRFdPUkQsIExQQ1dTVFIsIEhBTkRMRSwgTFBWT0lELCBCT09MLCBVU0hPUlQsIFVMT05HLCBXQ0hBUiwgV2luRXJyb3IsIFdpbkRMTAogCkBAIC0xNDYsMTQgKzE0OCwzMCBAQAogICByZXR1cm4gcy5kZWNvZGUoJ3V0Zi04JykKIAogCitfX2tkbGwgPSBOb25lCitkZWYgX0dldEtlcm5lbDMyRGxsKCk6CisgIGdsb2JhbCBfX2tkbGwKKyAgaWYgX19rZGxsOgorICAgIHJldHVybiBfX2tkbGwKKyAgX19rZGxsID0gd2luZGxsLkxvYWRMaWJyYXJ5KCdrZXJuZWwzMi5kbGwnKQorICByZXR1cm4gX19rZGxsCisKKwogZGVmIF9GYXN0Q3JlYXRlUmVwYXJzZUxpbmsoZnJvbV9mb2xkZXIsIGxpbmtfZm9sZGVyKToKKyAgbGlua19mb2xkZXIgPSBvcy5wYXRoLmFic3BhdGgobGlua19mb2xkZXIpCiAgIGZyb21fZm9sZGVyID0gX1RvVW5pY29kZShmcm9tX2ZvbGRlcikKICAgbGlua19mb2xkZXIgPSBfVG9Vbmljb2RlKGxpbmtfZm9sZGVyKQotICBmcm9tIHdpbjMyZmlsZSBpbXBvcnQgQ3JlYXRlU3ltYm9saWNMaW5rCisgIHBhcl9kaXIgPSBvcy5wYXRoLmRpcm5hbWUobGlua19mb2xkZXIpCisgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhcl9kaXIpOgorICAgIG9zLm1ha2VkaXJzKHBhcl9kaXIpCisgIGtkbGwgPSBfR2V0S2VybmVsMzJEbGwoKQogICAjIE9ubHkgc3VwcG9ydGVkIGZyb20gV2luZG93cyAxMCBJbnNpZGVycyBidWlsZCAxNDk3MgogICBmbGFncyA9IFNZTUJPTElDX0xJTktfRkxBR19BTExPV19VTlBSSVZJTEVHRURfQ1JFQVRFIHwgXAogICAgICAgICAgIFNZTUJPTElDX0xJTktfRkxBR19ESVJFQ1RPUlkKLSAgQ3JlYXRlU3ltYm9saWNMaW5rKGxpbmtfZm9sZGVyLGZyb21fZm9sZGVyLCBmbGFncykKKyAgb2sgPSBrZGxsLkNyZWF0ZVN5bWJvbGljTGlua1cobGlua19mb2xkZXIsIGZyb21fZm9sZGVyLCBmbGFncykKKyAgaWYgbm90IG9rIG9yIG5vdCBfRmFzdElzUmVwYXJzZUxpbmsobGlua19mb2xkZXIpOgorICAgIHJhaXNlIE9TRXJyb3IoJ0NvdWxkIG5vdCBjcmVhdGUgc3ltIGxpbmsgJyArIGxpbmtfZm9sZGVyICsgJyB0byAnICsgXAorICAgICAgICAgICAgICAgICAgZnJvbV9mb2xkZXIpCiAKIAogZGVmIF9GYXN0SXNSZXBhcnNlTGluayhwYXRoKToKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRpb19sZWFrc19wb2VtLmggYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkaW9fbGVha3NfcG9lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzA2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkaW9fbGVha3NfcG9lbS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBoZWFkZXIgcGx1Z3MgaW4gdGhlIGxlYWtzIG9mIHN0ZGlvIGZ1bmN0aW9ucyBjYWxsZWQgYXMgc3RkOjo8ZnVuY3Rpb24+LgorCisjaWZuZGVmIFNUQVJCT0FSRF9DTElFTlRfUE9SVElOR19QT0VNX1NURElPX0xFQUtTX1BPRU1fSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0NMSUVOVF9QT1JUSU5HX1BPRU1fU1RESU9fTEVBS1NfUE9FTV9IXworCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgorCituYW1lc3BhY2Ugc3RkIHsKKworaW5saW5lIGludCBTYlN0cmluZ0Zvcm1hdChjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJndW1lbnRzKSB7CisgIHJldHVybiA6OlNiU3RyaW5nRm9ybWF0KGJ1ZmZlciwgc2l6ZSwgZm9ybWF0LCBhcmd1bWVudHMpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBfX2J1aWx0aW5fdnNucHJpbnRmCisjZGVmaW5lIF9fYnVpbHRpbl92c25wcmludGYgU2JTdHJpbmdGb3JtYXQKKyN1bmRlZiB2c25wcmludGYKKyNkZWZpbmUgdnNucHJpbnRmIFNiU3RyaW5nRm9ybWF0CisKKyNlbmRpZiAgLy8gU1RBUkJPQVJEX0NMSUVOVF9QT1JUSU5HX1BPRU1fU1RESU9fTEVBS1NfUE9FTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmggYi9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaAppbmRleCBjYzgxYmYyLi5hMTc4YWNlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaAorKysgYi9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaApAQCAtNjgsNiArNjgsMTcgQEAKIC8vICAgLy8gICBleHBvc2VzIGZ1bmN0aW9uYWxpdHkgZm9yIG15IG5ldyBmZWF0dXJlLgogLy8gICAjZGVmaW5lIFNCX01ZX0VYUEVSSU1FTlRBTF9GRUFUVVJFX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKKy8vIEludHJvZHVjZSBDb2JhbHQgRXh0ZW5zaW9ucyB1c2luZyB0aGUgU2JTeXN0ZW1HZXRFeHRlbnNpb24gaW50ZXJmYWNlLgorLy8gQ29iYWx0IGV4dGVuc2lvbnMgaW1wbGVtZW50IGFwcCAmIHBsYXRmb3JtIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkuCisjZGVmaW5lIFNCX0VYVEVOU0lPTlNfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKKy8vIERlcHJlY2F0ZSBTYlN5c3RlbUNsZWFyUGxhdGZvcm1FcnJvci4KKyNkZWZpbmUgU0JfREVQUkVDQVRFX0NMRUFSX1BMQVRGT1JNX0VSUk9SX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKKy8vIERlcHJlY2F0ZSB0aGUgZXZlbnRzIG9mIHR5cGUga1NiRXZlbnRUeXBlTmV0d29ya0Rpc2Nvbm5lY3QsCisvLyBrU2JFdmVudFR5cGVOZXR3b3JrQ29ubmVjdC4KKyNkZWZpbmUgU0JfREVQUkVDQVRFX0RJU0NPTk5FQ1RfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKwogLy8gQWRkIFNiTWVkaWFUcmFuc2ZlcklkKiBhcmd1bWVudCB8ZW90ZnwgdG8gU2JNZWRpYUlzVmlkZW9TdXBwb3J0ZWQsIHNvIHRoZQogLy8gcGxhdGZvcm0gbWF5IGluZGljYXRlIHN1cHBvcnQgb2YgcmVzb2x1dGlvbiwgYml0cmF0ZSwgZnBzLCBhbmQgY29kZWMKIC8vIGNvbmRpdGlvbmVkIG9uIGVvdGYuIEFsc28sIHJlbW92ZSB0aGUgZnVuY3Rpb24KQEAgLTExMCwxMCArMTIxLDI2IEBACiAvLyBBZGQgc3VwcG9ydCBmb3IgU2JUaHJlYWRTYW1wbGVyIGFuZCBTYlRocmVhZENvbnRleHQgdG8gc3VwcG9ydCBwcm9maWxpbmcuCiAjZGVmaW5lIFNCX1RIUkVBRF9TQU1QTEVSX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKLS8vIEludHJvZHVjZSBhIG5ldyBBUEkgaW4gc3RhcmJvYXJkL3dpbmRvdy5oIHdoaWNoIGRlY2xhcmVzIHRoZSBmdW5jdGlvbgotLy8gU2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMoKS4KKy8vIEludHJvZHVjZSBhIG5ldyBBUEkgaW4gc3RhcmJvYXJkL3dpbmRvdy5oIHdoaWNoIGRlY2xhcmVzIHRoZSBmdW5jdGlvbnMKKy8vIFNiV2luZG93VXBkYXRlT25TY3JlZW5LZXlib2FyZFN1Z2dlc3Rpb25zKCkgYW5kCisvLyBTYldpbmRvd09uU2NyZWVuS2V5Ym9hcmRTdWdnZXN0aW9uc1N1cHBvcnRlZCgpLgogI2RlZmluZSBTQl9PTl9TQ1JFRU5fS0VZQk9BUkRfU1VHR0VTVElPTlNfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KIAorLy8gSW50cm9kdWNlIG5ldyBwb3RlbnRpYWwgc3RhcmJvYXJkL2ZpbGUuaCBlcnJvciBjb2RlIHZhbHVlLAorLy8ga1NiRmlsZUVycm9ySU8gdG8gbWF0Y2ggZm9yIGV4YW1wbGUgIkVJTyIgb24gcG9zaXggcGxhdGZvcm1zLgorI2RlZmluZSBTQl9GSUxFX0VSUk9SX0lPX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorCisvLyBNb3ZlIHRoZSBkZWZpbml0aW9uIG9mIEZvcm1hdFN0cmluZygpIGZyb20gc3RyaW5nLmggdG8gYSBuZXcgaGVhZGVyCisvLyBmb3JtYXRfc3RyaW5nLmguCisjZGVmaW5lIFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorCisvLyBNYWtlIHRoZSBkZWNvZGUgdGFyZ2V0IGNvbnRlbnQgcmVnaW9uIHBhcmFtZXRlcnMgZmxvYXRzIGluc3RlYWQgb2YgaW50cy4KKy8vIFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIG1ha2UgaXQgc28gdGhhdCBvbiBwbGF0Zm9ybXMKKy8vIHdoZXJlIGl0IGlzIGRpZmZpY3VsdCB0byBvYnRhaW4gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSB0ZXh0dXJlLCB3ZSBjYW4KKy8vIHN0aWxsIGNvcnJlY3RseSBpZGVudGlmeSBhIHByZWNpc2UgZnJhY3Rpb25hbCAibm9ybWFsaXplZCIgY29udGVudCByZWdpb24KKy8vIHdpdGggdGhlIHRleHR1cmUgd2lkdGggYW5kIGhlaWdodCBzZXQgdG8gMS4KKyNkZWZpbmUgU0JfREVDT0RFX1RBUkdFVF9DT05URU5UX1JFR0lPTl9GTE9BVFMgU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKIC8vIC0tLSBSZWxlYXNlIENhbmRpZGF0ZSBGZWF0dXJlIERlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyAtLS0gQ29tbW9uIERldGVjdGVkIEZlYXR1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYxMCw2ICs2MzcsNyBAQAogI2VuZGlmICAvLyBkZWZpbmVkKFNCX01FRElBX0dQVV9CVUZGRVJfQlVER0VUKQogCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNgorCiAjaWYgZGVmaW5lZChTQl9IQVNfRFJNX0tFWV9TVEFUVVNFUykKICNpZiAhU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCiAjZXJyb3IgIlNCX0hBU19EUk1fS0VZX1NUQVRVU0VTIGlzIHJlcXVpcmVkIGZvciBTdGFyYm9hcmQgNiBvciBsYXRlci4iCkBAIC02MTcsNiArNjQ1LDE3IEBACiAjZWxzZSAgIC8vIGRlZmluZWQoU0JfSEFTX0RSTV9LRVlfU1RBVFVTRVMpCiAjZGVmaW5lIFNCX0hBU19EUk1fS0VZX1NUQVRVU0VTIDEKICNlbmRpZiAgLy8gZGVmaW5lZChTQl9IQVNfRFJNX0tFWV9TVEFUVVNFUykKKworI2lmIGRlZmluZWQoU0JfSEFTX0FVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQorI2lmICFTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCisjZXJyb3IgXAorICAgICJTQl9IQVNfQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIgaXMgcmVxdWlyZWQgZm9yIFN0YXJib2FyZCA2ICIgXAorICAgICAgICJvciBsYXRlci4iCisjZW5kaWYgIC8vICFTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCisjZWxzZSAgIC8vIGRlZmluZWQoU0JfSEFTX0FVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQorI2RlZmluZSBTQl9IQVNfQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIgMQorI2VuZGlmICAvLyBkZWZpbmVkKFNCX0hBU19BVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKKwogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA2CiAKICNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NRURJQV9FT1RGX0NIRUNLX1NVUFBPUlRfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmggYi9zcmMvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaAppbmRleCBhM2I4ZjFjLi41ZjhmODNhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaAorKysgYi9zcmMvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaApAQCAtMjM3LDEwICsyMzcsMjQgQEAKIC8vIERlZmluZXMgYSByZWN0YW5ndWxhciBjb250ZW50IHJlZ2lvbiB3aXRoaW4gYSBTYkRlY29kZVRhcmdldEluZm9QbGFuZQogLy8gc3RydWN0dXJlLgogdHlwZWRlZiBzdHJ1Y3QgU2JEZWNvZGVUYXJnZXRJbmZvQ29udGVudFJlZ2lvbiB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfREVDT0RFX1RBUkdFVF9DT05URU5UX1JFR0lPTl9GTE9BVFMKKyAgLy8gSWYgdGhlIHRleHR1cmUgKHdpZHRoLCBoZWlnaHQpIGlzIHNldCB0byAoMSwgMSksIHRoZW4gdGhlc2UgdmFsdWVzIHdpbGwKKyAgLy8gYmUgaW50ZXJwcmV0ZWQgYXMgbm9ybWFsaXplZCBjb29yZGluYXRlcywgYW5kIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyAgLy8gKGZvciBleGFtcGxlIEdMRVMgMi4wIHByb3ZpZGVzIG5vIG1ldGhvZCBvZiBvYnRhaW5pbmcgdGhlIHRleHR1cmUKKyAgLy8gd2lkdGgvaGVpZ2h0KSB0aGlzIG1heSBiZSBtb3JlIG5hdHVyYWwgdGhhbiBzcGVjaWZ5aW5nIGFic29sdXRlIHBpeGVsCisgIC8vIG9mZnNldHMuCisgIGZsb2F0IGxlZnQ7CisgIGZsb2F0IHRvcDsKKyAgZmxvYXQgcmlnaHQ7CisgIGZsb2F0IGJvdHRvbTsKKyNlbHNlCisgIC8vIFRoZXNlIGludGVnZXIgdmFsdWVzIGFyZSBhc3N1bWVkIHRvIGJlIGluIHVuaXRzIG9mIHBpeGVscywgd2l0aGluIHRoZQorICAvLyB0ZXh0dXJlJ3Mgd2lkdGggYW5kIGhlaWdodC4KICAgaW50IGxlZnQ7CiAgIGludCB0b3A7CiAgIGludCByaWdodDsKICAgaW50IGJvdHRvbTsKKyNlbmRpZgogfSBTYkRlY29kZVRhcmdldEluZm9Db250ZW50UmVnaW9uOwogCiAvLyBEZWZpbmVzIGFuIGltYWdlIHBsYW5lIHdpdGhpbiBhIFNiRGVjb2RlVGFyZ2V0SW5mbyBvYmplY3QuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2V2ZW50LmggYi9zcmMvc3RhcmJvYXJkL2V2ZW50LmgKaW5kZXggZjIwMDFhMi4uMTJlNGE4MyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ldmVudC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvZXZlbnQuaApAQCAtMTgyLDYgKzE4Miw3IEBACiAgIC8vIE5vIGRhdGEgYXJndW1lbnQuCiAgIGtTYkV2ZW50VHlwZVZlcnRpY2FsU3luYywKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX0RJU0NPTk5FQ1RfVkVSU0lPTgogICAvLyBUaGUgcGxhdGZvcm0gaGFzIGRldGVjdGVkIGEgbmV0d29yayBkaXNjb25uZWN0aW9uLiBUaGUgcGxhdGZvcm0gc2hvdWxkIG1ha2UKICAgLy8gYSBiZXN0IGVmZm9ydCB0byBzZW5kIGFuIGV2ZW50IG9mIHRoaXMgdHlwZSB3aGVuIHRoZSBuZXR3b3JrIGRpc2Nvbm5lY3RzLAogICAvLyBidXQgdGhlcmUgYXJlIGxpa2VseSB0byBiZSBjYXNlcyB3aGVyZSB0aGUgcGxhdGZvcm0gY2Fubm90IGRldGVjdCB0aGUKQEAgLTE5NCw2ICsxOTUsNyBAQAogICAvLyBhcHBsaWNhdGlvbiBzdGFydC11cCwgYW5kIHNob3VsZCBhbHdheXMgYmUgc2VudCBpZiB0aGUgbmV0d29yayByZWNvbm5lY3RzCiAgIC8vIHNpbmNlIGEgZGlzY29ubmVjdGlvbiBldmVudCB3YXMgc2VudC4KICAga1NiRXZlbnRUeXBlTmV0d29ya0Nvbm5lY3QsCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX0RJU0NPTk5FQ1RfVkVSU0lPTgogCiAgIC8vIEFuIGV2ZW50IHR5cGUgcmVzZXJ2ZWQgZm9yIHNjaGVkdWxlZCBjYWxsYmFja3MuIEl0IHdpbGwgb25seSBiZSBzZW50IGluCiAgIC8vIHJlc3BvbnNlIHRvIGFuIGFwcGxpY2F0aW9uIGNhbGwgdG8gU2JFdmVudFNjaGVkdWxlKCksIGFuZCBpdCB3aWxsIGNhbGwgdGhlCkBAIC0yNjgsNyArMjcwLDcgQEAKICAgLy8gU2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMuIFN5c3RlbS10cmlnZ2VyZWQgZXZlbnRzIGhhdmUKICAgLy8gdGlja2V0IHZhbHVlIGtTYkV2ZW50T25TY3JlZW5LZXlib2FyZEludmFsaWRUaWNrZXQuCiAgIGtTYkV2ZW50VHlwZU9uU2NyZWVuS2V5Ym9hcmRTdWdnZXN0aW9uc1VwZGF0ZWQsCi0jZW5kaWYgIC8vIFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCiAKICNlbmRpZiAgLy8gU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKICNpZiBTQl9IQVMoQ0FQVElPTlMpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2V4cG9ydC5oIGIvc3JjL3N0YXJib2FyZC9leHBvcnQuaAppbmRleCAyZDYzNDdkLi4xZmZkMjQ4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2V4cG9ydC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvZXhwb3J0LmgKQEAgLTE2LDcgKzE2LDYgQEAKIC8vCiAvLyBQcm92aWRlcyBtYWNyb3MgZm9yIHByb3Blcmx5IGV4cG9ydGluZyBvciBpbXBvcnRpbmcgc3ltYm9scyBmcm9tIHNoYXJlZAogLy8gbGlicmFyaWVzLgotCiAjaWZuZGVmIFNUQVJCT0FSRF9FWFBPUlRfSF8KICNkZWZpbmUgU1RBUkJPQVJEX0VYUE9SVF9IXwogCkBAIC0zMSw3ICszMCw3IEBACiAvLyBTQl9JTVBPUlQ6IFNwZWNpZmljYXRpb24gZm9yIGEgc3ltYm9sIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZAogLy8gZXh0ZXJuYWxseSB0byB0aGlzIG1vZHVsZS4KIAotI2lmIGRlZmluZWQoQ09NUE9ORU5UX0JVSUxEKSB8fCBTQl9JUyhMSUJSQVJZKQorI2lmIGRlZmluZWQoQ09NUE9ORU5UX0JVSUxEKSB8fCBTQl9JUyhMSUJSQVJZKSB8fCBTQl9JUyhFVkVSR1JFRU4pCiAvLyBDT01QT05FTlRfQlVJTEQgaXMgZGVmaW5lZCB3aGVuIGdlbmVyYXRpbmcgc2hhcmVkIGxpYnJhcmllcyBmb3IgZWFjaCBwcm9qZWN0LAogLy8gcmF0aGVyIHRoYW4gc3RhdGljIGxpYnJhcmllcy4gVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQKIC8vIEVYUE9SVC9JTVBPUlQuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2ZpbGUuaCBiL3NyYy9zdGFyYm9hcmQvZmlsZS5oCmluZGV4IDE0ZGU1NjkuLmRlYzQ0N2MgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvZmlsZS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvZmlsZS5oCkBAIC04OCw4ICs4OCwxMyBAQAogICBrU2JGaWxlRXJyb3JOb3RBRmlsZSA9IC0xMywKICAga1NiRmlsZUVycm9yTm90RW1wdHkgPSAtMTQsCiAgIGtTYkZpbGVFcnJvckludmFsaWRVcmwgPSAtMTUsCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRklMRV9FUlJPUl9JT19BUElfVkVSU0lPTgorICBrU2JGaWxlRXJyb3JJTyA9IC0xNiwKKyAga1NiRmlsZUVycm9yTWF4ID0gLTE3LAorI2Vsc2UKICAgLy8gUHV0IG5ldyBlbnRyaWVzIGhlcmUgYW5kIGluY3JlbWVudCBrU2JGaWxlRXJyb3JNYXguCiAgIGtTYkZpbGVFcnJvck1heCA9IC0xNiwKKyNlbmRpZgogfSBTYkZpbGVFcnJvcjsKIAogLy8gVGhpcyBleHBsaWNpdCBtYXBwaW5nIG1hdGNoZXMgYm90aCBGSUxFXyBvbiBXaW5kb3dzIGFuZCBTRUVLXyBvbiBMaW51eC4KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvZm9ybWF0X3N0cmluZy5oIGIvc3JjL3N0YXJib2FyZC9mb3JtYXRfc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5ZDI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvZm9ybWF0X3N0cmluZy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gTW9kdWxlIE92ZXJ2aWV3OiBTdGFyYm9hcmQgU3RyaW5nIG1vZHVsZQorLy8KKy8vIE1vdmUgdGhlIGRlZmluaXRpb24gb2YgRm9ybWF0U3RyaW5nIGZyb20gc3RyaW5nLmggdG8gdGhpcyBoZWFkZXIgdG8gYnJlYWsKKy8vIHRoZSBkZXBlbmRlbmN5IGJldHdlZW4gc3RyaW5nLmggYW5kIHN0YW5kYXJkIGhlYWRlciA8c3RyaW5nPi4KKworI2lmbmRlZiBTVEFSQk9BUkRfRk9STUFUX1NUUklOR19IXworI2RlZmluZSBTVEFSQk9BUkRfRk9STUFUX1NUUklOR19IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTU9WRV9GT1JNQVRfU1RSSU5HX1ZFUlNJT04KKyNpZmRlZiBfX2NwbHVzcGx1cworCitleHRlcm4gIkMrKyIgeworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CisKK1NCX0NfSU5MSU5FIHN0ZDo6c3RyaW5nIEZvcm1hdFN0cmluZyhjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikKKyAgICBTQl9QUklOVEZfRk9STUFUKDEsIDIpOworCitTQl9DX0lOTElORSBzdGQ6OnN0cmluZyBGb3JtYXRTdHJpbmcoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmd1bWVudHM7CisgIHZhX3N0YXJ0KGFyZ3VtZW50cywgZm9ybWF0KTsKKyAgaW50IGV4cGVjdGVkX3NpemUgPSA6OlNiU3RyaW5nRm9ybWF0KE5VTEwsIDAsIGZvcm1hdCwgYXJndW1lbnRzKTsKKyAgdmFfZW5kKGFyZ3VtZW50cyk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBpZiAoZXhwZWN0ZWRfc2l6ZSA8PSAwKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZmZlcihleHBlY3RlZF9zaXplICsgMSk7CisgIHZhX3N0YXJ0KGFyZ3VtZW50cywgZm9ybWF0KTsKKyAgOjpTYlN0cmluZ0Zvcm1hdChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpLCBmb3JtYXQsIGFyZ3VtZW50cyk7CisgIHZhX2VuZChhcmd1bWVudHMpOworICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyLmRhdGEoKSwgZXhwZWN0ZWRfc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworfSAgLy8gZXh0ZXJuICJDKysiCisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NT1ZFX0ZPUk1BVF9TVFJJTkdfVkVSU0lPTgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9GT1JNQVRfU1RSSU5HX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2lucHV0LmggYi9zcmMvc3RhcmJvYXJkL2lucHV0LmgKaW5kZXggY2ZmNjZkZS4uNmQ0ZmUwMyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9pbnB1dC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvaW5wdXQuaApAQCAtMjIwLDYgKzIyMCw5IEBACiAjaWYgU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKICAgLy8gVGhlIHRleHQgdG8gaW5wdXQgZm9yIGV2ZW50cyBvZiB0eXBlIHxJbnB1dHwuCiAgIGNvbnN0IGNoYXIqIGlucHV0X3RleHQ7CisKKyAgLy8gU2V0IHRvIHRydWUgaWYgdGhlIGlucHV0IGV2ZW50IGlzIHBhcnQgb2YgYSBjb21wb3NpdGlvbiBldmVudC4KKyAgYm9vbCBpc19jb21wb3Npbmc7CiAjZW5kaWYKIH0gU2JJbnB1dERhdGE7CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL0JVSUxELmduIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvQlVJTEQuZ24KaW5kZXggOWMyMGQ5MS4uODE2NjgxMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvQlVJTEQuZ24KKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvQlVJTEQuZ24KQEAgLTI3NywxMCArMjc3LDYgQEAKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuaCIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2Fsc2FfdXRpbC5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2Fsc2FfdXRpbC5oIiwKLSAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19nZXRfbWF4X2NoYW5uZWxzLmNjIiwKLSAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19nZXRfbmVhcmVzdF9zdXBwb3J0ZWRfc2FtcGxlX2ZyZXF1ZW5jeS5jYyIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2F1ZGlvX3NpbmtfaXNfYXVkaW9fZnJhbWVfc3RvcmFnZV90eXBlX3N1cHBvcnRlZC5jYyIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9tYXAuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvbWVtb3J5X3VubWFwLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5jYyIsCkBAIC0zMjQsNiArMzIwLDggQEAKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2lzby9zdHJpbmdfc2Nhbi5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9pc28vc3lzdGVtX2JpbmFyeV9zZWFyY2guY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvaXNvL3N5c3RlbV9zb3J0LmNjIiwKKyAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2xpYmFvbS9hb21fdmlkZW9fZGVjb2Rlci5jYyIsCisgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saWJhb20vYW9tX3ZpZGVvX2RlY29kZXIuaCIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saWJldmVudC9zb2NrZXRfd2FpdGVyX2FkZC5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saWJldmVudC9zb2NrZXRfd2FpdGVyX2NyZWF0ZS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saWJldmVudC9zb2NrZXRfd2FpdGVyX2Rlc3Ryb3kuY2MiLApAQCAtMzM0LDYgKzMzMiw3IEBACiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saWJldmVudC9zb2NrZXRfd2FpdGVyX3dha2VfdXAuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvbGlidnB4L3ZweF92aWRlb19kZWNvZGVyLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2xpYnZweC92cHhfdmlkZW9fZGVjb2Rlci5oIiwKKyAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L2F1ZGlvX3NpbmtfdHlwZV9kaXNwYXRjaGVyLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L2J5dGVfc3dhcC5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9saW51eC9nZXRfaG9tZV9kaXJlY3RvcnkuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvbGludXgvbWVtb3J5X2dldF9zdGFja19ib3VuZHMuY2MiLApAQCAtNDM3LDYgKzQzNiwxMCBAQAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvcHRocmVhZC90aHJlYWRfam9pbi5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9wdGhyZWFkL3RocmVhZF9zZXRfbG9jYWxfdmFsdWUuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvcHRocmVhZC90aHJlYWRfeWllbGQuY2MiLAorICAgICIvL3N0YXJib2FyZC9zaGFyZWQvcHVsc2UvcHVsc2VfYXVkaW9fc2lua190eXBlLmNjIiwKKyAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5oIiwKKyAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2R5bmFtaWNfbG9hZF9kaXNwYXRjaGVyLmNjIiwKKyAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2R5bmFtaWNfbG9hZF9kaXNwYXRjaGVyLmgiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL2NyYXNoX3NpZ25hbHMuaCIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvY3Jhc2hfc2lnbmFsc19zaWdhY3Rpb24uY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL3N1c3BlbmRfc2lnbmFscy5jYyIsCkBAIC00NDQsOCArNDQ3LDEyIEBACiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19jcmVhdGUuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19kZXN0cm95LmNjIiwKKyAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfZ2V0X21heF9jaGFubmVsc181XzEuY2MiLAorICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19nZXRfbmVhcmVzdF9zdXBwb3J0ZWRfc2FtcGxlX2ZyZXF1ZW5jeS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaW50ZXJuYWwuaCIsCisgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2lzX2F1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZV9zdXBwb3J0ZWRfaW50ZXJsZWF2ZWRfb25seS5jYyIsCisgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2lzX2F1ZGlvX3NhbXBsZV90eXBlX3N1cHBvcnRlZF9mbG9hdDMyX29ubHkuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pc192YWxpZC5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9zdHViX2F1ZGlvX3NpbmtfdHlwZS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9zdHViX2F1ZGlvX3NpbmtfdHlwZS5oIiwKQEAgLTU2Niw3ICs1NzMsNiBAQAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX2lzX3NhbXBsZV9yYXRlX3N1cHBvcnRlZC5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfb3Blbi5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL21pY3JvcGhvbmVfcmVhZC5jYyIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9jbGVhcl9wbGF0Zm9ybV9lcnJvci5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfdG90YWxfZ3B1X21lbW9yeS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfdXNlZF9ncHVfbWVtb3J5LmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2hpZGVfc3BsYXNoX3NjcmVlbi5jYyIsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9hdWRpb19zaW5rX3R5cGVfZGlzcGF0Y2hlci5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2F1ZGlvX3NpbmtfdHlwZV9kaXNwYXRjaGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYmM3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9hdWRpb19zaW5rX3R5cGVfZGlzcGF0Y2hlci5jYwpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oIgorCituYW1lc3BhY2UgeworYm9vbCBpc19mYWxsYmFja190b19hbHNhID0gZmFsc2U7Cit9CisKKy8vIHN0YXRpYwordm9pZCBTYkF1ZGlvU2lua1ByaXZhdGU6OlBsYXRmb3JtSW5pdGlhbGl6ZSgpIHsKKyAgc3RhcmJvYXJkOjpzaGFyZWQ6OnB1bHNlOjpQbGF0Zm9ybUluaXRpYWxpemUoKTsKKyAgaWYgKCFHZXRQcmltYXJ5VHlwZSgpKSB7CisgICAgc3RhcmJvYXJkOjpzaGFyZWQ6OmFsc2E6OlBsYXRmb3JtSW5pdGlhbGl6ZSgpOworICAgIGlzX2ZhbGxiYWNrX3RvX2Fsc2EgPSB0cnVlOworICB9CisgIFNiQXVkaW9TaW5rUHJpdmF0ZTo6RW5hYmxlRmFsbGJhY2tUb1N0dWIoKTsKK30KKworLy8gc3RhdGljCit2b2lkIFNiQXVkaW9TaW5rUHJpdmF0ZTo6UGxhdGZvcm1UZWFyRG93bigpIHsKKyAgaWYgKGlzX2ZhbGxiYWNrX3RvX2Fsc2EpIHsKKyAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6YWxzYTo6UGxhdGZvcm1UZWFyRG93bigpOworICB9IGVsc2UgeworICAgIHN0YXJib2FyZDo6c2hhcmVkOjpwdWxzZTo6UGxhdGZvcm1UZWFyRG93bigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCBlYWNiN2RhLi4xOWRmNTRiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTI0Miw2ICsyNDIsOSBAQAogLy8gQWxsb3cgcGxheWluZyBhdWRpb2xlc3MgdmlkZW8uCiAjZGVmaW5lIFNCX0hBU19BVURJT0xFU1NfVklERU8gMQogCisvLyBBbGxvdyBhYzMgYW5kIGVjMyBzdXBwb3J0CisjZGVmaW5lIFNCX0hBU19BQzNfQVVESU8gMQorCiAvLyAtLS0gRGVjb2Rlci1vbmx5IFBhcmFtcyAtLS0KIAogLy8gU3BlY2lmaWVzIGhvdyBtZWRpYSBidWZmZXJzIG11c3QgYmUgYWxpZ25lZCBvbiB0aGlzIHBsYXRmb3JtIGFzIHNvbWUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5neXBpCmluZGV4IDMzMmQ3ODUuLjZkMWRiOGEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMjMsMTAgKzIzLDEyIEBACiAgICAgJ3NiX3dpZGV2aW5lX3BsYXRmb3JtJyA6ICdsaW51eCcsCiAKICAgICAncGxhdGZvcm1fbGlicmFyaWVzJzogWworICAgICAgJy1sYW9tJywKICAgICAgICctbGFzb3VuZCcsCiAgICAgICAnLWxkbCcsCiAgICAgICAnLWxwdGhyZWFkJywKICAgICAgICctbHJ0JywKKyAgICAgICctbHZweCcsCiAgICAgXSwKIAogICAgICdjb21waWxlcl9mbGFncyc6IFsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggYmM3ZTMyNS4uN2QzYmUyZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTczLDExICs3MywxMSBAQAogCiAgIGRlZiBHZXRUZXN0RmlsdGVycyhzZWxmKToKICAgICBmaWx0ZXJzID0gc3VwZXIoTGludXhDb25maWd1cmF0aW9uLCBzZWxmKS5HZXRUZXN0RmlsdGVycygpCi0gICAgZm9yIHRhcmdldCwgdGVzdHMgaW4gc2VsZi5fRklMVEVSRURfVEVTVFMuaXRlcml0ZW1zKCk6CisgICAgZm9yIHRhcmdldCwgdGVzdHMgaW4gc2VsZi5fX0ZJTFRFUkVEX1RFU1RTLml0ZXJpdGVtcygpOgogICAgICAgZmlsdGVycy5leHRlbmQodGVzdF9maWx0ZXIuVGVzdEZpbHRlcih0YXJnZXQsIHRlc3QpIGZvciB0ZXN0IGluIHRlc3RzKQogICAgIHJldHVybiBmaWx0ZXJzCiAKLSAgX0ZJTFRFUkVEX1RFU1RTID0geworICBfX0ZJTFRFUkVEX1RFU1RTID0gewogICAgICAgJ25wbGInOiBbJ1NiRHJtVGVzdC5BbnlTdXBwb3J0ZWRLZXlTeXN0ZW1zJyxdLAogICAgICAgJ3BsYXllcl9maWx0ZXJfdGVzdHMnOiBbCiAgICAgICAgICAgIyBUaGVzZSB0ZXN0cyBoYXZlIG1lbW9yeSBsZWFrcyByZWxhdGVkIHRvIGF2X21hbGxvYy4KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjBkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkLmNjCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX3N1cHBvcnRfaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisKK1NCX0VYUE9SVCBib29sIFNiTWVkaWFJc0F1ZGlvU3VwcG9ydGVkKFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlKSB7CisgIGlmIChhdWRpb19jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMpIHsKKyAgICByZXR1cm4gYml0cmF0ZSA8PSBTQl9NRURJQV9NQVhfQVVESU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQ7CisgIH0KKworI2lmIFNCX0hBUyhBVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKKyAgaWYgKGF1ZGlvX2NvZGVjID09IGtTYk1lZGlhQXVkaW9Db2RlY09wdXMpIHsKKyAgICByZXR1cm4gYml0cmF0ZSA8PSBTQl9NRURJQV9NQVhfQVVESU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQ7CisgIH0KKworI2lmIFNCX0hBUyhBQzNfQVVESU8pCisgIGlmIChhdWRpb19jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNBYzMgfHwKKyAgICAgIGF1ZGlvX2NvZGVjID09IGtTYk1lZGlhQXVkaW9Db2RlY0VhYzMpIHsKKyAgICByZXR1cm4gYml0cmF0ZSA8PSBTQl9NRURJQV9NQVhfQVVESU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQ7CisgIH0KKyNlbmRpZiAgLy8gU0JfSEFTKEFDM19BVURJTykKKyNlbmRpZiAgLy8gU0JfSEFTKEFVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQorCisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL21lZGlhX2lzX3ZpZGVvX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL21lZGlhX2lzX3ZpZGVvX3N1cHBvcnRlZC5jYwppbmRleCAxMmRiMzE4Li40NjQ0NGQzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9tZWRpYV9pc192aWRlb19zdXBwb3J0ZWQuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvbWVkaWFfaXNfdmlkZW9fc3VwcG9ydGVkLmNjCkBAIC00OSw3ICs0OSwxMiBAQAogI2VuZGlmICAvLyBTQl9IQVMoQkxJVFRFUikKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTAKIAotICByZXR1cm4gKHZpZGVvX2NvZGVjID09IGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQgfHwKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0hBU19BVjFfVkVSU0lPTgorICByZXR1cm4gKHZpZGVvX2NvZGVjID09IGtTYk1lZGlhVmlkZW9Db2RlY1ZwMTAgfHwKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9IQVNfQVYxX1ZFUlNJT04KKyAgcmV0dXJuICh2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNBdjEgfHwKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9IQVNfQVYxX1ZFUlNJT04KKyAgICAgICAgICB2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0IHx8CiAgICAgICAgICAgdmlkZW9fY29kZWMgPT0ga1NiTWVkaWFWaWRlb0NvZGVjVnA5KSAmJgogICAgICAgICAgZnJhbWVfd2lkdGggPD0gMTkyMCAmJiBmcmFtZV9oZWlnaHQgPD0gMTA4MCAmJgogICAgICAgICAgYml0cmF0ZSA8PSBTQl9NRURJQV9NQVhfVklERU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQgJiYgZnBzIDw9IDYwOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKaW5kZXggZmU5N2UyMC4uOWQ4NDExZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX2F1ZGlvX2RlY29kZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvbGliYW9tL2FvbV92aWRlb19kZWNvZGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCIKQEAgLTYyLDYgKzYzLDcgQEAKICAgICAgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiogdmlkZW9fZGVjb2RlciwKICAgICAgIHNjb3BlZF9wdHI8VmlkZW9SZW5kZXJBbGdvcml0aG0+KiB2aWRlb19yZW5kZXJfYWxnb3JpdGhtLAogICAgICAgc2NvcGVkX3JlZnB0cjxWaWRlb1JlbmRlcmVyU2luaz4qIHZpZGVvX3JlbmRlcmVyX3NpbmspIG92ZXJyaWRlIHsKKyAgICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OmFvbTo6VmlkZW9EZWNvZGVyIEF2MVZpZGVvRGVjb2RlckltcGw7CiAgICAgdHlwZWRlZiA6OnN0YXJib2FyZDo6c2hhcmVkOjpmZm1wZWc6OlZpZGVvRGVjb2RlciBGZm1wZWdWaWRlb0RlY29kZXJJbXBsOwogICAgIHR5cGVkZWYgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6dnB4OjpWaWRlb0RlY29kZXIgVnB4VmlkZW9EZWNvZGVySW1wbDsKIApAQCAtNzcsNiArNzksMTQgQEAKICAgICAgIHZpZGVvX2RlY29kZXItPnJlc2V0KG5ldyBWcHhWaWRlb0RlY29kZXJJbXBsKAogICAgICAgICAgIHZpZGVvX3BhcmFtZXRlcnMudmlkZW9fY29kZWMsIHZpZGVvX3BhcmFtZXRlcnMub3V0cHV0X21vZGUsCiAgICAgICAgICAgdmlkZW9fcGFyYW1ldGVycy5kZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIpKTsKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0hBU19BVjFfVkVSU0lPTgorICAgIH0gZWxzZSBpZiAodmlkZW9fcGFyYW1ldGVycy52aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNWcDEwKSB7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfSEFTX0FWMV9WRVJTSU9OCisgICAgfSBlbHNlIGlmICh2aWRlb19wYXJhbWV0ZXJzLnZpZGVvX2NvZGVjID09IGtTYk1lZGlhVmlkZW9Db2RlY0F2MSkgeworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0hBU19BVjFfVkVSU0lPTgorICAgICAgdmlkZW9fZGVjb2Rlci0+cmVzZXQobmV3IEF2MVZpZGVvRGVjb2RlckltcGwoCisgICAgICAgICAgdmlkZW9fcGFyYW1ldGVycy52aWRlb19jb2RlYywgdmlkZW9fcGFyYW1ldGVycy5vdXRwdXRfbW9kZSwKKyAgICAgICAgICB2aWRlb19wYXJhbWV0ZXJzLmRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcikpOwogICAgIH0gZWxzZSB7CiAgICAgICBzY29wZWRfcHRyPEZmbXBlZ1ZpZGVvRGVjb2RlckltcGw+IGZmbXBlZ192aWRlb19kZWNvZGVyKAogICAgICAgICAgIEZmbXBlZ1ZpZGVvRGVjb2RlckltcGw6OkNyZWF0ZSgKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKaW5kZXggZmI3YTgxMi4uNWVlZDZmMSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKQEAgLTI0LDExICsyNCwxMyBAQAogICAgICdzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyc6IFsKICAgICAgICc8QChmaWx0ZXJfYmFzZWRfcGxheWVyX3NvdXJjZXMpJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2F0b21pY19wdWJsaWMuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9hdWRpb19zaW5rX3R5cGVfZGlzcGF0Y2hlci5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2RlY29kZV90YXJnZXRfZ2V0X2luZm8uY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmgnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZGVjb2RlX3RhcmdldF9yZWxlYXNlLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9tZWRpYV9pc192aWRlb19zdXBwb3J0ZWQuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zeXN0ZW1fZ2V0X2Nvbm5lY3Rpb25fdHlwZS5jYycsCkBAIC0zOSwxMCArNDEsNiBAQAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV91dGlsLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV91dGlsLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hdWRpb19zaW5rX2dldF9tYXhfY2hhbm5lbHMuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hdWRpb19zaW5rX2dldF9uZWFyZXN0X3N1cHBvcnRlZF9zYW1wbGVfZnJlcXVlbmN5LmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19pc19hdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVfc3VwcG9ydGVkLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19pc19hdWRpb19zYW1wbGVfdHlwZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvbWVtb3J5X21hcC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9tZW1vcnlfcHJvdGVjdC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9tZW1vcnlfdW5tYXAuY2MnLApAQCAtODEsNiArNzksOCBAQAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL3N0cmluZ19zY2FuLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9zeXN0ZW1fYmluYXJ5X3NlYXJjaC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vc3lzdGVtX3NvcnQuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbGliYW9tL2FvbV92aWRlb19kZWNvZGVyLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpYmFvbS9hb21fdmlkZW9fZGVjb2Rlci5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpYmV2ZW50L3NvY2tldF93YWl0ZXJfYWRkLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpYmV2ZW50L3NvY2tldF93YWl0ZXJfY3JlYXRlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2xpYmV2ZW50L3NvY2tldF93YWl0ZXJfZGVzdHJveS5jYycsCkBAIC0yMDUsNiArMjA1LDEwIEBACiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9wdGhyZWFkL3RocmVhZF9zYW1wbGVyX3RoYXcuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvcHRocmVhZC90aHJlYWRfc2V0X2xvY2FsX3ZhbHVlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3B0aHJlYWQvdGhyZWFkX3lpZWxkLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9hdWRpb19zaW5rX3R5cGUuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9keW5hbWljX2xvYWRfZGlzcGF0Y2hlci5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9keW5hbWljX2xvYWRfZGlzcGF0Y2hlci5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9jcmFzaF9zaWduYWxzLmgnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL2NyYXNoX3NpZ25hbHNfc2lnYWN0aW9uLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9zdXNwZW5kX3NpZ25hbHMuY2MnLApAQCAtMjEyLDggKzIxNiwxMiBAQAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfY3JlYXRlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfZGVzdHJveS5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2dldF9tYXhfY2hhbm5lbHNfNV8xLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfZ2V0X25lYXJlc3Rfc3VwcG9ydGVkX3NhbXBsZV9mcmVxdWVuY3kuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pc19hdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVfc3VwcG9ydGVkX2ludGVybGVhdmVkX29ubHkuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pc19hdWRpb19zYW1wbGVfdHlwZV9zdXBwb3J0ZWRfZmxvYXQzMl9vbmx5LmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaXNfdmFsaWQuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3Npbmsvc3R1Yl9hdWRpb19zaW5rX3R5cGUuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3Npbmsvc3R1Yl9hdWRpb19zaW5rX3R5cGUuaCcsCkBAIC0yNDYsNyArMjU0LDYgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9nZXRfbWF4X2J1ZmZlcl9jYXBhY2l0eS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfZ2V0X3Byb2dyZXNzaXZlX2J1ZmZlcl9idWRnZXQuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2dldF92aWRlb19idWZmZXJfYnVkZ2V0LmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9pc19hdWRpb19zdXBwb3J0ZWRfYWFjX2FuZF9vcHVzLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9pc19idWZmZXJfcG9vbF9hbGxvY2F0ZV9vbl9kZW1hbmQuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2lzX2J1ZmZlcl91c2luZ19tZW1vcnlfcG9vbC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzX3N1cHBvcnRlZC5jYycsCkBAIC0zMDQsNiArMzExLDcgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X3NldF9hdXRoZW50aWNhdGVkX2RhdGEuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfc2V0X2luaXRpYWxpemF0aW9uX3ZlY3Rvci5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm0uY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X2V4dGVuc2lvbnMuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9pbWFnZV9kZWNvZGUuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9pbWFnZV9pc19kZWNvZGVfc3VwcG9ydGVkLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9jbG9zZS5jYycsCkBAIC0zMTMsNyArMzIxLDYgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWljcm9waG9uZV9pc19zYW1wbGVfcmF0ZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX29wZW4uY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9taWNyb3Bob25lX3JlYWQuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fY2xlYXJfcGxhdGZvcm1fZXJyb3IuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X3RvdGFsX2dwdV9tZW1vcnkuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X3VzZWRfZ3B1X21lbW9yeS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9oaWRlX3NwbGFzaF9zY3JlZW4uY2MnLApAQCAtMzI0LDEwICszMzEsOSBAQAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jb21tb24vY29tbW9uLmd5cDpjb21tb24nLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3RhcmJvYXJkX2Jhc2Vfc3ltYm9saXplLmd5cDpzdGFyYm9hcmRfYmFzZV9zeW1ib2xpemUnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZy5neXA6ZmZtcGVnX2R5bmFtaWNfbG9hZCcsCisgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2JvcmluZ3NzbC5neXA6Y3J5cHRvJywKICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9kbG1hbGxvYy9kbG1hbGxvYy5neXA6ZGxtYWxsb2MnLAogICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2xpYmV2ZW50Lmd5cDpsaWJldmVudCcsCi0gICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbGlidnB4L2xpYnZweC5neXA6bGlidnB4JywKLSAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9vcGVuc3NsL29wZW5zc2wuZ3lwOm9wZW5zc2wnLAogICAgIF0sCiAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICBbJ3VzZV9kbG1hbGxvY19hbGxvY2F0b3I9PTEnLCB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9neXBfY29uZmlndXJhdGlvbi5weQppbmRleCA3M2JhZmRlLi45ZTIyNGIyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2d5cF9jb25maWd1cmF0aW9uLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTMwLDYgKzMwLDQyIEBACiAgICAgc3VwZXIoQ29iYWx0TGludXhYNjREaXJlY3RGYkNvbmZpZ3VyYXRpb24sIHNlbGYpLl9faW5pdF9fKAogICAgICAgICBwbGF0Zm9ybSwgYXNhbl9lbmFibGVkX2J5X2RlZmF1bHQsIGdvbWFfc3VwcG9ydGVkX2J5X2NvbXBpbGVyKQogCisgIGRlZiBHZXRUZXN0RmlsdGVycyhzZWxmKToKKyAgICBmaWx0ZXJzID0gKAorICAgICAgICBzdXBlcihDb2JhbHRMaW51eFg2NERpcmVjdEZiQ29uZmlndXJhdGlvbiwgc2VsZikuR2V0VGVzdEZpbHRlcnMoKSkKKyAgICBmb3IgdGFyZ2V0LCB0ZXN0cyBpbiBzZWxmLl9fRklMVEVSRURfVEVTVFMuaXRlcml0ZW1zKCk6CisgICAgICBmaWx0ZXJzLmV4dGVuZCh0ZXN0X2ZpbHRlci5UZXN0RmlsdGVyKHRhcmdldCwgdGVzdCkgZm9yIHRlc3QgaW4gdGVzdHMpCisgICAgcmV0dXJuIGZpbHRlcnMKKworCisgICMgQWxsIGZpbHRlcmVkIHRlc3RzIGFyZSBmaWx0ZXJlZCBiZWNhdXNlIHRoZSBEaXJlY3RGQiBkcml2ZXJzIG9uCisgICMgbWFueSBMaW51eCBkaXN0cmlidXRpb25zIGFyZSB1bnN0YWJsZSBhbmQgZXhwZXJpZW5jZSBjcmFzaGVzIHdoZW4KKyAgIyBjcmVhdGluZyBhbmQgd29ya2luZyB3aXRoIFNiV2luZG93IG9iamVjdHMuCisgIF9fRklMVEVSRURfVEVTVFMgPSB7CisgICAgICAnbnBsYic6IFsKKyAgICAgICAgICAnU2JCbGl0dGVyQ3JlYXRlU3dhcENoYWluRnJvbVdpbmRvd1Rlc3QuUmFpbnlEYXlCYWREZXZpY2UnLAorICAgICAgICAgICdTYkJsaXR0ZXJDcmVhdGVTd2FwQ2hhaW5Gcm9tV2luZG93VGVzdC5SYWlueURheUJhZFdpbmRvdycsCisgICAgICAgICAgJ1NiQmxpdHRlckNyZWF0ZVN3YXBDaGFpbkZyb21XaW5kb3dUZXN0LlJhaW55RGF5SW52YWxpZFN3YXBDaGFpbicsCisgICAgICAgICAgJ1NiQmxpdHRlckNyZWF0ZVN3YXBDaGFpbkZyb21XaW5kb3dUZXN0LlN1bm55RGF5JywKKyAgICAgICAgICAnU2JCbGl0dGVyQ3JlYXRlU3dhcENoYWluRnJvbVdpbmRvd1Rlc3QuU3VubnlEYXlNdWx0aXBsZVRpbWVzJywKKyAgICAgICAgICAnU2JCbGl0dGVyRmxpcFN3YXBDaGFpblRlc3QuU3VubnlEYXknLAorICAgICAgICAgICdTYkJsaXR0ZXJHZXRSZW5kZXJUYXJnZXRGcm9tU3dhcENoYWluVGVzdC5TdW5ueURheScsCisgICAgICAgICAgJ1NiQmxpdHRlckdldFJlbmRlclRhcmdldEZyb21Td2FwQ2hhaW5UZXN0LlN1bm55RGF5Q2FuRHJhdycsCisgICAgICAgICAgJ1NiUGxheWVyVGVzdC5BdWRpb09ubHknLAorICAgICAgICAgICdTYlBsYXllclRlc3QuQXVkaW9sZXNzJywKKyAgICAgICAgICAnU2JQbGF5ZXJUZXN0Lk11bHRpUGxheWVyJywKKyAgICAgICAgICAnU2JQbGF5ZXJUZXN0Lk51bGxDYWxsYmFja3MnLAorICAgICAgICAgICdTYlBsYXllclRlc3QuU3VubnlEYXknLAorICAgICAgICAgICdTYldpbmRvd0NyZWF0ZVRlc3QuU3VubnlEYXlEZWZhdWx0JywKKyAgICAgICAgICAnU2JXaW5kb3dDcmVhdGVUZXN0LlN1bm55RGF5RGVmYXVsdFNldCcsCisgICAgICAgICAgJ1NiV2luZG93R2V0UGxhdGZvcm1IYW5kbGVUZXN0LlJhaW55RGF5JywKKyAgICAgICAgICAnU2JXaW5kb3dHZXRQbGF0Zm9ybUhhbmRsZVRlc3QuU3VubnlEYXknLAorICAgICAgICAgICdTYldpbmRvd0dldFNpemVUZXN0LlJhaW55RGF5SW52YWxpZCcsCisgICAgICAgICAgJ1NiV2luZG93R2V0U2l6ZVRlc3QuU3VubnlEYXknLAorICAgICAgXSwKKyAgICAgICdwbGF5ZXJfZmlsdGVyX3Rlc3RzJzogW3Rlc3RfZmlsdGVyLkZJTFRFUl9BTExdLAorICB9CisKIAogZGVmIENyZWF0ZVBsYXRmb3JtQ29uZmlnKCk6CiAgIHJldHVybiBDb2JhbHRMaW51eFg2NERpcmVjdEZiQ29uZmlndXJhdGlvbigpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKaW5kZXggYTI5MzIxOC4uYWI3MDkwZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApAQCAtMjUsMTAgKzI1LDYgQEAKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnPEAoc3RhcmJvYXJkX3BsYXRmb3JtX3NvdXJjZXMpJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZF9hYWNfb25seS5jYycsCi0gICAgICBdLAotICAgICAgJ3NvdXJjZXMhJzogWwotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkX2FhY19hbmRfb3B1cy5jYycsCiAgICAgICBdLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKICAgICAgICAgJy91c3IvaW5jbHVkZS9kaXJlY3RmYicsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jbGFuZy8zLjYvY29tcGlsZXJfZmxhZ3MuZ3lwaSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9jb21waWxlcl9mbGFncy5neXBpCmluZGV4IDU3ZjliMDkuLjcwZDc4MTggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9jb21waWxlcl9mbGFncy5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9jb21waWxlcl9mbGFncy5neXBpCkBAIC00NSw2ICs0NSw4IEBACiAgICAgICAgICdjb21tb25fY2xhbmdfZmxhZ3MnOiBbCiAgICAgICAgICAgJy1XZXJyb3InLAogICAgICAgICAgICctZmNvbG9yLWRpYWdub3N0aWNzJywKKyAgICAgICAgICAjIFBvaW50IHRvIGEgZ2NjIHRvb2xjaGFpbiB0aGF0IHdvcmtzIHdpdGggdGhpcyBjb21waWxlci4KKyAgICAgICAgICAnLS1nY2MtdG9vbGNoYWluPTwoR0NDX1RPT0xDSEFJTl9GT0xERVIpJywKICAgICAgICAgICAjIERlZmF1bHQgdmlzaWJpbGl0eSB0byBoaWRkZW4sIHRvIGVuYWJsZSBkZWFkIHN0cmlwcGluZy4KICAgICAgICAgICAnLWZ2aXNpYmlsaXR5PWhpZGRlbicsCiAgICAgICAgICAgIyBXYXJuIGZvciBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb25zIHRoYXQgbWF5IGNoYW5nZSBhIHZhbHVlLgpAQCAtMTIzLDcgKzEyNSw3IEBACiAgICAgICAnLXN0ZD1jOTknLAogICAgIF0sCiAgICAgJ2NmbGFnc19jYyc6IFsKLSAgICAgICctc3RkPWdudSsrMTEnLAorICAgICAgJy1zdGQ9YysrMTEnLAogICAgIF0sCiAgICAgJ3RhcmdldF9jb25kaXRpb25zJzogWwogICAgICAgWydzYl9wZWRhbnRpY193YXJuaW5ncz09MScsIHsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9kb3dubG9hZF9jbGFuZy5zaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9kb3dubG9hZF9jbGFuZy5zaAppbmRleCAzMjk5N2I2Li4xNTgxNWEyIDEwMDc1NQotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jbGFuZy8zLjYvZG93bmxvYWRfY2xhbmcuc2gKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY2xhbmcvMy42L2Rvd25sb2FkX2NsYW5nLnNoCkBAIC0yMywxMiArMjMsMjcgQEAKIGJyYW5jaD0icmVsZWFzZV8zNiIKIAogYmluYXJ5X3BhdGg9Imxsdm0vUmVsZWFzZStBc3NlcnRzL2Jpbi9jbGFuZysrIgorCisjIFRoaXMgdmVyc2lvbiBvZiBjbGFuZyBkZXBlbmRzIG9uIGxpYnN0ZGMrKy03LCB2ZXJzaW9uIDcuMy4wLgorIyBUaGUgcGFja2FnZSAibGlic3RkYysrLTctZGV2IiBwcm92aWRlcyB0aGF0IHZlcnNpb24uCitsaWJzdGRjeHhfdmVyc2lvbj0iNy4zLjAiCitsaWJzdGRjeHhfcGF0aD0ibGlic3RkYysrLTciCitsaWJzdGRjeHhfc3ltbGlua19mb2xkZXI9IiR7bGlic3RkY3h4X3BhdGh9L2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudSIKK3N5bWxpbmtfcGF0aD0iJHtsaWJzdGRjeHhfc3ltbGlua19mb2xkZXJ9LyR7bGlic3RkY3h4X3ZlcnNpb259IgorCiBidWlsZF9kdXJhdGlvbj0iYWJvdXQgMjAgbWludXRlcyIKIAogY2QgJChkaXJuYW1lICQwKQogc291cmNlIC4uLy4uL3Rvb2xjaGFpbl9wYXRocy5zaAogCiAoCisgICMgQnVpbGQgYSBzbWFsbCBzeW1saW5rIGZvcmVzdCBmb3IgdGhlIGNsYW5nIGNvbXBpbGVyIHRvIHBvaW50IHRvIHdpdGggdGhlCisgICMgJy0tZ2NjLXRvb2xjaGFpbicgcGFyYW1ldGVyIHRvIGFsbG93IGl0IHRvIGJ1aWxkIGFnYWluc3QgYSBub24tZGVmYXVsdCB2ZXJzaW9uCisgICMgb2YgbGlic3RkYysrLgorICBta2RpciAtcCAiJHtsaWJzdGRjeHhfc3ltbGlua19mb2xkZXJ9IgorICBsbiAtcyAvdXNyL2luY2x1ZGUgIiR7bGlic3RkY3h4X3BhdGh9IgorICBsbiAtcyAiL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvJHtsaWJzdGRjeHhfdmVyc2lvbn0iICR7bGlic3RkY3h4X3N5bWxpbmtfZm9sZGVyfQorCiAgIGdpdCBjbG9uZSAtLWJyYW5jaCAke2JyYW5jaH0gaHR0cHM6Ly9naXQubGx2bS5vcmcvZ2l0L2xsdm0uZ2l0LwogICBjZCBsbHZtL3Rvb2xzLwogICBnaXQgY2xvbmUgLS1icmFuY2ggJHticmFuY2h9IGh0dHBzOi8vZ2l0Lmxsdm0ub3JnL2dpdC9jbGFuZy5naXQvCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jbGFuZy8zLjYvZ3lwX2NvbmZpZ3VyYXRpb24ucHkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jbGFuZy8zLjYvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggMTFhMWY3YS4uYmIxZGJiOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY2xhbmcvMy42L2d5cF9jb25maWd1cmF0aW9uLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuNi9neXBfY29uZmlndXJhdGlvbi5weQpAQCAtMjQsNyArMjQsNyBAQAogY2xhc3MgTGludXhYNjRYMTFDbGFuZzM2Q29uZmlndXJhdGlvbihzaGFyZWRfY29uZmlndXJhdGlvbi5MaW51eENvbmZpZ3VyYXRpb24pOgogICAiIiJTdGFyYm9hcmQgTGludXggWDY0IFgxMSBDbGFuZyAzLjYgcGxhdGZvcm0gY29uZmlndXJhdGlvbi4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIGFzYW5fZW5hYmxlZF9ieV9kZWZhdWx0PVRydWUpOgorICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIGFzYW5fZW5hYmxlZF9ieV9kZWZhdWx0PUZhbHNlKToKICAgICBzdXBlcihMaW51eFg2NFgxMUNsYW5nMzZDb25maWd1cmF0aW9uLCBzZWxmKS5fX2luaXRfXygKICAgICAgICAgcGxhdGZvcm0sIGFzYW5fZW5hYmxlZF9ieV9kZWZhdWx0LCBnb21hX3N1cHBvcnRzX2NvbXBpbGVyPUZhbHNlKQogCkBAIC0zMiw4ICszMiw5IEBACiAgICAgIyBSdW4gdGhlIHNjcmlwdCB0aGF0IGVuc3VyZXMgY2xhbmcgMy42IGlzIGluc3RhbGxlZC4KICAgICBzdWJwcm9jZXNzLmNhbGwoCiAgICAgICAgIG9zLnBhdGguam9pbihzY3JpcHRfcGF0aCwgJ2Rvd25sb2FkX2NsYW5nLnNoJyksIGN3ZD1zY3JpcHRfcGF0aCkKLSAgICBzZWxmLnRvb2xjaGFpbl9kaXIgPSBvcy5wYXRoLmpvaW4oYnVpbGQuR2V0VG9vbGNoYWluc0RpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneDg2XzY0LWxpbnV4LWdudS1jbGFuZy0zLjYnLCAnbGx2bScsCisgICAgc2VsZi50b29sY2hhaW5fdG9wX2RpciA9IG9zLnBhdGguam9pbihidWlsZC5HZXRUb29sY2hhaW5zRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneDg2XzY0LWxpbnV4LWdudS1jbGFuZy0zLjYnKQorICAgIHNlbGYudG9vbGNoYWluX2RpciA9IG9zLnBhdGguam9pbihzZWxmLnRvb2xjaGFpbl90b3BfZGlyLCAnbGx2bScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZWxlYXNlK0Fzc2VydHMnKQogCiAgIGRlZiBHZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhzZWxmKToKQEAgLTUyLDggKzUzLDEyIEBACiAgICAgdmFyaWFibGVzID0gc3VwZXIoTGludXhYNjRYMTFDbGFuZzM2Q29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBzZWxmKS5HZXRWYXJpYWJsZXMoY29uZmlnX25hbWUpCiAgICAgdmFyaWFibGVzLnVwZGF0ZSh7Ci0gICAgICAgICdqYXZhc2NyaXB0X2VuZ2luZSc6ICdtb3pqcy00NScsCi0gICAgICAgICdjb2JhbHRfZW5hYmxlX2ppdCc6IDAsCisgICAgICAgICdqYXZhc2NyaXB0X2VuZ2luZSc6CisgICAgICAgICAgICAnbW96anMtNDUnLAorICAgICAgICAnY29iYWx0X2VuYWJsZV9qaXQnOgorICAgICAgICAgICAgMCwKKyAgICAgICAgJ0dDQ19UT09MQ0hBSU5fRk9MREVSJzoKKyAgICAgICAgICAgICdcIiVzXCInICUgb3MucGF0aC5qb2luKHNlbGYudG9vbGNoYWluX3RvcF9kaXIsICdsaWJzdGRjKystNycpLAogICAgIH0pCiAgICAgcmV0dXJuIHZhcmlhYmxlcwogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9ldmVyZ3JlZW4vYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL2F0b21pY19wdWJsaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMwNzNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL2F0b21pY19wdWJsaWMuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBzdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisvLyB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgY3JlYXRpb24uCisKKyNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9FVkVSR1JFRU5fQVRPTUlDX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0WDExX0VWRVJHUkVFTl9BVE9NSUNfUFVCTElDX0hfCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgveDY0eDExL2F0b21pY19wdWJsaWMuaCIKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfTElOVVhfWDY0WDExX0VWRVJHUkVFTl9BVE9NSUNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9ldmVyZ3JlZW4vY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2V2ZXJncmVlbi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzVmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9ldmVyZ3JlZW4vY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBzdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisvLyB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgY3JlYXRpb24uCisKKyNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9FVkVSR1JFRU5fQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9FVkVSR1JFRU5fQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC94NjR4MTEvY29uZmlndXJhdGlvbl9wdWJsaWMuaCIKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfTElOVVhfWDY0WDExX0VWRVJHUkVFTl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9ldmVyZ3JlZW4vZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTUxODI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKQEAgLTAsMCArMSw1MCBAQAorIyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IHN0YXJib2FyZC90b29scy9jcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCit7CisndmFyaWFibGVzJzogeworICAgICdzYl90YXJnZXRfcGxhdGZvcm0nOiAnbGludXgteDY0eDExLWV2ZXJncmVlbicsCisgICAgJ3NiX2V2ZXJncmVlbic6IDEsCisgIH0sCisgICd0YXJnZXRfZGVmYXVsdHMnOiB7CisgICdjZmxhZ3NfYyc6IFsKKyAgICAgICctZlBJQycsCisgICAgXSwKKyAgICAnY2ZsYWdzX2NjJzogWworICAgICAgJy1mUElDJywKKyAgICBdLAorICAgICdkZWZhdWx0X2NvbmZpZ3VyYXRpb24nOiAnbGludXgteDY0eDExLWV2ZXJncmVlbl9kZWJ1ZycsCisgICAgJ2NvbmZpZ3VyYXRpb25zJzogeworICAgICAgJ2xpbnV4LXg2NHgxMS1ldmVyZ3JlZW5fZGVidWcnOiB7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2RlYnVnX2Jhc2UnXSwKKyAgICAgIH0sCisgICAgICAnbGludXgteDY0eDExLWV2ZXJncmVlbl9kZXZlbCc6IHsKKyAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnZGV2ZWxfYmFzZSddLAorICAgICAgfSwKKyAgICAgICdsaW51eC14NjR4MTEtZXZlcmdyZWVuX3FhJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydxYV9iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NHgxMS1ldmVyZ3JlZW5fZ29sZCc6IHsKKyAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnZ29sZF9iYXNlJ10sCisgICAgICB9LAorICAgIH0sICMgZW5kIG9mIGNvbmZpZ3VyYXRpb25zCisgIH0sCisKKyAgJ2luY2x1ZGVzJzogWworICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0eDExL2d5cF9jb25maWd1cmF0aW9uLmd5cGknLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL2d5cF9jb25maWd1cmF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDgzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9ldmVyZ3JlZW4vZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IHN0YXJib2FyZC90b29scy9jcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisKK2Zyb20gc3RhcmJvYXJkLmxpbnV4Lng2NHgxMSBpbXBvcnQgZ3lwX2NvbmZpZ3VyYXRpb24gYXMgcGFyZW50X2NvbmZpZ3VyYXRpb24KKworCitkZWYgQ3JlYXRlUGxhdGZvcm1Db25maWcoKToKKyAgcmV0dXJuIHBhcmVudF9jb25maWd1cmF0aW9uLkxpbnV4WDY0WDExQ29uZmlndXJhdGlvbignbGludXgteDY0eDExLWV2ZXJncmVlbicpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9ldmVyZ3JlZW4vc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2V2ZXJncmVlbi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2N2M3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9ldmVyZ3JlZW4vc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApAQCAtMCwwICsxLDI0IEBACisjIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorIyB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgY3JlYXRpb24uCisKK3sKKyAgJ2luY2x1ZGVzJzogWworICAgICMgTm90ZSB0aGF0IHdlIGFyZSAnaW5jbHVkZXMnaW5nIGEgJ2d5cCcgZmlsZSwgbm90IGEgJ2d5cGknIGZpbGUuICBUaGUgaWRlYQorICAgICMgaXMgdGhhdCB3ZSBqdXN0IHdhbnQgdGhpcyBmaWxlIHRvICpiZSogdGhlIHBhcmVudCBneXAgZmlsZS4KKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwJywKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2V2ZXJncmVlbi9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzYzdiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2V2ZXJncmVlbi9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBzdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworeworICAnaW5jbHVkZXMnOiBbCisgICAgIyBOb3RlIHRoYXQgd2UgYXJlICdpbmNsdWRlcydpbmcgYSAnZ3lwJyBmaWxlLCBub3QgYSAnZ3lwaScgZmlsZS4gIFRoZSBpZGVhCisgICAgIyBpcyB0aGF0IHdlIGp1c3Qgd2FudCB0aGlzIGZpbGUgdG8gKmJlKiB0aGUgcGFyZW50IGd5cCBmaWxlLgorICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0eDExL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAnLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZXZlcmdyZWVuL3RocmVhZF90eXBlc19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2V2ZXJncmVlbi90aHJlYWRfdHlwZXNfcHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYzc4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2V2ZXJncmVlbi90aHJlYWRfdHlwZXNfcHVibGljLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfRVZFUkdSRUVOX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9FVkVSR1JFRU5fVEhSRUFEX1RZUEVTX1BVQkxJQ19IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3g2NHgxMS90aHJlYWRfdHlwZXNfcHVibGljLmgiCisKKyNlbmRpZiAgLy8gU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9FVkVSR1JFRU5fVEhSRUFEX1RZUEVTX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi80L3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKaW5kZXggYmUzMjU5OS4uYjgyYmFkYiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0yNiwxNSArMjYsMTEgQEAKIAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICc8QChzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyknLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkX2FhY19vbmx5LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF93cml0ZXIuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF93cml0ZXIuaCcsCiAgICAgICBdLAotICAgICAgJ3NvdXJjZXMhJzogWwotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkX2FhY19hbmRfb3B1cy5jYycsCi0gICAgICBdLAogICAgICAgJ2RlZmluZXMnOiBbCiAgICAgICAgICdTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUicsCiAgICAgICAgICMgVGhpcyBtdXN0IGJlIGRlZmluZWQgd2hlbiBidWlsZGluZyBTdGFyYm9hcmQsIGFuZCBtdXN0IG5vdCB3aGVuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS90b29sY2hhaW5fcGF0aHMuc2ggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS90b29sY2hhaW5fcGF0aHMuc2gKaW5kZXggOGM2Zjc5ZS4uMGQ1NGMxZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdG9vbGNoYWluX3BhdGhzLnNoCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3Rvb2xjaGFpbl9wYXRocy5zaApAQCAtMjUsMTEgKzI1LDE5IEBACiBiYXNlX3BhdGg9IiR7Q09CQUxUX1RPT0xDSEFJTlNfRElSOj0ke2Nhbm9uaWNhbF9wYXRofX0iCiB0b29sY2hhaW5fcGF0aD0iJHtiYXNlX3BhdGh9LyR7dG9vbGNoYWluX2ZvbGRlcn0iCiB0b29sY2hhaW5fYmluYXJ5PSIke3Rvb2xjaGFpbl9wYXRofS8ke2JpbmFyeV9wYXRofSIKK3Rvb2xjaGFpbl9zeW1saW5rX3BhdGg9IiR7dG9vbGNoYWluX3BhdGh9LyR7c3ltbGlua19wYXRofSIKIAogaWYgWyAteCAiJHt0b29sY2hhaW5fYmluYXJ5fSIgXTsgdGhlbgogICAjIFRoZSB0b29sY2hhaW4gYmluYXJ5IGFscmVhZHkgZXhpc3QuCiAgIDE+JjIgZWNobyAiJHt0b29sY2hhaW5fbmFtZX0gJHt2ZXJzaW9ufSBhbHJlYWR5IGF2YWlsYWJsZS4iCi0gIGV4aXQgMAorCisgICMgSWYgYSBzeW1saW5rX3BhdGggaXMgc2V0LCB0aGVuIGFsc28gdmVyaWZ5IHRoYXQgdGhlCisgICMgdG9vbGNoYWluX3N5bWxpbmtfcGF0aCBhY3R1YWxseSBpcyBhIHN5bWJvbGljIGxpbmsuCisgIGlmIFsgLW4gIiR7c3ltbGlua19wYXRofSIgLWEgISAtTCAiJHt0b29sY2hhaW5fc3ltbGlua19wYXRofSIgXTsgdGhlbgorICAgIDE+JjIgZWNobyAiJHt0b29sY2hhaW5fc3ltbGlua19wYXRofSBpcyBub3QgYSBzeW1ib2xpYyBsaW5rLCB0b29sY2hhaW4gd2lsbCBiZSByZWluaXRpYWxpemVkLiIKKyAgZWxzZQorICAgIGV4aXQgMAorICBmaQogZmkKIAogaWYgWyAtZCAiJHt0b29sY2hhaW5fcGF0aH0iIF07IHRoZW4KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbWVkaWEuaCBiL3NyYy9zdGFyYm9hcmQvbWVkaWEuaAppbmRleCA2MDEyNDdmLi43YTgyYmI2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL21lZGlhLmgKKysrIGIvc3JjL3N0YXJib2FyZC9tZWRpYS5oCkBAIC03OSw2ICs3OSw3IEBACiAgIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywKICNpZiBTQl9IQVMoQUMzX0FVRElPKQogICBrU2JNZWRpYUF1ZGlvQ29kZWNBYzMsCisgIGtTYk1lZGlhQXVkaW9Db2RlY0VhYzMsCiAjZW5kaWYgIC8vIFNCX0hBUyhBQzNfQVVESU8pCiAgIGtTYk1lZGlhQXVkaW9Db2RlY09wdXMsCiAgIGtTYk1lZGlhQXVkaW9Db2RlY1ZvcmJpcywKQEAgLTQ4MywxMSArNDg0LDExIEBACiAKICAgLy8gVGhlIEF1ZGlvU3BlY2lmaWNDb25maWcsIGFzIHNwZWNpZmllZCBpbiBJU08vSUVDLTE0NDk2LTMsIHNlY3Rpb24gMS42LjIuMToKICAgLy8gaHR0cDovL3JlYWQucHVkbi5jb20vZG93bmxvYWRzOTgvZG9jL2NvbW0vNDAxMTUzLzE0NDk2L0lTT19JRUNfMTQ0OTYtMyUyMFBhcnQlMjAzJTIwQXVkaW8vQzAzNjA4M0VfU1VCMS5QREYKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSA2CisjaWYgU0JfSEFTKEFVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQogICBjb25zdCB2b2lkKiBhdWRpb19zcGVjaWZpY19jb25maWc7Ci0jZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDYKKyNlbHNlICAvLyBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAgIGludDhfdCBhdWRpb19zcGVjaWZpY19jb25maWdbOF07Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDYKKyNlbmRpZiAgLy8gU0JfSEFTKEFVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQogfSBTYk1lZGlhQXVkaW9IZWFkZXI7CiAKICNpZiBTQl9BUElfVkVSU0lPTiA8IDEwCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvYXVkaW9fc2lua190ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2F1ZGlvX3NpbmtfdGVzdC5jYwppbmRleCA1ZjE2N2VmLi4zMjZmYjhkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvYXVkaW9fc2lua190ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9hdWRpb19zaW5rX3Rlc3QuY2MKQEAgLTM4LDcgKzM4LDkgQEAKICAgQXVkaW9TaW5rVGVzdEVudmlyb25tZW50IGVudmlyb25tZW50KGZyYW1lX2J1ZmZlcnMpOwogICBBU1NFUlRfVFJVRShlbnZpcm9ubWVudC5pc192YWxpZCgpKTsKIAotICBlbnZpcm9ubWVudC5BcHBlbmRGcmFtZSg1MTIpOworICBpbnQgZnJhbWVzX3RvX2FwcGVuZCA9IGZyYW1lX2J1ZmZlcnMuZnJhbWVzX3Blcl9jaGFubmVsKCk7CisKKyAgZW52aXJvbm1lbnQuQXBwZW5kRnJhbWUoZnJhbWVzX3RvX2FwcGVuZCAvIDIpOwogICBFWFBFQ1RfVFJVRShlbnZpcm9ubWVudC5XYWl0VW50aWxTb21lRnJhbWVzQXJlQ29uc3VtZWQoKSk7CiB9CiAKQEAgLTQ3LDcgKzQ5LDkgQEAKICAgQXVkaW9TaW5rVGVzdEVudmlyb25tZW50IGVudmlyb25tZW50KGZyYW1lX2J1ZmZlcnMpOwogICBBU1NFUlRfVFJVRShlbnZpcm9ubWVudC5pc192YWxpZCgpKTsKIAotICBlbnZpcm9ubWVudC5BcHBlbmRGcmFtZSgxMDI0KTsKKyAgaW50IGZyYW1lc190b19hcHBlbmQgPSBmcmFtZV9idWZmZXJzLmZyYW1lc19wZXJfY2hhbm5lbCgpOworCisgIGVudmlyb25tZW50LkFwcGVuZEZyYW1lKGZyYW1lc190b19hcHBlbmQgLyAyKTsKICAgRVhQRUNUX1RSVUUoZW52aXJvbm1lbnQuV2FpdFVudGlsQWxsRnJhbWVzQXJlQ29uc3VtZWQoKSk7CiB9CiAKQEAgLTg3LDEwICs5MSwxMiBAQAogICBBdWRpb1NpbmtUZXN0RW52aXJvbm1lbnQgZW52aXJvbm1lbnQoZnJhbWVfYnVmZmVycyk7CiAgIEFTU0VSVF9UUlVFKGVudmlyb25tZW50LmlzX3ZhbGlkKCkpOwogCi0gIGVudmlyb25tZW50LkFwcGVuZEZyYW1lKDEwMjQpOworICBpbnQgZnJhbWVzX3RvX2FwcGVuZCA9IGZyYW1lX2J1ZmZlcnMuZnJhbWVzX3Blcl9jaGFubmVsKCk7CisKKyAgZW52aXJvbm1lbnQuQXBwZW5kRnJhbWUoZnJhbWVzX3RvX2FwcGVuZCAvIDIpOwogICBFWFBFQ1RfVFJVRShlbnZpcm9ubWVudC5XYWl0VW50aWxTb21lRnJhbWVzQXJlQ29uc3VtZWQoKSk7CiAgIFNiVGhyZWFkU2xlZXAoMjUwICoga1NiVGltZU1pbGxpc2Vjb25kKTsKLSAgZW52aXJvbm1lbnQuQXBwZW5kRnJhbWUoMTAyNCk7CisgIGVudmlyb25tZW50LkFwcGVuZEZyYW1lKGZyYW1lc190b19hcHBlbmQgLyAyKTsKICAgRVhQRUNUX1RSVUUoZW52aXJvbm1lbnQuV2FpdFVudGlsQWxsRnJhbWVzQXJlQ29uc3VtZWQoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9ucGxiLmd5cCBiL3NyYy9zdGFyYm9hcmQvbnBsYi9ucGxiLmd5cAppbmRleCA4MDdlN2IxLi44YTBmZDBiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvbnBsYi5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL25wbGIuZ3lwCkBAIC0yMzUsNiArMjM1LDcgQEAKICAgICAgICAgJ3N5c3RlbV9iaW5hcnlfc2VhcmNoX3Rlc3QuY2MnLAogICAgICAgICAnc3lzdGVtX2NsZWFyX2xhc3RfZXJyb3JfdGVzdC5jYycsCiAgICAgICAgICdzeXN0ZW1fZ2V0X2Vycm9yX3N0cmluZ190ZXN0LmNjJywKKyAgICAgICAgJ3N5c3RlbV9nZXRfZXh0ZW5zaW9uX3Rlc3QuY2MnLAogICAgICAgICAnc3lzdGVtX2dldF9sYXN0X2Vycm9yX3Rlc3QuY2MnLAogICAgICAgICAnc3lzdGVtX2dldF9sb2NhbGVfaWRfdGVzdC5jYycsCiAgICAgICAgICdzeXN0ZW1fZ2V0X251bWJlcl9vZl9wcm9jZXNzb3JzX3Rlc3QuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRlX3Rlc3QuY2MKaW5kZXggY2FmMTVkNi4uZjJjOWJiMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0ZV90ZXN0LmNjCkBAIC0yOTAsOSArMjkwLDE1IEBACiAgICAgICBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLCBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXR9OwogCiAgIGNvbnN0ZXhwciBTYk1lZGlhQXVkaW9Db2RlYyBrQXVkaW9Db2RlY3NbXSA9IHsKLSAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY05vbmUsCisgICAga1NiTWVkaWFBdWRpb0NvZGVjTm9uZSwKIAotICAgICAga1NiTWVkaWFBdWRpb0NvZGVjQWFjLCBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzLCBrU2JNZWRpYUF1ZGlvQ29kZWNWb3JiaXMsCisgICAga1NiTWVkaWFBdWRpb0NvZGVjQWFjLAorI2lmIFNCX0hBUyhBQzNfQVVESU8pCisgICAga1NiTWVkaWFBdWRpb0NvZGVjQWMzLAorICAgIGtTYk1lZGlhQXVkaW9Db2RlY0VhYzMsCisjZW5kaWYgIC8vIFNCX0hBUyhBQzNfQVVESU8pCisgICAga1NiTWVkaWFBdWRpb0NvZGVjT3B1cywKKyAgICBrU2JNZWRpYUF1ZGlvQ29kZWNWb3JiaXMsCiAgIH07CiAKICAgLy8gVE9ETzogdHVybiB0aGlzIGludG8gYSBtYWNyby4KQEAgLTMwNSw2ICszMTEsMTAgQEAKICAgICBjYXNlIGtBdWRpb0NvZGVjc1sxXToKICAgICBjYXNlIGtBdWRpb0NvZGVjc1syXToKICAgICBjYXNlIGtBdWRpb0NvZGVjc1szXToKKyNpZiBTQl9IQVMoQUMzX0FVRElPKQorICAgIGNhc2Uga0F1ZGlvQ29kZWNzWzRdOgorICAgIGNhc2Uga0F1ZGlvQ29kZWNzWzVdOgorI2VuZGlmICAvLyBTQl9IQVMoQUMzX0FVRElPKQogICAgICAgYnJlYWs7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3NfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9zb2NrZXRfZ2V0X2ludGVyZmFjZV9hZGRyZXNzX3Rlc3QuY2MKaW5kZXggZjkyNTQ5NS4uYmIzM2FkYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3NfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzc190ZXN0LmNjCkBAIC04MywxNiArODMsMTYgQEAKICAgU2JNZW1vcnlTZXQoJnNvdXJjZSwga0ludmFsaWRCeXRlLCBzaXplb2Yoc291cmNlKSk7CiAKICAgRVhQRUNUX1RSVUUoU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzKCZkZXN0aW5hdGlvbiwgJnNvdXJjZSwgTlVMTCkpOwotICBFWFBFQ1RfVFJVRShzb3VyY2UudHlwZSA9PSBHZXRBZGRyZXNzVHlwZSgpKTsKKyAgRVhQRUNUX0VRKEdldEFkZHJlc3NUeXBlKCksIHNvdXJjZS50eXBlKTsKICAgRVhQRUNUX1RSVUUoU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzKCZkZXN0aW5hdGlvbiwgJnNvdXJjZSwgJm5ldG1hc2spKTsKIAogICBFWFBFQ1RfRkFMU0UoSXNMb2NhbGhvc3QoJnNvdXJjZSkpOwogCiAgIC8vIEEgbmV0bWFzayB0aGF0IHN0YXJ0cyB3aXRoIDAgaXMgbGlrZWx5IGluY29ycmVjdC4KICAgRVhQRUNUX1RSVUUobmV0bWFzay5hZGRyZXNzWzBdICYgMHg4KTsKLSAgRVhQRUNUX0VRKHNvdXJjZS50eXBlLCBHZXRBZGRyZXNzVHlwZSgpKTsKLSAgRVhQRUNUX0VRKG5ldG1hc2sudHlwZSwgR2V0QWRkcmVzc1R5cGUoKSk7Ci0gIEVYUEVDVF9FUShzb3VyY2UucG9ydCwgMCk7CisgIEVYUEVDVF9FUShHZXRBZGRyZXNzVHlwZSgpLCBzb3VyY2UudHlwZSk7CisgIEVYUEVDVF9FUShHZXRBZGRyZXNzVHlwZSgpLCBuZXRtYXNrLnR5cGUpOworICBFWFBFQ1RfRVEoMCwgc291cmNlLnBvcnQpOwogfQogCiBURVNUX1AoU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzVGVzdCwgU3VubnlEYXlTb3VyY2VGb3JEZXN0aW5hdGlvbikgewpAQCAtMTI1LDExICsxMjUsMTEgQEAKICAgU2JNZW1vcnlTZXQoJmludmFsaWRfYWRkcmVzcywga0ludmFsaWRCeXRlLCBzaXplb2Yoc291cmNlKSk7CiAgIFNiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzcygmZGVzdGluYXRpb25fYWRkcmVzcywgJnNvdXJjZSwgJm5ldG1hc2spOwogCi0gIEVYUEVDVF9UUlVFKHNvdXJjZS50eXBlID09IEdldEFkZHJlc3NUeXBlKCkpOwotICBFWFBFQ1RfTkUoc291cmNlLnBvcnQsIDApOworICBFWFBFQ1RfRVEoR2V0QWRkcmVzc1R5cGUoKSwgc291cmNlLnR5cGUpOworICBFWFBFQ1RfTkUoMCwgc291cmNlLnBvcnQpOwogICAvLyBBIG5ldG1hc2sgdGhhdCBzdGFydHMgd2l0aCAwIGlzIGxpa2VseSBpbmNvcnJlY3QuCiAgIEVYUEVDVF9UUlVFKG5ldG1hc2suYWRkcmVzc1swXSAmIDB4OCk7Ci0gIEVYUEVDVF9FUShuZXRtYXNrLnR5cGUsIEdldEFkZHJlc3NUeXBlKCkpOworICBFWFBFQ1RfRVEoR2V0QWRkcmVzc1R5cGUoKSwgbmV0bWFzay50eXBlKTsKICAgRVhQRUNUX05FKDAsIFNiTWVtb3J5Q29tcGFyZShzb3VyY2UuYWRkcmVzcywgaW52YWxpZF9hZGRyZXNzLmFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfQVJSQVlfU0laRShzb3VyY2UuYWRkcmVzcykpKTsKICAgRVhQRUNUX05FKDAsIFNiTWVtb3J5Q29tcGFyZShuZXRtYXNrLmFkZHJlc3MsIGludmFsaWRfYWRkcmVzcy5hZGRyZXNzLApAQCAtMTYzLDcgKzE2Myw3IEBACiAgIFNiTWVtb3J5U2V0KCZpbnZhbGlkX2FkZHJlc3MsIGtJbnZhbGlkQnl0ZSwgc2l6ZW9mKGludmFsaWRfYWRkcmVzcykpOwogCiAgIEVYUEVDVF9UUlVFKFNiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzcygmZGVzdGluYXRpb24sICZzb3VyY2UsIE5VTEwpKTsKLSAgRVhQRUNUX0VRKHNvdXJjZS50eXBlLCBHZXRBZGRyZXNzVHlwZSgpKTsKKyAgRVhQRUNUX0VRKEdldEFkZHJlc3NUeXBlKCksIHNvdXJjZS50eXBlKTsKICAgRVhQRUNUX1RSVUUoU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzKCZkZXN0aW5hdGlvbiwgJnNvdXJjZSwgJm5ldG1hc2spKTsKICAgRVhQRUNUX0ZBTFNFKElzTG9jYWxob3N0KCZzb3VyY2UpKTsKICAgRVhQRUNUX0ZBTFNFKElzVW5zcGVjaWZpZWQoJnNvdXJjZSkpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX2hlbHBlci5oIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX2hlbHBlci5oCmluZGV4IGE3YWI5ZDguLmNiYTYzMWMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9oZWxwZXIuaAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3BlZWNoX3JlY29nbml6ZXJfaGVscGVyLmgKQEAgLTI3LDUwICsyNywyNCBAQAogCiAjaWYgU0JfSEFTKFNQRUVDSF9SRUNPR05JWkVSKSAmJiBTQl9BUElfVkVSU0lPTiA+PSA1CiAKLWNsYXNzIEV2ZW50TW9jayA6IHB1YmxpYyBSZWZDb3VudGVkPEV2ZW50TW9jaz4gewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QwKE9uRXZlbnQsIHZvaWQodm9pZCkpOwotfTsKLQogY2xhc3MgU3BlZWNoUmVjb2duaXplclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKICBwdWJsaWM6Ci0gIFNwZWVjaFJlY29nbml6ZXJUZXN0KCkKLSAgICAgIDogaGFuZGxlcl8oKSwgdGVzdF9tb2NrXyhuZXcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrPEV2ZW50TW9jaz4oKSkgeworICBTcGVlY2hSZWNvZ25pemVyVGVzdCgpIDogaGFuZGxlcl8oKSB7CiAgICAgaGFuZGxlcl8ub25fc3BlZWNoX2RldGVjdGVkID0gT25TcGVlY2hEZXRlY3RlZDsKICAgICBoYW5kbGVyXy5vbl9lcnJvciA9IE9uRXJyb3I7CiAgICAgaGFuZGxlcl8ub25fcmVzdWx0cyA9IE9uUmVzdWx0czsKICAgICBoYW5kbGVyXy5jb250ZXh0ID0gdGhpczsKICAgfQogCi0gIHN0YXRpYyB2b2lkIE9uU3BlZWNoRGV0ZWN0ZWQodm9pZCogY29udGV4dCwgYm9vbCBkZXRlY3RlZCkgewotICAgIFNwZWVjaFJlY29nbml6ZXJUZXN0KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8U3BlZWNoUmVjb2duaXplclRlc3QqPihjb250ZXh0KTsKLSAgICB0ZXN0LT5PblNpZ25hbEV2ZW50KCk7Ci0gIH0KLSAgc3RhdGljIHZvaWQgT25FcnJvcih2b2lkKiBjb250ZXh0LCBTYlNwZWVjaFJlY29nbml6ZXJFcnJvciBlcnJvcikgewotICAgIFNwZWVjaFJlY29nbml6ZXJUZXN0KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8U3BlZWNoUmVjb2duaXplclRlc3QqPihjb250ZXh0KTsKLSAgICB0ZXN0LT5PblNpZ25hbEV2ZW50KCk7Ci0gIH0KKyAgc3RhdGljIHZvaWQgT25TcGVlY2hEZXRlY3RlZCh2b2lkKiBjb250ZXh0LCBib29sIGRldGVjdGVkKSB7fQorICBzdGF0aWMgdm9pZCBPbkVycm9yKHZvaWQqIGNvbnRleHQsIFNiU3BlZWNoUmVjb2duaXplckVycm9yIGVycm9yKSB7fQogICBzdGF0aWMgdm9pZCBPblJlc3VsdHModm9pZCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIFNiU3BlZWNoUmVzdWx0KiByZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdHNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZmluYWwpIHsKLSAgICBTcGVlY2hSZWNvZ25pemVyVGVzdCogdGVzdCA9IHN0YXRpY19jYXN0PFNwZWVjaFJlY29nbml6ZXJUZXN0Kj4oY29udGV4dCk7Ci0gICAgdGVzdC0+T25TaWduYWxFdmVudCgpOwotICB9CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ZpbmFsKSB7fQogCi0gIFNiU3BlZWNoUmVjb2duaXplckhhbmRsZXIqIGhhbmRsZXIoKSB7IHJldHVybiAmaGFuZGxlcl87IH0KLQotICBFdmVudE1vY2smIHRlc3RfbW9jaygpIHsgcmV0dXJuICp0ZXN0X21vY2tfLmdldCgpOyB9Ci0KLSAgdm9pZCBXYWl0KCkgewotICAgIGlmICghZXZlbnRfc2VtYXBob3JlXy5UYWtlV2FpdChrV2FpdFRpbWUpKSB7Ci0gICAgICBTQl9MT0coV0FSTklORykgPDwgIldhaXRpbmcgZm9yIHJlY29nbml6ZXIgZXZlbnQgdG8gY29tZSwgYnV0IHRpbWVvdXQhIjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uU2lnbmFsRXZlbnQoKSB7Ci0gICAgdGVzdF9tb2NrXy0+T25FdmVudCgpOwotICAgIGV2ZW50X3NlbWFwaG9yZV8uUHV0KCk7CisgIFNiU3BlZWNoUmVjb2duaXplckhhbmRsZXIqIGhhbmRsZXIoKSB7CisgICAgcmV0dXJuICZoYW5kbGVyXzsKICAgfQogCiAgcHJvdGVjdGVkOgpAQCAtODQsMTMgKzU4LDggQEAKIAogIHByaXZhdGU6CiAgIGNvbnN0IFNiVGltZSBrVGVhckRvd25UaW1lID0gMTAgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7Ci0gIGNvbnN0IFNiVGltZSBrV2FpdFRpbWUgPSA2MDAgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7CiAKICAgU2JTcGVlY2hSZWNvZ25pemVySGFuZGxlciBoYW5kbGVyXzsKLQotICBzdGFyYm9hcmQ6OlNlbWFwaG9yZSBldmVudF9zZW1hcGhvcmVfOwotCi0gIGNvbnN0IHNjb3BlZF9yZWZwdHI8RXZlbnRNb2NrPiB0ZXN0X21vY2tfOwogfTsKIAogI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1JFQ09HTklaRVIpICYmIFNCX0FQSV9WRVJTSU9OID49IDUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9zcGVlY2hfcmVjb2duaXplcl9zdGFydF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX3N0YXJ0X3Rlc3QuY2MKaW5kZXggNGYzN2ZlNC4uMTU5MjJmNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX3N0YXJ0X3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3NwZWVjaF9yZWNvZ25pemVyX3N0YXJ0X3Rlc3QuY2MKQEAgLTMxLDggKzMxLDYgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgT25FdmVudCgpKS5UaW1lcyh0ZXN0aW5nOjpBdExlYXN0KDEpKTsKLSAgV2FpdCgpOwogICBTYlNwZWVjaFJlY29nbml6ZXJTdG9wKHJlY29nbml6ZXIpOwogICBTYlNwZWVjaFJlY29nbml6ZXJEZXN0cm95KHJlY29nbml6ZXIpOwogfQpAQCAtNDcsOCArNDUsNiBAQAogICAgIHJldHVybjsKICAgfQogCi0gIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBPbkV2ZW50KCkpLlRpbWVzKHRlc3Rpbmc6OkF0TGVhc3QoMSkpOwotICBXYWl0KCk7CiAgIFNiU3BlZWNoUmVjb2duaXplclN0b3AocmVjb2duaXplcik7CiAgIFNiU3BlZWNoUmVjb2duaXplckRlc3Ryb3kocmVjb2duaXplcik7CiB9CkBAIC02Myw4ICs1OSw2IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgRVhQRUNUX0NBTEwodGVzdF9tb2NrKCksIE9uRXZlbnQoKSkuVGltZXModGVzdGluZzo6QXRMZWFzdCgxKSk7Ci0gIFdhaXQoKTsKICAgU2JTcGVlY2hSZWNvZ25pemVyU3RvcChyZWNvZ25pemVyKTsKICAgU2JTcGVlY2hSZWNvZ25pemVyRGVzdHJveShyZWNvZ25pemVyKTsKIH0KQEAgLTc5LDggKzczLDYgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgT25FdmVudCgpKS5UaW1lcyh0ZXN0aW5nOjpBdExlYXN0KDEpKTsKLSAgV2FpdCgpOwogICBTYlNwZWVjaFJlY29nbml6ZXJTdG9wKHJlY29nbml6ZXIpOwogICBTYlNwZWVjaFJlY29nbml6ZXJEZXN0cm95KHJlY29nbml6ZXIpOwogfQpAQCAtOTUsMTIgKzg3LDEwIEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgRVhQRUNUX0NBTEwodGVzdF9tb2NrKCksIE9uRXZlbnQoKSkuVGltZXModGVzdGluZzo6QXRMZWFzdCgxKSk7CiAgIGJvb2wgc3VjY2VzcyA9IFNiU3BlZWNoUmVjb2duaXplclN0YXJ0KHJlY29nbml6ZXIsICZjb25maWd1cmF0aW9uKTsKICAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3MpOwogICBzdWNjZXNzID0gU2JTcGVlY2hSZWNvZ25pemVyU3RhcnQocmVjb2duaXplciwgJmNvbmZpZ3VyYXRpb24pOwogICBFWFBFQ1RfRkFMU0Uoc3VjY2Vzcyk7Ci0gIFdhaXQoKTsKICAgU2JTcGVlY2hSZWNvZ25pemVyRGVzdHJveShyZWNvZ25pemVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfZXh0ZW5zaW9uX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc3lzdGVtX2dldF9leHRlbnNpb25fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmVkY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3N5c3RlbV9nZXRfZXh0ZW5zaW9uX3Rlc3QuY2MKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2V4dGVuc2lvbi9wbGF0Zm9ybV9zZXJ2aWNlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYVEVOU0lPTlNfQVBJX1ZFUlNJT04KK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIG5wbGIgeworbmFtZXNwYWNlIHsKKworVEVTVChTYlN5c3RlbUdldEV4dGVuc2lvbiwgTWFkZVVwRXh0ZW5zaW9uKSB7CisgIHZvaWQqIGZpbmdfbG9uZ2VyID0gU2JTeXN0ZW1HZXRFeHRlbnNpb24oImRldi5jb2JhbHQuZXh0ZW5zaW9uLkZpbmdMb25nZXIiKTsKKyAgRVhQRUNUX1RSVUUoZmluZ19sb25nZXIgPT0gTlVMTCk7Cit9CisKK1RFU1QoU2JTeXN0ZW1HZXRFeHRlbnNpb24sIFdlYlBsYXRmb3JtU2VydmljZXMpIHsKKyAgY29uc3QgY2hhcioga0V4dGVuc2lvbk5hbWUgPSBrQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlTmFtZTsKKyAgQ29iYWx0RXh0ZW5zaW9uUGxhdGZvcm1TZXJ2aWNlQXBpKiBwbGF0Zm9ybV9zZXJ2aWNlX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VBcGkqPigKKyAgICAgICAgICBTYlN5c3RlbUdldEV4dGVuc2lvbihrRXh0ZW5zaW9uTmFtZSkpOworICBpZiAoIXBsYXRmb3JtX3NlcnZpY2VfYXBpKSB7CisgICAgcmV0dXJuOworICB9CisgIEVYUEVDVF9TVFJFUShwbGF0Zm9ybV9zZXJ2aWNlX2FwaS0+a05hbWUsIGtFeHRlbnNpb25OYW1lKTsKKyAgRVhQRUNUX0VRKHBsYXRmb3JtX3NlcnZpY2VfYXBpLT5rVmVyc2lvbiwgMSkKKyAgICAgIDw8ICJQbGF0Zm9tU2VydmljZUFwaSB2ZXJzaW9uIGludmFsaWQiOworICBFWFBFQ1RfVFJVRShwbGF0Zm9ybV9zZXJ2aWNlX2FwaS0+SGFzICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShwbGF0Zm9ybV9zZXJ2aWNlX2FwaS0+T3BlbiAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocGxhdGZvcm1fc2VydmljZV9hcGktPkNsb3NlICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShwbGF0Zm9ybV9zZXJ2aWNlX2FwaS0+U2VuZCAhPSBOVUxMKTsKKworICBDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VBcGkqIHNlY29uZF9wbGF0Zm9ybV9zZXJ2aWNlX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxDb2JhbHRFeHRlbnNpb25QbGF0Zm9ybVNlcnZpY2VBcGkqPigKKyAgICAgICAgICBTYlN5c3RlbUdldEV4dGVuc2lvbihrRXh0ZW5zaW9uTmFtZSkpOworCisgIEVYUEVDVF9FUShzZWNvbmRfcGxhdGZvcm1fc2VydmljZV9hcGksIHBsYXRmb3JtX3NlcnZpY2VfYXBpKQorICAgICAgPDwgIkV4dGVuc2lvbiBzdHJ1Y3Qgc2hvdWxkIGJlIGEgc2luZ2xldG9uIjsKK30KK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG5wbGIKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhURU5TSU9OU19BUElfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3VybF9wbGF5ZXJfY3JlYXRlX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvdXJsX3BsYXllcl9jcmVhdGVfdGVzdC5jYwppbmRleCBhODcyNjdhLi43YTg1NDgzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvdXJsX3BsYXllcl9jcmVhdGVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvdXJsX3BsYXllcl9jcmVhdGVfdGVzdC5jYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKIAogI2lmIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9kYXJ3aW4vdXJsX3BsYXllci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdWlraXQvdXJsX3BsYXllci5oIgogI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9wbGF5ZXIuaCBiL3NyYy9zdGFyYm9hcmQvcGxheWVyLmgKaW5kZXggMjFmNWI2OC4uNTQ2MjdjMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9wbGF5ZXIuaAorKysgYi9zcmMvc3RhcmJvYXJkL3BsYXllci5oCkBAIC0zNTIsMTEgKzM1MiwxMSBAQAogLy8gfGF1ZGlvX2hlYWRlcnw6IE5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHBvcHVsYXRlZCB8YXVkaW9faGVhZGVyfAogLy8gICBpZiB0aGUgYXVkaW8gY29kZWMgaXMgfGtTYk1lZGlhQXVkaW9Db2RlY0FhY3wuIE90aGVyd2lzZSwgfGF1ZGlvX2hlYWRlcnwKIC8vICAgY2FuIGJlIE5VTEwuIFNlZSBtZWRpYS5oIGZvciB0aGUgZm9ybWF0IG9mIHRoZSB8U2JNZWRpYUF1ZGlvSGVhZGVyfCBzdHJ1Y3QuCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNgorI2lmIFNCX0hBUyhBVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKIC8vICAgTm90ZSB0aGF0IHxhdWRpb19zcGVjaWZpY19jb25maWd8IGlzIGEgcG9pbnRlciBhbmQgdGhlIGNvbnRlbnQgaXQgcG9pbnRzIHRvCiAvLyAgIGlzIG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuICBUaGUgaW1wbGVtZW50YXRpb24gaGFzIHRvCiAvLyAgIG1ha2UgYSBjb3B5IG9mIHRoZSBjb250ZW50IGlmIGl0IGlzIG5lZWRlZCBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucy4KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNgorI2VuZGlmICAvLyBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAjaWYgU0JfSEFTKEFVRElPTEVTU19WSURFTykKIC8vICAgV2hlbiB8YXVkaW9fY29kZWN8IGlzIHxrU2JNZWRpYUF1ZGlvQ29kZWNOb25lfCwgdGhpcyBtdXN0IGJlIHNldCB0byBOVUxMLgogI2VuZGlmICAvLyBTQl9IQVMoQVVESU9MRVNTX1ZJREVPKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9xdWV1ZS5oIGIvc3JjL3N0YXJib2FyZC9xdWV1ZS5oCmluZGV4IDg1N2NkNDkuLjc0OWQ4YWUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcXVldWUuaAorKysgYi9zcmMvc3RhcmJvYXJkL3F1ZXVlLmgKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgIHF1ZXVlXy5jbGVhcigpOwogICB9CiAKLSAgc2l6ZV90IFNpemUoKSB7CisgIHNpemVfdCBTaXplKCkgY29uc3QgewogICAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICAgIHJldHVybiBxdWV1ZV8uc2l6ZSgpOwogICB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9hdWRpb19zaW5rX2lzX2F1ZGlvX3NhbXBsZV90eXBlX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmU3YmZlLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F1ZGlvX3NpbmsuaCIKLQotYm9vbCBTYkF1ZGlvU2lua0lzQXVkaW9TYW1wbGVUeXBlU3VwcG9ydGVkKAotICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgYXVkaW9fc2FtcGxlX3R5cGUpIHsKLSAgcmV0dXJuIGF1ZGlvX3NhbXBsZV90eXBlID09IGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlRmxvYXQzMjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfdHlwZV9kaXNwYXRjaGVyLmNjIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvYXVkaW9fc2lua190eXBlX2Rpc3BhdGNoZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiOTE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfdHlwZV9kaXNwYXRjaGVyLmNjCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oIgorCisvLyBzdGF0aWMKK3ZvaWQgU2JBdWRpb1NpbmtQcml2YXRlOjpQbGF0Zm9ybUluaXRpYWxpemUoKSB7CisgIHN0YXJib2FyZDo6c2hhcmVkOjphbHNhOjpQbGF0Zm9ybUluaXRpYWxpemUoKTsKKyAgU2JBdWRpb1NpbmtQcml2YXRlOjpFbmFibGVGYWxsYmFja1RvU3R1YigpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgU2JBdWRpb1NpbmtQcml2YXRlOjpQbGF0Zm9ybVRlYXJEb3duKCkgeworICBzdGFyYm9hcmQ6OnNoYXJlZDo6YWxzYTo6UGxhdGZvcm1UZWFyRG93bigpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weQppbmRleCA1YzZkODM1Li4wNjdkYzE4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weQorKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weQpAQCAtOTAsMTEgKzkwLDExIEBACiAKICAgZGVmIEdldFRlc3RGaWx0ZXJzKHNlbGYpOgogICAgIGZpbHRlcnMgPSBzdXBlcihSYXNwaVBsYXRmb3JtQ29uZmlnLCBzZWxmKS5HZXRUZXN0RmlsdGVycygpCi0gICAgZm9yIHRhcmdldCwgdGVzdHMgaW4gc2VsZi5fRklMVEVSRURfVEVTVFMuaXRlcml0ZW1zKCk6CisgICAgZm9yIHRhcmdldCwgdGVzdHMgaW4gc2VsZi5fX0ZJTFRFUkVEX1RFU1RTLml0ZXJpdGVtcygpOgogICAgICAgZmlsdGVycy5leHRlbmQodGVzdF9maWx0ZXIuVGVzdEZpbHRlcih0YXJnZXQsIHRlc3QpIGZvciB0ZXN0IGluIHRlc3RzKQogICAgIHJldHVybiBmaWx0ZXJzCiAKLSAgX0ZJTFRFUkVEX1RFU1RTID0geworICBfX0ZJTFRFUkVEX1RFU1RTID0gewogICAgICAgJ25wbGInOiBbCiAgICAgICAgICAgJ1NiRHJtVGVzdC5BbnlTdXBwb3J0ZWRLZXlTeXN0ZW1zJywKICAgICAgICAgICAjIFRoZSBSYXNQaSB0ZXN0IGRldmljZXMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gYW4gSVBWNiBuZXR3b3JrLCBzbwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQppbmRleCAxNTg4MWVhLi44ZmYzZjBlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQpAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zeXN0ZW1fZ2V0X3BhdGguY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zeXN0ZW1faGFzX2NhcGFiaWxpdHkuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9hcHBsaWNhdGlvbl9kaXNwbWFueC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvYXVkaW9fc2lua190eXBlX2Rpc3BhdGNoZXIuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9kaXNwbWFueF91dGlsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvZGlzcG1hbnhfdXRpbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvbWFpbi5jYycsCkBAIC04Niw5ICs4Niw2IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV91dGlsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX3V0aWwuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19nZXRfbWF4X2NoYW5uZWxzLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hdWRpb19zaW5rX2dldF9uZWFyZXN0X3N1cHBvcnRlZF9zYW1wbGVfZnJlcXVlbmN5LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hdWRpb19zaW5rX2lzX2F1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9tZW1vcnlfYWxsb2NhdGVfYWxpZ25lZF91bmNoZWNrZWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9tZW1vcnlfYWxsb2NhdGVfdW5jaGVja2VkLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvbWVtb3J5X2ZyZWUuY2MnLApAQCAtMjYxLDYgKzI1OCwxMCBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2NyZWF0ZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfZGVzdHJveS5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfZ2V0X21heF9jaGFubmVsc181XzEuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2dldF9uZWFyZXN0X3N1cHBvcnRlZF9zYW1wbGVfZnJlcXVlbmN5LmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pc19hdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVfc3VwcG9ydGVkX2ludGVybGVhdmVkX29ubHkuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2lzX2F1ZGlvX3NhbXBsZV90eXBlX3N1cHBvcnRlZF9mbG9hdDMyX29ubHkuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pc192YWxpZC5jYycsCkBAIC0zNjEsNyArMzYyLDcgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fdXBkYXRlX3NlcnZlcl9jZXJ0aWZpY2F0ZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX3VwZGF0ZV9zZXNzaW9uLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9tZWRpYV9pc19zdXBwb3J0ZWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9jbGVhcl9wbGF0Zm9ybV9lcnJvci5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF9leHRlbnNpb25zLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X3RvdGFsX2dwdV9tZW1vcnkuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfdXNlZF9ncHVfbWVtb3J5LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1faGlkZV9zcGxhc2hfc2NyZWVuLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N5c3RlbV9nZXRfcHJvcGVydHkuY2MgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjCmluZGV4IGEwNGFlNWUuLmE4YjE0MGQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N5c3RlbV9nZXRfcHJvcGVydHkuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvc3lzdGVtX2dldF9wcm9wZXJ0eS5jYwpAQCAtMTgsNiArMTgsOSBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTU9WRV9GT1JNQVRfU1RSSU5HX1ZFUlNJT04KKyNpbmNsdWRlICJzdGFyYm9hcmQvZm9ybWF0X3N0cmluZy5oIgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NT1ZFX0ZPUk1BVF9TVFJJTkdfVkVSU0lPTgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2Fsc2FfYXVkaW9fc2lua190eXBlLmNjCmluZGV4IDY4YmE4ZGYuLjk3NWQ0Y2MgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5jYwpAQCAtMTksOCArMTksMTAgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSAic3RhcmJvYXJkL2F1ZGlvX3NpbmsuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX3V0aWwuaCIKQEAgLTEwNSw2ICsxMDcsOSBAQAogICBib29sIGlzX3ZhbGlkKCkgeyByZXR1cm4gcGxheWJhY2tfaGFuZGxlXyAhPSBOVUxMOyB9CiAKICBwcml2YXRlOgorICBBbHNhQXVkaW9TaW5rKGNvbnN0IEFsc2FBdWRpb1NpbmsmKSA9IGRlbGV0ZTsKKyAgQWxzYUF1ZGlvU2luayYgb3BlcmF0b3I9KGNvbnN0IEFsc2FBdWRpb1NpbmsmKSA9IGRlbGV0ZTsKKwogICBzdGF0aWMgdm9pZCogVGhyZWFkRW50cnlQb2ludCh2b2lkKiBjb250ZXh0KTsKICAgdm9pZCBBdWRpb1RocmVhZEZ1bmMoKTsKICAgLy8gV3JpdGUgc2lsZW5jZSB0byBBTFNBIHdoZW4gdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIGluIHNvdXJjZSBvciB3aGVuIHRoZQpAQCAtMzc4LDcgKzM4MywzMSBAQAogICB9CiB9CiAKLX0gIC8vIG5hbWVzcGFjZQorY2xhc3MgQWxzYUF1ZGlvU2lua1R5cGUgOiBwdWJsaWMgU2JBdWRpb1NpbmtQcml2YXRlOjpUeXBlIHsKKyBwdWJsaWM6CisgIFNiQXVkaW9TaW5rIENyZWF0ZSgKKyAgICAgIGludCBjaGFubmVscywKKyAgICAgIGludCBzYW1wbGluZ19mcmVxdWVuY3lfaHosCisgICAgICBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIGF1ZGlvX3NhbXBsZV90eXBlLAorICAgICAgU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZSBhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGUsCisgICAgICBTYkF1ZGlvU2lua0ZyYW1lQnVmZmVycyBmcmFtZV9idWZmZXJzLAorICAgICAgaW50IGZyYW1lc19wZXJfY2hhbm5lbCwKKyAgICAgIFNiQXVkaW9TaW5rVXBkYXRlU291cmNlU3RhdHVzRnVuYyB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLAorICAgICAgU2JBdWRpb1NpbmtDb25zdW1lRnJhbWVzRnVuYyBjb25zdW1lX2ZyYW1lc19mdW5jLAorICAgICAgdm9pZCogY29udGV4dCk7CisKKyAgYm9vbCBJc1ZhbGlkKFNiQXVkaW9TaW5rIGF1ZGlvX3NpbmspIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gYXVkaW9fc2luayAhPSBrU2JBdWRpb1NpbmtJbnZhbGlkICYmIGF1ZGlvX3NpbmstPklzVHlwZSh0aGlzKTsKKyAgfQorCisgIHZvaWQgRGVzdHJveShTYkF1ZGlvU2luayBhdWRpb19zaW5rKSBvdmVycmlkZSB7CisgICAgaWYgKGF1ZGlvX3NpbmsgIT0ga1NiQXVkaW9TaW5rSW52YWxpZCAmJiAhSXNWYWxpZChhdWRpb19zaW5rKSkgeworICAgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJhdWRpb19zaW5rIGlzIGludmFsaWQuIjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVsZXRlIGF1ZGlvX3Npbms7CisgIH0KK307CiAKIFNiQXVkaW9TaW5rIEFsc2FBdWRpb1NpbmtUeXBlOjpDcmVhdGUoCiAgICAgaW50IGNoYW5uZWxzLApAQCAtNDAyLDI2ICs0MzEsMjkgQEAKICAgcmV0dXJuIGF1ZGlvX3Npbms7CiB9CiAKLX0gIC8vIG5hbWVzcGFjZSBhbHNhCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCit9ICAvLyBuYW1lc3BhY2UKIAogbmFtZXNwYWNlIHsKLVNiQXVkaW9TaW5rUHJpdmF0ZTo6VHlwZSogYWxzYV9hdWRpb19zaW5rX3R5cGVfOworQWxzYUF1ZGlvU2lua1R5cGUqIGFsc2FfYXVkaW9fc2lua190eXBlXzsKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyBzdGF0aWMKLXZvaWQgU2JBdWRpb1NpbmtQcml2YXRlOjpQbGF0Zm9ybUluaXRpYWxpemUoKSB7Cit2b2lkIFBsYXRmb3JtSW5pdGlhbGl6ZSgpIHsKICAgU0JfRENIRUNLKCFhbHNhX2F1ZGlvX3NpbmtfdHlwZV8pOwotICBhbHNhX2F1ZGlvX3NpbmtfdHlwZV8gPSBuZXcgc3RhcmJvYXJkOjpzaGFyZWQ6OmFsc2E6OkFsc2FBdWRpb1NpbmtUeXBlOwotICBTZXRQcmltYXJ5VHlwZShhbHNhX2F1ZGlvX3NpbmtfdHlwZV8pOwotICBFbmFibGVGYWxsYmFja1RvU3R1YigpOworICBhbHNhX2F1ZGlvX3NpbmtfdHlwZV8gPSBuZXcgQWxzYUF1ZGlvU2lua1R5cGUoKTsKKyAgU2JBdWRpb1NpbmtQcml2YXRlOjpTZXRQcmltYXJ5VHlwZShhbHNhX2F1ZGlvX3NpbmtfdHlwZV8pOwogfQogCiAvLyBzdGF0aWMKLXZvaWQgU2JBdWRpb1NpbmtQcml2YXRlOjpQbGF0Zm9ybVRlYXJEb3duKCkgewotICBTQl9EQ0hFQ0soYWxzYV9hdWRpb19zaW5rX3R5cGVfID09IEdldFByaW1hcnlUeXBlKCkpOwotICBTZXRQcmltYXJ5VHlwZShOVUxMKTsKK3ZvaWQgUGxhdGZvcm1UZWFyRG93bigpIHsKKyAgU0JfRENIRUNLKGFsc2FfYXVkaW9fc2lua190eXBlXyk7CisgIFNCX0RDSEVDSyhhbHNhX2F1ZGlvX3NpbmtfdHlwZV8gPT0gU2JBdWRpb1NpbmtQcml2YXRlOjpHZXRQcmltYXJ5VHlwZSgpKTsKKworICBTYkF1ZGlvU2lua1ByaXZhdGU6OlNldFByaW1hcnlUeXBlKE5VTEwpOwogICBkZWxldGUgYWxzYV9hdWRpb19zaW5rX3R5cGVfOwogICBhbHNhX2F1ZGlvX3NpbmtfdHlwZV8gPSBOVUxMOwogfQorCit9ICAvLyBuYW1lc3BhY2UgYWxzYQorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5oCmluZGV4IGM5OWZiNDMuLjgxNjJiNmUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2Fsc2FfYXVkaW9fc2lua190eXBlLmgKQEAgLTE1LDkgKzE1LDYgQEAKICNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9BTFNBX0FMU0FfQVVESU9fU0lOS19UWVBFX0hfCiAjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfQUxTQV9BTFNBX0FVRElPX1NJTktfVFlQRV9IXwogCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F1ZGlvX3NpbmsuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaW50ZXJuYWwuaCIKIApAQCAtMjUsMzEgKzIyLDggQEAKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIGFsc2EgewogCi1jbGFzcyBBbHNhQXVkaW9TaW5rVHlwZSA6IHB1YmxpYyBTYkF1ZGlvU2lua1ByaXZhdGU6OlR5cGUgewotIHB1YmxpYzoKLSAgU2JBdWRpb1NpbmsgQ3JlYXRlKAotICAgICAgaW50IGNoYW5uZWxzLAotICAgICAgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiwKLSAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgYXVkaW9fc2FtcGxlX3R5cGUsCi0gICAgICBTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlIGF1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZSwKLSAgICAgIFNiQXVkaW9TaW5rRnJhbWVCdWZmZXJzIGZyYW1lX2J1ZmZlcnMsCi0gICAgICBpbnQgZnJhbWVzX3Blcl9jaGFubmVsLAotICAgICAgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsCi0gICAgICBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVzX2Z1bmMsCi0gICAgICB2b2lkKiBjb250ZXh0KTsKLQotICBib29sIElzVmFsaWQoU2JBdWRpb1NpbmsgYXVkaW9fc2luaykgb3ZlcnJpZGUgewotICAgIHJldHVybiBhdWRpb19zaW5rICE9IGtTYkF1ZGlvU2lua0ludmFsaWQgJiYgYXVkaW9fc2luay0+SXNUeXBlKHRoaXMpOwotICB9Ci0KLSAgdm9pZCBEZXN0cm95KFNiQXVkaW9TaW5rIGF1ZGlvX3NpbmspIG92ZXJyaWRlIHsKLSAgICBpZiAoYXVkaW9fc2luayAhPSBrU2JBdWRpb1NpbmtJbnZhbGlkICYmICFJc1ZhbGlkKGF1ZGlvX3NpbmspKSB7Ci0gICAgICBTQl9MT0coV0FSTklORykgPDwgImF1ZGlvX3NpbmsgaXMgaW52YWxpZC4iOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWxldGUgYXVkaW9fc2luazsKLSAgfQotfTsKK3ZvaWQgUGxhdGZvcm1Jbml0aWFsaXplKCk7Cit2b2lkIFBsYXRmb3JtVGVhckRvd24oKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFsc2EKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfYXVkaW9fZGVjb2Rlcl9pbXBsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyX2ltcGwuY2MKaW5kZXggYjYyZjAyZC4uMzA5ZDZiMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyX2ltcGwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyX2ltcGwuY2MKQEAgLTE4LDYgKzE4LDkgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfYXVkaW9fZGVjb2Rlcl9pbXBsLmgiCiAKICNpbmNsdWRlICJzdGFyYm9hcmQvYXVkaW9fc2luay5oIgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OCisjaW5jbHVkZSAic3RhcmJvYXJkL2Zvcm1hdF9zdHJpbmcuaCIKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTU9WRV9GT1JNQVRfU1RSSU5HX1ZFUlNJT04KICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX3V0aWwuaCIKQEAgLTQwLDYgKzQzLDEyIEBACiAgIHN3aXRjaCAoYXVkaW9fY29kZWMpIHsKICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RlY0FhYzoKICAgICAgIHJldHVybiBBVl9DT0RFQ19JRF9BQUM7CisjaWYgU0JfSEFTKEFDM19BVURJTykKKyAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RlY0FjMzoKKyAgICAgIHJldHVybiBBVl9DT0RFQ19JRF9BQzM7CisgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29kZWNFYWMzOgorICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX0VBQzM7CisjZW5kaWYgIC8vIFNCX0hBUyhBQzNfQVVESU8pCiAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzOgogICAgICAgcmV0dXJuIEFWX0NPREVDX0lEX09QVVM7CiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlcl9pbXBsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyX2ltcGwuY2MKaW5kZXggZTYwZmU0Ny4uNzRjOTRmOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyX2ltcGwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyX2ltcGwuY2MKQEAgLTE3LDYgKzE3LDkgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyX2ltcGwuaCIKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OCisjaW5jbHVkZSAic3RhcmJvYXJkL2Zvcm1hdF9zdHJpbmcuaCIKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTU9WRV9GT1JNQVRfU1RSSU5HX1ZFUlNJT04KICNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgvc2hhcmVkL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGliYW9tL2FvbV92aWRlb19kZWNvZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGliYW9tL2FvbV92aWRlb19kZWNvZGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzNiODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJhb20vYW9tX3ZpZGVvX2RlY29kZXIuY2MKQEAgLTAsMCArMSwzMDMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvbGliYW9tL2FvbV92aWRlb19kZWNvZGVyLmgiCisKKyNpbmNsdWRlIDxhb20vYW9tX2RlY29kZXIuaD4KKyNpbmNsdWRlIDxhb20vYW9tZHguaD4KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OCisjaW5jbHVkZSAic3RhcmJvYXJkL2Zvcm1hdF9zdHJpbmcuaCIKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTU9WRV9GT1JNQVRfU1RSSU5HX1ZFUlNJT04KKyNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgvc2hhcmVkL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIGFvbSB7CisKK3VzaW5nIHN0YXJib2FyZDo6cGxheWVyOjpKb2JUaHJlYWQ7CisKK1ZpZGVvRGVjb2Rlcjo6VmlkZW9EZWNvZGVyKFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlcioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIpCisgICAgOiBjdXJyZW50X2ZyYW1lX3dpZHRoXygwKSwKKyAgICAgIGN1cnJlbnRfZnJhbWVfaGVpZ2h0XygwKSwKKyAgICAgIHN0cmVhbV9lbmRlZF8oZmFsc2UpLAorICAgICAgZXJyb3Jfb2NjdXJlZF8oZmFsc2UpLAorICAgICAgb3V0cHV0X21vZGVfKG91dHB1dF9tb2RlKSwKKyAgICAgIGRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8oCisgICAgICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKSwKKyAgICAgIGRlY29kZV90YXJnZXRfKGtTYkRlY29kZVRhcmdldEludmFsaWQpIHsKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0hBU19BVjFfVkVSU0lPTgorICBTQl9EQ0hFQ0sodmlkZW9fY29kZWMgPT0ga1NiTWVkaWFWaWRlb0NvZGVjVnAxMCk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfSEFTX0FWMV9WRVJTSU9OCisgIFNCX0RDSEVDSyh2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNBdjEpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0hBU19BVjFfVkVSU0lPTgorfQorCitWaWRlb0RlY29kZXI6On5WaWRlb0RlY29kZXIoKSB7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBSZXNldCgpOworfQorCit2b2lkIFZpZGVvRGVjb2Rlcjo6SW5pdGlhbGl6ZShjb25zdCBEZWNvZGVyU3RhdHVzQ0ImIGRlY29kZXJfc3RhdHVzX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IpIHsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIFNCX0RDSEVDSyhkZWNvZGVyX3N0YXR1c19jYik7CisgIFNCX0RDSEVDSyghZGVjb2Rlcl9zdGF0dXNfY2JfKTsKKyAgU0JfRENIRUNLKGVycm9yX2NiKTsKKyAgU0JfRENIRUNLKCFlcnJvcl9jYl8pOworCisgIGRlY29kZXJfc3RhdHVzX2NiXyA9IGRlY29kZXJfc3RhdHVzX2NiOworICBlcnJvcl9jYl8gPSBlcnJvcl9jYjsKK30KKwordm9pZCBWaWRlb0RlY29kZXI6OldyaXRlSW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGlucHV0X2J1ZmZlcikgeworICBTQl9EQ0hFQ0soQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKGlucHV0X2J1ZmZlcik7CisgIFNCX0RDSEVDSyhkZWNvZGVyX3N0YXR1c19jYl8pOworCisgIGlmIChzdHJlYW1fZW5kZWRfKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiV3JpdGVJbnB1dEZyYW1lKCkgd2FzIGNhbGxlZCBhZnRlciBXcml0ZUVuZE9mU3RyZWFtKCkuIjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIWRlY29kZXJfdGhyZWFkXykgeworICAgIGRlY29kZXJfdGhyZWFkXy5yZXNldChuZXcgSm9iVGhyZWFkKCJhb21fdmlkZW9fZGVjb2RlciIpKTsKKyAgICBTQl9EQ0hFQ0soZGVjb2Rlcl90aHJlYWRfKTsKKyAgfQorCisgIGRlY29kZXJfdGhyZWFkXy0+am9iX3F1ZXVlKCktPlNjaGVkdWxlKAorICAgICAgc3RkOjpiaW5kKCZWaWRlb0RlY29kZXI6OkRlY29kZU9uZUJ1ZmZlciwgdGhpcywgaW5wdXRfYnVmZmVyKSk7Cit9CisKK3ZvaWQgVmlkZW9EZWNvZGVyOjpXcml0ZUVuZE9mU3RyZWFtKCkgeworICBTQl9EQ0hFQ0soQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKGRlY29kZXJfc3RhdHVzX2NiXyk7CisKKyAgLy8gV2UgaGF2ZSB0byBmbHVzaCB0aGUgZGVjb2RlciB0byBkZWNvZGUgdGhlIHJlc3QgZnJhbWVzIGFuZCB0byBlbnN1cmUgdGhhdAorICAvLyBEZWNvZGUoKSBpcyBub3QgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBlbmRlZC4KKyAgc3RyZWFtX2VuZGVkXyA9IHRydWU7CisKKyAgaWYgKCFkZWNvZGVyX3RocmVhZF8pIHsKKyAgICAvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIFdyaXRlSW5wdXRCdWZmZXIoKSBjYWxsIGJlZm9yZSBXcml0ZUVuZE9mU3RyZWFtKCksCisgICAgLy8gZG9uJ3QgY3JlYXRlIHRoZSBkZWNvZGVyIHRocmVhZCBhbmQgc2VuZCB0aGUgRU9TIGZyYW1lIGRpcmVjdGx5LgorICAgIGRlY29kZXJfc3RhdHVzX2NiXyhrQnVmZmVyRnVsbCwgVmlkZW9GcmFtZTo6Q3JlYXRlRU9TRnJhbWUoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgZGVjb2Rlcl90aHJlYWRfLT5qb2JfcXVldWUoKS0+U2NoZWR1bGUoCisgICAgICBzdGQ6OmJpbmQoJlZpZGVvRGVjb2Rlcjo6RGVjb2RlRW5kT2ZTdHJlYW0sIHRoaXMpKTsKK30KKwordm9pZCBWaWRlb0RlY29kZXI6OlJlc2V0KCkgeworICBTQl9EQ0hFQ0soQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKworICBpZiAoZGVjb2Rlcl90aHJlYWRfKSB7CisgICAgZGVjb2Rlcl90aHJlYWRfLT5qb2JfcXVldWUoKS0+U2NoZWR1bGUoCisgICAgICAgIHN0ZDo6YmluZCgmVmlkZW9EZWNvZGVyOjpUZWFyZG93bkNvZGVjLCB0aGlzKSk7CisKKyAgICAvLyBKb2luIHRoZSB0aHJlYWQgdG8gZW5zdXJlIHRoYXQgYWxsIGNhbGxiYWNrcyBpbiBwcm9jZXNzIGFyZSBmaW5pc2hlZC4KKyAgICBkZWNvZGVyX3RocmVhZF8ucmVzZXQoKTsKKyAgfQorCisgIGVycm9yX29jY3VyZWRfID0gZmFsc2U7CisgIHN0cmVhbV9lbmRlZF8gPSBmYWxzZTsKKworICBDYW5jZWxQZW5kaW5nSm9icygpOworCisgIFNjb3BlZExvY2sgbG9jayhkZWNvZGVfdGFyZ2V0X211dGV4Xyk7CisgIGZyYW1lc18gPSBzdGQ6OnF1ZXVlPHNjb3BlZF9yZWZwdHI8Q3B1VmlkZW9GcmFtZT4+KCk7Cit9CisKK3ZvaWQgVmlkZW9EZWNvZGVyOjpVcGRhdGVEZWNvZGVUYXJnZXRfTG9ja2VkKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Q3B1VmlkZW9GcmFtZT4mIGZyYW1lKSB7CisgIFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQgPSBEZWNvZGVUYXJnZXRDcmVhdGUoCisgICAgICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLCBmcmFtZSwgZGVjb2RlX3RhcmdldF8pOworCisgIC8vIExvY2sgb25seSBhZnRlciB0aGUgcG9zdCB0byB0aGUgcmVuZGVyZXIgdGhyZWFkLCB0byBwcmV2ZW50IGRlYWRsb2NrLgorICBkZWNvZGVfdGFyZ2V0XyA9IGRlY29kZV90YXJnZXQ7CisKKyAgaWYgKCFTYkRlY29kZVRhcmdldElzVmFsaWQoZGVjb2RlX3RhcmdldCkpIHsKKyAgICBTQl9MT0coRVJST1IpIDw8ICJDb3VsZCBub3QgYWNxdWlyZSBhIGRlY29kZSB0YXJnZXQgZnJvbSBwcm92aWRlci4iOworICB9Cit9CisKK3ZvaWQgVmlkZW9EZWNvZGVyOjpSZXBvcnRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgeworICBTQl9EQ0hFQ0soZGVjb2Rlcl90aHJlYWRfLT5qb2JfcXVldWUoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKworICBlcnJvcl9vY2N1cmVkXyA9IHRydWU7CisjaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQorICBTY2hlZHVsZShzdGQ6OmJpbmQoZXJyb3JfY2JfLCBrU2JQbGF5ZXJFcnJvckRlY29kZSwgZXJyb3JfbWVzc2FnZSkpOworI2Vsc2UgICAvLyBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCisgIFNjaGVkdWxlKGVycm9yX2NiXyk7CisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKK30KKwordm9pZCBWaWRlb0RlY29kZXI6OkluaXRpYWxpemVDb2RlYygpIHsKKyAgU0JfRENIRUNLKGRlY29kZXJfdGhyZWFkXy0+am9iX3F1ZXVlKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgYW9tX2NvZGVjX2RlY19jZmdfdCBhb21fY29uZmlnID0gezB9OworICBhb21fY29uZmlnLmFsbG93X2xvd2JpdGRlcHRoID0gMTsKKworICBjb250ZXh0Xy5yZXNldChuZXcgYW9tX2NvZGVjX2N0eF90KCkpOworICBhb21fY29kZWNfZXJyX3Qgc3RhdHVzID0KKyAgICAgIGFvbV9jb2RlY19kZWNfaW5pdChjb250ZXh0Xy5nZXQoKSwgYW9tX2NvZGVjX2F2MV9keCgpLCAmYW9tX2NvbmZpZywgMCk7CisgIGlmIChzdGF0dXMgIT0gQU9NX0NPREVDX09LKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiYW9tX2NvZGVjX2RlY19pbml0KCkgZmFpbGVkIHdpdGggIiA8PCBzdGF0dXM7CisgICAgUmVwb3J0RXJyb3IoCisgICAgICAgIEZvcm1hdFN0cmluZygiYW9tX2NvZGVjX2RlY19pbml0KCkgZmFpbGVkIHdpdGggc3RhdHVzICVkLiIsIHN0YXR1cykpOworICAgIGNvbnRleHRfLnJlc2V0KCk7CisgIH0KK30KKwordm9pZCBWaWRlb0RlY29kZXI6OlRlYXJkb3duQ29kZWMoKSB7CisgIFNCX0RDSEVDSyhkZWNvZGVyX3RocmVhZF8tPmpvYl9xdWV1ZSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGlmIChjb250ZXh0XykgeworICAgIGFvbV9jb2RlY19kZXN0cm95KGNvbnRleHRfLmdldCgpKTsKKyAgICBjb250ZXh0Xy5yZXNldCgpOworICB9CisKKyAgaWYgKG91dHB1dF9tb2RlXyA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlKSB7CisgICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldF90b19yZWxlYXNlOworICAgIHsKKyAgICAgIFNjb3BlZExvY2sgbG9jayhkZWNvZGVfdGFyZ2V0X211dGV4Xyk7CisgICAgICBkZWNvZGVfdGFyZ2V0X3RvX3JlbGVhc2UgPSBkZWNvZGVfdGFyZ2V0XzsKKyAgICAgIGRlY29kZV90YXJnZXRfID0ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKKyAgICB9CisKKyAgICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXRfdG9fcmVsZWFzZSkpIHsKKyAgICAgIERlY29kZVRhcmdldFJlbGVhc2UoZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3RhcmdldF90b19yZWxlYXNlKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBWaWRlb0RlY29kZXI6OkRlY29kZU9uZUJ1ZmZlcigKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiYgaW5wdXRfYnVmZmVyKSB7CisgIFNCX0RDSEVDSyhkZWNvZGVyX3RocmVhZF8tPmpvYl9xdWV1ZSgpLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIFNCX0RDSEVDSyhpbnB1dF9idWZmZXIpOworICBjb25zdCBTYk1lZGlhVmlkZW9TYW1wbGVJbmZvKiBzYW1wbGVfaW5mbyA9IGlucHV0X2J1ZmZlci0+dmlkZW9fc2FtcGxlX2luZm8oKTsKKyAgU0JfRENIRUNLKHNhbXBsZV9pbmZvKTsKKyAgaWYgKCFjb250ZXh0XyB8fCBzYW1wbGVfaW5mby0+ZnJhbWVfd2lkdGggIT0gY3VycmVudF9mcmFtZV93aWR0aF8gfHwKKyAgICAgIHNhbXBsZV9pbmZvLT5mcmFtZV9oZWlnaHQgIT0gY3VycmVudF9mcmFtZV9oZWlnaHRfKSB7CisgICAgY3VycmVudF9mcmFtZV93aWR0aF8gPSBzYW1wbGVfaW5mby0+ZnJhbWVfd2lkdGg7CisgICAgY3VycmVudF9mcmFtZV9oZWlnaHRfID0gc2FtcGxlX2luZm8tPmZyYW1lX2hlaWdodDsKKyAgICBUZWFyZG93bkNvZGVjKCk7CisgICAgSW5pdGlhbGl6ZUNvZGVjKCk7CisgIH0KKworICBTQl9EQ0hFQ0soY29udGV4dF8pOworCisgIFNiVGltZSB0aW1lc3RhbXAgPSBpbnB1dF9idWZmZXItPnRpbWVzdGFtcCgpOworICBhb21fY29kZWNfZXJyX3Qgc3RhdHVzID0gYW9tX2NvZGVjX2RlY29kZSgKKyAgICAgIGNvbnRleHRfLmdldCgpLCBpbnB1dF9idWZmZXItPmRhdGEoKSwgaW5wdXRfYnVmZmVyLT5zaXplKCksICZ0aW1lc3RhbXApOworICBpZiAoc3RhdHVzICE9IEFPTV9DT0RFQ19PSykgeworICAgIFNCX0RMT0coRVJST1IpIDw8ICJhb21fY29kZWNfZGVjb2RlKCkgZmFpbGVkLCBzdGF0dXM9IiA8PCBzdGF0dXM7CisgICAgUmVwb3J0RXJyb3IoCisgICAgICAgIEZvcm1hdFN0cmluZygiYW9tX2NvZGVjX2RlY29kZSgpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZC4iLCBzdGF0dXMpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBHZXRzIHBvaW50ZXIgdG8gZGVjb2RlZCBkYXRhLgorICBhb21fY29kZWNfaXRlcl90IGR1bW15ID0gTlVMTDsKKyAgY29uc3QgYW9tX2ltYWdlX3QqIGFvbV9pbWFnZSA9IGFvbV9jb2RlY19nZXRfZnJhbWUoY29udGV4dF8uZ2V0KCksICZkdW1teSk7CisgIGlmICghYW9tX2ltYWdlKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGFvbV9pbWFnZS0+dXNlcl9wcml2ICE9ICZ0aW1lc3RhbXApIHsKKyAgICBTQl9ETE9HKEVSUk9SKSA8PCAiSW52YWxpZCBvdXRwdXQgdGltZXN0YW1wLiI7CisgICAgUmVwb3J0RXJyb3IoIkludmFsaWQgb3V0cHV0IHRpbWVzdGFtcC4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYW9tX2ltYWdlLT5mbXQgIT0gQU9NX0lNR19GTVRfWVYxMikgeworICAgIFNCX0RDSEVDSyhhb21faW1hZ2UtPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwKQorICAgICAgICA8PCAiSW52YWxpZCBhb21faW1hZ2UtPmZtdDogIiA8PCBhb21faW1hZ2UtPmZtdDsKKyAgICBpZiAoYW9tX2ltYWdlLT5mbXQgIT0gQU9NX0lNR19GTVRfSTQyMCkgeworICAgICAgUmVwb3J0RXJyb3IoRm9ybWF0U3RyaW5nKCJJbnZhbGlkIGFvbV9pbWFnZS0+Zm10OiAlZC4iLCBhb21faW1hZ2UtPmZtdCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIFNCX0RDSEVDSyhhb21faW1hZ2UtPnN0cmlkZVtBT01fUExBTkVfWV0gPT0KKyAgICAgICAgICAgIGFvbV9pbWFnZS0+c3RyaWRlW0FPTV9QTEFORV9VXSAqIDIpOworICBTQl9EQ0hFQ0soYW9tX2ltYWdlLT5zdHJpZGVbQU9NX1BMQU5FX1VdID09IGFvbV9pbWFnZS0+c3RyaWRlW0FPTV9QTEFORV9WXSk7CisgIFNCX0RDSEVDSyhhb21faW1hZ2UtPnBsYW5lc1tBT01fUExBTkVfWV0gPCBhb21faW1hZ2UtPnBsYW5lc1tBT01fUExBTkVfVV0pOworICBTQl9EQ0hFQ0soYW9tX2ltYWdlLT5wbGFuZXNbQU9NX1BMQU5FX1VdIDwgYW9tX2ltYWdlLT5wbGFuZXNbQU9NX1BMQU5FX1ZdKTsKKworICBpZiAoYW9tX2ltYWdlLT5zdHJpZGVbQU9NX1BMQU5FX1ldICE9IGFvbV9pbWFnZS0+c3RyaWRlW0FPTV9QTEFORV9VXSAqIDIgfHwKKyAgICAgIGFvbV9pbWFnZS0+c3RyaWRlW0FPTV9QTEFORV9VXSAhPSBhb21faW1hZ2UtPnN0cmlkZVtBT01fUExBTkVfVl0gfHwKKyAgICAgIGFvbV9pbWFnZS0+cGxhbmVzW0FPTV9QTEFORV9ZXSA+PSBhb21faW1hZ2UtPnBsYW5lc1tBT01fUExBTkVfVV0gfHwKKyAgICAgIGFvbV9pbWFnZS0+cGxhbmVzW0FPTV9QTEFORV9VXSA+PSBhb21faW1hZ2UtPnBsYW5lc1tBT01fUExBTkVfVl0pIHsKKyAgICBSZXBvcnRFcnJvcigiSW52YWxpZCB5dXYgcGxhbmUgZm9ybWF0LiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIENyZWF0ZSBhIFZpZGVvRnJhbWUgZnJvbSBkZWNvZGVkIGZyYW1lIGRhdGEuIFRoZSBkYXRhIGlzIGluIFlWMTIgZm9ybWF0LgorICAvLyBFYWNoIGNvbXBvbmVudCBvZiBhIHBpeGVsIHRha2VzIG9uZSBieXRlIGFuZCB0aGV5IGFyZSBpbiB0aGVpciBvd24gcGxhbmVzLgorICAvLyBVViBwbGFuZXMgaGF2ZSBoYWxmIHJlc29sdXRpb24gYm90aCB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHkuCisgIHNjb3BlZF9yZWZwdHI8Q3B1VmlkZW9GcmFtZT4gZnJhbWUgPSBDcHVWaWRlb0ZyYW1lOjpDcmVhdGVZVjEyRnJhbWUoCisgICAgICBjdXJyZW50X2ZyYW1lX3dpZHRoXywgY3VycmVudF9mcmFtZV9oZWlnaHRfLAorICAgICAgYW9tX2ltYWdlLT5zdHJpZGVbQU9NX1BMQU5FX1ldLCB0aW1lc3RhbXAsIGFvbV9pbWFnZS0+cGxhbmVzW0FPTV9QTEFORV9ZXSwKKyAgICAgIGFvbV9pbWFnZS0+cGxhbmVzW0FPTV9QTEFORV9VXSwgYW9tX2ltYWdlLT5wbGFuZXNbQU9NX1BMQU5FX1ZdKTsKKyAgaWYgKG91dHB1dF9tb2RlXyA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlKSB7CisgICAgU2NvcGVkTG9jayBsb2NrKGRlY29kZV90YXJnZXRfbXV0ZXhfKTsKKyAgICBmcmFtZXNfLnB1c2goZnJhbWUpOworICB9CisKKyAgU2NoZWR1bGUoc3RkOjpiaW5kKGRlY29kZXJfc3RhdHVzX2NiXywga05lZWRNb3JlSW5wdXQsIGZyYW1lKSk7Cit9CisKK3ZvaWQgVmlkZW9EZWNvZGVyOjpEZWNvZGVFbmRPZlN0cmVhbSgpIHsKKyAgU0JfRENIRUNLKGRlY29kZXJfdGhyZWFkXy0+am9iX3F1ZXVlKCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgLy8gVE9ETzogRmx1c2ggdGhlIGZyYW1lcyBpbnNpZGUgdGhlIGRlY29kZXIsIHRob3VnaCB0aGlzIGlzIG5vdCByZXF1aXJlZAorICAvLyAgICAgICBmb3IgdnA5IGluIG1vc3QgY2FzZXMuCisgIFNjaGVkdWxlKAorICAgICAgc3RkOjpiaW5kKGRlY29kZXJfc3RhdHVzX2NiXywga0J1ZmZlckZ1bGwsIFZpZGVvRnJhbWU6OkNyZWF0ZUVPU0ZyYW1lKCkpKTsKK30KKworLy8gV2hlbiBpbiBkZWNvZGUtdG8tdGV4dHVyZSBtb2RlLCB0aGlzIHJldHVybnMgdGhlIGN1cnJlbnQgZGVjb2RlZCB2aWRlbyBmcmFtZS4KK1NiRGVjb2RlVGFyZ2V0IFZpZGVvRGVjb2Rlcjo6R2V0Q3VycmVudERlY29kZVRhcmdldCgpIHsKKyAgU0JfRENIRUNLKG91dHB1dF9tb2RlXyA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlKTsKKworICAvLyBXZSBtdXN0IHRha2UgYSBsb2NrIGhlcmUgc2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYQorICAvLyBzZXBhcmF0ZSB0aHJlYWQuCisgIFNjb3BlZExvY2sgbG9jayhkZWNvZGVfdGFyZ2V0X211dGV4Xyk7CisgIHdoaWxlIChmcmFtZXNfLnNpemUoKSA+IDEgJiYgZnJhbWVzXy5mcm9udCgpLT5IYXNPbmVSZWYoKSkgeworICAgIGZyYW1lc18ucG9wKCk7CisgIH0KKyAgaWYgKCFmcmFtZXNfLmVtcHR5KCkpIHsKKyAgICBVcGRhdGVEZWNvZGVUYXJnZXRfTG9ja2VkKGZyYW1lc18uZnJvbnQoKSk7CisgIH0KKyAgaWYgKFNiRGVjb2RlVGFyZ2V0SXNWYWxpZChkZWNvZGVfdGFyZ2V0XykpIHsKKyAgICAvLyBNYWtlIGEgZGlzcG9zYWJsZSBjb3B5LCBzaW5jZSB0aGUgc3RhdGUgaXMgaW50ZXJuYWxseSByZXVzZWQgYnkgdGhpcworICAgIC8vIGNsYXNzICh0byBhdm9pZCByZWNyZWF0aW5nIEdMIG9iamVjdHMpLgorICAgIHJldHVybiBEZWNvZGVUYXJnZXRDb3B5KGRlY29kZV90YXJnZXRfKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW9tCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJhb20vYW9tX3ZpZGVvX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpYmFvbS9hb21fdmlkZW9fZGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjFjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJhb20vYW9tX3ZpZGVvX2RlY29kZXIuaApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfTElCQU9NX0FPTV9WSURFT19ERUNPREVSX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfTElCQU9NX0FPTV9WSURFT19ERUNPREVSX0hfCisKKyNpbmNsdWRlIDxhb20vYW9tX2NvZGVjLmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9jcHVfdmlkZW9fZnJhbWUuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfdGhyZWFkLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2UgYW9tIHsKKworY2xhc3MgVmlkZW9EZWNvZGVyIDogcHVibGljIHN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc3RhcmJvYXJkOjpwbGF5ZXI6OkpvYlF1ZXVlOjpKb2JPd25lciB7CisgcHVibGljOgorICBWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCisgICAgICAgICAgICAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCisgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgorICAgICAgICAgICAgICAgICAgIGRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcik7CisgIH5WaWRlb0RlY29kZXIoKSBvdmVycmlkZTsKKworICB2b2lkIEluaXRpYWxpemUoY29uc3QgRGVjb2RlclN0YXR1c0NCJiBkZWNvZGVyX3N0YXR1c19jYiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEVycm9yQ0ImIGVycm9yX2NiKSBvdmVycmlkZTsKKyAgc2l6ZV90IEdldFByZXJvbGxGcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gODsgfQorICBTYlRpbWUgR2V0UHJlcm9sbFRpbWVvdXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBrU2JUaW1lTWF4OyB9CisgIHNpemVfdCBHZXRNYXhOdW1iZXJPZkNhY2hlZEZyYW1lcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDEyOyB9CisKKyAgdm9pZCBXcml0ZUlucHV0QnVmZmVyKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGlucHV0X2J1ZmZlcikgb3ZlcnJpZGU7CisgIHZvaWQgV3JpdGVFbmRPZlN0cmVhbSgpIG92ZXJyaWRlOworICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OkNwdVZpZGVvRnJhbWUKKyAgICAgIENwdVZpZGVvRnJhbWU7CisKKyAgdm9pZCBSZXBvcnRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSk7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBmb3VyIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgb24gdGhlIGRlY29kZXIgdGhyZWFkIGV4Y2VwdAorICAvLyB0aGF0IFRlYXJkb3duQ29kZWMoKSBjYW4gYWxzbyBiZSBjYWxsZWQgb24gb3RoZXIgdGhyZWFkcyB3aGVuIHRoZSBkZWNvZGVyCisgIC8vIHRocmVhZCBpcyBub3QgcnVubmluZy4KKyAgdm9pZCBJbml0aWFsaXplQ29kZWMoKTsKKyAgdm9pZCBUZWFyZG93bkNvZGVjKCk7CisgIHZvaWQgRGVjb2RlT25lQnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIpOworICB2b2lkIERlY29kZUVuZE9mU3RyZWFtKCk7CisKKyAgU2JEZWNvZGVUYXJnZXQgR2V0Q3VycmVudERlY29kZVRhcmdldCgpIG92ZXJyaWRlOworCisgIHZvaWQgVXBkYXRlRGVjb2RlVGFyZ2V0X0xvY2tlZChjb25zdCBzY29wZWRfcmVmcHRyPENwdVZpZGVvRnJhbWU+JiBmcmFtZSk7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBjYWxsYmFja3Mgd2lsbCBiZSBpbml0aWFsaXplZCBpbiBJbml0aWFsaXplKCkgYW5kIHdvbid0IGJlCisgIC8vIGNoYW5nZWQgZHVyaW5nIHRoZSBsaWZlIHRpbWUgb2YgdGhpcyBjbGFzcy4KKyAgRGVjb2RlclN0YXR1c0NCIGRlY29kZXJfc3RhdHVzX2NiXzsKKyAgRXJyb3JDQiBlcnJvcl9jYl87CisKKyAgaW50IGN1cnJlbnRfZnJhbWVfd2lkdGhfOworICBpbnQgY3VycmVudF9mcmFtZV9oZWlnaHRfOworICBzY29wZWRfcHRyPGFvbV9jb2RlY19jdHhfdD4gY29udGV4dF87CisKKyAgYm9vbCBzdHJlYW1fZW5kZWRfOworICBib29sIGVycm9yX29jY3VyZWRfOworCisgIC8vIFdvcmtpbmcgdGhyZWFkIHRvIGF2b2lkIGxlbmd0aHkgZGVjb2Rpbmcgd29yayBibG9jayB0aGUgcGxheWVyIHRocmVhZC4KKyAgc2NvcGVkX3B0cjxzdGFyYm9hcmQ6OnBsYXllcjo6Sm9iVGhyZWFkPiBkZWNvZGVyX3RocmVhZF87CisKKyAgLy8gRGVjb2RlLXRvLXRleHR1cmUgcmVsYXRlZCBzdGF0ZS4KKyAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlXzsKKworICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgorICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXzsKKworICAvLyBJZiBkZWNvZGUtdG8tdGV4dHVyZSBpcyBlbmFibGVkLCB0aGVuIHdlIHN0b3JlIHRoZSBkZWNvZGUgdGFyZ2V0IHRleHR1cmUKKyAgLy8gaW5zaWRlIG9mIHRoaXMgfGRlY29kZV90YXJnZXRffCBtZW1iZXIuCisgIFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXRfOworCisgIC8vIEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSBuZWVkcyB0byBiZSBjYWxsZWQgZnJvbSBhbiBhcmJpdHJhcnkgdGhyZWFkCisgIC8vIHRvIG9idGFpbiB0aGUgY3VycmVudCBkZWNvZGUgdGFyZ2V0ICh3aGljaCB1bHRpbWF0ZWx5IGVuZHMgdXAgYmVpbmcgYQorICAvLyBjb3B5IG9mIHxkZWNvZGVfdGFyZ2V0X3wpLCB3ZSBuZWVkIHRvIHNhZmUtZ3VhcmQgYWNjZXNzIHRvIHxkZWNvZGVfdGFyZ2V0X3wKKyAgLy8gYW5kIHdlIGRvIHNvIHRocm91Z2ggdGhpcyBtdXRleC4KKyAgTXV0ZXggZGVjb2RlX3RhcmdldF9tdXRleF87CisKKyAgc3RkOjpxdWV1ZTxzY29wZWRfcmVmcHRyPENwdVZpZGVvRnJhbWU+PiBmcmFtZXNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvbQorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfTElCQU9NX0FPTV9WSURFT19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuY2MKaW5kZXggM2I5YmIxYS4uMjY3MjNiMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGlidnB4L3ZweF92aWRlb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpYnZweC92cHhfdmlkZW9fZGVjb2Rlci5jYwpAQCAtMTQsNiArMTQsOSBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuaCIKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OCisjaW5jbHVkZSAic3RhcmJvYXJkL2Zvcm1hdF9zdHJpbmcuaCIKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfTU9WRV9GT1JNQVRfU1RSSU5HX1ZFUlNJT04KICNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgvc2hhcmVkL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGlidnB4L3ZweF92aWRlb19kZWNvZGVyLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuaAppbmRleCAyYWVjNTI1Li4wMGJjMTY2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saWJ2cHgvdnB4X3ZpZGVvX2RlY29kZXIuaApAQCAtMTUsNiArMTUsOSBAQAogI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX0xJQlZQWF9WUFhfVklERU9fREVDT0RFUl9IXwogI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX0xJQlZQWF9WUFhfVklERU9fREVDT0RFUl9IXwogCisjaW5jbHVkZSA8dnB4L3ZwOGR4Lmg+CisjaW5jbHVkZSA8dnB4L3ZweF9kZWNvZGVyLmg+CisKICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKQEAgLTMwLDEwICszMyw2IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl90aHJlYWQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCiAKLSNkZWZpbmUgVlBYX0NPREVDX0RJU0FCTEVfQ09NUEFUIDEKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ2cHgvdnB4L3ZwOGR4LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbGlidnB4L3ZweC92cHhfZGVjb2Rlci5oIgotCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIHZweCB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9vcHVzL29wdXNfYXVkaW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmNjCmluZGV4IDg1MGVkYjMuLmEzZWZjNjMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmNjCkBAIC0xNCw2ICsxNCw5IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL29wdXMvb3B1c19hdWRpb19kZWNvZGVyLmgiCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NT1ZFX0ZPUk1BVF9TVFJJTkdfVkVSU0lPTgorI2luY2x1ZGUgInN0YXJib2FyZC9mb3JtYXRfc3RyaW5nLmgiCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV91dGlsLmgiCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wb3NpeC9pbXBsL2ZpbGVfb3Blbi5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvcG9zaXgvaW1wbC9maWxlX29wZW4uaAppbmRleCA4YmNkNDg0Li4xZTIwZGMxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wb3NpeC9pbXBsL2ZpbGVfb3Blbi5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3Bvc2l4L2ltcGwvZmlsZV9vcGVuLmgKQEAgLTEyNyw2ICsxMjcsMTEgQEAKICAgICAgICAgY2FzZSBFTk9URElSOgogICAgICAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlRXJyb3JOb3RBRGlyZWN0b3J5OwogICAgICAgICAgIGJyZWFrOworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0ZJTEVfRVJST1JfSU9fQVBJX1ZFUlNJT04KKyAgICAgICAgY2FzZSBFSU86CisgICAgICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvcklPOworICAgICAgICAgIGJyZWFrOworI2VuZGlmCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvckZhaWxlZDsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3Bvc2l4L3N0b3JhZ2Vfd3JpdGVfcmVjb3JkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvcG9zaXgvc3RvcmFnZV93cml0ZV9yZWNvcmQuY2MKaW5kZXggZGU0YmUxMi4uODhhY2JkYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvcG9zaXgvc3RvcmFnZV93cml0ZV9yZWNvcmQuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvcG9zaXgvc3RvcmFnZV93cml0ZV9yZWNvcmQuY2MKQEAgLTg2LDYgKzg2LDggQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorICBTYkZpbGVGbHVzaCh0ZW1wX2ZpbGUpOworCiAgIHJlY29yZC0+ZmlsZSA9IHRlbXBfZmlsZTsKIAogICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWY0YjYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvcHVsc2UvcHVsc2VfYXVkaW9fc2lua190eXBlLmNjCkBAIC0wLDAgKzEsNTU2IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5oIgorCisjaW5jbHVkZSA8cHVsc2UvcHVsc2VhdWRpby5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvYXRvbWljLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2F1ZGlvX3NpbmsuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9keW5hbWljX2xvYWRfZGlzcGF0Y2hlci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX3V0aWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHB1bHNlIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIHN0YXJib2FyZDo6bWVkaWE6OkdldEJ5dGVzUGVyU2FtcGxlOworCitjb25zdCBTYlRpbWUga0F1ZGlvSWRsZVNsZWVwSW50ZXJ2YWwgPSAxNSAqIGtTYlRpbWVNaWxsaXNlY29uZDsKK2NvbnN0IFNiVGltZSBrQXVkaW9SdW5uaW5nU2xlZXBJbnRlcnZhbCA9IDUgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7CisvLyBUaGUgbWluaW11bSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gUHVsc2Ugb25jZS4gQSBzbWFsbAorLy8gbnVtYmVyIHdpbGwgbGVhZCB0byBtb3JlIENQVSBiZWluZyB1c2VkIGFzIHRoZSBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgbW9yZQorLy8gZnJlcXVlbnRseS4KK2NvbnN0IHNpemVfdCBrRnJhbWVzUGVyUmVxdWVzdCA9IDUxMjsKKy8vIFRoZSBzaXplIG9mIHRoZSBhdWRpbyBidWZmZXIgUHVsc2UgYWxsb2NhdGVzIGludGVybmFsbHkuCitjb25zdCBzaXplX3Qga1B1bHNlQnVmZmVyU2l6ZUluRnJhbWVzID0gODE5MjsKKworY2xhc3MgUHVsc2VBdWRpb1NpbmtUeXBlOworCitjbGFzcyBQdWxzZUF1ZGlvU2luayA6IHB1YmxpYyBTYkF1ZGlvU2lua1ByaXZhdGUgeworIHB1YmxpYzoKKyAgUHVsc2VBdWRpb1NpbmsoUHVsc2VBdWRpb1NpbmtUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ19mcmVxdWVuY3lfaHosCisgICAgICAgICAgICAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCisgICAgICAgICAgICAgICAgIFNiQXVkaW9TaW5rRnJhbWVCdWZmZXJzIGZyYW1lX2J1ZmZlcnMsCisgICAgICAgICAgICAgICAgIGludCBmcmFtZXNfcGVyX2NoYW5uZWwsCisgICAgICAgICAgICAgICAgIFNiQXVkaW9TaW5rVXBkYXRlU291cmNlU3RhdHVzRnVuYyB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLAorICAgICAgICAgICAgICAgICBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVfZnVuYywKKyAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCk7CisgIH5QdWxzZUF1ZGlvU2luaygpIG92ZXJyaWRlOworCisgIGJvb2wgSXNUeXBlKFR5cGUqIHR5cGUpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBJbml0aWFsaXplKHBhX2NvbnRleHQqIGNvbnRleHQpOworICBib29sIFdyaXRlRnJhbWVJZk5lY2Vzc2FyeSgpOworCisgcHJpdmF0ZToKKyAgUHVsc2VBdWRpb1NpbmsoY29uc3QgUHVsc2VBdWRpb1NpbmsmKSA9IGRlbGV0ZTsKKyAgUHVsc2VBdWRpb1NpbmsmIG9wZXJhdG9yPShjb25zdCBQdWxzZUF1ZGlvU2luayYpID0gZGVsZXRlOworCisgIHN0YXRpYyB2b2lkIFJlcXVlc3RDYWxsYmFjayhwYV9zdHJlYW0qIHMsIHNpemVfdCBsZW5ndGgsIHZvaWQqIHVzZXJkYXRhKTsKKyAgdm9pZCBIYW5kbGVSZXF1ZXN0KHNpemVfdCBsZW5ndGgpOworCisgIHZvaWQgV3JpdGVGcmFtZXMoY29uc3QgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXNfdG9fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldF9pbl9mcmFtZXMpOworICB2b2lkIENvcmsoYm9vbCBwYXVzZSk7CisgIHZvaWQgUGxheSgpOworICB2b2lkIFBhdXNlKCk7CisKKyAgUHVsc2VBdWRpb1NpbmtUeXBlKiBjb25zdCB0eXBlXzsKKyAgY29uc3QgaW50IGNoYW5uZWxzXzsKKyAgY29uc3QgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oel87CisgIGNvbnN0IFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGVfOworICBjb25zdCB1aW50OF90KiBjb25zdCBmcmFtZV9idWZmZXJfOworICBjb25zdCBpbnQgZnJhbWVzX3Blcl9jaGFubmVsXzsKKyAgY29uc3QgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmNfOworICBjb25zdCBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVfZnVuY187CisgIHZvaWQqIGNvbnN0IGNvbnRleHRfOworICBjb25zdCBzaXplX3QgYnl0ZXNfcGVyX2ZyYW1lXzsKKworICBwYV9zdHJlYW0qIHN0cmVhbV8gPSBOVUxMOworICBwYV9idWZmZXJfYXR0ciBidWZfYXR0cl87CisgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjXzsKKyAgc2l6ZV90IGxhc3RfcmVxdWVzdF9zaXplXyA9IDA7CisgIGludDY0X3QgdG90YWxfZnJhbWVzX3BsYXllZF8gPSAwOworICBpbnQ2NF90IHRvdGFsX2ZyYW1lc193cml0dGVuXyA9IDA7CisgIGF0b21pY19ib29sIGlzX3BhdXNlZF87Cit9OworCitjbGFzcyBQdWxzZUF1ZGlvU2lua1R5cGUgOiBwdWJsaWMgU2JBdWRpb1NpbmtQcml2YXRlOjpUeXBlIHsKKyBwdWJsaWM6CisgIFB1bHNlQXVkaW9TaW5rVHlwZSgpOworICB+UHVsc2VBdWRpb1NpbmtUeXBlKCkgb3ZlcnJpZGU7CisKKyAgU2JBdWRpb1NpbmsgQ3JlYXRlKAorICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiwKKyAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgYXVkaW9fc2FtcGxlX3R5cGUsCisgICAgICBTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlIGF1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZSwKKyAgICAgIFNiQXVkaW9TaW5rRnJhbWVCdWZmZXJzIGZyYW1lX2J1ZmZlcnMsCisgICAgICBpbnQgZnJhbWVzX3Blcl9jaGFubmVsLAorICAgICAgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsCisgICAgICBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVzX2Z1bmMsCisgICAgICB2b2lkKiBjb250ZXh0KTsKKyAgYm9vbCBJc1ZhbGlkKFNiQXVkaW9TaW5rIGF1ZGlvX3NpbmspIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gYXVkaW9fc2luayAhPSBrU2JBdWRpb1NpbmtJbnZhbGlkICYmIGF1ZGlvX3NpbmstPklzVHlwZSh0aGlzKTsKKyAgfQorICB2b2lkIERlc3Ryb3koU2JBdWRpb1NpbmsgYXVkaW9fc2luaykgb3ZlcnJpZGU7CisKKyAgYm9vbCBJbml0aWFsaXplKCk7CisKKyAgYm9vbCBCZWxvbmdUb0F1ZGlvVGhyZWFkKCk7CisgIHBhX3N0cmVhbSogQ3JlYXRlTmV3U3RyZWFtKGNvbnN0IHBhX3NhbXBsZV9zcGVjKiBzYW1wbGVfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIqIGJ1ZmZlcl9hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9zdHJlYW1fZmxhZ3NfdCBzdHJlYW1fZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3Qgc3RyZWFtX3JlcXVlc3RfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJkYXRhKTsKKyAgdm9pZCBEZXN0cm95U3RyZWFtKHBhX3N0cmVhbSogc3RyZWFtKTsKKworIHByaXZhdGU6CisgIFB1bHNlQXVkaW9TaW5rVHlwZShjb25zdCBQdWxzZUF1ZGlvU2lua1R5cGUmKSA9IGRlbGV0ZTsKKyAgUHVsc2VBdWRpb1NpbmtUeXBlJiBvcGVyYXRvcj0oY29uc3QgUHVsc2VBdWRpb1NpbmtUeXBlJikgPSBkZWxldGU7CisKKyAgc3RhdGljIHZvaWQgU3RhdGVDYWxsYmFjayhwYV9jb250ZXh0KiBjb250ZXh0LCB2b2lkKiB1c2VyZGF0YSk7CisgIHN0YXRpYyB2b2lkKiBUaHJlYWRFbnRyeVBvaW50KHZvaWQqIGNvbnRleHQpOworICB2b2lkIEF1ZGlvVGhyZWFkRnVuYygpOworCisgIHN0ZDo6dmVjdG9yPFB1bHNlQXVkaW9TaW5rKj4gc2lua3NfOworICBwYV9tYWlubG9vcCogbWFpbmxvb3BfID0gTlVMTDsKKyAgcGFfY29udGV4dCogY29udGV4dF8gPSBOVUxMOworICBNdXRleCBtdXRleF87CisgIFNiVGhyZWFkIGF1ZGlvX3RocmVhZF8gPSBrU2JUaHJlYWRJbnZhbGlkOworICBib29sIGRlc3Ryb3lpbmdfID0gZmFsc2U7Cit9OworCitQdWxzZUF1ZGlvU2luazo6UHVsc2VBdWRpb1NpbmsoCisgICAgUHVsc2VBdWRpb1NpbmtUeXBlKiB0eXBlLAorICAgIGludCBjaGFubmVscywKKyAgICBpbnQgc2FtcGxpbmdfZnJlcXVlbmN5X2h6LAorICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCisgICAgU2JBdWRpb1NpbmtGcmFtZUJ1ZmZlcnMgZnJhbWVfYnVmZmVycywKKyAgICBpbnQgZnJhbWVzX3Blcl9jaGFubmVsLAorICAgIFNiQXVkaW9TaW5rVXBkYXRlU291cmNlU3RhdHVzRnVuYyB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLAorICAgIFNiQXVkaW9TaW5rQ29uc3VtZUZyYW1lc0Z1bmMgY29uc3VtZV9mcmFtZV9mdW5jLAorICAgIHZvaWQqIGNvbnRleHQpCisgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIGNoYW5uZWxzXyhjaGFubmVscyksCisgICAgICBzYW1wbGluZ19mcmVxdWVuY3lfaHpfKHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiksCisgICAgICBzYW1wbGVfdHlwZV8oc2FtcGxlX3R5cGUpLAorICAgICAgZnJhbWVfYnVmZmVyXyhzdGF0aWNfY2FzdDx1aW50OF90Kj4oZnJhbWVfYnVmZmVyc1swXSkpLAorICAgICAgZnJhbWVzX3Blcl9jaGFubmVsXyhmcmFtZXNfcGVyX2NoYW5uZWwpLAorICAgICAgdXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuY18odXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuYyksCisgICAgICBjb25zdW1lX2ZyYW1lX2Z1bmNfKGNvbnN1bWVfZnJhbWVfZnVuYyksCisgICAgICBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICAgIGJ5dGVzX3Blcl9mcmFtZV8oc3RhdGljX2Nhc3Q8c2l6ZV90PihjaGFubmVscykgKgorICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlc1BlclNhbXBsZShzYW1wbGVfdHlwZSkpLAorICAgICAgaXNfcGF1c2VkXyhmYWxzZSkgeworICBTQl9EQ0hFQ0sodXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuY18pOworICBTQl9EQ0hFQ0soY29uc3VtZV9mcmFtZV9mdW5jXyk7CisgIFNCX0RDSEVDSyhmcmFtZV9idWZmZXJfKTsKKyAgU0JfRENIRUNLKFNiQXVkaW9TaW5rSXNBdWRpb1NhbXBsZVR5cGVTdXBwb3J0ZWQoc2FtcGxlX3R5cGVfKSk7Cit9CisKK1B1bHNlQXVkaW9TaW5rOjp+UHVsc2VBdWRpb1NpbmsoKSB7CisgIGlmIChzdHJlYW1fKSB7CisgICAgdHlwZV8tPkRlc3Ryb3lTdHJlYW0oc3RyZWFtXyk7CisgIH0KK30KKworYm9vbCBQdWxzZUF1ZGlvU2luazo6SXNUeXBlKFR5cGUqIHR5cGUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGUqPih0eXBlXykgPT0gdHlwZTsKK30KKwordm9pZCBQdWxzZUF1ZGlvU2luazo6U2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CisgIC8vIE9ubHkgc3VwcG9ydCBwbGF5YmFjayByYXRlIDAuMCBhbmQgMS4wLgorICBTQl9EQ0hFQ0socGxheWJhY2tfcmF0ZSA9PSAwLjAgfHwgcGxheWJhY2tfcmF0ZSA9PSAxLjApOworICBpc19wYXVzZWRfLnN0b3JlKHBsYXliYWNrX3JhdGUgPT0gMC4wKTsKK30KKwordm9pZCBQdWxzZUF1ZGlvU2luazo6U2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIHsKKyAgU0JfTk9USU1QTEVNRU5URUQoKTsKK30KKworYm9vbCBQdWxzZUF1ZGlvU2luazo6SW5pdGlhbGl6ZShwYV9jb250ZXh0KiBjb250ZXh0KSB7CisgIFNCX0RDSEVDSyghc3RyZWFtXyk7CisKKyAgc2FtcGxlX3NwZWNfLnJhdGUgPSBzYW1wbGluZ19mcmVxdWVuY3lfaHpfOworICBzYW1wbGVfc3BlY18uY2hhbm5lbHMgPSBjaGFubmVsc187CisgIHNhbXBsZV9zcGVjXy5mb3JtYXQgPSBzYW1wbGVfdHlwZV8gPT0ga1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVGbG9hdDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQQV9TQU1QTEVfRkxPQVQzMkxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQQV9TQU1QTEVfUzE2TEU7CisgIFNCX0RDSEVDSyhwYV9mcmFtZV9zaXplKCZzYW1wbGVfc3BlY18pID09IGJ5dGVzX3Blcl9mcmFtZV8pOworCisgIGJ1Zl9hdHRyXy5mcmFnc2l6ZSA9IH4wOworICBidWZfYXR0cl8ubWF4bGVuZ3RoID0ga1B1bHNlQnVmZmVyU2l6ZUluRnJhbWVzICogYnl0ZXNfcGVyX2ZyYW1lXzsKKyAgYnVmX2F0dHJfLm1pbnJlcSA9IGtGcmFtZXNQZXJSZXF1ZXN0ICogYnl0ZXNfcGVyX2ZyYW1lXzsKKyAgYnVmX2F0dHJfLnByZWJ1ZiA9IDA7CisgIGJ1Zl9hdHRyXy50bGVuZ3RoID0gYnVmX2F0dHJfLm1heGxlbmd0aDsKKworICBjb25zdCBwYV9zdHJlYW1fZmxhZ3NfdCBrTm9MYXRlbmN5ID0gc3RhdGljX2Nhc3Q8cGFfc3RyZWFtX2ZsYWdzX3Q+KAorICAgICAgUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyB8IFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUgfAorICAgICAgUEFfU1RSRUFNX1NUQVJUX0NPUktFRCk7CisKKyAgc3RyZWFtXyA9IHR5cGVfLT5DcmVhdGVOZXdTdHJlYW0oJnNhbXBsZV9zcGVjXywgJmJ1Zl9hdHRyXywga05vTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdENhbGxiYWNrLCB0aGlzKTsKKyAgcmV0dXJuIHN0cmVhbV8gIT0gTlVMTDsKK30KKworYm9vbCBQdWxzZUF1ZGlvU2luazo6V3JpdGVGcmFtZUlmTmVjZXNzYXJ5KCkgeworICBTQl9EQ0hFQ0sodHlwZV8tPkJlbG9uZ1RvQXVkaW9UaHJlYWQoKSk7CisKKyAgLy8gV2FpdCB1bnRpbCB8c3RyZWFtX3wgaXMgcmVhZHk7CisgIGlmIChwYV9zdHJlYW1fZ2V0X3N0YXRlKHN0cmVhbV8pICE9IFBBX1NUUkVBTV9SRUFEWSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHB1bHNlX3BhdXNlZCA9IHBhX3N0cmVhbV9pc19jb3JrZWQoc3RyZWFtXykgPT0gMTsKKyAgLy8gQ2FsY3VsYXRlIGNvbnN1bWVkIGZyYW1lcy4KKyAgaWYgKCFwdWxzZV9wYXVzZWQpIHsKKyAgICBwYV91c2VjX3QgdGltZV9wbGF5ZWQ7CisgICAgLy8gSWYgY2Fubm90IGdldCB0aW1pbmcgaW5mb3JtYXRpb24sIHNraXAuCisgICAgaWYgKHBhX3N0cmVhbV9nZXRfdGltZShzdHJlYW1fLCAmdGltZV9wbGF5ZWQpID09IDApIHsKKyAgICAgIGludDY0X3QgbmV3X3RvdGFsX2ZyYW1lc19wbGF5ZWQgPQorICAgICAgICAgIHRpbWVfcGxheWVkICogc2FtcGxpbmdfZnJlcXVlbmN5X2h6XyAvIDEwMDAwMDA7CisgICAgICAvLyB8dGltZV9wbGF5ZWR8IGlzIGFuIGVzdGltYXRpb24uIFNvbWV0aW1lcyBpdCB3b3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgLy8gfHRvdGFsX2ZyYW1lc193cml0dGVuX3wuCisgICAgICBuZXdfdG90YWxfZnJhbWVzX3BsYXllZCA9CisgICAgICAgICAgc3RkOjptaW4obmV3X3RvdGFsX2ZyYW1lc19wbGF5ZWQsIHRvdGFsX2ZyYW1lc193cml0dGVuXyk7CisgICAgICBTQl9EQ0hFQ0sodG90YWxfZnJhbWVzX3BsYXllZF8gPD0gbmV3X3RvdGFsX2ZyYW1lc19wbGF5ZWQpOworICAgICAgaW50NjRfdCBjb25zdW1lID0gbmV3X3RvdGFsX2ZyYW1lc19wbGF5ZWQgLSB0b3RhbF9mcmFtZXNfcGxheWVkXzsKKyAgICAgIGlmIChjb25zdW1lID4gMCkgeworICAgICAgICBjb25zdW1lX2ZyYW1lX2Z1bmNfKGNvbnN1bWUsIGNvbnRleHRfKTsKKyAgICAgICAgdG90YWxfZnJhbWVzX3BsYXllZF8gPSBuZXdfdG90YWxfZnJhbWVzX3BsYXllZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gR2V0IHVwZGF0ZWQgc291cmNlIGluZm9ybWF0aW9uLgorICBpbnQgZnJhbWVzX2luX2J1ZmZlciwgb2Zmc2V0X2luX2ZyYW1lczsKKyAgYm9vbCBpc19wbGF5aW5nLCBpc19lb3NfcmVhY2hlZDsKKyAgdXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuY18oJmZyYW1lc19pbl9idWZmZXIsICZvZmZzZXRfaW5fZnJhbWVzLCAmaXNfcGxheWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzX2Vvc19yZWFjaGVkLCBjb250ZXh0Xyk7CisgIC8vIFBhdXNlIGF1ZGlvIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKCFpc19wbGF5aW5nIHx8IGlzX3BhdXNlZF8ubG9hZCgpKSB7CisgICAgaWYgKCFwdWxzZV9wYXVzZWQpIHsKKyAgICAgIFBhdXNlKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBDYWxjdWxhdGUgZnJhbWVzIHRvIHdyaXRlLgorICBpbnQgZnJhbWVzX2luX3NpbmsgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0b3RhbF9mcmFtZXNfd3JpdHRlbl8gLSB0b3RhbF9mcmFtZXNfcGxheWVkXyk7CisgIGZyYW1lc19pbl9idWZmZXIgLT0gZnJhbWVzX2luX3Npbms7CisgIG9mZnNldF9pbl9mcmFtZXMgPSAoZnJhbWVzX2luX3NpbmsgKyBvZmZzZXRfaW5fZnJhbWVzKSAlIGZyYW1lc19wZXJfY2hhbm5lbF87CisgIGlmIChmcmFtZXNfaW5fYnVmZmVyID4gMCAmJiBsYXN0X3JlcXVlc3Rfc2l6ZV8gPiAwKSB7CisgICAgaW50IGZyYW1lc190b193cml0ZSA9CisgICAgICAgIHN0ZDo6bWluKGZyYW1lc19pbl9idWZmZXIsCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obGFzdF9yZXF1ZXN0X3NpemVfIC8gYnl0ZXNfcGVyX2ZyYW1lXykpOworICAgIFdyaXRlRnJhbWVzKGZyYW1lX2J1ZmZlcl8sIGZyYW1lc190b193cml0ZSwgb2Zmc2V0X2luX2ZyYW1lcyk7CisgICAgdG90YWxfZnJhbWVzX3dyaXR0ZW5fICs9IGZyYW1lc190b193cml0ZTsKKyAgfQorCisgIC8vIFBsYXkgYXVkaW8gaWYgbmVjZXNzYXJ5LgorICBpZiAodG90YWxfZnJhbWVzX3dyaXR0ZW5fID4gdG90YWxfZnJhbWVzX3BsYXllZF8gJiYgcHVsc2VfcGF1c2VkKSB7CisgICAgUGxheSgpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFB1bHNlQXVkaW9TaW5rOjpXcml0ZUZyYW1lcyhjb25zdCB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldF9pbl9mcmFtZXMpIHsKKyAgU0JfRENIRUNLKHR5cGVfLT5CZWxvbmdUb0F1ZGlvVGhyZWFkKCkpOworICBTQl9EQ0hFQ0soYnVmZmVyKTsKKyAgU0JfRENIRUNLKGZyYW1lc190b193cml0ZSk7CisgIFNCX0RDSEVDSyhwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZShzdHJlYW1fKSA9PSBsYXN0X3JlcXVlc3Rfc2l6ZV8pOworICBTQl9EQ0hFQ0soZnJhbWVzX3RvX3dyaXRlICogYnl0ZXNfcGVyX2ZyYW1lXyA8PSBsYXN0X3JlcXVlc3Rfc2l6ZV8pOworCisgIGludCBmcmFtZXNfdG9fYnVmZmVyX2VuZCA9IGZyYW1lc19wZXJfY2hhbm5lbF8gLSBvZmZzZXRfaW5fZnJhbWVzOworICAvLyBCdWZmZXIgaXMgY2lyY3VsYXIuIFRydW5jYXRlIGZyYW1lcyBpZiBleGNlZWRzIGJ1ZmZlciBlbmQuCisgIHNpemVfdCBieXRlc190b193cml0ZSA9CisgICAgICBzdGQ6Om1pbihmcmFtZXNfdG9fd3JpdGUsIGZyYW1lc190b19idWZmZXJfZW5kKSAqIGJ5dGVzX3Blcl9mcmFtZV87CisgIHBhX3N0cmVhbV93cml0ZSgKKyAgICAgIHN0cmVhbV8sCisgICAgICBmcmFtZV9idWZmZXJfICsgc3RhdGljX2Nhc3Q8c2l6ZV90PihvZmZzZXRfaW5fZnJhbWVzKSAqIGJ5dGVzX3Blcl9mcmFtZV8sCisgICAgICBieXRlc190b193cml0ZSwgTlVMTCwgMExMLCBQQV9TRUVLX1JFTEFUSVZFKTsKKyAgbGFzdF9yZXF1ZXN0X3NpemVfIC09IGJ5dGVzX3RvX3dyaXRlOworCisgIC8vIFdyaXRlIGZyYW1lcyBhdCBiZWdpbm5pbmcgb2YgYnVmZmVyLgorICBpZiAoZnJhbWVzX3RvX3dyaXRlID4gZnJhbWVzX3RvX2J1ZmZlcl9lbmQpIHsKKyAgICBXcml0ZUZyYW1lcyhidWZmZXIsIGZyYW1lc190b193cml0ZSAtIGZyYW1lc190b19idWZmZXJfZW5kLCAwKTsKKyAgfQorfQorCit2b2lkIFB1bHNlQXVkaW9TaW5rOjpDb3JrKGJvb2wgcGF1c2UpIHsKKyAgU0JfRENIRUNLKHR5cGVfLT5CZWxvbmdUb0F1ZGlvVGhyZWFkKCkpOworICBTQl9EQ0hFQ0socGFfc3RyZWFtX2dldF9zdGF0ZShzdHJlYW1fKSA9PSBQQV9TVFJFQU1fUkVBRFkpOworCisgIHBhX29wZXJhdGlvbiogb3AgPSBwYV9zdHJlYW1fY29yayhzdHJlYW1fLCBwYXVzZSA/IDEgOiAwLCBOVUxMLCBOVUxMKTsKKyAgU0JfRENIRUNLKG9wKTsKKyAgcGFfb3BlcmF0aW9uX3VucmVmKG9wKTsKK30KKwordm9pZCBQdWxzZUF1ZGlvU2luazo6UGxheSgpIHsKKyAgQ29yayhmYWxzZSk7Cit9CisKK3ZvaWQgUHVsc2VBdWRpb1Npbms6OlBhdXNlKCkgeworICBDb3JrKHRydWUpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgUHVsc2VBdWRpb1Npbms6OlJlcXVlc3RDYWxsYmFjayhwYV9zdHJlYW0qIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyZGF0YSkgeworICBQdWxzZUF1ZGlvU2luayogc3RyZWFtID0gcmVpbnRlcnByZXRfY2FzdDxQdWxzZUF1ZGlvU2luayo+KHVzZXJkYXRhKTsKKyAgc3RyZWFtLT5IYW5kbGVSZXF1ZXN0KGxlbmd0aCk7Cit9CisKK3ZvaWQgUHVsc2VBdWRpb1Npbms6OkhhbmRsZVJlcXVlc3Qoc2l6ZV90IGxlbmd0aCkgeworICBTQl9EQ0hFQ0sodHlwZV8tPkJlbG9uZ1RvQXVkaW9UaHJlYWQoKSk7CisgIGxhc3RfcmVxdWVzdF9zaXplXyA9IGxlbmd0aDsKK30KKworUHVsc2VBdWRpb1NpbmtUeXBlOjpQdWxzZUF1ZGlvU2lua1R5cGUoKSB7fQorCitQdWxzZUF1ZGlvU2lua1R5cGU6On5QdWxzZUF1ZGlvU2lua1R5cGUoKSB7CisgIGlmIChTYlRocmVhZElzVmFsaWQoYXVkaW9fdGhyZWFkXykpIHsKKyAgICB7CisgICAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKKyAgICAgIGRlc3Ryb3lpbmdfID0gdHJ1ZTsKKyAgICB9CisgICAgU2JUaHJlYWRKb2luKGF1ZGlvX3RocmVhZF8sIE5VTEwpOworICB9CisgIFNCX0RDSEVDSyhzaW5rc18uZW1wdHkoKSk7CisgIGlmIChjb250ZXh0XykgeworICAgIHBhX2NvbnRleHRfZGlzY29ubmVjdChjb250ZXh0Xyk7CisgICAgcGFfY29udGV4dF91bnJlZihjb250ZXh0Xyk7CisgIH0KKyAgaWYgKG1haW5sb29wXykgeworICAgIHBhX21haW5sb29wX2ZyZWUobWFpbmxvb3BfKTsKKyAgfQorfQorCitTYkF1ZGlvU2luayBQdWxzZUF1ZGlvU2lua1R5cGU6OkNyZWF0ZSgKKyAgICBpbnQgY2hhbm5lbHMsCisgICAgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiwKKyAgICBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIGF1ZGlvX3NhbXBsZV90eXBlLAorICAgIFNiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGUgYXVkaW9fZnJhbWVfc3RvcmFnZV90eXBlLAorICAgIFNiQXVkaW9TaW5rRnJhbWVCdWZmZXJzIGZyYW1lX2J1ZmZlcnMsCisgICAgaW50IGZyYW1lc19wZXJfY2hhbm5lbCwKKyAgICBTYkF1ZGlvU2lua1VwZGF0ZVNvdXJjZVN0YXR1c0Z1bmMgdXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuYywKKyAgICBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVzX2Z1bmMsCisgICAgdm9pZCogY29udGV4dCkgeworICBQdWxzZUF1ZGlvU2luayogYXVkaW9fc2luayA9IG5ldyBQdWxzZUF1ZGlvU2luaygKKyAgICAgIHRoaXMsIGNoYW5uZWxzLCBzYW1wbGluZ19mcmVxdWVuY3lfaHosIGF1ZGlvX3NhbXBsZV90eXBlLCBmcmFtZV9idWZmZXJzLAorICAgICAgZnJhbWVzX3Blcl9jaGFubmVsLCB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLCBjb25zdW1lX2ZyYW1lc19mdW5jLAorICAgICAgY29udGV4dCk7CisgIGlmICghYXVkaW9fc2luay0+SW5pdGlhbGl6ZShjb250ZXh0XykpIHsKKyAgICBkZWxldGUgYXVkaW9fc2luazsKKyAgICByZXR1cm4ga1NiQXVkaW9TaW5rSW52YWxpZDsKKyAgfQorICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKKyAgc2lua3NfLnB1c2hfYmFjayhhdWRpb19zaW5rKTsKKyAgcmV0dXJuIGF1ZGlvX3Npbms7Cit9CisKK3ZvaWQgUHVsc2VBdWRpb1NpbmtUeXBlOjpEZXN0cm95KFNiQXVkaW9TaW5rIGF1ZGlvX3NpbmspIHsKKyAgaWYgKGF1ZGlvX3NpbmsgPT0ga1NiQXVkaW9TaW5rSW52YWxpZCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoYXVkaW9fc2luayAhPSBrU2JBdWRpb1NpbmtJbnZhbGlkICYmICFJc1ZhbGlkKGF1ZGlvX3NpbmspKSB7CisgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJhdWRpb19zaW5rIGlzIGludmFsaWQuIjsKKyAgICByZXR1cm47CisgIH0KKyAgUHVsc2VBdWRpb1NpbmsqIHB1bHNlX2F1ZGlvX3NpbmsgPSBzdGF0aWNfY2FzdDxQdWxzZUF1ZGlvU2luayo+KGF1ZGlvX3NpbmspOworICB7CisgICAgeworICAgICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7CisgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNpbmtzXy5iZWdpbigpLCBzaW5rc18uZW5kKCksIHB1bHNlX2F1ZGlvX3NpbmspOworICAgICAgU0JfRENIRUNLKGl0ICE9IHNpbmtzXy5lbmQoKSk7CisgICAgICBzaW5rc18uZXJhc2UoaXQpOworICAgIH0KKyAgICBkZWxldGUgYXVkaW9fc2luazsKKyAgfQorfQorCitib29sIFB1bHNlQXVkaW9TaW5rVHlwZTo6SW5pdGlhbGl6ZSgpIHsKKyAgLy8gQ3JlYXRlIFB1bHNlQXVkaW8ncyBtYWluIGxvb3AsIHdoaWNoIHdpbGwgcnVuIGluIGl0cyBvd24gdGhyZWFkLgorICBtYWlubG9vcF8gPSBwYV9tYWlubG9vcF9uZXcoKTsKKyAgaWYgKCFtYWlubG9vcF8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gQ3JlYXRlIHB1bHNlIGNvbnRleHQuCisgIGNvbnRleHRfID0gcGFfY29udGV4dF9uZXcocGFfbWFpbmxvb3BfZ2V0X2FwaShtYWlubG9vcF8pLCAicHVsc2VfYXVkaW8iKTsKKyAgaWYgKCFjb250ZXh0XykgeworICAgIFNCX0xPRyhFUlJPUikgPDwgIlB1bHNlIGF1ZGlvIGVycm9yOiBjYW5ub3QgY3JlYXRlIGNvbnRleHQuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gQ29ubmVjdCB0byB0aGUgc2VydmVyIGFuZCBzdGFydCB0aGUgbWFpbiBsb29wCisgIGJvb2wgcGFfcmVhZHkgPSBmYWxzZTsKKyAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2soY29udGV4dF8sIFN0YXRlQ2FsbGJhY2ssICZwYV9yZWFkeSk7CisgIGlmIChwYV9jb250ZXh0X2Nvbm5lY3QoY29udGV4dF8sIE5VTEwsIHBhX2NvbnRleHRfZmxhZ3NfdCgwKSwgTlVMTCkgPCAwKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiUHVsc2UgYXVkaW8gZXJyb3I6IGNhbm5vdCBjb25uZWN0aW5nIHRvIGNvbnRleHQuIjsKKyAgICBwYV9jb250ZXh0X3VucmVmKGNvbnRleHRfKTsKKyAgICBjb250ZXh0XyA9IE5VTEw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIFdhaXQgdW50aWwgdGhlIGNvbnRleHQgaGFzIGNvbm5lY3RlZC4KKyAgd2hpbGUgKCFwYV9yZWFkeSkgeworICAgIHBhX21haW5sb29wX2l0ZXJhdGUobWFpbmxvb3BfLCAxLCBOVUxMKTsKKyAgfQorICAvLyBDbGVhciB0aGUgc3RhdGUgY2FsbGJhY2suCisgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKGNvbnRleHRfLCBOVUxMLCBOVUxMKTsKKyAgLy8gQ2hlY2sgc3RhdHVzLgorICBpZiAocGFfY29udGV4dF9nZXRfc3RhdGUoY29udGV4dF8pICE9IFBBX0NPTlRFWFRfUkVBRFkpIHsKKyAgICBTQl9MT0coRVJST1IpIDw8ICJQdWxzZSBhdWRpbyBlcnJvcjogY2Fubm90IGNvbm5lY3RpbmcgdG8gY29udGV4dC4iOworICAgIHBhX2NvbnRleHRfdW5yZWYoY29udGV4dF8pOworICAgIGNvbnRleHRfID0gTlVMTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYXVkaW9fdGhyZWFkXyA9IFNiVGhyZWFkQ3JlYXRlKDAsIGtTYlRocmVhZFByaW9yaXR5UmVhbFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JUaHJlYWROb0FmZmluaXR5LCB0cnVlLCAicHVsc2VfYXVkaW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB1bHNlQXVkaW9TaW5rVHlwZTo6VGhyZWFkRW50cnlQb2ludCwgdGhpcyk7CisgIFNCX0RDSEVDSyhTYlRocmVhZElzVmFsaWQoYXVkaW9fdGhyZWFkXykpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIFB1bHNlQXVkaW9TaW5rVHlwZTo6QmVsb25nVG9BdWRpb1RocmVhZCgpIHsKKyAgU0JfRENIRUNLKFNiVGhyZWFkSXNWYWxpZChhdWRpb190aHJlYWRfKSk7CisgIHJldHVybiBTYlRocmVhZElzQ3VycmVudChhdWRpb190aHJlYWRfKTsKK30KKworcGFfc3RyZWFtKiBQdWxzZUF1ZGlvU2lua1R5cGU6OkNyZWF0ZU5ld1N0cmVhbSgKKyAgICBjb25zdCBwYV9zYW1wbGVfc3BlYyogc2FtcGxlX3NwZWMsCisgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIqIGJ1ZmZlcl9hdHRyLAorICAgIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzLAorICAgIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3Qgc3RyZWFtX3JlcXVlc3RfY2IsCisgICAgdm9pZCogdXNlcmRhdGEpIHsKKyAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7CisgIHBhX3N0cmVhbSogc3RyZWFtID0gcGFfc3RyZWFtX25ldyhjb250ZXh0XywgInB1bHNlYXVkaW8iLCBzYW1wbGVfc3BlYywgTlVMTCk7CisgIGlmICghc3RyZWFtKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiUHVsc2UgYXVkaW8gZXJyb3I6IGNhbm5vdCBjcmVhdGUgc3RyZWFtLiI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKHN0cmVhbSwgTlVMTCwgYnVmZmVyX2F0dHIsIGZsYWdzLCBOVUxMLCBOVUxMKSA8CisgICAgICAwKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiUHVsc2UgYXVkaW8gZXJyb3I6IHN0cmVhbSBjYW5ub3QgY29ubmVjdCBwbGF5YmFjay4iOworICAgIHBhX3N0cmVhbV91bnJlZihzdHJlYW0pOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2soc3RyZWFtLCBzdHJlYW1fcmVxdWVzdF9jYiwgdXNlcmRhdGEpOworICByZXR1cm4gc3RyZWFtOworfQorCit2b2lkIFB1bHNlQXVkaW9TaW5rVHlwZTo6RGVzdHJveVN0cmVhbShwYV9zdHJlYW0qIHN0cmVhbSkgeworICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKKyAgcGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjayhzdHJlYW0sIE5VTEwsIE5VTEwpOworICBwYV9zdHJlYW1fZGlzY29ubmVjdChzdHJlYW0pOworICBwYV9zdHJlYW1fdW5yZWYoc3RyZWFtKTsKK30KKworLy8gc3RhdGljCit2b2lkIFB1bHNlQXVkaW9TaW5rVHlwZTo6U3RhdGVDYWxsYmFjayhwYV9jb250ZXh0KiBjb250ZXh0LCB2b2lkKiB1c2VyZGF0YSkgeworICBib29sKiBwYV9yZWFkeSA9IHN0YXRpY19jYXN0PGJvb2wqPih1c2VyZGF0YSk7CisgIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUoY29udGV4dCkpIHsKKyAgICBjYXNlIFBBX0NPTlRFWFRfRkFJTEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9URVJNSU5BVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9SRUFEWToKKyAgICAgICpwYV9yZWFkeSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworLy8gc3RhdGljCit2b2lkKiBQdWxzZUF1ZGlvU2lua1R5cGU6OlRocmVhZEVudHJ5UG9pbnQodm9pZCogY29udGV4dCkgeworICBTQl9EQ0hFQ0soY29udGV4dCk7CisgIFB1bHNlQXVkaW9TaW5rVHlwZSogdHlwZSA9IHN0YXRpY19jYXN0PFB1bHNlQXVkaW9TaW5rVHlwZSo+KGNvbnRleHQpOworICB0eXBlLT5BdWRpb1RocmVhZEZ1bmMoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUHVsc2VBdWRpb1NpbmtUeXBlOjpBdWRpb1RocmVhZEZ1bmMoKSB7CisgIGZvciAoOzspIHsKKyAgICB7CisgICAgICBib29sIGhhc19ydW5uaW5nX3NpbmsgPSBmYWxzZTsKKyAgICAgIHsKKyAgICAgICAgLy8gVE9ETzogVGhlIHNjb3BlIG9mIHRoZSBsb2NrIGlzIHRvbyB3aWRlLgorICAgICAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKKyAgICAgICAgaWYgKGRlc3Ryb3lpbmdfKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChQdWxzZUF1ZGlvU2luayogc2luayA6IHNpbmtzXykgeworICAgICAgICAgIGhhc19ydW5uaW5nX3NpbmsgfD0gc2luay0+V3JpdGVGcmFtZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0ZShtYWlubG9vcF8sIDAsIE5VTEwpOworICAgICAgfQorICAgICAgaWYgKGhhc19ydW5uaW5nX3NpbmspIHsKKyAgICAgICAgU2JUaHJlYWRTbGVlcChrQXVkaW9SdW5uaW5nU2xlZXBJbnRlcnZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTYlRocmVhZFNsZWVwKGtBdWRpb0lkbGVTbGVlcEludGVydmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSB7CitQdWxzZUF1ZGlvU2lua1R5cGUqIHB1bHNlX2F1ZGlvX3NpbmtfdHlwZV8gPSBOVUxMOworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYwordm9pZCBQbGF0Zm9ybUluaXRpYWxpemUoKSB7CisgIFNCX0RDSEVDSyghcHVsc2VfYXVkaW9fc2lua190eXBlXyk7CisgIGlmICghcHVsc2VfbG9hZF9saWJyYXJ5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYXV0byBhdWRpb19zaW5rX3R5cGUgPQorICAgICAgc3RkOjp1bmlxdWVfcHRyPFB1bHNlQXVkaW9TaW5rVHlwZT4obmV3IFB1bHNlQXVkaW9TaW5rVHlwZSgpKTsKKyAgaWYgKGF1ZGlvX3NpbmtfdHlwZS0+SW5pdGlhbGl6ZSgpKSB7CisgICAgcHVsc2VfYXVkaW9fc2lua190eXBlXyA9IGF1ZGlvX3NpbmtfdHlwZS5yZWxlYXNlKCk7CisgICAgU2JBdWRpb1NpbmtQcml2YXRlOjpTZXRQcmltYXJ5VHlwZShwdWxzZV9hdWRpb19zaW5rX3R5cGVfKTsKKyAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgUGxhdGZvcm1UZWFyRG93bigpIHsKKyAgU0JfRENIRUNLKHB1bHNlX2F1ZGlvX3NpbmtfdHlwZV8pOworICBTQl9EQ0hFQ0socHVsc2VfYXVkaW9fc2lua190eXBlXyA9PSBTYkF1ZGlvU2lua1ByaXZhdGU6OkdldFByaW1hcnlUeXBlKCkpOworCisgIFNiQXVkaW9TaW5rUHJpdmF0ZTo6U2V0UHJpbWFyeVR5cGUoTlVMTCk7CisgIGRlbGV0ZSBwdWxzZV9hdWRpb19zaW5rX3R5cGVfOworICBwdWxzZV9hdWRpb19zaW5rX3R5cGVfID0gTlVMTDsKKyAgcHVsc2VfdW5sb2FkX2xpYnJhcnkoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB1bHNlCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9hdWRpb19zaW5rX3R5cGUuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2F1ZGlvX3NpbmtfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWZjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9hdWRpb19zaW5rX3R5cGUuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9QVUxTRV9QVUxTRV9BVURJT19TSU5LX1RZUEVfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9QVUxTRV9QVUxTRV9BVURJT19TSU5LX1RZUEVfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHB1bHNlIHsKKwordm9pZCBQbGF0Zm9ybUluaXRpYWxpemUoKTsKK3ZvaWQgUGxhdGZvcm1UZWFyRG93bigpOworCit9ICAvLyBuYW1lc3BhY2UgcHVsc2UKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1BVTFNFX1BVTFNFX0FVRElPX1NJTktfVFlQRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvcHVsc2UvcHVsc2VfZHluYW1pY19sb2FkX2Rpc3BhdGNoZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wdWxzZS9wdWxzZV9keW5hbWljX2xvYWRfZGlzcGF0Y2hlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODcwODBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvcHVsc2UvcHVsc2VfZHluYW1pY19sb2FkX2Rpc3BhdGNoZXIuY2MKQEAgLTAsMCArMSwxNDMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvcHVsc2UvcHVsc2VfZHluYW1pY19sb2FkX2Rpc3BhdGNoZXIuaCIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL29uY2UuaCIKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2Ugc2hhcmVkIHsKK25hbWVzcGFjZSBwdWxzZSB7CisKK25hbWVzcGFjZSB7Citjb25zdCBjaGFyIGtQdWxzZUxpYnJhcnlOYW1lW10gPSAibGlicHVsc2Uuc28iOwordm9pZCogcHVsc2VfbGliX2hhbmRsZSA9IE5VTEw7Cit9ICAvLyBuYW1lc3BhY2UKKworaW50ICgqcGFfY29udGV4dF9jb25uZWN0KShwYV9jb250ZXh0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfZmxhZ3NfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFfc3Bhd25fYXBpKikgPSBOVUxMOwordm9pZCAoKnBhX2NvbnRleHRfZGlzY29ubmVjdCkocGFfY29udGV4dCopID0gTlVMTDsKK3BhX2NvbnRleHRfc3RhdGVfdCAoKnBhX2NvbnRleHRfZ2V0X3N0YXRlKShwYV9jb250ZXh0KikgPSBOVUxMOworcGFfY29udGV4dCogKCpwYV9jb250ZXh0X25ldykocGFfbWFpbmxvb3BfYXBpKiwgY29uc3QgY2hhciopID0gTlVMTDsKK3ZvaWQgKCpwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjaykocGFfY29udGV4dCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfbm90aWZ5X2NiX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKSA9IE5VTEw7Cit2b2lkICgqcGFfY29udGV4dF91bnJlZikocGFfY29udGV4dCopID0gTlVMTDsKKworc2l6ZV90ICgqcGFfZnJhbWVfc2l6ZSkoY29uc3QgcGFfc2FtcGxlX3NwZWMqKSA9IE5VTEw7Cit2b2lkICgqcGFfbWFpbmxvb3BfZnJlZSkocGFfbWFpbmxvb3AqKTsKK3BhX21haW5sb29wX2FwaSogKCpwYV9tYWlubG9vcF9nZXRfYXBpKShwYV9tYWlubG9vcCopID0gTlVMTDsKK2ludCAoKnBhX21haW5sb29wX2l0ZXJhdGUpKHBhX21haW5sb29wKiwgaW50LCBpbnQqKSA9IE5VTEw7CitwYV9tYWlubG9vcCogKCpwYV9tYWlubG9vcF9uZXcpKHZvaWQpID0gTlVMTDsKKwordm9pZCAoKnBhX29wZXJhdGlvbl91bnJlZikocGFfb3BlcmF0aW9uKikgPSBOVUxMOworCitpbnQgKCpwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaykocGFfc3RyZWFtKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYV9idWZmZXJfYXR0ciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfc3RyZWFtX2ZsYWdzX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFfY3ZvbHVtZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfc3RyZWFtKikgPSBOVUxMOworcGFfb3BlcmF0aW9uKiAoKnBhX3N0cmVhbV9jb3JrKShwYV9zdHJlYW0qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKSA9IE5VTEw7CitpbnQgKCpwYV9zdHJlYW1fZGlzY29ubmVjdCkocGFfc3RyZWFtKikgPSBOVUxMOworcGFfc3RyZWFtX3N0YXRlX3QgKCpwYV9zdHJlYW1fZ2V0X3N0YXRlKShwYV9zdHJlYW0qKSA9IE5VTEw7CitpbnQgKCpwYV9zdHJlYW1fZ2V0X3RpbWUpKHBhX3N0cmVhbSosIHBhX3VzZWNfdCopID0gTlVMTDsKK2ludCAoKnBhX3N0cmVhbV9pc19jb3JrZWQpKHBhX3N0cmVhbSopID0gTlVMTDsKK3BhX3N0cmVhbSogKCpwYV9zdHJlYW1fbmV3KShwYV9jb250ZXh0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYV9zYW1wbGVfc3BlYyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFfY2hhbm5lbF9tYXAqKSA9IE5VTEw7Cit2b2lkICgqcGFfc3RyZWFtX3NldF91bmRlcmZsb3dfY2FsbGJhY2spKHBhX3N0cmVhbSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCopID0gTlVMTDsKK3ZvaWQgKCpwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKShwYV9zdHJlYW0qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCopID0gTlVMTDsKK3ZvaWQgKCpwYV9zdHJlYW1fdW5yZWYpKHBhX3N0cmVhbSopID0gTlVMTDsKK3NpemVfdCAoKnBhX3N0cmVhbV93cml0YWJsZV9zaXplKShwYV9zdHJlYW0qKSA9IE5VTEw7CitpbnQgKCpwYV9zdHJlYW1fd3JpdGUpKHBhX3N0cmVhbSosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgIHBhX2ZyZWVfY2JfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFfc2Vla19tb2RlX3QpID0gTlVMTDsKKwordm9pZCBSZXBvcnRTeW1ib2xFcnJvcigpIHsKKyAgU0JfTE9HKEVSUk9SKSA8PCAiUHVsc2UgYXVkaW8gZXJyb3I6ICIgPDwgZGxlcnJvcigpOworICBkbGNsb3NlKHB1bHNlX2xpYl9oYW5kbGUpOworICBwdWxzZV9saWJfaGFuZGxlID0gTlVMTDsKK30KKworYm9vbCBwdWxzZV9sb2FkX2xpYnJhcnkoKSB7CisgIFNCX0RDSEVDSyghcHVsc2VfbGliX2hhbmRsZSk7CisKKyAgcHVsc2VfbGliX2hhbmRsZSA9IGRsb3BlbihrUHVsc2VMaWJyYXJ5TmFtZSwgUlRMRF9MQVpZKTsKKyAgaWYgKCFwdWxzZV9saWJfaGFuZGxlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyNkZWZpbmUgSU5JVFNZTUJPTChzeW1ib2wpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN5bWJvbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxkZWNsdHlwZShzeW1ib2wpPihkbHN5bShwdWxzZV9saWJfaGFuZGxlLCAjc3ltYm9sKSk7IFwKKyAgaWYgKCFzeW1ib2wpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUmVwb3J0U3ltYm9sRXJyb3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisgIElOSVRTWU1CT0wocGFfY29udGV4dF9jb25uZWN0KTsKKyAgSU5JVFNZTUJPTChwYV9jb250ZXh0X2Rpc2Nvbm5lY3QpOworICBJTklUU1lNQk9MKHBhX2NvbnRleHRfZ2V0X3N0YXRlKTsKKyAgSU5JVFNZTUJPTChwYV9jb250ZXh0X25ldyk7CisgIElOSVRTWU1CT0wocGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2spOworICBJTklUU1lNQk9MKHBhX2NvbnRleHRfdW5yZWYpOworICBJTklUU1lNQk9MKHBhX2ZyYW1lX3NpemUpOworICBJTklUU1lNQk9MKHBhX21haW5sb29wX2ZyZWUpOworICBJTklUU1lNQk9MKHBhX21haW5sb29wX2dldF9hcGkpOworICBJTklUU1lNQk9MKHBhX21haW5sb29wX2l0ZXJhdGUpOworICBJTklUU1lNQk9MKHBhX21haW5sb29wX25ldyk7CisgIElOSVRTWU1CT0wocGFfb3BlcmF0aW9uX3VucmVmKTsKKyAgSU5JVFNZTUJPTChwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjayk7CisgIElOSVRTWU1CT0wocGFfc3RyZWFtX2NvcmspOworICBJTklUU1lNQk9MKHBhX3N0cmVhbV9kaXNjb25uZWN0KTsKKyAgSU5JVFNZTUJPTChwYV9zdHJlYW1fZ2V0X3N0YXRlKTsKKyAgSU5JVFNZTUJPTChwYV9zdHJlYW1fZ2V0X3RpbWUpOworICBJTklUU1lNQk9MKHBhX3N0cmVhbV9pc19jb3JrZWQpOworICBJTklUU1lNQk9MKHBhX3N0cmVhbV9uZXcpOworICBJTklUU1lNQk9MKHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrKTsKKyAgSU5JVFNZTUJPTChwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKTsKKyAgSU5JVFNZTUJPTChwYV9zdHJlYW1fdW5yZWYpOworICBJTklUU1lNQk9MKHBhX3N0cmVhbV93cml0YWJsZV9zaXplKTsKKyAgSU5JVFNZTUJPTChwYV9zdHJlYW1fd3JpdGUpOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIHB1bHNlX3VubG9hZF9saWJyYXJ5KCkgeworICBTQl9EQ0hFQ0socHVsc2VfbGliX2hhbmRsZSk7CisKKyAgZGxjbG9zZShwdWxzZV9saWJfaGFuZGxlKTsKKyAgcHVsc2VfbGliX2hhbmRsZSA9IE5VTEw7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwdWxzZQorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvcHVsc2UvcHVsc2VfZHluYW1pY19sb2FkX2Rpc3BhdGNoZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2R5bmFtaWNfbG9hZF9kaXNwYXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlNzQxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3B1bHNlL3B1bHNlX2R5bmFtaWNfbG9hZF9kaXNwYXRjaGVyLmgKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfUFVMU0VfUFVMU0VfRFlOQU1JQ19MT0FEX0RJU1BBVENIRVJfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9QVUxTRV9QVUxTRV9EWU5BTUlDX0xPQURfRElTUEFUQ0hFUl9IXworCisjaW5jbHVkZSA8cHVsc2UvcHVsc2VhdWRpby5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2UgcHVsc2UgeworCitib29sIHB1bHNlX2xvYWRfbGlicmFyeSgpOwordm9pZCBwdWxzZV91bmxvYWRfbGlicmFyeSgpOworCitleHRlcm4gaW50ICgqcGFfY29udGV4dF9jb25uZWN0KShwYV9jb250ZXh0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfY29udGV4dF9mbGFnc190LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFfc3Bhd25fYXBpKik7CitleHRlcm4gdm9pZCAoKnBhX2NvbnRleHRfZGlzY29ubmVjdCkocGFfY29udGV4dCopOworZXh0ZXJuIHBhX2NvbnRleHRfc3RhdGVfdCAoKnBhX2NvbnRleHRfZ2V0X3N0YXRlKShwYV9jb250ZXh0Kik7CitleHRlcm4gcGFfY29udGV4dCogKCpwYV9jb250ZXh0X25ldykocGFfbWFpbmxvb3BfYXBpKiwgY29uc3QgY2hhciopOworZXh0ZXJuIHZvaWQgKCpwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjaykocGFfY29udGV4dCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9jb250ZXh0X25vdGlmeV9jYl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCopOworZXh0ZXJuIHZvaWQgKCpwYV9jb250ZXh0X3VucmVmKShwYV9jb250ZXh0Kik7CisKK2V4dGVybiBzaXplX3QgKCpwYV9mcmFtZV9zaXplKShjb25zdCBwYV9zYW1wbGVfc3BlYyopOworZXh0ZXJuIHZvaWQgKCpwYV9tYWlubG9vcF9mcmVlKShwYV9tYWlubG9vcCopOworZXh0ZXJuIHBhX21haW5sb29wX2FwaSogKCpwYV9tYWlubG9vcF9nZXRfYXBpKShwYV9tYWlubG9vcCopOworZXh0ZXJuIGludCAoKnBhX21haW5sb29wX2l0ZXJhdGUpKHBhX21haW5sb29wKiwgaW50LCBpbnQqKTsKK2V4dGVybiBwYV9tYWlubG9vcCogKCpwYV9tYWlubG9vcF9uZXcpKHZvaWQpOworCitleHRlcm4gdm9pZCAoKnBhX29wZXJhdGlvbl91bnJlZikocGFfb3BlcmF0aW9uKik7CisKK2V4dGVybiBpbnQgKCpwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaykocGFfc3RyZWFtKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhX2J1ZmZlcl9hdHRyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfc3RyZWFtX2ZsYWdzX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhX2N2b2x1bWUqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9zdHJlYW0qKTsKK2V4dGVybiBwYV9vcGVyYXRpb24qICgqcGFfc3RyZWFtX2NvcmspKHBhX3N0cmVhbSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9zdHJlYW1fc3VjY2Vzc19jYl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCopOworZXh0ZXJuIGludCAoKnBhX3N0cmVhbV9kaXNjb25uZWN0KShwYV9zdHJlYW0qKTsKK2V4dGVybiBwYV9zdHJlYW1fc3RhdGVfdCAoKnBhX3N0cmVhbV9nZXRfc3RhdGUpKHBhX3N0cmVhbSopOworZXh0ZXJuIGludCAoKnBhX3N0cmVhbV9nZXRfdGltZSkocGFfc3RyZWFtKiwgcGFfdXNlY190Kik7CitleHRlcm4gaW50ICgqcGFfc3RyZWFtX2lzX2NvcmtlZCkocGFfc3RyZWFtKik7CitleHRlcm4gcGFfc3RyZWFtKiAoKnBhX3N0cmVhbV9uZXcpKHBhX2NvbnRleHQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFfc2FtcGxlX3NwZWMqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYV9jaGFubmVsX21hcCopOworZXh0ZXJuIHZvaWQgKCpwYV9zdHJlYW1fc2V0X3VuZGVyZmxvd19jYWxsYmFjaykocGFfc3RyZWFtKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKTsKK2V4dGVybiB2b2lkICgqcGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjaykocGFfc3RyZWFtKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfc3RyZWFtX3JlcXVlc3RfY2JfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCopOworZXh0ZXJuIHZvaWQgKCpwYV9zdHJlYW1fdW5yZWYpKHBhX3N0cmVhbSopOworZXh0ZXJuIHNpemVfdCAoKnBhX3N0cmVhbV93cml0YWJsZV9zaXplKShwYV9zdHJlYW0qKTsKK2V4dGVybiBpbnQgKCpwYV9zdHJlYW1fd3JpdGUpKHBhX3N0cmVhbSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX2ZyZWVfY2JfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9zZWVrX21vZGVfdCk7CisKK30gIC8vIG5hbWVzcGFjZSBwdWxzZQorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfUFVMU0VfUFVMU0VfRFlOQU1JQ19MT0FEX0RJU1BBVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19nZXRfbWF4X2NoYW5uZWxzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19nZXRfbWF4X2NoYW5uZWxzXzVfMS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hdWRpb19zaW5rX2dldF9tYXhfY2hhbm5lbHMuY2MKcmVuYW1lIHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfZ2V0X21heF9jaGFubmVsc181XzEuY2MKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19nZXRfbmVhcmVzdF9zdXBwb3J0ZWRfc2FtcGxlX2ZyZXF1ZW5jeS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfZ2V0X25lYXJlc3Rfc3VwcG9ydGVkX3NhbXBsZV9mcmVxdWVuY3kuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYXVkaW9fc2lua19nZXRfbmVhcmVzdF9zdXBwb3J0ZWRfc2FtcGxlX2ZyZXF1ZW5jeS5jYwpyZW5hbWUgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19nZXRfbmVhcmVzdF9zdXBwb3J0ZWRfc2FtcGxlX2ZyZXF1ZW5jeS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hdWRpb19zaW5rX2lzX2F1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZV9zdXBwb3J0ZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2lzX2F1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZV9zdXBwb3J0ZWRfaW50ZXJsZWF2ZWRfb25seS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hdWRpb19zaW5rX2lzX2F1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZV9zdXBwb3J0ZWQuY2MKcmVuYW1lIHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaXNfYXVkaW9fZnJhbWVfc3RvcmFnZV90eXBlX3N1cHBvcnRlZF9pbnRlcmxlYXZlZF9vbmx5LmNjCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pc19hdWRpb19zYW1wbGVfdHlwZV9zdXBwb3J0ZWRfZmxvYXQzMl9vbmx5LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjCnJlbmFtZSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2lzX2F1ZGlvX3NhbXBsZV90eXBlX3N1cHBvcnRlZF9mbG9hdDMyX29ubHkuY2MKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kZWNvZGVfdGFyZ2V0L2RlY29kZV90YXJnZXRfY29udGV4dF9ydW5uZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZGVjb2RlX3RhcmdldC9kZWNvZGVfdGFyZ2V0X2NvbnRleHRfcnVubmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWRkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZGVjb2RlX3RhcmdldC9kZWNvZGVfdGFyZ2V0X2NvbnRleHRfcnVubmVyLmNjCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQvZGVjb2RlX3RhcmdldF9jb250ZXh0X3J1bm5lci5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2UgZGVjb2RlX3RhcmdldCB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgUnVubmVyVGFyZ2V0SGVscGVyKHZvaWQqIHJ1bm5lcl90YXJnZXRfY29udGV4dCkgeworICBTQl9EQ0hFQ0socnVubmVyX3RhcmdldF9jb250ZXh0KTsKKworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4mIGZ1bmN0b3IgPQorICAgICAgKnN0YXRpY19jYXN0PHN0ZDo6ZnVuY3Rpb248dm9pZCgpPio+KHJ1bm5lcl90YXJnZXRfY29udGV4dCk7CisgIGZ1bmN0b3IoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0RlY29kZVRhcmdldENvbnRleHRSdW5uZXI6OkRlY29kZVRhcmdldENvbnRleHRSdW5uZXIoCisgICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciogcHJvdmlkZXIpCisgICAgOiBwcm92aWRlcl8ocHJvdmlkZXIpIHsKKyAgU0JfRENIRUNLKHByb3ZpZGVyXyk7Cit9CisKK3ZvaWQgRGVjb2RlVGFyZ2V0Q29udGV4dFJ1bm5lcjo6UnVuT25HbGVzQ29udGV4dCgKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZnVuY3Rpb24pIHsKKyAgU2JEZWNvZGVUYXJnZXRSdW5JbkdsZXNDb250ZXh0KHByb3ZpZGVyXywgUnVubmVyVGFyZ2V0SGVscGVyLCAmZnVuY3Rpb24pOworfQorCit9ICAvLyBuYW1lc3BhY2UgZGVjb2RlX3RhcmdldAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQvZGVjb2RlX3RhcmdldF9jb250ZXh0X3J1bm5lci5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQvZGVjb2RlX3RhcmdldF9jb250ZXh0X3J1bm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmViMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZGVjb2RlX3RhcmdldC9kZWNvZGVfdGFyZ2V0X2NvbnRleHRfcnVubmVyLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX0RFQ09ERV9UQVJHRVRfREVDT0RFX1RBUkdFVF9DT05URVhUX1JVTk5FUl9IXworI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9ERUNPREVfVEFSR0VUX0RFQ09ERV9UQVJHRVRfQ09OVEVYVF9SVU5ORVJfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2UgZGVjb2RlX3RhcmdldCB7CisKK2NsYXNzIERlY29kZVRhcmdldENvbnRleHRSdW5uZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRGVjb2RlVGFyZ2V0Q29udGV4dFJ1bm5lcigKKyAgICAgIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIHByb3ZpZGVyKTsKKyAgdm9pZCBSdW5PbkdsZXNDb250ZXh0KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jdGlvbik7CisKKyBwcml2YXRlOgorICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBwcm92aWRlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZGVjb2RlX3RhcmdldAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX0RFQ09ERV9UQVJHRVRfREVDT0RFX1RBUkdFVF9DT05URVhUX1JVTk5FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL2NvZGVjX3V0aWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvY29kZWNfdXRpbC5jYwppbmRleCA3MzZhNDU0Li42YTgzODI2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvY29kZWNfdXRpbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvY29kZWNfdXRpbC5jYwpAQCAtNDksNiArNDksOSBAQAogICBpZiAoU2JTdHJpbmdDb21wYXJlQWxsKGNvZGVjLCAiYWMtMyIpID09IDApIHsKICAgICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjQWMzOwogICB9CisgIGlmIChTYlN0cmluZ0NvbXBhcmVBbGwoY29kZWMsICJlYy0zIikgPT0gMCkgeworICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNFYWMzOworICB9CiAjZW5kaWYgIC8vIFNCX0hBUyhBQzNfQVVESU8pCiAgIGlmIChTYlN0cmluZ0NvbXBhcmUoY29kZWMsICJvcHVzIiwgNCkgPT0gMCkgewogICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzOwpAQCAtNjAsNiArNjMsMTMgQEAKIH0KIAogU2JNZWRpYVZpZGVvQ29kZWMgR2V0VmlkZW9Db2RlY0Zyb21TdHJpbmcoY29uc3QgY2hhciogY29kZWMpIHsKKyAgaWYgKFNiU3RyaW5nQ29tcGFyZShjb2RlYywgImF2MDEuIiwgNSkgPT0gMCkgeworI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfSEFTX0FWMV9WRVJTSU9OCisgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY1ZwMTA7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfSEFTX0FWMV9WRVJTSU9OCisgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY0F2MTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9IQVNfQVYxX1ZFUlNJT04KKyAgfQogICBpZiAoU2JTdHJpbmdDb21wYXJlKGNvZGVjLCAiYXZjMS4iLCA1KSA9PSAwIHx8CiAgICAgICBTYlN0cmluZ0NvbXBhcmUoY29kZWMsICJhdmMzLiIsIDUpID09IDApIHsKICAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NDsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9jYW5fcGxheV9taW1lX2FuZF9rZXlfc3lzdGVtLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2Nhbl9wbGF5X21pbWVfYW5kX2tleV9zeXN0ZW0uY2MKaW5kZXggOWEzZWY1NS4uZjdiODM3OCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2Nhbl9wbGF5X21pbWVfYW5kX2tleV9zeXN0ZW0uY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2Nhbl9wbGF5X21pbWVfYW5kX2tleV9zeXN0ZW0uY2MKQEAgLTY3LDYgKzY3LDggQEAKICNpZiBTQl9IQVMoQUMzX0FVRElPKQogICAgIGNhc2Uga1NiTWVkaWFBdWRpb0NvZGVjQWMzOgogICAgICAgcmV0dXJuIG1pbWVfdHlwZS5zdWJ0eXBlKCkgPT0gIm1wNCI7CisgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29kZWNFYWMzOgorICAgICAgcmV0dXJuIG1pbWVfdHlwZS5zdWJ0eXBlKCkgPT0gIm1wNCI7CiAjZW5kaWYgIC8vIFNCX0hBUyhBQzNfQVVESU8pCiAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzOgogICAgIGNhc2Uga1NiTWVkaWFBdWRpb0NvZGVjVm9yYmlzOgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZF9hYWNfYW5kX29wdXMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkX2FhY19hbmRfb3B1cy5jYwppbmRleCA2NmMyMTYwLi45NzcyZTMwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkX2FhY19hbmRfb3B1cy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfYXVkaW9fc3VwcG9ydGVkX2FhY19hbmRfb3B1cy5jYwpAQCAtMTksOSArMTksMTUgQEAKIAogU0JfRVhQT1JUIGJvb2wgU2JNZWRpYUlzQXVkaW9TdXBwb3J0ZWQoU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUpIHsKLSAgaWYgKGF1ZGlvX2NvZGVjICE9IGtTYk1lZGlhQXVkaW9Db2RlY0FhYyAmJgotICAgICAgYXVkaW9fY29kZWMgIT0ga1NiTWVkaWFBdWRpb0NvZGVjT3B1cykgewotICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGF1ZGlvX2NvZGVjID09IGtTYk1lZGlhQXVkaW9Db2RlY0FhYykgeworICAgIHJldHVybiBiaXRyYXRlIDw9IFNCX01FRElBX01BWF9BVURJT19CSVRSQVRFX0lOX0JJVFNfUEVSX1NFQ09ORDsKICAgfQotICByZXR1cm4gYml0cmF0ZSA8PSBTQl9NRURJQV9NQVhfQVVESU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQ7CisKKyNpZiBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCisgIGlmIChhdWRpb19jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzKSB7CisgICAgcmV0dXJuIGJpdHJhdGUgPD0gU0JfTUVESUFfTUFYX0FVRElPX0JJVFJBVEVfSU5fQklUU19QRVJfU0VDT05EOworICB9CisjZW5kaWYgIC8vIFNCX0hBUyhBVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKKworICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2FyZ3MuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2FyZ3MuY2MKaW5kZXggNzEwYTU0OS4uZTg0ODZiMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9hcmdzLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfYXJncy5jYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXRfd2FpdGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCiAKICNpZm5kZWYgTkVUX0FSR1NfUE9SVAogI2RlZmluZSBORVRfQVJHU19QT1JUIDQ5MzU1CkBAIC03OCwxMiArNzksMjAgQEAKICAgU2JTb2NrZXRXYWl0ZXJEZXN0cm95KHdhaXRlcik7CiB9CiAKLXNjb3BlZF9wdHI8U29ja2V0PiBXYWl0Rm9yQ2xpZW50Q29ubmVjdGlvbihTb2NrZXQqIGxpc3Rlbl9zb2NrKSB7CitzY29wZWRfcHRyPFNvY2tldD4gV2FpdEZvckNsaWVudENvbm5lY3Rpb24oU29ja2V0KiBsaXN0ZW5fc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlRpbWUgdGltZW91dCkgeworICBTYlRpbWVNb25vdG9uaWMgZXhwaXJlX3RpbWUgPQorICAgICAgKHRpbWVvdXQgPj0gMCkgJiYgKHRpbWVvdXQgPCBrU2JUaW1lTWF4KT8KKyAgICAgIFNiVGltZUdldE1vbm90b25pY05vdygpICsgdGltZW91dCA6CisgICAgICBrU2JUaW1lTWF4OwogICB3aGlsZSAodHJ1ZSkgewogICAgIHNjb3BlZF9wdHI8U29ja2V0PiBjbGllbnRfY29ubmVjdGlvbihsaXN0ZW5fc29jay0+QWNjZXB0KCkpOwogICAgIGlmIChjbGllbnRfY29ubmVjdGlvbikgewogICAgICAgcmV0dXJuIGNsaWVudF9jb25uZWN0aW9uLlBhc3MoKTsKICAgICB9CisgICAgaWYgKFNiVGltZUdldE1vbm90b25pY05vdygpID4gZXhwaXJlX3RpbWUpIHsKKyAgICAgIHJldHVybiBzY29wZWRfcHRyPFNvY2tldD4oKTsKKyAgICB9CiAgICAgU2JUaHJlYWRTbGVlcChrU2JUaW1lTWlsbGlzZWNvbmQpOwogICB9CiB9CkBAIC0xMDYsMTAgKzExNSwxNCBAQAogLy8gc2hvdWxkIGJlIGNhbGxlZC4KIGNvbnN0IGNoYXIga05ldEFyZ3NDb21tYW5kU3dpdGNoV2FpdFtdID0gIm5ldF9hcmdzX3dhaXRfZm9yX2Nvbm5lY3Rpb24iOwogCi0vLyBXYWl0cyB1bnRpbC4KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOZXRBcmdzV2FpdEZvclBheWxvYWQoKSB7CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmV0QXJnc1dhaXRGb3JQYXlsb2FkKFNiVGltZSB0aW1lb3V0KSB7CiAgIHNjb3BlZF9wdHI8U29ja2V0PiBsaXN0ZW4gPSBDcmVhdGVMaXN0ZW5Tb2NrZXQoKTsKLSAgc2NvcGVkX3B0cjxTb2NrZXQ+IGNsaWVudF9jb25uZWN0aW9uID0gV2FpdEZvckNsaWVudENvbm5lY3Rpb24obGlzdGVuLmdldCgpKTsKKyAgc2NvcGVkX3B0cjxTb2NrZXQ+IGNsaWVudF9jb25uZWN0aW9uID0KKyAgICAgIFdhaXRGb3JDbGllbnRDb25uZWN0aW9uKGxpc3Rlbi5nZXQoKSwgdGltZW91dCk7CisgIGlmICghY2xpZW50X2Nvbm5lY3Rpb24pIHsKKyAgICBTQl9MT0coRVJST1IpIDw8ICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbmV0IGFyZ3MuIjsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KCk7CisgIH0KIAogICBzdGQ6OnN0cmluZyBzdHJfYnVmZjsKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9hcmdzLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2FyZ3MuaAppbmRleCA5NTFkNDE3Li44MWQ5OWI0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2FyZ3MuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2FyZ3MuaApAQCAtMzcsNiArMzcsOCBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgorCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC00Niw3ICs0OCw4IEBACiBleHRlcm4gY29uc3QgY2hhciBrTmV0QXJnc0NvbW1hbmRTd2l0Y2hXYWl0W107CiAKIC8vIFdhaXRzIHVudGlsIGFyZ3Mgc3RyZWFtIGluIHdpdGggYSBzb2NrZXQgY29ubmVjdGlvbiBhbmQgZGF0YSByZWNlcHRpb24uCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmV0QXJnc1dhaXRGb3JQYXlsb2FkKCk7CisvLyBBIHRpbWVvdXQgdmFsdWUgb2YgPCAwIHdpbGwgc2lnbmFsIGluZmluaXRlIHRpbWVvdXQuCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmV0QXJnc1dhaXRGb3JQYXlsb2FkKFNiVGltZSB0aW1lb3V0KTsKIAogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAogfSAgLy8gbmFtZXNwYWNlIHNoYXJlZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9sb2cuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5jYwppbmRleCA1MjVjYzA3Li40NDQ3ZDgzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5jYwpAQCAtNDQ2LDExICs0NDYsMjAgQEAKIAogY29uc3QgY2hhciBrTmV0TG9nQ29tbWFuZFN3aXRjaFdhaXRbXSA9ICJuZXRfbG9nX3dhaXRfZm9yX2Nvbm5lY3Rpb24iOwogCi12b2lkIE5ldExvZ1dhaXRGb3JDbGllbnRDb25uZWN0ZWQoKSB7Cit2b2lkIE5ldExvZ1dhaXRGb3JDbGllbnRDb25uZWN0ZWQoU2JUaW1lIHRpbWVvdXQpIHsKICNpZiAhU0JfTE9HR0lOR19JU19PRkZJQ0lBTF9CVUlMRAogICBTY29wZUd1YXJkIGd1YXJkOwogICBpZiAoZ3VhcmQuSXNFbmFibGVkKCkpIHsKLSAgICB3aGlsZSAoIU5ldExvZ1NlcnZlcjo6SW5zdGFuY2UoKS0+SGFzQ2xpZW50Q29ubmVjdGVkKCkpIHsKKyAgICBTYlRpbWVNb25vdG9uaWMgZXhwaXJlX3RpbWUgPSAodGltZW91dCA+PSAwKSAmJiAodGltZW91dCA8IGtTYlRpbWVNYXgpPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiVGltZUdldE1vbm90b25pY05vdygpICsgdGltZW91dCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiVGltZU1heDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKE5ldExvZ1NlcnZlcjo6SW5zdGFuY2UoKS0+SGFzQ2xpZW50Q29ubmVjdGVkKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoU2JUaW1lR2V0TW9ub3RvbmljTm93KCkgPiBleHBpcmVfdGltZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICAgIFNiVGhyZWFkU2xlZXAoa1NiVGltZU1pbGxpc2Vjb25kKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfbG9nLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5oCmluZGV4IGI5MmJjYWQuLjFkZmQ0MTYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfbG9nLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9sb2cuaApAQCAtMzYsNiArMzYsNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHNoYXJlZCB7CkBAIC00NSw5ICs0Niw5IEBACiAvLyBzaG91bGQgYmUgY2FsbGVkLgogZXh0ZXJuIGNvbnN0IGNoYXIga05ldExvZ0NvbW1hbmRTd2l0Y2hXYWl0W107CiAKLS8vIE9wdGlvbmFsIC0gUGF1c2VzIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLS8vIGEgY2xpZW50IGhhcyBjb25uZWN0ZWQuCi12b2lkIE5ldExvZ1dhaXRGb3JDbGllbnRDb25uZWN0ZWQoKTsKKy8vIE9wdGlvbmFsIC0gUGF1c2VzIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgYSBjbGllbnQgaGFzCisvLyBjb25uZWN0ZWQuIEEgdGltZW91dCB2YWx1ZSBvZiA8IDAgd2lsbCBzaWduYWwgaW5maW5pdGUgdGltZW91dC4KK3ZvaWQgTmV0TG9nV2FpdEZvckNsaWVudENvbm5lY3RlZChTYlRpbWUgdGltZW91dCk7CiAKIC8vIFdyaXRlcyB0byB0aGUgbmV0bG9nIGJ1ZmZlciBzb2NrZXQgc3RyZWFtLgogLy8gTm90ZSB0aGF0IHRoZSBOZXRMb2cgaXMgY29tcGxldGVseSBkaXNhYmxlZCBmb3Igb2ZmaWNpYWwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKaW5kZXggNWUzNzMyNy4uYzE5NTY1NCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKQEAgLTcxLDI3ICs3MSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2ZyYW1lc19wZXJfYXBwZW5kKQogICAgIDogbWF4X2NhY2hlZF9mcmFtZXNfKG1heF9jYWNoZWRfZnJhbWVzKSwKICAgICAgIG1heF9mcmFtZXNfcGVyX2FwcGVuZF8obWF4X2ZyYW1lc19wZXJfYXBwZW5kKSwKLSAgICAgIGVvc19zdGF0ZV8oa0VPU05vdFJlY2VpdmVkKSwKICAgICAgIGNoYW5uZWxzXyhhdWRpb19oZWFkZXIubnVtYmVyX29mX2NoYW5uZWxzKSwKICAgICAgIHNpbmtfc2FtcGxlX3R5cGVfKEdldFNpbmtBdWRpb1NhbXBsZVR5cGUoYXVkaW9fcmVuZGVyZXJfc2luay5nZXQoKSkpLAogICAgICAgYnl0ZXNfcGVyX2ZyYW1lXyhtZWRpYTo6R2V0Qnl0ZXNQZXJTYW1wbGUoc2lua19zYW1wbGVfdHlwZV8pICogY2hhbm5lbHNfKSwKLSAgICAgIHBsYXliYWNrX3JhdGVfKDEuMCksCi0gICAgICBwYXVzZWRfKHRydWUpLAotICAgICAgY29uc3VtZV9mcmFtZXNfY2FsbGVkXyhmYWxzZSksCi0gICAgICBzZWVraW5nXyhmYWxzZSksCi0gICAgICBzZWVraW5nX3RvX3RpbWVfKDApLAotICAgICAgbGFzdF9tZWRpYV90aW1lXygwKSwKLSAgICAgIGVuZGVkX2NiX2NhbGxlZF8oZmFsc2UpLAogICAgICAgZnJhbWVfYnVmZmVyXyhtYXhfY2FjaGVkX2ZyYW1lc18gKiBieXRlc19wZXJfZnJhbWVfKSwKLSAgICAgIGZyYW1lc19zZW50X3RvX3NpbmtfKDApLAotICAgICAgcGVuZGluZ19kZWNvZGVyX291dHB1dHNfKDApLAotICAgICAgZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfKDApLAogICAgICAgZnJhbWVzX2NvbnN1bWVkX3NldF9hdF8oU2JUaW1lR2V0TW9ub3RvbmljTm93KCkpLAogICAgICAgZGVjb2Rlcl8oZGVjb2Rlci5QYXNzKCkpLAotICAgICAgY2FuX2FjY2VwdF9tb3JlX2RhdGFfKHRydWUpLAogICAgICAgcHJvY2Vzc19hdWRpb19kYXRhX2pvYl8oCiAgICAgICAgICAgc3RkOjpiaW5kKCZBdWRpb1JlbmRlcmVyOjpQcm9jZXNzQXVkaW9EYXRhLCB0aGlzKSksCi0gICAgICBmaXJzdF9pbnB1dF93cml0dGVuXyhmYWxzZSksCiAgICAgICBhdWRpb19yZW5kZXJlcl9zaW5rXyhhdWRpb19yZW5kZXJlcl9zaW5rLlBhc3MoKSkgewogICBTQl9EQ0hFQ0soZGVjb2Rlcl8gIT0gTlVMTCk7CiAgIFNCX0RDSEVDSyhtYXhfZnJhbWVzX3Blcl9hcHBlbmRfID4gMCk7CkBAIC0yNTUsOCArMjQyLDggQEAKICAgICB0aW1lX3N0cmV0Y2hlcl8uRmx1c2hCdWZmZXJzKCk7CiAgIH0KIAotICBmcmFtZXNfc2VudF90b19zaW5rXyA9IDA7Ci0gIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyA9IDA7CisgIHRvdGFsX2ZyYW1lc19zZW50X3RvX3NpbmtfID0gMDsKKyAgdG90YWxfZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfID0gMDsKICAgZnJhbWVzX2NvbnN1bWVkX2J5X3Npbmtfc2luY2VfbGFzdF9nZXRfY3VycmVudF90aW1lXyA9IDA7CiAgIHBlbmRpbmdfZGVjb2Rlcl9vdXRwdXRzXyA9IDA7CiAgIGF1ZGlvX2ZyYW1lX3RyYWNrZXJfLlJlc2V0KCk7CkBAIC0yNzAsNiArMjU3LDcgQEAKICAgb2Zmc2V0X2luX2ZyYW1lc19vbl9zaW5rX3RocmVhZF8gPSAwOwogICBmcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfID0gMDsKICAgc2lsZW5jZV9mcmFtZXNfd3JpdHRlbl9hZnRlcl9lb3Nfb25fc2lua190aHJlYWRfID0gMDsKKyAgc2lsZW5jZV9mcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfID0gMDsKIAogICBpZiAoZmlyc3RfaW5wdXRfd3JpdHRlbl8pIHsKICAgICBkZWNvZGVyXy0+UmVzZXQoKTsKQEAgLTM2MSw5ICszNDksMTEgQEAKICAgICAgICAgICAgICAgICAgIDw8IGZyYW1lc19jb25zdW1lZF9zZXRfYXRfIDw8ICI9IiA8PCBlbGFzcGVkX3NpbmNlX2xhc3Rfc2V0CiAgICAgICAgICAgICAgICAgICA8PCAiKSArICIgPDwgdG90YWxfZnJhbWVzX2NvbnN1bWVkXyA8PCAiID0+ICIgPDwgZnJhbWVzX3BsYXllZAogICAgICAgICAgICAgICAgICAgPDwgIiA9PiAiIDw8IG1lZGlhX3RpbWUgPDwgIiAgZHJpZnQ6ICIgPDwgZHJpZnQgPDwgIi8gKCIKLSAgICAgICAgICAgICAgICAgIDw8IG1pbl9kcmlmdF8gPDwgIiwgIiA8PCBtYXhfZHJpZnRfIDw8ICIpICIKKyAgICAgICAgICAgICAgICAgIDw8IG1pbl9kcmlmdF8gPDwgIiwgIiA8PCBtYXhfZHJpZnRfCisgICAgICAgICAgICAgICAgICA8PCAiKSAiCiAgICAgICAgICAgICAgICAgICAvLyBIb3cgbG9uZyB0aGUgYXVkaW8gZnJhbWVzIGxlZnQgaW4gc2luayBjYW4gYmUgcGxheWVkLgotICAgICAgICAgICAgICAgICAgPDwgKGZyYW1lc19zZW50X3RvX3NpbmtfIC0gZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfKSAqCisgICAgICAgICAgICAgICAgICA8PCAodG90YWxfZnJhbWVzX3NlbnRfdG9fc2lua18gLQorICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2ZyYW1lc19jb25zdW1lZF9ieV9zaW5rXykgKgogICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlRpbWVTZWNvbmQgLyBzYW1wbGVzX3Blcl9zZWNvbmQ7CiAgIH0KICNlbmRpZiAgLy8gU0JfTE9HX01FRElBX1RJTUVfU1RBVFMKQEAgLTQwOCw2ICszOTgsOSBAQAogICAgICAgICAoKm9mZnNldF9pbl9mcmFtZXMgKyAqZnJhbWVzX2luX2J1ZmZlcikgJSBtYXhfY2FjaGVkX2ZyYW1lc187CiAgICAgc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGUgPQogICAgICAgICBzdGQ6Om1pbihzaWxlbmNlX2ZyYW1lc190b193cml0ZSwgbWF4X2NhY2hlZF9mcmFtZXNfIC0gc3RhcnRfb2Zmc2V0KTsKKyAgICBTQl9EQ0hFQ0soc3RhcnRfb2Zmc2V0ID49IDApOworICAgIFNCX0RDSEVDSyhzaWxlbmNlX2ZyYW1lc190b193cml0ZSA+PSAwKTsKKyAgICBTQl9EQ0hFQ0soc3RhcnRfb2Zmc2V0ICsgc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGUgPD0gbWF4X2NhY2hlZF9mcmFtZXNfKTsKICAgICBTYk1lbW9yeVNldChmcmFtZV9idWZmZXJfLmRhdGEoKSArIHN0YXJ0X29mZnNldCAqIGJ5dGVzX3Blcl9mcmFtZV8sIDAsCiAgICAgICAgICAgICAgICAgc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGUgKiBieXRlc19wZXJfZnJhbWVfKTsKICAgICBzaWxlbmNlX2ZyYW1lc193cml0dGVuX2FmdGVyX2Vvc19vbl9zaW5rX3RocmVhZF8gKz0gc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGU7CkBAIC00NTUsMzIgKzQ0OCwzNiBAQAogICBtdXRleF8uRENoZWNrQWNxdWlyZWQoKTsKIAogICBpZiAoZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyA+IDApIHsKLSAgICBTQl9EQ0hFQ0soZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfICsgZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyA8PQotICAgICAgICAgICAgICBmcmFtZXNfc2VudF90b19zaW5rXyArCisgICAgU0JfRENIRUNLKHRvdGFsX2ZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyArIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8gKworICAgICAgICAgICAgICAgICAgc2lsZW5jZV9mcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfIDw9CisgICAgICAgICAgICAgIHRvdGFsX2ZyYW1lc19zZW50X3RvX3NpbmtfICsKICAgICAgICAgICAgICAgICAgIHNpbGVuY2VfZnJhbWVzX3dyaXR0ZW5fYWZ0ZXJfZW9zX29uX3NpbmtfdGhyZWFkXyk7CiAgICAgYXV0byBub25fc2lsZW5jZV9mcmFtZXNfY29uc3VtZWQgPQotICAgICAgICBzdGQ6Om1pbihmcmFtZXNfc2VudF90b19zaW5rXyAtIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXywKKyAgICAgICAgc3RkOjptaW4odG90YWxfZnJhbWVzX3NlbnRfdG9fc2lua18gLSB0b3RhbF9mcmFtZXNfY29uc3VtZWRfYnlfc2lua18sCiAgICAgICAgICAgICAgICAgIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8pOwotICAgIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyArPSBub25fc2lsZW5jZV9mcmFtZXNfY29uc3VtZWQ7CisgICAgdG90YWxfZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfICs9IG5vbl9zaWxlbmNlX2ZyYW1lc19jb25zdW1lZDsKICAgICBmcmFtZXNfY29uc3VtZWRfYnlfc2lua19zaW5jZV9sYXN0X2dldF9jdXJyZW50X3RpbWVfICs9CiAgICAgICAgIG5vbl9zaWxlbmNlX2ZyYW1lc19jb25zdW1lZDsKICAgICBpZiAobm9uX3NpbGVuY2VfZnJhbWVzX2NvbnN1bWVkICE9IDApIHsKICAgICAgIGZyYW1lc19jb25zdW1lZF9zZXRfYXRfID0gc3lzdGVtX3RpbWVfb25fY29uc3VtZV9mcmFtZXM7CiAgICAgfQogICAgIGNvbnN1bWVfZnJhbWVzX2NhbGxlZF8gPSB0cnVlOwotICAgIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8gLT0gbm9uX3NpbGVuY2VfZnJhbWVzX2NvbnN1bWVkOworICAgIHNpbGVuY2VfZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyA9CisgICAgICAgIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8gLSBub25fc2lsZW5jZV9mcmFtZXNfY29uc3VtZWQ7CisgICAgZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyA9IDA7CiAgIH0KIAogICBpc19lb3NfcmVhY2hlZF9vbl9zaW5rX3RocmVhZF8gPSBlb3Nfc3RhdGVfID49IGtFT1NTZW50VG9TaW5rOwogICBmcmFtZXNfaW5fYnVmZmVyX29uX3NpbmtfdGhyZWFkXyA9IHN0YXRpY19jYXN0PGludD4oCi0gICAgICBmcmFtZXNfc2VudF90b19zaW5rXyArIHNpbGVuY2VfZnJhbWVzX3dyaXR0ZW5fYWZ0ZXJfZW9zX29uX3NpbmtfdGhyZWFkXyAtCi0gICAgICBmcmFtZXNfY29uc3VtZWRfYnlfc2lua18gLSBmcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfKTsKKyAgICAgIHRvdGFsX2ZyYW1lc19zZW50X3RvX3NpbmtfICsKKyAgICAgIHNpbGVuY2VfZnJhbWVzX3dyaXR0ZW5fYWZ0ZXJfZW9zX29uX3NpbmtfdGhyZWFkXyAtCisgICAgICB0b3RhbF9mcmFtZXNfY29uc3VtZWRfYnlfc2lua18gLSBzaWxlbmNlX2ZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8pOwogICB1bmRlcmZsb3dfIHw9CiAgICAgICBmcmFtZXNfaW5fYnVmZmVyX29uX3NpbmtfdGhyZWFkXyA8IGtGcmFtZXNJbkJ1ZmZlckJlZ2luVW5kZXJmbG93OwogICBpc19wbGF5aW5nX29uX3NpbmtfdGhyZWFkXyA9ICFwYXVzZWRfICYmICFzZWVraW5nXyAmJiAhdW5kZXJmbG93XzsKLSAgb2Zmc2V0X2luX2ZyYW1lc19vbl9zaW5rX3RocmVhZF8gPQotICAgICAgKGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyArIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8pICUKLSAgICAgIG1heF9jYWNoZWRfZnJhbWVzXzsKKyAgb2Zmc2V0X2luX2ZyYW1lc19vbl9zaW5rX3RocmVhZF8gPSAodG90YWxfZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW5jZV9mcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfKSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2NhY2hlZF9mcmFtZXNfOwogfQogCiB2b2lkIEF1ZGlvUmVuZGVyZXI6Ok9uRmlyc3RPdXRwdXQoKSB7CkBAIC01MjcsNyArNTI0LDcgQEAKIGJvb2wgQXVkaW9SZW5kZXJlcjo6SXNFbmRPZlN0cmVhbVBsYXllZF9Mb2NrZWQoKSBjb25zdCB7CiAgIG11dGV4Xy5EQ2hlY2tBY3F1aXJlZCgpOwogICByZXR1cm4gZW9zX3N0YXRlXyA+PSBrRU9TU2VudFRvU2luayAmJgotICAgICAgICAgZnJhbWVzX3NlbnRfdG9fc2lua18gPT0gZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfOworICAgICAgICAgdG90YWxfZnJhbWVzX3NlbnRfdG9fc2lua18gPT0gdG90YWxfZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfOwogfQogCiB2b2lkIEF1ZGlvUmVuZGVyZXI6Ok9uRGVjb2RlckNvbnN1bWVkKCkgewpAQCAtNjMyLDcgKzYyOSw4IEBACiAgIGlmIChpc19mcmFtZV9idWZmZXJfZnVsbCkgewogICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBhdWRpbyBkYXRhIG5vdCBhcHBlbmRlZCBzbyBzY2hlZHVsZSBhIGNhbGxiYWNrIGxhdGVyLgogICAgIFNiVGltZU1vbm90b25pYyBkZWxheSA9IDA7Ci0gICAgaW50NjRfdCBmcmFtZXNfaW5fYnVmZmVyID0gZnJhbWVzX3NlbnRfdG9fc2lua18gLSBmcmFtZXNfY29uc3VtZWRfYnlfc2lua187CisgICAgaW50NjRfdCBmcmFtZXNfaW5fYnVmZmVyID0KKyAgICAgICAgdG90YWxfZnJhbWVzX3NlbnRfdG9fc2lua18gLSB0b3RhbF9mcmFtZXNfY29uc3VtZWRfYnlfc2lua187CiAgICAgaWYgKG1heF9jYWNoZWRfZnJhbWVzXyAtIGZyYW1lc19pbl9idWZmZXIgPCBtYXhfY2FjaGVkX2ZyYW1lc18gLyA0KSB7CiAgICAgICBpbnQgZnJhbWVzX3RvX2RlbGF5ID0gc3RhdGljX2Nhc3Q8aW50PigKICAgICAgICAgICBtYXhfY2FjaGVkX2ZyYW1lc18gLyA0IC0gKG1heF9jYWNoZWRfZnJhbWVzXyAtIGZyYW1lc19pbl9idWZmZXIpKTsKQEAgLTY2MSwxNSArNjU5LDE1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaW50IGZyYW1lc19pbl9idWZmZXIgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50PihmcmFtZXNfc2VudF90b19zaW5rXyAtIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyk7CisgIGludCBmcmFtZXNfaW5fYnVmZmVyID0gc3RhdGljX2Nhc3Q8aW50Pih0b3RhbF9mcmFtZXNfc2VudF90b19zaW5rXyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9mcmFtZXNfY29uc3VtZWRfYnlfc2lua18pOwogCiAgIGlmIChtYXhfY2FjaGVkX2ZyYW1lc18gLSBmcmFtZXNfaW5fYnVmZmVyIDwgbWF4X2ZyYW1lc19wZXJfYXBwZW5kXykgewogICAgICppc19mcmFtZV9idWZmZXJfZnVsbCA9IHRydWU7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaW50IG9mZnNldF90b19hcHBlbmQgPSBmcmFtZXNfc2VudF90b19zaW5rXyAlIG1heF9jYWNoZWRfZnJhbWVzXzsKKyAgaW50IG9mZnNldF90b19hcHBlbmQgPSB0b3RhbF9mcmFtZXNfc2VudF90b19zaW5rXyAlIG1heF9jYWNoZWRfZnJhbWVzXzsKIAogICBzY29wZWRfcmVmcHRyPERlY29kZWRBdWRpbz4gZGVjb2RlZF9hdWRpbyA9CiAgICAgICB0aW1lX3N0cmV0Y2hlcl8uUmVhZChtYXhfZnJhbWVzX3Blcl9hcHBlbmRfLCBwbGF5YmFja19yYXRlXyk7CkBAIC03MDQsNyArNzAyLDcgQEAKICAgICAgICAgICAgICAgIHNvdXJjZV9idWZmZXIsIGZyYW1lc190b19hcHBlbmQgKiBieXRlc19wZXJfZnJhbWVfKTsKICAgZnJhbWVzX2FwcGVuZGVkICs9IGZyYW1lc190b19hcHBlbmQ7CiAKLSAgZnJhbWVzX3NlbnRfdG9fc2lua18gKz0gZnJhbWVzX2FwcGVuZGVkOworICB0b3RhbF9mcmFtZXNfc2VudF90b19zaW5rXyArPSBmcmFtZXNfYXBwZW5kZWQ7CiAKICAgcmV0dXJuIGZyYW1lc19hcHBlbmRlZCA+IDA7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaAppbmRleCAzZGMzYTE1Li5jMGI5MDFlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgKQEAgLTExMSwyMiArMTExLDIyIEBACiAKICAgTXV0ZXggbXV0ZXhfOwogCi0gIGJvb2wgcGF1c2VkXzsKLSAgYm9vbCBjb25zdW1lX2ZyYW1lc19jYWxsZWRfOwotICBib29sIHNlZWtpbmdfOwotICBTYlRpbWUgc2Vla2luZ190b190aW1lXzsKLSAgU2JUaW1lIGxhc3RfbWVkaWFfdGltZV87CisgIGJvb2wgcGF1c2VkXyA9IHRydWU7CisgIGJvb2wgY29uc3VtZV9mcmFtZXNfY2FsbGVkXyA9IGZhbHNlOworICBib29sIHNlZWtpbmdfID0gZmFsc2U7CisgIFNiVGltZSBzZWVraW5nX3RvX3RpbWVfID0gMDsKKyAgU2JUaW1lIGxhc3RfbWVkaWFfdGltZV8gPSAwOwogICBBdWRpb0ZyYW1lVHJhY2tlciBhdWRpb19mcmFtZV90cmFja2VyXzsKLSAgYm9vbCBlbmRlZF9jYl9jYWxsZWRfOworICBib29sIGVuZGVkX2NiX2NhbGxlZF8gPSBmYWxzZTsKIAotICBpbnQ2NF90IGZyYW1lc19zZW50X3RvX3NpbmtfOwotICBpbnQ2NF90IGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXzsKKyAgaW50NjRfdCB0b3RhbF9mcmFtZXNfc2VudF90b19zaW5rXyA9IDA7CisgIGludDY0X3QgdG90YWxfZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfID0gMDsKICAgaW50MzJfdCBmcmFtZXNfY29uc3VtZWRfYnlfc2lua19zaW5jZV9sYXN0X2dldF9jdXJyZW50X3RpbWVfOwogCiAgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBkZWNvZGVyXzsKIAogICBpbnQ2NF90IGZyYW1lc19jb25zdW1lZF9zZXRfYXRfOwotICBkb3VibGUgcGxheWJhY2tfcmF0ZV87CisgIGRvdWJsZSBwbGF5YmFja19yYXRlXyA9IDEuMDsKIAogICAvLyBBdWRpb1JlbmRlcmVyU2luayBtZXRob2RzCiAgIHZvaWQgR2V0U291cmNlU3RhdHVzKGludCogZnJhbWVzX2luX2J1ZmZlciwKQEAgLTE1MCw3ICsxNTAsNyBAQAogICB2b2lkIEZpbGxSZXNhbXBsZXJBbmRUaW1lU3RyZXRjaGVyKCk7CiAgIGJvb2wgQXBwZW5kQXVkaW9Ub0ZyYW1lQnVmZmVyKGJvb2wqIGlzX2ZyYW1lX2J1ZmZlcl9mdWxsKTsKIAotICBFT1NTdGF0ZSBlb3Nfc3RhdGVfOworICBFT1NTdGF0ZSBlb3Nfc3RhdGVfID0ga0VPU05vdFJlY2VpdmVkOwogICBjb25zdCBpbnQgY2hhbm5lbHNfOwogICBjb25zdCBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNpbmtfc2FtcGxlX3R5cGVfOwogICBjb25zdCBpbnQgYnl0ZXNfcGVyX2ZyYW1lXzsKQEAgLTE2Miw5ICsxNjIsOSBAQAogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBmcmFtZV9idWZmZXJfOwogICB1aW50OF90KiBmcmFtZV9idWZmZXJzX1sxXTsKIAotICBpbnQzMl90IHBlbmRpbmdfZGVjb2Rlcl9vdXRwdXRzXzsKKyAgaW50MzJfdCBwZW5kaW5nX2RlY29kZXJfb3V0cHV0c18gPSAwOwogCi0gIGJvb2wgY2FuX2FjY2VwdF9tb3JlX2RhdGFfOworICBib29sIGNhbl9hY2NlcHRfbW9yZV9kYXRhXyA9IHRydWU7CiAgIEpvYlF1ZXVlOjpKb2JUb2tlbiBwcm9jZXNzX2F1ZGlvX2RhdGFfam9iX3Rva2VuXzsKICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHByb2Nlc3NfYXVkaW9fZGF0YV9qb2JfOwogCkBAIC0xNzMsNyArMTczLDcgQEAKICAgLy8gc29tZSBwbGF0Zm9ybXMsIHNvIHdlIG1ha2UgYW4gZWZmb3J0IHRvIGltcHJvdmUgcGxheWJhY2sgc3RhcnR1cAogICAvLyBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIHRyYWNrIG9mIHdoZXRoZXIgd2UgYWxyZWFkeSBoYXZlIGEgZnJlc2ggZGVjb2RlciwKICAgLy8gYW5kIGNhbiB0aHVzIGF2b2lkIGRvaW5nIGEgZnVsbCByZXNldC4KLSAgYm9vbCBmaXJzdF9pbnB1dF93cml0dGVuXzsKKyAgYm9vbCBmaXJzdF9pbnB1dF93cml0dGVuXyA9IGZhbHNlOwogCiAgIHNjb3BlZF9wdHI8QXVkaW9SZW5kZXJlclNpbms+IGF1ZGlvX3JlbmRlcmVyX3NpbmtfOwogICBib29sIGlzX2Vvc19yZWFjaGVkX29uX3NpbmtfdGhyZWFkXyA9IGZhbHNlOwpAQCAtMTgzLDYgKzE4Myw3IEBACiAgIGludDY0X3QgZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyA9IDA7CiAgIFNiVGltZSBmcmFtZXNfY29uc3VtZWRfc2V0X2F0X29uX3NpbmtfdGhyZWFkXyA9IDA7CiAgIGludDY0X3Qgc2lsZW5jZV9mcmFtZXNfd3JpdHRlbl9hZnRlcl9lb3Nfb25fc2lua190aHJlYWRfID0gMDsKKyAgaW50NjRfdCBzaWxlbmNlX2ZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8gPSAwOwogCiAjaWYgU0JfTE9HX01FRElBX1RJTUVfU1RBVFMKICAgU2JUaW1lIHN5c3RlbV9hbmRfbWVkaWFfdGltZV9vZmZzZXRfID0gLTE7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5jYwppbmRleCAwOTk3MTBlLi5iMDExMDBiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MKQEAgLTY1LDcgKzY1LDcgQEAKICAgaWYgKGF1ZGlvX2NvZGVjICE9IGtTYk1lZGlhQXVkaW9Db2RlY05vbmUpIHsKICAgICBhdWRpb19oZWFkZXJfID0gKmF1ZGlvX2hlYWRlcjsKIAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDYKKyNpZiBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAgICAgaWYgKGF1ZGlvX2hlYWRlcl8uYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUgPiAwKSB7CiAgICAgICBhdWRpb19zcGVjaWZpY19jb25maWdfLnJlc2V0KAogICAgICAgICAgIG5ldyBpbnQ4X3RbYXVkaW9faGVhZGVyXy5hdWRpb19zcGVjaWZpY19jb25maWdfc2l6ZV0pOwpAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICAgICAgICAgICAgIGF1ZGlvX2hlYWRlci0+YXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOwogICAgICAgYXVkaW9faGVhZGVyXy5hdWRpb19zcGVjaWZpY19jb25maWcgPSBhdWRpb19zcGVjaWZpY19jb25maWdfLmdldCgpOwogICAgIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNgorI2VuZGlmICAvLyBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAgIH0KIAogICB1cGRhdGVfam9iXyA9IHN0ZDo6YmluZCgmRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpVcGRhdGUsIHRoaXMpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oCmluZGV4IDhmYTE1N2QuLmI5ZWNiY2EgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgKQEAgLTg3LDExICs4NywxMSBAQAogICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlY187CiAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjXzsKICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbV87Ci0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gNgorI2lmIFNCX0hBUyhBVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKICAgLy8gU3RvcmUgYSBjb3B5IG9mIHxTYk1lZGlhQXVkaW9IZWFkZXI6OmF1ZGlvX3NwZWNpZmljX2NvbmZpZ3wgcGFzc2VkIHRvIHRoZQogICAvLyBjdG9yIHNvIGl0IGlzIHZhbGlkIGZvciB0aGUgbGlmZSB0aW1lIG9mIHRoZSBwbGF5ZXIgd29ya2VyLgogICBzY29wZWRfYXJyYXk8aW50OF90PiBhdWRpb19zcGVjaWZpY19jb25maWdfOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSA2CisjZW5kaWYgIC8vIFNCX0hBUyhBVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKICAgU2JNZWRpYUF1ZGlvSGVhZGVyIGF1ZGlvX2hlYWRlcl87CiAKICAgLy8gfG1lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF98IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgbWVkaWEgcGxheWJhY2sgdGltZSB3aGVuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmNjCmluZGV4IGQ1NGI2MDEuLjZkMzExYjMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmNjCkBAIC0xNDMsNiArMTQzLDExIEBACiAgIFNCX0RDSEVDSyhqb2IpOwogICBTQl9EQ0hFQ0soZGVsYXkgPj0gMCkgPDwgZGVsYXk7CiAKKyAgU2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOworICBpZiAoc3RvcHBlZF8pIHsKKyAgICByZXR1cm4gSm9iVG9rZW4oKTsKKyAgfQorCiAgICsrY3VycmVudF9qb2JfdG9rZW5fOwogCiAgIEpvYlRva2VuIGpvYl90b2tlbihjdXJyZW50X2pvYl90b2tlbl8pOwpAQCAtMTUxLDEwICsxNTYsNyBAQAogICBqb2JfcmVjb3JkLnN0YWNrX3NpemUgPQogICAgICAgU2JTeXN0ZW1HZXRTdGFjayhqb2JfcmVjb3JkLnN0YWNrLCBrUHJvZmlsZVN0YWNrRGVwdGgpOwogI2VuZGlmICAvLyBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORwotICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKG11dGV4Xyk7Ci0gIGlmIChzdG9wcGVkXykgewotICAgIHJldHVybiBKb2JUb2tlbigpOwotICB9CisKICAgU2JUaW1lTW9ub3RvbmljIHRpbWVfdG9fcnVuX2pvYiA9IFNiVGltZUdldE1vbm90b25pY05vdygpICsgZGVsYXk7CiAgIGJvb2wgaXNfZmlyc3Rfam9iID0gdGltZV90b19qb2JfcmVjb3JkX21hcF8uZW1wdHkoKSB8fAogICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdG9fcnVuX2pvYiA8IHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmJlZ2luKCktPmZpcnN0OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmgKaW5kZXggZTFlZDBjOS4uZGQxY2YxYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgLy8gYmUgcnVuLgogICBib29sIFRyeVRvUnVuT25lSm9iKGJvb2wgd2FpdF9mb3JfbmV4dF9qb2IpOwogCi0gIFNiVGhyZWFkSWQgdGhyZWFkX2lkXzsKKyAgY29uc3QgU2JUaHJlYWRJZCB0aHJlYWRfaWRfOwogICBNdXRleCBtdXRleF87CiAgIENvbmRpdGlvblZhcmlhYmxlIGNvbmRpdGlvbl87CiAgIGludDY0X3QgY3VycmVudF9qb2JfdG9rZW5fID0gSm9iVG9rZW46OmtJbnZhbGlkVG9rZW4gKyAxOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YS9iZW5lYXRoX3RoZV9jYW5vcHlfYXZjX2FhYy5kbXAgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3Rlc3RkYXRhL2JlbmVhdGhfdGhlX2Nhbm9weV9hdmNfYWFjLmRtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjNjc1Mi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3Rlc3RkYXRhL2JlbmVhdGhfdGhlX2Nhbm9weV9hdmNfYWFjLmRtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvYmVuZWF0aF90aGVfY2Fub3B5X3ZwOV9vcHVzLmRtcCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvYmVuZWF0aF90aGVfY2Fub3B5X3ZwOV9vcHVzLmRtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ2NjNmOS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3Rlc3RkYXRhL2JlbmVhdGhfdGhlX2Nhbm9weV92cDlfb3B1cy5kbXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uY2MKaW5kZXggMWYyMTVmNS4uY2QxNjE1ZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX2NvbW1vbi5jYwpAQCAtMTAwLDE2ICsxMDAsMTYgQEAKICAgUmVhZChyZWFkX2NiLCByZXZlcnNlX2J5dGVfb3JkZXIsICZhdWRpb19oZWFkZXItPmF1ZGlvX3NwZWNpZmljX2NvbmZpZ19zaXplKTsKICAgYXVkaW9faGVhZGVyLT5zdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnLnJlc2l6ZSgKICAgICAgIGF1ZGlvX2hlYWRlci0+YXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOwotI2lmIFNCX0FQSV9WRVJTSU9OID49IDYKKyNpZiBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAgIGF1ZGlvX2hlYWRlci0+YXVkaW9fc3BlY2lmaWNfY29uZmlnID0KICAgICAgIGF1ZGlvX2hlYWRlci0+c3RvcmVkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZy5kYXRhKCk7Ci0jZWxzZQorI2Vsc2UgICAvLyBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAgIFNCX0RDSEVDSyhzaXplb2YoYXVkaW9faGVhZGVyLT5hdWRpb19zcGVjaWZpY19jb25maWcpID49CiAgICAgICAgICAgICBhdWRpb19oZWFkZXItPnN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcuc2l6ZSgpKTsKICAgU2JNZW1vcnlDb3B5KGF1ZGlvX2hlYWRlci0+YXVkaW9fc3BlY2lmaWNfY29uZmlnLAogICAgICAgICAgICAgICAgYXVkaW9faGVhZGVyLT5zdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnLmRhdGEoKSwKICAgICAgICAgICAgICAgIGF1ZGlvX2hlYWRlci0+c3RvcmVkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZy5zaXplKCkpOwotI2VuZGlmCisjZW5kaWYgIC8vIFNCX0hBUyhBVURJT19TUEVDSUZJQ19DT05GSUdfQVNfUE9JTlRFUikKICAgUmVhZChyZWFkX2NiLCBhdWRpb19oZWFkZXItPnN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcuZGF0YSgpLAogICAgICAgIGF1ZGlvX2hlYWRlci0+YXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uaAppbmRleCBmZWJjNzdjLi5kMWY1Mjc1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uaApAQCAtNzIsMTMgKzcyLDEzIEBACiAgIFNiTWVkaWFBdWRpb0hlYWRlcldpdGhDb25maWcoY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyV2l0aENvbmZpZyYgdGhhdCkKICAgICAgIDogU2JNZWRpYUF1ZGlvSGVhZGVyKHRoYXQpLAogICAgICAgICBzdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnKHRoYXQuc3RvcmVkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZykgewotI2lmIFNCX0FQSV9WRVJTSU9OID49IDYKKyNpZiBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAgICAgYXVkaW9fc3BlY2lmaWNfY29uZmlnID0gc3RvcmVkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZy5kYXRhKCk7Ci0jZWxzZQorI2Vsc2UgICAvLyBTQl9IQVMoQVVESU9fU1BFQ0lGSUNfQ09ORklHX0FTX1BPSU5URVIpCiAgICAgU0JfRENIRUNLKDggPj0gc3RvcmVkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZy5zaXplKCkpOwogICAgIFNiTWVtb3J5Q29weShhdWRpb19zcGVjaWZpY19jb25maWcsIHN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcuZGF0YSgpLAogICAgICAgICAgICAgICAgICBzdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnLnNpemUoKSk7Ci0jZW5kaWYKKyNlbmRpZiAgLy8gU0JfSEFTKEFVRElPX1NQRUNJRklDX0NPTkZJR19BU19QT0lOVEVSKQogICB9CiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlcldpdGhDb25maWcmIHRoYXQpID0gZGVsZXRlOwogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9jbGVhcl9wbGF0Zm9ybV9lcnJvci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2NsZWFyX3BsYXRmb3JtX2Vycm9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTA2MTNhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2NsZWFyX3BsYXRmb3JtX2Vycm9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi12b2lkIFNiU3lzdGVtQ2xlYXJQbGF0Zm9ybUVycm9yKFNiU3lzdGVtUGxhdGZvcm1FcnJvciBoYW5kbGUpIHsKLSAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihoYW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X2V4dGVuc2lvbnMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfZXh0ZW5zaW9ucy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDlmMTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X2V4dGVuc2lvbnMuY2MKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgorCit2b2lkKiBTYlN5c3RlbUdldEV4dGVuc2lvbihjb25zdCBjaGFyKikgeworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX3JhaXNlX3BsYXRmb3JtX2Vycm9yLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fcmFpc2VfcGxhdGZvcm1fZXJyb3IuY2MKaW5kZXggNjYwNDdhMC4uOGMyODFiZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fcmFpc2VfcGxhdGZvcm1fZXJyb3IuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fcmFpc2VfcGxhdGZvcm1fZXJyb3IuY2MKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX0NMRUFSX1BMQVRGT1JNX0VSUk9SX1ZFUlNJT04KIFNiU3lzdGVtUGxhdGZvcm1FcnJvciBTYlN5c3RlbVJhaXNlUGxhdGZvcm1FcnJvcigKICAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JUeXBlIHR5cGUsCiAgICAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yQ2FsbGJhY2sgY2FsbGJhY2ssCkBAIC00MiwzICs0MywyMiBAQAogICBTQl9ETE9HKElORk8pIDw8ICJTYlN5c3RlbVJhaXNlUGxhdGZvcm1FcnJvcjogIiA8PCBtZXNzYWdlOwogICByZXR1cm4ga1NiU3lzdGVtUGxhdGZvcm1FcnJvckludmFsaWQ7CiB9CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX0NMRUFSX1BMQVRGT1JNX0VSUk9SX1ZFUlNJT04KK2Jvb2wgU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IoU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhKSB7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoY2FsbGJhY2spOworICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHVzZXJfZGF0YSk7CisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2Uga1NiU3lzdGVtUGxhdGZvcm1FcnJvclR5cGVDb25uZWN0aW9uRXJyb3I6CisgICAgICBtZXNzYWdlID0gIkNvbm5lY3Rpb24gZXJyb3IuIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtZXNzYWdlID0gIjx1bmtub3duPiI7CisgICAgICBicmVhazsKKyAgfQorICBTQl9ETE9HKElORk8pIDw8ICJTYlN5c3RlbVJhaXNlUGxhdGZvcm1FcnJvcjogIiA8PCBtZXNzYWdlOworICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX0NMRUFSX1BMQVRGT1JNX0VSUk9SX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvd2luZG93X29uX3NjcmVlbl9rZXlib2FyZF9zdWdnZXN0aW9uc19zdXBwb3J0ZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3dpbmRvd19vbl9zY3JlZW5fa2V5Ym9hcmRfc3VnZ2VzdGlvbnNfc3VwcG9ydGVkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjlkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3dpbmRvd19vbl9zY3JlZW5fa2V5Ym9hcmRfc3VnZ2VzdGlvbnNfc3VwcG9ydGVkLmNjCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKKworI2lmIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfT05fU0NSRUVOX0tFWUJPQVJEX1NVR0dFU1RJT05TX1ZFUlNJT04KK2Jvb2wgU2JXaW5kb3dPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnNTdXBwb3J0ZWQoU2JXaW5kb3cgd2luZG93KSB7CisgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfT05fU0NSRUVOX0tFWUJPQVJEX1NVR0dFU1RJT05TX1ZFUlNJT04KKyNlbmRpZiAgLy8gU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvd2luZG93X3VwZGF0ZV9vbl9zY3JlZW5fa2V5Ym9hcmRfc3VnZ2VzdGlvbnMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3dpbmRvd191cGRhdGVfb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDU3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3dpbmRvd191cGRhdGVfb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zLmNjCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKKworI2lmIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfT05fU0NSRUVOX0tFWUJPQVJEX1NVR0dFU1RJT05TX1ZFUlNJT04KK3ZvaWQgU2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMoU2JXaW5kb3cgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWdnZXN0aW9uc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N1Z2dlc3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0KSB7fQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9PTl9TQ1JFRU5fS0VZQk9BUkRfU1VHR0VTVElPTlNfVkVSU0lPTgorI2VuZGlmICAvLyBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2lkZXZpbmUvZHJtX3N5c3RlbV93aWRldmluZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL2RybV9zeXN0ZW1fd2lkZXZpbmUuY2MKaW5kZXggMzA5YjY1Mi4uNDcxYjE2MyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2lkZXZpbmUvZHJtX3N5c3RlbV93aWRldmluZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aWRldmluZS9kcm1fc3lzdGVtX3dpZGV2aW5lLmNjCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL3dpZGV2aW5lX3N0b3JhZ2UuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL3dpZGV2aW5lX3RpbWVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgpAQCAtMTkwLDYgKzE5MSwxOSBAQAogICAgICAgdGlja2V0X3RocmVhZF9pZF8oU2JUaHJlYWRHZXRJZCgpKSB7CiAgIFNCX0RDSEVDSyghY29tcGFueV9uYW1lLmVtcHR5KCkpOwogICBTQl9EQ0hFQ0soIW1vZGVsX25hbWUuZW1wdHkoKSk7CisKKyNpZiAhZGVmaW5lZChDT0JBTFRfQlVJTERfVFlQRV9HT0xEKQorICB1c2luZyBzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb247CisKKyAgYXV0byBjb21tYW5kX2xpbmUgPSBBcHBsaWNhdGlvbjo6R2V0KCktPkdldENvbW1hbmRMaW5lKCk7CisgIGF1dG8gdmFsdWUgPSBjb21tYW5kX2xpbmUtPkdldFN3aXRjaFZhbHVlKCJtYXhpbXVtX2RybV9zZXNzaW9uX3VwZGF0ZXMiKTsKKyAgaWYgKCF2YWx1ZS5lbXB0eSgpKSB7CisgICAgbWF4aW11bV9udW1iZXJfb2Zfc2Vzc2lvbl91cGRhdGVzXyA9IFNiU3RyaW5nQVRvSSh2YWx1ZS5jX3N0cigpKTsKKyAgICBTQl9MT0coSU5GTykgPDwgIkxpbWl0IGRybSBzZXNzaW9uIHVwZGF0ZXMgdG8gIgorICAgICAgICAgICAgICAgICA8PCBtYXhpbXVtX251bWJlcl9vZl9zZXNzaW9uX3VwZGF0ZXNfOworICB9CisjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX0dPTEQpCisKICAgRW5zdXJlV2lkZXZpbmVDZG1Jc0luaXRpYWxpemVkKGNvbXBhbnlfbmFtZSwgbW9kZWxfbmFtZSk7CiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTAKICAgY29uc3QgYm9vbCBrRW5hYmxlUHJpdmFjeU1vZGUgPSB0cnVlOwpAQCAtNjc0LDYgKzY4OCwyMCBAQAogICBpbnQgdGlja2V0ID0gR2V0QW5kUmVzZXRUaWNrZXQoc2JfZHJtX3Nlc3Npb25faWQpOwogCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTAKKworI2lmICFkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX0dPTEQpCisgIGlmIChudW1iZXJfb2Zfc2Vzc2lvbl91cGRhdGVzX3NlbnRfID4gbWF4aW11bV9udW1iZXJfb2Zfc2Vzc2lvbl91cGRhdGVzXykgeworICAgIFNCX0xPRyhJTkZPKSA8PCAiTnVtYmVyIG9mIGRybSBzZXNzaW9ucyBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzZXNzaW9uIgorICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IG1heGltdW1fbnVtYmVyX29mX3Nlc3Npb25fdXBkYXRlc18gPDwgIiksIGZhaWwgdGhlIgorICAgICAgICAgICAgICAgICA8PCAiIGN1cnJlbnQgdXBkYXRlIHJlcXVlc3Qgd2l0aCBxdW90YSBleGNlZWRlZCBlcnJvciI7CisgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9jYWxsYmFja18oCisgICAgICAgIHRoaXMsIGNvbnRleHRfLCB0aWNrZXQsIGtTYkRybVN0YXR1c1F1b3RhRXhjZWVkZWRFcnJvciwgdHlwZSwgIiIsIE5VTEwsCisgICAgICAgIDAsIG1lc3NhZ2UuY19zdHIoKSwgc3RhdGljX2Nhc3Q8aW50PihtZXNzYWdlLnNpemUoKSksIE5VTEwpOworICAgIHJldHVybjsKKyAgfQorICArK251bWJlcl9vZl9zZXNzaW9uX3VwZGF0ZXNfc2VudF87CisjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX0dPTEQpCisKICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9jYWxsYmFja18oCiAgICAgICB0aGlzLCBjb250ZXh0XywgdGlja2V0LCBrU2JEcm1TdGF0dXNTdWNjZXNzLCB0eXBlLCAiIiwKICAgICAgIHNiX2RybV9zZXNzaW9uX2lkLmNfc3RyKCksIHN0YXRpY19jYXN0PGludD4oc2JfZHJtX3Nlc3Npb25faWQuc2l6ZSgpKSwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL2RybV9zeXN0ZW1fd2lkZXZpbmUuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL2RybV9zeXN0ZW1fd2lkZXZpbmUuaAppbmRleCAwZDg1MDliLi5kOTg3M2E0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aWRldmluZS9kcm1fc3lzdGVtX3dpZGV2aW5lLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2lkZXZpbmUvZHJtX3N5c3RlbV93aWRldmluZS5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lERVZJTkVfRFJNX1NZU1RFTV9XSURFVklORV9IXwogI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJREVWSU5FX0RSTV9TWVNURU1fV0lERVZJTkVfSF8KIAorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTE5OCw2ICsxOTksMTEgQEAKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTAKIAogICB2b2xhdGlsZSBib29sIHF1aXR0aW5nXyA9IGZhbHNlOworCisjaWYgIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKyAgaW50IG51bWJlcl9vZl9zZXNzaW9uX3VwZGF0ZXNfc2VudF8gPSAwOworICBpbnQgbWF4aW11bV9udW1iZXJfb2Zfc2Vzc2lvbl91cGRhdGVzXyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX0dPTEQpCiB9OwogCiB9ICAvLyBuYW1lc3BhY2Ugd2lkZXZpbmUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL3dpZGV2aW5lMy5neXAgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aWRldmluZS93aWRldmluZTMuZ3lwCmluZGV4IDc3NzYxYWUuLjcwZmZiNjQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL3dpZGV2aW5lMy5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2lkZXZpbmUvd2lkZXZpbmUzLmd5cApAQCAtNDIsOSArNDIsNyBAQAogICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYycsCiAgICAgXSwKICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L29wZW5zc2wvb3BlbnNzbC5neXA6b3BlbnNzbCcsCi0gICAgICAjIERlcGVuZCBvbiB0aGUgbG9jYWxseS1idWlsdCBwcm90b2MuCi0gICAgICAjJzwoREVQVEgpL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLmd5cDpwcm90b2MjaG9zdCcsCisgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2JvcmluZ3NzbC5neXA6Y3J5cHRvJywKICAgICBdLAogICB9LAogICAndGFyZ2V0cyc6IFsKQEAgLTUyLDcgKzUwLDYgQEAKICAgICAgICd0YXJnZXRfbmFtZSc6ICdvZW1jcnlwdG8nLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAogICAgICAgJ2RlZmluZXMnOiBbCi0gICAgICAgICdVU0VfQlVJTFRfT1BFTlNTTCcsCiAgICAgICAgICdDT0JBTFRfV0lERVZJTkVfS0VZQk9YX1RSQU5TRk9STV9GVU5DVElPTj08KHNiX3dpZGV2aW5lX3BsYXRmb3JtKV9jbGllbnQnLAogICAgICAgICAnQ09CQUxUX1dJREVWSU5FX0tFWUJPWF9UUkFOU0ZPUk1fSU5DTFVERT0ic3RhcmJvYXJkL2tleWJveGVzLzwoc2Jfd2lkZXZpbmVfcGxhdGZvcm0pLzwoc2Jfd2lkZXZpbmVfcGxhdGZvcm0pLmgiJywKICAgICAgICAgJ0NPQkFMVF9XSURFVklORV9LRVlCT1hfSU5DTFVERT0iPChERVBUSCkvc3RhcmJvYXJkL2tleWJveGVzLzwoc2Jfd2lkZXZpbmVfcGxhdGZvcm0pX3dpZGV2aW5lX2tleWJveC5oIicsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvYXBwbGljYXRpb25feDExLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvYXBwbGljYXRpb25feDExLmgKaW5kZXggZWNkZWRkMy4uZGUzYmMyNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS9hcHBsaWNhdGlvbl94MTEuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgIm5iL3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cCBiL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cAppbmRleCA2NTg3MTQ1Li41ZDY2NGMzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZC5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmQuZ3lwCkBAIC0yMSw2ICsyMSwyMSBAQAogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFyYm9hcmQnLAogICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydzYl9ldmVyZ3JlZW4gPT0gMScsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zdGFyYm9hcmRfaGVhZGVyc19vbmx5Lmd5cDpzdGFyYm9hcmRfaGVhZGVyc19vbmx5JywKKyAgICAgICAgICBdLAorICAgICAgICB9LCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICdzdGFyYm9hcmRfZnVsbCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFyYm9hcmRfZnVsbCcsCisgICAgICAndHlwZSc6ICdub25lJywKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS88KHN0YXJib2FyZF9wYXRoKS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwOnN0YXJib2FyZF9wbGF0Zm9ybScsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvZXp0aW1lL2V6dGltZS5neXA6ZXp0aW1lJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkLnN5bXMgYi9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZC5zeW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2E3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZC5zeW1zCkBAIC0wLDAgKzEsMyBAQAoreworICBTYio7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmRfYmFzZV90YXJnZXQuZ3lwaSBiL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkX2Jhc2VfdGFyZ2V0Lmd5cGkKaW5kZXggZTI4Yjg1NC4uNDI1YmQ2NSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmRfYmFzZV90YXJnZXQuZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZF9iYXNlX3RhcmdldC5neXBpCkBAIC00Niw2ICs0NiwxMSBAQAogICAgICAgICAnU0JfSVNfTElCUkFSWT0xJywKICAgICAgIF0sCiAgICAgfV0sCisgICAgWydzYl9ldmVyZ3JlZW49PTEnLCB7CisgICAgICAnZGVmaW5lcyc6IFsKKyAgICAgICAgJ1NCX0lTX0VWRVJHUkVFTj0xJywKKyAgICAgIF0sCisgICAgfV0sCiAgICAgWydzdGFyYm9hcmRfcGF0aCA9PSAiIicsIHsKICAgICAgICdkZWZpbmVzJzogWwogICAgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gdXNlIHRoZSBDIHByZXByb2Nlc3NvciB0byBkbwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmRfaGVhZGVyc19vbmx5Lmd5cCBiL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkX2hlYWRlcnNfb25seS5neXAKaW5kZXggNTNhZjIyMC4uOGRlNjIxNSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmRfaGVhZGVyc19vbmx5Lmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZF9oZWFkZXJzX29ubHkuZ3lwCkBAIC00MCw2ICs0MCw3IEBACiAgICAgICAgICdldmVudC5oJywKICAgICAgICAgJ2V4cG9ydC5oJywKICAgICAgICAgJ2ZpbGUuaCcsCisgICAgICAgICdmb3JtYXRfc3RyaW5nLmgnLAogICAgICAgICAnaW5wdXQuaCcsCiAgICAgICAgICdrZXkuaCcsCiAgICAgICAgICdsb2cuaCcsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0cmluZy5oIGIvc3JjL3N0YXJib2FyZC9zdHJpbmcuaAppbmRleCA1NDU4NTZjLi45MzJjZjQ0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0cmluZy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc3RyaW5nLmgKQEAgLTQwNCw2ICs0MDQsNyBAQAogfSAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX01PVkVfRk9STUFUX1NUUklOR19WRVJTSU9OCiAjaWZkZWYgX19jcGx1c3BsdXMKIAogZXh0ZXJuICJDKysiIHsKQEAgLTQzOCw1ICs0MzksNiBAQAogfSAgLy8gZXh0ZXJuICJDKysiCiAKICNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9NT1ZFX0ZPUk1BVF9TVFJJTkdfVkVSU0lPTgogCiAjZW5kaWYgIC8vIFNUQVJCT0FSRF9TVFJJTkdfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9CVUlMRC5nbiBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9CVUlMRC5nbgppbmRleCBmZDU1MzcyLi5jZmViMWJhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvQlVJTEQuZ24KKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL0JVSUxELmduCkBAIC0zNTUsNyArMzU1LDYgQEAKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2JpbmFyeV9zZWFyY2guY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fYnJlYWtfaW50b19kZWJ1Z2dlci5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9jbGVhcl9sYXN0X2Vycm9yLmNjIiwKLSAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2NsZWFyX3BsYXRmb3JtX2Vycm9yLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF9jb25uZWN0aW9uX3R5cGUuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X2RldmljZV90eXBlLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF9lcnJvcl9zdHJpbmcuY2MiLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCA1YjhjYTQ2Li4wNzgzMjUyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMTY3LDYgKzE2NywxMCBAQAogLy8gaGVhZGVycy4gSXQgbWF5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludCBpbiBmYXZvciBvZiBhIGRpZmZlcmVudCBzb2x1dGlvbi4KICN1bmRlZiBTQl9IQVNfUVVJUktfU09DS0VUX0JTRF9IRUFERVJTCiAKKy8vIFNvbWUgcGxhdGZvcm1zIGRvbid0IHN1cHBvcnQgZ210aW1lX3IuIFBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIHRoZSBjYXNlCisvLyBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgcXVpcmsuCisjdW5kZWYgU0JfSEFTX1FVSVJLX05PX0dNVElNRV9SCisKIC8vIC0tLSBDb21waWxlciBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUaGUgcGxhdGZvcm0ncyBhbm5vdGF0aW9uIGZvciBmb3JjaW5nIGEgQyBmdW5jdGlvbiB0byBiZSBpbmxpbmVkLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdHViL3N0dWJfc291cmNlcy5neXBpIGIvc3JjL3N0YXJib2FyZC9zdHViL3N0dWJfc291cmNlcy5neXBpCmluZGV4IDc4YWY3MTAuLmI1NTc4YjEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9zdHViX3NvdXJjZXMuZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL3N0dWIvc3R1Yl9zb3VyY2VzLmd5cGkKQEAgLTIyNSwxMCArMjI1LDEwIEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2JpbmFyeV9zZWFyY2guY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9icmVha19pbnRvX2RlYnVnZ2VyLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fY2xlYXJfbGFzdF9lcnJvci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2NsZWFyX3BsYXRmb3JtX2Vycm9yLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X2Nvbm5lY3Rpb25fdHlwZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF9kZXZpY2VfdHlwZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF9lcnJvcl9zdHJpbmcuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3N5c3RlbV9nZXRfZXh0ZW5zaW9ucy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF9sYXN0X2Vycm9yLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X2xvY2FsZV9pZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF9udW1iZXJfb2ZfcHJvY2Vzc29ycy5jYycsCkBAIC0yODcsNyArMjg3LDkgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi93aW5kb3dfZ2V0X2RpYWdvbmFsX3NpemVfaW5faW5jaGVzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi93aW5kb3dfZ2V0X3BsYXRmb3JtX2hhbmRsZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvd2luZG93X2dldF9zaXplLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi93aW5kb3dfb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zX3N1cHBvcnRlZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvd2luZG93X3NldF9kZWZhdWx0X29wdGlvbnMuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3dpbmRvd191cGRhdGVfb25fc2NyZWVuX2tleWJvYXJkX3N1Z2dlc3Rpb25zLmNjJywKICAgICBdLAogICB9LAogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zeXN0ZW0uaCBiL3NyYy9zdGFyYm9hcmQvc3lzdGVtLmgKaW5kZXggOGUwZjU2NC4uNjA2ODdhNSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zeXN0ZW0uaAorKysgYi9zcmMvc3RhcmJvYXJkL3N5c3RlbS5oCkBAIC0yMzksNiArMjM5LDcgQEAKIC8vIFByaXZhdGUgc3RydWN0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcmFpc2VkIHBsYXRmb3JtIGVycm9yLgogdHlwZWRlZiBzdHJ1Y3QgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZSBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfQ0xFQVJfUExBVEZPUk1fRVJST1JfVkVSU0lPTgogLy8gT3BhcXVlIGhhbmRsZSByZXR1cm5lZCBieSB8U2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3J8IHRoYXQgY2FuIGJlIHBhc3NlZAogLy8gdG8gfFNiU3lzdGVtQ2xlYXJQbGF0Zm9ybUVycm9yfC4KIHR5cGVkZWYgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZSogU2JTeXN0ZW1QbGF0Zm9ybUVycm9yOwpAQCAtMjgyLDEzICsyODMsNDEgQEAKIFNiU3lzdGVtUmFpc2VQbGF0Zm9ybUVycm9yKFNiU3lzdGVtUGxhdGZvcm1FcnJvclR5cGUgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfQ0xFQVJfUExBVEZPUk1fRVJST1JfVkVSU0lPTgorLy8gQ29iYWx0IGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gbm90aWZ5IHRoZSBwbGF0Zm9ybSB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZAorLy8gaW4gdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlIHBsYXRmb3JtIG1heSBuZWVkIHRvIGhhbmRsZS4gVGhlIHBsYXRmb3JtIGlzCisvLyBleHBlY3RlZCB0byB0aGVuIG5vdGlmeSB0aGUgdXNlciBvZiB0aGUgZXJyb3IgYW5kIHRvIHByb3ZpZGUgYSBtZWFucyBmb3IKKy8vIGFueSByZXF1aXJlZCBpbnRlcmFjdGlvbiwgc3VjaCBhcyBieSBzaG93aW5nIGEgZGlhbG9nLgorLy8KKy8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBib29sZWFuLiBJZiB0aGUgcGxhdGZvcm0gY2Fubm90IHJlc3BvbmQgdG8gdGhlIGVycm9yLAorLy8gdGhlbiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gfGZhbHNlfCwgb3RoZXJ3aXNlIGl0IHNob3VsZCByZXR1cm4gfHRydWV8LgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQsIGFuZCBpdCBpcyB0aGUgcGxhdGZvcm0ncworLy8gcmVzcG9uc2liaWxpdHkgdG8gZGVjaWRlIGhvdyB0byBoYW5kbGUgYW4gZXJyb3IgcmVjZWl2ZWQgd2hpbGUgYSBwcmV2aW91cworLy8gZXJyb3IgaXMgc3RpbGwgcGVuZGluZy4gSWYgdGhhdCBwbGF0Zm9ybSBjYW4gb25seSBoYW5kbGUgb25lIGVycm9yIGF0IGEKKy8vIHRpbWUsIHRoZW4gaXQgbWF5IHF1ZXVlIHRoZSBzZWNvbmQgZXJyb3Igb3IgaWdub3JlIGl0IGJ5IHJldHVybmluZworLy8gfGtTYlN5c3RlbVBsYXRmb3JtRXJyb3JJbnZhbGlkfC4KKy8vCisvLyB8dHlwZXw6IEFuIGVycm9yIHR5cGUsIGZyb20gdGhlIFNiU3lzdGVtUGxhdGZvcm1FcnJvclR5cGUgZW51bSwKKy8vICAgIHRoYXQgZGVmaW5lcyB0aGUgZXJyb3IuCisvLyB8Y2FsbGJhY2t8OiBBIGZ1bmN0aW9uIHRoYXQgbWF5IGJlIGNhbGxlZCBieSB0aGUgcGxhdGZvcm0gdG8gbGV0IHRoZSBjYWxsZXIKKy8vICAga25vdyB0aGF0IHRoZSB1c2VyIGhhcyByZWFjdGVkIHRvIHRoZSBlcnJvci4KKy8vIHx1c2VyX2RhdGF8OiBBbiBvcGFxdWUgcG9pbnRlciB0aGF0IHRoZSBwbGF0Zm9ybSBzaG91bGQgcGFzcyBhcyBhbiBhcmd1bWVudAorLy8gICB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIGlmIGl0IGlzIGNhbGxlZC4KK1NCX0VYUE9SVCBib29sIFNiU3lzdGVtUmFpc2VQbGF0Zm9ybUVycm9yKAorICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvclR5cGUgdHlwZSwKKyAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JDYWxsYmFjayBjYWxsYmFjaywKKyAgICB2b2lkKiB1c2VyX2RhdGEpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9DTEVBUl9QTEFURk9STV9FUlJPUl9WRVJTSU9OCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9DTEVBUl9QTEFURk9STV9FUlJPUl9WRVJTSU9OCiAvLyBDbGVhcnMgYSBwbGF0Zm9ybSBlcnJvciB0aGF0IHdhcyBwcmV2aW91c2x5IHJhaXNlZCBieSBhIGNhbGwgdG8KIC8vIHxTYlN5c3RlbVJhaXNlUGxhdGZvcm1FcnJvcnwuIFRoZSBwbGF0Zm9ybSBtYXkgdXNlIHRoaXMsIGZvciBleGFtcGxlLAogLy8gdG8gY2xvc2UgYSBkaWFsb2cgdGhhdCB3YXMgb3BlbmVkIGluIHJlc3BvbnNlIHRvIHRoZSBlcnJvci4KIC8vCiAvLyB8aGFuZGxlfDogVGhlIHBsYXRmb3JtIGVycm9yIHRvIGJlIGNsZWFyZWQuCiBTQl9FWFBPUlQgdm9pZCBTYlN5c3RlbUNsZWFyUGxhdGZvcm1FcnJvcihTYlN5c3RlbVBsYXRmb3JtRXJyb3IgaGFuZGxlKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfQ0xFQVJfUExBVEZPUk1fRVJST1JfVkVSU0lPTgogCiAvLyBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gY29tcGFyZSB0d28gaXRlbXMuIFRoZSByZXR1cm4gdmFsdWUgdXNlcyBzdGFuZGFyZAogLy8gfCpjbXB8IHNlbWFudGljczoKQEAgLTU2Myw5ICs1OTIsMzMgQEAKIC8vIHNlbmQga1NiRXZlbnRUeXBlUmVzdW1lIHRvIHRoZSBldmVudCBoYW5kbGVyLgogLy8gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBjaGFuZ2Ugb3ZlciB0aGUgbGlmZSB0aW1lIG9mIHRoZQogLy8gYXBwbGljYXRpb24uCi1ib29sIFNiU3lzdGVtU3VwcG9ydHNSZXN1bWUoKTsKK1NCX0VYUE9SVCBib29sIFNiU3lzdGVtU3VwcG9ydHNSZXN1bWUoKTsKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTAKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYVEVOU0lPTlNfQVBJX1ZFUlNJT04KKy8vIFJldHVybnMgcG9pbnRlciB0byBhIGNvbnN0YW50IGdsb2JhbCBzdHJ1Y3QgaW1wbGVtZW50aW5nIHRoZSBleHRlbnNpb24gbmFtZWQKKy8vIHxuYW1lfCwgaWYgaXQgaXMgaW1wbGVtZW50ZWQuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKy8vCisvLyBFeHRlbnNpb25zIGFyZSB1c2VkIHRvIGltcGxlbWVudCBiZWhhdmlvciB3aGljaCBpcyBzcGVjaWZpYyB0byB0aGUKKy8vIGNvbWJpbmF0aW9uIG9mIGFwcGxpY2F0aW9uICYgcGxhdGZvcm0uIEFuIGV4dGVuc2lvbiByZWxpZXMgb24gYSBoZWFkZXIgZmlsZQorLy8gaW4gdGhlICJleHRlbnNpb24iIHN1YmRpcmVjdG9yeSBvZiBhbiBhcHAsIHdoaWNoIGlzIHVzZWQgYnkgYm90aCB0aGUKKy8vIGFwcGxpY2F0aW9uIGFuZCB0aGUgU3RhcmJvYXJkIHBsYXRmb3JtIHRvIGRlZmluZSBhbiBleHRlbnNpb24gQVBJIHN0cnVjdC4KKy8vIFNpbmNlIHRoZSBoZWFkZXIgaXMgdXNlZCBib3RoIGFib3ZlIGFuZCBiZWxvdyBTdGFyYm9hcmQsIGl0IGNhbm5vdCBpbmNsdWRlCisvLyBhbnkgZmlsZXMgZnJvbSBhYm92ZSBTdGFyYm9hcmQuIEl0IG1heSBkZXBlbmQgb24gU3RhcmJvYXJkIGhlYWRlcnMuIFRoYXQKKy8vIEFQSSBzdHJ1Y3QgaGFzIG9ubHkgMiByZXF1aXJlZCBmaWVsZHMgd2hpY2ggbXVzdCBiZSBmaXJzdDogYSBjb25zdCBjaGFyKgorLy8gfGtOYW1lfCwgc3RvcmluZyB0aGUgZXh0ZW5zaW9uIG5hbWUsIGFuZCBhIHVpbnQ2NF90IHxrVmVyc2lvbnwgc3RvcmluZyB0aGUKKy8vIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uIEFsbCBvdGhlciBmaWVsZHMgbWF5IGJlIEMgdHlwZXMgKGluY2x1ZGluZworLy8gY3VzdG9tIHN0cnVjdHMpIG9yIGZ1bmN0aW9uIHBvaW50ZXJzLiBUaGUgYXBwbGljYXRpb24gd2lsbCBxdWVyeSBmb3IgdGhlCisvLyBmdW5jdGlvbiBieSBuYW1lIHVzaW5nIFNiU3lzdGVtR2V0RXh0ZW5zaW9uLCBhbmQgdGhlIHBsYXRmb3JtIHJldHVybnMgYQorLy8gcG9pbnRlciB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24gc3RydWN0LiBUaGUgc2luZ2xldG9uCisvLyBzdHJ1Y3Qgc2hvdWxkIGJlIGNvbnN0YW50IGFmdGVyIGluaXRpYWxpemF0aW9uLCBzaW5jZSB0aGUgYXBwbGljYXRpb24gbWF5CisvLyBvbmx5IGdldCB0aGUgZXh0ZW5zaW9uIG9uY2UsIG1lYW5pbmcgdXBkYXRlZCB2YWx1ZXMgd291bGQgYmUgaWdub3JlZC4gQXMKKy8vIHRoZSB2ZXJzaW9uIG9mIGV4dGVuc2lvbnMgYXJlIGluY3JlbWVudGVkLCBmaWVsZHMgbWF5IGJlIGFkZGVkIHRvIHRoZSBlbmQKKy8vIG9mIHRoZSBzdHJ1Y3QsIGJ1dCBuZXZlciByZW1vdmVkIChvbmx5IGRlcHJlY2F0ZWQpLgorCitTQl9FWFBPUlQgdm9pZCogU2JTeXN0ZW1HZXRFeHRlbnNpb24oY29uc3QgY2hhciogbmFtZSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYVEVOU0lPTlNfQVBJX1ZFUlNJT04KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvYWJzdHJhY3RfbGF1bmNoZXIucHkgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2Fic3RyYWN0X2xhdW5jaGVyLnB5CmluZGV4IGVhNTY4NWUuLjMzOTQwMmIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvYWJzdHJhY3RfbGF1bmNoZXIucHkKKysrIGIvc3JjL3N0YXJib2FyZC90b29scy9hYnN0cmFjdF9sYXVuY2hlci5weQpAQCAtOTEsMTcgKzkxLDE3IEBACiAgIGxhdW5jaGVyX21vZHVsZSA9IF9HZXRMYXVuY2hlckZvclBsYXRmb3JtKHBsYXRmb3JtX25hbWUpCiAKICAgaWYgbm90IGxhdW5jaGVyX21vZHVsZToKLSAgICByYWlzZSBSdW50aW1lRXJyb3IoIk5vIGxhdW5jaGVyIGltcGxlbWVudGVkIGZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uIikKLSAgZWxzZToKLSAgICByZXR1cm4gbGF1bmNoZXJfbW9kdWxlLkxhdW5jaGVyKAotICAgICAgICBwbGF0Zm9ybV9uYW1lLAotICAgICAgICB0YXJnZXRfbmFtZSwKLSAgICAgICAgY29uZmlnLAotICAgICAgICBkZXZpY2VfaWQsCi0gICAgICAgIHRhcmdldF9wYXJhbXM9dGFyZ2V0X3BhcmFtcywKLSAgICAgICAgb3V0cHV0X2ZpbGU9b3V0cHV0X2ZpbGUsCi0gICAgICAgIG91dF9kaXJlY3Rvcnk9b3V0X2RpcmVjdG9yeSwKLSAgICAgICAgZW52X3ZhcmlhYmxlcz1lbnZfdmFyaWFibGVzKQorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IGxvYWQgbGF1bmNoZXIgZm9yIGdpdmVuIHBsYXRmb3JtLiIpCisKKyAgcmV0dXJuIGxhdW5jaGVyX21vZHVsZS5MYXVuY2hlcigKKyAgICAgIHBsYXRmb3JtX25hbWUsCisgICAgICB0YXJnZXRfbmFtZSwKKyAgICAgIGNvbmZpZywKKyAgICAgIGRldmljZV9pZCwKKyAgICAgIHRhcmdldF9wYXJhbXM9dGFyZ2V0X3BhcmFtcywKKyAgICAgIG91dHB1dF9maWxlPW91dHB1dF9maWxlLAorICAgICAgb3V0X2RpcmVjdG9yeT1vdXRfZGlyZWN0b3J5LAorICAgICAgZW52X3ZhcmlhYmxlcz1lbnZfdmFyaWFibGVzKQogCiAKIGNsYXNzIEFic3RyYWN0TGF1bmNoZXIob2JqZWN0KToKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luZG93LmggYi9zcmMvc3RhcmJvYXJkL3dpbmRvdy5oCmluZGV4IDNiODgzYjUuLjdjM2QwNDkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvd2luZG93LmgKKysrIGIvc3JjL3N0YXJib2FyZC93aW5kb3cuaApAQCAtMTk4LDYgKzE5OCw3IEBACiAvLyBwZXJtaXR0ZWQuIENhbGxpbmcgU2JXaW5kb3dGb2N1c09uU2NyZWVuS2V5Ym9hcmQgd2hpbGUgdGhlIG9uIHNjcmVlbiBrZXlib2FyZAogLy8gaXMgbm90IHNob3dpbmcgZG9lcyBub3RoaW5nIGFuZCBkb2VzIG5vdCBmaXJlIGFueSBldmVudC4KIFNCX0VYUE9SVCB2b2lkIFNiV2luZG93Rm9jdXNPblNjcmVlbktleWJvYXJkKFNiV2luZG93IHdpbmRvdywgaW50IHRpY2tldCk7CisKIC8vIEJsdXIgdGhlIG9uIHNjcmVlbiBrZXlib2FyZC4gRmlyZSBrU2JFdmVudFR5cGVPblNjcmVlbktleWJvYXJkQmx1cnJlZC4KIC8vIGtTYkV2ZW50VHlwZU9uU2NyZWVuS2V5Ym9hcmRCbHVycmVkIGhhcyBkYXRhIHx0aWNrZXR8LiBDYWxsaW5nCiAvLyBTYldpbmRvd0JsdXJPblNjcmVlbktleWJvYXJkKCkgd2hlbiB0aGUga2V5Ym9hcmQgaXMgYWxyZWFkeSBibHVycmVkIGlzCkBAIC0yMDYsNyArMjA3LDcgQEAKIFNCX0VYUE9SVCB2b2lkIFNiV2luZG93Qmx1ck9uU2NyZWVuS2V5Ym9hcmQoU2JXaW5kb3cgd2luZG93LCBpbnQgdGlja2V0KTsKIAogI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCi0vLyBVcGRhdGUgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCBjdXN0b20gc3VnZ2VzdGlvbnMuIEZpcmUKKy8vIFVwZGF0ZSB0aGUgb24gc2NyZWVuIGtleWJvYXJkIGN1c3RvbSBzdWdnZXN0aW9ucy4gRmlyZQogLy8ga1NiRXZlbnRUeXBlT25TY3JlZW5LZXlib2FyZFN1Z2dlc3Rpb25zVXBkYXRlZC4KIC8vIGtTYkV2ZW50VHlwZU9uU2NyZWVuS2V5Ym9hcmRTdWdnZXN0aW9uc1VwZGF0ZWQgaGFzIGRhdGEgfHRpY2tldHwuIFRoZQogLy8gc3VnZ2VzdGlvbnMgc2hvdWxkIHJlbWFpbiB1cC10by1kYXRlIHdoZW4gdGhlIGtleWJvYXJkIGlzIHNob3duIGFmdGVyIGJlaW5nCkBAIC0yMTYsNiArMjE3LDExIEBACiAgICAgY29uc3QgY2hhciogc3VnZ2VzdGlvbnNbXSwKICAgICBpbnQgbnVtX3N1Z2dlc3Rpb25zLAogICAgIGludCB0aWNrZXQpOworCisvLyBEZXRlcm1pbmUgaWYgdGhlIG9uIHNjcmVlbiBrZXlib2FyZCBoYXMgc3VnZ2VzdGlvbnMgaW1wbGVtZW50ZWQuIElmIHRoaXMKKy8vIHJldHVybnMgZmFsc2UsIHRoZW4gY2FsbGluZyBTYldpbmRvd1VwZGF0ZU9uU2NyZWVuS2V5Ym9hcmRTdWdnZXN0aW9ucygpIHdpbGwKKy8vIGJlIHVuZGVmaW5lZC4KK1NCX0VYUE9SVCBib29sIFNiV2luZG93T25TY3JlZW5LZXlib2FyZFN1Z2dlc3Rpb25zU3VwcG9ydGVkKFNiV2luZG93IHdpbmRvdyk7CiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX09OX1NDUkVFTl9LRVlCT0FSRF9TVUdHRVNUSU9OU19WRVJTSU9OCiAKICNlbmRpZiAgLy8gU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvUkVBRE1FLmNocm9taXVtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9SRUFETUUuY2hyb21pdW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhZDRiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvUkVBRE1FLmNocm9taXVtCkBAIC0wLDAgKzEsMTkgQEAKK05hbWU6IEJvcmluZ1NTTAorVVJMOiBodHRwczovL2JvcmluZ3NzbC5nb29nbGVzb3VyY2UuY29tL2JvcmluZ3NzbAorVmVyc2lvbjogZ2l0CitMaWNlbnNlOiBCU0Rpc2gKK0xpY2Vuc2UgRmlsZTogc3JjL0xJQ0VOU0UKK0xpY2Vuc2UgQW5kcm9pZCBDb21wYXRpYmxlOiB5ZXMKK1NlY3VyaXR5IENyaXRpY2FsOiB5ZXMKKworRGVzY3JpcHRpb246CitUaGlzIGlzIEJvcmluZ1NTTCwgYSBmb3JrIG9mIE9wZW5TU0wuIFNlZQoraHR0cHM6Ly93d3cuaW1wZXJpYWx2aW9sZXQub3JnLzIwMTQvMDYvMjAvYm9yaW5nc3NsLmh0bWwKKworTm90ZTogd2hlbiByb2xsaW5nIERFUFMgZm9yd2FyZCwgcmVtZW1iZXIgdG8gcnVuCisKKyAgY2QgdGhpcmRfcGFydHkvYm9yaW5nc3NsCisgIHB5dGhvbiBzcmMvdXRpbC9nZW5lcmF0ZV9idWlsZF9maWxlcy5weSBnbgorCitmcm9tIGEgc3lzdGVtIHdpdGggYm90aCBQZXJsIGFuZCBHbyBpbnN0YWxsZWQuIEFsdGVybmF0aXZlbHksIHVzZSB0aGUKK3JvbGxfYm9yaW5nc3NsLnB5IHNjcmlwdC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvYm9yaW5nc3NsLmd5cCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvYm9yaW5nc3NsLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFiY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9ib3Jpbmdzc2wuZ3lwCkBAIC0wLDAgKzEsMzE5IEBACisjIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCit7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ2FzbV90YXJnZXRfYXJjaCUnOiAnPCh0YXJnZXRfYXJjaCknLAorICAgICdib3Jpbmdzc2xfcm9vdCUnOiAnPChERVBUSCkvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYycsCisgIH0sCisKKyAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAjIFR1cm4gb2ZmIGJhZC1mdW5jdGlvbi1jYXN0IHdhcm5pbmcsIGFzIEJvcmluZ1NTTCB2aW9sYXRlcyB0aGlzIHNvbWV0aW1lcy4KKyAgICAnZGVmaW5lcyc6IFsKKyAgICAgICdQVVJJRlknLAorICAgICAgJ1RFUk1JTycsCisgICAgICAnX1JFRU5UUkFOVCcsCisgICAgICAjIFdlIGRvIG5vdCB1c2UgVExTIG92ZXIgVURQIG9uIENocm9taXVtIHNvIGZhci4KKyAgICAgICdPUEVOU1NMX05PX0RUTFMxJywKKyAgICBdLAorICAgICdjZmxhZ3MnOiBbCisgICAgICAnLWcnLAorICAgICAgJy1mUElDJywKKyAgICAgICctZnZpc2liaWxpdHk9aGlkZGVuJywKKyAgICAgICctV25vLWJhZC1mdW5jdGlvbi1jYXN0JywKKyAgICBdLAorICAgICdjZmxhZ3MhJzogWworICAgICAgJy1XYmFkLWZ1bmN0aW9uLWNhc3QnLAorICAgIF0sCisgICAgJ2NmbGFnc19jJzogWworICAgICAgJy1zdGQ9Z251OTknLAorICAgIF0sCisgICAgJ2NmbGFnc19jISc6IFsKKyAgICAgICctV2JhZC1mdW5jdGlvbi1jYXN0JywKKyAgICBdLAorCisgICAgJ2xkZmxhZ3MnOiBbCisgICAgICAnLWZQSUMnLAorICAgIF0sCisKKyAgICAndHlwZSc6ICc8KGxpYnJhcnkpJywKKworICAgICdjb25kaXRpb25zJzogWworICAgICAgWydPUz09InN0YXJib2FyZCInLCB7CisgICAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICAgJ29wZW5zc2xfY29uZmlnX3BhdGgnOiAnPChib3Jpbmdzc2xfcm9vdCkvY29uZmlnL3N0YXJib2FyZCcsCisgICAgICAgIH0sCisgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9lenRpbWUvZXp0aW1lLmd5cDplenRpbWUnLAorICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3RhcmJvYXJkX2hlYWRlcnNfb25seS5neXA6c3RhcmJvYXJkX2hlYWRlcnNfb25seScsCisgICAgICAgIF0sCisgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmFuZF9leHRyYS9zdGFyYm9hcmQuYycsCisgICAgICAgIF0sCisgICAgICAgICdzb3VyY2VzISc6IFsKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JhbmRfZXh0cmEvZGV0ZXJtaW5pc3RpYy5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JhbmRfZXh0cmEvZnVjaHNpYS5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JhbmRfZXh0cmEvd2luZG93cy5jJywKKyAgICAgICAgXSwKKyAgICAgIH1dLAorICAgICAgWydPUz09ImxiX3NoZWxsIicsIHsKKyAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgICAnb3BlbnNzbF9jb25maWdfcGF0aCc6ICdjb25maWcvbGJzaGVsbCcsCisgICAgICAgIH0sCisgICAgICB9XSwKKyAgICAgIFsnT1M9PSJsYl9zaGVsbCIgb3IgT1M9PSJzdGFyYm9hcmQiJywgeworICAgICAgICAnZGVmaW5lcyc6IFsKKyAgICAgICAgICAnR0VUUElEX0lTX01FQU5JTkdMRVNTJywKKyAgICAgICAgICAnTk9fU1lTX1BBUkFNX0gnLAorICAgICAgICAgICdOT19TWVNfVU5fSCcsCisgICAgICAgICAgJ05PX1NZU0xPRycsCisgICAgICAgICAgJ05PX1dJTkRPV1NfQlJBSU5ERUFUSCcsCisgICAgICAgICAgJ09QRU5TU0xfTk9fQkYnLAorICAgICAgICAgICdPUEVOU1NMX05PX0JVRl9GUkVFTElTVFMnLAorICAgICAgICAgICdPUEVOU1NMX05PX0NBTUVMTElBJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19DQVBJRU5HJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19DQVNUJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19DTVMnLAorICAgICAgICAgICdPUEVOU1NMX05PX0NPTVAnLAorICAgICAgICAgICdPUEVOU1NMX05PX0RHUkFNJywgICMgQWRkZWQgYnkgY29iYWx0IHRvIHJlbW92ZSB1bnVzZWQgVURQIGNvZGUuCisgICAgICAgICAgJ09QRU5TU0xfTk9fRFlOQU1JQ19FTkdJTkUnLAorICAgICAgICAgICdPUEVOU1NMX05PX0VDMk0nLAorICAgICAgICAgICdPUEVOU1NMX05PX0VDX05JU1RQXzY0X0dDQ18xMjgnLAorICAgICAgICAgICdPUEVOU1NMX05PX0VOR0lORScsCisgICAgICAgICAgJ09QRU5TU0xfTk9fR01QJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19HT1NUJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19IRUFSVEJFQVRTJywgIyBXb3JrYXJvdW5kIGZvciBDVkUtMjAxNC0wMTYwLgorICAgICAgICAgICdPUEVOU1NMX05PX0hXJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19JREVBJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19KUEFLRScsCisgICAgICAgICAgJ09QRU5TU0xfTk9fS1JCNScsCisgICAgICAgICAgJ09QRU5TU0xfTk9fTUQyJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19NRDQnLAorICAgICAgICAgICdPUEVOU1NMX05PX01EQzInLAorICAgICAgICAgICdPUEVOU1NMX05PX09DQicsCisgICAgICAgICAgJ09QRU5TU0xfTk9fT0NTUCcsCisgICAgICAgICAgJ09QRU5TU0xfTk9fUkMyJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19SQzQnLAorICAgICAgICAgICdPUEVOU1NMX05PX1JDNScsCisgICAgICAgICAgJ09QRU5TU0xfTk9fUkZDMzc3OScsCisgICAgICAgICAgJ09QRU5TU0xfTk9fUklQRU1EJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19STUQxNjAnLAorICAgICAgICAgICdPUEVOU1NMX05PX1NDVFAnLAorICAgICAgICAgICdPUEVOU1NMX05PX1NFRUQnLAorICAgICAgICAgICdPUEVOU1NMX05PX1NSUCcsCisgICAgICAgICAgJ09QRU5TU0xfTk9fU1NMMicsCisgICAgICAgICAgJ09QRU5TU0xfTk9fU1NMMycsICMgQWRkcmVzcyBDVkUtMjAxNC0zNTY2CisgICAgICAgICAgJ09QRU5TU0xfTk9fU1RBVElDX0VOR0lORScsCisgICAgICAgICAgJ09QRU5TU0xfTk9fU1RPUkUnLAorICAgICAgICAgICdPUEVOU1NMX05PX1NPQ0snLCAgIyBBZGRlZCBieSBDb2JhbHQgdG8gcmVtb3ZlIHVudXNlZCBzb2NrZXQgY29kZS4KKyAgICAgICAgICAnT1BFTlNTTF9OT19USFJFQURTJywgICMgQWRkZWQgYnkgQ29iYWx0IHRvIHJlZHVjZSBvdmVyYWxsIHRocmVhZHMgY291bnQuCisgICAgICAgICAgJ09QRU5TU0xfTk9fVUknLCAgIyBBZGRlZCBieSBDb2JhbHQgdG8gcmVtb3ZlIHVudXNlZCAiVUkiIGNvZGUuCisgICAgICAgICAgJ09QRU5TU0xfTk9fVU5JVF9URVNUJywKKyAgICAgICAgICAnT1BFTlNTTF9OT19XSElSTFBPT0wnLAorICAgICAgICAgICdPUEVOU1NMX1VTRV9JUFY2PTAnLAorICAgICAgICAgICdCX0VORElBTicsCisgICAgICAgICAgJ09QRU5TU0xfTk9fUE9TSVhfSU8nLAorICAgICAgICBdLAorICAgICAgICAnc291cmNlcyEnOiBbCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9iZi9iZl9jZmI2NC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2JmL2JmX2VjYi5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2JmL2JmX2VuYy5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2JmL2JmX29mYjY0LmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmYvYmZfc2tleS5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2VuZ2luZS9lbmdfYWxsLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZW5naW5lL2VuZ19jbmYuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvZW5nX2N0cmwuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvZW5nX2R5bi5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2VuZ2luZS9lbmdfZXJyLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZW5naW5lL2VuZ19mYXQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvZW5nX2luaXQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvZW5nX2xpYi5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2VuZ2luZS9lbmdfbGlzdC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2VuZ2luZS9lbmdfcGtleS5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2VuZ2luZS9lbmdfdGFibGUuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvdGJfYXNubXRoLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZW5naW5lL3RiX2NpcGhlci5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2VuZ2luZS90Yl9kaC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2VuZ2luZS90Yl9kaWdlc3QuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvdGJfZHNhLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZW5naW5lL3RiX2VjZGguYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvdGJfZWNkc2EuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvdGJfcGttZXRoLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZW5naW5lL3RiX3JhbmQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvdGJfcnNhLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZW5naW5lL3RiX3N0b3JlLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmMyL3JjMl9jYmMuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yYzIvcmMyX2VjYi5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JjMi9yYzJfc2tleS5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JjMi9yYzJjZmI2NC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JjMi9yYzJvZmI2NC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JjNC9yYzRfZW5jLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmM0L3JjNF9za2V5LmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmM0L3JjNF91dGwuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yaXBlbWQvcm1kX2Rnc3QuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yaXBlbWQvcm1kX29uZS5jJywKKyAgICAgICAgICAjIFJlbW92ZWQgZHVyaW5nIFN0YXJib2FyZCBwb3J0LCBmb3VuZCBvciBtYWRlIHRvIGJlIHVubmVlZGVkIGF0CisgICAgICAgICAgIyBsaW5rIHRpbWUuCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9iaW8vYl9zb2NrLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL2Jzc19hY3B0LmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL2Jzc19jb25uLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL2Jzc19kZ3JhbS5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2Jpby9ic3NfZmQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9iaW8vYnNzX2xvZy5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2Jpby9ic3Nfc29jay5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NvbXAvY19ybGUuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9jb21wL2NfemxpYi5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NvbXAvY29tcF9lcnIuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9jb21wL2NvbXBfbGliLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZGVzL3JlYWQycHdkLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZHNvL2Rzb19kbC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2Rzby9kc29fZGxmY24uYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9kc28vZHNvX2Vyci5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2Rzby9kc29fbGliLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZHNvL2Rzb19udWxsLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZHNvL2Rzb19vcGVuc3NsLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZWJjZGljLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL2VfYmYuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZV9vbGQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZV9yYzIuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZV9yYzQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZV9yYzRfaG1hY19tZDUuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZV9yYzUuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZV9yYzUuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvbV9tZDQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvbV9tZGMyLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL21fcmlwZW1kLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL21fd3AuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9rcmI1L2tyYjVfYXNuLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vbWQ0L21kNF9kZ3N0LmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vbWQ0L21kNF9vbmUuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9vX3N0ci5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BxdWV1ZS9wcXVldWUuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yYW5kL3JhbmRfZWdkLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmFuZC9yYW5kZmlsZS5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3NycC9zcnBfbGliLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vc3JwL3NycF92ZnkuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by91aS91aV9jb21wYXQuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by91aS91aV9lcnIuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by91aS91aV9saWIuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by91aS91aV9vcGVuc3NsLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vdWkvdWlfdXRpbC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL2QxX2JvdGguYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9kMV9jbG50LmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvZDFfZW5jLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvZDFfbGliLmMnLAorICAgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvZDFfbWV0aC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL2QxX3BrdC5jJywKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL2tzc2wuYycsCisgICAgICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9kMV9zcnZyLmMnLAorICAgICAgICBdLAorICAgICAgfV0sICAjIE9TID09ICJsYl9zaGVsbCIgb3IgT1MgPT0gInN0YXJib2FyZCIKKyAgICBdLAorICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAnLicsCisgICAgICAnPEAob3BlbnNzbF9jb25maWdfcGF0aCknLAorICAgIF0sCisgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAnPEAob3BlbnNzbF9jb25maWdfcGF0aCknLAorICAgICAgXSwKKyAgICB9LAorICB9LAorICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY3J5cHRvJywKKworICAgICAgIyBJbmNsdWRlIHRoZSBzb3VyY2UgZmlsZSBsaXN0IGdlbmVyYXRlZCBieSBCb3JpbmdTU0wKKyAgICAgICdpbmNsdWRlcyc6IFsnYm9yaW5nc3NsLmd5cGknLF0sCisKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnPEAoYm9yaW5nc3NsX2NyeXB0b19maWxlcyknLAorICAgICAgICAnPEAoYm9yaW5nc3NsX3NzbF9maWxlcyknLAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlJywKKyAgICAgIF0sCisgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZScsCisgICAgICAgIF0sCisgICAgICB9LAorCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgIyBUaGlzIG1hc3NpdmUsIG5lc3RlZCBjb25kaXRpb25hbCBibG9jayB3aWxsIHNlbGVjdCB0aGUgY29ycmVjdCBiYXRjaAorICAgICAgICAjIG9mIGFzc2VtYmx5IGxhbmd1YWdlIGZpbGVzIGZvciB0aGUgY3VycmVudCBPUyBhbmQgQ1BVIGFyY2hpdGVjdHVyZSwgb3IKKyAgICAgICAgIyBpdCB3aWxsIHR1cm4gb2ZmIGFzc2VtYmx5IGxhbmd1YWdlIGZpbGVzIGVudGlyZWx5IGlmIHRoZQorICAgICAgICAjIHxhc21fdGFyZ2V0X2FyY2h8IGhhcyBiZWVuIHNldCB0byAibm9uZSIuCisKKyAgICAgICAgWyd0YXJnZXRfb3Mgbm90IGluIFsibGludXgiLCAiYW5kcm9pZCIsICJ0dm9zIl0gb3IgYXNtX3RhcmdldF9hcmNoIG5vdCBpbiBbIng4NiIsICJ4NjQiLCAiYXJtIiwgImFybTY0Il0nLCB7CisgICAgICAgICAgIyBwbGVhc2UgcmVhZCBjb21tZW50cyBmb3IgfHRhcmdldF9vcz09IndpbiJ8IGNvbmRpdGlvbiBiZWxvdworICAgICAgICAgICdkZWZpbmVzJzogWworICAgICAgICAgICAgJ09QRU5TU0xfTk9fQVNNJywKKyAgICAgICAgICBdLAorICAgICAgICB9LCB7ICAjIHRhcmdldF9vcyBpbiBbImxpbnV4IiwgImFuZHJvaWQiLCAidHZvcyJdIGFuZCBhc21fdGFyZ2V0X2FyY2ggaW4gWyJub25lIiwgIm1pcHMiLCAiaWEzMiJdCisgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgICAgICBbJ3RhcmdldF9vcz09ImxpbnV4IiBvciB0YXJnZXRfb3M9PSJhbmRyb2lkIicsIHsKKyAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgICAgICAgICAgWydhc21fdGFyZ2V0X2FyY2g9PSJ4ODYiJywgeworICAgICAgICAgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAgICAgICAgICc8QChib3Jpbmdzc2xfbGludXhfeDg2X2ZpbGVzKScsCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgIFsnYXNtX3RhcmdldF9hcmNoPT0ieDY0IicsIHsKKyAgICAgICAgICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgICAgICAgICAnPEAoYm9yaW5nc3NsX2xpbnV4X3g4Nl82NF9maWxlcyknLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICBbJ2FzbV90YXJnZXRfYXJjaD09ImFybSInLCB7CisgICAgICAgICAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICAgICAgICAgJzxAKGJvcmluZ3NzbF9saW51eF9hcm1fZmlsZXMpJywKKyAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgWydhc21fdGFyZ2V0X2FyY2g9PSJhcm02NCInLCB7CisgICAgICAgICAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICAgICAgICAgJzxAKGJvcmluZ3NzbF9saW51eF9hYXJjaDY0X2ZpbGVzKScsCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfV0sCisgICAgICAgICAgICBbJ3RhcmdldF9vcz09IndpbiInLCB7CisKKyAgICAgICAgICAgICMgRm9yIHx0YXJnZXRfb3M9PSJ3aW4ifCBhbiBBU00gcnVsZSB1c2VzIG1sLmV4ZSAoYWthIE1TIE1hY3JvIEFzc2VtYmxlcikKKyAgICAgICAgICAgICMgd2hpY2ggd2UgY2FuJ3QgdXNlIHdpdGggR05VIGZvcm1hdC4gQXMgc29vbiBhcyBBU00gcnVsZSB3aWxsIGJlIGZpeGVkCisgICAgICAgICAgICAjIGZvciB1c2luZyBHTlUgQXNzZW1ibGVyLCB0byBhY2NlbGVyYXRlICJjcnlwdG8iIHdpdGggYXNzZW1ibGVyIAorICAgICAgICAgICAgIyBpbXBsZW1lbnRhdGlvbnMganVzdCByZW1vdmUgdGFyZ2V0X29zPT0id2luIiBmcm9tIGFib3dlIGNvbmRpdGlvbiAKKyAgICAgICAgICAgICMgfCdhc21fdGFyZ2V0X2FyY2g9PSJub25lIiBvciB0YXJnZXRfb3M9PSJ3aW4iJ3wgd2hpY2ggY3VycmVudGx5CisgICAgICAgICAgICAjIHNldHMgT1BFTlNTTF9OT19BU00gZm9yICJ3aW4iIHRvbworCisgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICAgICAgICAgIFsnYXNtX3RhcmdldF9hcmNoPT0ieDg2IicsIHsKKyAgICAgICAgICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgICAgICAgICAnPEAoYm9yaW5nc3NsX3dpbl94ODZfZmlsZXMpJywKKyAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgWydhc21fdGFyZ2V0X2FyY2g9PSJ4NjQiJywgeworICAgICAgICAgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAgICAgICAgICc8QChib3Jpbmdzc2xfd2luX3g4Nl82NF9maWxlcyknLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgWyd0YXJnZXRfb3M9PSJ0dm9zIicsIHsKKyAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgICAgICAgICAgWydhc21fdGFyZ2V0X2FyY2g9PSJhcm02NCInLCB7CisgICAgICAgICAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICAgICAgICAgJzxAKGJvcmluZ3NzbF9pb3NfYWFyY2g2NF9maWxlcyknLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAjIFNpbXVsYXRvcgorICAgICAgICAgICAgICAgIFsnYXNtX3RhcmdldF9hcmNoPT0ieDY0IicsIHsKKyAgICAgICAgICAgICAgICAgICdkZWZpbmVzJzogWworICAgICAgICAgICAgICAgICAgICAnT1BFTlNTTF9OT19BU00nLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH1dCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2JvcmluZ3NzbC5neXBpIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9ib3Jpbmdzc2wuZ3lwaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM1NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9ib3Jpbmdzc2wuZ3lwaQpAQCAtMCwwICsxLDUyNiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworIyBUaGlzIGZpbGUgaXMgY3JlYXRlZCBieSBnZW5lcmF0ZV9idWlsZF9maWxlcy5weS4gRG8gbm90IGVkaXQgbWFudWFsbHkuCisKK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAnYm9yaW5nc3NsX3NzbF9maWxlcyc6IFsKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL3NzbC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvc3NsMy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvdGxzMS5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvYmlvX3NzbC5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL2QxX2JvdGguY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9kMV9saWIuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9kMV9wa3QuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9kMV9zcnRwLmNjJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvZHRsc19tZXRob2QuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9kdGxzX3JlY29yZC5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL2hhbmRzaGFrZS5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL2hhbmRzaGFrZV9jbGllbnQuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9oYW5kc2hha2Vfc2VydmVyLmNjJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3MzX2JvdGguY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zM19saWIuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zM19wa3QuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfYWVhZF9jdHguY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfYXNuMS5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3NzbF9idWZmZXIuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfY2VydC5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3NzbF9jaXBoZXIuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfZmlsZS5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3NzbF9rZXlfc2hhcmUuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfbGliLmNjJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvc3NsX3ByaXZrZXkuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfc2Vzc2lvbi5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3NzbF9zdGF0LmNjJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvc3NsX3RyYW5zY3JpcHQuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfdmVyc2lvbnMuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC9zc2xfeDUwOS5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3QxX2VuYy5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3QxX2xpYi5jYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvc3NsL3RsczEzX2JvdGguY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC90bHMxM19jbGllbnQuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC90bHMxM19lbmMuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC90bHMxM19zZXJ2ZXIuY2MnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL3NzbC90bHNfbWV0aG9kLmNjJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9zc2wvdGxzX3JlY29yZC5jYycsCisgICAgXSwKKyAgICAnYm9yaW5nc3NsX2NyeXB0b19maWxlcyc6IFsKKyAgICAgICdlcnJfZGF0YS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYXNuMS9hX2JpdHN0ci5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYXNuMS9hX2Jvb2wuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV9kdXAuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV9lbnVtLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL2FfZ2VudG0uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV9pbnQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV9tYnN0ci5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYXNuMS9hX29iamVjdC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYXNuMS9hX29jdGV0LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL2FfcHJpbnQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV9zdHJuaWQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYV90aW1lLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL2FfdHlwZS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYXNuMS9hX3V0Y3RtLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL2FfdXRmOC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYXNuMS9hc24xX2xpYi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYXNuMS9hc24xX2xvY2wuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYXNuMV9wYXIuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvYXNuX3BhY2suYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2FzbjEvZl9lbnVtLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL2ZfaW50LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL2Zfc3RyaW5nLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL3Rhc25fZGVjLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL3Rhc25fZW5jLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL3Rhc25fZnJlLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL3Rhc25fbmV3LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL3Rhc25fdHlwLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL3Rhc25fdXRsLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9hc24xL3RpbWVfc3VwcG9ydC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmFzZTY0L2Jhc2U2NC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL2Jpby5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL2Jpb19tZW0uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2Jpby9jb25uZWN0LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9iaW8vZmQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2Jpby9maWxlLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9iaW8vaGV4ZHVtcC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL2ludGVybmFsLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9iaW8vcGFpci5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL3ByaW50Zi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL3NvY2tldC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYmlvL3NvY2tldF9oZWxwZXIuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2JuX2V4dHJhL2JuX2FzbjEuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2JuX2V4dHJhL2NvbnZlcnQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2J1Zi9idWYuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2J5dGVzdHJpbmcvYXNuMV9jb21wYXQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2J5dGVzdHJpbmcvYmVyLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ieXRlc3RyaW5nL2NiYi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vYnl0ZXN0cmluZy9jYnMuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2J5dGVzdHJpbmcvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2J5dGVzdHJpbmcvdW5pY29kZS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY2hhY2hhL2NoYWNoYS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY2lwaGVyX2V4dHJhL2NpcGhlcl9leHRyYS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY2lwaGVyX2V4dHJhL2Rlcml2ZV9rZXkuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NpcGhlcl9leHRyYS9lX2Flc2N0cmhtYWMuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NpcGhlcl9leHRyYS9lX2Flc2djbXNpdi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY2lwaGVyX2V4dHJhL2VfY2hhY2hhMjBwb2x5MTMwNS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY2lwaGVyX2V4dHJhL2VfbnVsbC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY2lwaGVyX2V4dHJhL2VfcmMyLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9jaXBoZXJfZXh0cmEvZV9yYzQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NpcGhlcl9leHRyYS9lX3Rscy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY2lwaGVyX2V4dHJhL2ludGVybmFsLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9jaXBoZXJfZXh0cmEvdGxzX2NiYy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY21hYy9jbWFjLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9jb25mL2NvbmYuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NvbmYvY29uZl9kZWYuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NvbmYvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NwdS1hcm0uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NwdS1pbnRlbC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY3B1LXBwYzY0bGUuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2NyeXB0by5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS90aGlyZF9wYXJ0eS9maWF0L2N1cnZlMjU1MTkuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2N1cnZlMjU1MTkvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2N1cnZlMjU1MTkvc3Bha2UyNTUxOS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZGgvY2hlY2suYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2RoL2RoLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9kaC9kaF9hc24xLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9kaC9wYXJhbXMuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2RpZ2VzdF9leHRyYS9kaWdlc3RfZXh0cmEuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2RzYS9kc2EuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2RzYS9kc2FfYXNuMS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZWNfZXh0cmEvZWNfYXNuMS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZWNkaF9leHRyYS9lY2RoX2V4dHJhLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lY2RzYV9leHRyYS9lY2RzYV9hc24xLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lbmdpbmUvZW5naW5lLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lcnIvZXJyLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9lcnIvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2V2cC9kaWdlc3RzaWduLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZXZwLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvZXZwX2FzbjEuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2V2cC9ldnBfY3R4LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2V2cC9wX2RzYV9hc24xLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvcF9lYy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL3BfZWNfYXNuMS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL3BfZWQyNTUxOS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL3BfZWQyNTUxOV9hc24xLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvcF9yc2EuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2V2cC9wX3JzYV9hc24xLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9ldnAvcGJrZGYuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2V2cC9wcmludC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL3NjcnlwdC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZXZwL3NpZ24uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2V4X2RhdGEuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzL2ludGVybmFsLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9maXBzbW9kdWxlL2JjbS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZmlwc21vZHVsZS9ibi9pbnRlcm5hbC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZmlwc21vZHVsZS9ibi9yc2F6X2V4cC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZmlwc21vZHVsZS9jaXBoZXIvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2ZpcHNtb2R1bGUvZGVsb2NhdGUuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2ZpcHNtb2R1bGUvZGVzL2ludGVybmFsLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9maXBzbW9kdWxlL2RpZ2VzdC9pbnRlcm5hbC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZmlwc21vZHVsZS9kaWdlc3QvbWQzMl9jb21tb24uaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2ZpcHNtb2R1bGUvZWMvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2ZpcHNtb2R1bGUvZWMvcDI1Ni14ODZfNjQtdGFibGUuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2ZpcHNtb2R1bGUvZWMvcDI1Ni14ODZfNjQuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL2ZpcHNtb2R1bGUvaXNfZmlwcy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZmlwc21vZHVsZS9tb2Rlcy9pbnRlcm5hbC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vZmlwc21vZHVsZS9yYW5kL2ludGVybmFsLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9maXBzbW9kdWxlL3JzYS9pbnRlcm5hbC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vaGtkZi9oa2RmLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9pbnRlcm5hbC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vbGhhc2gvbGhhc2guYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL21lbV9zdGFyYm9hcmQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL29iai9vYmouYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL29iai9vYmpfZGF0LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9vYmovb2JqX3hyZWYuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BlbS9wZW1fYWxsLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9wZW0vcGVtX2luZm8uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BlbS9wZW1fbGliLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9wZW0vcGVtX290aC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcGVtL3BlbV9wazguYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BlbS9wZW1fcGtleS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcGVtL3BlbV94NTA5LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9wZW0vcGVtX3hhdXguYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BrY3M3L2ludGVybmFsLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9wa2NzNy9wa2NzNy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcGtjczcvcGtjczdfeDUwOS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcGtjczgvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BrY3M4L3A1X3BiZXYyLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9wa2NzOC9wa2NzOC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcGtjczgvcGtjczhfeDUwOS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcG9seTEzMDUvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV9hcm0uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3ZlYy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcG9vbC9pbnRlcm5hbC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcG9vbC9wb29sLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yYW5kX2V4dHJhL2RldGVybWluaXN0aWMuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JhbmRfZXh0cmEvZm9ya3Vuc2FmZS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmFuZF9leHRyYS9mdWNoc2lhLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yYW5kX2V4dHJhL3JhbmRfZXh0cmEuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3JhbmRfZXh0cmEvd2luZG93cy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmM0L3JjNC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vcmVmY291bnRfYzExLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yZWZjb3VudF9sb2NrLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9yc2FfZXh0cmEvcnNhX2FzbjEuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3N0YWNrL3N0YWNrLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by90aHJlYWQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3RocmVhZF9ub25lLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by90aHJlYWRfcHRocmVhZC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vdGhyZWFkX3dpbi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS9hX2RpZ2VzdC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS9hX3NpZ24uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkvYV9zdHJleC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS9hX3ZlcmlmeS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS9hbGdvcml0aG0uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkvYXNuMV9nZW4uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkvYnlfZGlyLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L2J5X2ZpbGUuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkvY2hhcm1hcC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS9pMmRfcHIuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkvaW50ZXJuYWwuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkvcnNhX3Bzcy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS90X2NybC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS90X3JlcS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS90X3g1MDkuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkvdF94NTA5YS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS92cG1faW50LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDkuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOV9hdHQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOV9jbXAuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOV9kMi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94NTA5X2RlZi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94NTA5X2V4dC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94NTA5X2x1LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDlfb2JqLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDlfcjJ4LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDlfcmVxLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDlfc2V0LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDlfdHJzLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDlfdHh0LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3g1MDlfdjMuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOV92ZnkuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOV92cG0uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOWNzZXQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOW5hbWUuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOXJzZXQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveDUwOXNwa2kuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveF9hbGdvci5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94X2FsbC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94X2F0dHJpYi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94X2NybC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94X2V4dGVuLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3hfaW5mby5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94X25hbWUuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveF9wa2V5LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3hfcHVia2V5LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3hfcmVxLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3hfc2lnLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5L3hfc3BraS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94X3ZhbC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOS94X3g1MDkuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDkveF94NTA5YS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL2V4dF9kYXQuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My9wY3lfY2FjaGUuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My9wY3lfZGF0YS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3BjeV9pbnQuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My9wY3lfbGliLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvcGN5X21hcC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3BjeV9ub2RlLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvcGN5X3RyZWUuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19ha2V5LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfYWtleWEuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19hbHQuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19iY29ucy5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3YzX2JpdHN0LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfY29uZi5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3YzX2Nwb2xzLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfY3JsZC5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3YzX2VudW0uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19leHRrdS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3YzX2dlbm4uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19pYTUuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19pbmZvLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfaW50LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfbGliLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19vY3NwLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfcGNpLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfcGNpYS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfcGt1LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19wcm4uYycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3g1MDl2My92M19wdXJwLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfc2tleS5jJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8veDUwOXYzL3YzX3N4bmV0LmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by94NTA5djMvdjNfdXRsLmMnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9hZWFkLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9hZXMuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2FybV9hcmNoLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9hc24xLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9hc24xX21hYy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvYXNuMXQuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2Jhc2UuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2Jhc2U2NC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvYmlvLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9ibG93ZmlzaC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvYm4uaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2J1Zi5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9ieXRlc3RyaW5nLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9jYXN0LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9jaGFjaGEuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2NpcGhlci5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvY21hYy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvY29uZi5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvY3B1LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2N1cnZlMjU1MTkuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2Rlcy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvZGguaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2RpZ2VzdC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvZHNhLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9lYy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvZWNfa2V5LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvZW5naW5lLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9lcnIuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL2V2cC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvZXhfZGF0YS5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvaGtkZi5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvaG1hYy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvaXNfYm9yaW5nc3NsLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvbGhhc2hfbWFjcm9zLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9tZDQuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL21kNS5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvbWVtLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9uaWQuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL29iai5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvcGVtLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9wa2NzMTIuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9wa2NzOC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvcG9seTEzMDUuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL3Bvb2wuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL3JhbmQuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL3JjNC5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvcmlwZW1kLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9yc2EuaCcsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvc2hhLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9zcGFuLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9zcnRwLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wvdGhyZWFkLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC90eXBlX2NoZWNrLmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgnLAorICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9pbmNsdWRlL29wZW5zc2wveDUwOXYzLmgnLAorICAgIF0sCisgICAgJ2JvcmluZ3NzbF9pb3NfYWFyY2g2NF9maWxlcyc6IFsKKyAgICAgICdpb3MtYWFyY2g2NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS1hcm12OC5TJywKKyAgICAgICdpb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9hZXN2OC1hcm14NjQuUycsCisgICAgICAnaW9zLWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYXJtdjgtbW9udC5TJywKKyAgICAgICdpb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHY4LWFybXg2NC5TJywKKyAgICAgICdpb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY4LlMnLAorICAgICAgJ2lvcy1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni1hcm12OC5TJywKKyAgICAgICdpb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItYXJtdjguUycsCisgICAgXSwKKyAgICAnYm9yaW5nc3NsX2lvc19hcm1fZmlsZXMnOiBbCisgICAgICAnaW9zLWFybS9jcnlwdG8vY2hhY2hhL2NoYWNoYS1hcm12NC5TJywKKyAgICAgICdpb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flcy1hcm12NC5TJywKKyAgICAgICdpb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flc3Y4LWFybXgzMi5TJywKKyAgICAgICdpb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2FybXY0LW1vbnQuUycsCisgICAgICAnaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9ic2Flcy1hcm12Ny5TJywKKyAgICAgICdpb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2doYXNoLWFybXY0LlMnLAorICAgICAgJ2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2h2OC1hcm14MzIuUycsCisgICAgICAnaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY0LWxhcmdlLlMnLAorICAgICAgJ2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LWFybXY0LlMnLAorICAgICAgJ2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLWFybXY0LlMnLAorICAgIF0sCisgICAgJ2JvcmluZ3NzbF9saW51eF9hYXJjaDY0X2ZpbGVzJzogWworICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9jcHUtYWFyY2g2NC1saW51eC5jJywgIyBMaW51eCBhcm02NCBvbmx5IGZpbGUKKyAgICAgICdsaW51eC1hYXJjaDY0L2NyeXB0by9jaGFjaGEvY2hhY2hhLWFybXY4LlMnLAorICAgICAgJ2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzdjgtYXJteDY0LlMnLAorICAgICAgJ2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYXJtdjgtbW9udC5TJywKKyAgICAgICdsaW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL2doYXNodjgtYXJteDY0LlMnLAorICAgICAgJ2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS1hcm12OC5TJywKKyAgICAgICdsaW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni1hcm12OC5TJywKKyAgICAgICdsaW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi1hcm12OC5TJywKKyAgICBdLAorICAgICdib3Jpbmdzc2xfbGludXhfYXJtX2ZpbGVzJzogWworICAgICAgJzwoYm9yaW5nc3NsX3Jvb3QpL2NyeXB0by9jcHUtYXJtLWxpbnV4LmMnLCAjIExpbnV4IGFybSBvbmx5IGZpbGUKKyAgICAgICdsaW51eC1hcm0vY3J5cHRvL2NoYWNoYS9jaGFjaGEtYXJtdjQuUycsCisgICAgICAnbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flcy1hcm12NC5TJywKKyAgICAgICdsaW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvYWVzdjgtYXJteDMyLlMnLAorICAgICAgJ2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9hcm12NC1tb250LlMnLAorICAgICAgJ2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9ic2Flcy1hcm12Ny5TJywKKyAgICAgICdsaW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gtYXJtdjQuUycsCisgICAgICAnbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2doYXNodjgtYXJteDMyLlMnLAorICAgICAgJ2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY0LWxhcmdlLlMnLAorICAgICAgJ2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYtYXJtdjQuUycsCisgICAgICAnbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi1hcm12NC5TJywKKyAgICAgICc8KGJvcmluZ3NzbF9yb290KS9jcnlwdG8vY3VydmUyNTUxOS9hc20veDI1NTE5LWFzbS1hcm0uUycsCisgICAgICAnPChib3Jpbmdzc2xfcm9vdCkvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X2FybV9hc20uUycsCisgICAgXSwKKyAgICAnYm9yaW5nc3NsX2xpbnV4X3BwYzY0bGVfZmlsZXMnOiBbCisgICAgICAnbGludXgtcHBjNjRsZS9jcnlwdG8vZmlwc21vZHVsZS9hZXNwOC1wcGMuUycsCisgICAgICAnbGludXgtcHBjNjRsZS9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHA4LXBwYy5TJywKKyAgICBdLAorICAgICdib3Jpbmdzc2xfbGludXhfeDg2X2ZpbGVzJzogWworICAgICAgJ2xpbnV4LXg4Ni9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODYuUycsCisgICAgICAnbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL2Flcy01ODYuUycsCisgICAgICAnbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Ni5TJywKKyAgICAgICdsaW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvYm4tNTg2LlMnLAorICAgICAgJ2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9jby01ODYuUycsCisgICAgICAnbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Ni5TJywKKyAgICAgICdsaW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvbWQ1LTU4Ni5TJywKKyAgICAgICdsaW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS01ODYuUycsCisgICAgICAnbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni01ODYuUycsCisgICAgICAnbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi01ODYuUycsCisgICAgICAnbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5TJywKKyAgICAgICdsaW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUveDg2LW1vbnQuUycsCisgICAgXSwKKyAgICAnYm9yaW5nc3NsX2xpbnV4X3g4Nl82NF9maWxlcyc6IFsKKyAgICAgICdsaW51eC14ODZfNjQvY3J5cHRvL2NoYWNoYS9jaGFjaGEteDg2XzY0LlMnLAorICAgICAgJ2xpbnV4LXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2FlczEyOGdjbXNpdi14ODZfNjQuUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9jaXBoZXJfZXh0cmEvY2hhY2hhMjBfcG9seTEzMDVfeDg2XzY0LlMnLAorICAgICAgJ2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXMteDg2XzY0LlMnLAorICAgICAgJ2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS1nY20teDg2XzY0LlMnLAorICAgICAgJ2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODZfNjQuUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2JzYWVzLXg4Nl82NC5TJywKKyAgICAgICdsaW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gteDg2XzY0LlMnLAorICAgICAgJ2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9tZDUteDg2XzY0LlMnLAorICAgICAgJ2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9wMjU2LXg4Nl82NC1hc20uUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JkcmFuZC14ODZfNjQuUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JzYXotYXZ4Mi5TJywKKyAgICAgICdsaW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS14ODZfNjQuUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni14ODZfNjQuUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi14ODZfNjQuUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Nl82NC5TJywKKyAgICAgICdsaW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQuUycsCisgICAgICAnbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3g4Nl82NC1tb250NS5TJywKKyAgICBdLAorICAgICdib3Jpbmdzc2xfbWFjX3g4Nl9maWxlcyc6IFsKKyAgICAgICdtYWMteDg2L2NyeXB0by9jaGFjaGEvY2hhY2hhLXg4Ni5TJywKKyAgICAgICdtYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL2Flcy01ODYuUycsCisgICAgICAnbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODYuUycsCisgICAgICAnbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9ibi01ODYuUycsCisgICAgICAnbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9jby01ODYuUycsCisgICAgICAnbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODYuUycsCisgICAgICAnbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9tZDUtNTg2LlMnLAorICAgICAgJ21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS01ODYuUycsCisgICAgICAnbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYtNTg2LlMnLAorICAgICAgJ21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLTU4Ni5TJywKKyAgICAgICdtYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5TJywKKyAgICAgICdtYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3g4Ni1tb250LlMnLAorICAgIF0sCisgICAgJ2JvcmluZ3NzbF9tYWNfeDg2XzY0X2ZpbGVzJzogWworICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2NoYWNoYS9jaGFjaGEteDg2XzY0LlMnLAorICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9hZXMxMjhnY21zaXYteDg2XzY0LlMnLAorICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuUycsCisgICAgICAnbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXMteDg2XzY0LlMnLAorICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzbmktZ2NtLXg4Nl82NC5TJywKKyAgICAgICdtYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Nl82NC5TJywKKyAgICAgICdtYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2JzYWVzLXg4Nl82NC5TJywKKyAgICAgICdtYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Nl82NC5TJywKKyAgICAgICdtYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL21kNS14ODZfNjQuUycsCisgICAgICAnbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9wMjU2LXg4Nl82NC1hc20uUycsCisgICAgICAnbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9yZHJhbmQteDg2XzY0LlMnLAorICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcnNhei1hdngyLlMnLAorICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS14ODZfNjQuUycsCisgICAgICAnbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYteDg2XzY0LlMnLAorICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLXg4Nl82NC5TJywKKyAgICAgICdtYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Nl82NC5TJywKKyAgICAgICdtYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3g4Nl82NC1tb250LlMnLAorICAgICAgJ21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQ1LlMnLAorICAgIF0sCisgICAgJ2JvcmluZ3NzbF93aW5feDg2X2ZpbGVzJzogWworICAgICAgJ3dpbi14ODYvY3J5cHRvL2NoYWNoYS9jaGFjaGEteDg2LmFzbScsCisgICAgICAnd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXMtNTg2LmFzbScsCisgICAgICAnd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODYuYXNtJywKKyAgICAgICd3aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2JuLTU4Ni5hc20nLAorICAgICAgJ3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvY28tNTg2LmFzbScsCisgICAgICAnd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODYuYXNtJywKKyAgICAgICd3aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL21kNS01ODYuYXNtJywKKyAgICAgICd3aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTEtNTg2LmFzbScsCisgICAgICAnd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYtNTg2LmFzbScsCisgICAgICAnd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItNTg2LmFzbScsCisgICAgICAnd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS92cGFlcy14ODYuYXNtJywKKyAgICAgICd3aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3g4Ni1tb250LmFzbScsCisgICAgXSwKKyAgICAnYm9yaW5nc3NsX3dpbl94ODZfNjRfZmlsZXMnOiBbCisgICAgICAnd2luLXg4Nl82NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODZfNjQuYXNtJywKKyAgICAgICd3aW4teDg2XzY0L2NyeXB0by9jaXBoZXJfZXh0cmEvYWVzMTI4Z2Ntc2l2LXg4Nl82NC5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuYXNtJywKKyAgICAgICd3aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flcy14ODZfNjQuYXNtJywKKyAgICAgICd3aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLWdjbS14ODZfNjQuYXNtJywKKyAgICAgICd3aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Nl82NC5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYnNhZXMteDg2XzY0LmFzbScsCisgICAgICAnd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODZfNjQuYXNtJywKKyAgICAgICd3aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL21kNS14ODZfNjQuYXNtJywKKyAgICAgICd3aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3AyNTYteDg2XzY0LWFzbS5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcmRyYW5kLXg4Nl82NC5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcnNhei1hdngyLmFzbScsCisgICAgICAnd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLXg4Nl82NC5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LXg4Nl82NC5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLXg4Nl82NC5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvdnBhZXMteDg2XzY0LmFzbScsCisgICAgICAnd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS94ODZfNjQtbW9udC5hc20nLAorICAgICAgJ3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQ1LmFzbScsCisgICAgXSwKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9lcnJfZGF0YS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9lcnJfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YzEwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2Vycl9kYXRhLmMKQEAgLTAsMCArMSwxMzkwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyAvKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBlcnJfZGF0YV9nZW5lcmF0ZS5nby4gKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90eXBlX2NoZWNrLmg+CisKKworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX05PTkUgPT0gMSwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9TWVMgPT0gMiwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8yKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9CTiA9PSAzLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzMpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1JTQSA9PSA0LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzQpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0RIID09IDUsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfNSk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfRVZQID09IDYsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfNik7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfQlVGID09IDcsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfNyk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfT0JKID09IDgsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfOCk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfUEVNID09IDksIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfOSk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfRFNBID09IDEwLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzEwKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9YNTA5ID09IDExLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzExKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9BU04xID09IDEyLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzEyKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9DT05GID09IDEzLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzEzKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9DUllQVE8gPT0gMTQsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMTQpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0VDID09IDE1LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzE1KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9TU0wgPT0gMTYsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMTYpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0JJTyA9PSAxNywgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xNyk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfUEtDUzcgPT0gMTgsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMTgpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1BLQ1M4ID09IDE5LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzE5KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9YNTA5VjMgPT0gMjAsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMjApOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1JBTkQgPT0gMjEsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMjEpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0VOR0lORSA9PSAyMiwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8yMik7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfT0NTUCA9PSAyMywgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8yMyk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfVUkgPT0gMjQsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMjQpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0NPTVAgPT0gMjUsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMjUpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0VDRFNBID09IDI2LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzI2KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9FQ0RIID09IDI3LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzI3KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9ITUFDID09IDI4LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzI4KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9ESUdFU1QgPT0gMjksIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMjkpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0NJUEhFUiA9PSAzMCwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8zMCk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfSEtERiA9PSAzMSwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8zMSk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfVVNFUiA9PSAzMiwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8zMik7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9OVU1fTElCUyA9PSAzMywgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF9udW0pOworCitjb25zdCB1aW50MzJfdCBrT3BlblNTTFJlYXNvblZhbHVlc1tdID0geworICAgIDB4YzMyMDgzYSwKKyAgICAweGMzMjg4NTQsCisgICAgMHhjMzMwODYzLAorICAgIDB4YzMzODg3MywKKyAgICAweGMzNDA4ODIsCisgICAgMHhjMzQ4ODliLAorICAgIDB4YzM1MDhhNywKKyAgICAweGMzNTg4YzQsCisgICAgMHhjMzYwOGU0LAorICAgIDB4YzM2ODhmMiwKKyAgICAweGMzNzA5MDIsCisgICAgMHhjMzc4OTBmLAorICAgIDB4YzM4MDkxZiwKKyAgICAweGMzODg5MmEsCisgICAgMHhjMzkwOTQwLAorICAgIDB4YzM5ODk0ZiwKKyAgICAweGMzYTA5NjMsCisgICAgMHhjM2E4ODQ3LAorICAgIDB4YzNiMDBlYSwKKyAgICAweGMzYjg4ZDYsCisgICAgMHgxMDMyMDg0NywKKyAgICAweDEwMzI5NTc0LAorICAgIDB4MTAzMzE1ODAsCisgICAgMHgxMDMzOTU5OSwKKyAgICAweDEwMzQxNWFjLAorICAgIDB4MTAzNDhmMTQsCisgICAgMHgxMDM1MGM2MCwKKyAgICAweDEwMzU5NWJmLAorICAgIDB4MTAzNjE1ZTksCisgICAgMHgxMDM2OTVmYywKKyAgICAweDEwMzcxNjFiLAorICAgIDB4MTAzNzk2MzQsCisgICAgMHgxMDM4MTY0OSwKKyAgICAweDEwMzg5NjY3LAorICAgIDB4MTAzOTE2NzYsCisgICAgMHgxMDM5OTY5MiwKKyAgICAweDEwM2ExNmFkLAorICAgIDB4MTAzYTk2YmMsCisgICAgMHgxMDNiMTZkOCwKKyAgICAweDEwM2I5NmYzLAorICAgIDB4MTAzYzE3MTksCisgICAgMHgxMDNjODBlYSwKKyAgICAweDEwM2QxNzJhLAorICAgIDB4MTAzZDk3M2UsCisgICAgMHgxMDNlMTc1ZCwKKyAgICAweDEwM2U5NzZjLAorICAgIDB4MTAzZjE3ODMsCisgICAgMHgxMDNmOTc5NiwKKyAgICAweDEwNDAwYzI0LAorICAgIDB4MTA0MDk3YTksCisgICAgMHgxMDQxMTdjNywKKyAgICAweDEwNDE5N2RhLAorICAgIDB4MTA0MjE3ZjQsCisgICAgMHgxMDQyOTgwNCwKKyAgICAweDEwNDMxODE4LAorICAgIDB4MTA0Mzk4MmUsCisgICAgMHgxMDQ0MTg0NiwKKyAgICAweDEwNDQ5ODViLAorICAgIDB4MTA0NTE4NmYsCisgICAgMHgxMDQ1OTg4MSwKKyAgICAweDEwNDYwNWZkLAorICAgIDB4MTA0Njg5NGYsCisgICAgMHgxMDQ3MTg5NiwKKyAgICAweDEwNDc5OGFkLAorICAgIDB4MTA0ODE4YzIsCisgICAgMHgxMDQ4OThkMCwKKyAgICAweDEwNDkwZTYwLAorICAgIDB4MTA0OTk3MGEsCisgICAgMHgxMDRhMTVkNCwKKyAgICAweDE0MzIwYzA3LAorICAgIDB4MTQzMjhjMTUsCisgICAgMHgxNDMzMGMyNCwKKyAgICAweDE0MzM4YzM2LAorICAgIDB4MTQzNDAwYWMsCisgICAgMHgxNDM0ODBlYSwKKyAgICAweDE4MzIwMDgzLAorICAgIDB4MTgzMjhmNmEsCisgICAgMHgxODMzMDBhYywKKyAgICAweDE4MzM4ZjgwLAorICAgIDB4MTgzNDBmOTQsCisgICAgMHgxODM0ODBlYSwKKyAgICAweDE4MzUwZmE5LAorICAgIDB4MTgzNThmYzEsCisgICAgMHgxODM2MGZkNiwKKyAgICAweDE4MzY4ZmVhLAorICAgIDB4MTgzNzEwMGUsCisgICAgMHgxODM3OTAyNCwKKyAgICAweDE4MzgxMDM4LAorICAgIDB4MTgzODkwNDgsCisgICAgMHgxODM5MGE3NSwKKyAgICAweDE4Mzk5MDU4LAorICAgIDB4MTgzYTEwODAsCisgICAgMHgxODNhOTBhNiwKKyAgICAweDE4M2IwYzZjLAorICAgIDB4MTgzYjkwZGIsCisgICAgMHgxODNjMTBlZCwKKyAgICAweDE4M2M5MGY4LAorICAgIDB4MTgzZDExMDgsCisgICAgMHgxODNkOTExOSwKKyAgICAweDE4M2UxMTJhLAorICAgIDB4MTgzZTkxM2MsCisgICAgMHgxODNmMTE2NSwKKyAgICAweDE4M2Y5MTdlLAorICAgIDB4MTg0MDExOTYsCisgICAgMHgxODQwODZkNSwKKyAgICAweDE4NDExMGM5LAorICAgIDB4MTg0MTkwOTQsCisgICAgMHgxODQyMTBiMywKKyAgICAweDE4NDI5MDZkLAorICAgIDB4MjAzMjExZDAsCisgICAgMHgyMDMyOTFiZCwKKyAgICAweDI0MzIxMWRjLAorICAgIDB4MjQzMjg5OTUsCisgICAgMHgyNDMzMTFlZSwKKyAgICAweDI0MzM5MWZiLAorICAgIDB4MjQzNDEyMDgsCisgICAgMHgyNDM0OTIxYSwKKyAgICAweDI0MzUxMjI5LAorICAgIDB4MjQzNTkyNDYsCisgICAgMHgyNDM2MTI1MywKKyAgICAweDI0MzY5MjYxLAorICAgIDB4MjQzNzEyNmYsCisgICAgMHgyNDM3OTI3ZCwKKyAgICAweDI0MzgxMjg2LAorICAgIDB4MjQzODkyOTMsCisgICAgMHgyNDM5MTJhNiwKKyAgICAweDI4MzIwYzU0LAorICAgIDB4MjgzMjhjNmMsCisgICAgMHgyODMzMGMyNCwKKyAgICAweDI4MzM4YzdmLAorICAgIDB4MjgzNDBjNjAsCisgICAgMHgyODM0ODBhYywKKyAgICAweDI4MzUwMGVhLAorICAgIDB4MmMzMjJlNWUsCisgICAgMHgyYzMyOTJiZCwKKyAgICAweDJjMzMyZTZjLAorICAgIDB4MmMzM2FlN2UsCisgICAgMHgyYzM0MmU5MiwKKyAgICAweDJjMzRhZWE0LAorICAgIDB4MmMzNTJlYmYsCisgICAgMHgyYzM1YWVkMSwKKyAgICAweDJjMzYyZWU0LAorICAgIDB4MmMzNjgzMmQsCisgICAgMHgyYzM3MmVmMSwKKyAgICAweDJjMzdhZjAzLAorICAgIDB4MmMzODJmMjgsCisgICAgMHgyYzM4YWYzZiwKKyAgICAweDJjMzkyZjRkLAorICAgIDB4MmMzOWFmNWQsCisgICAgMHgyYzNhMmY2ZiwKKyAgICAweDJjM2FhZjgzLAorICAgIDB4MmMzYjJmOTQsCisgICAgMHgyYzNiYWZiMywKKyAgICAweDJjM2MxMmNmLAorICAgIDB4MmMzYzkyZTUsCisgICAgMHgyYzNkMmZjNywKKyAgICAweDJjM2Q5MmZlLAorICAgIDB4MmMzZTJmZTQsCisgICAgMHgyYzNlYWZmMiwKKyAgICAweDJjM2YzMDBhLAorICAgIDB4MmMzZmIwMjIsCisgICAgMHgyYzQwMzAyZiwKKyAgICAweDJjNDA5MWQwLAorICAgIDB4MmM0MTMwNDAsCisgICAgMHgyYzQxYjA1MywKKyAgICAweDJjNDIxMTk2LAorICAgIDB4MmM0MmIwNjQsCisgICAgMHgyYzQzMDcyMiwKKyAgICAweDJjNDNhZmE1LAorICAgIDB4MmM0NDJmMTYsCisgICAgMHgzMDMyMDAwMCwKKyAgICAweDMwMzI4MDE1LAorICAgIDB4MzAzMzAwMWYsCisgICAgMHgzMDMzODAzOCwKKyAgICAweDMwMzQwMDRhLAorICAgIDB4MzAzNDgwNjQsCisgICAgMHgzMDM1MDA2YiwKKyAgICAweDMwMzU4MDgzLAorICAgIDB4MzAzNjAwOTQsCisgICAgMHgzMDM2ODBhYywKKyAgICAweDMwMzcwMGI5LAorICAgIDB4MzAzNzgwYzgsCisgICAgMHgzMDM4MDBlYSwKKyAgICAweDMwMzg4MGY3LAorICAgIDB4MzAzOTAxMGEsCisgICAgMHgzMDM5ODEyNSwKKyAgICAweDMwM2EwMTNhLAorICAgIDB4MzAzYTgxNGUsCisgICAgMHgzMDNiMDE2MiwKKyAgICAweDMwM2I4MTczLAorICAgIDB4MzAzYzAxOGMsCisgICAgMHgzMDNjODFhOSwKKyAgICAweDMwM2QwMWI3LAorICAgIDB4MzAzZDgxY2IsCisgICAgMHgzMDNlMDFkYiwKKyAgICAweDMwM2U4MWY0LAorICAgIDB4MzAzZjAyMDQsCisgICAgMHgzMDNmODIxNywKKyAgICAweDMwNDAwMjI2LAorICAgIDB4MzA0MDgyMzIsCisgICAgMHgzMDQxMDI0NywKKyAgICAweDMwNDE4MjU3LAorICAgIDB4MzA0MjAyNmUsCisgICAgMHgzMDQyODI3YiwKKyAgICAweDMwNDMwMjhlLAorICAgIDB4MzA0MzgyOWQsCisgICAgMHgzMDQ0MDJiMiwKKyAgICAweDMwNDQ4MmQzLAorICAgIDB4MzA0NTAyZTYsCisgICAgMHgzMDQ1ODJmOSwKKyAgICAweDMwNDYwMzEyLAorICAgIDB4MzA0NjgzMmQsCisgICAgMHgzMDQ3MDM0YSwKKyAgICAweDMwNDc4MzVjLAorICAgIDB4MzA0ODAzNmEsCisgICAgMHgzMDQ4ODM3YiwKKyAgICAweDMwNDkwMzhhLAorICAgIDB4MzA0OTgzYTIsCisgICAgMHgzMDRhMDNiNCwKKyAgICAweDMwNGE4M2M4LAorICAgIDB4MzA0YjAzZTAsCisgICAgMHgzMDRiODNmMywKKyAgICAweDMwNGMwM2ZlLAorICAgIDB4MzA0Yzg0MGYsCisgICAgMHgzMDRkMDQxYiwKKyAgICAweDMwNGQ4NDMxLAorICAgIDB4MzA0ZTA0M2YsCisgICAgMHgzMDRlODQ1NSwKKyAgICAweDMwNGYwNDY3LAorICAgIDB4MzA0Zjg0NzksCisgICAgMHgzMDUwMDQ5YywKKyAgICAweDMwNTA4NGFmLAorICAgIDB4MzA1MTA0YzAsCisgICAgMHgzMDUxODRkMCwKKyAgICAweDMwNTIwNGU4LAorICAgIDB4MzA1Mjg0ZmQsCisgICAgMHgzMDUzMDUxNSwKKyAgICAweDMwNTM4NTI5LAorICAgIDB4MzA1NDA1NDEsCisgICAgMHgzMDU0ODU1YSwKKyAgICAweDMwNTUwNTczLAorICAgIDB4MzA1NTg1OTAsCisgICAgMHgzMDU2MDU5YiwKKyAgICAweDMwNTY4NWIzLAorICAgIDB4MzA1NzA1YzMsCisgICAgMHgzMDU3ODVkNCwKKyAgICAweDMwNTgwNWU3LAorICAgIDB4MzA1ODg1ZmQsCisgICAgMHgzMDU5MDYwNiwKKyAgICAweDMwNTk4NjFiLAorICAgIDB4MzA1YTA2MmUsCisgICAgMHgzMDVhODYzZCwKKyAgICAweDMwNWIwNjVkLAorICAgIDB4MzA1Yjg2NmMsCisgICAgMHgzMDVjMDY4ZCwKKyAgICAweDMwNWM4NmE5LAorICAgIDB4MzA1ZDA2YjUsCisgICAgMHgzMDVkODZkNSwKKyAgICAweDMwNWUwNmYxLAorICAgIDB4MzA1ZTg3MDIsCisgICAgMHgzMDVmMDcxOCwKKyAgICAweDMwNWY4NzIyLAorICAgIDB4MzA2MDA0OGMsCisgICAgMHgzNDMyMGI2NSwKKyAgICAweDM0MzI4Yjc5LAorICAgIDB4MzQzMzBiOTYsCisgICAgMHgzNDMzOGJhOSwKKyAgICAweDM0MzQwYmI4LAorICAgIDB4MzQzNDhiZjEsCisgICAgMHgzNDM1MGJkNSwKKyAgICAweDNjMzIwMDgzLAorICAgIDB4M2MzMjhjYTksCisgICAgMHgzYzMzMGNjMiwKKyAgICAweDNjMzM4Y2RkLAorICAgIDB4M2MzNDBjZmEsCisgICAgMHgzYzM0OGQyNCwKKyAgICAweDNjMzUwZDNmLAorICAgIDB4M2MzNThkNjUsCisgICAgMHgzYzM2MGQ3ZSwKKyAgICAweDNjMzY4ZDk2LAorICAgIDB4M2MzNzBkYTcsCisgICAgMHgzYzM3OGRiNSwKKyAgICAweDNjMzgwZGMyLAorICAgIDB4M2MzODhkZDYsCisgICAgMHgzYzM5MGM2YywKKyAgICAweDNjMzk4ZGY5LAorICAgIDB4M2MzYTBlMGQsCisgICAgMHgzYzNhODkwZiwKKyAgICAweDNjM2IwZTFkLAorICAgIDB4M2MzYjhlMzgsCisgICAgMHgzYzNjMGU0YSwKKyAgICAweDNjM2M4ZTdkLAorICAgIDB4M2MzZDBlODcsCisgICAgMHgzYzNkOGU5YiwKKyAgICAweDNjM2UwZWE5LAorICAgIDB4M2MzZThlY2UsCisgICAgMHgzYzNmMGM5NSwKKyAgICAweDNjM2Y4ZWI3LAorICAgIDB4M2M0MDAwYWMsCisgICAgMHgzYzQwODBlYSwKKyAgICAweDNjNDEwZDE1LAorICAgIDB4M2M0MThkNTQsCisgICAgMHgzYzQyMGU2MCwKKyAgICAweDNjNDI4ZGVhLAorICAgIDB4NDAzMjE5NDYsCisgICAgMHg0MDMyOTk1YywKKyAgICAweDQwMzMxOThhLAorICAgIDB4NDAzMzk5OTQsCisgICAgMHg0MDM0MTlhYiwKKyAgICAweDQwMzQ5OWM5LAorICAgIDB4NDAzNTE5ZDksCisgICAgMHg0MDM1OTllYiwKKyAgICAweDQwMzYxOWY4LAorICAgIDB4NDAzNjlhMDQsCisgICAgMHg0MDM3MWExOSwKKyAgICAweDQwMzc5YTJiLAorICAgIDB4NDAzODFhMzYsCisgICAgMHg0MDM4OWE0OCwKKyAgICAweDQwMzkwZjE0LAorICAgIDB4NDAzOTlhNTgsCisgICAgMHg0MDNhMWE2YiwKKyAgICAweDQwM2E5YThjLAorICAgIDB4NDAzYjFhOWQsCisgICAgMHg0MDNiOWFhZCwKKyAgICAweDQwM2MwMDY0LAorICAgIDB4NDAzYzgwODMsCisgICAgMHg0MDNkMWIzMSwKKyAgICAweDQwM2Q5YjQ3LAorICAgIDB4NDAzZTFiNTYsCisgICAgMHg0MDNlOWI4ZSwKKyAgICAweDQwM2YxYmE4LAorICAgIDB4NDAzZjliZDAsCisgICAgMHg0MDQwMWJlNSwKKyAgICAweDQwNDA5YmY5LAorICAgIDB4NDA0MTFjMTYsCisgICAgMHg0MDQxOWMzMSwKKyAgICAweDQwNDIxYzRhLAorICAgIDB4NDA0MjljNWQsCisgICAgMHg0MDQzMWM3MSwKKyAgICAweDQwNDM5Yzg5LAorICAgIDB4NDA0NDFjYTAsCisgICAgMHg0MDQ0ODBhYywKKyAgICAweDQwNDUxY2I1LAorICAgIDB4NDA0NTljYzcsCisgICAgMHg0MDQ2MWNlYiwKKyAgICAweDQwNDY5ZDBiLAorICAgIDB4NDA0NzFkMTksCisgICAgMHg0MDQ3OWQ0MCwKKyAgICAweDQwNDgxZGIxLAorICAgIDB4NDA0ODlkZTQsCisgICAgMHg0MDQ5MWRmYiwKKyAgICAweDQwNDk5ZTE1LAorICAgIDB4NDA0YTFlMmMsCisgICAgMHg0MDRhOWU0YSwKKyAgICAweDQwNGIxZTYyLAorICAgIDB4NDA0YjllNzksCisgICAgMHg0MDRjMWU4ZiwKKyAgICAweDQwNGM5ZWExLAorICAgIDB4NDA0ZDFlYzIsCisgICAgMHg0MDRkOWVmYiwKKyAgICAweDQwNGUxZjBmLAorICAgIDB4NDA0ZTlmMWMsCisgICAgMHg0MDRmMWY0OSwKKyAgICAweDQwNGY5ZjcyLAorICAgIDB4NDA1MDFmYzksCisgICAgMHg0MDUwOWZkZCwKKyAgICAweDQwNTExZmY4LAorICAgIDB4NDA1MjIwMDgsCisgICAgMHg0MDUyYTAyYywKKyAgICAweDQwNTMyMDQ0LAorICAgIDB4NDA1M2EwNTcsCisgICAgMHg0MDU0MjA2YywKKyAgICAweDQwNTRhMDhmLAorICAgIDB4NDA1NTIwOWQsCisgICAgMHg0MDU1YTBkYSwKKyAgICAweDQwNTYyMGU3LAorICAgIDB4NDA1NmExMDAsCisgICAgMHg0MDU3MjExOCwKKyAgICAweDQwNTdhMTJiLAorICAgIDB4NDA1ODIxNDAsCisgICAgMHg0MDU4YTE2NywKKyAgICAweDQwNTkyMTk2LAorICAgIDB4NDA1OWExYzMsCisgICAgMHg0MDVhMjFkNywKKyAgICAweDQwNWFhMWU3LAorICAgIDB4NDA1YjIxZmYsCisgICAgMHg0MDViYTIxMCwKKyAgICAweDQwNWMyMjIzLAorICAgIDB4NDA1Y2EyNjIsCisgICAgMHg0MDVkMjI2ZiwKKyAgICAweDQwNWRhMjk0LAorICAgIDB4NDA1ZTIyZDIsCisgICAgMHg0MDVlOGFiMywKKyAgICAweDQwNWYyMmYzLAorICAgIDB4NDA1ZmEzMDAsCisgICAgMHg0MDYwMjMwZSwKKyAgICAweDQwNjBhMzMwLAorICAgIDB4NDA2MTIzOTEsCisgICAgMHg0MDYxYTNjOSwKKyAgICAweDQwNjIyM2UwLAorICAgIDB4NDA2MmEzZjEsCisgICAgMHg0MDYzMjQwMiwKKyAgICAweDQwNjNhNDE3LAorICAgIDB4NDA2NDI0MmUsCisgICAgMHg0MDY0YTQ1YSwKKyAgICAweDQwNjUyNDc1LAorICAgIDB4NDA2NWE0OGMsCisgICAgMHg0MDY2MjRhNCwKKyAgICAweDQwNjZhNGNlLAorICAgIDB4NDA2NzI0ZjksCisgICAgMHg0MDY3YTUzZSwKKyAgICAweDQwNjgyNTg2LAorICAgIDB4NDA2OGE1YTcsCisgICAgMHg0MDY5MjVkOSwKKyAgICAweDQwNjlhNjA3LAorICAgIDB4NDA2YTI2MjgsCisgICAgMHg0MDZhYTY0OCwKKyAgICAweDQwNmIyN2QwLAorICAgIDB4NDA2YmE3ZjMsCisgICAgMHg0MDZjMjgwOSwKKyAgICAweDQwNmNhYWFjLAorICAgIDB4NDA2ZDJhZGIsCisgICAgMHg0MDZkYWIwMywKKyAgICAweDQwNmUyYjMxLAorICAgIDB4NDA2ZWFiN2UsCisgICAgMHg0MDZmMmJiOSwKKyAgICAweDQwNmZhYmYxLAorICAgIDB4NDA3MDJjMDQsCisgICAgMHg0MDcwYWMyMSwKKyAgICAweDQwNzEwODAyLAorICAgIDB4NDA3MWFjMzMsCisgICAgMHg0MDcyMmM0NiwKKyAgICAweDQwNzJhYzdjLAorICAgIDB4NDA3MzJjOTQsCisgICAgMHg0MDczOTRjZiwKKyAgICAweDQwNzQyY2E4LAorICAgIDB4NDA3NGFjYzIsCisgICAgMHg0MDc1MmNkMywKKyAgICAweDQwNzVhY2U3LAorICAgIDB4NDA3NjJjZjUsCisgICAgMHg0MDc2OTI5MywKKyAgICAweDQwNzcyZDFhLAorICAgIDB4NDA3N2FkM2MsCisgICAgMHg0MDc4MmQ1NywKKyAgICAweDQwNzhhZDkwLAorICAgIDB4NDA3OTJkYTcsCisgICAgMHg0MDc5YWRiZCwKKyAgICAweDQwN2EyZGM5LAorICAgIDB4NDA3YWFkZGMsCisgICAgMHg0MDdiMmRmMSwKKyAgICAweDQwN2JhZTAzLAorICAgIDB4NDA3YzJlMzQsCisgICAgMHg0MDdjYWUzZCwKKyAgICAweDQwN2QyNWMyLAorICAgIDB4NDA3ZDlmODIsCisgICAgMHg0MDdlMmQ2YywKKyAgICAweDQwN2VhMTc3LAorICAgIDB4NDA3ZjFkMmQsCisgICAgMHg0MDdmOWFkMywKKyAgICAweDQwODAxZjU5LAorICAgIDB4NDA4MDlkNTUsCisgICAgMHg0MDgxMjAxYSwKKyAgICAweDQwODE5ZjMzLAorICAgIDB4NDA4MjJiMWMsCisgICAgMHg0MDgyOWFiOSwKKyAgICAweDQwODMyMTUyLAorICAgIDB4NDA4M2E0M2YsCisgICAgMHg0MDg0MWQ2OSwKKyAgICAweDQwODRhMWFmLAorICAgIDB4NDA4NTIyMzQsCisgICAgMHg0MDg1YTM1OCwKKyAgICAweDQwODYyMmI0LAorICAgIDB4NDA4NjlmOWMsCisgICAgMHg0MDg3MmI2MiwKKyAgICAweDQwODdhM2E2LAorICAgIDB4NDA4ODFiMWEsCisgICAgMHg0MDg4YTU1MSwKKyAgICAweDQwODkxYjY5LAorICAgIDB4NDA4OTlhZjYsCisgICAgMHg0MDhhMjg0MSwKKyAgICAweDQwOGE5OGU3LAorICAgIDB4NDA4YjJlMTgsCisgICAgMHg0MDhiYWJjZSwKKyAgICAweDQwOGMyMjQ0LAorICAgIDB4NDA4Yzk5MDMsCisgICAgMHg0MDhkMWRjYSwKKyAgICAweDQwOGQ5ZDliLAorICAgIDB4NDA4ZTFlZTQsCisgICAgMHg0MDhlYTBiYSwKKyAgICAweDQwOGYyNTY1LAorICAgIDB4NDA4ZmEzNzQsCisgICAgMHg0MDkwMjUxYSwKKyAgICAweDQwOTBhMjg2LAorICAgIDB4NDA5MTI4MjksCisgICAgMHg0MDkxOTkyOSwKKyAgICAweDQwOTIxYmI2LAorICAgIDB4NDA5MmFiOWQsCisgICAgMHg0MDkzMmM1ZiwKKyAgICAweDQwOTM5ZmFkLAorICAgIDB4NDA5NDFkN2QsCisgICAgMHg0MDk0YTg1YSwKKyAgICAweDQxZjQyNmZiLAorICAgIDB4NDFmOTI3OGQsCisgICAgMHg0MWZlMjY4MCwKKyAgICAweDQxZmVhODlkLAorICAgIDB4NDFmZjI5OGUsCisgICAgMHg0MjAzMjcxNCwKKyAgICAweDQyMDgyNzM2LAorICAgIDB4NDIwOGE3NzIsCisgICAgMHg0MjA5MjY2NCwKKyAgICAweDQyMDlhN2FjLAorICAgIDB4NDIwYTI2YmIsCisgICAgMHg0MjBhYTY5YiwKKyAgICAweDQyMGIyNmRiLAorICAgIDB4NDIwYmE3NTQsCisgICAgMHg0MjBjMjlhYSwKKyAgICAweDQyMGNhODZhLAorICAgIDB4NDIwZDI4ODQsCisgICAgMHg0MjBkYThiYiwKKyAgICAweDQyMTIyOGQ1LAorICAgIDB4NDIxNzI5NzEsCisgICAgMHg0MjE3YTkxNywKKyAgICAweDQyMWMyOTM5LAorICAgIDB4NDIxZjI4ZjQsCisgICAgMHg0MjIxMjljMSwKKyAgICAweDQyMjYyOTU0LAorICAgIDB4NDIyYjJhOTAsCisgICAgMHg0MjJiYWEzZSwKKyAgICAweDQyMmMyYTc4LAorICAgIDB4NDIyY2E5ZmQsCisgICAgMHg0MjJkMjlkYywKKyAgICAweDQyMmRhYTVkLAorICAgIDB4NDIyZTJhMjMsCisgICAgMHg0MjJlYWI0OSwKKyAgICAweDQ0MzIwNzJkLAorICAgIDB4NDQzMjg3M2MsCisgICAgMHg0NDMzMDc0OCwKKyAgICAweDQ0MzM4NzU2LAorICAgIDB4NDQzNDA3NjksCisgICAgMHg0NDM0ODc3YSwKKyAgICAweDQ0MzUwNzgxLAorICAgIDB4NDQzNTg3OGIsCisgICAgMHg0NDM2MDc5ZSwKKyAgICAweDQ0MzY4N2I0LAorICAgIDB4NDQzNzA3YzYsCisgICAgMHg0NDM3ODdkMywKKyAgICAweDQ0MzgwN2UyLAorICAgIDB4NDQzODg3ZWEsCisgICAgMHg0NDM5MDgwMiwKKyAgICAweDQ0Mzk4ODEwLAorICAgIDB4NDQzYTA4MjMsCisgICAgMHg0ODMyMTJiZCwKKyAgICAweDQ4MzI5MmNmLAorICAgIDB4NDgzMzEyZTUsCisgICAgMHg0ODMzOTJmZSwKKyAgICAweDRjMzIxMzIzLAorICAgIDB4NGMzMjkzMzMsCisgICAgMHg0YzMzMTM0NiwKKyAgICAweDRjMzM5MzY2LAorICAgIDB4NGMzNDAwYWMsCisgICAgMHg0YzM0ODBlYSwKKyAgICAweDRjMzUxMzcyLAorICAgIDB4NGMzNTkzODAsCisgICAgMHg0YzM2MTM5YywKKyAgICAweDRjMzY5M2MyLAorICAgIDB4NGMzNzEzZDEsCisgICAgMHg0YzM3OTNkZiwKKyAgICAweDRjMzgxM2Y0LAorICAgIDB4NGMzODk0MDAsCisgICAgMHg0YzM5MTQyMCwKKyAgICAweDRjMzk5NDRhLAorICAgIDB4NGMzYTE0NjMsCisgICAgMHg0YzNhOTQ3YywKKyAgICAweDRjM2IwNWZkLAorICAgIDB4NGMzYjk0OTUsCisgICAgMHg0YzNjMTRhNywKKyAgICAweDRjM2M5NGI2LAorICAgIDB4NGMzZDE0Y2YsCisgICAgMHg0YzNkOGM0NywKKyAgICAweDRjM2UxNTNjLAorICAgIDB4NGMzZTk0ZGUsCisgICAgMHg0YzNmMTU1ZSwKKyAgICAweDRjM2Y5MjkzLAorICAgIDB4NGM0MDE0ZjQsCisgICAgMHg0YzQwOTMwZiwKKyAgICAweDRjNDExNTJjLAorICAgIDB4NGM0MTkzYWYsCisgICAgMHg0YzQyMTUxOCwKKyAgICAweDUwMzIzMDc2LAorICAgIDB4NTAzMmIwODUsCisgICAgMHg1MDMzMzA5MCwKKyAgICAweDUwMzNiMGEwLAorICAgIDB4NTAzNDMwYjksCisgICAgMHg1MDM0YjBkMywKKyAgICAweDUwMzUzMGUxLAorICAgIDB4NTAzNWIwZjcsCisgICAgMHg1MDM2MzEwOSwKKyAgICAweDUwMzZiMTFmLAorICAgIDB4NTAzNzMxMzgsCisgICAgMHg1MDM3YjE0YiwKKyAgICAweDUwMzgzMTYzLAorICAgIDB4NTAzOGIxNzQsCisgICAgMHg1MDM5MzE4OSwKKyAgICAweDUwMzliMTlkLAorICAgIDB4NTAzYTMxYmQsCisgICAgMHg1MDNhYjFkMywKKyAgICAweDUwM2IzMWViLAorICAgIDB4NTAzYmIxZmQsCisgICAgMHg1MDNjMzIxOSwKKyAgICAweDUwM2NiMjMwLAorICAgIDB4NTAzZDMyNDksCisgICAgMHg1MDNkYjI1ZiwKKyAgICAweDUwM2UzMjZjLAorICAgIDB4NTAzZWIyODIsCisgICAgMHg1MDNmMzI5NCwKKyAgICAweDUwM2Y4MzdiLAorICAgIDB4NTA0MDMyYTcsCisgICAgMHg1MDQwYjJiNywKKyAgICAweDUwNDEzMmQxLAorICAgIDB4NTA0MWIyZTAsCisgICAgMHg1MDQyMzJmYSwKKyAgICAweDUwNDJiMzE3LAorICAgIDB4NTA0MzMzMjcsCisgICAgMHg1MDQzYjMzNywKKyAgICAweDUwNDQzMzQ2LAorICAgIDB4NTA0NDg0MzEsCisgICAgMHg1MDQ1MzM1YSwKKyAgICAweDUwNDViMzc4LAorICAgIDB4NTA0NjMzOGIsCisgICAgMHg1MDQ2YjNhMSwKKyAgICAweDUwNDczM2IzLAorICAgIDB4NTA0N2IzYzgsCisgICAgMHg1MDQ4MzNlZSwKKyAgICAweDUwNDhiM2ZjLAorICAgIDB4NTA0OTM0MGYsCisgICAgMHg1MDQ5YjQyNCwKKyAgICAweDUwNGEzNDNhLAorICAgIDB4NTA0YWI0NGEsCisgICAgMHg1MDRiMzQ2YSwKKyAgICAweDUwNGJiNDdkLAorICAgIDB4NTA0YzM0YTAsCisgICAgMHg1MDRjYjRjZSwKKyAgICAweDUwNGQzNGUwLAorICAgIDB4NTA0ZGI0ZmQsCisgICAgMHg1MDRlMzUxOCwKKyAgICAweDUwNGViNTM0LAorICAgIDB4NTA0ZjM1NDYsCisgICAgMHg1MDRmYjU1ZCwKKyAgICAweDUwNTAzNTZjLAorICAgIDB4NTA1MDg2ZjEsCisgICAgMHg1MDUxMzU3ZiwKKyAgICAweDU4MzIwZjUyLAorICAgIDB4NjgzMjBmMTQsCisgICAgMHg2ODMyOGM2YywKKyAgICAweDY4MzMwYzdmLAorICAgIDB4NjgzMzhmMjIsCisgICAgMHg2ODM0MGYzMiwKKyAgICAweDY4MzQ4MGVhLAorICAgIDB4NmMzMjBlZGEsCisgICAgMHg2YzMyOGMzNiwKKyAgICAweDZjMzMwZWU1LAorICAgIDB4NmMzMzhlZmUsCisgICAgMHg3NDMyMGExYiwKKyAgICAweDc0MzI4MGFjLAorICAgIDB4NzQzMzBjNDcsCisgICAgMHg3ODMyMDk4MCwKKyAgICAweDc4MzI4OTk1LAorICAgIDB4NzgzMzA5YTEsCisgICAgMHg3ODMzODA4MywKKyAgICAweDc4MzQwOWIwLAorICAgIDB4NzgzNDg5YzUsCisgICAgMHg3ODM1MDllNCwKKyAgICAweDc4MzU4YTA2LAorICAgIDB4NzgzNjBhMWIsCisgICAgMHg3ODM2OGEzMSwKKyAgICAweDc4MzcwYTQxLAorICAgIDB4NzgzNzhhNjIsCisgICAgMHg3ODM4MGE3NSwKKyAgICAweDc4Mzg4YTg3LAorICAgIDB4NzgzOTBhOTQsCisgICAgMHg3ODM5OGFiMywKKyAgICAweDc4M2EwYWM4LAorICAgIDB4NzgzYThhZDYsCisgICAgMHg3ODNiMGFlMCwKKyAgICAweDc4M2I4YWY0LAorICAgIDB4NzgzYzBiMGIsCisgICAgMHg3ODNjOGIyMCwKKyAgICAweDc4M2QwYjM3LAorICAgIDB4NzgzZDhiNGMsCisgICAgMHg3ODNlMGFhMiwKKyAgICAweDc4M2U4YTU0LAorICAgIDB4N2MzMjExYWMsCit9OworCitjb25zdCBzaXplX3Qga09wZW5TU0xSZWFzb25WYWx1ZXNMZW4gPSBzaXplb2Yoa09wZW5TU0xSZWFzb25WYWx1ZXMpIC8gc2l6ZW9mKGtPcGVuU1NMUmVhc29uVmFsdWVzWzBdKTsKKworY29uc3QgY2hhciBrT3BlblNTTFJlYXNvblN0cmluZ0RhdGFbXSA9CisgICAgIkFTTjFfTEVOR1RIX01JU01BVENIXDAiCisgICAgIkFVWF9FUlJPUlwwIgorICAgICJCQURfR0VUX0FTTjFfT0JKRUNUX0NBTExcMCIKKyAgICAiQkFEX09CSkVDVF9IRUFERVJcMCIKKyAgICAiQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSFwwIgorICAgICJCTl9MSUJcMCIKKyAgICAiQk9PTEVBTl9JU19XUk9OR19MRU5HVEhcMCIKKyAgICAiQlVGRkVSX1RPT19TTUFMTFwwIgorICAgICJDT05URVhUX05PVF9JTklUSUFMSVNFRFwwIgorICAgICJERUNPREVfRVJST1JcMCIKKyAgICAiREVQVEhfRVhDRUVERURcMCIKKyAgICAiRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVEXDAiCisgICAgIkVOQ09ERV9FUlJPUlwwIgorICAgICJFUlJPUl9HRVRUSU5HX1RJTUVcMCIKKyAgICAiRVhQRUNUSU5HX0FOX0FTTjFfU0VRVUVOQ0VcMCIKKyAgICAiRVhQRUNUSU5HX0FOX0lOVEVHRVJcMCIKKyAgICAiRVhQRUNUSU5HX0FOX09CSkVDVFwwIgorICAgICJFWFBFQ1RJTkdfQV9CT09MRUFOXDAiCisgICAgIkVYUEVDVElOR19BX1RJTUVcMCIKKyAgICAiRVhQTElDSVRfTEVOR1RIX01JU01BVENIXDAiCisgICAgIkVYUExJQ0lUX1RBR19OT1RfQ09OU1RSVUNURURcMCIKKyAgICAiRklFTERfTUlTU0lOR1wwIgorICAgICJGSVJTVF9OVU1fVE9PX0xBUkdFXDAiCisgICAgIkhFQURFUl9UT09fTE9OR1wwIgorICAgICJJTExFR0FMX0JJVFNUUklOR19GT1JNQVRcMCIKKyAgICAiSUxMRUdBTF9CT09MRUFOXDAiCisgICAgIklMTEVHQUxfQ0hBUkFDVEVSU1wwIgorICAgICJJTExFR0FMX0ZPUk1BVFwwIgorICAgICJJTExFR0FMX0hFWFwwIgorICAgICJJTExFR0FMX0lNUExJQ0lUX1RBR1wwIgorICAgICJJTExFR0FMX0lOVEVHRVJcMCIKKyAgICAiSUxMRUdBTF9ORVNURURfVEFHR0lOR1wwIgorICAgICJJTExFR0FMX05VTExcMCIKKyAgICAiSUxMRUdBTF9OVUxMX1ZBTFVFXDAiCisgICAgIklMTEVHQUxfT0JKRUNUXDAiCisgICAgIklMTEVHQUxfT1BUSU9OQUxfQU5ZXDAiCisgICAgIklMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFXDAiCisgICAgIklMTEVHQUxfVEFHR0VEX0FOWVwwIgorICAgICJJTExFR0FMX1RJTUVfVkFMVUVcMCIKKyAgICAiSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUXDAiCisgICAgIklOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HXDAiCisgICAgIklOVkFMSURfQklUX1NUUklOR19CSVRTX0xFRlRcMCIKKyAgICAiSU5WQUxJRF9CTVBTVFJJTkdcMCIKKyAgICAiSU5WQUxJRF9ESUdJVFwwIgorICAgICJJTlZBTElEX01PRElGSUVSXDAiCisgICAgIklOVkFMSURfTlVNQkVSXDAiCisgICAgIklOVkFMSURfT0JKRUNUX0VOQ09ESU5HXDAiCisgICAgIklOVkFMSURfU0VQQVJBVE9SXDAiCisgICAgIklOVkFMSURfVElNRV9GT1JNQVRcMCIKKyAgICAiSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdcMCIKKyAgICAiSU5WQUxJRF9VVEY4U1RSSU5HXDAiCisgICAgIkxJU1RfRVJST1JcMCIKKyAgICAiTUlTU0lOR19BU04xX0VPU1wwIgorICAgICJNSVNTSU5HX0VPQ1wwIgorICAgICJNSVNTSU5HX1NFQ09ORF9OVU1CRVJcMCIKKyAgICAiTUlTU0lOR19WQUxVRVwwIgorICAgICJNU1RSSU5HX05PVF9VTklWRVJTQUxcMCIKKyAgICAiTVNUUklOR19XUk9OR19UQUdcMCIKKyAgICAiTkVTVEVEX0FTTjFfRVJST1JcMCIKKyAgICAiTkVTVEVEX0FTTjFfU1RSSU5HXDAiCisgICAgIk5FU1RFRF9UT09fREVFUFwwIgorICAgICJOT05fSEVYX0NIQVJBQ1RFUlNcMCIKKyAgICAiTk9UX0FTQ0lJX0ZPUk1BVFwwIgorICAgICJOT1RfRU5PVUdIX0RBVEFcMCIKKyAgICAiTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEVcMCIKKyAgICAiTlVMTF9JU19XUk9OR19MRU5HVEhcMCIKKyAgICAiT0JKRUNUX05PVF9BU0NJSV9GT1JNQVRcMCIKKyAgICAiT0REX05VTUJFUl9PRl9DSEFSU1wwIgorICAgICJTRUNPTkRfTlVNQkVSX1RPT19MQVJHRVwwIgorICAgICJTRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0hcMCIKKyAgICAiU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVEXDAiCisgICAgIlNFUVVFTkNFX09SX1NFVF9ORUVEU19DT05GSUdcMCIKKyAgICAiU0hPUlRfTElORVwwIgorICAgICJTVFJFQU1JTkdfTk9UX1NVUFBPUlRFRFwwIgorICAgICJTVFJJTkdfVE9PX0xPTkdcMCIKKyAgICAiU1RSSU5HX1RPT19TSE9SVFwwIgorICAgICJUQUdfVkFMVUVfVE9PX0hJR0hcMCIKKyAgICAiVElNRV9OT1RfQVNDSUlfRk9STUFUXDAiCisgICAgIlRPT19MT05HXDAiCisgICAgIlRZUEVfTk9UX0NPTlNUUlVDVEVEXDAiCisgICAgIlRZUEVfTk9UX1BSSU1JVElWRVwwIgorICAgICJVTkVYUEVDVEVEX0VPQ1wwIgorICAgICJVTklWRVJTQUxTVFJJTkdfSVNfV1JPTkdfTEVOR1RIXDAiCisgICAgIlVOS05PV05fRk9STUFUXDAiCisgICAgIlVOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNXDAiCisgICAgIlVOS05PV05fU0lHTkFUVVJFX0FMR09SSVRITVwwIgorICAgICJVTktOT1dOX1RBR1wwIgorICAgICJVTlNVUFBPUlRFRF9BTllfREVGSU5FRF9CWV9UWVBFXDAiCisgICAgIlVOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRVwwIgorICAgICJVTlNVUFBPUlRFRF9UWVBFXDAiCisgICAgIldST05HX1BVQkxJQ19LRVlfVFlQRVwwIgorICAgICJXUk9OR19UQUdcMCIKKyAgICAiV1JPTkdfVFlQRVwwIgorICAgICJCQURfRk9QRU5fTU9ERVwwIgorICAgICJCUk9LRU5fUElQRVwwIgorICAgICJDT05ORUNUX0VSUk9SXDAiCisgICAgIkVSUk9SX1NFVFRJTkdfTkJJT1wwIgorICAgICJJTlZBTElEX0FSR1VNRU5UXDAiCisgICAgIklOX1VTRVwwIgorICAgICJLRUVQQUxJVkVcMCIKKyAgICAiTkJJT19DT05ORUNUX0VSUk9SXDAiCisgICAgIk5PX0hPU1ROQU1FX1NQRUNJRklFRFwwIgorICAgICJOT19QT1JUX1NQRUNJRklFRFwwIgorICAgICJOT19TVUNIX0ZJTEVcMCIKKyAgICAiTlVMTF9QQVJBTUVURVJcMCIKKyAgICAiU1lTX0xJQlwwIgorICAgICJVTkFCTEVfVE9fQ1JFQVRFX1NPQ0tFVFwwIgorICAgICJVTklOSVRJQUxJWkVEXDAiCisgICAgIlVOU1VQUE9SVEVEX01FVEhPRFwwIgorICAgICJXUklURV9UT19SRUFEX09OTFlfQklPXDAiCisgICAgIkFSRzJfTFRfQVJHM1wwIgorICAgICJCQURfRU5DT0RJTkdcMCIKKyAgICAiQkFEX1JFQ0lQUk9DQUxcMCIKKyAgICAiQklHTlVNX1RPT19MT05HXDAiCisgICAgIkJJVFNfVE9PX1NNQUxMXDAiCisgICAgIkNBTExFRF9XSVRIX0VWRU5fTU9EVUxVU1wwIgorICAgICJESVZfQllfWkVST1wwIgorICAgICJFWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBXDAiCisgICAgIklOUFVUX05PVF9SRURVQ0VEXDAiCisgICAgIklOVkFMSURfSU5QVVRcMCIKKyAgICAiSU5WQUxJRF9SQU5HRVwwIgorICAgICJORUdBVElWRV9OVU1CRVJcMCIKKyAgICAiTk9UX0FfU1FVQVJFXDAiCisgICAgIk5PVF9JTklUSUFMSVpFRFwwIgorICAgICJOT19JTlZFUlNFXDAiCisgICAgIlBSSVZBVEVfS0VZX1RPT19MQVJHRVwwIgorICAgICJQX0lTX05PVF9QUklNRVwwIgorICAgICJUT09fTUFOWV9JVEVSQVRJT05TXDAiCisgICAgIlRPT19NQU5ZX1RFTVBPUkFSWV9WQVJJQUJMRVNcMCIKKyAgICAiQUVTX0tFWV9TRVRVUF9GQUlMRURcMCIKKyAgICAiQkFEX0RFQ1JZUFRcMCIKKyAgICAiQkFEX0tFWV9MRU5HVEhcMCIKKyAgICAiQ1RSTF9OT1RfSU1QTEVNRU5URURcMCIKKyAgICAiQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVEXDAiCisgICAgIkRBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSFwwIgorICAgICJJTklUSUFMSVpBVElPTl9FUlJPUlwwIgorICAgICJJTlBVVF9OT1RfSU5JVElBTElaRURcMCIKKyAgICAiSU5WQUxJRF9BRF9TSVpFXDAiCisgICAgIklOVkFMSURfS0VZX0xFTkdUSFwwIgorICAgICJJTlZBTElEX05PTkNFXDAiCisgICAgIklOVkFMSURfTk9OQ0VfU0laRVwwIgorICAgICJJTlZBTElEX09QRVJBVElPTlwwIgorICAgICJJVl9UT09fTEFSR0VcMCIKKyAgICAiTk9fQ0lQSEVSX1NFVFwwIgorICAgICJOT19ESVJFQ1RJT05fU0VUXDAiCisgICAgIk9VVFBVVF9BTElBU0VTX0lOUFVUXDAiCisgICAgIlRBR19UT09fTEFSR0VcMCIKKyAgICAiVE9PX0xBUkdFXDAiCisgICAgIlVOU1VQUE9SVEVEX0FEX1NJWkVcMCIKKyAgICAiVU5TVVBQT1JURURfSU5QVVRfU0laRVwwIgorICAgICJVTlNVUFBPUlRFRF9LRVlfU0laRVwwIgorICAgICJVTlNVUFBPUlRFRF9OT05DRV9TSVpFXDAiCisgICAgIlVOU1VQUE9SVEVEX1RBR19TSVpFXDAiCisgICAgIldST05HX0ZJTkFMX0JMT0NLX0xFTkdUSFwwIgorICAgICJMSVNUX0NBTk5PVF9CRV9OVUxMXDAiCisgICAgIk1JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVRcMCIKKyAgICAiTUlTU0lOR19FUVVBTF9TSUdOXDAiCisgICAgIk5PX0NMT1NFX0JSQUNFXDAiCisgICAgIlVOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT05cMCIKKyAgICAiVkFSSUFCTEVfRVhQQU5TSU9OX1RPT19MT05HXDAiCisgICAgIlZBUklBQkxFX0hBU19OT19WQUxVRVwwIgorICAgICJCQURfR0VORVJBVE9SXDAiCisgICAgIklOVkFMSURfUFVCS0VZXDAiCisgICAgIk1PRFVMVVNfVE9PX0xBUkdFXDAiCisgICAgIk5PX1BSSVZBVEVfVkFMVUVcMCIKKyAgICAiVU5LTk9XTl9IQVNIXDAiCisgICAgIkJBRF9RX1ZBTFVFXDAiCisgICAgIkJBRF9WRVJTSU9OXDAiCisgICAgIk1JU1NJTkdfUEFSQU1FVEVSU1wwIgorICAgICJORUVEX05FV19TRVRVUF9WQUxVRVNcMCIKKyAgICAiQklHTlVNX09VVF9PRl9SQU5HRVwwIgorICAgICJDT09SRElOQVRFU19PVVRfT0ZfUkFOR0VcMCIKKyAgICAiRDJJX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkVcMCIKKyAgICAiRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRVwwIgorICAgICJHUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRVwwIgorICAgICJHUk9VUF9NSVNNQVRDSFwwIgorICAgICJJMkRfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRVwwIgorICAgICJJTkNPTVBBVElCTEVfT0JKRUNUU1wwIgorICAgICJJTlZBTElEX0NPRkFDVE9SXDAiCisgICAgIklOVkFMSURfQ09NUFJFU1NFRF9QT0lOVFwwIgorICAgICJJTlZBTElEX0NPTVBSRVNTSU9OX0JJVFwwIgorICAgICJJTlZBTElEX0VOQ09ESU5HXDAiCisgICAgIklOVkFMSURfRklFTERcMCIKKyAgICAiSU5WQUxJRF9GT1JNXDAiCisgICAgIklOVkFMSURfR1JPVVBfT1JERVJcMCIKKyAgICAiSU5WQUxJRF9QUklWQVRFX0tFWVwwIgorICAgICJJTlZBTElEX1NDQUxBUlwwIgorICAgICJNSVNTSU5HX1BSSVZBVEVfS0VZXDAiCisgICAgIk5PTl9OQU1FRF9DVVJWRVwwIgorICAgICJQS1BBUkFNRVRFUlMyR1JPVVBfRkFJTFVSRVwwIgorICAgICJQT0lOVF9BVF9JTkZJTklUWVwwIgorICAgICJQT0lOVF9JU19OT1RfT05fQ1VSVkVcMCIKKyAgICAiUFVCTElDX0tFWV9WQUxJREFUSU9OX0ZBSUxFRFwwIgorICAgICJTTE9UX0ZVTExcMCIKKyAgICAiVU5ERUZJTkVEX0dFTkVSQVRPUlwwIgorICAgICJVTktOT1dOX0dST1VQXDAiCisgICAgIlVOS05PV05fT1JERVJcMCIKKyAgICAiV1JPTkdfQ1VSVkVfUEFSQU1FVEVSU1wwIgorICAgICJXUk9OR19PUkRFUlwwIgorICAgICJLREZfRkFJTEVEXDAiCisgICAgIlBPSU5UX0FSSVRITUVUSUNfRkFJTFVSRVwwIgorICAgICJVTktOT1dOX0RJR0VTVF9MRU5HVEhcMCIKKyAgICAiQkFEX1NJR05BVFVSRVwwIgorICAgICJOT1RfSU1QTEVNRU5URURcMCIKKyAgICAiUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRFwwIgorICAgICJPUEVSQVRJT05fTk9UX1NVUFBPUlRFRFwwIgorICAgICJDT01NQU5EX05PVF9TVVBQT1JURURcMCIKKyAgICAiRElGRkVSRU5UX0tFWV9UWVBFU1wwIgorICAgICJESUZGRVJFTlRfUEFSQU1FVEVSU1wwIgorICAgICJFWFBFQ1RJTkdfQU5fRUNfS0VZX0tFWVwwIgorICAgICJFWFBFQ1RJTkdfQU5fUlNBX0tFWVwwIgorICAgICJFWFBFQ1RJTkdfQV9EU0FfS0VZXDAiCisgICAgIklMTEVHQUxfT1JfVU5TVVBQT1JURURfUEFERElOR19NT0RFXDAiCisgICAgIklOVkFMSURfRElHRVNUX0xFTkdUSFwwIgorICAgICJJTlZBTElEX0RJR0VTVF9UWVBFXDAiCisgICAgIklOVkFMSURfS0VZQklUU1wwIgorICAgICJJTlZBTElEX01HRjFfTURcMCIKKyAgICAiSU5WQUxJRF9QQURESU5HX01PREVcMCIKKyAgICAiSU5WQUxJRF9QQVJBTUVURVJTXDAiCisgICAgIklOVkFMSURfUFNTX1NBTFRMRU5cMCIKKyAgICAiSU5WQUxJRF9TSUdOQVRVUkVcMCIKKyAgICAiS0VZU19OT1RfU0VUXDAiCisgICAgIk1FTU9SWV9MSU1JVF9FWENFRURFRFwwIgorICAgICJOT1RfQV9QUklWQVRFX0tFWVwwIgorICAgICJOT19ERUZBVUxUX0RJR0VTVFwwIgorICAgICJOT19LRVlfU0VUXDAiCisgICAgIk5PX01EQzJfU1VQUE9SVFwwIgorICAgICJOT19OSURfRk9SX0NVUlZFXDAiCisgICAgIk5PX09QRVJBVElPTl9TRVRcMCIKKyAgICAiTk9fUEFSQU1FVEVSU19TRVRcMCIKKyAgICAiT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRVwwIgorICAgICJPUEVSQVRPTl9OT1RfSU5JVElBTElaRURcMCIKKyAgICAiVU5LTk9XTl9QVUJMSUNfS0VZX1RZUEVcMCIKKyAgICAiVU5TVVBQT1JURURfQUxHT1JJVEhNXDAiCisgICAgIk9VVFBVVF9UT09fTEFSR0VcMCIKKyAgICAiSU5WQUxJRF9PSURfU1RSSU5HXDAiCisgICAgIlVOS05PV05fTklEXDAiCisgICAgIkJBRF9CQVNFNjRfREVDT0RFXDAiCisgICAgIkJBRF9FTkRfTElORVwwIgorICAgICJCQURfSVZfQ0hBUlNcMCIKKyAgICAiQkFEX1BBU1NXT1JEX1JFQURcMCIKKyAgICAiQ0lQSEVSX0lTX05VTExcMCIKKyAgICAiRVJST1JfQ09OVkVSVElOR19QUklWQVRFX0tFWVwwIgorICAgICJOT1RfREVLX0lORk9cMCIKKyAgICAiTk9UX0VOQ1JZUFRFRFwwIgorICAgICJOT1RfUFJPQ19UWVBFXDAiCisgICAgIk5PX1NUQVJUX0xJTkVcMCIKKyAgICAiUkVBRF9LRVlcMCIKKyAgICAiU0hPUlRfSEVBREVSXDAiCisgICAgIlVOU1VQUE9SVEVEX0NJUEhFUlwwIgorICAgICJVTlNVUFBPUlRFRF9FTkNSWVBUSU9OXDAiCisgICAgIkJBRF9QS0NTN19WRVJTSU9OXDAiCisgICAgIk5PVF9QS0NTN19TSUdORURfREFUQVwwIgorICAgICJOT19DRVJUSUZJQ0FURVNfSU5DTFVERURcMCIKKyAgICAiTk9fQ1JMU19JTkNMVURFRFwwIgorICAgICJCQURfSVRFUkFUSU9OX0NPVU5UXDAiCisgICAgIkJBRF9QS0NTMTJfREFUQVwwIgorICAgICJCQURfUEtDUzEyX1ZFUlNJT05cMCIKKyAgICAiQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUlwwIgorICAgICJDUllQVF9FUlJPUlwwIgorICAgICJFTkNSWVBUX0VSUk9SXDAiCisgICAgIkVSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNU1wwIgorICAgICJJTkNPUlJFQ1RfUEFTU1dPUkRcMCIKKyAgICAiSU5WQUxJRF9DSEFSQUNURVJTXDAiCisgICAgIktFWUdFTl9GQUlMVVJFXDAiCisgICAgIktFWV9HRU5fRVJST1JcMCIKKyAgICAiTUVUSE9EX05PVF9TVVBQT1JURURcMCIKKyAgICAiTUlTU0lOR19NQUNcMCIKKyAgICAiTVVMVElQTEVfUFJJVkFURV9LRVlTX0lOX1BLQ1MxMlwwIgorICAgICJQS0NTMTJfUFVCTElDX0tFWV9JTlRFR1JJVFlfTk9UX1NVUFBPUlRFRFwwIgorICAgICJQS0NTMTJfVE9PX0RFRVBMWV9ORVNURURcMCIKKyAgICAiUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SXDAiCisgICAgIlBSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUlwwIgorICAgICJVTktOT1dOX0FMR09SSVRITVwwIgorICAgICJVTktOT1dOX0NJUEhFUlwwIgorICAgICJVTktOT1dOX0NJUEhFUl9BTEdPUklUSE1cMCIKKyAgICAiVU5LTk9XTl9ESUdFU1RcMCIKKyAgICAiVU5TVVBQT1JURURfS0VZTEVOR1RIXDAiCisgICAgIlVOU1VQUE9SVEVEX0tFWV9ERVJJVkFUSU9OX0ZVTkNUSU9OXDAiCisgICAgIlVOU1VQUE9SVEVEX09QVElPTlNcMCIKKyAgICAiVU5TVVBQT1JURURfUFJGXDAiCisgICAgIlVOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITVwwIgorICAgICJVTlNVUFBPUlRFRF9TQUxUX1RZUEVcMCIKKyAgICAiQkFEX0VfVkFMVUVcMCIKKyAgICAiQkFEX0ZJWEVEX0hFQURFUl9ERUNSWVBUXDAiCisgICAgIkJBRF9QQURfQllURV9DT1VOVFwwIgorICAgICJCQURfUlNBX1BBUkFNRVRFUlNcMCIKKyAgICAiQkxPQ0tfVFlQRV9JU19OT1RfMDFcMCIKKyAgICAiQkxPQ0tfVFlQRV9JU19OT1RfMDJcMCIKKyAgICAiQk5fTk9UX0lOSVRJQUxJWkVEXDAiCisgICAgIkNBTk5PVF9SRUNPVkVSX01VTFRJX1BSSU1FX0tFWVwwIgorICAgICJDUlRfUEFSQU1TX0FMUkVBRFlfR0lWRU5cMCIKKyAgICAiQ1JUX1ZBTFVFU19JTkNPUlJFQ1RcMCIKKyAgICAiREFUQV9MRU5fTk9UX0VRVUFMX1RPX01PRF9MRU5cMCIKKyAgICAiREFUQV9UT09fTEFSR0VcMCIKKyAgICAiREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFXDAiCisgICAgIkRBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTXDAiCisgICAgIkRBVEFfVE9PX1NNQUxMXDAiCisgICAgIkRBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRVwwIgorICAgICJESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWVwwIgorICAgICJEX0VfTk9UX0NPTkdSVUVOVF9UT18xXDAiCisgICAgIkRfT1VUX09GX1JBTkdFXDAiCisgICAgIkVNUFRZX1BVQkxJQ19LRVlcMCIKKyAgICAiRklSU1RfT0NURVRfSU5WQUxJRFwwIgorICAgICJJTkNPTlNJU1RFTlRfU0VUX09GX0NSVF9WQUxVRVNcMCIKKyAgICAiSU5URVJOQUxfRVJST1JcMCIKKyAgICAiSU5WQUxJRF9NRVNTQUdFX0xFTkdUSFwwIgorICAgICJLRVlfU0laRV9UT09fU01BTExcMCIKKyAgICAiTEFTVF9PQ1RFVF9JTlZBTElEXDAiCisgICAgIk1VU1RfSEFWRV9BVF9MRUFTVF9UV09fUFJJTUVTXDAiCisgICAgIk5PX1BVQkxJQ19FWFBPTkVOVFwwIgorICAgICJOVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HXDAiCisgICAgIk5fTk9UX0VRVUFMX1BfUVwwIgorICAgICJPQUVQX0RFQ09ESU5HX0VSUk9SXDAiCisgICAgIk9OTFlfT05FX09GX1BfUV9HSVZFTlwwIgorICAgICJPVVRQVVRfQlVGRkVSX1RPT19TTUFMTFwwIgorICAgICJQQURESU5HX0NIRUNLX0ZBSUxFRFwwIgorICAgICJQS0NTX0RFQ09ESU5HX0VSUk9SXDAiCisgICAgIlNMRU5fQ0hFQ0tfRkFJTEVEXDAiCisgICAgIlNMRU5fUkVDT1ZFUllfRkFJTEVEXDAiCisgICAgIlVOS05PV05fQUxHT1JJVEhNX1RZUEVcMCIKKyAgICAiVU5LTk9XTl9QQURESU5HX1RZUEVcMCIKKyAgICAiVkFMVUVfTUlTU0lOR1wwIgorICAgICJXUk9OR19TSUdOQVRVUkVfTEVOR1RIXDAiCisgICAgIkFMUE5fTUlTTUFUQ0hfT05fRUFSTFlfREFUQVwwIgorICAgICJBUFBMSUNBVElPTl9EQVRBX0lOU1RFQURfT0ZfSEFORFNIQUtFXDAiCisgICAgIkFQUExJQ0FUSU9OX0RBVEFfT05fU0hVVERPV05cMCIKKyAgICAiQVBQX0RBVEFfSU5fSEFORFNIQUtFXDAiCisgICAgIkFUVEVNUFRfVE9fUkVVU0VfU0VTU0lPTl9JTl9ESUZGRVJFTlRfQ09OVEVYVFwwIgorICAgICJCQURfQUxFUlRcMCIKKyAgICAiQkFEX0NIQU5HRV9DSVBIRVJfU1BFQ1wwIgorICAgICJCQURfREFUQV9SRVRVUk5FRF9CWV9DQUxMQkFDS1wwIgorICAgICJCQURfREhfUF9MRU5HVEhcMCIKKyAgICAiQkFEX0RJR0VTVF9MRU5HVEhcMCIKKyAgICAiQkFEX0VDQ19DRVJUXDAiCisgICAgIkJBRF9FQ1BPSU5UXDAiCisgICAgIkJBRF9IQU5EU0hBS0VfUkVDT1JEXDAiCisgICAgIkJBRF9IRUxMT19SRVFVRVNUXDAiCisgICAgIkJBRF9MRU5HVEhcMCIKKyAgICAiQkFEX1BBQ0tFVF9MRU5HVEhcMCIKKyAgICAiQkFEX1JTQV9FTkNSWVBUXDAiCisgICAgIkJBRF9TUlRQX01LSV9WQUxVRVwwIgorICAgICJCQURfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVFwwIgorICAgICJCQURfU1NMX0ZJTEVUWVBFXDAiCisgICAgIkJBRF9XUklURV9SRVRSWVwwIgorICAgICJCSU9fTk9UX1NFVFwwIgorICAgICJCTE9DS19DSVBIRVJfUEFEX0lTX1dST05HXDAiCisgICAgIkJVRkZFUkVEX01FU1NBR0VTX09OX0NJUEhFUl9DSEFOR0VcMCIKKyAgICAiQ0FOTk9UX0hBVkVfQk9USF9QUklWS0VZX0FORF9NRVRIT0RcMCIKKyAgICAiQ0FOTk9UX1BBUlNFX0xFQUZfQ0VSVFwwIgorICAgICJDQV9ETl9MRU5HVEhfTUlTTUFUQ0hcMCIKKyAgICAiQ0FfRE5fVE9PX0xPTkdcMCIKKyAgICAiQ0NTX1JFQ0VJVkVEX0VBUkxZXDAiCisgICAgIkNFUlRJRklDQVRFX0FORF9QUklWQVRFX0tFWV9NSVNNQVRDSFwwIgorICAgICJDRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVEXDAiCisgICAgIkNFUlRfQ0JfRVJST1JcMCIKKyAgICAiQ0VSVF9ERUNPTVBSRVNTSU9OX0ZBSUxFRFwwIgorICAgICJDRVJUX0xFTkdUSF9NSVNNQVRDSFwwIgorICAgICJDSEFOTkVMX0lEX05PVF9QMjU2XDAiCisgICAgIkNIQU5ORUxfSURfU0lHTkFUVVJFX0lOVkFMSURcMCIKKyAgICAiQ0lQSEVSX09SX0hBU0hfVU5BVkFJTEFCTEVcMCIKKyAgICAiQ0xJRU5USEVMTE9fUEFSU0VfRkFJTEVEXDAiCisgICAgIkNMSUVOVEhFTExPX1RMU0VYVFwwIgorICAgICJDT05ORUNUSU9OX1JFSkVDVEVEXDAiCisgICAgIkNPTk5FQ1RJT05fVFlQRV9OT1RfU0VUXDAiCisgICAgIkNVU1RPTV9FWFRFTlNJT05fRVJST1JcMCIKKyAgICAiREFUQV9MRU5HVEhfVE9PX0xPTkdcMCIKKyAgICAiREVDUllQVElPTl9GQUlMRURcMCIKKyAgICAiREVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUNcMCIKKyAgICAiREhfUFVCTElDX1ZBTFVFX0xFTkdUSF9JU19XUk9OR1wwIgorICAgICJESF9QX1RPT19MT05HXDAiCisgICAgIkRJR0VTVF9DSEVDS19GQUlMRURcMCIKKyAgICAiRE9XTkdSQURFX0RFVEVDVEVEXDAiCisgICAgIkRUTFNfTUVTU0FHRV9UT09fQklHXDAiCisgICAgIkRVUExJQ0FURV9FWFRFTlNJT05cMCIKKyAgICAiRFVQTElDQVRFX0tFWV9TSEFSRVwwIgorICAgICJEVVBMSUNBVEVfU0lHTkFUVVJFX0FMR09SSVRITVwwIgorICAgICJFQVJMWV9EQVRBX05PVF9JTl9VU0VcMCIKKyAgICAiRUNDX0NFUlRfTk9UX0ZPUl9TSUdOSU5HXDAiCisgICAgIkVNUFRZX0hFTExPX1JFVFJZX1JFUVVFU1RcMCIKKyAgICAiRU1TX1NUQVRFX0lOQ09OU0lTVEVOVFwwIgorICAgICJFTkNSWVBURURfTEVOR1RIX1RPT19MT05HXDAiCisgICAgIkVSUk9SX0FERElOR19FWFRFTlNJT05cMCIKKyAgICAiRVJST1JfSU5fUkVDRUlWRURfQ0lQSEVSX0xJU1RcMCIKKyAgICAiRVJST1JfUEFSU0lOR19FWFRFTlNJT05cMCIKKyAgICAiRVhDRVNTSVZFX01FU1NBR0VfU0laRVwwIgorICAgICJFWFRSQV9EQVRBX0lOX01FU1NBR0VcMCIKKyAgICAiRlJBR01FTlRfTUlTTUFUQ0hcMCIKKyAgICAiR09UX05FWFRfUFJPVE9fV0lUSE9VVF9FWFRFTlNJT05cMCIKKyAgICAiSEFORFNIQUtFX0ZBSUxVUkVfT05fQ0xJRU5UX0hFTExPXDAiCisgICAgIkhBTkRTSEFLRV9OT1RfQ09NUExFVEVcMCIKKyAgICAiSFRUUFNfUFJPWFlfUkVRVUVTVFwwIgorICAgICJIVFRQX1JFUVVFU1RcMCIKKyAgICAiSU5BUFBST1BSSUFURV9GQUxMQkFDS1wwIgorICAgICJJTlZBTElEX0FMUE5fUFJPVE9DT0xcMCIKKyAgICAiSU5WQUxJRF9DT01NQU5EXDAiCisgICAgIklOVkFMSURfQ09NUFJFU1NJT05fTElTVFwwIgorICAgICJJTlZBTElEX01FU1NBR0VcMCIKKyAgICAiSU5WQUxJRF9PVVRFUl9SRUNPUkRfVFlQRVwwIgorICAgICJJTlZBTElEX1NDVF9MSVNUXDAiCisgICAgIklOVkFMSURfU0lHTkFUVVJFX0FMR09SSVRITVwwIgorICAgICJJTlZBTElEX1NTTF9TRVNTSU9OXDAiCisgICAgIklOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RIXDAiCisgICAgIkxFTkdUSF9NSVNNQVRDSFwwIgorICAgICJNSVNTSU5HX0VYVEVOU0lPTlwwIgorICAgICJNSVNTSU5HX0tFWV9TSEFSRVwwIgorICAgICJNSVNTSU5HX1JTQV9DRVJUSUZJQ0FURVwwIgorICAgICJNSVNTSU5HX1RNUF9ESF9LRVlcMCIKKyAgICAiTUlTU0lOR19UTVBfRUNESF9LRVlcMCIKKyAgICAiTUlYRURfU1BFQ0lBTF9PUEVSQVRPUl9XSVRIX0dST1VQU1wwIgorICAgICJNVFVfVE9PX1NNQUxMXDAiCisgICAgIk5FR09USUFURURfQk9USF9OUE5fQU5EX0FMUE5cMCIKKyAgICAiTkVHT1RJQVRFRF9UQl9XSVRIT1VUX0VNU19PUl9SSVwwIgorICAgICJORVNURURfR1JPVVBcMCIKKyAgICAiTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVEXDAiCisgICAgIk5PX0NFUlRJRklDQVRFX0FTU0lHTkVEXDAiCisgICAgIk5PX0NFUlRJRklDQVRFX1NFVFwwIgorICAgICJOT19DSVBIRVJTX0FWQUlMQUJMRVwwIgorICAgICJOT19DSVBIRVJTX1BBU1NFRFwwIgorICAgICJOT19DSVBIRVJTX1NQRUNJRklFRFwwIgorICAgICJOT19DSVBIRVJfTUFUQ0hcMCIKKyAgICAiTk9fQ09NTU9OX1NJR05BVFVSRV9BTEdPUklUSE1TXDAiCisgICAgIk5PX0NPTVBSRVNTSU9OX1NQRUNJRklFRFwwIgorICAgICJOT19HUk9VUFNfU1BFQ0lGSUVEXDAiCisgICAgIk5PX01FVEhPRF9TUEVDSUZJRURcMCIKKyAgICAiTk9fUDI1Nl9TVVBQT1JUXDAiCisgICAgIk5PX1BSSVZBVEVfS0VZX0FTU0lHTkVEXDAiCisgICAgIk5PX1JFTkVHT1RJQVRJT05cMCIKKyAgICAiTk9fUkVRVUlSRURfRElHRVNUXDAiCisgICAgIk5PX1NIQVJFRF9DSVBIRVJcMCIKKyAgICAiTk9fU0hBUkVEX0dST1VQXDAiCisgICAgIk5PX1NVUFBPUlRFRF9WRVJTSU9OU19FTkFCTEVEXDAiCisgICAgIk5VTExfU1NMX0NUWFwwIgorICAgICJOVUxMX1NTTF9NRVRIT0RfUEFTU0VEXDAiCisgICAgIk9DU1BfQ0JfRVJST1JcMCIKKyAgICAiT0xEX1NFU1NJT05fQ0lQSEVSX05PVF9SRVRVUk5FRFwwIgorICAgICJPTERfU0VTU0lPTl9QUkZfSEFTSF9NSVNNQVRDSFwwIgorICAgICJPTERfU0VTU0lPTl9WRVJTSU9OX05PVF9SRVRVUk5FRFwwIgorICAgICJQQVJTRV9UTFNFWFRcMCIKKyAgICAiUEFUSF9UT09fTE9OR1wwIgorICAgICJQRUVSX0RJRF9OT1RfUkVUVVJOX0FfQ0VSVElGSUNBVEVcMCIKKyAgICAiUEVFUl9FUlJPUl9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFXDAiCisgICAgIlBSRV9TSEFSRURfS0VZX01VU1RfQkVfTEFTVFwwIgorICAgICJQUklWQVRFX0tFWV9PUEVSQVRJT05fRkFJTEVEXDAiCisgICAgIlBST1RPQ09MX0lTX1NIVVRET1dOXDAiCisgICAgIlBTS19JREVOVElUWV9CSU5ERVJfQ09VTlRfTUlTTUFUQ0hcMCIKKyAgICAiUFNLX0lERU5USVRZX05PVF9GT1VORFwwIgorICAgICJQU0tfTk9fQ0xJRU5UX0NCXDAiCisgICAgIlBTS19OT19TRVJWRVJfQ0JcMCIKKyAgICAiUkVBRF9USU1FT1VUX0VYUElSRURcMCIKKyAgICAiUkVDT1JEX0xFTkdUSF9NSVNNQVRDSFwwIgorICAgICJSRUNPUkRfVE9PX0xBUkdFXDAiCisgICAgIlJFTkVHT1RJQVRJT05fRU1TX01JU01BVENIXDAiCisgICAgIlJFTkVHT1RJQVRJT05fRU5DT0RJTkdfRVJSXDAiCisgICAgIlJFTkVHT1RJQVRJT05fTUlTTUFUQ0hcMCIKKyAgICAiUkVRVUlSRURfQ0lQSEVSX01JU1NJTkdcMCIKKyAgICAiUkVTVU1FRF9FTVNfU0VTU0lPTl9XSVRIT1VUX0VNU19FWFRFTlNJT05cMCIKKyAgICAiUkVTVU1FRF9OT05fRU1TX1NFU1NJT05fV0lUSF9FTVNfRVhURU5TSU9OXDAiCisgICAgIlNDU1ZfUkVDRUlWRURfV0hFTl9SRU5FR09USUFUSU5HXDAiCisgICAgIlNFQ09ORF9TRVJWRVJIRUxMT19WRVJTSU9OX01JU01BVENIXDAiCisgICAgIlNFUlZFUkhFTExPX1RMU0VYVFwwIgorICAgICJTRVJWRVJfQ0VSVF9DSEFOR0VEXDAiCisgICAgIlNFUlZFUl9FQ0hPRURfSU5WQUxJRF9TRVNTSU9OX0lEXDAiCisgICAgIlNFU1NJT05fSURfQ09OVEVYVF9VTklOSVRJQUxJWkVEXDAiCisgICAgIlNFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEXDAiCisgICAgIlNIVVRET1dOX1dISUxFX0lOX0lOSVRcMCIKKyAgICAiU0lHTkFUVVJFX0FMR09SSVRITVNfRVhURU5TSU9OX1NFTlRfQllfU0VSVkVSXDAiCisgICAgIlNSVFBfQ09VTERfTk9UX0FMTE9DQVRFX1BST0ZJTEVTXDAiCisgICAgIlNSVFBfVU5LTk9XTl9QUk9URUNUSU9OX1BST0ZJTEVcMCIKKyAgICAiU1NMM19FWFRfSU5WQUxJRF9TRVJWRVJOQU1FXDAiCisgICAgIlNTTFYzX0FMRVJUX0JBRF9DRVJUSUZJQ0FURVwwIgorICAgICJTU0xWM19BTEVSVF9CQURfUkVDT1JEX01BQ1wwIgorICAgICJTU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9FWFBJUkVEXDAiCisgICAgIlNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1JFVk9LRURcMCIKKyAgICAiU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfVU5LTk9XTlwwIgorICAgICJTU0xWM19BTEVSVF9DTE9TRV9OT1RJRllcMCIKKyAgICAiU1NMVjNfQUxFUlRfREVDT01QUkVTU0lPTl9GQUlMVVJFXDAiCisgICAgIlNTTFYzX0FMRVJUX0hBTkRTSEFLRV9GQUlMVVJFXDAiCisgICAgIlNTTFYzX0FMRVJUX0lMTEVHQUxfUEFSQU1FVEVSXDAiCisgICAgIlNTTFYzX0FMRVJUX05PX0NFUlRJRklDQVRFXDAiCisgICAgIlNTTFYzX0FMRVJUX1VORVhQRUNURURfTUVTU0FHRVwwIgorICAgICJTU0xWM19BTEVSVF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURVwwIgorICAgICJTU0xfQ1RYX0hBU19OT19ERUZBVUxUX1NTTF9WRVJTSU9OXDAiCisgICAgIlNTTF9IQU5EU0hBS0VfRkFJTFVSRVwwIgorICAgICJTU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HXDAiCisgICAgIlNTTF9TRVNTSU9OX0lEX1RPT19MT05HXDAiCisgICAgIlRJQ0tFVF9FTkNSWVBUSU9OX0ZBSUxFRFwwIgorICAgICJUTFMxM19ET1dOR1JBREVcMCIKKyAgICAiVExTVjFfQUxFUlRfQUNDRVNTX0RFTklFRFwwIgorICAgICJUTFNWMV9BTEVSVF9ERUNPREVfRVJST1JcMCIKKyAgICAiVExTVjFfQUxFUlRfREVDUllQVElPTl9GQUlMRURcMCIKKyAgICAiVExTVjFfQUxFUlRfREVDUllQVF9FUlJPUlwwIgorICAgICJUTFNWMV9BTEVSVF9FWFBPUlRfUkVTVFJJQ1RJT05cMCIKKyAgICAiVExTVjFfQUxFUlRfSU5BUFBST1BSSUFURV9GQUxMQkFDS1wwIgorICAgICJUTFNWMV9BTEVSVF9JTlNVRkZJQ0lFTlRfU0VDVVJJVFlcMCIKKyAgICAiVExTVjFfQUxFUlRfSU5URVJOQUxfRVJST1JcMCIKKyAgICAiVExTVjFfQUxFUlRfTk9fUkVORUdPVElBVElPTlwwIgorICAgICJUTFNWMV9BTEVSVF9QUk9UT0NPTF9WRVJTSU9OXDAiCisgICAgIlRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPV1wwIgorICAgICJUTFNWMV9BTEVSVF9VTktOT1dOX0NBXDAiCisgICAgIlRMU1YxX0FMRVJUX1VTRVJfQ0FOQ0VMTEVEXDAiCisgICAgIlRMU1YxX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFXDAiCisgICAgIlRMU1YxX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0VcMCIKKyAgICAiVExTVjFfQ0VSVElGSUNBVEVfUkVRVUlSRURcMCIKKyAgICAiVExTVjFfQ0VSVElGSUNBVEVfVU5PQlRBSU5BQkxFXDAiCisgICAgIlRMU1YxX1VOS05PV05fUFNLX0lERU5USVRZXDAiCisgICAgIlRMU1YxX1VOUkVDT0dOSVpFRF9OQU1FXDAiCisgICAgIlRMU1YxX1VOU1VQUE9SVEVEX0VYVEVOU0lPTlwwIgorICAgICJUTFNfUEVFUl9ESURfTk9UX1JFU1BPTkRfV0lUSF9DRVJUSUZJQ0FURV9MSVNUXDAiCisgICAgIlRMU19SU0FfRU5DUllQVEVEX1ZBTFVFX0xFTkdUSF9JU19XUk9OR1wwIgorICAgICJUT09fTUFOWV9FTVBUWV9GUkFHTUVOVFNcMCIKKyAgICAiVE9PX01BTllfS0VZX1VQREFURVNcMCIKKyAgICAiVE9PX01BTllfV0FSTklOR19BTEVSVFNcMCIKKyAgICAiVE9PX01VQ0hfUkVBRF9FQVJMWV9EQVRBXDAiCisgICAgIlRPT19NVUNIX1NLSVBQRURfRUFSTFlfREFUQVwwIgorICAgICJVTkFCTEVfVE9fRklORF9FQ0RIX1BBUkFNRVRFUlNcMCIKKyAgICAiVU5DT01QUkVTU0VEX0NFUlRfVE9PX0xBUkdFXDAiCisgICAgIlVORVhQRUNURURfRVhURU5TSU9OXDAiCisgICAgIlVORVhQRUNURURfRVhURU5TSU9OX09OX0VBUkxZX0RBVEFcMCIKKyAgICAiVU5FWFBFQ1RFRF9NRVNTQUdFXDAiCisgICAgIlVORVhQRUNURURfT1BFUkFUT1JfSU5fR1JPVVBcMCIKKyAgICAiVU5FWFBFQ1RFRF9SRUNPUkRcMCIKKyAgICAiVU5LTk9XTl9BTEVSVF9UWVBFXDAiCisgICAgIlVOS05PV05fQ0VSVElGSUNBVEVfVFlQRVwwIgorICAgICJVTktOT1dOX0NFUlRfQ09NUFJFU1NJT05fQUxHXDAiCisgICAgIlVOS05PV05fQ0lQSEVSX1JFVFVSTkVEXDAiCisgICAgIlVOS05PV05fQ0lQSEVSX1RZUEVcMCIKKyAgICAiVU5LTk9XTl9LRVlfRVhDSEFOR0VfVFlQRVwwIgorICAgICJVTktOT1dOX1BST1RPQ09MXDAiCisgICAgIlVOS05PV05fU1NMX1ZFUlNJT05cMCIKKyAgICAiVU5LTk9XTl9TVEFURVwwIgorICAgICJVTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT05fRElTQUJMRURcMCIKKyAgICAiVU5TVVBQT1JURURfQ09NUFJFU1NJT05fQUxHT1JJVEhNXDAiCisgICAgIlVOU1VQUE9SVEVEX0VMTElQVElDX0NVUlZFXDAiCisgICAgIlVOU1VQUE9SVEVEX1BST1RPQ09MXDAiCisgICAgIlVOU1VQUE9SVEVEX1BST1RPQ09MX0ZPUl9DVVNUT01fS0VZXDAiCisgICAgIldST05HX0NFUlRJRklDQVRFX1RZUEVcMCIKKyAgICAiV1JPTkdfQ0lQSEVSX1JFVFVSTkVEXDAiCisgICAgIldST05HX0NVUlZFXDAiCisgICAgIldST05HX01FU1NBR0VfVFlQRVwwIgorICAgICJXUk9OR19TSUdOQVRVUkVfVFlQRVwwIgorICAgICJXUk9OR19TU0xfVkVSU0lPTlwwIgorICAgICJXUk9OR19WRVJTSU9OX05VTUJFUlwwIgorICAgICJXUk9OR19WRVJTSU9OX09OX0VBUkxZX0RBVEFcMCIKKyAgICAiWDUwOV9MSUJcMCIKKyAgICAiWDUwOV9WRVJJRklDQVRJT05fU0VUVVBfUFJPQkxFTVNcMCIKKyAgICAiQUtJRF9NSVNNQVRDSFwwIgorICAgICJCQURfWDUwOV9GSUxFVFlQRVwwIgorICAgICJCQVNFNjRfREVDT0RFX0VSUk9SXDAiCisgICAgIkNBTlRfQ0hFQ0tfREhfS0VZXDAiCisgICAgIkNFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFXDAiCisgICAgIkNSTF9BTFJFQURZX0RFTFRBXDAiCisgICAgIkNSTF9WRVJJRllfRkFJTFVSRVwwIgorICAgICJJRFBfTUlTTUFUQ0hcMCIKKyAgICAiSU5WQUxJRF9ESVJFQ1RPUllcMCIKKyAgICAiSU5WQUxJRF9GSUVMRF9OQU1FXDAiCisgICAgIklOVkFMSURfUEFSQU1FVEVSXDAiCisgICAgIklOVkFMSURfUFNTX1BBUkFNRVRFUlNcMCIKKyAgICAiSU5WQUxJRF9UUlVTVFwwIgorICAgICJJU1NVRVJfTUlTTUFUQ0hcMCIKKyAgICAiS0VZX1RZUEVfTUlTTUFUQ0hcMCIKKyAgICAiS0VZX1ZBTFVFU19NSVNNQVRDSFwwIgorICAgICJMT0FESU5HX0NFUlRfRElSXDAiCisgICAgIkxPQURJTkdfREVGQVVMVFNcMCIKKyAgICAiTkFNRV9UT09fTE9OR1wwIgorICAgICJORVdFUl9DUkxfTk9UX05FV0VSXDAiCisgICAgIk5PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRllcMCIKKyAgICAiTk9fQ1JMX05VTUJFUlwwIgorICAgICJQVUJMSUNfS0VZX0RFQ09ERV9FUlJPUlwwIgorICAgICJQVUJMSUNfS0VZX0VOQ09ERV9FUlJPUlwwIgorICAgICJTSE9VTERfUkVUUllcMCIKKyAgICAiVU5LTk9XTl9LRVlfVFlQRVwwIgorICAgICJVTktOT1dOX1BVUlBPU0VfSURcMCIKKyAgICAiVU5LTk9XTl9UUlVTVF9JRFwwIgorICAgICJXUk9OR19MT09LVVBfVFlQRVwwIgorICAgICJCQURfSVBfQUREUkVTU1wwIgorICAgICJCQURfT0JKRUNUXDAiCisgICAgIkJOX0RFQzJCTl9FUlJPUlwwIgorICAgICJCTl9UT19BU04xX0lOVEVHRVJfRVJST1JcMCIKKyAgICAiQ0FOTk9UX0ZJTkRfRlJFRV9GVU5DVElPTlwwIgorICAgICJESVJOQU1FX0VSUk9SXDAiCisgICAgIkRJU1RQT0lOVF9BTFJFQURZX1NFVFwwIgorICAgICJEVVBMSUNBVEVfWk9ORV9JRFwwIgorICAgICJFUlJPUl9DT05WRVJUSU5HX1pPTkVcMCIKKyAgICAiRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OXDAiCisgICAgIkVSUk9SX0lOX0VYVEVOU0lPTlwwIgorICAgICJFWFBFQ1RFRF9BX1NFQ1RJT05fTkFNRVwwIgorICAgICJFWFRFTlNJT05fRVhJU1RTXDAiCisgICAgIkVYVEVOU0lPTl9OQU1FX0VSUk9SXDAiCisgICAgIkVYVEVOU0lPTl9OT1RfRk9VTkRcMCIKKyAgICAiRVhURU5TSU9OX1NFVFRJTkdfTk9UX1NVUFBPUlRFRFwwIgorICAgICJFWFRFTlNJT05fVkFMVUVfRVJST1JcMCIKKyAgICAiSUxMRUdBTF9FTVBUWV9FWFRFTlNJT05cMCIKKyAgICAiSUxMRUdBTF9IRVhfRElHSVRcMCIKKyAgICAiSU5DT1JSRUNUX1BPTElDWV9TWU5UQVhfVEFHXDAiCisgICAgIklOVkFMSURfQk9PTEVBTl9TVFJJTkdcMCIKKyAgICAiSU5WQUxJRF9FWFRFTlNJT05fU1RSSU5HXDAiCisgICAgIklOVkFMSURfTVVMVElQTEVfUkROU1wwIgorICAgICJJTlZBTElEX05BTUVcMCIKKyAgICAiSU5WQUxJRF9OVUxMX0FSR1VNRU5UXDAiCisgICAgIklOVkFMSURfTlVMTF9OQU1FXDAiCisgICAgIklOVkFMSURfTlVMTF9WQUxVRVwwIgorICAgICJJTlZBTElEX05VTUJFUlNcMCIKKyAgICAiSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUlwwIgorICAgICJJTlZBTElEX09QVElPTlwwIgorICAgICJJTlZBTElEX1BPTElDWV9JREVOVElGSUVSXDAiCisgICAgIklOVkFMSURfUFJPWFlfUE9MSUNZX1NFVFRJTkdcMCIKKyAgICAiSU5WQUxJRF9QVVJQT1NFXDAiCisgICAgIklOVkFMSURfU0VDVElPTlwwIgorICAgICJJTlZBTElEX1NZTlRBWFwwIgorICAgICJJU1NVRVJfREVDT0RFX0VSUk9SXDAiCisgICAgIk5FRURfT1JHQU5JWkFUSU9OX0FORF9OVU1CRVJTXDAiCisgICAgIk5PX0NPTkZJR19EQVRBQkFTRVwwIgorICAgICJOT19JU1NVRVJfQ0VSVElGSUNBVEVcMCIKKyAgICAiTk9fSVNTVUVSX0RFVEFJTFNcMCIKKyAgICAiTk9fUE9MSUNZX0lERU5USUZJRVJcMCIKKyAgICAiTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRFwwIgorICAgICJOT19QVUJMSUNfS0VZXDAiCisgICAgIk5PX1NVQkpFQ1RfREVUQUlMU1wwIgorICAgICJPRERfTlVNQkVSX09GX0RJR0lUU1wwIgorICAgICJPUEVSQVRJT05fTk9UX0RFRklORURcMCIKKyAgICAiT1RIRVJOQU1FX0VSUk9SXDAiCisgICAgIlBPTElDWV9MQU5HVUFHRV9BTFJFQURZX0RFRklORURcMCIKKyAgICAiUE9MSUNZX1BBVEhfTEVOR1RIXDAiCisgICAgIlBPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORURcMCIKKyAgICAiUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZXDAiCisgICAgIlNFQ1RJT05fTk9UX0ZPVU5EXDAiCisgICAgIlVOQUJMRV9UT19HRVRfSVNTVUVSX0RFVEFJTFNcMCIKKyAgICAiVU5BQkxFX1RPX0dFVF9JU1NVRVJfS0VZSURcMCIKKyAgICAiVU5LTk9XTl9CSVRfU1RSSU5HX0FSR1VNRU5UXDAiCisgICAgIlVOS05PV05fRVhURU5TSU9OXDAiCisgICAgIlVOS05PV05fRVhURU5TSU9OX05BTUVcMCIKKyAgICAiVU5LTk9XTl9PUFRJT05cMCIKKyAgICAiVU5TVVBQT1JURURfT1BUSU9OXDAiCisgICAgIlVTRVJfVE9PX0xPTkdcMCIKKyAgICAiIjsKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS1hcm12OC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS1hcm12OC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWU4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hYXJjaDY0L2NyeXB0by9jaGFjaGEvY2hhY2hhLWFybXY4LlMKQEAgLTAsMCArMSwxOTY5IEBACisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisudGV4dAorCisKKworLmFsaWduCTUKK0xzaWdtYToKKy5xdWFkCTB4MzMyMDY0NmU2MTcwNzg2NSwweDZiMjA2NTc0Nzk2MjJkMzIJCS8vIGVuZGlhbi1uZXV0cmFsCitMb25lOgorLmxvbmcJMSwwLDAsMAorTE9QRU5TU0xfYXJtY2FwX1A6CisjaWZkZWYJX19JTFAzMl9fCisubG9uZwlfT1BFTlNTTF9hcm1jYXBfUC0uCisjZWxzZQorLnF1YWQJX09QRU5TU0xfYXJtY2FwX1AtLgorI2VuZGlmCisuYnl0ZQk2NywxMDQsOTcsNjcsMTA0LDk3LDUwLDQ4LDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Niw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorCisuZ2xvYmwJX0NoYUNoYTIwX2N0cjMyCisucHJpdmF0ZV9leHRlcm4JX0NoYUNoYTIwX2N0cjMyCisKKy5hbGlnbgk1CitfQ2hhQ2hhMjBfY3RyMzI6CisJY2J6CXgyLExhYm9ydAorCWFkcgl4NSxMT1BFTlNTTF9hcm1jYXBfUAorCWNtcAl4MiwjMTkyCisJYi5sbwlMc2hvcnQKKyNpZmRlZglfX0lMUDMyX18KKwlsZHJzdwl4NixbeDVdCisjZWxzZQorCWxkcgl4NixbeDVdCisjZW5kaWYKKwlsZHIJdzE3LFt4Nix4NV0KKwl0c3QJdzE3LCNBUk1WN19ORU9OCisJYi5uZQlDaGFDaGEyMF9uZW9uCisKK0xzaG9ydDoKKwlzdHAJeDI5LHgzMCxbc3AsIy05Nl0hCisJYWRkCXgyOSxzcCwjMAorCisJYWRyCXg1LExzaWdtYQorCXN0cAl4MTkseDIwLFtzcCwjMTZdCisJc3RwCXgyMSx4MjIsW3NwLCMzMl0KKwlzdHAJeDIzLHgyNCxbc3AsIzQ4XQorCXN0cAl4MjUseDI2LFtzcCwjNjRdCisJc3RwCXgyNyx4MjgsW3NwLCM4MF0KKwlzdWIJc3Asc3AsIzY0CisKKwlsZHAJeDIyLHgyMyxbeDVdCQkvLyBsb2FkIHNpZ21hCisJbGRwCXgyNCx4MjUsW3gzXQkJLy8gbG9hZCBrZXkKKwlsZHAJeDI2LHgyNyxbeDMsIzE2XQorCWxkcAl4MjgseDMwLFt4NF0JCS8vIGxvYWQgY291bnRlcgorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4MjQseDI0LCMzMgorCXJvcgl4MjUseDI1LCMzMgorCXJvcgl4MjYseDI2LCMzMgorCXJvcgl4MjcseDI3LCMzMgorCXJvcgl4MjgseDI4LCMzMgorCXJvcgl4MzAseDMwLCMzMgorI2VuZGlmCisKK0xvb3Bfb3V0ZXI6CisJbW92CXc1LHcyMgkJCS8vIHVucGFjayBrZXkgYmxvY2sKKwlsc3IJeDYseDIyLCMzMgorCW1vdgl3Nyx3MjMKKwlsc3IJeDgseDIzLCMzMgorCW1vdgl3OSx3MjQKKwlsc3IJeDEwLHgyNCwjMzIKKwltb3YJdzExLHcyNQorCWxzcgl4MTIseDI1LCMzMgorCW1vdgl3MTMsdzI2CisJbHNyCXgxNCx4MjYsIzMyCisJbW92CXcxNSx3MjcKKwlsc3IJeDE2LHgyNywjMzIKKwltb3YJdzE3LHcyOAorCWxzcgl4MTkseDI4LCMzMgorCW1vdgl3MjAsdzMwCisJbHNyCXgyMSx4MzAsIzMyCisKKwltb3YJeDQsIzEwCisJc3Vicwl4Mix4MiwjNjQKK0xvb3A6CisJc3ViCXg0LHg0LCMxCisJYWRkCXc1LHc1LHc5CisJYWRkCXc2LHc2LHcxMAorCWFkZAl3Nyx3Nyx3MTEKKwlhZGQJdzgsdzgsdzEyCisJZW9yCXcxNyx3MTcsdzUKKwllb3IJdzE5LHcxOSx3NgorCWVvcgl3MjAsdzIwLHc3CisJZW9yCXcyMSx3MjEsdzgKKwlyb3IJdzE3LHcxNywjMTYKKwlyb3IJdzE5LHcxOSwjMTYKKwlyb3IJdzIwLHcyMCwjMTYKKwlyb3IJdzIxLHcyMSwjMTYKKwlhZGQJdzEzLHcxMyx3MTcKKwlhZGQJdzE0LHcxNCx3MTkKKwlhZGQJdzE1LHcxNSx3MjAKKwlhZGQJdzE2LHcxNix3MjEKKwllb3IJdzksdzksdzEzCisJZW9yCXcxMCx3MTAsdzE0CisJZW9yCXcxMSx3MTEsdzE1CisJZW9yCXcxMix3MTIsdzE2CisJcm9yCXc5LHc5LCMyMAorCXJvcgl3MTAsdzEwLCMyMAorCXJvcgl3MTEsdzExLCMyMAorCXJvcgl3MTIsdzEyLCMyMAorCWFkZAl3NSx3NSx3OQorCWFkZAl3Nix3Nix3MTAKKwlhZGQJdzcsdzcsdzExCisJYWRkCXc4LHc4LHcxMgorCWVvcgl3MTcsdzE3LHc1CisJZW9yCXcxOSx3MTksdzYKKwllb3IJdzIwLHcyMCx3NworCWVvcgl3MjEsdzIxLHc4CisJcm9yCXcxNyx3MTcsIzI0CisJcm9yCXcxOSx3MTksIzI0CisJcm9yCXcyMCx3MjAsIzI0CisJcm9yCXcyMSx3MjEsIzI0CisJYWRkCXcxMyx3MTMsdzE3CisJYWRkCXcxNCx3MTQsdzE5CisJYWRkCXcxNSx3MTUsdzIwCisJYWRkCXcxNix3MTYsdzIxCisJZW9yCXc5LHc5LHcxMworCWVvcgl3MTAsdzEwLHcxNAorCWVvcgl3MTEsdzExLHcxNQorCWVvcgl3MTIsdzEyLHcxNgorCXJvcgl3OSx3OSwjMjUKKwlyb3IJdzEwLHcxMCwjMjUKKwlyb3IJdzExLHcxMSwjMjUKKwlyb3IJdzEyLHcxMiwjMjUKKwlhZGQJdzUsdzUsdzEwCisJYWRkCXc2LHc2LHcxMQorCWFkZAl3Nyx3Nyx3MTIKKwlhZGQJdzgsdzgsdzkKKwllb3IJdzIxLHcyMSx3NQorCWVvcgl3MTcsdzE3LHc2CisJZW9yCXcxOSx3MTksdzcKKwllb3IJdzIwLHcyMCx3OAorCXJvcgl3MjEsdzIxLCMxNgorCXJvcgl3MTcsdzE3LCMxNgorCXJvcgl3MTksdzE5LCMxNgorCXJvcgl3MjAsdzIwLCMxNgorCWFkZAl3MTUsdzE1LHcyMQorCWFkZAl3MTYsdzE2LHcxNworCWFkZAl3MTMsdzEzLHcxOQorCWFkZAl3MTQsdzE0LHcyMAorCWVvcgl3MTAsdzEwLHcxNQorCWVvcgl3MTEsdzExLHcxNgorCWVvcgl3MTIsdzEyLHcxMworCWVvcgl3OSx3OSx3MTQKKwlyb3IJdzEwLHcxMCwjMjAKKwlyb3IJdzExLHcxMSwjMjAKKwlyb3IJdzEyLHcxMiwjMjAKKwlyb3IJdzksdzksIzIwCisJYWRkCXc1LHc1LHcxMAorCWFkZAl3Nix3Nix3MTEKKwlhZGQJdzcsdzcsdzEyCisJYWRkCXc4LHc4LHc5CisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdzE3LHcxNyx3NgorCWVvcgl3MTksdzE5LHc3CisJZW9yCXcyMCx3MjAsdzgKKwlyb3IJdzIxLHcyMSwjMjQKKwlyb3IJdzE3LHcxNywjMjQKKwlyb3IJdzE5LHcxOSwjMjQKKwlyb3IJdzIwLHcyMCwjMjQKKwlhZGQJdzE1LHcxNSx3MjEKKwlhZGQJdzE2LHcxNix3MTcKKwlhZGQJdzEzLHcxMyx3MTkKKwlhZGQJdzE0LHcxNCx3MjAKKwllb3IJdzEwLHcxMCx3MTUKKwllb3IJdzExLHcxMSx3MTYKKwllb3IJdzEyLHcxMix3MTMKKwllb3IJdzksdzksdzE0CisJcm9yCXcxMCx3MTAsIzI1CisJcm9yCXcxMSx3MTEsIzI1CisJcm9yCXcxMix3MTIsIzI1CisJcm9yCXc5LHc5LCMyNQorCWNibnoJeDQsTG9vcAorCisJYWRkCXc1LHc1LHcyMgkJLy8gYWNjdW11bGF0ZSBrZXkgYmxvY2sKKwlhZGQJeDYseDYseDIyLGxzciMzMgorCWFkZAl3Nyx3Nyx3MjMKKwlhZGQJeDgseDgseDIzLGxzciMzMgorCWFkZAl3OSx3OSx3MjQKKwlhZGQJeDEwLHgxMCx4MjQsbHNyIzMyCisJYWRkCXcxMSx3MTEsdzI1CisJYWRkCXgxMix4MTIseDI1LGxzciMzMgorCWFkZAl3MTMsdzEzLHcyNgorCWFkZAl4MTQseDE0LHgyNixsc3IjMzIKKwlhZGQJdzE1LHcxNSx3MjcKKwlhZGQJeDE2LHgxNix4MjcsbHNyIzMyCisJYWRkCXcxNyx3MTcsdzI4CisJYWRkCXgxOSx4MTkseDI4LGxzciMzMgorCWFkZAl3MjAsdzIwLHczMAorCWFkZAl4MjEseDIxLHgzMCxsc3IjMzIKKworCWIubG8JTHRhaWwKKworCWFkZAl4NSx4NSx4Nixsc2wjMzIJLy8gcGFjaworCWFkZAl4Nyx4Nyx4OCxsc2wjMzIKKwlsZHAJeDYseDgsW3gxLCMwXQkJLy8gbG9hZCBpbnB1dAorCWFkZAl4OSx4OSx4MTAsbHNsIzMyCisJYWRkCXgxMSx4MTEseDEyLGxzbCMzMgorCWxkcAl4MTAseDEyLFt4MSwjMTZdCisJYWRkCXgxMyx4MTMseDE0LGxzbCMzMgorCWFkZAl4MTUseDE1LHgxNixsc2wjMzIKKwlsZHAJeDE0LHgxNixbeDEsIzMyXQorCWFkZAl4MTcseDE3LHgxOSxsc2wjMzIKKwlhZGQJeDIwLHgyMCx4MjEsbHNsIzMyCisJbGRwCXgxOSx4MjEsW3gxLCM0OF0KKwlhZGQJeDEseDEsIzY0CisjaWZkZWYJX19BUk1FQl9fCisJcmV2CXg1LHg1CisJcmV2CXg3LHg3CisJcmV2CXg5LHg5CisJcmV2CXgxMSx4MTEKKwlyZXYJeDEzLHgxMworCXJldgl4MTUseDE1CisJcmV2CXgxNyx4MTcKKwlyZXYJeDIwLHgyMAorI2VuZGlmCisJZW9yCXg1LHg1LHg2CisJZW9yCXg3LHg3LHg4CisJZW9yCXg5LHg5LHgxMAorCWVvcgl4MTEseDExLHgxMgorCWVvcgl4MTMseDEzLHgxNAorCWVvcgl4MTUseDE1LHgxNgorCWVvcgl4MTcseDE3LHgxOQorCWVvcgl4MjAseDIwLHgyMQorCisJc3RwCXg1LHg3LFt4MCwjMF0JCS8vIHN0b3JlIG91dHB1dAorCWFkZAl4MjgseDI4LCMxCQkJLy8gaW5jcmVtZW50IGNvdW50ZXIKKwlzdHAJeDkseDExLFt4MCwjMTZdCisJc3RwCXgxMyx4MTUsW3gwLCMzMl0KKwlzdHAJeDE3LHgyMCxbeDAsIzQ4XQorCWFkZAl4MCx4MCwjNjQKKworCWIuaGkJTG9vcF9vdXRlcgorCisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM2NAorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcAl4MjkseDMwLFtzcF0sIzk2CitMYWJvcnQ6CisJcmV0CisKKy5hbGlnbgk0CitMdGFpbDoKKwlhZGQJeDIseDIsIzY0CitMZXNzX3RoYW5fNjQ6CisJc3ViCXgwLHgwLCMxCisJYWRkCXgxLHgxLHgyCisJYWRkCXgwLHgwLHgyCisJYWRkCXg0LHNwLHgyCisJbmVnCXgyLHgyCisKKwlhZGQJeDUseDUseDYsbHNsIzMyCS8vIHBhY2sKKwlhZGQJeDcseDcseDgsbHNsIzMyCisJYWRkCXg5LHg5LHgxMCxsc2wjMzIKKwlhZGQJeDExLHgxMSx4MTIsbHNsIzMyCisJYWRkCXgxMyx4MTMseDE0LGxzbCMzMgorCWFkZAl4MTUseDE1LHgxNixsc2wjMzIKKwlhZGQJeDE3LHgxNyx4MTksbHNsIzMyCisJYWRkCXgyMCx4MjAseDIxLGxzbCMzMgorI2lmZGVmCV9fQVJNRUJfXworCXJldgl4NSx4NQorCXJldgl4Nyx4NworCXJldgl4OSx4OQorCXJldgl4MTEseDExCisJcmV2CXgxMyx4MTMKKwlyZXYJeDE1LHgxNQorCXJldgl4MTcseDE3CisJcmV2CXgyMCx4MjAKKyNlbmRpZgorCXN0cAl4NSx4Nyxbc3AsIzBdCisJc3RwCXg5LHgxMSxbc3AsIzE2XQorCXN0cAl4MTMseDE1LFtzcCwjMzJdCisJc3RwCXgxNyx4MjAsW3NwLCM0OF0KKworTG9vcF90YWlsOgorCWxkcmIJdzEwLFt4MSx4Ml0KKwlsZHJiCXcxMSxbeDQseDJdCisJYWRkCXgyLHgyLCMxCisJZW9yCXcxMCx3MTAsdzExCisJc3RyYgl3MTAsW3gwLHgyXQorCWNibnoJeDIsTG9vcF90YWlsCisKKwlzdHAJeHpyLHh6cixbc3AsIzBdCisJc3RwCXh6cix4enIsW3NwLCMxNl0KKwlzdHAJeHpyLHh6cixbc3AsIzMyXQorCXN0cAl4enIseHpyLFtzcCwjNDhdCisKKwlsZHAJeDE5LHgyMCxbeDI5LCMxNl0KKwlhZGQJc3Asc3AsIzY0CisJbGRwCXgyMSx4MjIsW3gyOSwjMzJdCisJbGRwCXgyMyx4MjQsW3gyOSwjNDhdCisJbGRwCXgyNSx4MjYsW3gyOSwjNjRdCisJbGRwCXgyNyx4MjgsW3gyOSwjODBdCisJbGRwCXgyOSx4MzAsW3NwXSwjOTYKKwlyZXQKKworCisKKy5hbGlnbgk1CitDaGFDaGEyMF9uZW9uOgorCXN0cAl4MjkseDMwLFtzcCwjLTk2XSEKKwlhZGQJeDI5LHNwLCMwCisKKwlhZHIJeDUsTHNpZ21hCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisJc3RwCXgyNSx4MjYsW3NwLCM2NF0KKwlzdHAJeDI3LHgyOCxbc3AsIzgwXQorCWNtcAl4MiwjNTEyCisJYi5ocwlMNTEyX29yX21vcmVfbmVvbgorCisJc3ViCXNwLHNwLCM2NAorCisJbGRwCXgyMix4MjMsW3g1XQkJLy8gbG9hZCBzaWdtYQorCWxkMQl7djI0LjRzfSxbeDVdLCMxNgorCWxkcAl4MjQseDI1LFt4M10JCS8vIGxvYWQga2V5CisJbGRwCXgyNix4MjcsW3gzLCMxNl0KKwlsZDEJe3YyNS40cyx2MjYuNHN9LFt4M10KKwlsZHAJeDI4LHgzMCxbeDRdCQkvLyBsb2FkIGNvdW50ZXIKKwlsZDEJe3YyNy40c30sW3g0XQorCWxkMQl7djMxLjRzfSxbeDVdCisjaWZkZWYJX19BUk1FQl9fCisJcmV2NjQJdjI0LjRzLHYyNC40cworCXJvcgl4MjQseDI0LCMzMgorCXJvcgl4MjUseDI1LCMzMgorCXJvcgl4MjYseDI2LCMzMgorCXJvcgl4MjcseDI3LCMzMgorCXJvcgl4MjgseDI4LCMzMgorCXJvcgl4MzAseDMwLCMzMgorI2VuZGlmCisJYWRkCXYyNy40cyx2MjcuNHMsdjMxLjRzCQkvLyArPSAxCisJYWRkCXYyOC40cyx2MjcuNHMsdjMxLjRzCisJYWRkCXYyOS40cyx2MjguNHMsdjMxLjRzCisJc2hsCXYzMS40cyx2MzEuNHMsIzIJCQkvLyAxIC0+IDQKKworTG9vcF9vdXRlcl9uZW9uOgorCW1vdgl3NSx3MjIJCQkvLyB1bnBhY2sga2V5IGJsb2NrCisJbHNyCXg2LHgyMiwjMzIKKwltb3YJdjAuMTZiLHYyNC4xNmIKKwltb3YJdzcsdzIzCisJbHNyCXg4LHgyMywjMzIKKwltb3YJdjQuMTZiLHYyNC4xNmIKKwltb3YJdzksdzI0CisJbHNyCXgxMCx4MjQsIzMyCisJbW92CXYxNi4xNmIsdjI0LjE2YgorCW1vdgl3MTEsdzI1CisJbW92CXYxLjE2Yix2MjUuMTZiCisJbHNyCXgxMix4MjUsIzMyCisJbW92CXY1LjE2Yix2MjUuMTZiCisJbW92CXcxMyx3MjYKKwltb3YJdjE3LjE2Yix2MjUuMTZiCisJbHNyCXgxNCx4MjYsIzMyCisJbW92CXYzLjE2Yix2MjcuMTZiCisJbW92CXcxNSx3MjcKKwltb3YJdjcuMTZiLHYyOC4xNmIKKwlsc3IJeDE2LHgyNywjMzIKKwltb3YJdjE5LjE2Yix2MjkuMTZiCisJbW92CXcxNyx3MjgKKwltb3YJdjIuMTZiLHYyNi4xNmIKKwlsc3IJeDE5LHgyOCwjMzIKKwltb3YJdjYuMTZiLHYyNi4xNmIKKwltb3YJdzIwLHczMAorCW1vdgl2MTguMTZiLHYyNi4xNmIKKwlsc3IJeDIxLHgzMCwjMzIKKworCW1vdgl4NCwjMTAKKwlzdWJzCXgyLHgyLCMyNTYKK0xvb3BfbmVvbjoKKwlzdWIJeDQseDQsIzEKKwlhZGQJdjAuNHMsdjAuNHMsdjEuNHMKKwlhZGQJdzUsdzUsdzkKKwlhZGQJdjQuNHMsdjQuNHMsdjUuNHMKKwlhZGQJdzYsdzYsdzEwCisJYWRkCXYxNi40cyx2MTYuNHMsdjE3LjRzCisJYWRkCXc3LHc3LHcxMQorCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgorCWFkZAl3OCx3OCx3MTIKKwllb3IJdjcuMTZiLHY3LjE2Yix2NC4xNmIKKwllb3IJdzE3LHcxNyx3NQorCWVvcgl2MTkuMTZiLHYxOS4xNmIsdjE2LjE2YgorCWVvcgl3MTksdzE5LHc2CisJcmV2MzIJdjMuOGgsdjMuOGgKKwllb3IJdzIwLHcyMCx3NworCXJldjMyCXY3LjhoLHY3LjhoCisJZW9yCXcyMSx3MjEsdzgKKwlyZXYzMgl2MTkuOGgsdjE5LjhoCisJcm9yCXcxNyx3MTcsIzE2CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJcm9yCXcxOSx3MTksIzE2CisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJcm9yCXcyMCx3MjAsIzE2CisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcyMSx3MjEsIzE2CisJZW9yCXYyMC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3MTMsdzEzLHcxNworCWVvcgl2MjEuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzE0LHcxNCx3MTkKKwllb3IJdjIyLjE2Yix2MTcuMTZiLHYxOC4xNmIKKwlhZGQJdzE1LHcxNSx3MjAKKwl1c2hyCXYxLjRzLHYyMC40cywjMjAKKwlhZGQJdzE2LHcxNix3MjEKKwl1c2hyCXY1LjRzLHYyMS40cywjMjAKKwllb3IJdzksdzksdzEzCisJdXNocgl2MTcuNHMsdjIyLjRzLCMyMAorCWVvcgl3MTAsdzEwLHcxNAorCXNsaQl2MS40cyx2MjAuNHMsIzEyCisJZW9yCXcxMSx3MTEsdzE1CisJc2xpCXY1LjRzLHYyMS40cywjMTIKKwllb3IJdzEyLHcxMix3MTYKKwlzbGkJdjE3LjRzLHYyMi40cywjMTIKKwlyb3IJdzksdzksIzIwCisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJcm9yCXcxMCx3MTAsIzIwCisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJcm9yCXcxMSx3MTEsIzIwCisJYWRkCXYxNi40cyx2MTYuNHMsdjE3LjRzCisJcm9yCXcxMix3MTIsIzIwCisJZW9yCXYyMC4xNmIsdjMuMTZiLHYwLjE2YgorCWFkZAl3NSx3NSx3OQorCWVvcgl2MjEuMTZiLHY3LjE2Yix2NC4xNmIKKwlhZGQJdzYsdzYsdzEwCisJZW9yCXYyMi4xNmIsdjE5LjE2Yix2MTYuMTZiCisJYWRkCXc3LHc3LHcxMQorCXVzaHIJdjMuNHMsdjIwLjRzLCMyNAorCWFkZAl3OCx3OCx3MTIKKwl1c2hyCXY3LjRzLHYyMS40cywjMjQKKwllb3IJdzE3LHcxNyx3NQorCXVzaHIJdjE5LjRzLHYyMi40cywjMjQKKwllb3IJdzE5LHcxOSx3NgorCXNsaQl2My40cyx2MjAuNHMsIzgKKwllb3IJdzIwLHcyMCx3NworCXNsaQl2Ny40cyx2MjEuNHMsIzgKKwllb3IJdzIxLHcyMSx3OAorCXNsaQl2MTkuNHMsdjIyLjRzLCM4CisJcm9yCXcxNyx3MTcsIzI0CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJcm9yCXcxOSx3MTksIzI0CisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJcm9yCXcyMCx3MjAsIzI0CisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcyMSx3MjEsIzI0CisJZW9yCXYyMC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3MTMsdzEzLHcxNworCWVvcgl2MjEuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzE0LHcxNCx3MTkKKwllb3IJdjIyLjE2Yix2MTcuMTZiLHYxOC4xNmIKKwlhZGQJdzE1LHcxNSx3MjAKKwl1c2hyCXYxLjRzLHYyMC40cywjMjUKKwlhZGQJdzE2LHcxNix3MjEKKwl1c2hyCXY1LjRzLHYyMS40cywjMjUKKwllb3IJdzksdzksdzEzCisJdXNocgl2MTcuNHMsdjIyLjRzLCMyNQorCWVvcgl3MTAsdzEwLHcxNAorCXNsaQl2MS40cyx2MjAuNHMsIzcKKwllb3IJdzExLHcxMSx3MTUKKwlzbGkJdjUuNHMsdjIxLjRzLCM3CisJZW9yCXcxMix3MTIsdzE2CisJc2xpCXYxNy40cyx2MjIuNHMsIzcKKwlyb3IJdzksdzksIzI1CisJZXh0CXYyLjE2Yix2Mi4xNmIsdjIuMTZiLCM4CisJcm9yCXcxMCx3MTAsIzI1CisJZXh0CXY2LjE2Yix2Ni4xNmIsdjYuMTZiLCM4CisJcm9yCXcxMSx3MTEsIzI1CisJZXh0CXYxOC4xNmIsdjE4LjE2Yix2MTguMTZiLCM4CisJcm9yCXcxMix3MTIsIzI1CisJZXh0CXYzLjE2Yix2My4xNmIsdjMuMTZiLCMxMgorCWV4dAl2Ny4xNmIsdjcuMTZiLHY3LjE2YiwjMTIKKwlleHQJdjE5LjE2Yix2MTkuMTZiLHYxOS4xNmIsIzEyCisJZXh0CXYxLjE2Yix2MS4xNmIsdjEuMTZiLCM0CisJZXh0CXY1LjE2Yix2NS4xNmIsdjUuMTZiLCM0CisJZXh0CXYxNy4xNmIsdjE3LjE2Yix2MTcuMTZiLCM0CisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJYWRkCXc1LHc1LHcxMAorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWFkZAl3Nix3Nix3MTEKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYzLjE2Yix2My4xNmIsdjAuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXY3LjE2Yix2Ny4xNmIsdjQuMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXJldjMyCXYzLjhoLHYzLjhoCisJZW9yCXcxOSx3MTksdzcKKwlyZXYzMgl2Ny44aCx2Ny44aAorCWVvcgl3MjAsdzIwLHc4CisJcmV2MzIJdjE5LjhoLHYxOS44aAorCXJvcgl3MjEsdzIxLCMxNgorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCXJvcgl3MTcsdzE3LCMxNgorCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCXJvcgl3MTksdzE5LCMxNgorCWFkZAl2MTguNHMsdjE4LjRzLHYxOS40cworCXJvcgl3MjAsdzIwLCMxNgorCWVvcgl2MjAuMTZiLHYxLjE2Yix2Mi4xNmIKKwlhZGQJdzE1LHcxNSx3MjEKKwllb3IJdjIxLjE2Yix2NS4xNmIsdjYuMTZiCisJYWRkCXcxNix3MTYsdzE3CisJZW9yCXYyMi4xNmIsdjE3LjE2Yix2MTguMTZiCisJYWRkCXcxMyx3MTMsdzE5CisJdXNocgl2MS40cyx2MjAuNHMsIzIwCisJYWRkCXcxNCx3MTQsdzIwCisJdXNocgl2NS40cyx2MjEuNHMsIzIwCisJZW9yCXcxMCx3MTAsdzE1CisJdXNocgl2MTcuNHMsdjIyLjRzLCMyMAorCWVvcgl3MTEsdzExLHcxNgorCXNsaQl2MS40cyx2MjAuNHMsIzEyCisJZW9yCXcxMix3MTIsdzEzCisJc2xpCXY1LjRzLHYyMS40cywjMTIKKwllb3IJdzksdzksdzE0CisJc2xpCXYxNy40cyx2MjIuNHMsIzEyCisJcm9yCXcxMCx3MTAsIzIwCisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJcm9yCXcxMSx3MTEsIzIwCisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJcm9yCXcxMix3MTIsIzIwCisJYWRkCXYxNi40cyx2MTYuNHMsdjE3LjRzCisJcm9yCXc5LHc5LCMyMAorCWVvcgl2MjAuMTZiLHYzLjE2Yix2MC4xNmIKKwlhZGQJdzUsdzUsdzEwCisJZW9yCXYyMS4xNmIsdjcuMTZiLHY0LjE2YgorCWFkZAl3Nix3Nix3MTEKKwllb3IJdjIyLjE2Yix2MTkuMTZiLHYxNi4xNmIKKwlhZGQJdzcsdzcsdzEyCisJdXNocgl2My40cyx2MjAuNHMsIzI0CisJYWRkCXc4LHc4LHc5CisJdXNocgl2Ny40cyx2MjEuNHMsIzI0CisJZW9yCXcyMSx3MjEsdzUKKwl1c2hyCXYxOS40cyx2MjIuNHMsIzI0CisJZW9yCXcxNyx3MTcsdzYKKwlzbGkJdjMuNHMsdjIwLjRzLCM4CisJZW9yCXcxOSx3MTksdzcKKwlzbGkJdjcuNHMsdjIxLjRzLCM4CisJZW9yCXcyMCx3MjAsdzgKKwlzbGkJdjE5LjRzLHYyMi40cywjOAorCXJvcgl3MjEsdzIxLCMyNAorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCXJvcgl3MTcsdzE3LCMyNAorCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCXJvcgl3MTksdzE5LCMyNAorCWFkZAl2MTguNHMsdjE4LjRzLHYxOS40cworCXJvcgl3MjAsdzIwLCMyNAorCWVvcgl2MjAuMTZiLHYxLjE2Yix2Mi4xNmIKKwlhZGQJdzE1LHcxNSx3MjEKKwllb3IJdjIxLjE2Yix2NS4xNmIsdjYuMTZiCisJYWRkCXcxNix3MTYsdzE3CisJZW9yCXYyMi4xNmIsdjE3LjE2Yix2MTguMTZiCisJYWRkCXcxMyx3MTMsdzE5CisJdXNocgl2MS40cyx2MjAuNHMsIzI1CisJYWRkCXcxNCx3MTQsdzIwCisJdXNocgl2NS40cyx2MjEuNHMsIzI1CisJZW9yCXcxMCx3MTAsdzE1CisJdXNocgl2MTcuNHMsdjIyLjRzLCMyNQorCWVvcgl3MTEsdzExLHcxNgorCXNsaQl2MS40cyx2MjAuNHMsIzcKKwllb3IJdzEyLHcxMix3MTMKKwlzbGkJdjUuNHMsdjIxLjRzLCM3CisJZW9yCXc5LHc5LHcxNAorCXNsaQl2MTcuNHMsdjIyLjRzLCM3CisJcm9yCXcxMCx3MTAsIzI1CisJZXh0CXYyLjE2Yix2Mi4xNmIsdjIuMTZiLCM4CisJcm9yCXcxMSx3MTEsIzI1CisJZXh0CXY2LjE2Yix2Ni4xNmIsdjYuMTZiLCM4CisJcm9yCXcxMix3MTIsIzI1CisJZXh0CXYxOC4xNmIsdjE4LjE2Yix2MTguMTZiLCM4CisJcm9yCXc5LHc5LCMyNQorCWV4dAl2My4xNmIsdjMuMTZiLHYzLjE2YiwjNAorCWV4dAl2Ny4xNmIsdjcuMTZiLHY3LjE2YiwjNAorCWV4dAl2MTkuMTZiLHYxOS4xNmIsdjE5LjE2YiwjNAorCWV4dAl2MS4xNmIsdjEuMTZiLHYxLjE2YiwjMTIKKwlleHQJdjUuMTZiLHY1LjE2Yix2NS4xNmIsIzEyCisJZXh0CXYxNy4xNmIsdjE3LjE2Yix2MTcuMTZiLCMxMgorCWNibnoJeDQsTG9vcF9uZW9uCisKKwlhZGQJdzUsdzUsdzIyCQkvLyBhY2N1bXVsYXRlIGtleSBibG9jaworCWFkZAl2MC40cyx2MC40cyx2MjQuNHMKKwlhZGQJeDYseDYseDIyLGxzciMzMgorCWFkZAl2NC40cyx2NC40cyx2MjQuNHMKKwlhZGQJdzcsdzcsdzIzCisJYWRkCXYxNi40cyx2MTYuNHMsdjI0LjRzCisJYWRkCXg4LHg4LHgyMyxsc3IjMzIKKwlhZGQJdjIuNHMsdjIuNHMsdjI2LjRzCisJYWRkCXc5LHc5LHcyNAorCWFkZAl2Ni40cyx2Ni40cyx2MjYuNHMKKwlhZGQJeDEwLHgxMCx4MjQsbHNyIzMyCisJYWRkCXYxOC40cyx2MTguNHMsdjI2LjRzCisJYWRkCXcxMSx3MTEsdzI1CisJYWRkCXYzLjRzLHYzLjRzLHYyNy40cworCWFkZAl4MTIseDEyLHgyNSxsc3IjMzIKKwlhZGQJdzEzLHcxMyx3MjYKKwlhZGQJdjcuNHMsdjcuNHMsdjI4LjRzCisJYWRkCXgxNCx4MTQseDI2LGxzciMzMgorCWFkZAl3MTUsdzE1LHcyNworCWFkZAl2MTkuNHMsdjE5LjRzLHYyOS40cworCWFkZAl4MTYseDE2LHgyNyxsc3IjMzIKKwlhZGQJdzE3LHcxNyx3MjgKKwlhZGQJdjEuNHMsdjEuNHMsdjI1LjRzCisJYWRkCXgxOSx4MTkseDI4LGxzciMzMgorCWFkZAl3MjAsdzIwLHczMAorCWFkZAl2NS40cyx2NS40cyx2MjUuNHMKKwlhZGQJeDIxLHgyMSx4MzAsbHNyIzMyCisJYWRkCXYxNy40cyx2MTcuNHMsdjI1LjRzCisKKwliLmxvCUx0YWlsX25lb24KKworCWFkZAl4NSx4NSx4Nixsc2wjMzIJLy8gcGFjaworCWFkZAl4Nyx4Nyx4OCxsc2wjMzIKKwlsZHAJeDYseDgsW3gxLCMwXQkJLy8gbG9hZCBpbnB1dAorCWFkZAl4OSx4OSx4MTAsbHNsIzMyCisJYWRkCXgxMSx4MTEseDEyLGxzbCMzMgorCWxkcAl4MTAseDEyLFt4MSwjMTZdCisJYWRkCXgxMyx4MTMseDE0LGxzbCMzMgorCWFkZAl4MTUseDE1LHgxNixsc2wjMzIKKwlsZHAJeDE0LHgxNixbeDEsIzMyXQorCWFkZAl4MTcseDE3LHgxOSxsc2wjMzIKKwlhZGQJeDIwLHgyMCx4MjEsbHNsIzMyCisJbGRwCXgxOSx4MjEsW3gxLCM0OF0KKwlhZGQJeDEseDEsIzY0CisjaWZkZWYJX19BUk1FQl9fCisJcmV2CXg1LHg1CisJcmV2CXg3LHg3CisJcmV2CXg5LHg5CisJcmV2CXgxMSx4MTEKKwlyZXYJeDEzLHgxMworCXJldgl4MTUseDE1CisJcmV2CXgxNyx4MTcKKwlyZXYJeDIwLHgyMAorI2VuZGlmCisJbGQxCXt2MjAuMTZiLHYyMS4xNmIsdjIyLjE2Yix2MjMuMTZifSxbeDFdLCM2NAorCWVvcgl4NSx4NSx4NgorCWVvcgl4Nyx4Nyx4OAorCWVvcgl4OSx4OSx4MTAKKwllb3IJeDExLHgxMSx4MTIKKwllb3IJeDEzLHgxMyx4MTQKKwllb3IJdjAuMTZiLHYwLjE2Yix2MjAuMTZiCisJZW9yCXgxNSx4MTUseDE2CisJZW9yCXYxLjE2Yix2MS4xNmIsdjIxLjE2YgorCWVvcgl4MTcseDE3LHgxOQorCWVvcgl2Mi4xNmIsdjIuMTZiLHYyMi4xNmIKKwllb3IJeDIwLHgyMCx4MjEKKwllb3IJdjMuMTZiLHYzLjE2Yix2MjMuMTZiCisJbGQxCXt2MjAuMTZiLHYyMS4xNmIsdjIyLjE2Yix2MjMuMTZifSxbeDFdLCM2NAorCisJc3RwCXg1LHg3LFt4MCwjMF0JCS8vIHN0b3JlIG91dHB1dAorCWFkZAl4MjgseDI4LCM0CQkJLy8gaW5jcmVtZW50IGNvdW50ZXIKKwlzdHAJeDkseDExLFt4MCwjMTZdCisJYWRkCXYyNy40cyx2MjcuNHMsdjMxLjRzCQkvLyArPSA0CisJc3RwCXgxMyx4MTUsW3gwLCMzMl0KKwlhZGQJdjI4LjRzLHYyOC40cyx2MzEuNHMKKwlzdHAJeDE3LHgyMCxbeDAsIzQ4XQorCWFkZAl2MjkuNHMsdjI5LjRzLHYzMS40cworCWFkZAl4MCx4MCwjNjQKKworCXN0MQl7djAuMTZiLHYxLjE2Yix2Mi4xNmIsdjMuMTZifSxbeDBdLCM2NAorCWxkMQl7djAuMTZiLHYxLjE2Yix2Mi4xNmIsdjMuMTZifSxbeDFdLCM2NAorCisJZW9yCXY0LjE2Yix2NC4xNmIsdjIwLjE2YgorCWVvcgl2NS4xNmIsdjUuMTZiLHYyMS4xNmIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MjIuMTZiCisJZW9yCXY3LjE2Yix2Ny4xNmIsdjIzLjE2YgorCXN0MQl7djQuMTZiLHY1LjE2Yix2Ni4xNmIsdjcuMTZifSxbeDBdLCM2NAorCisJZW9yCXYxNi4xNmIsdjE2LjE2Yix2MC4xNmIKKwllb3IJdjE3LjE2Yix2MTcuMTZiLHYxLjE2YgorCWVvcgl2MTguMTZiLHYxOC4xNmIsdjIuMTZiCisJZW9yCXYxOS4xNmIsdjE5LjE2Yix2My4xNmIKKwlzdDEJe3YxNi4xNmIsdjE3LjE2Yix2MTguMTZiLHYxOS4xNmJ9LFt4MF0sIzY0CisKKwliLmhpCUxvb3Bfb3V0ZXJfbmVvbgorCisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM2NAorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcAl4MjkseDMwLFtzcF0sIzk2CisJcmV0CisKK0x0YWlsX25lb246CisJYWRkCXgyLHgyLCMyNTYKKwljbXAJeDIsIzY0CisJYi5sbwlMZXNzX3RoYW5fNjQKKworCWFkZAl4NSx4NSx4Nixsc2wjMzIJLy8gcGFjaworCWFkZAl4Nyx4Nyx4OCxsc2wjMzIKKwlsZHAJeDYseDgsW3gxLCMwXQkJLy8gbG9hZCBpbnB1dAorCWFkZAl4OSx4OSx4MTAsbHNsIzMyCisJYWRkCXgxMSx4MTEseDEyLGxzbCMzMgorCWxkcAl4MTAseDEyLFt4MSwjMTZdCisJYWRkCXgxMyx4MTMseDE0LGxzbCMzMgorCWFkZAl4MTUseDE1LHgxNixsc2wjMzIKKwlsZHAJeDE0LHgxNixbeDEsIzMyXQorCWFkZAl4MTcseDE3LHgxOSxsc2wjMzIKKwlhZGQJeDIwLHgyMCx4MjEsbHNsIzMyCisJbGRwCXgxOSx4MjEsW3gxLCM0OF0KKwlhZGQJeDEseDEsIzY0CisjaWZkZWYJX19BUk1FQl9fCisJcmV2CXg1LHg1CisJcmV2CXg3LHg3CisJcmV2CXg5LHg5CisJcmV2CXgxMSx4MTEKKwlyZXYJeDEzLHgxMworCXJldgl4MTUseDE1CisJcmV2CXgxNyx4MTcKKwlyZXYJeDIwLHgyMAorI2VuZGlmCisJZW9yCXg1LHg1LHg2CisJZW9yCXg3LHg3LHg4CisJZW9yCXg5LHg5LHgxMAorCWVvcgl4MTEseDExLHgxMgorCWVvcgl4MTMseDEzLHgxNAorCWVvcgl4MTUseDE1LHgxNgorCWVvcgl4MTcseDE3LHgxOQorCWVvcgl4MjAseDIwLHgyMQorCisJc3RwCXg1LHg3LFt4MCwjMF0JCS8vIHN0b3JlIG91dHB1dAorCWFkZAl4MjgseDI4LCM0CQkJLy8gaW5jcmVtZW50IGNvdW50ZXIKKwlzdHAJeDkseDExLFt4MCwjMTZdCisJc3RwCXgxMyx4MTUsW3gwLCMzMl0KKwlzdHAJeDE3LHgyMCxbeDAsIzQ4XQorCWFkZAl4MCx4MCwjNjQKKwliLmVxCUxkb25lX25lb24KKwlzdWIJeDIseDIsIzY0CisJY21wCXgyLCM2NAorCWIubG8JTGVzc190aGFuXzEyOAorCisJbGQxCXt2MjAuMTZiLHYyMS4xNmIsdjIyLjE2Yix2MjMuMTZifSxbeDFdLCM2NAorCWVvcgl2MC4xNmIsdjAuMTZiLHYyMC4xNmIKKwllb3IJdjEuMTZiLHYxLjE2Yix2MjEuMTZiCisJZW9yCXYyLjE2Yix2Mi4xNmIsdjIyLjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHYyMy4xNmIKKwlzdDEJe3YwLjE2Yix2MS4xNmIsdjIuMTZiLHYzLjE2Yn0sW3gwXSwjNjQKKwliLmVxCUxkb25lX25lb24KKwlzdWIJeDIseDIsIzY0CisJY21wCXgyLCM2NAorCWIubG8JTGVzc190aGFuXzE5MgorCisJbGQxCXt2MjAuMTZiLHYyMS4xNmIsdjIyLjE2Yix2MjMuMTZifSxbeDFdLCM2NAorCWVvcgl2NC4xNmIsdjQuMTZiLHYyMC4xNmIKKwllb3IJdjUuMTZiLHY1LjE2Yix2MjEuMTZiCisJZW9yCXY2LjE2Yix2Ni4xNmIsdjIyLjE2YgorCWVvcgl2Ny4xNmIsdjcuMTZiLHYyMy4xNmIKKwlzdDEJe3Y0LjE2Yix2NS4xNmIsdjYuMTZiLHY3LjE2Yn0sW3gwXSwjNjQKKwliLmVxCUxkb25lX25lb24KKwlzdWIJeDIseDIsIzY0CisKKwlzdDEJe3YxNi4xNmIsdjE3LjE2Yix2MTguMTZiLHYxOS4xNmJ9LFtzcF0KKwliCUxhc3RfbmVvbgorCitMZXNzX3RoYW5fMTI4OgorCXN0MQl7djAuMTZiLHYxLjE2Yix2Mi4xNmIsdjMuMTZifSxbc3BdCisJYglMYXN0X25lb24KK0xlc3NfdGhhbl8xOTI6CisJc3QxCXt2NC4xNmIsdjUuMTZiLHY2LjE2Yix2Ny4xNmJ9LFtzcF0KKwliCUxhc3RfbmVvbgorCisuYWxpZ24JNAorTGFzdF9uZW9uOgorCXN1Ygl4MCx4MCwjMQorCWFkZAl4MSx4MSx4MgorCWFkZAl4MCx4MCx4MgorCWFkZAl4NCxzcCx4MgorCW5lZwl4Mix4MgorCitMb29wX3RhaWxfbmVvbjoKKwlsZHJiCXcxMCxbeDEseDJdCisJbGRyYgl3MTEsW3g0LHgyXQorCWFkZAl4Mix4MiwjMQorCWVvcgl3MTAsdzEwLHcxMQorCXN0cmIJdzEwLFt4MCx4Ml0KKwljYm56CXgyLExvb3BfdGFpbF9uZW9uCisKKwlzdHAJeHpyLHh6cixbc3AsIzBdCisJc3RwCXh6cix4enIsW3NwLCMxNl0KKwlzdHAJeHpyLHh6cixbc3AsIzMyXQorCXN0cAl4enIseHpyLFtzcCwjNDhdCisKK0xkb25lX25lb246CisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM2NAorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcAl4MjkseDMwLFtzcF0sIzk2CisJcmV0CisKKworLmFsaWduCTUKK0NoYUNoYTIwXzUxMl9uZW9uOgorCXN0cAl4MjkseDMwLFtzcCwjLTk2XSEKKwlhZGQJeDI5LHNwLCMwCisKKwlhZHIJeDUsTHNpZ21hCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisJc3RwCXgyNSx4MjYsW3NwLCM2NF0KKwlzdHAJeDI3LHgyOCxbc3AsIzgwXQorCitMNTEyX29yX21vcmVfbmVvbjoKKwlzdWIJc3Asc3AsIzEyOCs2NAorCisJbGRwCXgyMix4MjMsW3g1XQkJLy8gbG9hZCBzaWdtYQorCWxkMQl7djI0LjRzfSxbeDVdLCMxNgorCWxkcAl4MjQseDI1LFt4M10JCS8vIGxvYWQga2V5CisJbGRwCXgyNix4MjcsW3gzLCMxNl0KKwlsZDEJe3YyNS40cyx2MjYuNHN9LFt4M10KKwlsZHAJeDI4LHgzMCxbeDRdCQkvLyBsb2FkIGNvdW50ZXIKKwlsZDEJe3YyNy40c30sW3g0XQorCWxkMQl7djMxLjRzfSxbeDVdCisjaWZkZWYJX19BUk1FQl9fCisJcmV2NjQJdjI0LjRzLHYyNC40cworCXJvcgl4MjQseDI0LCMzMgorCXJvcgl4MjUseDI1LCMzMgorCXJvcgl4MjYseDI2LCMzMgorCXJvcgl4MjcseDI3LCMzMgorCXJvcgl4MjgseDI4LCMzMgorCXJvcgl4MzAseDMwLCMzMgorI2VuZGlmCisJYWRkCXYyNy40cyx2MjcuNHMsdjMxLjRzCQkvLyArPSAxCisJc3RwCXEyNCxxMjUsW3NwLCMwXQkJLy8gb2ZmLWxvYWQga2V5IGJsb2NrLCBpbnZhcmlhbnQgcGFydAorCWFkZAl2MjcuNHMsdjI3LjRzLHYzMS40cwkJLy8gbm90IHR5cG8KKwlzdHIJcTI2LFtzcCwjMzJdCisJYWRkCXYyOC40cyx2MjcuNHMsdjMxLjRzCisJYWRkCXYyOS40cyx2MjguNHMsdjMxLjRzCisJYWRkCXYzMC40cyx2MjkuNHMsdjMxLjRzCisJc2hsCXYzMS40cyx2MzEuNHMsIzIJCQkvLyAxIC0+IDQKKworCXN0cAlkOCxkOSxbc3AsIzEyOCswXQkJLy8gbWVldCBBQkkgcmVxdWlyZW1lbnRzCisJc3RwCWQxMCxkMTEsW3NwLCMxMjgrMTZdCisJc3RwCWQxMixkMTMsW3NwLCMxMjgrMzJdCisJc3RwCWQxNCxkMTUsW3NwLCMxMjgrNDhdCisKKwlzdWIJeDIseDIsIzUxMgkJCS8vIG5vdCB0eXBvCisKK0xvb3Bfb3V0ZXJfNTEyX25lb246CisJbW92CXYwLjE2Yix2MjQuMTZiCisJbW92CXY0LjE2Yix2MjQuMTZiCisJbW92CXY4LjE2Yix2MjQuMTZiCisJbW92CXYxMi4xNmIsdjI0LjE2YgorCW1vdgl2MTYuMTZiLHYyNC4xNmIKKwltb3YJdjIwLjE2Yix2MjQuMTZiCisJbW92CXYxLjE2Yix2MjUuMTZiCisJbW92CXc1LHcyMgkJCS8vIHVucGFjayBrZXkgYmxvY2sKKwltb3YJdjUuMTZiLHYyNS4xNmIKKwlsc3IJeDYseDIyLCMzMgorCW1vdgl2OS4xNmIsdjI1LjE2YgorCW1vdgl3Nyx3MjMKKwltb3YJdjEzLjE2Yix2MjUuMTZiCisJbHNyCXg4LHgyMywjMzIKKwltb3YJdjE3LjE2Yix2MjUuMTZiCisJbW92CXc5LHcyNAorCW1vdgl2MjEuMTZiLHYyNS4xNmIKKwlsc3IJeDEwLHgyNCwjMzIKKwltb3YJdjMuMTZiLHYyNy4xNmIKKwltb3YJdzExLHcyNQorCW1vdgl2Ny4xNmIsdjI4LjE2YgorCWxzcgl4MTIseDI1LCMzMgorCW1vdgl2MTEuMTZiLHYyOS4xNmIKKwltb3YJdzEzLHcyNgorCW1vdgl2MTUuMTZiLHYzMC4xNmIKKwlsc3IJeDE0LHgyNiwjMzIKKwltb3YJdjIuMTZiLHYyNi4xNmIKKwltb3YJdzE1LHcyNworCW1vdgl2Ni4xNmIsdjI2LjE2YgorCWxzcgl4MTYseDI3LCMzMgorCWFkZAl2MTkuNHMsdjMuNHMsdjMxLjRzCQkJLy8gKzQKKwltb3YJdzE3LHcyOAorCWFkZAl2MjMuNHMsdjcuNHMsdjMxLjRzCQkJLy8gKzQKKwlsc3IJeDE5LHgyOCwjMzIKKwltb3YJdjEwLjE2Yix2MjYuMTZiCisJbW92CXcyMCx3MzAKKwltb3YJdjE0LjE2Yix2MjYuMTZiCisJbHNyCXgyMSx4MzAsIzMyCisJbW92CXYxOC4xNmIsdjI2LjE2YgorCXN0cAlxMjcscTI4LFtzcCwjNDhdCQkvLyBvZmYtbG9hZCBrZXkgYmxvY2ssIHZhcmlhYmxlIHBhcnQKKwltb3YJdjIyLjE2Yix2MjYuMTZiCisJc3RyCXEyOSxbc3AsIzgwXQorCisJbW92CXg0LCM1CisJc3Vicwl4Mix4MiwjNTEyCitMb29wX3VwcGVyX25lb246CisJc3ViCXg0LHg0LCMxCisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJYWRkCXc1LHc1LHc5CisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJYWRkCXc2LHc2LHcxMAorCWFkZAl2OC40cyx2OC40cyx2OS40cworCWFkZAl3Nyx3Nyx3MTEKKwlhZGQJdjEyLjRzLHYxMi40cyx2MTMuNHMKKwlhZGQJdzgsdzgsdzEyCisJYWRkCXYxNi40cyx2MTYuNHMsdjE3LjRzCisJZW9yCXcxNyx3MTcsdzUKKwlhZGQJdjIwLjRzLHYyMC40cyx2MjEuNHMKKwllb3IJdzE5LHcxOSx3NgorCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgorCWVvcgl3MjAsdzIwLHc3CisJZW9yCXY3LjE2Yix2Ny4xNmIsdjQuMTZiCisJZW9yCXcyMSx3MjEsdzgKKwllb3IJdjExLjE2Yix2MTEuMTZiLHY4LjE2YgorCXJvcgl3MTcsdzE3LCMxNgorCWVvcgl2MTUuMTZiLHYxNS4xNmIsdjEyLjE2YgorCXJvcgl3MTksdzE5LCMxNgorCWVvcgl2MTkuMTZiLHYxOS4xNmIsdjE2LjE2YgorCXJvcgl3MjAsdzIwLCMxNgorCWVvcgl2MjMuMTZiLHYyMy4xNmIsdjIwLjE2YgorCXJvcgl3MjEsdzIxLCMxNgorCXJldjMyCXYzLjhoLHYzLjhoCisJYWRkCXcxMyx3MTMsdzE3CisJcmV2MzIJdjcuOGgsdjcuOGgKKwlhZGQJdzE0LHcxNCx3MTkKKwlyZXYzMgl2MTEuOGgsdjExLjhoCisJYWRkCXcxNSx3MTUsdzIwCisJcmV2MzIJdjE1LjhoLHYxNS44aAorCWFkZAl3MTYsdzE2LHcyMQorCXJldjMyCXYxOS44aCx2MTkuOGgKKwllb3IJdzksdzksdzEzCisJcmV2MzIJdjIzLjhoLHYyMy44aAorCWVvcgl3MTAsdzEwLHcxNAorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCWVvcgl3MTEsdzExLHcxNQorCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCWVvcgl3MTIsdzEyLHcxNgorCWFkZAl2MTAuNHMsdjEwLjRzLHYxMS40cworCXJvcgl3OSx3OSwjMjAKKwlhZGQJdjE0LjRzLHYxNC40cyx2MTUuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjIyLjRzLHYyMi40cyx2MjMuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwllb3IJdjI0LjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXc1LHc1LHc5CisJZW9yCXYyNS4xNmIsdjUuMTZiLHY2LjE2YgorCWFkZAl3Nix3Nix3MTAKKwllb3IJdjI2LjE2Yix2OS4xNmIsdjEwLjE2YgorCWFkZAl3Nyx3Nyx3MTEKKwllb3IJdjI3LjE2Yix2MTMuMTZiLHYxNC4xNmIKKwlhZGQJdzgsdzgsdzEyCisJZW9yCXYyOC4xNmIsdjE3LjE2Yix2MTguMTZiCisJZW9yCXcxNyx3MTcsdzUKKwllb3IJdjI5LjE2Yix2MjEuMTZiLHYyMi4xNmIKKwllb3IJdzE5LHcxOSx3NgorCXVzaHIJdjEuNHMsdjI0LjRzLCMyMAorCWVvcgl3MjAsdzIwLHc3CisJdXNocgl2NS40cyx2MjUuNHMsIzIwCisJZW9yCXcyMSx3MjEsdzgKKwl1c2hyCXY5LjRzLHYyNi40cywjMjAKKwlyb3IJdzE3LHcxNywjMjQKKwl1c2hyCXYxMy40cyx2MjcuNHMsIzIwCisJcm9yCXcxOSx3MTksIzI0CisJdXNocgl2MTcuNHMsdjI4LjRzLCMyMAorCXJvcgl3MjAsdzIwLCMyNAorCXVzaHIJdjIxLjRzLHYyOS40cywjMjAKKwlyb3IJdzIxLHcyMSwjMjQKKwlzbGkJdjEuNHMsdjI0LjRzLCMxMgorCWFkZAl3MTMsdzEzLHcxNworCXNsaQl2NS40cyx2MjUuNHMsIzEyCisJYWRkCXcxNCx3MTQsdzE5CisJc2xpCXY5LjRzLHYyNi40cywjMTIKKwlhZGQJdzE1LHcxNSx3MjAKKwlzbGkJdjEzLjRzLHYyNy40cywjMTIKKwlhZGQJdzE2LHcxNix3MjEKKwlzbGkJdjE3LjRzLHYyOC40cywjMTIKKwllb3IJdzksdzksdzEzCisJc2xpCXYyMS40cyx2MjkuNHMsIzEyCisJZW9yCXcxMCx3MTAsdzE0CisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJZW9yCXcxMSx3MTEsdzE1CisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJZW9yCXcxMix3MTIsdzE2CisJYWRkCXY4LjRzLHY4LjRzLHY5LjRzCisJcm9yCXc5LHc5LCMyNQorCWFkZAl2MTIuNHMsdjEyLjRzLHYxMy40cworCXJvcgl3MTAsdzEwLCMyNQorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCXJvcgl3MTEsdzExLCMyNQorCWFkZAl2MjAuNHMsdjIwLjRzLHYyMS40cworCXJvcgl3MTIsdzEyLCMyNQorCWVvcgl2MjQuMTZiLHYzLjE2Yix2MC4xNmIKKwlhZGQJdzUsdzUsdzEwCisJZW9yCXYyNS4xNmIsdjcuMTZiLHY0LjE2YgorCWFkZAl3Nix3Nix3MTEKKwllb3IJdjI2LjE2Yix2MTEuMTZiLHY4LjE2YgorCWFkZAl3Nyx3Nyx3MTIKKwllb3IJdjI3LjE2Yix2MTUuMTZiLHYxMi4xNmIKKwlhZGQJdzgsdzgsdzkKKwllb3IJdjI4LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwllb3IJdzIxLHcyMSx3NQorCWVvcgl2MjkuMTZiLHYyMy4xNmIsdjIwLjE2YgorCWVvcgl3MTcsdzE3LHc2CisJdXNocgl2My40cyx2MjQuNHMsIzI0CisJZW9yCXcxOSx3MTksdzcKKwl1c2hyCXY3LjRzLHYyNS40cywjMjQKKwllb3IJdzIwLHcyMCx3OAorCXVzaHIJdjExLjRzLHYyNi40cywjMjQKKwlyb3IJdzIxLHcyMSwjMTYKKwl1c2hyCXYxNS40cyx2MjcuNHMsIzI0CisJcm9yCXcxNyx3MTcsIzE2CisJdXNocgl2MTkuNHMsdjI4LjRzLCMyNAorCXJvcgl3MTksdzE5LCMxNgorCXVzaHIJdjIzLjRzLHYyOS40cywjMjQKKwlyb3IJdzIwLHcyMCwjMTYKKwlzbGkJdjMuNHMsdjI0LjRzLCM4CisJYWRkCXcxNSx3MTUsdzIxCisJc2xpCXY3LjRzLHYyNS40cywjOAorCWFkZAl3MTYsdzE2LHcxNworCXNsaQl2MTEuNHMsdjI2LjRzLCM4CisJYWRkCXcxMyx3MTMsdzE5CisJc2xpCXYxNS40cyx2MjcuNHMsIzgKKwlhZGQJdzE0LHcxNCx3MjAKKwlzbGkJdjE5LjRzLHYyOC40cywjOAorCWVvcgl3MTAsdzEwLHcxNQorCXNsaQl2MjMuNHMsdjI5LjRzLCM4CisJZW9yCXcxMSx3MTEsdzE2CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJZW9yCXcxMix3MTIsdzEzCisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJZW9yCXc5LHc5LHcxNAorCWFkZAl2MTAuNHMsdjEwLjRzLHYxMS40cworCXJvcgl3MTAsdzEwLCMyMAorCWFkZAl2MTQuNHMsdjE0LjRzLHYxNS40cworCXJvcgl3MTEsdzExLCMyMAorCWFkZAl2MTguNHMsdjE4LjRzLHYxOS40cworCXJvcgl3MTIsdzEyLCMyMAorCWFkZAl2MjIuNHMsdjIyLjRzLHYyMy40cworCXJvcgl3OSx3OSwjMjAKKwllb3IJdjI0LjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXc1LHc1LHcxMAorCWVvcgl2MjUuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzYsdzYsdzExCisJZW9yCXYyNi4xNmIsdjkuMTZiLHYxMC4xNmIKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYyNy4xNmIsdjEzLjE2Yix2MTQuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXYyOC4xNmIsdjE3LjE2Yix2MTguMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjI5LjE2Yix2MjEuMTZiLHYyMi4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXVzaHIJdjEuNHMsdjI0LjRzLCMyNQorCWVvcgl3MTksdzE5LHc3CisJdXNocgl2NS40cyx2MjUuNHMsIzI1CisJZW9yCXcyMCx3MjAsdzgKKwl1c2hyCXY5LjRzLHYyNi40cywjMjUKKwlyb3IJdzIxLHcyMSwjMjQKKwl1c2hyCXYxMy40cyx2MjcuNHMsIzI1CisJcm9yCXcxNyx3MTcsIzI0CisJdXNocgl2MTcuNHMsdjI4LjRzLCMyNQorCXJvcgl3MTksdzE5LCMyNAorCXVzaHIJdjIxLjRzLHYyOS40cywjMjUKKwlyb3IJdzIwLHcyMCwjMjQKKwlzbGkJdjEuNHMsdjI0LjRzLCM3CisJYWRkCXcxNSx3MTUsdzIxCisJc2xpCXY1LjRzLHYyNS40cywjNworCWFkZAl3MTYsdzE2LHcxNworCXNsaQl2OS40cyx2MjYuNHMsIzcKKwlhZGQJdzEzLHcxMyx3MTkKKwlzbGkJdjEzLjRzLHYyNy40cywjNworCWFkZAl3MTQsdzE0LHcyMAorCXNsaQl2MTcuNHMsdjI4LjRzLCM3CisJZW9yCXcxMCx3MTAsdzE1CisJc2xpCXYyMS40cyx2MjkuNHMsIzcKKwllb3IJdzExLHcxMSx3MTYKKwlleHQJdjIuMTZiLHYyLjE2Yix2Mi4xNmIsIzgKKwllb3IJdzEyLHcxMix3MTMKKwlleHQJdjYuMTZiLHY2LjE2Yix2Ni4xNmIsIzgKKwllb3IJdzksdzksdzE0CisJZXh0CXYxMC4xNmIsdjEwLjE2Yix2MTAuMTZiLCM4CisJcm9yCXcxMCx3MTAsIzI1CisJZXh0CXYxNC4xNmIsdjE0LjE2Yix2MTQuMTZiLCM4CisJcm9yCXcxMSx3MTEsIzI1CisJZXh0CXYxOC4xNmIsdjE4LjE2Yix2MTguMTZiLCM4CisJcm9yCXcxMix3MTIsIzI1CisJZXh0CXYyMi4xNmIsdjIyLjE2Yix2MjIuMTZiLCM4CisJcm9yCXc5LHc5LCMyNQorCWV4dAl2My4xNmIsdjMuMTZiLHYzLjE2YiwjMTIKKwlleHQJdjcuMTZiLHY3LjE2Yix2Ny4xNmIsIzEyCisJZXh0CXYxMS4xNmIsdjExLjE2Yix2MTEuMTZiLCMxMgorCWV4dAl2MTUuMTZiLHYxNS4xNmIsdjE1LjE2YiwjMTIKKwlleHQJdjE5LjE2Yix2MTkuMTZiLHYxOS4xNmIsIzEyCisJZXh0CXYyMy4xNmIsdjIzLjE2Yix2MjMuMTZiLCMxMgorCWV4dAl2MS4xNmIsdjEuMTZiLHYxLjE2YiwjNAorCWV4dAl2NS4xNmIsdjUuMTZiLHY1LjE2YiwjNAorCWV4dAl2OS4xNmIsdjkuMTZiLHY5LjE2YiwjNAorCWV4dAl2MTMuMTZiLHYxMy4xNmIsdjEzLjE2YiwjNAorCWV4dAl2MTcuMTZiLHYxNy4xNmIsdjE3LjE2YiwjNAorCWV4dAl2MjEuMTZiLHYyMS4xNmIsdjIxLjE2YiwjNAorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWFkZAl3NSx3NSx3OQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWFkZAl3Nix3Nix3MTAKKwlhZGQJdjguNHMsdjguNHMsdjkuNHMKKwlhZGQJdzcsdzcsdzExCisJYWRkCXYxMi40cyx2MTIuNHMsdjEzLjRzCisJYWRkCXc4LHc4LHcxMgorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCWVvcgl3MTcsdzE3LHc1CisJYWRkCXYyMC40cyx2MjAuNHMsdjIxLjRzCisJZW9yCXcxOSx3MTksdzYKKwllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIKKwllb3IJdzIwLHcyMCx3NworCWVvcgl2Ny4xNmIsdjcuMTZiLHY0LjE2YgorCWVvcgl3MjEsdzIxLHc4CisJZW9yCXYxMS4xNmIsdjExLjE2Yix2OC4xNmIKKwlyb3IJdzE3LHcxNywjMTYKKwllb3IJdjE1LjE2Yix2MTUuMTZiLHYxMi4xNmIKKwlyb3IJdzE5LHcxOSwjMTYKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwlyb3IJdzIwLHcyMCwjMTYKKwllb3IJdjIzLjE2Yix2MjMuMTZiLHYyMC4xNmIKKwlyb3IJdzIxLHcyMSwjMTYKKwlyZXYzMgl2My44aCx2My44aAorCWFkZAl3MTMsdzEzLHcxNworCXJldjMyCXY3LjhoLHY3LjhoCisJYWRkCXcxNCx3MTQsdzE5CisJcmV2MzIJdjExLjhoLHYxMS44aAorCWFkZAl3MTUsdzE1LHcyMAorCXJldjMyCXYxNS44aCx2MTUuOGgKKwlhZGQJdzE2LHcxNix3MjEKKwlyZXYzMgl2MTkuOGgsdjE5LjhoCisJZW9yCXc5LHc5LHcxMworCXJldjMyCXYyMy44aCx2MjMuOGgKKwllb3IJdzEwLHcxMCx3MTQKKwlhZGQJdjIuNHMsdjIuNHMsdjMuNHMKKwllb3IJdzExLHcxMSx3MTUKKwlhZGQJdjYuNHMsdjYuNHMsdjcuNHMKKwllb3IJdzEyLHcxMix3MTYKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzksdzksIzIwCisJYWRkCXYxNC40cyx2MTQuNHMsdjE1LjRzCisJcm9yCXcxMCx3MTAsIzIwCisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcxMSx3MTEsIzIwCisJYWRkCXYyMi40cyx2MjIuNHMsdjIzLjRzCisJcm9yCXcxMix3MTIsIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3OQorCWVvcgl2MjUuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzYsdzYsdzEwCisJZW9yCXYyNi4xNmIsdjkuMTZiLHYxMC4xNmIKKwlhZGQJdzcsdzcsdzExCisJZW9yCXYyNy4xNmIsdjEzLjE2Yix2MTQuMTZiCisJYWRkCXc4LHc4LHcxMgorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MTcsdzE3LHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxOSx3MTksdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjAKKwllb3IJdzIwLHcyMCx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyMAorCWVvcgl3MjEsdzIxLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzIwCisJcm9yCXcxNyx3MTcsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyMAorCXJvcgl3MTksdzE5LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjAKKwlyb3IJdzIwLHcyMCwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzIwCisJcm9yCXcyMSx3MjEsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjMTIKKwlhZGQJdzEzLHcxMyx3MTcKKwlzbGkJdjUuNHMsdjI1LjRzLCMxMgorCWFkZAl3MTQsdzE0LHcxOQorCXNsaQl2OS40cyx2MjYuNHMsIzEyCisJYWRkCXcxNSx3MTUsdzIwCisJc2xpCXYxMy40cyx2MjcuNHMsIzEyCisJYWRkCXcxNix3MTYsdzIxCisJc2xpCXYxNy40cyx2MjguNHMsIzEyCisJZW9yCXc5LHc5LHcxMworCXNsaQl2MjEuNHMsdjI5LjRzLCMxMgorCWVvcgl3MTAsdzEwLHcxNAorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWVvcgl3MTEsdzExLHcxNQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWVvcgl3MTIsdzEyLHcxNgorCWFkZAl2OC40cyx2OC40cyx2OS40cworCXJvcgl3OSx3OSwjMjUKKwlhZGQJdjEyLjRzLHYxMi40cyx2MTMuNHMKKwlyb3IJdzEwLHcxMCwjMjUKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlyb3IJdzExLHcxMSwjMjUKKwlhZGQJdjIwLjRzLHYyMC40cyx2MjEuNHMKKwlyb3IJdzEyLHcxMiwjMjUKKwllb3IJdjI0LjE2Yix2My4xNmIsdjAuMTZiCisJYWRkCXc1LHc1LHcxMAorCWVvcgl2MjUuMTZiLHY3LjE2Yix2NC4xNmIKKwlhZGQJdzYsdzYsdzExCisJZW9yCXYyNi4xNmIsdjExLjE2Yix2OC4xNmIKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYyNy4xNmIsdjE1LjE2Yix2MTIuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXYyOC4xNmIsdjE5LjE2Yix2MTYuMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjI5LjE2Yix2MjMuMTZiLHYyMC4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXVzaHIJdjMuNHMsdjI0LjRzLCMyNAorCWVvcgl3MTksdzE5LHc3CisJdXNocgl2Ny40cyx2MjUuNHMsIzI0CisJZW9yCXcyMCx3MjAsdzgKKwl1c2hyCXYxMS40cyx2MjYuNHMsIzI0CisJcm9yCXcyMSx3MjEsIzE2CisJdXNocgl2MTUuNHMsdjI3LjRzLCMyNAorCXJvcgl3MTcsdzE3LCMxNgorCXVzaHIJdjE5LjRzLHYyOC40cywjMjQKKwlyb3IJdzE5LHcxOSwjMTYKKwl1c2hyCXYyMy40cyx2MjkuNHMsIzI0CisJcm9yCXcyMCx3MjAsIzE2CisJc2xpCXYzLjRzLHYyNC40cywjOAorCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2Ny40cyx2MjUuNHMsIzgKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjExLjRzLHYyNi40cywjOAorCWFkZAl3MTMsdzEzLHcxOQorCXNsaQl2MTUuNHMsdjI3LjRzLCM4CisJYWRkCXcxNCx3MTQsdzIwCisJc2xpCXYxOS40cyx2MjguNHMsIzgKKwllb3IJdzEwLHcxMCx3MTUKKwlzbGkJdjIzLjRzLHYyOS40cywjOAorCWVvcgl3MTEsdzExLHcxNgorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCWVvcgl3MTIsdzEyLHcxMworCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCWVvcgl3OSx3OSx3MTQKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjE0LjRzLHYxNC40cyx2MTUuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwlhZGQJdjIyLjRzLHYyMi40cyx2MjMuNHMKKwlyb3IJdzksdzksIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3MTAKKwllb3IJdjI1LjE2Yix2NS4xNmIsdjYuMTZiCisJYWRkCXc2LHc2LHcxMQorCWVvcgl2MjYuMTZiLHY5LjE2Yix2MTAuMTZiCisJYWRkCXc3LHc3LHcxMgorCWVvcgl2MjcuMTZiLHYxMy4xNmIsdjE0LjE2YgorCWFkZAl3OCx3OCx3OQorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MjEsdzIxLHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxNyx3MTcsdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjUKKwllb3IJdzE5LHcxOSx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyNQorCWVvcgl3MjAsdzIwLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzI1CisJcm9yCXcyMSx3MjEsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyNQorCXJvcgl3MTcsdzE3LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjUKKwlyb3IJdzE5LHcxOSwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzI1CisJcm9yCXcyMCx3MjAsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjNworCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2NS40cyx2MjUuNHMsIzcKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjkuNHMsdjI2LjRzLCM3CisJYWRkCXcxMyx3MTMsdzE5CisJc2xpCXYxMy40cyx2MjcuNHMsIzcKKwlhZGQJdzE0LHcxNCx3MjAKKwlzbGkJdjE3LjRzLHYyOC40cywjNworCWVvcgl3MTAsdzEwLHcxNQorCXNsaQl2MjEuNHMsdjI5LjRzLCM3CisJZW9yCXcxMSx3MTEsdzE2CisJZXh0CXYyLjE2Yix2Mi4xNmIsdjIuMTZiLCM4CisJZW9yCXcxMix3MTIsdzEzCisJZXh0CXY2LjE2Yix2Ni4xNmIsdjYuMTZiLCM4CisJZW9yCXc5LHc5LHcxNAorCWV4dAl2MTAuMTZiLHYxMC4xNmIsdjEwLjE2YiwjOAorCXJvcgl3MTAsdzEwLCMyNQorCWV4dAl2MTQuMTZiLHYxNC4xNmIsdjE0LjE2YiwjOAorCXJvcgl3MTEsdzExLCMyNQorCWV4dAl2MTguMTZiLHYxOC4xNmIsdjE4LjE2YiwjOAorCXJvcgl3MTIsdzEyLCMyNQorCWV4dAl2MjIuMTZiLHYyMi4xNmIsdjIyLjE2YiwjOAorCXJvcgl3OSx3OSwjMjUKKwlleHQJdjMuMTZiLHYzLjE2Yix2My4xNmIsIzQKKwlleHQJdjcuMTZiLHY3LjE2Yix2Ny4xNmIsIzQKKwlleHQJdjExLjE2Yix2MTEuMTZiLHYxMS4xNmIsIzQKKwlleHQJdjE1LjE2Yix2MTUuMTZiLHYxNS4xNmIsIzQKKwlleHQJdjE5LjE2Yix2MTkuMTZiLHYxOS4xNmIsIzQKKwlleHQJdjIzLjE2Yix2MjMuMTZiLHYyMy4xNmIsIzQKKwlleHQJdjEuMTZiLHYxLjE2Yix2MS4xNmIsIzEyCisJZXh0CXY1LjE2Yix2NS4xNmIsdjUuMTZiLCMxMgorCWV4dAl2OS4xNmIsdjkuMTZiLHY5LjE2YiwjMTIKKwlleHQJdjEzLjE2Yix2MTMuMTZiLHYxMy4xNmIsIzEyCisJZXh0CXYxNy4xNmIsdjE3LjE2Yix2MTcuMTZiLCMxMgorCWV4dAl2MjEuMTZiLHYyMS4xNmIsdjIxLjE2YiwjMTIKKwljYm56CXg0LExvb3BfdXBwZXJfbmVvbgorCisJYWRkCXc1LHc1LHcyMgkJLy8gYWNjdW11bGF0ZSBrZXkgYmxvY2sKKwlhZGQJeDYseDYseDIyLGxzciMzMgorCWFkZAl3Nyx3Nyx3MjMKKwlhZGQJeDgseDgseDIzLGxzciMzMgorCWFkZAl3OSx3OSx3MjQKKwlhZGQJeDEwLHgxMCx4MjQsbHNyIzMyCisJYWRkCXcxMSx3MTEsdzI1CisJYWRkCXgxMix4MTIseDI1LGxzciMzMgorCWFkZAl3MTMsdzEzLHcyNgorCWFkZAl4MTQseDE0LHgyNixsc3IjMzIKKwlhZGQJdzE1LHcxNSx3MjcKKwlhZGQJeDE2LHgxNix4MjcsbHNyIzMyCisJYWRkCXcxNyx3MTcsdzI4CisJYWRkCXgxOSx4MTkseDI4LGxzciMzMgorCWFkZAl3MjAsdzIwLHczMAorCWFkZAl4MjEseDIxLHgzMCxsc3IjMzIKKworCWFkZAl4NSx4NSx4Nixsc2wjMzIJLy8gcGFjaworCWFkZAl4Nyx4Nyx4OCxsc2wjMzIKKwlsZHAJeDYseDgsW3gxLCMwXQkJLy8gbG9hZCBpbnB1dAorCWFkZAl4OSx4OSx4MTAsbHNsIzMyCisJYWRkCXgxMSx4MTEseDEyLGxzbCMzMgorCWxkcAl4MTAseDEyLFt4MSwjMTZdCisJYWRkCXgxMyx4MTMseDE0LGxzbCMzMgorCWFkZAl4MTUseDE1LHgxNixsc2wjMzIKKwlsZHAJeDE0LHgxNixbeDEsIzMyXQorCWFkZAl4MTcseDE3LHgxOSxsc2wjMzIKKwlhZGQJeDIwLHgyMCx4MjEsbHNsIzMyCisJbGRwCXgxOSx4MjEsW3gxLCM0OF0KKwlhZGQJeDEseDEsIzY0CisjaWZkZWYJX19BUk1FQl9fCisJcmV2CXg1LHg1CisJcmV2CXg3LHg3CisJcmV2CXg5LHg5CisJcmV2CXgxMSx4MTEKKwlyZXYJeDEzLHgxMworCXJldgl4MTUseDE1CisJcmV2CXgxNyx4MTcKKwlyZXYJeDIwLHgyMAorI2VuZGlmCisJZW9yCXg1LHg1LHg2CisJZW9yCXg3LHg3LHg4CisJZW9yCXg5LHg5LHgxMAorCWVvcgl4MTEseDExLHgxMgorCWVvcgl4MTMseDEzLHgxNAorCWVvcgl4MTUseDE1LHgxNgorCWVvcgl4MTcseDE3LHgxOQorCWVvcgl4MjAseDIwLHgyMQorCisJc3RwCXg1LHg3LFt4MCwjMF0JCS8vIHN0b3JlIG91dHB1dAorCWFkZAl4MjgseDI4LCMxCQkJLy8gaW5jcmVtZW50IGNvdW50ZXIKKwltb3YJdzUsdzIyCQkJLy8gdW5wYWNrIGtleSBibG9jaworCWxzcgl4Nix4MjIsIzMyCisJc3RwCXg5LHgxMSxbeDAsIzE2XQorCW1vdgl3Nyx3MjMKKwlsc3IJeDgseDIzLCMzMgorCXN0cAl4MTMseDE1LFt4MCwjMzJdCisJbW92CXc5LHcyNAorCWxzcgl4MTAseDI0LCMzMgorCXN0cAl4MTcseDIwLFt4MCwjNDhdCisJYWRkCXgwLHgwLCM2NAorCW1vdgl3MTEsdzI1CisJbHNyCXgxMix4MjUsIzMyCisJbW92CXcxMyx3MjYKKwlsc3IJeDE0LHgyNiwjMzIKKwltb3YJdzE1LHcyNworCWxzcgl4MTYseDI3LCMzMgorCW1vdgl3MTcsdzI4CisJbHNyCXgxOSx4MjgsIzMyCisJbW92CXcyMCx3MzAKKwlsc3IJeDIxLHgzMCwjMzIKKworCW1vdgl4NCwjNQorTG9vcF9sb3dlcl9uZW9uOgorCXN1Ygl4NCx4NCwjMQorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWFkZAl3NSx3NSx3OQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWFkZAl3Nix3Nix3MTAKKwlhZGQJdjguNHMsdjguNHMsdjkuNHMKKwlhZGQJdzcsdzcsdzExCisJYWRkCXYxMi40cyx2MTIuNHMsdjEzLjRzCisJYWRkCXc4LHc4LHcxMgorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCWVvcgl3MTcsdzE3LHc1CisJYWRkCXYyMC40cyx2MjAuNHMsdjIxLjRzCisJZW9yCXcxOSx3MTksdzYKKwllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIKKwllb3IJdzIwLHcyMCx3NworCWVvcgl2Ny4xNmIsdjcuMTZiLHY0LjE2YgorCWVvcgl3MjEsdzIxLHc4CisJZW9yCXYxMS4xNmIsdjExLjE2Yix2OC4xNmIKKwlyb3IJdzE3LHcxNywjMTYKKwllb3IJdjE1LjE2Yix2MTUuMTZiLHYxMi4xNmIKKwlyb3IJdzE5LHcxOSwjMTYKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwlyb3IJdzIwLHcyMCwjMTYKKwllb3IJdjIzLjE2Yix2MjMuMTZiLHYyMC4xNmIKKwlyb3IJdzIxLHcyMSwjMTYKKwlyZXYzMgl2My44aCx2My44aAorCWFkZAl3MTMsdzEzLHcxNworCXJldjMyCXY3LjhoLHY3LjhoCisJYWRkCXcxNCx3MTQsdzE5CisJcmV2MzIJdjExLjhoLHYxMS44aAorCWFkZAl3MTUsdzE1LHcyMAorCXJldjMyCXYxNS44aCx2MTUuOGgKKwlhZGQJdzE2LHcxNix3MjEKKwlyZXYzMgl2MTkuOGgsdjE5LjhoCisJZW9yCXc5LHc5LHcxMworCXJldjMyCXYyMy44aCx2MjMuOGgKKwllb3IJdzEwLHcxMCx3MTQKKwlhZGQJdjIuNHMsdjIuNHMsdjMuNHMKKwllb3IJdzExLHcxMSx3MTUKKwlhZGQJdjYuNHMsdjYuNHMsdjcuNHMKKwllb3IJdzEyLHcxMix3MTYKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzksdzksIzIwCisJYWRkCXYxNC40cyx2MTQuNHMsdjE1LjRzCisJcm9yCXcxMCx3MTAsIzIwCisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcxMSx3MTEsIzIwCisJYWRkCXYyMi40cyx2MjIuNHMsdjIzLjRzCisJcm9yCXcxMix3MTIsIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3OQorCWVvcgl2MjUuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzYsdzYsdzEwCisJZW9yCXYyNi4xNmIsdjkuMTZiLHYxMC4xNmIKKwlhZGQJdzcsdzcsdzExCisJZW9yCXYyNy4xNmIsdjEzLjE2Yix2MTQuMTZiCisJYWRkCXc4LHc4LHcxMgorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MTcsdzE3LHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxOSx3MTksdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjAKKwllb3IJdzIwLHcyMCx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyMAorCWVvcgl3MjEsdzIxLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzIwCisJcm9yCXcxNyx3MTcsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyMAorCXJvcgl3MTksdzE5LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjAKKwlyb3IJdzIwLHcyMCwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzIwCisJcm9yCXcyMSx3MjEsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjMTIKKwlhZGQJdzEzLHcxMyx3MTcKKwlzbGkJdjUuNHMsdjI1LjRzLCMxMgorCWFkZAl3MTQsdzE0LHcxOQorCXNsaQl2OS40cyx2MjYuNHMsIzEyCisJYWRkCXcxNSx3MTUsdzIwCisJc2xpCXYxMy40cyx2MjcuNHMsIzEyCisJYWRkCXcxNix3MTYsdzIxCisJc2xpCXYxNy40cyx2MjguNHMsIzEyCisJZW9yCXc5LHc5LHcxMworCXNsaQl2MjEuNHMsdjI5LjRzLCMxMgorCWVvcgl3MTAsdzEwLHcxNAorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWVvcgl3MTEsdzExLHcxNQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWVvcgl3MTIsdzEyLHcxNgorCWFkZAl2OC40cyx2OC40cyx2OS40cworCXJvcgl3OSx3OSwjMjUKKwlhZGQJdjEyLjRzLHYxMi40cyx2MTMuNHMKKwlyb3IJdzEwLHcxMCwjMjUKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlyb3IJdzExLHcxMSwjMjUKKwlhZGQJdjIwLjRzLHYyMC40cyx2MjEuNHMKKwlyb3IJdzEyLHcxMiwjMjUKKwllb3IJdjI0LjE2Yix2My4xNmIsdjAuMTZiCisJYWRkCXc1LHc1LHcxMAorCWVvcgl2MjUuMTZiLHY3LjE2Yix2NC4xNmIKKwlhZGQJdzYsdzYsdzExCisJZW9yCXYyNi4xNmIsdjExLjE2Yix2OC4xNmIKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYyNy4xNmIsdjE1LjE2Yix2MTIuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXYyOC4xNmIsdjE5LjE2Yix2MTYuMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjI5LjE2Yix2MjMuMTZiLHYyMC4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXVzaHIJdjMuNHMsdjI0LjRzLCMyNAorCWVvcgl3MTksdzE5LHc3CisJdXNocgl2Ny40cyx2MjUuNHMsIzI0CisJZW9yCXcyMCx3MjAsdzgKKwl1c2hyCXYxMS40cyx2MjYuNHMsIzI0CisJcm9yCXcyMSx3MjEsIzE2CisJdXNocgl2MTUuNHMsdjI3LjRzLCMyNAorCXJvcgl3MTcsdzE3LCMxNgorCXVzaHIJdjE5LjRzLHYyOC40cywjMjQKKwlyb3IJdzE5LHcxOSwjMTYKKwl1c2hyCXYyMy40cyx2MjkuNHMsIzI0CisJcm9yCXcyMCx3MjAsIzE2CisJc2xpCXYzLjRzLHYyNC40cywjOAorCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2Ny40cyx2MjUuNHMsIzgKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjExLjRzLHYyNi40cywjOAorCWFkZAl3MTMsdzEzLHcxOQorCXNsaQl2MTUuNHMsdjI3LjRzLCM4CisJYWRkCXcxNCx3MTQsdzIwCisJc2xpCXYxOS40cyx2MjguNHMsIzgKKwllb3IJdzEwLHcxMCx3MTUKKwlzbGkJdjIzLjRzLHYyOS40cywjOAorCWVvcgl3MTEsdzExLHcxNgorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCWVvcgl3MTIsdzEyLHcxMworCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCWVvcgl3OSx3OSx3MTQKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjE0LjRzLHYxNC40cyx2MTUuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwlhZGQJdjIyLjRzLHYyMi40cyx2MjMuNHMKKwlyb3IJdzksdzksIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3MTAKKwllb3IJdjI1LjE2Yix2NS4xNmIsdjYuMTZiCisJYWRkCXc2LHc2LHcxMQorCWVvcgl2MjYuMTZiLHY5LjE2Yix2MTAuMTZiCisJYWRkCXc3LHc3LHcxMgorCWVvcgl2MjcuMTZiLHYxMy4xNmIsdjE0LjE2YgorCWFkZAl3OCx3OCx3OQorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MjEsdzIxLHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxNyx3MTcsdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjUKKwllb3IJdzE5LHcxOSx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyNQorCWVvcgl3MjAsdzIwLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzI1CisJcm9yCXcyMSx3MjEsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyNQorCXJvcgl3MTcsdzE3LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjUKKwlyb3IJdzE5LHcxOSwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzI1CisJcm9yCXcyMCx3MjAsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjNworCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2NS40cyx2MjUuNHMsIzcKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjkuNHMsdjI2LjRzLCM3CisJYWRkCXcxMyx3MTMsdzE5CisJc2xpCXYxMy40cyx2MjcuNHMsIzcKKwlhZGQJdzE0LHcxNCx3MjAKKwlzbGkJdjE3LjRzLHYyOC40cywjNworCWVvcgl3MTAsdzEwLHcxNQorCXNsaQl2MjEuNHMsdjI5LjRzLCM3CisJZW9yCXcxMSx3MTEsdzE2CisJZXh0CXYyLjE2Yix2Mi4xNmIsdjIuMTZiLCM4CisJZW9yCXcxMix3MTIsdzEzCisJZXh0CXY2LjE2Yix2Ni4xNmIsdjYuMTZiLCM4CisJZW9yCXc5LHc5LHcxNAorCWV4dAl2MTAuMTZiLHYxMC4xNmIsdjEwLjE2YiwjOAorCXJvcgl3MTAsdzEwLCMyNQorCWV4dAl2MTQuMTZiLHYxNC4xNmIsdjE0LjE2YiwjOAorCXJvcgl3MTEsdzExLCMyNQorCWV4dAl2MTguMTZiLHYxOC4xNmIsdjE4LjE2YiwjOAorCXJvcgl3MTIsdzEyLCMyNQorCWV4dAl2MjIuMTZiLHYyMi4xNmIsdjIyLjE2YiwjOAorCXJvcgl3OSx3OSwjMjUKKwlleHQJdjMuMTZiLHYzLjE2Yix2My4xNmIsIzEyCisJZXh0CXY3LjE2Yix2Ny4xNmIsdjcuMTZiLCMxMgorCWV4dAl2MTEuMTZiLHYxMS4xNmIsdjExLjE2YiwjMTIKKwlleHQJdjE1LjE2Yix2MTUuMTZiLHYxNS4xNmIsIzEyCisJZXh0CXYxOS4xNmIsdjE5LjE2Yix2MTkuMTZiLCMxMgorCWV4dAl2MjMuMTZiLHYyMy4xNmIsdjIzLjE2YiwjMTIKKwlleHQJdjEuMTZiLHYxLjE2Yix2MS4xNmIsIzQKKwlleHQJdjUuMTZiLHY1LjE2Yix2NS4xNmIsIzQKKwlleHQJdjkuMTZiLHY5LjE2Yix2OS4xNmIsIzQKKwlleHQJdjEzLjE2Yix2MTMuMTZiLHYxMy4xNmIsIzQKKwlleHQJdjE3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzQKKwlleHQJdjIxLjE2Yix2MjEuMTZiLHYyMS4xNmIsIzQKKwlhZGQJdjAuNHMsdjAuNHMsdjEuNHMKKwlhZGQJdzUsdzUsdzkKKwlhZGQJdjQuNHMsdjQuNHMsdjUuNHMKKwlhZGQJdzYsdzYsdzEwCisJYWRkCXY4LjRzLHY4LjRzLHY5LjRzCisJYWRkCXc3LHc3LHcxMQorCWFkZAl2MTIuNHMsdjEyLjRzLHYxMy40cworCWFkZAl3OCx3OCx3MTIKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwllb3IJdzE3LHcxNyx3NQorCWFkZAl2MjAuNHMsdjIwLjRzLHYyMS40cworCWVvcgl3MTksdzE5LHc2CisJZW9yCXYzLjE2Yix2My4xNmIsdjAuMTZiCisJZW9yCXcyMCx3MjAsdzcKKwllb3IJdjcuMTZiLHY3LjE2Yix2NC4xNmIKKwllb3IJdzIxLHcyMSx3OAorCWVvcgl2MTEuMTZiLHYxMS4xNmIsdjguMTZiCisJcm9yCXcxNyx3MTcsIzE2CisJZW9yCXYxNS4xNmIsdjE1LjE2Yix2MTIuMTZiCisJcm9yCXcxOSx3MTksIzE2CisJZW9yCXYxOS4xNmIsdjE5LjE2Yix2MTYuMTZiCisJcm9yCXcyMCx3MjAsIzE2CisJZW9yCXYyMy4xNmIsdjIzLjE2Yix2MjAuMTZiCisJcm9yCXcyMSx3MjEsIzE2CisJcmV2MzIJdjMuOGgsdjMuOGgKKwlhZGQJdzEzLHcxMyx3MTcKKwlyZXYzMgl2Ny44aCx2Ny44aAorCWFkZAl3MTQsdzE0LHcxOQorCXJldjMyCXYxMS44aCx2MTEuOGgKKwlhZGQJdzE1LHcxNSx3MjAKKwlyZXYzMgl2MTUuOGgsdjE1LjhoCisJYWRkCXcxNix3MTYsdzIxCisJcmV2MzIJdjE5LjhoLHYxOS44aAorCWVvcgl3OSx3OSx3MTMKKwlyZXYzMgl2MjMuOGgsdjIzLjhoCisJZW9yCXcxMCx3MTAsdzE0CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJZW9yCXcxMSx3MTEsdzE1CisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJZW9yCXcxMix3MTIsdzE2CisJYWRkCXYxMC40cyx2MTAuNHMsdjExLjRzCisJcm9yCXc5LHc5LCMyMAorCWFkZAl2MTQuNHMsdjE0LjRzLHYxNS40cworCXJvcgl3MTAsdzEwLCMyMAorCWFkZAl2MTguNHMsdjE4LjRzLHYxOS40cworCXJvcgl3MTEsdzExLCMyMAorCWFkZAl2MjIuNHMsdjIyLjRzLHYyMy40cworCXJvcgl3MTIsdzEyLCMyMAorCWVvcgl2MjQuMTZiLHYxLjE2Yix2Mi4xNmIKKwlhZGQJdzUsdzUsdzkKKwllb3IJdjI1LjE2Yix2NS4xNmIsdjYuMTZiCisJYWRkCXc2LHc2LHcxMAorCWVvcgl2MjYuMTZiLHY5LjE2Yix2MTAuMTZiCisJYWRkCXc3LHc3LHcxMQorCWVvcgl2MjcuMTZiLHYxMy4xNmIsdjE0LjE2YgorCWFkZAl3OCx3OCx3MTIKKwllb3IJdjI4LjE2Yix2MTcuMTZiLHYxOC4xNmIKKwllb3IJdzE3LHcxNyx3NQorCWVvcgl2MjkuMTZiLHYyMS4xNmIsdjIyLjE2YgorCWVvcgl3MTksdzE5LHc2CisJdXNocgl2MS40cyx2MjQuNHMsIzIwCisJZW9yCXcyMCx3MjAsdzcKKwl1c2hyCXY1LjRzLHYyNS40cywjMjAKKwllb3IJdzIxLHcyMSx3OAorCXVzaHIJdjkuNHMsdjI2LjRzLCMyMAorCXJvcgl3MTcsdzE3LCMyNAorCXVzaHIJdjEzLjRzLHYyNy40cywjMjAKKwlyb3IJdzE5LHcxOSwjMjQKKwl1c2hyCXYxNy40cyx2MjguNHMsIzIwCisJcm9yCXcyMCx3MjAsIzI0CisJdXNocgl2MjEuNHMsdjI5LjRzLCMyMAorCXJvcgl3MjEsdzIxLCMyNAorCXNsaQl2MS40cyx2MjQuNHMsIzEyCisJYWRkCXcxMyx3MTMsdzE3CisJc2xpCXY1LjRzLHYyNS40cywjMTIKKwlhZGQJdzE0LHcxNCx3MTkKKwlzbGkJdjkuNHMsdjI2LjRzLCMxMgorCWFkZAl3MTUsdzE1LHcyMAorCXNsaQl2MTMuNHMsdjI3LjRzLCMxMgorCWFkZAl3MTYsdzE2LHcyMQorCXNsaQl2MTcuNHMsdjI4LjRzLCMxMgorCWVvcgl3OSx3OSx3MTMKKwlzbGkJdjIxLjRzLHYyOS40cywjMTIKKwllb3IJdzEwLHcxMCx3MTQKKwlhZGQJdjAuNHMsdjAuNHMsdjEuNHMKKwllb3IJdzExLHcxMSx3MTUKKwlhZGQJdjQuNHMsdjQuNHMsdjUuNHMKKwllb3IJdzEyLHcxMix3MTYKKwlhZGQJdjguNHMsdjguNHMsdjkuNHMKKwlyb3IJdzksdzksIzI1CisJYWRkCXYxMi40cyx2MTIuNHMsdjEzLjRzCisJcm9yCXcxMCx3MTAsIzI1CisJYWRkCXYxNi40cyx2MTYuNHMsdjE3LjRzCisJcm9yCXcxMSx3MTEsIzI1CisJYWRkCXYyMC40cyx2MjAuNHMsdjIxLjRzCisJcm9yCXcxMix3MTIsIzI1CisJZW9yCXYyNC4xNmIsdjMuMTZiLHYwLjE2YgorCWFkZAl3NSx3NSx3MTAKKwllb3IJdjI1LjE2Yix2Ny4xNmIsdjQuMTZiCisJYWRkCXc2LHc2LHcxMQorCWVvcgl2MjYuMTZiLHYxMS4xNmIsdjguMTZiCisJYWRkCXc3LHc3LHcxMgorCWVvcgl2MjcuMTZiLHYxNS4xNmIsdjEyLjE2YgorCWFkZAl3OCx3OCx3OQorCWVvcgl2MjguMTZiLHYxOS4xNmIsdjE2LjE2YgorCWVvcgl3MjEsdzIxLHc1CisJZW9yCXYyOS4xNmIsdjIzLjE2Yix2MjAuMTZiCisJZW9yCXcxNyx3MTcsdzYKKwl1c2hyCXYzLjRzLHYyNC40cywjMjQKKwllb3IJdzE5LHcxOSx3NworCXVzaHIJdjcuNHMsdjI1LjRzLCMyNAorCWVvcgl3MjAsdzIwLHc4CisJdXNocgl2MTEuNHMsdjI2LjRzLCMyNAorCXJvcgl3MjEsdzIxLCMxNgorCXVzaHIJdjE1LjRzLHYyNy40cywjMjQKKwlyb3IJdzE3LHcxNywjMTYKKwl1c2hyCXYxOS40cyx2MjguNHMsIzI0CisJcm9yCXcxOSx3MTksIzE2CisJdXNocgl2MjMuNHMsdjI5LjRzLCMyNAorCXJvcgl3MjAsdzIwLCMxNgorCXNsaQl2My40cyx2MjQuNHMsIzgKKwlhZGQJdzE1LHcxNSx3MjEKKwlzbGkJdjcuNHMsdjI1LjRzLCM4CisJYWRkCXcxNix3MTYsdzE3CisJc2xpCXYxMS40cyx2MjYuNHMsIzgKKwlhZGQJdzEzLHcxMyx3MTkKKwlzbGkJdjE1LjRzLHYyNy40cywjOAorCWFkZAl3MTQsdzE0LHcyMAorCXNsaQl2MTkuNHMsdjI4LjRzLCM4CisJZW9yCXcxMCx3MTAsdzE1CisJc2xpCXYyMy40cyx2MjkuNHMsIzgKKwllb3IJdzExLHcxMSx3MTYKKwlhZGQJdjIuNHMsdjIuNHMsdjMuNHMKKwllb3IJdzEyLHcxMix3MTMKKwlhZGQJdjYuNHMsdjYuNHMsdjcuNHMKKwllb3IJdzksdzksdzE0CisJYWRkCXYxMC40cyx2MTAuNHMsdjExLjRzCisJcm9yCXcxMCx3MTAsIzIwCisJYWRkCXYxNC40cyx2MTQuNHMsdjE1LjRzCisJcm9yCXcxMSx3MTEsIzIwCisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcxMix3MTIsIzIwCisJYWRkCXYyMi40cyx2MjIuNHMsdjIzLjRzCisJcm9yCXc5LHc5LCMyMAorCWVvcgl2MjQuMTZiLHYxLjE2Yix2Mi4xNmIKKwlhZGQJdzUsdzUsdzEwCisJZW9yCXYyNS4xNmIsdjUuMTZiLHY2LjE2YgorCWFkZAl3Nix3Nix3MTEKKwllb3IJdjI2LjE2Yix2OS4xNmIsdjEwLjE2YgorCWFkZAl3Nyx3Nyx3MTIKKwllb3IJdjI3LjE2Yix2MTMuMTZiLHYxNC4xNmIKKwlhZGQJdzgsdzgsdzkKKwllb3IJdjI4LjE2Yix2MTcuMTZiLHYxOC4xNmIKKwllb3IJdzIxLHcyMSx3NQorCWVvcgl2MjkuMTZiLHYyMS4xNmIsdjIyLjE2YgorCWVvcgl3MTcsdzE3LHc2CisJdXNocgl2MS40cyx2MjQuNHMsIzI1CisJZW9yCXcxOSx3MTksdzcKKwl1c2hyCXY1LjRzLHYyNS40cywjMjUKKwllb3IJdzIwLHcyMCx3OAorCXVzaHIJdjkuNHMsdjI2LjRzLCMyNQorCXJvcgl3MjEsdzIxLCMyNAorCXVzaHIJdjEzLjRzLHYyNy40cywjMjUKKwlyb3IJdzE3LHcxNywjMjQKKwl1c2hyCXYxNy40cyx2MjguNHMsIzI1CisJcm9yCXcxOSx3MTksIzI0CisJdXNocgl2MjEuNHMsdjI5LjRzLCMyNQorCXJvcgl3MjAsdzIwLCMyNAorCXNsaQl2MS40cyx2MjQuNHMsIzcKKwlhZGQJdzE1LHcxNSx3MjEKKwlzbGkJdjUuNHMsdjI1LjRzLCM3CisJYWRkCXcxNix3MTYsdzE3CisJc2xpCXY5LjRzLHYyNi40cywjNworCWFkZAl3MTMsdzEzLHcxOQorCXNsaQl2MTMuNHMsdjI3LjRzLCM3CisJYWRkCXcxNCx3MTQsdzIwCisJc2xpCXYxNy40cyx2MjguNHMsIzcKKwllb3IJdzEwLHcxMCx3MTUKKwlzbGkJdjIxLjRzLHYyOS40cywjNworCWVvcgl3MTEsdzExLHcxNgorCWV4dAl2Mi4xNmIsdjIuMTZiLHYyLjE2YiwjOAorCWVvcgl3MTIsdzEyLHcxMworCWV4dAl2Ni4xNmIsdjYuMTZiLHY2LjE2YiwjOAorCWVvcgl3OSx3OSx3MTQKKwlleHQJdjEwLjE2Yix2MTAuMTZiLHYxMC4xNmIsIzgKKwlyb3IJdzEwLHcxMCwjMjUKKwlleHQJdjE0LjE2Yix2MTQuMTZiLHYxNC4xNmIsIzgKKwlyb3IJdzExLHcxMSwjMjUKKwlleHQJdjE4LjE2Yix2MTguMTZiLHYxOC4xNmIsIzgKKwlyb3IJdzEyLHcxMiwjMjUKKwlleHQJdjIyLjE2Yix2MjIuMTZiLHYyMi4xNmIsIzgKKwlyb3IJdzksdzksIzI1CisJZXh0CXYzLjE2Yix2My4xNmIsdjMuMTZiLCM0CisJZXh0CXY3LjE2Yix2Ny4xNmIsdjcuMTZiLCM0CisJZXh0CXYxMS4xNmIsdjExLjE2Yix2MTEuMTZiLCM0CisJZXh0CXYxNS4xNmIsdjE1LjE2Yix2MTUuMTZiLCM0CisJZXh0CXYxOS4xNmIsdjE5LjE2Yix2MTkuMTZiLCM0CisJZXh0CXYyMy4xNmIsdjIzLjE2Yix2MjMuMTZiLCM0CisJZXh0CXYxLjE2Yix2MS4xNmIsdjEuMTZiLCMxMgorCWV4dAl2NS4xNmIsdjUuMTZiLHY1LjE2YiwjMTIKKwlleHQJdjkuMTZiLHY5LjE2Yix2OS4xNmIsIzEyCisJZXh0CXYxMy4xNmIsdjEzLjE2Yix2MTMuMTZiLCMxMgorCWV4dAl2MTcuMTZiLHYxNy4xNmIsdjE3LjE2YiwjMTIKKwlleHQJdjIxLjE2Yix2MjEuMTZiLHYyMS4xNmIsIzEyCisJY2Juegl4NCxMb29wX2xvd2VyX25lb24KKworCWFkZAl3NSx3NSx3MjIJCS8vIGFjY3VtdWxhdGUga2V5IGJsb2NrCisJbGRwCXEyNCxxMjUsW3NwLCMwXQorCWFkZAl4Nix4Nix4MjIsbHNyIzMyCisJbGRwCXEyNixxMjcsW3NwLCMzMl0KKwlhZGQJdzcsdzcsdzIzCisJbGRwCXEyOCxxMjksW3NwLCM2NF0KKwlhZGQJeDgseDgseDIzLGxzciMzMgorCWFkZAl2MC40cyx2MC40cyx2MjQuNHMKKwlhZGQJdzksdzksdzI0CisJYWRkCXY0LjRzLHY0LjRzLHYyNC40cworCWFkZAl4MTAseDEwLHgyNCxsc3IjMzIKKwlhZGQJdjguNHMsdjguNHMsdjI0LjRzCisJYWRkCXcxMSx3MTEsdzI1CisJYWRkCXYxMi40cyx2MTIuNHMsdjI0LjRzCisJYWRkCXgxMix4MTIseDI1LGxzciMzMgorCWFkZAl2MTYuNHMsdjE2LjRzLHYyNC40cworCWFkZAl3MTMsdzEzLHcyNgorCWFkZAl2MjAuNHMsdjIwLjRzLHYyNC40cworCWFkZAl4MTQseDE0LHgyNixsc3IjMzIKKwlhZGQJdjIuNHMsdjIuNHMsdjI2LjRzCisJYWRkCXcxNSx3MTUsdzI3CisJYWRkCXY2LjRzLHY2LjRzLHYyNi40cworCWFkZAl4MTYseDE2LHgyNyxsc3IjMzIKKwlhZGQJdjEwLjRzLHYxMC40cyx2MjYuNHMKKwlhZGQJdzE3LHcxNyx3MjgKKwlhZGQJdjE0LjRzLHYxNC40cyx2MjYuNHMKKwlhZGQJeDE5LHgxOSx4MjgsbHNyIzMyCisJYWRkCXYxOC40cyx2MTguNHMsdjI2LjRzCisJYWRkCXcyMCx3MjAsdzMwCisJYWRkCXYyMi40cyx2MjIuNHMsdjI2LjRzCisJYWRkCXgyMSx4MjEseDMwLGxzciMzMgorCWFkZAl2MTkuNHMsdjE5LjRzLHYzMS40cwkJCS8vICs0CisJYWRkCXg1LHg1LHg2LGxzbCMzMgkvLyBwYWNrCisJYWRkCXYyMy40cyx2MjMuNHMsdjMxLjRzCQkJLy8gKzQKKwlhZGQJeDcseDcseDgsbHNsIzMyCisJYWRkCXYzLjRzLHYzLjRzLHYyNy40cworCWxkcAl4Nix4OCxbeDEsIzBdCQkvLyBsb2FkIGlucHV0CisJYWRkCXY3LjRzLHY3LjRzLHYyOC40cworCWFkZAl4OSx4OSx4MTAsbHNsIzMyCisJYWRkCXYxMS40cyx2MTEuNHMsdjI5LjRzCisJYWRkCXgxMSx4MTEseDEyLGxzbCMzMgorCWFkZAl2MTUuNHMsdjE1LjRzLHYzMC40cworCWxkcAl4MTAseDEyLFt4MSwjMTZdCisJYWRkCXYxOS40cyx2MTkuNHMsdjI3LjRzCisJYWRkCXgxMyx4MTMseDE0LGxzbCMzMgorCWFkZAl2MjMuNHMsdjIzLjRzLHYyOC40cworCWFkZAl4MTUseDE1LHgxNixsc2wjMzIKKwlhZGQJdjEuNHMsdjEuNHMsdjI1LjRzCisJbGRwCXgxNCx4MTYsW3gxLCMzMl0KKwlhZGQJdjUuNHMsdjUuNHMsdjI1LjRzCisJYWRkCXgxNyx4MTcseDE5LGxzbCMzMgorCWFkZAl2OS40cyx2OS40cyx2MjUuNHMKKwlhZGQJeDIwLHgyMCx4MjEsbHNsIzMyCisJYWRkCXYxMy40cyx2MTMuNHMsdjI1LjRzCisJbGRwCXgxOSx4MjEsW3gxLCM0OF0KKwlhZGQJdjE3LjRzLHYxNy40cyx2MjUuNHMKKwlhZGQJeDEseDEsIzY0CisJYWRkCXYyMS40cyx2MjEuNHMsdjI1LjRzCisKKyNpZmRlZglfX0FSTUVCX18KKwlyZXYJeDUseDUKKwlyZXYJeDcseDcKKwlyZXYJeDkseDkKKwlyZXYJeDExLHgxMQorCXJldgl4MTMseDEzCisJcmV2CXgxNSx4MTUKKwlyZXYJeDE3LHgxNworCXJldgl4MjAseDIwCisjZW5kaWYKKwlsZDEJe3YyNC4xNmIsdjI1LjE2Yix2MjYuMTZiLHYyNy4xNmJ9LFt4MV0sIzY0CisJZW9yCXg1LHg1LHg2CisJZW9yCXg3LHg3LHg4CisJZW9yCXg5LHg5LHgxMAorCWVvcgl4MTEseDExLHgxMgorCWVvcgl4MTMseDEzLHgxNAorCWVvcgl2MC4xNmIsdjAuMTZiLHYyNC4xNmIKKwllb3IJeDE1LHgxNSx4MTYKKwllb3IJdjEuMTZiLHYxLjE2Yix2MjUuMTZiCisJZW9yCXgxNyx4MTcseDE5CisJZW9yCXYyLjE2Yix2Mi4xNmIsdjI2LjE2YgorCWVvcgl4MjAseDIwLHgyMQorCWVvcgl2My4xNmIsdjMuMTZiLHYyNy4xNmIKKwlsZDEJe3YyNC4xNmIsdjI1LjE2Yix2MjYuMTZiLHYyNy4xNmJ9LFt4MV0sIzY0CisKKwlzdHAJeDUseDcsW3gwLCMwXQkJLy8gc3RvcmUgb3V0cHV0CisJYWRkCXgyOCx4MjgsIzcJCQkvLyBpbmNyZW1lbnQgY291bnRlcgorCXN0cAl4OSx4MTEsW3gwLCMxNl0KKwlzdHAJeDEzLHgxNSxbeDAsIzMyXQorCXN0cAl4MTcseDIwLFt4MCwjNDhdCisJYWRkCXgwLHgwLCM2NAorCXN0MQl7djAuMTZiLHYxLjE2Yix2Mi4xNmIsdjMuMTZifSxbeDBdLCM2NAorCisJbGQxCXt2MC4xNmIsdjEuMTZiLHYyLjE2Yix2My4xNmJ9LFt4MV0sIzY0CisJZW9yCXY0LjE2Yix2NC4xNmIsdjI0LjE2YgorCWVvcgl2NS4xNmIsdjUuMTZiLHYyNS4xNmIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MjYuMTZiCisJZW9yCXY3LjE2Yix2Ny4xNmIsdjI3LjE2YgorCXN0MQl7djQuMTZiLHY1LjE2Yix2Ni4xNmIsdjcuMTZifSxbeDBdLCM2NAorCisJbGQxCXt2NC4xNmIsdjUuMTZiLHY2LjE2Yix2Ny4xNmJ9LFt4MV0sIzY0CisJZW9yCXY4LjE2Yix2OC4xNmIsdjAuMTZiCisJbGRwCXEyNCxxMjUsW3NwLCMwXQorCWVvcgl2OS4xNmIsdjkuMTZiLHYxLjE2YgorCWxkcAlxMjYscTI3LFtzcCwjMzJdCisJZW9yCXYxMC4xNmIsdjEwLjE2Yix2Mi4xNmIKKwllb3IJdjExLjE2Yix2MTEuMTZiLHYzLjE2YgorCXN0MQl7djguMTZiLHY5LjE2Yix2MTAuMTZiLHYxMS4xNmJ9LFt4MF0sIzY0CisKKwlsZDEJe3Y4LjE2Yix2OS4xNmIsdjEwLjE2Yix2MTEuMTZifSxbeDFdLCM2NAorCWVvcgl2MTIuMTZiLHYxMi4xNmIsdjQuMTZiCisJZW9yCXYxMy4xNmIsdjEzLjE2Yix2NS4xNmIKKwllb3IJdjE0LjE2Yix2MTQuMTZiLHY2LjE2YgorCWVvcgl2MTUuMTZiLHYxNS4xNmIsdjcuMTZiCisJc3QxCXt2MTIuMTZiLHYxMy4xNmIsdjE0LjE2Yix2MTUuMTZifSxbeDBdLCM2NAorCisJbGQxCXt2MTIuMTZiLHYxMy4xNmIsdjE0LjE2Yix2MTUuMTZifSxbeDFdLCM2NAorCWVvcgl2MTYuMTZiLHYxNi4xNmIsdjguMTZiCisJZW9yCXYxNy4xNmIsdjE3LjE2Yix2OS4xNmIKKwllb3IJdjE4LjE2Yix2MTguMTZiLHYxMC4xNmIKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxMS4xNmIKKwlzdDEJe3YxNi4xNmIsdjE3LjE2Yix2MTguMTZiLHYxOS4xNmJ9LFt4MF0sIzY0CisKKwlzaGwJdjAuNHMsdjMxLjRzLCMxCQkJLy8gNCAtPiA4CisJZW9yCXYyMC4xNmIsdjIwLjE2Yix2MTIuMTZiCisJZW9yCXYyMS4xNmIsdjIxLjE2Yix2MTMuMTZiCisJZW9yCXYyMi4xNmIsdjIyLjE2Yix2MTQuMTZiCisJZW9yCXYyMy4xNmIsdjIzLjE2Yix2MTUuMTZiCisJc3QxCXt2MjAuMTZiLHYyMS4xNmIsdjIyLjE2Yix2MjMuMTZifSxbeDBdLCM2NAorCisJYWRkCXYyNy40cyx2MjcuNHMsdjAuNHMJCQkvLyArPSA4CisJYWRkCXYyOC40cyx2MjguNHMsdjAuNHMKKwlhZGQJdjI5LjRzLHYyOS40cyx2MC40cworCWFkZAl2MzAuNHMsdjMwLjRzLHYwLjRzCisKKwliLmhzCUxvb3Bfb3V0ZXJfNTEyX25lb24KKworCWFkZHMJeDIseDIsIzUxMgorCXVzaHIJdjAuNHMsdjMxLjRzLCMyCQkJLy8gNCAtPiAxCisKKwlsZHAJZDgsZDksW3NwLCMxMjgrMF0JCS8vIG1lZXQgQUJJIHJlcXVpcmVtZW50cworCWxkcAlkMTAsZDExLFtzcCwjMTI4KzE2XQorCWxkcAlkMTIsZDEzLFtzcCwjMTI4KzMyXQorCWxkcAlkMTQsZDE1LFtzcCwjMTI4KzQ4XQorCisJc3RwCXEyNCxxMzEsW3NwLCMwXQkJLy8gd2lwZSBvZmYtbG9hZCBhcmVhCisJc3RwCXEyNCxxMzEsW3NwLCMzMl0KKwlzdHAJcTI0LHEzMSxbc3AsIzY0XQorCisJYi5lcQlMZG9uZV81MTJfbmVvbgorCisJY21wCXgyLCMxOTIKKwlzdWIJdjI3LjRzLHYyNy40cyx2MC40cwkJCS8vIC09IDEKKwlzdWIJdjI4LjRzLHYyOC40cyx2MC40cworCXN1Ygl2MjkuNHMsdjI5LjRzLHYwLjRzCisJYWRkCXNwLHNwLCMxMjgKKwliLmhzCUxvb3Bfb3V0ZXJfbmVvbgorCisJZW9yCXYyNS4xNmIsdjI1LjE2Yix2MjUuMTZiCisJZW9yCXYyNi4xNmIsdjI2LjE2Yix2MjYuMTZiCisJZW9yCXYyNy4xNmIsdjI3LjE2Yix2MjcuMTZiCisJZW9yCXYyOC4xNmIsdjI4LjE2Yix2MjguMTZiCisJZW9yCXYyOS4xNmIsdjI5LjE2Yix2MjkuMTZiCisJZW9yCXYzMC4xNmIsdjMwLjE2Yix2MzAuMTZiCisJYglMb29wX291dGVyCisKK0xkb25lXzUxMl9uZW9uOgorCWxkcAl4MTkseDIwLFt4MjksIzE2XQorCWFkZAlzcCxzcCwjMTI4KzY0CisJbGRwCXgyMSx4MjIsW3gyOSwjMzJdCisJbGRwCXgyMyx4MjQsW3gyOSwjNDhdCisJbGRwCXgyNSx4MjYsW3gyOSwjNjRdCisJbGRwCXgyNyx4MjgsW3gyOSwjODBdCisJbGRwCXgyOSx4MzAsW3NwXSwjOTYKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9hZXN2OC1hcm14NjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzdjgtYXJteDY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3Y2NlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzdjgtYXJteDY0LlMKQEAgLTAsMCArMSw3NTMgQEAKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisudGV4dAorCisuYWxpZ24JNQorTHJjb246CisubG9uZwkweDAxLDB4MDEsMHgwMSwweDAxCisubG9uZwkweDBjMGYwZTBkLDB4MGMwZjBlMGQsMHgwYzBmMGUwZCwweDBjMGYwZTBkCS8vIHJvdGF0ZS1uLXNwbGF0CisubG9uZwkweDFiLDB4MWIsMHgxYiwweDFiCisKKy5nbG9ibAlfYWVzX2h3X3NldF9lbmNyeXB0X2tleQorLnByaXZhdGVfZXh0ZXJuCV9hZXNfaHdfc2V0X2VuY3J5cHRfa2V5CisKKy5hbGlnbgk1CitfYWVzX2h3X3NldF9lbmNyeXB0X2tleToKK0xlbmNfa2V5OgorCXN0cAl4MjkseDMwLFtzcCwjLTE2XSEKKwlhZGQJeDI5LHNwLCMwCisJbW92CXgzLCMtMQorCWNtcAl4MCwjMAorCWIuZXEJTGVuY19rZXlfYWJvcnQKKwljbXAJeDIsIzAKKwliLmVxCUxlbmNfa2V5X2Fib3J0CisJbW92CXgzLCMtMgorCWNtcAl3MSwjMTI4CisJYi5sdAlMZW5jX2tleV9hYm9ydAorCWNtcAl3MSwjMjU2CisJYi5ndAlMZW5jX2tleV9hYm9ydAorCXRzdAl3MSwjMHgzZgorCWIubmUJTGVuY19rZXlfYWJvcnQKKworCWFkcgl4MyxMcmNvbgorCWNtcAl3MSwjMTkyCisKKwllb3IJdjAuMTZiLHYwLjE2Yix2MC4xNmIKKwlsZDEJe3YzLjE2Yn0sW3gwXSwjMTYKKwltb3YJdzEsIzgJCS8vIHJldXNlIHcxCisJbGQxCXt2MS40cyx2Mi40c30sW3gzXSwjMzIKKworCWIubHQJTG9vcDEyOAorCWIuZXEJTDE5MgorCWIJTDI1NgorCisuYWxpZ24JNAorTG9vcDEyODoKKwl0YmwJdjYuMTZiLHt2My4xNmJ9LHYyLjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHYzLjE2YiwjMTIKKwlzdDEJe3YzLjRzfSxbeDJdLCMxNgorCWFlc2UJdjYuMTZiLHYwLjE2YgorCXN1YnMJdzEsdzEsIzEKKworCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHY1LjE2YiwjMTIKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXY2LjE2Yix2Ni4xNmIsdjEuMTZiCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJc2hsCXYxLjE2Yix2MS4xNmIsIzEKKwllb3IJdjMuMTZiLHYzLjE2Yix2Ni4xNmIKKwliLm5lCUxvb3AxMjgKKworCWxkMQl7djEuNHN9LFt4M10KKworCXRibAl2Ni4xNmIse3YzLjE2Yn0sdjIuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjMuMTZiLCMxMgorCXN0MQl7djMuNHN9LFt4Ml0sIzE2CisJYWVzZQl2Ni4xNmIsdjAuMTZiCisKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2Ni4xNmIsdjYuMTZiLHYxLjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCXNobAl2MS4xNmIsdjEuMTZiLCMxCisJZW9yCXYzLjE2Yix2My4xNmIsdjYuMTZiCisKKwl0YmwJdjYuMTZiLHt2My4xNmJ9LHYyLjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHYzLjE2YiwjMTIKKwlzdDEJe3YzLjRzfSxbeDJdLCMxNgorCWFlc2UJdjYuMTZiLHYwLjE2YgorCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHY1LjE2YiwjMTIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MS4xNmIKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwllb3IJdjMuMTZiLHYzLjE2Yix2Ni4xNmIKKwlzdDEJe3YzLjRzfSxbeDJdCisJYWRkCXgyLHgyLCMweDUwCisKKwltb3YJdzEyLCMxMAorCWIJTGRvbmUKKworLmFsaWduCTQKK0wxOTI6CisJbGQxCXt2NC44Yn0sW3gwXSwjOAorCW1vdmkJdjYuMTZiLCM4CQkJLy8gYm9ycm93IHY2LjE2YgorCXN0MQl7djMuNHN9LFt4Ml0sIzE2CisJc3ViCXYyLjE2Yix2Mi4xNmIsdjYuMTZiCS8vIGFkanVzdCB0aGUgbWFzaworCitMb29wMTkyOgorCXRibAl2Ni4xNmIse3Y0LjE2Yn0sdjIuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjMuMTZiLCMxMgorCXN0MQl7djQuOGJ9LFt4Ml0sIzgKKwlhZXNlCXY2LjE2Yix2MC4xNmIKKwlzdWJzCXcxLHcxLCMxCisKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCisJZHVwCXY1LjRzLHYzLnNbM10KKwllb3IJdjUuMTZiLHY1LjE2Yix2NC4xNmIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MS4xNmIKKwlleHQJdjQuMTZiLHYwLjE2Yix2NC4xNmIsIzEyCisJc2hsCXYxLjE2Yix2MS4xNmIsIzEKKwllb3IJdjQuMTZiLHY0LjE2Yix2NS4xNmIKKwllb3IJdjMuMTZiLHYzLjE2Yix2Ni4xNmIKKwllb3IJdjQuMTZiLHY0LjE2Yix2Ni4xNmIKKwlzdDEJe3YzLjRzfSxbeDJdLCMxNgorCWIubmUJTG9vcDE5MgorCisJbW92CXcxMiwjMTIKKwlhZGQJeDIseDIsIzB4MjAKKwliCUxkb25lCisKKy5hbGlnbgk0CitMMjU2OgorCWxkMQl7djQuMTZifSxbeDBdCisJbW92CXcxLCM3CisJbW92CXcxMiwjMTQKKwlzdDEJe3YzLjRzfSxbeDJdLCMxNgorCitMb29wMjU2OgorCXRibAl2Ni4xNmIse3Y0LjE2Yn0sdjIuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjMuMTZiLCMxMgorCXN0MQl7djQuNHN9LFt4Ml0sIzE2CisJYWVzZQl2Ni4xNmIsdjAuMTZiCisJc3Vicwl3MSx3MSwjMQorCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHY1LjE2YiwjMTIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MS4xNmIKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlzaGwJdjEuMTZiLHYxLjE2YiwjMQorCWVvcgl2My4xNmIsdjMuMTZiLHY2LjE2YgorCXN0MQl7djMuNHN9LFt4Ml0sIzE2CisJYi5lcQlMZG9uZQorCisJZHVwCXY2LjRzLHYzLnNbM10JCS8vIGp1c3Qgc3BsYXQKKwlleHQJdjUuMTZiLHYwLjE2Yix2NC4xNmIsIzEyCisJYWVzZQl2Ni4xNmIsdjAuMTZiCisKKwllb3IJdjQuMTZiLHY0LjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXY0LjE2Yix2NC4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2NC4xNmIsdjQuMTZiLHY1LjE2YgorCisJZW9yCXY0LjE2Yix2NC4xNmIsdjYuMTZiCisJYglMb29wMjU2CisKK0xkb25lOgorCXN0cgl3MTIsW3gyXQorCW1vdgl4MywjMAorCitMZW5jX2tleV9hYm9ydDoKKwltb3YJeDAseDMJCQkvLyByZXR1cm4gdmFsdWUKKwlsZHIJeDI5LFtzcF0sIzE2CisJcmV0CisKKworLmdsb2JsCV9hZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisucHJpdmF0ZV9leHRlcm4JX2Flc19od19zZXRfZGVjcnlwdF9rZXkKKworLmFsaWduCTUKK19hZXNfaHdfc2V0X2RlY3J5cHRfa2V5OgorCXN0cAl4MjkseDMwLFtzcCwjLTE2XSEKKwlhZGQJeDI5LHNwLCMwCisJYmwJTGVuY19rZXkKKworCWNtcAl4MCwjMAorCWIubmUJTGRlY19rZXlfYWJvcnQKKworCXN1Ygl4Mix4MiwjMjQwCQkvLyByZXN0b3JlIG9yaWdpbmFsIHgyCisJbW92CXg0LCMtMTYKKwlhZGQJeDAseDIseDEyLGxzbCM0CS8vIGVuZCBvZiBrZXkgc2NoZWR1bGUKKworCWxkMQl7djAuNHN9LFt4Ml0KKwlsZDEJe3YxLjRzfSxbeDBdCisJc3QxCXt2MC40c30sW3gwXSx4NAorCXN0MQl7djEuNHN9LFt4Ml0sIzE2CisKK0xvb3BfaW1jOgorCWxkMQl7djAuNHN9LFt4Ml0KKwlsZDEJe3YxLjRzfSxbeDBdCisJYWVzaW1jCXYwLjE2Yix2MC4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCXN0MQl7djAuNHN9LFt4MF0seDQKKwlzdDEJe3YxLjRzfSxbeDJdLCMxNgorCWNtcAl4MCx4MgorCWIuaGkJTG9vcF9pbWMKKworCWxkMQl7djAuNHN9LFt4Ml0KKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCXN0MQl7djAuNHN9LFt4MF0KKworCWVvcgl4MCx4MCx4MAkJLy8gcmV0dXJuIHZhbHVlCitMZGVjX2tleV9hYm9ydDoKKwlsZHAJeDI5LHgzMCxbc3BdLCMxNgorCXJldAorCisuZ2xvYmwJX2Flc19od19lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2Flc19od19lbmNyeXB0CisKKy5hbGlnbgk1CitfYWVzX2h3X2VuY3J5cHQ6CisJbGRyCXczLFt4MiwjMjQwXQorCWxkMQl7djAuNHN9LFt4Ml0sIzE2CisJbGQxCXt2Mi4xNmJ9LFt4MF0KKwlzdWIJdzMsdzMsIzIKKwlsZDEJe3YxLjRzfSxbeDJdLCMxNgorCitMb29wX2VuYzoKKwlhZXNlCXYyLjE2Yix2MC4xNmIKKwlhZXNtYwl2Mi4xNmIsdjIuMTZiCisJbGQxCXt2MC40c30sW3gyXSwjMTYKKwlzdWJzCXczLHczLCMyCisJYWVzZQl2Mi4xNmIsdjEuMTZiCisJYWVzbWMJdjIuMTZiLHYyLjE2YgorCWxkMQl7djEuNHN9LFt4Ml0sIzE2CisJYi5ndAlMb29wX2VuYworCisJYWVzZQl2Mi4xNmIsdjAuMTZiCisJYWVzbWMJdjIuMTZiLHYyLjE2YgorCWxkMQl7djAuNHN9LFt4Ml0KKwlhZXNlCXYyLjE2Yix2MS4xNmIKKwllb3IJdjIuMTZiLHYyLjE2Yix2MC4xNmIKKworCXN0MQl7djIuMTZifSxbeDFdCisJcmV0CisKKy5nbG9ibAlfYWVzX2h3X2RlY3J5cHQKKy5wcml2YXRlX2V4dGVybglfYWVzX2h3X2RlY3J5cHQKKworLmFsaWduCTUKK19hZXNfaHdfZGVjcnlwdDoKKwlsZHIJdzMsW3gyLCMyNDBdCisJbGQxCXt2MC40c30sW3gyXSwjMTYKKwlsZDEJe3YyLjE2Yn0sW3gwXQorCXN1Ygl3Myx3MywjMgorCWxkMQl7djEuNHN9LFt4Ml0sIzE2CisKK0xvb3BfZGVjOgorCWFlc2QJdjIuMTZiLHYwLjE2YgorCWFlc2ltYwl2Mi4xNmIsdjIuMTZiCisJbGQxCXt2MC40c30sW3gyXSwjMTYKKwlzdWJzCXczLHczLCMyCisJYWVzZAl2Mi4xNmIsdjEuMTZiCisJYWVzaW1jCXYyLjE2Yix2Mi4xNmIKKwlsZDEJe3YxLjRzfSxbeDJdLCMxNgorCWIuZ3QJTG9vcF9kZWMKKworCWFlc2QJdjIuMTZiLHYwLjE2YgorCWFlc2ltYwl2Mi4xNmIsdjIuMTZiCisJbGQxCXt2MC40c30sW3gyXQorCWFlc2QJdjIuMTZiLHYxLjE2YgorCWVvcgl2Mi4xNmIsdjIuMTZiLHYwLjE2YgorCisJc3QxCXt2Mi4xNmJ9LFt4MV0KKwlyZXQKKworLmdsb2JsCV9hZXNfaHdfY2JjX2VuY3J5cHQKKy5wcml2YXRlX2V4dGVybglfYWVzX2h3X2NiY19lbmNyeXB0CisKKy5hbGlnbgk1CitfYWVzX2h3X2NiY19lbmNyeXB0OgorCXN0cAl4MjkseDMwLFtzcCwjLTE2XSEKKwlhZGQJeDI5LHNwLCMwCisJc3Vicwl4Mix4MiwjMTYKKwltb3YJeDgsIzE2CisJYi5sbwlMY2JjX2Fib3J0CisJY3NlbAl4OCx4enIseDgsZXEKKworCWNtcAl3NSwjMAkJCS8vIGVuLSBvciBkZWNyeXB0aW5nPworCWxkcgl3NSxbeDMsIzI0MF0KKwlhbmQJeDIseDIsIy0xNgorCWxkMQl7djYuMTZifSxbeDRdCisJbGQxCXt2MC4xNmJ9LFt4MF0seDgKKworCWxkMQl7djE2LjRzLHYxNy40c30sW3gzXQkJLy8gbG9hZCBrZXkgc2NoZWR1bGUuLi4KKwlzdWIJdzUsdzUsIzYKKwlhZGQJeDcseDMseDUsbHNsIzQJLy8gcG9pbnRlciB0byBsYXN0IDcgcm91bmQga2V5cworCXN1Ygl3NSx3NSwjMgorCWxkMQl7djE4LjRzLHYxOS40c30sW3g3XSwjMzIKKwlsZDEJe3YyMC40cyx2MjEuNHN9LFt4N10sIzMyCisJbGQxCXt2MjIuNHMsdjIzLjRzfSxbeDddLCMzMgorCWxkMQl7djcuNHN9LFt4N10KKworCWFkZAl4Nyx4MywjMzIKKwltb3YJdzYsdzUKKwliLmVxCUxjYmNfZGVjCisKKwljbXAJdzUsIzIKKwllb3IJdjAuMTZiLHYwLjE2Yix2Ni4xNmIKKwllb3IJdjUuMTZiLHYxNi4xNmIsdjcuMTZiCisJYi5lcQlMY2JjX2VuYzEyOAorCisJbGQxCXt2Mi40cyx2My40c30sW3g3XQorCWFkZAl4Nyx4MywjMTYKKwlhZGQJeDYseDMsIzE2KjQKKwlhZGQJeDEyLHgzLCMxNio1CisJYWVzZQl2MC4xNmIsdjE2LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlhZGQJeDE0LHgzLCMxNio2CisJYWRkCXgzLHgzLCMxNio3CisJYglMZW50ZXJfY2JjX2VuYworCisuYWxpZ24JNAorTG9vcF9jYmNfZW5jOgorCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJc3QxCXt2Ni4xNmJ9LFt4MV0sIzE2CitMZW50ZXJfY2JjX2VuYzoKKwlhZXNlCXYwLjE2Yix2MTcuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjAuMTZiLHYyLjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlsZDEJe3YxNi40c30sW3g2XQorCWNtcAl3NSwjNAorCWFlc2UJdjAuMTZiLHYzLjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlsZDEJe3YxNy40c30sW3gxMl0KKwliLmVxCUxjYmNfZW5jMTkyCisKKwlhZXNlCXYwLjE2Yix2MTYuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWxkMQl7djE2LjRzfSxbeDE0XQorCWFlc2UJdjAuMTZiLHYxNy4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTcuNHN9LFt4M10KKwlub3AKKworTGNiY19lbmMxOTI6CisJYWVzZQl2MC4xNmIsdjE2LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlzdWJzCXgyLHgyLCMxNgorCWFlc2UJdjAuMTZiLHYxNy4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJY3NlbAl4OCx4enIseDgsZXEKKwlhZXNlCXYwLjE2Yix2MTguMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjAuMTZiLHYxOS4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTYuMTZifSxbeDBdLHg4CisJYWVzZQl2MC4xNmIsdjIwLjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwllb3IJdjE2LjE2Yix2MTYuMTZiLHY1LjE2YgorCWFlc2UJdjAuMTZiLHYyMS4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTcuNHN9LFt4N10JCS8vIHJlLXByZS1sb2FkIHJuZGtleVsxXQorCWFlc2UJdjAuMTZiLHYyMi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MC4xNmIsdjIzLjE2YgorCWVvcgl2Ni4xNmIsdjAuMTZiLHY3LjE2YgorCWIuaHMJTG9vcF9jYmNfZW5jCisKKwlzdDEJe3Y2LjE2Yn0sW3gxXSwjMTYKKwliCUxjYmNfZG9uZQorCisuYWxpZ24JNQorTGNiY19lbmMxMjg6CisJbGQxCXt2Mi40cyx2My40c30sW3g3XQorCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYglMZW50ZXJfY2JjX2VuYzEyOAorTG9vcF9jYmNfZW5jMTI4OgorCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJc3QxCXt2Ni4xNmJ9LFt4MV0sIzE2CitMZW50ZXJfY2JjX2VuYzEyODoKKwlhZXNlCXYwLjE2Yix2MTcuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCXN1YnMJeDIseDIsIzE2CisJYWVzZQl2MC4xNmIsdjIuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWNzZWwJeDgseHpyLHg4LGVxCisJYWVzZQl2MC4xNmIsdjMuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjAuMTZiLHYxOC4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MC4xNmIsdjE5LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlsZDEJe3YxNi4xNmJ9LFt4MF0seDgKKwlhZXNlCXYwLjE2Yix2MjAuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjAuMTZiLHYyMS4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MC4xNmIsdjIyLjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwllb3IJdjE2LjE2Yix2MTYuMTZiLHY1LjE2YgorCWFlc2UJdjAuMTZiLHYyMy4xNmIKKwllb3IJdjYuMTZiLHYwLjE2Yix2Ny4xNmIKKwliLmhzCUxvb3BfY2JjX2VuYzEyOAorCisJc3QxCXt2Ni4xNmJ9LFt4MV0sIzE2CisJYglMY2JjX2RvbmUKKy5hbGlnbgk1CitMY2JjX2RlYzoKKwlsZDEJe3YxOC4xNmJ9LFt4MF0sIzE2CisJc3Vicwl4Mix4MiwjMzIJCS8vIGJpYXMKKwlhZGQJdzYsdzUsIzIKKwlvcnIJdjMuMTZiLHYwLjE2Yix2MC4xNmIKKwlvcnIJdjEuMTZiLHYwLjE2Yix2MC4xNmIKKwlvcnIJdjE5LjE2Yix2MTguMTZiLHYxOC4xNmIKKwliLmxvCUxjYmNfZGVjX3RhaWwKKworCW9ycgl2MS4xNmIsdjE4LjE2Yix2MTguMTZiCisJbGQxCXt2MTguMTZifSxbeDBdLCMxNgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorCW9ycgl2My4xNmIsdjEuMTZiLHYxLjE2YgorCW9ycgl2MTkuMTZiLHYxOC4xNmIsdjE4LjE2YgorCitMb29wM3hfY2JjX2RlYzoKKwlhZXNkCXYwLjE2Yix2MTYuMTZiCisJYWVzaW1jCXYwLjE2Yix2MC4xNmIKKwlhZXNkCXYxLjE2Yix2MTYuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwlsZDEJe3YxNi40c30sW3g3XSwjMTYKKwlzdWJzCXc2LHc2LCMyCisJYWVzZAl2MC4xNmIsdjE3LjE2YgorCWFlc2ltYwl2MC4xNmIsdjAuMTZiCisJYWVzZAl2MS4xNmIsdjE3LjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJbGQxCXt2MTcuNHN9LFt4N10sIzE2CisJYi5ndAlMb29wM3hfY2JjX2RlYworCisJYWVzZAl2MC4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MC4xNmIsdjAuMTZiCisJYWVzZAl2MS4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYxNi4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJZW9yCXY0LjE2Yix2Ni4xNmIsdjcuMTZiCisJc3Vicwl4Mix4MiwjMHgzMAorCWVvcgl2NS4xNmIsdjIuMTZiLHY3LjE2YgorCWNzZWwJeDYseDIseDYsbG8JCQkvLyB4NiwgdzYsIGlzIHplcm8gYXQgdGhpcyBwb2ludAorCWFlc2QJdjAuMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MTcuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWVvcgl2MTcuMTZiLHYzLjE2Yix2Ny4xNmIKKwlhZGQJeDAseDAseDYJCS8vIHgwIGlzIGFkanVzdGVkIGluIHN1Y2ggd2F5IHRoYXQKKwkJCQkJLy8gYXQgZXhpdCBmcm9tIHRoZSBsb29wIHYxLjE2Yi12MTguMTZiCisJCQkJCS8vIGFyZSBsb2FkZWQgd2l0aCBsYXN0ICJ3b3JkcyIKKwlvcnIJdjYuMTZiLHYxOS4xNmIsdjE5LjE2YgorCW1vdgl4Nyx4MworCWFlc2QJdjAuMTZiLHYyMC4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYyMC4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MjAuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djIuMTZifSxbeDBdLCMxNgorCWFlc2QJdjAuMTZiLHYyMS4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYyMS4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MjEuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djMuMTZifSxbeDBdLCMxNgorCWFlc2QJdjAuMTZiLHYyMi4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYyMi4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MjIuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djE5LjE2Yn0sW3gwXSwjMTYKKwlhZXNkCXYwLjE2Yix2MjMuMTZiCisJYWVzZAl2MS4xNmIsdjIzLjE2YgorCWFlc2QJdjE4LjE2Yix2MjMuMTZiCisJbGQxCXt2MTYuNHN9LFt4N10sIzE2CS8vIHJlLXByZS1sb2FkIHJuZGtleVswXQorCWFkZAl3Nix3NSwjMgorCWVvcgl2NC4xNmIsdjQuMTZiLHYwLjE2YgorCWVvcgl2NS4xNmIsdjUuMTZiLHYxLjE2YgorCWVvcgl2MTguMTZiLHYxOC4xNmIsdjE3LjE2YgorCWxkMQl7djE3LjRzfSxbeDddLCMxNgkvLyByZS1wcmUtbG9hZCBybmRrZXlbMV0KKwlzdDEJe3Y0LjE2Yn0sW3gxXSwjMTYKKwlvcnIJdjAuMTZiLHYyLjE2Yix2Mi4xNmIKKwlzdDEJe3Y1LjE2Yn0sW3gxXSwjMTYKKwlvcnIJdjEuMTZiLHYzLjE2Yix2My4xNmIKKwlzdDEJe3YxOC4xNmJ9LFt4MV0sIzE2CisJb3JyCXYxOC4xNmIsdjE5LjE2Yix2MTkuMTZiCisJYi5ocwlMb29wM3hfY2JjX2RlYworCisJY21uCXgyLCMweDMwCisJYi5lcQlMY2JjX2RvbmUKKwlub3AKKworTGNiY19kZWNfdGFpbDoKKwlhZXNkCXYxLjE2Yix2MTYuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwlsZDEJe3YxNi40c30sW3g3XSwjMTYKKwlzdWJzCXc2LHc2LCMyCisJYWVzZAl2MS4xNmIsdjE3LjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJbGQxCXt2MTcuNHN9LFt4N10sIzE2CisJYi5ndAlMY2JjX2RlY190YWlsCisKKwlhZXNkCXYxLjE2Yix2MTYuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwlhZXNkCXYxLjE2Yix2MTcuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjE3LjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwlhZXNkCXYxLjE2Yix2MjAuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjIwLjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwljbW4JeDIsIzB4MjAKKwlhZXNkCXYxLjE2Yix2MjEuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjIxLjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwllb3IJdjUuMTZiLHY2LjE2Yix2Ny4xNmIKKwlhZXNkCXYxLjE2Yix2MjIuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjIyLjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwllb3IJdjE3LjE2Yix2My4xNmIsdjcuMTZiCisJYWVzZAl2MS4xNmIsdjIzLjE2YgorCWFlc2QJdjE4LjE2Yix2MjMuMTZiCisJYi5lcQlMY2JjX2RlY19vbmUKKwllb3IJdjUuMTZiLHY1LjE2Yix2MS4xNmIKKwllb3IJdjE3LjE2Yix2MTcuMTZiLHYxOC4xNmIKKwlvcnIJdjYuMTZiLHYxOS4xNmIsdjE5LjE2YgorCXN0MQl7djUuMTZifSxbeDFdLCMxNgorCXN0MQl7djE3LjE2Yn0sW3gxXSwjMTYKKwliCUxjYmNfZG9uZQorCitMY2JjX2RlY19vbmU6CisJZW9yCXY1LjE2Yix2NS4xNmIsdjE4LjE2YgorCW9ycgl2Ni4xNmIsdjE5LjE2Yix2MTkuMTZiCisJc3QxCXt2NS4xNmJ9LFt4MV0sIzE2CisKK0xjYmNfZG9uZToKKwlzdDEJe3Y2LjE2Yn0sW3g0XQorTGNiY19hYm9ydDoKKwlsZHIJeDI5LFtzcF0sIzE2CisJcmV0CisKKy5nbG9ibAlfYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzCisucHJpdmF0ZV9leHRlcm4JX2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcworCisuYWxpZ24JNQorX2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrczoKKwlzdHAJeDI5LHgzMCxbc3AsIy0xNl0hCisJYWRkCXgyOSxzcCwjMAorCWxkcgl3NSxbeDMsIzI0MF0KKworCWxkcgl3OCwgW3g0LCAjMTJdCisJbGQxCXt2MC40c30sW3g0XQorCisJbGQxCXt2MTYuNHMsdjE3LjRzfSxbeDNdCQkvLyBsb2FkIGtleSBzY2hlZHVsZS4uLgorCXN1Ygl3NSx3NSwjNAorCW1vdgl4MTIsIzE2CisJY21wCXgyLCMyCisJYWRkCXg3LHgzLHg1LGxzbCM0CS8vIHBvaW50ZXIgdG8gbGFzdCA1IHJvdW5kIGtleXMKKwlzdWIJdzUsdzUsIzIKKwlsZDEJe3YyMC40cyx2MjEuNHN9LFt4N10sIzMyCisJbGQxCXt2MjIuNHMsdjIzLjRzfSxbeDddLCMzMgorCWxkMQl7djcuNHN9LFt4N10KKwlhZGQJeDcseDMsIzMyCisJbW92CXc2LHc1CisJY3NlbAl4MTIseHpyLHgxMixsbworI2lmbmRlZiBfX0FSTUVCX18KKwlyZXYJdzgsIHc4CisjZW5kaWYKKwlvcnIJdjEuMTZiLHYwLjE2Yix2MC4xNmIKKwlhZGQJdzEwLCB3OCwgIzEKKwlvcnIJdjE4LjE2Yix2MC4xNmIsdjAuMTZiCisJYWRkCXc4LCB3OCwgIzIKKwlvcnIJdjYuMTZiLHYwLjE2Yix2MC4xNmIKKwlyZXYJdzEwLCB3MTAKKwltb3YJdjEuc1szXSx3MTAKKwliLmxzCUxjdHIzMl90YWlsCisJcmV2CXcxMiwgdzgKKwlzdWIJeDIseDIsIzMJCS8vIGJpYXMKKwltb3YJdjE4LnNbM10sdzEyCisJYglMb29wM3hfY3RyMzIKKworLmFsaWduCTQKK0xvb3AzeF9jdHIzMjoKKwlhZXNlCXYwLjE2Yix2MTYuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJYWVzZQl2MTguMTZiLHYxNi4xNmIKKwlhZXNtYwl2MTguMTZiLHYxOC4xNmIKKwlsZDEJe3YxNi40c30sW3g3XSwjMTYKKwlzdWJzCXc2LHc2LCMyCisJYWVzZQl2MC4xNmIsdjE3LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlhZXNlCXYxLjE2Yix2MTcuMTZiCisJYWVzbWMJdjEuMTZiLHYxLjE2YgorCWFlc2UJdjE4LjE2Yix2MTcuMTZiCisJYWVzbWMJdjE4LjE2Yix2MTguMTZiCisJbGQxCXt2MTcuNHN9LFt4N10sIzE2CisJYi5ndAlMb29wM3hfY3RyMzIKKworCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2NC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjE2LjE2YgorCWFlc21jCXY1LjE2Yix2MS4xNmIKKwlsZDEJe3YyLjE2Yn0sW3gwXSwjMTYKKwlvcnIJdjAuMTZiLHY2LjE2Yix2Ni4xNmIKKwlhZXNlCXYxOC4xNmIsdjE2LjE2YgorCWFlc21jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djMuMTZifSxbeDBdLCMxNgorCW9ycgl2MS4xNmIsdjYuMTZiLHY2LjE2YgorCWFlc2UJdjQuMTZiLHYxNy4xNmIKKwlhZXNtYwl2NC4xNmIsdjQuMTZiCisJYWVzZQl2NS4xNmIsdjE3LjE2YgorCWFlc21jCXY1LjE2Yix2NS4xNmIKKwlsZDEJe3YxOS4xNmJ9LFt4MF0sIzE2CisJbW92CXg3LHgzCisJYWVzZQl2MTguMTZiLHYxNy4xNmIKKwlhZXNtYwl2MTcuMTZiLHYxOC4xNmIKKwlvcnIJdjE4LjE2Yix2Ni4xNmIsdjYuMTZiCisJYWRkCXc5LHc4LCMxCisJYWVzZQl2NC4xNmIsdjIwLjE2YgorCWFlc21jCXY0LjE2Yix2NC4xNmIKKwlhZXNlCXY1LjE2Yix2MjAuMTZiCisJYWVzbWMJdjUuMTZiLHY1LjE2YgorCWVvcgl2Mi4xNmIsdjIuMTZiLHY3LjE2YgorCWFkZAl3MTAsdzgsIzIKKwlhZXNlCXYxNy4xNmIsdjIwLjE2YgorCWFlc21jCXYxNy4xNmIsdjE3LjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHY3LjE2YgorCWFkZAl3OCx3OCwjMworCWFlc2UJdjQuMTZiLHYyMS4xNmIKKwlhZXNtYwl2NC4xNmIsdjQuMTZiCisJYWVzZQl2NS4xNmIsdjIxLjE2YgorCWFlc21jCXY1LjE2Yix2NS4xNmIKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHY3LjE2YgorCXJldgl3OSx3OQorCWFlc2UJdjE3LjE2Yix2MjEuMTZiCisJYWVzbWMJdjE3LjE2Yix2MTcuMTZiCisJbW92CXYwLnNbM10sIHc5CisJcmV2CXcxMCx3MTAKKwlhZXNlCXY0LjE2Yix2MjIuMTZiCisJYWVzbWMJdjQuMTZiLHY0LjE2YgorCWFlc2UJdjUuMTZiLHYyMi4xNmIKKwlhZXNtYwl2NS4xNmIsdjUuMTZiCisJbW92CXYxLnNbM10sIHcxMAorCXJldgl3MTIsdzgKKwlhZXNlCXYxNy4xNmIsdjIyLjE2YgorCWFlc21jCXYxNy4xNmIsdjE3LjE2YgorCW1vdgl2MTguc1szXSwgdzEyCisJc3Vicwl4Mix4MiwjMworCWFlc2UJdjQuMTZiLHYyMy4xNmIKKwlhZXNlCXY1LjE2Yix2MjMuMTZiCisJYWVzZQl2MTcuMTZiLHYyMy4xNmIKKworCWVvcgl2Mi4xNmIsdjIuMTZiLHY0LjE2YgorCWxkMQl7djE2LjRzfSxbeDddLCMxNgkvLyByZS1wcmUtbG9hZCBybmRrZXlbMF0KKwlzdDEJe3YyLjE2Yn0sW3gxXSwjMTYKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwltb3YJdzYsdzUKKwlzdDEJe3YzLjE2Yn0sW3gxXSwjMTYKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxNy4xNmIKKwlsZDEJe3YxNy40c30sW3g3XSwjMTYJLy8gcmUtcHJlLWxvYWQgcm5ka2V5WzFdCisJc3QxCXt2MTkuMTZifSxbeDFdLCMxNgorCWIuaHMJTG9vcDN4X2N0cjMyCisKKwlhZGRzCXgyLHgyLCMzCisJYi5lcQlMY3RyMzJfZG9uZQorCWNtcAl4MiwjMQorCW1vdgl4MTIsIzE2CisJY3NlbAl4MTIseHpyLHgxMixlcQorCitMY3RyMzJfdGFpbDoKKwlhZXNlCXYwLjE2Yix2MTYuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJbGQxCXt2MTYuNHN9LFt4N10sIzE2CisJc3Vicwl3Nix3NiwjMgorCWFlc2UJdjAuMTZiLHYxNy4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjE3LjE2YgorCWFlc21jCXYxLjE2Yix2MS4xNmIKKwlsZDEJe3YxNy40c30sW3g3XSwjMTYKKwliLmd0CUxjdHIzMl90YWlsCisKKwlhZXNlCXYwLjE2Yix2MTYuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJYWVzZQl2MC4xNmIsdjE3LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlhZXNlCXYxLjE2Yix2MTcuMTZiCisJYWVzbWMJdjEuMTZiLHYxLjE2YgorCWxkMQl7djIuMTZifSxbeDBdLHgxMgorCWFlc2UJdjAuMTZiLHYyMC4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjIwLjE2YgorCWFlc21jCXYxLjE2Yix2MS4xNmIKKwlsZDEJe3YzLjE2Yn0sW3gwXQorCWFlc2UJdjAuMTZiLHYyMS4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjIxLjE2YgorCWFlc21jCXYxLjE2Yix2MS4xNmIKKwllb3IJdjIuMTZiLHYyLjE2Yix2Ny4xNmIKKwlhZXNlCXYwLjE2Yix2MjIuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYyMi4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJZW9yCXYzLjE2Yix2My4xNmIsdjcuMTZiCisJYWVzZQl2MC4xNmIsdjIzLjE2YgorCWFlc2UJdjEuMTZiLHYyMy4xNmIKKworCWNtcAl4MiwjMQorCWVvcgl2Mi4xNmIsdjIuMTZiLHYwLjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHYxLjE2YgorCXN0MQl7djIuMTZifSxbeDFdLCMxNgorCWIuZXEJTGN0cjMyX2RvbmUKKwlzdDEJe3YzLjE2Yn0sW3gxXQorCitMY3RyMzJfZG9uZToKKwlsZHIJeDI5LFtzcF0sIzE2CisJcmV0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9hcm12OC1tb250LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL2FybXY4LW1vbnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI2NTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9hcm12OC1tb250LlMKQEAgLTAsMCArMSwxNDA1IEBACisudGV4dAorCisuZ2xvYmwJX2JuX211bF9tb250CisucHJpdmF0ZV9leHRlcm4JX2JuX211bF9tb250CisKKy5hbGlnbgk1CitfYm5fbXVsX21vbnQ6CisJdHN0CXg1LCM3CisJYi5lcQlfX2JuX3Nxcjh4X21vbnQKKwl0c3QJeDUsIzMKKwliLmVxCV9fYm5fbXVsNHhfbW9udAorTG11bF9tb250OgorCXN0cAl4MjkseDMwLFtzcCwjLTY0XSEKKwlhZGQJeDI5LHNwLCMwCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisKKwlsZHIJeDksW3gyXSwjOAkJLy8gYnBbMF0KKwlzdWIJeDIyLHNwLHg1LGxzbCMzCisJbGRwCXg3LHg4LFt4MV0sIzE2CS8vIGFwWzAuLjFdCisJbHNsCXg1LHg1LCMzCisJbGRyCXg0LFt4NF0JCS8vICpuMAorCWFuZAl4MjIseDIyLCMtMTYJCS8vIEFCSSBzYXlzIHNvCisJbGRwCXgxMyx4MTQsW3gzXSwjMTYJLy8gbnBbMC4uMV0KKworCW11bAl4Nix4Nyx4OQkJLy8gYXBbMF0qYnBbMF0KKwlzdWIJeDIxLHg1LCMxNgkJLy8gaj1udW0tMgorCXVtdWxoCXg3LHg3LHg5CisJbXVsCXgxMCx4OCx4OQkJLy8gYXBbMV0qYnBbMF0KKwl1bXVsaAl4MTEseDgseDkKKworCW11bAl4MTUseDYseDQJCS8vICJ0cFswXSIqbjAKKwltb3YJc3AseDIyCQkJLy8gYWxsb2NhCisKKwkvLyAoKikJbXVsCXgxMix4MTMseDE1CS8vIG5wWzBdKm0xCisJdW11bGgJeDEzLHgxMyx4MTUKKwltdWwJeDE2LHgxNCx4MTUJCS8vIG5wWzFdKm0xCisJLy8gKCopCWFkZHMJeDEyLHgxMix4NgkvLyBkaXNjYXJkZWQKKwkvLyAoKikJQXMgZm9yIHJlbW92YWwgb2YgZmlyc3QgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uCisJLy8JaW5zdHJ1Y3Rpb25zLiBUaGUgb3V0Y29tZSBvZiBmaXJzdCBhZGRpdGlvbiBpcworCS8vCWd1YXJhbnRlZWQgdG8gYmUgemVybywgd2hpY2ggbGVhdmVzIHR3byBjb21wdXRhdGlvbmFsbHkKKwkvLwlzaWduaWZpY2FudCBvdXRjb21lczogaXQgZWl0aGVyIGNhcnJpZXMgb3Igbm90LiBUaGVuCisJLy8JcXVlc3Rpb24gaXMgd2hlbiBkb2VzIGl0IGNhcnJ5PyBJcyB0aGVyZSBhbHRlcm5hdGl2ZQorCS8vCXdheSB0byBkZWR1Y2UgaXQ/IElmIHlvdSBmb2xsb3cgb3BlcmF0aW9ucywgeW91IGNhbgorCS8vCW9ic2VydmUgdGhhdCBjb25kaXRpb24gZm9yIGNhcnJ5IGlzIHF1aXRlIHNpbXBsZToKKwkvLwl4NiBiZWluZyBub24temVyby4gU28gdGhhdCBjYXJyeSBjYW4gYmUgY2FsY3VsYXRlZAorCS8vCWJ5IGFkZGluZyAtMSB0byB4Ni4gVGhhdCdzIHdoYXQgbmV4dCBpbnN0cnVjdGlvbiBkb2VzLgorCXN1YnMJeHpyLHg2LCMxCQkvLyAoKikKKwl1bXVsaAl4MTcseDE0LHgxNQorCWFkYwl4MTMseDEzLHh6cgorCWNiegl4MjEsTDFzdF9za2lwCisKK0wxc3Q6CisJbGRyCXg4LFt4MV0sIzgKKwlhZGRzCXg2LHgxMCx4NworCXN1Ygl4MjEseDIxLCM4CQkvLyBqLS0KKwlhZGMJeDcseDExLHh6cgorCisJbGRyCXgxNCxbeDNdLCM4CisJYWRkcwl4MTIseDE2LHgxMworCW11bAl4MTAseDgseDkJCS8vIGFwW2pdKmJwWzBdCisJYWRjCXgxMyx4MTcseHpyCisJdW11bGgJeDExLHg4LHg5CisKKwlhZGRzCXgxMix4MTIseDYKKwltdWwJeDE2LHgxNCx4MTUJCS8vIG5wW2pdKm0xCisJYWRjCXgxMyx4MTMseHpyCisJdW11bGgJeDE3LHgxNCx4MTUKKwlzdHIJeDEyLFt4MjJdLCM4CQkvLyB0cFtqLTFdCisJY2Juegl4MjEsTDFzdAorCitMMXN0X3NraXA6CisJYWRkcwl4Nix4MTAseDcKKwlzdWIJeDEseDEseDUJCS8vIHJld2luZCB4MQorCWFkYwl4Nyx4MTEseHpyCisKKwlhZGRzCXgxMix4MTYseDEzCisJc3ViCXgzLHgzLHg1CQkvLyByZXdpbmQgeDMKKwlhZGMJeDEzLHgxNyx4enIKKworCWFkZHMJeDEyLHgxMix4NgorCXN1Ygl4MjAseDUsIzgJCS8vIGk9bnVtLTEKKwlhZGNzCXgxMyx4MTMseDcKKworCWFkYwl4MTkseHpyLHh6cgkJLy8gdXBtb3N0IG92ZXJmbG93IGJpdAorCXN0cAl4MTIseDEzLFt4MjJdCisKK0xvdXRlcjoKKwlsZHIJeDksW3gyXSwjOAkJLy8gYnBbaV0KKwlsZHAJeDcseDgsW3gxXSwjMTYKKwlsZHIJeDIzLFtzcF0JCS8vIHRwWzBdCisJYWRkCXgyMixzcCwjOAorCisJbXVsCXg2LHg3LHg5CQkvLyBhcFswXSpicFtpXQorCXN1Ygl4MjEseDUsIzE2CQkvLyBqPW51bS0yCisJdW11bGgJeDcseDcseDkKKwlsZHAJeDEzLHgxNCxbeDNdLCMxNgorCW11bAl4MTAseDgseDkJCS8vIGFwWzFdKmJwW2ldCisJYWRkcwl4Nix4Nix4MjMKKwl1bXVsaAl4MTEseDgseDkKKwlhZGMJeDcseDcseHpyCisKKwltdWwJeDE1LHg2LHg0CisJc3ViCXgyMCx4MjAsIzgJCS8vIGktLQorCisJLy8gKCopCW11bAl4MTIseDEzLHgxNQkvLyBucFswXSptMQorCXVtdWxoCXgxMyx4MTMseDE1CisJbXVsCXgxNix4MTQseDE1CQkvLyBucFsxXSptMQorCS8vICgqKQlhZGRzCXgxMix4MTIseDYKKwlzdWJzCXh6cix4NiwjMQkJLy8gKCopCisJdW11bGgJeDE3LHgxNCx4MTUKKwljYnoJeDIxLExpbm5lcl9za2lwCisKK0xpbm5lcjoKKwlsZHIJeDgsW3gxXSwjOAorCWFkYwl4MTMseDEzLHh6cgorCWxkcgl4MjMsW3gyMl0sIzgJCS8vIHRwW2pdCisJYWRkcwl4Nix4MTAseDcKKwlzdWIJeDIxLHgyMSwjOAkJLy8gai0tCisJYWRjCXg3LHgxMSx4enIKKworCWFkZHMJeDEyLHgxNix4MTMKKwlsZHIJeDE0LFt4M10sIzgKKwlhZGMJeDEzLHgxNyx4enIKKworCW11bAl4MTAseDgseDkJCS8vIGFwW2pdKmJwW2ldCisJYWRkcwl4Nix4Nix4MjMKKwl1bXVsaAl4MTEseDgseDkKKwlhZGMJeDcseDcseHpyCisKKwltdWwJeDE2LHgxNCx4MTUJCS8vIG5wW2pdKm0xCisJYWRkcwl4MTIseDEyLHg2CisJdW11bGgJeDE3LHgxNCx4MTUKKwlzdHIJeDEyLFt4MjIsIy0xNl0JCS8vIHRwW2otMV0KKwljYm56CXgyMSxMaW5uZXIKKworTGlubmVyX3NraXA6CisJbGRyCXgyMyxbeDIyXSwjOAkJLy8gdHBbal0KKwlhZGMJeDEzLHgxMyx4enIKKwlhZGRzCXg2LHgxMCx4NworCXN1Ygl4MSx4MSx4NQkJLy8gcmV3aW5kIHgxCisJYWRjCXg3LHgxMSx4enIKKworCWFkZHMJeDEyLHgxNix4MTMKKwlzdWIJeDMseDMseDUJCS8vIHJld2luZCB4MworCWFkY3MJeDEzLHgxNyx4MTkKKwlhZGMJeDE5LHh6cix4enIKKworCWFkZHMJeDYseDYseDIzCisJYWRjCXg3LHg3LHh6cgorCisJYWRkcwl4MTIseDEyLHg2CisJYWRjcwl4MTMseDEzLHg3CisJYWRjCXgxOSx4MTkseHpyCQkvLyB1cG1vc3Qgb3ZlcmZsb3cgYml0CisJc3RwCXgxMix4MTMsW3gyMiwjLTE2XQorCisJY2Juegl4MjAsTG91dGVyCisKKwkvLyBGaW5hbCBzdGVwLiBXZSBzZWUgaWYgcmVzdWx0IGlzIGxhcmdlciB0aGFuIG1vZHVsdXMsIGFuZAorCS8vIGlmIGl0IGlzLCBzdWJ0cmFjdCB0aGUgbW9kdWx1cy4gQnV0IGNvbXBhcmlzb24gaW1wbGllcworCS8vIHN1YnRyYWN0aW9uLiBTbyB3ZSBzdWJ0cmFjdCBtb2R1bHVzLCBzZWUgaWYgaXQgYm9ycm93ZWQsCisJLy8gYW5kIGNvbmRpdGlvbmFsbHkgY29weSBvcmlnaW5hbCB2YWx1ZS4KKwlsZHIJeDIzLFtzcF0JCS8vIHRwWzBdCisJYWRkCXgyMixzcCwjOAorCWxkcgl4MTQsW3gzXSwjOAkJLy8gbnBbMF0KKwlzdWJzCXgyMSx4NSwjOAkJLy8gaj1udW0tMSBhbmQgY2xlYXIgYm9ycm93CisJbW92CXgxLHgwCitMc3ViOgorCXNiY3MJeDgseDIzLHgxNAkJLy8gdHBbal0tbnBbal0KKwlsZHIJeDIzLFt4MjJdLCM4CisJc3ViCXgyMSx4MjEsIzgJCS8vIGotLQorCWxkcgl4MTQsW3gzXSwjOAorCXN0cgl4OCxbeDFdLCM4CQkvLyBycFtqXT10cFtqXS1ucFtqXQorCWNibnoJeDIxLExzdWIKKworCXNiY3MJeDgseDIzLHgxNAorCXNiY3MJeDE5LHgxOSx4enIJCS8vIGRpZCBpdCBib3Jyb3c/CisJc3RyCXg4LFt4MV0sIzgJCS8vIHJwW251bS0xXQorCisJbGRyCXgyMyxbc3BdCQkvLyB0cFswXQorCWFkZAl4MjIsc3AsIzgKKwlsZHIJeDgsW3gwXSwjOAkJLy8gcnBbMF0KKwlzdWIJeDUseDUsIzgJCS8vIG51bS0tCisJbm9wCitMY29uZF9jb3B5OgorCXN1Ygl4NSx4NSwjOAkJLy8gbnVtLS0KKwljc2VsCXgxNCx4MjMseDgsbG8JCS8vIGRpZCBpdCBib3Jyb3c/CisJbGRyCXgyMyxbeDIyXSwjOAorCWxkcgl4OCxbeDBdLCM4CisJc3RyCXh6cixbeDIyLCMtMTZdCQkvLyB3aXBlIHRwCisJc3RyCXgxNCxbeDAsIy0xNl0KKwljYm56CXg1LExjb25kX2NvcHkKKworCWNzZWwJeDE0LHgyMyx4OCxsbworCXN0cgl4enIsW3gyMiwjLThdCQkvLyB3aXBlIHRwCisJc3RyCXgxNCxbeDAsIy04XQorCisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJbW92CXNwLHgyOQorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCW1vdgl4MCwjMQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcgl4MjksW3NwXSwjNjQKKwlyZXQKKworCisuYWxpZ24JNQorX19ibl9zcXI4eF9tb250OgorCWNtcAl4MSx4MgorCWIubmUJX19ibl9tdWw0eF9tb250CitMc3FyOHhfbW9udDoKKwlzdHAJeDI5LHgzMCxbc3AsIy0xMjhdIQorCWFkZAl4Mjksc3AsIzAKKwlzdHAJeDE5LHgyMCxbc3AsIzE2XQorCXN0cAl4MjEseDIyLFtzcCwjMzJdCisJc3RwCXgyMyx4MjQsW3NwLCM0OF0KKwlzdHAJeDI1LHgyNixbc3AsIzY0XQorCXN0cAl4MjcseDI4LFtzcCwjODBdCisJc3RwCXgwLHgzLFtzcCwjOTZdCS8vIG9mZmxvYWQgcnAgYW5kIG5wCisKKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWxkcAl4MTAseDExLFt4MSwjOCo0XQorCWxkcAl4MTIseDEzLFt4MSwjOCo2XQorCisJc3ViCXgyLHNwLHg1LGxzbCM0CisJbHNsCXg1LHg1LCMzCisJbGRyCXg0LFt4NF0JCS8vICpuMAorCW1vdglzcCx4MgkJCS8vIGFsbG9jYQorCXN1Ygl4MjcseDUsIzgqOAorCWIJTHNxcjh4X3plcm9fc3RhcnQKKworTHNxcjh4X3plcm86CisJc3ViCXgyNyx4MjcsIzgqOAorCXN0cAl4enIseHpyLFt4MiwjOCowXQorCXN0cAl4enIseHpyLFt4MiwjOCoyXQorCXN0cAl4enIseHpyLFt4MiwjOCo0XQorCXN0cAl4enIseHpyLFt4MiwjOCo2XQorTHNxcjh4X3plcm9fc3RhcnQ6CisJc3RwCXh6cix4enIsW3gyLCM4KjhdCisJc3RwCXh6cix4enIsW3gyLCM4KjEwXQorCXN0cAl4enIseHpyLFt4MiwjOCoxMl0KKwlzdHAJeHpyLHh6cixbeDIsIzgqMTRdCisJYWRkCXgyLHgyLCM4KjE2CisJY2Juegl4MjcsTHNxcjh4X3plcm8KKworCWFkZAl4Myx4MSx4NQorCWFkZAl4MSx4MSwjOCo4CisJbW92CXgxOSx4enIKKwltb3YJeDIwLHh6cgorCW1vdgl4MjEseHpyCisJbW92CXgyMix4enIKKwltb3YJeDIzLHh6cgorCW1vdgl4MjQseHpyCisJbW92CXgyNSx4enIKKwltb3YJeDI2LHh6cgorCW1vdgl4MixzcAorCXN0cgl4NCxbeDI5LCMxMTJdCQkvLyBvZmZsb2FkIG4wCisKKwkvLyBNdWx0aXBseSBldmVyeXRoaW5nIGJ1dCBhW2ldKmFbaV0KKy5hbGlnbgk0CitMc3FyOHhfb3V0ZXJfbG9vcDoKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsxXWFbMF0JKGkpCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsyXWFbMF0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbM11hWzBdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNF1hWzBdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbMF0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNl1hWzBdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGFbN11hWzBdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzJdYVsxXQkJKGlpKQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzNdYVsxXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNF1hWzFdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzVdYVsxXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBhWzZdYVsxXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGFbN11hWzFdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVszXWFbMl0JCQkoaWlpKQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs0XWFbMl0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbMl0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBhWzZdYVsyXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgYVs3XWFbMl0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgYVs0XWFbM10JCQkJKGl2KQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGFbNV1hWzNdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICBhWzZdYVszXQorICAgICAgICAvLyAgICAgICAgICAgICBhWzddYVszXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgYVs1XWFbNF0JCQkJCSh2KQorICAgICAgICAvLyAgICAgICAgICAgICBhWzZdYVs0XQorICAgICAgICAvLyAgICAgICAgIGFbN11hWzRdCisgICAgICAgIC8vICAgICAgICAgYVs2XWFbNV0JCQkJCQkodmkpCisgICAgICAgIC8vICAgICBhWzddYVs1XQorICAgICAgICAvLyBhWzddYVs2XQkJCQkJCQkodmlpKQorCisJbXVsCXgxNCx4Nyx4NgkJLy8gbG8oYVsxLi43XSphWzBdKQkJKGkpCisJbXVsCXgxNSx4OCx4NgorCW11bAl4MTYseDkseDYKKwltdWwJeDE3LHgxMCx4NgorCWFkZHMJeDIwLHgyMCx4MTQJCS8vIHRbMV0rbG8oYVsxXSphWzBdKQorCW11bAl4MTQseDExLHg2CisJYWRjcwl4MjEseDIxLHgxNQorCW11bAl4MTUseDEyLHg2CisJYWRjcwl4MjIseDIyLHgxNgorCW11bAl4MTYseDEzLHg2CisJYWRjcwl4MjMseDIzLHgxNworCXVtdWxoCXgxNyx4Nyx4NgkJLy8gaGkoYVsxLi43XSphWzBdKQorCWFkY3MJeDI0LHgyNCx4MTQKKwl1bXVsaAl4MTQseDgseDYKKwlhZGNzCXgyNSx4MjUseDE1CisJdW11bGgJeDE1LHg5LHg2CisJYWRjcwl4MjYseDI2LHgxNgorCXVtdWxoCXgxNix4MTAseDYKKwlzdHAJeDE5LHgyMCxbeDJdLCM4KjIJLy8gdFswLi4xXQorCWFkYwl4MTkseHpyLHh6cgkJLy8gdFs4XQorCWFkZHMJeDIxLHgyMSx4MTcJCS8vIHRbMl0rbG8oYVsxXSphWzBdKQorCXVtdWxoCXgxNyx4MTEseDYKKwlhZGNzCXgyMix4MjIseDE0CisJdW11bGgJeDE0LHgxMix4NgorCWFkY3MJeDIzLHgyMyx4MTUKKwl1bXVsaAl4MTUseDEzLHg2CisJYWRjcwl4MjQseDI0LHgxNgorCW11bAl4MTYseDgseDcJCS8vIGxvKGFbMi4uN10qYVsxXSkJCShpaSkKKwlhZGNzCXgyNSx4MjUseDE3CisJbXVsCXgxNyx4OSx4NworCWFkY3MJeDI2LHgyNix4MTQKKwltdWwJeDE0LHgxMCx4NworCWFkYwl4MTkseDE5LHgxNQorCisJbXVsCXgxNSx4MTEseDcKKwlhZGRzCXgyMix4MjIseDE2CisJbXVsCXgxNix4MTIseDcKKwlhZGNzCXgyMyx4MjMseDE3CisJbXVsCXgxNyx4MTMseDcKKwlhZGNzCXgyNCx4MjQseDE0CisJdW11bGgJeDE0LHg4LHg3CQkvLyBoaShhWzIuLjddKmFbMV0pCisJYWRjcwl4MjUseDI1LHgxNQorCXVtdWxoCXgxNSx4OSx4NworCWFkY3MJeDI2LHgyNix4MTYKKwl1bXVsaAl4MTYseDEwLHg3CisJYWRjcwl4MTkseDE5LHgxNworCXVtdWxoCXgxNyx4MTEseDcKKwlzdHAJeDIxLHgyMixbeDJdLCM4KjIJLy8gdFsyLi4zXQorCWFkYwl4MjAseHpyLHh6cgkJLy8gdFs5XQorCWFkZHMJeDIzLHgyMyx4MTQKKwl1bXVsaAl4MTQseDEyLHg3CisJYWRjcwl4MjQseDI0LHgxNQorCXVtdWxoCXgxNSx4MTMseDcKKwlhZGNzCXgyNSx4MjUseDE2CisJbXVsCXgxNix4OSx4OAkJLy8gbG8oYVszLi43XSphWzJdKQkJKGlpaSkKKwlhZGNzCXgyNix4MjYseDE3CisJbXVsCXgxNyx4MTAseDgKKwlhZGNzCXgxOSx4MTkseDE0CisJbXVsCXgxNCx4MTEseDgKKwlhZGMJeDIwLHgyMCx4MTUKKworCW11bAl4MTUseDEyLHg4CisJYWRkcwl4MjQseDI0LHgxNgorCW11bAl4MTYseDEzLHg4CisJYWRjcwl4MjUseDI1LHgxNworCXVtdWxoCXgxNyx4OSx4OAkJLy8gaGkoYVszLi43XSphWzJdKQorCWFkY3MJeDI2LHgyNix4MTQKKwl1bXVsaAl4MTQseDEwLHg4CisJYWRjcwl4MTkseDE5LHgxNQorCXVtdWxoCXgxNSx4MTEseDgKKwlhZGNzCXgyMCx4MjAseDE2CisJdW11bGgJeDE2LHgxMix4OAorCXN0cAl4MjMseDI0LFt4Ml0sIzgqMgkvLyB0WzQuLjVdCisJYWRjCXgyMSx4enIseHpyCQkvLyB0WzEwXQorCWFkZHMJeDI1LHgyNSx4MTcKKwl1bXVsaAl4MTcseDEzLHg4CisJYWRjcwl4MjYseDI2LHgxNAorCW11bAl4MTQseDEwLHg5CQkvLyBsbyhhWzQuLjddKmFbM10pCQkoaXYpCisJYWRjcwl4MTkseDE5LHgxNQorCW11bAl4MTUseDExLHg5CisJYWRjcwl4MjAseDIwLHgxNgorCW11bAl4MTYseDEyLHg5CisJYWRjCXgyMSx4MjEseDE3CisKKwltdWwJeDE3LHgxMyx4OQorCWFkZHMJeDI2LHgyNix4MTQKKwl1bXVsaAl4MTQseDEwLHg5CQkvLyBoaShhWzQuLjddKmFbM10pCisJYWRjcwl4MTkseDE5LHgxNQorCXVtdWxoCXgxNSx4MTEseDkKKwlhZGNzCXgyMCx4MjAseDE2CisJdW11bGgJeDE2LHgxMix4OQorCWFkY3MJeDIxLHgyMSx4MTcKKwl1bXVsaAl4MTcseDEzLHg5CisJc3RwCXgyNSx4MjYsW3gyXSwjOCoyCS8vIHRbNi4uN10KKwlhZGMJeDIyLHh6cix4enIJCS8vIHRbMTFdCisJYWRkcwl4MTkseDE5LHgxNAorCW11bAl4MTQseDExLHgxMAkJLy8gbG8oYVs1Li43XSphWzRdKQkJKHYpCisJYWRjcwl4MjAseDIwLHgxNQorCW11bAl4MTUseDEyLHgxMAorCWFkY3MJeDIxLHgyMSx4MTYKKwltdWwJeDE2LHgxMyx4MTAKKwlhZGMJeDIyLHgyMix4MTcKKworCXVtdWxoCXgxNyx4MTEseDEwCQkvLyBoaShhWzUuLjddKmFbNF0pCisJYWRkcwl4MjAseDIwLHgxNAorCXVtdWxoCXgxNCx4MTIseDEwCisJYWRjcwl4MjEseDIxLHgxNQorCXVtdWxoCXgxNSx4MTMseDEwCisJYWRjcwl4MjIseDIyLHgxNgorCW11bAl4MTYseDEyLHgxMQkJLy8gbG8oYVs2Li43XSphWzVdKQkJKHZpKQorCWFkYwl4MjMseHpyLHh6cgkJLy8gdFsxMl0KKwlhZGRzCXgyMSx4MjEseDE3CisJbXVsCXgxNyx4MTMseDExCisJYWRjcwl4MjIseDIyLHgxNAorCXVtdWxoCXgxNCx4MTIseDExCQkvLyBoaShhWzYuLjddKmFbNV0pCisJYWRjCXgyMyx4MjMseDE1CisKKwl1bXVsaAl4MTUseDEzLHgxMQorCWFkZHMJeDIyLHgyMix4MTYKKwltdWwJeDE2LHgxMyx4MTIJCS8vIGxvKGFbN10qYVs2XSkJCSh2aWkpCisJYWRjcwl4MjMseDIzLHgxNworCXVtdWxoCXgxNyx4MTMseDEyCQkvLyBoaShhWzddKmFbNl0pCisJYWRjCXgyNCx4enIseHpyCQkvLyB0WzEzXQorCWFkZHMJeDIzLHgyMyx4MTQKKwlzdWIJeDI3LHgzLHgxCS8vIGRvbmUgeWV0PworCWFkYwl4MjQseDI0LHgxNQorCisJYWRkcwl4MjQseDI0LHgxNgorCXN1Ygl4MTQseDMseDUJLy8gcmV3aW5kZWQgYXAKKwlhZGMJeDI1LHh6cix4enIJCS8vIHRbMTRdCisJYWRkCXgyNSx4MjUseDE3CisKKwljYnoJeDI3LExzcXI4eF9vdXRlcl9icmVhaworCisJbW92CXg0LHg2CisJbGRwCXg2LHg3LFt4MiwjOCowXQorCWxkcAl4OCx4OSxbeDIsIzgqMl0KKwlsZHAJeDEwLHgxMSxbeDIsIzgqNF0KKwlsZHAJeDEyLHgxMyxbeDIsIzgqNl0KKwlhZGRzCXgxOSx4MTkseDYKKwlhZGNzCXgyMCx4MjAseDcKKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJYWRjcwl4MjEseDIxLHg4CisJYWRjcwl4MjIseDIyLHg5CisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWFkY3MJeDIzLHgyMyx4MTAKKwlhZGNzCXgyNCx4MjQseDExCisJbGRwCXgxMCx4MTEsW3gxLCM4KjRdCisJYWRjcwl4MjUseDI1LHgxMgorCW1vdgl4MCx4MQorCWFkY3MJeDI2LHh6cix4MTMKKwlsZHAJeDEyLHgxMyxbeDEsIzgqNl0KKwlhZGQJeDEseDEsIzgqOAorCS8vYWRjCXgyOCx4enIseHpyCQkvLyBtb3ZlZCBiZWxvdworCW1vdgl4MjcsIy04KjgKKworCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbMF0KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs5XWFbMF0KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2FdYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtiXWFbMF0KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtjXWFbMF0KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2RdYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtlXWFbMF0KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtmXWFbMF0KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbMV0KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICBhW2ZdYVsxXS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbOF1hWzJdCisJLy8gICAgICAgICAgICAgICAgICAgICBhW2ZdYVsyXS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbM10KKwkvLyAgICAgICAgICAgICAgICAgYVtmXWFbM10uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbNF0KKwkvLyAgICAgICAgICAgICBhW2ZdYVs0XS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbOF1hWzVdCisJLy8gICAgICAgICBhW2ZdYVs1XS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbNl0KKwkvLyAgICAgYVtmXWFbNl0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbN10KKwkvLyBhW2ZdYVs3XS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorTHNxcjh4X211bDoKKwltdWwJeDE0LHg2LHg0CisJYWRjCXgyOCx4enIseHpyCQkvLyBjYXJyeSBiaXQsIG1vZHVsby1zY2hlZHVsZWQKKwltdWwJeDE1LHg3LHg0CisJYWRkCXgyNyx4MjcsIzgKKwltdWwJeDE2LHg4LHg0CisJbXVsCXgxNyx4OSx4NAorCWFkZHMJeDE5LHgxOSx4MTQKKwltdWwJeDE0LHgxMCx4NAorCWFkY3MJeDIwLHgyMCx4MTUKKwltdWwJeDE1LHgxMSx4NAorCWFkY3MJeDIxLHgyMSx4MTYKKwltdWwJeDE2LHgxMix4NAorCWFkY3MJeDIyLHgyMix4MTcKKwltdWwJeDE3LHgxMyx4NAorCWFkY3MJeDIzLHgyMyx4MTQKKwl1bXVsaAl4MTQseDYseDQKKwlhZGNzCXgyNCx4MjQseDE1CisJdW11bGgJeDE1LHg3LHg0CisJYWRjcwl4MjUseDI1LHgxNgorCXVtdWxoCXgxNix4OCx4NAorCWFkY3MJeDI2LHgyNix4MTcKKwl1bXVsaAl4MTcseDkseDQKKwlhZGMJeDI4LHgyOCx4enIKKwlzdHIJeDE5LFt4Ml0sIzgKKwlhZGRzCXgxOSx4MjAseDE0CisJdW11bGgJeDE0LHgxMCx4NAorCWFkY3MJeDIwLHgyMSx4MTUKKwl1bXVsaAl4MTUseDExLHg0CisJYWRjcwl4MjEseDIyLHgxNgorCXVtdWxoCXgxNix4MTIseDQKKwlhZGNzCXgyMix4MjMseDE3CisJdW11bGgJeDE3LHgxMyx4NAorCWxkcgl4NCxbeDAseDI3XQorCWFkY3MJeDIzLHgyNCx4MTQKKwlhZGNzCXgyNCx4MjUseDE1CisJYWRjcwl4MjUseDI2LHgxNgorCWFkY3MJeDI2LHgyOCx4MTcKKwkvL2FkYwl4MjgseHpyLHh6cgkJLy8gbW92ZWQgYWJvdmUKKwljYm56CXgyNyxMc3FyOHhfbXVsCisJCQkJCS8vIG5vdGUgdGhhdCBjYXJyeSBmbGFnIGlzIGd1YXJhbnRlZWQKKwkJCQkJLy8gdG8gYmUgemVybyBhdCB0aGlzIHBvaW50CisJY21wCXgxLHgzCQkvLyBkb25lIHlldD8KKwliLmVxCUxzcXI4eF9icmVhaworCisJbGRwCXg2LHg3LFt4MiwjOCowXQorCWxkcAl4OCx4OSxbeDIsIzgqMl0KKwlsZHAJeDEwLHgxMSxbeDIsIzgqNF0KKwlsZHAJeDEyLHgxMyxbeDIsIzgqNl0KKwlhZGRzCXgxOSx4MTkseDYKKwlsZHIJeDQsW3gwLCMtOCo4XQorCWFkY3MJeDIwLHgyMCx4NworCWxkcAl4Nix4NyxbeDEsIzgqMF0KKwlhZGNzCXgyMSx4MjEseDgKKwlhZGNzCXgyMix4MjIseDkKKwlsZHAJeDgseDksW3gxLCM4KjJdCisJYWRjcwl4MjMseDIzLHgxMAorCWFkY3MJeDI0LHgyNCx4MTEKKwlsZHAJeDEwLHgxMSxbeDEsIzgqNF0KKwlhZGNzCXgyNSx4MjUseDEyCisJbW92CXgyNywjLTgqOAorCWFkY3MJeDI2LHgyNix4MTMKKwlsZHAJeDEyLHgxMyxbeDEsIzgqNl0KKwlhZGQJeDEseDEsIzgqOAorCS8vYWRjCXgyOCx4enIseHpyCQkvLyBtb3ZlZCBhYm92ZQorCWIJTHNxcjh4X211bAorCisuYWxpZ24JNAorTHNxcjh4X2JyZWFrOgorCWxkcAl4Nix4NyxbeDAsIzgqMF0KKwlhZGQJeDEseDAsIzgqOAorCWxkcAl4OCx4OSxbeDAsIzgqMl0KKwlzdWIJeDE0LHgzLHgxCQkvLyBpcyBpdCBsYXN0IGl0ZXJhdGlvbj8KKwlsZHAJeDEwLHgxMSxbeDAsIzgqNF0KKwlzdWIJeDE1LHgyLHgxNAorCWxkcAl4MTIseDEzLFt4MCwjOCo2XQorCWNiegl4MTQsTHNxcjh4X291dGVyX2xvb3AKKworCXN0cAl4MTkseDIwLFt4MiwjOCowXQorCWxkcAl4MTkseDIwLFt4MTUsIzgqMF0KKwlzdHAJeDIxLHgyMixbeDIsIzgqMl0KKwlsZHAJeDIxLHgyMixbeDE1LCM4KjJdCisJc3RwCXgyMyx4MjQsW3gyLCM4KjRdCisJbGRwCXgyMyx4MjQsW3gxNSwjOCo0XQorCXN0cAl4MjUseDI2LFt4MiwjOCo2XQorCW1vdgl4Mix4MTUKKwlsZHAJeDI1LHgyNixbeDE1LCM4KjZdCisJYglMc3FyOHhfb3V0ZXJfbG9vcAorCisuYWxpZ24JNAorTHNxcjh4X291dGVyX2JyZWFrOgorCS8vIE5vdyBtdWx0aXBseSBhYm92ZSByZXN1bHQgYnkgMiBhbmQgYWRkIGFbbi0xXSphW24tMV18Li4ufGFbMF0qYVswXQorCWxkcAl4Nyx4OSxbeDE0LCM4KjBdCS8vIHJlY2FsbCB0aGF0IHgxNCBpcyAmYVswXQorCWxkcAl4MTUseDE2LFtzcCwjOCoxXQorCWxkcAl4MTEseDEzLFt4MTQsIzgqMl0KKwlhZGQJeDEseDE0LCM4KjQKKwlsZHAJeDE3LHgxNCxbc3AsIzgqM10KKworCXN0cAl4MTkseDIwLFt4MiwjOCowXQorCW11bAl4MTkseDcseDcKKwlzdHAJeDIxLHgyMixbeDIsIzgqMl0KKwl1bXVsaAl4Nyx4Nyx4NworCXN0cAl4MjMseDI0LFt4MiwjOCo0XQorCW11bAl4OCx4OSx4OQorCXN0cAl4MjUseDI2LFt4MiwjOCo2XQorCW1vdgl4MixzcAorCXVtdWxoCXg5LHg5LHg5CisJYWRkcwl4MjAseDcseDE1LGxzbCMxCisJZXh0cgl4MTUseDE2LHgxNSwjNjMKKwlzdWIJeDI3LHg1LCM4KjQKKworTHNxcjR4X3NoaWZ0X25fYWRkOgorCWFkY3MJeDIxLHg4LHgxNQorCWV4dHIJeDE2LHgxNyx4MTYsIzYzCisJc3ViCXgyNyx4MjcsIzgqNAorCWFkY3MJeDIyLHg5LHgxNgorCWxkcAl4MTUseDE2LFt4MiwjOCo1XQorCW11bAl4MTAseDExLHgxMQorCWxkcAl4Nyx4OSxbeDFdLCM4KjIKKwl1bXVsaAl4MTEseDExLHgxMQorCW11bAl4MTIseDEzLHgxMworCXVtdWxoCXgxMyx4MTMseDEzCisJZXh0cgl4MTcseDE0LHgxNywjNjMKKwlzdHAJeDE5LHgyMCxbeDIsIzgqMF0KKwlhZGNzCXgyMyx4MTAseDE3CisJZXh0cgl4MTQseDE1LHgxNCwjNjMKKwlzdHAJeDIxLHgyMixbeDIsIzgqMl0KKwlhZGNzCXgyNCx4MTEseDE0CisJbGRwCXgxNyx4MTQsW3gyLCM4KjddCisJZXh0cgl4MTUseDE2LHgxNSwjNjMKKwlhZGNzCXgyNSx4MTIseDE1CisJZXh0cgl4MTYseDE3LHgxNiwjNjMKKwlhZGNzCXgyNix4MTMseDE2CisJbGRwCXgxNSx4MTYsW3gyLCM4KjldCisJbXVsCXg2LHg3LHg3CisJbGRwCXgxMSx4MTMsW3gxXSwjOCoyCisJdW11bGgJeDcseDcseDcKKwltdWwJeDgseDkseDkKKwl1bXVsaAl4OSx4OSx4OQorCXN0cAl4MjMseDI0LFt4MiwjOCo0XQorCWV4dHIJeDE3LHgxNCx4MTcsIzYzCisJc3RwCXgyNSx4MjYsW3gyLCM4KjZdCisJYWRkCXgyLHgyLCM4KjgKKwlhZGNzCXgxOSx4Nix4MTcKKwlleHRyCXgxNCx4MTUseDE0LCM2MworCWFkY3MJeDIwLHg3LHgxNAorCWxkcAl4MTcseDE0LFt4MiwjOCozXQorCWV4dHIJeDE1LHgxNix4MTUsIzYzCisJY2Juegl4MjcsTHNxcjR4X3NoaWZ0X25fYWRkCisJbGRwCXgxLHg0LFt4MjksIzEwNF0JLy8gcHVsbCBucCBhbmQgbjAKKworCWFkY3MJeDIxLHg4LHgxNQorCWV4dHIJeDE2LHgxNyx4MTYsIzYzCisJYWRjcwl4MjIseDkseDE2CisJbGRwCXgxNSx4MTYsW3gyLCM4KjVdCisJbXVsCXgxMCx4MTEseDExCisJdW11bGgJeDExLHgxMSx4MTEKKwlzdHAJeDE5LHgyMCxbeDIsIzgqMF0KKwltdWwJeDEyLHgxMyx4MTMKKwl1bXVsaAl4MTMseDEzLHgxMworCXN0cAl4MjEseDIyLFt4MiwjOCoyXQorCWV4dHIJeDE3LHgxNCx4MTcsIzYzCisJYWRjcwl4MjMseDEwLHgxNworCWV4dHIJeDE0LHgxNSx4MTQsIzYzCisJbGRwCXgxOSx4MjAsW3NwLCM4KjBdCisJYWRjcwl4MjQseDExLHgxNAorCWV4dHIJeDE1LHgxNix4MTUsIzYzCisJbGRwCXg2LHg3LFt4MSwjOCowXQorCWFkY3MJeDI1LHgxMix4MTUKKwlleHRyCXgxNix4enIseDE2LCM2MworCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlhZGMJeDI2LHgxMyx4MTYKKwlsZHAJeDEwLHgxMSxbeDEsIzgqNF0KKworCS8vIFJlZHVjZSBieSA1MTIgYml0cyBwZXIgaXRlcmF0aW9uCisJbXVsCXgyOCx4NCx4MTkJCS8vIHRbMF0qbjAKKwlsZHAJeDEyLHgxMyxbeDEsIzgqNl0KKwlhZGQJeDMseDEseDUKKwlsZHAJeDIxLHgyMixbc3AsIzgqMl0KKwlzdHAJeDIzLHgyNCxbeDIsIzgqNF0KKwlsZHAJeDIzLHgyNCxbc3AsIzgqNF0KKwlzdHAJeDI1LHgyNixbeDIsIzgqNl0KKwlsZHAJeDI1LHgyNixbc3AsIzgqNl0KKwlhZGQJeDEseDEsIzgqOAorCW1vdgl4MzAseHpyCQkvLyBpbml0aWFsIHRvcC1tb3N0IGNhcnJ5CisJbW92CXgyLHNwCisJbW92CXgyNywjOAorCitMc3FyOHhfcmVkdWN0aW9uOgorCS8vICgqKQltdWwJeDE0LHg2LHgyOAkvLyBsbyhuWzAtN10pKmxvKHRbMF0qbjApCisJbXVsCXgxNSx4Nyx4MjgKKwlzdWIJeDI3LHgyNywjMQorCW11bAl4MTYseDgseDI4CisJc3RyCXgyOCxbeDJdLCM4CQkvLyBwdXQgYXNpZGUgdFswXSpuMCBmb3IgdGFpbCBwcm9jZXNzaW5nCisJbXVsCXgxNyx4OSx4MjgKKwkvLyAoKikJYWRkcwl4enIseDE5LHgxNAorCXN1YnMJeHpyLHgxOSwjMQkJLy8gKCopCisJbXVsCXgxNCx4MTAseDI4CisJYWRjcwl4MTkseDIwLHgxNQorCW11bAl4MTUseDExLHgyOAorCWFkY3MJeDIwLHgyMSx4MTYKKwltdWwJeDE2LHgxMix4MjgKKwlhZGNzCXgyMSx4MjIseDE3CisJbXVsCXgxNyx4MTMseDI4CisJYWRjcwl4MjIseDIzLHgxNAorCXVtdWxoCXgxNCx4Nix4MjgJCS8vIGhpKG5bMC03XSkqbG8odFswXSpuMCkKKwlhZGNzCXgyMyx4MjQseDE1CisJdW11bGgJeDE1LHg3LHgyOAorCWFkY3MJeDI0LHgyNSx4MTYKKwl1bXVsaAl4MTYseDgseDI4CisJYWRjcwl4MjUseDI2LHgxNworCXVtdWxoCXgxNyx4OSx4MjgKKwlhZGMJeDI2LHh6cix4enIKKwlhZGRzCXgxOSx4MTkseDE0CisJdW11bGgJeDE0LHgxMCx4MjgKKwlhZGNzCXgyMCx4MjAseDE1CisJdW11bGgJeDE1LHgxMSx4MjgKKwlhZGNzCXgyMSx4MjEseDE2CisJdW11bGgJeDE2LHgxMix4MjgKKwlhZGNzCXgyMix4MjIseDE3CisJdW11bGgJeDE3LHgxMyx4MjgKKwltdWwJeDI4LHg0LHgxOQkJLy8gbmV4dCB0WzBdKm4wCisJYWRjcwl4MjMseDIzLHgxNAorCWFkY3MJeDI0LHgyNCx4MTUKKwlhZGNzCXgyNSx4MjUseDE2CisJYWRjCXgyNix4MjYseDE3CisJY2Juegl4MjcsTHNxcjh4X3JlZHVjdGlvbgorCisJbGRwCXgxNCx4MTUsW3gyLCM4KjBdCisJbGRwCXgxNix4MTcsW3gyLCM4KjJdCisJbW92CXgwLHgyCisJc3ViCXgyNyx4Myx4MQkvLyBkb25lIHlldD8KKwlhZGRzCXgxOSx4MTkseDE0CisJYWRjcwl4MjAseDIwLHgxNQorCWxkcAl4MTQseDE1LFt4MiwjOCo0XQorCWFkY3MJeDIxLHgyMSx4MTYKKwlhZGNzCXgyMix4MjIseDE3CisJbGRwCXgxNix4MTcsW3gyLCM4KjZdCisJYWRjcwl4MjMseDIzLHgxNAorCWFkY3MJeDI0LHgyNCx4MTUKKwlhZGNzCXgyNSx4MjUseDE2CisJYWRjcwl4MjYseDI2LHgxNworCS8vYWRjCXgyOCx4enIseHpyCQkvLyBtb3ZlZCBiZWxvdworCWNiegl4MjcsTHNxcjh4OF9wb3N0X2NvbmRpdGlvbgorCisJbGRyCXg0LFt4MiwjLTgqOF0KKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWxkcAl4MTAseDExLFt4MSwjOCo0XQorCW1vdgl4MjcsIy04KjgKKwlsZHAJeDEyLHgxMyxbeDEsIzgqNl0KKwlhZGQJeDEseDEsIzgqOAorCitMc3FyOHhfdGFpbDoKKwltdWwJeDE0LHg2LHg0CisJYWRjCXgyOCx4enIseHpyCQkvLyBjYXJyeSBiaXQsIG1vZHVsby1zY2hlZHVsZWQKKwltdWwJeDE1LHg3LHg0CisJYWRkCXgyNyx4MjcsIzgKKwltdWwJeDE2LHg4LHg0CisJbXVsCXgxNyx4OSx4NAorCWFkZHMJeDE5LHgxOSx4MTQKKwltdWwJeDE0LHgxMCx4NAorCWFkY3MJeDIwLHgyMCx4MTUKKwltdWwJeDE1LHgxMSx4NAorCWFkY3MJeDIxLHgyMSx4MTYKKwltdWwJeDE2LHgxMix4NAorCWFkY3MJeDIyLHgyMix4MTcKKwltdWwJeDE3LHgxMyx4NAorCWFkY3MJeDIzLHgyMyx4MTQKKwl1bXVsaAl4MTQseDYseDQKKwlhZGNzCXgyNCx4MjQseDE1CisJdW11bGgJeDE1LHg3LHg0CisJYWRjcwl4MjUseDI1LHgxNgorCXVtdWxoCXgxNix4OCx4NAorCWFkY3MJeDI2LHgyNix4MTcKKwl1bXVsaAl4MTcseDkseDQKKwlhZGMJeDI4LHgyOCx4enIKKwlzdHIJeDE5LFt4Ml0sIzgKKwlhZGRzCXgxOSx4MjAseDE0CisJdW11bGgJeDE0LHgxMCx4NAorCWFkY3MJeDIwLHgyMSx4MTUKKwl1bXVsaAl4MTUseDExLHg0CisJYWRjcwl4MjEseDIyLHgxNgorCXVtdWxoCXgxNix4MTIseDQKKwlhZGNzCXgyMix4MjMseDE3CisJdW11bGgJeDE3LHgxMyx4NAorCWxkcgl4NCxbeDAseDI3XQorCWFkY3MJeDIzLHgyNCx4MTQKKwlhZGNzCXgyNCx4MjUseDE1CisJYWRjcwl4MjUseDI2LHgxNgorCWFkY3MJeDI2LHgyOCx4MTcKKwkvL2FkYwl4MjgseHpyLHh6cgkJLy8gbW92ZWQgYWJvdmUKKwljYm56CXgyNyxMc3FyOHhfdGFpbAorCQkJCQkvLyBub3RlIHRoYXQgY2FycnkgZmxhZyBpcyBndWFyYW50ZWVkCisJCQkJCS8vIHRvIGJlIHplcm8gYXQgdGhpcyBwb2ludAorCWxkcAl4Nix4NyxbeDIsIzgqMF0KKwlzdWIJeDI3LHgzLHgxCS8vIGRvbmUgeWV0PworCXN1Ygl4MTYseDMseDUJLy8gcmV3aW5kZWQgbnAKKwlsZHAJeDgseDksW3gyLCM4KjJdCisJbGRwCXgxMCx4MTEsW3gyLCM4KjRdCisJbGRwCXgxMix4MTMsW3gyLCM4KjZdCisJY2J6CXgyNyxMc3FyOHhfdGFpbF9icmVhaworCisJbGRyCXg0LFt4MCwjLTgqOF0KKwlhZGRzCXgxOSx4MTkseDYKKwlhZGNzCXgyMCx4MjAseDcKKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJYWRjcwl4MjEseDIxLHg4CisJYWRjcwl4MjIseDIyLHg5CisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWFkY3MJeDIzLHgyMyx4MTAKKwlhZGNzCXgyNCx4MjQseDExCisJbGRwCXgxMCx4MTEsW3gxLCM4KjRdCisJYWRjcwl4MjUseDI1LHgxMgorCW1vdgl4MjcsIy04KjgKKwlhZGNzCXgyNix4MjYseDEzCisJbGRwCXgxMix4MTMsW3gxLCM4KjZdCisJYWRkCXgxLHgxLCM4KjgKKwkvL2FkYwl4MjgseHpyLHh6cgkJLy8gbW92ZWQgYWJvdmUKKwliCUxzcXI4eF90YWlsCisKKy5hbGlnbgk0CitMc3FyOHhfdGFpbF9icmVhazoKKwlsZHIJeDQsW3gyOSwjMTEyXQkJLy8gcHVsbCBuMAorCWFkZAl4MjcseDIsIzgqOAkJLy8gZW5kIG9mIGN1cnJlbnQgdFtudW1dIHdpbmRvdworCisJc3Vicwl4enIseDMwLCMxCQkvLyAibW92ZSIgdG9wLW1vc3QgY2FycnkgdG8gY2FycnkgYml0CisJYWRjcwl4MTQseDE5LHg2CisJYWRjcwl4MTUseDIwLHg3CisJbGRwCXgxOSx4MjAsW3gwLCM4KjBdCisJYWRjcwl4MjEseDIxLHg4CisJbGRwCXg2LHg3LFt4MTYsIzgqMF0JLy8gcmVjYWxsIHRoYXQgeDE2IGlzICZuWzBdCisJYWRjcwl4MjIseDIyLHg5CisJbGRwCXg4LHg5LFt4MTYsIzgqMl0KKwlhZGNzCXgyMyx4MjMseDEwCisJYWRjcwl4MjQseDI0LHgxMQorCWxkcAl4MTAseDExLFt4MTYsIzgqNF0KKwlhZGNzCXgyNSx4MjUseDEyCisJYWRjcwl4MjYseDI2LHgxMworCWxkcAl4MTIseDEzLFt4MTYsIzgqNl0KKwlhZGQJeDEseDE2LCM4KjgKKwlhZGMJeDMwLHh6cix4enIJLy8gdG9wLW1vc3QgY2FycnkKKwltdWwJeDI4LHg0LHgxOQorCXN0cAl4MTQseDE1LFt4MiwjOCowXQorCXN0cAl4MjEseDIyLFt4MiwjOCoyXQorCWxkcAl4MjEseDIyLFt4MCwjOCoyXQorCXN0cAl4MjMseDI0LFt4MiwjOCo0XQorCWxkcAl4MjMseDI0LFt4MCwjOCo0XQorCWNtcAl4MjcseDI5CQkvLyBkaWQgd2UgaGl0IHRoZSBib3R0b20/CisJc3RwCXgyNSx4MjYsW3gyLCM4KjZdCisJbW92CXgyLHgwCQkJLy8gc2xpZGUgdGhlIHdpbmRvdworCWxkcAl4MjUseDI2LFt4MCwjOCo2XQorCW1vdgl4MjcsIzgKKwliLm5lCUxzcXI4eF9yZWR1Y3Rpb24KKworCS8vIEZpbmFsIHN0ZXAuIFdlIHNlZSBpZiByZXN1bHQgaXMgbGFyZ2VyIHRoYW4gbW9kdWx1cywgYW5kCisJLy8gaWYgaXQgaXMsIHN1YnRyYWN0IHRoZSBtb2R1bHVzLiBCdXQgY29tcGFyaXNvbiBpbXBsaWVzCisJLy8gc3VidHJhY3Rpb24uIFNvIHdlIHN1YnRyYWN0IG1vZHVsdXMsIHNlZSBpZiBpdCBib3Jyb3dlZCwKKwkvLyBhbmQgY29uZGl0aW9uYWxseSBjb3B5IG9yaWdpbmFsIHZhbHVlLgorCWxkcgl4MCxbeDI5LCM5Nl0JCS8vIHB1bGwgcnAKKwlhZGQJeDIseDIsIzgqOAorCXN1YnMJeDE0LHgxOSx4NgorCXNiY3MJeDE1LHgyMCx4NworCXN1Ygl4MjcseDUsIzgqOAorCW1vdgl4Myx4MAkJLy8geDAgY29weQorCitMc3FyOHhfc3ViOgorCXNiY3MJeDE2LHgyMSx4OAorCWxkcAl4Nix4NyxbeDEsIzgqMF0KKwlzYmNzCXgxNyx4MjIseDkKKwlzdHAJeDE0LHgxNSxbeDAsIzgqMF0KKwlzYmNzCXgxNCx4MjMseDEwCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCXNiY3MJeDE1LHgyNCx4MTEKKwlzdHAJeDE2LHgxNyxbeDAsIzgqMl0KKwlzYmNzCXgxNix4MjUseDEyCisJbGRwCXgxMCx4MTEsW3gxLCM4KjRdCisJc2Jjcwl4MTcseDI2LHgxMworCWxkcAl4MTIseDEzLFt4MSwjOCo2XQorCWFkZAl4MSx4MSwjOCo4CisJbGRwCXgxOSx4MjAsW3gyLCM4KjBdCisJc3ViCXgyNyx4MjcsIzgqOAorCWxkcAl4MjEseDIyLFt4MiwjOCoyXQorCWxkcAl4MjMseDI0LFt4MiwjOCo0XQorCWxkcAl4MjUseDI2LFt4MiwjOCo2XQorCWFkZAl4Mix4MiwjOCo4CisJc3RwCXgxNCx4MTUsW3gwLCM4KjRdCisJc2Jjcwl4MTQseDE5LHg2CisJc3RwCXgxNix4MTcsW3gwLCM4KjZdCisJYWRkCXgwLHgwLCM4KjgKKwlzYmNzCXgxNSx4MjAseDcKKwljYm56CXgyNyxMc3FyOHhfc3ViCisKKwlzYmNzCXgxNix4MjEseDgKKwltb3YJeDIsc3AKKwlhZGQJeDEsc3AseDUKKwlsZHAJeDYseDcsW3gzLCM4KjBdCisJc2Jjcwl4MTcseDIyLHg5CisJc3RwCXgxNCx4MTUsW3gwLCM4KjBdCisJc2Jjcwl4MTQseDIzLHgxMAorCWxkcAl4OCx4OSxbeDMsIzgqMl0KKwlzYmNzCXgxNSx4MjQseDExCisJc3RwCXgxNix4MTcsW3gwLCM4KjJdCisJc2Jjcwl4MTYseDI1LHgxMgorCWxkcAl4MTkseDIwLFt4MSwjOCowXQorCXNiY3MJeDE3LHgyNix4MTMKKwlsZHAJeDIxLHgyMixbeDEsIzgqMl0KKwlzYmNzCXh6cix4MzAseHpyCS8vIGRpZCBpdCBib3Jyb3c/CisJbGRyCXgzMCxbeDI5LCM4XQkJLy8gcHVsbCByZXR1cm4gYWRkcmVzcworCXN0cAl4MTQseDE1LFt4MCwjOCo0XQorCXN0cAl4MTYseDE3LFt4MCwjOCo2XQorCisJc3ViCXgyNyx4NSwjOCo0CitMc3FyNHhfY29uZF9jb3B5OgorCXN1Ygl4MjcseDI3LCM4KjQKKwljc2VsCXgxNCx4MTkseDYsbG8KKwlzdHAJeHpyLHh6cixbeDIsIzgqMF0KKwljc2VsCXgxNSx4MjAseDcsbG8KKwlsZHAJeDYseDcsW3gzLCM4KjRdCisJbGRwCXgxOSx4MjAsW3gxLCM4KjRdCisJY3NlbAl4MTYseDIxLHg4LGxvCisJc3RwCXh6cix4enIsW3gyLCM4KjJdCisJYWRkCXgyLHgyLCM4KjQKKwljc2VsCXgxNyx4MjIseDksbG8KKwlsZHAJeDgseDksW3gzLCM4KjZdCisJbGRwCXgyMSx4MjIsW3gxLCM4KjZdCisJYWRkCXgxLHgxLCM4KjQKKwlzdHAJeDE0LHgxNSxbeDMsIzgqMF0KKwlzdHAJeDE2LHgxNyxbeDMsIzgqMl0KKwlhZGQJeDMseDMsIzgqNAorCXN0cAl4enIseHpyLFt4MSwjOCowXQorCXN0cAl4enIseHpyLFt4MSwjOCoyXQorCWNibnoJeDI3LExzcXI0eF9jb25kX2NvcHkKKworCWNzZWwJeDE0LHgxOSx4NixsbworCXN0cAl4enIseHpyLFt4MiwjOCowXQorCWNzZWwJeDE1LHgyMCx4NyxsbworCXN0cAl4enIseHpyLFt4MiwjOCoyXQorCWNzZWwJeDE2LHgyMSx4OCxsbworCWNzZWwJeDE3LHgyMix4OSxsbworCXN0cAl4MTQseDE1LFt4MywjOCowXQorCXN0cAl4MTYseDE3LFt4MywjOCoyXQorCisJYglMc3FyOHhfZG9uZQorCisuYWxpZ24JNAorTHNxcjh4OF9wb3N0X2NvbmRpdGlvbjoKKwlhZGMJeDI4LHh6cix4enIKKwlsZHIJeDMwLFt4MjksIzhdCQkvLyBwdWxsIHJldHVybiBhZGRyZXNzCisJLy8geDE5LTcseDI4IGhvbGQgcmVzdWx0LCB4Ni03IGhvbGQgbW9kdWx1cworCXN1YnMJeDYseDE5LHg2CisJbGRyCXgxLFt4MjksIzk2XQkJLy8gcHVsbCBycAorCXNiY3MJeDcseDIwLHg3CisJc3RwCXh6cix4enIsW3NwLCM4KjBdCisJc2Jjcwl4OCx4MjEseDgKKwlzdHAJeHpyLHh6cixbc3AsIzgqMl0KKwlzYmNzCXg5LHgyMix4OQorCXN0cAl4enIseHpyLFtzcCwjOCo0XQorCXNiY3MJeDEwLHgyMyx4MTAKKwlzdHAJeHpyLHh6cixbc3AsIzgqNl0KKwlzYmNzCXgxMSx4MjQseDExCisJc3RwCXh6cix4enIsW3NwLCM4KjhdCisJc2Jjcwl4MTIseDI1LHgxMgorCXN0cAl4enIseHpyLFtzcCwjOCoxMF0KKwlzYmNzCXgxMyx4MjYseDEzCisJc3RwCXh6cix4enIsW3NwLCM4KjEyXQorCXNiY3MJeDI4LHgyOCx4enIJLy8gZGlkIGl0IGJvcnJvdz8KKwlzdHAJeHpyLHh6cixbc3AsIzgqMTRdCisKKwkvLyB4Ni03IGhvbGQgcmVzdWx0LW1vZHVsdXMKKwljc2VsCXg2LHgxOSx4NixsbworCWNzZWwJeDcseDIwLHg3LGxvCisJY3NlbAl4OCx4MjEseDgsbG8KKwljc2VsCXg5LHgyMix4OSxsbworCXN0cAl4Nix4NyxbeDEsIzgqMF0KKwljc2VsCXgxMCx4MjMseDEwLGxvCisJY3NlbAl4MTEseDI0LHgxMSxsbworCXN0cAl4OCx4OSxbeDEsIzgqMl0KKwljc2VsCXgxMix4MjUseDEyLGxvCisJY3NlbAl4MTMseDI2LHgxMyxsbworCXN0cAl4MTAseDExLFt4MSwjOCo0XQorCXN0cAl4MTIseDEzLFt4MSwjOCo2XQorCitMc3FyOHhfZG9uZToKKwlsZHAJeDE5LHgyMCxbeDI5LCMxNl0KKwltb3YJc3AseDI5CisJbGRwCXgyMSx4MjIsW3gyOSwjMzJdCisJbW92CXgwLCMxCisJbGRwCXgyMyx4MjQsW3gyOSwjNDhdCisJbGRwCXgyNSx4MjYsW3gyOSwjNjRdCisJbGRwCXgyNyx4MjgsW3gyOSwjODBdCisJbGRyCXgyOSxbc3BdLCMxMjgKKwlyZXQKKworCisuYWxpZ24JNQorX19ibl9tdWw0eF9tb250OgorCXN0cAl4MjkseDMwLFtzcCwjLTEyOF0hCisJYWRkCXgyOSxzcCwjMAorCXN0cAl4MTkseDIwLFtzcCwjMTZdCisJc3RwCXgyMSx4MjIsW3NwLCMzMl0KKwlzdHAJeDIzLHgyNCxbc3AsIzQ4XQorCXN0cAl4MjUseDI2LFtzcCwjNjRdCisJc3RwCXgyNyx4MjgsW3NwLCM4MF0KKworCXN1Ygl4MjYsc3AseDUsbHNsIzMKKwlsc2wJeDUseDUsIzMKKwlsZHIJeDQsW3g0XQkJLy8gKm4wCisJc3ViCXNwLHgyNiwjOCo0CQkvLyBhbGxvY2EKKworCWFkZAl4MTAseDIseDUKKwlhZGQJeDI3LHgxLHg1CisJc3RwCXgwLHgxMCxbeDI5LCM5Nl0JLy8gb2ZmbG9hZCBycCBhbmQgJmJbbnVtXQorCisJbGRyCXgyNCxbeDIsIzgqMF0JCS8vIGJbMF0KKwlsZHAJeDYseDcsW3gxLCM4KjBdCS8vIGFbMC4uM10KKwlsZHAJeDgseDksW3gxLCM4KjJdCisJYWRkCXgxLHgxLCM4KjQKKwltb3YJeDE5LHh6cgorCW1vdgl4MjAseHpyCisJbW92CXgyMSx4enIKKwltb3YJeDIyLHh6cgorCWxkcAl4MTQseDE1LFt4MywjOCowXQkvLyBuWzAuLjNdCisJbGRwCXgxNix4MTcsW3gzLCM4KjJdCisJYWRkcwl4Myx4MywjOCo0CQkvLyBjbGVhciBjYXJyeSBiaXQKKwltb3YJeDAseHpyCisJbW92CXgyOCwjMAorCW1vdgl4MjYsc3AKKworTG9vcF9tdWw0eF8xc3RfcmVkdWN0aW9uOgorCW11bAl4MTAseDYseDI0CQkvLyBsbyhhWzAuLjNdKmJbMF0pCisJYWRjCXgwLHgwLHh6cgkvLyBtb2R1bG8tc2NoZWR1bGVkCisJbXVsCXgxMSx4Nyx4MjQKKwlhZGQJeDI4LHgyOCwjOAorCW11bAl4MTIseDgseDI0CisJYW5kCXgyOCx4MjgsIzMxCisJbXVsCXgxMyx4OSx4MjQKKwlhZGRzCXgxOSx4MTkseDEwCisJdW11bGgJeDEwLHg2LHgyNAkJLy8gaGkoYVswLi4zXSpiWzBdKQorCWFkY3MJeDIwLHgyMCx4MTEKKwltdWwJeDI1LHgxOSx4NAkJLy8gdFswXSpuMAorCWFkY3MJeDIxLHgyMSx4MTIKKwl1bXVsaAl4MTEseDcseDI0CisJYWRjcwl4MjIseDIyLHgxMworCXVtdWxoCXgxMix4OCx4MjQKKwlhZGMJeDIzLHh6cix4enIKKwl1bXVsaAl4MTMseDkseDI0CisJbGRyCXgyNCxbeDIseDI4XQkJLy8gbmV4dCBiW2ldIChvciBiWzBdKQorCWFkZHMJeDIwLHgyMCx4MTAKKwkvLyAoKikJbXVsCXgxMCx4MTQseDI1CS8vIGxvKG5bMC4uM10qdFswXSpuMCkKKwlzdHIJeDI1LFt4MjZdLCM4CQkvLyBwdXQgYXNpZGUgdFswXSpuMCBmb3IgdGFpbCBwcm9jZXNzaW5nCisJYWRjcwl4MjEseDIxLHgxMQorCW11bAl4MTEseDE1LHgyNQorCWFkY3MJeDIyLHgyMix4MTIKKwltdWwJeDEyLHgxNix4MjUKKwlhZGMJeDIzLHgyMyx4MTMJCS8vIGNhbid0IG92ZXJmbG93CisJbXVsCXgxMyx4MTcseDI1CisJLy8gKCopCWFkZHMJeHpyLHgxOSx4MTAKKwlzdWJzCXh6cix4MTksIzEJCS8vICgqKQorCXVtdWxoCXgxMCx4MTQseDI1CQkvLyBoaShuWzAuLjNdKnRbMF0qbjApCisJYWRjcwl4MTkseDIwLHgxMQorCXVtdWxoCXgxMSx4MTUseDI1CisJYWRjcwl4MjAseDIxLHgxMgorCXVtdWxoCXgxMix4MTYseDI1CisJYWRjcwl4MjEseDIyLHgxMworCXVtdWxoCXgxMyx4MTcseDI1CisJYWRjcwl4MjIseDIzLHgwCisJYWRjCXgwLHh6cix4enIKKwlhZGRzCXgxOSx4MTkseDEwCisJc3ViCXgxMCx4MjcseDEKKwlhZGNzCXgyMCx4MjAseDExCisJYWRjcwl4MjEseDIxLHgxMgorCWFkY3MJeDIyLHgyMix4MTMKKwkvL2FkYwl4MCx4MCx4enIKKwljYm56CXgyOCxMb29wX211bDR4XzFzdF9yZWR1Y3Rpb24KKworCWNiegl4MTAsTG11bDR4NF9wb3N0X2NvbmRpdGlvbgorCisJbGRwCXg2LHg3LFt4MSwjOCowXQkvLyBhWzQuLjddCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWFkZAl4MSx4MSwjOCo0CisJbGRyCXgyNSxbc3BdCQkvLyBhWzBdKm4wCisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCS8vIG5bNC4uN10KKwlsZHAJeDE2LHgxNyxbeDMsIzgqMl0KKwlhZGQJeDMseDMsIzgqNAorCitMb29wX211bDR4XzFzdF90YWlsOgorCW11bAl4MTAseDYseDI0CQkvLyBsbyhhWzQuLjddKmJbaV0pCisJYWRjCXgwLHgwLHh6cgkvLyBtb2R1bG8tc2NoZWR1bGVkCisJbXVsCXgxMSx4Nyx4MjQKKwlhZGQJeDI4LHgyOCwjOAorCW11bAl4MTIseDgseDI0CisJYW5kCXgyOCx4MjgsIzMxCisJbXVsCXgxMyx4OSx4MjQKKwlhZGRzCXgxOSx4MTkseDEwCisJdW11bGgJeDEwLHg2LHgyNAkJLy8gaGkoYVs0Li43XSpiW2ldKQorCWFkY3MJeDIwLHgyMCx4MTEKKwl1bXVsaAl4MTEseDcseDI0CisJYWRjcwl4MjEseDIxLHgxMgorCXVtdWxoCXgxMix4OCx4MjQKKwlhZGNzCXgyMix4MjIseDEzCisJdW11bGgJeDEzLHg5LHgyNAorCWFkYwl4MjMseHpyLHh6cgorCWxkcgl4MjQsW3gyLHgyOF0JCS8vIG5leHQgYltpXSAob3IgYlswXSkKKwlhZGRzCXgyMCx4MjAseDEwCisJbXVsCXgxMCx4MTQseDI1CQkvLyBsbyhuWzQuLjddKmFbMF0qbjApCisJYWRjcwl4MjEseDIxLHgxMQorCW11bAl4MTEseDE1LHgyNQorCWFkY3MJeDIyLHgyMix4MTIKKwltdWwJeDEyLHgxNix4MjUKKwlhZGMJeDIzLHgyMyx4MTMJCS8vIGNhbid0IG92ZXJmbG93CisJbXVsCXgxMyx4MTcseDI1CisJYWRkcwl4MTkseDE5LHgxMAorCXVtdWxoCXgxMCx4MTQseDI1CQkvLyBoaShuWzQuLjddKmFbMF0qbjApCisJYWRjcwl4MjAseDIwLHgxMQorCXVtdWxoCXgxMSx4MTUseDI1CisJYWRjcwl4MjEseDIxLHgxMgorCXVtdWxoCXgxMix4MTYseDI1CisJYWRjcwl4MjIseDIyLHgxMworCWFkY3MJeDIzLHgyMyx4MAorCXVtdWxoCXgxMyx4MTcseDI1CisJYWRjCXgwLHh6cix4enIKKwlsZHIJeDI1LFtzcCx4MjhdCQkvLyBuZXh0IHRbMF0qbjAKKwlzdHIJeDE5LFt4MjZdLCM4CQkvLyByZXN1bHQhISEKKwlhZGRzCXgxOSx4MjAseDEwCisJc3ViCXgxMCx4MjcseDEJCS8vIGRvbmUgeWV0PworCWFkY3MJeDIwLHgyMSx4MTEKKwlhZGNzCXgyMSx4MjIseDEyCisJYWRjcwl4MjIseDIzLHgxMworCS8vYWRjCXgwLHgwLHh6cgorCWNibnoJeDI4LExvb3BfbXVsNHhfMXN0X3RhaWwKKworCXN1Ygl4MTEseDI3LHg1CS8vIHJld2luZGVkIHgxCisJY2J6CXgxMCxMbXVsNHhfcHJvY2VlZAorCisJbGRwCXg2LHg3LFt4MSwjOCowXQorCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlhZGQJeDEseDEsIzgqNAorCWxkcAl4MTQseDE1LFt4MywjOCowXQorCWxkcAl4MTYseDE3LFt4MywjOCoyXQorCWFkZAl4Myx4MywjOCo0CisJYglMb29wX211bDR4XzFzdF90YWlsCisKKy5hbGlnbgk1CitMbXVsNHhfcHJvY2VlZDoKKwlsZHIJeDI0LFt4MiwjOCo0XSEJCS8vICorK2IKKwlhZGMJeDMwLHgwLHh6cgorCWxkcAl4Nix4NyxbeDExLCM4KjBdCS8vIGFbMC4uM10KKwlzdWIJeDMseDMseDUJCS8vIHJld2luZCBucAorCWxkcAl4OCx4OSxbeDExLCM4KjJdCisJYWRkCXgxLHgxMSwjOCo0CisKKwlzdHAJeDE5LHgyMCxbeDI2LCM4KjBdCS8vIHJlc3VsdCEhIQorCWxkcAl4MTkseDIwLFtzcCwjOCo0XQkvLyB0WzAuLjNdCisJc3RwCXgyMSx4MjIsW3gyNiwjOCoyXQkvLyByZXN1bHQhISEKKwlsZHAJeDIxLHgyMixbc3AsIzgqNl0KKworCWxkcAl4MTQseDE1LFt4MywjOCowXQkvLyBuWzAuLjNdCisJbW92CXgyNixzcAorCWxkcAl4MTYseDE3LFt4MywjOCoyXQorCWFkZHMJeDMseDMsIzgqNAkJLy8gY2xlYXIgY2FycnkgYml0CisJbW92CXgwLHh6cgorCisuYWxpZ24JNAorTG9vcF9tdWw0eF9yZWR1Y3Rpb246CisJbXVsCXgxMCx4Nix4MjQJCS8vIGxvKGFbMC4uM10qYls0XSkKKwlhZGMJeDAseDAseHpyCS8vIG1vZHVsby1zY2hlZHVsZWQKKwltdWwJeDExLHg3LHgyNAorCWFkZAl4MjgseDI4LCM4CisJbXVsCXgxMix4OCx4MjQKKwlhbmQJeDI4LHgyOCwjMzEKKwltdWwJeDEzLHg5LHgyNAorCWFkZHMJeDE5LHgxOSx4MTAKKwl1bXVsaAl4MTAseDYseDI0CQkvLyBoaShhWzAuLjNdKmJbNF0pCisJYWRjcwl4MjAseDIwLHgxMQorCW11bAl4MjUseDE5LHg0CQkvLyB0WzBdKm4wCisJYWRjcwl4MjEseDIxLHgxMgorCXVtdWxoCXgxMSx4Nyx4MjQKKwlhZGNzCXgyMix4MjIseDEzCisJdW11bGgJeDEyLHg4LHgyNAorCWFkYwl4MjMseHpyLHh6cgorCXVtdWxoCXgxMyx4OSx4MjQKKwlsZHIJeDI0LFt4Mix4MjhdCQkvLyBuZXh0IGJbaV0KKwlhZGRzCXgyMCx4MjAseDEwCisJLy8gKCopCW11bAl4MTAseDE0LHgyNQorCXN0cgl4MjUsW3gyNl0sIzgJCS8vIHB1dCBhc2lkZSB0WzBdKm4wIGZvciB0YWlsIHByb2Nlc3NpbmcKKwlhZGNzCXgyMSx4MjEseDExCisJbXVsCXgxMSx4MTUseDI1CQkvLyBsbyhuWzAuLjNdKnRbMF0qbjAKKwlhZGNzCXgyMix4MjIseDEyCisJbXVsCXgxMix4MTYseDI1CisJYWRjCXgyMyx4MjMseDEzCQkvLyBjYW4ndCBvdmVyZmxvdworCW11bAl4MTMseDE3LHgyNQorCS8vICgqKQlhZGRzCXh6cix4MTkseDEwCisJc3Vicwl4enIseDE5LCMxCQkvLyAoKikKKwl1bXVsaAl4MTAseDE0LHgyNQkJLy8gaGkoblswLi4zXSp0WzBdKm4wCisJYWRjcwl4MTkseDIwLHgxMQorCXVtdWxoCXgxMSx4MTUseDI1CisJYWRjcwl4MjAseDIxLHgxMgorCXVtdWxoCXgxMix4MTYseDI1CisJYWRjcwl4MjEseDIyLHgxMworCXVtdWxoCXgxMyx4MTcseDI1CisJYWRjcwl4MjIseDIzLHgwCisJYWRjCXgwLHh6cix4enIKKwlhZGRzCXgxOSx4MTkseDEwCisJYWRjcwl4MjAseDIwLHgxMQorCWFkY3MJeDIxLHgyMSx4MTIKKwlhZGNzCXgyMix4MjIseDEzCisJLy9hZGMJeDAseDAseHpyCisJY2Juegl4MjgsTG9vcF9tdWw0eF9yZWR1Y3Rpb24KKworCWFkYwl4MCx4MCx4enIKKwlsZHAJeDEwLHgxMSxbeDI2LCM4KjRdCS8vIHRbNC4uN10KKwlsZHAJeDEyLHgxMyxbeDI2LCM4KjZdCisJbGRwCXg2LHg3LFt4MSwjOCowXQkvLyBhWzQuLjddCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWFkZAl4MSx4MSwjOCo0CisJYWRkcwl4MTkseDE5LHgxMAorCWFkY3MJeDIwLHgyMCx4MTEKKwlhZGNzCXgyMSx4MjEseDEyCisJYWRjcwl4MjIseDIyLHgxMworCS8vYWRjCXgwLHgwLHh6cgorCisJbGRyCXgyNSxbc3BdCQkvLyB0WzBdKm4wCisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCS8vIG5bNC4uN10KKwlsZHAJeDE2LHgxNyxbeDMsIzgqMl0KKwlhZGQJeDMseDMsIzgqNAorCisuYWxpZ24JNAorTG9vcF9tdWw0eF90YWlsOgorCW11bAl4MTAseDYseDI0CQkvLyBsbyhhWzQuLjddKmJbNF0pCisJYWRjCXgwLHgwLHh6cgkvLyBtb2R1bG8tc2NoZWR1bGVkCisJbXVsCXgxMSx4Nyx4MjQKKwlhZGQJeDI4LHgyOCwjOAorCW11bAl4MTIseDgseDI0CisJYW5kCXgyOCx4MjgsIzMxCisJbXVsCXgxMyx4OSx4MjQKKwlhZGRzCXgxOSx4MTkseDEwCisJdW11bGgJeDEwLHg2LHgyNAkJLy8gaGkoYVs0Li43XSpiWzRdKQorCWFkY3MJeDIwLHgyMCx4MTEKKwl1bXVsaAl4MTEseDcseDI0CisJYWRjcwl4MjEseDIxLHgxMgorCXVtdWxoCXgxMix4OCx4MjQKKwlhZGNzCXgyMix4MjIseDEzCisJdW11bGgJeDEzLHg5LHgyNAorCWFkYwl4MjMseHpyLHh6cgorCWxkcgl4MjQsW3gyLHgyOF0JCS8vIG5leHQgYltpXQorCWFkZHMJeDIwLHgyMCx4MTAKKwltdWwJeDEwLHgxNCx4MjUJCS8vIGxvKG5bNC4uN10qdFswXSpuMCkKKwlhZGNzCXgyMSx4MjEseDExCisJbXVsCXgxMSx4MTUseDI1CisJYWRjcwl4MjIseDIyLHgxMgorCW11bAl4MTIseDE2LHgyNQorCWFkYwl4MjMseDIzLHgxMwkJLy8gY2FuJ3Qgb3ZlcmZsb3cKKwltdWwJeDEzLHgxNyx4MjUKKwlhZGRzCXgxOSx4MTkseDEwCisJdW11bGgJeDEwLHgxNCx4MjUJCS8vIGhpKG5bNC4uN10qdFswXSpuMCkKKwlhZGNzCXgyMCx4MjAseDExCisJdW11bGgJeDExLHgxNSx4MjUKKwlhZGNzCXgyMSx4MjEseDEyCisJdW11bGgJeDEyLHgxNix4MjUKKwlhZGNzCXgyMix4MjIseDEzCisJdW11bGgJeDEzLHgxNyx4MjUKKwlhZGNzCXgyMyx4MjMseDAKKwlsZHIJeDI1LFtzcCx4MjhdCQkvLyBuZXh0IGFbMF0qbjAKKwlhZGMJeDAseHpyLHh6cgorCXN0cgl4MTksW3gyNl0sIzgJCS8vIHJlc3VsdCEhIQorCWFkZHMJeDE5LHgyMCx4MTAKKwlzdWIJeDEwLHgyNyx4MQkJLy8gZG9uZSB5ZXQ/CisJYWRjcwl4MjAseDIxLHgxMQorCWFkY3MJeDIxLHgyMix4MTIKKwlhZGNzCXgyMix4MjMseDEzCisJLy9hZGMJeDAseDAseHpyCisJY2Juegl4MjgsTG9vcF9tdWw0eF90YWlsCisKKwlzdWIJeDExLHgzLHg1CQkvLyByZXdpbmRlZCBucD8KKwlhZGMJeDAseDAseHpyCisJY2J6CXgxMCxMb29wX211bDR4X2JyZWFrCisKKwlsZHAJeDEwLHgxMSxbeDI2LCM4KjRdCisJbGRwCXgxMix4MTMsW3gyNiwjOCo2XQorCWxkcAl4Nix4NyxbeDEsIzgqMF0KKwlsZHAJeDgseDksW3gxLCM4KjJdCisJYWRkCXgxLHgxLCM4KjQKKwlhZGRzCXgxOSx4MTkseDEwCisJYWRjcwl4MjAseDIwLHgxMQorCWFkY3MJeDIxLHgyMSx4MTIKKwlhZGNzCXgyMix4MjIseDEzCisJLy9hZGMJeDAseDAseHpyCisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCisJbGRwCXgxNix4MTcsW3gzLCM4KjJdCisJYWRkCXgzLHgzLCM4KjQKKwliCUxvb3BfbXVsNHhfdGFpbAorCisuYWxpZ24JNAorTG9vcF9tdWw0eF9icmVhazoKKwlsZHAJeDEyLHgxMyxbeDI5LCM5Nl0JLy8gcHVsbCBycCBhbmQgJmJbbnVtXQorCWFkZHMJeDE5LHgxOSx4MzAKKwlhZGQJeDIseDIsIzgqNAkJLy8gYnArKworCWFkY3MJeDIwLHgyMCx4enIKKwlzdWIJeDEseDEseDUJCS8vIHJld2luZCBhcAorCWFkY3MJeDIxLHgyMSx4enIKKwlzdHAJeDE5LHgyMCxbeDI2LCM4KjBdCS8vIHJlc3VsdCEhIQorCWFkY3MJeDIyLHgyMix4enIKKwlsZHAJeDE5LHgyMCxbc3AsIzgqNF0JLy8gdFswLi4zXQorCWFkYwl4MzAseDAseHpyCisJc3RwCXgyMSx4MjIsW3gyNiwjOCoyXQkvLyByZXN1bHQhISEKKwljbXAJeDIseDEzCQkJLy8gZG9uZSB5ZXQ/CisJbGRwCXgyMSx4MjIsW3NwLCM4KjZdCisJbGRwCXgxNCx4MTUsW3gxMSwjOCowXQkvLyBuWzAuLjNdCisJbGRwCXgxNix4MTcsW3gxMSwjOCoyXQorCWFkZAl4Myx4MTEsIzgqNAorCWIuZXEJTG11bDR4X3Bvc3QKKworCWxkcgl4MjQsW3gyXQorCWxkcAl4Nix4NyxbeDEsIzgqMF0JLy8gYVswLi4zXQorCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlhZGRzCXgxLHgxLCM4KjQJCS8vIGNsZWFyIGNhcnJ5IGJpdAorCW1vdgl4MCx4enIKKwltb3YJeDI2LHNwCisJYglMb29wX211bDR4X3JlZHVjdGlvbgorCisuYWxpZ24JNAorTG11bDR4X3Bvc3Q6CisJLy8gRmluYWwgc3RlcC4gV2Ugc2VlIGlmIHJlc3VsdCBpcyBsYXJnZXIgdGhhbiBtb2R1bHVzLCBhbmQKKwkvLyBpZiBpdCBpcywgc3VidHJhY3QgdGhlIG1vZHVsdXMuIEJ1dCBjb21wYXJpc29uIGltcGxpZXMKKwkvLyBzdWJ0cmFjdGlvbi4gU28gd2Ugc3VidHJhY3QgbW9kdWx1cywgc2VlIGlmIGl0IGJvcnJvd2VkLAorCS8vIGFuZCBjb25kaXRpb25hbGx5IGNvcHkgb3JpZ2luYWwgdmFsdWUuCisJbW92CXgwLHgxMgorCW1vdgl4MjcseDEyCQkvLyB4MCBjb3B5CisJc3Vicwl4MTAseDE5LHgxNAorCWFkZAl4MjYsc3AsIzgqOAorCXNiY3MJeDExLHgyMCx4MTUKKwlzdWIJeDI4LHg1LCM4KjQKKworTG11bDR4X3N1YjoKKwlzYmNzCXgxMix4MjEseDE2CisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCisJc3ViCXgyOCx4MjgsIzgqNAorCWxkcAl4MTkseDIwLFt4MjYsIzgqMF0KKwlzYmNzCXgxMyx4MjIseDE3CisJbGRwCXgxNix4MTcsW3gzLCM4KjJdCisJYWRkCXgzLHgzLCM4KjQKKwlsZHAJeDIxLHgyMixbeDI2LCM4KjJdCisJYWRkCXgyNix4MjYsIzgqNAorCXN0cAl4MTAseDExLFt4MCwjOCowXQorCXNiY3MJeDEwLHgxOSx4MTQKKwlzdHAJeDEyLHgxMyxbeDAsIzgqMl0KKwlhZGQJeDAseDAsIzgqNAorCXNiY3MJeDExLHgyMCx4MTUKKwljYm56CXgyOCxMbXVsNHhfc3ViCisKKwlzYmNzCXgxMix4MjEseDE2CisJbW92CXgyNixzcAorCWFkZAl4MSxzcCwjOCo0CisJbGRwCXg2LHg3LFt4MjcsIzgqMF0KKwlzYmNzCXgxMyx4MjIseDE3CisJc3RwCXgxMCx4MTEsW3gwLCM4KjBdCisJbGRwCXg4LHg5LFt4MjcsIzgqMl0KKwlzdHAJeDEyLHgxMyxbeDAsIzgqMl0KKwlsZHAJeDE5LHgyMCxbeDEsIzgqMF0KKwlsZHAJeDIxLHgyMixbeDEsIzgqMl0KKwlzYmNzCXh6cix4MzAseHpyCS8vIGRpZCBpdCBib3Jyb3c/CisJbGRyCXgzMCxbeDI5LCM4XQkJLy8gcHVsbCByZXR1cm4gYWRkcmVzcworCisJc3ViCXgyOCx4NSwjOCo0CitMbXVsNHhfY29uZF9jb3B5OgorCXN1Ygl4MjgseDI4LCM4KjQKKwljc2VsCXgxMCx4MTkseDYsbG8KKwlzdHAJeHpyLHh6cixbeDI2LCM4KjBdCisJY3NlbAl4MTEseDIwLHg3LGxvCisJbGRwCXg2LHg3LFt4MjcsIzgqNF0KKwlsZHAJeDE5LHgyMCxbeDEsIzgqNF0KKwljc2VsCXgxMix4MjEseDgsbG8KKwlzdHAJeHpyLHh6cixbeDI2LCM4KjJdCisJYWRkCXgyNix4MjYsIzgqNAorCWNzZWwJeDEzLHgyMix4OSxsbworCWxkcAl4OCx4OSxbeDI3LCM4KjZdCisJbGRwCXgyMSx4MjIsW3gxLCM4KjZdCisJYWRkCXgxLHgxLCM4KjQKKwlzdHAJeDEwLHgxMSxbeDI3LCM4KjBdCisJc3RwCXgxMix4MTMsW3gyNywjOCoyXQorCWFkZAl4MjcseDI3LCM4KjQKKwljYm56CXgyOCxMbXVsNHhfY29uZF9jb3B5CisKKwljc2VsCXgxMCx4MTkseDYsbG8KKwlzdHAJeHpyLHh6cixbeDI2LCM4KjBdCisJY3NlbAl4MTEseDIwLHg3LGxvCisJc3RwCXh6cix4enIsW3gyNiwjOCoyXQorCWNzZWwJeDEyLHgyMSx4OCxsbworCXN0cAl4enIseHpyLFt4MjYsIzgqM10KKwljc2VsCXgxMyx4MjIseDksbG8KKwlzdHAJeHpyLHh6cixbeDI2LCM4KjRdCisJc3RwCXgxMCx4MTEsW3gyNywjOCowXQorCXN0cAl4MTIseDEzLFt4MjcsIzgqMl0KKworCWIJTG11bDR4X2RvbmUKKworLmFsaWduCTQKK0xtdWw0eDRfcG9zdF9jb25kaXRpb246CisJYWRjCXgwLHgwLHh6cgorCWxkcgl4MSxbeDI5LCM5Nl0JCS8vIHB1bGwgcnAKKwkvLyB4MTktMyx4MCBob2xkIHJlc3VsdCwgeDE0LTcgaG9sZCBtb2R1bHVzCisJc3Vicwl4Nix4MTkseDE0CisJbGRyCXgzMCxbeDI5LCM4XQkJLy8gcHVsbCByZXR1cm4gYWRkcmVzcworCXNiY3MJeDcseDIwLHgxNQorCXN0cAl4enIseHpyLFtzcCwjOCowXQorCXNiY3MJeDgseDIxLHgxNgorCXN0cAl4enIseHpyLFtzcCwjOCoyXQorCXNiY3MJeDkseDIyLHgxNworCXN0cAl4enIseHpyLFtzcCwjOCo0XQorCXNiY3MJeHpyLHgwLHh6cgkJLy8gZGlkIGl0IGJvcnJvdz8KKwlzdHAJeHpyLHh6cixbc3AsIzgqNl0KKworCS8vIHg2LTMgaG9sZCByZXN1bHQtbW9kdWx1cworCWNzZWwJeDYseDE5LHg2LGxvCisJY3NlbAl4Nyx4MjAseDcsbG8KKwljc2VsCXg4LHgyMSx4OCxsbworCWNzZWwJeDkseDIyLHg5LGxvCisJc3RwCXg2LHg3LFt4MSwjOCowXQorCXN0cAl4OCx4OSxbeDEsIzgqMl0KKworTG11bDR4X2RvbmU6CisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJbW92CXNwLHgyOQorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCW1vdgl4MCwjMQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcgl4MjksW3NwXSwjMTI4CisJcmV0CisKKy5ieXRlCTc3LDExMSwxMTAsMTE2LDEwMywxMTEsMTA5LDEwMSwxMTQsMTIxLDMyLDc3LDExNywxMDgsMTE2LDEwNSwxMTIsMTA4LDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JNApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHY4LWFybXg2NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHY4LWFybXg2NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzODEzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL2doYXNodjgtYXJteDY0LlMKQEAgLTAsMCArMSwyMzEgQEAKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKKy50ZXh0CisKKy5nbG9ibAlfZ2NtX2luaXRfdjgKKy5wcml2YXRlX2V4dGVybglfZ2NtX2luaXRfdjgKKworLmFsaWduCTQKK19nY21faW5pdF92ODoKKwlsZDEJe3YxNy4yZH0sW3gxXQkJLy9sb2FkIGlucHV0IEgKKwltb3ZpCXYxOS4xNmIsIzB4ZTEKKwlzaGwJdjE5LjJkLHYxOS4yZCwjNTcJCS8vMHhjMi4wCisJZXh0CXYzLjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKKwl1c2hyCXYxOC4yZCx2MTkuMmQsIzYzCisJZHVwCXYxNy40cyx2MTcuc1sxXQorCWV4dAl2MTYuMTZiLHYxOC4xNmIsdjE5LjE2YiwjOAkJLy90MD0weGMyLi4uLjAxCisJdXNocgl2MTguMmQsdjMuMmQsIzYzCisJc3Nocgl2MTcuNHMsdjE3LjRzLCMzMQkJLy9icm9hZGNhc3QgY2FycnkgYml0CisJYW5kCXYxOC4xNmIsdjE4LjE2Yix2MTYuMTZiCisJc2hsCXYzLjJkLHYzLjJkLCMxCisJZXh0CXYxOC4xNmIsdjE4LjE2Yix2MTguMTZiLCM4CisJYW5kCXYxNi4xNmIsdjE2LjE2Yix2MTcuMTZiCisJb3JyCXYzLjE2Yix2My4xNmIsdjE4LjE2YgkJLy9IPDw8PTEKKwllb3IJdjIwLjE2Yix2My4xNmIsdjE2LjE2YgkJLy90d2lzdGVkIEgKKwlzdDEJe3YyMC4yZH0sW3gwXSwjMTYJCS8vc3RvcmUgSHRhYmxlWzBdCisKKwkvL2NhbGN1bGF0ZSBIXjIKKwlleHQJdjE2LjE2Yix2MjAuMTZiLHYyMC4xNmIsIzgJCS8vS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJcG11bGwJdjAuMXEsdjIwLjFkLHYyMC4xZAorCWVvcgl2MTYuMTZiLHYxNi4xNmIsdjIwLjE2YgorCXBtdWxsMgl2Mi4xcSx2MjAuMmQsdjIwLjJkCisJcG11bGwJdjEuMXEsdjE2LjFkLHYxNi4xZAorCisJZXh0CXYxNy4xNmIsdjAuMTZiLHYyLjE2YiwjOAkJLy9LYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCisJZW9yCXYxOC4xNmIsdjAuMTZiLHYyLjE2YgorCWVvcgl2MS4xNmIsdjEuMTZiLHYxNy4xNmIKKwllb3IJdjEuMTZiLHYxLjE2Yix2MTguMTZiCisJcG11bGwJdjE4LjFxLHYwLjFkLHYxOS4xZAkJLy8xc3QgcGhhc2UKKworCWlucwl2Mi5kWzBdLHYxLmRbMV0KKwlpbnMJdjEuZFsxXSx2MC5kWzBdCisJZW9yCXYwLjE2Yix2MS4xNmIsdjE4LjE2YgorCisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAkJLy8ybmQgcGhhc2UKKwlwbXVsbAl2MC4xcSx2MC4xZCx2MTkuMWQKKwllb3IJdjE4LjE2Yix2MTguMTZiLHYyLjE2YgorCWVvcgl2MjIuMTZiLHYwLjE2Yix2MTguMTZiCisKKwlleHQJdjE3LjE2Yix2MjIuMTZiLHYyMi4xNmIsIzgJCS8vS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJZW9yCXYxNy4xNmIsdjE3LjE2Yix2MjIuMTZiCisJZXh0CXYyMS4xNmIsdjE2LjE2Yix2MTcuMTZiLCM4CQkvL3BhY2sgS2FyYXRzdWJhIHByZS1wcm9jZXNzZWQKKwlzdDEJe3YyMS4yZCx2MjIuMmR9LFt4MF0JCS8vc3RvcmUgSHRhYmxlWzEuLjJdCisKKwlyZXQKKworLmdsb2JsCV9nY21fZ211bHRfdjgKKy5wcml2YXRlX2V4dGVybglfZ2NtX2dtdWx0X3Y4CisKKy5hbGlnbgk0CitfZ2NtX2dtdWx0X3Y4OgorCWxkMQl7djE3LjJkfSxbeDBdCQkvL2xvYWQgWGkKKwltb3ZpCXYxOS4xNmIsIzB4ZTEKKwlsZDEJe3YyMC4yZCx2MjEuMmR9LFt4MV0JLy9sb2FkIHR3aXN0ZWQgSCwgLi4uCisJc2hsCXYxOS4yZCx2MTkuMmQsIzU3CisjaWZuZGVmIF9fQVJNRUJfXworCXJldjY0CXYxNy4xNmIsdjE3LjE2YgorI2VuZGlmCisJZXh0CXYzLjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKKworCXBtdWxsCXYwLjFxLHYyMC4xZCx2My4xZAkJLy9ILmxvwrdYaS5sbworCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjMuMTZiCQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCXBtdWxsMgl2Mi4xcSx2MjAuMmQsdjMuMmQJCS8vSC5oacK3WGkuaGkKKwlwbXVsbAl2MS4xcSx2MjEuMWQsdjE3LjFkCQkvLyhILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisKKwlleHQJdjE3LjE2Yix2MC4xNmIsdjIuMTZiLCM4CQkvL0thcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwllb3IJdjE4LjE2Yix2MC4xNmIsdjIuMTZiCisJZW9yCXYxLjE2Yix2MS4xNmIsdjE3LjE2YgorCWVvcgl2MS4xNmIsdjEuMTZiLHYxOC4xNmIKKwlwbXVsbAl2MTguMXEsdjAuMWQsdjE5LjFkCQkvLzFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworCWlucwl2Mi5kWzBdLHYxLmRbMV0KKwlpbnMJdjEuZFsxXSx2MC5kWzBdCisJZW9yCXYwLjE2Yix2MS4xNmIsdjE4LjE2YgorCisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAkJLy8ybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisJcG11bGwJdjAuMXEsdjAuMWQsdjE5LjFkCisJZW9yCXYxOC4xNmIsdjE4LjE2Yix2Mi4xNmIKKwllb3IJdjAuMTZiLHYwLjE2Yix2MTguMTZiCisKKyNpZm5kZWYgX19BUk1FQl9fCisJcmV2NjQJdjAuMTZiLHYwLjE2YgorI2VuZGlmCisJZXh0CXYwLjE2Yix2MC4xNmIsdjAuMTZiLCM4CisJc3QxCXt2MC4yZH0sW3gwXQkJLy93cml0ZSBvdXQgWGkKKworCXJldAorCisuZ2xvYmwJX2djbV9naGFzaF92OAorLnByaXZhdGVfZXh0ZXJuCV9nY21fZ2hhc2hfdjgKKworLmFsaWduCTQKK19nY21fZ2hhc2hfdjg6CisJbGQxCXt2MC4yZH0sW3gwXQkJLy9sb2FkIFtyb3RhdGVkXSBYaQorCQkJCQkJLy8iW3JvdGF0ZWRdIiBtZWFucyB0aGF0CisJCQkJCQkvL2xvYWRlZCB2YWx1ZSB3b3VsZCBoYXZlCisJCQkJCQkvL3RvIGJlIHJvdGF0ZWQgaW4gb3JkZXIgdG8KKwkJCQkJCS8vbWFrZSBpdCBhcHBlYXIgYXMgaW4KKwkJCQkJCS8vYWxnb3JpdGhtIHNwZWNpZmljYXRpb24KKwlzdWJzCXgzLHgzLCMzMgkJLy9zZWUgaWYgeDMgaXMgMzIgb3IgbGFyZ2VyCisJbW92CXgxMiwjMTYJCS8veDEyIGlzIHVzZWQgYXMgcG9zdC0KKwkJCQkJCS8vaW5jcmVtZW50IGZvciBpbnB1dCBwb2ludGVyOworCQkJCQkJLy9hcyBsb29wIGlzIG1vZHVsby1zY2hlZHVsZWQKKwkJCQkJCS8veDEyIGlzIHplcm9lZCBqdXN0IGluIHRpbWUKKwkJCQkJCS8vdG8gcHJlY2x1ZGUgb3ZlcnN0ZXBwaW5nCisJCQkJCQkvL2lucFtsZW5dLCB3aGljaCBtZWFucyB0aGF0CisJCQkJCQkvL2xhc3QgYmxvY2tbc10gYXJlIGFjdHVhbGx5CisJCQkJCQkvL2xvYWRlZCB0d2ljZSwgYnV0IGxhc3QKKwkJCQkJCS8vY29weSBpcyBub3QgcHJvY2Vzc2VkCisJbGQxCXt2MjAuMmQsdjIxLjJkfSxbeDFdLCMzMgkvL2xvYWQgdHdpc3RlZCBILCAuLi4sIEheMgorCW1vdmkJdjE5LjE2YiwjMHhlMQorCWxkMQl7djIyLjJkfSxbeDFdCisJY3NlbAl4MTIseHpyLHgxMixlcQkJCS8vaXMgaXQgdGltZSB0byB6ZXJvIHgxMj8KKwlleHQJdjAuMTZiLHYwLjE2Yix2MC4xNmIsIzgJCS8vcm90YXRlIFhpCisJbGQxCXt2MTYuMmR9LFt4Ml0sIzE2CS8vbG9hZCBbcm90YXRlZF0gSVswXQorCXNobAl2MTkuMmQsdjE5LjJkLCM1NwkJLy9jb21wb3NlIDB4YzIuMCBjb25zdGFudAorI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTYuMTZiLHYxNi4xNmIKKwlyZXY2NAl2MC4xNmIsdjAuMTZiCisjZW5kaWYKKwlleHQJdjMuMTZiLHYxNi4xNmIsdjE2LjE2YiwjOAkJLy9yb3RhdGUgSVswXQorCWIubG8JTG9kZF90YWlsX3Y4CQkvL3gzIHdhcyBsZXNzIHRoYW4gMzIKKwlsZDEJe3YxNy4yZH0sW3gyXSx4MTIJLy9sb2FkIFtyb3RhdGVkXSBJWzFdCisjaWZuZGVmIF9fQVJNRUJfXworCXJldjY0CXYxNy4xNmIsdjE3LjE2YgorI2VuZGlmCisJZXh0CXY3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKKwllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIJCS8vSVtpXV49WGkKKwlwbXVsbAl2NC4xcSx2MjAuMWQsdjcuMWQJCS8vSMK3SWkrMQorCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjcuMTZiCQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCXBtdWxsMgl2Ni4xcSx2MjAuMmQsdjcuMmQKKwliCUxvb3BfbW9kMnhfdjgKKworLmFsaWduCTQKK0xvb3BfbW9kMnhfdjg6CisJZXh0CXYxOC4xNmIsdjMuMTZiLHYzLjE2YiwjOAorCXN1YnMJeDMseDMsIzMyCQkvL2lzIHRoZXJlIG1vcmUgZGF0YT8KKwlwbXVsbAl2MC4xcSx2MjIuMWQsdjMuMWQJCS8vSF4yLmxvwrdYaS5sbworCWNzZWwJeDEyLHh6cix4MTIsbG8JCQkvL2lzIGl0IHRpbWUgdG8gemVybyB4MTI/CisKKwlwbXVsbAl2NS4xcSx2MjEuMWQsdjE3LjFkCisJZW9yCXYxOC4xNmIsdjE4LjE2Yix2My4xNmIJCS8vS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJcG11bGwyCXYyLjFxLHYyMi4yZCx2My4yZAkJLy9IXjIuaGnCt1hpLmhpCisJZW9yCXYwLjE2Yix2MC4xNmIsdjQuMTZiCQkvL2FjY3VtdWxhdGUKKwlwbXVsbDIJdjEuMXEsdjIxLjJkLHYxOC4yZAkJLy8oSF4yLmxvK0heMi5oaSnCtyhYaS5sbytYaS5oaSkKKwlsZDEJe3YxNi4yZH0sW3gyXSx4MTIJLy9sb2FkIFtyb3RhdGVkXSBJW2krMl0KKworCWVvcgl2Mi4xNmIsdjIuMTZiLHY2LjE2YgorCWNzZWwJeDEyLHh6cix4MTIsZXEJCQkvL2lzIGl0IHRpbWUgdG8gemVybyB4MTI/CisJZW9yCXYxLjE2Yix2MS4xNmIsdjUuMTZiCisKKwlleHQJdjE3LjE2Yix2MC4xNmIsdjIuMTZiLCM4CQkvL0thcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwllb3IJdjE4LjE2Yix2MC4xNmIsdjIuMTZiCisJZW9yCXYxLjE2Yix2MS4xNmIsdjE3LjE2YgorCWxkMQl7djE3LjJkfSxbeDJdLHgxMgkvL2xvYWQgW3JvdGF0ZWRdIElbaSszXQorI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTYuMTZiLHYxNi4xNmIKKyNlbmRpZgorCWVvcgl2MS4xNmIsdjEuMTZiLHYxOC4xNmIKKwlwbXVsbAl2MTguMXEsdjAuMWQsdjE5LjFkCQkvLzFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTcuMTZiLHYxNy4xNmIKKyNlbmRpZgorCWlucwl2Mi5kWzBdLHYxLmRbMV0KKwlpbnMJdjEuZFsxXSx2MC5kWzBdCisJZXh0CXY3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKKwlleHQJdjMuMTZiLHYxNi4xNmIsdjE2LjE2YiwjOAorCWVvcgl2MC4xNmIsdjEuMTZiLHYxOC4xNmIKKwlwbXVsbAl2NC4xcSx2MjAuMWQsdjcuMWQJCS8vSMK3SWkrMQorCWVvcgl2My4xNmIsdjMuMTZiLHYyLjE2YgkJLy9hY2N1bXVsYXRlIHYzLjE2YiBlYXJseQorCisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAkJLy8ybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisJcG11bGwJdjAuMXEsdjAuMWQsdjE5LjFkCisJZW9yCXYzLjE2Yix2My4xNmIsdjE4LjE2YgorCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjcuMTZiCQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgorCXBtdWxsMgl2Ni4xcSx2MjAuMmQsdjcuMmQKKwliLmhzCUxvb3BfbW9kMnhfdjgJCS8vdGhlcmUgd2FzIGF0IGxlYXN0IDMyIG1vcmUgYnl0ZXMKKworCWVvcgl2Mi4xNmIsdjIuMTZiLHYxOC4xNmIKKwlleHQJdjMuMTZiLHYxNi4xNmIsdjE2LjE2YiwjOAkJLy9yZS1jb25zdHJ1Y3QgdjMuMTZiCisJYWRkcwl4Myx4MywjMzIJCS8vcmUtY29uc3RydWN0IHgzCisJZW9yCXYwLjE2Yix2MC4xNmIsdjIuMTZiCQkvL3JlLWNvbnN0cnVjdCB2MC4xNmIKKwliLmVxCUxkb25lX3Y4CQkvL2lzIHgzIHplcm8/CitMb2RkX3RhaWxfdjg6CisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAorCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgkJLy9pbnBePVhpCisJZW9yCXYxNy4xNmIsdjE2LjE2Yix2MTguMTZiCQkvL3YxNy4xNmIgaXMgcm90YXRlZCBpbnBeWGkKKworCXBtdWxsCXYwLjFxLHYyMC4xZCx2My4xZAkJLy9ILmxvwrdYaS5sbworCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjMuMTZiCQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCXBtdWxsMgl2Mi4xcSx2MjAuMmQsdjMuMmQJCS8vSC5oacK3WGkuaGkKKwlwbXVsbAl2MS4xcSx2MjEuMWQsdjE3LjFkCQkvLyhILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisKKwlleHQJdjE3LjE2Yix2MC4xNmIsdjIuMTZiLCM4CQkvL0thcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwllb3IJdjE4LjE2Yix2MC4xNmIsdjIuMTZiCisJZW9yCXYxLjE2Yix2MS4xNmIsdjE3LjE2YgorCWVvcgl2MS4xNmIsdjEuMTZiLHYxOC4xNmIKKwlwbXVsbAl2MTguMXEsdjAuMWQsdjE5LjFkCQkvLzFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworCWlucwl2Mi5kWzBdLHYxLmRbMV0KKwlpbnMJdjEuZFsxXSx2MC5kWzBdCisJZW9yCXYwLjE2Yix2MS4xNmIsdjE4LjE2YgorCisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAkJLy8ybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisJcG11bGwJdjAuMXEsdjAuMWQsdjE5LjFkCisJZW9yCXYxOC4xNmIsdjE4LjE2Yix2Mi4xNmIKKwllb3IJdjAuMTZiLHYwLjE2Yix2MTguMTZiCisKK0xkb25lX3Y4OgorI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MC4xNmIsdjAuMTZiCisjZW5kaWYKKwlleHQJdjAuMTZiLHYwLjE2Yix2MC4xNmIsIzgKKwlzdDEJe3YwLjJkfSxbeDBdCQkvL3dyaXRlIG91dCBYaQorCisJcmV0CisKKy5ieXRlCTcxLDcyLDY1LDgzLDcyLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Niw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS1hcm12OC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY4LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5Y2RmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS1hcm12OC5TCkBAIC0wLDAgKzEsMTIyMiBAQAorI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKworLnRleHQKKworCisuZ2xvYmwJX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorLnByaXZhdGVfZXh0ZXJuCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKworLmFsaWduCTYKK19zaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisjaWZkZWYJX19JTFAzMl9fCisJbGRyc3cJeDE2LExPUEVOU1NMX2FybWNhcF9QCisjZWxzZQorCWxkcgl4MTYsTE9QRU5TU0xfYXJtY2FwX1AKKyNlbmRpZgorCWFkcgl4MTcsTE9QRU5TU0xfYXJtY2FwX1AKKwlhZGQJeDE2LHgxNix4MTcKKwlsZHIJdzE2LFt4MTZdCisJdHN0CXcxNiwjQVJNVjhfU0hBMQorCWIubmUJTHY4X2VudHJ5CisKKwlzdHAJeDI5LHgzMCxbc3AsIy05Nl0hCisJYWRkCXgyOSxzcCwjMAorCXN0cAl4MTkseDIwLFtzcCwjMTZdCisJc3RwCXgyMSx4MjIsW3NwLCMzMl0KKwlzdHAJeDIzLHgyNCxbc3AsIzQ4XQorCXN0cAl4MjUseDI2LFtzcCwjNjRdCisJc3RwCXgyNyx4MjgsW3NwLCM4MF0KKworCWxkcAl3MjAsdzIxLFt4MF0KKwlsZHAJdzIyLHcyMyxbeDAsIzhdCisJbGRyCXcyNCxbeDAsIzE2XQorCitMb29wOgorCWxkcgl4MyxbeDFdLCM2NAorCW1vdnoJdzI4LCMweDc5OTkKKwlzdWIJeDIseDIsIzEKKwltb3ZrCXcyOCwjMHg1YTgyLGxzbCMxNgorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4Myx4MywjMzIKKyNlbHNlCisJcmV2MzIJeDMseDMKKyNlbmRpZgorCWFkZAl3MjQsdzI0LHcyOAkJLy8gd2FybSBpdCB1cAorCWFkZAl3MjQsdzI0LHczCisJbHNyCXg0LHgzLCMzMgorCWxkcgl4NSxbeDEsIy01Nl0KKwliaWMJdzI1LHcyMyx3MjEKKwlhbmQJdzI2LHcyMix3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJYWRkCXcyMyx3MjMsdzQJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisjaWZkZWYJX19BUk1FQl9fCisJcm9yCXg1LHg1LCMzMgorI2Vsc2UKKwlyZXYzMgl4NSx4NQorI2VuZGlmCisJYmljCXcyNSx3MjIsdzIwCisJYW5kCXcyNix3MjEsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWFkZAl3MjIsdzIyLHc1CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCWxzcgl4Nix4NSwjMzIKKwlsZHIJeDcsW3gxLCMtNDhdCisJYmljCXcyNSx3MjEsdzI0CisJYW5kCXcyNix3MjAsdzI0CisJcm9yCXcyNyx3MjMsIzI3CisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzI0LHcyNCwjMgorCWFkZAl3MjEsdzIxLHc2CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4Nyx4NywjMzIKKyNlbHNlCisJcmV2MzIJeDcseDcKKyNlbmRpZgorCWJpYwl3MjUsdzIwLHcyMworCWFuZAl3MjYsdzI0LHcyMworCXJvcgl3MjcsdzIyLCMyNworCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMyx3MjMsIzIKKwlhZGQJdzIwLHcyMCx3NwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsc3IJeDgseDcsIzMyCisJbGRyCXg5LFt4MSwjLTQwXQorCWJpYwl3MjUsdzI0LHcyMgorCWFuZAl3MjYsdzIzLHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIwLHcyMCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMix3MjIsIzIKKwlhZGQJdzI0LHcyNCx3OAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKyNpZmRlZglfX0FSTUVCX18KKwlyb3IJeDkseDksIzMyCisjZWxzZQorCXJldjMyCXg5LHg5CisjZW5kaWYKKwliaWMJdzI1LHcyMyx3MjEKKwlhbmQJdzI2LHcyMix3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJYWRkCXcyMyx3MjMsdzkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJbHNyCXgxMCx4OSwjMzIKKwlsZHIJeDExLFt4MSwjLTMyXQorCWJpYwl3MjUsdzIyLHcyMAorCWFuZAl3MjYsdzIxLHcyMAorCXJvcgl3MjcsdzI0LCMyNworCWFkZAl3MjIsdzIyLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwlhZGQJdzIyLHcyMix3MTAJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisjaWZkZWYJX19BUk1FQl9fCisJcm9yCXgxMSx4MTEsIzMyCisjZWxzZQorCXJldjMyCXgxMSx4MTEKKyNlbmRpZgorCWJpYwl3MjUsdzIxLHcyNAorCWFuZAl3MjYsdzIwLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwlhZGQJdzIxLHcyMSx3MTEJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJbHNyCXgxMix4MTEsIzMyCisJbGRyCXgxMyxbeDEsIy0yNF0KKwliaWMJdzI1LHcyMCx3MjMKKwlhbmQJdzI2LHcyNCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyMSx3MjEsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjMsdzIzLCMyCisJYWRkCXcyMCx3MjAsdzEyCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4MTMseDEzLCMzMgorI2Vsc2UKKwlyZXYzMgl4MTMseDEzCisjZW5kaWYKKwliaWMJdzI1LHcyNCx3MjIKKwlhbmQJdzI2LHcyMyx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjIsdzIyLCMyCisJYWRkCXcyNCx3MjQsdzEzCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCWxzcgl4MTQseDEzLCMzMgorCWxkcgl4MTUsW3gxLCMtMTZdCisJYmljCXcyNSx3MjMsdzIxCisJYW5kCXcyNix3MjIsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjQsdzI0LHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIxLHcyMSwjMgorCWFkZAl3MjMsdzIzLHcxNAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKyNpZmRlZglfX0FSTUVCX18KKwlyb3IJeDE1LHgxNSwjMzIKKyNlbHNlCisJcmV2MzIJeDE1LHgxNQorI2VuZGlmCisJYmljCXcyNSx3MjIsdzIwCisJYW5kCXcyNix3MjEsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWFkZAl3MjIsdzIyLHcxNQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsc3IJeDE2LHgxNSwjMzIKKwlsZHIJeDE3LFt4MSwjLThdCisJYmljCXcyNSx3MjEsdzI0CisJYW5kCXcyNix3MjAsdzI0CisJcm9yCXcyNyx3MjMsIzI3CisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzI0LHcyNCwjMgorCWFkZAl3MjEsdzIxLHcxNgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKyNpZmRlZglfX0FSTUVCX18KKwlyb3IJeDE3LHgxNywjMzIKKyNlbHNlCisJcmV2MzIJeDE3LHgxNworI2VuZGlmCisJYmljCXcyNSx3MjAsdzIzCisJYW5kCXcyNix3MjQsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWFkZAl3MjAsdzIwLHcxNwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsc3IJeDE5LHgxNywjMzIKKwllb3IJdzMsdzMsdzUKKwliaWMJdzI1LHcyNCx3MjIKKwlhbmQJdzI2LHcyMyx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwllb3IJdzMsdzMsdzExCisJYWRkCXcyNCx3MjQsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwllb3IJdzMsdzMsdzE2CisJcm9yCXcyMix3MjIsIzIKKwlhZGQJdzI0LHcyNCx3MTkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXczLHczLCMzMQorCWVvcgl3NCx3NCx3NgorCWJpYwl3MjUsdzIzLHcyMQorCWFuZAl3MjYsdzIyLHcyMQorCXJvcgl3MjcsdzIwLCMyNworCWVvcgl3NCx3NCx3MTIKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCWVvcgl3NCx3NCx3MTcKKwlyb3IJdzIxLHcyMSwjMgorCWFkZAl3MjMsdzIzLHczCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3NCx3NCwjMzEKKwllb3IJdzUsdzUsdzcKKwliaWMJdzI1LHcyMix3MjAKKwlhbmQJdzI2LHcyMSx3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwllb3IJdzUsdzUsdzEzCisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwllb3IJdzUsdzUsdzE5CisJcm9yCXcyMCx3MjAsIzIKKwlhZGQJdzIyLHcyMix3NAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzUsdzUsIzMxCisJZW9yCXc2LHc2LHc4CisJYmljCXcyNSx3MjEsdzI0CisJYW5kCXcyNix3MjAsdzI0CisJcm9yCXcyNyx3MjMsIzI3CisJZW9yCXc2LHc2LHcxNAorCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJZW9yCXc2LHc2LHczCisJcm9yCXcyNCx3MjQsIzIKKwlhZGQJdzIxLHcyMSx3NQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzYsdzYsIzMxCisJZW9yCXc3LHc3LHc5CisJYmljCXcyNSx3MjAsdzIzCisJYW5kCXcyNix3MjQsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJZW9yCXc3LHc3LHcxNQorCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJZW9yCXc3LHc3LHc0CisJcm9yCXcyMyx3MjMsIzIKKwlhZGQJdzIwLHcyMCx3NgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzcsdzcsIzMxCisJbW92egl3MjgsIzB4ZWJhMQorCW1vdmsJdzI4LCMweDZlZDksbHNsIzE2CisJZW9yCXc4LHc4LHcxMAorCWJpYwl3MjUsdzI0LHcyMgorCWFuZAl3MjYsdzIzLHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWVvcgl3OCx3OCx3MTYKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCWVvcgl3OCx3OCx3NQorCXJvcgl3MjIsdzIyLCMyCisJYWRkCXcyNCx3MjQsdzcJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc4LHc4LCMzMQorCWVvcgl3OSx3OSx3MTEKKwllb3IJdzI1LHcyMyx3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc5LHc5LHcxNworCWVvcgl3MjUsdzI1LHcyMgorCWFkZAl3MjQsdzI0LHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIxLHcyMSwjMgorCWVvcgl3OSx3OSx3NgorCWFkZAl3MjMsdzIzLHc4CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3OSx3OSwjMzEKKwllb3IJdzEwLHcxMCx3MTIKKwllb3IJdzI1LHcyMix3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMCx3MTAsdzE5CisJZW9yCXcyNSx3MjUsdzIxCisJYWRkCXcyMyx3MjMsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjAsdzIwLCMyCisJZW9yCXcxMCx3MTAsdzcKKwlhZGQJdzIyLHcyMix3OQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEwLHcxMCwjMzEKKwllb3IJdzExLHcxMSx3MTMKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMSx3MTEsdzMKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzExLHcxMSx3OAorCWFkZAl3MjEsdzIxLHcxMAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzExLHcxMSwjMzEKKwllb3IJdzEyLHcxMix3MTQKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMix3MTIsdzQKKwllb3IJdzI1LHcyNSx3MjQKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzEyLHcxMix3OQorCWFkZAl3MjAsdzIwLHcxMQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEyLHcxMiwjMzEKKwllb3IJdzEzLHcxMyx3MTUKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMyx3MTMsdzUKKwllb3IJdzI1LHcyNSx3MjMKKwlhZGQJdzIwLHcyMCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMix3MjIsIzIKKwllb3IJdzEzLHcxMyx3MTAKKwlhZGQJdzI0LHcyNCx3MTIJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMyx3MTMsIzMxCisJZW9yCXcxNCx3MTQsdzE2CisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTQsdzE0LHc2CisJZW9yCXcyNSx3MjUsdzIyCisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXcxNCx3MTQsdzExCisJYWRkCXcyMyx3MjMsdzEzCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTQsdzE0LCMzMQorCWVvcgl3MTUsdzE1LHcxNworCWVvcgl3MjUsdzIyLHcyMAorCXJvcgl3MjcsdzI0LCMyNworCWFkZAl3MjIsdzIyLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE1LHcxNSx3NworCWVvcgl3MjUsdzI1LHcyMQorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWVvcgl3MTUsdzE1LHcxMgorCWFkZAl3MjIsdzIyLHcxNAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE1LHcxNSwjMzEKKwllb3IJdzE2LHcxNix3MTkKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNix3MTYsdzgKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzE2LHcxNix3MTMKKwlhZGQJdzIxLHcyMSx3MTUJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNix3MTYsIzMxCisJZW9yCXcxNyx3MTcsdzMKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNyx3MTcsdzkKKwllb3IJdzI1LHcyNSx3MjQKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzE3LHcxNyx3MTQKKwlhZGQJdzIwLHcyMCx3MTYJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNyx3MTcsIzMxCisJZW9yCXcxOSx3MTksdzQKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxOSx3MTksdzEwCisJZW9yCXcyNSx3MjUsdzIzCisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxOSx3MTksdzE1CisJYWRkCXcyNCx3MjQsdzE3CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTksdzE5LCMzMQorCWVvcgl3Myx3Myx3NQorCWVvcgl3MjUsdzIzLHcyMQorCXJvcgl3MjcsdzIwLCMyNworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzMsdzMsdzExCisJZW9yCXcyNSx3MjUsdzIyCisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXczLHczLHcxNgorCWFkZAl3MjMsdzIzLHcxOQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzMsdzMsIzMxCisJZW9yCXc0LHc0LHc2CisJZW9yCXcyNSx3MjIsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3NCx3NCx3MTIKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzQsdzQsdzE3CisJYWRkCXcyMix3MjIsdzMJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc0LHc0LCMzMQorCWVvcgl3NSx3NSx3NworCWVvcgl3MjUsdzIxLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzUsdzUsdzEzCisJZW9yCXcyNSx3MjUsdzIwCisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXc1LHc1LHcxOQorCWFkZAl3MjEsdzIxLHc0CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3NSx3NSwjMzEKKwllb3IJdzYsdzYsdzgKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc2LHc2LHcxNAorCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3Nix3Nix3MworCWFkZAl3MjAsdzIwLHc1CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3Nix3NiwjMzEKKwllb3IJdzcsdzcsdzkKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc3LHc3LHcxNQorCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3Nyx3Nyx3NAorCWFkZAl3MjQsdzI0LHc2CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3Nyx3NywjMzEKKwllb3IJdzgsdzgsdzEwCisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3OCx3OCx3MTYKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzgsdzgsdzUKKwlhZGQJdzIzLHcyMyx3NwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzgsdzgsIzMxCisJZW9yCXc5LHc5LHcxMQorCWVvcgl3MjUsdzIyLHcyMAorCXJvcgl3MjcsdzI0LCMyNworCWFkZAl3MjIsdzIyLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzksdzksdzE3CisJZW9yCXcyNSx3MjUsdzIxCisJYWRkCXcyMyx3MjMsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjAsdzIwLCMyCisJZW9yCXc5LHc5LHc2CisJYWRkCXcyMix3MjIsdzgJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc5LHc5LCMzMQorCWVvcgl3MTAsdzEwLHcxMgorCWVvcgl3MjUsdzIxLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzEwLHcxMCx3MTkKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzEwLHcxMCx3NworCWFkZAl3MjEsdzIxLHc5CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTAsdzEwLCMzMQorCWVvcgl3MTEsdzExLHcxMworCWVvcgl3MjUsdzIwLHcyMworCXJvcgl3MjcsdzIyLCMyNworCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzExLHcxMSx3MworCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3MTEsdzExLHc4CisJYWRkCXcyMCx3MjAsdzEwCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTEsdzExLCMzMQorCW1vdnoJdzI4LCMweGJjZGMKKwltb3ZrCXcyOCwjMHg4ZjFiLGxzbCMxNgorCWVvcgl3MTIsdzEyLHcxNAorCWVvcgl3MjUsdzI0LHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzEyLHcxMix3NAorCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3MTIsdzEyLHc5CisJYWRkCXcyNCx3MjQsdzExCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTIsdzEyLCMzMQorCW9ycgl3MjUsdzIxLHcyMgorCWFuZAl3MjYsdzIxLHcyMgorCWVvcgl3MTMsdzEzLHcxNQorCXJvcgl3MjcsdzIwLCMyNworCWFuZAl3MjUsdzI1LHcyMworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzEzLHcxMyx3NQorCWFkZAl3MjQsdzI0LHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIxLHcyMSwjMgorCWVvcgl3MTMsdzEzLHcxMAorCWFkZAl3MjMsdzIzLHcxMgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEzLHcxMywjMzEKKwlvcnIJdzI1LHcyMCx3MjEKKwlhbmQJdzI2LHcyMCx3MjEKKwllb3IJdzE0LHcxNCx3MTYKKwlyb3IJdzI3LHcyNCwjMjcKKwlhbmQJdzI1LHcyNSx3MjIKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNCx3MTQsdzYKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzE0LHcxNCx3MTEKKwlhZGQJdzIyLHcyMix3MTMJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNCx3MTQsIzMxCisJb3JyCXcyNSx3MjQsdzIwCisJYW5kCXcyNix3MjQsdzIwCisJZW9yCXcxNSx3MTUsdzE3CisJcm9yCXcyNyx3MjMsIzI3CisJYW5kCXcyNSx3MjUsdzIxCisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTUsdzE1LHc3CisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXcxNSx3MTUsdzEyCisJYWRkCXcyMSx3MjEsdzE0CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTUsdzE1LCMzMQorCW9ycgl3MjUsdzIzLHcyNAorCWFuZAl3MjYsdzIzLHcyNAorCWVvcgl3MTYsdzE2LHcxOQorCXJvcgl3MjcsdzIyLCMyNworCWFuZAl3MjUsdzI1LHcyMAorCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE2LHcxNix3OAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3MTYsdzE2LHcxMworCWFkZAl3MjAsdzIwLHcxNQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE2LHcxNiwjMzEKKwlvcnIJdzI1LHcyMix3MjMKKwlhbmQJdzI2LHcyMix3MjMKKwllb3IJdzE3LHcxNyx3MworCXJvcgl3MjcsdzIxLCMyNworCWFuZAl3MjUsdzI1LHcyNAorCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE3LHcxNyx3OQorCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3MTcsdzE3LHcxNAorCWFkZAl3MjQsdzI0LHcxNgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE3LHcxNywjMzEKKwlvcnIJdzI1LHcyMSx3MjIKKwlhbmQJdzI2LHcyMSx3MjIKKwllb3IJdzE5LHcxOSx3NAorCXJvcgl3MjcsdzIwLCMyNworCWFuZAl3MjUsdzI1LHcyMworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE5LHcxOSx3MTAKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzE5LHcxOSx3MTUKKwlhZGQJdzIzLHcyMyx3MTcJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxOSx3MTksIzMxCisJb3JyCXcyNSx3MjAsdzIxCisJYW5kCXcyNix3MjAsdzIxCisJZW9yCXczLHczLHc1CisJcm9yCXcyNyx3MjQsIzI3CisJYW5kCXcyNSx3MjUsdzIyCisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3Myx3Myx3MTEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzMsdzMsdzE2CisJYWRkCXcyMix3MjIsdzE5CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3Myx3MywjMzEKKwlvcnIJdzI1LHcyNCx3MjAKKwlhbmQJdzI2LHcyNCx3MjAKKwllb3IJdzQsdzQsdzYKKwlyb3IJdzI3LHcyMywjMjcKKwlhbmQJdzI1LHcyNSx3MjEKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc0LHc0LHcxMgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzI0LHcyNCwjMgorCWVvcgl3NCx3NCx3MTcKKwlhZGQJdzIxLHcyMSx3MwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzQsdzQsIzMxCisJb3JyCXcyNSx3MjMsdzI0CisJYW5kCXcyNix3MjMsdzI0CisJZW9yCXc1LHc1LHc3CisJcm9yCXcyNyx3MjIsIzI3CisJYW5kCXcyNSx3MjUsdzIwCisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3NSx3NSx3MTMKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzUsdzUsdzE5CisJYWRkCXcyMCx3MjAsdzQJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc1LHc1LCMzMQorCW9ycgl3MjUsdzIyLHcyMworCWFuZAl3MjYsdzIyLHcyMworCWVvcgl3Nix3Nix3OAorCXJvcgl3MjcsdzIxLCMyNworCWFuZAl3MjUsdzI1LHcyNAorCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzYsdzYsdzE0CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXc2LHc2LHczCisJYWRkCXcyNCx3MjQsdzUJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc2LHc2LCMzMQorCW9ycgl3MjUsdzIxLHcyMgorCWFuZAl3MjYsdzIxLHcyMgorCWVvcgl3Nyx3Nyx3OQorCXJvcgl3MjcsdzIwLCMyNworCWFuZAl3MjUsdzI1LHcyMworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzcsdzcsdzE1CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXc3LHc3LHc0CisJYWRkCXcyMyx3MjMsdzYJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc3LHc3LCMzMQorCW9ycgl3MjUsdzIwLHcyMQorCWFuZAl3MjYsdzIwLHcyMQorCWVvcgl3OCx3OCx3MTAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhbmQJdzI1LHcyNSx3MjIKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc4LHc4LHcxNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIwLHcyMCwjMgorCWVvcgl3OCx3OCx3NQorCWFkZAl3MjIsdzIyLHc3CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3OCx3OCwjMzEKKwlvcnIJdzI1LHcyNCx3MjAKKwlhbmQJdzI2LHcyNCx3MjAKKwllb3IJdzksdzksdzExCisJcm9yCXcyNyx3MjMsIzI3CisJYW5kCXcyNSx3MjUsdzIxCisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3OSx3OSx3MTcKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzksdzksdzYKKwlhZGQJdzIxLHcyMSx3OAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzksdzksIzMxCisJb3JyCXcyNSx3MjMsdzI0CisJYW5kCXcyNix3MjMsdzI0CisJZW9yCXcxMCx3MTAsdzEyCisJcm9yCXcyNyx3MjIsIzI3CisJYW5kCXcyNSx3MjUsdzIwCisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTAsdzEwLHcxOQorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3MTAsdzEwLHc3CisJYWRkCXcyMCx3MjAsdzkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMCx3MTAsIzMxCisJb3JyCXcyNSx3MjIsdzIzCisJYW5kCXcyNix3MjIsdzIzCisJZW9yCXcxMSx3MTEsdzEzCisJcm9yCXcyNyx3MjEsIzI3CisJYW5kCXcyNSx3MjUsdzI0CisJYWRkCXcyNCx3MjQsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTEsdzExLHczCisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxMSx3MTEsdzgKKwlhZGQJdzI0LHcyNCx3MTAJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMSx3MTEsIzMxCisJb3JyCXcyNSx3MjEsdzIyCisJYW5kCXcyNix3MjEsdzIyCisJZW9yCXcxMix3MTIsdzE0CisJcm9yCXcyNyx3MjAsIzI3CisJYW5kCXcyNSx3MjUsdzIzCisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTIsdzEyLHc0CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXcxMix3MTIsdzkKKwlhZGQJdzIzLHcyMyx3MTEJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMix3MTIsIzMxCisJb3JyCXcyNSx3MjAsdzIxCisJYW5kCXcyNix3MjAsdzIxCisJZW9yCXcxMyx3MTMsdzE1CisJcm9yCXcyNyx3MjQsIzI3CisJYW5kCXcyNSx3MjUsdzIyCisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTMsdzEzLHc1CisJYWRkCXcyMyx3MjMsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjAsdzIwLCMyCisJZW9yCXcxMyx3MTMsdzEwCisJYWRkCXcyMix3MjIsdzEyCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTMsdzEzLCMzMQorCW9ycgl3MjUsdzI0LHcyMAorCWFuZAl3MjYsdzI0LHcyMAorCWVvcgl3MTQsdzE0LHcxNgorCXJvcgl3MjcsdzIzLCMyNworCWFuZAl3MjUsdzI1LHcyMQorCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE0LHcxNCx3NgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzI0LHcyNCwjMgorCWVvcgl3MTQsdzE0LHcxMQorCWFkZAl3MjEsdzIxLHcxMwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE0LHcxNCwjMzEKKwlvcnIJdzI1LHcyMyx3MjQKKwlhbmQJdzI2LHcyMyx3MjQKKwllb3IJdzE1LHcxNSx3MTcKKwlyb3IJdzI3LHcyMiwjMjcKKwlhbmQJdzI1LHcyNSx3MjAKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNSx3MTUsdzcKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzE1LHcxNSx3MTIKKwlhZGQJdzIwLHcyMCx3MTQJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNSx3MTUsIzMxCisJbW92egl3MjgsIzB4YzFkNgorCW1vdmsJdzI4LCMweGNhNjIsbHNsIzE2CisJb3JyCXcyNSx3MjIsdzIzCisJYW5kCXcyNix3MjIsdzIzCisJZW9yCXcxNix3MTYsdzE5CisJcm9yCXcyNyx3MjEsIzI3CisJYW5kCXcyNSx3MjUsdzI0CisJYWRkCXcyNCx3MjQsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTYsdzE2LHc4CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxNix3MTYsdzEzCisJYWRkCXcyNCx3MjQsdzE1CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTYsdzE2LCMzMQorCWVvcgl3MTcsdzE3LHczCisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTcsdzE3LHc5CisJZW9yCXcyNSx3MjUsdzIyCisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXcxNyx3MTcsdzE0CisJYWRkCXcyMyx3MjMsdzE2CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTcsdzE3LCMzMQorCWVvcgl3MTksdzE5LHc0CisJZW9yCXcyNSx3MjIsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTksdzE5LHcxMAorCWVvcgl3MjUsdzI1LHcyMQorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWVvcgl3MTksdzE5LHcxNQorCWFkZAl3MjIsdzIyLHcxNwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE5LHcxOSwjMzEKKwllb3IJdzMsdzMsdzUKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXczLHczLHcxMQorCWVvcgl3MjUsdzI1LHcyMAorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzI0LHcyNCwjMgorCWVvcgl3Myx3Myx3MTYKKwlhZGQJdzIxLHcyMSx3MTkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXczLHczLCMzMQorCWVvcgl3NCx3NCx3NgorCWVvcgl3MjUsdzIwLHcyMworCXJvcgl3MjcsdzIyLCMyNworCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzQsdzQsdzEyCisJZW9yCXcyNSx3MjUsdzI0CisJYWRkCXcyMSx3MjEsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjMsdzIzLCMyCisJZW9yCXc0LHc0LHcxNworCWFkZAl3MjAsdzIwLHczCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3NCx3NCwjMzEKKwllb3IJdzUsdzUsdzcKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc1LHc1LHcxMworCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3NSx3NSx3MTkKKwlhZGQJdzI0LHcyNCx3NAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzUsdzUsIzMxCisJZW9yCXc2LHc2LHc4CisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3Nix3Nix3MTQKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzYsdzYsdzMKKwlhZGQJdzIzLHcyMyx3NQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzYsdzYsIzMxCisJZW9yCXc3LHc3LHc5CisJZW9yCXcyNSx3MjIsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3Nyx3Nyx3MTUKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzcsdzcsdzQKKwlhZGQJdzIyLHcyMix3NgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzcsdzcsIzMxCisJZW9yCXc4LHc4LHcxMAorCWVvcgl3MjUsdzIxLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzgsdzgsdzE2CisJZW9yCXcyNSx3MjUsdzIwCisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXc4LHc4LHc1CisJYWRkCXcyMSx3MjEsdzcJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc4LHc4LCMzMQorCWVvcgl3OSx3OSx3MTEKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc5LHc5LHcxNworCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3OSx3OSx3NgorCWFkZAl3MjAsdzIwLHc4CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3OSx3OSwjMzEKKwllb3IJdzEwLHcxMCx3MTIKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMCx3MTAsdzE5CisJZW9yCXcyNSx3MjUsdzIzCisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxMCx3MTAsdzcKKwlhZGQJdzI0LHcyNCx3OQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEwLHcxMCwjMzEKKwllb3IJdzExLHcxMSx3MTMKKwllb3IJdzI1LHcyMyx3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMSx3MTEsdzMKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzExLHcxMSx3OAorCWFkZAl3MjMsdzIzLHcxMAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzExLHcxMSwjMzEKKwllb3IJdzEyLHcxMix3MTQKKwllb3IJdzI1LHcyMix3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMix3MTIsdzQKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzEyLHcxMix3OQorCWFkZAl3MjIsdzIyLHcxMQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEyLHcxMiwjMzEKKwllb3IJdzEzLHcxMyx3MTUKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMyx3MTMsdzUKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzEzLHcxMyx3MTAKKwlhZGQJdzIxLHcyMSx3MTIJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMyx3MTMsIzMxCisJZW9yCXcxNCx3MTQsdzE2CisJZW9yCXcyNSx3MjAsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTQsdzE0LHc2CisJZW9yCXcyNSx3MjUsdzI0CisJYWRkCXcyMSx3MjEsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjMsdzIzLCMyCisJZW9yCXcxNCx3MTQsdzExCisJYWRkCXcyMCx3MjAsdzEzCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTQsdzE0LCMzMQorCWVvcgl3MTUsdzE1LHcxNworCWVvcgl3MjUsdzI0LHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE1LHcxNSx3NworCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3MTUsdzE1LHcxMgorCWFkZAl3MjQsdzI0LHcxNAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE1LHcxNSwjMzEKKwllb3IJdzE2LHcxNix3MTkKKwllb3IJdzI1LHcyMyx3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNix3MTYsdzgKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzE2LHcxNix3MTMKKwlhZGQJdzIzLHcyMyx3MTUJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNix3MTYsIzMxCisJZW9yCXcxNyx3MTcsdzMKKwllb3IJdzI1LHcyMix3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNyx3MTcsdzkKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzE3LHcxNyx3MTQKKwlhZGQJdzIyLHcyMix3MTYJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNyx3MTcsIzMxCisJZW9yCXcxOSx3MTksdzQKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxOSx3MTksdzEwCisJZW9yCXcyNSx3MjUsdzIwCisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXcxOSx3MTksdzE1CisJYWRkCXcyMSx3MjEsdzE3CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTksdzE5LCMzMQorCWxkcAl3NCx3NSxbeDBdCisJZW9yCXcyNSx3MjAsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWFkZAl3MjAsdzIwLHcxOQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsZHAJdzYsdzcsW3gwLCM4XQorCWVvcgl3MjUsdzI0LHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWxkcgl3OCxbeDAsIzE2XQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlhZGQJdzIxLHcyMSx3NQorCWFkZAl3MjIsdzIyLHc2CisJYWRkCXcyMCx3MjAsdzQKKwlhZGQJdzIzLHcyMyx3NworCWFkZAl3MjQsdzI0LHc4CisJc3RwCXcyMCx3MjEsW3gwXQorCXN0cAl3MjIsdzIzLFt4MCwjOF0KKwlzdHIJdzI0LFt4MCwjMTZdCisJY2Juegl4MixMb29wCisKKwlsZHAJeDE5LHgyMCxbc3AsIzE2XQorCWxkcAl4MjEseDIyLFtzcCwjMzJdCisJbGRwCXgyMyx4MjQsW3NwLCM0OF0KKwlsZHAJeDI1LHgyNixbc3AsIzY0XQorCWxkcAl4MjcseDI4LFtzcCwjODBdCisJbGRyCXgyOSxbc3BdLCM5NgorCXJldAorCisKKy5hbGlnbgk2CitzaGExX2Jsb2NrX2FybXY4OgorTHY4X2VudHJ5OgorCXN0cAl4MjkseDMwLFtzcCwjLTE2XSEKKwlhZGQJeDI5LHNwLCMwCisKKwlhZHIJeDQsTGNvbnN0CisJZW9yCXYxLjE2Yix2MS4xNmIsdjEuMTZiCisJbGQxCXt2MC40c30sW3gwXSwjMTYKKwlsZDEJe3YxLnN9WzBdLFt4MF0KKwlzdWIJeDAseDAsIzE2CisJbGQxCXt2MTYuNHMsdjE3LjRzLHYxOC40cyx2MTkuNHN9LFt4NF0KKworTG9vcF9odzoKKwlsZDEJe3Y0LjE2Yix2NS4xNmIsdjYuMTZiLHY3LjE2Yn0sW3gxXSwjNjQKKwlzdWIJeDIseDIsIzEKKwlyZXYzMgl2NC4xNmIsdjQuMTZiCisJcmV2MzIJdjUuMTZiLHY1LjE2YgorCisJYWRkCXYyMC40cyx2MTYuNHMsdjQuNHMKKwlyZXYzMgl2Ni4xNmIsdjYuMTZiCisJb3JyCXYyMi4xNmIsdjAuMTZiLHYwLjE2YgkvLyBvZmZsb2FkCisKKwlhZGQJdjIxLjRzLHYxNi40cyx2NS40cworCXJldjMyCXY3LjE2Yix2Ny4xNmIKKy5sb25nCTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCisubG9uZwkweDVlMTQwMDIwCS8vc2hhMWMgdjAuMTZiLHYxLjE2Yix2MjAuNHMJCS8vIDAKKwlhZGQJdjIwLjRzLHYxNi40cyx2Ni40cworLmxvbmcJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5sb25nCTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAxCisubG9uZwkweDVlMTUwMDYwCS8vc2hhMWMgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNi40cyx2Ny40cworLmxvbmcJMHg1ZTI4MThlNAkvL3NoYTFzdTEgdjQuMTZiLHY3LjE2YgorLmxvbmcJMHg1ZTA3MzBjNQkvL3NoYTFzdTAgdjUuMTZiLHY2LjE2Yix2Ny4xNmIKKy5sb25nCTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyAyCisubG9uZwkweDVlMTQwMDQwCS8vc2hhMWMgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxNi40cyx2NC40cworLmxvbmcJMHg1ZTI4MTg4NQkvL3NoYTFzdTEgdjUuMTZiLHY0LjE2YgorLmxvbmcJMHg1ZTA0MzBlNgkvL3NoYTFzdTAgdjYuMTZiLHY3LjE2Yix2NC4xNmIKKy5sb25nCTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAzCisubG9uZwkweDVlMTUwMDYwCS8vc2hhMWMgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNy40cyx2NS40cworLmxvbmcJMHg1ZTI4MThhNgkvL3NoYTFzdTEgdjYuMTZiLHY1LjE2YgorLmxvbmcJMHg1ZTA1MzA4NwkvL3NoYTFzdTAgdjcuMTZiLHY0LjE2Yix2NS4xNmIKKy5sb25nCTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyA0CisubG9uZwkweDVlMTQwMDQwCS8vc2hhMWMgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxNy40cyx2Ni40cworLmxvbmcJMHg1ZTI4MThjNwkvL3NoYTFzdTEgdjcuMTZiLHY2LjE2YgorLmxvbmcJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5sb25nCTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyA1CisubG9uZwkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNy40cyx2Ny40cworLmxvbmcJMHg1ZTI4MThlNAkvL3NoYTFzdTEgdjQuMTZiLHY3LjE2YgorLmxvbmcJMHg1ZTA3MzBjNQkvL3NoYTFzdTAgdjUuMTZiLHY2LjE2Yix2Ny4xNmIKKy5sb25nCTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyA2CisubG9uZwkweDVlMTQxMDQwCS8vc2hhMXAgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxNy40cyx2NC40cworLmxvbmcJMHg1ZTI4MTg4NQkvL3NoYTFzdTEgdjUuMTZiLHY0LjE2YgorLmxvbmcJMHg1ZTA0MzBlNgkvL3NoYTFzdTAgdjYuMTZiLHY3LjE2Yix2NC4xNmIKKy5sb25nCTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyA3CisubG9uZwkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNy40cyx2NS40cworLmxvbmcJMHg1ZTI4MThhNgkvL3NoYTFzdTEgdjYuMTZiLHY1LjE2YgorLmxvbmcJMHg1ZTA1MzA4NwkvL3NoYTFzdTAgdjcuMTZiLHY0LjE2Yix2NS4xNmIKKy5sb25nCTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyA4CisubG9uZwkweDVlMTQxMDQwCS8vc2hhMXAgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxOC40cyx2Ni40cworLmxvbmcJMHg1ZTI4MThjNwkvL3NoYTFzdTEgdjcuMTZiLHY2LjE2YgorLmxvbmcJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5sb25nCTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyA5CisubG9uZwkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxOC40cyx2Ny40cworLmxvbmcJMHg1ZTI4MThlNAkvL3NoYTFzdTEgdjQuMTZiLHY3LjE2YgorLmxvbmcJMHg1ZTA3MzBjNQkvL3NoYTFzdTAgdjUuMTZiLHY2LjE2Yix2Ny4xNmIKKy5sb25nCTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyAxMAorLmxvbmcJMHg1ZTE0MjA0MAkvL3NoYTFtIHYwLjE2Yix2Mi4xNmIsdjIwLjRzCisJYWRkCXYyMC40cyx2MTguNHMsdjQuNHMKKy5sb25nCTB4NWUyODE4ODUJLy9zaGExc3UxIHY1LjE2Yix2NC4xNmIKKy5sb25nCTB4NWUwNDMwZTYJLy9zaGExc3UwIHY2LjE2Yix2Ny4xNmIsdjQuMTZiCisubG9uZwkweDVlMjgwODAyCS8vc2hhMWggdjIuMTZiLHYwLjE2YgkJLy8gMTEKKy5sb25nCTB4NWUxNTIwNjAJLy9zaGExbSB2MC4xNmIsdjMuMTZiLHYyMS40cworCWFkZAl2MjEuNHMsdjE4LjRzLHY1LjRzCisubG9uZwkweDVlMjgxOGE2CS8vc2hhMXN1MSB2Ni4xNmIsdjUuMTZiCisubG9uZwkweDVlMDUzMDg3CS8vc2hhMXN1MCB2Ny4xNmIsdjQuMTZiLHY1LjE2YgorLmxvbmcJMHg1ZTI4MDgwMwkvL3NoYTFoIHYzLjE2Yix2MC4xNmIJCS8vIDEyCisubG9uZwkweDVlMTQyMDQwCS8vc2hhMW0gdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxOC40cyx2Ni40cworLmxvbmcJMHg1ZTI4MThjNwkvL3NoYTFzdTEgdjcuMTZiLHY2LjE2YgorLmxvbmcJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5sb25nCTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAxMworLmxvbmcJMHg1ZTE1MjA2MAkvL3NoYTFtIHYwLjE2Yix2My4xNmIsdjIxLjRzCisJYWRkCXYyMS40cyx2MTkuNHMsdjcuNHMKKy5sb25nCTB4NWUyODE4ZTQJLy9zaGExc3UxIHY0LjE2Yix2Ny4xNmIKKy5sb25nCTB4NWUwNzMwYzUJLy9zaGExc3UwIHY1LjE2Yix2Ni4xNmIsdjcuMTZiCisubG9uZwkweDVlMjgwODAzCS8vc2hhMWggdjMuMTZiLHYwLjE2YgkJLy8gMTQKKy5sb25nCTB4NWUxNDIwNDAJLy9zaGExbSB2MC4xNmIsdjIuMTZiLHYyMC40cworCWFkZAl2MjAuNHMsdjE5LjRzLHY0LjRzCisubG9uZwkweDVlMjgxODg1CS8vc2hhMXN1MSB2NS4xNmIsdjQuMTZiCisubG9uZwkweDVlMDQzMGU2CS8vc2hhMXN1MCB2Ni4xNmIsdjcuMTZiLHY0LjE2YgorLmxvbmcJMHg1ZTI4MDgwMgkvL3NoYTFoIHYyLjE2Yix2MC4xNmIJCS8vIDE1CisubG9uZwkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxOS40cyx2NS40cworLmxvbmcJMHg1ZTI4MThhNgkvL3NoYTFzdTEgdjYuMTZiLHY1LjE2YgorLmxvbmcJMHg1ZTA1MzA4NwkvL3NoYTFzdTAgdjcuMTZiLHY0LjE2Yix2NS4xNmIKKy5sb25nCTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyAxNgorLmxvbmcJMHg1ZTE0MTA0MAkvL3NoYTFwIHYwLjE2Yix2Mi4xNmIsdjIwLjRzCisJYWRkCXYyMC40cyx2MTkuNHMsdjYuNHMKKy5sb25nCTB4NWUyODE4YzcJLy9zaGExc3UxIHY3LjE2Yix2Ni4xNmIKKy5sb25nCTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAxNworLmxvbmcJMHg1ZTE1MTA2MAkvL3NoYTFwIHYwLjE2Yix2My4xNmIsdjIxLjRzCisJYWRkCXYyMS40cyx2MTkuNHMsdjcuNHMKKworLmxvbmcJMHg1ZTI4MDgwMwkvL3NoYTFoIHYzLjE2Yix2MC4xNmIJCS8vIDE4CisubG9uZwkweDVlMTQxMDQwCS8vc2hhMXAgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKworLmxvbmcJMHg1ZTI4MDgwMgkvL3NoYTFoIHYyLjE2Yix2MC4xNmIJCS8vIDE5CisubG9uZwkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKworCWFkZAl2MS40cyx2MS40cyx2Mi40cworCWFkZAl2MC40cyx2MC40cyx2MjIuNHMKKworCWNibnoJeDIsTG9vcF9odworCisJc3QxCXt2MC40c30sW3gwXSwjMTYKKwlzdDEJe3YxLnN9WzBdLFt4MF0KKworCWxkcgl4MjksW3NwXSwjMTYKKwlyZXQKKworLmFsaWduCTYKK0xjb25zdDoKKy5sb25nCTB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkJLy9LXzAwXzE5CisubG9uZwkweDZlZDllYmExLDB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSwweDZlZDllYmExCS8vS18yMF8zOQorLmxvbmcJMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMsMHg4ZjFiYmNkYwkvL0tfNDBfNTkKKy5sb25nCTB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYJLy9LXzYwXzc5CitMT1BFTlNTTF9hcm1jYXBfUDoKKyNpZmRlZglfX0lMUDMyX18KKy5sb25nCV9PUEVOU1NMX2FybWNhcF9QLS4KKyNlbHNlCisucXVhZAlfT1BFTlNTTF9hcm1jYXBfUC0uCisjZW5kaWYKKy5ieXRlCTgzLDcyLDY1LDQ5LDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcsMTEwLDExNSwxMDIsMTExLDExNCwxMDksMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorLmNvbW0JX09QRU5TU0xfYXJtY2FwX1AsNCw0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni1hcm12OC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYtYXJtdjguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzgxMWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYtYXJtdjguUwpAQCAtMCwwICsxLDEyMDEgQEAKKy8vIENvcHlyaWdodCAyMDE0LTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCisvLyB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorLy8gaW4gdGhlIGZpbGUgTElDRU5TRSBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvciBhdAorLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisvLyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisvLyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorLy8gZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisvLworLy8gUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMdjIgdGVybXMgaXMgZ3JhbnRlZC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gU0hBMjU2LzUxMiBmb3IgQVJNdjguCisvLworLy8gUGVyZm9ybWFuY2UgaW4gY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnQKKy8vIG92ZXIgY29kZSBnZW5lcmF0ZWQgd2l0aCAiZGVmYXVsdCIgY29tcGlsZXI6CisvLworLy8JCVNIQTI1Ni1odwlTSEEyNTYoKikJU0hBNTEyCisvLyBBcHBsZSBBNwkxLjk3CQkxMC41ICgrMzMlKQk2LjczICgtMSUoKiopKQorLy8gQ29ydGV4LUE1MwkyLjM4CQkxNS41ICgrMTE1JSkJMTAuMCAoKzE1MCUoKioqKSkKKy8vIENvcnRleC1BNTcJMi4zMQkJMTEuNiAoKzg2JSkJNy41MSAoKzI2MCUoKioqKSkKKy8vIERlbnZlcgkyLjAxCQkxMC41ICgrMjYlKQk2LjcwICgrOCUpCisvLyBYLUdlbmUJCQkyMC4wICgrMTAwJSkJMTIuOCAoKzMwMCUoKioqKSkKKy8vIE1vbmdvb3NlCTIuMzYJCTEzLjAgKCs1MCUpCTguMzYgKCszMyUpCisvLworLy8gKCopCVNvZnR3YXJlIFNIQTI1NiByZXN1bHRzIGFyZSBvZiBsZXNzZXIgcmVsZXZhbmNlLCBwcmVzZW50ZWQKKy8vCW1vc3RseSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3Nlcy4KKy8vICgqKikJVGhlIHJlc3VsdCBpcyBhIHRyYWRlLW9mZjogaXQncyBwb3NzaWJsZSB0byBpbXByb3ZlIGl0IGJ5CisvLwkxMCUgKG9yIGJ5IDEgY3ljbGUgcGVyIHJvdW5kKSwgYnV0IGF0IHRoZSBjb3N0IG9mIDIwJSBsb3NzCisvLwlvbiBDb3J0ZXgtQTUzIChvciBieSA0IGN5Y2xlcyBwZXIgcm91bmQpLgorLy8gKCoqKikJU3VwZXItaW1wcmVzc2l2ZSBjb2VmZmljaWVudHMgb3ZlciBnY2MtZ2VuZXJhdGVkIGNvZGUgYXJlCisvLwlpbmRpY2F0aW9uIG9mIHNvbWUgY29tcGlsZXIgInBhdGhvbG9neSIsIG1vc3Qgbm90YWJseSBjb2RlCisvLwlnZW5lcmF0ZWQgd2l0aCAtbWdlbmVyYWwtcmVncy1vbmx5IGlzIHNpZ25pZmljYW50eSBmYXN0ZXIKKy8vCWFuZCB0aGUgZ2FwIGlzIG9ubHkgNDAtOTAlLgorCisjaWZuZGVmCV9fS0VSTkVMX18KKyMgaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2VuZGlmCisKKy50ZXh0CisKKworLmdsb2JsCV9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLnByaXZhdGVfZXh0ZXJuCV9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorCisuYWxpZ24JNgorX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyOgorI2lmbmRlZglfX0tFUk5FTF9fCisjIGlmZGVmCV9fSUxQMzJfXworCWxkcnN3CXgxNixMT1BFTlNTTF9hcm1jYXBfUAorIyBlbHNlCisJbGRyCXgxNixMT1BFTlNTTF9hcm1jYXBfUAorIyBlbmRpZgorCWFkcgl4MTcsTE9QRU5TU0xfYXJtY2FwX1AKKwlhZGQJeDE2LHgxNix4MTcKKwlsZHIJdzE2LFt4MTZdCisJdHN0CXcxNiwjQVJNVjhfU0hBMjU2CisJYi5uZQlMdjhfZW50cnkKKyNlbmRpZgorCXN0cAl4MjkseDMwLFtzcCwjLTEyOF0hCisJYWRkCXgyOSxzcCwjMAorCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisJc3RwCXgyNSx4MjYsW3NwLCM2NF0KKwlzdHAJeDI3LHgyOCxbc3AsIzgwXQorCXN1YglzcCxzcCwjNCo0CisKKwlsZHAJdzIwLHcyMSxbeDBdCQkJCS8vIGxvYWQgY29udGV4dAorCWxkcAl3MjIsdzIzLFt4MCwjMio0XQorCWxkcAl3MjQsdzI1LFt4MCwjNCo0XQorCWFkZAl4Mix4MSx4Mixsc2wjNgkvLyBlbmQgb2YgaW5wdXQKKwlsZHAJdzI2LHcyNyxbeDAsIzYqNF0KKwlhZHIJeDMwLExLMjU2CisJc3RwCXgwLHgyLFt4MjksIzk2XQorCitMb29wOgorCWxkcAl3Myx3NCxbeDFdLCMyKjQKKwlsZHIJdzE5LFt4MzBdLCM0CQkJLy8gKksrKworCWVvcgl3MjgsdzIxLHcyMgkJCQkvLyBtYWdpYyBzZWVkCisJc3RyCXgxLFt4MjksIzExMl0KKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXczLHczCQkJLy8gMAorI2VuZGlmCisJcm9yCXcxNix3MjQsIzYKKwlhZGQJdzI3LHcyNyx3MTkJCQkvLyBoKz1LW2ldCisJZW9yCXc2LHcyNCx3MjQscm9yIzE0CisJYW5kCXcxNyx3MjUsdzI0CisJYmljCXcxOSx3MjYsdzI0CisJYWRkCXcyNyx3MjcsdzMJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjAsdzIxCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHc2LHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzYsdzIwLCMyCisJYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjAsdzIwLHJvciM5CisJYWRkCXcyNyx3MjcsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyMyx3MjMsdzI3CQkJLy8gZCs9aAorCWVvcgl3MjgsdzI4LHcyMQkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc2LHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyNyx3MjcsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzI3LHcyNyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXc0LHc0CQkJLy8gMQorI2VuZGlmCisJbGRwCXc1LHc2LFt4MV0sIzIqNAorCWFkZAl3MjcsdzI3LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl3MTYsdzIzLCM2CisJYWRkCXcyNix3MjYsdzI4CQkJLy8gaCs9S1tpXQorCWVvcgl3Nyx3MjMsdzIzLHJvciMxNAorCWFuZAl3MTcsdzI0LHcyMworCWJpYwl3MjgsdzI1LHcyMworCWFkZAl3MjYsdzI2LHc0CQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzI3LHcyMAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3Nyxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXc3LHcyNywjMgorCWFkZAl3MjYsdzI2LHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzI3LHcyNyxyb3IjOQorCWFkZAl3MjYsdzI2LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MTksdzE5LHcyOAkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjIsdzIyLHcyNgkJCS8vIGQrPWgKKwllb3IJdzE5LHcxOSx3MjAJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3Nyx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjYsdzI2LHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyNix3MjYsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3NSx3NQkJCS8vIDIKKyNlbmRpZgorCWFkZAl3MjYsdzI2LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl3MTYsdzIyLCM2CisJYWRkCXcyNSx3MjUsdzE5CQkJLy8gaCs9S1tpXQorCWVvcgl3OCx3MjIsdzIyLHJvciMxNAorCWFuZAl3MTcsdzIzLHcyMgorCWJpYwl3MTksdzI0LHcyMgorCWFkZAl3MjUsdzI1LHc1CQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzI2LHcyNwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3OCxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXc4LHcyNiwjMgorCWFkZAl3MjUsdzI1LHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzI2LHcyNixyb3IjOQorCWFkZAl3MjUsdzI1LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjEsdzIxLHcyNQkJCS8vIGQrPWgKKwllb3IJdzI4LHcyOCx3MjcJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3OCx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjUsdzI1LHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyNSx3MjUsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3Nix3NgkJCS8vIDMKKyNlbmRpZgorCWxkcAl3Nyx3OCxbeDFdLCMyKjQKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyMSwjNgorCWFkZAl3MjQsdzI0LHcyOAkJCS8vIGgrPUtbaV0KKwllb3IJdzksdzIxLHcyMSxyb3IjMTQKKwlhbmQJdzE3LHcyMix3MjEKKwliaWMJdzI4LHcyMyx3MjEKKwlhZGQJdzI0LHcyNCx3NgkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyNSx3MjYJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzkscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3OSx3MjUsIzIKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyNSx3MjUscm9yIzkKKwlhZGQJdzI0LHcyNCx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzIwLHcyMCx3MjQJCQkvLyBkKz1oCisJZW9yCXcxOSx3MTksdzI2CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzksdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzI0LHcyNCx3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjQsdzI0LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzcsdzcJCQkvLyA0CisjZW5kaWYKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyMCwjNgorCWFkZAl3MjMsdzIzLHcxOQkJCS8vIGgrPUtbaV0KKwllb3IJdzEwLHcyMCx3MjAscm9yIzE0CisJYW5kCXcxNyx3MjEsdzIwCisJYmljCXcxOSx3MjIsdzIwCisJYWRkCXcyMyx3MjMsdzcJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjQsdzI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcxMCxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXcxMCx3MjQsIzIKKwlhZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyNCx3MjQscm9yIzkKKwlhZGQJdzIzLHcyMyx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzI3LHcyNyx3MjMJCQkvLyBkKz1oCisJZW9yCXcyOCx3MjgsdzI1CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzEwLHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyMyx3MjMsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXc4LHc4CQkJLy8gNQorI2VuZGlmCisJbGRwCXc5LHcxMCxbeDFdLCMyKjQKKwlhZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyNywjNgorCWFkZAl3MjIsdzIyLHcyOAkJCS8vIGgrPUtbaV0KKwllb3IJdzExLHcyNyx3Mjcscm9yIzE0CisJYW5kCXcxNyx3MjAsdzI3CisJYmljCXcyOCx3MjEsdzI3CisJYWRkCXcyMix3MjIsdzgJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjMsdzI0CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcxMSxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXcxMSx3MjMsIzIKKwlhZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyMyx3MjMscm9yIzkKKwlhZGQJdzIyLHcyMix3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzI2LHcyNix3MjIJCQkvLyBkKz1oCisJZW9yCXcxOSx3MTksdzI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzExLHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyMix3MjIsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXc5LHc5CQkJLy8gNgorI2VuZGlmCisJYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXcxNix3MjYsIzYKKwlhZGQJdzIxLHcyMSx3MTkJCQkvLyBoKz1LW2ldCisJZW9yCXcxMix3MjYsdzI2LHJvciMxNAorCWFuZAl3MTcsdzI3LHcyNgorCWJpYwl3MTksdzIwLHcyNgorCWFkZAl3MjEsdzIxLHc5CQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzIyLHcyMwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MTIscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3MTIsdzIyLCMyCisJYWRkCXcyMSx3MjEsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjIsdzIyLHJvciM5CisJYWRkCXcyMSx3MjEsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyNSx3MjUsdzIxCQkJLy8gZCs9aAorCWVvcgl3MjgsdzI4LHcyMwkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMix3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjEsdzIxLHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyMSx3MjEsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3MTAsdzEwCQkJLy8gNworI2VuZGlmCisJbGRwCXcxMSx3MTIsW3gxXSwjMio0CisJYWRkCXcyMSx3MjEsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXcxNix3MjUsIzYKKwlhZGQJdzIwLHcyMCx3MjgJCQkvLyBoKz1LW2ldCisJZW9yCXcxMyx3MjUsdzI1LHJvciMxNAorCWFuZAl3MTcsdzI2LHcyNQorCWJpYwl3MjgsdzI3LHcyNQorCWFkZAl3MjAsdzIwLHcxMAkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyMSx3MjIJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzEzLHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzEzLHcyMSwjMgorCWFkZAl3MjAsdzIwLHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzIxLHcyMSxyb3IjOQorCWFkZAl3MjAsdzIwLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MTksdzE5LHcyOAkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjQsdzI0LHcyMAkJCS8vIGQrPWgKKwllb3IJdzE5LHcxOSx3MjIJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MTMsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzIwLHcyMCx3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjAsdzIwLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzExLHcxMQkJCS8vIDgKKyNlbmRpZgorCWFkZAl3MjAsdzIwLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl3MTYsdzI0LCM2CisJYWRkCXcyNyx3MjcsdzE5CQkJLy8gaCs9S1tpXQorCWVvcgl3MTQsdzI0LHcyNCxyb3IjMTQKKwlhbmQJdzE3LHcyNSx3MjQKKwliaWMJdzE5LHcyNix3MjQKKwlhZGQJdzI3LHcyNyx3MTEJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjAsdzIxCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcxNCxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXcxNCx3MjAsIzIKKwlhZGQJdzI3LHcyNyx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyMCx3MjAscm9yIzkKKwlhZGQJdzI3LHcyNyx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzIzLHcyMyx3MjcJCQkvLyBkKz1oCisJZW9yCXcyOCx3MjgsdzIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzE0LHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyNyx3MjcsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzI3LHcyNyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXcxMix3MTIJCQkvLyA5CisjZW5kaWYKKwlsZHAJdzEzLHcxNCxbeDFdLCMyKjQKKwlhZGQJdzI3LHcyNyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyMywjNgorCWFkZAl3MjYsdzI2LHcyOAkJCS8vIGgrPUtbaV0KKwllb3IJdzE1LHcyMyx3MjMscm9yIzE0CisJYW5kCXcxNyx3MjQsdzIzCisJYmljCXcyOCx3MjUsdzIzCisJYWRkCXcyNix3MjYsdzEyCQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzI3LHcyMAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MTUscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3MTUsdzI3LCMyCisJYWRkCXcyNix3MjYsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjcsdzI3LHJvciM5CisJYWRkCXcyNix3MjYsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyMix3MjIsdzI2CQkJLy8gZCs9aAorCWVvcgl3MTksdzE5LHcyMAkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxNSx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjYsdzI2LHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyNix3MjYsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3MTMsdzEzCQkJLy8gMTAKKyNlbmRpZgorCWFkZAl3MjYsdzI2LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl3MTYsdzIyLCM2CisJYWRkCXcyNSx3MjUsdzE5CQkJLy8gaCs9S1tpXQorCWVvcgl3MCx3MjIsdzIyLHJvciMxNAorCWFuZAl3MTcsdzIzLHcyMgorCWJpYwl3MTksdzI0LHcyMgorCWFkZAl3MjUsdzI1LHcxMwkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyNix3MjcJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzAscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3MCx3MjYsIzIKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyNix3MjYscm9yIzkKKwlhZGQJdzI1LHcyNSx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzIxLHcyMSx3MjUJCQkvLyBkKz1oCisJZW9yCXcyOCx3MjgsdzI3CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzAsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzI1LHcyNSx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjUsdzI1LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzE0LHcxNAkJCS8vIDExCisjZW5kaWYKKwlsZHAJdzE1LHcwLFt4MV0sIzIqNAorCWFkZAl3MjUsdzI1LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXN0cgl3Nixbc3AsIzEyXQorCXJvcgl3MTYsdzIxLCM2CisJYWRkCXcyNCx3MjQsdzI4CQkJLy8gaCs9S1tpXQorCWVvcgl3Nix3MjEsdzIxLHJvciMxNAorCWFuZAl3MTcsdzIyLHcyMQorCWJpYwl3MjgsdzIzLHcyMQorCWFkZAl3MjQsdzI0LHcxNAkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyNSx3MjYJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzYscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3Nix3MjUsIzIKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyNSx3MjUscm9yIzkKKwlhZGQJdzI0LHcyNCx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzIwLHcyMCx3MjQJCQkvLyBkKz1oCisJZW9yCXcxOSx3MTksdzI2CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzYsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzI0LHcyNCx3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjQsdzI0LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzE1LHcxNQkJCS8vIDEyCisjZW5kaWYKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJdzcsW3NwLCMwXQorCXJvcgl3MTYsdzIwLCM2CisJYWRkCXcyMyx3MjMsdzE5CQkJLy8gaCs9S1tpXQorCWVvcgl3Nyx3MjAsdzIwLHJvciMxNAorCWFuZAl3MTcsdzIxLHcyMAorCWJpYwl3MTksdzIyLHcyMAorCWFkZAl3MjMsdzIzLHcxNQkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyNCx3MjUJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzcscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3Nyx3MjQsIzIKKwlhZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyNCx3MjQscm9yIzkKKwlhZGQJdzIzLHcyMyx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzI3LHcyNyx3MjMJCQkvLyBkKz1oCisJZW9yCXcyOCx3MjgsdzI1CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzcsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzIzLHcyMyx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjMsdzIzLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzAsdzAJCQkvLyAxMworI2VuZGlmCisJbGRwCXcxLHcyLFt4MV0KKwlhZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJdzgsW3NwLCM0XQorCXJvcgl3MTYsdzI3LCM2CisJYWRkCXcyMix3MjIsdzI4CQkJLy8gaCs9S1tpXQorCWVvcgl3OCx3MjcsdzI3LHJvciMxNAorCWFuZAl3MTcsdzIwLHcyNworCWJpYwl3MjgsdzIxLHcyNworCWFkZAl3MjIsdzIyLHcwCQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzIzLHcyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3OCxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXc4LHcyMywjMgorCWFkZAl3MjIsdzIyLHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzIzLHcyMyxyb3IjOQorCWFkZAl3MjIsdzIyLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MTksdzE5LHcyOAkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjYsdzI2LHcyMgkJCS8vIGQrPWgKKwllb3IJdzE5LHcxOSx3MjQJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3OCx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjIsdzIyLHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3MSx3MQkJCS8vIDE0CisjZW5kaWYKKwlsZHIJdzYsW3NwLCMxMl0KKwlhZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJdzksW3NwLCM4XQorCXJvcgl3MTYsdzI2LCM2CisJYWRkCXcyMSx3MjEsdzE5CQkJLy8gaCs9S1tpXQorCWVvcgl3OSx3MjYsdzI2LHJvciMxNAorCWFuZAl3MTcsdzI3LHcyNgorCWJpYwl3MTksdzIwLHcyNgorCWFkZAl3MjEsdzIxLHcxCQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzIyLHcyMwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3OSxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXc5LHcyMiwjMgorCWFkZAl3MjEsdzIxLHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzIyLHcyMixyb3IjOQorCWFkZAl3MjEsdzIxLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjUsdzI1LHcyMQkJCS8vIGQrPWgKKwllb3IJdzI4LHcyOCx3MjMJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3OSx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjEsdzIxLHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyMSx3MjEsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3Mix3MgkJCS8vIDE1CisjZW5kaWYKKwlsZHIJdzcsW3NwLCMwXQorCWFkZAl3MjEsdzIxLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXN0cgl3MTAsW3NwLCMxMl0KKwlyb3IJdzE2LHcyNSwjNgorCWFkZAl3MjAsdzIwLHcyOAkJCS8vIGgrPUtbaV0KKwlyb3IJdzksdzQsIzcKKwlhbmQJdzE3LHcyNix3MjUKKwlyb3IJdzgsdzEsIzE3CisJYmljCXcyOCx3MjcsdzI1CisJcm9yCXcxMCx3MjEsIzIKKwlhZGQJdzIwLHcyMCx3MgkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3MjUscm9yIzExCisJZW9yCXc5LHc5LHc0LHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzIxLHcyMgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjUscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3MTAsdzEwLHcyMSxyb3IjMTMKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzgsdzgsdzEscm9yIzE5CisJZW9yCXc5LHc5LHc0LGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyMCx3MjAsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcxOSx3MTksdzIyCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzEwLHcyMSxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXc4LHc4LHcxLGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzMsdzMsdzEyCisJYWRkCXcyNCx3MjQsdzIwCQkJLy8gZCs9aAorCWFkZAl3MjAsdzIwLHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCWFkZAl3Myx3Myx3OQorCWFkZAl3MjAsdzIwLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl3Myx3Myx3OAorTG9vcF8xNl94eDoKKwlsZHIJdzgsW3NwLCM0XQorCXN0cgl3MTEsW3NwLCMwXQorCXJvcgl3MTYsdzI0LCM2CisJYWRkCXcyNyx3MjcsdzE5CQkJLy8gaCs9S1tpXQorCXJvcgl3MTAsdzUsIzcKKwlhbmQJdzE3LHcyNSx3MjQKKwlyb3IJdzksdzIsIzE3CisJYmljCXcxOSx3MjYsdzI0CisJcm9yCXcxMSx3MjAsIzIKKwlhZGQJdzI3LHcyNyx3MwkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3MjQscm9yIzExCisJZW9yCXcxMCx3MTAsdzUscm9yIzE4CisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjAsdzIxCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyNCxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXcxMSx3MTEsdzIwLHJvciMxMworCWFkZAl3MjcsdzI3LHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl3OSx3OSx3Mixyb3IjMTkKKwllb3IJdzEwLHcxMCx3NSxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjcsdzI3LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MjgsdzI4LHcyMQkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMSx3MjAscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3OSx3OSx3Mixsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXc0LHc0LHcxMworCWFkZAl3MjMsdzIzLHcyNwkJCS8vIGQrPWgKKwlhZGQJdzI3LHcyNyx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwlhZGQJdzQsdzQsdzEwCisJYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXc0LHc0LHc5CisJbGRyCXc5LFtzcCwjOF0KKwlzdHIJdzEyLFtzcCwjNF0KKwlyb3IJdzE2LHcyMywjNgorCWFkZAl3MjYsdzI2LHcyOAkJCS8vIGgrPUtbaV0KKwlyb3IJdzExLHc2LCM3CisJYW5kCXcxNyx3MjQsdzIzCisJcm9yCXcxMCx3MywjMTcKKwliaWMJdzI4LHcyNSx3MjMKKwlyb3IJdzEyLHcyNywjMgorCWFkZAl3MjYsdzI2LHc0CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyMyxyb3IjMTEKKwllb3IJdzExLHcxMSx3Nixyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyNyx3MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzIzLHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzEyLHcxMix3Mjcscm9yIzEzCisJYWRkCXcyNix3MjYsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcxMCx3MTAsdzMscm9yIzE5CisJZW9yCXcxMSx3MTEsdzYsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzI2LHcyNix3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzE5LHcxOSx3MjAJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MTIsdzI3LHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzEwLHcxMCx3Myxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXc1LHc1LHcxNAorCWFkZAl3MjIsdzIyLHcyNgkJCS8vIGQrPWgKKwlhZGQJdzI2LHcyNix3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwlhZGQJdzUsdzUsdzExCisJYWRkCXcyNix3MjYsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXc1LHc1LHcxMAorCWxkcgl3MTAsW3NwLCMxMl0KKwlzdHIJdzEzLFtzcCwjOF0KKwlyb3IJdzE2LHcyMiwjNgorCWFkZAl3MjUsdzI1LHcxOQkJCS8vIGgrPUtbaV0KKwlyb3IJdzEyLHc3LCM3CisJYW5kCXcxNyx3MjMsdzIyCisJcm9yCXcxMSx3NCwjMTcKKwliaWMJdzE5LHcyNCx3MjIKKwlyb3IJdzEzLHcyNiwjMgorCWFkZAl3MjUsdzI1LHc1CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyMixyb3IjMTEKKwllb3IJdzEyLHcxMix3Nyxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyNix3MjcJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzIyLHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzEzLHcxMyx3MjYscm9yIzEzCisJYWRkCXcyNSx3MjUsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcxMSx3MTEsdzQscm9yIzE5CisJZW9yCXcxMix3MTIsdzcsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzI1LHcyNSx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzI4LHcyOCx3MjcJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MTMsdzI2LHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzExLHcxMSx3NCxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXc2LHc2LHcxNQorCWFkZAl3MjEsdzIxLHcyNQkJCS8vIGQrPWgKKwlhZGQJdzI1LHcyNSx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwlhZGQJdzYsdzYsdzEyCisJYWRkCXcyNSx3MjUsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXc2LHc2LHcxMQorCWxkcgl3MTEsW3NwLCMwXQorCXN0cgl3MTQsW3NwLCMxMl0KKwlyb3IJdzE2LHcyMSwjNgorCWFkZAl3MjQsdzI0LHcyOAkJCS8vIGgrPUtbaV0KKwlyb3IJdzEzLHc4LCM3CisJYW5kCXcxNyx3MjIsdzIxCisJcm9yCXcxMix3NSwjMTcKKwliaWMJdzI4LHcyMyx3MjEKKwlyb3IJdzE0LHcyNSwjMgorCWFkZAl3MjQsdzI0LHc2CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyMSxyb3IjMTEKKwllb3IJdzEzLHcxMyx3OCxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyNSx3MjYJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzIxLHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzE0LHcxNCx3MjUscm9yIzEzCisJYWRkCXcyNCx3MjQsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcxMix3MTIsdzUscm9yIzE5CisJZW9yCXcxMyx3MTMsdzgsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzI0LHcyNCx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzE5LHcxOSx3MjYJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MTQsdzI1LHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzEyLHcxMix3NSxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXc3LHc3LHcwCisJYWRkCXcyMCx3MjAsdzI0CQkJLy8gZCs9aAorCWFkZAl3MjQsdzI0LHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCWFkZAl3Nyx3Nyx3MTMKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzcsdzcsdzEyCisJbGRyCXcxMixbc3AsIzRdCisJc3RyCXcxNSxbc3AsIzBdCisJcm9yCXcxNix3MjAsIzYKKwlhZGQJdzIzLHcyMyx3MTkJCQkvLyBoKz1LW2ldCisJcm9yCXcxNCx3OSwjNworCWFuZAl3MTcsdzIxLHcyMAorCXJvcgl3MTMsdzYsIzE3CisJYmljCXcxOSx3MjIsdzIwCisJcm9yCXcxNSx3MjQsIzIKKwlhZGQJdzIzLHcyMyx3NwkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3MjAscm9yIzExCisJZW9yCXcxNCx3MTQsdzkscm9yIzE4CisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjQsdzI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyMCxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXcxNSx3MTUsdzI0LHJvciMxMworCWFkZAl3MjMsdzIzLHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl3MTMsdzEzLHc2LHJvciMxOQorCWVvcgl3MTQsdzE0LHc5LGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyMyx3MjMsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcyOCx3MjgsdzI1CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzE1LHcyNCxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXcxMyx3MTMsdzYsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3OCx3OCx3MQorCWFkZAl3MjcsdzI3LHcyMwkJCS8vIGQrPWgKKwlhZGQJdzIzLHcyMyx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwlhZGQJdzgsdzgsdzE0CisJYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXc4LHc4LHcxMworCWxkcgl3MTMsW3NwLCM4XQorCXN0cgl3MCxbc3AsIzRdCisJcm9yCXcxNix3MjcsIzYKKwlhZGQJdzIyLHcyMix3MjgJCQkvLyBoKz1LW2ldCisJcm9yCXcxNSx3MTAsIzcKKwlhbmQJdzE3LHcyMCx3MjcKKwlyb3IJdzE0LHc3LCMxNworCWJpYwl3MjgsdzIxLHcyNworCXJvcgl3MCx3MjMsIzIKKwlhZGQJdzIyLHcyMix3OAkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3Mjcscm9yIzExCisJZW9yCXcxNSx3MTUsdzEwLHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzIzLHcyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3Mjcscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3MCx3MCx3MjMscm9yIzEzCisJYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcxNCx3MTQsdzcscm9yIzE5CisJZW9yCXcxNSx3MTUsdzEwLGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyMix3MjIsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcxOSx3MTksdzI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzAsdzIzLHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzE0LHcxNCx3Nyxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXc5LHc5LHcyCisJYWRkCXcyNix3MjYsdzIyCQkJLy8gZCs9aAorCWFkZAl3MjIsdzIyLHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCWFkZAl3OSx3OSx3MTUKKwlhZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzksdzksdzE0CisJbGRyCXcxNCxbc3AsIzEyXQorCXN0cgl3MSxbc3AsIzhdCisJcm9yCXcxNix3MjYsIzYKKwlhZGQJdzIxLHcyMSx3MTkJCQkvLyBoKz1LW2ldCisJcm9yCXcwLHcxMSwjNworCWFuZAl3MTcsdzI3LHcyNgorCXJvcgl3MTUsdzgsIzE3CisJYmljCXcxOSx3MjAsdzI2CisJcm9yCXcxLHcyMiwjMgorCWFkZAl3MjEsdzIxLHc5CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyNixyb3IjMTEKKwllb3IJdzAsdzAsdzExLHJvciMxOAorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzIyLHcyMwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjYscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3MSx3MSx3MjIscm9yIzEzCisJYWRkCXcyMSx3MjEsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcxNSx3MTUsdzgscm9yIzE5CisJZW9yCXcwLHcwLHcxMSxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjEsdzIxLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MjgsdzI4LHcyMwkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxLHcyMixyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXcxNSx3MTUsdzgsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3MTAsdzEwLHczCisJYWRkCXcyNSx3MjUsdzIxCQkJLy8gZCs9aAorCWFkZAl3MjEsdzIxLHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCWFkZAl3MTAsdzEwLHcwCisJYWRkCXcyMSx3MjEsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcxMCx3MTAsdzE1CisJbGRyCXcxNSxbc3AsIzBdCisJc3RyCXcyLFtzcCwjMTJdCisJcm9yCXcxNix3MjUsIzYKKwlhZGQJdzIwLHcyMCx3MjgJCQkvLyBoKz1LW2ldCisJcm9yCXcxLHcxMiwjNworCWFuZAl3MTcsdzI2LHcyNQorCXJvcgl3MCx3OSwjMTcKKwliaWMJdzI4LHcyNyx3MjUKKwlyb3IJdzIsdzIxLCMyCisJYWRkCXcyMCx3MjAsdzEwCQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyNSxyb3IjMTEKKwllb3IJdzEsdzEsdzEyLHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzIxLHcyMgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjUscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3Mix3Mix3MjEscm9yIzEzCisJYWRkCXcyMCx3MjAsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcwLHcwLHc5LHJvciMxOQorCWVvcgl3MSx3MSx3MTIsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzIwLHcyMCx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzE5LHcxOSx3MjIJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3Mix3MjEscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3MCx3MCx3OSxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcxMSx3MTEsdzQKKwlhZGQJdzI0LHcyNCx3MjAJCQkvLyBkKz1oCisJYWRkCXcyMCx3MjAsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXcxMSx3MTEsdzEKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzExLHcxMSx3MAorCWxkcgl3MCxbc3AsIzRdCisJc3RyCXczLFtzcCwjMF0KKwlyb3IJdzE2LHcyNCwjNgorCWFkZAl3MjcsdzI3LHcxOQkJCS8vIGgrPUtbaV0KKwlyb3IJdzIsdzEzLCM3CisJYW5kCXcxNyx3MjUsdzI0CisJcm9yCXcxLHcxMCwjMTcKKwliaWMJdzE5LHcyNix3MjQKKwlyb3IJdzMsdzIwLCMyCisJYWRkCXcyNyx3MjcsdzExCQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyNCxyb3IjMTEKKwllb3IJdzIsdzIsdzEzLHJvciMxOAorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzIwLHcyMQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjQscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3Myx3Myx3MjAscm9yIzEzCisJYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcxLHcxLHcxMCxyb3IjMTkKKwllb3IJdzIsdzIsdzEzLGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyNyx3MjcsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcyOCx3MjgsdzIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzMsdzIwLHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzEsdzEsdzEwLGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzEyLHcxMix3NQorCWFkZAl3MjMsdzIzLHcyNwkJCS8vIGQrPWgKKwlhZGQJdzI3LHcyNyx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwlhZGQJdzEyLHcxMix3MgorCWFkZAl3MjcsdzI3LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl3MTIsdzEyLHcxCisJbGRyCXcxLFtzcCwjOF0KKwlzdHIJdzQsW3NwLCM0XQorCXJvcgl3MTYsdzIzLCM2CisJYWRkCXcyNix3MjYsdzI4CQkJLy8gaCs9S1tpXQorCXJvcgl3Myx3MTQsIzcKKwlhbmQJdzE3LHcyNCx3MjMKKwlyb3IJdzIsdzExLCMxNworCWJpYwl3MjgsdzI1LHcyMworCXJvcgl3NCx3MjcsIzIKKwlhZGQJdzI2LHcyNix3MTIJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzIzLHJvciMxMQorCWVvcgl3Myx3Myx3MTQscm9yIzE4CisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjcsdzIwCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyMyxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXc0LHc0LHcyNyxyb3IjMTMKKwlhZGQJdzI2LHcyNix3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzIsdzIsdzExLHJvciMxOQorCWVvcgl3Myx3Myx3MTQsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzI2LHcyNix3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzE5LHcxOSx3MjAJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3NCx3Mjcscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3Mix3Mix3MTEsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3MTMsdzEzLHc2CisJYWRkCXcyMix3MjIsdzI2CQkJLy8gZCs9aAorCWFkZAl3MjYsdzI2LHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCWFkZAl3MTMsdzEzLHczCisJYWRkCXcyNix3MjYsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcxMyx3MTMsdzIKKwlsZHIJdzIsW3NwLCMxMl0KKwlzdHIJdzUsW3NwLCM4XQorCXJvcgl3MTYsdzIyLCM2CisJYWRkCXcyNSx3MjUsdzE5CQkJLy8gaCs9S1tpXQorCXJvcgl3NCx3MTUsIzcKKwlhbmQJdzE3LHcyMyx3MjIKKwlyb3IJdzMsdzEyLCMxNworCWJpYwl3MTksdzI0LHcyMgorCXJvcgl3NSx3MjYsIzIKKwlhZGQJdzI1LHcyNSx3MTMJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzIyLHJvciMxMQorCWVvcgl3NCx3NCx3MTUscm9yIzE4CisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjYsdzI3CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyMixyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXc1LHc1LHcyNixyb3IjMTMKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzMsdzMsdzEyLHJvciMxOQorCWVvcgl3NCx3NCx3MTUsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzI1LHcyNSx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzI4LHcyOCx3MjcJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3NSx3MjYscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3Myx3Myx3MTIsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3MTQsdzE0LHc3CisJYWRkCXcyMSx3MjEsdzI1CQkJLy8gZCs9aAorCWFkZAl3MjUsdzI1LHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCWFkZAl3MTQsdzE0LHc0CisJYWRkCXcyNSx3MjUsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcxNCx3MTQsdzMKKwlsZHIJdzMsW3NwLCMwXQorCXN0cgl3Nixbc3AsIzEyXQorCXJvcgl3MTYsdzIxLCM2CisJYWRkCXcyNCx3MjQsdzI4CQkJLy8gaCs9S1tpXQorCXJvcgl3NSx3MCwjNworCWFuZAl3MTcsdzIyLHcyMQorCXJvcgl3NCx3MTMsIzE3CisJYmljCXcyOCx3MjMsdzIxCisJcm9yCXc2LHcyNSwjMgorCWFkZAl3MjQsdzI0LHcxNAkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3MjEscm9yIzExCisJZW9yCXc1LHc1LHcwLHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzI1LHcyNgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjEscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3Nix3Nix3MjUscm9yIzEzCisJYWRkCXcyNCx3MjQsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXc0LHc0LHcxMyxyb3IjMTkKKwllb3IJdzUsdzUsdzAsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzI0LHcyNCx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzE5LHcxOSx3MjYJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3Nix3MjUscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3NCx3NCx3MTMsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3MTUsdzE1LHc4CisJYWRkCXcyMCx3MjAsdzI0CQkJLy8gZCs9aAorCWFkZAl3MjQsdzI0LHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCWFkZAl3MTUsdzE1LHc1CisJYWRkCXcyNCx3MjQsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcxNSx3MTUsdzQKKwlsZHIJdzQsW3NwLCM0XQorCXN0cgl3Nyxbc3AsIzBdCisJcm9yCXcxNix3MjAsIzYKKwlhZGQJdzIzLHcyMyx3MTkJCQkvLyBoKz1LW2ldCisJcm9yCXc2LHcxLCM3CisJYW5kCXcxNyx3MjEsdzIwCisJcm9yCXc1LHcxNCwjMTcKKwliaWMJdzE5LHcyMix3MjAKKwlyb3IJdzcsdzI0LCMyCisJYWRkCXcyMyx3MjMsdzE1CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyMCxyb3IjMTEKKwllb3IJdzYsdzYsdzEscm9yIzE4CisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjQsdzI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyMCxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXc3LHc3LHcyNCxyb3IjMTMKKwlhZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzUsdzUsdzE0LHJvciMxOQorCWVvcgl3Nix3Nix3MSxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjMsdzIzLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MjgsdzI4LHcyNQkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc3LHcyNCxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXc1LHc1LHcxNCxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcwLHcwLHc5CisJYWRkCXcyNyx3MjcsdzIzCQkJLy8gZCs9aAorCWFkZAl3MjMsdzIzLHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCWFkZAl3MCx3MCx3NgorCWFkZAl3MjMsdzIzLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl3MCx3MCx3NQorCWxkcgl3NSxbc3AsIzhdCisJc3RyCXc4LFtzcCwjNF0KKwlyb3IJdzE2LHcyNywjNgorCWFkZAl3MjIsdzIyLHcyOAkJCS8vIGgrPUtbaV0KKwlyb3IJdzcsdzIsIzcKKwlhbmQJdzE3LHcyMCx3MjcKKwlyb3IJdzYsdzE1LCMxNworCWJpYwl3MjgsdzIxLHcyNworCXJvcgl3OCx3MjMsIzIKKwlhZGQJdzIyLHcyMix3MAkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3Mjcscm9yIzExCisJZW9yCXc3LHc3LHcyLHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzIzLHcyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3Mjcscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3OCx3OCx3MjMscm9yIzEzCisJYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXc2LHc2LHcxNSxyb3IjMTkKKwllb3IJdzcsdzcsdzIsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzIyLHcyMix3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzE5LHcxOSx3MjQJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3OCx3MjMscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3Nix3Nix3MTUsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3MSx3MSx3MTAKKwlhZGQJdzI2LHcyNix3MjIJCQkvLyBkKz1oCisJYWRkCXcyMix3MjIsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXcxLHcxLHc3CisJYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcxLHcxLHc2CisJbGRyCXc2LFtzcCwjMTJdCisJc3RyCXc5LFtzcCwjOF0KKwlyb3IJdzE2LHcyNiwjNgorCWFkZAl3MjEsdzIxLHcxOQkJCS8vIGgrPUtbaV0KKwlyb3IJdzgsdzMsIzcKKwlhbmQJdzE3LHcyNyx3MjYKKwlyb3IJdzcsdzAsIzE3CisJYmljCXcxOSx3MjAsdzI2CisJcm9yCXc5LHcyMiwjMgorCWFkZAl3MjEsdzIxLHcxCQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyNixyb3IjMTEKKwllb3IJdzgsdzgsdzMscm9yIzE4CisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjIsdzIzCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyNixyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXc5LHc5LHcyMixyb3IjMTMKKwlhZGQJdzIxLHcyMSx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzcsdzcsdzAscm9yIzE5CisJZW9yCXc4LHc4LHczLGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyMSx3MjEsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcyOCx3MjgsdzIzCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzksdzIyLHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzcsdzcsdzAsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3Mix3Mix3MTEKKwlhZGQJdzI1LHcyNSx3MjEJCQkvLyBkKz1oCisJYWRkCXcyMSx3MjEsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXcyLHcyLHc4CisJYWRkCXcyMSx3MjEsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcyLHcyLHc3CisJbGRyCXc3LFtzcCwjMF0KKwlzdHIJdzEwLFtzcCwjMTJdCisJcm9yCXcxNix3MjUsIzYKKwlhZGQJdzIwLHcyMCx3MjgJCQkvLyBoKz1LW2ldCisJcm9yCXc5LHc0LCM3CisJYW5kCXcxNyx3MjYsdzI1CisJcm9yCXc4LHcxLCMxNworCWJpYwl3MjgsdzI3LHcyNQorCXJvcgl3MTAsdzIxLCMyCisJYWRkCXcyMCx3MjAsdzIJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzI1LHJvciMxMQorCWVvcgl3OSx3OSx3NCxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyMSx3MjIJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzI1LHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzEwLHcxMCx3MjEscm9yIzEzCisJYWRkCXcyMCx3MjAsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXc4LHc4LHcxLHJvciMxOQorCWVvcgl3OSx3OSx3NCxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjAsdzIwLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyMgkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMCx3MjEscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3OCx3OCx3MSxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXczLHczLHcxMgorCWFkZAl3MjQsdzI0LHcyMAkJCS8vIGQrPWgKKwlhZGQJdzIwLHcyMCx3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwlhZGQJdzMsdzMsdzkKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzMsdzMsdzgKKwljYm56CXcxOSxMb29wXzE2X3h4CisKKwlsZHAJeDAseDIsW3gyOSwjOTZdCisJbGRyCXgxLFt4MjksIzExMl0KKwlzdWIJeDMwLHgzMCwjMjYwCQkvLyByZXdpbmQKKworCWxkcAl3Myx3NCxbeDBdCisJbGRwCXc1LHc2LFt4MCwjMio0XQorCWFkZAl4MSx4MSwjMTQqNAkJCS8vIGFkdmFuY2UgaW5wdXQgcG9pbnRlcgorCWxkcAl3Nyx3OCxbeDAsIzQqNF0KKwlhZGQJdzIwLHcyMCx3MworCWxkcAl3OSx3MTAsW3gwLCM2KjRdCisJYWRkCXcyMSx3MjEsdzQKKwlhZGQJdzIyLHcyMix3NQorCWFkZAl3MjMsdzIzLHc2CisJc3RwCXcyMCx3MjEsW3gwXQorCWFkZAl3MjQsdzI0LHc3CisJYWRkCXcyNSx3MjUsdzgKKwlzdHAJdzIyLHcyMyxbeDAsIzIqNF0KKwlhZGQJdzI2LHcyNix3OQorCWFkZAl3MjcsdzI3LHcxMAorCWNtcAl4MSx4MgorCXN0cAl3MjQsdzI1LFt4MCwjNCo0XQorCXN0cAl3MjYsdzI3LFt4MCwjNio0XQorCWIubmUJTG9vcAorCisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM0KjQKKwlsZHAJeDIxLHgyMixbeDI5LCMzMl0KKwlsZHAJeDIzLHgyNCxbeDI5LCM0OF0KKwlsZHAJeDI1LHgyNixbeDI5LCM2NF0KKwlsZHAJeDI3LHgyOCxbeDI5LCM4MF0KKwlsZHAJeDI5LHgzMCxbc3BdLCMxMjgKKwlyZXQKKworCisuYWxpZ24JNgorCitMSzI1NjoKKy5sb25nCTB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUKKy5sb25nCTB4Mzk1NmMyNWIsMHg1OWYxMTFmMSwweDkyM2Y4MmE0LDB4YWIxYzVlZDUKKy5sb25nCTB4ZDgwN2FhOTgsMHgxMjgzNWIwMSwweDI0MzE4NWJlLDB4NTUwYzdkYzMKKy5sb25nCTB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQKKy5sb25nCTB4ZTQ5YjY5YzEsMHhlZmJlNDc4NiwweDBmYzE5ZGM2LDB4MjQwY2ExY2MKKy5sb25nCTB4MmRlOTJjNmYsMHg0YTc0ODRhYSwweDVjYjBhOWRjLDB4NzZmOTg4ZGEKKy5sb25nCTB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcKKy5sb25nCTB4YzZlMDBiZjMsMHhkNWE3OTE0NywweDA2Y2E2MzUxLDB4MTQyOTI5NjcKKy5sb25nCTB4MjdiNzBhODUsMHgyZTFiMjEzOCwweDRkMmM2ZGZjLDB4NTMzODBkMTMKKy5sb25nCTB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUKKy5sb25nCTB4YTJiZmU4YTEsMHhhODFhNjY0YiwweGMyNGI4YjcwLDB4Yzc2YzUxYTMKKy5sb25nCTB4ZDE5MmU4MTksMHhkNjk5MDYyNCwweGY0MGUzNTg1LDB4MTA2YWEwNzAKKy5sb25nCTB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUKKy5sb25nCTB4MzkxYzBjYjMsMHg0ZWQ4YWE0YSwweDViOWNjYTRmLDB4NjgyZTZmZjMKKy5sb25nCTB4NzQ4ZjgyZWUsMHg3OGE1NjM2ZiwweDg0Yzg3ODE0LDB4OGNjNzAyMDgKKy5sb25nCTB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIKKy5sb25nCTAJLy90ZXJtaW5hdG9yCisKKyNpZm5kZWYJX19LRVJORUxfXworLmFsaWduCTMKK0xPUEVOU1NMX2FybWNhcF9QOgorIyBpZmRlZglfX0lMUDMyX18KKy5sb25nCV9PUEVOU1NMX2FybWNhcF9QLS4KKyMgZWxzZQorLnF1YWQJX09QRU5TU0xfYXJtY2FwX1AtLgorIyBlbmRpZgorI2VuZGlmCisuYnl0ZQk4Myw3Miw2NSw1MCw1Myw1NCwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3LDExMCwxMTUsMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Niw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKKyNpZm5kZWYJX19LRVJORUxfXworCisuYWxpZ24JNgorc2hhMjU2X2Jsb2NrX2FybXY4OgorTHY4X2VudHJ5OgorCXN0cAl4MjkseDMwLFtzcCwjLTE2XSEKKwlhZGQJeDI5LHNwLCMwCisKKwlsZDEJe3YwLjRzLHYxLjRzfSxbeDBdCisJYWRyCXgzLExLMjU2CisKK0xvb3BfaHc6CisJbGQxCXt2NC4xNmIsdjUuMTZiLHY2LjE2Yix2Ny4xNmJ9LFt4MV0sIzY0CisJc3ViCXgyLHgyLCMxCisJbGQxCXt2MTYuNHN9LFt4M10sIzE2CisJcmV2MzIJdjQuMTZiLHY0LjE2YgorCXJldjMyCXY1LjE2Yix2NS4xNmIKKwlyZXYzMgl2Ni4xNmIsdjYuMTZiCisJcmV2MzIJdjcuMTZiLHY3LjE2YgorCW9ycgl2MTguMTZiLHYwLjE2Yix2MC4xNmIJCS8vIG9mZmxvYWQKKwlvcnIJdjE5LjE2Yix2MS4xNmIsdjEuMTZiCisJbGQxCXt2MTcuNHN9LFt4M10sIzE2CisJYWRkCXYxNi40cyx2MTYuNHMsdjQuNHMKKy5sb25nCTB4NWUyODI4YTQJLy9zaGEyNTZzdTAgdjQuMTZiLHY1LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmxvbmcJMHg1ZTEwNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTYuNHMKKy5sb25nCTB4NWUxMDUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNi40cworLmxvbmcJMHg1ZTA3NjBjNAkvL3NoYTI1NnN1MSB2NC4xNmIsdjYuMTZiLHY3LjE2YgorCWxkMQl7djE2LjRzfSxbeDNdLCMxNgorCWFkZAl2MTcuNHMsdjE3LjRzLHY1LjRzCisubG9uZwkweDVlMjgyOGM1CS8vc2hhMjU2c3UwIHY1LjE2Yix2Ni4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5sb25nCTB4NWUxMTQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE3LjRzCisubG9uZwkweDVlMTE1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTcuNHMKKy5sb25nCTB4NWUwNDYwZTUJLy9zaGEyNTZzdTEgdjUuMTZiLHY3LjE2Yix2NC4xNmIKKwlsZDEJe3YxNy40c30sW3gzXSwjMTYKKwlhZGQJdjE2LjRzLHYxNi40cyx2Ni40cworLmxvbmcJMHg1ZTI4MjhlNgkvL3NoYTI1NnN1MCB2Ni4xNmIsdjcuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisubG9uZwkweDVlMTA0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNi40cworLmxvbmcJMHg1ZTEwNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE2LjRzCisubG9uZwkweDVlMDU2MDg2CS8vc2hhMjU2c3UxIHY2LjE2Yix2NC4xNmIsdjUuMTZiCisJbGQxCXt2MTYuNHN9LFt4M10sIzE2CisJYWRkCXYxNy40cyx2MTcuNHMsdjcuNHMKKy5sb25nCTB4NWUyODI4ODcJLy9zaGEyNTZzdTAgdjcuMTZiLHY0LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmxvbmcJMHg1ZTExNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTcuNHMKKy5sb25nCTB4NWUxMTUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNy40cworLmxvbmcJMHg1ZTA2NjBhNwkvL3NoYTI1NnN1MSB2Ny4xNmIsdjUuMTZiLHY2LjE2YgorCWxkMQl7djE3LjRzfSxbeDNdLCMxNgorCWFkZAl2MTYuNHMsdjE2LjRzLHY0LjRzCisubG9uZwkweDVlMjgyOGE0CS8vc2hhMjU2c3UwIHY0LjE2Yix2NS4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5sb25nCTB4NWUxMDQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE2LjRzCisubG9uZwkweDVlMTA1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTYuNHMKKy5sb25nCTB4NWUwNzYwYzQJLy9zaGEyNTZzdTEgdjQuMTZiLHY2LjE2Yix2Ny4xNmIKKwlsZDEJe3YxNi40c30sW3gzXSwjMTYKKwlhZGQJdjE3LjRzLHYxNy40cyx2NS40cworLmxvbmcJMHg1ZTI4MjhjNQkvL3NoYTI1NnN1MCB2NS4xNmIsdjYuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisubG9uZwkweDVlMTE0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNy40cworLmxvbmcJMHg1ZTExNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE3LjRzCisubG9uZwkweDVlMDQ2MGU1CS8vc2hhMjU2c3UxIHY1LjE2Yix2Ny4xNmIsdjQuMTZiCisJbGQxCXt2MTcuNHN9LFt4M10sIzE2CisJYWRkCXYxNi40cyx2MTYuNHMsdjYuNHMKKy5sb25nCTB4NWUyODI4ZTYJLy9zaGEyNTZzdTAgdjYuMTZiLHY3LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmxvbmcJMHg1ZTEwNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTYuNHMKKy5sb25nCTB4NWUxMDUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNi40cworLmxvbmcJMHg1ZTA1NjA4NgkvL3NoYTI1NnN1MSB2Ni4xNmIsdjQuMTZiLHY1LjE2YgorCWxkMQl7djE2LjRzfSxbeDNdLCMxNgorCWFkZAl2MTcuNHMsdjE3LjRzLHY3LjRzCisubG9uZwkweDVlMjgyODg3CS8vc2hhMjU2c3UwIHY3LjE2Yix2NC4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5sb25nCTB4NWUxMTQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE3LjRzCisubG9uZwkweDVlMTE1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTcuNHMKKy5sb25nCTB4NWUwNjYwYTcJLy9zaGEyNTZzdTEgdjcuMTZiLHY1LjE2Yix2Ni4xNmIKKwlsZDEJe3YxNy40c30sW3gzXSwjMTYKKwlhZGQJdjE2LjRzLHYxNi40cyx2NC40cworLmxvbmcJMHg1ZTI4MjhhNAkvL3NoYTI1NnN1MCB2NC4xNmIsdjUuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisubG9uZwkweDVlMTA0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNi40cworLmxvbmcJMHg1ZTEwNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE2LjRzCisubG9uZwkweDVlMDc2MGM0CS8vc2hhMjU2c3UxIHY0LjE2Yix2Ni4xNmIsdjcuMTZiCisJbGQxCXt2MTYuNHN9LFt4M10sIzE2CisJYWRkCXYxNy40cyx2MTcuNHMsdjUuNHMKKy5sb25nCTB4NWUyODI4YzUJLy9zaGEyNTZzdTAgdjUuMTZiLHY2LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmxvbmcJMHg1ZTExNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTcuNHMKKy5sb25nCTB4NWUxMTUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNy40cworLmxvbmcJMHg1ZTA0NjBlNQkvL3NoYTI1NnN1MSB2NS4xNmIsdjcuMTZiLHY0LjE2YgorCWxkMQl7djE3LjRzfSxbeDNdLCMxNgorCWFkZAl2MTYuNHMsdjE2LjRzLHY2LjRzCisubG9uZwkweDVlMjgyOGU2CS8vc2hhMjU2c3UwIHY2LjE2Yix2Ny4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5sb25nCTB4NWUxMDQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE2LjRzCisubG9uZwkweDVlMTA1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTYuNHMKKy5sb25nCTB4NWUwNTYwODYJLy9zaGEyNTZzdTEgdjYuMTZiLHY0LjE2Yix2NS4xNmIKKwlsZDEJe3YxNi40c30sW3gzXSwjMTYKKwlhZGQJdjE3LjRzLHYxNy40cyx2Ny40cworLmxvbmcJMHg1ZTI4Mjg4NwkvL3NoYTI1NnN1MCB2Ny4xNmIsdjQuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisubG9uZwkweDVlMTE0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNy40cworLmxvbmcJMHg1ZTExNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE3LjRzCisubG9uZwkweDVlMDY2MGE3CS8vc2hhMjU2c3UxIHY3LjE2Yix2NS4xNmIsdjYuMTZiCisJbGQxCXt2MTcuNHN9LFt4M10sIzE2CisJYWRkCXYxNi40cyx2MTYuNHMsdjQuNHMKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5sb25nCTB4NWUxMDQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE2LjRzCisubG9uZwkweDVlMTA1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTYuNHMKKworCWxkMQl7djE2LjRzfSxbeDNdLCMxNgorCWFkZAl2MTcuNHMsdjE3LjRzLHY1LjRzCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisubG9uZwkweDVlMTE0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNy40cworLmxvbmcJMHg1ZTExNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE3LjRzCisKKwlsZDEJe3YxNy40c30sW3gzXQorCWFkZAl2MTYuNHMsdjE2LjRzLHY2LjRzCisJc3ViCXgzLHgzLCM2NCo0LTE2CS8vIHJld2luZAorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmxvbmcJMHg1ZTEwNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTYuNHMKKy5sb25nCTB4NWUxMDUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNi40cworCisJYWRkCXYxNy40cyx2MTcuNHMsdjcuNHMKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5sb25nCTB4NWUxMTQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE3LjRzCisubG9uZwkweDVlMTE1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTcuNHMKKworCWFkZAl2MC40cyx2MC40cyx2MTguNHMKKwlhZGQJdjEuNHMsdjEuNHMsdjE5LjRzCisKKwljYm56CXgyLExvb3BfaHcKKworCXN0MQl7djAuNHMsdjEuNHN9LFt4MF0KKworCWxkcgl4MjksW3NwXSwjMTYKKwlyZXQKKworI2VuZGlmCisjaWZuZGVmCV9fS0VSTkVMX18KKy5jb21tCV9PUEVOU1NMX2FybWNhcF9QLDQsNAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi1hcm12OC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItYXJtdjguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE1OWMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItYXJtdjguUwpAQCAtMCwwICsxLDEwNzMgQEAKKy8vIENvcHlyaWdodCAyMDE0LTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCisvLyB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorLy8gaW4gdGhlIGZpbGUgTElDRU5TRSBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvciBhdAorLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisvLyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisvLyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorLy8gZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisvLworLy8gUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMdjIgdGVybXMgaXMgZ3JhbnRlZC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gU0hBMjU2LzUxMiBmb3IgQVJNdjguCisvLworLy8gUGVyZm9ybWFuY2UgaW4gY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnQKKy8vIG92ZXIgY29kZSBnZW5lcmF0ZWQgd2l0aCAiZGVmYXVsdCIgY29tcGlsZXI6CisvLworLy8JCVNIQTI1Ni1odwlTSEEyNTYoKikJU0hBNTEyCisvLyBBcHBsZSBBNwkxLjk3CQkxMC41ICgrMzMlKQk2LjczICgtMSUoKiopKQorLy8gQ29ydGV4LUE1MwkyLjM4CQkxNS41ICgrMTE1JSkJMTAuMCAoKzE1MCUoKioqKSkKKy8vIENvcnRleC1BNTcJMi4zMQkJMTEuNiAoKzg2JSkJNy41MSAoKzI2MCUoKioqKSkKKy8vIERlbnZlcgkyLjAxCQkxMC41ICgrMjYlKQk2LjcwICgrOCUpCisvLyBYLUdlbmUJCQkyMC4wICgrMTAwJSkJMTIuOCAoKzMwMCUoKioqKSkKKy8vIE1vbmdvb3NlCTIuMzYJCTEzLjAgKCs1MCUpCTguMzYgKCszMyUpCisvLworLy8gKCopCVNvZnR3YXJlIFNIQTI1NiByZXN1bHRzIGFyZSBvZiBsZXNzZXIgcmVsZXZhbmNlLCBwcmVzZW50ZWQKKy8vCW1vc3RseSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3Nlcy4KKy8vICgqKikJVGhlIHJlc3VsdCBpcyBhIHRyYWRlLW9mZjogaXQncyBwb3NzaWJsZSB0byBpbXByb3ZlIGl0IGJ5CisvLwkxMCUgKG9yIGJ5IDEgY3ljbGUgcGVyIHJvdW5kKSwgYnV0IGF0IHRoZSBjb3N0IG9mIDIwJSBsb3NzCisvLwlvbiBDb3J0ZXgtQTUzIChvciBieSA0IGN5Y2xlcyBwZXIgcm91bmQpLgorLy8gKCoqKikJU3VwZXItaW1wcmVzc2l2ZSBjb2VmZmljaWVudHMgb3ZlciBnY2MtZ2VuZXJhdGVkIGNvZGUgYXJlCisvLwlpbmRpY2F0aW9uIG9mIHNvbWUgY29tcGlsZXIgInBhdGhvbG9neSIsIG1vc3Qgbm90YWJseSBjb2RlCisvLwlnZW5lcmF0ZWQgd2l0aCAtbWdlbmVyYWwtcmVncy1vbmx5IGlzIHNpZ25pZmljYW50eSBmYXN0ZXIKKy8vCWFuZCB0aGUgZ2FwIGlzIG9ubHkgNDAtOTAlLgorCisjaWZuZGVmCV9fS0VSTkVMX18KKyMgaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2VuZGlmCisKKy50ZXh0CisKKworLmdsb2JsCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnByaXZhdGVfZXh0ZXJuCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorCisuYWxpZ24JNgorX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorCXN0cAl4MjkseDMwLFtzcCwjLTEyOF0hCisJYWRkCXgyOSxzcCwjMAorCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisJc3RwCXgyNSx4MjYsW3NwLCM2NF0KKwlzdHAJeDI3LHgyOCxbc3AsIzgwXQorCXN1YglzcCxzcCwjNCo4CisKKwlsZHAJeDIwLHgyMSxbeDBdCQkJCS8vIGxvYWQgY29udGV4dAorCWxkcAl4MjIseDIzLFt4MCwjMio4XQorCWxkcAl4MjQseDI1LFt4MCwjNCo4XQorCWFkZAl4Mix4MSx4Mixsc2wjNwkvLyBlbmQgb2YgaW5wdXQKKwlsZHAJeDI2LHgyNyxbeDAsIzYqOF0KKwlhZHIJeDMwLExLNTEyCisJc3RwCXgwLHgyLFt4MjksIzk2XQorCitMb29wOgorCWxkcAl4Myx4NCxbeDFdLCMyKjgKKwlsZHIJeDE5LFt4MzBdLCM4CQkJLy8gKksrKworCWVvcgl4MjgseDIxLHgyMgkJCQkvLyBtYWdpYyBzZWVkCisJc3RyCXgxLFt4MjksIzExMl0KKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgzLHgzCQkJLy8gMAorI2VuZGlmCisJcm9yCXgxNix4MjQsIzE0CisJYWRkCXgyNyx4MjcseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4Nix4MjQseDI0LHJvciMyMworCWFuZAl4MTcseDI1LHgyNAorCWJpYwl4MTkseDI2LHgyNAorCWFkZAl4MjcseDI3LHgzCQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDIwLHgyMQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Nixyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg2LHgyMCwjMjgKKwlhZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMCx4MjAscm9yIzUKKwlhZGQJeDI3LHgyNyx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIzLHgyMyx4MjcJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDYseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDI3LHgyNyx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjcseDI3LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDQseDQJCQkvLyAxCisjZW5kaWYKKwlsZHAJeDUseDYsW3gxXSwjMio4CisJYWRkCXgyNyx4MjcseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjMsIzE0CisJYWRkCXgyNix4MjYseDI4CQkJLy8gaCs9S1tpXQorCWVvcgl4Nyx4MjMseDIzLHJvciMyMworCWFuZAl4MTcseDI0LHgyMworCWJpYwl4MjgseDI1LHgyMworCWFkZAl4MjYseDI2LHg0CQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDI3LHgyMAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Nyxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg3LHgyNywjMjgKKwlhZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyNyx4Mjcscm9yIzUKKwlhZGQJeDI2LHgyNix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIyLHgyMix4MjYJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDIwCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDcseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDI2LHgyNix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjYseDI2LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDUseDUJCQkvLyAyCisjZW5kaWYKKwlhZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyMiwjMTQKKwlhZGQJeDI1LHgyNSx4MTkJCQkvLyBoKz1LW2ldCisJZW9yCXg4LHgyMix4MjIscm9yIzIzCisJYW5kCXgxNyx4MjMseDIyCisJYmljCXgxOSx4MjQseDIyCisJYWRkCXgyNSx4MjUseDUJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjYseDI3CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHg4LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDgseDI2LCMyOAorCWFkZAl4MjUseDI1LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl4MTcseDI2LHgyNixyb3IjNQorCWFkZAl4MjUseDI1LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl4MjEseDIxLHgyNQkJCS8vIGQrPWgKKwllb3IJeDI4LHgyOCx4MjcJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4OCx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjUseDI1LHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyNSx4MjUseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4Nix4NgkJCS8vIDMKKyNlbmRpZgorCWxkcAl4Nyx4OCxbeDFdLCMyKjgKKwlhZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyMSwjMTQKKwlhZGQJeDI0LHgyNCx4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXg5LHgyMSx4MjEscm9yIzIzCisJYW5kCXgxNyx4MjIseDIxCisJYmljCXgyOCx4MjMseDIxCisJYWRkCXgyNCx4MjQseDYJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjUseDI2CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHg5LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDkseDI1LCMyOAorCWFkZAl4MjQseDI0LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl4MTcseDI1LHgyNSxyb3IjNQorCWFkZAl4MjQseDI0LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl4MjAseDIwLHgyNAkJCS8vIGQrPWgKKwllb3IJeDE5LHgxOSx4MjYJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4OSx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjQseDI0LHgxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDE5LFt4MzBdLCM4CQkvLyAqSysrLCB4MjggaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyNCx4MjQseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4Nyx4NwkJCS8vIDQKKyNlbmRpZgorCWFkZAl4MjQseDI0LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl4MTYseDIwLCMxNAorCWFkZAl4MjMseDIzLHgxOQkJCS8vIGgrPUtbaV0KKwllb3IJeDEwLHgyMCx4MjAscm9yIzIzCisJYW5kCXgxNyx4MjEseDIwCisJYmljCXgxOSx4MjIseDIwCisJYWRkCXgyMyx4MjMseDcJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjQseDI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgxMCxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXgxMCx4MjQsIzI4CisJYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXgxNyx4MjQseDI0LHJvciM1CisJYWRkCXgyMyx4MjMseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXgyNyx4MjcseDIzCQkJLy8gZCs9aAorCWVvcgl4MjgseDI4LHgyNQkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgxMCx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjMseDIzLHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4OCx4OAkJCS8vIDUKKyNlbmRpZgorCWxkcAl4OSx4MTAsW3gxXSwjMio4CisJYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjcsIzE0CisJYWRkCXgyMix4MjIseDI4CQkJLy8gaCs9S1tpXQorCWVvcgl4MTEseDI3LHgyNyxyb3IjMjMKKwlhbmQJeDE3LHgyMCx4MjcKKwliaWMJeDI4LHgyMSx4MjcKKwlhZGQJeDIyLHgyMix4OAkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyMyx4MjQJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDExLHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDExLHgyMywjMjgKKwlhZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMyx4MjMscm9yIzUKKwlhZGQJeDIyLHgyMix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI2LHgyNix4MjIJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDExLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyMix4MjIseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXg5LHg5CQkJLy8gNgorI2VuZGlmCisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjYsIzE0CisJYWRkCXgyMSx4MjEseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4MTIseDI2LHgyNixyb3IjMjMKKwlhbmQJeDE3LHgyNyx4MjYKKwliaWMJeDE5LHgyMCx4MjYKKwlhZGQJeDIxLHgyMSx4OQkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMix4MjMJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDEyLHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDEyLHgyMiwjMjgKKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMix4MjIscm9yIzUKKwlhZGQJeDIxLHgyMSx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI1LHgyNSx4MjEJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIzCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDEyLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyMSx4MjEseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMCx4MTAJCQkvLyA3CisjZW5kaWYKKwlsZHAJeDExLHgxMixbeDFdLCMyKjgKKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyNSwjMTQKKwlhZGQJeDIwLHgyMCx4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXgxMyx4MjUseDI1LHJvciMyMworCWFuZAl4MTcseDI2LHgyNQorCWJpYwl4MjgseDI3LHgyNQorCWFkZAl4MjAseDIwLHgxMAkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyMSx4MjIJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDEzLHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDEzLHgyMSwjMjgKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMSx4MjEscm9yIzUKKwlhZGQJeDIwLHgyMCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI0LHgyNCx4MjAJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDIyCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDEzLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyMCx4MjAseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMSx4MTEJCQkvLyA4CisjZW5kaWYKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyNCwjMTQKKwlhZGQJeDI3LHgyNyx4MTkJCQkvLyBoKz1LW2ldCisJZW9yCXgxNCx4MjQseDI0LHJvciMyMworCWFuZAl4MTcseDI1LHgyNAorCWJpYwl4MTkseDI2LHgyNAorCWFkZAl4MjcseDI3LHgxMQkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMCx4MjEJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDE0LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDE0LHgyMCwjMjgKKwlhZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMCx4MjAscm9yIzUKKwlhZGQJeDI3LHgyNyx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIzLHgyMyx4MjcJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDE0LHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyNyx4MjcseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMix4MTIJCQkvLyA5CisjZW5kaWYKKwlsZHAJeDEzLHgxNCxbeDFdLCMyKjgKKwlhZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyMywjMTQKKwlhZGQJeDI2LHgyNix4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXgxNSx4MjMseDIzLHJvciMyMworCWFuZAl4MTcseDI0LHgyMworCWJpYwl4MjgseDI1LHgyMworCWFkZAl4MjYseDI2LHgxMgkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyNyx4MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDE1LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDE1LHgyNywjMjgKKwlhZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyNyx4Mjcscm9yIzUKKwlhZGQJeDI2LHgyNix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIyLHgyMix4MjYJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDIwCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDE1LHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyNix4MjYseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMyx4MTMJCQkvLyAxMAorI2VuZGlmCisJYWRkCXgyNix4MjYseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjIsIzE0CisJYWRkCXgyNSx4MjUseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4MCx4MjIseDIyLHJvciMyMworCWFuZAl4MTcseDIzLHgyMgorCWJpYwl4MTkseDI0LHgyMgorCWFkZAl4MjUseDI1LHgxMwkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyNix4MjcJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDAscm9yIzE4CS8vIFNpZ21hMShlKQorCXJvcgl4MCx4MjYsIzI4CisJYWRkCXgyNSx4MjUseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXgxNyx4MjYseDI2LHJvciM1CisJYWRkCXgyNSx4MjUseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXgyMSx4MjEseDI1CQkJLy8gZCs9aAorCWVvcgl4MjgseDI4LHgyNwkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgwLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyNSx4MjUseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxNCx4MTQJCQkvLyAxMQorI2VuZGlmCisJbGRwCXgxNSx4MCxbeDFdLCMyKjgKKwlhZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJeDYsW3NwLCMyNF0KKwlyb3IJeDE2LHgyMSwjMTQKKwlhZGQJeDI0LHgyNCx4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXg2LHgyMSx4MjEscm9yIzIzCisJYW5kCXgxNyx4MjIseDIxCisJYmljCXgyOCx4MjMseDIxCisJYWRkCXgyNCx4MjQseDE0CQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDI1LHgyNgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Nixyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg2LHgyNSwjMjgKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyNSx4MjUscm9yIzUKKwlhZGQJeDI0LHgyNCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIwLHgyMCx4MjQJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDI2CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDYseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDI0LHgyNCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjQseDI0LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDE1LHgxNQkJCS8vIDEyCisjZW5kaWYKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJeDcsW3NwLCMwXQorCXJvcgl4MTYseDIwLCMxNAorCWFkZAl4MjMseDIzLHgxOQkJCS8vIGgrPUtbaV0KKwllb3IJeDcseDIwLHgyMCxyb3IjMjMKKwlhbmQJeDE3LHgyMSx4MjAKKwliaWMJeDE5LHgyMix4MjAKKwlhZGQJeDIzLHgyMyx4MTUJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjQseDI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHg3LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDcseDI0LCMyOAorCWFkZAl4MjMseDIzLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl4MTcseDI0LHgyNCxyb3IjNQorCWFkZAl4MjMseDIzLHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl4MjcseDI3LHgyMwkJCS8vIGQrPWgKKwllb3IJeDI4LHgyOCx4MjUJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4Nyx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjMseDIzLHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4MCx4MAkJCS8vIDEzCisjZW5kaWYKKwlsZHAJeDEseDIsW3gxXQorCWFkZAl4MjMseDIzLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCXN0cgl4OCxbc3AsIzhdCisJcm9yCXgxNix4MjcsIzE0CisJYWRkCXgyMix4MjIseDI4CQkJLy8gaCs9S1tpXQorCWVvcgl4OCx4MjcseDI3LHJvciMyMworCWFuZAl4MTcseDIwLHgyNworCWJpYwl4MjgseDIxLHgyNworCWFkZAl4MjIseDIyLHgwCQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDIzLHgyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4OCxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg4LHgyMywjMjgKKwlhZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMyx4MjMscm9yIzUKKwlhZGQJeDIyLHgyMix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI2LHgyNix4MjIJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDgseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDIyLHgyMix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjIseDIyLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDEseDEJCQkvLyAxNAorI2VuZGlmCisJbGRyCXg2LFtzcCwjMjRdCisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJc3RyCXg5LFtzcCwjMTZdCisJcm9yCXgxNix4MjYsIzE0CisJYWRkCXgyMSx4MjEseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4OSx4MjYseDI2LHJvciMyMworCWFuZAl4MTcseDI3LHgyNgorCWJpYwl4MTkseDIwLHgyNgorCWFkZAl4MjEseDIxLHgxCQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDIyLHgyMwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4OSxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg5LHgyMiwjMjgKKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMix4MjIscm9yIzUKKwlhZGQJeDIxLHgyMSx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI1LHgyNSx4MjEJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIzCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDkseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDIxLHgyMSx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjEseDIxLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDIseDIJCQkvLyAxNQorI2VuZGlmCisJbGRyCXg3LFtzcCwjMF0KKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJeDEwLFtzcCwjMjRdCisJcm9yCXgxNix4MjUsIzE0CisJYWRkCXgyMCx4MjAseDI4CQkJLy8gaCs9S1tpXQorCXJvcgl4OSx4NCwjMQorCWFuZAl4MTcseDI2LHgyNQorCXJvcgl4OCx4MSwjMTkKKwliaWMJeDI4LHgyNyx4MjUKKwlyb3IJeDEwLHgyMSwjMjgKKwlhZGQJeDIwLHgyMCx4MgkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjUscm9yIzE4CisJZW9yCXg5LHg5LHg0LHJvciM4CisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjEseDIyCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyNSxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgxMCx4MTAseDIxLHJvciMzNAorCWFkZAl4MjAseDIwLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4OCx4OCx4MSxyb3IjNjEKKwllb3IJeDkseDkseDQsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIwLHgyMCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjIJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4MTAseDIxLHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDgseDgseDEsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgzLHgzLHgxMgorCWFkZAl4MjQseDI0LHgyMAkJCS8vIGQrPWgKKwlhZGQJeDIwLHgyMCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDMseDMseDkKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDMseDMseDgKK0xvb3BfMTZfeHg6CisJbGRyCXg4LFtzcCwjOF0KKwlzdHIJeDExLFtzcCwjMF0KKwlyb3IJeDE2LHgyNCwjMTQKKwlhZGQJeDI3LHgyNyx4MTkJCQkvLyBoKz1LW2ldCisJcm9yCXgxMCx4NSwjMQorCWFuZAl4MTcseDI1LHgyNAorCXJvcgl4OSx4MiwjMTkKKwliaWMJeDE5LHgyNix4MjQKKwlyb3IJeDExLHgyMCwjMjgKKwlhZGQJeDI3LHgyNyx4MwkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjQscm9yIzE4CisJZW9yCXgxMCx4MTAseDUscm9yIzgKKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMCx4MjEJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDI0LHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDExLHgxMSx4MjAscm9yIzM0CisJYWRkCXgyNyx4MjcseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXg5LHg5LHgyLHJvciM2MQorCWVvcgl4MTAseDEwLHg1LGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyNyx4MjcseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgyOCx4MjgseDIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDExLHgyMCxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXg5LHg5LHgyLGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4NCx4NCx4MTMKKwlhZGQJeDIzLHgyMyx4MjcJCQkvLyBkKz1oCisJYWRkCXgyNyx4MjcseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXg0LHg0LHgxMAorCWFkZAl4MjcseDI3LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4NCx4NCx4OQorCWxkcgl4OSxbc3AsIzE2XQorCXN0cgl4MTIsW3NwLCM4XQorCXJvcgl4MTYseDIzLCMxNAorCWFkZAl4MjYseDI2LHgyOAkJCS8vIGgrPUtbaV0KKwlyb3IJeDExLHg2LCMxCisJYW5kCXgxNyx4MjQseDIzCisJcm9yCXgxMCx4MywjMTkKKwliaWMJeDI4LHgyNSx4MjMKKwlyb3IJeDEyLHgyNywjMjgKKwlhZGQJeDI2LHgyNix4NAkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjMscm9yIzE4CisJZW9yCXgxMSx4MTEseDYscm9yIzgKKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyNyx4MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDIzLHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDEyLHgxMix4Mjcscm9yIzM0CisJYWRkCXgyNix4MjYseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgxOSx4MTkseDI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXgxMCx4MTAseDMscm9yIzYxCisJZW9yCXgxMSx4MTEseDYsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDI2LHgyNix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjAJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4MTIseDI3LHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDEwLHgxMCx4Myxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDUseDUseDE0CisJYWRkCXgyMix4MjIseDI2CQkJLy8gZCs9aAorCWFkZAl4MjYseDI2LHgxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDE5LFt4MzBdLCM4CQkvLyAqSysrLCB4MjggaW4gbmV4dCByb3VuZAorCWFkZAl4NSx4NSx4MTEKKwlhZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDUseDUseDEwCisJbGRyCXgxMCxbc3AsIzI0XQorCXN0cgl4MTMsW3NwLCMxNl0KKwlyb3IJeDE2LHgyMiwjMTQKKwlhZGQJeDI1LHgyNSx4MTkJCQkvLyBoKz1LW2ldCisJcm9yCXgxMix4NywjMQorCWFuZAl4MTcseDIzLHgyMgorCXJvcgl4MTEseDQsIzE5CisJYmljCXgxOSx4MjQseDIyCisJcm9yCXgxMyx4MjYsIzI4CisJYWRkCXgyNSx4MjUseDUJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDIyLHJvciMxOAorCWVvcgl4MTIseDEyLHg3LHJvciM4CisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjYseDI3CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyMixyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgxMyx4MTMseDI2LHJvciMzNAorCWFkZAl4MjUseDI1LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4MTEseDExLHg0LHJvciM2MQorCWVvcgl4MTIseDEyLHg3LGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyNSx4MjUseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgyOCx4MjgseDI3CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDEzLHgyNixyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXgxMSx4MTEseDQsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXg2LHg2LHgxNQorCWFkZAl4MjEseDIxLHgyNQkJCS8vIGQrPWgKKwlhZGQJeDI1LHgyNSx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwlhZGQJeDYseDYseDEyCisJYWRkCXgyNSx4MjUseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXg2LHg2LHgxMQorCWxkcgl4MTEsW3NwLCMwXQorCXN0cgl4MTQsW3NwLCMyNF0KKwlyb3IJeDE2LHgyMSwjMTQKKwlhZGQJeDI0LHgyNCx4MjgJCQkvLyBoKz1LW2ldCisJcm9yCXgxMyx4OCwjMQorCWFuZAl4MTcseDIyLHgyMQorCXJvcgl4MTIseDUsIzE5CisJYmljCXgyOCx4MjMseDIxCisJcm9yCXgxNCx4MjUsIzI4CisJYWRkCXgyNCx4MjQseDYJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDIxLHJvciMxOAorCWVvcgl4MTMseDEzLHg4LHJvciM4CisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjUseDI2CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyMSxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgxNCx4MTQseDI1LHJvciMzNAorCWFkZAl4MjQseDI0LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4MTIseDEyLHg1LHJvciM2MQorCWVvcgl4MTMseDEzLHg4LGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyNCx4MjQseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgxOSx4MTkseDI2CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDE0LHgyNSxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXgxMix4MTIseDUsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXg3LHg3LHgwCisJYWRkCXgyMCx4MjAseDI0CQkJLy8gZCs9aAorCWFkZAl4MjQseDI0LHgxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDE5LFt4MzBdLCM4CQkvLyAqSysrLCB4MjggaW4gbmV4dCByb3VuZAorCWFkZAl4Nyx4Nyx4MTMKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDcseDcseDEyCisJbGRyCXgxMixbc3AsIzhdCisJc3RyCXgxNSxbc3AsIzBdCisJcm9yCXgxNix4MjAsIzE0CisJYWRkCXgyMyx4MjMseDE5CQkJLy8gaCs9S1tpXQorCXJvcgl4MTQseDksIzEKKwlhbmQJeDE3LHgyMSx4MjAKKwlyb3IJeDEzLHg2LCMxOQorCWJpYwl4MTkseDIyLHgyMAorCXJvcgl4MTUseDI0LCMyOAorCWFkZAl4MjMseDIzLHg3CQkJLy8gaCs9WFtpXQorCWVvcgl4MTYseDE2LHgyMCxyb3IjMTgKKwllb3IJeDE0LHgxNCx4OSxyb3IjOAorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDI0LHgyNQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjAscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4MTUseDE1LHgyNCxyb3IjMzQKKwlhZGQJeDIzLHgyMyx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDEzLHgxMyx4Nixyb3IjNjEKKwllb3IJeDE0LHgxNCx4OSxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjMseDIzLHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyNQkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgxNSx4MjQscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4MTMseDEzLHg2LGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4OCx4OCx4MQorCWFkZAl4MjcseDI3LHgyMwkJCS8vIGQrPWgKKwlhZGQJeDIzLHgyMyx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwlhZGQJeDgseDgseDE0CisJYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXg4LHg4LHgxMworCWxkcgl4MTMsW3NwLCMxNl0KKwlzdHIJeDAsW3NwLCM4XQorCXJvcgl4MTYseDI3LCMxNAorCWFkZAl4MjIseDIyLHgyOAkJCS8vIGgrPUtbaV0KKwlyb3IJeDE1LHgxMCwjMQorCWFuZAl4MTcseDIwLHgyNworCXJvcgl4MTQseDcsIzE5CisJYmljCXgyOCx4MjEseDI3CisJcm9yCXgwLHgyMywjMjgKKwlhZGQJeDIyLHgyMix4OAkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4Mjcscm9yIzE4CisJZW9yCXgxNSx4MTUseDEwLHJvciM4CisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjMseDI0CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyNyxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgwLHgwLHgyMyxyb3IjMzQKKwlhZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDE0LHgxNCx4Nyxyb3IjNjEKKwllb3IJeDE1LHgxNSx4MTAsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIyLHgyMix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjQJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4MCx4MjMscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4MTQseDE0LHg3LGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4OSx4OSx4MgorCWFkZAl4MjYseDI2LHgyMgkJCS8vIGQrPWgKKwlhZGQJeDIyLHgyMix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDkseDkseDE1CisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXg5LHg5LHgxNAorCWxkcgl4MTQsW3NwLCMyNF0KKwlzdHIJeDEsW3NwLCMxNl0KKwlyb3IJeDE2LHgyNiwjMTQKKwlhZGQJeDIxLHgyMSx4MTkJCQkvLyBoKz1LW2ldCisJcm9yCXgwLHgxMSwjMQorCWFuZAl4MTcseDI3LHgyNgorCXJvcgl4MTUseDgsIzE5CisJYmljCXgxOSx4MjAseDI2CisJcm9yCXgxLHgyMiwjMjgKKwlhZGQJeDIxLHgyMSx4OQkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjYscm9yIzE4CisJZW9yCXgwLHgwLHgxMSxyb3IjOAorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDIyLHgyMwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjYscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4MSx4MSx4MjIscm9yIzM0CisJYWRkCXgyMSx4MjEseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXgxNSx4MTUseDgscm9yIzYxCisJZW9yCXgwLHgwLHgxMSxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjEseDIxLHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyMwkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgxLHgyMixyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXgxNSx4MTUseDgsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgxMCx4MTAseDMKKwlhZGQJeDI1LHgyNSx4MjEJCQkvLyBkKz1oCisJYWRkCXgyMSx4MjEseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXgxMCx4MTAseDAKKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDEwLHgxMCx4MTUKKwlsZHIJeDE1LFtzcCwjMF0KKwlzdHIJeDIsW3NwLCMyNF0KKwlyb3IJeDE2LHgyNSwjMTQKKwlhZGQJeDIwLHgyMCx4MjgJCQkvLyBoKz1LW2ldCisJcm9yCXgxLHgxMiwjMQorCWFuZAl4MTcseDI2LHgyNQorCXJvcgl4MCx4OSwjMTkKKwliaWMJeDI4LHgyNyx4MjUKKwlyb3IJeDIseDIxLCMyOAorCWFkZAl4MjAseDIwLHgxMAkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjUscm9yIzE4CisJZW9yCXgxLHgxLHgxMixyb3IjOAorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDIxLHgyMgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjUscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4Mix4Mix4MjEscm9yIzM0CisJYWRkCXgyMCx4MjAseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgxOSx4MTkseDI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXgwLHgwLHg5LHJvciM2MQorCWVvcgl4MSx4MSx4MTIsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIwLHgyMCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjIJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4Mix4MjEscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4MCx4MCx4OSxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDExLHgxMSx4NAorCWFkZAl4MjQseDI0LHgyMAkJCS8vIGQrPWgKKwlhZGQJeDIwLHgyMCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDExLHgxMSx4MQorCWFkZAl4MjAseDIwLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4MTEseDExLHgwCisJbGRyCXgwLFtzcCwjOF0KKwlzdHIJeDMsW3NwLCMwXQorCXJvcgl4MTYseDI0LCMxNAorCWFkZAl4MjcseDI3LHgxOQkJCS8vIGgrPUtbaV0KKwlyb3IJeDIseDEzLCMxCisJYW5kCXgxNyx4MjUseDI0CisJcm9yCXgxLHgxMCwjMTkKKwliaWMJeDE5LHgyNix4MjQKKwlyb3IJeDMseDIwLCMyOAorCWFkZAl4MjcseDI3LHgxMQkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjQscm9yIzE4CisJZW9yCXgyLHgyLHgxMyxyb3IjOAorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDIwLHgyMQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjQscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4Myx4Myx4MjAscm9yIzM0CisJYWRkCXgyNyx4MjcseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXgxLHgxLHgxMCxyb3IjNjEKKwllb3IJeDIseDIseDEzLGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyNyx4MjcseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgyOCx4MjgseDIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDMseDIwLHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDEseDEseDEwLGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4MTIseDEyLHg1CisJYWRkCXgyMyx4MjMseDI3CQkJLy8gZCs9aAorCWFkZAl4MjcseDI3LHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCWFkZAl4MTIseDEyLHgyCisJYWRkCXgyNyx4MjcseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXgxMix4MTIseDEKKwlsZHIJeDEsW3NwLCMxNl0KKwlzdHIJeDQsW3NwLCM4XQorCXJvcgl4MTYseDIzLCMxNAorCWFkZAl4MjYseDI2LHgyOAkJCS8vIGgrPUtbaV0KKwlyb3IJeDMseDE0LCMxCisJYW5kCXgxNyx4MjQseDIzCisJcm9yCXgyLHgxMSwjMTkKKwliaWMJeDI4LHgyNSx4MjMKKwlyb3IJeDQseDI3LCMyOAorCWFkZAl4MjYseDI2LHgxMgkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjMscm9yIzE4CisJZW9yCXgzLHgzLHgxNCxyb3IjOAorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDI3LHgyMAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjMscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4NCx4NCx4Mjcscm9yIzM0CisJYWRkCXgyNix4MjYseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgxOSx4MTkseDI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXgyLHgyLHgxMSxyb3IjNjEKKwllb3IJeDMseDMseDE0LGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyNix4MjYseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgxOSx4MTkseDIwCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDQseDI3LHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDIseDIseDExLGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4MTMseDEzLHg2CisJYWRkCXgyMix4MjIseDI2CQkJLy8gZCs9aAorCWFkZAl4MjYseDI2LHgxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDE5LFt4MzBdLCM4CQkvLyAqSysrLCB4MjggaW4gbmV4dCByb3VuZAorCWFkZAl4MTMseDEzLHgzCisJYWRkCXgyNix4MjYseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXgxMyx4MTMseDIKKwlsZHIJeDIsW3NwLCMyNF0KKwlzdHIJeDUsW3NwLCMxNl0KKwlyb3IJeDE2LHgyMiwjMTQKKwlhZGQJeDI1LHgyNSx4MTkJCQkvLyBoKz1LW2ldCisJcm9yCXg0LHgxNSwjMQorCWFuZAl4MTcseDIzLHgyMgorCXJvcgl4Myx4MTIsIzE5CisJYmljCXgxOSx4MjQseDIyCisJcm9yCXg1LHgyNiwjMjgKKwlhZGQJeDI1LHgyNSx4MTMJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDIyLHJvciMxOAorCWVvcgl4NCx4NCx4MTUscm9yIzgKKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyNix4MjcJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDIyLHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDUseDUseDI2LHJvciMzNAorCWFkZAl4MjUseDI1LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4Myx4Myx4MTIscm9yIzYxCisJZW9yCXg0LHg0LHgxNSxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjUseDI1LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyNwkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHg1LHgyNixyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXgzLHgzLHgxMixsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDE0LHgxNCx4NworCWFkZAl4MjEseDIxLHgyNQkJCS8vIGQrPWgKKwlhZGQJeDI1LHgyNSx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwlhZGQJeDE0LHgxNCx4NAorCWFkZAl4MjUseDI1LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4MTQseDE0LHgzCisJbGRyCXgzLFtzcCwjMF0KKwlzdHIJeDYsW3NwLCMyNF0KKwlyb3IJeDE2LHgyMSwjMTQKKwlhZGQJeDI0LHgyNCx4MjgJCQkvLyBoKz1LW2ldCisJcm9yCXg1LHgwLCMxCisJYW5kCXgxNyx4MjIseDIxCisJcm9yCXg0LHgxMywjMTkKKwliaWMJeDI4LHgyMyx4MjEKKwlyb3IJeDYseDI1LCMyOAorCWFkZAl4MjQseDI0LHgxNAkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjEscm9yIzE4CisJZW9yCXg1LHg1LHgwLHJvciM4CisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjUseDI2CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyMSxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXg2LHg2LHgyNSxyb3IjMzQKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDQseDQseDEzLHJvciM2MQorCWVvcgl4NSx4NSx4MCxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjQseDI0LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MTkseDE5LHgyNgkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHg2LHgyNSxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXg0LHg0LHgxMyxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDE1LHgxNSx4OAorCWFkZAl4MjAseDIwLHgyNAkJCS8vIGQrPWgKKwlhZGQJeDI0LHgyNCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDE1LHgxNSx4NQorCWFkZAl4MjQseDI0LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4MTUseDE1LHg0CisJbGRyCXg0LFtzcCwjOF0KKwlzdHIJeDcsW3NwLCMwXQorCXJvcgl4MTYseDIwLCMxNAorCWFkZAl4MjMseDIzLHgxOQkJCS8vIGgrPUtbaV0KKwlyb3IJeDYseDEsIzEKKwlhbmQJeDE3LHgyMSx4MjAKKwlyb3IJeDUseDE0LCMxOQorCWJpYwl4MTkseDIyLHgyMAorCXJvcgl4Nyx4MjQsIzI4CisJYWRkCXgyMyx4MjMseDE1CQkJLy8gaCs9WFtpXQorCWVvcgl4MTYseDE2LHgyMCxyb3IjMTgKKwllb3IJeDYseDYseDEscm9yIzgKKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyNCx4MjUJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDIwLHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDcseDcseDI0LHJvciMzNAorCWFkZAl4MjMseDIzLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4NSx4NSx4MTQscm9yIzYxCisJZW9yCXg2LHg2LHgxLGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyMyx4MjMseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgyOCx4MjgseDI1CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDcseDI0LHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDUseDUseDE0LGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4MCx4MCx4OQorCWFkZAl4MjcseDI3LHgyMwkJCS8vIGQrPWgKKwlhZGQJeDIzLHgyMyx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwlhZGQJeDAseDAseDYKKwlhZGQJeDIzLHgyMyx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDAseDAseDUKKwlsZHIJeDUsW3NwLCMxNl0KKwlzdHIJeDgsW3NwLCM4XQorCXJvcgl4MTYseDI3LCMxNAorCWFkZAl4MjIseDIyLHgyOAkJCS8vIGgrPUtbaV0KKwlyb3IJeDcseDIsIzEKKwlhbmQJeDE3LHgyMCx4MjcKKwlyb3IJeDYseDE1LCMxOQorCWJpYwl4MjgseDIxLHgyNworCXJvcgl4OCx4MjMsIzI4CisJYWRkCXgyMix4MjIseDAJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI3LHJvciMxOAorCWVvcgl4Nyx4Nyx4Mixyb3IjOAorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDIzLHgyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Mjcscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4OCx4OCx4MjMscm9yIzM0CisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgxOSx4MTkseDI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXg2LHg2LHgxNSxyb3IjNjEKKwllb3IJeDcseDcseDIsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIyLHgyMix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjQJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4OCx4MjMscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4Nix4Nix4MTUsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgxLHgxLHgxMAorCWFkZAl4MjYseDI2LHgyMgkJCS8vIGQrPWgKKwlhZGQJeDIyLHgyMix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDEseDEseDcKKwlhZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDEseDEseDYKKwlsZHIJeDYsW3NwLCMyNF0KKwlzdHIJeDksW3NwLCMxNl0KKwlyb3IJeDE2LHgyNiwjMTQKKwlhZGQJeDIxLHgyMSx4MTkJCQkvLyBoKz1LW2ldCisJcm9yCXg4LHgzLCMxCisJYW5kCXgxNyx4MjcseDI2CisJcm9yCXg3LHgwLCMxOQorCWJpYwl4MTkseDIwLHgyNgorCXJvcgl4OSx4MjIsIzI4CisJYWRkCXgyMSx4MjEseDEJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI2LHJvciMxOAorCWVvcgl4OCx4OCx4Myxyb3IjOAorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDIyLHgyMwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjYscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4OSx4OSx4MjIscm9yIzM0CisJYWRkCXgyMSx4MjEseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXg3LHg3LHgwLHJvciM2MQorCWVvcgl4OCx4OCx4Myxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjEseDIxLHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyMwkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHg5LHgyMixyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXg3LHg3LHgwLGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4Mix4Mix4MTEKKwlhZGQJeDI1LHgyNSx4MjEJCQkvLyBkKz1oCisJYWRkCXgyMSx4MjEseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXgyLHgyLHg4CisJYWRkCXgyMSx4MjEseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXgyLHgyLHg3CisJbGRyCXg3LFtzcCwjMF0KKwlzdHIJeDEwLFtzcCwjMjRdCisJcm9yCXgxNix4MjUsIzE0CisJYWRkCXgyMCx4MjAseDI4CQkJLy8gaCs9S1tpXQorCXJvcgl4OSx4NCwjMQorCWFuZAl4MTcseDI2LHgyNQorCXJvcgl4OCx4MSwjMTkKKwliaWMJeDI4LHgyNyx4MjUKKwlyb3IJeDEwLHgyMSwjMjgKKwlhZGQJeDIwLHgyMCx4MgkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjUscm9yIzE4CisJZW9yCXg5LHg5LHg0LHJvciM4CisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjEseDIyCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyNSxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgxMCx4MTAseDIxLHJvciMzNAorCWFkZAl4MjAseDIwLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4OCx4OCx4MSxyb3IjNjEKKwllb3IJeDkseDkseDQsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIwLHgyMCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjIJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4MTAseDIxLHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDgseDgseDEsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgzLHgzLHgxMgorCWFkZAl4MjQseDI0LHgyMAkJCS8vIGQrPWgKKwlhZGQJeDIwLHgyMCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDMseDMseDkKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDMseDMseDgKKwljYm56CXgxOSxMb29wXzE2X3h4CisKKwlsZHAJeDAseDIsW3gyOSwjOTZdCisJbGRyCXgxLFt4MjksIzExMl0KKwlzdWIJeDMwLHgzMCwjNjQ4CQkvLyByZXdpbmQKKworCWxkcAl4Myx4NCxbeDBdCisJbGRwCXg1LHg2LFt4MCwjMio4XQorCWFkZAl4MSx4MSwjMTQqOAkJCS8vIGFkdmFuY2UgaW5wdXQgcG9pbnRlcgorCWxkcAl4Nyx4OCxbeDAsIzQqOF0KKwlhZGQJeDIwLHgyMCx4MworCWxkcAl4OSx4MTAsW3gwLCM2KjhdCisJYWRkCXgyMSx4MjEseDQKKwlhZGQJeDIyLHgyMix4NQorCWFkZAl4MjMseDIzLHg2CisJc3RwCXgyMCx4MjEsW3gwXQorCWFkZAl4MjQseDI0LHg3CisJYWRkCXgyNSx4MjUseDgKKwlzdHAJeDIyLHgyMyxbeDAsIzIqOF0KKwlhZGQJeDI2LHgyNix4OQorCWFkZAl4MjcseDI3LHgxMAorCWNtcAl4MSx4MgorCXN0cAl4MjQseDI1LFt4MCwjNCo4XQorCXN0cAl4MjYseDI3LFt4MCwjNio4XQorCWIubmUJTG9vcAorCisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM0KjgKKwlsZHAJeDIxLHgyMixbeDI5LCMzMl0KKwlsZHAJeDIzLHgyNCxbeDI5LCM0OF0KKwlsZHAJeDI1LHgyNixbeDI5LCM2NF0KKwlsZHAJeDI3LHgyOCxbeDI5LCM4MF0KKwlsZHAJeDI5LHgzMCxbc3BdLCMxMjgKKwlyZXQKKworCisuYWxpZ24JNgorCitMSzUxMjoKKy5xdWFkCTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKy5xdWFkCTB4YjVjMGZiY2ZlYzRkM2IyZiwweGU5YjVkYmE1ODE4OWRiYmMKKy5xdWFkCTB4Mzk1NmMyNWJmMzQ4YjUzOCwweDU5ZjExMWYxYjYwNWQwMTkKKy5xdWFkCTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKy5xdWFkCTB4ZDgwN2FhOThhMzAzMDI0MiwweDEyODM1YjAxNDU3MDZmYmUKKy5xdWFkCTB4MjQzMTg1YmU0ZWU0YjI4YywweDU1MGM3ZGMzZDVmZmI0ZTIKKy5xdWFkCTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKy5xdWFkCTB4OWJkYzA2YTcyNWM3MTIzNSwweGMxOWJmMTc0Y2Y2OTI2OTQKKy5xdWFkCTB4ZTQ5YjY5YzE5ZWYxNGFkMiwweGVmYmU0Nzg2Mzg0ZjI1ZTMKKy5xdWFkCTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKy5xdWFkCTB4MmRlOTJjNmY1OTJiMDI3NSwweDRhNzQ4NGFhNmVhNmU0ODMKKy5xdWFkCTB4NWNiMGE5ZGNiZDQxZmJkNCwweDc2Zjk4OGRhODMxMTUzYjUKKy5xdWFkCTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKy5xdWFkCTB4YjAwMzI3Yzg5OGZiMjEzZiwweGJmNTk3ZmM3YmVlZjBlZTQKKy5xdWFkCTB4YzZlMDBiZjMzZGE4OGZjMiwweGQ1YTc5MTQ3OTMwYWE3MjUKKy5xdWFkCTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKy5xdWFkCTB4MjdiNzBhODU0NmQyMmZmYywweDJlMWIyMTM4NWMyNmM5MjYKKy5xdWFkCTB4NGQyYzZkZmM1YWM0MmFlZCwweDUzMzgwZDEzOWQ5NWIzZGYKKy5xdWFkCTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKy5xdWFkCTB4ODFjMmM5MmU0N2VkYWVlNiwweDkyNzIyYzg1MTQ4MjM1M2IKKy5xdWFkCTB4YTJiZmU4YTE0Y2YxMDM2NCwweGE4MWE2NjRiYmM0MjMwMDEKKy5xdWFkCTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKy5xdWFkCTB4ZDE5MmU4MTlkNmVmNTIxOCwweGQ2OTkwNjI0NTU2NWE5MTAKKy5xdWFkCTB4ZjQwZTM1ODU1NzcxMjAyYSwweDEwNmFhMDcwMzJiYmQxYjgKKy5xdWFkCTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKy5xdWFkCTB4Mjc0ODc3NGNkZjhlZWI5OSwweDM0YjBiY2I1ZTE5YjQ4YTgKKy5xdWFkCTB4MzkxYzBjYjNjNWM5NWE2MywweDRlZDhhYTRhZTM0MThhY2IKKy5xdWFkCTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKy5xdWFkCTB4NzQ4ZjgyZWU1ZGVmYjJmYywweDc4YTU2MzZmNDMxNzJmNjAKKy5xdWFkCTB4ODRjODc4MTRhMWYwYWI3MiwweDhjYzcwMjA4MWE2NDM5ZWMKKy5xdWFkCTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKy5xdWFkCTB4YmVmOWEzZjdiMmM2NzkxNSwweGM2NzE3OGYyZTM3MjUzMmIKKy5xdWFkCTB4Y2EyNzNlY2VlYTI2NjE5YywweGQxODZiOGM3MjFjMGMyMDcKKy5xdWFkCTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKy5xdWFkCTB4MDZmMDY3YWE3MjE3NmZiYSwweDBhNjM3ZGM1YTJjODk4YTYKKy5xdWFkCTB4MTEzZjk4MDRiZWY5MGRhZSwweDFiNzEwYjM1MTMxYzQ3MWIKKy5xdWFkCTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKy5xdWFkCTB4M2M5ZWJlMGExNWM5YmViYywweDQzMWQ2N2M0OWMxMDBkNGMKKy5xdWFkCTB4NGNjNWQ0YmVjYjNlNDJiNiwweDU5N2YyOTljZmM2NTdlMmEKKy5xdWFkCTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKKy5xdWFkCTAJLy8gdGVybWluYXRvcgorCisjaWZuZGVmCV9fS0VSTkVMX18KKy5hbGlnbgkzCitMT1BFTlNTTF9hcm1jYXBfUDoKKyMgaWZkZWYJX19JTFAzMl9fCisubG9uZwlfT1BFTlNTTF9hcm1jYXBfUC0uCisjIGVsc2UKKy5xdWFkCV9PUEVOU1NMX2FybWNhcF9QLS4KKyMgZW5kaWYKKyNlbmRpZgorLmJ5dGUJODMsNzIsNjUsNTMsNDksNTAsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiw2NSw4Miw3NywxMTgsNTYsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTIKKy5hbGlnbgkyCisjaWZuZGVmCV9fS0VSTkVMX18KKy5jb21tCV9PUEVOU1NMX2FybWNhcF9QLDQsNAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2NoYWNoYS9jaGFjaGEtYXJtdjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vY2hhY2hhL2NoYWNoYS1hcm12NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzcxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2NoYWNoYS9jaGFjaGEtYXJtdjQuUwpAQCAtMCwwICsxLDE0ODMgQEAKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKK0AgU2lsZW5jZSBBUk12OCBkZXByZWNhdGVkIElUIGluc3RydWN0aW9uIHdhcm5pbmdzLiBUaGlzIGZpbGUgaXMgdXNlZCBieSBib3RoCitAIEFSTXY3IGFuZCBBUk12OCBwcm9jZXNzb3JzIGFuZCBkb2VzIG5vdCB1c2UgQVJNdjggaW5zdHJ1Y3Rpb25zLgorCisKKy50ZXh0CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKy5zeW50YXgJdW5pZmllZAorI2VuZGlmCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorLnRodW1iCisjZWxzZQorLmNvZGUJMzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgbGRyaHNiCWxkcmJocworI2VuZGlmCisKKy5hbGlnbgk1CitMc2lnbWE6CisubG9uZwkweDYxNzA3ODY1LDB4MzMyMDY0NmUsMHg3OTYyMmQzMiwweDZiMjA2NTc0CUAgZW5kaWFuLW5ldXRyYWwKK0xvbmU6CisubG9uZwkxLDAsMCwwCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworTE9QRU5TU0xfYXJtY2FwOgorLndvcmQJT1BFTlNTTF9hcm1jYXBfUC1MQ2hhQ2hhMjBfY3RyMzIKKyNlbHNlCisud29yZAktMQorI2VuZGlmCisKKy5nbG9ibAlfQ2hhQ2hhMjBfY3RyMzIKKy5wcml2YXRlX2V4dGVybglfQ2hhQ2hhMjBfY3RyMzIKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfQ2hhQ2hhMjBfY3RyMzIKKyNlbmRpZgorLmFsaWduCTUKK19DaGFDaGEyMF9jdHIzMjoKK0xDaGFDaGEyMF9jdHIzMjoKKwlsZHIJcjEyLFtzcCwjMF0JCUAgcHVsbCBwb2ludGVyIHRvIGNvdW50ZXIgYW5kIG5vbmNlCisJc3RtZGIJc3AhLHtyMCxyMSxyMixyNC1yMTEsbHJ9CisjaWYgX19BUk1fQVJDSF9fPDcgJiYgIWRlZmluZWQoX190aHVtYjJfXykKKwlzdWIJcjE0LHBjLCMxNgkJQCBfQ2hhQ2hhMjBfY3RyMzIKKyNlbHNlCisJYWRyCXIxNCxMQ2hhQ2hhMjBfY3RyMzIKKyNlbmRpZgorCWNtcAlyMiwjMAkJCUAgbGVuPT0wPworI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJZXEKKyNlbmRpZgorCWFkZGVxCXNwLHNwLCM0KjMKKwliZXEJTG5vX2RhdGEKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisJY21wCXIyLCMxOTIJCQlAIHRlc3QgbGVuCisJYmxzCUxzaG9ydAorCWxkcglyNCxbcjE0LCMtMzJdCisJbGRyCXI0LFtyMTQscjRdCisjIGlmZGVmCV9fQVBQTEVfXworCWxkcglyNCxbcjRdCisjIGVuZGlmCisJdHN0CXI0LCNBUk1WN19ORU9OCisJYm5lCUxDaGFDaGEyMF9uZW9uCitMc2hvcnQ6CisjZW5kaWYKKwlsZG1pYQlyMTIse3I0LHI1LHI2LHI3fQkJQCBsb2FkIGNvdW50ZXIgYW5kIG5vbmNlCisJc3ViCXNwLHNwLCM0KigxNikJCUAgb2ZmLWxvYWQgYXJlYQorCXN1YglyMTQscjE0LCM2NAkJQCBMc2lnbWEKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3fQkJQCBjb3B5IGNvdW50ZXIgYW5kIG5vbmNlCisJbGRtaWEJcjMse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTF9CQlAIGxvYWQga2V5CisJbGRtaWEJcjE0LHtyMCxyMSxyMixyM30JCUAgbG9hZCBzaWdtYQorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0JCUAgY29weSBrZXkKKwlzdG1kYglzcCEse3IwLHIxLHIyLHIzfQkJQCBjb3B5IHNpZ21hCisJc3RyCXIxMCxbc3AsIzQqKDE2KzEwKV0JQCBvZmYtbG9hZCAicngiCisJc3RyCXIxMSxbc3AsIzQqKDE2KzExKV0JQCBvZmYtbG9hZCAicngiCisJYglMb29wX291dGVyX2VudGVyCisKKy5hbGlnbgk0CitMb29wX291dGVyOgorCWxkbWlhCXNwLHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOX0JCUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwlzdHIJcjExLFtzcCwjNCooMzIrMildCUAgc2F2ZSBsZW4KKwlzdHIJcjEyLCAgW3NwLCM0KigzMisxKV0JQCBzYXZlIGlucAorCXN0cglyMTQsICBbc3AsIzQqKDMyKzApXQlAIHNhdmUgb3V0CitMb29wX291dGVyX2VudGVyOgorCWxkcglyMTEsIFtzcCwjNCooMTUpXQorCWxkcglyMTIsW3NwLCM0KigxMildCUAgbW9kdWxvLXNjaGVkdWxlZCBsb2FkCisJbGRyCXIxMCwgW3NwLCM0KigxMyldCisJbGRyCXIxNCxbc3AsIzQqKDE0KV0KKwlzdHIJcjExLCBbc3AsIzQqKDE2KzE1KV0KKwltb3YJcjExLCMxMAorCWIJTG9vcAorCisuYWxpZ24JNAorTG9vcDoKKwlzdWJzCXIxMSxyMTEsIzEKKwlhZGQJcjAscjAscjQKKwltb3YJcjEyLHIxMixyb3IjMTYKKwlhZGQJcjEscjEscjUKKwltb3YJcjEwLHIxMCxyb3IjMTYKKwllb3IJcjEyLHIxMixyMCxyb3IjMTYKKwllb3IJcjEwLHIxMCxyMSxyb3IjMTYKKwlhZGQJcjgscjgscjEyCisJbW92CXI0LHI0LHJvciMyMAorCWFkZAlyOSxyOSxyMTAKKwltb3YJcjUscjUscm9yIzIwCisJZW9yCXI0LHI0LHI4LHJvciMyMAorCWVvcglyNSxyNSxyOSxyb3IjMjAKKwlhZGQJcjAscjAscjQKKwltb3YJcjEyLHIxMixyb3IjMjQKKwlhZGQJcjEscjEscjUKKwltb3YJcjEwLHIxMCxyb3IjMjQKKwllb3IJcjEyLHIxMixyMCxyb3IjMjQKKwllb3IJcjEwLHIxMCxyMSxyb3IjMjQKKwlhZGQJcjgscjgscjEyCisJbW92CXI0LHI0LHJvciMyNQorCWFkZAlyOSxyOSxyMTAKKwltb3YJcjUscjUscm9yIzI1CisJc3RyCXIxMCxbc3AsIzQqKDE2KzEzKV0KKwlsZHIJcjEwLFtzcCwjNCooMTYrMTUpXQorCWVvcglyNCxyNCxyOCxyb3IjMjUKKwllb3IJcjUscjUscjkscm9yIzI1CisJc3RyCXI4LFtzcCwjNCooMTYrOCldCisJbGRyCXI4LFtzcCwjNCooMTYrMTApXQorCWFkZAlyMixyMixyNgorCW1vdglyMTQscjE0LHJvciMxNgorCXN0cglyOSxbc3AsIzQqKDE2KzkpXQorCWxkcglyOSxbc3AsIzQqKDE2KzExKV0KKwlhZGQJcjMscjMscjcKKwltb3YJcjEwLHIxMCxyb3IjMTYKKwllb3IJcjE0LHIxNCxyMixyb3IjMTYKKwllb3IJcjEwLHIxMCxyMyxyb3IjMTYKKwlhZGQJcjgscjgscjE0CisJbW92CXI2LHI2LHJvciMyMAorCWFkZAlyOSxyOSxyMTAKKwltb3YJcjcscjcscm9yIzIwCisJZW9yCXI2LHI2LHI4LHJvciMyMAorCWVvcglyNyxyNyxyOSxyb3IjMjAKKwlhZGQJcjIscjIscjYKKwltb3YJcjE0LHIxNCxyb3IjMjQKKwlhZGQJcjMscjMscjcKKwltb3YJcjEwLHIxMCxyb3IjMjQKKwllb3IJcjE0LHIxNCxyMixyb3IjMjQKKwllb3IJcjEwLHIxMCxyMyxyb3IjMjQKKwlhZGQJcjgscjgscjE0CisJbW92CXI2LHI2LHJvciMyNQorCWFkZAlyOSxyOSxyMTAKKwltb3YJcjcscjcscm9yIzI1CisJZW9yCXI2LHI2LHI4LHJvciMyNQorCWVvcglyNyxyNyxyOSxyb3IjMjUKKwlhZGQJcjAscjAscjUKKwltb3YJcjEwLHIxMCxyb3IjMTYKKwlhZGQJcjEscjEscjYKKwltb3YJcjEyLHIxMixyb3IjMTYKKwllb3IJcjEwLHIxMCxyMCxyb3IjMTYKKwllb3IJcjEyLHIxMixyMSxyb3IjMTYKKwlhZGQJcjgscjgscjEwCisJbW92CXI1LHI1LHJvciMyMAorCWFkZAlyOSxyOSxyMTIKKwltb3YJcjYscjYscm9yIzIwCisJZW9yCXI1LHI1LHI4LHJvciMyMAorCWVvcglyNixyNixyOSxyb3IjMjAKKwlhZGQJcjAscjAscjUKKwltb3YJcjEwLHIxMCxyb3IjMjQKKwlhZGQJcjEscjEscjYKKwltb3YJcjEyLHIxMixyb3IjMjQKKwllb3IJcjEwLHIxMCxyMCxyb3IjMjQKKwllb3IJcjEyLHIxMixyMSxyb3IjMjQKKwlhZGQJcjgscjgscjEwCisJbW92CXI1LHI1LHJvciMyNQorCXN0cglyMTAsW3NwLCM0KigxNisxNSldCisJbGRyCXIxMCxbc3AsIzQqKDE2KzEzKV0KKwlhZGQJcjkscjkscjEyCisJbW92CXI2LHI2LHJvciMyNQorCWVvcglyNSxyNSxyOCxyb3IjMjUKKwllb3IJcjYscjYscjkscm9yIzI1CisJc3RyCXI4LFtzcCwjNCooMTYrMTApXQorCWxkcglyOCxbc3AsIzQqKDE2KzgpXQorCWFkZAlyMixyMixyNworCW1vdglyMTAscjEwLHJvciMxNgorCXN0cglyOSxbc3AsIzQqKDE2KzExKV0KKwlsZHIJcjksW3NwLCM0KigxNis5KV0KKwlhZGQJcjMscjMscjQKKwltb3YJcjE0LHIxNCxyb3IjMTYKKwllb3IJcjEwLHIxMCxyMixyb3IjMTYKKwllb3IJcjE0LHIxNCxyMyxyb3IjMTYKKwlhZGQJcjgscjgscjEwCisJbW92CXI3LHI3LHJvciMyMAorCWFkZAlyOSxyOSxyMTQKKwltb3YJcjQscjQscm9yIzIwCisJZW9yCXI3LHI3LHI4LHJvciMyMAorCWVvcglyNCxyNCxyOSxyb3IjMjAKKwlhZGQJcjIscjIscjcKKwltb3YJcjEwLHIxMCxyb3IjMjQKKwlhZGQJcjMscjMscjQKKwltb3YJcjE0LHIxNCxyb3IjMjQKKwllb3IJcjEwLHIxMCxyMixyb3IjMjQKKwllb3IJcjE0LHIxNCxyMyxyb3IjMjQKKwlhZGQJcjgscjgscjEwCisJbW92CXI3LHI3LHJvciMyNQorCWFkZAlyOSxyOSxyMTQKKwltb3YJcjQscjQscm9yIzI1CisJZW9yCXI3LHI3LHI4LHJvciMyNQorCWVvcglyNCxyNCxyOSxyb3IjMjUKKwlibmUJTG9vcAorCisJbGRyCXIxMSxbc3AsIzQqKDMyKzIpXQlAIGxvYWQgbGVuCisKKwlzdHIJcjgsIFtzcCwjNCooMTYrOCldCUAgbW9kdWxvLXNjaGVkdWxlZCBzdG9yZQorCXN0cglyOSwgW3NwLCM0KigxNis5KV0KKwlzdHIJcjEyLFtzcCwjNCooMTYrMTIpXQorCXN0cglyMTAsIFtzcCwjNCooMTYrMTMpXQorCXN0cglyMTQsW3NwLCM0KigxNisxNCldCisKKwlAIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBmaXJzdCBoYWxmIG9mIDUxMi1iaXQgcmVzdWx0IGluCisJQCByeCBhbmQgc2Vjb25kIGhhbGYgYXQgc3ArNCooMTYrOCkKKworCWNtcAlyMTEsIzY0CQlAIGRvbmUgeWV0PworI2lmZGVmCV9fdGh1bWIyX18KKwlpdGV0ZQlsbworI2VuZGlmCisJYWRkbG8JcjEyLHNwLCM0KigwKQkJQCBzaG9ydGN1dCBvciAuLi4KKwlsZHJocwlyMTIsW3NwLCM0KigzMisxKV0JQCAuLi4gbG9hZCBpbnAKKwlhZGRsbwlyMTQsc3AsIzQqKDApCQlAIHNob3J0Y3V0IG9yIC4uLgorCWxkcmhzCXIxNCxbc3AsIzQqKDMyKzApXQlAIC4uLiBsb2FkIG91dAorCisJbGRyCXI4LFtzcCwjNCooMCldCUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwlsZHIJcjksW3NwLCM0KigxKV0KKworI2lmIF9fQVJNX0FSQ0hfXz49NiB8fCAhZGVmaW5lZChfX0FSTUVCX18pCisjIGlmIF9fQVJNX0FSQ0hfXzw3CisJb3JyCXIxMCxyMTIscjE0CisJdHN0CXIxMCwjMwkJQCBhcmUgaW5wdXQgYW5kIG91dHB1dCBhbGlnbmVkPworCWxkcglyMTAsW3NwLCM0KigyKV0KKwlibmUJTHVuYWxpZ25lZAorCWNtcAlyMTEsIzY0CQlAIHJlc3RvcmUgZmxhZ3MKKyMgZWxzZQorCWxkcglyMTAsW3NwLCM0KigyKV0KKyMgZW5kaWYKKwlsZHIJcjExLFtzcCwjNCooMyldCisKKwlhZGQJcjAscjAscjgJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyMSxyMSxyOQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlsZHJocwlyOSxbcjEyLCMtMTJdCisKKwlhZGQJcjIscjIscjEwCisJYWRkCXIzLHIzLHIxMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjEwLFtyMTIsIy04XQorCWxkcmhzCXIxMSxbcjEyLCMtNF0KKyMgaWYgX19BUk1fQVJDSF9fPj02ICYmIGRlZmluZWQoX19BUk1FQl9fKQorCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworIyBlbmRpZgorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjAscjAscjgJQCB4b3Igd2l0aCBpbnB1dAorCWVvcmhzCXIxLHIxLHI5CisJYWRkCXI4LHNwLCM0Kig0KQorCXN0cglyMCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwllb3JocwlyMixyMixyMTAKKwllb3JocwlyMyxyMyxyMTEKKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCXN0cglyMSxbcjE0LCMtMTJdCisJc3RyCXIyLFtyMTQsIy04XQorCXN0cglyMyxbcjE0LCMtNF0KKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI1LHI1LHI5CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJocwlyOCxbcjEyXSwjMTYJCUAgbG9hZCBpbnB1dAorCWxkcmhzCXI5LFtyMTIsIy0xMl0KKwlhZGQJcjYscjYscjEwCisJYWRkCXI3LHI3LHIxMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjEwLFtyMTIsIy04XQorCWxkcmhzCXIxMSxbcjEyLCMtNF0KKyMgaWYgX19BUk1fQVJDSF9fPj02ICYmIGRlZmluZWQoX19BUk1FQl9fKQorCXJldglyNCxyNAorCXJldglyNSxyNQorCXJldglyNixyNgorCXJldglyNyxyNworIyBlbmRpZgorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjQscjQscjgKKwllb3JocwlyNSxyNSxyOQorCWFkZAlyOCxzcCwjNCooOCkKKwlzdHIJcjQsW3IxNF0sIzE2CQlAIHN0b3JlIG91dHB1dAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjYscjYscjEwCisJZW9yaHMJcjcscjcscjExCisJc3RyCXI1LFtyMTQsIy0xMl0KKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCXN0cglyNixbcjE0LCMtOF0KKwlhZGQJcjAsc3AsIzQqKDE2KzgpCisJc3RyCXI3LFtyMTQsIy00XQorCisJbGRtaWEJcjAse3IwLHIxLHIyLHIzLHI0LHI1LHI2LHI3fQlAIGxvYWQgc2Vjb25kIGhhbGYKKworCWFkZAlyMCxyMCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXIxLHIxLHI5CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJocwlyOCxbcjEyXSwjMTYJCUAgbG9hZCBpbnB1dAorCWxkcmhzCXI5LFtyMTIsIy0xMl0KKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAloaQorIyBlbmRpZgorCXN0cmhpCXIxMCxbc3AsIzQqKDE2KzEwKV0JQCBjb3B5ICJyeCIgd2hpbGUgYXQgaXQKKwlzdHJoaQlyMTEsW3NwLCM0KigxNisxMSldCUAgY29weSAicngiIHdoaWxlIGF0IGl0CisJYWRkCXIyLHIyLHIxMAorCWFkZAlyMyxyMyxyMTEKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzCXIxMCxbcjEyLCMtOF0KKwlsZHJocwlyMTEsW3IxMiwjLTRdCisjIGlmIF9fQVJNX0FSQ0hfXz49NiAmJiBkZWZpbmVkKF9fQVJNRUJfXykKKwlyZXYJcjAscjAKKwlyZXYJcjEscjEKKwlyZXYJcjIscjIKKwlyZXYJcjMscjMKKyMgZW5kaWYKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWVvcmhzCXIwLHIwLHI4CisJZW9yaHMJcjEscjEscjkKKwlhZGQJcjgsc3AsIzQqKDEyKQorCXN0cglyMCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwllb3JocwlyMixyMixyMTAKKwllb3JocwlyMyxyMyxyMTEKKwlzdHIJcjEsW3IxNCwjLTEyXQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJc3RyCXIyLFtyMTQsIy04XQorCXN0cglyMyxbcjE0LCMtNF0KKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI1LHI1LHI5CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaGkKKyMgZW5kaWYKKwlhZGRoaQlyOCxyOCwjMQkJQCBuZXh0IGNvdW50ZXIgdmFsdWUKKwlzdHJoaQlyOCxbc3AsIzQqKDEyKV0JQCBzYXZlIG5leHQgY291bnRlciB2YWx1ZQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlsZHJocwlyOSxbcjEyLCMtMTJdCisJYWRkCXI2LHI2LHIxMAorCWFkZAlyNyxyNyxyMTEKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzCXIxMCxbcjEyLCMtOF0KKwlsZHJocwlyMTEsW3IxMiwjLTRdCisjIGlmIF9fQVJNX0FSQ0hfXz49NiAmJiBkZWZpbmVkKF9fQVJNRUJfXykKKwlyZXYJcjQscjQKKwlyZXYJcjUscjUKKwlyZXYJcjYscjYKKwlyZXYJcjcscjcKKyMgZW5kaWYKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWVvcmhzCXI0LHI0LHI4CisJZW9yaHMJcjUscjUscjkKKyMgaWZkZWYJX190aHVtYjJfXworCWl0CW5lCisjIGVuZGlmCisJbGRybmUJcjgsW3NwLCM0KigzMisyKV0JQCByZS1sb2FkIGxlbgorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjYscjYscjEwCisJZW9yaHMJcjcscjcscjExCisJc3RyCXI0LFtyMTRdLCMxNgkJQCBzdG9yZSBvdXRwdXQKKwlzdHIJcjUsW3IxNCwjLTEyXQorIyBpZmRlZglfX3RodW1iMl9fCisJaXQJaHMKKyMgZW5kaWYKKwlzdWJocwlyMTEscjgsIzY0CQlAIGxlbi09NjQKKwlzdHIJcjYsW3IxNCwjLThdCisJc3RyCXI3LFtyMTQsIy00XQorCWJoaQlMb29wX291dGVyCisKKwliZXEJTGRvbmUKKyMgaWYgX19BUk1fQVJDSF9fPDcKKwliCUx0YWlsCisKKy5hbGlnbgk0CitMdW5hbGlnbmVkOkAgdW5hbGlnbmVkIGVuZGlhbi1uZXV0cmFsIHBhdGgKKwljbXAJcjExLCM2NAkJQCByZXN0b3JlIGZsYWdzCisjIGVuZGlmCisjZW5kaWYKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcglyMTEsW3NwLCM0KigzKV0KKwlhZGQJcjAscjAscjgJCUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlhZGQJcjEscjEscjkKKwlhZGQJcjIscjIscjEwCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdGV0ZQlsbworIyBlbmRpZgorCWVvcmxvCXI4LHI4LHI4CQlAIHplcm8gb3IgLi4uCisJbGRyaHNiCXI4LFtyMTJdLCMxNgkJCUAgLi4uIGxvYWQgaW5wdXQKKwllb3JsbwlyOSxyOSxyOQorCWxkcmhzYglyOSxbcjEyLCMtMTJdCisKKwlhZGQJcjMscjMscjExCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdGV0ZQlsbworIyBlbmRpZgorCWVvcmxvCXIxMCxyMTAscjEwCisJbGRyaHNiCXIxMCxbcjEyLCMtOF0KKwllb3JsbwlyMTEscjExLHIxMQorCWxkcmhzYglyMTEsW3IxMiwjLTRdCisKKwllb3IJcjAscjgscjAJCUAgeG9yIHdpdGggaW5wdXQgKG9yIHplcm8pCisJZW9yCXIxLHI5LHIxCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTE1XQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTExXQorCWVvcglyMixyMTAscjIKKwlzdHJiCXIwLFtyMTRdLCMxNgkJQCBzdG9yZSBvdXRwdXQKKwllb3IJcjMscjExLHIzCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjEwLFtyMTIsIy03XQorCWxkcmhzYglyMTEsW3IxMiwjLTNdCisJc3RyYglyMSxbcjE0LCMtMTJdCisJZW9yCXIwLHI4LHIwLGxzciM4CisJc3RyYglyMixbcjE0LCMtOF0KKwllb3IJcjEscjkscjEsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyOCxbcjEyLCMtMTRdCQlAIGxvYWQgbW9yZSBpbnB1dAorCWxkcmhzYglyOSxbcjEyLCMtMTBdCisJc3RyYglyMyxbcjE0LCMtNF0KKwllb3IJcjIscjEwLHIyLGxzciM4CisJc3RyYglyMCxbcjE0LCMtMTVdCisJZW9yCXIzLHIxMSxyMyxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtNl0KKwlsZHJoc2IJcjExLFtyMTIsIy0yXQorCXN0cmIJcjEsW3IxNCwjLTExXQorCWVvcglyMCxyOCxyMCxsc3IjOAorCXN0cmIJcjIsW3IxNCwjLTddCisJZW9yCXIxLHI5LHIxLGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTEzXQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTldCisJc3RyYglyMyxbcjE0LCMtM10KKwllb3IJcjIscjEwLHIyLGxzciM4CisJc3RyYglyMCxbcjE0LCMtMTRdCisJZW9yCXIzLHIxMSxyMyxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtNV0KKwlsZHJoc2IJcjExLFtyMTIsIy0xXQorCXN0cmIJcjEsW3IxNCwjLTEwXQorCXN0cmIJcjIsW3IxNCwjLTZdCisJZW9yCXIwLHI4LHIwLGxzciM4CisJc3RyYglyMyxbcjE0LCMtMl0KKwllb3IJcjEscjkscjEsbHNyIzgKKwlzdHJiCXIwLFtyMTQsIy0xM10KKwllb3IJcjIscjEwLHIyLGxzciM4CisJc3RyYglyMSxbcjE0LCMtOV0KKwllb3IJcjMscjExLHIzLGxzciM4CisJc3RyYglyMixbcjE0LCMtNV0KKwlzdHJiCXIzLFtyMTQsIy0xXQorCWFkZAlyOCxzcCwjNCooNCswKQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQkJQCBsb2FkIGtleSBtYXRlcmlhbAorCWFkZAlyMCxzcCwjNCooMTYrOCkKKwlhZGQJcjQscjQscjgJCUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlhZGQJcjUscjUscjkKKwlhZGQJcjYscjYscjEwCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdGV0ZQlsbworIyBlbmRpZgorCWVvcmxvCXI4LHI4LHI4CQlAIHplcm8gb3IgLi4uCisJbGRyaHNiCXI4LFtyMTJdLCMxNgkJCUAgLi4uIGxvYWQgaW5wdXQKKwllb3JsbwlyOSxyOSxyOQorCWxkcmhzYglyOSxbcjEyLCMtMTJdCisKKwlhZGQJcjcscjcscjExCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdGV0ZQlsbworIyBlbmRpZgorCWVvcmxvCXIxMCxyMTAscjEwCisJbGRyaHNiCXIxMCxbcjEyLCMtOF0KKwllb3JsbwlyMTEscjExLHIxMQorCWxkcmhzYglyMTEsW3IxMiwjLTRdCisKKwllb3IJcjQscjgscjQJCUAgeG9yIHdpdGggaW5wdXQgKG9yIHplcm8pCisJZW9yCXI1LHI5LHI1CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTE1XQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTExXQorCWVvcglyNixyMTAscjYKKwlzdHJiCXI0LFtyMTRdLCMxNgkJQCBzdG9yZSBvdXRwdXQKKwllb3IJcjcscjExLHI3CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjEwLFtyMTIsIy03XQorCWxkcmhzYglyMTEsW3IxMiwjLTNdCisJc3RyYglyNSxbcjE0LCMtMTJdCisJZW9yCXI0LHI4LHI0LGxzciM4CisJc3RyYglyNixbcjE0LCMtOF0KKwllb3IJcjUscjkscjUsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyOCxbcjEyLCMtMTRdCQlAIGxvYWQgbW9yZSBpbnB1dAorCWxkcmhzYglyOSxbcjEyLCMtMTBdCisJc3RyYglyNyxbcjE0LCMtNF0KKwllb3IJcjYscjEwLHI2LGxzciM4CisJc3RyYglyNCxbcjE0LCMtMTVdCisJZW9yCXI3LHIxMSxyNyxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtNl0KKwlsZHJoc2IJcjExLFtyMTIsIy0yXQorCXN0cmIJcjUsW3IxNCwjLTExXQorCWVvcglyNCxyOCxyNCxsc3IjOAorCXN0cmIJcjYsW3IxNCwjLTddCisJZW9yCXI1LHI5LHI1LGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTEzXQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTldCisJc3RyYglyNyxbcjE0LCMtM10KKwllb3IJcjYscjEwLHI2LGxzciM4CisJc3RyYglyNCxbcjE0LCMtMTRdCisJZW9yCXI3LHIxMSxyNyxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtNV0KKwlsZHJoc2IJcjExLFtyMTIsIy0xXQorCXN0cmIJcjUsW3IxNCwjLTEwXQorCXN0cmIJcjYsW3IxNCwjLTZdCisJZW9yCXI0LHI4LHI0LGxzciM4CisJc3RyYglyNyxbcjE0LCMtMl0KKwllb3IJcjUscjkscjUsbHNyIzgKKwlzdHJiCXI0LFtyMTQsIy0xM10KKwllb3IJcjYscjEwLHI2LGxzciM4CisJc3RyYglyNSxbcjE0LCMtOV0KKwllb3IJcjcscjExLHI3LGxzciM4CisJc3RyYglyNixbcjE0LCMtNV0KKwlzdHJiCXI3LFtyMTQsIy0xXQorCWFkZAlyOCxzcCwjNCooNCs0KQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQkJQCBsb2FkIGtleSBtYXRlcmlhbAorCWxkbWlhCXIwLHtyMCxyMSxyMixyMyxyNCxyNSxyNixyN30JCUAgbG9hZCBzZWNvbmQgaGFsZgorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhpCisjIGVuZGlmCisJc3RyaGkJcjEwLFtzcCwjNCooMTYrMTApXQkJQCBjb3B5ICJyeCIKKwlzdHJoaQlyMTEsW3NwLCM0KigxNisxMSldCQlAIGNvcHkgInJ4IgorCWFkZAlyMCxyMCxyOAkJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyMSxyMSxyOQorCWFkZAlyMixyMixyMTAKKyMgaWZkZWYJX190aHVtYjJfXworCWl0ZXRlCWxvCisjIGVuZGlmCisJZW9ybG8JcjgscjgscjgJCUAgemVybyBvciAuLi4KKwlsZHJoc2IJcjgsW3IxMl0sIzE2CQkJQCAuLi4gbG9hZCBpbnB1dAorCWVvcmxvCXI5LHI5LHI5CisJbGRyaHNiCXI5LFtyMTIsIy0xMl0KKworCWFkZAlyMyxyMyxyMTEKKyMgaWZkZWYJX190aHVtYjJfXworCWl0ZXRlCWxvCisjIGVuZGlmCisJZW9ybG8JcjEwLHIxMCxyMTAKKwlsZHJoc2IJcjEwLFtyMTIsIy04XQorCWVvcmxvCXIxMSxyMTEscjExCisJbGRyaHNiCXIxMSxbcjEyLCMtNF0KKworCWVvcglyMCxyOCxyMAkJQCB4b3Igd2l0aCBpbnB1dCAob3IgemVybykKKwllb3IJcjEscjkscjEKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyOCxbcjEyLCMtMTVdCQlAIGxvYWQgbW9yZSBpbnB1dAorCWxkcmhzYglyOSxbcjEyLCMtMTFdCisJZW9yCXIyLHIxMCxyMgorCXN0cmIJcjAsW3IxNF0sIzE2CQlAIHN0b3JlIG91dHB1dAorCWVvcglyMyxyMTEscjMKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTddCisJbGRyaHNiCXIxMSxbcjEyLCMtM10KKwlzdHJiCXIxLFtyMTQsIy0xMl0KKwllb3IJcjAscjgscjAsbHNyIzgKKwlzdHJiCXIyLFtyMTQsIy04XQorCWVvcglyMSxyOSxyMSxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xNF0JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy0xMF0KKwlzdHJiCXIzLFtyMTQsIy00XQorCWVvcglyMixyMTAscjIsbHNyIzgKKwlzdHJiCXIwLFtyMTQsIy0xNV0KKwllb3IJcjMscjExLHIzLGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjEwLFtyMTIsIy02XQorCWxkcmhzYglyMTEsW3IxMiwjLTJdCisJc3RyYglyMSxbcjE0LCMtMTFdCisJZW9yCXIwLHI4LHIwLGxzciM4CisJc3RyYglyMixbcjE0LCMtN10KKwllb3IJcjEscjkscjEsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyOCxbcjEyLCMtMTNdCQlAIGxvYWQgbW9yZSBpbnB1dAorCWxkcmhzYglyOSxbcjEyLCMtOV0KKwlzdHJiCXIzLFtyMTQsIy0zXQorCWVvcglyMixyMTAscjIsbHNyIzgKKwlzdHJiCXIwLFtyMTQsIy0xNF0KKwllb3IJcjMscjExLHIzLGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjEwLFtyMTIsIy01XQorCWxkcmhzYglyMTEsW3IxMiwjLTFdCisJc3RyYglyMSxbcjE0LCMtMTBdCisJc3RyYglyMixbcjE0LCMtNl0KKwllb3IJcjAscjgscjAsbHNyIzgKKwlzdHJiCXIzLFtyMTQsIy0yXQorCWVvcglyMSxyOSxyMSxsc3IjOAorCXN0cmIJcjAsW3IxNCwjLTEzXQorCWVvcglyMixyMTAscjIsbHNyIzgKKwlzdHJiCXIxLFtyMTQsIy05XQorCWVvcglyMyxyMTEscjMsbHNyIzgKKwlzdHJiCXIyLFtyMTQsIy01XQorCXN0cmIJcjMsW3IxNCwjLTFdCisJYWRkCXI4LHNwLCM0Kig0KzgpCisJbGRtaWEJcjgse3I4LHI5LHIxMCxyMTF9CQlAIGxvYWQga2V5IG1hdGVyaWFsCisJYWRkCXI0LHI0LHI4CQlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaGkKKyMgZW5kaWYKKwlhZGRoaQlyOCxyOCwjMQkJCUAgbmV4dCBjb3VudGVyIHZhbHVlCisJc3RyaGkJcjgsW3NwLCM0KigxMildCQlAIHNhdmUgbmV4dCBjb3VudGVyIHZhbHVlCisJYWRkCXI1LHI1LHI5CisJYWRkCXI2LHI2LHIxMAorIyBpZmRlZglfX3RodW1iMl9fCisJaXRldGUJbG8KKyMgZW5kaWYKKwllb3JsbwlyOCxyOCxyOAkJQCB6ZXJvIG9yIC4uLgorCWxkcmhzYglyOCxbcjEyXSwjMTYJCQlAIC4uLiBsb2FkIGlucHV0CisJZW9ybG8JcjkscjkscjkKKwlsZHJoc2IJcjksW3IxMiwjLTEyXQorCisJYWRkCXI3LHI3LHIxMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXRldGUJbG8KKyMgZW5kaWYKKwllb3JsbwlyMTAscjEwLHIxMAorCWxkcmhzYglyMTAsW3IxMiwjLThdCisJZW9ybG8JcjExLHIxMSxyMTEKKwlsZHJoc2IJcjExLFtyMTIsIy00XQorCisJZW9yCXI0LHI4LHI0CQlAIHhvciB3aXRoIGlucHV0IChvciB6ZXJvKQorCWVvcglyNSxyOSxyNQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xNV0JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy0xMV0KKwllb3IJcjYscjEwLHI2CisJc3RyYglyNCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisJZW9yCXI3LHIxMSxyNworIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtN10KKwlsZHJoc2IJcjExLFtyMTIsIy0zXQorCXN0cmIJcjUsW3IxNCwjLTEyXQorCWVvcglyNCxyOCxyNCxsc3IjOAorCXN0cmIJcjYsW3IxNCwjLThdCisJZW9yCXI1LHI5LHI1LGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTE0XQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTEwXQorCXN0cmIJcjcsW3IxNCwjLTRdCisJZW9yCXI2LHIxMCxyNixsc3IjOAorCXN0cmIJcjQsW3IxNCwjLTE1XQorCWVvcglyNyxyMTEscjcsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTZdCisJbGRyaHNiCXIxMSxbcjEyLCMtMl0KKwlzdHJiCXI1LFtyMTQsIy0xMV0KKwllb3IJcjQscjgscjQsbHNyIzgKKwlzdHJiCXI2LFtyMTQsIy03XQorCWVvcglyNSxyOSxyNSxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xM10JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy05XQorCXN0cmIJcjcsW3IxNCwjLTNdCisJZW9yCXI2LHIxMCxyNixsc3IjOAorCXN0cmIJcjQsW3IxNCwjLTE0XQorCWVvcglyNyxyMTEscjcsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTVdCisJbGRyaHNiCXIxMSxbcjEyLCMtMV0KKwlzdHJiCXI1LFtyMTQsIy0xMF0KKwlzdHJiCXI2LFtyMTQsIy02XQorCWVvcglyNCxyOCxyNCxsc3IjOAorCXN0cmIJcjcsW3IxNCwjLTJdCisJZW9yCXI1LHI5LHI1LGxzciM4CisJc3RyYglyNCxbcjE0LCMtMTNdCisJZW9yCXI2LHIxMCxyNixsc3IjOAorCXN0cmIJcjUsW3IxNCwjLTldCisJZW9yCXI3LHIxMSxyNyxsc3IjOAorCXN0cmIJcjYsW3IxNCwjLTVdCisJc3RyYglyNyxbcjE0LCMtMV0KKyMgaWZkZWYJX190aHVtYjJfXworCWl0CW5lCisjIGVuZGlmCisJbGRybmUJcjgsW3NwLCM0KigzMisyKV0JCUAgcmUtbG9hZCBsZW4KKyMgaWZkZWYJX190aHVtYjJfXworCWl0CWhzCisjIGVuZGlmCisJc3ViaHMJcjExLHI4LCM2NAkJCUAgbGVuLT02NAorCWJoaQlMb29wX291dGVyCisKKwliZXEJTGRvbmUKKyNlbmRpZgorCitMdGFpbDoKKwlsZHIJcjEyLFtzcCwjNCooMzIrMSldCUAgbG9hZCBpbnAKKwlhZGQJcjksc3AsIzQqKDApCisJbGRyCXIxNCxbc3AsIzQqKDMyKzApXQlAIGxvYWQgb3V0CisKK0xvb3BfdGFpbDoKKwlsZHJiCXIxMCxbcjldLCMxCUAgcmVhZCBidWZmZXIgb24gc3RhY2sKKwlsZHJiCXIxMSxbcjEyXSwjMQkJQCByZWFkIGlucHV0CisJc3VicwlyOCxyOCwjMQorCWVvcglyMTEscjExLHIxMAorCXN0cmIJcjExLFtyMTRdLCMxCQlAIHN0b3JlIG91dHB1dAorCWJuZQlMb29wX3RhaWwKKworTGRvbmU6CisJYWRkCXNwLHNwLCM0KigzMiszKQorTG5vX2RhdGE6CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHBjfQorCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworCisKKworI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCUNoYUNoYTIwX25lb24KKyNlbmRpZgorLmFsaWduCTUKK0NoYUNoYTIwX25lb246CisJbGRyCXIxMixbc3AsIzBdCQlAIHB1bGwgcG9pbnRlciB0byBjb3VudGVyIGFuZCBub25jZQorCXN0bWRiCXNwISx7cjAscjEscjIscjQtcjExLGxyfQorTENoYUNoYTIwX25lb246CisJYWRyCXIxNCxMc2lnbWEKKwl2c3RtZGIJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0JCUAgQUJJIHNwZWMgc2F5cyBzbworCXN0bWRiCXNwISx7cjAscjEscjIscjN9CisKKwl2bGQxLjMyCXtxMSxxMn0sW3IzXQkJQCBsb2FkIGtleQorCWxkbWlhCXIzLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQkJQCBsb2FkIGtleQorCisJc3ViCXNwLHNwLCM0KigxNisxNikKKwl2bGQxLjMyCXtxM30sW3IxMl0JCUAgbG9hZCBjb3VudGVyIGFuZCBub25jZQorCWFkZAlyMTIsc3AsIzQqOAorCWxkbWlhCXIxNCx7cjAscjEscjIscjN9CQlAIGxvYWQgc2lnbWEKKwl2bGQxLjMyCXtxMH0sW3IxNF0hCQlAIGxvYWQgc2lnbWEKKwl2bGQxLjMyCXtxMTJ9LFtyMTRdCQlAIG9uZQorCXZzdDEuMzIJe3EyLHEzfSxbcjEyXQkJQCBjb3B5IDEvMmtleXxjb3VudGVyfG5vbmNlCisJdnN0MS4zMgl7cTAscTF9LFtzcF0JCUAgY29weSBzaWdtYXwxLzJrZXkKKworCXN0cglyMTAsW3NwLCM0KigxNisxMCldCUAgb2ZmLWxvYWQgInJ4IgorCXN0cglyMTEsW3NwLCM0KigxNisxMSldCUAgb2ZmLWxvYWQgInJ4IgorCXZzaGwuaTMyCWQyNixkMjQsIzEJQCB0d28KKwl2c3RyCWQyNCxbc3AsIzQqKDE2KzApXQorCXZzaGwuaTMyCWQyOCxkMjQsIzIJQCBmb3VyCisJdnN0cglkMjYsW3NwLCM0KigxNisyKV0KKwl2bW92CXE0LHEwCisJdnN0cglkMjgsW3NwLCM0KigxNis0KV0KKwl2bW92CXE4LHEwCisJdm1vdglxNSxxMQorCXZtb3YJcTkscTEKKwliCUxvb3BfbmVvbl9lbnRlcgorCisuYWxpZ24JNAorTG9vcF9uZW9uX291dGVyOgorCWxkbWlhCXNwLHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOX0JCUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwljbXAJcjExLCM2NCoyCQlAIGlmIGxlbjw9NjQqMgorCWJscwlMYnJlYWtfbmVvbgkJQCBzd2l0Y2ggdG8gaW50ZWdlci1vbmx5CisJdm1vdglxNCxxMAorCXN0cglyMTEsW3NwLCM0KigzMisyKV0JQCBzYXZlIGxlbgorCXZtb3YJcTgscTAKKwlzdHIJcjEyLCAgW3NwLCM0KigzMisxKV0JQCBzYXZlIGlucAorCXZtb3YJcTUscTEKKwlzdHIJcjE0LCAgW3NwLCM0KigzMiswKV0JQCBzYXZlIG91dAorCXZtb3YJcTkscTEKK0xvb3BfbmVvbl9lbnRlcjoKKwlsZHIJcjExLCBbc3AsIzQqKDE1KV0KKwl2YWRkLmkzMglxNyxxMyxxMTIJCUAgY291bnRlcisxCisJbGRyCXIxMixbc3AsIzQqKDEyKV0JQCBtb2R1bG8tc2NoZWR1bGVkIGxvYWQKKwl2bW92CXE2LHEyCisJbGRyCXIxMCwgW3NwLCM0KigxMyldCisJdm1vdglxMTAscTIKKwlsZHIJcjE0LFtzcCwjNCooMTQpXQorCXZhZGQuaTMyCXExMSxxNyxxMTIJCUAgY291bnRlcisyCisJc3RyCXIxMSwgW3NwLCM0KigxNisxNSldCisJbW92CXIxMSwjMTAKKwlhZGQJcjEyLHIxMiwjMwlAIGNvdW50ZXIrMworCWIJTG9vcF9uZW9uCisKKy5hbGlnbgk0CitMb29wX25lb246CisJc3VicwlyMTEscjExLCMxCisJdmFkZC5pMzIJcTAscTAscTEKKwlhZGQJcjAscjAscjQKKwl2YWRkLmkzMglxNCxxNCxxNQorCW1vdglyMTIscjEyLHJvciMxNgorCXZhZGQuaTMyCXE4LHE4LHE5CisJYWRkCXIxLHIxLHI1CisJdmVvcglxMyxxMyxxMAorCW1vdglyMTAscjEwLHJvciMxNgorCXZlb3IJcTcscTcscTQKKwllb3IJcjEyLHIxMixyMCxyb3IjMTYKKwl2ZW9yCXExMSxxMTEscTgKKwllb3IJcjEwLHIxMCxyMSxyb3IjMTYKKwl2cmV2MzIuMTYJcTMscTMKKwlhZGQJcjgscjgscjEyCisJdnJldjMyLjE2CXE3LHE3CisJbW92CXI0LHI0LHJvciMyMAorCXZyZXYzMi4xNglxMTEscTExCisJYWRkCXI5LHI5LHIxMAorCXZhZGQuaTMyCXEyLHEyLHEzCisJbW92CXI1LHI1LHJvciMyMAorCXZhZGQuaTMyCXE2LHE2LHE3CisJZW9yCXI0LHI0LHI4LHJvciMyMAorCXZhZGQuaTMyCXExMCxxMTAscTExCisJZW9yCXI1LHI1LHI5LHJvciMyMAorCXZlb3IJcTEyLHExLHEyCisJYWRkCXIwLHIwLHI0CisJdmVvcglxMTMscTUscTYKKwltb3YJcjEyLHIxMixyb3IjMjQKKwl2ZW9yCXExNCxxOSxxMTAKKwlhZGQJcjEscjEscjUKKwl2c2hyLnUzMglxMSxxMTIsIzIwCisJbW92CXIxMCxyMTAscm9yIzI0CisJdnNoci51MzIJcTUscTEzLCMyMAorCWVvcglyMTIscjEyLHIwLHJvciMyNAorCXZzaHIudTMyCXE5LHExNCwjMjAKKwllb3IJcjEwLHIxMCxyMSxyb3IjMjQKKwl2c2xpLjMyCXExLHExMiwjMTIKKwlhZGQJcjgscjgscjEyCisJdnNsaS4zMglxNSxxMTMsIzEyCisJbW92CXI0LHI0LHJvciMyNQorCXZzbGkuMzIJcTkscTE0LCMxMgorCWFkZAlyOSxyOSxyMTAKKwl2YWRkLmkzMglxMCxxMCxxMQorCW1vdglyNSxyNSxyb3IjMjUKKwl2YWRkLmkzMglxNCxxNCxxNQorCXN0cglyMTAsW3NwLCM0KigxNisxMyldCisJdmFkZC5pMzIJcTgscTgscTkKKwlsZHIJcjEwLFtzcCwjNCooMTYrMTUpXQorCXZlb3IJcTEyLHEzLHEwCisJZW9yCXI0LHI0LHI4LHJvciMyNQorCXZlb3IJcTEzLHE3LHE0CisJZW9yCXI1LHI1LHI5LHJvciMyNQorCXZlb3IJcTE0LHExMSxxOAorCXN0cglyOCxbc3AsIzQqKDE2KzgpXQorCXZzaHIudTMyCXEzLHExMiwjMjQKKwlsZHIJcjgsW3NwLCM0KigxNisxMCldCisJdnNoci51MzIJcTcscTEzLCMyNAorCWFkZAlyMixyMixyNgorCXZzaHIudTMyCXExMSxxMTQsIzI0CisJbW92CXIxNCxyMTQscm9yIzE2CisJdnNsaS4zMglxMyxxMTIsIzgKKwlzdHIJcjksW3NwLCM0KigxNis5KV0KKwl2c2xpLjMyCXE3LHExMywjOAorCWxkcglyOSxbc3AsIzQqKDE2KzExKV0KKwl2c2xpLjMyCXExMSxxMTQsIzgKKwlhZGQJcjMscjMscjcKKwl2YWRkLmkzMglxMixxMixxMworCW1vdglyMTAscjEwLHJvciMxNgorCXZhZGQuaTMyCXE2LHE2LHE3CisJZW9yCXIxNCxyMTQscjIscm9yIzE2CisJdmFkZC5pMzIJcTEwLHExMCxxMTEKKwllb3IJcjEwLHIxMCxyMyxyb3IjMTYKKwl2ZW9yCXExMixxMSxxMgorCWFkZAlyOCxyOCxyMTQKKwl2ZW9yCXExMyxxNSxxNgorCW1vdglyNixyNixyb3IjMjAKKwl2ZW9yCXExNCxxOSxxMTAKKwlhZGQJcjkscjkscjEwCisJdnNoci51MzIJcTEscTEyLCMyNQorCW1vdglyNyxyNyxyb3IjMjAKKwl2c2hyLnUzMglxNSxxMTMsIzI1CisJZW9yCXI2LHI2LHI4LHJvciMyMAorCXZzaHIudTMyCXE5LHExNCwjMjUKKwllb3IJcjcscjcscjkscm9yIzIwCisJdnNsaS4zMglxMSxxMTIsIzcKKwlhZGQJcjIscjIscjYKKwl2c2xpLjMyCXE1LHExMywjNworCW1vdglyMTQscjE0LHJvciMyNAorCXZzbGkuMzIJcTkscTE0LCM3CisJYWRkCXIzLHIzLHI3CisJdmV4dC44CXEyLHEyLHEyLCM4CisJbW92CXIxMCxyMTAscm9yIzI0CisJdmV4dC44CXE2LHE2LHE2LCM4CisJZW9yCXIxNCxyMTQscjIscm9yIzI0CisJdmV4dC44CXExMCxxMTAscTEwLCM4CisJZW9yCXIxMCxyMTAscjMscm9yIzI0CisJdmV4dC44CXExLHExLHExLCM0CisJYWRkCXI4LHI4LHIxNAorCXZleHQuOAlxNSxxNSxxNSwjNAorCW1vdglyNixyNixyb3IjMjUKKwl2ZXh0LjgJcTkscTkscTksIzQKKwlhZGQJcjkscjkscjEwCisJdmV4dC44CXEzLHEzLHEzLCMxMgorCW1vdglyNyxyNyxyb3IjMjUKKwl2ZXh0LjgJcTcscTcscTcsIzEyCisJZW9yCXI2LHI2LHI4LHJvciMyNQorCXZleHQuOAlxMTEscTExLHExMSwjMTIKKwllb3IJcjcscjcscjkscm9yIzI1CisJdmFkZC5pMzIJcTAscTAscTEKKwlhZGQJcjAscjAscjUKKwl2YWRkLmkzMglxNCxxNCxxNQorCW1vdglyMTAscjEwLHJvciMxNgorCXZhZGQuaTMyCXE4LHE4LHE5CisJYWRkCXIxLHIxLHI2CisJdmVvcglxMyxxMyxxMAorCW1vdglyMTIscjEyLHJvciMxNgorCXZlb3IJcTcscTcscTQKKwllb3IJcjEwLHIxMCxyMCxyb3IjMTYKKwl2ZW9yCXExMSxxMTEscTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTYKKwl2cmV2MzIuMTYJcTMscTMKKwlhZGQJcjgscjgscjEwCisJdnJldjMyLjE2CXE3LHE3CisJbW92CXI1LHI1LHJvciMyMAorCXZyZXYzMi4xNglxMTEscTExCisJYWRkCXI5LHI5LHIxMgorCXZhZGQuaTMyCXEyLHEyLHEzCisJbW92CXI2LHI2LHJvciMyMAorCXZhZGQuaTMyCXE2LHE2LHE3CisJZW9yCXI1LHI1LHI4LHJvciMyMAorCXZhZGQuaTMyCXExMCxxMTAscTExCisJZW9yCXI2LHI2LHI5LHJvciMyMAorCXZlb3IJcTEyLHExLHEyCisJYWRkCXIwLHIwLHI1CisJdmVvcglxMTMscTUscTYKKwltb3YJcjEwLHIxMCxyb3IjMjQKKwl2ZW9yCXExNCxxOSxxMTAKKwlhZGQJcjEscjEscjYKKwl2c2hyLnUzMglxMSxxMTIsIzIwCisJbW92CXIxMixyMTIscm9yIzI0CisJdnNoci51MzIJcTUscTEzLCMyMAorCWVvcglyMTAscjEwLHIwLHJvciMyNAorCXZzaHIudTMyCXE5LHExNCwjMjAKKwllb3IJcjEyLHIxMixyMSxyb3IjMjQKKwl2c2xpLjMyCXExLHExMiwjMTIKKwlhZGQJcjgscjgscjEwCisJdnNsaS4zMglxNSxxMTMsIzEyCisJbW92CXI1LHI1LHJvciMyNQorCXZzbGkuMzIJcTkscTE0LCMxMgorCXN0cglyMTAsW3NwLCM0KigxNisxNSldCisJdmFkZC5pMzIJcTAscTAscTEKKwlsZHIJcjEwLFtzcCwjNCooMTYrMTMpXQorCXZhZGQuaTMyCXE0LHE0LHE1CisJYWRkCXI5LHI5LHIxMgorCXZhZGQuaTMyCXE4LHE4LHE5CisJbW92CXI2LHI2LHJvciMyNQorCXZlb3IJcTEyLHEzLHEwCisJZW9yCXI1LHI1LHI4LHJvciMyNQorCXZlb3IJcTEzLHE3LHE0CisJZW9yCXI2LHI2LHI5LHJvciMyNQorCXZlb3IJcTE0LHExMSxxOAorCXN0cglyOCxbc3AsIzQqKDE2KzEwKV0KKwl2c2hyLnUzMglxMyxxMTIsIzI0CisJbGRyCXI4LFtzcCwjNCooMTYrOCldCisJdnNoci51MzIJcTcscTEzLCMyNAorCWFkZAlyMixyMixyNworCXZzaHIudTMyCXExMSxxMTQsIzI0CisJbW92CXIxMCxyMTAscm9yIzE2CisJdnNsaS4zMglxMyxxMTIsIzgKKwlzdHIJcjksW3NwLCM0KigxNisxMSldCisJdnNsaS4zMglxNyxxMTMsIzgKKwlsZHIJcjksW3NwLCM0KigxNis5KV0KKwl2c2xpLjMyCXExMSxxMTQsIzgKKwlhZGQJcjMscjMscjQKKwl2YWRkLmkzMglxMixxMixxMworCW1vdglyMTQscjE0LHJvciMxNgorCXZhZGQuaTMyCXE2LHE2LHE3CisJZW9yCXIxMCxyMTAscjIscm9yIzE2CisJdmFkZC5pMzIJcTEwLHExMCxxMTEKKwllb3IJcjE0LHIxNCxyMyxyb3IjMTYKKwl2ZW9yCXExMixxMSxxMgorCWFkZAlyOCxyOCxyMTAKKwl2ZW9yCXExMyxxNSxxNgorCW1vdglyNyxyNyxyb3IjMjAKKwl2ZW9yCXExNCxxOSxxMTAKKwlhZGQJcjkscjkscjE0CisJdnNoci51MzIJcTEscTEyLCMyNQorCW1vdglyNCxyNCxyb3IjMjAKKwl2c2hyLnUzMglxNSxxMTMsIzI1CisJZW9yCXI3LHI3LHI4LHJvciMyMAorCXZzaHIudTMyCXE5LHExNCwjMjUKKwllb3IJcjQscjQscjkscm9yIzIwCisJdnNsaS4zMglxMSxxMTIsIzcKKwlhZGQJcjIscjIscjcKKwl2c2xpLjMyCXE1LHExMywjNworCW1vdglyMTAscjEwLHJvciMyNAorCXZzbGkuMzIJcTkscTE0LCM3CisJYWRkCXIzLHIzLHI0CisJdmV4dC44CXEyLHEyLHEyLCM4CisJbW92CXIxNCxyMTQscm9yIzI0CisJdmV4dC44CXE2LHE2LHE2LCM4CisJZW9yCXIxMCxyMTAscjIscm9yIzI0CisJdmV4dC44CXExMCxxMTAscTEwLCM4CisJZW9yCXIxNCxyMTQscjMscm9yIzI0CisJdmV4dC44CXExLHExLHExLCMxMgorCWFkZAlyOCxyOCxyMTAKKwl2ZXh0LjgJcTUscTUscTUsIzEyCisJbW92CXI3LHI3LHJvciMyNQorCXZleHQuOAlxOSxxOSxxOSwjMTIKKwlhZGQJcjkscjkscjE0CisJdmV4dC44CXEzLHEzLHEzLCM0CisJbW92CXI0LHI0LHJvciMyNQorCXZleHQuOAlxNyxxNyxxNywjNAorCWVvcglyNyxyNyxyOCxyb3IjMjUKKwl2ZXh0LjgJcTExLHExMSxxMTEsIzQKKwllb3IJcjQscjQscjkscm9yIzI1CisJYm5lCUxvb3BfbmVvbgorCisJYWRkCXIxMSxzcCwjMzIKKwl2bGQxLjMyCXtxMTIscTEzfSxbc3BdCQlAIGxvYWQga2V5IG1hdGVyaWFsCisJdmxkMS4zMgl7cTE0LHExNX0sW3IxMV0KKworCWxkcglyMTEsW3NwLCM0KigzMisyKV0JQCBsb2FkIGxlbgorCisJc3RyCXI4LCBbc3AsIzQqKDE2KzgpXQlAIG1vZHVsby1zY2hlZHVsZWQgc3RvcmUKKwlzdHIJcjksIFtzcCwjNCooMTYrOSldCisJc3RyCXIxMixbc3AsIzQqKDE2KzEyKV0KKwlzdHIJcjEwLCBbc3AsIzQqKDE2KzEzKV0KKwlzdHIJcjE0LFtzcCwjNCooMTYrMTQpXQorCisJQCBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZmlyc3QgaGFsZiBvZiA1MTItYml0IHJlc3VsdCBpbgorCUAgcnggYW5kIHNlY29uZCBoYWxmIGF0IHNwKzQqKDE2KzgpCisKKwlsZHIJcjEyLFtzcCwjNCooMzIrMSldCUAgbG9hZCBpbnAKKwlsZHIJcjE0LFtzcCwjNCooMzIrMCldCUAgbG9hZCBvdXQKKworCXZhZGQuaTMyCXEwLHEwLHExMgkJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCXZhZGQuaTMyCXE0LHE0LHExMgorCXZhZGQuaTMyCXE4LHE4LHExMgorCXZsZHIJZDI0LFtzcCwjNCooMTYrMCldCUAgb25lCisKKwl2YWRkLmkzMglxMSxxMSxxMTMKKwl2YWRkLmkzMglxNSxxNSxxMTMKKwl2YWRkLmkzMglxOSxxOSxxMTMKKwl2bGRyCWQyNixbc3AsIzQqKDE2KzIpXQlAIHR3bworCisJdmFkZC5pMzIJcTIscTIscTE0CisJdmFkZC5pMzIJcTYscTYscTE0CisJdmFkZC5pMzIJcTEwLHExMCxxMTQKKwl2YWRkLmkzMglkMTQsZDE0LGQyNAlAIGNvdW50ZXIrMQorCXZhZGQuaTMyCWQyMixkMjIsZDI2CUAgY291bnRlcisyCisKKwl2YWRkLmkzMglxMyxxMyxxMTUKKwl2YWRkLmkzMglxNyxxNyxxMTUKKwl2YWRkLmkzMglxMTEscTExLHExNQorCisJY21wCXIxMSwjNjQqNAorCWJsbwlMdGFpbF9uZW9uCisKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQlAIGxvYWQgaW5wdXQKKwltb3YJcjExLHNwCisJdmxkMS44CXtxMTQscTE1fSxbcjEyXSEKKwl2ZW9yCXEwLHEwLHExMgkJQCB4b3Igd2l0aCBpbnB1dAorCXZlb3IJcTEscTEscTEzCisJdmxkMS44CXtxMTIscTEzfSxbcjEyXSEKKwl2ZW9yCXEyLHEyLHExNAorCXZlb3IJcTMscTMscTE1CisJdmxkMS44CXtxMTQscTE1fSxbcjEyXSEKKworCXZlb3IJcTQscTQscTEyCisJdnN0MS44CXtxMCxxMX0sW3IxNF0hCUAgc3RvcmUgb3V0cHV0CisJdmVvcglxNSxxNSxxMTMKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQorCXZlb3IJcTYscTYscTE0CisJdnN0MS44CXtxMixxM30sW3IxNF0hCisJdmVvcglxNyxxNyxxMTUKKwl2bGQxLjgJe3ExNCxxMTV9LFtyMTJdIQorCisJdmVvcglxOCxxOCxxMTIKKwl2bGQxLjMyCXtxMCxxMX0sW3IxMV0hCUAgbG9hZCBmb3IgbmV4dCBpdGVyYXRpb24KKwl2ZW9yCWQyNSxkMjUsZDI1CisJdmxkcglkMjQsW3NwLCM0KigxNis0KV0JQCBmb3VyCisJdmVvcglxOSxxOSxxMTMKKwl2bGQxLjMyCXtxMixxM30sW3IxMV0KKwl2ZW9yCXExMCxxMTAscTE0CisJdnN0MS44CXtxNCxxNX0sW3IxNF0hCisJdmVvcglxMTEscTExLHExNQorCXZzdDEuOAl7cTYscTd9LFtyMTRdIQorCisJdmFkZC5pMzIJZDYsZDYsZDI0CUAgbmV4dCBjb3VudGVyIHZhbHVlCisJdmxkcglkMjQsW3NwLCM0KigxNiswKV0JQCBvbmUKKworCWxkbWlhCXNwLHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJYWRkCXIwLHIwLHI4CUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlsZHIJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwl2c3QxLjgJe3E4LHE5fSxbcjE0XSEKKwlhZGQJcjEscjEscjkKKwlsZHIJcjksW3IxMiwjLTEyXQorCXZzdDEuOAl7cTEwLHExMX0sW3IxNF0hCisJYWRkCXIyLHIyLHIxMAorCWxkcglyMTAsW3IxMiwjLThdCisJYWRkCXIzLHIzLHIxMQorCWxkcglyMTEsW3IxMiwjLTRdCisjIGlmZGVmCV9fQVJNRUJfXworCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworIyBlbmRpZgorCWVvcglyMCxyMCxyOAlAIHhvciB3aXRoIGlucHV0CisJYWRkCXI4LHNwLCM0Kig0KQorCWVvcglyMSxyMSxyOQorCXN0cglyMCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisJZW9yCXIyLHIyLHIxMAorCXN0cglyMSxbcjE0LCMtMTJdCisJZW9yCXIzLHIzLHIxMQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJc3RyCXIyLFtyMTQsIy04XQorCXN0cglyMyxbcjE0LCMtNF0KKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJbGRyCXI4LFtyMTJdLCMxNgkJQCBsb2FkIGlucHV0CisJYWRkCXI1LHI1LHI5CisJbGRyCXI5LFtyMTIsIy0xMl0KKwlhZGQJcjYscjYscjEwCisJbGRyCXIxMCxbcjEyLCMtOF0KKwlhZGQJcjcscjcscjExCisJbGRyCXIxMSxbcjEyLCMtNF0KKyMgaWZkZWYJX19BUk1FQl9fCisJcmV2CXI0LHI0CisJcmV2CXI1LHI1CisJcmV2CXI2LHI2CisJcmV2CXI3LHI3CisjIGVuZGlmCisJZW9yCXI0LHI0LHI4CisJYWRkCXI4LHNwLCM0Kig4KQorCWVvcglyNSxyNSxyOQorCXN0cglyNCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisJZW9yCXI2LHI2LHIxMAorCXN0cglyNSxbcjE0LCMtMTJdCisJZW9yCXI3LHI3LHIxMQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJc3RyCXI2LFtyMTQsIy04XQorCWFkZAlyMCxzcCwjNCooMTYrOCkKKwlzdHIJcjcsW3IxNCwjLTRdCisKKwlsZG1pYQlyMCx7cjAscjEscjIscjMscjQscjUscjYscjd9CUAgbG9hZCBzZWNvbmQgaGFsZgorCisJYWRkCXIwLHIwLHI4CUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlsZHIJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlhZGQJcjEscjEscjkKKwlsZHIJcjksW3IxMiwjLTEyXQorIyBpZmRlZglfX3RodW1iMl9fCisJaXQJaGkKKyMgZW5kaWYKKwlzdHJoaQlyMTAsW3NwLCM0KigxNisxMCldCUAgY29weSAicngiIHdoaWxlIGF0IGl0CisJYWRkCXIyLHIyLHIxMAorCWxkcglyMTAsW3IxMiwjLThdCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdAloaQorIyBlbmRpZgorCXN0cmhpCXIxMSxbc3AsIzQqKDE2KzExKV0JQCBjb3B5ICJyeCIgd2hpbGUgYXQgaXQKKwlhZGQJcjMscjMscjExCisJbGRyCXIxMSxbcjEyLCMtNF0KKyMgaWZkZWYJX19BUk1FQl9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisjIGVuZGlmCisJZW9yCXIwLHIwLHI4CisJYWRkCXI4LHNwLCM0KigxMikKKwllb3IJcjEscjEscjkKKwlzdHIJcjAsW3IxNF0sIzE2CQlAIHN0b3JlIG91dHB1dAorCWVvcglyMixyMixyMTAKKwlzdHIJcjEsW3IxNCwjLTEyXQorCWVvcglyMyxyMyxyMTEKKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCXN0cglyMixbcjE0LCMtOF0KKwlzdHIJcjMsW3IxNCwjLTRdCisKKwlhZGQJcjQscjQscjgJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyOCxyOCwjNAkJQCBuZXh0IGNvdW50ZXIgdmFsdWUKKwlhZGQJcjUscjUscjkKKwlzdHIJcjgsW3NwLCM0KigxMildCUAgc2F2ZSBuZXh0IGNvdW50ZXIgdmFsdWUKKwlsZHIJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlhZGQJcjYscjYscjEwCisJYWRkCXI0LHI0LCMzCQlAIGNvdW50ZXIrMworCWxkcglyOSxbcjEyLCMtMTJdCisJYWRkCXI3LHI3LHIxMQorCWxkcglyMTAsW3IxMiwjLThdCisJbGRyCXIxMSxbcjEyLCMtNF0KKyMgaWZkZWYJX19BUk1FQl9fCisJcmV2CXI0LHI0CisJcmV2CXI1LHI1CisJcmV2CXI2LHI2CisJcmV2CXI3LHI3CisjIGVuZGlmCisJZW9yCXI0LHI0LHI4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdAloaQorIyBlbmRpZgorCWxkcmhpCXI4LFtzcCwjNCooMzIrMildCUAgcmUtbG9hZCBsZW4KKwllb3IJcjUscjUscjkKKwllb3IJcjYscjYscjEwCisJc3RyCXI0LFtyMTRdLCMxNgkJQCBzdG9yZSBvdXRwdXQKKwllb3IJcjcscjcscjExCisJc3RyCXI1LFtyMTQsIy0xMl0KKwlzdWIJcjExLHI4LCM2NCo0CUAgbGVuLT02NCo0CisJc3RyCXI2LFtyMTQsIy04XQorCXN0cglyNyxbcjE0LCMtNF0KKwliaGkJTG9vcF9uZW9uX291dGVyCisKKwliCUxkb25lX25lb24KKworLmFsaWduCTQKK0xicmVha19uZW9uOgorCUAgaGFybW9uaXplIE5FT04gYW5kIGludGVnZXItb25seSBzdGFjayBmcmFtZXM6IGxvYWQgZGF0YQorCUAgZnJvbSBORU9OIGZyYW1lLCBidXQgc2F2ZSB0byBpbnRlZ2VyLW9ubHkgb25lOyBkaXN0YW5jZQorCUAgYmV0d2VlbiB0aGUgdHdvIGlzIDQqKDMyKzQrMTYtMzIpPTQqKDIwKS4KKworCXN0cglyMTEsIFtzcCwjNCooMjArMzIrMildCUAgc2F2ZSBsZW4KKwlhZGQJcjExLHNwLCM0KigzMis0KQorCXN0cglyMTIsICAgW3NwLCM0KigyMCszMisxKV0JQCBzYXZlIGlucAorCXN0cglyMTQsICAgW3NwLCM0KigyMCszMiswKV0JQCBzYXZlIG91dAorCisJbGRyCXIxMixbc3AsIzQqKDE2KzEwKV0KKwlsZHIJcjE0LFtzcCwjNCooMTYrMTEpXQorCXZsZG1pYQlyMTEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQkJCUAgZnVsZmlsbCBBQkkgcmVxdWlyZW1lbnQKKwlzdHIJcjEyLFtzcCwjNCooMjArMTYrMTApXQlAIGNvcHkgInJ4IgorCXN0cglyMTQsW3NwLCM0KigyMCsxNisxMSldCUAgY29weSAicngiCisKKwlsZHIJcjExLCBbc3AsIzQqKDE1KV0KKwlsZHIJcjEyLFtzcCwjNCooMTIpXQkJQCBtb2R1bG8tc2NoZWR1bGVkIGxvYWQKKwlsZHIJcjEwLCBbc3AsIzQqKDEzKV0KKwlsZHIJcjE0LFtzcCwjNCooMTQpXQorCXN0cglyMTEsIFtzcCwjNCooMjArMTYrMTUpXQorCWFkZAlyMTEsc3AsIzQqKDIwKQorCXZzdDEuMzIJe3EwLHExfSxbcjExXSEJCUAgY29weSBrZXkKKwlhZGQJc3Asc3AsIzQqKDIwKQkJCUAgc3dpdGNoIGZyYW1lCisJdnN0MS4zMgl7cTIscTN9LFtyMTFdCisJbW92CXIxMSwjMTAKKwliCUxvb3AJCQkJQCBnbyBpbnRlZ2VyLW9ubHkKKworLmFsaWduCTQKK0x0YWlsX25lb246CisJY21wCXIxMSwjNjQqMworCWJocwlMMTkyX29yX21vcmVfbmVvbgorCWNtcAlyMTEsIzY0KjIKKwliaHMJTDEyOF9vcl9tb3JlX25lb24KKwljbXAJcjExLCM2NCoxCisJYmhzCUw2NF9vcl9tb3JlX25lb24KKworCWFkZAlyOCxzcCwjNCooOCkKKwl2c3QxLjgJe3EwLHExfSxbc3BdCisJYWRkCXIxMCxzcCwjNCooMCkKKwl2c3QxLjgJe3EyLHEzfSxbcjhdCisJYglMb29wX3RhaWxfbmVvbgorCisuYWxpZ24JNAorTDY0X29yX21vcmVfbmVvbjoKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQorCXZsZDEuOAl7cTE0LHExNX0sW3IxMl0hCisJdmVvcglxMCxxMCxxMTIKKwl2ZW9yCXExLHExLHExMworCXZlb3IJcTIscTIscTE0CisJdmVvcglxMyxxMyxxMTUKKwl2c3QxLjgJe3EwLHExfSxbcjE0XSEKKwl2c3QxLjgJe3EyLHEzfSxbcjE0XSEKKworCWJlcQlMZG9uZV9uZW9uCisKKwlhZGQJcjgsc3AsIzQqKDgpCisJdnN0MS44CXtxNCxxNX0sW3NwXQorCWFkZAlyMTAsc3AsIzQqKDApCisJdnN0MS44CXtxNixxN30sW3I4XQorCXN1YglyMTEscjExLCM2NCoxCUAgbGVuLT02NCoxCisJYglMb29wX3RhaWxfbmVvbgorCisuYWxpZ24JNAorTDEyOF9vcl9tb3JlX25lb246CisJdmxkMS44CXtxMTIscTEzfSxbcjEyXSEKKwl2bGQxLjgJe3ExNCxxMTV9LFtyMTJdIQorCXZlb3IJcTAscTAscTEyCisJdmVvcglxMSxxMSxxMTMKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQorCXZlb3IJcTIscTIscTE0CisJdmVvcglxMyxxMyxxMTUKKwl2bGQxLjgJe3ExNCxxMTV9LFtyMTJdIQorCisJdmVvcglxNCxxNCxxMTIKKwl2ZW9yCXE1LHE1LHExMworCXZzdDEuOAl7cTAscTF9LFtyMTRdIQorCXZlb3IJcTYscTYscTE0CisJdnN0MS44CXtxMixxM30sW3IxNF0hCisJdmVvcglxNyxxNyxxMTUKKwl2c3QxLjgJe3E0LHE1fSxbcjE0XSEKKwl2c3QxLjgJe3E2LHE3fSxbcjE0XSEKKworCWJlcQlMZG9uZV9uZW9uCisKKwlhZGQJcjgsc3AsIzQqKDgpCisJdnN0MS44CXtxOCxxOX0sW3NwXQorCWFkZAlyMTAsc3AsIzQqKDApCisJdnN0MS44CXtxMTAscTExfSxbcjhdCisJc3ViCXIxMSxyMTEsIzY0KjIJQCBsZW4tPTY0KjIKKwliCUxvb3BfdGFpbF9uZW9uCisKKy5hbGlnbgk0CitMMTkyX29yX21vcmVfbmVvbjoKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQorCXZsZDEuOAl7cTE0LHExNX0sW3IxMl0hCisJdmVvcglxMCxxMCxxMTIKKwl2ZW9yCXExLHExLHExMworCXZsZDEuOAl7cTEyLHExM30sW3IxMl0hCisJdmVvcglxMixxMixxMTQKKwl2ZW9yCXEzLHEzLHExNQorCXZsZDEuOAl7cTE0LHExNX0sW3IxMl0hCisKKwl2ZW9yCXE0LHE0LHExMgorCXZlb3IJcTUscTUscTEzCisJdmxkMS44CXtxMTIscTEzfSxbcjEyXSEKKwl2ZW9yCXE2LHE2LHExNAorCXZzdDEuOAl7cTAscTF9LFtyMTRdIQorCXZlb3IJcTcscTcscTE1CisJdmxkMS44CXtxMTQscTE1fSxbcjEyXSEKKworCXZlb3IJcTgscTgscTEyCisJdnN0MS44CXtxMixxM30sW3IxNF0hCisJdmVvcglxOSxxOSxxMTMKKwl2c3QxLjgJe3E0LHE1fSxbcjE0XSEKKwl2ZW9yCXExMCxxMTAscTE0CisJdnN0MS44CXtxNixxN30sW3IxNF0hCisJdmVvcglxMTEscTExLHExNQorCXZzdDEuOAl7cTgscTl9LFtyMTRdIQorCXZzdDEuOAl7cTEwLHExMX0sW3IxNF0hCisKKwliZXEJTGRvbmVfbmVvbgorCisJbGRtaWEJc3Ase3I4LHI5LHIxMCxyMTF9CUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwlhZGQJcjAscjAscjgJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyOCxzcCwjNCooNCkKKwlhZGQJcjEscjEscjkKKwlhZGQJcjIscjIscjEwCisJYWRkCXIzLHIzLHIxMQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisKKwlhZGQJcjQscjQscjgJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyOCxzcCwjNCooOCkKKwlhZGQJcjUscjUscjkKKwlhZGQJcjYscjYscjEwCisJYWRkCXI3LHI3LHIxMQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisjIGlmZGVmCV9fQVJNRUJfXworCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworCXJldglyNCxyNAorCXJldglyNSxyNQorCXJldglyNixyNgorCXJldglyNyxyNworIyBlbmRpZgorCXN0bWlhCXNwLHtyMCxyMSxyMixyMyxyNCxyNSxyNixyN30KKwlhZGQJcjAsc3AsIzQqKDE2KzgpCisKKwlsZG1pYQlyMCx7cjAscjEscjIscjMscjQscjUscjYscjd9CUAgbG9hZCBzZWNvbmQgaGFsZgorCisJYWRkCXIwLHIwLHI4CUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlhZGQJcjgsc3AsIzQqKDEyKQorCWFkZAlyMSxyMSxyOQorCWFkZAlyMixyMixyMTAKKwlhZGQJcjMscjMscjExCisJbGRtaWEJcjgse3I4LHI5LHIxMCxyMTF9CUAgbG9hZCBrZXkgbWF0ZXJpYWwKKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI4LHNwLCM0Kig4KQorCWFkZAlyNSxyNSxyOQorCWFkZAlyNCxyNCwjMwkJQCBjb3VudGVyKzMKKwlhZGQJcjYscjYscjEwCisJYWRkCXI3LHI3LHIxMQorCWxkcglyMTEsW3NwLCM0KigzMisyKV0JQCByZS1sb2FkIGxlbgorIyBpZmRlZglfX0FSTUVCX18KKwlyZXYJcjAscjAKKwlyZXYJcjEscjEKKwlyZXYJcjIscjIKKwlyZXYJcjMscjMKKwlyZXYJcjQscjQKKwlyZXYJcjUscjUKKwlyZXYJcjYscjYKKwlyZXYJcjcscjcKKyMgZW5kaWYKKwlzdG1pYQlyOCx7cjAscjEscjIscjMscjQscjUscjYscjd9CisJYWRkCXIxMCxzcCwjNCooMCkKKwlzdWIJcjExLHIxMSwjNjQqMwlAIGxlbi09NjQqMworCitMb29wX3RhaWxfbmVvbjoKKwlsZHJiCXI4LFtyMTBdLCMxCUAgcmVhZCBidWZmZXIgb24gc3RhY2sKKwlsZHJiCXI5LFtyMTJdLCMxCQlAIHJlYWQgaW5wdXQKKwlzdWJzCXIxMSxyMTEsIzEKKwllb3IJcjgscjgscjkKKwlzdHJiCXI4LFtyMTRdLCMxCQlAIHN0b3JlIG91dHB1dAorCWJuZQlMb29wX3RhaWxfbmVvbgorCitMZG9uZV9uZW9uOgorCWFkZAlzcCxzcCwjNCooMzIrNCkKKwl2bGRtaWEJc3Ase2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQorCWFkZAlzcCxzcCwjNCooMTYrMykKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscGN9CisKKy5jb21tCV9PUEVOU1NMX2FybWNhcF9QLDQKKy5ub25fbGF6eV9zeW1ib2xfcG9pbnRlcgorT1BFTlNTTF9hcm1jYXBfUDoKKy5pbmRpcmVjdF9zeW1ib2wJX09QRU5TU0xfYXJtY2FwX1AKKy5sb25nCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flcy1hcm12NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flcy1hcm12NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMGI0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvYWVzLWFybXY0LlMKQEAgLTAsMCArMSwxMjE4IEBACitAIENvcHlyaWdodCAyMDA3LTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgT3BlblNTTCBsaWNlbnNlICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZQorQCB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorQCBpbiB0aGUgZmlsZSBMSUNFTlNFIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9yIGF0CitAIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKworCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorQCBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCitAIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCitAIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAIEFFUyBmb3IgQVJNdjQKKworQCBKYW51YXJ5IDIwMDcuCitACitAIENvZGUgdXNlcyBzaW5nbGUgMUsgUy1ib3ggYW5kIGlzID4yIHRpbWVzIGZhc3RlciB0aGFuIGNvZGUgZ2VuZXJhdGVkCitAIGJ5IGdjYy0zLjQuMS4gVGhpcyBpcyB0aGFua3MgdG8gdW5pcXVlIGZlYXR1cmUgb2YgQVJNdjQgSVNBLCB3aGljaAorQCBhbGxvd3MgdG8gbWVyZ2UgbG9naWNhbCBvciBhcml0aG1ldGljIG9wZXJhdGlvbiB3aXRoIHNoaWZ0IG9yIHJvdGF0ZQorQCBpbiBvbmUgaW5zdHJ1Y3Rpb24gYW5kIGVtaXQgY29tYmluZWQgcmVzdWx0IGV2ZXJ5IGN5Y2xlLiBUaGUgbW9kdWxlCitAIGlzIGVuZGlhbi1uZXV0cmFsLiBUaGUgcGVyZm9ybWFuY2UgaXMgfjQyIGN5Y2xlcy9ieXRlIGZvciAxMjgtYml0CitAIGtleSBbb24gc2luZ2xlLWlzc3VlIFhzY2FsZSBQWEEyNTAgY29yZV0uCisKK0AgTWF5IDIwMDcuCitACitAIEFFU19zZXRfW2VufGRlXWNyeXB0X2tleSBpcyBhZGRlZC4KKworQCBKdWx5IDIwMTAuCitACitAIFJlc2NoZWR1bGluZyBmb3IgZHVhbC1pc3N1ZSBwaXBlbGluZSByZXN1bHRlZCBpbiAxMiUgaW1wcm92ZW1lbnQgb24KK0AgQ29ydGV4IEE4IGNvcmUgYW5kIH4yNSBjeWNsZXMgcGVyIGJ5dGUgcHJvY2Vzc2VkIHdpdGggMTI4LWJpdCBrZXkuCisKK0AgRmVicnVhcnkgMjAxMS4KK0AKK0AgUHJvZmlsZXItYXNzaXN0ZWQgYW5kIHBsYXRmb3JtLXNwZWNpZmljIG9wdGltaXphdGlvbiByZXN1bHRlZCBpbiAxNiUKK0AgaW1wcm92ZW1lbnQgb24gQ29ydGV4IEE4IGNvcmUgYW5kIH4yMS41IGN5Y2xlcyBwZXIgYnl0ZS4KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNlbHNlCisjIGRlZmluZSBfX0FSTV9BUkNIX18gX19MSU5VWF9BUk1fQVJDSF9fCisjZW5kaWYKKworQCBTaWxlbmNlIEFSTXY4IGRlcHJlY2F0ZWQgSVQgaW5zdHJ1Y3Rpb24gd2FybmluZ3MuIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IGJvdGgKK0AgQVJNdjcgYW5kIEFSTXY4IHByb2Nlc3NvcnMgYW5kIGRvZXMgbm90IHVzZSBBUk12OCBpbnN0cnVjdGlvbnMuIChBUk12OCBBRVMKK0AgaW5zdHJ1Y3Rpb25zIGFyZSBpbiBhZXN2OC1hcm14LnBsLikKKworCisudGV4dAorI2lmIGRlZmluZWQoX190aHVtYjJfXykgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorLnN5bnRheAl1bmlmaWVkCisudGh1bWIKKyNlbHNlCisuY29kZQkzMgorI3VuZGVmIF9fdGh1bWIyX18KKyNlbmRpZgorCisKKy5hbGlnbgk1CitBRVNfVGU6Cisud29yZAkweGM2NjM2M2E1LCAweGY4N2M3Yzg0LCAweGVlNzc3Nzk5LCAweGY2N2I3YjhkCisud29yZAkweGZmZjJmMjBkLCAweGQ2NmI2YmJkLCAweGRlNmY2ZmIxLCAweDkxYzVjNTU0Cisud29yZAkweDYwMzAzMDUwLCAweDAyMDEwMTAzLCAweGNlNjc2N2E5LCAweDU2MmIyYjdkCisud29yZAkweGU3ZmVmZTE5LCAweGI1ZDdkNzYyLCAweDRkYWJhYmU2LCAweGVjNzY3NjlhCisud29yZAkweDhmY2FjYTQ1LCAweDFmODI4MjlkLCAweDg5YzljOTQwLCAweGZhN2Q3ZDg3Cisud29yZAkweGVmZmFmYTE1LCAweGIyNTk1OWViLCAweDhlNDc0N2M5LCAweGZiZjBmMDBiCisud29yZAkweDQxYWRhZGVjLCAweGIzZDRkNDY3LCAweDVmYTJhMmZkLCAweDQ1YWZhZmVhCisud29yZAkweDIzOWM5Y2JmLCAweDUzYTRhNGY3LCAweGU0NzI3Mjk2LCAweDliYzBjMDViCisud29yZAkweDc1YjdiN2MyLCAweGUxZmRmZDFjLCAweDNkOTM5M2FlLCAweDRjMjYyNjZhCisud29yZAkweDZjMzYzNjVhLCAweDdlM2YzZjQxLCAweGY1ZjdmNzAyLCAweDgzY2NjYzRmCisud29yZAkweDY4MzQzNDVjLCAweDUxYTVhNWY0LCAweGQxZTVlNTM0LCAweGY5ZjFmMTA4Cisud29yZAkweGUyNzE3MTkzLCAweGFiZDhkODczLCAweDYyMzEzMTUzLCAweDJhMTUxNTNmCisud29yZAkweDA4MDQwNDBjLCAweDk1YzdjNzUyLCAweDQ2MjMyMzY1LCAweDlkYzNjMzVlCisud29yZAkweDMwMTgxODI4LCAweDM3OTY5NmExLCAweDBhMDUwNTBmLCAweDJmOWE5YWI1Cisud29yZAkweDBlMDcwNzA5LCAweDI0MTIxMjM2LCAweDFiODA4MDliLCAweGRmZTJlMjNkCisud29yZAkweGNkZWJlYjI2LCAweDRlMjcyNzY5LCAweDdmYjJiMmNkLCAweGVhNzU3NTlmCisud29yZAkweDEyMDkwOTFiLCAweDFkODM4MzllLCAweDU4MmMyYzc0LCAweDM0MWExYTJlCisud29yZAkweDM2MWIxYjJkLCAweGRjNmU2ZWIyLCAweGI0NWE1YWVlLCAweDViYTBhMGZiCisud29yZAkweGE0NTI1MmY2LCAweDc2M2IzYjRkLCAweGI3ZDZkNjYxLCAweDdkYjNiM2NlCisud29yZAkweDUyMjkyOTdiLCAweGRkZTNlMzNlLCAweDVlMmYyZjcxLCAweDEzODQ4NDk3Cisud29yZAkweGE2NTM1M2Y1LCAweGI5ZDFkMTY4LCAweDAwMDAwMDAwLCAweGMxZWRlZDJjCisud29yZAkweDQwMjAyMDYwLCAweGUzZmNmYzFmLCAweDc5YjFiMWM4LCAweGI2NWI1YmVkCisud29yZAkweGQ0NmE2YWJlLCAweDhkY2JjYjQ2LCAweDY3YmViZWQ5LCAweDcyMzkzOTRiCisud29yZAkweDk0NGE0YWRlLCAweDk4NGM0Y2Q0LCAweGIwNTg1OGU4LCAweDg1Y2ZjZjRhCisud29yZAkweGJiZDBkMDZiLCAweGM1ZWZlZjJhLCAweDRmYWFhYWU1LCAweGVkZmJmYjE2Cisud29yZAkweDg2NDM0M2M1LCAweDlhNGQ0ZGQ3LCAweDY2MzMzMzU1LCAweDExODU4NTk0Cisud29yZAkweDhhNDU0NWNmLCAweGU5ZjlmOTEwLCAweDA0MDIwMjA2LCAweGZlN2Y3ZjgxCisud29yZAkweGEwNTA1MGYwLCAweDc4M2MzYzQ0LCAweDI1OWY5ZmJhLCAweDRiYThhOGUzCisud29yZAkweGEyNTE1MWYzLCAweDVkYTNhM2ZlLCAweDgwNDA0MGMwLCAweDA1OGY4ZjhhCisud29yZAkweDNmOTI5MmFkLCAweDIxOWQ5ZGJjLCAweDcwMzgzODQ4LCAweGYxZjVmNTA0Cisud29yZAkweDYzYmNiY2RmLCAweDc3YjZiNmMxLCAweGFmZGFkYTc1LCAweDQyMjEyMTYzCisud29yZAkweDIwMTAxMDMwLCAweGU1ZmZmZjFhLCAweGZkZjNmMzBlLCAweGJmZDJkMjZkCisud29yZAkweDgxY2RjZDRjLCAweDE4MGMwYzE0LCAweDI2MTMxMzM1LCAweGMzZWNlYzJmCisud29yZAkweGJlNWY1ZmUxLCAweDM1OTc5N2EyLCAweDg4NDQ0NGNjLCAweDJlMTcxNzM5Cisud29yZAkweDkzYzRjNDU3LCAweDU1YTdhN2YyLCAweGZjN2U3ZTgyLCAweDdhM2QzZDQ3Cisud29yZAkweGM4NjQ2NGFjLCAweGJhNWQ1ZGU3LCAweDMyMTkxOTJiLCAweGU2NzM3Mzk1Cisud29yZAkweGMwNjA2MGEwLCAweDE5ODE4MTk4LCAweDllNGY0ZmQxLCAweGEzZGNkYzdmCisud29yZAkweDQ0MjIyMjY2LCAweDU0MmEyYTdlLCAweDNiOTA5MGFiLCAweDBiODg4ODgzCisud29yZAkweDhjNDY0NmNhLCAweGM3ZWVlZTI5LCAweDZiYjhiOGQzLCAweDI4MTQxNDNjCisud29yZAkweGE3ZGVkZTc5LCAweGJjNWU1ZWUyLCAweDE2MGIwYjFkLCAweGFkZGJkYjc2Cisud29yZAkweGRiZTBlMDNiLCAweDY0MzIzMjU2LCAweDc0M2EzYTRlLCAweDE0MGEwYTFlCisud29yZAkweDkyNDk0OWRiLCAweDBjMDYwNjBhLCAweDQ4MjQyNDZjLCAweGI4NWM1Y2U0Cisud29yZAkweDlmYzJjMjVkLCAweGJkZDNkMzZlLCAweDQzYWNhY2VmLCAweGM0NjI2MmE2Cisud29yZAkweDM5OTE5MWE4LCAweDMxOTU5NWE0LCAweGQzZTRlNDM3LCAweGYyNzk3OThiCisud29yZAkweGQ1ZTdlNzMyLCAweDhiYzhjODQzLCAweDZlMzczNzU5LCAweGRhNmQ2ZGI3Cisud29yZAkweDAxOGQ4ZDhjLCAweGIxZDVkNTY0LCAweDljNGU0ZWQyLCAweDQ5YTlhOWUwCisud29yZAkweGQ4NmM2Y2I0LCAweGFjNTY1NmZhLCAweGYzZjRmNDA3LCAweGNmZWFlYTI1Cisud29yZAkweGNhNjU2NWFmLCAweGY0N2E3YThlLCAweDQ3YWVhZWU5LCAweDEwMDgwODE4Cisud29yZAkweDZmYmFiYWQ1LCAweGYwNzg3ODg4LCAweDRhMjUyNTZmLCAweDVjMmUyZTcyCisud29yZAkweDM4MWMxYzI0LCAweDU3YTZhNmYxLCAweDczYjRiNGM3LCAweDk3YzZjNjUxCisud29yZAkweGNiZThlODIzLCAweGExZGRkZDdjLCAweGU4NzQ3NDljLCAweDNlMWYxZjIxCisud29yZAkweDk2NGI0YmRkLCAweDYxYmRiZGRjLCAweDBkOGI4Yjg2LCAweDBmOGE4YTg1Cisud29yZAkweGUwNzA3MDkwLCAweDdjM2UzZTQyLCAweDcxYjViNWM0LCAweGNjNjY2NmFhCisud29yZAkweDkwNDg0OGQ4LCAweDA2MDMwMzA1LCAweGY3ZjZmNjAxLCAweDFjMGUwZTEyCisud29yZAkweGMyNjE2MWEzLCAweDZhMzUzNTVmLCAweGFlNTc1N2Y5LCAweDY5YjliOWQwCisud29yZAkweDE3ODY4NjkxLCAweDk5YzFjMTU4LCAweDNhMWQxZDI3LCAweDI3OWU5ZWI5Cisud29yZAkweGQ5ZTFlMTM4LCAweGViZjhmODEzLCAweDJiOTg5OGIzLCAweDIyMTExMTMzCisud29yZAkweGQyNjk2OWJiLCAweGE5ZDlkOTcwLCAweDA3OGU4ZTg5LCAweDMzOTQ5NGE3Cisud29yZAkweDJkOWI5YmI2LCAweDNjMWUxZTIyLCAweDE1ODc4NzkyLCAweGM5ZTllOTIwCisud29yZAkweDg3Y2VjZTQ5LCAweGFhNTU1NWZmLCAweDUwMjgyODc4LCAweGE1ZGZkZjdhCisud29yZAkweDAzOGM4YzhmLCAweDU5YTFhMWY4LCAweDA5ODk4OTgwLCAweDFhMGQwZDE3Cisud29yZAkweDY1YmZiZmRhLCAweGQ3ZTZlNjMxLCAweDg0NDI0MmM2LCAweGQwNjg2OGI4Cisud29yZAkweDgyNDE0MWMzLCAweDI5OTk5OWIwLCAweDVhMmQyZDc3LCAweDFlMGYwZjExCisud29yZAkweDdiYjBiMGNiLCAweGE4NTQ1NGZjLCAweDZkYmJiYmQ2LCAweDJjMTYxNjNhCitAIFRlNFsyNTZdCisuYnl0ZQkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1CisuYnl0ZQkweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2CisuYnl0ZQkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwCisuYnl0ZQkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwCisuYnl0ZQkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjCisuYnl0ZQkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1CisuYnl0ZQkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhCisuYnl0ZQkweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1CisuYnl0ZQkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwCisuYnl0ZQkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0CisuYnl0ZQkweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViCisuYnl0ZQkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmCisuYnl0ZQkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1CisuYnl0ZQkweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4CisuYnl0ZQkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1CisuYnl0ZQkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyCisuYnl0ZQkweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3CisuYnl0ZQkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczCisuYnl0ZQkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4CisuYnl0ZQkweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiCisuYnl0ZQkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjCisuYnl0ZQkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5CisuYnl0ZQkweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5CisuYnl0ZQkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4CisuYnl0ZQkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2CisuYnl0ZQkweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhCisuYnl0ZQkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlCisuYnl0ZQkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllCisuYnl0ZQkweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0CisuYnl0ZQkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmCisuYnl0ZQkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4CisuYnl0ZQkweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2CitAIHJjb25bXQorLndvcmQJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMAorLndvcmQJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMAorLndvcmQJMHgxQjAwMDAwMCwgMHgzNjAwMDAwMCwgMCwgMCwgMCwgMCwgMCwgMAorCisKK0Agdm9pZCBhZXNfbm9od19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCitAIAkJICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisuZ2xvYmwJX2Flc19ub2h3X2VuY3J5cHQKKy5wcml2YXRlX2V4dGVybglfYWVzX25vaHdfZW5jcnlwdAorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9hZXNfbm9od19lbmNyeXB0CisjZW5kaWYKKy5hbGlnbgk1CitfYWVzX25vaHdfZW5jcnlwdDoKKyNpZm5kZWYJX190aHVtYjJfXworCXN1YglyMyxwYywjOAkJQCBfYWVzX25vaHdfZW5jcnlwdAorI2Vsc2UKKwlhZHIJcjMsLgorI2VuZGlmCisJc3RtZGIJc3AhLHtyMSxyNC1yMTIsbHJ9CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKwlhZHIJcjEwLEFFU19UZQorI2Vsc2UKKwlzdWIJcjEwLHIzLCNfYWVzX25vaHdfZW5jcnlwdC1BRVNfVGUJQCBUZQorI2VuZGlmCisJbW92CXIxMixyMAkJQCBpbnAKKwltb3YJcjExLHIyCisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCXIwLFtyMTIsIzNdCUAgbG9hZCBpbnB1dCBkYXRhIGluIGVuZGlhbi1uZXV0cmFsCisJbGRyYglyNCxbcjEyLCMyXQlAIG1hbm5lci4uLgorCWxkcmIJcjUsW3IxMiwjMV0KKwlsZHJiCXI2LFtyMTIsIzBdCisJb3JyCXIwLHIwLHI0LGxzbCM4CisJbGRyYglyMSxbcjEyLCM3XQorCW9ycglyMCxyMCxyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzZdCisJb3JyCXIwLHIwLHI2LGxzbCMyNAorCWxkcmIJcjUsW3IxMiwjNV0KKwlsZHJiCXI2LFtyMTIsIzRdCisJb3JyCXIxLHIxLHI0LGxzbCM4CisJbGRyYglyMixbcjEyLCMxMV0KKwlvcnIJcjEscjEscjUsbHNsIzE2CisJbGRyYglyNCxbcjEyLCMxMF0KKwlvcnIJcjEscjEscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCM5XQorCWxkcmIJcjYsW3IxMiwjOF0KKwlvcnIJcjIscjIscjQsbHNsIzgKKwlsZHJiCXIzLFtyMTIsIzE1XQorCW9ycglyMixyMixyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzE0XQorCW9ycglyMixyMixyNixsc2wjMjQKKwlsZHJiCXI1LFtyMTIsIzEzXQorCWxkcmIJcjYsW3IxMiwjMTJdCisJb3JyCXIzLHIzLHI0LGxzbCM4CisJb3JyCXIzLHIzLHI1LGxzbCMxNgorCW9ycglyMyxyMyxyNixsc2wjMjQKKyNlbHNlCisJbGRyCXIwLFtyMTIsIzBdCisJbGRyCXIxLFtyMTIsIzRdCisJbGRyCXIyLFtyMTIsIzhdCisJbGRyCXIzLFtyMTIsIzEyXQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworI2VuZGlmCisjZW5kaWYKKwlibAlfYXJtdjRfQUVTX2VuY3J5cHQKKworCWxkcglyMTIsW3NwXSwjNAkJQCBwb3Agb3V0CisjaWYgX19BUk1fQVJDSF9fPj03CisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisjZW5kaWYKKwlzdHIJcjAsW3IxMiwjMF0KKwlzdHIJcjEsW3IxMiwjNF0KKwlzdHIJcjIsW3IxMiwjOF0KKwlzdHIJcjMsW3IxMiwjMTJdCisjZWxzZQorCW1vdglyNCxyMCxsc3IjMjQJCUAgd3JpdGUgb3V0cHV0IGluIGVuZGlhbi1uZXV0cmFsCisJbW92CXI1LHIwLGxzciMxNgkJQCBtYW5uZXIuLi4KKwltb3YJcjYscjAsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzBdCisJc3RyYglyNSxbcjEyLCMxXQorCW1vdglyNCxyMSxsc3IjMjQKKwlzdHJiCXI2LFtyMTIsIzJdCisJbW92CXI1LHIxLGxzciMxNgorCXN0cmIJcjAsW3IxMiwjM10KKwltb3YJcjYscjEsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzRdCisJc3RyYglyNSxbcjEyLCM1XQorCW1vdglyNCxyMixsc3IjMjQKKwlzdHJiCXI2LFtyMTIsIzZdCisJbW92CXI1LHIyLGxzciMxNgorCXN0cmIJcjEsW3IxMiwjN10KKwltb3YJcjYscjIsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzhdCisJc3RyYglyNSxbcjEyLCM5XQorCW1vdglyNCxyMyxsc3IjMjQKKwlzdHJiCXI2LFtyMTIsIzEwXQorCW1vdglyNSxyMyxsc3IjMTYKKwlzdHJiCXIyLFtyMTIsIzExXQorCW1vdglyNixyMyxsc3IjOAorCXN0cmIJcjQsW3IxMiwjMTJdCisJc3RyYglyNSxbcjEyLCMxM10KKwlzdHJiCXI2LFtyMTIsIzE0XQorCXN0cmIJcjMsW3IxMiwjMTVdCisjZW5kaWYKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKy53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorCisKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfYXJtdjRfQUVTX2VuY3J5cHQKKyNlbmRpZgorLmFsaWduCTIKK19hcm12NF9BRVNfZW5jcnlwdDoKKwlzdHIJbHIsW3NwLCMtNF0hCQlAIHB1c2ggbHIKKwlsZG1pYQlyMTEhLHtyNCxyNSxyNixyN30KKwllb3IJcjAscjAscjQKKwlsZHIJcjEyLFtyMTEsIzI0MC0xNl0KKwllb3IJcjEscjEscjUKKwllb3IJcjIscjIscjYKKwllb3IJcjMscjMscjcKKwlzdWIJcjEyLHIxMiwjMQorCW1vdglsciwjMjU1CisKKwlhbmQJcjcsbHIscjAKKwlhbmQJcjgsbHIscjAsbHNyIzgKKwlhbmQJcjksbHIscjAsbHNyIzE2CisJbW92CXIwLHIwLGxzciMyNAorTGVuY19sb29wOgorCWxkcglyNCxbcjEwLHI3LGxzbCMyXQlAIFRlM1tzMD4+MF0KKwlhbmQJcjcsbHIscjEsbHNyIzE2CUAgaTAKKwlsZHIJcjUsW3IxMCxyOCxsc2wjMl0JQCBUZTJbczA+PjhdCisJYW5kCXI4LGxyLHIxCisJbGRyCXI2LFtyMTAscjksbHNsIzJdCUAgVGUxW3MwPj4xNl0KKwlhbmQJcjksbHIscjEsbHNyIzgKKwlsZHIJcjAsW3IxMCxyMCxsc2wjMl0JQCBUZTBbczA+PjI0XQorCW1vdglyMSxyMSxsc3IjMjQKKworCWxkcglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlMVtzMT4+MTZdCisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGUzW3MxPj4wXQorCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlMltzMT4+OF0KKwllb3IJcjAscjAscjcscm9yIzgKKwlsZHIJcjEsW3IxMCxyMSxsc2wjMl0JQCBUZTBbczE+PjI0XQorCWFuZAlyNyxscixyMixsc3IjOAlAIGkwCisJZW9yCXI1LHI1LHI4LHJvciM4CisJYW5kCXI4LGxyLHIyLGxzciMxNglAIGkxCisJZW9yCXI2LHI2LHI5LHJvciM4CisJYW5kCXI5LGxyLHIyCisJbGRyCXI3LFtyMTAscjcsbHNsIzJdCUAgVGUyW3MyPj44XQorCWVvcglyMSxyMSxyNCxyb3IjMjQKKwlsZHIJcjgsW3IxMCxyOCxsc2wjMl0JQCBUZTFbczI+PjE2XQorCW1vdglyMixyMixsc3IjMjQKKworCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlM1tzMj4+MF0KKwllb3IJcjAscjAscjcscm9yIzE2CisJbGRyCXIyLFtyMTAscjIsbHNsIzJdCUAgVGUwW3MyPj4yNF0KKwlhbmQJcjcsbHIscjMJCUAgaTAKKwllb3IJcjEscjEscjgscm9yIzgKKwlhbmQJcjgsbHIscjMsbHNyIzgJQCBpMQorCWVvcglyNixyNixyOSxyb3IjMTYKKwlhbmQJcjksbHIscjMsbHNyIzE2CUAgaTIKKwlsZHIJcjcsW3IxMCxyNyxsc2wjMl0JQCBUZTNbczM+PjBdCisJZW9yCXIyLHIyLHI1LHJvciMxNgorCWxkcglyOCxbcjEwLHI4LGxzbCMyXQlAIFRlMltzMz4+OF0KKwltb3YJcjMscjMsbHNyIzI0CisKKwlsZHIJcjksW3IxMCxyOSxsc2wjMl0JQCBUZTFbczM+PjE2XQorCWVvcglyMCxyMCxyNyxyb3IjMjQKKwlsZHIJcjcsW3IxMV0sIzE2CisJZW9yCXIxLHIxLHI4LHJvciMxNgorCWxkcglyMyxbcjEwLHIzLGxzbCMyXQlAIFRlMFtzMz4+MjRdCisJZW9yCXIyLHIyLHI5LHJvciM4CisJbGRyCXI0LFtyMTEsIy0xMl0KKwllb3IJcjMscjMscjYscm9yIzgKKworCWxkcglyNSxbcjExLCMtOF0KKwllb3IJcjAscjAscjcKKwlsZHIJcjYsW3IxMSwjLTRdCisJYW5kCXI3LGxyLHIwCisJZW9yCXIxLHIxLHI0CisJYW5kCXI4LGxyLHIwLGxzciM4CisJZW9yCXIyLHIyLHI1CisJYW5kCXI5LGxyLHIwLGxzciMxNgorCWVvcglyMyxyMyxyNgorCW1vdglyMCxyMCxsc3IjMjQKKworCXN1YnMJcjEyLHIxMiwjMQorCWJuZQlMZW5jX2xvb3AKKworCWFkZAlyMTAscjEwLCMyCisKKwlsZHJiCXI0LFtyMTAscjcsbHNsIzJdCUAgVGU0W3MwPj4wXQorCWFuZAlyNyxscixyMSxsc3IjMTYJQCBpMAorCWxkcmIJcjUsW3IxMCxyOCxsc2wjMl0JQCBUZTRbczA+PjhdCisJYW5kCXI4LGxyLHIxCisJbGRyYglyNixbcjEwLHI5LGxzbCMyXQlAIFRlNFtzMD4+MTZdCisJYW5kCXI5LGxyLHIxLGxzciM4CisJbGRyYglyMCxbcjEwLHIwLGxzbCMyXQlAIFRlNFtzMD4+MjRdCisJbW92CXIxLHIxLGxzciMyNAorCisJbGRyYglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlNFtzMT4+MTZdCisJbGRyYglyOCxbcjEwLHI4LGxzbCMyXQlAIFRlNFtzMT4+MF0KKwlsZHJiCXI5LFtyMTAscjksbHNsIzJdCUAgVGU0W3MxPj44XQorCWVvcglyMCxyNyxyMCxsc2wjOAorCWxkcmIJcjEsW3IxMCxyMSxsc2wjMl0JQCBUZTRbczE+PjI0XQorCWFuZAlyNyxscixyMixsc3IjOAlAIGkwCisJZW9yCXI1LHI4LHI1LGxzbCM4CisJYW5kCXI4LGxyLHIyLGxzciMxNglAIGkxCisJZW9yCXI2LHI5LHI2LGxzbCM4CisJYW5kCXI5LGxyLHIyCisJbGRyYglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlNFtzMj4+OF0KKwllb3IJcjEscjQscjEsbHNsIzI0CisJbGRyYglyOCxbcjEwLHI4LGxzbCMyXQlAIFRlNFtzMj4+MTZdCisJbW92CXIyLHIyLGxzciMyNAorCisJbGRyYglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlNFtzMj4+MF0KKwllb3IJcjAscjcscjAsbHNsIzgKKwlsZHJiCXIyLFtyMTAscjIsbHNsIzJdCUAgVGU0W3MyPj4yNF0KKwlhbmQJcjcsbHIscjMJCUAgaTAKKwllb3IJcjEscjEscjgsbHNsIzE2CisJYW5kCXI4LGxyLHIzLGxzciM4CUAgaTEKKwllb3IJcjYscjkscjYsbHNsIzgKKwlhbmQJcjksbHIscjMsbHNyIzE2CUAgaTIKKwlsZHJiCXI3LFtyMTAscjcsbHNsIzJdCUAgVGU0W3MzPj4wXQorCWVvcglyMixyNSxyMixsc2wjMjQKKwlsZHJiCXI4LFtyMTAscjgsbHNsIzJdCUAgVGU0W3MzPj44XQorCW1vdglyMyxyMyxsc3IjMjQKKworCWxkcmIJcjksW3IxMCxyOSxsc2wjMl0JQCBUZTRbczM+PjE2XQorCWVvcglyMCxyNyxyMCxsc2wjOAorCWxkcglyNyxbcjExLCMwXQorCWxkcmIJcjMsW3IxMCxyMyxsc2wjMl0JQCBUZTRbczM+PjI0XQorCWVvcglyMSxyMSxyOCxsc2wjOAorCWxkcglyNCxbcjExLCM0XQorCWVvcglyMixyMixyOSxsc2wjMTYKKwlsZHIJcjUsW3IxMSwjOF0KKwllb3IJcjMscjYscjMsbHNsIzI0CisJbGRyCXI2LFtyMTEsIzEyXQorCisJZW9yCXIwLHIwLHI3CisJZW9yCXIxLHIxLHI0CisJZW9yCXIyLHIyLHI1CisJZW9yCXIzLHIzLHI2CisKKwlzdWIJcjEwLHIxMCwjMgorCWxkcglwYyxbc3BdLCM0CQlAIHBvcCBhbmQgcmV0dXJuCisKKworLmdsb2JsCV9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKy5wcml2YXRlX2V4dGVybglfYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5CisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2Flc19ub2h3X3NldF9lbmNyeXB0X2tleQorI2VuZGlmCisuYWxpZ24JNQorX2Flc19ub2h3X3NldF9lbmNyeXB0X2tleToKK19hcm12NF9BRVNfc2V0X2VuY3J5cHRfa2V5OgorI2lmbmRlZglfX3RodW1iMl9fCisJc3ViCXIzLHBjLCM4CQlAIF9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKyNlbHNlCisJYWRyCXIzLC4KKyNlbmRpZgorCXRlcQlyMCwjMAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJZXEJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJbW92ZXEJcjAsIy0xCisJYmVxCUxhYnJ0CisJdGVxCXIyLCMwCisjaWZkZWYJX190aHVtYjJfXworCWl0dAllcQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwltb3ZlcQlyMCwjLTEKKwliZXEJTGFicnQKKworCXRlcQlyMSwjMTI4CisJYmVxCUxvaworCXRlcQlyMSwjMTkyCisJYmVxCUxvaworCXRlcQlyMSwjMjU2CisjaWZkZWYJX190aHVtYjJfXworCWl0dAluZQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwltb3ZuZQlyMCwjLTEKKwlibmUJTGFicnQKKworTG9rOglzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCW1vdglyMTIscjAJCUAgaW5wCisJbW92CWxyLHIxCQkJQCBiaXRzCisJbW92CXIxMSxyMgkJCUAga2V5CisKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorCWFkcglyMTAsQUVTX1RlKzEwMjQJCQkJQCBUZTQKKyNlbHNlCisJc3ViCXIxMCxyMywjX2FybXY0X0FFU19zZXRfZW5jcnlwdF9rZXktQUVTX1RlLTEwMjQJQCBUZTQKKyNlbmRpZgorCisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCXIwLFtyMTIsIzNdCUAgbG9hZCBpbnB1dCBkYXRhIGluIGVuZGlhbi1uZXV0cmFsCisJbGRyYglyNCxbcjEyLCMyXQlAIG1hbm5lci4uLgorCWxkcmIJcjUsW3IxMiwjMV0KKwlsZHJiCXI2LFtyMTIsIzBdCisJb3JyCXIwLHIwLHI0LGxzbCM4CisJbGRyYglyMSxbcjEyLCM3XQorCW9ycglyMCxyMCxyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzZdCisJb3JyCXIwLHIwLHI2LGxzbCMyNAorCWxkcmIJcjUsW3IxMiwjNV0KKwlsZHJiCXI2LFtyMTIsIzRdCisJb3JyCXIxLHIxLHI0LGxzbCM4CisJbGRyYglyMixbcjEyLCMxMV0KKwlvcnIJcjEscjEscjUsbHNsIzE2CisJbGRyYglyNCxbcjEyLCMxMF0KKwlvcnIJcjEscjEscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCM5XQorCWxkcmIJcjYsW3IxMiwjOF0KKwlvcnIJcjIscjIscjQsbHNsIzgKKwlsZHJiCXIzLFtyMTIsIzE1XQorCW9ycglyMixyMixyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzE0XQorCW9ycglyMixyMixyNixsc2wjMjQKKwlsZHJiCXI1LFtyMTIsIzEzXQorCWxkcmIJcjYsW3IxMiwjMTJdCisJb3JyCXIzLHIzLHI0LGxzbCM4CisJc3RyCXIwLFtyMTFdLCMxNgorCW9ycglyMyxyMyxyNSxsc2wjMTYKKwlzdHIJcjEsW3IxMSwjLTEyXQorCW9ycglyMyxyMyxyNixsc2wjMjQKKwlzdHIJcjIsW3IxMSwjLThdCisJc3RyCXIzLFtyMTEsIy00XQorI2Vsc2UKKwlsZHIJcjAsW3IxMiwjMF0KKwlsZHIJcjEsW3IxMiwjNF0KKwlsZHIJcjIsW3IxMiwjOF0KKwlsZHIJcjMsW3IxMiwjMTJdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisjZW5kaWYKKwlzdHIJcjAsW3IxMV0sIzE2CisJc3RyCXIxLFtyMTEsIy0xMl0KKwlzdHIJcjIsW3IxMSwjLThdCisJc3RyCXIzLFtyMTEsIy00XQorI2VuZGlmCisKKwl0ZXEJbHIsIzEyOAorCWJuZQlMbm90MTI4CisJbW92CXIxMiwjMTAKKwlzdHIJcjEyLFtyMTEsIzI0MC0xNl0KKwlhZGQJcjYscjEwLCMyNTYJCQlAIHJjb24KKwltb3YJbHIsIzI1NQorCitMMTI4X2xvb3A6CisJYW5kCXI1LGxyLHIzLGxzciMyNAorCWFuZAlyNyxscixyMyxsc3IjMTYKKwlsZHJiCXI1LFtyMTAscjVdCisJYW5kCXI4LGxyLHIzLGxzciM4CisJbGRyYglyNyxbcjEwLHI3XQorCWFuZAlyOSxscixyMworCWxkcmIJcjgsW3IxMCxyOF0KKwlvcnIJcjUscjUscjcsbHNsIzI0CisJbGRyYglyOSxbcjEwLHI5XQorCW9ycglyNSxyNSxyOCxsc2wjMTYKKwlsZHIJcjQsW3I2XSwjNAkJCUAgcmNvbltpKytdCisJb3JyCXI1LHI1LHI5LGxzbCM4CisJZW9yCXI1LHI1LHI0CisJZW9yCXIwLHIwLHI1CQkJQCBya1s0XT1ya1swXV4uLi4KKwllb3IJcjEscjEscjAJCQlAIHJrWzVdPXJrWzFdXnJrWzRdCisJc3RyCXIwLFtyMTFdLCMxNgorCWVvcglyMixyMixyMQkJCUAgcmtbNl09cmtbMl1ecmtbNV0KKwlzdHIJcjEsW3IxMSwjLTEyXQorCWVvcglyMyxyMyxyMgkJCUAgcmtbN109cmtbM11ecmtbNl0KKwlzdHIJcjIsW3IxMSwjLThdCisJc3VicwlyMTIscjEyLCMxCisJc3RyCXIzLFtyMTEsIy00XQorCWJuZQlMMTI4X2xvb3AKKwlzdWIJcjIscjExLCMxNzYKKwliCUxkb25lCisKK0xub3QxMjg6CisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCXI4LFtyMTIsIzE5XQorCWxkcmIJcjQsW3IxMiwjMThdCisJbGRyYglyNSxbcjEyLCMxN10KKwlsZHJiCXI2LFtyMTIsIzE2XQorCW9ycglyOCxyOCxyNCxsc2wjOAorCWxkcmIJcjksW3IxMiwjMjNdCisJb3JyCXI4LHI4LHI1LGxzbCMxNgorCWxkcmIJcjQsW3IxMiwjMjJdCisJb3JyCXI4LHI4LHI2LGxzbCMyNAorCWxkcmIJcjUsW3IxMiwjMjFdCisJbGRyYglyNixbcjEyLCMyMF0KKwlvcnIJcjkscjkscjQsbHNsIzgKKwlvcnIJcjkscjkscjUsbHNsIzE2CisJc3RyCXI4LFtyMTFdLCM4CisJb3JyCXI5LHI5LHI2LGxzbCMyNAorCXN0cglyOSxbcjExLCMtNF0KKyNlbHNlCisJbGRyCXI4LFtyMTIsIzE2XQorCWxkcglyOSxbcjEyLCMyMF0KKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjgscjgKKwlyZXYJcjkscjkKKyNlbmRpZgorCXN0cglyOCxbcjExXSwjOAorCXN0cglyOSxbcjExLCMtNF0KKyNlbmRpZgorCisJdGVxCWxyLCMxOTIKKwlibmUJTG5vdDE5MgorCW1vdglyMTIsIzEyCisJc3RyCXIxMixbcjExLCMyNDAtMjRdCisJYWRkCXI2LHIxMCwjMjU2CQkJQCByY29uCisJbW92CWxyLCMyNTUKKwltb3YJcjEyLCM4CisKK0wxOTJfbG9vcDoKKwlhbmQJcjUsbHIscjksbHNyIzI0CisJYW5kCXI3LGxyLHI5LGxzciMxNgorCWxkcmIJcjUsW3IxMCxyNV0KKwlhbmQJcjgsbHIscjksbHNyIzgKKwlsZHJiCXI3LFtyMTAscjddCisJYW5kCXI5LGxyLHI5CisJbGRyYglyOCxbcjEwLHI4XQorCW9ycglyNSxyNSxyNyxsc2wjMjQKKwlsZHJiCXI5LFtyMTAscjldCisJb3JyCXI1LHI1LHI4LGxzbCMxNgorCWxkcglyNCxbcjZdLCM0CQkJQCByY29uW2krK10KKwlvcnIJcjUscjUscjksbHNsIzgKKwllb3IJcjkscjUscjQKKwllb3IJcjAscjAscjkJCQlAIHJrWzZdPXJrWzBdXi4uLgorCWVvcglyMSxyMSxyMAkJCUAgcmtbN109cmtbMV1ecmtbNl0KKwlzdHIJcjAsW3IxMV0sIzI0CisJZW9yCXIyLHIyLHIxCQkJQCBya1s4XT1ya1syXV5ya1s3XQorCXN0cglyMSxbcjExLCMtMjBdCisJZW9yCXIzLHIzLHIyCQkJQCBya1s5XT1ya1szXV5ya1s4XQorCXN0cglyMixbcjExLCMtMTZdCisJc3VicwlyMTIscjEyLCMxCisJc3RyCXIzLFtyMTEsIy0xMl0KKyNpZmRlZglfX3RodW1iMl9fCisJaXR0CWVxCQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlzdWJlcQlyMixyMTEsIzIxNgorCWJlcQlMZG9uZQorCisJbGRyCXI3LFtyMTEsIy0zMl0KKwlsZHIJcjgsW3IxMSwjLTI4XQorCWVvcglyNyxyNyxyMwkJCUAgcmtbMTBdPXJrWzRdXnJrWzldCisJZW9yCXI5LHI4LHI3CQkJQCBya1sxMV09cmtbNV1ecmtbMTBdCisJc3RyCXI3LFtyMTEsIy04XQorCXN0cglyOSxbcjExLCMtNF0KKwliCUwxOTJfbG9vcAorCitMbm90MTkyOgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyOCxbcjEyLCMyN10KKwlsZHJiCXI0LFtyMTIsIzI2XQorCWxkcmIJcjUsW3IxMiwjMjVdCisJbGRyYglyNixbcjEyLCMyNF0KKwlvcnIJcjgscjgscjQsbHNsIzgKKwlsZHJiCXI5LFtyMTIsIzMxXQorCW9ycglyOCxyOCxyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzMwXQorCW9ycglyOCxyOCxyNixsc2wjMjQKKwlsZHJiCXI1LFtyMTIsIzI5XQorCWxkcmIJcjYsW3IxMiwjMjhdCisJb3JyCXI5LHI5LHI0LGxzbCM4CisJb3JyCXI5LHI5LHI1LGxzbCMxNgorCXN0cglyOCxbcjExXSwjOAorCW9ycglyOSxyOSxyNixsc2wjMjQKKwlzdHIJcjksW3IxMSwjLTRdCisjZWxzZQorCWxkcglyOCxbcjEyLCMyNF0KKwlsZHIJcjksW3IxMiwjMjhdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXI4LHI4CisJcmV2CXI5LHI5CisjZW5kaWYKKwlzdHIJcjgsW3IxMV0sIzgKKwlzdHIJcjksW3IxMSwjLTRdCisjZW5kaWYKKworCW1vdglyMTIsIzE0CisJc3RyCXIxMixbcjExLCMyNDAtMzJdCisJYWRkCXI2LHIxMCwjMjU2CQkJQCByY29uCisJbW92CWxyLCMyNTUKKwltb3YJcjEyLCM3CisKK0wyNTZfbG9vcDoKKwlhbmQJcjUsbHIscjksbHNyIzI0CisJYW5kCXI3LGxyLHI5LGxzciMxNgorCWxkcmIJcjUsW3IxMCxyNV0KKwlhbmQJcjgsbHIscjksbHNyIzgKKwlsZHJiCXI3LFtyMTAscjddCisJYW5kCXI5LGxyLHI5CisJbGRyYglyOCxbcjEwLHI4XQorCW9ycglyNSxyNSxyNyxsc2wjMjQKKwlsZHJiCXI5LFtyMTAscjldCisJb3JyCXI1LHI1LHI4LGxzbCMxNgorCWxkcglyNCxbcjZdLCM0CQkJQCByY29uW2krK10KKwlvcnIJcjUscjUscjksbHNsIzgKKwllb3IJcjkscjUscjQKKwllb3IJcjAscjAscjkJCQlAIHJrWzhdPXJrWzBdXi4uLgorCWVvcglyMSxyMSxyMAkJCUAgcmtbOV09cmtbMV1ecmtbOF0KKwlzdHIJcjAsW3IxMV0sIzMyCisJZW9yCXIyLHIyLHIxCQkJQCBya1sxMF09cmtbMl1ecmtbOV0KKwlzdHIJcjEsW3IxMSwjLTI4XQorCWVvcglyMyxyMyxyMgkJCUAgcmtbMTFdPXJrWzNdXnJrWzEwXQorCXN0cglyMixbcjExLCMtMjRdCisJc3VicwlyMTIscjEyLCMxCisJc3RyCXIzLFtyMTEsIy0yMF0KKyNpZmRlZglfX3RodW1iMl9fCisJaXR0CWVxCQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlzdWJlcQlyMixyMTEsIzI1NgorCWJlcQlMZG9uZQorCisJYW5kCXI1LGxyLHIzCisJYW5kCXI3LGxyLHIzLGxzciM4CisJbGRyYglyNSxbcjEwLHI1XQorCWFuZAlyOCxscixyMyxsc3IjMTYKKwlsZHJiCXI3LFtyMTAscjddCisJYW5kCXI5LGxyLHIzLGxzciMyNAorCWxkcmIJcjgsW3IxMCxyOF0KKwlvcnIJcjUscjUscjcsbHNsIzgKKwlsZHJiCXI5LFtyMTAscjldCisJb3JyCXI1LHI1LHI4LGxzbCMxNgorCWxkcglyNCxbcjExLCMtNDhdCisJb3JyCXI1LHI1LHI5LGxzbCMyNAorCisJbGRyCXI3LFtyMTEsIy00NF0KKwlsZHIJcjgsW3IxMSwjLTQwXQorCWVvcglyNCxyNCxyNQkJCUAgcmtbMTJdPXJrWzRdXi4uLgorCWxkcglyOSxbcjExLCMtMzZdCisJZW9yCXI3LHI3LHI0CQkJQCBya1sxM109cmtbNV1ecmtbMTJdCisJc3RyCXI0LFtyMTEsIy0xNl0KKwllb3IJcjgscjgscjcJCQlAIHJrWzE0XT1ya1s2XV5ya1sxM10KKwlzdHIJcjcsW3IxMSwjLTEyXQorCWVvcglyOSxyOSxyOAkJCUAgcmtbMTVdPXJrWzddXnJrWzE0XQorCXN0cglyOCxbcjExLCMtOF0KKwlzdHIJcjksW3IxMSwjLTRdCisJYglMMjU2X2xvb3AKKworLmFsaWduCTIKK0xkb25lOgltb3YJcjAsIzAKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorTGFicnQ6CisjaWYgX19BUk1fQVJDSF9fPj01CisJYngJbHIJCQkJQCAud29yZAkweGUxMmZmZjFlCisjZWxzZQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKy53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorCisKKy5nbG9ibAlfYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5CisucHJpdmF0ZV9leHRlcm4JX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleQorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9hZXNfbm9od19zZXRfZGVjcnlwdF9rZXkKKyNlbmRpZgorLmFsaWduCTUKK19hZXNfbm9od19zZXRfZGVjcnlwdF9rZXk6CisJc3RyCWxyLFtzcCwjLTRdISAgICAgICAgICAgIEAgcHVzaCBscgorCWJsCV9hcm12NF9BRVNfc2V0X2VuY3J5cHRfa2V5CisJdGVxCXIwLCMwCisJbGRyCWxyLFtzcF0sIzQgICAgICAgICAgICAgIEAgcG9wIGxyCisJYm5lCUxhYnJ0CisKKwltb3YJcjAscjIJCQlAIF9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXkgcHJlc2VydmVzIHIyLAorCW1vdglyMSxyMgkJCUAgd2hpY2ggaXMgQUVTX0tFWSAqa2V5CisJYglfYXJtdjRfQUVTX3NldF9lbmMyZGVjX2tleQorCisKK0Agdm9pZCBBRVNfc2V0X2VuYzJkZWNfa2V5KGNvbnN0IEFFU19LRVkgKmlucCxBRVNfS0VZICpvdXQpCisuZ2xvYmwJX0FFU19zZXRfZW5jMmRlY19rZXkKKy5wcml2YXRlX2V4dGVybglfQUVTX3NldF9lbmMyZGVjX2tleQorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9BRVNfc2V0X2VuYzJkZWNfa2V5CisjZW5kaWYKKy5hbGlnbgk1CitfQUVTX3NldF9lbmMyZGVjX2tleToKK19hcm12NF9BRVNfc2V0X2VuYzJkZWNfa2V5OgorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisKKwlsZHIJcjEyLFtyMCwjMjQwXQorCW1vdglyNyxyMAkJCUAgaW5wdXQKKwlhZGQJcjgscjAscjEyLGxzbCM0CisJbW92CXIxMSxyMQkJCUAgb3V0cHV0CisJYWRkCXIxMCxyMSxyMTIsbHNsIzQKKwlzdHIJcjEyLFtyMSwjMjQwXQorCitMaW52OglsZHIJcjAsW3I3XSwjMTYKKwlsZHIJcjEsW3I3LCMtMTJdCisJbGRyCXIyLFtyNywjLThdCisJbGRyCXIzLFtyNywjLTRdCisJbGRyCXI0LFtyOF0sIy0xNgorCWxkcglyNSxbcjgsIzE2KzRdCisJbGRyCXI2LFtyOCwjMTYrOF0KKwlsZHIJcjksW3I4LCMxNisxMl0KKwlzdHIJcjAsW3IxMF0sIy0xNgorCXN0cglyMSxbcjEwLCMxNis0XQorCXN0cglyMixbcjEwLCMxNis4XQorCXN0cglyMyxbcjEwLCMxNisxMl0KKwlzdHIJcjQsW3IxMV0sIzE2CisJc3RyCXI1LFtyMTEsIy0xMl0KKwlzdHIJcjYsW3IxMSwjLThdCisJc3RyCXI5LFtyMTEsIy00XQorCXRlcQlyNyxyOAorCWJuZQlMaW52CisKKwlsZHIJcjAsW3I3XQorCWxkcglyMSxbcjcsIzRdCisJbGRyCXIyLFtyNywjOF0KKwlsZHIJcjMsW3I3LCMxMl0KKwlzdHIJcjAsW3IxMV0KKwlzdHIJcjEsW3IxMSwjNF0KKwlzdHIJcjIsW3IxMSwjOF0KKwlzdHIJcjMsW3IxMSwjMTJdCisJc3ViCXIxMSxyMTEscjEyLGxzbCMzCisJbGRyCXIwLFtyMTEsIzE2XSEJCUAgcHJlZmV0Y2ggdHAxCisJbW92CXI3LCMweDgwCisJbW92CXI4LCMweDFiCisJb3JyCXI3LHI3LCMweDgwMDAKKwlvcnIJcjgscjgsIzB4MWIwMAorCW9ycglyNyxyNyxyNyxsc2wjMTYKKwlvcnIJcjgscjgscjgsbHNsIzE2CisJc3ViCXIxMixyMTIsIzEKKwltdm4JcjkscjcKKwltb3YJcjEyLHIxMixsc2wjMglAIChyb3VuZHMtMSkqNAorCitMbWl4OglhbmQJcjQscjAscjcKKwlhbmQJcjEscjAscjkKKwlzdWIJcjQscjQscjQsbHNyIzcKKwlhbmQJcjQscjQscjgKKwllb3IJcjEscjQscjEsbHNsIzEJQCB0cDIKKworCWFuZAlyNCxyMSxyNworCWFuZAlyMixyMSxyOQorCXN1YglyNCxyNCxyNCxsc3IjNworCWFuZAlyNCxyNCxyOAorCWVvcglyMixyNCxyMixsc2wjMQlAIHRwNAorCisJYW5kCXI0LHIyLHI3CisJYW5kCXIzLHIyLHI5CisJc3ViCXI0LHI0LHI0LGxzciM3CisJYW5kCXI0LHI0LHI4CisJZW9yCXIzLHI0LHIzLGxzbCMxCUAgdHA4CisKKwllb3IJcjQscjEscjIKKwllb3IJcjUscjAscjMJCUAgdHA5CisJZW9yCXI0LHI0LHIzCQlAIHRwZQorCWVvcglyNCxyNCxyMSxyb3IjMjQKKwllb3IJcjQscjQscjUscm9yIzI0CUAgXj0gUk9UQVRFKHRwYj10cDledHAyLDgpCisJZW9yCXI0LHI0LHIyLHJvciMxNgorCWVvcglyNCxyNCxyNSxyb3IjMTYJQCBePSBST1RBVEUodHBkPXRwOV50cDQsMTYpCisJZW9yCXI0LHI0LHI1LHJvciM4CUAgXj0gUk9UQVRFKHRwOSwyNCkKKworCWxkcglyMCxbcjExLCM0XQkJQCBwcmVmZXRjaCB0cDEKKwlzdHIJcjQsW3IxMV0sIzQKKwlzdWJzCXIxMixyMTIsIzEKKwlibmUJTG1peAorCisJbW92CXIwLCMwCisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0Cisud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKworCisKKy5hbGlnbgk1CitBRVNfVGQ6Cisud29yZAkweDUxZjRhNzUwLCAweDdlNDE2NTUzLCAweDFhMTdhNGMzLCAweDNhMjc1ZTk2Cisud29yZAkweDNiYWI2YmNiLCAweDFmOWQ0NWYxLCAweGFjZmE1OGFiLCAweDRiZTMwMzkzCisud29yZAkweDIwMzBmYTU1LCAweGFkNzY2ZGY2LCAweDg4Y2M3NjkxLCAweGY1MDI0YzI1Cisud29yZAkweDRmZTVkN2ZjLCAweGM1MmFjYmQ3LCAweDI2MzU0NDgwLCAweGI1NjJhMzhmCisud29yZAkweGRlYjE1YTQ5LCAweDI1YmExYjY3LCAweDQ1ZWEwZTk4LCAweDVkZmVjMGUxCisud29yZAkweGMzMmY3NTAyLCAweDgxNGNmMDEyLCAweDhkNDY5N2EzLCAweDZiZDNmOWM2Cisud29yZAkweDAzOGY1ZmU3LCAweDE1OTI5Yzk1LCAweGJmNmQ3YWViLCAweDk1NTI1OWRhCisud29yZAkweGQ0YmU4MzJkLCAweDU4NzQyMWQzLCAweDQ5ZTA2OTI5LCAweDhlYzljODQ0Cisud29yZAkweDc1YzI4OTZhLCAweGY0OGU3OTc4LCAweDk5NTgzZTZiLCAweDI3Yjk3MWRkCisud29yZAkweGJlZTE0ZmI2LCAweGYwODhhZDE3LCAweGM5MjBhYzY2LCAweDdkY2UzYWI0Cisud29yZAkweDYzZGY0YTE4LCAweGU1MWEzMTgyLCAweDk3NTEzMzYwLCAweDYyNTM3ZjQ1Cisud29yZAkweGIxNjQ3N2UwLCAweGJiNmJhZTg0LCAweGZlODFhMDFjLCAweGY5MDgyYjk0Cisud29yZAkweDcwNDg2ODU4LCAweDhmNDVmZDE5LCAweDk0ZGU2Yzg3LCAweDUyN2JmOGI3Cisud29yZAkweGFiNzNkMzIzLCAweDcyNGIwMmUyLCAweGUzMWY4ZjU3LCAweDY2NTVhYjJhCisud29yZAkweGIyZWIyODA3LCAweDJmYjVjMjAzLCAweDg2YzU3YjlhLCAweGQzMzcwOGE1Cisud29yZAkweDMwMjg4N2YyLCAweDIzYmZhNWIyLCAweDAyMDM2YWJhLCAweGVkMTY4MjVjCisud29yZAkweDhhY2YxYzJiLCAweGE3NzliNDkyLCAweGYzMDdmMmYwLCAweDRlNjllMmExCisud29yZAkweDY1ZGFmNGNkLCAweDA2MDViZWQ1LCAweGQxMzQ2MjFmLCAweGM0YTZmZThhCisud29yZAkweDM0MmU1MzlkLCAweGEyZjM1NWEwLCAweDA1OGFlMTMyLCAweGE0ZjZlYjc1Cisud29yZAkweDBiODNlYzM5LCAweDQwNjBlZmFhLCAweDVlNzE5ZjA2LCAweGJkNmUxMDUxCisud29yZAkweDNlMjE4YWY5LCAweDk2ZGQwNjNkLCAweGRkM2UwNWFlLCAweDRkZTZiZDQ2Cisud29yZAkweDkxNTQ4ZGI1LCAweDcxYzQ1ZDA1LCAweDA0MDZkNDZmLCAweDYwNTAxNWZmCisud29yZAkweDE5OThmYjI0LCAweGQ2YmRlOTk3LCAweDg5NDA0M2NjLCAweDY3ZDk5ZTc3Cisud29yZAkweGIwZTg0MmJkLCAweDA3ODk4Yjg4LCAweGU3MTk1YjM4LCAweDc5YzhlZWRiCisud29yZAkweGExN2MwYTQ3LCAweDdjNDIwZmU5LCAweGY4ODQxZWM5LCAweDAwMDAwMDAwCisud29yZAkweDA5ODA4NjgzLCAweDMyMmJlZDQ4LCAweDFlMTE3MGFjLCAweDZjNWE3MjRlCisud29yZAkweGZkMGVmZmZiLCAweDBmODUzODU2LCAweDNkYWVkNTFlLCAweDM2MmQzOTI3Cisud29yZAkweDBhMGZkOTY0LCAweDY4NWNhNjIxLCAweDliNWI1NGQxLCAweDI0MzYyZTNhCisud29yZAkweDBjMGE2N2IxLCAweDkzNTdlNzBmLCAweGI0ZWU5NmQyLCAweDFiOWI5MTllCisud29yZAkweDgwYzBjNTRmLCAweDYxZGMyMGEyLCAweDVhNzc0YjY5LCAweDFjMTIxYTE2Cisud29yZAkweGUyOTNiYTBhLCAweGMwYTAyYWU1LCAweDNjMjJlMDQzLCAweDEyMWIxNzFkCisud29yZAkweDBlMDkwZDBiLCAweGYyOGJjN2FkLCAweDJkYjZhOGI5LCAweDE0MWVhOWM4Cisud29yZAkweDU3ZjExOTg1LCAweGFmNzUwNzRjLCAweGVlOTlkZGJiLCAweGEzN2Y2MGZkCisud29yZAkweGY3MDEyNjlmLCAweDVjNzJmNWJjLCAweDQ0NjYzYmM1LCAweDViZmI3ZTM0Cisud29yZAkweDhiNDMyOTc2LCAweGNiMjNjNmRjLCAweGI2ZWRmYzY4LCAweGI4ZTRmMTYzCisud29yZAkweGQ3MzFkY2NhLCAweDQyNjM4NTEwLCAweDEzOTcyMjQwLCAweDg0YzYxMTIwCisud29yZAkweDg1NGEyNDdkLCAweGQyYmIzZGY4LCAweGFlZjkzMjExLCAweGM3MjlhMTZkCisud29yZAkweDFkOWUyZjRiLCAweGRjYjIzMGYzLCAweDBkODY1MmVjLCAweDc3YzFlM2QwCisud29yZAkweDJiYjMxNjZjLCAweGE5NzBiOTk5LCAweDExOTQ0OGZhLCAweDQ3ZTk2NDIyCisud29yZAkweGE4ZmM4Y2M0LCAweGEwZjAzZjFhLCAweDU2N2QyY2Q4LCAweDIyMzM5MGVmCisud29yZAkweDg3NDk0ZWM3LCAweGQ5MzhkMWMxLCAweDhjY2FhMmZlLCAweDk4ZDQwYjM2Cisud29yZAkweGE2ZjU4MWNmLCAweGE1N2FkZTI4LCAweGRhYjc4ZTI2LCAweDNmYWRiZmE0Cisud29yZAkweDJjM2E5ZGU0LCAweDUwNzg5MjBkLCAweDZhNWZjYzliLCAweDU0N2U0NjYyCisud29yZAkweGY2OGQxM2MyLCAweDkwZDhiOGU4LCAweDJlMzlmNzVlLCAweDgyYzNhZmY1Cisud29yZAkweDlmNWQ4MGJlLCAweDY5ZDA5MzdjLCAweDZmZDUyZGE5LCAweGNmMjUxMmIzCisud29yZAkweGM4YWM5OTNiLCAweDEwMTg3ZGE3LCAweGU4OWM2MzZlLCAweGRiM2JiYjdiCisud29yZAkweGNkMjY3ODA5LCAweDZlNTkxOGY0LCAweGVjOWFiNzAxLCAweDgzNGY5YWE4Cisud29yZAkweGU2OTU2ZTY1LCAweGFhZmZlNjdlLCAweDIxYmNjZjA4LCAweGVmMTVlOGU2Cisud29yZAkweGJhZTc5YmQ5LCAweDRhNmYzNmNlLCAweGVhOWYwOWQ0LCAweDI5YjA3Y2Q2Cisud29yZAkweDMxYTRiMmFmLCAweDJhM2YyMzMxLCAweGM2YTU5NDMwLCAweDM1YTI2NmMwCisud29yZAkweDc0NGViYzM3LCAweGZjODJjYWE2LCAweGUwOTBkMGIwLCAweDMzYTdkODE1Cisud29yZAkweGYxMDQ5ODRhLCAweDQxZWNkYWY3LCAweDdmY2Q1MDBlLCAweDE3OTFmNjJmCisud29yZAkweDc2NGRkNjhkLCAweDQzZWZiMDRkLCAweGNjYWE0ZDU0LCAweGU0OTYwNGRmCisud29yZAkweDllZDFiNWUzLCAweDRjNmE4ODFiLCAweGMxMmMxZmI4LCAweDQ2NjU1MTdmCisud29yZAkweDlkNWVlYTA0LCAweDAxOGMzNTVkLCAweGZhODc3NDczLCAweGZiMGI0MTJlCisud29yZAkweGIzNjcxZDVhLCAweDkyZGJkMjUyLCAweGU5MTA1NjMzLCAweDZkZDY0NzEzCisud29yZAkweDlhZDc2MThjLCAweDM3YTEwYzdhLCAweDU5ZjgxNDhlLCAweGViMTMzYzg5Cisud29yZAkweGNlYTkyN2VlLCAweGI3NjFjOTM1LCAweGUxMWNlNWVkLCAweDdhNDdiMTNjCisud29yZAkweDljZDJkZjU5LCAweDU1ZjI3MzNmLCAweDE4MTRjZTc5LCAweDczYzczN2JmCisud29yZAkweDUzZjdjZGVhLCAweDVmZmRhYTViLCAweGRmM2Q2ZjE0LCAweDc4NDRkYjg2Cisud29yZAkweGNhYWZmMzgxLCAweGI5NjhjNDNlLCAweDM4MjQzNDJjLCAweGMyYTM0MDVmCisud29yZAkweDE2MWRjMzcyLCAweGJjZTIyNTBjLCAweDI4M2M0OThiLCAweGZmMGQ5NTQxCisud29yZAkweDM5YTgwMTcxLCAweDA4MGNiM2RlLCAweGQ4YjRlNDljLCAweDY0NTZjMTkwCisud29yZAkweDdiY2I4NDYxLCAweGQ1MzJiNjcwLCAweDQ4NmM1Yzc0LCAweGQwYjg1NzQyCitAIFRkNFsyNTZdCisuYnl0ZQkweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4CisuYnl0ZQkweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiCisuYnl0ZQkweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3CisuYnl0ZQkweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiCisuYnl0ZQkweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkCisuYnl0ZQkweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlCisuYnl0ZQkweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyCisuYnl0ZQkweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1CisuYnl0ZQkweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2CisuYnl0ZQkweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyCisuYnl0ZQkweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhCisuYnl0ZQkweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0CisuYnl0ZQkweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhCisuYnl0ZQkweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2CisuYnl0ZQkweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyCisuYnl0ZQkweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiCisuYnl0ZQkweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhCisuYnl0ZQkweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczCisuYnl0ZQkweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1CisuYnl0ZQkweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlCisuYnl0ZQkweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5CisuYnl0ZQkweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiCisuYnl0ZQkweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwCisuYnl0ZQkweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0CisuYnl0ZQkweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxCisuYnl0ZQkweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmCisuYnl0ZQkweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkCisuYnl0ZQkweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmCisuYnl0ZQkweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwCisuYnl0ZQkweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxCisuYnl0ZQkweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2CisuYnl0ZQkweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkCisKKworQCB2b2lkIGFlc19ub2h3X2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKK0AgCQkgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXkpIHsKKy5nbG9ibAlfYWVzX25vaHdfZGVjcnlwdAorLnByaXZhdGVfZXh0ZXJuCV9hZXNfbm9od19kZWNyeXB0CisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2Flc19ub2h3X2RlY3J5cHQKKyNlbmRpZgorLmFsaWduCTUKK19hZXNfbm9od19kZWNyeXB0OgorI2lmbmRlZglfX3RodW1iMl9fCisJc3ViCXIzLHBjLCM4CQlAIF9hZXNfbm9od19kZWNyeXB0CisjZWxzZQorCWFkcglyMywuCisjZW5kaWYKKwlzdG1kYglzcCEse3IxLHI0LXIxMixscn0KKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorCWFkcglyMTAsQUVTX1RkCisjZWxzZQorCXN1YglyMTAscjMsI19hZXNfbm9od19kZWNyeXB0LUFFU19UZAlAIFRkCisjZW5kaWYKKwltb3YJcjEyLHIwCQlAIGlucAorCW1vdglyMTEscjIKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjAsW3IxMiwjM10JQCBsb2FkIGlucHV0IGRhdGEgaW4gZW5kaWFuLW5ldXRyYWwKKwlsZHJiCXI0LFtyMTIsIzJdCUAgbWFubmVyLi4uCisJbGRyYglyNSxbcjEyLCMxXQorCWxkcmIJcjYsW3IxMiwjMF0KKwlvcnIJcjAscjAscjQsbHNsIzgKKwlsZHJiCXIxLFtyMTIsIzddCisJb3JyCXIwLHIwLHI1LGxzbCMxNgorCWxkcmIJcjQsW3IxMiwjNl0KKwlvcnIJcjAscjAscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCM1XQorCWxkcmIJcjYsW3IxMiwjNF0KKwlvcnIJcjEscjEscjQsbHNsIzgKKwlsZHJiCXIyLFtyMTIsIzExXQorCW9ycglyMSxyMSxyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzEwXQorCW9ycglyMSxyMSxyNixsc2wjMjQKKwlsZHJiCXI1LFtyMTIsIzldCisJbGRyYglyNixbcjEyLCM4XQorCW9ycglyMixyMixyNCxsc2wjOAorCWxkcmIJcjMsW3IxMiwjMTVdCisJb3JyCXIyLHIyLHI1LGxzbCMxNgorCWxkcmIJcjQsW3IxMiwjMTRdCisJb3JyCXIyLHIyLHI2LGxzbCMyNAorCWxkcmIJcjUsW3IxMiwjMTNdCisJbGRyYglyNixbcjEyLCMxMl0KKwlvcnIJcjMscjMscjQsbHNsIzgKKwlvcnIJcjMscjMscjUsbHNsIzE2CisJb3JyCXIzLHIzLHI2LGxzbCMyNAorI2Vsc2UKKwlsZHIJcjAsW3IxMiwjMF0KKwlsZHIJcjEsW3IxMiwjNF0KKwlsZHIJcjIsW3IxMiwjOF0KKwlsZHIJcjMsW3IxMiwjMTJdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisjZW5kaWYKKyNlbmRpZgorCWJsCV9hcm12NF9BRVNfZGVjcnlwdAorCisJbGRyCXIxMixbc3BdLCM0CQlAIHBvcCBvdXQKKyNpZiBfX0FSTV9BUkNIX18+PTcKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjAscjAKKwlyZXYJcjEscjEKKwlyZXYJcjIscjIKKwlyZXYJcjMscjMKKyNlbmRpZgorCXN0cglyMCxbcjEyLCMwXQorCXN0cglyMSxbcjEyLCM0XQorCXN0cglyMixbcjEyLCM4XQorCXN0cglyMyxbcjEyLCMxMl0KKyNlbHNlCisJbW92CXI0LHIwLGxzciMyNAkJQCB3cml0ZSBvdXRwdXQgaW4gZW5kaWFuLW5ldXRyYWwKKwltb3YJcjUscjAsbHNyIzE2CQlAIG1hbm5lci4uLgorCW1vdglyNixyMCxsc3IjOAorCXN0cmIJcjQsW3IxMiwjMF0KKwlzdHJiCXI1LFtyMTIsIzFdCisJbW92CXI0LHIxLGxzciMyNAorCXN0cmIJcjYsW3IxMiwjMl0KKwltb3YJcjUscjEsbHNyIzE2CisJc3RyYglyMCxbcjEyLCMzXQorCW1vdglyNixyMSxsc3IjOAorCXN0cmIJcjQsW3IxMiwjNF0KKwlzdHJiCXI1LFtyMTIsIzVdCisJbW92CXI0LHIyLGxzciMyNAorCXN0cmIJcjYsW3IxMiwjNl0KKwltb3YJcjUscjIsbHNyIzE2CisJc3RyYglyMSxbcjEyLCM3XQorCW1vdglyNixyMixsc3IjOAorCXN0cmIJcjQsW3IxMiwjOF0KKwlzdHJiCXI1LFtyMTIsIzldCisJbW92CXI0LHIzLGxzciMyNAorCXN0cmIJcjYsW3IxMiwjMTBdCisJbW92CXI1LHIzLGxzciMxNgorCXN0cmIJcjIsW3IxMiwjMTFdCisJbW92CXI2LHIzLGxzciM4CisJc3RyYglyNCxbcjEyLCMxMl0KKwlzdHJiCXI1LFtyMTIsIzEzXQorCXN0cmIJcjYsW3IxMiwjMTRdCisJc3RyYglyMyxbcjEyLCMxNV0KKyNlbmRpZgorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIscGN9CisjZWxzZQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisKKworI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9hcm12NF9BRVNfZGVjcnlwdAorI2VuZGlmCisuYWxpZ24JMgorX2FybXY0X0FFU19kZWNyeXB0OgorCXN0cglscixbc3AsIy00XSEJCUAgcHVzaCBscgorCWxkbWlhCXIxMSEse3I0LHI1LHI2LHI3fQorCWVvcglyMCxyMCxyNAorCWxkcglyMTIsW3IxMSwjMjQwLTE2XQorCWVvcglyMSxyMSxyNQorCWVvcglyMixyMixyNgorCWVvcglyMyxyMyxyNworCXN1YglyMTIscjEyLCMxCisJbW92CWxyLCMyNTUKKworCWFuZAlyNyxscixyMCxsc3IjMTYKKwlhbmQJcjgsbHIscjAsbHNyIzgKKwlhbmQJcjksbHIscjAKKwltb3YJcjAscjAsbHNyIzI0CitMZGVjX2xvb3A6CisJbGRyCXI0LFtyMTAscjcsbHNsIzJdCUAgVGQxW3MwPj4xNl0KKwlhbmQJcjcsbHIscjEJCUAgaTAKKwlsZHIJcjUsW3IxMCxyOCxsc2wjMl0JQCBUZDJbczA+PjhdCisJYW5kCXI4LGxyLHIxLGxzciMxNgorCWxkcglyNixbcjEwLHI5LGxzbCMyXQlAIFRkM1tzMD4+MF0KKwlhbmQJcjksbHIscjEsbHNyIzgKKwlsZHIJcjAsW3IxMCxyMCxsc2wjMl0JQCBUZDBbczA+PjI0XQorCW1vdglyMSxyMSxsc3IjMjQKKworCWxkcglyNyxbcjEwLHI3LGxzbCMyXQlAIFRkM1tzMT4+MF0KKwlsZHIJcjgsW3IxMCxyOCxsc2wjMl0JQCBUZDFbczE+PjE2XQorCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRkMltzMT4+OF0KKwllb3IJcjAscjAscjcscm9yIzI0CisJbGRyCXIxLFtyMTAscjEsbHNsIzJdCUAgVGQwW3MxPj4yNF0KKwlhbmQJcjcsbHIscjIsbHNyIzgJQCBpMAorCWVvcglyNSxyOCxyNSxyb3IjOAorCWFuZAlyOCxscixyMgkJQCBpMQorCWVvcglyNixyOSxyNixyb3IjOAorCWFuZAlyOSxscixyMixsc3IjMTYKKwlsZHIJcjcsW3IxMCxyNyxsc2wjMl0JQCBUZDJbczI+PjhdCisJZW9yCXIxLHIxLHI0LHJvciM4CisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGQzW3MyPj4wXQorCW1vdglyMixyMixsc3IjMjQKKworCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRkMVtzMj4+MTZdCisJZW9yCXIwLHIwLHI3LHJvciMxNgorCWxkcglyMixbcjEwLHIyLGxzbCMyXQlAIFRkMFtzMj4+MjRdCisJYW5kCXI3LGxyLHIzLGxzciMxNglAIGkwCisJZW9yCXIxLHIxLHI4LHJvciMyNAorCWFuZAlyOCxscixyMyxsc3IjOAlAIGkxCisJZW9yCXI2LHI5LHI2LHJvciM4CisJYW5kCXI5LGxyLHIzCQlAIGkyCisJbGRyCXI3LFtyMTAscjcsbHNsIzJdCUAgVGQxW3MzPj4xNl0KKwllb3IJcjIscjIscjUscm9yIzgKKwlsZHIJcjgsW3IxMCxyOCxsc2wjMl0JQCBUZDJbczM+PjhdCisJbW92CXIzLHIzLGxzciMyNAorCisJbGRyCXI5LFtyMTAscjksbHNsIzJdCUAgVGQzW3MzPj4wXQorCWVvcglyMCxyMCxyNyxyb3IjOAorCWxkcglyNyxbcjExXSwjMTYKKwllb3IJcjEscjEscjgscm9yIzE2CisJbGRyCXIzLFtyMTAscjMsbHNsIzJdCUAgVGQwW3MzPj4yNF0KKwllb3IJcjIscjIscjkscm9yIzI0CisKKwlsZHIJcjQsW3IxMSwjLTEyXQorCWVvcglyMCxyMCxyNworCWxkcglyNSxbcjExLCMtOF0KKwllb3IJcjMscjMscjYscm9yIzgKKwlsZHIJcjYsW3IxMSwjLTRdCisJYW5kCXI3LGxyLHIwLGxzciMxNgorCWVvcglyMSxyMSxyNAorCWFuZAlyOCxscixyMCxsc3IjOAorCWVvcglyMixyMixyNQorCWFuZAlyOSxscixyMAorCWVvcglyMyxyMyxyNgorCW1vdglyMCxyMCxsc3IjMjQKKworCXN1YnMJcjEyLHIxMiwjMQorCWJuZQlMZGVjX2xvb3AKKworCWFkZAlyMTAscjEwLCMxMDI0CisKKwlsZHIJcjUsW3IxMCwjMF0JCUAgcHJlZmV0Y2ggVGQ0CisJbGRyCXI2LFtyMTAsIzMyXQorCWxkcglyNCxbcjEwLCM2NF0KKwlsZHIJcjUsW3IxMCwjOTZdCisJbGRyCXI2LFtyMTAsIzEyOF0KKwlsZHIJcjQsW3IxMCwjMTYwXQorCWxkcglyNSxbcjEwLCMxOTJdCisJbGRyCXI2LFtyMTAsIzIyNF0KKworCWxkcmIJcjAsW3IxMCxyMF0JCUAgVGQ0W3MwPj4yNF0KKwlsZHJiCXI0LFtyMTAscjddCQlAIFRkNFtzMD4+MTZdCisJYW5kCXI3LGxyLHIxCQlAIGkwCisJbGRyYglyNSxbcjEwLHI4XQkJQCBUZDRbczA+PjhdCisJYW5kCXI4LGxyLHIxLGxzciMxNgorCWxkcmIJcjYsW3IxMCxyOV0JCUAgVGQ0W3MwPj4wXQorCWFuZAlyOSxscixyMSxsc3IjOAorCisJYWRkCXIxLHIxMCxyMSxsc3IjMjQKKwlsZHJiCXI3LFtyMTAscjddCQlAIFRkNFtzMT4+MF0KKwlsZHJiCXIxLFtyMV0JCUAgVGQ0W3MxPj4yNF0KKwlsZHJiCXI4LFtyMTAscjhdCQlAIFRkNFtzMT4+MTZdCisJZW9yCXIwLHI3LHIwLGxzbCMyNAorCWxkcmIJcjksW3IxMCxyOV0JCUAgVGQ0W3MxPj44XQorCWVvcglyMSxyNCxyMSxsc2wjOAorCWFuZAlyNyxscixyMixsc3IjOAlAIGkwCisJZW9yCXI1LHI1LHI4LGxzbCM4CisJYW5kCXI4LGxyLHIyCQlAIGkxCisJbGRyYglyNyxbcjEwLHI3XQkJQCBUZDRbczI+PjhdCisJZW9yCXI2LHI2LHI5LGxzbCM4CisJbGRyYglyOCxbcjEwLHI4XQkJQCBUZDRbczI+PjBdCisJYW5kCXI5LGxyLHIyLGxzciMxNgorCisJYWRkCXIyLHIxMCxyMixsc3IjMjQKKwlsZHJiCXIyLFtyMl0JCUAgVGQ0W3MyPj4yNF0KKwllb3IJcjAscjAscjcsbHNsIzgKKwlsZHJiCXI5LFtyMTAscjldCQlAIFRkNFtzMj4+MTZdCisJZW9yCXIxLHI4LHIxLGxzbCMxNgorCWFuZAlyNyxscixyMyxsc3IjMTYJQCBpMAorCWVvcglyMixyNSxyMixsc2wjMTYKKwlhbmQJcjgsbHIscjMsbHNyIzgJQCBpMQorCWxkcmIJcjcsW3IxMCxyN10JCUAgVGQ0W3MzPj4xNl0KKwllb3IJcjYscjYscjksbHNsIzE2CisJbGRyYglyOCxbcjEwLHI4XQkJQCBUZDRbczM+PjhdCisJYW5kCXI5LGxyLHIzCQlAIGkyCisKKwlhZGQJcjMscjEwLHIzLGxzciMyNAorCWxkcmIJcjksW3IxMCxyOV0JCUAgVGQ0W3MzPj4wXQorCWxkcmIJcjMsW3IzXQkJQCBUZDRbczM+PjI0XQorCWVvcglyMCxyMCxyNyxsc2wjMTYKKwlsZHIJcjcsW3IxMSwjMF0KKwllb3IJcjEscjEscjgsbHNsIzgKKwlsZHIJcjQsW3IxMSwjNF0KKwllb3IJcjIscjkscjIsbHNsIzgKKwlsZHIJcjUsW3IxMSwjOF0KKwllb3IJcjMscjYscjMsbHNsIzI0CisJbGRyCXI2LFtyMTEsIzEyXQorCisJZW9yCXIwLHIwLHI3CisJZW9yCXIxLHIxLHI0CisJZW9yCXIyLHIyLHI1CisJZW9yCXIzLHIzLHI2CisKKwlzdWIJcjEwLHIxMCwjMTAyNAorCWxkcglwYyxbc3BdLCM0CQlAIHBvcCBhbmQgcmV0dXJuCisKKy5ieXRlCTY1LDY5LDgzLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Miw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9hZXN2OC1hcm14MzIuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9hZXN2OC1hcm14MzIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDRjODhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flc3Y4LWFybXgzMi5TCkBAIC0wLDAgKzEsNzczIEBACisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLnRleHQKKworCisuY29kZQkzMgorI3VuZGVmCV9fdGh1bWIyX18KKy5hbGlnbgk1CitMcmNvbjoKKy5sb25nCTB4MDEsMHgwMSwweDAxLDB4MDEKKy5sb25nCTB4MGMwZjBlMGQsMHgwYzBmMGUwZCwweDBjMGYwZTBkLDB4MGMwZjBlMGQJQCByb3RhdGUtbi1zcGxhdAorLmxvbmcJMHgxYiwweDFiLDB4MWIsMHgxYgorCisuZ2xvYmwJX2Flc19od19zZXRfZW5jcnlwdF9rZXkKKy5wcml2YXRlX2V4dGVybglfYWVzX2h3X3NldF9lbmNyeXB0X2tleQorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9hZXNfaHdfc2V0X2VuY3J5cHRfa2V5CisjZW5kaWYKKy5hbGlnbgk1CitfYWVzX2h3X3NldF9lbmNyeXB0X2tleToKK0xlbmNfa2V5OgorCW1vdglyMywjLTEKKwljbXAJcjAsIzAKKwliZXEJTGVuY19rZXlfYWJvcnQKKwljbXAJcjIsIzAKKwliZXEJTGVuY19rZXlfYWJvcnQKKwltb3YJcjMsIy0yCisJY21wCXIxLCMxMjgKKwlibHQJTGVuY19rZXlfYWJvcnQKKwljbXAJcjEsIzI1NgorCWJndAlMZW5jX2tleV9hYm9ydAorCXRzdAlyMSwjMHgzZgorCWJuZQlMZW5jX2tleV9hYm9ydAorCisJYWRyCXIzLExyY29uCisJY21wCXIxLCMxOTIKKworCXZlb3IJcTAscTAscTAKKwl2bGQxLjgJe3EzfSxbcjBdIQorCW1vdglyMSwjOAkJQCByZXVzZSByMQorCXZsZDEuMzIJe3ExLHEyfSxbcjNdIQorCisJYmx0CUxvb3AxMjgKKwliZXEJTDE5MgorCWIJTDI1NgorCisuYWxpZ24JNAorTG9vcDEyODoKKwl2dGJsLjgJZDIwLHtxM30sZDQKKwl2dGJsLjgJZDIxLHtxM30sZDUKKwl2ZXh0LjgJcTkscTAscTMsIzEyCisJdnN0MS4zMgl7cTN9LFtyMl0hCisuYnl0ZQkweDAwLDB4NDMsMHhmMCwweGYzCUAgYWVzZSBxMTAscTAKKwlzdWJzCXIxLHIxLCMxCisKKwl2ZW9yCXEzLHEzLHE5CisJdmV4dC44CXE5LHEwLHE5LCMxMgorCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMTAscTEwLHExCisJdmVvcglxMyxxMyxxOQorCXZzaGwudTgJcTEscTEsIzEKKwl2ZW9yCXEzLHEzLHExMAorCWJuZQlMb29wMTI4CisKKwl2bGQxLjMyCXtxMX0sW3IzXQorCisJdnRibC44CWQyMCx7cTN9LGQ0CisJdnRibC44CWQyMSx7cTN9LGQ1CisJdmV4dC44CXE5LHEwLHEzLCMxMgorCXZzdDEuMzIJe3EzfSxbcjJdIQorLmJ5dGUJMHgwMCwweDQzLDB4ZjAsMHhmMwlAIGFlc2UgcTEwLHEwCisKKwl2ZW9yCXEzLHEzLHE5CisJdmV4dC44CXE5LHEwLHE5LCMxMgorCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMTAscTEwLHExCisJdmVvcglxMyxxMyxxOQorCXZzaGwudTgJcTEscTEsIzEKKwl2ZW9yCXEzLHEzLHExMAorCisJdnRibC44CWQyMCx7cTN9LGQ0CisJdnRibC44CWQyMSx7cTN9LGQ1CisJdmV4dC44CXE5LHEwLHEzLCMxMgorCXZzdDEuMzIJe3EzfSxbcjJdIQorLmJ5dGUJMHgwMCwweDQzLDB4ZjAsMHhmMwlAIGFlc2UgcTEwLHEwCisKKwl2ZW9yCXEzLHEzLHE5CisJdmV4dC44CXE5LHEwLHE5LCMxMgorCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMTAscTEwLHExCisJdmVvcglxMyxxMyxxOQorCXZlb3IJcTMscTMscTEwCisJdnN0MS4zMgl7cTN9LFtyMl0KKwlhZGQJcjIscjIsIzB4NTAKKworCW1vdglyMTIsIzEwCisJYglMZG9uZQorCisuYWxpZ24JNAorTDE5MjoKKwl2bGQxLjgJe2QxNn0sW3IwXSEKKwl2bW92Lmk4CXExMCwjOAkJCUAgYm9ycm93IHExMAorCXZzdDEuMzIJe3EzfSxbcjJdIQorCXZzdWIuaTgJcTIscTIscTEwCUAgYWRqdXN0IHRoZSBtYXNrCisKK0xvb3AxOTI6CisJdnRibC44CWQyMCx7cTh9LGQ0CisJdnRibC44CWQyMSx7cTh9LGQ1CisJdmV4dC44CXE5LHEwLHEzLCMxMgorCXZzdDEuMzIJe2QxNn0sW3IyXSEKKy5ieXRlCTB4MDAsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxMAorCXN1YnMJcjEscjEsIzEKKworCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMyxxMyxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXEzLHEzLHE5CisKKwl2ZHVwLjMyCXE5LGQ3WzFdCisJdmVvcglxOSxxOSxxOAorCXZlb3IJcTEwLHExMCxxMQorCXZleHQuOAlxOCxxMCxxOCwjMTIKKwl2c2hsLnU4CXExLHExLCMxCisJdmVvcglxOCxxOCxxOQorCXZlb3IJcTMscTMscTEwCisJdmVvcglxOCxxOCxxMTAKKwl2c3QxLjMyCXtxM30sW3IyXSEKKwlibmUJTG9vcDE5MgorCisJbW92CXIxMiwjMTIKKwlhZGQJcjIscjIsIzB4MjAKKwliCUxkb25lCisKKy5hbGlnbgk0CitMMjU2OgorCXZsZDEuOAl7cTh9LFtyMF0KKwltb3YJcjEsIzcKKwltb3YJcjEyLCMxNAorCXZzdDEuMzIJe3EzfSxbcjJdIQorCitMb29wMjU2OgorCXZ0YmwuOAlkMjAse3E4fSxkNAorCXZ0YmwuOAlkMjEse3E4fSxkNQorCXZleHQuOAlxOSxxMCxxMywjMTIKKwl2c3QxLjMyCXtxOH0sW3IyXSEKKy5ieXRlCTB4MDAsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxMAorCXN1YnMJcjEscjEsIzEKKworCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMyxxMyxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXExMCxxMTAscTEKKwl2ZW9yCXEzLHEzLHE5CisJdnNobC51OAlxMSxxMSwjMQorCXZlb3IJcTMscTMscTEwCisJdnN0MS4zMgl7cTN9LFtyMl0hCisJYmVxCUxkb25lCisKKwl2ZHVwLjMyCXExMCxkN1sxXQorCXZleHQuOAlxOSxxMCxxOCwjMTIKKy5ieXRlCTB4MDAsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxMAorCisJdmVvcglxOCxxOCxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXE4LHE4LHE5CisJdmV4dC44CXE5LHEwLHE5LCMxMgorCXZlb3IJcTgscTgscTkKKworCXZlb3IJcTgscTgscTEwCisJYglMb29wMjU2CisKK0xkb25lOgorCXN0cglyMTIsW3IyXQorCW1vdglyMywjMAorCitMZW5jX2tleV9hYm9ydDoKKwltb3YJcjAscjMJCQlAIHJldHVybiB2YWx1ZQorCisJYngJbHIKKworCisuZ2xvYmwJX2Flc19od19zZXRfZGVjcnlwdF9rZXkKKy5wcml2YXRlX2V4dGVybglfYWVzX2h3X3NldF9kZWNyeXB0X2tleQorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9hZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisjZW5kaWYKKy5hbGlnbgk1CitfYWVzX2h3X3NldF9kZWNyeXB0X2tleToKKwlzdG1kYglzcCEse3I0LGxyfQorCWJsCUxlbmNfa2V5CisKKwljbXAJcjAsIzAKKwlibmUJTGRlY19rZXlfYWJvcnQKKworCXN1YglyMixyMiwjMjQwCQlAIHJlc3RvcmUgb3JpZ2luYWwgcjIKKwltb3YJcjQsIy0xNgorCWFkZAlyMCxyMixyMTIsbHNsIzQJQCBlbmQgb2Yga2V5IHNjaGVkdWxlCisKKwl2bGQxLjMyCXtxMH0sW3IyXQorCXZsZDEuMzIJe3ExfSxbcjBdCisJdnN0MS4zMgl7cTB9LFtyMF0scjQKKwl2c3QxLjMyCXtxMX0sW3IyXSEKKworTG9vcF9pbWM6CisJdmxkMS4zMgl7cTB9LFtyMl0KKwl2bGQxLjMyCXtxMX0sW3IwXQorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorCXZzdDEuMzIJe3EwfSxbcjBdLHI0CisJdnN0MS4zMgl7cTF9LFtyMl0hCisJY21wCXIwLHIyCisJYmhpCUxvb3BfaW1jCisKKwl2bGQxLjMyCXtxMH0sW3IyXQorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorCXZzdDEuMzIJe3EwfSxbcjBdCisKKwllb3IJcjAscjAscjAJCUAgcmV0dXJuIHZhbHVlCitMZGVjX2tleV9hYm9ydDoKKwlsZG1pYQlzcCEse3I0LHBjfQorCisuZ2xvYmwJX2Flc19od19lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2Flc19od19lbmNyeXB0CisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2Flc19od19lbmNyeXB0CisjZW5kaWYKKy5hbGlnbgk1CitfYWVzX2h3X2VuY3J5cHQ6CisJbGRyCXIzLFtyMiwjMjQwXQorCXZsZDEuMzIJe3EwfSxbcjJdIQorCXZsZDEuOAl7cTJ9LFtyMF0KKwlzdWIJcjMscjMsIzIKKwl2bGQxLjMyCXtxMX0sW3IyXSEKKworTG9vcF9lbmM6CisuYnl0ZQkweDAwLDB4NDMsMHhiMCwweGYzCUAgYWVzZSBxMixxMAorLmJ5dGUJMHg4NCwweDQzLDB4YjAsMHhmMwlAIGFlc21jIHEyLHEyCisJdmxkMS4zMgl7cTB9LFtyMl0hCisJc3VicwlyMyxyMywjMgorLmJ5dGUJMHgwMiwweDQzLDB4YjAsMHhmMwlAIGFlc2UgcTIscTEKKy5ieXRlCTB4ODQsMHg0MywweGIwLDB4ZjMJQCBhZXNtYyBxMixxMgorCXZsZDEuMzIJe3ExfSxbcjJdIQorCWJndAlMb29wX2VuYworCisuYnl0ZQkweDAwLDB4NDMsMHhiMCwweGYzCUAgYWVzZSBxMixxMAorLmJ5dGUJMHg4NCwweDQzLDB4YjAsMHhmMwlAIGFlc21jIHEyLHEyCisJdmxkMS4zMgl7cTB9LFtyMl0KKy5ieXRlCTB4MDIsMHg0MywweGIwLDB4ZjMJQCBhZXNlIHEyLHExCisJdmVvcglxMixxMixxMAorCisJdnN0MS44CXtxMn0sW3IxXQorCWJ4CWxyCisKKy5nbG9ibAlfYWVzX2h3X2RlY3J5cHQKKy5wcml2YXRlX2V4dGVybglfYWVzX2h3X2RlY3J5cHQKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfYWVzX2h3X2RlY3J5cHQKKyNlbmRpZgorLmFsaWduCTUKK19hZXNfaHdfZGVjcnlwdDoKKwlsZHIJcjMsW3IyLCMyNDBdCisJdmxkMS4zMgl7cTB9LFtyMl0hCisJdmxkMS44CXtxMn0sW3IwXQorCXN1YglyMyxyMywjMgorCXZsZDEuMzIJe3ExfSxbcjJdIQorCitMb29wX2RlYzoKKy5ieXRlCTB4NDAsMHg0MywweGIwLDB4ZjMJQCBhZXNkIHEyLHEwCisuYnl0ZQkweGM0LDB4NDMsMHhiMCwweGYzCUAgYWVzaW1jIHEyLHEyCisJdmxkMS4zMgl7cTB9LFtyMl0hCisJc3VicwlyMyxyMywjMgorLmJ5dGUJMHg0MiwweDQzLDB4YjAsMHhmMwlAIGFlc2QgcTIscTEKKy5ieXRlCTB4YzQsMHg0MywweGIwLDB4ZjMJQCBhZXNpbWMgcTIscTIKKwl2bGQxLjMyCXtxMX0sW3IyXSEKKwliZ3QJTG9vcF9kZWMKKworLmJ5dGUJMHg0MCwweDQzLDB4YjAsMHhmMwlAIGFlc2QgcTIscTAKKy5ieXRlCTB4YzQsMHg0MywweGIwLDB4ZjMJQCBhZXNpbWMgcTIscTIKKwl2bGQxLjMyCXtxMH0sW3IyXQorLmJ5dGUJMHg0MiwweDQzLDB4YjAsMHhmMwlAIGFlc2QgcTIscTEKKwl2ZW9yCXEyLHEyLHEwCisKKwl2c3QxLjgJe3EyfSxbcjFdCisJYngJbHIKKworLmdsb2JsCV9hZXNfaHdfY2JjX2VuY3J5cHQKKy5wcml2YXRlX2V4dGVybglfYWVzX2h3X2NiY19lbmNyeXB0CisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2Flc19od19jYmNfZW5jcnlwdAorI2VuZGlmCisuYWxpZ24JNQorX2Flc19od19jYmNfZW5jcnlwdDoKKwltb3YJaXAsc3AKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LGxyfQorCXZzdG1kYglzcCEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fSAgICAgICAgICAgIEAgQUJJIHNwZWNpZmljYXRpb24gc2F5cyBzbworCWxkbWlhCWlwLHtyNCxyNX0JCUAgbG9hZCByZW1haW5pbmcgYXJncworCXN1YnMJcjIscjIsIzE2CisJbW92CXI4LCMxNgorCWJsbwlMY2JjX2Fib3J0CisJbW92ZXEJcjgsIzAKKworCWNtcAlyNSwjMAkJCUAgZW4tIG9yIGRlY3J5cHRpbmc/CisJbGRyCXI1LFtyMywjMjQwXQorCWFuZAlyMixyMiwjLTE2CisJdmxkMS44CXtxNn0sW3I0XQorCXZsZDEuOAl7cTB9LFtyMF0scjgKKworCXZsZDEuMzIJe3E4LHE5fSxbcjNdCQlAIGxvYWQga2V5IHNjaGVkdWxlLi4uCisJc3ViCXI1LHI1LCM2CisJYWRkCXI3LHIzLHI1LGxzbCM0CUAgcG9pbnRlciB0byBsYXN0IDcgcm91bmQga2V5cworCXN1YglyNSxyNSwjMgorCXZsZDEuMzIJe3ExMCxxMTF9LFtyN10hCisJdmxkMS4zMgl7cTEyLHExM30sW3I3XSEKKwl2bGQxLjMyCXtxMTQscTE1fSxbcjddIQorCXZsZDEuMzIJe3E3fSxbcjddCisKKwlhZGQJcjcscjMsIzMyCisJbW92CXI2LHI1CisJYmVxCUxjYmNfZGVjCisKKwljbXAJcjUsIzIKKwl2ZW9yCXEwLHEwLHE2CisJdmVvcglxNSxxOCxxNworCWJlcQlMY2JjX2VuYzEyOAorCisJdmxkMS4zMgl7cTIscTN9LFtyN10KKwlhZGQJcjcscjMsIzE2CisJYWRkCXI2LHIzLCMxNio0CisJYWRkCXIxMixyMywjMTYqNQorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCWFkZAlyMTQscjMsIzE2KjYKKwlhZGQJcjMscjMsIzE2KjcKKwliCUxlbnRlcl9jYmNfZW5jCisKKy5hbGlnbgk0CitMb29wX2NiY19lbmM6CisuYnl0ZQkweDIwLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxOAorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJdnN0MS44CXtxNn0sW3IxXSEKK0xlbnRlcl9jYmNfZW5jOgorLmJ5dGUJMHgyMiwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTkKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgwNCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTIKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCXZsZDEuMzIJe3E4fSxbcjZdCisJY21wCXI1LCM0CisuYnl0ZQkweDA2LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMworLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJdmxkMS4zMgl7cTl9LFtyMTJdCisJYmVxCUxjYmNfZW5jMTkyCisKKy5ieXRlCTB4MjAsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE4CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2bGQxLjMyCXtxOH0sW3IxNF0KKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2bGQxLjMyCXtxOX0sW3IzXQorCW5vcAorCitMY2JjX2VuYzE5MjoKKy5ieXRlCTB4MjAsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE4CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwlzdWJzCXIyLHIyLCMxNgorLmJ5dGUJMHgyMiwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTkKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCW1vdmVxCXI4LCMwCisuYnl0ZQkweDI0LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTAKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyNiwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTExCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2bGQxLjgJe3E4fSxbcjBdLHI4CisuYnl0ZQkweDI4LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTIKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCXZlb3IJcTgscTgscTUKKy5ieXRlCTB4MmEsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHExMworLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJdmxkMS4zMgl7cTl9LFtyN10JCUAgcmUtcHJlLWxvYWQgcm5ka2V5WzFdCisuYnl0ZQkweDJjLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTQKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyZSwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTE1CisJdmVvcglxNixxMCxxNworCWJocwlMb29wX2NiY19lbmMKKworCXZzdDEuOAl7cTZ9LFtyMV0hCisJYglMY2JjX2RvbmUKKworLmFsaWduCTUKK0xjYmNfZW5jMTI4OgorCXZsZDEuMzIJe3EyLHEzfSxbcjddCisuYnl0ZQkweDIwLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxOAorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJYglMZW50ZXJfY2JjX2VuYzEyOAorTG9vcF9jYmNfZW5jMTI4OgorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCXZzdDEuOAl7cTZ9LFtyMV0hCitMZW50ZXJfY2JjX2VuYzEyODoKKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwlzdWJzCXIyLHIyLCMxNgorLmJ5dGUJMHgwNCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTIKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCW1vdmVxCXI4LCMwCisuYnl0ZQkweDA2LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMworLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisuYnl0ZQkweDI0LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTAKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyNiwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTExCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2bGQxLjgJe3E4fSxbcjBdLHI4CisuYnl0ZQkweDI4LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTIKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyYSwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTEzCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MmMsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHExNAorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJdmVvcglxOCxxOCxxNQorLmJ5dGUJMHgyZSwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTE1CisJdmVvcglxNixxMCxxNworCWJocwlMb29wX2NiY19lbmMxMjgKKworCXZzdDEuOAl7cTZ9LFtyMV0hCisJYglMY2JjX2RvbmUKKy5hbGlnbgk1CitMY2JjX2RlYzoKKwl2bGQxLjgJe3ExMH0sW3IwXSEKKwlzdWJzCXIyLHIyLCMzMgkJQCBiaWFzCisJYWRkCXI2LHI1LCMyCisJdm9ycglxMyxxMCxxMAorCXZvcnIJcTEscTAscTAKKwl2b3JyCXExMSxxMTAscTEwCisJYmxvCUxjYmNfZGVjX3RhaWwKKworCXZvcnIJcTEscTEwLHExMAorCXZsZDEuOAl7cTEwfSxbcjBdIQorCXZvcnIJcTIscTAscTAKKwl2b3JyCXEzLHExLHExCisJdm9ycglxMTEscTEwLHExMAorCitMb29wM3hfY2JjX2RlYzoKKy5ieXRlCTB4NjAsMHgwMywweGIwLDB4ZjMJQCBhZXNkIHEwLHE4CisuYnl0ZQkweGMwLDB4MDMsMHhiMCwweGYzCUAgYWVzaW1jIHEwLHEwCisuYnl0ZQkweDYwLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxOAorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2MCwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHE4CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2bGQxLjMyCXtxOH0sW3I3XSEKKwlzdWJzCXI2LHI2LCMyCisuYnl0ZQkweDYyLDB4MDMsMHhiMCwweGYzCUAgYWVzZCBxMCxxOQorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorLmJ5dGUJMHg2MiwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTkKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjIsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxOQorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmxkMS4zMgl7cTl9LFtyN10hCisJYmd0CUxvb3AzeF9jYmNfZGVjCisKKy5ieXRlCTB4NjAsMHgwMywweGIwLDB4ZjMJQCBhZXNkIHEwLHE4CisuYnl0ZQkweGMwLDB4MDMsMHhiMCwweGYzCUAgYWVzaW1jIHEwLHEwCisuYnl0ZQkweDYwLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxOAorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2MCwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHE4CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2ZW9yCXE0LHE2LHE3CisJc3VicwlyMixyMiwjMHgzMAorCXZlb3IJcTUscTIscTcKKwltb3ZsbwlyNixyMgkJCUAgcjYsIHI2LCBpcyB6ZXJvIGF0IHRoaXMgcG9pbnQKKy5ieXRlCTB4NjIsMHgwMywweGIwLDB4ZjMJQCBhZXNkIHEwLHE5CisuYnl0ZQkweGMwLDB4MDMsMHhiMCwweGYzCUAgYWVzaW1jIHEwLHEwCisuYnl0ZQkweDYyLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxOQorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2MiwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHE5CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2ZW9yCXE5LHEzLHE3CisJYWRkCXIwLHIwLHI2CQlAIHIwIGlzIGFkanVzdGVkIGluIHN1Y2ggd2F5IHRoYXQKKwkJCQkJQCBhdCBleGl0IGZyb20gdGhlIGxvb3AgcTEtcTEwCisJCQkJCUAgYXJlIGxvYWRlZCB3aXRoIGxhc3QgIndvcmRzIgorCXZvcnIJcTYscTExLHExMQorCW1vdglyNyxyMworLmJ5dGUJMHg2OCwweDAzLDB4YjAsMHhmMwlAIGFlc2QgcTAscTEyCisuYnl0ZQkweGMwLDB4MDMsMHhiMCwweGYzCUAgYWVzaW1jIHEwLHEwCisuYnl0ZQkweDY4LDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxMTIKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjgsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxMTIKKy5ieXRlCTB4ZTQsMHg0MywweGYwLDB4ZjMJQCBhZXNpbWMgcTEwLHExMAorCXZsZDEuOAl7cTJ9LFtyMF0hCisuYnl0ZQkweDZhLDB4MDMsMHhiMCwweGYzCUAgYWVzZCBxMCxxMTMKKy5ieXRlCTB4YzAsMHgwMywweGIwLDB4ZjMJQCBhZXNpbWMgcTAscTAKKy5ieXRlCTB4NmEsMHgyMywweGIwLDB4ZjMJQCBhZXNkIHExLHExMworLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2YSwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHExMworLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmxkMS44CXtxM30sW3IwXSEKKy5ieXRlCTB4NmMsMHgwMywweGIwLDB4ZjMJQCBhZXNkIHEwLHExNAorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorLmJ5dGUJMHg2YywweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTE0CisuYnl0ZQkweGMyLDB4MjMsMHhiMCwweGYzCUAgYWVzaW1jIHExLHExCisuYnl0ZQkweDZjLDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTE0CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2bGQxLjgJe3ExMX0sW3IwXSEKKy5ieXRlCTB4NmUsMHgwMywweGIwLDB4ZjMJQCBhZXNkIHEwLHExNQorLmJ5dGUJMHg2ZSwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTE1CisuYnl0ZQkweDZlLDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTE1CisJdmxkMS4zMgl7cTh9LFtyN10hCUAgcmUtcHJlLWxvYWQgcm5ka2V5WzBdCisJYWRkCXI2LHI1LCMyCisJdmVvcglxNCxxNCxxMAorCXZlb3IJcTUscTUscTEKKwl2ZW9yCXExMCxxMTAscTkKKwl2bGQxLjMyCXtxOX0sW3I3XSEJQCByZS1wcmUtbG9hZCBybmRrZXlbMV0KKwl2c3QxLjgJe3E0fSxbcjFdIQorCXZvcnIJcTAscTIscTIKKwl2c3QxLjgJe3E1fSxbcjFdIQorCXZvcnIJcTEscTMscTMKKwl2c3QxLjgJe3ExMH0sW3IxXSEKKwl2b3JyCXExMCxxMTEscTExCisJYmhzCUxvb3AzeF9jYmNfZGVjCisKKwljbW4JcjIsIzB4MzAKKwliZXEJTGNiY19kb25lCisJbm9wCisKK0xjYmNfZGVjX3RhaWw6CisuYnl0ZQkweDYwLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxOAorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2MCwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHE4CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2bGQxLjMyCXtxOH0sW3I3XSEKKwlzdWJzCXI2LHI2LCMyCisuYnl0ZQkweDYyLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxOQorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2MiwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHE5CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2bGQxLjMyCXtxOX0sW3I3XSEKKwliZ3QJTGNiY19kZWNfdGFpbAorCisuYnl0ZQkweDYwLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxOAorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2MCwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHE4CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKy5ieXRlCTB4NjIsMHgyMywweGIwLDB4ZjMJQCBhZXNkIHExLHE5CisuYnl0ZQkweGMyLDB4MjMsMHhiMCwweGYzCUAgYWVzaW1jIHExLHExCisuYnl0ZQkweDYyLDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTkKKy5ieXRlCTB4ZTQsMHg0MywweGYwLDB4ZjMJQCBhZXNpbWMgcTEwLHExMAorLmJ5dGUJMHg2OCwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTEyCisuYnl0ZQkweGMyLDB4MjMsMHhiMCwweGYzCUAgYWVzaW1jIHExLHExCisuYnl0ZQkweDY4LDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTEyCisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwljbW4JcjIsIzB4MjAKKy5ieXRlCTB4NmEsMHgyMywweGIwLDB4ZjMJQCBhZXNkIHExLHExMworLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2YSwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHExMworLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmVvcglxNSxxNixxNworLmJ5dGUJMHg2YywweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTE0CisuYnl0ZQkweGMyLDB4MjMsMHhiMCwweGYzCUAgYWVzaW1jIHExLHExCisuYnl0ZQkweDZjLDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTE0CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2ZW9yCXE5LHEzLHE3CisuYnl0ZQkweDZlLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxMTUKKy5ieXRlCTB4NmUsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxMTUKKwliZXEJTGNiY19kZWNfb25lCisJdmVvcglxNSxxNSxxMQorCXZlb3IJcTkscTkscTEwCisJdm9ycglxNixxMTEscTExCisJdnN0MS44CXtxNX0sW3IxXSEKKwl2c3QxLjgJe3E5fSxbcjFdIQorCWIJTGNiY19kb25lCisKK0xjYmNfZGVjX29uZToKKwl2ZW9yCXE1LHE1LHExMAorCXZvcnIJcTYscTExLHExMQorCXZzdDEuOAl7cTV9LFtyMV0hCisKK0xjYmNfZG9uZToKKwl2c3QxLjgJe3E2fSxbcjRdCitMY2JjX2Fib3J0OgorCXZsZG1pYQlzcCEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscGN9CisKKy5nbG9ibAlfYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzCisucHJpdmF0ZV9leHRlcm4JX2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcworI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKyNlbmRpZgorLmFsaWduCTUKK19hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisJbW92CWlwLHNwCisJc3RtZGIJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAsbHJ9CisJdnN0bWRiCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9ICAgICAgICAgICAgQCBBQkkgc3BlY2lmaWNhdGlvbiBzYXlzIHNvCisJbGRyCXI0LCBbaXBdCQlAIGxvYWQgcmVtYWluaW5nIGFyZworCWxkcglyNSxbcjMsIzI0MF0KKworCWxkcglyOCwgW3I0LCAjMTJdCisJdmxkMS4zMgl7cTB9LFtyNF0KKworCXZsZDEuMzIJe3E4LHE5fSxbcjNdCQlAIGxvYWQga2V5IHNjaGVkdWxlLi4uCisJc3ViCXI1LHI1LCM0CisJbW92CXIxMiwjMTYKKwljbXAJcjIsIzIKKwlhZGQJcjcscjMscjUsbHNsIzQJQCBwb2ludGVyIHRvIGxhc3QgNSByb3VuZCBrZXlzCisJc3ViCXI1LHI1LCMyCisJdmxkMS4zMgl7cTEyLHExM30sW3I3XSEKKwl2bGQxLjMyCXtxMTQscTE1fSxbcjddIQorCXZsZDEuMzIJe3E3fSxbcjddCisJYWRkCXI3LHIzLCMzMgorCW1vdglyNixyNQorCW1vdmxvCXIxMiwjMAorI2lmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjgsIHI4CisjZW5kaWYKKwl2b3JyCXExLHEwLHEwCisJYWRkCXIxMCwgcjgsICMxCisJdm9ycglxMTAscTAscTAKKwlhZGQJcjgsIHI4LCAjMgorCXZvcnIJcTYscTAscTAKKwlyZXYJcjEwLCByMTAKKwl2bW92LjMyCWQzWzFdLHIxMAorCWJscwlMY3RyMzJfdGFpbAorCXJldglyMTIsIHI4CisJc3ViCXIyLHIyLCMzCQlAIGJpYXMKKwl2bW92LjMyCWQyMVsxXSxyMTIKKwliCUxvb3AzeF9jdHIzMgorCisuYWxpZ24JNAorTG9vcDN4X2N0cjMyOgorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyMCwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTgKKy5ieXRlCTB4ODIsMHgyMywweGIwLDB4ZjMJQCBhZXNtYyBxMSxxMQorLmJ5dGUJMHgyMCwweDQzLDB4ZjAsMHhmMwlAIGFlc2UgcTEwLHE4CisuYnl0ZQkweGE0LDB4NDMsMHhmMCwweGYzCUAgYWVzbWMgcTEwLHExMAorCXZsZDEuMzIJe3E4fSxbcjddIQorCXN1YnMJcjYscjYsIzIKKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjIsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHE5CisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKy5ieXRlCTB4MjIsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxOQorLmJ5dGUJMHhhNCwweDQzLDB4ZjAsMHhmMwlAIGFlc21jIHExMCxxMTAKKwl2bGQxLjMyCXtxOX0sW3I3XSEKKwliZ3QJTG9vcDN4X2N0cjMyCisKKy5ieXRlCTB4MjAsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE4CisuYnl0ZQkweDgwLDB4ODMsMHhiMCwweGYzCUAgYWVzbWMgcTQscTAKKy5ieXRlCTB4MjAsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHE4CisuYnl0ZQkweDgyLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTEKKwl2bGQxLjgJe3EyfSxbcjBdIQorCXZvcnIJcTAscTYscTYKKy5ieXRlCTB4MjAsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxOAorLmJ5dGUJMHhhNCwweDQzLDB4ZjAsMHhmMwlAIGFlc21jIHExMCxxMTAKKwl2bGQxLjgJe3EzfSxbcjBdIQorCXZvcnIJcTEscTYscTYKKy5ieXRlCTB4MjIsMHg4MywweGIwLDB4ZjMJQCBhZXNlIHE0LHE5CisuYnl0ZQkweDg4LDB4ODMsMHhiMCwweGYzCUAgYWVzbWMgcTQscTQKKy5ieXRlCTB4MjIsMHhhMywweGIwLDB4ZjMJQCBhZXNlIHE1LHE5CisuYnl0ZQkweDhhLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTUKKwl2bGQxLjgJe3ExMX0sW3IwXSEKKwltb3YJcjcscjMKKy5ieXRlCTB4MjIsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxOQorLmJ5dGUJMHhhNCwweDIzLDB4ZjAsMHhmMwlAIGFlc21jIHE5LHExMAorCXZvcnIJcTEwLHE2LHE2CisJYWRkCXI5LHI4LCMxCisuYnl0ZQkweDI4LDB4ODMsMHhiMCwweGYzCUAgYWVzZSBxNCxxMTIKKy5ieXRlCTB4ODgsMHg4MywweGIwLDB4ZjMJQCBhZXNtYyBxNCxxNAorLmJ5dGUJMHgyOCwweGEzLDB4YjAsMHhmMwlAIGFlc2UgcTUscTEyCisuYnl0ZQkweDhhLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTUKKwl2ZW9yCXEyLHEyLHE3CisJYWRkCXIxMCxyOCwjMgorLmJ5dGUJMHgyOCwweDIzLDB4ZjAsMHhmMwlAIGFlc2UgcTkscTEyCisuYnl0ZQkweGEyLDB4MjMsMHhmMCwweGYzCUAgYWVzbWMgcTkscTkKKwl2ZW9yCXEzLHEzLHE3CisJYWRkCXI4LHI4LCMzCisuYnl0ZQkweDJhLDB4ODMsMHhiMCwweGYzCUAgYWVzZSBxNCxxMTMKKy5ieXRlCTB4ODgsMHg4MywweGIwLDB4ZjMJQCBhZXNtYyBxNCxxNAorLmJ5dGUJMHgyYSwweGEzLDB4YjAsMHhmMwlAIGFlc2UgcTUscTEzCisuYnl0ZQkweDhhLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTUKKwl2ZW9yCXExMSxxMTEscTcKKwlyZXYJcjkscjkKKy5ieXRlCTB4MmEsMHgyMywweGYwLDB4ZjMJQCBhZXNlIHE5LHExMworLmJ5dGUJMHhhMiwweDIzLDB4ZjAsMHhmMwlAIGFlc21jIHE5LHE5CisJdm1vdi4zMglkMVsxXSwgcjkKKwlyZXYJcjEwLHIxMAorLmJ5dGUJMHgyYywweDgzLDB4YjAsMHhmMwlAIGFlc2UgcTQscTE0CisuYnl0ZQkweDg4LDB4ODMsMHhiMCwweGYzCUAgYWVzbWMgcTQscTQKKy5ieXRlCTB4MmMsMHhhMywweGIwLDB4ZjMJQCBhZXNlIHE1LHExNAorLmJ5dGUJMHg4YSwweGEzLDB4YjAsMHhmMwlAIGFlc21jIHE1LHE1CisJdm1vdi4zMglkM1sxXSwgcjEwCisJcmV2CXIxMixyOAorLmJ5dGUJMHgyYywweDIzLDB4ZjAsMHhmMwlAIGFlc2UgcTkscTE0CisuYnl0ZQkweGEyLDB4MjMsMHhmMCwweGYzCUAgYWVzbWMgcTkscTkKKwl2bW92LjMyCWQyMVsxXSwgcjEyCisJc3VicwlyMixyMiwjMworLmJ5dGUJMHgyZSwweDgzLDB4YjAsMHhmMwlAIGFlc2UgcTQscTE1CisuYnl0ZQkweDJlLDB4YTMsMHhiMCwweGYzCUAgYWVzZSBxNSxxMTUKKy5ieXRlCTB4MmUsMHgyMywweGYwLDB4ZjMJQCBhZXNlIHE5LHExNQorCisJdmVvcglxMixxMixxNAorCXZsZDEuMzIJe3E4fSxbcjddIQlAIHJlLXByZS1sb2FkIHJuZGtleVswXQorCXZzdDEuOAl7cTJ9LFtyMV0hCisJdmVvcglxMyxxMyxxNQorCW1vdglyNixyNQorCXZzdDEuOAl7cTN9LFtyMV0hCisJdmVvcglxMTEscTExLHE5CisJdmxkMS4zMgl7cTl9LFtyN10hCUAgcmUtcHJlLWxvYWQgcm5ka2V5WzFdCisJdnN0MS44CXtxMTF9LFtyMV0hCisJYmhzCUxvb3AzeF9jdHIzMgorCisJYWRkcwlyMixyMiwjMworCWJlcQlMY3RyMzJfZG9uZQorCWNtcAlyMiwjMQorCW1vdglyMTIsIzE2CisJbW92ZXEJcjEyLCMwCisKK0xjdHIzMl90YWlsOgorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyMCwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTgKKy5ieXRlCTB4ODIsMHgyMywweGIwLDB4ZjMJQCBhZXNtYyBxMSxxMQorCXZsZDEuMzIJe3E4fSxbcjddIQorCXN1YnMJcjYscjYsIzIKKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjIsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHE5CisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKwl2bGQxLjMyCXtxOX0sW3I3XSEKKwliZ3QJTGN0cjMyX3RhaWwKKworLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyMCwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTgKKy5ieXRlCTB4ODIsMHgyMywweGIwLDB4ZjMJQCBhZXNtYyBxMSxxMQorLmJ5dGUJMHgyMiwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTkKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyMiwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTkKKy5ieXRlCTB4ODIsMHgyMywweGIwLDB4ZjMJQCBhZXNtYyBxMSxxMQorCXZsZDEuOAl7cTJ9LFtyMF0scjEyCisuYnl0ZQkweDI4LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTIKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyOCwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTEyCisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKwl2bGQxLjgJe3EzfSxbcjBdCisuYnl0ZQkweDJhLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTMKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyYSwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTEzCisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKwl2ZW9yCXEyLHEyLHE3CisuYnl0ZQkweDJjLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTQKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyYywweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTE0CisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKwl2ZW9yCXEzLHEzLHE3CisuYnl0ZQkweDJlLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTUKKy5ieXRlCTB4MmUsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHExNQorCisJY21wCXIyLCMxCisJdmVvcglxMixxMixxMAorCXZlb3IJcTMscTMscTEKKwl2c3QxLjgJe3EyfSxbcjFdIQorCWJlcQlMY3RyMzJfZG9uZQorCXZzdDEuOAl7cTN9LFtyMV0KKworTGN0cjMyX2RvbmU6CisJdmxkbWlhCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscGN9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2FybXY0LW1vbnQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9hcm12NC1tb250LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkZTg5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9hcm12NC1tb250LlMKQEAgLTAsMCArMSw5NjcgQEAKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKK0AgU2lsZW5jZSBBUk12OCBkZXByZWNhdGVkIElUIGluc3RydWN0aW9uIHdhcm5pbmdzLiBUaGlzIGZpbGUgaXMgdXNlZCBieSBib3RoCitAIEFSTXY3IGFuZCBBUk12OCBwcm9jZXNzb3JzIGFuZCBkb2VzIG5vdCB1c2UgQVJNdjggaW5zdHJ1Y3Rpb25zLgorCisKKy50ZXh0CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorLnN5bnRheAl1bmlmaWVkCisudGh1bWIKKyNlbHNlCisuY29kZQkzMgorI2VuZGlmCisKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisuYWxpZ24JNQorTE9QRU5TU0xfYXJtY2FwOgorLndvcmQJT1BFTlNTTF9hcm1jYXBfUC1MYm5fbXVsX21vbnQKKyNlbmRpZgorCisuZ2xvYmwJX2JuX211bF9tb250CisucHJpdmF0ZV9leHRlcm4JX2JuX211bF9tb250CisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2JuX211bF9tb250CisjZW5kaWYKKworLmFsaWduCTUKK19ibl9tdWxfbW9udDoKK0xibl9tdWxfbW9udDoKKwlsZHIJaXAsW3NwLCM0XQkJQCBsb2FkIG51bQorCXN0bWRiCXNwISx7cjAscjJ9CQlAIHNwIHBvaW50cyBhdCBhcmd1bWVudCBibG9jaworI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKwl0c3QJaXAsIzcKKwlibmUJTGlhbHUKKwlhZHIJcjAsTGJuX211bF9tb250CisJbGRyCXIyLExPUEVOU1NMX2FybWNhcAorCWxkcglyMCxbcjAscjJdCisjaWZkZWYJX19BUFBMRV9fCisJbGRyCXIwLFtyMF0KKyNlbmRpZgorCXRzdAlyMCwjQVJNVjdfTkVPTgkJQCBORU9OIGF2YWlsYWJsZT8KKwlsZG1pYQlzcCwge3IwLHIyfQorCWJlcQlMaWFsdQorCWFkZAlzcCxzcCwjOAorCWIJYm5fbXVsOHhfbW9udF9uZW9uCisuYWxpZ24JNAorTGlhbHU6CisjZW5kaWYKKwljbXAJaXAsIzIKKwltb3YJcjAsaXAJCQlAIGxvYWQgbnVtCisjaWZkZWYJX190aHVtYjJfXworCWl0dHQJbHQKKyNlbmRpZgorCW1vdmx0CXIwLCMwCisJYWRkbHQJc3Asc3AsIzIqNAorCWJsdAlMYWJydAorCisJc3RtZGIJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0JCUAgc2F2ZSAxMCByZWdpc3RlcnMKKworCW1vdglyMCxyMCxsc2wjMgkJQCByZXNjYWxlIHIwIGZvciBieXRlIGNvdW50CisJc3ViCXNwLHNwLHIwCQlAIGFsbG9jYSg0Km51bSkKKwlzdWIJc3Asc3AsIzQJCUAgK2V4dHJhIGR3b3JkCisJc3ViCXIwLHIwLCM0CQlAICJudW09bnVtLTEiCisJYWRkCXI0LHIyLHIwCQlAICZicFtudW0tMV0KKworCWFkZAlyMCxzcCxyMAkJQCByMCB0byBwb2ludCBhdCAmdHBbbnVtLTFdCisJbGRyCXI4LFtyMCwjMTQqNF0JCUAgJm4wCisJbGRyCXIyLFtyMl0JCUAgYnBbMF0KKwlsZHIJcjUsW3IxXSwjNAkJQCBhcFswXSxhcCsrCisJbGRyCXI2LFtyM10sIzQJCUAgbnBbMF0sbnArKworCWxkcglyOCxbcjhdCQlAICpuMAorCXN0cglyNCxbcjAsIzE1KjRdCQlAIHNhdmUgJmJwW251bV0KKworCXVtdWxsCXIxMCxyMTEscjUscjIJQCBhcFswXSpicFswXQorCXN0cglyOCxbcjAsIzE0KjRdCQlAIHNhdmUgbjAgdmFsdWUKKwltdWwJcjgscjEwLHI4CQlAICJ0cFswXSIqbjAKKwltb3YJcjEyLCMwCisJdW1sYWwJcjEwLHIxMixyNixyOAlAIG5wWzBdKm4wKyJ0WzBdIgorCW1vdglyNCxzcAorCitMMXN0OgorCWxkcglyNSxbcjFdLCM0CQlAIGFwW2pdLGFwKysKKwltb3YJcjEwLHIxMQorCWxkcglyNixbcjNdLCM0CQlAIG5wW2pdLG5wKysKKwltb3YJcjExLCMwCisJdW1sYWwJcjEwLHIxMSxyNSxyMglAIGFwW2pdKmJwWzBdCisJbW92CXIxNCwjMAorCXVtbGFsCXIxMixyMTQscjYscjgJQCBucFtqXSpuMAorCWFkZHMJcjEyLHIxMixyMTAKKwlzdHIJcjEyLFtyNF0sIzQJCUAgdHBbai0xXT0sdHArKworCWFkYwlyMTIscjE0LCMwCisJY21wCXI0LHIwCisJYm5lCUwxc3QKKworCWFkZHMJcjEyLHIxMixyMTEKKwlsZHIJcjQsW3IwLCMxMyo0XQkJQCByZXN0b3JlIGJwCisJbW92CXIxNCwjMAorCWxkcglyOCxbcjAsIzE0KjRdCQlAIHJlc3RvcmUgbjAKKwlhZGMJcjE0LHIxNCwjMAorCXN0cglyMTIsW3IwXQkJQCB0cFtudW0tMV09CisJbW92CXI3LHNwCisJc3RyCXIxNCxbcjAsIzRdCQlAIHRwW251bV09CisKK0xvdXRlcjoKKwlzdWIJcjcscjAscjcJCUAgIm9yaWdpbmFsIiByMC0xIHZhbHVlCisJc3ViCXIxLHIxLHI3CQlAICJyZXdpbmQiIGFwIHRvICZhcFsxXQorCWxkcglyMixbcjQsIzRdIQkJQCAqKCsrYnApCisJc3ViCXIzLHIzLHI3CQlAICJyZXdpbmQiIG5wIHRvICZucFsxXQorCWxkcglyNSxbcjEsIy00XQkJQCBhcFswXQorCWxkcglyMTAsW3NwXQkJQCB0cFswXQorCWxkcglyNixbcjMsIy00XQkJQCBucFswXQorCWxkcglyNyxbc3AsIzRdCQlAIHRwWzFdCisKKwltb3YJcjExLCMwCisJdW1sYWwJcjEwLHIxMSxyNSxyMglAIGFwWzBdKmJwW2ldK3RwWzBdCisJc3RyCXI0LFtyMCwjMTMqNF0JCUAgc2F2ZSBicAorCW11bAlyOCxyMTAscjgKKwltb3YJcjEyLCMwCisJdW1sYWwJcjEwLHIxMixyNixyOAlAIG5wWzBdKm4wKyJ0cFswXSIKKwltb3YJcjQsc3AKKworTGlubmVyOgorCWxkcglyNSxbcjFdLCM0CQlAIGFwW2pdLGFwKysKKwlhZGRzCXIxMCxyMTEscjcJCUAgKz10cFtqXQorCWxkcglyNixbcjNdLCM0CQlAIG5wW2pdLG5wKysKKwltb3YJcjExLCMwCisJdW1sYWwJcjEwLHIxMSxyNSxyMglAIGFwW2pdKmJwW2ldCisJbW92CXIxNCwjMAorCXVtbGFsCXIxMixyMTQscjYscjgJQCBucFtqXSpuMAorCWFkYwlyMTEscjExLCMwCisJbGRyCXI3LFtyNCwjOF0JCUAgdHBbaisxXQorCWFkZHMJcjEyLHIxMixyMTAKKwlzdHIJcjEyLFtyNF0sIzQJCUAgdHBbai0xXT0sdHArKworCWFkYwlyMTIscjE0LCMwCisJY21wCXI0LHIwCisJYm5lCUxpbm5lcgorCisJYWRkcwlyMTIscjEyLHIxMQorCW1vdglyMTQsIzAKKwlsZHIJcjQsW3IwLCMxMyo0XQkJQCByZXN0b3JlIGJwCisJYWRjCXIxNCxyMTQsIzAKKwlsZHIJcjgsW3IwLCMxNCo0XQkJQCByZXN0b3JlIG4wCisJYWRkcwlyMTIscjEyLHI3CisJbGRyCXI3LFtyMCwjMTUqNF0JCUAgcmVzdG9yZSAmYnBbbnVtXQorCWFkYwlyMTQscjE0LCMwCisJc3RyCXIxMixbcjBdCQlAIHRwW251bS0xXT0KKwlzdHIJcjE0LFtyMCwjNF0JCUAgdHBbbnVtXT0KKworCWNtcAlyNCxyNworI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJbmUKKyNlbmRpZgorCW1vdm5lCXI3LHNwCisJYm5lCUxvdXRlcgorCisJbGRyCXIyLFtyMCwjMTIqNF0JCUAgcHVsbCBycAorCW1vdglyNSxzcAorCWFkZAlyMCxyMCwjNAkJQCByMCB0byBwb2ludCBhdCAmdHBbbnVtXQorCXN1YglyNSxyMCxyNQkJQCAib3JpZ2luYWwiIG51bSB2YWx1ZQorCW1vdglyNCxzcAkJCUAgInJld2luZCIgcjQKKwltb3YJcjEscjQJCQlAICJib3Jyb3ciIHIxCisJc3ViCXIzLHIzLHI1CQlAICJyZXdpbmQiIHIzIHRvICZucFswXQorCisJc3VicwlyNyxyNyxyNwkJQCAiY2xlYXIiIGNhcnJ5IGZsYWcKK0xzdWI6CWxkcglyNyxbcjRdLCM0CisJbGRyCXI2LFtyM10sIzQKKwlzYmNzCXI3LHI3LHI2CQlAIHRwW2pdLW5wW2pdCisJc3RyCXI3LFtyMl0sIzQJCUAgcnBbal09CisJdGVxCXI0LHIwCQlAIHByZXNlcnZlIGNhcnJ5CisJYm5lCUxzdWIKKwlzYmNzCXIxNCxyMTQsIzAJCUAgdXBtb3N0IGNhcnJ5CisJbW92CXI0LHNwCQkJQCAicmV3aW5kIiByNAorCXN1YglyMixyMixyNQkJQCAicmV3aW5kIiByMgorCitMY29weToJbGRyCXI3LFtyNF0JCUAgY29uZGl0aW9uYWwgY29weQorCWxkcglyNSxbcjJdCisJc3RyCXNwLFtyNF0sIzQJCUAgemFwIHRwCisjaWZkZWYJX190aHVtYjJfXworCWl0CWNjCisjZW5kaWYKKwltb3ZjYwlyNSxyNworCXN0cglyNSxbcjJdLCM0CisJdGVxCXI0LHIwCQlAIHByZXNlcnZlIGNhcnJ5CisJYm5lCUxjb3B5CisKKwltb3YJc3AscjAKKwlhZGQJc3Asc3AsIzQJCUAgc2tpcCBvdmVyIHRwW251bSsxXQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CQlAIHJlc3RvcmUgcmVnaXN0ZXJzCisJYWRkCXNwLHNwLCMyKjQJCUAgc2tpcCBvdmVyIHtyMCxyMn0KKwltb3YJcjAsIzEKK0xhYnJ0OgorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWJ4CWxyCQkJCUAgYnggbHIKKyNlbHNlCisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisKKworCisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJYm5fbXVsOHhfbW9udF9uZW9uCisjZW5kaWYKKy5hbGlnbgk1Citibl9tdWw4eF9tb250X25lb246CisJbW92CWlwLHNwCisJc3RtZGIJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQorCXZzdG1kYglzcCEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQkJQCBBQkkgc3BlY2lmaWNhdGlvbiBzYXlzIHNvCisJbGRtaWEJaXAse3I0LHI1fQkJQCBsb2FkIHJlc3Qgb2YgcGFyYW1ldGVyIGJsb2NrCisJbW92CWlwLHNwCisKKwljbXAJcjUsIzgKKwliaGkJTE5FT05fOG4KKworCUAgc3BlY2lhbCBjYXNlIGZvciByNT09OCwgZXZlcnl0aGluZyBpcyBpbiByZWdpc3RlciBiYW5rLi4uCisKKwl2bGQxLjMyCXtkMjhbMF19LCBbcjIsOjMyXSEKKwl2ZW9yCWQ4LGQ4LGQ4CisJc3ViCXI3LHNwLHI1LGxzbCM0CisJdmxkMS4zMgl7ZDAsZDEsZDIsZDN9LCAgW3IxXSEJCUAgY2FuJ3Qgc3BlY2lmeSA6MzIgOi0oCisJYW5kCXI3LHI3LCMtNjQKKwl2bGQxLjMyCXtkMzBbMF19LCBbcjQsOjMyXQorCW1vdglzcCxyNwkJCUAgYWxsb2NhCisJdnppcC4xNglkMjgsZDgKKworCXZtdWxsLnUzMglxNixkMjgsZDBbMF0KKwl2bXVsbC51MzIJcTcsZDI4LGQwWzFdCisJdm11bGwudTMyCXE4LGQyOCxkMVswXQorCXZzaGwuaTY0CWQyOSxkMTMsIzE2CisJdm11bGwudTMyCXE5LGQyOCxkMVsxXQorCisJdmFkZC51NjQJZDI5LGQyOSxkMTIKKwl2ZW9yCWQ4LGQ4LGQ4CisJdm11bC51MzIJZDI5LGQyOSxkMzAKKworCXZtdWxsLnUzMglxMTAsZDI4LGQyWzBdCisJdmxkMS4zMgl7ZDQsZDUsZDYsZDd9LCBbcjNdIQorCXZtdWxsLnUzMglxMTEsZDI4LGQyWzFdCisJdm11bGwudTMyCXExMixkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtdWxsLnUzMglxMTMsZDI4LGQzWzFdCisKKwl2bWxhbC51MzIJcTYsZDI5LGQ0WzBdCisJc3ViCXI5LHI1LCMxCisJdm1sYWwudTMyCXE3LGQyOSxkNFsxXQorCXZtbGFsLnUzMglxOCxkMjksZDVbMF0KKwl2bWxhbC51MzIJcTksZDI5LGQ1WzFdCisKKwl2bWxhbC51MzIJcTEwLGQyOSxkNlswXQorCXZtb3YJcTUscTYKKwl2bWxhbC51MzIJcTExLGQyOSxkNlsxXQorCXZtb3YJcTYscTcKKwl2bWxhbC51MzIJcTEyLGQyOSxkN1swXQorCXZtb3YJcTcscTgKKwl2bWxhbC51MzIJcTEzLGQyOSxkN1sxXQorCXZtb3YJcTgscTkKKwl2bW92CXE5LHExMAorCXZzaHIudTY0CWQxMCxkMTAsIzE2CisJdm1vdglxMTAscTExCisJdm1vdglxMTEscTEyCisJdmFkZC51NjQJZDEwLGQxMCxkMTEKKwl2bW92CXExMixxMTMKKwl2ZW9yCXExMyxxMTMKKwl2c2hyLnU2NAlkMTAsZDEwLCMxNgorCisJYglMTkVPTl9vdXRlcjgKKworLmFsaWduCTQKK0xORU9OX291dGVyODoKKwl2bGQxLjMyCXtkMjhbMF19LCBbcjIsOjMyXSEKKwl2ZW9yCWQ4LGQ4LGQ4CisJdnppcC4xNglkMjgsZDgKKwl2YWRkLnU2NAlkMTIsZDEyLGQxMAorCisJdm1sYWwudTMyCXE2LGQyOCxkMFswXQorCXZtbGFsLnUzMglxNyxkMjgsZDBbMV0KKwl2bWxhbC51MzIJcTgsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQxMywjMTYKKwl2bWxhbC51MzIJcTksZDI4LGQxWzFdCisKKwl2YWRkLnU2NAlkMjksZDI5LGQxMgorCXZlb3IJZDgsZDgsZDgKKwlzdWJzCXI5LHI5LCMxCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKworCXZtbGFsLnUzMglxMTAsZDI4LGQyWzBdCisJdm1sYWwudTMyCXExMSxkMjgsZDJbMV0KKwl2bWxhbC51MzIJcTEyLGQyOCxkM1swXQorCXZ6aXAuMTYJZDI5LGQ4CisJdm1sYWwudTMyCXExMyxkMjgsZDNbMV0KKworCXZtbGFsLnUzMglxNixkMjksZDRbMF0KKwl2bWxhbC51MzIJcTcsZDI5LGQ0WzFdCisJdm1sYWwudTMyCXE4LGQyOSxkNVswXQorCXZtbGFsLnUzMglxOSxkMjksZDVbMV0KKworCXZtbGFsLnUzMglxMTAsZDI5LGQ2WzBdCisJdm1vdglxNSxxNgorCXZtbGFsLnUzMglxMTEsZDI5LGQ2WzFdCisJdm1vdglxNixxNworCXZtbGFsLnUzMglxMTIsZDI5LGQ3WzBdCisJdm1vdglxNyxxOAorCXZtbGFsLnUzMglxMTMsZDI5LGQ3WzFdCisJdm1vdglxOCxxOQorCXZtb3YJcTkscTEwCisJdnNoci51NjQJZDEwLGQxMCwjMTYKKwl2bW92CXExMCxxMTEKKwl2bW92CXExMSxxMTIKKwl2YWRkLnU2NAlkMTAsZDEwLGQxMQorCXZtb3YJcTEyLHExMworCXZlb3IJcTEzLHExMworCXZzaHIudTY0CWQxMCxkMTAsIzE2CisKKwlibmUJTE5FT05fb3V0ZXI4CisKKwl2YWRkLnU2NAlkMTIsZDEyLGQxMAorCW1vdglyNyxzcAorCXZzaHIudTY0CWQxMCxkMTIsIzE2CisJbW92CXI4LHI1CisJdmFkZC51NjQJZDEzLGQxMyxkMTAKKwlhZGQJcjYsc3AsIzk2CisJdnNoci51NjQJZDEwLGQxMywjMTYKKwl2emlwLjE2CWQxMixkMTMKKworCWIJTE5FT05fdGFpbF9lbnRyeQorCisuYWxpZ24JNAorTE5FT05fOG46CisJdmVvcglxNixxNixxNgorCXN1YglyNyxzcCwjMTI4CisJdmVvcglxNyxxNyxxNworCXN1YglyNyxyNyxyNSxsc2wjNAorCXZlb3IJcTgscTgscTgKKwlhbmQJcjcscjcsIy02NAorCXZlb3IJcTkscTkscTkKKwltb3YJc3AscjcJCQlAIGFsbG9jYQorCXZlb3IJcTEwLHExMCxxMTAKKwlhZGQJcjcscjcsIzI1NgorCXZlb3IJcTExLHExMSxxMTEKKwlzdWIJcjgscjUsIzgKKwl2ZW9yCXExMixxMTIscTEyCisJdmVvcglxMTMscTEzLHExMworCitMTkVPTl84bl9pbml0OgorCXZzdDEuNjQJe3E2LHE3fSxbcjcsOjI1Nl0hCisJc3VicwlyOCxyOCwjOAorCXZzdDEuNjQJe3E4LHE5fSxbcjcsOjI1Nl0hCisJdnN0MS42NAl7cTEwLHExMX0sW3I3LDoyNTZdIQorCXZzdDEuNjQJe3ExMixxMTN9LFtyNyw6MjU2XSEKKwlibmUJTE5FT05fOG5faW5pdAorCisJYWRkCXI2LHNwLCMyNTYKKwl2bGQxLjMyCXtkMCxkMSxkMixkM30sW3IxXSEKKwlhZGQJcjEwLHNwLCM4CisJdmxkMS4zMgl7ZDMwWzBdfSxbcjQsOjMyXQorCW1vdglyOSxyNQorCWIJTE5FT05fOG5fb3V0ZXIKKworLmFsaWduCTQKK0xORU9OXzhuX291dGVyOgorCXZsZDEuMzIJe2QyOFswXX0sW3IyLDozMl0hCUAgKmIrKworCXZlb3IJZDgsZDgsZDgKKwl2emlwLjE2CWQyOCxkOAorCWFkZAlyNyxzcCwjMTI4CisJdmxkMS4zMgl7ZDQsZDUsZDYsZDd9LFtyM10hCisKKwl2bWxhbC51MzIJcTYsZDI4LGQwWzBdCisJdm1sYWwudTMyCXE3LGQyOCxkMFsxXQorCXZlb3IJZDgsZDgsZDgKKwl2bWxhbC51MzIJcTgsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQxMywjMTYKKwl2bWxhbC51MzIJcTksZDI4LGQxWzFdCisJdmFkZC51NjQJZDI5LGQyOSxkMTIKKwl2bWxhbC51MzIJcTEwLGQyOCxkMlswXQorCXZtdWwudTMyCWQyOSxkMjksZDMwCisJdm1sYWwudTMyCXExMSxkMjgsZDJbMV0KKwl2c3QxLjMyCXtkMjh9LFtzcCw6NjRdCQlAIHB1dCBhc2lkZSBzbWFzaGVkIGJbOCppKzBdCisJdm1sYWwudTMyCXExMixkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxMTMsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4WzBdfSxbcjIsOjMyXSEJQCAqYisrCisJdm1sYWwudTMyCXE2LGQyOSxkNFswXQorCXZlb3IJZDEwLGQxMCxkMTAKKwl2bWxhbC51MzIJcTcsZDI5LGQ0WzFdCisJdnppcC4xNglkMjgsZDEwCisJdm1sYWwudTMyCXE4LGQyOSxkNVswXQorCXZzaHIudTY0CWQxMixkMTIsIzE2CisJdm1sYWwudTMyCXE5LGQyOSxkNVsxXQorCXZtbGFsLnUzMglxMTAsZDI5LGQ2WzBdCisJdmFkZC51NjQJZDEyLGQxMixkMTMKKwl2bWxhbC51MzIJcTExLGQyOSxkNlsxXQorCXZzaHIudTY0CWQxMixkMTIsIzE2CisJdm1sYWwudTMyCXExMixkMjksZDdbMF0KKwl2bWxhbC51MzIJcTEzLGQyOSxkN1sxXQorCXZhZGQudTY0CWQxNCxkMTQsZDEyCisJdnN0MS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgbVs4KmkrMF0KKwl2bWxhbC51MzIJcTcsZDI4LGQwWzBdCisJdmxkMS42NAl7cTZ9LFtyNiw6MTI4XSEKKwl2bWxhbC51MzIJcTgsZDI4LGQwWzFdCisJdmVvcglkOCxkOCxkOAorCXZtbGFsLnUzMglxOSxkMjgsZDFbMF0KKwl2c2hsLmk2NAlkMjksZDE1LCMxNgorCXZtbGFsLnUzMglxMTAsZDI4LGQxWzFdCisJdmFkZC51NjQJZDI5LGQyOSxkMTQKKwl2bWxhbC51MzIJcTExLGQyOCxkMlswXQorCXZtdWwudTMyCWQyOSxkMjksZDMwCisJdm1sYWwudTMyCXExMixkMjgsZDJbMV0KKwl2c3QxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBiWzgqaSsxXQorCXZtbGFsLnUzMglxMTMsZDI4LGQzWzBdCisJdnppcC4xNglkMjksZDgKKwl2bWxhbC51MzIJcTYsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4WzBdfSxbcjIsOjMyXSEJQCAqYisrCisJdm1sYWwudTMyCXE3LGQyOSxkNFswXQorCXZlb3IJZDEwLGQxMCxkMTAKKwl2bWxhbC51MzIJcTgsZDI5LGQ0WzFdCisJdnppcC4xNglkMjgsZDEwCisJdm1sYWwudTMyCXE5LGQyOSxkNVswXQorCXZzaHIudTY0CWQxNCxkMTQsIzE2CisJdm1sYWwudTMyCXExMCxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTExLGQyOSxkNlswXQorCXZhZGQudTY0CWQxNCxkMTQsZDE1CisJdm1sYWwudTMyCXExMixkMjksZDZbMV0KKwl2c2hyLnU2NAlkMTQsZDE0LCMxNgorCXZtbGFsLnUzMglxMTMsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE2LGQyOSxkN1sxXQorCXZhZGQudTY0CWQxNixkMTYsZDE0CisJdnN0MS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgbVs4KmkrMV0KKwl2bWxhbC51MzIJcTgsZDI4LGQwWzBdCisJdmxkMS42NAl7cTd9LFtyNiw6MTI4XSEKKwl2bWxhbC51MzIJcTksZDI4LGQwWzFdCisJdmVvcglkOCxkOCxkOAorCXZtbGFsLnUzMglxMTAsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQxNywjMTYKKwl2bWxhbC51MzIJcTExLGQyOCxkMVsxXQorCXZhZGQudTY0CWQyOSxkMjksZDE2CisJdm1sYWwudTMyCXExMixkMjgsZDJbMF0KKwl2bXVsLnUzMglkMjksZDI5LGQzMAorCXZtbGFsLnUzMglxMTMsZDI4LGQyWzFdCisJdnN0MS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgYls4KmkrMl0KKwl2bWxhbC51MzIJcTYsZDI4LGQzWzBdCisJdnppcC4xNglkMjksZDgKKwl2bWxhbC51MzIJcTcsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4WzBdfSxbcjIsOjMyXSEJQCAqYisrCisJdm1sYWwudTMyCXE4LGQyOSxkNFswXQorCXZlb3IJZDEwLGQxMCxkMTAKKwl2bWxhbC51MzIJcTksZDI5LGQ0WzFdCisJdnppcC4xNglkMjgsZDEwCisJdm1sYWwudTMyCXExMCxkMjksZDVbMF0KKwl2c2hyLnU2NAlkMTYsZDE2LCMxNgorCXZtbGFsLnUzMglxMTEsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXExMixkMjksZDZbMF0KKwl2YWRkLnU2NAlkMTYsZDE2LGQxNworCXZtbGFsLnUzMglxMTMsZDI5LGQ2WzFdCisJdnNoci51NjQJZDE2LGQxNiwjMTYKKwl2bWxhbC51MzIJcTYsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE3LGQyOSxkN1sxXQorCXZhZGQudTY0CWQxOCxkMTgsZDE2CisJdnN0MS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgbVs4KmkrMl0KKwl2bWxhbC51MzIJcTksZDI4LGQwWzBdCisJdmxkMS42NAl7cTh9LFtyNiw6MTI4XSEKKwl2bWxhbC51MzIJcTEwLGQyOCxkMFsxXQorCXZlb3IJZDgsZDgsZDgKKwl2bWxhbC51MzIJcTExLGQyOCxkMVswXQorCXZzaGwuaTY0CWQyOSxkMTksIzE2CisJdm1sYWwudTMyCXExMixkMjgsZDFbMV0KKwl2YWRkLnU2NAlkMjksZDI5LGQxOAorCXZtbGFsLnUzMglxMTMsZDI4LGQyWzBdCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKwl2bWxhbC51MzIJcTYsZDI4LGQyWzFdCisJdnN0MS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgYls4KmkrM10KKwl2bWxhbC51MzIJcTcsZDI4LGQzWzBdCisJdnppcC4xNglkMjksZDgKKwl2bWxhbC51MzIJcTgsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4WzBdfSxbcjIsOjMyXSEJQCAqYisrCisJdm1sYWwudTMyCXE5LGQyOSxkNFswXQorCXZlb3IJZDEwLGQxMCxkMTAKKwl2bWxhbC51MzIJcTEwLGQyOSxkNFsxXQorCXZ6aXAuMTYJZDI4LGQxMAorCXZtbGFsLnUzMglxMTEsZDI5LGQ1WzBdCisJdnNoci51NjQJZDE4LGQxOCwjMTYKKwl2bWxhbC51MzIJcTEyLGQyOSxkNVsxXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ2WzBdCisJdmFkZC51NjQJZDE4LGQxOCxkMTkKKwl2bWxhbC51MzIJcTYsZDI5LGQ2WzFdCisJdnNoci51NjQJZDE4LGQxOCwjMTYKKwl2bWxhbC51MzIJcTcsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE4LGQyOSxkN1sxXQorCXZhZGQudTY0CWQyMCxkMjAsZDE4CisJdnN0MS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgbVs4KmkrM10KKwl2bWxhbC51MzIJcTEwLGQyOCxkMFswXQorCXZsZDEuNjQJe3E5fSxbcjYsOjEyOF0hCisJdm1sYWwudTMyCXExMSxkMjgsZDBbMV0KKwl2ZW9yCWQ4LGQ4LGQ4CisJdm1sYWwudTMyCXExMixkMjgsZDFbMF0KKwl2c2hsLmk2NAlkMjksZDIxLCMxNgorCXZtbGFsLnUzMglxMTMsZDI4LGQxWzFdCisJdmFkZC51NjQJZDI5LGQyOSxkMjAKKwl2bWxhbC51MzIJcTYsZDI4LGQyWzBdCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKwl2bWxhbC51MzIJcTcsZDI4LGQyWzFdCisJdnN0MS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgYls4KmkrNF0KKwl2bWxhbC51MzIJcTgsZDI4LGQzWzBdCisJdnppcC4xNglkMjksZDgKKwl2bWxhbC51MzIJcTksZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4WzBdfSxbcjIsOjMyXSEJQCAqYisrCisJdm1sYWwudTMyCXExMCxkMjksZDRbMF0KKwl2ZW9yCWQxMCxkMTAsZDEwCisJdm1sYWwudTMyCXExMSxkMjksZDRbMV0KKwl2emlwLjE2CWQyOCxkMTAKKwl2bWxhbC51MzIJcTEyLGQyOSxkNVswXQorCXZzaHIudTY0CWQyMCxkMjAsIzE2CisJdm1sYWwudTMyCXExMyxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTYsZDI5LGQ2WzBdCisJdmFkZC51NjQJZDIwLGQyMCxkMjEKKwl2bWxhbC51MzIJcTcsZDI5LGQ2WzFdCisJdnNoci51NjQJZDIwLGQyMCwjMTYKKwl2bWxhbC51MzIJcTgsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE5LGQyOSxkN1sxXQorCXZhZGQudTY0CWQyMixkMjIsZDIwCisJdnN0MS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgbVs4KmkrNF0KKwl2bWxhbC51MzIJcTExLGQyOCxkMFswXQorCXZsZDEuNjQJe3ExMH0sW3I2LDoxMjhdIQorCXZtbGFsLnUzMglxMTIsZDI4LGQwWzFdCisJdmVvcglkOCxkOCxkOAorCXZtbGFsLnUzMglxMTMsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQyMywjMTYKKwl2bWxhbC51MzIJcTYsZDI4LGQxWzFdCisJdmFkZC51NjQJZDI5LGQyOSxkMjIKKwl2bWxhbC51MzIJcTcsZDI4LGQyWzBdCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKwl2bWxhbC51MzIJcTgsZDI4LGQyWzFdCisJdnN0MS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgYls4KmkrNV0KKwl2bWxhbC51MzIJcTksZDI4LGQzWzBdCisJdnppcC4xNglkMjksZDgKKwl2bWxhbC51MzIJcTEwLGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOFswXX0sW3IyLDozMl0hCUAgKmIrKworCXZtbGFsLnUzMglxMTEsZDI5LGQ0WzBdCisJdmVvcglkMTAsZDEwLGQxMAorCXZtbGFsLnUzMglxMTIsZDI5LGQ0WzFdCisJdnppcC4xNglkMjgsZDEwCisJdm1sYWwudTMyCXExMyxkMjksZDVbMF0KKwl2c2hyLnU2NAlkMjIsZDIyLCMxNgorCXZtbGFsLnUzMglxNixkMjksZDVbMV0KKwl2bWxhbC51MzIJcTcsZDI5LGQ2WzBdCisJdmFkZC51NjQJZDIyLGQyMixkMjMKKwl2bWxhbC51MzIJcTgsZDI5LGQ2WzFdCisJdnNoci51NjQJZDIyLGQyMiwjMTYKKwl2bWxhbC51MzIJcTksZDI5LGQ3WzBdCisJdm1sYWwudTMyCXExMCxkMjksZDdbMV0KKwl2YWRkLnU2NAlkMjQsZDI0LGQyMgorCXZzdDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1dCBhc2lkZSBzbWFzaGVkIG1bOCppKzVdCisJdm1sYWwudTMyCXExMixkMjgsZDBbMF0KKwl2bGQxLjY0CXtxMTF9LFtyNiw6MTI4XSEKKwl2bWxhbC51MzIJcTEzLGQyOCxkMFsxXQorCXZlb3IJZDgsZDgsZDgKKwl2bWxhbC51MzIJcTYsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQyNSwjMTYKKwl2bWxhbC51MzIJcTcsZDI4LGQxWzFdCisJdmFkZC51NjQJZDI5LGQyOSxkMjQKKwl2bWxhbC51MzIJcTgsZDI4LGQyWzBdCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKwl2bWxhbC51MzIJcTksZDI4LGQyWzFdCisJdnN0MS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgYls4KmkrNl0KKwl2bWxhbC51MzIJcTEwLGQyOCxkM1swXQorCXZ6aXAuMTYJZDI5LGQ4CisJdm1sYWwudTMyCXExMSxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjhbMF19LFtyMiw6MzJdIQlAICpiKysKKwl2bWxhbC51MzIJcTEyLGQyOSxkNFswXQorCXZlb3IJZDEwLGQxMCxkMTAKKwl2bWxhbC51MzIJcTEzLGQyOSxkNFsxXQorCXZ6aXAuMTYJZDI4LGQxMAorCXZtbGFsLnUzMglxNixkMjksZDVbMF0KKwl2c2hyLnU2NAlkMjQsZDI0LCMxNgorCXZtbGFsLnUzMglxNyxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTgsZDI5LGQ2WzBdCisJdmFkZC51NjQJZDI0LGQyNCxkMjUKKwl2bWxhbC51MzIJcTksZDI5LGQ2WzFdCisJdnNoci51NjQJZDI0LGQyNCwjMTYKKwl2bWxhbC51MzIJcTEwLGQyOSxkN1swXQorCXZtbGFsLnUzMglxMTEsZDI5LGQ3WzFdCisJdmFkZC51NjQJZDI2LGQyNixkMjQKKwl2c3QxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBtWzgqaSs2XQorCXZtbGFsLnUzMglxMTMsZDI4LGQwWzBdCisJdmxkMS42NAl7cTEyfSxbcjYsOjEyOF0hCisJdm1sYWwudTMyCXE2LGQyOCxkMFsxXQorCXZlb3IJZDgsZDgsZDgKKwl2bWxhbC51MzIJcTcsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQyNywjMTYKKwl2bWxhbC51MzIJcTgsZDI4LGQxWzFdCisJdmFkZC51NjQJZDI5LGQyOSxkMjYKKwl2bWxhbC51MzIJcTksZDI4LGQyWzBdCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKwl2bWxhbC51MzIJcTEwLGQyOCxkMlsxXQorCXZzdDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1dCBhc2lkZSBzbWFzaGVkIGJbOCppKzddCisJdm1sYWwudTMyCXExMSxkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxMTIsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4fSxbc3AsOjY0XQkJQCBwdWxsIHNtYXNoZWQgYls4KmkrMF0KKwl2bWxhbC51MzIJcTEzLGQyOSxkNFswXQorCXZsZDEuMzIJe2QwLGQxLGQyLGQzfSxbcjFdIQorCXZtbGFsLnUzMglxNixkMjksZDRbMV0KKwl2bWxhbC51MzIJcTcsZDI5LGQ1WzBdCisJdnNoci51NjQJZDI2LGQyNiwjMTYKKwl2bWxhbC51MzIJcTgsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXE5LGQyOSxkNlswXQorCXZhZGQudTY0CWQyNixkMjYsZDI3CisJdm1sYWwudTMyCXExMCxkMjksZDZbMV0KKwl2c2hyLnU2NAlkMjYsZDI2LCMxNgorCXZtbGFsLnUzMglxMTEsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXExMixkMjksZDdbMV0KKwl2YWRkLnU2NAlkMTIsZDEyLGQyNgorCXZzdDEuMzIJe2QyOX0sW3IxMCw6NjRdCUAgcHV0IGFzaWRlIHNtYXNoZWQgbVs4KmkrN10KKwlhZGQJcjEwLHNwLCM4CQlAIHJld2luZAorCXN1YglyOCxyNSwjOAorCWIJTE5FT05fOG5faW5uZXIKKworLmFsaWduCTQKK0xORU9OXzhuX2lubmVyOgorCXN1YnMJcjgscjgsIzgKKwl2bWxhbC51MzIJcTYsZDI4LGQwWzBdCisJdmxkMS42NAl7cTEzfSxbcjYsOjEyOF0KKwl2bWxhbC51MzIJcTcsZDI4LGQwWzFdCisJdmxkMS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHVsbCBzbWFzaGVkIG1bOCppKzBdCisJdm1sYWwudTMyCXE4LGQyOCxkMVswXQorCXZsZDEuMzIJe2Q0LGQ1LGQ2LGQ3fSxbcjNdIQorCXZtbGFsLnUzMglxOSxkMjgsZDFbMV0KKwlpdAluZQorCWFkZG5lCXI2LHI2LCMxNglAIGRvbid0IGFkdmFuY2UgaW4gbGFzdCBpdGVyYXRpb24KKwl2bWxhbC51MzIJcTEwLGQyOCxkMlswXQorCXZtbGFsLnUzMglxMTEsZDI4LGQyWzFdCisJdm1sYWwudTMyCXExMixkMjgsZDNbMF0KKwl2bWxhbC51MzIJcTEzLGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBiWzgqaSsxXQorCXZtbGFsLnUzMglxNixkMjksZDRbMF0KKwl2bWxhbC51MzIJcTcsZDI5LGQ0WzFdCisJdm1sYWwudTMyCXE4LGQyOSxkNVswXQorCXZtbGFsLnUzMglxOSxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTEwLGQyOSxkNlswXQorCXZtbGFsLnUzMglxMTEsZDI5LGQ2WzFdCisJdm1sYWwudTMyCXExMixkMjksZDdbMF0KKwl2bWxhbC51MzIJcTEzLGQyOSxkN1sxXQorCXZzdDEuNjQJe3E2fSxbcjcsOjEyOF0hCisJdm1sYWwudTMyCXE3LGQyOCxkMFswXQorCXZsZDEuNjQJe3E2fSxbcjYsOjEyOF0KKwl2bWxhbC51MzIJcTgsZDI4LGQwWzFdCisJdmxkMS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHVsbCBzbWFzaGVkIG1bOCppKzFdCisJdm1sYWwudTMyCXE5LGQyOCxkMVswXQorCWl0CW5lCisJYWRkbmUJcjYscjYsIzE2CUAgZG9uJ3QgYWR2YW5jZSBpbiBsYXN0IGl0ZXJhdGlvbgorCXZtbGFsLnUzMglxMTAsZDI4LGQxWzFdCisJdm1sYWwudTMyCXExMSxkMjgsZDJbMF0KKwl2bWxhbC51MzIJcTEyLGQyOCxkMlsxXQorCXZtbGFsLnUzMglxMTMsZDI4LGQzWzBdCisJdm1sYWwudTMyCXE2LGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBiWzgqaSsyXQorCXZtbGFsLnUzMglxNyxkMjksZDRbMF0KKwl2bWxhbC51MzIJcTgsZDI5LGQ0WzFdCisJdm1sYWwudTMyCXE5LGQyOSxkNVswXQorCXZtbGFsLnUzMglxMTAsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXExMSxkMjksZDZbMF0KKwl2bWxhbC51MzIJcTEyLGQyOSxkNlsxXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE2LGQyOSxkN1sxXQorCXZzdDEuNjQJe3E3fSxbcjcsOjEyOF0hCisJdm1sYWwudTMyCXE4LGQyOCxkMFswXQorCXZsZDEuNjQJe3E3fSxbcjYsOjEyOF0KKwl2bWxhbC51MzIJcTksZDI4LGQwWzFdCisJdmxkMS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHVsbCBzbWFzaGVkIG1bOCppKzJdCisJdm1sYWwudTMyCXExMCxkMjgsZDFbMF0KKwlpdAluZQorCWFkZG5lCXI2LHI2LCMxNglAIGRvbid0IGFkdmFuY2UgaW4gbGFzdCBpdGVyYXRpb24KKwl2bWxhbC51MzIJcTExLGQyOCxkMVsxXQorCXZtbGFsLnUzMglxMTIsZDI4LGQyWzBdCisJdm1sYWwudTMyCXExMyxkMjgsZDJbMV0KKwl2bWxhbC51MzIJcTYsZDI4LGQzWzBdCisJdm1sYWwudTMyCXE3LGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBiWzgqaSszXQorCXZtbGFsLnUzMglxOCxkMjksZDRbMF0KKwl2bWxhbC51MzIJcTksZDI5LGQ0WzFdCisJdm1sYWwudTMyCXExMCxkMjksZDVbMF0KKwl2bWxhbC51MzIJcTExLGQyOSxkNVsxXQorCXZtbGFsLnUzMglxMTIsZDI5LGQ2WzBdCisJdm1sYWwudTMyCXExMyxkMjksZDZbMV0KKwl2bWxhbC51MzIJcTYsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE3LGQyOSxkN1sxXQorCXZzdDEuNjQJe3E4fSxbcjcsOjEyOF0hCisJdm1sYWwudTMyCXE5LGQyOCxkMFswXQorCXZsZDEuNjQJe3E4fSxbcjYsOjEyOF0KKwl2bWxhbC51MzIJcTEwLGQyOCxkMFsxXQorCXZsZDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBtWzgqaSszXQorCXZtbGFsLnUzMglxMTEsZDI4LGQxWzBdCisJaXQJbmUKKwlhZGRuZQlyNixyNiwjMTYJQCBkb24ndCBhZHZhbmNlIGluIGxhc3QgaXRlcmF0aW9uCisJdm1sYWwudTMyCXExMixkMjgsZDFbMV0KKwl2bWxhbC51MzIJcTEzLGQyOCxkMlswXQorCXZtbGFsLnUzMglxNixkMjgsZDJbMV0KKwl2bWxhbC51MzIJcTcsZDI4LGQzWzBdCisJdm1sYWwudTMyCXE4LGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBiWzgqaSs0XQorCXZtbGFsLnUzMglxOSxkMjksZDRbMF0KKwl2bWxhbC51MzIJcTEwLGQyOSxkNFsxXQorCXZtbGFsLnUzMglxMTEsZDI5LGQ1WzBdCisJdm1sYWwudTMyCXExMixkMjksZDVbMV0KKwl2bWxhbC51MzIJcTEzLGQyOSxkNlswXQorCXZtbGFsLnUzMglxNixkMjksZDZbMV0KKwl2bWxhbC51MzIJcTcsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE4LGQyOSxkN1sxXQorCXZzdDEuNjQJe3E5fSxbcjcsOjEyOF0hCisJdm1sYWwudTMyCXExMCxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxOX0sW3I2LDoxMjhdCisJdm1sYWwudTMyCXExMSxkMjgsZDBbMV0KKwl2bGQxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgbVs4KmkrNF0KKwl2bWxhbC51MzIJcTEyLGQyOCxkMVswXQorCWl0CW5lCisJYWRkbmUJcjYscjYsIzE2CUAgZG9uJ3QgYWR2YW5jZSBpbiBsYXN0IGl0ZXJhdGlvbgorCXZtbGFsLnUzMglxMTMsZDI4LGQxWzFdCisJdm1sYWwudTMyCXE2LGQyOCxkMlswXQorCXZtbGFsLnUzMglxNyxkMjgsZDJbMV0KKwl2bWxhbC51MzIJcTgsZDI4LGQzWzBdCisJdm1sYWwudTMyCXE5LGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBiWzgqaSs1XQorCXZtbGFsLnUzMglxMTAsZDI5LGQ0WzBdCisJdm1sYWwudTMyCXExMSxkMjksZDRbMV0KKwl2bWxhbC51MzIJcTEyLGQyOSxkNVswXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXE2LGQyOSxkNlswXQorCXZtbGFsLnUzMglxNyxkMjksZDZbMV0KKwl2bWxhbC51MzIJcTgsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXE5LGQyOSxkN1sxXQorCXZzdDEuNjQJe3ExMH0sW3I3LDoxMjhdIQorCXZtbGFsLnUzMglxMTEsZDI4LGQwWzBdCisJdmxkMS42NAl7cTEwfSxbcjYsOjEyOF0KKwl2bWxhbC51MzIJcTEyLGQyOCxkMFsxXQorCXZsZDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBtWzgqaSs1XQorCXZtbGFsLnUzMglxMTMsZDI4LGQxWzBdCisJaXQJbmUKKwlhZGRuZQlyNixyNiwjMTYJQCBkb24ndCBhZHZhbmNlIGluIGxhc3QgaXRlcmF0aW9uCisJdm1sYWwudTMyCXE2LGQyOCxkMVsxXQorCXZtbGFsLnUzMglxNyxkMjgsZDJbMF0KKwl2bWxhbC51MzIJcTgsZDI4LGQyWzFdCisJdm1sYWwudTMyCXE5LGQyOCxkM1swXQorCXZtbGFsLnUzMglxMTAsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHVsbCBzbWFzaGVkIGJbOCppKzZdCisJdm1sYWwudTMyCXExMSxkMjksZDRbMF0KKwl2bWxhbC51MzIJcTEyLGQyOSxkNFsxXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ1WzBdCisJdm1sYWwudTMyCXE2LGQyOSxkNVsxXQorCXZtbGFsLnUzMglxNyxkMjksZDZbMF0KKwl2bWxhbC51MzIJcTgsZDI5LGQ2WzFdCisJdm1sYWwudTMyCXE5LGQyOSxkN1swXQorCXZtbGFsLnUzMglxMTAsZDI5LGQ3WzFdCisJdnN0MS42NAl7cTExfSxbcjcsOjEyOF0hCisJdm1sYWwudTMyCXExMixkMjgsZDBbMF0KKwl2bGQxLjY0CXtxMTF9LFtyNiw6MTI4XQorCXZtbGFsLnUzMglxMTMsZDI4LGQwWzFdCisJdmxkMS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHVsbCBzbWFzaGVkIG1bOCppKzZdCisJdm1sYWwudTMyCXE2LGQyOCxkMVswXQorCWl0CW5lCisJYWRkbmUJcjYscjYsIzE2CUAgZG9uJ3QgYWR2YW5jZSBpbiBsYXN0IGl0ZXJhdGlvbgorCXZtbGFsLnUzMglxNyxkMjgsZDFbMV0KKwl2bWxhbC51MzIJcTgsZDI4LGQyWzBdCisJdm1sYWwudTMyCXE5LGQyOCxkMlsxXQorCXZtbGFsLnUzMglxMTAsZDI4LGQzWzBdCisJdm1sYWwudTMyCXExMSxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgYls4KmkrN10KKwl2bWxhbC51MzIJcTEyLGQyOSxkNFswXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ0WzFdCisJdm1sYWwudTMyCXE2LGQyOSxkNVswXQorCXZtbGFsLnUzMglxNyxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTgsZDI5LGQ2WzBdCisJdm1sYWwudTMyCXE5LGQyOSxkNlsxXQorCXZtbGFsLnUzMglxMTAsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXExMSxkMjksZDdbMV0KKwl2c3QxLjY0CXtxMTJ9LFtyNyw6MTI4XSEKKwl2bWxhbC51MzIJcTEzLGQyOCxkMFswXQorCXZsZDEuNjQJe3ExMn0sW3I2LDoxMjhdCisJdm1sYWwudTMyCXE2LGQyOCxkMFsxXQorCXZsZDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBtWzgqaSs3XQorCXZtbGFsLnUzMglxNyxkMjgsZDFbMF0KKwlpdAluZQorCWFkZG5lCXI2LHI2LCMxNglAIGRvbid0IGFkdmFuY2UgaW4gbGFzdCBpdGVyYXRpb24KKwl2bWxhbC51MzIJcTgsZDI4LGQxWzFdCisJdm1sYWwudTMyCXE5LGQyOCxkMlswXQorCXZtbGFsLnUzMglxMTAsZDI4LGQyWzFdCisJdm1sYWwudTMyCXExMSxkMjgsZDNbMF0KKwl2bWxhbC51MzIJcTEyLGQyOCxkM1sxXQorCWl0CWVxCisJc3ViZXEJcjEscjEscjUsbHNsIzIJQCByZXdpbmQKKwl2bWxhbC51MzIJcTEzLGQyOSxkNFswXQorCXZsZDEuMzIJe2QyOH0sW3NwLDo2NF0JCUAgcHVsbCBzbWFzaGVkIGJbOCppKzBdCisJdm1sYWwudTMyCXE2LGQyOSxkNFsxXQorCXZsZDEuMzIJe2QwLGQxLGQyLGQzfSxbcjFdIQorCXZtbGFsLnUzMglxNyxkMjksZDVbMF0KKwlhZGQJcjEwLHNwLCM4CQlAIHJld2luZAorCXZtbGFsLnUzMglxOCxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTksZDI5LGQ2WzBdCisJdm1sYWwudTMyCXExMCxkMjksZDZbMV0KKwl2bWxhbC51MzIJcTExLGQyOSxkN1swXQorCXZzdDEuNjQJe3ExM30sW3I3LDoxMjhdIQorCXZtbGFsLnUzMglxMTIsZDI5LGQ3WzFdCisKKwlibmUJTE5FT05fOG5faW5uZXIKKwlhZGQJcjYsc3AsIzEyOAorCXZzdDEuNjQJe3E2LHE3fSxbcjcsOjI1Nl0hCisJdmVvcglxMixxMixxMgkJQCBkNC1kNQorCXZzdDEuNjQJe3E4LHE5fSxbcjcsOjI1Nl0hCisJdmVvcglxMyxxMyxxMwkJQCBkNi1kNworCXZzdDEuNjQJe3ExMCxxMTF9LFtyNyw6MjU2XSEKKwl2c3QxLjY0CXtxMTJ9LFtyNyw6MTI4XQorCisJc3VicwlyOSxyOSwjOAorCXZsZDEuNjQJe3E2LHE3fSxbcjYsOjI1Nl0hCisJdmxkMS42NAl7cTgscTl9LFtyNiw6MjU2XSEKKwl2bGQxLjY0CXtxMTAscTExfSxbcjYsOjI1Nl0hCisJdmxkMS42NAl7cTEyLHExM30sW3I2LDoyNTZdIQorCisJaXR0CW5lCisJc3VibmUJcjMscjMscjUsbHNsIzIJQCByZXdpbmQKKwlibmUJTE5FT05fOG5fb3V0ZXIKKworCWFkZAlyNyxzcCwjMTI4CisJdnN0MS42NAl7cTIscTN9LCBbc3AsOjI1Nl0hCUAgc3RhcnQgd2lwaW5nIHN0YWNrIGZyYW1lCisJdnNoci51NjQJZDEwLGQxMiwjMTYKKwl2c3QxLjY0CXtxMixxM30sW3NwLDoyNTZdIQorCXZhZGQudTY0CWQxMyxkMTMsZDEwCisJdnN0MS42NAl7cTIscTN9LCBbc3AsOjI1Nl0hCisJdnNoci51NjQJZDEwLGQxMywjMTYKKwl2c3QxLjY0CXtxMixxM30sIFtzcCw6MjU2XSEKKwl2emlwLjE2CWQxMixkMTMKKworCW1vdglyOCxyNQorCWIJTE5FT05fdGFpbF9lbnRyeQorCisuYWxpZ24JNAorTE5FT05fdGFpbDoKKwl2YWRkLnU2NAlkMTIsZDEyLGQxMAorCXZzaHIudTY0CWQxMCxkMTIsIzE2CisJdmxkMS42NAl7cTgscTl9LCBbcjYsIDoyNTZdIQorCXZhZGQudTY0CWQxMyxkMTMsZDEwCisJdmxkMS42NAl7cTEwLHExMX0sIFtyNiwgOjI1Nl0hCisJdnNoci51NjQJZDEwLGQxMywjMTYKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3I2LCA6MjU2XSEKKwl2emlwLjE2CWQxMixkMTMKKworTE5FT05fdGFpbF9lbnRyeToKKwl2YWRkLnU2NAlkMTQsZDE0LGQxMAorCXZzdDEuMzIJe2QxMlswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDE0LCMxNgorCXZhZGQudTY0CWQxNSxkMTUsZDEwCisJdnNoci51NjQJZDEwLGQxNSwjMTYKKwl2emlwLjE2CWQxNCxkMTUKKwl2YWRkLnU2NAlkMTYsZDE2LGQxMAorCXZzdDEuMzIJe2QxNFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDE2LCMxNgorCXZhZGQudTY0CWQxNyxkMTcsZDEwCisJdnNoci51NjQJZDEwLGQxNywjMTYKKwl2emlwLjE2CWQxNixkMTcKKwl2YWRkLnU2NAlkMTgsZDE4LGQxMAorCXZzdDEuMzIJe2QxNlswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDE4LCMxNgorCXZhZGQudTY0CWQxOSxkMTksZDEwCisJdnNoci51NjQJZDEwLGQxOSwjMTYKKwl2emlwLjE2CWQxOCxkMTkKKwl2YWRkLnU2NAlkMjAsZDIwLGQxMAorCXZzdDEuMzIJe2QxOFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDIwLCMxNgorCXZhZGQudTY0CWQyMSxkMjEsZDEwCisJdnNoci51NjQJZDEwLGQyMSwjMTYKKwl2emlwLjE2CWQyMCxkMjEKKwl2YWRkLnU2NAlkMjIsZDIyLGQxMAorCXZzdDEuMzIJe2QyMFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDIyLCMxNgorCXZhZGQudTY0CWQyMyxkMjMsZDEwCisJdnNoci51NjQJZDEwLGQyMywjMTYKKwl2emlwLjE2CWQyMixkMjMKKwl2YWRkLnU2NAlkMjQsZDI0LGQxMAorCXZzdDEuMzIJe2QyMlswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDI0LCMxNgorCXZhZGQudTY0CWQyNSxkMjUsZDEwCisJdnNoci51NjQJZDEwLGQyNSwjMTYKKwl2emlwLjE2CWQyNCxkMjUKKwl2YWRkLnU2NAlkMjYsZDI2LGQxMAorCXZzdDEuMzIJe2QyNFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDI2LCMxNgorCXZhZGQudTY0CWQyNyxkMjcsZDEwCisJdnNoci51NjQJZDEwLGQyNywjMTYKKwl2emlwLjE2CWQyNixkMjcKKwl2bGQxLjY0CXtxNixxN30sIFtyNiwgOjI1Nl0hCisJc3VicwlyOCxyOCwjOAorCXZzdDEuMzIJe2QyNlswXX0sICAgW3I3LCA6MzJdIQorCWJuZQlMTkVPTl90YWlsCisKKwl2c3QxLjMyCXtkMTBbMF19LCBbcjcsIDozMl0JCUAgdG9wLW1vc3QgYml0CisJc3ViCXIzLHIzLHI1LGxzbCMyCQkJQCByZXdpbmQgcjMKKwlzdWJzCXIxLHNwLCMwCQkJCUAgY2xlYXIgY2FycnkgZmxhZworCWFkZAlyMixzcCxyNSxsc2wjMgorCitMTkVPTl9zdWI6CisJbGRtaWEJcjEhLCB7cjQscjUscjYscjd9CisJbGRtaWEJcjMhLCB7cjgscjkscjEwLHIxMX0KKwlzYmNzCXI4LCByNCxyOAorCXNiY3MJcjksIHI1LHI5CisJc2JjcwlyMTAscjYscjEwCisJc2JjcwlyMTEscjcscjExCisJdGVxCXIxLHIyCQkJCUAgcHJlc2VydmVzIGNhcnJ5CisJc3RtaWEJcjAhLCB7cjgscjkscjEwLHIxMX0KKwlibmUJTE5FT05fc3ViCisKKwlsZHIJcjEwLCBbcjFdCQkJCUAgbG9hZCB0b3AtbW9zdCBiaXQKKwltb3YJcjExLHNwCisJdmVvcglxMCxxMCxxMAorCXN1YglyMTEscjIscjExCQkJCUAgdGhpcyBpcyBudW0qNAorCXZlb3IJcTEscTEscTEKKwltb3YJcjEsc3AKKwlzdWIJcjAscjAscjExCQkJCUAgcmV3aW5kIHIwCisJbW92CXIzLHIyCQkJCUAgc2Vjb25kIDMvNHRoIG9mIGZyYW1lCisJc2JjcwlyMTAscjEwLCMwCQkJCUAgcmVzdWx0IGlzIGNhcnJ5IGZsYWcKKworTE5FT05fY29weV9uX3phcDoKKwlsZG1pYQlyMSEsIHtyNCxyNSxyNixyN30KKwlsZG1pYQlyMCwgIHtyOCxyOSxyMTAscjExfQorCWl0CWNjCisJbW92Y2MJcjgsIHI0CisJdnN0MS42NAl7cTAscTF9LCBbcjMsOjI1Nl0hCQkJQCB3aXBlCisJaXR0CWNjCisJbW92Y2MJcjksIHI1CisJbW92Y2MJcjEwLHI2CisJdnN0MS42NAl7cTAscTF9LCBbcjMsOjI1Nl0hCQkJQCB3aXBlCisJaXQJY2MKKwltb3ZjYwlyMTEscjcKKwlsZG1pYQlyMSwge3I0LHI1LHI2LHI3fQorCXN0bWlhCXIwISwge3I4LHI5LHIxMCxyMTF9CisJc3ViCXIxLHIxLCMxNgorCWxkbWlhCXIwLCB7cjgscjkscjEwLHIxMX0KKwlpdAljYworCW1vdmNjCXI4LCByNAorCXZzdDEuNjQJe3EwLHExfSwgW3IxLDoyNTZdIQkJCUAgd2lwZQorCWl0dAljYworCW1vdmNjCXI5LCByNQorCW1vdmNjCXIxMCxyNgorCXZzdDEuNjQJe3EwLHExfSwgW3IzLDoyNTZdIQkJCUAgd2lwZQorCWl0CWNjCisJbW92Y2MJcjExLHI3CisJdGVxCXIxLHIyCQkJCUAgcHJlc2VydmVzIGNhcnJ5CisJc3RtaWEJcjAhLCB7cjgscjkscjEwLHIxMX0KKwlibmUJTE5FT05fY29weV9uX3phcAorCisJbW92CXNwLGlwCisJdmxkbWlhCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQorCWJ4CWxyCQkJCQkJQCBieCBscgorCisjZW5kaWYKKy5ieXRlCTc3LDExMSwxMTAsMTE2LDEwMywxMTEsMTA5LDEwMSwxMTQsMTIxLDMyLDEwOSwxMTcsMTA4LDExNiwxMDUsMTEyLDEwOCwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Miw0Nyw3OCw2OSw3OSw3OCw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisuY29tbQlfT1BFTlNTTF9hcm1jYXBfUCw0Cisubm9uX2xhenlfc3ltYm9sX3BvaW50ZXIKK09QRU5TU0xfYXJtY2FwX1A6CisuaW5kaXJlY3Rfc3ltYm9sCV9PUEVOU1NMX2FybWNhcF9QCisubG9uZwkwCisucHJpdmF0ZV9leHRlcm4JX09QRU5TU0xfYXJtY2FwX1AKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2JzYWVzLWFybXY3LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvYnNhZXMtYXJtdjcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTBkNGQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2JzYWVzLWFybXY3LlMKQEAgLTAsMCArMSwyNTc1IEBACitAIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgT3BlblNTTCBsaWNlbnNlICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZQorQCB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorQCBpbiB0aGUgZmlsZSBMSUNFTlNFIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9yIGF0CitAIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKworCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorQCBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCitAIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCitAIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorQAorQCBTcGVjaWZpYyBtb2RlcyBhbmQgYWRhcHRhdGlvbiBmb3IgTGludXgga2VybmVsIGJ5IEFyZCBCaWVzaGV1dmVsCitAIG9mIExpbmFyby4gUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMIHRlcm1zIGlzIGdyYW50ZWQuCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0AgQml0LXNsaWNlZCBBRVMgZm9yIEFSTSBORU9OCitACitAIEZlYnJ1YXJ5IDIwMTIuCitACitAIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZGlyZWN0IGFkYXB0YXRpb24gb2YgYnNhZXMteDg2XzY0IG1vZHVsZSBmb3IKK0AgQVJNIE5FT04uIEV4Y2VwdCB0aGF0IHRoaXMgbW9kdWxlIGlzIGVuZGlhbi1uZXV0cmFsIFtpbiBzZW5zZSB0aGF0CitAIGl0IGNhbiBiZSBjb21waWxlZCBmb3IgZWl0aGVyIGVuZGlhbm5lc3NdIGJ5IGNvdXJ0ZXN5IG9mIHZsZDEuOCdzCitAIG5ldXRyYWxpdHkuIEluaXRpYWwgdmVyc2lvbiBkb2Vzbid0IGltcGxlbWVudCBpbnRlcmZhY2UgdG8gT3BlblNTTCwKK0Agb25seSBsb3ctbGV2ZWwgcHJpbWl0aXZlcyBhbmQgdW5zdXBwb3J0ZWQgZW50cnkgcG9pbnRzLCBqdXN0IGVub3VnaAorQCB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIHJlc3VsdHMsIHdoaWNoIGZvciBDb3J0ZXgtQTggY29yZSBhcmU6CitACitAIGVuY3J5cHQJMTkuNSBjeWNsZXMgcGVyIGJ5dGUgcHJvY2Vzc2VkIHdpdGggMTI4LWJpdCBrZXkKK0AgZGVjcnlwdAkyMi4xIGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleQorQCBrZXkgY29udi4JNDQwICBjeWNsZXMgcGVyIDEyOC1iaXQga2V5LzAuMTggb2YgOHggYmxvY2sKK0AKK0AgU25hcGRyYWdvbiBTNCBlbmNyeXB0cyBieXRlIGluIDE3LjYgY3ljbGVzIGFuZCBkZWNyeXB0cyBpbiAxOS43LAorQCB3aGljaCBpcyBbbXVjaF0gd29yc2UgdGhhbiBhbnRpY2lwYXRlZCAoZm9yIGZ1cnRoZXIgZGV0YWlscyBzZWUKK0AgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vU25hcGRyYWdvbi1TNC5odG1sKS4KK0AKK0AgQ29ydGV4LUExNSBtYW5hZ2VzIGluIDE0LjIvMTYuMSBjeWNsZXMgW3doZW4gaW50ZWdlci1vbmx5IGNvZGUKK0AgbWFuYWdlcyBpbiAyMC4wIGN5Y2xlc10uCitACitAIFdoZW4gY29tcGFyaW5nIHRvIHg4Nl82NCByZXN1bHRzIGtlZXAgaW4gbWluZCB0aGF0IE5FT04gdW5pdCBpcworQCBbbW9zdGx5XSBzaW5nbGUtaXNzdWUgYW5kIHRodXMgY2FuJ3QgW2Z1bGx5XSBiZW5lZml0IGZyb20KK0AgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uIEFuZCB3aGVuIGNvbXBhcmluZyB0byBhZXMtYXJtdjQKK0AgcmVzdWx0cyBrZWVwIGluIG1pbmQga2V5IHNjaGVkdWxlIGNvbnZlcnNpb24gb3ZlcmhlYWQgKHNlZQorQCBic2Flcy14ODZfNjQucGwgZm9yIGZ1cnRoZXIgZGV0YWlscykuLi4KK0AKK0AJCQkJCQk8YXBwcm9Ab3BlbnNzbC5vcmc+CisKK0AgQXByaWwtQXVndXN0IDIwMTMKK0AgQWRkIENCQywgQ1RSIGFuZCBYVFMgc3Vicm91dGluZXMgYW5kIGFkYXB0IGZvciBrZXJuZWwgdXNlOyBjb3VydGVzeSBvZiBBcmQuCisKKyNpZm5kZWYgX19LRVJORUxfXworIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKKyMgZGVmaW5lIFZGUF9BQklfUFVTSAl2c3RtZGIJc3AhLHtkOC1kMTV9CisjIGRlZmluZSBWRlBfQUJJX1BPUAl2bGRtaWEJc3AhLHtkOC1kMTV9CisjIGRlZmluZSBWRlBfQUJJX0ZSQU1FCTB4NDAKKyNlbHNlCisjIGRlZmluZSBWRlBfQUJJX1BVU0gKKyMgZGVmaW5lIFZGUF9BQklfUE9QCisjIGRlZmluZSBWRlBfQUJJX0ZSQU1FCTAKKyMgZGVmaW5lIEJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKyMgZGVmaW5lIFhUU19DSEFJTl9UV0VBSworIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXworIyBkZWZpbmUgX19BUk1fTUFYX0FSQ0hfXyA3CisjZW5kaWYKKworI2lmZGVmIF9fdGh1bWJfXworIyBkZWZpbmUgYWRybCBhZHIKKyNlbmRpZgorCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworCisKKworLnRleHQKKy5zeW50YXgJdW5pZmllZCAJQCBBUk12Ny1jYXBhYmxlIGFzc2VtYmxlciBpcyBleHBlY3RlZCB0byBoYW5kbGUgdGhpcworI2lmIGRlZmluZWQoX190aHVtYjJfXykgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorLnRodW1iCisjZWxzZQorLmNvZGUJMzIKKyMgdW5kZWYgX190aHVtYjJfXworI2VuZGlmCisKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfYnNhZXNfZGVjcnlwdDgKKyNlbmRpZgorLmFsaWduCTQKK19ic2Flc19kZWNyeXB0ODoKKwlhZHIJcjYsLgorCXZsZG1pYQlyNCEsIHtxOX0JCUAgcm91bmQgMCBrZXkKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorCWFkcglyNixMTTBJU1IKKyNlbHNlCisJYWRkCXI2LHI2LCNMTTBJU1ItX2JzYWVzX2RlY3J5cHQ4CisjZW5kaWYKKworCXZsZG1pYQlyNiEsIHtxOH0JCUAgTE0wSVNSCisJdmVvcglxMTAsIHEwLCBxOQlAIHhvciB3aXRoIHJvdW5kMCBrZXkKKwl2ZW9yCXExMSwgcTEsIHE5CisJdnRibC44CWQwLCB7cTEwfSwgZDE2CisJdnRibC44CWQxLCB7cTEwfSwgZDE3CisJdmVvcglxMTIsIHEyLCBxOQorCXZ0YmwuOAlkMiwge3ExMX0sIGQxNgorCXZ0YmwuOAlkMywge3ExMX0sIGQxNworCXZlb3IJcTEzLCBxMywgcTkKKwl2dGJsLjgJZDQsIHtxMTJ9LCBkMTYKKwl2dGJsLjgJZDUsIHtxMTJ9LCBkMTcKKwl2ZW9yCXExNCwgcTQsIHE5CisJdnRibC44CWQ2LCB7cTEzfSwgZDE2CisJdnRibC44CWQ3LCB7cTEzfSwgZDE3CisJdmVvcglxMTUsIHE1LCBxOQorCXZ0YmwuOAlkOCwge3ExNH0sIGQxNgorCXZ0YmwuOAlkOSwge3ExNH0sIGQxNworCXZlb3IJcTEwLCBxNiwgcTkKKwl2dGJsLjgJZDEwLCB7cTE1fSwgZDE2CisJdnRibC44CWQxMSwge3ExNX0sIGQxNworCXZlb3IJcTExLCBxNywgcTkKKwl2dGJsLjgJZDEyLCB7cTEwfSwgZDE2CisJdnRibC44CWQxMywge3ExMH0sIGQxNworCXZ0YmwuOAlkMTQsIHtxMTF9LCBkMTYKKwl2dGJsLjgJZDE1LCB7cTExfSwgZDE3CisJdm1vdi5pOAlxOCwjMHg1NQkJCUAgY29tcG9zZSBMQlMwCisJdm1vdi5pOAlxOSwjMHgzMwkJCUAgY29tcG9zZSBMQlMxCisJdnNoci51NjQJcTEwLCBxNiwgIzEKKwl2c2hyLnU2NAlxMTEsIHE0LCAjMQorCXZlb3IJcTEwLCBxMTAsIHE3CisJdmVvcglxMTEsIHExMSwgcTUKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNywgcTcsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMQorCXZlb3IJcTUsIHE1LCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzEKKwl2ZW9yCXE2LCBxNiwgcTEwCisJdmVvcglxNCwgcTQsIHExMQorCXZzaHIudTY0CXExMCwgcTIsICMxCisJdnNoci51NjQJcTExLCBxMCwgIzEKKwl2ZW9yCXExMCwgcTEwLCBxMworCXZlb3IJcTExLCBxMTEsIHExCisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTMsIHEzLCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzEKKwl2ZW9yCXExLCBxMSwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMxCisJdmVvcglxMiwgcTIsIHExMAorCXZlb3IJcTAsIHEwLCBxMTEKKwl2bW92Lmk4CXE4LCMweDBmCQkJQCBjb21wb3NlIExCUzIKKwl2c2hyLnU2NAlxMTAsIHE1LCAjMgorCXZzaHIudTY0CXExMSwgcTQsICMyCisJdmVvcglxMTAsIHExMCwgcTcKKwl2ZW9yCXExMSwgcTExLCBxNgorCXZhbmQJcTEwLCBxMTAsIHE5CisJdmFuZAlxMTEsIHExMSwgcTkKKwl2ZW9yCXE3LCBxNywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMyCisJdmVvcglxNiwgcTYsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMgorCXZlb3IJcTUsIHE1LCBxMTAKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNoci51NjQJcTEwLCBxMSwgIzIKKwl2c2hyLnU2NAlxMTEsIHEwLCAjMgorCXZlb3IJcTEwLCBxMTAsIHEzCisJdmVvcglxMTEsIHExMSwgcTIKKwl2YW5kCXExMCwgcTEwLCBxOQorCXZhbmQJcTExLCBxMTEsIHE5CisJdmVvcglxMywgcTMsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMgorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzIKKwl2ZW9yCXExLCBxMSwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZzaHIudTY0CXExMCwgcTMsICM0CisJdnNoci51NjQJcTExLCBxMiwgIzQKKwl2ZW9yCXExMCwgcTEwLCBxNworCXZlb3IJcTExLCBxMTEsIHE2CisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTcsIHE3LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzQKKwl2ZW9yCXE2LCBxNiwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICM0CisJdmVvcglxMywgcTMsIHExMAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c2hyLnU2NAlxMTAsIHExLCAjNAorCXZzaHIudTY0CXExMSwgcTAsICM0CisJdmVvcglxMTAsIHExMCwgcTUKKwl2ZW9yCXExMSwgcTExLCBxNAorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE1LCBxNSwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICM0CisJdmVvcglxNCwgcTQsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjNAorCXZlb3IJcTEsIHExLCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJc3ViCXI1LHI1LCMxCisJYglMZGVjX3Nib3gKKy5hbGlnbgk0CitMZGVjX2xvb3A6CisJdmxkbWlhCXI0ISwge3E4LHE5LHExMCxxMTF9CisJdmVvcglxOCwgcTgsIHEwCisJdmVvcglxOSwgcTksIHExCisJdnRibC44CWQwLCB7cTh9LCBkMjQKKwl2dGJsLjgJZDEsIHtxOH0sIGQyNQorCXZsZG1pYQlyNCEsIHtxOH0KKwl2ZW9yCXExMCwgcTEwLCBxMgorCXZ0YmwuOAlkMiwge3E5fSwgZDI0CisJdnRibC44CWQzLCB7cTl9LCBkMjUKKwl2bGRtaWEJcjQhLCB7cTl9CisJdmVvcglxMTEsIHExMSwgcTMKKwl2dGJsLjgJZDQsIHtxMTB9LCBkMjQKKwl2dGJsLjgJZDUsIHtxMTB9LCBkMjUKKwl2bGRtaWEJcjQhLCB7cTEwfQorCXZ0YmwuOAlkNiwge3ExMX0sIGQyNAorCXZ0YmwuOAlkNywge3ExMX0sIGQyNQorCXZsZG1pYQlyNCEsIHtxMTF9CisJdmVvcglxOCwgcTgsIHE0CisJdmVvcglxOSwgcTksIHE1CisJdnRibC44CWQ4LCB7cTh9LCBkMjQKKwl2dGJsLjgJZDksIHtxOH0sIGQyNQorCXZlb3IJcTEwLCBxMTAsIHE2CisJdnRibC44CWQxMCwge3E5fSwgZDI0CisJdnRibC44CWQxMSwge3E5fSwgZDI1CisJdmVvcglxMTEsIHExMSwgcTcKKwl2dGJsLjgJZDEyLCB7cTEwfSwgZDI0CisJdnRibC44CWQxMywge3ExMH0sIGQyNQorCXZ0YmwuOAlkMTQsIHtxMTF9LCBkMjQKKwl2dGJsLjgJZDE1LCB7cTExfSwgZDI1CitMZGVjX3Nib3g6CisJdmVvcglxMSwgcTEsIHE0CisJdmVvcglxMywgcTMsIHE0CisKKwl2ZW9yCXE0LCBxNCwgcTcKKwl2ZW9yCXExLCBxMSwgcTYKKwl2ZW9yCXEyLCBxMiwgcTcKKwl2ZW9yCXE2LCBxNiwgcTQKKworCXZlb3IJcTAsIHEwLCBxMQorCXZlb3IJcTIsIHEyLCBxNQorCXZlb3IJcTcsIHE3LCBxNgorCXZlb3IJcTMsIHEzLCBxMAorCXZlb3IJcTUsIHE1LCBxMAorCXZlb3IJcTEsIHExLCBxMworCXZlb3IJcTExLCBxMywgcTAKKwl2ZW9yCXExMCwgcTcsIHE0CisJdmVvcglxOSwgcTEsIHE2CisJdmVvcglxMTMsIHE0LCBxMAorCXZtb3YJcTgsIHExMAorCXZlb3IJcTEyLCBxNSwgcTIKKworCXZvcnIJcTEwLCBxMTAsIHE5CisJdmVvcglxMTUsIHExMSwgcTgKKwl2YW5kCXExNCwgcTExLCBxMTIKKwl2b3JyCXExMSwgcTExLCBxMTIKKwl2ZW9yCXExMiwgcTEyLCBxOQorCXZhbmQJcTgsIHE4LCBxOQorCXZlb3IJcTksIHE2LCBxMgorCXZhbmQJcTE1LCBxMTUsIHExMgorCXZhbmQJcTEzLCBxMTMsIHE5CisJdmVvcglxOSwgcTMsIHE3CisJdmVvcglxMTIsIHExLCBxNQorCXZlb3IJcTExLCBxMTEsIHExMworCXZlb3IJcTEwLCBxMTAsIHExMworCXZhbmQJcTEzLCBxOSwgcTEyCisJdm9ycglxOSwgcTksIHExMgorCXZlb3IJcTExLCBxMTEsIHExNQorCXZlb3IJcTgsIHE4LCBxMTMKKwl2ZW9yCXExMCwgcTEwLCBxMTQKKwl2ZW9yCXE5LCBxOSwgcTE1CisJdmVvcglxOCwgcTgsIHExNAorCXZhbmQJcTEyLCBxNCwgcTYKKwl2ZW9yCXE5LCBxOSwgcTE0CisJdmFuZAlxMTMsIHEwLCBxMgorCXZhbmQJcTE0LCBxNywgcTEKKwl2b3JyCXExNSwgcTMsIHE1CisJdmVvcglxMTEsIHExMSwgcTEyCisJdmVvcglxOSwgcTksIHExNAorCXZlb3IJcTgsIHE4LCBxMTUKKwl2ZW9yCXExMCwgcTEwLCBxMTMKKworCUAgSW52X0dGMTYgCTAsIAkxLCAJMiwgCTMsIHMwLCBzMSwgczIsIHMzCisKKwlAIG5ldyBzbWFsbGVyIGludmVyc2lvbgorCisJdmFuZAlxMTQsIHExMSwgcTkKKwl2bW92CXExMiwgcTgKKworCXZlb3IJcTEzLCBxMTAsIHExNAorCXZlb3IJcTE1LCBxOCwgcTE0CisJdmVvcglxMTQsIHE4LCBxMTQJQCBxMTQ9cTE1CisKKwl2YnNsCXExMywgcTksIHE4CisJdmJzbAlxMTUsIHExMSwgcTEwCisJdmVvcglxMTEsIHExMSwgcTEwCisKKwl2YnNsCXExMiwgcTEzLCBxMTQKKwl2YnNsCXE4LCBxMTQsIHExMworCisJdmFuZAlxMTQsIHExMiwgcTE1CisJdmVvcglxOSwgcTksIHE4CisKKwl2ZW9yCXExNCwgcTE0LCBxMTEKKwl2ZW9yCXExMiwgcTUsIHEyCisJdmVvcglxOCwgcTEsIHE2CisJdmVvcglxMTAsIHExNSwgcTE0CisJdmFuZAlxMTAsIHExMCwgcTUKKwl2ZW9yCXE1LCBxNSwgcTEKKwl2YW5kCXExMSwgcTEsIHExNQorCXZhbmQJcTUsIHE1LCBxMTQKKwl2ZW9yCXExLCBxMTEsIHExMAorCXZlb3IJcTUsIHE1LCBxMTEKKwl2ZW9yCXExNSwgcTE1LCBxMTMKKwl2ZW9yCXExNCwgcTE0LCBxOQorCXZlb3IJcTExLCBxMTUsIHExNAorCXZlb3IJcTEwLCBxMTMsIHE5CisJdmFuZAlxMTEsIHExMSwgcTEyCisJdmFuZAlxMTAsIHExMCwgcTIKKwl2ZW9yCXExMiwgcTEyLCBxOAorCXZlb3IJcTIsIHEyLCBxNgorCXZhbmQJcTgsIHE4LCBxMTUKKwl2YW5kCXE2LCBxNiwgcTEzCisJdmFuZAlxMTIsIHExMiwgcTE0CisJdmFuZAlxMiwgcTIsIHE5CisJdmVvcglxOCwgcTgsIHExMgorCXZlb3IJcTIsIHEyLCBxNgorCXZlb3IJcTEyLCBxMTIsIHExMQorCXZlb3IJcTYsIHE2LCBxMTAKKwl2ZW9yCXE1LCBxNSwgcTEyCisJdmVvcglxMiwgcTIsIHExMgorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTYsIHE2LCBxOAorCisJdmVvcglxMTIsIHEzLCBxMAorCXZlb3IJcTgsIHE3LCBxNAorCXZlb3IJcTExLCBxMTUsIHExNAorCXZlb3IJcTEwLCBxMTMsIHE5CisJdmFuZAlxMTEsIHExMSwgcTEyCisJdmFuZAlxMTAsIHExMCwgcTAKKwl2ZW9yCXExMiwgcTEyLCBxOAorCXZlb3IJcTAsIHEwLCBxNAorCXZhbmQJcTgsIHE4LCBxMTUKKwl2YW5kCXE0LCBxNCwgcTEzCisJdmFuZAlxMTIsIHExMiwgcTE0CisJdmFuZAlxMCwgcTAsIHE5CisJdmVvcglxOCwgcTgsIHExMgorCXZlb3IJcTAsIHEwLCBxNAorCXZlb3IJcTEyLCBxMTIsIHExMQorCXZlb3IJcTQsIHE0LCBxMTAKKwl2ZW9yCXExNSwgcTE1LCBxMTMKKwl2ZW9yCXExNCwgcTE0LCBxOQorCXZlb3IJcTEwLCBxMTUsIHExNAorCXZhbmQJcTEwLCBxMTAsIHEzCisJdmVvcglxMywgcTMsIHE3CisJdmFuZAlxMTEsIHE3LCBxMTUKKwl2YW5kCXEzLCBxMywgcTE0CisJdmVvcglxNywgcTExLCBxMTAKKwl2ZW9yCXEzLCBxMywgcTExCisJdmVvcglxMywgcTMsIHExMgorCXZlb3IJcTAsIHEwLCBxMTIKKwl2ZW9yCXE3LCBxNywgcTgKKwl2ZW9yCXE0LCBxNCwgcTgKKwl2ZW9yCXExLCBxMSwgcTcKKwl2ZW9yCXE2LCBxNiwgcTUKKworCXZlb3IJcTQsIHE0LCBxMQorCXZlb3IJcTIsIHEyLCBxNworCXZlb3IJcTUsIHE1LCBxNworCXZlb3IJcTQsIHE0LCBxMgorCXZlb3IJcTcsIHE3LCBxMAorCXZlb3IJcTQsIHE0LCBxNQorCXZlb3IJcTMsIHEzLCBxNgorCXZlb3IJcTYsIHE2LCBxMQorCXZlb3IJcTMsIHEzLCBxNAorCisJdmVvcglxNCwgcTQsIHEwCisJdmVvcglxNywgcTcsIHEzCisJc3VicwlyNSxyNSwjMQorCWJjYwlMZGVjX2RvbmUKKwlAIG11bHRpcGxpY2F0aW9uIGJ5IDB4MDUtMHgwMC0weDA0LTB4MDAKKwl2ZXh0LjgJcTgsIHEwLCBxMCwgIzgKKwl2ZXh0LjgJcTE0LCBxMywgcTMsICM4CisJdmV4dC44CXExNSwgcTUsIHE1LCAjOAorCXZlb3IJcTgsIHE4LCBxMAorCXZleHQuOAlxOSwgcTEsIHExLCAjOAorCXZlb3IJcTE0LCBxMTQsIHEzCisJdmV4dC44CXExMCwgcTYsIHE2LCAjOAorCXZlb3IJcTE1LCBxMTUsIHE1CisJdmV4dC44CXExMSwgcTQsIHE0LCAjOAorCXZlb3IJcTksIHE5LCBxMQorCXZleHQuOAlxMTIsIHEyLCBxMiwgIzgKKwl2ZW9yCXExMCwgcTEwLCBxNgorCXZleHQuOAlxMTMsIHE3LCBxNywgIzgKKwl2ZW9yCXExMSwgcTExLCBxNAorCXZlb3IJcTEyLCBxMTIsIHEyCisJdmVvcglxMTMsIHExMywgcTcKKworCXZlb3IJcTAsIHEwLCBxMTQKKwl2ZW9yCXExLCBxMSwgcTE0CisJdmVvcglxNiwgcTYsIHE4CisJdmVvcglxMiwgcTIsIHExMAorCXZlb3IJcTQsIHE0LCBxOQorCXZlb3IJcTEsIHExLCBxMTUKKwl2ZW9yCXE2LCBxNiwgcTE1CisJdmVvcglxMiwgcTIsIHExNAorCXZlb3IJcTcsIHE3LCBxMTEKKwl2ZW9yCXE0LCBxNCwgcTE0CisJdmVvcglxMywgcTMsIHExMgorCXZlb3IJcTIsIHEyLCBxMTUKKwl2ZW9yCXE3LCBxNywgcTE1CisJdmVvcglxNSwgcTUsIHExMworCXZleHQuOAlxOCwgcTAsIHEwLCAjMTIJQCB4MCA8PDwgMzIKKwl2ZXh0LjgJcTksIHExLCBxMSwgIzEyCisJdmVvcglxMCwgcTAsIHE4CQlAIHgwIF4gKHgwIDw8PCAzMikKKwl2ZXh0LjgJcTEwLCBxNiwgcTYsICMxMgorCXZlb3IJcTEsIHExLCBxOQorCXZleHQuOAlxMTEsIHE0LCBxNCwgIzEyCisJdmVvcglxNiwgcTYsIHExMAorCXZleHQuOAlxMTIsIHEyLCBxMiwgIzEyCisJdmVvcglxNCwgcTQsIHExMQorCXZleHQuOAlxMTMsIHE3LCBxNywgIzEyCisJdmVvcglxMiwgcTIsIHExMgorCXZleHQuOAlxMTQsIHEzLCBxMywgIzEyCisJdmVvcglxNywgcTcsIHExMworCXZleHQuOAlxMTUsIHE1LCBxNSwgIzEyCisJdmVvcglxMywgcTMsIHExNAorCisJdmVvcglxOSwgcTksIHEwCisJdmVvcglxNSwgcTUsIHExNQorCXZleHQuOAlxMCwgcTAsIHEwLCAjOAkJQCAoeDAgXiAoeDAgPDw8IDMyKSkgPDw8IDY0KQorCXZlb3IJcTEwLCBxMTAsIHExCisJdmVvcglxOCwgcTgsIHE1CisJdmVvcglxOSwgcTksIHE1CisJdmV4dC44CXExLCBxMSwgcTEsICM4CisJdmVvcglxMTMsIHExMywgcTIKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXExNCwgcTE0LCBxNworCXZlb3IJcTEsIHExLCBxOQorCXZleHQuOAlxOCwgcTIsIHEyLCAjOAorCXZlb3IJcTEyLCBxMTIsIHE0CisJdmV4dC44CXE5LCBxNywgcTcsICM4CisJdmVvcglxMTUsIHExNSwgcTMKKwl2ZXh0LjgJcTIsIHE0LCBxNCwgIzgKKwl2ZW9yCXExMSwgcTExLCBxNgorCXZleHQuOAlxNywgcTUsIHE1LCAjOAorCXZlb3IJcTEyLCBxMTIsIHE1CisJdmV4dC44CXE0LCBxMywgcTMsICM4CisJdmVvcglxMTEsIHExMSwgcTUKKwl2ZXh0LjgJcTMsIHE2LCBxNiwgIzgKKwl2ZW9yCXE1LCBxOSwgcTEzCisJdmVvcglxMTEsIHExMSwgcTIKKwl2ZW9yCXE3LCBxNywgcTE1CisJdmVvcglxNiwgcTQsIHExNAorCXZlb3IJcTQsIHE4LCBxMTIKKwl2ZW9yCXEyLCBxMywgcTEwCisJdm1vdglxMywgcTExCisJIEAgdm1vdglxNSwgcTkKKwl2bGRtaWEJcjYsIHtxMTJ9CQlAIExJU1IKKwlpdGUJZXEJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKwlhZGRlcQlyNixyNiwjMHgxMAorCWJuZQlMZGVjX2xvb3AKKwl2bGRtaWEJcjYsIHtxMTJ9CQlAIExJU1JNMAorCWIJTGRlY19sb29wCisuYWxpZ24JNAorTGRlY19kb25lOgorCXZtb3YuaTgJcTgsIzB4NTUJCQlAIGNvbXBvc2UgTEJTMAorCXZtb3YuaTgJcTksIzB4MzMJCQlAIGNvbXBvc2UgTEJTMQorCXZzaHIudTY0CXExMCwgcTMsICMxCisJdnNoci51NjQJcTExLCBxMiwgIzEKKwl2ZW9yCXExMCwgcTEwLCBxNQorCXZlb3IJcTExLCBxMTEsIHE3CisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTUsIHE1LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzEKKwl2ZW9yCXE3LCBxNywgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMxCisJdmVvcglxMywgcTMsIHExMAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c2hyLnU2NAlxMTAsIHE2LCAjMQorCXZzaHIudTY0CXExMSwgcTAsICMxCisJdmVvcglxMTAsIHExMCwgcTQKKwl2ZW9yCXExMSwgcTExLCBxMQorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE0LCBxNCwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMxCisJdmVvcglxMSwgcTEsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMQorCXZlb3IJcTYsIHE2LCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJdm1vdi5pOAlxOCwjMHgwZgkJCUAgY29tcG9zZSBMQlMyCisJdnNoci51NjQJcTEwLCBxNywgIzIKKwl2c2hyLnU2NAlxMTEsIHEyLCAjMgorCXZlb3IJcTEwLCBxMTAsIHE1CisJdmVvcglxMTEsIHExMSwgcTMKKwl2YW5kCXExMCwgcTEwLCBxOQorCXZhbmQJcTExLCBxMTEsIHE5CisJdmVvcglxNSwgcTUsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMgorCXZlb3IJcTMsIHEzLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzIKKwl2ZW9yCXE3LCBxNywgcTEwCisJdmVvcglxMiwgcTIsIHExMQorCXZzaHIudTY0CXExMCwgcTEsICMyCisJdnNoci51NjQJcTExLCBxMCwgIzIKKwl2ZW9yCXExMCwgcTEwLCBxNAorCXZlb3IJcTExLCBxMTEsIHE2CisJdmFuZAlxMTAsIHExMCwgcTkKKwl2YW5kCXExMSwgcTExLCBxOQorCXZlb3IJcTQsIHE0LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzIKKwl2ZW9yCXE2LCBxNiwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMyCisJdmVvcglxMSwgcTEsIHExMAorCXZlb3IJcTAsIHEwLCBxMTEKKwl2c2hyLnU2NAlxMTAsIHE0LCAjNAorCXZzaHIudTY0CXExMSwgcTYsICM0CisJdmVvcglxMTAsIHExMCwgcTUKKwl2ZW9yCXExMSwgcTExLCBxMworCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE1LCBxNSwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICM0CisJdmVvcglxMywgcTMsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjNAorCXZlb3IJcTQsIHE0LCBxMTAKKwl2ZW9yCXE2LCBxNiwgcTExCisJdnNoci51NjQJcTEwLCBxMSwgIzQKKwl2c2hyLnU2NAlxMTEsIHEwLCAjNAorCXZlb3IJcTEwLCBxMTAsIHE3CisJdmVvcglxMTEsIHExMSwgcTIKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNywgcTcsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjNAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzQKKwl2ZW9yCXExLCBxMSwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZsZG1pYQlyNCwge3E4fQkJCUAgbGFzdCByb3VuZCBrZXkKKwl2ZW9yCXE2LCBxNiwgcTgKKwl2ZW9yCXE0LCBxNCwgcTgKKwl2ZW9yCXEyLCBxMiwgcTgKKwl2ZW9yCXE3LCBxNywgcTgKKwl2ZW9yCXEzLCBxMywgcTgKKwl2ZW9yCXE1LCBxNSwgcTgKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXExLCBxMSwgcTgKKwlieAlscgorCisKKworLmFsaWduCTYKK19ic2Flc19jb25zdDoKK0xNMElTUjpAIEludlNoaWZ0Um93cyBjb25zdGFudHMKKy5xdWFkCTB4MGEwZTAyMDYwNzBiMGYwMywgMHgwMDA0MDgwYzBkMDEwNTA5CitMSVNSOgorLnF1YWQJMHgwNTA0MDcwNjAyMDEwMDAzLCAweDBmMGUwZDBjMDgwYjBhMDkKK0xJU1JNMDoKKy5xdWFkCTB4MDEwNDBiMGUwMjA1MDgwZiwgMHgwMzA2MDkwYzAwMDcwYTBkCitMTTBTUjpAIFNoaWZ0Um93cyBjb25zdGFudHMKKy5xdWFkCTB4MGEwZTAyMDYwZjAzMDcwYiwgMHgwMDA0MDgwYzA1MDkwZDAxCitMU1I6CisucXVhZAkweDA1MDQwNzA2MDAwMzAyMDEsIDB4MGYwZTBkMGMwYTA5MDgwYgorTFNSTTA6CisucXVhZAkweDAzMDQwOTBlMDAwNTBhMGYsIDB4MDEwNjBiMGMwMjA3MDgwZAorTE0wOgorLnF1YWQJMHgwMjA2MGEwZTAzMDcwYjBmLCAweDAwMDQwODBjMDEwNTA5MGQKK0xSRVZNMFNSOgorLnF1YWQJMHgwOTBkMDEwNTBjMDAwNDA4LCAweDAzMDcwYjBmMDYwYTBlMDIKKy5ieXRlCTY2LDEwNSwxMTYsNDUsMTE1LDEwOCwxMDUsOTksMTAxLDEwMCwzMiw2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiw3OCw2OSw3OSw3OCw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTYKKworCisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2JzYWVzX2VuY3J5cHQ4CisjZW5kaWYKKy5hbGlnbgk0CitfYnNhZXNfZW5jcnlwdDg6CisJYWRyCXI2LC4KKwl2bGRtaWEJcjQhLCB7cTl9CQlAIHJvdW5kIDAga2V5CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKwlhZHIJcjYsTE0wU1IKKyNlbHNlCisJc3ViCXI2LHI2LCNfYnNhZXNfZW5jcnlwdDgtTE0wU1IKKyNlbmRpZgorCisJdmxkbWlhCXI2ISwge3E4fQkJQCBMTTBTUgorX2JzYWVzX2VuY3J5cHQ4X2FsdDoKKwl2ZW9yCXExMCwgcTAsIHE5CUAgeG9yIHdpdGggcm91bmQwIGtleQorCXZlb3IJcTExLCBxMSwgcTkKKwl2dGJsLjgJZDAsIHtxMTB9LCBkMTYKKwl2dGJsLjgJZDEsIHtxMTB9LCBkMTcKKwl2ZW9yCXExMiwgcTIsIHE5CisJdnRibC44CWQyLCB7cTExfSwgZDE2CisJdnRibC44CWQzLCB7cTExfSwgZDE3CisJdmVvcglxMTMsIHEzLCBxOQorCXZ0YmwuOAlkNCwge3ExMn0sIGQxNgorCXZ0YmwuOAlkNSwge3ExMn0sIGQxNworCXZlb3IJcTE0LCBxNCwgcTkKKwl2dGJsLjgJZDYsIHtxMTN9LCBkMTYKKwl2dGJsLjgJZDcsIHtxMTN9LCBkMTcKKwl2ZW9yCXExNSwgcTUsIHE5CisJdnRibC44CWQ4LCB7cTE0fSwgZDE2CisJdnRibC44CWQ5LCB7cTE0fSwgZDE3CisJdmVvcglxMTAsIHE2LCBxOQorCXZ0YmwuOAlkMTAsIHtxMTV9LCBkMTYKKwl2dGJsLjgJZDExLCB7cTE1fSwgZDE3CisJdmVvcglxMTEsIHE3LCBxOQorCXZ0YmwuOAlkMTIsIHtxMTB9LCBkMTYKKwl2dGJsLjgJZDEzLCB7cTEwfSwgZDE3CisJdnRibC44CWQxNCwge3ExMX0sIGQxNgorCXZ0YmwuOAlkMTUsIHtxMTF9LCBkMTcKK19ic2Flc19lbmNyeXB0OF9iaXRzbGljZToKKwl2bW92Lmk4CXE4LCMweDU1CQkJQCBjb21wb3NlIExCUzAKKwl2bW92Lmk4CXE5LCMweDMzCQkJQCBjb21wb3NlIExCUzEKKwl2c2hyLnU2NAlxMTAsIHE2LCAjMQorCXZzaHIudTY0CXExMSwgcTQsICMxCisJdmVvcglxMTAsIHExMCwgcTcKKwl2ZW9yCXExMSwgcTExLCBxNQorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE3LCBxNywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMxCisJdmVvcglxNSwgcTUsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMQorCXZlb3IJcTYsIHE2LCBxMTAKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNoci51NjQJcTEwLCBxMiwgIzEKKwl2c2hyLnU2NAlxMTEsIHEwLCAjMQorCXZlb3IJcTEwLCBxMTAsIHEzCisJdmVvcglxMTEsIHExMSwgcTEKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxMywgcTMsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMQorCXZlb3IJcTEsIHExLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzEKKwl2ZW9yCXEyLCBxMiwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZtb3YuaTgJcTgsIzB4MGYJCQlAIGNvbXBvc2UgTEJTMgorCXZzaHIudTY0CXExMCwgcTUsICMyCisJdnNoci51NjQJcTExLCBxNCwgIzIKKwl2ZW9yCXExMCwgcTEwLCBxNworCXZlb3IJcTExLCBxMTEsIHE2CisJdmFuZAlxMTAsIHExMCwgcTkKKwl2YW5kCXExMSwgcTExLCBxOQorCXZlb3IJcTcsIHE3LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzIKKwl2ZW9yCXE2LCBxNiwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMyCisJdmVvcglxNSwgcTUsIHExMAorCXZlb3IJcTQsIHE0LCBxMTEKKwl2c2hyLnU2NAlxMTAsIHExLCAjMgorCXZzaHIudTY0CXExMSwgcTAsICMyCisJdmVvcglxMTAsIHExMCwgcTMKKwl2ZW9yCXExMSwgcTExLCBxMgorCXZhbmQJcTEwLCBxMTAsIHE5CisJdmFuZAlxMTEsIHExMSwgcTkKKwl2ZW9yCXEzLCBxMywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMyCisJdmVvcglxMiwgcTIsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMgorCXZlb3IJcTEsIHExLCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJdnNoci51NjQJcTEwLCBxMywgIzQKKwl2c2hyLnU2NAlxMTEsIHEyLCAjNAorCXZlb3IJcTEwLCBxMTAsIHE3CisJdmVvcglxMTEsIHExMSwgcTYKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNywgcTcsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjNAorCXZlb3IJcTYsIHE2LCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzQKKwl2ZW9yCXEzLCBxMywgcTEwCisJdmVvcglxMiwgcTIsIHExMQorCXZzaHIudTY0CXExMCwgcTEsICM0CisJdnNoci51NjQJcTExLCBxMCwgIzQKKwl2ZW9yCXExMCwgcTEwLCBxNQorCXZlb3IJcTExLCBxMTEsIHE0CisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTUsIHE1LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzQKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICM0CisJdmVvcglxMSwgcTEsIHExMAorCXZlb3IJcTAsIHEwLCBxMTEKKwlzdWIJcjUscjUsIzEKKwliCUxlbmNfc2JveAorLmFsaWduCTQKK0xlbmNfbG9vcDoKKwl2bGRtaWEJcjQhLCB7cTgscTkscTEwLHExMX0KKwl2ZW9yCXE4LCBxOCwgcTAKKwl2ZW9yCXE5LCBxOSwgcTEKKwl2dGJsLjgJZDAsIHtxOH0sIGQyNAorCXZ0YmwuOAlkMSwge3E4fSwgZDI1CisJdmxkbWlhCXI0ISwge3E4fQorCXZlb3IJcTEwLCBxMTAsIHEyCisJdnRibC44CWQyLCB7cTl9LCBkMjQKKwl2dGJsLjgJZDMsIHtxOX0sIGQyNQorCXZsZG1pYQlyNCEsIHtxOX0KKwl2ZW9yCXExMSwgcTExLCBxMworCXZ0YmwuOAlkNCwge3ExMH0sIGQyNAorCXZ0YmwuOAlkNSwge3ExMH0sIGQyNQorCXZsZG1pYQlyNCEsIHtxMTB9CisJdnRibC44CWQ2LCB7cTExfSwgZDI0CisJdnRibC44CWQ3LCB7cTExfSwgZDI1CisJdmxkbWlhCXI0ISwge3ExMX0KKwl2ZW9yCXE4LCBxOCwgcTQKKwl2ZW9yCXE5LCBxOSwgcTUKKwl2dGJsLjgJZDgsIHtxOH0sIGQyNAorCXZ0YmwuOAlkOSwge3E4fSwgZDI1CisJdmVvcglxMTAsIHExMCwgcTYKKwl2dGJsLjgJZDEwLCB7cTl9LCBkMjQKKwl2dGJsLjgJZDExLCB7cTl9LCBkMjUKKwl2ZW9yCXExMSwgcTExLCBxNworCXZ0YmwuOAlkMTIsIHtxMTB9LCBkMjQKKwl2dGJsLjgJZDEzLCB7cTEwfSwgZDI1CisJdnRibC44CWQxNCwge3ExMX0sIGQyNAorCXZ0YmwuOAlkMTUsIHtxMTF9LCBkMjUKK0xlbmNfc2JveDoKKwl2ZW9yCXEyLCBxMiwgcTEKKwl2ZW9yCXE1LCBxNSwgcTYKKwl2ZW9yCXEzLCBxMywgcTAKKwl2ZW9yCXE2LCBxNiwgcTIKKwl2ZW9yCXE1LCBxNSwgcTAKKworCXZlb3IJcTYsIHE2LCBxMworCXZlb3IJcTMsIHEzLCBxNworCXZlb3IJcTcsIHE3LCBxNQorCXZlb3IJcTMsIHEzLCBxNAorCXZlb3IJcTQsIHE0LCBxNQorCisJdmVvcglxMiwgcTIsIHE3CisJdmVvcglxMywgcTMsIHExCisJdmVvcglxMSwgcTEsIHE1CisJdmVvcglxMTEsIHE3LCBxNAorCXZlb3IJcTEwLCBxMSwgcTIKKwl2ZW9yCXE5LCBxNSwgcTMKKwl2ZW9yCXExMywgcTIsIHE0CisJdm1vdglxOCwgcTEwCisJdmVvcglxMTIsIHE2LCBxMAorCisJdm9ycglxMTAsIHExMCwgcTkKKwl2ZW9yCXExNSwgcTExLCBxOAorCXZhbmQJcTE0LCBxMTEsIHExMgorCXZvcnIJcTExLCBxMTEsIHExMgorCXZlb3IJcTEyLCBxMTIsIHE5CisJdmFuZAlxOCwgcTgsIHE5CisJdmVvcglxOSwgcTMsIHEwCisJdmFuZAlxMTUsIHExNSwgcTEyCisJdmFuZAlxMTMsIHExMywgcTkKKwl2ZW9yCXE5LCBxNywgcTEKKwl2ZW9yCXExMiwgcTUsIHE2CisJdmVvcglxMTEsIHExMSwgcTEzCisJdmVvcglxMTAsIHExMCwgcTEzCisJdmFuZAlxMTMsIHE5LCBxMTIKKwl2b3JyCXE5LCBxOSwgcTEyCisJdmVvcglxMTEsIHExMSwgcTE1CisJdmVvcglxOCwgcTgsIHExMworCXZlb3IJcTEwLCBxMTAsIHExNAorCXZlb3IJcTksIHE5LCBxMTUKKwl2ZW9yCXE4LCBxOCwgcTE0CisJdmFuZAlxMTIsIHEyLCBxMworCXZlb3IJcTksIHE5LCBxMTQKKwl2YW5kCXExMywgcTQsIHEwCisJdmFuZAlxMTQsIHExLCBxNQorCXZvcnIJcTE1LCBxNywgcTYKKwl2ZW9yCXExMSwgcTExLCBxMTIKKwl2ZW9yCXE5LCBxOSwgcTE0CisJdmVvcglxOCwgcTgsIHExNQorCXZlb3IJcTEwLCBxMTAsIHExMworCisJQCBJbnZfR0YxNiAJMCwgCTEsIAkyLCAJMywgczAsIHMxLCBzMiwgczMKKworCUAgbmV3IHNtYWxsZXIgaW52ZXJzaW9uCisKKwl2YW5kCXExNCwgcTExLCBxOQorCXZtb3YJcTEyLCBxOAorCisJdmVvcglxMTMsIHExMCwgcTE0CisJdmVvcglxMTUsIHE4LCBxMTQKKwl2ZW9yCXExNCwgcTgsIHExNAlAIHExND1xMTUKKworCXZic2wJcTEzLCBxOSwgcTgKKwl2YnNsCXExNSwgcTExLCBxMTAKKwl2ZW9yCXExMSwgcTExLCBxMTAKKworCXZic2wJcTEyLCBxMTMsIHExNAorCXZic2wJcTgsIHExNCwgcTEzCisKKwl2YW5kCXExNCwgcTEyLCBxMTUKKwl2ZW9yCXE5LCBxOSwgcTgKKworCXZlb3IJcTE0LCBxMTQsIHExMQorCXZlb3IJcTEyLCBxNiwgcTAKKwl2ZW9yCXE4LCBxNSwgcTMKKwl2ZW9yCXExMCwgcTE1LCBxMTQKKwl2YW5kCXExMCwgcTEwLCBxNgorCXZlb3IJcTYsIHE2LCBxNQorCXZhbmQJcTExLCBxNSwgcTE1CisJdmFuZAlxNiwgcTYsIHExNAorCXZlb3IJcTUsIHExMSwgcTEwCisJdmVvcglxNiwgcTYsIHExMQorCXZlb3IJcTE1LCBxMTUsIHExMworCXZlb3IJcTE0LCBxMTQsIHE5CisJdmVvcglxMTEsIHExNSwgcTE0CisJdmVvcglxMTAsIHExMywgcTkKKwl2YW5kCXExMSwgcTExLCBxMTIKKwl2YW5kCXExMCwgcTEwLCBxMAorCXZlb3IJcTEyLCBxMTIsIHE4CisJdmVvcglxMCwgcTAsIHEzCisJdmFuZAlxOCwgcTgsIHExNQorCXZhbmQJcTMsIHEzLCBxMTMKKwl2YW5kCXExMiwgcTEyLCBxMTQKKwl2YW5kCXEwLCBxMCwgcTkKKwl2ZW9yCXE4LCBxOCwgcTEyCisJdmVvcglxMCwgcTAsIHEzCisJdmVvcglxMTIsIHExMiwgcTExCisJdmVvcglxMywgcTMsIHExMAorCXZlb3IJcTYsIHE2LCBxMTIKKwl2ZW9yCXEwLCBxMCwgcTEyCisJdmVvcglxNSwgcTUsIHE4CisJdmVvcglxMywgcTMsIHE4CisKKwl2ZW9yCXExMiwgcTcsIHE0CisJdmVvcglxOCwgcTEsIHEyCisJdmVvcglxMTEsIHExNSwgcTE0CisJdmVvcglxMTAsIHExMywgcTkKKwl2YW5kCXExMSwgcTExLCBxMTIKKwl2YW5kCXExMCwgcTEwLCBxNAorCXZlb3IJcTEyLCBxMTIsIHE4CisJdmVvcglxNCwgcTQsIHEyCisJdmFuZAlxOCwgcTgsIHExNQorCXZhbmQJcTIsIHEyLCBxMTMKKwl2YW5kCXExMiwgcTEyLCBxMTQKKwl2YW5kCXE0LCBxNCwgcTkKKwl2ZW9yCXE4LCBxOCwgcTEyCisJdmVvcglxNCwgcTQsIHEyCisJdmVvcglxMTIsIHExMiwgcTExCisJdmVvcglxMiwgcTIsIHExMAorCXZlb3IJcTE1LCBxMTUsIHExMworCXZlb3IJcTE0LCBxMTQsIHE5CisJdmVvcglxMTAsIHExNSwgcTE0CisJdmFuZAlxMTAsIHExMCwgcTcKKwl2ZW9yCXE3LCBxNywgcTEKKwl2YW5kCXExMSwgcTEsIHExNQorCXZhbmQJcTcsIHE3LCBxMTQKKwl2ZW9yCXExLCBxMTEsIHExMAorCXZlb3IJcTcsIHE3LCBxMTEKKwl2ZW9yCXE3LCBxNywgcTEyCisJdmVvcglxNCwgcTQsIHExMgorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTIsIHEyLCBxOAorCXZlb3IJcTcsIHE3LCBxMAorCXZlb3IJcTEsIHExLCBxNgorCXZlb3IJcTYsIHE2LCBxMAorCXZlb3IJcTQsIHE0LCBxNworCXZlb3IJcTAsIHEwLCBxMQorCisJdmVvcglxMSwgcTEsIHE1CisJdmVvcglxNSwgcTUsIHEyCisJdmVvcglxMiwgcTIsIHEzCisJdmVvcglxMywgcTMsIHE1CisJdmVvcglxNCwgcTQsIHE1CisKKwl2ZW9yCXE2LCBxNiwgcTMKKwlzdWJzCXI1LHI1LCMxCisJYmNjCUxlbmNfZG9uZQorCXZleHQuOAlxOCwgcTAsIHEwLCAjMTIJQCB4MCA8PDwgMzIKKwl2ZXh0LjgJcTksIHExLCBxMSwgIzEyCisJdmVvcglxMCwgcTAsIHE4CQlAIHgwIF4gKHgwIDw8PCAzMikKKwl2ZXh0LjgJcTEwLCBxNCwgcTQsICMxMgorCXZlb3IJcTEsIHExLCBxOQorCXZleHQuOAlxMTEsIHE2LCBxNiwgIzEyCisJdmVvcglxNCwgcTQsIHExMAorCXZleHQuOAlxMTIsIHEzLCBxMywgIzEyCisJdmVvcglxNiwgcTYsIHExMQorCXZleHQuOAlxMTMsIHE3LCBxNywgIzEyCisJdmVvcglxMywgcTMsIHExMgorCXZleHQuOAlxMTQsIHEyLCBxMiwgIzEyCisJdmVvcglxNywgcTcsIHExMworCXZleHQuOAlxMTUsIHE1LCBxNSwgIzEyCisJdmVvcglxMiwgcTIsIHExNAorCisJdmVvcglxOSwgcTksIHEwCisJdmVvcglxNSwgcTUsIHExNQorCXZleHQuOAlxMCwgcTAsIHEwLCAjOAkJQCAoeDAgXiAoeDAgPDw8IDMyKSkgPDw8IDY0KQorCXZlb3IJcTEwLCBxMTAsIHExCisJdmVvcglxOCwgcTgsIHE1CisJdmVvcglxOSwgcTksIHE1CisJdmV4dC44CXExLCBxMSwgcTEsICM4CisJdmVvcglxMTMsIHExMywgcTMKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXExNCwgcTE0LCBxNworCXZlb3IJcTEsIHExLCBxOQorCXZleHQuOAlxOCwgcTMsIHEzLCAjOAorCXZlb3IJcTEyLCBxMTIsIHE2CisJdmV4dC44CXE5LCBxNywgcTcsICM4CisJdmVvcglxMTUsIHExNSwgcTIKKwl2ZXh0LjgJcTMsIHE2LCBxNiwgIzgKKwl2ZW9yCXExMSwgcTExLCBxNAorCXZleHQuOAlxNywgcTUsIHE1LCAjOAorCXZlb3IJcTEyLCBxMTIsIHE1CisJdmV4dC44CXE2LCBxMiwgcTIsICM4CisJdmVvcglxMTEsIHExMSwgcTUKKwl2ZXh0LjgJcTIsIHE0LCBxNCwgIzgKKwl2ZW9yCXE1LCBxOSwgcTEzCisJdmVvcglxNCwgcTgsIHExMgorCXZlb3IJcTMsIHEzLCBxMTEKKwl2ZW9yCXE3LCBxNywgcTE1CisJdmVvcglxNiwgcTYsIHExNAorCSBAIHZtb3YJcTQsIHE4CisJdmVvcglxMiwgcTIsIHExMAorCSBAIHZtb3YJcTUsIHE5CisJdmxkbWlhCXI2LCB7cTEyfQkJQCBMU1IKKwlpdGUJZXEJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbWl0eSBjaGVjayBpbiBBUk0KKwlhZGRlcQlyNixyNiwjMHgxMAorCWJuZQlMZW5jX2xvb3AKKwl2bGRtaWEJcjYsIHtxMTJ9CQlAIExTUk0wCisJYglMZW5jX2xvb3AKKy5hbGlnbgk0CitMZW5jX2RvbmU6CisJdm1vdi5pOAlxOCwjMHg1NQkJCUAgY29tcG9zZSBMQlMwCisJdm1vdi5pOAlxOSwjMHgzMwkJCUAgY29tcG9zZSBMQlMxCisJdnNoci51NjQJcTEwLCBxMiwgIzEKKwl2c2hyLnU2NAlxMTEsIHEzLCAjMQorCXZlb3IJcTEwLCBxMTAsIHE1CisJdmVvcglxMTEsIHExMSwgcTcKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNSwgcTUsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMQorCXZlb3IJcTcsIHE3LCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzEKKwl2ZW9yCXEyLCBxMiwgcTEwCisJdmVvcglxMywgcTMsIHExMQorCXZzaHIudTY0CXExMCwgcTQsICMxCisJdnNoci51NjQJcTExLCBxMCwgIzEKKwl2ZW9yCXExMCwgcTEwLCBxNgorCXZlb3IJcTExLCBxMTEsIHExCisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTYsIHE2LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzEKKwl2ZW9yCXExLCBxMSwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMxCisJdmVvcglxNCwgcTQsIHExMAorCXZlb3IJcTAsIHEwLCBxMTEKKwl2bW92Lmk4CXE4LCMweDBmCQkJQCBjb21wb3NlIExCUzIKKwl2c2hyLnU2NAlxMTAsIHE3LCAjMgorCXZzaHIudTY0CXExMSwgcTMsICMyCisJdmVvcglxMTAsIHExMCwgcTUKKwl2ZW9yCXExMSwgcTExLCBxMgorCXZhbmQJcTEwLCBxMTAsIHE5CisJdmFuZAlxMTEsIHExMSwgcTkKKwl2ZW9yCXE1LCBxNSwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMyCisJdmVvcglxMiwgcTIsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMgorCXZlb3IJcTcsIHE3LCBxMTAKKwl2ZW9yCXEzLCBxMywgcTExCisJdnNoci51NjQJcTEwLCBxMSwgIzIKKwl2c2hyLnU2NAlxMTEsIHEwLCAjMgorCXZlb3IJcTEwLCBxMTAsIHE2CisJdmVvcglxMTEsIHExMSwgcTQKKwl2YW5kCXExMCwgcTEwLCBxOQorCXZhbmQJcTExLCBxMTEsIHE5CisJdmVvcglxNiwgcTYsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMgorCXZlb3IJcTQsIHE0LCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzIKKwl2ZW9yCXExLCBxMSwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZzaHIudTY0CXExMCwgcTYsICM0CisJdnNoci51NjQJcTExLCBxNCwgIzQKKwl2ZW9yCXExMCwgcTEwLCBxNQorCXZlb3IJcTExLCBxMTEsIHEyCisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTUsIHE1LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzQKKwl2ZW9yCXEyLCBxMiwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICM0CisJdmVvcglxNiwgcTYsIHExMAorCXZlb3IJcTQsIHE0LCBxMTEKKwl2c2hyLnU2NAlxMTAsIHExLCAjNAorCXZzaHIudTY0CXExMSwgcTAsICM0CisJdmVvcglxMTAsIHExMCwgcTcKKwl2ZW9yCXExMSwgcTExLCBxMworCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE3LCBxNywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICM0CisJdmVvcglxMywgcTMsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjNAorCXZlb3IJcTEsIHExLCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJdmxkbWlhCXI0LCB7cTh9CQkJQCBsYXN0IHJvdW5kIGtleQorCXZlb3IJcTQsIHE0LCBxOAorCXZlb3IJcTYsIHE2LCBxOAorCXZlb3IJcTMsIHEzLCBxOAorCXZlb3IJcTcsIHE3LCBxOAorCXZlb3IJcTIsIHEyLCBxOAorCXZlb3IJcTUsIHE1LCBxOAorCXZlb3IJcTAsIHEwLCBxOAorCXZlb3IJcTEsIHExLCBxOAorCWJ4CWxyCisKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfYnNhZXNfa2V5X2NvbnZlcnQKKyNlbmRpZgorLmFsaWduCTQKK19ic2Flc19rZXlfY29udmVydDoKKwlhZHIJcjYsLgorCXZsZDEuOAl7cTd9LCAgW3I0XSEJCUAgbG9hZCByb3VuZCAwIGtleQorI2lmIGRlZmluZWQoX190aHVtYjJfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisJYWRyCXI2LExNMAorI2Vsc2UKKwlzdWIJcjYscjYsI19ic2Flc19rZXlfY29udmVydC1MTTAKKyNlbmRpZgorCXZsZDEuOAl7cTE1fSwgW3I0XSEJCUAgbG9hZCByb3VuZCAxIGtleQorCisJdm1vdi5pOAlxOCwgICMweDAxCQkJQCBiaXQgbWFza3MKKwl2bW92Lmk4CXE5LCAgIzB4MDIKKwl2bW92Lmk4CXExMCwgIzB4MDQKKwl2bW92Lmk4CXExMSwgIzB4MDgKKwl2bW92Lmk4CXExMiwgIzB4MTAKKwl2bW92Lmk4CXExMywgIzB4MjAKKwl2bGRtaWEJcjYsIHtxMTR9CQlAIExNMAorCisjaWZkZWYgX19BUk1FTF9fCisJdnJldjMyLjgJcTcsICBxNworCXZyZXYzMi44CXExNSwgcTE1CisjZW5kaWYKKwlzdWIJcjUscjUsIzEKKwl2c3RtaWEJcjEyISwge3E3fQkJQCBzYXZlIHJvdW5kIDAga2V5CisJYglMa2V5X2xvb3AKKworLmFsaWduCTQKK0xrZXlfbG9vcDoKKwl2dGJsLjgJZDE0LHtxMTV9LGQyOAorCXZ0YmwuOAlkMTUse3ExNX0sZDI5CisJdm1vdi5pOAlxNiwgICMweDQwCisJdm1vdi5pOAlxMTUsICMweDgwCisKKwl2dHN0LjgJcTAsIHE3LCBxOAorCXZ0c3QuOAlxMSwgcTcsIHE5CisJdnRzdC44CXEyLCBxNywgcTEwCisJdnRzdC44CXEzLCBxNywgcTExCisJdnRzdC44CXE0LCBxNywgcTEyCisJdnRzdC44CXE1LCBxNywgcTEzCisJdnRzdC44CXE2LCBxNywgcTYKKwl2dHN0LjgJcTcsIHE3LCBxMTUKKwl2bGQxLjgJe3ExNX0sIFtyNF0hCQlAIGxvYWQgbmV4dCByb3VuZCBrZXkKKwl2bXZuCXEwLCBxMAkJQCAicG5vdCIKKwl2bXZuCXExLCBxMQorCXZtdm4JcTUsIHE1CisJdm12bglxNiwgcTYKKyNpZmRlZiBfX0FSTUVMX18KKwl2cmV2MzIuOAlxMTUsIHExNQorI2VuZGlmCisJc3VicwlyNSxyNSwjMQorCXZzdG1pYQlyMTIhLHtxMCxxMSxxMixxMyxxNCxxNSxxNixxN30JCUAgd3JpdGUgYml0LXNsaWNlZCByb3VuZCBrZXkKKwlibmUJTGtleV9sb29wCisKKwl2bW92Lmk4CXE3LCMweDYzCQkJQCBjb21wb3NlIEw2MworCUAgZG9uJ3Qgc2F2ZSBsYXN0IHJvdW5kIGtleQorCWJ4CWxyCisKKworCisKKy5nbG9ibAlfYnNhZXNfY2JjX2VuY3J5cHQKKy5wcml2YXRlX2V4dGVybglfYnNhZXNfY2JjX2VuY3J5cHQKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfYnNhZXNfY2JjX2VuY3J5cHQKKyNlbmRpZgorLmFsaWduCTUKK19ic2Flc19jYmNfZW5jcnlwdDoKKyNpZm5kZWYJX19LRVJORUxfXworCWNtcAlyMiwgIzEyOAorI2lmbmRlZglfX3RodW1iX18KKwlibG8JX0FFU19jYmNfZW5jcnlwdAorI2Vsc2UKKwliaHMJMWYKKwliCV9BRVNfY2JjX2VuY3J5cHQKKzE6CisjZW5kaWYKKyNlbmRpZgorCisJQCBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgY2FsbGVkIHdpdGggZW5jID09IDAKKworCW1vdglpcCwgc3AKKwlzdG1kYglzcCEsIHtyNCxyNSxyNixyNyxyOCxyOSxyMTAsIGxyfQorCVZGUF9BQklfUFVTSAorCWxkcglyOCwgW2lwXQkJCUAgSVYgaXMgMXN0IGFyZyBvbiB0aGUgc3RhY2sKKwltb3YJcjIsIHIyLCBsc3IjNAkJQCBsZW4gaW4gMTYgYnl0ZSBibG9ja3MKKwlzdWIJc3AsICMweDEwCQkJQCBzY3JhdGNoIHNwYWNlIHRvIGNhcnJ5IG92ZXIgdGhlIElWCisJbW92CXI5LCBzcAkJCQlAIHNhdmUgc3AKKworCWxkcglyMTAsIFtyMywgIzI0MF0JCUAgZ2V0ICMgb2Ygcm91bmRzCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlAIGFsbG9jYXRlIHRoZSBrZXkgc2NoZWR1bGUgb24gdGhlIHN0YWNrCisJc3ViCXIxMiwgc3AsIHIxMCwgbHNsIzcJCUAgMTI4IGJ5dGVzIHBlciBpbm5lciByb3VuZCBrZXkKKwlhZGQJcjEyLCAjOTYJCQlAIHNpZnplIG9mIGJpdC1zbGljZXMga2V5IHNjaGVkdWxlCisKKwlAIHBvcHVsYXRlIHRoZSBrZXkgc2NoZWR1bGUKKwltb3YJcjQsIHIzCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEwCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJbW92CXNwLCByMTIJCQkJQCBzcCBpcyBzcAorCWJsCV9ic2Flc19rZXlfY29udmVydAorCXZsZG1pYQlzcCwge3E2fQorCXZzdG1pYQlyMTIsICB7cTE1fQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisJdmVvcglxNywgcTcsIHE2CUAgZml4IHVwIHJvdW5kIDAga2V5CisJdnN0bWlhCXNwLCB7cTd9CisjZWxzZQorCWxkcglyMTIsIFtyMywgIzI0NF0KKwllb3JzCXIxMiwgIzEKKwliZXEJMGYKKworCUAgcG9wdWxhdGUgdGhlIGtleSBzY2hlZHVsZQorCXN0cglyMTIsIFtyMywgIzI0NF0KKwltb3YJcjQsIHIzCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEwCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJYWRkCXIxMiwgcjMsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJYWRkCXI0LCByMywgIzI0OAorCXZsZG1pYQlyNCwge3E2fQorCXZzdG1pYQlyMTIsIHtxMTV9CQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisJdmVvcglxNywgcTcsIHE2CUAgZml4IHVwIHJvdW5kIDAga2V5CisJdnN0bWlhCXI0LCB7cTd9CisKKy5hbGlnbgkyCisKKyNlbmRpZgorCisJdmxkMS44CXtxMTV9LCBbcjhdCQlAIGxvYWQgSVYKKwliCUxjYmNfZGVjX2xvb3AKKworLmFsaWduCTQKK0xjYmNfZGVjX2xvb3A6CisJc3VicwlyMiwgcjIsICMweDgKKwlibWkJTGNiY19kZWNfbG9vcF9maW5pc2gKKworCXZsZDEuOAl7cTAscTF9LCBbcjBdIQlAIGxvYWQgaW5wdXQKKwl2bGQxLjgJe3EyLHEzfSwgW3IwXSEKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCW1vdglyNCwgc3AJCQlAIHBhc3MgdGhlIGtleQorI2Vsc2UKKwlhZGQJcjQsIHIzLCAjMjQ4CisjZW5kaWYKKwl2bGQxLjgJe3E0LHE1fSwgW3IwXSEKKwltb3YJcjUsIHIxMAorCXZsZDEuOAl7cTYscTd9LCBbcjBdCisJc3ViCXIwLCByMCwgIzB4NjAKKwl2c3RtaWEJcjksIHtxMTV9CQkJQCBwdXQgYXNpZGUgSVYKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdmxkbWlhCXI5LCB7cTE0fQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtxOCxxOX0sIFtyMF0hCUAgcmVsb2FkIGlucHV0CisJdmVvcglxMCwgcTAsIHExNAlAIF49IElWCisJdmxkMS44CXtxMTAscTExfSwgW3IwXSEKKwl2ZW9yCXExLCBxMSwgcTgKKwl2ZW9yCXE2LCBxNiwgcTkKKwl2bGQxLjgJe3ExMixxMTN9LCBbcjBdIQorCXZlb3IJcTQsIHE0LCBxMTAKKwl2ZW9yCXEyLCBxMiwgcTExCisJdmxkMS44CXtxMTQscTE1fSwgW3IwXSEKKwl2ZW9yCXE3LCBxNywgcTEyCisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJdmVvcglxMywgcTMsIHExMworCXZzdDEuOAl7cTZ9LCBbcjFdIQorCXZlb3IJcTUsIHE1LCBxMTQKKwl2c3QxLjgJe3E0fSwgW3IxXSEKKwl2c3QxLjgJe3EyfSwgW3IxXSEKKwl2c3QxLjgJe3E3fSwgW3IxXSEKKwl2c3QxLjgJe3EzfSwgW3IxXSEKKwl2c3QxLjgJe3E1fSwgW3IxXSEKKworCWIJTGNiY19kZWNfbG9vcAorCitMY2JjX2RlY19sb29wX2ZpbmlzaDoKKwlhZGRzCXIyLCByMiwgIzgKKwliZXEJTGNiY19kZWNfZG9uZQorCisJdmxkMS44CXtxMH0sIFtyMF0hCQlAIGxvYWQgaW5wdXQKKwljbXAJcjIsICMyCisJYmxvCUxjYmNfZGVjX29uZQorCXZsZDEuOAl7cTF9LCBbcjBdIQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJbW92CXI0LCBzcAkJCUAgcGFzcyB0aGUga2V5CisjZWxzZQorCWFkZAlyNCwgcjMsICMyNDgKKyNlbmRpZgorCW1vdglyNSwgcjEwCisJdnN0bWlhCXI5LCB7cTE1fQkJCUAgcHV0IGFzaWRlIElWCisJYmVxCUxjYmNfZGVjX3R3bworCXZsZDEuOAl7cTJ9LCBbcjBdIQorCWNtcAlyMiwgIzQKKwlibG8JTGNiY19kZWNfdGhyZWUKKwl2bGQxLjgJe3EzfSwgW3IwXSEKKwliZXEJTGNiY19kZWNfZm91cgorCXZsZDEuOAl7cTR9LCBbcjBdIQorCWNtcAlyMiwgIzYKKwlibG8JTGNiY19kZWNfZml2ZQorCXZsZDEuOAl7cTV9LCBbcjBdIQorCWJlcQlMY2JjX2RlY19zaXgKKwl2bGQxLjgJe3E2fSwgW3IwXSEKKwlzdWIJcjAsIHIwLCAjMHg3MAorCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGRtaWEJcjksIHtxMTR9CQkJQCByZWxvYWQgSVYKKwl2bGQxLjgJe3E4LHE5fSwgW3IwXSEJQCByZWxvYWQgaW5wdXQKKwl2ZW9yCXEwLCBxMCwgcTE0CUAgXj0gSVYKKwl2bGQxLjgJe3ExMCxxMTF9LCBbcjBdIQorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTYsIHE2LCBxOQorCXZsZDEuOAl7cTEyLHExM30sIFtyMF0hCisJdmVvcglxNCwgcTQsIHExMAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2bGQxLjgJe3ExNX0sIFtyMF0hCisJdmVvcglxNywgcTcsIHExMgorCXZzdDEuOAl7cTAscTF9LCBbcjFdIQlAIHdyaXRlIG91dHB1dAorCXZlb3IJcTMsIHEzLCBxMTMKKwl2c3QxLjgJe3E2fSwgW3IxXSEKKwl2c3QxLjgJe3E0fSwgW3IxXSEKKwl2c3QxLjgJe3EyfSwgW3IxXSEKKwl2c3QxLjgJe3E3fSwgW3IxXSEKKwl2c3QxLjgJe3EzfSwgW3IxXSEKKwliCUxjYmNfZGVjX2RvbmUKKy5hbGlnbgk0CitMY2JjX2RlY19zaXg6CisJc3ViCXIwLCByMCwgIzB4NjAKKwlibAlfYnNhZXNfZGVjcnlwdDgKKwl2bGRtaWEJcjkse3ExNH0JCQlAIHJlbG9hZCBJVgorCXZsZDEuOAl7cTgscTl9LCBbcjBdIQlAIHJlbG9hZCBpbnB1dAorCXZlb3IJcTAsIHEwLCBxMTQJQCBePSBJVgorCXZsZDEuOAl7cTEwLHExMX0sIFtyMF0hCisJdmVvcglxMSwgcTEsIHE4CisJdmVvcglxNiwgcTYsIHE5CisJdmxkMS44CXtxMTJ9LCBbcjBdIQorCXZlb3IJcTQsIHE0LCBxMTAKKwl2ZW9yCXEyLCBxMiwgcTExCisJdmxkMS44CXtxMTV9LCBbcjBdIQorCXZlb3IJcTcsIHE3LCBxMTIKKwl2c3QxLjgJe3EwLHExfSwgW3IxXSEJQCB3cml0ZSBvdXRwdXQKKwl2c3QxLjgJe3E2fSwgW3IxXSEKKwl2c3QxLjgJe3E0fSwgW3IxXSEKKwl2c3QxLjgJe3EyfSwgW3IxXSEKKwl2c3QxLjgJe3E3fSwgW3IxXSEKKwliCUxjYmNfZGVjX2RvbmUKKy5hbGlnbgk0CitMY2JjX2RlY19maXZlOgorCXN1YglyMCwgcjAsICMweDUwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCXI5LCB7cTE0fQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtxOCxxOX0sIFtyMF0hCUAgcmVsb2FkIGlucHV0CisJdmVvcglxMCwgcTAsIHExNAlAIF49IElWCisJdmxkMS44CXtxMTAscTExfSwgW3IwXSEKKwl2ZW9yCXExLCBxMSwgcTgKKwl2ZW9yCXE2LCBxNiwgcTkKKwl2bGQxLjgJe3ExNX0sIFtyMF0hCisJdmVvcglxNCwgcTQsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjFdIQlAIHdyaXRlIG91dHB1dAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c3QxLjgJe3E2fSwgW3IxXSEKKwl2c3QxLjgJe3E0fSwgW3IxXSEKKwl2c3QxLjgJe3EyfSwgW3IxXSEKKwliCUxjYmNfZGVjX2RvbmUKKy5hbGlnbgk0CitMY2JjX2RlY19mb3VyOgorCXN1YglyMCwgcjAsICMweDQwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCXI5LCB7cTE0fQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtxOCxxOX0sIFtyMF0hCUAgcmVsb2FkIGlucHV0CisJdmVvcglxMCwgcTAsIHExNAlAIF49IElWCisJdmxkMS44CXtxMTB9LCBbcjBdIQorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTYsIHE2LCBxOQorCXZsZDEuOAl7cTE1fSwgW3IwXSEKKwl2ZW9yCXE0LCBxNCwgcTEwCisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJdnN0MS44CXtxNn0sIFtyMV0hCisJdnN0MS44CXtxNH0sIFtyMV0hCisJYglMY2JjX2RlY19kb25lCisuYWxpZ24JNAorTGNiY19kZWNfdGhyZWU6CisJc3ViCXIwLCByMCwgIzB4MzAKKwlibAlfYnNhZXNfZGVjcnlwdDgKKwl2bGRtaWEJcjksIHtxMTR9CQkJQCByZWxvYWQgSVYKKwl2bGQxLjgJe3E4LHE5fSwgW3IwXSEJQCByZWxvYWQgaW5wdXQKKwl2ZW9yCXEwLCBxMCwgcTE0CUAgXj0gSVYKKwl2bGQxLjgJe3ExNX0sIFtyMF0hCisJdmVvcglxMSwgcTEsIHE4CisJdmVvcglxNiwgcTYsIHE5CisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJdnN0MS44CXtxNn0sIFtyMV0hCisJYglMY2JjX2RlY19kb25lCisuYWxpZ24JNAorTGNiY19kZWNfdHdvOgorCXN1YglyMCwgcjAsICMweDIwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCXI5LCB7cTE0fQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtxOH0sIFtyMF0hCQlAIHJlbG9hZCBpbnB1dAorCXZlb3IJcTAsIHEwLCBxMTQJQCBePSBJVgorCXZsZDEuOAl7cTE1fSwgW3IwXSEJCUAgcmVsb2FkIGlucHV0CisJdmVvcglxMSwgcTEsIHE4CisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJYglMY2JjX2RlY19kb25lCisuYWxpZ24JNAorTGNiY19kZWNfb25lOgorCXN1YglyMCwgcjAsICMweDEwCisJbW92CXIxMCwgcjEJCQlAIHNhdmUgb3JpZ2luYWwgb3V0IHBvaW50ZXIKKwltb3YJcjEsIHI5CQkJQCB1c2UgdGhlIGl2IHNjcmF0Y2ggc3BhY2UgYXMgb3V0IGJ1ZmZlcgorCW1vdglyMiwgcjMKKwl2bW92CXE0LHExNQkJQCBqdXN0IGluIGNhc2UgZW5zdXJlIHRoYXQgSVYKKwl2bW92CXE1LHEwCQkJQCBhbmQgaW5wdXQgYXJlIHByZXNlcnZlZAorCWJsCV9BRVNfZGVjcnlwdAorCXZsZDEuOAl7cTB9LCBbcjldCQlAIGxvYWQgcmVzdWx0CisJdmVvcglxMCwgcTAsIHE0CUAgXj0gSVYKKwl2bW92CXExNSwgcTUJCUAgcTUgaG9sZHMgaW5wdXQKKwl2c3QxLjgJe3EwfSwgW3IxMF0JCUAgd3JpdGUgb3V0cHV0CisKK0xjYmNfZGVjX2RvbmU6CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwl2bW92LmkzMglxMCwgIzAKKwl2bW92LmkzMglxMSwgIzAKK0xjYmNfZGVjX2J6ZXJvOkAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJc3AhLCB7cTAscTF9CisJY21wCXNwLCByOQorCWJuZQlMY2JjX2RlY19iemVybworI2VuZGlmCisKKwltb3YJc3AsIHI5CisJYWRkCXNwLCAjMHgxMAkJCUAgYWRkIHNwLHI5LCMweDEwIGlzIG5vIGdvb2QgZm9yIHRodW1iCisJdnN0MS44CXtxMTV9LCBbcjhdCQlAIHJldHVybiBJVgorCVZGUF9BQklfUE9QCisJbGRtaWEJc3AhLCB7cjQscjUscjYscjcscjgscjkscjEwLCBwY30KKworCisuZ2xvYmwJX2JzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisucHJpdmF0ZV9leHRlcm4JX2JzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2JzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisjZW5kaWYKKy5hbGlnbgk1CitfYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisJY21wCXIyLCAjOAkJCUAgdXNlIHBsYWluIEFFUyBmb3IKKwlibG8JTGN0cl9lbmNfc2hvcnQJCQlAIHNtYWxsIHNpemVzCisKKwltb3YJaXAsIHNwCisJc3RtZGIJc3AhLCB7cjQscjUscjYscjcscjgscjkscjEwLCBscn0KKwlWRlBfQUJJX1BVU0gKKwlsZHIJcjgsIFtpcF0JCQlAIGN0ciBpcyAxc3QgYXJnIG9uIHRoZSBzdGFjaworCXN1YglzcCwgc3AsICMweDEwCQkJQCBzY3JhdGNoIHNwYWNlIHRvIGNhcnJ5IG92ZXIgdGhlIGN0cgorCW1vdglyOSwgc3AJCQkJQCBzYXZlIHNwCisKKwlsZHIJcjEwLCBbcjMsICMyNDBdCQlAIGdldCAjIG9mIHJvdW5kcworI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJQCBhbGxvY2F0ZSB0aGUga2V5IHNjaGVkdWxlIG9uIHRoZSBzdGFjaworCXN1YglyMTIsIHNwLCByMTAsIGxzbCM3CQlAIDEyOCBieXRlcyBwZXIgaW5uZXIgcm91bmQga2V5CisJYWRkCXIxMiwgIzk2CQkJQCBzaXplIG9mIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlCisKKwlAIHBvcHVsYXRlIHRoZSBrZXkgc2NoZWR1bGUKKwltb3YJcjQsIHIzCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEwCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJbW92CXNwLCByMTIJCQkJQCBzcCBpcyBzcAorCWJsCV9ic2Flc19rZXlfY29udmVydAorCXZlb3IJcTcscTcscTE1CUAgZml4IHVwIGxhc3Qgcm91bmQga2V5CisJdnN0bWlhCXIxMiwge3E3fQkJCUAgc2F2ZSBsYXN0IHJvdW5kIGtleQorCisJdmxkMS44CXtxMH0sIFtyOF0JCUAgbG9hZCBjb3VudGVyCisjaWZkZWYJX19BUFBMRV9fCisJbW92CXI4LCAjOmxvd2VyMTY6KExSRVZNMFNSLUxNMCkKKwlhZGQJcjgsIHI2LCByOAorI2Vsc2UKKwlhZGQJcjgsIHI2LCAjTFJFVk0wU1ItTE0wCUAgYm9ycm93IHI4CisjZW5kaWYKKwl2bGRtaWEJc3AsIHtxNH0JCUAgbG9hZCByb3VuZDAga2V5CisjZWxzZQorCWxkcglyMTIsIFtyMywgIzI0NF0KKwllb3JzCXIxMiwgIzEKKwliZXEJMGYKKworCUAgcG9wdWxhdGUgdGhlIGtleSBzY2hlZHVsZQorCXN0cglyMTIsIFtyMywgIzI0NF0KKwltb3YJcjQsIHIzCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEwCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJYWRkCXIxMiwgcjMsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJdmVvcglxNyxxNyxxMTUJQCBmaXggdXAgbGFzdCByb3VuZCBrZXkKKwl2c3RtaWEJcjEyLCB7cTd9CQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisKKy5hbGlnbgkyCisJYWRkCXIxMiwgcjMsICMyNDgKKwl2bGQxLjgJe3EwfSwgW3I4XQkJQCBsb2FkIGNvdW50ZXIKKwlhZHJsCXI4LCBMUkVWTTBTUgkJCUAgYm9ycm93IHI4CisJdmxkbWlhCXIxMiwge3E0fQkJCUAgbG9hZCByb3VuZDAga2V5CisJc3ViCXNwLCAjMHgxMAkJCUAgcGxhY2UgZm9yIGFkanVzdGVkIHJvdW5kMCBrZXkKKyNlbmRpZgorCisJdm1vdi5pMzIJcTgsIzEJCUAgY29tcG9zZSAxPDw5NgorCXZlb3IJcTkscTkscTkKKwl2cmV2MzIuOAlxMCxxMAorCXZleHQuOAlxOCxxOSxxOCwjNAorCXZyZXYzMi44CXE0LHE0CisJdmFkZC51MzIJcTkscTgscTgJQCBjb21wb3NlIDI8PDk2CisJdnN0bWlhCXNwLCB7cTR9CQlAIHNhdmUgYWRqdXN0ZWQgcm91bmQwIGtleQorCWIJTGN0cl9lbmNfbG9vcAorCisuYWxpZ24JNAorTGN0cl9lbmNfbG9vcDoKKwl2YWRkLnUzMglxMTAsIHE4LCBxOQlAIGNvbXBvc2UgMzw8OTYKKwl2YWRkLnUzMglxMSwgcTAsIHE4CUAgKzEKKwl2YWRkLnUzMglxMiwgcTAsIHE5CUAgKzIKKwl2YWRkLnUzMglxMywgcTAsIHExMAlAICszCisJdmFkZC51MzIJcTQsIHExLCBxMTAKKwl2YWRkLnUzMglxNSwgcTIsIHExMAorCXZhZGQudTMyCXE2LCBxMywgcTEwCisJdmFkZC51MzIJcTcsIHE0LCBxMTAKKwl2YWRkLnUzMglxMTAsIHE1LCBxMTAJQCBuZXh0IGNvdW50ZXIKKworCUAgQm9ycm93IHByb2xvZ3VlIGZyb20gX2JzYWVzX2VuY3J5cHQ4IHRvIHVzZSB0aGUgb3Bwb3J0dW5pdHkKKwlAIHRvIGZsaXAgYnl0ZSBvcmRlciBpbiAzMi1iaXQgY291bnRlcgorCisJdmxkbWlhCXNwLCB7cTl9CQlAIGxvYWQgcm91bmQwIGtleQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4MTAJCUAgcGFzcyBuZXh0IHJvdW5kIGtleQorI2Vsc2UKKwlhZGQJcjQsIHIzLCAjMjY0CisjZW5kaWYKKwl2bGRtaWEJcjgsIHtxOH0JCQlAIExSRVZNMFNSCisJbW92CXI1LCByMTAJCQlAIHBhc3Mgcm91bmRzCisJdnN0bWlhCXI5LCB7cTEwfQkJCUAgc2F2ZSBuZXh0IGNvdW50ZXIKKyNpZmRlZglfX0FQUExFX18KKwltb3YJcjYsICM6bG93ZXIxNjooTFJFVk0wU1ItTFNSKQorCXN1YglyNiwgcjgsIHI2CisjZWxzZQorCXN1YglyNiwgcjgsICNMUkVWTTBTUi1MU1IJQCBwYXNzIGNvbnN0YW50cworI2VuZGlmCisKKwlibAlfYnNhZXNfZW5jcnlwdDhfYWx0CisKKwlzdWJzCXIyLCByMiwgIzgKKwlibG8JTGN0cl9lbmNfbG9vcF9kb25lCisKKwl2bGQxLjgJe3E4LHE5fSwgW3IwXSEJQCBsb2FkIGlucHV0CisJdmxkMS44CXtxMTAscTExfSwgW3IwXSEKKwl2ZW9yCXEwLCBxOAorCXZlb3IJcTEsIHE5CisJdmxkMS44CXtxMTIscTEzfSwgW3IwXSEKKwl2ZW9yCXE0LCBxMTAKKwl2ZW9yCXE2LCBxMTEKKwl2bGQxLjgJe3ExNCxxMTV9LCBbcjBdIQorCXZlb3IJcTMsIHExMgorCXZzdDEuOAl7cTAscTF9LCBbcjFdIQlAIHdyaXRlIG91dHB1dAorCXZlb3IJcTcsIHExMworCXZlb3IJcTIsIHExNAorCXZzdDEuOAl7cTR9LCBbcjFdIQorCXZlb3IJcTUsIHExNQorCXZzdDEuOAl7cTZ9LCBbcjFdIQorCXZtb3YuaTMyCXE4LCAjMQkJCUAgY29tcG9zZSAxPDw5NgorCXZzdDEuOAl7cTN9LCBbcjFdIQorCXZlb3IJcTksIHE5LCBxOQorCXZzdDEuOAl7cTd9LCBbcjFdIQorCXZleHQuOAlxOCwgcTksIHE4LCAjNAorCXZzdDEuOAl7cTJ9LCBbcjFdIQorCXZhZGQudTMyCXE5LHE4LHE4CQlAIGNvbXBvc2UgMjw8OTYKKwl2c3QxLjgJe3E1fSwgW3IxXSEKKwl2bGRtaWEJcjksIHtxMH0JCQlAIGxvYWQgY291bnRlcgorCisJYm5lCUxjdHJfZW5jX2xvb3AKKwliCUxjdHJfZW5jX2RvbmUKKworLmFsaWduCTQKK0xjdHJfZW5jX2xvb3BfZG9uZToKKwlhZGQJcjIsIHIyLCAjOAorCXZsZDEuOAl7cTh9LCBbcjBdIQlAIGxvYWQgaW5wdXQKKwl2ZW9yCXEwLCBxOAorCXZzdDEuOAl7cTB9LCBbcjFdIQlAIHdyaXRlIG91dHB1dAorCWNtcAlyMiwgIzIKKwlibG8JTGN0cl9lbmNfZG9uZQorCXZsZDEuOAl7cTl9LCBbcjBdIQorCXZlb3IJcTEsIHE5CisJdnN0MS44CXtxMX0sIFtyMV0hCisJYmVxCUxjdHJfZW5jX2RvbmUKKwl2bGQxLjgJe3ExMH0sIFtyMF0hCisJdmVvcglxNCwgcTEwCisJdnN0MS44CXtxNH0sIFtyMV0hCisJY21wCXIyLCAjNAorCWJsbwlMY3RyX2VuY19kb25lCisJdmxkMS44CXtxMTF9LCBbcjBdIQorCXZlb3IJcTYsIHExMQorCXZzdDEuOAl7cTZ9LCBbcjFdIQorCWJlcQlMY3RyX2VuY19kb25lCisJdmxkMS44CXtxMTJ9LCBbcjBdIQorCXZlb3IJcTMsIHExMgorCXZzdDEuOAl7cTN9LCBbcjFdIQorCWNtcAlyMiwgIzYKKwlibG8JTGN0cl9lbmNfZG9uZQorCXZsZDEuOAl7cTEzfSwgW3IwXSEKKwl2ZW9yCXE3LCBxMTMKKwl2c3QxLjgJe3E3fSwgW3IxXSEKKwliZXEJTGN0cl9lbmNfZG9uZQorCXZsZDEuOAl7cTE0fSwgW3IwXQorCXZlb3IJcTIsIHExNAorCXZzdDEuOAl7cTJ9LCBbcjFdIQorCitMY3RyX2VuY19kb25lOgorCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCitMY3RyX2VuY19iemVybzpAIHdpcGUga2V5IHNjaGVkdWxlIFtpZiBhbnldCisJdnN0bWlhCXNwISwge3EwLHExfQorCWNtcAlzcCwgcjkKKwlibmUJTGN0cl9lbmNfYnplcm8KKyNlbHNlCisJdnN0bWlhCXNwLCB7cTAscTF9CisjZW5kaWYKKworCW1vdglzcCwgcjkKKwlhZGQJc3AsICMweDEwCQlAIGFkZCBzcCxyOSwjMHgxMCBpcyBubyBnb29kIGZvciB0aHVtYgorCVZGUF9BQklfUE9QCisJbGRtaWEJc3AhLCB7cjQscjUscjYscjcscjgscjkscjEwLCBwY30JQCByZXR1cm4KKworLmFsaWduCTQKK0xjdHJfZW5jX3Nob3J0OgorCWxkcglpcCwgW3NwXQkJQCBjdHIgcG9pbnRlciBpcyBwYXNzZWQgb24gc3RhY2sKKwlzdG1kYglzcCEsIHtyNCxyNSxyNixyNyxyOCwgbHJ9CisKKwltb3YJcjQsIHIwCQlAIGNvcHkgYXJndW1lbnRzCisJbW92CXI1LCByMQorCW1vdglyNiwgcjIKKwltb3YJcjcsIHIzCisJbGRyCXI4LCBbaXAsICMxMl0JCUAgbG9hZCBjb3VudGVyIExTVworCXZsZDEuOAl7cTF9LCBbaXBdCQlAIGxvYWQgd2hvbGUgY291bnRlciB2YWx1ZQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyOCwgcjgKKyNlbmRpZgorCXN1YglzcCwgc3AsICMweDEwCisJdnN0MS44CXtxMX0sIFtzcF0JCUAgY29weSBjb3VudGVyIHZhbHVlCisJc3ViCXNwLCBzcCwgIzB4MTAKKworTGN0cl9lbmNfc2hvcnRfbG9vcDoKKwlhZGQJcjAsIHNwLCAjMHgxMAkJQCBpbnB1dCBjb3VudGVyIHZhbHVlCisJbW92CXIxLCBzcAkJCUAgb3V0cHV0IG9uIHRoZSBzdGFjaworCW1vdglyMiwgcjcJCQlAIGtleQorCisJYmwJX0FFU19lbmNyeXB0CisKKwl2bGQxLjgJe3EwfSwgW3I0XSEJQCBsb2FkIGlucHV0CisJdmxkMS44CXtxMX0sIFtzcF0JCUAgbG9hZCBlbmNyeXB0ZWQgY291bnRlcgorCWFkZAlyOCwgcjgsICMxCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXIwLCByOAorCXN0cglyMCwgW3NwLCAjMHgxY10JCUAgbmV4dCBjb3VudGVyIHZhbHVlCisjZWxzZQorCXN0cglyOCwgW3NwLCAjMHgxY10JCUAgbmV4dCBjb3VudGVyIHZhbHVlCisjZW5kaWYKKwl2ZW9yCXEwLHEwLHExCisJdnN0MS44CXtxMH0sIFtyNV0hCUAgc3RvcmUgb3V0cHV0CisJc3VicwlyNiwgcjYsICMxCisJYm5lCUxjdHJfZW5jX3Nob3J0X2xvb3AKKworCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorCXZzdG1pYQlzcCEsIHtxMCxxMX0KKworCWxkbWlhCXNwISwge3I0LHI1LHI2LHI3LHI4LCBwY30KKworLmdsb2JsCV9ic2Flc194dHNfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuCV9ic2Flc194dHNfZW5jcnlwdAorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9ic2Flc194dHNfZW5jcnlwdAorI2VuZGlmCisuYWxpZ24JNAorX2JzYWVzX3h0c19lbmNyeXB0OgorCW1vdglpcCwgc3AKKwlzdG1kYglzcCEsIHtyNCxyNSxyNixyNyxyOCxyOSxyMTAsIGxyfQkJQCAweDIwCisJVkZQX0FCSV9QVVNICisJbW92CXI2LCBzcAkJCQlAIGZ1dHVyZSByMworCisJbW92CXI3LCByMAorCW1vdglyOCwgcjEKKwltb3YJcjksIHIyCisJbW92CXIxMCwgcjMKKworCXN1YglyMCwgc3AsICMweDEwCQkJQCAweDEwCisJYmljCXIwLCAjMHhmCQkJQCBhbGlnbiBhdCAxNiBieXRlcworCW1vdglzcCwgcjAKKworI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCWxkcglyMCwgW2lwXQkJCUAgcG9pbnRlciB0byBpbnB1dCB0d2VhaworI2Vsc2UKKwlAIGdlbmVyYXRlIGluaXRpYWwgdHdlYWsKKwlsZHIJcjAsIFtpcCwgIzRdCQkJQCBpdltdCisJbW92CXIxLCBzcAorCWxkcglyMiwgW2lwLCAjMF0JCQlAIGtleTIKKwlibAlfQUVTX2VuY3J5cHQKKwltb3YJcjAsc3AJCQkJQCBwb2ludGVyIHRvIGluaXRpYWwgdHdlYWsKKyNlbmRpZgorCisJbGRyCXIxLCBbcjEwLCAjMjQwXQkJQCBnZXQgIyBvZiByb3VuZHMKKwltb3YJcjMsIHI2CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlAIGFsbG9jYXRlIHRoZSBrZXkgc2NoZWR1bGUgb24gdGhlIHN0YWNrCisJc3ViCXIxMiwgc3AsIHIxLCBsc2wjNwkJQCAxMjggYnl0ZXMgcGVyIGlubmVyIHJvdW5kIGtleQorCUAgYWRkCXIxMiwgIzk2CQkJQCBzaXplIG9mIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlCisJc3ViCXIxMiwgIzQ4CQkJQCBwbGFjZSBmb3IgdHdlYWtbOV0KKworCUAgcG9wdWxhdGUgdGhlIGtleSBzY2hlZHVsZQorCW1vdglyNCwgcjEwCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwltb3YJc3AsIHIxMgorCWFkZAlyMTIsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorCWJsCV9ic2Flc19rZXlfY29udmVydAorCXZlb3IJcTcsIHE3LCBxMTUJQCBmaXggdXAgbGFzdCByb3VuZCBrZXkKKwl2c3RtaWEJcjEyLCB7cTd9CQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisjZWxzZQorCWxkcglyMTIsIFtyMTAsICMyNDRdCisJZW9ycwlyMTIsICMxCisJYmVxCTBmCisKKwlzdHIJcjEyLCBbcjEwLCAjMjQ0XQorCW1vdglyNCwgcjEwCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwlhZGQJcjEyLCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJdmVvcglxNywgcTcsIHExNQlAIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCXZzdG1pYQlyMTIsIHtxN30KKworLmFsaWduCTIKKwlzdWIJc3AsICMweDkwCQkJQCBwbGFjZSBmb3IgdHdlYWtbOV0KKyNlbmRpZgorCisJdmxkMS44CXtxOH0sIFtyMF0JCQlAIGluaXRpYWwgdHdlYWsKKwlhZHIJcjIsIEx4dHNfbWFnaWMKKworCXN1YnMJcjksICMweDgwCisJYmxvCUx4dHNfZW5jX3Nob3J0CisJYglMeHRzX2VuY19sb29wCisKKy5hbGlnbgk0CitMeHRzX2VuY19sb29wOgorCXZsZG1pYQlyMiwge3E1fQlAIGxvYWQgWFRTIG1hZ2ljCisJdnNoci5zNjQJcTYsIHE4LCAjNjMKKwltb3YJcjAsIHNwCisJdmFuZAlxNiwgcTYsIHE1CisJdmFkZC51NjQJcTksIHE4LCBxOAorCXZzdDEuNjQJe3E4fSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxOSwgIzYzCisJdmVvcglxOSwgcTksIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmFkZC51NjQJcTEwLCBxOSwgcTkKKwl2c3QxLjY0CXtxOX0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2c2hyLnM2NAlxNiwgcTEwLCAjNjMKKwl2ZW9yCXExMCwgcTEwLCBxNworCXZhbmQJcTYsIHE2LCBxNQorCXZsZDEuOAl7cTB9LCBbcjddIQorCXZhZGQudTY0CXExMSwgcTEwLCBxMTAKKwl2c3QxLjY0CXtxMTB9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHExMSwgIzYzCisJdmVvcglxMTEsIHExMSwgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2bGQxLjgJe3ExfSwgW3I3XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2YWRkLnU2NAlxMTIsIHExMSwgcTExCisJdnN0MS42NAl7cTExfSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTIsICM2MworCXZlb3IJcTEyLCBxMTIsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxMn0sIFtyN10hCisJdmVvcglxMSwgcTEsIHE5CisJdmFkZC51NjQJcTEzLCBxMTIsIHExMgorCXZzdDEuNjQJe3ExMn0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTEzLCAjNjMKKwl2ZW9yCXExMywgcTEzLCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTN9LCBbcjddIQorCXZlb3IJcTIsIHEyLCBxMTAKKwl2YWRkLnU2NAlxMTQsIHExMywgcTEzCisJdnN0MS42NAl7cTEzfSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTQsICM2MworCXZlb3IJcTE0LCBxMTQsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxNH0sIFtyN10hCisJdmVvcglxMywgcTMsIHExMQorCXZhZGQudTY0CXExNSwgcTE0LCBxMTQKKwl2c3QxLjY0CXtxMTR9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHExNSwgIzYzCisJdmVvcglxMTUsIHExNSwgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2bGQxLjgJe3E1fSwgW3I3XSEKKwl2ZW9yCXE0LCBxNCwgcTEyCisJdmFkZC51NjQJcTgsIHExNSwgcTE1CisJdnN0MS42NAl7cTE1fSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZlb3IJcTgsIHE4LCBxNworCXZzdDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZsZDEuOAl7cTYscTd9LCBbcjddIQorCXZlb3IJcTUsIHE1LCBxMTMKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTYsIHE2LCBxMTQKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCXZlb3IJcTcsIHE3LCBxMTUKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmxkMS42NAl7cTEyLHExM30sIFtyMCw6MTI4XSEKKwl2ZW9yCXExLCBxMSwgcTkKKwl2ZW9yCXE4LCBxNCwgcTEwCisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisJdmVvcglxOSwgcTYsIHExMQorCXZsZDEuNjQJe3ExNCxxMTV9LCBbcjAsOjEyOF0hCisJdmVvcglxMTAsIHEzLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2ZW9yCXExMSwgcTcsIHExMworCXZlb3IJcTEyLCBxMiwgcTE0CisJdnN0MS44CXtxMTAscTExfSwgW3I4XSEKKwl2ZW9yCXExMywgcTUsIHExNQorCXZzdDEuOAl7cTEyLHExM30sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKwlzdWJzCXI5LCAjMHg4MAorCWJwbAlMeHRzX2VuY19sb29wCisKK0x4dHNfZW5jX3Nob3J0OgorCWFkZHMJcjksICMweDcwCisJYm1pCUx4dHNfZW5jX2RvbmUKKworCXZsZG1pYQlyMiwge3E1fQlAIGxvYWQgWFRTIG1hZ2ljCisJdnNoci5zNjQJcTcsIHE4LCAjNjMKKwltb3YJcjAsIHNwCisJdmFuZAlxNywgcTcsIHE1CisJdmFkZC51NjQJcTksIHE4LCBxOAorCXZzdDEuNjQJe3E4fSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxOSwgIzYzCisJdmVvcglxOSwgcTksIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmFkZC51NjQJcTEwLCBxOSwgcTkKKwl2c3QxLjY0CXtxOX0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTEwLCAjNjMKKwl2ZW9yCXExMCwgcTEwLCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTB9LCBbcjddIQorCXN1YnMJcjksICMweDEwCisJYm1pCUx4dHNfZW5jXzEKKwl2YWRkLnU2NAlxMTEsIHExMCwgcTEwCisJdnN0MS42NAl7cTEwfSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTEsICM2MworCXZlb3IJcTExLCBxMTEsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxMX0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJTHh0c19lbmNfMgorCXZlb3IJcTAsIHEwLCBxOAorCXZhZGQudTY0CXExMiwgcTExLCBxMTEKKwl2c3QxLjY0CXtxMTF9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHExMiwgIzYzCisJdmVvcglxMTIsIHExMiwgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2bGQxLjgJe3EyfSwgW3I3XSEKKwlzdWJzCXI5LCAjMHgxMAorCWJtaQlMeHRzX2VuY18zCisJdmVvcglxMSwgcTEsIHE5CisJdmFkZC51NjQJcTEzLCBxMTIsIHExMgorCXZzdDEuNjQJe3ExMn0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2c2hyLnM2NAlxNiwgcTEzLCAjNjMKKwl2ZW9yCXExMywgcTEzLCBxNworCXZhbmQJcTYsIHE2LCBxNQorCXZsZDEuOAl7cTN9LCBbcjddIQorCXN1YnMJcjksICMweDEwCisJYm1pCUx4dHNfZW5jXzQKKwl2ZW9yCXEyLCBxMiwgcTEwCisJdmFkZC51NjQJcTE0LCBxMTMsIHExMworCXZzdDEuNjQJe3ExM30sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTE0LCAjNjMKKwl2ZW9yCXExNCwgcTE0LCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTR9LCBbcjddIQorCXN1YnMJcjksICMweDEwCisJYm1pCUx4dHNfZW5jXzUKKwl2ZW9yCXEzLCBxMywgcTExCisJdmFkZC51NjQJcTE1LCBxMTQsIHExNAorCXZzdDEuNjQJe3ExNH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2c2hyLnM2NAlxNiwgcTE1LCAjNjMKKwl2ZW9yCXExNSwgcTE1LCBxNworCXZhbmQJcTYsIHE2LCBxNQorCXZsZDEuOAl7cTV9LCBbcjddIQorCXN1YnMJcjksICMweDEwCisJYm1pCUx4dHNfZW5jXzYKKwl2ZW9yCXE0LCBxNCwgcTEyCisJc3ViCXI5LCAjMHgxMAorCXZzdDEuNjQJe3ExNX0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKwl2bGQxLjgJe3E2fSwgW3I3XSEKKwl2ZW9yCXE1LCBxNSwgcTEzCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXE2LCBxNiwgcTE0CisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmxkMS42NAl7cTEyLHExM30sIFtyMCw6MTI4XSEKKwl2ZW9yCXExLCBxMSwgcTkKKwl2ZW9yCXE4LCBxNCwgcTEwCisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisJdmVvcglxOSwgcTYsIHExMQorCXZsZDEuNjQJe3ExNH0sIFtyMCw6MTI4XSEKKwl2ZW9yCXExMCwgcTMsIHExMgorCXZzdDEuOAl7cTgscTl9LCBbcjhdIQorCXZlb3IJcTExLCBxNywgcTEzCisJdmVvcglxMTIsIHEyLCBxMTQKKwl2c3QxLjgJe3ExMCxxMTF9LCBbcjhdIQorCXZzdDEuOAl7cTEyfSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCUx4dHNfZW5jX2RvbmUKKy5hbGlnbgk0CitMeHRzX2VuY182OgorCXZlb3IJcTQsIHE0LCBxMTIKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTUsIHE1LCBxMTMKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE0LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNiwgcTExCisJdmVvcglxMTAsIHEzLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2ZW9yCXExMSwgcTcsIHExMworCXZzdDEuOAl7cTEwLHExMX0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYglMeHRzX2VuY19kb25lCisKK0AgcHV0IHRoaXMgaW4gcmFuZ2UgZm9yIGJvdGggQVJNIGFuZCBUaHVtYiBtb2RlIGFkciBpbnN0cnVjdGlvbnMKKy5hbGlnbgk1CitMeHRzX21hZ2ljOgorLnF1YWQJMSwgMHg4NworCisuYWxpZ24JNQorTHh0c19lbmNfNToKKwl2ZW9yCXEzLCBxMywgcTExCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXE0LCBxNCwgcTEyCisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmxkMS42NAl7cTEyfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE0LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNiwgcTExCisJdmVvcglxMTAsIHEzLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2c3QxLjgJe3ExMH0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYglMeHRzX2VuY19kb25lCisuYWxpZ24JNAorTHh0c19lbmNfNDoKKwl2ZW9yCXEyLCBxMiwgcTEwCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXEzLCBxMywgcTExCisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTQsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZlb3IJcTksIHE2LCBxMTEKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCUx4dHNfZW5jX2RvbmUKKy5hbGlnbgk0CitMeHRzX2VuY18zOgorCXZlb3IJcTEsIHExLCBxOQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxMiwgcTIsIHExMAorCW1vdglyNSwgcjEJCQlAIHBhc3Mgcm91bmRzCisJbW92CXIwLCBzcAorCisJYmwJX2JzYWVzX2VuY3J5cHQ4CisKKwl2bGQxLjY0CXtxOCxxOX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CXtxMTB9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTQsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZzdDEuOAl7cTh9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJTHh0c19lbmNfZG9uZQorLmFsaWduCTQKK0x4dHNfZW5jXzI6CisJdmVvcglxMCwgcTAsIHE4CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXExLCBxMSwgcTkKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYglMeHRzX2VuY19kb25lCisuYWxpZ24JNAorTHh0c19lbmNfMToKKwltb3YJcjAsIHNwCisJdmVvcglxMCwgcTAsIHE4CisJbW92CXIxLCBzcAorCXZzdDEuOAl7cTB9LCBbc3AsOjEyOF0KKwltb3YJcjIsIHIxMAorCW1vdglyNCwgcjMJCQkJQCBwcmVzZXJ2ZSBmcAorCisJYmwJX0FFU19lbmNyeXB0CisKKwl2bGQxLjgJe3EwfSwgW3NwLDoxMjhdCisJdmVvcglxMCwgcTAsIHE4CisJdnN0MS44CXtxMH0sIFtyOF0hCisJbW92CXIzLCByNAorCisJdm1vdglxOCwgcTkJCUAgbmV4dCByb3VuZCB0d2VhaworCitMeHRzX2VuY19kb25lOgorI2lmbmRlZglYVFNfQ0hBSU5fVFdFQUsKKwlhZGRzCXI5LCAjMHgxMAorCWJlcQlMeHRzX2VuY19yZXQKKwlzdWIJcjYsIHI4LCAjMHgxMAorCitMeHRzX2VuY19zdGVhbDoKKwlsZHJiCXIwLCBbcjddLCAjMQorCWxkcmIJcjEsIFtyOCwgIy0weDEwXQorCXN0cmIJcjAsIFtyOCwgIy0weDEwXQorCXN0cmIJcjEsIFtyOF0sICMxCisKKwlzdWJzCXI5LCAjMQorCWJoaQlMeHRzX2VuY19zdGVhbAorCisJdmxkMS44CXtxMH0sIFtyNl0KKwltb3YJcjAsIHNwCisJdmVvcglxMCwgcTAsIHE4CisJbW92CXIxLCBzcAorCXZzdDEuOAl7cTB9LCBbc3AsOjEyOF0KKwltb3YJcjIsIHIxMAorCW1vdglyNCwgcjMJCQlAIHByZXNlcnZlIGZwCisKKwlibAlfQUVTX2VuY3J5cHQKKworCXZsZDEuOAl7cTB9LCBbc3AsOjEyOF0KKwl2ZW9yCXEwLCBxMCwgcTgKKwl2c3QxLjgJe3EwfSwgW3I2XQorCW1vdglyMywgcjQKKyNlbmRpZgorCitMeHRzX2VuY19yZXQ6CisJYmljCXIwLCByMywgIzB4ZgorCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCWxkcglyMSwgW3IzLCAjMHgyMCtWRlBfQUJJX0ZSQU1FXQlAIGNoYWluIHR3ZWFrCisjZW5kaWYKK0x4dHNfZW5jX2J6ZXJvOkAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJc3AhLCB7cTAscTF9CisJY21wCXNwLCByMAorCWJuZQlMeHRzX2VuY19iemVybworCisJbW92CXNwLCByMworI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCXZzdDEuOAl7cTh9LCBbcjFdCisjZW5kaWYKKwlWRlBfQUJJX1BPUAorCWxkbWlhCXNwISwge3I0LHI1LHI2LHI3LHI4LHI5LHIxMCwgcGN9CUAgcmV0dXJuCisKKworCisuZ2xvYmwJX2JzYWVzX3h0c19kZWNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2JzYWVzX3h0c19kZWNyeXB0CisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2JzYWVzX3h0c19kZWNyeXB0CisjZW5kaWYKKy5hbGlnbgk0CitfYnNhZXNfeHRzX2RlY3J5cHQ6CisJbW92CWlwLCBzcAorCXN0bWRiCXNwISwge3I0LHI1LHI2LHI3LHI4LHI5LHIxMCwgbHJ9CQlAIDB4MjAKKwlWRlBfQUJJX1BVU0gKKwltb3YJcjYsIHNwCQkJCUAgZnV0dXJlIHIzCisKKwltb3YJcjcsIHIwCisJbW92CXI4LCByMQorCW1vdglyOSwgcjIKKwltb3YJcjEwLCByMworCisJc3ViCXIwLCBzcCwgIzB4MTAJCQlAIDB4MTAKKwliaWMJcjAsICMweGYJCQlAIGFsaWduIGF0IDE2IGJ5dGVzCisJbW92CXNwLCByMAorCisjaWZkZWYJWFRTX0NIQUlOX1RXRUFLCisJbGRyCXIwLCBbaXBdCQkJQCBwb2ludGVyIHRvIGlucHV0IHR3ZWFrCisjZWxzZQorCUAgZ2VuZXJhdGUgaW5pdGlhbCB0d2VhaworCWxkcglyMCwgW2lwLCAjNF0JCQlAIGl2W10KKwltb3YJcjEsIHNwCisJbGRyCXIyLCBbaXAsICMwXQkJCUAga2V5MgorCWJsCV9BRVNfZW5jcnlwdAorCW1vdglyMCwgc3AJCQkJQCBwb2ludGVyIHRvIGluaXRpYWwgdHdlYWsKKyNlbmRpZgorCisJbGRyCXIxLCBbcjEwLCAjMjQwXQkJQCBnZXQgIyBvZiByb3VuZHMKKwltb3YJcjMsIHI2CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlAIGFsbG9jYXRlIHRoZSBrZXkgc2NoZWR1bGUgb24gdGhlIHN0YWNrCisJc3ViCXIxMiwgc3AsIHIxLCBsc2wjNwkJQCAxMjggYnl0ZXMgcGVyIGlubmVyIHJvdW5kIGtleQorCUAgYWRkCXIxMiwgIzk2CQkJQCBzaXplIG9mIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlCisJc3ViCXIxMiwgIzQ4CQkJQCBwbGFjZSBmb3IgdHdlYWtbOV0KKworCUAgcG9wdWxhdGUgdGhlIGtleSBzY2hlZHVsZQorCW1vdglyNCwgcjEwCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwltb3YJc3AsIHIxMgorCWFkZAlyMTIsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorCWJsCV9ic2Flc19rZXlfY29udmVydAorCWFkZAlyNCwgc3AsICMweDkwCisJdmxkbWlhCXI0LCB7cTZ9CisJdnN0bWlhCXIxMiwgIHtxMTV9CQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKwl2ZW9yCXE3LCBxNywgcTYJQCBmaXggdXAgcm91bmQgMCBrZXkKKwl2c3RtaWEJcjQsIHtxN30KKyNlbHNlCisJbGRyCXIxMiwgW3IxMCwgIzI0NF0KKwllb3JzCXIxMiwgIzEKKwliZXEJMGYKKworCXN0cglyMTIsIFtyMTAsICMyNDRdCisJbW92CXI0LCByMTAJCQlAIHBhc3Mga2V5CisJbW92CXI1LCByMQkJCUAgcGFzcyAjIG9mIHJvdW5kcworCWFkZAlyMTIsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlhZGQJcjQsIHIxMCwgIzI0OAorCXZsZG1pYQlyNCwge3E2fQorCXZzdG1pYQlyMTIsICB7cTE1fQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisJdmVvcglxNywgcTcsIHE2CUAgZml4IHVwIHJvdW5kIDAga2V5CisJdnN0bWlhCXI0LCB7cTd9CisKKy5hbGlnbgkyCisJc3ViCXNwLCAjMHg5MAkJCUAgcGxhY2UgZm9yIHR3ZWFrWzldCisjZW5kaWYKKwl2bGQxLjgJe3E4fSwgW3IwXQkJCUAgaW5pdGlhbCB0d2VhaworCWFkcglyMiwgTHh0c19tYWdpYworCisjaWZuZGVmCVhUU19DSEFJTl9UV0VBSworCXRzdAlyOSwgIzB4ZgkJCUAgaWYgbm90IG11bHRpcGxlIG9mIDE2CisJaXQJbmUJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKwlzdWJuZQlyOSwgIzB4MTAJCQlAIHN1YnRyYWN0IGFub3RoZXIgMTYgYnl0ZXMKKyNlbmRpZgorCXN1YnMJcjksICMweDgwCisKKwlibG8JTHh0c19kZWNfc2hvcnQKKwliCUx4dHNfZGVjX2xvb3AKKworLmFsaWduCTQKK0x4dHNfZGVjX2xvb3A6CisJdmxkbWlhCXIyLCB7cTV9CUAgbG9hZCBYVFMgbWFnaWMKKwl2c2hyLnM2NAlxNiwgcTgsICM2MworCW1vdglyMCwgc3AKKwl2YW5kCXE2LCBxNiwgcTUKKwl2YWRkLnU2NAlxOSwgcTgsIHE4CisJdnN0MS42NAl7cTh9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHE5LCAjNjMKKwl2ZW9yCXE5LCBxOSwgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2YWRkLnU2NAlxMTAsIHE5LCBxOQorCXZzdDEuNjQJe3E5fSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTAsICM2MworCXZlb3IJcTEwLCBxMTAsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxMH0sIFtyN10hCisJdmFkZC51NjQJcTExLCBxMTAsIHExMAorCXZzdDEuNjQJe3ExMH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTExLCAjNjMKKwl2ZW9yCXExMSwgcTExLCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTF9LCBbcjddIQorCXZlb3IJcTAsIHEwLCBxOAorCXZhZGQudTY0CXExMiwgcTExLCBxMTEKKwl2c3QxLjY0CXtxMTF9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExMiwgIzYzCisJdmVvcglxMTIsIHExMiwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3EyfSwgW3I3XSEKKwl2ZW9yCXExLCBxMSwgcTkKKwl2YWRkLnU2NAlxMTMsIHExMiwgcTEyCisJdnN0MS42NAl7cTEyfSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTMsICM2MworCXZlb3IJcTEzLCBxMTMsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxM30sIFtyN10hCisJdmVvcglxMiwgcTIsIHExMAorCXZhZGQudTY0CXExNCwgcTEzLCBxMTMKKwl2c3QxLjY0CXtxMTN9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExNCwgIzYzCisJdmVvcglxMTQsIHExNCwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3E0fSwgW3I3XSEKKwl2ZW9yCXEzLCBxMywgcTExCisJdmFkZC51NjQJcTE1LCBxMTQsIHExNAorCXZzdDEuNjQJe3ExNH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTE1LCAjNjMKKwl2ZW9yCXExNSwgcTE1LCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTV9LCBbcjddIQorCXZlb3IJcTQsIHE0LCBxMTIKKwl2YWRkLnU2NAlxOCwgcTE1LCBxMTUKKwl2c3QxLjY0CXtxMTV9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdmVvcglxOCwgcTgsIHE3CisJdnN0MS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmxkMS44CXtxNixxN30sIFtyN10hCisJdmVvcglxNSwgcTUsIHExMworI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxNiwgcTYsIHExNAorCW1vdglyNSwgcjEJCQlAIHBhc3Mgcm91bmRzCisJdmVvcglxNywgcTcsIHExNQorCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE2LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNCwgcTExCisJdmxkMS42NAl7cTE0LHExNX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXExMCwgcTIsIHExMgorCXZzdDEuOAl7cTgscTl9LCBbcjhdIQorCXZlb3IJcTExLCBxNywgcTEzCisJdmVvcglxMTIsIHEzLCBxMTQKKwl2c3QxLjgJe3ExMCxxMTF9LCBbcjhdIQorCXZlb3IJcTEzLCBxNSwgcTE1CisJdnN0MS44CXtxMTIscTEzfSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXN1YnMJcjksICMweDgwCisJYnBsCUx4dHNfZGVjX2xvb3AKKworTHh0c19kZWNfc2hvcnQ6CisJYWRkcwlyOSwgIzB4NzAKKwlibWkJTHh0c19kZWNfZG9uZQorCisJdmxkbWlhCXIyLCB7cTV9CUAgbG9hZCBYVFMgbWFnaWMKKwl2c2hyLnM2NAlxNywgcTgsICM2MworCW1vdglyMCwgc3AKKwl2YW5kCXE3LCBxNywgcTUKKwl2YWRkLnU2NAlxOSwgcTgsIHE4CisJdnN0MS42NAl7cTh9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHE5LCAjNjMKKwl2ZW9yCXE5LCBxOSwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2YWRkLnU2NAlxMTAsIHE5LCBxOQorCXZzdDEuNjQJe3E5fSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTAsICM2MworCXZlb3IJcTEwLCBxMTAsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxMH0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJTHh0c19kZWNfMQorCXZhZGQudTY0CXExMSwgcTEwLCBxMTAKKwl2c3QxLjY0CXtxMTB9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExMSwgIzYzCisJdmVvcglxMTEsIHExMSwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3ExfSwgW3I3XSEKKwlzdWJzCXI5LCAjMHgxMAorCWJtaQlMeHRzX2RlY18yCisJdmVvcglxMCwgcTAsIHE4CisJdmFkZC51NjQJcTEyLCBxMTEsIHExMQorCXZzdDEuNjQJe3ExMX0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTEyLCAjNjMKKwl2ZW9yCXExMiwgcTEyLCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTJ9LCBbcjddIQorCXN1YnMJcjksICMweDEwCisJYm1pCUx4dHNfZGVjXzMKKwl2ZW9yCXExLCBxMSwgcTkKKwl2YWRkLnU2NAlxMTMsIHExMiwgcTEyCisJdnN0MS42NAl7cTEyfSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTMsICM2MworCXZlb3IJcTEzLCBxMTMsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxM30sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJTHh0c19kZWNfNAorCXZlb3IJcTIsIHEyLCBxMTAKKwl2YWRkLnU2NAlxMTQsIHExMywgcTEzCisJdnN0MS42NAl7cTEzfSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTQsICM2MworCXZlb3IJcTE0LCBxMTQsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxNH0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJTHh0c19kZWNfNQorCXZlb3IJcTMsIHEzLCBxMTEKKwl2YWRkLnU2NAlxMTUsIHExNCwgcTE0CisJdnN0MS42NAl7cTE0fSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTUsICM2MworCXZlb3IJcTE1LCBxMTUsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxNX0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJTHh0c19kZWNfNgorCXZlb3IJcTQsIHE0LCBxMTIKKwlzdWIJcjksICMweDEwCisJdnN0MS42NAl7cTE1fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZsZDEuOAl7cTZ9LCBbcjddIQorCXZlb3IJcTUsIHE1LCBxMTMKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTYsIHE2LCBxMTQKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE2LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNCwgcTExCisJdmxkMS42NAl7cTE0fSwgW3IwLDoxMjhdIQorCXZlb3IJcTEwLCBxMiwgcTEyCisJdnN0MS44CXtxOCxxOX0sIFtyOF0hCisJdmVvcglxMTEsIHE3LCBxMTMKKwl2ZW9yCXExMiwgcTMsIHExNAorCXZzdDEuOAl7cTEwLHExMX0sIFtyOF0hCisJdnN0MS44CXtxMTJ9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJTHh0c19kZWNfZG9uZQorLmFsaWduCTQKK0x4dHNfZGVjXzY6CisJdnN0MS42NAl7cTE0fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZlb3IJcTQsIHE0LCBxMTIKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTUsIHE1LCBxMTMKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE2LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNCwgcTExCisJdmVvcglxMTAsIHEyLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2ZW9yCXExMSwgcTcsIHExMworCXZzdDEuOAl7cTEwLHExMX0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYglMeHRzX2RlY19kb25lCisuYWxpZ24JNAorTHh0c19kZWNfNToKKwl2ZW9yCXEzLCBxMywgcTExCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXE0LCBxNCwgcTEyCisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZGVjcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmxkMS42NAl7cTEyfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE2LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNCwgcTExCisJdmVvcglxMTAsIHEyLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2c3QxLjgJe3ExMH0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYglMeHRzX2RlY19kb25lCisuYWxpZ24JNAorTHh0c19kZWNfNDoKKwl2ZW9yCXEyLCBxMiwgcTEwCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXEzLCBxMywgcTExCisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZGVjcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTYsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZlb3IJcTksIHE0LCBxMTEKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCUx4dHNfZGVjX2RvbmUKKy5hbGlnbgk0CitMeHRzX2RlY18zOgorCXZlb3IJcTEsIHExLCBxOQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxMiwgcTIsIHExMAorCW1vdglyNSwgcjEJCQlAIHBhc3Mgcm91bmRzCisJbW92CXIwLCBzcAorCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGQxLjY0CXtxOCxxOX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CXtxMTB9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTYsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZzdDEuOAl7cTh9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJTHh0c19kZWNfZG9uZQorLmFsaWduCTQKK0x4dHNfZGVjXzI6CisJdmVvcglxMCwgcTAsIHE4CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXExLCBxMSwgcTkKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYglMeHRzX2RlY19kb25lCisuYWxpZ24JNAorTHh0c19kZWNfMToKKwltb3YJcjAsIHNwCisJdmVvcglxMCwgcTAsIHE4CisJbW92CXIxLCBzcAorCXZzdDEuOAl7cTB9LCBbc3AsOjEyOF0KKwltb3YJcjUsIHIyCQkJQCBwcmVzZXJ2ZSBtYWdpYworCW1vdglyMiwgcjEwCisJbW92CXI0LCByMwkJCQlAIHByZXNlcnZlIGZwCisKKwlibAlfQUVTX2RlY3J5cHQKKworCXZsZDEuOAl7cTB9LCBbc3AsOjEyOF0KKwl2ZW9yCXEwLCBxMCwgcTgKKwl2c3QxLjgJe3EwfSwgW3I4XSEKKwltb3YJcjMsIHI0CisJbW92CXIyLCByNQorCisJdm1vdglxOCwgcTkJCUAgbmV4dCByb3VuZCB0d2VhaworCitMeHRzX2RlY19kb25lOgorI2lmbmRlZglYVFNfQ0hBSU5fVFdFQUsKKwlhZGRzCXI5LCAjMHgxMAorCWJlcQlMeHRzX2RlY19yZXQKKworCUAgY2FsY3VsYXRlIG9uZSByb3VuZCBvZiBleHRyYSB0d2VhayBmb3IgdGhlIHN0b2xlbiBjaXBoZXJ0ZXh0CisJdmxkbWlhCXIyLCB7cTV9CisJdnNoci5zNjQJcTYsIHE4LCAjNjMKKwl2YW5kCXE2LCBxNiwgcTUKKwl2YWRkLnU2NAlxOSwgcTgsIHE4CisJdnN3cAlkMTMsZDEyCisJdmVvcglxOSwgcTksIHE2CisKKwlAIHBlcmZvcm0gdGhlIGZpbmFsIGRlY3J5cHRpb24gd2l0aCB0aGUgbGFzdCB0d2VhayB2YWx1ZQorCXZsZDEuOAl7cTB9LCBbcjddIQorCW1vdglyMCwgc3AKKwl2ZW9yCXEwLCBxMCwgcTkKKwltb3YJcjEsIHNwCisJdnN0MS44CXtxMH0sIFtzcCw6MTI4XQorCW1vdglyMiwgcjEwCisJbW92CXI0LCByMwkJCUAgcHJlc2VydmUgZnAKKworCWJsCV9BRVNfZGVjcnlwdAorCisJdmxkMS44CXtxMH0sIFtzcCw6MTI4XQorCXZlb3IJcTAsIHEwLCBxOQorCXZzdDEuOAl7cTB9LCBbcjhdCisKKwltb3YJcjYsIHI4CitMeHRzX2RlY19zdGVhbDoKKwlsZHJiCXIxLCBbcjhdCisJbGRyYglyMCwgW3I3XSwgIzEKKwlzdHJiCXIxLCBbcjgsICMweDEwXQorCXN0cmIJcjAsIFtyOF0sICMxCisKKwlzdWJzCXI5LCAjMQorCWJoaQlMeHRzX2RlY19zdGVhbAorCisJdmxkMS44CXtxMH0sIFtyNl0KKwltb3YJcjAsIHNwCisJdmVvcglxMCwgcTgKKwltb3YJcjEsIHNwCisJdnN0MS44CXtxMH0sIFtzcCw6MTI4XQorCW1vdglyMiwgcjEwCisKKwlibAlfQUVTX2RlY3J5cHQKKworCXZsZDEuOAl7cTB9LCBbc3AsOjEyOF0KKwl2ZW9yCXEwLCBxMCwgcTgKKwl2c3QxLjgJe3EwfSwgW3I2XQorCW1vdglyMywgcjQKKyNlbmRpZgorCitMeHRzX2RlY19yZXQ6CisJYmljCXIwLCByMywgIzB4ZgorCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCWxkcglyMSwgW3IzLCAjMHgyMCtWRlBfQUJJX0ZSQU1FXQlAIGNoYWluIHR3ZWFrCisjZW5kaWYKK0x4dHNfZGVjX2J6ZXJvOkAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJc3AhLCB7cTAscTF9CisJY21wCXNwLCByMAorCWJuZQlMeHRzX2RlY19iemVybworCisJbW92CXNwLCByMworI2lmZGVmCVhUU19DSEFJTl9UV0VBSworCXZzdDEuOAl7cTh9LCBbcjFdCisjZW5kaWYKKwlWRlBfQUJJX1BPUAorCWxkbWlhCXNwISwge3I0LHI1LHI2LHI3LHI4LHI5LHIxMCwgcGN9CUAgcmV0dXJuCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gtYXJtdjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC1hcm12NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTE1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gtYXJtdjQuUwpAQCAtMCwwICsxLDU4OCBAQAorI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKworQCBTaWxlbmNlIEFSTXY4IGRlcHJlY2F0ZWQgSVQgaW5zdHJ1Y3Rpb24gd2FybmluZ3MuIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IGJvdGgKK0AgQVJNdjcgYW5kIEFSTXY4IHByb2Nlc3NvcnMgYW5kIGRvZXMgbm90IHVzZSBBUk12OCBpbnN0cnVjdGlvbnMuIChBUk12OCBQTVVMTAorQCBpbnN0cnVjdGlvbnMgYXJlIGluIGFlc3Y4LWFybXgucGwuKQorCisKKy50ZXh0CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKy5zeW50YXgJdW5pZmllZAorI2VuZGlmCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorLnRodW1iCisjZWxzZQorLmNvZGUJMzIKKyNlbmRpZgorCisjaWZkZWYgIF9fY2xhbmdfXworI2RlZmluZSBsZHJwbGIgIGxkcmJwbAorI2RlZmluZSBsZHJuZWIgIGxkcmJuZQorI2VuZGlmCisKKworLmFsaWduCTUKK3JlbV80Yml0OgorLnNob3J0CTB4MDAwMCwweDFDMjAsMHgzODQwLDB4MjQ2MAorLnNob3J0CTB4NzA4MCwweDZDQTAsMHg0OEMwLDB4NTRFMAorLnNob3J0CTB4RTEwMCwweEZEMjAsMHhEOTQwLDB4QzU2MAorLnNob3J0CTB4OTE4MCwweDhEQTAsMHhBOUMwLDB4QjVFMAorCisKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlyZW1fNGJpdF9nZXQKKyNlbmRpZgorcmVtXzRiaXRfZ2V0OgorI2lmIGRlZmluZWQoX190aHVtYjJfXykKKwlhZHIJcjIscmVtXzRiaXQKKyNlbHNlCisJc3ViCXIyLHBjLCM4KzMyCUAgJnJlbV80Yml0CisjZW5kaWYKKwliCUxyZW1fNGJpdF9nb3QKKwlub3AKKwlub3AKKworCisuZ2xvYmwJX2djbV9naGFzaF80Yml0CisucHJpdmF0ZV9leHRlcm4JX2djbV9naGFzaF80Yml0CisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2djbV9naGFzaF80Yml0CisjZW5kaWYKKy5hbGlnbgk0CitfZ2NtX2doYXNoXzRiaXQ6CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorCWFkcglyMTIscmVtXzRiaXQKKyNlbHNlCisJc3ViCXIxMixwYywjOCs0OAkJQCAmcmVtXzRiaXQKKyNlbmRpZgorCWFkZAlyMyxyMixyMwkJQCByMyB0byBwb2ludCBhdCB0aGUgZW5kCisJc3RtZGIJc3AhLHtyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLGxyfQkJQCBzYXZlIHIzL2VuZCB0b28KKworCWxkbWlhCXIxMix7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0JCUAgY29weSByZW1fNGJpdCAuLi4KKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTF9CQlAIC4uLiB0byBzdGFjaworCisJbGRyYglyMTIsW3IyLCMxNV0KKwlsZHJiCXIxNCxbcjAsIzE1XQorTG91dGVyOgorCWVvcglyMTIscjEyLHIxNAorCWFuZAlyMTQscjEyLCMweGYwCisJYW5kCXIxMixyMTIsIzB4MGYKKwltb3YJcjMsIzE0CisKKwlhZGQJcjcscjEscjEyLGxzbCM0CisJbGRtaWEJcjcse3I0LHI1LHI2LHI3fQlAIGxvYWQgSHRibFtubG9dCisJYWRkCXIxMSxyMSxyMTQKKwlsZHJiCXIxMixbcjIsIzE0XQorCisJYW5kCXIxNCxyNCwjMHhmCQlAIHJlbQorCWxkbWlhCXIxMSx7cjgscjkscjEwLHIxMX0JQCBsb2FkIEh0YmxbbmhpXQorCWFkZAlyMTQscjE0LHIxNAorCWVvcglyNCxyOCxyNCxsc3IjNAorCWxkcmgJcjgsW3NwLHIxNF0JCUAgcmVtXzRiaXRbcmVtXQorCWVvcglyNCxyNCxyNSxsc2wjMjgKKwlsZHJiCXIxNCxbcjAsIzE0XQorCWVvcglyNSxyOSxyNSxsc3IjNAorCWVvcglyNSxyNSxyNixsc2wjMjgKKwllb3IJcjYscjEwLHI2LGxzciM0CisJZW9yCXI2LHI2LHI3LGxzbCMyOAorCWVvcglyNyxyMTEscjcsbHNyIzQKKwllb3IJcjEyLHIxMixyMTQKKwlhbmQJcjE0LHIxMiwjMHhmMAorCWFuZAlyMTIscjEyLCMweDBmCisJZW9yCXI3LHI3LHI4LGxzbCMxNgorCitMaW5uZXI6CisJYWRkCXIxMSxyMSxyMTIsbHNsIzQKKwlhbmQJcjEyLHI0LCMweGYJCUAgcmVtCisJc3VicwlyMyxyMywjMQorCWFkZAlyMTIscjEyLHIxMgorCWxkbWlhCXIxMSx7cjgscjkscjEwLHIxMX0JQCBsb2FkIEh0YmxbbmxvXQorCWVvcglyNCxyOCxyNCxsc3IjNAorCWVvcglyNCxyNCxyNSxsc2wjMjgKKwllb3IJcjUscjkscjUsbHNyIzQKKwllb3IJcjUscjUscjYsbHNsIzI4CisJbGRyaAlyOCxbc3AscjEyXQkJQCByZW1fNGJpdFtyZW1dCisJZW9yCXI2LHIxMCxyNixsc3IjNAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdAlwbAorI2VuZGlmCisJbGRycGxiCXIxMixbcjIscjNdCisJZW9yCXI2LHI2LHI3LGxzbCMyOAorCWVvcglyNyxyMTEscjcsbHNyIzQKKworCWFkZAlyMTEscjEscjE0CisJYW5kCXIxNCxyNCwjMHhmCQlAIHJlbQorCWVvcglyNyxyNyxyOCxsc2wjMTYJQCBePSByZW1fNGJpdFtyZW1dCisJYWRkCXIxNCxyMTQscjE0CisJbGRtaWEJcjExLHtyOCxyOSxyMTAscjExfQlAIGxvYWQgSHRibFtuaGldCisJZW9yCXI0LHI4LHI0LGxzciM0CisjaWZkZWYJX190aHVtYjJfXworCWl0CXBsCisjZW5kaWYKKwlsZHJwbGIJcjgsW3IwLHIzXQorCWVvcglyNCxyNCxyNSxsc2wjMjgKKwllb3IJcjUscjkscjUsbHNyIzQKKwlsZHJoCXI5LFtzcCxyMTRdCisJZW9yCXI1LHI1LHI2LGxzbCMyOAorCWVvcglyNixyMTAscjYsbHNyIzQKKwllb3IJcjYscjYscjcsbHNsIzI4CisjaWZkZWYJX190aHVtYjJfXworCWl0CXBsCisjZW5kaWYKKwllb3JwbAlyMTIscjEyLHI4CisJZW9yCXI3LHIxMSxyNyxsc3IjNAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJcGwKKyNlbmRpZgorCWFuZHBsCXIxNCxyMTIsIzB4ZjAKKwlhbmRwbAlyMTIscjEyLCMweDBmCisJZW9yCXI3LHI3LHI5LGxzbCMxNglAIF49IHJlbV80Yml0W3JlbV0KKwlicGwJTGlubmVyCisKKwlsZHIJcjMsW3NwLCMzMl0JCUAgcmUtbG9hZCByMy9lbmQKKwlhZGQJcjIscjIsIzE2CisJbW92CXIxNCxyNAorI2lmIF9fQVJNX0FSQ0hfXz49NyAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwlyZXYJcjQscjQKKwlzdHIJcjQsW3IwLCMxMl0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cglyNCxbcjAsIzEyXQorI2Vsc2UKKwltb3YJcjkscjQsbHNyIzgKKwlzdHJiCXI0LFtyMCwjMTIrM10KKwltb3YJcjEwLHI0LGxzciMxNgorCXN0cmIJcjksW3IwLCMxMisyXQorCW1vdglyMTEscjQsbHNyIzI0CisJc3RyYglyMTAsW3IwLCMxMisxXQorCXN0cmIJcjExLFtyMCwjMTJdCisjZW5kaWYKKwljbXAJcjIscjMKKyNpZiBfX0FSTV9BUkNIX18+PTcgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJcmV2CXI1LHI1CisJc3RyCXI1LFtyMCwjOF0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cglyNSxbcjAsIzhdCisjZWxzZQorCW1vdglyOSxyNSxsc3IjOAorCXN0cmIJcjUsW3IwLCM4KzNdCisJbW92CXIxMCxyNSxsc3IjMTYKKwlzdHJiCXI5LFtyMCwjOCsyXQorCW1vdglyMTEscjUsbHNyIzI0CisJc3RyYglyMTAsW3IwLCM4KzFdCisJc3RyYglyMTEsW3IwLCM4XQorI2VuZGlmCisKKyNpZmRlZiBfX3RodW1iMl9fCisJaXQJbmUKKyNlbmRpZgorCWxkcm5lYglyMTIsW3IyLCMxNV0KKyNpZiBfX0FSTV9BUkNIX18+PTcgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJcmV2CXI2LHI2CisJc3RyCXI2LFtyMCwjNF0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cglyNixbcjAsIzRdCisjZWxzZQorCW1vdglyOSxyNixsc3IjOAorCXN0cmIJcjYsW3IwLCM0KzNdCisJbW92CXIxMCxyNixsc3IjMTYKKwlzdHJiCXI5LFtyMCwjNCsyXQorCW1vdglyMTEscjYsbHNyIzI0CisJc3RyYglyMTAsW3IwLCM0KzFdCisJc3RyYglyMTEsW3IwLCM0XQorI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18+PTcgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJcmV2CXI3LHI3CisJc3RyCXI3LFtyMCwjMF0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cglyNyxbcjAsIzBdCisjZWxzZQorCW1vdglyOSxyNyxsc3IjOAorCXN0cmIJcjcsW3IwLCMwKzNdCisJbW92CXIxMCxyNyxsc3IjMTYKKwlzdHJiCXI5LFtyMCwjMCsyXQorCW1vdglyMTEscjcsbHNyIzI0CisJc3RyYglyMTAsW3IwLCMwKzFdCisJc3RyYglyMTEsW3IwLCMwXQorI2VuZGlmCisKKwlibmUJTG91dGVyCisKKwlhZGQJc3Asc3AsIzM2CisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisKKworLmdsb2JsCV9nY21fZ211bHRfNGJpdAorLnByaXZhdGVfZXh0ZXJuCV9nY21fZ211bHRfNGJpdAorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9nY21fZ211bHRfNGJpdAorI2VuZGlmCitfZ2NtX2dtdWx0XzRiaXQ6CisJc3RtZGIJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLGxyfQorCWxkcmIJcjEyLFtyMCwjMTVdCisJYglyZW1fNGJpdF9nZXQKK0xyZW1fNGJpdF9nb3Q6CisJYW5kCXIxNCxyMTIsIzB4ZjAKKwlhbmQJcjEyLHIxMiwjMHgwZgorCW1vdglyMywjMTQKKworCWFkZAlyNyxyMSxyMTIsbHNsIzQKKwlsZG1pYQlyNyx7cjQscjUscjYscjd9CUAgbG9hZCBIdGJsW25sb10KKwlsZHJiCXIxMixbcjAsIzE0XQorCisJYWRkCXIxMSxyMSxyMTQKKwlhbmQJcjE0LHI0LCMweGYJCUAgcmVtCisJbGRtaWEJcjExLHtyOCxyOSxyMTAscjExfQlAIGxvYWQgSHRibFtuaGldCisJYWRkCXIxNCxyMTQscjE0CisJZW9yCXI0LHI4LHI0LGxzciM0CisJbGRyaAlyOCxbcjIscjE0XQlAIHJlbV80Yml0W3JlbV0KKwllb3IJcjQscjQscjUsbHNsIzI4CisJZW9yCXI1LHI5LHI1LGxzciM0CisJZW9yCXI1LHI1LHI2LGxzbCMyOAorCWVvcglyNixyMTAscjYsbHNyIzQKKwllb3IJcjYscjYscjcsbHNsIzI4CisJZW9yCXI3LHIxMSxyNyxsc3IjNAorCWFuZAlyMTQscjEyLCMweGYwCisJZW9yCXI3LHI3LHI4LGxzbCMxNgorCWFuZAlyMTIscjEyLCMweDBmCisKK0xvb3A6CisJYWRkCXIxMSxyMSxyMTIsbHNsIzQKKwlhbmQJcjEyLHI0LCMweGYJCUAgcmVtCisJc3VicwlyMyxyMywjMQorCWFkZAlyMTIscjEyLHIxMgorCWxkbWlhCXIxMSx7cjgscjkscjEwLHIxMX0JQCBsb2FkIEh0YmxbbmxvXQorCWVvcglyNCxyOCxyNCxsc3IjNAorCWVvcglyNCxyNCxyNSxsc2wjMjgKKwllb3IJcjUscjkscjUsbHNyIzQKKwllb3IJcjUscjUscjYsbHNsIzI4CisJbGRyaAlyOCxbcjIscjEyXQlAIHJlbV80Yml0W3JlbV0KKwllb3IJcjYscjEwLHI2LGxzciM0CisjaWZkZWYJX190aHVtYjJfXworCWl0CXBsCisjZW5kaWYKKwlsZHJwbGIJcjEyLFtyMCxyM10KKwllb3IJcjYscjYscjcsbHNsIzI4CisJZW9yCXI3LHIxMSxyNyxsc3IjNAorCisJYWRkCXIxMSxyMSxyMTQKKwlhbmQJcjE0LHI0LCMweGYJCUAgcmVtCisJZW9yCXI3LHI3LHI4LGxzbCMxNglAIF49IHJlbV80Yml0W3JlbV0KKwlhZGQJcjE0LHIxNCxyMTQKKwlsZG1pYQlyMTEse3I4LHI5LHIxMCxyMTF9CUAgbG9hZCBIdGJsW25oaV0KKwllb3IJcjQscjgscjQsbHNyIzQKKwllb3IJcjQscjQscjUsbHNsIzI4CisJZW9yCXI1LHI5LHI1LGxzciM0CisJbGRyaAlyOCxbcjIscjE0XQlAIHJlbV80Yml0W3JlbV0KKwllb3IJcjUscjUscjYsbHNsIzI4CisJZW9yCXI2LHIxMCxyNixsc3IjNAorCWVvcglyNixyNixyNyxsc2wjMjgKKwllb3IJcjcscjExLHI3LGxzciM0CisjaWZkZWYJX190aHVtYjJfXworCWl0dAlwbAorI2VuZGlmCisJYW5kcGwJcjE0LHIxMiwjMHhmMAorCWFuZHBsCXIxMixyMTIsIzB4MGYKKwllb3IJcjcscjcscjgsbHNsIzE2CUAgXj0gcmVtXzRiaXRbcmVtXQorCWJwbAlMb29wCisjaWYgX19BUk1fQVJDSF9fPj03ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXJldglyNCxyNAorCXN0cglyNCxbcjAsIzEyXQorI2VsaWYgZGVmaW5lZChfX0FSTUVCX18pCisJc3RyCXI0LFtyMCwjMTJdCisjZWxzZQorCW1vdglyOSxyNCxsc3IjOAorCXN0cmIJcjQsW3IwLCMxMiszXQorCW1vdglyMTAscjQsbHNyIzE2CisJc3RyYglyOSxbcjAsIzEyKzJdCisJbW92CXIxMSxyNCxsc3IjMjQKKwlzdHJiCXIxMCxbcjAsIzEyKzFdCisJc3RyYglyMTEsW3IwLCMxMl0KKyNlbmRpZgorCisjaWYgX19BUk1fQVJDSF9fPj03ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXJldglyNSxyNQorCXN0cglyNSxbcjAsIzhdCisjZWxpZiBkZWZpbmVkKF9fQVJNRUJfXykKKwlzdHIJcjUsW3IwLCM4XQorI2Vsc2UKKwltb3YJcjkscjUsbHNyIzgKKwlzdHJiCXI1LFtyMCwjOCszXQorCW1vdglyMTAscjUsbHNyIzE2CisJc3RyYglyOSxbcjAsIzgrMl0KKwltb3YJcjExLHI1LGxzciMyNAorCXN0cmIJcjEwLFtyMCwjOCsxXQorCXN0cmIJcjExLFtyMCwjOF0KKyNlbmRpZgorCisjaWYgX19BUk1fQVJDSF9fPj03ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXJldglyNixyNgorCXN0cglyNixbcjAsIzRdCisjZWxpZiBkZWZpbmVkKF9fQVJNRUJfXykKKwlzdHIJcjYsW3IwLCM0XQorI2Vsc2UKKwltb3YJcjkscjYsbHNyIzgKKwlzdHJiCXI2LFtyMCwjNCszXQorCW1vdglyMTAscjYsbHNyIzE2CisJc3RyYglyOSxbcjAsIzQrMl0KKwltb3YJcjExLHI2LGxzciMyNAorCXN0cmIJcjEwLFtyMCwjNCsxXQorCXN0cmIJcjExLFtyMCwjNF0KKyNlbmRpZgorCisjaWYgX19BUk1fQVJDSF9fPj03ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXJldglyNyxyNworCXN0cglyNyxbcjAsIzBdCisjZWxpZiBkZWZpbmVkKF9fQVJNRUJfXykKKwlzdHIJcjcsW3IwLCMwXQorI2Vsc2UKKwltb3YJcjkscjcsbHNyIzgKKwlzdHJiCXI3LFtyMCwjMCszXQorCW1vdglyMTAscjcsbHNyIzE2CisJc3RyYglyOSxbcjAsIzArMl0KKwltb3YJcjExLHI3LGxzciMyNAorCXN0cmIJcjEwLFtyMCwjMCsxXQorCXN0cmIJcjExLFtyMCwjMF0KKyNlbmRpZgorCisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisKKworCisuZ2xvYmwJX2djbV9pbml0X25lb24KKy5wcml2YXRlX2V4dGVybglfZ2NtX2luaXRfbmVvbgorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9nY21faW5pdF9uZW9uCisjZW5kaWYKKy5hbGlnbgk0CitfZ2NtX2luaXRfbmVvbjoKKwl2bGQxLjY0CWQ3LFtyMV0hCQlAIGxvYWQgSAorCXZtb3YuaTgJcTgsIzB4ZTEKKwl2bGQxLjY0CWQ2LFtyMV0KKwl2c2hsLmk2NAlkMTcsIzU3CisJdnNoci51NjQJZDE2LCM2MwkJQCB0MD0weGMyLi4uLjAxCisJdmR1cC44CXE5LGQ3WzddCisJdnNoci51NjQJZDI2LGQ2LCM2MworCXZzaHIuczgJcTksIzcJCQlAIGJyb2FkY2FzdCBjYXJyeSBiaXQKKwl2c2hsLmk2NAlxMyxxMywjMQorCXZhbmQJcTgscTgscTkKKwl2b3JyCWQ3LGQyNgkJQCBIPDw8PTEKKwl2ZW9yCXEzLHEzLHE4CQlAIHR3aXN0ZWQgSAorCXZzdG1pYQlyMCx7cTN9CisKKwlieAlscgkJCQkJQCBieCBscgorCisKKy5nbG9ibAlfZ2NtX2dtdWx0X25lb24KKy5wcml2YXRlX2V4dGVybglfZ2NtX2dtdWx0X25lb24KKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfZ2NtX2dtdWx0X25lb24KKyNlbmRpZgorLmFsaWduCTQKK19nY21fZ211bHRfbmVvbjoKKwl2bGQxLjY0CWQ3LFtyMF0hCQlAIGxvYWQgWGkKKwl2bGQxLjY0CWQ2LFtyMF0hCisJdm1vdi5pNjQJZDI5LCMweDAwMDBmZmZmZmZmZmZmZmYKKwl2bGRtaWEJcjEse2QyNixkMjd9CUAgbG9hZCB0d2lzdGVkIEgKKwl2bW92Lmk2NAlkMzAsIzB4MDAwMDAwMDBmZmZmZmZmZgorI2lmZGVmIF9fQVJNRUxfXworCXZyZXY2NC44CXEzLHEzCisjZW5kaWYKKwl2bW92Lmk2NAlkMzEsIzB4MDAwMDAwMDAwMDAwZmZmZgorCXZlb3IJZDI4LGQyNixkMjcJCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJbW92CXIzLCMxNgorCWIJTGdtdWx0X25lb24KKworCisuZ2xvYmwJX2djbV9naGFzaF9uZW9uCisucHJpdmF0ZV9leHRlcm4JX2djbV9naGFzaF9uZW9uCisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX2djbV9naGFzaF9uZW9uCisjZW5kaWYKKy5hbGlnbgk0CitfZ2NtX2doYXNoX25lb246CisJdmxkMS42NAlkMSxbcjBdIQkJQCBsb2FkIFhpCisJdmxkMS42NAlkMCxbcjBdIQorCXZtb3YuaTY0CWQyOSwjMHgwMDAwZmZmZmZmZmZmZmZmCisJdmxkbWlhCXIxLHtkMjYsZDI3fQlAIGxvYWQgdHdpc3RlZCBICisJdm1vdi5pNjQJZDMwLCMweDAwMDAwMDAwZmZmZmZmZmYKKyNpZmRlZiBfX0FSTUVMX18KKwl2cmV2NjQuOAlxMCxxMAorI2VuZGlmCisJdm1vdi5pNjQJZDMxLCMweDAwMDAwMDAwMDAwMGZmZmYKKwl2ZW9yCWQyOCxkMjYsZDI3CQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCitMb29wX25lb246CisJdmxkMS42NAlkNyxbcjJdIQkJQCBsb2FkIGlucAorCXZsZDEuNjQJZDYsW3IyXSEKKyNpZmRlZiBfX0FSTUVMX18KKwl2cmV2NjQuOAlxMyxxMworI2VuZGlmCisJdmVvcglxMyxxMAkJCUAgaW5wXj1YaQorTGdtdWx0X25lb246CisJdmV4dC44CWQxNiwgZDI2LCBkMjYsICMxCUAgQTEKKwl2bXVsbC5wOAlxOCwgZDE2LCBkNgkJQCBGID0gQTEqQgorCXZleHQuOAlkMCwgZDYsIGQ2LCAjMQlAIEIxCisJdm11bGwucDgJcTAsIGQyNiwgZDAJCUAgRSA9IEEqQjEKKwl2ZXh0LjgJZDE4LCBkMjYsIGQyNiwgIzIJQCBBMgorCXZtdWxsLnA4CXE5LCBkMTgsIGQ2CQlAIEggPSBBMipCCisJdmV4dC44CWQyMiwgZDYsIGQ2LCAjMglAIEIyCisJdm11bGwucDgJcTExLCBkMjYsIGQyMgkJQCBHID0gQSpCMgorCXZleHQuOAlkMjAsIGQyNiwgZDI2LCAjMwlAIEEzCisJdmVvcglxOCwgcTgsIHEwCQlAIEwgPSBFICsgRgorCXZtdWxsLnA4CXExMCwgZDIwLCBkNgkJQCBKID0gQTMqQgorCXZleHQuOAlkMCwgZDYsIGQ2LCAjMwlAIEIzCisJdmVvcglxOSwgcTksIHExMQkJQCBNID0gRyArIEgKKwl2bXVsbC5wOAlxMCwgZDI2LCBkMAkJQCBJID0gQSpCMworCXZlb3IJZDE2LCBkMTYsIGQxNwlAIHQwID0gKEwpIChQMCArIFAxKSA8PCA4CisJdmFuZAlkMTcsIGQxNywgZDI5CisJdmV4dC44CWQyMiwgZDYsIGQ2LCAjNAlAIEI0CisJdmVvcglkMTgsIGQxOCwgZDE5CUAgdDEgPSAoTSkgKFAyICsgUDMpIDw8IDE2CisJdmFuZAlkMTksIGQxOSwgZDMwCisJdm11bGwucDgJcTExLCBkMjYsIGQyMgkJQCBLID0gQSpCNAorCXZlb3IJcTEwLCBxMTAsIHEwCQlAIE4gPSBJICsgSgorCXZlb3IJZDE2LCBkMTYsIGQxNworCXZlb3IJZDE4LCBkMTgsIGQxOQorCXZlb3IJZDIwLCBkMjAsIGQyMQlAIHQyID0gKE4pIChQNCArIFA1KSA8PCAyNAorCXZhbmQJZDIxLCBkMjEsIGQzMQorCXZleHQuOAlxOCwgcTgsIHE4LCAjMTUKKwl2ZW9yCWQyMiwgZDIyLCBkMjMJQCB0MyA9IChLKSAoUDYgKyBQNykgPDwgMzIKKwl2bW92Lmk2NAlkMjMsICMwCisJdmV4dC44CXE5LCBxOSwgcTksICMxNAorCXZlb3IJZDIwLCBkMjAsIGQyMQorCXZtdWxsLnA4CXEwLCBkMjYsIGQ2CQlAIEQgPSBBKkIKKwl2ZXh0LjgJcTExLCBxMTEsIHExMSwgIzEyCisJdmV4dC44CXExMCwgcTEwLCBxMTAsICMxMworCXZlb3IJcTgsIHE4LCBxOQorCXZlb3IJcTEwLCBxMTAsIHExMQorCXZlb3IJcTAsIHEwLCBxOAorCXZlb3IJcTAsIHEwLCBxMTAKKwl2ZW9yCWQ2LGQ2LGQ3CUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJdmV4dC44CWQxNiwgZDI4LCBkMjgsICMxCUAgQTEKKwl2bXVsbC5wOAlxOCwgZDE2LCBkNgkJQCBGID0gQTEqQgorCXZleHQuOAlkMiwgZDYsIGQ2LCAjMQlAIEIxCisJdm11bGwucDgJcTEsIGQyOCwgZDIJCUAgRSA9IEEqQjEKKwl2ZXh0LjgJZDE4LCBkMjgsIGQyOCwgIzIJQCBBMgorCXZtdWxsLnA4CXE5LCBkMTgsIGQ2CQlAIEggPSBBMipCCisJdmV4dC44CWQyMiwgZDYsIGQ2LCAjMglAIEIyCisJdm11bGwucDgJcTExLCBkMjgsIGQyMgkJQCBHID0gQSpCMgorCXZleHQuOAlkMjAsIGQyOCwgZDI4LCAjMwlAIEEzCisJdmVvcglxOCwgcTgsIHExCQlAIEwgPSBFICsgRgorCXZtdWxsLnA4CXExMCwgZDIwLCBkNgkJQCBKID0gQTMqQgorCXZleHQuOAlkMiwgZDYsIGQ2LCAjMwlAIEIzCisJdmVvcglxOSwgcTksIHExMQkJQCBNID0gRyArIEgKKwl2bXVsbC5wOAlxMSwgZDI4LCBkMgkJQCBJID0gQSpCMworCXZlb3IJZDE2LCBkMTYsIGQxNwlAIHQwID0gKEwpIChQMCArIFAxKSA8PCA4CisJdmFuZAlkMTcsIGQxNywgZDI5CisJdmV4dC44CWQyMiwgZDYsIGQ2LCAjNAlAIEI0CisJdmVvcglkMTgsIGQxOCwgZDE5CUAgdDEgPSAoTSkgKFAyICsgUDMpIDw8IDE2CisJdmFuZAlkMTksIGQxOSwgZDMwCisJdm11bGwucDgJcTExLCBkMjgsIGQyMgkJQCBLID0gQSpCNAorCXZlb3IJcTEwLCBxMTAsIHExCQlAIE4gPSBJICsgSgorCXZlb3IJZDE2LCBkMTYsIGQxNworCXZlb3IJZDE4LCBkMTgsIGQxOQorCXZlb3IJZDIwLCBkMjAsIGQyMQlAIHQyID0gKE4pIChQNCArIFA1KSA8PCAyNAorCXZhbmQJZDIxLCBkMjEsIGQzMQorCXZleHQuOAlxOCwgcTgsIHE4LCAjMTUKKwl2ZW9yCWQyMiwgZDIyLCBkMjMJQCB0MyA9IChLKSAoUDYgKyBQNykgPDwgMzIKKwl2bW92Lmk2NAlkMjMsICMwCisJdmV4dC44CXE5LCBxOSwgcTksICMxNAorCXZlb3IJZDIwLCBkMjAsIGQyMQorCXZtdWxsLnA4CXExLCBkMjgsIGQ2CQlAIEQgPSBBKkIKKwl2ZXh0LjgJcTExLCBxMTEsIHExMSwgIzEyCisJdmV4dC44CXExMCwgcTEwLCBxMTAsICMxMworCXZlb3IJcTgsIHE4LCBxOQorCXZlb3IJcTEwLCBxMTAsIHExMQorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTEsIHExLCBxMTAKKwl2ZXh0LjgJZDE2LCBkMjcsIGQyNywgIzEJQCBBMQorCXZtdWxsLnA4CXE4LCBkMTYsIGQ3CQlAIEYgPSBBMSpCCisJdmV4dC44CWQ0LCBkNywgZDcsICMxCUAgQjEKKwl2bXVsbC5wOAlxMiwgZDI3LCBkNAkJQCBFID0gQSpCMQorCXZleHQuOAlkMTgsIGQyNywgZDI3LCAjMglAIEEyCisJdm11bGwucDgJcTksIGQxOCwgZDcJCUAgSCA9IEEyKkIKKwl2ZXh0LjgJZDIyLCBkNywgZDcsICMyCUAgQjIKKwl2bXVsbC5wOAlxMTEsIGQyNywgZDIyCQlAIEcgPSBBKkIyCisJdmV4dC44CWQyMCwgZDI3LCBkMjcsICMzCUAgQTMKKwl2ZW9yCXE4LCBxOCwgcTIJCUAgTCA9IEUgKyBGCisJdm11bGwucDgJcTEwLCBkMjAsIGQ3CQlAIEogPSBBMypCCisJdmV4dC44CWQ0LCBkNywgZDcsICMzCUAgQjMKKwl2ZW9yCXE5LCBxOSwgcTExCQlAIE0gPSBHICsgSAorCXZtdWxsLnA4CXEyLCBkMjcsIGQ0CQlAIEkgPSBBKkIzCisJdmVvcglkMTYsIGQxNiwgZDE3CUAgdDAgPSAoTCkgKFAwICsgUDEpIDw8IDgKKwl2YW5kCWQxNywgZDE3LCBkMjkKKwl2ZXh0LjgJZDIyLCBkNywgZDcsICM0CUAgQjQKKwl2ZW9yCWQxOCwgZDE4LCBkMTkJQCB0MSA9IChNKSAoUDIgKyBQMykgPDwgMTYKKwl2YW5kCWQxOSwgZDE5LCBkMzAKKwl2bXVsbC5wOAlxMTEsIGQyNywgZDIyCQlAIEsgPSBBKkI0CisJdmVvcglxMTAsIHExMCwgcTIJCUAgTiA9IEkgKyBKCisJdmVvcglkMTYsIGQxNiwgZDE3CisJdmVvcglkMTgsIGQxOCwgZDE5CisJdmVvcglkMjAsIGQyMCwgZDIxCUAgdDIgPSAoTikgKFA0ICsgUDUpIDw8IDI0CisJdmFuZAlkMjEsIGQyMSwgZDMxCisJdmV4dC44CXE4LCBxOCwgcTgsICMxNQorCXZlb3IJZDIyLCBkMjIsIGQyMwlAIHQzID0gKEspIChQNiArIFA3KSA8PCAzMgorCXZtb3YuaTY0CWQyMywgIzAKKwl2ZXh0LjgJcTksIHE5LCBxOSwgIzE0CisJdmVvcglkMjAsIGQyMCwgZDIxCisJdm11bGwucDgJcTIsIGQyNywgZDcJCUAgRCA9IEEqQgorCXZleHQuOAlxMTEsIHExMSwgcTExLCAjMTIKKwl2ZXh0LjgJcTEwLCBxMTAsIHExMCwgIzEzCisJdmVvcglxOCwgcTgsIHE5CisJdmVvcglxMTAsIHExMCwgcTExCisJdmVvcglxMiwgcTIsIHE4CisJdmVvcglxMiwgcTIsIHExMAorCXZlb3IJcTEscTEscTAJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCXZlb3IJcTEscTEscTIKKwl2ZW9yCWQxLGQxLGQyCisJdmVvcglkNCxkNCxkMwlAIFhofFhsIC0gMjU2LWJpdCByZXN1bHQKKworCUAgZXF1aXZhbGVudCBvZiByZWR1Y3Rpb25fYXZ4IGZyb20gZ2hhc2gteDg2XzY0LnBsCisJdnNobC5pNjQJcTkscTAsIzU3CQlAIDFzdCBwaGFzZQorCXZzaGwuaTY0CXExMCxxMCwjNjIKKwl2ZW9yCXExMCxxMTAscTkJCUAKKwl2c2hsLmk2NAlxOSxxMCwjNjMKKwl2ZW9yCXExMCwgcTEwLCBxOQkJQAorCXZlb3IJZDEsZDEsZDIwCUAKKwl2ZW9yCWQ0LGQ0LGQyMQorCisJdnNoci51NjQJcTEwLHEwLCMxCQlAIDJuZCBwaGFzZQorCXZlb3IJcTIscTIscTAKKwl2ZW9yCXEwLHEwLHExMAkJQAorCXZzaHIudTY0CXExMCxxMTAsIzYKKwl2c2hyLnU2NAlxMCxxMCwjMQkJQAorCXZlb3IJcTAscTAscTIJCUAKKwl2ZW9yCXEwLHEwLHExMAkJQAorCisJc3VicwlyMywjMTYKKwlibmUJTG9vcF9uZW9uCisKKyNpZmRlZiBfX0FSTUVMX18KKwl2cmV2NjQuOAlxMCxxMAorI2VuZGlmCisJc3ViCXIwLCMxNgorCXZzdDEuNjQJZDEsW3IwXSEJCUAgd3JpdGUgb3V0IFhpCisJdnN0MS42NAlkMCxbcjBdCisKKwlieAlscgkJCQkJQCBieCBscgorCisjZW5kaWYKKy5ieXRlCTcxLDcyLDY1LDgzLDcyLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Miw0Nyw3OCw2OSw3OSw3OCw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHY4LWFybXgzMi5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9pb3MtYXJtL2NyeXB0by9maXBzbW9kdWxlL2doYXNodjgtYXJteDMyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlOGViOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHY4LWFybXgzMi5TCkBAIC0wLDAgKzEsMjQxIEBACisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisudGV4dAorCisuY29kZQkzMgorI3VuZGVmCV9fdGh1bWIyX18KKy5nbG9ibAlfZ2NtX2luaXRfdjgKKy5wcml2YXRlX2V4dGVybglfZ2NtX2luaXRfdjgKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfZ2NtX2luaXRfdjgKKyNlbmRpZgorLmFsaWduCTQKK19nY21faW5pdF92ODoKKwl2bGQxLjY0CXtxOX0sW3IxXQkJQCBsb2FkIGlucHV0IEgKKwl2bW92Lmk4CXExMSwjMHhlMQorCXZzaGwuaTY0CXExMSxxMTEsIzU3CQlAIDB4YzIuMAorCXZleHQuOAlxMyxxOSxxOSwjOAorCXZzaHIudTY0CXExMCxxMTEsIzYzCisJdmR1cC4zMglxOSxkMThbMV0KKwl2ZXh0LjgJcTgscTEwLHExMSwjOAkJQCB0MD0weGMyLi4uLjAxCisJdnNoci51NjQJcTEwLHEzLCM2MworCXZzaHIuczMyCXE5LHE5LCMzMQkJQCBicm9hZGNhc3QgY2FycnkgYml0CisJdmFuZAlxMTAscTEwLHE4CisJdnNobC5pNjQJcTMscTMsIzEKKwl2ZXh0LjgJcTEwLHExMCxxMTAsIzgKKwl2YW5kCXE4LHE4LHE5CisJdm9ycglxMyxxMyxxMTAJCUAgSDw8PD0xCisJdmVvcglxMTIscTMscTgJCUAgdHdpc3RlZCBICisJdnN0MS42NAl7cTEyfSxbcjBdIQkJQCBzdG9yZSBIdGFibGVbMF0KKworCUAgY2FsY3VsYXRlIEheMgorCXZleHQuOAlxOCxxMTIscTEyLCM4CQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworLmJ5dGUJMHhhOCwweDBlLDB4YTgsMHhmMglAIHBtdWxsIHEwLHExMixxMTIKKwl2ZW9yCXE4LHE4LHExMgorLmJ5dGUJMHhhOSwweDRlLDB4YTksMHhmMglAIHBtdWxsMiBxMixxMTIscTEyCisuYnl0ZQkweGEwLDB4MmUsMHhhMCwweGYyCUAgcG11bGwgcTEscTgscTgKKworCXZleHQuOAlxOSxxMCxxMiwjOAkJQCBLYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCisJdmVvcglxMTAscTAscTIKKwl2ZW9yCXExLHExLHE5CisJdmVvcglxMSxxMSxxMTAKKy5ieXRlCTB4MjYsMHg0ZSwweGUwLDB4ZjIJQCBwbXVsbCBxMTAscTAscTExCQlAIDFzdCBwaGFzZQorCisJdm1vdglkNCxkMwkJQCBYaHxYbSAtIDI1Ni1iaXQgcmVzdWx0CisJdm1vdglkMyxkMAkJQCBYbSBpcyByb3RhdGVkIFhsCisJdmVvcglxMCxxMSxxMTAKKworCXZleHQuOAlxMTAscTAscTAsIzgJCUAgMm5kIHBoYXNlCisuYnl0ZQkweDI2LDB4MGUsMHhhMCwweGYyCUAgcG11bGwgcTAscTAscTExCisJdmVvcglxMTAscTEwLHEyCisJdmVvcglxMTQscTAscTEwCisKKwl2ZXh0LjgJcTkscTE0LHExNCwjOAkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwl2ZW9yCXE5LHE5LHExNAorCXZleHQuOAlxMTMscTgscTksIzgJCUAgcGFjayBLYXJhdHN1YmEgcHJlLXByb2Nlc3NlZAorCXZzdDEuNjQJe3ExMyxxMTR9LFtyMF0JCUAgc3RvcmUgSHRhYmxlWzEuLjJdCisKKwlieAlscgorCisuZ2xvYmwJX2djbV9nbXVsdF92OAorLnByaXZhdGVfZXh0ZXJuCV9nY21fZ211bHRfdjgKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfZ2NtX2dtdWx0X3Y4CisjZW5kaWYKKy5hbGlnbgk0CitfZ2NtX2dtdWx0X3Y4OgorCXZsZDEuNjQJe3E5fSxbcjBdCQlAIGxvYWQgWGkKKwl2bW92Lmk4CXExMSwjMHhlMQorCXZsZDEuNjQJe3ExMixxMTN9LFtyMV0JQCBsb2FkIHR3aXN0ZWQgSCwgLi4uCisJdnNobC51NjQJcTExLHExMSwjNTcKKyNpZm5kZWYgX19BUk1FQl9fCisJdnJldjY0LjgJcTkscTkKKyNlbmRpZgorCXZleHQuOAlxMyxxOSxxOSwjOAorCisuYnl0ZQkweDg2LDB4MGUsMHhhOCwweGYyCUAgcG11bGwgcTAscTEyLHEzCQlAIEgubG/Ct1hpLmxvCisJdmVvcglxOSxxOSxxMwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKy5ieXRlCTB4ODcsMHg0ZSwweGE5LDB4ZjIJQCBwbXVsbDIgcTIscTEyLHEzCQlAIEguaGnCt1hpLmhpCisuYnl0ZQkweGEyLDB4MmUsMHhhYSwweGYyCUAgcG11bGwgcTEscTEzLHE5CQlAIChILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisKKwl2ZXh0LjgJcTkscTAscTIsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCXZlb3IJcTEwLHEwLHEyCisJdmVvcglxMSxxMSxxOQorCXZlb3IJcTEscTEscTEwCisuYnl0ZQkweDI2LDB4NGUsMHhlMCwweGYyCUAgcG11bGwgcTEwLHEwLHExMQkJQCAxc3QgcGhhc2Ugb2YgcmVkdWN0aW9uCisKKwl2bW92CWQ0LGQzCQlAIFhofFhtIC0gMjU2LWJpdCByZXN1bHQKKwl2bW92CWQzLGQwCQlAIFhtIGlzIHJvdGF0ZWQgWGwKKwl2ZW9yCXEwLHExLHExMAorCisJdmV4dC44CXExMCxxMCxxMCwjOAkJQCAybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisuYnl0ZQkweDI2LDB4MGUsMHhhMCwweGYyCUAgcG11bGwgcTAscTAscTExCisJdmVvcglxMTAscTEwLHEyCisJdmVvcglxMCxxMCxxMTAKKworI2lmbmRlZiBfX0FSTUVCX18KKwl2cmV2NjQuOAlxMCxxMAorI2VuZGlmCisJdmV4dC44CXEwLHEwLHEwLCM4CisJdnN0MS42NAl7cTB9LFtyMF0JCUAgd3JpdGUgb3V0IFhpCisKKwlieAlscgorCisuZ2xvYmwJX2djbV9naGFzaF92OAorLnByaXZhdGVfZXh0ZXJuCV9nY21fZ2hhc2hfdjgKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfZ2NtX2doYXNoX3Y4CisjZW5kaWYKKy5hbGlnbgk0CitfZ2NtX2doYXNoX3Y4OgorCXZzdG1kYglzcCEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQkJQCAzMi1iaXQgQUJJIHNheXMgc28KKwl2bGQxLjY0CXtxMH0sW3IwXQkJQCBsb2FkIFtyb3RhdGVkXSBYaQorCQkJCQkJQCAiW3JvdGF0ZWRdIiBtZWFucyB0aGF0CisJCQkJCQlAIGxvYWRlZCB2YWx1ZSB3b3VsZCBoYXZlCisJCQkJCQlAIHRvIGJlIHJvdGF0ZWQgaW4gb3JkZXIgdG8KKwkJCQkJCUAgbWFrZSBpdCBhcHBlYXIgYXMgaW4KKwkJCQkJCUAgYWxnb3JpdGhtIHNwZWNpZmljYXRpb24KKwlzdWJzCXIzLHIzLCMzMgkJQCBzZWUgaWYgcjMgaXMgMzIgb3IgbGFyZ2VyCisJbW92CXIxMiwjMTYJCUAgcjEyIGlzIHVzZWQgYXMgcG9zdC0KKwkJCQkJCUAgaW5jcmVtZW50IGZvciBpbnB1dCBwb2ludGVyOworCQkJCQkJQCBhcyBsb29wIGlzIG1vZHVsby1zY2hlZHVsZWQKKwkJCQkJCUAgcjEyIGlzIHplcm9lZCBqdXN0IGluIHRpbWUKKwkJCQkJCUAgdG8gcHJlY2x1ZGUgb3ZlcnN0ZXBwaW5nCisJCQkJCQlAIGlucFtsZW5dLCB3aGljaCBtZWFucyB0aGF0CisJCQkJCQlAIGxhc3QgYmxvY2tbc10gYXJlIGFjdHVhbGx5CisJCQkJCQlAIGxvYWRlZCB0d2ljZSwgYnV0IGxhc3QKKwkJCQkJCUAgY29weSBpcyBub3QgcHJvY2Vzc2VkCisJdmxkMS42NAl7cTEyLHExM30sW3IxXSEJQCBsb2FkIHR3aXN0ZWQgSCwgLi4uLCBIXjIKKwl2bW92Lmk4CXExMSwjMHhlMQorCXZsZDEuNjQJe3ExNH0sW3IxXQorCW1vdmVxCXIxMiwjMAkJCUAgaXMgaXQgdGltZSB0byB6ZXJvIHIxMj8KKwl2ZXh0LjgJcTAscTAscTAsIzgJCUAgcm90YXRlIFhpCisJdmxkMS42NAl7cTh9LFtyMl0hCUAgbG9hZCBbcm90YXRlZF0gSVswXQorCXZzaGwudTY0CXExMSxxMTEsIzU3CQlAIGNvbXBvc2UgMHhjMi4wIGNvbnN0YW50CisjaWZuZGVmIF9fQVJNRUJfXworCXZyZXY2NC44CXE4LHE4CisJdnJldjY0LjgJcTAscTAKKyNlbmRpZgorCXZleHQuOAlxMyxxOCxxOCwjOAkJQCByb3RhdGUgSVswXQorCWJsbwlMb2RkX3RhaWxfdjgJCUAgcjMgd2FzIGxlc3MgdGhhbiAzMgorCXZsZDEuNjQJe3E5fSxbcjJdLHIxMglAIGxvYWQgW3JvdGF0ZWRdIElbMV0KKyNpZm5kZWYgX19BUk1FQl9fCisJdnJldjY0LjgJcTkscTkKKyNlbmRpZgorCXZleHQuOAlxNyxxOSxxOSwjOAorCXZlb3IJcTMscTMscTAJCUAgSVtpXV49WGkKKy5ieXRlCTB4OGUsMHg4ZSwweGE4LDB4ZjIJQCBwbXVsbCBxNCxxMTIscTcJCUAgSMK3SWkrMQorCXZlb3IJcTkscTkscTcJCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisuYnl0ZQkweDhmLDB4Y2UsMHhhOSwweGYyCUAgcG11bGwyIHE2LHExMixxNworCWIJTG9vcF9tb2QyeF92OAorCisuYWxpZ24JNAorTG9vcF9tb2QyeF92ODoKKwl2ZXh0LjgJcTEwLHEzLHEzLCM4CisJc3VicwlyMyxyMywjMzIJCUAgaXMgdGhlcmUgbW9yZSBkYXRhPworLmJ5dGUJMHg4NiwweDBlLDB4YWMsMHhmMglAIHBtdWxsIHEwLHExNCxxMwkJQCBIXjIubG/Ct1hpLmxvCisJbW92bG8JcjEyLCMwCQkJQCBpcyBpdCB0aW1lIHRvIHplcm8gcjEyPworCisuYnl0ZQkweGEyLDB4YWUsMHhhYSwweGYyCUAgcG11bGwgcTUscTEzLHE5CisJdmVvcglxMTAscTEwLHEzCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworLmJ5dGUJMHg4NywweDRlLDB4YWQsMHhmMglAIHBtdWxsMiBxMixxMTQscTMJCUAgSF4yLmhpwrdYaS5oaQorCXZlb3IJcTAscTAscTQJCUAgYWNjdW11bGF0ZQorLmJ5dGUJMHhhNSwweDJlLDB4YWIsMHhmMglAIHBtdWxsMiBxMSxxMTMscTEwCQlAIChIXjIubG8rSF4yLmhpKcK3KFhpLmxvK1hpLmhpKQorCXZsZDEuNjQJe3E4fSxbcjJdLHIxMglAIGxvYWQgW3JvdGF0ZWRdIElbaSsyXQorCisJdmVvcglxMixxMixxNgorCW1vdmVxCXIxMiwjMAkJCUAgaXMgaXQgdGltZSB0byB6ZXJvIHIxMj8KKwl2ZW9yCXExLHExLHE1CisKKwl2ZXh0LjgJcTkscTAscTIsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCXZlb3IJcTEwLHEwLHEyCisJdmVvcglxMSxxMSxxOQorCXZsZDEuNjQJe3E5fSxbcjJdLHIxMglAIGxvYWQgW3JvdGF0ZWRdIElbaSszXQorI2lmbmRlZiBfX0FSTUVCX18KKwl2cmV2NjQuOAlxOCxxOAorI2VuZGlmCisJdmVvcglxMSxxMSxxMTAKKy5ieXRlCTB4MjYsMHg0ZSwweGUwLDB4ZjIJQCBwbXVsbCBxMTAscTAscTExCQlAIDFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworI2lmbmRlZiBfX0FSTUVCX18KKwl2cmV2NjQuOAlxOSxxOQorI2VuZGlmCisJdm1vdglkNCxkMwkJQCBYaHxYbSAtIDI1Ni1iaXQgcmVzdWx0CisJdm1vdglkMyxkMAkJQCBYbSBpcyByb3RhdGVkIFhsCisJdmV4dC44CXE3LHE5LHE5LCM4CisJdmV4dC44CXEzLHE4LHE4LCM4CisJdmVvcglxMCxxMSxxMTAKKy5ieXRlCTB4OGUsMHg4ZSwweGE4LDB4ZjIJQCBwbXVsbCBxNCxxMTIscTcJCUAgSMK3SWkrMQorCXZlb3IJcTMscTMscTIJCUAgYWNjdW11bGF0ZSBxMyBlYXJseQorCisJdmV4dC44CXExMCxxMCxxMCwjOAkJQCAybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisuYnl0ZQkweDI2LDB4MGUsMHhhMCwweGYyCUAgcG11bGwgcTAscTAscTExCisJdmVvcglxMyxxMyxxMTAKKwl2ZW9yCXE5LHE5LHE3CQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCXZlb3IJcTMscTMscTAKKy5ieXRlCTB4OGYsMHhjZSwweGE5LDB4ZjIJQCBwbXVsbDIgcTYscTEyLHE3CisJYmhzCUxvb3BfbW9kMnhfdjgJCUAgdGhlcmUgd2FzIGF0IGxlYXN0IDMyIG1vcmUgYnl0ZXMKKworCXZlb3IJcTIscTIscTEwCisJdmV4dC44CXEzLHE4LHE4LCM4CQlAIHJlLWNvbnN0cnVjdCBxMworCWFkZHMJcjMscjMsIzMyCQlAIHJlLWNvbnN0cnVjdCByMworCXZlb3IJcTAscTAscTIJCUAgcmUtY29uc3RydWN0IHEwCisJYmVxCUxkb25lX3Y4CQlAIGlzIHIzIHplcm8/CitMb2RkX3RhaWxfdjg6CisJdmV4dC44CXExMCxxMCxxMCwjOAorCXZlb3IJcTMscTMscTAJCUAgaW5wXj1YaQorCXZlb3IJcTkscTgscTEwCQlAIHE5IGlzIHJvdGF0ZWQgaW5wXlhpCisKKy5ieXRlCTB4ODYsMHgwZSwweGE4LDB4ZjIJQCBwbXVsbCBxMCxxMTIscTMJCUAgSC5sb8K3WGkubG8KKwl2ZW9yCXE5LHE5LHEzCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworLmJ5dGUJMHg4NywweDRlLDB4YTksMHhmMglAIHBtdWxsMiBxMixxMTIscTMJCUAgSC5oacK3WGkuaGkKKy5ieXRlCTB4YTIsMHgyZSwweGFhLDB4ZjIJQCBwbXVsbCBxMSxxMTMscTkJCUAgKEgubG8rSC5oaSnCtyhYaS5sbytYaS5oaSkKKworCXZleHQuOAlxOSxxMCxxMiwjOAkJQCBLYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCisJdmVvcglxMTAscTAscTIKKwl2ZW9yCXExLHExLHE5CisJdmVvcglxMSxxMSxxMTAKKy5ieXRlCTB4MjYsMHg0ZSwweGUwLDB4ZjIJQCBwbXVsbCBxMTAscTAscTExCQlAIDFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworCXZtb3YJZDQsZDMJCUAgWGh8WG0gLSAyNTYtYml0IHJlc3VsdAorCXZtb3YJZDMsZDAJCUAgWG0gaXMgcm90YXRlZCBYbAorCXZlb3IJcTAscTEscTEwCisKKwl2ZXh0LjgJcTEwLHEwLHEwLCM4CQlAIDJuZCBwaGFzZSBvZiByZWR1Y3Rpb24KKy5ieXRlCTB4MjYsMHgwZSwweGEwLDB4ZjIJQCBwbXVsbCBxMCxxMCxxMTEKKwl2ZW9yCXExMCxxMTAscTIKKwl2ZW9yCXEwLHEwLHExMAorCitMZG9uZV92ODoKKyNpZm5kZWYgX19BUk1FQl9fCisJdnJldjY0LjgJcTAscTAKKyNlbmRpZgorCXZleHQuOAlxMCxxMCxxMCwjOAorCXZzdDEuNjQJe3EwfSxbcjBdCQlAIHdyaXRlIG91dCBYaQorCisJdmxkbWlhCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9CQlAIDMyLWJpdCBBQkkgc2F5cyBzbworCWJ4CWxyCisKKy5ieXRlCTcxLDcyLDY1LDgzLDcyLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Niw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY0LWxhcmdlLlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS1hcm12NC1sYXJnZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzA3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS1hcm12NC1sYXJnZS5TCkBAIC0wLDAgKzEsMTUwMyBAQAorI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKworLnRleHQKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pCisuc3ludGF4CXVuaWZpZWQKKy50aHVtYgorI2Vsc2UKKy5jb2RlCTMyCisjZW5kaWYKKworLmdsb2JsCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy5wcml2YXRlX2V4dGVybglfc2hhMV9ibG9ja19kYXRhX29yZGVyCisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorI2VuZGlmCisKKy5hbGlnbgk1Citfc2hhMV9ibG9ja19kYXRhX29yZGVyOgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKK0xzaGExX2Jsb2NrOgorCWFkcglyMyxMc2hhMV9ibG9jaworCWxkcglyMTIsTE9QRU5TU0xfYXJtY2FwCisJbGRyCXIxMixbcjMscjEyXQkJQCBPUEVOU1NMX2FybWNhcF9QCisjaWZkZWYJX19BUFBMRV9fCisJbGRyCXIxMixbcjEyXQorI2VuZGlmCisJdHN0CXIxMiwjQVJNVjhfU0hBMQorCWJuZQlMQVJNdjgKKwl0c3QJcjEyLCNBUk1WN19ORU9OCisJYm5lCUxORU9OCisjZW5kaWYKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCWFkZAlyMixyMSxyMixsc2wjNglAIHIyIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YgcjEKKwlsZG1pYQlyMCx7cjMscjQscjUscjYscjd9CitMbG9vcDoKKwlsZHIJcjgsTEtfMDBfMTkKKwltb3YJcjE0LHNwCisJc3ViCXNwLHNwLCMxNSo0CisJbW92CXI1LHI1LHJvciMzMAorCW1vdglyNixyNixyb3IjMzAKKwltb3YJcjcscjcscm9yIzMwCQlAIFs2XQorTF8wMF8xNToKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjEwLFtyMSwjMl0KKwlsZHJiCXI5LFtyMSwjM10KKwlsZHJiCXIxMSxbcjEsIzFdCisJYWRkCXI3LHI4LHI3LHJvciMyCQkJQCBFKz1LXzAwXzE5CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyOSxyOSxyMTAsbHNsIzgKKwllb3IJcjEwLHI1LHI2CQkJQCBGX3h4X3h4CisJb3JyCXI5LHI5LHIxMSxsc2wjMTYKKwlhZGQJcjcscjcscjMscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwlvcnIJcjkscjkscjEyLGxzbCMyNAorI2Vsc2UKKwlsZHIJcjksW3IxXSwjNAkJCUAgaGFuZGxlcyB1bmFsaWduZWQKKwlhZGQJcjcscjgscjcscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwllb3IJcjEwLHI1LHI2CQkJQCBGX3h4X3h4CisJYWRkCXI3LHI3LHIzLHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXI5LHI5CQkJCUAgYnl0ZSBzd2FwCisjZW5kaWYKKyNlbmRpZgorCWFuZAlyMTAscjQscjEwLHJvciMyCisJYWRkCXI3LHI3LHI5CQkJQCBFKz1YW2ldCisJZW9yCXIxMCxyMTAscjYscm9yIzIJCUAgRl8wMF8xOShCLEMsRCkKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFkZAlyNyxyNyxyMTAJCQlAIEUrPUZfMDBfMTkoQixDLEQpCisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCXIxMCxbcjEsIzJdCisJbGRyYglyOSxbcjEsIzNdCisJbGRyYglyMTEsW3IxLCMxXQorCWFkZAlyNixyOCxyNixyb3IjMgkJCUAgRSs9S18wMF8xOQorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjkscjkscjEwLGxzbCM4CisJZW9yCXIxMCxyNCxyNQkJCUAgRl94eF94eAorCW9ycglyOSxyOSxyMTEsbHNsIzE2CisJYWRkCXI2LHI2LHI3LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHI5LHIxMixsc2wjMjQKKyNlbHNlCisJbGRyCXI5LFtyMV0sIzQJCQlAIGhhbmRsZXMgdW5hbGlnbmVkCisJYWRkCXI2LHI4LHI2LHJvciMyCQkJQCBFKz1LXzAwXzE5CisJZW9yCXIxMCxyNCxyNQkJCUAgRl94eF94eAorCWFkZAlyNixyNixyNyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyOSxyOQkJCQlAIGJ5dGUgc3dhcAorI2VuZGlmCisjZW5kaWYKKwlhbmQJcjEwLHIzLHIxMCxyb3IjMgorCWFkZAlyNixyNixyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI1LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhZGQJcjYscjYscjEwCQkJQCBFKz1GXzAwXzE5KEIsQyxEKQorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMTAsW3IxLCMyXQorCWxkcmIJcjksW3IxLCMzXQorCWxkcmIJcjExLFtyMSwjMV0KKwlhZGQJcjUscjgscjUscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXI5LHI5LHIxMCxsc2wjOAorCWVvcglyMTAscjMscjQJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjkscjExLGxzbCMxNgorCWFkZAlyNSxyNSxyNixyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW9ycglyOSxyOSxyMTIsbHNsIzI0CisjZWxzZQorCWxkcglyOSxbcjFdLCM0CQkJQCBoYW5kbGVzIHVuYWxpZ25lZAorCWFkZAlyNSxyOCxyNSxyb3IjMgkJCUAgRSs9S18wMF8xOQorCWVvcglyMTAscjMscjQJCQlAIEZfeHhfeHgKKwlhZGQJcjUscjUscjYscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjkscjkJCQkJQCBieXRlIHN3YXAKKyNlbmRpZgorI2VuZGlmCisJYW5kCXIxMCxyNyxyMTAscm9yIzIKKwlhZGQJcjUscjUscjkJCQlAIEUrPVhbaV0KKwllb3IJcjEwLHIxMCxyNCxyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCXN0cglyOSxbcjE0LCMtNF0hCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjEwLFtyMSwjMl0KKwlsZHJiCXI5LFtyMSwjM10KKwlsZHJiCXIxMSxbcjEsIzFdCisJYWRkCXI0LHI4LHI0LHJvciMyCQkJQCBFKz1LXzAwXzE5CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyOSxyOSxyMTAsbHNsIzgKKwllb3IJcjEwLHI3LHIzCQkJQCBGX3h4X3h4CisJb3JyCXI5LHI5LHIxMSxsc2wjMTYKKwlhZGQJcjQscjQscjUscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwlvcnIJcjkscjkscjEyLGxzbCMyNAorI2Vsc2UKKwlsZHIJcjksW3IxXSwjNAkJCUAgaGFuZGxlcyB1bmFsaWduZWQKKwlhZGQJcjQscjgscjQscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwllb3IJcjEwLHI3LHIzCQkJQCBGX3h4X3h4CisJYWRkCXI0LHI0LHI1LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXI5LHI5CQkJCUAgYnl0ZSBzd2FwCisjZW5kaWYKKyNlbmRpZgorCWFuZAlyMTAscjYscjEwLHJvciMyCisJYWRkCXI0LHI0LHI5CQkJQCBFKz1YW2ldCisJZW9yCXIxMCxyMTAscjMscm9yIzIJCUAgRl8wMF8xOShCLEMsRCkKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFkZAlyNCxyNCxyMTAJCQlAIEUrPUZfMDBfMTkoQixDLEQpCisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCXIxMCxbcjEsIzJdCisJbGRyYglyOSxbcjEsIzNdCisJbGRyYglyMTEsW3IxLCMxXQorCWFkZAlyMyxyOCxyMyxyb3IjMgkJCUAgRSs9S18wMF8xOQorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjkscjkscjEwLGxzbCM4CisJZW9yCXIxMCxyNixyNwkJCUAgRl94eF94eAorCW9ycglyOSxyOSxyMTEsbHNsIzE2CisJYWRkCXIzLHIzLHI0LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHI5LHIxMixsc2wjMjQKKyNlbHNlCisJbGRyCXI5LFtyMV0sIzQJCQlAIGhhbmRsZXMgdW5hbGlnbmVkCisJYWRkCXIzLHI4LHIzLHJvciMyCQkJQCBFKz1LXzAwXzE5CisJZW9yCXIxMCxyNixyNwkJCUAgRl94eF94eAorCWFkZAlyMyxyMyxyNCxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyOSxyOQkJCQlAIGJ5dGUgc3dhcAorI2VuZGlmCisjZW5kaWYKKwlhbmQJcjEwLHI1LHIxMCxyb3IjMgorCWFkZAlyMyxyMyxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI3LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhZGQJcjMscjMscjEwCQkJQCBFKz1GXzAwXzE5KEIsQyxEKQorI2lmIGRlZmluZWQoX190aHVtYjJfXykKKwltb3YJcjEyLHNwCisJdGVxCXIxNCxyMTIKKyNlbHNlCisJdGVxCXIxNCxzcAorI2VuZGlmCisJYm5lCUxfMDBfMTUJCUAgWygoMTErNCkqNSsyKSozXQorCXN1YglzcCxzcCwjMjUqNAorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMTAsW3IxLCMyXQorCWxkcmIJcjksW3IxLCMzXQorCWxkcmIJcjExLFtyMSwjMV0KKwlhZGQJcjcscjgscjcscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXI5LHI5LHIxMCxsc2wjOAorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjkscjExLGxzbCMxNgorCWFkZAlyNyxyNyxyMyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW9ycglyOSxyOSxyMTIsbHNsIzI0CisjZWxzZQorCWxkcglyOSxbcjFdLCM0CQkJQCBoYW5kbGVzIHVuYWxpZ25lZAorCWFkZAlyNyxyOCxyNyxyb3IjMgkJCUAgRSs9S18wMF8xOQorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlhZGQJcjcscjcscjMscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjkscjkJCQkJQCBieXRlIHN3YXAKKyNlbmRpZgorI2VuZGlmCisJYW5kCXIxMCxyNCxyMTAscm9yIzIKKwlhZGQJcjcscjcscjkJCQlAIEUrPVhbaV0KKwllb3IJcjEwLHIxMCxyNixyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCXN0cglyOSxbcjE0LCMtNF0hCisJYWRkCXI3LHI3LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI2LHI4LHI2LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjQscjUJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI2LHI2LHI3LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjMscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNixyNixyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI1LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI2LHI2LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI1LHI4LHI1LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjMscjQJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI1LHI1LHI2LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjcscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNSxyNSxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI0LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI0LHI4LHI0LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjcscjMJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI0LHI0LHI1LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjYscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNCxyNCxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHIzLHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI0LHI0LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXIzLHI4LHIzLHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjYscjcJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXIzLHIzLHI0LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjUscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyMyxyMyxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI3LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXIzLHIzLHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKworCWxkcglyOCxMS18yMF8zOQkJQCBbKzE1KzE2KjRdCisJY21uCXNwLCMwCQkJQCBbKzNdLCBjbGVhciBjYXJyeSB0byBkZW5vdGUgMjBfMzkKK0xfMjBfMzlfb3JfNjBfNzk6CisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNyxyOCxyNyxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI1LHI2CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNyxyNyxyMyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwllb3IJcjEwLHI0LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJCQkJCQlAIEZfeHhfeHgKKwlhZGQJcjcscjcscjkJCQlAIEUrPVhbaV0KKwlhZGQJcjcscjcscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlhZGQJcjYscjgscjYscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwllb3IJcjkscjkscjEwCisJZW9yCXIxMSxyMTEscjEyCQkJQCAxIGN5Y2xlIHN0YWxsCisJZW9yCXIxMCxyNCxyNQkJCUAgRl94eF94eAorCW1vdglyOSxyOSxyb3IjMzEKKwlhZGQJcjYscjYscjcscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjkscjkscjExLHJvciMzMQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyMyxyMTAscm9yIzIJCQkJCUAgRl94eF94eAorCQkJCQkJQCBGX3h4X3h4CisJYWRkCXI2LHI2LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI2LHI2LHIxMAkJCUAgRSs9Rl8yMF8zOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI1LHI4LHI1LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjMscjQJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI1LHI1LHI2LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWVvcglyMTAscjcscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNSxyNSxyOQkJCUAgRSs9WFtpXQorCWFkZAlyNSxyNSxyMTAJCQlAIEUrPUZfMjBfMzkoQixDLEQpCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNCxyOCxyNCxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI3LHIzCQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNCxyNCxyNSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwllb3IJcjEwLHI2LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJCQkJCQlAIEZfeHhfeHgKKwlhZGQJcjQscjQscjkJCQlAIEUrPVhbaV0KKwlhZGQJcjQscjQscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlhZGQJcjMscjgscjMscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwllb3IJcjkscjkscjEwCisJZW9yCXIxMSxyMTEscjEyCQkJQCAxIGN5Y2xlIHN0YWxsCisJZW9yCXIxMCxyNixyNwkJCUAgRl94eF94eAorCW1vdglyOSxyOSxyb3IjMzEKKwlhZGQJcjMscjMscjQscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjkscjkscjExLHJvciMzMQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyNSxyMTAscm9yIzIJCQkJCUAgRl94eF94eAorCQkJCQkJQCBGX3h4X3h4CisJYWRkCXIzLHIzLHI5CQkJQCBFKz1YW2ldCisJYWRkCXIzLHIzLHIxMAkJCUAgRSs9Rl8yMF8zOShCLEMsRCkKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pCisJbW92CXIxMixzcAorCXRlcQlyMTQscjEyCisjZWxzZQorCXRlcQlyMTQsc3AJCQlAIHByZXNlcnZlIGNhcnJ5CisjZW5kaWYKKwlibmUJTF8yMF8zOV9vcl82MF83OQlAIFsrKCgxMiszKSo1KzIpKjRdCisJYmNzCUxfZG9uZQkJCUAgWysoKDEyKzMpKjUrMikqNF0sIHNwYXJlIDMwMCBieXRlcworCisJbGRyCXI4LExLXzQwXzU5CisJc3ViCXNwLHNwLCMyMCo0CQlAIFsrMl0KK0xfNDBfNTk6CisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNyxyOCxyNyxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI1LHI2CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNyxyNyxyMyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI0LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNSxyNgkJCQkJQCBGX3h4X3h4CisJYWRkCXI3LHI3LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI3LHI3LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjcscjcscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNixyOCxyNixyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI0LHI1CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNixyNixyNyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHIzLHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNCxyNQkJCQkJQCBGX3h4X3h4CisJYWRkCXI2LHI2LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI2LHI2LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjYscjYscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNSxyOCxyNSxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHIzLHI0CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNSxyNSxyNixyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI3LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyMyxyNAkJCQkJQCBGX3h4X3h4CisJYWRkCXI1LHI1LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjUscjUscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNCxyOCxyNCxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI3LHIzCQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNCxyNCxyNSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI2LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNyxyMwkJCQkJQCBGX3h4X3h4CisJYWRkCXI0LHI0LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI0LHI0LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjQscjQscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyMyxyOCxyMyxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI2LHI3CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyMyxyMyxyNCxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI1LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNixyNwkJCQkJQCBGX3h4X3h4CisJYWRkCXIzLHIzLHI5CQkJQCBFKz1YW2ldCisJYWRkCXIzLHIzLHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjMscjMscjExLHJvciMyCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorCW1vdglyMTIsc3AKKwl0ZXEJcjE0LHIxMgorI2Vsc2UKKwl0ZXEJcjE0LHNwCisjZW5kaWYKKwlibmUJTF80MF81OQkJQCBbKygoMTIrNSkqNSsyKSo0XQorCisJbGRyCXI4LExLXzYwXzc5CisJc3ViCXNwLHNwLCMyMCo0CisJY21wCXNwLCMwCQkJQCBzZXQgY2FycnkgdG8gZGVub3RlIDYwXzc5CisJYglMXzIwXzM5X29yXzYwXzc5CUAgWys0XSwgc3BhcmUgMzAwIGJ5dGVzCitMX2RvbmU6CisJYWRkCXNwLHNwLCM4MCo0CQlAICJkZWFsbG9jYXRlIiBzdGFjayBmcmFtZQorCWxkbWlhCXIwLHtyOCxyOSxyMTAscjExLHIxMn0KKwlhZGQJcjMscjgscjMKKwlhZGQJcjQscjkscjQKKwlhZGQJcjUscjEwLHI1LHJvciMyCisJYWRkCXI2LHIxMSxyNixyb3IjMgorCWFkZAlyNyxyMTIscjcscm9yIzIKKwlzdG1pYQlyMCx7cjMscjQscjUscjYscjd9CisJdGVxCXIxLHIyCisJYm5lCUxsb29wCQkJQCBbKzE4XSwgdG90YWwgMTMwNworCisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0Cisud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKworCisuYWxpZ24JNQorTEtfMDBfMTk6LndvcmQJMHg1YTgyNzk5OQorTEtfMjBfMzk6LndvcmQJMHg2ZWQ5ZWJhMQorTEtfNDBfNTk6LndvcmQJMHg4ZjFiYmNkYworTEtfNjBfNzk6LndvcmQJMHhjYTYyYzFkNgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKK0xPUEVOU1NMX2FybWNhcDoKKy53b3JkCU9QRU5TU0xfYXJtY2FwX1AtTHNoYTFfYmxvY2sKKyNlbmRpZgorLmJ5dGUJODMsNzIsNjUsNDksMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiw2NSw4Miw3NywxMTgsNTIsNDcsNzgsNjksNzksNzgsNDcsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JNQorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKworCisKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlzaGExX2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorI2VuZGlmCisuYWxpZ24JNAorc2hhMV9ibG9ja19kYXRhX29yZGVyX25lb246CitMTkVPTjoKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCWFkZAlyMixyMSxyMixsc2wjNglAIHIyIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YgcjEKKwlAIGRtYgkJCQlAIGVycmF0YSAjNDUxMDM0IG9uIGVhcmx5IENvcnRleCBBOAorCUAgdnN0bWRiCXNwISx7ZDgtZDE1fQlAIEFCSSBzcGVjaWZpY2F0aW9uIHNheXMgc28KKwltb3YJcjE0LHNwCisJc3ViCXIxMixzcCwjNjQKKwlhZHIJcjgsTEtfMDBfMTkKKwliaWMJcjEyLHIxMiwjMTUJCUAgYWxpZ24gZm9yIDEyOC1iaXQgc3RvcmVzCisKKwlsZG1pYQlyMCx7cjMscjQscjUscjYscjd9CUAgbG9hZCBjb250ZXh0CisJbW92CXNwLHIxMgkJQCBhbGxvY2EKKworCXZsZDEuOAl7cTAscTF9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKwl2ZW9yCXExNSxxMTUscTE1CisJdmxkMS44CXtxMixxM30sW3IxXSEKKwl2bGQxLjMyCXtkMjhbXSxkMjlbXX0sW3I4LDozMl0hCUAgbG9hZCBLXzAwXzE5CisJdnJldjMyLjgJcTAscTAJCUAgeWVzLCBldmVuIG9uCisJdnJldjMyLjgJcTEscTEJCUAgYmlnLWVuZGlhbi4uLgorCXZyZXYzMi44CXEyLHEyCisJdmFkZC5pMzIJcTgscTAscTE0CisJdnJldjMyLjgJcTMscTMKKwl2YWRkLmkzMglxOSxxMSxxMTQKKwl2c3QxLjMyCXtxOH0sW3IxMiw6MTI4XSEKKwl2YWRkLmkzMglxMTAscTIscTE0CisJdnN0MS4zMgl7cTl9LFtyMTIsOjEyOF0hCisJdnN0MS4zMgl7cTEwfSxbcjEyLDoxMjhdIQorCWxkcglyOSxbc3BdCQkJQCBiaWcgUkFXIHN0YWxsCisKK0xvb3BfbmVvbjoKKwl2ZXh0LjgJcTgscTAscTEsIzgKKwliaWMJcjEwLHI2LHI0CisJYWRkCXI3LHI3LHI5CisJYW5kCXIxMSxyNSxyNAorCXZhZGQuaTMyCXExMyxxMyxxMTQKKwlsZHIJcjksW3NwLCM0XQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwl2ZXh0LjgJcTEyLHEzLHExNSwjNAorCWVvcglyMTEscjExLHIxMAorCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwl2ZW9yCXE4LHE4LHEwCisJYmljCXIxMCxyNSxyMworCWFkZAlyNixyNixyOQorCXZlb3IJcTEyLHExMixxMgorCWFuZAlyMTEscjQscjMKKwlsZHIJcjksW3NwLCM4XQorCXZlb3IJcTEyLHExMixxOAorCWFkZAlyNixyNixyNyxyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJc3ViCXIxMixyMTIsIzY0CisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCXZleHQuOAlxMTMscTE1LHExMiwjNAorCWJpYwlyMTAscjQscjcKKwlhZGQJcjUscjUscjkKKwl2YWRkLmkzMglxOCxxMTIscTEyCisJYW5kCXIxMSxyMyxyNworCWxkcglyOSxbc3AsIzEyXQorCXZzcmkuMzIJcTgscTEyLCMzMQorCWFkZAlyNSxyNSxyNixyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjcscjcscm9yIzIKKwl2c2hyLnUzMglxMTIscTEzLCMzMAorCWFkZAlyNSxyNSxyMTEKKwliaWMJcjEwLHIzLHI2CisJdnNobC51MzIJcTEzLHExMywjMgorCWFkZAlyNCxyNCxyOQorCWFuZAlyMTEscjcscjYKKwl2ZW9yCXE4LHE4LHExMgorCWxkcglyOSxbc3AsIzE2XQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwl2ZW9yCXE4LHE4LHExMworCWVvcglyMTEscjExLHIxMAorCW1vdglyNixyNixyb3IjMgorCWFkZAlyNCxyNCxyMTEKKwl2ZXh0LjgJcTkscTEscTIsIzgKKwliaWMJcjEwLHI3LHI1CisJYWRkCXIzLHIzLHI5CisJYW5kCXIxMSxyNixyNQorCXZhZGQuaTMyCXExMyxxOCxxMTQKKwlsZHIJcjksW3NwLCMyMF0KKwl2bGQxLjMyCXtkMjhbXSxkMjlbXX0sW3I4LDozMl0hCisJYWRkCXIzLHIzLHI0LHJvciMyNworCXZleHQuOAlxMTIscTgscTE1LCM0CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCXZlb3IJcTkscTkscTEKKwliaWMJcjEwLHI2LHI0CisJYWRkCXI3LHI3LHI5CisJdmVvcglxMTIscTEyLHEzCisJYW5kCXIxMSxyNSxyNAorCWxkcglyOSxbc3AsIzI0XQorCXZlb3IJcTEyLHExMixxOQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZleHQuOAlxMTMscTE1LHExMiwjNAorCWJpYwlyMTAscjUscjMKKwlhZGQJcjYscjYscjkKKwl2YWRkLmkzMglxOSxxMTIscTEyCisJYW5kCXIxMSxyNCxyMworCWxkcglyOSxbc3AsIzI4XQorCXZzcmkuMzIJcTkscTEyLCMzMQorCWFkZAlyNixyNixyNyxyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjMscjMscm9yIzIKKwl2c2hyLnUzMglxMTIscTEzLCMzMAorCWFkZAlyNixyNixyMTEKKwliaWMJcjEwLHI0LHI3CisJdnNobC51MzIJcTEzLHExMywjMgorCWFkZAlyNSxyNSxyOQorCWFuZAlyMTEscjMscjcKKwl2ZW9yCXE5LHE5LHExMgorCWxkcglyOSxbc3AsIzMyXQorCWFkZAlyNSxyNSxyNixyb3IjMjcKKwl2ZW9yCXE5LHE5LHExMworCWVvcglyMTEscjExLHIxMAorCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwl2ZXh0LjgJcTEwLHEyLHEzLCM4CisJYmljCXIxMCxyMyxyNgorCWFkZAlyNCxyNCxyOQorCWFuZAlyMTEscjcscjYKKwl2YWRkLmkzMglxMTMscTkscTE0CisJbGRyCXI5LFtzcCwjMzZdCisJYWRkCXI0LHI0LHI1LHJvciMyNworCXZleHQuOAlxMTIscTkscTE1LCM0CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCXZlb3IJcTEwLHExMCxxMgorCWJpYwlyMTAscjcscjUKKwlhZGQJcjMscjMscjkKKwl2ZW9yCXExMixxMTIscTgKKwlhbmQJcjExLHI2LHI1CisJbGRyCXI5LFtzcCwjNDBdCisJdmVvcglxMTIscTEyLHExMAorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCXZleHQuOAlxMTMscTE1LHExMiwjNAorCWJpYwlyMTAscjYscjQKKwlhZGQJcjcscjcscjkKKwl2YWRkLmkzMglxMTAscTEyLHExMgorCWFuZAlyMTEscjUscjQKKwlsZHIJcjksW3NwLCM0NF0KKwl2c3JpLjMyCXExMCxxMTIsIzMxCisJYWRkCXI3LHI3LHIzLHJvciMyNworCWVvcglyMTEscjExLHIxMAorCW1vdglyNCxyNCxyb3IjMgorCXZzaHIudTMyCXExMixxMTMsIzMwCisJYWRkCXI3LHI3LHIxMQorCWJpYwlyMTAscjUscjMKKwl2c2hsLnUzMglxMTMscTEzLCMyCisJYWRkCXI2LHI2LHI5CisJYW5kCXIxMSxyNCxyMworCXZlb3IJcTEwLHExMCxxMTIKKwlsZHIJcjksW3NwLCM0OF0KKwlhZGQJcjYscjYscjcscm9yIzI3CisJdmVvcglxMTAscTEwLHExMworCWVvcglyMTEscjExLHIxMAorCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwl2ZXh0LjgJcTExLHEzLHE4LCM4CisJYmljCXIxMCxyNCxyNworCWFkZAlyNSxyNSxyOQorCWFuZAlyMTEscjMscjcKKwl2YWRkLmkzMglxMTMscTEwLHExNAorCWxkcglyOSxbc3AsIzUyXQorCWFkZAlyNSxyNSxyNixyb3IjMjcKKwl2ZXh0LjgJcTEyLHExMCxxMTUsIzQKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJdmVvcglxMTEscTExLHEzCisJYmljCXIxMCxyMyxyNgorCWFkZAlyNCxyNCxyOQorCXZlb3IJcTEyLHExMixxOQorCWFuZAlyMTEscjcscjYKKwlsZHIJcjksW3NwLCM1Nl0KKwl2ZW9yCXExMixxMTIscTExCisJYWRkCXI0LHI0LHI1LHJvciMyNworCWVvcglyMTEscjExLHIxMAorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJdmV4dC44CXExMyxxMTUscTEyLCM0CisJYmljCXIxMCxyNyxyNQorCWFkZAlyMyxyMyxyOQorCXZhZGQuaTMyCXExMSxxMTIscTEyCisJYW5kCXIxMSxyNixyNQorCWxkcglyOSxbc3AsIzYwXQorCXZzcmkuMzIJcTExLHExMiwjMzEKKwlhZGQJcjMscjMscjQscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI1LHI1LHJvciMyCisJdnNoci51MzIJcTEyLHExMywjMzAKKwlhZGQJcjMscjMscjExCisJYmljCXIxMCxyNixyNAorCXZzaGwudTMyCXExMyxxMTMsIzIKKwlhZGQJcjcscjcscjkKKwlhbmQJcjExLHI1LHI0CisJdmVvcglxMTEscTExLHExMgorCWxkcglyOSxbc3AsIzBdCisJYWRkCXI3LHI3LHIzLHJvciMyNworCXZlb3IJcTExLHExMSxxMTMKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjQscjQscm9yIzIKKwlhZGQJcjcscjcscjExCisJdmV4dC44CXExMixxMTAscTExLCM4CisJYmljCXIxMCxyNSxyMworCWFkZAlyNixyNixyOQorCWFuZAlyMTEscjQscjMKKwl2ZW9yCXEwLHEwLHE4CisJbGRyCXI5LFtzcCwjNF0KKwlhZGQJcjYscjYscjcscm9yIzI3CisJdmVvcglxMCxxMCxxMQorCWVvcglyMTEscjExLHIxMAorCW1vdglyMyxyMyxyb3IjMgorCXZhZGQuaTMyCXExMyxxMTEscTE0CisJYWRkCXI2LHI2LHIxMQorCWJpYwlyMTAscjQscjcKKwl2ZW9yCXExMixxMTIscTAKKwlhZGQJcjUscjUscjkKKwlhbmQJcjExLHIzLHI3CisJdnNoci51MzIJcTAscTEyLCMzMAorCWxkcglyOSxbc3AsIzhdCisJYWRkCXI1LHI1LHI2LHJvciMyNworCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlzdWIJcjEyLHIxMiwjNjQKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjcscjcscm9yIzIKKwl2c2xpLjMyCXEwLHExMiwjMgorCWFkZAlyNSxyNSxyMTEKKwliaWMJcjEwLHIzLHI2CisJYWRkCXI0LHI0LHI5CisJYW5kCXIxMSxyNyxyNgorCWxkcglyOSxbc3AsIzEyXQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJYmljCXIxMCxyNyxyNQorCWFkZAlyMyxyMyxyOQorCWFuZAlyMTEscjYscjUKKwlsZHIJcjksW3NwLCMxNl0KKwlhZGQJcjMscjMscjQscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCXZleHQuOAlxMTIscTExLHEwLCM4CisJZW9yCXIxMCxyNCxyNgorCWFkZAlyNyxyNyxyOQorCWxkcglyOSxbc3AsIzIwXQorCXZlb3IJcTEscTEscTkKKwllb3IJcjExLHIxMCxyNQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwl2ZW9yCXExLHExLHEyCisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZhZGQuaTMyCXExMyxxMCxxMTQKKwllb3IJcjEwLHIzLHI1CisJYWRkCXI2LHI2LHI5CisJdmVvcglxMTIscTEyLHExCisJbGRyCXI5LFtzcCwjMjRdCisJZW9yCXIxMSxyMTAscjQKKwl2c2hyLnUzMglxMSxxMTIsIzMwCisJYWRkCXI2LHI2LHI3LHJvciMyNworCW1vdglyMyxyMyxyb3IjMgorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlhZGQJcjYscjYscjExCisJZW9yCXIxMCxyNyxyNAorCXZzbGkuMzIJcTEscTEyLCMyCisJYWRkCXI1LHI1LHI5CisJbGRyCXI5LFtzcCwjMjhdCisJZW9yCXIxMSxyMTAscjMKKwlhZGQJcjUscjUscjYscm9yIzI3CisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCWVvcglyMTAscjYscjMKKwlhZGQJcjQscjQscjkKKwlsZHIJcjksW3NwLCMzMl0KKwllb3IJcjExLHIxMCxyNworCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJdmV4dC44CXExMixxMCxxMSwjOAorCWVvcglyMTAscjUscjcKKwlhZGQJcjMscjMscjkKKwlsZHIJcjksW3NwLCMzNl0KKwl2ZW9yCXEyLHEyLHExMAorCWVvcglyMTEscjEwLHI2CisJYWRkCXIzLHIzLHI0LHJvciMyNworCXZlb3IJcTIscTIscTMKKwltb3YJcjUscjUscm9yIzIKKwlhZGQJcjMscjMscjExCisJdmFkZC5pMzIJcTEzLHExLHExNAorCWVvcglyMTAscjQscjYKKwl2bGQxLjMyCXtkMjhbXSxkMjlbXX0sW3I4LDozMl0hCisJYWRkCXI3LHI3LHI5CisJdmVvcglxMTIscTEyLHEyCisJbGRyCXI5LFtzcCwjNDBdCisJZW9yCXIxMSxyMTAscjUKKwl2c2hyLnUzMglxMixxMTIsIzMwCisJYWRkCXI3LHI3LHIzLHJvciMyNworCW1vdglyNCxyNCxyb3IjMgorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlhZGQJcjcscjcscjExCisJZW9yCXIxMCxyMyxyNQorCXZzbGkuMzIJcTIscTEyLCMyCisJYWRkCXI2LHI2LHI5CisJbGRyCXI5LFtzcCwjNDRdCisJZW9yCXIxMSxyMTAscjQKKwlhZGQJcjYscjYscjcscm9yIzI3CisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCWVvcglyMTAscjcscjQKKwlhZGQJcjUscjUscjkKKwlsZHIJcjksW3NwLCM0OF0KKwllb3IJcjExLHIxMCxyMworCWFkZAlyNSxyNSxyNixyb3IjMjcKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJdmV4dC44CXExMixxMSxxMiwjOAorCWVvcglyMTAscjYscjMKKwlhZGQJcjQscjQscjkKKwlsZHIJcjksW3NwLCM1Ml0KKwl2ZW9yCXEzLHEzLHExMQorCWVvcglyMTEscjEwLHI3CisJYWRkCXI0LHI0LHI1LHJvciMyNworCXZlb3IJcTMscTMscTgKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJdmFkZC5pMzIJcTEzLHEyLHExNAorCWVvcglyMTAscjUscjcKKwlhZGQJcjMscjMscjkKKwl2ZW9yCXExMixxMTIscTMKKwlsZHIJcjksW3NwLCM1Nl0KKwllb3IJcjExLHIxMCxyNgorCXZzaHIudTMyCXEzLHExMiwjMzAKKwlhZGQJcjMscjMscjQscm9yIzI3CisJbW92CXI1LHI1LHJvciMyCisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCWFkZAlyMyxyMyxyMTEKKwllb3IJcjEwLHI0LHI2CisJdnNsaS4zMglxMyxxMTIsIzIKKwlhZGQJcjcscjcscjkKKwlsZHIJcjksW3NwLCM2MF0KKwllb3IJcjExLHIxMCxyNQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwltb3YJcjQscjQscm9yIzIKKwlhZGQJcjcscjcscjExCisJZW9yCXIxMCxyMyxyNQorCWFkZAlyNixyNixyOQorCWxkcglyOSxbc3AsIzBdCisJZW9yCXIxMSxyMTAscjQKKwlhZGQJcjYscjYscjcscm9yIzI3CisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCXZleHQuOAlxMTIscTIscTMsIzgKKwllb3IJcjEwLHI3LHI0CisJYWRkCXI1LHI1LHI5CisJbGRyCXI5LFtzcCwjNF0KKwl2ZW9yCXE4LHE4LHEwCisJZW9yCXIxMSxyMTAscjMKKwlhZGQJcjUscjUscjYscm9yIzI3CisJdmVvcglxOCxxOCxxOQorCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwl2YWRkLmkzMglxMTMscTMscTE0CisJZW9yCXIxMCxyNixyMworCWFkZAlyNCxyNCxyOQorCXZlb3IJcTEyLHExMixxOAorCWxkcglyOSxbc3AsIzhdCisJZW9yCXIxMSxyMTAscjcKKwl2c2hyLnUzMglxOCxxMTIsIzMwCisJYWRkCXI0LHI0LHI1LHJvciMyNworCW1vdglyNixyNixyb3IjMgorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlzdWIJcjEyLHIxMiwjNjQKKwlhZGQJcjQscjQscjExCisJZW9yCXIxMCxyNSxyNworCXZzbGkuMzIJcTgscTEyLCMyCisJYWRkCXIzLHIzLHI5CisJbGRyCXI5LFtzcCwjMTJdCisJZW9yCXIxMSxyMTAscjYKKwlhZGQJcjMscjMscjQscm9yIzI3CisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCWVvcglyMTAscjQscjYKKwlhZGQJcjcscjcscjkKKwlsZHIJcjksW3NwLCMxNl0KKwllb3IJcjExLHIxMCxyNQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwltb3YJcjQscjQscm9yIzIKKwlhZGQJcjcscjcscjExCisJdmV4dC44CXExMixxMyxxOCwjOAorCWVvcglyMTAscjMscjUKKwlhZGQJcjYscjYscjkKKwlsZHIJcjksW3NwLCMyMF0KKwl2ZW9yCXE5LHE5LHExCisJZW9yCXIxMSxyMTAscjQKKwlhZGQJcjYscjYscjcscm9yIzI3CisJdmVvcglxOSxxOSxxMTAKKwltb3YJcjMscjMscm9yIzIKKwlhZGQJcjYscjYscjExCisJdmFkZC5pMzIJcTEzLHE4LHExNAorCWVvcglyMTAscjcscjQKKwlhZGQJcjUscjUscjkKKwl2ZW9yCXExMixxMTIscTkKKwlsZHIJcjksW3NwLCMyNF0KKwllb3IJcjExLHIxMCxyMworCXZzaHIudTMyCXE5LHExMiwjMzAKKwlhZGQJcjUscjUscjYscm9yIzI3CisJbW92CXI3LHI3LHJvciMyCisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCWFkZAlyNSxyNSxyMTEKKwllb3IJcjEwLHI2LHIzCisJdnNsaS4zMglxOSxxMTIsIzIKKwlhZGQJcjQscjQscjkKKwlsZHIJcjksW3NwLCMyOF0KKwllb3IJcjExLHIxMCxyNworCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJZW9yCXIxMCxyNSxyNworCWFkZAlyMyxyMyxyOQorCWxkcglyOSxbc3AsIzMyXQorCWVvcglyMTEscjEwLHI2CisJYWRkCXIzLHIzLHI0LHJvciMyNworCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwl2ZXh0LjgJcTEyLHE4LHE5LCM4CisJYWRkCXI3LHI3LHI5CisJYW5kCXIxMCxyNSxyNgorCWxkcglyOSxbc3AsIzM2XQorCXZlb3IJcTEwLHExMCxxMgorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwllb3IJcjExLHI1LHI2CisJdmVvcglxMTAscTEwLHExMQorCWFkZAlyNyxyNyxyMTAKKwlhbmQJcjExLHIxMSxyNAorCXZhZGQuaTMyCXExMyxxOSxxMTQKKwltb3YJcjQscjQscm9yIzIKKwlhZGQJcjcscjcscjExCisJdmVvcglxMTIscTEyLHExMAorCWFkZAlyNixyNixyOQorCWFuZAlyMTAscjQscjUKKwl2c2hyLnUzMglxMTAscTEyLCMzMAorCWxkcglyOSxbc3AsIzQwXQorCWFkZAlyNixyNixyNyxyb3IjMjcKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJZW9yCXIxMSxyNCxyNQorCWFkZAlyNixyNixyMTAKKwl2c2xpLjMyCXExMCxxMTIsIzIKKwlhbmQJcjExLHIxMSxyMworCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwlhZGQJcjUscjUscjkKKwlhbmQJcjEwLHIzLHI0CisJbGRyCXI5LFtzcCwjNDRdCisJYWRkCXI1LHI1LHI2LHJvciMyNworCWVvcglyMTEscjMscjQKKwlhZGQJcjUscjUscjEwCisJYW5kCXIxMSxyMTEscjcKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJYWRkCXI0LHI0LHI5CisJYW5kCXIxMCxyNyxyMworCWxkcglyOSxbc3AsIzQ4XQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwllb3IJcjExLHI3LHIzCisJYWRkCXI0LHI0LHIxMAorCWFuZAlyMTEscjExLHI2CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCXZleHQuOAlxMTIscTkscTEwLCM4CisJYWRkCXIzLHIzLHI5CisJYW5kCXIxMCxyNixyNworCWxkcglyOSxbc3AsIzUyXQorCXZlb3IJcTExLHExMSxxMworCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwllb3IJcjExLHI2LHI3CisJdmVvcglxMTEscTExLHEwCisJYWRkCXIzLHIzLHIxMAorCWFuZAlyMTEscjExLHI1CisJdmFkZC5pMzIJcTEzLHExMCxxMTQKKwltb3YJcjUscjUscm9yIzIKKwl2bGQxLjMyCXtkMjhbXSxkMjlbXX0sW3I4LDozMl0hCisJYWRkCXIzLHIzLHIxMQorCXZlb3IJcTEyLHExMixxMTEKKwlhZGQJcjcscjcscjkKKwlhbmQJcjEwLHI1LHI2CisJdnNoci51MzIJcTExLHExMiwjMzAKKwlsZHIJcjksW3NwLCM1Nl0KKwlhZGQJcjcscjcscjMscm9yIzI3CisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCWVvcglyMTEscjUscjYKKwlhZGQJcjcscjcscjEwCisJdnNsaS4zMglxMTEscTEyLCMyCisJYW5kCXIxMSxyMTEscjQKKwltb3YJcjQscjQscm9yIzIKKwlhZGQJcjcscjcscjExCisJYWRkCXI2LHI2LHI5CisJYW5kCXIxMCxyNCxyNQorCWxkcglyOSxbc3AsIzYwXQorCWFkZAlyNixyNixyNyxyb3IjMjcKKwllb3IJcjExLHI0LHI1CisJYWRkCXI2LHI2LHIxMAorCWFuZAlyMTEscjExLHIzCisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCWFkZAlyNSxyNSxyOQorCWFuZAlyMTAscjMscjQKKwlsZHIJcjksW3NwLCMwXQorCWFkZAlyNSxyNSxyNixyb3IjMjcKKwllb3IJcjExLHIzLHI0CisJYWRkCXI1LHI1LHIxMAorCWFuZAlyMTEscjExLHI3CisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCXZleHQuOAlxMTIscTEwLHExMSwjOAorCWFkZAlyNCxyNCxyOQorCWFuZAlyMTAscjcscjMKKwlsZHIJcjksW3NwLCM0XQorCXZlb3IJcTAscTAscTgKKwlhZGQJcjQscjQscjUscm9yIzI3CisJZW9yCXIxMSxyNyxyMworCXZlb3IJcTAscTAscTEKKwlhZGQJcjQscjQscjEwCisJYW5kCXIxMSxyMTEscjYKKwl2YWRkLmkzMglxMTMscTExLHExNAorCW1vdglyNixyNixyb3IjMgorCWFkZAlyNCxyNCxyMTEKKwl2ZW9yCXExMixxMTIscTAKKwlhZGQJcjMscjMscjkKKwlhbmQJcjEwLHI2LHI3CisJdnNoci51MzIJcTAscTEyLCMzMAorCWxkcglyOSxbc3AsIzhdCisJYWRkCXIzLHIzLHI0LHJvciMyNworCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlzdWIJcjEyLHIxMiwjNjQKKwllb3IJcjExLHI2LHI3CisJYWRkCXIzLHIzLHIxMAorCXZzbGkuMzIJcTAscTEyLCMyCisJYW5kCXIxMSxyMTEscjUKKwltb3YJcjUscjUscm9yIzIKKwlhZGQJcjMscjMscjExCisJYWRkCXI3LHI3LHI5CisJYW5kCXIxMCxyNSxyNgorCWxkcglyOSxbc3AsIzEyXQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwllb3IJcjExLHI1LHI2CisJYWRkCXI3LHI3LHIxMAorCWFuZAlyMTEscjExLHI0CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCWFkZAlyNixyNixyOQorCWFuZAlyMTAscjQscjUKKwlsZHIJcjksW3NwLCMxNl0KKwlhZGQJcjYscjYscjcscm9yIzI3CisJZW9yCXIxMSxyNCxyNQorCWFkZAlyNixyNixyMTAKKwlhbmQJcjExLHIxMSxyMworCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwl2ZXh0LjgJcTEyLHExMSxxMCwjOAorCWFkZAlyNSxyNSxyOQorCWFuZAlyMTAscjMscjQKKwlsZHIJcjksW3NwLCMyMF0KKwl2ZW9yCXExLHExLHE5CisJYWRkCXI1LHI1LHI2LHJvciMyNworCWVvcglyMTEscjMscjQKKwl2ZW9yCXExLHExLHEyCisJYWRkCXI1LHI1LHIxMAorCWFuZAlyMTEscjExLHI3CisJdmFkZC5pMzIJcTEzLHEwLHExNAorCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwl2ZW9yCXExMixxMTIscTEKKwlhZGQJcjQscjQscjkKKwlhbmQJcjEwLHI3LHIzCisJdnNoci51MzIJcTEscTEyLCMzMAorCWxkcglyOSxbc3AsIzI0XQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJZW9yCXIxMSxyNyxyMworCWFkZAlyNCxyNCxyMTAKKwl2c2xpLjMyCXExLHExMiwjMgorCWFuZAlyMTEscjExLHI2CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCWFkZAlyMyxyMyxyOQorCWFuZAlyMTAscjYscjcKKwlsZHIJcjksW3NwLCMyOF0KKwlhZGQJcjMscjMscjQscm9yIzI3CisJZW9yCXIxMSxyNixyNworCWFkZAlyMyxyMyxyMTAKKwlhbmQJcjExLHIxMSxyNQorCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwlhZGQJcjcscjcscjkKKwlhbmQJcjEwLHI1LHI2CisJbGRyCXI5LFtzcCwjMzJdCisJYWRkCXI3LHI3LHIzLHJvciMyNworCWVvcglyMTEscjUscjYKKwlhZGQJcjcscjcscjEwCisJYW5kCXIxMSxyMTEscjQKKwltb3YJcjQscjQscm9yIzIKKwlhZGQJcjcscjcscjExCisJdmV4dC44CXExMixxMCxxMSwjOAorCWFkZAlyNixyNixyOQorCWFuZAlyMTAscjQscjUKKwlsZHIJcjksW3NwLCMzNl0KKwl2ZW9yCXEyLHEyLHExMAorCWFkZAlyNixyNixyNyxyb3IjMjcKKwllb3IJcjExLHI0LHI1CisJdmVvcglxMixxMixxMworCWFkZAlyNixyNixyMTAKKwlhbmQJcjExLHIxMSxyMworCXZhZGQuaTMyCXExMyxxMSxxMTQKKwltb3YJcjMscjMscm9yIzIKKwlhZGQJcjYscjYscjExCisJdmVvcglxMTIscTEyLHEyCisJYWRkCXI1LHI1LHI5CisJYW5kCXIxMCxyMyxyNAorCXZzaHIudTMyCXEyLHExMiwjMzAKKwlsZHIJcjksW3NwLCM0MF0KKwlhZGQJcjUscjUscjYscm9yIzI3CisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCWVvcglyMTEscjMscjQKKwlhZGQJcjUscjUscjEwCisJdnNsaS4zMglxMixxMTIsIzIKKwlhbmQJcjExLHIxMSxyNworCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwlhZGQJcjQscjQscjkKKwlhbmQJcjEwLHI3LHIzCisJbGRyCXI5LFtzcCwjNDRdCisJYWRkCXI0LHI0LHI1LHJvciMyNworCWVvcglyMTEscjcscjMKKwlhZGQJcjQscjQscjEwCisJYW5kCXIxMSxyMTEscjYKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJYWRkCXIzLHIzLHI5CisJYW5kCXIxMCxyNixyNworCWxkcglyOSxbc3AsIzQ4XQorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwllb3IJcjExLHI2LHI3CisJYWRkCXIzLHIzLHIxMAorCWFuZAlyMTEscjExLHI1CisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCXZleHQuOAlxMTIscTEscTIsIzgKKwllb3IJcjEwLHI0LHI2CisJYWRkCXI3LHI3LHI5CisJbGRyCXI5LFtzcCwjNTJdCisJdmVvcglxMyxxMyxxMTEKKwllb3IJcjExLHIxMCxyNQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwl2ZW9yCXEzLHEzLHE4CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZhZGQuaTMyCXExMyxxMixxMTQKKwllb3IJcjEwLHIzLHI1CisJYWRkCXI2LHI2LHI5CisJdmVvcglxMTIscTEyLHEzCisJbGRyCXI5LFtzcCwjNTZdCisJZW9yCXIxMSxyMTAscjQKKwl2c2hyLnUzMglxMyxxMTIsIzMwCisJYWRkCXI2LHI2LHI3LHJvciMyNworCW1vdglyMyxyMyxyb3IjMgorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlhZGQJcjYscjYscjExCisJZW9yCXIxMCxyNyxyNAorCXZzbGkuMzIJcTMscTEyLCMyCisJYWRkCXI1LHI1LHI5CisJbGRyCXI5LFtzcCwjNjBdCisJZW9yCXIxMSxyMTAscjMKKwlhZGQJcjUscjUscjYscm9yIzI3CisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCWVvcglyMTAscjYscjMKKwlhZGQJcjQscjQscjkKKwlsZHIJcjksW3NwLCMwXQorCWVvcglyMTEscjEwLHI3CisJYWRkCXI0LHI0LHI1LHJvciMyNworCW1vdglyNixyNixyb3IjMgorCWFkZAlyNCxyNCxyMTEKKwl2YWRkLmkzMglxMTMscTMscTE0CisJZW9yCXIxMCxyNSxyNworCWFkZAlyMyxyMyxyOQorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlzdWIJcjEyLHIxMiwjNjQKKwl0ZXEJcjEscjIKKwlzdWIJcjgscjgsIzE2CisJaXQJZXEKKwlzdWJlcQlyMSxyMSwjNjQKKwl2bGQxLjgJe3EwLHExfSxbcjFdIQorCWxkcglyOSxbc3AsIzRdCisJZW9yCXIxMSxyMTAscjYKKwl2bGQxLjgJe3EyLHEzfSxbcjFdIQorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwltb3YJcjUscjUscm9yIzIKKwl2bGQxLjMyCXtkMjhbXSxkMjlbXX0sW3I4LDozMl0hCisJYWRkCXIzLHIzLHIxMQorCWVvcglyMTAscjQscjYKKwl2cmV2MzIuOAlxMCxxMAorCWFkZAlyNyxyNyxyOQorCWxkcglyOSxbc3AsIzhdCisJZW9yCXIxMSxyMTAscjUKKwlhZGQJcjcscjcscjMscm9yIzI3CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCWVvcglyMTAscjMscjUKKwlhZGQJcjYscjYscjkKKwlsZHIJcjksW3NwLCMxMl0KKwllb3IJcjExLHIxMCxyNAorCWFkZAlyNixyNixyNyxyb3IjMjcKKwltb3YJcjMscjMscm9yIzIKKwlhZGQJcjYscjYscjExCisJZW9yCXIxMCxyNyxyNAorCWFkZAlyNSxyNSxyOQorCWxkcglyOSxbc3AsIzE2XQorCWVvcglyMTEscjEwLHIzCisJYWRkCXI1LHI1LHI2LHJvciMyNworCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwl2cmV2MzIuOAlxMSxxMQorCWVvcglyMTAscjYscjMKKwlhZGQJcjQscjQscjkKKwl2YWRkLmkzMglxOCxxMCxxMTQKKwlsZHIJcjksW3NwLCMyMF0KKwllb3IJcjExLHIxMCxyNworCXZzdDEuMzIJe3E4fSxbcjEyLDoxMjhdIQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJZW9yCXIxMCxyNSxyNworCWFkZAlyMyxyMyxyOQorCWxkcglyOSxbc3AsIzI0XQorCWVvcglyMTEscjEwLHI2CisJYWRkCXIzLHIzLHI0LHJvciMyNworCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwllb3IJcjEwLHI0LHI2CisJYWRkCXI3LHI3LHI5CisJbGRyCXI5LFtzcCwjMjhdCisJZW9yCXIxMSxyMTAscjUKKwlhZGQJcjcscjcscjMscm9yIzI3CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCWVvcglyMTAscjMscjUKKwlhZGQJcjYscjYscjkKKwlsZHIJcjksW3NwLCMzMl0KKwllb3IJcjExLHIxMCxyNAorCWFkZAlyNixyNixyNyxyb3IjMjcKKwltb3YJcjMscjMscm9yIzIKKwlhZGQJcjYscjYscjExCisJdnJldjMyLjgJcTIscTIKKwllb3IJcjEwLHI3LHI0CisJYWRkCXI1LHI1LHI5CisJdmFkZC5pMzIJcTkscTEscTE0CisJbGRyCXI5LFtzcCwjMzZdCisJZW9yCXIxMSxyMTAscjMKKwl2c3QxLjMyCXtxOX0sW3IxMiw6MTI4XSEKKwlhZGQJcjUscjUscjYscm9yIzI3CisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCWVvcglyMTAscjYscjMKKwlhZGQJcjQscjQscjkKKwlsZHIJcjksW3NwLCM0MF0KKwllb3IJcjExLHIxMCxyNworCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJZW9yCXIxMCxyNSxyNworCWFkZAlyMyxyMyxyOQorCWxkcglyOSxbc3AsIzQ0XQorCWVvcglyMTEscjEwLHI2CisJYWRkCXIzLHIzLHI0LHJvciMyNworCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwllb3IJcjEwLHI0LHI2CisJYWRkCXI3LHI3LHI5CisJbGRyCXI5LFtzcCwjNDhdCisJZW9yCXIxMSxyMTAscjUKKwlhZGQJcjcscjcscjMscm9yIzI3CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZyZXYzMi44CXEzLHEzCisJZW9yCXIxMCxyMyxyNQorCWFkZAlyNixyNixyOQorCXZhZGQuaTMyCXExMCxxMixxMTQKKwlsZHIJcjksW3NwLCM1Ml0KKwllb3IJcjExLHIxMCxyNAorCXZzdDEuMzIJe3ExMH0sW3IxMiw6MTI4XSEKKwlhZGQJcjYscjYscjcscm9yIzI3CisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCWVvcglyMTAscjcscjQKKwlhZGQJcjUscjUscjkKKwlsZHIJcjksW3NwLCM1Nl0KKwllb3IJcjExLHIxMCxyMworCWFkZAlyNSxyNSxyNixyb3IjMjcKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJZW9yCXIxMCxyNixyMworCWFkZAlyNCxyNCxyOQorCWxkcglyOSxbc3AsIzYwXQorCWVvcglyMTEscjEwLHI3CisJYWRkCXI0LHI0LHI1LHJvciMyNworCW1vdglyNixyNixyb3IjMgorCWFkZAlyNCxyNCxyMTEKKwllb3IJcjEwLHI1LHI3CisJYWRkCXIzLHIzLHI5CisJZW9yCXIxMSxyMTAscjYKKwlhZGQJcjMscjMscjQscm9yIzI3CisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCWxkbWlhCXIwLHtyOSxyMTAscjExLHIxMn0JQCBhY2N1bXVsYXRlIGNvbnRleHQKKwlhZGQJcjMscjMscjkKKwlsZHIJcjksW3IwLCMxNl0KKwlhZGQJcjQscjQscjEwCisJYWRkCXI1LHI1LHIxMQorCWFkZAlyNixyNixyMTIKKwlpdAllcQorCW1vdmVxCXNwLHIxNAorCWFkZAlyNyxyNyxyOQorCWl0CW5lCisJbGRybmUJcjksW3NwXQorCXN0bWlhCXIwLHtyMyxyNCxyNSxyNixyN30KKwlpdHQJbmUKKwlhZGRuZQlyMTIsc3AsIzMqMTYKKwlibmUJTG9vcF9uZW9uCisKKwlAIHZsZG1pYQlzcCEse2Q4LWQxNX0KKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLHBjfQorCisjZW5kaWYKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisKKyMgaWYgZGVmaW5lZChfX3RodW1iMl9fKQorIyAgZGVmaW5lIElOU1QoYSxiLGMsZCkJLmJ5dGUJYyxkfDB4ZixhLGIKKyMgZWxzZQorIyAgZGVmaW5lIElOU1QoYSxiLGMsZCkJLmJ5dGUJYSxiLGMsZHwweDEwCisjIGVuZGlmCisKKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlzaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjgKKyNlbmRpZgorLmFsaWduCTUKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hcm12ODoKK0xBUk12ODoKKwl2c3RtZGIJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0JCUAgQUJJIHNwZWNpZmljYXRpb24gc2F5cyBzbworCisJdmVvcglxMSxxMSxxMQorCWFkcglyMyxMS18wMF8xOQorCXZsZDEuMzIJe3EwfSxbcjBdIQorCXZsZDEuMzIJe2QyWzBdfSxbcjBdCisJc3ViCXIwLHIwLCMxNgorCXZsZDEuMzIJe2QxNltdLGQxN1tdfSxbcjMsOjMyXSEKKwl2bGQxLjMyCXtkMThbXSxkMTlbXX0sW3IzLDozMl0hCisJdmxkMS4zMgl7ZDIwW10sZDIxW119LFtyMyw6MzJdIQorCXZsZDEuMzIJe2QyMltdLGQyM1tdfSxbcjMsOjMyXQorCitMb29wX3Y4OgorCXZsZDEuOAl7cTQscTV9LFtyMV0hCisJdmxkMS44CXtxNixxN30sW3IxXSEKKwl2cmV2MzIuOAlxNCxxNAorCXZyZXYzMi44CXE1LHE1CisKKwl2YWRkLmkzMglxMTIscTgscTQKKwl2cmV2MzIuOAlxNixxNgorCXZtb3YJcTE0LHEwCUAgb2ZmbG9hZAorCXN1YnMJcjIscjIsIzEKKworCXZhZGQuaTMyCXExMyxxOCxxNQorCXZyZXYzMi44CXE3LHE3CisJSU5TVCgweGMwLDB4NjIsMHhiOSwweGYzKQlAIHNoYTFoIHEzLHEwCQlAIDAKKwlJTlNUKDB4NjgsMHgwYywweDAyLDB4ZTIpCUAgc2hhMWMgcTAscTEscTEyCisJdmFkZC5pMzIJcTEyLHE4LHE2CisJSU5TVCgweDRjLDB4OGMsMHgzYSwweGUyKQlAIHNoYTFzdTAgcTQscTUscTYKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgMQorCUlOU1QoMHg2YSwweDBjLDB4MDYsMHhlMikJQCBzaGExYyBxMCxxMyxxMTMKKwl2YWRkLmkzMglxMTMscTgscTcKKwlJTlNUKDB4OGUsMHg4MywweGJhLDB4ZjMpCUAgc2hhMXN1MSBxNCxxNworCUlOU1QoMHg0ZSwweGFjLDB4M2MsMHhlMikJQCBzaGExc3UwIHE1LHE2LHE3CisJSU5TVCgweGMwLDB4NjIsMHhiOSwweGYzKQlAIHNoYTFoIHEzLHEwCQlAIDIKKwlJTlNUKDB4NjgsMHgwYywweDA0LDB4ZTIpCUAgc2hhMWMgcTAscTIscTEyCisJdmFkZC5pMzIJcTEyLHE4LHE0CisJSU5TVCgweDg4LDB4YTMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTUscTQKKwlJTlNUKDB4NDgsMHhjYywweDNlLDB4ZTIpCUAgc2hhMXN1MCBxNixxNyxxNAorCUlOU1QoMHhjMCwweDQyLDB4YjksMHhmMykJQCBzaGExaCBxMixxMAkJQCAzCisJSU5TVCgweDZhLDB4MGMsMHgwNiwweGUyKQlAIHNoYTFjIHEwLHEzLHExMworCXZhZGQuaTMyCXExMyxxOSxxNQorCUlOU1QoMHg4YSwweGMzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE2LHE1CisJSU5TVCgweDRhLDB4ZWMsMHgzOCwweGUyKQlAIHNoYTFzdTAgcTcscTQscTUKKwlJTlNUKDB4YzAsMHg2MiwweGI5LDB4ZjMpCUAgc2hhMWggcTMscTAJCUAgNAorCUlOU1QoMHg2OCwweDBjLDB4MDQsMHhlMikJQCBzaGExYyBxMCxxMixxMTIKKwl2YWRkLmkzMglxMTIscTkscTYKKwlJTlNUKDB4OGMsMHhlMywweGJhLDB4ZjMpCUAgc2hhMXN1MSBxNyxxNgorCUlOU1QoMHg0YywweDhjLDB4M2EsMHhlMikJQCBzaGExc3UwIHE0LHE1LHE2CisJSU5TVCgweGMwLDB4NDIsMHhiOSwweGYzKQlAIHNoYTFoIHEyLHEwCQlAIDUKKwlJTlNUKDB4NmEsMHgwYywweDE2LDB4ZTIpCUAgc2hhMXAgcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHE5LHE3CisJSU5TVCgweDhlLDB4ODMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTQscTcKKwlJTlNUKDB4NGUsMHhhYywweDNjLDB4ZTIpCUAgc2hhMXN1MCBxNSxxNixxNworCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCA2CisJSU5TVCgweDY4LDB4MGMsMHgxNCwweGUyKQlAIHNoYTFwIHEwLHEyLHExMgorCXZhZGQuaTMyCXExMixxOSxxNAorCUlOU1QoMHg4OCwweGEzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE1LHE0CisJSU5TVCgweDQ4LDB4Y2MsMHgzZSwweGUyKQlAIHNoYTFzdTAgcTYscTcscTQKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgNworCUlOU1QoMHg2YSwweDBjLDB4MTYsMHhlMikJQCBzaGExcCBxMCxxMyxxMTMKKwl2YWRkLmkzMglxMTMscTkscTUKKwlJTlNUKDB4OGEsMHhjMywweGJhLDB4ZjMpCUAgc2hhMXN1MSBxNixxNQorCUlOU1QoMHg0YSwweGVjLDB4MzgsMHhlMikJQCBzaGExc3UwIHE3LHE0LHE1CisJSU5TVCgweGMwLDB4NjIsMHhiOSwweGYzKQlAIHNoYTFoIHEzLHEwCQlAIDgKKwlJTlNUKDB4NjgsMHgwYywweDE0LDB4ZTIpCUAgc2hhMXAgcTAscTIscTEyCisJdmFkZC5pMzIJcTEyLHExMCxxNgorCUlOU1QoMHg4YywweGUzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE3LHE2CisJSU5TVCgweDRjLDB4OGMsMHgzYSwweGUyKQlAIHNoYTFzdTAgcTQscTUscTYKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgOQorCUlOU1QoMHg2YSwweDBjLDB4MTYsMHhlMikJQCBzaGExcCBxMCxxMyxxMTMKKwl2YWRkLmkzMglxMTMscTEwLHE3CisJSU5TVCgweDhlLDB4ODMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTQscTcKKwlJTlNUKDB4NGUsMHhhYywweDNjLDB4ZTIpCUAgc2hhMXN1MCBxNSxxNixxNworCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCAxMAorCUlOU1QoMHg2OCwweDBjLDB4MjQsMHhlMikJQCBzaGExbSBxMCxxMixxMTIKKwl2YWRkLmkzMglxMTIscTEwLHE0CisJSU5TVCgweDg4LDB4YTMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTUscTQKKwlJTlNUKDB4NDgsMHhjYywweDNlLDB4ZTIpCUAgc2hhMXN1MCBxNixxNyxxNAorCUlOU1QoMHhjMCwweDQyLDB4YjksMHhmMykJQCBzaGExaCBxMixxMAkJQCAxMQorCUlOU1QoMHg2YSwweDBjLDB4MjYsMHhlMikJQCBzaGExbSBxMCxxMyxxMTMKKwl2YWRkLmkzMglxMTMscTEwLHE1CisJSU5TVCgweDhhLDB4YzMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTYscTUKKwlJTlNUKDB4NGEsMHhlYywweDM4LDB4ZTIpCUAgc2hhMXN1MCBxNyxxNCxxNQorCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCAxMgorCUlOU1QoMHg2OCwweDBjLDB4MjQsMHhlMikJQCBzaGExbSBxMCxxMixxMTIKKwl2YWRkLmkzMglxMTIscTEwLHE2CisJSU5TVCgweDhjLDB4ZTMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTcscTYKKwlJTlNUKDB4NGMsMHg4YywweDNhLDB4ZTIpCUAgc2hhMXN1MCBxNCxxNSxxNgorCUlOU1QoMHhjMCwweDQyLDB4YjksMHhmMykJQCBzaGExaCBxMixxMAkJQCAxMworCUlOU1QoMHg2YSwweDBjLDB4MjYsMHhlMikJQCBzaGExbSBxMCxxMyxxMTMKKwl2YWRkLmkzMglxMTMscTExLHE3CisJSU5TVCgweDhlLDB4ODMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTQscTcKKwlJTlNUKDB4NGUsMHhhYywweDNjLDB4ZTIpCUAgc2hhMXN1MCBxNSxxNixxNworCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCAxNAorCUlOU1QoMHg2OCwweDBjLDB4MjQsMHhlMikJQCBzaGExbSBxMCxxMixxMTIKKwl2YWRkLmkzMglxMTIscTExLHE0CisJSU5TVCgweDg4LDB4YTMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTUscTQKKwlJTlNUKDB4NDgsMHhjYywweDNlLDB4ZTIpCUAgc2hhMXN1MCBxNixxNyxxNAorCUlOU1QoMHhjMCwweDQyLDB4YjksMHhmMykJQCBzaGExaCBxMixxMAkJQCAxNQorCUlOU1QoMHg2YSwweDBjLDB4MTYsMHhlMikJQCBzaGExcCBxMCxxMyxxMTMKKwl2YWRkLmkzMglxMTMscTExLHE1CisJSU5TVCgweDhhLDB4YzMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTYscTUKKwlJTlNUKDB4NGEsMHhlYywweDM4LDB4ZTIpCUAgc2hhMXN1MCBxNyxxNCxxNQorCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCAxNgorCUlOU1QoMHg2OCwweDBjLDB4MTQsMHhlMikJQCBzaGExcCBxMCxxMixxMTIKKwl2YWRkLmkzMglxMTIscTExLHE2CisJSU5TVCgweDhjLDB4ZTMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTcscTYKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgMTcKKwlJTlNUKDB4NmEsMHgwYywweDE2LDB4ZTIpCUAgc2hhMXAgcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHExMSxxNworCisJSU5TVCgweGMwLDB4NjIsMHhiOSwweGYzKQlAIHNoYTFoIHEzLHEwCQlAIDE4CisJSU5TVCgweDY4LDB4MGMsMHgxNCwweGUyKQlAIHNoYTFwIHEwLHEyLHExMgorCisJSU5TVCgweGMwLDB4NDIsMHhiOSwweGYzKQlAIHNoYTFoIHEyLHEwCQlAIDE5CisJSU5TVCgweDZhLDB4MGMsMHgxNiwweGUyKQlAIHNoYTFwIHEwLHEzLHExMworCisJdmFkZC5pMzIJcTEscTEscTIKKwl2YWRkLmkzMglxMCxxMCxxMTQKKwlibmUJTG9vcF92OAorCisJdnN0MS4zMgl7cTB9LFtyMF0hCisJdnN0MS4zMgl7ZDJbMF19LFtyMF0KKworCXZsZG1pYQlzcCEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQorCWJ4CWxyCQkJCQlAIGJ4IGxyCisKKyNlbmRpZgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKy5jb21tCV9PUEVOU1NMX2FybWNhcF9QLDQKKy5ub25fbGF6eV9zeW1ib2xfcG9pbnRlcgorT1BFTlNTTF9hcm1jYXBfUDoKKy5pbmRpcmVjdF9zeW1ib2wJX09QRU5TU0xfYXJtY2FwX1AKKy5sb25nCTAKKy5wcml2YXRlX2V4dGVybglfT1BFTlNTTF9hcm1jYXBfUAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LWFybXY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LWFybXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlNGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYtYXJtdjQuUwpAQCAtMCwwICsxLDI4MzEgQEAKK0AgQ29weXJpZ2h0IDIwMDctMjAxNiBUaGUgT3BlblNTTCBQcm9qZWN0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCitAIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbiBvYnRhaW4gYSBjb3B5CitAIGluIHRoZSBmaWxlIExJQ0VOU0UgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3IgYXQKK0AgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisKK0AgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0AgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCitAIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKK0AgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKK0AgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCitACitAIFBlcm1pc3Npb24gdG8gdXNlIHVuZGVyIEdQTCB0ZXJtcyBpcyBncmFudGVkLgorQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAIFNIQTI1NiBibG9jayBwcm9jZWR1cmUgZm9yIEFSTXY0LiBNYXkgMjAwNy4KKworQCBQZXJmb3JtYW5jZSBpcyB+MnggYmV0dGVyIHRoYW4gZ2NjIDMuNCBnZW5lcmF0ZWQgY29kZSBhbmQgaW4gImFic28tCitAIGx1dGUiIHRlcm1zIGlzIH4yMjUwIGN5Y2xlcyBwZXIgNjQtYnl0ZSBibG9jayBvciB+MzUgY3ljbGVzIHBlcgorQCBieXRlIFtvbiBzaW5nbGUtaXNzdWUgWHNjYWxlIFBYQTI1MCBjb3JlXS4KKworQCBKdWx5IDIwMTAuCitACitAIFJlc2NoZWR1bGluZyBmb3IgZHVhbC1pc3N1ZSBwaXBlbGluZSByZXN1bHRlZCBpbiAyMiUgaW1wcm92ZW1lbnQgb24KK0AgQ29ydGV4IEE4IGNvcmUgYW5kIH4yMCBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLgorCitAIEZlYnJ1YXJ5IDIwMTEuCitACitAIFByb2ZpbGVyLWFzc2lzdGVkIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gcmVzdWx0ZWQgaW4gMTYlCitAIGltcHJvdmVtZW50IG9uIENvcnRleCBBOCBjb3JlIGFuZCB+MTUuNCBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLgorCitAIFNlcHRlbWJlciAyMDEzLgorQAorQCBBZGQgTkVPTiBpbXBsZW1lbnRhdGlvbi4gT24gQ29ydGV4IEE4IGl0IHdhcyBtZWFzdXJlZCB0byBwcm9jZXNzIG9uZQorQCBieXRlIGluIDEyLjUgY3ljbGVzIG9yIDIzJSBmYXN0ZXIgdGhhbiBpbnRlZ2VyLW9ubHkgY29kZS4gU25hcGRyYWdvbgorQCBTNCBkb2VzIGl0IGluIDEyLjUgY3ljbGVzIHRvbywgYnV0IGl0J3MgNTAlIGZhc3RlciB0aGFuIGludGVnZXItb25seQorQCBjb2RlIChtZWFuaW5nIHRoYXQgbGF0dGVyIHBlcmZvcm1zIHN1Yi1vcHRpbWFsbHksIG5vdGhpbmcgd2FzIGRvbmUKK0AgYWJvdXQgaXQpLgorCitAIE1heSAyMDE0LgorQAorQCBBZGQgQVJNdjggY29kZSBwYXRoIHBlcmZvcm1pbmcgYXQgMi4wIGNwYiBvbiBBcHBsZSBBNy4KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNlbHNlCisjIGRlZmluZSBfX0FSTV9BUkNIX18gX19MSU5VWF9BUk1fQVJDSF9fCisjIGRlZmluZSBfX0FSTV9NQVhfQVJDSF9fIDcKKyNlbmRpZgorCitAIFNpbGVuY2UgQVJNdjggZGVwcmVjYXRlZCBJVCBpbnN0cnVjdGlvbiB3YXJuaW5ncy4gVGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aAorQCBBUk12NyBhbmQgQVJNdjggcHJvY2Vzc29ycy4gSXQgZG9lcyBoYXZlIEFSTXY4LW9ubHkgY29kZSwgYnV0IHRob3NlCitAIGluc3RydWN0aW9ucyBhcmUgbWFudWFsbHktZW5jb2RlZC4gKFNlZSB1bnNoYTI1Ni4pCisKKworLnRleHQKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pCisuc3ludGF4CXVuaWZpZWQKKy50aHVtYgorI2Vsc2UKKy5jb2RlCTMyCisjZW5kaWYKKworCisuYWxpZ24JNQorSzI1NjoKKy53b3JkCTB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUKKy53b3JkCTB4Mzk1NmMyNWIsMHg1OWYxMTFmMSwweDkyM2Y4MmE0LDB4YWIxYzVlZDUKKy53b3JkCTB4ZDgwN2FhOTgsMHgxMjgzNWIwMSwweDI0MzE4NWJlLDB4NTUwYzdkYzMKKy53b3JkCTB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQKKy53b3JkCTB4ZTQ5YjY5YzEsMHhlZmJlNDc4NiwweDBmYzE5ZGM2LDB4MjQwY2ExY2MKKy53b3JkCTB4MmRlOTJjNmYsMHg0YTc0ODRhYSwweDVjYjBhOWRjLDB4NzZmOTg4ZGEKKy53b3JkCTB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcKKy53b3JkCTB4YzZlMDBiZjMsMHhkNWE3OTE0NywweDA2Y2E2MzUxLDB4MTQyOTI5NjcKKy53b3JkCTB4MjdiNzBhODUsMHgyZTFiMjEzOCwweDRkMmM2ZGZjLDB4NTMzODBkMTMKKy53b3JkCTB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUKKy53b3JkCTB4YTJiZmU4YTEsMHhhODFhNjY0YiwweGMyNGI4YjcwLDB4Yzc2YzUxYTMKKy53b3JkCTB4ZDE5MmU4MTksMHhkNjk5MDYyNCwweGY0MGUzNTg1LDB4MTA2YWEwNzAKKy53b3JkCTB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUKKy53b3JkCTB4MzkxYzBjYjMsMHg0ZWQ4YWE0YSwweDViOWNjYTRmLDB4NjgyZTZmZjMKKy53b3JkCTB4NzQ4ZjgyZWUsMHg3OGE1NjM2ZiwweDg0Yzg3ODE0LDB4OGNjNzAyMDgKKy53b3JkCTB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIKKworLndvcmQJMAkJCQlAIHRlcm1pbmF0b3IKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03ICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCitMT1BFTlNTTF9hcm1jYXA6Cisud29yZAlPUEVOU1NMX2FybWNhcF9QLUxzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorI2VuZGlmCisuYWxpZ24JNQorCisuZ2xvYmwJX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisucHJpdmF0ZV9leHRlcm4JX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisjZW5kaWYKK19zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKK0xzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKyNpZiBfX0FSTV9BUkNIX188NyAmJiAhZGVmaW5lZChfX3RodW1iMl9fKQorCXN1YglyMyxwYywjOAkJQCBfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKyNlbHNlCisJYWRyCXIzLExzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorI2VuZGlmCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorCWxkcglyMTIsTE9QRU5TU0xfYXJtY2FwCisJbGRyCXIxMixbcjMscjEyXQkJQCBPUEVOU1NMX2FybWNhcF9QCisjaWZkZWYJX19BUFBMRV9fCisJbGRyCXIxMixbcjEyXQorI2VuZGlmCisJdHN0CXIxMiwjQVJNVjhfU0hBMjU2CisJYm5lCUxBUk12OAorCXRzdAlyMTIsI0FSTVY3X05FT04KKwlibmUJTE5FT04KKyNlbmRpZgorCWFkZAlyMixyMSxyMixsc2wjNglAIGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mIGlucAorCXN0bWRiCXNwISx7cjAscjEscjIscjQtcjExLGxyfQorCWxkbWlhCXIwLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQorCXN1YglyMTQscjMsIzI1NiszMglAIEsyNTYKKwlzdWIJc3Asc3AsIzE2KjQJCUAgYWxsb2NhKFhbMTZdKQorTG9vcDoKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNSxyNgkJQCBtYWdpYworCWVvcglyMTIscjEyLHIxMgorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDAKKyMgaWYgMD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOCxyOCxyb3IjNQorCWFkZAlyNCxyNCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyOCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMAorCWFkZAlyNCxyNCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOCxyOCxyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyMTEscjExLHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMCo0XQorCWVvcglyMixyOSxyMTAKKwlhZGQJcjExLHIxMSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOAorCWFkZAlyMTEscjExLHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTAJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNCxyNCxyb3IjMTEKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAwPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMyKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI0LHI1CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTUqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDEKKyMgaWYgMT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNyxyNyxyb3IjNQorCWFkZAlyMTEscjExLHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjcscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDEKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAxPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI3LHI3LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyMTAscjEwLHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMSo0XQorCWVvcglyMixyOCxyOQorCWFkZAlyMTAscjEwLHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI3CisJYWRkCXIxMCxyMTAscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjkJCQlAIENoKGUsZixnKQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCWFkZAlyMTAscjEwLHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzMqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyMTEscjQJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMwKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHIxMSxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI2LHI2LHIxMAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI0CQkJQCBNYWooYSxiLGMpCisJYWRkCXIxMCxyMTAscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyMTAscjEwLHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDIKKyMgaWYgMj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNixyNixyb3IjNQorCWFkZAlyMTAscjEwLHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCAyCisJYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDI9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjYscjYscm9yIzUKKwlvcnIJcjIscjIscjEyLGxzbCMyNAorCWVvcglyMCxyMCxyNixyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjkscjkscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMyKjRdCisJZW9yCXIyLHI3LHI4CisJYWRkCXI5LHI5LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI2CisJYWRkCXI5LHI5LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMCxyMTAscm9yIzExCisJYWRkCXI5LHI5LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyPT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDI8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHIxMCxyMTEJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjNCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyMTAscjExCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMSo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTAscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI1LHI1LHI5CQkJQCBkKz1oCisJZW9yCXIzLHIzLHIxMQkJCUAgTWFqKGEsYixjKQorCWFkZAlyOSxyOSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI5LHI5LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMworIyBpZiAzPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI1LHI1LHJvciM1CisJYWRkCXI5LHI5LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjUscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDMKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMz09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNSxyNSxyb3IjNQorCW9ycglyMixyMixyMyxsc2wjMjQKKwllb3IJcjAscjAscjUscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjgscjgscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMzKjRdCisJZW9yCXIyLHI2LHI3CisJYWRkCXI4LHI4LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI1CisJYWRkCXI4LHI4LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI3CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjkscjkscm9yIzExCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAzPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDM8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjkscjEwCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzUqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMyKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI5LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjQscjQscjgJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyMTAJCQlAIE1haihhLGIsYykKKwlhZGQJcjgscjgscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA0CisjIGlmIDQ9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjQscjQscm9yIzUKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjQscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDQKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDQ9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjQscjQscm9yIzUKKwlvcnIJcjIscjIscjEyLGxzbCMyNAorCWVvcglyMCxyMCxyNCxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjcscjcscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCM0KjRdCisJZW9yCXIyLHI1LHI2CisJYWRkCXI3LHI3LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI0CisJYWRkCXI3LHI3LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNgkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWFkZAlyNyxyNyxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgND09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiA0PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyOCxyOQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM2KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMyo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyOCxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjMscjMscjEyCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjExLHIxMSxyNwkJCUAgZCs9aAorCWVvcglyMyxyMyxyOQkJCUAgTWFqKGEsYixjKQorCWFkZAlyNyxyNyxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI3LHI3LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgNQorIyBpZiA1PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyMTEscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDUKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgNT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTEscjExLHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyMTEscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjYscjYscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCM1KjRdCisJZW9yCXIyLHI0LHI1CisJYWRkCXI2LHI2LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHIxMQorCWFkZAlyNixyNixyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI3LHI3LHJvciMxMQorCWFkZAlyNixyNixyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgNT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiA1PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzcqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzQqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjcscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTAscjEwLHI2CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjgJCQlAIE1haihhLGIsYykKKwlhZGQJcjYscjYscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA2CisjIGlmIDY9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjEwLHIxMCxyb3IjNQorCWFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyMTAscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDYKKwlhZGQJcjYscjYscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDY9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjEwLHIxMCxyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjUscjUscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCM2KjRdCisJZW9yCXIyLHIxMSxyNAorCWFkZAlyNSxyNSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyMTAKKwlhZGQJcjUscjUscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI0CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjYscjYscm9yIzExCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA2PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDY8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI2LHI3CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzgqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM1KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgNworIyBpZiA3PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI5LHI5LHJvciM1CisJYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjkscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDcKKwlhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgNz09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOSxyOSxyb3IjNQorCW9ycglyMixyMixyMyxsc2wjMjQKKwllb3IJcjAscjAscjkscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjQscjQscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCM3KjRdCisJZW9yCXIyLHIxMCxyMTEKKwlhZGQJcjQscjQscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjkKKwlhZGQJcjQscjQscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjExCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjUscjUscm9yIzExCisJYWRkCXI0LHI0LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA3PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDc8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjUscjYJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjOSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjNio0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyNSxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI4LHI4LHI0CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjYJCQlAIE1haihhLGIsYykKKwlhZGQJcjQscjQscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNCxyNCxyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA4CisjIGlmIDg9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjgscjgscm9yIzUKKwlhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjgscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDgKKwlhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDg9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjgscjgscm9yIzUKKwlvcnIJcjIscjIscjEyLGxzbCMyNAorCWVvcglyMCxyMCxyOCxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzgqNF0KKwllb3IJcjIscjkscjEwCisJYWRkCXIxMSxyMTEscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjgKKwlhZGQJcjExLHIxMSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjQscjQscm9yIzExCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDg9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgODwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjQscjUJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTAqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjQscjUJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM3KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI0LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNyxyNyxyMTEJCQlAIGQrPWgKKwllb3IJcjMscjMscjUJCQlAIE1haihhLGIsYykKKwlhZGQJcjExLHIxMSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXIxMSxyMTEscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA5CisjIGlmIDk9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjcscjcscm9yIzUKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI3LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCA5CisJYWRkCXIxMSxyMTEscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgOT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNyxyNyxyb3IjNQorCW9ycglyMixyMixyMyxsc2wjMjQKKwllb3IJcjAscjAscjcscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzkqNF0KKwllb3IJcjIscjgscjkKKwlhZGQJcjEwLHIxMCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNworCWFkZAlyMTAscjEwLHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI5CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjExLHIxMSxyb3IjMTEKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgOT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiA5PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHIxMSxyNAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHIxMSxyNAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzgqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjExLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjYscjYscjEwCQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjQJCQlAIE1haihhLGIsYykKKwlhZGQJcjEwLHIxMCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTAKKyMgaWYgMTA9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNixyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTAKKwlhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMTA9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjYscjYscm9yIzUKKwlvcnIJcjIscjIscjEyLGxzbCMyNAorCWVvcglyMCxyMCxyNixyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjkscjkscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxMCo0XQorCWVvcglyMixyNyxyOAorCWFkZAlyOSxyOSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNgorCWFkZAlyOSxyOSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjgJCQlAIENoKGUsZixnKQorCWVvcglyMCxyMTAscjEwLHJvciMxMQorCWFkZAlyOSxyOSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTA9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTA8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHIxMCxyMTEJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTIqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzkqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjEwLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNSxyNSxyOQkJCUAgZCs9aAorCWVvcglyMyxyMyxyMTEJCQlAIE1haihhLGIsYykKKwlhZGQJcjkscjkscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDExCisjIGlmIDExPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI1LHI1LHJvciM1CisJYWRkCXI5LHI5LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjUscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDExCisJYWRkCXI5LHI5LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIzLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjMsbHNsIzgKKwlsZHJiCXIzLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDExPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI1LHI1LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyNSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOCxyOCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzExKjRdCisJZW9yCXIyLHI2LHI3CisJYWRkCXI4LHI4LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI1CisJYWRkCXI4LHI4LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI3CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjkscjkscm9yIzExCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxMT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxMTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTMqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxMCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyOSxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI0LHI0LHI4CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjEwCQkJQCBNYWooYSxiLGMpCisJYWRkCXI4LHI4LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTIKKyMgaWYgMTI9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjQscjQscm9yIzUKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjQscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDEyCisJYWRkCXI4LHI4LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMTIsbHNsIzgKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAxMj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNCxyNCxyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNyxyNyxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzEyKjRdCisJZW9yCXIyLHI1LHI2CisJYWRkCXI3LHI3LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI0CisJYWRkCXI3LHI3LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNgkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWFkZAlyNyxyNyxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTI9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTI8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzE0KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTEqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjgscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXIxMSxyMTEscjcJCQlAIGQrPWgKKwllb3IJcjMscjMscjkJCQlAIE1haihhLGIsYykKKwlhZGQJcjcscjcscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDEzCisjIGlmIDEzPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyMTEscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDEzCisJYWRkCXI3LHI3LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIzLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjMsbHNsIzgKKwlsZHJiCXIzLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDEzPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNixyNixyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzEzKjRdCisJZW9yCXIyLHI0LHI1CisJYWRkCXI2LHI2LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHIxMQorCWFkZAlyNixyNixyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI3LHI3LHJvciMxMQorCWFkZAlyNixyNixyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTM9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTM8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjcscjgJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTUqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEyKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI3LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjEwLHIxMCxyNgkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI4CQkJQCBNYWooYSxiLGMpCisJYWRkCXI2LHI2LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjYscjYscjEyCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTQKKyMgaWYgMTQ9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjEwLHIxMCxyb3IjNQorCWFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyMTAscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDE0CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMTIsbHNsIzgKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAxND09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTAscjEwLHJvciM1CisJb3JyCXIyLHIyLHIxMixsc2wjMjQKKwllb3IJcjAscjAscjEwLHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNSxyNSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzE0KjRdCisJZW9yCXIyLHIxMSxyNAorCWFkZAlyNSxyNSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyMTAKKwlhZGQJcjUscjUscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI0CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjYscjYscm9yIzExCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxND09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxNDwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTUKKyMgaWYgMTU9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjkscjkscm9yIzUKKwlhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyOSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTUKKwlhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMTU9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjkscjkscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHI5LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI0LHI0LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTUqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE1PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE1PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzEqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzE0KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI1LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjgscjgscjQJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNCxyNCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorTHJvdW5kc18xNl94eDoKKwlAIGxkcglyMixbc3AsIzEqNF0JCUAgMTYKKwlAIGxkcglyMSxbc3AsIzE0KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMwKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjOSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjgscjgscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzAqNF0KKwllb3IJcjIscjkscjEwCisJYWRkCXIxMSxyMTEscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjgKKwlhZGQJcjExLHIxMSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjQscjQscm9yIzExCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE2PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE2PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMyKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI0LHI1CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTUqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMio0XQkJQCAxNworCUAgbGRyCXIxLFtzcCwjMTUqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxKjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzEwKjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjcscjcscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjcscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxKjRdCisJZW9yCXIyLHI4LHI5CisJYWRkCXIxMCxyMTAscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjcKKwlhZGQJcjEwLHIxMCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE3PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE3PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHIxMSxyNAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMzKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzMqNF0JCUAgMTgKKwlAIGxkcglyMSxbc3AsIzAqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMTIscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMTIscjEyLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMio0XQorCWVvcglyMTIscjEyLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzExKjRdCisKKwlhZGQJcjEyLHIxMixyMAorCWVvcglyMCxyNixyNixyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMTIKKwllb3IJcjAscjAscjYscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOSxyOSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzIqNF0KKwllb3IJcjIscjcscjgKKwlhZGQJcjkscjkscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjYKKwlhZGQJcjkscjkscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI4CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwlhZGQJcjkscjkscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE4PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyMTAscjExCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzQqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjEwLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNSxyNSxyOQkJCUAgZCs9aAorCWVvcglyMyxyMyxyMTEJCQlAIE1haihhLGIsYykKKwlhZGQJcjkscjkscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjNCo0XQkJQCAxOQorCUAgbGRyCXIxLFtzcCwjMSo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMzKjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzEyKjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjUscjUscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjUscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMyo0XQorCWVvcglyMixyNixyNworCWFkZAlyOCxyOCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNQorCWFkZAlyOCxyOCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNwkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI5LHI5LHJvciMxMQorCWFkZAlyOCxyOCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTk9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTk8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjkscjEwCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzUqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMyKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI5LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjQscjQscjgJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyMTAJCQlAIE1haihhLGIsYykKKwlhZGQJcjgscjgscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzUqNF0JCUAgMjAKKwlAIGxkcglyMSxbc3AsIzIqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzQqNF0KKwllb3IJcjEyLHIxMixyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCMxMyo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjQscjQscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjcscjcscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCM0KjRdCisJZW9yCXIyLHI1LHI2CisJYWRkCXI3LHI3LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI0CisJYWRkCXI3LHI3LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNgkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWFkZAlyNyxyNyxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjA9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjA8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzYqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzYqNF0JCUAgMjEKKwlAIGxkcglyMSxbc3AsIzMqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMyxyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIzLHIzLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjNSo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCMxNCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHIxMSxyMTEscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjExLHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNixyNixyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzUqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyMT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyMTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM3KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjcscjgJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM0KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI3LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjEwLHIxMCxyNgkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI4CQkJQCBNYWooYSxiLGMpCisJYWRkCXI2LHI2LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjYscjYscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM3KjRdCQlAIDIyCisJQCBsZHIJcjEsW3NwLCM0KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM2KjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMTUqNF0KKworCWFkZAlyMTIscjEyLHIwCisJZW9yCXIwLHIxMCxyMTAscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKwlhZGQJcjIscjIscjEJCQlAIFhbaV0KKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjNio0XQorCWVvcglyMixyMTEscjQKKwlhZGQJcjUscjUscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjEwCisJYWRkCXI1LHI1LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWFkZAlyNSxyNSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjI9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjI8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI2LHI3CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzgqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM1KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM4KjRdCQlAIDIzCisJQCBsZHIJcjEsW3NwLCM1KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjMscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMyxyMyxyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzcqNF0KKwllb3IJcjMscjMscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHI5LHI5LHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIzCisJZW9yCXIwLHIwLHI5LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNCxyNCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzcqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDIzPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDIzPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzkqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzYqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjUscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOCxyOCxyNAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI2CQkJQCBNYWooYSxiLGMpCisJYWRkCXI0LHI0LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM5KjRdCQlAIDI0CisJQCBsZHIJcjEsW3NwLCM2KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM4KjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjgscjgscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzgqNF0KKwllb3IJcjIscjkscjEwCisJYWRkCXIxMSxyMTEscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjgKKwlhZGQJcjExLHIxMSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjQscjQscm9yIzExCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI0PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDI0PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzcqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMTAqNF0JCUAgMjUKKwlAIGxkcglyMSxbc3AsIzcqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM5KjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzIqNF0KKworCWFkZAlyMyxyMyxyMAorCWVvcglyMCxyNyxyNyxyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMworCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKwlhZGQJcjIscjIscjEJCQlAIFhbaV0KKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzkqNF0KKwllb3IJcjIscjgscjkKKwlhZGQJcjEwLHIxMCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNworCWFkZAlyMTAscjEwLHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI5CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjExLHIxMSxyb3IjMTEKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjU9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjU8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzExKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjOCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzExKjRdCQlAIDI2CisJQCBsZHIJcjEsW3NwLCM4KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzEwKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMyo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjYscjYscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjkscjkscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxMCo0XQorCWVvcglyMixyNyxyOAorCWFkZAlyOSxyOSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNgorCWFkZAlyOSxyOSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjgJCQlAIENoKGUsZixnKQorCWVvcglyMCxyMTAscjEwLHJvciMxMQorCWFkZAlyOSxyOSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjY9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjY8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHIxMCxyMTEJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTIqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzkqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjEwLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNSxyNSxyOQkJCUAgZCs9aAorCWVvcglyMyxyMyxyMTEJCQlAIE1haihhLGIsYykKKwlhZGQJcjkscjkscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMTIqNF0JCUAgMjcKKwlAIGxkcglyMSxbc3AsIzkqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMyxyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIzLHIzLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMTEqNF0KKwllb3IJcjMscjMscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjNCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHI1LHI1LHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIzCisJZW9yCXIwLHIwLHI1LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOCxyOCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzExKjRdCisJZW9yCXIyLHI2LHI3CisJYWRkCXI4LHI4LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI1CisJYWRkCXI4LHI4LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI3CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjkscjkscm9yIzExCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyNz09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyNzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTMqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxMCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyOSxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI0LHI0LHI4CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjEwCQkJQCBNYWooYSxiLGMpCisJYWRkCXI4LHI4LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCMxMyo0XQkJQCAyOAorCUAgbGRyCXIxLFtzcCwjMTAqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzEyKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjNSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjQscjQscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjcscjcscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxMio0XQorCWVvcglyMixyNSxyNgorCWFkZAlyNyxyNyxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNAorCWFkZAlyNyxyNyxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjYJCQlAIENoKGUsZixnKQorCWVvcglyMCxyOCxyOCxyb3IjMTEKKwlhZGQJcjcscjcscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI4PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDI4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyOCxyOQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyOCxyOQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzExKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzE0KjRdCQlAIDI5CisJQCBsZHIJcjEsW3NwLCMxMSo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxMyo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM2KjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjExLHIxMSxyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMworCWVvcglyMCxyMCxyMTEscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTMqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyOT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyOTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTIqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjcscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTAscjEwLHI2CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjgJCQlAIE1haihhLGIsYykKKwlhZGQJcjYscjYscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzE1KjRdCQlAIDMwCisJQCBsZHIJcjEsW3NwLCMxMio0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMTIscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMTIscjEyLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMTQqNF0KKwllb3IJcjEyLHIxMixyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM3KjRdCisKKwlhZGQJcjEyLHIxMixyMAorCWVvcglyMCxyMTAscjEwLHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIxMgorCWVvcglyMCxyMCxyMTAscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNSxyNSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzE0KjRdCisJZW9yCXIyLHIxMSxyNAorCWFkZAlyNSxyNSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyMTAKKwlhZGQJcjUscjUscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI0CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjYscjYscm9yIzExCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAzMD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAzMDwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCMwKjRdCQlAIDMxCisJQCBsZHIJcjEsW3NwLCMxMyo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxNSo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM4KjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjkscjkscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjkscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI0LHI0LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTUqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDMxPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDMxPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzEqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzE0KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI1LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjgscjgscjQJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNCxyNCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCWl0ZQllcQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlsZHJlcQlyMyxbc3AsIzE2KjRdCQlAIHB1bGwgY3R4CisJYm5lCUxyb3VuZHNfMTZfeHgKKworCWFkZAlyNCxyNCxyMTIJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyCXIwLFtyMywjMF0KKwlsZHIJcjIsW3IzLCM0XQorCWxkcglyMTIsW3IzLCM4XQorCWFkZAlyNCxyNCxyMAorCWxkcglyMCxbcjMsIzEyXQorCWFkZAlyNSxyNSxyMgorCWxkcglyMixbcjMsIzE2XQorCWFkZAlyNixyNixyMTIKKwlsZHIJcjEyLFtyMywjMjBdCisJYWRkCXI3LHI3LHIwCisJbGRyCXIwLFtyMywjMjRdCisJYWRkCXI4LHI4LHIyCisJbGRyCXIyLFtyMywjMjhdCisJYWRkCXI5LHI5LHIxMgorCWxkcglyMSxbc3AsIzE3KjRdCQlAIHB1bGwgaW5wCisJbGRyCXIxMixbc3AsIzE4KjRdCQlAIHB1bGwgaW5wK2xlbgorCWFkZAlyMTAscjEwLHIwCisJYWRkCXIxMSxyMTEscjIKKwlzdG1pYQlyMyx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0KKwljbXAJcjEscjEyCisJc3ViCXIxNCxyMTQsIzI1NglAIHJld2luZCBLdGJsCisJYm5lCUxvb3AKKworCWFkZAlzcCxzcCwjMTkqNAlAIGRlc3Ryb3kgZnJhbWUKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscGN9CisjZWxzZQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0Cisud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKworI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKworCisKKy5nbG9ibAlfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorLnByaXZhdGVfZXh0ZXJuCV9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uCisjaWZkZWYgX190aHVtYjJfXworLnRodW1iX2Z1bmMJX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX25lb24KKyNlbmRpZgorLmFsaWduCTUKKy5za2lwCTE2Citfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbjoKK0xORU9OOgorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisKKwlzdWIJcjExLHNwLCMxNio0KzE2CisJYWRyCXIxNCxLMjU2CisJYmljCXIxMSxyMTEsIzE1CQlAIGFsaWduIGZvciAxMjgtYml0IHN0b3JlcworCW1vdglyMTIsc3AKKwltb3YJc3AscjExCQkJQCBhbGxvY2EKKwlhZGQJcjIscjEscjIsbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKworCXZsZDEuOAl7cTB9LFtyMV0hCisJdmxkMS44CXtxMX0sW3IxXSEKKwl2bGQxLjgJe3EyfSxbcjFdIQorCXZsZDEuOAl7cTN9LFtyMV0hCisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJdmxkMS4zMgl7cTl9LFtyMTQsOjEyOF0hCisJdmxkMS4zMgl7cTEwfSxbcjE0LDoxMjhdIQorCXZsZDEuMzIJe3ExMX0sW3IxNCw6MTI4XSEKKwl2cmV2MzIuOAlxMCxxMAkJQCB5ZXMsIGV2ZW4gb24KKwlzdHIJcjAsW3NwLCM2NF0KKwl2cmV2MzIuOAlxMSxxMQkJQCBiaWctZW5kaWFuCisJc3RyCXIxLFtzcCwjNjhdCisJbW92CXIxLHNwCisJdnJldjMyLjgJcTIscTIKKwlzdHIJcjIsW3NwLCM3Ml0KKwl2cmV2MzIuOAlxMyxxMworCXN0cglyMTIsW3NwLCM3Nl0JCUAgc2F2ZSBvcmlnaW5hbCBzcAorCXZhZGQuaTMyCXE4LHE4LHEwCisJdmFkZC5pMzIJcTkscTkscTEKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCXZhZGQuaTMyCXExMCxxMTAscTIKKwl2c3QxLjMyCXtxOX0sW3IxLDoxMjhdIQorCXZhZGQuaTMyCXExMSxxMTEscTMKKwl2c3QxLjMyCXtxMTB9LFtyMSw6MTI4XSEKKwl2c3QxLjMyCXtxMTF9LFtyMSw6MTI4XSEKKworCWxkbWlhCXIwLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQorCXN1YglyMSxyMSwjNjQKKwlsZHIJcjIsW3NwLCMwXQorCWVvcglyMTIscjEyLHIxMgorCWVvcglyMyxyNSxyNgorCWIJTF8wMF80OAorCisuYWxpZ24JNAorTF8wMF80ODoKKwl2ZXh0LjgJcTgscTAscTEsIzQKKwlhZGQJcjExLHIxMSxyMgorCWVvcglyMixyOSxyMTAKKwllb3IJcjAscjgscjgscm9yIzUKKwl2ZXh0LjgJcTkscTIscTMsIzQKKwlhZGQJcjQscjQscjEyCisJYW5kCXIyLHIyLHI4CisJZW9yCXIxMixyMCxyOCxyb3IjMTkKKwl2c2hyLnUzMglxMTAscTgsIzcKKwllb3IJcjAscjQscjQscm9yIzExCisJZW9yCXIyLHIyLHIxMAorCXZhZGQuaTMyCXEwLHEwLHE5CisJYWRkCXIxMSxyMTEscjEyLHJvciM2CisJZW9yCXIxMixyNCxyNQorCXZzaHIudTMyCXE5LHE4LCMzCisJZW9yCXIwLHIwLHI0LHJvciMyMAorCWFkZAlyMTEscjExLHIyCisJdnNsaS4zMglxMTAscTgsIzI1CisJbGRyCXIyLFtzcCwjNF0KKwlhbmQJcjMscjMscjEyCisJdnNoci51MzIJcTExLHE4LCMxOAorCWFkZAlyNyxyNyxyMTEKKwlhZGQJcjExLHIxMSxyMCxyb3IjMgorCWVvcglyMyxyMyxyNQorCXZlb3IJcTkscTkscTEwCisJYWRkCXIxMCxyMTAscjIKKwl2c2xpLjMyCXExMSxxOCwjMTQKKwllb3IJcjIscjgscjkKKwllb3IJcjAscjcscjcscm9yIzUKKwl2c2hyLnUzMglkMjQsZDcsIzE3CisJYWRkCXIxMSxyMTEscjMKKwlhbmQJcjIscjIscjcKKwl2ZW9yCXE5LHE5LHExMQorCWVvcglyMyxyMCxyNyxyb3IjMTkKKwllb3IJcjAscjExLHIxMSxyb3IjMTEKKwl2c2xpLjMyCWQyNCxkNywjMTUKKwllb3IJcjIscjIscjkKKwlhZGQJcjEwLHIxMCxyMyxyb3IjNgorCXZzaHIudTMyCWQyNSxkNywjMTAKKwllb3IJcjMscjExLHI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMjAKKwl2YWRkLmkzMglxMCxxMCxxOQorCWFkZAlyMTAscjEwLHIyCisJbGRyCXIyLFtzcCwjOF0KKwl2ZW9yCWQyNSxkMjUsZDI0CisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjYscjYscjEwCisJdnNoci51MzIJZDI0LGQ3LCMxOQorCWFkZAlyMTAscjEwLHIwLHJvciMyCisJZW9yCXIxMixyMTIscjQKKwl2c2xpLjMyCWQyNCxkNywjMTMKKwlhZGQJcjkscjkscjIKKwllb3IJcjIscjcscjgKKwl2ZW9yCWQyNSxkMjUsZDI0CisJZW9yCXIwLHI2LHI2LHJvciM1CisJYWRkCXIxMCxyMTAscjEyCisJdmFkZC5pMzIJZDAsZDAsZDI1CisJYW5kCXIyLHIyLHI2CisJZW9yCXIxMixyMCxyNixyb3IjMTkKKwl2c2hyLnUzMglkMjQsZDAsIzE3CisJZW9yCXIwLHIxMCxyMTAscm9yIzExCisJZW9yCXIyLHIyLHI4CisJdnNsaS4zMglkMjQsZDAsIzE1CisJYWRkCXI5LHI5LHIxMixyb3IjNgorCWVvcglyMTIscjEwLHIxMQorCXZzaHIudTMyCWQyNSxkMCwjMTAKKwllb3IJcjAscjAscjEwLHJvciMyMAorCWFkZAlyOSxyOSxyMgorCXZlb3IJZDI1LGQyNSxkMjQKKwlsZHIJcjIsW3NwLCMxMl0KKwlhbmQJcjMscjMscjEyCisJdnNoci51MzIJZDI0LGQwLCMxOQorCWFkZAlyNSxyNSxyOQorCWFkZAlyOSxyOSxyMCxyb3IjMgorCWVvcglyMyxyMyxyMTEKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhZGQJcjgscjgscjIKKwl2c2xpLjMyCWQyNCxkMCwjMTMKKwllb3IJcjIscjYscjcKKwllb3IJcjAscjUscjUscm9yIzUKKwl2ZW9yCWQyNSxkMjUsZDI0CisJYWRkCXI5LHI5LHIzCisJYW5kCXIyLHIyLHI1CisJdmFkZC5pMzIJZDEsZDEsZDI1CisJZW9yCXIzLHIwLHI1LHJvciMxOQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwl2YWRkLmkzMglxOCxxOCxxMAorCWVvcglyMixyMixyNworCWFkZAlyOCxyOCxyMyxyb3IjNgorCWVvcglyMyxyOSxyMTAKKwllb3IJcjAscjAscjkscm9yIzIwCisJYWRkCXI4LHI4LHIyCisJbGRyCXIyLFtzcCwjMTZdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjQscjQscjgKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCWFkZAlyOCxyOCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHIxMAorCXZleHQuOAlxOCxxMSxxMiwjNAorCWFkZAlyNyxyNyxyMgorCWVvcglyMixyNSxyNgorCWVvcglyMCxyNCxyNCxyb3IjNQorCXZleHQuOAlxOSxxMyxxMCwjNAorCWFkZAlyOCxyOCxyMTIKKwlhbmQJcjIscjIscjQKKwllb3IJcjEyLHIwLHI0LHJvciMxOQorCXZzaHIudTMyCXExMCxxOCwjNworCWVvcglyMCxyOCxyOCxyb3IjMTEKKwllb3IJcjIscjIscjYKKwl2YWRkLmkzMglxMSxxMSxxOQorCWFkZAlyNyxyNyxyMTIscm9yIzYKKwllb3IJcjEyLHI4LHI5CisJdnNoci51MzIJcTkscTgsIzMKKwllb3IJcjAscjAscjgscm9yIzIwCisJYWRkCXI3LHI3LHIyCisJdnNsaS4zMglxMTAscTgsIzI1CisJbGRyCXIyLFtzcCwjMjBdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCXExMSxxOCwjMTgKKwlhZGQJcjExLHIxMSxyNworCWFkZAlyNyxyNyxyMCxyb3IjMgorCWVvcglyMyxyMyxyOQorCXZlb3IJcTkscTkscTEwCisJYWRkCXI2LHI2LHIyCisJdnNsaS4zMglxMTEscTgsIzE0CisJZW9yCXIyLHI0LHI1CisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwl2c2hyLnUzMglkMjQsZDEsIzE3CisJYWRkCXI3LHI3LHIzCisJYW5kCXIyLHIyLHIxMQorCXZlb3IJcTkscTkscTExCisJZW9yCXIzLHIwLHIxMSxyb3IjMTkKKwllb3IJcjAscjcscjcscm9yIzExCisJdnNsaS4zMglkMjQsZDEsIzE1CisJZW9yCXIyLHIyLHI1CisJYWRkCXI2LHI2LHIzLHJvciM2CisJdnNoci51MzIJZDI1LGQxLCMxMAorCWVvcglyMyxyNyxyOAorCWVvcglyMCxyMCxyNyxyb3IjMjAKKwl2YWRkLmkzMglxMSxxMSxxOQorCWFkZAlyNixyNixyMgorCWxkcglyMixbc3AsIzI0XQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhbmQJcjEyLHIxMixyMworCWFkZAlyMTAscjEwLHI2CisJdnNoci51MzIJZDI0LGQxLCMxOQorCWFkZAlyNixyNixyMCxyb3IjMgorCWVvcglyMTIscjEyLHI4CisJdnNsaS4zMglkMjQsZDEsIzEzCisJYWRkCXI1LHI1LHIyCisJZW9yCXIyLHIxMSxyNAorCXZlb3IJZDI1LGQyNSxkMjQKKwllb3IJcjAscjEwLHIxMCxyb3IjNQorCWFkZAlyNixyNixyMTIKKwl2YWRkLmkzMglkMixkMixkMjUKKwlhbmQJcjIscjIscjEwCisJZW9yCXIxMixyMCxyMTAscm9yIzE5CisJdnNoci51MzIJZDI0LGQyLCMxNworCWVvcglyMCxyNixyNixyb3IjMTEKKwllb3IJcjIscjIscjQKKwl2c2xpLjMyCWQyNCxkMiwjMTUKKwlhZGQJcjUscjUscjEyLHJvciM2CisJZW9yCXIxMixyNixyNworCXZzaHIudTMyCWQyNSxkMiwjMTAKKwllb3IJcjAscjAscjYscm9yIzIwCisJYWRkCXI1LHI1LHIyCisJdmVvcglkMjUsZDI1LGQyNAorCWxkcglyMixbc3AsIzI4XQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglkMjQsZDIsIzE5CisJYWRkCXI5LHI5LHI1CisJYWRkCXI1LHI1LHIwLHJvciMyCisJZW9yCXIzLHIzLHI3CisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJYWRkCXI0LHI0LHIyCisJdnNsaS4zMglkMjQsZDIsIzEzCisJZW9yCXIyLHIxMCxyMTEKKwllb3IJcjAscjkscjkscm9yIzUKKwl2ZW9yCWQyNSxkMjUsZDI0CisJYWRkCXI1LHI1LHIzCisJYW5kCXIyLHIyLHI5CisJdmFkZC5pMzIJZDMsZDMsZDI1CisJZW9yCXIzLHIwLHI5LHJvciMxOQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwl2YWRkLmkzMglxOCxxOCxxMQorCWVvcglyMixyMixyMTEKKwlhZGQJcjQscjQscjMscm9yIzYKKwllb3IJcjMscjUscjYKKwllb3IJcjAscjAscjUscm9yIzIwCisJYWRkCXI0LHI0LHIyCisJbGRyCXIyLFtzcCwjMzJdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjgscjgscjQKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCWFkZAlyNCxyNCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHI2CisJdmV4dC44CXE4LHEyLHEzLCM0CisJYWRkCXIxMSxyMTEscjIKKwllb3IJcjIscjkscjEwCisJZW9yCXIwLHI4LHI4LHJvciM1CisJdmV4dC44CXE5LHEwLHExLCM0CisJYWRkCXI0LHI0LHIxMgorCWFuZAlyMixyMixyOAorCWVvcglyMTIscjAscjgscm9yIzE5CisJdnNoci51MzIJcTEwLHE4LCM3CisJZW9yCXIwLHI0LHI0LHJvciMxMQorCWVvcglyMixyMixyMTAKKwl2YWRkLmkzMglxMixxMixxOQorCWFkZAlyMTEscjExLHIxMixyb3IjNgorCWVvcglyMTIscjQscjUKKwl2c2hyLnUzMglxOSxxOCwjMworCWVvcglyMCxyMCxyNCxyb3IjMjAKKwlhZGQJcjExLHIxMSxyMgorCXZzbGkuMzIJcTEwLHE4LCMyNQorCWxkcglyMixbc3AsIzM2XQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglxMTEscTgsIzE4CisJYWRkCXI3LHI3LHIxMQorCWFkZAlyMTEscjExLHIwLHJvciMyCisJZW9yCXIzLHIzLHI1CisJdmVvcglxOSxxOSxxMTAKKwlhZGQJcjEwLHIxMCxyMgorCXZzbGkuMzIJcTExLHE4LCMxNAorCWVvcglyMixyOCxyOQorCWVvcglyMCxyNyxyNyxyb3IjNQorCXZzaHIudTMyCWQyNCxkMywjMTcKKwlhZGQJcjExLHIxMSxyMworCWFuZAlyMixyMixyNworCXZlb3IJcTkscTkscTExCisJZW9yCXIzLHIwLHI3LHJvciMxOQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCXZzbGkuMzIJZDI0LGQzLCMxNQorCWVvcglyMixyMixyOQorCWFkZAlyMTAscjEwLHIzLHJvciM2CisJdnNoci51MzIJZDI1LGQzLCMxMAorCWVvcglyMyxyMTEscjQKKwllb3IJcjAscjAscjExLHJvciMyMAorCXZhZGQuaTMyCXEyLHEyLHE5CisJYWRkCXIxMCxyMTAscjIKKwlsZHIJcjIsW3NwLCM0MF0KKwl2ZW9yCWQyNSxkMjUsZDI0CisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjYscjYscjEwCisJdnNoci51MzIJZDI0LGQzLCMxOQorCWFkZAlyMTAscjEwLHIwLHJvciMyCisJZW9yCXIxMixyMTIscjQKKwl2c2xpLjMyCWQyNCxkMywjMTMKKwlhZGQJcjkscjkscjIKKwllb3IJcjIscjcscjgKKwl2ZW9yCWQyNSxkMjUsZDI0CisJZW9yCXIwLHI2LHI2LHJvciM1CisJYWRkCXIxMCxyMTAscjEyCisJdmFkZC5pMzIJZDQsZDQsZDI1CisJYW5kCXIyLHIyLHI2CisJZW9yCXIxMixyMCxyNixyb3IjMTkKKwl2c2hyLnUzMglkMjQsZDQsIzE3CisJZW9yCXIwLHIxMCxyMTAscm9yIzExCisJZW9yCXIyLHIyLHI4CisJdnNsaS4zMglkMjQsZDQsIzE1CisJYWRkCXI5LHI5LHIxMixyb3IjNgorCWVvcglyMTIscjEwLHIxMQorCXZzaHIudTMyCWQyNSxkNCwjMTAKKwllb3IJcjAscjAscjEwLHJvciMyMAorCWFkZAlyOSxyOSxyMgorCXZlb3IJZDI1LGQyNSxkMjQKKwlsZHIJcjIsW3NwLCM0NF0KKwlhbmQJcjMscjMscjEyCisJdnNoci51MzIJZDI0LGQ0LCMxOQorCWFkZAlyNSxyNSxyOQorCWFkZAlyOSxyOSxyMCxyb3IjMgorCWVvcglyMyxyMyxyMTEKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhZGQJcjgscjgscjIKKwl2c2xpLjMyCWQyNCxkNCwjMTMKKwllb3IJcjIscjYscjcKKwllb3IJcjAscjUscjUscm9yIzUKKwl2ZW9yCWQyNSxkMjUsZDI0CisJYWRkCXI5LHI5LHIzCisJYW5kCXIyLHIyLHI1CisJdmFkZC5pMzIJZDUsZDUsZDI1CisJZW9yCXIzLHIwLHI1LHJvciMxOQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwl2YWRkLmkzMglxOCxxOCxxMgorCWVvcglyMixyMixyNworCWFkZAlyOCxyOCxyMyxyb3IjNgorCWVvcglyMyxyOSxyMTAKKwllb3IJcjAscjAscjkscm9yIzIwCisJYWRkCXI4LHI4LHIyCisJbGRyCXIyLFtzcCwjNDhdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjQscjQscjgKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCWFkZAlyOCxyOCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHIxMAorCXZleHQuOAlxOCxxMyxxMCwjNAorCWFkZAlyNyxyNyxyMgorCWVvcglyMixyNSxyNgorCWVvcglyMCxyNCxyNCxyb3IjNQorCXZleHQuOAlxOSxxMSxxMiwjNAorCWFkZAlyOCxyOCxyMTIKKwlhbmQJcjIscjIscjQKKwllb3IJcjEyLHIwLHI0LHJvciMxOQorCXZzaHIudTMyCXExMCxxOCwjNworCWVvcglyMCxyOCxyOCxyb3IjMTEKKwllb3IJcjIscjIscjYKKwl2YWRkLmkzMglxMyxxMyxxOQorCWFkZAlyNyxyNyxyMTIscm9yIzYKKwllb3IJcjEyLHI4LHI5CisJdnNoci51MzIJcTkscTgsIzMKKwllb3IJcjAscjAscjgscm9yIzIwCisJYWRkCXI3LHI3LHIyCisJdnNsaS4zMglxMTAscTgsIzI1CisJbGRyCXIyLFtzcCwjNTJdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCXExMSxxOCwjMTgKKwlhZGQJcjExLHIxMSxyNworCWFkZAlyNyxyNyxyMCxyb3IjMgorCWVvcglyMyxyMyxyOQorCXZlb3IJcTkscTkscTEwCisJYWRkCXI2LHI2LHIyCisJdnNsaS4zMglxMTEscTgsIzE0CisJZW9yCXIyLHI0LHI1CisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwl2c2hyLnUzMglkMjQsZDUsIzE3CisJYWRkCXI3LHI3LHIzCisJYW5kCXIyLHIyLHIxMQorCXZlb3IJcTkscTkscTExCisJZW9yCXIzLHIwLHIxMSxyb3IjMTkKKwllb3IJcjAscjcscjcscm9yIzExCisJdnNsaS4zMglkMjQsZDUsIzE1CisJZW9yCXIyLHIyLHI1CisJYWRkCXI2LHI2LHIzLHJvciM2CisJdnNoci51MzIJZDI1LGQ1LCMxMAorCWVvcglyMyxyNyxyOAorCWVvcglyMCxyMCxyNyxyb3IjMjAKKwl2YWRkLmkzMglxMyxxMyxxOQorCWFkZAlyNixyNixyMgorCWxkcglyMixbc3AsIzU2XQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhbmQJcjEyLHIxMixyMworCWFkZAlyMTAscjEwLHI2CisJdnNoci51MzIJZDI0LGQ1LCMxOQorCWFkZAlyNixyNixyMCxyb3IjMgorCWVvcglyMTIscjEyLHI4CisJdnNsaS4zMglkMjQsZDUsIzEzCisJYWRkCXI1LHI1LHIyCisJZW9yCXIyLHIxMSxyNAorCXZlb3IJZDI1LGQyNSxkMjQKKwllb3IJcjAscjEwLHIxMCxyb3IjNQorCWFkZAlyNixyNixyMTIKKwl2YWRkLmkzMglkNixkNixkMjUKKwlhbmQJcjIscjIscjEwCisJZW9yCXIxMixyMCxyMTAscm9yIzE5CisJdnNoci51MzIJZDI0LGQ2LCMxNworCWVvcglyMCxyNixyNixyb3IjMTEKKwllb3IJcjIscjIscjQKKwl2c2xpLjMyCWQyNCxkNiwjMTUKKwlhZGQJcjUscjUscjEyLHJvciM2CisJZW9yCXIxMixyNixyNworCXZzaHIudTMyCWQyNSxkNiwjMTAKKwllb3IJcjAscjAscjYscm9yIzIwCisJYWRkCXI1LHI1LHIyCisJdmVvcglkMjUsZDI1LGQyNAorCWxkcglyMixbc3AsIzYwXQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglkMjQsZDYsIzE5CisJYWRkCXI5LHI5LHI1CisJYWRkCXI1LHI1LHIwLHJvciMyCisJZW9yCXIzLHIzLHI3CisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJYWRkCXI0LHI0LHIyCisJdnNsaS4zMglkMjQsZDYsIzEzCisJZW9yCXIyLHIxMCxyMTEKKwllb3IJcjAscjkscjkscm9yIzUKKwl2ZW9yCWQyNSxkMjUsZDI0CisJYWRkCXI1LHI1LHIzCisJYW5kCXIyLHIyLHI5CisJdmFkZC5pMzIJZDcsZDcsZDI1CisJZW9yCXIzLHIwLHI5LHJvciMxOQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwl2YWRkLmkzMglxOCxxOCxxMworCWVvcglyMixyMixyMTEKKwlhZGQJcjQscjQscjMscm9yIzYKKwllb3IJcjMscjUscjYKKwllb3IJcjAscjAscjUscm9yIzIwCisJYWRkCXI0LHI0LHIyCisJbGRyCXIyLFtyMTRdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjgscjgscjQKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCWFkZAlyNCxyNCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHI2CisJdGVxCXIyLCMwCQkJCUAgY2hlY2sgZm9yIEsyNTYgdGVybWluYXRvcgorCWxkcglyMixbc3AsIzBdCisJc3ViCXIxLHIxLCM2NAorCWJuZQlMXzAwXzQ4CisKKwlsZHIJcjEsW3NwLCM2OF0KKwlsZHIJcjAsW3NwLCM3Ml0KKwlzdWIJcjE0LHIxNCwjMjU2CUAgcmV3aW5kIHIxNAorCXRlcQlyMSxyMAorCWl0CWVxCisJc3ViZXEJcjEscjEsIzY0CQlAIGF2b2lkIFNFR1YKKwl2bGQxLjgJe3EwfSxbcjFdIQkJQCBsb2FkIG5leHQgaW5wdXQgYmxvY2sKKwl2bGQxLjgJe3ExfSxbcjFdIQorCXZsZDEuOAl7cTJ9LFtyMV0hCisJdmxkMS44CXtxM30sW3IxXSEKKwlpdAluZQorCXN0cm5lCXIxLFtzcCwjNjhdCisJbW92CXIxLHNwCisJYWRkCXIxMSxyMTEscjIKKwllb3IJcjIscjkscjEwCisJZW9yCXIwLHI4LHI4LHJvciM1CisJYWRkCXI0LHI0LHIxMgorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFuZAlyMixyMixyOAorCWVvcglyMTIscjAscjgscm9yIzE5CisJZW9yCXIwLHI0LHI0LHJvciMxMQorCWVvcglyMixyMixyMTAKKwl2cmV2MzIuOAlxMCxxMAorCWFkZAlyMTEscjExLHIxMixyb3IjNgorCWVvcglyMTIscjQscjUKKwllb3IJcjAscjAscjQscm9yIzIwCisJYWRkCXIxMSxyMTEscjIKKwl2YWRkLmkzMglxOCxxOCxxMAorCWxkcglyMixbc3AsIzRdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyNyxyNyxyMTEKKwlhZGQJcjExLHIxMSxyMCxyb3IjMgorCWVvcglyMyxyMyxyNQorCWFkZAlyMTAscjEwLHIyCisJZW9yCXIyLHI4LHI5CisJZW9yCXIwLHI3LHI3LHJvciM1CisJYWRkCXIxMSxyMTEscjMKKwlhbmQJcjIscjIscjcKKwllb3IJcjMscjAscjcscm9yIzE5CisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJZW9yCXIyLHIyLHI5CisJYWRkCXIxMCxyMTAscjMscm9yIzYKKwllb3IJcjMscjExLHI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMjAKKwlhZGQJcjEwLHIxMCxyMgorCWxkcglyMixbc3AsIzhdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjYscjYscjEwCisJYWRkCXIxMCxyMTAscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNAorCWFkZAlyOSxyOSxyMgorCWVvcglyMixyNyxyOAorCWVvcglyMCxyNixyNixyb3IjNQorCWFkZAlyMTAscjEwLHIxMgorCWFuZAlyMixyMixyNgorCWVvcglyMTIscjAscjYscm9yIzE5CisJZW9yCXIwLHIxMCxyMTAscm9yIzExCisJZW9yCXIyLHIyLHI4CisJYWRkCXI5LHI5LHIxMixyb3IjNgorCWVvcglyMTIscjEwLHIxMQorCWVvcglyMCxyMCxyMTAscm9yIzIwCisJYWRkCXI5LHI5LHIyCisJbGRyCXIyLFtzcCwjMTJdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyNSxyNSxyOQorCWFkZAlyOSxyOSxyMCxyb3IjMgorCWVvcglyMyxyMyxyMTEKKwlhZGQJcjgscjgscjIKKwllb3IJcjIscjYscjcKKwllb3IJcjAscjUscjUscm9yIzUKKwlhZGQJcjkscjkscjMKKwlhbmQJcjIscjIscjUKKwllb3IJcjMscjAscjUscm9yIzE5CisJZW9yCXIwLHI5LHI5LHJvciMxMQorCWVvcglyMixyMixyNworCWFkZAlyOCxyOCxyMyxyb3IjNgorCWVvcglyMyxyOSxyMTAKKwllb3IJcjAscjAscjkscm9yIzIwCisJYWRkCXI4LHI4LHIyCisJbGRyCXIyLFtzcCwjMTZdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjQscjQscjgKKwlhZGQJcjgscjgscjAscm9yIzIKKwllb3IJcjEyLHIxMixyMTAKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCWFkZAlyNyxyNyxyMgorCWVvcglyMixyNSxyNgorCWVvcglyMCxyNCxyNCxyb3IjNQorCWFkZAlyOCxyOCxyMTIKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhbmQJcjIscjIscjQKKwllb3IJcjEyLHIwLHI0LHJvciMxOQorCWVvcglyMCxyOCxyOCxyb3IjMTEKKwllb3IJcjIscjIscjYKKwl2cmV2MzIuOAlxMSxxMQorCWFkZAlyNyxyNyxyMTIscm9yIzYKKwllb3IJcjEyLHI4LHI5CisJZW9yCXIwLHIwLHI4LHJvciMyMAorCWFkZAlyNyxyNyxyMgorCXZhZGQuaTMyCXE4LHE4LHExCisJbGRyCXIyLFtzcCwjMjBdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyMTEscjExLHI3CisJYWRkCXI3LHI3LHIwLHJvciMyCisJZW9yCXIzLHIzLHI5CisJYWRkCXI2LHI2LHIyCisJZW9yCXIyLHI0LHI1CisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwlhZGQJcjcscjcscjMKKwlhbmQJcjIscjIscjExCisJZW9yCXIzLHIwLHIxMSxyb3IjMTkKKwllb3IJcjAscjcscjcscm9yIzExCisJZW9yCXIyLHIyLHI1CisJYWRkCXI2LHI2LHIzLHJvciM2CisJZW9yCXIzLHI3LHI4CisJZW9yCXIwLHIwLHI3LHJvciMyMAorCWFkZAlyNixyNixyMgorCWxkcglyMixbc3AsIzI0XQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXIxMCxyMTAscjYKKwlhZGQJcjYscjYscjAscm9yIzIKKwllb3IJcjEyLHIxMixyOAorCWFkZAlyNSxyNSxyMgorCWVvcglyMixyMTEscjQKKwllb3IJcjAscjEwLHIxMCxyb3IjNQorCWFkZAlyNixyNixyMTIKKwlhbmQJcjIscjIscjEwCisJZW9yCXIxMixyMCxyMTAscm9yIzE5CisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWVvcglyMixyMixyNAorCWFkZAlyNSxyNSxyMTIscm9yIzYKKwllb3IJcjEyLHI2LHI3CisJZW9yCXIwLHIwLHI2LHJvciMyMAorCWFkZAlyNSxyNSxyMgorCWxkcglyMixbc3AsIzI4XQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjkscjkscjUKKwlhZGQJcjUscjUscjAscm9yIzIKKwllb3IJcjMscjMscjcKKwlhZGQJcjQscjQscjIKKwllb3IJcjIscjEwLHIxMQorCWVvcglyMCxyOSxyOSxyb3IjNQorCWFkZAlyNSxyNSxyMworCWFuZAlyMixyMixyOQorCWVvcglyMyxyMCxyOSxyb3IjMTkKKwllb3IJcjAscjUscjUscm9yIzExCisJZW9yCXIyLHIyLHIxMQorCWFkZAlyNCxyNCxyMyxyb3IjNgorCWVvcglyMyxyNSxyNgorCWVvcglyMCxyMCxyNSxyb3IjMjAKKwlhZGQJcjQscjQscjIKKwlsZHIJcjIsW3NwLCMzMl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyOCxyOCxyNAorCWFkZAlyNCxyNCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHI2CisJdnN0MS4zMgl7cTh9LFtyMSw6MTI4XSEKKwlhZGQJcjExLHIxMSxyMgorCWVvcglyMixyOSxyMTAKKwllb3IJcjAscjgscjgscm9yIzUKKwlhZGQJcjQscjQscjEyCisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJYW5kCXIyLHIyLHI4CisJZW9yCXIxMixyMCxyOCxyb3IjMTkKKwllb3IJcjAscjQscjQscm9yIzExCisJZW9yCXIyLHIyLHIxMAorCXZyZXYzMi44CXEyLHEyCisJYWRkCXIxMSxyMTEscjEyLHJvciM2CisJZW9yCXIxMixyNCxyNQorCWVvcglyMCxyMCxyNCxyb3IjMjAKKwlhZGQJcjExLHIxMSxyMgorCXZhZGQuaTMyCXE4LHE4LHEyCisJbGRyCXIyLFtzcCwjMzZdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyNyxyNyxyMTEKKwlhZGQJcjExLHIxMSxyMCxyb3IjMgorCWVvcglyMyxyMyxyNQorCWFkZAlyMTAscjEwLHIyCisJZW9yCXIyLHI4LHI5CisJZW9yCXIwLHI3LHI3LHJvciM1CisJYWRkCXIxMSxyMTEscjMKKwlhbmQJcjIscjIscjcKKwllb3IJcjMscjAscjcscm9yIzE5CisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJZW9yCXIyLHIyLHI5CisJYWRkCXIxMCxyMTAscjMscm9yIzYKKwllb3IJcjMscjExLHI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMjAKKwlhZGQJcjEwLHIxMCxyMgorCWxkcglyMixbc3AsIzQwXQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXI2LHI2LHIxMAorCWFkZAlyMTAscjEwLHIwLHJvciMyCisJZW9yCXIxMixyMTIscjQKKwlhZGQJcjkscjkscjIKKwllb3IJcjIscjcscjgKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIKKwlhbmQJcjIscjIscjYKKwllb3IJcjEyLHIwLHI2LHJvciMxOQorCWVvcglyMCxyMTAscjEwLHJvciMxMQorCWVvcglyMixyMixyOAorCWFkZAlyOSxyOSxyMTIscm9yIzYKKwllb3IJcjEyLHIxMCxyMTEKKwllb3IJcjAscjAscjEwLHJvciMyMAorCWFkZAlyOSxyOSxyMgorCWxkcglyMixbc3AsIzQ0XQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjUscjUscjkKKwlhZGQJcjkscjkscjAscm9yIzIKKwllb3IJcjMscjMscjExCisJYWRkCXI4LHI4LHIyCisJZW9yCXIyLHI2LHI3CisJZW9yCXIwLHI1LHI1LHJvciM1CisJYWRkCXI5LHI5LHIzCisJYW5kCXIyLHIyLHI1CisJZW9yCXIzLHIwLHI1LHJvciMxOQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwllb3IJcjIscjIscjcKKwlhZGQJcjgscjgscjMscm9yIzYKKwllb3IJcjMscjkscjEwCisJZW9yCXIwLHIwLHI5LHJvciMyMAorCWFkZAlyOCxyOCxyMgorCWxkcglyMixbc3AsIzQ4XQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXI0LHI0LHI4CisJYWRkCXI4LHI4LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjEwCisJdnN0MS4zMgl7cTh9LFtyMSw6MTI4XSEKKwlhZGQJcjcscjcscjIKKwllb3IJcjIscjUscjYKKwllb3IJcjAscjQscjQscm9yIzUKKwlhZGQJcjgscjgscjEyCisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJYW5kCXIyLHIyLHI0CisJZW9yCXIxMixyMCxyNCxyb3IjMTkKKwllb3IJcjAscjgscjgscm9yIzExCisJZW9yCXIyLHIyLHI2CisJdnJldjMyLjgJcTMscTMKKwlhZGQJcjcscjcscjEyLHJvciM2CisJZW9yCXIxMixyOCxyOQorCWVvcglyMCxyMCxyOCxyb3IjMjAKKwlhZGQJcjcscjcscjIKKwl2YWRkLmkzMglxOCxxOCxxMworCWxkcglyMixbc3AsIzUyXQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjExLHIxMSxyNworCWFkZAlyNyxyNyxyMCxyb3IjMgorCWVvcglyMyxyMyxyOQorCWFkZAlyNixyNixyMgorCWVvcglyMixyNCxyNQorCWVvcglyMCxyMTEscjExLHJvciM1CisJYWRkCXI3LHI3LHIzCisJYW5kCXIyLHIyLHIxMQorCWVvcglyMyxyMCxyMTEscm9yIzE5CisJZW9yCXIwLHI3LHI3LHJvciMxMQorCWVvcglyMixyMixyNQorCWFkZAlyNixyNixyMyxyb3IjNgorCWVvcglyMyxyNyxyOAorCWVvcglyMCxyMCxyNyxyb3IjMjAKKwlhZGQJcjYscjYscjIKKwlsZHIJcjIsW3NwLCM1Nl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyMTAscjEwLHI2CisJYWRkCXI2LHI2LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjgKKwlhZGQJcjUscjUscjIKKwllb3IJcjIscjExLHI0CisJZW9yCXIwLHIxMCxyMTAscm9yIzUKKwlhZGQJcjYscjYscjEyCisJYW5kCXIyLHIyLHIxMAorCWVvcglyMTIscjAscjEwLHJvciMxOQorCWVvcglyMCxyNixyNixyb3IjMTEKKwllb3IJcjIscjIscjQKKwlhZGQJcjUscjUscjEyLHJvciM2CisJZW9yCXIxMixyNixyNworCWVvcglyMCxyMCxyNixyb3IjMjAKKwlhZGQJcjUscjUscjIKKwlsZHIJcjIsW3NwLCM2MF0KKwlhbmQJcjMscjMscjEyCisJYWRkCXI5LHI5LHI1CisJYWRkCXI1LHI1LHIwLHJvciMyCisJZW9yCXIzLHIzLHI3CisJYWRkCXI0LHI0LHIyCisJZW9yCXIyLHIxMCxyMTEKKwllb3IJcjAscjkscjkscm9yIzUKKwlhZGQJcjUscjUscjMKKwlhbmQJcjIscjIscjkKKwllb3IJcjMscjAscjkscm9yIzE5CisJZW9yCXIwLHI1LHI1LHJvciMxMQorCWVvcglyMixyMixyMTEKKwlhZGQJcjQscjQscjMscm9yIzYKKwllb3IJcjMscjUscjYKKwllb3IJcjAscjAscjUscm9yIzIwCisJYWRkCXI0LHI0LHIyCisJbGRyCXIyLFtzcCwjNjRdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjgscjgscjQKKwlhZGQJcjQscjQscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNgorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJbGRyCXIwLFtyMiwjMF0KKwlhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHIJcjEyLFtyMiwjNF0KKwlsZHIJcjMsW3IyLCM4XQorCWxkcglyMSxbcjIsIzEyXQorCWFkZAlyNCxyNCxyMAkJCUAgYWNjdW11bGF0ZQorCWxkcglyMCxbcjIsIzE2XQorCWFkZAlyNSxyNSxyMTIKKwlsZHIJcjEyLFtyMiwjMjBdCisJYWRkCXI2LHI2LHIzCisJbGRyCXIzLFtyMiwjMjRdCisJYWRkCXI3LHI3LHIxCisJbGRyCXIxLFtyMiwjMjhdCisJYWRkCXI4LHI4LHIwCisJc3RyCXI0LFtyMl0sIzQKKwlhZGQJcjkscjkscjEyCisJc3RyCXI1LFtyMl0sIzQKKwlhZGQJcjEwLHIxMCxyMworCXN0cglyNixbcjJdLCM0CisJYWRkCXIxMSxyMTEscjEKKwlzdHIJcjcsW3IyXSwjNAorCXN0bWlhCXIyLHtyOCxyOSxyMTAscjExfQorCisJaXR0dGUJbmUKKwltb3ZuZQlyMSxzcAorCWxkcm5lCXIyLFtzcCwjMF0KKwllb3JuZQlyMTIscjEyLHIxMgorCWxkcmVxCXNwLFtzcCwjNzZdCQkJQCByZXN0b3JlIG9yaWdpbmFsIHNwCisJaXR0CW5lCisJZW9ybmUJcjMscjUscjYKKwlibmUJTF8wMF80OAorCisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixwY30KKworI2VuZGlmCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorCisjIGlmIGRlZmluZWQoX190aHVtYjJfXykKKyMgIGRlZmluZSBJTlNUKGEsYixjLGQpCS5ieXRlCWMsZHwweGMsYSxiCisjIGVsc2UKKyMgIGRlZmluZSBJTlNUKGEsYixjLGQpCS5ieXRlCWEsYixjLGQKKyMgZW5kaWYKKworI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2FybXY4CisjZW5kaWYKKy5hbGlnbgk1CitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9hcm12ODoKK0xBUk12ODoKKwl2bGQxLjMyCXtxMCxxMX0sW3IwXQorCXN1YglyMyxyMywjMjU2KzMyCisJYWRkCXIyLHIxLHIyLGxzbCM2CUAgbGVuIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YgaW5wCisJYglMb29wX3Y4CisKKy5hbGlnbgk0CitMb29wX3Y4OgorCXZsZDEuOAl7cTgscTl9LFtyMV0hCisJdmxkMS44CXtxMTAscTExfSxbcjFdIQorCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2cmV2MzIuOAlxOCxxOAorCXZyZXYzMi44CXE5LHE5CisJdnJldjMyLjgJcTEwLHExMAorCXZyZXYzMi44CXExMSxxMTEKKwl2bW92CXExNCxxMAlAIG9mZmxvYWQKKwl2bW92CXExNSxxMQorCXRlcQlyMSxyMgorCXZsZDEuMzIJe3ExM30sW3IzXSEKKwl2YWRkLmkzMglxMTIscTEyLHE4CisJSU5TVCgweGUyLDB4MDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOCxxOQorCXZtb3YJcTIscTAKKwlJTlNUKDB4NjgsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTIKKwlJTlNUKDB4NjgsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEyCisJSU5TVCgweGU2LDB4MGMsMHg2NCwweGYzKQlAIHNoYTI1NnN1MSBxOCxxMTAscTExCisJdmxkMS4zMgl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTkKKwlJTlNUKDB4ZTQsMHgyMywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHE5LHExMAorCXZtb3YJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisJSU5TVCgweGUwLDB4MmMsMHg2NiwweGYzKQlAIHNoYTI1NnN1MSBxOSxxMTEscTgKKwl2bGQxLjMyCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxMTAKKwlJTlNUKDB4ZTYsMHg0MywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHExMCxxMTEKKwl2bW92CXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlMiwweDRjLDB4NjAsMHhmMykJQCBzaGEyNTZzdTEgcTEwLHE4LHE5CisJdmxkMS4zMgl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTExCisJSU5TVCgweGUwLDB4NjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTEscTgKKwl2bW92CXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlNCwweDZjLDB4NjIsMHhmMykJQCBzaGEyNTZzdTEgcTExLHE5LHExMAorCXZsZDEuMzIJe3ExM30sW3IzXSEKKwl2YWRkLmkzMglxMTIscTEyLHE4CisJSU5TVCgweGUyLDB4MDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOCxxOQorCXZtb3YJcTIscTAKKwlJTlNUKDB4NjgsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTIKKwlJTlNUKDB4NjgsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEyCisJSU5TVCgweGU2LDB4MGMsMHg2NCwweGYzKQlAIHNoYTI1NnN1MSBxOCxxMTAscTExCisJdmxkMS4zMgl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTkKKwlJTlNUKDB4ZTQsMHgyMywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHE5LHExMAorCXZtb3YJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisJSU5TVCgweGUwLDB4MmMsMHg2NiwweGYzKQlAIHNoYTI1NnN1MSBxOSxxMTEscTgKKwl2bGQxLjMyCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxMTAKKwlJTlNUKDB4ZTYsMHg0MywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHExMCxxMTEKKwl2bW92CXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlMiwweDRjLDB4NjAsMHhmMykJQCBzaGEyNTZzdTEgcTEwLHE4LHE5CisJdmxkMS4zMgl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTExCisJSU5TVCgweGUwLDB4NjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTEscTgKKwl2bW92CXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlNCwweDZjLDB4NjIsMHhmMykJQCBzaGEyNTZzdTEgcTExLHE5LHExMAorCXZsZDEuMzIJe3ExM30sW3IzXSEKKwl2YWRkLmkzMglxMTIscTEyLHE4CisJSU5TVCgweGUyLDB4MDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOCxxOQorCXZtb3YJcTIscTAKKwlJTlNUKDB4NjgsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTIKKwlJTlNUKDB4NjgsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEyCisJSU5TVCgweGU2LDB4MGMsMHg2NCwweGYzKQlAIHNoYTI1NnN1MSBxOCxxMTAscTExCisJdmxkMS4zMgl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTkKKwlJTlNUKDB4ZTQsMHgyMywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHE5LHExMAorCXZtb3YJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisJSU5TVCgweGUwLDB4MmMsMHg2NiwweGYzKQlAIHNoYTI1NnN1MSBxOSxxMTEscTgKKwl2bGQxLjMyCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxMTAKKwlJTlNUKDB4ZTYsMHg0MywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHExMCxxMTEKKwl2bW92CXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlMiwweDRjLDB4NjAsMHhmMykJQCBzaGEyNTZzdTEgcTEwLHE4LHE5CisJdmxkMS4zMgl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTExCisJSU5TVCgweGUwLDB4NjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTEscTgKKwl2bW92CXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlNCwweDZjLDB4NjIsMHhmMykJQCBzaGEyNTZzdTEgcTExLHE5LHExMAorCXZsZDEuMzIJe3ExM30sW3IzXSEKKwl2YWRkLmkzMglxMTIscTEyLHE4CisJdm1vdglxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKworCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHE5CisJdm1vdglxMixxMAorCUlOU1QoMHg2YSwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMworCUlOU1QoMHg2YSwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTMKKworCXZsZDEuMzIJe3ExM30sW3IzXQorCXZhZGQuaTMyCXExMixxMTIscTEwCisJc3ViCXIzLHIzLCMyNTYtMTYJQCByZXdpbmQKKwl2bW92CXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCisJdmFkZC5pMzIJcTEzLHExMyxxMTEKKwl2bW92CXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCisJdmFkZC5pMzIJcTAscTAscTE0CisJdmFkZC5pMzIJcTEscTEscTE1CisJaXQJbmUKKwlibmUJTG9vcF92OAorCisJdnN0MS4zMgl7cTAscTF9LFtyMF0KKworCWJ4CWxyCQlAIGJ4IGxyCisKKyNlbmRpZgorLmJ5dGUJODMsNzIsNjUsNTAsNTMsNTQsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiw2NSw4Miw3NywxMTgsNTIsNDcsNzgsNjksNzksNzgsNDcsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKy5jb21tCV9PUEVOU1NMX2FybWNhcF9QLDQKKy5ub25fbGF6eV9zeW1ib2xfcG9pbnRlcgorT1BFTlNTTF9hcm1jYXBfUDoKKy5pbmRpcmVjdF9zeW1ib2wJX09QRU5TU0xfYXJtY2FwX1AKKy5sb25nCTAKKy5wcml2YXRlX2V4dGVybglfT1BFTlNTTF9hcm1jYXBfUAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLWFybXY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2lvcy1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLWFybXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhYTk4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvaW9zLWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItYXJtdjQuUwpAQCAtMCwwICsxLDE4ODQgQEAKK0AgQ29weXJpZ2h0IDIwMDctMjAxNiBUaGUgT3BlblNTTCBQcm9qZWN0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCitAIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbiBvYnRhaW4gYSBjb3B5CitAIGluIHRoZSBmaWxlIExJQ0VOU0UgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3IgYXQKK0AgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisKK0AgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0AgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCitAIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKK0AgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKK0AgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCitACitAIFBlcm1pc3Npb24gdG8gdXNlIHVuZGVyIEdQTCB0ZXJtcyBpcyBncmFudGVkLgorQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAIFNIQTUxMiBibG9jayBwcm9jZWR1cmUgZm9yIEFSTXY0LiBTZXB0ZW1iZXIgMjAwNy4KKworQCBUaGlzIGNvZGUgaXMgfjQuNSAoZm91ciBhbmQgYSBoYWxmKSB0aW1lcyBmYXN0ZXIgdGhhbiBjb2RlIGdlbmVyYXRlZAorQCBieSBnY2MgMy40IGFuZCBpdCBzcGVuZHMgfjcyIGNsb2NrIGN5Y2xlcyBwZXIgYnl0ZSBbb24gc2luZ2xlLWlzc3VlCitAIFhzY2FsZSBQWEEyNTAgY29yZV0uCitACitAIEp1bHkgMjAxMC4KK0AKK0AgUmVzY2hlZHVsaW5nIGZvciBkdWFsLWlzc3VlIHBpcGVsaW5lIHJlc3VsdGVkIGluIDYlIGltcHJvdmVtZW50IG9uCitAIENvcnRleCBBOCBjb3JlIGFuZCB+NDAgY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZS4KKworQCBGZWJydWFyeSAyMDExLgorQAorQCBQcm9maWxlci1hc3Npc3RlZCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgb3B0aW1pemF0aW9uIHJlc3VsdGVkIGluIDclCitAIGltcHJvdmVtZW50IG9uIENveHRleCBBOCBjb3JlIGFuZCB+MzggY3ljbGVzIHBlciBieXRlLgorCitAIE1hcmNoIDIwMTEuCitACitAIEFkZCBORU9OIGltcGxlbWVudGF0aW9uLiBPbiBDb3J0ZXggQTggaXQgd2FzIG1lYXN1cmVkIHRvIHByb2Nlc3MKK0Agb25lIGJ5dGUgaW4gMjMuMyBjeWNsZXMgb3IgfjYwJSBmYXN0ZXIgdGhhbiBpbnRlZ2VyLW9ubHkgY29kZS4KKworQCBBdWd1c3QgMjAxMi4KK0AKK0AgSW1wcm92ZSBORU9OIHBlcmZvcm1hbmNlIGJ5IDEyJSBvbiBTbmFwZHJhZ29uIFM0LiBJbiBhYnNvbHV0ZQorQCB0ZXJtcyBpdCdzIDIyLjYgY3ljbGVzIHBlciBieXRlLCB3aGljaCBpcyBkaXNhcHBvaW50aW5nIHJlc3VsdC4KK0AgVGVjaG5pY2FsIHdyaXRlcnMgYXNzZXJ0ZWQgdGhhdCAzLXdheSBTNCBwaXBlbGluZSBjYW4gc3VzdGFpbgorQCBtdWx0aXBsZSBORU9OIGluc3RydWN0aW9ucyBwZXIgY3ljbGUsIGJ1dCBkdWFsIE5FT04gaXNzdWUgY291bGQKK0Agbm90IGJlIG9ic2VydmVkLCBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vU25hcGRyYWdvbi1TNC5odG1sCitAIGZvciBmdXJ0aGVyIGRldGFpbHMuIE9uIHNpZGUgbm90ZSBDb3J0ZXgtQTE1IHByb2Nlc3NlcyBvbmUgYnl0ZSBpbgorQCAxNiBjeWNsZXMuCisKK0AgQnl0ZSBvcmRlciBbaW5dZGVwZW5kZW5jZS4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0AKK0AgT3JpZ2luYWxseSBjYWxsZXIgd2FzIGV4cGVjdGVkIHRvIG1haW50YWluIHNwZWNpZmljICpkd29yZCogb3JkZXIgaW4KK0AgaFswLTddLCBuYW1lbHkgd2l0aCBtb3N0IHNpZ25pZmljYW50IGR3b3JkIGF0ICpsb3dlciogYWRkcmVzcywgd2hpY2gKK0Agd2FzIHJlZmxlY3RlZCBpbiBiZWxvdyB0d28gcGFyYW1ldGVycyBhcyAwIGFuZCA0LiBOb3cgY2FsbGVyIGlzCitAIGV4cGVjdGVkIHRvIG1haW50YWluIG5hdGl2ZSBieXRlIG9yZGVyIGZvciB3aG9sZSA2NC1iaXQgdmFsdWVzLgorI2lmbmRlZiBfX0tFUk5FTF9fCisjIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyMgZGVmaW5lIFZGUF9BQklfUFVTSAl2c3RtZGIJc3AhLHtkOC1kMTV9CisjIGRlZmluZSBWRlBfQUJJX1BPUAl2bGRtaWEJc3AhLHtkOC1kMTV9CisjZWxzZQorIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXworIyBkZWZpbmUgX19BUk1fTUFYX0FSQ0hfXyA3CisjIGRlZmluZSBWRlBfQUJJX1BVU0gKKyMgZGVmaW5lIFZGUF9BQklfUE9QCisjZW5kaWYKKworQCBTaWxlbmNlIEFSTXY4IGRlcHJlY2F0ZWQgSVQgaW5zdHJ1Y3Rpb24gd2FybmluZ3MuIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IGJvdGgKK0AgQVJNdjcgYW5kIEFSTXY4IHByb2Nlc3NvcnMgYW5kIGRvZXMgbm90IHVzZSBBUk12OCBpbnN0cnVjdGlvbnMuCisKKworI2lmZGVmIF9fQVJNRUxfXworIyBkZWZpbmUgTE8gMAorIyBkZWZpbmUgSEkgNAorIyBkZWZpbmUgV09SRDY0KGhpMCxsbzAsaGkxLGxvMSkJLndvcmQJbG8wLGhpMCwgbG8xLGhpMQorI2Vsc2UKKyMgZGVmaW5lIEhJIDAKKyMgZGVmaW5lIExPIDQKKyMgZGVmaW5lIFdPUkQ2NChoaTAsbG8wLGhpMSxsbzEpCS53b3JkCWhpMCxsbzAsIGhpMSxsbzEKKyNlbmRpZgorCisudGV4dAorI2lmIGRlZmluZWQoX190aHVtYjJfXykKKy5zeW50YXgJdW5pZmllZAorLnRodW1iCisjIGRlZmluZSBhZHJsIGFkcgorI2Vsc2UKKy5jb2RlCTMyCisjZW5kaWYKKworCisuYWxpZ24JNQorSzUxMjoKKwlXT1JENjQoMHg0MjhhMmY5OCwweGQ3MjhhZTIyLAkweDcxMzc0NDkxLDB4MjNlZjY1Y2QpCisJV09SRDY0KDB4YjVjMGZiY2YsMHhlYzRkM2IyZiwJMHhlOWI1ZGJhNSwweDgxODlkYmJjKQorCVdPUkQ2NCgweDM5NTZjMjViLDB4ZjM0OGI1MzgsCTB4NTlmMTExZjEsMHhiNjA1ZDAxOSkKKwlXT1JENjQoMHg5MjNmODJhNCwweGFmMTk0ZjliLAkweGFiMWM1ZWQ1LDB4ZGE2ZDgxMTgpCisJV09SRDY0KDB4ZDgwN2FhOTgsMHhhMzAzMDI0MiwJMHgxMjgzNWIwMSwweDQ1NzA2ZmJlKQorCVdPUkQ2NCgweDI0MzE4NWJlLDB4NGVlNGIyOGMsCTB4NTUwYzdkYzMsMHhkNWZmYjRlMikKKwlXT1JENjQoMHg3MmJlNWQ3NCwweGYyN2I4OTZmLAkweDgwZGViMWZlLDB4M2IxNjk2YjEpCisJV09SRDY0KDB4OWJkYzA2YTcsMHgyNWM3MTIzNSwJMHhjMTliZjE3NCwweGNmNjkyNjk0KQorCVdPUkQ2NCgweGU0OWI2OWMxLDB4OWVmMTRhZDIsCTB4ZWZiZTQ3ODYsMHgzODRmMjVlMykKKwlXT1JENjQoMHgwZmMxOWRjNiwweDhiOGNkNWI1LAkweDI0MGNhMWNjLDB4NzdhYzljNjUpCisJV09SRDY0KDB4MmRlOTJjNmYsMHg1OTJiMDI3NSwJMHg0YTc0ODRhYSwweDZlYTZlNDgzKQorCVdPUkQ2NCgweDVjYjBhOWRjLDB4YmQ0MWZiZDQsCTB4NzZmOTg4ZGEsMHg4MzExNTNiNSkKKwlXT1JENjQoMHg5ODNlNTE1MiwweGVlNjZkZmFiLAkweGE4MzFjNjZkLDB4MmRiNDMyMTApCisJV09SRDY0KDB4YjAwMzI3YzgsMHg5OGZiMjEzZiwJMHhiZjU5N2ZjNywweGJlZWYwZWU0KQorCVdPUkQ2NCgweGM2ZTAwYmYzLDB4M2RhODhmYzIsCTB4ZDVhNzkxNDcsMHg5MzBhYTcyNSkKKwlXT1JENjQoMHgwNmNhNjM1MSwweGUwMDM4MjZmLAkweDE0MjkyOTY3LDB4MGEwZTZlNzApCisJV09SRDY0KDB4MjdiNzBhODUsMHg0NmQyMmZmYywJMHgyZTFiMjEzOCwweDVjMjZjOTI2KQorCVdPUkQ2NCgweDRkMmM2ZGZjLDB4NWFjNDJhZWQsCTB4NTMzODBkMTMsMHg5ZDk1YjNkZikKKwlXT1JENjQoMHg2NTBhNzM1NCwweDhiYWY2M2RlLAkweDc2NmEwYWJiLDB4M2M3N2IyYTgpCisJV09SRDY0KDB4ODFjMmM5MmUsMHg0N2VkYWVlNiwJMHg5MjcyMmM4NSwweDE0ODIzNTNiKQorCVdPUkQ2NCgweGEyYmZlOGExLDB4NGNmMTAzNjQsCTB4YTgxYTY2NGIsMHhiYzQyMzAwMSkKKwlXT1JENjQoMHhjMjRiOGI3MCwweGQwZjg5NzkxLAkweGM3NmM1MWEzLDB4MDY1NGJlMzApCisJV09SRDY0KDB4ZDE5MmU4MTksMHhkNmVmNTIxOCwJMHhkNjk5MDYyNCwweDU1NjVhOTEwKQorCVdPUkQ2NCgweGY0MGUzNTg1LDB4NTc3MTIwMmEsCTB4MTA2YWEwNzAsMHgzMmJiZDFiOCkKKwlXT1JENjQoMHgxOWE0YzExNiwweGI4ZDJkMGM4LAkweDFlMzc2YzA4LDB4NTE0MWFiNTMpCisJV09SRDY0KDB4Mjc0ODc3NGMsMHhkZjhlZWI5OSwJMHgzNGIwYmNiNSwweGUxOWI0OGE4KQorCVdPUkQ2NCgweDM5MWMwY2IzLDB4YzVjOTVhNjMsCTB4NGVkOGFhNGEsMHhlMzQxOGFjYikKKwlXT1JENjQoMHg1YjljY2E0ZiwweDc3NjNlMzczLAkweDY4MmU2ZmYzLDB4ZDZiMmI4YTMpCisJV09SRDY0KDB4NzQ4ZjgyZWUsMHg1ZGVmYjJmYywJMHg3OGE1NjM2ZiwweDQzMTcyZjYwKQorCVdPUkQ2NCgweDg0Yzg3ODE0LDB4YTFmMGFiNzIsCTB4OGNjNzAyMDgsMHgxYTY0MzllYykKKwlXT1JENjQoMHg5MGJlZmZmYSwweDIzNjMxZTI4LAkweGE0NTA2Y2ViLDB4ZGU4MmJkZTkpCisJV09SRDY0KDB4YmVmOWEzZjcsMHhiMmM2NzkxNSwJMHhjNjcxNzhmMiwweGUzNzI1MzJiKQorCVdPUkQ2NCgweGNhMjczZWNlLDB4ZWEyNjYxOWMsCTB4ZDE4NmI4YzcsMHgyMWMwYzIwNykKKwlXT1JENjQoMHhlYWRhN2RkNiwweGNkZTBlYjFlLAkweGY1N2Q0ZjdmLDB4ZWU2ZWQxNzgpCisJV09SRDY0KDB4MDZmMDY3YWEsMHg3MjE3NmZiYSwJMHgwYTYzN2RjNSwweGEyYzg5OGE2KQorCVdPUkQ2NCgweDExM2Y5ODA0LDB4YmVmOTBkYWUsCTB4MWI3MTBiMzUsMHgxMzFjNDcxYikKKwlXT1JENjQoMHgyOGRiNzdmNSwweDIzMDQ3ZDg0LAkweDMyY2FhYjdiLDB4NDBjNzI0OTMpCisJV09SRDY0KDB4M2M5ZWJlMGEsMHgxNWM5YmViYywJMHg0MzFkNjdjNCwweDljMTAwZDRjKQorCVdPUkQ2NCgweDRjYzVkNGJlLDB4Y2IzZTQyYjYsCTB4NTk3ZjI5OWMsMHhmYzY1N2UyYSkKKwlXT1JENjQoMHg1ZmNiNmZhYiwweDNhZDZmYWVjLAkweDZjNDQxOThjLDB4NGE0NzU4MTcpCisKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03ICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCitMT1BFTlNTTF9hcm1jYXA6Cisud29yZAlPUEVOU1NMX2FybWNhcF9QLUxzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnNraXAJMzItNAorI2Vsc2UKKy5za2lwCTMyCisjZW5kaWYKKworLmdsb2JsCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnByaXZhdGVfZXh0ZXJuCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorI2lmZGVmIF9fdGh1bWIyX18KKy50aHVtYl9mdW5jCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorI2VuZGlmCitfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXI6CitMc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXI6CisjaWYgX19BUk1fQVJDSF9fPDcgJiYgIWRlZmluZWQoX190aHVtYjJfXykKKwlzdWIJcjMscGMsIzgJCUAgX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyCisjZWxzZQorCWFkcglyMyxMc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKyNlbmRpZgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKwlsZHIJcjEyLExPUEVOU1NMX2FybWNhcAorCWxkcglyMTIsW3IzLHIxMl0JCUAgT1BFTlNTTF9hcm1jYXBfUAorI2lmZGVmCV9fQVBQTEVfXworCWxkcglyMTIsW3IxMl0KKyNlbmRpZgorCXRzdAlyMTIsI0FSTVY3X05FT04KKwlibmUJTE5FT04KKyNlbmRpZgorCWFkZAlyMixyMSxyMixsc2wjNwlAIGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mIGlucAorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisJc3ViCXIxNCxyMywjNjcyCQlAIEs1MTIKKwlzdWIJc3Asc3AsIzkqOAorCisJbGRyCXI3LFtyMCwjMzIrTE9dCisJbGRyCXI4LFtyMCwjMzIrSEldCisJbGRyCXI5LCBbcjAsIzQ4K0xPXQorCWxkcglyMTAsIFtyMCwjNDgrSEldCisJbGRyCXIxMSwgW3IwLCM1NitMT10KKwlsZHIJcjEyLCBbcjAsIzU2K0hJXQorTG9vcDoKKwlzdHIJcjksIFtzcCwjNDgrMF0KKwlzdHIJcjEwLCBbc3AsIzQ4KzRdCisJc3RyCXIxMSwgW3NwLCM1NiswXQorCXN0cglyMTIsIFtzcCwjNTYrNF0KKwlsZHIJcjUsW3IwLCMwK0xPXQorCWxkcglyNixbcjAsIzArSEldCisJbGRyCXIzLFtyMCwjOCtMT10KKwlsZHIJcjQsW3IwLCM4K0hJXQorCWxkcglyOSwgW3IwLCMxNitMT10KKwlsZHIJcjEwLCBbcjAsIzE2K0hJXQorCWxkcglyMTEsIFtyMCwjMjQrTE9dCisJbGRyCXIxMiwgW3IwLCMyNCtISV0KKwlzdHIJcjMsW3NwLCM4KzBdCisJc3RyCXI0LFtzcCwjOCs0XQorCXN0cglyOSwgW3NwLCMxNiswXQorCXN0cglyMTAsIFtzcCwjMTYrNF0KKwlzdHIJcjExLCBbc3AsIzI0KzBdCisJc3RyCXIxMiwgW3NwLCMyNCs0XQorCWxkcglyMyxbcjAsIzQwK0xPXQorCWxkcglyNCxbcjAsIzQwK0hJXQorCXN0cglyMyxbc3AsIzQwKzBdCisJc3RyCXI0LFtzcCwjNDArNF0KKworTDAwXzE1OgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMyxbcjEsIzddCisJbGRyYglyOSwgW3IxLCM2XQorCWxkcmIJcjEwLCBbcjEsIzVdCisJbGRyYglyMTEsIFtyMSwjNF0KKwlsZHJiCXI0LFtyMSwjM10KKwlsZHJiCXIxMiwgW3IxLCMyXQorCW9ycglyMyxyMyxyOSxsc2wjOAorCWxkcmIJcjksIFtyMSwjMV0KKwlvcnIJcjMscjMscjEwLGxzbCMxNgorCWxkcmIJcjEwLCBbcjFdLCM4CisJb3JyCXIzLHIzLHIxMSxsc2wjMjQKKwlvcnIJcjQscjQscjEyLGxzbCM4CisJb3JyCXI0LHI0LHI5LGxzbCMxNgorCW9ycglyNCxyNCxyMTAsbHNsIzI0CisjZWxzZQorCWxkcglyMyxbcjEsIzRdCisJbGRyCXI0LFtyMV0sIzgKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjMscjMKKwlyZXYJcjQscjQKKyNlbmRpZgorI2VuZGlmCisJQCBTaWdtYTEoeCkJKFJPVFIoKHgpLDE0KSBeIFJPVFIoKHgpLDE4KSAgXiBST1RSKCh4KSw0MSkpCisJQCBMTwkJbG8+PjE0XmhpPDwxOCBeIGxvPj4xOF5oaTw8MTQgXiBoaT4+OV5sbzw8MjMKKwlAIEhJCQloaT4+MTRebG88PDE4IF4gaGk+PjE4XmxvPDwxNCBeIGxvPj45XmhpPDwyMworCW1vdglyOSxyNyxsc3IjMTQKKwlzdHIJcjMsW3NwLCM2NCswXQorCW1vdglyMTAscjgsbHNyIzE0CisJc3RyCXI0LFtzcCwjNjQrNF0KKwllb3IJcjkscjkscjgsbHNsIzE4CisJbGRyCXIxMSxbc3AsIzU2KzBdCUAgaC5sbworCWVvcglyMTAscjEwLHI3LGxzbCMxOAorCWxkcglyMTIsW3NwLCM1Nis0XQlAIGguaGkKKwllb3IJcjkscjkscjcsbHNyIzE4CisJZW9yCXIxMCxyMTAscjgsbHNyIzE4CisJZW9yCXI5LHI5LHI4LGxzbCMxNAorCWVvcglyMTAscjEwLHI3LGxzbCMxNAorCWVvcglyOSxyOSxyOCxsc3IjOQorCWVvcglyMTAscjEwLHI3LGxzciM5CisJZW9yCXI5LHI5LHI3LGxzbCMyMworCWVvcglyMTAscjEwLHI4LGxzbCMyMwlAIFNpZ21hMShlKQorCWFkZHMJcjMscjMscjkKKwlsZHIJcjksW3NwLCM0MCswXQlAIGYubG8KKwlhZGMJcjQscjQscjEwCQlAIFQgKz0gU2lnbWExKGUpCisJbGRyCXIxMCxbc3AsIzQwKzRdCUAgZi5oaQorCWFkZHMJcjMscjMscjExCisJbGRyCXIxMSxbc3AsIzQ4KzBdCUAgZy5sbworCWFkYwlyNCxyNCxyMTIJCUAgVCArPSBoCisJbGRyCXIxMixbc3AsIzQ4KzRdCUAgZy5oaQorCisJZW9yCXI5LHI5LHIxMQorCXN0cglyNyxbc3AsIzMyKzBdCisJZW9yCXIxMCxyMTAscjEyCisJc3RyCXI4LFtzcCwjMzIrNF0KKwlhbmQJcjkscjkscjcKKwlzdHIJcjUsW3NwLCMwKzBdCisJYW5kCXIxMCxyMTAscjgKKwlzdHIJcjYsW3NwLCMwKzRdCisJZW9yCXI5LHI5LHIxMQorCWxkcglyMTEsW3IxNCwjTE9dCUAgS1tpXS5sbworCWVvcglyMTAscjEwLHIxMgkJQCBDaChlLGYsZykKKwlsZHIJcjEyLFtyMTQsI0hJXQlAIEtbaV0uaGkKKworCWFkZHMJcjMscjMscjkKKwlsZHIJcjcsW3NwLCMyNCswXQlAIGQubG8KKwlhZGMJcjQscjQscjEwCQlAIFQgKz0gQ2goZSxmLGcpCisJbGRyCXI4LFtzcCwjMjQrNF0JQCBkLmhpCisJYWRkcwlyMyxyMyxyMTEKKwlhbmQJcjkscjExLCMweGZmCisJYWRjCXI0LHI0LHIxMgkJQCBUICs9IEtbaV0KKwlhZGRzCXI3LHI3LHIzCisJbGRyCXIxMSxbc3AsIzgrMF0JQCBiLmxvCisJYWRjCXI4LHI4LHI0CQlAIGQgKz0gVAorCXRlcQlyOSwjMTQ4CisKKwlsZHIJcjEyLFtzcCwjMTYrMF0JQCBjLmxvCisjaWYgX19BUk1fQVJDSF9fPj03CisJaXQJZXEJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJb3JyZXEJcjE0LHIxNCwjMQorCUAgU2lnbWEwKHgpCShST1RSKCh4KSwyOCkgXiBST1RSKCh4KSwzNCkgXiBST1RSKCh4KSwzOSkpCisJQCBMTwkJbG8+PjI4XmhpPDw0ICBeIGhpPj4yXmxvPDwzMCBeIGhpPj43XmxvPDwyNQorCUAgSEkJCWhpPj4yOF5sbzw8NCAgXiBsbz4+Ml5oaTw8MzAgXiBsbz4+N15oaTw8MjUKKwltb3YJcjkscjUsbHNyIzI4CisJbW92CXIxMCxyNixsc3IjMjgKKwllb3IJcjkscjkscjYsbHNsIzQKKwllb3IJcjEwLHIxMCxyNSxsc2wjNAorCWVvcglyOSxyOSxyNixsc3IjMgorCWVvcglyMTAscjEwLHI1LGxzciMyCisJZW9yCXI5LHI5LHI1LGxzbCMzMAorCWVvcglyMTAscjEwLHI2LGxzbCMzMAorCWVvcglyOSxyOSxyNixsc3IjNworCWVvcglyMTAscjEwLHI1LGxzciM3CisJZW9yCXI5LHI5LHI1LGxzbCMyNQorCWVvcglyMTAscjEwLHI2LGxzbCMyNQlAIFNpZ21hMChhKQorCWFkZHMJcjMscjMscjkKKwlhbmQJcjkscjUscjExCisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IFNpZ21hMChhKQorCisJbGRyCXIxMCxbc3AsIzgrNF0JQCBiLmhpCisJb3JyCXI1LHI1LHIxMQorCWxkcglyMTEsW3NwLCMxNis0XQlAIGMuaGkKKwlhbmQJcjUscjUscjEyCisJYW5kCXIxMixyNixyMTAKKwlvcnIJcjYscjYscjEwCisJb3JyCXI1LHI1LHI5CQlAIE1haihhLGIsYykubG8KKwlhbmQJcjYscjYscjExCisJYWRkcwlyNSxyNSxyMworCW9ycglyNixyNixyMTIJCUAgTWFqKGEsYixjKS5oaQorCXN1YglzcCxzcCwjOAorCWFkYwlyNixyNixyNAkJQCBoICs9IFQKKwl0c3QJcjE0LCMxCisJYWRkCXIxNCxyMTQsIzgKKwl0c3QJcjE0LCMxCisJYmVxCUwwMF8xNQorCWxkcglyOSxbc3AsIzE4NCswXQorCWxkcglyMTAsW3NwLCMxODQrNF0KKwliaWMJcjE0LHIxNCwjMQorTDE2Xzc5OgorCUAgc2lnbWEwKHgpCShST1RSKCh4KSwxKSAgXiBST1RSKCh4KSw4KSAgXiAoKHgpPj43KSkKKwlAIExPCQlsbz4+MV5oaTw8MzEgIF4gbG8+PjheaGk8PDI0IF4gbG8+PjdeaGk8PDI1CisJQCBISQkJaGk+PjFebG88PDMxICBeIGhpPj44XmxvPDwyNCBeIGhpPj43CisJbW92CXIzLHI5LGxzciMxCisJbGRyCXIxMSxbc3AsIzgwKzBdCisJbW92CXI0LHIxMCxsc3IjMQorCWxkcglyMTIsW3NwLCM4MCs0XQorCWVvcglyMyxyMyxyMTAsbHNsIzMxCisJZW9yCXI0LHI0LHI5LGxzbCMzMQorCWVvcglyMyxyMyxyOSxsc3IjOAorCWVvcglyNCxyNCxyMTAsbHNyIzgKKwllb3IJcjMscjMscjEwLGxzbCMyNAorCWVvcglyNCxyNCxyOSxsc2wjMjQKKwllb3IJcjMscjMscjksbHNyIzcKKwllb3IJcjQscjQscjEwLGxzciM3CisJZW9yCXIzLHIzLHIxMCxsc2wjMjUKKworCUAgc2lnbWExKHgpCShST1RSKCh4KSwxOSkgXiBST1RSKCh4KSw2MSkgXiAoKHgpPj42KSkKKwlAIExPCQlsbz4+MTleaGk8PDEzIF4gaGk+PjI5XmxvPDwzIF4gbG8+PjZeaGk8PDI2CisJQCBISQkJaGk+PjE5XmxvPDwxMyBeIGxvPj4yOV5oaTw8MyBeIGhpPj42CisJbW92CXI5LHIxMSxsc3IjMTkKKwltb3YJcjEwLHIxMixsc3IjMTkKKwllb3IJcjkscjkscjEyLGxzbCMxMworCWVvcglyMTAscjEwLHIxMSxsc2wjMTMKKwllb3IJcjkscjkscjEyLGxzciMyOQorCWVvcglyMTAscjEwLHIxMSxsc3IjMjkKKwllb3IJcjkscjkscjExLGxzbCMzCisJZW9yCXIxMCxyMTAscjEyLGxzbCMzCisJZW9yCXI5LHI5LHIxMSxsc3IjNgorCWVvcglyMTAscjEwLHIxMixsc3IjNgorCWxkcglyMTEsW3NwLCMxMjArMF0KKwllb3IJcjkscjkscjEyLGxzbCMyNgorCisJbGRyCXIxMixbc3AsIzEyMCs0XQorCWFkZHMJcjMscjMscjkKKwlsZHIJcjksW3NwLCMxOTIrMF0KKwlhZGMJcjQscjQscjEwCisKKwlsZHIJcjEwLFtzcCwjMTkyKzRdCisJYWRkcwlyMyxyMyxyMTEKKwlhZGMJcjQscjQscjEyCisJYWRkcwlyMyxyMyxyOQorCWFkYwlyNCxyNCxyMTAKKwlAIFNpZ21hMSh4KQkoUk9UUigoeCksMTQpIF4gUk9UUigoeCksMTgpICBeIFJPVFIoKHgpLDQxKSkKKwlAIExPCQlsbz4+MTReaGk8PDE4IF4gbG8+PjE4XmhpPDwxNCBeIGhpPj45XmxvPDwyMworCUAgSEkJCWhpPj4xNF5sbzw8MTggXiBoaT4+MThebG88PDE0IF4gbG8+PjleaGk8PDIzCisJbW92CXI5LHI3LGxzciMxNAorCXN0cglyMyxbc3AsIzY0KzBdCisJbW92CXIxMCxyOCxsc3IjMTQKKwlzdHIJcjQsW3NwLCM2NCs0XQorCWVvcglyOSxyOSxyOCxsc2wjMTgKKwlsZHIJcjExLFtzcCwjNTYrMF0JQCBoLmxvCisJZW9yCXIxMCxyMTAscjcsbHNsIzE4CisJbGRyCXIxMixbc3AsIzU2KzRdCUAgaC5oaQorCWVvcglyOSxyOSxyNyxsc3IjMTgKKwllb3IJcjEwLHIxMCxyOCxsc3IjMTgKKwllb3IJcjkscjkscjgsbHNsIzE0CisJZW9yCXIxMCxyMTAscjcsbHNsIzE0CisJZW9yCXI5LHI5LHI4LGxzciM5CisJZW9yCXIxMCxyMTAscjcsbHNyIzkKKwllb3IJcjkscjkscjcsbHNsIzIzCisJZW9yCXIxMCxyMTAscjgsbHNsIzIzCUAgU2lnbWExKGUpCisJYWRkcwlyMyxyMyxyOQorCWxkcglyOSxbc3AsIzQwKzBdCUAgZi5sbworCWFkYwlyNCxyNCxyMTAJCUAgVCArPSBTaWdtYTEoZSkKKwlsZHIJcjEwLFtzcCwjNDArNF0JQCBmLmhpCisJYWRkcwlyMyxyMyxyMTEKKwlsZHIJcjExLFtzcCwjNDgrMF0JQCBnLmxvCisJYWRjCXI0LHI0LHIxMgkJQCBUICs9IGgKKwlsZHIJcjEyLFtzcCwjNDgrNF0JQCBnLmhpCisKKwllb3IJcjkscjkscjExCisJc3RyCXI3LFtzcCwjMzIrMF0KKwllb3IJcjEwLHIxMCxyMTIKKwlzdHIJcjgsW3NwLCMzMis0XQorCWFuZAlyOSxyOSxyNworCXN0cglyNSxbc3AsIzArMF0KKwlhbmQJcjEwLHIxMCxyOAorCXN0cglyNixbc3AsIzArNF0KKwllb3IJcjkscjkscjExCisJbGRyCXIxMSxbcjE0LCNMT10JQCBLW2ldLmxvCisJZW9yCXIxMCxyMTAscjEyCQlAIENoKGUsZixnKQorCWxkcglyMTIsW3IxNCwjSEldCUAgS1tpXS5oaQorCisJYWRkcwlyMyxyMyxyOQorCWxkcglyNyxbc3AsIzI0KzBdCUAgZC5sbworCWFkYwlyNCxyNCxyMTAJCUAgVCArPSBDaChlLGYsZykKKwlsZHIJcjgsW3NwLCMyNCs0XQlAIGQuaGkKKwlhZGRzCXIzLHIzLHIxMQorCWFuZAlyOSxyMTEsIzB4ZmYKKwlhZGMJcjQscjQscjEyCQlAIFQgKz0gS1tpXQorCWFkZHMJcjcscjcscjMKKwlsZHIJcjExLFtzcCwjOCswXQlAIGIubG8KKwlhZGMJcjgscjgscjQJCUAgZCArPSBUCisJdGVxCXI5LCMyMworCisJbGRyCXIxMixbc3AsIzE2KzBdCUAgYy5sbworI2lmIF9fQVJNX0FSQ0hfXz49NworCWl0CWVxCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKyNlbmRpZgorCW9ycmVxCXIxNCxyMTQsIzEKKwlAIFNpZ21hMCh4KQkoUk9UUigoeCksMjgpIF4gUk9UUigoeCksMzQpIF4gUk9UUigoeCksMzkpKQorCUAgTE8JCWxvPj4yOF5oaTw8NCAgXiBoaT4+Ml5sbzw8MzAgXiBoaT4+N15sbzw8MjUKKwlAIEhJCQloaT4+MjhebG88PDQgIF4gbG8+PjJeaGk8PDMwIF4gbG8+PjdeaGk8PDI1CisJbW92CXI5LHI1LGxzciMyOAorCW1vdglyMTAscjYsbHNyIzI4CisJZW9yCXI5LHI5LHI2LGxzbCM0CisJZW9yCXIxMCxyMTAscjUsbHNsIzQKKwllb3IJcjkscjkscjYsbHNyIzIKKwllb3IJcjEwLHIxMCxyNSxsc3IjMgorCWVvcglyOSxyOSxyNSxsc2wjMzAKKwllb3IJcjEwLHIxMCxyNixsc2wjMzAKKwllb3IJcjkscjkscjYsbHNyIzcKKwllb3IJcjEwLHIxMCxyNSxsc3IjNworCWVvcglyOSxyOSxyNSxsc2wjMjUKKwllb3IJcjEwLHIxMCxyNixsc2wjMjUJQCBTaWdtYTAoYSkKKwlhZGRzCXIzLHIzLHI5CisJYW5kCXI5LHI1LHIxMQorCWFkYwlyNCxyNCxyMTAJCUAgVCArPSBTaWdtYTAoYSkKKworCWxkcglyMTAsW3NwLCM4KzRdCUAgYi5oaQorCW9ycglyNSxyNSxyMTEKKwlsZHIJcjExLFtzcCwjMTYrNF0JQCBjLmhpCisJYW5kCXI1LHI1LHIxMgorCWFuZAlyMTIscjYscjEwCisJb3JyCXI2LHI2LHIxMAorCW9ycglyNSxyNSxyOQkJQCBNYWooYSxiLGMpLmxvCisJYW5kCXI2LHI2LHIxMQorCWFkZHMJcjUscjUscjMKKwlvcnIJcjYscjYscjEyCQlAIE1haihhLGIsYykuaGkKKwlzdWIJc3Asc3AsIzgKKwlhZGMJcjYscjYscjQJCUAgaCArPSBUCisJdHN0CXIxNCwjMQorCWFkZAlyMTQscjE0LCM4CisjaWYgX19BUk1fQVJDSF9fPj03CisJaXR0dAllcQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlsZHJlcQlyOSxbc3AsIzE4NCswXQorCWxkcmVxCXIxMCxbc3AsIzE4NCs0XQorCWJlcQlMMTZfNzkKKwliaWMJcjE0LHIxNCwjMQorCisJbGRyCXIzLFtzcCwjOCswXQorCWxkcglyNCxbc3AsIzgrNF0KKwlsZHIJcjksIFtyMCwjMCtMT10KKwlsZHIJcjEwLCBbcjAsIzArSEldCisJbGRyCXIxMSwgW3IwLCM4K0xPXQorCWxkcglyMTIsIFtyMCwjOCtISV0KKwlhZGRzCXI5LHI1LHI5CisJc3RyCXI5LCBbcjAsIzArTE9dCisJYWRjCXIxMCxyNixyMTAKKwlzdHIJcjEwLCBbcjAsIzArSEldCisJYWRkcwlyMTEscjMscjExCisJc3RyCXIxMSwgW3IwLCM4K0xPXQorCWFkYwlyMTIscjQscjEyCisJc3RyCXIxMiwgW3IwLCM4K0hJXQorCisJbGRyCXI1LFtzcCwjMTYrMF0KKwlsZHIJcjYsW3NwLCMxNis0XQorCWxkcglyMyxbc3AsIzI0KzBdCisJbGRyCXI0LFtzcCwjMjQrNF0KKwlsZHIJcjksIFtyMCwjMTYrTE9dCisJbGRyCXIxMCwgW3IwLCMxNitISV0KKwlsZHIJcjExLCBbcjAsIzI0K0xPXQorCWxkcglyMTIsIFtyMCwjMjQrSEldCisJYWRkcwlyOSxyNSxyOQorCXN0cglyOSwgW3IwLCMxNitMT10KKwlhZGMJcjEwLHI2LHIxMAorCXN0cglyMTAsIFtyMCwjMTYrSEldCisJYWRkcwlyMTEscjMscjExCisJc3RyCXIxMSwgW3IwLCMyNCtMT10KKwlhZGMJcjEyLHI0LHIxMgorCXN0cglyMTIsIFtyMCwjMjQrSEldCisKKwlsZHIJcjMsW3NwLCM0MCswXQorCWxkcglyNCxbc3AsIzQwKzRdCisJbGRyCXI5LCBbcjAsIzMyK0xPXQorCWxkcglyMTAsIFtyMCwjMzIrSEldCisJbGRyCXIxMSwgW3IwLCM0MCtMT10KKwlsZHIJcjEyLCBbcjAsIzQwK0hJXQorCWFkZHMJcjcscjcscjkKKwlzdHIJcjcsW3IwLCMzMitMT10KKwlhZGMJcjgscjgscjEwCisJc3RyCXI4LFtyMCwjMzIrSEldCisJYWRkcwlyMTEscjMscjExCisJc3RyCXIxMSwgW3IwLCM0MCtMT10KKwlhZGMJcjEyLHI0LHIxMgorCXN0cglyMTIsIFtyMCwjNDArSEldCisKKwlsZHIJcjUsW3NwLCM0OCswXQorCWxkcglyNixbc3AsIzQ4KzRdCisJbGRyCXIzLFtzcCwjNTYrMF0KKwlsZHIJcjQsW3NwLCM1Nis0XQorCWxkcglyOSwgW3IwLCM0OCtMT10KKwlsZHIJcjEwLCBbcjAsIzQ4K0hJXQorCWxkcglyMTEsIFtyMCwjNTYrTE9dCisJbGRyCXIxMiwgW3IwLCM1NitISV0KKwlhZGRzCXI5LHI1LHI5CisJc3RyCXI5LCBbcjAsIzQ4K0xPXQorCWFkYwlyMTAscjYscjEwCisJc3RyCXIxMCwgW3IwLCM0OCtISV0KKwlhZGRzCXIxMSxyMyxyMTEKKwlzdHIJcjExLCBbcjAsIzU2K0xPXQorCWFkYwlyMTIscjQscjEyCisJc3RyCXIxMiwgW3IwLCM1NitISV0KKworCWFkZAlzcCxzcCwjNjQwCisJc3ViCXIxNCxyMTQsIzY0MAorCisJdGVxCXIxLHIyCisJYm5lCUxvb3AKKworCWFkZAlzcCxzcCwjOCo5CQlAIGRlc3Ryb3kgZnJhbWUKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKy53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworCisKKworLmdsb2JsCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl9uZW9uCisucHJpdmF0ZV9leHRlcm4JX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyX25lb24KKyNpZmRlZiBfX3RodW1iMl9fCisudGh1bWJfZnVuYwlfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorI2VuZGlmCisuYWxpZ24JNAorX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyX25lb246CitMTkVPTjoKKwlkbWIJQCBlcnJhdGEgIzQ1MTAzNCBvbiBlYXJseSBDb3J0ZXggQTgKKwlhZGQJcjIscjEscjIsbHNsIzcJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwlhZHIJcjMsSzUxMgorCVZGUF9BQklfUFVTSAorCXZsZG1pYQlyMCx7ZDE2LGQxNyxkMTgsZDE5LGQyMCxkMjEsZDIyLGQyM30JCUAgbG9hZCBjb250ZXh0CitMb29wX25lb246CisJdnNoci51NjQJZDI0LGQyMCwjMTQJQCAwCisjaWYgMDwxNgorCXZsZDEuNjQJe2QwfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIwLCMxOAorI2lmIDA+MAorCXZhZGQuaTY0CWQxNixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIwLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIwLCM1MAorCXZzbGkuNjQJZDI1LGQyMCwjNDYKKwl2bW92CWQyOSxkMjAKKwl2c2xpLjY0CWQyNixkMjAsIzIzCisjaWYgMDwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMCxkMAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIxLGQyMgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE2LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjMKKwl2c2hyLnU2NAlkMjUsZDE2LCMzNAorCXZzbGkuNjQJZDI0LGQxNiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxNiwjMzkKKwl2YWRkLmk2NAlkMjgsZDAKKwl2c2xpLjY0CWQyNSxkMTYsIzMwCisJdmVvcglkMzAsZDE2LGQxNworCXZzbGkuNjQJZDI2LGQxNiwjMjUKKwl2ZW9yCWQyMyxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOCxkMTcJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIzLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE5LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMyxkMzAKKwl2c2hyLnU2NAlkMjQsZDE5LCMxNAlAIDEKKyNpZiAxPDE2CisJdmxkMS42NAl7ZDF9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTksIzE4CisjaWYgMT4wCisJdmFkZC5pNjQJZDIzLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTksIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTksIzUwCisJdnNsaS42NAlkMjUsZDE5LCM0NgorCXZtb3YJZDI5LGQxOQorCXZzbGkuNjQJZDI2LGQxOSwjMjMKKyNpZiAxPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQxLGQxCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjAsZDIxCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjMsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQyMgorCXZzaHIudTY0CWQyNSxkMjMsIzM0CisJdnNsaS42NAlkMjQsZDIzLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIzLCMzOQorCXZhZGQuaTY0CWQyOCxkMQorCXZzbGkuNjQJZDI1LGQyMywjMzAKKwl2ZW9yCWQzMCxkMjMsZDE2CisJdnNsaS42NAlkMjYsZDIzLCMyNQorCXZlb3IJZDIyLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE3LGQxNgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjIsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTgsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIyLGQzMAorCXZzaHIudTY0CWQyNCxkMTgsIzE0CUAgMgorI2lmIDI8MTYKKwl2bGQxLjY0CXtkMn0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxOCwjMTgKKyNpZiAyPjAKKwl2YWRkLmk2NAlkMjIsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQxOCwjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxOCwjNTAKKwl2c2xpLjY0CWQyNSxkMTgsIzQ2CisJdm1vdglkMjksZDE4CisJdnNsaS42NAlkMjYsZDE4LCMyMworI2lmIDI8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDIsZDIKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxOSxkMjAJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIxCisJdnNoci51NjQJZDI1LGQyMiwjMzQKKwl2c2xpLjY0CWQyNCxkMjIsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjIsIzM5CisJdmFkZC5pNjQJZDI4LGQyCisJdnNsaS42NAlkMjUsZDIyLCMzMAorCXZlb3IJZDMwLGQyMixkMjMKKwl2c2xpLjY0CWQyNixkMjIsIzI1CisJdmVvcglkMjEsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTYsZDIzCQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxNyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjEsZDMwCisJdnNoci51NjQJZDI0LGQxNywjMTQJQCAzCisjaWYgMzwxNgorCXZsZDEuNjQJe2QzfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDE3LCMxOAorI2lmIDM+MAorCXZhZGQuaTY0CWQyMSxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE3LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE3LCM1MAorCXZzbGkuNjQJZDI1LGQxNywjNDYKKwl2bW92CWQyOSxkMTcKKwl2c2xpLjY0CWQyNixkMTcsIzIzCisjaWYgMzwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMyxkMworI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE4LGQxOQkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIxLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjAKKwl2c2hyLnU2NAlkMjUsZDIxLCMzNAorCXZzbGkuNjQJZDI0LGQyMSwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMSwjMzkKKwl2YWRkLmk2NAlkMjgsZDMKKwl2c2xpLjY0CWQyNSxkMjEsIzMwCisJdmVvcglkMzAsZDIxLGQyMgorCXZzbGkuNjQJZDI2LGQyMSwjMjUKKwl2ZW9yCWQyMCxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMyxkMjIJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIwLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE2LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMCxkMzAKKwl2c2hyLnU2NAlkMjQsZDE2LCMxNAlAIDQKKyNpZiA0PDE2CisJdmxkMS42NAl7ZDR9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTYsIzE4CisjaWYgND4wCisJdmFkZC5pNjQJZDIwLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTYsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTYsIzUwCisJdnNsaS42NAlkMjUsZDE2LCM0NgorCXZtb3YJZDI5LGQxNgorCXZzbGkuNjQJZDI2LGQxNiwjMjMKKyNpZiA0PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQ0LGQ0CisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTcsZDE4CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjAsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxOQorCXZzaHIudTY0CWQyNSxkMjAsIzM0CisJdnNsaS42NAlkMjQsZDIwLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIwLCMzOQorCXZhZGQuaTY0CWQyOCxkNAorCXZzbGkuNjQJZDI1LGQyMCwjMzAKKwl2ZW9yCWQzMCxkMjAsZDIxCisJdnNsaS42NAlkMjYsZDIwLCMyNQorCXZlb3IJZDE5LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIyLGQyMQkJQCBNYWooYSxiLGMpCisJdmVvcglkMTksZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjMsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE5LGQzMAorCXZzaHIudTY0CWQyNCxkMjMsIzE0CUAgNQorI2lmIDU8MTYKKwl2bGQxLjY0CXtkNX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMywjMTgKKyNpZiA1PjAKKwl2YWRkLmk2NAlkMTksZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMywjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMywjNTAKKwl2c2xpLjY0CWQyNSxkMjMsIzQ2CisJdm1vdglkMjksZDIzCisJdnNsaS42NAlkMjYsZDIzLCMyMworI2lmIDU8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDUsZDUKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxNixkMTcJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxOSwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE4CisJdnNoci51NjQJZDI1LGQxOSwjMzQKKwl2c2xpLjY0CWQyNCxkMTksIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTksIzM5CisJdmFkZC5pNjQJZDI4LGQ1CisJdnNsaS42NAlkMjUsZDE5LCMzMAorCXZlb3IJZDMwLGQxOSxkMjAKKwl2c2xpLjY0CWQyNixkMTksIzI1CisJdmVvcglkMTgsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjEsZDIwCQlAIE1haihhLGIsYykKKwl2ZW9yCWQxOCxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMixkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTgsZDMwCisJdnNoci51NjQJZDI0LGQyMiwjMTQJQCA2CisjaWYgNjwxNgorCXZsZDEuNjQJe2Q2fSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIyLCMxOAorI2lmIDY+MAorCXZhZGQuaTY0CWQxOCxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIyLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIyLCM1MAorCXZzbGkuNjQJZDI1LGQyMiwjNDYKKwl2bW92CWQyOSxkMjIKKwl2c2xpLjY0CWQyNixkMjIsIzIzCisjaWYgNjwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkNixkNgorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIzLGQxNgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE4LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTcKKwl2c2hyLnU2NAlkMjUsZDE4LCMzNAorCXZzbGkuNjQJZDI0LGQxOCwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxOCwjMzkKKwl2YWRkLmk2NAlkMjgsZDYKKwl2c2xpLjY0CWQyNSxkMTgsIzMwCisJdmVvcglkMzAsZDE4LGQxOQorCXZzbGkuNjQJZDI2LGQxOCwjMjUKKwl2ZW9yCWQxNyxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMCxkMTkJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE3LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIxLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxNyxkMzAKKwl2c2hyLnU2NAlkMjQsZDIxLCMxNAlAIDcKKyNpZiA3PDE2CisJdmxkMS42NAl7ZDd9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMjEsIzE4CisjaWYgNz4wCisJdmFkZC5pNjQJZDE3LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjEsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjEsIzUwCisJdnNsaS42NAlkMjUsZDIxLCM0NgorCXZtb3YJZDI5LGQyMQorCXZzbGkuNjQJZDI2LGQyMSwjMjMKKyNpZiA3PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQ3LGQ3CisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjIsZDIzCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTcsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxNgorCXZzaHIudTY0CWQyNSxkMTcsIzM0CisJdnNsaS42NAlkMjQsZDE3LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE3LCMzOQorCXZhZGQuaTY0CWQyOCxkNworCXZzbGkuNjQJZDI1LGQxNywjMzAKKwl2ZW9yCWQzMCxkMTcsZDE4CisJdnNsaS42NAlkMjYsZDE3LCMyNQorCXZlb3IJZDE2LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE5LGQxOAkJQCBNYWooYSxiLGMpCisJdmVvcglkMTYsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjAsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE2LGQzMAorCXZzaHIudTY0CWQyNCxkMjAsIzE0CUAgOAorI2lmIDg8MTYKKwl2bGQxLjY0CXtkOH0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMCwjMTgKKyNpZiA4PjAKKwl2YWRkLmk2NAlkMTYsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMCwjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMCwjNTAKKwl2c2xpLjY0CWQyNSxkMjAsIzQ2CisJdm1vdglkMjksZDIwCisJdnNsaS42NAlkMjYsZDIwLCMyMworI2lmIDg8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDgsZDgKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMSxkMjIJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxNiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIzCisJdnNoci51NjQJZDI1LGQxNiwjMzQKKwl2c2xpLjY0CWQyNCxkMTYsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTYsIzM5CisJdmFkZC5pNjQJZDI4LGQ4CisJdnNsaS42NAlkMjUsZDE2LCMzMAorCXZlb3IJZDMwLGQxNixkMTcKKwl2c2xpLjY0CWQyNixkMTYsIzI1CisJdmVvcglkMjMsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTgsZDE3CQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMyxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxOSxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjMsZDMwCisJdnNoci51NjQJZDI0LGQxOSwjMTQJQCA5CisjaWYgOTwxNgorCXZsZDEuNjQJe2Q5fSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDE5LCMxOAorI2lmIDk+MAorCXZhZGQuaTY0CWQyMyxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE5LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE5LCM1MAorCXZzbGkuNjQJZDI1LGQxOSwjNDYKKwl2bW92CWQyOSxkMTkKKwl2c2xpLjY0CWQyNixkMTksIzIzCisjaWYgOTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkOSxkOQorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIwLGQyMQkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIzLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjIKKwl2c2hyLnU2NAlkMjUsZDIzLCMzNAorCXZzbGkuNjQJZDI0LGQyMywjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMywjMzkKKwl2YWRkLmk2NAlkMjgsZDkKKwl2c2xpLjY0CWQyNSxkMjMsIzMwCisJdmVvcglkMzAsZDIzLGQxNgorCXZzbGkuNjQJZDI2LGQyMywjMjUKKwl2ZW9yCWQyMixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxNyxkMTYJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIyLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE4LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMixkMzAKKwl2c2hyLnU2NAlkMjQsZDE4LCMxNAlAIDEwCisjaWYgMTA8MTYKKwl2bGQxLjY0CXtkMTB9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTgsIzE4CisjaWYgMTA+MAorCXZhZGQuaTY0CWQyMixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE4LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE4LCM1MAorCXZzbGkuNjQJZDI1LGQxOCwjNDYKKwl2bW92CWQyOSxkMTgKKwl2c2xpLjY0CWQyNixkMTgsIzIzCisjaWYgMTA8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDEwLGQxMAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE5LGQyMAkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIyLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjEKKwl2c2hyLnU2NAlkMjUsZDIyLCMzNAorCXZzbGkuNjQJZDI0LGQyMiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMiwjMzkKKwl2YWRkLmk2NAlkMjgsZDEwCisJdnNsaS42NAlkMjUsZDIyLCMzMAorCXZlb3IJZDMwLGQyMixkMjMKKwl2c2xpLjY0CWQyNixkMjIsIzI1CisJdmVvcglkMjEsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTYsZDIzCQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxNyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjEsZDMwCisJdnNoci51NjQJZDI0LGQxNywjMTQJQCAxMQorI2lmIDExPDE2CisJdmxkMS42NAl7ZDExfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDE3LCMxOAorI2lmIDExPjAKKwl2YWRkLmk2NAlkMjEsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQxNywjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxNywjNTAKKwl2c2xpLjY0CWQyNSxkMTcsIzQ2CisJdm1vdglkMjksZDE3CisJdnNsaS42NAlkMjYsZDE3LCMyMworI2lmIDExPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQxMSxkMTEKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxOCxkMTkJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMSwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIwCisJdnNoci51NjQJZDI1LGQyMSwjMzQKKwl2c2xpLjY0CWQyNCxkMjEsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjEsIzM5CisJdmFkZC5pNjQJZDI4LGQxMQorCXZzbGkuNjQJZDI1LGQyMSwjMzAKKwl2ZW9yCWQzMCxkMjEsZDIyCisJdnNsaS42NAlkMjYsZDIxLCMyNQorCXZlb3IJZDIwLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIzLGQyMgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjAsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTYsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIwLGQzMAorCXZzaHIudTY0CWQyNCxkMTYsIzE0CUAgMTIKKyNpZiAxMjwxNgorCXZsZDEuNjQJe2QxMn0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxNiwjMTgKKyNpZiAxMj4wCisJdmFkZC5pNjQJZDIwLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTYsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTYsIzUwCisJdnNsaS42NAlkMjUsZDE2LCM0NgorCXZtb3YJZDI5LGQxNgorCXZzbGkuNjQJZDI2LGQxNiwjMjMKKyNpZiAxMjwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMTIsZDEyCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTcsZDE4CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjAsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxOQorCXZzaHIudTY0CWQyNSxkMjAsIzM0CisJdnNsaS42NAlkMjQsZDIwLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIwLCMzOQorCXZhZGQuaTY0CWQyOCxkMTIKKwl2c2xpLjY0CWQyNSxkMjAsIzMwCisJdmVvcglkMzAsZDIwLGQyMQorCXZzbGkuNjQJZDI2LGQyMCwjMjUKKwl2ZW9yCWQxOSxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMixkMjEJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE5LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIzLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxOSxkMzAKKwl2c2hyLnU2NAlkMjQsZDIzLCMxNAlAIDEzCisjaWYgMTM8MTYKKwl2bGQxLjY0CXtkMTN9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMjMsIzE4CisjaWYgMTM+MAorCXZhZGQuaTY0CWQxOSxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIzLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIzLCM1MAorCXZzbGkuNjQJZDI1LGQyMywjNDYKKwl2bW92CWQyOSxkMjMKKwl2c2xpLjY0CWQyNixkMjMsIzIzCisjaWYgMTM8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDEzLGQxMworI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE2LGQxNwkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE5LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTgKKwl2c2hyLnU2NAlkMjUsZDE5LCMzNAorCXZzbGkuNjQJZDI0LGQxOSwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxOSwjMzkKKwl2YWRkLmk2NAlkMjgsZDEzCisJdnNsaS42NAlkMjUsZDE5LCMzMAorCXZlb3IJZDMwLGQxOSxkMjAKKwl2c2xpLjY0CWQyNixkMTksIzI1CisJdmVvcglkMTgsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjEsZDIwCQlAIE1haihhLGIsYykKKwl2ZW9yCWQxOCxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMixkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTgsZDMwCisJdnNoci51NjQJZDI0LGQyMiwjMTQJQCAxNAorI2lmIDE0PDE2CisJdmxkMS42NAl7ZDE0fSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIyLCMxOAorI2lmIDE0PjAKKwl2YWRkLmk2NAlkMTgsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMiwjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMiwjNTAKKwl2c2xpLjY0CWQyNSxkMjIsIzQ2CisJdm1vdglkMjksZDIyCisJdnNsaS42NAlkMjYsZDIyLCMyMworI2lmIDE0PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQxNCxkMTQKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMyxkMTYJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxOCwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE3CisJdnNoci51NjQJZDI1LGQxOCwjMzQKKwl2c2xpLjY0CWQyNCxkMTgsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTgsIzM5CisJdmFkZC5pNjQJZDI4LGQxNAorCXZzbGkuNjQJZDI1LGQxOCwjMzAKKwl2ZW9yCWQzMCxkMTgsZDE5CisJdnNsaS42NAlkMjYsZDE4LCMyNQorCXZlb3IJZDE3LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIwLGQxOQkJQCBNYWooYSxiLGMpCisJdmVvcglkMTcsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjEsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE3LGQzMAorCXZzaHIudTY0CWQyNCxkMjEsIzE0CUAgMTUKKyNpZiAxNTwxNgorCXZsZDEuNjQJe2QxNX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMSwjMTgKKyNpZiAxNT4wCisJdmFkZC5pNjQJZDE3LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjEsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjEsIzUwCisJdnNsaS42NAlkMjUsZDIxLCM0NgorCXZtb3YJZDI5LGQyMQorCXZzbGkuNjQJZDI2LGQyMSwjMjMKKyNpZiAxNTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMTUsZDE1CisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjIsZDIzCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTcsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxNgorCXZzaHIudTY0CWQyNSxkMTcsIzM0CisJdnNsaS42NAlkMjQsZDE3LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE3LCMzOQorCXZhZGQuaTY0CWQyOCxkMTUKKwl2c2xpLjY0CWQyNSxkMTcsIzMwCisJdmVvcglkMzAsZDE3LGQxOAorCXZzbGkuNjQJZDI2LGQxNywjMjUKKwl2ZW9yCWQxNixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOSxkMTgJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE2LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIwLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxNixkMzAKKwltb3YJcjEyLCM0CitMMTZfNzlfbmVvbjoKKwlzdWJzCXIxMiwjMQorCXZzaHIudTY0CXExMixxNywjMTkKKwl2c2hyLnU2NAlxMTMscTcsIzYxCisJdmFkZC5pNjQJZDE2LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTcsIzYKKwl2c2xpLjY0CXExMixxNywjNDUKKwl2ZXh0LjgJcTE0LHEwLHExLCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTcsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXEwLHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTQscTUsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDIwLCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMCxxMTQKKwl2c2hyLnU2NAlkMjUsZDIwLCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMjAsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXEwLHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIwLCM1MAorCXZzbGkuNjQJZDI1LGQyMCwjNDYKKwl2bW92CWQyOSxkMjAKKwl2c2xpLjY0CWQyNixkMjAsIzIzCisjaWYgMTY8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIxLGQyMgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE2LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjMKKwl2c2hyLnU2NAlkMjUsZDE2LCMzNAorCXZzbGkuNjQJZDI0LGQxNiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxNiwjMzkKKwl2YWRkLmk2NAlkMjgsZDAKKwl2c2xpLjY0CWQyNSxkMTYsIzMwCisJdmVvcglkMzAsZDE2LGQxNworCXZzbGkuNjQJZDI2LGQxNiwjMjUKKwl2ZW9yCWQyMyxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOCxkMTcJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIzLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE5LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMyxkMzAKKwl2c2hyLnU2NAlkMjQsZDE5LCMxNAlAIDE3CisjaWYgMTc8MTYKKwl2bGQxLjY0CXtkMX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxOSwjMTgKKyNpZiAxNz4wCisJdmFkZC5pNjQJZDIzLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTksIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTksIzUwCisJdnNsaS42NAlkMjUsZDE5LCM0NgorCXZtb3YJZDI5LGQxOQorCXZzbGkuNjQJZDI2LGQxOSwjMjMKKyNpZiAxNzwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjAsZDIxCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjMsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQyMgorCXZzaHIudTY0CWQyNSxkMjMsIzM0CisJdnNsaS42NAlkMjQsZDIzLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIzLCMzOQorCXZhZGQuaTY0CWQyOCxkMQorCXZzbGkuNjQJZDI1LGQyMywjMzAKKwl2ZW9yCWQzMCxkMjMsZDE2CisJdnNsaS42NAlkMjYsZDIzLCMyNQorCXZlb3IJZDIyLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE3LGQxNgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjIsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTgsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIyLGQzMAorCXZzaHIudTY0CXExMixxMCwjMTkKKwl2c2hyLnU2NAlxMTMscTAsIzYxCisJdmFkZC5pNjQJZDIyLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTAsIzYKKwl2c2xpLjY0CXExMixxMCwjNDUKKwl2ZXh0LjgJcTE0LHExLHEyLCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTAsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXExLHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTUscTYsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDE4LCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMSxxMTQKKwl2c2hyLnU2NAlkMjUsZDE4LCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMTgsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXExLHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE4LCM1MAorCXZzbGkuNjQJZDI1LGQxOCwjNDYKKwl2bW92CWQyOSxkMTgKKwl2c2xpLjY0CWQyNixkMTgsIzIzCisjaWYgMTg8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE5LGQyMAkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIyLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjEKKwl2c2hyLnU2NAlkMjUsZDIyLCMzNAorCXZzbGkuNjQJZDI0LGQyMiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMiwjMzkKKwl2YWRkLmk2NAlkMjgsZDIKKwl2c2xpLjY0CWQyNSxkMjIsIzMwCisJdmVvcglkMzAsZDIyLGQyMworCXZzbGkuNjQJZDI2LGQyMiwjMjUKKwl2ZW9yCWQyMSxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxNixkMjMJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIxLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE3LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMSxkMzAKKwl2c2hyLnU2NAlkMjQsZDE3LCMxNAlAIDE5CisjaWYgMTk8MTYKKwl2bGQxLjY0CXtkM30sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxNywjMTgKKyNpZiAxOT4wCisJdmFkZC5pNjQJZDIxLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTcsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTcsIzUwCisJdnNsaS42NAlkMjUsZDE3LCM0NgorCXZtb3YJZDI5LGQxNworCXZzbGkuNjQJZDI2LGQxNywjMjMKKyNpZiAxOTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTgsZDE5CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjEsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQyMAorCXZzaHIudTY0CWQyNSxkMjEsIzM0CisJdnNsaS42NAlkMjQsZDIxLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIxLCMzOQorCXZhZGQuaTY0CWQyOCxkMworCXZzbGkuNjQJZDI1LGQyMSwjMzAKKwl2ZW9yCWQzMCxkMjEsZDIyCisJdnNsaS42NAlkMjYsZDIxLCMyNQorCXZlb3IJZDIwLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIzLGQyMgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjAsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTYsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIwLGQzMAorCXZzaHIudTY0CXExMixxMSwjMTkKKwl2c2hyLnU2NAlxMTMscTEsIzYxCisJdmFkZC5pNjQJZDIwLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTEsIzYKKwl2c2xpLjY0CXExMixxMSwjNDUKKwl2ZXh0LjgJcTE0LHEyLHEzLCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTEsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXEyLHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTYscTcsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDE2LCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMixxMTQKKwl2c2hyLnU2NAlkMjUsZDE2LCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMTYsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXEyLHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE2LCM1MAorCXZzbGkuNjQJZDI1LGQxNiwjNDYKKwl2bW92CWQyOSxkMTYKKwl2c2xpLjY0CWQyNixkMTYsIzIzCisjaWYgMjA8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE3LGQxOAkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIwLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTkKKwl2c2hyLnU2NAlkMjUsZDIwLCMzNAorCXZzbGkuNjQJZDI0LGQyMCwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMCwjMzkKKwl2YWRkLmk2NAlkMjgsZDQKKwl2c2xpLjY0CWQyNSxkMjAsIzMwCisJdmVvcglkMzAsZDIwLGQyMQorCXZzbGkuNjQJZDI2LGQyMCwjMjUKKwl2ZW9yCWQxOSxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMixkMjEJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE5LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIzLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxOSxkMzAKKwl2c2hyLnU2NAlkMjQsZDIzLCMxNAlAIDIxCisjaWYgMjE8MTYKKwl2bGQxLjY0CXtkNX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMywjMTgKKyNpZiAyMT4wCisJdmFkZC5pNjQJZDE5LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjMsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjMsIzUwCisJdnNsaS42NAlkMjUsZDIzLCM0NgorCXZtb3YJZDI5LGQyMworCXZzbGkuNjQJZDI2LGQyMywjMjMKKyNpZiAyMTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTYsZDE3CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTksIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxOAorCXZzaHIudTY0CWQyNSxkMTksIzM0CisJdnNsaS42NAlkMjQsZDE5LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE5LCMzOQorCXZhZGQuaTY0CWQyOCxkNQorCXZzbGkuNjQJZDI1LGQxOSwjMzAKKwl2ZW9yCWQzMCxkMTksZDIwCisJdnNsaS42NAlkMjYsZDE5LCMyNQorCXZlb3IJZDE4LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIxLGQyMAkJQCBNYWooYSxiLGMpCisJdmVvcglkMTgsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjIsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE4LGQzMAorCXZzaHIudTY0CXExMixxMiwjMTkKKwl2c2hyLnU2NAlxMTMscTIsIzYxCisJdmFkZC5pNjQJZDE4LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTIsIzYKKwl2c2xpLjY0CXExMixxMiwjNDUKKwl2ZXh0LjgJcTE0LHEzLHE0LCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTIsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXEzLHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTcscTAsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDIyLCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMyxxMTQKKwl2c2hyLnU2NAlkMjUsZDIyLCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMjIsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXEzLHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIyLCM1MAorCXZzbGkuNjQJZDI1LGQyMiwjNDYKKwl2bW92CWQyOSxkMjIKKwl2c2xpLjY0CWQyNixkMjIsIzIzCisjaWYgMjI8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIzLGQxNgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE4LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTcKKwl2c2hyLnU2NAlkMjUsZDE4LCMzNAorCXZzbGkuNjQJZDI0LGQxOCwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxOCwjMzkKKwl2YWRkLmk2NAlkMjgsZDYKKwl2c2xpLjY0CWQyNSxkMTgsIzMwCisJdmVvcglkMzAsZDE4LGQxOQorCXZzbGkuNjQJZDI2LGQxOCwjMjUKKwl2ZW9yCWQxNyxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMCxkMTkJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE3LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIxLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxNyxkMzAKKwl2c2hyLnU2NAlkMjQsZDIxLCMxNAlAIDIzCisjaWYgMjM8MTYKKwl2bGQxLjY0CXtkN30sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMSwjMTgKKyNpZiAyMz4wCisJdmFkZC5pNjQJZDE3LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjEsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjEsIzUwCisJdnNsaS42NAlkMjUsZDIxLCM0NgorCXZtb3YJZDI5LGQyMQorCXZzbGkuNjQJZDI2LGQyMSwjMjMKKyNpZiAyMzwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjIsZDIzCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTcsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxNgorCXZzaHIudTY0CWQyNSxkMTcsIzM0CisJdnNsaS42NAlkMjQsZDE3LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE3LCMzOQorCXZhZGQuaTY0CWQyOCxkNworCXZzbGkuNjQJZDI1LGQxNywjMzAKKwl2ZW9yCWQzMCxkMTcsZDE4CisJdnNsaS42NAlkMjYsZDE3LCMyNQorCXZlb3IJZDE2LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE5LGQxOAkJQCBNYWooYSxiLGMpCisJdmVvcglkMTYsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjAsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE2LGQzMAorCXZzaHIudTY0CXExMixxMywjMTkKKwl2c2hyLnU2NAlxMTMscTMsIzYxCisJdmFkZC5pNjQJZDE2LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTMsIzYKKwl2c2xpLjY0CXExMixxMywjNDUKKwl2ZXh0LjgJcTE0LHE0LHE1LCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTMsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXE0LHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTAscTEsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDIwLCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNCxxMTQKKwl2c2hyLnU2NAlkMjUsZDIwLCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMjAsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXE0LHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIwLCM1MAorCXZzbGkuNjQJZDI1LGQyMCwjNDYKKwl2bW92CWQyOSxkMjAKKwl2c2xpLjY0CWQyNixkMjAsIzIzCisjaWYgMjQ8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIxLGQyMgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE2LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjMKKwl2c2hyLnU2NAlkMjUsZDE2LCMzNAorCXZzbGkuNjQJZDI0LGQxNiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxNiwjMzkKKwl2YWRkLmk2NAlkMjgsZDgKKwl2c2xpLjY0CWQyNSxkMTYsIzMwCisJdmVvcglkMzAsZDE2LGQxNworCXZzbGkuNjQJZDI2LGQxNiwjMjUKKwl2ZW9yCWQyMyxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOCxkMTcJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIzLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE5LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMyxkMzAKKwl2c2hyLnU2NAlkMjQsZDE5LCMxNAlAIDI1CisjaWYgMjU8MTYKKwl2bGQxLjY0CXtkOX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxOSwjMTgKKyNpZiAyNT4wCisJdmFkZC5pNjQJZDIzLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTksIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTksIzUwCisJdnNsaS42NAlkMjUsZDE5LCM0NgorCXZtb3YJZDI5LGQxOQorCXZzbGkuNjQJZDI2LGQxOSwjMjMKKyNpZiAyNTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjAsZDIxCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjMsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQyMgorCXZzaHIudTY0CWQyNSxkMjMsIzM0CisJdnNsaS42NAlkMjQsZDIzLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIzLCMzOQorCXZhZGQuaTY0CWQyOCxkOQorCXZzbGkuNjQJZDI1LGQyMywjMzAKKwl2ZW9yCWQzMCxkMjMsZDE2CisJdnNsaS42NAlkMjYsZDIzLCMyNQorCXZlb3IJZDIyLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE3LGQxNgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjIsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTgsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIyLGQzMAorCXZzaHIudTY0CXExMixxNCwjMTkKKwl2c2hyLnU2NAlxMTMscTQsIzYxCisJdmFkZC5pNjQJZDIyLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTQsIzYKKwl2c2xpLjY0CXExMixxNCwjNDUKKwl2ZXh0LjgJcTE0LHE1LHE2LCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTQsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXE1LHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTEscTIsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDE4LCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNSxxMTQKKwl2c2hyLnU2NAlkMjUsZDE4LCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMTgsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXE1LHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE4LCM1MAorCXZzbGkuNjQJZDI1LGQxOCwjNDYKKwl2bW92CWQyOSxkMTgKKwl2c2xpLjY0CWQyNixkMTgsIzIzCisjaWYgMjY8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE5LGQyMAkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIyLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjEKKwl2c2hyLnU2NAlkMjUsZDIyLCMzNAorCXZzbGkuNjQJZDI0LGQyMiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMiwjMzkKKwl2YWRkLmk2NAlkMjgsZDEwCisJdnNsaS42NAlkMjUsZDIyLCMzMAorCXZlb3IJZDMwLGQyMixkMjMKKwl2c2xpLjY0CWQyNixkMjIsIzI1CisJdmVvcglkMjEsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTYsZDIzCQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxNyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjEsZDMwCisJdnNoci51NjQJZDI0LGQxNywjMTQJQCAyNworI2lmIDI3PDE2CisJdmxkMS42NAl7ZDExfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDE3LCMxOAorI2lmIDI3PjAKKwl2YWRkLmk2NAlkMjEsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQxNywjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxNywjNTAKKwl2c2xpLjY0CWQyNSxkMTcsIzQ2CisJdm1vdglkMjksZDE3CisJdnNsaS42NAlkMjYsZDE3LCMyMworI2lmIDI3PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxOCxkMTkJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMSwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIwCisJdnNoci51NjQJZDI1LGQyMSwjMzQKKwl2c2xpLjY0CWQyNCxkMjEsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjEsIzM5CisJdmFkZC5pNjQJZDI4LGQxMQorCXZzbGkuNjQJZDI1LGQyMSwjMzAKKwl2ZW9yCWQzMCxkMjEsZDIyCisJdnNsaS42NAlkMjYsZDIxLCMyNQorCXZlb3IJZDIwLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIzLGQyMgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjAsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTYsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIwLGQzMAorCXZzaHIudTY0CXExMixxNSwjMTkKKwl2c2hyLnU2NAlxMTMscTUsIzYxCisJdmFkZC5pNjQJZDIwLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTUsIzYKKwl2c2xpLjY0CXExMixxNSwjNDUKKwl2ZXh0LjgJcTE0LHE2LHE3LCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTUsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXE2LHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTIscTMsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDE2LCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNixxMTQKKwl2c2hyLnU2NAlkMjUsZDE2LCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMTYsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXE2LHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE2LCM1MAorCXZzbGkuNjQJZDI1LGQxNiwjNDYKKwl2bW92CWQyOSxkMTYKKwl2c2xpLjY0CWQyNixkMTYsIzIzCisjaWYgMjg8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE3LGQxOAkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIwLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTkKKwl2c2hyLnU2NAlkMjUsZDIwLCMzNAorCXZzbGkuNjQJZDI0LGQyMCwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMCwjMzkKKwl2YWRkLmk2NAlkMjgsZDEyCisJdnNsaS42NAlkMjUsZDIwLCMzMAorCXZlb3IJZDMwLGQyMCxkMjEKKwl2c2xpLjY0CWQyNixkMjAsIzI1CisJdmVvcglkMTksZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjIsZDIxCQlAIE1haihhLGIsYykKKwl2ZW9yCWQxOSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTksZDMwCisJdnNoci51NjQJZDI0LGQyMywjMTQJQCAyOQorI2lmIDI5PDE2CisJdmxkMS42NAl7ZDEzfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIzLCMxOAorI2lmIDI5PjAKKwl2YWRkLmk2NAlkMTksZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMywjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMywjNTAKKwl2c2xpLjY0CWQyNSxkMjMsIzQ2CisJdm1vdglkMjksZDIzCisJdnNsaS42NAlkMjYsZDIzLCMyMworI2lmIDI5PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxNixkMTcJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxOSwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE4CisJdnNoci51NjQJZDI1LGQxOSwjMzQKKwl2c2xpLjY0CWQyNCxkMTksIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTksIzM5CisJdmFkZC5pNjQJZDI4LGQxMworCXZzbGkuNjQJZDI1LGQxOSwjMzAKKwl2ZW9yCWQzMCxkMTksZDIwCisJdnNsaS42NAlkMjYsZDE5LCMyNQorCXZlb3IJZDE4LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIxLGQyMAkJQCBNYWooYSxiLGMpCisJdmVvcglkMTgsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjIsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE4LGQzMAorCXZzaHIudTY0CXExMixxNiwjMTkKKwl2c2hyLnU2NAlxMTMscTYsIzYxCisJdmFkZC5pNjQJZDE4LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKwl2c2hyLnU2NAlxMTUscTYsIzYKKwl2c2xpLjY0CXExMixxNiwjNDUKKwl2ZXh0LjgJcTE0LHE3LHEwLCM4CUAgWFtpKzFdCisJdnNsaS42NAlxMTMscTYsIzMKKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlxMTIscTE0LCMxCisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWExKFhbaSsxNF0pCisJdnNoci51NjQJcTEzLHExNCwjOAorCXZhZGQuaTY0CXE3LHExNQorCXZzaHIudTY0CXExNSxxMTQsIzcKKwl2c2xpLjY0CXExMixxMTQsIzYzCisJdnNsaS42NAlxMTMscTE0LCM1NgorCXZleHQuOAlxMTQscTMscTQsIzgJQCBYW2krOV0KKwl2ZW9yCXExNSxxMTIKKwl2c2hyLnU2NAlkMjQsZDIyLCMxNAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNyxxMTQKKwl2c2hyLnU2NAlkMjUsZDIyLCMxOAkJQCBmcm9tIE5FT05fMDBfMTUKKwl2ZW9yCXExNSxxMTMJCQkJQCBzaWdtYTAoWFtpKzFdKQorCXZzaHIudTY0CWQyNixkMjIsIzQxCQlAIGZyb20gTkVPTl8wMF8xNQorCXZhZGQuaTY0CXE3LHExNQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIyLCM1MAorCXZzbGkuNjQJZDI1LGQyMiwjNDYKKwl2bW92CWQyOSxkMjIKKwl2c2xpLjY0CWQyNixkMjIsIzIzCisjaWYgMzA8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIzLGQxNgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE4LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTcKKwl2c2hyLnU2NAlkMjUsZDE4LCMzNAorCXZzbGkuNjQJZDI0LGQxOCwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxOCwjMzkKKwl2YWRkLmk2NAlkMjgsZDE0CisJdnNsaS42NAlkMjUsZDE4LCMzMAorCXZlb3IJZDMwLGQxOCxkMTkKKwl2c2xpLjY0CWQyNixkMTgsIzI1CisJdmVvcglkMTcsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjAsZDE5CQlAIE1haihhLGIsYykKKwl2ZW9yCWQxNyxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMSxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTcsZDMwCisJdnNoci51NjQJZDI0LGQyMSwjMTQJQCAzMQorI2lmIDMxPDE2CisJdmxkMS42NAl7ZDE1fSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIxLCMxOAorI2lmIDMxPjAKKwl2YWRkLmk2NAlkMTcsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMSwjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMSwjNTAKKwl2c2xpLjY0CWQyNSxkMjEsIzQ2CisJdm1vdglkMjksZDIxCisJdnNsaS42NAlkMjYsZDIxLCMyMworI2lmIDMxPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMixkMjMJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxNywjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE2CisJdnNoci51NjQJZDI1LGQxNywjMzQKKwl2c2xpLjY0CWQyNCxkMTcsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTcsIzM5CisJdmFkZC5pNjQJZDI4LGQxNQorCXZzbGkuNjQJZDI1LGQxNywjMzAKKwl2ZW9yCWQzMCxkMTcsZDE4CisJdnNsaS42NAlkMjYsZDE3LCMyNQorCXZlb3IJZDE2LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE5LGQxOAkJQCBNYWooYSxiLGMpCisJdmVvcglkMTYsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjAsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE2LGQzMAorCWJuZQlMMTZfNzlfbmVvbgorCisJdmFkZC5pNjQJZDE2LGQzMAkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorCXZsZG1pYQlyMCx7ZDI0LGQyNSxkMjYsZDI3LGQyOCxkMjksZDMwLGQzMX0JQCBsb2FkIGNvbnRleHQgdG8gdGVtcAorCXZhZGQuaTY0CXE4LHExMgkJQCB2ZWN0b3JpemVkIGFjY3VtdWxhdGUKKwl2YWRkLmk2NAlxOSxxMTMKKwl2YWRkLmk2NAlxMTAscTE0CisJdmFkZC5pNjQJcTExLHExNQorCXZzdG1pYQlyMCx7ZDE2LGQxNyxkMTgsZDE5LGQyMCxkMjEsZDIyLGQyM30JQCBzYXZlIGNvbnRleHQKKwl0ZXEJcjEscjIKKwlzdWIJcjMsIzY0MAlAIHJld2luZCBLNTEyCisJYm5lCUxvb3BfbmVvbgorCisJVkZQX0FCSV9QT1AKKwlieAlscgkJCQlAIC53b3JkCTB4ZTEyZmZmMWUKKworI2VuZGlmCisuYnl0ZQk4Myw3Miw2NSw1Myw0OSw1MCwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3LDExMCwxMTUsMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Miw0Nyw3OCw2OSw3OSw3OCw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03ICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisuY29tbQlfT1BFTlNTTF9hcm1jYXBfUCw0Cisubm9uX2xhenlfc3ltYm9sX3BvaW50ZXIKK09QRU5TU0xfYXJtY2FwX1A6CisuaW5kaXJlY3Rfc3ltYm9sCV9PUEVOU1NMX2FybWNhcF9QCisubG9uZwkwCisucHJpdmF0ZV9leHRlcm4JX09QRU5TU0xfYXJtY2FwX1AKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9jaGFjaGEvY2hhY2hhLWFybXY4LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2NoYWNoYS9jaGFjaGEtYXJtdjguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmY2YmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9jaGFjaGEvY2hhY2hhLWFybXY4LlMKQEAgLTAsMCArMSwxOTcxIEBACisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKKy50ZXh0CisKKworCisuYWxpZ24JNQorLkxzaWdtYToKKy5xdWFkCTB4MzMyMDY0NmU2MTcwNzg2NSwweDZiMjA2NTc0Nzk2MjJkMzIJCS8vIGVuZGlhbi1uZXV0cmFsCisuTG9uZToKKy5sb25nCTEsMCwwLDAKKy5MT1BFTlNTTF9hcm1jYXBfUDoKKyNpZmRlZglfX0lMUDMyX18KKy5sb25nCU9QRU5TU0xfYXJtY2FwX1AtLgorI2Vsc2UKKy5xdWFkCU9QRU5TU0xfYXJtY2FwX1AtLgorI2VuZGlmCisuYnl0ZQk2NywxMDQsOTcsNjcsMTA0LDk3LDUwLDQ4LDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Niw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorCisuZ2xvYmwJQ2hhQ2hhMjBfY3RyMzIKKy5oaWRkZW4JQ2hhQ2hhMjBfY3RyMzIKKy50eXBlCUNoYUNoYTIwX2N0cjMyLCVmdW5jdGlvbgorLmFsaWduCTUKK0NoYUNoYTIwX2N0cjMyOgorCWNiegl4MiwuTGFib3J0CisJYWRyCXg1LC5MT1BFTlNTTF9hcm1jYXBfUAorCWNtcAl4MiwjMTkyCisJYi5sbwkuTHNob3J0CisjaWZkZWYJX19JTFAzMl9fCisJbGRyc3cJeDYsW3g1XQorI2Vsc2UKKwlsZHIJeDYsW3g1XQorI2VuZGlmCisJbGRyCXcxNyxbeDYseDVdCisJdHN0CXcxNywjQVJNVjdfTkVPTgorCWIubmUJQ2hhQ2hhMjBfbmVvbgorCisuTHNob3J0OgorCXN0cAl4MjkseDMwLFtzcCwjLTk2XSEKKwlhZGQJeDI5LHNwLCMwCisKKwlhZHIJeDUsLkxzaWdtYQorCXN0cAl4MTkseDIwLFtzcCwjMTZdCisJc3RwCXgyMSx4MjIsW3NwLCMzMl0KKwlzdHAJeDIzLHgyNCxbc3AsIzQ4XQorCXN0cAl4MjUseDI2LFtzcCwjNjRdCisJc3RwCXgyNyx4MjgsW3NwLCM4MF0KKwlzdWIJc3Asc3AsIzY0CisKKwlsZHAJeDIyLHgyMyxbeDVdCQkvLyBsb2FkIHNpZ21hCisJbGRwCXgyNCx4MjUsW3gzXQkJLy8gbG9hZCBrZXkKKwlsZHAJeDI2LHgyNyxbeDMsIzE2XQorCWxkcAl4MjgseDMwLFt4NF0JCS8vIGxvYWQgY291bnRlcgorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4MjQseDI0LCMzMgorCXJvcgl4MjUseDI1LCMzMgorCXJvcgl4MjYseDI2LCMzMgorCXJvcgl4MjcseDI3LCMzMgorCXJvcgl4MjgseDI4LCMzMgorCXJvcgl4MzAseDMwLCMzMgorI2VuZGlmCisKKy5Mb29wX291dGVyOgorCW1vdgl3NSx3MjIJCQkvLyB1bnBhY2sga2V5IGJsb2NrCisJbHNyCXg2LHgyMiwjMzIKKwltb3YJdzcsdzIzCisJbHNyCXg4LHgyMywjMzIKKwltb3YJdzksdzI0CisJbHNyCXgxMCx4MjQsIzMyCisJbW92CXcxMSx3MjUKKwlsc3IJeDEyLHgyNSwjMzIKKwltb3YJdzEzLHcyNgorCWxzcgl4MTQseDI2LCMzMgorCW1vdgl3MTUsdzI3CisJbHNyCXgxNix4MjcsIzMyCisJbW92CXcxNyx3MjgKKwlsc3IJeDE5LHgyOCwjMzIKKwltb3YJdzIwLHczMAorCWxzcgl4MjEseDMwLCMzMgorCisJbW92CXg0LCMxMAorCXN1YnMJeDIseDIsIzY0CisuTG9vcDoKKwlzdWIJeDQseDQsIzEKKwlhZGQJdzUsdzUsdzkKKwlhZGQJdzYsdzYsdzEwCisJYWRkCXc3LHc3LHcxMQorCWFkZAl3OCx3OCx3MTIKKwllb3IJdzE3LHcxNyx3NQorCWVvcgl3MTksdzE5LHc2CisJZW9yCXcyMCx3MjAsdzcKKwllb3IJdzIxLHcyMSx3OAorCXJvcgl3MTcsdzE3LCMxNgorCXJvcgl3MTksdzE5LCMxNgorCXJvcgl3MjAsdzIwLCMxNgorCXJvcgl3MjEsdzIxLCMxNgorCWFkZAl3MTMsdzEzLHcxNworCWFkZAl3MTQsdzE0LHcxOQorCWFkZAl3MTUsdzE1LHcyMAorCWFkZAl3MTYsdzE2LHcyMQorCWVvcgl3OSx3OSx3MTMKKwllb3IJdzEwLHcxMCx3MTQKKwllb3IJdzExLHcxMSx3MTUKKwllb3IJdzEyLHcxMix3MTYKKwlyb3IJdzksdzksIzIwCisJcm9yCXcxMCx3MTAsIzIwCisJcm9yCXcxMSx3MTEsIzIwCisJcm9yCXcxMix3MTIsIzIwCisJYWRkCXc1LHc1LHc5CisJYWRkCXc2LHc2LHcxMAorCWFkZAl3Nyx3Nyx3MTEKKwlhZGQJdzgsdzgsdzEyCisJZW9yCXcxNyx3MTcsdzUKKwllb3IJdzE5LHcxOSx3NgorCWVvcgl3MjAsdzIwLHc3CisJZW9yCXcyMSx3MjEsdzgKKwlyb3IJdzE3LHcxNywjMjQKKwlyb3IJdzE5LHcxOSwjMjQKKwlyb3IJdzIwLHcyMCwjMjQKKwlyb3IJdzIxLHcyMSwjMjQKKwlhZGQJdzEzLHcxMyx3MTcKKwlhZGQJdzE0LHcxNCx3MTkKKwlhZGQJdzE1LHcxNSx3MjAKKwlhZGQJdzE2LHcxNix3MjEKKwllb3IJdzksdzksdzEzCisJZW9yCXcxMCx3MTAsdzE0CisJZW9yCXcxMSx3MTEsdzE1CisJZW9yCXcxMix3MTIsdzE2CisJcm9yCXc5LHc5LCMyNQorCXJvcgl3MTAsdzEwLCMyNQorCXJvcgl3MTEsdzExLCMyNQorCXJvcgl3MTIsdzEyLCMyNQorCWFkZAl3NSx3NSx3MTAKKwlhZGQJdzYsdzYsdzExCisJYWRkCXc3LHc3LHcxMgorCWFkZAl3OCx3OCx3OQorCWVvcgl3MjEsdzIxLHc1CisJZW9yCXcxNyx3MTcsdzYKKwllb3IJdzE5LHcxOSx3NworCWVvcgl3MjAsdzIwLHc4CisJcm9yCXcyMSx3MjEsIzE2CisJcm9yCXcxNyx3MTcsIzE2CisJcm9yCXcxOSx3MTksIzE2CisJcm9yCXcyMCx3MjAsIzE2CisJYWRkCXcxNSx3MTUsdzIxCisJYWRkCXcxNix3MTYsdzE3CisJYWRkCXcxMyx3MTMsdzE5CisJYWRkCXcxNCx3MTQsdzIwCisJZW9yCXcxMCx3MTAsdzE1CisJZW9yCXcxMSx3MTEsdzE2CisJZW9yCXcxMix3MTIsdzEzCisJZW9yCXc5LHc5LHcxNAorCXJvcgl3MTAsdzEwLCMyMAorCXJvcgl3MTEsdzExLCMyMAorCXJvcgl3MTIsdzEyLCMyMAorCXJvcgl3OSx3OSwjMjAKKwlhZGQJdzUsdzUsdzEwCisJYWRkCXc2LHc2LHcxMQorCWFkZAl3Nyx3Nyx3MTIKKwlhZGQJdzgsdzgsdzkKKwllb3IJdzIxLHcyMSx3NQorCWVvcgl3MTcsdzE3LHc2CisJZW9yCXcxOSx3MTksdzcKKwllb3IJdzIwLHcyMCx3OAorCXJvcgl3MjEsdzIxLCMyNAorCXJvcgl3MTcsdzE3LCMyNAorCXJvcgl3MTksdzE5LCMyNAorCXJvcgl3MjAsdzIwLCMyNAorCWFkZAl3MTUsdzE1LHcyMQorCWFkZAl3MTYsdzE2LHcxNworCWFkZAl3MTMsdzEzLHcxOQorCWFkZAl3MTQsdzE0LHcyMAorCWVvcgl3MTAsdzEwLHcxNQorCWVvcgl3MTEsdzExLHcxNgorCWVvcgl3MTIsdzEyLHcxMworCWVvcgl3OSx3OSx3MTQKKwlyb3IJdzEwLHcxMCwjMjUKKwlyb3IJdzExLHcxMSwjMjUKKwlyb3IJdzEyLHcxMiwjMjUKKwlyb3IJdzksdzksIzI1CisJY2Juegl4NCwuTG9vcAorCisJYWRkCXc1LHc1LHcyMgkJLy8gYWNjdW11bGF0ZSBrZXkgYmxvY2sKKwlhZGQJeDYseDYseDIyLGxzciMzMgorCWFkZAl3Nyx3Nyx3MjMKKwlhZGQJeDgseDgseDIzLGxzciMzMgorCWFkZAl3OSx3OSx3MjQKKwlhZGQJeDEwLHgxMCx4MjQsbHNyIzMyCisJYWRkCXcxMSx3MTEsdzI1CisJYWRkCXgxMix4MTIseDI1LGxzciMzMgorCWFkZAl3MTMsdzEzLHcyNgorCWFkZAl4MTQseDE0LHgyNixsc3IjMzIKKwlhZGQJdzE1LHcxNSx3MjcKKwlhZGQJeDE2LHgxNix4MjcsbHNyIzMyCisJYWRkCXcxNyx3MTcsdzI4CisJYWRkCXgxOSx4MTkseDI4LGxzciMzMgorCWFkZAl3MjAsdzIwLHczMAorCWFkZAl4MjEseDIxLHgzMCxsc3IjMzIKKworCWIubG8JLkx0YWlsCisKKwlhZGQJeDUseDUseDYsbHNsIzMyCS8vIHBhY2sKKwlhZGQJeDcseDcseDgsbHNsIzMyCisJbGRwCXg2LHg4LFt4MSwjMF0JCS8vIGxvYWQgaW5wdXQKKwlhZGQJeDkseDkseDEwLGxzbCMzMgorCWFkZAl4MTEseDExLHgxMixsc2wjMzIKKwlsZHAJeDEwLHgxMixbeDEsIzE2XQorCWFkZAl4MTMseDEzLHgxNCxsc2wjMzIKKwlhZGQJeDE1LHgxNSx4MTYsbHNsIzMyCisJbGRwCXgxNCx4MTYsW3gxLCMzMl0KKwlhZGQJeDE3LHgxNyx4MTksbHNsIzMyCisJYWRkCXgyMCx4MjAseDIxLGxzbCMzMgorCWxkcAl4MTkseDIxLFt4MSwjNDhdCisJYWRkCXgxLHgxLCM2NAorI2lmZGVmCV9fQVJNRUJfXworCXJldgl4NSx4NQorCXJldgl4Nyx4NworCXJldgl4OSx4OQorCXJldgl4MTEseDExCisJcmV2CXgxMyx4MTMKKwlyZXYJeDE1LHgxNQorCXJldgl4MTcseDE3CisJcmV2CXgyMCx4MjAKKyNlbmRpZgorCWVvcgl4NSx4NSx4NgorCWVvcgl4Nyx4Nyx4OAorCWVvcgl4OSx4OSx4MTAKKwllb3IJeDExLHgxMSx4MTIKKwllb3IJeDEzLHgxMyx4MTQKKwllb3IJeDE1LHgxNSx4MTYKKwllb3IJeDE3LHgxNyx4MTkKKwllb3IJeDIwLHgyMCx4MjEKKworCXN0cAl4NSx4NyxbeDAsIzBdCQkvLyBzdG9yZSBvdXRwdXQKKwlhZGQJeDI4LHgyOCwjMQkJCS8vIGluY3JlbWVudCBjb3VudGVyCisJc3RwCXg5LHgxMSxbeDAsIzE2XQorCXN0cAl4MTMseDE1LFt4MCwjMzJdCisJc3RwCXgxNyx4MjAsW3gwLCM0OF0KKwlhZGQJeDAseDAsIzY0CisKKwliLmhpCS5Mb29wX291dGVyCisKKwlsZHAJeDE5LHgyMCxbeDI5LCMxNl0KKwlhZGQJc3Asc3AsIzY0CisJbGRwCXgyMSx4MjIsW3gyOSwjMzJdCisJbGRwCXgyMyx4MjQsW3gyOSwjNDhdCisJbGRwCXgyNSx4MjYsW3gyOSwjNjRdCisJbGRwCXgyNyx4MjgsW3gyOSwjODBdCisJbGRwCXgyOSx4MzAsW3NwXSwjOTYKKy5MYWJvcnQ6CisJcmV0CisKKy5hbGlnbgk0CisuTHRhaWw6CisJYWRkCXgyLHgyLCM2NAorLkxlc3NfdGhhbl82NDoKKwlzdWIJeDAseDAsIzEKKwlhZGQJeDEseDEseDIKKwlhZGQJeDAseDAseDIKKwlhZGQJeDQsc3AseDIKKwluZWcJeDIseDIKKworCWFkZAl4NSx4NSx4Nixsc2wjMzIJLy8gcGFjaworCWFkZAl4Nyx4Nyx4OCxsc2wjMzIKKwlhZGQJeDkseDkseDEwLGxzbCMzMgorCWFkZAl4MTEseDExLHgxMixsc2wjMzIKKwlhZGQJeDEzLHgxMyx4MTQsbHNsIzMyCisJYWRkCXgxNSx4MTUseDE2LGxzbCMzMgorCWFkZAl4MTcseDE3LHgxOSxsc2wjMzIKKwlhZGQJeDIwLHgyMCx4MjEsbHNsIzMyCisjaWZkZWYJX19BUk1FQl9fCisJcmV2CXg1LHg1CisJcmV2CXg3LHg3CisJcmV2CXg5LHg5CisJcmV2CXgxMSx4MTEKKwlyZXYJeDEzLHgxMworCXJldgl4MTUseDE1CisJcmV2CXgxNyx4MTcKKwlyZXYJeDIwLHgyMAorI2VuZGlmCisJc3RwCXg1LHg3LFtzcCwjMF0KKwlzdHAJeDkseDExLFtzcCwjMTZdCisJc3RwCXgxMyx4MTUsW3NwLCMzMl0KKwlzdHAJeDE3LHgyMCxbc3AsIzQ4XQorCisuTG9vcF90YWlsOgorCWxkcmIJdzEwLFt4MSx4Ml0KKwlsZHJiCXcxMSxbeDQseDJdCisJYWRkCXgyLHgyLCMxCisJZW9yCXcxMCx3MTAsdzExCisJc3RyYgl3MTAsW3gwLHgyXQorCWNibnoJeDIsLkxvb3BfdGFpbAorCisJc3RwCXh6cix4enIsW3NwLCMwXQorCXN0cAl4enIseHpyLFtzcCwjMTZdCisJc3RwCXh6cix4enIsW3NwLCMzMl0KKwlzdHAJeHpyLHh6cixbc3AsIzQ4XQorCisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM2NAorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcAl4MjkseDMwLFtzcF0sIzk2CisJcmV0Cisuc2l6ZQlDaGFDaGEyMF9jdHIzMiwuLUNoYUNoYTIwX2N0cjMyCisKKy50eXBlCUNoYUNoYTIwX25lb24sJWZ1bmN0aW9uCisuYWxpZ24JNQorQ2hhQ2hhMjBfbmVvbjoKKwlzdHAJeDI5LHgzMCxbc3AsIy05Nl0hCisJYWRkCXgyOSxzcCwjMAorCisJYWRyCXg1LC5Mc2lnbWEKKwlzdHAJeDE5LHgyMCxbc3AsIzE2XQorCXN0cAl4MjEseDIyLFtzcCwjMzJdCisJc3RwCXgyMyx4MjQsW3NwLCM0OF0KKwlzdHAJeDI1LHgyNixbc3AsIzY0XQorCXN0cAl4MjcseDI4LFtzcCwjODBdCisJY21wCXgyLCM1MTIKKwliLmhzCS5MNTEyX29yX21vcmVfbmVvbgorCisJc3ViCXNwLHNwLCM2NAorCisJbGRwCXgyMix4MjMsW3g1XQkJLy8gbG9hZCBzaWdtYQorCWxkMQl7djI0LjRzfSxbeDVdLCMxNgorCWxkcAl4MjQseDI1LFt4M10JCS8vIGxvYWQga2V5CisJbGRwCXgyNix4MjcsW3gzLCMxNl0KKwlsZDEJe3YyNS40cyx2MjYuNHN9LFt4M10KKwlsZHAJeDI4LHgzMCxbeDRdCQkvLyBsb2FkIGNvdW50ZXIKKwlsZDEJe3YyNy40c30sW3g0XQorCWxkMQl7djMxLjRzfSxbeDVdCisjaWZkZWYJX19BUk1FQl9fCisJcmV2NjQJdjI0LjRzLHYyNC40cworCXJvcgl4MjQseDI0LCMzMgorCXJvcgl4MjUseDI1LCMzMgorCXJvcgl4MjYseDI2LCMzMgorCXJvcgl4MjcseDI3LCMzMgorCXJvcgl4MjgseDI4LCMzMgorCXJvcgl4MzAseDMwLCMzMgorI2VuZGlmCisJYWRkCXYyNy40cyx2MjcuNHMsdjMxLjRzCQkvLyArPSAxCisJYWRkCXYyOC40cyx2MjcuNHMsdjMxLjRzCisJYWRkCXYyOS40cyx2MjguNHMsdjMxLjRzCisJc2hsCXYzMS40cyx2MzEuNHMsIzIJCQkvLyAxIC0+IDQKKworLkxvb3Bfb3V0ZXJfbmVvbjoKKwltb3YJdzUsdzIyCQkJLy8gdW5wYWNrIGtleSBibG9jaworCWxzcgl4Nix4MjIsIzMyCisJbW92CXYwLjE2Yix2MjQuMTZiCisJbW92CXc3LHcyMworCWxzcgl4OCx4MjMsIzMyCisJbW92CXY0LjE2Yix2MjQuMTZiCisJbW92CXc5LHcyNAorCWxzcgl4MTAseDI0LCMzMgorCW1vdgl2MTYuMTZiLHYyNC4xNmIKKwltb3YJdzExLHcyNQorCW1vdgl2MS4xNmIsdjI1LjE2YgorCWxzcgl4MTIseDI1LCMzMgorCW1vdgl2NS4xNmIsdjI1LjE2YgorCW1vdgl3MTMsdzI2CisJbW92CXYxNy4xNmIsdjI1LjE2YgorCWxzcgl4MTQseDI2LCMzMgorCW1vdgl2My4xNmIsdjI3LjE2YgorCW1vdgl3MTUsdzI3CisJbW92CXY3LjE2Yix2MjguMTZiCisJbHNyCXgxNix4MjcsIzMyCisJbW92CXYxOS4xNmIsdjI5LjE2YgorCW1vdgl3MTcsdzI4CisJbW92CXYyLjE2Yix2MjYuMTZiCisJbHNyCXgxOSx4MjgsIzMyCisJbW92CXY2LjE2Yix2MjYuMTZiCisJbW92CXcyMCx3MzAKKwltb3YJdjE4LjE2Yix2MjYuMTZiCisJbHNyCXgyMSx4MzAsIzMyCisKKwltb3YJeDQsIzEwCisJc3Vicwl4Mix4MiwjMjU2CisuTG9vcF9uZW9uOgorCXN1Ygl4NCx4NCwjMQorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWFkZAl3NSx3NSx3OQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWFkZAl3Nix3Nix3MTAKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlhZGQJdzcsdzcsdzExCisJZW9yCXYzLjE2Yix2My4xNmIsdjAuMTZiCisJYWRkCXc4LHc4LHcxMgorCWVvcgl2Ny4xNmIsdjcuMTZiLHY0LjE2YgorCWVvcgl3MTcsdzE3LHc1CisJZW9yCXYxOS4xNmIsdjE5LjE2Yix2MTYuMTZiCisJZW9yCXcxOSx3MTksdzYKKwlyZXYzMgl2My44aCx2My44aAorCWVvcgl3MjAsdzIwLHc3CisJcmV2MzIJdjcuOGgsdjcuOGgKKwllb3IJdzIxLHcyMSx3OAorCXJldjMyCXYxOS44aCx2MTkuOGgKKwlyb3IJdzE3LHcxNywjMTYKKwlhZGQJdjIuNHMsdjIuNHMsdjMuNHMKKwlyb3IJdzE5LHcxOSwjMTYKKwlhZGQJdjYuNHMsdjYuNHMsdjcuNHMKKwlyb3IJdzIwLHcyMCwjMTYKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzIxLHcyMSwjMTYKKwllb3IJdjIwLjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXcxMyx3MTMsdzE3CisJZW9yCXYyMS4xNmIsdjUuMTZiLHY2LjE2YgorCWFkZAl3MTQsdzE0LHcxOQorCWVvcgl2MjIuMTZiLHYxNy4xNmIsdjE4LjE2YgorCWFkZAl3MTUsdzE1LHcyMAorCXVzaHIJdjEuNHMsdjIwLjRzLCMyMAorCWFkZAl3MTYsdzE2LHcyMQorCXVzaHIJdjUuNHMsdjIxLjRzLCMyMAorCWVvcgl3OSx3OSx3MTMKKwl1c2hyCXYxNy40cyx2MjIuNHMsIzIwCisJZW9yCXcxMCx3MTAsdzE0CisJc2xpCXYxLjRzLHYyMC40cywjMTIKKwllb3IJdzExLHcxMSx3MTUKKwlzbGkJdjUuNHMsdjIxLjRzLCMxMgorCWVvcgl3MTIsdzEyLHcxNgorCXNsaQl2MTcuNHMsdjIyLjRzLCMxMgorCXJvcgl3OSx3OSwjMjAKKwlhZGQJdjAuNHMsdjAuNHMsdjEuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjQuNHMsdjQuNHMsdjUuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwllb3IJdjIwLjE2Yix2My4xNmIsdjAuMTZiCisJYWRkCXc1LHc1LHc5CisJZW9yCXYyMS4xNmIsdjcuMTZiLHY0LjE2YgorCWFkZAl3Nix3Nix3MTAKKwllb3IJdjIyLjE2Yix2MTkuMTZiLHYxNi4xNmIKKwlhZGQJdzcsdzcsdzExCisJdXNocgl2My40cyx2MjAuNHMsIzI0CisJYWRkCXc4LHc4LHcxMgorCXVzaHIJdjcuNHMsdjIxLjRzLCMyNAorCWVvcgl3MTcsdzE3LHc1CisJdXNocgl2MTkuNHMsdjIyLjRzLCMyNAorCWVvcgl3MTksdzE5LHc2CisJc2xpCXYzLjRzLHYyMC40cywjOAorCWVvcgl3MjAsdzIwLHc3CisJc2xpCXY3LjRzLHYyMS40cywjOAorCWVvcgl3MjEsdzIxLHc4CisJc2xpCXYxOS40cyx2MjIuNHMsIzgKKwlyb3IJdzE3LHcxNywjMjQKKwlhZGQJdjIuNHMsdjIuNHMsdjMuNHMKKwlyb3IJdzE5LHcxOSwjMjQKKwlhZGQJdjYuNHMsdjYuNHMsdjcuNHMKKwlyb3IJdzIwLHcyMCwjMjQKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzIxLHcyMSwjMjQKKwllb3IJdjIwLjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXcxMyx3MTMsdzE3CisJZW9yCXYyMS4xNmIsdjUuMTZiLHY2LjE2YgorCWFkZAl3MTQsdzE0LHcxOQorCWVvcgl2MjIuMTZiLHYxNy4xNmIsdjE4LjE2YgorCWFkZAl3MTUsdzE1LHcyMAorCXVzaHIJdjEuNHMsdjIwLjRzLCMyNQorCWFkZAl3MTYsdzE2LHcyMQorCXVzaHIJdjUuNHMsdjIxLjRzLCMyNQorCWVvcgl3OSx3OSx3MTMKKwl1c2hyCXYxNy40cyx2MjIuNHMsIzI1CisJZW9yCXcxMCx3MTAsdzE0CisJc2xpCXYxLjRzLHYyMC40cywjNworCWVvcgl3MTEsdzExLHcxNQorCXNsaQl2NS40cyx2MjEuNHMsIzcKKwllb3IJdzEyLHcxMix3MTYKKwlzbGkJdjE3LjRzLHYyMi40cywjNworCXJvcgl3OSx3OSwjMjUKKwlleHQJdjIuMTZiLHYyLjE2Yix2Mi4xNmIsIzgKKwlyb3IJdzEwLHcxMCwjMjUKKwlleHQJdjYuMTZiLHY2LjE2Yix2Ni4xNmIsIzgKKwlyb3IJdzExLHcxMSwjMjUKKwlleHQJdjE4LjE2Yix2MTguMTZiLHYxOC4xNmIsIzgKKwlyb3IJdzEyLHcxMiwjMjUKKwlleHQJdjMuMTZiLHYzLjE2Yix2My4xNmIsIzEyCisJZXh0CXY3LjE2Yix2Ny4xNmIsdjcuMTZiLCMxMgorCWV4dAl2MTkuMTZiLHYxOS4xNmIsdjE5LjE2YiwjMTIKKwlleHQJdjEuMTZiLHYxLjE2Yix2MS4xNmIsIzQKKwlleHQJdjUuMTZiLHY1LjE2Yix2NS4xNmIsIzQKKwlleHQJdjE3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzQKKwlhZGQJdjAuNHMsdjAuNHMsdjEuNHMKKwlhZGQJdzUsdzUsdzEwCisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJYWRkCXc2LHc2LHcxMQorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCWFkZAl3Nyx3Nyx3MTIKKwllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIKKwlhZGQJdzgsdzgsdzkKKwllb3IJdjcuMTZiLHY3LjE2Yix2NC4xNmIKKwllb3IJdzIxLHcyMSx3NQorCWVvcgl2MTkuMTZiLHYxOS4xNmIsdjE2LjE2YgorCWVvcgl3MTcsdzE3LHc2CisJcmV2MzIJdjMuOGgsdjMuOGgKKwllb3IJdzE5LHcxOSx3NworCXJldjMyCXY3LjhoLHY3LjhoCisJZW9yCXcyMCx3MjAsdzgKKwlyZXYzMgl2MTkuOGgsdjE5LjhoCisJcm9yCXcyMSx3MjEsIzE2CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJcm9yCXcxNyx3MTcsIzE2CisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJcm9yCXcxOSx3MTksIzE2CisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcyMCx3MjAsIzE2CisJZW9yCXYyMC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3MTUsdzE1LHcyMQorCWVvcgl2MjEuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzE2LHcxNix3MTcKKwllb3IJdjIyLjE2Yix2MTcuMTZiLHYxOC4xNmIKKwlhZGQJdzEzLHcxMyx3MTkKKwl1c2hyCXYxLjRzLHYyMC40cywjMjAKKwlhZGQJdzE0LHcxNCx3MjAKKwl1c2hyCXY1LjRzLHYyMS40cywjMjAKKwllb3IJdzEwLHcxMCx3MTUKKwl1c2hyCXYxNy40cyx2MjIuNHMsIzIwCisJZW9yCXcxMSx3MTEsdzE2CisJc2xpCXYxLjRzLHYyMC40cywjMTIKKwllb3IJdzEyLHcxMix3MTMKKwlzbGkJdjUuNHMsdjIxLjRzLCMxMgorCWVvcgl3OSx3OSx3MTQKKwlzbGkJdjE3LjRzLHYyMi40cywjMTIKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjAuNHMsdjAuNHMsdjEuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjQuNHMsdjQuNHMsdjUuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlyb3IJdzksdzksIzIwCisJZW9yCXYyMC4xNmIsdjMuMTZiLHYwLjE2YgorCWFkZAl3NSx3NSx3MTAKKwllb3IJdjIxLjE2Yix2Ny4xNmIsdjQuMTZiCisJYWRkCXc2LHc2LHcxMQorCWVvcgl2MjIuMTZiLHYxOS4xNmIsdjE2LjE2YgorCWFkZAl3Nyx3Nyx3MTIKKwl1c2hyCXYzLjRzLHYyMC40cywjMjQKKwlhZGQJdzgsdzgsdzkKKwl1c2hyCXY3LjRzLHYyMS40cywjMjQKKwllb3IJdzIxLHcyMSx3NQorCXVzaHIJdjE5LjRzLHYyMi40cywjMjQKKwllb3IJdzE3LHcxNyx3NgorCXNsaQl2My40cyx2MjAuNHMsIzgKKwllb3IJdzE5LHcxOSx3NworCXNsaQl2Ny40cyx2MjEuNHMsIzgKKwllb3IJdzIwLHcyMCx3OAorCXNsaQl2MTkuNHMsdjIyLjRzLCM4CisJcm9yCXcyMSx3MjEsIzI0CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJcm9yCXcxNyx3MTcsIzI0CisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJcm9yCXcxOSx3MTksIzI0CisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcyMCx3MjAsIzI0CisJZW9yCXYyMC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3MTUsdzE1LHcyMQorCWVvcgl2MjEuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzE2LHcxNix3MTcKKwllb3IJdjIyLjE2Yix2MTcuMTZiLHYxOC4xNmIKKwlhZGQJdzEzLHcxMyx3MTkKKwl1c2hyCXYxLjRzLHYyMC40cywjMjUKKwlhZGQJdzE0LHcxNCx3MjAKKwl1c2hyCXY1LjRzLHYyMS40cywjMjUKKwllb3IJdzEwLHcxMCx3MTUKKwl1c2hyCXYxNy40cyx2MjIuNHMsIzI1CisJZW9yCXcxMSx3MTEsdzE2CisJc2xpCXYxLjRzLHYyMC40cywjNworCWVvcgl3MTIsdzEyLHcxMworCXNsaQl2NS40cyx2MjEuNHMsIzcKKwllb3IJdzksdzksdzE0CisJc2xpCXYxNy40cyx2MjIuNHMsIzcKKwlyb3IJdzEwLHcxMCwjMjUKKwlleHQJdjIuMTZiLHYyLjE2Yix2Mi4xNmIsIzgKKwlyb3IJdzExLHcxMSwjMjUKKwlleHQJdjYuMTZiLHY2LjE2Yix2Ni4xNmIsIzgKKwlyb3IJdzEyLHcxMiwjMjUKKwlleHQJdjE4LjE2Yix2MTguMTZiLHYxOC4xNmIsIzgKKwlyb3IJdzksdzksIzI1CisJZXh0CXYzLjE2Yix2My4xNmIsdjMuMTZiLCM0CisJZXh0CXY3LjE2Yix2Ny4xNmIsdjcuMTZiLCM0CisJZXh0CXYxOS4xNmIsdjE5LjE2Yix2MTkuMTZiLCM0CisJZXh0CXYxLjE2Yix2MS4xNmIsdjEuMTZiLCMxMgorCWV4dAl2NS4xNmIsdjUuMTZiLHY1LjE2YiwjMTIKKwlleHQJdjE3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzEyCisJY2Juegl4NCwuTG9vcF9uZW9uCisKKwlhZGQJdzUsdzUsdzIyCQkvLyBhY2N1bXVsYXRlIGtleSBibG9jaworCWFkZAl2MC40cyx2MC40cyx2MjQuNHMKKwlhZGQJeDYseDYseDIyLGxzciMzMgorCWFkZAl2NC40cyx2NC40cyx2MjQuNHMKKwlhZGQJdzcsdzcsdzIzCisJYWRkCXYxNi40cyx2MTYuNHMsdjI0LjRzCisJYWRkCXg4LHg4LHgyMyxsc3IjMzIKKwlhZGQJdjIuNHMsdjIuNHMsdjI2LjRzCisJYWRkCXc5LHc5LHcyNAorCWFkZAl2Ni40cyx2Ni40cyx2MjYuNHMKKwlhZGQJeDEwLHgxMCx4MjQsbHNyIzMyCisJYWRkCXYxOC40cyx2MTguNHMsdjI2LjRzCisJYWRkCXcxMSx3MTEsdzI1CisJYWRkCXYzLjRzLHYzLjRzLHYyNy40cworCWFkZAl4MTIseDEyLHgyNSxsc3IjMzIKKwlhZGQJdzEzLHcxMyx3MjYKKwlhZGQJdjcuNHMsdjcuNHMsdjI4LjRzCisJYWRkCXgxNCx4MTQseDI2LGxzciMzMgorCWFkZAl3MTUsdzE1LHcyNworCWFkZAl2MTkuNHMsdjE5LjRzLHYyOS40cworCWFkZAl4MTYseDE2LHgyNyxsc3IjMzIKKwlhZGQJdzE3LHcxNyx3MjgKKwlhZGQJdjEuNHMsdjEuNHMsdjI1LjRzCisJYWRkCXgxOSx4MTkseDI4LGxzciMzMgorCWFkZAl3MjAsdzIwLHczMAorCWFkZAl2NS40cyx2NS40cyx2MjUuNHMKKwlhZGQJeDIxLHgyMSx4MzAsbHNyIzMyCisJYWRkCXYxNy40cyx2MTcuNHMsdjI1LjRzCisKKwliLmxvCS5MdGFpbF9uZW9uCisKKwlhZGQJeDUseDUseDYsbHNsIzMyCS8vIHBhY2sKKwlhZGQJeDcseDcseDgsbHNsIzMyCisJbGRwCXg2LHg4LFt4MSwjMF0JCS8vIGxvYWQgaW5wdXQKKwlhZGQJeDkseDkseDEwLGxzbCMzMgorCWFkZAl4MTEseDExLHgxMixsc2wjMzIKKwlsZHAJeDEwLHgxMixbeDEsIzE2XQorCWFkZAl4MTMseDEzLHgxNCxsc2wjMzIKKwlhZGQJeDE1LHgxNSx4MTYsbHNsIzMyCisJbGRwCXgxNCx4MTYsW3gxLCMzMl0KKwlhZGQJeDE3LHgxNyx4MTksbHNsIzMyCisJYWRkCXgyMCx4MjAseDIxLGxzbCMzMgorCWxkcAl4MTkseDIxLFt4MSwjNDhdCisJYWRkCXgxLHgxLCM2NAorI2lmZGVmCV9fQVJNRUJfXworCXJldgl4NSx4NQorCXJldgl4Nyx4NworCXJldgl4OSx4OQorCXJldgl4MTEseDExCisJcmV2CXgxMyx4MTMKKwlyZXYJeDE1LHgxNQorCXJldgl4MTcseDE3CisJcmV2CXgyMCx4MjAKKyNlbmRpZgorCWxkMQl7djIwLjE2Yix2MjEuMTZiLHYyMi4xNmIsdjIzLjE2Yn0sW3gxXSwjNjQKKwllb3IJeDUseDUseDYKKwllb3IJeDcseDcseDgKKwllb3IJeDkseDkseDEwCisJZW9yCXgxMSx4MTEseDEyCisJZW9yCXgxMyx4MTMseDE0CisJZW9yCXYwLjE2Yix2MC4xNmIsdjIwLjE2YgorCWVvcgl4MTUseDE1LHgxNgorCWVvcgl2MS4xNmIsdjEuMTZiLHYyMS4xNmIKKwllb3IJeDE3LHgxNyx4MTkKKwllb3IJdjIuMTZiLHYyLjE2Yix2MjIuMTZiCisJZW9yCXgyMCx4MjAseDIxCisJZW9yCXYzLjE2Yix2My4xNmIsdjIzLjE2YgorCWxkMQl7djIwLjE2Yix2MjEuMTZiLHYyMi4xNmIsdjIzLjE2Yn0sW3gxXSwjNjQKKworCXN0cAl4NSx4NyxbeDAsIzBdCQkvLyBzdG9yZSBvdXRwdXQKKwlhZGQJeDI4LHgyOCwjNAkJCS8vIGluY3JlbWVudCBjb3VudGVyCisJc3RwCXg5LHgxMSxbeDAsIzE2XQorCWFkZAl2MjcuNHMsdjI3LjRzLHYzMS40cwkJLy8gKz0gNAorCXN0cAl4MTMseDE1LFt4MCwjMzJdCisJYWRkCXYyOC40cyx2MjguNHMsdjMxLjRzCisJc3RwCXgxNyx4MjAsW3gwLCM0OF0KKwlhZGQJdjI5LjRzLHYyOS40cyx2MzEuNHMKKwlhZGQJeDAseDAsIzY0CisKKwlzdDEJe3YwLjE2Yix2MS4xNmIsdjIuMTZiLHYzLjE2Yn0sW3gwXSwjNjQKKwlsZDEJe3YwLjE2Yix2MS4xNmIsdjIuMTZiLHYzLjE2Yn0sW3gxXSwjNjQKKworCWVvcgl2NC4xNmIsdjQuMTZiLHYyMC4xNmIKKwllb3IJdjUuMTZiLHY1LjE2Yix2MjEuMTZiCisJZW9yCXY2LjE2Yix2Ni4xNmIsdjIyLjE2YgorCWVvcgl2Ny4xNmIsdjcuMTZiLHYyMy4xNmIKKwlzdDEJe3Y0LjE2Yix2NS4xNmIsdjYuMTZiLHY3LjE2Yn0sW3gwXSwjNjQKKworCWVvcgl2MTYuMTZiLHYxNi4xNmIsdjAuMTZiCisJZW9yCXYxNy4xNmIsdjE3LjE2Yix2MS4xNmIKKwllb3IJdjE4LjE2Yix2MTguMTZiLHYyLjE2YgorCWVvcgl2MTkuMTZiLHYxOS4xNmIsdjMuMTZiCisJc3QxCXt2MTYuMTZiLHYxNy4xNmIsdjE4LjE2Yix2MTkuMTZifSxbeDBdLCM2NAorCisJYi5oaQkuTG9vcF9vdXRlcl9uZW9uCisKKwlsZHAJeDE5LHgyMCxbeDI5LCMxNl0KKwlhZGQJc3Asc3AsIzY0CisJbGRwCXgyMSx4MjIsW3gyOSwjMzJdCisJbGRwCXgyMyx4MjQsW3gyOSwjNDhdCisJbGRwCXgyNSx4MjYsW3gyOSwjNjRdCisJbGRwCXgyNyx4MjgsW3gyOSwjODBdCisJbGRwCXgyOSx4MzAsW3NwXSwjOTYKKwlyZXQKKworLkx0YWlsX25lb246CisJYWRkCXgyLHgyLCMyNTYKKwljbXAJeDIsIzY0CisJYi5sbwkuTGVzc190aGFuXzY0CisKKwlhZGQJeDUseDUseDYsbHNsIzMyCS8vIHBhY2sKKwlhZGQJeDcseDcseDgsbHNsIzMyCisJbGRwCXg2LHg4LFt4MSwjMF0JCS8vIGxvYWQgaW5wdXQKKwlhZGQJeDkseDkseDEwLGxzbCMzMgorCWFkZAl4MTEseDExLHgxMixsc2wjMzIKKwlsZHAJeDEwLHgxMixbeDEsIzE2XQorCWFkZAl4MTMseDEzLHgxNCxsc2wjMzIKKwlhZGQJeDE1LHgxNSx4MTYsbHNsIzMyCisJbGRwCXgxNCx4MTYsW3gxLCMzMl0KKwlhZGQJeDE3LHgxNyx4MTksbHNsIzMyCisJYWRkCXgyMCx4MjAseDIxLGxzbCMzMgorCWxkcAl4MTkseDIxLFt4MSwjNDhdCisJYWRkCXgxLHgxLCM2NAorI2lmZGVmCV9fQVJNRUJfXworCXJldgl4NSx4NQorCXJldgl4Nyx4NworCXJldgl4OSx4OQorCXJldgl4MTEseDExCisJcmV2CXgxMyx4MTMKKwlyZXYJeDE1LHgxNQorCXJldgl4MTcseDE3CisJcmV2CXgyMCx4MjAKKyNlbmRpZgorCWVvcgl4NSx4NSx4NgorCWVvcgl4Nyx4Nyx4OAorCWVvcgl4OSx4OSx4MTAKKwllb3IJeDExLHgxMSx4MTIKKwllb3IJeDEzLHgxMyx4MTQKKwllb3IJeDE1LHgxNSx4MTYKKwllb3IJeDE3LHgxNyx4MTkKKwllb3IJeDIwLHgyMCx4MjEKKworCXN0cAl4NSx4NyxbeDAsIzBdCQkvLyBzdG9yZSBvdXRwdXQKKwlhZGQJeDI4LHgyOCwjNAkJCS8vIGluY3JlbWVudCBjb3VudGVyCisJc3RwCXg5LHgxMSxbeDAsIzE2XQorCXN0cAl4MTMseDE1LFt4MCwjMzJdCisJc3RwCXgxNyx4MjAsW3gwLCM0OF0KKwlhZGQJeDAseDAsIzY0CisJYi5lcQkuTGRvbmVfbmVvbgorCXN1Ygl4Mix4MiwjNjQKKwljbXAJeDIsIzY0CisJYi5sbwkuTGVzc190aGFuXzEyOAorCisJbGQxCXt2MjAuMTZiLHYyMS4xNmIsdjIyLjE2Yix2MjMuMTZifSxbeDFdLCM2NAorCWVvcgl2MC4xNmIsdjAuMTZiLHYyMC4xNmIKKwllb3IJdjEuMTZiLHYxLjE2Yix2MjEuMTZiCisJZW9yCXYyLjE2Yix2Mi4xNmIsdjIyLjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHYyMy4xNmIKKwlzdDEJe3YwLjE2Yix2MS4xNmIsdjIuMTZiLHYzLjE2Yn0sW3gwXSwjNjQKKwliLmVxCS5MZG9uZV9uZW9uCisJc3ViCXgyLHgyLCM2NAorCWNtcAl4MiwjNjQKKwliLmxvCS5MZXNzX3RoYW5fMTkyCisKKwlsZDEJe3YyMC4xNmIsdjIxLjE2Yix2MjIuMTZiLHYyMy4xNmJ9LFt4MV0sIzY0CisJZW9yCXY0LjE2Yix2NC4xNmIsdjIwLjE2YgorCWVvcgl2NS4xNmIsdjUuMTZiLHYyMS4xNmIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MjIuMTZiCisJZW9yCXY3LjE2Yix2Ny4xNmIsdjIzLjE2YgorCXN0MQl7djQuMTZiLHY1LjE2Yix2Ni4xNmIsdjcuMTZifSxbeDBdLCM2NAorCWIuZXEJLkxkb25lX25lb24KKwlzdWIJeDIseDIsIzY0CisKKwlzdDEJe3YxNi4xNmIsdjE3LjE2Yix2MTguMTZiLHYxOS4xNmJ9LFtzcF0KKwliCS5MYXN0X25lb24KKworLkxlc3NfdGhhbl8xMjg6CisJc3QxCXt2MC4xNmIsdjEuMTZiLHYyLjE2Yix2My4xNmJ9LFtzcF0KKwliCS5MYXN0X25lb24KKy5MZXNzX3RoYW5fMTkyOgorCXN0MQl7djQuMTZiLHY1LjE2Yix2Ni4xNmIsdjcuMTZifSxbc3BdCisJYgkuTGFzdF9uZW9uCisKKy5hbGlnbgk0CisuTGFzdF9uZW9uOgorCXN1Ygl4MCx4MCwjMQorCWFkZAl4MSx4MSx4MgorCWFkZAl4MCx4MCx4MgorCWFkZAl4NCxzcCx4MgorCW5lZwl4Mix4MgorCisuTG9vcF90YWlsX25lb246CisJbGRyYgl3MTAsW3gxLHgyXQorCWxkcmIJdzExLFt4NCx4Ml0KKwlhZGQJeDIseDIsIzEKKwllb3IJdzEwLHcxMCx3MTEKKwlzdHJiCXcxMCxbeDAseDJdCisJY2Juegl4MiwuTG9vcF90YWlsX25lb24KKworCXN0cAl4enIseHpyLFtzcCwjMF0KKwlzdHAJeHpyLHh6cixbc3AsIzE2XQorCXN0cAl4enIseHpyLFtzcCwjMzJdCisJc3RwCXh6cix4enIsW3NwLCM0OF0KKworLkxkb25lX25lb246CisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM2NAorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcAl4MjkseDMwLFtzcF0sIzk2CisJcmV0Cisuc2l6ZQlDaGFDaGEyMF9uZW9uLC4tQ2hhQ2hhMjBfbmVvbgorLnR5cGUJQ2hhQ2hhMjBfNTEyX25lb24sJWZ1bmN0aW9uCisuYWxpZ24JNQorQ2hhQ2hhMjBfNTEyX25lb246CisJc3RwCXgyOSx4MzAsW3NwLCMtOTZdIQorCWFkZAl4Mjksc3AsIzAKKworCWFkcgl4NSwuTHNpZ21hCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisJc3RwCXgyNSx4MjYsW3NwLCM2NF0KKwlzdHAJeDI3LHgyOCxbc3AsIzgwXQorCisuTDUxMl9vcl9tb3JlX25lb246CisJc3ViCXNwLHNwLCMxMjgrNjQKKworCWxkcAl4MjIseDIzLFt4NV0JCS8vIGxvYWQgc2lnbWEKKwlsZDEJe3YyNC40c30sW3g1XSwjMTYKKwlsZHAJeDI0LHgyNSxbeDNdCQkvLyBsb2FkIGtleQorCWxkcAl4MjYseDI3LFt4MywjMTZdCisJbGQxCXt2MjUuNHMsdjI2LjRzfSxbeDNdCisJbGRwCXgyOCx4MzAsW3g0XQkJLy8gbG9hZCBjb3VudGVyCisJbGQxCXt2MjcuNHN9LFt4NF0KKwlsZDEJe3YzMS40c30sW3g1XQorI2lmZGVmCV9fQVJNRUJfXworCXJldjY0CXYyNC40cyx2MjQuNHMKKwlyb3IJeDI0LHgyNCwjMzIKKwlyb3IJeDI1LHgyNSwjMzIKKwlyb3IJeDI2LHgyNiwjMzIKKwlyb3IJeDI3LHgyNywjMzIKKwlyb3IJeDI4LHgyOCwjMzIKKwlyb3IJeDMwLHgzMCwjMzIKKyNlbmRpZgorCWFkZAl2MjcuNHMsdjI3LjRzLHYzMS40cwkJLy8gKz0gMQorCXN0cAlxMjQscTI1LFtzcCwjMF0JCS8vIG9mZi1sb2FkIGtleSBibG9jaywgaW52YXJpYW50IHBhcnQKKwlhZGQJdjI3LjRzLHYyNy40cyx2MzEuNHMJCS8vIG5vdCB0eXBvCisJc3RyCXEyNixbc3AsIzMyXQorCWFkZAl2MjguNHMsdjI3LjRzLHYzMS40cworCWFkZAl2MjkuNHMsdjI4LjRzLHYzMS40cworCWFkZAl2MzAuNHMsdjI5LjRzLHYzMS40cworCXNobAl2MzEuNHMsdjMxLjRzLCMyCQkJLy8gMSAtPiA0CisKKwlzdHAJZDgsZDksW3NwLCMxMjgrMF0JCS8vIG1lZXQgQUJJIHJlcXVpcmVtZW50cworCXN0cAlkMTAsZDExLFtzcCwjMTI4KzE2XQorCXN0cAlkMTIsZDEzLFtzcCwjMTI4KzMyXQorCXN0cAlkMTQsZDE1LFtzcCwjMTI4KzQ4XQorCisJc3ViCXgyLHgyLCM1MTIJCQkvLyBub3QgdHlwbworCisuTG9vcF9vdXRlcl81MTJfbmVvbjoKKwltb3YJdjAuMTZiLHYyNC4xNmIKKwltb3YJdjQuMTZiLHYyNC4xNmIKKwltb3YJdjguMTZiLHYyNC4xNmIKKwltb3YJdjEyLjE2Yix2MjQuMTZiCisJbW92CXYxNi4xNmIsdjI0LjE2YgorCW1vdgl2MjAuMTZiLHYyNC4xNmIKKwltb3YJdjEuMTZiLHYyNS4xNmIKKwltb3YJdzUsdzIyCQkJLy8gdW5wYWNrIGtleSBibG9jaworCW1vdgl2NS4xNmIsdjI1LjE2YgorCWxzcgl4Nix4MjIsIzMyCisJbW92CXY5LjE2Yix2MjUuMTZiCisJbW92CXc3LHcyMworCW1vdgl2MTMuMTZiLHYyNS4xNmIKKwlsc3IJeDgseDIzLCMzMgorCW1vdgl2MTcuMTZiLHYyNS4xNmIKKwltb3YJdzksdzI0CisJbW92CXYyMS4xNmIsdjI1LjE2YgorCWxzcgl4MTAseDI0LCMzMgorCW1vdgl2My4xNmIsdjI3LjE2YgorCW1vdgl3MTEsdzI1CisJbW92CXY3LjE2Yix2MjguMTZiCisJbHNyCXgxMix4MjUsIzMyCisJbW92CXYxMS4xNmIsdjI5LjE2YgorCW1vdgl3MTMsdzI2CisJbW92CXYxNS4xNmIsdjMwLjE2YgorCWxzcgl4MTQseDI2LCMzMgorCW1vdgl2Mi4xNmIsdjI2LjE2YgorCW1vdgl3MTUsdzI3CisJbW92CXY2LjE2Yix2MjYuMTZiCisJbHNyCXgxNix4MjcsIzMyCisJYWRkCXYxOS40cyx2My40cyx2MzEuNHMJCQkvLyArNAorCW1vdgl3MTcsdzI4CisJYWRkCXYyMy40cyx2Ny40cyx2MzEuNHMJCQkvLyArNAorCWxzcgl4MTkseDI4LCMzMgorCW1vdgl2MTAuMTZiLHYyNi4xNmIKKwltb3YJdzIwLHczMAorCW1vdgl2MTQuMTZiLHYyNi4xNmIKKwlsc3IJeDIxLHgzMCwjMzIKKwltb3YJdjE4LjE2Yix2MjYuMTZiCisJc3RwCXEyNyxxMjgsW3NwLCM0OF0JCS8vIG9mZi1sb2FkIGtleSBibG9jaywgdmFyaWFibGUgcGFydAorCW1vdgl2MjIuMTZiLHYyNi4xNmIKKwlzdHIJcTI5LFtzcCwjODBdCisKKwltb3YJeDQsIzUKKwlzdWJzCXgyLHgyLCM1MTIKKy5Mb29wX3VwcGVyX25lb246CisJc3ViCXg0LHg0LCMxCisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJYWRkCXc1LHc1LHc5CisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJYWRkCXc2LHc2LHcxMAorCWFkZAl2OC40cyx2OC40cyx2OS40cworCWFkZAl3Nyx3Nyx3MTEKKwlhZGQJdjEyLjRzLHYxMi40cyx2MTMuNHMKKwlhZGQJdzgsdzgsdzEyCisJYWRkCXYxNi40cyx2MTYuNHMsdjE3LjRzCisJZW9yCXcxNyx3MTcsdzUKKwlhZGQJdjIwLjRzLHYyMC40cyx2MjEuNHMKKwllb3IJdzE5LHcxOSx3NgorCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgorCWVvcgl3MjAsdzIwLHc3CisJZW9yCXY3LjE2Yix2Ny4xNmIsdjQuMTZiCisJZW9yCXcyMSx3MjEsdzgKKwllb3IJdjExLjE2Yix2MTEuMTZiLHY4LjE2YgorCXJvcgl3MTcsdzE3LCMxNgorCWVvcgl2MTUuMTZiLHYxNS4xNmIsdjEyLjE2YgorCXJvcgl3MTksdzE5LCMxNgorCWVvcgl2MTkuMTZiLHYxOS4xNmIsdjE2LjE2YgorCXJvcgl3MjAsdzIwLCMxNgorCWVvcgl2MjMuMTZiLHYyMy4xNmIsdjIwLjE2YgorCXJvcgl3MjEsdzIxLCMxNgorCXJldjMyCXYzLjhoLHYzLjhoCisJYWRkCXcxMyx3MTMsdzE3CisJcmV2MzIJdjcuOGgsdjcuOGgKKwlhZGQJdzE0LHcxNCx3MTkKKwlyZXYzMgl2MTEuOGgsdjExLjhoCisJYWRkCXcxNSx3MTUsdzIwCisJcmV2MzIJdjE1LjhoLHYxNS44aAorCWFkZAl3MTYsdzE2LHcyMQorCXJldjMyCXYxOS44aCx2MTkuOGgKKwllb3IJdzksdzksdzEzCisJcmV2MzIJdjIzLjhoLHYyMy44aAorCWVvcgl3MTAsdzEwLHcxNAorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCWVvcgl3MTEsdzExLHcxNQorCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCWVvcgl3MTIsdzEyLHcxNgorCWFkZAl2MTAuNHMsdjEwLjRzLHYxMS40cworCXJvcgl3OSx3OSwjMjAKKwlhZGQJdjE0LjRzLHYxNC40cyx2MTUuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjIyLjRzLHYyMi40cyx2MjMuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwllb3IJdjI0LjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXc1LHc1LHc5CisJZW9yCXYyNS4xNmIsdjUuMTZiLHY2LjE2YgorCWFkZAl3Nix3Nix3MTAKKwllb3IJdjI2LjE2Yix2OS4xNmIsdjEwLjE2YgorCWFkZAl3Nyx3Nyx3MTEKKwllb3IJdjI3LjE2Yix2MTMuMTZiLHYxNC4xNmIKKwlhZGQJdzgsdzgsdzEyCisJZW9yCXYyOC4xNmIsdjE3LjE2Yix2MTguMTZiCisJZW9yCXcxNyx3MTcsdzUKKwllb3IJdjI5LjE2Yix2MjEuMTZiLHYyMi4xNmIKKwllb3IJdzE5LHcxOSx3NgorCXVzaHIJdjEuNHMsdjI0LjRzLCMyMAorCWVvcgl3MjAsdzIwLHc3CisJdXNocgl2NS40cyx2MjUuNHMsIzIwCisJZW9yCXcyMSx3MjEsdzgKKwl1c2hyCXY5LjRzLHYyNi40cywjMjAKKwlyb3IJdzE3LHcxNywjMjQKKwl1c2hyCXYxMy40cyx2MjcuNHMsIzIwCisJcm9yCXcxOSx3MTksIzI0CisJdXNocgl2MTcuNHMsdjI4LjRzLCMyMAorCXJvcgl3MjAsdzIwLCMyNAorCXVzaHIJdjIxLjRzLHYyOS40cywjMjAKKwlyb3IJdzIxLHcyMSwjMjQKKwlzbGkJdjEuNHMsdjI0LjRzLCMxMgorCWFkZAl3MTMsdzEzLHcxNworCXNsaQl2NS40cyx2MjUuNHMsIzEyCisJYWRkCXcxNCx3MTQsdzE5CisJc2xpCXY5LjRzLHYyNi40cywjMTIKKwlhZGQJdzE1LHcxNSx3MjAKKwlzbGkJdjEzLjRzLHYyNy40cywjMTIKKwlhZGQJdzE2LHcxNix3MjEKKwlzbGkJdjE3LjRzLHYyOC40cywjMTIKKwllb3IJdzksdzksdzEzCisJc2xpCXYyMS40cyx2MjkuNHMsIzEyCisJZW9yCXcxMCx3MTAsdzE0CisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJZW9yCXcxMSx3MTEsdzE1CisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJZW9yCXcxMix3MTIsdzE2CisJYWRkCXY4LjRzLHY4LjRzLHY5LjRzCisJcm9yCXc5LHc5LCMyNQorCWFkZAl2MTIuNHMsdjEyLjRzLHYxMy40cworCXJvcgl3MTAsdzEwLCMyNQorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCXJvcgl3MTEsdzExLCMyNQorCWFkZAl2MjAuNHMsdjIwLjRzLHYyMS40cworCXJvcgl3MTIsdzEyLCMyNQorCWVvcgl2MjQuMTZiLHYzLjE2Yix2MC4xNmIKKwlhZGQJdzUsdzUsdzEwCisJZW9yCXYyNS4xNmIsdjcuMTZiLHY0LjE2YgorCWFkZAl3Nix3Nix3MTEKKwllb3IJdjI2LjE2Yix2MTEuMTZiLHY4LjE2YgorCWFkZAl3Nyx3Nyx3MTIKKwllb3IJdjI3LjE2Yix2MTUuMTZiLHYxMi4xNmIKKwlhZGQJdzgsdzgsdzkKKwllb3IJdjI4LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwllb3IJdzIxLHcyMSx3NQorCWVvcgl2MjkuMTZiLHYyMy4xNmIsdjIwLjE2YgorCWVvcgl3MTcsdzE3LHc2CisJdXNocgl2My40cyx2MjQuNHMsIzI0CisJZW9yCXcxOSx3MTksdzcKKwl1c2hyCXY3LjRzLHYyNS40cywjMjQKKwllb3IJdzIwLHcyMCx3OAorCXVzaHIJdjExLjRzLHYyNi40cywjMjQKKwlyb3IJdzIxLHcyMSwjMTYKKwl1c2hyCXYxNS40cyx2MjcuNHMsIzI0CisJcm9yCXcxNyx3MTcsIzE2CisJdXNocgl2MTkuNHMsdjI4LjRzLCMyNAorCXJvcgl3MTksdzE5LCMxNgorCXVzaHIJdjIzLjRzLHYyOS40cywjMjQKKwlyb3IJdzIwLHcyMCwjMTYKKwlzbGkJdjMuNHMsdjI0LjRzLCM4CisJYWRkCXcxNSx3MTUsdzIxCisJc2xpCXY3LjRzLHYyNS40cywjOAorCWFkZAl3MTYsdzE2LHcxNworCXNsaQl2MTEuNHMsdjI2LjRzLCM4CisJYWRkCXcxMyx3MTMsdzE5CisJc2xpCXYxNS40cyx2MjcuNHMsIzgKKwlhZGQJdzE0LHcxNCx3MjAKKwlzbGkJdjE5LjRzLHYyOC40cywjOAorCWVvcgl3MTAsdzEwLHcxNQorCXNsaQl2MjMuNHMsdjI5LjRzLCM4CisJZW9yCXcxMSx3MTEsdzE2CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJZW9yCXcxMix3MTIsdzEzCisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJZW9yCXc5LHc5LHcxNAorCWFkZAl2MTAuNHMsdjEwLjRzLHYxMS40cworCXJvcgl3MTAsdzEwLCMyMAorCWFkZAl2MTQuNHMsdjE0LjRzLHYxNS40cworCXJvcgl3MTEsdzExLCMyMAorCWFkZAl2MTguNHMsdjE4LjRzLHYxOS40cworCXJvcgl3MTIsdzEyLCMyMAorCWFkZAl2MjIuNHMsdjIyLjRzLHYyMy40cworCXJvcgl3OSx3OSwjMjAKKwllb3IJdjI0LjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXc1LHc1LHcxMAorCWVvcgl2MjUuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzYsdzYsdzExCisJZW9yCXYyNi4xNmIsdjkuMTZiLHYxMC4xNmIKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYyNy4xNmIsdjEzLjE2Yix2MTQuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXYyOC4xNmIsdjE3LjE2Yix2MTguMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjI5LjE2Yix2MjEuMTZiLHYyMi4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXVzaHIJdjEuNHMsdjI0LjRzLCMyNQorCWVvcgl3MTksdzE5LHc3CisJdXNocgl2NS40cyx2MjUuNHMsIzI1CisJZW9yCXcyMCx3MjAsdzgKKwl1c2hyCXY5LjRzLHYyNi40cywjMjUKKwlyb3IJdzIxLHcyMSwjMjQKKwl1c2hyCXYxMy40cyx2MjcuNHMsIzI1CisJcm9yCXcxNyx3MTcsIzI0CisJdXNocgl2MTcuNHMsdjI4LjRzLCMyNQorCXJvcgl3MTksdzE5LCMyNAorCXVzaHIJdjIxLjRzLHYyOS40cywjMjUKKwlyb3IJdzIwLHcyMCwjMjQKKwlzbGkJdjEuNHMsdjI0LjRzLCM3CisJYWRkCXcxNSx3MTUsdzIxCisJc2xpCXY1LjRzLHYyNS40cywjNworCWFkZAl3MTYsdzE2LHcxNworCXNsaQl2OS40cyx2MjYuNHMsIzcKKwlhZGQJdzEzLHcxMyx3MTkKKwlzbGkJdjEzLjRzLHYyNy40cywjNworCWFkZAl3MTQsdzE0LHcyMAorCXNsaQl2MTcuNHMsdjI4LjRzLCM3CisJZW9yCXcxMCx3MTAsdzE1CisJc2xpCXYyMS40cyx2MjkuNHMsIzcKKwllb3IJdzExLHcxMSx3MTYKKwlleHQJdjIuMTZiLHYyLjE2Yix2Mi4xNmIsIzgKKwllb3IJdzEyLHcxMix3MTMKKwlleHQJdjYuMTZiLHY2LjE2Yix2Ni4xNmIsIzgKKwllb3IJdzksdzksdzE0CisJZXh0CXYxMC4xNmIsdjEwLjE2Yix2MTAuMTZiLCM4CisJcm9yCXcxMCx3MTAsIzI1CisJZXh0CXYxNC4xNmIsdjE0LjE2Yix2MTQuMTZiLCM4CisJcm9yCXcxMSx3MTEsIzI1CisJZXh0CXYxOC4xNmIsdjE4LjE2Yix2MTguMTZiLCM4CisJcm9yCXcxMix3MTIsIzI1CisJZXh0CXYyMi4xNmIsdjIyLjE2Yix2MjIuMTZiLCM4CisJcm9yCXc5LHc5LCMyNQorCWV4dAl2My4xNmIsdjMuMTZiLHYzLjE2YiwjMTIKKwlleHQJdjcuMTZiLHY3LjE2Yix2Ny4xNmIsIzEyCisJZXh0CXYxMS4xNmIsdjExLjE2Yix2MTEuMTZiLCMxMgorCWV4dAl2MTUuMTZiLHYxNS4xNmIsdjE1LjE2YiwjMTIKKwlleHQJdjE5LjE2Yix2MTkuMTZiLHYxOS4xNmIsIzEyCisJZXh0CXYyMy4xNmIsdjIzLjE2Yix2MjMuMTZiLCMxMgorCWV4dAl2MS4xNmIsdjEuMTZiLHYxLjE2YiwjNAorCWV4dAl2NS4xNmIsdjUuMTZiLHY1LjE2YiwjNAorCWV4dAl2OS4xNmIsdjkuMTZiLHY5LjE2YiwjNAorCWV4dAl2MTMuMTZiLHYxMy4xNmIsdjEzLjE2YiwjNAorCWV4dAl2MTcuMTZiLHYxNy4xNmIsdjE3LjE2YiwjNAorCWV4dAl2MjEuMTZiLHYyMS4xNmIsdjIxLjE2YiwjNAorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWFkZAl3NSx3NSx3OQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWFkZAl3Nix3Nix3MTAKKwlhZGQJdjguNHMsdjguNHMsdjkuNHMKKwlhZGQJdzcsdzcsdzExCisJYWRkCXYxMi40cyx2MTIuNHMsdjEzLjRzCisJYWRkCXc4LHc4LHcxMgorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCWVvcgl3MTcsdzE3LHc1CisJYWRkCXYyMC40cyx2MjAuNHMsdjIxLjRzCisJZW9yCXcxOSx3MTksdzYKKwllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIKKwllb3IJdzIwLHcyMCx3NworCWVvcgl2Ny4xNmIsdjcuMTZiLHY0LjE2YgorCWVvcgl3MjEsdzIxLHc4CisJZW9yCXYxMS4xNmIsdjExLjE2Yix2OC4xNmIKKwlyb3IJdzE3LHcxNywjMTYKKwllb3IJdjE1LjE2Yix2MTUuMTZiLHYxMi4xNmIKKwlyb3IJdzE5LHcxOSwjMTYKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwlyb3IJdzIwLHcyMCwjMTYKKwllb3IJdjIzLjE2Yix2MjMuMTZiLHYyMC4xNmIKKwlyb3IJdzIxLHcyMSwjMTYKKwlyZXYzMgl2My44aCx2My44aAorCWFkZAl3MTMsdzEzLHcxNworCXJldjMyCXY3LjhoLHY3LjhoCisJYWRkCXcxNCx3MTQsdzE5CisJcmV2MzIJdjExLjhoLHYxMS44aAorCWFkZAl3MTUsdzE1LHcyMAorCXJldjMyCXYxNS44aCx2MTUuOGgKKwlhZGQJdzE2LHcxNix3MjEKKwlyZXYzMgl2MTkuOGgsdjE5LjhoCisJZW9yCXc5LHc5LHcxMworCXJldjMyCXYyMy44aCx2MjMuOGgKKwllb3IJdzEwLHcxMCx3MTQKKwlhZGQJdjIuNHMsdjIuNHMsdjMuNHMKKwllb3IJdzExLHcxMSx3MTUKKwlhZGQJdjYuNHMsdjYuNHMsdjcuNHMKKwllb3IJdzEyLHcxMix3MTYKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzksdzksIzIwCisJYWRkCXYxNC40cyx2MTQuNHMsdjE1LjRzCisJcm9yCXcxMCx3MTAsIzIwCisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcxMSx3MTEsIzIwCisJYWRkCXYyMi40cyx2MjIuNHMsdjIzLjRzCisJcm9yCXcxMix3MTIsIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3OQorCWVvcgl2MjUuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzYsdzYsdzEwCisJZW9yCXYyNi4xNmIsdjkuMTZiLHYxMC4xNmIKKwlhZGQJdzcsdzcsdzExCisJZW9yCXYyNy4xNmIsdjEzLjE2Yix2MTQuMTZiCisJYWRkCXc4LHc4LHcxMgorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MTcsdzE3LHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxOSx3MTksdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjAKKwllb3IJdzIwLHcyMCx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyMAorCWVvcgl3MjEsdzIxLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzIwCisJcm9yCXcxNyx3MTcsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyMAorCXJvcgl3MTksdzE5LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjAKKwlyb3IJdzIwLHcyMCwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzIwCisJcm9yCXcyMSx3MjEsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjMTIKKwlhZGQJdzEzLHcxMyx3MTcKKwlzbGkJdjUuNHMsdjI1LjRzLCMxMgorCWFkZAl3MTQsdzE0LHcxOQorCXNsaQl2OS40cyx2MjYuNHMsIzEyCisJYWRkCXcxNSx3MTUsdzIwCisJc2xpCXYxMy40cyx2MjcuNHMsIzEyCisJYWRkCXcxNix3MTYsdzIxCisJc2xpCXYxNy40cyx2MjguNHMsIzEyCisJZW9yCXc5LHc5LHcxMworCXNsaQl2MjEuNHMsdjI5LjRzLCMxMgorCWVvcgl3MTAsdzEwLHcxNAorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWVvcgl3MTEsdzExLHcxNQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWVvcgl3MTIsdzEyLHcxNgorCWFkZAl2OC40cyx2OC40cyx2OS40cworCXJvcgl3OSx3OSwjMjUKKwlhZGQJdjEyLjRzLHYxMi40cyx2MTMuNHMKKwlyb3IJdzEwLHcxMCwjMjUKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlyb3IJdzExLHcxMSwjMjUKKwlhZGQJdjIwLjRzLHYyMC40cyx2MjEuNHMKKwlyb3IJdzEyLHcxMiwjMjUKKwllb3IJdjI0LjE2Yix2My4xNmIsdjAuMTZiCisJYWRkCXc1LHc1LHcxMAorCWVvcgl2MjUuMTZiLHY3LjE2Yix2NC4xNmIKKwlhZGQJdzYsdzYsdzExCisJZW9yCXYyNi4xNmIsdjExLjE2Yix2OC4xNmIKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYyNy4xNmIsdjE1LjE2Yix2MTIuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXYyOC4xNmIsdjE5LjE2Yix2MTYuMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjI5LjE2Yix2MjMuMTZiLHYyMC4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXVzaHIJdjMuNHMsdjI0LjRzLCMyNAorCWVvcgl3MTksdzE5LHc3CisJdXNocgl2Ny40cyx2MjUuNHMsIzI0CisJZW9yCXcyMCx3MjAsdzgKKwl1c2hyCXYxMS40cyx2MjYuNHMsIzI0CisJcm9yCXcyMSx3MjEsIzE2CisJdXNocgl2MTUuNHMsdjI3LjRzLCMyNAorCXJvcgl3MTcsdzE3LCMxNgorCXVzaHIJdjE5LjRzLHYyOC40cywjMjQKKwlyb3IJdzE5LHcxOSwjMTYKKwl1c2hyCXYyMy40cyx2MjkuNHMsIzI0CisJcm9yCXcyMCx3MjAsIzE2CisJc2xpCXYzLjRzLHYyNC40cywjOAorCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2Ny40cyx2MjUuNHMsIzgKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjExLjRzLHYyNi40cywjOAorCWFkZAl3MTMsdzEzLHcxOQorCXNsaQl2MTUuNHMsdjI3LjRzLCM4CisJYWRkCXcxNCx3MTQsdzIwCisJc2xpCXYxOS40cyx2MjguNHMsIzgKKwllb3IJdzEwLHcxMCx3MTUKKwlzbGkJdjIzLjRzLHYyOS40cywjOAorCWVvcgl3MTEsdzExLHcxNgorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCWVvcgl3MTIsdzEyLHcxMworCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCWVvcgl3OSx3OSx3MTQKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjE0LjRzLHYxNC40cyx2MTUuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwlhZGQJdjIyLjRzLHYyMi40cyx2MjMuNHMKKwlyb3IJdzksdzksIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3MTAKKwllb3IJdjI1LjE2Yix2NS4xNmIsdjYuMTZiCisJYWRkCXc2LHc2LHcxMQorCWVvcgl2MjYuMTZiLHY5LjE2Yix2MTAuMTZiCisJYWRkCXc3LHc3LHcxMgorCWVvcgl2MjcuMTZiLHYxMy4xNmIsdjE0LjE2YgorCWFkZAl3OCx3OCx3OQorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MjEsdzIxLHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxNyx3MTcsdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjUKKwllb3IJdzE5LHcxOSx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyNQorCWVvcgl3MjAsdzIwLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzI1CisJcm9yCXcyMSx3MjEsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyNQorCXJvcgl3MTcsdzE3LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjUKKwlyb3IJdzE5LHcxOSwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzI1CisJcm9yCXcyMCx3MjAsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjNworCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2NS40cyx2MjUuNHMsIzcKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjkuNHMsdjI2LjRzLCM3CisJYWRkCXcxMyx3MTMsdzE5CisJc2xpCXYxMy40cyx2MjcuNHMsIzcKKwlhZGQJdzE0LHcxNCx3MjAKKwlzbGkJdjE3LjRzLHYyOC40cywjNworCWVvcgl3MTAsdzEwLHcxNQorCXNsaQl2MjEuNHMsdjI5LjRzLCM3CisJZW9yCXcxMSx3MTEsdzE2CisJZXh0CXYyLjE2Yix2Mi4xNmIsdjIuMTZiLCM4CisJZW9yCXcxMix3MTIsdzEzCisJZXh0CXY2LjE2Yix2Ni4xNmIsdjYuMTZiLCM4CisJZW9yCXc5LHc5LHcxNAorCWV4dAl2MTAuMTZiLHYxMC4xNmIsdjEwLjE2YiwjOAorCXJvcgl3MTAsdzEwLCMyNQorCWV4dAl2MTQuMTZiLHYxNC4xNmIsdjE0LjE2YiwjOAorCXJvcgl3MTEsdzExLCMyNQorCWV4dAl2MTguMTZiLHYxOC4xNmIsdjE4LjE2YiwjOAorCXJvcgl3MTIsdzEyLCMyNQorCWV4dAl2MjIuMTZiLHYyMi4xNmIsdjIyLjE2YiwjOAorCXJvcgl3OSx3OSwjMjUKKwlleHQJdjMuMTZiLHYzLjE2Yix2My4xNmIsIzQKKwlleHQJdjcuMTZiLHY3LjE2Yix2Ny4xNmIsIzQKKwlleHQJdjExLjE2Yix2MTEuMTZiLHYxMS4xNmIsIzQKKwlleHQJdjE1LjE2Yix2MTUuMTZiLHYxNS4xNmIsIzQKKwlleHQJdjE5LjE2Yix2MTkuMTZiLHYxOS4xNmIsIzQKKwlleHQJdjIzLjE2Yix2MjMuMTZiLHYyMy4xNmIsIzQKKwlleHQJdjEuMTZiLHYxLjE2Yix2MS4xNmIsIzEyCisJZXh0CXY1LjE2Yix2NS4xNmIsdjUuMTZiLCMxMgorCWV4dAl2OS4xNmIsdjkuMTZiLHY5LjE2YiwjMTIKKwlleHQJdjEzLjE2Yix2MTMuMTZiLHYxMy4xNmIsIzEyCisJZXh0CXYxNy4xNmIsdjE3LjE2Yix2MTcuMTZiLCMxMgorCWV4dAl2MjEuMTZiLHYyMS4xNmIsdjIxLjE2YiwjMTIKKwljYm56CXg0LC5Mb29wX3VwcGVyX25lb24KKworCWFkZAl3NSx3NSx3MjIJCS8vIGFjY3VtdWxhdGUga2V5IGJsb2NrCisJYWRkCXg2LHg2LHgyMixsc3IjMzIKKwlhZGQJdzcsdzcsdzIzCisJYWRkCXg4LHg4LHgyMyxsc3IjMzIKKwlhZGQJdzksdzksdzI0CisJYWRkCXgxMCx4MTAseDI0LGxzciMzMgorCWFkZAl3MTEsdzExLHcyNQorCWFkZAl4MTIseDEyLHgyNSxsc3IjMzIKKwlhZGQJdzEzLHcxMyx3MjYKKwlhZGQJeDE0LHgxNCx4MjYsbHNyIzMyCisJYWRkCXcxNSx3MTUsdzI3CisJYWRkCXgxNix4MTYseDI3LGxzciMzMgorCWFkZAl3MTcsdzE3LHcyOAorCWFkZAl4MTkseDE5LHgyOCxsc3IjMzIKKwlhZGQJdzIwLHcyMCx3MzAKKwlhZGQJeDIxLHgyMSx4MzAsbHNyIzMyCisKKwlhZGQJeDUseDUseDYsbHNsIzMyCS8vIHBhY2sKKwlhZGQJeDcseDcseDgsbHNsIzMyCisJbGRwCXg2LHg4LFt4MSwjMF0JCS8vIGxvYWQgaW5wdXQKKwlhZGQJeDkseDkseDEwLGxzbCMzMgorCWFkZAl4MTEseDExLHgxMixsc2wjMzIKKwlsZHAJeDEwLHgxMixbeDEsIzE2XQorCWFkZAl4MTMseDEzLHgxNCxsc2wjMzIKKwlhZGQJeDE1LHgxNSx4MTYsbHNsIzMyCisJbGRwCXgxNCx4MTYsW3gxLCMzMl0KKwlhZGQJeDE3LHgxNyx4MTksbHNsIzMyCisJYWRkCXgyMCx4MjAseDIxLGxzbCMzMgorCWxkcAl4MTkseDIxLFt4MSwjNDhdCisJYWRkCXgxLHgxLCM2NAorI2lmZGVmCV9fQVJNRUJfXworCXJldgl4NSx4NQorCXJldgl4Nyx4NworCXJldgl4OSx4OQorCXJldgl4MTEseDExCisJcmV2CXgxMyx4MTMKKwlyZXYJeDE1LHgxNQorCXJldgl4MTcseDE3CisJcmV2CXgyMCx4MjAKKyNlbmRpZgorCWVvcgl4NSx4NSx4NgorCWVvcgl4Nyx4Nyx4OAorCWVvcgl4OSx4OSx4MTAKKwllb3IJeDExLHgxMSx4MTIKKwllb3IJeDEzLHgxMyx4MTQKKwllb3IJeDE1LHgxNSx4MTYKKwllb3IJeDE3LHgxNyx4MTkKKwllb3IJeDIwLHgyMCx4MjEKKworCXN0cAl4NSx4NyxbeDAsIzBdCQkvLyBzdG9yZSBvdXRwdXQKKwlhZGQJeDI4LHgyOCwjMQkJCS8vIGluY3JlbWVudCBjb3VudGVyCisJbW92CXc1LHcyMgkJCS8vIHVucGFjayBrZXkgYmxvY2sKKwlsc3IJeDYseDIyLCMzMgorCXN0cAl4OSx4MTEsW3gwLCMxNl0KKwltb3YJdzcsdzIzCisJbHNyCXg4LHgyMywjMzIKKwlzdHAJeDEzLHgxNSxbeDAsIzMyXQorCW1vdgl3OSx3MjQKKwlsc3IJeDEwLHgyNCwjMzIKKwlzdHAJeDE3LHgyMCxbeDAsIzQ4XQorCWFkZAl4MCx4MCwjNjQKKwltb3YJdzExLHcyNQorCWxzcgl4MTIseDI1LCMzMgorCW1vdgl3MTMsdzI2CisJbHNyCXgxNCx4MjYsIzMyCisJbW92CXcxNSx3MjcKKwlsc3IJeDE2LHgyNywjMzIKKwltb3YJdzE3LHcyOAorCWxzcgl4MTkseDI4LCMzMgorCW1vdgl3MjAsdzMwCisJbHNyCXgyMSx4MzAsIzMyCisKKwltb3YJeDQsIzUKKy5Mb29wX2xvd2VyX25lb246CisJc3ViCXg0LHg0LCMxCisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJYWRkCXc1LHc1LHc5CisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJYWRkCXc2LHc2LHcxMAorCWFkZAl2OC40cyx2OC40cyx2OS40cworCWFkZAl3Nyx3Nyx3MTEKKwlhZGQJdjEyLjRzLHYxMi40cyx2MTMuNHMKKwlhZGQJdzgsdzgsdzEyCisJYWRkCXYxNi40cyx2MTYuNHMsdjE3LjRzCisJZW9yCXcxNyx3MTcsdzUKKwlhZGQJdjIwLjRzLHYyMC40cyx2MjEuNHMKKwllb3IJdzE5LHcxOSx3NgorCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgorCWVvcgl3MjAsdzIwLHc3CisJZW9yCXY3LjE2Yix2Ny4xNmIsdjQuMTZiCisJZW9yCXcyMSx3MjEsdzgKKwllb3IJdjExLjE2Yix2MTEuMTZiLHY4LjE2YgorCXJvcgl3MTcsdzE3LCMxNgorCWVvcgl2MTUuMTZiLHYxNS4xNmIsdjEyLjE2YgorCXJvcgl3MTksdzE5LCMxNgorCWVvcgl2MTkuMTZiLHYxOS4xNmIsdjE2LjE2YgorCXJvcgl3MjAsdzIwLCMxNgorCWVvcgl2MjMuMTZiLHYyMy4xNmIsdjIwLjE2YgorCXJvcgl3MjEsdzIxLCMxNgorCXJldjMyCXYzLjhoLHYzLjhoCisJYWRkCXcxMyx3MTMsdzE3CisJcmV2MzIJdjcuOGgsdjcuOGgKKwlhZGQJdzE0LHcxNCx3MTkKKwlyZXYzMgl2MTEuOGgsdjExLjhoCisJYWRkCXcxNSx3MTUsdzIwCisJcmV2MzIJdjE1LjhoLHYxNS44aAorCWFkZAl3MTYsdzE2LHcyMQorCXJldjMyCXYxOS44aCx2MTkuOGgKKwllb3IJdzksdzksdzEzCisJcmV2MzIJdjIzLjhoLHYyMy44aAorCWVvcgl3MTAsdzEwLHcxNAorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCWVvcgl3MTEsdzExLHcxNQorCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCWVvcgl3MTIsdzEyLHcxNgorCWFkZAl2MTAuNHMsdjEwLjRzLHYxMS40cworCXJvcgl3OSx3OSwjMjAKKwlhZGQJdjE0LjRzLHYxNC40cyx2MTUuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjIyLjRzLHYyMi40cyx2MjMuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwllb3IJdjI0LjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXc1LHc1LHc5CisJZW9yCXYyNS4xNmIsdjUuMTZiLHY2LjE2YgorCWFkZAl3Nix3Nix3MTAKKwllb3IJdjI2LjE2Yix2OS4xNmIsdjEwLjE2YgorCWFkZAl3Nyx3Nyx3MTEKKwllb3IJdjI3LjE2Yix2MTMuMTZiLHYxNC4xNmIKKwlhZGQJdzgsdzgsdzEyCisJZW9yCXYyOC4xNmIsdjE3LjE2Yix2MTguMTZiCisJZW9yCXcxNyx3MTcsdzUKKwllb3IJdjI5LjE2Yix2MjEuMTZiLHYyMi4xNmIKKwllb3IJdzE5LHcxOSx3NgorCXVzaHIJdjEuNHMsdjI0LjRzLCMyMAorCWVvcgl3MjAsdzIwLHc3CisJdXNocgl2NS40cyx2MjUuNHMsIzIwCisJZW9yCXcyMSx3MjEsdzgKKwl1c2hyCXY5LjRzLHYyNi40cywjMjAKKwlyb3IJdzE3LHcxNywjMjQKKwl1c2hyCXYxMy40cyx2MjcuNHMsIzIwCisJcm9yCXcxOSx3MTksIzI0CisJdXNocgl2MTcuNHMsdjI4LjRzLCMyMAorCXJvcgl3MjAsdzIwLCMyNAorCXVzaHIJdjIxLjRzLHYyOS40cywjMjAKKwlyb3IJdzIxLHcyMSwjMjQKKwlzbGkJdjEuNHMsdjI0LjRzLCMxMgorCWFkZAl3MTMsdzEzLHcxNworCXNsaQl2NS40cyx2MjUuNHMsIzEyCisJYWRkCXcxNCx3MTQsdzE5CisJc2xpCXY5LjRzLHYyNi40cywjMTIKKwlhZGQJdzE1LHcxNSx3MjAKKwlzbGkJdjEzLjRzLHYyNy40cywjMTIKKwlhZGQJdzE2LHcxNix3MjEKKwlzbGkJdjE3LjRzLHYyOC40cywjMTIKKwllb3IJdzksdzksdzEzCisJc2xpCXYyMS40cyx2MjkuNHMsIzEyCisJZW9yCXcxMCx3MTAsdzE0CisJYWRkCXYwLjRzLHYwLjRzLHYxLjRzCisJZW9yCXcxMSx3MTEsdzE1CisJYWRkCXY0LjRzLHY0LjRzLHY1LjRzCisJZW9yCXcxMix3MTIsdzE2CisJYWRkCXY4LjRzLHY4LjRzLHY5LjRzCisJcm9yCXc5LHc5LCMyNQorCWFkZAl2MTIuNHMsdjEyLjRzLHYxMy40cworCXJvcgl3MTAsdzEwLCMyNQorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCXJvcgl3MTEsdzExLCMyNQorCWFkZAl2MjAuNHMsdjIwLjRzLHYyMS40cworCXJvcgl3MTIsdzEyLCMyNQorCWVvcgl2MjQuMTZiLHYzLjE2Yix2MC4xNmIKKwlhZGQJdzUsdzUsdzEwCisJZW9yCXYyNS4xNmIsdjcuMTZiLHY0LjE2YgorCWFkZAl3Nix3Nix3MTEKKwllb3IJdjI2LjE2Yix2MTEuMTZiLHY4LjE2YgorCWFkZAl3Nyx3Nyx3MTIKKwllb3IJdjI3LjE2Yix2MTUuMTZiLHYxMi4xNmIKKwlhZGQJdzgsdzgsdzkKKwllb3IJdjI4LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwllb3IJdzIxLHcyMSx3NQorCWVvcgl2MjkuMTZiLHYyMy4xNmIsdjIwLjE2YgorCWVvcgl3MTcsdzE3LHc2CisJdXNocgl2My40cyx2MjQuNHMsIzI0CisJZW9yCXcxOSx3MTksdzcKKwl1c2hyCXY3LjRzLHYyNS40cywjMjQKKwllb3IJdzIwLHcyMCx3OAorCXVzaHIJdjExLjRzLHYyNi40cywjMjQKKwlyb3IJdzIxLHcyMSwjMTYKKwl1c2hyCXYxNS40cyx2MjcuNHMsIzI0CisJcm9yCXcxNyx3MTcsIzE2CisJdXNocgl2MTkuNHMsdjI4LjRzLCMyNAorCXJvcgl3MTksdzE5LCMxNgorCXVzaHIJdjIzLjRzLHYyOS40cywjMjQKKwlyb3IJdzIwLHcyMCwjMTYKKwlzbGkJdjMuNHMsdjI0LjRzLCM4CisJYWRkCXcxNSx3MTUsdzIxCisJc2xpCXY3LjRzLHYyNS40cywjOAorCWFkZAl3MTYsdzE2LHcxNworCXNsaQl2MTEuNHMsdjI2LjRzLCM4CisJYWRkCXcxMyx3MTMsdzE5CisJc2xpCXYxNS40cyx2MjcuNHMsIzgKKwlhZGQJdzE0LHcxNCx3MjAKKwlzbGkJdjE5LjRzLHYyOC40cywjOAorCWVvcgl3MTAsdzEwLHcxNQorCXNsaQl2MjMuNHMsdjI5LjRzLCM4CisJZW9yCXcxMSx3MTEsdzE2CisJYWRkCXYyLjRzLHYyLjRzLHYzLjRzCisJZW9yCXcxMix3MTIsdzEzCisJYWRkCXY2LjRzLHY2LjRzLHY3LjRzCisJZW9yCXc5LHc5LHcxNAorCWFkZAl2MTAuNHMsdjEwLjRzLHYxMS40cworCXJvcgl3MTAsdzEwLCMyMAorCWFkZAl2MTQuNHMsdjE0LjRzLHYxNS40cworCXJvcgl3MTEsdzExLCMyMAorCWFkZAl2MTguNHMsdjE4LjRzLHYxOS40cworCXJvcgl3MTIsdzEyLCMyMAorCWFkZAl2MjIuNHMsdjIyLjRzLHYyMy40cworCXJvcgl3OSx3OSwjMjAKKwllb3IJdjI0LjE2Yix2MS4xNmIsdjIuMTZiCisJYWRkCXc1LHc1LHcxMAorCWVvcgl2MjUuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzYsdzYsdzExCisJZW9yCXYyNi4xNmIsdjkuMTZiLHYxMC4xNmIKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYyNy4xNmIsdjEzLjE2Yix2MTQuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXYyOC4xNmIsdjE3LjE2Yix2MTguMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjI5LjE2Yix2MjEuMTZiLHYyMi4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXVzaHIJdjEuNHMsdjI0LjRzLCMyNQorCWVvcgl3MTksdzE5LHc3CisJdXNocgl2NS40cyx2MjUuNHMsIzI1CisJZW9yCXcyMCx3MjAsdzgKKwl1c2hyCXY5LjRzLHYyNi40cywjMjUKKwlyb3IJdzIxLHcyMSwjMjQKKwl1c2hyCXYxMy40cyx2MjcuNHMsIzI1CisJcm9yCXcxNyx3MTcsIzI0CisJdXNocgl2MTcuNHMsdjI4LjRzLCMyNQorCXJvcgl3MTksdzE5LCMyNAorCXVzaHIJdjIxLjRzLHYyOS40cywjMjUKKwlyb3IJdzIwLHcyMCwjMjQKKwlzbGkJdjEuNHMsdjI0LjRzLCM3CisJYWRkCXcxNSx3MTUsdzIxCisJc2xpCXY1LjRzLHYyNS40cywjNworCWFkZAl3MTYsdzE2LHcxNworCXNsaQl2OS40cyx2MjYuNHMsIzcKKwlhZGQJdzEzLHcxMyx3MTkKKwlzbGkJdjEzLjRzLHYyNy40cywjNworCWFkZAl3MTQsdzE0LHcyMAorCXNsaQl2MTcuNHMsdjI4LjRzLCM3CisJZW9yCXcxMCx3MTAsdzE1CisJc2xpCXYyMS40cyx2MjkuNHMsIzcKKwllb3IJdzExLHcxMSx3MTYKKwlleHQJdjIuMTZiLHYyLjE2Yix2Mi4xNmIsIzgKKwllb3IJdzEyLHcxMix3MTMKKwlleHQJdjYuMTZiLHY2LjE2Yix2Ni4xNmIsIzgKKwllb3IJdzksdzksdzE0CisJZXh0CXYxMC4xNmIsdjEwLjE2Yix2MTAuMTZiLCM4CisJcm9yCXcxMCx3MTAsIzI1CisJZXh0CXYxNC4xNmIsdjE0LjE2Yix2MTQuMTZiLCM4CisJcm9yCXcxMSx3MTEsIzI1CisJZXh0CXYxOC4xNmIsdjE4LjE2Yix2MTguMTZiLCM4CisJcm9yCXcxMix3MTIsIzI1CisJZXh0CXYyMi4xNmIsdjIyLjE2Yix2MjIuMTZiLCM4CisJcm9yCXc5LHc5LCMyNQorCWV4dAl2My4xNmIsdjMuMTZiLHYzLjE2YiwjMTIKKwlleHQJdjcuMTZiLHY3LjE2Yix2Ny4xNmIsIzEyCisJZXh0CXYxMS4xNmIsdjExLjE2Yix2MTEuMTZiLCMxMgorCWV4dAl2MTUuMTZiLHYxNS4xNmIsdjE1LjE2YiwjMTIKKwlleHQJdjE5LjE2Yix2MTkuMTZiLHYxOS4xNmIsIzEyCisJZXh0CXYyMy4xNmIsdjIzLjE2Yix2MjMuMTZiLCMxMgorCWV4dAl2MS4xNmIsdjEuMTZiLHYxLjE2YiwjNAorCWV4dAl2NS4xNmIsdjUuMTZiLHY1LjE2YiwjNAorCWV4dAl2OS4xNmIsdjkuMTZiLHY5LjE2YiwjNAorCWV4dAl2MTMuMTZiLHYxMy4xNmIsdjEzLjE2YiwjNAorCWV4dAl2MTcuMTZiLHYxNy4xNmIsdjE3LjE2YiwjNAorCWV4dAl2MjEuMTZiLHYyMS4xNmIsdjIxLjE2YiwjNAorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWFkZAl3NSx3NSx3OQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWFkZAl3Nix3Nix3MTAKKwlhZGQJdjguNHMsdjguNHMsdjkuNHMKKwlhZGQJdzcsdzcsdzExCisJYWRkCXYxMi40cyx2MTIuNHMsdjEzLjRzCisJYWRkCXc4LHc4LHcxMgorCWFkZAl2MTYuNHMsdjE2LjRzLHYxNy40cworCWVvcgl3MTcsdzE3LHc1CisJYWRkCXYyMC40cyx2MjAuNHMsdjIxLjRzCisJZW9yCXcxOSx3MTksdzYKKwllb3IJdjMuMTZiLHYzLjE2Yix2MC4xNmIKKwllb3IJdzIwLHcyMCx3NworCWVvcgl2Ny4xNmIsdjcuMTZiLHY0LjE2YgorCWVvcgl3MjEsdzIxLHc4CisJZW9yCXYxMS4xNmIsdjExLjE2Yix2OC4xNmIKKwlyb3IJdzE3LHcxNywjMTYKKwllb3IJdjE1LjE2Yix2MTUuMTZiLHYxMi4xNmIKKwlyb3IJdzE5LHcxOSwjMTYKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxNi4xNmIKKwlyb3IJdzIwLHcyMCwjMTYKKwllb3IJdjIzLjE2Yix2MjMuMTZiLHYyMC4xNmIKKwlyb3IJdzIxLHcyMSwjMTYKKwlyZXYzMgl2My44aCx2My44aAorCWFkZAl3MTMsdzEzLHcxNworCXJldjMyCXY3LjhoLHY3LjhoCisJYWRkCXcxNCx3MTQsdzE5CisJcmV2MzIJdjExLjhoLHYxMS44aAorCWFkZAl3MTUsdzE1LHcyMAorCXJldjMyCXYxNS44aCx2MTUuOGgKKwlhZGQJdzE2LHcxNix3MjEKKwlyZXYzMgl2MTkuOGgsdjE5LjhoCisJZW9yCXc5LHc5LHcxMworCXJldjMyCXYyMy44aCx2MjMuOGgKKwllb3IJdzEwLHcxMCx3MTQKKwlhZGQJdjIuNHMsdjIuNHMsdjMuNHMKKwllb3IJdzExLHcxMSx3MTUKKwlhZGQJdjYuNHMsdjYuNHMsdjcuNHMKKwllb3IJdzEyLHcxMix3MTYKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzksdzksIzIwCisJYWRkCXYxNC40cyx2MTQuNHMsdjE1LjRzCisJcm9yCXcxMCx3MTAsIzIwCisJYWRkCXYxOC40cyx2MTguNHMsdjE5LjRzCisJcm9yCXcxMSx3MTEsIzIwCisJYWRkCXYyMi40cyx2MjIuNHMsdjIzLjRzCisJcm9yCXcxMix3MTIsIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3OQorCWVvcgl2MjUuMTZiLHY1LjE2Yix2Ni4xNmIKKwlhZGQJdzYsdzYsdzEwCisJZW9yCXYyNi4xNmIsdjkuMTZiLHYxMC4xNmIKKwlhZGQJdzcsdzcsdzExCisJZW9yCXYyNy4xNmIsdjEzLjE2Yix2MTQuMTZiCisJYWRkCXc4LHc4LHcxMgorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MTcsdzE3LHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxOSx3MTksdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjAKKwllb3IJdzIwLHcyMCx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyMAorCWVvcgl3MjEsdzIxLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzIwCisJcm9yCXcxNyx3MTcsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyMAorCXJvcgl3MTksdzE5LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjAKKwlyb3IJdzIwLHcyMCwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzIwCisJcm9yCXcyMSx3MjEsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjMTIKKwlhZGQJdzEzLHcxMyx3MTcKKwlzbGkJdjUuNHMsdjI1LjRzLCMxMgorCWFkZAl3MTQsdzE0LHcxOQorCXNsaQl2OS40cyx2MjYuNHMsIzEyCisJYWRkCXcxNSx3MTUsdzIwCisJc2xpCXYxMy40cyx2MjcuNHMsIzEyCisJYWRkCXcxNix3MTYsdzIxCisJc2xpCXYxNy40cyx2MjguNHMsIzEyCisJZW9yCXc5LHc5LHcxMworCXNsaQl2MjEuNHMsdjI5LjRzLCMxMgorCWVvcgl3MTAsdzEwLHcxNAorCWFkZAl2MC40cyx2MC40cyx2MS40cworCWVvcgl3MTEsdzExLHcxNQorCWFkZAl2NC40cyx2NC40cyx2NS40cworCWVvcgl3MTIsdzEyLHcxNgorCWFkZAl2OC40cyx2OC40cyx2OS40cworCXJvcgl3OSx3OSwjMjUKKwlhZGQJdjEyLjRzLHYxMi40cyx2MTMuNHMKKwlyb3IJdzEwLHcxMCwjMjUKKwlhZGQJdjE2LjRzLHYxNi40cyx2MTcuNHMKKwlyb3IJdzExLHcxMSwjMjUKKwlhZGQJdjIwLjRzLHYyMC40cyx2MjEuNHMKKwlyb3IJdzEyLHcxMiwjMjUKKwllb3IJdjI0LjE2Yix2My4xNmIsdjAuMTZiCisJYWRkCXc1LHc1LHcxMAorCWVvcgl2MjUuMTZiLHY3LjE2Yix2NC4xNmIKKwlhZGQJdzYsdzYsdzExCisJZW9yCXYyNi4xNmIsdjExLjE2Yix2OC4xNmIKKwlhZGQJdzcsdzcsdzEyCisJZW9yCXYyNy4xNmIsdjE1LjE2Yix2MTIuMTZiCisJYWRkCXc4LHc4LHc5CisJZW9yCXYyOC4xNmIsdjE5LjE2Yix2MTYuMTZiCisJZW9yCXcyMSx3MjEsdzUKKwllb3IJdjI5LjE2Yix2MjMuMTZiLHYyMC4xNmIKKwllb3IJdzE3LHcxNyx3NgorCXVzaHIJdjMuNHMsdjI0LjRzLCMyNAorCWVvcgl3MTksdzE5LHc3CisJdXNocgl2Ny40cyx2MjUuNHMsIzI0CisJZW9yCXcyMCx3MjAsdzgKKwl1c2hyCXYxMS40cyx2MjYuNHMsIzI0CisJcm9yCXcyMSx3MjEsIzE2CisJdXNocgl2MTUuNHMsdjI3LjRzLCMyNAorCXJvcgl3MTcsdzE3LCMxNgorCXVzaHIJdjE5LjRzLHYyOC40cywjMjQKKwlyb3IJdzE5LHcxOSwjMTYKKwl1c2hyCXYyMy40cyx2MjkuNHMsIzI0CisJcm9yCXcyMCx3MjAsIzE2CisJc2xpCXYzLjRzLHYyNC40cywjOAorCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2Ny40cyx2MjUuNHMsIzgKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjExLjRzLHYyNi40cywjOAorCWFkZAl3MTMsdzEzLHcxOQorCXNsaQl2MTUuNHMsdjI3LjRzLCM4CisJYWRkCXcxNCx3MTQsdzIwCisJc2xpCXYxOS40cyx2MjguNHMsIzgKKwllb3IJdzEwLHcxMCx3MTUKKwlzbGkJdjIzLjRzLHYyOS40cywjOAorCWVvcgl3MTEsdzExLHcxNgorCWFkZAl2Mi40cyx2Mi40cyx2My40cworCWVvcgl3MTIsdzEyLHcxMworCWFkZAl2Ni40cyx2Ni40cyx2Ny40cworCWVvcgl3OSx3OSx3MTQKKwlhZGQJdjEwLjRzLHYxMC40cyx2MTEuNHMKKwlyb3IJdzEwLHcxMCwjMjAKKwlhZGQJdjE0LjRzLHYxNC40cyx2MTUuNHMKKwlyb3IJdzExLHcxMSwjMjAKKwlhZGQJdjE4LjRzLHYxOC40cyx2MTkuNHMKKwlyb3IJdzEyLHcxMiwjMjAKKwlhZGQJdjIyLjRzLHYyMi40cyx2MjMuNHMKKwlyb3IJdzksdzksIzIwCisJZW9yCXYyNC4xNmIsdjEuMTZiLHYyLjE2YgorCWFkZAl3NSx3NSx3MTAKKwllb3IJdjI1LjE2Yix2NS4xNmIsdjYuMTZiCisJYWRkCXc2LHc2LHcxMQorCWVvcgl2MjYuMTZiLHY5LjE2Yix2MTAuMTZiCisJYWRkCXc3LHc3LHcxMgorCWVvcgl2MjcuMTZiLHYxMy4xNmIsdjE0LjE2YgorCWFkZAl3OCx3OCx3OQorCWVvcgl2MjguMTZiLHYxNy4xNmIsdjE4LjE2YgorCWVvcgl3MjEsdzIxLHc1CisJZW9yCXYyOS4xNmIsdjIxLjE2Yix2MjIuMTZiCisJZW9yCXcxNyx3MTcsdzYKKwl1c2hyCXYxLjRzLHYyNC40cywjMjUKKwllb3IJdzE5LHcxOSx3NworCXVzaHIJdjUuNHMsdjI1LjRzLCMyNQorCWVvcgl3MjAsdzIwLHc4CisJdXNocgl2OS40cyx2MjYuNHMsIzI1CisJcm9yCXcyMSx3MjEsIzI0CisJdXNocgl2MTMuNHMsdjI3LjRzLCMyNQorCXJvcgl3MTcsdzE3LCMyNAorCXVzaHIJdjE3LjRzLHYyOC40cywjMjUKKwlyb3IJdzE5LHcxOSwjMjQKKwl1c2hyCXYyMS40cyx2MjkuNHMsIzI1CisJcm9yCXcyMCx3MjAsIzI0CisJc2xpCXYxLjRzLHYyNC40cywjNworCWFkZAl3MTUsdzE1LHcyMQorCXNsaQl2NS40cyx2MjUuNHMsIzcKKwlhZGQJdzE2LHcxNix3MTcKKwlzbGkJdjkuNHMsdjI2LjRzLCM3CisJYWRkCXcxMyx3MTMsdzE5CisJc2xpCXYxMy40cyx2MjcuNHMsIzcKKwlhZGQJdzE0LHcxNCx3MjAKKwlzbGkJdjE3LjRzLHYyOC40cywjNworCWVvcgl3MTAsdzEwLHcxNQorCXNsaQl2MjEuNHMsdjI5LjRzLCM3CisJZW9yCXcxMSx3MTEsdzE2CisJZXh0CXYyLjE2Yix2Mi4xNmIsdjIuMTZiLCM4CisJZW9yCXcxMix3MTIsdzEzCisJZXh0CXY2LjE2Yix2Ni4xNmIsdjYuMTZiLCM4CisJZW9yCXc5LHc5LHcxNAorCWV4dAl2MTAuMTZiLHYxMC4xNmIsdjEwLjE2YiwjOAorCXJvcgl3MTAsdzEwLCMyNQorCWV4dAl2MTQuMTZiLHYxNC4xNmIsdjE0LjE2YiwjOAorCXJvcgl3MTEsdzExLCMyNQorCWV4dAl2MTguMTZiLHYxOC4xNmIsdjE4LjE2YiwjOAorCXJvcgl3MTIsdzEyLCMyNQorCWV4dAl2MjIuMTZiLHYyMi4xNmIsdjIyLjE2YiwjOAorCXJvcgl3OSx3OSwjMjUKKwlleHQJdjMuMTZiLHYzLjE2Yix2My4xNmIsIzQKKwlleHQJdjcuMTZiLHY3LjE2Yix2Ny4xNmIsIzQKKwlleHQJdjExLjE2Yix2MTEuMTZiLHYxMS4xNmIsIzQKKwlleHQJdjE1LjE2Yix2MTUuMTZiLHYxNS4xNmIsIzQKKwlleHQJdjE5LjE2Yix2MTkuMTZiLHYxOS4xNmIsIzQKKwlleHQJdjIzLjE2Yix2MjMuMTZiLHYyMy4xNmIsIzQKKwlleHQJdjEuMTZiLHYxLjE2Yix2MS4xNmIsIzEyCisJZXh0CXY1LjE2Yix2NS4xNmIsdjUuMTZiLCMxMgorCWV4dAl2OS4xNmIsdjkuMTZiLHY5LjE2YiwjMTIKKwlleHQJdjEzLjE2Yix2MTMuMTZiLHYxMy4xNmIsIzEyCisJZXh0CXYxNy4xNmIsdjE3LjE2Yix2MTcuMTZiLCMxMgorCWV4dAl2MjEuMTZiLHYyMS4xNmIsdjIxLjE2YiwjMTIKKwljYm56CXg0LC5Mb29wX2xvd2VyX25lb24KKworCWFkZAl3NSx3NSx3MjIJCS8vIGFjY3VtdWxhdGUga2V5IGJsb2NrCisJbGRwCXEyNCxxMjUsW3NwLCMwXQorCWFkZAl4Nix4Nix4MjIsbHNyIzMyCisJbGRwCXEyNixxMjcsW3NwLCMzMl0KKwlhZGQJdzcsdzcsdzIzCisJbGRwCXEyOCxxMjksW3NwLCM2NF0KKwlhZGQJeDgseDgseDIzLGxzciMzMgorCWFkZAl2MC40cyx2MC40cyx2MjQuNHMKKwlhZGQJdzksdzksdzI0CisJYWRkCXY0LjRzLHY0LjRzLHYyNC40cworCWFkZAl4MTAseDEwLHgyNCxsc3IjMzIKKwlhZGQJdjguNHMsdjguNHMsdjI0LjRzCisJYWRkCXcxMSx3MTEsdzI1CisJYWRkCXYxMi40cyx2MTIuNHMsdjI0LjRzCisJYWRkCXgxMix4MTIseDI1LGxzciMzMgorCWFkZAl2MTYuNHMsdjE2LjRzLHYyNC40cworCWFkZAl3MTMsdzEzLHcyNgorCWFkZAl2MjAuNHMsdjIwLjRzLHYyNC40cworCWFkZAl4MTQseDE0LHgyNixsc3IjMzIKKwlhZGQJdjIuNHMsdjIuNHMsdjI2LjRzCisJYWRkCXcxNSx3MTUsdzI3CisJYWRkCXY2LjRzLHY2LjRzLHYyNi40cworCWFkZAl4MTYseDE2LHgyNyxsc3IjMzIKKwlhZGQJdjEwLjRzLHYxMC40cyx2MjYuNHMKKwlhZGQJdzE3LHcxNyx3MjgKKwlhZGQJdjE0LjRzLHYxNC40cyx2MjYuNHMKKwlhZGQJeDE5LHgxOSx4MjgsbHNyIzMyCisJYWRkCXYxOC40cyx2MTguNHMsdjI2LjRzCisJYWRkCXcyMCx3MjAsdzMwCisJYWRkCXYyMi40cyx2MjIuNHMsdjI2LjRzCisJYWRkCXgyMSx4MjEseDMwLGxzciMzMgorCWFkZAl2MTkuNHMsdjE5LjRzLHYzMS40cwkJCS8vICs0CisJYWRkCXg1LHg1LHg2LGxzbCMzMgkvLyBwYWNrCisJYWRkCXYyMy40cyx2MjMuNHMsdjMxLjRzCQkJLy8gKzQKKwlhZGQJeDcseDcseDgsbHNsIzMyCisJYWRkCXYzLjRzLHYzLjRzLHYyNy40cworCWxkcAl4Nix4OCxbeDEsIzBdCQkvLyBsb2FkIGlucHV0CisJYWRkCXY3LjRzLHY3LjRzLHYyOC40cworCWFkZAl4OSx4OSx4MTAsbHNsIzMyCisJYWRkCXYxMS40cyx2MTEuNHMsdjI5LjRzCisJYWRkCXgxMSx4MTEseDEyLGxzbCMzMgorCWFkZAl2MTUuNHMsdjE1LjRzLHYzMC40cworCWxkcAl4MTAseDEyLFt4MSwjMTZdCisJYWRkCXYxOS40cyx2MTkuNHMsdjI3LjRzCisJYWRkCXgxMyx4MTMseDE0LGxzbCMzMgorCWFkZAl2MjMuNHMsdjIzLjRzLHYyOC40cworCWFkZAl4MTUseDE1LHgxNixsc2wjMzIKKwlhZGQJdjEuNHMsdjEuNHMsdjI1LjRzCisJbGRwCXgxNCx4MTYsW3gxLCMzMl0KKwlhZGQJdjUuNHMsdjUuNHMsdjI1LjRzCisJYWRkCXgxNyx4MTcseDE5LGxzbCMzMgorCWFkZAl2OS40cyx2OS40cyx2MjUuNHMKKwlhZGQJeDIwLHgyMCx4MjEsbHNsIzMyCisJYWRkCXYxMy40cyx2MTMuNHMsdjI1LjRzCisJbGRwCXgxOSx4MjEsW3gxLCM0OF0KKwlhZGQJdjE3LjRzLHYxNy40cyx2MjUuNHMKKwlhZGQJeDEseDEsIzY0CisJYWRkCXYyMS40cyx2MjEuNHMsdjI1LjRzCisKKyNpZmRlZglfX0FSTUVCX18KKwlyZXYJeDUseDUKKwlyZXYJeDcseDcKKwlyZXYJeDkseDkKKwlyZXYJeDExLHgxMQorCXJldgl4MTMseDEzCisJcmV2CXgxNSx4MTUKKwlyZXYJeDE3LHgxNworCXJldgl4MjAseDIwCisjZW5kaWYKKwlsZDEJe3YyNC4xNmIsdjI1LjE2Yix2MjYuMTZiLHYyNy4xNmJ9LFt4MV0sIzY0CisJZW9yCXg1LHg1LHg2CisJZW9yCXg3LHg3LHg4CisJZW9yCXg5LHg5LHgxMAorCWVvcgl4MTEseDExLHgxMgorCWVvcgl4MTMseDEzLHgxNAorCWVvcgl2MC4xNmIsdjAuMTZiLHYyNC4xNmIKKwllb3IJeDE1LHgxNSx4MTYKKwllb3IJdjEuMTZiLHYxLjE2Yix2MjUuMTZiCisJZW9yCXgxNyx4MTcseDE5CisJZW9yCXYyLjE2Yix2Mi4xNmIsdjI2LjE2YgorCWVvcgl4MjAseDIwLHgyMQorCWVvcgl2My4xNmIsdjMuMTZiLHYyNy4xNmIKKwlsZDEJe3YyNC4xNmIsdjI1LjE2Yix2MjYuMTZiLHYyNy4xNmJ9LFt4MV0sIzY0CisKKwlzdHAJeDUseDcsW3gwLCMwXQkJLy8gc3RvcmUgb3V0cHV0CisJYWRkCXgyOCx4MjgsIzcJCQkvLyBpbmNyZW1lbnQgY291bnRlcgorCXN0cAl4OSx4MTEsW3gwLCMxNl0KKwlzdHAJeDEzLHgxNSxbeDAsIzMyXQorCXN0cAl4MTcseDIwLFt4MCwjNDhdCisJYWRkCXgwLHgwLCM2NAorCXN0MQl7djAuMTZiLHYxLjE2Yix2Mi4xNmIsdjMuMTZifSxbeDBdLCM2NAorCisJbGQxCXt2MC4xNmIsdjEuMTZiLHYyLjE2Yix2My4xNmJ9LFt4MV0sIzY0CisJZW9yCXY0LjE2Yix2NC4xNmIsdjI0LjE2YgorCWVvcgl2NS4xNmIsdjUuMTZiLHYyNS4xNmIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MjYuMTZiCisJZW9yCXY3LjE2Yix2Ny4xNmIsdjI3LjE2YgorCXN0MQl7djQuMTZiLHY1LjE2Yix2Ni4xNmIsdjcuMTZifSxbeDBdLCM2NAorCisJbGQxCXt2NC4xNmIsdjUuMTZiLHY2LjE2Yix2Ny4xNmJ9LFt4MV0sIzY0CisJZW9yCXY4LjE2Yix2OC4xNmIsdjAuMTZiCisJbGRwCXEyNCxxMjUsW3NwLCMwXQorCWVvcgl2OS4xNmIsdjkuMTZiLHYxLjE2YgorCWxkcAlxMjYscTI3LFtzcCwjMzJdCisJZW9yCXYxMC4xNmIsdjEwLjE2Yix2Mi4xNmIKKwllb3IJdjExLjE2Yix2MTEuMTZiLHYzLjE2YgorCXN0MQl7djguMTZiLHY5LjE2Yix2MTAuMTZiLHYxMS4xNmJ9LFt4MF0sIzY0CisKKwlsZDEJe3Y4LjE2Yix2OS4xNmIsdjEwLjE2Yix2MTEuMTZifSxbeDFdLCM2NAorCWVvcgl2MTIuMTZiLHYxMi4xNmIsdjQuMTZiCisJZW9yCXYxMy4xNmIsdjEzLjE2Yix2NS4xNmIKKwllb3IJdjE0LjE2Yix2MTQuMTZiLHY2LjE2YgorCWVvcgl2MTUuMTZiLHYxNS4xNmIsdjcuMTZiCisJc3QxCXt2MTIuMTZiLHYxMy4xNmIsdjE0LjE2Yix2MTUuMTZifSxbeDBdLCM2NAorCisJbGQxCXt2MTIuMTZiLHYxMy4xNmIsdjE0LjE2Yix2MTUuMTZifSxbeDFdLCM2NAorCWVvcgl2MTYuMTZiLHYxNi4xNmIsdjguMTZiCisJZW9yCXYxNy4xNmIsdjE3LjE2Yix2OS4xNmIKKwllb3IJdjE4LjE2Yix2MTguMTZiLHYxMC4xNmIKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxMS4xNmIKKwlzdDEJe3YxNi4xNmIsdjE3LjE2Yix2MTguMTZiLHYxOS4xNmJ9LFt4MF0sIzY0CisKKwlzaGwJdjAuNHMsdjMxLjRzLCMxCQkJLy8gNCAtPiA4CisJZW9yCXYyMC4xNmIsdjIwLjE2Yix2MTIuMTZiCisJZW9yCXYyMS4xNmIsdjIxLjE2Yix2MTMuMTZiCisJZW9yCXYyMi4xNmIsdjIyLjE2Yix2MTQuMTZiCisJZW9yCXYyMy4xNmIsdjIzLjE2Yix2MTUuMTZiCisJc3QxCXt2MjAuMTZiLHYyMS4xNmIsdjIyLjE2Yix2MjMuMTZifSxbeDBdLCM2NAorCisJYWRkCXYyNy40cyx2MjcuNHMsdjAuNHMJCQkvLyArPSA4CisJYWRkCXYyOC40cyx2MjguNHMsdjAuNHMKKwlhZGQJdjI5LjRzLHYyOS40cyx2MC40cworCWFkZAl2MzAuNHMsdjMwLjRzLHYwLjRzCisKKwliLmhzCS5Mb29wX291dGVyXzUxMl9uZW9uCisKKwlhZGRzCXgyLHgyLCM1MTIKKwl1c2hyCXYwLjRzLHYzMS40cywjMgkJCS8vIDQgLT4gMQorCisJbGRwCWQ4LGQ5LFtzcCwjMTI4KzBdCQkvLyBtZWV0IEFCSSByZXF1aXJlbWVudHMKKwlsZHAJZDEwLGQxMSxbc3AsIzEyOCsxNl0KKwlsZHAJZDEyLGQxMyxbc3AsIzEyOCszMl0KKwlsZHAJZDE0LGQxNSxbc3AsIzEyOCs0OF0KKworCXN0cAlxMjQscTMxLFtzcCwjMF0JCS8vIHdpcGUgb2ZmLWxvYWQgYXJlYQorCXN0cAlxMjQscTMxLFtzcCwjMzJdCisJc3RwCXEyNCxxMzEsW3NwLCM2NF0KKworCWIuZXEJLkxkb25lXzUxMl9uZW9uCisKKwljbXAJeDIsIzE5MgorCXN1Ygl2MjcuNHMsdjI3LjRzLHYwLjRzCQkJLy8gLT0gMQorCXN1Ygl2MjguNHMsdjI4LjRzLHYwLjRzCisJc3ViCXYyOS40cyx2MjkuNHMsdjAuNHMKKwlhZGQJc3Asc3AsIzEyOAorCWIuaHMJLkxvb3Bfb3V0ZXJfbmVvbgorCisJZW9yCXYyNS4xNmIsdjI1LjE2Yix2MjUuMTZiCisJZW9yCXYyNi4xNmIsdjI2LjE2Yix2MjYuMTZiCisJZW9yCXYyNy4xNmIsdjI3LjE2Yix2MjcuMTZiCisJZW9yCXYyOC4xNmIsdjI4LjE2Yix2MjguMTZiCisJZW9yCXYyOS4xNmIsdjI5LjE2Yix2MjkuMTZiCisJZW9yCXYzMC4xNmIsdjMwLjE2Yix2MzAuMTZiCisJYgkuTG9vcF9vdXRlcgorCisuTGRvbmVfNTEyX25lb246CisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCMxMjgrNjQKKwlsZHAJeDIxLHgyMixbeDI5LCMzMl0KKwlsZHAJeDIzLHgyNCxbeDI5LCM0OF0KKwlsZHAJeDI1LHgyNixbeDI5LCM2NF0KKwlsZHAJeDI3LHgyOCxbeDI5LCM4MF0KKwlsZHAJeDI5LHgzMCxbc3BdLCM5NgorCXJldAorLnNpemUJQ2hhQ2hhMjBfNTEyX25lb24sLi1DaGFDaGEyMF81MTJfbmVvbgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzdjgtYXJteDY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzdjgtYXJteDY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwMzc3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9hZXN2OC1hcm14NjQuUwpAQCAtMCwwICsxLDc1NSBAQAorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLnRleHQKKy5hcmNoCWFybXY4LWErY3J5cHRvCisuYWxpZ24JNQorLkxyY29uOgorLmxvbmcJMHgwMSwweDAxLDB4MDEsMHgwMQorLmxvbmcJMHgwYzBmMGUwZCwweDBjMGYwZTBkLDB4MGMwZjBlMGQsMHgwYzBmMGUwZAkvLyByb3RhdGUtbi1zcGxhdAorLmxvbmcJMHgxYiwweDFiLDB4MWIsMHgxYgorCisuZ2xvYmwJYWVzX2h3X3NldF9lbmNyeXB0X2tleQorLmhpZGRlbglhZXNfaHdfc2V0X2VuY3J5cHRfa2V5CisudHlwZQlhZXNfaHdfc2V0X2VuY3J5cHRfa2V5LCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19zZXRfZW5jcnlwdF9rZXk6CisuTGVuY19rZXk6CisJc3RwCXgyOSx4MzAsW3NwLCMtMTZdIQorCWFkZAl4Mjksc3AsIzAKKwltb3YJeDMsIy0xCisJY21wCXgwLCMwCisJYi5lcQkuTGVuY19rZXlfYWJvcnQKKwljbXAJeDIsIzAKKwliLmVxCS5MZW5jX2tleV9hYm9ydAorCW1vdgl4MywjLTIKKwljbXAJdzEsIzEyOAorCWIubHQJLkxlbmNfa2V5X2Fib3J0CisJY21wCXcxLCMyNTYKKwliLmd0CS5MZW5jX2tleV9hYm9ydAorCXRzdAl3MSwjMHgzZgorCWIubmUJLkxlbmNfa2V5X2Fib3J0CisKKwlhZHIJeDMsLkxyY29uCisJY21wCXcxLCMxOTIKKworCWVvcgl2MC4xNmIsdjAuMTZiLHYwLjE2YgorCWxkMQl7djMuMTZifSxbeDBdLCMxNgorCW1vdgl3MSwjOAkJLy8gcmV1c2UgdzEKKwlsZDEJe3YxLjRzLHYyLjRzfSxbeDNdLCMzMgorCisJYi5sdAkuTG9vcDEyOAorCWIuZXEJLkwxOTIKKwliCS5MMjU2CisKKy5hbGlnbgk0CisuTG9vcDEyODoKKwl0YmwJdjYuMTZiLHt2My4xNmJ9LHYyLjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHYzLjE2YiwjMTIKKwlzdDEJe3YzLjRzfSxbeDJdLCMxNgorCWFlc2UJdjYuMTZiLHYwLjE2YgorCXN1YnMJdzEsdzEsIzEKKworCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHY1LjE2YiwjMTIKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXY2LjE2Yix2Ni4xNmIsdjEuMTZiCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJc2hsCXYxLjE2Yix2MS4xNmIsIzEKKwllb3IJdjMuMTZiLHYzLjE2Yix2Ni4xNmIKKwliLm5lCS5Mb29wMTI4CisKKwlsZDEJe3YxLjRzfSxbeDNdCisKKwl0YmwJdjYuMTZiLHt2My4xNmJ9LHYyLjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHYzLjE2YiwjMTIKKwlzdDEJe3YzLjRzfSxbeDJdLCMxNgorCWFlc2UJdjYuMTZiLHYwLjE2YgorCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHY1LjE2YiwjMTIKKwllb3IJdjYuMTZiLHY2LjE2Yix2MS4xNmIKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlzaGwJdjEuMTZiLHYxLjE2YiwjMQorCWVvcgl2My4xNmIsdjMuMTZiLHY2LjE2YgorCisJdGJsCXY2LjE2Yix7djMuMTZifSx2Mi4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2My4xNmIsIzEyCisJc3QxCXt2My40c30sW3gyXSwjMTYKKwlhZXNlCXY2LjE2Yix2MC4xNmIKKworCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHY1LjE2YiwjMTIKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXY2LjE2Yix2Ni4xNmIsdjEuMTZiCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZW9yCXYzLjE2Yix2My4xNmIsdjYuMTZiCisJc3QxCXt2My40c30sW3gyXQorCWFkZAl4Mix4MiwjMHg1MAorCisJbW92CXcxMiwjMTAKKwliCS5MZG9uZQorCisuYWxpZ24JNAorLkwxOTI6CisJbGQxCXt2NC44Yn0sW3gwXSwjOAorCW1vdmkJdjYuMTZiLCM4CQkJLy8gYm9ycm93IHY2LjE2YgorCXN0MQl7djMuNHN9LFt4Ml0sIzE2CisJc3ViCXYyLjE2Yix2Mi4xNmIsdjYuMTZiCS8vIGFkanVzdCB0aGUgbWFzaworCisuTG9vcDE5MjoKKwl0YmwJdjYuMTZiLHt2NC4xNmJ9LHYyLjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHYzLjE2YiwjMTIKKwlzdDEJe3Y0LjhifSxbeDJdLCM4CisJYWVzZQl2Ni4xNmIsdjAuMTZiCisJc3Vicwl3MSx3MSwjMQorCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCWV4dAl2NS4xNmIsdjAuMTZiLHY1LjE2YiwjMTIKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKworCWR1cAl2NS40cyx2My5zWzNdCisJZW9yCXY1LjE2Yix2NS4xNmIsdjQuMTZiCisJZW9yCXY2LjE2Yix2Ni4xNmIsdjEuMTZiCisJZXh0CXY0LjE2Yix2MC4xNmIsdjQuMTZiLCMxMgorCXNobAl2MS4xNmIsdjEuMTZiLCMxCisJZW9yCXY0LjE2Yix2NC4xNmIsdjUuMTZiCisJZW9yCXYzLjE2Yix2My4xNmIsdjYuMTZiCisJZW9yCXY0LjE2Yix2NC4xNmIsdjYuMTZiCisJc3QxCXt2My40c30sW3gyXSwjMTYKKwliLm5lCS5Mb29wMTkyCisKKwltb3YJdzEyLCMxMgorCWFkZAl4Mix4MiwjMHgyMAorCWIJLkxkb25lCisKKy5hbGlnbgk0CisuTDI1NjoKKwlsZDEJe3Y0LjE2Yn0sW3gwXQorCW1vdgl3MSwjNworCW1vdgl3MTIsIzE0CisJc3QxCXt2My40c30sW3gyXSwjMTYKKworLkxvb3AyNTY6CisJdGJsCXY2LjE2Yix7djQuMTZifSx2Mi4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2My4xNmIsIzEyCisJc3QxCXt2NC40c30sW3gyXSwjMTYKKwlhZXNlCXY2LjE2Yix2MC4xNmIKKwlzdWJzCXcxLHcxLCMxCisKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXYzLjE2Yix2My4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2Ni4xNmIsdjYuMTZiLHYxLjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHY1LjE2YgorCXNobAl2MS4xNmIsdjEuMTZiLCMxCisJZW9yCXYzLjE2Yix2My4xNmIsdjYuMTZiCisJc3QxCXt2My40c30sW3gyXSwjMTYKKwliLmVxCS5MZG9uZQorCisJZHVwCXY2LjRzLHYzLnNbM10JCS8vIGp1c3Qgc3BsYXQKKwlleHQJdjUuMTZiLHYwLjE2Yix2NC4xNmIsIzEyCisJYWVzZQl2Ni4xNmIsdjAuMTZiCisKKwllb3IJdjQuMTZiLHY0LjE2Yix2NS4xNmIKKwlleHQJdjUuMTZiLHYwLjE2Yix2NS4xNmIsIzEyCisJZW9yCXY0LjE2Yix2NC4xNmIsdjUuMTZiCisJZXh0CXY1LjE2Yix2MC4xNmIsdjUuMTZiLCMxMgorCWVvcgl2NC4xNmIsdjQuMTZiLHY1LjE2YgorCisJZW9yCXY0LjE2Yix2NC4xNmIsdjYuMTZiCisJYgkuTG9vcDI1NgorCisuTGRvbmU6CisJc3RyCXcxMixbeDJdCisJbW92CXgzLCMwCisKKy5MZW5jX2tleV9hYm9ydDoKKwltb3YJeDAseDMJCQkvLyByZXR1cm4gdmFsdWUKKwlsZHIJeDI5LFtzcF0sIzE2CisJcmV0Cisuc2l6ZQlhZXNfaHdfc2V0X2VuY3J5cHRfa2V5LC4tYWVzX2h3X3NldF9lbmNyeXB0X2tleQorCisuZ2xvYmwJYWVzX2h3X3NldF9kZWNyeXB0X2tleQorLmhpZGRlbglhZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlhZXNfaHdfc2V0X2RlY3J5cHRfa2V5LCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19zZXRfZGVjcnlwdF9rZXk6CisJc3RwCXgyOSx4MzAsW3NwLCMtMTZdIQorCWFkZAl4Mjksc3AsIzAKKwlibAkuTGVuY19rZXkKKworCWNtcAl4MCwjMAorCWIubmUJLkxkZWNfa2V5X2Fib3J0CisKKwlzdWIJeDIseDIsIzI0MAkJLy8gcmVzdG9yZSBvcmlnaW5hbCB4MgorCW1vdgl4NCwjLTE2CisJYWRkCXgwLHgyLHgxMixsc2wjNAkvLyBlbmQgb2Yga2V5IHNjaGVkdWxlCisKKwlsZDEJe3YwLjRzfSxbeDJdCisJbGQxCXt2MS40c30sW3gwXQorCXN0MQl7djAuNHN9LFt4MF0seDQKKwlzdDEJe3YxLjRzfSxbeDJdLCMxNgorCisuTG9vcF9pbWM6CisJbGQxCXt2MC40c30sW3gyXQorCWxkMQl7djEuNHN9LFt4MF0KKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJc3QxCXt2MC40c30sW3gwXSx4NAorCXN0MQl7djEuNHN9LFt4Ml0sIzE2CisJY21wCXgwLHgyCisJYi5oaQkuTG9vcF9pbWMKKworCWxkMQl7djAuNHN9LFt4Ml0KKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCXN0MQl7djAuNHN9LFt4MF0KKworCWVvcgl4MCx4MCx4MAkJLy8gcmV0dXJuIHZhbHVlCisuTGRlY19rZXlfYWJvcnQ6CisJbGRwCXgyOSx4MzAsW3NwXSwjMTYKKwlyZXQKKy5zaXplCWFlc19od19zZXRfZGVjcnlwdF9rZXksLi1hZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisuZ2xvYmwJYWVzX2h3X2VuY3J5cHQKKy5oaWRkZW4JYWVzX2h3X2VuY3J5cHQKKy50eXBlCWFlc19od19lbmNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19lbmNyeXB0OgorCWxkcgl3MyxbeDIsIzI0MF0KKwlsZDEJe3YwLjRzfSxbeDJdLCMxNgorCWxkMQl7djIuMTZifSxbeDBdCisJc3ViCXczLHczLCMyCisJbGQxCXt2MS40c30sW3gyXSwjMTYKKworLkxvb3BfZW5jOgorCWFlc2UJdjIuMTZiLHYwLjE2YgorCWFlc21jCXYyLjE2Yix2Mi4xNmIKKwlsZDEJe3YwLjRzfSxbeDJdLCMxNgorCXN1YnMJdzMsdzMsIzIKKwlhZXNlCXYyLjE2Yix2MS4xNmIKKwlhZXNtYwl2Mi4xNmIsdjIuMTZiCisJbGQxCXt2MS40c30sW3gyXSwjMTYKKwliLmd0CS5Mb29wX2VuYworCisJYWVzZQl2Mi4xNmIsdjAuMTZiCisJYWVzbWMJdjIuMTZiLHYyLjE2YgorCWxkMQl7djAuNHN9LFt4Ml0KKwlhZXNlCXYyLjE2Yix2MS4xNmIKKwllb3IJdjIuMTZiLHYyLjE2Yix2MC4xNmIKKworCXN0MQl7djIuMTZifSxbeDFdCisJcmV0Cisuc2l6ZQlhZXNfaHdfZW5jcnlwdCwuLWFlc19od19lbmNyeXB0CisuZ2xvYmwJYWVzX2h3X2RlY3J5cHQKKy5oaWRkZW4JYWVzX2h3X2RlY3J5cHQKKy50eXBlCWFlc19od19kZWNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19kZWNyeXB0OgorCWxkcgl3MyxbeDIsIzI0MF0KKwlsZDEJe3YwLjRzfSxbeDJdLCMxNgorCWxkMQl7djIuMTZifSxbeDBdCisJc3ViCXczLHczLCMyCisJbGQxCXt2MS40c30sW3gyXSwjMTYKKworLkxvb3BfZGVjOgorCWFlc2QJdjIuMTZiLHYwLjE2YgorCWFlc2ltYwl2Mi4xNmIsdjIuMTZiCisJbGQxCXt2MC40c30sW3gyXSwjMTYKKwlzdWJzCXczLHczLCMyCisJYWVzZAl2Mi4xNmIsdjEuMTZiCisJYWVzaW1jCXYyLjE2Yix2Mi4xNmIKKwlsZDEJe3YxLjRzfSxbeDJdLCMxNgorCWIuZ3QJLkxvb3BfZGVjCisKKwlhZXNkCXYyLjE2Yix2MC4xNmIKKwlhZXNpbWMJdjIuMTZiLHYyLjE2YgorCWxkMQl7djAuNHN9LFt4Ml0KKwlhZXNkCXYyLjE2Yix2MS4xNmIKKwllb3IJdjIuMTZiLHYyLjE2Yix2MC4xNmIKKworCXN0MQl7djIuMTZifSxbeDFdCisJcmV0Cisuc2l6ZQlhZXNfaHdfZGVjcnlwdCwuLWFlc19od19kZWNyeXB0CisuZ2xvYmwJYWVzX2h3X2NiY19lbmNyeXB0CisuaGlkZGVuCWFlc19od19jYmNfZW5jcnlwdAorLnR5cGUJYWVzX2h3X2NiY19lbmNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19jYmNfZW5jcnlwdDoKKwlzdHAJeDI5LHgzMCxbc3AsIy0xNl0hCisJYWRkCXgyOSxzcCwjMAorCXN1YnMJeDIseDIsIzE2CisJbW92CXg4LCMxNgorCWIubG8JLkxjYmNfYWJvcnQKKwljc2VsCXg4LHh6cix4OCxlcQorCisJY21wCXc1LCMwCQkJLy8gZW4tIG9yIGRlY3J5cHRpbmc/CisJbGRyCXc1LFt4MywjMjQwXQorCWFuZAl4Mix4MiwjLTE2CisJbGQxCXt2Ni4xNmJ9LFt4NF0KKwlsZDEJe3YwLjE2Yn0sW3gwXSx4OAorCisJbGQxCXt2MTYuNHMsdjE3LjRzfSxbeDNdCQkvLyBsb2FkIGtleSBzY2hlZHVsZS4uLgorCXN1Ygl3NSx3NSwjNgorCWFkZAl4Nyx4Myx4NSxsc2wjNAkvLyBwb2ludGVyIHRvIGxhc3QgNyByb3VuZCBrZXlzCisJc3ViCXc1LHc1LCMyCisJbGQxCXt2MTguNHMsdjE5LjRzfSxbeDddLCMzMgorCWxkMQl7djIwLjRzLHYyMS40c30sW3g3XSwjMzIKKwlsZDEJe3YyMi40cyx2MjMuNHN9LFt4N10sIzMyCisJbGQxCXt2Ny40c30sW3g3XQorCisJYWRkCXg3LHgzLCMzMgorCW1vdgl3Nix3NQorCWIuZXEJLkxjYmNfZGVjCisKKwljbXAJdzUsIzIKKwllb3IJdjAuMTZiLHYwLjE2Yix2Ni4xNmIKKwllb3IJdjUuMTZiLHYxNi4xNmIsdjcuMTZiCisJYi5lcQkuTGNiY19lbmMxMjgKKworCWxkMQl7djIuNHMsdjMuNHN9LFt4N10KKwlhZGQJeDcseDMsIzE2CisJYWRkCXg2LHgzLCMxNio0CisJYWRkCXgxMix4MywjMTYqNQorCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWRkCXgxNCx4MywjMTYqNgorCWFkZAl4Myx4MywjMTYqNworCWIJLkxlbnRlcl9jYmNfZW5jCisKKy5hbGlnbgk0CisuTG9vcF9jYmNfZW5jOgorCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJc3QxCXt2Ni4xNmJ9LFt4MV0sIzE2CisuTGVudGVyX2NiY19lbmM6CisJYWVzZQl2MC4xNmIsdjE3LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlhZXNlCXYwLjE2Yix2Mi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTYuNHN9LFt4Nl0KKwljbXAJdzUsIzQKKwlhZXNlCXYwLjE2Yix2My4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTcuNHN9LFt4MTJdCisJYi5lcQkuTGNiY19lbmMxOTIKKworCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTYuNHN9LFt4MTRdCisJYWVzZQl2MC4xNmIsdjE3LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlsZDEJe3YxNy40c30sW3gzXQorCW5vcAorCisuTGNiY19lbmMxOTI6CisJYWVzZQl2MC4xNmIsdjE2LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlzdWJzCXgyLHgyLCMxNgorCWFlc2UJdjAuMTZiLHYxNy4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJY3NlbAl4OCx4enIseDgsZXEKKwlhZXNlCXYwLjE2Yix2MTguMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjAuMTZiLHYxOS4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTYuMTZifSxbeDBdLHg4CisJYWVzZQl2MC4xNmIsdjIwLjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwllb3IJdjE2LjE2Yix2MTYuMTZiLHY1LjE2YgorCWFlc2UJdjAuMTZiLHYyMS4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJbGQxCXt2MTcuNHN9LFt4N10JCS8vIHJlLXByZS1sb2FkIHJuZGtleVsxXQorCWFlc2UJdjAuMTZiLHYyMi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MC4xNmIsdjIzLjE2YgorCWVvcgl2Ni4xNmIsdjAuMTZiLHY3LjE2YgorCWIuaHMJLkxvb3BfY2JjX2VuYworCisJc3QxCXt2Ni4xNmJ9LFt4MV0sIzE2CisJYgkuTGNiY19kb25lCisKKy5hbGlnbgk1CisuTGNiY19lbmMxMjg6CisJbGQxCXt2Mi40cyx2My40c30sW3g3XQorCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYgkuTGVudGVyX2NiY19lbmMxMjgKKy5Mb29wX2NiY19lbmMxMjg6CisJYWVzZQl2MC4xNmIsdjE2LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlzdDEJe3Y2LjE2Yn0sW3gxXSwjMTYKKy5MZW50ZXJfY2JjX2VuYzEyODoKKwlhZXNlCXYwLjE2Yix2MTcuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCXN1YnMJeDIseDIsIzE2CisJYWVzZQl2MC4xNmIsdjIuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWNzZWwJeDgseHpyLHg4LGVxCisJYWVzZQl2MC4xNmIsdjMuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjAuMTZiLHYxOC4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MC4xNmIsdjE5LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlsZDEJe3YxNi4xNmJ9LFt4MF0seDgKKwlhZXNlCXYwLjE2Yix2MjAuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjAuMTZiLHYyMS4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MC4xNmIsdjIyLjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwllb3IJdjE2LjE2Yix2MTYuMTZiLHY1LjE2YgorCWFlc2UJdjAuMTZiLHYyMy4xNmIKKwllb3IJdjYuMTZiLHYwLjE2Yix2Ny4xNmIKKwliLmhzCS5Mb29wX2NiY19lbmMxMjgKKworCXN0MQl7djYuMTZifSxbeDFdLCMxNgorCWIJLkxjYmNfZG9uZQorLmFsaWduCTUKKy5MY2JjX2RlYzoKKwlsZDEJe3YxOC4xNmJ9LFt4MF0sIzE2CisJc3Vicwl4Mix4MiwjMzIJCS8vIGJpYXMKKwlhZGQJdzYsdzUsIzIKKwlvcnIJdjMuMTZiLHYwLjE2Yix2MC4xNmIKKwlvcnIJdjEuMTZiLHYwLjE2Yix2MC4xNmIKKwlvcnIJdjE5LjE2Yix2MTguMTZiLHYxOC4xNmIKKwliLmxvCS5MY2JjX2RlY190YWlsCisKKwlvcnIJdjEuMTZiLHYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djE4LjE2Yn0sW3gwXSwjMTYKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKwlvcnIJdjMuMTZiLHYxLjE2Yix2MS4xNmIKKwlvcnIJdjE5LjE2Yix2MTguMTZiLHYxOC4xNmIKKworLkxvb3AzeF9jYmNfZGVjOgorCWFlc2QJdjAuMTZiLHYxNi4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYxNi4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MTYuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djE2LjRzfSxbeDddLCMxNgorCXN1YnMJdzYsdzYsIzIKKwlhZXNkCXYwLjE2Yix2MTcuMTZiCisJYWVzaW1jCXYwLjE2Yix2MC4xNmIKKwlhZXNkCXYxLjE2Yix2MTcuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjE3LjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwlsZDEJe3YxNy40c30sW3g3XSwjMTYKKwliLmd0CS5Mb29wM3hfY2JjX2RlYworCisJYWVzZAl2MC4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MC4xNmIsdjAuMTZiCisJYWVzZAl2MS4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYxNi4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJZW9yCXY0LjE2Yix2Ni4xNmIsdjcuMTZiCisJc3Vicwl4Mix4MiwjMHgzMAorCWVvcgl2NS4xNmIsdjIuMTZiLHY3LjE2YgorCWNzZWwJeDYseDIseDYsbG8JCQkvLyB4NiwgdzYsIGlzIHplcm8gYXQgdGhpcyBwb2ludAorCWFlc2QJdjAuMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MTcuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWVvcgl2MTcuMTZiLHYzLjE2Yix2Ny4xNmIKKwlhZGQJeDAseDAseDYJCS8vIHgwIGlzIGFkanVzdGVkIGluIHN1Y2ggd2F5IHRoYXQKKwkJCQkJLy8gYXQgZXhpdCBmcm9tIHRoZSBsb29wIHYxLjE2Yi12MTguMTZiCisJCQkJCS8vIGFyZSBsb2FkZWQgd2l0aCBsYXN0ICJ3b3JkcyIKKwlvcnIJdjYuMTZiLHYxOS4xNmIsdjE5LjE2YgorCW1vdgl4Nyx4MworCWFlc2QJdjAuMTZiLHYyMC4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYyMC4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MjAuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djIuMTZifSxbeDBdLCMxNgorCWFlc2QJdjAuMTZiLHYyMS4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYyMS4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MjEuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djMuMTZifSxbeDBdLCMxNgorCWFlc2QJdjAuMTZiLHYyMi4xNmIKKwlhZXNpbWMJdjAuMTZiLHYwLjE2YgorCWFlc2QJdjEuMTZiLHYyMi4xNmIKKwlhZXNpbWMJdjEuMTZiLHYxLjE2YgorCWFlc2QJdjE4LjE2Yix2MjIuMTZiCisJYWVzaW1jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djE5LjE2Yn0sW3gwXSwjMTYKKwlhZXNkCXYwLjE2Yix2MjMuMTZiCisJYWVzZAl2MS4xNmIsdjIzLjE2YgorCWFlc2QJdjE4LjE2Yix2MjMuMTZiCisJbGQxCXt2MTYuNHN9LFt4N10sIzE2CS8vIHJlLXByZS1sb2FkIHJuZGtleVswXQorCWFkZAl3Nix3NSwjMgorCWVvcgl2NC4xNmIsdjQuMTZiLHYwLjE2YgorCWVvcgl2NS4xNmIsdjUuMTZiLHYxLjE2YgorCWVvcgl2MTguMTZiLHYxOC4xNmIsdjE3LjE2YgorCWxkMQl7djE3LjRzfSxbeDddLCMxNgkvLyByZS1wcmUtbG9hZCBybmRrZXlbMV0KKwlzdDEJe3Y0LjE2Yn0sW3gxXSwjMTYKKwlvcnIJdjAuMTZiLHYyLjE2Yix2Mi4xNmIKKwlzdDEJe3Y1LjE2Yn0sW3gxXSwjMTYKKwlvcnIJdjEuMTZiLHYzLjE2Yix2My4xNmIKKwlzdDEJe3YxOC4xNmJ9LFt4MV0sIzE2CisJb3JyCXYxOC4xNmIsdjE5LjE2Yix2MTkuMTZiCisJYi5ocwkuTG9vcDN4X2NiY19kZWMKKworCWNtbgl4MiwjMHgzMAorCWIuZXEJLkxjYmNfZG9uZQorCW5vcAorCisuTGNiY19kZWNfdGFpbDoKKwlhZXNkCXYxLjE2Yix2MTYuMTZiCisJYWVzaW1jCXYxLjE2Yix2MS4xNmIKKwlhZXNkCXYxOC4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MTguMTZiLHYxOC4xNmIKKwlsZDEJe3YxNi40c30sW3g3XSwjMTYKKwlzdWJzCXc2LHc2LCMyCisJYWVzZAl2MS4xNmIsdjE3LjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJbGQxCXt2MTcuNHN9LFt4N10sIzE2CisJYi5ndAkuTGNiY19kZWNfdGFpbAorCisJYWVzZAl2MS4xNmIsdjE2LjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYxNi4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJYWVzZAl2MS4xNmIsdjE3LjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYxNy4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJYWVzZAl2MS4xNmIsdjIwLjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYyMC4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJY21uCXgyLCMweDIwCisJYWVzZAl2MS4xNmIsdjIxLjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYyMS4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJZW9yCXY1LjE2Yix2Ni4xNmIsdjcuMTZiCisJYWVzZAl2MS4xNmIsdjIyLjE2YgorCWFlc2ltYwl2MS4xNmIsdjEuMTZiCisJYWVzZAl2MTguMTZiLHYyMi4xNmIKKwlhZXNpbWMJdjE4LjE2Yix2MTguMTZiCisJZW9yCXYxNy4xNmIsdjMuMTZiLHY3LjE2YgorCWFlc2QJdjEuMTZiLHYyMy4xNmIKKwlhZXNkCXYxOC4xNmIsdjIzLjE2YgorCWIuZXEJLkxjYmNfZGVjX29uZQorCWVvcgl2NS4xNmIsdjUuMTZiLHYxLjE2YgorCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjE4LjE2YgorCW9ycgl2Ni4xNmIsdjE5LjE2Yix2MTkuMTZiCisJc3QxCXt2NS4xNmJ9LFt4MV0sIzE2CisJc3QxCXt2MTcuMTZifSxbeDFdLCMxNgorCWIJLkxjYmNfZG9uZQorCisuTGNiY19kZWNfb25lOgorCWVvcgl2NS4xNmIsdjUuMTZiLHYxOC4xNmIKKwlvcnIJdjYuMTZiLHYxOS4xNmIsdjE5LjE2YgorCXN0MQl7djUuMTZifSxbeDFdLCMxNgorCisuTGNiY19kb25lOgorCXN0MQl7djYuMTZifSxbeDRdCisuTGNiY19hYm9ydDoKKwlsZHIJeDI5LFtzcF0sIzE2CisJcmV0Cisuc2l6ZQlhZXNfaHdfY2JjX2VuY3J5cHQsLi1hZXNfaHdfY2JjX2VuY3J5cHQKKy5nbG9ibAlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy5oaWRkZW4JYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzCisudHlwZQlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MsJWZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzOgorCXN0cAl4MjkseDMwLFtzcCwjLTE2XSEKKwlhZGQJeDI5LHNwLCMwCisJbGRyCXc1LFt4MywjMjQwXQorCisJbGRyCXc4LCBbeDQsICMxMl0KKwlsZDEJe3YwLjRzfSxbeDRdCisKKwlsZDEJe3YxNi40cyx2MTcuNHN9LFt4M10JCS8vIGxvYWQga2V5IHNjaGVkdWxlLi4uCisJc3ViCXc1LHc1LCM0CisJbW92CXgxMiwjMTYKKwljbXAJeDIsIzIKKwlhZGQJeDcseDMseDUsbHNsIzQJLy8gcG9pbnRlciB0byBsYXN0IDUgcm91bmQga2V5cworCXN1Ygl3NSx3NSwjMgorCWxkMQl7djIwLjRzLHYyMS40c30sW3g3XSwjMzIKKwlsZDEJe3YyMi40cyx2MjMuNHN9LFt4N10sIzMyCisJbGQxCXt2Ny40c30sW3g3XQorCWFkZAl4Nyx4MywjMzIKKwltb3YJdzYsdzUKKwljc2VsCXgxMix4enIseDEyLGxvCisjaWZuZGVmIF9fQVJNRUJfXworCXJldgl3OCwgdzgKKyNlbmRpZgorCW9ycgl2MS4xNmIsdjAuMTZiLHYwLjE2YgorCWFkZAl3MTAsIHc4LCAjMQorCW9ycgl2MTguMTZiLHYwLjE2Yix2MC4xNmIKKwlhZGQJdzgsIHc4LCAjMgorCW9ycgl2Ni4xNmIsdjAuMTZiLHYwLjE2YgorCXJldgl3MTAsIHcxMAorCW1vdgl2MS5zWzNdLHcxMAorCWIubHMJLkxjdHIzMl90YWlsCisJcmV2CXcxMiwgdzgKKwlzdWIJeDIseDIsIzMJCS8vIGJpYXMKKwltb3YJdjE4LnNbM10sdzEyCisJYgkuTG9vcDN4X2N0cjMyCisKKy5hbGlnbgk0CisuTG9vcDN4X2N0cjMyOgorCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjE2LjE2YgorCWFlc21jCXYxLjE2Yix2MS4xNmIKKwlhZXNlCXYxOC4xNmIsdjE2LjE2YgorCWFlc21jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djE2LjRzfSxbeDddLCMxNgorCXN1YnMJdzYsdzYsIzIKKwlhZXNlCXYwLjE2Yix2MTcuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYxNy4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJYWVzZQl2MTguMTZiLHYxNy4xNmIKKwlhZXNtYwl2MTguMTZiLHYxOC4xNmIKKwlsZDEJe3YxNy40c30sW3g3XSwjMTYKKwliLmd0CS5Mb29wM3hfY3RyMzIKKworCWFlc2UJdjAuMTZiLHYxNi4xNmIKKwlhZXNtYwl2NC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjE2LjE2YgorCWFlc21jCXY1LjE2Yix2MS4xNmIKKwlsZDEJe3YyLjE2Yn0sW3gwXSwjMTYKKwlvcnIJdjAuMTZiLHY2LjE2Yix2Ni4xNmIKKwlhZXNlCXYxOC4xNmIsdjE2LjE2YgorCWFlc21jCXYxOC4xNmIsdjE4LjE2YgorCWxkMQl7djMuMTZifSxbeDBdLCMxNgorCW9ycgl2MS4xNmIsdjYuMTZiLHY2LjE2YgorCWFlc2UJdjQuMTZiLHYxNy4xNmIKKwlhZXNtYwl2NC4xNmIsdjQuMTZiCisJYWVzZQl2NS4xNmIsdjE3LjE2YgorCWFlc21jCXY1LjE2Yix2NS4xNmIKKwlsZDEJe3YxOS4xNmJ9LFt4MF0sIzE2CisJbW92CXg3LHgzCisJYWVzZQl2MTguMTZiLHYxNy4xNmIKKwlhZXNtYwl2MTcuMTZiLHYxOC4xNmIKKwlvcnIJdjE4LjE2Yix2Ni4xNmIsdjYuMTZiCisJYWRkCXc5LHc4LCMxCisJYWVzZQl2NC4xNmIsdjIwLjE2YgorCWFlc21jCXY0LjE2Yix2NC4xNmIKKwlhZXNlCXY1LjE2Yix2MjAuMTZiCisJYWVzbWMJdjUuMTZiLHY1LjE2YgorCWVvcgl2Mi4xNmIsdjIuMTZiLHY3LjE2YgorCWFkZAl3MTAsdzgsIzIKKwlhZXNlCXYxNy4xNmIsdjIwLjE2YgorCWFlc21jCXYxNy4xNmIsdjE3LjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHY3LjE2YgorCWFkZAl3OCx3OCwjMworCWFlc2UJdjQuMTZiLHYyMS4xNmIKKwlhZXNtYwl2NC4xNmIsdjQuMTZiCisJYWVzZQl2NS4xNmIsdjIxLjE2YgorCWFlc21jCXY1LjE2Yix2NS4xNmIKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHY3LjE2YgorCXJldgl3OSx3OQorCWFlc2UJdjE3LjE2Yix2MjEuMTZiCisJYWVzbWMJdjE3LjE2Yix2MTcuMTZiCisJbW92CXYwLnNbM10sIHc5CisJcmV2CXcxMCx3MTAKKwlhZXNlCXY0LjE2Yix2MjIuMTZiCisJYWVzbWMJdjQuMTZiLHY0LjE2YgorCWFlc2UJdjUuMTZiLHYyMi4xNmIKKwlhZXNtYwl2NS4xNmIsdjUuMTZiCisJbW92CXYxLnNbM10sIHcxMAorCXJldgl3MTIsdzgKKwlhZXNlCXYxNy4xNmIsdjIyLjE2YgorCWFlc21jCXYxNy4xNmIsdjE3LjE2YgorCW1vdgl2MTguc1szXSwgdzEyCisJc3Vicwl4Mix4MiwjMworCWFlc2UJdjQuMTZiLHYyMy4xNmIKKwlhZXNlCXY1LjE2Yix2MjMuMTZiCisJYWVzZQl2MTcuMTZiLHYyMy4xNmIKKworCWVvcgl2Mi4xNmIsdjIuMTZiLHY0LjE2YgorCWxkMQl7djE2LjRzfSxbeDddLCMxNgkvLyByZS1wcmUtbG9hZCBybmRrZXlbMF0KKwlzdDEJe3YyLjE2Yn0sW3gxXSwjMTYKKwllb3IJdjMuMTZiLHYzLjE2Yix2NS4xNmIKKwltb3YJdzYsdzUKKwlzdDEJe3YzLjE2Yn0sW3gxXSwjMTYKKwllb3IJdjE5LjE2Yix2MTkuMTZiLHYxNy4xNmIKKwlsZDEJe3YxNy40c30sW3g3XSwjMTYJLy8gcmUtcHJlLWxvYWQgcm5ka2V5WzFdCisJc3QxCXt2MTkuMTZifSxbeDFdLCMxNgorCWIuaHMJLkxvb3AzeF9jdHIzMgorCisJYWRkcwl4Mix4MiwjMworCWIuZXEJLkxjdHIzMl9kb25lCisJY21wCXgyLCMxCisJbW92CXgxMiwjMTYKKwljc2VsCXgxMix4enIseDEyLGVxCisKKy5MY3RyMzJfdGFpbDoKKwlhZXNlCXYwLjE2Yix2MTYuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYxNi4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJbGQxCXt2MTYuNHN9LFt4N10sIzE2CisJc3Vicwl3Nix3NiwjMgorCWFlc2UJdjAuMTZiLHYxNy4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjE3LjE2YgorCWFlc21jCXYxLjE2Yix2MS4xNmIKKwlsZDEJe3YxNy40c30sW3g3XSwjMTYKKwliLmd0CS5MY3RyMzJfdGFpbAorCisJYWVzZQl2MC4xNmIsdjE2LjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlhZXNlCXYxLjE2Yix2MTYuMTZiCisJYWVzbWMJdjEuMTZiLHYxLjE2YgorCWFlc2UJdjAuMTZiLHYxNy4xNmIKKwlhZXNtYwl2MC4xNmIsdjAuMTZiCisJYWVzZQl2MS4xNmIsdjE3LjE2YgorCWFlc21jCXYxLjE2Yix2MS4xNmIKKwlsZDEJe3YyLjE2Yn0sW3gwXSx4MTIKKwlhZXNlCXYwLjE2Yix2MjAuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYyMC4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJbGQxCXt2My4xNmJ9LFt4MF0KKwlhZXNlCXYwLjE2Yix2MjEuMTZiCisJYWVzbWMJdjAuMTZiLHYwLjE2YgorCWFlc2UJdjEuMTZiLHYyMS4xNmIKKwlhZXNtYwl2MS4xNmIsdjEuMTZiCisJZW9yCXYyLjE2Yix2Mi4xNmIsdjcuMTZiCisJYWVzZQl2MC4xNmIsdjIyLjE2YgorCWFlc21jCXYwLjE2Yix2MC4xNmIKKwlhZXNlCXYxLjE2Yix2MjIuMTZiCisJYWVzbWMJdjEuMTZiLHYxLjE2YgorCWVvcgl2My4xNmIsdjMuMTZiLHY3LjE2YgorCWFlc2UJdjAuMTZiLHYyMy4xNmIKKwlhZXNlCXYxLjE2Yix2MjMuMTZiCisKKwljbXAJeDIsIzEKKwllb3IJdjIuMTZiLHYyLjE2Yix2MC4xNmIKKwllb3IJdjMuMTZiLHYzLjE2Yix2MS4xNmIKKwlzdDEJe3YyLjE2Yn0sW3gxXSwjMTYKKwliLmVxCS5MY3RyMzJfZG9uZQorCXN0MQl7djMuMTZifSxbeDFdCisKKy5MY3RyMzJfZG9uZToKKwlsZHIJeDI5LFtzcF0sIzE2CisJcmV0Cisuc2l6ZQlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MsLi1hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYXJtdjgtbW9udC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL2FybXY4LW1vbnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDcwMmRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL2FybXY4LW1vbnQuUwpAQCAtMCwwICsxLDE0MDcgQEAKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorLnRleHQKKworLmdsb2JsCWJuX211bF9tb250CisuaGlkZGVuCWJuX211bF9tb250CisudHlwZQlibl9tdWxfbW9udCwlZnVuY3Rpb24KKy5hbGlnbgk1Citibl9tdWxfbW9udDoKKwl0c3QJeDUsIzcKKwliLmVxCV9fYm5fc3FyOHhfbW9udAorCXRzdAl4NSwjMworCWIuZXEJX19ibl9tdWw0eF9tb250CisuTG11bF9tb250OgorCXN0cAl4MjkseDMwLFtzcCwjLTY0XSEKKwlhZGQJeDI5LHNwLCMwCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisKKwlsZHIJeDksW3gyXSwjOAkJLy8gYnBbMF0KKwlzdWIJeDIyLHNwLHg1LGxzbCMzCisJbGRwCXg3LHg4LFt4MV0sIzE2CS8vIGFwWzAuLjFdCisJbHNsCXg1LHg1LCMzCisJbGRyCXg0LFt4NF0JCS8vICpuMAorCWFuZAl4MjIseDIyLCMtMTYJCS8vIEFCSSBzYXlzIHNvCisJbGRwCXgxMyx4MTQsW3gzXSwjMTYJLy8gbnBbMC4uMV0KKworCW11bAl4Nix4Nyx4OQkJLy8gYXBbMF0qYnBbMF0KKwlzdWIJeDIxLHg1LCMxNgkJLy8gaj1udW0tMgorCXVtdWxoCXg3LHg3LHg5CisJbXVsCXgxMCx4OCx4OQkJLy8gYXBbMV0qYnBbMF0KKwl1bXVsaAl4MTEseDgseDkKKworCW11bAl4MTUseDYseDQJCS8vICJ0cFswXSIqbjAKKwltb3YJc3AseDIyCQkJLy8gYWxsb2NhCisKKwkvLyAoKikJbXVsCXgxMix4MTMseDE1CS8vIG5wWzBdKm0xCisJdW11bGgJeDEzLHgxMyx4MTUKKwltdWwJeDE2LHgxNCx4MTUJCS8vIG5wWzFdKm0xCisJLy8gKCopCWFkZHMJeDEyLHgxMix4NgkvLyBkaXNjYXJkZWQKKwkvLyAoKikJQXMgZm9yIHJlbW92YWwgb2YgZmlyc3QgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uCisJLy8JaW5zdHJ1Y3Rpb25zLiBUaGUgb3V0Y29tZSBvZiBmaXJzdCBhZGRpdGlvbiBpcworCS8vCWd1YXJhbnRlZWQgdG8gYmUgemVybywgd2hpY2ggbGVhdmVzIHR3byBjb21wdXRhdGlvbmFsbHkKKwkvLwlzaWduaWZpY2FudCBvdXRjb21lczogaXQgZWl0aGVyIGNhcnJpZXMgb3Igbm90LiBUaGVuCisJLy8JcXVlc3Rpb24gaXMgd2hlbiBkb2VzIGl0IGNhcnJ5PyBJcyB0aGVyZSBhbHRlcm5hdGl2ZQorCS8vCXdheSB0byBkZWR1Y2UgaXQ/IElmIHlvdSBmb2xsb3cgb3BlcmF0aW9ucywgeW91IGNhbgorCS8vCW9ic2VydmUgdGhhdCBjb25kaXRpb24gZm9yIGNhcnJ5IGlzIHF1aXRlIHNpbXBsZToKKwkvLwl4NiBiZWluZyBub24temVyby4gU28gdGhhdCBjYXJyeSBjYW4gYmUgY2FsY3VsYXRlZAorCS8vCWJ5IGFkZGluZyAtMSB0byB4Ni4gVGhhdCdzIHdoYXQgbmV4dCBpbnN0cnVjdGlvbiBkb2VzLgorCXN1YnMJeHpyLHg2LCMxCQkvLyAoKikKKwl1bXVsaAl4MTcseDE0LHgxNQorCWFkYwl4MTMseDEzLHh6cgorCWNiegl4MjEsLkwxc3Rfc2tpcAorCisuTDFzdDoKKwlsZHIJeDgsW3gxXSwjOAorCWFkZHMJeDYseDEwLHg3CisJc3ViCXgyMSx4MjEsIzgJCS8vIGotLQorCWFkYwl4Nyx4MTEseHpyCisKKwlsZHIJeDE0LFt4M10sIzgKKwlhZGRzCXgxMix4MTYseDEzCisJbXVsCXgxMCx4OCx4OQkJLy8gYXBbal0qYnBbMF0KKwlhZGMJeDEzLHgxNyx4enIKKwl1bXVsaAl4MTEseDgseDkKKworCWFkZHMJeDEyLHgxMix4NgorCW11bAl4MTYseDE0LHgxNQkJLy8gbnBbal0qbTEKKwlhZGMJeDEzLHgxMyx4enIKKwl1bXVsaAl4MTcseDE0LHgxNQorCXN0cgl4MTIsW3gyMl0sIzgJCS8vIHRwW2otMV0KKwljYm56CXgyMSwuTDFzdAorCisuTDFzdF9za2lwOgorCWFkZHMJeDYseDEwLHg3CisJc3ViCXgxLHgxLHg1CQkvLyByZXdpbmQgeDEKKwlhZGMJeDcseDExLHh6cgorCisJYWRkcwl4MTIseDE2LHgxMworCXN1Ygl4Myx4Myx4NQkJLy8gcmV3aW5kIHgzCisJYWRjCXgxMyx4MTcseHpyCisKKwlhZGRzCXgxMix4MTIseDYKKwlzdWIJeDIwLHg1LCM4CQkvLyBpPW51bS0xCisJYWRjcwl4MTMseDEzLHg3CisKKwlhZGMJeDE5LHh6cix4enIJCS8vIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwlzdHAJeDEyLHgxMyxbeDIyXQorCisuTG91dGVyOgorCWxkcgl4OSxbeDJdLCM4CQkvLyBicFtpXQorCWxkcAl4Nyx4OCxbeDFdLCMxNgorCWxkcgl4MjMsW3NwXQkJLy8gdHBbMF0KKwlhZGQJeDIyLHNwLCM4CisKKwltdWwJeDYseDcseDkJCS8vIGFwWzBdKmJwW2ldCisJc3ViCXgyMSx4NSwjMTYJCS8vIGo9bnVtLTIKKwl1bXVsaAl4Nyx4Nyx4OQorCWxkcAl4MTMseDE0LFt4M10sIzE2CisJbXVsCXgxMCx4OCx4OQkJLy8gYXBbMV0qYnBbaV0KKwlhZGRzCXg2LHg2LHgyMworCXVtdWxoCXgxMSx4OCx4OQorCWFkYwl4Nyx4Nyx4enIKKworCW11bAl4MTUseDYseDQKKwlzdWIJeDIwLHgyMCwjOAkJLy8gaS0tCisKKwkvLyAoKikJbXVsCXgxMix4MTMseDE1CS8vIG5wWzBdKm0xCisJdW11bGgJeDEzLHgxMyx4MTUKKwltdWwJeDE2LHgxNCx4MTUJCS8vIG5wWzFdKm0xCisJLy8gKCopCWFkZHMJeDEyLHgxMix4NgorCXN1YnMJeHpyLHg2LCMxCQkvLyAoKikKKwl1bXVsaAl4MTcseDE0LHgxNQorCWNiegl4MjEsLkxpbm5lcl9za2lwCisKKy5MaW5uZXI6CisJbGRyCXg4LFt4MV0sIzgKKwlhZGMJeDEzLHgxMyx4enIKKwlsZHIJeDIzLFt4MjJdLCM4CQkvLyB0cFtqXQorCWFkZHMJeDYseDEwLHg3CisJc3ViCXgyMSx4MjEsIzgJCS8vIGotLQorCWFkYwl4Nyx4MTEseHpyCisKKwlhZGRzCXgxMix4MTYseDEzCisJbGRyCXgxNCxbeDNdLCM4CisJYWRjCXgxMyx4MTcseHpyCisKKwltdWwJeDEwLHg4LHg5CQkvLyBhcFtqXSpicFtpXQorCWFkZHMJeDYseDYseDIzCisJdW11bGgJeDExLHg4LHg5CisJYWRjCXg3LHg3LHh6cgorCisJbXVsCXgxNix4MTQseDE1CQkvLyBucFtqXSptMQorCWFkZHMJeDEyLHgxMix4NgorCXVtdWxoCXgxNyx4MTQseDE1CisJc3RyCXgxMixbeDIyLCMtMTZdCQkvLyB0cFtqLTFdCisJY2Juegl4MjEsLkxpbm5lcgorCisuTGlubmVyX3NraXA6CisJbGRyCXgyMyxbeDIyXSwjOAkJLy8gdHBbal0KKwlhZGMJeDEzLHgxMyx4enIKKwlhZGRzCXg2LHgxMCx4NworCXN1Ygl4MSx4MSx4NQkJLy8gcmV3aW5kIHgxCisJYWRjCXg3LHgxMSx4enIKKworCWFkZHMJeDEyLHgxNix4MTMKKwlzdWIJeDMseDMseDUJCS8vIHJld2luZCB4MworCWFkY3MJeDEzLHgxNyx4MTkKKwlhZGMJeDE5LHh6cix4enIKKworCWFkZHMJeDYseDYseDIzCisJYWRjCXg3LHg3LHh6cgorCisJYWRkcwl4MTIseDEyLHg2CisJYWRjcwl4MTMseDEzLHg3CisJYWRjCXgxOSx4MTkseHpyCQkvLyB1cG1vc3Qgb3ZlcmZsb3cgYml0CisJc3RwCXgxMix4MTMsW3gyMiwjLTE2XQorCisJY2Juegl4MjAsLkxvdXRlcgorCisJLy8gRmluYWwgc3RlcC4gV2Ugc2VlIGlmIHJlc3VsdCBpcyBsYXJnZXIgdGhhbiBtb2R1bHVzLCBhbmQKKwkvLyBpZiBpdCBpcywgc3VidHJhY3QgdGhlIG1vZHVsdXMuIEJ1dCBjb21wYXJpc29uIGltcGxpZXMKKwkvLyBzdWJ0cmFjdGlvbi4gU28gd2Ugc3VidHJhY3QgbW9kdWx1cywgc2VlIGlmIGl0IGJvcnJvd2VkLAorCS8vIGFuZCBjb25kaXRpb25hbGx5IGNvcHkgb3JpZ2luYWwgdmFsdWUuCisJbGRyCXgyMyxbc3BdCQkvLyB0cFswXQorCWFkZAl4MjIsc3AsIzgKKwlsZHIJeDE0LFt4M10sIzgJCS8vIG5wWzBdCisJc3Vicwl4MjEseDUsIzgJCS8vIGo9bnVtLTEgYW5kIGNsZWFyIGJvcnJvdworCW1vdgl4MSx4MAorLkxzdWI6CisJc2Jjcwl4OCx4MjMseDE0CQkvLyB0cFtqXS1ucFtqXQorCWxkcgl4MjMsW3gyMl0sIzgKKwlzdWIJeDIxLHgyMSwjOAkJLy8gai0tCisJbGRyCXgxNCxbeDNdLCM4CisJc3RyCXg4LFt4MV0sIzgJCS8vIHJwW2pdPXRwW2pdLW5wW2pdCisJY2Juegl4MjEsLkxzdWIKKworCXNiY3MJeDgseDIzLHgxNAorCXNiY3MJeDE5LHgxOSx4enIJCS8vIGRpZCBpdCBib3Jyb3c/CisJc3RyCXg4LFt4MV0sIzgJCS8vIHJwW251bS0xXQorCisJbGRyCXgyMyxbc3BdCQkvLyB0cFswXQorCWFkZAl4MjIsc3AsIzgKKwlsZHIJeDgsW3gwXSwjOAkJLy8gcnBbMF0KKwlzdWIJeDUseDUsIzgJCS8vIG51bS0tCisJbm9wCisuTGNvbmRfY29weToKKwlzdWIJeDUseDUsIzgJCS8vIG51bS0tCisJY3NlbAl4MTQseDIzLHg4LGxvCQkvLyBkaWQgaXQgYm9ycm93PworCWxkcgl4MjMsW3gyMl0sIzgKKwlsZHIJeDgsW3gwXSwjOAorCXN0cgl4enIsW3gyMiwjLTE2XQkJLy8gd2lwZSB0cAorCXN0cgl4MTQsW3gwLCMtMTZdCisJY2Juegl4NSwuTGNvbmRfY29weQorCisJY3NlbAl4MTQseDIzLHg4LGxvCisJc3RyCXh6cixbeDIyLCMtOF0JCS8vIHdpcGUgdHAKKwlzdHIJeDE0LFt4MCwjLThdCisKKwlsZHAJeDE5LHgyMCxbeDI5LCMxNl0KKwltb3YJc3AseDI5CisJbGRwCXgyMSx4MjIsW3gyOSwjMzJdCisJbW92CXgwLCMxCisJbGRwCXgyMyx4MjQsW3gyOSwjNDhdCisJbGRyCXgyOSxbc3BdLCM2NAorCXJldAorLnNpemUJYm5fbXVsX21vbnQsLi1ibl9tdWxfbW9udAorLnR5cGUJX19ibl9zcXI4eF9tb250LCVmdW5jdGlvbgorLmFsaWduCTUKK19fYm5fc3FyOHhfbW9udDoKKwljbXAJeDEseDIKKwliLm5lCV9fYm5fbXVsNHhfbW9udAorLkxzcXI4eF9tb250OgorCXN0cAl4MjkseDMwLFtzcCwjLTEyOF0hCisJYWRkCXgyOSxzcCwjMAorCXN0cAl4MTkseDIwLFtzcCwjMTZdCisJc3RwCXgyMSx4MjIsW3NwLCMzMl0KKwlzdHAJeDIzLHgyNCxbc3AsIzQ4XQorCXN0cAl4MjUseDI2LFtzcCwjNjRdCisJc3RwCXgyNyx4MjgsW3NwLCM4MF0KKwlzdHAJeDAseDMsW3NwLCM5Nl0JLy8gb2ZmbG9hZCBycCBhbmQgbnAKKworCWxkcAl4Nix4NyxbeDEsIzgqMF0KKwlsZHAJeDgseDksW3gxLCM4KjJdCisJbGRwCXgxMCx4MTEsW3gxLCM4KjRdCisJbGRwCXgxMix4MTMsW3gxLCM4KjZdCisKKwlzdWIJeDIsc3AseDUsbHNsIzQKKwlsc2wJeDUseDUsIzMKKwlsZHIJeDQsW3g0XQkJLy8gKm4wCisJbW92CXNwLHgyCQkJLy8gYWxsb2NhCisJc3ViCXgyNyx4NSwjOCo4CisJYgkuTHNxcjh4X3plcm9fc3RhcnQKKworLkxzcXI4eF96ZXJvOgorCXN1Ygl4MjcseDI3LCM4KjgKKwlzdHAJeHpyLHh6cixbeDIsIzgqMF0KKwlzdHAJeHpyLHh6cixbeDIsIzgqMl0KKwlzdHAJeHpyLHh6cixbeDIsIzgqNF0KKwlzdHAJeHpyLHh6cixbeDIsIzgqNl0KKy5Mc3FyOHhfemVyb19zdGFydDoKKwlzdHAJeHpyLHh6cixbeDIsIzgqOF0KKwlzdHAJeHpyLHh6cixbeDIsIzgqMTBdCisJc3RwCXh6cix4enIsW3gyLCM4KjEyXQorCXN0cAl4enIseHpyLFt4MiwjOCoxNF0KKwlhZGQJeDIseDIsIzgqMTYKKwljYm56CXgyNywuTHNxcjh4X3plcm8KKworCWFkZAl4Myx4MSx4NQorCWFkZAl4MSx4MSwjOCo4CisJbW92CXgxOSx4enIKKwltb3YJeDIwLHh6cgorCW1vdgl4MjEseHpyCisJbW92CXgyMix4enIKKwltb3YJeDIzLHh6cgorCW1vdgl4MjQseHpyCisJbW92CXgyNSx4enIKKwltb3YJeDI2LHh6cgorCW1vdgl4MixzcAorCXN0cgl4NCxbeDI5LCMxMTJdCQkvLyBvZmZsb2FkIG4wCisKKwkvLyBNdWx0aXBseSBldmVyeXRoaW5nIGJ1dCBhW2ldKmFbaV0KKy5hbGlnbgk0CisuTHNxcjh4X291dGVyX2xvb3A6CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbMV1hWzBdCShpKQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbMl1hWzBdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzNdYVswXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVswXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNV1hWzBdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzZdYVswXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBhWzddYVswXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsyXWFbMV0JCShpaSkKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVszXWFbMV0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzRdYVsxXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs1XWFbMV0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMV0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBhWzddYVsxXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbM11hWzJdCQkJKGlpaSkKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbNF1hWzJdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGFbNV1hWzJdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgYVs2XWFbMl0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFbN11hWzJdCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGFbNF1hWzNdCQkJCShpdikKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBhWzVdYVszXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgYVs2XWFbM10KKyAgICAgICAgLy8gICAgICAgICAgICAgYVs3XWFbM10KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFbNV1hWzRdCQkJCQkodikKKyAgICAgICAgLy8gICAgICAgICAgICAgYVs2XWFbNF0KKyAgICAgICAgLy8gICAgICAgICBhWzddYVs0XQorICAgICAgICAvLyAgICAgICAgIGFbNl1hWzVdCQkJCQkJKHZpKQorICAgICAgICAvLyAgICAgYVs3XWFbNV0KKyAgICAgICAgLy8gYVs3XWFbNl0JCQkJCQkJKHZpaSkKKworCW11bAl4MTQseDcseDYJCS8vIGxvKGFbMS4uN10qYVswXSkJCShpKQorCW11bAl4MTUseDgseDYKKwltdWwJeDE2LHg5LHg2CisJbXVsCXgxNyx4MTAseDYKKwlhZGRzCXgyMCx4MjAseDE0CQkvLyB0WzFdK2xvKGFbMV0qYVswXSkKKwltdWwJeDE0LHgxMSx4NgorCWFkY3MJeDIxLHgyMSx4MTUKKwltdWwJeDE1LHgxMix4NgorCWFkY3MJeDIyLHgyMix4MTYKKwltdWwJeDE2LHgxMyx4NgorCWFkY3MJeDIzLHgyMyx4MTcKKwl1bXVsaAl4MTcseDcseDYJCS8vIGhpKGFbMS4uN10qYVswXSkKKwlhZGNzCXgyNCx4MjQseDE0CisJdW11bGgJeDE0LHg4LHg2CisJYWRjcwl4MjUseDI1LHgxNQorCXVtdWxoCXgxNSx4OSx4NgorCWFkY3MJeDI2LHgyNix4MTYKKwl1bXVsaAl4MTYseDEwLHg2CisJc3RwCXgxOSx4MjAsW3gyXSwjOCoyCS8vIHRbMC4uMV0KKwlhZGMJeDE5LHh6cix4enIJCS8vIHRbOF0KKwlhZGRzCXgyMSx4MjEseDE3CQkvLyB0WzJdK2xvKGFbMV0qYVswXSkKKwl1bXVsaAl4MTcseDExLHg2CisJYWRjcwl4MjIseDIyLHgxNAorCXVtdWxoCXgxNCx4MTIseDYKKwlhZGNzCXgyMyx4MjMseDE1CisJdW11bGgJeDE1LHgxMyx4NgorCWFkY3MJeDI0LHgyNCx4MTYKKwltdWwJeDE2LHg4LHg3CQkvLyBsbyhhWzIuLjddKmFbMV0pCQkoaWkpCisJYWRjcwl4MjUseDI1LHgxNworCW11bAl4MTcseDkseDcKKwlhZGNzCXgyNix4MjYseDE0CisJbXVsCXgxNCx4MTAseDcKKwlhZGMJeDE5LHgxOSx4MTUKKworCW11bAl4MTUseDExLHg3CisJYWRkcwl4MjIseDIyLHgxNgorCW11bAl4MTYseDEyLHg3CisJYWRjcwl4MjMseDIzLHgxNworCW11bAl4MTcseDEzLHg3CisJYWRjcwl4MjQseDI0LHgxNAorCXVtdWxoCXgxNCx4OCx4NwkJLy8gaGkoYVsyLi43XSphWzFdKQorCWFkY3MJeDI1LHgyNSx4MTUKKwl1bXVsaAl4MTUseDkseDcKKwlhZGNzCXgyNix4MjYseDE2CisJdW11bGgJeDE2LHgxMCx4NworCWFkY3MJeDE5LHgxOSx4MTcKKwl1bXVsaAl4MTcseDExLHg3CisJc3RwCXgyMSx4MjIsW3gyXSwjOCoyCS8vIHRbMi4uM10KKwlhZGMJeDIwLHh6cix4enIJCS8vIHRbOV0KKwlhZGRzCXgyMyx4MjMseDE0CisJdW11bGgJeDE0LHgxMix4NworCWFkY3MJeDI0LHgyNCx4MTUKKwl1bXVsaAl4MTUseDEzLHg3CisJYWRjcwl4MjUseDI1LHgxNgorCW11bAl4MTYseDkseDgJCS8vIGxvKGFbMy4uN10qYVsyXSkJCShpaWkpCisJYWRjcwl4MjYseDI2LHgxNworCW11bAl4MTcseDEwLHg4CisJYWRjcwl4MTkseDE5LHgxNAorCW11bAl4MTQseDExLHg4CisJYWRjCXgyMCx4MjAseDE1CisKKwltdWwJeDE1LHgxMix4OAorCWFkZHMJeDI0LHgyNCx4MTYKKwltdWwJeDE2LHgxMyx4OAorCWFkY3MJeDI1LHgyNSx4MTcKKwl1bXVsaAl4MTcseDkseDgJCS8vIGhpKGFbMy4uN10qYVsyXSkKKwlhZGNzCXgyNix4MjYseDE0CisJdW11bGgJeDE0LHgxMCx4OAorCWFkY3MJeDE5LHgxOSx4MTUKKwl1bXVsaAl4MTUseDExLHg4CisJYWRjcwl4MjAseDIwLHgxNgorCXVtdWxoCXgxNix4MTIseDgKKwlzdHAJeDIzLHgyNCxbeDJdLCM4KjIJLy8gdFs0Li41XQorCWFkYwl4MjEseHpyLHh6cgkJLy8gdFsxMF0KKwlhZGRzCXgyNSx4MjUseDE3CisJdW11bGgJeDE3LHgxMyx4OAorCWFkY3MJeDI2LHgyNix4MTQKKwltdWwJeDE0LHgxMCx4OQkJLy8gbG8oYVs0Li43XSphWzNdKQkJKGl2KQorCWFkY3MJeDE5LHgxOSx4MTUKKwltdWwJeDE1LHgxMSx4OQorCWFkY3MJeDIwLHgyMCx4MTYKKwltdWwJeDE2LHgxMix4OQorCWFkYwl4MjEseDIxLHgxNworCisJbXVsCXgxNyx4MTMseDkKKwlhZGRzCXgyNix4MjYseDE0CisJdW11bGgJeDE0LHgxMCx4OQkJLy8gaGkoYVs0Li43XSphWzNdKQorCWFkY3MJeDE5LHgxOSx4MTUKKwl1bXVsaAl4MTUseDExLHg5CisJYWRjcwl4MjAseDIwLHgxNgorCXVtdWxoCXgxNix4MTIseDkKKwlhZGNzCXgyMSx4MjEseDE3CisJdW11bGgJeDE3LHgxMyx4OQorCXN0cAl4MjUseDI2LFt4Ml0sIzgqMgkvLyB0WzYuLjddCisJYWRjCXgyMix4enIseHpyCQkvLyB0WzExXQorCWFkZHMJeDE5LHgxOSx4MTQKKwltdWwJeDE0LHgxMSx4MTAJCS8vIGxvKGFbNS4uN10qYVs0XSkJCSh2KQorCWFkY3MJeDIwLHgyMCx4MTUKKwltdWwJeDE1LHgxMix4MTAKKwlhZGNzCXgyMSx4MjEseDE2CisJbXVsCXgxNix4MTMseDEwCisJYWRjCXgyMix4MjIseDE3CisKKwl1bXVsaAl4MTcseDExLHgxMAkJLy8gaGkoYVs1Li43XSphWzRdKQorCWFkZHMJeDIwLHgyMCx4MTQKKwl1bXVsaAl4MTQseDEyLHgxMAorCWFkY3MJeDIxLHgyMSx4MTUKKwl1bXVsaAl4MTUseDEzLHgxMAorCWFkY3MJeDIyLHgyMix4MTYKKwltdWwJeDE2LHgxMix4MTEJCS8vIGxvKGFbNi4uN10qYVs1XSkJCSh2aSkKKwlhZGMJeDIzLHh6cix4enIJCS8vIHRbMTJdCisJYWRkcwl4MjEseDIxLHgxNworCW11bAl4MTcseDEzLHgxMQorCWFkY3MJeDIyLHgyMix4MTQKKwl1bXVsaAl4MTQseDEyLHgxMQkJLy8gaGkoYVs2Li43XSphWzVdKQorCWFkYwl4MjMseDIzLHgxNQorCisJdW11bGgJeDE1LHgxMyx4MTEKKwlhZGRzCXgyMix4MjIseDE2CisJbXVsCXgxNix4MTMseDEyCQkvLyBsbyhhWzddKmFbNl0pCQkodmlpKQorCWFkY3MJeDIzLHgyMyx4MTcKKwl1bXVsaAl4MTcseDEzLHgxMgkJLy8gaGkoYVs3XSphWzZdKQorCWFkYwl4MjQseHpyLHh6cgkJLy8gdFsxM10KKwlhZGRzCXgyMyx4MjMseDE0CisJc3ViCXgyNyx4Myx4MQkvLyBkb25lIHlldD8KKwlhZGMJeDI0LHgyNCx4MTUKKworCWFkZHMJeDI0LHgyNCx4MTYKKwlzdWIJeDE0LHgzLHg1CS8vIHJld2luZGVkIGFwCisJYWRjCXgyNSx4enIseHpyCQkvLyB0WzE0XQorCWFkZAl4MjUseDI1LHgxNworCisJY2J6CXgyNywuTHNxcjh4X291dGVyX2JyZWFrCisKKwltb3YJeDQseDYKKwlsZHAJeDYseDcsW3gyLCM4KjBdCisJbGRwCXg4LHg5LFt4MiwjOCoyXQorCWxkcAl4MTAseDExLFt4MiwjOCo0XQorCWxkcAl4MTIseDEzLFt4MiwjOCo2XQorCWFkZHMJeDE5LHgxOSx4NgorCWFkY3MJeDIwLHgyMCx4NworCWxkcAl4Nix4NyxbeDEsIzgqMF0KKwlhZGNzCXgyMSx4MjEseDgKKwlhZGNzCXgyMix4MjIseDkKKwlsZHAJeDgseDksW3gxLCM4KjJdCisJYWRjcwl4MjMseDIzLHgxMAorCWFkY3MJeDI0LHgyNCx4MTEKKwlsZHAJeDEwLHgxMSxbeDEsIzgqNF0KKwlhZGNzCXgyNSx4MjUseDEyCisJbW92CXgwLHgxCisJYWRjcwl4MjYseHpyLHgxMworCWxkcAl4MTIseDEzLFt4MSwjOCo2XQorCWFkZAl4MSx4MSwjOCo4CisJLy9hZGMJeDI4LHh6cix4enIJCS8vIG1vdmVkIGJlbG93CisJbW92CXgyNywjLTgqOAorCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzhdYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzldYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbYV1hWzBdCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2JdYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2NdYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbZF1hWzBdCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2VdYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2ZdYVswXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzhdYVsxXQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFbZl1hWzFdLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbMl0KKwkvLyAgICAgICAgICAgICAgICAgICAgIGFbZl1hWzJdLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzhdYVszXQorCS8vICAgICAgICAgICAgICAgICBhW2ZdYVszXS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzhdYVs0XQorCS8vICAgICAgICAgICAgIGFbZl1hWzRdLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVs4XWFbNV0KKwkvLyAgICAgICAgIGFbZl1hWzVdLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzhdYVs2XQorCS8vICAgICBhW2ZdYVs2XS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWzhdYVs3XQorCS8vIGFbZl1hWzddLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisuTHNxcjh4X211bDoKKwltdWwJeDE0LHg2LHg0CisJYWRjCXgyOCx4enIseHpyCQkvLyBjYXJyeSBiaXQsIG1vZHVsby1zY2hlZHVsZWQKKwltdWwJeDE1LHg3LHg0CisJYWRkCXgyNyx4MjcsIzgKKwltdWwJeDE2LHg4LHg0CisJbXVsCXgxNyx4OSx4NAorCWFkZHMJeDE5LHgxOSx4MTQKKwltdWwJeDE0LHgxMCx4NAorCWFkY3MJeDIwLHgyMCx4MTUKKwltdWwJeDE1LHgxMSx4NAorCWFkY3MJeDIxLHgyMSx4MTYKKwltdWwJeDE2LHgxMix4NAorCWFkY3MJeDIyLHgyMix4MTcKKwltdWwJeDE3LHgxMyx4NAorCWFkY3MJeDIzLHgyMyx4MTQKKwl1bXVsaAl4MTQseDYseDQKKwlhZGNzCXgyNCx4MjQseDE1CisJdW11bGgJeDE1LHg3LHg0CisJYWRjcwl4MjUseDI1LHgxNgorCXVtdWxoCXgxNix4OCx4NAorCWFkY3MJeDI2LHgyNix4MTcKKwl1bXVsaAl4MTcseDkseDQKKwlhZGMJeDI4LHgyOCx4enIKKwlzdHIJeDE5LFt4Ml0sIzgKKwlhZGRzCXgxOSx4MjAseDE0CisJdW11bGgJeDE0LHgxMCx4NAorCWFkY3MJeDIwLHgyMSx4MTUKKwl1bXVsaAl4MTUseDExLHg0CisJYWRjcwl4MjEseDIyLHgxNgorCXVtdWxoCXgxNix4MTIseDQKKwlhZGNzCXgyMix4MjMseDE3CisJdW11bGgJeDE3LHgxMyx4NAorCWxkcgl4NCxbeDAseDI3XQorCWFkY3MJeDIzLHgyNCx4MTQKKwlhZGNzCXgyNCx4MjUseDE1CisJYWRjcwl4MjUseDI2LHgxNgorCWFkY3MJeDI2LHgyOCx4MTcKKwkvL2FkYwl4MjgseHpyLHh6cgkJLy8gbW92ZWQgYWJvdmUKKwljYm56CXgyNywuTHNxcjh4X211bAorCQkJCQkvLyBub3RlIHRoYXQgY2FycnkgZmxhZyBpcyBndWFyYW50ZWVkCisJCQkJCS8vIHRvIGJlIHplcm8gYXQgdGhpcyBwb2ludAorCWNtcAl4MSx4MwkJLy8gZG9uZSB5ZXQ/CisJYi5lcQkuTHNxcjh4X2JyZWFrCisKKwlsZHAJeDYseDcsW3gyLCM4KjBdCisJbGRwCXg4LHg5LFt4MiwjOCoyXQorCWxkcAl4MTAseDExLFt4MiwjOCo0XQorCWxkcAl4MTIseDEzLFt4MiwjOCo2XQorCWFkZHMJeDE5LHgxOSx4NgorCWxkcgl4NCxbeDAsIy04KjhdCisJYWRjcwl4MjAseDIwLHg3CisJbGRwCXg2LHg3LFt4MSwjOCowXQorCWFkY3MJeDIxLHgyMSx4OAorCWFkY3MJeDIyLHgyMix4OQorCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlhZGNzCXgyMyx4MjMseDEwCisJYWRjcwl4MjQseDI0LHgxMQorCWxkcAl4MTAseDExLFt4MSwjOCo0XQorCWFkY3MJeDI1LHgyNSx4MTIKKwltb3YJeDI3LCMtOCo4CisJYWRjcwl4MjYseDI2LHgxMworCWxkcAl4MTIseDEzLFt4MSwjOCo2XQorCWFkZAl4MSx4MSwjOCo4CisJLy9hZGMJeDI4LHh6cix4enIJCS8vIG1vdmVkIGFib3ZlCisJYgkuTHNxcjh4X211bAorCisuYWxpZ24JNAorLkxzcXI4eF9icmVhazoKKwlsZHAJeDYseDcsW3gwLCM4KjBdCisJYWRkCXgxLHgwLCM4KjgKKwlsZHAJeDgseDksW3gwLCM4KjJdCisJc3ViCXgxNCx4Myx4MQkJLy8gaXMgaXQgbGFzdCBpdGVyYXRpb24/CisJbGRwCXgxMCx4MTEsW3gwLCM4KjRdCisJc3ViCXgxNSx4Mix4MTQKKwlsZHAJeDEyLHgxMyxbeDAsIzgqNl0KKwljYnoJeDE0LC5Mc3FyOHhfb3V0ZXJfbG9vcAorCisJc3RwCXgxOSx4MjAsW3gyLCM4KjBdCisJbGRwCXgxOSx4MjAsW3gxNSwjOCowXQorCXN0cAl4MjEseDIyLFt4MiwjOCoyXQorCWxkcAl4MjEseDIyLFt4MTUsIzgqMl0KKwlzdHAJeDIzLHgyNCxbeDIsIzgqNF0KKwlsZHAJeDIzLHgyNCxbeDE1LCM4KjRdCisJc3RwCXgyNSx4MjYsW3gyLCM4KjZdCisJbW92CXgyLHgxNQorCWxkcAl4MjUseDI2LFt4MTUsIzgqNl0KKwliCS5Mc3FyOHhfb3V0ZXJfbG9vcAorCisuYWxpZ24JNAorLkxzcXI4eF9vdXRlcl9icmVhazoKKwkvLyBOb3cgbXVsdGlwbHkgYWJvdmUgcmVzdWx0IGJ5IDIgYW5kIGFkZCBhW24tMV0qYVtuLTFdfC4uLnxhWzBdKmFbMF0KKwlsZHAJeDcseDksW3gxNCwjOCowXQkvLyByZWNhbGwgdGhhdCB4MTQgaXMgJmFbMF0KKwlsZHAJeDE1LHgxNixbc3AsIzgqMV0KKwlsZHAJeDExLHgxMyxbeDE0LCM4KjJdCisJYWRkCXgxLHgxNCwjOCo0CisJbGRwCXgxNyx4MTQsW3NwLCM4KjNdCisKKwlzdHAJeDE5LHgyMCxbeDIsIzgqMF0KKwltdWwJeDE5LHg3LHg3CisJc3RwCXgyMSx4MjIsW3gyLCM4KjJdCisJdW11bGgJeDcseDcseDcKKwlzdHAJeDIzLHgyNCxbeDIsIzgqNF0KKwltdWwJeDgseDkseDkKKwlzdHAJeDI1LHgyNixbeDIsIzgqNl0KKwltb3YJeDIsc3AKKwl1bXVsaAl4OSx4OSx4OQorCWFkZHMJeDIwLHg3LHgxNSxsc2wjMQorCWV4dHIJeDE1LHgxNix4MTUsIzYzCisJc3ViCXgyNyx4NSwjOCo0CisKKy5Mc3FyNHhfc2hpZnRfbl9hZGQ6CisJYWRjcwl4MjEseDgseDE1CisJZXh0cgl4MTYseDE3LHgxNiwjNjMKKwlzdWIJeDI3LHgyNywjOCo0CisJYWRjcwl4MjIseDkseDE2CisJbGRwCXgxNSx4MTYsW3gyLCM4KjVdCisJbXVsCXgxMCx4MTEseDExCisJbGRwCXg3LHg5LFt4MV0sIzgqMgorCXVtdWxoCXgxMSx4MTEseDExCisJbXVsCXgxMix4MTMseDEzCisJdW11bGgJeDEzLHgxMyx4MTMKKwlleHRyCXgxNyx4MTQseDE3LCM2MworCXN0cAl4MTkseDIwLFt4MiwjOCowXQorCWFkY3MJeDIzLHgxMCx4MTcKKwlleHRyCXgxNCx4MTUseDE0LCM2MworCXN0cAl4MjEseDIyLFt4MiwjOCoyXQorCWFkY3MJeDI0LHgxMSx4MTQKKwlsZHAJeDE3LHgxNCxbeDIsIzgqN10KKwlleHRyCXgxNSx4MTYseDE1LCM2MworCWFkY3MJeDI1LHgxMix4MTUKKwlleHRyCXgxNix4MTcseDE2LCM2MworCWFkY3MJeDI2LHgxMyx4MTYKKwlsZHAJeDE1LHgxNixbeDIsIzgqOV0KKwltdWwJeDYseDcseDcKKwlsZHAJeDExLHgxMyxbeDFdLCM4KjIKKwl1bXVsaAl4Nyx4Nyx4NworCW11bAl4OCx4OSx4OQorCXVtdWxoCXg5LHg5LHg5CisJc3RwCXgyMyx4MjQsW3gyLCM4KjRdCisJZXh0cgl4MTcseDE0LHgxNywjNjMKKwlzdHAJeDI1LHgyNixbeDIsIzgqNl0KKwlhZGQJeDIseDIsIzgqOAorCWFkY3MJeDE5LHg2LHgxNworCWV4dHIJeDE0LHgxNSx4MTQsIzYzCisJYWRjcwl4MjAseDcseDE0CisJbGRwCXgxNyx4MTQsW3gyLCM4KjNdCisJZXh0cgl4MTUseDE2LHgxNSwjNjMKKwljYm56CXgyNywuTHNxcjR4X3NoaWZ0X25fYWRkCisJbGRwCXgxLHg0LFt4MjksIzEwNF0JLy8gcHVsbCBucCBhbmQgbjAKKworCWFkY3MJeDIxLHg4LHgxNQorCWV4dHIJeDE2LHgxNyx4MTYsIzYzCisJYWRjcwl4MjIseDkseDE2CisJbGRwCXgxNSx4MTYsW3gyLCM4KjVdCisJbXVsCXgxMCx4MTEseDExCisJdW11bGgJeDExLHgxMSx4MTEKKwlzdHAJeDE5LHgyMCxbeDIsIzgqMF0KKwltdWwJeDEyLHgxMyx4MTMKKwl1bXVsaAl4MTMseDEzLHgxMworCXN0cAl4MjEseDIyLFt4MiwjOCoyXQorCWV4dHIJeDE3LHgxNCx4MTcsIzYzCisJYWRjcwl4MjMseDEwLHgxNworCWV4dHIJeDE0LHgxNSx4MTQsIzYzCisJbGRwCXgxOSx4MjAsW3NwLCM4KjBdCisJYWRjcwl4MjQseDExLHgxNAorCWV4dHIJeDE1LHgxNix4MTUsIzYzCisJbGRwCXg2LHg3LFt4MSwjOCowXQorCWFkY3MJeDI1LHgxMix4MTUKKwlleHRyCXgxNix4enIseDE2LCM2MworCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlhZGMJeDI2LHgxMyx4MTYKKwlsZHAJeDEwLHgxMSxbeDEsIzgqNF0KKworCS8vIFJlZHVjZSBieSA1MTIgYml0cyBwZXIgaXRlcmF0aW9uCisJbXVsCXgyOCx4NCx4MTkJCS8vIHRbMF0qbjAKKwlsZHAJeDEyLHgxMyxbeDEsIzgqNl0KKwlhZGQJeDMseDEseDUKKwlsZHAJeDIxLHgyMixbc3AsIzgqMl0KKwlzdHAJeDIzLHgyNCxbeDIsIzgqNF0KKwlsZHAJeDIzLHgyNCxbc3AsIzgqNF0KKwlzdHAJeDI1LHgyNixbeDIsIzgqNl0KKwlsZHAJeDI1LHgyNixbc3AsIzgqNl0KKwlhZGQJeDEseDEsIzgqOAorCW1vdgl4MzAseHpyCQkvLyBpbml0aWFsIHRvcC1tb3N0IGNhcnJ5CisJbW92CXgyLHNwCisJbW92CXgyNywjOAorCisuTHNxcjh4X3JlZHVjdGlvbjoKKwkvLyAoKikJbXVsCXgxNCx4Nix4MjgJLy8gbG8oblswLTddKSpsbyh0WzBdKm4wKQorCW11bAl4MTUseDcseDI4CisJc3ViCXgyNyx4MjcsIzEKKwltdWwJeDE2LHg4LHgyOAorCXN0cgl4MjgsW3gyXSwjOAkJLy8gcHV0IGFzaWRlIHRbMF0qbjAgZm9yIHRhaWwgcHJvY2Vzc2luZworCW11bAl4MTcseDkseDI4CisJLy8gKCopCWFkZHMJeHpyLHgxOSx4MTQKKwlzdWJzCXh6cix4MTksIzEJCS8vICgqKQorCW11bAl4MTQseDEwLHgyOAorCWFkY3MJeDE5LHgyMCx4MTUKKwltdWwJeDE1LHgxMSx4MjgKKwlhZGNzCXgyMCx4MjEseDE2CisJbXVsCXgxNix4MTIseDI4CisJYWRjcwl4MjEseDIyLHgxNworCW11bAl4MTcseDEzLHgyOAorCWFkY3MJeDIyLHgyMyx4MTQKKwl1bXVsaAl4MTQseDYseDI4CQkvLyBoaShuWzAtN10pKmxvKHRbMF0qbjApCisJYWRjcwl4MjMseDI0LHgxNQorCXVtdWxoCXgxNSx4Nyx4MjgKKwlhZGNzCXgyNCx4MjUseDE2CisJdW11bGgJeDE2LHg4LHgyOAorCWFkY3MJeDI1LHgyNix4MTcKKwl1bXVsaAl4MTcseDkseDI4CisJYWRjCXgyNix4enIseHpyCisJYWRkcwl4MTkseDE5LHgxNAorCXVtdWxoCXgxNCx4MTAseDI4CisJYWRjcwl4MjAseDIwLHgxNQorCXVtdWxoCXgxNSx4MTEseDI4CisJYWRjcwl4MjEseDIxLHgxNgorCXVtdWxoCXgxNix4MTIseDI4CisJYWRjcwl4MjIseDIyLHgxNworCXVtdWxoCXgxNyx4MTMseDI4CisJbXVsCXgyOCx4NCx4MTkJCS8vIG5leHQgdFswXSpuMAorCWFkY3MJeDIzLHgyMyx4MTQKKwlhZGNzCXgyNCx4MjQseDE1CisJYWRjcwl4MjUseDI1LHgxNgorCWFkYwl4MjYseDI2LHgxNworCWNibnoJeDI3LC5Mc3FyOHhfcmVkdWN0aW9uCisKKwlsZHAJeDE0LHgxNSxbeDIsIzgqMF0KKwlsZHAJeDE2LHgxNyxbeDIsIzgqMl0KKwltb3YJeDAseDIKKwlzdWIJeDI3LHgzLHgxCS8vIGRvbmUgeWV0PworCWFkZHMJeDE5LHgxOSx4MTQKKwlhZGNzCXgyMCx4MjAseDE1CisJbGRwCXgxNCx4MTUsW3gyLCM4KjRdCisJYWRjcwl4MjEseDIxLHgxNgorCWFkY3MJeDIyLHgyMix4MTcKKwlsZHAJeDE2LHgxNyxbeDIsIzgqNl0KKwlhZGNzCXgyMyx4MjMseDE0CisJYWRjcwl4MjQseDI0LHgxNQorCWFkY3MJeDI1LHgyNSx4MTYKKwlhZGNzCXgyNix4MjYseDE3CisJLy9hZGMJeDI4LHh6cix4enIJCS8vIG1vdmVkIGJlbG93CisJY2J6CXgyNywuTHNxcjh4OF9wb3N0X2NvbmRpdGlvbgorCisJbGRyCXg0LFt4MiwjLTgqOF0KKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWxkcAl4MTAseDExLFt4MSwjOCo0XQorCW1vdgl4MjcsIy04KjgKKwlsZHAJeDEyLHgxMyxbeDEsIzgqNl0KKwlhZGQJeDEseDEsIzgqOAorCisuTHNxcjh4X3RhaWw6CisJbXVsCXgxNCx4Nix4NAorCWFkYwl4MjgseHpyLHh6cgkJLy8gY2FycnkgYml0LCBtb2R1bG8tc2NoZWR1bGVkCisJbXVsCXgxNSx4Nyx4NAorCWFkZAl4MjcseDI3LCM4CisJbXVsCXgxNix4OCx4NAorCW11bAl4MTcseDkseDQKKwlhZGRzCXgxOSx4MTkseDE0CisJbXVsCXgxNCx4MTAseDQKKwlhZGNzCXgyMCx4MjAseDE1CisJbXVsCXgxNSx4MTEseDQKKwlhZGNzCXgyMSx4MjEseDE2CisJbXVsCXgxNix4MTIseDQKKwlhZGNzCXgyMix4MjIseDE3CisJbXVsCXgxNyx4MTMseDQKKwlhZGNzCXgyMyx4MjMseDE0CisJdW11bGgJeDE0LHg2LHg0CisJYWRjcwl4MjQseDI0LHgxNQorCXVtdWxoCXgxNSx4Nyx4NAorCWFkY3MJeDI1LHgyNSx4MTYKKwl1bXVsaAl4MTYseDgseDQKKwlhZGNzCXgyNix4MjYseDE3CisJdW11bGgJeDE3LHg5LHg0CisJYWRjCXgyOCx4MjgseHpyCisJc3RyCXgxOSxbeDJdLCM4CisJYWRkcwl4MTkseDIwLHgxNAorCXVtdWxoCXgxNCx4MTAseDQKKwlhZGNzCXgyMCx4MjEseDE1CisJdW11bGgJeDE1LHgxMSx4NAorCWFkY3MJeDIxLHgyMix4MTYKKwl1bXVsaAl4MTYseDEyLHg0CisJYWRjcwl4MjIseDIzLHgxNworCXVtdWxoCXgxNyx4MTMseDQKKwlsZHIJeDQsW3gwLHgyN10KKwlhZGNzCXgyMyx4MjQseDE0CisJYWRjcwl4MjQseDI1LHgxNQorCWFkY3MJeDI1LHgyNix4MTYKKwlhZGNzCXgyNix4MjgseDE3CisJLy9hZGMJeDI4LHh6cix4enIJCS8vIG1vdmVkIGFib3ZlCisJY2Juegl4MjcsLkxzcXI4eF90YWlsCisJCQkJCS8vIG5vdGUgdGhhdCBjYXJyeSBmbGFnIGlzIGd1YXJhbnRlZWQKKwkJCQkJLy8gdG8gYmUgemVybyBhdCB0aGlzIHBvaW50CisJbGRwCXg2LHg3LFt4MiwjOCowXQorCXN1Ygl4MjcseDMseDEJLy8gZG9uZSB5ZXQ/CisJc3ViCXgxNix4Myx4NQkvLyByZXdpbmRlZCBucAorCWxkcAl4OCx4OSxbeDIsIzgqMl0KKwlsZHAJeDEwLHgxMSxbeDIsIzgqNF0KKwlsZHAJeDEyLHgxMyxbeDIsIzgqNl0KKwljYnoJeDI3LC5Mc3FyOHhfdGFpbF9icmVhaworCisJbGRyCXg0LFt4MCwjLTgqOF0KKwlhZGRzCXgxOSx4MTkseDYKKwlhZGNzCXgyMCx4MjAseDcKKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJYWRjcwl4MjEseDIxLHg4CisJYWRjcwl4MjIseDIyLHg5CisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWFkY3MJeDIzLHgyMyx4MTAKKwlhZGNzCXgyNCx4MjQseDExCisJbGRwCXgxMCx4MTEsW3gxLCM4KjRdCisJYWRjcwl4MjUseDI1LHgxMgorCW1vdgl4MjcsIy04KjgKKwlhZGNzCXgyNix4MjYseDEzCisJbGRwCXgxMix4MTMsW3gxLCM4KjZdCisJYWRkCXgxLHgxLCM4KjgKKwkvL2FkYwl4MjgseHpyLHh6cgkJLy8gbW92ZWQgYWJvdmUKKwliCS5Mc3FyOHhfdGFpbAorCisuYWxpZ24JNAorLkxzcXI4eF90YWlsX2JyZWFrOgorCWxkcgl4NCxbeDI5LCMxMTJdCQkvLyBwdWxsIG4wCisJYWRkCXgyNyx4MiwjOCo4CQkvLyBlbmQgb2YgY3VycmVudCB0W251bV0gd2luZG93CisKKwlzdWJzCXh6cix4MzAsIzEJCS8vICJtb3ZlIiB0b3AtbW9zdCBjYXJyeSB0byBjYXJyeSBiaXQKKwlhZGNzCXgxNCx4MTkseDYKKwlhZGNzCXgxNSx4MjAseDcKKwlsZHAJeDE5LHgyMCxbeDAsIzgqMF0KKwlhZGNzCXgyMSx4MjEseDgKKwlsZHAJeDYseDcsW3gxNiwjOCowXQkvLyByZWNhbGwgdGhhdCB4MTYgaXMgJm5bMF0KKwlhZGNzCXgyMix4MjIseDkKKwlsZHAJeDgseDksW3gxNiwjOCoyXQorCWFkY3MJeDIzLHgyMyx4MTAKKwlhZGNzCXgyNCx4MjQseDExCisJbGRwCXgxMCx4MTEsW3gxNiwjOCo0XQorCWFkY3MJeDI1LHgyNSx4MTIKKwlhZGNzCXgyNix4MjYseDEzCisJbGRwCXgxMix4MTMsW3gxNiwjOCo2XQorCWFkZAl4MSx4MTYsIzgqOAorCWFkYwl4MzAseHpyLHh6cgkvLyB0b3AtbW9zdCBjYXJyeQorCW11bAl4MjgseDQseDE5CisJc3RwCXgxNCx4MTUsW3gyLCM4KjBdCisJc3RwCXgyMSx4MjIsW3gyLCM4KjJdCisJbGRwCXgyMSx4MjIsW3gwLCM4KjJdCisJc3RwCXgyMyx4MjQsW3gyLCM4KjRdCisJbGRwCXgyMyx4MjQsW3gwLCM4KjRdCisJY21wCXgyNyx4MjkJCS8vIGRpZCB3ZSBoaXQgdGhlIGJvdHRvbT8KKwlzdHAJeDI1LHgyNixbeDIsIzgqNl0KKwltb3YJeDIseDAJCQkvLyBzbGlkZSB0aGUgd2luZG93CisJbGRwCXgyNSx4MjYsW3gwLCM4KjZdCisJbW92CXgyNywjOAorCWIubmUJLkxzcXI4eF9yZWR1Y3Rpb24KKworCS8vIEZpbmFsIHN0ZXAuIFdlIHNlZSBpZiByZXN1bHQgaXMgbGFyZ2VyIHRoYW4gbW9kdWx1cywgYW5kCisJLy8gaWYgaXQgaXMsIHN1YnRyYWN0IHRoZSBtb2R1bHVzLiBCdXQgY29tcGFyaXNvbiBpbXBsaWVzCisJLy8gc3VidHJhY3Rpb24uIFNvIHdlIHN1YnRyYWN0IG1vZHVsdXMsIHNlZSBpZiBpdCBib3Jyb3dlZCwKKwkvLyBhbmQgY29uZGl0aW9uYWxseSBjb3B5IG9yaWdpbmFsIHZhbHVlLgorCWxkcgl4MCxbeDI5LCM5Nl0JCS8vIHB1bGwgcnAKKwlhZGQJeDIseDIsIzgqOAorCXN1YnMJeDE0LHgxOSx4NgorCXNiY3MJeDE1LHgyMCx4NworCXN1Ygl4MjcseDUsIzgqOAorCW1vdgl4Myx4MAkJLy8geDAgY29weQorCisuTHNxcjh4X3N1YjoKKwlzYmNzCXgxNix4MjEseDgKKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJc2Jjcwl4MTcseDIyLHg5CisJc3RwCXgxNCx4MTUsW3gwLCM4KjBdCisJc2Jjcwl4MTQseDIzLHgxMAorCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlzYmNzCXgxNSx4MjQseDExCisJc3RwCXgxNix4MTcsW3gwLCM4KjJdCisJc2Jjcwl4MTYseDI1LHgxMgorCWxkcAl4MTAseDExLFt4MSwjOCo0XQorCXNiY3MJeDE3LHgyNix4MTMKKwlsZHAJeDEyLHgxMyxbeDEsIzgqNl0KKwlhZGQJeDEseDEsIzgqOAorCWxkcAl4MTkseDIwLFt4MiwjOCowXQorCXN1Ygl4MjcseDI3LCM4KjgKKwlsZHAJeDIxLHgyMixbeDIsIzgqMl0KKwlsZHAJeDIzLHgyNCxbeDIsIzgqNF0KKwlsZHAJeDI1LHgyNixbeDIsIzgqNl0KKwlhZGQJeDIseDIsIzgqOAorCXN0cAl4MTQseDE1LFt4MCwjOCo0XQorCXNiY3MJeDE0LHgxOSx4NgorCXN0cAl4MTYseDE3LFt4MCwjOCo2XQorCWFkZAl4MCx4MCwjOCo4CisJc2Jjcwl4MTUseDIwLHg3CisJY2Juegl4MjcsLkxzcXI4eF9zdWIKKworCXNiY3MJeDE2LHgyMSx4OAorCW1vdgl4MixzcAorCWFkZAl4MSxzcCx4NQorCWxkcAl4Nix4NyxbeDMsIzgqMF0KKwlzYmNzCXgxNyx4MjIseDkKKwlzdHAJeDE0LHgxNSxbeDAsIzgqMF0KKwlzYmNzCXgxNCx4MjMseDEwCisJbGRwCXg4LHg5LFt4MywjOCoyXQorCXNiY3MJeDE1LHgyNCx4MTEKKwlzdHAJeDE2LHgxNyxbeDAsIzgqMl0KKwlzYmNzCXgxNix4MjUseDEyCisJbGRwCXgxOSx4MjAsW3gxLCM4KjBdCisJc2Jjcwl4MTcseDI2LHgxMworCWxkcAl4MjEseDIyLFt4MSwjOCoyXQorCXNiY3MJeHpyLHgzMCx4enIJLy8gZGlkIGl0IGJvcnJvdz8KKwlsZHIJeDMwLFt4MjksIzhdCQkvLyBwdWxsIHJldHVybiBhZGRyZXNzCisJc3RwCXgxNCx4MTUsW3gwLCM4KjRdCisJc3RwCXgxNix4MTcsW3gwLCM4KjZdCisKKwlzdWIJeDI3LHg1LCM4KjQKKy5Mc3FyNHhfY29uZF9jb3B5OgorCXN1Ygl4MjcseDI3LCM4KjQKKwljc2VsCXgxNCx4MTkseDYsbG8KKwlzdHAJeHpyLHh6cixbeDIsIzgqMF0KKwljc2VsCXgxNSx4MjAseDcsbG8KKwlsZHAJeDYseDcsW3gzLCM4KjRdCisJbGRwCXgxOSx4MjAsW3gxLCM4KjRdCisJY3NlbAl4MTYseDIxLHg4LGxvCisJc3RwCXh6cix4enIsW3gyLCM4KjJdCisJYWRkCXgyLHgyLCM4KjQKKwljc2VsCXgxNyx4MjIseDksbG8KKwlsZHAJeDgseDksW3gzLCM4KjZdCisJbGRwCXgyMSx4MjIsW3gxLCM4KjZdCisJYWRkCXgxLHgxLCM4KjQKKwlzdHAJeDE0LHgxNSxbeDMsIzgqMF0KKwlzdHAJeDE2LHgxNyxbeDMsIzgqMl0KKwlhZGQJeDMseDMsIzgqNAorCXN0cAl4enIseHpyLFt4MSwjOCowXQorCXN0cAl4enIseHpyLFt4MSwjOCoyXQorCWNibnoJeDI3LC5Mc3FyNHhfY29uZF9jb3B5CisKKwljc2VsCXgxNCx4MTkseDYsbG8KKwlzdHAJeHpyLHh6cixbeDIsIzgqMF0KKwljc2VsCXgxNSx4MjAseDcsbG8KKwlzdHAJeHpyLHh6cixbeDIsIzgqMl0KKwljc2VsCXgxNix4MjEseDgsbG8KKwljc2VsCXgxNyx4MjIseDksbG8KKwlzdHAJeDE0LHgxNSxbeDMsIzgqMF0KKwlzdHAJeDE2LHgxNyxbeDMsIzgqMl0KKworCWIJLkxzcXI4eF9kb25lCisKKy5hbGlnbgk0CisuTHNxcjh4OF9wb3N0X2NvbmRpdGlvbjoKKwlhZGMJeDI4LHh6cix4enIKKwlsZHIJeDMwLFt4MjksIzhdCQkvLyBwdWxsIHJldHVybiBhZGRyZXNzCisJLy8geDE5LTcseDI4IGhvbGQgcmVzdWx0LCB4Ni03IGhvbGQgbW9kdWx1cworCXN1YnMJeDYseDE5LHg2CisJbGRyCXgxLFt4MjksIzk2XQkJLy8gcHVsbCBycAorCXNiY3MJeDcseDIwLHg3CisJc3RwCXh6cix4enIsW3NwLCM4KjBdCisJc2Jjcwl4OCx4MjEseDgKKwlzdHAJeHpyLHh6cixbc3AsIzgqMl0KKwlzYmNzCXg5LHgyMix4OQorCXN0cAl4enIseHpyLFtzcCwjOCo0XQorCXNiY3MJeDEwLHgyMyx4MTAKKwlzdHAJeHpyLHh6cixbc3AsIzgqNl0KKwlzYmNzCXgxMSx4MjQseDExCisJc3RwCXh6cix4enIsW3NwLCM4KjhdCisJc2Jjcwl4MTIseDI1LHgxMgorCXN0cAl4enIseHpyLFtzcCwjOCoxMF0KKwlzYmNzCXgxMyx4MjYseDEzCisJc3RwCXh6cix4enIsW3NwLCM4KjEyXQorCXNiY3MJeDI4LHgyOCx4enIJLy8gZGlkIGl0IGJvcnJvdz8KKwlzdHAJeHpyLHh6cixbc3AsIzgqMTRdCisKKwkvLyB4Ni03IGhvbGQgcmVzdWx0LW1vZHVsdXMKKwljc2VsCXg2LHgxOSx4NixsbworCWNzZWwJeDcseDIwLHg3LGxvCisJY3NlbAl4OCx4MjEseDgsbG8KKwljc2VsCXg5LHgyMix4OSxsbworCXN0cAl4Nix4NyxbeDEsIzgqMF0KKwljc2VsCXgxMCx4MjMseDEwLGxvCisJY3NlbAl4MTEseDI0LHgxMSxsbworCXN0cAl4OCx4OSxbeDEsIzgqMl0KKwljc2VsCXgxMix4MjUseDEyLGxvCisJY3NlbAl4MTMseDI2LHgxMyxsbworCXN0cAl4MTAseDExLFt4MSwjOCo0XQorCXN0cAl4MTIseDEzLFt4MSwjOCo2XQorCisuTHNxcjh4X2RvbmU6CisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJbW92CXNwLHgyOQorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCW1vdgl4MCwjMQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcgl4MjksW3NwXSwjMTI4CisJcmV0Cisuc2l6ZQlfX2JuX3Nxcjh4X21vbnQsLi1fX2JuX3Nxcjh4X21vbnQKKy50eXBlCV9fYm5fbXVsNHhfbW9udCwlZnVuY3Rpb24KKy5hbGlnbgk1CitfX2JuX211bDR4X21vbnQ6CisJc3RwCXgyOSx4MzAsW3NwLCMtMTI4XSEKKwlhZGQJeDI5LHNwLCMwCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisJc3RwCXgyNSx4MjYsW3NwLCM2NF0KKwlzdHAJeDI3LHgyOCxbc3AsIzgwXQorCisJc3ViCXgyNixzcCx4NSxsc2wjMworCWxzbAl4NSx4NSwjMworCWxkcgl4NCxbeDRdCQkvLyAqbjAKKwlzdWIJc3AseDI2LCM4KjQJCS8vIGFsbG9jYQorCisJYWRkCXgxMCx4Mix4NQorCWFkZAl4MjcseDEseDUKKwlzdHAJeDAseDEwLFt4MjksIzk2XQkvLyBvZmZsb2FkIHJwIGFuZCAmYltudW1dCisKKwlsZHIJeDI0LFt4MiwjOCowXQkJLy8gYlswXQorCWxkcAl4Nix4NyxbeDEsIzgqMF0JLy8gYVswLi4zXQorCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlhZGQJeDEseDEsIzgqNAorCW1vdgl4MTkseHpyCisJbW92CXgyMCx4enIKKwltb3YJeDIxLHh6cgorCW1vdgl4MjIseHpyCisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCS8vIG5bMC4uM10KKwlsZHAJeDE2LHgxNyxbeDMsIzgqMl0KKwlhZGRzCXgzLHgzLCM4KjQJCS8vIGNsZWFyIGNhcnJ5IGJpdAorCW1vdgl4MCx4enIKKwltb3YJeDI4LCMwCisJbW92CXgyNixzcAorCisuTG9vcF9tdWw0eF8xc3RfcmVkdWN0aW9uOgorCW11bAl4MTAseDYseDI0CQkvLyBsbyhhWzAuLjNdKmJbMF0pCisJYWRjCXgwLHgwLHh6cgkvLyBtb2R1bG8tc2NoZWR1bGVkCisJbXVsCXgxMSx4Nyx4MjQKKwlhZGQJeDI4LHgyOCwjOAorCW11bAl4MTIseDgseDI0CisJYW5kCXgyOCx4MjgsIzMxCisJbXVsCXgxMyx4OSx4MjQKKwlhZGRzCXgxOSx4MTkseDEwCisJdW11bGgJeDEwLHg2LHgyNAkJLy8gaGkoYVswLi4zXSpiWzBdKQorCWFkY3MJeDIwLHgyMCx4MTEKKwltdWwJeDI1LHgxOSx4NAkJLy8gdFswXSpuMAorCWFkY3MJeDIxLHgyMSx4MTIKKwl1bXVsaAl4MTEseDcseDI0CisJYWRjcwl4MjIseDIyLHgxMworCXVtdWxoCXgxMix4OCx4MjQKKwlhZGMJeDIzLHh6cix4enIKKwl1bXVsaAl4MTMseDkseDI0CisJbGRyCXgyNCxbeDIseDI4XQkJLy8gbmV4dCBiW2ldIChvciBiWzBdKQorCWFkZHMJeDIwLHgyMCx4MTAKKwkvLyAoKikJbXVsCXgxMCx4MTQseDI1CS8vIGxvKG5bMC4uM10qdFswXSpuMCkKKwlzdHIJeDI1LFt4MjZdLCM4CQkvLyBwdXQgYXNpZGUgdFswXSpuMCBmb3IgdGFpbCBwcm9jZXNzaW5nCisJYWRjcwl4MjEseDIxLHgxMQorCW11bAl4MTEseDE1LHgyNQorCWFkY3MJeDIyLHgyMix4MTIKKwltdWwJeDEyLHgxNix4MjUKKwlhZGMJeDIzLHgyMyx4MTMJCS8vIGNhbid0IG92ZXJmbG93CisJbXVsCXgxMyx4MTcseDI1CisJLy8gKCopCWFkZHMJeHpyLHgxOSx4MTAKKwlzdWJzCXh6cix4MTksIzEJCS8vICgqKQorCXVtdWxoCXgxMCx4MTQseDI1CQkvLyBoaShuWzAuLjNdKnRbMF0qbjApCisJYWRjcwl4MTkseDIwLHgxMQorCXVtdWxoCXgxMSx4MTUseDI1CisJYWRjcwl4MjAseDIxLHgxMgorCXVtdWxoCXgxMix4MTYseDI1CisJYWRjcwl4MjEseDIyLHgxMworCXVtdWxoCXgxMyx4MTcseDI1CisJYWRjcwl4MjIseDIzLHgwCisJYWRjCXgwLHh6cix4enIKKwlhZGRzCXgxOSx4MTkseDEwCisJc3ViCXgxMCx4MjcseDEKKwlhZGNzCXgyMCx4MjAseDExCisJYWRjcwl4MjEseDIxLHgxMgorCWFkY3MJeDIyLHgyMix4MTMKKwkvL2FkYwl4MCx4MCx4enIKKwljYm56CXgyOCwuTG9vcF9tdWw0eF8xc3RfcmVkdWN0aW9uCisKKwljYnoJeDEwLC5MbXVsNHg0X3Bvc3RfY29uZGl0aW9uCisKKwlsZHAJeDYseDcsW3gxLCM4KjBdCS8vIGFbNC4uN10KKwlsZHAJeDgseDksW3gxLCM4KjJdCisJYWRkCXgxLHgxLCM4KjQKKwlsZHIJeDI1LFtzcF0JCS8vIGFbMF0qbjAKKwlsZHAJeDE0LHgxNSxbeDMsIzgqMF0JLy8gbls0Li43XQorCWxkcAl4MTYseDE3LFt4MywjOCoyXQorCWFkZAl4Myx4MywjOCo0CisKKy5Mb29wX211bDR4XzFzdF90YWlsOgorCW11bAl4MTAseDYseDI0CQkvLyBsbyhhWzQuLjddKmJbaV0pCisJYWRjCXgwLHgwLHh6cgkvLyBtb2R1bG8tc2NoZWR1bGVkCisJbXVsCXgxMSx4Nyx4MjQKKwlhZGQJeDI4LHgyOCwjOAorCW11bAl4MTIseDgseDI0CisJYW5kCXgyOCx4MjgsIzMxCisJbXVsCXgxMyx4OSx4MjQKKwlhZGRzCXgxOSx4MTkseDEwCisJdW11bGgJeDEwLHg2LHgyNAkJLy8gaGkoYVs0Li43XSpiW2ldKQorCWFkY3MJeDIwLHgyMCx4MTEKKwl1bXVsaAl4MTEseDcseDI0CisJYWRjcwl4MjEseDIxLHgxMgorCXVtdWxoCXgxMix4OCx4MjQKKwlhZGNzCXgyMix4MjIseDEzCisJdW11bGgJeDEzLHg5LHgyNAorCWFkYwl4MjMseHpyLHh6cgorCWxkcgl4MjQsW3gyLHgyOF0JCS8vIG5leHQgYltpXSAob3IgYlswXSkKKwlhZGRzCXgyMCx4MjAseDEwCisJbXVsCXgxMCx4MTQseDI1CQkvLyBsbyhuWzQuLjddKmFbMF0qbjApCisJYWRjcwl4MjEseDIxLHgxMQorCW11bAl4MTEseDE1LHgyNQorCWFkY3MJeDIyLHgyMix4MTIKKwltdWwJeDEyLHgxNix4MjUKKwlhZGMJeDIzLHgyMyx4MTMJCS8vIGNhbid0IG92ZXJmbG93CisJbXVsCXgxMyx4MTcseDI1CisJYWRkcwl4MTkseDE5LHgxMAorCXVtdWxoCXgxMCx4MTQseDI1CQkvLyBoaShuWzQuLjddKmFbMF0qbjApCisJYWRjcwl4MjAseDIwLHgxMQorCXVtdWxoCXgxMSx4MTUseDI1CisJYWRjcwl4MjEseDIxLHgxMgorCXVtdWxoCXgxMix4MTYseDI1CisJYWRjcwl4MjIseDIyLHgxMworCWFkY3MJeDIzLHgyMyx4MAorCXVtdWxoCXgxMyx4MTcseDI1CisJYWRjCXgwLHh6cix4enIKKwlsZHIJeDI1LFtzcCx4MjhdCQkvLyBuZXh0IHRbMF0qbjAKKwlzdHIJeDE5LFt4MjZdLCM4CQkvLyByZXN1bHQhISEKKwlhZGRzCXgxOSx4MjAseDEwCisJc3ViCXgxMCx4MjcseDEJCS8vIGRvbmUgeWV0PworCWFkY3MJeDIwLHgyMSx4MTEKKwlhZGNzCXgyMSx4MjIseDEyCisJYWRjcwl4MjIseDIzLHgxMworCS8vYWRjCXgwLHgwLHh6cgorCWNibnoJeDI4LC5Mb29wX211bDR4XzFzdF90YWlsCisKKwlzdWIJeDExLHgyNyx4NQkvLyByZXdpbmRlZCB4MQorCWNiegl4MTAsLkxtdWw0eF9wcm9jZWVkCisKKwlsZHAJeDYseDcsW3gxLCM4KjBdCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWFkZAl4MSx4MSwjOCo0CisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCisJbGRwCXgxNix4MTcsW3gzLCM4KjJdCisJYWRkCXgzLHgzLCM4KjQKKwliCS5Mb29wX211bDR4XzFzdF90YWlsCisKKy5hbGlnbgk1CisuTG11bDR4X3Byb2NlZWQ6CisJbGRyCXgyNCxbeDIsIzgqNF0hCQkvLyAqKytiCisJYWRjCXgzMCx4MCx4enIKKwlsZHAJeDYseDcsW3gxMSwjOCowXQkvLyBhWzAuLjNdCisJc3ViCXgzLHgzLHg1CQkvLyByZXdpbmQgbnAKKwlsZHAJeDgseDksW3gxMSwjOCoyXQorCWFkZAl4MSx4MTEsIzgqNAorCisJc3RwCXgxOSx4MjAsW3gyNiwjOCowXQkvLyByZXN1bHQhISEKKwlsZHAJeDE5LHgyMCxbc3AsIzgqNF0JLy8gdFswLi4zXQorCXN0cAl4MjEseDIyLFt4MjYsIzgqMl0JLy8gcmVzdWx0ISEhCisJbGRwCXgyMSx4MjIsW3NwLCM4KjZdCisKKwlsZHAJeDE0LHgxNSxbeDMsIzgqMF0JLy8gblswLi4zXQorCW1vdgl4MjYsc3AKKwlsZHAJeDE2LHgxNyxbeDMsIzgqMl0KKwlhZGRzCXgzLHgzLCM4KjQJCS8vIGNsZWFyIGNhcnJ5IGJpdAorCW1vdgl4MCx4enIKKworLmFsaWduCTQKKy5Mb29wX211bDR4X3JlZHVjdGlvbjoKKwltdWwJeDEwLHg2LHgyNAkJLy8gbG8oYVswLi4zXSpiWzRdKQorCWFkYwl4MCx4MCx4enIJLy8gbW9kdWxvLXNjaGVkdWxlZAorCW11bAl4MTEseDcseDI0CisJYWRkCXgyOCx4MjgsIzgKKwltdWwJeDEyLHg4LHgyNAorCWFuZAl4MjgseDI4LCMzMQorCW11bAl4MTMseDkseDI0CisJYWRkcwl4MTkseDE5LHgxMAorCXVtdWxoCXgxMCx4Nix4MjQJCS8vIGhpKGFbMC4uM10qYls0XSkKKwlhZGNzCXgyMCx4MjAseDExCisJbXVsCXgyNSx4MTkseDQJCS8vIHRbMF0qbjAKKwlhZGNzCXgyMSx4MjEseDEyCisJdW11bGgJeDExLHg3LHgyNAorCWFkY3MJeDIyLHgyMix4MTMKKwl1bXVsaAl4MTIseDgseDI0CisJYWRjCXgyMyx4enIseHpyCisJdW11bGgJeDEzLHg5LHgyNAorCWxkcgl4MjQsW3gyLHgyOF0JCS8vIG5leHQgYltpXQorCWFkZHMJeDIwLHgyMCx4MTAKKwkvLyAoKikJbXVsCXgxMCx4MTQseDI1CisJc3RyCXgyNSxbeDI2XSwjOAkJLy8gcHV0IGFzaWRlIHRbMF0qbjAgZm9yIHRhaWwgcHJvY2Vzc2luZworCWFkY3MJeDIxLHgyMSx4MTEKKwltdWwJeDExLHgxNSx4MjUJCS8vIGxvKG5bMC4uM10qdFswXSpuMAorCWFkY3MJeDIyLHgyMix4MTIKKwltdWwJeDEyLHgxNix4MjUKKwlhZGMJeDIzLHgyMyx4MTMJCS8vIGNhbid0IG92ZXJmbG93CisJbXVsCXgxMyx4MTcseDI1CisJLy8gKCopCWFkZHMJeHpyLHgxOSx4MTAKKwlzdWJzCXh6cix4MTksIzEJCS8vICgqKQorCXVtdWxoCXgxMCx4MTQseDI1CQkvLyBoaShuWzAuLjNdKnRbMF0qbjAKKwlhZGNzCXgxOSx4MjAseDExCisJdW11bGgJeDExLHgxNSx4MjUKKwlhZGNzCXgyMCx4MjEseDEyCisJdW11bGgJeDEyLHgxNix4MjUKKwlhZGNzCXgyMSx4MjIseDEzCisJdW11bGgJeDEzLHgxNyx4MjUKKwlhZGNzCXgyMix4MjMseDAKKwlhZGMJeDAseHpyLHh6cgorCWFkZHMJeDE5LHgxOSx4MTAKKwlhZGNzCXgyMCx4MjAseDExCisJYWRjcwl4MjEseDIxLHgxMgorCWFkY3MJeDIyLHgyMix4MTMKKwkvL2FkYwl4MCx4MCx4enIKKwljYm56CXgyOCwuTG9vcF9tdWw0eF9yZWR1Y3Rpb24KKworCWFkYwl4MCx4MCx4enIKKwlsZHAJeDEwLHgxMSxbeDI2LCM4KjRdCS8vIHRbNC4uN10KKwlsZHAJeDEyLHgxMyxbeDI2LCM4KjZdCisJbGRwCXg2LHg3LFt4MSwjOCowXQkvLyBhWzQuLjddCisJbGRwCXg4LHg5LFt4MSwjOCoyXQorCWFkZAl4MSx4MSwjOCo0CisJYWRkcwl4MTkseDE5LHgxMAorCWFkY3MJeDIwLHgyMCx4MTEKKwlhZGNzCXgyMSx4MjEseDEyCisJYWRjcwl4MjIseDIyLHgxMworCS8vYWRjCXgwLHgwLHh6cgorCisJbGRyCXgyNSxbc3BdCQkvLyB0WzBdKm4wCisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCS8vIG5bNC4uN10KKwlsZHAJeDE2LHgxNyxbeDMsIzgqMl0KKwlhZGQJeDMseDMsIzgqNAorCisuYWxpZ24JNAorLkxvb3BfbXVsNHhfdGFpbDoKKwltdWwJeDEwLHg2LHgyNAkJLy8gbG8oYVs0Li43XSpiWzRdKQorCWFkYwl4MCx4MCx4enIJLy8gbW9kdWxvLXNjaGVkdWxlZAorCW11bAl4MTEseDcseDI0CisJYWRkCXgyOCx4MjgsIzgKKwltdWwJeDEyLHg4LHgyNAorCWFuZAl4MjgseDI4LCMzMQorCW11bAl4MTMseDkseDI0CisJYWRkcwl4MTkseDE5LHgxMAorCXVtdWxoCXgxMCx4Nix4MjQJCS8vIGhpKGFbNC4uN10qYls0XSkKKwlhZGNzCXgyMCx4MjAseDExCisJdW11bGgJeDExLHg3LHgyNAorCWFkY3MJeDIxLHgyMSx4MTIKKwl1bXVsaAl4MTIseDgseDI0CisJYWRjcwl4MjIseDIyLHgxMworCXVtdWxoCXgxMyx4OSx4MjQKKwlhZGMJeDIzLHh6cix4enIKKwlsZHIJeDI0LFt4Mix4MjhdCQkvLyBuZXh0IGJbaV0KKwlhZGRzCXgyMCx4MjAseDEwCisJbXVsCXgxMCx4MTQseDI1CQkvLyBsbyhuWzQuLjddKnRbMF0qbjApCisJYWRjcwl4MjEseDIxLHgxMQorCW11bAl4MTEseDE1LHgyNQorCWFkY3MJeDIyLHgyMix4MTIKKwltdWwJeDEyLHgxNix4MjUKKwlhZGMJeDIzLHgyMyx4MTMJCS8vIGNhbid0IG92ZXJmbG93CisJbXVsCXgxMyx4MTcseDI1CisJYWRkcwl4MTkseDE5LHgxMAorCXVtdWxoCXgxMCx4MTQseDI1CQkvLyBoaShuWzQuLjddKnRbMF0qbjApCisJYWRjcwl4MjAseDIwLHgxMQorCXVtdWxoCXgxMSx4MTUseDI1CisJYWRjcwl4MjEseDIxLHgxMgorCXVtdWxoCXgxMix4MTYseDI1CisJYWRjcwl4MjIseDIyLHgxMworCXVtdWxoCXgxMyx4MTcseDI1CisJYWRjcwl4MjMseDIzLHgwCisJbGRyCXgyNSxbc3AseDI4XQkJLy8gbmV4dCBhWzBdKm4wCisJYWRjCXgwLHh6cix4enIKKwlzdHIJeDE5LFt4MjZdLCM4CQkvLyByZXN1bHQhISEKKwlhZGRzCXgxOSx4MjAseDEwCisJc3ViCXgxMCx4MjcseDEJCS8vIGRvbmUgeWV0PworCWFkY3MJeDIwLHgyMSx4MTEKKwlhZGNzCXgyMSx4MjIseDEyCisJYWRjcwl4MjIseDIzLHgxMworCS8vYWRjCXgwLHgwLHh6cgorCWNibnoJeDI4LC5Mb29wX211bDR4X3RhaWwKKworCXN1Ygl4MTEseDMseDUJCS8vIHJld2luZGVkIG5wPworCWFkYwl4MCx4MCx4enIKKwljYnoJeDEwLC5Mb29wX211bDR4X2JyZWFrCisKKwlsZHAJeDEwLHgxMSxbeDI2LCM4KjRdCisJbGRwCXgxMix4MTMsW3gyNiwjOCo2XQorCWxkcAl4Nix4NyxbeDEsIzgqMF0KKwlsZHAJeDgseDksW3gxLCM4KjJdCisJYWRkCXgxLHgxLCM4KjQKKwlhZGRzCXgxOSx4MTkseDEwCisJYWRjcwl4MjAseDIwLHgxMQorCWFkY3MJeDIxLHgyMSx4MTIKKwlhZGNzCXgyMix4MjIseDEzCisJLy9hZGMJeDAseDAseHpyCisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCisJbGRwCXgxNix4MTcsW3gzLCM4KjJdCisJYWRkCXgzLHgzLCM4KjQKKwliCS5Mb29wX211bDR4X3RhaWwKKworLmFsaWduCTQKKy5Mb29wX211bDR4X2JyZWFrOgorCWxkcAl4MTIseDEzLFt4MjksIzk2XQkvLyBwdWxsIHJwIGFuZCAmYltudW1dCisJYWRkcwl4MTkseDE5LHgzMAorCWFkZAl4Mix4MiwjOCo0CQkvLyBicCsrCisJYWRjcwl4MjAseDIwLHh6cgorCXN1Ygl4MSx4MSx4NQkJLy8gcmV3aW5kIGFwCisJYWRjcwl4MjEseDIxLHh6cgorCXN0cAl4MTkseDIwLFt4MjYsIzgqMF0JLy8gcmVzdWx0ISEhCisJYWRjcwl4MjIseDIyLHh6cgorCWxkcAl4MTkseDIwLFtzcCwjOCo0XQkvLyB0WzAuLjNdCisJYWRjCXgzMCx4MCx4enIKKwlzdHAJeDIxLHgyMixbeDI2LCM4KjJdCS8vIHJlc3VsdCEhIQorCWNtcAl4Mix4MTMJCQkvLyBkb25lIHlldD8KKwlsZHAJeDIxLHgyMixbc3AsIzgqNl0KKwlsZHAJeDE0LHgxNSxbeDExLCM4KjBdCS8vIG5bMC4uM10KKwlsZHAJeDE2LHgxNyxbeDExLCM4KjJdCisJYWRkCXgzLHgxMSwjOCo0CisJYi5lcQkuTG11bDR4X3Bvc3QKKworCWxkcgl4MjQsW3gyXQorCWxkcAl4Nix4NyxbeDEsIzgqMF0JLy8gYVswLi4zXQorCWxkcAl4OCx4OSxbeDEsIzgqMl0KKwlhZGRzCXgxLHgxLCM4KjQJCS8vIGNsZWFyIGNhcnJ5IGJpdAorCW1vdgl4MCx4enIKKwltb3YJeDI2LHNwCisJYgkuTG9vcF9tdWw0eF9yZWR1Y3Rpb24KKworLmFsaWduCTQKKy5MbXVsNHhfcG9zdDoKKwkvLyBGaW5hbCBzdGVwLiBXZSBzZWUgaWYgcmVzdWx0IGlzIGxhcmdlciB0aGFuIG1vZHVsdXMsIGFuZAorCS8vIGlmIGl0IGlzLCBzdWJ0cmFjdCB0aGUgbW9kdWx1cy4gQnV0IGNvbXBhcmlzb24gaW1wbGllcworCS8vIHN1YnRyYWN0aW9uLiBTbyB3ZSBzdWJ0cmFjdCBtb2R1bHVzLCBzZWUgaWYgaXQgYm9ycm93ZWQsCisJLy8gYW5kIGNvbmRpdGlvbmFsbHkgY29weSBvcmlnaW5hbCB2YWx1ZS4KKwltb3YJeDAseDEyCisJbW92CXgyNyx4MTIJCS8vIHgwIGNvcHkKKwlzdWJzCXgxMCx4MTkseDE0CisJYWRkCXgyNixzcCwjOCo4CisJc2Jjcwl4MTEseDIwLHgxNQorCXN1Ygl4MjgseDUsIzgqNAorCisuTG11bDR4X3N1YjoKKwlzYmNzCXgxMix4MjEseDE2CisJbGRwCXgxNCx4MTUsW3gzLCM4KjBdCisJc3ViCXgyOCx4MjgsIzgqNAorCWxkcAl4MTkseDIwLFt4MjYsIzgqMF0KKwlzYmNzCXgxMyx4MjIseDE3CisJbGRwCXgxNix4MTcsW3gzLCM4KjJdCisJYWRkCXgzLHgzLCM4KjQKKwlsZHAJeDIxLHgyMixbeDI2LCM4KjJdCisJYWRkCXgyNix4MjYsIzgqNAorCXN0cAl4MTAseDExLFt4MCwjOCowXQorCXNiY3MJeDEwLHgxOSx4MTQKKwlzdHAJeDEyLHgxMyxbeDAsIzgqMl0KKwlhZGQJeDAseDAsIzgqNAorCXNiY3MJeDExLHgyMCx4MTUKKwljYm56CXgyOCwuTG11bDR4X3N1YgorCisJc2Jjcwl4MTIseDIxLHgxNgorCW1vdgl4MjYsc3AKKwlhZGQJeDEsc3AsIzgqNAorCWxkcAl4Nix4NyxbeDI3LCM4KjBdCisJc2Jjcwl4MTMseDIyLHgxNworCXN0cAl4MTAseDExLFt4MCwjOCowXQorCWxkcAl4OCx4OSxbeDI3LCM4KjJdCisJc3RwCXgxMix4MTMsW3gwLCM4KjJdCisJbGRwCXgxOSx4MjAsW3gxLCM4KjBdCisJbGRwCXgyMSx4MjIsW3gxLCM4KjJdCisJc2Jjcwl4enIseDMwLHh6cgkvLyBkaWQgaXQgYm9ycm93PworCWxkcgl4MzAsW3gyOSwjOF0JCS8vIHB1bGwgcmV0dXJuIGFkZHJlc3MKKworCXN1Ygl4MjgseDUsIzgqNAorLkxtdWw0eF9jb25kX2NvcHk6CisJc3ViCXgyOCx4MjgsIzgqNAorCWNzZWwJeDEwLHgxOSx4NixsbworCXN0cAl4enIseHpyLFt4MjYsIzgqMF0KKwljc2VsCXgxMSx4MjAseDcsbG8KKwlsZHAJeDYseDcsW3gyNywjOCo0XQorCWxkcAl4MTkseDIwLFt4MSwjOCo0XQorCWNzZWwJeDEyLHgyMSx4OCxsbworCXN0cAl4enIseHpyLFt4MjYsIzgqMl0KKwlhZGQJeDI2LHgyNiwjOCo0CisJY3NlbAl4MTMseDIyLHg5LGxvCisJbGRwCXg4LHg5LFt4MjcsIzgqNl0KKwlsZHAJeDIxLHgyMixbeDEsIzgqNl0KKwlhZGQJeDEseDEsIzgqNAorCXN0cAl4MTAseDExLFt4MjcsIzgqMF0KKwlzdHAJeDEyLHgxMyxbeDI3LCM4KjJdCisJYWRkCXgyNyx4MjcsIzgqNAorCWNibnoJeDI4LC5MbXVsNHhfY29uZF9jb3B5CisKKwljc2VsCXgxMCx4MTkseDYsbG8KKwlzdHAJeHpyLHh6cixbeDI2LCM4KjBdCisJY3NlbAl4MTEseDIwLHg3LGxvCisJc3RwCXh6cix4enIsW3gyNiwjOCoyXQorCWNzZWwJeDEyLHgyMSx4OCxsbworCXN0cAl4enIseHpyLFt4MjYsIzgqM10KKwljc2VsCXgxMyx4MjIseDksbG8KKwlzdHAJeHpyLHh6cixbeDI2LCM4KjRdCisJc3RwCXgxMCx4MTEsW3gyNywjOCowXQorCXN0cAl4MTIseDEzLFt4MjcsIzgqMl0KKworCWIJLkxtdWw0eF9kb25lCisKKy5hbGlnbgk0CisuTG11bDR4NF9wb3N0X2NvbmRpdGlvbjoKKwlhZGMJeDAseDAseHpyCisJbGRyCXgxLFt4MjksIzk2XQkJLy8gcHVsbCBycAorCS8vIHgxOS0zLHgwIGhvbGQgcmVzdWx0LCB4MTQtNyBob2xkIG1vZHVsdXMKKwlzdWJzCXg2LHgxOSx4MTQKKwlsZHIJeDMwLFt4MjksIzhdCQkvLyBwdWxsIHJldHVybiBhZGRyZXNzCisJc2Jjcwl4Nyx4MjAseDE1CisJc3RwCXh6cix4enIsW3NwLCM4KjBdCisJc2Jjcwl4OCx4MjEseDE2CisJc3RwCXh6cix4enIsW3NwLCM4KjJdCisJc2Jjcwl4OSx4MjIseDE3CisJc3RwCXh6cix4enIsW3NwLCM4KjRdCisJc2Jjcwl4enIseDAseHpyCQkvLyBkaWQgaXQgYm9ycm93PworCXN0cAl4enIseHpyLFtzcCwjOCo2XQorCisJLy8geDYtMyBob2xkIHJlc3VsdC1tb2R1bHVzCisJY3NlbAl4Nix4MTkseDYsbG8KKwljc2VsCXg3LHgyMCx4NyxsbworCWNzZWwJeDgseDIxLHg4LGxvCisJY3NlbAl4OSx4MjIseDksbG8KKwlzdHAJeDYseDcsW3gxLCM4KjBdCisJc3RwCXg4LHg5LFt4MSwjOCoyXQorCisuTG11bDR4X2RvbmU6CisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJbW92CXNwLHgyOQorCWxkcAl4MjEseDIyLFt4MjksIzMyXQorCW1vdgl4MCwjMQorCWxkcAl4MjMseDI0LFt4MjksIzQ4XQorCWxkcAl4MjUseDI2LFt4MjksIzY0XQorCWxkcAl4MjcseDI4LFt4MjksIzgwXQorCWxkcgl4MjksW3NwXSwjMTI4CisJcmV0Cisuc2l6ZQlfX2JuX211bDR4X21vbnQsLi1fX2JuX211bDR4X21vbnQKKy5ieXRlCTc3LDExMSwxMTAsMTE2LDEwMywxMTEsMTA5LDEwMSwxMTQsMTIxLDMyLDc3LDExNywxMDgsMTE2LDEwNSwxMTIsMTA4LDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JNAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2h2OC1hcm14NjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHY4LWFybXg2NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMGQxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2h2OC1hcm14NjQuUwpAQCAtMCwwICsxLDIzMyBAQAorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisudGV4dAorLmFyY2gJYXJtdjgtYStjcnlwdG8KKy5nbG9ibAlnY21faW5pdF92OAorLmhpZGRlbglnY21faW5pdF92OAorLnR5cGUJZ2NtX2luaXRfdjgsJWZ1bmN0aW9uCisuYWxpZ24JNAorZ2NtX2luaXRfdjg6CisJbGQxCXt2MTcuMmR9LFt4MV0JCS8vbG9hZCBpbnB1dCBICisJbW92aQl2MTkuMTZiLCMweGUxCisJc2hsCXYxOS4yZCx2MTkuMmQsIzU3CQkvLzB4YzIuMAorCWV4dAl2My4xNmIsdjE3LjE2Yix2MTcuMTZiLCM4CisJdXNocgl2MTguMmQsdjE5LjJkLCM2MworCWR1cAl2MTcuNHMsdjE3LnNbMV0KKwlleHQJdjE2LjE2Yix2MTguMTZiLHYxOS4xNmIsIzgJCS8vdDA9MHhjMi4uLi4wMQorCXVzaHIJdjE4LjJkLHYzLjJkLCM2MworCXNzaHIJdjE3LjRzLHYxNy40cywjMzEJCS8vYnJvYWRjYXN0IGNhcnJ5IGJpdAorCWFuZAl2MTguMTZiLHYxOC4xNmIsdjE2LjE2YgorCXNobAl2My4yZCx2My4yZCwjMQorCWV4dAl2MTguMTZiLHYxOC4xNmIsdjE4LjE2YiwjOAorCWFuZAl2MTYuMTZiLHYxNi4xNmIsdjE3LjE2YgorCW9ycgl2My4xNmIsdjMuMTZiLHYxOC4xNmIJCS8vSDw8PD0xCisJZW9yCXYyMC4xNmIsdjMuMTZiLHYxNi4xNmIJCS8vdHdpc3RlZCBICisJc3QxCXt2MjAuMmR9LFt4MF0sIzE2CQkvL3N0b3JlIEh0YWJsZVswXQorCisJLy9jYWxjdWxhdGUgSF4yCisJZXh0CXYxNi4xNmIsdjIwLjE2Yix2MjAuMTZiLCM4CQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCXBtdWxsCXYwLjFxLHYyMC4xZCx2MjAuMWQKKwllb3IJdjE2LjE2Yix2MTYuMTZiLHYyMC4xNmIKKwlwbXVsbDIJdjIuMXEsdjIwLjJkLHYyMC4yZAorCXBtdWxsCXYxLjFxLHYxNi4xZCx2MTYuMWQKKworCWV4dAl2MTcuMTZiLHYwLjE2Yix2Mi4xNmIsIzgJCS8vS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCWVvcgl2MTguMTZiLHYwLjE2Yix2Mi4xNmIKKwllb3IJdjEuMTZiLHYxLjE2Yix2MTcuMTZiCisJZW9yCXYxLjE2Yix2MS4xNmIsdjE4LjE2YgorCXBtdWxsCXYxOC4xcSx2MC4xZCx2MTkuMWQJCS8vMXN0IHBoYXNlCisKKwlpbnMJdjIuZFswXSx2MS5kWzFdCisJaW5zCXYxLmRbMV0sdjAuZFswXQorCWVvcgl2MC4xNmIsdjEuMTZiLHYxOC4xNmIKKworCWV4dAl2MTguMTZiLHYwLjE2Yix2MC4xNmIsIzgJCS8vMm5kIHBoYXNlCisJcG11bGwJdjAuMXEsdjAuMWQsdjE5LjFkCisJZW9yCXYxOC4xNmIsdjE4LjE2Yix2Mi4xNmIKKwllb3IJdjIyLjE2Yix2MC4xNmIsdjE4LjE2YgorCisJZXh0CXYxNy4xNmIsdjIyLjE2Yix2MjIuMTZiLCM4CQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjIyLjE2YgorCWV4dAl2MjEuMTZiLHYxNi4xNmIsdjE3LjE2YiwjOAkJLy9wYWNrIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2VkCisJc3QxCXt2MjEuMmQsdjIyLjJkfSxbeDBdCQkvL3N0b3JlIEh0YWJsZVsxLi4yXQorCisJcmV0Cisuc2l6ZQlnY21faW5pdF92OCwuLWdjbV9pbml0X3Y4CisuZ2xvYmwJZ2NtX2dtdWx0X3Y4CisuaGlkZGVuCWdjbV9nbXVsdF92OAorLnR5cGUJZ2NtX2dtdWx0X3Y4LCVmdW5jdGlvbgorLmFsaWduCTQKK2djbV9nbXVsdF92ODoKKwlsZDEJe3YxNy4yZH0sW3gwXQkJLy9sb2FkIFhpCisJbW92aQl2MTkuMTZiLCMweGUxCisJbGQxCXt2MjAuMmQsdjIxLjJkfSxbeDFdCS8vbG9hZCB0d2lzdGVkIEgsIC4uLgorCXNobAl2MTkuMmQsdjE5LjJkLCM1NworI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTcuMTZiLHYxNy4xNmIKKyNlbmRpZgorCWV4dAl2My4xNmIsdjE3LjE2Yix2MTcuMTZiLCM4CisKKwlwbXVsbAl2MC4xcSx2MjAuMWQsdjMuMWQJCS8vSC5sb8K3WGkubG8KKwllb3IJdjE3LjE2Yix2MTcuMTZiLHYzLjE2YgkJLy9LYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwlwbXVsbDIJdjIuMXEsdjIwLjJkLHYzLjJkCQkvL0guaGnCt1hpLmhpCisJcG11bGwJdjEuMXEsdjIxLjFkLHYxNy4xZAkJLy8oSC5sbytILmhpKcK3KFhpLmxvK1hpLmhpKQorCisJZXh0CXYxNy4xNmIsdjAuMTZiLHYyLjE2YiwjOAkJLy9LYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCisJZW9yCXYxOC4xNmIsdjAuMTZiLHYyLjE2YgorCWVvcgl2MS4xNmIsdjEuMTZiLHYxNy4xNmIKKwllb3IJdjEuMTZiLHYxLjE2Yix2MTguMTZiCisJcG11bGwJdjE4LjFxLHYwLjFkLHYxOS4xZAkJLy8xc3QgcGhhc2Ugb2YgcmVkdWN0aW9uCisKKwlpbnMJdjIuZFswXSx2MS5kWzFdCisJaW5zCXYxLmRbMV0sdjAuZFswXQorCWVvcgl2MC4xNmIsdjEuMTZiLHYxOC4xNmIKKworCWV4dAl2MTguMTZiLHYwLjE2Yix2MC4xNmIsIzgJCS8vMm5kIHBoYXNlIG9mIHJlZHVjdGlvbgorCXBtdWxsCXYwLjFxLHYwLjFkLHYxOS4xZAorCWVvcgl2MTguMTZiLHYxOC4xNmIsdjIuMTZiCisJZW9yCXYwLjE2Yix2MC4xNmIsdjE4LjE2YgorCisjaWZuZGVmIF9fQVJNRUJfXworCXJldjY0CXYwLjE2Yix2MC4xNmIKKyNlbmRpZgorCWV4dAl2MC4xNmIsdjAuMTZiLHYwLjE2YiwjOAorCXN0MQl7djAuMmR9LFt4MF0JCS8vd3JpdGUgb3V0IFhpCisKKwlyZXQKKy5zaXplCWdjbV9nbXVsdF92OCwuLWdjbV9nbXVsdF92OAorLmdsb2JsCWdjbV9naGFzaF92OAorLmhpZGRlbglnY21fZ2hhc2hfdjgKKy50eXBlCWdjbV9naGFzaF92OCwlZnVuY3Rpb24KKy5hbGlnbgk0CitnY21fZ2hhc2hfdjg6CisJbGQxCXt2MC4yZH0sW3gwXQkJLy9sb2FkIFtyb3RhdGVkXSBYaQorCQkJCQkJLy8iW3JvdGF0ZWRdIiBtZWFucyB0aGF0CisJCQkJCQkvL2xvYWRlZCB2YWx1ZSB3b3VsZCBoYXZlCisJCQkJCQkvL3RvIGJlIHJvdGF0ZWQgaW4gb3JkZXIgdG8KKwkJCQkJCS8vbWFrZSBpdCBhcHBlYXIgYXMgaW4KKwkJCQkJCS8vYWxnb3JpdGhtIHNwZWNpZmljYXRpb24KKwlzdWJzCXgzLHgzLCMzMgkJLy9zZWUgaWYgeDMgaXMgMzIgb3IgbGFyZ2VyCisJbW92CXgxMiwjMTYJCS8veDEyIGlzIHVzZWQgYXMgcG9zdC0KKwkJCQkJCS8vaW5jcmVtZW50IGZvciBpbnB1dCBwb2ludGVyOworCQkJCQkJLy9hcyBsb29wIGlzIG1vZHVsby1zY2hlZHVsZWQKKwkJCQkJCS8veDEyIGlzIHplcm9lZCBqdXN0IGluIHRpbWUKKwkJCQkJCS8vdG8gcHJlY2x1ZGUgb3ZlcnN0ZXBwaW5nCisJCQkJCQkvL2lucFtsZW5dLCB3aGljaCBtZWFucyB0aGF0CisJCQkJCQkvL2xhc3QgYmxvY2tbc10gYXJlIGFjdHVhbGx5CisJCQkJCQkvL2xvYWRlZCB0d2ljZSwgYnV0IGxhc3QKKwkJCQkJCS8vY29weSBpcyBub3QgcHJvY2Vzc2VkCisJbGQxCXt2MjAuMmQsdjIxLjJkfSxbeDFdLCMzMgkvL2xvYWQgdHdpc3RlZCBILCAuLi4sIEheMgorCW1vdmkJdjE5LjE2YiwjMHhlMQorCWxkMQl7djIyLjJkfSxbeDFdCisJY3NlbAl4MTIseHpyLHgxMixlcQkJCS8vaXMgaXQgdGltZSB0byB6ZXJvIHgxMj8KKwlleHQJdjAuMTZiLHYwLjE2Yix2MC4xNmIsIzgJCS8vcm90YXRlIFhpCisJbGQxCXt2MTYuMmR9LFt4Ml0sIzE2CS8vbG9hZCBbcm90YXRlZF0gSVswXQorCXNobAl2MTkuMmQsdjE5LjJkLCM1NwkJLy9jb21wb3NlIDB4YzIuMCBjb25zdGFudAorI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTYuMTZiLHYxNi4xNmIKKwlyZXY2NAl2MC4xNmIsdjAuMTZiCisjZW5kaWYKKwlleHQJdjMuMTZiLHYxNi4xNmIsdjE2LjE2YiwjOAkJLy9yb3RhdGUgSVswXQorCWIubG8JLkxvZGRfdGFpbF92OAkJLy94MyB3YXMgbGVzcyB0aGFuIDMyCisJbGQxCXt2MTcuMmR9LFt4Ml0seDEyCS8vbG9hZCBbcm90YXRlZF0gSVsxXQorI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTcuMTZiLHYxNy4xNmIKKyNlbmRpZgorCWV4dAl2Ny4xNmIsdjE3LjE2Yix2MTcuMTZiLCM4CisJZW9yCXYzLjE2Yix2My4xNmIsdjAuMTZiCQkvL0lbaV1ePVhpCisJcG11bGwJdjQuMXEsdjIwLjFkLHY3LjFkCQkvL0jCt0lpKzEKKwllb3IJdjE3LjE2Yix2MTcuMTZiLHY3LjE2YgkJLy9LYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwlwbXVsbDIJdjYuMXEsdjIwLjJkLHY3LjJkCisJYgkuTG9vcF9tb2QyeF92OAorCisuYWxpZ24JNAorLkxvb3BfbW9kMnhfdjg6CisJZXh0CXYxOC4xNmIsdjMuMTZiLHYzLjE2YiwjOAorCXN1YnMJeDMseDMsIzMyCQkvL2lzIHRoZXJlIG1vcmUgZGF0YT8KKwlwbXVsbAl2MC4xcSx2MjIuMWQsdjMuMWQJCS8vSF4yLmxvwrdYaS5sbworCWNzZWwJeDEyLHh6cix4MTIsbG8JCQkvL2lzIGl0IHRpbWUgdG8gemVybyB4MTI/CisKKwlwbXVsbAl2NS4xcSx2MjEuMWQsdjE3LjFkCisJZW9yCXYxOC4xNmIsdjE4LjE2Yix2My4xNmIJCS8vS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJcG11bGwyCXYyLjFxLHYyMi4yZCx2My4yZAkJLy9IXjIuaGnCt1hpLmhpCisJZW9yCXYwLjE2Yix2MC4xNmIsdjQuMTZiCQkvL2FjY3VtdWxhdGUKKwlwbXVsbDIJdjEuMXEsdjIxLjJkLHYxOC4yZAkJLy8oSF4yLmxvK0heMi5oaSnCtyhYaS5sbytYaS5oaSkKKwlsZDEJe3YxNi4yZH0sW3gyXSx4MTIJLy9sb2FkIFtyb3RhdGVkXSBJW2krMl0KKworCWVvcgl2Mi4xNmIsdjIuMTZiLHY2LjE2YgorCWNzZWwJeDEyLHh6cix4MTIsZXEJCQkvL2lzIGl0IHRpbWUgdG8gemVybyB4MTI/CisJZW9yCXYxLjE2Yix2MS4xNmIsdjUuMTZiCisKKwlleHQJdjE3LjE2Yix2MC4xNmIsdjIuMTZiLCM4CQkvL0thcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwllb3IJdjE4LjE2Yix2MC4xNmIsdjIuMTZiCisJZW9yCXYxLjE2Yix2MS4xNmIsdjE3LjE2YgorCWxkMQl7djE3LjJkfSxbeDJdLHgxMgkvL2xvYWQgW3JvdGF0ZWRdIElbaSszXQorI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTYuMTZiLHYxNi4xNmIKKyNlbmRpZgorCWVvcgl2MS4xNmIsdjEuMTZiLHYxOC4xNmIKKwlwbXVsbAl2MTguMXEsdjAuMWQsdjE5LjFkCQkvLzFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworI2lmbmRlZiBfX0FSTUVCX18KKwlyZXY2NAl2MTcuMTZiLHYxNy4xNmIKKyNlbmRpZgorCWlucwl2Mi5kWzBdLHYxLmRbMV0KKwlpbnMJdjEuZFsxXSx2MC5kWzBdCisJZXh0CXY3LjE2Yix2MTcuMTZiLHYxNy4xNmIsIzgKKwlleHQJdjMuMTZiLHYxNi4xNmIsdjE2LjE2YiwjOAorCWVvcgl2MC4xNmIsdjEuMTZiLHYxOC4xNmIKKwlwbXVsbAl2NC4xcSx2MjAuMWQsdjcuMWQJCS8vSMK3SWkrMQorCWVvcgl2My4xNmIsdjMuMTZiLHYyLjE2YgkJLy9hY2N1bXVsYXRlIHYzLjE2YiBlYXJseQorCisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAkJLy8ybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisJcG11bGwJdjAuMXEsdjAuMWQsdjE5LjFkCisJZW9yCXYzLjE2Yix2My4xNmIsdjE4LjE2YgorCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjcuMTZiCQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgorCXBtdWxsMgl2Ni4xcSx2MjAuMmQsdjcuMmQKKwliLmhzCS5Mb29wX21vZDJ4X3Y4CQkvL3RoZXJlIHdhcyBhdCBsZWFzdCAzMiBtb3JlIGJ5dGVzCisKKwllb3IJdjIuMTZiLHYyLjE2Yix2MTguMTZiCisJZXh0CXYzLjE2Yix2MTYuMTZiLHYxNi4xNmIsIzgJCS8vcmUtY29uc3RydWN0IHYzLjE2YgorCWFkZHMJeDMseDMsIzMyCQkvL3JlLWNvbnN0cnVjdCB4MworCWVvcgl2MC4xNmIsdjAuMTZiLHYyLjE2YgkJLy9yZS1jb25zdHJ1Y3QgdjAuMTZiCisJYi5lcQkuTGRvbmVfdjgJCS8vaXMgeDMgemVybz8KKy5Mb2RkX3RhaWxfdjg6CisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAorCWVvcgl2My4xNmIsdjMuMTZiLHYwLjE2YgkJLy9pbnBePVhpCisJZW9yCXYxNy4xNmIsdjE2LjE2Yix2MTguMTZiCQkvL3YxNy4xNmIgaXMgcm90YXRlZCBpbnBeWGkKKworCXBtdWxsCXYwLjFxLHYyMC4xZCx2My4xZAkJLy9ILmxvwrdYaS5sbworCWVvcgl2MTcuMTZiLHYxNy4xNmIsdjMuMTZiCQkvL0thcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCXBtdWxsMgl2Mi4xcSx2MjAuMmQsdjMuMmQJCS8vSC5oacK3WGkuaGkKKwlwbXVsbAl2MS4xcSx2MjEuMWQsdjE3LjFkCQkvLyhILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisKKwlleHQJdjE3LjE2Yix2MC4xNmIsdjIuMTZiLCM4CQkvL0thcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwllb3IJdjE4LjE2Yix2MC4xNmIsdjIuMTZiCisJZW9yCXYxLjE2Yix2MS4xNmIsdjE3LjE2YgorCWVvcgl2MS4xNmIsdjEuMTZiLHYxOC4xNmIKKwlwbXVsbAl2MTguMXEsdjAuMWQsdjE5LjFkCQkvLzFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworCWlucwl2Mi5kWzBdLHYxLmRbMV0KKwlpbnMJdjEuZFsxXSx2MC5kWzBdCisJZW9yCXYwLjE2Yix2MS4xNmIsdjE4LjE2YgorCisJZXh0CXYxOC4xNmIsdjAuMTZiLHYwLjE2YiwjOAkJLy8ybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisJcG11bGwJdjAuMXEsdjAuMWQsdjE5LjFkCisJZW9yCXYxOC4xNmIsdjE4LjE2Yix2Mi4xNmIKKwllb3IJdjAuMTZiLHYwLjE2Yix2MTguMTZiCisKKy5MZG9uZV92ODoKKyNpZm5kZWYgX19BUk1FQl9fCisJcmV2NjQJdjAuMTZiLHYwLjE2YgorI2VuZGlmCisJZXh0CXYwLjE2Yix2MC4xNmIsdjAuMTZiLCM4CisJc3QxCXt2MC4yZH0sW3gwXQkJLy93cml0ZSBvdXQgWGkKKworCXJldAorLnNpemUJZ2NtX2doYXNoX3Y4LC4tZ2NtX2doYXNoX3Y4CisuYnl0ZQk3MSw3Miw2NSw4Myw3MiwzMiwxMDIsMTExLDExNCwzMiw2NSw4Miw3NywxMTgsNTYsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTIKKy5hbGlnbgkyCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYWFyY2g2NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY4LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS1hcm12OC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzYxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS1hcm12OC5TCkBAIC0wLDAgKzEsMTIyNCBAQAorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisudGV4dAorCisKKy5nbG9ibAlzaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy5oaWRkZW4Jc2hhMV9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCisuYWxpZ24JNgorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorI2lmZGVmCV9fSUxQMzJfXworCWxkcnN3CXgxNiwuTE9QRU5TU0xfYXJtY2FwX1AKKyNlbHNlCisJbGRyCXgxNiwuTE9QRU5TU0xfYXJtY2FwX1AKKyNlbmRpZgorCWFkcgl4MTcsLkxPUEVOU1NMX2FybWNhcF9QCisJYWRkCXgxNix4MTYseDE3CisJbGRyCXcxNixbeDE2XQorCXRzdAl3MTYsI0FSTVY4X1NIQTEKKwliLm5lCS5MdjhfZW50cnkKKworCXN0cAl4MjkseDMwLFtzcCwjLTk2XSEKKwlhZGQJeDI5LHNwLCMwCisJc3RwCXgxOSx4MjAsW3NwLCMxNl0KKwlzdHAJeDIxLHgyMixbc3AsIzMyXQorCXN0cAl4MjMseDI0LFtzcCwjNDhdCisJc3RwCXgyNSx4MjYsW3NwLCM2NF0KKwlzdHAJeDI3LHgyOCxbc3AsIzgwXQorCisJbGRwCXcyMCx3MjEsW3gwXQorCWxkcAl3MjIsdzIzLFt4MCwjOF0KKwlsZHIJdzI0LFt4MCwjMTZdCisKKy5Mb29wOgorCWxkcgl4MyxbeDFdLCM2NAorCW1vdnoJdzI4LCMweDc5OTkKKwlzdWIJeDIseDIsIzEKKwltb3ZrCXcyOCwjMHg1YTgyLGxzbCMxNgorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4Myx4MywjMzIKKyNlbHNlCisJcmV2MzIJeDMseDMKKyNlbmRpZgorCWFkZAl3MjQsdzI0LHcyOAkJLy8gd2FybSBpdCB1cAorCWFkZAl3MjQsdzI0LHczCisJbHNyCXg0LHgzLCMzMgorCWxkcgl4NSxbeDEsIy01Nl0KKwliaWMJdzI1LHcyMyx3MjEKKwlhbmQJdzI2LHcyMix3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJYWRkCXcyMyx3MjMsdzQJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisjaWZkZWYJX19BUk1FQl9fCisJcm9yCXg1LHg1LCMzMgorI2Vsc2UKKwlyZXYzMgl4NSx4NQorI2VuZGlmCisJYmljCXcyNSx3MjIsdzIwCisJYW5kCXcyNix3MjEsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWFkZAl3MjIsdzIyLHc1CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCWxzcgl4Nix4NSwjMzIKKwlsZHIJeDcsW3gxLCMtNDhdCisJYmljCXcyNSx3MjEsdzI0CisJYW5kCXcyNix3MjAsdzI0CisJcm9yCXcyNyx3MjMsIzI3CisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzI0LHcyNCwjMgorCWFkZAl3MjEsdzIxLHc2CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4Nyx4NywjMzIKKyNlbHNlCisJcmV2MzIJeDcseDcKKyNlbmRpZgorCWJpYwl3MjUsdzIwLHcyMworCWFuZAl3MjYsdzI0LHcyMworCXJvcgl3MjcsdzIyLCMyNworCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMyx3MjMsIzIKKwlhZGQJdzIwLHcyMCx3NwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsc3IJeDgseDcsIzMyCisJbGRyCXg5LFt4MSwjLTQwXQorCWJpYwl3MjUsdzI0LHcyMgorCWFuZAl3MjYsdzIzLHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIwLHcyMCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMix3MjIsIzIKKwlhZGQJdzI0LHcyNCx3OAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKyNpZmRlZglfX0FSTUVCX18KKwlyb3IJeDkseDksIzMyCisjZWxzZQorCXJldjMyCXg5LHg5CisjZW5kaWYKKwliaWMJdzI1LHcyMyx3MjEKKwlhbmQJdzI2LHcyMix3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJYWRkCXcyMyx3MjMsdzkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJbHNyCXgxMCx4OSwjMzIKKwlsZHIJeDExLFt4MSwjLTMyXQorCWJpYwl3MjUsdzIyLHcyMAorCWFuZAl3MjYsdzIxLHcyMAorCXJvcgl3MjcsdzI0LCMyNworCWFkZAl3MjIsdzIyLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwlhZGQJdzIyLHcyMix3MTAJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisjaWZkZWYJX19BUk1FQl9fCisJcm9yCXgxMSx4MTEsIzMyCisjZWxzZQorCXJldjMyCXgxMSx4MTEKKyNlbmRpZgorCWJpYwl3MjUsdzIxLHcyNAorCWFuZAl3MjYsdzIwLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwlhZGQJdzIxLHcyMSx3MTEJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJbHNyCXgxMix4MTEsIzMyCisJbGRyCXgxMyxbeDEsIy0yNF0KKwliaWMJdzI1LHcyMCx3MjMKKwlhbmQJdzI2LHcyNCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyMSx3MjEsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjMsdzIzLCMyCisJYWRkCXcyMCx3MjAsdzEyCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorI2lmZGVmCV9fQVJNRUJfXworCXJvcgl4MTMseDEzLCMzMgorI2Vsc2UKKwlyZXYzMgl4MTMseDEzCisjZW5kaWYKKwliaWMJdzI1LHcyNCx3MjIKKwlhbmQJdzI2LHcyMyx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjIsdzIyLCMyCisJYWRkCXcyNCx3MjQsdzEzCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCWxzcgl4MTQseDEzLCMzMgorCWxkcgl4MTUsW3gxLCMtMTZdCisJYmljCXcyNSx3MjMsdzIxCisJYW5kCXcyNix3MjIsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjQsdzI0LHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIxLHcyMSwjMgorCWFkZAl3MjMsdzIzLHcxNAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKyNpZmRlZglfX0FSTUVCX18KKwlyb3IJeDE1LHgxNSwjMzIKKyNlbHNlCisJcmV2MzIJeDE1LHgxNQorI2VuZGlmCisJYmljCXcyNSx3MjIsdzIwCisJYW5kCXcyNix3MjEsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWFkZAl3MjIsdzIyLHcxNQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsc3IJeDE2LHgxNSwjMzIKKwlsZHIJeDE3LFt4MSwjLThdCisJYmljCXcyNSx3MjEsdzI0CisJYW5kCXcyNix3MjAsdzI0CisJcm9yCXcyNyx3MjMsIzI3CisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzI0LHcyNCwjMgorCWFkZAl3MjEsdzIxLHcxNgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKyNpZmRlZglfX0FSTUVCX18KKwlyb3IJeDE3LHgxNywjMzIKKyNlbHNlCisJcmV2MzIJeDE3LHgxNworI2VuZGlmCisJYmljCXcyNSx3MjAsdzIzCisJYW5kCXcyNix3MjQsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWFkZAl3MjAsdzIwLHcxNwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsc3IJeDE5LHgxNywjMzIKKwllb3IJdzMsdzMsdzUKKwliaWMJdzI1LHcyNCx3MjIKKwlhbmQJdzI2LHcyMyx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwllb3IJdzMsdzMsdzExCisJYWRkCXcyNCx3MjQsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwllb3IJdzMsdzMsdzE2CisJcm9yCXcyMix3MjIsIzIKKwlhZGQJdzI0LHcyNCx3MTkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXczLHczLCMzMQorCWVvcgl3NCx3NCx3NgorCWJpYwl3MjUsdzIzLHcyMQorCWFuZAl3MjYsdzIyLHcyMQorCXJvcgl3MjcsdzIwLCMyNworCWVvcgl3NCx3NCx3MTIKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCWVvcgl3NCx3NCx3MTcKKwlyb3IJdzIxLHcyMSwjMgorCWFkZAl3MjMsdzIzLHczCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3NCx3NCwjMzEKKwllb3IJdzUsdzUsdzcKKwliaWMJdzI1LHcyMix3MjAKKwlhbmQJdzI2LHcyMSx3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwllb3IJdzUsdzUsdzEzCisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCW9ycgl3MjUsdzI1LHcyNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwllb3IJdzUsdzUsdzE5CisJcm9yCXcyMCx3MjAsIzIKKwlhZGQJdzIyLHcyMix3NAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzUsdzUsIzMxCisJZW9yCXc2LHc2LHc4CisJYmljCXcyNSx3MjEsdzI0CisJYW5kCXcyNix3MjAsdzI0CisJcm9yCXcyNyx3MjMsIzI3CisJZW9yCXc2LHc2LHcxNAorCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJZW9yCXc2LHc2LHczCisJcm9yCXcyNCx3MjQsIzIKKwlhZGQJdzIxLHcyMSx3NQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzYsdzYsIzMxCisJZW9yCXc3LHc3LHc5CisJYmljCXcyNSx3MjAsdzIzCisJYW5kCXcyNix3MjQsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJZW9yCXc3LHc3LHcxNQorCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwlvcnIJdzI1LHcyNSx3MjYKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJZW9yCXc3LHc3LHc0CisJcm9yCXcyMyx3MjMsIzIKKwlhZGQJdzIwLHcyMCx3NgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzcsdzcsIzMxCisJbW92egl3MjgsIzB4ZWJhMQorCW1vdmsJdzI4LCMweDZlZDksbHNsIzE2CisJZW9yCXc4LHc4LHcxMAorCWJpYwl3MjUsdzI0LHcyMgorCWFuZAl3MjYsdzIzLHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWVvcgl3OCx3OCx3MTYKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJb3JyCXcyNSx3MjUsdzI2CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCWVvcgl3OCx3OCx3NQorCXJvcgl3MjIsdzIyLCMyCisJYWRkCXcyNCx3MjQsdzcJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc4LHc4LCMzMQorCWVvcgl3OSx3OSx3MTEKKwllb3IJdzI1LHcyMyx3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc5LHc5LHcxNworCWVvcgl3MjUsdzI1LHcyMgorCWFkZAl3MjQsdzI0LHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIxLHcyMSwjMgorCWVvcgl3OSx3OSx3NgorCWFkZAl3MjMsdzIzLHc4CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3OSx3OSwjMzEKKwllb3IJdzEwLHcxMCx3MTIKKwllb3IJdzI1LHcyMix3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMCx3MTAsdzE5CisJZW9yCXcyNSx3MjUsdzIxCisJYWRkCXcyMyx3MjMsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjAsdzIwLCMyCisJZW9yCXcxMCx3MTAsdzcKKwlhZGQJdzIyLHcyMix3OQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEwLHcxMCwjMzEKKwllb3IJdzExLHcxMSx3MTMKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMSx3MTEsdzMKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzExLHcxMSx3OAorCWFkZAl3MjEsdzIxLHcxMAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzExLHcxMSwjMzEKKwllb3IJdzEyLHcxMix3MTQKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMix3MTIsdzQKKwllb3IJdzI1LHcyNSx3MjQKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzEyLHcxMix3OQorCWFkZAl3MjAsdzIwLHcxMQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEyLHcxMiwjMzEKKwllb3IJdzEzLHcxMyx3MTUKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMyx3MTMsdzUKKwllb3IJdzI1LHcyNSx3MjMKKwlhZGQJdzIwLHcyMCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMix3MjIsIzIKKwllb3IJdzEzLHcxMyx3MTAKKwlhZGQJdzI0LHcyNCx3MTIJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMyx3MTMsIzMxCisJZW9yCXcxNCx3MTQsdzE2CisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTQsdzE0LHc2CisJZW9yCXcyNSx3MjUsdzIyCisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXcxNCx3MTQsdzExCisJYWRkCXcyMyx3MjMsdzEzCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTQsdzE0LCMzMQorCWVvcgl3MTUsdzE1LHcxNworCWVvcgl3MjUsdzIyLHcyMAorCXJvcgl3MjcsdzI0LCMyNworCWFkZAl3MjIsdzIyLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE1LHcxNSx3NworCWVvcgl3MjUsdzI1LHcyMQorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWVvcgl3MTUsdzE1LHcxMgorCWFkZAl3MjIsdzIyLHcxNAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE1LHcxNSwjMzEKKwllb3IJdzE2LHcxNix3MTkKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNix3MTYsdzgKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzE2LHcxNix3MTMKKwlhZGQJdzIxLHcyMSx3MTUJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNix3MTYsIzMxCisJZW9yCXcxNyx3MTcsdzMKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNyx3MTcsdzkKKwllb3IJdzI1LHcyNSx3MjQKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzE3LHcxNyx3MTQKKwlhZGQJdzIwLHcyMCx3MTYJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNyx3MTcsIzMxCisJZW9yCXcxOSx3MTksdzQKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxOSx3MTksdzEwCisJZW9yCXcyNSx3MjUsdzIzCisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxOSx3MTksdzE1CisJYWRkCXcyNCx3MjQsdzE3CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTksdzE5LCMzMQorCWVvcgl3Myx3Myx3NQorCWVvcgl3MjUsdzIzLHcyMQorCXJvcgl3MjcsdzIwLCMyNworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzMsdzMsdzExCisJZW9yCXcyNSx3MjUsdzIyCisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXczLHczLHcxNgorCWFkZAl3MjMsdzIzLHcxOQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzMsdzMsIzMxCisJZW9yCXc0LHc0LHc2CisJZW9yCXcyNSx3MjIsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3NCx3NCx3MTIKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzQsdzQsdzE3CisJYWRkCXcyMix3MjIsdzMJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc0LHc0LCMzMQorCWVvcgl3NSx3NSx3NworCWVvcgl3MjUsdzIxLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzUsdzUsdzEzCisJZW9yCXcyNSx3MjUsdzIwCisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXc1LHc1LHcxOQorCWFkZAl3MjEsdzIxLHc0CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3NSx3NSwjMzEKKwllb3IJdzYsdzYsdzgKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc2LHc2LHcxNAorCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3Nix3Nix3MworCWFkZAl3MjAsdzIwLHc1CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3Nix3NiwjMzEKKwllb3IJdzcsdzcsdzkKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc3LHc3LHcxNQorCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3Nyx3Nyx3NAorCWFkZAl3MjQsdzI0LHc2CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3Nyx3NywjMzEKKwllb3IJdzgsdzgsdzEwCisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3OCx3OCx3MTYKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzgsdzgsdzUKKwlhZGQJdzIzLHcyMyx3NwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzgsdzgsIzMxCisJZW9yCXc5LHc5LHcxMQorCWVvcgl3MjUsdzIyLHcyMAorCXJvcgl3MjcsdzI0LCMyNworCWFkZAl3MjIsdzIyLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzksdzksdzE3CisJZW9yCXcyNSx3MjUsdzIxCisJYWRkCXcyMyx3MjMsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjAsdzIwLCMyCisJZW9yCXc5LHc5LHc2CisJYWRkCXcyMix3MjIsdzgJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc5LHc5LCMzMQorCWVvcgl3MTAsdzEwLHcxMgorCWVvcgl3MjUsdzIxLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzEwLHcxMCx3MTkKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzEwLHcxMCx3NworCWFkZAl3MjEsdzIxLHc5CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTAsdzEwLCMzMQorCWVvcgl3MTEsdzExLHcxMworCWVvcgl3MjUsdzIwLHcyMworCXJvcgl3MjcsdzIyLCMyNworCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzExLHcxMSx3MworCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3MTEsdzExLHc4CisJYWRkCXcyMCx3MjAsdzEwCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTEsdzExLCMzMQorCW1vdnoJdzI4LCMweGJjZGMKKwltb3ZrCXcyOCwjMHg4ZjFiLGxzbCMxNgorCWVvcgl3MTIsdzEyLHcxNAorCWVvcgl3MjUsdzI0LHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzEyLHcxMix3NAorCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3MTIsdzEyLHc5CisJYWRkCXcyNCx3MjQsdzExCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTIsdzEyLCMzMQorCW9ycgl3MjUsdzIxLHcyMgorCWFuZAl3MjYsdzIxLHcyMgorCWVvcgl3MTMsdzEzLHcxNQorCXJvcgl3MjcsdzIwLCMyNworCWFuZAl3MjUsdzI1LHcyMworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzEzLHcxMyx3NQorCWFkZAl3MjQsdzI0LHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIxLHcyMSwjMgorCWVvcgl3MTMsdzEzLHcxMAorCWFkZAl3MjMsdzIzLHcxMgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEzLHcxMywjMzEKKwlvcnIJdzI1LHcyMCx3MjEKKwlhbmQJdzI2LHcyMCx3MjEKKwllb3IJdzE0LHcxNCx3MTYKKwlyb3IJdzI3LHcyNCwjMjcKKwlhbmQJdzI1LHcyNSx3MjIKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNCx3MTQsdzYKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzE0LHcxNCx3MTEKKwlhZGQJdzIyLHcyMix3MTMJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNCx3MTQsIzMxCisJb3JyCXcyNSx3MjQsdzIwCisJYW5kCXcyNix3MjQsdzIwCisJZW9yCXcxNSx3MTUsdzE3CisJcm9yCXcyNyx3MjMsIzI3CisJYW5kCXcyNSx3MjUsdzIxCisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTUsdzE1LHc3CisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXcxNSx3MTUsdzEyCisJYWRkCXcyMSx3MjEsdzE0CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTUsdzE1LCMzMQorCW9ycgl3MjUsdzIzLHcyNAorCWFuZAl3MjYsdzIzLHcyNAorCWVvcgl3MTYsdzE2LHcxOQorCXJvcgl3MjcsdzIyLCMyNworCWFuZAl3MjUsdzI1LHcyMAorCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE2LHcxNix3OAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3MTYsdzE2LHcxMworCWFkZAl3MjAsdzIwLHcxNQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE2LHcxNiwjMzEKKwlvcnIJdzI1LHcyMix3MjMKKwlhbmQJdzI2LHcyMix3MjMKKwllb3IJdzE3LHcxNyx3MworCXJvcgl3MjcsdzIxLCMyNworCWFuZAl3MjUsdzI1LHcyNAorCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE3LHcxNyx3OQorCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3MTcsdzE3LHcxNAorCWFkZAl3MjQsdzI0LHcxNgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE3LHcxNywjMzEKKwlvcnIJdzI1LHcyMSx3MjIKKwlhbmQJdzI2LHcyMSx3MjIKKwllb3IJdzE5LHcxOSx3NAorCXJvcgl3MjcsdzIwLCMyNworCWFuZAl3MjUsdzI1LHcyMworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE5LHcxOSx3MTAKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzE5LHcxOSx3MTUKKwlhZGQJdzIzLHcyMyx3MTcJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxOSx3MTksIzMxCisJb3JyCXcyNSx3MjAsdzIxCisJYW5kCXcyNix3MjAsdzIxCisJZW9yCXczLHczLHc1CisJcm9yCXcyNyx3MjQsIzI3CisJYW5kCXcyNSx3MjUsdzIyCisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3Myx3Myx3MTEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzMsdzMsdzE2CisJYWRkCXcyMix3MjIsdzE5CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3Myx3MywjMzEKKwlvcnIJdzI1LHcyNCx3MjAKKwlhbmQJdzI2LHcyNCx3MjAKKwllb3IJdzQsdzQsdzYKKwlyb3IJdzI3LHcyMywjMjcKKwlhbmQJdzI1LHcyNSx3MjEKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc0LHc0LHcxMgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzI0LHcyNCwjMgorCWVvcgl3NCx3NCx3MTcKKwlhZGQJdzIxLHcyMSx3MwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzQsdzQsIzMxCisJb3JyCXcyNSx3MjMsdzI0CisJYW5kCXcyNix3MjMsdzI0CisJZW9yCXc1LHc1LHc3CisJcm9yCXcyNyx3MjIsIzI3CisJYW5kCXcyNSx3MjUsdzIwCisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3NSx3NSx3MTMKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzUsdzUsdzE5CisJYWRkCXcyMCx3MjAsdzQJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc1LHc1LCMzMQorCW9ycgl3MjUsdzIyLHcyMworCWFuZAl3MjYsdzIyLHcyMworCWVvcgl3Nix3Nix3OAorCXJvcgl3MjcsdzIxLCMyNworCWFuZAl3MjUsdzI1LHcyNAorCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzYsdzYsdzE0CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXc2LHc2LHczCisJYWRkCXcyNCx3MjQsdzUJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc2LHc2LCMzMQorCW9ycgl3MjUsdzIxLHcyMgorCWFuZAl3MjYsdzIxLHcyMgorCWVvcgl3Nyx3Nyx3OQorCXJvcgl3MjcsdzIwLCMyNworCWFuZAl3MjUsdzI1LHcyMworCWFkZAl3MjMsdzIzLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzcsdzcsdzE1CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXc3LHc3LHc0CisJYWRkCXcyMyx3MjMsdzYJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc3LHc3LCMzMQorCW9ycgl3MjUsdzIwLHcyMQorCWFuZAl3MjYsdzIwLHcyMQorCWVvcgl3OCx3OCx3MTAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhbmQJdzI1LHcyNSx3MjIKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc4LHc4LHcxNgorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIwLHcyMCwjMgorCWVvcgl3OCx3OCx3NQorCWFkZAl3MjIsdzIyLHc3CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3OCx3OCwjMzEKKwlvcnIJdzI1LHcyNCx3MjAKKwlhbmQJdzI2LHcyNCx3MjAKKwllb3IJdzksdzksdzExCisJcm9yCXcyNyx3MjMsIzI3CisJYW5kCXcyNSx3MjUsdzIxCisJYWRkCXcyMSx3MjEsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3OSx3OSx3MTcKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzksdzksdzYKKwlhZGQJdzIxLHcyMSx3OAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzksdzksIzMxCisJb3JyCXcyNSx3MjMsdzI0CisJYW5kCXcyNix3MjMsdzI0CisJZW9yCXcxMCx3MTAsdzEyCisJcm9yCXcyNyx3MjIsIzI3CisJYW5kCXcyNSx3MjUsdzIwCisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTAsdzEwLHcxOQorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3MTAsdzEwLHc3CisJYWRkCXcyMCx3MjAsdzkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMCx3MTAsIzMxCisJb3JyCXcyNSx3MjIsdzIzCisJYW5kCXcyNix3MjIsdzIzCisJZW9yCXcxMSx3MTEsdzEzCisJcm9yCXcyNyx3MjEsIzI3CisJYW5kCXcyNSx3MjUsdzI0CisJYWRkCXcyNCx3MjQsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTEsdzExLHczCisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxMSx3MTEsdzgKKwlhZGQJdzI0LHcyNCx3MTAJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIwLHcyMCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMSx3MTEsIzMxCisJb3JyCXcyNSx3MjEsdzIyCisJYW5kCXcyNix3MjEsdzIyCisJZW9yCXcxMix3MTIsdzE0CisJcm9yCXcyNyx3MjAsIzI3CisJYW5kCXcyNSx3MjUsdzIzCisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTIsdzEyLHc0CisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXcxMix3MTIsdzkKKwlhZGQJdzIzLHcyMyx3MTEJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMix3MTIsIzMxCisJb3JyCXcyNSx3MjAsdzIxCisJYW5kCXcyNix3MjAsdzIxCisJZW9yCXcxMyx3MTMsdzE1CisJcm9yCXcyNyx3MjQsIzI3CisJYW5kCXcyNSx3MjUsdzIyCisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTMsdzEzLHc1CisJYWRkCXcyMyx3MjMsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjAsdzIwLCMyCisJZW9yCXcxMyx3MTMsdzEwCisJYWRkCXcyMix3MjIsdzEyCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMyx3MjMsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTMsdzEzLCMzMQorCW9ycgl3MjUsdzI0LHcyMAorCWFuZAl3MjYsdzI0LHcyMAorCWVvcgl3MTQsdzE0LHcxNgorCXJvcgl3MjcsdzIzLCMyNworCWFuZAl3MjUsdzI1LHcyMQorCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE0LHcxNCx3NgorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlvcnIJdzI1LHcyNSx3MjYKKwlyb3IJdzI0LHcyNCwjMgorCWVvcgl3MTQsdzE0LHcxMQorCWFkZAl3MjEsdzIxLHcxMwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjIsdzIyLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE0LHcxNCwjMzEKKwlvcnIJdzI1LHcyMyx3MjQKKwlhbmQJdzI2LHcyMyx3MjQKKwllb3IJdzE1LHcxNSx3MTcKKwlyb3IJdzI3LHcyMiwjMjcKKwlhbmQJdzI1LHcyNSx3MjAKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNSx3MTUsdzcKKwlhZGQJdzIxLHcyMSx3MjcJCS8vIGUrPXJvdChhLDUpCisJb3JyCXcyNSx3MjUsdzI2CisJcm9yCXcyMyx3MjMsIzIKKwllb3IJdzE1LHcxNSx3MTIKKwlhZGQJdzIwLHcyMCx3MTQJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIxLHcyMSx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNSx3MTUsIzMxCisJbW92egl3MjgsIzB4YzFkNgorCW1vdmsJdzI4LCMweGNhNjIsbHNsIzE2CisJb3JyCXcyNSx3MjIsdzIzCisJYW5kCXcyNix3MjIsdzIzCisJZW9yCXcxNix3MTYsdzE5CisJcm9yCXcyNyx3MjEsIzI3CisJYW5kCXcyNSx3MjUsdzI0CisJYWRkCXcyNCx3MjQsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTYsdzE2LHc4CisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCW9ycgl3MjUsdzI1LHcyNgorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxNix3MTYsdzEzCisJYWRkCXcyNCx3MjQsdzE1CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMCx3MjAsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTYsdzE2LCMzMQorCWVvcgl3MTcsdzE3LHczCisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTcsdzE3LHc5CisJZW9yCXcyNSx3MjUsdzIyCisJYWRkCXcyNCx3MjQsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjEsdzIxLCMyCisJZW9yCXcxNyx3MTcsdzE0CisJYWRkCXcyMyx3MjMsdzE2CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyNCx3MjQsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTcsdzE3LCMzMQorCWVvcgl3MTksdzE5LHc0CisJZW9yCXcyNSx3MjIsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTksdzE5LHcxMAorCWVvcgl3MjUsdzI1LHcyMQorCWFkZAl3MjMsdzIzLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIwLHcyMCwjMgorCWVvcgl3MTksdzE5LHcxNQorCWFkZAl3MjIsdzIyLHcxNwkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE5LHcxOSwjMzEKKwllb3IJdzMsdzMsdzUKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXczLHczLHcxMQorCWVvcgl3MjUsdzI1LHcyMAorCWFkZAl3MjIsdzIyLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzI0LHcyNCwjMgorCWVvcgl3Myx3Myx3MTYKKwlhZGQJdzIxLHcyMSx3MTkJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXczLHczLCMzMQorCWVvcgl3NCx3NCx3NgorCWVvcgl3MjUsdzIwLHcyMworCXJvcgl3MjcsdzIyLCMyNworCWFkZAl3MjAsdzIwLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzQsdzQsdzEyCisJZW9yCXcyNSx3MjUsdzI0CisJYWRkCXcyMSx3MjEsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjMsdzIzLCMyCisJZW9yCXc0LHc0LHcxNworCWFkZAl3MjAsdzIwLHczCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3NCx3NCwjMzEKKwllb3IJdzUsdzUsdzcKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc1LHc1LHcxMworCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3NSx3NSx3MTkKKwlhZGQJdzI0LHcyNCx3NAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzUsdzUsIzMxCisJZW9yCXc2LHc2LHc4CisJZW9yCXcyNSx3MjMsdzIxCisJcm9yCXcyNyx3MjAsIzI3CisJYWRkCXcyMyx3MjMsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3Nix3Nix3MTQKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzYsdzYsdzMKKwlhZGQJdzIzLHcyMyx3NQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzYsdzYsIzMxCisJZW9yCXc3LHc3LHc5CisJZW9yCXcyNSx3MjIsdzIwCisJcm9yCXcyNyx3MjQsIzI3CisJYWRkCXcyMix3MjIsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3Nyx3Nyx3MTUKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzcsdzcsdzQKKwlhZGQJdzIyLHcyMix3NgkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzcsdzcsIzMxCisJZW9yCXc4LHc4LHcxMAorCWVvcgl3MjUsdzIxLHcyNAorCXJvcgl3MjcsdzIzLCMyNworCWFkZAl3MjEsdzIxLHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzgsdzgsdzE2CisJZW9yCXcyNSx3MjUsdzIwCisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXc4LHc4LHc1CisJYWRkCXcyMSx3MjEsdzcJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXc4LHc4LCMzMQorCWVvcgl3OSx3OSx3MTEKKwllb3IJdzI1LHcyMCx3MjMKKwlyb3IJdzI3LHcyMiwjMjcKKwlhZGQJdzIwLHcyMCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXc5LHc5LHcxNworCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWVvcgl3OSx3OSx3NgorCWFkZAl3MjAsdzIwLHc4CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3OSx3OSwjMzEKKwllb3IJdzEwLHcxMCx3MTIKKwllb3IJdzI1LHcyNCx3MjIKKwlyb3IJdzI3LHcyMSwjMjcKKwlhZGQJdzI0LHcyNCx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMCx3MTAsdzE5CisJZW9yCXcyNSx3MjUsdzIzCisJYWRkCXcyMCx3MjAsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjIsdzIyLCMyCisJZW9yCXcxMCx3MTAsdzcKKwlhZGQJdzI0LHcyNCx3OQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEwLHcxMCwjMzEKKwllb3IJdzExLHcxMSx3MTMKKwllb3IJdzI1LHcyMyx3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMSx3MTEsdzMKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzExLHcxMSx3OAorCWFkZAl3MjMsdzIzLHcxMAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjQsdzI0LHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzExLHcxMSwjMzEKKwllb3IJdzEyLHcxMix3MTQKKwllb3IJdzI1LHcyMix3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMix3MTIsdzQKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzEyLHcxMix3OQorCWFkZAl3MjIsdzIyLHcxMQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjMsdzIzLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzEyLHcxMiwjMzEKKwllb3IJdzEzLHcxMyx3MTUKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxMyx3MTMsdzUKKwllb3IJdzI1LHcyNSx3MjAKKwlhZGQJdzIyLHcyMix3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyNCx3MjQsIzIKKwllb3IJdzEzLHcxMyx3MTAKKwlhZGQJdzIxLHcyMSx3MTIJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIyLHcyMix3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxMyx3MTMsIzMxCisJZW9yCXcxNCx3MTQsdzE2CisJZW9yCXcyNSx3MjAsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MTQsdzE0LHc2CisJZW9yCXcyNSx3MjUsdzI0CisJYWRkCXcyMSx3MjEsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjMsdzIzLCMyCisJZW9yCXcxNCx3MTQsdzExCisJYWRkCXcyMCx3MjAsdzEzCS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMSx3MjEsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTQsdzE0LCMzMQorCWVvcgl3MTUsdzE1LHcxNworCWVvcgl3MjUsdzI0LHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWFkZAl3MjQsdzI0LHcyOAkJLy8gZnV0dXJlIGUrPUsKKwllb3IJdzE1LHcxNSx3NworCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWVvcgl3MTUsdzE1LHcxMgorCWFkZAl3MjQsdzI0LHcxNAkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlyb3IJdzE1LHcxNSwjMzEKKwllb3IJdzE2LHcxNix3MTkKKwllb3IJdzI1LHcyMyx3MjEKKwlyb3IJdzI3LHcyMCwjMjcKKwlhZGQJdzIzLHcyMyx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNix3MTYsdzgKKwllb3IJdzI1LHcyNSx3MjIKKwlhZGQJdzI0LHcyNCx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMSx3MjEsIzIKKwllb3IJdzE2LHcxNix3MTMKKwlhZGQJdzIzLHcyMyx3MTUJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzI0LHcyNCx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNix3MTYsIzMxCisJZW9yCXcxNyx3MTcsdzMKKwllb3IJdzI1LHcyMix3MjAKKwlyb3IJdzI3LHcyNCwjMjcKKwlhZGQJdzIyLHcyMix3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxNyx3MTcsdzkKKwllb3IJdzI1LHcyNSx3MjEKKwlhZGQJdzIzLHcyMyx3MjcJCS8vIGUrPXJvdChhLDUpCisJcm9yCXcyMCx3MjAsIzIKKwllb3IJdzE3LHcxNyx3MTQKKwlhZGQJdzIyLHcyMix3MTYJLy8gZnV0dXJlIGUrPVhbaV0KKwlhZGQJdzIzLHcyMyx3MjUJCS8vIGUrPUYoYixjLGQpCisJcm9yCXcxNyx3MTcsIzMxCisJZW9yCXcxOSx3MTksdzQKKwllb3IJdzI1LHcyMSx3MjQKKwlyb3IJdzI3LHcyMywjMjcKKwlhZGQJdzIxLHcyMSx3MjgJCS8vIGZ1dHVyZSBlKz1LCisJZW9yCXcxOSx3MTksdzEwCisJZW9yCXcyNSx3MjUsdzIwCisJYWRkCXcyMix3MjIsdzI3CQkvLyBlKz1yb3QoYSw1KQorCXJvcgl3MjQsdzI0LCMyCisJZW9yCXcxOSx3MTksdzE1CisJYWRkCXcyMSx3MjEsdzE3CS8vIGZ1dHVyZSBlKz1YW2ldCisJYWRkCXcyMix3MjIsdzI1CQkvLyBlKz1GKGIsYyxkKQorCXJvcgl3MTksdzE5LCMzMQorCWxkcAl3NCx3NSxbeDBdCisJZW9yCXcyNSx3MjAsdzIzCisJcm9yCXcyNyx3MjIsIzI3CisJYWRkCXcyMCx3MjAsdzI4CQkvLyBmdXR1cmUgZSs9SworCWVvcgl3MjUsdzI1LHcyNAorCWFkZAl3MjEsdzIxLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIzLHcyMywjMgorCWFkZAl3MjAsdzIwLHcxOQkvLyBmdXR1cmUgZSs9WFtpXQorCWFkZAl3MjEsdzIxLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlsZHAJdzYsdzcsW3gwLCM4XQorCWVvcgl3MjUsdzI0LHcyMgorCXJvcgl3MjcsdzIxLCMyNworCWVvcgl3MjUsdzI1LHcyMworCWFkZAl3MjAsdzIwLHcyNwkJLy8gZSs9cm90KGEsNSkKKwlyb3IJdzIyLHcyMiwjMgorCWxkcgl3OCxbeDAsIzE2XQorCWFkZAl3MjAsdzIwLHcyNQkJLy8gZSs9RihiLGMsZCkKKwlhZGQJdzIxLHcyMSx3NQorCWFkZAl3MjIsdzIyLHc2CisJYWRkCXcyMCx3MjAsdzQKKwlhZGQJdzIzLHcyMyx3NworCWFkZAl3MjQsdzI0LHc4CisJc3RwCXcyMCx3MjEsW3gwXQorCXN0cAl3MjIsdzIzLFt4MCwjOF0KKwlzdHIJdzI0LFt4MCwjMTZdCisJY2Juegl4MiwuTG9vcAorCisJbGRwCXgxOSx4MjAsW3NwLCMxNl0KKwlsZHAJeDIxLHgyMixbc3AsIzMyXQorCWxkcAl4MjMseDI0LFtzcCwjNDhdCisJbGRwCXgyNSx4MjYsW3NwLCM2NF0KKwlsZHAJeDI3LHgyOCxbc3AsIzgwXQorCWxkcgl4MjksW3NwXSwjOTYKKwlyZXQKKy5zaXplCXNoYTFfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTFfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMV9ibG9ja19hcm12OCwlZnVuY3Rpb24KKy5hbGlnbgk2CitzaGExX2Jsb2NrX2FybXY4OgorLkx2OF9lbnRyeToKKwlzdHAJeDI5LHgzMCxbc3AsIy0xNl0hCisJYWRkCXgyOSxzcCwjMAorCisJYWRyCXg0LC5MY29uc3QKKwllb3IJdjEuMTZiLHYxLjE2Yix2MS4xNmIKKwlsZDEJe3YwLjRzfSxbeDBdLCMxNgorCWxkMQl7djEuc31bMF0sW3gwXQorCXN1Ygl4MCx4MCwjMTYKKwlsZDEJe3YxNi40cyx2MTcuNHMsdjE4LjRzLHYxOS40c30sW3g0XQorCisuTG9vcF9odzoKKwlsZDEJe3Y0LjE2Yix2NS4xNmIsdjYuMTZiLHY3LjE2Yn0sW3gxXSwjNjQKKwlzdWIJeDIseDIsIzEKKwlyZXYzMgl2NC4xNmIsdjQuMTZiCisJcmV2MzIJdjUuMTZiLHY1LjE2YgorCisJYWRkCXYyMC40cyx2MTYuNHMsdjQuNHMKKwlyZXYzMgl2Ni4xNmIsdjYuMTZiCisJb3JyCXYyMi4xNmIsdjAuMTZiLHYwLjE2YgkvLyBvZmZsb2FkCisKKwlhZGQJdjIxLjRzLHYxNi40cyx2NS40cworCXJldjMyCXY3LjE2Yix2Ny4xNmIKKy5pbnN0CTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCisuaW5zdAkweDVlMTQwMDIwCS8vc2hhMWMgdjAuMTZiLHYxLjE2Yix2MjAuNHMJCS8vIDAKKwlhZGQJdjIwLjRzLHYxNi40cyx2Ni40cworLmluc3QJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5pbnN0CTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAxCisuaW5zdAkweDVlMTUwMDYwCS8vc2hhMWMgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNi40cyx2Ny40cworLmluc3QJMHg1ZTI4MThlNAkvL3NoYTFzdTEgdjQuMTZiLHY3LjE2YgorLmluc3QJMHg1ZTA3MzBjNQkvL3NoYTFzdTAgdjUuMTZiLHY2LjE2Yix2Ny4xNmIKKy5pbnN0CTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyAyCisuaW5zdAkweDVlMTQwMDQwCS8vc2hhMWMgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxNi40cyx2NC40cworLmluc3QJMHg1ZTI4MTg4NQkvL3NoYTFzdTEgdjUuMTZiLHY0LjE2YgorLmluc3QJMHg1ZTA0MzBlNgkvL3NoYTFzdTAgdjYuMTZiLHY3LjE2Yix2NC4xNmIKKy5pbnN0CTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAzCisuaW5zdAkweDVlMTUwMDYwCS8vc2hhMWMgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNy40cyx2NS40cworLmluc3QJMHg1ZTI4MThhNgkvL3NoYTFzdTEgdjYuMTZiLHY1LjE2YgorLmluc3QJMHg1ZTA1MzA4NwkvL3NoYTFzdTAgdjcuMTZiLHY0LjE2Yix2NS4xNmIKKy5pbnN0CTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyA0CisuaW5zdAkweDVlMTQwMDQwCS8vc2hhMWMgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxNy40cyx2Ni40cworLmluc3QJMHg1ZTI4MThjNwkvL3NoYTFzdTEgdjcuMTZiLHY2LjE2YgorLmluc3QJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5pbnN0CTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyA1CisuaW5zdAkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNy40cyx2Ny40cworLmluc3QJMHg1ZTI4MThlNAkvL3NoYTFzdTEgdjQuMTZiLHY3LjE2YgorLmluc3QJMHg1ZTA3MzBjNQkvL3NoYTFzdTAgdjUuMTZiLHY2LjE2Yix2Ny4xNmIKKy5pbnN0CTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyA2CisuaW5zdAkweDVlMTQxMDQwCS8vc2hhMXAgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxNy40cyx2NC40cworLmluc3QJMHg1ZTI4MTg4NQkvL3NoYTFzdTEgdjUuMTZiLHY0LjE2YgorLmluc3QJMHg1ZTA0MzBlNgkvL3NoYTFzdTAgdjYuMTZiLHY3LjE2Yix2NC4xNmIKKy5pbnN0CTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyA3CisuaW5zdAkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxNy40cyx2NS40cworLmluc3QJMHg1ZTI4MThhNgkvL3NoYTFzdTEgdjYuMTZiLHY1LjE2YgorLmluc3QJMHg1ZTA1MzA4NwkvL3NoYTFzdTAgdjcuMTZiLHY0LjE2Yix2NS4xNmIKKy5pbnN0CTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyA4CisuaW5zdAkweDVlMTQxMDQwCS8vc2hhMXAgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxOC40cyx2Ni40cworLmluc3QJMHg1ZTI4MThjNwkvL3NoYTFzdTEgdjcuMTZiLHY2LjE2YgorLmluc3QJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5pbnN0CTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyA5CisuaW5zdAkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxOC40cyx2Ny40cworLmluc3QJMHg1ZTI4MThlNAkvL3NoYTFzdTEgdjQuMTZiLHY3LjE2YgorLmluc3QJMHg1ZTA3MzBjNQkvL3NoYTFzdTAgdjUuMTZiLHY2LjE2Yix2Ny4xNmIKKy5pbnN0CTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyAxMAorLmluc3QJMHg1ZTE0MjA0MAkvL3NoYTFtIHYwLjE2Yix2Mi4xNmIsdjIwLjRzCisJYWRkCXYyMC40cyx2MTguNHMsdjQuNHMKKy5pbnN0CTB4NWUyODE4ODUJLy9zaGExc3UxIHY1LjE2Yix2NC4xNmIKKy5pbnN0CTB4NWUwNDMwZTYJLy9zaGExc3UwIHY2LjE2Yix2Ny4xNmIsdjQuMTZiCisuaW5zdAkweDVlMjgwODAyCS8vc2hhMWggdjIuMTZiLHYwLjE2YgkJLy8gMTEKKy5pbnN0CTB4NWUxNTIwNjAJLy9zaGExbSB2MC4xNmIsdjMuMTZiLHYyMS40cworCWFkZAl2MjEuNHMsdjE4LjRzLHY1LjRzCisuaW5zdAkweDVlMjgxOGE2CS8vc2hhMXN1MSB2Ni4xNmIsdjUuMTZiCisuaW5zdAkweDVlMDUzMDg3CS8vc2hhMXN1MCB2Ny4xNmIsdjQuMTZiLHY1LjE2YgorLmluc3QJMHg1ZTI4MDgwMwkvL3NoYTFoIHYzLjE2Yix2MC4xNmIJCS8vIDEyCisuaW5zdAkweDVlMTQyMDQwCS8vc2hhMW0gdjAuMTZiLHYyLjE2Yix2MjAuNHMKKwlhZGQJdjIwLjRzLHYxOC40cyx2Ni40cworLmluc3QJMHg1ZTI4MThjNwkvL3NoYTFzdTEgdjcuMTZiLHY2LjE2YgorLmluc3QJMHg1ZTA2MzBhNAkvL3NoYTFzdTAgdjQuMTZiLHY1LjE2Yix2Ni4xNmIKKy5pbnN0CTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAxMworLmluc3QJMHg1ZTE1MjA2MAkvL3NoYTFtIHYwLjE2Yix2My4xNmIsdjIxLjRzCisJYWRkCXYyMS40cyx2MTkuNHMsdjcuNHMKKy5pbnN0CTB4NWUyODE4ZTQJLy9zaGExc3UxIHY0LjE2Yix2Ny4xNmIKKy5pbnN0CTB4NWUwNzMwYzUJLy9zaGExc3UwIHY1LjE2Yix2Ni4xNmIsdjcuMTZiCisuaW5zdAkweDVlMjgwODAzCS8vc2hhMWggdjMuMTZiLHYwLjE2YgkJLy8gMTQKKy5pbnN0CTB4NWUxNDIwNDAJLy9zaGExbSB2MC4xNmIsdjIuMTZiLHYyMC40cworCWFkZAl2MjAuNHMsdjE5LjRzLHY0LjRzCisuaW5zdAkweDVlMjgxODg1CS8vc2hhMXN1MSB2NS4xNmIsdjQuMTZiCisuaW5zdAkweDVlMDQzMGU2CS8vc2hhMXN1MCB2Ni4xNmIsdjcuMTZiLHY0LjE2YgorLmluc3QJMHg1ZTI4MDgwMgkvL3NoYTFoIHYyLjE2Yix2MC4xNmIJCS8vIDE1CisuaW5zdAkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKwlhZGQJdjIxLjRzLHYxOS40cyx2NS40cworLmluc3QJMHg1ZTI4MThhNgkvL3NoYTFzdTEgdjYuMTZiLHY1LjE2YgorLmluc3QJMHg1ZTA1MzA4NwkvL3NoYTFzdTAgdjcuMTZiLHY0LjE2Yix2NS4xNmIKKy5pbnN0CTB4NWUyODA4MDMJLy9zaGExaCB2My4xNmIsdjAuMTZiCQkvLyAxNgorLmluc3QJMHg1ZTE0MTA0MAkvL3NoYTFwIHYwLjE2Yix2Mi4xNmIsdjIwLjRzCisJYWRkCXYyMC40cyx2MTkuNHMsdjYuNHMKKy5pbnN0CTB4NWUyODE4YzcJLy9zaGExc3UxIHY3LjE2Yix2Ni4xNmIKKy5pbnN0CTB4NWUyODA4MDIJLy9zaGExaCB2Mi4xNmIsdjAuMTZiCQkvLyAxNworLmluc3QJMHg1ZTE1MTA2MAkvL3NoYTFwIHYwLjE2Yix2My4xNmIsdjIxLjRzCisJYWRkCXYyMS40cyx2MTkuNHMsdjcuNHMKKworLmluc3QJMHg1ZTI4MDgwMwkvL3NoYTFoIHYzLjE2Yix2MC4xNmIJCS8vIDE4CisuaW5zdAkweDVlMTQxMDQwCS8vc2hhMXAgdjAuMTZiLHYyLjE2Yix2MjAuNHMKKworLmluc3QJMHg1ZTI4MDgwMgkvL3NoYTFoIHYyLjE2Yix2MC4xNmIJCS8vIDE5CisuaW5zdAkweDVlMTUxMDYwCS8vc2hhMXAgdjAuMTZiLHYzLjE2Yix2MjEuNHMKKworCWFkZAl2MS40cyx2MS40cyx2Mi40cworCWFkZAl2MC40cyx2MC40cyx2MjIuNHMKKworCWNibnoJeDIsLkxvb3BfaHcKKworCXN0MQl7djAuNHN9LFt4MF0sIzE2CisJc3QxCXt2MS5zfVswXSxbeDBdCisKKwlsZHIJeDI5LFtzcF0sIzE2CisJcmV0Cisuc2l6ZQlzaGExX2Jsb2NrX2FybXY4LC4tc2hhMV9ibG9ja19hcm12OAorLmFsaWduCTYKKy5MY29uc3Q6CisubG9uZwkweDVhODI3OTk5LDB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5CS8vS18wMF8xOQorLmxvbmcJMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEsMHg2ZWQ5ZWJhMQkvL0tfMjBfMzkKKy5sb25nCTB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMJLy9LXzQwXzU5CisubG9uZwkweGNhNjJjMWQ2LDB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2CS8vS182MF83OQorLkxPUEVOU1NMX2FybWNhcF9QOgorI2lmZGVmCV9fSUxQMzJfXworLmxvbmcJT1BFTlNTTF9hcm1jYXBfUC0uCisjZWxzZQorLnF1YWQJT1BFTlNTTF9hcm1jYXBfUC0uCisjZW5kaWYKKy5ieXRlCTgzLDcyLDY1LDQ5LDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcsMTEwLDExNSwxMDIsMTExLDExNCwxMDksMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorLmNvbW0JT1BFTlNTTF9hcm1jYXBfUCw0LDQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni1hcm12OC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni1hcm12OC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZGIzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LWFybXY4LlMKQEAgLTAsMCArMSwxMjAzIEBACisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKy8vIENvcHlyaWdodCAyMDE0LTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCisvLyB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorLy8gaW4gdGhlIGZpbGUgTElDRU5TRSBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvciBhdAorLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisvLyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisvLyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorLy8gZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisvLworLy8gUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMdjIgdGVybXMgaXMgZ3JhbnRlZC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gU0hBMjU2LzUxMiBmb3IgQVJNdjguCisvLworLy8gUGVyZm9ybWFuY2UgaW4gY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnQKKy8vIG92ZXIgY29kZSBnZW5lcmF0ZWQgd2l0aCAiZGVmYXVsdCIgY29tcGlsZXI6CisvLworLy8JCVNIQTI1Ni1odwlTSEEyNTYoKikJU0hBNTEyCisvLyBBcHBsZSBBNwkxLjk3CQkxMC41ICgrMzMlKQk2LjczICgtMSUoKiopKQorLy8gQ29ydGV4LUE1MwkyLjM4CQkxNS41ICgrMTE1JSkJMTAuMCAoKzE1MCUoKioqKSkKKy8vIENvcnRleC1BNTcJMi4zMQkJMTEuNiAoKzg2JSkJNy41MSAoKzI2MCUoKioqKSkKKy8vIERlbnZlcgkyLjAxCQkxMC41ICgrMjYlKQk2LjcwICgrOCUpCisvLyBYLUdlbmUJCQkyMC4wICgrMTAwJSkJMTIuOCAoKzMwMCUoKioqKSkKKy8vIE1vbmdvb3NlCTIuMzYJCTEzLjAgKCs1MCUpCTguMzYgKCszMyUpCisvLworLy8gKCopCVNvZnR3YXJlIFNIQTI1NiByZXN1bHRzIGFyZSBvZiBsZXNzZXIgcmVsZXZhbmNlLCBwcmVzZW50ZWQKKy8vCW1vc3RseSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3Nlcy4KKy8vICgqKikJVGhlIHJlc3VsdCBpcyBhIHRyYWRlLW9mZjogaXQncyBwb3NzaWJsZSB0byBpbXByb3ZlIGl0IGJ5CisvLwkxMCUgKG9yIGJ5IDEgY3ljbGUgcGVyIHJvdW5kKSwgYnV0IGF0IHRoZSBjb3N0IG9mIDIwJSBsb3NzCisvLwlvbiBDb3J0ZXgtQTUzIChvciBieSA0IGN5Y2xlcyBwZXIgcm91bmQpLgorLy8gKCoqKikJU3VwZXItaW1wcmVzc2l2ZSBjb2VmZmljaWVudHMgb3ZlciBnY2MtZ2VuZXJhdGVkIGNvZGUgYXJlCisvLwlpbmRpY2F0aW9uIG9mIHNvbWUgY29tcGlsZXIgInBhdGhvbG9neSIsIG1vc3Qgbm90YWJseSBjb2RlCisvLwlnZW5lcmF0ZWQgd2l0aCAtbWdlbmVyYWwtcmVncy1vbmx5IGlzIHNpZ25pZmljYW50eSBmYXN0ZXIKKy8vCWFuZCB0aGUgZ2FwIGlzIG9ubHkgNDAtOTAlLgorCisjaWZuZGVmCV9fS0VSTkVMX18KKyMgaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2VuZGlmCisKKy50ZXh0CisKKworLmdsb2JsCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisuaGlkZGVuCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciwlZnVuY3Rpb24KKy5hbGlnbgk2CitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKyNpZm5kZWYJX19LRVJORUxfXworIyBpZmRlZglfX0lMUDMyX18KKwlsZHJzdwl4MTYsLkxPUEVOU1NMX2FybWNhcF9QCisjIGVsc2UKKwlsZHIJeDE2LC5MT1BFTlNTTF9hcm1jYXBfUAorIyBlbmRpZgorCWFkcgl4MTcsLkxPUEVOU1NMX2FybWNhcF9QCisJYWRkCXgxNix4MTYseDE3CisJbGRyCXcxNixbeDE2XQorCXRzdAl3MTYsI0FSTVY4X1NIQTI1NgorCWIubmUJLkx2OF9lbnRyeQorI2VuZGlmCisJc3RwCXgyOSx4MzAsW3NwLCMtMTI4XSEKKwlhZGQJeDI5LHNwLCMwCisKKwlzdHAJeDE5LHgyMCxbc3AsIzE2XQorCXN0cAl4MjEseDIyLFtzcCwjMzJdCisJc3RwCXgyMyx4MjQsW3NwLCM0OF0KKwlzdHAJeDI1LHgyNixbc3AsIzY0XQorCXN0cAl4MjcseDI4LFtzcCwjODBdCisJc3ViCXNwLHNwLCM0KjQKKworCWxkcAl3MjAsdzIxLFt4MF0JCQkJLy8gbG9hZCBjb250ZXh0CisJbGRwCXcyMix3MjMsW3gwLCMyKjRdCisJbGRwCXcyNCx3MjUsW3gwLCM0KjRdCisJYWRkCXgyLHgxLHgyLGxzbCM2CS8vIGVuZCBvZiBpbnB1dAorCWxkcAl3MjYsdzI3LFt4MCwjNio0XQorCWFkcgl4MzAsLkxLMjU2CisJc3RwCXgwLHgyLFt4MjksIzk2XQorCisuTG9vcDoKKwlsZHAJdzMsdzQsW3gxXSwjMio0CisJbGRyCXcxOSxbeDMwXSwjNAkJCS8vICpLKysKKwllb3IJdzI4LHcyMSx3MjIJCQkJLy8gbWFnaWMgc2VlZAorCXN0cgl4MSxbeDI5LCMxMTJdCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3Myx3MwkJCS8vIDAKKyNlbmRpZgorCXJvcgl3MTYsdzI0LCM2CisJYWRkCXcyNyx3MjcsdzE5CQkJLy8gaCs9S1tpXQorCWVvcgl3Nix3MjQsdzI0LHJvciMxNAorCWFuZAl3MTcsdzI1LHcyNAorCWJpYwl3MTksdzI2LHcyNAorCWFkZAl3MjcsdzI3LHczCQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzIwLHcyMQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3Nixyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXc2LHcyMCwjMgorCWFkZAl3MjcsdzI3LHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzIwLHcyMCxyb3IjOQorCWFkZAl3MjcsdzI3LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjMsdzIzLHcyNwkJCS8vIGQrPWgKKwllb3IJdzI4LHcyOCx3MjEJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3Nix3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjcsdzI3LHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3NCx3NAkJCS8vIDEKKyNlbmRpZgorCWxkcAl3NSx3NixbeDFdLCMyKjQKKwlhZGQJdzI3LHcyNyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyMywjNgorCWFkZAl3MjYsdzI2LHcyOAkJCS8vIGgrPUtbaV0KKwllb3IJdzcsdzIzLHcyMyxyb3IjMTQKKwlhbmQJdzE3LHcyNCx3MjMKKwliaWMJdzI4LHcyNSx3MjMKKwlhZGQJdzI2LHcyNix3NAkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyNyx3MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzcscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3Nyx3MjcsIzIKKwlhZGQJdzI2LHcyNix3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyNyx3Mjcscm9yIzkKKwlhZGQJdzI2LHcyNix3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzIyLHcyMix3MjYJCQkvLyBkKz1oCisJZW9yCXcxOSx3MTksdzIwCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzcsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzI2LHcyNix3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjYsdzI2LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzUsdzUJCQkvLyAyCisjZW5kaWYKKwlhZGQJdzI2LHcyNix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyMiwjNgorCWFkZAl3MjUsdzI1LHcxOQkJCS8vIGgrPUtbaV0KKwllb3IJdzgsdzIyLHcyMixyb3IjMTQKKwlhbmQJdzE3LHcyMyx3MjIKKwliaWMJdzE5LHcyNCx3MjIKKwlhZGQJdzI1LHcyNSx3NQkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyNix3MjcJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzgscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3OCx3MjYsIzIKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyNix3MjYscm9yIzkKKwlhZGQJdzI1LHcyNSx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzIxLHcyMSx3MjUJCQkvLyBkKz1oCisJZW9yCXcyOCx3MjgsdzI3CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzgsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzI1LHcyNSx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjUsdzI1LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzYsdzYJCQkvLyAzCisjZW5kaWYKKwlsZHAJdzcsdzgsW3gxXSwjMio0CisJYWRkCXcyNSx3MjUsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXcxNix3MjEsIzYKKwlhZGQJdzI0LHcyNCx3MjgJCQkvLyBoKz1LW2ldCisJZW9yCXc5LHcyMSx3MjEscm9yIzE0CisJYW5kCXcxNyx3MjIsdzIxCisJYmljCXcyOCx3MjMsdzIxCisJYWRkCXcyNCx3MjQsdzYJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjUsdzI2CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHc5LHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzksdzI1LCMyCisJYWRkCXcyNCx3MjQsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjUsdzI1LHJvciM5CisJYWRkCXcyNCx3MjQsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyMCx3MjAsdzI0CQkJLy8gZCs9aAorCWVvcgl3MTksdzE5LHcyNgkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc5LHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyNCx3MjQsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXc3LHc3CQkJLy8gNAorI2VuZGlmCisJYWRkCXcyNCx3MjQsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXcxNix3MjAsIzYKKwlhZGQJdzIzLHcyMyx3MTkJCQkvLyBoKz1LW2ldCisJZW9yCXcxMCx3MjAsdzIwLHJvciMxNAorCWFuZAl3MTcsdzIxLHcyMAorCWJpYwl3MTksdzIyLHcyMAorCWFkZAl3MjMsdzIzLHc3CQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzI0LHcyNQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MTAscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3MTAsdzI0LCMyCisJYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjQsdzI0LHJvciM5CisJYWRkCXcyMyx3MjMsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyNyx3MjcsdzIzCQkJLy8gZCs9aAorCWVvcgl3MjgsdzI4LHcyNQkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMCx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjMsdzIzLHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3OCx3OAkJCS8vIDUKKyNlbmRpZgorCWxkcAl3OSx3MTAsW3gxXSwjMio0CisJYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXcxNix3MjcsIzYKKwlhZGQJdzIyLHcyMix3MjgJCQkvLyBoKz1LW2ldCisJZW9yCXcxMSx3MjcsdzI3LHJvciMxNAorCWFuZAl3MTcsdzIwLHcyNworCWJpYwl3MjgsdzIxLHcyNworCWFkZAl3MjIsdzIyLHc4CQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzIzLHcyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MTEscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3MTEsdzIzLCMyCisJYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjMsdzIzLHJvciM5CisJYWRkCXcyMix3MjIsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyNix3MjYsdzIyCQkJLy8gZCs9aAorCWVvcgl3MTksdzE5LHcyNAkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMSx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjIsdzIyLHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3OSx3OQkJCS8vIDYKKyNlbmRpZgorCWFkZAl3MjIsdzIyLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl3MTYsdzI2LCM2CisJYWRkCXcyMSx3MjEsdzE5CQkJLy8gaCs9S1tpXQorCWVvcgl3MTIsdzI2LHcyNixyb3IjMTQKKwlhbmQJdzE3LHcyNyx3MjYKKwliaWMJdzE5LHcyMCx3MjYKKwlhZGQJdzIxLHcyMSx3OQkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyMix3MjMJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzEyLHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzEyLHcyMiwjMgorCWFkZAl3MjEsdzIxLHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzIyLHcyMixyb3IjOQorCWFkZAl3MjEsdzIxLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjUsdzI1LHcyMQkJCS8vIGQrPWgKKwllb3IJdzI4LHcyOCx3MjMJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MTIsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzIxLHcyMSx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjEsdzIxLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzEwLHcxMAkJCS8vIDcKKyNlbmRpZgorCWxkcAl3MTEsdzEyLFt4MV0sIzIqNAorCWFkZAl3MjEsdzIxLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl3MTYsdzI1LCM2CisJYWRkCXcyMCx3MjAsdzI4CQkJLy8gaCs9S1tpXQorCWVvcgl3MTMsdzI1LHcyNSxyb3IjMTQKKwlhbmQJdzE3LHcyNix3MjUKKwliaWMJdzI4LHcyNyx3MjUKKwlhZGQJdzIwLHcyMCx3MTAJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjEsdzIyCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcxMyxyb3IjMTEJLy8gU2lnbWExKGUpCisJcm9yCXcxMyx3MjEsIzIKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyMSx3MjEscm9yIzkKKwlhZGQJdzIwLHcyMCx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzI0LHcyNCx3MjAJCQkvLyBkKz1oCisJZW9yCXcxOSx3MTksdzIyCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzEzLHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyMCx3MjAsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXcxMSx3MTEJCQkvLyA4CisjZW5kaWYKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyNCwjNgorCWFkZAl3MjcsdzI3LHcxOQkJCS8vIGgrPUtbaV0KKwllb3IJdzE0LHcyNCx3MjQscm9yIzE0CisJYW5kCXcxNyx3MjUsdzI0CisJYmljCXcxOSx3MjYsdzI0CisJYWRkCXcyNyx3MjcsdzExCQkJLy8gaCs9WFtpXQorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzIwLHcyMQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MTQscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3MTQsdzIwLCMyCisJYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjAsdzIwLHJvciM5CisJYWRkCXcyNyx3MjcsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyMyx3MjMsdzI3CQkJLy8gZCs9aAorCWVvcgl3MjgsdzI4LHcyMQkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxNCx3MTcscm9yIzEzCS8vIFNpZ21hMChhKQorCWFkZAl3MjcsdzI3LHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl3MTIsdzEyCQkJLy8gOQorI2VuZGlmCisJbGRwCXcxMyx3MTQsW3gxXSwjMio0CisJYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXcxNix3MjMsIzYKKwlhZGQJdzI2LHcyNix3MjgJCQkvLyBoKz1LW2ldCisJZW9yCXcxNSx3MjMsdzIzLHJvciMxNAorCWFuZAl3MTcsdzI0LHcyMworCWJpYwl3MjgsdzI1LHcyMworCWFkZAl3MjYsdzI2LHcxMgkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyNyx3MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzE1LHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzE1LHcyNywjMgorCWFkZAl3MjYsdzI2LHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl3MTcsdzI3LHcyNyxyb3IjOQorCWFkZAl3MjYsdzI2LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl3MTksdzE5LHcyOAkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl3MjIsdzIyLHcyNgkJCS8vIGQrPWgKKwllb3IJdzE5LHcxOSx3MjAJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MTUsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzI2LHcyNix3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjYsdzI2LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzEzLHcxMwkJCS8vIDEwCisjZW5kaWYKKwlhZGQJdzI2LHcyNix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJdzE2LHcyMiwjNgorCWFkZAl3MjUsdzI1LHcxOQkJCS8vIGgrPUtbaV0KKwllb3IJdzAsdzIyLHcyMixyb3IjMTQKKwlhbmQJdzE3LHcyMyx3MjIKKwliaWMJdzE5LHcyNCx3MjIKKwlhZGQJdzI1LHcyNSx3MTMJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjYsdzI3CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcwLHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzAsdzI2LCMyCisJYWRkCXcyNSx3MjUsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjYsdzI2LHJvciM5CisJYWRkCXcyNSx3MjUsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyMSx3MjEsdzI1CQkJLy8gZCs9aAorCWVvcgl3MjgsdzI4LHcyNwkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcwLHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyNSx3MjUsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXcxNCx3MTQJCQkvLyAxMQorI2VuZGlmCisJbGRwCXcxNSx3MCxbeDFdLCMyKjQKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJdzYsW3NwLCMxMl0KKwlyb3IJdzE2LHcyMSwjNgorCWFkZAl3MjQsdzI0LHcyOAkJCS8vIGgrPUtbaV0KKwllb3IJdzYsdzIxLHcyMSxyb3IjMTQKKwlhbmQJdzE3LHcyMix3MjEKKwliaWMJdzI4LHcyMyx3MjEKKwlhZGQJdzI0LHcyNCx3MTQJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjUsdzI2CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHc2LHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzYsdzI1LCMyCisJYWRkCXcyNCx3MjQsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjUsdzI1LHJvciM5CisJYWRkCXcyNCx3MjQsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyMCx3MjAsdzI0CQkJLy8gZCs9aAorCWVvcgl3MTksdzE5LHcyNgkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc2LHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyNCx3MjQsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXcxNSx3MTUJCQkvLyAxMgorI2VuZGlmCisJYWRkCXcyNCx3MjQsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJc3RyCXc3LFtzcCwjMF0KKwlyb3IJdzE2LHcyMCwjNgorCWFkZAl3MjMsdzIzLHcxOQkJCS8vIGgrPUtbaV0KKwllb3IJdzcsdzIwLHcyMCxyb3IjMTQKKwlhbmQJdzE3LHcyMSx3MjAKKwliaWMJdzE5LHcyMix3MjAKKwlhZGQJdzIzLHcyMyx3MTUJCQkvLyBoKz1YW2ldCisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjQsdzI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHc3LHJvciMxMQkvLyBTaWdtYTEoZSkKKwlyb3IJdzcsdzI0LCMyCisJYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXcxNyx3MjQsdzI0LHJvciM5CisJYWRkCXcyMyx3MjMsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXcyNyx3MjcsdzIzCQkJLy8gZCs9aAorCWVvcgl3MjgsdzI4LHcyNQkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc3LHcxNyxyb3IjMTMJLy8gU2lnbWEwKGEpCisJYWRkCXcyMyx3MjMsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXcwLHcwCQkJLy8gMTMKKyNlbmRpZgorCWxkcAl3MSx3MixbeDFdCisJYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJc3RyCXc4LFtzcCwjNF0KKwlyb3IJdzE2LHcyNywjNgorCWFkZAl3MjIsdzIyLHcyOAkJCS8vIGgrPUtbaV0KKwllb3IJdzgsdzI3LHcyNyxyb3IjMTQKKwlhbmQJdzE3LHcyMCx3MjcKKwliaWMJdzI4LHcyMSx3MjcKKwlhZGQJdzIyLHcyMix3MAkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyMyx3MjQJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzgscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3OCx3MjMsIzIKKwlhZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyMyx3MjMscm9yIzkKKwlhZGQJdzIyLHcyMix3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzI2LHcyNix3MjIJCQkvLyBkKz1oCisJZW9yCXcxOSx3MTksdzI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzgsdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzIyLHcyMix3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjIsdzIyLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzEsdzEJCQkvLyAxNAorI2VuZGlmCisJbGRyCXc2LFtzcCwjMTJdCisJYWRkCXcyMix3MjIsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJc3RyCXc5LFtzcCwjOF0KKwlyb3IJdzE2LHcyNiwjNgorCWFkZAl3MjEsdzIxLHcxOQkJCS8vIGgrPUtbaV0KKwllb3IJdzksdzI2LHcyNixyb3IjMTQKKwlhbmQJdzE3LHcyNyx3MjYKKwliaWMJdzE5LHcyMCx3MjYKKwlhZGQJdzIxLHcyMSx3MQkJCS8vIGgrPVhbaV0KKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyMix3MjMJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzkscm9yIzExCS8vIFNpZ21hMShlKQorCXJvcgl3OSx3MjIsIzIKKwlhZGQJdzIxLHcyMSx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJdzE3LHcyMix3MjIscm9yIzkKKwlhZGQJdzIxLHcyMSx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJdzI1LHcyNSx3MjEJCQkvLyBkKz1oCisJZW9yCXcyOCx3MjgsdzIzCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzksdzE3LHJvciMxMwkvLyBTaWdtYTAoYSkKKwlhZGQJdzIxLHcyMSx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl3MjEsdzIxLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJdzIsdzIJCQkvLyAxNQorI2VuZGlmCisJbGRyCXc3LFtzcCwjMF0KKwlhZGQJdzIxLHcyMSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJdzEwLFtzcCwjMTJdCisJcm9yCXcxNix3MjUsIzYKKwlhZGQJdzIwLHcyMCx3MjgJCQkvLyBoKz1LW2ldCisJcm9yCXc5LHc0LCM3CisJYW5kCXcxNyx3MjYsdzI1CisJcm9yCXc4LHcxLCMxNworCWJpYwl3MjgsdzI3LHcyNQorCXJvcgl3MTAsdzIxLCMyCisJYWRkCXcyMCx3MjAsdzIJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzI1LHJvciMxMQorCWVvcgl3OSx3OSx3NCxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyMSx3MjIJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzI1LHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzEwLHcxMCx3MjEscm9yIzEzCisJYWRkCXcyMCx3MjAsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcxOSx3MTksdzI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXc4LHc4LHcxLHJvciMxOQorCWVvcgl3OSx3OSx3NCxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjAsdzIwLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyMgkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMCx3MjEscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3OCx3OCx3MSxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXczLHczLHcxMgorCWFkZAl3MjQsdzI0LHcyMAkJCS8vIGQrPWgKKwlhZGQJdzIwLHcyMCx3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwlhZGQJdzMsdzMsdzkKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzMsdzMsdzgKKy5Mb29wXzE2X3h4OgorCWxkcgl3OCxbc3AsIzRdCisJc3RyCXcxMSxbc3AsIzBdCisJcm9yCXcxNix3MjQsIzYKKwlhZGQJdzI3LHcyNyx3MTkJCQkvLyBoKz1LW2ldCisJcm9yCXcxMCx3NSwjNworCWFuZAl3MTcsdzI1LHcyNAorCXJvcgl3OSx3MiwjMTcKKwliaWMJdzE5LHcyNix3MjQKKwlyb3IJdzExLHcyMCwjMgorCWFkZAl3MjcsdzI3LHczCQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyNCxyb3IjMTEKKwllb3IJdzEwLHcxMCx3NSxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyMCx3MjEJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzI0LHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzExLHcxMSx3MjAscm9yIzEzCisJYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXc5LHc5LHcyLHJvciMxOQorCWVvcgl3MTAsdzEwLHc1LGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyNyx3MjcsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcyOCx3MjgsdzIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzExLHcyMCxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXc5LHc5LHcyLGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzQsdzQsdzEzCisJYWRkCXcyMyx3MjMsdzI3CQkJLy8gZCs9aAorCWFkZAl3MjcsdzI3LHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCWFkZAl3NCx3NCx3MTAKKwlhZGQJdzI3LHcyNyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzQsdzQsdzkKKwlsZHIJdzksW3NwLCM4XQorCXN0cgl3MTIsW3NwLCM0XQorCXJvcgl3MTYsdzIzLCM2CisJYWRkCXcyNix3MjYsdzI4CQkJLy8gaCs9S1tpXQorCXJvcgl3MTEsdzYsIzcKKwlhbmQJdzE3LHcyNCx3MjMKKwlyb3IJdzEwLHczLCMxNworCWJpYwl3MjgsdzI1LHcyMworCXJvcgl3MTIsdzI3LCMyCisJYWRkCXcyNix3MjYsdzQJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzIzLHJvciMxMQorCWVvcgl3MTEsdzExLHc2LHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzI3LHcyMAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjMscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3MTIsdzEyLHcyNyxyb3IjMTMKKwlhZGQJdzI2LHcyNix3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzEwLHcxMCx3Myxyb3IjMTkKKwllb3IJdzExLHcxMSx3Nixsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjYsdzI2LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyMAkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMix3Mjcscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3MTAsdzEwLHczLGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzUsdzUsdzE0CisJYWRkCXcyMix3MjIsdzI2CQkJLy8gZCs9aAorCWFkZAl3MjYsdzI2LHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCWFkZAl3NSx3NSx3MTEKKwlhZGQJdzI2LHcyNix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzUsdzUsdzEwCisJbGRyCXcxMCxbc3AsIzEyXQorCXN0cgl3MTMsW3NwLCM4XQorCXJvcgl3MTYsdzIyLCM2CisJYWRkCXcyNSx3MjUsdzE5CQkJLy8gaCs9S1tpXQorCXJvcgl3MTIsdzcsIzcKKwlhbmQJdzE3LHcyMyx3MjIKKwlyb3IJdzExLHc0LCMxNworCWJpYwl3MTksdzI0LHcyMgorCXJvcgl3MTMsdzI2LCMyCisJYWRkCXcyNSx3MjUsdzUJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzIyLHJvciMxMQorCWVvcgl3MTIsdzEyLHc3LHJvciMxOAorCW9ycgl3MTcsdzE3LHcxOQkJCS8vIENoKGUsZixnKQorCWVvcgl3MTksdzI2LHcyNwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjIscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3MTMsdzEzLHcyNixyb3IjMTMKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzExLHcxMSx3NCxyb3IjMTkKKwllb3IJdzEyLHcxMix3Nyxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjUsdzI1LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MjgsdzI4LHcyNwkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxMyx3MjYscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3MTEsdzExLHc0LGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzYsdzYsdzE1CisJYWRkCXcyMSx3MjEsdzI1CQkJLy8gZCs9aAorCWFkZAl3MjUsdzI1LHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCWFkZAl3Nix3Nix3MTIKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzYsdzYsdzExCisJbGRyCXcxMSxbc3AsIzBdCisJc3RyCXcxNCxbc3AsIzEyXQorCXJvcgl3MTYsdzIxLCM2CisJYWRkCXcyNCx3MjQsdzI4CQkJLy8gaCs9S1tpXQorCXJvcgl3MTMsdzgsIzcKKwlhbmQJdzE3LHcyMix3MjEKKwlyb3IJdzEyLHc1LCMxNworCWJpYwl3MjgsdzIzLHcyMQorCXJvcgl3MTQsdzI1LCMyCisJYWRkCXcyNCx3MjQsdzYJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzIxLHJvciMxMQorCWVvcgl3MTMsdzEzLHc4LHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzI1LHcyNgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjEscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3MTQsdzE0LHcyNSxyb3IjMTMKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzEyLHcxMix3NSxyb3IjMTkKKwllb3IJdzEzLHcxMyx3OCxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjQsdzI0LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyNgkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcxNCx3MjUscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3MTIsdzEyLHc1LGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzcsdzcsdzAKKwlhZGQJdzIwLHcyMCx3MjQJCQkvLyBkKz1oCisJYWRkCXcyNCx3MjQsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXc3LHc3LHcxMworCWFkZAl3MjQsdzI0LHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl3Nyx3Nyx3MTIKKwlsZHIJdzEyLFtzcCwjNF0KKwlzdHIJdzE1LFtzcCwjMF0KKwlyb3IJdzE2LHcyMCwjNgorCWFkZAl3MjMsdzIzLHcxOQkJCS8vIGgrPUtbaV0KKwlyb3IJdzE0LHc5LCM3CisJYW5kCXcxNyx3MjEsdzIwCisJcm9yCXcxMyx3NiwjMTcKKwliaWMJdzE5LHcyMix3MjAKKwlyb3IJdzE1LHcyNCwjMgorCWFkZAl3MjMsdzIzLHc3CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyMCxyb3IjMTEKKwllb3IJdzE0LHcxNCx3OSxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyNCx3MjUJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzIwLHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzE1LHcxNSx3MjQscm9yIzEzCisJYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXcyOCx3MjgsdzE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXcxMyx3MTMsdzYscm9yIzE5CisJZW9yCXcxNCx3MTQsdzksbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzIzLHcyMyx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzI4LHcyOCx3MjUJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MTUsdzI0LHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzEzLHcxMyx3Nixsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXc4LHc4LHcxCisJYWRkCXcyNyx3MjcsdzIzCQkJLy8gZCs9aAorCWFkZAl3MjMsdzIzLHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCWFkZAl3OCx3OCx3MTQKKwlhZGQJdzIzLHcyMyx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzgsdzgsdzEzCisJbGRyCXcxMyxbc3AsIzhdCisJc3RyCXcwLFtzcCwjNF0KKwlyb3IJdzE2LHcyNywjNgorCWFkZAl3MjIsdzIyLHcyOAkJCS8vIGgrPUtbaV0KKwlyb3IJdzE1LHcxMCwjNworCWFuZAl3MTcsdzIwLHcyNworCXJvcgl3MTQsdzcsIzE3CisJYmljCXcyOCx3MjEsdzI3CisJcm9yCXcwLHcyMywjMgorCWFkZAl3MjIsdzIyLHc4CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyNyxyb3IjMTEKKwllb3IJdzE1LHcxNSx3MTAscm9yIzE4CisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjMsdzI0CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyNyxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXcwLHcwLHcyMyxyb3IjMTMKKwlhZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzE0LHcxNCx3Nyxyb3IjMTkKKwllb3IJdzE1LHcxNSx3MTAsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzIyLHcyMix3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzE5LHcxOSx3MjQJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3MCx3MjMscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3MTQsdzE0LHc3LGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzksdzksdzIKKwlhZGQJdzI2LHcyNix3MjIJCQkvLyBkKz1oCisJYWRkCXcyMix3MjIsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXc5LHc5LHcxNQorCWFkZAl3MjIsdzIyLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl3OSx3OSx3MTQKKwlsZHIJdzE0LFtzcCwjMTJdCisJc3RyCXcxLFtzcCwjOF0KKwlyb3IJdzE2LHcyNiwjNgorCWFkZAl3MjEsdzIxLHcxOQkJCS8vIGgrPUtbaV0KKwlyb3IJdzAsdzExLCM3CisJYW5kCXcxNyx3MjcsdzI2CisJcm9yCXcxNSx3OCwjMTcKKwliaWMJdzE5LHcyMCx3MjYKKwlyb3IJdzEsdzIyLCMyCisJYWRkCXcyMSx3MjEsdzkJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzI2LHJvciMxMQorCWVvcgl3MCx3MCx3MTEscm9yIzE4CisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjIsdzIzCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyNixyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXcxLHcxLHcyMixyb3IjMTMKKwlhZGQJdzIxLHcyMSx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzE1LHcxNSx3OCxyb3IjMTkKKwllb3IJdzAsdzAsdzExLGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyMSx3MjEsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcyOCx3MjgsdzIzCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzEsdzIyLHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzE1LHcxNSx3OCxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcxMCx3MTAsdzMKKwlhZGQJdzI1LHcyNSx3MjEJCQkvLyBkKz1oCisJYWRkCXcyMSx3MjEsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXcxMCx3MTAsdzAKKwlhZGQJdzIxLHcyMSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzEwLHcxMCx3MTUKKwlsZHIJdzE1LFtzcCwjMF0KKwlzdHIJdzIsW3NwLCMxMl0KKwlyb3IJdzE2LHcyNSwjNgorCWFkZAl3MjAsdzIwLHcyOAkJCS8vIGgrPUtbaV0KKwlyb3IJdzEsdzEyLCM3CisJYW5kCXcxNyx3MjYsdzI1CisJcm9yCXcwLHc5LCMxNworCWJpYwl3MjgsdzI3LHcyNQorCXJvcgl3Mix3MjEsIzIKKwlhZGQJdzIwLHcyMCx3MTAJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzI1LHJvciMxMQorCWVvcgl3MSx3MSx3MTIscm9yIzE4CisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjEsdzIyCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyNSxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXcyLHcyLHcyMSxyb3IjMTMKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzAsdzAsdzkscm9yIzE5CisJZW9yCXcxLHcxLHcxMixsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjAsdzIwLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyMgkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHcyLHcyMSxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXcwLHcwLHc5LGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzExLHcxMSx3NAorCWFkZAl3MjQsdzI0LHcyMAkJCS8vIGQrPWgKKwlhZGQJdzIwLHcyMCx3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwlhZGQJdzExLHcxMSx3MQorCWFkZAl3MjAsdzIwLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl3MTEsdzExLHcwCisJbGRyCXcwLFtzcCwjNF0KKwlzdHIJdzMsW3NwLCMwXQorCXJvcgl3MTYsdzI0LCM2CisJYWRkCXcyNyx3MjcsdzE5CQkJLy8gaCs9S1tpXQorCXJvcgl3Mix3MTMsIzcKKwlhbmQJdzE3LHcyNSx3MjQKKwlyb3IJdzEsdzEwLCMxNworCWJpYwl3MTksdzI2LHcyNAorCXJvcgl3Myx3MjAsIzIKKwlhZGQJdzI3LHcyNyx3MTEJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzI0LHJvciMxMQorCWVvcgl3Mix3Mix3MTMscm9yIzE4CisJb3JyCXcxNyx3MTcsdzE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcxOSx3MjAsdzIxCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyNCxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXczLHczLHcyMCxyb3IjMTMKKwlhZGQJdzI3LHcyNyx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzI4LHcyOCx3MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzEsdzEsdzEwLHJvciMxOQorCWVvcgl3Mix3Mix3MTMsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzI3LHcyNyx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzI4LHcyOCx3MjEJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3Myx3MjAscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3MSx3MSx3MTAsbHNyIzEwCS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl3MTIsdzEyLHc1CisJYWRkCXcyMyx3MjMsdzI3CQkJLy8gZCs9aAorCWFkZAl3MjcsdzI3LHcyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzI4LFt4MzBdLCM0CQkvLyAqSysrLCB3MTkgaW4gbmV4dCByb3VuZAorCWFkZAl3MTIsdzEyLHcyCisJYWRkCXcyNyx3MjcsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcxMix3MTIsdzEKKwlsZHIJdzEsW3NwLCM4XQorCXN0cgl3NCxbc3AsIzRdCisJcm9yCXcxNix3MjMsIzYKKwlhZGQJdzI2LHcyNix3MjgJCQkvLyBoKz1LW2ldCisJcm9yCXczLHcxNCwjNworCWFuZAl3MTcsdzI0LHcyMworCXJvcgl3Mix3MTEsIzE3CisJYmljCXcyOCx3MjUsdzIzCisJcm9yCXc0LHcyNywjMgorCWFkZAl3MjYsdzI2LHcxMgkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3MjMscm9yIzExCisJZW9yCXczLHczLHcxNCxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MjgJCQkvLyBDaChlLGYsZykKKwllb3IJdzI4LHcyNyx3MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzIzLHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzQsdzQsdzI3LHJvciMxMworCWFkZAl3MjYsdzI2LHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl3MTksdzE5LHcyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl3Mix3Mix3MTEscm9yIzE5CisJZW9yCXczLHczLHcxNCxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjYsdzI2LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyMAkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc0LHcyNyxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXcyLHcyLHcxMSxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcxMyx3MTMsdzYKKwlhZGQJdzIyLHcyMix3MjYJCQkvLyBkKz1oCisJYWRkCXcyNix3MjYsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXcxMyx3MTMsdzMKKwlhZGQJdzI2LHcyNix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzEzLHcxMyx3MgorCWxkcgl3Mixbc3AsIzEyXQorCXN0cgl3NSxbc3AsIzhdCisJcm9yCXcxNix3MjIsIzYKKwlhZGQJdzI1LHcyNSx3MTkJCQkvLyBoKz1LW2ldCisJcm9yCXc0LHcxNSwjNworCWFuZAl3MTcsdzIzLHcyMgorCXJvcgl3Myx3MTIsIzE3CisJYmljCXcxOSx3MjQsdzIyCisJcm9yCXc1LHcyNiwjMgorCWFkZAl3MjUsdzI1LHcxMwkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3MjIscm9yIzExCisJZW9yCXc0LHc0LHcxNSxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyNix3MjcJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzIyLHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzUsdzUsdzI2LHJvciMxMworCWFkZAl3MjUsdzI1LHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl3Myx3Myx3MTIscm9yIzE5CisJZW9yCXc0LHc0LHcxNSxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjUsdzI1LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MjgsdzI4LHcyNwkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc1LHcyNixyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXczLHczLHcxMixsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcxNCx3MTQsdzcKKwlhZGQJdzIxLHcyMSx3MjUJCQkvLyBkKz1oCisJYWRkCXcyNSx3MjUsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXcxNCx3MTQsdzQKKwlhZGQJdzI1LHcyNSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzE0LHcxNCx3MworCWxkcgl3Myxbc3AsIzBdCisJc3RyCXc2LFtzcCwjMTJdCisJcm9yCXcxNix3MjEsIzYKKwlhZGQJdzI0LHcyNCx3MjgJCQkvLyBoKz1LW2ldCisJcm9yCXc1LHcwLCM3CisJYW5kCXcxNyx3MjIsdzIxCisJcm9yCXc0LHcxMywjMTcKKwliaWMJdzI4LHcyMyx3MjEKKwlyb3IJdzYsdzI1LCMyCisJYWRkCXcyNCx3MjQsdzE0CQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyMSxyb3IjMTEKKwllb3IJdzUsdzUsdzAscm9yIzE4CisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjUsdzI2CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyMSxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXc2LHc2LHcyNSxyb3IjMTMKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzQsdzQsdzEzLHJvciMxOQorCWVvcgl3NSx3NSx3MCxsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjQsdzI0LHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyNgkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc2LHcyNSxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXc0LHc0LHcxMyxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcxNSx3MTUsdzgKKwlhZGQJdzIwLHcyMCx3MjQJCQkvLyBkKz1oCisJYWRkCXcyNCx3MjQsdzE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MTksW3gzMF0sIzQJCS8vICpLKyssIHcyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXcxNSx3MTUsdzUKKwlhZGQJdzI0LHcyNCx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzE1LHcxNSx3NAorCWxkcgl3NCxbc3AsIzRdCisJc3RyCXc3LFtzcCwjMF0KKwlyb3IJdzE2LHcyMCwjNgorCWFkZAl3MjMsdzIzLHcxOQkJCS8vIGgrPUtbaV0KKwlyb3IJdzYsdzEsIzcKKwlhbmQJdzE3LHcyMSx3MjAKKwlyb3IJdzUsdzE0LCMxNworCWJpYwl3MTksdzIyLHcyMAorCXJvcgl3Nyx3MjQsIzIKKwlhZGQJdzIzLHcyMyx3MTUJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzIwLHJvciMxMQorCWVvcgl3Nix3Nix3MSxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyNCx3MjUJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzIwLHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzcsdzcsdzI0LHJvciMxMworCWFkZAl3MjMsdzIzLHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl3NSx3NSx3MTQscm9yIzE5CisJZW9yCXc2LHc2LHcxLGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyMyx3MjMsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcyOCx3MjgsdzI1CQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzcsdzI0LHJvciMyMgkvLyBTaWdtYTAoYSkKKwllb3IJdzUsdzUsdzE0LGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzAsdzAsdzkKKwlhZGQJdzI3LHcyNyx3MjMJCQkvLyBkKz1oCisJYWRkCXcyMyx3MjMsdzI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl3MjgsW3gzMF0sIzQJCS8vICpLKyssIHcxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXcwLHcwLHc2CisJYWRkCXcyMyx3MjMsdzE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXcwLHcwLHc1CisJbGRyCXc1LFtzcCwjOF0KKwlzdHIJdzgsW3NwLCM0XQorCXJvcgl3MTYsdzI3LCM2CisJYWRkCXcyMix3MjIsdzI4CQkJLy8gaCs9S1tpXQorCXJvcgl3Nyx3MiwjNworCWFuZAl3MTcsdzIwLHcyNworCXJvcgl3Nix3MTUsIzE3CisJYmljCXcyOCx3MjEsdzI3CisJcm9yCXc4LHcyMywjMgorCWFkZAl3MjIsdzIyLHcwCQkJLy8gaCs9WFtpXQorCWVvcgl3MTYsdzE2LHcyNyxyb3IjMTEKKwllb3IJdzcsdzcsdzIscm9yIzE4CisJb3JyCXcxNyx3MTcsdzI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXcyOCx3MjMsdzI0CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl3MTYsdzE2LHcyNyxyb3IjMjUJLy8gU2lnbWExKGUpCisJZW9yCXc4LHc4LHcyMyxyb3IjMTMKKwlhZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzYsdzYsdzE1LHJvciMxOQorCWVvcgl3Nyx3Nyx3Mixsc3IjMwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl3MjIsdzIyLHcxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl3MTksdzE5LHcyNAkJCS8vIE1haihhLGIsYykKKwllb3IJdzE3LHc4LHcyMyxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXc2LHc2LHcxNSxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcxLHcxLHcxMAorCWFkZAl3MjYsdzI2LHcyMgkJCS8vIGQrPWgKKwlhZGQJdzIyLHcyMix3MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcxOSxbeDMwXSwjNAkJLy8gKksrKywgdzI4IGluIG5leHQgcm91bmQKKwlhZGQJdzEsdzEsdzcKKwlhZGQJdzIyLHcyMix3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzEsdzEsdzYKKwlsZHIJdzYsW3NwLCMxMl0KKwlzdHIJdzksW3NwLCM4XQorCXJvcgl3MTYsdzI2LCM2CisJYWRkCXcyMSx3MjEsdzE5CQkJLy8gaCs9S1tpXQorCXJvcgl3OCx3MywjNworCWFuZAl3MTcsdzI3LHcyNgorCXJvcgl3Nyx3MCwjMTcKKwliaWMJdzE5LHcyMCx3MjYKKwlyb3IJdzksdzIyLCMyCisJYWRkCXcyMSx3MjEsdzEJCQkvLyBoKz1YW2ldCisJZW9yCXcxNix3MTYsdzI2LHJvciMxMQorCWVvcgl3OCx3OCx3Myxyb3IjMTgKKwlvcnIJdzE3LHcxNyx3MTkJCQkvLyBDaChlLGYsZykKKwllb3IJdzE5LHcyMix3MjMJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXcxNix3MTYsdzI2LHJvciMyNQkvLyBTaWdtYTEoZSkKKwllb3IJdzksdzksdzIyLHJvciMxMworCWFkZAl3MjEsdzIxLHcxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl3MjgsdzI4LHcxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl3Nyx3Nyx3MCxyb3IjMTkKKwllb3IJdzgsdzgsdzMsbHNyIzMJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJdzIxLHcyMSx3MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJdzI4LHcyOCx3MjMJCQkvLyBNYWooYSxiLGMpCisJZW9yCXcxNyx3OSx3MjIscm9yIzIyCS8vIFNpZ21hMChhKQorCWVvcgl3Nyx3Nyx3MCxsc3IjMTAJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXcyLHcyLHcxMQorCWFkZAl3MjUsdzI1LHcyMQkJCS8vIGQrPWgKKwlhZGQJdzIxLHcyMSx3MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXcyOCxbeDMwXSwjNAkJLy8gKksrKywgdzE5IGluIG5leHQgcm91bmQKKwlhZGQJdzIsdzIsdzgKKwlhZGQJdzIxLHcyMSx3MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJdzIsdzIsdzcKKwlsZHIJdzcsW3NwLCMwXQorCXN0cgl3MTAsW3NwLCMxMl0KKwlyb3IJdzE2LHcyNSwjNgorCWFkZAl3MjAsdzIwLHcyOAkJCS8vIGgrPUtbaV0KKwlyb3IJdzksdzQsIzcKKwlhbmQJdzE3LHcyNix3MjUKKwlyb3IJdzgsdzEsIzE3CisJYmljCXcyOCx3MjcsdzI1CisJcm9yCXcxMCx3MjEsIzIKKwlhZGQJdzIwLHcyMCx3MgkJCS8vIGgrPVhbaV0KKwllb3IJdzE2LHcxNix3MjUscm9yIzExCisJZW9yCXc5LHc5LHc0LHJvciMxOAorCW9ycgl3MTcsdzE3LHcyOAkJCS8vIENoKGUsZixnKQorCWVvcgl3MjgsdzIxLHcyMgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJdzE2LHcxNix3MjUscm9yIzI1CS8vIFNpZ21hMShlKQorCWVvcgl3MTAsdzEwLHcyMSxyb3IjMTMKKwlhZGQJdzIwLHcyMCx3MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJdzE5LHcxOSx3MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJdzgsdzgsdzEscm9yIzE5CisJZW9yCXc5LHc5LHc0LGxzciMzCS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXcyMCx3MjAsdzE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXcxOSx3MTksdzIyCQkJLy8gTWFqKGEsYixjKQorCWVvcgl3MTcsdzEwLHcyMSxyb3IjMjIJLy8gU2lnbWEwKGEpCisJZW9yCXc4LHc4LHcxLGxzciMxMAkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJdzMsdzMsdzEyCisJYWRkCXcyNCx3MjQsdzIwCQkJLy8gZCs9aAorCWFkZAl3MjAsdzIwLHcxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJdzE5LFt4MzBdLCM0CQkvLyAqSysrLCB3MjggaW4gbmV4dCByb3VuZAorCWFkZAl3Myx3Myx3OQorCWFkZAl3MjAsdzIwLHcxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl3Myx3Myx3OAorCWNibnoJdzE5LC5Mb29wXzE2X3h4CisKKwlsZHAJeDAseDIsW3gyOSwjOTZdCisJbGRyCXgxLFt4MjksIzExMl0KKwlzdWIJeDMwLHgzMCwjMjYwCQkvLyByZXdpbmQKKworCWxkcAl3Myx3NCxbeDBdCisJbGRwCXc1LHc2LFt4MCwjMio0XQorCWFkZAl4MSx4MSwjMTQqNAkJCS8vIGFkdmFuY2UgaW5wdXQgcG9pbnRlcgorCWxkcAl3Nyx3OCxbeDAsIzQqNF0KKwlhZGQJdzIwLHcyMCx3MworCWxkcAl3OSx3MTAsW3gwLCM2KjRdCisJYWRkCXcyMSx3MjEsdzQKKwlhZGQJdzIyLHcyMix3NQorCWFkZAl3MjMsdzIzLHc2CisJc3RwCXcyMCx3MjEsW3gwXQorCWFkZAl3MjQsdzI0LHc3CisJYWRkCXcyNSx3MjUsdzgKKwlzdHAJdzIyLHcyMyxbeDAsIzIqNF0KKwlhZGQJdzI2LHcyNix3OQorCWFkZAl3MjcsdzI3LHcxMAorCWNtcAl4MSx4MgorCXN0cAl3MjQsdzI1LFt4MCwjNCo0XQorCXN0cAl3MjYsdzI3LFt4MCwjNio0XQorCWIubmUJLkxvb3AKKworCWxkcAl4MTkseDIwLFt4MjksIzE2XQorCWFkZAlzcCxzcCwjNCo0CisJbGRwCXgyMSx4MjIsW3gyOSwjMzJdCisJbGRwCXgyMyx4MjQsW3gyOSwjNDhdCisJbGRwCXgyNSx4MjYsW3gyOSwjNjRdCisJbGRwCXgyNyx4MjgsW3gyOSwjODBdCisJbGRwCXgyOSx4MzAsW3NwXSwjMTI4CisJcmV0Cisuc2l6ZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisKKy5hbGlnbgk2CisudHlwZQkuTEsyNTYsJW9iamVjdAorLkxLMjU2OgorLmxvbmcJMHg0MjhhMmY5OCwweDcxMzc0NDkxLDB4YjVjMGZiY2YsMHhlOWI1ZGJhNQorLmxvbmcJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorLmxvbmcJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworLmxvbmcJMHg3MmJlNWQ3NCwweDgwZGViMWZlLDB4OWJkYzA2YTcsMHhjMTliZjE3NAorLmxvbmcJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworLmxvbmcJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorLmxvbmcJMHg5ODNlNTE1MiwweGE4MzFjNjZkLDB4YjAwMzI3YzgsMHhiZjU5N2ZjNworLmxvbmcJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworLmxvbmcJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworLmxvbmcJMHg2NTBhNzM1NCwweDc2NmEwYWJiLDB4ODFjMmM5MmUsMHg5MjcyMmM4NQorLmxvbmcJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworLmxvbmcJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorLmxvbmcJMHgxOWE0YzExNiwweDFlMzc2YzA4LDB4Mjc0ODc3NGMsMHgzNGIwYmNiNQorLmxvbmcJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworLmxvbmcJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorLmxvbmcJMHg5MGJlZmZmYSwweGE0NTA2Y2ViLDB4YmVmOWEzZjcsMHhjNjcxNzhmMgorLmxvbmcJMAkvL3Rlcm1pbmF0b3IKKy5zaXplCS5MSzI1NiwuLS5MSzI1NgorI2lmbmRlZglfX0tFUk5FTF9fCisuYWxpZ24JMworLkxPUEVOU1NMX2FybWNhcF9QOgorIyBpZmRlZglfX0lMUDMyX18KKy5sb25nCU9QRU5TU0xfYXJtY2FwX1AtLgorIyBlbHNlCisucXVhZAlPUEVOU1NMX2FybWNhcF9QLS4KKyMgZW5kaWYKKyNlbmRpZgorLmJ5dGUJODMsNzIsNjUsNTAsNTMsNTQsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiw2NSw4Miw3NywxMTgsNTYsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTIKKy5hbGlnbgkyCisjaWZuZGVmCV9fS0VSTkVMX18KKy50eXBlCXNoYTI1Nl9ibG9ja19hcm12OCwlZnVuY3Rpb24KKy5hbGlnbgk2CitzaGEyNTZfYmxvY2tfYXJtdjg6CisuTHY4X2VudHJ5OgorCXN0cAl4MjkseDMwLFtzcCwjLTE2XSEKKwlhZGQJeDI5LHNwLCMwCisKKwlsZDEJe3YwLjRzLHYxLjRzfSxbeDBdCisJYWRyCXgzLC5MSzI1NgorCisuTG9vcF9odzoKKwlsZDEJe3Y0LjE2Yix2NS4xNmIsdjYuMTZiLHY3LjE2Yn0sW3gxXSwjNjQKKwlzdWIJeDIseDIsIzEKKwlsZDEJe3YxNi40c30sW3gzXSwjMTYKKwlyZXYzMgl2NC4xNmIsdjQuMTZiCisJcmV2MzIJdjUuMTZiLHY1LjE2YgorCXJldjMyCXY2LjE2Yix2Ni4xNmIKKwlyZXYzMgl2Ny4xNmIsdjcuMTZiCisJb3JyCXYxOC4xNmIsdjAuMTZiLHYwLjE2YgkJLy8gb2ZmbG9hZAorCW9ycgl2MTkuMTZiLHYxLjE2Yix2MS4xNmIKKwlsZDEJe3YxNy40c30sW3gzXSwjMTYKKwlhZGQJdjE2LjRzLHYxNi40cyx2NC40cworLmluc3QJMHg1ZTI4MjhhNAkvL3NoYTI1NnN1MCB2NC4xNmIsdjUuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisuaW5zdAkweDVlMTA0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNi40cworLmluc3QJMHg1ZTEwNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE2LjRzCisuaW5zdAkweDVlMDc2MGM0CS8vc2hhMjU2c3UxIHY0LjE2Yix2Ni4xNmIsdjcuMTZiCisJbGQxCXt2MTYuNHN9LFt4M10sIzE2CisJYWRkCXYxNy40cyx2MTcuNHMsdjUuNHMKKy5pbnN0CTB4NWUyODI4YzUJLy9zaGEyNTZzdTAgdjUuMTZiLHY2LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmluc3QJMHg1ZTExNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTcuNHMKKy5pbnN0CTB4NWUxMTUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNy40cworLmluc3QJMHg1ZTA0NjBlNQkvL3NoYTI1NnN1MSB2NS4xNmIsdjcuMTZiLHY0LjE2YgorCWxkMQl7djE3LjRzfSxbeDNdLCMxNgorCWFkZAl2MTYuNHMsdjE2LjRzLHY2LjRzCisuaW5zdAkweDVlMjgyOGU2CS8vc2hhMjU2c3UwIHY2LjE2Yix2Ny4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5pbnN0CTB4NWUxMDQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE2LjRzCisuaW5zdAkweDVlMTA1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTYuNHMKKy5pbnN0CTB4NWUwNTYwODYJLy9zaGEyNTZzdTEgdjYuMTZiLHY0LjE2Yix2NS4xNmIKKwlsZDEJe3YxNi40c30sW3gzXSwjMTYKKwlhZGQJdjE3LjRzLHYxNy40cyx2Ny40cworLmluc3QJMHg1ZTI4Mjg4NwkvL3NoYTI1NnN1MCB2Ny4xNmIsdjQuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisuaW5zdAkweDVlMTE0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNy40cworLmluc3QJMHg1ZTExNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE3LjRzCisuaW5zdAkweDVlMDY2MGE3CS8vc2hhMjU2c3UxIHY3LjE2Yix2NS4xNmIsdjYuMTZiCisJbGQxCXt2MTcuNHN9LFt4M10sIzE2CisJYWRkCXYxNi40cyx2MTYuNHMsdjQuNHMKKy5pbnN0CTB4NWUyODI4YTQJLy9zaGEyNTZzdTAgdjQuMTZiLHY1LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmluc3QJMHg1ZTEwNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTYuNHMKKy5pbnN0CTB4NWUxMDUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNi40cworLmluc3QJMHg1ZTA3NjBjNAkvL3NoYTI1NnN1MSB2NC4xNmIsdjYuMTZiLHY3LjE2YgorCWxkMQl7djE2LjRzfSxbeDNdLCMxNgorCWFkZAl2MTcuNHMsdjE3LjRzLHY1LjRzCisuaW5zdAkweDVlMjgyOGM1CS8vc2hhMjU2c3UwIHY1LjE2Yix2Ni4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5pbnN0CTB4NWUxMTQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE3LjRzCisuaW5zdAkweDVlMTE1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTcuNHMKKy5pbnN0CTB4NWUwNDYwZTUJLy9zaGEyNTZzdTEgdjUuMTZiLHY3LjE2Yix2NC4xNmIKKwlsZDEJe3YxNy40c30sW3gzXSwjMTYKKwlhZGQJdjE2LjRzLHYxNi40cyx2Ni40cworLmluc3QJMHg1ZTI4MjhlNgkvL3NoYTI1NnN1MCB2Ni4xNmIsdjcuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisuaW5zdAkweDVlMTA0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNi40cworLmluc3QJMHg1ZTEwNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE2LjRzCisuaW5zdAkweDVlMDU2MDg2CS8vc2hhMjU2c3UxIHY2LjE2Yix2NC4xNmIsdjUuMTZiCisJbGQxCXt2MTYuNHN9LFt4M10sIzE2CisJYWRkCXYxNy40cyx2MTcuNHMsdjcuNHMKKy5pbnN0CTB4NWUyODI4ODcJLy9zaGEyNTZzdTAgdjcuMTZiLHY0LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmluc3QJMHg1ZTExNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTcuNHMKKy5pbnN0CTB4NWUxMTUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNy40cworLmluc3QJMHg1ZTA2NjBhNwkvL3NoYTI1NnN1MSB2Ny4xNmIsdjUuMTZiLHY2LjE2YgorCWxkMQl7djE3LjRzfSxbeDNdLCMxNgorCWFkZAl2MTYuNHMsdjE2LjRzLHY0LjRzCisuaW5zdAkweDVlMjgyOGE0CS8vc2hhMjU2c3UwIHY0LjE2Yix2NS4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5pbnN0CTB4NWUxMDQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE2LjRzCisuaW5zdAkweDVlMTA1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTYuNHMKKy5pbnN0CTB4NWUwNzYwYzQJLy9zaGEyNTZzdTEgdjQuMTZiLHY2LjE2Yix2Ny4xNmIKKwlsZDEJe3YxNi40c30sW3gzXSwjMTYKKwlhZGQJdjE3LjRzLHYxNy40cyx2NS40cworLmluc3QJMHg1ZTI4MjhjNQkvL3NoYTI1NnN1MCB2NS4xNmIsdjYuMTZiCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisuaW5zdAkweDVlMTE0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNy40cworLmluc3QJMHg1ZTExNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE3LjRzCisuaW5zdAkweDVlMDQ2MGU1CS8vc2hhMjU2c3UxIHY1LjE2Yix2Ny4xNmIsdjQuMTZiCisJbGQxCXt2MTcuNHN9LFt4M10sIzE2CisJYWRkCXYxNi40cyx2MTYuNHMsdjYuNHMKKy5pbnN0CTB4NWUyODI4ZTYJLy9zaGEyNTZzdTAgdjYuMTZiLHY3LjE2YgorCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmluc3QJMHg1ZTEwNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTYuNHMKKy5pbnN0CTB4NWUxMDUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNi40cworLmluc3QJMHg1ZTA1NjA4NgkvL3NoYTI1NnN1MSB2Ni4xNmIsdjQuMTZiLHY1LjE2YgorCWxkMQl7djE2LjRzfSxbeDNdLCMxNgorCWFkZAl2MTcuNHMsdjE3LjRzLHY3LjRzCisuaW5zdAkweDVlMjgyODg3CS8vc2hhMjU2c3UwIHY3LjE2Yix2NC4xNmIKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5pbnN0CTB4NWUxMTQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE3LjRzCisuaW5zdAkweDVlMTE1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTcuNHMKKy5pbnN0CTB4NWUwNjYwYTcJLy9zaGEyNTZzdTEgdjcuMTZiLHY1LjE2Yix2Ni4xNmIKKwlsZDEJe3YxNy40c30sW3gzXSwjMTYKKwlhZGQJdjE2LjRzLHYxNi40cyx2NC40cworCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmluc3QJMHg1ZTEwNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTYuNHMKKy5pbnN0CTB4NWUxMDUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNi40cworCisJbGQxCXt2MTYuNHN9LFt4M10sIzE2CisJYWRkCXYxNy40cyx2MTcuNHMsdjUuNHMKKwlvcnIJdjIuMTZiLHYwLjE2Yix2MC4xNmIKKy5pbnN0CTB4NWUxMTQwMjAJLy9zaGEyNTZoIHYwLjE2Yix2MS4xNmIsdjE3LjRzCisuaW5zdAkweDVlMTE1MDQxCS8vc2hhMjU2aDIgdjEuMTZiLHYyLjE2Yix2MTcuNHMKKworCWxkMQl7djE3LjRzfSxbeDNdCisJYWRkCXYxNi40cyx2MTYuNHMsdjYuNHMKKwlzdWIJeDMseDMsIzY0KjQtMTYJLy8gcmV3aW5kCisJb3JyCXYyLjE2Yix2MC4xNmIsdjAuMTZiCisuaW5zdAkweDVlMTA0MDIwCS8vc2hhMjU2aCB2MC4xNmIsdjEuMTZiLHYxNi40cworLmluc3QJMHg1ZTEwNTA0MQkvL3NoYTI1NmgyIHYxLjE2Yix2Mi4xNmIsdjE2LjRzCisKKwlhZGQJdjE3LjRzLHYxNy40cyx2Ny40cworCW9ycgl2Mi4xNmIsdjAuMTZiLHYwLjE2YgorLmluc3QJMHg1ZTExNDAyMAkvL3NoYTI1NmggdjAuMTZiLHYxLjE2Yix2MTcuNHMKKy5pbnN0CTB4NWUxMTUwNDEJLy9zaGEyNTZoMiB2MS4xNmIsdjIuMTZiLHYxNy40cworCisJYWRkCXYwLjRzLHYwLjRzLHYxOC40cworCWFkZAl2MS40cyx2MS40cyx2MTkuNHMKKworCWNibnoJeDIsLkxvb3BfaHcKKworCXN0MQl7djAuNHMsdjEuNHN9LFt4MF0KKworCWxkcgl4MjksW3NwXSwjMTYKKwlyZXQKKy5zaXplCXNoYTI1Nl9ibG9ja19hcm12OCwuLXNoYTI1Nl9ibG9ja19hcm12OAorI2VuZGlmCisjaWZuZGVmCV9fS0VSTkVMX18KKy5jb21tCU9QRU5TU0xfYXJtY2FwX1AsNCw0CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi1hcm12OC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hYXJjaDY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi1hcm12OC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDUyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFhcmNoNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLWFybXY4LlMKQEAgLTAsMCArMSwxMDc1IEBACisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKy8vIENvcHlyaWdodCAyMDE0LTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCisvLyB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorLy8gaW4gdGhlIGZpbGUgTElDRU5TRSBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvciBhdAorLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisvLyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisvLyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorLy8gZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisvLworLy8gUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMdjIgdGVybXMgaXMgZ3JhbnRlZC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gU0hBMjU2LzUxMiBmb3IgQVJNdjguCisvLworLy8gUGVyZm9ybWFuY2UgaW4gY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnQKKy8vIG92ZXIgY29kZSBnZW5lcmF0ZWQgd2l0aCAiZGVmYXVsdCIgY29tcGlsZXI6CisvLworLy8JCVNIQTI1Ni1odwlTSEEyNTYoKikJU0hBNTEyCisvLyBBcHBsZSBBNwkxLjk3CQkxMC41ICgrMzMlKQk2LjczICgtMSUoKiopKQorLy8gQ29ydGV4LUE1MwkyLjM4CQkxNS41ICgrMTE1JSkJMTAuMCAoKzE1MCUoKioqKSkKKy8vIENvcnRleC1BNTcJMi4zMQkJMTEuNiAoKzg2JSkJNy41MSAoKzI2MCUoKioqKSkKKy8vIERlbnZlcgkyLjAxCQkxMC41ICgrMjYlKQk2LjcwICgrOCUpCisvLyBYLUdlbmUJCQkyMC4wICgrMTAwJSkJMTIuOCAoKzMwMCUoKioqKSkKKy8vIE1vbmdvb3NlCTIuMzYJCTEzLjAgKCs1MCUpCTguMzYgKCszMyUpCisvLworLy8gKCopCVNvZnR3YXJlIFNIQTI1NiByZXN1bHRzIGFyZSBvZiBsZXNzZXIgcmVsZXZhbmNlLCBwcmVzZW50ZWQKKy8vCW1vc3RseSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3Nlcy4KKy8vICgqKikJVGhlIHJlc3VsdCBpcyBhIHRyYWRlLW9mZjogaXQncyBwb3NzaWJsZSB0byBpbXByb3ZlIGl0IGJ5CisvLwkxMCUgKG9yIGJ5IDEgY3ljbGUgcGVyIHJvdW5kKSwgYnV0IGF0IHRoZSBjb3N0IG9mIDIwJSBsb3NzCisvLwlvbiBDb3J0ZXgtQTUzIChvciBieSA0IGN5Y2xlcyBwZXIgcm91bmQpLgorLy8gKCoqKikJU3VwZXItaW1wcmVzc2l2ZSBjb2VmZmljaWVudHMgb3ZlciBnY2MtZ2VuZXJhdGVkIGNvZGUgYXJlCisvLwlpbmRpY2F0aW9uIG9mIHNvbWUgY29tcGlsZXIgInBhdGhvbG9neSIsIG1vc3Qgbm90YWJseSBjb2RlCisvLwlnZW5lcmF0ZWQgd2l0aCAtbWdlbmVyYWwtcmVncy1vbmx5IGlzIHNpZ25pZmljYW50eSBmYXN0ZXIKKy8vCWFuZCB0aGUgZ2FwIGlzIG9ubHkgNDAtOTAlLgorCisjaWZuZGVmCV9fS0VSTkVMX18KKyMgaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2VuZGlmCisKKy50ZXh0CisKKworLmdsb2JsCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisuaGlkZGVuCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciwlZnVuY3Rpb24KKy5hbGlnbgk2CitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcjoKKwlzdHAJeDI5LHgzMCxbc3AsIy0xMjhdIQorCWFkZAl4Mjksc3AsIzAKKworCXN0cAl4MTkseDIwLFtzcCwjMTZdCisJc3RwCXgyMSx4MjIsW3NwLCMzMl0KKwlzdHAJeDIzLHgyNCxbc3AsIzQ4XQorCXN0cAl4MjUseDI2LFtzcCwjNjRdCisJc3RwCXgyNyx4MjgsW3NwLCM4MF0KKwlzdWIJc3Asc3AsIzQqOAorCisJbGRwCXgyMCx4MjEsW3gwXQkJCQkvLyBsb2FkIGNvbnRleHQKKwlsZHAJeDIyLHgyMyxbeDAsIzIqOF0KKwlsZHAJeDI0LHgyNSxbeDAsIzQqOF0KKwlhZGQJeDIseDEseDIsbHNsIzcJLy8gZW5kIG9mIGlucHV0CisJbGRwCXgyNix4MjcsW3gwLCM2KjhdCisJYWRyCXgzMCwuTEs1MTIKKwlzdHAJeDAseDIsW3gyOSwjOTZdCisKKy5Mb29wOgorCWxkcAl4Myx4NCxbeDFdLCMyKjgKKwlsZHIJeDE5LFt4MzBdLCM4CQkJLy8gKksrKworCWVvcgl4MjgseDIxLHgyMgkJCQkvLyBtYWdpYyBzZWVkCisJc3RyCXgxLFt4MjksIzExMl0KKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgzLHgzCQkJLy8gMAorI2VuZGlmCisJcm9yCXgxNix4MjQsIzE0CisJYWRkCXgyNyx4MjcseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4Nix4MjQseDI0LHJvciMyMworCWFuZAl4MTcseDI1LHgyNAorCWJpYwl4MTkseDI2LHgyNAorCWFkZAl4MjcseDI3LHgzCQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDIwLHgyMQkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Nixyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg2LHgyMCwjMjgKKwlhZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMCx4MjAscm9yIzUKKwlhZGQJeDI3LHgyNyx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIzLHgyMyx4MjcJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDYseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDI3LHgyNyx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjcseDI3LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDQseDQJCQkvLyAxCisjZW5kaWYKKwlsZHAJeDUseDYsW3gxXSwjMio4CisJYWRkCXgyNyx4MjcseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjMsIzE0CisJYWRkCXgyNix4MjYseDI4CQkJLy8gaCs9S1tpXQorCWVvcgl4Nyx4MjMseDIzLHJvciMyMworCWFuZAl4MTcseDI0LHgyMworCWJpYwl4MjgseDI1LHgyMworCWFkZAl4MjYseDI2LHg0CQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDI3LHgyMAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Nyxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg3LHgyNywjMjgKKwlhZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyNyx4Mjcscm9yIzUKKwlhZGQJeDI2LHgyNix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIyLHgyMix4MjYJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDIwCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDcseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDI2LHgyNix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjYseDI2LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDUseDUJCQkvLyAyCisjZW5kaWYKKwlhZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyMiwjMTQKKwlhZGQJeDI1LHgyNSx4MTkJCQkvLyBoKz1LW2ldCisJZW9yCXg4LHgyMix4MjIscm9yIzIzCisJYW5kCXgxNyx4MjMseDIyCisJYmljCXgxOSx4MjQseDIyCisJYWRkCXgyNSx4MjUseDUJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjYseDI3CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHg4LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDgseDI2LCMyOAorCWFkZAl4MjUseDI1LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl4MTcseDI2LHgyNixyb3IjNQorCWFkZAl4MjUseDI1LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl4MjEseDIxLHgyNQkJCS8vIGQrPWgKKwllb3IJeDI4LHgyOCx4MjcJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4OCx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjUseDI1LHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyNSx4MjUseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4Nix4NgkJCS8vIDMKKyNlbmRpZgorCWxkcAl4Nyx4OCxbeDFdLCMyKjgKKwlhZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyMSwjMTQKKwlhZGQJeDI0LHgyNCx4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXg5LHgyMSx4MjEscm9yIzIzCisJYW5kCXgxNyx4MjIseDIxCisJYmljCXgyOCx4MjMseDIxCisJYWRkCXgyNCx4MjQseDYJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjUseDI2CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHg5LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDkseDI1LCMyOAorCWFkZAl4MjQseDI0LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl4MTcseDI1LHgyNSxyb3IjNQorCWFkZAl4MjQseDI0LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl4MjAseDIwLHgyNAkJCS8vIGQrPWgKKwllb3IJeDE5LHgxOSx4MjYJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4OSx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjQseDI0LHgxOQkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDE5LFt4MzBdLCM4CQkvLyAqSysrLCB4MjggaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyNCx4MjQseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4Nyx4NwkJCS8vIDQKKyNlbmRpZgorCWFkZAl4MjQseDI0LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCXJvcgl4MTYseDIwLCMxNAorCWFkZAl4MjMseDIzLHgxOQkJCS8vIGgrPUtbaV0KKwllb3IJeDEwLHgyMCx4MjAscm9yIzIzCisJYW5kCXgxNyx4MjEseDIwCisJYmljCXgxOSx4MjIseDIwCisJYWRkCXgyMyx4MjMseDcJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjQseDI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgxMCxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXgxMCx4MjQsIzI4CisJYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXgxNyx4MjQseDI0LHJvciM1CisJYWRkCXgyMyx4MjMseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXgyNyx4MjcseDIzCQkJLy8gZCs9aAorCWVvcgl4MjgseDI4LHgyNQkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgxMCx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjMseDIzLHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4OCx4OAkJCS8vIDUKKyNlbmRpZgorCWxkcAl4OSx4MTAsW3gxXSwjMio4CisJYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjcsIzE0CisJYWRkCXgyMix4MjIseDI4CQkJLy8gaCs9S1tpXQorCWVvcgl4MTEseDI3LHgyNyxyb3IjMjMKKwlhbmQJeDE3LHgyMCx4MjcKKwliaWMJeDI4LHgyMSx4MjcKKwlhZGQJeDIyLHgyMix4OAkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyMyx4MjQJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDExLHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDExLHgyMywjMjgKKwlhZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMyx4MjMscm9yIzUKKwlhZGQJeDIyLHgyMix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI2LHgyNix4MjIJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDExLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyMix4MjIseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXg5LHg5CQkJLy8gNgorI2VuZGlmCisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjYsIzE0CisJYWRkCXgyMSx4MjEseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4MTIseDI2LHgyNixyb3IjMjMKKwlhbmQJeDE3LHgyNyx4MjYKKwliaWMJeDE5LHgyMCx4MjYKKwlhZGQJeDIxLHgyMSx4OQkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMix4MjMJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDEyLHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDEyLHgyMiwjMjgKKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMix4MjIscm9yIzUKKwlhZGQJeDIxLHgyMSx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI1LHgyNSx4MjEJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIzCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDEyLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyMSx4MjEseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMCx4MTAJCQkvLyA3CisjZW5kaWYKKwlsZHAJeDExLHgxMixbeDFdLCMyKjgKKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyNSwjMTQKKwlhZGQJeDIwLHgyMCx4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXgxMyx4MjUseDI1LHJvciMyMworCWFuZAl4MTcseDI2LHgyNQorCWJpYwl4MjgseDI3LHgyNQorCWFkZAl4MjAseDIwLHgxMAkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyMSx4MjIJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDEzLHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDEzLHgyMSwjMjgKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMSx4MjEscm9yIzUKKwlhZGQJeDIwLHgyMCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI0LHgyNCx4MjAJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDIyCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDEzLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyMCx4MjAseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMSx4MTEJCQkvLyA4CisjZW5kaWYKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyNCwjMTQKKwlhZGQJeDI3LHgyNyx4MTkJCQkvLyBoKz1LW2ldCisJZW9yCXgxNCx4MjQseDI0LHJvciMyMworCWFuZAl4MTcseDI1LHgyNAorCWJpYwl4MTkseDI2LHgyNAorCWFkZAl4MjcseDI3LHgxMQkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMCx4MjEJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDE0LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDE0LHgyMCwjMjgKKwlhZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMCx4MjAscm9yIzUKKwlhZGQJeDI3LHgyNyx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIzLHgyMyx4MjcJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIxCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDE0LHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyNyx4MjcseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMix4MTIJCQkvLyA5CisjZW5kaWYKKwlsZHAJeDEzLHgxNCxbeDFdLCMyKjgKKwlhZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlyb3IJeDE2LHgyMywjMTQKKwlhZGQJeDI2LHgyNix4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXgxNSx4MjMseDIzLHJvciMyMworCWFuZAl4MTcseDI0LHgyMworCWJpYwl4MjgseDI1LHgyMworCWFkZAl4MjYseDI2LHgxMgkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyNyx4MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDE1LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDE1LHgyNywjMjgKKwlhZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyNyx4Mjcscm9yIzUKKwlhZGQJeDI2LHgyNix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIyLHgyMix4MjYJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDIwCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDE1LHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyNix4MjYseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDI2LHgyNix4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxMyx4MTMJCQkvLyAxMAorI2VuZGlmCisJYWRkCXgyNix4MjYseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJcm9yCXgxNix4MjIsIzE0CisJYWRkCXgyNSx4MjUseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4MCx4MjIseDIyLHJvciMyMworCWFuZAl4MTcseDIzLHgyMgorCWJpYwl4MTkseDI0LHgyMgorCWFkZAl4MjUseDI1LHgxMwkJCS8vIGgrPVhbaV0KKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyNix4MjcJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDAscm9yIzE4CS8vIFNpZ21hMShlKQorCXJvcgl4MCx4MjYsIzI4CisJYWRkCXgyNSx4MjUseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJZW9yCXgxNyx4MjYseDI2LHJvciM1CisJYWRkCXgyNSx4MjUseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJYWRkCXgyMSx4MjEseDI1CQkJLy8gZCs9aAorCWVvcgl4MjgseDI4LHgyNwkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgwLHgxNyxyb3IjMzQJLy8gU2lnbWEwKGEpCisJYWRkCXgyNSx4MjUseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJLy9hZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKyNpZm5kZWYJX19BUk1FQl9fCisJcmV2CXgxNCx4MTQJCQkvLyAxMQorI2VuZGlmCisJbGRwCXgxNSx4MCxbeDFdLCMyKjgKKwlhZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJeDYsW3NwLCMyNF0KKwlyb3IJeDE2LHgyMSwjMTQKKwlhZGQJeDI0LHgyNCx4MjgJCQkvLyBoKz1LW2ldCisJZW9yCXg2LHgyMSx4MjEscm9yIzIzCisJYW5kCXgxNyx4MjIseDIxCisJYmljCXgyOCx4MjMseDIxCisJYWRkCXgyNCx4MjQseDE0CQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDI1LHgyNgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Nixyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg2LHgyNSwjMjgKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyNSx4MjUscm9yIzUKKwlhZGQJeDI0LHgyNCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDIwLHgyMCx4MjQJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDI2CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDYseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDI0LHgyNCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjQseDI0LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDE1LHgxNQkJCS8vIDEyCisjZW5kaWYKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJeDcsW3NwLCMwXQorCXJvcgl4MTYseDIwLCMxNAorCWFkZAl4MjMseDIzLHgxOQkJCS8vIGgrPUtbaV0KKwllb3IJeDcseDIwLHgyMCxyb3IjMjMKKwlhbmQJeDE3LHgyMSx4MjAKKwliaWMJeDE5LHgyMix4MjAKKwlhZGQJeDIzLHgyMyx4MTUJCQkvLyBoKz1YW2ldCisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjQseDI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHg3LHJvciMxOAkvLyBTaWdtYTEoZSkKKwlyb3IJeDcseDI0LCMyOAorCWFkZAl4MjMseDIzLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWVvcgl4MTcseDI0LHgyNCxyb3IjNQorCWFkZAl4MjMseDIzLHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWFkZAl4MjcseDI3LHgyMwkJCS8vIGQrPWgKKwllb3IJeDI4LHgyOCx4MjUJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4Nyx4MTcscm9yIzM0CS8vIFNpZ21hMChhKQorCWFkZAl4MjMseDIzLHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCS8vYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisjaWZuZGVmCV9fQVJNRUJfXworCXJldgl4MCx4MAkJCS8vIDEzCisjZW5kaWYKKwlsZHAJeDEseDIsW3gxXQorCWFkZAl4MjMseDIzLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCXN0cgl4OCxbc3AsIzhdCisJcm9yCXgxNix4MjcsIzE0CisJYWRkCXgyMix4MjIseDI4CQkJLy8gaCs9S1tpXQorCWVvcgl4OCx4MjcseDI3LHJvciMyMworCWFuZAl4MTcseDIwLHgyNworCWJpYwl4MjgseDIxLHgyNworCWFkZAl4MjIseDIyLHgwCQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDIzLHgyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4OCxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg4LHgyMywjMjgKKwlhZGQJeDIyLHgyMix4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMyx4MjMscm9yIzUKKwlhZGQJeDIyLHgyMix4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI2LHgyNix4MjIJCQkvLyBkKz1oCisJZW9yCXgxOSx4MTkseDI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDgseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDIyLHgyMix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjIseDIyLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDEseDEJCQkvLyAxNAorI2VuZGlmCisJbGRyCXg2LFtzcCwjMjRdCisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJc3RyCXg5LFtzcCwjMTZdCisJcm9yCXgxNix4MjYsIzE0CisJYWRkCXgyMSx4MjEseDE5CQkJLy8gaCs9S1tpXQorCWVvcgl4OSx4MjYseDI2LHJvciMyMworCWFuZAl4MTcseDI3LHgyNgorCWJpYwl4MTkseDIwLHgyNgorCWFkZAl4MjEseDIxLHgxCQkJLy8gaCs9WFtpXQorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDIyLHgyMwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4OSxyb3IjMTgJLy8gU2lnbWExKGUpCisJcm9yCXg5LHgyMiwjMjgKKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwllb3IJeDE3LHgyMix4MjIscm9yIzUKKwlhZGQJeDIxLHgyMSx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwlhZGQJeDI1LHgyNSx4MjEJCQkvLyBkKz1oCisJZW9yCXgyOCx4MjgseDIzCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDkseDE3LHJvciMzNAkvLyBTaWdtYTAoYSkKKwlhZGQJeDIxLHgyMSx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwkvL2FkZAl4MjEseDIxLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorI2lmbmRlZglfX0FSTUVCX18KKwlyZXYJeDIseDIJCQkvLyAxNQorI2VuZGlmCisJbGRyCXg3LFtzcCwjMF0KKwlhZGQJeDIxLHgyMSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlzdHIJeDEwLFtzcCwjMjRdCisJcm9yCXgxNix4MjUsIzE0CisJYWRkCXgyMCx4MjAseDI4CQkJLy8gaCs9S1tpXQorCXJvcgl4OSx4NCwjMQorCWFuZAl4MTcseDI2LHgyNQorCXJvcgl4OCx4MSwjMTkKKwliaWMJeDI4LHgyNyx4MjUKKwlyb3IJeDEwLHgyMSwjMjgKKwlhZGQJeDIwLHgyMCx4MgkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjUscm9yIzE4CisJZW9yCXg5LHg5LHg0LHJvciM4CisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjEseDIyCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyNSxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgxMCx4MTAseDIxLHJvciMzNAorCWFkZAl4MjAseDIwLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4OCx4OCx4MSxyb3IjNjEKKwllb3IJeDkseDkseDQsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIwLHgyMCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjIJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4MTAseDIxLHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDgseDgseDEsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgzLHgzLHgxMgorCWFkZAl4MjQseDI0LHgyMAkJCS8vIGQrPWgKKwlhZGQJeDIwLHgyMCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDMseDMseDkKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDMseDMseDgKKy5Mb29wXzE2X3h4OgorCWxkcgl4OCxbc3AsIzhdCisJc3RyCXgxMSxbc3AsIzBdCisJcm9yCXgxNix4MjQsIzE0CisJYWRkCXgyNyx4MjcseDE5CQkJLy8gaCs9S1tpXQorCXJvcgl4MTAseDUsIzEKKwlhbmQJeDE3LHgyNSx4MjQKKwlyb3IJeDkseDIsIzE5CisJYmljCXgxOSx4MjYseDI0CisJcm9yCXgxMSx4MjAsIzI4CisJYWRkCXgyNyx4MjcseDMJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI0LHJvciMxOAorCWVvcgl4MTAseDEwLHg1LHJvciM4CisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjAseDIxCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyNCxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgxMSx4MTEseDIwLHJvciMzNAorCWFkZAl4MjcseDI3LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4OSx4OSx4Mixyb3IjNjEKKwllb3IJeDEwLHgxMCx4NSxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjcseDI3LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyMQkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgxMSx4MjAscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4OSx4OSx4Mixsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDQseDQseDEzCisJYWRkCXgyMyx4MjMseDI3CQkJLy8gZCs9aAorCWFkZAl4MjcseDI3LHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCWFkZAl4NCx4NCx4MTAKKwlhZGQJeDI3LHgyNyx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDQseDQseDkKKwlsZHIJeDksW3NwLCMxNl0KKwlzdHIJeDEyLFtzcCwjOF0KKwlyb3IJeDE2LHgyMywjMTQKKwlhZGQJeDI2LHgyNix4MjgJCQkvLyBoKz1LW2ldCisJcm9yCXgxMSx4NiwjMQorCWFuZAl4MTcseDI0LHgyMworCXJvcgl4MTAseDMsIzE5CisJYmljCXgyOCx4MjUseDIzCisJcm9yCXgxMix4MjcsIzI4CisJYWRkCXgyNix4MjYseDQJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDIzLHJvciMxOAorCWVvcgl4MTEseDExLHg2LHJvciM4CisJb3JyCXgxNyx4MTcseDI4CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgyOCx4MjcseDIwCQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyMyxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXgxMix4MTIseDI3LHJvciMzNAorCWFkZAl4MjYseDI2LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4MTAseDEwLHgzLHJvciM2MQorCWVvcgl4MTEseDExLHg2LGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyNix4MjYseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgxOSx4MTkseDIwCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDEyLHgyNyxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXgxMCx4MTAseDMsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXg1LHg1LHgxNAorCWFkZAl4MjIseDIyLHgyNgkJCS8vIGQrPWgKKwlhZGQJeDI2LHgyNix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDUseDUseDExCisJYWRkCXgyNix4MjYseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXg1LHg1LHgxMAorCWxkcgl4MTAsW3NwLCMyNF0KKwlzdHIJeDEzLFtzcCwjMTZdCisJcm9yCXgxNix4MjIsIzE0CisJYWRkCXgyNSx4MjUseDE5CQkJLy8gaCs9S1tpXQorCXJvcgl4MTIseDcsIzEKKwlhbmQJeDE3LHgyMyx4MjIKKwlyb3IJeDExLHg0LCMxOQorCWJpYwl4MTkseDI0LHgyMgorCXJvcgl4MTMseDI2LCMyOAorCWFkZAl4MjUseDI1LHg1CQkJLy8gaCs9WFtpXQorCWVvcgl4MTYseDE2LHgyMixyb3IjMTgKKwllb3IJeDEyLHgxMix4Nyxyb3IjOAorCW9ycgl4MTcseDE3LHgxOQkJCS8vIENoKGUsZixnKQorCWVvcgl4MTkseDI2LHgyNwkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjIscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4MTMseDEzLHgyNixyb3IjMzQKKwlhZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDExLHgxMSx4NCxyb3IjNjEKKwllb3IJeDEyLHgxMix4Nyxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjUseDI1LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyNwkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgxMyx4MjYscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4MTEseDExLHg0LGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4Nix4Nix4MTUKKwlhZGQJeDIxLHgyMSx4MjUJCQkvLyBkKz1oCisJYWRkCXgyNSx4MjUseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXg2LHg2LHgxMgorCWFkZAl4MjUseDI1LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4Nix4Nix4MTEKKwlsZHIJeDExLFtzcCwjMF0KKwlzdHIJeDE0LFtzcCwjMjRdCisJcm9yCXgxNix4MjEsIzE0CisJYWRkCXgyNCx4MjQseDI4CQkJLy8gaCs9S1tpXQorCXJvcgl4MTMseDgsIzEKKwlhbmQJeDE3LHgyMix4MjEKKwlyb3IJeDEyLHg1LCMxOQorCWJpYwl4MjgseDIzLHgyMQorCXJvcgl4MTQseDI1LCMyOAorCWFkZAl4MjQseDI0LHg2CQkJLy8gaCs9WFtpXQorCWVvcgl4MTYseDE2LHgyMSxyb3IjMTgKKwllb3IJeDEzLHgxMyx4OCxyb3IjOAorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDI1LHgyNgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjEscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4MTQseDE0LHgyNSxyb3IjMzQKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDEyLHgxMix4NSxyb3IjNjEKKwllb3IJeDEzLHgxMyx4OCxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjQseDI0LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MTkseDE5LHgyNgkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgxNCx4MjUscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4MTIseDEyLHg1LGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4Nyx4Nyx4MAorCWFkZAl4MjAseDIwLHgyNAkJCS8vIGQrPWgKKwlhZGQJeDI0LHgyNCx4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDcseDcseDEzCisJYWRkCXgyNCx4MjQseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXg3LHg3LHgxMgorCWxkcgl4MTIsW3NwLCM4XQorCXN0cgl4MTUsW3NwLCMwXQorCXJvcgl4MTYseDIwLCMxNAorCWFkZAl4MjMseDIzLHgxOQkJCS8vIGgrPUtbaV0KKwlyb3IJeDE0LHg5LCMxCisJYW5kCXgxNyx4MjEseDIwCisJcm9yCXgxMyx4NiwjMTkKKwliaWMJeDE5LHgyMix4MjAKKwlyb3IJeDE1LHgyNCwjMjgKKwlhZGQJeDIzLHgyMyx4NwkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjAscm9yIzE4CisJZW9yCXgxNCx4MTQseDkscm9yIzgKKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyNCx4MjUJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDIwLHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDE1LHgxNSx4MjQscm9yIzM0CisJYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgyOCx4MjgseDE5CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXgxMyx4MTMseDYscm9yIzYxCisJZW9yCXgxNCx4MTQseDksbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIzLHgyMyx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDI4LHgyOCx4MjUJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4MTUseDI0LHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDEzLHgxMyx4Nixsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDgseDgseDEKKwlhZGQJeDI3LHgyNyx4MjMJCQkvLyBkKz1oCisJYWRkCXgyMyx4MjMseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXg4LHg4LHgxNAorCWFkZAl4MjMseDIzLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4OCx4OCx4MTMKKwlsZHIJeDEzLFtzcCwjMTZdCisJc3RyCXgwLFtzcCwjOF0KKwlyb3IJeDE2LHgyNywjMTQKKwlhZGQJeDIyLHgyMix4MjgJCQkvLyBoKz1LW2ldCisJcm9yCXgxNSx4MTAsIzEKKwlhbmQJeDE3LHgyMCx4MjcKKwlyb3IJeDE0LHg3LCMxOQorCWJpYwl4MjgseDIxLHgyNworCXJvcgl4MCx4MjMsIzI4CisJYWRkCXgyMix4MjIseDgJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI3LHJvciMxOAorCWVvcgl4MTUseDE1LHgxMCxyb3IjOAorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDIzLHgyNAkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4Mjcscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4MCx4MCx4MjMscm9yIzM0CisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgxOSx4MTkseDI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXgxNCx4MTQseDcscm9yIzYxCisJZW9yCXgxNSx4MTUseDEwLGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyMix4MjIseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgxOSx4MTkseDI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDAseDIzLHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDE0LHgxNCx4Nyxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDkseDkseDIKKwlhZGQJeDI2LHgyNix4MjIJCQkvLyBkKz1oCisJYWRkCXgyMix4MjIseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXg5LHg5LHgxNQorCWFkZAl4MjIseDIyLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4OSx4OSx4MTQKKwlsZHIJeDE0LFtzcCwjMjRdCisJc3RyCXgxLFtzcCwjMTZdCisJcm9yCXgxNix4MjYsIzE0CisJYWRkCXgyMSx4MjEseDE5CQkJLy8gaCs9S1tpXQorCXJvcgl4MCx4MTEsIzEKKwlhbmQJeDE3LHgyNyx4MjYKKwlyb3IJeDE1LHg4LCMxOQorCWJpYwl4MTkseDIwLHgyNgorCXJvcgl4MSx4MjIsIzI4CisJYWRkCXgyMSx4MjEseDkJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI2LHJvciMxOAorCWVvcgl4MCx4MCx4MTEscm9yIzgKKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMix4MjMJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDI2LHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDEseDEseDIyLHJvciMzNAorCWFkZAl4MjEseDIxLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4MTUseDE1LHg4LHJvciM2MQorCWVvcgl4MCx4MCx4MTEsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIxLHgyMSx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDI4LHgyOCx4MjMJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4MSx4MjIscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4MTUseDE1LHg4LGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4MTAseDEwLHgzCisJYWRkCXgyNSx4MjUseDIxCQkJLy8gZCs9aAorCWFkZAl4MjEseDIxLHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCWFkZAl4MTAseDEwLHgwCisJYWRkCXgyMSx4MjEseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXgxMCx4MTAseDE1CisJbGRyCXgxNSxbc3AsIzBdCisJc3RyCXgyLFtzcCwjMjRdCisJcm9yCXgxNix4MjUsIzE0CisJYWRkCXgyMCx4MjAseDI4CQkJLy8gaCs9S1tpXQorCXJvcgl4MSx4MTIsIzEKKwlhbmQJeDE3LHgyNix4MjUKKwlyb3IJeDAseDksIzE5CisJYmljCXgyOCx4MjcseDI1CisJcm9yCXgyLHgyMSwjMjgKKwlhZGQJeDIwLHgyMCx4MTAJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI1LHJvciMxOAorCWVvcgl4MSx4MSx4MTIscm9yIzgKKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyMSx4MjIJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDI1LHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDIseDIseDIxLHJvciMzNAorCWFkZAl4MjAseDIwLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4MCx4MCx4OSxyb3IjNjEKKwllb3IJeDEseDEseDEyLGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyMCx4MjAseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgxOSx4MTkseDIyCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDIseDIxLHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDAseDAseDksbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgxMSx4MTEseDQKKwlhZGQJeDI0LHgyNCx4MjAJCQkvLyBkKz1oCisJYWRkCXgyMCx4MjAseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXgxMSx4MTEseDEKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDExLHgxMSx4MAorCWxkcgl4MCxbc3AsIzhdCisJc3RyCXgzLFtzcCwjMF0KKwlyb3IJeDE2LHgyNCwjMTQKKwlhZGQJeDI3LHgyNyx4MTkJCQkvLyBoKz1LW2ldCisJcm9yCXgyLHgxMywjMQorCWFuZAl4MTcseDI1LHgyNAorCXJvcgl4MSx4MTAsIzE5CisJYmljCXgxOSx4MjYseDI0CisJcm9yCXgzLHgyMCwjMjgKKwlhZGQJeDI3LHgyNyx4MTEJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI0LHJvciMxOAorCWVvcgl4Mix4Mix4MTMscm9yIzgKKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMCx4MjEJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDI0LHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDMseDMseDIwLHJvciMzNAorCWFkZAl4MjcseDI3LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4MSx4MSx4MTAscm9yIzYxCisJZW9yCXgyLHgyLHgxMyxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjcseDI3LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyMQkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHgzLHgyMCxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXgxLHgxLHgxMCxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDEyLHgxMix4NQorCWFkZAl4MjMseDIzLHgyNwkJCS8vIGQrPWgKKwlhZGQJeDI3LHgyNyx4MjgJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgyOCxbeDMwXSwjOAkJLy8gKksrKywgeDE5IGluIG5leHQgcm91bmQKKwlhZGQJeDEyLHgxMix4MgorCWFkZAl4MjcseDI3LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4MTIseDEyLHgxCisJbGRyCXgxLFtzcCwjMTZdCisJc3RyCXg0LFtzcCwjOF0KKwlyb3IJeDE2LHgyMywjMTQKKwlhZGQJeDI2LHgyNix4MjgJCQkvLyBoKz1LW2ldCisJcm9yCXgzLHgxNCwjMQorCWFuZAl4MTcseDI0LHgyMworCXJvcgl4Mix4MTEsIzE5CisJYmljCXgyOCx4MjUseDIzCisJcm9yCXg0LHgyNywjMjgKKwlhZGQJeDI2LHgyNix4MTIJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDIzLHJvciMxOAorCWVvcgl4Myx4Myx4MTQscm9yIzgKKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyNyx4MjAJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDIzLHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDQseDQseDI3LHJvciMzNAorCWFkZAl4MjYseDI2LHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4Mix4Mix4MTEscm9yIzYxCisJZW9yCXgzLHgzLHgxNCxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjYseDI2LHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MTkseDE5LHgyMAkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHg0LHgyNyxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXgyLHgyLHgxMSxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDEzLHgxMyx4NgorCWFkZAl4MjIseDIyLHgyNgkJCS8vIGQrPWgKKwlhZGQJeDI2LHgyNix4MTkJCQkvLyBoKz1NYWooYSxiLGMpCisJbGRyCXgxOSxbeDMwXSwjOAkJLy8gKksrKywgeDI4IGluIG5leHQgcm91bmQKKwlhZGQJeDEzLHgxMyx4MworCWFkZAl4MjYseDI2LHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4MTMseDEzLHgyCisJbGRyCXgyLFtzcCwjMjRdCisJc3RyCXg1LFtzcCwjMTZdCisJcm9yCXgxNix4MjIsIzE0CisJYWRkCXgyNSx4MjUseDE5CQkJLy8gaCs9S1tpXQorCXJvcgl4NCx4MTUsIzEKKwlhbmQJeDE3LHgyMyx4MjIKKwlyb3IJeDMseDEyLCMxOQorCWJpYwl4MTkseDI0LHgyMgorCXJvcgl4NSx4MjYsIzI4CisJYWRkCXgyNSx4MjUseDEzCQkJLy8gaCs9WFtpXQorCWVvcgl4MTYseDE2LHgyMixyb3IjMTgKKwllb3IJeDQseDQseDE1LHJvciM4CisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjYseDI3CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyMixyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXg1LHg1LHgyNixyb3IjMzQKKwlhZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDMseDMseDEyLHJvciM2MQorCWVvcgl4NCx4NCx4MTUsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDI1LHgyNSx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDI4LHgyOCx4MjcJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4NSx4MjYscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4Myx4Myx4MTIsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgxNCx4MTQseDcKKwlhZGQJeDIxLHgyMSx4MjUJCQkvLyBkKz1oCisJYWRkCXgyNSx4MjUseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXgxNCx4MTQseDQKKwlhZGQJeDI1LHgyNSx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDE0LHgxNCx4MworCWxkcgl4Myxbc3AsIzBdCisJc3RyCXg2LFtzcCwjMjRdCisJcm9yCXgxNix4MjEsIzE0CisJYWRkCXgyNCx4MjQseDI4CQkJLy8gaCs9S1tpXQorCXJvcgl4NSx4MCwjMQorCWFuZAl4MTcseDIyLHgyMQorCXJvcgl4NCx4MTMsIzE5CisJYmljCXgyOCx4MjMseDIxCisJcm9yCXg2LHgyNSwjMjgKKwlhZGQJeDI0LHgyNCx4MTQJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDIxLHJvciMxOAorCWVvcgl4NSx4NSx4MCxyb3IjOAorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDI1LHgyNgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjEscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4Nix4Nix4MjUscm9yIzM0CisJYWRkCXgyNCx4MjQseDE3CQkJLy8gaCs9Q2goZSxmLGcpCisJYW5kCXgxOSx4MTkseDI4CQkJLy8gKGJeYykmPShhXmIpCisJZW9yCXg0LHg0LHgxMyxyb3IjNjEKKwllb3IJeDUseDUseDAsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDI0LHgyNCx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDE5LHgxOSx4MjYJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4Nix4MjUscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4NCx4NCx4MTMsbHNyIzYJLy8gc2lnbWExKFhbaSsxNF0pCisJYWRkCXgxNSx4MTUseDgKKwlhZGQJeDIwLHgyMCx4MjQJCQkvLyBkKz1oCisJYWRkCXgyNCx4MjQseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXgxNSx4MTUseDUKKwlhZGQJeDI0LHgyNCx4MTcJCQkvLyBoKz1TaWdtYTAoYSkKKwlhZGQJeDE1LHgxNSx4NAorCWxkcgl4NCxbc3AsIzhdCisJc3RyCXg3LFtzcCwjMF0KKwlyb3IJeDE2LHgyMCwjMTQKKwlhZGQJeDIzLHgyMyx4MTkJCQkvLyBoKz1LW2ldCisJcm9yCXg2LHgxLCMxCisJYW5kCXgxNyx4MjEseDIwCisJcm9yCXg1LHgxNCwjMTkKKwliaWMJeDE5LHgyMix4MjAKKwlyb3IJeDcseDI0LCMyOAorCWFkZAl4MjMseDIzLHgxNQkJCS8vIGgrPVhbaV0KKwllb3IJeDE2LHgxNix4MjAscm9yIzE4CisJZW9yCXg2LHg2LHgxLHJvciM4CisJb3JyCXgxNyx4MTcseDE5CQkJLy8gQ2goZSxmLGcpCisJZW9yCXgxOSx4MjQseDI1CQkJLy8gYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWVvcgl4MTYseDE2LHgyMCxyb3IjNDEJLy8gU2lnbWExKGUpCisJZW9yCXg3LHg3LHgyNCxyb3IjMzQKKwlhZGQJeDIzLHgyMyx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDI4LHgyOCx4MTkJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDUseDUseDE0LHJvciM2MQorCWVvcgl4Nix4Nix4MSxsc3IjNwkvLyBzaWdtYTAoWFtpKzFdKQorCWFkZAl4MjMseDIzLHgxNgkJCS8vIGgrPVNpZ21hMShlKQorCWVvcgl4MjgseDI4LHgyNQkJCS8vIE1haihhLGIsYykKKwllb3IJeDE3LHg3LHgyNCxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXg1LHg1LHgxNCxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDAseDAseDkKKwlhZGQJeDI3LHgyNyx4MjMJCQkvLyBkKz1oCisJYWRkCXgyMyx4MjMseDI4CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MjgsW3gzMF0sIzgJCS8vICpLKyssIHgxOSBpbiBuZXh0IHJvdW5kCisJYWRkCXgwLHgwLHg2CisJYWRkCXgyMyx4MjMseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXgwLHgwLHg1CisJbGRyCXg1LFtzcCwjMTZdCisJc3RyCXg4LFtzcCwjOF0KKwlyb3IJeDE2LHgyNywjMTQKKwlhZGQJeDIyLHgyMix4MjgJCQkvLyBoKz1LW2ldCisJcm9yCXg3LHgyLCMxCisJYW5kCXgxNyx4MjAseDI3CisJcm9yCXg2LHgxNSwjMTkKKwliaWMJeDI4LHgyMSx4MjcKKwlyb3IJeDgseDIzLCMyOAorCWFkZAl4MjIseDIyLHgwCQkJLy8gaCs9WFtpXQorCWVvcgl4MTYseDE2LHgyNyxyb3IjMTgKKwllb3IJeDcseDcseDIscm9yIzgKKwlvcnIJeDE3LHgxNyx4MjgJCQkvLyBDaChlLGYsZykKKwllb3IJeDI4LHgyMyx4MjQJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDI3LHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDgseDgseDIzLHJvciMzNAorCWFkZAl4MjIseDIyLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MTkseDE5LHgyOAkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4Nix4Nix4MTUscm9yIzYxCisJZW9yCXg3LHg3LHgyLGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyMix4MjIseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgxOSx4MTkseDI0CQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDgseDIzLHJvciMzOQkvLyBTaWdtYTAoYSkKKwllb3IJeDYseDYseDE1LGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4MSx4MSx4MTAKKwlhZGQJeDI2LHgyNix4MjIJCQkvLyBkKz1oCisJYWRkCXgyMix4MjIseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXgxLHgxLHg3CisJYWRkCXgyMix4MjIseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXgxLHgxLHg2CisJbGRyCXg2LFtzcCwjMjRdCisJc3RyCXg5LFtzcCwjMTZdCisJcm9yCXgxNix4MjYsIzE0CisJYWRkCXgyMSx4MjEseDE5CQkJLy8gaCs9S1tpXQorCXJvcgl4OCx4MywjMQorCWFuZAl4MTcseDI3LHgyNgorCXJvcgl4Nyx4MCwjMTkKKwliaWMJeDE5LHgyMCx4MjYKKwlyb3IJeDkseDIyLCMyOAorCWFkZAl4MjEseDIxLHgxCQkJLy8gaCs9WFtpXQorCWVvcgl4MTYseDE2LHgyNixyb3IjMTgKKwllb3IJeDgseDgseDMscm9yIzgKKwlvcnIJeDE3LHgxNyx4MTkJCQkvLyBDaChlLGYsZykKKwllb3IJeDE5LHgyMix4MjMJCQkvLyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJZW9yCXgxNix4MTYseDI2LHJvciM0MQkvLyBTaWdtYTEoZSkKKwllb3IJeDkseDkseDIyLHJvciMzNAorCWFkZAl4MjEseDIxLHgxNwkJCS8vIGgrPUNoKGUsZixnKQorCWFuZAl4MjgseDI4LHgxOQkJCS8vIChiXmMpJj0oYV5iKQorCWVvcgl4Nyx4Nyx4MCxyb3IjNjEKKwllb3IJeDgseDgseDMsbHNyIzcJLy8gc2lnbWEwKFhbaSsxXSkKKwlhZGQJeDIxLHgyMSx4MTYJCQkvLyBoKz1TaWdtYTEoZSkKKwllb3IJeDI4LHgyOCx4MjMJCQkvLyBNYWooYSxiLGMpCisJZW9yCXgxNyx4OSx4MjIscm9yIzM5CS8vIFNpZ21hMChhKQorCWVvcgl4Nyx4Nyx4MCxsc3IjNgkvLyBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJeDIseDIseDExCisJYWRkCXgyNSx4MjUseDIxCQkJLy8gZCs9aAorCWFkZAl4MjEseDIxLHgyOAkJCS8vIGgrPU1haihhLGIsYykKKwlsZHIJeDI4LFt4MzBdLCM4CQkvLyAqSysrLCB4MTkgaW4gbmV4dCByb3VuZAorCWFkZAl4Mix4Mix4OAorCWFkZAl4MjEseDIxLHgxNwkJCS8vIGgrPVNpZ21hMChhKQorCWFkZAl4Mix4Mix4NworCWxkcgl4Nyxbc3AsIzBdCisJc3RyCXgxMCxbc3AsIzI0XQorCXJvcgl4MTYseDI1LCMxNAorCWFkZAl4MjAseDIwLHgyOAkJCS8vIGgrPUtbaV0KKwlyb3IJeDkseDQsIzEKKwlhbmQJeDE3LHgyNix4MjUKKwlyb3IJeDgseDEsIzE5CisJYmljCXgyOCx4MjcseDI1CisJcm9yCXgxMCx4MjEsIzI4CisJYWRkCXgyMCx4MjAseDIJCQkvLyBoKz1YW2ldCisJZW9yCXgxNix4MTYseDI1LHJvciMxOAorCWVvcgl4OSx4OSx4NCxyb3IjOAorCW9ycgl4MTcseDE3LHgyOAkJCS8vIENoKGUsZixnKQorCWVvcgl4MjgseDIxLHgyMgkJCS8vIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwllb3IJeDE2LHgxNix4MjUscm9yIzQxCS8vIFNpZ21hMShlKQorCWVvcgl4MTAseDEwLHgyMSxyb3IjMzQKKwlhZGQJeDIwLHgyMCx4MTcJCQkvLyBoKz1DaChlLGYsZykKKwlhbmQJeDE5LHgxOSx4MjgJCQkvLyAoYl5jKSY9KGFeYikKKwllb3IJeDgseDgseDEscm9yIzYxCisJZW9yCXg5LHg5LHg0LGxzciM3CS8vIHNpZ21hMChYW2krMV0pCisJYWRkCXgyMCx4MjAseDE2CQkJLy8gaCs9U2lnbWExKGUpCisJZW9yCXgxOSx4MTkseDIyCQkJLy8gTWFqKGEsYixjKQorCWVvcgl4MTcseDEwLHgyMSxyb3IjMzkJLy8gU2lnbWEwKGEpCisJZW9yCXg4LHg4LHgxLGxzciM2CS8vIHNpZ21hMShYW2krMTRdKQorCWFkZAl4Myx4Myx4MTIKKwlhZGQJeDI0LHgyNCx4MjAJCQkvLyBkKz1oCisJYWRkCXgyMCx4MjAseDE5CQkJLy8gaCs9TWFqKGEsYixjKQorCWxkcgl4MTksW3gzMF0sIzgJCS8vICpLKyssIHgyOCBpbiBuZXh0IHJvdW5kCisJYWRkCXgzLHgzLHg5CisJYWRkCXgyMCx4MjAseDE3CQkJLy8gaCs9U2lnbWEwKGEpCisJYWRkCXgzLHgzLHg4CisJY2Juegl4MTksLkxvb3BfMTZfeHgKKworCWxkcAl4MCx4MixbeDI5LCM5Nl0KKwlsZHIJeDEsW3gyOSwjMTEyXQorCXN1Ygl4MzAseDMwLCM2NDgJCS8vIHJld2luZAorCisJbGRwCXgzLHg0LFt4MF0KKwlsZHAJeDUseDYsW3gwLCMyKjhdCisJYWRkCXgxLHgxLCMxNCo4CQkJLy8gYWR2YW5jZSBpbnB1dCBwb2ludGVyCisJbGRwCXg3LHg4LFt4MCwjNCo4XQorCWFkZAl4MjAseDIwLHgzCisJbGRwCXg5LHgxMCxbeDAsIzYqOF0KKwlhZGQJeDIxLHgyMSx4NAorCWFkZAl4MjIseDIyLHg1CisJYWRkCXgyMyx4MjMseDYKKwlzdHAJeDIwLHgyMSxbeDBdCisJYWRkCXgyNCx4MjQseDcKKwlhZGQJeDI1LHgyNSx4OAorCXN0cAl4MjIseDIzLFt4MCwjMio4XQorCWFkZAl4MjYseDI2LHg5CisJYWRkCXgyNyx4MjcseDEwCisJY21wCXgxLHgyCisJc3RwCXgyNCx4MjUsW3gwLCM0KjhdCisJc3RwCXgyNix4MjcsW3gwLCM2KjhdCisJYi5uZQkuTG9vcAorCisJbGRwCXgxOSx4MjAsW3gyOSwjMTZdCisJYWRkCXNwLHNwLCM0KjgKKwlsZHAJeDIxLHgyMixbeDI5LCMzMl0KKwlsZHAJeDIzLHgyNCxbeDI5LCM0OF0KKwlsZHAJeDI1LHgyNixbeDI5LCM2NF0KKwlsZHAJeDI3LHgyOCxbeDI5LCM4MF0KKwlsZHAJeDI5LHgzMCxbc3BdLCMxMjgKKwlyZXQKKy5zaXplCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyLC4tc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKworLmFsaWduCTYKKy50eXBlCS5MSzUxMiwlb2JqZWN0CisuTEs1MTI6CisucXVhZAkweDQyOGEyZjk4ZDcyOGFlMjIsMHg3MTM3NDQ5MTIzZWY2NWNkCisucXVhZAkweGI1YzBmYmNmZWM0ZDNiMmYsMHhlOWI1ZGJhNTgxODlkYmJjCisucXVhZAkweDM5NTZjMjViZjM0OGI1MzgsMHg1OWYxMTFmMWI2MDVkMDE5CisucXVhZAkweDkyM2Y4MmE0YWYxOTRmOWIsMHhhYjFjNWVkNWRhNmQ4MTE4CisucXVhZAkweGQ4MDdhYTk4YTMwMzAyNDIsMHgxMjgzNWIwMTQ1NzA2ZmJlCisucXVhZAkweDI0MzE4NWJlNGVlNGIyOGMsMHg1NTBjN2RjM2Q1ZmZiNGUyCisucXVhZAkweDcyYmU1ZDc0ZjI3Yjg5NmYsMHg4MGRlYjFmZTNiMTY5NmIxCisucXVhZAkweDliZGMwNmE3MjVjNzEyMzUsMHhjMTliZjE3NGNmNjkyNjk0CisucXVhZAkweGU0OWI2OWMxOWVmMTRhZDIsMHhlZmJlNDc4NjM4NGYyNWUzCisucXVhZAkweDBmYzE5ZGM2OGI4Y2Q1YjUsMHgyNDBjYTFjYzc3YWM5YzY1CisucXVhZAkweDJkZTkyYzZmNTkyYjAyNzUsMHg0YTc0ODRhYTZlYTZlNDgzCisucXVhZAkweDVjYjBhOWRjYmQ0MWZiZDQsMHg3NmY5ODhkYTgzMTE1M2I1CisucXVhZAkweDk4M2U1MTUyZWU2NmRmYWIsMHhhODMxYzY2ZDJkYjQzMjEwCisucXVhZAkweGIwMDMyN2M4OThmYjIxM2YsMHhiZjU5N2ZjN2JlZWYwZWU0CisucXVhZAkweGM2ZTAwYmYzM2RhODhmYzIsMHhkNWE3OTE0NzkzMGFhNzI1CisucXVhZAkweDA2Y2E2MzUxZTAwMzgyNmYsMHgxNDI5Mjk2NzBhMGU2ZTcwCisucXVhZAkweDI3YjcwYTg1NDZkMjJmZmMsMHgyZTFiMjEzODVjMjZjOTI2CisucXVhZAkweDRkMmM2ZGZjNWFjNDJhZWQsMHg1MzM4MGQxMzlkOTViM2RmCisucXVhZAkweDY1MGE3MzU0OGJhZjYzZGUsMHg3NjZhMGFiYjNjNzdiMmE4CisucXVhZAkweDgxYzJjOTJlNDdlZGFlZTYsMHg5MjcyMmM4NTE0ODIzNTNiCisucXVhZAkweGEyYmZlOGExNGNmMTAzNjQsMHhhODFhNjY0YmJjNDIzMDAxCisucXVhZAkweGMyNGI4YjcwZDBmODk3OTEsMHhjNzZjNTFhMzA2NTRiZTMwCisucXVhZAkweGQxOTJlODE5ZDZlZjUyMTgsMHhkNjk5MDYyNDU1NjVhOTEwCisucXVhZAkweGY0MGUzNTg1NTc3MTIwMmEsMHgxMDZhYTA3MDMyYmJkMWI4CisucXVhZAkweDE5YTRjMTE2YjhkMmQwYzgsMHgxZTM3NmMwODUxNDFhYjUzCisucXVhZAkweDI3NDg3NzRjZGY4ZWViOTksMHgzNGIwYmNiNWUxOWI0OGE4CisucXVhZAkweDM5MWMwY2IzYzVjOTVhNjMsMHg0ZWQ4YWE0YWUzNDE4YWNiCisucXVhZAkweDViOWNjYTRmNzc2M2UzNzMsMHg2ODJlNmZmM2Q2YjJiOGEzCisucXVhZAkweDc0OGY4MmVlNWRlZmIyZmMsMHg3OGE1NjM2ZjQzMTcyZjYwCisucXVhZAkweDg0Yzg3ODE0YTFmMGFiNzIsMHg4Y2M3MDIwODFhNjQzOWVjCisucXVhZAkweDkwYmVmZmZhMjM2MzFlMjgsMHhhNDUwNmNlYmRlODJiZGU5CisucXVhZAkweGJlZjlhM2Y3YjJjNjc5MTUsMHhjNjcxNzhmMmUzNzI1MzJiCisucXVhZAkweGNhMjczZWNlZWEyNjYxOWMsMHhkMTg2YjhjNzIxYzBjMjA3CisucXVhZAkweGVhZGE3ZGQ2Y2RlMGViMWUsMHhmNTdkNGY3ZmVlNmVkMTc4CisucXVhZAkweDA2ZjA2N2FhNzIxNzZmYmEsMHgwYTYzN2RjNWEyYzg5OGE2CisucXVhZAkweDExM2Y5ODA0YmVmOTBkYWUsMHgxYjcxMGIzNTEzMWM0NzFiCisucXVhZAkweDI4ZGI3N2Y1MjMwNDdkODQsMHgzMmNhYWI3YjQwYzcyNDkzCisucXVhZAkweDNjOWViZTBhMTVjOWJlYmMsMHg0MzFkNjdjNDljMTAwZDRjCisucXVhZAkweDRjYzVkNGJlY2IzZTQyYjYsMHg1OTdmMjk5Y2ZjNjU3ZTJhCisucXVhZAkweDVmY2I2ZmFiM2FkNmZhZWMsMHg2YzQ0MTk4YzRhNDc1ODE3CisucXVhZAkwCS8vIHRlcm1pbmF0b3IKKy5zaXplCS5MSzUxMiwuLS5MSzUxMgorI2lmbmRlZglfX0tFUk5FTF9fCisuYWxpZ24JMworLkxPUEVOU1NMX2FybWNhcF9QOgorIyBpZmRlZglfX0lMUDMyX18KKy5sb25nCU9QRU5TU0xfYXJtY2FwX1AtLgorIyBlbHNlCisucXVhZAlPUEVOU1NMX2FybWNhcF9QLS4KKyMgZW5kaWYKKyNlbmRpZgorLmJ5dGUJODMsNzIsNjUsNTMsNDksNTAsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiw2NSw4Miw3NywxMTgsNTYsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTIKKy5hbGlnbgkyCisjaWZuZGVmCV9fS0VSTkVMX18KKy5jb21tCU9QRU5TU0xfYXJtY2FwX1AsNCw0CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hcm0vY3J5cHRvL2NoYWNoYS9jaGFjaGEtYXJtdjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9jaGFjaGEvY2hhY2hhLWFybXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0OGQxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9jaGFjaGEvY2hhY2hhLWFybXY0LlMKQEAgLTAsMCArMSwxNDc3IEBACisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKworQCBTaWxlbmNlIEFSTXY4IGRlcHJlY2F0ZWQgSVQgaW5zdHJ1Y3Rpb24gd2FybmluZ3MuIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IGJvdGgKK0AgQVJNdjcgYW5kIEFSTXY4IHByb2Nlc3NvcnMgYW5kIGRvZXMgbm90IHVzZSBBUk12OCBpbnN0cnVjdGlvbnMuCisuYXJjaAlhcm12Ny1hCisKKy50ZXh0CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKy5zeW50YXgJdW5pZmllZAorI2VuZGlmCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorLnRodW1iCisjZWxzZQorLmNvZGUJMzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgbGRyaHNiCWxkcmJocworI2VuZGlmCisKKy5hbGlnbgk1CisuTHNpZ21hOgorLmxvbmcJMHg2MTcwNzg2NSwweDMzMjA2NDZlLDB4Nzk2MjJkMzIsMHg2YjIwNjU3NAlAIGVuZGlhbi1uZXV0cmFsCisuTG9uZToKKy5sb25nCTEsMCwwLDAKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisuTE9QRU5TU0xfYXJtY2FwOgorLndvcmQJT1BFTlNTTF9hcm1jYXBfUC0uTENoYUNoYTIwX2N0cjMyCisjZWxzZQorLndvcmQJLTEKKyNlbmRpZgorCisuZ2xvYmwJQ2hhQ2hhMjBfY3RyMzIKKy5oaWRkZW4JQ2hhQ2hhMjBfY3RyMzIKKy50eXBlCUNoYUNoYTIwX2N0cjMyLCVmdW5jdGlvbgorLmFsaWduCTUKK0NoYUNoYTIwX2N0cjMyOgorLkxDaGFDaGEyMF9jdHIzMjoKKwlsZHIJcjEyLFtzcCwjMF0JCUAgcHVsbCBwb2ludGVyIHRvIGNvdW50ZXIgYW5kIG5vbmNlCisJc3RtZGIJc3AhLHtyMCxyMSxyMixyNC1yMTEsbHJ9CisjaWYgX19BUk1fQVJDSF9fPDcgJiYgIWRlZmluZWQoX190aHVtYjJfXykKKwlzdWIJcjE0LHBjLCMxNgkJQCBDaGFDaGEyMF9jdHIzMgorI2Vsc2UKKwlhZHIJcjE0LC5MQ2hhQ2hhMjBfY3RyMzIKKyNlbmRpZgorCWNtcAlyMiwjMAkJCUAgbGVuPT0wPworI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJZXEKKyNlbmRpZgorCWFkZGVxCXNwLHNwLCM0KjMKKwliZXEJLkxub19kYXRhCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworCWNtcAlyMiwjMTkyCQkJQCB0ZXN0IGxlbgorCWJscwkuTHNob3J0CisJbGRyCXI0LFtyMTQsIy0zMl0KKwlsZHIJcjQsW3IxNCxyNF0KKyMgaWZkZWYJX19BUFBMRV9fCisJbGRyCXI0LFtyNF0KKyMgZW5kaWYKKwl0c3QJcjQsI0FSTVY3X05FT04KKwlibmUJLkxDaGFDaGEyMF9uZW9uCisuTHNob3J0OgorI2VuZGlmCisJbGRtaWEJcjEyLHtyNCxyNSxyNixyN30JCUAgbG9hZCBjb3VudGVyIGFuZCBub25jZQorCXN1YglzcCxzcCwjNCooMTYpCQlAIG9mZi1sb2FkIGFyZWEKKwlzdWIJcjE0LHIxNCwjNjQJCUAgLkxzaWdtYQorCXN0bWRiCXNwISx7cjQscjUscjYscjd9CQlAIGNvcHkgY291bnRlciBhbmQgbm9uY2UKKwlsZG1pYQlyMyx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0JCUAgbG9hZCBrZXkKKwlsZG1pYQlyMTQse3IwLHIxLHIyLHIzfQkJQCBsb2FkIHNpZ21hCisJc3RtZGIJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQkJQCBjb3B5IGtleQorCXN0bWRiCXNwISx7cjAscjEscjIscjN9CQlAIGNvcHkgc2lnbWEKKwlzdHIJcjEwLFtzcCwjNCooMTYrMTApXQlAIG9mZi1sb2FkICJyeCIKKwlzdHIJcjExLFtzcCwjNCooMTYrMTEpXQlAIG9mZi1sb2FkICJyeCIKKwliCS5Mb29wX291dGVyX2VudGVyCisKKy5hbGlnbgk0CisuTG9vcF9vdXRlcjoKKwlsZG1pYQlzcCx7cjAscjEscjIscjMscjQscjUscjYscjcscjgscjl9CQlAIGxvYWQga2V5IG1hdGVyaWFsCisJc3RyCXIxMSxbc3AsIzQqKDMyKzIpXQlAIHNhdmUgbGVuCisJc3RyCXIxMiwgIFtzcCwjNCooMzIrMSldCUAgc2F2ZSBpbnAKKwlzdHIJcjE0LCAgW3NwLCM0KigzMiswKV0JQCBzYXZlIG91dAorLkxvb3Bfb3V0ZXJfZW50ZXI6CisJbGRyCXIxMSwgW3NwLCM0KigxNSldCisJbGRyCXIxMixbc3AsIzQqKDEyKV0JQCBtb2R1bG8tc2NoZWR1bGVkIGxvYWQKKwlsZHIJcjEwLCBbc3AsIzQqKDEzKV0KKwlsZHIJcjE0LFtzcCwjNCooMTQpXQorCXN0cglyMTEsIFtzcCwjNCooMTYrMTUpXQorCW1vdglyMTEsIzEwCisJYgkuTG9vcAorCisuYWxpZ24JNAorLkxvb3A6CisJc3VicwlyMTEscjExLCMxCisJYWRkCXIwLHIwLHI0CisJbW92CXIxMixyMTIscm9yIzE2CisJYWRkCXIxLHIxLHI1CisJbW92CXIxMCxyMTAscm9yIzE2CisJZW9yCXIxMixyMTIscjAscm9yIzE2CisJZW9yCXIxMCxyMTAscjEscm9yIzE2CisJYWRkCXI4LHI4LHIxMgorCW1vdglyNCxyNCxyb3IjMjAKKwlhZGQJcjkscjkscjEwCisJbW92CXI1LHI1LHJvciMyMAorCWVvcglyNCxyNCxyOCxyb3IjMjAKKwllb3IJcjUscjUscjkscm9yIzIwCisJYWRkCXIwLHIwLHI0CisJbW92CXIxMixyMTIscm9yIzI0CisJYWRkCXIxLHIxLHI1CisJbW92CXIxMCxyMTAscm9yIzI0CisJZW9yCXIxMixyMTIscjAscm9yIzI0CisJZW9yCXIxMCxyMTAscjEscm9yIzI0CisJYWRkCXI4LHI4LHIxMgorCW1vdglyNCxyNCxyb3IjMjUKKwlhZGQJcjkscjkscjEwCisJbW92CXI1LHI1LHJvciMyNQorCXN0cglyMTAsW3NwLCM0KigxNisxMyldCisJbGRyCXIxMCxbc3AsIzQqKDE2KzE1KV0KKwllb3IJcjQscjQscjgscm9yIzI1CisJZW9yCXI1LHI1LHI5LHJvciMyNQorCXN0cglyOCxbc3AsIzQqKDE2KzgpXQorCWxkcglyOCxbc3AsIzQqKDE2KzEwKV0KKwlhZGQJcjIscjIscjYKKwltb3YJcjE0LHIxNCxyb3IjMTYKKwlzdHIJcjksW3NwLCM0KigxNis5KV0KKwlsZHIJcjksW3NwLCM0KigxNisxMSldCisJYWRkCXIzLHIzLHI3CisJbW92CXIxMCxyMTAscm9yIzE2CisJZW9yCXIxNCxyMTQscjIscm9yIzE2CisJZW9yCXIxMCxyMTAscjMscm9yIzE2CisJYWRkCXI4LHI4LHIxNAorCW1vdglyNixyNixyb3IjMjAKKwlhZGQJcjkscjkscjEwCisJbW92CXI3LHI3LHJvciMyMAorCWVvcglyNixyNixyOCxyb3IjMjAKKwllb3IJcjcscjcscjkscm9yIzIwCisJYWRkCXIyLHIyLHI2CisJbW92CXIxNCxyMTQscm9yIzI0CisJYWRkCXIzLHIzLHI3CisJbW92CXIxMCxyMTAscm9yIzI0CisJZW9yCXIxNCxyMTQscjIscm9yIzI0CisJZW9yCXIxMCxyMTAscjMscm9yIzI0CisJYWRkCXI4LHI4LHIxNAorCW1vdglyNixyNixyb3IjMjUKKwlhZGQJcjkscjkscjEwCisJbW92CXI3LHI3LHJvciMyNQorCWVvcglyNixyNixyOCxyb3IjMjUKKwllb3IJcjcscjcscjkscm9yIzI1CisJYWRkCXIwLHIwLHI1CisJbW92CXIxMCxyMTAscm9yIzE2CisJYWRkCXIxLHIxLHI2CisJbW92CXIxMixyMTIscm9yIzE2CisJZW9yCXIxMCxyMTAscjAscm9yIzE2CisJZW9yCXIxMixyMTIscjEscm9yIzE2CisJYWRkCXI4LHI4LHIxMAorCW1vdglyNSxyNSxyb3IjMjAKKwlhZGQJcjkscjkscjEyCisJbW92CXI2LHI2LHJvciMyMAorCWVvcglyNSxyNSxyOCxyb3IjMjAKKwllb3IJcjYscjYscjkscm9yIzIwCisJYWRkCXIwLHIwLHI1CisJbW92CXIxMCxyMTAscm9yIzI0CisJYWRkCXIxLHIxLHI2CisJbW92CXIxMixyMTIscm9yIzI0CisJZW9yCXIxMCxyMTAscjAscm9yIzI0CisJZW9yCXIxMixyMTIscjEscm9yIzI0CisJYWRkCXI4LHI4LHIxMAorCW1vdglyNSxyNSxyb3IjMjUKKwlzdHIJcjEwLFtzcCwjNCooMTYrMTUpXQorCWxkcglyMTAsW3NwLCM0KigxNisxMyldCisJYWRkCXI5LHI5LHIxMgorCW1vdglyNixyNixyb3IjMjUKKwllb3IJcjUscjUscjgscm9yIzI1CisJZW9yCXI2LHI2LHI5LHJvciMyNQorCXN0cglyOCxbc3AsIzQqKDE2KzEwKV0KKwlsZHIJcjgsW3NwLCM0KigxNis4KV0KKwlhZGQJcjIscjIscjcKKwltb3YJcjEwLHIxMCxyb3IjMTYKKwlzdHIJcjksW3NwLCM0KigxNisxMSldCisJbGRyCXI5LFtzcCwjNCooMTYrOSldCisJYWRkCXIzLHIzLHI0CisJbW92CXIxNCxyMTQscm9yIzE2CisJZW9yCXIxMCxyMTAscjIscm9yIzE2CisJZW9yCXIxNCxyMTQscjMscm9yIzE2CisJYWRkCXI4LHI4LHIxMAorCW1vdglyNyxyNyxyb3IjMjAKKwlhZGQJcjkscjkscjE0CisJbW92CXI0LHI0LHJvciMyMAorCWVvcglyNyxyNyxyOCxyb3IjMjAKKwllb3IJcjQscjQscjkscm9yIzIwCisJYWRkCXIyLHIyLHI3CisJbW92CXIxMCxyMTAscm9yIzI0CisJYWRkCXIzLHIzLHI0CisJbW92CXIxNCxyMTQscm9yIzI0CisJZW9yCXIxMCxyMTAscjIscm9yIzI0CisJZW9yCXIxNCxyMTQscjMscm9yIzI0CisJYWRkCXI4LHI4LHIxMAorCW1vdglyNyxyNyxyb3IjMjUKKwlhZGQJcjkscjkscjE0CisJbW92CXI0LHI0LHJvciMyNQorCWVvcglyNyxyNyxyOCxyb3IjMjUKKwllb3IJcjQscjQscjkscm9yIzI1CisJYm5lCS5Mb29wCisKKwlsZHIJcjExLFtzcCwjNCooMzIrMildCUAgbG9hZCBsZW4KKworCXN0cglyOCwgW3NwLCM0KigxNis4KV0JQCBtb2R1bG8tc2NoZWR1bGVkIHN0b3JlCisJc3RyCXI5LCBbc3AsIzQqKDE2KzkpXQorCXN0cglyMTIsW3NwLCM0KigxNisxMildCisJc3RyCXIxMCwgW3NwLCM0KigxNisxMyldCisJc3RyCXIxNCxbc3AsIzQqKDE2KzE0KV0KKworCUAgYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGZpcnN0IGhhbGYgb2YgNTEyLWJpdCByZXN1bHQgaW4KKwlAIHJ4IGFuZCBzZWNvbmQgaGFsZiBhdCBzcCs0KigxNis4KQorCisJY21wCXIxMSwjNjQJCUAgZG9uZSB5ZXQ/CisjaWZkZWYJX190aHVtYjJfXworCWl0ZXRlCWxvCisjZW5kaWYKKwlhZGRsbwlyMTIsc3AsIzQqKDApCQlAIHNob3J0Y3V0IG9yIC4uLgorCWxkcmhzCXIxMixbc3AsIzQqKDMyKzEpXQlAIC4uLiBsb2FkIGlucAorCWFkZGxvCXIxNCxzcCwjNCooMCkJCUAgc2hvcnRjdXQgb3IgLi4uCisJbGRyaHMJcjE0LFtzcCwjNCooMzIrMCldCUAgLi4uIGxvYWQgb3V0CisKKwlsZHIJcjgsW3NwLCM0KigwKV0JQCBsb2FkIGtleSBtYXRlcmlhbAorCWxkcglyOSxbc3AsIzQqKDEpXQorCisjaWYgX19BUk1fQVJDSF9fPj02IHx8ICFkZWZpbmVkKF9fQVJNRUJfXykKKyMgaWYgX19BUk1fQVJDSF9fPDcKKwlvcnIJcjEwLHIxMixyMTQKKwl0c3QJcjEwLCMzCQlAIGFyZSBpbnB1dCBhbmQgb3V0cHV0IGFsaWduZWQ/CisJbGRyCXIxMCxbc3AsIzQqKDIpXQorCWJuZQkuTHVuYWxpZ25lZAorCWNtcAlyMTEsIzY0CQlAIHJlc3RvcmUgZmxhZ3MKKyMgZWxzZQorCWxkcglyMTAsW3NwLCM0KigyKV0KKyMgZW5kaWYKKwlsZHIJcjExLFtzcCwjNCooMyldCisKKwlhZGQJcjAscjAscjgJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyMSxyMSxyOQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlsZHJocwlyOSxbcjEyLCMtMTJdCisKKwlhZGQJcjIscjIscjEwCisJYWRkCXIzLHIzLHIxMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjEwLFtyMTIsIy04XQorCWxkcmhzCXIxMSxbcjEyLCMtNF0KKyMgaWYgX19BUk1fQVJDSF9fPj02ICYmIGRlZmluZWQoX19BUk1FQl9fKQorCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworIyBlbmRpZgorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjAscjAscjgJQCB4b3Igd2l0aCBpbnB1dAorCWVvcmhzCXIxLHIxLHI5CisJYWRkCXI4LHNwLCM0Kig0KQorCXN0cglyMCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwllb3JocwlyMixyMixyMTAKKwllb3JocwlyMyxyMyxyMTEKKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCXN0cglyMSxbcjE0LCMtMTJdCisJc3RyCXIyLFtyMTQsIy04XQorCXN0cglyMyxbcjE0LCMtNF0KKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI1LHI1LHI5CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJocwlyOCxbcjEyXSwjMTYJCUAgbG9hZCBpbnB1dAorCWxkcmhzCXI5LFtyMTIsIy0xMl0KKwlhZGQJcjYscjYscjEwCisJYWRkCXI3LHI3LHIxMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjEwLFtyMTIsIy04XQorCWxkcmhzCXIxMSxbcjEyLCMtNF0KKyMgaWYgX19BUk1fQVJDSF9fPj02ICYmIGRlZmluZWQoX19BUk1FQl9fKQorCXJldglyNCxyNAorCXJldglyNSxyNQorCXJldglyNixyNgorCXJldglyNyxyNworIyBlbmRpZgorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjQscjQscjgKKwllb3JocwlyNSxyNSxyOQorCWFkZAlyOCxzcCwjNCooOCkKKwlzdHIJcjQsW3IxNF0sIzE2CQlAIHN0b3JlIG91dHB1dAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjYscjYscjEwCisJZW9yaHMJcjcscjcscjExCisJc3RyCXI1LFtyMTQsIy0xMl0KKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCXN0cglyNixbcjE0LCMtOF0KKwlhZGQJcjAsc3AsIzQqKDE2KzgpCisJc3RyCXI3LFtyMTQsIy00XQorCisJbGRtaWEJcjAse3IwLHIxLHIyLHIzLHI0LHI1LHI2LHI3fQlAIGxvYWQgc2Vjb25kIGhhbGYKKworCWFkZAlyMCxyMCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXIxLHIxLHI5CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJocwlyOCxbcjEyXSwjMTYJCUAgbG9hZCBpbnB1dAorCWxkcmhzCXI5LFtyMTIsIy0xMl0KKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAloaQorIyBlbmRpZgorCXN0cmhpCXIxMCxbc3AsIzQqKDE2KzEwKV0JQCBjb3B5ICJyeCIgd2hpbGUgYXQgaXQKKwlzdHJoaQlyMTEsW3NwLCM0KigxNisxMSldCUAgY29weSAicngiIHdoaWxlIGF0IGl0CisJYWRkCXIyLHIyLHIxMAorCWFkZAlyMyxyMyxyMTEKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzCXIxMCxbcjEyLCMtOF0KKwlsZHJocwlyMTEsW3IxMiwjLTRdCisjIGlmIF9fQVJNX0FSQ0hfXz49NiAmJiBkZWZpbmVkKF9fQVJNRUJfXykKKwlyZXYJcjAscjAKKwlyZXYJcjEscjEKKwlyZXYJcjIscjIKKwlyZXYJcjMscjMKKyMgZW5kaWYKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWVvcmhzCXIwLHIwLHI4CisJZW9yaHMJcjEscjEscjkKKwlhZGQJcjgsc3AsIzQqKDEyKQorCXN0cglyMCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwllb3JocwlyMixyMixyMTAKKwllb3JocwlyMyxyMyxyMTEKKwlzdHIJcjEsW3IxNCwjLTEyXQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJc3RyCXIyLFtyMTQsIy04XQorCXN0cglyMyxbcjE0LCMtNF0KKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI1LHI1LHI5CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaGkKKyMgZW5kaWYKKwlhZGRoaQlyOCxyOCwjMQkJQCBuZXh0IGNvdW50ZXIgdmFsdWUKKwlzdHJoaQlyOCxbc3AsIzQqKDEyKV0JQCBzYXZlIG5leHQgY291bnRlciB2YWx1ZQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHMJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlsZHJocwlyOSxbcjEyLCMtMTJdCisJYWRkCXI2LHI2LHIxMAorCWFkZAlyNyxyNyxyMTEKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzCXIxMCxbcjEyLCMtOF0KKwlsZHJocwlyMTEsW3IxMiwjLTRdCisjIGlmIF9fQVJNX0FSQ0hfXz49NiAmJiBkZWZpbmVkKF9fQVJNRUJfXykKKwlyZXYJcjQscjQKKwlyZXYJcjUscjUKKwlyZXYJcjYscjYKKwlyZXYJcjcscjcKKyMgZW5kaWYKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWVvcmhzCXI0LHI0LHI4CisJZW9yaHMJcjUscjUscjkKKyMgaWZkZWYJX190aHVtYjJfXworCWl0CW5lCisjIGVuZGlmCisJbGRybmUJcjgsW3NwLCM0KigzMisyKV0JQCByZS1sb2FkIGxlbgorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJZW9yaHMJcjYscjYscjEwCisJZW9yaHMJcjcscjcscjExCisJc3RyCXI0LFtyMTRdLCMxNgkJQCBzdG9yZSBvdXRwdXQKKwlzdHIJcjUsW3IxNCwjLTEyXQorIyBpZmRlZglfX3RodW1iMl9fCisJaXQJaHMKKyMgZW5kaWYKKwlzdWJocwlyMTEscjgsIzY0CQlAIGxlbi09NjQKKwlzdHIJcjYsW3IxNCwjLThdCisJc3RyCXI3LFtyMTQsIy00XQorCWJoaQkuTG9vcF9vdXRlcgorCisJYmVxCS5MZG9uZQorIyBpZiBfX0FSTV9BUkNIX188NworCWIJLkx0YWlsCisKKy5hbGlnbgk0CisuTHVuYWxpZ25lZDpAIHVuYWxpZ25lZCBlbmRpYW4tbmV1dHJhbCBwYXRoCisJY21wCXIxMSwjNjQJCUAgcmVzdG9yZSBmbGFncworIyBlbmRpZgorI2VuZGlmCisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHIJcjExLFtzcCwjNCooMyldCisJYWRkCXIwLHIwLHI4CQlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXIxLHIxLHI5CisJYWRkCXIyLHIyLHIxMAorIyBpZmRlZglfX3RodW1iMl9fCisJaXRldGUJbG8KKyMgZW5kaWYKKwllb3JsbwlyOCxyOCxyOAkJQCB6ZXJvIG9yIC4uLgorCWxkcmhzYglyOCxbcjEyXSwjMTYJCQlAIC4uLiBsb2FkIGlucHV0CisJZW9ybG8JcjkscjkscjkKKwlsZHJoc2IJcjksW3IxMiwjLTEyXQorCisJYWRkCXIzLHIzLHIxMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXRldGUJbG8KKyMgZW5kaWYKKwllb3JsbwlyMTAscjEwLHIxMAorCWxkcmhzYglyMTAsW3IxMiwjLThdCisJZW9ybG8JcjExLHIxMSxyMTEKKwlsZHJoc2IJcjExLFtyMTIsIy00XQorCisJZW9yCXIwLHI4LHIwCQlAIHhvciB3aXRoIGlucHV0IChvciB6ZXJvKQorCWVvcglyMSxyOSxyMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xNV0JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy0xMV0KKwllb3IJcjIscjEwLHIyCisJc3RyYglyMCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisJZW9yCXIzLHIxMSxyMworIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtN10KKwlsZHJoc2IJcjExLFtyMTIsIy0zXQorCXN0cmIJcjEsW3IxNCwjLTEyXQorCWVvcglyMCxyOCxyMCxsc3IjOAorCXN0cmIJcjIsW3IxNCwjLThdCisJZW9yCXIxLHI5LHIxLGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTE0XQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTEwXQorCXN0cmIJcjMsW3IxNCwjLTRdCisJZW9yCXIyLHIxMCxyMixsc3IjOAorCXN0cmIJcjAsW3IxNCwjLTE1XQorCWVvcglyMyxyMTEscjMsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTZdCisJbGRyaHNiCXIxMSxbcjEyLCMtMl0KKwlzdHJiCXIxLFtyMTQsIy0xMV0KKwllb3IJcjAscjgscjAsbHNyIzgKKwlzdHJiCXIyLFtyMTQsIy03XQorCWVvcglyMSxyOSxyMSxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xM10JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy05XQorCXN0cmIJcjMsW3IxNCwjLTNdCisJZW9yCXIyLHIxMCxyMixsc3IjOAorCXN0cmIJcjAsW3IxNCwjLTE0XQorCWVvcglyMyxyMTEscjMsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTVdCisJbGRyaHNiCXIxMSxbcjEyLCMtMV0KKwlzdHJiCXIxLFtyMTQsIy0xMF0KKwlzdHJiCXIyLFtyMTQsIy02XQorCWVvcglyMCxyOCxyMCxsc3IjOAorCXN0cmIJcjMsW3IxNCwjLTJdCisJZW9yCXIxLHI5LHIxLGxzciM4CisJc3RyYglyMCxbcjE0LCMtMTNdCisJZW9yCXIyLHIxMCxyMixsc3IjOAorCXN0cmIJcjEsW3IxNCwjLTldCisJZW9yCXIzLHIxMSxyMyxsc3IjOAorCXN0cmIJcjIsW3IxNCwjLTVdCisJc3RyYglyMyxbcjE0LCMtMV0KKwlhZGQJcjgsc3AsIzQqKDQrMCkKKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JCUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwlhZGQJcjAsc3AsIzQqKDE2KzgpCisJYWRkCXI0LHI0LHI4CQlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI1LHI1LHI5CisJYWRkCXI2LHI2LHIxMAorIyBpZmRlZglfX3RodW1iMl9fCisJaXRldGUJbG8KKyMgZW5kaWYKKwllb3JsbwlyOCxyOCxyOAkJQCB6ZXJvIG9yIC4uLgorCWxkcmhzYglyOCxbcjEyXSwjMTYJCQlAIC4uLiBsb2FkIGlucHV0CisJZW9ybG8JcjkscjkscjkKKwlsZHJoc2IJcjksW3IxMiwjLTEyXQorCisJYWRkCXI3LHI3LHIxMQorIyBpZmRlZglfX3RodW1iMl9fCisJaXRldGUJbG8KKyMgZW5kaWYKKwllb3JsbwlyMTAscjEwLHIxMAorCWxkcmhzYglyMTAsW3IxMiwjLThdCisJZW9ybG8JcjExLHIxMSxyMTEKKwlsZHJoc2IJcjExLFtyMTIsIy00XQorCisJZW9yCXI0LHI4LHI0CQlAIHhvciB3aXRoIGlucHV0IChvciB6ZXJvKQorCWVvcglyNSxyOSxyNQorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xNV0JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy0xMV0KKwllb3IJcjYscjEwLHI2CisJc3RyYglyNCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisJZW9yCXI3LHIxMSxyNworIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtN10KKwlsZHJoc2IJcjExLFtyMTIsIy0zXQorCXN0cmIJcjUsW3IxNCwjLTEyXQorCWVvcglyNCxyOCxyNCxsc3IjOAorCXN0cmIJcjYsW3IxNCwjLThdCisJZW9yCXI1LHI5LHI1LGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTE0XQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTEwXQorCXN0cmIJcjcsW3IxNCwjLTRdCisJZW9yCXI2LHIxMCxyNixsc3IjOAorCXN0cmIJcjQsW3IxNCwjLTE1XQorCWVvcglyNyxyMTEscjcsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTZdCisJbGRyaHNiCXIxMSxbcjEyLCMtMl0KKwlzdHJiCXI1LFtyMTQsIy0xMV0KKwllb3IJcjQscjgscjQsbHNyIzgKKwlzdHJiCXI2LFtyMTQsIy03XQorCWVvcglyNSxyOSxyNSxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xM10JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy05XQorCXN0cmIJcjcsW3IxNCwjLTNdCisJZW9yCXI2LHIxMCxyNixsc3IjOAorCXN0cmIJcjQsW3IxNCwjLTE0XQorCWVvcglyNyxyMTEscjcsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTVdCisJbGRyaHNiCXIxMSxbcjEyLCMtMV0KKwlzdHJiCXI1LFtyMTQsIy0xMF0KKwlzdHJiCXI2LFtyMTQsIy02XQorCWVvcglyNCxyOCxyNCxsc3IjOAorCXN0cmIJcjcsW3IxNCwjLTJdCisJZW9yCXI1LHI5LHI1LGxzciM4CisJc3RyYglyNCxbcjE0LCMtMTNdCisJZW9yCXI2LHIxMCxyNixsc3IjOAorCXN0cmIJcjUsW3IxNCwjLTldCisJZW9yCXI3LHIxMSxyNyxsc3IjOAorCXN0cmIJcjYsW3IxNCwjLTVdCisJc3RyYglyNyxbcjE0LCMtMV0KKwlhZGQJcjgsc3AsIzQqKDQrNCkKKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JCUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwlsZG1pYQlyMCx7cjAscjEscjIscjMscjQscjUscjYscjd9CQlAIGxvYWQgc2Vjb25kIGhhbGYKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAloaQorIyBlbmRpZgorCXN0cmhpCXIxMCxbc3AsIzQqKDE2KzEwKV0JCUAgY29weSAicngiCisJc3RyaGkJcjExLFtzcCwjNCooMTYrMTEpXQkJQCBjb3B5ICJyeCIKKwlhZGQJcjAscjAscjgJCUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlhZGQJcjEscjEscjkKKwlhZGQJcjIscjIscjEwCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdGV0ZQlsbworIyBlbmRpZgorCWVvcmxvCXI4LHI4LHI4CQlAIHplcm8gb3IgLi4uCisJbGRyaHNiCXI4LFtyMTJdLCMxNgkJCUAgLi4uIGxvYWQgaW5wdXQKKwllb3JsbwlyOSxyOSxyOQorCWxkcmhzYglyOSxbcjEyLCMtMTJdCisKKwlhZGQJcjMscjMscjExCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdGV0ZQlsbworIyBlbmRpZgorCWVvcmxvCXIxMCxyMTAscjEwCisJbGRyaHNiCXIxMCxbcjEyLCMtOF0KKwllb3JsbwlyMTEscjExLHIxMQorCWxkcmhzYglyMTEsW3IxMiwjLTRdCisKKwllb3IJcjAscjgscjAJCUAgeG9yIHdpdGggaW5wdXQgKG9yIHplcm8pCisJZW9yCXIxLHI5LHIxCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTE1XQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTExXQorCWVvcglyMixyMTAscjIKKwlzdHJiCXIwLFtyMTRdLCMxNgkJQCBzdG9yZSBvdXRwdXQKKwllb3IJcjMscjExLHIzCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjEwLFtyMTIsIy03XQorCWxkcmhzYglyMTEsW3IxMiwjLTNdCisJc3RyYglyMSxbcjE0LCMtMTJdCisJZW9yCXIwLHI4LHIwLGxzciM4CisJc3RyYglyMixbcjE0LCMtOF0KKwllb3IJcjEscjkscjEsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyOCxbcjEyLCMtMTRdCQlAIGxvYWQgbW9yZSBpbnB1dAorCWxkcmhzYglyOSxbcjEyLCMtMTBdCisJc3RyYglyMyxbcjE0LCMtNF0KKwllb3IJcjIscjEwLHIyLGxzciM4CisJc3RyYglyMCxbcjE0LCMtMTVdCisJZW9yCXIzLHIxMSxyMyxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtNl0KKwlsZHJoc2IJcjExLFtyMTIsIy0yXQorCXN0cmIJcjEsW3IxNCwjLTExXQorCWVvcglyMCxyOCxyMCxsc3IjOAorCXN0cmIJcjIsW3IxNCwjLTddCisJZW9yCXIxLHI5LHIxLGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjgsW3IxMiwjLTEzXQkJQCBsb2FkIG1vcmUgaW5wdXQKKwlsZHJoc2IJcjksW3IxMiwjLTldCisJc3RyYglyMyxbcjE0LCMtM10KKwllb3IJcjIscjEwLHIyLGxzciM4CisJc3RyYglyMCxbcjE0LCMtMTRdCisJZW9yCXIzLHIxMSxyMyxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXIxMCxbcjEyLCMtNV0KKwlsZHJoc2IJcjExLFtyMTIsIy0xXQorCXN0cmIJcjEsW3IxNCwjLTEwXQorCXN0cmIJcjIsW3IxNCwjLTZdCisJZW9yCXIwLHI4LHIwLGxzciM4CisJc3RyYglyMyxbcjE0LCMtMl0KKwllb3IJcjEscjkscjEsbHNyIzgKKwlzdHJiCXIwLFtyMTQsIy0xM10KKwllb3IJcjIscjEwLHIyLGxzciM4CisJc3RyYglyMSxbcjE0LCMtOV0KKwllb3IJcjMscjExLHIzLGxzciM4CisJc3RyYglyMixbcjE0LCMtNV0KKwlzdHJiCXIzLFtyMTQsIy0xXQorCWFkZAlyOCxzcCwjNCooNCs4KQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQkJQCBsb2FkIGtleSBtYXRlcmlhbAorCWFkZAlyNCxyNCxyOAkJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhpCisjIGVuZGlmCisJYWRkaGkJcjgscjgsIzEJCQlAIG5leHQgY291bnRlciB2YWx1ZQorCXN0cmhpCXI4LFtzcCwjNCooMTIpXQkJQCBzYXZlIG5leHQgY291bnRlciB2YWx1ZQorCWFkZAlyNSxyNSxyOQorCWFkZAlyNixyNixyMTAKKyMgaWZkZWYJX190aHVtYjJfXworCWl0ZXRlCWxvCisjIGVuZGlmCisJZW9ybG8JcjgscjgscjgJCUAgemVybyBvciAuLi4KKwlsZHJoc2IJcjgsW3IxMl0sIzE2CQkJQCAuLi4gbG9hZCBpbnB1dAorCWVvcmxvCXI5LHI5LHI5CisJbGRyaHNiCXI5LFtyMTIsIy0xMl0KKworCWFkZAlyNyxyNyxyMTEKKyMgaWZkZWYJX190aHVtYjJfXworCWl0ZXRlCWxvCisjIGVuZGlmCisJZW9ybG8JcjEwLHIxMCxyMTAKKwlsZHJoc2IJcjEwLFtyMTIsIy04XQorCWVvcmxvCXIxMSxyMTEscjExCisJbGRyaHNiCXIxMSxbcjEyLCMtNF0KKworCWVvcglyNCxyOCxyNAkJQCB4b3Igd2l0aCBpbnB1dCAob3IgemVybykKKwllb3IJcjUscjkscjUKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyOCxbcjEyLCMtMTVdCQlAIGxvYWQgbW9yZSBpbnB1dAorCWxkcmhzYglyOSxbcjEyLCMtMTFdCisJZW9yCXI2LHIxMCxyNgorCXN0cmIJcjQsW3IxNF0sIzE2CQlAIHN0b3JlIG91dHB1dAorCWVvcglyNyxyMTEscjcKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyMTAsW3IxMiwjLTddCisJbGRyaHNiCXIxMSxbcjEyLCMtM10KKwlzdHJiCXI1LFtyMTQsIy0xMl0KKwllb3IJcjQscjgscjQsbHNyIzgKKwlzdHJiCXI2LFtyMTQsIy04XQorCWVvcglyNSxyOSxyNSxsc3IjOAorIyBpZmRlZglfX3RodW1iMl9fCisJaXR0CWhzCisjIGVuZGlmCisJbGRyaHNiCXI4LFtyMTIsIy0xNF0JCUAgbG9hZCBtb3JlIGlucHV0CisJbGRyaHNiCXI5LFtyMTIsIy0xMF0KKwlzdHJiCXI3LFtyMTQsIy00XQorCWVvcglyNixyMTAscjYsbHNyIzgKKwlzdHJiCXI0LFtyMTQsIy0xNV0KKwllb3IJcjcscjExLHI3LGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjEwLFtyMTIsIy02XQorCWxkcmhzYglyMTEsW3IxMiwjLTJdCisJc3RyYglyNSxbcjE0LCMtMTFdCisJZW9yCXI0LHI4LHI0LGxzciM4CisJc3RyYglyNixbcjE0LCMtN10KKwllb3IJcjUscjkscjUsbHNyIzgKKyMgaWZkZWYJX190aHVtYjJfXworCWl0dAlocworIyBlbmRpZgorCWxkcmhzYglyOCxbcjEyLCMtMTNdCQlAIGxvYWQgbW9yZSBpbnB1dAorCWxkcmhzYglyOSxbcjEyLCMtOV0KKwlzdHJiCXI3LFtyMTQsIy0zXQorCWVvcglyNixyMTAscjYsbHNyIzgKKwlzdHJiCXI0LFtyMTQsIy0xNF0KKwllb3IJcjcscjExLHI3LGxzciM4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdHQJaHMKKyMgZW5kaWYKKwlsZHJoc2IJcjEwLFtyMTIsIy01XQorCWxkcmhzYglyMTEsW3IxMiwjLTFdCisJc3RyYglyNSxbcjE0LCMtMTBdCisJc3RyYglyNixbcjE0LCMtNl0KKwllb3IJcjQscjgscjQsbHNyIzgKKwlzdHJiCXI3LFtyMTQsIy0yXQorCWVvcglyNSxyOSxyNSxsc3IjOAorCXN0cmIJcjQsW3IxNCwjLTEzXQorCWVvcglyNixyMTAscjYsbHNyIzgKKwlzdHJiCXI1LFtyMTQsIy05XQorCWVvcglyNyxyMTEscjcsbHNyIzgKKwlzdHJiCXI2LFtyMTQsIy01XQorCXN0cmIJcjcsW3IxNCwjLTFdCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdAluZQorIyBlbmRpZgorCWxkcm5lCXI4LFtzcCwjNCooMzIrMildCQlAIHJlLWxvYWQgbGVuCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdAlocworIyBlbmRpZgorCXN1YmhzCXIxMSxyOCwjNjQJCQlAIGxlbi09NjQKKwliaGkJLkxvb3Bfb3V0ZXIKKworCWJlcQkuTGRvbmUKKyNlbmRpZgorCisuTHRhaWw6CisJbGRyCXIxMixbc3AsIzQqKDMyKzEpXQlAIGxvYWQgaW5wCisJYWRkCXI5LHNwLCM0KigwKQorCWxkcglyMTQsW3NwLCM0KigzMiswKV0JQCBsb2FkIG91dAorCisuTG9vcF90YWlsOgorCWxkcmIJcjEwLFtyOV0sIzEJQCByZWFkIGJ1ZmZlciBvbiBzdGFjaworCWxkcmIJcjExLFtyMTJdLCMxCQlAIHJlYWQgaW5wdXQKKwlzdWJzCXI4LHI4LCMxCisJZW9yCXIxMSxyMTEscjEwCisJc3RyYglyMTEsW3IxNF0sIzEJCUAgc3RvcmUgb3V0cHV0CisJYm5lCS5Mb29wX3RhaWwKKworLkxkb25lOgorCWFkZAlzcCxzcCwjNCooMzIrMykKKy5Mbm9fZGF0YToKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscGN9Cisuc2l6ZQlDaGFDaGEyMF9jdHIzMiwuLUNoYUNoYTIwX2N0cjMyCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLmFyY2gJYXJtdjctYQorLmZwdQluZW9uCisKKy50eXBlCUNoYUNoYTIwX25lb24sJWZ1bmN0aW9uCisuYWxpZ24JNQorQ2hhQ2hhMjBfbmVvbjoKKwlsZHIJcjEyLFtzcCwjMF0JCUAgcHVsbCBwb2ludGVyIHRvIGNvdW50ZXIgYW5kIG5vbmNlCisJc3RtZGIJc3AhLHtyMCxyMSxyMixyNC1yMTEsbHJ9CisuTENoYUNoYTIwX25lb246CisJYWRyCXIxNCwuTHNpZ21hCisJdnN0bWRiCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9CQlAIEFCSSBzcGVjIHNheXMgc28KKwlzdG1kYglzcCEse3IwLHIxLHIyLHIzfQorCisJdmxkMS4zMgl7cTEscTJ9LFtyM10JCUAgbG9hZCBrZXkKKwlsZG1pYQlyMyx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0JCUAgbG9hZCBrZXkKKworCXN1YglzcCxzcCwjNCooMTYrMTYpCisJdmxkMS4zMgl7cTN9LFtyMTJdCQlAIGxvYWQgY291bnRlciBhbmQgbm9uY2UKKwlhZGQJcjEyLHNwLCM0KjgKKwlsZG1pYQlyMTQse3IwLHIxLHIyLHIzfQkJQCBsb2FkIHNpZ21hCisJdmxkMS4zMgl7cTB9LFtyMTRdIQkJQCBsb2FkIHNpZ21hCisJdmxkMS4zMgl7cTEyfSxbcjE0XQkJQCBvbmUKKwl2c3QxLjMyCXtxMixxM30sW3IxMl0JCUAgY29weSAxLzJrZXl8Y291bnRlcnxub25jZQorCXZzdDEuMzIJe3EwLHExfSxbc3BdCQlAIGNvcHkgc2lnbWF8MS8ya2V5CisKKwlzdHIJcjEwLFtzcCwjNCooMTYrMTApXQlAIG9mZi1sb2FkICJyeCIKKwlzdHIJcjExLFtzcCwjNCooMTYrMTEpXQlAIG9mZi1sb2FkICJyeCIKKwl2c2hsLmkzMglkMjYsZDI0LCMxCUAgdHdvCisJdnN0cglkMjQsW3NwLCM0KigxNiswKV0KKwl2c2hsLmkzMglkMjgsZDI0LCMyCUAgZm91cgorCXZzdHIJZDI2LFtzcCwjNCooMTYrMildCisJdm1vdglxNCxxMAorCXZzdHIJZDI4LFtzcCwjNCooMTYrNCldCisJdm1vdglxOCxxMAorCXZtb3YJcTUscTEKKwl2bW92CXE5LHExCisJYgkuTG9vcF9uZW9uX2VudGVyCisKKy5hbGlnbgk0CisuTG9vcF9uZW9uX291dGVyOgorCWxkbWlhCXNwLHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOX0JCUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwljbXAJcjExLCM2NCoyCQlAIGlmIGxlbjw9NjQqMgorCWJscwkuTGJyZWFrX25lb24JCUAgc3dpdGNoIHRvIGludGVnZXItb25seQorCXZtb3YJcTQscTAKKwlzdHIJcjExLFtzcCwjNCooMzIrMildCUAgc2F2ZSBsZW4KKwl2bW92CXE4LHEwCisJc3RyCXIxMiwgIFtzcCwjNCooMzIrMSldCUAgc2F2ZSBpbnAKKwl2bW92CXE1LHExCisJc3RyCXIxNCwgIFtzcCwjNCooMzIrMCldCUAgc2F2ZSBvdXQKKwl2bW92CXE5LHExCisuTG9vcF9uZW9uX2VudGVyOgorCWxkcglyMTEsIFtzcCwjNCooMTUpXQorCXZhZGQuaTMyCXE3LHEzLHExMgkJQCBjb3VudGVyKzEKKwlsZHIJcjEyLFtzcCwjNCooMTIpXQlAIG1vZHVsby1zY2hlZHVsZWQgbG9hZAorCXZtb3YJcTYscTIKKwlsZHIJcjEwLCBbc3AsIzQqKDEzKV0KKwl2bW92CXExMCxxMgorCWxkcglyMTQsW3NwLCM0KigxNCldCisJdmFkZC5pMzIJcTExLHE3LHExMgkJQCBjb3VudGVyKzIKKwlzdHIJcjExLCBbc3AsIzQqKDE2KzE1KV0KKwltb3YJcjExLCMxMAorCWFkZAlyMTIscjEyLCMzCUAgY291bnRlciszCisJYgkuTG9vcF9uZW9uCisKKy5hbGlnbgk0CisuTG9vcF9uZW9uOgorCXN1YnMJcjExLHIxMSwjMQorCXZhZGQuaTMyCXEwLHEwLHExCisJYWRkCXIwLHIwLHI0CisJdmFkZC5pMzIJcTQscTQscTUKKwltb3YJcjEyLHIxMixyb3IjMTYKKwl2YWRkLmkzMglxOCxxOCxxOQorCWFkZAlyMSxyMSxyNQorCXZlb3IJcTMscTMscTAKKwltb3YJcjEwLHIxMCxyb3IjMTYKKwl2ZW9yCXE3LHE3LHE0CisJZW9yCXIxMixyMTIscjAscm9yIzE2CisJdmVvcglxMTEscTExLHE4CisJZW9yCXIxMCxyMTAscjEscm9yIzE2CisJdnJldjMyLjE2CXEzLHEzCisJYWRkCXI4LHI4LHIxMgorCXZyZXYzMi4xNglxNyxxNworCW1vdglyNCxyNCxyb3IjMjAKKwl2cmV2MzIuMTYJcTExLHExMQorCWFkZAlyOSxyOSxyMTAKKwl2YWRkLmkzMglxMixxMixxMworCW1vdglyNSxyNSxyb3IjMjAKKwl2YWRkLmkzMglxNixxNixxNworCWVvcglyNCxyNCxyOCxyb3IjMjAKKwl2YWRkLmkzMglxMTAscTEwLHExMQorCWVvcglyNSxyNSxyOSxyb3IjMjAKKwl2ZW9yCXExMixxMSxxMgorCWFkZAlyMCxyMCxyNAorCXZlb3IJcTEzLHE1LHE2CisJbW92CXIxMixyMTIscm9yIzI0CisJdmVvcglxMTQscTkscTEwCisJYWRkCXIxLHIxLHI1CisJdnNoci51MzIJcTEscTEyLCMyMAorCW1vdglyMTAscjEwLHJvciMyNAorCXZzaHIudTMyCXE1LHExMywjMjAKKwllb3IJcjEyLHIxMixyMCxyb3IjMjQKKwl2c2hyLnUzMglxOSxxMTQsIzIwCisJZW9yCXIxMCxyMTAscjEscm9yIzI0CisJdnNsaS4zMglxMSxxMTIsIzEyCisJYWRkCXI4LHI4LHIxMgorCXZzbGkuMzIJcTUscTEzLCMxMgorCW1vdglyNCxyNCxyb3IjMjUKKwl2c2xpLjMyCXE5LHExNCwjMTIKKwlhZGQJcjkscjkscjEwCisJdmFkZC5pMzIJcTAscTAscTEKKwltb3YJcjUscjUscm9yIzI1CisJdmFkZC5pMzIJcTQscTQscTUKKwlzdHIJcjEwLFtzcCwjNCooMTYrMTMpXQorCXZhZGQuaTMyCXE4LHE4LHE5CisJbGRyCXIxMCxbc3AsIzQqKDE2KzE1KV0KKwl2ZW9yCXExMixxMyxxMAorCWVvcglyNCxyNCxyOCxyb3IjMjUKKwl2ZW9yCXExMyxxNyxxNAorCWVvcglyNSxyNSxyOSxyb3IjMjUKKwl2ZW9yCXExNCxxMTEscTgKKwlzdHIJcjgsW3NwLCM0KigxNis4KV0KKwl2c2hyLnUzMglxMyxxMTIsIzI0CisJbGRyCXI4LFtzcCwjNCooMTYrMTApXQorCXZzaHIudTMyCXE3LHExMywjMjQKKwlhZGQJcjIscjIscjYKKwl2c2hyLnUzMglxMTEscTE0LCMyNAorCW1vdglyMTQscjE0LHJvciMxNgorCXZzbGkuMzIJcTMscTEyLCM4CisJc3RyCXI5LFtzcCwjNCooMTYrOSldCisJdnNsaS4zMglxNyxxMTMsIzgKKwlsZHIJcjksW3NwLCM0KigxNisxMSldCisJdnNsaS4zMglxMTEscTE0LCM4CisJYWRkCXIzLHIzLHI3CisJdmFkZC5pMzIJcTIscTIscTMKKwltb3YJcjEwLHIxMCxyb3IjMTYKKwl2YWRkLmkzMglxNixxNixxNworCWVvcglyMTQscjE0LHIyLHJvciMxNgorCXZhZGQuaTMyCXExMCxxMTAscTExCisJZW9yCXIxMCxyMTAscjMscm9yIzE2CisJdmVvcglxMTIscTEscTIKKwlhZGQJcjgscjgscjE0CisJdmVvcglxMTMscTUscTYKKwltb3YJcjYscjYscm9yIzIwCisJdmVvcglxMTQscTkscTEwCisJYWRkCXI5LHI5LHIxMAorCXZzaHIudTMyCXExLHExMiwjMjUKKwltb3YJcjcscjcscm9yIzIwCisJdnNoci51MzIJcTUscTEzLCMyNQorCWVvcglyNixyNixyOCxyb3IjMjAKKwl2c2hyLnUzMglxOSxxMTQsIzI1CisJZW9yCXI3LHI3LHI5LHJvciMyMAorCXZzbGkuMzIJcTEscTEyLCM3CisJYWRkCXIyLHIyLHI2CisJdnNsaS4zMglxNSxxMTMsIzcKKwltb3YJcjE0LHIxNCxyb3IjMjQKKwl2c2xpLjMyCXE5LHExNCwjNworCWFkZAlyMyxyMyxyNworCXZleHQuOAlxMixxMixxMiwjOAorCW1vdglyMTAscjEwLHJvciMyNAorCXZleHQuOAlxNixxNixxNiwjOAorCWVvcglyMTQscjE0LHIyLHJvciMyNAorCXZleHQuOAlxMTAscTEwLHExMCwjOAorCWVvcglyMTAscjEwLHIzLHJvciMyNAorCXZleHQuOAlxMSxxMSxxMSwjNAorCWFkZAlyOCxyOCxyMTQKKwl2ZXh0LjgJcTUscTUscTUsIzQKKwltb3YJcjYscjYscm9yIzI1CisJdmV4dC44CXE5LHE5LHE5LCM0CisJYWRkCXI5LHI5LHIxMAorCXZleHQuOAlxMyxxMyxxMywjMTIKKwltb3YJcjcscjcscm9yIzI1CisJdmV4dC44CXE3LHE3LHE3LCMxMgorCWVvcglyNixyNixyOCxyb3IjMjUKKwl2ZXh0LjgJcTExLHExMSxxMTEsIzEyCisJZW9yCXI3LHI3LHI5LHJvciMyNQorCXZhZGQuaTMyCXEwLHEwLHExCisJYWRkCXIwLHIwLHI1CisJdmFkZC5pMzIJcTQscTQscTUKKwltb3YJcjEwLHIxMCxyb3IjMTYKKwl2YWRkLmkzMglxOCxxOCxxOQorCWFkZAlyMSxyMSxyNgorCXZlb3IJcTMscTMscTAKKwltb3YJcjEyLHIxMixyb3IjMTYKKwl2ZW9yCXE3LHE3LHE0CisJZW9yCXIxMCxyMTAscjAscm9yIzE2CisJdmVvcglxMTEscTExLHE4CisJZW9yCXIxMixyMTIscjEscm9yIzE2CisJdnJldjMyLjE2CXEzLHEzCisJYWRkCXI4LHI4LHIxMAorCXZyZXYzMi4xNglxNyxxNworCW1vdglyNSxyNSxyb3IjMjAKKwl2cmV2MzIuMTYJcTExLHExMQorCWFkZAlyOSxyOSxyMTIKKwl2YWRkLmkzMglxMixxMixxMworCW1vdglyNixyNixyb3IjMjAKKwl2YWRkLmkzMglxNixxNixxNworCWVvcglyNSxyNSxyOCxyb3IjMjAKKwl2YWRkLmkzMglxMTAscTEwLHExMQorCWVvcglyNixyNixyOSxyb3IjMjAKKwl2ZW9yCXExMixxMSxxMgorCWFkZAlyMCxyMCxyNQorCXZlb3IJcTEzLHE1LHE2CisJbW92CXIxMCxyMTAscm9yIzI0CisJdmVvcglxMTQscTkscTEwCisJYWRkCXIxLHIxLHI2CisJdnNoci51MzIJcTEscTEyLCMyMAorCW1vdglyMTIscjEyLHJvciMyNAorCXZzaHIudTMyCXE1LHExMywjMjAKKwllb3IJcjEwLHIxMCxyMCxyb3IjMjQKKwl2c2hyLnUzMglxOSxxMTQsIzIwCisJZW9yCXIxMixyMTIscjEscm9yIzI0CisJdnNsaS4zMglxMSxxMTIsIzEyCisJYWRkCXI4LHI4LHIxMAorCXZzbGkuMzIJcTUscTEzLCMxMgorCW1vdglyNSxyNSxyb3IjMjUKKwl2c2xpLjMyCXE5LHExNCwjMTIKKwlzdHIJcjEwLFtzcCwjNCooMTYrMTUpXQorCXZhZGQuaTMyCXEwLHEwLHExCisJbGRyCXIxMCxbc3AsIzQqKDE2KzEzKV0KKwl2YWRkLmkzMglxNCxxNCxxNQorCWFkZAlyOSxyOSxyMTIKKwl2YWRkLmkzMglxOCxxOCxxOQorCW1vdglyNixyNixyb3IjMjUKKwl2ZW9yCXExMixxMyxxMAorCWVvcglyNSxyNSxyOCxyb3IjMjUKKwl2ZW9yCXExMyxxNyxxNAorCWVvcglyNixyNixyOSxyb3IjMjUKKwl2ZW9yCXExNCxxMTEscTgKKwlzdHIJcjgsW3NwLCM0KigxNisxMCldCisJdnNoci51MzIJcTMscTEyLCMyNAorCWxkcglyOCxbc3AsIzQqKDE2KzgpXQorCXZzaHIudTMyCXE3LHExMywjMjQKKwlhZGQJcjIscjIscjcKKwl2c2hyLnUzMglxMTEscTE0LCMyNAorCW1vdglyMTAscjEwLHJvciMxNgorCXZzbGkuMzIJcTMscTEyLCM4CisJc3RyCXI5LFtzcCwjNCooMTYrMTEpXQorCXZzbGkuMzIJcTcscTEzLCM4CisJbGRyCXI5LFtzcCwjNCooMTYrOSldCisJdnNsaS4zMglxMTEscTE0LCM4CisJYWRkCXIzLHIzLHI0CisJdmFkZC5pMzIJcTIscTIscTMKKwltb3YJcjE0LHIxNCxyb3IjMTYKKwl2YWRkLmkzMglxNixxNixxNworCWVvcglyMTAscjEwLHIyLHJvciMxNgorCXZhZGQuaTMyCXExMCxxMTAscTExCisJZW9yCXIxNCxyMTQscjMscm9yIzE2CisJdmVvcglxMTIscTEscTIKKwlhZGQJcjgscjgscjEwCisJdmVvcglxMTMscTUscTYKKwltb3YJcjcscjcscm9yIzIwCisJdmVvcglxMTQscTkscTEwCisJYWRkCXI5LHI5LHIxNAorCXZzaHIudTMyCXExLHExMiwjMjUKKwltb3YJcjQscjQscm9yIzIwCisJdnNoci51MzIJcTUscTEzLCMyNQorCWVvcglyNyxyNyxyOCxyb3IjMjAKKwl2c2hyLnUzMglxOSxxMTQsIzI1CisJZW9yCXI0LHI0LHI5LHJvciMyMAorCXZzbGkuMzIJcTEscTEyLCM3CisJYWRkCXIyLHIyLHI3CisJdnNsaS4zMglxNSxxMTMsIzcKKwltb3YJcjEwLHIxMCxyb3IjMjQKKwl2c2xpLjMyCXE5LHExNCwjNworCWFkZAlyMyxyMyxyNAorCXZleHQuOAlxMixxMixxMiwjOAorCW1vdglyMTQscjE0LHJvciMyNAorCXZleHQuOAlxNixxNixxNiwjOAorCWVvcglyMTAscjEwLHIyLHJvciMyNAorCXZleHQuOAlxMTAscTEwLHExMCwjOAorCWVvcglyMTQscjE0LHIzLHJvciMyNAorCXZleHQuOAlxMSxxMSxxMSwjMTIKKwlhZGQJcjgscjgscjEwCisJdmV4dC44CXE1LHE1LHE1LCMxMgorCW1vdglyNyxyNyxyb3IjMjUKKwl2ZXh0LjgJcTkscTkscTksIzEyCisJYWRkCXI5LHI5LHIxNAorCXZleHQuOAlxMyxxMyxxMywjNAorCW1vdglyNCxyNCxyb3IjMjUKKwl2ZXh0LjgJcTcscTcscTcsIzQKKwllb3IJcjcscjcscjgscm9yIzI1CisJdmV4dC44CXExMSxxMTEscTExLCM0CisJZW9yCXI0LHI0LHI5LHJvciMyNQorCWJuZQkuTG9vcF9uZW9uCisKKwlhZGQJcjExLHNwLCMzMgorCXZsZDEuMzIJe3ExMixxMTN9LFtzcF0JCUAgbG9hZCBrZXkgbWF0ZXJpYWwKKwl2bGQxLjMyCXtxMTQscTE1fSxbcjExXQorCisJbGRyCXIxMSxbc3AsIzQqKDMyKzIpXQlAIGxvYWQgbGVuCisKKwlzdHIJcjgsIFtzcCwjNCooMTYrOCldCUAgbW9kdWxvLXNjaGVkdWxlZCBzdG9yZQorCXN0cglyOSwgW3NwLCM0KigxNis5KV0KKwlzdHIJcjEyLFtzcCwjNCooMTYrMTIpXQorCXN0cglyMTAsIFtzcCwjNCooMTYrMTMpXQorCXN0cglyMTQsW3NwLCM0KigxNisxNCldCisKKwlAIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBmaXJzdCBoYWxmIG9mIDUxMi1iaXQgcmVzdWx0IGluCisJQCByeCBhbmQgc2Vjb25kIGhhbGYgYXQgc3ArNCooMTYrOCkKKworCWxkcglyMTIsW3NwLCM0KigzMisxKV0JQCBsb2FkIGlucAorCWxkcglyMTQsW3NwLCM0KigzMiswKV0JQCBsb2FkIG91dAorCisJdmFkZC5pMzIJcTAscTAscTEyCQlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJdmFkZC5pMzIJcTQscTQscTEyCisJdmFkZC5pMzIJcTgscTgscTEyCisJdmxkcglkMjQsW3NwLCM0KigxNiswKV0JQCBvbmUKKworCXZhZGQuaTMyCXExLHExLHExMworCXZhZGQuaTMyCXE1LHE1LHExMworCXZhZGQuaTMyCXE5LHE5LHExMworCXZsZHIJZDI2LFtzcCwjNCooMTYrMildCUAgdHdvCisKKwl2YWRkLmkzMglxMixxMixxMTQKKwl2YWRkLmkzMglxNixxNixxMTQKKwl2YWRkLmkzMglxMTAscTEwLHExNAorCXZhZGQuaTMyCWQxNCxkMTQsZDI0CUAgY291bnRlcisxCisJdmFkZC5pMzIJZDIyLGQyMixkMjYJQCBjb3VudGVyKzIKKworCXZhZGQuaTMyCXEzLHEzLHExNQorCXZhZGQuaTMyCXE3LHE3LHExNQorCXZhZGQuaTMyCXExMSxxMTEscTE1CisKKwljbXAJcjExLCM2NCo0CisJYmxvCS5MdGFpbF9uZW9uCisKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQlAIGxvYWQgaW5wdXQKKwltb3YJcjExLHNwCisJdmxkMS44CXtxMTQscTE1fSxbcjEyXSEKKwl2ZW9yCXEwLHEwLHExMgkJQCB4b3Igd2l0aCBpbnB1dAorCXZlb3IJcTEscTEscTEzCisJdmxkMS44CXtxMTIscTEzfSxbcjEyXSEKKwl2ZW9yCXEyLHEyLHExNAorCXZlb3IJcTMscTMscTE1CisJdmxkMS44CXtxMTQscTE1fSxbcjEyXSEKKworCXZlb3IJcTQscTQscTEyCisJdnN0MS44CXtxMCxxMX0sW3IxNF0hCUAgc3RvcmUgb3V0cHV0CisJdmVvcglxNSxxNSxxMTMKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQorCXZlb3IJcTYscTYscTE0CisJdnN0MS44CXtxMixxM30sW3IxNF0hCisJdmVvcglxNyxxNyxxMTUKKwl2bGQxLjgJe3ExNCxxMTV9LFtyMTJdIQorCisJdmVvcglxOCxxOCxxMTIKKwl2bGQxLjMyCXtxMCxxMX0sW3IxMV0hCUAgbG9hZCBmb3IgbmV4dCBpdGVyYXRpb24KKwl2ZW9yCWQyNSxkMjUsZDI1CisJdmxkcglkMjQsW3NwLCM0KigxNis0KV0JQCBmb3VyCisJdmVvcglxOSxxOSxxMTMKKwl2bGQxLjMyCXtxMixxM30sW3IxMV0KKwl2ZW9yCXExMCxxMTAscTE0CisJdnN0MS44CXtxNCxxNX0sW3IxNF0hCisJdmVvcglxMTEscTExLHExNQorCXZzdDEuOAl7cTYscTd9LFtyMTRdIQorCisJdmFkZC5pMzIJZDYsZDYsZDI0CUAgbmV4dCBjb3VudGVyIHZhbHVlCisJdmxkcglkMjQsW3NwLCM0KigxNiswKV0JQCBvbmUKKworCWxkbWlhCXNwLHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJYWRkCXIwLHIwLHI4CUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlsZHIJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwl2c3QxLjgJe3E4LHE5fSxbcjE0XSEKKwlhZGQJcjEscjEscjkKKwlsZHIJcjksW3IxMiwjLTEyXQorCXZzdDEuOAl7cTEwLHExMX0sW3IxNF0hCisJYWRkCXIyLHIyLHIxMAorCWxkcglyMTAsW3IxMiwjLThdCisJYWRkCXIzLHIzLHIxMQorCWxkcglyMTEsW3IxMiwjLTRdCisjIGlmZGVmCV9fQVJNRUJfXworCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworIyBlbmRpZgorCWVvcglyMCxyMCxyOAlAIHhvciB3aXRoIGlucHV0CisJYWRkCXI4LHNwLCM0Kig0KQorCWVvcglyMSxyMSxyOQorCXN0cglyMCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisJZW9yCXIyLHIyLHIxMAorCXN0cglyMSxbcjE0LCMtMTJdCisJZW9yCXIzLHIzLHIxMQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJc3RyCXIyLFtyMTQsIy04XQorCXN0cglyMyxbcjE0LCMtNF0KKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJbGRyCXI4LFtyMTJdLCMxNgkJQCBsb2FkIGlucHV0CisJYWRkCXI1LHI1LHI5CisJbGRyCXI5LFtyMTIsIy0xMl0KKwlhZGQJcjYscjYscjEwCisJbGRyCXIxMCxbcjEyLCMtOF0KKwlhZGQJcjcscjcscjExCisJbGRyCXIxMSxbcjEyLCMtNF0KKyMgaWZkZWYJX19BUk1FQl9fCisJcmV2CXI0LHI0CisJcmV2CXI1LHI1CisJcmV2CXI2LHI2CisJcmV2CXI3LHI3CisjIGVuZGlmCisJZW9yCXI0LHI0LHI4CisJYWRkCXI4LHNwLCM0Kig4KQorCWVvcglyNSxyNSxyOQorCXN0cglyNCxbcjE0XSwjMTYJCUAgc3RvcmUgb3V0cHV0CisJZW9yCXI2LHI2LHIxMAorCXN0cglyNSxbcjE0LCMtMTJdCisJZW9yCXI3LHI3LHIxMQorCWxkbWlhCXI4LHtyOCxyOSxyMTAscjExfQlAIGxvYWQga2V5IG1hdGVyaWFsCisJc3RyCXI2LFtyMTQsIy04XQorCWFkZAlyMCxzcCwjNCooMTYrOCkKKwlzdHIJcjcsW3IxNCwjLTRdCisKKwlsZG1pYQlyMCx7cjAscjEscjIscjMscjQscjUscjYscjd9CUAgbG9hZCBzZWNvbmQgaGFsZgorCisJYWRkCXIwLHIwLHI4CUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlsZHIJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlhZGQJcjEscjEscjkKKwlsZHIJcjksW3IxMiwjLTEyXQorIyBpZmRlZglfX3RodW1iMl9fCisJaXQJaGkKKyMgZW5kaWYKKwlzdHJoaQlyMTAsW3NwLCM0KigxNisxMCldCUAgY29weSAicngiIHdoaWxlIGF0IGl0CisJYWRkCXIyLHIyLHIxMAorCWxkcglyMTAsW3IxMiwjLThdCisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdAloaQorIyBlbmRpZgorCXN0cmhpCXIxMSxbc3AsIzQqKDE2KzExKV0JQCBjb3B5ICJyeCIgd2hpbGUgYXQgaXQKKwlhZGQJcjMscjMscjExCisJbGRyCXIxMSxbcjEyLCMtNF0KKyMgaWZkZWYJX19BUk1FQl9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisjIGVuZGlmCisJZW9yCXIwLHIwLHI4CisJYWRkCXI4LHNwLCM0KigxMikKKwllb3IJcjEscjEscjkKKwlzdHIJcjAsW3IxNF0sIzE2CQlAIHN0b3JlIG91dHB1dAorCWVvcglyMixyMixyMTAKKwlzdHIJcjEsW3IxNCwjLTEyXQorCWVvcglyMyxyMyxyMTEKKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCXN0cglyMixbcjE0LCMtOF0KKwlzdHIJcjMsW3IxNCwjLTRdCisKKwlhZGQJcjQscjQscjgJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyOCxyOCwjNAkJQCBuZXh0IGNvdW50ZXIgdmFsdWUKKwlhZGQJcjUscjUscjkKKwlzdHIJcjgsW3NwLCM0KigxMildCUAgc2F2ZSBuZXh0IGNvdW50ZXIgdmFsdWUKKwlsZHIJcjgsW3IxMl0sIzE2CQlAIGxvYWQgaW5wdXQKKwlhZGQJcjYscjYscjEwCisJYWRkCXI0LHI0LCMzCQlAIGNvdW50ZXIrMworCWxkcglyOSxbcjEyLCMtMTJdCisJYWRkCXI3LHI3LHIxMQorCWxkcglyMTAsW3IxMiwjLThdCisJbGRyCXIxMSxbcjEyLCMtNF0KKyMgaWZkZWYJX19BUk1FQl9fCisJcmV2CXI0LHI0CisJcmV2CXI1LHI1CisJcmV2CXI2LHI2CisJcmV2CXI3LHI3CisjIGVuZGlmCisJZW9yCXI0LHI0LHI4CisjIGlmZGVmCV9fdGh1bWIyX18KKwlpdAloaQorIyBlbmRpZgorCWxkcmhpCXI4LFtzcCwjNCooMzIrMildCUAgcmUtbG9hZCBsZW4KKwllb3IJcjUscjUscjkKKwllb3IJcjYscjYscjEwCisJc3RyCXI0LFtyMTRdLCMxNgkJQCBzdG9yZSBvdXRwdXQKKwllb3IJcjcscjcscjExCisJc3RyCXI1LFtyMTQsIy0xMl0KKwlzdWIJcjExLHI4LCM2NCo0CUAgbGVuLT02NCo0CisJc3RyCXI2LFtyMTQsIy04XQorCXN0cglyNyxbcjE0LCMtNF0KKwliaGkJLkxvb3BfbmVvbl9vdXRlcgorCisJYgkuTGRvbmVfbmVvbgorCisuYWxpZ24JNAorLkxicmVha19uZW9uOgorCUAgaGFybW9uaXplIE5FT04gYW5kIGludGVnZXItb25seSBzdGFjayBmcmFtZXM6IGxvYWQgZGF0YQorCUAgZnJvbSBORU9OIGZyYW1lLCBidXQgc2F2ZSB0byBpbnRlZ2VyLW9ubHkgb25lOyBkaXN0YW5jZQorCUAgYmV0d2VlbiB0aGUgdHdvIGlzIDQqKDMyKzQrMTYtMzIpPTQqKDIwKS4KKworCXN0cglyMTEsIFtzcCwjNCooMjArMzIrMildCUAgc2F2ZSBsZW4KKwlhZGQJcjExLHNwLCM0KigzMis0KQorCXN0cglyMTIsICAgW3NwLCM0KigyMCszMisxKV0JQCBzYXZlIGlucAorCXN0cglyMTQsICAgW3NwLCM0KigyMCszMiswKV0JQCBzYXZlIG91dAorCisJbGRyCXIxMixbc3AsIzQqKDE2KzEwKV0KKwlsZHIJcjE0LFtzcCwjNCooMTYrMTEpXQorCXZsZG1pYQlyMTEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQkJCUAgZnVsZmlsbCBBQkkgcmVxdWlyZW1lbnQKKwlzdHIJcjEyLFtzcCwjNCooMjArMTYrMTApXQlAIGNvcHkgInJ4IgorCXN0cglyMTQsW3NwLCM0KigyMCsxNisxMSldCUAgY29weSAicngiCisKKwlsZHIJcjExLCBbc3AsIzQqKDE1KV0KKwlsZHIJcjEyLFtzcCwjNCooMTIpXQkJQCBtb2R1bG8tc2NoZWR1bGVkIGxvYWQKKwlsZHIJcjEwLCBbc3AsIzQqKDEzKV0KKwlsZHIJcjE0LFtzcCwjNCooMTQpXQorCXN0cglyMTEsIFtzcCwjNCooMjArMTYrMTUpXQorCWFkZAlyMTEsc3AsIzQqKDIwKQorCXZzdDEuMzIJe3EwLHExfSxbcjExXSEJCUAgY29weSBrZXkKKwlhZGQJc3Asc3AsIzQqKDIwKQkJCUAgc3dpdGNoIGZyYW1lCisJdnN0MS4zMgl7cTIscTN9LFtyMTFdCisJbW92CXIxMSwjMTAKKwliCS5Mb29wCQkJCUAgZ28gaW50ZWdlci1vbmx5CisKKy5hbGlnbgk0CisuTHRhaWxfbmVvbjoKKwljbXAJcjExLCM2NCozCisJYmhzCS5MMTkyX29yX21vcmVfbmVvbgorCWNtcAlyMTEsIzY0KjIKKwliaHMJLkwxMjhfb3JfbW9yZV9uZW9uCisJY21wCXIxMSwjNjQqMQorCWJocwkuTDY0X29yX21vcmVfbmVvbgorCisJYWRkCXI4LHNwLCM0Kig4KQorCXZzdDEuOAl7cTAscTF9LFtzcF0KKwlhZGQJcjEwLHNwLCM0KigwKQorCXZzdDEuOAl7cTIscTN9LFtyOF0KKwliCS5Mb29wX3RhaWxfbmVvbgorCisuYWxpZ24JNAorLkw2NF9vcl9tb3JlX25lb246CisJdmxkMS44CXtxMTIscTEzfSxbcjEyXSEKKwl2bGQxLjgJe3ExNCxxMTV9LFtyMTJdIQorCXZlb3IJcTAscTAscTEyCisJdmVvcglxMSxxMSxxMTMKKwl2ZW9yCXEyLHEyLHExNAorCXZlb3IJcTMscTMscTE1CisJdnN0MS44CXtxMCxxMX0sW3IxNF0hCisJdnN0MS44CXtxMixxM30sW3IxNF0hCisKKwliZXEJLkxkb25lX25lb24KKworCWFkZAlyOCxzcCwjNCooOCkKKwl2c3QxLjgJe3E0LHE1fSxbc3BdCisJYWRkCXIxMCxzcCwjNCooMCkKKwl2c3QxLjgJe3E2LHE3fSxbcjhdCisJc3ViCXIxMSxyMTEsIzY0KjEJQCBsZW4tPTY0KjEKKwliCS5Mb29wX3RhaWxfbmVvbgorCisuYWxpZ24JNAorLkwxMjhfb3JfbW9yZV9uZW9uOgorCXZsZDEuOAl7cTEyLHExM30sW3IxMl0hCisJdmxkMS44CXtxMTQscTE1fSxbcjEyXSEKKwl2ZW9yCXEwLHEwLHExMgorCXZlb3IJcTEscTEscTEzCisJdmxkMS44CXtxMTIscTEzfSxbcjEyXSEKKwl2ZW9yCXEyLHEyLHExNAorCXZlb3IJcTMscTMscTE1CisJdmxkMS44CXtxMTQscTE1fSxbcjEyXSEKKworCXZlb3IJcTQscTQscTEyCisJdmVvcglxNSxxNSxxMTMKKwl2c3QxLjgJe3EwLHExfSxbcjE0XSEKKwl2ZW9yCXE2LHE2LHExNAorCXZzdDEuOAl7cTIscTN9LFtyMTRdIQorCXZlb3IJcTcscTcscTE1CisJdnN0MS44CXtxNCxxNX0sW3IxNF0hCisJdnN0MS44CXtxNixxN30sW3IxNF0hCisKKwliZXEJLkxkb25lX25lb24KKworCWFkZAlyOCxzcCwjNCooOCkKKwl2c3QxLjgJe3E4LHE5fSxbc3BdCisJYWRkCXIxMCxzcCwjNCooMCkKKwl2c3QxLjgJe3ExMCxxMTF9LFtyOF0KKwlzdWIJcjExLHIxMSwjNjQqMglAIGxlbi09NjQqMgorCWIJLkxvb3BfdGFpbF9uZW9uCisKKy5hbGlnbgk0CisuTDE5Ml9vcl9tb3JlX25lb246CisJdmxkMS44CXtxMTIscTEzfSxbcjEyXSEKKwl2bGQxLjgJe3ExNCxxMTV9LFtyMTJdIQorCXZlb3IJcTAscTAscTEyCisJdmVvcglxMSxxMSxxMTMKKwl2bGQxLjgJe3ExMixxMTN9LFtyMTJdIQorCXZlb3IJcTIscTIscTE0CisJdmVvcglxMyxxMyxxMTUKKwl2bGQxLjgJe3ExNCxxMTV9LFtyMTJdIQorCisJdmVvcglxNCxxNCxxMTIKKwl2ZW9yCXE1LHE1LHExMworCXZsZDEuOAl7cTEyLHExM30sW3IxMl0hCisJdmVvcglxNixxNixxMTQKKwl2c3QxLjgJe3EwLHExfSxbcjE0XSEKKwl2ZW9yCXE3LHE3LHExNQorCXZsZDEuOAl7cTE0LHExNX0sW3IxMl0hCisKKwl2ZW9yCXE4LHE4LHExMgorCXZzdDEuOAl7cTIscTN9LFtyMTRdIQorCXZlb3IJcTkscTkscTEzCisJdnN0MS44CXtxNCxxNX0sW3IxNF0hCisJdmVvcglxMTAscTEwLHExNAorCXZzdDEuOAl7cTYscTd9LFtyMTRdIQorCXZlb3IJcTExLHExMSxxMTUKKwl2c3QxLjgJe3E4LHE5fSxbcjE0XSEKKwl2c3QxLjgJe3ExMCxxMTF9LFtyMTRdIQorCisJYmVxCS5MZG9uZV9uZW9uCisKKwlsZG1pYQlzcCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCWFkZAlyMCxyMCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI4LHNwLCM0Kig0KQorCWFkZAlyMSxyMSxyOQorCWFkZAlyMixyMixyMTAKKwlhZGQJcjMscjMscjExCisJbGRtaWEJcjgse3I4LHI5LHIxMCxyMTF9CUAgbG9hZCBrZXkgbWF0ZXJpYWwKKworCWFkZAlyNCxyNCxyOAlAIGFjY3VtdWxhdGUga2V5IG1hdGVyaWFsCisJYWRkCXI4LHNwLCM0Kig4KQorCWFkZAlyNSxyNSxyOQorCWFkZAlyNixyNixyMTAKKwlhZGQJcjcscjcscjExCisJbGRtaWEJcjgse3I4LHI5LHIxMCxyMTF9CUAgbG9hZCBrZXkgbWF0ZXJpYWwKKyMgaWZkZWYJX19BUk1FQl9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisJcmV2CXI0LHI0CisJcmV2CXI1LHI1CisJcmV2CXI2LHI2CisJcmV2CXI3LHI3CisjIGVuZGlmCisJc3RtaWEJc3Ase3IwLHIxLHIyLHIzLHI0LHI1LHI2LHI3fQorCWFkZAlyMCxzcCwjNCooMTYrOCkKKworCWxkbWlhCXIwLHtyMCxyMSxyMixyMyxyNCxyNSxyNixyN30JQCBsb2FkIHNlY29uZCBoYWxmCisKKwlhZGQJcjAscjAscjgJQCBhY2N1bXVsYXRlIGtleSBtYXRlcmlhbAorCWFkZAlyOCxzcCwjNCooMTIpCisJYWRkCXIxLHIxLHI5CisJYWRkCXIyLHIyLHIxMAorCWFkZAlyMyxyMyxyMTEKKwlsZG1pYQlyOCx7cjgscjkscjEwLHIxMX0JQCBsb2FkIGtleSBtYXRlcmlhbAorCisJYWRkCXI0LHI0LHI4CUAgYWNjdW11bGF0ZSBrZXkgbWF0ZXJpYWwKKwlhZGQJcjgsc3AsIzQqKDgpCisJYWRkCXI1LHI1LHI5CisJYWRkCXI0LHI0LCMzCQlAIGNvdW50ZXIrMworCWFkZAlyNixyNixyMTAKKwlhZGQJcjcscjcscjExCisJbGRyCXIxMSxbc3AsIzQqKDMyKzIpXQlAIHJlLWxvYWQgbGVuCisjIGlmZGVmCV9fQVJNRUJfXworCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworCXJldglyNCxyNAorCXJldglyNSxyNQorCXJldglyNixyNgorCXJldglyNyxyNworIyBlbmRpZgorCXN0bWlhCXI4LHtyMCxyMSxyMixyMyxyNCxyNSxyNixyN30KKwlhZGQJcjEwLHNwLCM0KigwKQorCXN1YglyMTEscjExLCM2NCozCUAgbGVuLT02NCozCisKKy5Mb29wX3RhaWxfbmVvbjoKKwlsZHJiCXI4LFtyMTBdLCMxCUAgcmVhZCBidWZmZXIgb24gc3RhY2sKKwlsZHJiCXI5LFtyMTJdLCMxCQlAIHJlYWQgaW5wdXQKKwlzdWJzCXIxMSxyMTEsIzEKKwllb3IJcjgscjgscjkKKwlzdHJiCXI4LFtyMTRdLCMxCQlAIHN0b3JlIG91dHB1dAorCWJuZQkuTG9vcF90YWlsX25lb24KKworLkxkb25lX25lb246CisJYWRkCXNwLHNwLCM0KigzMis0KQorCXZsZG1pYQlzcCx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9CisJYWRkCXNwLHNwLCM0KigxNiszKQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxwY30KKy5zaXplCUNoYUNoYTIwX25lb24sLi1DaGFDaGEyMF9uZW9uCisuY29tbQlPUEVOU1NMX2FybWNhcF9QLDQsNAorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flcy1hcm12NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvYWVzLWFybXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkYzdjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flcy1hcm12NC5TCkBAIC0wLDAgKzEsMTIwNiBAQAorI2lmIGRlZmluZWQoX19hcm1fXykKK0AgQ29weXJpZ2h0IDIwMDctMjAxNiBUaGUgT3BlblNTTCBQcm9qZWN0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCitAIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbiBvYnRhaW4gYSBjb3B5CitAIGluIHRoZSBmaWxlIExJQ0VOU0UgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3IgYXQKK0AgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisKK0AgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0AgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCitAIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKK0AgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKK0AgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0AgQUVTIGZvciBBUk12NAorCitAIEphbnVhcnkgMjAwNy4KK0AKK0AgQ29kZSB1c2VzIHNpbmdsZSAxSyBTLWJveCBhbmQgaXMgPjIgdGltZXMgZmFzdGVyIHRoYW4gY29kZSBnZW5lcmF0ZWQKK0AgYnkgZ2NjLTMuNC4xLiBUaGlzIGlzIHRoYW5rcyB0byB1bmlxdWUgZmVhdHVyZSBvZiBBUk12NCBJU0EsIHdoaWNoCitAIGFsbG93cyB0byBtZXJnZSBsb2dpY2FsIG9yIGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpdGggc2hpZnQgb3Igcm90YXRlCitAIGluIG9uZSBpbnN0cnVjdGlvbiBhbmQgZW1pdCBjb21iaW5lZCByZXN1bHQgZXZlcnkgY3ljbGUuIFRoZSBtb2R1bGUKK0AgaXMgZW5kaWFuLW5ldXRyYWwuIFRoZSBwZXJmb3JtYW5jZSBpcyB+NDIgY3ljbGVzL2J5dGUgZm9yIDEyOC1iaXQKK0Aga2V5IFtvbiBzaW5nbGUtaXNzdWUgWHNjYWxlIFBYQTI1MCBjb3JlXS4KKworQCBNYXkgMjAwNy4KK0AKK0AgQUVTX3NldF9bZW58ZGVdY3J5cHRfa2V5IGlzIGFkZGVkLgorCitAIEp1bHkgMjAxMC4KK0AKK0AgUmVzY2hlZHVsaW5nIGZvciBkdWFsLWlzc3VlIHBpcGVsaW5lIHJlc3VsdGVkIGluIDEyJSBpbXByb3ZlbWVudCBvbgorQCBDb3J0ZXggQTggY29yZSBhbmQgfjI1IGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleS4KKworQCBGZWJydWFyeSAyMDExLgorQAorQCBQcm9maWxlci1hc3Npc3RlZCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgb3B0aW1pemF0aW9uIHJlc3VsdGVkIGluIDE2JQorQCBpbXByb3ZlbWVudCBvbiBDb3J0ZXggQTggY29yZSBhbmQgfjIxLjUgY3ljbGVzIHBlciBieXRlLgorCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorI2Vsc2UKKyMgZGVmaW5lIF9fQVJNX0FSQ0hfXyBfX0xJTlVYX0FSTV9BUkNIX18KKyNlbmRpZgorCitAIFNpbGVuY2UgQVJNdjggZGVwcmVjYXRlZCBJVCBpbnN0cnVjdGlvbiB3YXJuaW5ncy4gVGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aAorQCBBUk12NyBhbmQgQVJNdjggcHJvY2Vzc29ycyBhbmQgZG9lcyBub3QgdXNlIEFSTXY4IGluc3RydWN0aW9ucy4gKEFSTXY4IEFFUworQCBpbnN0cnVjdGlvbnMgYXJlIGluIGFlc3Y4LWFybXgucGwuKQorLmFyY2gJYXJtdjctYQorCisudGV4dAorI2lmIGRlZmluZWQoX190aHVtYjJfXykgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorLnN5bnRheAl1bmlmaWVkCisudGh1bWIKKyNlbHNlCisuY29kZQkzMgorI3VuZGVmIF9fdGh1bWIyX18KKyNlbmRpZgorCisudHlwZQlBRVNfVGUsJW9iamVjdAorLmFsaWduCTUKK0FFU19UZToKKy53b3JkCTB4YzY2MzYzYTUsIDB4Zjg3YzdjODQsIDB4ZWU3Nzc3OTksIDB4ZjY3YjdiOGQKKy53b3JkCTB4ZmZmMmYyMGQsIDB4ZDY2YjZiYmQsIDB4ZGU2ZjZmYjEsIDB4OTFjNWM1NTQKKy53b3JkCTB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QKKy53b3JkCTB4ZTdmZWZlMTksIDB4YjVkN2Q3NjIsIDB4NGRhYmFiZTYsIDB4ZWM3Njc2OWEKKy53b3JkCTB4OGZjYWNhNDUsIDB4MWY4MjgyOWQsIDB4ODljOWM5NDAsIDB4ZmE3ZDdkODcKKy53b3JkCTB4ZWZmYWZhMTUsIDB4YjI1OTU5ZWIsIDB4OGU0NzQ3YzksIDB4ZmJmMGYwMGIKKy53b3JkCTB4NDFhZGFkZWMsIDB4YjNkNGQ0NjcsIDB4NWZhMmEyZmQsIDB4NDVhZmFmZWEKKy53b3JkCTB4MjM5YzljYmYsIDB4NTNhNGE0ZjcsIDB4ZTQ3MjcyOTYsIDB4OWJjMGMwNWIKKy53b3JkCTB4NzViN2I3YzIsIDB4ZTFmZGZkMWMsIDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEKKy53b3JkCTB4NmMzNjM2NWEsIDB4N2UzZjNmNDEsIDB4ZjVmN2Y3MDIsIDB4ODNjY2NjNGYKKy53b3JkCTB4NjgzNDM0NWMsIDB4NTFhNWE1ZjQsIDB4ZDFlNWU1MzQsIDB4ZjlmMWYxMDgKKy53b3JkCTB4ZTI3MTcxOTMsIDB4YWJkOGQ4NzMsIDB4NjIzMTMxNTMsIDB4MmExNTE1M2YKKy53b3JkCTB4MDgwNDA0MGMsIDB4OTVjN2M3NTIsIDB4NDYyMzIzNjUsIDB4OWRjM2MzNWUKKy53b3JkCTB4MzAxODE4MjgsIDB4Mzc5Njk2YTEsIDB4MGEwNTA1MGYsIDB4MmY5YTlhYjUKKy53b3JkCTB4MGUwNzA3MDksIDB4MjQxMjEyMzYsIDB4MWI4MDgwOWIsIDB4ZGZlMmUyM2QKKy53b3JkCTB4Y2RlYmViMjYsIDB4NGUyNzI3NjksIDB4N2ZiMmIyY2QsIDB4ZWE3NTc1OWYKKy53b3JkCTB4MTIwOTA5MWIsIDB4MWQ4MzgzOWUsIDB4NTgyYzJjNzQsIDB4MzQxYTFhMmUKKy53b3JkCTB4MzYxYjFiMmQsIDB4ZGM2ZTZlYjIsIDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIKKy53b3JkCTB4YTQ1MjUyZjYsIDB4NzYzYjNiNGQsIDB4YjdkNmQ2NjEsIDB4N2RiM2IzY2UKKy53b3JkCTB4NTIyOTI5N2IsIDB4ZGRlM2UzM2UsIDB4NWUyZjJmNzEsIDB4MTM4NDg0OTcKKy53b3JkCTB4YTY1MzUzZjUsIDB4YjlkMWQxNjgsIDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMKKy53b3JkCTB4NDAyMDIwNjAsIDB4ZTNmY2ZjMWYsIDB4NzliMWIxYzgsIDB4YjY1YjViZWQKKy53b3JkCTB4ZDQ2YTZhYmUsIDB4OGRjYmNiNDYsIDB4NjdiZWJlZDksIDB4NzIzOTM5NGIKKy53b3JkCTB4OTQ0YTRhZGUsIDB4OTg0YzRjZDQsIDB4YjA1ODU4ZTgsIDB4ODVjZmNmNGEKKy53b3JkCTB4YmJkMGQwNmIsIDB4YzVlZmVmMmEsIDB4NGZhYWFhZTUsIDB4ZWRmYmZiMTYKKy53b3JkCTB4ODY0MzQzYzUsIDB4OWE0ZDRkZDcsIDB4NjYzMzMzNTUsIDB4MTE4NTg1OTQKKy53b3JkCTB4OGE0NTQ1Y2YsIDB4ZTlmOWY5MTAsIDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEKKy53b3JkCTB4YTA1MDUwZjAsIDB4NzgzYzNjNDQsIDB4MjU5ZjlmYmEsIDB4NGJhOGE4ZTMKKy53b3JkCTB4YTI1MTUxZjMsIDB4NWRhM2EzZmUsIDB4ODA0MDQwYzAsIDB4MDU4ZjhmOGEKKy53b3JkCTB4M2Y5MjkyYWQsIDB4MjE5ZDlkYmMsIDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQKKy53b3JkCTB4NjNiY2JjZGYsIDB4NzdiNmI2YzEsIDB4YWZkYWRhNzUsIDB4NDIyMTIxNjMKKy53b3JkCTB4MjAxMDEwMzAsIDB4ZTVmZmZmMWEsIDB4ZmRmM2YzMGUsIDB4YmZkMmQyNmQKKy53b3JkCTB4ODFjZGNkNGMsIDB4MTgwYzBjMTQsIDB4MjYxMzEzMzUsIDB4YzNlY2VjMmYKKy53b3JkCTB4YmU1ZjVmZTEsIDB4MzU5Nzk3YTIsIDB4ODg0NDQ0Y2MsIDB4MmUxNzE3MzkKKy53b3JkCTB4OTNjNGM0NTcsIDB4NTVhN2E3ZjIsIDB4ZmM3ZTdlODIsIDB4N2EzZDNkNDcKKy53b3JkCTB4Yzg2NDY0YWMsIDB4YmE1ZDVkZTcsIDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUKKy53b3JkCTB4YzA2MDYwYTAsIDB4MTk4MTgxOTgsIDB4OWU0ZjRmZDEsIDB4YTNkY2RjN2YKKy53b3JkCTB4NDQyMjIyNjYsIDB4NTQyYTJhN2UsIDB4M2I5MDkwYWIsIDB4MGI4ODg4ODMKKy53b3JkCTB4OGM0NjQ2Y2EsIDB4YzdlZWVlMjksIDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MKKy53b3JkCTB4YTdkZWRlNzksIDB4YmM1ZTVlZTIsIDB4MTYwYjBiMWQsIDB4YWRkYmRiNzYKKy53b3JkCTB4ZGJlMGUwM2IsIDB4NjQzMjMyNTYsIDB4NzQzYTNhNGUsIDB4MTQwYTBhMWUKKy53b3JkCTB4OTI0OTQ5ZGIsIDB4MGMwNjA2MGEsIDB4NDgyNDI0NmMsIDB4Yjg1YzVjZTQKKy53b3JkCTB4OWZjMmMyNWQsIDB4YmRkM2QzNmUsIDB4NDNhY2FjZWYsIDB4YzQ2MjYyYTYKKy53b3JkCTB4Mzk5MTkxYTgsIDB4MzE5NTk1YTQsIDB4ZDNlNGU0MzcsIDB4ZjI3OTc5OGIKKy53b3JkCTB4ZDVlN2U3MzIsIDB4OGJjOGM4NDMsIDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcKKy53b3JkCTB4MDE4ZDhkOGMsIDB4YjFkNWQ1NjQsIDB4OWM0ZTRlZDIsIDB4NDlhOWE5ZTAKKy53b3JkCTB4ZDg2YzZjYjQsIDB4YWM1NjU2ZmEsIDB4ZjNmNGY0MDcsIDB4Y2ZlYWVhMjUKKy53b3JkCTB4Y2E2NTY1YWYsIDB4ZjQ3YTdhOGUsIDB4NDdhZWFlZTksIDB4MTAwODA4MTgKKy53b3JkCTB4NmZiYWJhZDUsIDB4ZjA3ODc4ODgsIDB4NGEyNTI1NmYsIDB4NWMyZTJlNzIKKy53b3JkCTB4MzgxYzFjMjQsIDB4NTdhNmE2ZjEsIDB4NzNiNGI0YzcsIDB4OTdjNmM2NTEKKy53b3JkCTB4Y2JlOGU4MjMsIDB4YTFkZGRkN2MsIDB4ZTg3NDc0OWMsIDB4M2UxZjFmMjEKKy53b3JkCTB4OTY0YjRiZGQsIDB4NjFiZGJkZGMsIDB4MGQ4YjhiODYsIDB4MGY4YThhODUKKy53b3JkCTB4ZTA3MDcwOTAsIDB4N2MzZTNlNDIsIDB4NzFiNWI1YzQsIDB4Y2M2NjY2YWEKKy53b3JkCTB4OTA0ODQ4ZDgsIDB4MDYwMzAzMDUsIDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIKKy53b3JkCTB4YzI2MTYxYTMsIDB4NmEzNTM1NWYsIDB4YWU1NzU3ZjksIDB4NjliOWI5ZDAKKy53b3JkCTB4MTc4Njg2OTEsIDB4OTljMWMxNTgsIDB4M2ExZDFkMjcsIDB4Mjc5ZTllYjkKKy53b3JkCTB4ZDllMWUxMzgsIDB4ZWJmOGY4MTMsIDB4MmI5ODk4YjMsIDB4MjIxMTExMzMKKy53b3JkCTB4ZDI2OTY5YmIsIDB4YTlkOWQ5NzAsIDB4MDc4ZThlODksIDB4MzM5NDk0YTcKKy53b3JkCTB4MmQ5YjliYjYsIDB4M2MxZTFlMjIsIDB4MTU4Nzg3OTIsIDB4YzllOWU5MjAKKy53b3JkCTB4ODdjZWNlNDksIDB4YWE1NTU1ZmYsIDB4NTAyODI4NzgsIDB4YTVkZmRmN2EKKy53b3JkCTB4MDM4YzhjOGYsIDB4NTlhMWExZjgsIDB4MDk4OTg5ODAsIDB4MWEwZDBkMTcKKy53b3JkCTB4NjViZmJmZGEsIDB4ZDdlNmU2MzEsIDB4ODQ0MjQyYzYsIDB4ZDA2ODY4YjgKKy53b3JkCTB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEKKy53b3JkCTB4N2JiMGIwY2IsIDB4YTg1NDU0ZmMsIDB4NmRiYmJiZDYsIDB4MmMxNjE2M2EKK0AgVGU0WzI1Nl0KKy5ieXRlCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUKKy5ieXRlCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYKKy5ieXRlCTB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAKKy5ieXRlCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAKKy5ieXRlCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MKKy5ieXRlCTB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUKKy5ieXRlCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEKKy5ieXRlCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUKKy5ieXRlCTB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAKKy5ieXRlCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQKKy5ieXRlCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIKKy5ieXRlCTB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YKKy5ieXRlCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUKKy5ieXRlCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgKKy5ieXRlCTB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUKKy5ieXRlCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIKKy5ieXRlCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcKKy5ieXRlCTB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMKKy5ieXRlCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgKKy5ieXRlCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIKKy5ieXRlCTB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMKKy5ieXRlCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkKKy5ieXRlCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkKKy5ieXRlCTB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgKKy5ieXRlCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYKKy5ieXRlCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEKKy5ieXRlCTB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUKKy5ieXRlCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUKKy5ieXRlCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQKKy5ieXRlCTB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYKKy5ieXRlCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgKKy5ieXRlCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK0AgcmNvbltdCisud29yZAkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwCisud29yZAkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwCisud29yZAkweDFCMDAwMDAwLCAweDM2MDAwMDAwLCAwLCAwLCAwLCAwLCAwLCAwCisuc2l6ZQlBRVNfVGUsLi1BRVNfVGUKKworQCB2b2lkIGFlc19ub2h3X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKK0AgCQkgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXkpIHsKKy5nbG9ibAlhZXNfbm9od19lbmNyeXB0CisuaGlkZGVuCWFlc19ub2h3X2VuY3J5cHQKKy50eXBlCWFlc19ub2h3X2VuY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX25vaHdfZW5jcnlwdDoKKyNpZm5kZWYJX190aHVtYjJfXworCXN1YglyMyxwYywjOAkJQCBhZXNfbm9od19lbmNyeXB0CisjZWxzZQorCWFkcglyMywuCisjZW5kaWYKKwlzdG1kYglzcCEse3IxLHI0LXIxMixscn0KKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorCWFkcglyMTAsQUVTX1RlCisjZWxzZQorCXN1YglyMTAscjMsI2Flc19ub2h3X2VuY3J5cHQtQUVTX1RlCUAgVGUKKyNlbmRpZgorCW1vdglyMTIscjAJCUAgaW5wCisJbW92CXIxMSxyMgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMCxbcjEyLCMzXQlAIGxvYWQgaW5wdXQgZGF0YSBpbiBlbmRpYW4tbmV1dHJhbAorCWxkcmIJcjQsW3IxMiwjMl0JQCBtYW5uZXIuLi4KKwlsZHJiCXI1LFtyMTIsIzFdCisJbGRyYglyNixbcjEyLCMwXQorCW9ycglyMCxyMCxyNCxsc2wjOAorCWxkcmIJcjEsW3IxMiwjN10KKwlvcnIJcjAscjAscjUsbHNsIzE2CisJbGRyYglyNCxbcjEyLCM2XQorCW9ycglyMCxyMCxyNixsc2wjMjQKKwlsZHJiCXI1LFtyMTIsIzVdCisJbGRyYglyNixbcjEyLCM0XQorCW9ycglyMSxyMSxyNCxsc2wjOAorCWxkcmIJcjIsW3IxMiwjMTFdCisJb3JyCXIxLHIxLHI1LGxzbCMxNgorCWxkcmIJcjQsW3IxMiwjMTBdCisJb3JyCXIxLHIxLHI2LGxzbCMyNAorCWxkcmIJcjUsW3IxMiwjOV0KKwlsZHJiCXI2LFtyMTIsIzhdCisJb3JyCXIyLHIyLHI0LGxzbCM4CisJbGRyYglyMyxbcjEyLCMxNV0KKwlvcnIJcjIscjIscjUsbHNsIzE2CisJbGRyYglyNCxbcjEyLCMxNF0KKwlvcnIJcjIscjIscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCMxM10KKwlsZHJiCXI2LFtyMTIsIzEyXQorCW9ycglyMyxyMyxyNCxsc2wjOAorCW9ycglyMyxyMyxyNSxsc2wjMTYKKwlvcnIJcjMscjMscjYsbHNsIzI0CisjZWxzZQorCWxkcglyMCxbcjEyLCMwXQorCWxkcglyMSxbcjEyLCM0XQorCWxkcglyMixbcjEyLCM4XQorCWxkcglyMyxbcjEyLCMxMl0KKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjAscjAKKwlyZXYJcjEscjEKKwlyZXYJcjIscjIKKwlyZXYJcjMscjMKKyNlbmRpZgorI2VuZGlmCisJYmwJX2FybXY0X0FFU19lbmNyeXB0CisKKwlsZHIJcjEyLFtzcF0sIzQJCUAgcG9wIG91dAorI2lmIF9fQVJNX0FSQ0hfXz49NworI2lmZGVmIF9fQVJNRUxfXworCXJldglyMCxyMAorCXJldglyMSxyMQorCXJldglyMixyMgorCXJldglyMyxyMworI2VuZGlmCisJc3RyCXIwLFtyMTIsIzBdCisJc3RyCXIxLFtyMTIsIzRdCisJc3RyCXIyLFtyMTIsIzhdCisJc3RyCXIzLFtyMTIsIzEyXQorI2Vsc2UKKwltb3YJcjQscjAsbHNyIzI0CQlAIHdyaXRlIG91dHB1dCBpbiBlbmRpYW4tbmV1dHJhbAorCW1vdglyNSxyMCxsc3IjMTYJCUAgbWFubmVyLi4uCisJbW92CXI2LHIwLGxzciM4CisJc3RyYglyNCxbcjEyLCMwXQorCXN0cmIJcjUsW3IxMiwjMV0KKwltb3YJcjQscjEsbHNyIzI0CisJc3RyYglyNixbcjEyLCMyXQorCW1vdglyNSxyMSxsc3IjMTYKKwlzdHJiCXIwLFtyMTIsIzNdCisJbW92CXI2LHIxLGxzciM4CisJc3RyYglyNCxbcjEyLCM0XQorCXN0cmIJcjUsW3IxMiwjNV0KKwltb3YJcjQscjIsbHNyIzI0CisJc3RyYglyNixbcjEyLCM2XQorCW1vdglyNSxyMixsc3IjMTYKKwlzdHJiCXIxLFtyMTIsIzddCisJbW92CXI2LHIyLGxzciM4CisJc3RyYglyNCxbcjEyLCM4XQorCXN0cmIJcjUsW3IxMiwjOV0KKwltb3YJcjQscjMsbHNyIzI0CisJc3RyYglyNixbcjEyLCMxMF0KKwltb3YJcjUscjMsbHNyIzE2CisJc3RyYglyMixbcjEyLCMxMV0KKwltb3YJcjYscjMsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzEyXQorCXN0cmIJcjUsW3IxMiwjMTNdCisJc3RyYglyNixbcjEyLCMxNF0KKwlzdHJiCXIzLFtyMTIsIzE1XQorI2VuZGlmCisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0Cisud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5zaXplCWFlc19ub2h3X2VuY3J5cHQsLi1hZXNfbm9od19lbmNyeXB0CisKKy50eXBlCV9hcm12NF9BRVNfZW5jcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgkyCitfYXJtdjRfQUVTX2VuY3J5cHQ6CisJc3RyCWxyLFtzcCwjLTRdIQkJQCBwdXNoIGxyCisJbGRtaWEJcjExISx7cjQscjUscjYscjd9CisJZW9yCXIwLHIwLHI0CisJbGRyCXIxMixbcjExLCMyNDAtMTZdCisJZW9yCXIxLHIxLHI1CisJZW9yCXIyLHIyLHI2CisJZW9yCXIzLHIzLHI3CisJc3ViCXIxMixyMTIsIzEKKwltb3YJbHIsIzI1NQorCisJYW5kCXI3LGxyLHIwCisJYW5kCXI4LGxyLHIwLGxzciM4CisJYW5kCXI5LGxyLHIwLGxzciMxNgorCW1vdglyMCxyMCxsc3IjMjQKKy5MZW5jX2xvb3A6CisJbGRyCXI0LFtyMTAscjcsbHNsIzJdCUAgVGUzW3MwPj4wXQorCWFuZAlyNyxscixyMSxsc3IjMTYJQCBpMAorCWxkcglyNSxbcjEwLHI4LGxzbCMyXQlAIFRlMltzMD4+OF0KKwlhbmQJcjgsbHIscjEKKwlsZHIJcjYsW3IxMCxyOSxsc2wjMl0JQCBUZTFbczA+PjE2XQorCWFuZAlyOSxscixyMSxsc3IjOAorCWxkcglyMCxbcjEwLHIwLGxzbCMyXQlAIFRlMFtzMD4+MjRdCisJbW92CXIxLHIxLGxzciMyNAorCisJbGRyCXI3LFtyMTAscjcsbHNsIzJdCUAgVGUxW3MxPj4xNl0KKwlsZHIJcjgsW3IxMCxyOCxsc2wjMl0JQCBUZTNbczE+PjBdCisJbGRyCXI5LFtyMTAscjksbHNsIzJdCUAgVGUyW3MxPj44XQorCWVvcglyMCxyMCxyNyxyb3IjOAorCWxkcglyMSxbcjEwLHIxLGxzbCMyXQlAIFRlMFtzMT4+MjRdCisJYW5kCXI3LGxyLHIyLGxzciM4CUAgaTAKKwllb3IJcjUscjUscjgscm9yIzgKKwlhbmQJcjgsbHIscjIsbHNyIzE2CUAgaTEKKwllb3IJcjYscjYscjkscm9yIzgKKwlhbmQJcjksbHIscjIKKwlsZHIJcjcsW3IxMCxyNyxsc2wjMl0JQCBUZTJbczI+PjhdCisJZW9yCXIxLHIxLHI0LHJvciMyNAorCWxkcglyOCxbcjEwLHI4LGxzbCMyXQlAIFRlMVtzMj4+MTZdCisJbW92CXIyLHIyLGxzciMyNAorCisJbGRyCXI5LFtyMTAscjksbHNsIzJdCUAgVGUzW3MyPj4wXQorCWVvcglyMCxyMCxyNyxyb3IjMTYKKwlsZHIJcjIsW3IxMCxyMixsc2wjMl0JQCBUZTBbczI+PjI0XQorCWFuZAlyNyxscixyMwkJQCBpMAorCWVvcglyMSxyMSxyOCxyb3IjOAorCWFuZAlyOCxscixyMyxsc3IjOAlAIGkxCisJZW9yCXI2LHI2LHI5LHJvciMxNgorCWFuZAlyOSxscixyMyxsc3IjMTYJQCBpMgorCWxkcglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlM1tzMz4+MF0KKwllb3IJcjIscjIscjUscm9yIzE2CisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGUyW3MzPj44XQorCW1vdglyMyxyMyxsc3IjMjQKKworCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlMVtzMz4+MTZdCisJZW9yCXIwLHIwLHI3LHJvciMyNAorCWxkcglyNyxbcjExXSwjMTYKKwllb3IJcjEscjEscjgscm9yIzE2CisJbGRyCXIzLFtyMTAscjMsbHNsIzJdCUAgVGUwW3MzPj4yNF0KKwllb3IJcjIscjIscjkscm9yIzgKKwlsZHIJcjQsW3IxMSwjLTEyXQorCWVvcglyMyxyMyxyNixyb3IjOAorCisJbGRyCXI1LFtyMTEsIy04XQorCWVvcglyMCxyMCxyNworCWxkcglyNixbcjExLCMtNF0KKwlhbmQJcjcsbHIscjAKKwllb3IJcjEscjEscjQKKwlhbmQJcjgsbHIscjAsbHNyIzgKKwllb3IJcjIscjIscjUKKwlhbmQJcjksbHIscjAsbHNyIzE2CisJZW9yCXIzLHIzLHI2CisJbW92CXIwLHIwLGxzciMyNAorCisJc3VicwlyMTIscjEyLCMxCisJYm5lCS5MZW5jX2xvb3AKKworCWFkZAlyMTAscjEwLCMyCisKKwlsZHJiCXI0LFtyMTAscjcsbHNsIzJdCUAgVGU0W3MwPj4wXQorCWFuZAlyNyxscixyMSxsc3IjMTYJQCBpMAorCWxkcmIJcjUsW3IxMCxyOCxsc2wjMl0JQCBUZTRbczA+PjhdCisJYW5kCXI4LGxyLHIxCisJbGRyYglyNixbcjEwLHI5LGxzbCMyXQlAIFRlNFtzMD4+MTZdCisJYW5kCXI5LGxyLHIxLGxzciM4CisJbGRyYglyMCxbcjEwLHIwLGxzbCMyXQlAIFRlNFtzMD4+MjRdCisJbW92CXIxLHIxLGxzciMyNAorCisJbGRyYglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlNFtzMT4+MTZdCisJbGRyYglyOCxbcjEwLHI4LGxzbCMyXQlAIFRlNFtzMT4+MF0KKwlsZHJiCXI5LFtyMTAscjksbHNsIzJdCUAgVGU0W3MxPj44XQorCWVvcglyMCxyNyxyMCxsc2wjOAorCWxkcmIJcjEsW3IxMCxyMSxsc2wjMl0JQCBUZTRbczE+PjI0XQorCWFuZAlyNyxscixyMixsc3IjOAlAIGkwCisJZW9yCXI1LHI4LHI1LGxzbCM4CisJYW5kCXI4LGxyLHIyLGxzciMxNglAIGkxCisJZW9yCXI2LHI5LHI2LGxzbCM4CisJYW5kCXI5LGxyLHIyCisJbGRyYglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlNFtzMj4+OF0KKwllb3IJcjEscjQscjEsbHNsIzI0CisJbGRyYglyOCxbcjEwLHI4LGxzbCMyXQlAIFRlNFtzMj4+MTZdCisJbW92CXIyLHIyLGxzciMyNAorCisJbGRyYglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlNFtzMj4+MF0KKwllb3IJcjAscjcscjAsbHNsIzgKKwlsZHJiCXIyLFtyMTAscjIsbHNsIzJdCUAgVGU0W3MyPj4yNF0KKwlhbmQJcjcsbHIscjMJCUAgaTAKKwllb3IJcjEscjEscjgsbHNsIzE2CisJYW5kCXI4LGxyLHIzLGxzciM4CUAgaTEKKwllb3IJcjYscjkscjYsbHNsIzgKKwlhbmQJcjksbHIscjMsbHNyIzE2CUAgaTIKKwlsZHJiCXI3LFtyMTAscjcsbHNsIzJdCUAgVGU0W3MzPj4wXQorCWVvcglyMixyNSxyMixsc2wjMjQKKwlsZHJiCXI4LFtyMTAscjgsbHNsIzJdCUAgVGU0W3MzPj44XQorCW1vdglyMyxyMyxsc3IjMjQKKworCWxkcmIJcjksW3IxMCxyOSxsc2wjMl0JQCBUZTRbczM+PjE2XQorCWVvcglyMCxyNyxyMCxsc2wjOAorCWxkcglyNyxbcjExLCMwXQorCWxkcmIJcjMsW3IxMCxyMyxsc2wjMl0JQCBUZTRbczM+PjI0XQorCWVvcglyMSxyMSxyOCxsc2wjOAorCWxkcglyNCxbcjExLCM0XQorCWVvcglyMixyMixyOSxsc2wjMTYKKwlsZHIJcjUsW3IxMSwjOF0KKwllb3IJcjMscjYscjMsbHNsIzI0CisJbGRyCXI2LFtyMTEsIzEyXQorCisJZW9yCXIwLHIwLHI3CisJZW9yCXIxLHIxLHI0CisJZW9yCXIyLHIyLHI1CisJZW9yCXIzLHIzLHI2CisKKwlzdWIJcjEwLHIxMCwjMgorCWxkcglwYyxbc3BdLCM0CQlAIHBvcCBhbmQgcmV0dXJuCisuc2l6ZQlfYXJtdjRfQUVTX2VuY3J5cHQsLi1fYXJtdjRfQUVTX2VuY3J5cHQKKworLmdsb2JsCWFlc19ub2h3X3NldF9lbmNyeXB0X2tleQorLmhpZGRlbglhZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCWFlc19ub2h3X3NldF9lbmNyeXB0X2tleSwlZnVuY3Rpb24KKy5hbGlnbgk1CithZXNfbm9od19zZXRfZW5jcnlwdF9rZXk6CitfYXJtdjRfQUVTX3NldF9lbmNyeXB0X2tleToKKyNpZm5kZWYJX190aHVtYjJfXworCXN1YglyMyxwYywjOAkJQCBhZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKyNlbHNlCisJYWRyCXIzLC4KKyNlbmRpZgorCXRlcQlyMCwjMAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJZXEJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJbW92ZXEJcjAsIy0xCisJYmVxCS5MYWJydAorCXRlcQlyMiwjMAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJZXEJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJbW92ZXEJcjAsIy0xCisJYmVxCS5MYWJydAorCisJdGVxCXIxLCMxMjgKKwliZXEJLkxvaworCXRlcQlyMSwjMTkyCisJYmVxCS5Mb2sKKwl0ZXEJcjEsIzI1NgorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJbmUJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJbW92bmUJcjAsIy0xCisJYm5lCS5MYWJydAorCisuTG9rOglzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCW1vdglyMTIscjAJCUAgaW5wCisJbW92CWxyLHIxCQkJQCBiaXRzCisJbW92CXIxMSxyMgkJCUAga2V5CisKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorCWFkcglyMTAsQUVTX1RlKzEwMjQJCQkJQCBUZTQKKyNlbHNlCisJc3ViCXIxMCxyMywjX2FybXY0X0FFU19zZXRfZW5jcnlwdF9rZXktQUVTX1RlLTEwMjQJQCBUZTQKKyNlbmRpZgorCisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCXIwLFtyMTIsIzNdCUAgbG9hZCBpbnB1dCBkYXRhIGluIGVuZGlhbi1uZXV0cmFsCisJbGRyYglyNCxbcjEyLCMyXQlAIG1hbm5lci4uLgorCWxkcmIJcjUsW3IxMiwjMV0KKwlsZHJiCXI2LFtyMTIsIzBdCisJb3JyCXIwLHIwLHI0LGxzbCM4CisJbGRyYglyMSxbcjEyLCM3XQorCW9ycglyMCxyMCxyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzZdCisJb3JyCXIwLHIwLHI2LGxzbCMyNAorCWxkcmIJcjUsW3IxMiwjNV0KKwlsZHJiCXI2LFtyMTIsIzRdCisJb3JyCXIxLHIxLHI0LGxzbCM4CisJbGRyYglyMixbcjEyLCMxMV0KKwlvcnIJcjEscjEscjUsbHNsIzE2CisJbGRyYglyNCxbcjEyLCMxMF0KKwlvcnIJcjEscjEscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCM5XQorCWxkcmIJcjYsW3IxMiwjOF0KKwlvcnIJcjIscjIscjQsbHNsIzgKKwlsZHJiCXIzLFtyMTIsIzE1XQorCW9ycglyMixyMixyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzE0XQorCW9ycglyMixyMixyNixsc2wjMjQKKwlsZHJiCXI1LFtyMTIsIzEzXQorCWxkcmIJcjYsW3IxMiwjMTJdCisJb3JyCXIzLHIzLHI0LGxzbCM4CisJc3RyCXIwLFtyMTFdLCMxNgorCW9ycglyMyxyMyxyNSxsc2wjMTYKKwlzdHIJcjEsW3IxMSwjLTEyXQorCW9ycglyMyxyMyxyNixsc2wjMjQKKwlzdHIJcjIsW3IxMSwjLThdCisJc3RyCXIzLFtyMTEsIy00XQorI2Vsc2UKKwlsZHIJcjAsW3IxMiwjMF0KKwlsZHIJcjEsW3IxMiwjNF0KKwlsZHIJcjIsW3IxMiwjOF0KKwlsZHIJcjMsW3IxMiwjMTJdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisjZW5kaWYKKwlzdHIJcjAsW3IxMV0sIzE2CisJc3RyCXIxLFtyMTEsIy0xMl0KKwlzdHIJcjIsW3IxMSwjLThdCisJc3RyCXIzLFtyMTEsIy00XQorI2VuZGlmCisKKwl0ZXEJbHIsIzEyOAorCWJuZQkuTG5vdDEyOAorCW1vdglyMTIsIzEwCisJc3RyCXIxMixbcjExLCMyNDAtMTZdCisJYWRkCXI2LHIxMCwjMjU2CQkJQCByY29uCisJbW92CWxyLCMyNTUKKworLkwxMjhfbG9vcDoKKwlhbmQJcjUsbHIscjMsbHNyIzI0CisJYW5kCXI3LGxyLHIzLGxzciMxNgorCWxkcmIJcjUsW3IxMCxyNV0KKwlhbmQJcjgsbHIscjMsbHNyIzgKKwlsZHJiCXI3LFtyMTAscjddCisJYW5kCXI5LGxyLHIzCisJbGRyYglyOCxbcjEwLHI4XQorCW9ycglyNSxyNSxyNyxsc2wjMjQKKwlsZHJiCXI5LFtyMTAscjldCisJb3JyCXI1LHI1LHI4LGxzbCMxNgorCWxkcglyNCxbcjZdLCM0CQkJQCByY29uW2krK10KKwlvcnIJcjUscjUscjksbHNsIzgKKwllb3IJcjUscjUscjQKKwllb3IJcjAscjAscjUJCQlAIHJrWzRdPXJrWzBdXi4uLgorCWVvcglyMSxyMSxyMAkJCUAgcmtbNV09cmtbMV1ecmtbNF0KKwlzdHIJcjAsW3IxMV0sIzE2CisJZW9yCXIyLHIyLHIxCQkJQCBya1s2XT1ya1syXV5ya1s1XQorCXN0cglyMSxbcjExLCMtMTJdCisJZW9yCXIzLHIzLHIyCQkJQCBya1s3XT1ya1szXV5ya1s2XQorCXN0cglyMixbcjExLCMtOF0KKwlzdWJzCXIxMixyMTIsIzEKKwlzdHIJcjMsW3IxMSwjLTRdCisJYm5lCS5MMTI4X2xvb3AKKwlzdWIJcjIscjExLCMxNzYKKwliCS5MZG9uZQorCisuTG5vdDEyODoKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjgsW3IxMiwjMTldCisJbGRyYglyNCxbcjEyLCMxOF0KKwlsZHJiCXI1LFtyMTIsIzE3XQorCWxkcmIJcjYsW3IxMiwjMTZdCisJb3JyCXI4LHI4LHI0LGxzbCM4CisJbGRyYglyOSxbcjEyLCMyM10KKwlvcnIJcjgscjgscjUsbHNsIzE2CisJbGRyYglyNCxbcjEyLCMyMl0KKwlvcnIJcjgscjgscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCMyMV0KKwlsZHJiCXI2LFtyMTIsIzIwXQorCW9ycglyOSxyOSxyNCxsc2wjOAorCW9ycglyOSxyOSxyNSxsc2wjMTYKKwlzdHIJcjgsW3IxMV0sIzgKKwlvcnIJcjkscjkscjYsbHNsIzI0CisJc3RyCXI5LFtyMTEsIy00XQorI2Vsc2UKKwlsZHIJcjgsW3IxMiwjMTZdCisJbGRyCXI5LFtyMTIsIzIwXQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyOCxyOAorCXJldglyOSxyOQorI2VuZGlmCisJc3RyCXI4LFtyMTFdLCM4CisJc3RyCXI5LFtyMTEsIy00XQorI2VuZGlmCisKKwl0ZXEJbHIsIzE5MgorCWJuZQkuTG5vdDE5MgorCW1vdglyMTIsIzEyCisJc3RyCXIxMixbcjExLCMyNDAtMjRdCisJYWRkCXI2LHIxMCwjMjU2CQkJQCByY29uCisJbW92CWxyLCMyNTUKKwltb3YJcjEyLCM4CisKKy5MMTkyX2xvb3A6CisJYW5kCXI1LGxyLHI5LGxzciMyNAorCWFuZAlyNyxscixyOSxsc3IjMTYKKwlsZHJiCXI1LFtyMTAscjVdCisJYW5kCXI4LGxyLHI5LGxzciM4CisJbGRyYglyNyxbcjEwLHI3XQorCWFuZAlyOSxscixyOQorCWxkcmIJcjgsW3IxMCxyOF0KKwlvcnIJcjUscjUscjcsbHNsIzI0CisJbGRyYglyOSxbcjEwLHI5XQorCW9ycglyNSxyNSxyOCxsc2wjMTYKKwlsZHIJcjQsW3I2XSwjNAkJCUAgcmNvbltpKytdCisJb3JyCXI1LHI1LHI5LGxzbCM4CisJZW9yCXI5LHI1LHI0CisJZW9yCXIwLHIwLHI5CQkJQCBya1s2XT1ya1swXV4uLi4KKwllb3IJcjEscjEscjAJCQlAIHJrWzddPXJrWzFdXnJrWzZdCisJc3RyCXIwLFtyMTFdLCMyNAorCWVvcglyMixyMixyMQkJCUAgcmtbOF09cmtbMl1ecmtbN10KKwlzdHIJcjEsW3IxMSwjLTIwXQorCWVvcglyMyxyMyxyMgkJCUAgcmtbOV09cmtbM11ecmtbOF0KKwlzdHIJcjIsW3IxMSwjLTE2XQorCXN1YnMJcjEyLHIxMiwjMQorCXN0cglyMyxbcjExLCMtMTJdCisjaWZkZWYJX190aHVtYjJfXworCWl0dAllcQkJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJc3ViZXEJcjIscjExLCMyMTYKKwliZXEJLkxkb25lCisKKwlsZHIJcjcsW3IxMSwjLTMyXQorCWxkcglyOCxbcjExLCMtMjhdCisJZW9yCXI3LHI3LHIzCQkJQCBya1sxMF09cmtbNF1ecmtbOV0KKwllb3IJcjkscjgscjcJCQlAIHJrWzExXT1ya1s1XV5ya1sxMF0KKwlzdHIJcjcsW3IxMSwjLThdCisJc3RyCXI5LFtyMTEsIy00XQorCWIJLkwxOTJfbG9vcAorCisuTG5vdDE5MjoKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjgsW3IxMiwjMjddCisJbGRyYglyNCxbcjEyLCMyNl0KKwlsZHJiCXI1LFtyMTIsIzI1XQorCWxkcmIJcjYsW3IxMiwjMjRdCisJb3JyCXI4LHI4LHI0LGxzbCM4CisJbGRyYglyOSxbcjEyLCMzMV0KKwlvcnIJcjgscjgscjUsbHNsIzE2CisJbGRyYglyNCxbcjEyLCMzMF0KKwlvcnIJcjgscjgscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCMyOV0KKwlsZHJiCXI2LFtyMTIsIzI4XQorCW9ycglyOSxyOSxyNCxsc2wjOAorCW9ycglyOSxyOSxyNSxsc2wjMTYKKwlzdHIJcjgsW3IxMV0sIzgKKwlvcnIJcjkscjkscjYsbHNsIzI0CisJc3RyCXI5LFtyMTEsIy00XQorI2Vsc2UKKwlsZHIJcjgsW3IxMiwjMjRdCisJbGRyCXI5LFtyMTIsIzI4XQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyOCxyOAorCXJldglyOSxyOQorI2VuZGlmCisJc3RyCXI4LFtyMTFdLCM4CisJc3RyCXI5LFtyMTEsIy00XQorI2VuZGlmCisKKwltb3YJcjEyLCMxNAorCXN0cglyMTIsW3IxMSwjMjQwLTMyXQorCWFkZAlyNixyMTAsIzI1NgkJCUAgcmNvbgorCW1vdglsciwjMjU1CisJbW92CXIxMiwjNworCisuTDI1Nl9sb29wOgorCWFuZAlyNSxscixyOSxsc3IjMjQKKwlhbmQJcjcsbHIscjksbHNyIzE2CisJbGRyYglyNSxbcjEwLHI1XQorCWFuZAlyOCxscixyOSxsc3IjOAorCWxkcmIJcjcsW3IxMCxyN10KKwlhbmQJcjksbHIscjkKKwlsZHJiCXI4LFtyMTAscjhdCisJb3JyCXI1LHI1LHI3LGxzbCMyNAorCWxkcmIJcjksW3IxMCxyOV0KKwlvcnIJcjUscjUscjgsbHNsIzE2CisJbGRyCXI0LFtyNl0sIzQJCQlAIHJjb25baSsrXQorCW9ycglyNSxyNSxyOSxsc2wjOAorCWVvcglyOSxyNSxyNAorCWVvcglyMCxyMCxyOQkJCUAgcmtbOF09cmtbMF1eLi4uCisJZW9yCXIxLHIxLHIwCQkJQCBya1s5XT1ya1sxXV5ya1s4XQorCXN0cglyMCxbcjExXSwjMzIKKwllb3IJcjIscjIscjEJCQlAIHJrWzEwXT1ya1syXV5ya1s5XQorCXN0cglyMSxbcjExLCMtMjhdCisJZW9yCXIzLHIzLHIyCQkJQCBya1sxMV09cmtbM11ecmtbMTBdCisJc3RyCXIyLFtyMTEsIy0yNF0KKwlzdWJzCXIxMixyMTIsIzEKKwlzdHIJcjMsW3IxMSwjLTIwXQorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJZXEJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKyNlbmRpZgorCXN1YmVxCXIyLHIxMSwjMjU2CisJYmVxCS5MZG9uZQorCisJYW5kCXI1LGxyLHIzCisJYW5kCXI3LGxyLHIzLGxzciM4CisJbGRyYglyNSxbcjEwLHI1XQorCWFuZAlyOCxscixyMyxsc3IjMTYKKwlsZHJiCXI3LFtyMTAscjddCisJYW5kCXI5LGxyLHIzLGxzciMyNAorCWxkcmIJcjgsW3IxMCxyOF0KKwlvcnIJcjUscjUscjcsbHNsIzgKKwlsZHJiCXI5LFtyMTAscjldCisJb3JyCXI1LHI1LHI4LGxzbCMxNgorCWxkcglyNCxbcjExLCMtNDhdCisJb3JyCXI1LHI1LHI5LGxzbCMyNAorCisJbGRyCXI3LFtyMTEsIy00NF0KKwlsZHIJcjgsW3IxMSwjLTQwXQorCWVvcglyNCxyNCxyNQkJCUAgcmtbMTJdPXJrWzRdXi4uLgorCWxkcglyOSxbcjExLCMtMzZdCisJZW9yCXI3LHI3LHI0CQkJQCBya1sxM109cmtbNV1ecmtbMTJdCisJc3RyCXI0LFtyMTEsIy0xNl0KKwllb3IJcjgscjgscjcJCQlAIHJrWzE0XT1ya1s2XV5ya1sxM10KKwlzdHIJcjcsW3IxMSwjLTEyXQorCWVvcglyOSxyOSxyOAkJCUAgcmtbMTVdPXJrWzddXnJrWzE0XQorCXN0cglyOCxbcjExLCMtOF0KKwlzdHIJcjksW3IxMSwjLTRdCisJYgkuTDI1Nl9sb29wCisKKy5hbGlnbgkyCisuTGRvbmU6CW1vdglyMCwjMAorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisuTGFicnQ6CisjaWYgX19BUk1fQVJDSF9fPj01CisJYngJbHIJCQkJQCAud29yZAkweGUxMmZmZjFlCisjZWxzZQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKy53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorLnNpemUJYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5LC4tYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5CisKKy5nbG9ibAlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXkKKy5oaWRkZW4JYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXksJWZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5OgorCXN0cglscixbc3AsIy00XSEgICAgICAgICAgICBAIHB1c2ggbHIKKwlibAlfYXJtdjRfQUVTX3NldF9lbmNyeXB0X2tleQorCXRlcQlyMCwjMAorCWxkcglscixbc3BdLCM0ICAgICAgICAgICAgICBAIHBvcCBscgorCWJuZQkuTGFicnQKKworCW1vdglyMCxyMgkJCUAgYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5IHByZXNlcnZlcyByMiwKKwltb3YJcjEscjIJCQlAIHdoaWNoIGlzIEFFU19LRVkgKmtleQorCWIJX2FybXY0X0FFU19zZXRfZW5jMmRlY19rZXkKKy5zaXplCWFlc19ub2h3X3NldF9kZWNyeXB0X2tleSwuLWFlc19ub2h3X3NldF9kZWNyeXB0X2tleQorCitAIHZvaWQgQUVTX3NldF9lbmMyZGVjX2tleShjb25zdCBBRVNfS0VZICppbnAsQUVTX0tFWSAqb3V0KQorLmdsb2JsCUFFU19zZXRfZW5jMmRlY19rZXkKKy5oaWRkZW4JQUVTX3NldF9lbmMyZGVjX2tleQorLnR5cGUJQUVTX3NldF9lbmMyZGVjX2tleSwlZnVuY3Rpb24KKy5hbGlnbgk1CitBRVNfc2V0X2VuYzJkZWNfa2V5OgorX2FybXY0X0FFU19zZXRfZW5jMmRlY19rZXk6CisJc3RtZGIJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0KKworCWxkcglyMTIsW3IwLCMyNDBdCisJbW92CXI3LHIwCQkJQCBpbnB1dAorCWFkZAlyOCxyMCxyMTIsbHNsIzQKKwltb3YJcjExLHIxCQkJQCBvdXRwdXQKKwlhZGQJcjEwLHIxLHIxMixsc2wjNAorCXN0cglyMTIsW3IxLCMyNDBdCisKKy5MaW52OglsZHIJcjAsW3I3XSwjMTYKKwlsZHIJcjEsW3I3LCMtMTJdCisJbGRyCXIyLFtyNywjLThdCisJbGRyCXIzLFtyNywjLTRdCisJbGRyCXI0LFtyOF0sIy0xNgorCWxkcglyNSxbcjgsIzE2KzRdCisJbGRyCXI2LFtyOCwjMTYrOF0KKwlsZHIJcjksW3I4LCMxNisxMl0KKwlzdHIJcjAsW3IxMF0sIy0xNgorCXN0cglyMSxbcjEwLCMxNis0XQorCXN0cglyMixbcjEwLCMxNis4XQorCXN0cglyMyxbcjEwLCMxNisxMl0KKwlzdHIJcjQsW3IxMV0sIzE2CisJc3RyCXI1LFtyMTEsIy0xMl0KKwlzdHIJcjYsW3IxMSwjLThdCisJc3RyCXI5LFtyMTEsIy00XQorCXRlcQlyNyxyOAorCWJuZQkuTGludgorCisJbGRyCXIwLFtyN10KKwlsZHIJcjEsW3I3LCM0XQorCWxkcglyMixbcjcsIzhdCisJbGRyCXIzLFtyNywjMTJdCisJc3RyCXIwLFtyMTFdCisJc3RyCXIxLFtyMTEsIzRdCisJc3RyCXIyLFtyMTEsIzhdCisJc3RyCXIzLFtyMTEsIzEyXQorCXN1YglyMTEscjExLHIxMixsc2wjMworCWxkcglyMCxbcjExLCMxNl0hCQlAIHByZWZldGNoIHRwMQorCW1vdglyNywjMHg4MAorCW1vdglyOCwjMHgxYgorCW9ycglyNyxyNywjMHg4MDAwCisJb3JyCXI4LHI4LCMweDFiMDAKKwlvcnIJcjcscjcscjcsbHNsIzE2CisJb3JyCXI4LHI4LHI4LGxzbCMxNgorCXN1YglyMTIscjEyLCMxCisJbXZuCXI5LHI3CisJbW92CXIxMixyMTIsbHNsIzIJQCAocm91bmRzLTEpKjQKKworLkxtaXg6CWFuZAlyNCxyMCxyNworCWFuZAlyMSxyMCxyOQorCXN1YglyNCxyNCxyNCxsc3IjNworCWFuZAlyNCxyNCxyOAorCWVvcglyMSxyNCxyMSxsc2wjMQlAIHRwMgorCisJYW5kCXI0LHIxLHI3CisJYW5kCXIyLHIxLHI5CisJc3ViCXI0LHI0LHI0LGxzciM3CisJYW5kCXI0LHI0LHI4CisJZW9yCXIyLHI0LHIyLGxzbCMxCUAgdHA0CisKKwlhbmQJcjQscjIscjcKKwlhbmQJcjMscjIscjkKKwlzdWIJcjQscjQscjQsbHNyIzcKKwlhbmQJcjQscjQscjgKKwllb3IJcjMscjQscjMsbHNsIzEJQCB0cDgKKworCWVvcglyNCxyMSxyMgorCWVvcglyNSxyMCxyMwkJQCB0cDkKKwllb3IJcjQscjQscjMJCUAgdHBlCisJZW9yCXI0LHI0LHIxLHJvciMyNAorCWVvcglyNCxyNCxyNSxyb3IjMjQJQCBePSBST1RBVEUodHBiPXRwOV50cDIsOCkKKwllb3IJcjQscjQscjIscm9yIzE2CisJZW9yCXI0LHI0LHI1LHJvciMxNglAIF49IFJPVEFURSh0cGQ9dHA5XnRwNCwxNikKKwllb3IJcjQscjQscjUscm9yIzgJQCBePSBST1RBVEUodHA5LDI0KQorCisJbGRyCXIwLFtyMTEsIzRdCQlAIHByZWZldGNoIHRwMQorCXN0cglyNCxbcjExXSwjNAorCXN1YnMJcjEyLHIxMiwjMQorCWJuZQkuTG1peAorCisJbW92CXIwLCMwCisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0Cisud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5zaXplCUFFU19zZXRfZW5jMmRlY19rZXksLi1BRVNfc2V0X2VuYzJkZWNfa2V5CisKKy50eXBlCUFFU19UZCwlb2JqZWN0CisuYWxpZ24JNQorQUVTX1RkOgorLndvcmQJMHg1MWY0YTc1MCwgMHg3ZTQxNjU1MywgMHgxYTE3YTRjMywgMHgzYTI3NWU5NgorLndvcmQJMHgzYmFiNmJjYiwgMHgxZjlkNDVmMSwgMHhhY2ZhNThhYiwgMHg0YmUzMDM5MworLndvcmQJMHgyMDMwZmE1NSwgMHhhZDc2NmRmNiwgMHg4OGNjNzY5MSwgMHhmNTAyNGMyNQorLndvcmQJMHg0ZmU1ZDdmYywgMHhjNTJhY2JkNywgMHgyNjM1NDQ4MCwgMHhiNTYyYTM4ZgorLndvcmQJMHhkZWIxNWE0OSwgMHgyNWJhMWI2NywgMHg0NWVhMGU5OCwgMHg1ZGZlYzBlMQorLndvcmQJMHhjMzJmNzUwMiwgMHg4MTRjZjAxMiwgMHg4ZDQ2OTdhMywgMHg2YmQzZjljNgorLndvcmQJMHgwMzhmNWZlNywgMHgxNTkyOWM5NSwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYQorLndvcmQJMHhkNGJlODMyZCwgMHg1ODc0MjFkMywgMHg0OWUwNjkyOSwgMHg4ZWM5Yzg0NAorLndvcmQJMHg3NWMyODk2YSwgMHhmNDhlNzk3OCwgMHg5OTU4M2U2YiwgMHgyN2I5NzFkZAorLndvcmQJMHhiZWUxNGZiNiwgMHhmMDg4YWQxNywgMHhjOTIwYWM2NiwgMHg3ZGNlM2FiNAorLndvcmQJMHg2M2RmNGExOCwgMHhlNTFhMzE4MiwgMHg5NzUxMzM2MCwgMHg2MjUzN2Y0NQorLndvcmQJMHhiMTY0NzdlMCwgMHhiYjZiYWU4NCwgMHhmZTgxYTAxYywgMHhmOTA4MmI5NAorLndvcmQJMHg3MDQ4Njg1OCwgMHg4ZjQ1ZmQxOSwgMHg5NGRlNmM4NywgMHg1MjdiZjhiNworLndvcmQJMHhhYjczZDMyMywgMHg3MjRiMDJlMiwgMHhlMzFmOGY1NywgMHg2NjU1YWIyYQorLndvcmQJMHhiMmViMjgwNywgMHgyZmI1YzIwMywgMHg4NmM1N2I5YSwgMHhkMzM3MDhhNQorLndvcmQJMHgzMDI4ODdmMiwgMHgyM2JmYTViMiwgMHgwMjAzNmFiYSwgMHhlZDE2ODI1YworLndvcmQJMHg4YWNmMWMyYiwgMHhhNzc5YjQ5MiwgMHhmMzA3ZjJmMCwgMHg0ZTY5ZTJhMQorLndvcmQJMHg2NWRhZjRjZCwgMHgwNjA1YmVkNSwgMHhkMTM0NjIxZiwgMHhjNGE2ZmU4YQorLndvcmQJMHgzNDJlNTM5ZCwgMHhhMmYzNTVhMCwgMHgwNThhZTEzMiwgMHhhNGY2ZWI3NQorLndvcmQJMHgwYjgzZWMzOSwgMHg0MDYwZWZhYSwgMHg1ZTcxOWYwNiwgMHhiZDZlMTA1MQorLndvcmQJMHgzZTIxOGFmOSwgMHg5NmRkMDYzZCwgMHhkZDNlMDVhZSwgMHg0ZGU2YmQ0NgorLndvcmQJMHg5MTU0OGRiNSwgMHg3MWM0NWQwNSwgMHgwNDA2ZDQ2ZiwgMHg2MDUwMTVmZgorLndvcmQJMHgxOTk4ZmIyNCwgMHhkNmJkZTk5NywgMHg4OTQwNDNjYywgMHg2N2Q5OWU3NworLndvcmQJMHhiMGU4NDJiZCwgMHgwNzg5OGI4OCwgMHhlNzE5NWIzOCwgMHg3OWM4ZWVkYgorLndvcmQJMHhhMTdjMGE0NywgMHg3YzQyMGZlOSwgMHhmODg0MWVjOSwgMHgwMDAwMDAwMAorLndvcmQJMHgwOTgwODY4MywgMHgzMjJiZWQ0OCwgMHgxZTExNzBhYywgMHg2YzVhNzI0ZQorLndvcmQJMHhmZDBlZmZmYiwgMHgwZjg1Mzg1NiwgMHgzZGFlZDUxZSwgMHgzNjJkMzkyNworLndvcmQJMHgwYTBmZDk2NCwgMHg2ODVjYTYyMSwgMHg5YjViNTRkMSwgMHgyNDM2MmUzYQorLndvcmQJMHgwYzBhNjdiMSwgMHg5MzU3ZTcwZiwgMHhiNGVlOTZkMiwgMHgxYjliOTE5ZQorLndvcmQJMHg4MGMwYzU0ZiwgMHg2MWRjMjBhMiwgMHg1YTc3NGI2OSwgMHgxYzEyMWExNgorLndvcmQJMHhlMjkzYmEwYSwgMHhjMGEwMmFlNSwgMHgzYzIyZTA0MywgMHgxMjFiMTcxZAorLndvcmQJMHgwZTA5MGQwYiwgMHhmMjhiYzdhZCwgMHgyZGI2YThiOSwgMHgxNDFlYTljOAorLndvcmQJMHg1N2YxMTk4NSwgMHhhZjc1MDc0YywgMHhlZTk5ZGRiYiwgMHhhMzdmNjBmZAorLndvcmQJMHhmNzAxMjY5ZiwgMHg1YzcyZjViYywgMHg0NDY2M2JjNSwgMHg1YmZiN2UzNAorLndvcmQJMHg4YjQzMjk3NiwgMHhjYjIzYzZkYywgMHhiNmVkZmM2OCwgMHhiOGU0ZjE2MworLndvcmQJMHhkNzMxZGNjYSwgMHg0MjYzODUxMCwgMHgxMzk3MjI0MCwgMHg4NGM2MTEyMAorLndvcmQJMHg4NTRhMjQ3ZCwgMHhkMmJiM2RmOCwgMHhhZWY5MzIxMSwgMHhjNzI5YTE2ZAorLndvcmQJMHgxZDllMmY0YiwgMHhkY2IyMzBmMywgMHgwZDg2NTJlYywgMHg3N2MxZTNkMAorLndvcmQJMHgyYmIzMTY2YywgMHhhOTcwYjk5OSwgMHgxMTk0NDhmYSwgMHg0N2U5NjQyMgorLndvcmQJMHhhOGZjOGNjNCwgMHhhMGYwM2YxYSwgMHg1NjdkMmNkOCwgMHgyMjMzOTBlZgorLndvcmQJMHg4NzQ5NGVjNywgMHhkOTM4ZDFjMSwgMHg4Y2NhYTJmZSwgMHg5OGQ0MGIzNgorLndvcmQJMHhhNmY1ODFjZiwgMHhhNTdhZGUyOCwgMHhkYWI3OGUyNiwgMHgzZmFkYmZhNAorLndvcmQJMHgyYzNhOWRlNCwgMHg1MDc4OTIwZCwgMHg2YTVmY2M5YiwgMHg1NDdlNDY2MgorLndvcmQJMHhmNjhkMTNjMiwgMHg5MGQ4YjhlOCwgMHgyZTM5Zjc1ZSwgMHg4MmMzYWZmNQorLndvcmQJMHg5ZjVkODBiZSwgMHg2OWQwOTM3YywgMHg2ZmQ1MmRhOSwgMHhjZjI1MTJiMworLndvcmQJMHhjOGFjOTkzYiwgMHgxMDE4N2RhNywgMHhlODljNjM2ZSwgMHhkYjNiYmI3YgorLndvcmQJMHhjZDI2NzgwOSwgMHg2ZTU5MThmNCwgMHhlYzlhYjcwMSwgMHg4MzRmOWFhOAorLndvcmQJMHhlNjk1NmU2NSwgMHhhYWZmZTY3ZSwgMHgyMWJjY2YwOCwgMHhlZjE1ZThlNgorLndvcmQJMHhiYWU3OWJkOSwgMHg0YTZmMzZjZSwgMHhlYTlmMDlkNCwgMHgyOWIwN2NkNgorLndvcmQJMHgzMWE0YjJhZiwgMHgyYTNmMjMzMSwgMHhjNmE1OTQzMCwgMHgzNWEyNjZjMAorLndvcmQJMHg3NDRlYmMzNywgMHhmYzgyY2FhNiwgMHhlMDkwZDBiMCwgMHgzM2E3ZDgxNQorLndvcmQJMHhmMTA0OTg0YSwgMHg0MWVjZGFmNywgMHg3ZmNkNTAwZSwgMHgxNzkxZjYyZgorLndvcmQJMHg3NjRkZDY4ZCwgMHg0M2VmYjA0ZCwgMHhjY2FhNGQ1NCwgMHhlNDk2MDRkZgorLndvcmQJMHg5ZWQxYjVlMywgMHg0YzZhODgxYiwgMHhjMTJjMWZiOCwgMHg0NjY1NTE3ZgorLndvcmQJMHg5ZDVlZWEwNCwgMHgwMThjMzU1ZCwgMHhmYTg3NzQ3MywgMHhmYjBiNDEyZQorLndvcmQJMHhiMzY3MWQ1YSwgMHg5MmRiZDI1MiwgMHhlOTEwNTYzMywgMHg2ZGQ2NDcxMworLndvcmQJMHg5YWQ3NjE4YywgMHgzN2ExMGM3YSwgMHg1OWY4MTQ4ZSwgMHhlYjEzM2M4OQorLndvcmQJMHhjZWE5MjdlZSwgMHhiNzYxYzkzNSwgMHhlMTFjZTVlZCwgMHg3YTQ3YjEzYworLndvcmQJMHg5Y2QyZGY1OSwgMHg1NWYyNzMzZiwgMHgxODE0Y2U3OSwgMHg3M2M3MzdiZgorLndvcmQJMHg1M2Y3Y2RlYSwgMHg1ZmZkYWE1YiwgMHhkZjNkNmYxNCwgMHg3ODQ0ZGI4NgorLndvcmQJMHhjYWFmZjM4MSwgMHhiOTY4YzQzZSwgMHgzODI0MzQyYywgMHhjMmEzNDA1ZgorLndvcmQJMHgxNjFkYzM3MiwgMHhiY2UyMjUwYywgMHgyODNjNDk4YiwgMHhmZjBkOTU0MQorLndvcmQJMHgzOWE4MDE3MSwgMHgwODBjYjNkZSwgMHhkOGI0ZTQ5YywgMHg2NDU2YzE5MAorLndvcmQJMHg3YmNiODQ2MSwgMHhkNTMyYjY3MCwgMHg0ODZjNWM3NCwgMHhkMGI4NTc0MgorQCBUZDRbMjU2XQorLmJ5dGUJMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOAorLmJ5dGUJMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwgMHg4MSwgMHhmMywgMHhkNywgMHhmYgorLmJ5dGUJMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4NworLmJ5dGUJMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYgorLmJ5dGUJMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZAorLmJ5dGUJMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZQorLmJ5dGUJMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMgorLmJ5dGUJMHg3NiwgMHg1YiwgMHhhMiwgMHg0OSwgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNQorLmJ5dGUJMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNgorLmJ5dGUJMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5MgorLmJ5dGUJMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYQorLmJ5dGUJMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NAorLmJ5dGUJMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYQorLmJ5dGUJMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwgMHhiOCwgMHhiMywgMHg0NSwgMHgwNgorLmJ5dGUJMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMgorLmJ5dGUJMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2YgorLmJ5dGUJMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYQorLmJ5dGUJMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3MworLmJ5dGUJMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NQorLmJ5dGUJMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwgMHgxYywgMHg3NSwgMHhkZiwgMHg2ZQorLmJ5dGUJMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OQorLmJ5dGUJMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYgorLmJ5dGUJMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMAorLmJ5dGUJMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNAorLmJ5dGUJMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMQorLmJ5dGUJMHhiMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhlYywgMHg1ZgorLmJ5dGUJMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZAorLmJ5dGUJMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZgorLmJ5dGUJMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMAorLmJ5dGUJMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MQorLmJ5dGUJMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNgorLmJ5dGUJMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZAorLnNpemUJQUVTX1RkLC4tQUVTX1RkCisKK0Agdm9pZCBhZXNfbm9od19kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCitAIAkJICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisuZ2xvYmwJYWVzX25vaHdfZGVjcnlwdAorLmhpZGRlbglhZXNfbm9od19kZWNyeXB0CisudHlwZQlhZXNfbm9od19kZWNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19ub2h3X2RlY3J5cHQ6CisjaWZuZGVmCV9fdGh1bWIyX18KKwlzdWIJcjMscGMsIzgJCUAgYWVzX25vaHdfZGVjcnlwdAorI2Vsc2UKKwlhZHIJcjMsLgorI2VuZGlmCisJc3RtZGIJc3AhLHtyMSxyNC1yMTIsbHJ9CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKwlhZHIJcjEwLEFFU19UZAorI2Vsc2UKKwlzdWIJcjEwLHIzLCNhZXNfbm9od19kZWNyeXB0LUFFU19UZAlAIFRkCisjZW5kaWYKKwltb3YJcjEyLHIwCQlAIGlucAorCW1vdglyMTEscjIKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjAsW3IxMiwjM10JQCBsb2FkIGlucHV0IGRhdGEgaW4gZW5kaWFuLW5ldXRyYWwKKwlsZHJiCXI0LFtyMTIsIzJdCUAgbWFubmVyLi4uCisJbGRyYglyNSxbcjEyLCMxXQorCWxkcmIJcjYsW3IxMiwjMF0KKwlvcnIJcjAscjAscjQsbHNsIzgKKwlsZHJiCXIxLFtyMTIsIzddCisJb3JyCXIwLHIwLHI1LGxzbCMxNgorCWxkcmIJcjQsW3IxMiwjNl0KKwlvcnIJcjAscjAscjYsbHNsIzI0CisJbGRyYglyNSxbcjEyLCM1XQorCWxkcmIJcjYsW3IxMiwjNF0KKwlvcnIJcjEscjEscjQsbHNsIzgKKwlsZHJiCXIyLFtyMTIsIzExXQorCW9ycglyMSxyMSxyNSxsc2wjMTYKKwlsZHJiCXI0LFtyMTIsIzEwXQorCW9ycglyMSxyMSxyNixsc2wjMjQKKwlsZHJiCXI1LFtyMTIsIzldCisJbGRyYglyNixbcjEyLCM4XQorCW9ycglyMixyMixyNCxsc2wjOAorCWxkcmIJcjMsW3IxMiwjMTVdCisJb3JyCXIyLHIyLHI1LGxzbCMxNgorCWxkcmIJcjQsW3IxMiwjMTRdCisJb3JyCXIyLHIyLHI2LGxzbCMyNAorCWxkcmIJcjUsW3IxMiwjMTNdCisJbGRyYglyNixbcjEyLCMxMl0KKwlvcnIJcjMscjMscjQsbHNsIzgKKwlvcnIJcjMscjMscjUsbHNsIzE2CisJb3JyCXIzLHIzLHI2LGxzbCMyNAorI2Vsc2UKKwlsZHIJcjAsW3IxMiwjMF0KKwlsZHIJcjEsW3IxMiwjNF0KKwlsZHIJcjIsW3IxMiwjOF0KKwlsZHIJcjMsW3IxMiwjMTJdCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXIwLHIwCisJcmV2CXIxLHIxCisJcmV2CXIyLHIyCisJcmV2CXIzLHIzCisjZW5kaWYKKyNlbmRpZgorCWJsCV9hcm12NF9BRVNfZGVjcnlwdAorCisJbGRyCXIxMixbc3BdLCM0CQlAIHBvcCBvdXQKKyNpZiBfX0FSTV9BUkNIX18+PTcKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjAscjAKKwlyZXYJcjEscjEKKwlyZXYJcjIscjIKKwlyZXYJcjMscjMKKyNlbmRpZgorCXN0cglyMCxbcjEyLCMwXQorCXN0cglyMSxbcjEyLCM0XQorCXN0cglyMixbcjEyLCM4XQorCXN0cglyMyxbcjEyLCMxMl0KKyNlbHNlCisJbW92CXI0LHIwLGxzciMyNAkJQCB3cml0ZSBvdXRwdXQgaW4gZW5kaWFuLW5ldXRyYWwKKwltb3YJcjUscjAsbHNyIzE2CQlAIG1hbm5lci4uLgorCW1vdglyNixyMCxsc3IjOAorCXN0cmIJcjQsW3IxMiwjMF0KKwlzdHJiCXI1LFtyMTIsIzFdCisJbW92CXI0LHIxLGxzciMyNAorCXN0cmIJcjYsW3IxMiwjMl0KKwltb3YJcjUscjEsbHNyIzE2CisJc3RyYglyMCxbcjEyLCMzXQorCW1vdglyNixyMSxsc3IjOAorCXN0cmIJcjQsW3IxMiwjNF0KKwlzdHJiCXI1LFtyMTIsIzVdCisJbW92CXI0LHIyLGxzciMyNAorCXN0cmIJcjYsW3IxMiwjNl0KKwltb3YJcjUscjIsbHNyIzE2CisJc3RyYglyMSxbcjEyLCM3XQorCW1vdglyNixyMixsc3IjOAorCXN0cmIJcjQsW3IxMiwjOF0KKwlzdHJiCXI1LFtyMTIsIzldCisJbW92CXI0LHIzLGxzciMyNAorCXN0cmIJcjYsW3IxMiwjMTBdCisJbW92CXI1LHIzLGxzciMxNgorCXN0cmIJcjIsW3IxMiwjMTFdCisJbW92CXI2LHIzLGxzciM4CisJc3RyYglyNCxbcjEyLCMxMl0KKwlzdHJiCXI1LFtyMTIsIzEzXQorCXN0cmIJcjYsW3IxMiwjMTRdCisJc3RyYglyMyxbcjEyLCMxNV0KKyNlbmRpZgorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIscGN9CisjZWxzZQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisuc2l6ZQlhZXNfbm9od19kZWNyeXB0LC4tYWVzX25vaHdfZGVjcnlwdAorCisudHlwZQlfYXJtdjRfQUVTX2RlY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JMgorX2FybXY0X0FFU19kZWNyeXB0OgorCXN0cglscixbc3AsIy00XSEJCUAgcHVzaCBscgorCWxkbWlhCXIxMSEse3I0LHI1LHI2LHI3fQorCWVvcglyMCxyMCxyNAorCWxkcglyMTIsW3IxMSwjMjQwLTE2XQorCWVvcglyMSxyMSxyNQorCWVvcglyMixyMixyNgorCWVvcglyMyxyMyxyNworCXN1YglyMTIscjEyLCMxCisJbW92CWxyLCMyNTUKKworCWFuZAlyNyxscixyMCxsc3IjMTYKKwlhbmQJcjgsbHIscjAsbHNyIzgKKwlhbmQJcjksbHIscjAKKwltb3YJcjAscjAsbHNyIzI0CisuTGRlY19sb29wOgorCWxkcglyNCxbcjEwLHI3LGxzbCMyXQlAIFRkMVtzMD4+MTZdCisJYW5kCXI3LGxyLHIxCQlAIGkwCisJbGRyCXI1LFtyMTAscjgsbHNsIzJdCUAgVGQyW3MwPj44XQorCWFuZAlyOCxscixyMSxsc3IjMTYKKwlsZHIJcjYsW3IxMCxyOSxsc2wjMl0JQCBUZDNbczA+PjBdCisJYW5kCXI5LGxyLHIxLGxzciM4CisJbGRyCXIwLFtyMTAscjAsbHNsIzJdCUAgVGQwW3MwPj4yNF0KKwltb3YJcjEscjEsbHNyIzI0CisKKwlsZHIJcjcsW3IxMCxyNyxsc2wjMl0JQCBUZDNbczE+PjBdCisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGQxW3MxPj4xNl0KKwlsZHIJcjksW3IxMCxyOSxsc2wjMl0JQCBUZDJbczE+PjhdCisJZW9yCXIwLHIwLHI3LHJvciMyNAorCWxkcglyMSxbcjEwLHIxLGxzbCMyXQlAIFRkMFtzMT4+MjRdCisJYW5kCXI3LGxyLHIyLGxzciM4CUAgaTAKKwllb3IJcjUscjgscjUscm9yIzgKKwlhbmQJcjgsbHIscjIJCUAgaTEKKwllb3IJcjYscjkscjYscm9yIzgKKwlhbmQJcjksbHIscjIsbHNyIzE2CisJbGRyCXI3LFtyMTAscjcsbHNsIzJdCUAgVGQyW3MyPj44XQorCWVvcglyMSxyMSxyNCxyb3IjOAorCWxkcglyOCxbcjEwLHI4LGxzbCMyXQlAIFRkM1tzMj4+MF0KKwltb3YJcjIscjIsbHNyIzI0CisKKwlsZHIJcjksW3IxMCxyOSxsc2wjMl0JQCBUZDFbczI+PjE2XQorCWVvcglyMCxyMCxyNyxyb3IjMTYKKwlsZHIJcjIsW3IxMCxyMixsc2wjMl0JQCBUZDBbczI+PjI0XQorCWFuZAlyNyxscixyMyxsc3IjMTYJQCBpMAorCWVvcglyMSxyMSxyOCxyb3IjMjQKKwlhbmQJcjgsbHIscjMsbHNyIzgJQCBpMQorCWVvcglyNixyOSxyNixyb3IjOAorCWFuZAlyOSxscixyMwkJQCBpMgorCWxkcglyNyxbcjEwLHI3LGxzbCMyXQlAIFRkMVtzMz4+MTZdCisJZW9yCXIyLHIyLHI1LHJvciM4CisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGQyW3MzPj44XQorCW1vdglyMyxyMyxsc3IjMjQKKworCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRkM1tzMz4+MF0KKwllb3IJcjAscjAscjcscm9yIzgKKwlsZHIJcjcsW3IxMV0sIzE2CisJZW9yCXIxLHIxLHI4LHJvciMxNgorCWxkcglyMyxbcjEwLHIzLGxzbCMyXQlAIFRkMFtzMz4+MjRdCisJZW9yCXIyLHIyLHI5LHJvciMyNAorCisJbGRyCXI0LFtyMTEsIy0xMl0KKwllb3IJcjAscjAscjcKKwlsZHIJcjUsW3IxMSwjLThdCisJZW9yCXIzLHIzLHI2LHJvciM4CisJbGRyCXI2LFtyMTEsIy00XQorCWFuZAlyNyxscixyMCxsc3IjMTYKKwllb3IJcjEscjEscjQKKwlhbmQJcjgsbHIscjAsbHNyIzgKKwllb3IJcjIscjIscjUKKwlhbmQJcjksbHIscjAKKwllb3IJcjMscjMscjYKKwltb3YJcjAscjAsbHNyIzI0CisKKwlzdWJzCXIxMixyMTIsIzEKKwlibmUJLkxkZWNfbG9vcAorCisJYWRkCXIxMCxyMTAsIzEwMjQKKworCWxkcglyNSxbcjEwLCMwXQkJQCBwcmVmZXRjaCBUZDQKKwlsZHIJcjYsW3IxMCwjMzJdCisJbGRyCXI0LFtyMTAsIzY0XQorCWxkcglyNSxbcjEwLCM5Nl0KKwlsZHIJcjYsW3IxMCwjMTI4XQorCWxkcglyNCxbcjEwLCMxNjBdCisJbGRyCXI1LFtyMTAsIzE5Ml0KKwlsZHIJcjYsW3IxMCwjMjI0XQorCisJbGRyYglyMCxbcjEwLHIwXQkJQCBUZDRbczA+PjI0XQorCWxkcmIJcjQsW3IxMCxyN10JCUAgVGQ0W3MwPj4xNl0KKwlhbmQJcjcsbHIscjEJCUAgaTAKKwlsZHJiCXI1LFtyMTAscjhdCQlAIFRkNFtzMD4+OF0KKwlhbmQJcjgsbHIscjEsbHNyIzE2CisJbGRyYglyNixbcjEwLHI5XQkJQCBUZDRbczA+PjBdCisJYW5kCXI5LGxyLHIxLGxzciM4CisKKwlhZGQJcjEscjEwLHIxLGxzciMyNAorCWxkcmIJcjcsW3IxMCxyN10JCUAgVGQ0W3MxPj4wXQorCWxkcmIJcjEsW3IxXQkJQCBUZDRbczE+PjI0XQorCWxkcmIJcjgsW3IxMCxyOF0JCUAgVGQ0W3MxPj4xNl0KKwllb3IJcjAscjcscjAsbHNsIzI0CisJbGRyYglyOSxbcjEwLHI5XQkJQCBUZDRbczE+PjhdCisJZW9yCXIxLHI0LHIxLGxzbCM4CisJYW5kCXI3LGxyLHIyLGxzciM4CUAgaTAKKwllb3IJcjUscjUscjgsbHNsIzgKKwlhbmQJcjgsbHIscjIJCUAgaTEKKwlsZHJiCXI3LFtyMTAscjddCQlAIFRkNFtzMj4+OF0KKwllb3IJcjYscjYscjksbHNsIzgKKwlsZHJiCXI4LFtyMTAscjhdCQlAIFRkNFtzMj4+MF0KKwlhbmQJcjksbHIscjIsbHNyIzE2CisKKwlhZGQJcjIscjEwLHIyLGxzciMyNAorCWxkcmIJcjIsW3IyXQkJQCBUZDRbczI+PjI0XQorCWVvcglyMCxyMCxyNyxsc2wjOAorCWxkcmIJcjksW3IxMCxyOV0JCUAgVGQ0W3MyPj4xNl0KKwllb3IJcjEscjgscjEsbHNsIzE2CisJYW5kCXI3LGxyLHIzLGxzciMxNglAIGkwCisJZW9yCXIyLHI1LHIyLGxzbCMxNgorCWFuZAlyOCxscixyMyxsc3IjOAlAIGkxCisJbGRyYglyNyxbcjEwLHI3XQkJQCBUZDRbczM+PjE2XQorCWVvcglyNixyNixyOSxsc2wjMTYKKwlsZHJiCXI4LFtyMTAscjhdCQlAIFRkNFtzMz4+OF0KKwlhbmQJcjksbHIscjMJCUAgaTIKKworCWFkZAlyMyxyMTAscjMsbHNyIzI0CisJbGRyYglyOSxbcjEwLHI5XQkJQCBUZDRbczM+PjBdCisJbGRyYglyMyxbcjNdCQlAIFRkNFtzMz4+MjRdCisJZW9yCXIwLHIwLHI3LGxzbCMxNgorCWxkcglyNyxbcjExLCMwXQorCWVvcglyMSxyMSxyOCxsc2wjOAorCWxkcglyNCxbcjExLCM0XQorCWVvcglyMixyOSxyMixsc2wjOAorCWxkcglyNSxbcjExLCM4XQorCWVvcglyMyxyNixyMyxsc2wjMjQKKwlsZHIJcjYsW3IxMSwjMTJdCisKKwllb3IJcjAscjAscjcKKwllb3IJcjEscjEscjQKKwllb3IJcjIscjIscjUKKwllb3IJcjMscjMscjYKKworCXN1YglyMTAscjEwLCMxMDI0CisJbGRyCXBjLFtzcF0sIzQJCUAgcG9wIGFuZCByZXR1cm4KKy5zaXplCV9hcm12NF9BRVNfZGVjcnlwdCwuLV9hcm12NF9BRVNfZGVjcnlwdAorLmJ5dGUJNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9hZXN2OC1hcm14MzIuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2Flc3Y4LWFybXgzMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2VmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9hZXN2OC1hcm14MzIuUwpAQCAtMCwwICsxLDc2MyBAQAorI2lmIGRlZmluZWQoX19hcm1fXykKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisudGV4dAorLmFyY2gJYXJtdjctYQlAIGRvbid0IGNvbmZ1c2Ugbm90LXNvLWxhdGVzdCBiaW51dGlscyB3aXRoIGFyZ3Y4IDotKQorLmZwdQluZW9uCisuY29kZQkzMgorI3VuZGVmCV9fdGh1bWIyX18KKy5hbGlnbgk1CisuTHJjb246CisubG9uZwkweDAxLDB4MDEsMHgwMSwweDAxCisubG9uZwkweDBjMGYwZTBkLDB4MGMwZjBlMGQsMHgwYzBmMGUwZCwweDBjMGYwZTBkCUAgcm90YXRlLW4tc3BsYXQKKy5sb25nCTB4MWIsMHgxYiwweDFiLDB4MWIKKworLmdsb2JsCWFlc19od19zZXRfZW5jcnlwdF9rZXkKKy5oaWRkZW4JYWVzX2h3X3NldF9lbmNyeXB0X2tleQorLnR5cGUJYWVzX2h3X3NldF9lbmNyeXB0X2tleSwlZnVuY3Rpb24KKy5hbGlnbgk1CithZXNfaHdfc2V0X2VuY3J5cHRfa2V5OgorLkxlbmNfa2V5OgorCW1vdglyMywjLTEKKwljbXAJcjAsIzAKKwliZXEJLkxlbmNfa2V5X2Fib3J0CisJY21wCXIyLCMwCisJYmVxCS5MZW5jX2tleV9hYm9ydAorCW1vdglyMywjLTIKKwljbXAJcjEsIzEyOAorCWJsdAkuTGVuY19rZXlfYWJvcnQKKwljbXAJcjEsIzI1NgorCWJndAkuTGVuY19rZXlfYWJvcnQKKwl0c3QJcjEsIzB4M2YKKwlibmUJLkxlbmNfa2V5X2Fib3J0CisKKwlhZHIJcjMsLkxyY29uCisJY21wCXIxLCMxOTIKKworCXZlb3IJcTAscTAscTAKKwl2bGQxLjgJe3EzfSxbcjBdIQorCW1vdglyMSwjOAkJQCByZXVzZSByMQorCXZsZDEuMzIJe3ExLHEyfSxbcjNdIQorCisJYmx0CS5Mb29wMTI4CisJYmVxCS5MMTkyCisJYgkuTDI1NgorCisuYWxpZ24JNAorLkxvb3AxMjg6CisJdnRibC44CWQyMCx7cTN9LGQ0CisJdnRibC44CWQyMSx7cTN9LGQ1CisJdmV4dC44CXE5LHEwLHEzLCMxMgorCXZzdDEuMzIJe3EzfSxbcjJdIQorLmJ5dGUJMHgwMCwweDQzLDB4ZjAsMHhmMwlAIGFlc2UgcTEwLHEwCisJc3VicwlyMSxyMSwjMQorCisJdmVvcglxMyxxMyxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXEzLHEzLHE5CisJdmV4dC44CXE5LHEwLHE5LCMxMgorCXZlb3IJcTEwLHExMCxxMQorCXZlb3IJcTMscTMscTkKKwl2c2hsLnU4CXExLHExLCMxCisJdmVvcglxMyxxMyxxMTAKKwlibmUJLkxvb3AxMjgKKworCXZsZDEuMzIJe3ExfSxbcjNdCisKKwl2dGJsLjgJZDIwLHtxM30sZDQKKwl2dGJsLjgJZDIxLHtxM30sZDUKKwl2ZXh0LjgJcTkscTAscTMsIzEyCisJdnN0MS4zMgl7cTN9LFtyMl0hCisuYnl0ZQkweDAwLDB4NDMsMHhmMCwweGYzCUAgYWVzZSBxMTAscTAKKworCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMyxxMyxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXExMCxxMTAscTEKKwl2ZW9yCXEzLHEzLHE5CisJdnNobC51OAlxMSxxMSwjMQorCXZlb3IJcTMscTMscTEwCisKKwl2dGJsLjgJZDIwLHtxM30sZDQKKwl2dGJsLjgJZDIxLHtxM30sZDUKKwl2ZXh0LjgJcTkscTAscTMsIzEyCisJdnN0MS4zMgl7cTN9LFtyMl0hCisuYnl0ZQkweDAwLDB4NDMsMHhmMCwweGYzCUAgYWVzZSBxMTAscTAKKworCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMyxxMyxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXExMCxxMTAscTEKKwl2ZW9yCXEzLHEzLHE5CisJdmVvcglxMyxxMyxxMTAKKwl2c3QxLjMyCXtxM30sW3IyXQorCWFkZAlyMixyMiwjMHg1MAorCisJbW92CXIxMiwjMTAKKwliCS5MZG9uZQorCisuYWxpZ24JNAorLkwxOTI6CisJdmxkMS44CXtkMTZ9LFtyMF0hCisJdm1vdi5pOAlxMTAsIzgJCQlAIGJvcnJvdyBxMTAKKwl2c3QxLjMyCXtxM30sW3IyXSEKKwl2c3ViLmk4CXEyLHEyLHExMAlAIGFkanVzdCB0aGUgbWFzaworCisuTG9vcDE5MjoKKwl2dGJsLjgJZDIwLHtxOH0sZDQKKwl2dGJsLjgJZDIxLHtxOH0sZDUKKwl2ZXh0LjgJcTkscTAscTMsIzEyCisJdnN0MS4zMgl7ZDE2fSxbcjJdIQorLmJ5dGUJMHgwMCwweDQzLDB4ZjAsMHhmMwlAIGFlc2UgcTEwLHEwCisJc3VicwlyMSxyMSwjMQorCisJdmVvcglxMyxxMyxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXEzLHEzLHE5CisJdmV4dC44CXE5LHEwLHE5LCMxMgorCXZlb3IJcTMscTMscTkKKworCXZkdXAuMzIJcTksZDdbMV0KKwl2ZW9yCXE5LHE5LHE4CisJdmVvcglxMTAscTEwLHExCisJdmV4dC44CXE4LHEwLHE4LCMxMgorCXZzaGwudTgJcTEscTEsIzEKKwl2ZW9yCXE4LHE4LHE5CisJdmVvcglxMyxxMyxxMTAKKwl2ZW9yCXE4LHE4LHExMAorCXZzdDEuMzIJe3EzfSxbcjJdIQorCWJuZQkuTG9vcDE5MgorCisJbW92CXIxMiwjMTIKKwlhZGQJcjIscjIsIzB4MjAKKwliCS5MZG9uZQorCisuYWxpZ24JNAorLkwyNTY6CisJdmxkMS44CXtxOH0sW3IwXQorCW1vdglyMSwjNworCW1vdglyMTIsIzE0CisJdnN0MS4zMgl7cTN9LFtyMl0hCisKKy5Mb29wMjU2OgorCXZ0YmwuOAlkMjAse3E4fSxkNAorCXZ0YmwuOAlkMjEse3E4fSxkNQorCXZleHQuOAlxOSxxMCxxMywjMTIKKwl2c3QxLjMyCXtxOH0sW3IyXSEKKy5ieXRlCTB4MDAsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxMAorCXN1YnMJcjEscjEsIzEKKworCXZlb3IJcTMscTMscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxMyxxMyxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXExMCxxMTAscTEKKwl2ZW9yCXEzLHEzLHE5CisJdnNobC51OAlxMSxxMSwjMQorCXZlb3IJcTMscTMscTEwCisJdnN0MS4zMgl7cTN9LFtyMl0hCisJYmVxCS5MZG9uZQorCisJdmR1cC4zMglxMTAsZDdbMV0KKwl2ZXh0LjgJcTkscTAscTgsIzEyCisuYnl0ZQkweDAwLDB4NDMsMHhmMCwweGYzCUAgYWVzZSBxMTAscTAKKworCXZlb3IJcTgscTgscTkKKwl2ZXh0LjgJcTkscTAscTksIzEyCisJdmVvcglxOCxxOCxxOQorCXZleHQuOAlxOSxxMCxxOSwjMTIKKwl2ZW9yCXE4LHE4LHE5CisKKwl2ZW9yCXE4LHE4LHExMAorCWIJLkxvb3AyNTYKKworLkxkb25lOgorCXN0cglyMTIsW3IyXQorCW1vdglyMywjMAorCisuTGVuY19rZXlfYWJvcnQ6CisJbW92CXIwLHIzCQkJQCByZXR1cm4gdmFsdWUKKworCWJ4CWxyCisuc2l6ZQlhZXNfaHdfc2V0X2VuY3J5cHRfa2V5LC4tYWVzX2h3X3NldF9lbmNyeXB0X2tleQorCisuZ2xvYmwJYWVzX2h3X3NldF9kZWNyeXB0X2tleQorLmhpZGRlbglhZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlhZXNfaHdfc2V0X2RlY3J5cHRfa2V5LCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19zZXRfZGVjcnlwdF9rZXk6CisJc3RtZGIJc3AhLHtyNCxscn0KKwlibAkuTGVuY19rZXkKKworCWNtcAlyMCwjMAorCWJuZQkuTGRlY19rZXlfYWJvcnQKKworCXN1YglyMixyMiwjMjQwCQlAIHJlc3RvcmUgb3JpZ2luYWwgcjIKKwltb3YJcjQsIy0xNgorCWFkZAlyMCxyMixyMTIsbHNsIzQJQCBlbmQgb2Yga2V5IHNjaGVkdWxlCisKKwl2bGQxLjMyCXtxMH0sW3IyXQorCXZsZDEuMzIJe3ExfSxbcjBdCisJdnN0MS4zMgl7cTB9LFtyMF0scjQKKwl2c3QxLjMyCXtxMX0sW3IyXSEKKworLkxvb3BfaW1jOgorCXZsZDEuMzIJe3EwfSxbcjJdCisJdmxkMS4zMgl7cTF9LFtyMF0KKy5ieXRlCTB4YzAsMHgwMywweGIwLDB4ZjMJQCBhZXNpbWMgcTAscTAKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKwl2c3QxLjMyCXtxMH0sW3IwXSxyNAorCXZzdDEuMzIJe3ExfSxbcjJdIQorCWNtcAlyMCxyMgorCWJoaQkuTG9vcF9pbWMKKworCXZsZDEuMzIJe3EwfSxbcjJdCisuYnl0ZQkweGMwLDB4MDMsMHhiMCwweGYzCUAgYWVzaW1jIHEwLHEwCisJdnN0MS4zMgl7cTB9LFtyMF0KKworCWVvcglyMCxyMCxyMAkJQCByZXR1cm4gdmFsdWUKKy5MZGVjX2tleV9hYm9ydDoKKwlsZG1pYQlzcCEse3I0LHBjfQorLnNpemUJYWVzX2h3X3NldF9kZWNyeXB0X2tleSwuLWFlc19od19zZXRfZGVjcnlwdF9rZXkKKy5nbG9ibAlhZXNfaHdfZW5jcnlwdAorLmhpZGRlbglhZXNfaHdfZW5jcnlwdAorLnR5cGUJYWVzX2h3X2VuY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X2VuY3J5cHQ6CisJbGRyCXIzLFtyMiwjMjQwXQorCXZsZDEuMzIJe3EwfSxbcjJdIQorCXZsZDEuOAl7cTJ9LFtyMF0KKwlzdWIJcjMscjMsIzIKKwl2bGQxLjMyCXtxMX0sW3IyXSEKKworLkxvb3BfZW5jOgorLmJ5dGUJMHgwMCwweDQzLDB4YjAsMHhmMwlAIGFlc2UgcTIscTAKKy5ieXRlCTB4ODQsMHg0MywweGIwLDB4ZjMJQCBhZXNtYyBxMixxMgorCXZsZDEuMzIJe3EwfSxbcjJdIQorCXN1YnMJcjMscjMsIzIKKy5ieXRlCTB4MDIsMHg0MywweGIwLDB4ZjMJQCBhZXNlIHEyLHExCisuYnl0ZQkweDg0LDB4NDMsMHhiMCwweGYzCUAgYWVzbWMgcTIscTIKKwl2bGQxLjMyCXtxMX0sW3IyXSEKKwliZ3QJLkxvb3BfZW5jCisKKy5ieXRlCTB4MDAsMHg0MywweGIwLDB4ZjMJQCBhZXNlIHEyLHEwCisuYnl0ZQkweDg0LDB4NDMsMHhiMCwweGYzCUAgYWVzbWMgcTIscTIKKwl2bGQxLjMyCXtxMH0sW3IyXQorLmJ5dGUJMHgwMiwweDQzLDB4YjAsMHhmMwlAIGFlc2UgcTIscTEKKwl2ZW9yCXEyLHEyLHEwCisKKwl2c3QxLjgJe3EyfSxbcjFdCisJYngJbHIKKy5zaXplCWFlc19od19lbmNyeXB0LC4tYWVzX2h3X2VuY3J5cHQKKy5nbG9ibAlhZXNfaHdfZGVjcnlwdAorLmhpZGRlbglhZXNfaHdfZGVjcnlwdAorLnR5cGUJYWVzX2h3X2RlY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X2RlY3J5cHQ6CisJbGRyCXIzLFtyMiwjMjQwXQorCXZsZDEuMzIJe3EwfSxbcjJdIQorCXZsZDEuOAl7cTJ9LFtyMF0KKwlzdWIJcjMscjMsIzIKKwl2bGQxLjMyCXtxMX0sW3IyXSEKKworLkxvb3BfZGVjOgorLmJ5dGUJMHg0MCwweDQzLDB4YjAsMHhmMwlAIGFlc2QgcTIscTAKKy5ieXRlCTB4YzQsMHg0MywweGIwLDB4ZjMJQCBhZXNpbWMgcTIscTIKKwl2bGQxLjMyCXtxMH0sW3IyXSEKKwlzdWJzCXIzLHIzLCMyCisuYnl0ZQkweDQyLDB4NDMsMHhiMCwweGYzCUAgYWVzZCBxMixxMQorLmJ5dGUJMHhjNCwweDQzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMixxMgorCXZsZDEuMzIJe3ExfSxbcjJdIQorCWJndAkuTG9vcF9kZWMKKworLmJ5dGUJMHg0MCwweDQzLDB4YjAsMHhmMwlAIGFlc2QgcTIscTAKKy5ieXRlCTB4YzQsMHg0MywweGIwLDB4ZjMJQCBhZXNpbWMgcTIscTIKKwl2bGQxLjMyCXtxMH0sW3IyXQorLmJ5dGUJMHg0MiwweDQzLDB4YjAsMHhmMwlAIGFlc2QgcTIscTEKKwl2ZW9yCXEyLHEyLHEwCisKKwl2c3QxLjgJe3EyfSxbcjFdCisJYngJbHIKKy5zaXplCWFlc19od19kZWNyeXB0LC4tYWVzX2h3X2RlY3J5cHQKKy5nbG9ibAlhZXNfaHdfY2JjX2VuY3J5cHQKKy5oaWRkZW4JYWVzX2h3X2NiY19lbmNyeXB0CisudHlwZQlhZXNfaHdfY2JjX2VuY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X2NiY19lbmNyeXB0OgorCW1vdglpcCxzcAorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgsbHJ9CisJdnN0bWRiCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9ICAgICAgICAgICAgQCBBQkkgc3BlY2lmaWNhdGlvbiBzYXlzIHNvCisJbGRtaWEJaXAse3I0LHI1fQkJQCBsb2FkIHJlbWFpbmluZyBhcmdzCisJc3VicwlyMixyMiwjMTYKKwltb3YJcjgsIzE2CisJYmxvCS5MY2JjX2Fib3J0CisJbW92ZXEJcjgsIzAKKworCWNtcAlyNSwjMAkJCUAgZW4tIG9yIGRlY3J5cHRpbmc/CisJbGRyCXI1LFtyMywjMjQwXQorCWFuZAlyMixyMiwjLTE2CisJdmxkMS44CXtxNn0sW3I0XQorCXZsZDEuOAl7cTB9LFtyMF0scjgKKworCXZsZDEuMzIJe3E4LHE5fSxbcjNdCQlAIGxvYWQga2V5IHNjaGVkdWxlLi4uCisJc3ViCXI1LHI1LCM2CisJYWRkCXI3LHIzLHI1LGxzbCM0CUAgcG9pbnRlciB0byBsYXN0IDcgcm91bmQga2V5cworCXN1YglyNSxyNSwjMgorCXZsZDEuMzIJe3ExMCxxMTF9LFtyN10hCisJdmxkMS4zMgl7cTEyLHExM30sW3I3XSEKKwl2bGQxLjMyCXtxMTQscTE1fSxbcjddIQorCXZsZDEuMzIJe3E3fSxbcjddCisKKwlhZGQJcjcscjMsIzMyCisJbW92CXI2LHI1CisJYmVxCS5MY2JjX2RlYworCisJY21wCXI1LCMyCisJdmVvcglxMCxxMCxxNgorCXZlb3IJcTUscTgscTcKKwliZXEJLkxjYmNfZW5jMTI4CisKKwl2bGQxLjMyCXtxMixxM30sW3I3XQorCWFkZAlyNyxyMywjMTYKKwlhZGQJcjYscjMsIzE2KjQKKwlhZGQJcjEyLHIzLCMxNio1CisuYnl0ZQkweDIwLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxOAorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJYWRkCXIxNCxyMywjMTYqNgorCWFkZAlyMyxyMywjMTYqNworCWIJLkxlbnRlcl9jYmNfZW5jCisKKy5hbGlnbgk0CisuTG9vcF9jYmNfZW5jOgorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCXZzdDEuOAl7cTZ9LFtyMV0hCisuTGVudGVyX2NiY19lbmM6CisuYnl0ZQkweDIyLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxOQorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisuYnl0ZQkweDA0LDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMgorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJdmxkMS4zMgl7cTh9LFtyNl0KKwljbXAJcjUsIzQKKy5ieXRlCTB4MDYsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHEzCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2bGQxLjMyCXtxOX0sW3IxMl0KKwliZXEJLkxjYmNfZW5jMTkyCisKKy5ieXRlCTB4MjAsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE4CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2bGQxLjMyCXtxOH0sW3IxNF0KKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2bGQxLjMyCXtxOX0sW3IzXQorCW5vcAorCisuTGNiY19lbmMxOTI6CisuYnl0ZQkweDIwLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxOAorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJc3VicwlyMixyMiwjMTYKKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwltb3ZlcQlyOCwjMAorLmJ5dGUJMHgyNCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTEwCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjYsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHExMQorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJdmxkMS44CXtxOH0sW3IwXSxyOAorLmJ5dGUJMHgyOCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTEyCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwl2ZW9yCXE4LHE4LHE1CisuYnl0ZQkweDJhLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTMKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCXZsZDEuMzIJe3E5fSxbcjddCQlAIHJlLXByZS1sb2FkIHJuZGtleVsxXQorLmJ5dGUJMHgyYywweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTE0CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MmUsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHExNQorCXZlb3IJcTYscTAscTcKKwliaHMJLkxvb3BfY2JjX2VuYworCisJdnN0MS44CXtxNn0sW3IxXSEKKwliCS5MY2JjX2RvbmUKKworLmFsaWduCTUKKy5MY2JjX2VuYzEyODoKKwl2bGQxLjMyCXtxMixxM30sW3I3XQorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCWIJLkxlbnRlcl9jYmNfZW5jMTI4CisuTG9vcF9jYmNfZW5jMTI4OgorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCXZzdDEuOAl7cTZ9LFtyMV0hCisuTGVudGVyX2NiY19lbmMxMjg6CisuYnl0ZQkweDIyLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxOQorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJc3VicwlyMixyMiwjMTYKKy5ieXRlCTB4MDQsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHEyCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKwltb3ZlcQlyOCwjMAorLmJ5dGUJMHgwNiwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTMKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyNCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTEwCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjYsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHExMQorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisJdmxkMS44CXtxOH0sW3IwXSxyOAorLmJ5dGUJMHgyOCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTEyCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MmEsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHExMworLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisuYnl0ZQkweDJjLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxMTQKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorCXZlb3IJcTgscTgscTUKKy5ieXRlCTB4MmUsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHExNQorCXZlb3IJcTYscTAscTcKKwliaHMJLkxvb3BfY2JjX2VuYzEyOAorCisJdnN0MS44CXtxNn0sW3IxXSEKKwliCS5MY2JjX2RvbmUKKy5hbGlnbgk1CisuTGNiY19kZWM6CisJdmxkMS44CXtxMTB9LFtyMF0hCisJc3VicwlyMixyMiwjMzIJCUAgYmlhcworCWFkZAlyNixyNSwjMgorCXZvcnIJcTMscTAscTAKKwl2b3JyCXExLHEwLHEwCisJdm9ycglxMTEscTEwLHExMAorCWJsbwkuTGNiY19kZWNfdGFpbAorCisJdm9ycglxMSxxMTAscTEwCisJdmxkMS44CXtxMTB9LFtyMF0hCisJdm9ycglxMixxMCxxMAorCXZvcnIJcTMscTEscTEKKwl2b3JyCXExMSxxMTAscTEwCisKKy5Mb29wM3hfY2JjX2RlYzoKKy5ieXRlCTB4NjAsMHgwMywweGIwLDB4ZjMJQCBhZXNkIHEwLHE4CisuYnl0ZQkweGMwLDB4MDMsMHhiMCwweGYzCUAgYWVzaW1jIHEwLHEwCisuYnl0ZQkweDYwLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxOAorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2MCwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHE4CisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2bGQxLjMyCXtxOH0sW3I3XSEKKwlzdWJzCXI2LHI2LCMyCisuYnl0ZQkweDYyLDB4MDMsMHhiMCwweGYzCUAgYWVzZCBxMCxxOQorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorLmJ5dGUJMHg2MiwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTkKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjIsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxOQorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmxkMS4zMgl7cTl9LFtyN10hCisJYmd0CS5Mb29wM3hfY2JjX2RlYworCisuYnl0ZQkweDYwLDB4MDMsMHhiMCwweGYzCUAgYWVzZCBxMCxxOAorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorLmJ5dGUJMHg2MCwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTgKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjAsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxOAorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmVvcglxNCxxNixxNworCXN1YnMJcjIscjIsIzB4MzAKKwl2ZW9yCXE1LHEyLHE3CisJbW92bG8JcjYscjIJCQlAIHI2LCByNiwgaXMgemVybyBhdCB0aGlzIHBvaW50CisuYnl0ZQkweDYyLDB4MDMsMHhiMCwweGYzCUAgYWVzZCBxMCxxOQorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorLmJ5dGUJMHg2MiwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTkKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjIsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxOQorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmVvcglxOSxxMyxxNworCWFkZAlyMCxyMCxyNgkJQCByMCBpcyBhZGp1c3RlZCBpbiBzdWNoIHdheSB0aGF0CisJCQkJCUAgYXQgZXhpdCBmcm9tIHRoZSBsb29wIHExLXExMAorCQkJCQlAIGFyZSBsb2FkZWQgd2l0aCBsYXN0ICJ3b3JkcyIKKwl2b3JyCXE2LHExMSxxMTEKKwltb3YJcjcscjMKKy5ieXRlCTB4NjgsMHgwMywweGIwLDB4ZjMJQCBhZXNkIHEwLHExMgorLmJ5dGUJMHhjMCwweDAzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMCxxMAorLmJ5dGUJMHg2OCwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTEyCisuYnl0ZQkweGMyLDB4MjMsMHhiMCwweGYzCUAgYWVzaW1jIHExLHExCisuYnl0ZQkweDY4LDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTEyCisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2bGQxLjgJe3EyfSxbcjBdIQorLmJ5dGUJMHg2YSwweDAzLDB4YjAsMHhmMwlAIGFlc2QgcTAscTEzCisuYnl0ZQkweGMwLDB4MDMsMHhiMCwweGYzCUAgYWVzaW1jIHEwLHEwCisuYnl0ZQkweDZhLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxMTMKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NmEsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxMTMKKy5ieXRlCTB4ZTQsMHg0MywweGYwLDB4ZjMJQCBhZXNpbWMgcTEwLHExMAorCXZsZDEuOAl7cTN9LFtyMF0hCisuYnl0ZQkweDZjLDB4MDMsMHhiMCwweGYzCUAgYWVzZCBxMCxxMTQKKy5ieXRlCTB4YzAsMHgwMywweGIwLDB4ZjMJQCBhZXNpbWMgcTAscTAKKy5ieXRlCTB4NmMsMHgyMywweGIwLDB4ZjMJQCBhZXNkIHExLHExNAorLmJ5dGUJMHhjMiwweDIzLDB4YjAsMHhmMwlAIGFlc2ltYyBxMSxxMQorLmJ5dGUJMHg2YywweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHExNAorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmxkMS44CXtxMTF9LFtyMF0hCisuYnl0ZQkweDZlLDB4MDMsMHhiMCwweGYzCUAgYWVzZCBxMCxxMTUKKy5ieXRlCTB4NmUsMHgyMywweGIwLDB4ZjMJQCBhZXNkIHExLHExNQorLmJ5dGUJMHg2ZSwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHExNQorCXZsZDEuMzIJe3E4fSxbcjddIQlAIHJlLXByZS1sb2FkIHJuZGtleVswXQorCWFkZAlyNixyNSwjMgorCXZlb3IJcTQscTQscTAKKwl2ZW9yCXE1LHE1LHExCisJdmVvcglxMTAscTEwLHE5CisJdmxkMS4zMgl7cTl9LFtyN10hCUAgcmUtcHJlLWxvYWQgcm5ka2V5WzFdCisJdnN0MS44CXtxNH0sW3IxXSEKKwl2b3JyCXEwLHEyLHEyCisJdnN0MS44CXtxNX0sW3IxXSEKKwl2b3JyCXExLHEzLHEzCisJdnN0MS44CXtxMTB9LFtyMV0hCisJdm9ycglxMTAscTExLHExMQorCWJocwkuTG9vcDN4X2NiY19kZWMKKworCWNtbglyMiwjMHgzMAorCWJlcQkuTGNiY19kb25lCisJbm9wCisKKy5MY2JjX2RlY190YWlsOgorLmJ5dGUJMHg2MCwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTgKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjAsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxOAorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmxkMS4zMgl7cTh9LFtyN10hCisJc3VicwlyNixyNiwjMgorLmJ5dGUJMHg2MiwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTkKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjIsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxOQorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisJdmxkMS4zMgl7cTl9LFtyN10hCisJYmd0CS5MY2JjX2RlY190YWlsCisKKy5ieXRlCTB4NjAsMHgyMywweGIwLDB4ZjMJQCBhZXNkIHExLHE4CisuYnl0ZQkweGMyLDB4MjMsMHhiMCwweGYzCUAgYWVzaW1jIHExLHExCisuYnl0ZQkweDYwLDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTgKKy5ieXRlCTB4ZTQsMHg0MywweGYwLDB4ZjMJQCBhZXNpbWMgcTEwLHExMAorLmJ5dGUJMHg2MiwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTkKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjIsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxOQorLmJ5dGUJMHhlNCwweDQzLDB4ZjAsMHhmMwlAIGFlc2ltYyBxMTAscTEwCisuYnl0ZQkweDY4LDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxMTIKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NjgsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxMTIKKy5ieXRlCTB4ZTQsMHg0MywweGYwLDB4ZjMJQCBhZXNpbWMgcTEwLHExMAorCWNtbglyMiwjMHgyMAorLmJ5dGUJMHg2YSwweDIzLDB4YjAsMHhmMwlAIGFlc2QgcTEscTEzCisuYnl0ZQkweGMyLDB4MjMsMHhiMCwweGYzCUAgYWVzaW1jIHExLHExCisuYnl0ZQkweDZhLDB4NDMsMHhmMCwweGYzCUAgYWVzZCBxMTAscTEzCisuYnl0ZQkweGU0LDB4NDMsMHhmMCwweGYzCUAgYWVzaW1jIHExMCxxMTAKKwl2ZW9yCXE1LHE2LHE3CisuYnl0ZQkweDZjLDB4MjMsMHhiMCwweGYzCUAgYWVzZCBxMSxxMTQKKy5ieXRlCTB4YzIsMHgyMywweGIwLDB4ZjMJQCBhZXNpbWMgcTEscTEKKy5ieXRlCTB4NmMsMHg0MywweGYwLDB4ZjMJQCBhZXNkIHExMCxxMTQKKy5ieXRlCTB4ZTQsMHg0MywweGYwLDB4ZjMJQCBhZXNpbWMgcTEwLHExMAorCXZlb3IJcTkscTMscTcKKy5ieXRlCTB4NmUsMHgyMywweGIwLDB4ZjMJQCBhZXNkIHExLHExNQorLmJ5dGUJMHg2ZSwweDQzLDB4ZjAsMHhmMwlAIGFlc2QgcTEwLHExNQorCWJlcQkuTGNiY19kZWNfb25lCisJdmVvcglxNSxxNSxxMQorCXZlb3IJcTkscTkscTEwCisJdm9ycglxNixxMTEscTExCisJdnN0MS44CXtxNX0sW3IxXSEKKwl2c3QxLjgJe3E5fSxbcjFdIQorCWIJLkxjYmNfZG9uZQorCisuTGNiY19kZWNfb25lOgorCXZlb3IJcTUscTUscTEwCisJdm9ycglxNixxMTEscTExCisJdnN0MS44CXtxNX0sW3IxXSEKKworLkxjYmNfZG9uZToKKwl2c3QxLjgJe3E2fSxbcjRdCisuTGNiY19hYm9ydDoKKwl2bGRtaWEJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0KKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHBjfQorLnNpemUJYWVzX2h3X2NiY19lbmNyeXB0LC4tYWVzX2h3X2NiY19lbmNyeXB0CisuZ2xvYmwJYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzCisuaGlkZGVuCWFlc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLnR5cGUJYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzLCVmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrczoKKwltb3YJaXAsc3AKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxscn0KKwl2c3RtZGIJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0gICAgICAgICAgICBAIEFCSSBzcGVjaWZpY2F0aW9uIHNheXMgc28KKwlsZHIJcjQsIFtpcF0JCUAgbG9hZCByZW1haW5pbmcgYXJnCisJbGRyCXI1LFtyMywjMjQwXQorCisJbGRyCXI4LCBbcjQsICMxMl0KKwl2bGQxLjMyCXtxMH0sW3I0XQorCisJdmxkMS4zMgl7cTgscTl9LFtyM10JCUAgbG9hZCBrZXkgc2NoZWR1bGUuLi4KKwlzdWIJcjUscjUsIzQKKwltb3YJcjEyLCMxNgorCWNtcAlyMiwjMgorCWFkZAlyNyxyMyxyNSxsc2wjNAlAIHBvaW50ZXIgdG8gbGFzdCA1IHJvdW5kIGtleXMKKwlzdWIJcjUscjUsIzIKKwl2bGQxLjMyCXtxMTIscTEzfSxbcjddIQorCXZsZDEuMzIJe3ExNCxxMTV9LFtyN10hCisJdmxkMS4zMgl7cTd9LFtyN10KKwlhZGQJcjcscjMsIzMyCisJbW92CXI2LHI1CisJbW92bG8JcjEyLCMwCisjaWZuZGVmIF9fQVJNRUJfXworCXJldglyOCwgcjgKKyNlbmRpZgorCXZvcnIJcTEscTAscTAKKwlhZGQJcjEwLCByOCwgIzEKKwl2b3JyCXExMCxxMCxxMAorCWFkZAlyOCwgcjgsICMyCisJdm9ycglxNixxMCxxMAorCXJldglyMTAsIHIxMAorCXZtb3YuMzIJZDNbMV0scjEwCisJYmxzCS5MY3RyMzJfdGFpbAorCXJldglyMTIsIHI4CisJc3ViCXIyLHIyLCMzCQlAIGJpYXMKKwl2bW92LjMyCWQyMVsxXSxyMTIKKwliCS5Mb29wM3hfY3RyMzIKKworLmFsaWduCTQKKy5Mb29wM3hfY3RyMzI6CisuYnl0ZQkweDIwLDB4MDMsMHhiMCwweGYzCUAgYWVzZSBxMCxxOAorLmJ5dGUJMHg4MCwweDAzLDB4YjAsMHhmMwlAIGFlc21jIHEwLHEwCisuYnl0ZQkweDIwLDB4MjMsMHhiMCwweGYzCUAgYWVzZSBxMSxxOAorLmJ5dGUJMHg4MiwweDIzLDB4YjAsMHhmMwlAIGFlc21jIHExLHExCisuYnl0ZQkweDIwLDB4NDMsMHhmMCwweGYzCUAgYWVzZSBxMTAscTgKKy5ieXRlCTB4YTQsMHg0MywweGYwLDB4ZjMJQCBhZXNtYyBxMTAscTEwCisJdmxkMS4zMgl7cTh9LFtyN10hCisJc3VicwlyNixyNiwjMgorLmJ5dGUJMHgyMiwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTkKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyMiwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTkKKy5ieXRlCTB4ODIsMHgyMywweGIwLDB4ZjMJQCBhZXNtYyBxMSxxMQorLmJ5dGUJMHgyMiwweDQzLDB4ZjAsMHhmMwlAIGFlc2UgcTEwLHE5CisuYnl0ZQkweGE0LDB4NDMsMHhmMCwweGYzCUAgYWVzbWMgcTEwLHExMAorCXZsZDEuMzIJe3E5fSxbcjddIQorCWJndAkuTG9vcDN4X2N0cjMyCisKKy5ieXRlCTB4MjAsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE4CisuYnl0ZQkweDgwLDB4ODMsMHhiMCwweGYzCUAgYWVzbWMgcTQscTAKKy5ieXRlCTB4MjAsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHE4CisuYnl0ZQkweDgyLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTEKKwl2bGQxLjgJe3EyfSxbcjBdIQorCXZvcnIJcTAscTYscTYKKy5ieXRlCTB4MjAsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxOAorLmJ5dGUJMHhhNCwweDQzLDB4ZjAsMHhmMwlAIGFlc21jIHExMCxxMTAKKwl2bGQxLjgJe3EzfSxbcjBdIQorCXZvcnIJcTEscTYscTYKKy5ieXRlCTB4MjIsMHg4MywweGIwLDB4ZjMJQCBhZXNlIHE0LHE5CisuYnl0ZQkweDg4LDB4ODMsMHhiMCwweGYzCUAgYWVzbWMgcTQscTQKKy5ieXRlCTB4MjIsMHhhMywweGIwLDB4ZjMJQCBhZXNlIHE1LHE5CisuYnl0ZQkweDhhLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTUKKwl2bGQxLjgJe3ExMX0sW3IwXSEKKwltb3YJcjcscjMKKy5ieXRlCTB4MjIsMHg0MywweGYwLDB4ZjMJQCBhZXNlIHExMCxxOQorLmJ5dGUJMHhhNCwweDIzLDB4ZjAsMHhmMwlAIGFlc21jIHE5LHExMAorCXZvcnIJcTEwLHE2LHE2CisJYWRkCXI5LHI4LCMxCisuYnl0ZQkweDI4LDB4ODMsMHhiMCwweGYzCUAgYWVzZSBxNCxxMTIKKy5ieXRlCTB4ODgsMHg4MywweGIwLDB4ZjMJQCBhZXNtYyBxNCxxNAorLmJ5dGUJMHgyOCwweGEzLDB4YjAsMHhmMwlAIGFlc2UgcTUscTEyCisuYnl0ZQkweDhhLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTUKKwl2ZW9yCXEyLHEyLHE3CisJYWRkCXIxMCxyOCwjMgorLmJ5dGUJMHgyOCwweDIzLDB4ZjAsMHhmMwlAIGFlc2UgcTkscTEyCisuYnl0ZQkweGEyLDB4MjMsMHhmMCwweGYzCUAgYWVzbWMgcTkscTkKKwl2ZW9yCXEzLHEzLHE3CisJYWRkCXI4LHI4LCMzCisuYnl0ZQkweDJhLDB4ODMsMHhiMCwweGYzCUAgYWVzZSBxNCxxMTMKKy5ieXRlCTB4ODgsMHg4MywweGIwLDB4ZjMJQCBhZXNtYyBxNCxxNAorLmJ5dGUJMHgyYSwweGEzLDB4YjAsMHhmMwlAIGFlc2UgcTUscTEzCisuYnl0ZQkweDhhLDB4YTMsMHhiMCwweGYzCUAgYWVzbWMgcTUscTUKKwl2ZW9yCXExMSxxMTEscTcKKwlyZXYJcjkscjkKKy5ieXRlCTB4MmEsMHgyMywweGYwLDB4ZjMJQCBhZXNlIHE5LHExMworLmJ5dGUJMHhhMiwweDIzLDB4ZjAsMHhmMwlAIGFlc21jIHE5LHE5CisJdm1vdi4zMglkMVsxXSwgcjkKKwlyZXYJcjEwLHIxMAorLmJ5dGUJMHgyYywweDgzLDB4YjAsMHhmMwlAIGFlc2UgcTQscTE0CisuYnl0ZQkweDg4LDB4ODMsMHhiMCwweGYzCUAgYWVzbWMgcTQscTQKKy5ieXRlCTB4MmMsMHhhMywweGIwLDB4ZjMJQCBhZXNlIHE1LHExNAorLmJ5dGUJMHg4YSwweGEzLDB4YjAsMHhmMwlAIGFlc21jIHE1LHE1CisJdm1vdi4zMglkM1sxXSwgcjEwCisJcmV2CXIxMixyOAorLmJ5dGUJMHgyYywweDIzLDB4ZjAsMHhmMwlAIGFlc2UgcTkscTE0CisuYnl0ZQkweGEyLDB4MjMsMHhmMCwweGYzCUAgYWVzbWMgcTkscTkKKwl2bW92LjMyCWQyMVsxXSwgcjEyCisJc3VicwlyMixyMiwjMworLmJ5dGUJMHgyZSwweDgzLDB4YjAsMHhmMwlAIGFlc2UgcTQscTE1CisuYnl0ZQkweDJlLDB4YTMsMHhiMCwweGYzCUAgYWVzZSBxNSxxMTUKKy5ieXRlCTB4MmUsMHgyMywweGYwLDB4ZjMJQCBhZXNlIHE5LHExNQorCisJdmVvcglxMixxMixxNAorCXZsZDEuMzIJe3E4fSxbcjddIQlAIHJlLXByZS1sb2FkIHJuZGtleVswXQorCXZzdDEuOAl7cTJ9LFtyMV0hCisJdmVvcglxMyxxMyxxNQorCW1vdglyNixyNQorCXZzdDEuOAl7cTN9LFtyMV0hCisJdmVvcglxMTEscTExLHE5CisJdmxkMS4zMgl7cTl9LFtyN10hCUAgcmUtcHJlLWxvYWQgcm5ka2V5WzFdCisJdnN0MS44CXtxMTF9LFtyMV0hCisJYmhzCS5Mb29wM3hfY3RyMzIKKworCWFkZHMJcjIscjIsIzMKKwliZXEJLkxjdHIzMl9kb25lCisJY21wCXIyLCMxCisJbW92CXIxMiwjMTYKKwltb3ZlcQlyMTIsIzAKKworLkxjdHIzMl90YWlsOgorLmJ5dGUJMHgyMCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTgKKy5ieXRlCTB4ODAsMHgwMywweGIwLDB4ZjMJQCBhZXNtYyBxMCxxMAorLmJ5dGUJMHgyMCwweDIzLDB4YjAsMHhmMwlAIGFlc2UgcTEscTgKKy5ieXRlCTB4ODIsMHgyMywweGIwLDB4ZjMJQCBhZXNtYyBxMSxxMQorCXZsZDEuMzIJe3E4fSxbcjddIQorCXN1YnMJcjYscjYsIzIKKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjIsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHE5CisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKwl2bGQxLjMyCXtxOX0sW3I3XSEKKwliZ3QJLkxjdHIzMl90YWlsCisKKy5ieXRlCTB4MjAsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE4CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjAsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHE4CisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKy5ieXRlCTB4MjIsMHgwMywweGIwLDB4ZjMJQCBhZXNlIHEwLHE5CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjIsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHE5CisuYnl0ZQkweDgyLDB4MjMsMHhiMCwweGYzCUAgYWVzbWMgcTEscTEKKwl2bGQxLjgJe3EyfSxbcjBdLHIxMgorLmJ5dGUJMHgyOCwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTEyCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MjgsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHExMgorLmJ5dGUJMHg4MiwweDIzLDB4YjAsMHhmMwlAIGFlc21jIHExLHExCisJdmxkMS44CXtxM30sW3IwXQorLmJ5dGUJMHgyYSwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTEzCisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MmEsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHExMworLmJ5dGUJMHg4MiwweDIzLDB4YjAsMHhmMwlAIGFlc21jIHExLHExCisJdmVvcglxMixxMixxNworLmJ5dGUJMHgyYywweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTE0CisuYnl0ZQkweDgwLDB4MDMsMHhiMCwweGYzCUAgYWVzbWMgcTAscTAKKy5ieXRlCTB4MmMsMHgyMywweGIwLDB4ZjMJQCBhZXNlIHExLHExNAorLmJ5dGUJMHg4MiwweDIzLDB4YjAsMHhmMwlAIGFlc21jIHExLHExCisJdmVvcglxMyxxMyxxNworLmJ5dGUJMHgyZSwweDAzLDB4YjAsMHhmMwlAIGFlc2UgcTAscTE1CisuYnl0ZQkweDJlLDB4MjMsMHhiMCwweGYzCUAgYWVzZSBxMSxxMTUKKworCWNtcAlyMiwjMQorCXZlb3IJcTIscTIscTAKKwl2ZW9yCXEzLHEzLHExCisJdnN0MS44CXtxMn0sW3IxXSEKKwliZXEJLkxjdHIzMl9kb25lCisJdnN0MS44CXtxM30sW3IxXQorCisuTGN0cjMyX2RvbmU6CisJdmxkbWlhCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscGN9Cisuc2l6ZQlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MsLi1hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9hcm12NC1tb250LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9hcm12NC1tb250LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2ODVmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2FybXY0LW1vbnQuUwpAQCAtMCwwICsxLDk2MSBAQAorI2lmIGRlZmluZWQoX19hcm1fXykKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKK0AgU2lsZW5jZSBBUk12OCBkZXByZWNhdGVkIElUIGluc3RydWN0aW9uIHdhcm5pbmdzLiBUaGlzIGZpbGUgaXMgdXNlZCBieSBib3RoCitAIEFSTXY3IGFuZCBBUk12OCBwcm9jZXNzb3JzIGFuZCBkb2VzIG5vdCB1c2UgQVJNdjggaW5zdHJ1Y3Rpb25zLgorLmFyY2gJYXJtdjctYQorCisudGV4dAorI2lmIGRlZmluZWQoX190aHVtYjJfXykKKy5zeW50YXgJdW5pZmllZAorLnRodW1iCisjZWxzZQorLmNvZGUJMzIKKyNlbmRpZgorCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLmFsaWduCTUKKy5MT1BFTlNTTF9hcm1jYXA6Cisud29yZAlPUEVOU1NMX2FybWNhcF9QLS5MYm5fbXVsX21vbnQKKyNlbmRpZgorCisuZ2xvYmwJYm5fbXVsX21vbnQKKy5oaWRkZW4JYm5fbXVsX21vbnQKKy50eXBlCWJuX211bF9tb250LCVmdW5jdGlvbgorCisuYWxpZ24JNQorYm5fbXVsX21vbnQ6CisuTGJuX211bF9tb250OgorCWxkcglpcCxbc3AsIzRdCQlAIGxvYWQgbnVtCisJc3RtZGIJc3AhLHtyMCxyMn0JCUAgc3AgcG9pbnRzIGF0IGFyZ3VtZW50IGJsb2NrCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworCXRzdAlpcCwjNworCWJuZQkuTGlhbHUKKwlhZHIJcjAsLkxibl9tdWxfbW9udAorCWxkcglyMiwuTE9QRU5TU0xfYXJtY2FwCisJbGRyCXIwLFtyMCxyMl0KKyNpZmRlZglfX0FQUExFX18KKwlsZHIJcjAsW3IwXQorI2VuZGlmCisJdHN0CXIwLCNBUk1WN19ORU9OCQlAIE5FT04gYXZhaWxhYmxlPworCWxkbWlhCXNwLCB7cjAscjJ9CisJYmVxCS5MaWFsdQorCWFkZAlzcCxzcCwjOAorCWIJYm5fbXVsOHhfbW9udF9uZW9uCisuYWxpZ24JNAorLkxpYWx1OgorI2VuZGlmCisJY21wCWlwLCMyCisJbW92CXIwLGlwCQkJQCBsb2FkIG51bQorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHR0CWx0CisjZW5kaWYKKwltb3ZsdAlyMCwjMAorCWFkZGx0CXNwLHNwLCMyKjQKKwlibHQJLkxhYnJ0CisKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQkJQCBzYXZlIDEwIHJlZ2lzdGVycworCisJbW92CXIwLHIwLGxzbCMyCQlAIHJlc2NhbGUgcjAgZm9yIGJ5dGUgY291bnQKKwlzdWIJc3Asc3AscjAJCUAgYWxsb2NhKDQqbnVtKQorCXN1YglzcCxzcCwjNAkJQCArZXh0cmEgZHdvcmQKKwlzdWIJcjAscjAsIzQJCUAgIm51bT1udW0tMSIKKwlhZGQJcjQscjIscjAJCUAgJmJwW251bS0xXQorCisJYWRkCXIwLHNwLHIwCQlAIHIwIHRvIHBvaW50IGF0ICZ0cFtudW0tMV0KKwlsZHIJcjgsW3IwLCMxNCo0XQkJQCAmbjAKKwlsZHIJcjIsW3IyXQkJQCBicFswXQorCWxkcglyNSxbcjFdLCM0CQlAIGFwWzBdLGFwKysKKwlsZHIJcjYsW3IzXSwjNAkJQCBucFswXSxucCsrCisJbGRyCXI4LFtyOF0JCUAgKm4wCisJc3RyCXI0LFtyMCwjMTUqNF0JCUAgc2F2ZSAmYnBbbnVtXQorCisJdW11bGwJcjEwLHIxMSxyNSxyMglAIGFwWzBdKmJwWzBdCisJc3RyCXI4LFtyMCwjMTQqNF0JCUAgc2F2ZSBuMCB2YWx1ZQorCW11bAlyOCxyMTAscjgJCUAgInRwWzBdIipuMAorCW1vdglyMTIsIzAKKwl1bWxhbAlyMTAscjEyLHI2LHI4CUAgbnBbMF0qbjArInRbMF0iCisJbW92CXI0LHNwCisKKy5MMXN0OgorCWxkcglyNSxbcjFdLCM0CQlAIGFwW2pdLGFwKysKKwltb3YJcjEwLHIxMQorCWxkcglyNixbcjNdLCM0CQlAIG5wW2pdLG5wKysKKwltb3YJcjExLCMwCisJdW1sYWwJcjEwLHIxMSxyNSxyMglAIGFwW2pdKmJwWzBdCisJbW92CXIxNCwjMAorCXVtbGFsCXIxMixyMTQscjYscjgJQCBucFtqXSpuMAorCWFkZHMJcjEyLHIxMixyMTAKKwlzdHIJcjEyLFtyNF0sIzQJCUAgdHBbai0xXT0sdHArKworCWFkYwlyMTIscjE0LCMwCisJY21wCXI0LHIwCisJYm5lCS5MMXN0CisKKwlhZGRzCXIxMixyMTIscjExCisJbGRyCXI0LFtyMCwjMTMqNF0JCUAgcmVzdG9yZSBicAorCW1vdglyMTQsIzAKKwlsZHIJcjgsW3IwLCMxNCo0XQkJQCByZXN0b3JlIG4wCisJYWRjCXIxNCxyMTQsIzAKKwlzdHIJcjEyLFtyMF0JCUAgdHBbbnVtLTFdPQorCW1vdglyNyxzcAorCXN0cglyMTQsW3IwLCM0XQkJQCB0cFtudW1dPQorCisuTG91dGVyOgorCXN1YglyNyxyMCxyNwkJQCAib3JpZ2luYWwiIHIwLTEgdmFsdWUKKwlzdWIJcjEscjEscjcJCUAgInJld2luZCIgYXAgdG8gJmFwWzFdCisJbGRyCXIyLFtyNCwjNF0hCQlAICooKyticCkKKwlzdWIJcjMscjMscjcJCUAgInJld2luZCIgbnAgdG8gJm5wWzFdCisJbGRyCXI1LFtyMSwjLTRdCQlAIGFwWzBdCisJbGRyCXIxMCxbc3BdCQlAIHRwWzBdCisJbGRyCXI2LFtyMywjLTRdCQlAIG5wWzBdCisJbGRyCXI3LFtzcCwjNF0JCUAgdHBbMV0KKworCW1vdglyMTEsIzAKKwl1bWxhbAlyMTAscjExLHI1LHIyCUAgYXBbMF0qYnBbaV0rdHBbMF0KKwlzdHIJcjQsW3IwLCMxMyo0XQkJQCBzYXZlIGJwCisJbXVsCXI4LHIxMCxyOAorCW1vdglyMTIsIzAKKwl1bWxhbAlyMTAscjEyLHI2LHI4CUAgbnBbMF0qbjArInRwWzBdIgorCW1vdglyNCxzcAorCisuTGlubmVyOgorCWxkcglyNSxbcjFdLCM0CQlAIGFwW2pdLGFwKysKKwlhZGRzCXIxMCxyMTEscjcJCUAgKz10cFtqXQorCWxkcglyNixbcjNdLCM0CQlAIG5wW2pdLG5wKysKKwltb3YJcjExLCMwCisJdW1sYWwJcjEwLHIxMSxyNSxyMglAIGFwW2pdKmJwW2ldCisJbW92CXIxNCwjMAorCXVtbGFsCXIxMixyMTQscjYscjgJQCBucFtqXSpuMAorCWFkYwlyMTEscjExLCMwCisJbGRyCXI3LFtyNCwjOF0JCUAgdHBbaisxXQorCWFkZHMJcjEyLHIxMixyMTAKKwlzdHIJcjEyLFtyNF0sIzQJCUAgdHBbai0xXT0sdHArKworCWFkYwlyMTIscjE0LCMwCisJY21wCXI0LHIwCisJYm5lCS5MaW5uZXIKKworCWFkZHMJcjEyLHIxMixyMTEKKwltb3YJcjE0LCMwCisJbGRyCXI0LFtyMCwjMTMqNF0JCUAgcmVzdG9yZSBicAorCWFkYwlyMTQscjE0LCMwCisJbGRyCXI4LFtyMCwjMTQqNF0JCUAgcmVzdG9yZSBuMAorCWFkZHMJcjEyLHIxMixyNworCWxkcglyNyxbcjAsIzE1KjRdCQlAIHJlc3RvcmUgJmJwW251bV0KKwlhZGMJcjE0LHIxNCwjMAorCXN0cglyMTIsW3IwXQkJQCB0cFtudW0tMV09CisJc3RyCXIxNCxbcjAsIzRdCQlAIHRwW251bV09CisKKwljbXAJcjQscjcKKyNpZmRlZglfX3RodW1iMl9fCisJaXR0CW5lCisjZW5kaWYKKwltb3ZuZQlyNyxzcAorCWJuZQkuTG91dGVyCisKKwlsZHIJcjIsW3IwLCMxMio0XQkJQCBwdWxsIHJwCisJbW92CXI1LHNwCisJYWRkCXIwLHIwLCM0CQlAIHIwIHRvIHBvaW50IGF0ICZ0cFtudW1dCisJc3ViCXI1LHIwLHI1CQlAICJvcmlnaW5hbCIgbnVtIHZhbHVlCisJbW92CXI0LHNwCQkJQCAicmV3aW5kIiByNAorCW1vdglyMSxyNAkJCUAgImJvcnJvdyIgcjEKKwlzdWIJcjMscjMscjUJCUAgInJld2luZCIgcjMgdG8gJm5wWzBdCisKKwlzdWJzCXI3LHI3LHI3CQlAICJjbGVhciIgY2FycnkgZmxhZworLkxzdWI6CWxkcglyNyxbcjRdLCM0CisJbGRyCXI2LFtyM10sIzQKKwlzYmNzCXI3LHI3LHI2CQlAIHRwW2pdLW5wW2pdCisJc3RyCXI3LFtyMl0sIzQJCUAgcnBbal09CisJdGVxCXI0LHIwCQlAIHByZXNlcnZlIGNhcnJ5CisJYm5lCS5Mc3ViCisJc2JjcwlyMTQscjE0LCMwCQlAIHVwbW9zdCBjYXJyeQorCW1vdglyNCxzcAkJCUAgInJld2luZCIgcjQKKwlzdWIJcjIscjIscjUJCUAgInJld2luZCIgcjIKKworLkxjb3B5OglsZHIJcjcsW3I0XQkJQCBjb25kaXRpb25hbCBjb3B5CisJbGRyCXI1LFtyMl0KKwlzdHIJc3AsW3I0XSwjNAkJQCB6YXAgdHAKKyNpZmRlZglfX3RodW1iMl9fCisJaXQJY2MKKyNlbmRpZgorCW1vdmNjCXI1LHI3CisJc3RyCXI1LFtyMl0sIzQKKwl0ZXEJcjQscjAJCUAgcHJlc2VydmUgY2FycnkKKwlibmUJLkxjb3B5CisKKwltb3YJc3AscjAKKwlhZGQJc3Asc3AsIzQJCUAgc2tpcCBvdmVyIHRwW251bSsxXQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CQlAIHJlc3RvcmUgcmVnaXN0ZXJzCisJYWRkCXNwLHNwLCMyKjQJCUAgc2tpcCBvdmVyIHtyMCxyMn0KKwltb3YJcjAsIzEKKy5MYWJydDoKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlieAlscgkJCQlAIGJ4IGxyCisjZWxzZQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKy53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorLnNpemUJYm5fbXVsX21vbnQsLi1ibl9tdWxfbW9udAorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKy5hcmNoCWFybXY3LWEKKy5mcHUJbmVvbgorCisudHlwZQlibl9tdWw4eF9tb250X25lb24sJWZ1bmN0aW9uCisuYWxpZ24JNQorYm5fbXVsOHhfbW9udF9uZW9uOgorCW1vdglpcCxzcAorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0KKwl2c3RtZGIJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0JCUAgQUJJIHNwZWNpZmljYXRpb24gc2F5cyBzbworCWxkbWlhCWlwLHtyNCxyNX0JCUAgbG9hZCByZXN0IG9mIHBhcmFtZXRlciBibG9jaworCW1vdglpcCxzcAorCisJY21wCXI1LCM4CisJYmhpCS5MTkVPTl84bgorCisJQCBzcGVjaWFsIGNhc2UgZm9yIHI1PT04LCBldmVyeXRoaW5nIGlzIGluIHJlZ2lzdGVyIGJhbmsuLi4KKworCXZsZDEuMzIJe2QyOFswXX0sIFtyMiw6MzJdIQorCXZlb3IJZDgsZDgsZDgKKwlzdWIJcjcsc3AscjUsbHNsIzQKKwl2bGQxLjMyCXtkMCxkMSxkMixkM30sICBbcjFdIQkJQCBjYW4ndCBzcGVjaWZ5IDozMiA6LSgKKwlhbmQJcjcscjcsIy02NAorCXZsZDEuMzIJe2QzMFswXX0sIFtyNCw6MzJdCisJbW92CXNwLHI3CQkJQCBhbGxvY2EKKwl2emlwLjE2CWQyOCxkOAorCisJdm11bGwudTMyCXE2LGQyOCxkMFswXQorCXZtdWxsLnUzMglxNyxkMjgsZDBbMV0KKwl2bXVsbC51MzIJcTgsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQxMywjMTYKKwl2bXVsbC51MzIJcTksZDI4LGQxWzFdCisKKwl2YWRkLnU2NAlkMjksZDI5LGQxMgorCXZlb3IJZDgsZDgsZDgKKwl2bXVsLnUzMglkMjksZDI5LGQzMAorCisJdm11bGwudTMyCXExMCxkMjgsZDJbMF0KKwl2bGQxLjMyCXtkNCxkNSxkNixkN30sIFtyM10hCisJdm11bGwudTMyCXExMSxkMjgsZDJbMV0KKwl2bXVsbC51MzIJcTEyLGQyOCxkM1swXQorCXZ6aXAuMTYJZDI5LGQ4CisJdm11bGwudTMyCXExMyxkMjgsZDNbMV0KKworCXZtbGFsLnUzMglxNixkMjksZDRbMF0KKwlzdWIJcjkscjUsIzEKKwl2bWxhbC51MzIJcTcsZDI5LGQ0WzFdCisJdm1sYWwudTMyCXE4LGQyOSxkNVswXQorCXZtbGFsLnUzMglxOSxkMjksZDVbMV0KKworCXZtbGFsLnUzMglxMTAsZDI5LGQ2WzBdCisJdm1vdglxNSxxNgorCXZtbGFsLnUzMglxMTEsZDI5LGQ2WzFdCisJdm1vdglxNixxNworCXZtbGFsLnUzMglxMTIsZDI5LGQ3WzBdCisJdm1vdglxNyxxOAorCXZtbGFsLnUzMglxMTMsZDI5LGQ3WzFdCisJdm1vdglxOCxxOQorCXZtb3YJcTkscTEwCisJdnNoci51NjQJZDEwLGQxMCwjMTYKKwl2bW92CXExMCxxMTEKKwl2bW92CXExMSxxMTIKKwl2YWRkLnU2NAlkMTAsZDEwLGQxMQorCXZtb3YJcTEyLHExMworCXZlb3IJcTEzLHExMworCXZzaHIudTY0CWQxMCxkMTAsIzE2CisKKwliCS5MTkVPTl9vdXRlcjgKKworLmFsaWduCTQKKy5MTkVPTl9vdXRlcjg6CisJdmxkMS4zMgl7ZDI4WzBdfSwgW3IyLDozMl0hCisJdmVvcglkOCxkOCxkOAorCXZ6aXAuMTYJZDI4LGQ4CisJdmFkZC51NjQJZDEyLGQxMixkMTAKKworCXZtbGFsLnUzMglxNixkMjgsZDBbMF0KKwl2bWxhbC51MzIJcTcsZDI4LGQwWzFdCisJdm1sYWwudTMyCXE4LGQyOCxkMVswXQorCXZzaGwuaTY0CWQyOSxkMTMsIzE2CisJdm1sYWwudTMyCXE5LGQyOCxkMVsxXQorCisJdmFkZC51NjQJZDI5LGQyOSxkMTIKKwl2ZW9yCWQ4LGQ4LGQ4CisJc3VicwlyOSxyOSwjMQorCXZtdWwudTMyCWQyOSxkMjksZDMwCisKKwl2bWxhbC51MzIJcTEwLGQyOCxkMlswXQorCXZtbGFsLnUzMglxMTEsZDI4LGQyWzFdCisJdm1sYWwudTMyCXExMixkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxMTMsZDI4LGQzWzFdCisKKwl2bWxhbC51MzIJcTYsZDI5LGQ0WzBdCisJdm1sYWwudTMyCXE3LGQyOSxkNFsxXQorCXZtbGFsLnUzMglxOCxkMjksZDVbMF0KKwl2bWxhbC51MzIJcTksZDI5LGQ1WzFdCisKKwl2bWxhbC51MzIJcTEwLGQyOSxkNlswXQorCXZtb3YJcTUscTYKKwl2bWxhbC51MzIJcTExLGQyOSxkNlsxXQorCXZtb3YJcTYscTcKKwl2bWxhbC51MzIJcTEyLGQyOSxkN1swXQorCXZtb3YJcTcscTgKKwl2bWxhbC51MzIJcTEzLGQyOSxkN1sxXQorCXZtb3YJcTgscTkKKwl2bW92CXE5LHExMAorCXZzaHIudTY0CWQxMCxkMTAsIzE2CisJdm1vdglxMTAscTExCisJdm1vdglxMTEscTEyCisJdmFkZC51NjQJZDEwLGQxMCxkMTEKKwl2bW92CXExMixxMTMKKwl2ZW9yCXExMyxxMTMKKwl2c2hyLnU2NAlkMTAsZDEwLCMxNgorCisJYm5lCS5MTkVPTl9vdXRlcjgKKworCXZhZGQudTY0CWQxMixkMTIsZDEwCisJbW92CXI3LHNwCisJdnNoci51NjQJZDEwLGQxMiwjMTYKKwltb3YJcjgscjUKKwl2YWRkLnU2NAlkMTMsZDEzLGQxMAorCWFkZAlyNixzcCwjOTYKKwl2c2hyLnU2NAlkMTAsZDEzLCMxNgorCXZ6aXAuMTYJZDEyLGQxMworCisJYgkuTE5FT05fdGFpbF9lbnRyeQorCisuYWxpZ24JNAorLkxORU9OXzhuOgorCXZlb3IJcTYscTYscTYKKwlzdWIJcjcsc3AsIzEyOAorCXZlb3IJcTcscTcscTcKKwlzdWIJcjcscjcscjUsbHNsIzQKKwl2ZW9yCXE4LHE4LHE4CisJYW5kCXI3LHI3LCMtNjQKKwl2ZW9yCXE5LHE5LHE5CisJbW92CXNwLHI3CQkJQCBhbGxvY2EKKwl2ZW9yCXExMCxxMTAscTEwCisJYWRkCXI3LHI3LCMyNTYKKwl2ZW9yCXExMSxxMTEscTExCisJc3ViCXI4LHI1LCM4CisJdmVvcglxMTIscTEyLHExMgorCXZlb3IJcTEzLHExMyxxMTMKKworLkxORU9OXzhuX2luaXQ6CisJdnN0MS42NAl7cTYscTd9LFtyNyw6MjU2XSEKKwlzdWJzCXI4LHI4LCM4CisJdnN0MS42NAl7cTgscTl9LFtyNyw6MjU2XSEKKwl2c3QxLjY0CXtxMTAscTExfSxbcjcsOjI1Nl0hCisJdnN0MS42NAl7cTEyLHExM30sW3I3LDoyNTZdIQorCWJuZQkuTE5FT05fOG5faW5pdAorCisJYWRkCXI2LHNwLCMyNTYKKwl2bGQxLjMyCXtkMCxkMSxkMixkM30sW3IxXSEKKwlhZGQJcjEwLHNwLCM4CisJdmxkMS4zMgl7ZDMwWzBdfSxbcjQsOjMyXQorCW1vdglyOSxyNQorCWIJLkxORU9OXzhuX291dGVyCisKKy5hbGlnbgk0CisuTE5FT05fOG5fb3V0ZXI6CisJdmxkMS4zMgl7ZDI4WzBdfSxbcjIsOjMyXSEJQCAqYisrCisJdmVvcglkOCxkOCxkOAorCXZ6aXAuMTYJZDI4LGQ4CisJYWRkCXI3LHNwLCMxMjgKKwl2bGQxLjMyCXtkNCxkNSxkNixkN30sW3IzXSEKKworCXZtbGFsLnUzMglxNixkMjgsZDBbMF0KKwl2bWxhbC51MzIJcTcsZDI4LGQwWzFdCisJdmVvcglkOCxkOCxkOAorCXZtbGFsLnUzMglxOCxkMjgsZDFbMF0KKwl2c2hsLmk2NAlkMjksZDEzLCMxNgorCXZtbGFsLnUzMglxOSxkMjgsZDFbMV0KKwl2YWRkLnU2NAlkMjksZDI5LGQxMgorCXZtbGFsLnUzMglxMTAsZDI4LGQyWzBdCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKwl2bWxhbC51MzIJcTExLGQyOCxkMlsxXQorCXZzdDEuMzIJe2QyOH0sW3NwLDo2NF0JCUAgcHV0IGFzaWRlIHNtYXNoZWQgYls4KmkrMF0KKwl2bWxhbC51MzIJcTEyLGQyOCxkM1swXQorCXZ6aXAuMTYJZDI5LGQ4CisJdm1sYWwudTMyCXExMyxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjhbMF19LFtyMiw6MzJdIQlAICpiKysKKwl2bWxhbC51MzIJcTYsZDI5LGQ0WzBdCisJdmVvcglkMTAsZDEwLGQxMAorCXZtbGFsLnUzMglxNyxkMjksZDRbMV0KKwl2emlwLjE2CWQyOCxkMTAKKwl2bWxhbC51MzIJcTgsZDI5LGQ1WzBdCisJdnNoci51NjQJZDEyLGQxMiwjMTYKKwl2bWxhbC51MzIJcTksZDI5LGQ1WzFdCisJdm1sYWwudTMyCXExMCxkMjksZDZbMF0KKwl2YWRkLnU2NAlkMTIsZDEyLGQxMworCXZtbGFsLnUzMglxMTEsZDI5LGQ2WzFdCisJdnNoci51NjQJZDEyLGQxMiwjMTYKKwl2bWxhbC51MzIJcTEyLGQyOSxkN1swXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ3WzFdCisJdmFkZC51NjQJZDE0LGQxNCxkMTIKKwl2c3QxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBtWzgqaSswXQorCXZtbGFsLnUzMglxNyxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxNn0sW3I2LDoxMjhdIQorCXZtbGFsLnUzMglxOCxkMjgsZDBbMV0KKwl2ZW9yCWQ4LGQ4LGQ4CisJdm1sYWwudTMyCXE5LGQyOCxkMVswXQorCXZzaGwuaTY0CWQyOSxkMTUsIzE2CisJdm1sYWwudTMyCXExMCxkMjgsZDFbMV0KKwl2YWRkLnU2NAlkMjksZDI5LGQxNAorCXZtbGFsLnUzMglxMTEsZDI4LGQyWzBdCisJdm11bC51MzIJZDI5LGQyOSxkMzAKKwl2bWxhbC51MzIJcTEyLGQyOCxkMlsxXQorCXZzdDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1dCBhc2lkZSBzbWFzaGVkIGJbOCppKzFdCisJdm1sYWwudTMyCXExMyxkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxNixkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjhbMF19LFtyMiw6MzJdIQlAICpiKysKKwl2bWxhbC51MzIJcTcsZDI5LGQ0WzBdCisJdmVvcglkMTAsZDEwLGQxMAorCXZtbGFsLnUzMglxOCxkMjksZDRbMV0KKwl2emlwLjE2CWQyOCxkMTAKKwl2bWxhbC51MzIJcTksZDI5LGQ1WzBdCisJdnNoci51NjQJZDE0LGQxNCwjMTYKKwl2bWxhbC51MzIJcTEwLGQyOSxkNVsxXQorCXZtbGFsLnUzMglxMTEsZDI5LGQ2WzBdCisJdmFkZC51NjQJZDE0LGQxNCxkMTUKKwl2bWxhbC51MzIJcTEyLGQyOSxkNlsxXQorCXZzaHIudTY0CWQxNCxkMTQsIzE2CisJdm1sYWwudTMyCXExMyxkMjksZDdbMF0KKwl2bWxhbC51MzIJcTYsZDI5LGQ3WzFdCisJdmFkZC51NjQJZDE2LGQxNixkMTQKKwl2c3QxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBtWzgqaSsxXQorCXZtbGFsLnUzMglxOCxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxN30sW3I2LDoxMjhdIQorCXZtbGFsLnUzMglxOSxkMjgsZDBbMV0KKwl2ZW9yCWQ4LGQ4LGQ4CisJdm1sYWwudTMyCXExMCxkMjgsZDFbMF0KKwl2c2hsLmk2NAlkMjksZDE3LCMxNgorCXZtbGFsLnUzMglxMTEsZDI4LGQxWzFdCisJdmFkZC51NjQJZDI5LGQyOSxkMTYKKwl2bWxhbC51MzIJcTEyLGQyOCxkMlswXQorCXZtdWwudTMyCWQyOSxkMjksZDMwCisJdm1sYWwudTMyCXExMyxkMjgsZDJbMV0KKwl2c3QxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBiWzgqaSsyXQorCXZtbGFsLnUzMglxNixkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxNyxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjhbMF19LFtyMiw6MzJdIQlAICpiKysKKwl2bWxhbC51MzIJcTgsZDI5LGQ0WzBdCisJdmVvcglkMTAsZDEwLGQxMAorCXZtbGFsLnUzMglxOSxkMjksZDRbMV0KKwl2emlwLjE2CWQyOCxkMTAKKwl2bWxhbC51MzIJcTEwLGQyOSxkNVswXQorCXZzaHIudTY0CWQxNixkMTYsIzE2CisJdm1sYWwudTMyCXExMSxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTEyLGQyOSxkNlswXQorCXZhZGQudTY0CWQxNixkMTYsZDE3CisJdm1sYWwudTMyCXExMyxkMjksZDZbMV0KKwl2c2hyLnU2NAlkMTYsZDE2LCMxNgorCXZtbGFsLnUzMglxNixkMjksZDdbMF0KKwl2bWxhbC51MzIJcTcsZDI5LGQ3WzFdCisJdmFkZC51NjQJZDE4LGQxOCxkMTYKKwl2c3QxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBtWzgqaSsyXQorCXZtbGFsLnUzMglxOSxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxOH0sW3I2LDoxMjhdIQorCXZtbGFsLnUzMglxMTAsZDI4LGQwWzFdCisJdmVvcglkOCxkOCxkOAorCXZtbGFsLnUzMglxMTEsZDI4LGQxWzBdCisJdnNobC5pNjQJZDI5LGQxOSwjMTYKKwl2bWxhbC51MzIJcTEyLGQyOCxkMVsxXQorCXZhZGQudTY0CWQyOSxkMjksZDE4CisJdm1sYWwudTMyCXExMyxkMjgsZDJbMF0KKwl2bXVsLnUzMglkMjksZDI5LGQzMAorCXZtbGFsLnUzMglxNixkMjgsZDJbMV0KKwl2c3QxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBiWzgqaSszXQorCXZtbGFsLnUzMglxNyxkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxOCxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjhbMF19LFtyMiw6MzJdIQlAICpiKysKKwl2bWxhbC51MzIJcTksZDI5LGQ0WzBdCisJdmVvcglkMTAsZDEwLGQxMAorCXZtbGFsLnUzMglxMTAsZDI5LGQ0WzFdCisJdnppcC4xNglkMjgsZDEwCisJdm1sYWwudTMyCXExMSxkMjksZDVbMF0KKwl2c2hyLnU2NAlkMTgsZDE4LCMxNgorCXZtbGFsLnUzMglxMTIsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXExMyxkMjksZDZbMF0KKwl2YWRkLnU2NAlkMTgsZDE4LGQxOQorCXZtbGFsLnUzMglxNixkMjksZDZbMV0KKwl2c2hyLnU2NAlkMTgsZDE4LCMxNgorCXZtbGFsLnUzMglxNyxkMjksZDdbMF0KKwl2bWxhbC51MzIJcTgsZDI5LGQ3WzFdCisJdmFkZC51NjQJZDIwLGQyMCxkMTgKKwl2c3QxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBtWzgqaSszXQorCXZtbGFsLnUzMglxMTAsZDI4LGQwWzBdCisJdmxkMS42NAl7cTl9LFtyNiw6MTI4XSEKKwl2bWxhbC51MzIJcTExLGQyOCxkMFsxXQorCXZlb3IJZDgsZDgsZDgKKwl2bWxhbC51MzIJcTEyLGQyOCxkMVswXQorCXZzaGwuaTY0CWQyOSxkMjEsIzE2CisJdm1sYWwudTMyCXExMyxkMjgsZDFbMV0KKwl2YWRkLnU2NAlkMjksZDI5LGQyMAorCXZtbGFsLnUzMglxNixkMjgsZDJbMF0KKwl2bXVsLnUzMglkMjksZDI5LGQzMAorCXZtbGFsLnUzMglxNyxkMjgsZDJbMV0KKwl2c3QxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBiWzgqaSs0XQorCXZtbGFsLnUzMglxOCxkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxOSxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjhbMF19LFtyMiw6MzJdIQlAICpiKysKKwl2bWxhbC51MzIJcTEwLGQyOSxkNFswXQorCXZlb3IJZDEwLGQxMCxkMTAKKwl2bWxhbC51MzIJcTExLGQyOSxkNFsxXQorCXZ6aXAuMTYJZDI4LGQxMAorCXZtbGFsLnUzMglxMTIsZDI5LGQ1WzBdCisJdnNoci51NjQJZDIwLGQyMCwjMTYKKwl2bWxhbC51MzIJcTEzLGQyOSxkNVsxXQorCXZtbGFsLnUzMglxNixkMjksZDZbMF0KKwl2YWRkLnU2NAlkMjAsZDIwLGQyMQorCXZtbGFsLnUzMglxNyxkMjksZDZbMV0KKwl2c2hyLnU2NAlkMjAsZDIwLCMxNgorCXZtbGFsLnUzMglxOCxkMjksZDdbMF0KKwl2bWxhbC51MzIJcTksZDI5LGQ3WzFdCisJdmFkZC51NjQJZDIyLGQyMixkMjAKKwl2c3QxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBtWzgqaSs0XQorCXZtbGFsLnUzMglxMTEsZDI4LGQwWzBdCisJdmxkMS42NAl7cTEwfSxbcjYsOjEyOF0hCisJdm1sYWwudTMyCXExMixkMjgsZDBbMV0KKwl2ZW9yCWQ4LGQ4LGQ4CisJdm1sYWwudTMyCXExMyxkMjgsZDFbMF0KKwl2c2hsLmk2NAlkMjksZDIzLCMxNgorCXZtbGFsLnUzMglxNixkMjgsZDFbMV0KKwl2YWRkLnU2NAlkMjksZDI5LGQyMgorCXZtbGFsLnUzMglxNyxkMjgsZDJbMF0KKwl2bXVsLnUzMglkMjksZDI5LGQzMAorCXZtbGFsLnUzMglxOCxkMjgsZDJbMV0KKwl2c3QxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBiWzgqaSs1XQorCXZtbGFsLnUzMglxOSxkMjgsZDNbMF0KKwl2emlwLjE2CWQyOSxkOAorCXZtbGFsLnUzMglxMTAsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4WzBdfSxbcjIsOjMyXSEJQCAqYisrCisJdm1sYWwudTMyCXExMSxkMjksZDRbMF0KKwl2ZW9yCWQxMCxkMTAsZDEwCisJdm1sYWwudTMyCXExMixkMjksZDRbMV0KKwl2emlwLjE2CWQyOCxkMTAKKwl2bWxhbC51MzIJcTEzLGQyOSxkNVswXQorCXZzaHIudTY0CWQyMixkMjIsIzE2CisJdm1sYWwudTMyCXE2LGQyOSxkNVsxXQorCXZtbGFsLnUzMglxNyxkMjksZDZbMF0KKwl2YWRkLnU2NAlkMjIsZDIyLGQyMworCXZtbGFsLnUzMglxOCxkMjksZDZbMV0KKwl2c2hyLnU2NAlkMjIsZDIyLCMxNgorCXZtbGFsLnUzMglxOSxkMjksZDdbMF0KKwl2bWxhbC51MzIJcTEwLGQyOSxkN1sxXQorCXZhZGQudTY0CWQyNCxkMjQsZDIyCisJdnN0MS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgbVs4KmkrNV0KKwl2bWxhbC51MzIJcTEyLGQyOCxkMFswXQorCXZsZDEuNjQJe3ExMX0sW3I2LDoxMjhdIQorCXZtbGFsLnUzMglxMTMsZDI4LGQwWzFdCisJdmVvcglkOCxkOCxkOAorCXZtbGFsLnUzMglxNixkMjgsZDFbMF0KKwl2c2hsLmk2NAlkMjksZDI1LCMxNgorCXZtbGFsLnUzMglxNyxkMjgsZDFbMV0KKwl2YWRkLnU2NAlkMjksZDI5LGQyNAorCXZtbGFsLnUzMglxOCxkMjgsZDJbMF0KKwl2bXVsLnUzMglkMjksZDI5LGQzMAorCXZtbGFsLnUzMglxOSxkMjgsZDJbMV0KKwl2c3QxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdXQgYXNpZGUgc21hc2hlZCBiWzgqaSs2XQorCXZtbGFsLnUzMglxMTAsZDI4LGQzWzBdCisJdnppcC4xNglkMjksZDgKKwl2bWxhbC51MzIJcTExLGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOFswXX0sW3IyLDozMl0hCUAgKmIrKworCXZtbGFsLnUzMglxMTIsZDI5LGQ0WzBdCisJdmVvcglkMTAsZDEwLGQxMAorCXZtbGFsLnUzMglxMTMsZDI5LGQ0WzFdCisJdnppcC4xNglkMjgsZDEwCisJdm1sYWwudTMyCXE2LGQyOSxkNVswXQorCXZzaHIudTY0CWQyNCxkMjQsIzE2CisJdm1sYWwudTMyCXE3LGQyOSxkNVsxXQorCXZtbGFsLnUzMglxOCxkMjksZDZbMF0KKwl2YWRkLnU2NAlkMjQsZDI0LGQyNQorCXZtbGFsLnUzMglxOSxkMjksZDZbMV0KKwl2c2hyLnU2NAlkMjQsZDI0LCMxNgorCXZtbGFsLnUzMglxMTAsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXExMSxkMjksZDdbMV0KKwl2YWRkLnU2NAlkMjYsZDI2LGQyNAorCXZzdDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1dCBhc2lkZSBzbWFzaGVkIG1bOCppKzZdCisJdm1sYWwudTMyCXExMyxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxMTJ9LFtyNiw6MTI4XSEKKwl2bWxhbC51MzIJcTYsZDI4LGQwWzFdCisJdmVvcglkOCxkOCxkOAorCXZtbGFsLnUzMglxNyxkMjgsZDFbMF0KKwl2c2hsLmk2NAlkMjksZDI3LCMxNgorCXZtbGFsLnUzMglxOCxkMjgsZDFbMV0KKwl2YWRkLnU2NAlkMjksZDI5LGQyNgorCXZtbGFsLnUzMglxOSxkMjgsZDJbMF0KKwl2bXVsLnUzMglkMjksZDI5LGQzMAorCXZtbGFsLnUzMglxMTAsZDI4LGQyWzFdCisJdnN0MS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHV0IGFzaWRlIHNtYXNoZWQgYls4KmkrN10KKwl2bWxhbC51MzIJcTExLGQyOCxkM1swXQorCXZ6aXAuMTYJZDI5LGQ4CisJdm1sYWwudTMyCXExMixkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjh9LFtzcCw6NjRdCQlAIHB1bGwgc21hc2hlZCBiWzgqaSswXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ0WzBdCisJdmxkMS4zMgl7ZDAsZDEsZDIsZDN9LFtyMV0hCisJdm1sYWwudTMyCXE2LGQyOSxkNFsxXQorCXZtbGFsLnUzMglxNyxkMjksZDVbMF0KKwl2c2hyLnU2NAlkMjYsZDI2LCMxNgorCXZtbGFsLnUzMglxOCxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTksZDI5LGQ2WzBdCisJdmFkZC51NjQJZDI2LGQyNixkMjcKKwl2bWxhbC51MzIJcTEwLGQyOSxkNlsxXQorCXZzaHIudTY0CWQyNixkMjYsIzE2CisJdm1sYWwudTMyCXExMSxkMjksZDdbMF0KKwl2bWxhbC51MzIJcTEyLGQyOSxkN1sxXQorCXZhZGQudTY0CWQxMixkMTIsZDI2CisJdnN0MS4zMgl7ZDI5fSxbcjEwLDo2NF0JQCBwdXQgYXNpZGUgc21hc2hlZCBtWzgqaSs3XQorCWFkZAlyMTAsc3AsIzgJCUAgcmV3aW5kCisJc3ViCXI4LHI1LCM4CisJYgkuTE5FT05fOG5faW5uZXIKKworLmFsaWduCTQKKy5MTkVPTl84bl9pbm5lcjoKKwlzdWJzCXI4LHI4LCM4CisJdm1sYWwudTMyCXE2LGQyOCxkMFswXQorCXZsZDEuNjQJe3ExM30sW3I2LDoxMjhdCisJdm1sYWwudTMyCXE3LGQyOCxkMFsxXQorCXZsZDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBtWzgqaSswXQorCXZtbGFsLnUzMglxOCxkMjgsZDFbMF0KKwl2bGQxLjMyCXtkNCxkNSxkNixkN30sW3IzXSEKKwl2bWxhbC51MzIJcTksZDI4LGQxWzFdCisJaXQJbmUKKwlhZGRuZQlyNixyNiwjMTYJQCBkb24ndCBhZHZhbmNlIGluIGxhc3QgaXRlcmF0aW9uCisJdm1sYWwudTMyCXExMCxkMjgsZDJbMF0KKwl2bWxhbC51MzIJcTExLGQyOCxkMlsxXQorCXZtbGFsLnUzMglxMTIsZDI4LGQzWzBdCisJdm1sYWwudTMyCXExMyxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgYls4KmkrMV0KKwl2bWxhbC51MzIJcTYsZDI5LGQ0WzBdCisJdm1sYWwudTMyCXE3LGQyOSxkNFsxXQorCXZtbGFsLnUzMglxOCxkMjksZDVbMF0KKwl2bWxhbC51MzIJcTksZDI5LGQ1WzFdCisJdm1sYWwudTMyCXExMCxkMjksZDZbMF0KKwl2bWxhbC51MzIJcTExLGQyOSxkNlsxXQorCXZtbGFsLnUzMglxMTIsZDI5LGQ3WzBdCisJdm1sYWwudTMyCXExMyxkMjksZDdbMV0KKwl2c3QxLjY0CXtxNn0sW3I3LDoxMjhdIQorCXZtbGFsLnUzMglxNyxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxNn0sW3I2LDoxMjhdCisJdm1sYWwudTMyCXE4LGQyOCxkMFsxXQorCXZsZDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBtWzgqaSsxXQorCXZtbGFsLnUzMglxOSxkMjgsZDFbMF0KKwlpdAluZQorCWFkZG5lCXI2LHI2LCMxNglAIGRvbid0IGFkdmFuY2UgaW4gbGFzdCBpdGVyYXRpb24KKwl2bWxhbC51MzIJcTEwLGQyOCxkMVsxXQorCXZtbGFsLnUzMglxMTEsZDI4LGQyWzBdCisJdm1sYWwudTMyCXExMixkMjgsZDJbMV0KKwl2bWxhbC51MzIJcTEzLGQyOCxkM1swXQorCXZtbGFsLnUzMglxNixkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgYls4KmkrMl0KKwl2bWxhbC51MzIJcTcsZDI5LGQ0WzBdCisJdm1sYWwudTMyCXE4LGQyOSxkNFsxXQorCXZtbGFsLnUzMglxOSxkMjksZDVbMF0KKwl2bWxhbC51MzIJcTEwLGQyOSxkNVsxXQorCXZtbGFsLnUzMglxMTEsZDI5LGQ2WzBdCisJdm1sYWwudTMyCXExMixkMjksZDZbMV0KKwl2bWxhbC51MzIJcTEzLGQyOSxkN1swXQorCXZtbGFsLnUzMglxNixkMjksZDdbMV0KKwl2c3QxLjY0CXtxN30sW3I3LDoxMjhdIQorCXZtbGFsLnUzMglxOCxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxN30sW3I2LDoxMjhdCisJdm1sYWwudTMyCXE5LGQyOCxkMFsxXQorCXZsZDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBtWzgqaSsyXQorCXZtbGFsLnUzMglxMTAsZDI4LGQxWzBdCisJaXQJbmUKKwlhZGRuZQlyNixyNiwjMTYJQCBkb24ndCBhZHZhbmNlIGluIGxhc3QgaXRlcmF0aW9uCisJdm1sYWwudTMyCXExMSxkMjgsZDFbMV0KKwl2bWxhbC51MzIJcTEyLGQyOCxkMlswXQorCXZtbGFsLnUzMglxMTMsZDI4LGQyWzFdCisJdm1sYWwudTMyCXE2LGQyOCxkM1swXQorCXZtbGFsLnUzMglxNyxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgYls4KmkrM10KKwl2bWxhbC51MzIJcTgsZDI5LGQ0WzBdCisJdm1sYWwudTMyCXE5LGQyOSxkNFsxXQorCXZtbGFsLnUzMglxMTAsZDI5LGQ1WzBdCisJdm1sYWwudTMyCXExMSxkMjksZDVbMV0KKwl2bWxhbC51MzIJcTEyLGQyOSxkNlswXQorCXZtbGFsLnUzMglxMTMsZDI5LGQ2WzFdCisJdm1sYWwudTMyCXE2LGQyOSxkN1swXQorCXZtbGFsLnUzMglxNyxkMjksZDdbMV0KKwl2c3QxLjY0CXtxOH0sW3I3LDoxMjhdIQorCXZtbGFsLnUzMglxOSxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxOH0sW3I2LDoxMjhdCisJdm1sYWwudTMyCXExMCxkMjgsZDBbMV0KKwl2bGQxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgbVs4KmkrM10KKwl2bWxhbC51MzIJcTExLGQyOCxkMVswXQorCWl0CW5lCisJYWRkbmUJcjYscjYsIzE2CUAgZG9uJ3QgYWR2YW5jZSBpbiBsYXN0IGl0ZXJhdGlvbgorCXZtbGFsLnUzMglxMTIsZDI4LGQxWzFdCisJdm1sYWwudTMyCXExMyxkMjgsZDJbMF0KKwl2bWxhbC51MzIJcTYsZDI4LGQyWzFdCisJdm1sYWwudTMyCXE3LGQyOCxkM1swXQorCXZtbGFsLnUzMglxOCxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgYls4KmkrNF0KKwl2bWxhbC51MzIJcTksZDI5LGQ0WzBdCisJdm1sYWwudTMyCXExMCxkMjksZDRbMV0KKwl2bWxhbC51MzIJcTExLGQyOSxkNVswXQorCXZtbGFsLnUzMglxMTIsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXExMyxkMjksZDZbMF0KKwl2bWxhbC51MzIJcTYsZDI5LGQ2WzFdCisJdm1sYWwudTMyCXE3LGQyOSxkN1swXQorCXZtbGFsLnUzMglxOCxkMjksZDdbMV0KKwl2c3QxLjY0CXtxOX0sW3I3LDoxMjhdIQorCXZtbGFsLnUzMglxMTAsZDI4LGQwWzBdCisJdmxkMS42NAl7cTl9LFtyNiw6MTI4XQorCXZtbGFsLnUzMglxMTEsZDI4LGQwWzFdCisJdmxkMS4zMgl7ZDI5fSxbcjEwLDo2NF0hCUAgcHVsbCBzbWFzaGVkIG1bOCppKzRdCisJdm1sYWwudTMyCXExMixkMjgsZDFbMF0KKwlpdAluZQorCWFkZG5lCXI2LHI2LCMxNglAIGRvbid0IGFkdmFuY2UgaW4gbGFzdCBpdGVyYXRpb24KKwl2bWxhbC51MzIJcTEzLGQyOCxkMVsxXQorCXZtbGFsLnUzMglxNixkMjgsZDJbMF0KKwl2bWxhbC51MzIJcTcsZDI4LGQyWzFdCisJdm1sYWwudTMyCXE4LGQyOCxkM1swXQorCXZtbGFsLnUzMglxOSxkMjgsZDNbMV0KKwl2bGQxLjMyCXtkMjh9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgYls4KmkrNV0KKwl2bWxhbC51MzIJcTEwLGQyOSxkNFswXQorCXZtbGFsLnUzMglxMTEsZDI5LGQ0WzFdCisJdm1sYWwudTMyCXExMixkMjksZDVbMF0KKwl2bWxhbC51MzIJcTEzLGQyOSxkNVsxXQorCXZtbGFsLnUzMglxNixkMjksZDZbMF0KKwl2bWxhbC51MzIJcTcsZDI5LGQ2WzFdCisJdm1sYWwudTMyCXE4LGQyOSxkN1swXQorCXZtbGFsLnUzMglxOSxkMjksZDdbMV0KKwl2c3QxLjY0CXtxMTB9LFtyNyw6MTI4XSEKKwl2bWxhbC51MzIJcTExLGQyOCxkMFswXQorCXZsZDEuNjQJe3ExMH0sW3I2LDoxMjhdCisJdm1sYWwudTMyCXExMixkMjgsZDBbMV0KKwl2bGQxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgbVs4KmkrNV0KKwl2bWxhbC51MzIJcTEzLGQyOCxkMVswXQorCWl0CW5lCisJYWRkbmUJcjYscjYsIzE2CUAgZG9uJ3QgYWR2YW5jZSBpbiBsYXN0IGl0ZXJhdGlvbgorCXZtbGFsLnUzMglxNixkMjgsZDFbMV0KKwl2bWxhbC51MzIJcTcsZDI4LGQyWzBdCisJdm1sYWwudTMyCXE4LGQyOCxkMlsxXQorCXZtbGFsLnUzMglxOSxkMjgsZDNbMF0KKwl2bWxhbC51MzIJcTEwLGQyOCxkM1sxXQorCXZsZDEuMzIJe2QyOH0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBiWzgqaSs2XQorCXZtbGFsLnUzMglxMTEsZDI5LGQ0WzBdCisJdm1sYWwudTMyCXExMixkMjksZDRbMV0KKwl2bWxhbC51MzIJcTEzLGQyOSxkNVswXQorCXZtbGFsLnUzMglxNixkMjksZDVbMV0KKwl2bWxhbC51MzIJcTcsZDI5LGQ2WzBdCisJdm1sYWwudTMyCXE4LGQyOSxkNlsxXQorCXZtbGFsLnUzMglxOSxkMjksZDdbMF0KKwl2bWxhbC51MzIJcTEwLGQyOSxkN1sxXQorCXZzdDEuNjQJe3ExMX0sW3I3LDoxMjhdIQorCXZtbGFsLnUzMglxMTIsZDI4LGQwWzBdCisJdmxkMS42NAl7cTExfSxbcjYsOjEyOF0KKwl2bWxhbC51MzIJcTEzLGQyOCxkMFsxXQorCXZsZDEuMzIJe2QyOX0sW3IxMCw6NjRdIQlAIHB1bGwgc21hc2hlZCBtWzgqaSs2XQorCXZtbGFsLnUzMglxNixkMjgsZDFbMF0KKwlpdAluZQorCWFkZG5lCXI2LHI2LCMxNglAIGRvbid0IGFkdmFuY2UgaW4gbGFzdCBpdGVyYXRpb24KKwl2bWxhbC51MzIJcTcsZDI4LGQxWzFdCisJdm1sYWwudTMyCXE4LGQyOCxkMlswXQorCXZtbGFsLnUzMglxOSxkMjgsZDJbMV0KKwl2bWxhbC51MzIJcTEwLGQyOCxkM1swXQorCXZtbGFsLnUzMglxMTEsZDI4LGQzWzFdCisJdmxkMS4zMgl7ZDI4fSxbcjEwLDo2NF0hCUAgcHVsbCBzbWFzaGVkIGJbOCppKzddCisJdm1sYWwudTMyCXExMixkMjksZDRbMF0KKwl2bWxhbC51MzIJcTEzLGQyOSxkNFsxXQorCXZtbGFsLnUzMglxNixkMjksZDVbMF0KKwl2bWxhbC51MzIJcTcsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXE4LGQyOSxkNlswXQorCXZtbGFsLnUzMglxOSxkMjksZDZbMV0KKwl2bWxhbC51MzIJcTEwLGQyOSxkN1swXQorCXZtbGFsLnUzMglxMTEsZDI5LGQ3WzFdCisJdnN0MS42NAl7cTEyfSxbcjcsOjEyOF0hCisJdm1sYWwudTMyCXExMyxkMjgsZDBbMF0KKwl2bGQxLjY0CXtxMTJ9LFtyNiw6MTI4XQorCXZtbGFsLnUzMglxNixkMjgsZDBbMV0KKwl2bGQxLjMyCXtkMjl9LFtyMTAsOjY0XSEJQCBwdWxsIHNtYXNoZWQgbVs4KmkrN10KKwl2bWxhbC51MzIJcTcsZDI4LGQxWzBdCisJaXQJbmUKKwlhZGRuZQlyNixyNiwjMTYJQCBkb24ndCBhZHZhbmNlIGluIGxhc3QgaXRlcmF0aW9uCisJdm1sYWwudTMyCXE4LGQyOCxkMVsxXQorCXZtbGFsLnUzMglxOSxkMjgsZDJbMF0KKwl2bWxhbC51MzIJcTEwLGQyOCxkMlsxXQorCXZtbGFsLnUzMglxMTEsZDI4LGQzWzBdCisJdm1sYWwudTMyCXExMixkMjgsZDNbMV0KKwlpdAllcQorCXN1YmVxCXIxLHIxLHI1LGxzbCMyCUAgcmV3aW5kCisJdm1sYWwudTMyCXExMyxkMjksZDRbMF0KKwl2bGQxLjMyCXtkMjh9LFtzcCw6NjRdCQlAIHB1bGwgc21hc2hlZCBiWzgqaSswXQorCXZtbGFsLnUzMglxNixkMjksZDRbMV0KKwl2bGQxLjMyCXtkMCxkMSxkMixkM30sW3IxXSEKKwl2bWxhbC51MzIJcTcsZDI5LGQ1WzBdCisJYWRkCXIxMCxzcCwjOAkJQCByZXdpbmQKKwl2bWxhbC51MzIJcTgsZDI5LGQ1WzFdCisJdm1sYWwudTMyCXE5LGQyOSxkNlswXQorCXZtbGFsLnUzMglxMTAsZDI5LGQ2WzFdCisJdm1sYWwudTMyCXExMSxkMjksZDdbMF0KKwl2c3QxLjY0CXtxMTN9LFtyNyw6MTI4XSEKKwl2bWxhbC51MzIJcTEyLGQyOSxkN1sxXQorCisJYm5lCS5MTkVPTl84bl9pbm5lcgorCWFkZAlyNixzcCwjMTI4CisJdnN0MS42NAl7cTYscTd9LFtyNyw6MjU2XSEKKwl2ZW9yCXEyLHEyLHEyCQlAIGQ0LWQ1CisJdnN0MS42NAl7cTgscTl9LFtyNyw6MjU2XSEKKwl2ZW9yCXEzLHEzLHEzCQlAIGQ2LWQ3CisJdnN0MS42NAl7cTEwLHExMX0sW3I3LDoyNTZdIQorCXZzdDEuNjQJe3ExMn0sW3I3LDoxMjhdCisKKwlzdWJzCXI5LHI5LCM4CisJdmxkMS42NAl7cTYscTd9LFtyNiw6MjU2XSEKKwl2bGQxLjY0CXtxOCxxOX0sW3I2LDoyNTZdIQorCXZsZDEuNjQJe3ExMCxxMTF9LFtyNiw6MjU2XSEKKwl2bGQxLjY0CXtxMTIscTEzfSxbcjYsOjI1Nl0hCisKKwlpdHQJbmUKKwlzdWJuZQlyMyxyMyxyNSxsc2wjMglAIHJld2luZAorCWJuZQkuTE5FT05fOG5fb3V0ZXIKKworCWFkZAlyNyxzcCwjMTI4CisJdnN0MS42NAl7cTIscTN9LCBbc3AsOjI1Nl0hCUAgc3RhcnQgd2lwaW5nIHN0YWNrIGZyYW1lCisJdnNoci51NjQJZDEwLGQxMiwjMTYKKwl2c3QxLjY0CXtxMixxM30sW3NwLDoyNTZdIQorCXZhZGQudTY0CWQxMyxkMTMsZDEwCisJdnN0MS42NAl7cTIscTN9LCBbc3AsOjI1Nl0hCisJdnNoci51NjQJZDEwLGQxMywjMTYKKwl2c3QxLjY0CXtxMixxM30sIFtzcCw6MjU2XSEKKwl2emlwLjE2CWQxMixkMTMKKworCW1vdglyOCxyNQorCWIJLkxORU9OX3RhaWxfZW50cnkKKworLmFsaWduCTQKKy5MTkVPTl90YWlsOgorCXZhZGQudTY0CWQxMixkMTIsZDEwCisJdnNoci51NjQJZDEwLGQxMiwjMTYKKwl2bGQxLjY0CXtxOCxxOX0sIFtyNiwgOjI1Nl0hCisJdmFkZC51NjQJZDEzLGQxMyxkMTAKKwl2bGQxLjY0CXtxMTAscTExfSwgW3I2LCA6MjU2XSEKKwl2c2hyLnU2NAlkMTAsZDEzLCMxNgorCXZsZDEuNjQJe3ExMixxMTN9LCBbcjYsIDoyNTZdIQorCXZ6aXAuMTYJZDEyLGQxMworCisuTE5FT05fdGFpbF9lbnRyeToKKwl2YWRkLnU2NAlkMTQsZDE0LGQxMAorCXZzdDEuMzIJe2QxMlswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDE0LCMxNgorCXZhZGQudTY0CWQxNSxkMTUsZDEwCisJdnNoci51NjQJZDEwLGQxNSwjMTYKKwl2emlwLjE2CWQxNCxkMTUKKwl2YWRkLnU2NAlkMTYsZDE2LGQxMAorCXZzdDEuMzIJe2QxNFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDE2LCMxNgorCXZhZGQudTY0CWQxNyxkMTcsZDEwCisJdnNoci51NjQJZDEwLGQxNywjMTYKKwl2emlwLjE2CWQxNixkMTcKKwl2YWRkLnU2NAlkMTgsZDE4LGQxMAorCXZzdDEuMzIJe2QxNlswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDE4LCMxNgorCXZhZGQudTY0CWQxOSxkMTksZDEwCisJdnNoci51NjQJZDEwLGQxOSwjMTYKKwl2emlwLjE2CWQxOCxkMTkKKwl2YWRkLnU2NAlkMjAsZDIwLGQxMAorCXZzdDEuMzIJe2QxOFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDIwLCMxNgorCXZhZGQudTY0CWQyMSxkMjEsZDEwCisJdnNoci51NjQJZDEwLGQyMSwjMTYKKwl2emlwLjE2CWQyMCxkMjEKKwl2YWRkLnU2NAlkMjIsZDIyLGQxMAorCXZzdDEuMzIJe2QyMFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDIyLCMxNgorCXZhZGQudTY0CWQyMyxkMjMsZDEwCisJdnNoci51NjQJZDEwLGQyMywjMTYKKwl2emlwLjE2CWQyMixkMjMKKwl2YWRkLnU2NAlkMjQsZDI0LGQxMAorCXZzdDEuMzIJe2QyMlswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDI0LCMxNgorCXZhZGQudTY0CWQyNSxkMjUsZDEwCisJdnNoci51NjQJZDEwLGQyNSwjMTYKKwl2emlwLjE2CWQyNCxkMjUKKwl2YWRkLnU2NAlkMjYsZDI2LGQxMAorCXZzdDEuMzIJe2QyNFswXX0sIFtyNywgOjMyXSEKKwl2c2hyLnU2NAlkMTAsZDI2LCMxNgorCXZhZGQudTY0CWQyNyxkMjcsZDEwCisJdnNoci51NjQJZDEwLGQyNywjMTYKKwl2emlwLjE2CWQyNixkMjcKKwl2bGQxLjY0CXtxNixxN30sIFtyNiwgOjI1Nl0hCisJc3VicwlyOCxyOCwjOAorCXZzdDEuMzIJe2QyNlswXX0sICAgW3I3LCA6MzJdIQorCWJuZQkuTE5FT05fdGFpbAorCisJdnN0MS4zMgl7ZDEwWzBdfSwgW3I3LCA6MzJdCQlAIHRvcC1tb3N0IGJpdAorCXN1YglyMyxyMyxyNSxsc2wjMgkJCUAgcmV3aW5kIHIzCisJc3VicwlyMSxzcCwjMAkJCQlAIGNsZWFyIGNhcnJ5IGZsYWcKKwlhZGQJcjIsc3AscjUsbHNsIzIKKworLkxORU9OX3N1YjoKKwlsZG1pYQlyMSEsIHtyNCxyNSxyNixyN30KKwlsZG1pYQlyMyEsIHtyOCxyOSxyMTAscjExfQorCXNiY3MJcjgsIHI0LHI4CisJc2JjcwlyOSwgcjUscjkKKwlzYmNzCXIxMCxyNixyMTAKKwlzYmNzCXIxMSxyNyxyMTEKKwl0ZXEJcjEscjIJCQkJQCBwcmVzZXJ2ZXMgY2FycnkKKwlzdG1pYQlyMCEsIHtyOCxyOSxyMTAscjExfQorCWJuZQkuTE5FT05fc3ViCisKKwlsZHIJcjEwLCBbcjFdCQkJCUAgbG9hZCB0b3AtbW9zdCBiaXQKKwltb3YJcjExLHNwCisJdmVvcglxMCxxMCxxMAorCXN1YglyMTEscjIscjExCQkJCUAgdGhpcyBpcyBudW0qNAorCXZlb3IJcTEscTEscTEKKwltb3YJcjEsc3AKKwlzdWIJcjAscjAscjExCQkJCUAgcmV3aW5kIHIwCisJbW92CXIzLHIyCQkJCUAgc2Vjb25kIDMvNHRoIG9mIGZyYW1lCisJc2JjcwlyMTAscjEwLCMwCQkJCUAgcmVzdWx0IGlzIGNhcnJ5IGZsYWcKKworLkxORU9OX2NvcHlfbl96YXA6CisJbGRtaWEJcjEhLCB7cjQscjUscjYscjd9CisJbGRtaWEJcjAsICB7cjgscjkscjEwLHIxMX0KKwlpdAljYworCW1vdmNjCXI4LCByNAorCXZzdDEuNjQJe3EwLHExfSwgW3IzLDoyNTZdIQkJCUAgd2lwZQorCWl0dAljYworCW1vdmNjCXI5LCByNQorCW1vdmNjCXIxMCxyNgorCXZzdDEuNjQJe3EwLHExfSwgW3IzLDoyNTZdIQkJCUAgd2lwZQorCWl0CWNjCisJbW92Y2MJcjExLHI3CisJbGRtaWEJcjEsIHtyNCxyNSxyNixyN30KKwlzdG1pYQlyMCEsIHtyOCxyOSxyMTAscjExfQorCXN1YglyMSxyMSwjMTYKKwlsZG1pYQlyMCwge3I4LHI5LHIxMCxyMTF9CisJaXQJY2MKKwltb3ZjYwlyOCwgcjQKKwl2c3QxLjY0CXtxMCxxMX0sIFtyMSw6MjU2XSEJCQlAIHdpcGUKKwlpdHQJY2MKKwltb3ZjYwlyOSwgcjUKKwltb3ZjYwlyMTAscjYKKwl2c3QxLjY0CXtxMCxxMX0sIFtyMyw6MjU2XSEJCQlAIHdpcGUKKwlpdAljYworCW1vdmNjCXIxMSxyNworCXRlcQlyMSxyMgkJCQlAIHByZXNlcnZlcyBjYXJyeQorCXN0bWlhCXIwISwge3I4LHI5LHIxMCxyMTF9CisJYm5lCS5MTkVPTl9jb3B5X25femFwCisKKwltb3YJc3AsaXAKKwl2bGRtaWEJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0KKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTF9CisJYngJbHIJCQkJCQlAIGJ4IGxyCisuc2l6ZQlibl9tdWw4eF9tb250X25lb24sLi1ibl9tdWw4eF9tb250X25lb24KKyNlbmRpZgorLmJ5dGUJNzcsMTExLDExMCwxMTYsMTAzLDExMSwxMDksMTAxLDExNCwxMjEsMzIsMTA5LDExNywxMDgsMTE2LDEwNSwxMTIsMTA4LDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDUyLDQ3LDc4LDY5LDc5LDc4LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKy5jb21tCU9QRU5TU0xfYXJtY2FwX1AsNCw0CisuaGlkZGVuCU9QRU5TU0xfYXJtY2FwX1AKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9ic2Flcy1hcm12Ny5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvYnNhZXMtYXJtdjcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIxZTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvYnNhZXMtYXJtdjcuUwpAQCAtMCwwICsxLDI1NjMgQEAKKyNpZiBkZWZpbmVkKF9fYXJtX18pCitAIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgT3BlblNTTCBsaWNlbnNlICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZQorQCB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorQCBpbiB0aGUgZmlsZSBMSUNFTlNFIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9yIGF0CitAIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKworCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorQCBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCitAIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCitAIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorQAorQCBTcGVjaWZpYyBtb2RlcyBhbmQgYWRhcHRhdGlvbiBmb3IgTGludXgga2VybmVsIGJ5IEFyZCBCaWVzaGV1dmVsCitAIG9mIExpbmFyby4gUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMIHRlcm1zIGlzIGdyYW50ZWQuCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0AgQml0LXNsaWNlZCBBRVMgZm9yIEFSTSBORU9OCitACitAIEZlYnJ1YXJ5IDIwMTIuCitACitAIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZGlyZWN0IGFkYXB0YXRpb24gb2YgYnNhZXMteDg2XzY0IG1vZHVsZSBmb3IKK0AgQVJNIE5FT04uIEV4Y2VwdCB0aGF0IHRoaXMgbW9kdWxlIGlzIGVuZGlhbi1uZXV0cmFsIFtpbiBzZW5zZSB0aGF0CitAIGl0IGNhbiBiZSBjb21waWxlZCBmb3IgZWl0aGVyIGVuZGlhbm5lc3NdIGJ5IGNvdXJ0ZXN5IG9mIHZsZDEuOCdzCitAIG5ldXRyYWxpdHkuIEluaXRpYWwgdmVyc2lvbiBkb2Vzbid0IGltcGxlbWVudCBpbnRlcmZhY2UgdG8gT3BlblNTTCwKK0Agb25seSBsb3ctbGV2ZWwgcHJpbWl0aXZlcyBhbmQgdW5zdXBwb3J0ZWQgZW50cnkgcG9pbnRzLCBqdXN0IGVub3VnaAorQCB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIHJlc3VsdHMsIHdoaWNoIGZvciBDb3J0ZXgtQTggY29yZSBhcmU6CitACitAIGVuY3J5cHQJMTkuNSBjeWNsZXMgcGVyIGJ5dGUgcHJvY2Vzc2VkIHdpdGggMTI4LWJpdCBrZXkKK0AgZGVjcnlwdAkyMi4xIGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleQorQCBrZXkgY29udi4JNDQwICBjeWNsZXMgcGVyIDEyOC1iaXQga2V5LzAuMTggb2YgOHggYmxvY2sKK0AKK0AgU25hcGRyYWdvbiBTNCBlbmNyeXB0cyBieXRlIGluIDE3LjYgY3ljbGVzIGFuZCBkZWNyeXB0cyBpbiAxOS43LAorQCB3aGljaCBpcyBbbXVjaF0gd29yc2UgdGhhbiBhbnRpY2lwYXRlZCAoZm9yIGZ1cnRoZXIgZGV0YWlscyBzZWUKK0AgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vU25hcGRyYWdvbi1TNC5odG1sKS4KK0AKK0AgQ29ydGV4LUExNSBtYW5hZ2VzIGluIDE0LjIvMTYuMSBjeWNsZXMgW3doZW4gaW50ZWdlci1vbmx5IGNvZGUKK0AgbWFuYWdlcyBpbiAyMC4wIGN5Y2xlc10uCitACitAIFdoZW4gY29tcGFyaW5nIHRvIHg4Nl82NCByZXN1bHRzIGtlZXAgaW4gbWluZCB0aGF0IE5FT04gdW5pdCBpcworQCBbbW9zdGx5XSBzaW5nbGUtaXNzdWUgYW5kIHRodXMgY2FuJ3QgW2Z1bGx5XSBiZW5lZml0IGZyb20KK0AgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uIEFuZCB3aGVuIGNvbXBhcmluZyB0byBhZXMtYXJtdjQKK0AgcmVzdWx0cyBrZWVwIGluIG1pbmQga2V5IHNjaGVkdWxlIGNvbnZlcnNpb24gb3ZlcmhlYWQgKHNlZQorQCBic2Flcy14ODZfNjQucGwgZm9yIGZ1cnRoZXIgZGV0YWlscykuLi4KK0AKK0AJCQkJCQk8YXBwcm9Ab3BlbnNzbC5vcmc+CisKK0AgQXByaWwtQXVndXN0IDIwMTMKK0AgQWRkIENCQywgQ1RSIGFuZCBYVFMgc3Vicm91dGluZXMgYW5kIGFkYXB0IGZvciBrZXJuZWwgdXNlOyBjb3VydGVzeSBvZiBBcmQuCisKKyNpZm5kZWYgX19LRVJORUxfXworIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisKKyMgZGVmaW5lIFZGUF9BQklfUFVTSAl2c3RtZGIJc3AhLHtkOC1kMTV9CisjIGRlZmluZSBWRlBfQUJJX1BPUAl2bGRtaWEJc3AhLHtkOC1kMTV9CisjIGRlZmluZSBWRlBfQUJJX0ZSQU1FCTB4NDAKKyNlbHNlCisjIGRlZmluZSBWRlBfQUJJX1BVU0gKKyMgZGVmaW5lIFZGUF9BQklfUE9QCisjIGRlZmluZSBWRlBfQUJJX0ZSQU1FCTAKKyMgZGVmaW5lIEJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKyMgZGVmaW5lIFhUU19DSEFJTl9UV0VBSworIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXworIyBkZWZpbmUgX19BUk1fTUFYX0FSQ0hfXyA3CisjZW5kaWYKKworI2lmZGVmIF9fdGh1bWJfXworIyBkZWZpbmUgYWRybCBhZHIKKyNlbmRpZgorCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLmFyY2gJYXJtdjctYQorLmZwdQluZW9uCisKKy50ZXh0Cisuc3ludGF4CXVuaWZpZWQgCUAgQVJNdjctY2FwYWJsZSBhc3NlbWJsZXIgaXMgZXhwZWN0ZWQgdG8gaGFuZGxlIHRoaXMKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pICYmICFkZWZpbmVkKF9fQVBQTEVfXykKKy50aHVtYgorI2Vsc2UKKy5jb2RlCTMyCisjIHVuZGVmIF9fdGh1bWIyX18KKyNlbmRpZgorCisudHlwZQlfYnNhZXNfZGVjcnlwdDgsJWZ1bmN0aW9uCisuYWxpZ24JNAorX2JzYWVzX2RlY3J5cHQ4OgorCWFkcglyNiwuCisJdmxkbWlhCXI0ISwge3E5fQkJQCByb3VuZCAwIGtleQorI2lmIGRlZmluZWQoX190aHVtYjJfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisJYWRyCXI2LC5MTTBJU1IKKyNlbHNlCisJYWRkCXI2LHI2LCMuTE0wSVNSLV9ic2Flc19kZWNyeXB0OAorI2VuZGlmCisKKwl2bGRtaWEJcjYhLCB7cTh9CQlAIC5MTTBJU1IKKwl2ZW9yCXExMCwgcTAsIHE5CUAgeG9yIHdpdGggcm91bmQwIGtleQorCXZlb3IJcTExLCBxMSwgcTkKKwl2dGJsLjgJZDAsIHtxMTB9LCBkMTYKKwl2dGJsLjgJZDEsIHtxMTB9LCBkMTcKKwl2ZW9yCXExMiwgcTIsIHE5CisJdnRibC44CWQyLCB7cTExfSwgZDE2CisJdnRibC44CWQzLCB7cTExfSwgZDE3CisJdmVvcglxMTMsIHEzLCBxOQorCXZ0YmwuOAlkNCwge3ExMn0sIGQxNgorCXZ0YmwuOAlkNSwge3ExMn0sIGQxNworCXZlb3IJcTE0LCBxNCwgcTkKKwl2dGJsLjgJZDYsIHtxMTN9LCBkMTYKKwl2dGJsLjgJZDcsIHtxMTN9LCBkMTcKKwl2ZW9yCXExNSwgcTUsIHE5CisJdnRibC44CWQ4LCB7cTE0fSwgZDE2CisJdnRibC44CWQ5LCB7cTE0fSwgZDE3CisJdmVvcglxMTAsIHE2LCBxOQorCXZ0YmwuOAlkMTAsIHtxMTV9LCBkMTYKKwl2dGJsLjgJZDExLCB7cTE1fSwgZDE3CisJdmVvcglxMTEsIHE3LCBxOQorCXZ0YmwuOAlkMTIsIHtxMTB9LCBkMTYKKwl2dGJsLjgJZDEzLCB7cTEwfSwgZDE3CisJdnRibC44CWQxNCwge3ExMX0sIGQxNgorCXZ0YmwuOAlkMTUsIHtxMTF9LCBkMTcKKwl2bW92Lmk4CXE4LCMweDU1CQkJQCBjb21wb3NlIC5MQlMwCisJdm1vdi5pOAlxOSwjMHgzMwkJCUAgY29tcG9zZSAuTEJTMQorCXZzaHIudTY0CXExMCwgcTYsICMxCisJdnNoci51NjQJcTExLCBxNCwgIzEKKwl2ZW9yCXExMCwgcTEwLCBxNworCXZlb3IJcTExLCBxMTEsIHE1CisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTcsIHE3LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzEKKwl2ZW9yCXE1LCBxNSwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMxCisJdmVvcglxNiwgcTYsIHExMAorCXZlb3IJcTQsIHE0LCBxMTEKKwl2c2hyLnU2NAlxMTAsIHEyLCAjMQorCXZzaHIudTY0CXExMSwgcTAsICMxCisJdmVvcglxMTAsIHExMCwgcTMKKwl2ZW9yCXExMSwgcTExLCBxMQorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXEzLCBxMywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMxCisJdmVvcglxMSwgcTEsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMQorCXZlb3IJcTIsIHEyLCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJdm1vdi5pOAlxOCwjMHgwZgkJCUAgY29tcG9zZSAuTEJTMgorCXZzaHIudTY0CXExMCwgcTUsICMyCisJdnNoci51NjQJcTExLCBxNCwgIzIKKwl2ZW9yCXExMCwgcTEwLCBxNworCXZlb3IJcTExLCBxMTEsIHE2CisJdmFuZAlxMTAsIHExMCwgcTkKKwl2YW5kCXExMSwgcTExLCBxOQorCXZlb3IJcTcsIHE3LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzIKKwl2ZW9yCXE2LCBxNiwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMyCisJdmVvcglxNSwgcTUsIHExMAorCXZlb3IJcTQsIHE0LCBxMTEKKwl2c2hyLnU2NAlxMTAsIHExLCAjMgorCXZzaHIudTY0CXExMSwgcTAsICMyCisJdmVvcglxMTAsIHExMCwgcTMKKwl2ZW9yCXExMSwgcTExLCBxMgorCXZhbmQJcTEwLCBxMTAsIHE5CisJdmFuZAlxMTEsIHExMSwgcTkKKwl2ZW9yCXEzLCBxMywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMyCisJdmVvcglxMiwgcTIsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMgorCXZlb3IJcTEsIHExLCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJdnNoci51NjQJcTEwLCBxMywgIzQKKwl2c2hyLnU2NAlxMTEsIHEyLCAjNAorCXZlb3IJcTEwLCBxMTAsIHE3CisJdmVvcglxMTEsIHExMSwgcTYKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNywgcTcsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjNAorCXZlb3IJcTYsIHE2LCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzQKKwl2ZW9yCXEzLCBxMywgcTEwCisJdmVvcglxMiwgcTIsIHExMQorCXZzaHIudTY0CXExMCwgcTEsICM0CisJdnNoci51NjQJcTExLCBxMCwgIzQKKwl2ZW9yCXExMCwgcTEwLCBxNQorCXZlb3IJcTExLCBxMTEsIHE0CisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTUsIHE1LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzQKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICM0CisJdmVvcglxMSwgcTEsIHExMAorCXZlb3IJcTAsIHEwLCBxMTEKKwlzdWIJcjUscjUsIzEKKwliCS5MZGVjX3Nib3gKKy5hbGlnbgk0CisuTGRlY19sb29wOgorCXZsZG1pYQlyNCEsIHtxOCxxOSxxMTAscTExfQorCXZlb3IJcTgsIHE4LCBxMAorCXZlb3IJcTksIHE5LCBxMQorCXZ0YmwuOAlkMCwge3E4fSwgZDI0CisJdnRibC44CWQxLCB7cTh9LCBkMjUKKwl2bGRtaWEJcjQhLCB7cTh9CisJdmVvcglxMTAsIHExMCwgcTIKKwl2dGJsLjgJZDIsIHtxOX0sIGQyNAorCXZ0YmwuOAlkMywge3E5fSwgZDI1CisJdmxkbWlhCXI0ISwge3E5fQorCXZlb3IJcTExLCBxMTEsIHEzCisJdnRibC44CWQ0LCB7cTEwfSwgZDI0CisJdnRibC44CWQ1LCB7cTEwfSwgZDI1CisJdmxkbWlhCXI0ISwge3ExMH0KKwl2dGJsLjgJZDYsIHtxMTF9LCBkMjQKKwl2dGJsLjgJZDcsIHtxMTF9LCBkMjUKKwl2bGRtaWEJcjQhLCB7cTExfQorCXZlb3IJcTgsIHE4LCBxNAorCXZlb3IJcTksIHE5LCBxNQorCXZ0YmwuOAlkOCwge3E4fSwgZDI0CisJdnRibC44CWQ5LCB7cTh9LCBkMjUKKwl2ZW9yCXExMCwgcTEwLCBxNgorCXZ0YmwuOAlkMTAsIHtxOX0sIGQyNAorCXZ0YmwuOAlkMTEsIHtxOX0sIGQyNQorCXZlb3IJcTExLCBxMTEsIHE3CisJdnRibC44CWQxMiwge3ExMH0sIGQyNAorCXZ0YmwuOAlkMTMsIHtxMTB9LCBkMjUKKwl2dGJsLjgJZDE0LCB7cTExfSwgZDI0CisJdnRibC44CWQxNSwge3ExMX0sIGQyNQorLkxkZWNfc2JveDoKKwl2ZW9yCXExLCBxMSwgcTQKKwl2ZW9yCXEzLCBxMywgcTQKKworCXZlb3IJcTQsIHE0LCBxNworCXZlb3IJcTEsIHExLCBxNgorCXZlb3IJcTIsIHEyLCBxNworCXZlb3IJcTYsIHE2LCBxNAorCisJdmVvcglxMCwgcTAsIHExCisJdmVvcglxMiwgcTIsIHE1CisJdmVvcglxNywgcTcsIHE2CisJdmVvcglxMywgcTMsIHEwCisJdmVvcglxNSwgcTUsIHEwCisJdmVvcglxMSwgcTEsIHEzCisJdmVvcglxMTEsIHEzLCBxMAorCXZlb3IJcTEwLCBxNywgcTQKKwl2ZW9yCXE5LCBxMSwgcTYKKwl2ZW9yCXExMywgcTQsIHEwCisJdm1vdglxOCwgcTEwCisJdmVvcglxMTIsIHE1LCBxMgorCisJdm9ycglxMTAsIHExMCwgcTkKKwl2ZW9yCXExNSwgcTExLCBxOAorCXZhbmQJcTE0LCBxMTEsIHExMgorCXZvcnIJcTExLCBxMTEsIHExMgorCXZlb3IJcTEyLCBxMTIsIHE5CisJdmFuZAlxOCwgcTgsIHE5CisJdmVvcglxOSwgcTYsIHEyCisJdmFuZAlxMTUsIHExNSwgcTEyCisJdmFuZAlxMTMsIHExMywgcTkKKwl2ZW9yCXE5LCBxMywgcTcKKwl2ZW9yCXExMiwgcTEsIHE1CisJdmVvcglxMTEsIHExMSwgcTEzCisJdmVvcglxMTAsIHExMCwgcTEzCisJdmFuZAlxMTMsIHE5LCBxMTIKKwl2b3JyCXE5LCBxOSwgcTEyCisJdmVvcglxMTEsIHExMSwgcTE1CisJdmVvcglxOCwgcTgsIHExMworCXZlb3IJcTEwLCBxMTAsIHExNAorCXZlb3IJcTksIHE5LCBxMTUKKwl2ZW9yCXE4LCBxOCwgcTE0CisJdmFuZAlxMTIsIHE0LCBxNgorCXZlb3IJcTksIHE5LCBxMTQKKwl2YW5kCXExMywgcTAsIHEyCisJdmFuZAlxMTQsIHE3LCBxMQorCXZvcnIJcTE1LCBxMywgcTUKKwl2ZW9yCXExMSwgcTExLCBxMTIKKwl2ZW9yCXE5LCBxOSwgcTE0CisJdmVvcglxOCwgcTgsIHExNQorCXZlb3IJcTEwLCBxMTAsIHExMworCisJQCBJbnZfR0YxNiAJMCwgCTEsIAkyLCAJMywgczAsIHMxLCBzMiwgczMKKworCUAgbmV3IHNtYWxsZXIgaW52ZXJzaW9uCisKKwl2YW5kCXExNCwgcTExLCBxOQorCXZtb3YJcTEyLCBxOAorCisJdmVvcglxMTMsIHExMCwgcTE0CisJdmVvcglxMTUsIHE4LCBxMTQKKwl2ZW9yCXExNCwgcTgsIHExNAlAIHExND1xMTUKKworCXZic2wJcTEzLCBxOSwgcTgKKwl2YnNsCXExNSwgcTExLCBxMTAKKwl2ZW9yCXExMSwgcTExLCBxMTAKKworCXZic2wJcTEyLCBxMTMsIHExNAorCXZic2wJcTgsIHExNCwgcTEzCisKKwl2YW5kCXExNCwgcTEyLCBxMTUKKwl2ZW9yCXE5LCBxOSwgcTgKKworCXZlb3IJcTE0LCBxMTQsIHExMQorCXZlb3IJcTEyLCBxNSwgcTIKKwl2ZW9yCXE4LCBxMSwgcTYKKwl2ZW9yCXExMCwgcTE1LCBxMTQKKwl2YW5kCXExMCwgcTEwLCBxNQorCXZlb3IJcTUsIHE1LCBxMQorCXZhbmQJcTExLCBxMSwgcTE1CisJdmFuZAlxNSwgcTUsIHExNAorCXZlb3IJcTEsIHExMSwgcTEwCisJdmVvcglxNSwgcTUsIHExMQorCXZlb3IJcTE1LCBxMTUsIHExMworCXZlb3IJcTE0LCBxMTQsIHE5CisJdmVvcglxMTEsIHExNSwgcTE0CisJdmVvcglxMTAsIHExMywgcTkKKwl2YW5kCXExMSwgcTExLCBxMTIKKwl2YW5kCXExMCwgcTEwLCBxMgorCXZlb3IJcTEyLCBxMTIsIHE4CisJdmVvcglxMiwgcTIsIHE2CisJdmFuZAlxOCwgcTgsIHExNQorCXZhbmQJcTYsIHE2LCBxMTMKKwl2YW5kCXExMiwgcTEyLCBxMTQKKwl2YW5kCXEyLCBxMiwgcTkKKwl2ZW9yCXE4LCBxOCwgcTEyCisJdmVvcglxMiwgcTIsIHE2CisJdmVvcglxMTIsIHExMiwgcTExCisJdmVvcglxNiwgcTYsIHExMAorCXZlb3IJcTUsIHE1LCBxMTIKKwl2ZW9yCXEyLCBxMiwgcTEyCisJdmVvcglxMSwgcTEsIHE4CisJdmVvcglxNiwgcTYsIHE4CisKKwl2ZW9yCXExMiwgcTMsIHEwCisJdmVvcglxOCwgcTcsIHE0CisJdmVvcglxMTEsIHExNSwgcTE0CisJdmVvcglxMTAsIHExMywgcTkKKwl2YW5kCXExMSwgcTExLCBxMTIKKwl2YW5kCXExMCwgcTEwLCBxMAorCXZlb3IJcTEyLCBxMTIsIHE4CisJdmVvcglxMCwgcTAsIHE0CisJdmFuZAlxOCwgcTgsIHExNQorCXZhbmQJcTQsIHE0LCBxMTMKKwl2YW5kCXExMiwgcTEyLCBxMTQKKwl2YW5kCXEwLCBxMCwgcTkKKwl2ZW9yCXE4LCBxOCwgcTEyCisJdmVvcglxMCwgcTAsIHE0CisJdmVvcglxMTIsIHExMiwgcTExCisJdmVvcglxNCwgcTQsIHExMAorCXZlb3IJcTE1LCBxMTUsIHExMworCXZlb3IJcTE0LCBxMTQsIHE5CisJdmVvcglxMTAsIHExNSwgcTE0CisJdmFuZAlxMTAsIHExMCwgcTMKKwl2ZW9yCXEzLCBxMywgcTcKKwl2YW5kCXExMSwgcTcsIHExNQorCXZhbmQJcTMsIHEzLCBxMTQKKwl2ZW9yCXE3LCBxMTEsIHExMAorCXZlb3IJcTMsIHEzLCBxMTEKKwl2ZW9yCXEzLCBxMywgcTEyCisJdmVvcglxMCwgcTAsIHExMgorCXZlb3IJcTcsIHE3LCBxOAorCXZlb3IJcTQsIHE0LCBxOAorCXZlb3IJcTEsIHExLCBxNworCXZlb3IJcTYsIHE2LCBxNQorCisJdmVvcglxNCwgcTQsIHExCisJdmVvcglxMiwgcTIsIHE3CisJdmVvcglxNSwgcTUsIHE3CisJdmVvcglxNCwgcTQsIHEyCisJdmVvcglxNywgcTcsIHEwCisJdmVvcglxNCwgcTQsIHE1CisJdmVvcglxMywgcTMsIHE2CisJdmVvcglxNiwgcTYsIHExCisJdmVvcglxMywgcTMsIHE0CisKKwl2ZW9yCXE0LCBxNCwgcTAKKwl2ZW9yCXE3LCBxNywgcTMKKwlzdWJzCXI1LHI1LCMxCisJYmNjCS5MZGVjX2RvbmUKKwlAIG11bHRpcGxpY2F0aW9uIGJ5IDB4MDUtMHgwMC0weDA0LTB4MDAKKwl2ZXh0LjgJcTgsIHEwLCBxMCwgIzgKKwl2ZXh0LjgJcTE0LCBxMywgcTMsICM4CisJdmV4dC44CXExNSwgcTUsIHE1LCAjOAorCXZlb3IJcTgsIHE4LCBxMAorCXZleHQuOAlxOSwgcTEsIHExLCAjOAorCXZlb3IJcTE0LCBxMTQsIHEzCisJdmV4dC44CXExMCwgcTYsIHE2LCAjOAorCXZlb3IJcTE1LCBxMTUsIHE1CisJdmV4dC44CXExMSwgcTQsIHE0LCAjOAorCXZlb3IJcTksIHE5LCBxMQorCXZleHQuOAlxMTIsIHEyLCBxMiwgIzgKKwl2ZW9yCXExMCwgcTEwLCBxNgorCXZleHQuOAlxMTMsIHE3LCBxNywgIzgKKwl2ZW9yCXExMSwgcTExLCBxNAorCXZlb3IJcTEyLCBxMTIsIHEyCisJdmVvcglxMTMsIHExMywgcTcKKworCXZlb3IJcTAsIHEwLCBxMTQKKwl2ZW9yCXExLCBxMSwgcTE0CisJdmVvcglxNiwgcTYsIHE4CisJdmVvcglxMiwgcTIsIHExMAorCXZlb3IJcTQsIHE0LCBxOQorCXZlb3IJcTEsIHExLCBxMTUKKwl2ZW9yCXE2LCBxNiwgcTE1CisJdmVvcglxMiwgcTIsIHExNAorCXZlb3IJcTcsIHE3LCBxMTEKKwl2ZW9yCXE0LCBxNCwgcTE0CisJdmVvcglxMywgcTMsIHExMgorCXZlb3IJcTIsIHEyLCBxMTUKKwl2ZW9yCXE3LCBxNywgcTE1CisJdmVvcglxNSwgcTUsIHExMworCXZleHQuOAlxOCwgcTAsIHEwLCAjMTIJQCB4MCA8PDwgMzIKKwl2ZXh0LjgJcTksIHExLCBxMSwgIzEyCisJdmVvcglxMCwgcTAsIHE4CQlAIHgwIF4gKHgwIDw8PCAzMikKKwl2ZXh0LjgJcTEwLCBxNiwgcTYsICMxMgorCXZlb3IJcTEsIHExLCBxOQorCXZleHQuOAlxMTEsIHE0LCBxNCwgIzEyCisJdmVvcglxNiwgcTYsIHExMAorCXZleHQuOAlxMTIsIHEyLCBxMiwgIzEyCisJdmVvcglxNCwgcTQsIHExMQorCXZleHQuOAlxMTMsIHE3LCBxNywgIzEyCisJdmVvcglxMiwgcTIsIHExMgorCXZleHQuOAlxMTQsIHEzLCBxMywgIzEyCisJdmVvcglxNywgcTcsIHExMworCXZleHQuOAlxMTUsIHE1LCBxNSwgIzEyCisJdmVvcglxMywgcTMsIHExNAorCisJdmVvcglxOSwgcTksIHEwCisJdmVvcglxNSwgcTUsIHExNQorCXZleHQuOAlxMCwgcTAsIHEwLCAjOAkJQCAoeDAgXiAoeDAgPDw8IDMyKSkgPDw8IDY0KQorCXZlb3IJcTEwLCBxMTAsIHExCisJdmVvcglxOCwgcTgsIHE1CisJdmVvcglxOSwgcTksIHE1CisJdmV4dC44CXExLCBxMSwgcTEsICM4CisJdmVvcglxMTMsIHExMywgcTIKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXExNCwgcTE0LCBxNworCXZlb3IJcTEsIHExLCBxOQorCXZleHQuOAlxOCwgcTIsIHEyLCAjOAorCXZlb3IJcTEyLCBxMTIsIHE0CisJdmV4dC44CXE5LCBxNywgcTcsICM4CisJdmVvcglxMTUsIHExNSwgcTMKKwl2ZXh0LjgJcTIsIHE0LCBxNCwgIzgKKwl2ZW9yCXExMSwgcTExLCBxNgorCXZleHQuOAlxNywgcTUsIHE1LCAjOAorCXZlb3IJcTEyLCBxMTIsIHE1CisJdmV4dC44CXE0LCBxMywgcTMsICM4CisJdmVvcglxMTEsIHExMSwgcTUKKwl2ZXh0LjgJcTMsIHE2LCBxNiwgIzgKKwl2ZW9yCXE1LCBxOSwgcTEzCisJdmVvcglxMTEsIHExMSwgcTIKKwl2ZW9yCXE3LCBxNywgcTE1CisJdmVvcglxNiwgcTQsIHExNAorCXZlb3IJcTQsIHE4LCBxMTIKKwl2ZW9yCXEyLCBxMywgcTEwCisJdm1vdglxMywgcTExCisJIEAgdm1vdglxNSwgcTkKKwl2bGRtaWEJcjYsIHtxMTJ9CQlAIC5MSVNSCisJaXRlCWVxCQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisJYWRkZXEJcjYscjYsIzB4MTAKKwlibmUJLkxkZWNfbG9vcAorCXZsZG1pYQlyNiwge3ExMn0JCUAgLkxJU1JNMAorCWIJLkxkZWNfbG9vcAorLmFsaWduCTQKKy5MZGVjX2RvbmU6CisJdm1vdi5pOAlxOCwjMHg1NQkJCUAgY29tcG9zZSAuTEJTMAorCXZtb3YuaTgJcTksIzB4MzMJCQlAIGNvbXBvc2UgLkxCUzEKKwl2c2hyLnU2NAlxMTAsIHEzLCAjMQorCXZzaHIudTY0CXExMSwgcTIsICMxCisJdmVvcglxMTAsIHExMCwgcTUKKwl2ZW9yCXExMSwgcTExLCBxNworCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE1LCBxNSwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMxCisJdmVvcglxNywgcTcsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMQorCXZlb3IJcTMsIHEzLCBxMTAKKwl2ZW9yCXEyLCBxMiwgcTExCisJdnNoci51NjQJcTEwLCBxNiwgIzEKKwl2c2hyLnU2NAlxMTEsIHEwLCAjMQorCXZlb3IJcTEwLCBxMTAsIHE0CisJdmVvcglxMTEsIHExMSwgcTEKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNCwgcTQsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMQorCXZlb3IJcTEsIHExLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzEKKwl2ZW9yCXE2LCBxNiwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZtb3YuaTgJcTgsIzB4MGYJCQlAIGNvbXBvc2UgLkxCUzIKKwl2c2hyLnU2NAlxMTAsIHE3LCAjMgorCXZzaHIudTY0CXExMSwgcTIsICMyCisJdmVvcglxMTAsIHExMCwgcTUKKwl2ZW9yCXExMSwgcTExLCBxMworCXZhbmQJcTEwLCBxMTAsIHE5CisJdmFuZAlxMTEsIHExMSwgcTkKKwl2ZW9yCXE1LCBxNSwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMyCisJdmVvcglxMywgcTMsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMgorCXZlb3IJcTcsIHE3LCBxMTAKKwl2ZW9yCXEyLCBxMiwgcTExCisJdnNoci51NjQJcTEwLCBxMSwgIzIKKwl2c2hyLnU2NAlxMTEsIHEwLCAjMgorCXZlb3IJcTEwLCBxMTAsIHE0CisJdmVvcglxMTEsIHExMSwgcTYKKwl2YW5kCXExMCwgcTEwLCBxOQorCXZhbmQJcTExLCBxMTEsIHE5CisJdmVvcglxNCwgcTQsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMgorCXZlb3IJcTYsIHE2LCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzIKKwl2ZW9yCXExLCBxMSwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZzaHIudTY0CXExMCwgcTQsICM0CisJdnNoci51NjQJcTExLCBxNiwgIzQKKwl2ZW9yCXExMCwgcTEwLCBxNQorCXZlb3IJcTExLCBxMTEsIHEzCisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTUsIHE1LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzQKKwl2ZW9yCXEzLCBxMywgcTExCisJdnNobC51NjQJcTExLCBxMTEsICM0CisJdmVvcglxNCwgcTQsIHExMAorCXZlb3IJcTYsIHE2LCBxMTEKKwl2c2hyLnU2NAlxMTAsIHExLCAjNAorCXZzaHIudTY0CXExMSwgcTAsICM0CisJdmVvcglxMTAsIHExMCwgcTcKKwl2ZW9yCXExMSwgcTExLCBxMgorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE3LCBxNywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICM0CisJdmVvcglxMiwgcTIsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjNAorCXZlb3IJcTEsIHExLCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJdmxkbWlhCXI0LCB7cTh9CQkJQCBsYXN0IHJvdW5kIGtleQorCXZlb3IJcTYsIHE2LCBxOAorCXZlb3IJcTQsIHE0LCBxOAorCXZlb3IJcTIsIHEyLCBxOAorCXZlb3IJcTcsIHE3LCBxOAorCXZlb3IJcTMsIHEzLCBxOAorCXZlb3IJcTUsIHE1LCBxOAorCXZlb3IJcTAsIHEwLCBxOAorCXZlb3IJcTEsIHExLCBxOAorCWJ4CWxyCisuc2l6ZQlfYnNhZXNfZGVjcnlwdDgsLi1fYnNhZXNfZGVjcnlwdDgKKworLnR5cGUJX2JzYWVzX2NvbnN0LCVvYmplY3QKKy5hbGlnbgk2CitfYnNhZXNfY29uc3Q6CisuTE0wSVNSOkAgSW52U2hpZnRSb3dzIGNvbnN0YW50cworLnF1YWQJMHgwYTBlMDIwNjA3MGIwZjAzLCAweDAwMDQwODBjMGQwMTA1MDkKKy5MSVNSOgorLnF1YWQJMHgwNTA0MDcwNjAyMDEwMDAzLCAweDBmMGUwZDBjMDgwYjBhMDkKKy5MSVNSTTA6CisucXVhZAkweDAxMDQwYjBlMDIwNTA4MGYsIDB4MDMwNjA5MGMwMDA3MGEwZAorLkxNMFNSOkAgU2hpZnRSb3dzIGNvbnN0YW50cworLnF1YWQJMHgwYTBlMDIwNjBmMDMwNzBiLCAweDAwMDQwODBjMDUwOTBkMDEKKy5MU1I6CisucXVhZAkweDA1MDQwNzA2MDAwMzAyMDEsIDB4MGYwZTBkMGMwYTA5MDgwYgorLkxTUk0wOgorLnF1YWQJMHgwMzA0MDkwZTAwMDUwYTBmLCAweDAxMDYwYjBjMDIwNzA4MGQKKy5MTTA6CisucXVhZAkweDAyMDYwYTBlMDMwNzBiMGYsIDB4MDAwNDA4MGMwMTA1MDkwZAorLkxSRVZNMFNSOgorLnF1YWQJMHgwOTBkMDEwNTBjMDAwNDA4LCAweDAzMDcwYjBmMDYwYTBlMDIKKy5ieXRlCTY2LDEwNSwxMTYsNDUsMTE1LDEwOCwxMDUsOTksMTAxLDEwMCwzMiw2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiw3OCw2OSw3OSw3OCw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTYKKy5zaXplCV9ic2Flc19jb25zdCwuLV9ic2Flc19jb25zdAorCisudHlwZQlfYnNhZXNfZW5jcnlwdDgsJWZ1bmN0aW9uCisuYWxpZ24JNAorX2JzYWVzX2VuY3J5cHQ4OgorCWFkcglyNiwuCisJdmxkbWlhCXI0ISwge3E5fQkJQCByb3VuZCAwIGtleQorI2lmIGRlZmluZWQoX190aHVtYjJfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisJYWRyCXI2LC5MTTBTUgorI2Vsc2UKKwlzdWIJcjYscjYsI19ic2Flc19lbmNyeXB0OC0uTE0wU1IKKyNlbmRpZgorCisJdmxkbWlhCXI2ISwge3E4fQkJQCAuTE0wU1IKK19ic2Flc19lbmNyeXB0OF9hbHQ6CisJdmVvcglxMTAsIHEwLCBxOQlAIHhvciB3aXRoIHJvdW5kMCBrZXkKKwl2ZW9yCXExMSwgcTEsIHE5CisJdnRibC44CWQwLCB7cTEwfSwgZDE2CisJdnRibC44CWQxLCB7cTEwfSwgZDE3CisJdmVvcglxMTIsIHEyLCBxOQorCXZ0YmwuOAlkMiwge3ExMX0sIGQxNgorCXZ0YmwuOAlkMywge3ExMX0sIGQxNworCXZlb3IJcTEzLCBxMywgcTkKKwl2dGJsLjgJZDQsIHtxMTJ9LCBkMTYKKwl2dGJsLjgJZDUsIHtxMTJ9LCBkMTcKKwl2ZW9yCXExNCwgcTQsIHE5CisJdnRibC44CWQ2LCB7cTEzfSwgZDE2CisJdnRibC44CWQ3LCB7cTEzfSwgZDE3CisJdmVvcglxMTUsIHE1LCBxOQorCXZ0YmwuOAlkOCwge3ExNH0sIGQxNgorCXZ0YmwuOAlkOSwge3ExNH0sIGQxNworCXZlb3IJcTEwLCBxNiwgcTkKKwl2dGJsLjgJZDEwLCB7cTE1fSwgZDE2CisJdnRibC44CWQxMSwge3ExNX0sIGQxNworCXZlb3IJcTExLCBxNywgcTkKKwl2dGJsLjgJZDEyLCB7cTEwfSwgZDE2CisJdnRibC44CWQxMywge3ExMH0sIGQxNworCXZ0YmwuOAlkMTQsIHtxMTF9LCBkMTYKKwl2dGJsLjgJZDE1LCB7cTExfSwgZDE3CitfYnNhZXNfZW5jcnlwdDhfYml0c2xpY2U6CisJdm1vdi5pOAlxOCwjMHg1NQkJCUAgY29tcG9zZSAuTEJTMAorCXZtb3YuaTgJcTksIzB4MzMJCQlAIGNvbXBvc2UgLkxCUzEKKwl2c2hyLnU2NAlxMTAsIHE2LCAjMQorCXZzaHIudTY0CXExMSwgcTQsICMxCisJdmVvcglxMTAsIHExMCwgcTcKKwl2ZW9yCXExMSwgcTExLCBxNQorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE3LCBxNywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMxCisJdmVvcglxNSwgcTUsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMQorCXZlb3IJcTYsIHE2LCBxMTAKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNoci51NjQJcTEwLCBxMiwgIzEKKwl2c2hyLnU2NAlxMTEsIHEwLCAjMQorCXZlb3IJcTEwLCBxMTAsIHEzCisJdmVvcglxMTEsIHExMSwgcTEKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxMywgcTMsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMQorCXZlb3IJcTEsIHExLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzEKKwl2ZW9yCXEyLCBxMiwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZtb3YuaTgJcTgsIzB4MGYJCQlAIGNvbXBvc2UgLkxCUzIKKwl2c2hyLnU2NAlxMTAsIHE1LCAjMgorCXZzaHIudTY0CXExMSwgcTQsICMyCisJdmVvcglxMTAsIHExMCwgcTcKKwl2ZW9yCXExMSwgcTExLCBxNgorCXZhbmQJcTEwLCBxMTAsIHE5CisJdmFuZAlxMTEsIHExMSwgcTkKKwl2ZW9yCXE3LCBxNywgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICMyCisJdmVvcglxNiwgcTYsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjMgorCXZlb3IJcTUsIHE1LCBxMTAKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNoci51NjQJcTEwLCBxMSwgIzIKKwl2c2hyLnU2NAlxMTEsIHEwLCAjMgorCXZlb3IJcTEwLCBxMTAsIHEzCisJdmVvcglxMTEsIHExMSwgcTIKKwl2YW5kCXExMCwgcTEwLCBxOQorCXZhbmQJcTExLCBxMTEsIHE5CisJdmVvcglxMywgcTMsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMgorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzIKKwl2ZW9yCXExLCBxMSwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZzaHIudTY0CXExMCwgcTMsICM0CisJdnNoci51NjQJcTExLCBxMiwgIzQKKwl2ZW9yCXExMCwgcTEwLCBxNworCXZlb3IJcTExLCBxMTEsIHE2CisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTcsIHE3LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzQKKwl2ZW9yCXE2LCBxNiwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICM0CisJdmVvcglxMywgcTMsIHExMAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c2hyLnU2NAlxMTAsIHExLCAjNAorCXZzaHIudTY0CXExMSwgcTAsICM0CisJdmVvcglxMTAsIHExMCwgcTUKKwl2ZW9yCXExMSwgcTExLCBxNAorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE1LCBxNSwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICM0CisJdmVvcglxNCwgcTQsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjNAorCXZlb3IJcTEsIHExLCBxMTAKKwl2ZW9yCXEwLCBxMCwgcTExCisJc3ViCXI1LHI1LCMxCisJYgkuTGVuY19zYm94CisuYWxpZ24JNAorLkxlbmNfbG9vcDoKKwl2bGRtaWEJcjQhLCB7cTgscTkscTEwLHExMX0KKwl2ZW9yCXE4LCBxOCwgcTAKKwl2ZW9yCXE5LCBxOSwgcTEKKwl2dGJsLjgJZDAsIHtxOH0sIGQyNAorCXZ0YmwuOAlkMSwge3E4fSwgZDI1CisJdmxkbWlhCXI0ISwge3E4fQorCXZlb3IJcTEwLCBxMTAsIHEyCisJdnRibC44CWQyLCB7cTl9LCBkMjQKKwl2dGJsLjgJZDMsIHtxOX0sIGQyNQorCXZsZG1pYQlyNCEsIHtxOX0KKwl2ZW9yCXExMSwgcTExLCBxMworCXZ0YmwuOAlkNCwge3ExMH0sIGQyNAorCXZ0YmwuOAlkNSwge3ExMH0sIGQyNQorCXZsZG1pYQlyNCEsIHtxMTB9CisJdnRibC44CWQ2LCB7cTExfSwgZDI0CisJdnRibC44CWQ3LCB7cTExfSwgZDI1CisJdmxkbWlhCXI0ISwge3ExMX0KKwl2ZW9yCXE4LCBxOCwgcTQKKwl2ZW9yCXE5LCBxOSwgcTUKKwl2dGJsLjgJZDgsIHtxOH0sIGQyNAorCXZ0YmwuOAlkOSwge3E4fSwgZDI1CisJdmVvcglxMTAsIHExMCwgcTYKKwl2dGJsLjgJZDEwLCB7cTl9LCBkMjQKKwl2dGJsLjgJZDExLCB7cTl9LCBkMjUKKwl2ZW9yCXExMSwgcTExLCBxNworCXZ0YmwuOAlkMTIsIHtxMTB9LCBkMjQKKwl2dGJsLjgJZDEzLCB7cTEwfSwgZDI1CisJdnRibC44CWQxNCwge3ExMX0sIGQyNAorCXZ0YmwuOAlkMTUsIHtxMTF9LCBkMjUKKy5MZW5jX3Nib3g6CisJdmVvcglxMiwgcTIsIHExCisJdmVvcglxNSwgcTUsIHE2CisJdmVvcglxMywgcTMsIHEwCisJdmVvcglxNiwgcTYsIHEyCisJdmVvcglxNSwgcTUsIHEwCisKKwl2ZW9yCXE2LCBxNiwgcTMKKwl2ZW9yCXEzLCBxMywgcTcKKwl2ZW9yCXE3LCBxNywgcTUKKwl2ZW9yCXEzLCBxMywgcTQKKwl2ZW9yCXE0LCBxNCwgcTUKKworCXZlb3IJcTIsIHEyLCBxNworCXZlb3IJcTMsIHEzLCBxMQorCXZlb3IJcTEsIHExLCBxNQorCXZlb3IJcTExLCBxNywgcTQKKwl2ZW9yCXExMCwgcTEsIHEyCisJdmVvcglxOSwgcTUsIHEzCisJdmVvcglxMTMsIHEyLCBxNAorCXZtb3YJcTgsIHExMAorCXZlb3IJcTEyLCBxNiwgcTAKKworCXZvcnIJcTEwLCBxMTAsIHE5CisJdmVvcglxMTUsIHExMSwgcTgKKwl2YW5kCXExNCwgcTExLCBxMTIKKwl2b3JyCXExMSwgcTExLCBxMTIKKwl2ZW9yCXExMiwgcTEyLCBxOQorCXZhbmQJcTgsIHE4LCBxOQorCXZlb3IJcTksIHEzLCBxMAorCXZhbmQJcTE1LCBxMTUsIHExMgorCXZhbmQJcTEzLCBxMTMsIHE5CisJdmVvcglxOSwgcTcsIHExCisJdmVvcglxMTIsIHE1LCBxNgorCXZlb3IJcTExLCBxMTEsIHExMworCXZlb3IJcTEwLCBxMTAsIHExMworCXZhbmQJcTEzLCBxOSwgcTEyCisJdm9ycglxOSwgcTksIHExMgorCXZlb3IJcTExLCBxMTEsIHExNQorCXZlb3IJcTgsIHE4LCBxMTMKKwl2ZW9yCXExMCwgcTEwLCBxMTQKKwl2ZW9yCXE5LCBxOSwgcTE1CisJdmVvcglxOCwgcTgsIHExNAorCXZhbmQJcTEyLCBxMiwgcTMKKwl2ZW9yCXE5LCBxOSwgcTE0CisJdmFuZAlxMTMsIHE0LCBxMAorCXZhbmQJcTE0LCBxMSwgcTUKKwl2b3JyCXExNSwgcTcsIHE2CisJdmVvcglxMTEsIHExMSwgcTEyCisJdmVvcglxOSwgcTksIHExNAorCXZlb3IJcTgsIHE4LCBxMTUKKwl2ZW9yCXExMCwgcTEwLCBxMTMKKworCUAgSW52X0dGMTYgCTAsIAkxLCAJMiwgCTMsIHMwLCBzMSwgczIsIHMzCisKKwlAIG5ldyBzbWFsbGVyIGludmVyc2lvbgorCisJdmFuZAlxMTQsIHExMSwgcTkKKwl2bW92CXExMiwgcTgKKworCXZlb3IJcTEzLCBxMTAsIHExNAorCXZlb3IJcTE1LCBxOCwgcTE0CisJdmVvcglxMTQsIHE4LCBxMTQJQCBxMTQ9cTE1CisKKwl2YnNsCXExMywgcTksIHE4CisJdmJzbAlxMTUsIHExMSwgcTEwCisJdmVvcglxMTEsIHExMSwgcTEwCisKKwl2YnNsCXExMiwgcTEzLCBxMTQKKwl2YnNsCXE4LCBxMTQsIHExMworCisJdmFuZAlxMTQsIHExMiwgcTE1CisJdmVvcglxOSwgcTksIHE4CisKKwl2ZW9yCXExNCwgcTE0LCBxMTEKKwl2ZW9yCXExMiwgcTYsIHEwCisJdmVvcglxOCwgcTUsIHEzCisJdmVvcglxMTAsIHExNSwgcTE0CisJdmFuZAlxMTAsIHExMCwgcTYKKwl2ZW9yCXE2LCBxNiwgcTUKKwl2YW5kCXExMSwgcTUsIHExNQorCXZhbmQJcTYsIHE2LCBxMTQKKwl2ZW9yCXE1LCBxMTEsIHExMAorCXZlb3IJcTYsIHE2LCBxMTEKKwl2ZW9yCXExNSwgcTE1LCBxMTMKKwl2ZW9yCXExNCwgcTE0LCBxOQorCXZlb3IJcTExLCBxMTUsIHExNAorCXZlb3IJcTEwLCBxMTMsIHE5CisJdmFuZAlxMTEsIHExMSwgcTEyCisJdmFuZAlxMTAsIHExMCwgcTAKKwl2ZW9yCXExMiwgcTEyLCBxOAorCXZlb3IJcTAsIHEwLCBxMworCXZhbmQJcTgsIHE4LCBxMTUKKwl2YW5kCXEzLCBxMywgcTEzCisJdmFuZAlxMTIsIHExMiwgcTE0CisJdmFuZAlxMCwgcTAsIHE5CisJdmVvcglxOCwgcTgsIHExMgorCXZlb3IJcTAsIHEwLCBxMworCXZlb3IJcTEyLCBxMTIsIHExMQorCXZlb3IJcTMsIHEzLCBxMTAKKwl2ZW9yCXE2LCBxNiwgcTEyCisJdmVvcglxMCwgcTAsIHExMgorCXZlb3IJcTUsIHE1LCBxOAorCXZlb3IJcTMsIHEzLCBxOAorCisJdmVvcglxMTIsIHE3LCBxNAorCXZlb3IJcTgsIHExLCBxMgorCXZlb3IJcTExLCBxMTUsIHExNAorCXZlb3IJcTEwLCBxMTMsIHE5CisJdmFuZAlxMTEsIHExMSwgcTEyCisJdmFuZAlxMTAsIHExMCwgcTQKKwl2ZW9yCXExMiwgcTEyLCBxOAorCXZlb3IJcTQsIHE0LCBxMgorCXZhbmQJcTgsIHE4LCBxMTUKKwl2YW5kCXEyLCBxMiwgcTEzCisJdmFuZAlxMTIsIHExMiwgcTE0CisJdmFuZAlxNCwgcTQsIHE5CisJdmVvcglxOCwgcTgsIHExMgorCXZlb3IJcTQsIHE0LCBxMgorCXZlb3IJcTEyLCBxMTIsIHExMQorCXZlb3IJcTIsIHEyLCBxMTAKKwl2ZW9yCXExNSwgcTE1LCBxMTMKKwl2ZW9yCXExNCwgcTE0LCBxOQorCXZlb3IJcTEwLCBxMTUsIHExNAorCXZhbmQJcTEwLCBxMTAsIHE3CisJdmVvcglxNywgcTcsIHExCisJdmFuZAlxMTEsIHExLCBxMTUKKwl2YW5kCXE3LCBxNywgcTE0CisJdmVvcglxMSwgcTExLCBxMTAKKwl2ZW9yCXE3LCBxNywgcTExCisJdmVvcglxNywgcTcsIHExMgorCXZlb3IJcTQsIHE0LCBxMTIKKwl2ZW9yCXExLCBxMSwgcTgKKwl2ZW9yCXEyLCBxMiwgcTgKKwl2ZW9yCXE3LCBxNywgcTAKKwl2ZW9yCXExLCBxMSwgcTYKKwl2ZW9yCXE2LCBxNiwgcTAKKwl2ZW9yCXE0LCBxNCwgcTcKKwl2ZW9yCXEwLCBxMCwgcTEKKworCXZlb3IJcTEsIHExLCBxNQorCXZlb3IJcTUsIHE1LCBxMgorCXZlb3IJcTIsIHEyLCBxMworCXZlb3IJcTMsIHEzLCBxNQorCXZlb3IJcTQsIHE0LCBxNQorCisJdmVvcglxNiwgcTYsIHEzCisJc3VicwlyNSxyNSwjMQorCWJjYwkuTGVuY19kb25lCisJdmV4dC44CXE4LCBxMCwgcTAsICMxMglAIHgwIDw8PCAzMgorCXZleHQuOAlxOSwgcTEsIHExLCAjMTIKKwl2ZW9yCXEwLCBxMCwgcTgJCUAgeDAgXiAoeDAgPDw8IDMyKQorCXZleHQuOAlxMTAsIHE0LCBxNCwgIzEyCisJdmVvcglxMSwgcTEsIHE5CisJdmV4dC44CXExMSwgcTYsIHE2LCAjMTIKKwl2ZW9yCXE0LCBxNCwgcTEwCisJdmV4dC44CXExMiwgcTMsIHEzLCAjMTIKKwl2ZW9yCXE2LCBxNiwgcTExCisJdmV4dC44CXExMywgcTcsIHE3LCAjMTIKKwl2ZW9yCXEzLCBxMywgcTEyCisJdmV4dC44CXExNCwgcTIsIHEyLCAjMTIKKwl2ZW9yCXE3LCBxNywgcTEzCisJdmV4dC44CXExNSwgcTUsIHE1LCAjMTIKKwl2ZW9yCXEyLCBxMiwgcTE0CisKKwl2ZW9yCXE5LCBxOSwgcTAKKwl2ZW9yCXE1LCBxNSwgcTE1CisJdmV4dC44CXEwLCBxMCwgcTAsICM4CQlAICh4MCBeICh4MCA8PDwgMzIpKSA8PDwgNjQpCisJdmVvcglxMTAsIHExMCwgcTEKKwl2ZW9yCXE4LCBxOCwgcTUKKwl2ZW9yCXE5LCBxOSwgcTUKKwl2ZXh0LjgJcTEsIHExLCBxMSwgIzgKKwl2ZW9yCXExMywgcTEzLCBxMworCXZlb3IJcTAsIHEwLCBxOAorCXZlb3IJcTE0LCBxMTQsIHE3CisJdmVvcglxMSwgcTEsIHE5CisJdmV4dC44CXE4LCBxMywgcTMsICM4CisJdmVvcglxMTIsIHExMiwgcTYKKwl2ZXh0LjgJcTksIHE3LCBxNywgIzgKKwl2ZW9yCXExNSwgcTE1LCBxMgorCXZleHQuOAlxMywgcTYsIHE2LCAjOAorCXZlb3IJcTExLCBxMTEsIHE0CisJdmV4dC44CXE3LCBxNSwgcTUsICM4CisJdmVvcglxMTIsIHExMiwgcTUKKwl2ZXh0LjgJcTYsIHEyLCBxMiwgIzgKKwl2ZW9yCXExMSwgcTExLCBxNQorCXZleHQuOAlxMiwgcTQsIHE0LCAjOAorCXZlb3IJcTUsIHE5LCBxMTMKKwl2ZW9yCXE0LCBxOCwgcTEyCisJdmVvcglxMywgcTMsIHExMQorCXZlb3IJcTcsIHE3LCBxMTUKKwl2ZW9yCXE2LCBxNiwgcTE0CisJIEAgdm1vdglxNCwgcTgKKwl2ZW9yCXEyLCBxMiwgcTEwCisJIEAgdm1vdglxNSwgcTkKKwl2bGRtaWEJcjYsIHtxMTJ9CQlAIC5MU1IKKwlpdGUJZXEJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbWl0eSBjaGVjayBpbiBBUk0KKwlhZGRlcQlyNixyNiwjMHgxMAorCWJuZQkuTGVuY19sb29wCisJdmxkbWlhCXI2LCB7cTEyfQkJQCAuTFNSTTAKKwliCS5MZW5jX2xvb3AKKy5hbGlnbgk0CisuTGVuY19kb25lOgorCXZtb3YuaTgJcTgsIzB4NTUJCQlAIGNvbXBvc2UgLkxCUzAKKwl2bW92Lmk4CXE5LCMweDMzCQkJQCBjb21wb3NlIC5MQlMxCisJdnNoci51NjQJcTEwLCBxMiwgIzEKKwl2c2hyLnU2NAlxMTEsIHEzLCAjMQorCXZlb3IJcTEwLCBxMTAsIHE1CisJdmVvcglxMTEsIHExMSwgcTcKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNSwgcTUsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMQorCXZlb3IJcTcsIHE3LCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzEKKwl2ZW9yCXEyLCBxMiwgcTEwCisJdmVvcglxMywgcTMsIHExMQorCXZzaHIudTY0CXExMCwgcTQsICMxCisJdnNoci51NjQJcTExLCBxMCwgIzEKKwl2ZW9yCXExMCwgcTEwLCBxNgorCXZlb3IJcTExLCBxMTEsIHExCisJdmFuZAlxMTAsIHExMCwgcTgKKwl2YW5kCXExMSwgcTExLCBxOAorCXZlb3IJcTYsIHE2LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzEKKwl2ZW9yCXExLCBxMSwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMxCisJdmVvcglxNCwgcTQsIHExMAorCXZlb3IJcTAsIHEwLCBxMTEKKwl2bW92Lmk4CXE4LCMweDBmCQkJQCBjb21wb3NlIC5MQlMyCisJdnNoci51NjQJcTEwLCBxNywgIzIKKwl2c2hyLnU2NAlxMTEsIHEzLCAjMgorCXZlb3IJcTEwLCBxMTAsIHE1CisJdmVvcglxMTEsIHExMSwgcTIKKwl2YW5kCXExMCwgcTEwLCBxOQorCXZhbmQJcTExLCBxMTEsIHE5CisJdmVvcglxNSwgcTUsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjMgorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzIKKwl2ZW9yCXE3LCBxNywgcTEwCisJdmVvcglxMywgcTMsIHExMQorCXZzaHIudTY0CXExMCwgcTEsICMyCisJdnNoci51NjQJcTExLCBxMCwgIzIKKwl2ZW9yCXExMCwgcTEwLCBxNgorCXZlb3IJcTExLCBxMTEsIHE0CisJdmFuZAlxMTAsIHExMCwgcTkKKwl2YW5kCXExMSwgcTExLCBxOQorCXZlb3IJcTYsIHE2LCBxMTAKKwl2c2hsLnU2NAlxMTAsIHExMCwgIzIKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNobC51NjQJcTExLCBxMTEsICMyCisJdmVvcglxMSwgcTEsIHExMAorCXZlb3IJcTAsIHEwLCBxMTEKKwl2c2hyLnU2NAlxMTAsIHE2LCAjNAorCXZzaHIudTY0CXExMSwgcTQsICM0CisJdmVvcglxMTAsIHExMCwgcTUKKwl2ZW9yCXExMSwgcTExLCBxMgorCXZhbmQJcTEwLCBxMTAsIHE4CisJdmFuZAlxMTEsIHExMSwgcTgKKwl2ZW9yCXE1LCBxNSwgcTEwCisJdnNobC51NjQJcTEwLCBxMTAsICM0CisJdmVvcglxMiwgcTIsIHExMQorCXZzaGwudTY0CXExMSwgcTExLCAjNAorCXZlb3IJcTYsIHE2LCBxMTAKKwl2ZW9yCXE0LCBxNCwgcTExCisJdnNoci51NjQJcTEwLCBxMSwgIzQKKwl2c2hyLnU2NAlxMTEsIHEwLCAjNAorCXZlb3IJcTEwLCBxMTAsIHE3CisJdmVvcglxMTEsIHExMSwgcTMKKwl2YW5kCXExMCwgcTEwLCBxOAorCXZhbmQJcTExLCBxMTEsIHE4CisJdmVvcglxNywgcTcsIHExMAorCXZzaGwudTY0CXExMCwgcTEwLCAjNAorCXZlb3IJcTMsIHEzLCBxMTEKKwl2c2hsLnU2NAlxMTEsIHExMSwgIzQKKwl2ZW9yCXExLCBxMSwgcTEwCisJdmVvcglxMCwgcTAsIHExMQorCXZsZG1pYQlyNCwge3E4fQkJCUAgbGFzdCByb3VuZCBrZXkKKwl2ZW9yCXE0LCBxNCwgcTgKKwl2ZW9yCXE2LCBxNiwgcTgKKwl2ZW9yCXEzLCBxMywgcTgKKwl2ZW9yCXE3LCBxNywgcTgKKwl2ZW9yCXEyLCBxMiwgcTgKKwl2ZW9yCXE1LCBxNSwgcTgKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXExLCBxMSwgcTgKKwlieAlscgorLnNpemUJX2JzYWVzX2VuY3J5cHQ4LC4tX2JzYWVzX2VuY3J5cHQ4CisudHlwZQlfYnNhZXNfa2V5X2NvbnZlcnQsJWZ1bmN0aW9uCisuYWxpZ24JNAorX2JzYWVzX2tleV9jb252ZXJ0OgorCWFkcglyNiwuCisJdmxkMS44CXtxN30sICBbcjRdIQkJQCBsb2FkIHJvdW5kIDAga2V5CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKwlhZHIJcjYsLkxNMAorI2Vsc2UKKwlzdWIJcjYscjYsI19ic2Flc19rZXlfY29udmVydC0uTE0wCisjZW5kaWYKKwl2bGQxLjgJe3ExNX0sIFtyNF0hCQlAIGxvYWQgcm91bmQgMSBrZXkKKworCXZtb3YuaTgJcTgsICAjMHgwMQkJCUAgYml0IG1hc2tzCisJdm1vdi5pOAlxOSwgICMweDAyCisJdm1vdi5pOAlxMTAsICMweDA0CisJdm1vdi5pOAlxMTEsICMweDA4CisJdm1vdi5pOAlxMTIsICMweDEwCisJdm1vdi5pOAlxMTMsICMweDIwCisJdmxkbWlhCXI2LCB7cTE0fQkJQCAuTE0wCisKKyNpZmRlZiBfX0FSTUVMX18KKwl2cmV2MzIuOAlxNywgIHE3CisJdnJldjMyLjgJcTE1LCBxMTUKKyNlbmRpZgorCXN1YglyNSxyNSwjMQorCXZzdG1pYQlyMTIhLCB7cTd9CQlAIHNhdmUgcm91bmQgMCBrZXkKKwliCS5Ma2V5X2xvb3AKKworLmFsaWduCTQKKy5Ma2V5X2xvb3A6CisJdnRibC44CWQxNCx7cTE1fSxkMjgKKwl2dGJsLjgJZDE1LHtxMTV9LGQyOQorCXZtb3YuaTgJcTYsICAjMHg0MAorCXZtb3YuaTgJcTE1LCAjMHg4MAorCisJdnRzdC44CXEwLCBxNywgcTgKKwl2dHN0LjgJcTEsIHE3LCBxOQorCXZ0c3QuOAlxMiwgcTcsIHExMAorCXZ0c3QuOAlxMywgcTcsIHExMQorCXZ0c3QuOAlxNCwgcTcsIHExMgorCXZ0c3QuOAlxNSwgcTcsIHExMworCXZ0c3QuOAlxNiwgcTcsIHE2CisJdnRzdC44CXE3LCBxNywgcTE1CisJdmxkMS44CXtxMTV9LCBbcjRdIQkJQCBsb2FkIG5leHQgcm91bmQga2V5CisJdm12bglxMCwgcTAJCUAgInBub3QiCisJdm12bglxMSwgcTEKKwl2bXZuCXE1LCBxNQorCXZtdm4JcTYsIHE2CisjaWZkZWYgX19BUk1FTF9fCisJdnJldjMyLjgJcTE1LCBxMTUKKyNlbmRpZgorCXN1YnMJcjUscjUsIzEKKwl2c3RtaWEJcjEyISx7cTAscTEscTIscTMscTQscTUscTYscTd9CQlAIHdyaXRlIGJpdC1zbGljZWQgcm91bmQga2V5CisJYm5lCS5Ma2V5X2xvb3AKKworCXZtb3YuaTgJcTcsIzB4NjMJCQlAIGNvbXBvc2UgLkw2MworCUAgZG9uJ3Qgc2F2ZSBsYXN0IHJvdW5kIGtleQorCWJ4CWxyCisuc2l6ZQlfYnNhZXNfa2V5X2NvbnZlcnQsLi1fYnNhZXNfa2V5X2NvbnZlcnQKKworCisKKy5nbG9ibAlic2Flc19jYmNfZW5jcnlwdAorLmhpZGRlbglic2Flc19jYmNfZW5jcnlwdAorLnR5cGUJYnNhZXNfY2JjX2VuY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNQorYnNhZXNfY2JjX2VuY3J5cHQ6CisjaWZuZGVmCV9fS0VSTkVMX18KKwljbXAJcjIsICMxMjgKKyNpZm5kZWYJX190aHVtYl9fCisJYmxvCUFFU19jYmNfZW5jcnlwdAorI2Vsc2UKKwliaHMJMWYKKwliCUFFU19jYmNfZW5jcnlwdAorMToKKyNlbmRpZgorI2VuZGlmCisKKwlAIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHdlIGFyZSBjYWxsZWQgd2l0aCBlbmMgPT0gMAorCisJbW92CWlwLCBzcAorCXN0bWRiCXNwISwge3I0LHI1LHI2LHI3LHI4LHI5LHIxMCwgbHJ9CisJVkZQX0FCSV9QVVNICisJbGRyCXI4LCBbaXBdCQkJQCBJViBpcyAxc3QgYXJnIG9uIHRoZSBzdGFjaworCW1vdglyMiwgcjIsIGxzciM0CQlAIGxlbiBpbiAxNiBieXRlIGJsb2NrcworCXN1YglzcCwgIzB4MTAJCQlAIHNjcmF0Y2ggc3BhY2UgdG8gY2Fycnkgb3ZlciB0aGUgSVYKKwltb3YJcjksIHNwCQkJCUAgc2F2ZSBzcAorCisJbGRyCXIxMCwgW3IzLCAjMjQwXQkJQCBnZXQgIyBvZiByb3VuZHMKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCUAgYWxsb2NhdGUgdGhlIGtleSBzY2hlZHVsZSBvbiB0aGUgc3RhY2sKKwlzdWIJcjEyLCBzcCwgcjEwLCBsc2wjNwkJQCAxMjggYnl0ZXMgcGVyIGlubmVyIHJvdW5kIGtleQorCWFkZAlyMTIsICM5NgkJCUAgc2lmemUgb2YgYml0LXNsaWNlcyBrZXkgc2NoZWR1bGUKKworCUAgcG9wdWxhdGUgdGhlIGtleSBzY2hlZHVsZQorCW1vdglyNCwgcjMJCQlAIHBhc3Mga2V5CisJbW92CXI1LCByMTAJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwltb3YJc3AsIHIxMgkJCQlAIHNwIGlzIHNwCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJdmxkbWlhCXNwLCB7cTZ9CisJdnN0bWlhCXIxMiwgIHtxMTV9CQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKwl2ZW9yCXE3LCBxNywgcTYJQCBmaXggdXAgcm91bmQgMCBrZXkKKwl2c3RtaWEJc3AsIHtxN30KKyNlbHNlCisJbGRyCXIxMiwgW3IzLCAjMjQ0XQorCWVvcnMJcjEyLCAjMQorCWJlcQkwZgorCisJQCBwb3B1bGF0ZSB0aGUga2V5IHNjaGVkdWxlCisJc3RyCXIxMiwgW3IzLCAjMjQ0XQorCW1vdglyNCwgcjMJCQlAIHBhc3Mga2V5CisJbW92CXI1LCByMTAJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwlhZGQJcjEyLCByMywgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlhZGQJcjQsIHIzLCAjMjQ4CisJdmxkbWlhCXI0LCB7cTZ9CisJdnN0bWlhCXIxMiwge3ExNX0JCQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKwl2ZW9yCXE3LCBxNywgcTYJQCBmaXggdXAgcm91bmQgMCBrZXkKKwl2c3RtaWEJcjQsIHtxN30KKworLmFsaWduCTIKKworI2VuZGlmCisKKwl2bGQxLjgJe3ExNX0sIFtyOF0JCUAgbG9hZCBJVgorCWIJLkxjYmNfZGVjX2xvb3AKKworLmFsaWduCTQKKy5MY2JjX2RlY19sb29wOgorCXN1YnMJcjIsIHIyLCAjMHg4CisJYm1pCS5MY2JjX2RlY19sb29wX2ZpbmlzaAorCisJdmxkMS44CXtxMCxxMX0sIFtyMF0hCUAgbG9hZCBpbnB1dAorCXZsZDEuOAl7cTIscTN9LCBbcjBdIQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJbW92CXI0LCBzcAkJCUAgcGFzcyB0aGUga2V5CisjZWxzZQorCWFkZAlyNCwgcjMsICMyNDgKKyNlbmRpZgorCXZsZDEuOAl7cTQscTV9LCBbcjBdIQorCW1vdglyNSwgcjEwCisJdmxkMS44CXtxNixxN30sIFtyMF0KKwlzdWIJcjAsIHIwLCAjMHg2MAorCXZzdG1pYQlyOSwge3ExNX0JCQlAIHB1dCBhc2lkZSBJVgorCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGRtaWEJcjksIHtxMTR9CQkJQCByZWxvYWQgSVYKKwl2bGQxLjgJe3E4LHE5fSwgW3IwXSEJQCByZWxvYWQgaW5wdXQKKwl2ZW9yCXEwLCBxMCwgcTE0CUAgXj0gSVYKKwl2bGQxLjgJe3ExMCxxMTF9LCBbcjBdIQorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTYsIHE2LCBxOQorCXZsZDEuOAl7cTEyLHExM30sIFtyMF0hCisJdmVvcglxNCwgcTQsIHExMAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2bGQxLjgJe3ExNCxxMTV9LCBbcjBdIQorCXZlb3IJcTcsIHE3LCBxMTIKKwl2c3QxLjgJe3EwLHExfSwgW3IxXSEJQCB3cml0ZSBvdXRwdXQKKwl2ZW9yCXEzLCBxMywgcTEzCisJdnN0MS44CXtxNn0sIFtyMV0hCisJdmVvcglxNSwgcTUsIHExNAorCXZzdDEuOAl7cTR9LCBbcjFdIQorCXZzdDEuOAl7cTJ9LCBbcjFdIQorCXZzdDEuOAl7cTd9LCBbcjFdIQorCXZzdDEuOAl7cTN9LCBbcjFdIQorCXZzdDEuOAl7cTV9LCBbcjFdIQorCisJYgkuTGNiY19kZWNfbG9vcAorCisuTGNiY19kZWNfbG9vcF9maW5pc2g6CisJYWRkcwlyMiwgcjIsICM4CisJYmVxCS5MY2JjX2RlY19kb25lCisKKwl2bGQxLjgJe3EwfSwgW3IwXSEJCUAgbG9hZCBpbnB1dAorCWNtcAlyMiwgIzIKKwlibG8JLkxjYmNfZGVjX29uZQorCXZsZDEuOAl7cTF9LCBbcjBdIQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJbW92CXI0LCBzcAkJCUAgcGFzcyB0aGUga2V5CisjZWxzZQorCWFkZAlyNCwgcjMsICMyNDgKKyNlbmRpZgorCW1vdglyNSwgcjEwCisJdnN0bWlhCXI5LCB7cTE1fQkJCUAgcHV0IGFzaWRlIElWCisJYmVxCS5MY2JjX2RlY190d28KKwl2bGQxLjgJe3EyfSwgW3IwXSEKKwljbXAJcjIsICM0CisJYmxvCS5MY2JjX2RlY190aHJlZQorCXZsZDEuOAl7cTN9LCBbcjBdIQorCWJlcQkuTGNiY19kZWNfZm91cgorCXZsZDEuOAl7cTR9LCBbcjBdIQorCWNtcAlyMiwgIzYKKwlibG8JLkxjYmNfZGVjX2ZpdmUKKwl2bGQxLjgJe3E1fSwgW3IwXSEKKwliZXEJLkxjYmNfZGVjX3NpeAorCXZsZDEuOAl7cTZ9LCBbcjBdIQorCXN1YglyMCwgcjAsICMweDcwCisKKwlibAlfYnNhZXNfZGVjcnlwdDgKKworCXZsZG1pYQlyOSwge3ExNH0JCQlAIHJlbG9hZCBJVgorCXZsZDEuOAl7cTgscTl9LCBbcjBdIQlAIHJlbG9hZCBpbnB1dAorCXZlb3IJcTAsIHEwLCBxMTQJQCBePSBJVgorCXZsZDEuOAl7cTEwLHExMX0sIFtyMF0hCisJdmVvcglxMSwgcTEsIHE4CisJdmVvcglxNiwgcTYsIHE5CisJdmxkMS44CXtxMTIscTEzfSwgW3IwXSEKKwl2ZW9yCXE0LCBxNCwgcTEwCisJdmVvcglxMiwgcTIsIHExMQorCXZsZDEuOAl7cTE1fSwgW3IwXSEKKwl2ZW9yCXE3LCBxNywgcTEyCisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJdmVvcglxMywgcTMsIHExMworCXZzdDEuOAl7cTZ9LCBbcjFdIQorCXZzdDEuOAl7cTR9LCBbcjFdIQorCXZzdDEuOAl7cTJ9LCBbcjFdIQorCXZzdDEuOAl7cTd9LCBbcjFdIQorCXZzdDEuOAl7cTN9LCBbcjFdIQorCWIJLkxjYmNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTGNiY19kZWNfc2l4OgorCXN1YglyMCwgcjAsICMweDYwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCXI5LHtxMTR9CQkJQCByZWxvYWQgSVYKKwl2bGQxLjgJe3E4LHE5fSwgW3IwXSEJQCByZWxvYWQgaW5wdXQKKwl2ZW9yCXEwLCBxMCwgcTE0CUAgXj0gSVYKKwl2bGQxLjgJe3ExMCxxMTF9LCBbcjBdIQorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTYsIHE2LCBxOQorCXZsZDEuOAl7cTEyfSwgW3IwXSEKKwl2ZW9yCXE0LCBxNCwgcTEwCisJdmVvcglxMiwgcTIsIHExMQorCXZsZDEuOAl7cTE1fSwgW3IwXSEKKwl2ZW9yCXE3LCBxNywgcTEyCisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJdnN0MS44CXtxNn0sIFtyMV0hCisJdnN0MS44CXtxNH0sIFtyMV0hCisJdnN0MS44CXtxMn0sIFtyMV0hCisJdnN0MS44CXtxN30sIFtyMV0hCisJYgkuTGNiY19kZWNfZG9uZQorLmFsaWduCTQKKy5MY2JjX2RlY19maXZlOgorCXN1YglyMCwgcjAsICMweDUwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCXI5LCB7cTE0fQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtxOCxxOX0sIFtyMF0hCUAgcmVsb2FkIGlucHV0CisJdmVvcglxMCwgcTAsIHExNAlAIF49IElWCisJdmxkMS44CXtxMTAscTExfSwgW3IwXSEKKwl2ZW9yCXExLCBxMSwgcTgKKwl2ZW9yCXE2LCBxNiwgcTkKKwl2bGQxLjgJe3ExNX0sIFtyMF0hCisJdmVvcglxNCwgcTQsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjFdIQlAIHdyaXRlIG91dHB1dAorCXZlb3IJcTIsIHEyLCBxMTEKKwl2c3QxLjgJe3E2fSwgW3IxXSEKKwl2c3QxLjgJe3E0fSwgW3IxXSEKKwl2c3QxLjgJe3EyfSwgW3IxXSEKKwliCS5MY2JjX2RlY19kb25lCisuYWxpZ24JNAorLkxjYmNfZGVjX2ZvdXI6CisJc3ViCXIwLCByMCwgIzB4NDAKKwlibAlfYnNhZXNfZGVjcnlwdDgKKwl2bGRtaWEJcjksIHtxMTR9CQkJQCByZWxvYWQgSVYKKwl2bGQxLjgJe3E4LHE5fSwgW3IwXSEJQCByZWxvYWQgaW5wdXQKKwl2ZW9yCXEwLCBxMCwgcTE0CUAgXj0gSVYKKwl2bGQxLjgJe3ExMH0sIFtyMF0hCisJdmVvcglxMSwgcTEsIHE4CisJdmVvcglxNiwgcTYsIHE5CisJdmxkMS44CXtxMTV9LCBbcjBdIQorCXZlb3IJcTQsIHE0LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3IxXSEJQCB3cml0ZSBvdXRwdXQKKwl2c3QxLjgJe3E2fSwgW3IxXSEKKwl2c3QxLjgJe3E0fSwgW3IxXSEKKwliCS5MY2JjX2RlY19kb25lCisuYWxpZ24JNAorLkxjYmNfZGVjX3RocmVlOgorCXN1YglyMCwgcjAsICMweDMwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCXI5LCB7cTE0fQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtxOCxxOX0sIFtyMF0hCUAgcmVsb2FkIGlucHV0CisJdmVvcglxMCwgcTAsIHExNAlAIF49IElWCisJdmxkMS44CXtxMTV9LCBbcjBdIQorCXZlb3IJcTEsIHExLCBxOAorCXZlb3IJcTYsIHE2LCBxOQorCXZzdDEuOAl7cTAscTF9LCBbcjFdIQlAIHdyaXRlIG91dHB1dAorCXZzdDEuOAl7cTZ9LCBbcjFdIQorCWIJLkxjYmNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTGNiY19kZWNfdHdvOgorCXN1YglyMCwgcjAsICMweDIwCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisJdmxkbWlhCXI5LCB7cTE0fQkJCUAgcmVsb2FkIElWCisJdmxkMS44CXtxOH0sIFtyMF0hCQlAIHJlbG9hZCBpbnB1dAorCXZlb3IJcTAsIHEwLCBxMTQJQCBePSBJVgorCXZsZDEuOAl7cTE1fSwgW3IwXSEJCUAgcmVsb2FkIGlucHV0CisJdmVvcglxMSwgcTEsIHE4CisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJYgkuTGNiY19kZWNfZG9uZQorLmFsaWduCTQKKy5MY2JjX2RlY19vbmU6CisJc3ViCXIwLCByMCwgIzB4MTAKKwltb3YJcjEwLCByMQkJCUAgc2F2ZSBvcmlnaW5hbCBvdXQgcG9pbnRlcgorCW1vdglyMSwgcjkJCQlAIHVzZSB0aGUgaXYgc2NyYXRjaCBzcGFjZSBhcyBvdXQgYnVmZmVyCisJbW92CXIyLCByMworCXZtb3YJcTQscTE1CQlAIGp1c3QgaW4gY2FzZSBlbnN1cmUgdGhhdCBJVgorCXZtb3YJcTUscTAJCQlAIGFuZCBpbnB1dCBhcmUgcHJlc2VydmVkCisJYmwJQUVTX2RlY3J5cHQKKwl2bGQxLjgJe3EwfSwgW3I5XQkJQCBsb2FkIHJlc3VsdAorCXZlb3IJcTAsIHEwLCBxNAlAIF49IElWCisJdm1vdglxMTUsIHE1CQlAIHE1IGhvbGRzIGlucHV0CisJdnN0MS44CXtxMH0sIFtyMTBdCQlAIHdyaXRlIG91dHB1dAorCisuTGNiY19kZWNfZG9uZToKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorLkxjYmNfZGVjX2J6ZXJvOkAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJc3AhLCB7cTAscTF9CisJY21wCXNwLCByOQorCWJuZQkuTGNiY19kZWNfYnplcm8KKyNlbmRpZgorCisJbW92CXNwLCByOQorCWFkZAlzcCwgIzB4MTAJCQlAIGFkZCBzcCxyOSwjMHgxMCBpcyBubyBnb29kIGZvciB0aHVtYgorCXZzdDEuOAl7cTE1fSwgW3I4XQkJQCByZXR1cm4gSVYKKwlWRlBfQUJJX1BPUAorCWxkbWlhCXNwISwge3I0LHI1LHI2LHI3LHI4LHI5LHIxMCwgcGN9Cisuc2l6ZQlic2Flc19jYmNfZW5jcnlwdCwuLWJzYWVzX2NiY19lbmNyeXB0CisKKy5nbG9ibAlic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLmhpZGRlbglic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLnR5cGUJYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3MsJWZ1bmN0aW9uCisuYWxpZ24JNQorYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisJY21wCXIyLCAjOAkJCUAgdXNlIHBsYWluIEFFUyBmb3IKKwlibG8JLkxjdHJfZW5jX3Nob3J0CQkJQCBzbWFsbCBzaXplcworCisJbW92CWlwLCBzcAorCXN0bWRiCXNwISwge3I0LHI1LHI2LHI3LHI4LHI5LHIxMCwgbHJ9CisJVkZQX0FCSV9QVVNICisJbGRyCXI4LCBbaXBdCQkJQCBjdHIgaXMgMXN0IGFyZyBvbiB0aGUgc3RhY2sKKwlzdWIJc3AsIHNwLCAjMHgxMAkJCUAgc2NyYXRjaCBzcGFjZSB0byBjYXJyeSBvdmVyIHRoZSBjdHIKKwltb3YJcjksIHNwCQkJCUAgc2F2ZSBzcAorCisJbGRyCXIxMCwgW3IzLCAjMjQwXQkJQCBnZXQgIyBvZiByb3VuZHMKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCUAgYWxsb2NhdGUgdGhlIGtleSBzY2hlZHVsZSBvbiB0aGUgc3RhY2sKKwlzdWIJcjEyLCBzcCwgcjEwLCBsc2wjNwkJQCAxMjggYnl0ZXMgcGVyIGlubmVyIHJvdW5kIGtleQorCWFkZAlyMTIsICM5NgkJCUAgc2l6ZSBvZiBiaXQtc2xpY2VkIGtleSBzY2hlZHVsZQorCisJQCBwb3B1bGF0ZSB0aGUga2V5IHNjaGVkdWxlCisJbW92CXI0LCByMwkJCUAgcGFzcyBrZXkKKwltb3YJcjUsIHIxMAkJCUAgcGFzcyAjIG9mIHJvdW5kcworCW1vdglzcCwgcjEyCQkJCUAgc3AgaXMgc3AKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwl2ZW9yCXE3LHE3LHExNQlAIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCXZzdG1pYQlyMTIsIHtxN30JCQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKworCXZsZDEuOAl7cTB9LCBbcjhdCQlAIGxvYWQgY291bnRlcgorI2lmZGVmCV9fQVBQTEVfXworCW1vdglyOCwgIzpsb3dlcjE2OiguTFJFVk0wU1ItLkxNMCkKKwlhZGQJcjgsIHI2LCByOAorI2Vsc2UKKwlhZGQJcjgsIHI2LCAjLkxSRVZNMFNSLS5MTTAJQCBib3Jyb3cgcjgKKyNlbmRpZgorCXZsZG1pYQlzcCwge3E0fQkJQCBsb2FkIHJvdW5kMCBrZXkKKyNlbHNlCisJbGRyCXIxMiwgW3IzLCAjMjQ0XQorCWVvcnMJcjEyLCAjMQorCWJlcQkwZgorCisJQCBwb3B1bGF0ZSB0aGUga2V5IHNjaGVkdWxlCisJc3RyCXIxMiwgW3IzLCAjMjQ0XQorCW1vdglyNCwgcjMJCQlAIHBhc3Mga2V5CisJbW92CXI1LCByMTAJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwlhZGQJcjEyLCByMywgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKwlibAlfYnNhZXNfa2V5X2NvbnZlcnQKKwl2ZW9yCXE3LHE3LHExNQlAIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCXZzdG1pYQlyMTIsIHtxN30JCQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKworLmFsaWduCTIKKwlhZGQJcjEyLCByMywgIzI0OAorCXZsZDEuOAl7cTB9LCBbcjhdCQlAIGxvYWQgY291bnRlcgorCWFkcmwJcjgsIC5MUkVWTTBTUgkJCUAgYm9ycm93IHI4CisJdmxkbWlhCXIxMiwge3E0fQkJCUAgbG9hZCByb3VuZDAga2V5CisJc3ViCXNwLCAjMHgxMAkJCUAgcGxhY2UgZm9yIGFkanVzdGVkIHJvdW5kMCBrZXkKKyNlbmRpZgorCisJdm1vdi5pMzIJcTgsIzEJCUAgY29tcG9zZSAxPDw5NgorCXZlb3IJcTkscTkscTkKKwl2cmV2MzIuOAlxMCxxMAorCXZleHQuOAlxOCxxOSxxOCwjNAorCXZyZXYzMi44CXE0LHE0CisJdmFkZC51MzIJcTkscTgscTgJQCBjb21wb3NlIDI8PDk2CisJdnN0bWlhCXNwLCB7cTR9CQlAIHNhdmUgYWRqdXN0ZWQgcm91bmQwIGtleQorCWIJLkxjdHJfZW5jX2xvb3AKKworLmFsaWduCTQKKy5MY3RyX2VuY19sb29wOgorCXZhZGQudTMyCXExMCwgcTgsIHE5CUAgY29tcG9zZSAzPDw5NgorCXZhZGQudTMyCXExLCBxMCwgcTgJQCArMQorCXZhZGQudTMyCXEyLCBxMCwgcTkJQCArMgorCXZhZGQudTMyCXEzLCBxMCwgcTEwCUAgKzMKKwl2YWRkLnUzMglxNCwgcTEsIHExMAorCXZhZGQudTMyCXE1LCBxMiwgcTEwCisJdmFkZC51MzIJcTYsIHEzLCBxMTAKKwl2YWRkLnUzMglxNywgcTQsIHExMAorCXZhZGQudTMyCXExMCwgcTUsIHExMAlAIG5leHQgY291bnRlcgorCisJQCBCb3Jyb3cgcHJvbG9ndWUgZnJvbSBfYnNhZXNfZW5jcnlwdDggdG8gdXNlIHRoZSBvcHBvcnR1bml0eQorCUAgdG8gZmxpcCBieXRlIG9yZGVyIGluIDMyLWJpdCBjb3VudGVyCisKKwl2bGRtaWEJc3AsIHtxOX0JCUAgbG9hZCByb3VuZDAga2V5CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHgxMAkJQCBwYXNzIG5leHQgcm91bmQga2V5CisjZWxzZQorCWFkZAlyNCwgcjMsICMyNjQKKyNlbmRpZgorCXZsZG1pYQlyOCwge3E4fQkJCUAgLkxSRVZNMFNSCisJbW92CXI1LCByMTAJCQlAIHBhc3Mgcm91bmRzCisJdnN0bWlhCXI5LCB7cTEwfQkJCUAgc2F2ZSBuZXh0IGNvdW50ZXIKKyNpZmRlZglfX0FQUExFX18KKwltb3YJcjYsICM6bG93ZXIxNjooLkxSRVZNMFNSLS5MU1IpCisJc3ViCXI2LCByOCwgcjYKKyNlbHNlCisJc3ViCXI2LCByOCwgIy5MUkVWTTBTUi0uTFNSCUAgcGFzcyBjb25zdGFudHMKKyNlbmRpZgorCisJYmwJX2JzYWVzX2VuY3J5cHQ4X2FsdAorCisJc3VicwlyMiwgcjIsICM4CisJYmxvCS5MY3RyX2VuY19sb29wX2RvbmUKKworCXZsZDEuOAl7cTgscTl9LCBbcjBdIQlAIGxvYWQgaW5wdXQKKwl2bGQxLjgJe3ExMCxxMTF9LCBbcjBdIQorCXZlb3IJcTAsIHE4CisJdmVvcglxMSwgcTkKKwl2bGQxLjgJe3ExMixxMTN9LCBbcjBdIQorCXZlb3IJcTQsIHExMAorCXZlb3IJcTYsIHExMQorCXZsZDEuOAl7cTE0LHExNX0sIFtyMF0hCisJdmVvcglxMywgcTEyCisJdnN0MS44CXtxMCxxMX0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJdmVvcglxNywgcTEzCisJdmVvcglxMiwgcTE0CisJdnN0MS44CXtxNH0sIFtyMV0hCisJdmVvcglxNSwgcTE1CisJdnN0MS44CXtxNn0sIFtyMV0hCisJdm1vdi5pMzIJcTgsICMxCQkJQCBjb21wb3NlIDE8PDk2CisJdnN0MS44CXtxM30sIFtyMV0hCisJdmVvcglxOSwgcTksIHE5CisJdnN0MS44CXtxN30sIFtyMV0hCisJdmV4dC44CXE4LCBxOSwgcTgsICM0CisJdnN0MS44CXtxMn0sIFtyMV0hCisJdmFkZC51MzIJcTkscTgscTgJCUAgY29tcG9zZSAyPDw5NgorCXZzdDEuOAl7cTV9LCBbcjFdIQorCXZsZG1pYQlyOSwge3EwfQkJCUAgbG9hZCBjb3VudGVyCisKKwlibmUJLkxjdHJfZW5jX2xvb3AKKwliCS5MY3RyX2VuY19kb25lCisKKy5hbGlnbgk0CisuTGN0cl9lbmNfbG9vcF9kb25lOgorCWFkZAlyMiwgcjIsICM4CisJdmxkMS44CXtxOH0sIFtyMF0hCUAgbG9hZCBpbnB1dAorCXZlb3IJcTAsIHE4CisJdnN0MS44CXtxMH0sIFtyMV0hCUAgd3JpdGUgb3V0cHV0CisJY21wCXIyLCAjMgorCWJsbwkuTGN0cl9lbmNfZG9uZQorCXZsZDEuOAl7cTl9LCBbcjBdIQorCXZlb3IJcTEsIHE5CisJdnN0MS44CXtxMX0sIFtyMV0hCisJYmVxCS5MY3RyX2VuY19kb25lCisJdmxkMS44CXtxMTB9LCBbcjBdIQorCXZlb3IJcTQsIHExMAorCXZzdDEuOAl7cTR9LCBbcjFdIQorCWNtcAlyMiwgIzQKKwlibG8JLkxjdHJfZW5jX2RvbmUKKwl2bGQxLjgJe3ExMX0sIFtyMF0hCisJdmVvcglxNiwgcTExCisJdnN0MS44CXtxNn0sIFtyMV0hCisJYmVxCS5MY3RyX2VuY19kb25lCisJdmxkMS44CXtxMTJ9LCBbcjBdIQorCXZlb3IJcTMsIHExMgorCXZzdDEuOAl7cTN9LCBbcjFdIQorCWNtcAlyMiwgIzYKKwlibG8JLkxjdHJfZW5jX2RvbmUKKwl2bGQxLjgJe3ExM30sIFtyMF0hCisJdmVvcglxNywgcTEzCisJdnN0MS44CXtxN30sIFtyMV0hCisJYmVxCS5MY3RyX2VuY19kb25lCisJdmxkMS44CXtxMTR9LCBbcjBdCisJdmVvcglxMiwgcTE0CisJdnN0MS44CXtxMn0sIFtyMV0hCisKKy5MY3RyX2VuY19kb25lOgorCXZtb3YuaTMyCXEwLCAjMAorCXZtb3YuaTMyCXExLCAjMAorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisuTGN0cl9lbmNfYnplcm86QCB3aXBlIGtleSBzY2hlZHVsZSBbaWYgYW55XQorCXZzdG1pYQlzcCEsIHtxMCxxMX0KKwljbXAJc3AsIHI5CisJYm5lCS5MY3RyX2VuY19iemVybworI2Vsc2UKKwl2c3RtaWEJc3AsIHtxMCxxMX0KKyNlbmRpZgorCisJbW92CXNwLCByOQorCWFkZAlzcCwgIzB4MTAJCUAgYWRkIHNwLHI5LCMweDEwIGlzIG5vIGdvb2QgZm9yIHRodW1iCisJVkZQX0FCSV9QT1AKKwlsZG1pYQlzcCEsIHtyNCxyNSxyNixyNyxyOCxyOSxyMTAsIHBjfQlAIHJldHVybgorCisuYWxpZ24JNAorLkxjdHJfZW5jX3Nob3J0OgorCWxkcglpcCwgW3NwXQkJQCBjdHIgcG9pbnRlciBpcyBwYXNzZWQgb24gc3RhY2sKKwlzdG1kYglzcCEsIHtyNCxyNSxyNixyNyxyOCwgbHJ9CisKKwltb3YJcjQsIHIwCQlAIGNvcHkgYXJndW1lbnRzCisJbW92CXI1LCByMQorCW1vdglyNiwgcjIKKwltb3YJcjcsIHIzCisJbGRyCXI4LCBbaXAsICMxMl0JCUAgbG9hZCBjb3VudGVyIC5MU1cKKwl2bGQxLjgJe3ExfSwgW2lwXQkJQCBsb2FkIHdob2xlIGNvdW50ZXIgdmFsdWUKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjgsIHI4CisjZW5kaWYKKwlzdWIJc3AsIHNwLCAjMHgxMAorCXZzdDEuOAl7cTF9LCBbc3BdCQlAIGNvcHkgY291bnRlciB2YWx1ZQorCXN1YglzcCwgc3AsICMweDEwCisKKy5MY3RyX2VuY19zaG9ydF9sb29wOgorCWFkZAlyMCwgc3AsICMweDEwCQlAIGlucHV0IGNvdW50ZXIgdmFsdWUKKwltb3YJcjEsIHNwCQkJQCBvdXRwdXQgb24gdGhlIHN0YWNrCisJbW92CXIyLCByNwkJCUAga2V5CisKKwlibAlBRVNfZW5jcnlwdAorCisJdmxkMS44CXtxMH0sIFtyNF0hCUAgbG9hZCBpbnB1dAorCXZsZDEuOAl7cTF9LCBbc3BdCQlAIGxvYWQgZW5jcnlwdGVkIGNvdW50ZXIKKwlhZGQJcjgsIHI4LCAjMQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyMCwgcjgKKwlzdHIJcjAsIFtzcCwgIzB4MWNdCQlAIG5leHQgY291bnRlciB2YWx1ZQorI2Vsc2UKKwlzdHIJcjgsIFtzcCwgIzB4MWNdCQlAIG5leHQgY291bnRlciB2YWx1ZQorI2VuZGlmCisJdmVvcglxMCxxMCxxMQorCXZzdDEuOAl7cTB9LCBbcjVdIQlAIHN0b3JlIG91dHB1dAorCXN1YnMJcjYsIHI2LCAjMQorCWJuZQkuTGN0cl9lbmNfc2hvcnRfbG9vcAorCisJdm1vdi5pMzIJcTAsICMwCisJdm1vdi5pMzIJcTEsICMwCisJdnN0bWlhCXNwISwge3EwLHExfQorCisJbGRtaWEJc3AhLCB7cjQscjUscjYscjcscjgsIHBjfQorLnNpemUJYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3MsLi1ic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLmdsb2JsCWJzYWVzX3h0c19lbmNyeXB0CisuaGlkZGVuCWJzYWVzX3h0c19lbmNyeXB0CisudHlwZQlic2Flc194dHNfZW5jcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgk0Citic2Flc194dHNfZW5jcnlwdDoKKwltb3YJaXAsIHNwCisJc3RtZGIJc3AhLCB7cjQscjUscjYscjcscjgscjkscjEwLCBscn0JCUAgMHgyMAorCVZGUF9BQklfUFVTSAorCW1vdglyNiwgc3AJCQkJQCBmdXR1cmUgcjMKKworCW1vdglyNywgcjAKKwltb3YJcjgsIHIxCisJbW92CXI5LCByMgorCW1vdglyMTAsIHIzCisKKwlzdWIJcjAsIHNwLCAjMHgxMAkJCUAgMHgxMAorCWJpYwlyMCwgIzB4ZgkJCUAgYWxpZ24gYXQgMTYgYnl0ZXMKKwltb3YJc3AsIHIwCisKKyNpZmRlZglYVFNfQ0hBSU5fVFdFQUsKKwlsZHIJcjAsIFtpcF0JCQlAIHBvaW50ZXIgdG8gaW5wdXQgdHdlYWsKKyNlbHNlCisJQCBnZW5lcmF0ZSBpbml0aWFsIHR3ZWFrCisJbGRyCXIwLCBbaXAsICM0XQkJCUAgaXZbXQorCW1vdglyMSwgc3AKKwlsZHIJcjIsIFtpcCwgIzBdCQkJQCBrZXkyCisJYmwJQUVTX2VuY3J5cHQKKwltb3YJcjAsc3AJCQkJQCBwb2ludGVyIHRvIGluaXRpYWwgdHdlYWsKKyNlbmRpZgorCisJbGRyCXIxLCBbcjEwLCAjMjQwXQkJQCBnZXQgIyBvZiByb3VuZHMKKwltb3YJcjMsIHI2CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlAIGFsbG9jYXRlIHRoZSBrZXkgc2NoZWR1bGUgb24gdGhlIHN0YWNrCisJc3ViCXIxMiwgc3AsIHIxLCBsc2wjNwkJQCAxMjggYnl0ZXMgcGVyIGlubmVyIHJvdW5kIGtleQorCUAgYWRkCXIxMiwgIzk2CQkJQCBzaXplIG9mIGJpdC1zbGljZWQga2V5IHNjaGVkdWxlCisJc3ViCXIxMiwgIzQ4CQkJQCBwbGFjZSBmb3IgdHdlYWtbOV0KKworCUAgcG9wdWxhdGUgdGhlIGtleSBzY2hlZHVsZQorCW1vdglyNCwgcjEwCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwltb3YJc3AsIHIxMgorCWFkZAlyMTIsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorCWJsCV9ic2Flc19rZXlfY29udmVydAorCXZlb3IJcTcsIHE3LCBxMTUJQCBmaXggdXAgbGFzdCByb3VuZCBrZXkKKwl2c3RtaWEJcjEyLCB7cTd9CQkJQCBzYXZlIGxhc3Qgcm91bmQga2V5CisjZWxzZQorCWxkcglyMTIsIFtyMTAsICMyNDRdCisJZW9ycwlyMTIsICMxCisJYmVxCTBmCisKKwlzdHIJcjEyLCBbcjEwLCAjMjQ0XQorCW1vdglyNCwgcjEwCQkJQCBwYXNzIGtleQorCW1vdglyNSwgcjEJCQlAIHBhc3MgIyBvZiByb3VuZHMKKwlhZGQJcjEyLCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJdmVvcglxNywgcTcsIHExNQlAIGZpeCB1cCBsYXN0IHJvdW5kIGtleQorCXZzdG1pYQlyMTIsIHtxN30KKworLmFsaWduCTIKKwlzdWIJc3AsICMweDkwCQkJQCBwbGFjZSBmb3IgdHdlYWtbOV0KKyNlbmRpZgorCisJdmxkMS44CXtxOH0sIFtyMF0JCQlAIGluaXRpYWwgdHdlYWsKKwlhZHIJcjIsIC5MeHRzX21hZ2ljCisKKwlzdWJzCXI5LCAjMHg4MAorCWJsbwkuTHh0c19lbmNfc2hvcnQKKwliCS5MeHRzX2VuY19sb29wCisKKy5hbGlnbgk0CisuTHh0c19lbmNfbG9vcDoKKwl2bGRtaWEJcjIsIHtxNX0JQCBsb2FkIFhUUyBtYWdpYworCXZzaHIuczY0CXE2LCBxOCwgIzYzCisJbW92CXIwLCBzcAorCXZhbmQJcTYsIHE2LCBxNQorCXZhZGQudTY0CXE5LCBxOCwgcTgKKwl2c3QxLjY0CXtxOH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTksICM2MworCXZlb3IJcTksIHE5LCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZhZGQudTY0CXExMCwgcTksIHE5CisJdnN0MS42NAl7cTl9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExMCwgIzYzCisJdmVvcglxMTAsIHExMCwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3EwfSwgW3I3XSEKKwl2YWRkLnU2NAlxMTEsIHExMCwgcTEwCisJdnN0MS42NAl7cTEwfSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTEsICM2MworCXZlb3IJcTExLCBxMTEsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxMX0sIFtyN10hCisJdmVvcglxMCwgcTAsIHE4CisJdmFkZC51NjQJcTEyLCBxMTEsIHExMQorCXZzdDEuNjQJe3ExMX0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2c2hyLnM2NAlxNiwgcTEyLCAjNjMKKwl2ZW9yCXExMiwgcTEyLCBxNworCXZhbmQJcTYsIHE2LCBxNQorCXZsZDEuOAl7cTJ9LCBbcjddIQorCXZlb3IJcTEsIHExLCBxOQorCXZhZGQudTY0CXExMywgcTEyLCBxMTIKKwl2c3QxLjY0CXtxMTJ9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHExMywgIzYzCisJdmVvcglxMTMsIHExMywgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2bGQxLjgJe3EzfSwgW3I3XSEKKwl2ZW9yCXEyLCBxMiwgcTEwCisJdmFkZC51NjQJcTE0LCBxMTMsIHExMworCXZzdDEuNjQJe3ExM30sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2c2hyLnM2NAlxNiwgcTE0LCAjNjMKKwl2ZW9yCXExNCwgcTE0LCBxNworCXZhbmQJcTYsIHE2LCBxNQorCXZsZDEuOAl7cTR9LCBbcjddIQorCXZlb3IJcTMsIHEzLCBxMTEKKwl2YWRkLnU2NAlxMTUsIHExNCwgcTE0CisJdnN0MS42NAl7cTE0fSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTUsICM2MworCXZlb3IJcTE1LCBxMTUsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxNX0sIFtyN10hCisJdmVvcglxNCwgcTQsIHExMgorCXZhZGQudTY0CXE4LCBxMTUsIHExNQorCXZzdDEuNjQJe3ExNX0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2ZW9yCXE4LCBxOCwgcTcKKwl2c3QxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKwl2bGQxLjgJe3E2LHE3fSwgW3I3XSEKKwl2ZW9yCXE1LCBxNSwgcTEzCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXE2LCBxNiwgcTE0CisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwl2ZW9yCXE3LCBxNywgcTE1CisJbW92CXIwLCBzcAorCisJYmwJX2JzYWVzX2VuY3J5cHQ4CisKKwl2bGQxLjY0CXtxOCxxOX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CXtxMTAscTExfSwgW3IwLDoxMjhdIQorCXZlb3IJcTAsIHEwLCBxOAorCXZsZDEuNjQJe3ExMixxMTN9LCBbcjAsOjEyOF0hCisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTQsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZlb3IJcTksIHE2LCBxMTEKKwl2bGQxLjY0CXtxMTQscTE1fSwgW3IwLDoxMjhdIQorCXZlb3IJcTEwLCBxMywgcTEyCisJdnN0MS44CXtxOCxxOX0sIFtyOF0hCisJdmVvcglxMTEsIHE3LCBxMTMKKwl2ZW9yCXExMiwgcTIsIHExNAorCXZzdDEuOAl7cTEwLHExMX0sIFtyOF0hCisJdmVvcglxMTMsIHE1LCBxMTUKKwl2c3QxLjgJe3ExMixxMTN9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJc3VicwlyOSwgIzB4ODAKKwlicGwJLkx4dHNfZW5jX2xvb3AKKworLkx4dHNfZW5jX3Nob3J0OgorCWFkZHMJcjksICMweDcwCisJYm1pCS5MeHRzX2VuY19kb25lCisKKwl2bGRtaWEJcjIsIHtxNX0JQCBsb2FkIFhUUyBtYWdpYworCXZzaHIuczY0CXE3LCBxOCwgIzYzCisJbW92CXIwLCBzcAorCXZhbmQJcTcsIHE3LCBxNQorCXZhZGQudTY0CXE5LCBxOCwgcTgKKwl2c3QxLjY0CXtxOH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2c2hyLnM2NAlxNiwgcTksICM2MworCXZlb3IJcTksIHE5LCBxNworCXZhbmQJcTYsIHE2LCBxNQorCXZhZGQudTY0CXExMCwgcTksIHE5CisJdnN0MS42NAl7cTl9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHExMCwgIzYzCisJdmVvcglxMTAsIHExMCwgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2bGQxLjgJe3EwfSwgW3I3XSEKKwlzdWJzCXI5LCAjMHgxMAorCWJtaQkuTHh0c19lbmNfMQorCXZhZGQudTY0CXExMSwgcTEwLCBxMTAKKwl2c3QxLjY0CXtxMTB9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExMSwgIzYzCisJdmVvcglxMTEsIHExMSwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3ExfSwgW3I3XSEKKwlzdWJzCXI5LCAjMHgxMAorCWJtaQkuTHh0c19lbmNfMgorCXZlb3IJcTAsIHEwLCBxOAorCXZhZGQudTY0CXExMiwgcTExLCBxMTEKKwl2c3QxLjY0CXtxMTF9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHExMiwgIzYzCisJdmVvcglxMTIsIHExMiwgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2bGQxLjgJe3EyfSwgW3I3XSEKKwlzdWJzCXI5LCAjMHgxMAorCWJtaQkuTHh0c19lbmNfMworCXZlb3IJcTEsIHExLCBxOQorCXZhZGQudTY0CXExMywgcTEyLCBxMTIKKwl2c3QxLjY0CXtxMTJ9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExMywgIzYzCisJdmVvcglxMTMsIHExMywgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3EzfSwgW3I3XSEKKwlzdWJzCXI5LCAjMHgxMAorCWJtaQkuTHh0c19lbmNfNAorCXZlb3IJcTIsIHEyLCBxMTAKKwl2YWRkLnU2NAlxMTQsIHExMywgcTEzCisJdnN0MS42NAl7cTEzfSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTQsICM2MworCXZlb3IJcTE0LCBxMTQsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxNH0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJLkx4dHNfZW5jXzUKKwl2ZW9yCXEzLCBxMywgcTExCisJdmFkZC51NjQJcTE1LCBxMTQsIHExNAorCXZzdDEuNjQJe3ExNH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxNSxkMTQKKwl2c2hyLnM2NAlxNiwgcTE1LCAjNjMKKwl2ZW9yCXExNSwgcTE1LCBxNworCXZhbmQJcTYsIHE2LCBxNQorCXZsZDEuOAl7cTV9LCBbcjddIQorCXN1YnMJcjksICMweDEwCisJYm1pCS5MeHRzX2VuY182CisJdmVvcglxNCwgcTQsIHExMgorCXN1YglyOSwgIzB4MTAKKwl2c3QxLjY0CXtxMTV9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmxkMS44CXtxNn0sIFtyN10hCisJdmVvcglxNSwgcTUsIHExMworI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxNiwgcTYsIHExNAorCW1vdglyNSwgcjEJCQlAIHBhc3Mgcm91bmRzCisJbW92CXIwLCBzcAorCisJYmwJX2JzYWVzX2VuY3J5cHQ4CisKKwl2bGQxLjY0CXtxOCxxOX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CXtxMTAscTExfSwgW3IwLDoxMjhdIQorCXZlb3IJcTAsIHEwLCBxOAorCXZsZDEuNjQJe3ExMixxMTN9LCBbcjAsOjEyOF0hCisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTQsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZlb3IJcTksIHE2LCBxMTEKKwl2bGQxLjY0CXtxMTR9LCBbcjAsOjEyOF0hCisJdmVvcglxMTAsIHEzLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2ZW9yCXExMSwgcTcsIHExMworCXZlb3IJcTEyLCBxMiwgcTE0CisJdnN0MS44CXtxMTAscTExfSwgW3I4XSEKKwl2c3QxLjgJe3ExMn0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkuTHh0c19lbmNfZG9uZQorLmFsaWduCTQKKy5MeHRzX2VuY182OgorCXZlb3IJcTQsIHE0LCBxMTIKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTUsIHE1LCBxMTMKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE0LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNiwgcTExCisJdmVvcglxMTAsIHEzLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2ZW9yCXExMSwgcTcsIHExMworCXZzdDEuOAl7cTEwLHExMX0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkuTHh0c19lbmNfZG9uZQorCitAIHB1dCB0aGlzIGluIHJhbmdlIGZvciBib3RoIEFSTSBhbmQgVGh1bWIgbW9kZSBhZHIgaW5zdHJ1Y3Rpb25zCisuYWxpZ24JNQorLkx4dHNfbWFnaWM6CisucXVhZAkxLCAweDg3CisKKy5hbGlnbgk1CisuTHh0c19lbmNfNToKKwl2ZW9yCXEzLCBxMywgcTExCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXE0LCBxNCwgcTEyCisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZW5jcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmxkMS42NAl7cTEyfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE0LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNiwgcTExCisJdmVvcglxMTAsIHEzLCBxMTIKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKwl2c3QxLjgJe3ExMH0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkuTHh0c19lbmNfZG9uZQorLmFsaWduCTQKKy5MeHRzX2VuY180OgorCXZlb3IJcTIsIHEyLCBxMTAKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTMsIHEzLCBxMTEKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXExLCBxMSwgcTkKKwl2ZW9yCXE4LCBxNCwgcTEwCisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisJdmVvcglxOSwgcTYsIHExMQorCXZzdDEuOAl7cTgscTl9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgk0CisuTHh0c19lbmNfMzoKKwl2ZW9yCXExLCBxMSwgcTkKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTIsIHEyLCBxMTAKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwfSwgW3IwLDoxMjhdIQorCXZlb3IJcTAsIHEwLCBxOAorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE0LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2c3QxLjgJe3E4fSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCS5MeHRzX2VuY19kb25lCisuYWxpZ24JNAorLkx4dHNfZW5jXzI6CisJdmVvcglxMCwgcTAsIHE4CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXExLCBxMSwgcTkKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19lbmNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkuTHh0c19lbmNfZG9uZQorLmFsaWduCTQKKy5MeHRzX2VuY18xOgorCW1vdglyMCwgc3AKKwl2ZW9yCXEwLCBxMCwgcTgKKwltb3YJcjEsIHNwCisJdnN0MS44CXtxMH0sIFtzcCw6MTI4XQorCW1vdglyMiwgcjEwCisJbW92CXI0LCByMwkJCQlAIHByZXNlcnZlIGZwCisKKwlibAlBRVNfZW5jcnlwdAorCisJdmxkMS44CXtxMH0sIFtzcCw6MTI4XQorCXZlb3IJcTAsIHEwLCBxOAorCXZzdDEuOAl7cTB9LCBbcjhdIQorCW1vdglyMywgcjQKKworCXZtb3YJcTgsIHE5CQlAIG5leHQgcm91bmQgdHdlYWsKKworLkx4dHNfZW5jX2RvbmU6CisjaWZuZGVmCVhUU19DSEFJTl9UV0VBSworCWFkZHMJcjksICMweDEwCisJYmVxCS5MeHRzX2VuY19yZXQKKwlzdWIJcjYsIHI4LCAjMHgxMAorCisuTHh0c19lbmNfc3RlYWw6CisJbGRyYglyMCwgW3I3XSwgIzEKKwlsZHJiCXIxLCBbcjgsICMtMHgxMF0KKwlzdHJiCXIwLCBbcjgsICMtMHgxMF0KKwlzdHJiCXIxLCBbcjhdLCAjMQorCisJc3VicwlyOSwgIzEKKwliaGkJLkx4dHNfZW5jX3N0ZWFsCisKKwl2bGQxLjgJe3EwfSwgW3I2XQorCW1vdglyMCwgc3AKKwl2ZW9yCXEwLCBxMCwgcTgKKwltb3YJcjEsIHNwCisJdnN0MS44CXtxMH0sIFtzcCw6MTI4XQorCW1vdglyMiwgcjEwCisJbW92CXI0LCByMwkJCUAgcHJlc2VydmUgZnAKKworCWJsCUFFU19lbmNyeXB0CisKKwl2bGQxLjgJe3EwfSwgW3NwLDoxMjhdCisJdmVvcglxMCwgcTAsIHE4CisJdnN0MS44CXtxMH0sIFtyNl0KKwltb3YJcjMsIHI0CisjZW5kaWYKKworLkx4dHNfZW5jX3JldDoKKwliaWMJcjAsIHIzLCAjMHhmCisJdm1vdi5pMzIJcTAsICMwCisJdm1vdi5pMzIJcTEsICMwCisjaWZkZWYJWFRTX0NIQUlOX1RXRUFLCisJbGRyCXIxLCBbcjMsICMweDIwK1ZGUF9BQklfRlJBTUVdCUAgY2hhaW4gdHdlYWsKKyNlbmRpZgorLkx4dHNfZW5jX2J6ZXJvOkAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJc3AhLCB7cTAscTF9CisJY21wCXNwLCByMAorCWJuZQkuTHh0c19lbmNfYnplcm8KKworCW1vdglzcCwgcjMKKyNpZmRlZglYVFNfQ0hBSU5fVFdFQUsKKwl2c3QxLjgJe3E4fSwgW3IxXQorI2VuZGlmCisJVkZQX0FCSV9QT1AKKwlsZG1pYQlzcCEsIHtyNCxyNSxyNixyNyxyOCxyOSxyMTAsIHBjfQlAIHJldHVybgorCisuc2l6ZQlic2Flc194dHNfZW5jcnlwdCwuLWJzYWVzX3h0c19lbmNyeXB0CisKKy5nbG9ibAlic2Flc194dHNfZGVjcnlwdAorLmhpZGRlbglic2Flc194dHNfZGVjcnlwdAorLnR5cGUJYnNhZXNfeHRzX2RlY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNAorYnNhZXNfeHRzX2RlY3J5cHQ6CisJbW92CWlwLCBzcAorCXN0bWRiCXNwISwge3I0LHI1LHI2LHI3LHI4LHI5LHIxMCwgbHJ9CQlAIDB4MjAKKwlWRlBfQUJJX1BVU0gKKwltb3YJcjYsIHNwCQkJCUAgZnV0dXJlIHIzCisKKwltb3YJcjcsIHIwCisJbW92CXI4LCByMQorCW1vdglyOSwgcjIKKwltb3YJcjEwLCByMworCisJc3ViCXIwLCBzcCwgIzB4MTAJCQlAIDB4MTAKKwliaWMJcjAsICMweGYJCQlAIGFsaWduIGF0IDE2IGJ5dGVzCisJbW92CXNwLCByMAorCisjaWZkZWYJWFRTX0NIQUlOX1RXRUFLCisJbGRyCXIwLCBbaXBdCQkJQCBwb2ludGVyIHRvIGlucHV0IHR3ZWFrCisjZWxzZQorCUAgZ2VuZXJhdGUgaW5pdGlhbCB0d2VhaworCWxkcglyMCwgW2lwLCAjNF0JCQlAIGl2W10KKwltb3YJcjEsIHNwCisJbGRyCXIyLCBbaXAsICMwXQkJCUAga2V5MgorCWJsCUFFU19lbmNyeXB0CisJbW92CXIwLCBzcAkJCQlAIHBvaW50ZXIgdG8gaW5pdGlhbCB0d2VhaworI2VuZGlmCisKKwlsZHIJcjEsIFtyMTAsICMyNDBdCQlAIGdldCAjIG9mIHJvdW5kcworCW1vdglyMywgcjYKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCUAgYWxsb2NhdGUgdGhlIGtleSBzY2hlZHVsZSBvbiB0aGUgc3RhY2sKKwlzdWIJcjEyLCBzcCwgcjEsIGxzbCM3CQlAIDEyOCBieXRlcyBwZXIgaW5uZXIgcm91bmQga2V5CisJQCBhZGQJcjEyLCAjOTYJCQlAIHNpemUgb2YgYml0LXNsaWNlZCBrZXkgc2NoZWR1bGUKKwlzdWIJcjEyLCAjNDgJCQlAIHBsYWNlIGZvciB0d2Vha1s5XQorCisJQCBwb3B1bGF0ZSB0aGUga2V5IHNjaGVkdWxlCisJbW92CXI0LCByMTAJCQlAIHBhc3Mga2V5CisJbW92CXI1LCByMQkJCUAgcGFzcyAjIG9mIHJvdW5kcworCW1vdglzcCwgcjEyCisJYWRkCXIxMiwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisJYmwJX2JzYWVzX2tleV9jb252ZXJ0CisJYWRkCXI0LCBzcCwgIzB4OTAKKwl2bGRtaWEJcjQsIHtxNn0KKwl2c3RtaWEJcjEyLCAge3ExNX0JCUAgc2F2ZSBsYXN0IHJvdW5kIGtleQorCXZlb3IJcTcsIHE3LCBxNglAIGZpeCB1cCByb3VuZCAwIGtleQorCXZzdG1pYQlyNCwge3E3fQorI2Vsc2UKKwlsZHIJcjEyLCBbcjEwLCAjMjQ0XQorCWVvcnMJcjEyLCAjMQorCWJlcQkwZgorCisJc3RyCXIxMiwgW3IxMCwgIzI0NF0KKwltb3YJcjQsIHIxMAkJCUAgcGFzcyBrZXkKKwltb3YJcjUsIHIxCQkJQCBwYXNzICMgb2Ygcm91bmRzCisJYWRkCXIxMiwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorCWJsCV9ic2Flc19rZXlfY29udmVydAorCWFkZAlyNCwgcjEwLCAjMjQ4CisJdmxkbWlhCXI0LCB7cTZ9CisJdnN0bWlhCXIxMiwgIHtxMTV9CQlAIHNhdmUgbGFzdCByb3VuZCBrZXkKKwl2ZW9yCXE3LCBxNywgcTYJQCBmaXggdXAgcm91bmQgMCBrZXkKKwl2c3RtaWEJcjQsIHtxN30KKworLmFsaWduCTIKKwlzdWIJc3AsICMweDkwCQkJQCBwbGFjZSBmb3IgdHdlYWtbOV0KKyNlbmRpZgorCXZsZDEuOAl7cTh9LCBbcjBdCQkJQCBpbml0aWFsIHR3ZWFrCisJYWRyCXIyLCAuTHh0c19tYWdpYworCisjaWZuZGVmCVhUU19DSEFJTl9UV0VBSworCXRzdAlyOSwgIzB4ZgkJCUAgaWYgbm90IG11bHRpcGxlIG9mIDE2CisJaXQJbmUJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKwlzdWJuZQlyOSwgIzB4MTAJCQlAIHN1YnRyYWN0IGFub3RoZXIgMTYgYnl0ZXMKKyNlbmRpZgorCXN1YnMJcjksICMweDgwCisKKwlibG8JLkx4dHNfZGVjX3Nob3J0CisJYgkuTHh0c19kZWNfbG9vcAorCisuYWxpZ24JNAorLkx4dHNfZGVjX2xvb3A6CisJdmxkbWlhCXIyLCB7cTV9CUAgbG9hZCBYVFMgbWFnaWMKKwl2c2hyLnM2NAlxNiwgcTgsICM2MworCW1vdglyMCwgc3AKKwl2YW5kCXE2LCBxNiwgcTUKKwl2YWRkLnU2NAlxOSwgcTgsIHE4CisJdnN0MS42NAl7cTh9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTMsZDEyCisJdnNoci5zNjQJcTcsIHE5LCAjNjMKKwl2ZW9yCXE5LCBxOSwgcTYKKwl2YW5kCXE3LCBxNywgcTUKKwl2YWRkLnU2NAlxMTAsIHE5LCBxOQorCXZzdDEuNjQJe3E5fSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTAsICM2MworCXZlb3IJcTEwLCBxMTAsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxMH0sIFtyN10hCisJdmFkZC51NjQJcTExLCBxMTAsIHExMAorCXZzdDEuNjQJe3ExMH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTExLCAjNjMKKwl2ZW9yCXExMSwgcTExLCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTF9LCBbcjddIQorCXZlb3IJcTAsIHEwLCBxOAorCXZhZGQudTY0CXExMiwgcTExLCBxMTEKKwl2c3QxLjY0CXtxMTF9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExMiwgIzYzCisJdmVvcglxMTIsIHExMiwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3EyfSwgW3I3XSEKKwl2ZW9yCXExLCBxMSwgcTkKKwl2YWRkLnU2NAlxMTMsIHExMiwgcTEyCisJdnN0MS42NAl7cTEyfSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTMsICM2MworCXZlb3IJcTEzLCBxMTMsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxM30sIFtyN10hCisJdmVvcglxMiwgcTIsIHExMAorCXZhZGQudTY0CXExNCwgcTEzLCBxMTMKKwl2c3QxLjY0CXtxMTN9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExNCwgIzYzCisJdmVvcglxMTQsIHExNCwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3E0fSwgW3I3XSEKKwl2ZW9yCXEzLCBxMywgcTExCisJdmFkZC51NjQJcTE1LCBxMTQsIHExNAorCXZzdDEuNjQJe3ExNH0sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTE1LCAjNjMKKwl2ZW9yCXExNSwgcTE1LCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTV9LCBbcjddIQorCXZlb3IJcTQsIHE0LCBxMTIKKwl2YWRkLnU2NAlxOCwgcTE1LCBxMTUKKwl2c3QxLjY0CXtxMTV9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdmVvcglxOCwgcTgsIHE3CisJdnN0MS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmxkMS44CXtxNixxN30sIFtyN10hCisJdmVvcglxNSwgcTUsIHExMworI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxNiwgcTYsIHExNAorCW1vdglyNSwgcjEJCQlAIHBhc3Mgcm91bmRzCisJdmVvcglxNywgcTcsIHExNQorCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE2LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNCwgcTExCisJdmxkMS42NAl7cTE0LHExNX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXExMCwgcTIsIHExMgorCXZzdDEuOAl7cTgscTl9LCBbcjhdIQorCXZlb3IJcTExLCBxNywgcTEzCisJdmVvcglxMTIsIHEzLCBxMTQKKwl2c3QxLjgJe3ExMCxxMTF9LCBbcjhdIQorCXZlb3IJcTEzLCBxNSwgcTE1CisJdnN0MS44CXtxMTIscTEzfSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXN1YnMJcjksICMweDgwCisJYnBsCS5MeHRzX2RlY19sb29wCisKKy5MeHRzX2RlY19zaG9ydDoKKwlhZGRzCXI5LCAjMHg3MAorCWJtaQkuTHh0c19kZWNfZG9uZQorCisJdmxkbWlhCXIyLCB7cTV9CUAgbG9hZCBYVFMgbWFnaWMKKwl2c2hyLnM2NAlxNywgcTgsICM2MworCW1vdglyMCwgc3AKKwl2YW5kCXE3LCBxNywgcTUKKwl2YWRkLnU2NAlxOSwgcTgsIHE4CisJdnN0MS42NAl7cTh9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHE5LCAjNjMKKwl2ZW9yCXE5LCBxOSwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2YWRkLnU2NAlxMTAsIHE5LCBxOQorCXZzdDEuNjQJe3E5fSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTAsICM2MworCXZlb3IJcTEwLCBxMTAsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxMH0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJLkx4dHNfZGVjXzEKKwl2YWRkLnU2NAlxMTEsIHExMCwgcTEwCisJdnN0MS42NAl7cTEwfSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTEsICM2MworCXZlb3IJcTExLCBxMTEsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxMX0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJLkx4dHNfZGVjXzIKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2YWRkLnU2NAlxMTIsIHExMSwgcTExCisJdnN0MS42NAl7cTExfSwgW3IwLDoxMjhdIQorCXZzd3AJZDEzLGQxMgorCXZzaHIuczY0CXE3LCBxMTIsICM2MworCXZlb3IJcTEyLCBxMTIsIHE2CisJdmFuZAlxNywgcTcsIHE1CisJdmxkMS44CXtxMn0sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJLkx4dHNfZGVjXzMKKwl2ZW9yCXExLCBxMSwgcTkKKwl2YWRkLnU2NAlxMTMsIHExMiwgcTEyCisJdnN0MS42NAl7cTEyfSwgW3IwLDoxMjhdIQorCXZzd3AJZDE1LGQxNAorCXZzaHIuczY0CXE2LCBxMTMsICM2MworCXZlb3IJcTEzLCBxMTMsIHE3CisJdmFuZAlxNiwgcTYsIHE1CisJdmxkMS44CXtxM30sIFtyN10hCisJc3VicwlyOSwgIzB4MTAKKwlibWkJLkx4dHNfZGVjXzQKKwl2ZW9yCXEyLCBxMiwgcTEwCisJdmFkZC51NjQJcTE0LCBxMTMsIHExMworCXZzdDEuNjQJe3ExM30sIFtyMCw6MTI4XSEKKwl2c3dwCWQxMyxkMTIKKwl2c2hyLnM2NAlxNywgcTE0LCAjNjMKKwl2ZW9yCXExNCwgcTE0LCBxNgorCXZhbmQJcTcsIHE3LCBxNQorCXZsZDEuOAl7cTR9LCBbcjddIQorCXN1YnMJcjksICMweDEwCisJYm1pCS5MeHRzX2RlY181CisJdmVvcglxMywgcTMsIHExMQorCXZhZGQudTY0CXExNSwgcTE0LCBxMTQKKwl2c3QxLjY0CXtxMTR9LCBbcjAsOjEyOF0hCisJdnN3cAlkMTUsZDE0CisJdnNoci5zNjQJcTYsIHExNSwgIzYzCisJdmVvcglxMTUsIHExNSwgcTcKKwl2YW5kCXE2LCBxNiwgcTUKKwl2bGQxLjgJe3E1fSwgW3I3XSEKKwlzdWJzCXI5LCAjMHgxMAorCWJtaQkuTHh0c19kZWNfNgorCXZlb3IJcTQsIHE0LCBxMTIKKwlzdWIJcjksICMweDEwCisJdnN0MS42NAl7cTE1fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKworCXZsZDEuOAl7cTZ9LCBbcjddIQorCXZlb3IJcTUsIHE1LCBxMTMKKyNpZm5kZWYJQlNBRVNfQVNNX0VYVEVOREVEX0tFWQorCWFkZAlyNCwgc3AsICMweDkwCQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2Vsc2UKKwlhZGQJcjQsIHIxMCwgIzI0OAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbmRpZgorCXZlb3IJcTYsIHE2LCBxMTQKKwltb3YJcjUsIHIxCQkJQCBwYXNzIHJvdW5kcworCW1vdglyMCwgc3AKKworCWJsCV9ic2Flc19kZWNyeXB0OAorCisJdmxkMS42NAl7cTgscTl9LCBbcjAsOjEyOF0hCisJdmxkMS42NAl7cTEwLHExMX0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2bGQxLjY0CXtxMTIscTEzfSwgW3IwLDoxMjhdIQorCXZlb3IJcTEsIHExLCBxOQorCXZlb3IJcTgsIHE2LCBxMTAKKwl2c3QxLjgJe3EwLHExfSwgW3I4XSEKKwl2ZW9yCXE5LCBxNCwgcTExCisJdmxkMS42NAl7cTE0fSwgW3IwLDoxMjhdIQorCXZlb3IJcTEwLCBxMiwgcTEyCisJdnN0MS44CXtxOCxxOX0sIFtyOF0hCisJdmVvcglxMTEsIHE3LCBxMTMKKwl2ZW9yCXExMiwgcTMsIHExNAorCXZzdDEuOAl7cTEwLHExMX0sIFtyOF0hCisJdnN0MS44CXtxMTJ9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJLkx4dHNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTHh0c19kZWNfNjoKKwl2c3QxLjY0CXtxMTR9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCisJdmVvcglxNCwgcTQsIHExMgorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxNSwgcTUsIHExMworCW1vdglyNSwgcjEJCQlAIHBhc3Mgcm91bmRzCisJbW92CXIwLCBzcAorCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGQxLjY0CXtxOCxxOX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CXtxMTAscTExfSwgW3IwLDoxMjhdIQorCXZlb3IJcTAsIHEwLCBxOAorCXZsZDEuNjQJe3ExMixxMTN9LCBbcjAsOjEyOF0hCisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTYsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZlb3IJcTksIHE0LCBxMTEKKwl2ZW9yCXExMCwgcTIsIHExMgorCXZzdDEuOAl7cTgscTl9LCBbcjhdIQorCXZlb3IJcTExLCBxNywgcTEzCisJdnN0MS44CXtxMTAscTExfSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCS5MeHRzX2RlY19kb25lCisuYWxpZ24JNAorLkx4dHNfZGVjXzU6CisJdmVvcglxMywgcTMsIHExMQorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxNCwgcTQsIHExMgorCW1vdglyNSwgcjEJCQlAIHBhc3Mgcm91bmRzCisJbW92CXIwLCBzcAorCisJYmwJX2JzYWVzX2RlY3J5cHQ4CisKKwl2bGQxLjY0CXtxOCxxOX0sIFtyMCw6MTI4XSEKKwl2bGQxLjY0CXtxMTAscTExfSwgW3IwLDoxMjhdIQorCXZlb3IJcTAsIHEwLCBxOAorCXZsZDEuNjQJe3ExMn0sIFtyMCw6MTI4XSEKKwl2ZW9yCXExLCBxMSwgcTkKKwl2ZW9yCXE4LCBxNiwgcTEwCisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisJdmVvcglxOSwgcTQsIHExMQorCXZlb3IJcTEwLCBxMiwgcTEyCisJdnN0MS44CXtxOCxxOX0sIFtyOF0hCisJdnN0MS44CXtxMTB9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJLkx4dHNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTHh0c19kZWNfNDoKKwl2ZW9yCXEyLCBxMiwgcTEwCisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXEzLCBxMywgcTExCisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZGVjcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMCxxMTF9LCBbcjAsOjEyOF0hCisJdmVvcglxMCwgcTAsIHE4CisJdmVvcglxMSwgcTEsIHE5CisJdmVvcglxOCwgcTYsIHExMAorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCXZlb3IJcTksIHE0LCBxMTEKKwl2c3QxLjgJe3E4LHE5fSwgW3I4XSEKKworCXZsZDEuNjQJe3E4fSwgW3IwLDoxMjhdCQlAIG5leHQgcm91bmQgdHdlYWsKKwliCS5MeHRzX2RlY19kb25lCisuYWxpZ24JNAorLkx4dHNfZGVjXzM6CisJdmVvcglxMSwgcTEsIHE5CisjaWZuZGVmCUJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKKwlhZGQJcjQsIHNwLCAjMHg5MAkJCUAgcGFzcyBrZXkgc2NoZWR1bGUKKyNlbHNlCisJYWRkCXI0LCByMTAsICMyNDgJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZW5kaWYKKwl2ZW9yCXEyLCBxMiwgcTEwCisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZGVjcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZsZDEuNjQJe3ExMH0sIFtyMCw6MTI4XSEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXExLCBxMSwgcTkKKwl2ZW9yCXE4LCBxNiwgcTEwCisJdnN0MS44CXtxMCxxMX0sIFtyOF0hCisJdnN0MS44CXtxOH0sIFtyOF0hCisKKwl2bGQxLjY0CXtxOH0sIFtyMCw6MTI4XQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisJYgkuTHh0c19kZWNfZG9uZQorLmFsaWduCTQKKy5MeHRzX2RlY18yOgorCXZlb3IJcTAsIHEwLCBxOAorI2lmbmRlZglCU0FFU19BU01fRVhURU5ERURfS0VZCisJYWRkCXI0LCBzcCwgIzB4OTAJCQlAIHBhc3Mga2V5IHNjaGVkdWxlCisjZWxzZQorCWFkZAlyNCwgcjEwLCAjMjQ4CQkJQCBwYXNzIGtleSBzY2hlZHVsZQorI2VuZGlmCisJdmVvcglxMSwgcTEsIHE5CisJbW92CXI1LCByMQkJCUAgcGFzcyByb3VuZHMKKwltb3YJcjAsIHNwCisKKwlibAlfYnNhZXNfZGVjcnlwdDgKKworCXZsZDEuNjQJe3E4LHE5fSwgW3IwLDoxMjhdIQorCXZlb3IJcTAsIHEwLCBxOAorCXZlb3IJcTEsIHExLCBxOQorCXZzdDEuOAl7cTAscTF9LCBbcjhdIQorCisJdmxkMS42NAl7cTh9LCBbcjAsOjEyOF0JCUAgbmV4dCByb3VuZCB0d2VhaworCWIJLkx4dHNfZGVjX2RvbmUKKy5hbGlnbgk0CisuTHh0c19kZWNfMToKKwltb3YJcjAsIHNwCisJdmVvcglxMCwgcTAsIHE4CisJbW92CXIxLCBzcAorCXZzdDEuOAl7cTB9LCBbc3AsOjEyOF0KKwltb3YJcjUsIHIyCQkJQCBwcmVzZXJ2ZSBtYWdpYworCW1vdglyMiwgcjEwCisJbW92CXI0LCByMwkJCQlAIHByZXNlcnZlIGZwCisKKwlibAlBRVNfZGVjcnlwdAorCisJdmxkMS44CXtxMH0sIFtzcCw6MTI4XQorCXZlb3IJcTAsIHEwLCBxOAorCXZzdDEuOAl7cTB9LCBbcjhdIQorCW1vdglyMywgcjQKKwltb3YJcjIsIHI1CisKKwl2bW92CXE4LCBxOQkJQCBuZXh0IHJvdW5kIHR3ZWFrCisKKy5MeHRzX2RlY19kb25lOgorI2lmbmRlZglYVFNfQ0hBSU5fVFdFQUsKKwlhZGRzCXI5LCAjMHgxMAorCWJlcQkuTHh0c19kZWNfcmV0CisKKwlAIGNhbGN1bGF0ZSBvbmUgcm91bmQgb2YgZXh0cmEgdHdlYWsgZm9yIHRoZSBzdG9sZW4gY2lwaGVydGV4dAorCXZsZG1pYQlyMiwge3E1fQorCXZzaHIuczY0CXE2LCBxOCwgIzYzCisJdmFuZAlxNiwgcTYsIHE1CisJdmFkZC51NjQJcTksIHE4LCBxOAorCXZzd3AJZDEzLGQxMgorCXZlb3IJcTksIHE5LCBxNgorCisJQCBwZXJmb3JtIHRoZSBmaW5hbCBkZWNyeXB0aW9uIHdpdGggdGhlIGxhc3QgdHdlYWsgdmFsdWUKKwl2bGQxLjgJe3EwfSwgW3I3XSEKKwltb3YJcjAsIHNwCisJdmVvcglxMCwgcTAsIHE5CisJbW92CXIxLCBzcAorCXZzdDEuOAl7cTB9LCBbc3AsOjEyOF0KKwltb3YJcjIsIHIxMAorCW1vdglyNCwgcjMJCQlAIHByZXNlcnZlIGZwCisKKwlibAlBRVNfZGVjcnlwdAorCisJdmxkMS44CXtxMH0sIFtzcCw6MTI4XQorCXZlb3IJcTAsIHEwLCBxOQorCXZzdDEuOAl7cTB9LCBbcjhdCisKKwltb3YJcjYsIHI4CisuTHh0c19kZWNfc3RlYWw6CisJbGRyYglyMSwgW3I4XQorCWxkcmIJcjAsIFtyN10sICMxCisJc3RyYglyMSwgW3I4LCAjMHgxMF0KKwlzdHJiCXIwLCBbcjhdLCAjMQorCisJc3VicwlyOSwgIzEKKwliaGkJLkx4dHNfZGVjX3N0ZWFsCisKKwl2bGQxLjgJe3EwfSwgW3I2XQorCW1vdglyMCwgc3AKKwl2ZW9yCXEwLCBxOAorCW1vdglyMSwgc3AKKwl2c3QxLjgJe3EwfSwgW3NwLDoxMjhdCisJbW92CXIyLCByMTAKKworCWJsCUFFU19kZWNyeXB0CisKKwl2bGQxLjgJe3EwfSwgW3NwLDoxMjhdCisJdmVvcglxMCwgcTAsIHE4CisJdnN0MS44CXtxMH0sIFtyNl0KKwltb3YJcjMsIHI0CisjZW5kaWYKKworLkx4dHNfZGVjX3JldDoKKwliaWMJcjAsIHIzLCAjMHhmCisJdm1vdi5pMzIJcTAsICMwCisJdm1vdi5pMzIJcTEsICMwCisjaWZkZWYJWFRTX0NIQUlOX1RXRUFLCisJbGRyCXIxLCBbcjMsICMweDIwK1ZGUF9BQklfRlJBTUVdCUAgY2hhaW4gdHdlYWsKKyNlbmRpZgorLkx4dHNfZGVjX2J6ZXJvOkAgd2lwZSBrZXkgc2NoZWR1bGUgW2lmIGFueV0KKwl2c3RtaWEJc3AhLCB7cTAscTF9CisJY21wCXNwLCByMAorCWJuZQkuTHh0c19kZWNfYnplcm8KKworCW1vdglzcCwgcjMKKyNpZmRlZglYVFNfQ0hBSU5fVFdFQUsKKwl2c3QxLjgJe3E4fSwgW3IxXQorI2VuZGlmCisJVkZQX0FCSV9QT1AKKwlsZG1pYQlzcCEsIHtyNCxyNSxyNixyNyxyOCxyOSxyMTAsIHBjfQlAIHJldHVybgorCisuc2l6ZQlic2Flc194dHNfZGVjcnlwdCwuLWJzYWVzX3h0c19kZWNyeXB0CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gtYXJtdjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2doYXNoLWFybXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhZDk3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2doYXNoLWFybXY0LlMKQEAgLTAsMCArMSw1NzggQEAKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCitAIFNpbGVuY2UgQVJNdjggZGVwcmVjYXRlZCBJVCBpbnN0cnVjdGlvbiB3YXJuaW5ncy4gVGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aAorQCBBUk12NyBhbmQgQVJNdjggcHJvY2Vzc29ycyBhbmQgZG9lcyBub3QgdXNlIEFSTXY4IGluc3RydWN0aW9ucy4gKEFSTXY4IFBNVUxMCitAIGluc3RydWN0aW9ucyBhcmUgaW4gYWVzdjgtYXJteC5wbC4pCisuYXJjaAlhcm12Ny1hCisKKy50ZXh0CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKy5zeW50YXgJdW5pZmllZAorI2VuZGlmCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorLnRodW1iCisjZWxzZQorLmNvZGUJMzIKKyNlbmRpZgorCisjaWZkZWYgIF9fY2xhbmdfXworI2RlZmluZSBsZHJwbGIgIGxkcmJwbAorI2RlZmluZSBsZHJuZWIgIGxkcmJuZQorI2VuZGlmCisKKy50eXBlCXJlbV80Yml0LCVvYmplY3QKKy5hbGlnbgk1CityZW1fNGJpdDoKKy5zaG9ydAkweDAwMDAsMHgxQzIwLDB4Mzg0MCwweDI0NjAKKy5zaG9ydAkweDcwODAsMHg2Q0EwLDB4NDhDMCwweDU0RTAKKy5zaG9ydAkweEUxMDAsMHhGRDIwLDB4RDk0MCwweEM1NjAKKy5zaG9ydAkweDkxODAsMHg4REEwLDB4QTlDMCwweEI1RTAKKy5zaXplCXJlbV80Yml0LC4tcmVtXzRiaXQKKworLnR5cGUJcmVtXzRiaXRfZ2V0LCVmdW5jdGlvbgorcmVtXzRiaXRfZ2V0OgorI2lmIGRlZmluZWQoX190aHVtYjJfXykKKwlhZHIJcjIscmVtXzRiaXQKKyNlbHNlCisJc3ViCXIyLHBjLCM4KzMyCUAgJnJlbV80Yml0CisjZW5kaWYKKwliCS5McmVtXzRiaXRfZ290CisJbm9wCisJbm9wCisuc2l6ZQlyZW1fNGJpdF9nZXQsLi1yZW1fNGJpdF9nZXQKKworLmdsb2JsCWdjbV9naGFzaF80Yml0CisuaGlkZGVuCWdjbV9naGFzaF80Yml0CisudHlwZQlnY21fZ2hhc2hfNGJpdCwlZnVuY3Rpb24KKy5hbGlnbgk0CitnY21fZ2hhc2hfNGJpdDoKKyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pCisJYWRyCXIxMixyZW1fNGJpdAorI2Vsc2UKKwlzdWIJcjEyLHBjLCM4KzQ4CQlAICZyZW1fNGJpdAorI2VuZGlmCisJYWRkCXIzLHIyLHIzCQlAIHIzIHRvIHBvaW50IGF0IHRoZSBlbmQKKwlzdG1kYglzcCEse3IzLHI0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEsbHJ9CQlAIHNhdmUgcjMvZW5kIHRvbworCisJbGRtaWEJcjEyLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQkJQCBjb3B5IHJlbV80Yml0IC4uLgorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0JCUAgLi4uIHRvIHN0YWNrCisKKwlsZHJiCXIxMixbcjIsIzE1XQorCWxkcmIJcjE0LFtyMCwjMTVdCisuTG91dGVyOgorCWVvcglyMTIscjEyLHIxNAorCWFuZAlyMTQscjEyLCMweGYwCisJYW5kCXIxMixyMTIsIzB4MGYKKwltb3YJcjMsIzE0CisKKwlhZGQJcjcscjEscjEyLGxzbCM0CisJbGRtaWEJcjcse3I0LHI1LHI2LHI3fQlAIGxvYWQgSHRibFtubG9dCisJYWRkCXIxMSxyMSxyMTQKKwlsZHJiCXIxMixbcjIsIzE0XQorCisJYW5kCXIxNCxyNCwjMHhmCQlAIHJlbQorCWxkbWlhCXIxMSx7cjgscjkscjEwLHIxMX0JQCBsb2FkIEh0YmxbbmhpXQorCWFkZAlyMTQscjE0LHIxNAorCWVvcglyNCxyOCxyNCxsc3IjNAorCWxkcmgJcjgsW3NwLHIxNF0JCUAgcmVtXzRiaXRbcmVtXQorCWVvcglyNCxyNCxyNSxsc2wjMjgKKwlsZHJiCXIxNCxbcjAsIzE0XQorCWVvcglyNSxyOSxyNSxsc3IjNAorCWVvcglyNSxyNSxyNixsc2wjMjgKKwllb3IJcjYscjEwLHI2LGxzciM0CisJZW9yCXI2LHI2LHI3LGxzbCMyOAorCWVvcglyNyxyMTEscjcsbHNyIzQKKwllb3IJcjEyLHIxMixyMTQKKwlhbmQJcjE0LHIxMiwjMHhmMAorCWFuZAlyMTIscjEyLCMweDBmCisJZW9yCXI3LHI3LHI4LGxzbCMxNgorCisuTGlubmVyOgorCWFkZAlyMTEscjEscjEyLGxzbCM0CisJYW5kCXIxMixyNCwjMHhmCQlAIHJlbQorCXN1YnMJcjMscjMsIzEKKwlhZGQJcjEyLHIxMixyMTIKKwlsZG1pYQlyMTEse3I4LHI5LHIxMCxyMTF9CUAgbG9hZCBIdGJsW25sb10KKwllb3IJcjQscjgscjQsbHNyIzQKKwllb3IJcjQscjQscjUsbHNsIzI4CisJZW9yCXI1LHI5LHI1LGxzciM0CisJZW9yCXI1LHI1LHI2LGxzbCMyOAorCWxkcmgJcjgsW3NwLHIxMl0JCUAgcmVtXzRiaXRbcmVtXQorCWVvcglyNixyMTAscjYsbHNyIzQKKyNpZmRlZglfX3RodW1iMl9fCisJaXQJcGwKKyNlbmRpZgorCWxkcnBsYglyMTIsW3IyLHIzXQorCWVvcglyNixyNixyNyxsc2wjMjgKKwllb3IJcjcscjExLHI3LGxzciM0CisKKwlhZGQJcjExLHIxLHIxNAorCWFuZAlyMTQscjQsIzB4ZgkJQCByZW0KKwllb3IJcjcscjcscjgsbHNsIzE2CUAgXj0gcmVtXzRiaXRbcmVtXQorCWFkZAlyMTQscjE0LHIxNAorCWxkbWlhCXIxMSx7cjgscjkscjEwLHIxMX0JQCBsb2FkIEh0YmxbbmhpXQorCWVvcglyNCxyOCxyNCxsc3IjNAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdAlwbAorI2VuZGlmCisJbGRycGxiCXI4LFtyMCxyM10KKwllb3IJcjQscjQscjUsbHNsIzI4CisJZW9yCXI1LHI5LHI1LGxzciM0CisJbGRyaAlyOSxbc3AscjE0XQorCWVvcglyNSxyNSxyNixsc2wjMjgKKwllb3IJcjYscjEwLHI2LGxzciM0CisJZW9yCXI2LHI2LHI3LGxzbCMyOAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdAlwbAorI2VuZGlmCisJZW9ycGwJcjEyLHIxMixyOAorCWVvcglyNyxyMTEscjcsbHNyIzQKKyNpZmRlZglfX3RodW1iMl9fCisJaXR0CXBsCisjZW5kaWYKKwlhbmRwbAlyMTQscjEyLCMweGYwCisJYW5kcGwJcjEyLHIxMiwjMHgwZgorCWVvcglyNyxyNyxyOSxsc2wjMTYJQCBePSByZW1fNGJpdFtyZW1dCisJYnBsCS5MaW5uZXIKKworCWxkcglyMyxbc3AsIzMyXQkJQCByZS1sb2FkIHIzL2VuZAorCWFkZAlyMixyMiwjMTYKKwltb3YJcjE0LHI0CisjaWYgX19BUk1fQVJDSF9fPj03ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXJldglyNCxyNAorCXN0cglyNCxbcjAsIzEyXQorI2VsaWYgZGVmaW5lZChfX0FSTUVCX18pCisJc3RyCXI0LFtyMCwjMTJdCisjZWxzZQorCW1vdglyOSxyNCxsc3IjOAorCXN0cmIJcjQsW3IwLCMxMiszXQorCW1vdglyMTAscjQsbHNyIzE2CisJc3RyYglyOSxbcjAsIzEyKzJdCisJbW92CXIxMSxyNCxsc3IjMjQKKwlzdHJiCXIxMCxbcjAsIzEyKzFdCisJc3RyYglyMTEsW3IwLCMxMl0KKyNlbmRpZgorCWNtcAlyMixyMworI2lmIF9fQVJNX0FSQ0hfXz49NyAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwlyZXYJcjUscjUKKwlzdHIJcjUsW3IwLCM4XQorI2VsaWYgZGVmaW5lZChfX0FSTUVCX18pCisJc3RyCXI1LFtyMCwjOF0KKyNlbHNlCisJbW92CXI5LHI1LGxzciM4CisJc3RyYglyNSxbcjAsIzgrM10KKwltb3YJcjEwLHI1LGxzciMxNgorCXN0cmIJcjksW3IwLCM4KzJdCisJbW92CXIxMSxyNSxsc3IjMjQKKwlzdHJiCXIxMCxbcjAsIzgrMV0KKwlzdHJiCXIxMSxbcjAsIzhdCisjZW5kaWYKKworI2lmZGVmIF9fdGh1bWIyX18KKwlpdAluZQorI2VuZGlmCisJbGRybmViCXIxMixbcjIsIzE1XQorI2lmIF9fQVJNX0FSQ0hfXz49NyAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwlyZXYJcjYscjYKKwlzdHIJcjYsW3IwLCM0XQorI2VsaWYgZGVmaW5lZChfX0FSTUVCX18pCisJc3RyCXI2LFtyMCwjNF0KKyNlbHNlCisJbW92CXI5LHI2LGxzciM4CisJc3RyYglyNixbcjAsIzQrM10KKwltb3YJcjEwLHI2LGxzciMxNgorCXN0cmIJcjksW3IwLCM0KzJdCisJbW92CXIxMSxyNixsc3IjMjQKKwlzdHJiCXIxMCxbcjAsIzQrMV0KKwlzdHJiCXIxMSxbcjAsIzRdCisjZW5kaWYKKworI2lmIF9fQVJNX0FSQ0hfXz49NyAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwlyZXYJcjcscjcKKwlzdHIJcjcsW3IwLCMwXQorI2VsaWYgZGVmaW5lZChfX0FSTUVCX18pCisJc3RyCXI3LFtyMCwjMF0KKyNlbHNlCisJbW92CXI5LHI3LGxzciM4CisJc3RyYglyNyxbcjAsIzArM10KKwltb3YJcjEwLHI3LGxzciMxNgorCXN0cmIJcjksW3IwLCMwKzJdCisJbW92CXIxMSxyNyxsc3IjMjQKKwlzdHJiCXIxMCxbcjAsIzArMV0KKwlzdHJiCXIxMSxbcjAsIzBdCisjZW5kaWYKKworCWJuZQkuTG91dGVyCisKKwlhZGQJc3Asc3AsIzM2CisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisuc2l6ZQlnY21fZ2hhc2hfNGJpdCwuLWdjbV9naGFzaF80Yml0CisKKy5nbG9ibAlnY21fZ211bHRfNGJpdAorLmhpZGRlbglnY21fZ211bHRfNGJpdAorLnR5cGUJZ2NtX2dtdWx0XzRiaXQsJWZ1bmN0aW9uCitnY21fZ211bHRfNGJpdDoKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEsbHJ9CisJbGRyYglyMTIsW3IwLCMxNV0KKwliCXJlbV80Yml0X2dldAorLkxyZW1fNGJpdF9nb3Q6CisJYW5kCXIxNCxyMTIsIzB4ZjAKKwlhbmQJcjEyLHIxMiwjMHgwZgorCW1vdglyMywjMTQKKworCWFkZAlyNyxyMSxyMTIsbHNsIzQKKwlsZG1pYQlyNyx7cjQscjUscjYscjd9CUAgbG9hZCBIdGJsW25sb10KKwlsZHJiCXIxMixbcjAsIzE0XQorCisJYWRkCXIxMSxyMSxyMTQKKwlhbmQJcjE0LHI0LCMweGYJCUAgcmVtCisJbGRtaWEJcjExLHtyOCxyOSxyMTAscjExfQlAIGxvYWQgSHRibFtuaGldCisJYWRkCXIxNCxyMTQscjE0CisJZW9yCXI0LHI4LHI0LGxzciM0CisJbGRyaAlyOCxbcjIscjE0XQlAIHJlbV80Yml0W3JlbV0KKwllb3IJcjQscjQscjUsbHNsIzI4CisJZW9yCXI1LHI5LHI1LGxzciM0CisJZW9yCXI1LHI1LHI2LGxzbCMyOAorCWVvcglyNixyMTAscjYsbHNyIzQKKwllb3IJcjYscjYscjcsbHNsIzI4CisJZW9yCXI3LHIxMSxyNyxsc3IjNAorCWFuZAlyMTQscjEyLCMweGYwCisJZW9yCXI3LHI3LHI4LGxzbCMxNgorCWFuZAlyMTIscjEyLCMweDBmCisKKy5Mb29wOgorCWFkZAlyMTEscjEscjEyLGxzbCM0CisJYW5kCXIxMixyNCwjMHhmCQlAIHJlbQorCXN1YnMJcjMscjMsIzEKKwlhZGQJcjEyLHIxMixyMTIKKwlsZG1pYQlyMTEse3I4LHI5LHIxMCxyMTF9CUAgbG9hZCBIdGJsW25sb10KKwllb3IJcjQscjgscjQsbHNyIzQKKwllb3IJcjQscjQscjUsbHNsIzI4CisJZW9yCXI1LHI5LHI1LGxzciM0CisJZW9yCXI1LHI1LHI2LGxzbCMyOAorCWxkcmgJcjgsW3IyLHIxMl0JQCByZW1fNGJpdFtyZW1dCisJZW9yCXI2LHIxMCxyNixsc3IjNAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdAlwbAorI2VuZGlmCisJbGRycGxiCXIxMixbcjAscjNdCisJZW9yCXI2LHI2LHI3LGxzbCMyOAorCWVvcglyNyxyMTEscjcsbHNyIzQKKworCWFkZAlyMTEscjEscjE0CisJYW5kCXIxNCxyNCwjMHhmCQlAIHJlbQorCWVvcglyNyxyNyxyOCxsc2wjMTYJQCBePSByZW1fNGJpdFtyZW1dCisJYWRkCXIxNCxyMTQscjE0CisJbGRtaWEJcjExLHtyOCxyOSxyMTAscjExfQlAIGxvYWQgSHRibFtuaGldCisJZW9yCXI0LHI4LHI0LGxzciM0CisJZW9yCXI0LHI0LHI1LGxzbCMyOAorCWVvcglyNSxyOSxyNSxsc3IjNAorCWxkcmgJcjgsW3IyLHIxNF0JQCByZW1fNGJpdFtyZW1dCisJZW9yCXI1LHI1LHI2LGxzbCMyOAorCWVvcglyNixyMTAscjYsbHNyIzQKKwllb3IJcjYscjYscjcsbHNsIzI4CisJZW9yCXI3LHIxMSxyNyxsc3IjNAorI2lmZGVmCV9fdGh1bWIyX18KKwlpdHQJcGwKKyNlbmRpZgorCWFuZHBsCXIxNCxyMTIsIzB4ZjAKKwlhbmRwbAlyMTIscjEyLCMweDBmCisJZW9yCXI3LHI3LHI4LGxzbCMxNglAIF49IHJlbV80Yml0W3JlbV0KKwlicGwJLkxvb3AKKyNpZiBfX0FSTV9BUkNIX18+PTcgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJcmV2CXI0LHI0CisJc3RyCXI0LFtyMCwjMTJdCisjZWxpZiBkZWZpbmVkKF9fQVJNRUJfXykKKwlzdHIJcjQsW3IwLCMxMl0KKyNlbHNlCisJbW92CXI5LHI0LGxzciM4CisJc3RyYglyNCxbcjAsIzEyKzNdCisJbW92CXIxMCxyNCxsc3IjMTYKKwlzdHJiCXI5LFtyMCwjMTIrMl0KKwltb3YJcjExLHI0LGxzciMyNAorCXN0cmIJcjEwLFtyMCwjMTIrMV0KKwlzdHJiCXIxMSxbcjAsIzEyXQorI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18+PTcgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJcmV2CXI1LHI1CisJc3RyCXI1LFtyMCwjOF0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cglyNSxbcjAsIzhdCisjZWxzZQorCW1vdglyOSxyNSxsc3IjOAorCXN0cmIJcjUsW3IwLCM4KzNdCisJbW92CXIxMCxyNSxsc3IjMTYKKwlzdHJiCXI5LFtyMCwjOCsyXQorCW1vdglyMTEscjUsbHNyIzI0CisJc3RyYglyMTAsW3IwLCM4KzFdCisJc3RyYglyMTEsW3IwLCM4XQorI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18+PTcgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJcmV2CXI2LHI2CisJc3RyCXI2LFtyMCwjNF0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cglyNixbcjAsIzRdCisjZWxzZQorCW1vdglyOSxyNixsc3IjOAorCXN0cmIJcjYsW3IwLCM0KzNdCisJbW92CXIxMCxyNixsc3IjMTYKKwlzdHJiCXI5LFtyMCwjNCsyXQorCW1vdglyMTEscjYsbHNyIzI0CisJc3RyYglyMTAsW3IwLCM0KzFdCisJc3RyYglyMTEsW3IwLCM0XQorI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18+PTcgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJcmV2CXI3LHI3CisJc3RyCXI3LFtyMCwjMF0KKyNlbGlmIGRlZmluZWQoX19BUk1FQl9fKQorCXN0cglyNyxbcjAsIzBdCisjZWxzZQorCW1vdglyOSxyNyxsc3IjOAorCXN0cmIJcjcsW3IwLCMwKzNdCisJbW92CXIxMCxyNyxsc3IjMTYKKwlzdHJiCXI5LFtyMCwjMCsyXQorCW1vdglyMTEscjcsbHNyIzI0CisJc3RyYglyMTAsW3IwLCMwKzFdCisJc3RyYglyMTEsW3IwLCMwXQorI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscGN9CisjZWxzZQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0Cisud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5zaXplCWdjbV9nbXVsdF80Yml0LC4tZ2NtX2dtdWx0XzRiaXQKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisuYXJjaAlhcm12Ny1hCisuZnB1CW5lb24KKworLmdsb2JsCWdjbV9pbml0X25lb24KKy5oaWRkZW4JZ2NtX2luaXRfbmVvbgorLnR5cGUJZ2NtX2luaXRfbmVvbiwlZnVuY3Rpb24KKy5hbGlnbgk0CitnY21faW5pdF9uZW9uOgorCXZsZDEuNjQJZDcsW3IxXSEJCUAgbG9hZCBICisJdm1vdi5pOAlxOCwjMHhlMQorCXZsZDEuNjQJZDYsW3IxXQorCXZzaGwuaTY0CWQxNywjNTcKKwl2c2hyLnU2NAlkMTYsIzYzCQlAIHQwPTB4YzIuLi4uMDEKKwl2ZHVwLjgJcTksZDdbN10KKwl2c2hyLnU2NAlkMjYsZDYsIzYzCisJdnNoci5zOAlxOSwjNwkJCUAgYnJvYWRjYXN0IGNhcnJ5IGJpdAorCXZzaGwuaTY0CXEzLHEzLCMxCisJdmFuZAlxOCxxOCxxOQorCXZvcnIJZDcsZDI2CQlAIEg8PDw9MQorCXZlb3IJcTMscTMscTgJCUAgdHdpc3RlZCBICisJdnN0bWlhCXIwLHtxM30KKworCWJ4CWxyCQkJCQlAIGJ4IGxyCisuc2l6ZQlnY21faW5pdF9uZW9uLC4tZ2NtX2luaXRfbmVvbgorCisuZ2xvYmwJZ2NtX2dtdWx0X25lb24KKy5oaWRkZW4JZ2NtX2dtdWx0X25lb24KKy50eXBlCWdjbV9nbXVsdF9uZW9uLCVmdW5jdGlvbgorLmFsaWduCTQKK2djbV9nbXVsdF9uZW9uOgorCXZsZDEuNjQJZDcsW3IwXSEJCUAgbG9hZCBYaQorCXZsZDEuNjQJZDYsW3IwXSEKKwl2bW92Lmk2NAlkMjksIzB4MDAwMGZmZmZmZmZmZmZmZgorCXZsZG1pYQlyMSx7ZDI2LGQyN30JQCBsb2FkIHR3aXN0ZWQgSAorCXZtb3YuaTY0CWQzMCwjMHgwMDAwMDAwMGZmZmZmZmZmCisjaWZkZWYgX19BUk1FTF9fCisJdnJldjY0LjgJcTMscTMKKyNlbmRpZgorCXZtb3YuaTY0CWQzMSwjMHgwMDAwMDAwMDAwMDBmZmZmCisJdmVvcglkMjgsZDI2LGQyNwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwltb3YJcjMsIzE2CisJYgkuTGdtdWx0X25lb24KKy5zaXplCWdjbV9nbXVsdF9uZW9uLC4tZ2NtX2dtdWx0X25lb24KKworLmdsb2JsCWdjbV9naGFzaF9uZW9uCisuaGlkZGVuCWdjbV9naGFzaF9uZW9uCisudHlwZQlnY21fZ2hhc2hfbmVvbiwlZnVuY3Rpb24KKy5hbGlnbgk0CitnY21fZ2hhc2hfbmVvbjoKKwl2bGQxLjY0CWQxLFtyMF0hCQlAIGxvYWQgWGkKKwl2bGQxLjY0CWQwLFtyMF0hCisJdm1vdi5pNjQJZDI5LCMweDAwMDBmZmZmZmZmZmZmZmYKKwl2bGRtaWEJcjEse2QyNixkMjd9CUAgbG9hZCB0d2lzdGVkIEgKKwl2bW92Lmk2NAlkMzAsIzB4MDAwMDAwMDBmZmZmZmZmZgorI2lmZGVmIF9fQVJNRUxfXworCXZyZXY2NC44CXEwLHEwCisjZW5kaWYKKwl2bW92Lmk2NAlkMzEsIzB4MDAwMDAwMDAwMDAwZmZmZgorCXZlb3IJZDI4LGQyNixkMjcJCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisKKy5Mb29wX25lb246CisJdmxkMS42NAlkNyxbcjJdIQkJQCBsb2FkIGlucAorCXZsZDEuNjQJZDYsW3IyXSEKKyNpZmRlZiBfX0FSTUVMX18KKwl2cmV2NjQuOAlxMyxxMworI2VuZGlmCisJdmVvcglxMyxxMAkJCUAgaW5wXj1YaQorLkxnbXVsdF9uZW9uOgorCXZleHQuOAlkMTYsIGQyNiwgZDI2LCAjMQlAIEExCisJdm11bGwucDgJcTgsIGQxNiwgZDYJCUAgRiA9IEExKkIKKwl2ZXh0LjgJZDAsIGQ2LCBkNiwgIzEJQCBCMQorCXZtdWxsLnA4CXEwLCBkMjYsIGQwCQlAIEUgPSBBKkIxCisJdmV4dC44CWQxOCwgZDI2LCBkMjYsICMyCUAgQTIKKwl2bXVsbC5wOAlxOSwgZDE4LCBkNgkJQCBIID0gQTIqQgorCXZleHQuOAlkMjIsIGQ2LCBkNiwgIzIJQCBCMgorCXZtdWxsLnA4CXExMSwgZDI2LCBkMjIJCUAgRyA9IEEqQjIKKwl2ZXh0LjgJZDIwLCBkMjYsIGQyNiwgIzMJQCBBMworCXZlb3IJcTgsIHE4LCBxMAkJQCBMID0gRSArIEYKKwl2bXVsbC5wOAlxMTAsIGQyMCwgZDYJCUAgSiA9IEEzKkIKKwl2ZXh0LjgJZDAsIGQ2LCBkNiwgIzMJQCBCMworCXZlb3IJcTksIHE5LCBxMTEJCUAgTSA9IEcgKyBICisJdm11bGwucDgJcTAsIGQyNiwgZDAJCUAgSSA9IEEqQjMKKwl2ZW9yCWQxNiwgZDE2LCBkMTcJQCB0MCA9IChMKSAoUDAgKyBQMSkgPDwgOAorCXZhbmQJZDE3LCBkMTcsIGQyOQorCXZleHQuOAlkMjIsIGQ2LCBkNiwgIzQJQCBCNAorCXZlb3IJZDE4LCBkMTgsIGQxOQlAIHQxID0gKE0pIChQMiArIFAzKSA8PCAxNgorCXZhbmQJZDE5LCBkMTksIGQzMAorCXZtdWxsLnA4CXExMSwgZDI2LCBkMjIJCUAgSyA9IEEqQjQKKwl2ZW9yCXExMCwgcTEwLCBxMAkJQCBOID0gSSArIEoKKwl2ZW9yCWQxNiwgZDE2LCBkMTcKKwl2ZW9yCWQxOCwgZDE4LCBkMTkKKwl2ZW9yCWQyMCwgZDIwLCBkMjEJQCB0MiA9IChOKSAoUDQgKyBQNSkgPDwgMjQKKwl2YW5kCWQyMSwgZDIxLCBkMzEKKwl2ZXh0LjgJcTgsIHE4LCBxOCwgIzE1CisJdmVvcglkMjIsIGQyMiwgZDIzCUAgdDMgPSAoSykgKFA2ICsgUDcpIDw8IDMyCisJdm1vdi5pNjQJZDIzLCAjMAorCXZleHQuOAlxOSwgcTksIHE5LCAjMTQKKwl2ZW9yCWQyMCwgZDIwLCBkMjEKKwl2bXVsbC5wOAlxMCwgZDI2LCBkNgkJQCBEID0gQSpCCisJdmV4dC44CXExMSwgcTExLCBxMTEsICMxMgorCXZleHQuOAlxMTAsIHExMCwgcTEwLCAjMTMKKwl2ZW9yCXE4LCBxOCwgcTkKKwl2ZW9yCXExMCwgcTEwLCBxMTEKKwl2ZW9yCXEwLCBxMCwgcTgKKwl2ZW9yCXEwLCBxMCwgcTEwCisJdmVvcglkNixkNixkNwlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZworCXZleHQuOAlkMTYsIGQyOCwgZDI4LCAjMQlAIEExCisJdm11bGwucDgJcTgsIGQxNiwgZDYJCUAgRiA9IEExKkIKKwl2ZXh0LjgJZDIsIGQ2LCBkNiwgIzEJQCBCMQorCXZtdWxsLnA4CXExLCBkMjgsIGQyCQlAIEUgPSBBKkIxCisJdmV4dC44CWQxOCwgZDI4LCBkMjgsICMyCUAgQTIKKwl2bXVsbC5wOAlxOSwgZDE4LCBkNgkJQCBIID0gQTIqQgorCXZleHQuOAlkMjIsIGQ2LCBkNiwgIzIJQCBCMgorCXZtdWxsLnA4CXExMSwgZDI4LCBkMjIJCUAgRyA9IEEqQjIKKwl2ZXh0LjgJZDIwLCBkMjgsIGQyOCwgIzMJQCBBMworCXZlb3IJcTgsIHE4LCBxMQkJQCBMID0gRSArIEYKKwl2bXVsbC5wOAlxMTAsIGQyMCwgZDYJCUAgSiA9IEEzKkIKKwl2ZXh0LjgJZDIsIGQ2LCBkNiwgIzMJQCBCMworCXZlb3IJcTksIHE5LCBxMTEJCUAgTSA9IEcgKyBICisJdm11bGwucDgJcTEsIGQyOCwgZDIJCUAgSSA9IEEqQjMKKwl2ZW9yCWQxNiwgZDE2LCBkMTcJQCB0MCA9IChMKSAoUDAgKyBQMSkgPDwgOAorCXZhbmQJZDE3LCBkMTcsIGQyOQorCXZleHQuOAlkMjIsIGQ2LCBkNiwgIzQJQCBCNAorCXZlb3IJZDE4LCBkMTgsIGQxOQlAIHQxID0gKE0pIChQMiArIFAzKSA8PCAxNgorCXZhbmQJZDE5LCBkMTksIGQzMAorCXZtdWxsLnA4CXExMSwgZDI4LCBkMjIJCUAgSyA9IEEqQjQKKwl2ZW9yCXExMCwgcTEwLCBxMQkJQCBOID0gSSArIEoKKwl2ZW9yCWQxNiwgZDE2LCBkMTcKKwl2ZW9yCWQxOCwgZDE4LCBkMTkKKwl2ZW9yCWQyMCwgZDIwLCBkMjEJQCB0MiA9IChOKSAoUDQgKyBQNSkgPDwgMjQKKwl2YW5kCWQyMSwgZDIxLCBkMzEKKwl2ZXh0LjgJcTgsIHE4LCBxOCwgIzE1CisJdmVvcglkMjIsIGQyMiwgZDIzCUAgdDMgPSAoSykgKFA2ICsgUDcpIDw8IDMyCisJdm1vdi5pNjQJZDIzLCAjMAorCXZleHQuOAlxOSwgcTksIHE5LCAjMTQKKwl2ZW9yCWQyMCwgZDIwLCBkMjEKKwl2bXVsbC5wOAlxMSwgZDI4LCBkNgkJQCBEID0gQSpCCisJdmV4dC44CXExMSwgcTExLCBxMTEsICMxMgorCXZleHQuOAlxMTAsIHExMCwgcTEwLCAjMTMKKwl2ZW9yCXE4LCBxOCwgcTkKKwl2ZW9yCXExMCwgcTEwLCBxMTEKKwl2ZW9yCXExLCBxMSwgcTgKKwl2ZW9yCXExLCBxMSwgcTEwCisJdmV4dC44CWQxNiwgZDI3LCBkMjcsICMxCUAgQTEKKwl2bXVsbC5wOAlxOCwgZDE2LCBkNwkJQCBGID0gQTEqQgorCXZleHQuOAlkNCwgZDcsIGQ3LCAjMQlAIEIxCisJdm11bGwucDgJcTIsIGQyNywgZDQJCUAgRSA9IEEqQjEKKwl2ZXh0LjgJZDE4LCBkMjcsIGQyNywgIzIJQCBBMgorCXZtdWxsLnA4CXE5LCBkMTgsIGQ3CQlAIEggPSBBMipCCisJdmV4dC44CWQyMiwgZDcsIGQ3LCAjMglAIEIyCisJdm11bGwucDgJcTExLCBkMjcsIGQyMgkJQCBHID0gQSpCMgorCXZleHQuOAlkMjAsIGQyNywgZDI3LCAjMwlAIEEzCisJdmVvcglxOCwgcTgsIHEyCQlAIEwgPSBFICsgRgorCXZtdWxsLnA4CXExMCwgZDIwLCBkNwkJQCBKID0gQTMqQgorCXZleHQuOAlkNCwgZDcsIGQ3LCAjMwlAIEIzCisJdmVvcglxOSwgcTksIHExMQkJQCBNID0gRyArIEgKKwl2bXVsbC5wOAlxMiwgZDI3LCBkNAkJQCBJID0gQSpCMworCXZlb3IJZDE2LCBkMTYsIGQxNwlAIHQwID0gKEwpIChQMCArIFAxKSA8PCA4CisJdmFuZAlkMTcsIGQxNywgZDI5CisJdmV4dC44CWQyMiwgZDcsIGQ3LCAjNAlAIEI0CisJdmVvcglkMTgsIGQxOCwgZDE5CUAgdDEgPSAoTSkgKFAyICsgUDMpIDw8IDE2CisJdmFuZAlkMTksIGQxOSwgZDMwCisJdm11bGwucDgJcTExLCBkMjcsIGQyMgkJQCBLID0gQSpCNAorCXZlb3IJcTEwLCBxMTAsIHEyCQlAIE4gPSBJICsgSgorCXZlb3IJZDE2LCBkMTYsIGQxNworCXZlb3IJZDE4LCBkMTgsIGQxOQorCXZlb3IJZDIwLCBkMjAsIGQyMQlAIHQyID0gKE4pIChQNCArIFA1KSA8PCAyNAorCXZhbmQJZDIxLCBkMjEsIGQzMQorCXZleHQuOAlxOCwgcTgsIHE4LCAjMTUKKwl2ZW9yCWQyMiwgZDIyLCBkMjMJQCB0MyA9IChLKSAoUDYgKyBQNykgPDwgMzIKKwl2bW92Lmk2NAlkMjMsICMwCisJdmV4dC44CXE5LCBxOSwgcTksICMxNAorCXZlb3IJZDIwLCBkMjAsIGQyMQorCXZtdWxsLnA4CXEyLCBkMjcsIGQ3CQlAIEQgPSBBKkIKKwl2ZXh0LjgJcTExLCBxMTEsIHExMSwgIzEyCisJdmV4dC44CXExMCwgcTEwLCBxMTAsICMxMworCXZlb3IJcTgsIHE4LCBxOQorCXZlb3IJcTEwLCBxMTAsIHExMQorCXZlb3IJcTIsIHEyLCBxOAorCXZlb3IJcTIsIHEyLCBxMTAKKwl2ZW9yCXExLHExLHEwCQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwl2ZW9yCXExLHExLHEyCisJdmVvcglkMSxkMSxkMgorCXZlb3IJZDQsZDQsZDMJQCBYaHxYbCAtIDI1Ni1iaXQgcmVzdWx0CisKKwlAIGVxdWl2YWxlbnQgb2YgcmVkdWN0aW9uX2F2eCBmcm9tIGdoYXNoLXg4Nl82NC5wbAorCXZzaGwuaTY0CXE5LHEwLCM1NwkJQCAxc3QgcGhhc2UKKwl2c2hsLmk2NAlxMTAscTAsIzYyCisJdmVvcglxMTAscTEwLHE5CQlACisJdnNobC5pNjQJcTkscTAsIzYzCisJdmVvcglxMTAsIHExMCwgcTkJCUAKKwl2ZW9yCWQxLGQxLGQyMAlACisJdmVvcglkNCxkNCxkMjEKKworCXZzaHIudTY0CXExMCxxMCwjMQkJQCAybmQgcGhhc2UKKwl2ZW9yCXEyLHEyLHEwCisJdmVvcglxMCxxMCxxMTAJCUAKKwl2c2hyLnU2NAlxMTAscTEwLCM2CisJdnNoci51NjQJcTAscTAsIzEJCUAKKwl2ZW9yCXEwLHEwLHEyCQlACisJdmVvcglxMCxxMCxxMTAJCUAKKworCXN1YnMJcjMsIzE2CisJYm5lCS5Mb29wX25lb24KKworI2lmZGVmIF9fQVJNRUxfXworCXZyZXY2NC44CXEwLHEwCisjZW5kaWYKKwlzdWIJcjAsIzE2CisJdnN0MS42NAlkMSxbcjBdIQkJQCB3cml0ZSBvdXQgWGkKKwl2c3QxLjY0CWQwLFtyMF0KKworCWJ4CWxyCQkJCQlAIGJ4IGxyCisuc2l6ZQlnY21fZ2hhc2hfbmVvbiwuLWdjbV9naGFzaF9uZW9uCisjZW5kaWYKKy5ieXRlCTcxLDcyLDY1LDgzLDcyLDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Miw0Nyw3OCw2OSw3OSw3OCw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMgorLmFsaWduCTIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2h2OC1hcm14MzIuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2doYXNodjgtYXJteDMyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzNzdjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL2doYXNodjgtYXJteDMyLlMKQEAgLTAsMCArMSwyMzcgQEAKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisudGV4dAorLmZwdQluZW9uCisuY29kZQkzMgorI3VuZGVmCV9fdGh1bWIyX18KKy5nbG9ibAlnY21faW5pdF92OAorLmhpZGRlbglnY21faW5pdF92OAorLnR5cGUJZ2NtX2luaXRfdjgsJWZ1bmN0aW9uCisuYWxpZ24JNAorZ2NtX2luaXRfdjg6CisJdmxkMS42NAl7cTl9LFtyMV0JCUAgbG9hZCBpbnB1dCBICisJdm1vdi5pOAlxMTEsIzB4ZTEKKwl2c2hsLmk2NAlxMTEscTExLCM1NwkJQCAweGMyLjAKKwl2ZXh0LjgJcTMscTkscTksIzgKKwl2c2hyLnU2NAlxMTAscTExLCM2MworCXZkdXAuMzIJcTksZDE4WzFdCisJdmV4dC44CXE4LHExMCxxMTEsIzgJCUAgdDA9MHhjMi4uLi4wMQorCXZzaHIudTY0CXExMCxxMywjNjMKKwl2c2hyLnMzMglxOSxxOSwjMzEJCUAgYnJvYWRjYXN0IGNhcnJ5IGJpdAorCXZhbmQJcTEwLHExMCxxOAorCXZzaGwuaTY0CXEzLHEzLCMxCisJdmV4dC44CXExMCxxMTAscTEwLCM4CisJdmFuZAlxOCxxOCxxOQorCXZvcnIJcTMscTMscTEwCQlAIEg8PDw9MQorCXZlb3IJcTEyLHEzLHE4CQlAIHR3aXN0ZWQgSAorCXZzdDEuNjQJe3ExMn0sW3IwXSEJCUAgc3RvcmUgSHRhYmxlWzBdCisKKwlAIGNhbGN1bGF0ZSBIXjIKKwl2ZXh0LjgJcTgscTEyLHExMiwjOAkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKy5ieXRlCTB4YTgsMHgwZSwweGE4LDB4ZjIJQCBwbXVsbCBxMCxxMTIscTEyCisJdmVvcglxOCxxOCxxMTIKKy5ieXRlCTB4YTksMHg0ZSwweGE5LDB4ZjIJQCBwbXVsbDIgcTIscTEyLHExMgorLmJ5dGUJMHhhMCwweDJlLDB4YTAsMHhmMglAIHBtdWxsIHExLHE4LHE4CisKKwl2ZXh0LjgJcTkscTAscTIsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCXZlb3IJcTEwLHEwLHEyCisJdmVvcglxMSxxMSxxOQorCXZlb3IJcTEscTEscTEwCisuYnl0ZQkweDI2LDB4NGUsMHhlMCwweGYyCUAgcG11bGwgcTEwLHEwLHExMQkJQCAxc3QgcGhhc2UKKworCXZtb3YJZDQsZDMJCUAgWGh8WG0gLSAyNTYtYml0IHJlc3VsdAorCXZtb3YJZDMsZDAJCUAgWG0gaXMgcm90YXRlZCBYbAorCXZlb3IJcTAscTEscTEwCisKKwl2ZXh0LjgJcTEwLHEwLHEwLCM4CQlAIDJuZCBwaGFzZQorLmJ5dGUJMHgyNiwweDBlLDB4YTAsMHhmMglAIHBtdWxsIHEwLHEwLHExMQorCXZlb3IJcTEwLHExMCxxMgorCXZlb3IJcTE0LHEwLHExMAorCisJdmV4dC44CXE5LHExNCxxMTQsIzgJCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCisJdmVvcglxOSxxOSxxMTQKKwl2ZXh0LjgJcTEzLHE4LHE5LCM4CQlAIHBhY2sgS2FyYXRzdWJhIHByZS1wcm9jZXNzZWQKKwl2c3QxLjY0CXtxMTMscTE0fSxbcjBdCQlAIHN0b3JlIEh0YWJsZVsxLi4yXQorCisJYngJbHIKKy5zaXplCWdjbV9pbml0X3Y4LC4tZ2NtX2luaXRfdjgKKy5nbG9ibAlnY21fZ211bHRfdjgKKy5oaWRkZW4JZ2NtX2dtdWx0X3Y4CisudHlwZQlnY21fZ211bHRfdjgsJWZ1bmN0aW9uCisuYWxpZ24JNAorZ2NtX2dtdWx0X3Y4OgorCXZsZDEuNjQJe3E5fSxbcjBdCQlAIGxvYWQgWGkKKwl2bW92Lmk4CXExMSwjMHhlMQorCXZsZDEuNjQJe3ExMixxMTN9LFtyMV0JQCBsb2FkIHR3aXN0ZWQgSCwgLi4uCisJdnNobC51NjQJcTExLHExMSwjNTcKKyNpZm5kZWYgX19BUk1FQl9fCisJdnJldjY0LjgJcTkscTkKKyNlbmRpZgorCXZleHQuOAlxMyxxOSxxOSwjOAorCisuYnl0ZQkweDg2LDB4MGUsMHhhOCwweGYyCUAgcG11bGwgcTAscTEyLHEzCQlAIEgubG/Ct1hpLmxvCisJdmVvcglxOSxxOSxxMwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKy5ieXRlCTB4ODcsMHg0ZSwweGE5LDB4ZjIJQCBwbXVsbDIgcTIscTEyLHEzCQlAIEguaGnCt1hpLmhpCisuYnl0ZQkweGEyLDB4MmUsMHhhYSwweGYyCUAgcG11bGwgcTEscTEzLHE5CQlAIChILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisKKwl2ZXh0LjgJcTkscTAscTIsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCXZlb3IJcTEwLHEwLHEyCisJdmVvcglxMSxxMSxxOQorCXZlb3IJcTEscTEscTEwCisuYnl0ZQkweDI2LDB4NGUsMHhlMCwweGYyCUAgcG11bGwgcTEwLHEwLHExMQkJQCAxc3QgcGhhc2Ugb2YgcmVkdWN0aW9uCisKKwl2bW92CWQ0LGQzCQlAIFhofFhtIC0gMjU2LWJpdCByZXN1bHQKKwl2bW92CWQzLGQwCQlAIFhtIGlzIHJvdGF0ZWQgWGwKKwl2ZW9yCXEwLHExLHExMAorCisJdmV4dC44CXExMCxxMCxxMCwjOAkJQCAybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisuYnl0ZQkweDI2LDB4MGUsMHhhMCwweGYyCUAgcG11bGwgcTAscTAscTExCisJdmVvcglxMTAscTEwLHEyCisJdmVvcglxMCxxMCxxMTAKKworI2lmbmRlZiBfX0FSTUVCX18KKwl2cmV2NjQuOAlxMCxxMAorI2VuZGlmCisJdmV4dC44CXEwLHEwLHEwLCM4CisJdnN0MS42NAl7cTB9LFtyMF0JCUAgd3JpdGUgb3V0IFhpCisKKwlieAlscgorLnNpemUJZ2NtX2dtdWx0X3Y4LC4tZ2NtX2dtdWx0X3Y4CisuZ2xvYmwJZ2NtX2doYXNoX3Y4CisuaGlkZGVuCWdjbV9naGFzaF92OAorLnR5cGUJZ2NtX2doYXNoX3Y4LCVmdW5jdGlvbgorLmFsaWduCTQKK2djbV9naGFzaF92ODoKKwl2c3RtZGIJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0JCUAgMzItYml0IEFCSSBzYXlzIHNvCisJdmxkMS42NAl7cTB9LFtyMF0JCUAgbG9hZCBbcm90YXRlZF0gWGkKKwkJCQkJCUAgIltyb3RhdGVkXSIgbWVhbnMgdGhhdAorCQkJCQkJQCBsb2FkZWQgdmFsdWUgd291bGQgaGF2ZQorCQkJCQkJQCB0byBiZSByb3RhdGVkIGluIG9yZGVyIHRvCisJCQkJCQlAIG1ha2UgaXQgYXBwZWFyIGFzIGluCisJCQkJCQlAIGFsZ29yaXRobSBzcGVjaWZpY2F0aW9uCisJc3VicwlyMyxyMywjMzIJCUAgc2VlIGlmIHIzIGlzIDMyIG9yIGxhcmdlcgorCW1vdglyMTIsIzE2CQlAIHIxMiBpcyB1c2VkIGFzIHBvc3QtCisJCQkJCQlAIGluY3JlbWVudCBmb3IgaW5wdXQgcG9pbnRlcjsKKwkJCQkJCUAgYXMgbG9vcCBpcyBtb2R1bG8tc2NoZWR1bGVkCisJCQkJCQlAIHIxMiBpcyB6ZXJvZWQganVzdCBpbiB0aW1lCisJCQkJCQlAIHRvIHByZWNsdWRlIG92ZXJzdGVwcGluZworCQkJCQkJQCBpbnBbbGVuXSwgd2hpY2ggbWVhbnMgdGhhdAorCQkJCQkJQCBsYXN0IGJsb2NrW3NdIGFyZSBhY3R1YWxseQorCQkJCQkJQCBsb2FkZWQgdHdpY2UsIGJ1dCBsYXN0CisJCQkJCQlAIGNvcHkgaXMgbm90IHByb2Nlc3NlZAorCXZsZDEuNjQJe3ExMixxMTN9LFtyMV0hCUAgbG9hZCB0d2lzdGVkIEgsIC4uLiwgSF4yCisJdm1vdi5pOAlxMTEsIzB4ZTEKKwl2bGQxLjY0CXtxMTR9LFtyMV0KKwltb3ZlcQlyMTIsIzAJCQlAIGlzIGl0IHRpbWUgdG8gemVybyByMTI/CisJdmV4dC44CXEwLHEwLHEwLCM4CQlAIHJvdGF0ZSBYaQorCXZsZDEuNjQJe3E4fSxbcjJdIQlAIGxvYWQgW3JvdGF0ZWRdIElbMF0KKwl2c2hsLnU2NAlxMTEscTExLCM1NwkJQCBjb21wb3NlIDB4YzIuMCBjb25zdGFudAorI2lmbmRlZiBfX0FSTUVCX18KKwl2cmV2NjQuOAlxOCxxOAorCXZyZXY2NC44CXEwLHEwCisjZW5kaWYKKwl2ZXh0LjgJcTMscTgscTgsIzgJCUAgcm90YXRlIElbMF0KKwlibG8JLkxvZGRfdGFpbF92OAkJQCByMyB3YXMgbGVzcyB0aGFuIDMyCisJdmxkMS42NAl7cTl9LFtyMl0scjEyCUAgbG9hZCBbcm90YXRlZF0gSVsxXQorI2lmbmRlZiBfX0FSTUVCX18KKwl2cmV2NjQuOAlxOSxxOQorI2VuZGlmCisJdmV4dC44CXE3LHE5LHE5LCM4CisJdmVvcglxMyxxMyxxMAkJQCBJW2ldXj1YaQorLmJ5dGUJMHg4ZSwweDhlLDB4YTgsMHhmMglAIHBtdWxsIHE0LHExMixxNwkJQCBIwrdJaSsxCisJdmVvcglxOSxxOSxxNwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKy5ieXRlCTB4OGYsMHhjZSwweGE5LDB4ZjIJQCBwbXVsbDIgcTYscTEyLHE3CisJYgkuTG9vcF9tb2QyeF92OAorCisuYWxpZ24JNAorLkxvb3BfbW9kMnhfdjg6CisJdmV4dC44CXExMCxxMyxxMywjOAorCXN1YnMJcjMscjMsIzMyCQlAIGlzIHRoZXJlIG1vcmUgZGF0YT8KKy5ieXRlCTB4ODYsMHgwZSwweGFjLDB4ZjIJQCBwbXVsbCBxMCxxMTQscTMJCUAgSF4yLmxvwrdYaS5sbworCW1vdmxvCXIxMiwjMAkJCUAgaXMgaXQgdGltZSB0byB6ZXJvIHIxMj8KKworLmJ5dGUJMHhhMiwweGFlLDB4YWEsMHhmMglAIHBtdWxsIHE1LHExMyxxOQorCXZlb3IJcTEwLHExMCxxMwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKy5ieXRlCTB4ODcsMHg0ZSwweGFkLDB4ZjIJQCBwbXVsbDIgcTIscTE0LHEzCQlAIEheMi5oacK3WGkuaGkKKwl2ZW9yCXEwLHEwLHE0CQlAIGFjY3VtdWxhdGUKKy5ieXRlCTB4YTUsMHgyZSwweGFiLDB4ZjIJQCBwbXVsbDIgcTEscTEzLHExMAkJQCAoSF4yLmxvK0heMi5oaSnCtyhYaS5sbytYaS5oaSkKKwl2bGQxLjY0CXtxOH0sW3IyXSxyMTIJQCBsb2FkIFtyb3RhdGVkXSBJW2krMl0KKworCXZlb3IJcTIscTIscTYKKwltb3ZlcQlyMTIsIzAJCQlAIGlzIGl0IHRpbWUgdG8gemVybyByMTI/CisJdmVvcglxMSxxMSxxNQorCisJdmV4dC44CXE5LHEwLHEyLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKKwl2ZW9yCXExMCxxMCxxMgorCXZlb3IJcTEscTEscTkKKwl2bGQxLjY0CXtxOX0sW3IyXSxyMTIJQCBsb2FkIFtyb3RhdGVkXSBJW2krM10KKyNpZm5kZWYgX19BUk1FQl9fCisJdnJldjY0LjgJcTgscTgKKyNlbmRpZgorCXZlb3IJcTEscTEscTEwCisuYnl0ZQkweDI2LDB4NGUsMHhlMCwweGYyCUAgcG11bGwgcTEwLHEwLHExMQkJQCAxc3QgcGhhc2Ugb2YgcmVkdWN0aW9uCisKKyNpZm5kZWYgX19BUk1FQl9fCisJdnJldjY0LjgJcTkscTkKKyNlbmRpZgorCXZtb3YJZDQsZDMJCUAgWGh8WG0gLSAyNTYtYml0IHJlc3VsdAorCXZtb3YJZDMsZDAJCUAgWG0gaXMgcm90YXRlZCBYbAorCXZleHQuOAlxNyxxOSxxOSwjOAorCXZleHQuOAlxMyxxOCxxOCwjOAorCXZlb3IJcTAscTEscTEwCisuYnl0ZQkweDhlLDB4OGUsMHhhOCwweGYyCUAgcG11bGwgcTQscTEyLHE3CQlAIEjCt0lpKzEKKwl2ZW9yCXEzLHEzLHEyCQlAIGFjY3VtdWxhdGUgcTMgZWFybHkKKworCXZleHQuOAlxMTAscTAscTAsIzgJCUAgMm5kIHBoYXNlIG9mIHJlZHVjdGlvbgorLmJ5dGUJMHgyNiwweDBlLDB4YTAsMHhmMglAIHBtdWxsIHEwLHEwLHExMQorCXZlb3IJcTMscTMscTEwCisJdmVvcglxOSxxOSxxNwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKwl2ZW9yCXEzLHEzLHEwCisuYnl0ZQkweDhmLDB4Y2UsMHhhOSwweGYyCUAgcG11bGwyIHE2LHExMixxNworCWJocwkuTG9vcF9tb2QyeF92OAkJQCB0aGVyZSB3YXMgYXQgbGVhc3QgMzIgbW9yZSBieXRlcworCisJdmVvcglxMixxMixxMTAKKwl2ZXh0LjgJcTMscTgscTgsIzgJCUAgcmUtY29uc3RydWN0IHEzCisJYWRkcwlyMyxyMywjMzIJCUAgcmUtY29uc3RydWN0IHIzCisJdmVvcglxMCxxMCxxMgkJQCByZS1jb25zdHJ1Y3QgcTAKKwliZXEJLkxkb25lX3Y4CQlAIGlzIHIzIHplcm8/CisuTG9kZF90YWlsX3Y4OgorCXZleHQuOAlxMTAscTAscTAsIzgKKwl2ZW9yCXEzLHEzLHEwCQlAIGlucF49WGkKKwl2ZW9yCXE5LHE4LHExMAkJQCBxOSBpcyByb3RhdGVkIGlucF5YaQorCisuYnl0ZQkweDg2LDB4MGUsMHhhOCwweGYyCUAgcG11bGwgcTAscTEyLHEzCQlAIEgubG/Ct1hpLmxvCisJdmVvcglxOSxxOSxxMwkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKKy5ieXRlCTB4ODcsMHg0ZSwweGE5LDB4ZjIJQCBwbXVsbDIgcTIscTEyLHEzCQlAIEguaGnCt1hpLmhpCisuYnl0ZQkweGEyLDB4MmUsMHhhYSwweGYyCUAgcG11bGwgcTEscTEzLHE5CQlAIChILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisKKwl2ZXh0LjgJcTkscTAscTIsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZworCXZlb3IJcTEwLHEwLHEyCisJdmVvcglxMSxxMSxxOQorCXZlb3IJcTEscTEscTEwCisuYnl0ZQkweDI2LDB4NGUsMHhlMCwweGYyCUAgcG11bGwgcTEwLHEwLHExMQkJQCAxc3QgcGhhc2Ugb2YgcmVkdWN0aW9uCisKKwl2bW92CWQ0LGQzCQlAIFhofFhtIC0gMjU2LWJpdCByZXN1bHQKKwl2bW92CWQzLGQwCQlAIFhtIGlzIHJvdGF0ZWQgWGwKKwl2ZW9yCXEwLHExLHExMAorCisJdmV4dC44CXExMCxxMCxxMCwjOAkJQCAybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisuYnl0ZQkweDI2LDB4MGUsMHhhMCwweGYyCUAgcG11bGwgcTAscTAscTExCisJdmVvcglxMTAscTEwLHEyCisJdmVvcglxMCxxMCxxMTAKKworLkxkb25lX3Y4OgorI2lmbmRlZiBfX0FSTUVCX18KKwl2cmV2NjQuOAlxMCxxMAorI2VuZGlmCisJdmV4dC44CXEwLHEwLHEwLCM4CisJdnN0MS42NAl7cTB9LFtyMF0JCUAgd3JpdGUgb3V0IFhpCisKKwl2bGRtaWEJc3AhLHtkOCxkOSxkMTAsZDExLGQxMixkMTMsZDE0LGQxNX0JCUAgMzItYml0IEFCSSBzYXlzIHNvCisJYngJbHIKKy5zaXplCWdjbV9naGFzaF92OCwuLWdjbV9naGFzaF92OAorLmJ5dGUJNzEsNzIsNjUsODMsNzIsMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY0LWxhcmdlLlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGExLWFybXY0LWxhcmdlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkODhmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL3NoYTEtYXJtdjQtbGFyZ2UuUwpAQCAtMCwwICsxLDE0OTUgQEAKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgorCisudGV4dAorI2lmIGRlZmluZWQoX190aHVtYjJfXykKKy5zeW50YXgJdW5pZmllZAorLnRodW1iCisjZWxzZQorLmNvZGUJMzIKKyNlbmRpZgorCisuZ2xvYmwJc2hhMV9ibG9ja19kYXRhX29yZGVyCisuaGlkZGVuCXNoYTFfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMV9ibG9ja19kYXRhX29yZGVyLCVmdW5jdGlvbgorCisuYWxpZ24JNQorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKy5Mc2hhMV9ibG9jazoKKwlhZHIJcjMsLkxzaGExX2Jsb2NrCisJbGRyCXIxMiwuTE9QRU5TU0xfYXJtY2FwCisJbGRyCXIxMixbcjMscjEyXQkJQCBPUEVOU1NMX2FybWNhcF9QCisjaWZkZWYJX19BUFBMRV9fCisJbGRyCXIxMixbcjEyXQorI2VuZGlmCisJdHN0CXIxMiwjQVJNVjhfU0hBMQorCWJuZQkuTEFSTXY4CisJdHN0CXIxMiwjQVJNVjdfTkVPTgorCWJuZQkuTE5FT04KKyNlbmRpZgorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisJYWRkCXIyLHIxLHIyLGxzbCM2CUAgcjIgdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiByMQorCWxkbWlhCXIwLHtyMyxyNCxyNSxyNixyN30KKy5MbG9vcDoKKwlsZHIJcjgsLkxLXzAwXzE5CisJbW92CXIxNCxzcAorCXN1YglzcCxzcCwjMTUqNAorCW1vdglyNSxyNSxyb3IjMzAKKwltb3YJcjYscjYscm9yIzMwCisJbW92CXI3LHI3LHJvciMzMAkJQCBbNl0KKy5MXzAwXzE1OgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMTAsW3IxLCMyXQorCWxkcmIJcjksW3IxLCMzXQorCWxkcmIJcjExLFtyMSwjMV0KKwlhZGQJcjcscjgscjcscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXI5LHI5LHIxMCxsc2wjOAorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjkscjExLGxzbCMxNgorCWFkZAlyNyxyNyxyMyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW9ycglyOSxyOSxyMTIsbHNsIzI0CisjZWxzZQorCWxkcglyOSxbcjFdLCM0CQkJQCBoYW5kbGVzIHVuYWxpZ25lZAorCWFkZAlyNyxyOCxyNyxyb3IjMgkJCUAgRSs9S18wMF8xOQorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlhZGQJcjcscjcscjMscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjkscjkJCQkJQCBieXRlIHN3YXAKKyNlbmRpZgorI2VuZGlmCisJYW5kCXIxMCxyNCxyMTAscm9yIzIKKwlhZGQJcjcscjcscjkJCQlAIEUrPVhbaV0KKwllb3IJcjEwLHIxMCxyNixyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCXN0cglyOSxbcjE0LCMtNF0hCisJYWRkCXI3LHI3LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjEwLFtyMSwjMl0KKwlsZHJiCXI5LFtyMSwjM10KKwlsZHJiCXIxMSxbcjEsIzFdCisJYWRkCXI2LHI4LHI2LHJvciMyCQkJQCBFKz1LXzAwXzE5CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyOSxyOSxyMTAsbHNsIzgKKwllb3IJcjEwLHI0LHI1CQkJQCBGX3h4X3h4CisJb3JyCXI5LHI5LHIxMSxsc2wjMTYKKwlhZGQJcjYscjYscjcscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwlvcnIJcjkscjkscjEyLGxzbCMyNAorI2Vsc2UKKwlsZHIJcjksW3IxXSwjNAkJCUAgaGFuZGxlcyB1bmFsaWduZWQKKwlhZGQJcjYscjgscjYscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwllb3IJcjEwLHI0LHI1CQkJQCBGX3h4X3h4CisJYWRkCXI2LHI2LHI3LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXI5LHI5CQkJCUAgYnl0ZSBzd2FwCisjZW5kaWYKKyNlbmRpZgorCWFuZAlyMTAscjMscjEwLHJvciMyCisJYWRkCXI2LHI2LHI5CQkJQCBFKz1YW2ldCisJZW9yCXIxMCxyMTAscjUscm9yIzIJCUAgRl8wMF8xOShCLEMsRCkKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFkZAlyNixyNixyMTAJCQlAIEUrPUZfMDBfMTkoQixDLEQpCisjaWYgX19BUk1fQVJDSF9fPDcKKwlsZHJiCXIxMCxbcjEsIzJdCisJbGRyYglyOSxbcjEsIzNdCisJbGRyYglyMTEsW3IxLCMxXQorCWFkZAlyNSxyOCxyNSxyb3IjMgkJCUAgRSs9S18wMF8xOQorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjkscjkscjEwLGxzbCM4CisJZW9yCXIxMCxyMyxyNAkJCUAgRl94eF94eAorCW9ycglyOSxyOSxyMTEsbHNsIzE2CisJYWRkCXI1LHI1LHI2LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHI5LHIxMixsc2wjMjQKKyNlbHNlCisJbGRyCXI5LFtyMV0sIzQJCQlAIGhhbmRsZXMgdW5hbGlnbmVkCisJYWRkCXI1LHI4LHI1LHJvciMyCQkJQCBFKz1LXzAwXzE5CisJZW9yCXIxMCxyMyxyNAkJCUAgRl94eF94eAorCWFkZAlyNSxyNSxyNixyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorI2lmZGVmIF9fQVJNRUxfXworCXJldglyOSxyOQkJCQlAIGJ5dGUgc3dhcAorI2VuZGlmCisjZW5kaWYKKwlhbmQJcjEwLHI3LHIxMCxyb3IjMgorCWFkZAlyNSxyNSxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI0LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhZGQJcjUscjUscjEwCQkJQCBFKz1GXzAwXzE5KEIsQyxEKQorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMTAsW3IxLCMyXQorCWxkcmIJcjksW3IxLCMzXQorCWxkcmIJcjExLFtyMSwjMV0KKwlhZGQJcjQscjgscjQscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXI5LHI5LHIxMCxsc2wjOAorCWVvcglyMTAscjcscjMJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjkscjExLGxzbCMxNgorCWFkZAlyNCxyNCxyNSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW9ycglyOSxyOSxyMTIsbHNsIzI0CisjZWxzZQorCWxkcglyOSxbcjFdLCM0CQkJQCBoYW5kbGVzIHVuYWxpZ25lZAorCWFkZAlyNCxyOCxyNCxyb3IjMgkJCUAgRSs9S18wMF8xOQorCWVvcglyMTAscjcscjMJCQlAIEZfeHhfeHgKKwlhZGQJcjQscjQscjUscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjkscjkJCQkJQCBieXRlIHN3YXAKKyNlbmRpZgorI2VuZGlmCisJYW5kCXIxMCxyNixyMTAscm9yIzIKKwlhZGQJcjQscjQscjkJCQlAIEUrPVhbaV0KKwllb3IJcjEwLHIxMCxyMyxyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCXN0cglyOSxbcjE0LCMtNF0hCisJYWRkCXI0LHI0LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKyNpZiBfX0FSTV9BUkNIX188NworCWxkcmIJcjEwLFtyMSwjMl0KKwlsZHJiCXI5LFtyMSwjM10KKwlsZHJiCXIxMSxbcjEsIzFdCisJYWRkCXIzLHI4LHIzLHJvciMyCQkJQCBFKz1LXzAwXzE5CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyOSxyOSxyMTAsbHNsIzgKKwllb3IJcjEwLHI2LHI3CQkJQCBGX3h4X3h4CisJb3JyCXI5LHI5LHIxMSxsc2wjMTYKKwlhZGQJcjMscjMscjQscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwlvcnIJcjkscjkscjEyLGxzbCMyNAorI2Vsc2UKKwlsZHIJcjksW3IxXSwjNAkJCUAgaGFuZGxlcyB1bmFsaWduZWQKKwlhZGQJcjMscjgscjMscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwllb3IJcjEwLHI2LHI3CQkJQCBGX3h4X3h4CisJYWRkCXIzLHIzLHI0LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisjaWZkZWYgX19BUk1FTF9fCisJcmV2CXI5LHI5CQkJCUAgYnl0ZSBzd2FwCisjZW5kaWYKKyNlbmRpZgorCWFuZAlyMTAscjUscjEwLHJvciMyCisJYWRkCXIzLHIzLHI5CQkJQCBFKz1YW2ldCisJZW9yCXIxMCxyMTAscjcscm9yIzIJCUAgRl8wMF8xOShCLEMsRCkKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFkZAlyMyxyMyxyMTAJCQlAIEUrPUZfMDBfMTkoQixDLEQpCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorCW1vdglyMTIsc3AKKwl0ZXEJcjE0LHIxMgorI2Vsc2UKKwl0ZXEJcjE0LHNwCisjZW5kaWYKKwlibmUJLkxfMDBfMTUJCUAgWygoMTErNCkqNSsyKSozXQorCXN1YglzcCxzcCwjMjUqNAorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMTAsW3IxLCMyXQorCWxkcmIJcjksW3IxLCMzXQorCWxkcmIJcjExLFtyMSwjMV0KKwlhZGQJcjcscjgscjcscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXI5LHI5LHIxMCxsc2wjOAorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjkscjExLGxzbCMxNgorCWFkZAlyNyxyNyxyMyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW9ycglyOSxyOSxyMTIsbHNsIzI0CisjZWxzZQorCWxkcglyOSxbcjFdLCM0CQkJQCBoYW5kbGVzIHVuYWxpZ25lZAorCWFkZAlyNyxyOCxyNyxyb3IjMgkJCUAgRSs9S18wMF8xOQorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlhZGQJcjcscjcscjMscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjkscjkJCQkJQCBieXRlIHN3YXAKKyNlbmRpZgorI2VuZGlmCisJYW5kCXIxMCxyNCxyMTAscm9yIzIKKwlhZGQJcjcscjcscjkJCQlAIEUrPVhbaV0KKwllb3IJcjEwLHIxMCxyNixyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCXN0cglyOSxbcjE0LCMtNF0hCisJYWRkCXI3LHI3LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI2LHI4LHI2LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjQscjUJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI2LHI2LHI3LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjMscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNixyNixyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI1LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI2LHI2LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI1LHI4LHI1LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjMscjQJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI1LHI1LHI2LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjcscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNSxyNSxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI0LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI0LHI4LHI0LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjcscjMJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI0LHI0LHI1LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjYscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNCxyNCxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHIzLHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI0LHI0LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXIzLHI4LHIzLHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjYscjcJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXIzLHIzLHI0LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjUscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyMyxyMyxyOQkJCUAgRSs9WFtpXQorCWVvcglyMTAscjEwLHI3LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXIzLHIzLHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKworCWxkcglyOCwuTEtfMjBfMzkJCUAgWysxNSsxNio0XQorCWNtbglzcCwjMAkJCUAgWyszXSwgY2xlYXIgY2FycnkgdG8gZGVub3RlIDIwXzM5CisuTF8yMF8zOV9vcl82MF83OToKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI3LHI4LHI3LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI3LHI3LHIzLHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWVvcglyMTAscjQscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNyxyNyxyOQkJCUAgRSs9WFtpXQorCWFkZAlyNyxyNyxyMTAJCQlAIEUrPUZfMjBfMzkoQixDLEQpCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNixyOCxyNixyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI0LHI1CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNixyNixyNyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwllb3IJcjEwLHIzLHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJCQkJCQlAIEZfeHhfeHgKKwlhZGQJcjYscjYscjkJCQlAIEUrPVhbaV0KKwlhZGQJcjYscjYscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlhZGQJcjUscjgscjUscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwllb3IJcjkscjkscjEwCisJZW9yCXIxMSxyMTEscjEyCQkJQCAxIGN5Y2xlIHN0YWxsCisJZW9yCXIxMCxyMyxyNAkJCUAgRl94eF94eAorCW1vdglyOSxyOSxyb3IjMzEKKwlhZGQJcjUscjUscjYscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjkscjkscjExLHJvciMzMQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyNyxyMTAscm9yIzIJCQkJCUAgRl94eF94eAorCQkJCQkJQCBGX3h4X3h4CisJYWRkCXI1LHI1LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl8yMF8zOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJYWRkCXI0LHI4LHI0LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJbGRyCXIxMixbcjE0LCMyKjRdCisJZW9yCXI5LHI5LHIxMAorCWVvcglyMTEscjExLHIxMgkJCUAgMSBjeWNsZSBzdGFsbAorCWVvcglyMTAscjcscjMJCQlAIEZfeHhfeHgKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI0LHI0LHI1LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXI5LHI5LHIxMSxyb3IjMzEKKwlzdHIJcjksW3IxNCwjLTRdIQorCWVvcglyMTAscjYscjEwLHJvciMyCQkJCQlAIEZfeHhfeHgKKwkJCQkJCUAgRl94eF94eAorCWFkZAlyNCxyNCxyOQkJCUAgRSs9WFtpXQorCWFkZAlyNCxyNCxyMTAJCQlAIEUrPUZfMjBfMzkoQixDLEQpCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyMyxyOCxyMyxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI2LHI3CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyMyxyMyxyNCxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwllb3IJcjEwLHI1LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJCQkJCQlAIEZfeHhfeHgKKwlhZGQJcjMscjMscjkJCQlAIEUrPVhbaV0KKwlhZGQJcjMscjMscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorI2lmIGRlZmluZWQoX190aHVtYjJfXykKKwltb3YJcjEyLHNwCisJdGVxCXIxNCxyMTIKKyNlbHNlCisJdGVxCXIxNCxzcAkJCUAgcHJlc2VydmUgY2FycnkKKyNlbmRpZgorCWJuZQkuTF8yMF8zOV9vcl82MF83OQlAIFsrKCgxMiszKSo1KzIpKjRdCisJYmNzCS5MX2RvbmUJCQlAIFsrKCgxMiszKSo1KzIpKjRdLCBzcGFyZSAzMDAgYnl0ZXMKKworCWxkcglyOCwuTEtfNDBfNTkKKwlzdWIJc3Asc3AsIzIwKjQJCUAgWysyXQorLkxfNDBfNTk6CisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNyxyOCxyNyxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI1LHI2CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNyxyNyxyMyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI0LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNSxyNgkJCQkJQCBGX3h4X3h4CisJYWRkCXI3LHI3LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI3LHI3LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjcscjcscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNixyOCxyNixyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI0LHI1CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNixyNixyNyxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHIzLHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNCxyNQkJCQkJQCBGX3h4X3h4CisJYWRkCXI2LHI2LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI2LHI2LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjYscjYscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNSxyOCxyNSxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHIzLHI0CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNSxyNSxyNixyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI3LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyMyxyNAkJCQkJQCBGX3h4X3h4CisJYWRkCXI1LHI1LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjUscjUscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyNCxyOCxyNCxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI3LHIzCQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNCxyNCxyNSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI2LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNyxyMwkJCQkJQCBGX3h4X3h4CisJYWRkCXI0LHI0LHI5CQkJQCBFKz1YW2ldCisJYWRkCXI0LHI0LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjQscjQscjExLHJvciMyCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWFkZAlyMyxyOCxyMyxyb3IjMgkJCUAgRSs9S194eF94eAorCWxkcglyMTIsW3IxNCwjMio0XQorCWVvcglyOSxyOSxyMTAKKwllb3IJcjExLHIxMSxyMTIJCQlAIDEgY3ljbGUgc3RhbGwKKwllb3IJcjEwLHI2LHI3CQkJQCBGX3h4X3h4CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyMyxyMyxyNCxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyOSxyOSxyMTEscm9yIzMxCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI1LHIxMCxyb3IjMgkJCQkJQCBGX3h4X3h4CisJYW5kCXIxMSxyNixyNwkJCQkJQCBGX3h4X3h4CisJYWRkCXIzLHIzLHI5CQkJQCBFKz1YW2ldCisJYWRkCXIzLHIzLHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlhZGQJcjMscjMscjExLHJvciMyCisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorCW1vdglyMTIsc3AKKwl0ZXEJcjE0LHIxMgorI2Vsc2UKKwl0ZXEJcjE0LHNwCisjZW5kaWYKKwlibmUJLkxfNDBfNTkJCUAgWysoKDEyKzUpKjUrMikqNF0KKworCWxkcglyOCwuTEtfNjBfNzkKKwlzdWIJc3Asc3AsIzIwKjQKKwljbXAJc3AsIzAJCQlAIHNldCBjYXJyeSB0byBkZW5vdGUgNjBfNzkKKwliCS5MXzIwXzM5X29yXzYwXzc5CUAgWys0XSwgc3BhcmUgMzAwIGJ5dGVzCisuTF9kb25lOgorCWFkZAlzcCxzcCwjODAqNAkJQCAiZGVhbGxvY2F0ZSIgc3RhY2sgZnJhbWUKKwlsZG1pYQlyMCx7cjgscjkscjEwLHIxMSxyMTJ9CisJYWRkCXIzLHI4LHIzCisJYWRkCXI0LHI5LHI0CisJYWRkCXI1LHIxMCxyNSxyb3IjMgorCWFkZAlyNixyMTEscjYscm9yIzIKKwlhZGQJcjcscjEyLHI3LHJvciMyCisJc3RtaWEJcjAse3IzLHI0LHI1LHI2LHI3fQorCXRlcQlyMSxyMgorCWJuZQkuTGxvb3AJCQlAIFsrMThdLCB0b3RhbCAxMzA3CisKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKy53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyLC4tc2hhMV9ibG9ja19kYXRhX29yZGVyCisKKy5hbGlnbgk1CisuTEtfMDBfMTk6LndvcmQJMHg1YTgyNzk5OQorLkxLXzIwXzM5Oi53b3JkCTB4NmVkOWViYTEKKy5MS180MF81OToud29yZAkweDhmMWJiY2RjCisuTEtfNjBfNzk6LndvcmQJMHhjYTYyYzFkNgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKy5MT1BFTlNTTF9hcm1jYXA6Cisud29yZAlPUEVOU1NMX2FybWNhcF9QLS5Mc2hhMV9ibG9jaworI2VuZGlmCisuYnl0ZQk4Myw3Miw2NSw0OSwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3LDExMCwxMTUsMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDY1LDgyLDc3LDExOCw1Miw0Nyw3OCw2OSw3OSw3OCw0Nyw2NSw4Miw3NywxMTgsNTYsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTIKKy5hbGlnbgk1CisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLmFyY2gJYXJtdjctYQorLmZwdQluZW9uCisKKy50eXBlCXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9uZW9uLCVmdW5jdGlvbgorLmFsaWduCTQKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9uZW9uOgorLkxORU9OOgorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisJYWRkCXIyLHIxLHIyLGxzbCM2CUAgcjIgdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiByMQorCUAgZG1iCQkJCUAgZXJyYXRhICM0NTEwMzQgb24gZWFybHkgQ29ydGV4IEE4CisJQCB2c3RtZGIJc3AhLHtkOC1kMTV9CUAgQUJJIHNwZWNpZmljYXRpb24gc2F5cyBzbworCW1vdglyMTQsc3AKKwlzdWIJcjEyLHNwLCM2NAorCWFkcglyOCwuTEtfMDBfMTkKKwliaWMJcjEyLHIxMiwjMTUJCUAgYWxpZ24gZm9yIDEyOC1iaXQgc3RvcmVzCisKKwlsZG1pYQlyMCx7cjMscjQscjUscjYscjd9CUAgbG9hZCBjb250ZXh0CisJbW92CXNwLHIxMgkJQCBhbGxvY2EKKworCXZsZDEuOAl7cTAscTF9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKwl2ZW9yCXExNSxxMTUscTE1CisJdmxkMS44CXtxMixxM30sW3IxXSEKKwl2bGQxLjMyCXtkMjhbXSxkMjlbXX0sW3I4LDozMl0hCUAgbG9hZCBLXzAwXzE5CisJdnJldjMyLjgJcTAscTAJCUAgeWVzLCBldmVuIG9uCisJdnJldjMyLjgJcTEscTEJCUAgYmlnLWVuZGlhbi4uLgorCXZyZXYzMi44CXEyLHEyCisJdmFkZC5pMzIJcTgscTAscTE0CisJdnJldjMyLjgJcTMscTMKKwl2YWRkLmkzMglxOSxxMSxxMTQKKwl2c3QxLjMyCXtxOH0sW3IxMiw6MTI4XSEKKwl2YWRkLmkzMglxMTAscTIscTE0CisJdnN0MS4zMgl7cTl9LFtyMTIsOjEyOF0hCisJdnN0MS4zMgl7cTEwfSxbcjEyLDoxMjhdIQorCWxkcglyOSxbc3BdCQkJQCBiaWcgUkFXIHN0YWxsCisKKy5Mb29wX25lb246CisJdmV4dC44CXE4LHEwLHExLCM4CisJYmljCXIxMCxyNixyNAorCWFkZAlyNyxyNyxyOQorCWFuZAlyMTEscjUscjQKKwl2YWRkLmkzMglxMTMscTMscTE0CisJbGRyCXI5LFtzcCwjNF0KKwlhZGQJcjcscjcscjMscm9yIzI3CisJdmV4dC44CXExMixxMyxxMTUsIzQKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjQscjQscm9yIzIKKwlhZGQJcjcscjcscjExCisJdmVvcglxOCxxOCxxMAorCWJpYwlyMTAscjUscjMKKwlhZGQJcjYscjYscjkKKwl2ZW9yCXExMixxMTIscTIKKwlhbmQJcjExLHI0LHIzCisJbGRyCXI5LFtzcCwjOF0KKwl2ZW9yCXExMixxMTIscTgKKwlhZGQJcjYscjYscjcscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCXN1YglyMTIscjEyLCM2NAorCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwl2ZXh0LjgJcTEzLHExNSxxMTIsIzQKKwliaWMJcjEwLHI0LHI3CisJYWRkCXI1LHI1LHI5CisJdmFkZC5pMzIJcTgscTEyLHExMgorCWFuZAlyMTEscjMscjcKKwlsZHIJcjksW3NwLCMxMl0KKwl2c3JpLjMyCXE4LHExMiwjMzEKKwlhZGQJcjUscjUscjYscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI3LHI3LHJvciMyCisJdnNoci51MzIJcTEyLHExMywjMzAKKwlhZGQJcjUscjUscjExCisJYmljCXIxMCxyMyxyNgorCXZzaGwudTMyCXExMyxxMTMsIzIKKwlhZGQJcjQscjQscjkKKwlhbmQJcjExLHI3LHI2CisJdmVvcglxOCxxOCxxMTIKKwlsZHIJcjksW3NwLCMxNl0KKwlhZGQJcjQscjQscjUscm9yIzI3CisJdmVvcglxOCxxOCxxMTMKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJdmV4dC44CXE5LHExLHEyLCM4CisJYmljCXIxMCxyNyxyNQorCWFkZAlyMyxyMyxyOQorCWFuZAlyMTEscjYscjUKKwl2YWRkLmkzMglxMTMscTgscTE0CisJbGRyCXI5LFtzcCwjMjBdCisJdmxkMS4zMgl7ZDI4W10sZDI5W119LFtyOCw6MzJdIQorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwl2ZXh0LjgJcTEyLHE4LHExNSwjNAorCWVvcglyMTEscjExLHIxMAorCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwl2ZW9yCXE5LHE5LHExCisJYmljCXIxMCxyNixyNAorCWFkZAlyNyxyNyxyOQorCXZlb3IJcTEyLHExMixxMworCWFuZAlyMTEscjUscjQKKwlsZHIJcjksW3NwLCMyNF0KKwl2ZW9yCXExMixxMTIscTkKKwlhZGQJcjcscjcscjMscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwl2ZXh0LjgJcTEzLHExNSxxMTIsIzQKKwliaWMJcjEwLHI1LHIzCisJYWRkCXI2LHI2LHI5CisJdmFkZC5pMzIJcTkscTEyLHExMgorCWFuZAlyMTEscjQscjMKKwlsZHIJcjksW3NwLCMyOF0KKwl2c3JpLjMyCXE5LHExMiwjMzEKKwlhZGQJcjYscjYscjcscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXIzLHIzLHJvciMyCisJdnNoci51MzIJcTEyLHExMywjMzAKKwlhZGQJcjYscjYscjExCisJYmljCXIxMCxyNCxyNworCXZzaGwudTMyCXExMyxxMTMsIzIKKwlhZGQJcjUscjUscjkKKwlhbmQJcjExLHIzLHI3CisJdmVvcglxOSxxOSxxMTIKKwlsZHIJcjksW3NwLCMzMl0KKwlhZGQJcjUscjUscjYscm9yIzI3CisJdmVvcglxOSxxOSxxMTMKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJdmV4dC44CXExMCxxMixxMywjOAorCWJpYwlyMTAscjMscjYKKwlhZGQJcjQscjQscjkKKwlhbmQJcjExLHI3LHI2CisJdmFkZC5pMzIJcTEzLHE5LHExNAorCWxkcglyOSxbc3AsIzM2XQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwl2ZXh0LjgJcTEyLHE5LHExNSwjNAorCWVvcglyMTEscjExLHIxMAorCW1vdglyNixyNixyb3IjMgorCWFkZAlyNCxyNCxyMTEKKwl2ZW9yCXExMCxxMTAscTIKKwliaWMJcjEwLHI3LHI1CisJYWRkCXIzLHIzLHI5CisJdmVvcglxMTIscTEyLHE4CisJYW5kCXIxMSxyNixyNQorCWxkcglyOSxbc3AsIzQwXQorCXZlb3IJcTEyLHExMixxMTAKKwlhZGQJcjMscjMscjQscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwl2ZXh0LjgJcTEzLHExNSxxMTIsIzQKKwliaWMJcjEwLHI2LHI0CisJYWRkCXI3LHI3LHI5CisJdmFkZC5pMzIJcTEwLHExMixxMTIKKwlhbmQJcjExLHI1LHI0CisJbGRyCXI5LFtzcCwjNDRdCisJdnNyaS4zMglxMTAscTEyLCMzMQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjQscjQscm9yIzIKKwl2c2hyLnUzMglxMTIscTEzLCMzMAorCWFkZAlyNyxyNyxyMTEKKwliaWMJcjEwLHI1LHIzCisJdnNobC51MzIJcTEzLHExMywjMgorCWFkZAlyNixyNixyOQorCWFuZAlyMTEscjQscjMKKwl2ZW9yCXExMCxxMTAscTEyCisJbGRyCXI5LFtzcCwjNDhdCisJYWRkCXI2LHI2LHI3LHJvciMyNworCXZlb3IJcTEwLHExMCxxMTMKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjMscjMscm9yIzIKKwlhZGQJcjYscjYscjExCisJdmV4dC44CXExMSxxMyxxOCwjOAorCWJpYwlyMTAscjQscjcKKwlhZGQJcjUscjUscjkKKwlhbmQJcjExLHIzLHI3CisJdmFkZC5pMzIJcTEzLHExMCxxMTQKKwlsZHIJcjksW3NwLCM1Ml0KKwlhZGQJcjUscjUscjYscm9yIzI3CisJdmV4dC44CXExMixxMTAscTE1LCM0CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCXZlb3IJcTExLHExMSxxMworCWJpYwlyMTAscjMscjYKKwlhZGQJcjQscjQscjkKKwl2ZW9yCXExMixxMTIscTkKKwlhbmQJcjExLHI3LHI2CisJbGRyCXI5LFtzcCwjNTZdCisJdmVvcglxMTIscTEyLHExMQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwllb3IJcjExLHIxMSxyMTAKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCXZleHQuOAlxMTMscTE1LHExMiwjNAorCWJpYwlyMTAscjcscjUKKwlhZGQJcjMscjMscjkKKwl2YWRkLmkzMglxMTEscTEyLHExMgorCWFuZAlyMTEscjYscjUKKwlsZHIJcjksW3NwLCM2MF0KKwl2c3JpLjMyCXExMSxxMTIsIzMxCisJYWRkCXIzLHIzLHI0LHJvciMyNworCWVvcglyMTEscjExLHIxMAorCW1vdglyNSxyNSxyb3IjMgorCXZzaHIudTMyCXExMixxMTMsIzMwCisJYWRkCXIzLHIzLHIxMQorCWJpYwlyMTAscjYscjQKKwl2c2hsLnUzMglxMTMscTEzLCMyCisJYWRkCXI3LHI3LHI5CisJYW5kCXIxMSxyNSxyNAorCXZlb3IJcTExLHExMSxxMTIKKwlsZHIJcjksW3NwLCMwXQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwl2ZW9yCXExMSxxMTEscTEzCisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZleHQuOAlxMTIscTEwLHExMSwjOAorCWJpYwlyMTAscjUscjMKKwlhZGQJcjYscjYscjkKKwlhbmQJcjExLHI0LHIzCisJdmVvcglxMCxxMCxxOAorCWxkcglyOSxbc3AsIzRdCisJYWRkCXI2LHI2LHI3LHJvciMyNworCXZlb3IJcTAscTAscTEKKwllb3IJcjExLHIxMSxyMTAKKwltb3YJcjMscjMscm9yIzIKKwl2YWRkLmkzMglxMTMscTExLHExNAorCWFkZAlyNixyNixyMTEKKwliaWMJcjEwLHI0LHI3CisJdmVvcglxMTIscTEyLHEwCisJYWRkCXI1LHI1LHI5CisJYW5kCXIxMSxyMyxyNworCXZzaHIudTMyCXEwLHExMiwjMzAKKwlsZHIJcjksW3NwLCM4XQorCWFkZAlyNSxyNSxyNixyb3IjMjcKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJc3ViCXIxMixyMTIsIzY0CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI3LHI3LHJvciMyCisJdnNsaS4zMglxMCxxMTIsIzIKKwlhZGQJcjUscjUscjExCisJYmljCXIxMCxyMyxyNgorCWFkZAlyNCxyNCxyOQorCWFuZAlyMTEscjcscjYKKwlsZHIJcjksW3NwLCMxMl0KKwlhZGQJcjQscjQscjUscm9yIzI3CisJZW9yCXIxMSxyMTEscjEwCisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCWJpYwlyMTAscjcscjUKKwlhZGQJcjMscjMscjkKKwlhbmQJcjExLHI2LHI1CisJbGRyCXI5LFtzcCwjMTZdCisJYWRkCXIzLHIzLHI0LHJvciMyNworCWVvcglyMTEscjExLHIxMAorCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwl2ZXh0LjgJcTEyLHExMSxxMCwjOAorCWVvcglyMTAscjQscjYKKwlhZGQJcjcscjcscjkKKwlsZHIJcjksW3NwLCMyMF0KKwl2ZW9yCXExLHExLHE5CisJZW9yCXIxMSxyMTAscjUKKwlhZGQJcjcscjcscjMscm9yIzI3CisJdmVvcglxMSxxMSxxMgorCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwl2YWRkLmkzMglxMTMscTAscTE0CisJZW9yCXIxMCxyMyxyNQorCWFkZAlyNixyNixyOQorCXZlb3IJcTEyLHExMixxMQorCWxkcglyOSxbc3AsIzI0XQorCWVvcglyMTEscjEwLHI0CisJdnNoci51MzIJcTEscTEyLCMzMAorCWFkZAlyNixyNixyNyxyb3IjMjcKKwltb3YJcjMscjMscm9yIzIKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJYWRkCXI2LHI2LHIxMQorCWVvcglyMTAscjcscjQKKwl2c2xpLjMyCXExLHExMiwjMgorCWFkZAlyNSxyNSxyOQorCWxkcglyOSxbc3AsIzI4XQorCWVvcglyMTEscjEwLHIzCisJYWRkCXI1LHI1LHI2LHJvciMyNworCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwllb3IJcjEwLHI2LHIzCisJYWRkCXI0LHI0LHI5CisJbGRyCXI5LFtzcCwjMzJdCisJZW9yCXIxMSxyMTAscjcKKwlhZGQJcjQscjQscjUscm9yIzI3CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCXZleHQuOAlxMTIscTAscTEsIzgKKwllb3IJcjEwLHI1LHI3CisJYWRkCXIzLHIzLHI5CisJbGRyCXI5LFtzcCwjMzZdCisJdmVvcglxMixxMixxMTAKKwllb3IJcjExLHIxMCxyNgorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwl2ZW9yCXEyLHEyLHEzCisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCXZhZGQuaTMyCXExMyxxMSxxMTQKKwllb3IJcjEwLHI0LHI2CisJdmxkMS4zMgl7ZDI4W10sZDI5W119LFtyOCw6MzJdIQorCWFkZAlyNyxyNyxyOQorCXZlb3IJcTEyLHExMixxMgorCWxkcglyOSxbc3AsIzQwXQorCWVvcglyMTEscjEwLHI1CisJdnNoci51MzIJcTIscTEyLCMzMAorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwltb3YJcjQscjQscm9yIzIKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJYWRkCXI3LHI3LHIxMQorCWVvcglyMTAscjMscjUKKwl2c2xpLjMyCXEyLHExMiwjMgorCWFkZAlyNixyNixyOQorCWxkcglyOSxbc3AsIzQ0XQorCWVvcglyMTEscjEwLHI0CisJYWRkCXI2LHI2LHI3LHJvciMyNworCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwllb3IJcjEwLHI3LHI0CisJYWRkCXI1LHI1LHI5CisJbGRyCXI5LFtzcCwjNDhdCisJZW9yCXIxMSxyMTAscjMKKwlhZGQJcjUscjUscjYscm9yIzI3CisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCXZleHQuOAlxMTIscTEscTIsIzgKKwllb3IJcjEwLHI2LHIzCisJYWRkCXI0LHI0LHI5CisJbGRyCXI5LFtzcCwjNTJdCisJdmVvcglxMyxxMyxxMTEKKwllb3IJcjExLHIxMCxyNworCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwl2ZW9yCXEzLHEzLHE4CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCXZhZGQuaTMyCXExMyxxMixxMTQKKwllb3IJcjEwLHI1LHI3CisJYWRkCXIzLHIzLHI5CisJdmVvcglxMTIscTEyLHEzCisJbGRyCXI5LFtzcCwjNTZdCisJZW9yCXIxMSxyMTAscjYKKwl2c2hyLnUzMglxMyxxMTIsIzMwCisJYWRkCXIzLHIzLHI0LHJvciMyNworCW1vdglyNSxyNSxyb3IjMgorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlhZGQJcjMscjMscjExCisJZW9yCXIxMCxyNCxyNgorCXZzbGkuMzIJcTMscTEyLCMyCisJYWRkCXI3LHI3LHI5CisJbGRyCXI5LFtzcCwjNjBdCisJZW9yCXIxMSxyMTAscjUKKwlhZGQJcjcscjcscjMscm9yIzI3CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCWVvcglyMTAscjMscjUKKwlhZGQJcjYscjYscjkKKwlsZHIJcjksW3NwLCMwXQorCWVvcglyMTEscjEwLHI0CisJYWRkCXI2LHI2LHI3LHJvciMyNworCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwl2ZXh0LjgJcTEyLHEyLHEzLCM4CisJZW9yCXIxMCxyNyxyNAorCWFkZAlyNSxyNSxyOQorCWxkcglyOSxbc3AsIzRdCisJdmVvcglxOCxxOCxxMAorCWVvcglyMTEscjEwLHIzCisJYWRkCXI1LHI1LHI2LHJvciMyNworCXZlb3IJcTgscTgscTkKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJdmFkZC5pMzIJcTEzLHEzLHExNAorCWVvcglyMTAscjYscjMKKwlhZGQJcjQscjQscjkKKwl2ZW9yCXExMixxMTIscTgKKwlsZHIJcjksW3NwLCM4XQorCWVvcglyMTEscjEwLHI3CisJdnNoci51MzIJcTgscTEyLCMzMAorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwltb3YJcjYscjYscm9yIzIKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJc3ViCXIxMixyMTIsIzY0CisJYWRkCXI0LHI0LHIxMQorCWVvcglyMTAscjUscjcKKwl2c2xpLjMyCXE4LHExMiwjMgorCWFkZAlyMyxyMyxyOQorCWxkcglyOSxbc3AsIzEyXQorCWVvcglyMTEscjEwLHI2CisJYWRkCXIzLHIzLHI0LHJvciMyNworCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwllb3IJcjEwLHI0LHI2CisJYWRkCXI3LHI3LHI5CisJbGRyCXI5LFtzcCwjMTZdCisJZW9yCXIxMSxyMTAscjUKKwlhZGQJcjcscjcscjMscm9yIzI3CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZleHQuOAlxMTIscTMscTgsIzgKKwllb3IJcjEwLHIzLHI1CisJYWRkCXI2LHI2LHI5CisJbGRyCXI5LFtzcCwjMjBdCisJdmVvcglxOSxxOSxxMQorCWVvcglyMTEscjEwLHI0CisJYWRkCXI2LHI2LHI3LHJvciMyNworCXZlb3IJcTkscTkscTEwCisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCXZhZGQuaTMyCXExMyxxOCxxMTQKKwllb3IJcjEwLHI3LHI0CisJYWRkCXI1LHI1LHI5CisJdmVvcglxMTIscTEyLHE5CisJbGRyCXI5LFtzcCwjMjRdCisJZW9yCXIxMSxyMTAscjMKKwl2c2hyLnUzMglxOSxxMTIsIzMwCisJYWRkCXI1LHI1LHI2LHJvciMyNworCW1vdglyNyxyNyxyb3IjMgorCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwlhZGQJcjUscjUscjExCisJZW9yCXIxMCxyNixyMworCXZzbGkuMzIJcTkscTEyLCMyCisJYWRkCXI0LHI0LHI5CisJbGRyCXI5LFtzcCwjMjhdCisJZW9yCXIxMSxyMTAscjcKKwlhZGQJcjQscjQscjUscm9yIzI3CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCWVvcglyMTAscjUscjcKKwlhZGQJcjMscjMscjkKKwlsZHIJcjksW3NwLCMzMl0KKwllb3IJcjExLHIxMCxyNgorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwltb3YJcjUscjUscm9yIzIKKwlhZGQJcjMscjMscjExCisJdmV4dC44CXExMixxOCxxOSwjOAorCWFkZAlyNyxyNyxyOQorCWFuZAlyMTAscjUscjYKKwlsZHIJcjksW3NwLCMzNl0KKwl2ZW9yCXExMCxxMTAscTIKKwlhZGQJcjcscjcscjMscm9yIzI3CisJZW9yCXIxMSxyNSxyNgorCXZlb3IJcTEwLHExMCxxMTEKKwlhZGQJcjcscjcscjEwCisJYW5kCXIxMSxyMTEscjQKKwl2YWRkLmkzMglxMTMscTkscTE0CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZlb3IJcTEyLHExMixxMTAKKwlhZGQJcjYscjYscjkKKwlhbmQJcjEwLHI0LHI1CisJdnNoci51MzIJcTEwLHExMiwjMzAKKwlsZHIJcjksW3NwLCM0MF0KKwlhZGQJcjYscjYscjcscm9yIzI3CisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCWVvcglyMTEscjQscjUKKwlhZGQJcjYscjYscjEwCisJdnNsaS4zMglxMTAscTEyLCMyCisJYW5kCXIxMSxyMTEscjMKKwltb3YJcjMscjMscm9yIzIKKwlhZGQJcjYscjYscjExCisJYWRkCXI1LHI1LHI5CisJYW5kCXIxMCxyMyxyNAorCWxkcglyOSxbc3AsIzQ0XQorCWFkZAlyNSxyNSxyNixyb3IjMjcKKwllb3IJcjExLHIzLHI0CisJYWRkCXI1LHI1LHIxMAorCWFuZAlyMTEscjExLHI3CisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCWFkZAlyNCxyNCxyOQorCWFuZAlyMTAscjcscjMKKwlsZHIJcjksW3NwLCM0OF0KKwlhZGQJcjQscjQscjUscm9yIzI3CisJZW9yCXIxMSxyNyxyMworCWFkZAlyNCxyNCxyMTAKKwlhbmQJcjExLHIxMSxyNgorCW1vdglyNixyNixyb3IjMgorCWFkZAlyNCxyNCxyMTEKKwl2ZXh0LjgJcTEyLHE5LHExMCwjOAorCWFkZAlyMyxyMyxyOQorCWFuZAlyMTAscjYscjcKKwlsZHIJcjksW3NwLCM1Ml0KKwl2ZW9yCXExMSxxMTEscTMKKwlhZGQJcjMscjMscjQscm9yIzI3CisJZW9yCXIxMSxyNixyNworCXZlb3IJcTExLHExMSxxMAorCWFkZAlyMyxyMyxyMTAKKwlhbmQJcjExLHIxMSxyNQorCXZhZGQuaTMyCXExMyxxMTAscTE0CisJbW92CXI1LHI1LHJvciMyCisJdmxkMS4zMgl7ZDI4W10sZDI5W119LFtyOCw6MzJdIQorCWFkZAlyMyxyMyxyMTEKKwl2ZW9yCXExMixxMTIscTExCisJYWRkCXI3LHI3LHI5CisJYW5kCXIxMCxyNSxyNgorCXZzaHIudTMyCXExMSxxMTIsIzMwCisJbGRyCXI5LFtzcCwjNTZdCisJYWRkCXI3LHI3LHIzLHJvciMyNworCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwllb3IJcjExLHI1LHI2CisJYWRkCXI3LHI3LHIxMAorCXZzbGkuMzIJcTExLHExMiwjMgorCWFuZAlyMTEscjExLHI0CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCWFkZAlyNixyNixyOQorCWFuZAlyMTAscjQscjUKKwlsZHIJcjksW3NwLCM2MF0KKwlhZGQJcjYscjYscjcscm9yIzI3CisJZW9yCXIxMSxyNCxyNQorCWFkZAlyNixyNixyMTAKKwlhbmQJcjExLHIxMSxyMworCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwlhZGQJcjUscjUscjkKKwlhbmQJcjEwLHIzLHI0CisJbGRyCXI5LFtzcCwjMF0KKwlhZGQJcjUscjUscjYscm9yIzI3CisJZW9yCXIxMSxyMyxyNAorCWFkZAlyNSxyNSxyMTAKKwlhbmQJcjExLHIxMSxyNworCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwl2ZXh0LjgJcTEyLHExMCxxMTEsIzgKKwlhZGQJcjQscjQscjkKKwlhbmQJcjEwLHI3LHIzCisJbGRyCXI5LFtzcCwjNF0KKwl2ZW9yCXEwLHEwLHE4CisJYWRkCXI0LHI0LHI1LHJvciMyNworCWVvcglyMTEscjcscjMKKwl2ZW9yCXEwLHEwLHExCisJYWRkCXI0LHI0LHIxMAorCWFuZAlyMTEscjExLHI2CisJdmFkZC5pMzIJcTEzLHExMSxxMTQKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJdmVvcglxMTIscTEyLHEwCisJYWRkCXIzLHIzLHI5CisJYW5kCXIxMCxyNixyNworCXZzaHIudTMyCXEwLHExMiwjMzAKKwlsZHIJcjksW3NwLCM4XQorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJc3ViCXIxMixyMTIsIzY0CisJZW9yCXIxMSxyNixyNworCWFkZAlyMyxyMyxyMTAKKwl2c2xpLjMyCXEwLHExMiwjMgorCWFuZAlyMTEscjExLHI1CisJbW92CXI1LHI1LHJvciMyCisJYWRkCXIzLHIzLHIxMQorCWFkZAlyNyxyNyxyOQorCWFuZAlyMTAscjUscjYKKwlsZHIJcjksW3NwLCMxMl0KKwlhZGQJcjcscjcscjMscm9yIzI3CisJZW9yCXIxMSxyNSxyNgorCWFkZAlyNyxyNyxyMTAKKwlhbmQJcjExLHIxMSxyNAorCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwlhZGQJcjYscjYscjkKKwlhbmQJcjEwLHI0LHI1CisJbGRyCXI5LFtzcCwjMTZdCisJYWRkCXI2LHI2LHI3LHJvciMyNworCWVvcglyMTEscjQscjUKKwlhZGQJcjYscjYscjEwCisJYW5kCXIxMSxyMTEscjMKKwltb3YJcjMscjMscm9yIzIKKwlhZGQJcjYscjYscjExCisJdmV4dC44CXExMixxMTEscTAsIzgKKwlhZGQJcjUscjUscjkKKwlhbmQJcjEwLHIzLHI0CisJbGRyCXI5LFtzcCwjMjBdCisJdmVvcglxMSxxMSxxOQorCWFkZAlyNSxyNSxyNixyb3IjMjcKKwllb3IJcjExLHIzLHI0CisJdmVvcglxMSxxMSxxMgorCWFkZAlyNSxyNSxyMTAKKwlhbmQJcjExLHIxMSxyNworCXZhZGQuaTMyCXExMyxxMCxxMTQKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJdmVvcglxMTIscTEyLHExCisJYWRkCXI0LHI0LHI5CisJYW5kCXIxMCxyNyxyMworCXZzaHIudTMyCXExLHExMiwjMzAKKwlsZHIJcjksW3NwLCMyNF0KKwlhZGQJcjQscjQscjUscm9yIzI3CisJdnN0MS4zMgl7cTEzfSxbcjEyLDoxMjhdIQorCWVvcglyMTEscjcscjMKKwlhZGQJcjQscjQscjEwCisJdnNsaS4zMglxMSxxMTIsIzIKKwlhbmQJcjExLHIxMSxyNgorCW1vdglyNixyNixyb3IjMgorCWFkZAlyNCxyNCxyMTEKKwlhZGQJcjMscjMscjkKKwlhbmQJcjEwLHI2LHI3CisJbGRyCXI5LFtzcCwjMjhdCisJYWRkCXIzLHIzLHI0LHJvciMyNworCWVvcglyMTEscjYscjcKKwlhZGQJcjMscjMscjEwCisJYW5kCXIxMSxyMTEscjUKKwltb3YJcjUscjUscm9yIzIKKwlhZGQJcjMscjMscjExCisJYWRkCXI3LHI3LHI5CisJYW5kCXIxMCxyNSxyNgorCWxkcglyOSxbc3AsIzMyXQorCWFkZAlyNyxyNyxyMyxyb3IjMjcKKwllb3IJcjExLHI1LHI2CisJYWRkCXI3LHI3LHIxMAorCWFuZAlyMTEscjExLHI0CisJbW92CXI0LHI0LHJvciMyCisJYWRkCXI3LHI3LHIxMQorCXZleHQuOAlxMTIscTAscTEsIzgKKwlhZGQJcjYscjYscjkKKwlhbmQJcjEwLHI0LHI1CisJbGRyCXI5LFtzcCwjMzZdCisJdmVvcglxMixxMixxMTAKKwlhZGQJcjYscjYscjcscm9yIzI3CisJZW9yCXIxMSxyNCxyNQorCXZlb3IJcTIscTIscTMKKwlhZGQJcjYscjYscjEwCisJYW5kCXIxMSxyMTEscjMKKwl2YWRkLmkzMglxMTMscTEscTE0CisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCXZlb3IJcTEyLHExMixxMgorCWFkZAlyNSxyNSxyOQorCWFuZAlyMTAscjMscjQKKwl2c2hyLnUzMglxMixxMTIsIzMwCisJbGRyCXI5LFtzcCwjNDBdCisJYWRkCXI1LHI1LHI2LHJvciMyNworCXZzdDEuMzIJe3ExM30sW3IxMiw6MTI4XSEKKwllb3IJcjExLHIzLHI0CisJYWRkCXI1LHI1LHIxMAorCXZzbGkuMzIJcTIscTEyLCMyCisJYW5kCXIxMSxyMTEscjcKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJYWRkCXI0LHI0LHI5CisJYW5kCXIxMCxyNyxyMworCWxkcglyOSxbc3AsIzQ0XQorCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwllb3IJcjExLHI3LHIzCisJYWRkCXI0LHI0LHIxMAorCWFuZAlyMTEscjExLHI2CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCWFkZAlyMyxyMyxyOQorCWFuZAlyMTAscjYscjcKKwlsZHIJcjksW3NwLCM0OF0KKwlhZGQJcjMscjMscjQscm9yIzI3CisJZW9yCXIxMSxyNixyNworCWFkZAlyMyxyMyxyMTAKKwlhbmQJcjExLHIxMSxyNQorCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwl2ZXh0LjgJcTEyLHExLHEyLCM4CisJZW9yCXIxMCxyNCxyNgorCWFkZAlyNyxyNyxyOQorCWxkcglyOSxbc3AsIzUyXQorCXZlb3IJcTMscTMscTExCisJZW9yCXIxMSxyMTAscjUKKwlhZGQJcjcscjcscjMscm9yIzI3CisJdmVvcglxMyxxMyxxOAorCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwl2YWRkLmkzMglxMTMscTIscTE0CisJZW9yCXIxMCxyMyxyNQorCWFkZAlyNixyNixyOQorCXZlb3IJcTEyLHExMixxMworCWxkcglyOSxbc3AsIzU2XQorCWVvcglyMTEscjEwLHI0CisJdnNoci51MzIJcTMscTEyLCMzMAorCWFkZAlyNixyNixyNyxyb3IjMjcKKwltb3YJcjMscjMscm9yIzIKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJYWRkCXI2LHI2LHIxMQorCWVvcglyMTAscjcscjQKKwl2c2xpLjMyCXEzLHExMiwjMgorCWFkZAlyNSxyNSxyOQorCWxkcglyOSxbc3AsIzYwXQorCWVvcglyMTEscjEwLHIzCisJYWRkCXI1LHI1LHI2LHJvciMyNworCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwllb3IJcjEwLHI2LHIzCisJYWRkCXI0LHI0LHI5CisJbGRyCXI5LFtzcCwjMF0KKwllb3IJcjExLHIxMCxyNworCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJdmFkZC5pMzIJcTEzLHEzLHExNAorCWVvcglyMTAscjUscjcKKwlhZGQJcjMscjMscjkKKwl2c3QxLjMyCXtxMTN9LFtyMTIsOjEyOF0hCisJc3ViCXIxMixyMTIsIzY0CisJdGVxCXIxLHIyCisJc3ViCXI4LHI4LCMxNgorCWl0CWVxCisJc3ViZXEJcjEscjEsIzY0CisJdmxkMS44CXtxMCxxMX0sW3IxXSEKKwlsZHIJcjksW3NwLCM0XQorCWVvcglyMTEscjEwLHI2CisJdmxkMS44CXtxMixxM30sW3IxXSEKKwlhZGQJcjMscjMscjQscm9yIzI3CisJbW92CXI1LHI1LHJvciMyCisJdmxkMS4zMgl7ZDI4W10sZDI5W119LFtyOCw6MzJdIQorCWFkZAlyMyxyMyxyMTEKKwllb3IJcjEwLHI0LHI2CisJdnJldjMyLjgJcTAscTAKKwlhZGQJcjcscjcscjkKKwlsZHIJcjksW3NwLCM4XQorCWVvcglyMTEscjEwLHI1CisJYWRkCXI3LHI3LHIzLHJvciMyNworCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwllb3IJcjEwLHIzLHI1CisJYWRkCXI2LHI2LHI5CisJbGRyCXI5LFtzcCwjMTJdCisJZW9yCXIxMSxyMTAscjQKKwlhZGQJcjYscjYscjcscm9yIzI3CisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCWVvcglyMTAscjcscjQKKwlhZGQJcjUscjUscjkKKwlsZHIJcjksW3NwLCMxNl0KKwllb3IJcjExLHIxMCxyMworCWFkZAlyNSxyNSxyNixyb3IjMjcKKwltb3YJcjcscjcscm9yIzIKKwlhZGQJcjUscjUscjExCisJdnJldjMyLjgJcTEscTEKKwllb3IJcjEwLHI2LHIzCisJYWRkCXI0LHI0LHI5CisJdmFkZC5pMzIJcTgscTAscTE0CisJbGRyCXI5LFtzcCwjMjBdCisJZW9yCXIxMSxyMTAscjcKKwl2c3QxLjMyCXtxOH0sW3IxMiw6MTI4XSEKKwlhZGQJcjQscjQscjUscm9yIzI3CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCWVvcglyMTAscjUscjcKKwlhZGQJcjMscjMscjkKKwlsZHIJcjksW3NwLCMyNF0KKwllb3IJcjExLHIxMCxyNgorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwltb3YJcjUscjUscm9yIzIKKwlhZGQJcjMscjMscjExCisJZW9yCXIxMCxyNCxyNgorCWFkZAlyNyxyNyxyOQorCWxkcglyOSxbc3AsIzI4XQorCWVvcglyMTEscjEwLHI1CisJYWRkCXI3LHI3LHIzLHJvciMyNworCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwllb3IJcjEwLHIzLHI1CisJYWRkCXI2LHI2LHI5CisJbGRyCXI5LFtzcCwjMzJdCisJZW9yCXIxMSxyMTAscjQKKwlhZGQJcjYscjYscjcscm9yIzI3CisJbW92CXIzLHIzLHJvciMyCisJYWRkCXI2LHI2LHIxMQorCXZyZXYzMi44CXEyLHEyCisJZW9yCXIxMCxyNyxyNAorCWFkZAlyNSxyNSxyOQorCXZhZGQuaTMyCXE5LHExLHExNAorCWxkcglyOSxbc3AsIzM2XQorCWVvcglyMTEscjEwLHIzCisJdnN0MS4zMgl7cTl9LFtyMTIsOjEyOF0hCisJYWRkCXI1LHI1LHI2LHJvciMyNworCW1vdglyNyxyNyxyb3IjMgorCWFkZAlyNSxyNSxyMTEKKwllb3IJcjEwLHI2LHIzCisJYWRkCXI0LHI0LHI5CisJbGRyCXI5LFtzcCwjNDBdCisJZW9yCXIxMSxyMTAscjcKKwlhZGQJcjQscjQscjUscm9yIzI3CisJbW92CXI2LHI2LHJvciMyCisJYWRkCXI0LHI0LHIxMQorCWVvcglyMTAscjUscjcKKwlhZGQJcjMscjMscjkKKwlsZHIJcjksW3NwLCM0NF0KKwllb3IJcjExLHIxMCxyNgorCWFkZAlyMyxyMyxyNCxyb3IjMjcKKwltb3YJcjUscjUscm9yIzIKKwlhZGQJcjMscjMscjExCisJZW9yCXIxMCxyNCxyNgorCWFkZAlyNyxyNyxyOQorCWxkcglyOSxbc3AsIzQ4XQorCWVvcglyMTEscjEwLHI1CisJYWRkCXI3LHI3LHIzLHJvciMyNworCW1vdglyNCxyNCxyb3IjMgorCWFkZAlyNyxyNyxyMTEKKwl2cmV2MzIuOAlxMyxxMworCWVvcglyMTAscjMscjUKKwlhZGQJcjYscjYscjkKKwl2YWRkLmkzMglxMTAscTIscTE0CisJbGRyCXI5LFtzcCwjNTJdCisJZW9yCXIxMSxyMTAscjQKKwl2c3QxLjMyCXtxMTB9LFtyMTIsOjEyOF0hCisJYWRkCXI2LHI2LHI3LHJvciMyNworCW1vdglyMyxyMyxyb3IjMgorCWFkZAlyNixyNixyMTEKKwllb3IJcjEwLHI3LHI0CisJYWRkCXI1LHI1LHI5CisJbGRyCXI5LFtzcCwjNTZdCisJZW9yCXIxMSxyMTAscjMKKwlhZGQJcjUscjUscjYscm9yIzI3CisJbW92CXI3LHI3LHJvciMyCisJYWRkCXI1LHI1LHIxMQorCWVvcglyMTAscjYscjMKKwlhZGQJcjQscjQscjkKKwlsZHIJcjksW3NwLCM2MF0KKwllb3IJcjExLHIxMCxyNworCWFkZAlyNCxyNCxyNSxyb3IjMjcKKwltb3YJcjYscjYscm9yIzIKKwlhZGQJcjQscjQscjExCisJZW9yCXIxMCxyNSxyNworCWFkZAlyMyxyMyxyOQorCWVvcglyMTEscjEwLHI2CisJYWRkCXIzLHIzLHI0LHJvciMyNworCW1vdglyNSxyNSxyb3IjMgorCWFkZAlyMyxyMyxyMTEKKwlsZG1pYQlyMCx7cjkscjEwLHIxMSxyMTJ9CUAgYWNjdW11bGF0ZSBjb250ZXh0CisJYWRkCXIzLHIzLHI5CisJbGRyCXI5LFtyMCwjMTZdCisJYWRkCXI0LHI0LHIxMAorCWFkZAlyNSxyNSxyMTEKKwlhZGQJcjYscjYscjEyCisJaXQJZXEKKwltb3ZlcQlzcCxyMTQKKwlhZGQJcjcscjcscjkKKwlpdAluZQorCWxkcm5lCXI5LFtzcF0KKwlzdG1pYQlyMCx7cjMscjQscjUscjYscjd9CisJaXR0CW5lCisJYWRkbmUJcjEyLHNwLCMzKjE2CisJYm5lCS5Mb29wX25lb24KKworCUAgdmxkbWlhCXNwISx7ZDgtZDE1fQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIscGN9Cisuc2l6ZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXJfbmVvbiwuLXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9uZW9uCisjZW5kaWYKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisKKyMgaWYgZGVmaW5lZChfX3RodW1iMl9fKQorIyAgZGVmaW5lIElOU1QoYSxiLGMsZCkJLmJ5dGUJYyxkfDB4ZixhLGIKKyMgZWxzZQorIyAgZGVmaW5lIElOU1QoYSxiLGMsZCkJLmJ5dGUJYSxiLGMsZHwweDEwCisjIGVuZGlmCisKKy50eXBlCXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9hcm12OCwlZnVuY3Rpb24KKy5hbGlnbgk1CitzaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjg6CisuTEFSTXY4OgorCXZzdG1kYglzcCEse2Q4LGQ5LGQxMCxkMTEsZDEyLGQxMyxkMTQsZDE1fQkJQCBBQkkgc3BlY2lmaWNhdGlvbiBzYXlzIHNvCisKKwl2ZW9yCXExLHExLHExCisJYWRyCXIzLC5MS18wMF8xOQorCXZsZDEuMzIJe3EwfSxbcjBdIQorCXZsZDEuMzIJe2QyWzBdfSxbcjBdCisJc3ViCXIwLHIwLCMxNgorCXZsZDEuMzIJe2QxNltdLGQxN1tdfSxbcjMsOjMyXSEKKwl2bGQxLjMyCXtkMThbXSxkMTlbXX0sW3IzLDozMl0hCisJdmxkMS4zMgl7ZDIwW10sZDIxW119LFtyMyw6MzJdIQorCXZsZDEuMzIJe2QyMltdLGQyM1tdfSxbcjMsOjMyXQorCisuTG9vcF92ODoKKwl2bGQxLjgJe3E0LHE1fSxbcjFdIQorCXZsZDEuOAl7cTYscTd9LFtyMV0hCisJdnJldjMyLjgJcTQscTQKKwl2cmV2MzIuOAlxNSxxNQorCisJdmFkZC5pMzIJcTEyLHE4LHE0CisJdnJldjMyLjgJcTYscTYKKwl2bW92CXExNCxxMAlAIG9mZmxvYWQKKwlzdWJzCXIyLHIyLCMxCisKKwl2YWRkLmkzMglxMTMscTgscTUKKwl2cmV2MzIuOAlxNyxxNworCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCAwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGUyKQlAIHNoYTFjIHEwLHExLHExMgorCXZhZGQuaTMyCXExMixxOCxxNgorCUlOU1QoMHg0YywweDhjLDB4M2EsMHhlMikJQCBzaGExc3UwIHE0LHE1LHE2CisJSU5TVCgweGMwLDB4NDIsMHhiOSwweGYzKQlAIHNoYTFoIHEyLHEwCQlAIDEKKwlJTlNUKDB4NmEsMHgwYywweDA2LDB4ZTIpCUAgc2hhMWMgcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHE4LHE3CisJSU5TVCgweDhlLDB4ODMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTQscTcKKwlJTlNUKDB4NGUsMHhhYywweDNjLDB4ZTIpCUAgc2hhMXN1MCBxNSxxNixxNworCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCAyCisJSU5TVCgweDY4LDB4MGMsMHgwNCwweGUyKQlAIHNoYTFjIHEwLHEyLHExMgorCXZhZGQuaTMyCXExMixxOCxxNAorCUlOU1QoMHg4OCwweGEzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE1LHE0CisJSU5TVCgweDQ4LDB4Y2MsMHgzZSwweGUyKQlAIHNoYTFzdTAgcTYscTcscTQKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgMworCUlOU1QoMHg2YSwweDBjLDB4MDYsMHhlMikJQCBzaGExYyBxMCxxMyxxMTMKKwl2YWRkLmkzMglxMTMscTkscTUKKwlJTlNUKDB4OGEsMHhjMywweGJhLDB4ZjMpCUAgc2hhMXN1MSBxNixxNQorCUlOU1QoMHg0YSwweGVjLDB4MzgsMHhlMikJQCBzaGExc3UwIHE3LHE0LHE1CisJSU5TVCgweGMwLDB4NjIsMHhiOSwweGYzKQlAIHNoYTFoIHEzLHEwCQlAIDQKKwlJTlNUKDB4NjgsMHgwYywweDA0LDB4ZTIpCUAgc2hhMWMgcTAscTIscTEyCisJdmFkZC5pMzIJcTEyLHE5LHE2CisJSU5TVCgweDhjLDB4ZTMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTcscTYKKwlJTlNUKDB4NGMsMHg4YywweDNhLDB4ZTIpCUAgc2hhMXN1MCBxNCxxNSxxNgorCUlOU1QoMHhjMCwweDQyLDB4YjksMHhmMykJQCBzaGExaCBxMixxMAkJQCA1CisJSU5TVCgweDZhLDB4MGMsMHgxNiwweGUyKQlAIHNoYTFwIHEwLHEzLHExMworCXZhZGQuaTMyCXExMyxxOSxxNworCUlOU1QoMHg4ZSwweDgzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE0LHE3CisJSU5TVCgweDRlLDB4YWMsMHgzYywweGUyKQlAIHNoYTFzdTAgcTUscTYscTcKKwlJTlNUKDB4YzAsMHg2MiwweGI5LDB4ZjMpCUAgc2hhMWggcTMscTAJCUAgNgorCUlOU1QoMHg2OCwweDBjLDB4MTQsMHhlMikJQCBzaGExcCBxMCxxMixxMTIKKwl2YWRkLmkzMglxMTIscTkscTQKKwlJTlNUKDB4ODgsMHhhMywweGJhLDB4ZjMpCUAgc2hhMXN1MSBxNSxxNAorCUlOU1QoMHg0OCwweGNjLDB4M2UsMHhlMikJQCBzaGExc3UwIHE2LHE3LHE0CisJSU5TVCgweGMwLDB4NDIsMHhiOSwweGYzKQlAIHNoYTFoIHEyLHEwCQlAIDcKKwlJTlNUKDB4NmEsMHgwYywweDE2LDB4ZTIpCUAgc2hhMXAgcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHE5LHE1CisJSU5TVCgweDhhLDB4YzMsMHhiYSwweGYzKQlAIHNoYTFzdTEgcTYscTUKKwlJTlNUKDB4NGEsMHhlYywweDM4LDB4ZTIpCUAgc2hhMXN1MCBxNyxxNCxxNQorCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCA4CisJSU5TVCgweDY4LDB4MGMsMHgxNCwweGUyKQlAIHNoYTFwIHEwLHEyLHExMgorCXZhZGQuaTMyCXExMixxMTAscTYKKwlJTlNUKDB4OGMsMHhlMywweGJhLDB4ZjMpCUAgc2hhMXN1MSBxNyxxNgorCUlOU1QoMHg0YywweDhjLDB4M2EsMHhlMikJQCBzaGExc3UwIHE0LHE1LHE2CisJSU5TVCgweGMwLDB4NDIsMHhiOSwweGYzKQlAIHNoYTFoIHEyLHEwCQlAIDkKKwlJTlNUKDB4NmEsMHgwYywweDE2LDB4ZTIpCUAgc2hhMXAgcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHExMCxxNworCUlOU1QoMHg4ZSwweDgzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE0LHE3CisJSU5TVCgweDRlLDB4YWMsMHgzYywweGUyKQlAIHNoYTFzdTAgcTUscTYscTcKKwlJTlNUKDB4YzAsMHg2MiwweGI5LDB4ZjMpCUAgc2hhMWggcTMscTAJCUAgMTAKKwlJTlNUKDB4NjgsMHgwYywweDI0LDB4ZTIpCUAgc2hhMW0gcTAscTIscTEyCisJdmFkZC5pMzIJcTEyLHExMCxxNAorCUlOU1QoMHg4OCwweGEzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE1LHE0CisJSU5TVCgweDQ4LDB4Y2MsMHgzZSwweGUyKQlAIHNoYTFzdTAgcTYscTcscTQKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgMTEKKwlJTlNUKDB4NmEsMHgwYywweDI2LDB4ZTIpCUAgc2hhMW0gcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHExMCxxNQorCUlOU1QoMHg4YSwweGMzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE2LHE1CisJSU5TVCgweDRhLDB4ZWMsMHgzOCwweGUyKQlAIHNoYTFzdTAgcTcscTQscTUKKwlJTlNUKDB4YzAsMHg2MiwweGI5LDB4ZjMpCUAgc2hhMWggcTMscTAJCUAgMTIKKwlJTlNUKDB4NjgsMHgwYywweDI0LDB4ZTIpCUAgc2hhMW0gcTAscTIscTEyCisJdmFkZC5pMzIJcTEyLHExMCxxNgorCUlOU1QoMHg4YywweGUzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE3LHE2CisJSU5TVCgweDRjLDB4OGMsMHgzYSwweGUyKQlAIHNoYTFzdTAgcTQscTUscTYKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgMTMKKwlJTlNUKDB4NmEsMHgwYywweDI2LDB4ZTIpCUAgc2hhMW0gcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHExMSxxNworCUlOU1QoMHg4ZSwweDgzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE0LHE3CisJSU5TVCgweDRlLDB4YWMsMHgzYywweGUyKQlAIHNoYTFzdTAgcTUscTYscTcKKwlJTlNUKDB4YzAsMHg2MiwweGI5LDB4ZjMpCUAgc2hhMWggcTMscTAJCUAgMTQKKwlJTlNUKDB4NjgsMHgwYywweDI0LDB4ZTIpCUAgc2hhMW0gcTAscTIscTEyCisJdmFkZC5pMzIJcTEyLHExMSxxNAorCUlOU1QoMHg4OCwweGEzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE1LHE0CisJSU5TVCgweDQ4LDB4Y2MsMHgzZSwweGUyKQlAIHNoYTFzdTAgcTYscTcscTQKKwlJTlNUKDB4YzAsMHg0MiwweGI5LDB4ZjMpCUAgc2hhMWggcTIscTAJCUAgMTUKKwlJTlNUKDB4NmEsMHgwYywweDE2LDB4ZTIpCUAgc2hhMXAgcTAscTMscTEzCisJdmFkZC5pMzIJcTEzLHExMSxxNQorCUlOU1QoMHg4YSwweGMzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE2LHE1CisJSU5TVCgweDRhLDB4ZWMsMHgzOCwweGUyKQlAIHNoYTFzdTAgcTcscTQscTUKKwlJTlNUKDB4YzAsMHg2MiwweGI5LDB4ZjMpCUAgc2hhMWggcTMscTAJCUAgMTYKKwlJTlNUKDB4NjgsMHgwYywweDE0LDB4ZTIpCUAgc2hhMXAgcTAscTIscTEyCisJdmFkZC5pMzIJcTEyLHExMSxxNgorCUlOU1QoMHg4YywweGUzLDB4YmEsMHhmMykJQCBzaGExc3UxIHE3LHE2CisJSU5TVCgweGMwLDB4NDIsMHhiOSwweGYzKQlAIHNoYTFoIHEyLHEwCQlAIDE3CisJSU5TVCgweDZhLDB4MGMsMHgxNiwweGUyKQlAIHNoYTFwIHEwLHEzLHExMworCXZhZGQuaTMyCXExMyxxMTEscTcKKworCUlOU1QoMHhjMCwweDYyLDB4YjksMHhmMykJQCBzaGExaCBxMyxxMAkJQCAxOAorCUlOU1QoMHg2OCwweDBjLDB4MTQsMHhlMikJQCBzaGExcCBxMCxxMixxMTIKKworCUlOU1QoMHhjMCwweDQyLDB4YjksMHhmMykJQCBzaGExaCBxMixxMAkJQCAxOQorCUlOU1QoMHg2YSwweDBjLDB4MTYsMHhlMikJQCBzaGExcCBxMCxxMyxxMTMKKworCXZhZGQuaTMyCXExLHExLHEyCisJdmFkZC5pMzIJcTAscTAscTE0CisJYm5lCS5Mb29wX3Y4CisKKwl2c3QxLjMyCXtxMH0sW3IwXSEKKwl2c3QxLjMyCXtkMlswXX0sW3IwXQorCisJdmxkbWlhCXNwISx7ZDgsZDksZDEwLGQxMSxkMTIsZDEzLGQxNCxkMTV9CisJYngJbHIJCQkJCUAgYnggbHIKKy5zaXplCXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9hcm12OCwuLXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9hcm12OAorI2VuZGlmCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLmNvbW0JT1BFTlNTTF9hcm1jYXBfUCw0LDQKKy5oaWRkZW4JT1BFTlNTTF9hcm1jYXBfUAorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni1hcm12NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1hcm0vY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LWFybXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3OWE3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni1hcm12NC5TCkBAIC0wLDAgKzEsMjgyMyBAQAorI2lmIGRlZmluZWQoX19hcm1fXykKK0AgQ29weXJpZ2h0IDIwMDctMjAxNiBUaGUgT3BlblNTTCBQcm9qZWN0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBPcGVuU1NMIGxpY2Vuc2UgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlCitAIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbiBvYnRhaW4gYSBjb3B5CitAIGluIHRoZSBmaWxlIExJQ0VOU0UgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3IgYXQKK0AgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorCisKK0AgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0AgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BvcGVuc3NsLm9yZz4gZm9yIHRoZSBPcGVuU1NMCitAIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKK0AgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKK0AgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCitACitAIFBlcm1pc3Npb24gdG8gdXNlIHVuZGVyIEdQTCB0ZXJtcyBpcyBncmFudGVkLgorQCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAIFNIQTI1NiBibG9jayBwcm9jZWR1cmUgZm9yIEFSTXY0LiBNYXkgMjAwNy4KKworQCBQZXJmb3JtYW5jZSBpcyB+MnggYmV0dGVyIHRoYW4gZ2NjIDMuNCBnZW5lcmF0ZWQgY29kZSBhbmQgaW4gImFic28tCitAIGx1dGUiIHRlcm1zIGlzIH4yMjUwIGN5Y2xlcyBwZXIgNjQtYnl0ZSBibG9jayBvciB+MzUgY3ljbGVzIHBlcgorQCBieXRlIFtvbiBzaW5nbGUtaXNzdWUgWHNjYWxlIFBYQTI1MCBjb3JlXS4KKworQCBKdWx5IDIwMTAuCitACitAIFJlc2NoZWR1bGluZyBmb3IgZHVhbC1pc3N1ZSBwaXBlbGluZSByZXN1bHRlZCBpbiAyMiUgaW1wcm92ZW1lbnQgb24KK0AgQ29ydGV4IEE4IGNvcmUgYW5kIH4yMCBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLgorCitAIEZlYnJ1YXJ5IDIwMTEuCitACitAIFByb2ZpbGVyLWFzc2lzdGVkIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gcmVzdWx0ZWQgaW4gMTYlCitAIGltcHJvdmVtZW50IG9uIENvcnRleCBBOCBjb3JlIGFuZCB+MTUuNCBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlLgorCitAIFNlcHRlbWJlciAyMDEzLgorQAorQCBBZGQgTkVPTiBpbXBsZW1lbnRhdGlvbi4gT24gQ29ydGV4IEE4IGl0IHdhcyBtZWFzdXJlZCB0byBwcm9jZXNzIG9uZQorQCBieXRlIGluIDEyLjUgY3ljbGVzIG9yIDIzJSBmYXN0ZXIgdGhhbiBpbnRlZ2VyLW9ubHkgY29kZS4gU25hcGRyYWdvbgorQCBTNCBkb2VzIGl0IGluIDEyLjUgY3ljbGVzIHRvbywgYnV0IGl0J3MgNTAlIGZhc3RlciB0aGFuIGludGVnZXItb25seQorQCBjb2RlIChtZWFuaW5nIHRoYXQgbGF0dGVyIHBlcmZvcm1zIHN1Yi1vcHRpbWFsbHksIG5vdGhpbmcgd2FzIGRvbmUKK0AgYWJvdXQgaXQpLgorCitAIE1heSAyMDE0LgorQAorQCBBZGQgQVJNdjggY29kZSBwYXRoIHBlcmZvcm1pbmcgYXQgMi4wIGNwYiBvbiBBcHBsZSBBNy4KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KKyNlbHNlCisjIGRlZmluZSBfX0FSTV9BUkNIX18gX19MSU5VWF9BUk1fQVJDSF9fCisjIGRlZmluZSBfX0FSTV9NQVhfQVJDSF9fIDcKKyNlbmRpZgorCitAIFNpbGVuY2UgQVJNdjggZGVwcmVjYXRlZCBJVCBpbnN0cnVjdGlvbiB3YXJuaW5ncy4gVGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aAorQCBBUk12NyBhbmQgQVJNdjggcHJvY2Vzc29ycy4gSXQgZG9lcyBoYXZlIEFSTXY4LW9ubHkgY29kZSwgYnV0IHRob3NlCitAIGluc3RydWN0aW9ucyBhcmUgbWFudWFsbHktZW5jb2RlZC4gKFNlZSB1bnNoYTI1Ni4pCisuYXJjaAlhcm12Ny1hCisKKy50ZXh0CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorLnN5bnRheAl1bmlmaWVkCisudGh1bWIKKyNlbHNlCisuY29kZQkzMgorI2VuZGlmCisKKy50eXBlCUsyNTYsJW9iamVjdAorLmFsaWduCTUKK0syNTY6Cisud29yZAkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1Cisud29yZAkweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1Cisud29yZAkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzCisud29yZAkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0Cisud29yZAkweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjCisud29yZAkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhCisud29yZAkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3Cisud29yZAkweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3Cisud29yZAkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzCisud29yZAkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1Cisud29yZAkweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzCisud29yZAkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwCisud29yZAkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1Cisud29yZAkweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzCisud29yZAkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4Cisud29yZAkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisuc2l6ZQlLMjU2LC4tSzI1NgorLndvcmQJMAkJCQlAIHRlcm1pbmF0b3IKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03ICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisuTE9QRU5TU0xfYXJtY2FwOgorLndvcmQJT1BFTlNTTF9hcm1jYXBfUC0uTHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisjZW5kaWYKKy5hbGlnbgk1CisKKy5nbG9ibAlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLmhpZGRlbglzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKy5Mc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CisjaWYgX19BUk1fQVJDSF9fPDcgJiYgIWRlZmluZWQoX190aHVtYjJfXykKKwlzdWIJcjMscGMsIzgJCUAgc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKyNlbHNlCisJYWRyCXIzLC5Mc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKyNlbmRpZgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKwlsZHIJcjEyLC5MT1BFTlNTTF9hcm1jYXAKKwlsZHIJcjEyLFtyMyxyMTJdCQlAIE9QRU5TU0xfYXJtY2FwX1AKKyNpZmRlZglfX0FQUExFX18KKwlsZHIJcjEyLFtyMTJdCisjZW5kaWYKKwl0c3QJcjEyLCNBUk1WOF9TSEEyNTYKKwlibmUJLkxBUk12OAorCXRzdAlyMTIsI0FSTVY3X05FT04KKwlibmUJLkxORU9OCisjZW5kaWYKKwlhZGQJcjIscjEscjIsbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwlzdG1kYglzcCEse3IwLHIxLHIyLHI0LXIxMSxscn0KKwlsZG1pYQlyMCx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0KKwlzdWIJcjE0LHIzLCMyNTYrMzIJQCBLMjU2CisJc3ViCXNwLHNwLCMxNio0CQlAIGFsbG9jYShYWzE2XSkKKy5Mb29wOgorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQlAIG1hZ2ljCisJZW9yCXIxMixyMTIscjEyCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMAorIyBpZiAwPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI4LHI4LHJvciM1CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCAwCisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMTIsbHNsIzgKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAwPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI4LHI4LHJvciM1CisJb3JyCXIyLHIyLHIxMixsc2wjMjQKKwllb3IJcjAscjAscjgscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMwKjRdCisJZW9yCXIyLHI5LHIxMAorCWFkZAlyMTEscjExLHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI4CisJYWRkCXIxMSxyMTEscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHIxMAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI0LHI0LHJvciMxMQorCWFkZAlyMTEscjExLHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAwPT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDA8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI0LHI1CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzIqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjQscjUJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxNSo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyNCxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjMscjMscjEyCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjcscjcscjExCQkJQCBkKz1oCisJZW9yCXIzLHIzLHI1CQkJQCBNYWooYSxiLGMpCisJYWRkCXIxMSxyMTEscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyMTEscjExLHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMQorIyBpZiAxPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI3LHI3LHJvciM1CisJYWRkCXIxMSxyMTEscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMQorCWFkZAlyMTEscjExLHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIzLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjMsbHNsIzgKKwlsZHJiCXIzLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDE9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjcscjcscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHI3LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxKjRdCisJZW9yCXIyLHI4LHI5CisJYWRkCXIxMCxyMTAscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjcKKwlhZGQJcjEwLHIxMCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyMTEscjQJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMyo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHIxMSxyNAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzAqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjExLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjYscjYscjEwCQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjQJCQlAIE1haihhLGIsYykKKwlhZGQJcjEwLHIxMCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMgorIyBpZiAyPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI2LHI2LHJvciM1CisJYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjYscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDIKKwlhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNixyNixyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOSxyOSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzIqNF0KKwllb3IJcjIscjcscjgKKwlhZGQJcjkscjkscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjYKKwlhZGQJcjkscjkscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI4CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwlhZGQJcjkscjkscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM0KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHIxMCxyMTEJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHIxMCxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjMscjMscjEyCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjUscjUscjkJCQlAIGQrPWgKKwllb3IJcjMscjMscjExCQkJQCBNYWooYSxiLGMpCisJYWRkCXI5LHI5LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAzCisjIGlmIDM9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjUscjUscm9yIzUKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMworCWFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAzPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI1LHI1LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyNSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOCxyOCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzMqNF0KKwllb3IJcjIscjYscjcKKwlhZGQJcjgscjgscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjUKKwlhZGQJcjgscjgscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjcJCQlAIENoKGUsZixnKQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwlhZGQJcjgscjgscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDM9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjNSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI5LHIxMAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzIqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjkscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNCxyNCxyOAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHIxMAkJCUAgTWFqKGEsYixjKQorCWFkZAlyOCxyOCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI4LHI4LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDQKKyMgaWYgND09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNCxyNCxyb3IjNQorCWFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNAorCWFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgND09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNCxyNCxyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNyxyNyxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzQqNF0KKwllb3IJcjIscjUscjYKKwlhZGQJcjcscjcscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjQKKwlhZGQJcjcscjcscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI2CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjgscjgscm9yIzExCisJYWRkCXI3LHI3LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA0PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDQ8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzYqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA1CisjIGlmIDU9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNQorCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiA1PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNixyNixyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzUqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA1PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDU8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjcscjgJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjNyo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjNCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyNyxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXIxMCxyMTAscjYJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyOAkJCUAgTWFqKGEsYixjKQorCWFkZAlyNixyNixyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDYKKyMgaWYgNj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNgorCWFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgNj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTAscjEwLHJvciM1CisJb3JyCXIyLHIyLHIxMixsc2wjMjQKKwllb3IJcjAscjAscjEwLHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNSxyNSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzYqNF0KKwllb3IJcjIscjExLHI0CisJYWRkCXI1LHI1LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHIxMAorCWFkZAlyNSxyNSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjQJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNixyNixyb3IjMTEKKwlhZGQJcjUscjUscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDY9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgNjwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjOCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzUqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjYscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI5LHI5LHI1CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI3CQkJQCBNYWooYSxiLGMpCisJYWRkCXI1LHI1LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA3CisjIGlmIDc9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjkscjkscm9yIzUKKwlhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyOSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNworCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiA3PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI5LHI5LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyOSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNCxyNCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzcqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDc9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgNzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM5KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjUscjYJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM2KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI1LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjgscjgscjQJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNCxyNCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDgKKyMgaWYgOD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOCxyOCxyb3IjNQorCWFkZAlyNCxyNCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyOCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgOAorCWFkZAlyNCxyNCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgOD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOCxyOCxyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyMTEscjExLHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjOCo0XQorCWVvcglyMixyOSxyMTAKKwlhZGQJcjExLHIxMSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOAorCWFkZAlyMTEscjExLHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTAJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNCxyNCxyb3IjMTEKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgOD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiA4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzcqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDkKKyMgaWYgOT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNyxyNyxyb3IjNQorCWFkZAlyMTEscjExLHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjcscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDkKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiA5PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI3LHI3LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyMTAscjEwLHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjOSo0XQorCWVvcglyMixyOCxyOQorCWFkZAlyMTAscjEwLHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI3CisJYWRkCXIxMCxyMTAscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjkJCQlAIENoKGUsZixnKQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCWFkZAlyMTAscjEwLHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA5PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDk8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzExKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjOCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxMAorIyBpZiAxMD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNixyNixyb3IjNQorCWFkZAlyMTAscjEwLHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCAxMAorCWFkZAlyMTAscjEwLHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMTIsbHNsIzgKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAxMD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNixyNixyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOSxyOSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzEwKjRdCisJZW9yCXIyLHI3LHI4CisJYWRkCXI5LHI5LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI2CisJYWRkCXI5LHI5LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMCxyMTAscm9yIzExCisJYWRkCXI5LHI5LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxMD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxMDwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMio0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyMTAscjExCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjOSo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTAscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI1LHI1LHI5CQkJQCBkKz1oCisJZW9yCXIzLHIzLHIxMQkJCUAgTWFqKGEsYixjKQorCWFkZAlyOSxyOSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI5LHI5LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTEKKyMgaWYgMTE9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjUscjUscm9yIzUKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTEKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMTE9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjUscjUscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHI1LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTEqNF0KKwllb3IJcjIscjYscjcKKwlhZGQJcjgscjgscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjUKKwlhZGQJcjgscjgscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjcJCQlAIENoKGUsZixnKQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwlhZGQJcjgscjgscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDExPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDExPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI5LHIxMAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMyo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI5LHIxMAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEwKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI5LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjQscjQscjgJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyMTAJCQlAIE1haihhLGIsYykKKwlhZGQJcjgscjgscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxMgorIyBpZiAxMj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNCxyNCxyb3IjNQorCWFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTIKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDEyPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI0LHI0LHJvciM1CisJb3JyCXIyLHIyLHIxMixsc2wjMjQKKwllb3IJcjAscjAscjQscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI3LHI3LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTIqNF0KKwllb3IJcjIscjUscjYKKwlhZGQJcjcscjcscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjQKKwlhZGQJcjcscjcscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI2CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjgscjgscm9yIzExCisJYWRkCXI3LHI3LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxMj09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxMjwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTQqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxMSo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyOCxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjMscjMscjEyCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjExLHIxMSxyNwkJCUAgZCs9aAorCWVvcglyMyxyMyxyOQkJCUAgTWFqKGEsYixjKQorCWFkZAlyNyxyNyxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI3LHI3LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTMKKyMgaWYgMTM9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTMKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMTM9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCW9ycglyMixyMixyMyxsc2wjMjQKKwllb3IJcjAscjAscjExLHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTMqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxMz09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxMzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTIqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjcscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTAscjEwLHI2CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjgJCQlAIE1haihhLGIsYykKKwlhZGQJcjYscjYscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxNAorIyBpZiAxND09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTQKKwlhZGQJcjYscjYscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDE0PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHIxMCxyMTAscm9yIzUKKwlvcnIJcjIscjIscjEyLGxzbCMyNAorCWVvcglyMCxyMCxyMTAscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTQqNF0KKwllb3IJcjIscjExLHI0CisJYWRkCXI1LHI1LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHIxMAorCWFkZAlyNSxyNSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjQJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNixyNixyb3IjMTEKKwlhZGQJcjUscjUscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE0PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE0PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMwKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI2LHI3CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTMqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjYscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI5LHI5LHI1CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI3CQkJQCBNYWooYSxiLGMpCisJYWRkCXI1LHI1LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxNQorIyBpZiAxNT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOSxyOSxyb3IjNQorCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI5LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCAxNQorCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAxNT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOSxyOSxyb3IjNQorCW9ycglyMixyMixyMyxsc2wjMjQKKwllb3IJcjAscjAscjkscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjQscjQscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxNSo0XQorCWVvcglyMixyMTAscjExCisJYWRkCXI0LHI0LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI5CisJYWRkCXI0LHI0LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHIxMQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI1LHI1LHJvciMxMQorCWFkZAlyNCxyNCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTU9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTU8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjUscjYJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTQqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjUscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOCxyOCxyNAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI2CQkJQCBNYWooYSxiLGMpCisJYWRkCXI0LHI0LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpCisuTHJvdW5kc18xNl94eDoKKwlAIGxkcglyMixbc3AsIzEqNF0JCUAgMTYKKwlAIGxkcglyMSxbc3AsIzE0KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMwKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjOSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjgscjgscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzAqNF0KKwllb3IJcjIscjkscjEwCisJYWRkCXIxMSxyMTEscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjgKKwlhZGQJcjExLHIxMSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjQscjQscm9yIzExCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE2PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE2PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMyKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI0LHI1CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTUqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMio0XQkJQCAxNworCUAgbGRyCXIxLFtzcCwjMTUqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxKjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzEwKjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjcscjcscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjcscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxKjRdCisJZW9yCXIyLHI4LHI5CisJYWRkCXIxMCxyMTAscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjcKKwlhZGQJcjEwLHIxMCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE3PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE3PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHIxMSxyNAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMzKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzMqNF0JCUAgMTgKKwlAIGxkcglyMSxbc3AsIzAqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMTIscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMTIscjEyLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMio0XQorCWVvcglyMTIscjEyLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzExKjRdCisKKwlhZGQJcjEyLHIxMixyMAorCWVvcglyMCxyNixyNixyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMTIKKwllb3IJcjAscjAscjYscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOSxyOSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzIqNF0KKwllb3IJcjIscjcscjgKKwlhZGQJcjkscjkscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjYKKwlhZGQJcjkscjkscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI4CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwlhZGQJcjkscjkscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE4PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyMTAscjExCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzQqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjEwLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNSxyNSxyOQkJCUAgZCs9aAorCWVvcglyMyxyMyxyMTEJCQlAIE1haihhLGIsYykKKwlhZGQJcjkscjkscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjNCo0XQkJQCAxOQorCUAgbGRyCXIxLFtzcCwjMSo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMzKjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzEyKjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjUscjUscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjUscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMyo0XQorCWVvcglyMixyNixyNworCWFkZAlyOCxyOCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNQorCWFkZAlyOCxyOCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNwkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI5LHI5LHJvciMxMQorCWFkZAlyOCxyOCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTk9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTk8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjkscjEwCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzUqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMyKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI5LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjQscjQscjgJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyMTAJCQlAIE1haihhLGIsYykKKwlhZGQJcjgscjgscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzUqNF0JCUAgMjAKKwlAIGxkcglyMSxbc3AsIzIqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzQqNF0KKwllb3IJcjEyLHIxMixyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCMxMyo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjQscjQscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjcscjcscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCM0KjRdCisJZW9yCXIyLHI1LHI2CisJYWRkCXI3LHI3LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI0CisJYWRkCXI3LHI3LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNgkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWFkZAlyNyxyNyxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjA9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjA8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzYqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzYqNF0JCUAgMjEKKwlAIGxkcglyMSxbc3AsIzMqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMyxyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIzLHIzLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjNSo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCMxNCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHIxMSxyMTEscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjExLHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNixyNixyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzUqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyMT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyMTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM3KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjcscjgJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM0KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI3LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjEwLHIxMCxyNgkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI4CQkJQCBNYWooYSxiLGMpCisJYWRkCXI2LHI2LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjYscjYscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM3KjRdCQlAIDIyCisJQCBsZHIJcjEsW3NwLCM0KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM2KjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMTUqNF0KKworCWFkZAlyMTIscjEyLHIwCisJZW9yCXIwLHIxMCxyMTAscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKwlhZGQJcjIscjIscjEJCQlAIFhbaV0KKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjNio0XQorCWVvcglyMixyMTEscjQKKwlhZGQJcjUscjUscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjEwCisJYWRkCXI1LHI1LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWFkZAlyNSxyNSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjI9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjI8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI2LHI3CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzgqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM1KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM4KjRdCQlAIDIzCisJQCBsZHIJcjEsW3NwLCM1KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjMscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMyxyMyxyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzcqNF0KKwllb3IJcjMscjMscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHI5LHI5LHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIzCisJZW9yCXIwLHIwLHI5LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNCxyNCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzcqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDIzPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDIzPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzkqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzYqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjUscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOCxyOCxyNAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI2CQkJQCBNYWooYSxiLGMpCisJYWRkCXI0LHI0LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM5KjRdCQlAIDI0CisJQCBsZHIJcjEsW3NwLCM2KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM4KjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjgscjgscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzgqNF0KKwllb3IJcjIscjkscjEwCisJYWRkCXIxMSxyMTEscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjgKKwlhZGQJcjExLHIxMSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjQscjQscm9yIzExCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI0PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDI0PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzcqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMTAqNF0JCUAgMjUKKwlAIGxkcglyMSxbc3AsIzcqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM5KjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzIqNF0KKworCWFkZAlyMyxyMyxyMAorCWVvcglyMCxyNyxyNyxyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMworCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKwlhZGQJcjIscjIscjEJCQlAIFhbaV0KKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzkqNF0KKwllb3IJcjIscjgscjkKKwlhZGQJcjEwLHIxMCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNworCWFkZAlyMTAscjEwLHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI5CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjExLHIxMSxyb3IjMTEKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjU9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjU8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzExKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjOCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzExKjRdCQlAIDI2CisJQCBsZHIJcjEsW3NwLCM4KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzEwKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMyo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjYscjYscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjkscjkscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxMCo0XQorCWVvcglyMixyNyxyOAorCWFkZAlyOSxyOSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNgorCWFkZAlyOSxyOSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjgJCQlAIENoKGUsZixnKQorCWVvcglyMCxyMTAscjEwLHJvciMxMQorCWFkZAlyOSxyOSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjY9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjY8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHIxMCxyMTEJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTIqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzkqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjEwLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNSxyNSxyOQkJCUAgZCs9aAorCWVvcglyMyxyMyxyMTEJCQlAIE1haihhLGIsYykKKwlhZGQJcjkscjkscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMTIqNF0JCUAgMjcKKwlAIGxkcglyMSxbc3AsIzkqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMyxyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIzLHIzLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMTEqNF0KKwllb3IJcjMscjMscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjNCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHI1LHI1LHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIzCisJZW9yCXIwLHIwLHI1LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOCxyOCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzExKjRdCisJZW9yCXIyLHI2LHI3CisJYWRkCXI4LHI4LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI1CisJYWRkCXI4LHI4LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI3CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjkscjkscm9yIzExCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyNz09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyNzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTMqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxMCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyOSxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI0LHI0LHI4CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjEwCQkJQCBNYWooYSxiLGMpCisJYWRkCXI4LHI4LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCMxMyo0XQkJQCAyOAorCUAgbGRyCXIxLFtzcCwjMTAqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzEyKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjNSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjQscjQscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjcscjcscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxMio0XQorCWVvcglyMixyNSxyNgorCWFkZAlyNyxyNyxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNAorCWFkZAlyNyxyNyxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjYJCQlAIENoKGUsZixnKQorCWVvcglyMCxyOCxyOCxyb3IjMTEKKwlhZGQJcjcscjcscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI4PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDI4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyOCxyOQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyOCxyOQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzExKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzE0KjRdCQlAIDI5CisJQCBsZHIJcjEsW3NwLCMxMSo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxMyo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM2KjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjExLHIxMSxyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMworCWVvcglyMCxyMCxyMTEscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTMqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyOT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyOTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTIqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjcscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTAscjEwLHI2CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjgJCQlAIE1haihhLGIsYykKKwlhZGQJcjYscjYscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzE1KjRdCQlAIDMwCisJQCBsZHIJcjEsW3NwLCMxMio0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMTIscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMTIscjEyLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMTQqNF0KKwllb3IJcjEyLHIxMixyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM3KjRdCisKKwlhZGQJcjEyLHIxMixyMAorCWVvcglyMCxyMTAscjEwLHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIxMgorCWVvcglyMCxyMCxyMTAscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNSxyNSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzE0KjRdCisJZW9yCXIyLHIxMSxyNAorCWFkZAlyNSxyNSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyMTAKKwlhZGQJcjUscjUscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI0CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjYscjYscm9yIzExCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAzMD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAzMDwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCMwKjRdCQlAIDMxCisJQCBsZHIJcjEsW3NwLCMxMyo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxNSo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM4KjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjkscjkscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjkscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI0LHI0LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTUqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDMxPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDMxPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzEqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzE0KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI1LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjgscjgscjQJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNCxyNCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCWl0ZQllcQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlsZHJlcQlyMyxbc3AsIzE2KjRdCQlAIHB1bGwgY3R4CisJYm5lCS5Mcm91bmRzXzE2X3h4CisKKwlhZGQJcjQscjQscjEyCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcglyMCxbcjMsIzBdCisJbGRyCXIyLFtyMywjNF0KKwlsZHIJcjEyLFtyMywjOF0KKwlhZGQJcjQscjQscjAKKwlsZHIJcjAsW3IzLCMxMl0KKwlhZGQJcjUscjUscjIKKwlsZHIJcjIsW3IzLCMxNl0KKwlhZGQJcjYscjYscjEyCisJbGRyCXIxMixbcjMsIzIwXQorCWFkZAlyNyxyNyxyMAorCWxkcglyMCxbcjMsIzI0XQorCWFkZAlyOCxyOCxyMgorCWxkcglyMixbcjMsIzI4XQorCWFkZAlyOSxyOSxyMTIKKwlsZHIJcjEsW3NwLCMxNyo0XQkJQCBwdWxsIGlucAorCWxkcglyMTIsW3NwLCMxOCo0XQkJQCBwdWxsIGlucCtsZW4KKwlhZGQJcjEwLHIxMCxyMAorCWFkZAlyMTEscjExLHIyCisJc3RtaWEJcjMse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTF9CisJY21wCXIxLHIxMgorCXN1YglyMTQscjE0LCMyNTYJQCByZXdpbmQgS3RibAorCWJuZQkuTG9vcAorCisJYWRkCXNwLHNwLCMxOSo0CUAgZGVzdHJveSBmcmFtZQorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKy53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKyNlbmRpZgorLnNpemUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIsLi1zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKy5hcmNoCWFybXY3LWEKKy5mcHUJbmVvbgorCisuZ2xvYmwJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorLmhpZGRlbglzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uCisudHlwZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uLCVmdW5jdGlvbgorLmFsaWduCTUKKy5za2lwCTE2CitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uOgorLkxORU9OOgorCXN0bWRiCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9CisKKwlzdWIJcjExLHNwLCMxNio0KzE2CisJYWRyCXIxNCxLMjU2CisJYmljCXIxMSxyMTEsIzE1CQlAIGFsaWduIGZvciAxMjgtYml0IHN0b3JlcworCW1vdglyMTIsc3AKKwltb3YJc3AscjExCQkJQCBhbGxvY2EKKwlhZGQJcjIscjEscjIsbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKworCXZsZDEuOAl7cTB9LFtyMV0hCisJdmxkMS44CXtxMX0sW3IxXSEKKwl2bGQxLjgJe3EyfSxbcjFdIQorCXZsZDEuOAl7cTN9LFtyMV0hCisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJdmxkMS4zMgl7cTl9LFtyMTQsOjEyOF0hCisJdmxkMS4zMgl7cTEwfSxbcjE0LDoxMjhdIQorCXZsZDEuMzIJe3ExMX0sW3IxNCw6MTI4XSEKKwl2cmV2MzIuOAlxMCxxMAkJQCB5ZXMsIGV2ZW4gb24KKwlzdHIJcjAsW3NwLCM2NF0KKwl2cmV2MzIuOAlxMSxxMQkJQCBiaWctZW5kaWFuCisJc3RyCXIxLFtzcCwjNjhdCisJbW92CXIxLHNwCisJdnJldjMyLjgJcTIscTIKKwlzdHIJcjIsW3NwLCM3Ml0KKwl2cmV2MzIuOAlxMyxxMworCXN0cglyMTIsW3NwLCM3Nl0JCUAgc2F2ZSBvcmlnaW5hbCBzcAorCXZhZGQuaTMyCXE4LHE4LHEwCisJdmFkZC5pMzIJcTkscTkscTEKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCXZhZGQuaTMyCXExMCxxMTAscTIKKwl2c3QxLjMyCXtxOX0sW3IxLDoxMjhdIQorCXZhZGQuaTMyCXExMSxxMTEscTMKKwl2c3QxLjMyCXtxMTB9LFtyMSw6MTI4XSEKKwl2c3QxLjMyCXtxMTF9LFtyMSw6MTI4XSEKKworCWxkbWlhCXIwLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQorCXN1YglyMSxyMSwjNjQKKwlsZHIJcjIsW3NwLCMwXQorCWVvcglyMTIscjEyLHIxMgorCWVvcglyMyxyNSxyNgorCWIJLkxfMDBfNDgKKworLmFsaWduCTQKKy5MXzAwXzQ4OgorCXZleHQuOAlxOCxxMCxxMSwjNAorCWFkZAlyMTEscjExLHIyCisJZW9yCXIyLHI5LHIxMAorCWVvcglyMCxyOCxyOCxyb3IjNQorCXZleHQuOAlxOSxxMixxMywjNAorCWFkZAlyNCxyNCxyMTIKKwlhbmQJcjIscjIscjgKKwllb3IJcjEyLHIwLHI4LHJvciMxOQorCXZzaHIudTMyCXExMCxxOCwjNworCWVvcglyMCxyNCxyNCxyb3IjMTEKKwllb3IJcjIscjIscjEwCisJdmFkZC5pMzIJcTAscTAscTkKKwlhZGQJcjExLHIxMSxyMTIscm9yIzYKKwllb3IJcjEyLHI0LHI1CisJdnNoci51MzIJcTkscTgsIzMKKwllb3IJcjAscjAscjQscm9yIzIwCisJYWRkCXIxMSxyMTEscjIKKwl2c2xpLjMyCXExMCxxOCwjMjUKKwlsZHIJcjIsW3NwLCM0XQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglxMTEscTgsIzE4CisJYWRkCXI3LHI3LHIxMQorCWFkZAlyMTEscjExLHIwLHJvciMyCisJZW9yCXIzLHIzLHI1CisJdmVvcglxOSxxOSxxMTAKKwlhZGQJcjEwLHIxMCxyMgorCXZzbGkuMzIJcTExLHE4LCMxNAorCWVvcglyMixyOCxyOQorCWVvcglyMCxyNyxyNyxyb3IjNQorCXZzaHIudTMyCWQyNCxkNywjMTcKKwlhZGQJcjExLHIxMSxyMworCWFuZAlyMixyMixyNworCXZlb3IJcTkscTkscTExCisJZW9yCXIzLHIwLHI3LHJvciMxOQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCXZzbGkuMzIJZDI0LGQ3LCMxNQorCWVvcglyMixyMixyOQorCWFkZAlyMTAscjEwLHIzLHJvciM2CisJdnNoci51MzIJZDI1LGQ3LCMxMAorCWVvcglyMyxyMTEscjQKKwllb3IJcjAscjAscjExLHJvciMyMAorCXZhZGQuaTMyCXEwLHEwLHE5CisJYWRkCXIxMCxyMTAscjIKKwlsZHIJcjIsW3NwLCM4XQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNixyNixyMTAKKwl2c2hyLnUzMglkMjQsZDcsIzE5CisJYWRkCXIxMCxyMTAscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNAorCXZzbGkuMzIJZDI0LGQ3LCMxMworCWFkZAlyOSxyOSxyMgorCWVvcglyMixyNyxyOAorCXZlb3IJZDI1LGQyNSxkMjQKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIKKwl2YWRkLmkzMglkMCxkMCxkMjUKKwlhbmQJcjIscjIscjYKKwllb3IJcjEyLHIwLHI2LHJvciMxOQorCXZzaHIudTMyCWQyNCxkMCwjMTcKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwllb3IJcjIscjIscjgKKwl2c2xpLjMyCWQyNCxkMCwjMTUKKwlhZGQJcjkscjkscjEyLHJvciM2CisJZW9yCXIxMixyMTAscjExCisJdnNoci51MzIJZDI1LGQwLCMxMAorCWVvcglyMCxyMCxyMTAscm9yIzIwCisJYWRkCXI5LHI5LHIyCisJdmVvcglkMjUsZDI1LGQyNAorCWxkcglyMixbc3AsIzEyXQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglkMjQsZDAsIzE5CisJYWRkCXI1LHI1LHI5CisJYWRkCXI5LHI5LHIwLHJvciMyCisJZW9yCXIzLHIzLHIxMQorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFkZAlyOCxyOCxyMgorCXZzbGkuMzIJZDI0LGQwLCMxMworCWVvcglyMixyNixyNworCWVvcglyMCxyNSxyNSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjkscjkscjMKKwlhbmQJcjIscjIscjUKKwl2YWRkLmkzMglkMSxkMSxkMjUKKwllb3IJcjMscjAscjUscm9yIzE5CisJZW9yCXIwLHI5LHI5LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHEwCisJZW9yCXIyLHIyLHI3CisJYWRkCXI4LHI4LHIzLHJvciM2CisJZW9yCXIzLHI5LHIxMAorCWVvcglyMCxyMCxyOSxyb3IjMjAKKwlhZGQJcjgscjgscjIKKwlsZHIJcjIsW3NwLCMxNl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNCxyNCxyOAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI4LHI4LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjEwCisJdmV4dC44CXE4LHExLHEyLCM0CisJYWRkCXI3LHI3LHIyCisJZW9yCXIyLHI1LHI2CisJZW9yCXIwLHI0LHI0LHJvciM1CisJdmV4dC44CXE5LHEzLHEwLCM0CisJYWRkCXI4LHI4LHIxMgorCWFuZAlyMixyMixyNAorCWVvcglyMTIscjAscjQscm9yIzE5CisJdnNoci51MzIJcTEwLHE4LCM3CisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWVvcglyMixyMixyNgorCXZhZGQuaTMyCXExLHExLHE5CisJYWRkCXI3LHI3LHIxMixyb3IjNgorCWVvcglyMTIscjgscjkKKwl2c2hyLnUzMglxOSxxOCwjMworCWVvcglyMCxyMCxyOCxyb3IjMjAKKwlhZGQJcjcscjcscjIKKwl2c2xpLjMyCXExMCxxOCwjMjUKKwlsZHIJcjIsW3NwLCMyMF0KKwlhbmQJcjMscjMscjEyCisJdnNoci51MzIJcTExLHE4LCMxOAorCWFkZAlyMTEscjExLHI3CisJYWRkCXI3LHI3LHIwLHJvciMyCisJZW9yCXIzLHIzLHI5CisJdmVvcglxOSxxOSxxMTAKKwlhZGQJcjYscjYscjIKKwl2c2xpLjMyCXExMSxxOCwjMTQKKwllb3IJcjIscjQscjUKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCXZzaHIudTMyCWQyNCxkMSwjMTcKKwlhZGQJcjcscjcscjMKKwlhbmQJcjIscjIscjExCisJdmVvcglxOSxxOSxxMTEKKwllb3IJcjMscjAscjExLHJvciMxOQorCWVvcglyMCxyNyxyNyxyb3IjMTEKKwl2c2xpLjMyCWQyNCxkMSwjMTUKKwllb3IJcjIscjIscjUKKwlhZGQJcjYscjYscjMscm9yIzYKKwl2c2hyLnUzMglkMjUsZDEsIzEwCisJZW9yCXIzLHI3LHI4CisJZW9yCXIwLHIwLHI3LHJvciMyMAorCXZhZGQuaTMyCXExLHExLHE5CisJYWRkCXI2LHI2LHIyCisJbGRyCXIyLFtzcCwjMjRdCisJdmVvcglkMjUsZDI1LGQyNAorCWFuZAlyMTIscjEyLHIzCisJYWRkCXIxMCxyMTAscjYKKwl2c2hyLnUzMglkMjQsZDEsIzE5CisJYWRkCXI2LHI2LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjgKKwl2c2xpLjMyCWQyNCxkMSwjMTMKKwlhZGQJcjUscjUscjIKKwllb3IJcjIscjExLHI0CisJdmVvcglkMjUsZDI1LGQyNAorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgorCXZhZGQuaTMyCWQyLGQyLGQyNQorCWFuZAlyMixyMixyMTAKKwllb3IJcjEyLHIwLHIxMCxyb3IjMTkKKwl2c2hyLnUzMglkMjQsZDIsIzE3CisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWVvcglyMixyMixyNAorCXZzbGkuMzIJZDI0LGQyLCMxNQorCWFkZAlyNSxyNSxyMTIscm9yIzYKKwllb3IJcjEyLHI2LHI3CisJdnNoci51MzIJZDI1LGQyLCMxMAorCWVvcglyMCxyMCxyNixyb3IjMjAKKwlhZGQJcjUscjUscjIKKwl2ZW9yCWQyNSxkMjUsZDI0CisJbGRyCXIyLFtzcCwjMjhdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCWQyNCxkMiwjMTkKKwlhZGQJcjkscjkscjUKKwlhZGQJcjUscjUscjAscm9yIzIKKwllb3IJcjMscjMscjcKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhZGQJcjQscjQscjIKKwl2c2xpLjMyCWQyNCxkMiwjMTMKKwllb3IJcjIscjEwLHIxMQorCWVvcglyMCxyOSxyOSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjUscjUscjMKKwlhbmQJcjIscjIscjkKKwl2YWRkLmkzMglkMyxkMyxkMjUKKwllb3IJcjMscjAscjkscm9yIzE5CisJZW9yCXIwLHI1LHI1LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHExCisJZW9yCXIyLHIyLHIxMQorCWFkZAlyNCxyNCxyMyxyb3IjNgorCWVvcglyMyxyNSxyNgorCWVvcglyMCxyMCxyNSxyb3IjMjAKKwlhZGQJcjQscjQscjIKKwlsZHIJcjIsW3NwLCMzMl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyOCxyOCxyNAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI0LHI0LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjYKKwl2ZXh0LjgJcTgscTIscTMsIzQKKwlhZGQJcjExLHIxMSxyMgorCWVvcglyMixyOSxyMTAKKwllb3IJcjAscjgscjgscm9yIzUKKwl2ZXh0LjgJcTkscTAscTEsIzQKKwlhZGQJcjQscjQscjEyCisJYW5kCXIyLHIyLHI4CisJZW9yCXIxMixyMCxyOCxyb3IjMTkKKwl2c2hyLnUzMglxMTAscTgsIzcKKwllb3IJcjAscjQscjQscm9yIzExCisJZW9yCXIyLHIyLHIxMAorCXZhZGQuaTMyCXEyLHEyLHE5CisJYWRkCXIxMSxyMTEscjEyLHJvciM2CisJZW9yCXIxMixyNCxyNQorCXZzaHIudTMyCXE5LHE4LCMzCisJZW9yCXIwLHIwLHI0LHJvciMyMAorCWFkZAlyMTEscjExLHIyCisJdnNsaS4zMglxMTAscTgsIzI1CisJbGRyCXIyLFtzcCwjMzZdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCXExMSxxOCwjMTgKKwlhZGQJcjcscjcscjExCisJYWRkCXIxMSxyMTEscjAscm9yIzIKKwllb3IJcjMscjMscjUKKwl2ZW9yCXE5LHE5LHExMAorCWFkZAlyMTAscjEwLHIyCisJdnNsaS4zMglxMTEscTgsIzE0CisJZW9yCXIyLHI4LHI5CisJZW9yCXIwLHI3LHI3LHJvciM1CisJdnNoci51MzIJZDI0LGQzLCMxNworCWFkZAlyMTEscjExLHIzCisJYW5kCXIyLHIyLHI3CisJdmVvcglxOSxxOSxxMTEKKwllb3IJcjMscjAscjcscm9yIzE5CisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJdnNsaS4zMglkMjQsZDMsIzE1CisJZW9yCXIyLHIyLHI5CisJYWRkCXIxMCxyMTAscjMscm9yIzYKKwl2c2hyLnUzMglkMjUsZDMsIzEwCisJZW9yCXIzLHIxMSxyNAorCWVvcglyMCxyMCxyMTEscm9yIzIwCisJdmFkZC5pMzIJcTIscTIscTkKKwlhZGQJcjEwLHIxMCxyMgorCWxkcglyMixbc3AsIzQwXQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNixyNixyMTAKKwl2c2hyLnUzMglkMjQsZDMsIzE5CisJYWRkCXIxMCxyMTAscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNAorCXZzbGkuMzIJZDI0LGQzLCMxMworCWFkZAlyOSxyOSxyMgorCWVvcglyMixyNyxyOAorCXZlb3IJZDI1LGQyNSxkMjQKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIKKwl2YWRkLmkzMglkNCxkNCxkMjUKKwlhbmQJcjIscjIscjYKKwllb3IJcjEyLHIwLHI2LHJvciMxOQorCXZzaHIudTMyCWQyNCxkNCwjMTcKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwllb3IJcjIscjIscjgKKwl2c2xpLjMyCWQyNCxkNCwjMTUKKwlhZGQJcjkscjkscjEyLHJvciM2CisJZW9yCXIxMixyMTAscjExCisJdnNoci51MzIJZDI1LGQ0LCMxMAorCWVvcglyMCxyMCxyMTAscm9yIzIwCisJYWRkCXI5LHI5LHIyCisJdmVvcglkMjUsZDI1LGQyNAorCWxkcglyMixbc3AsIzQ0XQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglkMjQsZDQsIzE5CisJYWRkCXI1LHI1LHI5CisJYWRkCXI5LHI5LHIwLHJvciMyCisJZW9yCXIzLHIzLHIxMQorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFkZAlyOCxyOCxyMgorCXZzbGkuMzIJZDI0LGQ0LCMxMworCWVvcglyMixyNixyNworCWVvcglyMCxyNSxyNSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjkscjkscjMKKwlhbmQJcjIscjIscjUKKwl2YWRkLmkzMglkNSxkNSxkMjUKKwllb3IJcjMscjAscjUscm9yIzE5CisJZW9yCXIwLHI5LHI5LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHEyCisJZW9yCXIyLHIyLHI3CisJYWRkCXI4LHI4LHIzLHJvciM2CisJZW9yCXIzLHI5LHIxMAorCWVvcglyMCxyMCxyOSxyb3IjMjAKKwlhZGQJcjgscjgscjIKKwlsZHIJcjIsW3NwLCM0OF0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNCxyNCxyOAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI4LHI4LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjEwCisJdmV4dC44CXE4LHEzLHEwLCM0CisJYWRkCXI3LHI3LHIyCisJZW9yCXIyLHI1LHI2CisJZW9yCXIwLHI0LHI0LHJvciM1CisJdmV4dC44CXE5LHExLHEyLCM0CisJYWRkCXI4LHI4LHIxMgorCWFuZAlyMixyMixyNAorCWVvcglyMTIscjAscjQscm9yIzE5CisJdnNoci51MzIJcTEwLHE4LCM3CisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWVvcglyMixyMixyNgorCXZhZGQuaTMyCXEzLHEzLHE5CisJYWRkCXI3LHI3LHIxMixyb3IjNgorCWVvcglyMTIscjgscjkKKwl2c2hyLnUzMglxOSxxOCwjMworCWVvcglyMCxyMCxyOCxyb3IjMjAKKwlhZGQJcjcscjcscjIKKwl2c2xpLjMyCXExMCxxOCwjMjUKKwlsZHIJcjIsW3NwLCM1Ml0KKwlhbmQJcjMscjMscjEyCisJdnNoci51MzIJcTExLHE4LCMxOAorCWFkZAlyMTEscjExLHI3CisJYWRkCXI3LHI3LHIwLHJvciMyCisJZW9yCXIzLHIzLHI5CisJdmVvcglxOSxxOSxxMTAKKwlhZGQJcjYscjYscjIKKwl2c2xpLjMyCXExMSxxOCwjMTQKKwllb3IJcjIscjQscjUKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCXZzaHIudTMyCWQyNCxkNSwjMTcKKwlhZGQJcjcscjcscjMKKwlhbmQJcjIscjIscjExCisJdmVvcglxOSxxOSxxMTEKKwllb3IJcjMscjAscjExLHJvciMxOQorCWVvcglyMCxyNyxyNyxyb3IjMTEKKwl2c2xpLjMyCWQyNCxkNSwjMTUKKwllb3IJcjIscjIscjUKKwlhZGQJcjYscjYscjMscm9yIzYKKwl2c2hyLnUzMglkMjUsZDUsIzEwCisJZW9yCXIzLHI3LHI4CisJZW9yCXIwLHIwLHI3LHJvciMyMAorCXZhZGQuaTMyCXEzLHEzLHE5CisJYWRkCXI2LHI2LHIyCisJbGRyCXIyLFtzcCwjNTZdCisJdmVvcglkMjUsZDI1LGQyNAorCWFuZAlyMTIscjEyLHIzCisJYWRkCXIxMCxyMTAscjYKKwl2c2hyLnUzMglkMjQsZDUsIzE5CisJYWRkCXI2LHI2LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjgKKwl2c2xpLjMyCWQyNCxkNSwjMTMKKwlhZGQJcjUscjUscjIKKwllb3IJcjIscjExLHI0CisJdmVvcglkMjUsZDI1LGQyNAorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgorCXZhZGQuaTMyCWQ2LGQ2LGQyNQorCWFuZAlyMixyMixyMTAKKwllb3IJcjEyLHIwLHIxMCxyb3IjMTkKKwl2c2hyLnUzMglkMjQsZDYsIzE3CisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWVvcglyMixyMixyNAorCXZzbGkuMzIJZDI0LGQ2LCMxNQorCWFkZAlyNSxyNSxyMTIscm9yIzYKKwllb3IJcjEyLHI2LHI3CisJdnNoci51MzIJZDI1LGQ2LCMxMAorCWVvcglyMCxyMCxyNixyb3IjMjAKKwlhZGQJcjUscjUscjIKKwl2ZW9yCWQyNSxkMjUsZDI0CisJbGRyCXIyLFtzcCwjNjBdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCWQyNCxkNiwjMTkKKwlhZGQJcjkscjkscjUKKwlhZGQJcjUscjUscjAscm9yIzIKKwllb3IJcjMscjMscjcKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhZGQJcjQscjQscjIKKwl2c2xpLjMyCWQyNCxkNiwjMTMKKwllb3IJcjIscjEwLHIxMQorCWVvcglyMCxyOSxyOSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjUscjUscjMKKwlhbmQJcjIscjIscjkKKwl2YWRkLmkzMglkNyxkNyxkMjUKKwllb3IJcjMscjAscjkscm9yIzE5CisJZW9yCXIwLHI1LHI1LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHEzCisJZW9yCXIyLHIyLHIxMQorCWFkZAlyNCxyNCxyMyxyb3IjNgorCWVvcglyMyxyNSxyNgorCWVvcglyMCxyMCxyNSxyb3IjMjAKKwlhZGQJcjQscjQscjIKKwlsZHIJcjIsW3IxNF0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyOCxyOCxyNAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI0LHI0LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjYKKwl0ZXEJcjIsIzAJCQkJQCBjaGVjayBmb3IgSzI1NiB0ZXJtaW5hdG9yCisJbGRyCXIyLFtzcCwjMF0KKwlzdWIJcjEscjEsIzY0CisJYm5lCS5MXzAwXzQ4CisKKwlsZHIJcjEsW3NwLCM2OF0KKwlsZHIJcjAsW3NwLCM3Ml0KKwlzdWIJcjE0LHIxNCwjMjU2CUAgcmV3aW5kIHIxNAorCXRlcQlyMSxyMAorCWl0CWVxCisJc3ViZXEJcjEscjEsIzY0CQlAIGF2b2lkIFNFR1YKKwl2bGQxLjgJe3EwfSxbcjFdIQkJQCBsb2FkIG5leHQgaW5wdXQgYmxvY2sKKwl2bGQxLjgJe3ExfSxbcjFdIQorCXZsZDEuOAl7cTJ9LFtyMV0hCisJdmxkMS44CXtxM30sW3IxXSEKKwlpdAluZQorCXN0cm5lCXIxLFtzcCwjNjhdCisJbW92CXIxLHNwCisJYWRkCXIxMSxyMTEscjIKKwllb3IJcjIscjkscjEwCisJZW9yCXIwLHI4LHI4LHJvciM1CisJYWRkCXI0LHI0LHIxMgorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFuZAlyMixyMixyOAorCWVvcglyMTIscjAscjgscm9yIzE5CisJZW9yCXIwLHI0LHI0LHJvciMxMQorCWVvcglyMixyMixyMTAKKwl2cmV2MzIuOAlxMCxxMAorCWFkZAlyMTEscjExLHIxMixyb3IjNgorCWVvcglyMTIscjQscjUKKwllb3IJcjAscjAscjQscm9yIzIwCisJYWRkCXIxMSxyMTEscjIKKwl2YWRkLmkzMglxOCxxOCxxMAorCWxkcglyMixbc3AsIzRdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyNyxyNyxyMTEKKwlhZGQJcjExLHIxMSxyMCxyb3IjMgorCWVvcglyMyxyMyxyNQorCWFkZAlyMTAscjEwLHIyCisJZW9yCXIyLHI4LHI5CisJZW9yCXIwLHI3LHI3LHJvciM1CisJYWRkCXIxMSxyMTEscjMKKwlhbmQJcjIscjIscjcKKwllb3IJcjMscjAscjcscm9yIzE5CisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJZW9yCXIyLHIyLHI5CisJYWRkCXIxMCxyMTAscjMscm9yIzYKKwllb3IJcjMscjExLHI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMjAKKwlhZGQJcjEwLHIxMCxyMgorCWxkcglyMixbc3AsIzhdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjYscjYscjEwCisJYWRkCXIxMCxyMTAscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNAorCWFkZAlyOSxyOSxyMgorCWVvcglyMixyNyxyOAorCWVvcglyMCxyNixyNixyb3IjNQorCWFkZAlyMTAscjEwLHIxMgorCWFuZAlyMixyMixyNgorCWVvcglyMTIscjAscjYscm9yIzE5CisJZW9yCXIwLHIxMCxyMTAscm9yIzExCisJZW9yCXIyLHIyLHI4CisJYWRkCXI5LHI5LHIxMixyb3IjNgorCWVvcglyMTIscjEwLHIxMQorCWVvcglyMCxyMCxyMTAscm9yIzIwCisJYWRkCXI5LHI5LHIyCisJbGRyCXIyLFtzcCwjMTJdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyNSxyNSxyOQorCWFkZAlyOSxyOSxyMCxyb3IjMgorCWVvcglyMyxyMyxyMTEKKwlhZGQJcjgscjgscjIKKwllb3IJcjIscjYscjcKKwllb3IJcjAscjUscjUscm9yIzUKKwlhZGQJcjkscjkscjMKKwlhbmQJcjIscjIscjUKKwllb3IJcjMscjAscjUscm9yIzE5CisJZW9yCXIwLHI5LHI5LHJvciMxMQorCWVvcglyMixyMixyNworCWFkZAlyOCxyOCxyMyxyb3IjNgorCWVvcglyMyxyOSxyMTAKKwllb3IJcjAscjAscjkscm9yIzIwCisJYWRkCXI4LHI4LHIyCisJbGRyCXIyLFtzcCwjMTZdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjQscjQscjgKKwlhZGQJcjgscjgscjAscm9yIzIKKwllb3IJcjEyLHIxMixyMTAKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCWFkZAlyNyxyNyxyMgorCWVvcglyMixyNSxyNgorCWVvcglyMCxyNCxyNCxyb3IjNQorCWFkZAlyOCxyOCxyMTIKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhbmQJcjIscjIscjQKKwllb3IJcjEyLHIwLHI0LHJvciMxOQorCWVvcglyMCxyOCxyOCxyb3IjMTEKKwllb3IJcjIscjIscjYKKwl2cmV2MzIuOAlxMSxxMQorCWFkZAlyNyxyNyxyMTIscm9yIzYKKwllb3IJcjEyLHI4LHI5CisJZW9yCXIwLHIwLHI4LHJvciMyMAorCWFkZAlyNyxyNyxyMgorCXZhZGQuaTMyCXE4LHE4LHExCisJbGRyCXIyLFtzcCwjMjBdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyMTEscjExLHI3CisJYWRkCXI3LHI3LHIwLHJvciMyCisJZW9yCXIzLHIzLHI5CisJYWRkCXI2LHI2LHIyCisJZW9yCXIyLHI0LHI1CisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwlhZGQJcjcscjcscjMKKwlhbmQJcjIscjIscjExCisJZW9yCXIzLHIwLHIxMSxyb3IjMTkKKwllb3IJcjAscjcscjcscm9yIzExCisJZW9yCXIyLHIyLHI1CisJYWRkCXI2LHI2LHIzLHJvciM2CisJZW9yCXIzLHI3LHI4CisJZW9yCXIwLHIwLHI3LHJvciMyMAorCWFkZAlyNixyNixyMgorCWxkcglyMixbc3AsIzI0XQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXIxMCxyMTAscjYKKwlhZGQJcjYscjYscjAscm9yIzIKKwllb3IJcjEyLHIxMixyOAorCWFkZAlyNSxyNSxyMgorCWVvcglyMixyMTEscjQKKwllb3IJcjAscjEwLHIxMCxyb3IjNQorCWFkZAlyNixyNixyMTIKKwlhbmQJcjIscjIscjEwCisJZW9yCXIxMixyMCxyMTAscm9yIzE5CisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWVvcglyMixyMixyNAorCWFkZAlyNSxyNSxyMTIscm9yIzYKKwllb3IJcjEyLHI2LHI3CisJZW9yCXIwLHIwLHI2LHJvciMyMAorCWFkZAlyNSxyNSxyMgorCWxkcglyMixbc3AsIzI4XQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjkscjkscjUKKwlhZGQJcjUscjUscjAscm9yIzIKKwllb3IJcjMscjMscjcKKwlhZGQJcjQscjQscjIKKwllb3IJcjIscjEwLHIxMQorCWVvcglyMCxyOSxyOSxyb3IjNQorCWFkZAlyNSxyNSxyMworCWFuZAlyMixyMixyOQorCWVvcglyMyxyMCxyOSxyb3IjMTkKKwllb3IJcjAscjUscjUscm9yIzExCisJZW9yCXIyLHIyLHIxMQorCWFkZAlyNCxyNCxyMyxyb3IjNgorCWVvcglyMyxyNSxyNgorCWVvcglyMCxyMCxyNSxyb3IjMjAKKwlhZGQJcjQscjQscjIKKwlsZHIJcjIsW3NwLCMzMl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyOCxyOCxyNAorCWFkZAlyNCxyNCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHI2CisJdnN0MS4zMgl7cTh9LFtyMSw6MTI4XSEKKwlhZGQJcjExLHIxMSxyMgorCWVvcglyMixyOSxyMTAKKwllb3IJcjAscjgscjgscm9yIzUKKwlhZGQJcjQscjQscjEyCisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJYW5kCXIyLHIyLHI4CisJZW9yCXIxMixyMCxyOCxyb3IjMTkKKwllb3IJcjAscjQscjQscm9yIzExCisJZW9yCXIyLHIyLHIxMAorCXZyZXYzMi44CXEyLHEyCisJYWRkCXIxMSxyMTEscjEyLHJvciM2CisJZW9yCXIxMixyNCxyNQorCWVvcglyMCxyMCxyNCxyb3IjMjAKKwlhZGQJcjExLHIxMSxyMgorCXZhZGQuaTMyCXE4LHE4LHEyCisJbGRyCXIyLFtzcCwjMzZdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyNyxyNyxyMTEKKwlhZGQJcjExLHIxMSxyMCxyb3IjMgorCWVvcglyMyxyMyxyNQorCWFkZAlyMTAscjEwLHIyCisJZW9yCXIyLHI4LHI5CisJZW9yCXIwLHI3LHI3LHJvciM1CisJYWRkCXIxMSxyMTEscjMKKwlhbmQJcjIscjIscjcKKwllb3IJcjMscjAscjcscm9yIzE5CisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJZW9yCXIyLHIyLHI5CisJYWRkCXIxMCxyMTAscjMscm9yIzYKKwllb3IJcjMscjExLHI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMjAKKwlhZGQJcjEwLHIxMCxyMgorCWxkcglyMixbc3AsIzQwXQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXI2LHI2LHIxMAorCWFkZAlyMTAscjEwLHIwLHJvciMyCisJZW9yCXIxMixyMTIscjQKKwlhZGQJcjkscjkscjIKKwllb3IJcjIscjcscjgKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIKKwlhbmQJcjIscjIscjYKKwllb3IJcjEyLHIwLHI2LHJvciMxOQorCWVvcglyMCxyMTAscjEwLHJvciMxMQorCWVvcglyMixyMixyOAorCWFkZAlyOSxyOSxyMTIscm9yIzYKKwllb3IJcjEyLHIxMCxyMTEKKwllb3IJcjAscjAscjEwLHJvciMyMAorCWFkZAlyOSxyOSxyMgorCWxkcglyMixbc3AsIzQ0XQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjUscjUscjkKKwlhZGQJcjkscjkscjAscm9yIzIKKwllb3IJcjMscjMscjExCisJYWRkCXI4LHI4LHIyCisJZW9yCXIyLHI2LHI3CisJZW9yCXIwLHI1LHI1LHJvciM1CisJYWRkCXI5LHI5LHIzCisJYW5kCXIyLHIyLHI1CisJZW9yCXIzLHIwLHI1LHJvciMxOQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwllb3IJcjIscjIscjcKKwlhZGQJcjgscjgscjMscm9yIzYKKwllb3IJcjMscjkscjEwCisJZW9yCXIwLHIwLHI5LHJvciMyMAorCWFkZAlyOCxyOCxyMgorCWxkcglyMixbc3AsIzQ4XQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXI0LHI0LHI4CisJYWRkCXI4LHI4LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjEwCisJdnN0MS4zMgl7cTh9LFtyMSw6MTI4XSEKKwlhZGQJcjcscjcscjIKKwllb3IJcjIscjUscjYKKwllb3IJcjAscjQscjQscm9yIzUKKwlhZGQJcjgscjgscjEyCisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJYW5kCXIyLHIyLHI0CisJZW9yCXIxMixyMCxyNCxyb3IjMTkKKwllb3IJcjAscjgscjgscm9yIzExCisJZW9yCXIyLHIyLHI2CisJdnJldjMyLjgJcTMscTMKKwlhZGQJcjcscjcscjEyLHJvciM2CisJZW9yCXIxMixyOCxyOQorCWVvcglyMCxyMCxyOCxyb3IjMjAKKwlhZGQJcjcscjcscjIKKwl2YWRkLmkzMglxOCxxOCxxMworCWxkcglyMixbc3AsIzUyXQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjExLHIxMSxyNworCWFkZAlyNyxyNyxyMCxyb3IjMgorCWVvcglyMyxyMyxyOQorCWFkZAlyNixyNixyMgorCWVvcglyMixyNCxyNQorCWVvcglyMCxyMTEscjExLHJvciM1CisJYWRkCXI3LHI3LHIzCisJYW5kCXIyLHIyLHIxMQorCWVvcglyMyxyMCxyMTEscm9yIzE5CisJZW9yCXIwLHI3LHI3LHJvciMxMQorCWVvcglyMixyMixyNQorCWFkZAlyNixyNixyMyxyb3IjNgorCWVvcglyMyxyNyxyOAorCWVvcglyMCxyMCxyNyxyb3IjMjAKKwlhZGQJcjYscjYscjIKKwlsZHIJcjIsW3NwLCM1Nl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyMTAscjEwLHI2CisJYWRkCXI2LHI2LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjgKKwlhZGQJcjUscjUscjIKKwllb3IJcjIscjExLHI0CisJZW9yCXIwLHIxMCxyMTAscm9yIzUKKwlhZGQJcjYscjYscjEyCisJYW5kCXIyLHIyLHIxMAorCWVvcglyMTIscjAscjEwLHJvciMxOQorCWVvcglyMCxyNixyNixyb3IjMTEKKwllb3IJcjIscjIscjQKKwlhZGQJcjUscjUscjEyLHJvciM2CisJZW9yCXIxMixyNixyNworCWVvcglyMCxyMCxyNixyb3IjMjAKKwlhZGQJcjUscjUscjIKKwlsZHIJcjIsW3NwLCM2MF0KKwlhbmQJcjMscjMscjEyCisJYWRkCXI5LHI5LHI1CisJYWRkCXI1LHI1LHIwLHJvciMyCisJZW9yCXIzLHIzLHI3CisJYWRkCXI0LHI0LHIyCisJZW9yCXIyLHIxMCxyMTEKKwllb3IJcjAscjkscjkscm9yIzUKKwlhZGQJcjUscjUscjMKKwlhbmQJcjIscjIscjkKKwllb3IJcjMscjAscjkscm9yIzE5CisJZW9yCXIwLHI1LHI1LHJvciMxMQorCWVvcglyMixyMixyMTEKKwlhZGQJcjQscjQscjMscm9yIzYKKwllb3IJcjMscjUscjYKKwllb3IJcjAscjAscjUscm9yIzIwCisJYWRkCXI0LHI0LHIyCisJbGRyCXIyLFtzcCwjNjRdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjgscjgscjQKKwlhZGQJcjQscjQscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNgorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJbGRyCXIwLFtyMiwjMF0KKwlhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHIJcjEyLFtyMiwjNF0KKwlsZHIJcjMsW3IyLCM4XQorCWxkcglyMSxbcjIsIzEyXQorCWFkZAlyNCxyNCxyMAkJCUAgYWNjdW11bGF0ZQorCWxkcglyMCxbcjIsIzE2XQorCWFkZAlyNSxyNSxyMTIKKwlsZHIJcjEyLFtyMiwjMjBdCisJYWRkCXI2LHI2LHIzCisJbGRyCXIzLFtyMiwjMjRdCisJYWRkCXI3LHI3LHIxCisJbGRyCXIxLFtyMiwjMjhdCisJYWRkCXI4LHI4LHIwCisJc3RyCXI0LFtyMl0sIzQKKwlhZGQJcjkscjkscjEyCisJc3RyCXI1LFtyMl0sIzQKKwlhZGQJcjEwLHIxMCxyMworCXN0cglyNixbcjJdLCM0CisJYWRkCXIxMSxyMTEscjEKKwlzdHIJcjcsW3IyXSwjNAorCXN0bWlhCXIyLHtyOCxyOSxyMTAscjExfQorCisJaXR0dGUJbmUKKwltb3ZuZQlyMSxzcAorCWxkcm5lCXIyLFtzcCwjMF0KKwllb3JuZQlyMTIscjEyLHIxMgorCWxkcmVxCXNwLFtzcCwjNzZdCQkJQCByZXN0b3JlIG9yaWdpbmFsIHNwCisJaXR0CW5lCisJZW9ybmUJcjMscjUscjYKKwlibmUJLkxfMDBfNDgKKworCWxkbWlhCXNwISx7cjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIscGN9Cisuc2l6ZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uLC4tc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorI2VuZGlmCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorCisjIGlmIGRlZmluZWQoX190aHVtYjJfXykKKyMgIGRlZmluZSBJTlNUKGEsYixjLGQpCS5ieXRlCWMsZHwweGMsYSxiCisjIGVsc2UKKyMgIGRlZmluZSBJTlNUKGEsYixjLGQpCS5ieXRlCWEsYixjLGQKKyMgZW5kaWYKKworLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjgsJWZ1bmN0aW9uCisuYWxpZ24JNQorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjg6CisuTEFSTXY4OgorCXZsZDEuMzIJe3EwLHExfSxbcjBdCisJc3ViCXIzLHIzLCMyNTYrMzIKKwlhZGQJcjIscjEscjIsbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwliCS5Mb29wX3Y4CisKKy5hbGlnbgk0CisuTG9vcF92ODoKKwl2bGQxLjgJe3E4LHE5fSxbcjFdIQorCXZsZDEuOAl7cTEwLHExMX0sW3IxXSEKKwl2bGQxLjMyCXtxMTJ9LFtyM10hCisJdnJldjMyLjgJcTgscTgKKwl2cmV2MzIuOAlxOSxxOQorCXZyZXYzMi44CXExMCxxMTAKKwl2cmV2MzIuOAlxMTEscTExCisJdm1vdglxMTQscTAJQCBvZmZsb2FkCisJdm1vdglxMTUscTEKKwl0ZXEJcjEscjIKKwl2bGQxLjMyCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxOAorCUlOU1QoMHhlMiwweDAzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTgscTkKKwl2bW92CXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlNiwweDBjLDB4NjQsMHhmMykJQCBzaGEyNTZzdTEgcTgscTEwLHExMQorCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHE5CisJSU5TVCgweGU0LDB4MjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOSxxMTAKKwl2bW92CXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlMCwweDJjLDB4NjYsMHhmMykJQCBzaGEyNTZzdTEgcTkscTExLHE4CisJdmxkMS4zMgl7cTEzfSxbcjNdIQorCXZhZGQuaTMyCXExMixxMTIscTEwCisJSU5TVCgweGU2LDB4NDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTAscTExCisJdm1vdglxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKwlJTlNUKDB4ZTIsMHg0YywweDYwLDB4ZjMpCUAgc2hhMjU2c3UxIHExMCxxOCxxOQorCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHExMQorCUlOU1QoMHhlMCwweDYzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTExLHE4CisJdm1vdglxMixxMAorCUlOU1QoMHg2YSwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMworCUlOU1QoMHg2YSwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTMKKwlJTlNUKDB4ZTQsMHg2YywweDYyLDB4ZjMpCUAgc2hhMjU2c3UxIHExMSxxOSxxMTAKKwl2bGQxLjMyCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxOAorCUlOU1QoMHhlMiwweDAzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTgscTkKKwl2bW92CXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlNiwweDBjLDB4NjQsMHhmMykJQCBzaGEyNTZzdTEgcTgscTEwLHExMQorCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHE5CisJSU5TVCgweGU0LDB4MjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOSxxMTAKKwl2bW92CXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlMCwweDJjLDB4NjYsMHhmMykJQCBzaGEyNTZzdTEgcTkscTExLHE4CisJdmxkMS4zMgl7cTEzfSxbcjNdIQorCXZhZGQuaTMyCXExMixxMTIscTEwCisJSU5TVCgweGU2LDB4NDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTAscTExCisJdm1vdglxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKwlJTlNUKDB4ZTIsMHg0YywweDYwLDB4ZjMpCUAgc2hhMjU2c3UxIHExMCxxOCxxOQorCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHExMQorCUlOU1QoMHhlMCwweDYzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTExLHE4CisJdm1vdglxMixxMAorCUlOU1QoMHg2YSwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMworCUlOU1QoMHg2YSwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTMKKwlJTlNUKDB4ZTQsMHg2YywweDYyLDB4ZjMpCUAgc2hhMjU2c3UxIHExMSxxOSxxMTAKKwl2bGQxLjMyCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxOAorCUlOU1QoMHhlMiwweDAzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTgscTkKKwl2bW92CXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlNiwweDBjLDB4NjQsMHhmMykJQCBzaGEyNTZzdTEgcTgscTEwLHExMQorCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHE5CisJSU5TVCgweGU0LDB4MjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOSxxMTAKKwl2bW92CXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlMCwweDJjLDB4NjYsMHhmMykJQCBzaGEyNTZzdTEgcTkscTExLHE4CisJdmxkMS4zMgl7cTEzfSxbcjNdIQorCXZhZGQuaTMyCXExMixxMTIscTEwCisJSU5TVCgweGU2LDB4NDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTAscTExCisJdm1vdglxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKwlJTlNUKDB4ZTIsMHg0YywweDYwLDB4ZjMpCUAgc2hhMjU2c3UxIHExMCxxOCxxOQorCXZsZDEuMzIJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHExMQorCUlOU1QoMHhlMCwweDYzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTExLHE4CisJdm1vdglxMixxMAorCUlOU1QoMHg2YSwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMworCUlOU1QoMHg2YSwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTMKKwlJTlNUKDB4ZTQsMHg2YywweDYyLDB4ZjMpCUAgc2hhMjU2c3UxIHExMSxxOSxxMTAKKwl2bGQxLjMyCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxOAorCXZtb3YJcTIscTAKKwlJTlNUKDB4NjgsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTIKKwlJTlNUKDB4NjgsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEyCisKKwl2bGQxLjMyCXtxMTJ9LFtyM10hCisJdmFkZC5pMzIJcTEzLHExMyxxOQorCXZtb3YJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisKKwl2bGQxLjMyCXtxMTN9LFtyM10KKwl2YWRkLmkzMglxMTIscTEyLHExMAorCXN1YglyMyxyMywjMjU2LTE2CUAgcmV3aW5kCisJdm1vdglxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKworCXZhZGQuaTMyCXExMyxxMTMscTExCisJdm1vdglxMixxMAorCUlOU1QoMHg2YSwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMworCUlOU1QoMHg2YSwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTMKKworCXZhZGQuaTMyCXEwLHEwLHExNAorCXZhZGQuaTMyCXExLHExLHExNQorCWl0CW5lCisJYm5lCS5Mb29wX3Y4CisKKwl2c3QxLjMyCXtxMCxxMX0sW3IwXQorCisJYngJbHIJCUAgYnggbHIKKy5zaXplCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2FybXY4LC4tc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjgKKyNlbmRpZgorLmJ5dGUJODMsNzIsNjUsNTAsNTMsNTQsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiw2NSw4Miw3NywxMTgsNTIsNDcsNzgsNjksNzksNzgsNDcsNjUsODIsNzcsMTE4LDU2LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKy5jb21tCU9QRU5TU0xfYXJtY2FwX1AsNCw0CisuaGlkZGVuCU9QRU5TU0xfYXJtY2FwX1AKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItYXJtdjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtYXJtL2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi1hcm12NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMmMwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LWFybS9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItYXJtdjQuUwpAQCAtMCwwICsxLDE4NzggQEAKKyNpZiBkZWZpbmVkKF9fYXJtX18pCitAIENvcHlyaWdodCAyMDA3LTIwMTYgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgT3BlblNTTCBsaWNlbnNlICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZQorQCB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4gb2J0YWluIGEgY29weQorQCBpbiB0aGUgZmlsZSBMSUNFTlNFIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9yIGF0CitAIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKworCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorQCBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCitAIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCitAIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorQAorQCBQZXJtaXNzaW9uIHRvIHVzZSB1bmRlciBHUEwgdGVybXMgaXMgZ3JhbnRlZC4KK0AgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQCBTSEE1MTIgYmxvY2sgcHJvY2VkdXJlIGZvciBBUk12NC4gU2VwdGVtYmVyIDIwMDcuCisKK0AgVGhpcyBjb2RlIGlzIH40LjUgKGZvdXIgYW5kIGEgaGFsZikgdGltZXMgZmFzdGVyIHRoYW4gY29kZSBnZW5lcmF0ZWQKK0AgYnkgZ2NjIDMuNCBhbmQgaXQgc3BlbmRzIH43MiBjbG9jayBjeWNsZXMgcGVyIGJ5dGUgW29uIHNpbmdsZS1pc3N1ZQorQCBYc2NhbGUgUFhBMjUwIGNvcmVdLgorQAorQCBKdWx5IDIwMTAuCitACitAIFJlc2NoZWR1bGluZyBmb3IgZHVhbC1pc3N1ZSBwaXBlbGluZSByZXN1bHRlZCBpbiA2JSBpbXByb3ZlbWVudCBvbgorQCBDb3J0ZXggQTggY29yZSBhbmQgfjQwIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuCisKK0AgRmVicnVhcnkgMjAxMS4KK0AKK0AgUHJvZmlsZXItYXNzaXN0ZWQgYW5kIHBsYXRmb3JtLXNwZWNpZmljIG9wdGltaXphdGlvbiByZXN1bHRlZCBpbiA3JQorQCBpbXByb3ZlbWVudCBvbiBDb3h0ZXggQTggY29yZSBhbmQgfjM4IGN5Y2xlcyBwZXIgYnl0ZS4KKworQCBNYXJjaCAyMDExLgorQAorQCBBZGQgTkVPTiBpbXBsZW1lbnRhdGlvbi4gT24gQ29ydGV4IEE4IGl0IHdhcyBtZWFzdXJlZCB0byBwcm9jZXNzCitAIG9uZSBieXRlIGluIDIzLjMgY3ljbGVzIG9yIH42MCUgZmFzdGVyIHRoYW4gaW50ZWdlci1vbmx5IGNvZGUuCisKK0AgQXVndXN0IDIwMTIuCitACitAIEltcHJvdmUgTkVPTiBwZXJmb3JtYW5jZSBieSAxMiUgb24gU25hcGRyYWdvbiBTNC4gSW4gYWJzb2x1dGUKK0AgdGVybXMgaXQncyAyMi42IGN5Y2xlcyBwZXIgYnl0ZSwgd2hpY2ggaXMgZGlzYXBwb2ludGluZyByZXN1bHQuCitAIFRlY2huaWNhbCB3cml0ZXJzIGFzc2VydGVkIHRoYXQgMy13YXkgUzQgcGlwZWxpbmUgY2FuIHN1c3RhaW4KK0AgbXVsdGlwbGUgTkVPTiBpbnN0cnVjdGlvbnMgcGVyIGN5Y2xlLCBidXQgZHVhbCBORU9OIGlzc3VlIGNvdWxkCitAIG5vdCBiZSBvYnNlcnZlZCwgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL1NuYXBkcmFnb24tUzQuaHRtbAorQCBmb3IgZnVydGhlciBkZXRhaWxzLiBPbiBzaWRlIG5vdGUgQ29ydGV4LUExNSBwcm9jZXNzZXMgb25lIGJ5dGUgaW4KK0AgMTYgY3ljbGVzLgorCitAIEJ5dGUgb3JkZXIgW2luXWRlcGVuZGVuY2UuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitACitAIE9yaWdpbmFsbHkgY2FsbGVyIHdhcyBleHBlY3RlZCB0byBtYWludGFpbiBzcGVjaWZpYyAqZHdvcmQqIG9yZGVyIGluCitAIGhbMC03XSwgbmFtZWx5IHdpdGggbW9zdCBzaWduaWZpY2FudCBkd29yZCBhdCAqbG93ZXIqIGFkZHJlc3MsIHdoaWNoCitAIHdhcyByZWZsZWN0ZWQgaW4gYmVsb3cgdHdvIHBhcmFtZXRlcnMgYXMgMCBhbmQgNC4gTm93IGNhbGxlciBpcworQCBleHBlY3RlZCB0byBtYWludGFpbiBuYXRpdmUgYnl0ZSBvcmRlciBmb3Igd2hvbGUgNjQtYml0IHZhbHVlcy4KKyNpZm5kZWYgX19LRVJORUxfXworIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CisjIGRlZmluZSBWRlBfQUJJX1BVU0gJdnN0bWRiCXNwISx7ZDgtZDE1fQorIyBkZWZpbmUgVkZQX0FCSV9QT1AJdmxkbWlhCXNwISx7ZDgtZDE1fQorI2Vsc2UKKyMgZGVmaW5lIF9fQVJNX0FSQ0hfXyBfX0xJTlVYX0FSTV9BUkNIX18KKyMgZGVmaW5lIF9fQVJNX01BWF9BUkNIX18gNworIyBkZWZpbmUgVkZQX0FCSV9QVVNICisjIGRlZmluZSBWRlBfQUJJX1BPUAorI2VuZGlmCisKK0AgU2lsZW5jZSBBUk12OCBkZXByZWNhdGVkIElUIGluc3RydWN0aW9uIHdhcm5pbmdzLiBUaGlzIGZpbGUgaXMgdXNlZCBieSBib3RoCitAIEFSTXY3IGFuZCBBUk12OCBwcm9jZXNzb3JzIGFuZCBkb2VzIG5vdCB1c2UgQVJNdjggaW5zdHJ1Y3Rpb25zLgorLmFyY2gJYXJtdjctYQorCisjaWZkZWYgX19BUk1FTF9fCisjIGRlZmluZSBMTyAwCisjIGRlZmluZSBISSA0CisjIGRlZmluZSBXT1JENjQoaGkwLGxvMCxoaTEsbG8xKQkud29yZAlsbzAsaGkwLCBsbzEsaGkxCisjZWxzZQorIyBkZWZpbmUgSEkgMAorIyBkZWZpbmUgTE8gNAorIyBkZWZpbmUgV09SRDY0KGhpMCxsbzAsaGkxLGxvMSkJLndvcmQJaGkwLGxvMCwgaGkxLGxvMQorI2VuZGlmCisKKy50ZXh0CisjaWYgZGVmaW5lZChfX3RodW1iMl9fKQorLnN5bnRheAl1bmlmaWVkCisudGh1bWIKKyMgZGVmaW5lIGFkcmwgYWRyCisjZWxzZQorLmNvZGUJMzIKKyNlbmRpZgorCisudHlwZQlLNTEyLCVvYmplY3QKKy5hbGlnbgk1CitLNTEyOgorCVdPUkQ2NCgweDQyOGEyZjk4LDB4ZDcyOGFlMjIsCTB4NzEzNzQ0OTEsMHgyM2VmNjVjZCkKKwlXT1JENjQoMHhiNWMwZmJjZiwweGVjNGQzYjJmLAkweGU5YjVkYmE1LDB4ODE4OWRiYmMpCisJV09SRDY0KDB4Mzk1NmMyNWIsMHhmMzQ4YjUzOCwJMHg1OWYxMTFmMSwweGI2MDVkMDE5KQorCVdPUkQ2NCgweDkyM2Y4MmE0LDB4YWYxOTRmOWIsCTB4YWIxYzVlZDUsMHhkYTZkODExOCkKKwlXT1JENjQoMHhkODA3YWE5OCwweGEzMDMwMjQyLAkweDEyODM1YjAxLDB4NDU3MDZmYmUpCisJV09SRDY0KDB4MjQzMTg1YmUsMHg0ZWU0YjI4YywJMHg1NTBjN2RjMywweGQ1ZmZiNGUyKQorCVdPUkQ2NCgweDcyYmU1ZDc0LDB4ZjI3Yjg5NmYsCTB4ODBkZWIxZmUsMHgzYjE2OTZiMSkKKwlXT1JENjQoMHg5YmRjMDZhNywweDI1YzcxMjM1LAkweGMxOWJmMTc0LDB4Y2Y2OTI2OTQpCisJV09SRDY0KDB4ZTQ5YjY5YzEsMHg5ZWYxNGFkMiwJMHhlZmJlNDc4NiwweDM4NGYyNWUzKQorCVdPUkQ2NCgweDBmYzE5ZGM2LDB4OGI4Y2Q1YjUsCTB4MjQwY2ExY2MsMHg3N2FjOWM2NSkKKwlXT1JENjQoMHgyZGU5MmM2ZiwweDU5MmIwMjc1LAkweDRhNzQ4NGFhLDB4NmVhNmU0ODMpCisJV09SRDY0KDB4NWNiMGE5ZGMsMHhiZDQxZmJkNCwJMHg3NmY5ODhkYSwweDgzMTE1M2I1KQorCVdPUkQ2NCgweDk4M2U1MTUyLDB4ZWU2NmRmYWIsCTB4YTgzMWM2NmQsMHgyZGI0MzIxMCkKKwlXT1JENjQoMHhiMDAzMjdjOCwweDk4ZmIyMTNmLAkweGJmNTk3ZmM3LDB4YmVlZjBlZTQpCisJV09SRDY0KDB4YzZlMDBiZjMsMHgzZGE4OGZjMiwJMHhkNWE3OTE0NywweDkzMGFhNzI1KQorCVdPUkQ2NCgweDA2Y2E2MzUxLDB4ZTAwMzgyNmYsCTB4MTQyOTI5NjcsMHgwYTBlNmU3MCkKKwlXT1JENjQoMHgyN2I3MGE4NSwweDQ2ZDIyZmZjLAkweDJlMWIyMTM4LDB4NWMyNmM5MjYpCisJV09SRDY0KDB4NGQyYzZkZmMsMHg1YWM0MmFlZCwJMHg1MzM4MGQxMywweDlkOTViM2RmKQorCVdPUkQ2NCgweDY1MGE3MzU0LDB4OGJhZjYzZGUsCTB4NzY2YTBhYmIsMHgzYzc3YjJhOCkKKwlXT1JENjQoMHg4MWMyYzkyZSwweDQ3ZWRhZWU2LAkweDkyNzIyYzg1LDB4MTQ4MjM1M2IpCisJV09SRDY0KDB4YTJiZmU4YTEsMHg0Y2YxMDM2NCwJMHhhODFhNjY0YiwweGJjNDIzMDAxKQorCVdPUkQ2NCgweGMyNGI4YjcwLDB4ZDBmODk3OTEsCTB4Yzc2YzUxYTMsMHgwNjU0YmUzMCkKKwlXT1JENjQoMHhkMTkyZTgxOSwweGQ2ZWY1MjE4LAkweGQ2OTkwNjI0LDB4NTU2NWE5MTApCisJV09SRDY0KDB4ZjQwZTM1ODUsMHg1NzcxMjAyYSwJMHgxMDZhYTA3MCwweDMyYmJkMWI4KQorCVdPUkQ2NCgweDE5YTRjMTE2LDB4YjhkMmQwYzgsCTB4MWUzNzZjMDgsMHg1MTQxYWI1MykKKwlXT1JENjQoMHgyNzQ4Nzc0YywweGRmOGVlYjk5LAkweDM0YjBiY2I1LDB4ZTE5YjQ4YTgpCisJV09SRDY0KDB4MzkxYzBjYjMsMHhjNWM5NWE2MywJMHg0ZWQ4YWE0YSwweGUzNDE4YWNiKQorCVdPUkQ2NCgweDViOWNjYTRmLDB4Nzc2M2UzNzMsCTB4NjgyZTZmZjMsMHhkNmIyYjhhMykKKwlXT1JENjQoMHg3NDhmODJlZSwweDVkZWZiMmZjLAkweDc4YTU2MzZmLDB4NDMxNzJmNjApCisJV09SRDY0KDB4ODRjODc4MTQsMHhhMWYwYWI3MiwJMHg4Y2M3MDIwOCwweDFhNjQzOWVjKQorCVdPUkQ2NCgweDkwYmVmZmZhLDB4MjM2MzFlMjgsCTB4YTQ1MDZjZWIsMHhkZTgyYmRlOSkKKwlXT1JENjQoMHhiZWY5YTNmNywweGIyYzY3OTE1LAkweGM2NzE3OGYyLDB4ZTM3MjUzMmIpCisJV09SRDY0KDB4Y2EyNzNlY2UsMHhlYTI2NjE5YywJMHhkMTg2YjhjNywweDIxYzBjMjA3KQorCVdPUkQ2NCgweGVhZGE3ZGQ2LDB4Y2RlMGViMWUsCTB4ZjU3ZDRmN2YsMHhlZTZlZDE3OCkKKwlXT1JENjQoMHgwNmYwNjdhYSwweDcyMTc2ZmJhLAkweDBhNjM3ZGM1LDB4YTJjODk4YTYpCisJV09SRDY0KDB4MTEzZjk4MDQsMHhiZWY5MGRhZSwJMHgxYjcxMGIzNSwweDEzMWM0NzFiKQorCVdPUkQ2NCgweDI4ZGI3N2Y1LDB4MjMwNDdkODQsCTB4MzJjYWFiN2IsMHg0MGM3MjQ5MykKKwlXT1JENjQoMHgzYzllYmUwYSwweDE1YzliZWJjLAkweDQzMWQ2N2M0LDB4OWMxMDBkNGMpCisJV09SRDY0KDB4NGNjNWQ0YmUsMHhjYjNlNDJiNiwJMHg1OTdmMjk5YywweGZjNjU3ZTJhKQorCVdPUkQ2NCgweDVmY2I2ZmFiLDB4M2FkNmZhZWMsCTB4NmM0NDE5OGMsMHg0YTQ3NTgxNykKKy5zaXplCUs1MTIsLi1LNTEyCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorLkxPUEVOU1NMX2FybWNhcDoKKy53b3JkCU9QRU5TU0xfYXJtY2FwX1AtLkxzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnNraXAJMzItNAorI2Vsc2UKKy5za2lwCTMyCisjZW5kaWYKKworLmdsb2JsCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisuaGlkZGVuCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciwlZnVuY3Rpb24KK3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorLkxzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcjoKKyNpZiBfX0FSTV9BUkNIX188NyAmJiAhZGVmaW5lZChfX3RodW1iMl9fKQorCXN1YglyMyxwYywjOAkJQCBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorI2Vsc2UKKwlhZHIJcjMsLkxzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorI2VuZGlmCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorCWxkcglyMTIsLkxPUEVOU1NMX2FybWNhcAorCWxkcglyMTIsW3IzLHIxMl0JCUAgT1BFTlNTTF9hcm1jYXBfUAorI2lmZGVmCV9fQVBQTEVfXworCWxkcglyMTIsW3IxMl0KKyNlbmRpZgorCXRzdAlyMTIsI0FSTVY3X05FT04KKwlibmUJLkxORU9OCisjZW5kaWYKKwlhZGQJcjIscjEscjIsbHNsIzcJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwlzdG1kYglzcCEse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEscjEyLGxyfQorCXN1YglyMTQscjMsIzY3MgkJQCBLNTEyCisJc3ViCXNwLHNwLCM5KjgKKworCWxkcglyNyxbcjAsIzMyK0xPXQorCWxkcglyOCxbcjAsIzMyK0hJXQorCWxkcglyOSwgW3IwLCM0OCtMT10KKwlsZHIJcjEwLCBbcjAsIzQ4K0hJXQorCWxkcglyMTEsIFtyMCwjNTYrTE9dCisJbGRyCXIxMiwgW3IwLCM1NitISV0KKy5Mb29wOgorCXN0cglyOSwgW3NwLCM0OCswXQorCXN0cglyMTAsIFtzcCwjNDgrNF0KKwlzdHIJcjExLCBbc3AsIzU2KzBdCisJc3RyCXIxMiwgW3NwLCM1Nis0XQorCWxkcglyNSxbcjAsIzArTE9dCisJbGRyCXI2LFtyMCwjMCtISV0KKwlsZHIJcjMsW3IwLCM4K0xPXQorCWxkcglyNCxbcjAsIzgrSEldCisJbGRyCXI5LCBbcjAsIzE2K0xPXQorCWxkcglyMTAsIFtyMCwjMTYrSEldCisJbGRyCXIxMSwgW3IwLCMyNCtMT10KKwlsZHIJcjEyLCBbcjAsIzI0K0hJXQorCXN0cglyMyxbc3AsIzgrMF0KKwlzdHIJcjQsW3NwLCM4KzRdCisJc3RyCXI5LCBbc3AsIzE2KzBdCisJc3RyCXIxMCwgW3NwLCMxNis0XQorCXN0cglyMTEsIFtzcCwjMjQrMF0KKwlzdHIJcjEyLCBbc3AsIzI0KzRdCisJbGRyCXIzLFtyMCwjNDArTE9dCisJbGRyCXI0LFtyMCwjNDArSEldCisJc3RyCXIzLFtzcCwjNDArMF0KKwlzdHIJcjQsW3NwLCM0MCs0XQorCisuTDAwXzE1OgorI2lmIF9fQVJNX0FSQ0hfXzw3CisJbGRyYglyMyxbcjEsIzddCisJbGRyYglyOSwgW3IxLCM2XQorCWxkcmIJcjEwLCBbcjEsIzVdCisJbGRyYglyMTEsIFtyMSwjNF0KKwlsZHJiCXI0LFtyMSwjM10KKwlsZHJiCXIxMiwgW3IxLCMyXQorCW9ycglyMyxyMyxyOSxsc2wjOAorCWxkcmIJcjksIFtyMSwjMV0KKwlvcnIJcjMscjMscjEwLGxzbCMxNgorCWxkcmIJcjEwLCBbcjFdLCM4CisJb3JyCXIzLHIzLHIxMSxsc2wjMjQKKwlvcnIJcjQscjQscjEyLGxzbCM4CisJb3JyCXI0LHI0LHI5LGxzbCMxNgorCW9ycglyNCxyNCxyMTAsbHNsIzI0CisjZWxzZQorCWxkcglyMyxbcjEsIzRdCisJbGRyCXI0LFtyMV0sIzgKKyNpZmRlZiBfX0FSTUVMX18KKwlyZXYJcjMscjMKKwlyZXYJcjQscjQKKyNlbmRpZgorI2VuZGlmCisJQCBTaWdtYTEoeCkJKFJPVFIoKHgpLDE0KSBeIFJPVFIoKHgpLDE4KSAgXiBST1RSKCh4KSw0MSkpCisJQCBMTwkJbG8+PjE0XmhpPDwxOCBeIGxvPj4xOF5oaTw8MTQgXiBoaT4+OV5sbzw8MjMKKwlAIEhJCQloaT4+MTRebG88PDE4IF4gaGk+PjE4XmxvPDwxNCBeIGxvPj45XmhpPDwyMworCW1vdglyOSxyNyxsc3IjMTQKKwlzdHIJcjMsW3NwLCM2NCswXQorCW1vdglyMTAscjgsbHNyIzE0CisJc3RyCXI0LFtzcCwjNjQrNF0KKwllb3IJcjkscjkscjgsbHNsIzE4CisJbGRyCXIxMSxbc3AsIzU2KzBdCUAgaC5sbworCWVvcglyMTAscjEwLHI3LGxzbCMxOAorCWxkcglyMTIsW3NwLCM1Nis0XQlAIGguaGkKKwllb3IJcjkscjkscjcsbHNyIzE4CisJZW9yCXIxMCxyMTAscjgsbHNyIzE4CisJZW9yCXI5LHI5LHI4LGxzbCMxNAorCWVvcglyMTAscjEwLHI3LGxzbCMxNAorCWVvcglyOSxyOSxyOCxsc3IjOQorCWVvcglyMTAscjEwLHI3LGxzciM5CisJZW9yCXI5LHI5LHI3LGxzbCMyMworCWVvcglyMTAscjEwLHI4LGxzbCMyMwlAIFNpZ21hMShlKQorCWFkZHMJcjMscjMscjkKKwlsZHIJcjksW3NwLCM0MCswXQlAIGYubG8KKwlhZGMJcjQscjQscjEwCQlAIFQgKz0gU2lnbWExKGUpCisJbGRyCXIxMCxbc3AsIzQwKzRdCUAgZi5oaQorCWFkZHMJcjMscjMscjExCisJbGRyCXIxMSxbc3AsIzQ4KzBdCUAgZy5sbworCWFkYwlyNCxyNCxyMTIJCUAgVCArPSBoCisJbGRyCXIxMixbc3AsIzQ4KzRdCUAgZy5oaQorCisJZW9yCXI5LHI5LHIxMQorCXN0cglyNyxbc3AsIzMyKzBdCisJZW9yCXIxMCxyMTAscjEyCisJc3RyCXI4LFtzcCwjMzIrNF0KKwlhbmQJcjkscjkscjcKKwlzdHIJcjUsW3NwLCMwKzBdCisJYW5kCXIxMCxyMTAscjgKKwlzdHIJcjYsW3NwLCMwKzRdCisJZW9yCXI5LHI5LHIxMQorCWxkcglyMTEsW3IxNCwjTE9dCUAgS1tpXS5sbworCWVvcglyMTAscjEwLHIxMgkJQCBDaChlLGYsZykKKwlsZHIJcjEyLFtyMTQsI0hJXQlAIEtbaV0uaGkKKworCWFkZHMJcjMscjMscjkKKwlsZHIJcjcsW3NwLCMyNCswXQlAIGQubG8KKwlhZGMJcjQscjQscjEwCQlAIFQgKz0gQ2goZSxmLGcpCisJbGRyCXI4LFtzcCwjMjQrNF0JQCBkLmhpCisJYWRkcwlyMyxyMyxyMTEKKwlhbmQJcjkscjExLCMweGZmCisJYWRjCXI0LHI0LHIxMgkJQCBUICs9IEtbaV0KKwlhZGRzCXI3LHI3LHIzCisJbGRyCXIxMSxbc3AsIzgrMF0JQCBiLmxvCisJYWRjCXI4LHI4LHI0CQlAIGQgKz0gVAorCXRlcQlyOSwjMTQ4CisKKwlsZHIJcjEyLFtzcCwjMTYrMF0JQCBjLmxvCisjaWYgX19BUk1fQVJDSF9fPj03CisJaXQJZXEJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJb3JyZXEJcjE0LHIxNCwjMQorCUAgU2lnbWEwKHgpCShST1RSKCh4KSwyOCkgXiBST1RSKCh4KSwzNCkgXiBST1RSKCh4KSwzOSkpCisJQCBMTwkJbG8+PjI4XmhpPDw0ICBeIGhpPj4yXmxvPDwzMCBeIGhpPj43XmxvPDwyNQorCUAgSEkJCWhpPj4yOF5sbzw8NCAgXiBsbz4+Ml5oaTw8MzAgXiBsbz4+N15oaTw8MjUKKwltb3YJcjkscjUsbHNyIzI4CisJbW92CXIxMCxyNixsc3IjMjgKKwllb3IJcjkscjkscjYsbHNsIzQKKwllb3IJcjEwLHIxMCxyNSxsc2wjNAorCWVvcglyOSxyOSxyNixsc3IjMgorCWVvcglyMTAscjEwLHI1LGxzciMyCisJZW9yCXI5LHI5LHI1LGxzbCMzMAorCWVvcglyMTAscjEwLHI2LGxzbCMzMAorCWVvcglyOSxyOSxyNixsc3IjNworCWVvcglyMTAscjEwLHI1LGxzciM3CisJZW9yCXI5LHI5LHI1LGxzbCMyNQorCWVvcglyMTAscjEwLHI2LGxzbCMyNQlAIFNpZ21hMChhKQorCWFkZHMJcjMscjMscjkKKwlhbmQJcjkscjUscjExCisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IFNpZ21hMChhKQorCisJbGRyCXIxMCxbc3AsIzgrNF0JQCBiLmhpCisJb3JyCXI1LHI1LHIxMQorCWxkcglyMTEsW3NwLCMxNis0XQlAIGMuaGkKKwlhbmQJcjUscjUscjEyCisJYW5kCXIxMixyNixyMTAKKwlvcnIJcjYscjYscjEwCisJb3JyCXI1LHI1LHI5CQlAIE1haihhLGIsYykubG8KKwlhbmQJcjYscjYscjExCisJYWRkcwlyNSxyNSxyMworCW9ycglyNixyNixyMTIJCUAgTWFqKGEsYixjKS5oaQorCXN1YglzcCxzcCwjOAorCWFkYwlyNixyNixyNAkJQCBoICs9IFQKKwl0c3QJcjE0LCMxCisJYWRkCXIxNCxyMTQsIzgKKwl0c3QJcjE0LCMxCisJYmVxCS5MMDBfMTUKKwlsZHIJcjksW3NwLCMxODQrMF0KKwlsZHIJcjEwLFtzcCwjMTg0KzRdCisJYmljCXIxNCxyMTQsIzEKKy5MMTZfNzk6CisJQCBzaWdtYTAoeCkJKFJPVFIoKHgpLDEpICBeIFJPVFIoKHgpLDgpICBeICgoeCk+PjcpKQorCUAgTE8JCWxvPj4xXmhpPDwzMSAgXiBsbz4+OF5oaTw8MjQgXiBsbz4+N15oaTw8MjUKKwlAIEhJCQloaT4+MV5sbzw8MzEgIF4gaGk+PjhebG88PDI0IF4gaGk+PjcKKwltb3YJcjMscjksbHNyIzEKKwlsZHIJcjExLFtzcCwjODArMF0KKwltb3YJcjQscjEwLGxzciMxCisJbGRyCXIxMixbc3AsIzgwKzRdCisJZW9yCXIzLHIzLHIxMCxsc2wjMzEKKwllb3IJcjQscjQscjksbHNsIzMxCisJZW9yCXIzLHIzLHI5LGxzciM4CisJZW9yCXI0LHI0LHIxMCxsc3IjOAorCWVvcglyMyxyMyxyMTAsbHNsIzI0CisJZW9yCXI0LHI0LHI5LGxzbCMyNAorCWVvcglyMyxyMyxyOSxsc3IjNworCWVvcglyNCxyNCxyMTAsbHNyIzcKKwllb3IJcjMscjMscjEwLGxzbCMyNQorCisJQCBzaWdtYTEoeCkJKFJPVFIoKHgpLDE5KSBeIFJPVFIoKHgpLDYxKSBeICgoeCk+PjYpKQorCUAgTE8JCWxvPj4xOV5oaTw8MTMgXiBoaT4+MjlebG88PDMgXiBsbz4+Nl5oaTw8MjYKKwlAIEhJCQloaT4+MTlebG88PDEzIF4gbG8+PjI5XmhpPDwzIF4gaGk+PjYKKwltb3YJcjkscjExLGxzciMxOQorCW1vdglyMTAscjEyLGxzciMxOQorCWVvcglyOSxyOSxyMTIsbHNsIzEzCisJZW9yCXIxMCxyMTAscjExLGxzbCMxMworCWVvcglyOSxyOSxyMTIsbHNyIzI5CisJZW9yCXIxMCxyMTAscjExLGxzciMyOQorCWVvcglyOSxyOSxyMTEsbHNsIzMKKwllb3IJcjEwLHIxMCxyMTIsbHNsIzMKKwllb3IJcjkscjkscjExLGxzciM2CisJZW9yCXIxMCxyMTAscjEyLGxzciM2CisJbGRyCXIxMSxbc3AsIzEyMCswXQorCWVvcglyOSxyOSxyMTIsbHNsIzI2CisKKwlsZHIJcjEyLFtzcCwjMTIwKzRdCisJYWRkcwlyMyxyMyxyOQorCWxkcglyOSxbc3AsIzE5MiswXQorCWFkYwlyNCxyNCxyMTAKKworCWxkcglyMTAsW3NwLCMxOTIrNF0KKwlhZGRzCXIzLHIzLHIxMQorCWFkYwlyNCxyNCxyMTIKKwlhZGRzCXIzLHIzLHI5CisJYWRjCXI0LHI0LHIxMAorCUAgU2lnbWExKHgpCShST1RSKCh4KSwxNCkgXiBST1RSKCh4KSwxOCkgIF4gUk9UUigoeCksNDEpKQorCUAgTE8JCWxvPj4xNF5oaTw8MTggXiBsbz4+MTheaGk8PDE0IF4gaGk+PjlebG88PDIzCisJQCBISQkJaGk+PjE0XmxvPDwxOCBeIGhpPj4xOF5sbzw8MTQgXiBsbz4+OV5oaTw8MjMKKwltb3YJcjkscjcsbHNyIzE0CisJc3RyCXIzLFtzcCwjNjQrMF0KKwltb3YJcjEwLHI4LGxzciMxNAorCXN0cglyNCxbc3AsIzY0KzRdCisJZW9yCXI5LHI5LHI4LGxzbCMxOAorCWxkcglyMTEsW3NwLCM1NiswXQlAIGgubG8KKwllb3IJcjEwLHIxMCxyNyxsc2wjMTgKKwlsZHIJcjEyLFtzcCwjNTYrNF0JQCBoLmhpCisJZW9yCXI5LHI5LHI3LGxzciMxOAorCWVvcglyMTAscjEwLHI4LGxzciMxOAorCWVvcglyOSxyOSxyOCxsc2wjMTQKKwllb3IJcjEwLHIxMCxyNyxsc2wjMTQKKwllb3IJcjkscjkscjgsbHNyIzkKKwllb3IJcjEwLHIxMCxyNyxsc3IjOQorCWVvcglyOSxyOSxyNyxsc2wjMjMKKwllb3IJcjEwLHIxMCxyOCxsc2wjMjMJQCBTaWdtYTEoZSkKKwlhZGRzCXIzLHIzLHI5CisJbGRyCXI5LFtzcCwjNDArMF0JQCBmLmxvCisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IFNpZ21hMShlKQorCWxkcglyMTAsW3NwLCM0MCs0XQlAIGYuaGkKKwlhZGRzCXIzLHIzLHIxMQorCWxkcglyMTEsW3NwLCM0OCswXQlAIGcubG8KKwlhZGMJcjQscjQscjEyCQlAIFQgKz0gaAorCWxkcglyMTIsW3NwLCM0OCs0XQlAIGcuaGkKKworCWVvcglyOSxyOSxyMTEKKwlzdHIJcjcsW3NwLCMzMiswXQorCWVvcglyMTAscjEwLHIxMgorCXN0cglyOCxbc3AsIzMyKzRdCisJYW5kCXI5LHI5LHI3CisJc3RyCXI1LFtzcCwjMCswXQorCWFuZAlyMTAscjEwLHI4CisJc3RyCXI2LFtzcCwjMCs0XQorCWVvcglyOSxyOSxyMTEKKwlsZHIJcjExLFtyMTQsI0xPXQlAIEtbaV0ubG8KKwllb3IJcjEwLHIxMCxyMTIJCUAgQ2goZSxmLGcpCisJbGRyCXIxMixbcjE0LCNISV0JQCBLW2ldLmhpCisKKwlhZGRzCXIzLHIzLHI5CisJbGRyCXI3LFtzcCwjMjQrMF0JQCBkLmxvCisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IENoKGUsZixnKQorCWxkcglyOCxbc3AsIzI0KzRdCUAgZC5oaQorCWFkZHMJcjMscjMscjExCisJYW5kCXI5LHIxMSwjMHhmZgorCWFkYwlyNCxyNCxyMTIJCUAgVCArPSBLW2ldCisJYWRkcwlyNyxyNyxyMworCWxkcglyMTEsW3NwLCM4KzBdCUAgYi5sbworCWFkYwlyOCxyOCxyNAkJQCBkICs9IFQKKwl0ZXEJcjksIzIzCisKKwlsZHIJcjEyLFtzcCwjMTYrMF0JQCBjLmxvCisjaWYgX19BUk1fQVJDSF9fPj03CisJaXQJZXEJCQlAIFRodW1iMiB0aGluZywgc2FuaXR5IGNoZWNrIGluIEFSTQorI2VuZGlmCisJb3JyZXEJcjE0LHIxNCwjMQorCUAgU2lnbWEwKHgpCShST1RSKCh4KSwyOCkgXiBST1RSKCh4KSwzNCkgXiBST1RSKCh4KSwzOSkpCisJQCBMTwkJbG8+PjI4XmhpPDw0ICBeIGhpPj4yXmxvPDwzMCBeIGhpPj43XmxvPDwyNQorCUAgSEkJCWhpPj4yOF5sbzw8NCAgXiBsbz4+Ml5oaTw8MzAgXiBsbz4+N15oaTw8MjUKKwltb3YJcjkscjUsbHNyIzI4CisJbW92CXIxMCxyNixsc3IjMjgKKwllb3IJcjkscjkscjYsbHNsIzQKKwllb3IJcjEwLHIxMCxyNSxsc2wjNAorCWVvcglyOSxyOSxyNixsc3IjMgorCWVvcglyMTAscjEwLHI1LGxzciMyCisJZW9yCXI5LHI5LHI1LGxzbCMzMAorCWVvcglyMTAscjEwLHI2LGxzbCMzMAorCWVvcglyOSxyOSxyNixsc3IjNworCWVvcglyMTAscjEwLHI1LGxzciM3CisJZW9yCXI5LHI5LHI1LGxzbCMyNQorCWVvcglyMTAscjEwLHI2LGxzbCMyNQlAIFNpZ21hMChhKQorCWFkZHMJcjMscjMscjkKKwlhbmQJcjkscjUscjExCisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IFNpZ21hMChhKQorCisJbGRyCXIxMCxbc3AsIzgrNF0JQCBiLmhpCisJb3JyCXI1LHI1LHIxMQorCWxkcglyMTEsW3NwLCMxNis0XQlAIGMuaGkKKwlhbmQJcjUscjUscjEyCisJYW5kCXIxMixyNixyMTAKKwlvcnIJcjYscjYscjEwCisJb3JyCXI1LHI1LHI5CQlAIE1haihhLGIsYykubG8KKwlhbmQJcjYscjYscjExCisJYWRkcwlyNSxyNSxyMworCW9ycglyNixyNixyMTIJCUAgTWFqKGEsYixjKS5oaQorCXN1YglzcCxzcCwjOAorCWFkYwlyNixyNixyNAkJQCBoICs9IFQKKwl0c3QJcjE0LCMxCisJYWRkCXIxNCxyMTQsIzgKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlpdHR0CWVxCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KKyNlbmRpZgorCWxkcmVxCXI5LFtzcCwjMTg0KzBdCisJbGRyZXEJcjEwLFtzcCwjMTg0KzRdCisJYmVxCS5MMTZfNzkKKwliaWMJcjE0LHIxNCwjMQorCisJbGRyCXIzLFtzcCwjOCswXQorCWxkcglyNCxbc3AsIzgrNF0KKwlsZHIJcjksIFtyMCwjMCtMT10KKwlsZHIJcjEwLCBbcjAsIzArSEldCisJbGRyCXIxMSwgW3IwLCM4K0xPXQorCWxkcglyMTIsIFtyMCwjOCtISV0KKwlhZGRzCXI5LHI1LHI5CisJc3RyCXI5LCBbcjAsIzArTE9dCisJYWRjCXIxMCxyNixyMTAKKwlzdHIJcjEwLCBbcjAsIzArSEldCisJYWRkcwlyMTEscjMscjExCisJc3RyCXIxMSwgW3IwLCM4K0xPXQorCWFkYwlyMTIscjQscjEyCisJc3RyCXIxMiwgW3IwLCM4K0hJXQorCisJbGRyCXI1LFtzcCwjMTYrMF0KKwlsZHIJcjYsW3NwLCMxNis0XQorCWxkcglyMyxbc3AsIzI0KzBdCisJbGRyCXI0LFtzcCwjMjQrNF0KKwlsZHIJcjksIFtyMCwjMTYrTE9dCisJbGRyCXIxMCwgW3IwLCMxNitISV0KKwlsZHIJcjExLCBbcjAsIzI0K0xPXQorCWxkcglyMTIsIFtyMCwjMjQrSEldCisJYWRkcwlyOSxyNSxyOQorCXN0cglyOSwgW3IwLCMxNitMT10KKwlhZGMJcjEwLHI2LHIxMAorCXN0cglyMTAsIFtyMCwjMTYrSEldCisJYWRkcwlyMTEscjMscjExCisJc3RyCXIxMSwgW3IwLCMyNCtMT10KKwlhZGMJcjEyLHI0LHIxMgorCXN0cglyMTIsIFtyMCwjMjQrSEldCisKKwlsZHIJcjMsW3NwLCM0MCswXQorCWxkcglyNCxbc3AsIzQwKzRdCisJbGRyCXI5LCBbcjAsIzMyK0xPXQorCWxkcglyMTAsIFtyMCwjMzIrSEldCisJbGRyCXIxMSwgW3IwLCM0MCtMT10KKwlsZHIJcjEyLCBbcjAsIzQwK0hJXQorCWFkZHMJcjcscjcscjkKKwlzdHIJcjcsW3IwLCMzMitMT10KKwlhZGMJcjgscjgscjEwCisJc3RyCXI4LFtyMCwjMzIrSEldCisJYWRkcwlyMTEscjMscjExCisJc3RyCXIxMSwgW3IwLCM0MCtMT10KKwlhZGMJcjEyLHI0LHIxMgorCXN0cglyMTIsIFtyMCwjNDArSEldCisKKwlsZHIJcjUsW3NwLCM0OCswXQorCWxkcglyNixbc3AsIzQ4KzRdCisJbGRyCXIzLFtzcCwjNTYrMF0KKwlsZHIJcjQsW3NwLCM1Nis0XQorCWxkcglyOSwgW3IwLCM0OCtMT10KKwlsZHIJcjEwLCBbcjAsIzQ4K0hJXQorCWxkcglyMTEsIFtyMCwjNTYrTE9dCisJbGRyCXIxMiwgW3IwLCM1NitISV0KKwlhZGRzCXI5LHI1LHI5CisJc3RyCXI5LCBbcjAsIzQ4K0xPXQorCWFkYwlyMTAscjYscjEwCisJc3RyCXIxMCwgW3IwLCM0OCtISV0KKwlhZGRzCXIxMSxyMyxyMTEKKwlzdHIJcjExLCBbcjAsIzU2K0xPXQorCWFkYwlyMTIscjQscjEyCisJc3RyCXIxMiwgW3IwLCM1NitISV0KKworCWFkZAlzcCxzcCwjNjQwCisJc3ViCXIxNCxyMTQsIzY0MAorCisJdGVxCXIxLHIyCisJYm5lCS5Mb29wCisKKwlhZGQJc3Asc3AsIzgqOQkJQCBkZXN0cm95IGZyYW1lCisjaWYgX19BUk1fQVJDSF9fPj01CisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0Cisud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5zaXplCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyLC4tc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisuYXJjaAlhcm12Ny1hCisuZnB1CW5lb24KKworLmdsb2JsCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyX25lb24KKy5oaWRkZW4Jc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorLnR5cGUJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfbmVvbiwlZnVuY3Rpb24KKy5hbGlnbgk0CitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl9uZW9uOgorLkxORU9OOgorCWRtYglAIGVycmF0YSAjNDUxMDM0IG9uIGVhcmx5IENvcnRleCBBOAorCWFkZAlyMixyMSxyMixsc2wjNwlAIGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mIGlucAorCWFkcglyMyxLNTEyCisJVkZQX0FCSV9QVVNICisJdmxkbWlhCXIwLHtkMTYsZDE3LGQxOCxkMTksZDIwLGQyMSxkMjIsZDIzfQkJQCBsb2FkIGNvbnRleHQKKy5Mb29wX25lb246CisJdnNoci51NjQJZDI0LGQyMCwjMTQJQCAwCisjaWYgMDwxNgorCXZsZDEuNjQJe2QwfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIwLCMxOAorI2lmIDA+MAorCXZhZGQuaTY0CWQxNixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIwLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIwLCM1MAorCXZzbGkuNjQJZDI1LGQyMCwjNDYKKwl2bW92CWQyOSxkMjAKKwl2c2xpLjY0CWQyNixkMjAsIzIzCisjaWYgMDwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMCxkMAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIxLGQyMgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE2LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjMKKwl2c2hyLnU2NAlkMjUsZDE2LCMzNAorCXZzbGkuNjQJZDI0LGQxNiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxNiwjMzkKKwl2YWRkLmk2NAlkMjgsZDAKKwl2c2xpLjY0CWQyNSxkMTYsIzMwCisJdmVvcglkMzAsZDE2LGQxNworCXZzbGkuNjQJZDI2LGQxNiwjMjUKKwl2ZW9yCWQyMyxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOCxkMTcJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIzLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE5LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMyxkMzAKKwl2c2hyLnU2NAlkMjQsZDE5LCMxNAlAIDEKKyNpZiAxPDE2CisJdmxkMS42NAl7ZDF9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTksIzE4CisjaWYgMT4wCisJdmFkZC5pNjQJZDIzLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTksIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTksIzUwCisJdnNsaS42NAlkMjUsZDE5LCM0NgorCXZtb3YJZDI5LGQxOQorCXZzbGkuNjQJZDI2LGQxOSwjMjMKKyNpZiAxPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQxLGQxCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjAsZDIxCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjMsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQyMgorCXZzaHIudTY0CWQyNSxkMjMsIzM0CisJdnNsaS42NAlkMjQsZDIzLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIzLCMzOQorCXZhZGQuaTY0CWQyOCxkMQorCXZzbGkuNjQJZDI1LGQyMywjMzAKKwl2ZW9yCWQzMCxkMjMsZDE2CisJdnNsaS42NAlkMjYsZDIzLCMyNQorCXZlb3IJZDIyLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE3LGQxNgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjIsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTgsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIyLGQzMAorCXZzaHIudTY0CWQyNCxkMTgsIzE0CUAgMgorI2lmIDI8MTYKKwl2bGQxLjY0CXtkMn0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxOCwjMTgKKyNpZiAyPjAKKwl2YWRkLmk2NAlkMjIsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQxOCwjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxOCwjNTAKKwl2c2xpLjY0CWQyNSxkMTgsIzQ2CisJdm1vdglkMjksZDE4CisJdnNsaS42NAlkMjYsZDE4LCMyMworI2lmIDI8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDIsZDIKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxOSxkMjAJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIxCisJdnNoci51NjQJZDI1LGQyMiwjMzQKKwl2c2xpLjY0CWQyNCxkMjIsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjIsIzM5CisJdmFkZC5pNjQJZDI4LGQyCisJdnNsaS42NAlkMjUsZDIyLCMzMAorCXZlb3IJZDMwLGQyMixkMjMKKwl2c2xpLjY0CWQyNixkMjIsIzI1CisJdmVvcglkMjEsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTYsZDIzCQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxNyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjEsZDMwCisJdnNoci51NjQJZDI0LGQxNywjMTQJQCAzCisjaWYgMzwxNgorCXZsZDEuNjQJe2QzfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDE3LCMxOAorI2lmIDM+MAorCXZhZGQuaTY0CWQyMSxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE3LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE3LCM1MAorCXZzbGkuNjQJZDI1LGQxNywjNDYKKwl2bW92CWQyOSxkMTcKKwl2c2xpLjY0CWQyNixkMTcsIzIzCisjaWYgMzwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMyxkMworI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE4LGQxOQkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIxLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjAKKwl2c2hyLnU2NAlkMjUsZDIxLCMzNAorCXZzbGkuNjQJZDI0LGQyMSwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMSwjMzkKKwl2YWRkLmk2NAlkMjgsZDMKKwl2c2xpLjY0CWQyNSxkMjEsIzMwCisJdmVvcglkMzAsZDIxLGQyMgorCXZzbGkuNjQJZDI2LGQyMSwjMjUKKwl2ZW9yCWQyMCxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMyxkMjIJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIwLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE2LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMCxkMzAKKwl2c2hyLnU2NAlkMjQsZDE2LCMxNAlAIDQKKyNpZiA0PDE2CisJdmxkMS42NAl7ZDR9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTYsIzE4CisjaWYgND4wCisJdmFkZC5pNjQJZDIwLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTYsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTYsIzUwCisJdnNsaS42NAlkMjUsZDE2LCM0NgorCXZtb3YJZDI5LGQxNgorCXZzbGkuNjQJZDI2LGQxNiwjMjMKKyNpZiA0PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQ0LGQ0CisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTcsZDE4CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjAsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxOQorCXZzaHIudTY0CWQyNSxkMjAsIzM0CisJdnNsaS42NAlkMjQsZDIwLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIwLCMzOQorCXZhZGQuaTY0CWQyOCxkNAorCXZzbGkuNjQJZDI1LGQyMCwjMzAKKwl2ZW9yCWQzMCxkMjAsZDIxCisJdnNsaS42NAlkMjYsZDIwLCMyNQorCXZlb3IJZDE5LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIyLGQyMQkJQCBNYWooYSxiLGMpCisJdmVvcglkMTksZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjMsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE5LGQzMAorCXZzaHIudTY0CWQyNCxkMjMsIzE0CUAgNQorI2lmIDU8MTYKKwl2bGQxLjY0CXtkNX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMywjMTgKKyNpZiA1PjAKKwl2YWRkLmk2NAlkMTksZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMywjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMywjNTAKKwl2c2xpLjY0CWQyNSxkMjMsIzQ2CisJdm1vdglkMjksZDIzCisJdnNsaS42NAlkMjYsZDIzLCMyMworI2lmIDU8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDUsZDUKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxNixkMTcJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxOSwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE4CisJdnNoci51NjQJZDI1LGQxOSwjMzQKKwl2c2xpLjY0CWQyNCxkMTksIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTksIzM5CisJdmFkZC5pNjQJZDI4LGQ1CisJdnNsaS42NAlkMjUsZDE5LCMzMAorCXZlb3IJZDMwLGQxOSxkMjAKKwl2c2xpLjY0CWQyNixkMTksIzI1CisJdmVvcglkMTgsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjEsZDIwCQlAIE1haihhLGIsYykKKwl2ZW9yCWQxOCxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMixkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTgsZDMwCisJdnNoci51NjQJZDI0LGQyMiwjMTQJQCA2CisjaWYgNjwxNgorCXZsZDEuNjQJe2Q2fSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIyLCMxOAorI2lmIDY+MAorCXZhZGQuaTY0CWQxOCxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIyLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIyLCM1MAorCXZzbGkuNjQJZDI1LGQyMiwjNDYKKwl2bW92CWQyOSxkMjIKKwl2c2xpLjY0CWQyNixkMjIsIzIzCisjaWYgNjwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkNixkNgorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIzLGQxNgkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE4LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTcKKwl2c2hyLnU2NAlkMjUsZDE4LCMzNAorCXZzbGkuNjQJZDI0LGQxOCwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxOCwjMzkKKwl2YWRkLmk2NAlkMjgsZDYKKwl2c2xpLjY0CWQyNSxkMTgsIzMwCisJdmVvcglkMzAsZDE4LGQxOQorCXZzbGkuNjQJZDI2LGQxOCwjMjUKKwl2ZW9yCWQxNyxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMCxkMTkJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE3LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIxLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxNyxkMzAKKwl2c2hyLnU2NAlkMjQsZDIxLCMxNAlAIDcKKyNpZiA3PDE2CisJdmxkMS42NAl7ZDd9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMjEsIzE4CisjaWYgNz4wCisJdmFkZC5pNjQJZDE3LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjEsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjEsIzUwCisJdnNsaS42NAlkMjUsZDIxLCM0NgorCXZtb3YJZDI5LGQyMQorCXZzbGkuNjQJZDI2LGQyMSwjMjMKKyNpZiA3PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQ3LGQ3CisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjIsZDIzCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTcsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxNgorCXZzaHIudTY0CWQyNSxkMTcsIzM0CisJdnNsaS42NAlkMjQsZDE3LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE3LCMzOQorCXZhZGQuaTY0CWQyOCxkNworCXZzbGkuNjQJZDI1LGQxNywjMzAKKwl2ZW9yCWQzMCxkMTcsZDE4CisJdnNsaS42NAlkMjYsZDE3LCMyNQorCXZlb3IJZDE2LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE5LGQxOAkJQCBNYWooYSxiLGMpCisJdmVvcglkMTYsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjAsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE2LGQzMAorCXZzaHIudTY0CWQyNCxkMjAsIzE0CUAgOAorI2lmIDg8MTYKKwl2bGQxLjY0CXtkOH0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMCwjMTgKKyNpZiA4PjAKKwl2YWRkLmk2NAlkMTYsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMCwjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMCwjNTAKKwl2c2xpLjY0CWQyNSxkMjAsIzQ2CisJdm1vdglkMjksZDIwCisJdnNsaS42NAlkMjYsZDIwLCMyMworI2lmIDg8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDgsZDgKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMSxkMjIJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxNiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIzCisJdnNoci51NjQJZDI1LGQxNiwjMzQKKwl2c2xpLjY0CWQyNCxkMTYsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTYsIzM5CisJdmFkZC5pNjQJZDI4LGQ4CisJdnNsaS42NAlkMjUsZDE2LCMzMAorCXZlb3IJZDMwLGQxNixkMTcKKwl2c2xpLjY0CWQyNixkMTYsIzI1CisJdmVvcglkMjMsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTgsZDE3CQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMyxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxOSxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjMsZDMwCisJdnNoci51NjQJZDI0LGQxOSwjMTQJQCA5CisjaWYgOTwxNgorCXZsZDEuNjQJe2Q5fSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDE5LCMxOAorI2lmIDk+MAorCXZhZGQuaTY0CWQyMyxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE5LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE5LCM1MAorCXZzbGkuNjQJZDI1LGQxOSwjNDYKKwl2bW92CWQyOSxkMTkKKwl2c2xpLjY0CWQyNixkMTksIzIzCisjaWYgOTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkOSxkOQorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIwLGQyMQkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIzLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjIKKwl2c2hyLnU2NAlkMjUsZDIzLCMzNAorCXZzbGkuNjQJZDI0LGQyMywjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMywjMzkKKwl2YWRkLmk2NAlkMjgsZDkKKwl2c2xpLjY0CWQyNSxkMjMsIzMwCisJdmVvcglkMzAsZDIzLGQxNgorCXZzbGkuNjQJZDI2LGQyMywjMjUKKwl2ZW9yCWQyMixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxNyxkMTYJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIyLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE4LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMixkMzAKKwl2c2hyLnU2NAlkMjQsZDE4LCMxNAlAIDEwCisjaWYgMTA8MTYKKwl2bGQxLjY0CXtkMTB9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTgsIzE4CisjaWYgMTA+MAorCXZhZGQuaTY0CWQyMixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE4LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE4LCM1MAorCXZzbGkuNjQJZDI1LGQxOCwjNDYKKwl2bW92CWQyOSxkMTgKKwl2c2xpLjY0CWQyNixkMTgsIzIzCisjaWYgMTA8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDEwLGQxMAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE5LGQyMAkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIyLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjEKKwl2c2hyLnU2NAlkMjUsZDIyLCMzNAorCXZzbGkuNjQJZDI0LGQyMiwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMiwjMzkKKwl2YWRkLmk2NAlkMjgsZDEwCisJdnNsaS42NAlkMjUsZDIyLCMzMAorCXZlb3IJZDMwLGQyMixkMjMKKwl2c2xpLjY0CWQyNixkMjIsIzI1CisJdmVvcglkMjEsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTYsZDIzCQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxNyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjEsZDMwCisJdnNoci51NjQJZDI0LGQxNywjMTQJQCAxMQorI2lmIDExPDE2CisJdmxkMS42NAl7ZDExfSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDE3LCMxOAorI2lmIDExPjAKKwl2YWRkLmk2NAlkMjEsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQxNywjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxNywjNTAKKwl2c2xpLjY0CWQyNSxkMTcsIzQ2CisJdm1vdglkMjksZDE3CisJdnNsaS42NAlkMjYsZDE3LCMyMworI2lmIDExPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQxMSxkMTEKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxOCxkMTkJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMSwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIwCisJdnNoci51NjQJZDI1LGQyMSwjMzQKKwl2c2xpLjY0CWQyNCxkMjEsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjEsIzM5CisJdmFkZC5pNjQJZDI4LGQxMQorCXZzbGkuNjQJZDI1LGQyMSwjMzAKKwl2ZW9yCWQzMCxkMjEsZDIyCisJdnNsaS42NAlkMjYsZDIxLCMyNQorCXZlb3IJZDIwLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIzLGQyMgkJQCBNYWooYSxiLGMpCisJdmVvcglkMjAsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTYsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIwLGQzMAorCXZzaHIudTY0CWQyNCxkMTYsIzE0CUAgMTIKKyNpZiAxMjwxNgorCXZsZDEuNjQJe2QxMn0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxNiwjMTgKKyNpZiAxMj4wCisJdmFkZC5pNjQJZDIwLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTYsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTYsIzUwCisJdnNsaS42NAlkMjUsZDE2LCM0NgorCXZtb3YJZDI5LGQxNgorCXZzbGkuNjQJZDI2LGQxNiwjMjMKKyNpZiAxMjwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMTIsZDEyCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTcsZDE4CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjAsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxOQorCXZzaHIudTY0CWQyNSxkMjAsIzM0CisJdnNsaS42NAlkMjQsZDIwLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIwLCMzOQorCXZhZGQuaTY0CWQyOCxkMTIKKwl2c2xpLjY0CWQyNSxkMjAsIzMwCisJdmVvcglkMzAsZDIwLGQyMQorCXZzbGkuNjQJZDI2LGQyMCwjMjUKKwl2ZW9yCWQxOSxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMixkMjEJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE5LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIzLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxOSxkMzAKKwl2c2hyLnU2NAlkMjQsZDIzLCMxNAlAIDEzCisjaWYgMTM8MTYKKwl2bGQxLjY0CXtkMTN9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMjMsIzE4CisjaWYgMTM+MAorCXZhZGQuaTY0CWQxOSxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIzLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIzLCM1MAorCXZzbGkuNjQJZDI1LGQyMywjNDYKKwl2bW92CWQyOSxkMjMKKwl2c2xpLjY0CWQyNixkMjMsIzIzCisjaWYgMTM8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJZDEzLGQxMworI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE2LGQxNwkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE5LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTgKKwl2c2hyLnU2NAlkMjUsZDE5LCMzNAorCXZzbGkuNjQJZDI0LGQxOSwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxOSwjMzkKKwl2YWRkLmk2NAlkMjgsZDEzCisJdnNsaS42NAlkMjUsZDE5LCMzMAorCXZlb3IJZDMwLGQxOSxkMjAKKwl2c2xpLjY0CWQyNixkMTksIzI1CisJdmVvcglkMTgsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjEsZDIwCQlAIE1haihhLGIsYykKKwl2ZW9yCWQxOCxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMixkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTgsZDMwCisJdnNoci51NjQJZDI0LGQyMiwjMTQJQCAxNAorI2lmIDE0PDE2CisJdmxkMS42NAl7ZDE0fSxbcjFdIQlAIGhhbmRsZXMgdW5hbGlnbmVkCisjZW5kaWYKKwl2c2hyLnU2NAlkMjUsZDIyLCMxOAorI2lmIDE0PjAKKwl2YWRkLmk2NAlkMTgsZDMwCQkJQCBoKz1NYWogZnJvbSB0aGUgcGFzdAorI2VuZGlmCisJdnNoci51NjQJZDI2LGQyMiwjNDEKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMiwjNTAKKwl2c2xpLjY0CWQyNSxkMjIsIzQ2CisJdm1vdglkMjksZDIyCisJdnNsaS42NAlkMjYsZDIyLCMyMworI2lmIDE0PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CWQxNCxkMTQKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMyxkMTYJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxOCwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE3CisJdnNoci51NjQJZDI1LGQxOCwjMzQKKwl2c2xpLjY0CWQyNCxkMTgsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTgsIzM5CisJdmFkZC5pNjQJZDI4LGQxNAorCXZzbGkuNjQJZDI1LGQxOCwjMzAKKwl2ZW9yCWQzMCxkMTgsZDE5CisJdnNsaS42NAlkMjYsZDE4LCMyNQorCXZlb3IJZDE3LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIwLGQxOQkJQCBNYWooYSxiLGMpCisJdmVvcglkMTcsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjEsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE3LGQzMAorCXZzaHIudTY0CWQyNCxkMjEsIzE0CUAgMTUKKyNpZiAxNTwxNgorCXZsZDEuNjQJe2QxNX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMSwjMTgKKyNpZiAxNT4wCisJdmFkZC5pNjQJZDE3LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjEsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjEsIzUwCisJdnNsaS42NAlkMjUsZDIxLCM0NgorCXZtb3YJZDI5LGQyMQorCXZzbGkuNjQJZDI2LGQyMSwjMjMKKyNpZiAxNTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAlkMTUsZDE1CisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjIsZDIzCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTcsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxNgorCXZzaHIudTY0CWQyNSxkMTcsIzM0CisJdnNsaS42NAlkMjQsZDE3LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE3LCMzOQorCXZhZGQuaTY0CWQyOCxkMTUKKwl2c2xpLjY0CWQyNSxkMTcsIzMwCisJdmVvcglkMzAsZDE3LGQxOAorCXZzbGkuNjQJZDI2LGQxNywjMjUKKwl2ZW9yCWQxNixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOSxkMTgJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE2LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIwLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxNixkMzAKKwltb3YJcjEyLCM0CisuTDE2Xzc5X25lb246CisJc3VicwlyMTIsIzEKKwl2c2hyLnU2NAlxMTIscTcsIzE5CisJdnNoci51NjQJcTEzLHE3LCM2MQorCXZhZGQuaTY0CWQxNixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHE3LCM2CisJdnNsaS42NAlxMTIscTcsIzQ1CisJdmV4dC44CXExNCxxMCxxMSwjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHE3LCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxMCxxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHE0LHE1LCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQyMCwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTAscTE0CisJdnNoci51NjQJZDI1LGQyMCwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDIwLCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMCxxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMCwjNTAKKwl2c2xpLjY0CWQyNSxkMjAsIzQ2CisJdm1vdglkMjksZDIwCisJdnNsaS42NAlkMjYsZDIwLCMyMworI2lmIDE2PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMSxkMjIJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxNiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIzCisJdnNoci51NjQJZDI1LGQxNiwjMzQKKwl2c2xpLjY0CWQyNCxkMTYsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTYsIzM5CisJdmFkZC5pNjQJZDI4LGQwCisJdnNsaS42NAlkMjUsZDE2LCMzMAorCXZlb3IJZDMwLGQxNixkMTcKKwl2c2xpLjY0CWQyNixkMTYsIzI1CisJdmVvcglkMjMsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTgsZDE3CQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMyxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxOSxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjMsZDMwCisJdnNoci51NjQJZDI0LGQxOSwjMTQJQCAxNworI2lmIDE3PDE2CisJdmxkMS42NAl7ZDF9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTksIzE4CisjaWYgMTc+MAorCXZhZGQuaTY0CWQyMyxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE5LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE5LCM1MAorCXZzbGkuNjQJZDI1LGQxOSwjNDYKKwl2bW92CWQyOSxkMTkKKwl2c2xpLjY0CWQyNixkMTksIzIzCisjaWYgMTc8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIwLGQyMQkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIzLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjIKKwl2c2hyLnU2NAlkMjUsZDIzLCMzNAorCXZzbGkuNjQJZDI0LGQyMywjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMywjMzkKKwl2YWRkLmk2NAlkMjgsZDEKKwl2c2xpLjY0CWQyNSxkMjMsIzMwCisJdmVvcglkMzAsZDIzLGQxNgorCXZzbGkuNjQJZDI2LGQyMywjMjUKKwl2ZW9yCWQyMixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxNyxkMTYJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIyLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE4LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMixkMzAKKwl2c2hyLnU2NAlxMTIscTAsIzE5CisJdnNoci51NjQJcTEzLHEwLCM2MQorCXZhZGQuaTY0CWQyMixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHEwLCM2CisJdnNsaS42NAlxMTIscTAsIzQ1CisJdmV4dC44CXExNCxxMSxxMiwjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHEwLCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxMSxxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHE1LHE2LCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQxOCwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTEscTE0CisJdnNoci51NjQJZDI1LGQxOCwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDE4LCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMSxxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxOCwjNTAKKwl2c2xpLjY0CWQyNSxkMTgsIzQ2CisJdm1vdglkMjksZDE4CisJdnNsaS42NAlkMjYsZDE4LCMyMworI2lmIDE4PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxOSxkMjAJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIxCisJdnNoci51NjQJZDI1LGQyMiwjMzQKKwl2c2xpLjY0CWQyNCxkMjIsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjIsIzM5CisJdmFkZC5pNjQJZDI4LGQyCisJdnNsaS42NAlkMjUsZDIyLCMzMAorCXZlb3IJZDMwLGQyMixkMjMKKwl2c2xpLjY0CWQyNixkMjIsIzI1CisJdmVvcglkMjEsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTYsZDIzCQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxNyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjEsZDMwCisJdnNoci51NjQJZDI0LGQxNywjMTQJQCAxOQorI2lmIDE5PDE2CisJdmxkMS42NAl7ZDN9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTcsIzE4CisjaWYgMTk+MAorCXZhZGQuaTY0CWQyMSxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE3LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE3LCM1MAorCXZzbGkuNjQJZDI1LGQxNywjNDYKKwl2bW92CWQyOSxkMTcKKwl2c2xpLjY0CWQyNixkMTcsIzIzCisjaWYgMTk8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE4LGQxOQkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIxLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjAKKwl2c2hyLnU2NAlkMjUsZDIxLCMzNAorCXZzbGkuNjQJZDI0LGQyMSwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMSwjMzkKKwl2YWRkLmk2NAlkMjgsZDMKKwl2c2xpLjY0CWQyNSxkMjEsIzMwCisJdmVvcglkMzAsZDIxLGQyMgorCXZzbGkuNjQJZDI2LGQyMSwjMjUKKwl2ZW9yCWQyMCxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMyxkMjIJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIwLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE2LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMCxkMzAKKwl2c2hyLnU2NAlxMTIscTEsIzE5CisJdnNoci51NjQJcTEzLHExLCM2MQorCXZhZGQuaTY0CWQyMCxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHExLCM2CisJdnNsaS42NAlxMTIscTEsIzQ1CisJdmV4dC44CXExNCxxMixxMywjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHExLCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxMixxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHE2LHE3LCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQxNiwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTIscTE0CisJdnNoci51NjQJZDI1LGQxNiwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDE2LCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMixxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxNiwjNTAKKwl2c2xpLjY0CWQyNSxkMTYsIzQ2CisJdm1vdglkMjksZDE2CisJdnNsaS42NAlkMjYsZDE2LCMyMworI2lmIDIwPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxNyxkMTgJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMCwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE5CisJdnNoci51NjQJZDI1LGQyMCwjMzQKKwl2c2xpLjY0CWQyNCxkMjAsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjAsIzM5CisJdmFkZC5pNjQJZDI4LGQ0CisJdnNsaS42NAlkMjUsZDIwLCMzMAorCXZlb3IJZDMwLGQyMCxkMjEKKwl2c2xpLjY0CWQyNixkMjAsIzI1CisJdmVvcglkMTksZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjIsZDIxCQlAIE1haihhLGIsYykKKwl2ZW9yCWQxOSxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMyxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTksZDMwCisJdnNoci51NjQJZDI0LGQyMywjMTQJQCAyMQorI2lmIDIxPDE2CisJdmxkMS42NAl7ZDV9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMjMsIzE4CisjaWYgMjE+MAorCXZhZGQuaTY0CWQxOSxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIzLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIzLCM1MAorCXZzbGkuNjQJZDI1LGQyMywjNDYKKwl2bW92CWQyOSxkMjMKKwl2c2xpLjY0CWQyNixkMjMsIzIzCisjaWYgMjE8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDE2LGQxNwkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE5LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTgKKwl2c2hyLnU2NAlkMjUsZDE5LCMzNAorCXZzbGkuNjQJZDI0LGQxOSwjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxOSwjMzkKKwl2YWRkLmk2NAlkMjgsZDUKKwl2c2xpLjY0CWQyNSxkMTksIzMwCisJdmVvcglkMzAsZDE5LGQyMAorCXZzbGkuNjQJZDI2LGQxOSwjMjUKKwl2ZW9yCWQxOCxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMSxkMjAJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE4LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIyLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxOCxkMzAKKwl2c2hyLnU2NAlxMTIscTIsIzE5CisJdnNoci51NjQJcTEzLHEyLCM2MQorCXZhZGQuaTY0CWQxOCxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHEyLCM2CisJdnNsaS42NAlxMTIscTIsIzQ1CisJdmV4dC44CXExNCxxMyxxNCwjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHEyLCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxMyxxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHE3LHEwLCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQyMiwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTMscTE0CisJdnNoci51NjQJZDI1LGQyMiwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDIyLCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxMyxxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMiwjNTAKKwl2c2xpLjY0CWQyNSxkMjIsIzQ2CisJdm1vdglkMjksZDIyCisJdnNsaS42NAlkMjYsZDIyLCMyMworI2lmIDIyPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMyxkMTYJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxOCwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE3CisJdnNoci51NjQJZDI1LGQxOCwjMzQKKwl2c2xpLjY0CWQyNCxkMTgsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTgsIzM5CisJdmFkZC5pNjQJZDI4LGQ2CisJdnNsaS42NAlkMjUsZDE4LCMzMAorCXZlb3IJZDMwLGQxOCxkMTkKKwl2c2xpLjY0CWQyNixkMTgsIzI1CisJdmVvcglkMTcsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMjAsZDE5CQlAIE1haihhLGIsYykKKwl2ZW9yCWQxNyxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQyMSxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMTcsZDMwCisJdnNoci51NjQJZDI0LGQyMSwjMTQJQCAyMworI2lmIDIzPDE2CisJdmxkMS42NAl7ZDd9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMjEsIzE4CisjaWYgMjM+MAorCXZhZGQuaTY0CWQxNyxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDIxLCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDIxLCM1MAorCXZzbGkuNjQJZDI1LGQyMSwjNDYKKwl2bW92CWQyOSxkMjEKKwl2c2xpLjY0CWQyNixkMjEsIzIzCisjaWYgMjM8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIyLGQyMwkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDE3LCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMTYKKwl2c2hyLnU2NAlkMjUsZDE3LCMzNAorCXZzbGkuNjQJZDI0LGQxNywjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQxNywjMzkKKwl2YWRkLmk2NAlkMjgsZDcKKwl2c2xpLjY0CWQyNSxkMTcsIzMwCisJdmVvcglkMzAsZDE3LGQxOAorCXZzbGkuNjQJZDI2LGQxNywjMjUKKwl2ZW9yCWQxNixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOSxkMTgJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE2LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIwLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxNixkMzAKKwl2c2hyLnU2NAlxMTIscTMsIzE5CisJdnNoci51NjQJcTEzLHEzLCM2MQorCXZhZGQuaTY0CWQxNixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHEzLCM2CisJdnNsaS42NAlxMTIscTMsIzQ1CisJdmV4dC44CXExNCxxNCxxNSwjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHEzLCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxNCxxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHEwLHExLCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQyMCwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTQscTE0CisJdnNoci51NjQJZDI1LGQyMCwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDIwLCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNCxxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMCwjNTAKKwl2c2xpLjY0CWQyNSxkMjAsIzQ2CisJdm1vdglkMjksZDIwCisJdnNsaS42NAlkMjYsZDIwLCMyMworI2lmIDI0PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMSxkMjIJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxNiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIzCisJdnNoci51NjQJZDI1LGQxNiwjMzQKKwl2c2xpLjY0CWQyNCxkMTYsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTYsIzM5CisJdmFkZC5pNjQJZDI4LGQ4CisJdnNsaS42NAlkMjUsZDE2LCMzMAorCXZlb3IJZDMwLGQxNixkMTcKKwl2c2xpLjY0CWQyNixkMTYsIzI1CisJdmVvcglkMjMsZDI0LGQyNQorCXZhZGQuaTY0CWQyNyxkMjgKKwl2YnNsCWQzMCxkMTgsZDE3CQlAIE1haihhLGIsYykKKwl2ZW9yCWQyMyxkMjYJCQlAIFNpZ21hMChhKQorCXZhZGQuaTY0CWQxOSxkMjcKKwl2YWRkLmk2NAlkMzAsZDI3CisJQCB2YWRkLmk2NAlkMjMsZDMwCisJdnNoci51NjQJZDI0LGQxOSwjMTQJQCAyNQorI2lmIDI1PDE2CisJdmxkMS42NAl7ZDl9LFtyMV0hCUAgaGFuZGxlcyB1bmFsaWduZWQKKyNlbmRpZgorCXZzaHIudTY0CWQyNSxkMTksIzE4CisjaWYgMjU+MAorCXZhZGQuaTY0CWQyMyxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisjZW5kaWYKKwl2c2hyLnU2NAlkMjYsZDE5LCM0MQorCXZsZDEuNjQJe2QyOH0sW3IzLDo2NF0hCUAgS1tpKytdCisJdnNsaS42NAlkMjQsZDE5LCM1MAorCXZzbGkuNjQJZDI1LGQxOSwjNDYKKwl2bW92CWQyOSxkMTkKKwl2c2xpLjY0CWQyNixkMTksIzIzCisjaWYgMjU8MTYgJiYgZGVmaW5lZChfX0FSTUVMX18pCisJdnJldjY0LjgJLAorI2VuZGlmCisJdmVvcglkMjUsZDI0CisJdmJzbAlkMjksZDIwLGQyMQkJQCBDaChlLGYsZykKKwl2c2hyLnU2NAlkMjQsZDIzLCMyOAorCXZlb3IJZDI2LGQyNQkJCUAgU2lnbWExKGUpCisJdmFkZC5pNjQJZDI3LGQyOSxkMjIKKwl2c2hyLnU2NAlkMjUsZDIzLCMzNAorCXZzbGkuNjQJZDI0LGQyMywjMzYKKwl2YWRkLmk2NAlkMjcsZDI2CisJdnNoci51NjQJZDI2LGQyMywjMzkKKwl2YWRkLmk2NAlkMjgsZDkKKwl2c2xpLjY0CWQyNSxkMjMsIzMwCisJdmVvcglkMzAsZDIzLGQxNgorCXZzbGkuNjQJZDI2LGQyMywjMjUKKwl2ZW9yCWQyMixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxNyxkMTYJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIyLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE4LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMixkMzAKKwl2c2hyLnU2NAlxMTIscTQsIzE5CisJdnNoci51NjQJcTEzLHE0LCM2MQorCXZhZGQuaTY0CWQyMixkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHE0LCM2CisJdnNsaS42NAlxMTIscTQsIzQ1CisJdmV4dC44CXExNCxxNSxxNiwjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHE0LCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxNSxxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHExLHEyLCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQxOCwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTUscTE0CisJdnNoci51NjQJZDI1LGQxOCwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDE4LCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNSxxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxOCwjNTAKKwl2c2xpLjY0CWQyNSxkMTgsIzQ2CisJdm1vdglkMjksZDE4CisJdnNsaS42NAlkMjYsZDE4LCMyMworI2lmIDI2PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxOSxkMjAJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMiwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDIxCisJdnNoci51NjQJZDI1LGQyMiwjMzQKKwl2c2xpLjY0CWQyNCxkMjIsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjIsIzM5CisJdmFkZC5pNjQJZDI4LGQxMAorCXZzbGkuNjQJZDI1LGQyMiwjMzAKKwl2ZW9yCWQzMCxkMjIsZDIzCisJdnNsaS42NAlkMjYsZDIyLCMyNQorCXZlb3IJZDIxLGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDE2LGQyMwkJQCBNYWooYSxiLGMpCisJdmVvcglkMjEsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMTcsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDIxLGQzMAorCXZzaHIudTY0CWQyNCxkMTcsIzE0CUAgMjcKKyNpZiAyNzwxNgorCXZsZDEuNjQJe2QxMX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQxNywjMTgKKyNpZiAyNz4wCisJdmFkZC5pNjQJZDIxLGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMTcsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMTcsIzUwCisJdnNsaS42NAlkMjUsZDE3LCM0NgorCXZtb3YJZDI5LGQxNworCXZzbGkuNjQJZDI2LGQxNywjMjMKKyNpZiAyNzwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTgsZDE5CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMjEsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQyMAorCXZzaHIudTY0CWQyNSxkMjEsIzM0CisJdnNsaS42NAlkMjQsZDIxLCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDIxLCMzOQorCXZhZGQuaTY0CWQyOCxkMTEKKwl2c2xpLjY0CWQyNSxkMjEsIzMwCisJdmVvcglkMzAsZDIxLGQyMgorCXZzbGkuNjQJZDI2LGQyMSwjMjUKKwl2ZW9yCWQyMCxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMyxkMjIJCUAgTWFqKGEsYixjKQorCXZlb3IJZDIwLGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDE2LGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQyMCxkMzAKKwl2c2hyLnU2NAlxMTIscTUsIzE5CisJdnNoci51NjQJcTEzLHE1LCM2MQorCXZhZGQuaTY0CWQyMCxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHE1LCM2CisJdnNsaS42NAlxMTIscTUsIzQ1CisJdmV4dC44CXExNCxxNixxNywjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHE1LCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxNixxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHEyLHEzLCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQxNiwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTYscTE0CisJdnNoci51NjQJZDI1LGQxNiwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDE2LCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNixxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQxNiwjNTAKKwl2c2xpLjY0CWQyNSxkMTYsIzQ2CisJdm1vdglkMjksZDE2CisJdnNsaS42NAlkMjYsZDE2LCMyMworI2lmIDI4PDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQxNyxkMTgJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQyMCwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE5CisJdnNoci51NjQJZDI1LGQyMCwjMzQKKwl2c2xpLjY0CWQyNCxkMjAsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMjAsIzM5CisJdmFkZC5pNjQJZDI4LGQxMgorCXZzbGkuNjQJZDI1LGQyMCwjMzAKKwl2ZW9yCWQzMCxkMjAsZDIxCisJdnNsaS42NAlkMjYsZDIwLCMyNQorCXZlb3IJZDE5LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIyLGQyMQkJQCBNYWooYSxiLGMpCisJdmVvcglkMTksZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjMsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE5LGQzMAorCXZzaHIudTY0CWQyNCxkMjMsIzE0CUAgMjkKKyNpZiAyOTwxNgorCXZsZDEuNjQJe2QxM30sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMywjMTgKKyNpZiAyOT4wCisJdmFkZC5pNjQJZDE5LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjMsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjMsIzUwCisJdnNsaS42NAlkMjUsZDIzLCM0NgorCXZtb3YJZDI5LGQyMworCXZzbGkuNjQJZDI2LGQyMywjMjMKKyNpZiAyOTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMTYsZDE3CQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTksIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxOAorCXZzaHIudTY0CWQyNSxkMTksIzM0CisJdnNsaS42NAlkMjQsZDE5LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE5LCMzOQorCXZhZGQuaTY0CWQyOCxkMTMKKwl2c2xpLjY0CWQyNSxkMTksIzMwCisJdmVvcglkMzAsZDE5LGQyMAorCXZzbGkuNjQJZDI2LGQxOSwjMjUKKwl2ZW9yCWQxOCxkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQyMSxkMjAJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE4LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIyLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxOCxkMzAKKwl2c2hyLnU2NAlxMTIscTYsIzE5CisJdnNoci51NjQJcTEzLHE2LCM2MQorCXZhZGQuaTY0CWQxOCxkMzAJCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdnNoci51NjQJcTE1LHE2LCM2CisJdnNsaS42NAlxMTIscTYsIzQ1CisJdmV4dC44CXExNCxxNyxxMCwjOAlAIFhbaSsxXQorCXZzbGkuNjQJcTEzLHE2LCMzCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJcTEyLHExNCwjMQorCXZlb3IJcTE1LHExMwkJCQlAIHNpZ21hMShYW2krMTRdKQorCXZzaHIudTY0CXExMyxxMTQsIzgKKwl2YWRkLmk2NAlxNyxxMTUKKwl2c2hyLnU2NAlxMTUscTE0LCM3CisJdnNsaS42NAlxMTIscTE0LCM2MworCXZzbGkuNjQJcTEzLHExNCwjNTYKKwl2ZXh0LjgJcTE0LHEzLHE0LCM4CUAgWFtpKzldCisJdmVvcglxMTUscTEyCisJdnNoci51NjQJZDI0LGQyMiwjMTQJCUAgZnJvbSBORU9OXzAwXzE1CisJdmFkZC5pNjQJcTcscTE0CisJdnNoci51NjQJZDI1LGQyMiwjMTgJCUAgZnJvbSBORU9OXzAwXzE1CisJdmVvcglxMTUscTEzCQkJCUAgc2lnbWEwKFhbaSsxXSkKKwl2c2hyLnU2NAlkMjYsZDIyLCM0MQkJQCBmcm9tIE5FT05fMDBfMTUKKwl2YWRkLmk2NAlxNyxxMTUKKwl2bGQxLjY0CXtkMjh9LFtyMyw6NjRdIQlAIEtbaSsrXQorCXZzbGkuNjQJZDI0LGQyMiwjNTAKKwl2c2xpLjY0CWQyNSxkMjIsIzQ2CisJdm1vdglkMjksZDIyCisJdnNsaS42NAlkMjYsZDIyLCMyMworI2lmIDMwPDE2ICYmIGRlZmluZWQoX19BUk1FTF9fKQorCXZyZXY2NC44CSwKKyNlbmRpZgorCXZlb3IJZDI1LGQyNAorCXZic2wJZDI5LGQyMyxkMTYJCUAgQ2goZSxmLGcpCisJdnNoci51NjQJZDI0LGQxOCwjMjgKKwl2ZW9yCWQyNixkMjUJCQlAIFNpZ21hMShlKQorCXZhZGQuaTY0CWQyNyxkMjksZDE3CisJdnNoci51NjQJZDI1LGQxOCwjMzQKKwl2c2xpLjY0CWQyNCxkMTgsIzM2CisJdmFkZC5pNjQJZDI3LGQyNgorCXZzaHIudTY0CWQyNixkMTgsIzM5CisJdmFkZC5pNjQJZDI4LGQxNAorCXZzbGkuNjQJZDI1LGQxOCwjMzAKKwl2ZW9yCWQzMCxkMTgsZDE5CisJdnNsaS42NAlkMjYsZDE4LCMyNQorCXZlb3IJZDE3LGQyNCxkMjUKKwl2YWRkLmk2NAlkMjcsZDI4CisJdmJzbAlkMzAsZDIwLGQxOQkJQCBNYWooYSxiLGMpCisJdmVvcglkMTcsZDI2CQkJQCBTaWdtYTAoYSkKKwl2YWRkLmk2NAlkMjEsZDI3CisJdmFkZC5pNjQJZDMwLGQyNworCUAgdmFkZC5pNjQJZDE3LGQzMAorCXZzaHIudTY0CWQyNCxkMjEsIzE0CUAgMzEKKyNpZiAzMTwxNgorCXZsZDEuNjQJe2QxNX0sW3IxXSEJQCBoYW5kbGVzIHVuYWxpZ25lZAorI2VuZGlmCisJdnNoci51NjQJZDI1LGQyMSwjMTgKKyNpZiAzMT4wCisJdmFkZC5pNjQJZDE3LGQzMAkJCUAgaCs9TWFqIGZyb20gdGhlIHBhc3QKKyNlbmRpZgorCXZzaHIudTY0CWQyNixkMjEsIzQxCisJdmxkMS42NAl7ZDI4fSxbcjMsOjY0XSEJQCBLW2krK10KKwl2c2xpLjY0CWQyNCxkMjEsIzUwCisJdnNsaS42NAlkMjUsZDIxLCM0NgorCXZtb3YJZDI5LGQyMQorCXZzbGkuNjQJZDI2LGQyMSwjMjMKKyNpZiAzMTwxNiAmJiBkZWZpbmVkKF9fQVJNRUxfXykKKwl2cmV2NjQuOAksCisjZW5kaWYKKwl2ZW9yCWQyNSxkMjQKKwl2YnNsCWQyOSxkMjIsZDIzCQlAIENoKGUsZixnKQorCXZzaHIudTY0CWQyNCxkMTcsIzI4CisJdmVvcglkMjYsZDI1CQkJQCBTaWdtYTEoZSkKKwl2YWRkLmk2NAlkMjcsZDI5LGQxNgorCXZzaHIudTY0CWQyNSxkMTcsIzM0CisJdnNsaS42NAlkMjQsZDE3LCMzNgorCXZhZGQuaTY0CWQyNyxkMjYKKwl2c2hyLnU2NAlkMjYsZDE3LCMzOQorCXZhZGQuaTY0CWQyOCxkMTUKKwl2c2xpLjY0CWQyNSxkMTcsIzMwCisJdmVvcglkMzAsZDE3LGQxOAorCXZzbGkuNjQJZDI2LGQxNywjMjUKKwl2ZW9yCWQxNixkMjQsZDI1CisJdmFkZC5pNjQJZDI3LGQyOAorCXZic2wJZDMwLGQxOSxkMTgJCUAgTWFqKGEsYixjKQorCXZlb3IJZDE2LGQyNgkJCUAgU2lnbWEwKGEpCisJdmFkZC5pNjQJZDIwLGQyNworCXZhZGQuaTY0CWQzMCxkMjcKKwlAIHZhZGQuaTY0CWQxNixkMzAKKwlibmUJLkwxNl83OV9uZW9uCisKKwl2YWRkLmk2NAlkMTYsZDMwCQlAIGgrPU1haiBmcm9tIHRoZSBwYXN0CisJdmxkbWlhCXIwLHtkMjQsZDI1LGQyNixkMjcsZDI4LGQyOSxkMzAsZDMxfQlAIGxvYWQgY29udGV4dCB0byB0ZW1wCisJdmFkZC5pNjQJcTgscTEyCQlAIHZlY3Rvcml6ZWQgYWNjdW11bGF0ZQorCXZhZGQuaTY0CXE5LHExMworCXZhZGQuaTY0CXExMCxxMTQKKwl2YWRkLmk2NAlxMTEscTE1CisJdnN0bWlhCXIwLHtkMTYsZDE3LGQxOCxkMTksZDIwLGQyMSxkMjIsZDIzfQlAIHNhdmUgY29udGV4dAorCXRlcQlyMSxyMgorCXN1YglyMywjNjQwCUAgcmV3aW5kIEs1MTIKKwlibmUJLkxvb3BfbmVvbgorCisJVkZQX0FCSV9QT1AKKwlieAlscgkJCQlAIC53b3JkCTB4ZTEyZmZmMWUKKy5zaXplCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyX25lb24sLi1zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl9uZW9uCisjZW5kaWYKKy5ieXRlCTgzLDcyLDY1LDUzLDQ5LDUwLDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcsMTEwLDExNSwxMDIsMTExLDExNCwxMDksMzIsMTAyLDExMSwxMTQsMzIsNjUsODIsNzcsMTE4LDUyLDQ3LDc4LDY5LDc5LDc4LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgkyCisuYWxpZ24JMgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKy5jb21tCU9QRU5TU0xfYXJtY2FwX1AsNCw0CisuaGlkZGVuCU9QRU5TU0xfYXJtY2FwX1AKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXBwYzY0bGUvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzcDgtcHBjLlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXBwYzY0bGUvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzcDgtcHBjLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhZDJkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtcHBjNjRsZS9jcnlwdG8vZmlwc21vZHVsZS9hZXNwOC1wcGMuUwpAQCAtMCwwICsxLDM2NTggQEAKKy5tYWNoaW5lCSJhbnkiCisKKy5hYml2ZXJzaW9uCTIKKy50ZXh0CisKKy5hbGlnbgk3CisuTHJjb246CisuYnl0ZQkweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxCisuYnl0ZQkweDAwLDB4MDAsMHgwMCwweDFiLDB4MDAsMHgwMCwweDAwLDB4MWIsMHgwMCwweDAwLDB4MDAsMHgxYiwweDAwLDB4MDAsMHgwMCwweDFiCisuYnl0ZQkweDBjLDB4MGYsMHgwZSwweDBkLDB4MGMsMHgwZiwweDBlLDB4MGQsMHgwYywweDBmLDB4MGUsMHgwZCwweDBjLDB4MGYsMHgwZSwweDBkCisuYnl0ZQkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuTGNvbnN0czoKKwltZmxyCTAKKwliY2wJMjAsMzEsJCs0CisJbWZscgk2CisJYWRkaQk2LDYsLTB4NDgKKwltdGxyCTAKKwlibHIJCisubG9uZwkwCisuYnl0ZQkwLDEyLDB4MTQsMCwwLDAsMCwwCisuYnl0ZQk2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiw4MCwxMTEsMTE5LDEwMSwxMTQsNzMsODMsNjUsMzIsNTAsNDYsNDgsNTUsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTIKKworLmdsb2JsCWFlc19od19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCWFlc19od19zZXRfZW5jcnlwdF9rZXksQGZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X3NldF9lbmNyeXB0X2tleToKKy5sb2NhbGVudHJ5CWFlc19od19zZXRfZW5jcnlwdF9rZXksMAorCisuTHNldF9lbmNyeXB0X2tleToKKwltZmxyCTExCisJc3RkCTExLDE2KDEpCisKKwlsaQk2LC0xCisJY21wbGRpCTMsMAorCWJlcS0JLkxlbmNfa2V5X2Fib3J0CisJY21wbGRpCTUsMAorCWJlcS0JLkxlbmNfa2V5X2Fib3J0CisJbGkJNiwtMgorCWNtcHdpCTQsMTI4CisJYmx0LQkuTGVuY19rZXlfYWJvcnQKKwljbXB3aQk0LDI1NgorCWJndC0JLkxlbmNfa2V5X2Fib3J0CisJYW5kaS4JMCw0LDB4M2YKKwlibmUtCS5MZW5jX2tleV9hYm9ydAorCisJbGlzCTAsMHhmZmYwCisJbGkJMTIsLTEKKwlvcgkwLDAsMAorCisJYmwJLkxjb25zdHMKKwltdGxyCTExCisKKwluZWcJOSwzCisJbHZ4CTEsMCwzCisJYWRkaQkzLDMsMTUKKwlsdnNyCTMsMCw5CisJbGkJOCwweDIwCisJY21wd2kJNCwxOTIKKwlsdngJMiwwLDMKKwl2c3BsdGlzYgk1LDB4MGYKKwlsdngJNCwwLDYKKwl2eG9yCTMsMyw1CisJbHZ4CTUsOCw2CisJYWRkaQk2LDYsMHgxMAorCXZwZXJtCTEsMSwyLDMKKwlsaQk3LDgKKwl2eG9yCTAsMCwwCisJbXRjdHIJNworCisJbHZzbAk4LDAsNQorCXZzcGx0aXNiCTksLTEKKwlsdngJMTAsMCw1CisJdnBlcm0JOSw5LDAsOAorCisJYmx0CS5Mb29wMTI4CisJYWRkaQkzLDMsOAorCWJlcQkuTDE5MgorCWFkZGkJMywzLDgKKwliCS5MMjU2CisKKy5hbGlnbgk0CisuTG9vcDEyODoKKwl2cGVybQkzLDEsMSw1CisJdnNsZG9pCTYsMCwxLDEyCisJdnBlcm0JMTEsMSwxLDgKKwl2c2VsCTcsMTAsMTEsOQorCXZvcgkxMCwxMSwxMQorCS5sb25nCTB4MTA2MzI1MDkKKwlzdHZ4CTcsMCw1CisJYWRkaQk1LDUsMTYKKworCXZ4b3IJMSwxLDYKKwl2c2xkb2kJNiwwLDYsMTIKKwl2eG9yCTEsMSw2CisJdnNsZG9pCTYsMCw2LDEyCisJdnhvcgkxLDEsNgorCXZhZGR1d20JNCw0LDQKKwl2eG9yCTEsMSwzCisJYmRuegkuTG9vcDEyOAorCisJbHZ4CTQsMCw2CisKKwl2cGVybQkzLDEsMSw1CisJdnNsZG9pCTYsMCwxLDEyCisJdnBlcm0JMTEsMSwxLDgKKwl2c2VsCTcsMTAsMTEsOQorCXZvcgkxMCwxMSwxMQorCS5sb25nCTB4MTA2MzI1MDkKKwlzdHZ4CTcsMCw1CisJYWRkaQk1LDUsMTYKKworCXZ4b3IJMSwxLDYKKwl2c2xkb2kJNiwwLDYsMTIKKwl2eG9yCTEsMSw2CisJdnNsZG9pCTYsMCw2LDEyCisJdnhvcgkxLDEsNgorCXZhZGR1d20JNCw0LDQKKwl2eG9yCTEsMSwzCisKKwl2cGVybQkzLDEsMSw1CisJdnNsZG9pCTYsMCwxLDEyCisJdnBlcm0JMTEsMSwxLDgKKwl2c2VsCTcsMTAsMTEsOQorCXZvcgkxMCwxMSwxMQorCS5sb25nCTB4MTA2MzI1MDkKKwlzdHZ4CTcsMCw1CisJYWRkaQk1LDUsMTYKKworCXZ4b3IJMSwxLDYKKwl2c2xkb2kJNiwwLDYsMTIKKwl2eG9yCTEsMSw2CisJdnNsZG9pCTYsMCw2LDEyCisJdnhvcgkxLDEsNgorCXZ4b3IJMSwxLDMKKwl2cGVybQkxMSwxLDEsOAorCXZzZWwJNywxMCwxMSw5CisJdm9yCTEwLDExLDExCisJc3R2eAk3LDAsNQorCisJYWRkaQkzLDUsMTUKKwlhZGRpCTUsNSwweDUwCisKKwlsaQk4LDEwCisJYgkuTGRvbmUKKworLmFsaWduCTQKKy5MMTkyOgorCWx2eAk2LDAsMworCWxpCTcsNAorCXZwZXJtCTExLDEsMSw4CisJdnNlbAk3LDEwLDExLDkKKwl2b3IJMTAsMTEsMTEKKwlzdHZ4CTcsMCw1CisJYWRkaQk1LDUsMTYKKwl2cGVybQkyLDIsNiwzCisJdnNwbHRpc2IJMyw4CisJbXRjdHIJNworCXZzdWJ1Ym0JNSw1LDMKKworLkxvb3AxOTI6CisJdnBlcm0JMywyLDIsNQorCXZzbGRvaQk2LDAsMSwxMgorCS5sb25nCTB4MTA2MzI1MDkKKworCXZ4b3IJMSwxLDYKKwl2c2xkb2kJNiwwLDYsMTIKKwl2eG9yCTEsMSw2CisJdnNsZG9pCTYsMCw2LDEyCisJdnhvcgkxLDEsNgorCisJdnNsZG9pCTcsMCwyLDgKKwl2c3BsdHcJNiwxLDMKKwl2eG9yCTYsNiwyCisJdnNsZG9pCTIsMCwyLDEyCisJdmFkZHV3bQk0LDQsNAorCXZ4b3IJMiwyLDYKKwl2eG9yCTEsMSwzCisJdnhvcgkyLDIsMworCXZzbGRvaQk3LDcsMSw4CisKKwl2cGVybQkzLDIsMiw1CisJdnNsZG9pCTYsMCwxLDEyCisJdnBlcm0JMTEsNyw3LDgKKwl2c2VsCTcsMTAsMTEsOQorCXZvcgkxMCwxMSwxMQorCS5sb25nCTB4MTA2MzI1MDkKKwlzdHZ4CTcsMCw1CisJYWRkaQk1LDUsMTYKKworCXZzbGRvaQk3LDEsMiw4CisJdnhvcgkxLDEsNgorCXZzbGRvaQk2LDAsNiwxMgorCXZwZXJtCTExLDcsNyw4CisJdnNlbAk3LDEwLDExLDkKKwl2b3IJMTAsMTEsMTEKKwl2eG9yCTEsMSw2CisJdnNsZG9pCTYsMCw2LDEyCisJdnhvcgkxLDEsNgorCXN0dngJNywwLDUKKwlhZGRpCTUsNSwxNgorCisJdnNwbHR3CTYsMSwzCisJdnhvcgk2LDYsMgorCXZzbGRvaQkyLDAsMiwxMgorCXZhZGR1d20JNCw0LDQKKwl2eG9yCTIsMiw2CisJdnhvcgkxLDEsMworCXZ4b3IJMiwyLDMKKwl2cGVybQkxMSwxLDEsOAorCXZzZWwJNywxMCwxMSw5CisJdm9yCTEwLDExLDExCisJc3R2eAk3LDAsNQorCWFkZGkJMyw1LDE1CisJYWRkaQk1LDUsMTYKKwliZG56CS5Mb29wMTkyCisKKwlsaQk4LDEyCisJYWRkaQk1LDUsMHgyMAorCWIJLkxkb25lCisKKy5hbGlnbgk0CisuTDI1NjoKKwlsdngJNiwwLDMKKwlsaQk3LDcKKwlsaQk4LDE0CisJdnBlcm0JMTEsMSwxLDgKKwl2c2VsCTcsMTAsMTEsOQorCXZvcgkxMCwxMSwxMQorCXN0dngJNywwLDUKKwlhZGRpCTUsNSwxNgorCXZwZXJtCTIsMiw2LDMKKwltdGN0cgk3CisKKy5Mb29wMjU2OgorCXZwZXJtCTMsMiwyLDUKKwl2c2xkb2kJNiwwLDEsMTIKKwl2cGVybQkxMSwyLDIsOAorCXZzZWwJNywxMCwxMSw5CisJdm9yCTEwLDExLDExCisJLmxvbmcJMHgxMDYzMjUwOQorCXN0dngJNywwLDUKKwlhZGRpCTUsNSwxNgorCisJdnhvcgkxLDEsNgorCXZzbGRvaQk2LDAsNiwxMgorCXZ4b3IJMSwxLDYKKwl2c2xkb2kJNiwwLDYsMTIKKwl2eG9yCTEsMSw2CisJdmFkZHV3bQk0LDQsNAorCXZ4b3IJMSwxLDMKKwl2cGVybQkxMSwxLDEsOAorCXZzZWwJNywxMCwxMSw5CisJdm9yCTEwLDExLDExCisJc3R2eAk3LDAsNQorCWFkZGkJMyw1LDE1CisJYWRkaQk1LDUsMTYKKwliZHoJLkxkb25lCisKKwl2c3BsdHcJMywxLDMKKwl2c2xkb2kJNiwwLDIsMTIKKwkubG9uZwkweDEwNjMwNUM4CisKKwl2eG9yCTIsMiw2CisJdnNsZG9pCTYsMCw2LDEyCisJdnhvcgkyLDIsNgorCXZzbGRvaQk2LDAsNiwxMgorCXZ4b3IJMiwyLDYKKworCXZ4b3IJMiwyLDMKKwliCS5Mb29wMjU2CisKKy5hbGlnbgk0CisuTGRvbmU6CisJbHZ4CTIsMCwzCisJdnNlbAkyLDEwLDIsOQorCXN0dngJMiwwLDMKKwlsaQk2LDAKKwlvcgkxMiwxMiwxMgorCXN0dwk4LDAoNSkKKworLkxlbmNfa2V5X2Fib3J0OgorCW1yCTMsNgorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgxNCwxLDAsMCwzLDAKKy5sb25nCTAKKy5zaXplCWFlc19od19zZXRfZW5jcnlwdF9rZXksLi1hZXNfaHdfc2V0X2VuY3J5cHRfa2V5CisKKy5nbG9ibAlhZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlhZXNfaHdfc2V0X2RlY3J5cHRfa2V5LEBmdW5jdGlvbgorLmFsaWduCTUKK2Flc19od19zZXRfZGVjcnlwdF9rZXk6CisubG9jYWxlbnRyeQlhZXNfaHdfc2V0X2RlY3J5cHRfa2V5LDAKKworCXN0ZHUJMSwtNjQoMSkKKwltZmxyCTEwCisJc3RkCTEwLDgwKDEpCisJYmwJLkxzZXRfZW5jcnlwdF9rZXkKKwltdGxyCTEwCisKKwljbXB3aQkzLDAKKwlibmUtCS5MZGVjX2tleV9hYm9ydAorCisJc2x3aQk3LDgsNAorCXN1YmkJMyw1LDI0MAorCXNyd2kJOCw4LDEKKwlhZGQJNSwzLDcKKwltdGN0cgk4CisKKy5MZGVja2V5OgorCWx3egkwLCAwKDMpCisJbHd6CTYsIDQoMykKKwlsd3oJNywgOCgzKQorCWx3egk4LCAxMigzKQorCWFkZGkJMywzLDE2CisJbHd6CTksIDAoNSkKKwlsd3oJMTAsNCg1KQorCWx3egkxMSw4KDUpCisJbHd6CTEyLDEyKDUpCisJc3R3CTAsIDAoNSkKKwlzdHcJNiwgNCg1KQorCXN0dwk3LCA4KDUpCisJc3R3CTgsIDEyKDUpCisJc3ViaQk1LDUsMTYKKwlzdHcJOSwgLTE2KDMpCisJc3R3CTEwLC0xMigzKQorCXN0dwkxMSwtOCgzKQorCXN0dwkxMiwtNCgzKQorCWJkbnoJLkxkZWNrZXkKKworCXhvcgkzLDMsMworLkxkZWNfa2V5X2Fib3J0OgorCWFkZGkJMSwxLDY0CisJYmxyCQorLmxvbmcJMAorLmJ5dGUJMCwxMiw0LDEsMHg4MCwwLDMsMAorLmxvbmcJMAorLnNpemUJYWVzX2h3X3NldF9kZWNyeXB0X2tleSwuLWFlc19od19zZXRfZGVjcnlwdF9rZXkKKy5nbG9ibAlhZXNfaHdfZW5jcnlwdAorLnR5cGUJYWVzX2h3X2VuY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X2VuY3J5cHQ6CisubG9jYWxlbnRyeQlhZXNfaHdfZW5jcnlwdCwwCisKKwlsd3oJNiwyNDAoNSkKKwlsaXMJMCwweGZjMDAKKwlsaQkxMiwtMQorCWxpCTcsMTUKKwlvcgkwLDAsMAorCisJbHZ4CTAsMCwzCisJbmVnCTExLDQKKwlsdngJMSw3LDMKKwlsdnNsCTIsMCwzCisJdnNwbHRpc2IJNCwweDBmCisJbHZzcgkzLDAsMTEKKwl2eG9yCTIsMiw0CisJbGkJNywxNgorCXZwZXJtCTAsMCwxLDIKKwlsdngJMSwwLDUKKwlsdnNyCTUsMCw1CisJc3J3aQk2LDYsMQorCWx2eAkyLDcsNQorCWFkZGkJNyw3LDE2CisJc3ViaQk2LDYsMQorCXZwZXJtCTEsMiwxLDUKKworCXZ4b3IJMCwwLDEKKwlsdngJMSw3LDUKKwlhZGRpCTcsNywxNgorCW10Y3RyCTYKKworLkxvb3BfZW5jOgorCXZwZXJtCTIsMSwyLDUKKwkubG9uZwkweDEwMDAxNTA4CisJbHZ4CTIsNyw1CisJYWRkaQk3LDcsMTYKKwl2cGVybQkxLDIsMSw1CisJLmxvbmcJMHgxMDAwMEQwOAorCWx2eAkxLDcsNQorCWFkZGkJNyw3LDE2CisJYmRuegkuTG9vcF9lbmMKKworCXZwZXJtCTIsMSwyLDUKKwkubG9uZwkweDEwMDAxNTA4CisJbHZ4CTIsNyw1CisJdnBlcm0JMSwyLDEsNQorCS5sb25nCTB4MTAwMDBEMDkKKworCXZzcGx0aXNiCTIsLTEKKwl2eG9yCTEsMSwxCisJbGkJNywxNQorCXZwZXJtCTIsMiwxLDMKKwl2eG9yCTMsMyw0CisJbHZ4CTEsMCw0CisJdnBlcm0JMCwwLDAsMworCXZzZWwJMSwxLDAsMgorCWx2eAk0LDcsNAorCXN0dngJMSwwLDQKKwl2c2VsCTAsMCw0LDIKKwlzdHZ4CTAsNyw0CisKKwlvcgkxMiwxMiwxMgorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgxNCwwLDAsMCwzLDAKKy5sb25nCTAKKy5zaXplCWFlc19od19lbmNyeXB0LC4tYWVzX2h3X2VuY3J5cHQKKy5nbG9ibAlhZXNfaHdfZGVjcnlwdAorLnR5cGUJYWVzX2h3X2RlY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X2RlY3J5cHQ6CisubG9jYWxlbnRyeQlhZXNfaHdfZGVjcnlwdCwwCisKKwlsd3oJNiwyNDAoNSkKKwlsaXMJMCwweGZjMDAKKwlsaQkxMiwtMQorCWxpCTcsMTUKKwlvcgkwLDAsMAorCisJbHZ4CTAsMCwzCisJbmVnCTExLDQKKwlsdngJMSw3LDMKKwlsdnNsCTIsMCwzCisJdnNwbHRpc2IJNCwweDBmCisJbHZzcgkzLDAsMTEKKwl2eG9yCTIsMiw0CisJbGkJNywxNgorCXZwZXJtCTAsMCwxLDIKKwlsdngJMSwwLDUKKwlsdnNyCTUsMCw1CisJc3J3aQk2LDYsMQorCWx2eAkyLDcsNQorCWFkZGkJNyw3LDE2CisJc3ViaQk2LDYsMQorCXZwZXJtCTEsMiwxLDUKKworCXZ4b3IJMCwwLDEKKwlsdngJMSw3LDUKKwlhZGRpCTcsNywxNgorCW10Y3RyCTYKKworLkxvb3BfZGVjOgorCXZwZXJtCTIsMSwyLDUKKwkubG9uZwkweDEwMDAxNTQ4CisJbHZ4CTIsNyw1CisJYWRkaQk3LDcsMTYKKwl2cGVybQkxLDIsMSw1CisJLmxvbmcJMHgxMDAwMEQ0OAorCWx2eAkxLDcsNQorCWFkZGkJNyw3LDE2CisJYmRuegkuTG9vcF9kZWMKKworCXZwZXJtCTIsMSwyLDUKKwkubG9uZwkweDEwMDAxNTQ4CisJbHZ4CTIsNyw1CisJdnBlcm0JMSwyLDEsNQorCS5sb25nCTB4MTAwMDBENDkKKworCXZzcGx0aXNiCTIsLTEKKwl2eG9yCTEsMSwxCisJbGkJNywxNQorCXZwZXJtCTIsMiwxLDMKKwl2eG9yCTMsMyw0CisJbHZ4CTEsMCw0CisJdnBlcm0JMCwwLDAsMworCXZzZWwJMSwxLDAsMgorCWx2eAk0LDcsNAorCXN0dngJMSwwLDQKKwl2c2VsCTAsMCw0LDIKKwlzdHZ4CTAsNyw0CisKKwlvcgkxMiwxMiwxMgorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgxNCwwLDAsMCwzLDAKKy5sb25nCTAKKy5zaXplCWFlc19od19kZWNyeXB0LC4tYWVzX2h3X2RlY3J5cHQKKy5nbG9ibAlhZXNfaHdfY2JjX2VuY3J5cHQKKy50eXBlCWFlc19od19jYmNfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgk1CithZXNfaHdfY2JjX2VuY3J5cHQ6CisubG9jYWxlbnRyeQlhZXNfaHdfY2JjX2VuY3J5cHQsMAorCisJY21wbGRpCTUsMTYKKwkubG9uZwkweDRkYzAwMDIwCisKKwljbXB3aQk4LDAKKwlsaXMJMCwweGZmZTAKKwlsaQkxMiwtMQorCW9yCTAsMCwwCisKKwlsaQkxMCwxNQorCXZ4b3IJMCwwLDAKKwl2c3BsdGlzYgkzLDB4MGYKKworCWx2eAk0LDAsNworCWx2c2wJNiwwLDcKKwlsdngJNSwxMCw3CisJdnhvcgk2LDYsMworCXZwZXJtCTQsNCw1LDYKKworCW5lZwkxMSwzCisJbHZzcgkxMCwwLDYKKwlsd3oJOSwyNDAoNikKKworCWx2c3IJNiwwLDExCisJbHZ4CTUsMCwzCisJYWRkaQkzLDMsMTUKKwl2eG9yCTYsNiwzCisKKwlsdnNsCTgsMCw0CisJdnNwbHRpc2IJOSwtMQorCWx2eAk3LDAsNAorCXZwZXJtCTksOSwwLDgKKwl2eG9yCTgsOCwzCisKKwlzcndpCTksOSwxCisJbGkJMTAsMTYKKwlzdWJpCTksOSwxCisJYmVxCS5MY2JjX2RlYworCisuTGNiY19lbmM6CisJdm9yCTIsNSw1CisJbHZ4CTUsMCwzCisJYWRkaQkzLDMsMTYKKwltdGN0cgk5CisJc3ViaQk1LDUsMTYKKworCWx2eAkwLDAsNgorCXZwZXJtCTIsMiw1LDYKKwlsdngJMSwxMCw2CisJYWRkaQkxMCwxMCwxNgorCXZwZXJtCTAsMSwwLDEwCisJdnhvcgkyLDIsMAorCWx2eAkwLDEwLDYKKwlhZGRpCTEwLDEwLDE2CisJdnhvcgkyLDIsNAorCisuTG9vcF9jYmNfZW5jOgorCXZwZXJtCTEsMCwxLDEwCisJLmxvbmcJMHgxMDQyMEQwOAorCWx2eAkxLDEwLDYKKwlhZGRpCTEwLDEwLDE2CisJdnBlcm0JMCwxLDAsMTAKKwkubG9uZwkweDEwNDIwNTA4CisJbHZ4CTAsMTAsNgorCWFkZGkJMTAsMTAsMTYKKwliZG56CS5Mb29wX2NiY19lbmMKKworCXZwZXJtCTEsMCwxLDEwCisJLmxvbmcJMHgxMDQyMEQwOAorCWx2eAkxLDEwLDYKKwlsaQkxMCwxNgorCXZwZXJtCTAsMSwwLDEwCisJLmxvbmcJMHgxMDgyMDUwOQorCWNtcGxkaQk1LDE2CisKKwl2cGVybQkzLDQsNCw4CisJdnNlbAkyLDcsMyw5CisJdm9yCTcsMywzCisJc3R2eAkyLDAsNAorCWFkZGkJNCw0LDE2CisJYmdlCS5MY2JjX2VuYworCisJYgkuTGNiY19kb25lCisKKy5hbGlnbgk0CisuTGNiY19kZWM6CisJY21wbGRpCTUsMTI4CisJYmdlCV9hZXNwOF9jYmNfZGVjcnlwdDh4CisJdm9yCTMsNSw1CisJbHZ4CTUsMCwzCisJYWRkaQkzLDMsMTYKKwltdGN0cgk5CisJc3ViaQk1LDUsMTYKKworCWx2eAkwLDAsNgorCXZwZXJtCTMsMyw1LDYKKwlsdngJMSwxMCw2CisJYWRkaQkxMCwxMCwxNgorCXZwZXJtCTAsMSwwLDEwCisJdnhvcgkyLDMsMAorCWx2eAkwLDEwLDYKKwlhZGRpCTEwLDEwLDE2CisKKy5Mb29wX2NiY19kZWM6CisJdnBlcm0JMSwwLDEsMTAKKwkubG9uZwkweDEwNDIwRDQ4CisJbHZ4CTEsMTAsNgorCWFkZGkJMTAsMTAsMTYKKwl2cGVybQkwLDEsMCwxMAorCS5sb25nCTB4MTA0MjA1NDgKKwlsdngJMCwxMCw2CisJYWRkaQkxMCwxMCwxNgorCWJkbnoJLkxvb3BfY2JjX2RlYworCisJdnBlcm0JMSwwLDEsMTAKKwkubG9uZwkweDEwNDIwRDQ4CisJbHZ4CTEsMTAsNgorCWxpCTEwLDE2CisJdnBlcm0JMCwxLDAsMTAKKwkubG9uZwkweDEwNDIwNTQ5CisJY21wbGRpCTUsMTYKKworCXZ4b3IJMiwyLDQKKwl2b3IJNCwzLDMKKwl2cGVybQkzLDIsMiw4CisJdnNlbAkyLDcsMyw5CisJdm9yCTcsMywzCisJc3R2eAkyLDAsNAorCWFkZGkJNCw0LDE2CisJYmdlCS5MY2JjX2RlYworCisuTGNiY19kb25lOgorCWFkZGkJNCw0LC0xCisJbHZ4CTIsMCw0CisJdnNlbAkyLDcsMiw5CisJc3R2eAkyLDAsNAorCisJbmVnCTgsNworCWxpCTEwLDE1CisJdnhvcgkwLDAsMAorCXZzcGx0aXNiCTksLTEKKwl2c3BsdGlzYgkzLDB4MGYKKwlsdnNyCTgsMCw4CisJdnBlcm0JOSw5LDAsOAorCXZ4b3IJOCw4LDMKKwlsdngJNywwLDcKKwl2cGVybQk0LDQsNCw4CisJdnNlbAkyLDcsNCw5CisJbHZ4CTUsMTAsNworCXN0dngJMiwwLDcKKwl2c2VsCTIsNCw1LDkKKwlzdHZ4CTIsMTAsNworCisJb3IJMTIsMTIsMTIKKwlibHIJCisubG9uZwkwCisuYnl0ZQkwLDEyLDB4MTQsMCwwLDAsNiwwCisubG9uZwkwCisuYWxpZ24JNQorX2Flc3A4X2NiY19kZWNyeXB0OHg6CisJc3RkdQkxLC00NDgoMSkKKwlsaQkxMCwyMDcKKwlsaQkxMSwyMjMKKwlzdHZ4CTIwLDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAkyMSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJMjIsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTIzLDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAkyNCwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJMjUsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTI2LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAkyNywxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJMjgsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTI5LDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAkzMCwxMCwxCisJc3R2eAkzMSwxMSwxCisJbGkJMCwtMQorCXN0dwkxMiwzOTYoMSkKKwlsaQk4LDB4MTAKKwlzdGQJMjYsNDAwKDEpCisJbGkJMjYsMHgyMAorCXN0ZAkyNyw0MDgoMSkKKwlsaQkyNywweDMwCisJc3RkCTI4LDQxNigxKQorCWxpCTI4LDB4NDAKKwlzdGQJMjksNDI0KDEpCisJbGkJMjksMHg1MAorCXN0ZAkzMCw0MzIoMSkKKwlsaQkzMCwweDYwCisJc3RkCTMxLDQ0MCgxKQorCWxpCTMxLDB4NzAKKwlvcgkwLDAsMAorCisJc3ViaQk5LDksMworCXN1YmkJNSw1LDEyOAorCisJbHZ4CTIzLDAsNgorCWx2eAkzMCw4LDYKKwlhZGRpCTYsNiwweDIwCisJbHZ4CTMxLDAsNgorCXZwZXJtCTIzLDMwLDIzLDEwCisJYWRkaQkxMSwxLDc5CisJbXRjdHIJOQorCisuTG9hZF9jYmNfZGVjX2tleToKKwl2cGVybQkyNCwzMSwzMCwxMAorCWx2eAkzMCw4LDYKKwlhZGRpCTYsNiwweDIwCisJc3R2eAkyNCwwLDExCisJdnBlcm0JMjUsMzAsMzEsMTAKKwlsdngJMzEsMCw2CisJc3R2eAkyNSw4LDExCisJYWRkaQkxMSwxMSwweDIwCisJYmRuegkuTG9hZF9jYmNfZGVjX2tleQorCisJbHZ4CTI2LDgsNgorCXZwZXJtCTI0LDMxLDMwLDEwCisJbHZ4CTI3LDI2LDYKKwlzdHZ4CTI0LDAsMTEKKwl2cGVybQkyNSwyNiwzMSwxMAorCWx2eAkyOCwyNyw2CisJc3R2eAkyNSw4LDExCisJYWRkaQkxMSwxLDc5CisJdnBlcm0JMjYsMjcsMjYsMTAKKwlsdngJMjksMjgsNgorCXZwZXJtCTI3LDI4LDI3LDEwCisJbHZ4CTMwLDI5LDYKKwl2cGVybQkyOCwyOSwyOCwxMAorCWx2eAkzMSwzMCw2CisJdnBlcm0JMjksMzAsMjksMTAKKwlsdngJMTQsMzEsNgorCXZwZXJtCTMwLDMxLDMwLDEwCisJbHZ4CTI0LDAsMTEKKwl2cGVybQkzMSwxNCwzMSwxMAorCWx2eAkyNSw4LDExCisKKworCisJc3ViaQkzLDMsMTUKKworCWxpCTEwLDgKKwkubG9uZwkweDdDMDAxRTk5CisJbHZzbAk2LDAsMTAKKwl2c3BsdGlzYgkzLDB4MGYKKwkubG9uZwkweDdDMjgxRTk5CisJdnhvcgk2LDYsMworCS5sb25nCTB4N0M1QTFFOTkKKwl2cGVybQkwLDAsMCw2CisJLmxvbmcJMHg3QzdCMUU5OQorCXZwZXJtCTEsMSwxLDYKKwkubG9uZwkweDdENUMxRTk5CisJdnBlcm0JMiwyLDIsNgorCXZ4b3IJMTQsMCwyMworCS5sb25nCTB4N0Q3RDFFOTkKKwl2cGVybQkzLDMsMyw2CisJdnhvcgkxNSwxLDIzCisJLmxvbmcJMHg3RDlFMUU5OQorCXZwZXJtCTEwLDEwLDEwLDYKKwl2eG9yCTE2LDIsMjMKKwkubG9uZwkweDdEQkYxRTk5CisJYWRkaQkzLDMsMHg4MAorCXZwZXJtCTExLDExLDExLDYKKwl2eG9yCTE3LDMsMjMKKwl2cGVybQkxMiwxMiwxMiw2CisJdnhvcgkxOCwxMCwyMworCXZwZXJtCTEzLDEzLDEzLDYKKwl2eG9yCTE5LDExLDIzCisJdnhvcgkyMCwxMiwyMworCXZ4b3IJMjEsMTMsMjMKKworCW10Y3RyCTkKKwliCS5Mb29wX2NiY19kZWM4eAorLmFsaWduCTUKKy5Mb29wX2NiY19kZWM4eDoKKwkubG9uZwkweDExQ0VDNTQ4CisJLmxvbmcJMHgxMUVGQzU0OAorCS5sb25nCTB4MTIxMEM1NDgKKwkubG9uZwkweDEyMzFDNTQ4CisJLmxvbmcJMHgxMjUyQzU0OAorCS5sb25nCTB4MTI3M0M1NDgKKwkubG9uZwkweDEyOTRDNTQ4CisJLmxvbmcJMHgxMkI1QzU0OAorCWx2eAkyNCwyNiwxMQorCWFkZGkJMTEsMTEsMHgyMAorCisJLmxvbmcJMHgxMUNFQ0Q0OAorCS5sb25nCTB4MTFFRkNENDgKKwkubG9uZwkweDEyMTBDRDQ4CisJLmxvbmcJMHgxMjMxQ0Q0OAorCS5sb25nCTB4MTI1MkNENDgKKwkubG9uZwkweDEyNzNDRDQ4CisJLmxvbmcJMHgxMjk0Q0Q0OAorCS5sb25nCTB4MTJCNUNENDgKKwlsdngJMjUsOCwxMQorCWJkbnoJLkxvb3BfY2JjX2RlYzh4CisKKwlzdWJpYwk1LDUsMTI4CisJLmxvbmcJMHgxMUNFQzU0OAorCS5sb25nCTB4MTFFRkM1NDgKKwkubG9uZwkweDEyMTBDNTQ4CisJLmxvbmcJMHgxMjMxQzU0OAorCS5sb25nCTB4MTI1MkM1NDgKKwkubG9uZwkweDEyNzNDNTQ4CisJLmxvbmcJMHgxMjk0QzU0OAorCS5sb25nCTB4MTJCNUM1NDgKKworCXN1YmZlLgkwLDAsMAorCS5sb25nCTB4MTFDRUNENDgKKwkubG9uZwkweDExRUZDRDQ4CisJLmxvbmcJMHgxMjEwQ0Q0OAorCS5sb25nCTB4MTIzMUNENDgKKwkubG9uZwkweDEyNTJDRDQ4CisJLmxvbmcJMHgxMjczQ0Q0OAorCS5sb25nCTB4MTI5NENENDgKKwkubG9uZwkweDEyQjVDRDQ4CisKKwlhbmQJMCwwLDUKKwkubG9uZwkweDExQ0VENTQ4CisJLmxvbmcJMHgxMUVGRDU0OAorCS5sb25nCTB4MTIxMEQ1NDgKKwkubG9uZwkweDEyMzFENTQ4CisJLmxvbmcJMHgxMjUyRDU0OAorCS5sb25nCTB4MTI3M0Q1NDgKKwkubG9uZwkweDEyOTRENTQ4CisJLmxvbmcJMHgxMkI1RDU0OAorCisJYWRkCTMsMywwCisKKworCisJLmxvbmcJMHgxMUNFREQ0OAorCS5sb25nCTB4MTFFRkRENDgKKwkubG9uZwkweDEyMTBERDQ4CisJLmxvbmcJMHgxMjMxREQ0OAorCS5sb25nCTB4MTI1MkRENDgKKwkubG9uZwkweDEyNzNERDQ4CisJLmxvbmcJMHgxMjk0REQ0OAorCS5sb25nCTB4MTJCNURENDgKKworCWFkZGkJMTEsMSw3OQorCS5sb25nCTB4MTFDRUU1NDgKKwkubG9uZwkweDExRUZFNTQ4CisJLmxvbmcJMHgxMjEwRTU0OAorCS5sb25nCTB4MTIzMUU1NDgKKwkubG9uZwkweDEyNTJFNTQ4CisJLmxvbmcJMHgxMjczRTU0OAorCS5sb25nCTB4MTI5NEU1NDgKKwkubG9uZwkweDEyQjVFNTQ4CisJbHZ4CTI0LDAsMTEKKworCS5sb25nCTB4MTFDRUVENDgKKwkubG9uZwkweDExRUZFRDQ4CisJLmxvbmcJMHgxMjEwRUQ0OAorCS5sb25nCTB4MTIzMUVENDgKKwkubG9uZwkweDEyNTJFRDQ4CisJLmxvbmcJMHgxMjczRUQ0OAorCS5sb25nCTB4MTI5NEVENDgKKwkubG9uZwkweDEyQjVFRDQ4CisJbHZ4CTI1LDgsMTEKKworCS5sb25nCTB4MTFDRUY1NDgKKwl2eG9yCTQsNCwzMQorCS5sb25nCTB4MTFFRkY1NDgKKwl2eG9yCTAsMCwzMQorCS5sb25nCTB4MTIxMEY1NDgKKwl2eG9yCTEsMSwzMQorCS5sb25nCTB4MTIzMUY1NDgKKwl2eG9yCTIsMiwzMQorCS5sb25nCTB4MTI1MkY1NDgKKwl2eG9yCTMsMywzMQorCS5sb25nCTB4MTI3M0Y1NDgKKwl2eG9yCTEwLDEwLDMxCisJLmxvbmcJMHgxMjk0RjU0OAorCXZ4b3IJMTEsMTEsMzEKKwkubG9uZwkweDEyQjVGNTQ4CisJdnhvcgkxMiwxMiwzMQorCisJLmxvbmcJMHgxMUNFMjU0OQorCS5sb25nCTB4MTFFRjA1NDkKKwkubG9uZwkweDdDMDAxRTk5CisJLmxvbmcJMHgxMjEwMEQ0OQorCS5sb25nCTB4N0MyODFFOTkKKwkubG9uZwkweDEyMzExNTQ5CisJdnBlcm0JMCwwLDAsNgorCS5sb25nCTB4N0M1QTFFOTkKKwkubG9uZwkweDEyNTIxRDQ5CisJdnBlcm0JMSwxLDEsNgorCS5sb25nCTB4N0M3QjFFOTkKKwkubG9uZwkweDEyNzM1NTQ5CisJdnBlcm0JMiwyLDIsNgorCS5sb25nCTB4N0Q1QzFFOTkKKwkubG9uZwkweDEyOTQ1RDQ5CisJdnBlcm0JMywzLDMsNgorCS5sb25nCTB4N0Q3RDFFOTkKKwkubG9uZwkweDEyQjU2NTQ5CisJdnBlcm0JMTAsMTAsMTAsNgorCS5sb25nCTB4N0Q5RTFFOTkKKwl2b3IJNCwxMywxMworCXZwZXJtCTExLDExLDExLDYKKwkubG9uZwkweDdEQkYxRTk5CisJYWRkaQkzLDMsMHg4MAorCisJdnBlcm0JMTQsMTQsMTQsNgorCXZwZXJtCTE1LDE1LDE1LDYKKwkubG9uZwkweDdEQzAyNzk5CisJdnBlcm0JMTIsMTIsMTIsNgorCXZ4b3IJMTQsMCwyMworCXZwZXJtCTE2LDE2LDE2LDYKKwkubG9uZwkweDdERTgyNzk5CisJdnBlcm0JMTMsMTMsMTMsNgorCXZ4b3IJMTUsMSwyMworCXZwZXJtCTE3LDE3LDE3LDYKKwkubG9uZwkweDdFMUEyNzk5CisJdnhvcgkxNiwyLDIzCisJdnBlcm0JMTgsMTgsMTgsNgorCS5sb25nCTB4N0UzQjI3OTkKKwl2eG9yCTE3LDMsMjMKKwl2cGVybQkxOSwxOSwxOSw2CisJLmxvbmcJMHg3RTVDMjc5OQorCXZ4b3IJMTgsMTAsMjMKKwl2cGVybQkyMCwyMCwyMCw2CisJLmxvbmcJMHg3RTdEMjc5OQorCXZ4b3IJMTksMTEsMjMKKwl2cGVybQkyMSwyMSwyMSw2CisJLmxvbmcJMHg3RTlFMjc5OQorCXZ4b3IJMjAsMTIsMjMKKwkubG9uZwkweDdFQkYyNzk5CisJYWRkaQk0LDQsMHg4MAorCXZ4b3IJMjEsMTMsMjMKKworCW10Y3RyCTkKKwliZXEJLkxvb3BfY2JjX2RlYzh4CisKKwlhZGRpYy4JNSw1LDEyOAorCWJlcQkuTGNiY19kZWM4eF9kb25lCisJbm9wCQorCW5vcAkKKworLkxvb3BfY2JjX2RlYzh4X3RhaWw6CisJLmxvbmcJMHgxMUVGQzU0OAorCS5sb25nCTB4MTIxMEM1NDgKKwkubG9uZwkweDEyMzFDNTQ4CisJLmxvbmcJMHgxMjUyQzU0OAorCS5sb25nCTB4MTI3M0M1NDgKKwkubG9uZwkweDEyOTRDNTQ4CisJLmxvbmcJMHgxMkI1QzU0OAorCWx2eAkyNCwyNiwxMQorCWFkZGkJMTEsMTEsMHgyMAorCisJLmxvbmcJMHgxMUVGQ0Q0OAorCS5sb25nCTB4MTIxMENENDgKKwkubG9uZwkweDEyMzFDRDQ4CisJLmxvbmcJMHgxMjUyQ0Q0OAorCS5sb25nCTB4MTI3M0NENDgKKwkubG9uZwkweDEyOTRDRDQ4CisJLmxvbmcJMHgxMkI1Q0Q0OAorCWx2eAkyNSw4LDExCisJYmRuegkuTG9vcF9jYmNfZGVjOHhfdGFpbAorCisJLmxvbmcJMHgxMUVGQzU0OAorCS5sb25nCTB4MTIxMEM1NDgKKwkubG9uZwkweDEyMzFDNTQ4CisJLmxvbmcJMHgxMjUyQzU0OAorCS5sb25nCTB4MTI3M0M1NDgKKwkubG9uZwkweDEyOTRDNTQ4CisJLmxvbmcJMHgxMkI1QzU0OAorCisJLmxvbmcJMHgxMUVGQ0Q0OAorCS5sb25nCTB4MTIxMENENDgKKwkubG9uZwkweDEyMzFDRDQ4CisJLmxvbmcJMHgxMjUyQ0Q0OAorCS5sb25nCTB4MTI3M0NENDgKKwkubG9uZwkweDEyOTRDRDQ4CisJLmxvbmcJMHgxMkI1Q0Q0OAorCisJLmxvbmcJMHgxMUVGRDU0OAorCS5sb25nCTB4MTIxMEQ1NDgKKwkubG9uZwkweDEyMzFENTQ4CisJLmxvbmcJMHgxMjUyRDU0OAorCS5sb25nCTB4MTI3M0Q1NDgKKwkubG9uZwkweDEyOTRENTQ4CisJLmxvbmcJMHgxMkI1RDU0OAorCisJLmxvbmcJMHgxMUVGREQ0OAorCS5sb25nCTB4MTIxMERENDgKKwkubG9uZwkweDEyMzFERDQ4CisJLmxvbmcJMHgxMjUyREQ0OAorCS5sb25nCTB4MTI3M0RENDgKKwkubG9uZwkweDEyOTRERDQ4CisJLmxvbmcJMHgxMkI1REQ0OAorCisJLmxvbmcJMHgxMUVGRTU0OAorCS5sb25nCTB4MTIxMEU1NDgKKwkubG9uZwkweDEyMzFFNTQ4CisJLmxvbmcJMHgxMjUyRTU0OAorCS5sb25nCTB4MTI3M0U1NDgKKwkubG9uZwkweDEyOTRFNTQ4CisJLmxvbmcJMHgxMkI1RTU0OAorCisJLmxvbmcJMHgxMUVGRUQ0OAorCS5sb25nCTB4MTIxMEVENDgKKwkubG9uZwkweDEyMzFFRDQ4CisJLmxvbmcJMHgxMjUyRUQ0OAorCS5sb25nCTB4MTI3M0VENDgKKwkubG9uZwkweDEyOTRFRDQ4CisJLmxvbmcJMHgxMkI1RUQ0OAorCisJLmxvbmcJMHgxMUVGRjU0OAorCXZ4b3IJNCw0LDMxCisJLmxvbmcJMHgxMjEwRjU0OAorCXZ4b3IJMSwxLDMxCisJLmxvbmcJMHgxMjMxRjU0OAorCXZ4b3IJMiwyLDMxCisJLmxvbmcJMHgxMjUyRjU0OAorCXZ4b3IJMywzLDMxCisJLmxvbmcJMHgxMjczRjU0OAorCXZ4b3IJMTAsMTAsMzEKKwkubG9uZwkweDEyOTRGNTQ4CisJdnhvcgkxMSwxMSwzMQorCS5sb25nCTB4MTJCNUY1NDgKKwl2eG9yCTEyLDEyLDMxCisKKwljbXBsd2kJNSwzMgorCWJsdAkuTGNiY19kZWM4eF9vbmUKKwlub3AJCisJYmVxCS5MY2JjX2RlYzh4X3R3bworCWNtcGx3aQk1LDY0CisJYmx0CS5MY2JjX2RlYzh4X3RocmVlCisJbm9wCQorCWJlcQkuTGNiY19kZWM4eF9mb3VyCisJY21wbHdpCTUsOTYKKwlibHQJLkxjYmNfZGVjOHhfZml2ZQorCW5vcAkKKwliZXEJLkxjYmNfZGVjOHhfc2l4CisKKy5MY2JjX2RlYzh4X3NldmVuOgorCS5sb25nCTB4MTFFRjI1NDkKKwkubG9uZwkweDEyMTAwRDQ5CisJLmxvbmcJMHgxMjMxMTU0OQorCS5sb25nCTB4MTI1MjFENDkKKwkubG9uZwkweDEyNzM1NTQ5CisJLmxvbmcJMHgxMjk0NUQ0OQorCS5sb25nCTB4MTJCNTY1NDkKKwl2b3IJNCwxMywxMworCisJdnBlcm0JMTUsMTUsMTUsNgorCXZwZXJtCTE2LDE2LDE2LDYKKwkubG9uZwkweDdERTAyNzk5CisJdnBlcm0JMTcsMTcsMTcsNgorCS5sb25nCTB4N0UwODI3OTkKKwl2cGVybQkxOCwxOCwxOCw2CisJLmxvbmcJMHg3RTNBMjc5OQorCXZwZXJtCTE5LDE5LDE5LDYKKwkubG9uZwkweDdFNUIyNzk5CisJdnBlcm0JMjAsMjAsMjAsNgorCS5sb25nCTB4N0U3QzI3OTkKKwl2cGVybQkyMSwyMSwyMSw2CisJLmxvbmcJMHg3RTlEMjc5OQorCS5sb25nCTB4N0VCRTI3OTkKKwlhZGRpCTQsNCwweDcwCisJYgkuTGNiY19kZWM4eF9kb25lCisKKy5hbGlnbgk1CisuTGNiY19kZWM4eF9zaXg6CisJLmxvbmcJMHgxMjEwMjU0OQorCS5sb25nCTB4MTIzMTE1NDkKKwkubG9uZwkweDEyNTIxRDQ5CisJLmxvbmcJMHgxMjczNTU0OQorCS5sb25nCTB4MTI5NDVENDkKKwkubG9uZwkweDEyQjU2NTQ5CisJdm9yCTQsMTMsMTMKKworCXZwZXJtCTE2LDE2LDE2LDYKKwl2cGVybQkxNywxNywxNyw2CisJLmxvbmcJMHg3RTAwMjc5OQorCXZwZXJtCTE4LDE4LDE4LDYKKwkubG9uZwkweDdFMjgyNzk5CisJdnBlcm0JMTksMTksMTksNgorCS5sb25nCTB4N0U1QTI3OTkKKwl2cGVybQkyMCwyMCwyMCw2CisJLmxvbmcJMHg3RTdCMjc5OQorCXZwZXJtCTIxLDIxLDIxLDYKKwkubG9uZwkweDdFOUMyNzk5CisJLmxvbmcJMHg3RUJEMjc5OQorCWFkZGkJNCw0LDB4NjAKKwliCS5MY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKKy5MY2JjX2RlYzh4X2ZpdmU6CisJLmxvbmcJMHgxMjMxMjU0OQorCS5sb25nCTB4MTI1MjFENDkKKwkubG9uZwkweDEyNzM1NTQ5CisJLmxvbmcJMHgxMjk0NUQ0OQorCS5sb25nCTB4MTJCNTY1NDkKKwl2b3IJNCwxMywxMworCisJdnBlcm0JMTcsMTcsMTcsNgorCXZwZXJtCTE4LDE4LDE4LDYKKwkubG9uZwkweDdFMjAyNzk5CisJdnBlcm0JMTksMTksMTksNgorCS5sb25nCTB4N0U0ODI3OTkKKwl2cGVybQkyMCwyMCwyMCw2CisJLmxvbmcJMHg3RTdBMjc5OQorCXZwZXJtCTIxLDIxLDIxLDYKKwkubG9uZwkweDdFOUIyNzk5CisJLmxvbmcJMHg3RUJDMjc5OQorCWFkZGkJNCw0LDB4NTAKKwliCS5MY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKKy5MY2JjX2RlYzh4X2ZvdXI6CisJLmxvbmcJMHgxMjUyMjU0OQorCS5sb25nCTB4MTI3MzU1NDkKKwkubG9uZwkweDEyOTQ1RDQ5CisJLmxvbmcJMHgxMkI1NjU0OQorCXZvcgk0LDEzLDEzCisKKwl2cGVybQkxOCwxOCwxOCw2CisJdnBlcm0JMTksMTksMTksNgorCS5sb25nCTB4N0U0MDI3OTkKKwl2cGVybQkyMCwyMCwyMCw2CisJLmxvbmcJMHg3RTY4Mjc5OQorCXZwZXJtCTIxLDIxLDIxLDYKKwkubG9uZwkweDdFOUEyNzk5CisJLmxvbmcJMHg3RUJCMjc5OQorCWFkZGkJNCw0LDB4NDAKKwliCS5MY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKKy5MY2JjX2RlYzh4X3RocmVlOgorCS5sb25nCTB4MTI3MzI1NDkKKwkubG9uZwkweDEyOTQ1RDQ5CisJLmxvbmcJMHgxMkI1NjU0OQorCXZvcgk0LDEzLDEzCisKKwl2cGVybQkxOSwxOSwxOSw2CisJdnBlcm0JMjAsMjAsMjAsNgorCS5sb25nCTB4N0U2MDI3OTkKKwl2cGVybQkyMSwyMSwyMSw2CisJLmxvbmcJMHg3RTg4Mjc5OQorCS5sb25nCTB4N0VCQTI3OTkKKwlhZGRpCTQsNCwweDMwCisJYgkuTGNiY19kZWM4eF9kb25lCisKKy5hbGlnbgk1CisuTGNiY19kZWM4eF90d286CisJLmxvbmcJMHgxMjk0MjU0OQorCS5sb25nCTB4MTJCNTY1NDkKKwl2b3IJNCwxMywxMworCisJdnBlcm0JMjAsMjAsMjAsNgorCXZwZXJtCTIxLDIxLDIxLDYKKwkubG9uZwkweDdFODAyNzk5CisJLmxvbmcJMHg3RUE4Mjc5OQorCWFkZGkJNCw0LDB4MjAKKwliCS5MY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKKy5MY2JjX2RlYzh4X29uZToKKwkubG9uZwkweDEyQjUyNTQ5CisJdm9yCTQsMTMsMTMKKworCXZwZXJtCTIxLDIxLDIxLDYKKwkubG9uZwkweDdFQTAyNzk5CisJYWRkaQk0LDQsMHgxMAorCisuTGNiY19kZWM4eF9kb25lOgorCXZwZXJtCTQsNCw0LDYKKwkubG9uZwkweDdDODAzRjk5CisKKwlsaQkxMCw3OQorCWxpCTExLDk1CisJc3R2eAk2LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAk2LDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAk2LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAk2LDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAk2LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAk2LDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAk2LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAk2LDExLDEKKwlhZGRpCTExLDExLDMyCisKKwlvcgkxMiwxMiwxMgorCWx2eAkyMCwxMCwxCisJYWRkaQkxMCwxMCwzMgorCWx2eAkyMSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCWx2eAkyMiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCWx2eAkyMywxMSwxCisJYWRkaQkxMSwxMSwzMgorCWx2eAkyNCwxMCwxCisJYWRkaQkxMCwxMCwzMgorCWx2eAkyNSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCWx2eAkyNiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCWx2eAkyNywxMSwxCisJYWRkaQkxMSwxMSwzMgorCWx2eAkyOCwxMCwxCisJYWRkaQkxMCwxMCwzMgorCWx2eAkyOSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCWx2eAkzMCwxMCwxCisJbHZ4CTMxLDExLDEKKwlsZAkyNiw0MDAoMSkKKwlsZAkyNyw0MDgoMSkKKwlsZAkyOCw0MTYoMSkKKwlsZAkyOSw0MjQoMSkKKwlsZAkzMCw0MzIoMSkKKwlsZAkzMSw0NDAoMSkKKwlhZGRpCTEsMSw0NDgKKwlibHIJCisubG9uZwkwCisuYnl0ZQkwLDEyLDB4MDQsMCwweDgwLDYsNiwwCisubG9uZwkwCisuc2l6ZQlhZXNfaHdfY2JjX2VuY3J5cHQsLi1hZXNfaHdfY2JjX2VuY3J5cHQKKy5nbG9ibAlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy50eXBlCWFlc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcyxAZnVuY3Rpb24KKy5hbGlnbgk1CithZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisubG9jYWxlbnRyeQlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MsMAorCisJY21wbGRpCTUsMQorCS5sb25nCTB4NGRjMDAwMjAKKworCWxpcwkwLDB4ZmZmMAorCWxpCTEyLC0xCisJb3IJMCwwLDAKKworCWxpCTEwLDE1CisJdnhvcgkwLDAsMAorCXZzcGx0aXNiCTMsMHgwZgorCisJbHZ4CTQsMCw3CisJbHZzbAk2LDAsNworCWx2eAk1LDEwLDcKKwl2c3BsdGlzYgkxMSwxCisJdnhvcgk2LDYsMworCXZwZXJtCTQsNCw1LDYKKwl2c2xkb2kJMTEsMCwxMSwxCisKKwluZWcJMTEsMworCWx2c3IJMTAsMCw2CisJbHd6CTksMjQwKDYpCisKKwlsdnNyCTYsMCwxMQorCWx2eAk1LDAsMworCWFkZGkJMywzLDE1CisJdnhvcgk2LDYsMworCisJc3J3aQk5LDksMQorCWxpCTEwLDE2CisJc3ViaQk5LDksMQorCisJY21wbGRpCTUsOAorCWJnZQlfYWVzcDhfY3RyMzJfZW5jcnlwdDh4CisKKwlsdnNsCTgsMCw0CisJdnNwbHRpc2IJOSwtMQorCWx2eAk3LDAsNAorCXZwZXJtCTksOSwwLDgKKwl2eG9yCTgsOCwzCisKKwlsdngJMCwwLDYKKwltdGN0cgk5CisJbHZ4CTEsMTAsNgorCWFkZGkJMTAsMTAsMTYKKwl2cGVybQkwLDEsMCwxMAorCXZ4b3IJMiw0LDAKKwlsdngJMCwxMCw2CisJYWRkaQkxMCwxMCwxNgorCWIJLkxvb3BfY3RyMzJfZW5jCisKKy5hbGlnbgk1CisuTG9vcF9jdHIzMl9lbmM6CisJdnBlcm0JMSwwLDEsMTAKKwkubG9uZwkweDEwNDIwRDA4CisJbHZ4CTEsMTAsNgorCWFkZGkJMTAsMTAsMTYKKwl2cGVybQkwLDEsMCwxMAorCS5sb25nCTB4MTA0MjA1MDgKKwlsdngJMCwxMCw2CisJYWRkaQkxMCwxMCwxNgorCWJkbnoJLkxvb3BfY3RyMzJfZW5jCisKKwl2YWRkdXdtCTQsNCwxMQorCXZvcgkzLDUsNQorCWx2eAk1LDAsMworCWFkZGkJMywzLDE2CisJc3ViaWMuCTUsNSwxCisKKwl2cGVybQkxLDAsMSwxMAorCS5sb25nCTB4MTA0MjBEMDgKKwlsdngJMSwxMCw2CisJdnBlcm0JMywzLDUsNgorCWxpCTEwLDE2CisJdnBlcm0JMSwxLDAsMTAKKwlsdngJMCwwLDYKKwl2eG9yCTMsMywxCisJLmxvbmcJMHgxMDQyMUQwOQorCisJbHZ4CTEsMTAsNgorCWFkZGkJMTAsMTAsMTYKKwl2cGVybQkyLDIsMiw4CisJdnNlbAkzLDcsMiw5CisJbXRjdHIJOQorCXZwZXJtCTAsMSwwLDEwCisJdm9yCTcsMiwyCisJdnhvcgkyLDQsMAorCWx2eAkwLDEwLDYKKwlhZGRpCTEwLDEwLDE2CisJc3R2eAkzLDAsNAorCWFkZGkJNCw0LDE2CisJYm5lCS5Mb29wX2N0cjMyX2VuYworCisJYWRkaQk0LDQsLTEKKwlsdngJMiwwLDQKKwl2c2VsCTIsNywyLDkKKwlzdHZ4CTIsMCw0CisKKwlvcgkxMiwxMiwxMgorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgxNCwwLDAsMCw2LDAKKy5sb25nCTAKKy5hbGlnbgk1CitfYWVzcDhfY3RyMzJfZW5jcnlwdDh4OgorCXN0ZHUJMSwtNDQ4KDEpCisJbGkJMTAsMjA3CisJbGkJMTEsMjIzCisJc3R2eAkyMCwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJMjEsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTIyLDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAkyMywxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJMjQsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTI1LDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAkyNiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJMjcsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTI4LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAkyOSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJMzAsMTAsMQorCXN0dngJMzEsMTEsMQorCWxpCTAsLTEKKwlzdHcJMTIsMzk2KDEpCisJbGkJOCwweDEwCisJc3RkCTI2LDQwMCgxKQorCWxpCTI2LDB4MjAKKwlzdGQJMjcsNDA4KDEpCisJbGkJMjcsMHgzMAorCXN0ZAkyOCw0MTYoMSkKKwlsaQkyOCwweDQwCisJc3RkCTI5LDQyNCgxKQorCWxpCTI5LDB4NTAKKwlzdGQJMzAsNDMyKDEpCisJbGkJMzAsMHg2MAorCXN0ZAkzMSw0NDAoMSkKKwlsaQkzMSwweDcwCisJb3IJMCwwLDAKKworCXN1YmkJOSw5LDMKKworCWx2eAkyMywwLDYKKwlsdngJMzAsOCw2CisJYWRkaQk2LDYsMHgyMAorCWx2eAkzMSwwLDYKKwl2cGVybQkyMywzMCwyMywxMAorCWFkZGkJMTEsMSw3OQorCW10Y3RyCTkKKworLkxvYWRfY3RyMzJfZW5jX2tleToKKwl2cGVybQkyNCwzMSwzMCwxMAorCWx2eAkzMCw4LDYKKwlhZGRpCTYsNiwweDIwCisJc3R2eAkyNCwwLDExCisJdnBlcm0JMjUsMzAsMzEsMTAKKwlsdngJMzEsMCw2CisJc3R2eAkyNSw4LDExCisJYWRkaQkxMSwxMSwweDIwCisJYmRuegkuTG9hZF9jdHIzMl9lbmNfa2V5CisKKwlsdngJMjYsOCw2CisJdnBlcm0JMjQsMzEsMzAsMTAKKwlsdngJMjcsMjYsNgorCXN0dngJMjQsMCwxMQorCXZwZXJtCTI1LDI2LDMxLDEwCisJbHZ4CTI4LDI3LDYKKwlzdHZ4CTI1LDgsMTEKKwlhZGRpCTExLDEsNzkKKwl2cGVybQkyNiwyNywyNiwxMAorCWx2eAkyOSwyOCw2CisJdnBlcm0JMjcsMjgsMjcsMTAKKwlsdngJMzAsMjksNgorCXZwZXJtCTI4LDI5LDI4LDEwCisJbHZ4CTMxLDMwLDYKKwl2cGVybQkyOSwzMCwyOSwxMAorCWx2eAkxNSwzMSw2CisJdnBlcm0JMzAsMzEsMzAsMTAKKwlsdngJMjQsMCwxMQorCXZwZXJtCTMxLDE1LDMxLDEwCisJbHZ4CTI1LDgsMTEKKworCXZhZGR1d20JNywxMSwxMQorCXN1YmkJMywzLDE1CisJc2xkaQk1LDUsNAorCisJdmFkZHV3bQkxNiw0LDExCisJdmFkZHV3bQkxNyw0LDcKKwl2eG9yCTE1LDQsMjMKKwlsaQkxMCw4CisJdmFkZHV3bQkxOCwxNiw3CisJdnhvcgkxNiwxNiwyMworCWx2c2wJNiwwLDEwCisJdmFkZHV3bQkxOSwxNyw3CisJdnhvcgkxNywxNywyMworCXZzcGx0aXNiCTMsMHgwZgorCXZhZGR1d20JMjAsMTgsNworCXZ4b3IJMTgsMTgsMjMKKwl2eG9yCTYsNiwzCisJdmFkZHV3bQkyMSwxOSw3CisJdnhvcgkxOSwxOSwyMworCXZhZGR1d20JMjIsMjAsNworCXZ4b3IJMjAsMjAsMjMKKwl2YWRkdXdtCTQsMjEsNworCXZ4b3IJMjEsMjEsMjMKKwl2eG9yCTIyLDIyLDIzCisKKwltdGN0cgk5CisJYgkuTG9vcF9jdHIzMl9lbmM4eAorLmFsaWduCTUKKy5Mb29wX2N0cjMyX2VuYzh4OgorCS5sb25nCTB4MTFFRkM1MDgKKwkubG9uZwkweDEyMTBDNTA4CisJLmxvbmcJMHgxMjMxQzUwOAorCS5sb25nCTB4MTI1MkM1MDgKKwkubG9uZwkweDEyNzNDNTA4CisJLmxvbmcJMHgxMjk0QzUwOAorCS5sb25nCTB4MTJCNUM1MDgKKwkubG9uZwkweDEyRDZDNTA4CisuTG9vcF9jdHIzMl9lbmM4eF9taWRkbGU6CisJbHZ4CTI0LDI2LDExCisJYWRkaQkxMSwxMSwweDIwCisKKwkubG9uZwkweDExRUZDRDA4CisJLmxvbmcJMHgxMjEwQ0QwOAorCS5sb25nCTB4MTIzMUNEMDgKKwkubG9uZwkweDEyNTJDRDA4CisJLmxvbmcJMHgxMjczQ0QwOAorCS5sb25nCTB4MTI5NENEMDgKKwkubG9uZwkweDEyQjVDRDA4CisJLmxvbmcJMHgxMkQ2Q0QwOAorCWx2eAkyNSw4LDExCisJYmRuegkuTG9vcF9jdHIzMl9lbmM4eAorCisJc3ViaWMJMTEsNSwyNTYKKwkubG9uZwkweDExRUZDNTA4CisJLmxvbmcJMHgxMjEwQzUwOAorCS5sb25nCTB4MTIzMUM1MDgKKwkubG9uZwkweDEyNTJDNTA4CisJLmxvbmcJMHgxMjczQzUwOAorCS5sb25nCTB4MTI5NEM1MDgKKwkubG9uZwkweDEyQjVDNTA4CisJLmxvbmcJMHgxMkQ2QzUwOAorCisJc3ViZmUJMCwwLDAKKwkubG9uZwkweDExRUZDRDA4CisJLmxvbmcJMHgxMjEwQ0QwOAorCS5sb25nCTB4MTIzMUNEMDgKKwkubG9uZwkweDEyNTJDRDA4CisJLmxvbmcJMHgxMjczQ0QwOAorCS5sb25nCTB4MTI5NENEMDgKKwkubG9uZwkweDEyQjVDRDA4CisJLmxvbmcJMHgxMkQ2Q0QwOAorCisJYW5kCTAsMCwxMQorCWFkZGkJMTEsMSw3OQorCS5sb25nCTB4MTFFRkQ1MDgKKwkubG9uZwkweDEyMTBENTA4CisJLmxvbmcJMHgxMjMxRDUwOAorCS5sb25nCTB4MTI1MkQ1MDgKKwkubG9uZwkweDEyNzNENTA4CisJLmxvbmcJMHgxMjk0RDUwOAorCS5sb25nCTB4MTJCNUQ1MDgKKwkubG9uZwkweDEyRDZENTA4CisJbHZ4CTI0LDAsMTEKKworCXN1YmljCTUsNSwxMjkKKwkubG9uZwkweDExRUZERDA4CisJYWRkaQk1LDUsMQorCS5sb25nCTB4MTIxMEREMDgKKwkubG9uZwkweDEyMzFERDA4CisJLmxvbmcJMHgxMjUyREQwOAorCS5sb25nCTB4MTI3M0REMDgKKwkubG9uZwkweDEyOTRERDA4CisJLmxvbmcJMHgxMkI1REQwOAorCS5sb25nCTB4MTJENkREMDgKKwlsdngJMjUsOCwxMQorCisJLmxvbmcJMHgxMUVGRTUwOAorCS5sb25nCTB4N0MwMDFFOTkKKwkubG9uZwkweDEyMTBFNTA4CisJLmxvbmcJMHg3QzI4MUU5OQorCS5sb25nCTB4MTIzMUU1MDgKKwkubG9uZwkweDdDNUExRTk5CisJLmxvbmcJMHgxMjUyRTUwOAorCS5sb25nCTB4N0M3QjFFOTkKKwkubG9uZwkweDEyNzNFNTA4CisJLmxvbmcJMHg3RDVDMUU5OQorCS5sb25nCTB4MTI5NEU1MDgKKwkubG9uZwkweDdEOUQxRTk5CisJLmxvbmcJMHgxMkI1RTUwOAorCS5sb25nCTB4N0RCRTFFOTkKKwkubG9uZwkweDEyRDZFNTA4CisJLmxvbmcJMHg3RERGMUU5OQorCWFkZGkJMywzLDB4ODAKKworCS5sb25nCTB4MTFFRkVEMDgKKwl2cGVybQkwLDAsMCw2CisJLmxvbmcJMHgxMjEwRUQwOAorCXZwZXJtCTEsMSwxLDYKKwkubG9uZwkweDEyMzFFRDA4CisJdnBlcm0JMiwyLDIsNgorCS5sb25nCTB4MTI1MkVEMDgKKwl2cGVybQkzLDMsMyw2CisJLmxvbmcJMHgxMjczRUQwOAorCXZwZXJtCTEwLDEwLDEwLDYKKwkubG9uZwkweDEyOTRFRDA4CisJdnBlcm0JMTIsMTIsMTIsNgorCS5sb25nCTB4MTJCNUVEMDgKKwl2cGVybQkxMywxMywxMyw2CisJLmxvbmcJMHgxMkQ2RUQwOAorCXZwZXJtCTE0LDE0LDE0LDYKKworCWFkZAkzLDMsMAorCisKKworCXN1YmZlLgkwLDAsMAorCS5sb25nCTB4MTFFRkY1MDgKKwl2eG9yCTAsMCwzMQorCS5sb25nCTB4MTIxMEY1MDgKKwl2eG9yCTEsMSwzMQorCS5sb25nCTB4MTIzMUY1MDgKKwl2eG9yCTIsMiwzMQorCS5sb25nCTB4MTI1MkY1MDgKKwl2eG9yCTMsMywzMQorCS5sb25nCTB4MTI3M0Y1MDgKKwl2eG9yCTEwLDEwLDMxCisJLmxvbmcJMHgxMjk0RjUwOAorCXZ4b3IJMTIsMTIsMzEKKwkubG9uZwkweDEyQjVGNTA4CisJdnhvcgkxMywxMywzMQorCS5sb25nCTB4MTJENkY1MDgKKwl2eG9yCTE0LDE0LDMxCisKKwlibmUJLkxjdHIzMl9lbmM4eF9icmVhaworCisJLmxvbmcJMHgxMDBGMDUwOQorCS5sb25nCTB4MTAzMDBEMDkKKwl2YWRkdXdtCTE2LDQsMTEKKwkubG9uZwkweDEwNTExNTA5CisJdmFkZHV3bQkxNyw0LDcKKwl2eG9yCTE1LDQsMjMKKwkubG9uZwkweDEwNzIxRDA5CisJdmFkZHV3bQkxOCwxNiw3CisJdnhvcgkxNiwxNiwyMworCS5sb25nCTB4MTE1MzU1MDkKKwl2YWRkdXdtCTE5LDE3LDcKKwl2eG9yCTE3LDE3LDIzCisJLmxvbmcJMHgxMTk0NjUwOQorCXZhZGR1d20JMjAsMTgsNworCXZ4b3IJMTgsMTgsMjMKKwkubG9uZwkweDExQjU2RDA5CisJdmFkZHV3bQkyMSwxOSw3CisJdnhvcgkxOSwxOSwyMworCS5sb25nCTB4MTFENjc1MDkKKwl2YWRkdXdtCTIyLDIwLDcKKwl2eG9yCTIwLDIwLDIzCisJdnBlcm0JMCwwLDAsNgorCXZhZGR1d20JNCwyMSw3CisJdnhvcgkyMSwyMSwyMworCXZwZXJtCTEsMSwxLDYKKwl2eG9yCTIyLDIyLDIzCisJbXRjdHIJOQorCisJLmxvbmcJMHgxMUVGQzUwOAorCS5sb25nCTB4N0MwMDI3OTkKKwl2cGVybQkyLDIsMiw2CisJLmxvbmcJMHgxMjEwQzUwOAorCS5sb25nCTB4N0MyODI3OTkKKwl2cGVybQkzLDMsMyw2CisJLmxvbmcJMHgxMjMxQzUwOAorCS5sb25nCTB4N0M1QTI3OTkKKwl2cGVybQkxMCwxMCwxMCw2CisJLmxvbmcJMHgxMjUyQzUwOAorCS5sb25nCTB4N0M3QjI3OTkKKwl2cGVybQkxMiwxMiwxMiw2CisJLmxvbmcJMHgxMjczQzUwOAorCS5sb25nCTB4N0Q1QzI3OTkKKwl2cGVybQkxMywxMywxMyw2CisJLmxvbmcJMHgxMjk0QzUwOAorCS5sb25nCTB4N0Q5RDI3OTkKKwl2cGVybQkxNCwxNCwxNCw2CisJLmxvbmcJMHgxMkI1QzUwOAorCS5sb25nCTB4N0RCRTI3OTkKKwkubG9uZwkweDEyRDZDNTA4CisJLmxvbmcJMHg3RERGMjc5OQorCWFkZGkJNCw0LDB4ODAKKworCWIJLkxvb3BfY3RyMzJfZW5jOHhfbWlkZGxlCisKKy5hbGlnbgk1CisuTGN0cjMyX2VuYzh4X2JyZWFrOgorCWNtcHdpCTUsLTB4NjAKKwlibHQJLkxjdHIzMl9lbmM4eF9vbmUKKwlub3AJCisJYmVxCS5MY3RyMzJfZW5jOHhfdHdvCisJY21wd2kJNSwtMHg0MAorCWJsdAkuTGN0cjMyX2VuYzh4X3RocmVlCisJbm9wCQorCWJlcQkuTGN0cjMyX2VuYzh4X2ZvdXIKKwljbXB3aQk1LC0weDIwCisJYmx0CS5MY3RyMzJfZW5jOHhfZml2ZQorCW5vcAkKKwliZXEJLkxjdHIzMl9lbmM4eF9zaXgKKwljbXB3aQk1LDB4MDAKKwlibHQJLkxjdHIzMl9lbmM4eF9zZXZlbgorCisuTGN0cjMyX2VuYzh4X2VpZ2h0OgorCS5sb25nCTB4MTFFRjA1MDkKKwkubG9uZwkweDEyMTAwRDA5CisJLmxvbmcJMHgxMjMxMTUwOQorCS5sb25nCTB4MTI1MjFEMDkKKwkubG9uZwkweDEyNzM1NTA5CisJLmxvbmcJMHgxMjk0NjUwOQorCS5sb25nCTB4MTJCNTZEMDkKKwkubG9uZwkweDEyRDY3NTA5CisKKwl2cGVybQkxNSwxNSwxNSw2CisJdnBlcm0JMTYsMTYsMTYsNgorCS5sb25nCTB4N0RFMDI3OTkKKwl2cGVybQkxNywxNywxNyw2CisJLmxvbmcJMHg3RTA4Mjc5OQorCXZwZXJtCTE4LDE4LDE4LDYKKwkubG9uZwkweDdFM0EyNzk5CisJdnBlcm0JMTksMTksMTksNgorCS5sb25nCTB4N0U1QjI3OTkKKwl2cGVybQkyMCwyMCwyMCw2CisJLmxvbmcJMHg3RTdDMjc5OQorCXZwZXJtCTIxLDIxLDIxLDYKKwkubG9uZwkweDdFOUQyNzk5CisJdnBlcm0JMjIsMjIsMjIsNgorCS5sb25nCTB4N0VCRTI3OTkKKwkubG9uZwkweDdFREYyNzk5CisJYWRkaQk0LDQsMHg4MAorCWIJLkxjdHIzMl9lbmM4eF9kb25lCisKKy5hbGlnbgk1CisuTGN0cjMyX2VuYzh4X3NldmVuOgorCS5sb25nCTB4MTFFRjBEMDkKKwkubG9uZwkweDEyMTAxNTA5CisJLmxvbmcJMHgxMjMxMUQwOQorCS5sb25nCTB4MTI1MjU1MDkKKwkubG9uZwkweDEyNzM2NTA5CisJLmxvbmcJMHgxMjk0NkQwOQorCS5sb25nCTB4MTJCNTc1MDkKKworCXZwZXJtCTE1LDE1LDE1LDYKKwl2cGVybQkxNiwxNiwxNiw2CisJLmxvbmcJMHg3REUwMjc5OQorCXZwZXJtCTE3LDE3LDE3LDYKKwkubG9uZwkweDdFMDgyNzk5CisJdnBlcm0JMTgsMTgsMTgsNgorCS5sb25nCTB4N0UzQTI3OTkKKwl2cGVybQkxOSwxOSwxOSw2CisJLmxvbmcJMHg3RTVCMjc5OQorCXZwZXJtCTIwLDIwLDIwLDYKKwkubG9uZwkweDdFN0MyNzk5CisJdnBlcm0JMjEsMjEsMjEsNgorCS5sb25nCTB4N0U5RDI3OTkKKwkubG9uZwkweDdFQkUyNzk5CisJYWRkaQk0LDQsMHg3MAorCWIJLkxjdHIzMl9lbmM4eF9kb25lCisKKy5hbGlnbgk1CisuTGN0cjMyX2VuYzh4X3NpeDoKKwkubG9uZwkweDExRUYxNTA5CisJLmxvbmcJMHgxMjEwMUQwOQorCS5sb25nCTB4MTIzMTU1MDkKKwkubG9uZwkweDEyNTI2NTA5CisJLmxvbmcJMHgxMjczNkQwOQorCS5sb25nCTB4MTI5NDc1MDkKKworCXZwZXJtCTE1LDE1LDE1LDYKKwl2cGVybQkxNiwxNiwxNiw2CisJLmxvbmcJMHg3REUwMjc5OQorCXZwZXJtCTE3LDE3LDE3LDYKKwkubG9uZwkweDdFMDgyNzk5CisJdnBlcm0JMTgsMTgsMTgsNgorCS5sb25nCTB4N0UzQTI3OTkKKwl2cGVybQkxOSwxOSwxOSw2CisJLmxvbmcJMHg3RTVCMjc5OQorCXZwZXJtCTIwLDIwLDIwLDYKKwkubG9uZwkweDdFN0MyNzk5CisJLmxvbmcJMHg3RTlEMjc5OQorCWFkZGkJNCw0LDB4NjAKKwliCS5MY3RyMzJfZW5jOHhfZG9uZQorCisuYWxpZ24JNQorLkxjdHIzMl9lbmM4eF9maXZlOgorCS5sb25nCTB4MTFFRjFEMDkKKwkubG9uZwkweDEyMTA1NTA5CisJLmxvbmcJMHgxMjMxNjUwOQorCS5sb25nCTB4MTI1MjZEMDkKKwkubG9uZwkweDEyNzM3NTA5CisKKwl2cGVybQkxNSwxNSwxNSw2CisJdnBlcm0JMTYsMTYsMTYsNgorCS5sb25nCTB4N0RFMDI3OTkKKwl2cGVybQkxNywxNywxNyw2CisJLmxvbmcJMHg3RTA4Mjc5OQorCXZwZXJtCTE4LDE4LDE4LDYKKwkubG9uZwkweDdFM0EyNzk5CisJdnBlcm0JMTksMTksMTksNgorCS5sb25nCTB4N0U1QjI3OTkKKwkubG9uZwkweDdFN0MyNzk5CisJYWRkaQk0LDQsMHg1MAorCWIJLkxjdHIzMl9lbmM4eF9kb25lCisKKy5hbGlnbgk1CisuTGN0cjMyX2VuYzh4X2ZvdXI6CisJLmxvbmcJMHgxMUVGNTUwOQorCS5sb25nCTB4MTIxMDY1MDkKKwkubG9uZwkweDEyMzE2RDA5CisJLmxvbmcJMHgxMjUyNzUwOQorCisJdnBlcm0JMTUsMTUsMTUsNgorCXZwZXJtCTE2LDE2LDE2LDYKKwkubG9uZwkweDdERTAyNzk5CisJdnBlcm0JMTcsMTcsMTcsNgorCS5sb25nCTB4N0UwODI3OTkKKwl2cGVybQkxOCwxOCwxOCw2CisJLmxvbmcJMHg3RTNBMjc5OQorCS5sb25nCTB4N0U1QjI3OTkKKwlhZGRpCTQsNCwweDQwCisJYgkuTGN0cjMyX2VuYzh4X2RvbmUKKworLmFsaWduCTUKKy5MY3RyMzJfZW5jOHhfdGhyZWU6CisJLmxvbmcJMHgxMUVGNjUwOQorCS5sb25nCTB4MTIxMDZEMDkKKwkubG9uZwkweDEyMzE3NTA5CisKKwl2cGVybQkxNSwxNSwxNSw2CisJdnBlcm0JMTYsMTYsMTYsNgorCS5sb25nCTB4N0RFMDI3OTkKKwl2cGVybQkxNywxNywxNyw2CisJLmxvbmcJMHg3RTA4Mjc5OQorCS5sb25nCTB4N0UzQTI3OTkKKwlhZGRpCTQsNCwweDMwCisJYgkuTGNiY19kZWM4eF9kb25lCisKKy5hbGlnbgk1CisuTGN0cjMyX2VuYzh4X3R3bzoKKwkubG9uZwkweDExRUY2RDA5CisJLmxvbmcJMHgxMjEwNzUwOQorCisJdnBlcm0JMTUsMTUsMTUsNgorCXZwZXJtCTE2LDE2LDE2LDYKKwkubG9uZwkweDdERTAyNzk5CisJLmxvbmcJMHg3RTA4Mjc5OQorCWFkZGkJNCw0LDB4MjAKKwliCS5MY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKKy5MY3RyMzJfZW5jOHhfb25lOgorCS5sb25nCTB4MTFFRjc1MDkKKworCXZwZXJtCTE1LDE1LDE1LDYKKwkubG9uZwkweDdERTAyNzk5CisJYWRkaQk0LDQsMHgxMAorCisuTGN0cjMyX2VuYzh4X2RvbmU6CisJbGkJMTAsNzkKKwlsaQkxMSw5NQorCXN0dngJNiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJNiwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJNiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJNiwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJNiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJNiwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJNiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJNiwxMSwxCisJYWRkaQkxMSwxMSwzMgorCisJb3IJMTIsMTIsMTIKKwlsdngJMjAsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjEsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjIsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjMsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjQsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjUsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjYsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjcsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjgsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjksMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMzAsMTAsMQorCWx2eAkzMSwxMSwxCisJbGQJMjYsNDAwKDEpCisJbGQJMjcsNDA4KDEpCisJbGQJMjgsNDE2KDEpCisJbGQJMjksNDI0KDEpCisJbGQJMzAsNDMyKDEpCisJbGQJMzEsNDQwKDEpCisJYWRkaQkxLDEsNDQ4CisJYmxyCQorLmxvbmcJMAorLmJ5dGUJMCwxMiwweDA0LDAsMHg4MCw2LDYsMAorLmxvbmcJMAorLnNpemUJYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzLC4tYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzCisuZ2xvYmwJYWVzX2h3X3h0c19lbmNyeXB0CisudHlwZQlhZXNfaHdfeHRzX2VuY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X3h0c19lbmNyeXB0OgorLmxvY2FsZW50cnkJYWVzX2h3X3h0c19lbmNyeXB0LDAKKworCW1yCTEwLDMKKwlsaQkzLC0xCisJY21wbGRpCTUsMTYKKwkubG9uZwkweDRkYzAwMDIwCisKKwlsaXMJMCwweGZmZjAKKwlsaQkxMiwtMQorCWxpCTExLDAKKwlvcgkwLDAsMAorCisJdnNwbHRpc2IJOSwweDA3CisJbHZzbAk2LDExLDExCisJdnNwbHRpc2IJMTEsMHgwZgorCXZ4b3IJNiw2LDkKKworCWxpCTMsMTUKKwlsdngJOCwwLDgKKwlsdnNsCTUsMCw4CisJbHZ4CTQsMyw4CisJdnhvcgk1LDUsMTEKKwl2cGVybQk4LDgsNCw1CisKKwluZWcJMTEsMTAKKwlsdnNyCTUsMCwxMQorCWx2eAkyLDAsMTAKKwlhZGRpCTEwLDEwLDE1CisJdnhvcgk1LDUsMTEKKworCWNtcGxkaQk3LDAKKwliZXEJLkx4dHNfZW5jX25vX2tleTIKKworCWx2c3IJNywwLDcKKwlsd3oJOSwyNDAoNykKKwlzcndpCTksOSwxCisJc3ViaQk5LDksMQorCWxpCTMsMTYKKworCWx2eAkwLDAsNworCWx2eAkxLDMsNworCWFkZGkJMywzLDE2CisJdnBlcm0JMCwxLDAsNworCXZ4b3IJOCw4LDAKKwlsdngJMCwzLDcKKwlhZGRpCTMsMywxNgorCW10Y3RyCTkKKworLkx0d2Vha194dHNfZW5jOgorCXZwZXJtCTEsMCwxLDcKKwkubG9uZwkweDExMDgwRDA4CisJbHZ4CTEsMyw3CisJYWRkaQkzLDMsMTYKKwl2cGVybQkwLDEsMCw3CisJLmxvbmcJMHgxMTA4MDUwOAorCWx2eAkwLDMsNworCWFkZGkJMywzLDE2CisJYmRuegkuTHR3ZWFrX3h0c19lbmMKKworCXZwZXJtCTEsMCwxLDcKKwkubG9uZwkweDExMDgwRDA4CisJbHZ4CTEsMyw3CisJdnBlcm0JMCwxLDAsNworCS5sb25nCTB4MTEwODA1MDkKKworCWxpCTgsMAorCWIJLkx4dHNfZW5jCisKKy5MeHRzX2VuY19ub19rZXkyOgorCWxpCTMsLTE2CisJYW5kCTUsNSwzCisKKworLkx4dHNfZW5jOgorCWx2eAk0LDAsMTAKKwlhZGRpCTEwLDEwLDE2CisKKwlsdnNyCTcsMCw2CisJbHd6CTksMjQwKDYpCisJc3J3aQk5LDksMQorCXN1YmkJOSw5LDEKKwlsaQkzLDE2CisKKwl2c2xiCTEwLDksOQorCXZvcgkxMCwxMCw5CisJdnNwbHRpc2IJMTEsMQorCXZzbGRvaQkxMCwxMCwxMSwxNQorCisJY21wbGRpCTUsOTYKKwliZ2UJX2Flc3A4X3h0c19lbmNyeXB0NngKKworCWFuZGkuCTcsNSwxNQorCXN1YmljCTAsNSwzMgorCXN1YmkJNyw3LDE2CisJc3ViZmUJMCwwLDAKKwlhbmQJMCwwLDcKKwlhZGQJMTAsMTAsMAorCisJbHZ4CTAsMCw2CisJbHZ4CTEsMyw2CisJYWRkaQkzLDMsMTYKKwl2cGVybQkyLDIsNCw1CisJdnBlcm0JMCwxLDAsNworCXZ4b3IJMiwyLDgKKwl2eG9yCTIsMiwwCisJbHZ4CTAsMyw2CisJYWRkaQkzLDMsMTYKKwltdGN0cgk5CisJYgkuTG9vcF94dHNfZW5jCisKKy5hbGlnbgk1CisuTG9vcF94dHNfZW5jOgorCXZwZXJtCTEsMCwxLDcKKwkubG9uZwkweDEwNDIwRDA4CisJbHZ4CTEsMyw2CisJYWRkaQkzLDMsMTYKKwl2cGVybQkwLDEsMCw3CisJLmxvbmcJMHgxMDQyMDUwOAorCWx2eAkwLDMsNgorCWFkZGkJMywzLDE2CisJYmRuegkuTG9vcF94dHNfZW5jCisKKwl2cGVybQkxLDAsMSw3CisJLmxvbmcJMHgxMDQyMEQwOAorCWx2eAkxLDMsNgorCWxpCTMsMTYKKwl2cGVybQkwLDEsMCw3CisJdnhvcgkwLDAsOAorCS5sb25nCTB4MTA2MjA1MDkKKworCXZwZXJtCTExLDMsMyw2CisKKwkubG9uZwkweDdENjAyNzk5CisKKwlhZGRpCTQsNCwxNgorCisJc3ViaWMuCTUsNSwxNgorCWJlcQkuTHh0c19lbmNfZG9uZQorCisJdm9yCTIsNCw0CisJbHZ4CTQsMCwxMAorCWFkZGkJMTAsMTAsMTYKKwlsdngJMCwwLDYKKwlsdngJMSwzLDYKKwlhZGRpCTMsMywxNgorCisJc3ViaWMJMCw1LDMyCisJc3ViZmUJMCwwLDAKKwlhbmQJMCwwLDcKKwlhZGQJMTAsMTAsMAorCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZhbmQJMTEsMTEsMTAKKwl2eG9yCTgsOCwxMQorCisJdnBlcm0JMiwyLDQsNQorCXZwZXJtCTAsMSwwLDcKKwl2eG9yCTIsMiw4CisJdnhvcgkzLDMsMAorCXZ4b3IJMiwyLDAKKwlsdngJMCwzLDYKKwlhZGRpCTMsMywxNgorCisJbXRjdHIJOQorCWNtcGxkaQk1LDE2CisJYmdlCS5Mb29wX3h0c19lbmMKKworCXZ4b3IJMywzLDgKKwlsdnNyCTUsMCw1CisJdnhvcgk0LDQsNAorCXZzcGx0aXNiCTExLC0xCisJdnBlcm0JNCw0LDExLDUKKwl2c2VsCTIsMiwzLDQKKworCXN1YmkJMTEsNCwxNworCXN1YmkJNCw0LDE2CisJbXRjdHIJNQorCWxpCTUsMTYKKy5Mb29wX3h0c19lbmNfc3RlYWw6CisJbGJ6dQkwLDEoMTEpCisJc3RiCTAsMTYoMTEpCisJYmRuegkuTG9vcF94dHNfZW5jX3N0ZWFsCisKKwltdGN0cgk5CisJYgkuTG9vcF94dHNfZW5jCisKKy5MeHRzX2VuY19kb25lOgorCWNtcGxkaQk4LDAKKwliZXEJLkx4dHNfZW5jX3JldAorCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZhbmQJMTEsMTEsMTAKKwl2eG9yCTgsOCwxMQorCisJdnBlcm0JOCw4LDgsNgorCS5sb25nCTB4N0QwMDQ3OTkKKworLkx4dHNfZW5jX3JldDoKKwlvcgkxMiwxMiwxMgorCWxpCTMsMAorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgwNCwwLDB4ODAsNiw2LDAKKy5sb25nCTAKKy5zaXplCWFlc19od194dHNfZW5jcnlwdCwuLWFlc19od194dHNfZW5jcnlwdAorCisuZ2xvYmwJYWVzX2h3X3h0c19kZWNyeXB0CisudHlwZQlhZXNfaHdfeHRzX2RlY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JNQorYWVzX2h3X3h0c19kZWNyeXB0OgorLmxvY2FsZW50cnkJYWVzX2h3X3h0c19kZWNyeXB0LDAKKworCW1yCTEwLDMKKwlsaQkzLC0xCisJY21wbGRpCTUsMTYKKwkubG9uZwkweDRkYzAwMDIwCisKKwlsaXMJMCwweGZmZjgKKwlsaQkxMiwtMQorCWxpCTExLDAKKwlvcgkwLDAsMAorCisJYW5kaS4JMCw1LDE1CisJbmVnCTAsMAorCWFuZGkuCTAsMCwxNgorCXN1Ygk1LDUsMAorCisJdnNwbHRpc2IJOSwweDA3CisJbHZzbAk2LDExLDExCisJdnNwbHRpc2IJMTEsMHgwZgorCXZ4b3IJNiw2LDkKKworCWxpCTMsMTUKKwlsdngJOCwwLDgKKwlsdnNsCTUsMCw4CisJbHZ4CTQsMyw4CisJdnhvcgk1LDUsMTEKKwl2cGVybQk4LDgsNCw1CisKKwluZWcJMTEsMTAKKwlsdnNyCTUsMCwxMQorCWx2eAkyLDAsMTAKKwlhZGRpCTEwLDEwLDE1CisJdnhvcgk1LDUsMTEKKworCWNtcGxkaQk3LDAKKwliZXEJLkx4dHNfZGVjX25vX2tleTIKKworCWx2c3IJNywwLDcKKwlsd3oJOSwyNDAoNykKKwlzcndpCTksOSwxCisJc3ViaQk5LDksMQorCWxpCTMsMTYKKworCWx2eAkwLDAsNworCWx2eAkxLDMsNworCWFkZGkJMywzLDE2CisJdnBlcm0JMCwxLDAsNworCXZ4b3IJOCw4LDAKKwlsdngJMCwzLDcKKwlhZGRpCTMsMywxNgorCW10Y3RyCTkKKworLkx0d2Vha194dHNfZGVjOgorCXZwZXJtCTEsMCwxLDcKKwkubG9uZwkweDExMDgwRDA4CisJbHZ4CTEsMyw3CisJYWRkaQkzLDMsMTYKKwl2cGVybQkwLDEsMCw3CisJLmxvbmcJMHgxMTA4MDUwOAorCWx2eAkwLDMsNworCWFkZGkJMywzLDE2CisJYmRuegkuTHR3ZWFrX3h0c19kZWMKKworCXZwZXJtCTEsMCwxLDcKKwkubG9uZwkweDExMDgwRDA4CisJbHZ4CTEsMyw3CisJdnBlcm0JMCwxLDAsNworCS5sb25nCTB4MTEwODA1MDkKKworCWxpCTgsMAorCWIJLkx4dHNfZGVjCisKKy5MeHRzX2RlY19ub19rZXkyOgorCW5lZwkzLDUKKwlhbmRpLgkzLDMsMTUKKwlhZGQJNSw1LDMKKworCisuTHh0c19kZWM6CisJbHZ4CTQsMCwxMAorCWFkZGkJMTAsMTAsMTYKKworCWx2c3IJNywwLDYKKwlsd3oJOSwyNDAoNikKKwlzcndpCTksOSwxCisJc3ViaQk5LDksMQorCWxpCTMsMTYKKworCXZzbGIJMTAsOSw5CisJdm9yCTEwLDEwLDkKKwl2c3BsdGlzYgkxMSwxCisJdnNsZG9pCTEwLDEwLDExLDE1CisKKwljbXBsZGkJNSw5NgorCWJnZQlfYWVzcDhfeHRzX2RlY3J5cHQ2eAorCisJbHZ4CTAsMCw2CisJbHZ4CTEsMyw2CisJYWRkaQkzLDMsMTYKKwl2cGVybQkyLDIsNCw1CisJdnBlcm0JMCwxLDAsNworCXZ4b3IJMiwyLDgKKwl2eG9yCTIsMiwwCisJbHZ4CTAsMyw2CisJYWRkaQkzLDMsMTYKKwltdGN0cgk5CisKKwljbXBsZGkJNSwxNgorCWJsdAkuTHRhaWxfeHRzX2RlYworCisKKy5hbGlnbgk1CisuTG9vcF94dHNfZGVjOgorCXZwZXJtCTEsMCwxLDcKKwkubG9uZwkweDEwNDIwRDQ4CisJbHZ4CTEsMyw2CisJYWRkaQkzLDMsMTYKKwl2cGVybQkwLDEsMCw3CisJLmxvbmcJMHgxMDQyMDU0OAorCWx2eAkwLDMsNgorCWFkZGkJMywzLDE2CisJYmRuegkuTG9vcF94dHNfZGVjCisKKwl2cGVybQkxLDAsMSw3CisJLmxvbmcJMHgxMDQyMEQ0OAorCWx2eAkxLDMsNgorCWxpCTMsMTYKKwl2cGVybQkwLDEsMCw3CisJdnhvcgkwLDAsOAorCS5sb25nCTB4MTA2MjA1NDkKKworCXZwZXJtCTExLDMsMyw2CisKKwkubG9uZwkweDdENjAyNzk5CisKKwlhZGRpCTQsNCwxNgorCisJc3ViaWMuCTUsNSwxNgorCWJlcQkuTHh0c19kZWNfZG9uZQorCisJdm9yCTIsNCw0CisJbHZ4CTQsMCwxMAorCWFkZGkJMTAsMTAsMTYKKwlsdngJMCwwLDYKKwlsdngJMSwzLDYKKwlhZGRpCTMsMywxNgorCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZhbmQJMTEsMTEsMTAKKwl2eG9yCTgsOCwxMQorCisJdnBlcm0JMiwyLDQsNQorCXZwZXJtCTAsMSwwLDcKKwl2eG9yCTIsMiw4CisJdnhvcgkyLDIsMAorCWx2eAkwLDMsNgorCWFkZGkJMywzLDE2CisKKwltdGN0cgk5CisJY21wbGRpCTUsMTYKKwliZ2UJLkxvb3BfeHRzX2RlYworCisuTHRhaWxfeHRzX2RlYzoKKwl2c3JhYgkxMSw4LDkKKwl2YWRkdWJtCTEyLDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZhbmQJMTEsMTEsMTAKKwl2eG9yCTEyLDEyLDExCisKKwlzdWJpCTEwLDEwLDE2CisJYWRkCTEwLDEwLDUKKworCXZ4b3IJMiwyLDgKKwl2eG9yCTIsMiwxMgorCisuTG9vcF94dHNfZGVjX3Nob3J0OgorCXZwZXJtCTEsMCwxLDcKKwkubG9uZwkweDEwNDIwRDQ4CisJbHZ4CTEsMyw2CisJYWRkaQkzLDMsMTYKKwl2cGVybQkwLDEsMCw3CisJLmxvbmcJMHgxMDQyMDU0OAorCWx2eAkwLDMsNgorCWFkZGkJMywzLDE2CisJYmRuegkuTG9vcF94dHNfZGVjX3Nob3J0CisKKwl2cGVybQkxLDAsMSw3CisJLmxvbmcJMHgxMDQyMEQ0OAorCWx2eAkxLDMsNgorCWxpCTMsMTYKKwl2cGVybQkwLDEsMCw3CisJdnhvcgkwLDAsMTIKKwkubG9uZwkweDEwNjIwNTQ5CisKKwl2cGVybQkxMSwzLDMsNgorCisJLmxvbmcJMHg3RDYwMjc5OQorCisKKwl2b3IJMiw0LDQKKwlsdngJNCwwLDEwCisKKwlsdngJMCwwLDYKKwlsdngJMSwzLDYKKwlhZGRpCTMsMywxNgorCXZwZXJtCTIsMiw0LDUKKwl2cGVybQkwLDEsMCw3CisKKwlsdnNyCTUsMCw1CisJdnhvcgk0LDQsNAorCXZzcGx0aXNiCTExLC0xCisJdnBlcm0JNCw0LDExLDUKKwl2c2VsCTIsMiwzLDQKKworCXZ4b3IJMCwwLDgKKwl2eG9yCTIsMiwwCisJbHZ4CTAsMyw2CisJYWRkaQkzLDMsMTYKKworCXN1YmkJMTEsNCwxCisJbXRjdHIJNQorCWxpCTUsMTYKKy5Mb29wX3h0c19kZWNfc3RlYWw6CisJbGJ6dQkwLDEoMTEpCisJc3RiCTAsMTYoMTEpCisJYmRuegkuTG9vcF94dHNfZGVjX3N0ZWFsCisKKwltdGN0cgk5CisJYgkuTG9vcF94dHNfZGVjCisKKy5MeHRzX2RlY19kb25lOgorCWNtcGxkaQk4LDAKKwliZXEJLkx4dHNfZGVjX3JldAorCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZhbmQJMTEsMTEsMTAKKwl2eG9yCTgsOCwxMQorCisJdnBlcm0JOCw4LDgsNgorCS5sb25nCTB4N0QwMDQ3OTkKKworLkx4dHNfZGVjX3JldDoKKwlvcgkxMiwxMiwxMgorCWxpCTMsMAorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgwNCwwLDB4ODAsNiw2LDAKKy5sb25nCTAKKy5zaXplCWFlc19od194dHNfZGVjcnlwdCwuLWFlc19od194dHNfZGVjcnlwdAorLmFsaWduCTUKK19hZXNwOF94dHNfZW5jcnlwdDZ4OgorCXN0ZHUJMSwtNDQ4KDEpCisJbWZscgkxMQorCWxpCTcsMjA3CisJbGkJMywyMjMKKwlzdGQJMTEsNDY0KDEpCisJc3R2eAkyMCw3LDEKKwlhZGRpCTcsNywzMgorCXN0dngJMjEsMywxCisJYWRkaQkzLDMsMzIKKwlzdHZ4CTIyLDcsMQorCWFkZGkJNyw3LDMyCisJc3R2eAkyMywzLDEKKwlhZGRpCTMsMywzMgorCXN0dngJMjQsNywxCisJYWRkaQk3LDcsMzIKKwlzdHZ4CTI1LDMsMQorCWFkZGkJMywzLDMyCisJc3R2eAkyNiw3LDEKKwlhZGRpCTcsNywzMgorCXN0dngJMjcsMywxCisJYWRkaQkzLDMsMzIKKwlzdHZ4CTI4LDcsMQorCWFkZGkJNyw3LDMyCisJc3R2eAkyOSwzLDEKKwlhZGRpCTMsMywzMgorCXN0dngJMzAsNywxCisJc3R2eAkzMSwzLDEKKwlsaQkwLC0xCisJc3R3CTEyLDM5NigxKQorCWxpCTMsMHgxMAorCXN0ZAkyNiw0MDAoMSkKKwlsaQkyNiwweDIwCisJc3RkCTI3LDQwOCgxKQorCWxpCTI3LDB4MzAKKwlzdGQJMjgsNDE2KDEpCisJbGkJMjgsMHg0MAorCXN0ZAkyOSw0MjQoMSkKKwlsaQkyOSwweDUwCisJc3RkCTMwLDQzMigxKQorCWxpCTMwLDB4NjAKKwlzdGQJMzEsNDQwKDEpCisJbGkJMzEsMHg3MAorCW9yCTAsMCwwCisKKwlzdWJpCTksOSwzCisKKwlsdngJMjMsMCw2CisJbHZ4CTMwLDMsNgorCWFkZGkJNiw2LDB4MjAKKwlsdngJMzEsMCw2CisJdnBlcm0JMjMsMzAsMjMsNworCWFkZGkJNywxLDc5CisJbXRjdHIJOQorCisuTG9hZF94dHNfZW5jX2tleToKKwl2cGVybQkyNCwzMSwzMCw3CisJbHZ4CTMwLDMsNgorCWFkZGkJNiw2LDB4MjAKKwlzdHZ4CTI0LDAsNworCXZwZXJtCTI1LDMwLDMxLDcKKwlsdngJMzEsMCw2CisJc3R2eAkyNSwzLDcKKwlhZGRpCTcsNywweDIwCisJYmRuegkuTG9hZF94dHNfZW5jX2tleQorCisJbHZ4CTI2LDMsNgorCXZwZXJtCTI0LDMxLDMwLDcKKwlsdngJMjcsMjYsNgorCXN0dngJMjQsMCw3CisJdnBlcm0JMjUsMjYsMzEsNworCWx2eAkyOCwyNyw2CisJc3R2eAkyNSwzLDcKKwlhZGRpCTcsMSw3OQorCXZwZXJtCTI2LDI3LDI2LDcKKwlsdngJMjksMjgsNgorCXZwZXJtCTI3LDI4LDI3LDcKKwlsdngJMzAsMjksNgorCXZwZXJtCTI4LDI5LDI4LDcKKwlsdngJMzEsMzAsNgorCXZwZXJtCTI5LDMwLDI5LDcKKwlsdngJMjIsMzEsNgorCXZwZXJtCTMwLDMxLDMwLDcKKwlsdngJMjQsMCw3CisJdnBlcm0JMzEsMjIsMzEsNworCWx2eAkyNSwzLDcKKworCXZwZXJtCTAsMiw0LDUKKwlzdWJpCTEwLDEwLDMxCisJdnhvcgkxNyw4LDIzCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZhbmQJMTEsMTEsMTAKKwl2eG9yCTcsMCwxNworCXZ4b3IJOCw4LDExCisKKwkubG9uZwkweDdDMjM1Njk5CisJdnhvcgkxOCw4LDIzCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZwZXJtCTEsMSwxLDYKKwl2YW5kCTExLDExLDEwCisJdnhvcgkxMiwxLDE4CisJdnhvcgk4LDgsMTEKKworCS5sb25nCTB4N0M1QTU2OTkKKwlhbmRpLgkzMSw1LDE1CisJdnhvcgkxOSw4LDIzCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZwZXJtCTIsMiwyLDYKKwl2YW5kCTExLDExLDEwCisJdnhvcgkxMywyLDE5CisJdnhvcgk4LDgsMTEKKworCS5sb25nCTB4N0M3QjU2OTkKKwlzdWIJNSw1LDMxCisJdnhvcgkyMCw4LDIzCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZwZXJtCTMsMywzLDYKKwl2YW5kCTExLDExLDEwCisJdnhvcgkxNCwzLDIwCisJdnhvcgk4LDgsMTEKKworCS5sb25nCTB4N0M5QzU2OTkKKwlzdWJpCTUsNSwweDYwCisJdnhvcgkyMSw4LDIzCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZwZXJtCTQsNCw0LDYKKwl2YW5kCTExLDExLDEwCisJdnhvcgkxNSw0LDIxCisJdnhvcgk4LDgsMTEKKworCS5sb25nCTB4N0NCRDU2OTkKKwlhZGRpCTEwLDEwLDB4NjAKKwl2eG9yCTIyLDgsMjMKKwl2c3JhYgkxMSw4LDkKKwl2YWRkdWJtCTgsOCw4CisJdnNsZG9pCTExLDExLDExLDE1CisJdnBlcm0JNSw1LDUsNgorCXZhbmQJMTEsMTEsMTAKKwl2eG9yCTE2LDUsMjIKKwl2eG9yCTgsOCwxMQorCisJdnhvcgkzMSwzMSwyMworCW10Y3RyCTkKKwliCS5Mb29wX3h0c19lbmM2eAorCisuYWxpZ24JNQorLkxvb3BfeHRzX2VuYzZ4OgorCS5sb25nCTB4MTBFN0M1MDgKKwkubG9uZwkweDExOENDNTA4CisJLmxvbmcJMHgxMUFEQzUwOAorCS5sb25nCTB4MTFDRUM1MDgKKwkubG9uZwkweDExRUZDNTA4CisJLmxvbmcJMHgxMjEwQzUwOAorCWx2eAkyNCwyNiw3CisJYWRkaQk3LDcsMHgyMAorCisJLmxvbmcJMHgxMEU3Q0QwOAorCS5sb25nCTB4MTE4Q0NEMDgKKwkubG9uZwkweDExQURDRDA4CisJLmxvbmcJMHgxMUNFQ0QwOAorCS5sb25nCTB4MTFFRkNEMDgKKwkubG9uZwkweDEyMTBDRDA4CisJbHZ4CTI1LDMsNworCWJkbnoJLkxvb3BfeHRzX2VuYzZ4CisKKwlzdWJpYwk1LDUsOTYKKwl2eG9yCTAsMTcsMzEKKwkubG9uZwkweDEwRTdDNTA4CisJLmxvbmcJMHgxMThDQzUwOAorCXZzcmFiCTExLDgsOQorCXZ4b3IJMTcsOCwyMworCXZhZGR1Ym0JOCw4LDgKKwkubG9uZwkweDExQURDNTA4CisJLmxvbmcJMHgxMUNFQzUwOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCS5sb25nCTB4MTFFRkM1MDgKKwkubG9uZwkweDEyMTBDNTA4CisKKwlzdWJmZS4JMCwwLDAKKwl2YW5kCTExLDExLDEwCisJLmxvbmcJMHgxMEU3Q0QwOAorCS5sb25nCTB4MTE4Q0NEMDgKKwl2eG9yCTgsOCwxMQorCS5sb25nCTB4MTFBRENEMDgKKwkubG9uZwkweDExQ0VDRDA4CisJdnhvcgkxLDE4LDMxCisJdnNyYWIJMTEsOCw5CisJdnhvcgkxOCw4LDIzCisJLmxvbmcJMHgxMUVGQ0QwOAorCS5sb25nCTB4MTIxMENEMDgKKworCWFuZAkwLDAsNQorCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwkubG9uZwkweDEwRTdENTA4CisJLmxvbmcJMHgxMThDRDUwOAorCXZhbmQJMTEsMTEsMTAKKwkubG9uZwkweDExQURENTA4CisJLmxvbmcJMHgxMUNFRDUwOAorCXZ4b3IJOCw4LDExCisJLmxvbmcJMHgxMUVGRDUwOAorCS5sb25nCTB4MTIxMEQ1MDgKKworCWFkZAkxMCwxMCwwCisKKworCisJdnhvcgkyLDE5LDMxCisJdnNyYWIJMTEsOCw5CisJdnhvcgkxOSw4LDIzCisJdmFkZHVibQk4LDgsOAorCS5sb25nCTB4MTBFN0REMDgKKwkubG9uZwkweDExOENERDA4CisJdnNsZG9pCTExLDExLDExLDE1CisJLmxvbmcJMHgxMUFEREQwOAorCS5sb25nCTB4MTFDRUREMDgKKwl2YW5kCTExLDExLDEwCisJLmxvbmcJMHgxMUVGREQwOAorCS5sb25nCTB4MTIxMEREMDgKKworCWFkZGkJNywxLDc5CisJdnhvcgk4LDgsMTEKKwkubG9uZwkweDEwRTdFNTA4CisJLmxvbmcJMHgxMThDRTUwOAorCXZ4b3IJMywyMCwzMQorCXZzcmFiCTExLDgsOQorCXZ4b3IJMjAsOCwyMworCS5sb25nCTB4MTFBREU1MDgKKwkubG9uZwkweDExQ0VFNTA4CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCS5sb25nCTB4MTFFRkU1MDgKKwkubG9uZwkweDEyMTBFNTA4CisJbHZ4CTI0LDAsNworCXZhbmQJMTEsMTEsMTAKKworCS5sb25nCTB4MTBFN0VEMDgKKwkubG9uZwkweDExOENFRDA4CisJdnhvcgk4LDgsMTEKKwkubG9uZwkweDExQURFRDA4CisJLmxvbmcJMHgxMUNFRUQwOAorCXZ4b3IJNCwyMSwzMQorCXZzcmFiCTExLDgsOQorCXZ4b3IJMjEsOCwyMworCS5sb25nCTB4MTFFRkVEMDgKKwkubG9uZwkweDEyMTBFRDA4CisJbHZ4CTI1LDMsNworCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKworCS5sb25nCTB4MTBFN0Y1MDgKKwkubG9uZwkweDExOENGNTA4CisJdmFuZAkxMSwxMSwxMAorCS5sb25nCTB4MTFBREY1MDgKKwkubG9uZwkweDExQ0VGNTA4CisJdnhvcgk4LDgsMTEKKwkubG9uZwkweDExRUZGNTA4CisJLmxvbmcJMHgxMjEwRjUwOAorCXZ4b3IJNSwyMiwzMQorCXZzcmFiCTExLDgsOQorCXZ4b3IJMjIsOCwyMworCisJLmxvbmcJMHgxMEU3MDUwOQorCS5sb25nCTB4N0MwMDU2OTkKKwl2YWRkdWJtCTgsOCw4CisJdnNsZG9pCTExLDExLDExLDE1CisJLmxvbmcJMHgxMThDMEQwOQorCS5sb25nCTB4N0MyMzU2OTkKKwkubG9uZwkweDExQUQxNTA5CisJdnBlcm0JMCwwLDAsNgorCS5sb25nCTB4N0M1QTU2OTkKKwl2YW5kCTExLDExLDEwCisJLmxvbmcJMHgxMUNFMUQwOQorCXZwZXJtCTEsMSwxLDYKKwkubG9uZwkweDdDN0I1Njk5CisJLmxvbmcJMHgxMUVGMjUwOQorCXZwZXJtCTIsMiwyLDYKKwkubG9uZwkweDdDOUM1Njk5CisJdnhvcgk4LDgsMTEKKwkubG9uZwkweDExNzAyRDA5CisKKwl2cGVybQkzLDMsMyw2CisJLmxvbmcJMHg3Q0JENTY5OQorCWFkZGkJMTAsMTAsMHg2MAorCXZwZXJtCTQsNCw0LDYKKwl2cGVybQk1LDUsNSw2CisKKwl2cGVybQk3LDcsNyw2CisJdnBlcm0JMTIsMTIsMTIsNgorCS5sb25nCTB4N0NFMDI3OTkKKwl2eG9yCTcsMCwxNworCXZwZXJtCTEzLDEzLDEzLDYKKwkubG9uZwkweDdEODMyNzk5CisJdnhvcgkxMiwxLDE4CisJdnBlcm0JMTQsMTQsMTQsNgorCS5sb25nCTB4N0RCQTI3OTkKKwl2eG9yCTEzLDIsMTkKKwl2cGVybQkxNSwxNSwxNSw2CisJLmxvbmcJMHg3RERCMjc5OQorCXZ4b3IJMTQsMywyMAorCXZwZXJtCTE2LDExLDExLDYKKwkubG9uZwkweDdERkMyNzk5CisJdnhvcgkxNSw0LDIxCisJLmxvbmcJMHg3RTFEMjc5OQorCisJdnhvcgkxNiw1LDIyCisJYWRkaQk0LDQsMHg2MAorCisJbXRjdHIJOQorCWJlcQkuTG9vcF94dHNfZW5jNngKKworCWFkZGljLgk1LDUsMHg2MAorCWJlcQkuTHh0c19lbmM2eF96ZXJvCisJY21wd2kJNSwweDIwCisJYmx0CS5MeHRzX2VuYzZ4X29uZQorCW5vcAkKKwliZXEJLkx4dHNfZW5jNnhfdHdvCisJY21wd2kJNSwweDQwCisJYmx0CS5MeHRzX2VuYzZ4X3RocmVlCisJbm9wCQorCWJlcQkuTHh0c19lbmM2eF9mb3VyCisKKy5MeHRzX2VuYzZ4X2ZpdmU6CisJdnhvcgk3LDEsMTcKKwl2eG9yCTEyLDIsMTgKKwl2eG9yCTEzLDMsMTkKKwl2eG9yCTE0LDQsMjAKKwl2eG9yCTE1LDUsMjEKKworCWJsCV9hZXNwOF94dHNfZW5jNXgKKworCXZwZXJtCTcsNyw3LDYKKwl2b3IJMTcsMjIsMjIKKwl2cGVybQkxMiwxMiwxMiw2CisJLmxvbmcJMHg3Q0UwMjc5OQorCXZwZXJtCTEzLDEzLDEzLDYKKwkubG9uZwkweDdEODMyNzk5CisJdnBlcm0JMTQsMTQsMTQsNgorCS5sb25nCTB4N0RCQTI3OTkKKwl2eG9yCTExLDE1LDIyCisJdnBlcm0JMTUsMTUsMTUsNgorCS5sb25nCTB4N0REQjI3OTkKKwkubG9uZwkweDdERkMyNzk5CisJYWRkaQk0LDQsMHg1MAorCWJuZQkuTHh0c19lbmM2eF9zdGVhbAorCWIJLkx4dHNfZW5jNnhfZG9uZQorCisuYWxpZ24JNAorLkx4dHNfZW5jNnhfZm91cjoKKwl2eG9yCTcsMiwxNworCXZ4b3IJMTIsMywxOAorCXZ4b3IJMTMsNCwxOQorCXZ4b3IJMTQsNSwyMAorCXZ4b3IJMTUsMTUsMTUKKworCWJsCV9hZXNwOF94dHNfZW5jNXgKKworCXZwZXJtCTcsNyw3LDYKKwl2b3IJMTcsMjEsMjEKKwl2cGVybQkxMiwxMiwxMiw2CisJLmxvbmcJMHg3Q0UwMjc5OQorCXZwZXJtCTEzLDEzLDEzLDYKKwkubG9uZwkweDdEODMyNzk5CisJdnhvcgkxMSwxNCwyMQorCXZwZXJtCTE0LDE0LDE0LDYKKwkubG9uZwkweDdEQkEyNzk5CisJLmxvbmcJMHg3RERCMjc5OQorCWFkZGkJNCw0LDB4NDAKKwlibmUJLkx4dHNfZW5jNnhfc3RlYWwKKwliCS5MeHRzX2VuYzZ4X2RvbmUKKworLmFsaWduCTQKKy5MeHRzX2VuYzZ4X3RocmVlOgorCXZ4b3IJNywzLDE3CisJdnhvcgkxMiw0LDE4CisJdnhvcgkxMyw1LDE5CisJdnhvcgkxNCwxNCwxNAorCXZ4b3IJMTUsMTUsMTUKKworCWJsCV9hZXNwOF94dHNfZW5jNXgKKworCXZwZXJtCTcsNyw3LDYKKwl2b3IJMTcsMjAsMjAKKwl2cGVybQkxMiwxMiwxMiw2CisJLmxvbmcJMHg3Q0UwMjc5OQorCXZ4b3IJMTEsMTMsMjAKKwl2cGVybQkxMywxMywxMyw2CisJLmxvbmcJMHg3RDgzMjc5OQorCS5sb25nCTB4N0RCQTI3OTkKKwlhZGRpCTQsNCwweDMwCisJYm5lCS5MeHRzX2VuYzZ4X3N0ZWFsCisJYgkuTHh0c19lbmM2eF9kb25lCisKKy5hbGlnbgk0CisuTHh0c19lbmM2eF90d286CisJdnhvcgk3LDQsMTcKKwl2eG9yCTEyLDUsMTgKKwl2eG9yCTEzLDEzLDEzCisJdnhvcgkxNCwxNCwxNAorCXZ4b3IJMTUsMTUsMTUKKworCWJsCV9hZXNwOF94dHNfZW5jNXgKKworCXZwZXJtCTcsNyw3LDYKKwl2b3IJMTcsMTksMTkKKwl2eG9yCTExLDEyLDE5CisJdnBlcm0JMTIsMTIsMTIsNgorCS5sb25nCTB4N0NFMDI3OTkKKwkubG9uZwkweDdEODMyNzk5CisJYWRkaQk0LDQsMHgyMAorCWJuZQkuTHh0c19lbmM2eF9zdGVhbAorCWIJLkx4dHNfZW5jNnhfZG9uZQorCisuYWxpZ24JNAorLkx4dHNfZW5jNnhfb25lOgorCXZ4b3IJNyw1LDE3CisJbm9wCQorLkxvb3BfeHRzX2VuYzF4OgorCS5sb25nCTB4MTBFN0M1MDgKKwlsdngJMjQsMjYsNworCWFkZGkJNyw3LDB4MjAKKworCS5sb25nCTB4MTBFN0NEMDgKKwlsdngJMjUsMyw3CisJYmRuegkuTG9vcF94dHNfZW5jMXgKKworCWFkZAkxMCwxMCwzMQorCWNtcHdpCTMxLDAKKwkubG9uZwkweDEwRTdDNTA4CisKKwlzdWJpCTEwLDEwLDE2CisJLmxvbmcJMHgxMEU3Q0QwOAorCisJbHZzcgk1LDAsMzEKKwkubG9uZwkweDEwRTdENTA4CisKKwkubG9uZwkweDdDMDA1Njk5CisJLmxvbmcJMHgxMEU3REQwOAorCisJYWRkaQk3LDEsNzkKKwkubG9uZwkweDEwRTdFNTA4CisJbHZ4CTI0LDAsNworCisJLmxvbmcJMHgxMEU3RUQwOAorCWx2eAkyNSwzLDcKKwl2eG9yCTE3LDE3LDMxCisKKwl2cGVybQkwLDAsMCw2CisJLmxvbmcJMHgxMEU3RjUwOAorCisJdnBlcm0JMCwwLDAsNQorCS5sb25nCTB4MTBFNzhEMDkKKworCXZvcgkxNywxOCwxOAorCXZ4b3IJMTEsNywxOAorCXZwZXJtCTcsNyw3LDYKKwkubG9uZwkweDdDRTAyNzk5CisJYWRkaQk0LDQsMHgxMAorCWJuZQkuTHh0c19lbmM2eF9zdGVhbAorCWIJLkx4dHNfZW5jNnhfZG9uZQorCisuYWxpZ24JNAorLkx4dHNfZW5jNnhfemVybzoKKwljbXB3aQkzMSwwCisJYmVxCS5MeHRzX2VuYzZ4X2RvbmUKKworCWFkZAkxMCwxMCwzMQorCXN1YmkJMTAsMTAsMTYKKwkubG9uZwkweDdDMDA1Njk5CisJbHZzcgk1LDAsMzEKKwl2cGVybQkwLDAsMCw2CisJdnBlcm0JMCwwLDAsNQorCXZ4b3IJMTEsMTEsMTcKKy5MeHRzX2VuYzZ4X3N0ZWFsOgorCXZ4b3IJMCwwLDE3CisJdnhvcgk3LDcsNworCXZzcGx0aXNiCTEyLC0xCisJdnBlcm0JNyw3LDEyLDUKKwl2c2VsCTcsMCwxMSw3CisKKwlzdWJpCTMwLDQsMTcKKwlzdWJpCTQsNCwxNgorCW10Y3RyCTMxCisuTG9vcF94dHNfZW5jNnhfc3RlYWw6CisJbGJ6dQkwLDEoMzApCisJc3RiCTAsMTYoMzApCisJYmRuegkuTG9vcF94dHNfZW5jNnhfc3RlYWwKKworCWxpCTMxLDAKKwltdGN0cgk5CisJYgkuTG9vcF94dHNfZW5jMXgKKworLmFsaWduCTQKKy5MeHRzX2VuYzZ4X2RvbmU6CisJY21wbGRpCTgsMAorCWJlcQkuTHh0c19lbmM2eF9yZXQKKworCXZ4b3IJOCwxNywyMworCXZwZXJtCTgsOCw4LDYKKwkubG9uZwkweDdEMDA0Nzk5CisKKy5MeHRzX2VuYzZ4X3JldDoKKwltdGxyCTExCisJbGkJMTAsNzkKKwlsaQkxMSw5NQorCXN0dngJOSwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJOSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJOSwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJOSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJOSwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJOSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJOSwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJOSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCisJb3IJMTIsMTIsMTIKKwlsdngJMjAsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjEsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjIsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjMsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjQsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjUsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjYsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjcsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMjgsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlsdngJMjksMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlsdngJMzAsMTAsMQorCWx2eAkzMSwxMSwxCisJbGQJMjYsNDAwKDEpCisJbGQJMjcsNDA4KDEpCisJbGQJMjgsNDE2KDEpCisJbGQJMjksNDI0KDEpCisJbGQJMzAsNDMyKDEpCisJbGQJMzEsNDQwKDEpCisJYWRkaQkxLDEsNDQ4CisJYmxyCQorLmxvbmcJMAorLmJ5dGUJMCwxMiwweDA0LDEsMHg4MCw2LDYsMAorLmxvbmcJMAorCisuYWxpZ24JNQorX2Flc3A4X3h0c19lbmM1eDoKKwkubG9uZwkweDEwRTdDNTA4CisJLmxvbmcJMHgxMThDQzUwOAorCS5sb25nCTB4MTFBREM1MDgKKwkubG9uZwkweDExQ0VDNTA4CisJLmxvbmcJMHgxMUVGQzUwOAorCWx2eAkyNCwyNiw3CisJYWRkaQk3LDcsMHgyMAorCisJLmxvbmcJMHgxMEU3Q0QwOAorCS5sb25nCTB4MTE4Q0NEMDgKKwkubG9uZwkweDExQURDRDA4CisJLmxvbmcJMHgxMUNFQ0QwOAorCS5sb25nCTB4MTFFRkNEMDgKKwlsdngJMjUsMyw3CisJYmRueglfYWVzcDhfeHRzX2VuYzV4CisKKwlhZGQJMTAsMTAsMzEKKwljbXB3aQkzMSwwCisJLmxvbmcJMHgxMEU3QzUwOAorCS5sb25nCTB4MTE4Q0M1MDgKKwkubG9uZwkweDExQURDNTA4CisJLmxvbmcJMHgxMUNFQzUwOAorCS5sb25nCTB4MTFFRkM1MDgKKworCXN1YmkJMTAsMTAsMTYKKwkubG9uZwkweDEwRTdDRDA4CisJLmxvbmcJMHgxMThDQ0QwOAorCS5sb25nCTB4MTFBRENEMDgKKwkubG9uZwkweDExQ0VDRDA4CisJLmxvbmcJMHgxMUVGQ0QwOAorCXZ4b3IJMTcsMTcsMzEKKworCS5sb25nCTB4MTBFN0Q1MDgKKwlsdnNyCTUsMCwzMQorCS5sb25nCTB4MTE4Q0Q1MDgKKwkubG9uZwkweDExQURENTA4CisJLmxvbmcJMHgxMUNFRDUwOAorCS5sb25nCTB4MTFFRkQ1MDgKKwl2eG9yCTEsMTgsMzEKKworCS5sb25nCTB4MTBFN0REMDgKKwkubG9uZwkweDdDMDA1Njk5CisJLmxvbmcJMHgxMThDREQwOAorCS5sb25nCTB4MTFBREREMDgKKwkubG9uZwkweDExQ0VERDA4CisJLmxvbmcJMHgxMUVGREQwOAorCXZ4b3IJMiwxOSwzMQorCisJYWRkaQk3LDEsNzkKKwkubG9uZwkweDEwRTdFNTA4CisJLmxvbmcJMHgxMThDRTUwOAorCS5sb25nCTB4MTFBREU1MDgKKwkubG9uZwkweDExQ0VFNTA4CisJLmxvbmcJMHgxMUVGRTUwOAorCWx2eAkyNCwwLDcKKwl2eG9yCTMsMjAsMzEKKworCS5sb25nCTB4MTBFN0VEMDgKKwl2cGVybQkwLDAsMCw2CisJLmxvbmcJMHgxMThDRUQwOAorCS5sb25nCTB4MTFBREVEMDgKKwkubG9uZwkweDExQ0VFRDA4CisJLmxvbmcJMHgxMUVGRUQwOAorCWx2eAkyNSwzLDcKKwl2eG9yCTQsMjEsMzEKKworCS5sb25nCTB4MTBFN0Y1MDgKKwl2cGVybQkwLDAsMCw1CisJLmxvbmcJMHgxMThDRjUwOAorCS5sb25nCTB4MTFBREY1MDgKKwkubG9uZwkweDExQ0VGNTA4CisJLmxvbmcJMHgxMUVGRjUwOAorCisJLmxvbmcJMHgxMEU3OEQwOQorCS5sb25nCTB4MTE4QzBEMDkKKwkubG9uZwkweDExQUQxNTA5CisJLmxvbmcJMHgxMUNFMUQwOQorCS5sb25nCTB4MTFFRjI1MDkKKwlibHIJCisubG9uZwkwCisuYnl0ZQkwLDEyLDB4MTQsMCwwLDAsMCwwCisKKy5hbGlnbgk1CitfYWVzcDhfeHRzX2RlY3J5cHQ2eDoKKwlzdGR1CTEsLTQ0OCgxKQorCW1mbHIJMTEKKwlsaQk3LDIwNworCWxpCTMsMjIzCisJc3RkCTExLDQ2NCgxKQorCXN0dngJMjAsNywxCisJYWRkaQk3LDcsMzIKKwlzdHZ4CTIxLDMsMQorCWFkZGkJMywzLDMyCisJc3R2eAkyMiw3LDEKKwlhZGRpCTcsNywzMgorCXN0dngJMjMsMywxCisJYWRkaQkzLDMsMzIKKwlzdHZ4CTI0LDcsMQorCWFkZGkJNyw3LDMyCisJc3R2eAkyNSwzLDEKKwlhZGRpCTMsMywzMgorCXN0dngJMjYsNywxCisJYWRkaQk3LDcsMzIKKwlzdHZ4CTI3LDMsMQorCWFkZGkJMywzLDMyCisJc3R2eAkyOCw3LDEKKwlhZGRpCTcsNywzMgorCXN0dngJMjksMywxCisJYWRkaQkzLDMsMzIKKwlzdHZ4CTMwLDcsMQorCXN0dngJMzEsMywxCisJbGkJMCwtMQorCXN0dwkxMiwzOTYoMSkKKwlsaQkzLDB4MTAKKwlzdGQJMjYsNDAwKDEpCisJbGkJMjYsMHgyMAorCXN0ZAkyNyw0MDgoMSkKKwlsaQkyNywweDMwCisJc3RkCTI4LDQxNigxKQorCWxpCTI4LDB4NDAKKwlzdGQJMjksNDI0KDEpCisJbGkJMjksMHg1MAorCXN0ZAkzMCw0MzIoMSkKKwlsaQkzMCwweDYwCisJc3RkCTMxLDQ0MCgxKQorCWxpCTMxLDB4NzAKKwlvcgkwLDAsMAorCisJc3ViaQk5LDksMworCisJbHZ4CTIzLDAsNgorCWx2eAkzMCwzLDYKKwlhZGRpCTYsNiwweDIwCisJbHZ4CTMxLDAsNgorCXZwZXJtCTIzLDMwLDIzLDcKKwlhZGRpCTcsMSw3OQorCW10Y3RyCTkKKworLkxvYWRfeHRzX2RlY19rZXk6CisJdnBlcm0JMjQsMzEsMzAsNworCWx2eAkzMCwzLDYKKwlhZGRpCTYsNiwweDIwCisJc3R2eAkyNCwwLDcKKwl2cGVybQkyNSwzMCwzMSw3CisJbHZ4CTMxLDAsNgorCXN0dngJMjUsMyw3CisJYWRkaQk3LDcsMHgyMAorCWJkbnoJLkxvYWRfeHRzX2RlY19rZXkKKworCWx2eAkyNiwzLDYKKwl2cGVybQkyNCwzMSwzMCw3CisJbHZ4CTI3LDI2LDYKKwlzdHZ4CTI0LDAsNworCXZwZXJtCTI1LDI2LDMxLDcKKwlsdngJMjgsMjcsNgorCXN0dngJMjUsMyw3CisJYWRkaQk3LDEsNzkKKwl2cGVybQkyNiwyNywyNiw3CisJbHZ4CTI5LDI4LDYKKwl2cGVybQkyNywyOCwyNyw3CisJbHZ4CTMwLDI5LDYKKwl2cGVybQkyOCwyOSwyOCw3CisJbHZ4CTMxLDMwLDYKKwl2cGVybQkyOSwzMCwyOSw3CisJbHZ4CTIyLDMxLDYKKwl2cGVybQkzMCwzMSwzMCw3CisJbHZ4CTI0LDAsNworCXZwZXJtCTMxLDIyLDMxLDcKKwlsdngJMjUsMyw3CisKKwl2cGVybQkwLDIsNCw1CisJc3ViaQkxMCwxMCwzMQorCXZ4b3IJMTcsOCwyMworCXZzcmFiCTExLDgsOQorCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwl2YW5kCTExLDExLDEwCisJdnhvcgk3LDAsMTcKKwl2eG9yCTgsOCwxMQorCisJLmxvbmcJMHg3QzIzNTY5OQorCXZ4b3IJMTgsOCwyMworCXZzcmFiCTExLDgsOQorCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwl2cGVybQkxLDEsMSw2CisJdmFuZAkxMSwxMSwxMAorCXZ4b3IJMTIsMSwxOAorCXZ4b3IJOCw4LDExCisKKwkubG9uZwkweDdDNUE1Njk5CisJYW5kaS4JMzEsNSwxNQorCXZ4b3IJMTksOCwyMworCXZzcmFiCTExLDgsOQorCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwl2cGVybQkyLDIsMiw2CisJdmFuZAkxMSwxMSwxMAorCXZ4b3IJMTMsMiwxOQorCXZ4b3IJOCw4LDExCisKKwkubG9uZwkweDdDN0I1Njk5CisJc3ViCTUsNSwzMQorCXZ4b3IJMjAsOCwyMworCXZzcmFiCTExLDgsOQorCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwl2cGVybQkzLDMsMyw2CisJdmFuZAkxMSwxMSwxMAorCXZ4b3IJMTQsMywyMAorCXZ4b3IJOCw4LDExCisKKwkubG9uZwkweDdDOUM1Njk5CisJc3ViaQk1LDUsMHg2MAorCXZ4b3IJMjEsOCwyMworCXZzcmFiCTExLDgsOQorCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwl2cGVybQk0LDQsNCw2CisJdmFuZAkxMSwxMSwxMAorCXZ4b3IJMTUsNCwyMQorCXZ4b3IJOCw4LDExCisKKwkubG9uZwkweDdDQkQ1Njk5CisJYWRkaQkxMCwxMCwweDYwCisJdnhvcgkyMiw4LDIzCisJdnNyYWIJMTEsOCw5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCXZwZXJtCTUsNSw1LDYKKwl2YW5kCTExLDExLDEwCisJdnhvcgkxNiw1LDIyCisJdnhvcgk4LDgsMTEKKworCXZ4b3IJMzEsMzEsMjMKKwltdGN0cgk5CisJYgkuTG9vcF94dHNfZGVjNngKKworLmFsaWduCTUKKy5Mb29wX3h0c19kZWM2eDoKKwkubG9uZwkweDEwRTdDNTQ4CisJLmxvbmcJMHgxMThDQzU0OAorCS5sb25nCTB4MTFBREM1NDgKKwkubG9uZwkweDExQ0VDNTQ4CisJLmxvbmcJMHgxMUVGQzU0OAorCS5sb25nCTB4MTIxMEM1NDgKKwlsdngJMjQsMjYsNworCWFkZGkJNyw3LDB4MjAKKworCS5sb25nCTB4MTBFN0NENDgKKwkubG9uZwkweDExOENDRDQ4CisJLmxvbmcJMHgxMUFEQ0Q0OAorCS5sb25nCTB4MTFDRUNENDgKKwkubG9uZwkweDExRUZDRDQ4CisJLmxvbmcJMHgxMjEwQ0Q0OAorCWx2eAkyNSwzLDcKKwliZG56CS5Mb29wX3h0c19kZWM2eAorCisJc3ViaWMJNSw1LDk2CisJdnhvcgkwLDE3LDMxCisJLmxvbmcJMHgxMEU3QzU0OAorCS5sb25nCTB4MTE4Q0M1NDgKKwl2c3JhYgkxMSw4LDkKKwl2eG9yCTE3LDgsMjMKKwl2YWRkdWJtCTgsOCw4CisJLmxvbmcJMHgxMUFEQzU0OAorCS5sb25nCTB4MTFDRUM1NDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwkubG9uZwkweDExRUZDNTQ4CisJLmxvbmcJMHgxMjEwQzU0OAorCisJc3ViZmUuCTAsMCwwCisJdmFuZAkxMSwxMSwxMAorCS5sb25nCTB4MTBFN0NENDgKKwkubG9uZwkweDExOENDRDQ4CisJdnhvcgk4LDgsMTEKKwkubG9uZwkweDExQURDRDQ4CisJLmxvbmcJMHgxMUNFQ0Q0OAorCXZ4b3IJMSwxOCwzMQorCXZzcmFiCTExLDgsOQorCXZ4b3IJMTgsOCwyMworCS5sb25nCTB4MTFFRkNENDgKKwkubG9uZwkweDEyMTBDRDQ4CisKKwlhbmQJMCwwLDUKKwl2YWRkdWJtCTgsOCw4CisJdnNsZG9pCTExLDExLDExLDE1CisJLmxvbmcJMHgxMEU3RDU0OAorCS5sb25nCTB4MTE4Q0Q1NDgKKwl2YW5kCTExLDExLDEwCisJLmxvbmcJMHgxMUFERDU0OAorCS5sb25nCTB4MTFDRUQ1NDgKKwl2eG9yCTgsOCwxMQorCS5sb25nCTB4MTFFRkQ1NDgKKwkubG9uZwkweDEyMTBENTQ4CisKKwlhZGQJMTAsMTAsMAorCisKKworCXZ4b3IJMiwxOSwzMQorCXZzcmFiCTExLDgsOQorCXZ4b3IJMTksOCwyMworCXZhZGR1Ym0JOCw4LDgKKwkubG9uZwkweDEwRTdERDQ4CisJLmxvbmcJMHgxMThDREQ0OAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCS5sb25nCTB4MTFBRERENDgKKwkubG9uZwkweDExQ0VERDQ4CisJdmFuZAkxMSwxMSwxMAorCS5sb25nCTB4MTFFRkRENDgKKwkubG9uZwkweDEyMTBERDQ4CisKKwlhZGRpCTcsMSw3OQorCXZ4b3IJOCw4LDExCisJLmxvbmcJMHgxMEU3RTU0OAorCS5sb25nCTB4MTE4Q0U1NDgKKwl2eG9yCTMsMjAsMzEKKwl2c3JhYgkxMSw4LDkKKwl2eG9yCTIwLDgsMjMKKwkubG9uZwkweDExQURFNTQ4CisJLmxvbmcJMHgxMUNFRTU0OAorCXZhZGR1Ym0JOCw4LDgKKwl2c2xkb2kJMTEsMTEsMTEsMTUKKwkubG9uZwkweDExRUZFNTQ4CisJLmxvbmcJMHgxMjEwRTU0OAorCWx2eAkyNCwwLDcKKwl2YW5kCTExLDExLDEwCisKKwkubG9uZwkweDEwRTdFRDQ4CisJLmxvbmcJMHgxMThDRUQ0OAorCXZ4b3IJOCw4LDExCisJLmxvbmcJMHgxMUFERUQ0OAorCS5sb25nCTB4MTFDRUVENDgKKwl2eG9yCTQsMjEsMzEKKwl2c3JhYgkxMSw4LDkKKwl2eG9yCTIxLDgsMjMKKwkubG9uZwkweDExRUZFRDQ4CisJLmxvbmcJMHgxMjEwRUQ0OAorCWx2eAkyNSwzLDcKKwl2YWRkdWJtCTgsOCw4CisJdnNsZG9pCTExLDExLDExLDE1CisKKwkubG9uZwkweDEwRTdGNTQ4CisJLmxvbmcJMHgxMThDRjU0OAorCXZhbmQJMTEsMTEsMTAKKwkubG9uZwkweDExQURGNTQ4CisJLmxvbmcJMHgxMUNFRjU0OAorCXZ4b3IJOCw4LDExCisJLmxvbmcJMHgxMUVGRjU0OAorCS5sb25nCTB4MTIxMEY1NDgKKwl2eG9yCTUsMjIsMzEKKwl2c3JhYgkxMSw4LDkKKwl2eG9yCTIyLDgsMjMKKworCS5sb25nCTB4MTBFNzA1NDkKKwkubG9uZwkweDdDMDA1Njk5CisJdmFkZHVibQk4LDgsOAorCXZzbGRvaQkxMSwxMSwxMSwxNQorCS5sb25nCTB4MTE4QzBENDkKKwkubG9uZwkweDdDMjM1Njk5CisJLmxvbmcJMHgxMUFEMTU0OQorCXZwZXJtCTAsMCwwLDYKKwkubG9uZwkweDdDNUE1Njk5CisJdmFuZAkxMSwxMSwxMAorCS5sb25nCTB4MTFDRTFENDkKKwl2cGVybQkxLDEsMSw2CisJLmxvbmcJMHg3QzdCNTY5OQorCS5sb25nCTB4MTFFRjI1NDkKKwl2cGVybQkyLDIsMiw2CisJLmxvbmcJMHg3QzlDNTY5OQorCXZ4b3IJOCw4LDExCisJLmxvbmcJMHgxMjEwMkQ0OQorCXZwZXJtCTMsMywzLDYKKwkubG9uZwkweDdDQkQ1Njk5CisJYWRkaQkxMCwxMCwweDYwCisJdnBlcm0JNCw0LDQsNgorCXZwZXJtCTUsNSw1LDYKKworCXZwZXJtCTcsNyw3LDYKKwl2cGVybQkxMiwxMiwxMiw2CisJLmxvbmcJMHg3Q0UwMjc5OQorCXZ4b3IJNywwLDE3CisJdnBlcm0JMTMsMTMsMTMsNgorCS5sb25nCTB4N0Q4MzI3OTkKKwl2eG9yCTEyLDEsMTgKKwl2cGVybQkxNCwxNCwxNCw2CisJLmxvbmcJMHg3REJBMjc5OQorCXZ4b3IJMTMsMiwxOQorCXZwZXJtCTE1LDE1LDE1LDYKKwkubG9uZwkweDdEREIyNzk5CisJdnhvcgkxNCwzLDIwCisJdnBlcm0JMTYsMTYsMTYsNgorCS5sb25nCTB4N0RGQzI3OTkKKwl2eG9yCTE1LDQsMjEKKwkubG9uZwkweDdFMUQyNzk5CisJdnhvcgkxNiw1LDIyCisJYWRkaQk0LDQsMHg2MAorCisJbXRjdHIJOQorCWJlcQkuTG9vcF94dHNfZGVjNngKKworCWFkZGljLgk1LDUsMHg2MAorCWJlcQkuTHh0c19kZWM2eF96ZXJvCisJY21wd2kJNSwweDIwCisJYmx0CS5MeHRzX2RlYzZ4X29uZQorCW5vcAkKKwliZXEJLkx4dHNfZGVjNnhfdHdvCisJY21wd2kJNSwweDQwCisJYmx0CS5MeHRzX2RlYzZ4X3RocmVlCisJbm9wCQorCWJlcQkuTHh0c19kZWM2eF9mb3VyCisKKy5MeHRzX2RlYzZ4X2ZpdmU6CisJdnhvcgk3LDEsMTcKKwl2eG9yCTEyLDIsMTgKKwl2eG9yCTEzLDMsMTkKKwl2eG9yCTE0LDQsMjAKKwl2eG9yCTE1LDUsMjEKKworCWJsCV9hZXNwOF94dHNfZGVjNXgKKworCXZwZXJtCTcsNyw3LDYKKwl2b3IJMTcsMjIsMjIKKwl2eG9yCTE4LDgsMjMKKwl2cGVybQkxMiwxMiwxMiw2CisJLmxvbmcJMHg3Q0UwMjc5OQorCXZ4b3IJNywwLDE4CisJdnBlcm0JMTMsMTMsMTMsNgorCS5sb25nCTB4N0Q4MzI3OTkKKwl2cGVybQkxNCwxNCwxNCw2CisJLmxvbmcJMHg3REJBMjc5OQorCXZwZXJtCTE1LDE1LDE1LDYKKwkubG9uZwkweDdEREIyNzk5CisJLmxvbmcJMHg3REZDMjc5OQorCWFkZGkJNCw0LDB4NTAKKwlibmUJLkx4dHNfZGVjNnhfc3RlYWwKKwliCS5MeHRzX2RlYzZ4X2RvbmUKKworLmFsaWduCTQKKy5MeHRzX2RlYzZ4X2ZvdXI6CisJdnhvcgk3LDIsMTcKKwl2eG9yCTEyLDMsMTgKKwl2eG9yCTEzLDQsMTkKKwl2eG9yCTE0LDUsMjAKKwl2eG9yCTE1LDE1LDE1CisKKwlibAlfYWVzcDhfeHRzX2RlYzV4CisKKwl2cGVybQk3LDcsNyw2CisJdm9yCTE3LDIxLDIxCisJdm9yCTE4LDIyLDIyCisJdnBlcm0JMTIsMTIsMTIsNgorCS5sb25nCTB4N0NFMDI3OTkKKwl2eG9yCTcsMCwyMgorCXZwZXJtCTEzLDEzLDEzLDYKKwkubG9uZwkweDdEODMyNzk5CisJdnBlcm0JMTQsMTQsMTQsNgorCS5sb25nCTB4N0RCQTI3OTkKKwkubG9uZwkweDdEREIyNzk5CisJYWRkaQk0LDQsMHg0MAorCWJuZQkuTHh0c19kZWM2eF9zdGVhbAorCWIJLkx4dHNfZGVjNnhfZG9uZQorCisuYWxpZ24JNAorLkx4dHNfZGVjNnhfdGhyZWU6CisJdnhvcgk3LDMsMTcKKwl2eG9yCTEyLDQsMTgKKwl2eG9yCTEzLDUsMTkKKwl2eG9yCTE0LDE0LDE0CisJdnhvcgkxNSwxNSwxNQorCisJYmwJX2Flc3A4X3h0c19kZWM1eAorCisJdnBlcm0JNyw3LDcsNgorCXZvcgkxNywyMCwyMAorCXZvcgkxOCwyMSwyMQorCXZwZXJtCTEyLDEyLDEyLDYKKwkubG9uZwkweDdDRTAyNzk5CisJdnhvcgk3LDAsMjEKKwl2cGVybQkxMywxMywxMyw2CisJLmxvbmcJMHg3RDgzMjc5OQorCS5sb25nCTB4N0RCQTI3OTkKKwlhZGRpCTQsNCwweDMwCisJYm5lCS5MeHRzX2RlYzZ4X3N0ZWFsCisJYgkuTHh0c19kZWM2eF9kb25lCisKKy5hbGlnbgk0CisuTHh0c19kZWM2eF90d286CisJdnhvcgk3LDQsMTcKKwl2eG9yCTEyLDUsMTgKKwl2eG9yCTEzLDEzLDEzCisJdnhvcgkxNCwxNCwxNAorCXZ4b3IJMTUsMTUsMTUKKworCWJsCV9hZXNwOF94dHNfZGVjNXgKKworCXZwZXJtCTcsNyw3LDYKKwl2b3IJMTcsMTksMTkKKwl2b3IJMTgsMjAsMjAKKwl2cGVybQkxMiwxMiwxMiw2CisJLmxvbmcJMHg3Q0UwMjc5OQorCXZ4b3IJNywwLDIwCisJLmxvbmcJMHg3RDgzMjc5OQorCWFkZGkJNCw0LDB4MjAKKwlibmUJLkx4dHNfZGVjNnhfc3RlYWwKKwliCS5MeHRzX2RlYzZ4X2RvbmUKKworLmFsaWduCTQKKy5MeHRzX2RlYzZ4X29uZToKKwl2eG9yCTcsNSwxNworCW5vcAkKKy5Mb29wX3h0c19kZWMxeDoKKwkubG9uZwkweDEwRTdDNTQ4CisJbHZ4CTI0LDI2LDcKKwlhZGRpCTcsNywweDIwCisKKwkubG9uZwkweDEwRTdDRDQ4CisJbHZ4CTI1LDMsNworCWJkbnoJLkxvb3BfeHRzX2RlYzF4CisKKwlzdWJpCTAsMzEsMQorCS5sb25nCTB4MTBFN0M1NDgKKworCWFuZGkuCTAsMCwxNgorCWNtcHdpCTMxLDAKKwkubG9uZwkweDEwRTdDRDQ4CisKKwlzdWIJMTAsMTAsMAorCS5sb25nCTB4MTBFN0Q1NDgKKworCS5sb25nCTB4N0MwMDU2OTkKKwkubG9uZwkweDEwRTdERDQ4CisKKwlhZGRpCTcsMSw3OQorCS5sb25nCTB4MTBFN0U1NDgKKwlsdngJMjQsMCw3CisKKwkubG9uZwkweDEwRTdFRDQ4CisJbHZ4CTI1LDMsNworCXZ4b3IJMTcsMTcsMzEKKworCXZwZXJtCTAsMCwwLDYKKwkubG9uZwkweDEwRTdGNTQ4CisKKwltdGN0cgk5CisJLmxvbmcJMHgxMEU3OEQ0OQorCisJdm9yCTE3LDE4LDE4CisJdm9yCTE4LDE5LDE5CisJdnBlcm0JNyw3LDcsNgorCS5sb25nCTB4N0NFMDI3OTkKKwlhZGRpCTQsNCwweDEwCisJdnhvcgk3LDAsMTkKKwlibmUJLkx4dHNfZGVjNnhfc3RlYWwKKwliCS5MeHRzX2RlYzZ4X2RvbmUKKworLmFsaWduCTQKKy5MeHRzX2RlYzZ4X3plcm86CisJY21wd2kJMzEsMAorCWJlcQkuTHh0c19kZWM2eF9kb25lCisKKwkubG9uZwkweDdDMDA1Njk5CisJdnBlcm0JMCwwLDAsNgorCXZ4b3IJNywwLDE4CisuTHh0c19kZWM2eF9zdGVhbDoKKwkubG9uZwkweDEwRTdDNTQ4CisJbHZ4CTI0LDI2LDcKKwlhZGRpCTcsNywweDIwCisKKwkubG9uZwkweDEwRTdDRDQ4CisJbHZ4CTI1LDMsNworCWJkbnoJLkx4dHNfZGVjNnhfc3RlYWwKKworCWFkZAkxMCwxMCwzMQorCS5sb25nCTB4MTBFN0M1NDgKKworCWNtcHdpCTMxLDAKKwkubG9uZwkweDEwRTdDRDQ4CisKKwkubG9uZwkweDdDMDA1Njk5CisJLmxvbmcJMHgxMEU3RDU0OAorCisJbHZzcgk1LDAsMzEKKwkubG9uZwkweDEwRTdERDQ4CisKKwlhZGRpCTcsMSw3OQorCS5sb25nCTB4MTBFN0U1NDgKKwlsdngJMjQsMCw3CisKKwkubG9uZwkweDEwRTdFRDQ4CisJbHZ4CTI1LDMsNworCXZ4b3IJMTgsMTgsMzEKKworCXZwZXJtCTAsMCwwLDYKKwkubG9uZwkweDEwRTdGNTQ4CisKKwl2cGVybQkwLDAsMCw1CisJLmxvbmcJMHgxMTY3OTU0OQorCisJdnBlcm0JNywxMSwxMSw2CisJLmxvbmcJMHg3Q0UwMjc5OQorCisKKwl2eG9yCTcsNyw3CisJdnNwbHRpc2IJMTIsLTEKKwl2cGVybQk3LDcsMTIsNQorCXZzZWwJNywwLDExLDcKKwl2eG9yCTcsNywxNworCisJc3ViaQkzMCw0LDEKKwltdGN0cgkzMQorLkxvb3BfeHRzX2RlYzZ4X3N0ZWFsOgorCWxienUJMCwxKDMwKQorCXN0YgkwLDE2KDMwKQorCWJkbnoJLkxvb3BfeHRzX2RlYzZ4X3N0ZWFsCisKKwlsaQkzMSwwCisJbXRjdHIJOQorCWIJLkxvb3BfeHRzX2RlYzF4CisKKy5hbGlnbgk0CisuTHh0c19kZWM2eF9kb25lOgorCWNtcGxkaQk4LDAKKwliZXEJLkx4dHNfZGVjNnhfcmV0CisKKwl2eG9yCTgsMTcsMjMKKwl2cGVybQk4LDgsOCw2CisJLmxvbmcJMHg3RDAwNDc5OQorCisuTHh0c19kZWM2eF9yZXQ6CisJbXRscgkxMQorCWxpCTEwLDc5CisJbGkJMTEsOTUKKwlzdHZ4CTksMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTksMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTksMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTksMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTksMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTksMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTksMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTksMTEsMQorCWFkZGkJMTEsMTEsMzIKKworCW9yCTEyLDEyLDEyCisJbHZ4CTIwLDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTIxLDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTIyLDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTIzLDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTI0LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTI1LDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTI2LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTI3LDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTI4LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTI5LDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTMwLDEwLDEKKwlsdngJMzEsMTEsMQorCWxkCTI2LDQwMCgxKQorCWxkCTI3LDQwOCgxKQorCWxkCTI4LDQxNigxKQorCWxkCTI5LDQyNCgxKQorCWxkCTMwLDQzMigxKQorCWxkCTMxLDQ0MCgxKQorCWFkZGkJMSwxLDQ0OAorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgwNCwxLDB4ODAsNiw2LDAKKy5sb25nCTAKKworLmFsaWduCTUKK19hZXNwOF94dHNfZGVjNXg6CisJLmxvbmcJMHgxMEU3QzU0OAorCS5sb25nCTB4MTE4Q0M1NDgKKwkubG9uZwkweDExQURDNTQ4CisJLmxvbmcJMHgxMUNFQzU0OAorCS5sb25nCTB4MTFFRkM1NDgKKwlsdngJMjQsMjYsNworCWFkZGkJNyw3LDB4MjAKKworCS5sb25nCTB4MTBFN0NENDgKKwkubG9uZwkweDExOENDRDQ4CisJLmxvbmcJMHgxMUFEQ0Q0OAorCS5sb25nCTB4MTFDRUNENDgKKwkubG9uZwkweDExRUZDRDQ4CisJbHZ4CTI1LDMsNworCWJkbnoJX2Flc3A4X3h0c19kZWM1eAorCisJc3ViaQkwLDMxLDEKKwkubG9uZwkweDEwRTdDNTQ4CisJLmxvbmcJMHgxMThDQzU0OAorCS5sb25nCTB4MTFBREM1NDgKKwkubG9uZwkweDExQ0VDNTQ4CisJLmxvbmcJMHgxMUVGQzU0OAorCisJYW5kaS4JMCwwLDE2CisJY21wd2kJMzEsMAorCS5sb25nCTB4MTBFN0NENDgKKwkubG9uZwkweDExOENDRDQ4CisJLmxvbmcJMHgxMUFEQ0Q0OAorCS5sb25nCTB4MTFDRUNENDgKKwkubG9uZwkweDExRUZDRDQ4CisJdnhvcgkxNywxNywzMQorCisJc3ViCTEwLDEwLDAKKwkubG9uZwkweDEwRTdENTQ4CisJLmxvbmcJMHgxMThDRDU0OAorCS5sb25nCTB4MTFBREQ1NDgKKwkubG9uZwkweDExQ0VENTQ4CisJLmxvbmcJMHgxMUVGRDU0OAorCXZ4b3IJMSwxOCwzMQorCisJLmxvbmcJMHgxMEU3REQ0OAorCS5sb25nCTB4N0MwMDU2OTkKKwkubG9uZwkweDExOENERDQ4CisJLmxvbmcJMHgxMUFEREQ0OAorCS5sb25nCTB4MTFDRURENDgKKwkubG9uZwkweDExRUZERDQ4CisJdnhvcgkyLDE5LDMxCisKKwlhZGRpCTcsMSw3OQorCS5sb25nCTB4MTBFN0U1NDgKKwkubG9uZwkweDExOENFNTQ4CisJLmxvbmcJMHgxMUFERTU0OAorCS5sb25nCTB4MTFDRUU1NDgKKwkubG9uZwkweDExRUZFNTQ4CisJbHZ4CTI0LDAsNworCXZ4b3IJMywyMCwzMQorCisJLmxvbmcJMHgxMEU3RUQ0OAorCXZwZXJtCTAsMCwwLDYKKwkubG9uZwkweDExOENFRDQ4CisJLmxvbmcJMHgxMUFERUQ0OAorCS5sb25nCTB4MTFDRUVENDgKKwkubG9uZwkweDExRUZFRDQ4CisJbHZ4CTI1LDMsNworCXZ4b3IJNCwyMSwzMQorCisJLmxvbmcJMHgxMEU3RjU0OAorCS5sb25nCTB4MTE4Q0Y1NDgKKwkubG9uZwkweDExQURGNTQ4CisJLmxvbmcJMHgxMUNFRjU0OAorCS5sb25nCTB4MTFFRkY1NDgKKworCS5sb25nCTB4MTBFNzhENDkKKwkubG9uZwkweDExOEMwRDQ5CisJLmxvbmcJMHgxMUFEMTU0OQorCS5sb25nCTB4MTFDRTFENDkKKwkubG9uZwkweDExRUYyNTQ5CisJbXRjdHIJOQorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgxNCwwLDAsMCwwLDAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtcHBjNjRsZS9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHA4LXBwYy5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC1wcGM2NGxlL2NyeXB0by9maXBzbW9kdWxlL2doYXNocDgtcHBjLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3YTJkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgtcHBjNjRsZS9jcnlwdG8vZmlwc21vZHVsZS9naGFzaHA4LXBwYy5TCkBAIC0wLDAgKzEsNTc1IEBACisubWFjaGluZQkiYW55IgorCisuYWJpdmVyc2lvbgkyCisudGV4dAorCisuZ2xvYmwJZ2NtX2luaXRfcDgKKy50eXBlCWdjbV9pbml0X3A4LEBmdW5jdGlvbgorLmFsaWduCTUKK2djbV9pbml0X3A4OgorLmxvY2FsZW50cnkJZ2NtX2luaXRfcDgsMAorCisJbGkJMCwtNDA5NgorCWxpCTgsMHgxMAorCWxpCTEyLC0xCisJbGkJOSwweDIwCisJb3IJMCwwLDAKKwlsaQkxMCwweDMwCisJLmxvbmcJMHg3RDIwMjY5OQorCisJdnNwbHRpc2IJOCwtMTYKKwl2c3BsdGlzYgk1LDEKKwl2YWRkdWJtCTgsOCw4CisJdnhvcgk0LDQsNAorCXZvcgk4LDgsNQorCXZzbGRvaQk4LDgsNCwxNQorCXZzbGRvaQk2LDQsNSwxCisJdmFkZHVibQk4LDgsOAorCXZzcGx0aXNiCTcsNworCXZvcgk4LDgsNgorCXZzcGx0Ygk2LDksMAorCXZzbAk5LDksNQorCXZzcmFiCTYsNiw3CisJdmFuZAk2LDYsOAorCXZ4b3IJMyw5LDYKKworCXZzbGRvaQk5LDMsMyw4CisJdnNsZG9pCTgsNCw4LDgKKwl2c2xkb2kJMTEsNCw5LDgKKwl2c2xkb2kJMTAsOSw0LDgKKworCS5sb25nCTB4N0QwMDFGOTkKKwkubG9uZwkweDdENjgxRjk5CisJbGkJOCwweDQwCisJLmxvbmcJMHg3RDI5MUY5OQorCWxpCTksMHg1MAorCS5sb25nCTB4N0Q0QTFGOTkKKwlsaQkxMCwweDYwCisKKwkubG9uZwkweDEwMDM1Q0M4CisJLmxvbmcJMHgxMDIzNENDOAorCS5sb25nCTB4MTA0MzU0QzgKKworCS5sb25nCTB4MTBFMDQ0QzgKKworCXZzbGRvaQk1LDEsNCw4CisJdnNsZG9pCTYsNCwxLDgKKwl2eG9yCTAsMCw1CisJdnhvcgkyLDIsNgorCisJdnNsZG9pCTAsMCwwLDgKKwl2eG9yCTAsMCw3CisKKwl2c2xkb2kJNiwwLDAsOAorCS5sb25nCTB4MTAwMDQ0QzgKKwl2eG9yCTYsNiwyCisJdnhvcgkxNiwwLDYKKworCXZzbGRvaQkxNywxNiwxNiw4CisJdnNsZG9pCTE5LDQsMTcsOAorCXZzbGRvaQkxOCwxNyw0LDgKKworCS5sb25nCTB4N0U2ODFGOTkKKwlsaQk4LDB4NzAKKwkubG9uZwkweDdFMjkxRjk5CisJbGkJOSwweDgwCisJLmxvbmcJMHg3RTRBMUY5OQorCWxpCTEwLDB4OTAKKwkubG9uZwkweDEwMDM5Q0M4CisJLmxvbmcJMHgxMUIwOUNDOAorCS5sb25nCTB4MTAyMzhDQzgKKwkubG9uZwkweDExRDA4Q0M4CisJLmxvbmcJMHgxMDQzOTRDOAorCS5sb25nCTB4MTFGMDk0QzgKKworCS5sb25nCTB4MTBFMDQ0QzgKKwkubG9uZwkweDExNEQ0NEM4CisKKwl2c2xkb2kJNSwxLDQsOAorCXZzbGRvaQk2LDQsMSw4CisJdnNsZG9pCTExLDE0LDQsOAorCXZzbGRvaQk5LDQsMTQsOAorCXZ4b3IJMCwwLDUKKwl2eG9yCTIsMiw2CisJdnhvcgkxMywxMywxMQorCXZ4b3IJMTUsMTUsOQorCisJdnNsZG9pCTAsMCwwLDgKKwl2c2xkb2kJMTMsMTMsMTMsOAorCXZ4b3IJMCwwLDcKKwl2eG9yCTEzLDEzLDEwCisKKwl2c2xkb2kJNiwwLDAsOAorCXZzbGRvaQk5LDEzLDEzLDgKKwkubG9uZwkweDEwMDA0NEM4CisJLmxvbmcJMHgxMUFENDRDOAorCXZ4b3IJNiw2LDIKKwl2eG9yCTksOSwxNQorCXZ4b3IJMCwwLDYKKwl2eG9yCTEzLDEzLDkKKworCXZzbGRvaQk5LDAsMCw4CisJdnNsZG9pCTE3LDEzLDEzLDgKKwl2c2xkb2kJMTEsNCw5LDgKKwl2c2xkb2kJMTAsOSw0LDgKKwl2c2xkb2kJMTksNCwxNyw4CisJdnNsZG9pCTE4LDE3LDQsOAorCisJLmxvbmcJMHg3RDY4MUY5OQorCWxpCTgsMHhhMAorCS5sb25nCTB4N0QyOTFGOTkKKwlsaQk5LDB4YjAKKwkubG9uZwkweDdENEExRjk5CisJbGkJMTAsMHhjMAorCS5sb25nCTB4N0U2ODFGOTkKKwkubG9uZwkweDdFMjkxRjk5CisJLmxvbmcJMHg3RTRBMUY5OQorCisJb3IJMTIsMTIsMTIKKwlibHIJCisubG9uZwkwCisuYnl0ZQkwLDEyLDB4MTQsMCwwLDAsMiwwCisubG9uZwkwCisuc2l6ZQlnY21faW5pdF9wOCwuLWdjbV9pbml0X3A4CisuZ2xvYmwJZ2NtX2dtdWx0X3A4CisudHlwZQlnY21fZ211bHRfcDgsQGZ1bmN0aW9uCisuYWxpZ24JNQorZ2NtX2dtdWx0X3A4OgorLmxvY2FsZW50cnkJZ2NtX2dtdWx0X3A4LDAKKworCWxpcwkwLDB4ZmZmOAorCWxpCTgsMHgxMAorCWxpCTEyLC0xCisJbGkJOSwweDIwCisJb3IJMCwwLDAKKwlsaQkxMCwweDMwCisJLmxvbmcJMHg3QzYwMUU5OQorCisJLmxvbmcJMHg3RDY4MjY5OQorCWx2c2wJMTIsMCwwCisJLmxvbmcJMHg3RDI5MjY5OQorCXZzcGx0aXNiCTUsMHgwNworCS5sb25nCTB4N0Q0QTI2OTkKKwl2eG9yCTEyLDEyLDUKKwkubG9uZwkweDdEMDAyNjk5CisJdnBlcm0JMywzLDMsMTIKKwl2eG9yCTQsNCw0CisKKwkubG9uZwkweDEwMDM1Q0M4CisJLmxvbmcJMHgxMDIzNENDOAorCS5sb25nCTB4MTA0MzU0QzgKKworCS5sb25nCTB4MTBFMDQ0QzgKKworCXZzbGRvaQk1LDEsNCw4CisJdnNsZG9pCTYsNCwxLDgKKwl2eG9yCTAsMCw1CisJdnhvcgkyLDIsNgorCisJdnNsZG9pCTAsMCwwLDgKKwl2eG9yCTAsMCw3CisKKwl2c2xkb2kJNiwwLDAsOAorCS5sb25nCTB4MTAwMDQ0QzgKKwl2eG9yCTYsNiwyCisJdnhvcgkwLDAsNgorCisJdnBlcm0JMCwwLDAsMTIKKwkubG9uZwkweDdDMDAxRjk5CisKKwlvcgkxMiwxMiwxMgorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgxNCwwLDAsMCwyLDAKKy5sb25nCTAKKy5zaXplCWdjbV9nbXVsdF9wOCwuLWdjbV9nbXVsdF9wOAorCisuZ2xvYmwJZ2NtX2doYXNoX3A4CisudHlwZQlnY21fZ2hhc2hfcDgsQGZ1bmN0aW9uCisuYWxpZ24JNQorZ2NtX2doYXNoX3A4OgorLmxvY2FsZW50cnkJZ2NtX2doYXNoX3A4LDAKKworCWxpCTAsLTQwOTYKKwlsaQk4LDB4MTAKKwlsaQkxMiwtMQorCWxpCTksMHgyMAorCW9yCTAsMCwwCisJbGkJMTAsMHgzMAorCS5sb25nCTB4N0MwMDFFOTkKKworCS5sb25nCTB4N0Q2ODI2OTkKKwlsaQk4LDB4NDAKKwlsdnNsCTEyLDAsMAorCS5sb25nCTB4N0QyOTI2OTkKKwlsaQk5LDB4NTAKKwl2c3BsdGlzYgk1LDB4MDcKKwkubG9uZwkweDdENEEyNjk5CisJbGkJMTAsMHg2MAorCXZ4b3IJMTIsMTIsNQorCS5sb25nCTB4N0QwMDI2OTkKKwl2cGVybQkwLDAsMCwxMgorCXZ4b3IJNCw0LDQKKworCWNtcGxkaQk2LDY0CisJYmdlCS5MZ2NtX2doYXNoX3A4XzR4CisKKwkubG9uZwkweDdDNjAyRTk5CisJYWRkaQk1LDUsMTYKKwlzdWJpYy4JNiw2LDE2CisJdnBlcm0JMywzLDMsMTIKKwl2eG9yCTMsMywwCisJYmVxCS5Mc2hvcnQKKworCS5sb25nCTB4N0U2ODI2OTkKKwlsaQk4LDE2CisJLmxvbmcJMHg3RTI5MjY5OQorCWFkZAk5LDUsNgorCS5sb25nCTB4N0U0QTI2OTkKKworCisuYWxpZ24JNQorLkxvb3BfMng6CisJLmxvbmcJMHg3RTAwMkU5OQorCXZwZXJtCTE2LDE2LDE2LDEyCisKKwlzdWJpYwk2LDYsMzIKKwkubG9uZwkweDEwMDM5Q0M4CisJLmxvbmcJMHgxMUIwNUNDOAorCXN1YmZlCTAsMCwwCisJLmxvbmcJMHgxMDIzOENDOAorCS5sb25nCTB4MTFEMDRDQzgKKwlhbmQJMCwwLDYKKwkubG9uZwkweDEwNDM5NEM4CisJLmxvbmcJMHgxMUYwNTRDOAorCWFkZAk1LDUsMAorCisJdnhvcgkwLDAsMTMKKwl2eG9yCTEsMSwxNAorCisJLmxvbmcJMHgxMEUwNDRDOAorCisJdnNsZG9pCTUsMSw0LDgKKwl2c2xkb2kJNiw0LDEsOAorCXZ4b3IJMiwyLDE1CisJdnhvcgkwLDAsNQorCXZ4b3IJMiwyLDYKKworCXZzbGRvaQkwLDAsMCw4CisJdnhvcgkwLDAsNworCS5sb25nCTB4N0M2ODJFOTkKKwlhZGRpCTUsNSwzMgorCisJdnNsZG9pCTYsMCwwLDgKKwkubG9uZwkweDEwMDA0NEM4CisJdnBlcm0JMywzLDMsMTIKKwl2eG9yCTYsNiwyCisJdnhvcgkzLDMsNgorCXZ4b3IJMywzLDAKKwljbXBsZAk5LDUKKwliZ3QJLkxvb3BfMngKKworCWNtcGx3aQk2LDAKKwlibmUJLkxldmVuCisKKy5Mc2hvcnQ6CisJLmxvbmcJMHgxMDAzNUNDOAorCS5sb25nCTB4MTAyMzRDQzgKKwkubG9uZwkweDEwNDM1NEM4CisKKwkubG9uZwkweDEwRTA0NEM4CisKKwl2c2xkb2kJNSwxLDQsOAorCXZzbGRvaQk2LDQsMSw4CisJdnhvcgkwLDAsNQorCXZ4b3IJMiwyLDYKKworCXZzbGRvaQkwLDAsMCw4CisJdnhvcgkwLDAsNworCisJdnNsZG9pCTYsMCwwLDgKKwkubG9uZwkweDEwMDA0NEM4CisJdnhvcgk2LDYsMgorCisuTGV2ZW46CisJdnhvcgkwLDAsNgorCXZwZXJtCTAsMCwwLDEyCisJLmxvbmcJMHg3QzAwMUY5OQorCisJb3IJMTIsMTIsMTIKKwlibHIJCisubG9uZwkwCisuYnl0ZQkwLDEyLDB4MTQsMCwwLDAsNCwwCisubG9uZwkwCisuYWxpZ24JNQorLmdjbV9naGFzaF9wOF80eDoKKy5MZ2NtX2doYXNoX3A4XzR4OgorCXN0ZHUJMSwtMjU2KDEpCisJbGkJMTAsNjMKKwlsaQkxMSw3OQorCXN0dngJMjAsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTIxLDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAkyMiwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJMjMsMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTI0LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJc3R2eAkyNSwxMSwxCisJYWRkaQkxMSwxMSwzMgorCXN0dngJMjYsMTAsMQorCWFkZGkJMTAsMTAsMzIKKwlzdHZ4CTI3LDExLDEKKwlhZGRpCTExLDExLDMyCisJc3R2eAkyOCwxMCwxCisJYWRkaQkxMCwxMCwzMgorCXN0dngJMjksMTEsMQorCWFkZGkJMTEsMTEsMzIKKwlzdHZ4CTMwLDEwLDEKKwlsaQkxMCwweDYwCisJc3R2eAkzMSwxMSwxCisJbGkJMCwtMQorCXN0dwkxMiwyNTIoMSkKKwlvcgkwLDAsMAorCisJbHZzbAk1LDAsOAorCisJbGkJOCwweDcwCisJLmxvbmcJMHg3RTI5MjY5OQorCWxpCTksMHg4MAorCXZzcGx0aXNiCTYsOAorCisJbGkJMTAsMHg5MAorCS5sb25nCTB4N0VFODI2OTkKKwlsaQk4LDB4YTAKKwkubG9uZwkweDdGMDkyNjk5CisJbGkJOSwweGIwCisJLmxvbmcJMHg3RjJBMjY5OQorCWxpCTEwLDB4YzAKKwkubG9uZwkweDdGQTgyNjk5CisJbGkJOCwweDEwCisJLmxvbmcJMHg3RkM5MjY5OQorCWxpCTksMHgyMAorCS5sb25nCTB4N0ZFQTI2OTkKKwlsaQkxMCwweDMwCisKKwl2c2xkb2kJNyw0LDYsOAorCXZhZGR1Ym0JMTgsNSw3CisJdmFkZHVibQkxOSw2LDE4CisKKwlzcmRpCTYsNiw0CisKKwkubG9uZwkweDdDNjAyRTk5CisJLmxvbmcJMHg3RTA4MkU5OQorCXN1YmljLgk2LDYsOAorCS5sb25nCTB4N0VDOTJFOTkKKwkubG9uZwkweDdGOEEyRTk5CisJYWRkaQk1LDUsMHg0MAorCXZwZXJtCTMsMywzLDEyCisJdnBlcm0JMTYsMTYsMTYsMTIKKwl2cGVybQkyMiwyMiwyMiwxMgorCXZwZXJtCTI4LDI4LDI4LDEyCisKKwl2eG9yCTIsMywwCisKKwkubG9uZwkweDExQjBCQ0M4CisJLmxvbmcJMHgxMUQwQzRDOAorCS5sb25nCTB4MTFGMENDQzgKKworCXZwZXJtCTExLDE3LDksMTgKKwl2cGVybQk1LDIyLDI4LDE5CisJdnBlcm0JMTAsMTcsOSwxOQorCXZwZXJtCTYsMjIsMjgsMTgKKwkubG9uZwkweDEyQjY4Q0M4CisJLmxvbmcJMHgxMjg1NUNDOAorCS5sb25nCTB4MTM3QzRDQzgKKwkubG9uZwkweDEzNDY1NEM4CisKKwl2eG9yCTIxLDIxLDE0CisJdnhvcgkyMCwyMCwxMworCXZ4b3IJMjcsMjcsMjEKKwl2eG9yCTI2LDI2LDE1CisKKwlibHQJLkx0YWlsXzR4CisKKy5Mb29wXzR4OgorCS5sb25nCTB4N0M2MDJFOTkKKwkubG9uZwkweDdFMDgyRTk5CisJc3ViaWMuCTYsNiw0CisJLmxvbmcJMHg3RUM5MkU5OQorCS5sb25nCTB4N0Y4QTJFOTkKKwlhZGRpCTUsNSwweDQwCisJdnBlcm0JMTYsMTYsMTYsMTIKKwl2cGVybQkyMiwyMiwyMiwxMgorCXZwZXJtCTI4LDI4LDI4LDEyCisJdnBlcm0JMywzLDMsMTIKKworCS5sb25nCTB4MTAwMkVDQzgKKwkubG9uZwkweDEwMjJGNEM4CisJLmxvbmcJMHgxMDQyRkNDOAorCS5sb25nCTB4MTFCMEJDQzgKKwkubG9uZwkweDExRDBDNEM4CisJLmxvbmcJMHgxMUYwQ0NDOAorCisJdnhvcgkwLDAsMjAKKwl2eG9yCTEsMSwyNworCXZ4b3IJMiwyLDI2CisJdnBlcm0JNSwyMiwyOCwxOQorCXZwZXJtCTYsMjIsMjgsMTgKKworCS5sb25nCTB4MTBFMDQ0QzgKKwkubG9uZwkweDEyODU1Q0M4CisJLmxvbmcJMHgxMzQ2NTRDOAorCisJdnNsZG9pCTUsMSw0LDgKKwl2c2xkb2kJNiw0LDEsOAorCXZ4b3IJMCwwLDUKKwl2eG9yCTIsMiw2CisKKwl2c2xkb2kJMCwwLDAsOAorCXZ4b3IJMCwwLDcKKworCXZzbGRvaQk2LDAsMCw4CisJLmxvbmcJMHgxMkI2OENDOAorCS5sb25nCTB4MTM3QzRDQzgKKwkubG9uZwkweDEwMDA0NEM4CisKKwl2eG9yCTIwLDIwLDEzCisJdnhvcgkyNiwyNiwxNQorCXZ4b3IJMiwyLDMKKwl2eG9yCTIxLDIxLDE0CisJdnhvcgkyLDIsNgorCXZ4b3IJMjcsMjcsMjEKKwl2eG9yCTIsMiwwCisJYmdlCS5Mb29wXzR4CisKKy5MdGFpbF80eDoKKwkubG9uZwkweDEwMDJFQ0M4CisJLmxvbmcJMHgxMDIyRjRDOAorCS5sb25nCTB4MTA0MkZDQzgKKworCXZ4b3IJMCwwLDIwCisJdnhvcgkxLDEsMjcKKworCS5sb25nCTB4MTBFMDQ0QzgKKworCXZzbGRvaQk1LDEsNCw4CisJdnNsZG9pCTYsNCwxLDgKKwl2eG9yCTIsMiwyNgorCXZ4b3IJMCwwLDUKKwl2eG9yCTIsMiw2CisKKwl2c2xkb2kJMCwwLDAsOAorCXZ4b3IJMCwwLDcKKworCXZzbGRvaQk2LDAsMCw4CisJLmxvbmcJMHgxMDAwNDRDOAorCXZ4b3IJNiw2LDIKKwl2eG9yCTAsMCw2CisKKwlhZGRpYy4JNiw2LDQKKwliZXEJLkxkb25lXzR4CisKKwkubG9uZwkweDdDNjAyRTk5CisJY21wbGRpCTYsMgorCWxpCTYsLTQKKwlibHQJLkxvbmUKKwkubG9uZwkweDdFMDgyRTk5CisJYmVxCS5MdHdvCisKKy5MdGhyZWU6CisJLmxvbmcJMHg3RUM5MkU5OQorCXZwZXJtCTMsMywzLDEyCisJdnBlcm0JMTYsMTYsMTYsMTIKKwl2cGVybQkyMiwyMiwyMiwxMgorCisJdnhvcgkyLDMsMAorCXZvcgkyOSwyMywyMworCXZvcgkzMCwgMjQsIDI0CisJdm9yCTMxLDI1LDI1CisKKwl2cGVybQk1LDE2LDIyLDE5CisJdnBlcm0JNiwxNiwyMiwxOAorCS5sb25nCTB4MTJCMDhDQzgKKwkubG9uZwkweDEzNzY0Q0M4CisJLmxvbmcJMHgxMjg1NUNDOAorCS5sb25nCTB4MTM0NjU0QzgKKworCXZ4b3IJMjcsMjcsMjEKKwliCS5MdGFpbF80eAorCisuYWxpZ24JNAorLkx0d286CisJdnBlcm0JMywzLDMsMTIKKwl2cGVybQkxNiwxNiwxNiwxMgorCisJdnhvcgkyLDMsMAorCXZwZXJtCTUsNCwxNiwxOQorCXZwZXJtCTYsNCwxNiwxOAorCisJdnNsZG9pCTI5LDQsMTcsOAorCXZvcgkzMCwgMTcsIDE3CisJdnNsZG9pCTMxLDE3LDQsOAorCisJLmxvbmcJMHgxMjg1NUNDOAorCS5sb25nCTB4MTM3MDRDQzgKKwkubG9uZwkweDEzNDY1NEM4CisKKwliCS5MdGFpbF80eAorCisuYWxpZ24JNAorLkxvbmU6CisJdnBlcm0JMywzLDMsMTIKKworCXZzbGRvaQkyOSw0LDksOAorCXZvcgkzMCwgOSwgOQorCXZzbGRvaQkzMSw5LDQsOAorCisJdnhvcgkyLDMsMAorCXZ4b3IJMjAsMjAsMjAKKwl2eG9yCTI3LDI3LDI3CisJdnhvcgkyNiwyNiwyNgorCisJYgkuTHRhaWxfNHgKKworLkxkb25lXzR4OgorCXZwZXJtCTAsMCwwLDEyCisJLmxvbmcJMHg3QzAwMUY5OQorCisJbGkJMTAsNjMKKwlsaQkxMSw3OQorCW9yCTEyLDEyLDEyCisJbHZ4CTIwLDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTIxLDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTIyLDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTIzLDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTI0LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTI1LDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTI2LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTI3LDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTI4LDEwLDEKKwlhZGRpCTEwLDEwLDMyCisJbHZ4CTI5LDExLDEKKwlhZGRpCTExLDExLDMyCisJbHZ4CTMwLDEwLDEKKwlsdngJMzEsMTEsMQorCWFkZGkJMSwxLDI1NgorCWJscgkKKy5sb25nCTAKKy5ieXRlCTAsMTIsMHgwNCwwLDB4ODAsMCw0LDAKKy5sb25nCTAKKy5zaXplCWdjbV9naGFzaF9wOCwuLWdjbV9naGFzaF9wOAorCisuYnl0ZQk3MSw3Miw2NSw4Myw3MiwzMiwxMDIsMTExLDExNCwzMiw4MCwxMTEsMTE5LDEwMSwxMTQsNzMsODMsNjUsMzIsNTAsNDYsNDgsNTUsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTIKKy5hbGlnbgkyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODYuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9jaGFjaGEvY2hhY2hhLXg4Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTA4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODYuUwpAQCAtMCwwICsxLDk2OCBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCUNoYUNoYTIwX2N0cjMyCisuaGlkZGVuCUNoYUNoYTIwX2N0cjMyCisudHlwZQlDaGFDaGEyMF9jdHIzMixAZnVuY3Rpb24KKy5hbGlnbgkxNgorQ2hhQ2hhMjBfY3RyMzI6CisuTF9DaGFDaGEyMF9jdHIzMl9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJeG9ybAklZWF4LCVlYXgKKwljbXBsCTI4KCVlc3ApLCVlYXgKKwlqZQkuTDAwMG5vX2RhdGEKKwljYWxsCS5McGljX3BvaW50CisuTHBpY19wb2ludDoKKwlwb3BsCSVlYXgKKwlsZWFsCU9QRU5TU0xfaWEzMmNhcF9QLS5McGljX3BvaW50KCVlYXgpLCVlYnAKKwl0ZXN0bAkkMTY3NzcyMTYsKCVlYnApCisJanoJLkwwMDF4ODYKKwl0ZXN0bAkkNTEyLDQoJWVicCkKKwlqegkuTDAwMXg4NgorCWptcAkuTHNzc2UzX3Nob3J0Y3V0CisuTDAwMXg4NjoKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwltb3ZsCTM2KCVlc3ApLCVlZGkKKwlzdWJsCSQxMzIsJWVzcAorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisJbW92bAklZWF4LDgwKCVlc3ApCisJbW92bAklZWJ4LDg0KCVlc3ApCisJbW92bAklZWN4LDg4KCVlc3ApCisJbW92bAklZWR4LDkyKCVlc3ApCisJbW92bAkxNiglZXNpKSwlZWF4CisJbW92bAkyMCglZXNpKSwlZWJ4CisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAkyOCglZXNpKSwlZWR4CisJbW92bAklZWF4LDk2KCVlc3ApCisJbW92bAklZWJ4LDEwMCglZXNwKQorCW1vdmwJJWVjeCwxMDQoJWVzcCkKKwltb3ZsCSVlZHgsMTA4KCVlc3ApCisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJNCglZWRpKSwlZWJ4CisJbW92bAk4KCVlZGkpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlzdWJsCSQxLCVlYXgKKwltb3ZsCSVlYXgsMTEyKCVlc3ApCisJbW92bAklZWJ4LDExNiglZXNwKQorCW1vdmwJJWVjeCwxMjAoJWVzcCkKKwltb3ZsCSVlZHgsMTI0KCVlc3ApCisJam1wCS5MMDAyZW50cnkKKy5hbGlnbgkxNgorLkwwMDNvdXRlcl9sb29wOgorCW1vdmwJJWVieCwxNTYoJWVzcCkKKwltb3ZsCSVlYXgsMTUyKCVlc3ApCisJbW92bAklZWN4LDE2MCglZXNwKQorLkwwMDJlbnRyeToKKwltb3ZsCSQxNjM0NzYwODA1LCVlYXgKKwltb3ZsCSQ4NTc3NjA4NzgsNCglZXNwKQorCW1vdmwJJDIwMzY0NzcyMzQsOCglZXNwKQorCW1vdmwJJDE3OTcyODUyMzYsMTIoJWVzcCkKKwltb3ZsCTg0KCVlc3ApLCVlYngKKwltb3ZsCTg4KCVlc3ApLCVlYnAKKwltb3ZsCTEwNCglZXNwKSwlZWN4CisJbW92bAkxMDgoJWVzcCksJWVzaQorCW1vdmwJMTE2KCVlc3ApLCVlZHgKKwltb3ZsCTEyMCglZXNwKSwlZWRpCisJbW92bAklZWJ4LDIwKCVlc3ApCisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAklZWN4LDQwKCVlc3ApCisJbW92bAklZXNpLDQ0KCVlc3ApCisJbW92bAklZWR4LDUyKCVlc3ApCisJbW92bAklZWRpLDU2KCVlc3ApCisJbW92bAk5MiglZXNwKSwlZWJ4CisJbW92bAkxMjQoJWVzcCksJWVkaQorCW1vdmwJMTEyKCVlc3ApLCVlZHgKKwltb3ZsCTgwKCVlc3ApLCVlYnAKKwltb3ZsCTk2KCVlc3ApLCVlY3gKKwltb3ZsCTEwMCglZXNwKSwlZXNpCisJYWRkbAkkMSwlZWR4CisJbW92bAklZWJ4LDI4KCVlc3ApCisJbW92bAklZWRpLDYwKCVlc3ApCisJbW92bAklZWR4LDExMiglZXNwKQorCW1vdmwJJDEwLCVlYngKKwlqbXAJLkwwMDRsb29wCisuYWxpZ24JMTYKKy5MMDA0bG9vcDoKKwlhZGRsCSVlYnAsJWVheAorCW1vdmwJJWVieCwxMjgoJWVzcCkKKwltb3ZsCSVlYnAsJWVieAorCXhvcmwJJWVheCwlZWR4CisJcm9sbAkkMTYsJWVkeAorCWFkZGwJJWVkeCwlZWN4CisJeG9ybAklZWN4LCVlYngKKwltb3ZsCTUyKCVlc3ApLCVlZGkKKwlyb2xsCSQxMiwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJJWVheCwoJWVzcCkKKwlyb2xsCSQ4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFkZGwJJWVkeCwlZWN4CisJbW92bAklZWR4LDQ4KCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvbGwJJDcsJWVieAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWN4LDMyKCVlc3ApCisJcm9sbAkkMTYsJWVkaQorCW1vdmwJJWVieCwxNiglZXNwKQorCWFkZGwJJWVkaSwlZXNpCisJbW92bAk0MCglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwltb3ZsCTU2KCVlc3ApLCVlZHgKKwlyb2xsCSQxMiwlZWJwCisJbW92bAkyNCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVheCw0KCVlc3ApCisJcm9sbAkkOCwlZWRpCisJbW92bAk4KCVlc3ApLCVlYXgKKwlhZGRsCSVlZGksJWVzaQorCW1vdmwJJWVkaSw1MiglZXNwKQorCXhvcmwJJWVzaSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwlyb2xsCSQ3LCVlYnAKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJJWVzaSwzNiglZXNwKQorCXJvbGwJJDE2LCVlZHgKKwltb3ZsCSVlYnAsMjAoJWVzcCkKKwlhZGRsCSVlZHgsJWVjeAorCW1vdmwJNDQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJbW92bAk2MCglZXNwKSwlZWRpCisJcm9sbAkkMTIsJWVieAorCW1vdmwJMjgoJWVzcCksJWVicAorCWFkZGwJJWVieCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCSVlYXgsOCglZXNwKQorCXJvbGwJJDgsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVheAorCWFkZGwJJWVkeCwlZWN4CisJbW92bAklZWR4LDU2KCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvbGwJJDcsJWVieAorCXhvcmwJJWVheCwlZWRpCisJcm9sbAkkMTYsJWVkaQorCW1vdmwJJWVieCwyNCglZXNwKQorCWFkZGwJJWVkaSwlZXNpCisJeG9ybAklZXNpLCVlYnAKKwlyb2xsCSQxMiwlZWJwCisJbW92bAkyMCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVheCwxMiglZXNwKQorCXJvbGwJJDgsJWVkaQorCW1vdmwJKCVlc3ApLCVlYXgKKwlhZGRsCSVlZGksJWVzaQorCW1vdmwJJWVkaSwlZWR4CisJeG9ybAklZXNpLCVlYnAKKwlhZGRsCSVlYngsJWVheAorCXJvbGwJJDcsJWVicAorCXhvcmwJJWVheCwlZWR4CisJcm9sbAkkMTYsJWVkeAorCW1vdmwJJWVicCwyOCglZXNwKQorCWFkZGwJJWVkeCwlZWN4CisJeG9ybAklZWN4LCVlYngKKwltb3ZsCTQ4KCVlc3ApLCVlZGkKKwlyb2xsCSQxMiwlZWJ4CisJbW92bAkyNCglZXNwKSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJJWVheCwoJWVzcCkKKwlyb2xsCSQ4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFkZGwJJWVkeCwlZWN4CisJbW92bAklZWR4LDYwKCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvbGwJJDcsJWVieAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWN4LDQwKCVlc3ApCisJcm9sbAkkMTYsJWVkaQorCW1vdmwJJWVieCwyMCglZXNwKQorCWFkZGwJJWVkaSwlZXNpCisJbW92bAkzMiglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwltb3ZsCTUyKCVlc3ApLCVlZHgKKwlyb2xsCSQxMiwlZWJwCisJbW92bAkyOCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVheCw0KCVlc3ApCisJcm9sbAkkOCwlZWRpCisJbW92bAk4KCVlc3ApLCVlYXgKKwlhZGRsCSVlZGksJWVzaQorCW1vdmwJJWVkaSw0OCglZXNwKQorCXhvcmwJJWVzaSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwlyb2xsCSQ3LCVlYnAKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJJWVzaSw0NCglZXNwKQorCXJvbGwJJDE2LCVlZHgKKwltb3ZsCSVlYnAsMjQoJWVzcCkKKwlhZGRsCSVlZHgsJWVjeAorCW1vdmwJMzYoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJbW92bAk1NiglZXNwKSwlZWRpCisJcm9sbAkkMTIsJWVieAorCW1vdmwJMTYoJWVzcCksJWVicAorCWFkZGwJJWVieCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCSVlYXgsOCglZXNwKQorCXJvbGwJJDgsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVheAorCWFkZGwJJWVkeCwlZWN4CisJbW92bAklZWR4LDUyKCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvbGwJJDcsJWVieAorCXhvcmwJJWVheCwlZWRpCisJcm9sbAkkMTYsJWVkaQorCW1vdmwJJWVieCwyOCglZXNwKQorCWFkZGwJJWVkaSwlZXNpCisJeG9ybAklZXNpLCVlYnAKKwltb3ZsCTQ4KCVlc3ApLCVlZHgKKwlyb2xsCSQxMiwlZWJwCisJbW92bAkxMjgoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlYXgsMTIoJWVzcCkKKwlyb2xsCSQ4LCVlZGkKKwltb3ZsCSglZXNwKSwlZWF4CisJYWRkbAklZWRpLCVlc2kKKwltb3ZsCSVlZGksNTYoJWVzcCkKKwl4b3JsCSVlc2ksJWVicAorCXJvbGwJJDcsJWVicAorCWRlY2wJJWVieAorCWpuegkuTDAwNGxvb3AKKwltb3ZsCTE2MCglZXNwKSwlZWJ4CisJYWRkbAkkMTYzNDc2MDgwNSwlZWF4CisJYWRkbAk4MCglZXNwKSwlZWJwCisJYWRkbAk5NiglZXNwKSwlZWN4CisJYWRkbAkxMDAoJWVzcCksJWVzaQorCWNtcGwJJDY0LCVlYngKKwlqYgkuTDAwNXRhaWwKKwltb3ZsCTE1NiglZXNwKSwlZWJ4CisJYWRkbAkxMTIoJWVzcCksJWVkeAorCWFkZGwJMTIwKCVlc3ApLCVlZGkKKwl4b3JsCSglZWJ4KSwlZWF4CisJeG9ybAkxNiglZWJ4KSwlZWJwCisJbW92bAklZWF4LCglZXNwKQorCW1vdmwJMTUyKCVlc3ApLCVlYXgKKwl4b3JsCTMyKCVlYngpLCVlY3gKKwl4b3JsCTM2KCVlYngpLCVlc2kKKwl4b3JsCTQ4KCVlYngpLCVlZHgKKwl4b3JsCTU2KCVlYngpLCVlZGkKKwltb3ZsCSVlYnAsMTYoJWVheCkKKwltb3ZsCSVlY3gsMzIoJWVheCkKKwltb3ZsCSVlc2ksMzYoJWVheCkKKwltb3ZsCSVlZHgsNDgoJWVheCkKKwltb3ZsCSVlZGksNTYoJWVheCkKKwltb3ZsCTQoJWVzcCksJWVicAorCW1vdmwJOCglZXNwKSwlZWN4CisJbW92bAkxMiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJYWRkbAkkODU3NzYwODc4LCVlYnAKKwlhZGRsCSQyMDM2NDc3MjM0LCVlY3gKKwlhZGRsCSQxNzk3Mjg1MjM2LCVlc2kKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwlhZGRsCTg4KCVlc3ApLCVlZGkKKwl4b3JsCTQoJWVieCksJWVicAorCXhvcmwJOCglZWJ4KSwlZWN4CisJeG9ybAkxMiglZWJ4KSwlZXNpCisJeG9ybAkyMCglZWJ4KSwlZWR4CisJeG9ybAkyNCglZWJ4KSwlZWRpCisJbW92bAklZWJwLDQoJWVheCkKKwltb3ZsCSVlY3gsOCglZWF4KQorCW1vdmwJJWVzaSwxMiglZWF4KQorCW1vdmwJJWVkeCwyMCglZWF4KQorCW1vdmwJJWVkaSwyNCglZWF4KQorCW1vdmwJMjgoJWVzcCksJWVicAorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJNDQoJWVzcCksJWVzaQorCW1vdmwJNTIoJWVzcCksJWVkeAorCW1vdmwJNjAoJWVzcCksJWVkaQorCWFkZGwJOTIoJWVzcCksJWVicAorCWFkZGwJMTA0KCVlc3ApLCVlY3gKKwlhZGRsCTEwOCglZXNwKSwlZXNpCisJYWRkbAkxMTYoJWVzcCksJWVkeAorCWFkZGwJMTI0KCVlc3ApLCVlZGkKKwl4b3JsCTI4KCVlYngpLCVlYnAKKwl4b3JsCTQwKCVlYngpLCVlY3gKKwl4b3JsCTQ0KCVlYngpLCVlc2kKKwl4b3JsCTUyKCVlYngpLCVlZHgKKwl4b3JsCTYwKCVlYngpLCVlZGkKKwlsZWFsCTY0KCVlYngpLCVlYngKKwltb3ZsCSVlYnAsMjgoJWVheCkKKwltb3ZsCSglZXNwKSwlZWJwCisJbW92bAklZWN4LDQwKCVlYXgpCisJbW92bAkxNjAoJWVzcCksJWVjeAorCW1vdmwJJWVzaSw0NCglZWF4KQorCW1vdmwJJWVkeCw1MiglZWF4KQorCW1vdmwJJWVkaSw2MCglZWF4KQorCW1vdmwJJWVicCwoJWVheCkKKwlsZWFsCTY0KCVlYXgpLCVlYXgKKwlzdWJsCSQ2NCwlZWN4CisJam56CS5MMDAzb3V0ZXJfbG9vcAorCWptcAkuTDAwNmRvbmUKKy5MMDA1dGFpbDoKKwlhZGRsCTExMiglZXNwKSwlZWR4CisJYWRkbAkxMjAoJWVzcCksJWVkaQorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYnAsMTYoJWVzcCkKKwltb3ZsCSVlY3gsMzIoJWVzcCkKKwltb3ZsCSVlc2ksMzYoJWVzcCkKKwltb3ZsCSVlZHgsNDgoJWVzcCkKKwltb3ZsCSVlZGksNTYoJWVzcCkKKwltb3ZsCTQoJWVzcCksJWVicAorCW1vdmwJOCglZXNwKSwlZWN4CisJbW92bAkxMiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJYWRkbAkkODU3NzYwODc4LCVlYnAKKwlhZGRsCSQyMDM2NDc3MjM0LCVlY3gKKwlhZGRsCSQxNzk3Mjg1MjM2LCVlc2kKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwlhZGRsCTg4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYnAsNCglZXNwKQorCW1vdmwJJWVjeCw4KCVlc3ApCisJbW92bAklZXNpLDEyKCVlc3ApCisJbW92bAklZWR4LDIwKCVlc3ApCisJbW92bAklZWRpLDI0KCVlc3ApCisJbW92bAkyOCglZXNwKSwlZWJwCisJbW92bAk0MCglZXNwKSwlZWN4CisJbW92bAk0NCglZXNwKSwlZXNpCisJbW92bAk1MiglZXNwKSwlZWR4CisJbW92bAk2MCglZXNwKSwlZWRpCisJYWRkbAk5MiglZXNwKSwlZWJwCisJYWRkbAkxMDQoJWVzcCksJWVjeAorCWFkZGwJMTA4KCVlc3ApLCVlc2kKKwlhZGRsCTExNiglZXNwKSwlZWR4CisJYWRkbAkxMjQoJWVzcCksJWVkaQorCW1vdmwJJWVicCwyOCglZXNwKQorCW1vdmwJMTU2KCVlc3ApLCVlYnAKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwltb3ZsCTE1MiglZXNwKSwlZWN4CisJbW92bAklZXNpLDQ0KCVlc3ApCisJeG9ybAklZXNpLCVlc2kKKwltb3ZsCSVlZHgsNTIoJWVzcCkKKwltb3ZsCSVlZGksNjAoJWVzcCkKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVkeCwlZWR4CisuTDAwN3RhaWxfbG9vcDoKKwltb3ZiCSglZXNpLCVlYnAsMSksJWFsCisJbW92YgkoJWVzcCwlZXNpLDEpLCVkbAorCWxlYWwJMSglZXNpKSwlZXNpCisJeG9yYgklZGwsJWFsCisJbW92YgklYWwsLTEoJWVjeCwlZXNpLDEpCisJZGVjbAklZWJ4CisJam56CS5MMDA3dGFpbF9sb29wCisuTDAwNmRvbmU6CisJYWRkbAkkMTMyLCVlc3AKKy5MMDAwbm9fZGF0YToKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCUNoYUNoYTIwX2N0cjMyLC4tLkxfQ2hhQ2hhMjBfY3RyMzJfYmVnaW4KKy5nbG9ibAlDaGFDaGEyMF9zc3NlMworLmhpZGRlbglDaGFDaGEyMF9zc3NlMworLnR5cGUJQ2hhQ2hhMjBfc3NzZTMsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK0NoYUNoYTIwX3Nzc2UzOgorLkxfQ2hhQ2hhMjBfc3NzZTNfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorLkxzc3NlM19zaG9ydGN1dDoKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlY3gKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDUyNCwlZXNwCisJYW5kbAkkLTY0LCVlc3AKKwltb3ZsCSVlYnAsNTEyKCVlc3ApCisJbGVhbAkuTHNzc2UzX2RhdGEtLkxwaWNfcG9pbnQoJWVheCksJWVheAorCW1vdmRxdQkoJWVieCksJXhtbTMKKwljbXBsCSQyNTYsJWVjeAorCWpiCS5MMDA4MXgKKwltb3ZsCSVlZHgsNTE2KCVlc3ApCisJbW92bAklZWJ4LDUyMCglZXNwKQorCXN1YmwJJDI1NiwlZWN4CisJbGVhbAkzODQoJWVzcCksJWVicAorCW1vdmRxdQkoJWVkeCksJXhtbTcKKwlwc2h1ZmQJJDAsJXhtbTMsJXhtbTAKKwlwc2h1ZmQJJDg1LCV4bW0zLCV4bW0xCisJcHNodWZkCSQxNzAsJXhtbTMsJXhtbTIKKwlwc2h1ZmQJJDI1NSwleG1tMywleG1tMworCXBhZGRkCTQ4KCVlYXgpLCV4bW0wCisJcHNodWZkCSQwLCV4bW03LCV4bW00CisJcHNodWZkCSQ4NSwleG1tNywleG1tNQorCXBzdWJkCTY0KCVlYXgpLCV4bW0wCisJcHNodWZkCSQxNzAsJXhtbTcsJXhtbTYKKwlwc2h1ZmQJJDI1NSwleG1tNywleG1tNworCW1vdmRxYQkleG1tMCw2NCglZWJwKQorCW1vdmRxYQkleG1tMSw4MCglZWJwKQorCW1vdmRxYQkleG1tMiw5NiglZWJwKQorCW1vdmRxYQkleG1tMywxMTIoJWVicCkKKwltb3ZkcXUJMTYoJWVkeCksJXhtbTMKKwltb3ZkcWEJJXhtbTQsLTY0KCVlYnApCisJbW92ZHFhCSV4bW01LC00OCglZWJwKQorCW1vdmRxYQkleG1tNiwtMzIoJWVicCkKKwltb3ZkcWEJJXhtbTcsLTE2KCVlYnApCisJbW92ZHFhCTMyKCVlYXgpLCV4bW03CisJbGVhbAkxMjgoJWVzcCksJWVieAorCXBzaHVmZAkkMCwleG1tMywleG1tMAorCXBzaHVmZAkkODUsJXhtbTMsJXhtbTEKKwlwc2h1ZmQJJDE3MCwleG1tMywleG1tMgorCXBzaHVmZAkkMjU1LCV4bW0zLCV4bW0zCisJcHNodWZkCSQwLCV4bW03LCV4bW00CisJcHNodWZkCSQ4NSwleG1tNywleG1tNQorCXBzaHVmZAkkMTcwLCV4bW03LCV4bW02CisJcHNodWZkCSQyNTUsJXhtbTcsJXhtbTcKKwltb3ZkcWEJJXhtbTAsKCVlYnApCisJbW92ZHFhCSV4bW0xLDE2KCVlYnApCisJbW92ZHFhCSV4bW0yLDMyKCVlYnApCisJbW92ZHFhCSV4bW0zLDQ4KCVlYnApCisJbW92ZHFhCSV4bW00LC0xMjgoJWVicCkKKwltb3ZkcWEJJXhtbTUsLTExMiglZWJwKQorCW1vdmRxYQkleG1tNiwtOTYoJWVicCkKKwltb3ZkcWEJJXhtbTcsLTgwKCVlYnApCisJbGVhbAkxMjgoJWVzaSksJWVzaQorCWxlYWwJMTI4KCVlZGkpLCVlZGkKKwlqbXAJLkwwMDlvdXRlcl9sb29wCisuYWxpZ24JMTYKKy5MMDA5b3V0ZXJfbG9vcDoKKwltb3ZkcWEJLTExMiglZWJwKSwleG1tMQorCW1vdmRxYQktOTYoJWVicCksJXhtbTIKKwltb3ZkcWEJLTgwKCVlYnApLCV4bW0zCisJbW92ZHFhCS00OCglZWJwKSwleG1tNQorCW1vdmRxYQktMzIoJWVicCksJXhtbTYKKwltb3ZkcWEJLTE2KCVlYnApLCV4bW03CisJbW92ZHFhCSV4bW0xLC0xMTIoJWVieCkKKwltb3ZkcWEJJXhtbTIsLTk2KCVlYngpCisJbW92ZHFhCSV4bW0zLC04MCglZWJ4KQorCW1vdmRxYQkleG1tNSwtNDgoJWVieCkKKwltb3ZkcWEJJXhtbTYsLTMyKCVlYngpCisJbW92ZHFhCSV4bW03LC0xNiglZWJ4KQorCW1vdmRxYQkzMiglZWJwKSwleG1tMgorCW1vdmRxYQk0OCglZWJwKSwleG1tMworCW1vdmRxYQk2NCglZWJwKSwleG1tNAorCW1vdmRxYQk4MCglZWJwKSwleG1tNQorCW1vdmRxYQk5NiglZWJwKSwleG1tNgorCW1vdmRxYQkxMTIoJWVicCksJXhtbTcKKwlwYWRkZAk2NCglZWF4KSwleG1tNAorCW1vdmRxYQkleG1tMiwzMiglZWJ4KQorCW1vdmRxYQkleG1tMyw0OCglZWJ4KQorCW1vdmRxYQkleG1tNCw2NCglZWJ4KQorCW1vdmRxYQkleG1tNSw4MCglZWJ4KQorCW1vdmRxYQkleG1tNiw5NiglZWJ4KQorCW1vdmRxYQkleG1tNywxMTIoJWVieCkKKwltb3ZkcWEJJXhtbTQsNjQoJWVicCkKKwltb3ZkcWEJLTEyOCglZWJwKSwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tNgorCW1vdmRxYQktNjQoJWVicCksJXhtbTMKKwltb3ZkcWEJKCVlYnApLCV4bW00CisJbW92ZHFhCTE2KCVlYnApLCV4bW01CisJbW92bAkkMTAsJWVkeAorCW5vcAorLmFsaWduCTE2CisuTDAxMGxvb3A6CisJcGFkZGQJJXhtbTMsJXhtbTAKKwltb3ZkcWEJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW02CisJcHNodWZiCSglZWF4KSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW00CisJcHhvcgkleG1tNCwleG1tMgorCW1vdmRxYQktNDgoJWVieCksJXhtbTMKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwlwc2xsZAkkMTIsJXhtbTIKKwlwc3JsZAkkMjAsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTIKKwltb3ZkcWEJLTExMiglZWJ4KSwleG1tMQorCXBhZGRkCSV4bW0yLCV4bW0wCisJbW92ZHFhCTgwKCVlYngpLCV4bW03CisJcHhvcgkleG1tMCwleG1tNgorCW1vdmRxYQkleG1tMCwtMTI4KCVlYngpCisJcHNodWZiCTE2KCVlYXgpLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTYsNjQoJWVieCkKKwlweG9yCSV4bW00LCV4bW0yCisJcGFkZGQJJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwlwc2xsZAkkNywleG1tMgorCXBzcmxkCSQyNSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTcKKwlwb3IJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTQsKCVlYngpCisJcHNodWZiCSglZWF4KSwleG1tNworCW1vdmRxYQkleG1tMiwtNjQoJWVieCkKKwlwYWRkZAkleG1tNywleG1tNQorCW1vdmRxYQkzMiglZWJ4KSwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTMKKwltb3ZkcWEJLTMyKCVlYngpLCV4bW0yCisJbW92ZHFhCSV4bW0zLCV4bW0wCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW0wCisJcG9yCSV4bW0wLCV4bW0zCisJbW92ZHFhCS05NiglZWJ4KSwleG1tMAorCXBhZGRkCSV4bW0zLCV4bW0xCisJbW92ZHFhCTk2KCVlYngpLCV4bW02CisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tMSwtMTEyKCVlYngpCisJcHNodWZiCTE2KCVlYXgpLCV4bW03CisJcGFkZGQJJXhtbTcsJXhtbTUKKwltb3ZkcWEJJXhtbTcsODAoJWVieCkKKwlweG9yCSV4bW01LCV4bW0zCisJcGFkZGQJJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTMsJXhtbTEKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTYKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcWEJJXhtbTUsMTYoJWVieCkKKwlwc2h1ZmIJKCVlYXgpLCV4bW02CisJbW92ZHFhCSV4bW0zLC00OCglZWJ4KQorCXBhZGRkCSV4bW02LCV4bW00CisJbW92ZHFhCTQ4KCVlYngpLCV4bW01CisJcHhvcgkleG1tNCwleG1tMgorCW1vdmRxYQktMTYoJWVieCksJXhtbTMKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwlwc2xsZAkkMTIsJXhtbTIKKwlwc3JsZAkkMjAsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTIKKwltb3ZkcWEJLTgwKCVlYngpLCV4bW0xCisJcGFkZGQJJXhtbTIsJXhtbTAKKwltb3ZkcWEJMTEyKCVlYngpLCV4bW03CisJcHhvcgkleG1tMCwleG1tNgorCW1vdmRxYQkleG1tMCwtOTYoJWVieCkKKwlwc2h1ZmIJMTYoJWVheCksJXhtbTYKKwlwYWRkZAkleG1tNiwleG1tNAorCW1vdmRxYQkleG1tNiw5NiglZWJ4KQorCXB4b3IJJXhtbTQsJXhtbTIKKwlwYWRkZAkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMiwleG1tMAorCXBzbGxkCSQ3LCV4bW0yCisJcHNybGQJJDI1LCV4bW0wCisJcHhvcgkleG1tMSwleG1tNworCXBvcgkleG1tMCwleG1tMgorCXBzaHVmYgkoJWVheCksJXhtbTcKKwltb3ZkcWEJJXhtbTIsLTMyKCVlYngpCisJcGFkZGQJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW01LCV4bW0zCisJbW92ZHFhCS00OCglZWJ4KSwleG1tMgorCW1vdmRxYQkleG1tMywleG1tMAorCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tMAorCXBvcgkleG1tMCwleG1tMworCW1vdmRxYQktMTI4KCVlYngpLCV4bW0wCisJcGFkZGQJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW03CisJbW92ZHFhCSV4bW0xLC04MCglZWJ4KQorCXBzaHVmYgkxNiglZWF4KSwleG1tNworCXBhZGRkCSV4bW03LCV4bW01CisJbW92ZHFhCSV4bW03LCV4bW02CisJcHhvcgkleG1tNSwleG1tMworCXBhZGRkCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW0zLCV4bW0xCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW02CisJcG9yCSV4bW0xLCV4bW0zCisJcHNodWZiCSglZWF4KSwleG1tNgorCW1vdmRxYQkleG1tMywtMTYoJWVieCkKKwlwYWRkZAkleG1tNiwleG1tNAorCXB4b3IJJXhtbTQsJXhtbTIKKwltb3ZkcWEJLTMyKCVlYngpLCV4bW0zCisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcHNsbGQJJDEyLCV4bW0yCisJcHNybGQJJDIwLCV4bW0xCisJcG9yCSV4bW0xLCV4bW0yCisJbW92ZHFhCS0xMTIoJWVieCksJXhtbTEKKwlwYWRkZAkleG1tMiwleG1tMAorCW1vdmRxYQk2NCglZWJ4KSwleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTAsLTEyOCglZWJ4KQorCXBzaHVmYgkxNiglZWF4KSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW00CisJbW92ZHFhCSV4bW02LDExMiglZWJ4KQorCXB4b3IJJXhtbTQsJXhtbTIKKwlwYWRkZAkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMiwleG1tMAorCXBzbGxkCSQ3LCV4bW0yCisJcHNybGQJJDI1LCV4bW0wCisJcHhvcgkleG1tMSwleG1tNworCXBvcgkleG1tMCwleG1tMgorCW1vdmRxYQkleG1tNCwzMiglZWJ4KQorCXBzaHVmYgkoJWVheCksJXhtbTcKKwltb3ZkcWEJJXhtbTIsLTQ4KCVlYngpCisJcGFkZGQJJXhtbTcsJXhtbTUKKwltb3ZkcWEJKCVlYngpLCV4bW00CisJcHhvcgkleG1tNSwleG1tMworCW1vdmRxYQktMTYoJWVieCksJXhtbTIKKwltb3ZkcWEJJXhtbTMsJXhtbTAKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTAKKwlwb3IJJXhtbTAsJXhtbTMKKwltb3ZkcWEJLTk2KCVlYngpLCV4bW0wCisJcGFkZGQJJXhtbTMsJXhtbTEKKwltb3ZkcWEJODAoJWVieCksJXhtbTYKKwlweG9yCSV4bW0xLCV4bW03CisJbW92ZHFhCSV4bW0xLC0xMTIoJWVieCkKKwlwc2h1ZmIJMTYoJWVheCksJXhtbTcKKwlwYWRkZAkleG1tNywleG1tNQorCW1vdmRxYQkleG1tNyw2NCglZWJ4KQorCXB4b3IJJXhtbTUsJXhtbTMKKwlwYWRkZAkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tMywleG1tMQorCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxYQkleG1tNSw0OCglZWJ4KQorCXBzaHVmYgkoJWVheCksJXhtbTYKKwltb3ZkcWEJJXhtbTMsLTMyKCVlYngpCisJcGFkZGQJJXhtbTYsJXhtbTQKKwltb3ZkcWEJMTYoJWVieCksJXhtbTUKKwlweG9yCSV4bW00LCV4bW0yCisJbW92ZHFhCS02NCglZWJ4KSwleG1tMworCW1vdmRxYQkleG1tMiwleG1tMQorCXBzbGxkCSQxMiwleG1tMgorCXBzcmxkCSQyMCwleG1tMQorCXBvcgkleG1tMSwleG1tMgorCW1vdmRxYQktODAoJWVieCksJXhtbTEKKwlwYWRkZAkleG1tMiwleG1tMAorCW1vdmRxYQk5NiglZWJ4KSwleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTAsLTk2KCVlYngpCisJcHNodWZiCTE2KCVlYXgpLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTYsODAoJWVieCkKKwlweG9yCSV4bW00LCV4bW0yCisJcGFkZGQJJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwlwc2xsZAkkNywleG1tMgorCXBzcmxkCSQyNSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTcKKwlwb3IJJXhtbTAsJXhtbTIKKwlwc2h1ZmIJKCVlYXgpLCV4bW03CisJbW92ZHFhCSV4bW0yLC0xNiglZWJ4KQorCXBhZGRkCSV4bW03LCV4bW01CisJcHhvcgkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMywleG1tMAorCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tMAorCXBvcgkleG1tMCwleG1tMworCW1vdmRxYQktMTI4KCVlYngpLCV4bW0wCisJcGFkZGQJJXhtbTMsJXhtbTEKKwltb3ZkcWEJNjQoJWVieCksJXhtbTYKKwlweG9yCSV4bW0xLCV4bW03CisJbW92ZHFhCSV4bW0xLC04MCglZWJ4KQorCXBzaHVmYgkxNiglZWF4KSwleG1tNworCXBhZGRkCSV4bW03LCV4bW01CisJbW92ZHFhCSV4bW03LDk2KCVlYngpCisJcHhvcgkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMywleG1tMQorCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW0xCisJcG9yCSV4bW0xLCV4bW0zCisJZGVjbAklZWR4CisJam56CS5MMDEwbG9vcAorCW1vdmRxYQkleG1tMywtNjQoJWVieCkKKwltb3ZkcWEJJXhtbTQsKCVlYngpCisJbW92ZHFhCSV4bW01LDE2KCVlYngpCisJbW92ZHFhCSV4bW02LDY0KCVlYngpCisJbW92ZHFhCSV4bW03LDk2KCVlYngpCisJbW92ZHFhCS0xMTIoJWVieCksJXhtbTEKKwltb3ZkcWEJLTk2KCVlYngpLCV4bW0yCisJbW92ZHFhCS04MCglZWJ4KSwleG1tMworCXBhZGRkCS0xMjgoJWVicCksJXhtbTAKKwlwYWRkZAktMTEyKCVlYnApLCV4bW0xCisJcGFkZGQJLTk2KCVlYnApLCV4bW0yCisJcGFkZGQJLTgwKCVlYnApLCV4bW0zCisJbW92ZHFhCSV4bW0wLCV4bW02CisJcHVucGNrbGRxCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0yLCV4bW03CisJcHVucGNrbGRxCSV4bW0zLCV4bW0yCisJcHVucGNraGRxCSV4bW0xLCV4bW02CisJcHVucGNraGRxCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHVucGNrbHFkcQkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tMworCXB1bnBja2xxZHEJJXhtbTcsJXhtbTYKKwlwdW5wY2tocWRxCSV4bW0yLCV4bW0xCisJcHVucGNraHFkcQkleG1tNywleG1tMworCW1vdmRxdQktMTI4KCVlc2kpLCV4bW00CisJbW92ZHF1CS02NCglZXNpKSwleG1tNQorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTcKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHFhCS02NCglZWJ4KSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTUKKwltb3ZkcWEJLTQ4KCVlYngpLCV4bW0xCisJcHhvcgkleG1tMiwleG1tNgorCW1vdmRxYQktMzIoJWVieCksJXhtbTIKKwlweG9yCSV4bW0zLCV4bW03CisJbW92ZHFhCS0xNiglZWJ4KSwleG1tMworCW1vdmRxdQkleG1tNCwtMTI4KCVlZGkpCisJbW92ZHF1CSV4bW01LC02NCglZWRpKQorCW1vdmRxdQkleG1tNiwoJWVkaSkKKwltb3ZkcXUJJXhtbTcsNjQoJWVkaSkKKwlsZWFsCTE2KCVlZGkpLCVlZGkKKwlwYWRkZAktNjQoJWVicCksJXhtbTAKKwlwYWRkZAktNDgoJWVicCksJXhtbTEKKwlwYWRkZAktMzIoJWVicCksJXhtbTIKKwlwYWRkZAktMTYoJWVicCksJXhtbTMKKwltb3ZkcWEJJXhtbTAsJXhtbTYKKwlwdW5wY2tsZHEJJXhtbTEsJXhtbTAKKwltb3ZkcWEJJXhtbTIsJXhtbTcKKwlwdW5wY2tsZHEJJXhtbTMsJXhtbTIKKwlwdW5wY2toZHEJJXhtbTEsJXhtbTYKKwlwdW5wY2toZHEJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHVucGNrbHFkcQkleG1tNywleG1tNgorCXB1bnBja2hxZHEJJXhtbTIsJXhtbTEKKwlwdW5wY2tocWRxCSV4bW03LCV4bW0zCisJbW92ZHF1CS0xMjgoJWVzaSksJXhtbTQKKwltb3ZkcXUJLTY0KCVlc2kpLCV4bW01CisJbW92ZHF1CSglZXNpKSwleG1tMgorCW1vdmRxdQk2NCglZXNpKSwleG1tNworCWxlYWwJMTYoJWVzaSksJWVzaQorCXB4b3IJJXhtbTAsJXhtbTQKKwltb3ZkcWEJKCVlYngpLCV4bW0wCisJcHhvcgkleG1tMSwleG1tNQorCW1vdmRxYQkxNiglZWJ4KSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTYKKwltb3ZkcWEJMzIoJWVieCksJXhtbTIKKwlweG9yCSV4bW0zLCV4bW03CisJbW92ZHFhCTQ4KCVlYngpLCV4bW0zCisJbW92ZHF1CSV4bW00LC0xMjgoJWVkaSkKKwltb3ZkcXUJJXhtbTUsLTY0KCVlZGkpCisJbW92ZHF1CSV4bW02LCglZWRpKQorCW1vdmRxdQkleG1tNyw2NCglZWRpKQorCWxlYWwJMTYoJWVkaSksJWVkaQorCXBhZGRkCSglZWJwKSwleG1tMAorCXBhZGRkCTE2KCVlYnApLCV4bW0xCisJcGFkZGQJMzIoJWVicCksJXhtbTIKKwlwYWRkZAk0OCglZWJwKSwleG1tMworCW1vdmRxYQkleG1tMCwleG1tNgorCXB1bnBja2xkcQkleG1tMSwleG1tMAorCW1vdmRxYQkleG1tMiwleG1tNworCXB1bnBja2xkcQkleG1tMywleG1tMgorCXB1bnBja2hkcQkleG1tMSwleG1tNgorCXB1bnBja2hkcQkleG1tMywleG1tNworCW1vdmRxYQkleG1tMCwleG1tMQorCXB1bnBja2xxZHEJJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwdW5wY2tscWRxCSV4bW03LCV4bW02CisJcHVucGNraHFkcQkleG1tMiwleG1tMQorCXB1bnBja2hxZHEJJXhtbTcsJXhtbTMKKwltb3ZkcXUJLTEyOCglZXNpKSwleG1tNAorCW1vdmRxdQktNjQoJWVzaSksJXhtbTUKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92ZHF1CTY0KCVlc2kpLCV4bW03CisJbGVhbAkxNiglZXNpKSwlZXNpCisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxYQk2NCglZWJ4KSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTUKKwltb3ZkcWEJODAoJWVieCksJXhtbTEKKwlweG9yCSV4bW0yLCV4bW02CisJbW92ZHFhCTk2KCVlYngpLCV4bW0yCisJcHhvcgkleG1tMywleG1tNworCW1vdmRxYQkxMTIoJWVieCksJXhtbTMKKwltb3ZkcXUJJXhtbTQsLTEyOCglZWRpKQorCW1vdmRxdQkleG1tNSwtNjQoJWVkaSkKKwltb3ZkcXUJJXhtbTYsKCVlZGkpCisJbW92ZHF1CSV4bW03LDY0KCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisJcGFkZGQJNjQoJWVicCksJXhtbTAKKwlwYWRkZAk4MCglZWJwKSwleG1tMQorCXBhZGRkCTk2KCVlYnApLCV4bW0yCisJcGFkZGQJMTEyKCVlYnApLCV4bW0zCisJbW92ZHFhCSV4bW0wLCV4bW02CisJcHVucGNrbGRxCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0yLCV4bW03CisJcHVucGNrbGRxCSV4bW0zLCV4bW0yCisJcHVucGNraGRxCSV4bW0xLCV4bW02CisJcHVucGNraGRxCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHVucGNrbHFkcQkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tMworCXB1bnBja2xxZHEJJXhtbTcsJXhtbTYKKwlwdW5wY2tocWRxCSV4bW0yLCV4bW0xCisJcHVucGNraHFkcQkleG1tNywleG1tMworCW1vdmRxdQktMTI4KCVlc2kpLCV4bW00CisJbW92ZHF1CS02NCglZXNpKSwleG1tNQorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTcKKwlsZWFsCTIwOCglZXNpKSwlZXNpCisJcHhvcgkleG1tMCwleG1tNAorCXB4b3IJJXhtbTEsJXhtbTUKKwlweG9yCSV4bW0yLCV4bW02CisJcHhvcgkleG1tMywleG1tNworCW1vdmRxdQkleG1tNCwtMTI4KCVlZGkpCisJbW92ZHF1CSV4bW01LC02NCglZWRpKQorCW1vdmRxdQkleG1tNiwoJWVkaSkKKwltb3ZkcXUJJXhtbTcsNjQoJWVkaSkKKwlsZWFsCTIwOCglZWRpKSwlZWRpCisJc3VibAkkMjU2LCVlY3gKKwlqbmMJLkwwMDlvdXRlcl9sb29wCisJYWRkbAkkMjU2LCVlY3gKKwlqegkuTDAxMWRvbmUKKwltb3ZsCTUyMCglZXNwKSwlZWJ4CisJbGVhbAktMTI4KCVlc2kpLCVlc2kKKwltb3ZsCTUxNiglZXNwKSwlZWR4CisJbGVhbAktMTI4KCVlZGkpLCVlZGkKKwltb3ZkCTY0KCVlYnApLCV4bW0yCisJbW92ZHF1CSglZWJ4KSwleG1tMworCXBhZGRkCTk2KCVlYXgpLCV4bW0yCisJcGFuZAkxMTIoJWVheCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTMKKy5MMDA4MXg6CisJbW92ZHFhCTMyKCVlYXgpLCV4bW0wCisJbW92ZHF1CSglZWR4KSwleG1tMQorCW1vdmRxdQkxNiglZWR4KSwleG1tMgorCW1vdmRxYQkoJWVheCksJXhtbTYKKwltb3ZkcWEJMTYoJWVheCksJXhtbTcKKwltb3ZsCSVlYnAsNDgoJWVzcCkKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJbW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJbW92ZHFhCSV4bW0yLDMyKCVlc3ApCisJbW92ZHFhCSV4bW0zLDQ4KCVlc3ApCisJbW92bAkkMTAsJWVkeAorCWptcAkuTDAxMmxvb3AxeAorLmFsaWduCTE2CisuTDAxM291dGVyMXg6CisJbW92ZHFhCTgwKCVlYXgpLCV4bW0zCisJbW92ZHFhCSglZXNwKSwleG1tMAorCW1vdmRxYQkxNiglZXNwKSwleG1tMQorCW1vdmRxYQkzMiglZXNwKSwleG1tMgorCXBhZGRkCTQ4KCVlc3ApLCV4bW0zCisJbW92bAkkMTAsJWVkeAorCW1vdmRxYQkleG1tMyw0OCglZXNwKQorCWptcAkuTDAxMmxvb3AxeAorLmFsaWduCTE2CisuTDAxMmxvb3AxeDoKKwlwYWRkZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMgorCXBhZGRkCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tMSwleG1tNAorCXBzcmxkCSQyMCwleG1tMQorCXBzbGxkCSQxMiwleG1tNAorCXBvcgkleG1tNCwleG1tMQorCXBhZGRkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIzCisJcGFkZGQJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW0xLCV4bW00CisJcHNybGQJJDI1LCV4bW0xCisJcHNsbGQJJDcsJXhtbTQKKwlwb3IJJXhtbTQsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0yLCV4bW0yCisJcHNodWZkCSQ1NywleG1tMSwleG1tMQorCXBzaHVmZAkkMTQ3LCV4bW0zLCV4bW0zCisJbm9wCisJcGFkZGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JsZAkkMjAsJXhtbTEKKwlwc2xsZAkkMTIsJXhtbTQKKwlwb3IJJXhtbTQsJXhtbTEKKwlwYWRkZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworCXBhZGRkCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tMSwleG1tNAorCXBzcmxkCSQyNSwleG1tMQorCXBzbGxkCSQ3LCV4bW00CisJcG9yCSV4bW00LCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMgorCXBzaHVmZAkkMTQ3LCV4bW0xLCV4bW0xCisJcHNodWZkCSQ1NywleG1tMywleG1tMworCWRlY2wJJWVkeAorCWpuegkuTDAxMmxvb3AxeAorCXBhZGRkCSglZXNwKSwleG1tMAorCXBhZGRkCTE2KCVlc3ApLCV4bW0xCisJcGFkZGQJMzIoJWVzcCksJXhtbTIKKwlwYWRkZAk0OCglZXNwKSwleG1tMworCWNtcGwJJDY0LCVlY3gKKwlqYgkuTDAxNHRhaWwKKwltb3ZkcXUJKCVlc2kpLCV4bW00CisJbW92ZHF1CTE2KCVlc2kpLCV4bW01CisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxdQkzMiglZXNpKSwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTEKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwlweG9yCSV4bW00LCV4bW0yCisJcHhvcgkleG1tNSwleG1tMworCWxlYWwJNjQoJWVzaSksJWVzaQorCW1vdmRxdQkleG1tMCwoJWVkaSkKKwltb3ZkcXUJJXhtbTEsMTYoJWVkaSkKKwltb3ZkcXUJJXhtbTIsMzIoJWVkaSkKKwltb3ZkcXUJJXhtbTMsNDgoJWVkaSkKKwlsZWFsCTY0KCVlZGkpLCVlZGkKKwlzdWJsCSQ2NCwlZWN4CisJam56CS5MMDEzb3V0ZXIxeAorCWptcAkuTDAxMWRvbmUKKy5MMDE0dGFpbDoKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJbW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJbW92ZHFhCSV4bW0yLDMyKCVlc3ApCisJbW92ZHFhCSV4bW0zLDQ4KCVlc3ApCisJeG9ybAklZWF4LCVlYXgKKwl4b3JsCSVlZHgsJWVkeAorCXhvcmwJJWVicCwlZWJwCisuTDAxNXRhaWxfbG9vcDoKKwltb3ZiCSglZXNwLCVlYnAsMSksJWFsCisJbW92YgkoJWVzaSwlZWJwLDEpLCVkbAorCWxlYWwJMSglZWJwKSwlZWJwCisJeG9yYgklZGwsJWFsCisJbW92YgklYWwsLTEoJWVkaSwlZWJwLDEpCisJZGVjbAklZWN4CisJam56CS5MMDE1dGFpbF9sb29wCisuTDAxMWRvbmU6CisJbW92bAk1MTIoJWVzcCksJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJQ2hhQ2hhMjBfc3NzZTMsLi0uTF9DaGFDaGEyMF9zc3NlM19iZWdpbgorLmFsaWduCTY0CisuTHNzc2UzX2RhdGE6CisuYnl0ZQkyLDMsMCwxLDYsNyw0LDUsMTAsMTEsOCw5LDE0LDE1LDEyLDEzCisuYnl0ZQkzLDAsMSwyLDcsNCw1LDYsMTEsOCw5LDEwLDE1LDEyLDEzLDE0CisubG9uZwkxNjM0NzYwODA1LDg1Nzc2MDg3OCwyMDM2NDc3MjM0LDE3OTcyODUyMzYKKy5sb25nCTAsMSwyLDMKKy5sb25nCTQsNCw0LDQKKy5sb25nCTEsMCwwLDAKKy5sb25nCTQsMCwwLDAKKy5sb25nCTAsLTEsLTEsLTEKKy5hbGlnbgk2NAorLmJ5dGUJNjcsMTA0LDk3LDY3LDEwNCw5Nyw1MCw0OCwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQKKy5ieXRlCTQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMgorLmJ5dGUJNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEKKy5ieXRlCTExNCwxMDMsNjIsMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXMtNTg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXMtNTg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiNDU5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL2Flcy01ODYuUwpAQCAtMCwwICsxLDMyNTYgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5oaWRkZW4JX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0CisudHlwZQlfeDg2X0FFU19lbmNyeXB0X2NvbXBhY3QsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK194ODZfQUVTX2VuY3J5cHRfY29tcGFjdDoKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCW1vdmwJMjQwKCVlZGkpLCVlc2kKKwlsZWFsCS0yKCVlc2ksJWVzaSwxKSwlZXNpCisJbGVhbAkoJWVkaSwlZXNpLDgpLCVlc2kKKwltb3ZsCSVlc2ksMjQoJWVzcCkKKwltb3ZsCS0xMjgoJWVicCksJWVkaQorCW1vdmwJLTk2KCVlYnApLCVlc2kKKwltb3ZsCS02NCglZWJwKSwlZWRpCisJbW92bAktMzIoJWVicCksJWVzaQorCW1vdmwJKCVlYnApLCVlZGkKKwltb3ZsCTMyKCVlYnApLCVlc2kKKwltb3ZsCTY0KCVlYnApLCVlZGkKKwltb3ZsCTk2KCVlYnApLCVlc2kKKy5hbGlnbgkxNgorLkwwMDBsb29wOgorCW1vdmwJJWVheCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCisJbW92bAklZWJ4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDE2LCVlYngKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklY2gsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksOCglZXNwKQorCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDI0LCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCisJYW5kbAkkMjU1LCVlZHgKKwltb3Z6YmwJLTEyOCglZWJwLCVlZHgsMSksJWVkeAorCW1vdnpibAklYWgsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVheCwxKSwlZWF4CisJc2hsbAkkOCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCS0xMjgoJWVicCwlZWJ4LDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVieAorCW1vdnpibAktMTI4KCVlYnAsJWVjeCwxKSwlZWN4CisJc2hsbAkkMjQsJWVjeAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZXNpLCVlY3gKKworCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVjeCwlZWJwCisJbGVhbAkoJWVjeCwlZWN4LDEpLCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCWFuZGwJJDQyNzgxMjQyODYsJWVkaQorCXN1YmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXJvcmwJJDE2LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZXNpLCVlY3gKKwlyb3JsCSQyNCwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwlyb2xsCSQyNCwlZWN4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwl4b3JsCSVlc2ksJWVjeAorCWFuZGwJJWVkeCwlZWJwCisJbGVhbAkoJWVkeCwlZWR4LDEpLCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCWFuZGwJJDQyNzgxMjQyODYsJWVkaQorCXN1YmwJJWVicCwlZXNpCisJbW92bAklZWR4LCVlYnAKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXJvcmwJJDE2LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwlyb3JsCSQyNCwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwlyb2xsCSQyNCwlZWR4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwl4b3JsCSVlc2ksJWVkeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCWFuZGwJJDQyNzgxMjQyODYsJWVkaQorCXN1YmwJJWVicCwlZXNpCisJbW92bAklZWF4LCVlYnAKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXJvcmwJJDE2LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVheCwlZWRpCisJeG9ybAklZXNpLCVlYXgKKwlyb3JsCSQyNCwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwlyb2xsCSQyNCwlZWF4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwl4b3JsCSVlc2ksJWVheAorCWFuZGwJJWVieCwlZWJwCisJbGVhbAkoJWVieCwlZWJ4LDEpLCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCWFuZGwJJDQyNzgxMjQyODYsJWVkaQorCXN1YmwJJWVicCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXJvcmwJJDE2LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVieCwlZWRpCisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQyNCwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwlyb2xsCSQyNCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlc2ksJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVicAorCWFkZGwJJDE2LCVlZGkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCWNtcGwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVkaSwyMCglZXNwKQorCWpiCS5MMDAwbG9vcAorCW1vdmwJJWVheCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCisJbW92bAklZWJ4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDE2LCVlYngKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklY2gsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksOCglZXNwKQorCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDI0LCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCisJbW92bAkyMCglZXNwKSwlZWRpCisJYW5kbAkkMjU1LCVlZHgKKwltb3Z6YmwJLTEyOCglZWJwLCVlZHgsMSksJWVkeAorCW1vdnpibAklYWgsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVheCwxKSwlZWF4CisJc2hsbAkkOCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCS0xMjgoJWVicCwlZWJ4LDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVieAorCW1vdnpibAktMTI4KCVlYnAsJWVjeCwxKSwlZWN4CisJc2hsbAkkMjQsJWVjeAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZXNpLCVlY3gKKworCXhvcmwJMTYoJWVkaSksJWVheAorCXhvcmwJMjAoJWVkaSksJWVieAorCXhvcmwJMjQoJWVkaSksJWVjeAorCXhvcmwJMjgoJWVkaSksJWVkeAorCXJldAorLnNpemUJX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0LC4tX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0CisuaGlkZGVuCV9zc2VfQUVTX2VuY3J5cHRfY29tcGFjdAorLnR5cGUJX3NzZV9BRVNfZW5jcnlwdF9jb21wYWN0LEBmdW5jdGlvbgorLmFsaWduCTE2Citfc3NlX0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJcHhvcgkoJWVkaSksJW1tMAorCXB4b3IJOCglZWRpKSwlbW00CisJbW92bAkyNDAoJWVkaSksJWVzaQorCWxlYWwJLTIoJWVzaSwlZXNpLDEpLCVlc2kKKwlsZWFsCSglZWRpLCVlc2ksOCksJWVzaQorCW1vdmwJJWVzaSwyNCglZXNwKQorCW1vdmwJJDQ1NDc2MTI0MywlZWF4CisJbW92bAklZWF4LDgoJWVzcCkKKwltb3ZsCSVlYXgsMTIoJWVzcCkKKwltb3ZsCS0xMjgoJWVicCksJWVheAorCW1vdmwJLTk2KCVlYnApLCVlYngKKwltb3ZsCS02NCglZWJwKSwlZWN4CisJbW92bAktMzIoJWVicCksJWVkeAorCW1vdmwJKCVlYnApLCVlYXgKKwltb3ZsCTMyKCVlYnApLCVlYngKKwltb3ZsCTY0KCVlYnApLCVlY3gKKwltb3ZsCTk2KCVlYnApLCVlZHgKKy5hbGlnbgkxNgorLkwwMDFsb29wOgorCXBzaHVmdwkkOCwlbW0wLCVtbTEKKwlwc2h1ZncJJDEzLCVtbTQsJW1tNQorCW1vdmQJJW1tMSwlZWF4CisJbW92ZAklbW01LCVlYngKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwltb3Z6YmwJJWFsLCVlc2kKKwltb3Z6YmwJJWFoLCVlZHgKKwlwc2h1ZncJJDEzLCVtbTAsJW1tMgorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWN4CisJbW92emJsCSVibCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWR4LDEpLCVlZHgKKwlzaHJsCSQxNiwlZWF4CisJc2hsbAkkOCwlZWR4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwlzaGxsCSQxNiwlZXNpCisJcHNodWZ3CSQ4LCVtbTQsJW1tNgorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYWgsJWVkaQorCXNobGwJJDI0LCVlc2kKKwlzaHJsCSQxNiwlZWJ4CisJb3JsCSVlc2ksJWVkeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkOCwlZXNpCisJb3JsCSVlc2ksJWVjeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSVhbCwlZWRpCisJc2hsbAkkMjQsJWVzaQorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmwsJWVkaQorCW1vdmQJJW1tMiwlZWF4CisJbW92ZAklZWN4LCVtbTAKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVjeAorCW1vdnpibAklYWgsJWVkaQorCXNobGwJJDE2LCVlY3gKKwltb3ZkCSVtbTYsJWVieAorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCXNobGwJJDI0LCVlc2kKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWJsLCVlZGkKKwlzaGxsCSQ4LCVlc2kKKwlzaHJsCSQxNiwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSVhbCwlZWRpCisJc2hybAkkMTYsJWVheAorCW1vdmQJJWVjeCwlbW0xCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlY3gKKwltb3Z6YmwJJWFoLCVlZGkKKwlzaGxsCSQxNiwlZWN4CisJYW5kbAkkMjU1LCVlYXgKKwlvcmwJJWVzaSwlZWN4CisJcHVucGNrbGRxCSVtbTEsJW1tMAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkMjQsJWVzaQorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCS0xMjgoJWVicCwlZWF4LDEpLCVlYXgKKwlvcmwJJWVzaSwlZWN4CisJc2hsbAkkMTYsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJb3JsCSVlYXgsJWVkeAorCXNobGwJJDgsJWVzaQorCW1vdnpibAktMTI4KCVlYnAsJWVieCwxKSwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW9ybAklZWJ4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZkCSVlY3gsJW1tNAorCW1vdmQJJWVkeCwlbW01CisJcHVucGNrbGRxCSVtbTUsJW1tNAorCWFkZGwJJDE2LCVlZGkKKwljbXBsCTI0KCVlc3ApLCVlZGkKKwlqYQkuTDAwMm91dAorCW1vdnEJOCglZXNwKSwlbW0yCisJcHhvcgklbW0zLCVtbTMKKwlweG9yCSVtbTcsJW1tNworCW1vdnEJJW1tMCwlbW0xCisJbW92cQklbW00LCVtbTUKKwlwY21wZ3RiCSVtbTAsJW1tMworCXBjbXBndGIJJW1tNCwlbW03CisJcGFuZAklbW0yLCVtbTMKKwlwYW5kCSVtbTIsJW1tNworCXBzaHVmdwkkMTc3LCVtbTAsJW1tMgorCXBzaHVmdwkkMTc3LCVtbTQsJW1tNgorCXBhZGRiCSVtbTAsJW1tMAorCXBhZGRiCSVtbTQsJW1tNAorCXB4b3IJJW1tMywlbW0wCisJcHhvcgklbW03LCVtbTQKKwlwc2h1ZncJJDE3NywlbW0yLCVtbTMKKwlwc2h1ZncJJDE3NywlbW02LCVtbTcKKwlweG9yCSVtbTAsJW1tMQorCXB4b3IJJW1tNCwlbW01CisJcHhvcgklbW0yLCVtbTAKKwlweG9yCSVtbTYsJW1tNAorCW1vdnEJJW1tMywlbW0yCisJbW92cQklbW03LCVtbTYKKwlwc2xsZAkkOCwlbW0zCisJcHNsbGQJJDgsJW1tNworCXBzcmxkCSQyNCwlbW0yCisJcHNybGQJJDI0LCVtbTYKKwlweG9yCSVtbTMsJW1tMAorCXB4b3IJJW1tNywlbW00CisJcHhvcgklbW0yLCVtbTAKKwlweG9yCSVtbTYsJW1tNAorCW1vdnEJJW1tMSwlbW0zCisJbW92cQklbW01LCVtbTcKKwltb3ZxCSglZWRpKSwlbW0yCisJbW92cQk4KCVlZGkpLCVtbTYKKwlwc3JsZAkkOCwlbW0xCisJcHNybGQJJDgsJW1tNQorCW1vdmwJLTEyOCglZWJwKSwlZWF4CisJcHNsbGQJJDI0LCVtbTMKKwlwc2xsZAkkMjQsJW1tNworCW1vdmwJLTY0KCVlYnApLCVlYngKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNSwlbW00CisJbW92bAkoJWVicCksJWVjeAorCXB4b3IJJW1tMywlbW0wCisJcHhvcgklbW03LCVtbTQKKwltb3ZsCTY0KCVlYnApLCVlZHgKKwlweG9yCSVtbTIsJW1tMAorCXB4b3IJJW1tNiwlbW00CisJam1wCS5MMDAxbG9vcAorLmFsaWduCTE2CisuTDAwMm91dDoKKwlweG9yCSglZWRpKSwlbW0wCisJcHhvcgk4KCVlZGkpLCVtbTQKKwlyZXQKKy5zaXplCV9zc2VfQUVTX2VuY3J5cHRfY29tcGFjdCwuLV9zc2VfQUVTX2VuY3J5cHRfY29tcGFjdAorLmhpZGRlbglfeDg2X0FFU19lbmNyeXB0CisudHlwZQlfeDg2X0FFU19lbmNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2CitfeDg2X0FFU19lbmNyeXB0OgorCW1vdmwJJWVkaSwyMCglZXNwKQorCXhvcmwJKCVlZGkpLCVlYXgKKwl4b3JsCTQoJWVkaSksJWVieAorCXhvcmwJOCglZWRpKSwlZWN4CisJeG9ybAkxMiglZWRpKSwlZWR4CisJbW92bAkyNDAoJWVkaSksJWVzaQorCWxlYWwJLTIoJWVzaSwlZXNpLDEpLCVlc2kKKwlsZWFsCSglZWRpLCVlc2ksOCksJWVzaQorCW1vdmwJJWVzaSwyNCglZXNwKQorLmFsaWduCTE2CisuTDAwM2xvb3A6CisJbW92bAklZWF4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdmwJKCVlYnAsJWVzaSw4KSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJeG9ybAkzKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwl4b3JsCTIoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwl4b3JsCTEoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCisJbW92bAklZWJ4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDE2LCVlYngKKwltb3ZsCSglZWJwLCVlc2ksOCksJWVzaQorCW1vdnpibAklY2gsJWVkaQorCXhvcmwJMyglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJeG9ybAkyKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJeG9ybAkxKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZXNpLDgoJWVzcCkKKworCW1vdmwJJWVjeCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwlzaHJsCSQyNCwlZWN4CisJbW92bAkoJWVicCwlZXNpLDgpLCVlc2kKKwltb3Z6YmwJJWRoLCVlZGkKKwl4b3JsCTMoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCWFuZGwJJDI1NSwlZWRpCisJeG9ybAkyKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJeG9ybAkxKCVlYnAsJWVkaSw4KSwlZXNpCisKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCSglZWJwLCVlZHgsOCksJWVkeAorCW1vdnpibAklYWgsJWVheAorCXhvcmwJMyglZWJwLCVlYXgsOCksJWVkeAorCW1vdmwJNCglZXNwKSwlZWF4CisJYW5kbAkkMjU1LCVlYngKKwl4b3JsCTIoJWVicCwlZWJ4LDgpLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVieAorCXhvcmwJMSglZWJwLCVlY3gsOCksJWVkeAorCW1vdmwJJWVzaSwlZWN4CisKKwlhZGRsCSQxNiwlZWRpCisJeG9ybAkoJWVkaSksJWVheAorCXhvcmwJNCglZWRpKSwlZWJ4CisJeG9ybAk4KCVlZGkpLCVlY3gKKwl4b3JsCTEyKCVlZGkpLCVlZHgKKwljbXBsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwlqYgkuTDAwM2xvb3AKKwltb3ZsCSVlYXgsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92bAkyKCVlYnAsJWVzaSw4KSwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3ZsCSglZWJwLCVlZGksOCksJWVkaQorCWFuZGwJJDY1MjgwLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92bAkoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQxNjcxMTY4MCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3ZsCTIoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQ0Mjc4MTkwMDgwLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVzaSw0KCVlc3ApCisJbW92bAklZWJ4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDE2LCVlYngKKwltb3ZsCTIoJWVicCwlZXNpLDgpLCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdnpibAklY2gsJWVkaQorCW1vdmwJKCVlYnAsJWVkaSw4KSwlZWRpCisJYW5kbAkkNjUyODAsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwltb3ZsCSglZWJwLCVlZGksOCksJWVkaQorCWFuZGwJJDE2NzExNjgwLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVheCwlZWRpCisJc2hybAkkMjQsJWVkaQorCW1vdmwJMiglZWJwLCVlZGksOCksJWVkaQorCWFuZGwJJDQyNzgxOTAwODAsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZXNpLDgoJWVzcCkKKwltb3ZsCSVlY3gsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJc2hybAkkMjQsJWVjeAorCW1vdmwJMiglZWJwLCVlc2ksOCksJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92emJsCSVkaCwlZWRpCisJbW92bAkoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQ2NTI4MCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCWFuZGwJJDI1NSwlZWRpCisJbW92bAkoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQxNjcxMTY4MCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3ZsCTIoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQ0Mjc4MTkwMDgwLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCWFuZGwJJDI1NSwlZWR4CisJbW92bAkyKCVlYnAsJWVkeCw4KSwlZWR4CisJYW5kbAkkMjU1LCVlZHgKKwltb3Z6YmwJJWFoLCVlYXgKKwltb3ZsCSglZWJwLCVlYXgsOCksJWVheAorCWFuZGwJJDY1MjgwLCVlYXgKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJNCglZXNwKSwlZWF4CisJYW5kbAkkMjU1LCVlYngKKwltb3ZsCSglZWJwLCVlYngsOCksJWVieAorCWFuZGwJJDE2NzExNjgwLCVlYngKKwl4b3JsCSVlYngsJWVkeAorCW1vdmwJOCglZXNwKSwlZWJ4CisJbW92bAkyKCVlYnAsJWVjeCw4KSwlZWN4CisJYW5kbAkkNDI3ODE5MDA4MCwlZWN4CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlc2ksJWVjeAorCWFkZGwJJDE2LCVlZGkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCXJldAorLmFsaWduCTY0CisuTEFFU19UZToKKy5sb25nCTI3NzQ3NTQyNDYsMjc3NDc1NDI0NgorLmxvbmcJMjIyMjc1MDk2OCwyMjIyNzUwOTY4CisubG9uZwkyNTc0NzQzNTM0LDI1NzQ3NDM1MzQKKy5sb25nCTIzNzM2ODAxMTgsMjM3MzY4MDExOAorLmxvbmcJMjM0MDI1NzI3LDIzNDAyNTcyNworLmxvbmcJMzE3NzkzMzc4MiwzMTc3OTMzNzgyCisubG9uZwkyOTc2ODcwMzY2LDI5NzY4NzAzNjYKKy5sb25nCTE0MjIyNDczMTMsMTQyMjI0NzMxMworLmxvbmcJMTM0NTMzNTM5MiwxMzQ1MzM1MzkyCisubG9uZwk1MDM5NzQ0Miw1MDM5NzQ0MgorLmxvbmcJMjg0MjEyNjI4NiwyODQyMTI2Mjg2CisubG9uZwkyMDk5OTgxMTQyLDIwOTk5ODExNDIKKy5sb25nCTQzNjE0MTc5OSw0MzYxNDE3OTkKKy5sb25nCTE2NTgzMTI2MjksMTY1ODMxMjYyOQorLmxvbmcJMzg3MDAxMDE4OSwzODcwMDEwMTg5CisubG9uZwkyNTkxNDU0OTU2LDI1OTE0NTQ5NTYKKy5sb25nCTExNzA5MTgwMzEsMTE3MDkxODAzMQorLmxvbmcJMjY0MjU3NTkwMywyNjQyNTc1OTAzCisubG9uZwkxMDg2OTY2MTUzLDEwODY5NjYxNTMKKy5sb25nCTIyNzMxNDg0MTAsMjI3MzE0ODQxMAorLmxvbmcJMzY4NzY5Nzc1LDM2ODc2OTc3NQorLmxvbmcJMzk0ODUwMTQyNiwzOTQ4NTAxNDI2CisubG9uZwkzMzc2ODkxNzkwLDMzNzY4OTE3OTAKKy5sb25nCTIwMDMzOTcwNywyMDAzMzk3MDcKKy5sb25nCTM5NzA4MDUwNTcsMzk3MDgwNTA1NworLmxvbmcJMTc0MjAwMTMzMSwxNzQyMDAxMzMxCisubG9uZwk0MjU1Mjk0MDQ3LDQyNTUyOTQwNDcKKy5sb25nCTM5MzczODIyMTMsMzkzNzM4MjIxMworLmxvbmcJMzIxNDcxMTg0MywzMjE0NzExODQzCisubG9uZwk0MTU0NzYyMzIzLDQxNTQ3NjIzMjMKKy5sb25nCTI1MjQwODI5MTYsMjUyNDA4MjkxNgorLmxvbmcJMTUzOTM1ODg3NSwxNTM5MzU4ODc1CisubG9uZwkzMjY2ODE5OTU3LDMyNjY4MTk5NTcKKy5sb25nCTQ4NjQwNzY0OSw0ODY0MDc2NDkKKy5sb25nCTI5Mjg5MDcwNjksMjkyODkwNzA2OQorLmxvbmcJMTc4MDg4NTA2OCwxNzgwODg1MDY4CisubG9uZwkxNTEzNTAyMzE2LDE1MTM1MDIzMTYKKy5sb25nCTEwOTQ2NjQwNjIsMTA5NDY2NDA2MgorLmxvbmcJNDk4MDUzMDEsNDk4MDUzMDEKKy5sb25nCTEzMzg4MjE3NjMsMTMzODgyMTc2MworLmxvbmcJMTU0NjkyNTE2MCwxNTQ2OTI1MTYwCisubG9uZwk0MTA0NDk2NDY1LDQxMDQ0OTY0NjUKKy5sb25nCTg4NzQ4MTgwOSw4ODc0ODE4MDkKKy5sb25nCTE1MDA3Mzg0OSwxNTAwNzM4NDkKKy5sb25nCTI0NzM2ODU0NzQsMjQ3MzY4NTQ3NAorLmxvbmcJMTk0MzU5MTA4MywxOTQzNTkxMDgzCisubG9uZwkxMzk1NzMyODM0LDEzOTU3MzI4MzQKKy5sb25nCTEwNTgzNDYyODIsMTA1ODM0NjI4MgorLmxvbmcJMjAxNTg5NzY4LDIwMTU4OTc2OAorLmxvbmcJMTM4ODgyNDQ2OSwxMzg4ODI0NDY5CisubG9uZwkxNjk2ODAxNjA2LDE2OTY4MDE2MDYKKy5sb25nCTE1ODk4ODc5MDEsMTU4OTg4NzkwMQorLmxvbmcJNjcyNjY3Njk2LDY3MjY2NzY5NgorLmxvbmcJMjcxMTAwMDYzMSwyNzExMDAwNjMxCisubG9uZwkyNTE5ODcyMTAsMjUxOTg3MjEwCisubG9uZwkzMDQ2ODA4MTExLDMwNDY4MDgxMTEKKy5sb25nCTE1MTQ1NTUwMiwxNTE0NTU1MDIKKy5sb25nCTkwNzE1Mzk1Niw5MDcxNTM5NTYKKy5sb25nCTI2MDg4ODk4ODMsMjYwODg4OTg4MworLmxvbmcJMTAzODI3OTM5MSwxMDM4Mjc5MzkxCisubG9uZwk2NTI5OTU1MzMsNjUyOTk1NTMzCisubG9uZwkxNzY0MTczNjQ2LDE3NjQxNzM2NDYKKy5sb25nCTM0NTEwNDAzODMsMzQ1MTA0MDM4MworLmxvbmcJMjY3NTI3NTI0MiwyNjc1Mjc1MjQyCisubG9uZwk0NTM1NzY5NzgsNDUzNTc2OTc4CisubG9uZwkyNjU5NDE4OTA5LDI2NTk0MTg5MDkKKy5sb25nCTE5NDkwNTE5OTIsMTk0OTA1MTk5MgorLmxvbmcJNzczNDYyNTgwLDc3MzQ2MjU4MAorLmxvbmcJNzU2NzUxMTU4LDc1Njc1MTE1OAorLmxvbmcJMjk5MzU4MTc4OCwyOTkzNTgxNzg4CisubG9uZwkzOTk4ODk4ODY4LDM5OTg4OTg4NjgKKy5sb25nCTQyMjE2MDgwMjcsNDIyMTYwODAyNworLmxvbmcJNDEzMjU5MDI0NCw0MTMyNTkwMjQ0CisubG9uZwkxMjk1NzI3NDc4LDEyOTU3Mjc0NzgKKy5sb25nCTE2NDE0Njk2MjMsMTY0MTQ2OTYyMworLmxvbmcJMzQ2Nzg4MzM4OSwzNDY3ODgzMzg5CisubG9uZwkyMDY2Mjk1MTIyLDIwNjYyOTUxMjIKKy5sb25nCTEwNTUxMjIzOTcsMTA1NTEyMjM5NworLmxvbmcJMTg5ODkxNzcyNiwxODk4OTE3NzI2CisubG9uZwkyNTQyMDQ0MTc5LDI1NDIwNDQxNzkKKy5sb25nCTQxMTU4Nzg4MjIsNDExNTg3ODgyMgorLmxvbmcJMTc1ODU4MTE3NywxNzU4NTgxMTc3CisubG9uZwkwLDAKKy5sb25nCTc1Mzc5MDQwMSw3NTM3OTA0MDEKKy5sb25nCTE2MTI3MTgxNDQsMTYxMjcxODE0NAorLmxvbmcJNTM2NjczNTA3LDUzNjY3MzUwNworLmxvbmcJMzM2NzA4ODUwNSwzMzY3MDg4NTA1CisubG9uZwkzOTgyMTg3NDQ2LDM5ODIxODc0NDYKKy5sb25nCTMxOTQ2NDUyMDQsMzE5NDY0NTIwNAorLmxvbmcJMTE4Nzc2MTAzNywxMTg3NzYxMDM3CisubG9uZwkzNjUzMTU2NDU1LDM2NTMxNTY0NTUKKy5sb25nCTEyNjIwNDE0NTgsMTI2MjA0MTQ1OAorLmxvbmcJMzcyOTQxMDcwOCwzNzI5NDEwNzA4CisubG9uZwkzNTYxNzcwMTM2LDM1NjE3NzAxMzYKKy5sb25nCTM4OTgxMDM5ODQsMzg5ODEwMzk4NAorLmxvbmcJMTI1NTEzMzA2MSwxMjU1MTMzMDYxCisubG9uZwkxODA4ODQ3MDM1LDE4MDg4NDcwMzUKKy5sb25nCTcyMDM2NzU1Nyw3MjAzNjc1NTcKKy5sb25nCTM4NTMxNjcxODMsMzg1MzE2NzE4MworLmxvbmcJMzg1NjEyNzgxLDM4NTYxMjc4MQorLmxvbmcJMzMwOTUxOTc1MCwzMzA5NTE5NzUwCisubG9uZwkzNjEyMTY3NTc4LDM2MTIxNjc1NzgKKy5sb25nCTE0Mjk0MTg4NTQsMTQyOTQxODg1NAorLmxvbmcJMjQ5MTc3ODMyMSwyNDkxNzc4MzIxCisubG9uZwkzNDc3NDIzNDk4LDM0Nzc0MjM0OTgKKy5sb25nCTI4NDgxNzg5NywyODQ4MTc4OTcKKy5sb25nCTEwMDc5NDg4NCwxMDA3OTQ4ODQKKy5sb25nCTIxNzI2MTY3MDIsMjE3MjYxNjcwMgorLmxvbmcJNDAzMTc5NTM2MCw0MDMxNzk1MzYwCisubG9uZwkxMTQ0Nzk4MzI4LDExNDQ3OTgzMjgKKy5sb25nCTMxMzEwMjMxNDEsMzEzMTAyMzE0MQorLmxvbmcJMzgxOTQ4MTE2MywzODE5NDgxMTYzCisubG9uZwk0MDgyMTkyODAyLDQwODIxOTI4MDIKKy5sb25nCTQyNzIxMzcwNTMsNDI3MjEzNzA1MworLmxvbmcJMzIyNTQzNjI4OCwzMjI1NDM2Mjg4CisubG9uZwkyMzI0NjY0MDY5LDIzMjQ2NjQwNjkKKy5sb25nCTI5MTIwNjQwNjMsMjkxMjA2NDA2MworLmxvbmcJMzE2NDQ0NTk4NSwzMTY0NDQ1OTg1CisubG9uZwkxMjExNjQ0MDE2LDEyMTE2NDQwMTYKKy5sb25nCTgzMjI4MTQ1LDgzMjI4MTQ1CisubG9uZwkzNzUzNjg4MTYzLDM3NTM2ODgxNjMKKy5sb25nCTMyNDk5NzY5NTEsMzI0OTk3Njk1MQorLmxvbmcJMTk3NzI3NzEwMywxOTc3Mjc3MTAzCisubG9uZwkxNjYzMTE1NTg2LDE2NjMxMTU1ODYKKy5sb25nCTgwNjM1OTA3Miw4MDYzNTkwNzIKKy5sb25nCTQ1Mjk4NDgwNSw0NTI5ODQ4MDUKKy5sb25nCTI1MDg2ODczMywyNTA4Njg3MzMKKy5sb25nCTE4NDI1MzMwNTUsMTg0MjUzMzA1NQorLmxvbmcJMTI4ODU1NTkwNSwxMjg4NTU1OTA1CisubG9uZwkzMzYzMzM4NDgsMzM2MzMzODQ4CisubG9uZwk4OTA0NDI1MzQsODkwNDQyNTM0CisubG9uZwk4MDQwNTYyNTksODA0MDU2MjU5CisubG9uZwkzNzgxMTI0MDMwLDM3ODExMjQwMzAKKy5sb25nCTI3Mjc4NDM2MzcsMjcyNzg0MzYzNworLmxvbmcJMzQyNzAyNjA1NiwzNDI3MDI2MDU2CisubG9uZwk5NTc4MTQ1NzQsOTU3ODE0NTc0CisubG9uZwkxNDcyNTEzMTcxLDE0NzI1MTMxNzEKKy5sb25nCTQwNzEwNzM2MjEsNDA3MTA3MzYyMQorLmxvbmcJMjE4OTMyODEyNCwyMTg5MzI4MTI0CisubG9uZwkxMTk1MTk1NzcwLDExOTUxOTU3NzAKKy5sb25nCTI4OTIyNjA1NTIsMjg5MjI2MDU1MgorLmxvbmcJMzg4MTY1NTczOCwzODgxNjU1NzM4CisubG9uZwk3MjMwNjUxMzgsNzIzMDY1MTM4CisubG9uZwkyNTA3MzcxNDk0LDI1MDczNzE0OTQKKy5sb25nCTI2OTA2NzA3ODQsMjY5MDY3MDc4NAorLmxvbmcJMjU1ODYyNDAyNSwyNTU4NjI0MDI1CisubG9uZwkzNTExNjM1ODcwLDM1MTE2MzU4NzAKKy5sb25nCTIxNDUxODA4MzUsMjE0NTE4MDgzNQorLmxvbmcJMTcxMzUxMzAyOCwxNzEzNTEzMDI4CisubG9uZwkyMTE2NjkyNTY0LDIxMTY2OTI1NjQKKy5sb25nCTI4NzgzNzgwNDMsMjg3ODM3ODA0MworLmxvbmcJMjIwNjc2MzAxOSwyMjA2NzYzMDE5CisubG9uZwkzMzkzNjAzMjEyLDMzOTM2MDMyMTIKKy5sb25nCTcwMzUyNDU1MSw3MDM1MjQ1NTEKKy5sb25nCTM1NTIwOTg0MTEsMzU1MjA5ODQxMQorLmxvbmcJMTAwNzk0ODg0MCwxMDA3OTQ4ODQwCisubG9uZwkyMDQ0NjQ5MTI3LDIwNDQ2NDkxMjcKKy5sb25nCTM3OTc4MzU0NTIsMzc5NzgzNTQ1MgorLmxvbmcJNDg3MjYyOTk4LDQ4NzI2Mjk5OAorLmxvbmcJMTk5NDEyMDEwOSwxOTk0MTIwMTA5CisubG9uZwkxMDA0NTkzMzcxLDEwMDQ1OTMzNzEKKy5sb25nCTE0NDYxMzAyNzYsMTQ0NjEzMDI3NgorLmxvbmcJMTMxMjQzODkwMCwxMzEyNDM4OTAwCisubG9uZwk1MDM5NzQ0MjAsNTAzOTc0NDIwCisubG9uZwkzNjc5MDEzMjY2LDM2NzkwMTMyNjYKKy5sb25nCTE2ODE2NjkyNCwxNjgxNjY5MjQKKy5sb25nCTE4MTQzMDc5MTIsMTgxNDMwNzkxMgorLmxvbmcJMzgzMTI1ODI5NiwzODMxMjU4Mjk2CisubG9uZwkxNTczMDQ0ODk1LDE1NzMwNDQ4OTUKKy5sb25nCTE4NTkzNzYwNjEsMTg1OTM3NjA2MQorLmxvbmcJNDAyMTA3MDkxNSw0MDIxMDcwOTE1CisubG9uZwkyNzkxNDY1NjY4LDI3OTE0NjU2NjgKKy5sb25nCTI4MjgxMTIxODUsMjgyODExMjE4NQorLmxvbmcJMjc2MTI2NjQ4MSwyNzYxMjY2NDgxCisubG9uZwk5Mzc3NDc2NjcsOTM3NzQ3NjY3CisubG9uZwkyMzM5OTk0MDk4LDIzMzk5OTQwOTgKKy5sb25nCTg1NDA1ODk2NSw4NTQwNTg5NjUKKy5sb25nCTExMzcyMzIwMTEsMTEzNzIzMjAxMQorLmxvbmcJMTQ5Njc5MDg5NCwxNDk2NzkwODk0CisubG9uZwkzMDc3NDAyMDc0LDMwNzc0MDIwNzQKKy5sb25nCTIzNTgwODY5MTMsMjM1ODA4NjkxMworLmxvbmcJMTY5MTczNTQ3MywxNjkxNzM1NDczCisubG9uZwkzNTI4MzQ3MjkyLDM1MjgzNDcyOTIKKy5sb25nCTM3NjkyMTUzMDUsMzc2OTIxNTMwNQorLmxvbmcJMzAyNzAwNDYzMiwzMDI3MDA0NjMyCisubG9uZwk0MTk5OTYyMjg0LDQxOTk5NjIyODQKKy5sb25nCTEzMzQ5NDAwMywxMzM0OTQwMDMKKy5sb25nCTYzNjE1MjUyNyw2MzYxNTI1MjcKKy5sb25nCTI5NDI2NTc5OTQsMjk0MjY1Nzk5NAorLmxvbmcJMjM5MDM5MTU0MCwyMzkwMzkxNTQwCisubG9uZwkzOTIwNTM5MjA3LDM5MjA1MzkyMDcKKy5sb25nCTQwMzE3OTUzNiw0MDMxNzk1MzYKKy5sb25nCTM1ODU3ODQ0MzEsMzU4NTc4NDQzMQorLmxvbmcJMjI4OTU5NjY1NiwyMjg5NTk2NjU2CisubG9uZwkxODY0NzA1MzU0LDE4NjQ3MDUzNTQKKy5sb25nCTE5MTU2MjkxNDgsMTkxNTYyOTE0OAorLmxvbmcJNjA1ODIyMDA4LDYwNTgyMjAwOAorLmxvbmcJNDA1NDIzMDYxNSw0MDU0MjMwNjE1CisubG9uZwkzMzUwNTA4NjU5LDMzNTA1MDg2NTkKKy5sb25nCTEzNzE5ODE0NjMsMTM3MTk4MTQ2MworLmxvbmcJNjAyNDY2NTA3LDYwMjQ2NjUwNworLmxvbmcJMjA5NDkxNDk3NywyMDk0OTE0OTc3CisubG9uZwkyNjI0ODc3ODAwLDI2MjQ4Nzc4MDAKKy5sb25nCTU1NTY4Nzc0Miw1NTU2ODc3NDIKKy5sb25nCTM3MTI2OTkyODYsMzcxMjY5OTI4NgorLmxvbmcJMzcwMzQyMjMwNSwzNzAzNDIyMzA1CisubG9uZwkyMjU3MjkyMDQ1LDIyNTcyOTIwNDUKKy5sb25nCTIyNDA0NDkwMzksMjI0MDQ0OTAzOQorLmxvbmcJMjQyMzI4ODAzMiwyNDIzMjg4MDMyCisubG9uZwkxMTExMzc1NDg0LDExMTEzNzU0ODQKKy5sb25nCTMzMDAyNDI4MDEsMzMwMDI0MjgwMQorLmxvbmcJMjg1ODgzNzcwOCwyODU4ODM3NzA4CisubG9uZwkzNjI4NjE1ODI0LDM2Mjg2MTU4MjQKKy5sb25nCTg0MDgzNDYyLDg0MDgzNDYyCisubG9uZwkzMjk2MjI5NSwzMjk2MjI5NQorLmxvbmcJMzAyOTExMDA0LDMwMjkxMTAwNAorLmxvbmcJMjc0MTA2ODIyNiwyNzQxMDY4MjI2CisubG9uZwkxNTk3MzIyNjAyLDE1OTczMjI2MDIKKy5sb25nCTQxODMyNTA4NjIsNDE4MzI1MDg2MgorLmxvbmcJMzUwMTgzMjU1MywzNTAxODMyNTUzCisubG9uZwkyNDQxNTEyNDcxLDI0NDE1MTI0NzEKKy5sb25nCTE0ODkwOTMwMTcsMTQ4OTA5MzAxNworLmxvbmcJNjU2MjE5NDUwLDY1NjIxOTQ1MAorLmxvbmcJMzExNDE4MDEzNSwzMTE0MTgwMTM1CisubG9uZwk5NTQzMjc1MTMsOTU0MzI3NTEzCisubG9uZwkzMzUwODM3NTUsMzM1MDgzNzU1CisubG9uZwkzMDEzMTIyMDkxLDMwMTMxMjIwOTEKKy5sb25nCTg1Njc1NjUxNCw4NTY3NTY1MTQKKy5sb25nCTMxNDQyNDc3NjIsMzE0NDI0Nzc2MgorLmxvbmcJMTg5MzMyNTIyNSwxODkzMzI1MjI1CisubG9uZwkyMzA3ODIxMDYzLDIzMDc4MjEwNjMKKy5sb25nCTI4MTE1MzIzMzksMjgxMTUzMjMzOQorLmxvbmcJMzA2MzY1MTExNywzMDYzNjUxMTE3CisubG9uZwk1NzIzOTkxNjQsNTcyMzk5MTY0CisubG9uZwkyNDU4MzU1NDc3LDI0NTgzNTU0NzcKKy5sb25nCTU1MjIwMDY0OSw1NTIyMDA2NDkKKy5sb25nCTEyMzgyOTAwNTUsMTIzODI5MDA1NQorLmxvbmcJNDI4Mzc4MjU3MCw0MjgzNzgyNTcwCisubG9uZwkyMDE1ODk3NjgwLDIwMTU4OTc2ODAKKy5sb25nCTIwNjE0OTIxMzMsMjA2MTQ5MjEzMworLmxvbmcJMjQwODM1Mjc3MSwyNDA4MzUyNzcxCisubG9uZwk0MTcxMzQyMTY5LDQxNzEzNDIxNjkKKy5sb25nCTIxNTY0OTcxNjEsMjE1NjQ5NzE2MQorLmxvbmcJMzg2NzMxMjkwLDM4NjczMTI5MAorLmxvbmcJMzY2OTk5OTQ2MSwzNjY5OTk5NDYxCisubG9uZwk4MzcyMTU5NTksODM3MjE1OTU5CisubG9uZwkzMzI2MjMxMTcyLDMzMjYyMzExNzIKKy5sb25nCTMwOTM4NTAzMjAsMzA5Mzg1MDMyMAorLmxvbmcJMzI3NTgzMzczMCwzMjc1ODMzNzMwCisubG9uZwkyOTYyODU2MjMzLDI5NjI4NTYyMzMKKy5sb25nCTE5OTk0NDk0MzQsMTk5OTQ0OTQzNAorLmxvbmcJMjg2MTk5NTgyLDI4NjE5OTU4MgorLmxvbmcJMzQxNzM1NDM2MywzNDE3MzU0MzYzCisubG9uZwk0MjMzMzg1MTI4LDQyMzMzODUxMjgKKy5sb25nCTM2MDI2Mjc0MzcsMzYwMjYyNzQzNworLmxvbmcJOTc0NTI1OTk2LDk3NDUyNTk5NgorLmJ5dGUJOTksMTI0LDExOSwxMjMsMjQyLDEwNywxMTEsMTk3CisuYnl0ZQk0OCwxLDEwMyw0MywyNTQsMjE1LDE3MSwxMTgKKy5ieXRlCTIwMiwxMzAsMjAxLDEyNSwyNTAsODksNzEsMjQwCisuYnl0ZQkxNzMsMjEyLDE2MiwxNzUsMTU2LDE2NCwxMTQsMTkyCisuYnl0ZQkxODMsMjUzLDE0NywzOCw1NCw2MywyNDcsMjA0CisuYnl0ZQk1MiwxNjUsMjI5LDI0MSwxMTMsMjE2LDQ5LDIxCisuYnl0ZQk0LDE5OSwzNSwxOTUsMjQsMTUwLDUsMTU0CisuYnl0ZQk3LDE4LDEyOCwyMjYsMjM1LDM5LDE3OCwxMTcKKy5ieXRlCTksMTMxLDQ0LDI2LDI3LDExMCw5MCwxNjAKKy5ieXRlCTgyLDU5LDIxNCwxNzksNDEsMjI3LDQ3LDEzMgorLmJ5dGUJODMsMjA5LDAsMjM3LDMyLDI1MiwxNzcsOTEKKy5ieXRlCTEwNiwyMDMsMTkwLDU3LDc0LDc2LDg4LDIwNworLmJ5dGUJMjA4LDIzOSwxNzAsMjUxLDY3LDc3LDUxLDEzMworLmJ5dGUJNjksMjQ5LDIsMTI3LDgwLDYwLDE1OSwxNjgKKy5ieXRlCTgxLDE2Myw2NCwxNDMsMTQ2LDE1Nyw1NiwyNDUKKy5ieXRlCTE4OCwxODIsMjE4LDMzLDE2LDI1NSwyNDMsMjEwCisuYnl0ZQkyMDUsMTIsMTksMjM2LDk1LDE1MSw2OCwyMworLmJ5dGUJMTk2LDE2NywxMjYsNjEsMTAwLDkzLDI1LDExNQorLmJ5dGUJOTYsMTI5LDc5LDIyMCwzNCw0MiwxNDQsMTM2CisuYnl0ZQk3MCwyMzgsMTg0LDIwLDIyMiw5NCwxMSwyMTkKKy5ieXRlCTIyNCw1MCw1OCwxMCw3Myw2LDM2LDkyCisuYnl0ZQkxOTQsMjExLDE3Miw5OCwxNDUsMTQ5LDIyOCwxMjEKKy5ieXRlCTIzMSwyMDAsNTUsMTA5LDE0MSwyMTMsNzgsMTY5CisuYnl0ZQkxMDgsODYsMjQ0LDIzNCwxMDEsMTIyLDE3NCw4CisuYnl0ZQkxODYsMTIwLDM3LDQ2LDI4LDE2NiwxODAsMTk4CisuYnl0ZQkyMzIsMjIxLDExNiwzMSw3NSwxODksMTM5LDEzOAorLmJ5dGUJMTEyLDYyLDE4MSwxMDIsNzIsMywyNDYsMTQKKy5ieXRlCTk3LDUzLDg3LDE4NSwxMzQsMTkzLDI5LDE1OAorLmJ5dGUJMjI1LDI0OCwxNTIsMTcsMTA1LDIxNywxNDIsMTQ4CisuYnl0ZQkxNTUsMzAsMTM1LDIzMywyMDYsODUsNDAsMjIzCisuYnl0ZQkxNDAsMTYxLDEzNywxMywxOTEsMjMwLDY2LDEwNAorLmJ5dGUJNjUsMTUzLDQ1LDE1LDE3Niw4NCwxODcsMjIKKy5ieXRlCTk5LDEyNCwxMTksMTIzLDI0MiwxMDcsMTExLDE5NworLmJ5dGUJNDgsMSwxMDMsNDMsMjU0LDIxNSwxNzEsMTE4CisuYnl0ZQkyMDIsMTMwLDIwMSwxMjUsMjUwLDg5LDcxLDI0MAorLmJ5dGUJMTczLDIxMiwxNjIsMTc1LDE1NiwxNjQsMTE0LDE5MgorLmJ5dGUJMTgzLDI1MywxNDcsMzgsNTQsNjMsMjQ3LDIwNAorLmJ5dGUJNTIsMTY1LDIyOSwyNDEsMTEzLDIxNiw0OSwyMQorLmJ5dGUJNCwxOTksMzUsMTk1LDI0LDE1MCw1LDE1NAorLmJ5dGUJNywxOCwxMjgsMjI2LDIzNSwzOSwxNzgsMTE3CisuYnl0ZQk5LDEzMSw0NCwyNiwyNywxMTAsOTAsMTYwCisuYnl0ZQk4Miw1OSwyMTQsMTc5LDQxLDIyNyw0NywxMzIKKy5ieXRlCTgzLDIwOSwwLDIzNywzMiwyNTIsMTc3LDkxCisuYnl0ZQkxMDYsMjAzLDE5MCw1Nyw3NCw3Niw4OCwyMDcKKy5ieXRlCTIwOCwyMzksMTcwLDI1MSw2Nyw3Nyw1MSwxMzMKKy5ieXRlCTY5LDI0OSwyLDEyNyw4MCw2MCwxNTksMTY4CisuYnl0ZQk4MSwxNjMsNjQsMTQzLDE0NiwxNTcsNTYsMjQ1CisuYnl0ZQkxODgsMTgyLDIxOCwzMywxNiwyNTUsMjQzLDIxMAorLmJ5dGUJMjA1LDEyLDE5LDIzNiw5NSwxNTEsNjgsMjMKKy5ieXRlCTE5NiwxNjcsMTI2LDYxLDEwMCw5MywyNSwxMTUKKy5ieXRlCTk2LDEyOSw3OSwyMjAsMzQsNDIsMTQ0LDEzNgorLmJ5dGUJNzAsMjM4LDE4NCwyMCwyMjIsOTQsMTEsMjE5CisuYnl0ZQkyMjQsNTAsNTgsMTAsNzMsNiwzNiw5MgorLmJ5dGUJMTk0LDIxMSwxNzIsOTgsMTQ1LDE0OSwyMjgsMTIxCisuYnl0ZQkyMzEsMjAwLDU1LDEwOSwxNDEsMjEzLDc4LDE2OQorLmJ5dGUJMTA4LDg2LDI0NCwyMzQsMTAxLDEyMiwxNzQsOAorLmJ5dGUJMTg2LDEyMCwzNyw0NiwyOCwxNjYsMTgwLDE5OAorLmJ5dGUJMjMyLDIyMSwxMTYsMzEsNzUsMTg5LDEzOSwxMzgKKy5ieXRlCTExMiw2MiwxODEsMTAyLDcyLDMsMjQ2LDE0CisuYnl0ZQk5Nyw1Myw4NywxODUsMTM0LDE5MywyOSwxNTgKKy5ieXRlCTIyNSwyNDgsMTUyLDE3LDEwNSwyMTcsMTQyLDE0OAorLmJ5dGUJMTU1LDMwLDEzNSwyMzMsMjA2LDg1LDQwLDIyMworLmJ5dGUJMTQwLDE2MSwxMzcsMTMsMTkxLDIzMCw2NiwxMDQKKy5ieXRlCTY1LDE1Myw0NSwxNSwxNzYsODQsMTg3LDIyCisuYnl0ZQk5OSwxMjQsMTE5LDEyMywyNDIsMTA3LDExMSwxOTcKKy5ieXRlCTQ4LDEsMTAzLDQzLDI1NCwyMTUsMTcxLDExOAorLmJ5dGUJMjAyLDEzMCwyMDEsMTI1LDI1MCw4OSw3MSwyNDAKKy5ieXRlCTE3MywyMTIsMTYyLDE3NSwxNTYsMTY0LDExNCwxOTIKKy5ieXRlCTE4MywyNTMsMTQ3LDM4LDU0LDYzLDI0NywyMDQKKy5ieXRlCTUyLDE2NSwyMjksMjQxLDExMywyMTYsNDksMjEKKy5ieXRlCTQsMTk5LDM1LDE5NSwyNCwxNTAsNSwxNTQKKy5ieXRlCTcsMTgsMTI4LDIyNiwyMzUsMzksMTc4LDExNworLmJ5dGUJOSwxMzEsNDQsMjYsMjcsMTEwLDkwLDE2MAorLmJ5dGUJODIsNTksMjE0LDE3OSw0MSwyMjcsNDcsMTMyCisuYnl0ZQk4MywyMDksMCwyMzcsMzIsMjUyLDE3Nyw5MQorLmJ5dGUJMTA2LDIwMywxOTAsNTcsNzQsNzYsODgsMjA3CisuYnl0ZQkyMDgsMjM5LDE3MCwyNTEsNjcsNzcsNTEsMTMzCisuYnl0ZQk2OSwyNDksMiwxMjcsODAsNjAsMTU5LDE2OAorLmJ5dGUJODEsMTYzLDY0LDE0MywxNDYsMTU3LDU2LDI0NQorLmJ5dGUJMTg4LDE4MiwyMTgsMzMsMTYsMjU1LDI0MywyMTAKKy5ieXRlCTIwNSwxMiwxOSwyMzYsOTUsMTUxLDY4LDIzCisuYnl0ZQkxOTYsMTY3LDEyNiw2MSwxMDAsOTMsMjUsMTE1CisuYnl0ZQk5NiwxMjksNzksMjIwLDM0LDQyLDE0NCwxMzYKKy5ieXRlCTcwLDIzOCwxODQsMjAsMjIyLDk0LDExLDIxOQorLmJ5dGUJMjI0LDUwLDU4LDEwLDczLDYsMzYsOTIKKy5ieXRlCTE5NCwyMTEsMTcyLDk4LDE0NSwxNDksMjI4LDEyMQorLmJ5dGUJMjMxLDIwMCw1NSwxMDksMTQxLDIxMyw3OCwxNjkKKy5ieXRlCTEwOCw4NiwyNDQsMjM0LDEwMSwxMjIsMTc0LDgKKy5ieXRlCTE4NiwxMjAsMzcsNDYsMjgsMTY2LDE4MCwxOTgKKy5ieXRlCTIzMiwyMjEsMTE2LDMxLDc1LDE4OSwxMzksMTM4CisuYnl0ZQkxMTIsNjIsMTgxLDEwMiw3MiwzLDI0NiwxNAorLmJ5dGUJOTcsNTMsODcsMTg1LDEzNCwxOTMsMjksMTU4CisuYnl0ZQkyMjUsMjQ4LDE1MiwxNywxMDUsMjE3LDE0MiwxNDgKKy5ieXRlCTE1NSwzMCwxMzUsMjMzLDIwNiw4NSw0MCwyMjMKKy5ieXRlCTE0MCwxNjEsMTM3LDEzLDE5MSwyMzAsNjYsMTA0CisuYnl0ZQk2NSwxNTMsNDUsMTUsMTc2LDg0LDE4NywyMgorLmJ5dGUJOTksMTI0LDExOSwxMjMsMjQyLDEwNywxMTEsMTk3CisuYnl0ZQk0OCwxLDEwMyw0MywyNTQsMjE1LDE3MSwxMTgKKy5ieXRlCTIwMiwxMzAsMjAxLDEyNSwyNTAsODksNzEsMjQwCisuYnl0ZQkxNzMsMjEyLDE2MiwxNzUsMTU2LDE2NCwxMTQsMTkyCisuYnl0ZQkxODMsMjUzLDE0NywzOCw1NCw2MywyNDcsMjA0CisuYnl0ZQk1MiwxNjUsMjI5LDI0MSwxMTMsMjE2LDQ5LDIxCisuYnl0ZQk0LDE5OSwzNSwxOTUsMjQsMTUwLDUsMTU0CisuYnl0ZQk3LDE4LDEyOCwyMjYsMjM1LDM5LDE3OCwxMTcKKy5ieXRlCTksMTMxLDQ0LDI2LDI3LDExMCw5MCwxNjAKKy5ieXRlCTgyLDU5LDIxNCwxNzksNDEsMjI3LDQ3LDEzMgorLmJ5dGUJODMsMjA5LDAsMjM3LDMyLDI1MiwxNzcsOTEKKy5ieXRlCTEwNiwyMDMsMTkwLDU3LDc0LDc2LDg4LDIwNworLmJ5dGUJMjA4LDIzOSwxNzAsMjUxLDY3LDc3LDUxLDEzMworLmJ5dGUJNjksMjQ5LDIsMTI3LDgwLDYwLDE1OSwxNjgKKy5ieXRlCTgxLDE2Myw2NCwxNDMsMTQ2LDE1Nyw1NiwyNDUKKy5ieXRlCTE4OCwxODIsMjE4LDMzLDE2LDI1NSwyNDMsMjEwCisuYnl0ZQkyMDUsMTIsMTksMjM2LDk1LDE1MSw2OCwyMworLmJ5dGUJMTk2LDE2NywxMjYsNjEsMTAwLDkzLDI1LDExNQorLmJ5dGUJOTYsMTI5LDc5LDIyMCwzNCw0MiwxNDQsMTM2CisuYnl0ZQk3MCwyMzgsMTg0LDIwLDIyMiw5NCwxMSwyMTkKKy5ieXRlCTIyNCw1MCw1OCwxMCw3Myw2LDM2LDkyCisuYnl0ZQkxOTQsMjExLDE3Miw5OCwxNDUsMTQ5LDIyOCwxMjEKKy5ieXRlCTIzMSwyMDAsNTUsMTA5LDE0MSwyMTMsNzgsMTY5CisuYnl0ZQkxMDgsODYsMjQ0LDIzNCwxMDEsMTIyLDE3NCw4CisuYnl0ZQkxODYsMTIwLDM3LDQ2LDI4LDE2NiwxODAsMTk4CisuYnl0ZQkyMzIsMjIxLDExNiwzMSw3NSwxODksMTM5LDEzOAorLmJ5dGUJMTEyLDYyLDE4MSwxMDIsNzIsMywyNDYsMTQKKy5ieXRlCTk3LDUzLDg3LDE4NSwxMzQsMTkzLDI5LDE1OAorLmJ5dGUJMjI1LDI0OCwxNTIsMTcsMTA1LDIxNywxNDIsMTQ4CisuYnl0ZQkxNTUsMzAsMTM1LDIzMywyMDYsODUsNDAsMjIzCisuYnl0ZQkxNDAsMTYxLDEzNywxMywxOTEsMjMwLDY2LDEwNAorLmJ5dGUJNjUsMTUzLDQ1LDE1LDE3Niw4NCwxODcsMjIKKy5sb25nCTEsMiw0LDgKKy5sb25nCTE2LDMyLDY0LDEyOAorLmxvbmcJMjcsNTQsMCwwCisubG9uZwkwLDAsMCwwCisuc2l6ZQlfeDg2X0FFU19lbmNyeXB0LC4tX3g4Nl9BRVNfZW5jcnlwdAorLmdsb2JsCWFlc19ub2h3X2VuY3J5cHQKKy5oaWRkZW4JYWVzX25vaHdfZW5jcnlwdAorLnR5cGUJYWVzX25vaHdfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzX25vaHdfZW5jcnlwdDoKKy5MX2Flc19ub2h3X2VuY3J5cHRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVzcCwlZWF4CisJc3VibAkkMzYsJWVzcAorCWFuZGwJJC02NCwlZXNwCisJbGVhbAktMTI3KCVlZGkpLCVlYngKKwlzdWJsCSVlc3AsJWVieAorCW5lZ2wJJWVieAorCWFuZGwJJDk2MCwlZWJ4CisJc3VibAklZWJ4LCVlc3AKKwlhZGRsCSQ0LCVlc3AKKwltb3ZsCSVlYXgsMjgoJWVzcCkKKwljYWxsCS5MMDA0cGljX3BvaW50CisuTDAwNHBpY19wb2ludDoKKwlwb3BsCSVlYnAKKwlsZWFsCU9QRU5TU0xfaWEzMmNhcF9QLS5MMDA0cGljX3BvaW50KCVlYnApLCVlYXgKKwlsZWFsCS5MQUVTX1RlLS5MMDA0cGljX3BvaW50KCVlYnApLCVlYnAKKwlsZWFsCTc2NCglZXNwKSwlZWJ4CisJc3VibAklZWJwLCVlYngKKwlhbmRsCSQ3NjgsJWVieAorCWxlYWwJMjE3NiglZWJwLCVlYngsMSksJWVicAorCWJ0bAkkMjUsKCVlYXgpCisJam5jCS5MMDA1eDg2CisJbW92cQkoJWVzaSksJW1tMAorCW1vdnEJOCglZXNpKSwlbW00CisJY2FsbAlfc3NlX0FFU19lbmNyeXB0X2NvbXBhY3QKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZxCSVtbTAsKCVlc2kpCisJbW92cQklbW00LDgoJWVzaSkKKwllbW1zCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuYWxpZ24JMTYKKy5MMDA1eDg2OgorCW1vdmwJJWVicCwyNCglZXNwKQorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisJY2FsbAlfeDg2X0FFU19lbmNyeXB0X2NvbXBhY3QKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlY3gsOCglZXNpKQorCW1vdmwJJWVkeCwxMiglZXNpKQorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYWVzX25vaHdfZW5jcnlwdCwuLS5MX2Flc19ub2h3X2VuY3J5cHRfYmVnaW4KKy5oaWRkZW4JX3g4Nl9BRVNfZGVjcnlwdF9jb21wYWN0CisudHlwZQlfeDg2X0FFU19kZWNyeXB0X2NvbXBhY3QsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK194ODZfQUVTX2RlY3J5cHRfY29tcGFjdDoKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCW1vdmwJMjQwKCVlZGkpLCVlc2kKKwlsZWFsCS0yKCVlc2ksJWVzaSwxKSwlZXNpCisJbGVhbAkoJWVkaSwlZXNpLDgpLCVlc2kKKwltb3ZsCSVlc2ksMjQoJWVzcCkKKwltb3ZsCS0xMjgoJWVicCksJWVkaQorCW1vdmwJLTk2KCVlYnApLCVlc2kKKwltb3ZsCS02NCglZWJwKSwlZWRpCisJbW92bAktMzIoJWVicCksJWVzaQorCW1vdmwJKCVlYnApLCVlZGkKKwltb3ZsCTMyKCVlYnApLCVlc2kKKwltb3ZsCTY0KCVlYnApLCVlZGkKKwltb3ZsCTk2KCVlYnApLCVlc2kKKy5hbGlnbgkxNgorLkwwMDZsb29wOgorCW1vdmwJJWVheCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCW1vdmwJJWVieCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYWgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksOCglZXNwKQorCW1vdmwJJWVjeCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlhbmRsCSQyNTUsJWVkeAorCW1vdnpibAktMTI4KCVlYnAsJWVkeCwxKSwlZWR4CisJbW92emJsCSVjaCwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWN4LDEpLCVlY3gKKwlzaGxsCSQ4LCVlY3gKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVzaSwlZWN4CisJc2hybAkkMTYsJWVieAorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCS0xMjgoJWVicCwlZWJ4LDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlZHgKKwlzaHJsCSQyNCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZWF4LDEpLCVlYXgKKwlzaGxsCSQyNCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVjeCwlZWN4LDEpLCVlYXgKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVheAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZXNpLCVlYXgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlYngKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVieAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWN4LCVlYXgKKwl4b3JsCSVlc2ksJWVieAorCW1vdmwJJDIxNTU5MDUxNTIsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAklZWRpLCVlc2kKKwlzaHJsCSQ3LCVlZGkKKwlsZWFsCSglZWJ4LCVlYngsMSksJWVicAorCXN1YmwJJWVkaSwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJwCisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvbGwJJDgsJWVjeAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlYnAsJWVheAorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWJwLCVlYngKKwlyb2xsCSQyNCwlZWF4CisJeG9ybAklZWJwLCVlY3gKKwlyb2xsCSQxNiwlZWJ4CisJeG9ybAklZWF4LCVlY3gKKwlyb2xsCSQ4LCVlYnAKKwl4b3JsCSVlYngsJWVjeAorCW1vdmwJNCglZXNwKSwlZWF4CisJeG9ybAklZWJwLCVlY3gKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVkeCwlZWR4LDEpLCVlYngKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVieAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZXNpLCVlYngKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlYngsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVieCwlZWJ4LDEpLCVlY3gKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVjeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWR4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCW1vdmwJJDIxNTU5MDUxNTIsJWVkaQorCWFuZGwJJWVjeCwlZWRpCisJbW92bAklZWRpLCVlc2kKKwlzaHJsCSQ3LCVlZGkKKwlsZWFsCSglZWN4LCVlY3gsMSksJWVicAorCXN1YmwJJWVkaSwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJwCisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCXJvbGwJJDgsJWVkeAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAklZWJ4LCVlZHgKKwl4b3JsCSVlYnAsJWVieAorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZWJwLCVlY3gKKwlyb2xsCSQyNCwlZWJ4CisJeG9ybAklZWJwLCVlZHgKKwlyb2xsCSQxNiwlZWN4CisJeG9ybAklZWJ4LCVlZHgKKwlyb2xsCSQ4LCVlYnAKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZHgKKwltb3ZsCSVlZHgsMTYoJWVzcCkKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlY3gKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVjeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZXNpLCVlY3gKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVjeCwlZWN4LDEpLCVlZHgKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVkeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJDIxNTU5MDUxNTIsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbW92bAklZWRpLCVlc2kKKwlzaHJsCSQ3LCVlZGkKKwlsZWFsCSglZWR4LCVlZHgsMSksJWVicAorCXN1YmwJJWVkaSwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJwCisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlYXgsJWVkeAorCXJvbGwJJDgsJWVheAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlYXgKKwl4b3JsCSVlYnAsJWVjeAorCXhvcmwJJWVkeCwlZWF4CisJeG9ybAklZWJwLCVlZHgKKwlyb2xsCSQyNCwlZWN4CisJeG9ybAklZWJwLCVlYXgKKwlyb2xsCSQxNiwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwlyb2xsCSQ4LCVlYnAKKwl4b3JsCSVlZHgsJWVheAorCXhvcmwJJWVicCwlZWF4CisJbW92bAkkMjE1NTkwNTE1MiwlZWRpCisJYW5kbAklZWJ4LCVlZGkKKwltb3ZsCSVlZGksJWVzaQorCXNocmwJJDcsJWVkaQorCWxlYWwJKCVlYngsJWVieCwxKSwlZWN4CisJc3VibAklZWRpLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlY3gKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVzaSwlZWN4CisJbW92bAkkMjE1NTkwNTE1MiwlZWRpCisJYW5kbAklZWN4LCVlZGkKKwltb3ZsCSVlZGksJWVzaQorCXNocmwJJDcsJWVkaQorCWxlYWwJKCVlY3gsJWVjeCwxKSwlZWR4CisJc3VibAklZWRpLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlZHgKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVkeCwlZWR4LDEpLCVlYnAKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVicAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWJ4LCVlZHgKKwlyb2xsCSQ4LCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJeG9ybAklZWJwLCVlY3gKKwl4b3JsCSVlZHgsJWVieAorCXhvcmwJJWVicCwlZWR4CisJcm9sbAkkMjQsJWVjeAorCXhvcmwJJWVicCwlZWJ4CisJcm9sbAkkMTYsJWVkeAorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkOCwlZWJwCisJeG9ybAklZWR4LCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYnAsJWVieAorCW1vdmwJMTYoJWVzcCksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVicAorCWFkZGwJJDE2LCVlZGkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCWNtcGwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVkaSwyMCglZXNwKQorCWpiCS5MMDA2bG9vcAorCW1vdmwJJWVheCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCW1vdmwJJWVieCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYWgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksOCglZXNwKQorCW1vdmwJJWVjeCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCW1vdnpibAktMTI4KCVlYnAsJWVkeCwxKSwlZWR4CisJbW92emJsCSVjaCwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWN4LDEpLCVlY3gKKwlzaGxsCSQ4LCVlY3gKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVzaSwlZWN4CisJc2hybAkkMTYsJWVieAorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCS0xMjgoJWVicCwlZWJ4LDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVieAorCXNocmwJJDI0LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlYXgsMSksJWVheAorCXNobGwJJDI0LCVlYXgKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJNCglZXNwKSwlZWF4CisJeG9ybAkxNiglZWRpKSwlZWF4CisJeG9ybAkyMCglZWRpKSwlZWJ4CisJeG9ybAkyNCglZWRpKSwlZWN4CisJeG9ybAkyOCglZWRpKSwlZWR4CisJcmV0Cisuc2l6ZQlfeDg2X0FFU19kZWNyeXB0X2NvbXBhY3QsLi1feDg2X0FFU19kZWNyeXB0X2NvbXBhY3QKKy5oaWRkZW4JX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0CisudHlwZQlfc3NlX0FFU19kZWNyeXB0X2NvbXBhY3QsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19zc2VfQUVTX2RlY3J5cHRfY29tcGFjdDoKKwlweG9yCSglZWRpKSwlbW0wCisJcHhvcgk4KCVlZGkpLCVtbTQKKwltb3ZsCTI0MCglZWRpKSwlZXNpCisJbGVhbAktMiglZXNpLCVlc2ksMSksJWVzaQorCWxlYWwJKCVlZGksJWVzaSw4KSwlZXNpCisJbW92bAklZXNpLDI0KCVlc3ApCisJbW92bAkkNDU0NzYxMjQzLCVlYXgKKwltb3ZsCSVlYXgsOCglZXNwKQorCW1vdmwJJWVheCwxMiglZXNwKQorCW1vdmwJLTEyOCglZWJwKSwlZWF4CisJbW92bAktOTYoJWVicCksJWVieAorCW1vdmwJLTY0KCVlYnApLCVlY3gKKwltb3ZsCS0zMiglZWJwKSwlZWR4CisJbW92bAkoJWVicCksJWVheAorCW1vdmwJMzIoJWVicCksJWVieAorCW1vdmwJNjQoJWVicCksJWVjeAorCW1vdmwJOTYoJWVicCksJWVkeAorLmFsaWduCTE2CisuTDAwN2xvb3A6CisJcHNodWZ3CSQxMiwlbW0wLCVtbTEKKwlwc2h1ZncJJDksJW1tNCwlbW01CisJbW92ZAklbW0xLCVlYXgKKwltb3ZkCSVtbTUsJWVieAorCW1vdmwJJWVkaSwyMCglZXNwKQorCW1vdnpibAklYWwsJWVzaQorCW1vdnpibAklYWgsJWVkeAorCXBzaHVmdwkkNiwlbW0wLCVtbTIKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVjeAorCW1vdnpibAklYmwsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkeCwxKSwlZWR4CisJc2hybAkkMTYsJWVheAorCXNobGwJJDgsJWVkeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkMTYsJWVzaQorCXBzaHVmdwkkMywlbW00LCVtbTYKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwlzaGxsCSQyNCwlZXNpCisJc2hybAkkMTYsJWVieAorCW9ybAklZXNpLCVlZHgKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCXNobGwJJDI0LCVlc2kKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWFsLCVlZGkKKwlzaGxsCSQ4LCVlc2kKKwltb3ZkCSVtbTIsJWVheAorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmwsJWVkaQorCXNobGwJJDE2LCVlc2kKKwltb3ZkCSVtbTYsJWVieAorCW1vdmQJJWVjeCwlbW0wCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlY3gKKwltb3Z6YmwJJWFsLCVlZGkKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWJsLCVlZGkKKwlvcmwJJWVzaSwlZWR4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwlzaGxsCSQxNiwlZXNpCisJc2hybAkkMTYsJWVheAorCW9ybAklZXNpLCVlZHgKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCXNocmwJJDE2LCVlYngKKwlzaGxsCSQ4LCVlc2kKKwltb3ZkCSVlZHgsJW1tMQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWR4CisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkMjQsJWVkeAorCWFuZGwJJDI1NSwlZWJ4CisJb3JsCSVlc2ksJWVkeAorCXB1bnBja2xkcQklbW0xLCVtbTAKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYWwsJWVkaQorCXNobGwJJDgsJWVzaQorCW1vdnpibAklYWgsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVieCwxKSwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJb3JsCSVlYngsJWVkeAorCXNobGwJJDE2LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlYXgsMSksJWVheAorCW9ybAklZXNpLCVlZHgKKwlzaGxsCSQyNCwlZWF4CisJb3JsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmQJJWVkeCwlbW00CisJbW92ZAklZWN4LCVtbTUKKwlwdW5wY2tsZHEJJW1tNSwlbW00CisJYWRkbAkkMTYsJWVkaQorCWNtcGwJMjQoJWVzcCksJWVkaQorCWphCS5MMDA4b3V0CisJbW92cQklbW0wLCVtbTMKKwltb3ZxCSVtbTQsJW1tNworCXBzaHVmdwkkMjI4LCVtbTAsJW1tMgorCXBzaHVmdwkkMjI4LCVtbTQsJW1tNgorCW1vdnEJJW1tMCwlbW0xCisJbW92cQklbW00LCVtbTUKKwlwc2h1ZncJJDE3NywlbW0wLCVtbTAKKwlwc2h1ZncJJDE3NywlbW00LCVtbTQKKwlwc2xsZAkkOCwlbW0yCisJcHNsbGQJJDgsJW1tNgorCXBzcmxkCSQ4LCVtbTMKKwlwc3JsZAkkOCwlbW03CisJcHhvcgklbW0yLCVtbTAKKwlweG9yCSVtbTYsJW1tNAorCXB4b3IJJW1tMywlbW0wCisJcHhvcgklbW03LCVtbTQKKwlwc2xsZAkkMTYsJW1tMgorCXBzbGxkCSQxNiwlbW02CisJcHNybGQJJDE2LCVtbTMKKwlwc3JsZAkkMTYsJW1tNworCXB4b3IJJW1tMiwlbW0wCisJcHhvcgklbW02LCVtbTQKKwlweG9yCSVtbTMsJW1tMAorCXB4b3IJJW1tNywlbW00CisJbW92cQk4KCVlc3ApLCVtbTMKKwlweG9yCSVtbTIsJW1tMgorCXB4b3IJJW1tNiwlbW02CisJcGNtcGd0YgklbW0xLCVtbTIKKwlwY21wZ3RiCSVtbTUsJW1tNgorCXBhbmQJJW1tMywlbW0yCisJcGFuZAklbW0zLCVtbTYKKwlwYWRkYgklbW0xLCVtbTEKKwlwYWRkYgklbW01LCVtbTUKKwlweG9yCSVtbTIsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJbW92cQklbW0xLCVtbTMKKwltb3ZxCSVtbTUsJW1tNworCW1vdnEJJW1tMSwlbW0yCisJbW92cQklbW01LCVtbTYKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNSwlbW00CisJcHNsbGQJJDI0LCVtbTMKKwlwc2xsZAkkMjQsJW1tNworCXBzcmxkCSQ4LCVtbTIKKwlwc3JsZAkkOCwlbW02CisJcHhvcgklbW0zLCVtbTAKKwlweG9yCSVtbTcsJW1tNAorCXB4b3IJJW1tMiwlbW0wCisJcHhvcgklbW02LCVtbTQKKwltb3ZxCTgoJWVzcCksJW1tMgorCXB4b3IJJW1tMywlbW0zCisJcHhvcgklbW03LCVtbTcKKwlwY21wZ3RiCSVtbTEsJW1tMworCXBjbXBndGIJJW1tNSwlbW03CisJcGFuZAklbW0yLCVtbTMKKwlwYW5kCSVtbTIsJW1tNworCXBhZGRiCSVtbTEsJW1tMQorCXBhZGRiCSVtbTUsJW1tNQorCXB4b3IJJW1tMywlbW0xCisJcHhvcgklbW03LCVtbTUKKwlwc2h1ZncJJDE3NywlbW0xLCVtbTMKKwlwc2h1ZncJJDE3NywlbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNSwlbW00CisJcHhvcgklbW0zLCVtbTAKKwlweG9yCSVtbTcsJW1tNAorCXB4b3IJJW1tMywlbW0zCisJcHhvcgklbW03LCVtbTcKKwlwY21wZ3RiCSVtbTEsJW1tMworCXBjbXBndGIJJW1tNSwlbW03CisJcGFuZAklbW0yLCVtbTMKKwlwYW5kCSVtbTIsJW1tNworCXBhZGRiCSVtbTEsJW1tMQorCXBhZGRiCSVtbTUsJW1tNQorCXB4b3IJJW1tMywlbW0xCisJcHhvcgklbW03LCVtbTUKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNSwlbW00CisJbW92cQklbW0xLCVtbTMKKwltb3ZxCSVtbTUsJW1tNworCXBzaHVmdwkkMTc3LCVtbTEsJW1tMgorCXBzaHVmdwkkMTc3LCVtbTUsJW1tNgorCXB4b3IJJW1tMiwlbW0wCisJcHhvcgklbW02LCVtbTQKKwlwc2xsZAkkOCwlbW0xCisJcHNsbGQJJDgsJW1tNQorCXBzcmxkCSQ4LCVtbTMKKwlwc3JsZAkkOCwlbW03CisJbW92cQkoJWVkaSksJW1tMgorCW1vdnEJOCglZWRpKSwlbW02CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTUsJW1tNAorCXB4b3IJJW1tMywlbW0wCisJcHhvcgklbW03LCVtbTQKKwltb3ZsCS0xMjgoJWVicCksJWVheAorCXBzbGxkCSQxNiwlbW0xCisJcHNsbGQJJDE2LCVtbTUKKwltb3ZsCS02NCglZWJwKSwlZWJ4CisJcHNybGQJJDE2LCVtbTMKKwlwc3JsZAkkMTYsJW1tNworCW1vdmwJKCVlYnApLCVlY3gKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNSwlbW00CisJbW92bAk2NCglZWJwKSwlZWR4CisJcHhvcgklbW0zLCVtbTAKKwlweG9yCSVtbTcsJW1tNAorCXB4b3IJJW1tMiwlbW0wCisJcHhvcgklbW02LCVtbTQKKwlqbXAJLkwwMDdsb29wCisuYWxpZ24JMTYKKy5MMDA4b3V0OgorCXB4b3IJKCVlZGkpLCVtbTAKKwlweG9yCTgoJWVkaSksJW1tNAorCXJldAorLnNpemUJX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0LC4tX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0CisuaGlkZGVuCV94ODZfQUVTX2RlY3J5cHQKKy50eXBlCV94ODZfQUVTX2RlY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK194ODZfQUVTX2RlY3J5cHQ6CisJbW92bAklZWRpLDIwKCVlc3ApCisJeG9ybAkoJWVkaSksJWVheAorCXhvcmwJNCglZWRpKSwlZWJ4CisJeG9ybAk4KCVlZGkpLCVlY3gKKwl4b3JsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCTI0MCglZWRpKSwlZXNpCisJbGVhbAktMiglZXNpLCVlc2ksMSksJWVzaQorCWxlYWwJKCVlZGksJWVzaSw4KSwlZXNpCisJbW92bAklZXNpLDI0KCVlc3ApCisuYWxpZ24JMTYKKy5MMDA5bG9vcDoKKwltb3ZsCSVlYXgsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92bAkoJWVicCwlZXNpLDgpLCVlc2kKKwltb3Z6YmwJJWRoLCVlZGkKKwl4b3JsCTMoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCXhvcmwJMiglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVieCwlZWRpCisJc2hybAkkMjQsJWVkaQorCXhvcmwJMSglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVzaSw0KCVlc3ApCisKKwltb3ZsCSVlYngsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92bAkoJWVicCwlZXNpLDgpLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwl4b3JsCTMoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCXhvcmwJMiglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hybAkkMjQsJWVkaQorCXhvcmwJMSglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVzaSw4KCVlc3ApCisKKwltb3ZsCSVlY3gsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92bAkoJWVicCwlZXNpLDgpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwl4b3JsCTMoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCXhvcmwJMiglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMjQsJWVkaQorCXhvcmwJMSglZWJwLCVlZGksOCksJWVzaQorCisJbW92bAkyMCglZXNwKSwlZWRpCisJYW5kbAkkMjU1LCVlZHgKKwltb3ZsCSglZWJwLCVlZHgsOCksJWVkeAorCW1vdnpibAklY2gsJWVjeAorCXhvcmwJMyglZWJwLCVlY3gsOCksJWVkeAorCW1vdmwJJWVzaSwlZWN4CisJc2hybAkkMTYsJWVieAorCWFuZGwJJDI1NSwlZWJ4CisJeG9ybAkyKCVlYnAsJWVieCw4KSwlZWR4CisJbW92bAk4KCVlc3ApLCVlYngKKwlzaHJsCSQyNCwlZWF4CisJeG9ybAkxKCVlYnAsJWVheCw4KSwlZWR4CisJbW92bAk0KCVlc3ApLCVlYXgKKworCWFkZGwJJDE2LCVlZGkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCWNtcGwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVkaSwyMCglZXNwKQorCWpiCS5MMDA5bG9vcAorCWxlYWwJMjE3NiglZWJwKSwlZWJwCisJbW92bAktMTI4KCVlYnApLCVlZGkKKwltb3ZsCS05NiglZWJwKSwlZXNpCisJbW92bAktNjQoJWVicCksJWVkaQorCW1vdmwJLTMyKCVlYnApLCVlc2kKKwltb3ZsCSglZWJwKSwlZWRpCisJbW92bAkzMiglZWJwKSwlZXNpCisJbW92bAk2NCglZWJwKSwlZWRpCisJbW92bAk5NiglZWJwKSwlZXNpCisJbGVhbAktMTI4KCVlYnApLCVlYnAKKwltb3ZsCSVlYXgsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92emJsCSglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAkoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQ4LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCSglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDE2LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVieCwlZWRpCisJc2hybAkkMjQsJWVkaQorCW1vdnpibAkoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCW1vdmwJJWVieCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJKCVlYnAsJWVzaSwxKSwlZXNpCisJbW92emJsCSVhaCwlZWRpCisJbW92emJsCSglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDgsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwltb3Z6YmwJKCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCSglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVzaSw4KCVlc3ApCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdnpibAkoJWVicCwlZXNpLDEpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJKCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAkoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3Z6YmwJKCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMjQsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJYW5kbAkkMjU1LCVlZHgKKwltb3Z6YmwJKCVlYnAsJWVkeCwxKSwlZWR4CisJbW92emJsCSVjaCwlZWN4CisJbW92emJsCSglZWJwLCVlY3gsMSksJWVjeAorCXNobGwJJDgsJWVjeAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZXNpLCVlY3gKKwlzaHJsCSQxNiwlZWJ4CisJYW5kbAkkMjU1LCVlYngKKwltb3Z6YmwJKCVlYnAsJWVieCwxKSwlZWJ4CisJc2hsbAkkMTYsJWVieAorCXhvcmwJJWVieCwlZWR4CisJbW92bAk4KCVlc3ApLCVlYngKKwlzaHJsCSQyNCwlZWF4CisJbW92emJsCSglZWJwLCVlYXgsMSksJWVheAorCXNobGwJJDI0LCVlYXgKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJNCglZXNwKSwlZWF4CisJbGVhbAktMjA0OCglZWJwKSwlZWJwCisJYWRkbAkkMTYsJWVkaQorCXhvcmwJKCVlZGkpLCVlYXgKKwl4b3JsCTQoJWVkaSksJWVieAorCXhvcmwJOCglZWRpKSwlZWN4CisJeG9ybAkxMiglZWRpKSwlZWR4CisJcmV0CisuYWxpZ24JNjQKKy5MQUVTX1RkOgorLmxvbmcJMTM1MzE4NDMzNywxMzUzMTg0MzM3CisubG9uZwkxMzk5MTQ0ODMwLDEzOTkxNDQ4MzAKKy5sb25nCTMyODIzMTA5MzgsMzI4MjMxMDkzOAorLmxvbmcJMjUyMjc1MjgyNiwyNTIyNzUyODI2CisubG9uZwkzNDEyODMxMDM1LDM0MTI4MzEwMzUKKy5sb25nCTQwNDc4NzEyNjMsNDA0Nzg3MTI2MworLmxvbmcJMjg3NDczNTI3NiwyODc0NzM1Mjc2CisubG9uZwkyNDY2NTA1NTQ3LDI0NjY1MDU1NDcKKy5sb25nCTE0NDI0NTk2ODAsMTQ0MjQ1OTY4MAorLmxvbmcJNDEzNDM2ODk0MSw0MTM0MzY4OTQxCisubG9uZwkyNDQwNDgxOTI4LDI0NDA0ODE5MjgKKy5sb25nCTYyNTczODQ4NSw2MjU3Mzg0ODUKKy5sb25nCTQyNDIwMDczNzUsNDI0MjAwNzM3NQorLmxvbmcJMzYyMDQxNjE5NywzNjIwNDE2MTk3CisubG9uZwkyMTUxOTUzNzAyLDIxNTE5NTM3MDIKKy5sb25nCTI0MDk4NDk1MjUsMjQwOTg0OTUyNQorLmxvbmcJMTIzMDY4MDU0MiwxMjMwNjgwNTQyCisubG9uZwkxNzI5ODcwMzczLDE3Mjk4NzAzNzMKKy5sb25nCTI1NTExMTQzMDksMjU1MTExNDMwOQorLmxvbmcJMzc4NzUyMTYyOSwzNzg3NTIxNjI5CisubG9uZwk0MTIzNDM3MSw0MTIzNDM3MQorLmxvbmcJMzE3NzM4MTEzLDMxNzczODExMworLmxvbmcJMjc0NDYwMDIwNSwyNzQ0NjAwMjA1CisubG9uZwkzMzM4MjYxMzU1LDMzMzgyNjEzNTUKKy5sb25nCTM4ODE3OTk0MjcsMzg4MTc5OTQyNworLmxvbmcJMjUxMDA2NjE5NywyNTEwMDY2MTk3CisubG9uZwkzOTUwNjY5MjQ3LDM5NTA2NjkyNDcKKy5sb25nCTM2NjMyODY5MzMsMzY2MzI4NjkzMworLmxvbmcJNzYzNjA4Nzg4LDc2MzYwODc4OAorLmxvbmcJMzU0MjE4NTA0OCwzNTQyMTg1MDQ4CisubG9uZwk2OTQ4MDQ1NTMsNjk0ODA0NTUzCisubG9uZwkxMTU0MDA5NDg2LDExNTQwMDk0ODYKKy5sb25nCTE3ODc0MTMxMDksMTc4NzQxMzEwOQorLmxvbmcJMjAyMTIzMjM3MiwyMDIxMjMyMzcyCisubG9uZwkxNzk5MjQ4MDI1LDE3OTkyNDgwMjUKKy5sb25nCTM3MTUyMTc3MDMsMzcxNTIxNzcwMworLmxvbmcJMzA1ODY4ODQ0NiwzMDU4Njg4NDQ2CisubG9uZwkzOTcyNDg3NTIsMzk3MjQ4NzUyCisubG9uZwkxNzIyNTU2NjE3LDE3MjI1NTY2MTcKKy5sb25nCTMwMjM3NTI4MjksMzAyMzc1MjgyOQorLmxvbmcJNDA3NTYwMDM1LDQwNzU2MDAzNQorLmxvbmcJMjE4NDI1NjIyOSwyMTg0MjU2MjI5CisubG9uZwkxNjEzOTc1OTU5LDE2MTM5NzU5NTkKKy5sb25nCTExNjU5NzIzMjIsMTE2NTk3MjMyMgorLmxvbmcJMzc2NTkyMDk0NSwzNzY1OTIwOTQ1CisubG9uZwkyMjI2MDIzMzU1LDIyMjYwMjMzNTUKKy5sb25nCTQ4MDI4MTA4Niw0ODAyODEwODYKKy5sb25nCTI0ODU4NDgzMTMsMjQ4NTg0ODMxMworLmxvbmcJMTQ4MzIyOTI5NiwxNDgzMjI5Mjk2CisubG9uZwk0MzYwMjg4MTUsNDM2MDI4ODE1CisubG9uZwkyMjcyMDU5MDI4LDIyNzIwNTkwMjgKKy5sb25nCTMwODY1MTUwMjYsMzA4NjUxNTAyNgorLmxvbmcJNjAxMDYwMjY3LDYwMTA2MDI2NworLmxvbmcJMzc5MTgwMTIwMiwzNzkxODAxMjAyCisubG9uZwkxNDY4OTk3NjAzLDE0Njg5OTc2MDMKKy5sb25nCTcxNTg3MTU5MCw3MTU4NzE1OTAKKy5sb25nCTEyMDEyMjI5MCwxMjAxMjIyOTAKKy5sb25nCTYzMDkyMDE1LDYzMDkyMDE1CisubG9uZwkyNTkxODAyNzU4LDI1OTE4MDI3NTgKKy5sb25nCTI3Njg3NzkyMTksMjc2ODc3OTIxOQorLmxvbmcJNDA2ODk0MzkyMCw0MDY4OTQzOTIwCisubG9uZwkyOTk3MjA2ODE5LDI5OTcyMDY4MTkKKy5sb25nCTMxMjc1MDk3NjIsMzEyNzUwOTc2MgorLmxvbmcJMTU1MjAyOTQyMSwxNTUyMDI5NDIxCisubG9uZwk3MjMzMDg0MjYsNzIzMzA4NDI2CisubG9uZwkyNDYxMzAxMTU5LDI0NjEzMDExNTkKKy5sb25nCTQwNDIzOTM1ODcsNDA0MjM5MzU4NworLmxvbmcJMjcxNTk2OTg3MCwyNzE1OTY5ODcwCisubG9uZwkzNDU1Mzc1OTczLDM0NTUzNzU5NzMKKy5sb25nCTM1ODYwMDAxMzQsMzU4NjAwMDEzNAorLmxvbmcJNTI2NTI5NzQ1LDUyNjUyOTc0NQorLmxvbmcJMjMzMTk0NDY0NCwyMzMxOTQ0NjQ0CisubG9uZwkyNjM5NDc0MjI4LDI2Mzk0NzQyMjgKKy5sb25nCTI2ODk5ODc0OTAsMjY4OTk4NzQ5MAorLmxvbmcJODUzNjQxNzMzLDg1MzY0MTczMworLmxvbmcJMTk3ODM5ODM3MiwxOTc4Mzk4MzcyCisubG9uZwk5NzE4MDEzNTUsOTcxODAxMzU1CisubG9uZwkyODY3ODE0NDY0LDI4Njc4MTQ0NjQKKy5sb25nCTExMTExMjU0MiwxMTExMTI1NDIKKy5sb25nCTEzNjAwMzE0MjEsMTM2MDAzMTQyMQorLmxvbmcJNDE4NjU3OTI2Miw0MTg2NTc5MjYyCisubG9uZwkxMDIzODYwMTE4LDEwMjM4NjAxMTgKKy5sb25nCTI5MTk1NzkzNTcsMjkxOTU3OTM1NworLmxvbmcJMTE4Njg1MDM4MSwxMTg2ODUwMzgxCisubG9uZwkzMDQ1OTM4MzIxLDMwNDU5MzgzMjEKKy5sb25nCTkwMDMxMjE3LDkwMDMxMjE3CisubG9uZwkxODc2MTY2MTQ4LDE4NzYxNjYxNDgKKy5sb25nCTQyNzk1ODY5MTIsNDI3OTU4NjkxMgorLmxvbmcJNjIwNDY4MjQ5LDYyMDQ2ODI0OQorLmxvbmcJMjU0ODY3ODEwMiwyNTQ4Njc4MTAyCisubG9uZwkzNDI2OTU5NDk3LDM0MjY5NTk0OTcKKy5sb25nCTIwMDY4OTkwNDcsMjAwNjg5OTA0NworLmxvbmcJMzE3NTI3ODc2OCwzMTc1Mjc4NzY4CisubG9uZwkyMjkwODQ1OTU5LDIyOTA4NDU5NTkKKy5sb25nCTk0NTQ5NDUwMyw5NDU0OTQ1MDMKKy5sb25nCTM2ODk4NTkxOTMsMzY4OTg1OTE5MworLmxvbmcJMTE5MTg2OTYwMSwxMTkxODY5NjAxCisubG9uZwkzOTEwMDkxMzg4LDM5MTAwOTEzODgKKy5sb25nCTMzNzQyMjA1MzYsMzM3NDIyMDUzNgorLmxvbmcJMCwwCisubG9uZwkyMjA2NjI5ODk3LDIyMDY2Mjk4OTcKKy5sb25nCTEyMjM1MDI2NDIsMTIyMzUwMjY0MgorLmxvbmcJMjg5MzAyNTU2NiwyODkzMDI1NTY2CisubG9uZwkxMzE2MTE3MTAwLDEzMTYxMTcxMDAKKy5sb25nCTQyMjc3OTY3MzMsNDIyNzc5NjczMworLmxvbmcJMTQ0NjU0NDY1NSwxNDQ2NTQ0NjU1CisubG9uZwk1MTczMjAyNTMsNTE3MzIwMjUzCisubG9uZwk2NTgwNTg1NTAsNjU4MDU4NTUwCisubG9uZwkxNjkxOTQ2NzYyLDE2OTE5NDY3NjIKKy5sb25nCTU2NDU1MDc2MCw1NjQ1NTA3NjAKKy5sb25nCTM1MTE5NjY2MTksMzUxMTk2NjYxOQorLmxvbmcJOTc2MTA3MDQ0LDk3NjEwNzA0NAorLmxvbmcJMjk3NjMyMDAxMiwyOTc2MzIwMDEyCisubG9uZwkyNjY4MTk0NzUsMjY2ODE5NDc1CisubG9uZwkzNTMzMTA2ODY4LDM1MzMxMDY4NjgKKy5sb25nCTI2NjAzNDI1NTUsMjY2MDM0MjU1NQorLmxvbmcJMTMzODM1OTkzNiwxMzM4MzU5OTM2CisubG9uZwkyNzIwMDYyNTYxLDI3MjAwNjI1NjEKKy5sb25nCTE3NjY1NTM0MzQsMTc2NjU1MzQzNAorLmxvbmcJMzcwODA3MzI0LDM3MDgwNzMyNAorLmxvbmcJMTc5OTk5NzE0LDE3OTk5OTcxNAorLmxvbmcJMzg0NDc3NjEyOCwzODQ0Nzc2MTI4CisubG9uZwkxMTM4NzYyMzAwLDExMzg3NjIzMDAKKy5sb25nCTQ4ODA1MzUyMiw0ODgwNTM1MjIKKy5sb25nCTE4NTQwMzY2MiwxODU0MDM2NjIKKy5sb25nCTI5MTU1MzU4NTgsMjkxNTUzNTg1OAorLmxvbmcJMzExNDg0MTY0NSwzMTE0ODQxNjQ1CisubG9uZwkzMzY2NTI2NDg0LDMzNjY1MjY0ODQKKy5sb25nCTIyMzMwNjk5MTEsMjIzMzA2OTkxMQorLmxvbmcJMTI3NTU1NzI5NSwxMjc1NTU3Mjk1CisubG9uZwkzMTUxODYyMjU0LDMxNTE4NjIyNTQKKy5sb25nCTQyNTA5NTk3NzksNDI1MDk1OTc3OQorLmxvbmcJMjY3MDA2ODIxNSwyNjcwMDY4MjE1CisubG9uZwkzMTcwMjAyMjA0LDMxNzAyMDIyMDQKKy5sb25nCTMzMDkwMDQzNTYsMzMwOTAwNDM1NgorLmxvbmcJODgwNzM3MTE1LDg4MDczNzExNQorLmxvbmcJMTk4MjQxNTc1NSwxOTgyNDE1NzU1CisubG9uZwkzNzAzOTcyODExLDM3MDM5NzI4MTEKKy5sb25nCTE3NjE0MDYzOTAsMTc2MTQwNjM5MAorLmxvbmcJMTY3Njc5NzExMiwxNjc2Nzk3MTEyCisubG9uZwkzNDAzNDI4MzExLDM0MDM0MjgzMTEKKy5sb25nCTI3NzE3NzE1NCwyNzcxNzcxNTQKKy5sb25nCTEwNzYwMDg3MjMsMTA3NjAwODcyMworLmxvbmcJNTM4MDM1ODQ0LDUzODAzNTg0NAorLmxvbmcJMjA5OTUzMDM3MywyMDk5NTMwMzczCisubG9uZwk0MTY0Nzk1MzQ2LDQxNjQ3OTUzNDYKKy5sb25nCTI4ODU1MzM5MCwyODg1NTMzOTAKKy5sb25nCTE4MzkyNzg1MzUsMTgzOTI3ODUzNQorLmxvbmcJMTI2MTQxMTg2OSwxMjYxNDExODY5CisubG9uZwk0MDgwMDU1MDA0LDQwODAwNTUwMDQKKy5sb25nCTM5NjQ4MzEyNDUsMzk2NDgzMTI0NQorLmxvbmcJMzUwNDU4NzEyNywzNTA0NTg3MTI3CisubG9uZwkxODEzNDI2OTg3LDE4MTM0MjY5ODcKKy5sb25nCTI1NzkwNjcwNDksMjU3OTA2NzA0OQorLmxvbmcJNDE5OTA2MDQ5Nyw0MTk5MDYwNDk3CisubG9uZwk1NzcwMzg2NjMsNTc3MDM4NjYzCisubG9uZwkzMjk3NTc0MDU2LDMyOTc1NzQwNTYKKy5sb25nCTQ0MDM5Nzk4NCw0NDAzOTc5ODQKKy5sb25nCTM2MjY3OTQzMjYsMzYyNjc5NDMyNgorLmxvbmcJNDAxOTIwNDg5OCw0MDE5MjA0ODk4CisubG9uZwkzMzQzNzk2NjE1LDMzNDM3OTY2MTUKKy5sb25nCTMyNTE3MTQyNjUsMzI1MTcxNDI2NQorLmxvbmcJNDI3MjA4MTU0OCw0MjcyMDgxNTQ4CisubG9uZwk5MDY3NDQ5ODQsOTA2NzQ0OTg0CisubG9uZwkzNDgxNDAwNzQyLDM0ODE0MDA3NDIKKy5sb25nCTY4NTY2OTAyOSw2ODU2NjkwMjkKKy5sb25nCTY0Njg4NzM4Niw2NDY4ODczODYKKy5sb25nCTI3NjQwMjUxNTEsMjc2NDAyNTE1MQorLmxvbmcJMzgzNTUwOTI5MiwzODM1NTA5MjkyCisubG9uZwkyMjc3MDI4NjQsMjI3NzAyODY0CisubG9uZwkyNjEzODYyMjUwLDI2MTM4NjIyNTAKKy5sb25nCTE2NDg3ODcwMjgsMTY0ODc4NzAyOAorLmxvbmcJMzI1NjA2MTQzMCwzMjU2MDYxNDMwCisubG9uZwkzOTA0NDI4MTc2LDM5MDQ0MjgxNzYKKy5sb25nCTE1OTMyNjAzMzQsMTU5MzI2MDMzNAorLmxvbmcJNDEyMTkzNjc3MCw0MTIxOTM2NzcwCisubG9uZwkzMTk2MDgzNjE1LDMxOTYwODM2MTUKKy5sb25nCTIwOTAwNjE5MjksMjA5MDA2MTkyOQorLmxvbmcJMjgzODM1MzI2MywyODM4MzUzMjYzCisubG9uZwkzMDA0MzEwOTkxLDMwMDQzMTA5OTEKKy5sb25nCTk5OTkyNjk4NCw5OTk5MjY5ODQKKy5sb25nCTI4MDk5OTMyMzIsMjgwOTk5MzIzMgorLmxvbmcJMTg1MjAyMTk5MiwxODUyMDIxOTkyCisubG9uZwkyMDc1ODY4MTIzLDIwNzU4NjgxMjMKKy5sb25nCTE1ODg2OTE5NywxNTg4NjkxOTcKKy5sb25nCTQwOTUyMzY0NjIsNDA5NTIzNjQ2MgorLmxvbmcJMjg4MDk5NjQsMjg4MDk5NjQKKy5sb25nCTI4Mjg2ODUxODcsMjgyODY4NTE4NworLmxvbmcJMTcwMTc0NjE1MCwxNzAxNzQ2MTUwCisubG9uZwkyMTI5MDY3OTQ2LDIxMjkwNjc5NDYKKy5sb25nCTE0NzgzMTg0MSwxNDc4MzE4NDEKKy5sb25nCTM4NzM5Njk2NDcsMzg3Mzk2OTY0NworLmxvbmcJMzY1MDg3MzI3NCwzNjUwODczMjc0CisubG9uZwkzNDU5NjczOTMwLDM0NTk2NzM5MzAKKy5sb25nCTM1NTc0MDA1NTQsMzU1NzQwMDU1NAorLmxvbmcJMzU5ODQ5NTc4NSwzNTk4NDk1Nzg1CisubG9uZwkyOTQ3NzIwMjQxLDI5NDc3MjAyNDEKKy5sb25nCTgyNDM5MzUxNCw4MjQzOTM1MTQKKy5sb25nCTgxNTA0ODEzNCw4MTUwNDgxMzQKKy5sb25nCTMyMjc5NTE2NjksMzIyNzk1MTY2OQorLmxvbmcJOTM1MDg3NzMyLDkzNTA4NzczMgorLmxvbmcJMjc5ODI4OTY2MCwyNzk4Mjg5NjYwCisubG9uZwkyOTY2NDU4NTkyLDI5NjY0NTg1OTIKKy5sb25nCTM2NjUyMDExNSwzNjY1MjAxMTUKKy5sb25nCTEyNTE0NzY3MjEsMTI1MTQ3NjcyMQorLmxvbmcJNDE1ODMxOTY4MSw0MTU4MzE5NjgxCisubG9uZwkyNDAxNzY1MTEsMjQwMTc2NTExCisubG9uZwk4MDQ2ODgxNTEsODA0Njg4MTUxCisubG9uZwkyMzc5NjMxOTkwLDIzNzk2MzE5OTAKKy5sb25nCTEzMDM0NDEyMTksMTMwMzQ0MTIxOQorLmxvbmcJMTQxNDM3NjE0MCwxNDE0Mzc2MTQwCisubG9uZwkzNzQxNjE5OTQwLDM3NDE2MTk5NDAKKy5sb25nCTM4MjAzNDM3MTAsMzgyMDM0MzcxMAorLmxvbmcJNDYxOTI0OTQwLDQ2MTkyNDk0MAorLmxvbmcJMzA4OTA1MDgxNywzMDg5MDUwODE3CisubG9uZwkyMTM2MDQwNzc0LDIxMzYwNDA3NzQKKy5sb25nCTgyNDY4NTA5LDgyNDY4NTA5CisubG9uZwkxNTYzNzkwMzM3LDE1NjM3OTAzMzcKKy5sb25nCTE5MzcwMTY4MjYsMTkzNzAxNjgyNgorLmxvbmcJNzc2MDE0ODQzLDc3NjAxNDg0MworLmxvbmcJMTUxMTg3NjUzMSwxNTExODc2NTMxCisubG9uZwkxMzg5NTUwNDgyLDEzODk1NTA0ODIKKy5sb25nCTg2MTI3ODQ0MSw4NjEyNzg0NDEKKy5sb25nCTMyMzQ3NTA1MywzMjM0NzUwNTMKKy5sb25nCTIzNTUyMjI0MjYsMjM1NTIyMjQyNgorLmxvbmcJMjA0NzY0ODA1NSwyMDQ3NjQ4MDU1CisubG9uZwkyMzgzNzM4OTY5LDIzODM3Mzg5NjkKKy5sb25nCTIzMDI0MTU4NTEsMjMwMjQxNTg1MQorLmxvbmcJMzk5NTU3Njc4MiwzOTk1NTc2NzgyCisubG9uZwk5MDIzOTAxOTksOTAyMzkwMTk5CisubG9uZwkzOTkxMjE1MzI5LDM5OTEyMTUzMjkKKy5sb25nCTEwMTgyNTExMzAsMTAxODI1MTEzMAorLmxvbmcJMTUwNzg0MDY2OCwxNTA3ODQwNjY4CisubG9uZwkxMDY0NTYzMjg1LDEwNjQ1NjMyODUKKy5sb25nCTIwNDM1NDg2OTYsMjA0MzU0ODY5NgorLmxvbmcJMzIwODEwMzc5NSwzMjA4MTAzNzk1CisubG9uZwkzOTM5MzY2NzM5LDM5MzkzNjY3MzkKKy5sb25nCTE1Mzc5MzI2MzksMTUzNzkzMjYzOQorLmxvbmcJMzQyODM0NjU1LDM0MjgzNDY1NQorLmxvbmcJMjI2MjUxNjg1NiwyMjYyNTE2ODU2CisubG9uZwkyMTgwMjMxMTE0LDIxODAyMzExMTQKKy5sb25nCTEwNTMwNTkyNTcsMTA1MzA1OTI1NworLmxvbmcJNzQxNjE0NjQ4LDc0MTYxNDY0OAorLmxvbmcJMTU5ODA3MTc0NiwxNTk4MDcxNzQ2CisubG9uZwkxOTI1Mzg5NTkwLDE5MjUzODk1OTAKKy5sb25nCTIwMzgwOTQ2OCwyMDM4MDk0NjgKKy5sb25nCTIzMzY4MzI1NTIsMjMzNjgzMjU1MgorLmxvbmcJMTEwMDI4NzQ4NywxMTAwMjg3NDg3CisubG9uZwkxODk1OTM0MDA5LDE4OTU5MzQwMDkKKy5sb25nCTM3MzYyNzU5NzYsMzczNjI3NTk3NgorLmxvbmcJMjYzMjIzNDIwMCwyNjMyMjM0MjAwCisubG9uZwkyNDI4NTg5NjY4LDI0Mjg1ODk2NjgKKy5sb25nCTE2MzYwOTI3OTUsMTYzNjA5Mjc5NQorLmxvbmcJMTg5MDk4ODc1NywxODkwOTg4NzU3CisubG9uZwkxOTUyMjE0MDg4LDE5NTIyMTQwODgKKy5sb25nCTExMTMwNDUyMDAsMTExMzA0NTIwMAorLmJ5dGUJODIsOSwxMDYsMjEzLDQ4LDU0LDE2NSw1NgorLmJ5dGUJMTkxLDY0LDE2MywxNTgsMTI5LDI0MywyMTUsMjUxCisuYnl0ZQkxMjQsMjI3LDU3LDEzMCwxNTUsNDcsMjU1LDEzNQorLmJ5dGUJNTIsMTQyLDY3LDY4LDE5NiwyMjIsMjMzLDIwMworLmJ5dGUJODQsMTIzLDE0OCw1MCwxNjYsMTk0LDM1LDYxCisuYnl0ZQkyMzgsNzYsMTQ5LDExLDY2LDI1MCwxOTUsNzgKKy5ieXRlCTgsNDYsMTYxLDEwMiw0MCwyMTcsMzYsMTc4CisuYnl0ZQkxMTgsOTEsMTYyLDczLDEwOSwxMzksMjA5LDM3CisuYnl0ZQkxMTQsMjQ4LDI0NiwxMDAsMTM0LDEwNCwxNTIsMjIKKy5ieXRlCTIxMiwxNjQsOTIsMjA0LDkzLDEwMSwxODIsMTQ2CisuYnl0ZQkxMDgsMTEyLDcyLDgwLDI1MywyMzcsMTg1LDIxOAorLmJ5dGUJOTQsMjEsNzAsODcsMTY3LDE0MSwxNTcsMTMyCisuYnl0ZQkxNDQsMjE2LDE3MSwwLDE0MCwxODgsMjExLDEwCisuYnl0ZQkyNDcsMjI4LDg4LDUsMTg0LDE3OSw2OSw2CisuYnl0ZQkyMDgsNDQsMzAsMTQzLDIwMiw2MywxNSwyCisuYnl0ZQkxOTMsMTc1LDE4OSwzLDEsMTksMTM4LDEwNworLmJ5dGUJNTgsMTQ1LDE3LDY1LDc5LDEwMywyMjAsMjM0CisuYnl0ZQkxNTEsMjQyLDIwNywyMDYsMjQwLDE4MCwyMzAsMTE1CisuYnl0ZQkxNTAsMTcyLDExNiwzNCwyMzEsMTczLDUzLDEzMworLmJ5dGUJMjI2LDI0OSw1NSwyMzIsMjgsMTE3LDIyMywxMTAKKy5ieXRlCTcxLDI0MSwyNiwxMTMsMjksNDEsMTk3LDEzNworLmJ5dGUJMTExLDE4Myw5OCwxNCwxNzAsMjQsMTkwLDI3CisuYnl0ZQkyNTIsODYsNjIsNzUsMTk4LDIxMCwxMjEsMzIKKy5ieXRlCTE1NCwyMTksMTkyLDI1NCwxMjAsMjA1LDkwLDI0NAorLmJ5dGUJMzEsMjIxLDE2OCw1MSwxMzYsNywxOTksNDkKKy5ieXRlCTE3NywxOCwxNiw4OSwzOSwxMjgsMjM2LDk1CisuYnl0ZQk5Niw4MSwxMjcsMTY5LDI1LDE4MSw3NCwxMworLmJ5dGUJNDUsMjI5LDEyMiwxNTksMTQ3LDIwMSwxNTYsMjM5CisuYnl0ZQkxNjAsMjI0LDU5LDc3LDE3NCw0MiwyNDUsMTc2CisuYnl0ZQkyMDAsMjM1LDE4Nyw2MCwxMzEsODMsMTUzLDk3CisuYnl0ZQkyMyw0Myw0LDEyNiwxODYsMTE5LDIxNCwzOAorLmJ5dGUJMjI1LDEwNSwyMCw5OSw4NSwzMywxMiwxMjUKKy5ieXRlCTgyLDksMTA2LDIxMyw0OCw1NCwxNjUsNTYKKy5ieXRlCTE5MSw2NCwxNjMsMTU4LDEyOSwyNDMsMjE1LDI1MQorLmJ5dGUJMTI0LDIyNyw1NywxMzAsMTU1LDQ3LDI1NSwxMzUKKy5ieXRlCTUyLDE0Miw2Nyw2OCwxOTYsMjIyLDIzMywyMDMKKy5ieXRlCTg0LDEyMywxNDgsNTAsMTY2LDE5NCwzNSw2MQorLmJ5dGUJMjM4LDc2LDE0OSwxMSw2NiwyNTAsMTk1LDc4CisuYnl0ZQk4LDQ2LDE2MSwxMDIsNDAsMjE3LDM2LDE3OAorLmJ5dGUJMTE4LDkxLDE2Miw3MywxMDksMTM5LDIwOSwzNworLmJ5dGUJMTE0LDI0OCwyNDYsMTAwLDEzNCwxMDQsMTUyLDIyCisuYnl0ZQkyMTIsMTY0LDkyLDIwNCw5MywxMDEsMTgyLDE0NgorLmJ5dGUJMTA4LDExMiw3Miw4MCwyNTMsMjM3LDE4NSwyMTgKKy5ieXRlCTk0LDIxLDcwLDg3LDE2NywxNDEsMTU3LDEzMgorLmJ5dGUJMTQ0LDIxNiwxNzEsMCwxNDAsMTg4LDIxMSwxMAorLmJ5dGUJMjQ3LDIyOCw4OCw1LDE4NCwxNzksNjksNgorLmJ5dGUJMjA4LDQ0LDMwLDE0MywyMDIsNjMsMTUsMgorLmJ5dGUJMTkzLDE3NSwxODksMywxLDE5LDEzOCwxMDcKKy5ieXRlCTU4LDE0NSwxNyw2NSw3OSwxMDMsMjIwLDIzNAorLmJ5dGUJMTUxLDI0MiwyMDcsMjA2LDI0MCwxODAsMjMwLDExNQorLmJ5dGUJMTUwLDE3MiwxMTYsMzQsMjMxLDE3Myw1MywxMzMKKy5ieXRlCTIyNiwyNDksNTUsMjMyLDI4LDExNywyMjMsMTEwCisuYnl0ZQk3MSwyNDEsMjYsMTEzLDI5LDQxLDE5NywxMzcKKy5ieXRlCTExMSwxODMsOTgsMTQsMTcwLDI0LDE5MCwyNworLmJ5dGUJMjUyLDg2LDYyLDc1LDE5OCwyMTAsMTIxLDMyCisuYnl0ZQkxNTQsMjE5LDE5MiwyNTQsMTIwLDIwNSw5MCwyNDQKKy5ieXRlCTMxLDIyMSwxNjgsNTEsMTM2LDcsMTk5LDQ5CisuYnl0ZQkxNzcsMTgsMTYsODksMzksMTI4LDIzNiw5NQorLmJ5dGUJOTYsODEsMTI3LDE2OSwyNSwxODEsNzQsMTMKKy5ieXRlCTQ1LDIyOSwxMjIsMTU5LDE0NywyMDEsMTU2LDIzOQorLmJ5dGUJMTYwLDIyNCw1OSw3NywxNzQsNDIsMjQ1LDE3NgorLmJ5dGUJMjAwLDIzNSwxODcsNjAsMTMxLDgzLDE1Myw5NworLmJ5dGUJMjMsNDMsNCwxMjYsMTg2LDExOSwyMTQsMzgKKy5ieXRlCTIyNSwxMDUsMjAsOTksODUsMzMsMTIsMTI1CisuYnl0ZQk4Miw5LDEwNiwyMTMsNDgsNTQsMTY1LDU2CisuYnl0ZQkxOTEsNjQsMTYzLDE1OCwxMjksMjQzLDIxNSwyNTEKKy5ieXRlCTEyNCwyMjcsNTcsMTMwLDE1NSw0NywyNTUsMTM1CisuYnl0ZQk1MiwxNDIsNjcsNjgsMTk2LDIyMiwyMzMsMjAzCisuYnl0ZQk4NCwxMjMsMTQ4LDUwLDE2NiwxOTQsMzUsNjEKKy5ieXRlCTIzOCw3NiwxNDksMTEsNjYsMjUwLDE5NSw3OAorLmJ5dGUJOCw0NiwxNjEsMTAyLDQwLDIxNywzNiwxNzgKKy5ieXRlCTExOCw5MSwxNjIsNzMsMTA5LDEzOSwyMDksMzcKKy5ieXRlCTExNCwyNDgsMjQ2LDEwMCwxMzQsMTA0LDE1MiwyMgorLmJ5dGUJMjEyLDE2NCw5MiwyMDQsOTMsMTAxLDE4MiwxNDYKKy5ieXRlCTEwOCwxMTIsNzIsODAsMjUzLDIzNywxODUsMjE4CisuYnl0ZQk5NCwyMSw3MCw4NywxNjcsMTQxLDE1NywxMzIKKy5ieXRlCTE0NCwyMTYsMTcxLDAsMTQwLDE4OCwyMTEsMTAKKy5ieXRlCTI0NywyMjgsODgsNSwxODQsMTc5LDY5LDYKKy5ieXRlCTIwOCw0NCwzMCwxNDMsMjAyLDYzLDE1LDIKKy5ieXRlCTE5MywxNzUsMTg5LDMsMSwxOSwxMzgsMTA3CisuYnl0ZQk1OCwxNDUsMTcsNjUsNzksMTAzLDIyMCwyMzQKKy5ieXRlCTE1MSwyNDIsMjA3LDIwNiwyNDAsMTgwLDIzMCwxMTUKKy5ieXRlCTE1MCwxNzIsMTE2LDM0LDIzMSwxNzMsNTMsMTMzCisuYnl0ZQkyMjYsMjQ5LDU1LDIzMiwyOCwxMTcsMjIzLDExMAorLmJ5dGUJNzEsMjQxLDI2LDExMywyOSw0MSwxOTcsMTM3CisuYnl0ZQkxMTEsMTgzLDk4LDE0LDE3MCwyNCwxOTAsMjcKKy5ieXRlCTI1Miw4Niw2Miw3NSwxOTgsMjEwLDEyMSwzMgorLmJ5dGUJMTU0LDIxOSwxOTIsMjU0LDEyMCwyMDUsOTAsMjQ0CisuYnl0ZQkzMSwyMjEsMTY4LDUxLDEzNiw3LDE5OSw0OQorLmJ5dGUJMTc3LDE4LDE2LDg5LDM5LDEyOCwyMzYsOTUKKy5ieXRlCTk2LDgxLDEyNywxNjksMjUsMTgxLDc0LDEzCisuYnl0ZQk0NSwyMjksMTIyLDE1OSwxNDcsMjAxLDE1NiwyMzkKKy5ieXRlCTE2MCwyMjQsNTksNzcsMTc0LDQyLDI0NSwxNzYKKy5ieXRlCTIwMCwyMzUsMTg3LDYwLDEzMSw4MywxNTMsOTcKKy5ieXRlCTIzLDQzLDQsMTI2LDE4NiwxMTksMjE0LDM4CisuYnl0ZQkyMjUsMTA1LDIwLDk5LDg1LDMzLDEyLDEyNQorLmJ5dGUJODIsOSwxMDYsMjEzLDQ4LDU0LDE2NSw1NgorLmJ5dGUJMTkxLDY0LDE2MywxNTgsMTI5LDI0MywyMTUsMjUxCisuYnl0ZQkxMjQsMjI3LDU3LDEzMCwxNTUsNDcsMjU1LDEzNQorLmJ5dGUJNTIsMTQyLDY3LDY4LDE5NiwyMjIsMjMzLDIwMworLmJ5dGUJODQsMTIzLDE0OCw1MCwxNjYsMTk0LDM1LDYxCisuYnl0ZQkyMzgsNzYsMTQ5LDExLDY2LDI1MCwxOTUsNzgKKy5ieXRlCTgsNDYsMTYxLDEwMiw0MCwyMTcsMzYsMTc4CisuYnl0ZQkxMTgsOTEsMTYyLDczLDEwOSwxMzksMjA5LDM3CisuYnl0ZQkxMTQsMjQ4LDI0NiwxMDAsMTM0LDEwNCwxNTIsMjIKKy5ieXRlCTIxMiwxNjQsOTIsMjA0LDkzLDEwMSwxODIsMTQ2CisuYnl0ZQkxMDgsMTEyLDcyLDgwLDI1MywyMzcsMTg1LDIxOAorLmJ5dGUJOTQsMjEsNzAsODcsMTY3LDE0MSwxNTcsMTMyCisuYnl0ZQkxNDQsMjE2LDE3MSwwLDE0MCwxODgsMjExLDEwCisuYnl0ZQkyNDcsMjI4LDg4LDUsMTg0LDE3OSw2OSw2CisuYnl0ZQkyMDgsNDQsMzAsMTQzLDIwMiw2MywxNSwyCisuYnl0ZQkxOTMsMTc1LDE4OSwzLDEsMTksMTM4LDEwNworLmJ5dGUJNTgsMTQ1LDE3LDY1LDc5LDEwMywyMjAsMjM0CisuYnl0ZQkxNTEsMjQyLDIwNywyMDYsMjQwLDE4MCwyMzAsMTE1CisuYnl0ZQkxNTAsMTcyLDExNiwzNCwyMzEsMTczLDUzLDEzMworLmJ5dGUJMjI2LDI0OSw1NSwyMzIsMjgsMTE3LDIyMywxMTAKKy5ieXRlCTcxLDI0MSwyNiwxMTMsMjksNDEsMTk3LDEzNworLmJ5dGUJMTExLDE4Myw5OCwxNCwxNzAsMjQsMTkwLDI3CisuYnl0ZQkyNTIsODYsNjIsNzUsMTk4LDIxMCwxMjEsMzIKKy5ieXRlCTE1NCwyMTksMTkyLDI1NCwxMjAsMjA1LDkwLDI0NAorLmJ5dGUJMzEsMjIxLDE2OCw1MSwxMzYsNywxOTksNDkKKy5ieXRlCTE3NywxOCwxNiw4OSwzOSwxMjgsMjM2LDk1CisuYnl0ZQk5Niw4MSwxMjcsMTY5LDI1LDE4MSw3NCwxMworLmJ5dGUJNDUsMjI5LDEyMiwxNTksMTQ3LDIwMSwxNTYsMjM5CisuYnl0ZQkxNjAsMjI0LDU5LDc3LDE3NCw0MiwyNDUsMTc2CisuYnl0ZQkyMDAsMjM1LDE4Nyw2MCwxMzEsODMsMTUzLDk3CisuYnl0ZQkyMyw0Myw0LDEyNiwxODYsMTE5LDIxNCwzOAorLmJ5dGUJMjI1LDEwNSwyMCw5OSw4NSwzMywxMiwxMjUKKy5zaXplCV94ODZfQUVTX2RlY3J5cHQsLi1feDg2X0FFU19kZWNyeXB0CisuZ2xvYmwJYWVzX25vaHdfZGVjcnlwdAorLmhpZGRlbglhZXNfbm9od19kZWNyeXB0CisudHlwZQlhZXNfbm9od19kZWNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNfbm9od19kZWNyeXB0OgorLkxfYWVzX25vaHdfZGVjcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAklZXNwLCVlYXgKKwlzdWJsCSQzNiwlZXNwCisJYW5kbAkkLTY0LCVlc3AKKwlsZWFsCS0xMjcoJWVkaSksJWVieAorCXN1YmwJJWVzcCwlZWJ4CisJbmVnbAklZWJ4CisJYW5kbAkkOTYwLCVlYngKKwlzdWJsCSVlYngsJWVzcAorCWFkZGwJJDQsJWVzcAorCW1vdmwJJWVheCwyOCglZXNwKQorCWNhbGwJLkwwMTBwaWNfcG9pbnQKKy5MMDEwcGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJT1BFTlNTTF9pYTMyY2FwX1AtLkwwMTBwaWNfcG9pbnQoJWVicCksJWVheAorCWxlYWwJLkxBRVNfVGQtLkwwMTBwaWNfcG9pbnQoJWVicCksJWVicAorCWxlYWwJNzY0KCVlc3ApLCVlYngKKwlzdWJsCSVlYnAsJWVieAorCWFuZGwJJDc2OCwlZWJ4CisJbGVhbAkyMTc2KCVlYnAsJWVieCwxKSwlZWJwCisJYnRsCSQyNSwoJWVheCkKKwlqbmMJLkwwMTF4ODYKKwltb3ZxCSglZXNpKSwlbW0wCisJbW92cQk4KCVlc2kpLCVtbTQKKwljYWxsCV9zc2VfQUVTX2RlY3J5cHRfY29tcGFjdAorCW1vdmwJMjgoJWVzcCksJWVzcAorCW1vdmwJMjQoJWVzcCksJWVzaQorCW1vdnEJJW1tMCwoJWVzaSkKKwltb3ZxCSVtbTQsOCglZXNpKQorCWVtbXMKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgkxNgorLkwwMTF4ODY6CisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwljYWxsCV94ODZfQUVTX2RlY3J5cHRfY29tcGFjdAorCW1vdmwJMjgoJWVzcCksJWVzcAorCW1vdmwJMjQoJWVzcCksJWVzaQorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlhZXNfbm9od19kZWNyeXB0LC4tLkxfYWVzX25vaHdfZGVjcnlwdF9iZWdpbgorLmdsb2JsCWFlc19ub2h3X2NiY19lbmNyeXB0CisuaGlkZGVuCWFlc19ub2h3X2NiY19lbmNyeXB0CisudHlwZQlhZXNfbm9od19jYmNfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzX25vaHdfY2JjX2VuY3J5cHQ6CisuTF9hZXNfbm9od19jYmNfZW5jcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyOCglZXNwKSwlZWN4CisJY21wbAkkMCwlZWN4CisJamUJLkwwMTJkcm9wX291dAorCWNhbGwJLkwwMTNwaWNfcG9pbnQKKy5MMDEzcGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJT1BFTlNTTF9pYTMyY2FwX1AtLkwwMTNwaWNfcG9pbnQoJWVicCksJWVheAorCWNtcGwJJDAsNDAoJWVzcCkKKwlsZWFsCS5MQUVTX1RlLS5MMDEzcGljX3BvaW50KCVlYnApLCVlYnAKKwlqbmUJLkwwMTRwaWNrZWRfdGUKKwlsZWFsCS5MQUVTX1RkLS5MQUVTX1RlKCVlYnApLCVlYnAKKy5MMDE0cGlja2VkX3RlOgorCXB1c2hmbAorCWNsZAorCWNtcGwJJDUxMiwlZWN4CisJamIJLkwwMTVzbG93X3dheQorCXRlc3RsCSQxNSwlZWN4CisJam56CS5MMDE1c2xvd193YXkKKwlidGwJJDI4LCglZWF4KQorCWpjCS5MMDE1c2xvd193YXkKKwlsZWFsCS0zMjQoJWVzcCksJWVzaQorCWFuZGwJJC02NCwlZXNpCisJbW92bAklZWJwLCVlYXgKKwlsZWFsCTIzMDQoJWVicCksJWVieAorCW1vdmwJJWVzaSwlZWR4CisJYW5kbAkkNDA5NSwlZWF4CisJYW5kbAkkNDA5NSwlZWJ4CisJYW5kbAkkNDA5NSwlZWR4CisJY21wbAklZWJ4LCVlZHgKKwlqYgkuTDAxNnRibF9icmVha19vdXQKKwlzdWJsCSVlYngsJWVkeAorCXN1YmwJJWVkeCwlZXNpCisJam1wCS5MMDE3dGJsX29rCisuYWxpZ24JNAorLkwwMTZ0YmxfYnJlYWtfb3V0OgorCXN1YmwJJWVheCwlZWR4CisJYW5kbAkkNDA5NSwlZWR4CisJYWRkbAkkMzg0LCVlZHgKKwlzdWJsCSVlZHgsJWVzaQorLmFsaWduCTQKKy5MMDE3dGJsX29rOgorCWxlYWwJMjQoJWVzcCksJWVkeAorCXhjaGdsCSVlc2ksJWVzcAorCWFkZGwJJDQsJWVzcAorCW1vdmwJJWVicCwyNCglZXNwKQorCW1vdmwJJWVzaSwyOCglZXNwKQorCW1vdmwJKCVlZHgpLCVlYXgKKwltb3ZsCTQoJWVkeCksJWVieAorCW1vdmwJMTIoJWVkeCksJWVkaQorCW1vdmwJMTYoJWVkeCksJWVzaQorCW1vdmwJMjAoJWVkeCksJWVkeAorCW1vdmwJJWVheCwzMiglZXNwKQorCW1vdmwJJWVieCwzNiglZXNwKQorCW1vdmwJJWVjeCw0MCglZXNwKQorCW1vdmwJJWVkaSw0NCglZXNwKQorCW1vdmwJJWVzaSw0OCglZXNwKQorCW1vdmwJJDAsMzE2KCVlc3ApCisJbW92bAklZWRpLCVlYngKKwltb3ZsCSQ2MSwlZWN4CisJc3VibAklZWJwLCVlYngKKwltb3ZsCSVlZGksJWVzaQorCWFuZGwJJDQwOTUsJWVieAorCWxlYWwJNzYoJWVzcCksJWVkaQorCWNtcGwJJDIzMDQsJWVieAorCWpiCS5MMDE4ZG9fY29weQorCWNtcGwJJDM4NTIsJWVieAorCWpiCS5MMDE5c2tpcF9jb3B5CisuYWxpZ24JNAorLkwwMThkb19jb3B5OgorCW1vdmwJJWVkaSw0NCglZXNwKQorLmxvbmcJMjc4NDIyOTAwMQorLkwwMTlza2lwX2NvcHk6CisJbW92bAkkMTYsJWVkaQorLmFsaWduCTQKKy5MMDIwcHJlZmV0Y2hfdGJsOgorCW1vdmwJKCVlYnApLCVlYXgKKwltb3ZsCTMyKCVlYnApLCVlYngKKwltb3ZsCTY0KCVlYnApLCVlY3gKKwltb3ZsCTk2KCVlYnApLCVlc2kKKwlsZWFsCTEyOCglZWJwKSwlZWJwCisJc3VibAkkMSwlZWRpCisJam56CS5MMDIwcHJlZmV0Y2hfdGJsCisJc3VibAkkMjA0OCwlZWJwCisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAk0OCglZXNwKSwlZWRpCisJY21wbAkkMCwlZWR4CisJamUJLkwwMjFmYXN0X2RlY3J5cHQKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKy5hbGlnbgkxNgorLkwwMjJmYXN0X2VuY19sb29wOgorCW1vdmwJOCglZWRpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJeG9ybAkoJWVzaSksJWVheAorCXhvcmwJNCglZXNpKSwlZWJ4CisJeG9ybAk4KCVlc2kpLCVlY3gKKwl4b3JsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV94ODZfQUVTX2VuY3J5cHQKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwltb3ZsCTM2KCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCWxlYWwJMTYoJWVzaSksJWVzaQorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwzMiglZXNwKQorCWxlYWwJMTYoJWVkaSksJWVkeAorCW1vdmwJJWVkeCwzNiglZXNwKQorCXN1YmwJJDE2LCVlY3gKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwlqbnoJLkwwMjJmYXN0X2VuY19sb29wCisJbW92bAk0OCglZXNwKSwlZXNpCisJbW92bAk4KCVlZGkpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlY3gsOCglZXNpKQorCW1vdmwJJWVkeCwxMiglZXNpKQorCWNtcGwJJDAsMzE2KCVlc3ApCisJbW92bAk0NCglZXNwKSwlZWRpCisJamUJLkwwMjNza2lwX2V6ZXJvCisJbW92bAkkNjAsJWVjeAorCXhvcmwJJWVheCwlZWF4CisuYWxpZ24JNAorLmxvbmcJMjg4NDg5MjI5NworLkwwMjNza2lwX2V6ZXJvOgorCW1vdmwJMjgoJWVzcCksJWVzcAorCXBvcGZsCisuTDAxMmRyb3Bfb3V0OgorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorCXB1c2hmbAorLmFsaWduCTE2CisuTDAyMWZhc3RfZGVjcnlwdDoKKwljbXBsCTM2KCVlc3ApLCVlc2kKKwlqZQkuTDAyNGZhc3RfZGVjX2luX3BsYWNlCisJbW92bAklZWRpLDUyKCVlc3ApCisuYWxpZ24JNAorLmFsaWduCTE2CisuTDAyNWZhc3RfZGVjX2xvb3A6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV94ODZfQUVTX2RlY3J5cHQKKwltb3ZsCTUyKCVlc3ApLCVlZGkKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCW1vdmwJMzYoJWVzcCksJWVkaQorCW1vdmwJMzIoJWVzcCksJWVzaQorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJbW92bAk0MCglZXNwKSwlZWN4CisJbW92bAklZXNpLDUyKCVlc3ApCisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJbGVhbAkxNiglZWRpKSwlZWRpCisJbW92bAklZWRpLDM2KCVlc3ApCisJc3VibAkkMTYsJWVjeAorCW1vdmwJJWVjeCw0MCglZXNwKQorCWpuegkuTDAyNWZhc3RfZGVjX2xvb3AKKwltb3ZsCTUyKCVlc3ApLCVlZGkKKwltb3ZsCTQ4KCVlc3ApLCVlc2kKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJam1wCS5MMDI2ZmFzdF9kZWNfb3V0CisuYWxpZ24JMTYKKy5MMDI0ZmFzdF9kZWNfaW5fcGxhY2U6CisuTDAyN2Zhc3RfZGVjX2luX3BsYWNlX2xvb3A6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwlsZWFsCTYwKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJNDQoJWVzcCksJWVkaQorCWNhbGwJX3g4Nl9BRVNfZGVjcnlwdAorCW1vdmwJNDgoJWVzcCksJWVkaQorCW1vdmwJMzYoJWVzcCksJWVzaQorCXhvcmwJKCVlZGkpLCVlYXgKKwl4b3JsCTQoJWVkaSksJWVieAorCXhvcmwJOCglZWRpKSwlZWN4CisJeG9ybAkxMiglZWRpKSwlZWR4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJbW92bAklZWN4LDgoJWVzaSkKKwltb3ZsCSVlZHgsMTIoJWVzaSkKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwltb3ZsCSVlc2ksMzYoJWVzcCkKKwlsZWFsCTYwKCVlc3ApLCVlc2kKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAk0MCglZXNwKSwlZWN4CisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJc3VibAkkMTYsJWVjeAorCW1vdmwJJWVjeCw0MCglZXNwKQorCWpuegkuTDAyN2Zhc3RfZGVjX2luX3BsYWNlX2xvb3AKKy5hbGlnbgk0CisuTDAyNmZhc3RfZGVjX291dDoKKwljbXBsCSQwLDMxNiglZXNwKQorCW1vdmwJNDQoJWVzcCksJWVkaQorCWplCS5MMDI4c2tpcF9kemVybworCW1vdmwJJDYwLCVlY3gKKwl4b3JsCSVlYXgsJWVheAorLmFsaWduCTQKKy5sb25nCTI4ODQ4OTIyOTcKKy5MMDI4c2tpcF9kemVybzoKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwlwb3BmbAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorCXB1c2hmbAorLmFsaWduCTE2CisuTDAxNXNsb3dfd2F5OgorCW1vdmwJKCVlYXgpLCVlYXgKKwltb3ZsCTM2KCVlc3ApLCVlZGkKKwlsZWFsCS04MCglZXNwKSwlZXNpCisJYW5kbAkkLTY0LCVlc2kKKwlsZWFsCS0xNDMoJWVkaSksJWVieAorCXN1YmwJJWVzaSwlZWJ4CisJbmVnbAklZWJ4CisJYW5kbAkkOTYwLCVlYngKKwlzdWJsCSVlYngsJWVzaQorCWxlYWwJNzY4KCVlc2kpLCVlYngKKwlzdWJsCSVlYnAsJWVieAorCWFuZGwJJDc2OCwlZWJ4CisJbGVhbAkyMTc2KCVlYnAsJWVieCwxKSwlZWJwCisJbGVhbAkyNCglZXNwKSwlZWR4CisJeGNoZ2wJJWVzaSwlZXNwCisJYWRkbAkkNCwlZXNwCisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAklZXNpLDI4KCVlc3ApCisJbW92bAklZWF4LDUyKCVlc3ApCisJbW92bAkoJWVkeCksJWVheAorCW1vdmwJNCglZWR4KSwlZWJ4CisJbW92bAkxNiglZWR4KSwlZXNpCisJbW92bAkyMCglZWR4KSwlZWR4CisJbW92bAklZWF4LDMyKCVlc3ApCisJbW92bAklZWJ4LDM2KCVlc3ApCisJbW92bAklZWN4LDQwKCVlc3ApCisJbW92bAklZWRpLDQ0KCVlc3ApCisJbW92bAklZXNpLDQ4KCVlc3ApCisJbW92bAklZXNpLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCWNtcGwJJDAsJWVkeAorCWplCS5MMDI5c2xvd19kZWNyeXB0CisJY21wbAkkMTYsJWVjeAorCW1vdmwJJWVieCwlZWR4CisJamIJLkwwMzBzbG93X2VuY190YWlsCisJYnRsCSQyNSw1MiglZXNwKQorCWpuYwkuTDAzMXNsb3dfZW5jX3g4NgorCW1vdnEJKCVlZGkpLCVtbTAKKwltb3ZxCTgoJWVkaSksJW1tNAorLmFsaWduCTE2CisuTDAzMnNsb3dfZW5jX2xvb3Bfc3NlOgorCXB4b3IJKCVlc2kpLCVtbTAKKwlweG9yCTgoJWVzaSksJW1tNAorCW1vdmwJNDQoJWVzcCksJWVkaQorCWNhbGwJX3NzZV9BRVNfZW5jcnlwdF9jb21wYWN0CisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAkzNiglZXNwKSwlZWRpCisJbW92bAk0MCglZXNwKSwlZWN4CisJbW92cQklbW0wLCglZWRpKQorCW1vdnEJJW1tNCw4KCVlZGkpCisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJbGVhbAkxNiglZWRpKSwlZWR4CisJbW92bAklZWR4LDM2KCVlc3ApCisJc3VibAkkMTYsJWVjeAorCWNtcGwJJDE2LCVlY3gKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwlqYWUJLkwwMzJzbG93X2VuY19sb29wX3NzZQorCXRlc3RsCSQxNSwlZWN4CisJam56CS5MMDMwc2xvd19lbmNfdGFpbAorCW1vdmwJNDgoJWVzcCksJWVzaQorCW1vdnEJJW1tMCwoJWVzaSkKKwltb3ZxCSVtbTQsOCglZXNpKQorCWVtbXMKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwlwb3BmbAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorCXB1c2hmbAorLmFsaWduCTE2CisuTDAzMXNsb3dfZW5jX3g4NjoKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKy5hbGlnbgk0CisuTDAzM3Nsb3dfZW5jX2xvb3BfeDg2OgorCW1vdmwJOCglZWRpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJeG9ybAkoJWVzaSksJWVheAorCXhvcmwJNCglZXNpKSwlZWJ4CisJeG9ybAk4KCVlc2kpLCVlY3gKKwl4b3JsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV94ODZfQUVTX2VuY3J5cHRfY29tcGFjdAorCW1vdmwJMzIoJWVzcCksJWVzaQorCW1vdmwJMzYoJWVzcCksJWVkaQorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJbW92bAk0MCglZXNwKSwlZWN4CisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJbGVhbAkxNiglZWRpKSwlZWR4CisJbW92bAklZWR4LDM2KCVlc3ApCisJc3VibAkkMTYsJWVjeAorCWNtcGwJJDE2LCVlY3gKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwlqYWUJLkwwMzNzbG93X2VuY19sb29wX3g4NgorCXRlc3RsCSQxNSwlZWN4CisJam56CS5MMDMwc2xvd19lbmNfdGFpbAorCW1vdmwJNDgoJWVzcCksJWVzaQorCW1vdmwJOCglZWRpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJbW92bAklZWN4LDgoJWVzaSkKKwltb3ZsCSVlZHgsMTIoJWVzaSkKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwlwb3BmbAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorCXB1c2hmbAorLmFsaWduCTE2CisuTDAzMHNsb3dfZW5jX3RhaWw6CisJZW1tcworCW1vdmwJJWVkeCwlZWRpCisJbW92bAkkMTYsJWVieAorCXN1YmwJJWVjeCwlZWJ4CisJY21wbAklZXNpLCVlZGkKKwlqZQkuTDAzNGVuY19pbl9wbGFjZQorLmFsaWduCTQKKy5sb25nCTI3Njc0NTE3ODUKKwlqbXAJLkwwMzVlbmNfc2tpcF9pbl9wbGFjZQorLkwwMzRlbmNfaW5fcGxhY2U6CisJbGVhbAkoJWVkaSwlZWN4LDEpLCVlZGkKKy5MMDM1ZW5jX3NraXBfaW5fcGxhY2U6CisJbW92bAklZWJ4LCVlY3gKKwl4b3JsCSVlYXgsJWVheAorLmFsaWduCTQKKy5sb25nCTI4NjgxMTUwODEKKwltb3ZsCTQ4KCVlc3ApLCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCW1vdmwJKCVlZGkpLCVlYXgKKwltb3ZsCTQoJWVkaSksJWVieAorCW1vdmwJJDE2LDQwKCVlc3ApCisJam1wCS5MMDMzc2xvd19lbmNfbG9vcF94ODYKKy5hbGlnbgkxNgorLkwwMjlzbG93X2RlY3J5cHQ6CisJYnRsCSQyNSw1MiglZXNwKQorCWpuYwkuTDAzNnNsb3dfZGVjX2xvb3BfeDg2CisuYWxpZ24JNAorLkwwMzdzbG93X2RlY19sb29wX3NzZToKKwltb3ZxCSglZXNpKSwlbW0wCisJbW92cQk4KCVlc2kpLCVtbTQKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV9zc2VfQUVTX2RlY3J5cHRfY29tcGFjdAorCW1vdmwJMzIoJWVzcCksJWVzaQorCWxlYWwJNjAoJWVzcCksJWVheAorCW1vdmwJMzYoJWVzcCksJWVieAorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJNDgoJWVzcCksJWVkaQorCW1vdnEJKCVlc2kpLCVtbTEKKwltb3ZxCTgoJWVzaSksJW1tNQorCXB4b3IJKCVlZGkpLCVtbTAKKwlweG9yCTgoJWVkaSksJW1tNAorCW1vdnEJJW1tMSwoJWVkaSkKKwltb3ZxCSVtbTUsOCglZWRpKQorCXN1YmwJJDE2LCVlY3gKKwlqYwkuTDAzOHNsb3dfZGVjX3BhcnRpYWxfc3NlCisJbW92cQklbW0wLCglZWJ4KQorCW1vdnEJJW1tNCw4KCVlYngpCisJbGVhbAkxNiglZWJ4KSwlZWJ4CisJbW92bAklZWJ4LDM2KCVlc3ApCisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJbW92bAklZWN4LDQwKCVlc3ApCisJam56CS5MMDM3c2xvd19kZWNfbG9vcF9zc2UKKwllbW1zCisJbW92bAkyOCglZXNwKSwlZXNwCisJcG9wZmwKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKwlwdXNoZmwKKy5hbGlnbgkxNgorLkwwMzhzbG93X2RlY19wYXJ0aWFsX3NzZToKKwltb3ZxCSVtbTAsKCVlYXgpCisJbW92cQklbW00LDgoJWVheCkKKwllbW1zCisJYWRkbAkkMTYsJWVjeAorCW1vdmwJJWVieCwlZWRpCisJbW92bAklZWF4LCVlc2kKKy5hbGlnbgk0CisubG9uZwkyNzY3NDUxNzg1CisJbW92bAkyOCglZXNwKSwlZXNwCisJcG9wZmwKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKwlwdXNoZmwKKy5hbGlnbgkxNgorLkwwMzZzbG93X2RlY19sb29wX3g4NjoKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkeAorCWxlYWwJNjAoJWVzcCksJWVkaQorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJbW92bAk0NCglZXNwKSwlZWRpCisJY2FsbAlfeDg2X0FFU19kZWNyeXB0X2NvbXBhY3QKKwltb3ZsCTQ4KCVlc3ApLCVlZGkKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCXN1YmwJJDE2LCVlc2kKKwlqYwkuTDAzOXNsb3dfZGVjX3BhcnRpYWxfeDg2CisJbW92bAklZXNpLDQwKCVlc3ApCisJbW92bAkzNiglZXNwKSwlZXNpCisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJbW92bAklZWN4LDgoJWVzaSkKKwltb3ZsCSVlZHgsMTIoJWVzaSkKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwltb3ZsCSVlc2ksMzYoJWVzcCkKKwlsZWFsCTYwKCVlc3ApLCVlc2kKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJbW92bAkzMiglZXNwKSwlZXNpCisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJam56CS5MMDM2c2xvd19kZWNfbG9vcF94ODYKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwlwb3BmbAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorCXB1c2hmbAorLmFsaWduCTE2CisuTDAzOXNsb3dfZGVjX3BhcnRpYWxfeDg2OgorCWxlYWwJNjAoJWVzcCksJWVzaQorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJMzYoJWVzcCksJWVkaQorCWxlYWwJNjAoJWVzcCksJWVzaQorLmFsaWduCTQKKy5sb25nCTI3Njc0NTE3ODUKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwlwb3BmbAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYWVzX25vaHdfY2JjX2VuY3J5cHQsLi0uTF9hZXNfbm9od19jYmNfZW5jcnlwdF9iZWdpbgorLmhpZGRlbglfeDg2X0FFU19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCV94ODZfQUVTX3NldF9lbmNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5OgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZsCTMyKCVlc3ApLCVlZGkKKwl0ZXN0bAkkLTEsJWVzaQorCWp6CS5MMDQwYmFkcG9pbnRlcgorCXRlc3RsCSQtMSwlZWRpCisJanoJLkwwNDBiYWRwb2ludGVyCisJY2FsbAkuTDA0MXBpY19wb2ludAorLkwwNDFwaWNfcG9pbnQ6CisJcG9wbAklZWJwCisJbGVhbAkuTEFFU19UZS0uTDA0MXBpY19wb2ludCglZWJwKSwlZWJwCisJbGVhbAkyMTc2KCVlYnApLCVlYnAKKwltb3ZsCS0xMjgoJWVicCksJWVheAorCW1vdmwJLTk2KCVlYnApLCVlYngKKwltb3ZsCS02NCglZWJwKSwlZWN4CisJbW92bAktMzIoJWVicCksJWVkeAorCW1vdmwJKCVlYnApLCVlYXgKKwltb3ZsCTMyKCVlYnApLCVlYngKKwltb3ZsCTY0KCVlYnApLCVlY3gKKwltb3ZsCTk2KCVlYnApLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlY3gKKwljbXBsCSQxMjgsJWVjeAorCWplCS5MMDQyMTByb3VuZHMKKwljbXBsCSQxOTIsJWVjeAorCWplCS5MMDQzMTJyb3VuZHMKKwljbXBsCSQyNTYsJWVjeAorCWplCS5MMDQ0MTRyb3VuZHMKKwltb3ZsCSQtMiwlZWF4CisJam1wCS5MMDQ1ZXhpdAorLkwwNDIxMHJvdW5kczoKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJeG9ybAklZWN4LCVlY3gKKwlqbXAJLkwwNDYxMHNob3J0Y3V0CisuYWxpZ24JNAorLkwwNDcxMGxvb3A6CisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJMTIoJWVkaSksJWVkeAorLkwwNDYxMHNob3J0Y3V0OgorCW1vdnpibAklZGwsJWVzaQorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkMjQsJWVieAorCXhvcmwJJWVieCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwlzaHJsCSQxNiwlZWR4CisJbW92emJsCSVkbCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDgsJWVieAorCXhvcmwJJWVieCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwl4b3JsCTg5NiglZWJwLCVlY3gsNCksJWVheAorCW1vdmwJJWVheCwxNiglZWRpKQorCXhvcmwJNCglZWRpKSwlZWF4CisJbW92bAklZWF4LDIwKCVlZGkpCisJeG9ybAk4KCVlZGkpLCVlYXgKKwltb3ZsCSVlYXgsMjQoJWVkaSkKKwl4b3JsCTEyKCVlZGkpLCVlYXgKKwltb3ZsCSVlYXgsMjgoJWVkaSkKKwlpbmNsCSVlY3gKKwlhZGRsCSQxNiwlZWRpCisJY21wbAkkMTAsJWVjeAorCWpsCS5MMDQ3MTBsb29wCisJbW92bAkkMTAsODAoJWVkaSkKKwl4b3JsCSVlYXgsJWVheAorCWptcAkuTDA0NWV4aXQKKy5MMDQzMTJyb3VuZHM6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJMTYoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVzaSksJWVkeAorCW1vdmwJJWVjeCwxNiglZWRpKQorCW1vdmwJJWVkeCwyMCglZWRpKQorCXhvcmwJJWVjeCwlZWN4CisJam1wCS5MMDQ4MTJzaG9ydGN1dAorLmFsaWduCTQKKy5MMDQ5MTJsb29wOgorCW1vdmwJKCVlZGkpLCVlYXgKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKy5MMDQ4MTJzaG9ydGN1dDoKKwltb3Z6YmwJJWRsLCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDI0LCVlYngKKwl4b3JsCSVlYngsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJc2hybAkkMTYsJWVkeAorCW1vdnpibAklZGwsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQ4LCVlYngKKwl4b3JsCSVlYngsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJc2hsbAkkMTYsJWVieAorCXhvcmwJJWVieCwlZWF4CisJeG9ybAk4OTYoJWVicCwlZWN4LDQpLCVlYXgKKwltb3ZsCSVlYXgsMjQoJWVkaSkKKwl4b3JsCTQoJWVkaSksJWVheAorCW1vdmwJJWVheCwyOCglZWRpKQorCXhvcmwJOCglZWRpKSwlZWF4CisJbW92bAklZWF4LDMyKCVlZGkpCisJeG9ybAkxMiglZWRpKSwlZWF4CisJbW92bAklZWF4LDM2KCVlZGkpCisJY21wbAkkNywlZWN4CisJamUJLkwwNTAxMmJyZWFrCisJaW5jbAklZWN4CisJeG9ybAkxNiglZWRpKSwlZWF4CisJbW92bAklZWF4LDQwKCVlZGkpCisJeG9ybAkyMCglZWRpKSwlZWF4CisJbW92bAklZWF4LDQ0KCVlZGkpCisJYWRkbAkkMjQsJWVkaQorCWptcAkuTDA0OTEybG9vcAorLkwwNTAxMmJyZWFrOgorCW1vdmwJJDEyLDcyKCVlZGkpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJLkwwNDVleGl0CisuTDA0NDE0cm91bmRzOgorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVieCw0KCVlZGkpCisJbW92bAklZWN4LDgoJWVkaSkKKwltb3ZsCSVlZHgsMTIoJWVkaSkKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwltb3ZsCTIwKCVlc2kpLCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsMTYoJWVkaSkKKwltb3ZsCSVlYngsMjAoJWVkaSkKKwltb3ZsCSVlY3gsMjQoJWVkaSkKKwltb3ZsCSVlZHgsMjgoJWVkaSkKKwl4b3JsCSVlY3gsJWVjeAorCWptcAkuTDA1MTE0c2hvcnRjdXQKKy5hbGlnbgk0CisuTDA1MjE0bG9vcDoKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKy5MMDUxMTRzaG9ydGN1dDoKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQyNCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNocmwJJDE2LCVlZHgKKwltb3Z6YmwJJWRsLCVlc2kKKwl4b3JsCSVlYngsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkOCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVheAorCXhvcmwJODk2KCVlYnAsJWVjeCw0KSwlZWF4CisJbW92bAklZWF4LDMyKCVlZGkpCisJeG9ybAk0KCVlZGkpLCVlYXgKKwltb3ZsCSVlYXgsMzYoJWVkaSkKKwl4b3JsCTgoJWVkaSksJWVheAorCW1vdmwJJWVheCw0MCglZWRpKQorCXhvcmwJMTIoJWVkaSksJWVheAorCW1vdmwJJWVheCw0NCglZWRpKQorCWNtcGwJJDYsJWVjeAorCWplCS5MMDUzMTRicmVhaworCWluY2wJJWVjeAorCW1vdmwJJWVheCwlZWR4CisJbW92bAkxNiglZWRpKSwlZWF4CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwl4b3JsCSVlYngsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJc2hybAkkMTYsJWVkeAorCXNobGwJJDgsJWVieAorCW1vdnpibAklZGwsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNobGwJJDI0LCVlYngKKwl4b3JsCSVlYngsJWVheAorCW1vdmwJJWVheCw0OCglZWRpKQorCXhvcmwJMjAoJWVkaSksJWVheAorCW1vdmwJJWVheCw1MiglZWRpKQorCXhvcmwJMjQoJWVkaSksJWVheAorCW1vdmwJJWVheCw1NiglZWRpKQorCXhvcmwJMjgoJWVkaSksJWVheAorCW1vdmwJJWVheCw2MCglZWRpKQorCWFkZGwJJDMyLCVlZGkKKwlqbXAJLkwwNTIxNGxvb3AKKy5MMDUzMTRicmVhazoKKwltb3ZsCSQxNCw0OCglZWRpKQorCXhvcmwJJWVheCwlZWF4CisJam1wCS5MMDQ1ZXhpdAorLkwwNDBiYWRwb2ludGVyOgorCW1vdmwJJC0xLCVlYXgKKy5MMDQ1ZXhpdDoKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCV94ODZfQUVTX3NldF9lbmNyeXB0X2tleSwuLV94ODZfQUVTX3NldF9lbmNyeXB0X2tleQorLmdsb2JsCWFlc19ub2h3X3NldF9lbmNyeXB0X2tleQorLmhpZGRlbglhZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCWFlc19ub2h3X3NldF9lbmNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5OgorLkxfYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5X2JlZ2luOgorCWNhbGwJX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5CisJcmV0Cisuc2l6ZQlhZXNfbm9od19zZXRfZW5jcnlwdF9rZXksLi0uTF9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXlfYmVnaW4KKy5nbG9ibAlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXkKKy5oaWRkZW4JYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXksQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc19ub2h3X3NldF9kZWNyeXB0X2tleToKKy5MX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleV9iZWdpbjoKKwljYWxsCV94ODZfQUVTX3NldF9lbmNyeXB0X2tleQorCWNtcGwJJDAsJWVheAorCWplCS5MMDU0cHJvY2VlZAorCXJldAorLkwwNTRwcm9jZWVkOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwltb3ZsCTI0MCglZXNpKSwlZWN4CisJbGVhbAkoLCVlY3gsNCksJWVjeAorCWxlYWwJKCVlc2ksJWVjeCw0KSwlZWRpCisuYWxpZ24JNAorLkwwNTVpbnZlcnQ6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAkoJWVkaSksJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVieCw0KCVlZGkpCisJbW92bAklZWN4LCglZXNpKQorCW1vdmwJJWVkeCw0KCVlc2kpCisJbW92bAk4KCVlc2kpLCVlYXgKKwltb3ZsCTEyKCVlc2kpLCVlYngKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCW1vdmwJJWVheCw4KCVlZGkpCisJbW92bAklZWJ4LDEyKCVlZGkpCisJbW92bAklZWN4LDgoJWVzaSkKKwltb3ZsCSVlZHgsMTIoJWVzaSkKKwlhZGRsCSQxNiwlZXNpCisJc3VibAkkMTYsJWVkaQorCWNtcGwJJWVkaSwlZXNpCisJam5lCS5MMDU1aW52ZXJ0CisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAkyNDAoJWVkaSksJWVzaQorCWxlYWwJLTIoJWVzaSwlZXNpLDEpLCVlc2kKKwlsZWFsCSglZWRpLCVlc2ksOCksJWVzaQorCW1vdmwJJWVzaSwyOCglZXNwKQorCW1vdmwJMTYoJWVkaSksJWVheAorLmFsaWduCTQKKy5MMDU2cGVybXV0ZToKKwlhZGRsCSQxNiwlZWRpCisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCSglZWF4LCVlYXgsMSksJWVieAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJc3VibAklZWJwLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlYngKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVzaSwlZWJ4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWJ4LCVlYnAKKwlsZWFsCSglZWJ4LCVlYngsMSksJWVjeAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJc3VibAklZWJwLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlY3gKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwlhbmRsCSVlY3gsJWVicAorCWxlYWwJKCVlY3gsJWVjeCwxKSwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlzaHJsCSQ3LCVlYnAKKwl4b3JsCSVlYXgsJWVjeAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWR4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwlyb2xsCSQ4LCVlYXgKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJNCglZWRpKSwlZWJwCisJeG9ybAklZWJ4LCVlYXgKKwl4b3JsCSVlZHgsJWVieAorCXhvcmwJJWVjeCwlZWF4CisJcm9sbAkkMjQsJWVieAorCXhvcmwJJWVkeCwlZWN4CisJeG9ybAklZWR4LCVlYXgKKwlyb2xsCSQxNiwlZWN4CisJeG9ybAklZWJ4LCVlYXgKKwlyb2xsCSQ4LCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCW1vdmwJJWVicCwlZWJ4CisJeG9ybAklZWR4LCVlYXgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWJ4LCVlYnAKKwlsZWFsCSglZWJ4LCVlYngsMSksJWVjeAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJc3VibAklZWJwLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlY3gKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVzaSwlZWN4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWN4LCVlYnAKKwlsZWFsCSglZWN4LCVlY3gsMSksJWVkeAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJc3VibAklZWJwLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlZHgKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwlhbmRsCSVlZHgsJWVicAorCWxlYWwJKCVlZHgsJWVkeCwxKSwlZWF4CisJbW92bAklZWJwLCVlc2kKKwlzaHJsCSQ3LCVlYnAKKwl4b3JsCSVlYngsJWVkeAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWF4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwlyb2xsCSQ4LCVlYngKKwl4b3JsCSVlc2ksJWVheAorCW1vdmwJOCglZWRpKSwlZWJwCisJeG9ybAklZWN4LCVlYngKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkeCwlZWJ4CisJcm9sbAkkMjQsJWVjeAorCXhvcmwJJWVheCwlZWR4CisJeG9ybAklZWF4LCVlYngKKwlyb2xsCSQxNiwlZWR4CisJeG9ybAklZWN4LCVlYngKKwlyb2xsCSQ4LCVlYXgKKwl4b3JsCSVlZHgsJWVieAorCW1vdmwJJWVicCwlZWN4CisJeG9ybAklZWF4LCVlYngKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVjeCwlZWJwCisJbGVhbAkoJWVjeCwlZWN4LDEpLCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWR4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVkeCwlZWJwCisJbGVhbAkoJWVkeCwlZWR4LDEpLCVlYXgKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWF4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWF4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCSglZWF4LCVlYXgsMSksJWVieAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJeG9ybAklZWN4LCVlYXgKKwlzdWJsCSVlYnAsJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVieAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9sbAkkOCwlZWN4CisJeG9ybAklZXNpLCVlYngKKwltb3ZsCTEyKCVlZGkpLCVlYnAKKwl4b3JsCSVlZHgsJWVjeAorCXhvcmwJJWVieCwlZWR4CisJeG9ybAklZWF4LCVlY3gKKwlyb2xsCSQyNCwlZWR4CisJeG9ybAklZWJ4LCVlYXgKKwl4b3JsCSVlYngsJWVjeAorCXJvbGwJJDE2LCVlYXgKKwl4b3JsCSVlZHgsJWVjeAorCXJvbGwJJDgsJWVieAorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWJwLCVlZHgKKwl4b3JsCSVlYngsJWVjeAorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWR4LCVlYnAKKwlsZWFsCSglZWR4LCVlZHgsMSksJWVheAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJc3VibAklZWJwLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlYXgKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVzaSwlZWF4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCSglZWF4LCVlYXgsMSksJWVieAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJc3VibAklZWJwLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlYngKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVkeCwlZWF4CisJeG9ybAklZXNpLCVlYngKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwlhbmRsCSVlYngsJWVicAorCWxlYWwJKCVlYngsJWVieCwxKSwlZWN4CisJbW92bAklZWJwLCVlc2kKKwlzaHJsCSQ3LCVlYnAKKwl4b3JsCSVlZHgsJWVieAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWN4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwlyb2xsCSQ4LCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCW1vdmwJMTYoJWVkaSksJWVicAorCXhvcmwJJWVheCwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwl4b3JsCSVlYngsJWVkeAorCXJvbGwJJDI0LCVlYXgKKwl4b3JsCSVlY3gsJWVieAorCXhvcmwJJWVjeCwlZWR4CisJcm9sbAkkMTYsJWVieAorCXhvcmwJJWVheCwlZWR4CisJcm9sbAkkOCwlZWN4CisJeG9ybAklZWJ4LCVlZHgKKwltb3ZsCSVlYnAsJWVheAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWR4LDEyKCVlZGkpCisJY21wbAkyOCglZXNwKSwlZWRpCisJamIJLkwwNTZwZXJtdXRlCisJeG9ybAklZWF4LCVlYXgKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCWFlc19ub2h3X3NldF9kZWNyeXB0X2tleSwuLS5MX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleV9iZWdpbgorLmJ5dGUJNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDQ0LDMyLDY3LDgyLDg5CisuYnl0ZQk4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQKKy5ieXRlCTExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODYuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODYuUwpAQCAtMCwwICsxLDI0NjggQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5nbG9ibAlhZXNuaV9lbmNyeXB0CisuaGlkZGVuCWFlc25pX2VuY3J5cHQKKy50eXBlCWFlc25pX2VuY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc25pX2VuY3J5cHQ6CisuTF9hZXNuaV9lbmNyeXB0X2JlZ2luOgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAkxMiglZXNwKSwlZWR4CisJbW92dXBzCSglZWF4KSwleG1tMgorCW1vdmwJMjQwKCVlZHgpLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVheAorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkwwMDBlbmMxX2xvb3BfMToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpuegkuTDAwMGVuYzFfbG9vcF8xCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJbW92dXBzCSV4bW0yLCglZWF4KQorCXB4b3IJJXhtbTIsJXhtbTIKKwlyZXQKKy5zaXplCWFlc25pX2VuY3J5cHQsLi0uTF9hZXNuaV9lbmNyeXB0X2JlZ2luCisuZ2xvYmwJYWVzbmlfZGVjcnlwdAorLmhpZGRlbglhZXNuaV9kZWNyeXB0CisudHlwZQlhZXNuaV9kZWNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNuaV9kZWNyeXB0OgorLkxfYWVzbmlfZGVjcnlwdF9iZWdpbjoKKwltb3ZsCTQoJWVzcCksJWVheAorCW1vdmwJMTIoJWVzcCksJWVkeAorCW1vdnVwcwkoJWVheCksJXhtbTIKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJbW92bAk4KCVlc3ApLCVlYXgKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKKy5MMDAxZGVjMV9sb29wXzI6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJLkwwMDFkZWMxX2xvb3BfMgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCW1vdnVwcwkleG1tMiwoJWVheCkKKwlweG9yCSV4bW0yLCV4bW0yCisJcmV0Cisuc2l6ZQlhZXNuaV9kZWNyeXB0LC4tLkxfYWVzbmlfZGVjcnlwdF9iZWdpbgorLmhpZGRlbglfYWVzbmlfZW5jcnlwdDIKKy50eXBlCV9hZXNuaV9lbmNyeXB0MixAZnVuY3Rpb24KKy5hbGlnbgkxNgorX2Flc25pX2VuY3J5cHQyOgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwlzaGxsCSQ0LCVlY3gKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwltb3Z1cHMJMzIoJWVkeCksJXhtbTAKKwlsZWFsCTMyKCVlZHgsJWVjeCwxKSwlZWR4CisJbmVnbAklZWN4CisJYWRkbAkkMTYsJWVjeAorLkwwMDJlbmMyX2xvb3A6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3Z1cHMJKCVlZHgsJWVjeCwxKSwleG1tMQorCWFkZGwJJDMyLCVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorCW1vdnVwcwktMTYoJWVkeCwlZWN4LDEpLCV4bW0wCisJam56CS5MMDAyZW5jMl9sb29wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorCXJldAorLnNpemUJX2Flc25pX2VuY3J5cHQyLC4tX2Flc25pX2VuY3J5cHQyCisuaGlkZGVuCV9hZXNuaV9kZWNyeXB0MgorLnR5cGUJX2Flc25pX2RlY3J5cHQyLEBmdW5jdGlvbgorLmFsaWduCTE2CitfYWVzbmlfZGVjcnlwdDI6CisJbW92dXBzCSglZWR4KSwleG1tMAorCXNobGwJJDQsJWVjeAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMworCW1vdnVwcwkzMiglZWR4KSwleG1tMAorCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKwlhZGRsCSQxNiwlZWN4CisuTDAwM2RlYzJfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0xCisJYWRkbAkkMzIsJWVjeAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJLkwwMDNkZWMyX2xvb3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjE2CisJcmV0Cisuc2l6ZQlfYWVzbmlfZGVjcnlwdDIsLi1fYWVzbmlfZGVjcnlwdDIKKy5oaWRkZW4JX2Flc25pX2VuY3J5cHQzCisudHlwZQlfYWVzbmlfZW5jcnlwdDMsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9lbmNyeXB0MzoKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJc2hsbAkkNCwlZWN4CisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tNAorCW1vdnVwcwkzMiglZWR4KSwleG1tMAorCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKwlhZGRsCSQxNiwlZWN4CisuTDAwNGVuYzNfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKwltb3Z1cHMJKCVlZHgsJWVjeCwxKSwleG1tMQorCWFkZGwJJDMyLCVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKwltb3Z1cHMJLTE2KCVlZHgsJWVjeCwxKSwleG1tMAorCWpuegkuTDAwNGVuYzNfbG9vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorCXJldAorLnNpemUJX2Flc25pX2VuY3J5cHQzLC4tX2Flc25pX2VuY3J5cHQzCisuaGlkZGVuCV9hZXNuaV9kZWNyeXB0MworLnR5cGUJX2Flc25pX2RlY3J5cHQzLEBmdW5jdGlvbgorLmFsaWduCTE2CitfYWVzbmlfZGVjcnlwdDM6CisJbW92dXBzCSglZWR4KSwleG1tMAorCXNobGwJJDQsJWVjeAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKwltb3Z1cHMJMzIoJWVkeCksJXhtbTAKKwlsZWFsCTMyKCVlZHgsJWVjeCwxKSwlZWR4CisJbmVnbAklZWN4CisJYWRkbAkkMTYsJWVjeAorLkwwMDVkZWMzX2xvb3A6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJLkwwMDVkZWMzX2xvb3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMjQKKwlyZXQKKy5zaXplCV9hZXNuaV9kZWNyeXB0MywuLV9hZXNuaV9kZWNyeXB0MworLmhpZGRlbglfYWVzbmlfZW5jcnlwdDQKKy50eXBlCV9hZXNuaV9lbmNyeXB0NCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX2Flc25pX2VuY3J5cHQ0OgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlzaGxsCSQ0LCVlY3gKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW00CisJcHhvcgkleG1tMCwleG1tNQorCW1vdnVwcwkzMiglZWR4KSwleG1tMAorCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKy5ieXRlCTE1LDMxLDY0LDAKKwlhZGRsCSQxNiwlZWN4CisuTDAwNmVuYzRfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMgorCW1vdnVwcwktMTYoJWVkeCwlZWN4LDEpLCV4bW0wCisJam56CS5MMDA2ZW5jNF9sb29wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMzIKKwlyZXQKKy5zaXplCV9hZXNuaV9lbmNyeXB0NCwuLV9hZXNuaV9lbmNyeXB0NAorLmhpZGRlbglfYWVzbmlfZGVjcnlwdDQKKy50eXBlCV9hZXNuaV9kZWNyeXB0NCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX2Flc25pX2RlY3J5cHQ0OgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlzaGxsCSQ0LCVlY3gKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW00CisJcHhvcgkleG1tMCwleG1tNQorCW1vdnVwcwkzMiglZWR4KSwleG1tMAorCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKy5ieXRlCTE1LDMxLDY0LDAKKwlhZGRsCSQxNiwlZWN4CisuTDAwN2RlYzRfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorCW1vdnVwcwktMTYoJWVkeCwlZWN4LDEpLCV4bW0wCisJam56CS5MMDA3ZGVjNF9sb29wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMzIKKwlyZXQKKy5zaXplCV9hZXNuaV9kZWNyeXB0NCwuLV9hZXNuaV9kZWNyeXB0NAorLmhpZGRlbglfYWVzbmlfZW5jcnlwdDYKKy50eXBlCV9hZXNuaV9lbmNyeXB0NixAZnVuY3Rpb24KKy5hbGlnbgkxNgorX2Flc25pX2VuY3J5cHQ2OgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwlzaGxsCSQ0LCVlY3gKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJcHhvcgkleG1tMCwleG1tNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0wCisJYWRkbAkkMTYsJWVjeAorCWptcAkuTDAwOF9hZXNuaV9lbmNyeXB0Nl9pbm5lcgorLmFsaWduCTE2CisuTDAwOWVuYzZfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5MMDA4X2Flc25pX2VuY3J5cHQ2X2lubmVyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLkxfYWVzbmlfZW5jcnlwdDZfZW50ZXI6CisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJLkwwMDllbmM2X2xvb3AKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyNDgKKwlyZXQKKy5zaXplCV9hZXNuaV9lbmNyeXB0NiwuLV9hZXNuaV9lbmNyeXB0NgorLmhpZGRlbglfYWVzbmlfZGVjcnlwdDYKKy50eXBlCV9hZXNuaV9kZWNyeXB0NixAZnVuY3Rpb24KKy5hbGlnbgkxNgorX2Flc25pX2RlY3J5cHQ2OgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwlzaGxsCSQ0LCVlY3gKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCXB4b3IJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisJcHhvcgkleG1tMCwleG1tNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0wCisJYWRkbAkkMTYsJWVjeAorCWptcAkuTDAxMF9hZXNuaV9kZWNyeXB0Nl9pbm5lcgorLmFsaWduCTE2CisuTDAxMWRlYzZfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5MMDEwX2Flc25pX2RlY3J5cHQ2X2lubmVyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLkxfYWVzbmlfZGVjcnlwdDZfZW50ZXI6CisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJLkwwMTFkZWM2X2xvb3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyNDgKKwlyZXQKKy5zaXplCV9hZXNuaV9kZWNyeXB0NiwuLV9hZXNuaV9kZWNyeXB0NgorLmdsb2JsCWFlc25pX2VjYl9lbmNyeXB0CisuaGlkZGVuCWFlc25pX2VjYl9lbmNyeXB0CisudHlwZQlhZXNuaV9lY2JfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzbmlfZWNiX2VuY3J5cHQ6CisuTF9hZXNuaV9lY2JfZW5jcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAkyOCglZXNwKSwlZWF4CisJbW92bAkzMiglZXNwKSwlZWR4CisJbW92bAkzNiglZXNwKSwlZWJ4CisJYW5kbAkkLTE2LCVlYXgKKwlqegkuTDAxMmVjYl9yZXQKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJdGVzdGwJJWVieCwlZWJ4CisJanoJLkwwMTNlY2JfZGVjcnlwdAorCW1vdmwJJWVkeCwlZWJwCisJbW92bAklZWN4LCVlYngKKwljbXBsCSQ5NiwlZWF4CisJamIJLkwwMTRlY2JfZW5jX3RhaWwKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJbW92ZHF1CTgwKCVlc2kpLCV4bW03CisJbGVhbAk5NiglZXNpKSwlZXNpCisJc3VibAkkOTYsJWVheAorCWptcAkuTDAxNWVjYl9lbmNfbG9vcDZfZW50ZXIKKy5hbGlnbgkxNgorLkwwMTZlY2JfZW5jX2xvb3A2OgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJbW92dXBzCSV4bW03LDgwKCVlZGkpCisJbGVhbAk5NiglZWRpKSwlZWRpCisJbW92ZHF1CTgwKCVlc2kpLCV4bW03CisJbGVhbAk5NiglZXNpKSwlZXNpCisuTDAxNWVjYl9lbmNfbG9vcDZfZW50ZXI6CisJY2FsbAlfYWVzbmlfZW5jcnlwdDYKKwltb3ZsCSVlYnAsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJc3VibAkkOTYsJWVheAorCWpuYwkuTDAxNmVjYl9lbmNfbG9vcDYKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJbW92dXBzCSV4bW03LDgwKCVlZGkpCisJbGVhbAk5NiglZWRpKSwlZWRpCisJYWRkbAkkOTYsJWVheAorCWp6CS5MMDEyZWNiX3JldAorLkwwMTRlY2JfZW5jX3RhaWw6CisJbW92dXBzCSglZXNpKSwleG1tMgorCWNtcGwJJDMyLCVlYXgKKwlqYgkuTDAxN2VjYl9lbmNfb25lCisJbW92dXBzCTE2KCVlc2kpLCV4bW0zCisJamUJLkwwMThlY2JfZW5jX3R3bworCW1vdnVwcwkzMiglZXNpKSwleG1tNAorCWNtcGwJJDY0LCVlYXgKKwlqYgkuTDAxOWVjYl9lbmNfdGhyZWUKKwltb3Z1cHMJNDgoJWVzaSksJXhtbTUKKwlqZQkuTDAyMGVjYl9lbmNfZm91cgorCW1vdnVwcwk2NCglZXNpKSwleG1tNgorCXhvcnBzCSV4bW03LCV4bW03CisJY2FsbAlfYWVzbmlfZW5jcnlwdDYKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJam1wCS5MMDEyZWNiX3JldAorLmFsaWduCTE2CisuTDAxN2VjYl9lbmNfb25lOgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkwwMjFlbmMxX2xvb3BfMzoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpuegkuTDAyMWVuYzFfbG9vcF8zCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwlqbXAJLkwwMTJlY2JfcmV0CisuYWxpZ24JMTYKKy5MMDE4ZWNiX2VuY190d286CisJY2FsbAlfYWVzbmlfZW5jcnlwdDIKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJam1wCS5MMDEyZWNiX3JldAorLmFsaWduCTE2CisuTDAxOWVjYl9lbmNfdGhyZWU6CisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJam1wCS5MMDEyZWNiX3JldAorLmFsaWduCTE2CisuTDAyMGVjYl9lbmNfZm91cjoKKwljYWxsCV9hZXNuaV9lbmNyeXB0NAorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwlqbXAJLkwwMTJlY2JfcmV0CisuYWxpZ24JMTYKKy5MMDEzZWNiX2RlY3J5cHQ6CisJbW92bAklZWR4LCVlYnAKKwltb3ZsCSVlY3gsJWVieAorCWNtcGwJJDk2LCVlYXgKKwlqYgkuTDAyMmVjYl9kZWNfdGFpbAorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTMKKwltb3ZkcXUJMzIoJWVzaSksJXhtbTQKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTYKKwltb3ZkcXUJODAoJWVzaSksJXhtbTcKKwlsZWFsCTk2KCVlc2kpLCVlc2kKKwlzdWJsCSQ5NiwlZWF4CisJam1wCS5MMDIzZWNiX2RlY19sb29wNl9lbnRlcgorLmFsaWduCTE2CisuTDAyNGVjYl9kZWNfbG9vcDY6CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3ZkcXUJMzIoJWVzaSksJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTYKKwltb3Z1cHMJJXhtbTcsODAoJWVkaSkKKwlsZWFsCTk2KCVlZGkpLCVlZGkKKwltb3ZkcXUJODAoJWVzaSksJXhtbTcKKwlsZWFsCTk2KCVlc2kpLCVlc2kKKy5MMDIzZWNiX2RlY19sb29wNl9lbnRlcjoKKwljYWxsCV9hZXNuaV9kZWNyeXB0NgorCW1vdmwJJWVicCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlzdWJsCSQ5NiwlZWF4CisJam5jCS5MMDI0ZWNiX2RlY19sb29wNgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwltb3Z1cHMJJXhtbTcsODAoJWVkaSkKKwlsZWFsCTk2KCVlZGkpLCVlZGkKKwlhZGRsCSQ5NiwlZWF4CisJanoJLkwwMTJlY2JfcmV0CisuTDAyMmVjYl9kZWNfdGFpbDoKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJY21wbAkkMzIsJWVheAorCWpiCS5MMDI1ZWNiX2RlY19vbmUKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTMKKwlqZQkuTDAyNmVjYl9kZWNfdHdvCisJbW92dXBzCTMyKCVlc2kpLCV4bW00CisJY21wbAkkNjQsJWVheAorCWpiCS5MMDI3ZWNiX2RlY190aHJlZQorCW1vdnVwcwk0OCglZXNpKSwleG1tNQorCWplCS5MMDI4ZWNiX2RlY19mb3VyCisJbW92dXBzCTY0KCVlc2kpLCV4bW02CisJeG9ycHMJJXhtbTcsJXhtbTcKKwljYWxsCV9hZXNuaV9kZWNyeXB0NgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlqbXAJLkwwMTJlY2JfcmV0CisuYWxpZ24JMTYKKy5MMDI1ZWNiX2RlY19vbmU6CisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCWxlYWwJMzIoJWVkeCksJWVkeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTDAyOWRlYzFfbG9vcF80OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CS5MMDI5ZGVjMV9sb29wXzQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJbW92dXBzCSV4bW0yLCglZWRpKQorCWptcAkuTDAxMmVjYl9yZXQKKy5hbGlnbgkxNgorLkwwMjZlY2JfZGVjX3R3bzoKKwljYWxsCV9hZXNuaV9kZWNyeXB0MgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwlqbXAJLkwwMTJlY2JfcmV0CisuYWxpZ24JMTYKKy5MMDI3ZWNiX2RlY190aHJlZToKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwlqbXAJLkwwMTJlY2JfcmV0CisuYWxpZ24JMTYKKy5MMDI4ZWNiX2RlY19mb3VyOgorCWNhbGwJX2Flc25pX2RlY3J5cHQ0CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCW1vdnVwcwkleG1tNSw0OCglZWRpKQorLkwwMTJlY2JfcmV0OgorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlhZXNuaV9lY2JfZW5jcnlwdCwuLS5MX2Flc25pX2VjYl9lbmNyeXB0X2JlZ2luCisuZ2xvYmwJYWVzbmlfY2NtNjRfZW5jcnlwdF9ibG9ja3MKKy5oaWRkZW4JYWVzbmlfY2NtNjRfZW5jcnlwdF9ibG9ja3MKKy50eXBlCWFlc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzLEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNuaV9jY202NF9lbmNyeXB0X2Jsb2NrczoKKy5MX2Flc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDYwLCVlc3AKKwlhbmRsCSQtMTYsJWVzcAorCW1vdmwJJWVicCw0OCglZXNwKQorCW1vdmRxdQkoJWVieCksJXhtbTcKKwltb3ZkcXUJKCVlY3gpLCV4bW0zCisJbW92bAkyNDAoJWVkeCksJWVjeAorCW1vdmwJJDIwMjE4MjE1OSwoJWVzcCkKKwltb3ZsCSQxMzQ4MTAxMjMsNCglZXNwKQorCW1vdmwJJDY3NDM4MDg3LDgoJWVzcCkKKwltb3ZsCSQ2NjA1MSwxMiglZXNwKQorCW1vdmwJJDEsJWVieAorCXhvcmwJJWVicCwlZWJwCisJbW92bAklZWJ4LDE2KCVlc3ApCisJbW92bAklZWJwLDIwKCVlc3ApCisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAklZWJwLDI4KCVlc3ApCisJc2hsbAkkNCwlZWN4CisJbW92bAkkMTYsJWVieAorCWxlYWwJKCVlZHgpLCVlYnAKKwltb3ZkcWEJKCVlc3ApLCV4bW01CisJbW92ZHFhCSV4bW03LCV4bW0yCisJbGVhbAkzMiglZWR4LCVlY3gsMSksJWVkeAorCXN1YmwJJWVjeCwlZWJ4CisuYnl0ZQkxMDIsMTUsNTYsMCwyNTMKKy5MMDMwY2NtNjRfZW5jX291dGVyOgorCW1vdnVwcwkoJWVicCksJXhtbTAKKwltb3ZsCSVlYngsJWVjeAorCW1vdnVwcwkoJWVzaSksJXhtbTYKKwl4b3JwcwkleG1tMCwleG1tMgorCW1vdnVwcwkxNiglZWJwKSwleG1tMQorCXhvcnBzCSV4bW02LCV4bW0wCisJeG9ycHMJJXhtbTAsJXhtbTMKKwltb3Z1cHMJMzIoJWVicCksJXhtbTAKKy5MMDMxY2NtNjRfZW5jMl9sb29wOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwltb3Z1cHMJLTE2KCVlZHgsJWVjeCwxKSwleG1tMAorCWpuegkuTDAzMWNjbTY0X2VuYzJfbG9vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcGFkZHEJMTYoJWVzcCksJXhtbTcKKwlkZWNsCSVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorCWxlYWwJMTYoJWVzaSksJWVzaQorCXhvcnBzCSV4bW0yLCV4bW02CisJbW92ZHFhCSV4bW03LCV4bW0yCisJbW92dXBzCSV4bW02LCglZWRpKQorLmJ5dGUJMTAyLDE1LDU2LDAsMjEzCisJbGVhbAkxNiglZWRpKSwlZWRpCisJam56CS5MMDMwY2NtNjRfZW5jX291dGVyCisJbW92bAk0OCglZXNwKSwlZXNwCisJbW92bAk0MCglZXNwKSwlZWRpCisJbW92dXBzCSV4bW0zLCglZWRpKQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlhZXNuaV9jY202NF9lbmNyeXB0X2Jsb2NrcywuLS5MX2Flc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzX2JlZ2luCisuZ2xvYmwJYWVzbmlfY2NtNjRfZGVjcnlwdF9ibG9ja3MKKy5oaWRkZW4JYWVzbmlfY2NtNjRfZGVjcnlwdF9ibG9ja3MKKy50eXBlCWFlc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzLEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrczoKKy5MX2Flc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDYwLCVlc3AKKwlhbmRsCSQtMTYsJWVzcAorCW1vdmwJJWVicCw0OCglZXNwKQorCW1vdmRxdQkoJWVieCksJXhtbTcKKwltb3ZkcXUJKCVlY3gpLCV4bW0zCisJbW92bAkyNDAoJWVkeCksJWVjeAorCW1vdmwJJDIwMjE4MjE1OSwoJWVzcCkKKwltb3ZsCSQxMzQ4MTAxMjMsNCglZXNwKQorCW1vdmwJJDY3NDM4MDg3LDgoJWVzcCkKKwltb3ZsCSQ2NjA1MSwxMiglZXNwKQorCW1vdmwJJDEsJWVieAorCXhvcmwJJWVicCwlZWJwCisJbW92bAklZWJ4LDE2KCVlc3ApCisJbW92bAklZWJwLDIwKCVlc3ApCisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAklZWJwLDI4KCVlc3ApCisJbW92ZHFhCSglZXNwKSwleG1tNQorCW1vdmRxYQkleG1tNywleG1tMgorCW1vdmwJJWVkeCwlZWJwCisJbW92bAklZWN4LCVlYngKKy5ieXRlCTEwMiwxNSw1NiwwLDI1MworCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkwwMzJlbmMxX2xvb3BfNToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpuegkuTDAzMmVuYzFfbG9vcF81CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCXNobGwJJDQsJWVieAorCW1vdmwJJDE2LCVlY3gKKwltb3Z1cHMJKCVlc2kpLCV4bW02CisJcGFkZHEJMTYoJWVzcCksJXhtbTcKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwlzdWJsCSVlYngsJWVjeAorCWxlYWwJMzIoJWVicCwlZWJ4LDEpLCVlZHgKKwltb3ZsCSVlY3gsJWVieAorCWptcAkuTDAzM2NjbTY0X2RlY19vdXRlcgorLmFsaWduCTE2CisuTDAzM2NjbTY0X2RlY19vdXRlcjoKKwl4b3JwcwkleG1tMiwleG1tNgorCW1vdmRxYQkleG1tNywleG1tMgorCW1vdnVwcwkleG1tNiwoJWVkaSkKKwlsZWFsCTE2KCVlZGkpLCVlZGkKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMworCXN1YmwJJDEsJWVheAorCWp6CS5MMDM0Y2NtNjRfZGVjX2JyZWFrCisJbW92dXBzCSglZWJwKSwleG1tMAorCW1vdmwJJWVieCwlZWN4CisJbW92dXBzCTE2KCVlYnApLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTYKKwl4b3JwcwkleG1tMCwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJbW92dXBzCTMyKCVlYnApLCV4bW0wCisuTDAzNWNjbTY0X2RlYzJfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0xCisJYWRkbAkkMzIsJWVjeAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJLkwwMzVjY202NF9kZWMyX2xvb3AKKwltb3Z1cHMJKCVlc2kpLCV4bW02CisJcGFkZHEJMTYoJWVzcCksJXhtbTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisJbGVhbAkxNiglZXNpKSwlZXNpCisJam1wCS5MMDMzY2NtNjRfZGVjX291dGVyCisuYWxpZ24JMTYKKy5MMDM0Y2NtNjRfZGVjX2JyZWFrOgorCW1vdmwJMjQwKCVlYnApLCVlY3gKKwltb3ZsCSVlYnAsJWVkeAorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tNgorCWxlYWwJMzIoJWVkeCksJWVkeAorCXhvcnBzCSV4bW02LCV4bW0zCisuTDAzNmVuYzFfbG9vcF82OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CS5MMDM2ZW5jMV9sb29wXzYKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE3CisJbW92bAk0OCglZXNwKSwlZXNwCisJbW92bAk0MCglZXNwKSwlZWRpCisJbW92dXBzCSV4bW0zLCglZWRpKQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlhZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrcywuLS5MX2Flc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzX2JlZ2luCisuZ2xvYmwJYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy5oaWRkZW4JYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy50eXBlCWFlc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzLEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2NrczoKKy5MX2Flc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDg4LCVlc3AKKwlhbmRsCSQtMTYsJWVzcAorCW1vdmwJJWVicCw4MCglZXNwKQorCWNtcGwJJDEsJWVheAorCWplCS5MMDM3Y3RyMzJfb25lX3Nob3J0Y3V0CisJbW92ZHF1CSglZWJ4KSwleG1tNworCW1vdmwJJDIwMjE4MjE1OSwoJWVzcCkKKwltb3ZsCSQxMzQ4MTAxMjMsNCglZXNwKQorCW1vdmwJJDY3NDM4MDg3LDgoJWVzcCkKKwltb3ZsCSQ2NjA1MSwxMiglZXNwKQorCW1vdmwJJDYsJWVjeAorCXhvcmwJJWVicCwlZWJwCisJbW92bAklZWN4LDE2KCVlc3ApCisJbW92bAklZWN4LDIwKCVlc3ApCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZWJwLDI4KCVlc3ApCisuYnl0ZQkxMDIsMTUsNTgsMjIsMjUxLDMKKy5ieXRlCTEwMiwxNSw1OCwzNCwyNTMsMworCW1vdmwJMjQwKCVlZHgpLCVlY3gKKwlic3dhcAklZWJ4CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3ZkcWEJKCVlc3ApLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTgsMzQsMTk1LDAKKwlsZWFsCTMoJWVieCksJWVicAorLmJ5dGUJMTAyLDE1LDU4LDM0LDIwNSwwCisJaW5jbAklZWJ4CisuYnl0ZQkxMDIsMTUsNTgsMzQsMTk1LDEKKwlpbmNsCSVlYnAKKy5ieXRlCTEwMiwxNSw1OCwzNCwyMDUsMQorCWluY2wJJWVieAorLmJ5dGUJMTAyLDE1LDU4LDM0LDE5NSwyCisJaW5jbAklZWJwCisuYnl0ZQkxMDIsMTUsNTgsMzQsMjA1LDIKKwltb3ZkcWEJJXhtbTAsNDgoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NAorCW1vdmRxdQkoJWVkeCksJXhtbTYKKwltb3ZkcWEJJXhtbTEsNjQoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMgorCXBzaHVmZAkkMTkyLCV4bW0wLCV4bW0yCisJcHNodWZkCSQxMjgsJXhtbTAsJXhtbTMKKwljbXBsCSQ2LCVlYXgKKwlqYgkuTDAzOGN0cjMyX3RhaWwKKwlweG9yCSV4bW02LCV4bW03CisJc2hsbAkkNCwlZWN4CisJbW92bAkkMTYsJWVieAorCW1vdmRxYQkleG1tNywzMiglZXNwKQorCW1vdmwJJWVkeCwlZWJwCisJc3VibAklZWN4LCVlYngKKwlsZWFsCTMyKCVlZHgsJWVjeCwxKSwlZWR4CisJc3VibAkkNiwlZWF4CisJam1wCS5MMDM5Y3RyMzJfbG9vcDYKKy5hbGlnbgkxNgorLkwwMzljdHIzMl9sb29wNjoKKwlwc2h1ZmQJJDY0LCV4bW0wLCV4bW00CisJbW92ZHFhCTMyKCVlc3ApLCV4bW0wCisJcHNodWZkCSQxOTIsJXhtbTEsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW0yCisJcHNodWZkCSQxMjgsJXhtbTEsJXhtbTYKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNodWZkCSQ2NCwleG1tMSwleG1tNworCW1vdnVwcwkxNiglZWJwKSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW01CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJJXhtbTAsJXhtbTYKKwlweG9yCSV4bW0wLCV4bW03CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCW1vdnVwcwkzMiglZWJwKSwleG1tMAorCW1vdmwJJWVieCwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCWNhbGwJLkxfYWVzbmlfZW5jcnlwdDZfZW50ZXIKKwltb3Z1cHMJKCVlc2kpLCV4bW0xCisJbW92dXBzCTE2KCVlc2kpLCV4bW0wCisJeG9ycHMJJXhtbTEsJXhtbTIKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3ZkcWEJMTYoJWVzcCksJXhtbTAKKwl4b3JwcwkleG1tMSwleG1tNAorCW1vdmRxYQk2NCglZXNwKSwleG1tMQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCXBhZGRkCSV4bW0wLCV4bW0xCisJcGFkZGQJNDgoJWVzcCksJXhtbTAKKwltb3ZkcWEJKCVlc3ApLCV4bW0yCisJbW92dXBzCTQ4KCVlc2kpLCV4bW0zCisJbW92dXBzCTY0KCVlc2kpLCV4bW00CisJeG9ycHMJJXhtbTMsJXhtbTUKKwltb3Z1cHMJODAoJWVzaSksJXhtbTMKKwlsZWFsCTk2KCVlc2kpLCVlc2kKKwltb3ZkcWEJJXhtbTAsNDgoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NAorCXhvcnBzCSV4bW00LCV4bW02CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJeG9ycHMJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTEsNjQoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMgorCW1vdnVwcwkleG1tNiw2NCglZWRpKQorCXBzaHVmZAkkMTkyLCV4bW0wLCV4bW0yCisJbW92dXBzCSV4bW03LDgwKCVlZGkpCisJbGVhbAk5NiglZWRpKSwlZWRpCisJcHNodWZkCSQxMjgsJXhtbTAsJXhtbTMKKwlzdWJsCSQ2LCVlYXgKKwlqbmMJLkwwMzljdHIzMl9sb29wNgorCWFkZGwJJDYsJWVheAorCWp6CS5MMDQwY3RyMzJfcmV0CisJbW92ZHF1CSglZWJwKSwleG1tNworCW1vdmwJJWVicCwlZWR4CisJcHhvcgkzMiglZXNwKSwleG1tNworCW1vdmwJMjQwKCVlYnApLCVlY3gKKy5MMDM4Y3RyMzJfdGFpbDoKKwlwb3IJJXhtbTcsJXhtbTIKKwljbXBsCSQyLCVlYXgKKwlqYgkuTDA0MWN0cjMyX29uZQorCXBzaHVmZAkkNjQsJXhtbTAsJXhtbTQKKwlwb3IJJXhtbTcsJXhtbTMKKwlqZQkuTDA0MmN0cjMyX3R3bworCXBzaHVmZAkkMTkyLCV4bW0xLCV4bW01CisJcG9yCSV4bW03LCV4bW00CisJY21wbAkkNCwlZWF4CisJamIJLkwwNDNjdHIzMl90aHJlZQorCXBzaHVmZAkkMTI4LCV4bW0xLCV4bW02CisJcG9yCSV4bW03LCV4bW01CisJamUJLkwwNDRjdHIzMl9mb3VyCisJcG9yCSV4bW03LCV4bW02CisJY2FsbAlfYWVzbmlfZW5jcnlwdDYKKwltb3Z1cHMJKCVlc2kpLCV4bW0xCisJbW92dXBzCTE2KCVlc2kpLCV4bW0wCisJeG9ycHMJJXhtbTEsJXhtbTIKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwk0OCglZXNpKSwleG1tMAorCXhvcnBzCSV4bW0xLCV4bW00CisJbW92dXBzCTY0KCVlc2kpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTUKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTEsJXhtbTYKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlqbXAJLkwwNDBjdHIzMl9yZXQKKy5hbGlnbgkxNgorLkwwMzdjdHIzMl9vbmVfc2hvcnRjdXQ6CisJbW92dXBzCSglZWJ4KSwleG1tMgorCW1vdmwJMjQwKCVlZHgpLCVlY3gKKy5MMDQxY3RyMzJfb25lOgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkwwNDVlbmMxX2xvb3BfNzoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpuegkuTDA0NWVuYzFfbG9vcF83CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdnVwcwkoJWVzaSksJXhtbTYKKwl4b3JwcwkleG1tMiwleG1tNgorCW1vdnVwcwkleG1tNiwoJWVkaSkKKwlqbXAJLkwwNDBjdHIzMl9yZXQKKy5hbGlnbgkxNgorLkwwNDJjdHIzMl90d286CisJY2FsbAlfYWVzbmlfZW5jcnlwdDIKKwltb3Z1cHMJKCVlc2kpLCV4bW01CisJbW92dXBzCTE2KCVlc2kpLCV4bW02CisJeG9ycHMJJXhtbTUsJXhtbTIKKwl4b3JwcwkleG1tNiwleG1tMworCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwlqbXAJLkwwNDBjdHIzMl9yZXQKKy5hbGlnbgkxNgorLkwwNDNjdHIzMl90aHJlZToKKwljYWxsCV9hZXNuaV9lbmNyeXB0MworCW1vdnVwcwkoJWVzaSksJXhtbTUKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTYKKwl4b3JwcwkleG1tNSwleG1tMgorCW1vdnVwcwkzMiglZXNpKSwleG1tNworCXhvcnBzCSV4bW02LCV4bW0zCisJbW92dXBzCSV4bW0yLCglZWRpKQorCXhvcnBzCSV4bW03LCV4bW00CisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJam1wCS5MMDQwY3RyMzJfcmV0CisuYWxpZ24JMTYKKy5MMDQ0Y3RyMzJfZm91cjoKKwljYWxsCV9hZXNuaV9lbmNyeXB0NAorCW1vdnVwcwkoJWVzaSksJXhtbTYKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTcKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTEKKwl4b3JwcwkleG1tNiwleG1tMgorCW1vdnVwcwk0OCglZXNpKSwleG1tMAorCXhvcnBzCSV4bW03LCV4bW0zCisJbW92dXBzCSV4bW0yLCglZWRpKQorCXhvcnBzCSV4bW0xLCV4bW00CisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJeG9ycHMJJXhtbTAsJXhtbTUKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKy5MMDQwY3RyMzJfcmV0OgorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJbW92ZHFhCSV4bW0wLDMyKCVlc3ApCisJcHhvcgkleG1tNSwleG1tNQorCW1vdmRxYQkleG1tMCw0OCglZXNwKQorCXB4b3IJJXhtbTYsJXhtbTYKKwltb3ZkcWEJJXhtbTAsNjQoJWVzcCkKKwlweG9yCSV4bW03LCV4bW03CisJbW92bAk4MCglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlhZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2NrcywuLS5MX2Flc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzX2JlZ2luCisuZ2xvYmwJYWVzbmlfeHRzX2VuY3J5cHQKKy5oaWRkZW4JYWVzbmlfeHRzX2VuY3J5cHQKKy50eXBlCWFlc25pX3h0c19lbmNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNuaV94dHNfZW5jcnlwdDoKKy5MX2Flc25pX3h0c19lbmNyeXB0X2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTM2KCVlc3ApLCVlZHgKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJbW92dXBzCSglZXNpKSwleG1tMgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkwwNDZlbmMxX2xvb3BfODoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpuegkuTDA0NmVuYzFfbG9vcF84CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVheAorCW1vdmwJMzIoJWVzcCksJWVkeAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkMTIwLCVlc3AKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJYW5kbAkkLTE2LCVlc3AKKwltb3ZsCSQxMzUsOTYoJWVzcCkKKwltb3ZsCSQwLDEwMCglZXNwKQorCW1vdmwJJDEsMTA0KCVlc3ApCisJbW92bAkkMCwxMDgoJWVzcCkKKwltb3ZsCSVlYXgsMTEyKCVlc3ApCisJbW92bAklZWJwLDExNiglZXNwKQorCW1vdmRxYQkleG1tMiwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTMKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJYW5kbAkkLTE2LCVlYXgKKwltb3ZsCSVlZHgsJWVicAorCW1vdmwJJWVjeCwlZWJ4CisJc3VibAkkOTYsJWVheAorCWpjCS5MMDQ3eHRzX2VuY19zaG9ydAorCXNobGwJJDQsJWVjeAorCW1vdmwJJDE2LCVlYngKKwlzdWJsCSVlY3gsJWVieAorCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwlqbXAJLkwwNDh4dHNfZW5jX2xvb3A2CisuYWxpZ24JMTYKKy5MMDQ4eHRzX2VuY19sb29wNjoKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQkleG1tMSwoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQkleG1tMSwzMiglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsNDgoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTcKKwltb3ZkcWEJJXhtbTEsNjQoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCW1vdnVwcwkoJWVicCksJXhtbTAKKwlwYW5kCSV4bW0zLCV4bW03CisJbW92dXBzCSglZXNpKSwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTcKKwltb3ZsCSVlYngsJWVjeAorCW1vdmRxdQkxNiglZXNpKSwleG1tMworCXhvcnBzCSV4bW0wLCV4bW0yCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJcHhvcgkleG1tMCwleG1tMworCW1vdmRxdQk0OCglZXNpKSwleG1tNQorCXB4b3IJJXhtbTAsJXhtbTQKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTYKKwlweG9yCSV4bW0wLCV4bW01CisJbW92ZHF1CTgwKCVlc2kpLCV4bW0xCisJcHhvcgkleG1tMCwleG1tNgorCWxlYWwJOTYoJWVzaSksJWVzaQorCXB4b3IJKCVlc3ApLCV4bW0yCisJbW92ZHFhCSV4bW03LDgwKCVlc3ApCisJcHhvcgkleG1tMSwleG1tNworCW1vdnVwcwkxNiglZWJwKSwleG1tMQorCXB4b3IJMTYoJWVzcCksJXhtbTMKKwlweG9yCTMyKCVlc3ApLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJNDgoJWVzcCksJXhtbTUKKwlweG9yCTY0KCVlc3ApLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCXB4b3IJJXhtbTAsJXhtbTcKKwltb3Z1cHMJMzIoJWVicCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJY2FsbAkuTF9hZXNuaV9lbmNyeXB0Nl9lbnRlcgorCW1vdmRxYQk4MCglZXNwKSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTAKKwl4b3JwcwkoJWVzcCksJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJeG9ycHMJMTYoJWVzcCksJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJMzIoJWVzcCksJXhtbTQKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwl4b3Jwcwk0OCglZXNwKSwleG1tNQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCXhvcnBzCTY0KCVlc3ApLCV4bW02CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJeG9ycHMJJXhtbTEsJXhtbTcKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJbW92dXBzCSV4bW03LDgwKCVlZGkpCisJbGVhbAk5NiglZWRpKSwlZWRpCisJbW92ZHFhCTk2KCVlc3ApLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMAorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJc3VibAkkOTYsJWVheAorCWpuYwkuTDA0OHh0c19lbmNfbG9vcDYKKwltb3ZsCTI0MCglZWJwKSwlZWN4CisJbW92bAklZWJwLCVlZHgKKwltb3ZsCSVlY3gsJWVieAorLkwwNDd4dHNfZW5jX3Nob3J0OgorCWFkZGwJJDk2LCVlYXgKKwlqegkuTDA0OXh0c19lbmNfZG9uZTZ4CisJbW92ZHFhCSV4bW0xLCV4bW01CisJY21wbAkkMzIsJWVheAorCWpiCS5MMDUweHRzX2VuY19vbmUKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJamUJLkwwNTF4dHNfZW5jX3R3bworCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLCV4bW02CisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwljbXBsCSQ2NCwlZWF4CisJamIJLkwwNTJ4dHNfZW5jX3RocmVlCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsJXhtbTcKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tNSwoJWVzcCkKKwltb3ZkcWEJJXhtbTYsMTYoJWVzcCkKKwlqZQkuTDA1M3h0c19lbmNfZm91cgorCW1vdmRxYQkleG1tNywzMiglZXNwKQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTcKKwltb3ZkcWEJJXhtbTEsNDgoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTcKKwlweG9yCSV4bW0xLCV4bW03CisJbW92ZHF1CSglZXNpKSwleG1tMgorCW1vdmRxdQkxNiglZXNpKSwleG1tMworCW1vdmRxdQkzMiglZXNpKSwleG1tNAorCXB4b3IJKCVlc3ApLCV4bW0yCisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJcHhvcgkxNiglZXNwKSwleG1tMworCW1vdmRxdQk2NCglZXNpKSwleG1tNgorCXB4b3IJMzIoJWVzcCksJXhtbTQKKwlsZWFsCTgwKCVlc2kpLCVlc2kKKwlweG9yCTQ4KCVlc3ApLCV4bW01CisJbW92ZHFhCSV4bW03LDY0KCVlc3ApCisJcHhvcgkleG1tNywleG1tNgorCWNhbGwJX2Flc25pX2VuY3J5cHQ2CisJbW92YXBzCTY0KCVlc3ApLCV4bW0xCisJeG9ycHMJKCVlc3ApLCV4bW0yCisJeG9ycHMJMTYoJWVzcCksJXhtbTMKKwl4b3JwcwkzMiglZXNwKSwleG1tNAorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwl4b3Jwcwk0OCglZXNwKSwleG1tNQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCXhvcnBzCSV4bW0xLCV4bW02CisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJbGVhbAk4MCglZWRpKSwlZWRpCisJam1wCS5MMDU0eHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MMDUweHRzX2VuY19vbmU6CisJbW92dXBzCSglZXNpKSwleG1tMgorCWxlYWwJMTYoJWVzaSksJWVzaQorCXhvcnBzCSV4bW01LCV4bW0yCisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCWxlYWwJMzIoJWVkeCksJWVkeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTDA1NWVuYzFfbG9vcF85OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CS5MMDU1ZW5jMV9sb29wXzkKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW01LCV4bW0xCisJam1wCS5MMDU0eHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MMDUxeHRzX2VuY190d286CisJbW92YXBzCSV4bW0xLCV4bW02CisJbW92dXBzCSglZXNpKSwleG1tMgorCW1vdnVwcwkxNiglZXNpKSwleG1tMworCWxlYWwJMzIoJWVzaSksJWVzaQorCXhvcnBzCSV4bW01LCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTMKKwljYWxsCV9hZXNuaV9lbmNyeXB0MgorCXhvcnBzCSV4bW01LCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbGVhbAkzMiglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW02LCV4bW0xCisJam1wCS5MMDU0eHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MMDUyeHRzX2VuY190aHJlZToKKwltb3ZhcHMJJXhtbTEsJXhtbTcKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbW92dXBzCTE2KCVlc2kpLCV4bW0zCisJbW92dXBzCTMyKCVlc2kpLCV4bW00CisJbGVhbAk0OCglZXNpKSwlZXNpCisJeG9ycHMJJXhtbTUsJXhtbTIKKwl4b3JwcwkleG1tNiwleG1tMworCXhvcnBzCSV4bW03LCV4bW00CisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbGVhbAk0OCglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW03LCV4bW0xCisJam1wCS5MMDU0eHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MMDUzeHRzX2VuY19mb3VyOgorCW1vdmFwcwkleG1tMSwleG1tNgorCW1vdnVwcwkoJWVzaSksJXhtbTIKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTMKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTQKKwl4b3JwcwkoJWVzcCksJXhtbTIKKwltb3Z1cHMJNDgoJWVzaSksJXhtbTUKKwlsZWFsCTY0KCVlc2kpLCVlc2kKKwl4b3JwcwkxNiglZXNwKSwleG1tMworCXhvcnBzCSV4bW03LCV4bW00CisJeG9ycHMJJXhtbTYsJXhtbTUKKwljYWxsCV9hZXNuaV9lbmNyeXB0NAorCXhvcnBzCSglZXNwKSwleG1tMgorCXhvcnBzCTE2KCVlc3ApLCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTYsJXhtbTUKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwlsZWFsCTY0KCVlZGkpLCVlZGkKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwlqbXAJLkwwNTR4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkwwNDl4dHNfZW5jX2RvbmU2eDoKKwltb3ZsCTExMiglZXNwKSwlZWF4CisJYW5kbAkkMTUsJWVheAorCWp6CS5MMDU2eHRzX2VuY19yZXQKKwltb3ZkcWEJJXhtbTEsJXhtbTUKKwltb3ZsCSVlYXgsMTEyKCVlc3ApCisJam1wCS5MMDU3eHRzX2VuY19zdGVhbAorLmFsaWduCTE2CisuTDA1NHh0c19lbmNfZG9uZToKKwltb3ZsCTExMiglZXNwKSwlZWF4CisJcHhvcgkleG1tMCwleG1tMAorCWFuZGwJJDE1LCVlYXgKKwlqegkuTDA1Nnh0c19lbmNfcmV0CisJcGNtcGd0ZAkleG1tMSwleG1tMAorCW1vdmwJJWVheCwxMTIoJWVzcCkKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW01CisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCTk2KCVlc3ApLCV4bW01CisJcHhvcgkleG1tMSwleG1tNQorLkwwNTd4dHNfZW5jX3N0ZWFsOgorCW1vdnpibAkoJWVzaSksJWVjeAorCW1vdnpibAktMTYoJWVkaSksJWVkeAorCWxlYWwJMSglZXNpKSwlZXNpCisJbW92YgklY2wsLTE2KCVlZGkpCisJbW92YgklZGwsKCVlZGkpCisJbGVhbAkxKCVlZGkpLCVlZGkKKwlzdWJsCSQxLCVlYXgKKwlqbnoJLkwwNTd4dHNfZW5jX3N0ZWFsCisJc3VibAkxMTIoJWVzcCksJWVkaQorCW1vdmwJJWVicCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwltb3Z1cHMJLTE2KCVlZGkpLCV4bW0yCisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKKy5MMDU4ZW5jMV9sb29wXzEwOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CS5MMDU4ZW5jMV9sb29wXzEwCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCXhvcnBzCSV4bW01LCV4bW0yCisJbW92dXBzCSV4bW0yLC0xNiglZWRpKQorLkwwNTZ4dHNfZW5jX3JldDoKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJcHhvcgkleG1tMywleG1tMworCW1vdmRxYQkleG1tMCwxNiglZXNwKQorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3ZkcWEJJXhtbTAsMzIoJWVzcCkKKwlweG9yCSV4bW01LCV4bW01CisJbW92ZHFhCSV4bW0wLDQ4KCVlc3ApCisJcHhvcgkleG1tNiwleG1tNgorCW1vdmRxYQkleG1tMCw2NCglZXNwKQorCXB4b3IJJXhtbTcsJXhtbTcKKwltb3ZkcWEJJXhtbTAsODAoJWVzcCkKKwltb3ZsCTExNiglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlhZXNuaV94dHNfZW5jcnlwdCwuLS5MX2Flc25pX3h0c19lbmNyeXB0X2JlZ2luCisuZ2xvYmwJYWVzbmlfeHRzX2RlY3J5cHQKKy5oaWRkZW4JYWVzbmlfeHRzX2RlY3J5cHQKKy50eXBlCWFlc25pX3h0c19kZWNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNuaV94dHNfZGVjcnlwdDoKKy5MX2Flc25pX3h0c19kZWNyeXB0X2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTM2KCVlc3ApLCVlZHgKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJbW92dXBzCSglZXNpKSwleG1tMgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkwwNTllbmMxX2xvb3BfMTE6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJLkwwNTllbmMxX2xvb3BfMTEKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAkyOCglZXNwKSwlZWF4CisJbW92bAkzMiglZXNwKSwlZWR4CisJbW92bAklZXNwLCVlYnAKKwlzdWJsCSQxMjAsJWVzcAorCWFuZGwJJC0xNiwlZXNwCisJeG9ybAklZWJ4LCVlYngKKwl0ZXN0bAkkMTUsJWVheAorCXNldG56CSVibAorCXNobGwJJDQsJWVieAorCXN1YmwJJWVieCwlZWF4CisJbW92bAkkMTM1LDk2KCVlc3ApCisJbW92bAkkMCwxMDAoJWVzcCkKKwltb3ZsCSQxLDEwNCglZXNwKQorCW1vdmwJJDAsMTA4KCVlc3ApCisJbW92bAklZWF4LDExMiglZXNwKQorCW1vdmwJJWVicCwxMTYoJWVzcCkKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJbW92bAklZWR4LCVlYnAKKwltb3ZsCSVlY3gsJWVieAorCW1vdmRxYQkleG1tMiwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTMKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJYW5kbAkkLTE2LCVlYXgKKwlzdWJsCSQ5NiwlZWF4CisJamMJLkwwNjB4dHNfZGVjX3Nob3J0CisJc2hsbAkkNCwlZWN4CisJbW92bAkkMTYsJWVieAorCXN1YmwJJWVjeCwlZWJ4CisJbGVhbAkzMiglZWR4LCVlY3gsMSksJWVkeAorCWptcAkuTDA2MXh0c19kZWNfbG9vcDYKKy5hbGlnbgkxNgorLkwwNjF4dHNfZGVjX2xvb3A2OgorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsMTYoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLDMyKCVlc3ApCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQkleG1tMSw0OCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJcHNodWZkCSQxOSwleG1tMCwleG1tNworCW1vdmRxYQkleG1tMSw2NCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJbW92dXBzCSglZWJwKSwleG1tMAorCXBhbmQJJXhtbTMsJXhtbTcKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJcHhvcgkleG1tMSwleG1tNworCW1vdmwJJWVieCwlZWN4CisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJeG9ycHMJJXhtbTAsJXhtbTIKKwltb3ZkcXUJMzIoJWVzaSksJXhtbTQKKwlweG9yCSV4bW0wLCV4bW0zCisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxdQk2NCglZXNpKSwleG1tNgorCXB4b3IJJXhtbTAsJXhtbTUKKwltb3ZkcXUJODAoJWVzaSksJXhtbTEKKwlweG9yCSV4bW0wLCV4bW02CisJbGVhbAk5NiglZXNpKSwlZXNpCisJcHhvcgkoJWVzcCksJXhtbTIKKwltb3ZkcWEJJXhtbTcsODAoJWVzcCkKKwlweG9yCSV4bW0xLCV4bW03CisJbW92dXBzCTE2KCVlYnApLCV4bW0xCisJcHhvcgkxNiglZXNwKSwleG1tMworCXB4b3IJMzIoJWVzcCksJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgk0OCglZXNwKSwleG1tNQorCXB4b3IJNjQoJWVzcCksJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisJcHhvcgkleG1tMCwleG1tNworCW1vdnVwcwkzMiglZWJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwljYWxsCS5MX2Flc25pX2RlY3J5cHQ2X2VudGVyCisJbW92ZHFhCTgwKCVlc3ApLCV4bW0xCisJcHhvcgkleG1tMCwleG1tMAorCXhvcnBzCSglZXNwKSwleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwl4b3JwcwkxNiglZXNwKSwleG1tMworCW1vdnVwcwkleG1tMiwoJWVkaSkKKwl4b3JwcwkzMiglZXNwKSwleG1tNAorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCXhvcnBzCTQ4KCVlc3ApLCV4bW01CisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJeG9ycHMJNjQoJWVzcCksJXhtbTYKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwl4b3JwcwkleG1tMSwleG1tNworCW1vdnVwcwkleG1tNiw2NCglZWRpKQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwltb3Z1cHMJJXhtbTcsODAoJWVkaSkKKwlsZWFsCTk2KCVlZGkpLCVlZGkKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0wCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlzdWJsCSQ5NiwlZWF4CisJam5jCS5MMDYxeHRzX2RlY19sb29wNgorCW1vdmwJMjQwKCVlYnApLCVlY3gKKwltb3ZsCSVlYnAsJWVkeAorCW1vdmwJJWVjeCwlZWJ4CisuTDA2MHh0c19kZWNfc2hvcnQ6CisJYWRkbAkkOTYsJWVheAorCWp6CS5MMDYyeHRzX2RlY19kb25lNngKKwltb3ZkcWEJJXhtbTEsJXhtbTUKKwljbXBsCSQzMiwlZWF4CisJamIJLkwwNjN4dHNfZGVjX29uZQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlqZQkuTDA2NHh0c19kZWNfdHdvCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsJXhtbTYKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCWNtcGwJJDY0LCVlYXgKKwlqYgkuTDA2NXh0c19kZWNfdGhyZWUKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQkleG1tMSwleG1tNworCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW01LCglZXNwKQorCW1vdmRxYQkleG1tNiwxNiglZXNwKQorCWplCS5MMDY2eHRzX2RlY19mb3VyCisJbW92ZHFhCSV4bW03LDMyKCVlc3ApCisJcHNodWZkCSQxOSwleG1tMCwleG1tNworCW1vdmRxYQkleG1tMSw0OCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tNworCXB4b3IJJXhtbTEsJXhtbTcKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJcHhvcgkoJWVzcCksJXhtbTIKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwlweG9yCTE2KCVlc3ApLCV4bW0zCisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJcHhvcgkzMiglZXNwKSwleG1tNAorCWxlYWwJODAoJWVzaSksJWVzaQorCXB4b3IJNDgoJWVzcCksJXhtbTUKKwltb3ZkcWEJJXhtbTcsNjQoJWVzcCkKKwlweG9yCSV4bW03LCV4bW02CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwltb3ZhcHMJNjQoJWVzcCksJXhtbTEKKwl4b3JwcwkoJWVzcCksJXhtbTIKKwl4b3JwcwkxNiglZXNwKSwleG1tMworCXhvcnBzCTMyKCVlc3ApLCV4bW00CisJbW92dXBzCSV4bW0yLCglZWRpKQorCXhvcnBzCTQ4KCVlc3ApLCV4bW01CisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJeG9ycHMJJXhtbTEsJXhtbTYKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlsZWFsCTgwKCVlZGkpLCVlZGkKKwlqbXAJLkwwNjd4dHNfZGVjX2RvbmUKKy5hbGlnbgkxNgorLkwwNjN4dHNfZGVjX29uZToKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbGVhbAkxNiglZXNpKSwlZXNpCisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKKy5MMDY4ZGVjMV9sb29wXzEyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CS5MMDY4ZGVjMV9sb29wXzEyCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCSV4bW01LCV4bW0yCisJbW92dXBzCSV4bW0yLCglZWRpKQorCWxlYWwJMTYoJWVkaSksJWVkaQorCW1vdmRxYQkleG1tNSwleG1tMQorCWptcAkuTDA2N3h0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTDA2NHh0c19kZWNfdHdvOgorCW1vdmFwcwkleG1tMSwleG1tNgorCW1vdnVwcwkoJWVzaSksJXhtbTIKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTMKKwlsZWFsCTMyKCVlc2kpLCVlc2kKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJY2FsbAlfYWVzbmlfZGVjcnlwdDIKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCWxlYWwJMzIoJWVkaSksJWVkaQorCW1vdmRxYQkleG1tNiwleG1tMQorCWptcAkuTDA2N3h0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTDA2NXh0c19kZWNfdGhyZWU6CisJbW92YXBzCSV4bW0xLCV4bW03CisJbW92dXBzCSglZXNpKSwleG1tMgorCW1vdnVwcwkxNiglZXNpKSwleG1tMworCW1vdnVwcwkzMiglZXNpKSwleG1tNAorCWxlYWwJNDgoJWVzaSksJWVzaQorCXhvcnBzCSV4bW01LCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTMKKwl4b3JwcwkleG1tNywleG1tNAorCWNhbGwJX2Flc25pX2RlY3J5cHQzCisJeG9ycHMJJXhtbTUsJXhtbTIKKwl4b3JwcwkleG1tNiwleG1tMworCXhvcnBzCSV4bW03LCV4bW00CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCWxlYWwJNDgoJWVkaSksJWVkaQorCW1vdmRxYQkleG1tNywleG1tMQorCWptcAkuTDA2N3h0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTDA2Nnh0c19kZWNfZm91cjoKKwltb3ZhcHMJJXhtbTEsJXhtbTYKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbW92dXBzCTE2KCVlc2kpLCV4bW0zCisJbW92dXBzCTMyKCVlc2kpLCV4bW00CisJeG9ycHMJKCVlc3ApLCV4bW0yCisJbW92dXBzCTQ4KCVlc2kpLCV4bW01CisJbGVhbAk2NCglZXNpKSwlZXNpCisJeG9ycHMJMTYoJWVzcCksJXhtbTMKKwl4b3JwcwkleG1tNywleG1tNAorCXhvcnBzCSV4bW02LCV4bW01CisJY2FsbAlfYWVzbmlfZGVjcnlwdDQKKwl4b3JwcwkoJWVzcCksJXhtbTIKKwl4b3JwcwkxNiglZXNwKSwleG1tMworCXhvcnBzCSV4bW03LCV4bW00CisJbW92dXBzCSV4bW0yLCglZWRpKQorCXhvcnBzCSV4bW02LCV4bW01CisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbGVhbAk2NCglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW02LCV4bW0xCisJam1wCS5MMDY3eHRzX2RlY19kb25lCisuYWxpZ24JMTYKKy5MMDYyeHRzX2RlY19kb25lNng6CisJbW92bAkxMTIoJWVzcCksJWVheAorCWFuZGwJJDE1LCVlYXgKKwlqegkuTDA2OXh0c19kZWNfcmV0CisJbW92bAklZWF4LDExMiglZXNwKQorCWptcAkuTDA3MHh0c19kZWNfb25seV9vbmVfbW9yZQorLmFsaWduCTE2CisuTDA2N3h0c19kZWNfZG9uZToKKwltb3ZsCTExMiglZXNwKSwlZWF4CisJcHhvcgkleG1tMCwleG1tMAorCWFuZGwJJDE1LCVlYXgKKwlqegkuTDA2OXh0c19kZWNfcmV0CisJcGNtcGd0ZAkleG1tMSwleG1tMAorCW1vdmwJJWVheCwxMTIoJWVzcCkKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQk5NiglZXNwKSwleG1tMworCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisuTDA3MHh0c19kZWNfb25seV9vbmVfbW9yZToKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW01CisJbW92ZHFhCSV4bW0xLCV4bW02CisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW01CisJcHhvcgkleG1tMSwleG1tNQorCW1vdmwJJWVicCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKKy5MMDcxZGVjMV9sb29wXzEzOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CS5MMDcxZGVjMV9sb29wXzEzCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCSV4bW01LCV4bW0yCisJbW92dXBzCSV4bW0yLCglZWRpKQorLkwwNzJ4dHNfZGVjX3N0ZWFsOgorCW1vdnpibAkxNiglZXNpKSwlZWN4CisJbW92emJsCSglZWRpKSwlZWR4CisJbGVhbAkxKCVlc2kpLCVlc2kKKwltb3ZiCSVjbCwoJWVkaSkKKwltb3ZiCSVkbCwxNiglZWRpKQorCWxlYWwJMSglZWRpKSwlZWRpCisJc3VibAkkMSwlZWF4CisJam56CS5MMDcyeHRzX2RlY19zdGVhbAorCXN1YmwJMTEyKCVlc3ApLCVlZGkKKwltb3ZsCSVlYnAsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJbW92dXBzCSglZWRpKSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0yCisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCWxlYWwJMzIoJWVkeCksJWVkeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTDA3M2RlYzFfbG9vcF8xNDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpuegkuTDA3M2RlYzFfbG9vcF8xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwl4b3JwcwkleG1tNiwleG1tMgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKy5MMDY5eHRzX2RlY19yZXQ6CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJbW92ZHFhCSV4bW0wLCglZXNwKQorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3ZkcWEJJXhtbTAsMTYoJWVzcCkKKwlweG9yCSV4bW00LCV4bW00CisJbW92ZHFhCSV4bW0wLDMyKCVlc3ApCisJcHhvcgkleG1tNSwleG1tNQorCW1vdmRxYQkleG1tMCw0OCglZXNwKQorCXB4b3IJJXhtbTYsJXhtbTYKKwltb3ZkcWEJJXhtbTAsNjQoJWVzcCkKKwlweG9yCSV4bW03LCV4bW03CisJbW92ZHFhCSV4bW0wLDgwKCVlc3ApCisJbW92bAkxMTYoJWVzcCksJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYWVzbmlfeHRzX2RlY3J5cHQsLi0uTF9hZXNuaV94dHNfZGVjcnlwdF9iZWdpbgorLmdsb2JsCWFlc25pX2NiY19lbmNyeXB0CisuaGlkZGVuCWFlc25pX2NiY19lbmNyeXB0CisudHlwZQlhZXNuaV9jYmNfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzbmlfY2JjX2VuY3J5cHQ6CisuTF9hZXNuaV9jYmNfZW5jcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAklZXNwLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwlzdWJsCSQyNCwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWF4CisJYW5kbAkkLTE2LCVlYngKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYnAKKwl0ZXN0bAklZWF4LCVlYXgKKwlqegkuTDA3NGNiY19hYm9ydAorCWNtcGwJJDAsNDAoJWVzcCkKKwl4Y2hnbAklZXNwLCVlYngKKwltb3Z1cHMJKCVlYnApLCV4bW03CisJbW92bAkyNDAoJWVkeCksJWVjeAorCW1vdmwJJWVkeCwlZWJwCisJbW92bAklZWJ4LDE2KCVlc3ApCisJbW92bAklZWN4LCVlYngKKwlqZQkuTDA3NWNiY19kZWNyeXB0CisJbW92YXBzCSV4bW03LCV4bW0yCisJY21wbAkkMTYsJWVheAorCWpiCS5MMDc2Y2JjX2VuY190YWlsCisJc3VibAkkMTYsJWVheAorCWptcAkuTDA3N2NiY19lbmNfbG9vcAorLmFsaWduCTE2CisuTDA3N2NiY19lbmNfbG9vcDoKKwltb3Z1cHMJKCVlc2kpLCV4bW03CisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW03CisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTcsJXhtbTIKKy5MMDc4ZW5jMV9sb29wXzE1OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CS5MMDc4ZW5jMV9sb29wXzE1CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdmwJJWVieCwlZWN4CisJbW92bAklZWJwLCVlZHgKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisJc3VibAkkMTYsJWVheAorCWpuYwkuTDA3N2NiY19lbmNfbG9vcAorCWFkZGwJJDE2LCVlYXgKKwlqbnoJLkwwNzZjYmNfZW5jX3RhaWwKKwltb3ZhcHMJJXhtbTIsJXhtbTcKKwlweG9yCSV4bW0yLCV4bW0yCisJam1wCS5MMDc5Y2JjX3JldAorLkwwNzZjYmNfZW5jX3RhaWw6CisJbW92bAklZWF4LCVlY3gKKy5sb25nCTI3Njc0NTE3ODUKKwltb3ZsCSQxNiwlZWN4CisJc3VibAklZWF4LCVlY3gKKwl4b3JsCSVlYXgsJWVheAorLmxvbmcJMjg2ODExNTA4MQorCWxlYWwJLTE2KCVlZGkpLCVlZGkKKwltb3ZsCSVlYngsJWVjeAorCW1vdmwJJWVkaSwlZXNpCisJbW92bAklZWJwLCVlZHgKKwlqbXAJLkwwNzdjYmNfZW5jX2xvb3AKKy5hbGlnbgkxNgorLkwwNzVjYmNfZGVjcnlwdDoKKwljbXBsCSQ4MCwlZWF4CisJamJlCS5MMDgwY2JjX2RlY190YWlsCisJbW92YXBzCSV4bW03LCglZXNwKQorCXN1YmwJJDgwLCVlYXgKKwlqbXAJLkwwODFjYmNfZGVjX2xvb3A2X2VudGVyCisuYWxpZ24JMTYKKy5MMDgyY2JjX2RlY19sb29wNjoKKwltb3ZhcHMJJXhtbTAsKCVlc3ApCisJbW92dXBzCSV4bW03LCglZWRpKQorCWxlYWwJMTYoJWVkaSksJWVkaQorLkwwODFjYmNfZGVjX2xvb3A2X2VudGVyOgorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTMKKwltb3ZkcXUJMzIoJWVzaSksJXhtbTQKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTYKKwltb3ZkcXUJODAoJWVzaSksJXhtbTcKKwljYWxsCV9hZXNuaV9kZWNyeXB0NgorCW1vdnVwcwkoJWVzaSksJXhtbTEKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTAKKwl4b3JwcwkoJWVzcCksJXhtbTIKKwl4b3JwcwkleG1tMSwleG1tMworCW1vdnVwcwkzMiglZXNpKSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW00CisJbW92dXBzCTQ4KCVlc2kpLCV4bW0wCisJeG9ycHMJJXhtbTEsJXhtbTUKKwltb3Z1cHMJNjQoJWVzaSksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tNgorCW1vdnVwcwk4MCglZXNpKSwleG1tMAorCXhvcnBzCSV4bW0xLCV4bW03CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCWxlYWwJOTYoJWVzaSksJWVzaQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCW1vdmwJJWVieCwlZWN4CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92bAklZWJwLCVlZHgKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlsZWFsCTgwKCVlZGkpLCVlZGkKKwlzdWJsCSQ5NiwlZWF4CisJamEJLkwwODJjYmNfZGVjX2xvb3A2CisJbW92YXBzCSV4bW03LCV4bW0yCisJbW92YXBzCSV4bW0wLCV4bW03CisJYWRkbAkkODAsJWVheAorCWpsZQkuTDA4M2NiY19kZWNfY2xlYXJfdGFpbF9jb2xsZWN0ZWQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisuTDA4MGNiY19kZWNfdGFpbDoKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbW92YXBzCSV4bW0yLCV4bW02CisJY21wbAkkMTYsJWVheAorCWpiZQkuTDA4NGNiY19kZWNfb25lCisJbW92dXBzCTE2KCVlc2kpLCV4bW0zCisJbW92YXBzCSV4bW0zLCV4bW01CisJY21wbAkkMzIsJWVheAorCWpiZQkuTDA4NWNiY19kZWNfdHdvCisJbW92dXBzCTMyKCVlc2kpLCV4bW00CisJY21wbAkkNDgsJWVheAorCWpiZQkuTDA4NmNiY19kZWNfdGhyZWUKKwltb3Z1cHMJNDgoJWVzaSksJXhtbTUKKwljbXBsCSQ2NCwlZWF4CisJamJlCS5MMDg3Y2JjX2RlY19mb3VyCisJbW92dXBzCTY0KCVlc2kpLCV4bW02CisJbW92YXBzCSV4bW03LCglZXNwKQorCW1vdnVwcwkoJWVzaSksJXhtbTIKKwl4b3JwcwkleG1tNywleG1tNworCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJbW92dXBzCSglZXNpKSwleG1tMQorCW1vdnVwcwkxNiglZXNpKSwleG1tMAorCXhvcnBzCSglZXNwKSwleG1tMgorCXhvcnBzCSV4bW0xLCV4bW0zCisJbW92dXBzCTMyKCVlc2kpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTQKKwltb3Z1cHMJNDgoJWVzaSksJXhtbTAKKwl4b3JwcwkleG1tMSwleG1tNQorCW1vdnVwcwk2NCglZXNpKSwleG1tNworCXhvcnBzCSV4bW0wLCV4bW02CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwlweG9yCSV4bW00LCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJcHhvcgkleG1tNSwleG1tNQorCWxlYWwJNjQoJWVkaSksJWVkaQorCW1vdmFwcwkleG1tNiwleG1tMgorCXB4b3IJJXhtbTYsJXhtbTYKKwlzdWJsCSQ4MCwlZWF4CisJam1wCS5MMDg4Y2JjX2RlY190YWlsX2NvbGxlY3RlZAorLmFsaWduCTE2CisuTDA4NGNiY19kZWNfb25lOgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkwwODlkZWMxX2xvb3BfMTY6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJLkwwODlkZWMxX2xvb3BfMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJJXhtbTcsJXhtbTIKKwltb3ZhcHMJJXhtbTYsJXhtbTcKKwlzdWJsCSQxNiwlZWF4CisJam1wCS5MMDg4Y2JjX2RlY190YWlsX2NvbGxlY3RlZAorLmFsaWduCTE2CisuTDA4NWNiY19kZWNfdHdvOgorCWNhbGwJX2Flc25pX2RlY3J5cHQyCisJeG9ycHMJJXhtbTcsJXhtbTIKKwl4b3JwcwkleG1tNiwleG1tMworCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3ZhcHMJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJbGVhbAkxNiglZWRpKSwlZWRpCisJbW92YXBzCSV4bW01LCV4bW03CisJc3VibAkkMzIsJWVheAorCWptcAkuTDA4OGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgkxNgorLkwwODZjYmNfZGVjX3RocmVlOgorCWNhbGwJX2Flc25pX2RlY3J5cHQzCisJeG9ycHMJJXhtbTcsJXhtbTIKKwl4b3JwcwkleG1tNiwleG1tMworCXhvcnBzCSV4bW01LCV4bW00CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdmFwcwkleG1tNCwleG1tMgorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJbGVhbAkzMiglZWRpKSwlZWRpCisJbW92dXBzCTMyKCVlc2kpLCV4bW03CisJc3VibAkkNDgsJWVheAorCWptcAkuTDA4OGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgkxNgorLkwwODdjYmNfZGVjX2ZvdXI6CisJY2FsbAlfYWVzbmlfZGVjcnlwdDQKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTEKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTAKKwl4b3JwcwkleG1tNywleG1tMgorCW1vdnVwcwk0OCglZXNpKSwleG1tNworCXhvcnBzCSV4bW02LCV4bW0zCisJbW92dXBzCSV4bW0yLCglZWRpKQorCXhvcnBzCSV4bW0xLCV4bW00CisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJcHhvcgkleG1tMywleG1tMworCXhvcnBzCSV4bW0wLCV4bW01CisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJcHhvcgkleG1tNCwleG1tNAorCWxlYWwJNDgoJWVkaSksJWVkaQorCW1vdmFwcwkleG1tNSwleG1tMgorCXB4b3IJJXhtbTUsJXhtbTUKKwlzdWJsCSQ2NCwlZWF4CisJam1wCS5MMDg4Y2JjX2RlY190YWlsX2NvbGxlY3RlZAorLmFsaWduCTE2CisuTDA4M2NiY19kZWNfY2xlYXJfdGFpbF9jb2xsZWN0ZWQ6CisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorLkwwODhjYmNfZGVjX3RhaWxfY29sbGVjdGVkOgorCWFuZGwJJDE1LCVlYXgKKwlqbnoJLkwwOTBjYmNfZGVjX3RhaWxfcGFydGlhbAorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwlweG9yCSV4bW0wLCV4bW0wCisJam1wCS5MMDc5Y2JjX3JldAorLmFsaWduCTE2CisuTDA5MGNiY19kZWNfdGFpbF9wYXJ0aWFsOgorCW1vdmFwcwkleG1tMiwoJWVzcCkKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92bAkkMTYsJWVjeAorCW1vdmwJJWVzcCwlZXNpCisJc3VibAklZWF4LCVlY3gKKy5sb25nCTI3Njc0NTE3ODUKKwltb3ZkcWEJJXhtbTIsKCVlc3ApCisuTDA3OWNiY19yZXQ6CisJbW92bAkxNiglZXNwKSwlZXNwCisJbW92bAkzNiglZXNwKSwlZWJwCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTcsKCVlYnApCisJcHhvcgkleG1tNywleG1tNworLkwwNzRjYmNfYWJvcnQ6CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlhZXNuaV9jYmNfZW5jcnlwdCwuLS5MX2Flc25pX2NiY19lbmNyeXB0X2JlZ2luCisuaGlkZGVuCV9hZXNuaV9zZXRfZW5jcnlwdF9rZXkKKy50eXBlCV9hZXNuaV9zZXRfZW5jcnlwdF9rZXksQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9zZXRfZW5jcnlwdF9rZXk6CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwl0ZXN0bAklZWF4LCVlYXgKKwlqegkuTDA5MWJhZF9wb2ludGVyCisJdGVzdGwJJWVkeCwlZWR4CisJanoJLkwwOTFiYWRfcG9pbnRlcgorCWNhbGwJLkwwOTJwaWMKKy5MMDkycGljOgorCXBvcGwJJWVieAorCWxlYWwJLkxrZXlfY29uc3QtLkwwOTJwaWMoJWVieCksJWVieAorCWxlYWwJT1BFTlNTTF9pYTMyY2FwX1AtLkxrZXlfY29uc3QoJWVieCksJWVicAorCW1vdnVwcwkoJWVheCksJXhtbTAKKwl4b3JwcwkleG1tNCwleG1tNAorCW1vdmwJNCglZWJwKSwlZWJwCisJbGVhbAkxNiglZWR4KSwlZWR4CisJYW5kbAkkMjY4NDM3NTA0LCVlYnAKKwljbXBsCSQyNTYsJWVjeAorCWplCS5MMDkzMTRyb3VuZHMKKwljbXBsCSQxOTIsJWVjeAorCWplCS5MMDk0MTJyb3VuZHMKKwljbXBsCSQxMjgsJWVjeAorCWpuZQkuTDA5NWJhZF9rZXliaXRzCisuYWxpZ24JMTYKKy5MMDk2MTByb3VuZHM6CisJY21wbAkkMjY4NDM1NDU2LCVlYnAKKwlqZQkuTDA5NzEwcm91bmRzX2FsdAorCW1vdmwJJDksJWVjeAorCW1vdnVwcwkleG1tMCwtMTYoJWVkeCkKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDEKKwljYWxsCS5MMDk4a2V5XzEyOF9jb2xkCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwyCisJY2FsbAkuTDA5OWtleV8xMjgKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDQKKwljYWxsCS5MMDk5a2V5XzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsOAorCWNhbGwJLkwwOTlrZXlfMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxNgorCWNhbGwJLkwwOTlrZXlfMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwzMgorCWNhbGwJLkwwOTlrZXlfMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw2NAorCWNhbGwJLkwwOTlrZXlfMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxMjgKKwljYWxsCS5MMDk5a2V5XzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMjcKKwljYWxsCS5MMDk5a2V5XzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsNTQKKwljYWxsCS5MMDk5a2V5XzEyOAorCW1vdnVwcwkleG1tMCwoJWVkeCkKKwltb3ZsCSVlY3gsODAoJWVkeCkKKwlqbXAJLkwxMDBnb29kX2tleQorLmFsaWduCTE2CisuTDA5OWtleV8xMjg6CisJbW92dXBzCSV4bW0wLCglZWR4KQorCWxlYWwJMTYoJWVkeCksJWVkeAorLkwwOThrZXlfMTI4X2NvbGQ6CisJc2h1ZnBzCSQxNiwleG1tMCwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQxNDAsJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwkkMjU1LCV4bW0xLCV4bW0xCisJeG9ycHMJJXhtbTEsJXhtbTAKKwlyZXQKKy5hbGlnbgkxNgorLkwwOTcxMHJvdW5kc19hbHQ6CisJbW92ZHFhCSglZWJ4KSwleG1tNQorCW1vdmwJJDgsJWVjeAorCW1vdmRxYQkzMiglZWJ4KSwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMgorCW1vdmRxdQkleG1tMCwtMTYoJWVkeCkKKy5MMTAxbG9vcF9rZXkxMjg6CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMTk2CisJcHNsbGQJJDEsJXhtbTQKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHF1CSV4bW0wLC0xNiglZWR4KQorCW1vdmRxYQkleG1tMCwleG1tMgorCWRlY2wJJWVjeAorCWpuegkuTDEwMWxvb3Bfa2V5MTI4CisJbW92ZHFhCTQ4KCVlYngpLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMTk2CisJcHNsbGQJJDEsJXhtbTQKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHF1CSV4bW0wLCglZWR4KQorCW1vdmRxYQkleG1tMCwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDE5NgorCW1vdmRxYQkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTAKKwltb3ZkcXUJJXhtbTAsMTYoJWVkeCkKKwltb3ZsCSQ5LCVlY3gKKwltb3ZsCSVlY3gsOTYoJWVkeCkKKwlqbXAJLkwxMDBnb29kX2tleQorLmFsaWduCTE2CisuTDA5NDEycm91bmRzOgorCW1vdnEJMTYoJWVheCksJXhtbTIKKwljbXBsCSQyNjg0MzU0NTYsJWVicAorCWplCS5MMTAyMTJyb3VuZHNfYWx0CisJbW92bAkkMTEsJWVjeAorCW1vdnVwcwkleG1tMCwtMTYoJWVkeCkKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDEKKwljYWxsCS5MMTAza2V5XzE5MmFfY29sZAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMgorCWNhbGwJLkwxMDRrZXlfMTkyYgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsNAorCWNhbGwJLkwxMDVrZXlfMTkyYQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsOAorCWNhbGwJLkwxMDRrZXlfMTkyYgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMTYKKwljYWxsCS5MMTA1a2V5XzE5MmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDMyCisJY2FsbAkuTDEwNGtleV8xOTJiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw2NAorCWNhbGwJLkwxMDVrZXlfMTkyYQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMTI4CisJY2FsbAkuTDEwNGtleV8xOTJiCisJbW92dXBzCSV4bW0wLCglZWR4KQorCW1vdmwJJWVjeCw0OCglZWR4KQorCWptcAkuTDEwMGdvb2Rfa2V5CisuYWxpZ24JMTYKKy5MMTA1a2V5XzE5MmE6CisJbW92dXBzCSV4bW0wLCglZWR4KQorCWxlYWwJMTYoJWVkeCksJWVkeAorLmFsaWduCTE2CisuTDEwM2tleV8xOTJhX2NvbGQ6CisJbW92YXBzCSV4bW0yLCV4bW01CisuTDEwNmtleV8xOTJiX3dhcm06CisJc2h1ZnBzCSQxNiwleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMiwleG1tMworCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQxNDAsJXhtbTAsJXhtbTQKKwlwc2xsZHEJJDQsJXhtbTMKKwl4b3JwcwkleG1tNCwleG1tMAorCXBzaHVmZAkkODUsJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMSwleG1tMAorCXBzaHVmZAkkMjU1LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMywleG1tMgorCXJldAorLmFsaWduCTE2CisuTDEwNGtleV8xOTJiOgorCW1vdmFwcwkleG1tMCwleG1tMworCXNodWZwcwkkNjgsJXhtbTAsJXhtbTUKKwltb3Z1cHMJJXhtbTUsKCVlZHgpCisJc2h1ZnBzCSQ3OCwleG1tMiwleG1tMworCW1vdnVwcwkleG1tMywxNiglZWR4KQorCWxlYWwJMzIoJWVkeCksJWVkeAorCWptcAkuTDEwNmtleV8xOTJiX3dhcm0KKy5hbGlnbgkxNgorLkwxMDIxMnJvdW5kc19hbHQ6CisJbW92ZHFhCTE2KCVlYngpLCV4bW01CisJbW92ZHFhCTMyKCVlYngpLCV4bW00CisJbW92bAkkOCwlZWN4CisJbW92ZHF1CSV4bW0wLC0xNiglZWR4KQorLkwxMDdsb29wX2tleTE5MjoKKwltb3ZxCSV4bW0yLCglZWR4KQorCW1vdmRxYQkleG1tMiwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjEzCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxMgorCXBzbGxkCSQxLCV4bW00CisJbGVhbAkyNCglZWR4KSwlZWR4CisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNodWZkCSQyNTUsJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMworCXB4b3IJJXhtbTIsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0yCisJbW92ZHF1CSV4bW0wLC0xNiglZWR4KQorCWRlY2wJJWVjeAorCWpuegkuTDEwN2xvb3Bfa2V5MTkyCisJbW92bAkkMTEsJWVjeAorCW1vdmwJJWVjeCwzMiglZWR4KQorCWptcAkuTDEwMGdvb2Rfa2V5CisuYWxpZ24JMTYKKy5MMDkzMTRyb3VuZHM6CisJbW92dXBzCTE2KCVlYXgpLCV4bW0yCisJbGVhbAkxNiglZWR4KSwlZWR4CisJY21wbAkkMjY4NDM1NDU2LCVlYnAKKwlqZQkuTDEwODE0cm91bmRzX2FsdAorCW1vdmwJJDEzLCVlY3gKKwltb3Z1cHMJJXhtbTAsLTMyKCVlZHgpCisJbW92dXBzCSV4bW0yLC0xNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMQorCWNhbGwJLkwxMDlrZXlfMjU2YV9jb2xkCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxCisJY2FsbAkuTDExMGtleV8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiwyCisJY2FsbAkuTDExMWtleV8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwyCisJY2FsbAkuTDExMGtleV8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw0CisJY2FsbAkuTDExMWtleV8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw0CisJY2FsbAkuTDExMGtleV8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw4CisJY2FsbAkuTDExMWtleV8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw4CisJY2FsbAkuTDExMGtleV8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiwxNgorCWNhbGwJLkwxMTFrZXlfMjU2YQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMTYKKwljYWxsCS5MMTEwa2V5XzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDMyCisJY2FsbAkuTDExMWtleV8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwzMgorCWNhbGwJLkwxMTBrZXlfMjU2YgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsNjQKKwljYWxsCS5MMTExa2V5XzI1NmEKKwltb3Z1cHMJJXhtbTAsKCVlZHgpCisJbW92bAklZWN4LDE2KCVlZHgpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJLkwxMDBnb29kX2tleQorLmFsaWduCTE2CisuTDExMWtleV8yNTZhOgorCW1vdnVwcwkleG1tMiwoJWVkeCkKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKy5MMTA5a2V5XzI1NmFfY29sZDoKKwlzaHVmcHMJJDE2LCV4bW0wLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTAKKwlzaHVmcHMJJDE0MCwleG1tMCwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQyNTUsJXhtbTEsJXhtbTEKKwl4b3JwcwkleG1tMSwleG1tMAorCXJldAorLmFsaWduCTE2CisuTDExMGtleV8yNTZiOgorCW1vdnVwcwkleG1tMCwoJWVkeCkKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlzaHVmcHMJJDE2LCV4bW0yLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTIKKwlzaHVmcHMJJDE0MCwleG1tMiwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0yCisJc2h1ZnBzCSQxNzAsJXhtbTEsJXhtbTEKKwl4b3JwcwkleG1tMSwleG1tMgorCXJldAorLmFsaWduCTE2CisuTDEwODE0cm91bmRzX2FsdDoKKwltb3ZkcWEJKCVlYngpLCV4bW01CisJbW92ZHFhCTMyKCVlYngpLCV4bW00CisJbW92bAkkNywlZWN4CisJbW92ZHF1CSV4bW0wLC0zMiglZWR4KQorCW1vdmRxYQkleG1tMiwleG1tMQorCW1vdmRxdQkleG1tMiwtMTYoJWVkeCkKKy5MMTEybG9vcF9rZXkyNTY6CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTMKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjEyCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbGQJJDEsJXhtbTQKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHF1CSV4bW0wLCglZWR4KQorCWRlY2wJJWVjeAorCWp6CS5MMTEzZG9uZV9rZXkyNTYKKwlwc2h1ZmQJJDI1NSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjExCisJbW92ZHFhCSV4bW0xLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMworCXBzbGxkcQkkNCwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTEKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tMSwleG1tMgorCW1vdmRxdQkleG1tMiwxNiglZWR4KQorCWxlYWwJMzIoJWVkeCksJWVkeAorCW1vdmRxYQkleG1tMiwleG1tMQorCWptcAkuTDExMmxvb3Bfa2V5MjU2CisuTDExM2RvbmVfa2V5MjU2OgorCW1vdmwJJDEzLCVlY3gKKwltb3ZsCSVlY3gsMTYoJWVkeCkKKy5MMTAwZ29vZF9rZXk6CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJeG9ybAklZWF4LCVlYXgKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgk0CisuTDA5MWJhZF9wb2ludGVyOgorCW1vdmwJJC0xLCVlYXgKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgk0CisuTDA5NWJhZF9rZXliaXRzOgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZsCSQtMiwlZWF4CisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlfYWVzbmlfc2V0X2VuY3J5cHRfa2V5LC4tX2Flc25pX3NldF9lbmNyeXB0X2tleQorLmdsb2JsCWFlc25pX3NldF9lbmNyeXB0X2tleQorLmhpZGRlbglhZXNuaV9zZXRfZW5jcnlwdF9rZXkKKy50eXBlCWFlc25pX3NldF9lbmNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzbmlfc2V0X2VuY3J5cHRfa2V5OgorLkxfYWVzbmlfc2V0X2VuY3J5cHRfa2V5X2JlZ2luOgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwljYWxsCV9hZXNuaV9zZXRfZW5jcnlwdF9rZXkKKwlyZXQKKy5zaXplCWFlc25pX3NldF9lbmNyeXB0X2tleSwuLS5MX2Flc25pX3NldF9lbmNyeXB0X2tleV9iZWdpbgorLmdsb2JsCWFlc25pX3NldF9kZWNyeXB0X2tleQorLmhpZGRlbglhZXNuaV9zZXRfZGVjcnlwdF9rZXkKKy50eXBlCWFlc25pX3NldF9kZWNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzbmlfc2V0X2RlY3J5cHRfa2V5OgorLkxfYWVzbmlfc2V0X2RlY3J5cHRfa2V5X2JlZ2luOgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwljYWxsCV9hZXNuaV9zZXRfZW5jcnlwdF9rZXkKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwlzaGxsCSQ0LCVlY3gKKwl0ZXN0bAklZWF4LCVlYXgKKwlqbnoJLkwxMTRkZWNfa2V5X3JldAorCWxlYWwJMTYoJWVkeCwlZWN4LDEpLCVlYXgKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCSglZWF4KSwleG1tMQorCW1vdnVwcwkleG1tMCwoJWVheCkKKwltb3Z1cHMJJXhtbTEsKCVlZHgpCisJbGVhbAkxNiglZWR4KSwlZWR4CisJbGVhbAktMTYoJWVheCksJWVheAorLkwxMTVkZWNfa2V5X2ludmVyc2U6CisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkoJWVheCksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwyMTksMTkyCisuYnl0ZQkxMDIsMTUsNTYsMjE5LDIwMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWxlYWwJLTE2KCVlYXgpLCVlYXgKKwltb3Z1cHMJJXhtbTAsMTYoJWVheCkKKwltb3Z1cHMJJXhtbTEsLTE2KCVlZHgpCisJY21wbAklZWR4LCVlYXgKKwlqYQkuTDExNWRlY19rZXlfaW52ZXJzZQorCW1vdnVwcwkoJWVkeCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMTksMTkyCisJbW92dXBzCSV4bW0wLCglZWR4KQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJeG9ybAklZWF4LCVlYXgKKy5MMTE0ZGVjX2tleV9yZXQ6CisJcmV0Cisuc2l6ZQlhZXNuaV9zZXRfZGVjcnlwdF9rZXksLi0uTF9hZXNuaV9zZXRfZGVjcnlwdF9rZXlfYmVnaW4KKy5hbGlnbgk2NAorLkxrZXlfY29uc3Q6CisubG9uZwkyMDIzMTMyMjksMjAyMzEzMjI5LDIwMjMxMzIyOSwyMDIzMTMyMjkKKy5sb25nCTY3NTY5MTU3LDY3NTY5MTU3LDY3NTY5MTU3LDY3NTY5MTU3CisubG9uZwkxLDEsMSwxCisubG9uZwkyNywyNywyNywyNworLmJ5dGUJNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsNzMsMTEwLDExNiwxMDEsMTA4LDMyLDY1LDY5CisuYnl0ZQk4Myw0NSw3OCw3Myw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MworLmJ5dGUJMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1CisuYnl0ZQkxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvYm4tNTg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9ibi01ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA2N2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvYm4tNTg2LlMKQEAgLTAsMCArMSwxNTM3IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisuZ2xvYmwJYm5fbXVsX2FkZF93b3JkcworLmhpZGRlbglibl9tdWxfYWRkX3dvcmRzCisudHlwZQlibl9tdWxfYWRkX3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9tdWxfYWRkX3dvcmRzOgorLkxfYm5fbXVsX2FkZF93b3Jkc19iZWdpbjoKKwljYWxsCS5MMDAwUElDX21lX3VwCisuTDAwMFBJQ19tZV91cDoKKwlwb3BsCSVlYXgKKwlsZWFsCU9QRU5TU0xfaWEzMmNhcF9QLS5MMDAwUElDX21lX3VwKCVlYXgpLCVlYXgKKwlidGwJJDI2LCglZWF4KQorCWpuYwkuTDAwMW1hd19ub25fc3NlMgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwltb3ZkCTE2KCVlc3ApLCVtbTAKKwlweG9yCSVtbTEsJW1tMQorCWptcAkuTDAwMm1hd19zc2UyX2VudHJ5CisuYWxpZ24JMTYKKy5MMDAzbWF3X3NzZTJfdW5yb2xsZWQ6CisJbW92ZAkoJWVheCksJW1tMworCXBhZGRxCSVtbTMsJW1tMQorCW1vdmQJKCVlZHgpLCVtbTIKKwlwbXVsdWRxCSVtbTAsJW1tMgorCW1vdmQJNCglZWR4KSwlbW00CisJcG11bHVkcQklbW0wLCVtbTQKKwltb3ZkCTgoJWVkeCksJW1tNgorCXBtdWx1ZHEJJW1tMCwlbW02CisJbW92ZAkxMiglZWR4KSwlbW03CisJcG11bHVkcQklbW0wLCVtbTcKKwlwYWRkcQklbW0yLCVtbTEKKwltb3ZkCTQoJWVheCksJW1tMworCXBhZGRxCSVtbTQsJW1tMworCW1vdmQJOCglZWF4KSwlbW01CisJcGFkZHEJJW1tNiwlbW01CisJbW92ZAkxMiglZWF4KSwlbW00CisJcGFkZHEJJW1tNCwlbW03CisJbW92ZAklbW0xLCglZWF4KQorCW1vdmQJMTYoJWVkeCksJW1tMgorCXBtdWx1ZHEJJW1tMCwlbW0yCisJcHNybHEJJDMyLCVtbTEKKwltb3ZkCTIwKCVlZHgpLCVtbTQKKwlwbXVsdWRxCSVtbTAsJW1tNAorCXBhZGRxCSVtbTMsJW1tMQorCW1vdmQJMjQoJWVkeCksJW1tNgorCXBtdWx1ZHEJJW1tMCwlbW02CisJbW92ZAklbW0xLDQoJWVheCkKKwlwc3JscQkkMzIsJW1tMQorCW1vdmQJMjgoJWVkeCksJW1tMworCWFkZGwJJDMyLCVlZHgKKwlwbXVsdWRxCSVtbTAsJW1tMworCXBhZGRxCSVtbTUsJW1tMQorCW1vdmQJMTYoJWVheCksJW1tNQorCXBhZGRxCSVtbTUsJW1tMgorCW1vdmQJJW1tMSw4KCVlYXgpCisJcHNybHEJJDMyLCVtbTEKKwlwYWRkcQklbW03LCVtbTEKKwltb3ZkCTIwKCVlYXgpLCVtbTUKKwlwYWRkcQklbW01LCVtbTQKKwltb3ZkCSVtbTEsMTIoJWVheCkKKwlwc3JscQkkMzIsJW1tMQorCXBhZGRxCSVtbTIsJW1tMQorCW1vdmQJMjQoJWVheCksJW1tNQorCXBhZGRxCSVtbTUsJW1tNgorCW1vdmQJJW1tMSwxNiglZWF4KQorCXBzcmxxCSQzMiwlbW0xCisJcGFkZHEJJW1tNCwlbW0xCisJbW92ZAkyOCglZWF4KSwlbW01CisJcGFkZHEJJW1tNSwlbW0zCisJbW92ZAklbW0xLDIwKCVlYXgpCisJcHNybHEJJDMyLCVtbTEKKwlwYWRkcQklbW02LCVtbTEKKwltb3ZkCSVtbTEsMjQoJWVheCkKKwlwc3JscQkkMzIsJW1tMQorCXBhZGRxCSVtbTMsJW1tMQorCW1vdmQJJW1tMSwyOCglZWF4KQorCWxlYWwJMzIoJWVheCksJWVheAorCXBzcmxxCSQzMiwlbW0xCisJc3VibAkkOCwlZWN4CisJanoJLkwwMDRtYXdfc3NlMl9leGl0CisuTDAwMm1hd19zc2UyX2VudHJ5OgorCXRlc3RsCSQ0Mjk0OTY3Mjg4LCVlY3gKKwlqbnoJLkwwMDNtYXdfc3NlMl91bnJvbGxlZAorLmFsaWduCTQKKy5MMDA1bWF3X3NzZTJfbG9vcDoKKwltb3ZkCSglZWR4KSwlbW0yCisJbW92ZAkoJWVheCksJW1tMworCXBtdWx1ZHEJJW1tMCwlbW0yCisJbGVhbAk0KCVlZHgpLCVlZHgKKwlwYWRkcQklbW0zLCVtbTEKKwlwYWRkcQklbW0yLCVtbTEKKwltb3ZkCSVtbTEsKCVlYXgpCisJc3VibAkkMSwlZWN4CisJcHNybHEJJDMyLCVtbTEKKwlsZWFsCTQoJWVheCksJWVheAorCWpuegkuTDAwNW1hd19zc2UyX2xvb3AKKy5MMDA0bWF3X3NzZTJfZXhpdDoKKwltb3ZkCSVtbTEsJWVheAorCWVtbXMKKwlyZXQKKy5hbGlnbgkxNgorLkwwMDFtYXdfbm9uX3NzZTI6CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCisJeG9ybAklZXNpLCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlYngKKwlhbmRsCSQ0Mjk0OTY3Mjg4LCVlY3gKKwltb3ZsCTMyKCVlc3ApLCVlYnAKKwlwdXNobAklZWN4CisJanoJLkwwMDZtYXdfZmluaXNoCisuYWxpZ24JMTYKKy5MMDA3bWF3X2xvb3A6CisKKwltb3ZsCSglZWJ4KSwlZWF4CisJbXVsbAklZWJwCisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCSglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTQoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAk0KCVlZGkpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTgoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAk4KCVlZGkpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsOCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTEyKCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMTIoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwxMiglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTE2KCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMTYoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwxNiglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTIwKCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMjAoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwyMCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTI0KCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMjQoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwyNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTI4KCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMjgoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwyOCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwlzdWJsCSQ4LCVlY3gKKwlsZWFsCTMyKCVlYngpLCVlYngKKwlsZWFsCTMyKCVlZGkpLCVlZGkKKwlqbnoJLkwwMDdtYXdfbG9vcAorLkwwMDZtYXdfZmluaXNoOgorCW1vdmwJMzIoJWVzcCksJWVjeAorCWFuZGwJJDcsJWVjeAorCWpuegkuTDAwOG1hd19maW5pc2gyCisJam1wCS5MMDA5bWF3X2VuZAorLkwwMDhtYXdfZmluaXNoMjoKKworCW1vdmwJKCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJKCVlZGkpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlkZWNsCSVlY3gKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlqegkuTDAwOW1hd19lbmQKKworCW1vdmwJNCglZWJ4KSwlZWF4CisJbXVsbAklZWJwCisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCTQoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCWRlY2wJJWVjeAorCW1vdmwJJWVheCw0KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlqegkuTDAwOW1hd19lbmQKKworCW1vdmwJOCglZWJ4KSwlZWF4CisJbXVsbAklZWJwCisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCTgoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCWRlY2wJJWVjeAorCW1vdmwJJWVheCw4KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlqegkuTDAwOW1hd19lbmQKKworCW1vdmwJMTIoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkxMiglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJZGVjbAklZWN4CisJbW92bAklZWF4LDEyKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlqegkuTDAwOW1hd19lbmQKKworCW1vdmwJMTYoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkxNiglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJZGVjbAklZWN4CisJbW92bAklZWF4LDE2KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlqegkuTDAwOW1hd19lbmQKKworCW1vdmwJMjAoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkyMCglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJZGVjbAklZWN4CisJbW92bAklZWF4LDIwKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlqegkuTDAwOW1hd19lbmQKKworCW1vdmwJMjQoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkyNCglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDI0KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKy5MMDA5bWF3X2VuZDoKKwltb3ZsCSVlc2ksJWVheAorCXBvcGwJJWVjeAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYm5fbXVsX2FkZF93b3JkcywuLS5MX2JuX211bF9hZGRfd29yZHNfYmVnaW4KKy5nbG9ibAlibl9tdWxfd29yZHMKKy5oaWRkZW4JYm5fbXVsX3dvcmRzCisudHlwZQlibl9tdWxfd29yZHMsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2JuX211bF93b3JkczoKKy5MX2JuX211bF93b3Jkc19iZWdpbjoKKwljYWxsCS5MMDEwUElDX21lX3VwCisuTDAxMFBJQ19tZV91cDoKKwlwb3BsCSVlYXgKKwlsZWFsCU9QRU5TU0xfaWEzMmNhcF9QLS5MMDEwUElDX21lX3VwKCVlYXgpLCVlYXgKKwlidGwJJDI2LCglZWF4KQorCWpuYwkuTDAxMW13X25vbl9zc2UyCisJbW92bAk0KCVlc3ApLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVjeAorCW1vdmQJMTYoJWVzcCksJW1tMAorCXB4b3IJJW1tMSwlbW0xCisuYWxpZ24JMTYKKy5MMDEybXdfc3NlMl9sb29wOgorCW1vdmQJKCVlZHgpLCVtbTIKKwlwbXVsdWRxCSVtbTAsJW1tMgorCWxlYWwJNCglZWR4KSwlZWR4CisJcGFkZHEJJW1tMiwlbW0xCisJbW92ZAklbW0xLCglZWF4KQorCXN1YmwJJDEsJWVjeAorCXBzcmxxCSQzMiwlbW0xCisJbGVhbAk0KCVlYXgpLCVlYXgKKwlqbnoJLkwwMTJtd19zc2UyX2xvb3AKKwltb3ZkCSVtbTEsJWVheAorCWVtbXMKKwlyZXQKKy5hbGlnbgkxNgorLkwwMTFtd19ub25fc3NlMjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisKKwl4b3JsCSVlc2ksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVieAorCW1vdmwJMjgoJWVzcCksJWVicAorCW1vdmwJMzIoJWVzcCksJWVjeAorCWFuZGwJJDQyOTQ5NjcyODgsJWVicAorCWp6CS5MMDEzbXdfZmluaXNoCisuTDAxNG13X2xvb3A6CisKKwltb3ZsCSglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKworCW1vdmwJNCglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisKKwltb3ZsCTgoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDgoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCisJbW92bAkxMiglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsMTIoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCisJbW92bAkxNiglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsMTYoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCisJbW92bAkyMCglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsMjAoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCisJbW92bAkyNCglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsMjQoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCisJbW92bAkyOCglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsMjgoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCisJYWRkbAkkMzIsJWVieAorCWFkZGwJJDMyLCVlZGkKKwlzdWJsCSQ4LCVlYnAKKwlqegkuTDAxM213X2ZpbmlzaAorCWptcAkuTDAxNG13X2xvb3AKKy5MMDEzbXdfZmluaXNoOgorCW1vdmwJMjgoJWVzcCksJWVicAorCWFuZGwJJDcsJWVicAorCWpuegkuTDAxNW13X2ZpbmlzaDIKKwlqbXAJLkwwMTZtd19lbmQKKy5MMDE1bXdfZmluaXNoMjoKKworCW1vdmwJKCVlYngpLCVlYXgKKwltdWxsCSVlY3gKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCWRlY2wJJWVicAorCWp6CS5MMDE2bXdfZW5kCisKKwltb3ZsCTQoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDQoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCWRlY2wJJWVicAorCWp6CS5MMDE2bXdfZW5kCisKKwltb3ZsCTgoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDgoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCWRlY2wJJWVicAorCWp6CS5MMDE2bXdfZW5kCisKKwltb3ZsCTEyKCVlYngpLCVlYXgKKwltdWxsCSVlY3gKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwxMiglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJZGVjbAklZWJwCisJanoJLkwwMTZtd19lbmQKKworCW1vdmwJMTYoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDE2KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlkZWNsCSVlYnAKKwlqegkuTDAxNm13X2VuZAorCisJbW92bAkyMCglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsMjAoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCWRlY2wJJWVicAorCWp6CS5MMDE2bXdfZW5kCisKKwltb3ZsCTI0KCVlYngpLCVlYXgKKwltdWxsCSVlY3gKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwyNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisuTDAxNm13X2VuZDoKKwltb3ZsCSVlc2ksJWVheAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYm5fbXVsX3dvcmRzLC4tLkxfYm5fbXVsX3dvcmRzX2JlZ2luCisuZ2xvYmwJYm5fc3FyX3dvcmRzCisuaGlkZGVuCWJuX3Nxcl93b3JkcworLnR5cGUJYm5fc3FyX3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9zcXJfd29yZHM6CisuTF9ibl9zcXJfd29yZHNfYmVnaW46CisJY2FsbAkuTDAxN1BJQ19tZV91cAorLkwwMTdQSUNfbWVfdXA6CisJcG9wbAklZWF4CisJbGVhbAlPUEVOU1NMX2lhMzJjYXBfUC0uTDAxN1BJQ19tZV91cCglZWF4KSwlZWF4CisJYnRsCSQyNiwoJWVheCkKKwlqbmMJLkwwMThzcXJfbm9uX3NzZTIKKwltb3ZsCTQoJWVzcCksJWVheAorCW1vdmwJOCglZXNwKSwlZWR4CisJbW92bAkxMiglZXNwKSwlZWN4CisuYWxpZ24JMTYKKy5MMDE5c3FyX3NzZTJfbG9vcDoKKwltb3ZkCSglZWR4KSwlbW0wCisJcG11bHVkcQklbW0wLCVtbTAKKwlsZWFsCTQoJWVkeCksJWVkeAorCW1vdnEJJW1tMCwoJWVheCkKKwlzdWJsCSQxLCVlY3gKKwlsZWFsCTgoJWVheCksJWVheAorCWpuegkuTDAxOXNxcl9zc2UyX2xvb3AKKwllbW1zCisJcmV0CisuYWxpZ24JMTYKKy5MMDE4c3FyX25vbl9zc2UyOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKworCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVieAorCWFuZGwJJDQyOTQ5NjcyODgsJWVieAorCWp6CS5MMDIwc3dfZmluaXNoCisuTDAyMXN3X2xvb3A6CisKKwltb3ZsCSglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVkeCw0KCVlc2kpCisKKwltb3ZsCTQoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisKKwltb3ZsCTgoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCwxNiglZXNpKQorCW1vdmwJJWVkeCwyMCglZXNpKQorCisJbW92bAkxMiglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDI0KCVlc2kpCisJbW92bAklZWR4LDI4KCVlc2kpCisKKwltb3ZsCTE2KCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsMzIoJWVzaSkKKwltb3ZsCSVlZHgsMzYoJWVzaSkKKworCW1vdmwJMjAoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCw0MCglZXNpKQorCW1vdmwJJWVkeCw0NCglZXNpKQorCisJbW92bAkyNCglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDQ4KCVlc2kpCisJbW92bAklZWR4LDUyKCVlc2kpCisKKwltb3ZsCTI4KCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsNTYoJWVzaSkKKwltb3ZsCSVlZHgsNjAoJWVzaSkKKworCWFkZGwJJDMyLCVlZGkKKwlhZGRsCSQ2NCwlZXNpCisJc3VibAkkOCwlZWJ4CisJam56CS5MMDIxc3dfbG9vcAorLkwwMjBzd19maW5pc2g6CisJbW92bAkyOCglZXNwKSwlZWJ4CisJYW5kbAkkNywlZWJ4CisJanoJLkwwMjJzd19lbmQKKworCW1vdmwJKCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsKCVlc2kpCisJZGVjbAklZWJ4CisJbW92bAklZWR4LDQoJWVzaSkKKwlqegkuTDAyMnN3X2VuZAorCisJbW92bAk0KCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsOCglZXNpKQorCWRlY2wJJWVieAorCW1vdmwJJWVkeCwxMiglZXNpKQorCWp6CS5MMDIyc3dfZW5kCisKKwltb3ZsCTgoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCwxNiglZXNpKQorCWRlY2wJJWVieAorCW1vdmwJJWVkeCwyMCglZXNpKQorCWp6CS5MMDIyc3dfZW5kCisKKwltb3ZsCTEyKCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsMjQoJWVzaSkKKwlkZWNsCSVlYngKKwltb3ZsCSVlZHgsMjgoJWVzaSkKKwlqegkuTDAyMnN3X2VuZAorCisJbW92bAkxNiglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDMyKCVlc2kpCisJZGVjbAklZWJ4CisJbW92bAklZWR4LDM2KCVlc2kpCisJanoJLkwwMjJzd19lbmQKKworCW1vdmwJMjAoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCw0MCglZXNpKQorCWRlY2wJJWVieAorCW1vdmwJJWVkeCw0NCglZXNpKQorCWp6CS5MMDIyc3dfZW5kCisKKwltb3ZsCTI0KCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsNDgoJWVzaSkKKwltb3ZsCSVlZHgsNTIoJWVzaSkKKy5MMDIyc3dfZW5kOgorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYm5fc3FyX3dvcmRzLC4tLkxfYm5fc3FyX3dvcmRzX2JlZ2luCisuZ2xvYmwJYm5fZGl2X3dvcmRzCisuaGlkZGVuCWJuX2Rpdl93b3JkcworLnR5cGUJYm5fZGl2X3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9kaXZfd29yZHM6CisuTF9ibl9kaXZfd29yZHNfYmVnaW46CisJbW92bAk0KCVlc3ApLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVheAorCW1vdmwJMTIoJWVzcCksJWVjeAorCWRpdmwJJWVjeAorCXJldAorLnNpemUJYm5fZGl2X3dvcmRzLC4tLkxfYm5fZGl2X3dvcmRzX2JlZ2luCisuZ2xvYmwJYm5fYWRkX3dvcmRzCisuaGlkZGVuCWJuX2FkZF93b3JkcworLnR5cGUJYm5fYWRkX3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9hZGRfd29yZHM6CisuTF9ibl9hZGRfd29yZHNfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCisJbW92bAkyMCglZXNwKSwlZWJ4CisJbW92bAkyNCglZXNwKSwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAkzMiglZXNwKSwlZWJwCisJeG9ybAklZWF4LCVlYXgKKwlhbmRsCSQ0Mjk0OTY3Mjg4LCVlYnAKKwlqegkuTDAyM2F3X2ZpbmlzaAorLkwwMjRhd19sb29wOgorCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisKKwltb3ZsCTQoJWVzaSksJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDQoJWVieCkKKworCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsOCglZWJ4KQorCisJbW92bAkxMiglZXNpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDEyKCVlYngpCisKKwltb3ZsCTE2KCVlc2kpLCVlY3gKKwltb3ZsCTE2KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMTYoJWVieCkKKworCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDI0KCVlYngpCisKKwltb3ZsCTI4KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjgoJWVieCkKKworCWFkZGwJJDMyLCVlc2kKKwlhZGRsCSQzMiwlZWRpCisJYWRkbAkkMzIsJWVieAorCXN1YmwJJDgsJWVicAorCWpuegkuTDAyNGF3X2xvb3AKKy5MMDIzYXdfZmluaXNoOgorCW1vdmwJMzIoJWVzcCksJWVicAorCWFuZGwJJDcsJWVicAorCWp6CS5MMDI1YXdfZW5kCisKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwoJWVieCkKKwlqegkuTDAyNWF3X2VuZAorCisJbW92bAk0KCVlc2kpLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCw0KCVlYngpCisJanoJLkwwMjVhd19lbmQKKworCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsOCglZWJ4KQorCWp6CS5MMDI1YXdfZW5kCisKKwltb3ZsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwlqegkuTDAyNWF3X2VuZAorCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDE2KCVlYngpCisJanoJLkwwMjVhd19lbmQKKworCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCWp6CS5MMDI1YXdfZW5kCisKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKKy5MMDI1YXdfZW5kOgorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYm5fYWRkX3dvcmRzLC4tLkxfYm5fYWRkX3dvcmRzX2JlZ2luCisuZ2xvYmwJYm5fc3ViX3dvcmRzCisuaGlkZGVuCWJuX3N1Yl93b3JkcworLnR5cGUJYm5fc3ViX3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9zdWJfd29yZHM6CisuTF9ibl9zdWJfd29yZHNfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCisJbW92bAkyMCglZXNwKSwlZWJ4CisJbW92bAkyNCglZXNwKSwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAkzMiglZXNwKSwlZWJwCisJeG9ybAklZWF4LCVlYXgKKwlhbmRsCSQ0Mjk0OTY3Mjg4LCVlYnAKKwlqegkuTDAyNmF3X2ZpbmlzaAorLkwwMjdhd19sb29wOgorCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisKKwltb3ZsCTQoJWVzaSksJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDQoJWVieCkKKworCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsOCglZWJ4KQorCisJbW92bAkxMiglZXNpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDEyKCVlYngpCisKKwltb3ZsCTE2KCVlc2kpLCVlY3gKKwltb3ZsCTE2KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMTYoJWVieCkKKworCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDI0KCVlYngpCisKKwltb3ZsCTI4KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjgoJWVieCkKKworCWFkZGwJJDMyLCVlc2kKKwlhZGRsCSQzMiwlZWRpCisJYWRkbAkkMzIsJWVieAorCXN1YmwJJDgsJWVicAorCWpuegkuTDAyN2F3X2xvb3AKKy5MMDI2YXdfZmluaXNoOgorCW1vdmwJMzIoJWVzcCksJWVicAorCWFuZGwJJDcsJWVicAorCWp6CS5MMDI4YXdfZW5kCisKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwoJWVieCkKKwlqegkuTDAyOGF3X2VuZAorCisJbW92bAk0KCVlc2kpLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCw0KCVlYngpCisJanoJLkwwMjhhd19lbmQKKworCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsOCglZWJ4KQorCWp6CS5MMDI4YXdfZW5kCisKKwltb3ZsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwlqegkuTDAyOGF3X2VuZAorCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDE2KCVlYngpCisJanoJLkwwMjhhd19lbmQKKworCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCWp6CS5MMDI4YXdfZW5kCisKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKKy5MMDI4YXdfZW5kOgorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJYm5fc3ViX3dvcmRzLC4tLkxfYm5fc3ViX3dvcmRzX2JlZ2luCisuZ2xvYmwJYm5fc3ViX3BhcnRfd29yZHMKKy5oaWRkZW4JYm5fc3ViX3BhcnRfd29yZHMKKy50eXBlCWJuX3N1Yl9wYXJ0X3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9zdWJfcGFydF93b3JkczoKKy5MX2JuX3N1Yl9wYXJ0X3dvcmRzX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKworCW1vdmwJMjAoJWVzcCksJWVieAorCW1vdmwJMjQoJWVzcCksJWVzaQorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJMzIoJWVzcCksJWVicAorCXhvcmwJJWVheCwlZWF4CisJYW5kbAkkNDI5NDk2NzI4OCwlZWJwCisJanoJLkwwMjlhd19maW5pc2gKKy5MMDMwYXdfbG9vcDoKKworCW1vdmwJKCVlc2kpLCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LCglZWJ4KQorCisJbW92bAk0KCVlc2kpLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCw0KCVlYngpCisKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDgoJWVieCkKKworCW1vdmwJMTIoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwxMiglZWJ4KQorCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDE2KCVlYngpCisKKwltb3ZsCTIwKCVlc2kpLCVlY3gKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjAoJWVieCkKKworCW1vdmwJMjQoJWVzaSksJWVjeAorCW1vdmwJMjQoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwyNCglZWJ4KQorCisJbW92bAkyOCglZXNpKSwlZWN4CisJbW92bAkyOCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDI4KCVlYngpCisKKwlhZGRsCSQzMiwlZXNpCisJYWRkbAkkMzIsJWVkaQorCWFkZGwJJDMyLCVlYngKKwlzdWJsCSQ4LCVlYnAKKwlqbnoJLkwwMzBhd19sb29wCisuTDAyOWF3X2ZpbmlzaDoKKwltb3ZsCTMyKCVlc3ApLCVlYnAKKwlhbmRsCSQ3LCVlYnAKKwlqegkuTDAzMWF3X2VuZAorCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJYWRkbAkkNCwlZXNpCisJYWRkbAkkNCwlZWRpCisJYWRkbAkkNCwlZWJ4CisJZGVjbAklZWJwCisJanoJLkwwMzFhd19lbmQKKworCW1vdmwJKCVlc2kpLCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LCglZWJ4KQorCWFkZGwJJDQsJWVzaQorCWFkZGwJJDQsJWVkaQorCWFkZGwJJDQsJWVieAorCWRlY2wJJWVicAorCWp6CS5MMDMxYXdfZW5kCisKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwoJWVieCkKKwlhZGRsCSQ0LCVlc2kKKwlhZGRsCSQ0LCVlZGkKKwlhZGRsCSQ0LCVlYngKKwlkZWNsCSVlYnAKKwlqegkuTDAzMWF3X2VuZAorCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJYWRkbAkkNCwlZXNpCisJYWRkbAkkNCwlZWRpCisJYWRkbAkkNCwlZWJ4CisJZGVjbAklZWJwCisJanoJLkwwMzFhd19lbmQKKworCW1vdmwJKCVlc2kpLCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LCglZWJ4KQorCWFkZGwJJDQsJWVzaQorCWFkZGwJJDQsJWVkaQorCWFkZGwJJDQsJWVieAorCWRlY2wJJWVicAorCWp6CS5MMDMxYXdfZW5kCisKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwoJWVieCkKKwlhZGRsCSQ0LCVlc2kKKwlhZGRsCSQ0LCVlZGkKKwlhZGRsCSQ0LCVlYngKKwlkZWNsCSVlYnAKKwlqegkuTDAzMWF3X2VuZAorCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJYWRkbAkkNCwlZXNpCisJYWRkbAkkNCwlZWRpCisJYWRkbAkkNCwlZWJ4CisuTDAzMWF3X2VuZDoKKwljbXBsCSQwLDM2KCVlc3ApCisJamUJLkwwMzJwd19lbmQKKwltb3ZsCTM2KCVlc3ApLCVlYnAKKwljbXBsCSQwLCVlYnAKKwlqZQkuTDAzMnB3X2VuZAorCWpnZQkuTDAzM3B3X3BvcworCisJbW92bAkkMCwlZWR4CisJc3VibAklZWJwLCVlZHgKKwltb3ZsCSVlZHgsJWVicAorCWFuZGwJJDQyOTQ5NjcyODgsJWVicAorCWp6CS5MMDM0cHdfbmVnX2ZpbmlzaAorLkwwMzVwd19uZWdfbG9vcDoKKworCW1vdmwJJDAsJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCw0KCVlYngpCisKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTgoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCw4KCVlYngpCisKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMTIoJWVieCkKKworCW1vdmwJJDAsJWVjeAorCW1vdmwJMTYoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwxNiglZWJ4KQorCisJbW92bAkkMCwlZWN4CisJbW92bAkyMCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDIwKCVlYngpCisKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKKworCW1vdmwJJDAsJWVjeAorCW1vdmwJMjgoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwyOCglZWJ4KQorCisJYWRkbAkkMzIsJWVkaQorCWFkZGwJJDMyLCVlYngKKwlzdWJsCSQ4LCVlYnAKKwlqbnoJLkwwMzVwd19uZWdfbG9vcAorLkwwMzRwd19uZWdfZmluaXNoOgorCW1vdmwJMzYoJWVzcCksJWVkeAorCW1vdmwJJDAsJWVicAorCXN1YmwJJWVkeCwlZWJwCisJYW5kbAkkNywlZWJwCisJanoJLkwwMzJwd19lbmQKKworCW1vdmwJJDAsJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsKCVlYngpCisJanoJLkwwMzJwd19lbmQKKworCW1vdmwJJDAsJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDQoJWVieCkKKwlqegkuTDAzMnB3X2VuZAorCisJbW92bAkkMCwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsOCglZWJ4KQorCWp6CS5MMDMycHdfZW5kCisKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwlqegkuTDAzMnB3X2VuZAorCisJbW92bAkkMCwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDE2KCVlYngpCisJanoJLkwwMzJwd19lbmQKKworCW1vdmwJJDAsJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCWp6CS5MMDMycHdfZW5kCisKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKKwlqbXAJLkwwMzJwd19lbmQKKy5MMDMzcHdfcG9zOgorCWFuZGwJJDQyOTQ5NjcyODgsJWVicAorCWp6CS5MMDM2cHdfcG9zX2ZpbmlzaAorLkwwMzdwd19wb3NfbG9vcDoKKworCW1vdmwJKCVlc2kpLCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCwoJWVieCkKKwlqbmMJLkwwMzhwd19uYzAKKworCW1vdmwJNCglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsNCglZWJ4KQorCWpuYwkuTDAzOXB3X25jMQorCisJbW92bAk4KCVlc2kpLCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCw4KCVlYngpCisJam5jCS5MMDQwcHdfbmMyCisKKwltb3ZsCTEyKCVlc2kpLCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCwxMiglZWJ4KQorCWpuYwkuTDA0MXB3X25jMworCisJbW92bAkxNiglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsMTYoJWVieCkKKwlqbmMJLkwwNDJwd19uYzQKKworCW1vdmwJMjAoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDIwKCVlYngpCisJam5jCS5MMDQzcHdfbmM1CisKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCwyNCglZWJ4KQorCWpuYwkuTDA0NHB3X25jNgorCisJbW92bAkyOCglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsMjgoJWVieCkKKwlqbmMJLkwwNDVwd19uYzcKKworCWFkZGwJJDMyLCVlc2kKKwlhZGRsCSQzMiwlZWJ4CisJc3VibAkkOCwlZWJwCisJam56CS5MMDM3cHdfcG9zX2xvb3AKKy5MMDM2cHdfcG9zX2ZpbmlzaDoKKwltb3ZsCTM2KCVlc3ApLCVlYnAKKwlhbmRsCSQ3LCVlYnAKKwlqegkuTDAzMnB3X2VuZAorCisJbW92bAkoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LCglZWJ4KQorCWpuYwkuTDA0NnB3X3RhaWxfbmMwCisJZGVjbAklZWJwCisJanoJLkwwMzJwd19lbmQKKworCW1vdmwJNCglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsNCglZWJ4KQorCWpuYwkuTDA0N3B3X3RhaWxfbmMxCisJZGVjbAklZWJwCisJanoJLkwwMzJwd19lbmQKKworCW1vdmwJOCglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsOCglZWJ4KQorCWpuYwkuTDA0OHB3X3RhaWxfbmMyCisJZGVjbAklZWJwCisJanoJLkwwMzJwd19lbmQKKworCW1vdmwJMTIoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDEyKCVlYngpCisJam5jCS5MMDQ5cHdfdGFpbF9uYzMKKwlkZWNsCSVlYnAKKwlqegkuTDAzMnB3X2VuZAorCisJbW92bAkxNiglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsMTYoJWVieCkKKwlqbmMJLkwwNTBwd190YWlsX25jNAorCWRlY2wJJWVicAorCWp6CS5MMDMycHdfZW5kCisKKwltb3ZsCTIwKCVlc2kpLCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCWpuYwkuTDA1MXB3X3RhaWxfbmM1CisJZGVjbAklZWJwCisJanoJLkwwMzJwd19lbmQKKworCW1vdmwJMjQoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDI0KCVlYngpCisJam5jCS5MMDUycHdfdGFpbF9uYzYKKwltb3ZsCSQxLCVlYXgKKwlqbXAJLkwwMzJwd19lbmQKKy5MMDUzcHdfbmNfbG9vcDoKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAklZWN4LCglZWJ4KQorLkwwMzhwd19uYzA6CisJbW92bAk0KCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsNCglZWJ4KQorLkwwMzlwd19uYzE6CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsOCglZWJ4KQorLkwwNDBwd19uYzI6CisJbW92bAkxMiglZXNpKSwlZWN4CisJbW92bAklZWN4LDEyKCVlYngpCisuTDA0MXB3X25jMzoKKwltb3ZsCTE2KCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsMTYoJWVieCkKKy5MMDQycHdfbmM0OgorCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJJWVjeCwyMCglZWJ4KQorLkwwNDNwd19uYzU6CisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAklZWN4LDI0KCVlYngpCisuTDA0NHB3X25jNjoKKwltb3ZsCTI4KCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsMjgoJWVieCkKKy5MMDQ1cHdfbmM3OgorCisJYWRkbAkkMzIsJWVzaQorCWFkZGwJJDMyLCVlYngKKwlzdWJsCSQ4LCVlYnAKKwlqbnoJLkwwNTNwd19uY19sb29wCisJbW92bAkzNiglZXNwKSwlZWJwCisJYW5kbAkkNywlZWJwCisJanoJLkwwNTRwd19uY19lbmQKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAklZWN4LCglZWJ4KQorLkwwNDZwd190YWlsX25jMDoKKwlkZWNsCSVlYnAKKwlqegkuTDA1NHB3X25jX2VuZAorCW1vdmwJNCglZXNpKSwlZWN4CisJbW92bAklZWN4LDQoJWVieCkKKy5MMDQ3cHdfdGFpbF9uYzE6CisJZGVjbAklZWJwCisJanoJLkwwNTRwd19uY19lbmQKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJJWVjeCw4KCVlYngpCisuTDA0OHB3X3RhaWxfbmMyOgorCWRlY2wJJWVicAorCWp6CS5MMDU0cHdfbmNfZW5kCisJbW92bAkxMiglZXNpKSwlZWN4CisJbW92bAklZWN4LDEyKCVlYngpCisuTDA0OXB3X3RhaWxfbmMzOgorCWRlY2wJJWVicAorCWp6CS5MMDU0cHdfbmNfZW5kCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAklZWN4LDE2KCVlYngpCisuTDA1MHB3X3RhaWxfbmM0OgorCWRlY2wJJWVicAorCWp6CS5MMDU0cHdfbmNfZW5kCisJbW92bAkyMCglZXNpKSwlZWN4CisJbW92bAklZWN4LDIwKCVlYngpCisuTDA1MXB3X3RhaWxfbmM1OgorCWRlY2wJJWVicAorCWp6CS5MMDU0cHdfbmNfZW5kCisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAklZWN4LDI0KCVlYngpCisuTDA1MnB3X3RhaWxfbmM2OgorLkwwNTRwd19uY19lbmQ6CisJbW92bAkkMCwlZWF4CisuTDAzMnB3X2VuZDoKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCWJuX3N1Yl9wYXJ0X3dvcmRzLC4tLkxfYm5fc3ViX3BhcnRfd29yZHNfYmVnaW4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvY28tNTg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9jby01ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjgzNGQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvY28tNTg2LlMKQEAgLTAsMCArMSwxMjU5IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisuZ2xvYmwJYm5fbXVsX2NvbWJhOAorLmhpZGRlbglibl9tdWxfY29tYmE4CisudHlwZQlibl9tdWxfY29tYmE4LEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9tdWxfY29tYmE4OgorLkxfYm5fbXVsX2NvbWJhOF9iZWdpbjoKKwlwdXNobAklZXNpCisJbW92bAkxMiglZXNwKSwlZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJeG9ybAklZWJ4LCVlYngKKwltb3ZsCSglZXNpKSwlZWF4CisJeG9ybAklZWN4LCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisKKwl4b3JsCSVlYnAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsKCVlYXgpCisJbW92bAk0KCVlc2kpLCVlYXgKKworCisJeG9ybAklZWJ4LCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCSglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDQoJWVheCkKKwltb3ZsCTgoJWVzaSksJWVheAorCisKKwl4b3JsCSVlY3gsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCSglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDgoJWVheCkKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKworCisJeG9ybAklZWJwLCVlYnAKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDEyKCVlYXgpCisJbW92bAkxNiglZXNpKSwlZWF4CisKKworCXhvcmwJJWVieCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCW1vdmwJJWVjeCwxNiglZWF4KQorCW1vdmwJMjAoJWVzaSksJWVheAorCisKKwl4b3JsCSVlY3gsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsMjAoJWVheCkKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKworCisJeG9ybAklZWJwLCVlYnAKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkyMCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTE2KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDI0KCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVieCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkyMCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMTYoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyMCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsMjgoJWVheCkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKworCisJeG9ybAklZWN4LCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTYoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCW1vdmwJJWVicCwzMiglZWF4KQorCW1vdmwJMjgoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYnAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTYoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDM2KCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVieCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyMCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDQwKCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVjeCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyMCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyMCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDQ0KCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVicCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDQ4KCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVieCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDUyKCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVjeCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDU2KCVlYXgpCisKKworCW1vdmwJJWVieCw2MCglZWF4KQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXJldAorLnNpemUJYm5fbXVsX2NvbWJhOCwuLS5MX2JuX211bF9jb21iYThfYmVnaW4KKy5nbG9ibAlibl9tdWxfY29tYmE0CisuaGlkZGVuCWJuX211bF9jb21iYTQKKy50eXBlCWJuX211bF9jb21iYTQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2JuX211bF9jb21iYTQ6CisuTF9ibl9tdWxfY29tYmE0X2JlZ2luOgorCXB1c2hsCSVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZWRpCisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwl4b3JsCSVlYngsJWVieAorCW1vdmwJKCVlc2kpLCVlYXgKKwl4b3JsCSVlY3gsJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKworCXhvcmwJJWVicCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwoJWVheCkKKwltb3ZsCTQoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYngsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsNCglZWF4KQorCW1vdmwJOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVjeCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsOCglZWF4KQorCW1vdmwJMTIoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYnAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDEyKCVlYXgpCisJbW92bAkxMiglZXNpKSwlZWF4CisKKworCXhvcmwJJWVieCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxMiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsMTYoJWVheCkKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKworCisJeG9ybAklZWN4LCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCW1vdmwJJWVicCwyMCglZWF4KQorCW1vdmwJMTIoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYnAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwyNCglZWF4KQorCisKKwltb3ZsCSVlY3gsMjgoJWVheCkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlyZXQKKy5zaXplCWJuX211bF9jb21iYTQsLi0uTF9ibl9tdWxfY29tYmE0X2JlZ2luCisuZ2xvYmwJYm5fc3FyX2NvbWJhOAorLmhpZGRlbglibl9zcXJfY29tYmE4CisudHlwZQlibl9zcXJfY29tYmE4LEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9zcXJfY29tYmE4OgorLkxfYm5fc3FyX2NvbWJhOF9iZWdpbjoKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWJ4LCVlYngKKwl4b3JsCSVlY3gsJWVjeAorCW1vdmwJKCVlc2kpLCVlYXgKKworCXhvcmwJJWVicCwlZWJwCisKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkoJWVzaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwoJWVkaSkKKwltb3ZsCTQoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYngsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJDAsJWVieAorCW1vdmwJJWVjeCw0KCVlZGkpCisJbW92bAkoJWVzaSksJWVkeAorCisKKwl4b3JsCSVlY3gsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJKCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsOCglZWRpKQorCW1vdmwJMTIoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYnAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJDAsJWVicAorCW1vdmwJNCglZXNpKSwlZWR4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwxMiglZWRpKQorCW1vdmwJKCVlc2kpLCVlZHgKKworCisJeG9ybAklZWJ4LCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxMiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisJbW92bAk0KCVlc2kpLCVlZHgKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKworCW11bGwJJWVheAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCSglZXNpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDE2KCVlZGkpCisJbW92bAkyMCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVjeCwlZWN4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWN4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCW1vdmwJNCglZXNpKSwlZWR4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWN4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCW1vdmwJOCglZXNpKSwlZWR4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWN4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCW1vdmwJJWVicCwyMCglZWRpKQorCW1vdmwJKCVlc2kpLCVlZHgKKworCisJeG9ybAklZWJwLCVlYnAKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyMCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJbW92bAk0KCVlc2kpLCVlZHgKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxNiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJbW92bAk4KCVlc2kpLCVlZHgKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxMiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkoJWVzaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwyNCglZWRpKQorCW1vdmwJMjgoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYngsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCTQoJWVzaSksJWVkeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCTgoJWVzaSksJWVkeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDI4KCVlZGkpCisJbW92bAk0KCVlc2kpLCVlZHgKKworCisJeG9ybAklZWN4LCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlY3gKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWN4CisJbW92bAk4KCVlc2kpLCVlZHgKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlY3gKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyMCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWN4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJOCglZXNpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDMyKCVlZGkpCisJbW92bAkyOCglZXNpKSwlZWF4CisKKworCXhvcmwJJWVicCwlZWJwCisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVicAorCW1vdmwJMTIoJWVzaSksJWVkeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyOCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDM2KCVlZGkpCisJbW92bAkxMiglZXNpKSwlZWR4CisKKworCXhvcmwJJWVieCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJ4CisJYWRkbAklZWF4LCVlY3gKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVieAorCW1vdmwJMTYoJWVzaSksJWVkeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKworCW11bGwJJWVheAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsNDAoJWVkaSkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKworCisJeG9ybAklZWN4LCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlY3gKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWN4CisJbW92bAkyMCglZXNpKSwlZWR4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWN4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMjgoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCW1vdmwJJWVicCw0NCglZWRpKQorCW1vdmwJMjAoJWVzaSksJWVkeAorCisKKwl4b3JsCSVlYnAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKworCW11bGwJJWVheAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI0KCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsNDgoJWVkaSkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKworCisJeG9ybAklZWJ4LCVlYngKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDUyKCVlZGkpCisKKworCXhvcmwJJWVjeCwlZWN4CisKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDU2KCVlZGkpCisKKwltb3ZsCSVlYngsNjAoJWVkaSkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlyZXQKKy5zaXplCWJuX3Nxcl9jb21iYTgsLi0uTF9ibl9zcXJfY29tYmE4X2JlZ2luCisuZ2xvYmwJYm5fc3FyX2NvbWJhNAorLmhpZGRlbglibl9zcXJfY29tYmE0CisudHlwZQlibl9zcXJfY29tYmE0LEBmdW5jdGlvbgorLmFsaWduCTE2Citibl9zcXJfY29tYmE0OgorLkxfYm5fc3FyX2NvbWJhNF9iZWdpbjoKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWJ4LCVlYngKKwl4b3JsCSVlY3gsJWVjeAorCW1vdmwJKCVlc2kpLCVlYXgKKworCXhvcmwJJWVicCwlZWJwCisKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkoJWVzaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwoJWVkaSkKKwltb3ZsCTQoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYngsJWVieAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJDAsJWVieAorCW1vdmwJJWVjeCw0KCVlZGkpCisJbW92bAkoJWVzaSksJWVkeAorCisKKwl4b3JsCSVlY3gsJWVjeAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJKCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsOCglZWRpKQorCW1vdmwJMTIoJWVzaSksJWVheAorCisKKwl4b3JsCSVlYnAsJWVicAorCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJDAsJWVicAorCW1vdmwJNCglZXNpKSwlZWR4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwxMiglZWRpKQorCW1vdmwJNCglZXNpKSwlZWR4CisKKworCXhvcmwJJWVieCwlZWJ4CisKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJ4CisJYWRkbAklZWF4LCVlY3gKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk4KCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsMTYoJWVkaSkKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKworCisJeG9ybAklZWN4LCVlY3gKKworCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlY3gKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkxMiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDIwKCVlZGkpCisKKworCXhvcmwJJWVicCwlZWJwCisKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDI0KCVlZGkpCisKKwltb3ZsCSVlY3gsMjgoJWVkaSkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlyZXQKKy5zaXplCWJuX3Nxcl9jb21iYTQsLi0uTF9ibl9zcXJfY29tYmE0X2JlZ2luCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Ni5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gteDg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4NGQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Ni5TCkBAIC0wLDAgKzEsMTA2OCBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCWdjbV9nbXVsdF80Yml0X21teAorLmhpZGRlbglnY21fZ211bHRfNGJpdF9tbXgKKy50eXBlCWdjbV9nbXVsdF80Yml0X21teCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorZ2NtX2dtdWx0XzRiaXRfbW14OgorLkxfZ2NtX2dtdWx0XzRiaXRfbW14X2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwljYWxsCS5MMDAwcGljX3BvaW50CisuTDAwMHBpY19wb2ludDoKKwlwb3BsCSVlYXgKKwlsZWFsCS5McmVtXzRiaXQtLkwwMDBwaWNfcG9pbnQoJWVheCksJWVheAorCW1vdnpibAkxNSglZWRpKSwlZWJ4CisJeG9ybAklZWN4LCVlY3gKKwltb3ZsCSVlYngsJWVkeAorCW1vdmIJJWRsLCVjbAorCW1vdmwJJDE0LCVlYnAKKwlzaGxiCSQ0LCVjbAorCWFuZGwJJDI0MCwlZWR4CisJbW92cQk4KCVlc2ksJWVjeCwxKSwlbW0wCisJbW92cQkoJWVzaSwlZWN4LDEpLCVtbTEKKwltb3ZkCSVtbTAsJWVieAorCWptcAkuTDAwMW1teF9sb29wCisuYWxpZ24JMTYKKy5MMDAxbW14X2xvb3A6CisJcHNybHEJJDQsJW1tMAorCWFuZGwJJDE1LCVlYngKKwltb3ZxCSVtbTEsJW1tMgorCXBzcmxxCSQ0LCVtbTEKKwlweG9yCTgoJWVzaSwlZWR4LDEpLCVtbTAKKwltb3ZiCSglZWRpLCVlYnAsMSksJWNsCisJcHNsbHEJJDYwLCVtbTIKKwlweG9yCSglZWF4LCVlYngsOCksJW1tMQorCWRlY2wJJWVicAorCW1vdmQJJW1tMCwlZWJ4CisJcHhvcgkoJWVzaSwlZWR4LDEpLCVtbTEKKwltb3ZsCSVlY3gsJWVkeAorCXB4b3IJJW1tMiwlbW0wCisJanMJLkwwMDJtbXhfYnJlYWsKKwlzaGxiCSQ0LCVjbAorCWFuZGwJJDE1LCVlYngKKwlwc3JscQkkNCwlbW0wCisJYW5kbAkkMjQwLCVlZHgKKwltb3ZxCSVtbTEsJW1tMgorCXBzcmxxCSQ0LCVtbTEKKwlweG9yCTgoJWVzaSwlZWN4LDEpLCVtbTAKKwlwc2xscQkkNjAsJW1tMgorCXB4b3IJKCVlYXgsJWVieCw4KSwlbW0xCisJbW92ZAklbW0wLCVlYngKKwlweG9yCSglZXNpLCVlY3gsMSksJW1tMQorCXB4b3IJJW1tMiwlbW0wCisJam1wCS5MMDAxbW14X2xvb3AKKy5hbGlnbgkxNgorLkwwMDJtbXhfYnJlYWs6CisJc2hsYgkkNCwlY2wKKwlhbmRsCSQxNSwlZWJ4CisJcHNybHEJJDQsJW1tMAorCWFuZGwJJDI0MCwlZWR4CisJbW92cQklbW0xLCVtbTIKKwlwc3JscQkkNCwlbW0xCisJcHhvcgk4KCVlc2ksJWVjeCwxKSwlbW0wCisJcHNsbHEJJDYwLCVtbTIKKwlweG9yCSglZWF4LCVlYngsOCksJW1tMQorCW1vdmQJJW1tMCwlZWJ4CisJcHhvcgkoJWVzaSwlZWN4LDEpLCVtbTEKKwlweG9yCSVtbTIsJW1tMAorCXBzcmxxCSQ0LCVtbTAKKwlhbmRsCSQxNSwlZWJ4CisJbW92cQklbW0xLCVtbTIKKwlwc3JscQkkNCwlbW0xCisJcHhvcgk4KCVlc2ksJWVkeCwxKSwlbW0wCisJcHNsbHEJJDYwLCVtbTIKKwlweG9yCSglZWF4LCVlYngsOCksJW1tMQorCW1vdmQJJW1tMCwlZWJ4CisJcHhvcgkoJWVzaSwlZWR4LDEpLCVtbTEKKwlweG9yCSVtbTIsJW1tMAorCXBzcmxxCSQzMiwlbW0wCisJbW92ZAklbW0xLCVlZHgKKwlwc3JscQkkMzIsJW1tMQorCW1vdmQJJW1tMCwlZWN4CisJbW92ZAklbW0xLCVlYnAKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVkeAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWJwCisJZW1tcworCW1vdmwJJWVieCwxMiglZWRpKQorCW1vdmwJJWVkeCw0KCVlZGkpCisJbW92bAklZWN4LDgoJWVkaSkKKwltb3ZsCSVlYnAsKCVlZGkpCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlnY21fZ211bHRfNGJpdF9tbXgsLi0uTF9nY21fZ211bHRfNGJpdF9tbXhfYmVnaW4KKy5nbG9ibAlnY21fZ2hhc2hfNGJpdF9tbXgKKy5oaWRkZW4JZ2NtX2doYXNoXzRiaXRfbW14CisudHlwZQlnY21fZ2hhc2hfNGJpdF9tbXgsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2djbV9naGFzaF80Yml0X21teDoKKy5MX2djbV9naGFzaF80Yml0X21teF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZWF4CisJbW92bAkyNCglZXNwKSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWN4CisJbW92bAkzMiglZXNwKSwlZWR4CisJbW92bAklZXNwLCVlYnAKKwljYWxsCS5MMDAzcGljX3BvaW50CisuTDAwM3BpY19wb2ludDoKKwlwb3BsCSVlc2kKKwlsZWFsCS5McmVtXzhiaXQtLkwwMDNwaWNfcG9pbnQoJWVzaSksJWVzaQorCXN1YmwJJDU0NCwlZXNwCisJYW5kbAkkLTY0LCVlc3AKKwlzdWJsCSQxNiwlZXNwCisJYWRkbAklZWN4LCVlZHgKKwltb3ZsCSVlYXgsNTQ0KCVlc3ApCisJbW92bAklZWR4LDU1MiglZXNwKQorCW1vdmwJJWVicCw1NTYoJWVzcCkKKwlhZGRsCSQxMjgsJWVieAorCWxlYWwJMTQ0KCVlc3ApLCVlZGkKKwlsZWFsCTQwMCglZXNwKSwlZWJwCisJbW92bAktMTIwKCVlYngpLCVlZHgKKwltb3ZxCS0xMjAoJWVieCksJW1tMAorCW1vdnEJLTEyOCglZWJ4KSwlbW0zCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsKCVlc3ApCisJbW92bAktMTA0KCVlYngpLCVlZHgKKwltb3ZxCS0xMDQoJWVieCksJW1tMgorCW1vdnEJLTExMiglZWJ4KSwlbW01CisJbW92cQklbW0wLC0xMjgoJWVkaSkKKwlwc3JscQkkNCwlbW0wCisJbW92cQklbW0zLCglZWRpKQorCW1vdnEJJW1tMywlbW03CisJcHNybHEJJDQsJW1tMworCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDEoJWVzcCkKKwltb3ZsCS04OCglZWJ4KSwlZWR4CisJbW92cQktODgoJWVieCksJW1tMQorCXBzbGxxCSQ2MCwlbW03CisJbW92cQktOTYoJWVieCksJW1tNAorCXBvcgklbW03LCVtbTAKKwltb3ZxCSVtbTIsLTEyMCglZWRpKQorCXBzcmxxCSQ0LCVtbTIKKwltb3ZxCSVtbTUsOCglZWRpKQorCW1vdnEJJW1tNSwlbW02CisJbW92cQklbW0wLC0xMjgoJWVicCkKKwlwc3JscQkkNCwlbW01CisJbW92cQklbW0zLCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDIoJWVzcCkKKwltb3ZsCS03MiglZWJ4KSwlZWR4CisJbW92cQktNzIoJWVieCksJW1tMAorCXBzbGxxCSQ2MCwlbW02CisJbW92cQktODAoJWVieCksJW1tMworCXBvcgklbW02LCVtbTIKKwltb3ZxCSVtbTEsLTExMiglZWRpKQorCXBzcmxxCSQ0LCVtbTEKKwltb3ZxCSVtbTQsMTYoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNworCW1vdnEJJW1tMiwtMTIwKCVlYnApCisJcHNybHEJJDQsJW1tNAorCW1vdnEJJW1tNSw4KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsMyglZXNwKQorCW1vdmwJLTU2KCVlYngpLCVlZHgKKwltb3ZxCS01NiglZWJ4KSwlbW0yCisJcHNsbHEJJDYwLCVtbTcKKwltb3ZxCS02NCglZWJ4KSwlbW01CisJcG9yCSVtbTcsJW1tMQorCW1vdnEJJW1tMCwtMTA0KCVlZGkpCisJcHNybHEJJDQsJW1tMAorCW1vdnEJJW1tMywyNCglZWRpKQorCW1vdnEJJW1tMywlbW02CisJbW92cQklbW0xLC0xMTIoJWVicCkKKwlwc3JscQkkNCwlbW0zCisJbW92cQklbW00LDE2KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsNCglZXNwKQorCW1vdmwJLTQwKCVlYngpLCVlZHgKKwltb3ZxCS00MCglZWJ4KSwlbW0xCisJcHNsbHEJJDYwLCVtbTYKKwltb3ZxCS00OCglZWJ4KSwlbW00CisJcG9yCSVtbTYsJW1tMAorCW1vdnEJJW1tMiwtOTYoJWVkaSkKKwlwc3JscQkkNCwlbW0yCisJbW92cQklbW01LDMyKCVlZGkpCisJbW92cQklbW01LCVtbTcKKwltb3ZxCSVtbTAsLTEwNCglZWJwKQorCXBzcmxxCSQ0LCVtbTUKKwltb3ZxCSVtbTMsMjQoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCw1KCVlc3ApCisJbW92bAktMjQoJWVieCksJWVkeAorCW1vdnEJLTI0KCVlYngpLCVtbTAKKwlwc2xscQkkNjAsJW1tNworCW1vdnEJLTMyKCVlYngpLCVtbTMKKwlwb3IJJW1tNywlbW0yCisJbW92cQklbW0xLC04OCglZWRpKQorCXBzcmxxCSQ0LCVtbTEKKwltb3ZxCSVtbTQsNDAoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNgorCW1vdnEJJW1tMiwtOTYoJWVicCkKKwlwc3JscQkkNCwlbW00CisJbW92cQklbW01LDMyKCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsNiglZXNwKQorCW1vdmwJLTgoJWVieCksJWVkeAorCW1vdnEJLTgoJWVieCksJW1tMgorCXBzbGxxCSQ2MCwlbW02CisJbW92cQktMTYoJWVieCksJW1tNQorCXBvcgklbW02LCVtbTEKKwltb3ZxCSVtbTAsLTgwKCVlZGkpCisJcHNybHEJJDQsJW1tMAorCW1vdnEJJW1tMyw0OCglZWRpKQorCW1vdnEJJW1tMywlbW03CisJbW92cQklbW0xLC04OCglZWJwKQorCXBzcmxxCSQ0LCVtbTMKKwltb3ZxCSVtbTQsNDAoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCw3KCVlc3ApCisJbW92bAk4KCVlYngpLCVlZHgKKwltb3ZxCTgoJWVieCksJW1tMQorCXBzbGxxCSQ2MCwlbW03CisJbW92cQkoJWVieCksJW1tNAorCXBvcgklbW03LCVtbTAKKwltb3ZxCSVtbTIsLTcyKCVlZGkpCisJcHNybHEJJDQsJW1tMgorCW1vdnEJJW1tNSw1NiglZWRpKQorCW1vdnEJJW1tNSwlbW02CisJbW92cQklbW0wLC04MCglZWJwKQorCXBzcmxxCSQ0LCVtbTUKKwltb3ZxCSVtbTMsNDgoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCw4KCVlc3ApCisJbW92bAkyNCglZWJ4KSwlZWR4CisJbW92cQkyNCglZWJ4KSwlbW0wCisJcHNsbHEJJDYwLCVtbTYKKwltb3ZxCTE2KCVlYngpLCVtbTMKKwlwb3IJJW1tNiwlbW0yCisJbW92cQklbW0xLC02NCglZWRpKQorCXBzcmxxCSQ0LCVtbTEKKwltb3ZxCSVtbTQsNjQoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNworCW1vdnEJJW1tMiwtNzIoJWVicCkKKwlwc3JscQkkNCwlbW00CisJbW92cQklbW01LDU2KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsOSglZXNwKQorCW1vdmwJNDAoJWVieCksJWVkeAorCW1vdnEJNDAoJWVieCksJW1tMgorCXBzbGxxCSQ2MCwlbW03CisJbW92cQkzMiglZWJ4KSwlbW01CisJcG9yCSVtbTcsJW1tMQorCW1vdnEJJW1tMCwtNTYoJWVkaSkKKwlwc3JscQkkNCwlbW0wCisJbW92cQklbW0zLDcyKCVlZGkpCisJbW92cQklbW0zLCVtbTYKKwltb3ZxCSVtbTEsLTY0KCVlYnApCisJcHNybHEJJDQsJW1tMworCW1vdnEJJW1tNCw2NCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDEwKCVlc3ApCisJbW92bAk1NiglZWJ4KSwlZWR4CisJbW92cQk1NiglZWJ4KSwlbW0xCisJcHNsbHEJJDYwLCVtbTYKKwltb3ZxCTQ4KCVlYngpLCVtbTQKKwlwb3IJJW1tNiwlbW0wCisJbW92cQklbW0yLC00OCglZWRpKQorCXBzcmxxCSQ0LCVtbTIKKwltb3ZxCSVtbTUsODAoJWVkaSkKKwltb3ZxCSVtbTUsJW1tNworCW1vdnEJJW1tMCwtNTYoJWVicCkKKwlwc3JscQkkNCwlbW01CisJbW92cQklbW0zLDcyKCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsMTEoJWVzcCkKKwltb3ZsCTcyKCVlYngpLCVlZHgKKwltb3ZxCTcyKCVlYngpLCVtbTAKKwlwc2xscQkkNjAsJW1tNworCW1vdnEJNjQoJWVieCksJW1tMworCXBvcgklbW03LCVtbTIKKwltb3ZxCSVtbTEsLTQwKCVlZGkpCisJcHNybHEJJDQsJW1tMQorCW1vdnEJJW1tNCw4OCglZWRpKQorCW1vdnEJJW1tNCwlbW02CisJbW92cQklbW0yLC00OCglZWJwKQorCXBzcmxxCSQ0LCVtbTQKKwltb3ZxCSVtbTUsODAoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCwxMiglZXNwKQorCW1vdmwJODgoJWVieCksJWVkeAorCW1vdnEJODgoJWVieCksJW1tMgorCXBzbGxxCSQ2MCwlbW02CisJbW92cQk4MCglZWJ4KSwlbW01CisJcG9yCSVtbTYsJW1tMQorCW1vdnEJJW1tMCwtMzIoJWVkaSkKKwlwc3JscQkkNCwlbW0wCisJbW92cQklbW0zLDk2KCVlZGkpCisJbW92cQklbW0zLCVtbTcKKwltb3ZxCSVtbTEsLTQwKCVlYnApCisJcHNybHEJJDQsJW1tMworCW1vdnEJJW1tNCw4OCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDEzKCVlc3ApCisJbW92bAkxMDQoJWVieCksJWVkeAorCW1vdnEJMTA0KCVlYngpLCVtbTEKKwlwc2xscQkkNjAsJW1tNworCW1vdnEJOTYoJWVieCksJW1tNAorCXBvcgklbW03LCVtbTAKKwltb3ZxCSVtbTIsLTI0KCVlZGkpCisJcHNybHEJJDQsJW1tMgorCW1vdnEJJW1tNSwxMDQoJWVkaSkKKwltb3ZxCSVtbTUsJW1tNgorCW1vdnEJJW1tMCwtMzIoJWVicCkKKwlwc3JscQkkNCwlbW01CisJbW92cQklbW0zLDk2KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsMTQoJWVzcCkKKwltb3ZsCTEyMCglZWJ4KSwlZWR4CisJbW92cQkxMjAoJWVieCksJW1tMAorCXBzbGxxCSQ2MCwlbW02CisJbW92cQkxMTIoJWVieCksJW1tMworCXBvcgklbW02LCVtbTIKKwltb3ZxCSVtbTEsLTE2KCVlZGkpCisJcHNybHEJJDQsJW1tMQorCW1vdnEJJW1tNCwxMTIoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNworCW1vdnEJJW1tMiwtMjQoJWVicCkKKwlwc3JscQkkNCwlbW00CisJbW92cQklbW01LDEwNCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDE1KCVlc3ApCisJcHNsbHEJJDYwLCVtbTcKKwlwb3IJJW1tNywlbW0xCisJbW92cQklbW0wLC04KCVlZGkpCisJcHNybHEJJDQsJW1tMAorCW1vdnEJJW1tMywxMjAoJWVkaSkKKwltb3ZxCSVtbTMsJW1tNgorCW1vdnEJJW1tMSwtMTYoJWVicCkKKwlwc3JscQkkNCwlbW0zCisJbW92cQklbW00LDExMiglZWJwKQorCXBzbGxxCSQ2MCwlbW02CisJcG9yCSVtbTYsJW1tMAorCW1vdnEJJW1tMCwtOCglZWJwKQorCW1vdnEJJW1tMywxMjAoJWVicCkKKwltb3ZxCSglZWF4KSwlbW02CisJbW92bAk4KCVlYXgpLCVlYngKKwltb3ZsCTEyKCVlYXgpLCVlZHgKKy5hbGlnbgkxNgorLkwwMDRvdXRlcjoKKwl4b3JsCTEyKCVlY3gpLCVlZHgKKwl4b3JsCTgoJWVjeCksJWVieAorCXB4b3IJKCVlY3gpLCVtbTYKKwlsZWFsCTE2KCVlY3gpLCVlY3gKKwltb3ZsCSVlYngsNTM2KCVlc3ApCisJbW92cQklbW02LDUyOCglZXNwKQorCW1vdmwJJWVjeCw1NDgoJWVzcCkKKwl4b3JsCSVlYXgsJWVheAorCXJvbGwJJDgsJWVkeAorCW1vdmIJJWRsLCVhbAorCW1vdmwJJWVheCwlZWJwCisJYW5kYgkkMTUsJWFsCisJc2hybAkkNCwlZWJwCisJcHhvcgklbW0wLCVtbTAKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCSVtbTEsJW1tMQorCXB4b3IJJW1tMiwlbW0yCisJbW92cQkxNiglZXNwLCVlYXgsOCksJW1tNworCW1vdnEJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJc2hybAkkNCwlZWRpCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0yCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUzNiglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0yLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0xCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlweG9yCSVtbTEsJW1tNgorCXNocmwJJDQsJWVicAorCXBpbnNydwkkMiwoJWVzaSwlZWJ4LDIpLCVtbTAKKwlweG9yCTE2KCVlc3AsJWVheCw4KSwlbW03CisJcm9sbAkkOCwlZWR4CisJcHhvcgkxNDQoJWVzcCwlZWF4LDgpLCVtbTYKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJNDAwKCVlc3AsJWVkaSw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWRpLDEpLCVjbAorCW1vdmIJJWRsLCVhbAorCW1vdmQJJW1tNywlZWJ4CisJbW92emJsCSVjbCwlZWN4CisJcHNybHEJJDgsJW1tNworCW1vdnEJJW1tNiwlbW0zCisJbW92bAklZWF4LCVlZGkKKwlwc3JscQkkOCwlbW02CisJcHhvcgkyNzIoJWVzcCwlZWJwLDgpLCVtbTcKKwlhbmRiCSQxNSwlYWwKKwlwc2xscQkkNTYsJW1tMworCXB4b3IJJW1tMCwlbW02CisJc2hybAkkNCwlZWRpCisJcGluc3J3CSQyLCglZXNpLCVlY3gsMiksJW1tMgorCXB4b3IJMTYoJWVzcCwlZWF4LDgpLCVtbTcKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCTE0NCglZXNwLCVlYXgsOCksJW1tNgorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwl4b3JiCSglZXNwLCVlYnAsMSksJWJsCisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlY3gKKwltb3Z6YmwJJWJsLCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVicAorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlZGksOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0yLCVtbTYKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0xCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUzMiglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0xLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0wCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlweG9yCSVtbTAsJW1tNgorCXNocmwJJDQsJWVicAorCXBpbnNydwkkMiwoJWVzaSwlZWJ4LDIpLCVtbTIKKwlweG9yCTE2KCVlc3AsJWVheCw4KSwlbW03CisJcm9sbAkkOCwlZWR4CisJcHhvcgkxNDQoJWVzcCwlZWF4LDgpLCVtbTYKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJNDAwKCVlc3AsJWVkaSw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWRpLDEpLCVjbAorCW1vdmIJJWRsLCVhbAorCW1vdmQJJW1tNywlZWJ4CisJbW92emJsCSVjbCwlZWN4CisJcHNybHEJJDgsJW1tNworCW1vdnEJJW1tNiwlbW0zCisJbW92bAklZWF4LCVlZGkKKwlwc3JscQkkOCwlbW02CisJcHhvcgkyNzIoJWVzcCwlZWJwLDgpLCVtbTcKKwlhbmRiCSQxNSwlYWwKKwlwc2xscQkkNTYsJW1tMworCXB4b3IJJW1tMiwlbW02CisJc2hybAkkNCwlZWRpCisJcGluc3J3CSQyLCglZXNpLCVlY3gsMiksJW1tMQorCXB4b3IJMTYoJWVzcCwlZWF4LDgpLCVtbTcKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCTE0NCglZXNwLCVlYXgsOCksJW1tNgorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwl4b3JiCSglZXNwLCVlYnAsMSksJWJsCisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlY3gKKwltb3Z6YmwJJWJsLCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVicAorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlZGksOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0xLCVtbTYKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0wCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUyOCglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0wLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0yCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlweG9yCSVtbTIsJW1tNgorCXNocmwJJDQsJWVicAorCXBpbnNydwkkMiwoJWVzaSwlZWJ4LDIpLCVtbTEKKwlweG9yCTE2KCVlc3AsJWVheCw4KSwlbW03CisJcm9sbAkkOCwlZWR4CisJcHhvcgkxNDQoJWVzcCwlZWF4LDgpLCVtbTYKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJNDAwKCVlc3AsJWVkaSw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWRpLDEpLCVjbAorCW1vdmIJJWRsLCVhbAorCW1vdmQJJW1tNywlZWJ4CisJbW92emJsCSVjbCwlZWN4CisJcHNybHEJJDgsJW1tNworCW1vdnEJJW1tNiwlbW0zCisJbW92bAklZWF4LCVlZGkKKwlwc3JscQkkOCwlbW02CisJcHhvcgkyNzIoJWVzcCwlZWJwLDgpLCVtbTcKKwlhbmRiCSQxNSwlYWwKKwlwc2xscQkkNTYsJW1tMworCXB4b3IJJW1tMSwlbW02CisJc2hybAkkNCwlZWRpCisJcGluc3J3CSQyLCglZXNpLCVlY3gsMiksJW1tMAorCXB4b3IJMTYoJWVzcCwlZWF4LDgpLCVtbTcKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCTE0NCglZXNwLCVlYXgsOCksJW1tNgorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwl4b3JiCSglZXNwLCVlYnAsMSksJWJsCisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlY3gKKwltb3Z6YmwJJWJsLCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVicAorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlZGksOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0wLCVtbTYKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0yCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUyNCglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0yLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0xCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWJwLDEpLCVibAorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwltb3Z6YmwJJWJsLCVlYngKKwlweG9yCSVtbTIsJW1tMgorCXBzbGxxCSQ0LCVtbTEKKwltb3ZkCSVtbTcsJWVjeAorCXBzcmxxCSQ0LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCXBzcmxxCSQ0LCVtbTYKKwlzaGxsCSQ0LCVlY3gKKwlweG9yCTE2KCVlc3AsJWVkaSw4KSwlbW03CisJcHNsbHEJJDYwLCVtbTMKKwltb3Z6YmwJJWNsLCVlY3gKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJMTQ0KCVlc3AsJWVkaSw4KSwlbW02CisJcGluc3J3CSQyLCglZXNpLCVlYngsMiksJW1tMAorCXB4b3IJJW1tMSwlbW02CisJbW92ZAklbW03LCVlZHgKKwlwaW5zcncJJDMsKCVlc2ksJWVjeCwyKSwlbW0yCisJcHNsbHEJJDEyLCVtbTAKKwlweG9yCSVtbTAsJW1tNgorCXBzcmxxCSQzMiwlbW03CisJcHhvcgklbW0yLCVtbTYKKwltb3ZsCTU0OCglZXNwKSwlZWN4CisJbW92ZAklbW03LCVlYngKKwltb3ZxCSVtbTYsJW1tMworCXBzbGx3CSQ4LCVtbTYKKwlwc3JsdwkkOCwlbW0zCisJcG9yCSVtbTMsJW1tNgorCWJzd2FwCSVlZHgKKwlwc2h1ZncJJDI3LCVtbTYsJW1tNgorCWJzd2FwCSVlYngKKwljbXBsCTU1MiglZXNwKSwlZWN4CisJam5lCS5MMDA0b3V0ZXIKKwltb3ZsCTU0NCglZXNwKSwlZWF4CisJbW92bAklZWR4LDEyKCVlYXgpCisJbW92bAklZWJ4LDgoJWVheCkKKwltb3ZxCSVtbTYsKCVlYXgpCisJbW92bAk1NTYoJWVzcCksJWVzcAorCWVtbXMKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCWdjbV9naGFzaF80Yml0X21teCwuLS5MX2djbV9naGFzaF80Yml0X21teF9iZWdpbgorLmdsb2JsCWdjbV9pbml0X2NsbXVsCisuaGlkZGVuCWdjbV9pbml0X2NsbXVsCisudHlwZQlnY21faW5pdF9jbG11bCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorZ2NtX2luaXRfY2xtdWw6CisuTF9nY21faW5pdF9jbG11bF9iZWdpbjoKKwltb3ZsCTQoJWVzcCksJWVkeAorCW1vdmwJOCglZXNwKSwlZWF4CisJY2FsbAkuTDAwNXBpYworLkwwMDVwaWM6CisJcG9wbAklZWN4CisJbGVhbAkuTGJzd2FwLS5MMDA1cGljKCVlY3gpLCVlY3gKKwltb3ZkcXUJKCVlYXgpLCV4bW0yCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMgorCXBzaHVmZAkkMjU1LCV4bW0yLCV4bW00CisJbW92ZHFhCSV4bW0yLCV4bW0zCisJcHNsbHEJJDEsJXhtbTIKKwlweG9yCSV4bW01LCV4bW01CisJcHNybHEJJDYzLCV4bW0zCisJcGNtcGd0ZAkleG1tNCwleG1tNQorCXBzbGxkcQkkOCwleG1tMworCXBvcgkleG1tMywleG1tMgorCXBhbmQJMTYoJWVjeCksJXhtbTUKKwlweG9yCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMCwleG1tMworCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMiwleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIwLDAKKwl4b3JwcwkleG1tMCwleG1tMworCXhvcnBzCSV4bW0xLCV4bW0zCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDc4LCV4bW0yLCV4bW0zCisJcHNodWZkCSQ3OCwleG1tMCwleG1tNAorCXB4b3IJJXhtbTIsJXhtbTMKKwltb3ZkcXUJJXhtbTIsKCVlZHgpCisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxdQkleG1tMCwxNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNyw4CisJbW92ZHF1CSV4bW00LDMyKCVlZHgpCisJcmV0Cisuc2l6ZQlnY21faW5pdF9jbG11bCwuLS5MX2djbV9pbml0X2NsbXVsX2JlZ2luCisuZ2xvYmwJZ2NtX2dtdWx0X2NsbXVsCisuaGlkZGVuCWdjbV9nbXVsdF9jbG11bAorLnR5cGUJZ2NtX2dtdWx0X2NsbXVsLEBmdW5jdGlvbgorLmFsaWduCTE2CitnY21fZ211bHRfY2xtdWw6CisuTF9nY21fZ211bHRfY2xtdWxfYmVnaW46CisJbW92bAk0KCVlc3ApLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVkeAorCWNhbGwJLkwwMDZwaWMKKy5MMDA2cGljOgorCXBvcGwJJWVjeAorCWxlYWwJLkxic3dhcC0uTDAwNnBpYyglZWN4KSwlZWN4CisJbW92ZHF1CSglZWF4KSwleG1tMAorCW1vdmRxYQkoJWVjeCksJXhtbTUKKwltb3Z1cHMJKCVlZHgpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKwltb3Z1cHMJMzIoJWVkeCksJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIwLDAKKwl4b3JwcwkleG1tMCwleG1tMworCXhvcnBzCSV4bW0xLCV4bW0zCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworCW1vdmRxdQkleG1tMCwoJWVheCkKKwlyZXQKKy5zaXplCWdjbV9nbXVsdF9jbG11bCwuLS5MX2djbV9nbXVsdF9jbG11bF9iZWdpbgorLmdsb2JsCWdjbV9naGFzaF9jbG11bAorLmhpZGRlbglnY21fZ2hhc2hfY2xtdWwKKy50eXBlCWdjbV9naGFzaF9jbG11bCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorZ2NtX2doYXNoX2NsbXVsOgorLkxfZ2NtX2doYXNoX2NsbXVsX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwltb3ZsCTI0KCVlc3ApLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwltb3ZsCTMyKCVlc3ApLCVlYngKKwljYWxsCS5MMDA3cGljCisuTDAwN3BpYzoKKwlwb3BsCSVlY3gKKwlsZWFsCS5MYnN3YXAtLkwwMDdwaWMoJWVjeCksJWVjeAorCW1vdmRxdQkoJWVheCksJXhtbTAKKwltb3ZkcWEJKCVlY3gpLCV4bW01CisJbW92ZHF1CSglZWR4KSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisJc3VibAkkMTYsJWVieAorCWp6CS5MMDA4b2RkX3RhaWwKKwltb3ZkcXUJKCVlc2kpLCV4bW0zCisJbW92ZHF1CTE2KCVlc2kpLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjEKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NQorCW1vdmRxdQkzMiglZWR4KSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2h1ZmQJJDc4LCV4bW02LCV4bW0zCisJbW92ZHFhCSV4bW02LCV4bW03CisJcHhvcgkleG1tNiwleG1tMworCWxlYWwJMzIoJWVzaSksJWVzaQorLmJ5dGUJMTAyLDE1LDU4LDY4LDI0MiwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjUwLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIxLDAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTIKKwlub3AKKwlzdWJsCSQzMiwlZWJ4CisJamJlCS5MMDA5ZXZlbl90YWlsCisJam1wCS5MMDEwbW9kX2xvb3AKKy5hbGlnbgkzMgorLkwwMTBtb2RfbG9vcDoKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW00CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHhvcgkleG1tMCwleG1tNAorCW5vcAorLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjI5LDE2CisJbW92dXBzCSglZWR4KSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0wCisJbW92ZHFhCSglZWN4KSwleG1tNQorCXhvcnBzCSV4bW03LCV4bW0xCisJbW92ZHF1CSglZXNpKSwleG1tNworCXB4b3IJJXhtbTAsJXhtbTMKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTYKKwlweG9yCSV4bW0xLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyNTMKKwlweG9yCSV4bW0zLCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNybGRxCSQ4LCV4bW00CisJcHNsbGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTMsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NQorCXB4b3IJJXhtbTcsJXhtbTEKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyNDIsMAorCW1vdnVwcwkzMiglZWR4KSwleG1tNQorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tNywleG1tMworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNywleG1tMworCXB4b3IJJXhtbTQsJXhtbTEKKy5ieXRlCTEwMiwxNSw1OCw2OCwyNTAsMTcKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTIKKwlweG9yCSV4bW0wLCV4bW00CisJcHNybHEJJDUsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0wCisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIxLDAKKwlsZWFsCTMyKCVlc2kpLCVlc2kKKwlzdWJsCSQzMiwlZWJ4CisJamEJLkwwMTBtb2RfbG9vcAorLkwwMDlldmVuX3RhaWw6CisJcHNodWZkCSQ3OCwleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCw2OCwxOTQsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIwMiwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIyOSwxNgorCW1vdmRxYQkoJWVjeCksJXhtbTUKKwl4b3JwcwkleG1tNiwleG1tMAorCXhvcnBzCSV4bW03LCV4bW0xCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTEsJXhtbTMKKwlweG9yCSV4bW0zLCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNybGRxCSQ4LCV4bW00CisJcHNsbGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTMsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwl0ZXN0bAklZWJ4LCVlYngKKwlqbnoJLkwwMTFkb25lCisJbW92dXBzCSglZWR4KSwleG1tMgorLkwwMDhvZGRfdGFpbDoKKwltb3ZkcXUJKCVlc2kpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjEKKwlweG9yCSV4bW0zLCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMCwleG1tMworCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMiwleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIwLDAKKwl4b3JwcwkleG1tMCwleG1tMworCXhvcnBzCSV4bW0xLCV4bW0zCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKy5MMDExZG9uZToKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworCW1vdmRxdQkleG1tMCwoJWVheCkKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCWdjbV9naGFzaF9jbG11bCwuLS5MX2djbV9naGFzaF9jbG11bF9iZWdpbgorLmFsaWduCTY0CisuTGJzd2FwOgorLmJ5dGUJMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDcsNiw1LDQsMywyLDEsMAorLmJ5dGUJMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTk0CisuYWxpZ24JNjQKKy5McmVtXzhiaXQ6CisudmFsdWUJMCw0NTAsOTAwLDU4MiwxODAwLDE3MzgsMTE2NCwxMzU4CisudmFsdWUJMzYwMCw0MDUwLDM0NzYsMzE1OCwyMzI4LDIyNjYsMjcxNiwyOTEwCisudmFsdWUJNzIwMCw3NjUwLDgxMDAsNzc4Miw2OTUyLDY4OTAsNjMxNiw2NTEwCisudmFsdWUJNDY1Niw1MTA2LDQ1MzIsNDIxNCw1NDMyLDUzNzAsNTgyMCw2MDE0CisudmFsdWUJMTQ0MDAsMTQ3MjIsMTUzMDAsMTQ4NTQsMTYyMDAsMTYwMTAsMTU1NjQsMTU2MzAKKy52YWx1ZQkxMzkwNCwxNDIyNiwxMzc4MCwxMzMzNCwxMjYzMiwxMjQ0MiwxMzAyMCwxMzA4NgorLnZhbHVlCTkzMTIsOTYzNCwxMDIxMiw5NzY2LDkwNjQsODg3NCw4NDI4LDg0OTQKKy52YWx1ZQkxMDg2NCwxMTE4NiwxMDc0MCwxMDI5NCwxMTY0MCwxMTQ1MCwxMjAyOCwxMjA5NAorLnZhbHVlCTI4ODAwLDI4OTk0LDI5NDQ0LDI5MzgyLDMwNjAwLDMwMjgyLDI5NzA4LDMwMTU4CisudmFsdWUJMzI0MDAsMzI1OTQsMzIwMjAsMzE5NTgsMzExMjgsMzA4MTAsMzEyNjAsMzE3MTAKKy52YWx1ZQkyNzgwOCwyODAwMiwyODQ1MiwyODM5MCwyNzU2MCwyNzI0MiwyNjY2OCwyNzExOAorLnZhbHVlCTI1MjY0LDI1NDU4LDI0ODg0LDI0ODIyLDI2MDQwLDI1NzIyLDI2MTcyLDI2NjIyCisudmFsdWUJMTg2MjQsMTg2OTAsMTkyNjgsMTkwNzgsMjA0MjQsMTk5NzgsMTk1MzIsMTk4NTQKKy52YWx1ZQkxODEyOCwxODE5NCwxNzc0OCwxNzU1OCwxNjg1NiwxNjQxMCwxNjk4OCwxNzMxMAorLnZhbHVlCTIxNzI4LDIxNzk0LDIyMzcyLDIyMTgyLDIxNDgwLDIxMDM0LDIwNTg4LDIwOTEwCisudmFsdWUJMjMyODAsMjMzNDYsMjI5MDAsMjI3MTAsMjQwNTYsMjM2MTAsMjQxODgsMjQ1MTAKKy52YWx1ZQk1NzYwMCw1NzUzOCw1Nzk4OCw1ODE4Miw1ODg4OCw1OTMzOCw1ODc2NCw1ODQ0NgorLnZhbHVlCTYxMjAwLDYxMTM4LDYwNTY0LDYwNzU4LDU5NDE2LDU5ODY2LDYwMzE2LDU5OTk4CisudmFsdWUJNjQ4MDAsNjQ3MzgsNjUxODgsNjUzODIsNjQwNDAsNjQ0OTAsNjM5MTYsNjM1OTgKKy52YWx1ZQk2MjI1Niw2MjE5NCw2MTYyMCw2MTgxNCw2MjUyMCw2Mjk3MCw2MzQyMCw2MzEwMgorLnZhbHVlCTU1NjE2LDU1NDI2LDU2MDA0LDU2MDcwLDU2OTA0LDU3MjI2LDU2NzgwLDU2MzM0CisudmFsdWUJNTUxMjAsNTQ5MzAsNTQ0ODQsNTQ1NTAsNTMzMzYsNTM2NTgsNTQyMzYsNTM3OTAKKy52YWx1ZQk1MDUyOCw1MDMzOCw1MDkxNiw1MDk4Miw0OTc2OCw1MDA5MCw0OTY0NCw0OTE5OAorLnZhbHVlCTUyMDgwLDUxODkwLDUxNDQ0LDUxNTEwLDUyMzQ0LDUyNjY2LDUzMjQ0LDUyNzk4CisudmFsdWUJMzcyNDgsMzY5MzAsMzczODAsMzc4MzAsMzg1MzYsMzg3MzAsMzgxNTYsMzgwOTQKKy52YWx1ZQk0MDg0OCw0MDUzMCwzOTk1Niw0MDQwNiwzOTA2NCwzOTI1OCwzOTcwOCwzOTY0NgorLnZhbHVlCTM2MjU2LDM1OTM4LDM2Mzg4LDM2ODM4LDM1NDk2LDM1NjkwLDM1MTE2LDM1MDU0CisudmFsdWUJMzM3MTIsMzMzOTQsMzI4MjAsMzMyNzAsMzM5NzYsMzQxNzAsMzQ2MjAsMzQ1NTgKKy52YWx1ZQk0MzQ1Niw0MzAxMCw0MzU4OCw0MzkxMCw0NDc0NCw0NDgxMCw0NDM2NCw0NDE3NAorLnZhbHVlCTQyOTYwLDQyNTE0LDQyMDY4LDQyMzkwLDQxMTc2LDQxMjQyLDQxODIwLDQxNjMwCisudmFsdWUJNDY1NjAsNDYxMTQsNDY2OTIsNDcwMTQsNDU4MDAsNDU4NjYsNDU0MjAsNDUyMzAKKy52YWx1ZQk0ODExMiw0NzY2Niw0NzIyMCw0NzU0Miw0ODM3Niw0ODQ0Miw0OTAyMCw0ODgzMAorLmFsaWduCTY0CisuTHJlbV80Yml0OgorLmxvbmcJMCwwLDAsNDcxODU5MjAwLDAsOTQzNzE4NDAwLDAsNjEwMjcxMjMyCisubG9uZwkwLDE4ODc0MzY4MDAsMCwxODIyNDI1MDg4LDAsMTIyMDU0MjQ2NCwwLDE0MjM5NjYyMDgKKy5sb25nCTAsMzc3NDg3MzYwMCwwLDQyNDY3MzI4MDAsMCwzNjQ0ODUwMTc2LDAsMzMxMTQwMzAwOAorLmxvbmcJMCwyNDQxMDg0OTI4LDAsMjM3NjA3MzIxNiwwLDI4NDc5MzI0MTYsMCwzMDUxMzU2MTYwCisuYnl0ZQk3MSw3Miw2NSw4Myw3MiwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsNDQsMzIsNjcKKy5ieXRlCTgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIKKy5ieXRlCTExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MgorLmJ5dGUJMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9tZDUtNTg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9tZDUtNTg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzN2Y5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL21kNS01ODYuUwpAQCAtMCwwICsxLDY4MSBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCW1kNV9ibG9ja19hc21fZGF0YV9vcmRlcgorLmhpZGRlbgltZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKKy50eXBlCW1kNV9ibG9ja19hc21fZGF0YV9vcmRlcixAZnVuY3Rpb24KKy5hbGlnbgkxNgorbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyOgorLkxfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyX2JlZ2luOgorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkxMiglZXNwKSwlZWRpCisJbW92bAkxNiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWN4CisJcHVzaGwJJWVicAorCXNobGwJJDYsJWVjeAorCXB1c2hsCSVlYngKKwlhZGRsCSVlc2ksJWVjeAorCXN1YmwJJDY0LCVlY3gKKwltb3ZsCSglZWRpKSwlZWF4CisJcHVzaGwJJWVjeAorCW1vdmwJNCglZWRpKSwlZWJ4CisJbW92bAk4KCVlZGkpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKy5MMDAwc3RhcnQ6CisKKworCW1vdmwJJWVjeCwlZWRpCisJbW92bAkoJWVzaSksJWVicAorCisJeG9ybAklZWR4LCVlZGkKKwlhbmRsCSVlYngsJWVkaQorCWxlYWwJMzYxNDA5MDM2MCglZWF4LCVlYnAsMSksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDcsJWVheAorCW1vdmwJNCglZXNpKSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKworCXhvcmwJJWVjeCwlZWRpCisJYW5kbAklZWF4LCVlZGkKKwlsZWFsCTM5MDU0MDI3MTAoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQxMiwlZWR4CisJbW92bAk4KCVlc2kpLCVlYnAKKwlhZGRsCSVlYXgsJWVkeAorCisJeG9ybAklZWJ4LCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCWxlYWwJNjA2MTA1ODE5KCVlY3gsJWVicCwxKSwlZWN4CisJeG9ybAklZWJ4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTcsJWVjeAorCW1vdmwJMTIoJWVzaSksJWVicAorCWFkZGwJJWVkeCwlZWN4CisKKwl4b3JsCSVlYXgsJWVkaQorCWFuZGwJJWVjeCwlZWRpCisJbGVhbAkzMjUwNDQxOTY2KCVlYngsJWVicCwxKSwlZWJ4CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjIsJWVieAorCW1vdmwJMTYoJWVzaSksJWVicAorCWFkZGwJJWVjeCwlZWJ4CisKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbGVhbAk0MTE4NTQ4Mzk5KCVlYXgsJWVicCwxKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJJWVieCwlZWRpCisJcm9sbAkkNywlZWF4CisJbW92bAkyMCglZXNpKSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKworCXhvcmwJJWVjeCwlZWRpCisJYW5kbAklZWF4LCVlZGkKKwlsZWFsCTEyMDAwODA0MjYoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQxMiwlZWR4CisJbW92bAkyNCglZXNpKSwlZWJwCisJYWRkbAklZWF4LCVlZHgKKworCXhvcmwJJWVieCwlZWRpCisJYW5kbAklZWR4LCVlZGkKKwlsZWFsCTI4MjE3MzU5NTUoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVkaSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwlyb2xsCSQxNywlZWN4CisJbW92bAkyOCglZXNpKSwlZWJwCisJYWRkbAklZWR4LCVlY3gKKworCXhvcmwJJWVheCwlZWRpCisJYW5kbAklZWN4LCVlZGkKKwlsZWFsCTQyNDkyNjEzMTMoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQyMiwlZWJ4CisJbW92bAkzMiglZXNpKSwlZWJwCisJYWRkbAklZWN4LCVlYngKKworCXhvcmwJJWVkeCwlZWRpCisJYW5kbAklZWJ4LCVlZGkKKwlsZWFsCTE3NzAwMzU0MTYoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ3LCVlYXgKKwltb3ZsCTM2KCVlc2kpLCVlYnAKKwlhZGRsCSVlYngsJWVheAorCisJeG9ybAklZWN4LCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCWxlYWwJMjMzNjU1Mjg3OSglZWR4LCVlYnAsMSksJWVkeAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDEyLCVlZHgKKwltb3ZsCTQwKCVlc2kpLCVlYnAKKwlhZGRsCSVlYXgsJWVkeAorCisJeG9ybAklZWJ4LCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCWxlYWwJNDI5NDkyNTIzMyglZWN4LCVlYnAsMSksJWVjeAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXJvbGwJJDE3LCVlY3gKKwltb3ZsCTQ0KCVlc2kpLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCWxlYWwJMjMwNDU2MzEzNCglZWJ4LCVlYnAsMSksJWVieAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDIyLCVlYngKKwltb3ZsCTQ4KCVlc2kpLCVlYnAKKwlhZGRsCSVlY3gsJWVieAorCisJeG9ybAklZWR4LCVlZGkKKwlhbmRsCSVlYngsJWVkaQorCWxlYWwJMTgwNDYwMzY4MiglZWF4LCVlYnAsMSksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDcsJWVheAorCW1vdmwJNTIoJWVzaSksJWVicAorCWFkZGwJJWVieCwlZWF4CisKKwl4b3JsCSVlY3gsJWVkaQorCWFuZGwJJWVheCwlZWRpCisJbGVhbAk0MjU0NjI2MTk1KCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkMTIsJWVkeAorCW1vdmwJNTYoJWVzaSksJWVicAorCWFkZGwJJWVheCwlZWR4CisKKwl4b3JsCSVlYngsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbGVhbAkyNzkyOTY1MDA2KCVlY3gsJWVicCwxKSwlZWN4CisJeG9ybAklZWJ4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTcsJWVjeAorCW1vdmwJNjAoJWVzaSksJWVicAorCWFkZGwJJWVkeCwlZWN4CisKKwl4b3JsCSVlYXgsJWVkaQorCWFuZGwJJWVjeCwlZWRpCisJbGVhbAkxMjM2NTM1MzI5KCVlYngsJWVicCwxKSwlZWJ4CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjIsJWVieAorCW1vdmwJNCglZXNpKSwlZWJwCisJYWRkbAklZWN4LCVlYngKKworCisKKwlsZWFsCTQxMjkxNzA3ODYoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlYngsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbW92bAkyNCglZXNpKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJJWVieCwlZWRpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJ4LCVlYXgKKworCWxlYWwJMzIyNTQ2NTY2NCglZWR4LCVlYnAsMSksJWVkeAorCXhvcmwJJWVheCwlZWRpCisJYW5kbAklZWN4LCVlZGkKKwltb3ZsCTQ0KCVlc2kpLCVlYnAKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQ5LCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCisJbGVhbAk2NDM3MTc3MTMoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAkoJWVzaSksJWVicAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWRpLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXJvbGwJJDE0LCVlY3gKKwlhZGRsCSVlZHgsJWVjeAorCisJbGVhbAkzOTIxMDY5OTk0KCVlYngsJWVicCwxKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCW1vdmwJMjAoJWVzaSksJWVicAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDIwLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCisJbGVhbAkzNTkzNDA4NjA1KCVlYXgsJWVicCwxKSwlZWF4CisJeG9ybAklZWJ4LCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCW1vdmwJNDAoJWVzaSksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVieCwlZWF4CisKKwlsZWFsCTM4MDE2MDgzKCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJNjAoJWVzaSksJWVicAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisKKwlsZWFsCTM2MzQ0ODg5NjEoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAkxNiglZXNpKSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTQsJWVjeAorCWFkZGwJJWVkeCwlZWN4CisKKwlsZWFsCTM4ODk0Mjk0NDgoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCWFuZGwJJWVheCwlZWRpCisJbW92bAkzNiglZXNpKSwlZWJwCisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisKKwlsZWFsCTU2ODQ0NjQzOCglZWF4LCVlYnAsMSksJWVheAorCXhvcmwJJWVieCwlZWRpCisJYW5kbAklZWR4LCVlZGkKKwltb3ZsCTU2KCVlc2kpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCisJbGVhbAkzMjc1MTYzNjA2KCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJMTIoJWVzaSksJWVicAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisKKwlsZWFsCTQxMDc2MDMzMzUoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAkzMiglZXNpKSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTQsJWVjeAorCWFkZGwJJWVkeCwlZWN4CisKKwlsZWFsCTExNjM1MzE1MDEoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCWFuZGwJJWVheCwlZWRpCisJbW92bAk1MiglZXNpKSwlZWJwCisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisKKwlsZWFsCTI4NTAyODU4MjkoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlYngsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbW92bAk4KCVlc2kpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCisJbGVhbAk0MjQzNTYzNTEyKCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJMjgoJWVzaSksJWVicAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisKKwlsZWFsCTE3MzUzMjg0NzMoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAk0OCglZXNpKSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTQsJWVjeAorCWFkZGwJJWVkeCwlZWN4CisKKwlsZWFsCTIzNjgzNTk1NjIoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCWFuZGwJJWVheCwlZWRpCisJbW92bAkyMCglZXNpKSwlZWJwCisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisKKworCisJeG9ybAklZWR4LCVlZGkKKwl4b3JsCSVlYngsJWVkaQorCWxlYWwJNDI5NDU4ODczOCglZWF4LCVlYnAsMSksJWVheAorCWFkZGwJJWVkaSwlZWF4CisJcm9sbAkkNCwlZWF4CisJbW92bAkzMiglZXNpKSwlZWJwCisJbW92bAklZWJ4LCVlZGkKKworCWxlYWwJMjI3MjM5MjgzMyglZWR4LCVlYnAsMSksJWVkeAorCWFkZGwJJWVieCwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJNDQoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQxMSwlZWR4CisJYWRkbAklZWF4LCVlZHgKKworCXhvcmwJJWVieCwlZWRpCisJeG9ybAklZWR4LCVlZGkKKwlsZWFsCTE4MzkwMzA1NjIoJWVjeCwlZWJwLDEpLCVlY3gKKwlhZGRsCSVlZGksJWVjeAorCXJvbGwJJDE2LCVlY3gKKwltb3ZsCTU2KCVlc2kpLCVlYnAKKwltb3ZsCSVlZHgsJWVkaQorCisJbGVhbAk0MjU5NjU3NzQwKCVlYngsJWVicCwxKSwlZWJ4CisJYWRkbAklZWR4LCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk0KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjMsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisKKwl4b3JsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlZWRpCisJbGVhbAkyNzYzOTc1MjM2KCVlYXgsJWVicCwxKSwlZWF4CisJYWRkbAklZWRpLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCTE2KCVlc2kpLCVlYnAKKwltb3ZsCSVlYngsJWVkaQorCisJbGVhbAkxMjcyODkzMzUzKCVlZHgsJWVicCwxKSwlZWR4CisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCXhvcmwJJWVheCwlZWRpCisJbW92bAkyOCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDExLCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCisJeG9ybAklZWJ4LCVlZGkKKwl4b3JsCSVlZHgsJWVkaQorCWxlYWwJNDEzOTQ2OTY2NCglZWN4LCVlYnAsMSksJWVjeAorCWFkZGwJJWVkaSwlZWN4CisJcm9sbAkkMTYsJWVjeAorCW1vdmwJNDAoJWVzaSksJWVicAorCW1vdmwJJWVkeCwlZWRpCisKKwlsZWFsCTMyMDAyMzY2NTYoJWVieCwlZWJwLDEpLCVlYngKKwlhZGRsCSVlZHgsJWVjeAorCXhvcmwJJWVheCwlZWRpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTUyKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjMsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisKKwl4b3JsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlZWRpCisJbGVhbAk2ODEyNzkxNzQoJWVheCwlZWJwLDEpLCVlYXgKKwlhZGRsCSVlZGksJWVheAorCXJvbGwJJDQsJWVheAorCW1vdmwJKCVlc2kpLCVlYnAKKwltb3ZsCSVlYngsJWVkaQorCisJbGVhbAkzOTM2NDMwMDc0KCVlZHgsJWVicCwxKSwlZWR4CisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCXhvcmwJJWVheCwlZWRpCisJbW92bAkxMiglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDExLCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCisJeG9ybAklZWJ4LCVlZGkKKwl4b3JsCSVlZHgsJWVkaQorCWxlYWwJMzU3MjQ0NTMxNyglZWN4LCVlYnAsMSksJWVjeAorCWFkZGwJJWVkaSwlZWN4CisJcm9sbAkkMTYsJWVjeAorCW1vdmwJMjQoJWVzaSksJWVicAorCW1vdmwJJWVkeCwlZWRpCisKKwlsZWFsCTc2MDI5MTg5KCVlYngsJWVicCwxKSwlZWJ4CisJYWRkbAklZWR4LCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkzNiglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDIzLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCisJeG9ybAklZWR4LCVlZGkKKwl4b3JsCSVlYngsJWVkaQorCWxlYWwJMzY1NDYwMjgwOSglZWF4LCVlYnAsMSksJWVheAorCWFkZGwJJWVkaSwlZWF4CisJcm9sbAkkNCwlZWF4CisJbW92bAk0OCglZXNpKSwlZWJwCisJbW92bAklZWJ4LCVlZGkKKworCWxlYWwJMzg3MzE1MTQ2MSglZWR4LCVlYnAsMSksJWVkeAorCWFkZGwJJWVieCwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJNjAoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQxMSwlZWR4CisJYWRkbAklZWF4LCVlZHgKKworCXhvcmwJJWVieCwlZWRpCisJeG9ybAklZWR4LCVlZGkKKwlsZWFsCTUzMDc0MjUyMCglZWN4LCVlYnAsMSksJWVjeAorCWFkZGwJJWVkaSwlZWN4CisJcm9sbAkkMTYsJWVjeAorCW1vdmwJOCglZXNpKSwlZWJwCisJbW92bAklZWR4LCVlZGkKKworCWxlYWwJMzI5OTYyODY0NSglZWJ4LCVlYnAsMSksJWVieAorCWFkZGwJJWVkeCwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQyMywlZWJ4CisJYWRkbAklZWN4LCVlYngKKworCisKKwl4b3JsCSVlZHgsJWVkaQorCW9ybAklZWJ4LCVlZGkKKwlsZWFsCTQwOTYzMzY0NTIoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMjgoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWF4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDYsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWJ4LCVlYXgKKworCW9ybAklZWF4LCVlZGkKKwlsZWFsCTExMjY4OTE0MTUoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJNTYoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDEwLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVheCwlZWR4CisKKwlvcmwJJWVkeCwlZWRpCisJbGVhbAkyODc4NjEyMzkxKCVlY3gsJWVicCwxKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCTIwKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCisJb3JsCSVlY3gsJWVkaQorCWxlYWwJNDIzNzUzMzI0MSglZWJ4LCVlYnAsMSksJWVieAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAk0OCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkMjEsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWN4LCVlYngKKworCW9ybAklZWJ4LCVlZGkKKwlsZWFsCTE3MDA0ODU1NzEoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMTIoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWF4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDYsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWJ4LCVlYXgKKworCW9ybAklZWF4LCVlZGkKKwlsZWFsCTIzOTk5ODA2OTAoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJNDAoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDEwLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVheCwlZWR4CisKKwlvcmwJJWVkeCwlZWRpCisJbGVhbAk0MjkzOTE1NzczKCVlY3gsJWVicCwxKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCTQoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWN4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDE1LCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisKKwlvcmwJJWVjeCwlZWRpCisJbGVhbAkyMjQwMDQ0NDk3KCVlYngsJWVicCwxKSwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCTMyKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQyMSwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlY3gsJWVieAorCisJb3JsCSVlYngsJWVkaQorCWxlYWwJMTg3MzMxMzM1OSglZWF4LCVlYnAsMSksJWVheAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk2MCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkNiwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVlYngsJWVheAorCisJb3JsCSVlYXgsJWVkaQorCWxlYWwJNDI2NDM1NTU1MiglZWR4LCVlYnAsMSksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJbW92bAkyNCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkMTAsJWVkeAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWF4LCVlZHgKKworCW9ybAklZWR4LCVlZGkKKwlsZWFsCTI3MzQ3Njg5MTYoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJNTIoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWN4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDE1LCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisKKwlvcmwJJWVjeCwlZWRpCisJbGVhbAkxMzA5MTUxNjQ5KCVlYngsJWVicCwxKSwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCTE2KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQyMSwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlY3gsJWVieAorCisJb3JsCSVlYngsJWVkaQorCWxlYWwJNDE0OTQ0NDIyNiglZWF4LCVlYnAsMSksJWVheAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk0NCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkNiwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVlYngsJWVheAorCisJb3JsCSVlYXgsJWVkaQorCWxlYWwJMzE3NDc1NjkxNyglZWR4LCVlYnAsMSksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJbW92bAk4KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQxMCwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlhZGRsCSVlYXgsJWVkeAorCisJb3JsCSVlZHgsJWVkaQorCWxlYWwJNzE4Nzg3MjU5KCVlY3gsJWVicCwxKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCTM2KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCisJb3JsCSVlY3gsJWVkaQorCWxlYWwJMzk1MTQ4MTc0NSglZWJ4LCVlYnAsMSksJWVieAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAkyNCglZXNwKSwlZWJwCisJYWRkbAklZWRpLCVlYngKKwlhZGRsCSQ2NCwlZXNpCisJcm9sbAkkMjEsJWVieAorCW1vdmwJKCVlYnApLCVlZGkKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJbW92bAk0KCVlYnApLCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJOCglZWJwKSwlZWRpCisJYWRkbAklZWRpLCVlY3gKKwltb3ZsCTEyKCVlYnApLCVlZGkKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJWVheCwoJWVicCkKKwltb3ZsCSVlYngsNCglZWJwKQorCW1vdmwJKCVlc3ApLCVlZGkKKwltb3ZsCSVlY3gsOCglZWJwKQorCW1vdmwJJWVkeCwxMiglZWJwKQorCWNtcGwJJWVzaSwlZWRpCisJamFlCS5MMDAwc3RhcnQKKwlwb3BsCSVlYXgKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlyZXQKKy5zaXplCW1kNV9ibG9ja19hc21fZGF0YV9vcmRlciwuLS5MX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcl9iZWdpbgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9zaGExLTU4Ni5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS01ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzAyMmVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS01ODYuUwpAQCAtMCwwICsxLDM4MDEgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5nbG9ibAlzaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy5oaWRkZW4Jc2hhMV9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcjoKKy5MX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJY2FsbAkuTDAwMHBpY19wb2ludAorLkwwMDBwaWNfcG9pbnQ6CisJcG9wbAklZWJwCisJbGVhbAlPUEVOU1NMX2lhMzJjYXBfUC0uTDAwMHBpY19wb2ludCglZWJwKSwlZXNpCisJbGVhbAkuTEtfWFhfWFgtLkwwMDBwaWNfcG9pbnQoJWVicCksJWVicAorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVkeAorCXRlc3RsCSQ1MTIsJWVkeAorCWp6CS5MMDAxeDg2CisJbW92bAk4KCVlc2kpLCVlY3gKKwl0ZXN0bAkkMTY3NzcyMTYsJWVheAorCWp6CS5MMDAxeDg2CisJYW5kbAkkMjY4NDM1NDU2LCVlZHgKKwlhbmRsCSQxMDczNzQxODI0LCVlYXgKKwlvcmwJJWVkeCwlZWF4CisJY21wbAkkMTM0MjE3NzI4MCwlZWF4CisJamUJLkxhdnhfc2hvcnRjdXQKKwlqbXAJLkxzc3NlM19zaG9ydGN1dAorLmFsaWduCTE2CisuTDAwMXg4NjoKKwltb3ZsCTIwKCVlc3ApLCVlYnAKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwlzdWJsCSQ3NiwlZXNwCisJc2hsbAkkNiwlZWF4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCSVlYXgsMTA0KCVlc3ApCisJbW92bAkxNiglZWJwKSwlZWRpCisJam1wCS5MMDAybG9vcAorLmFsaWduCTE2CisuTDAwMmxvb3A6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJbW92bAklZWF4LCglZXNwKQorCW1vdmwJJWVieCw0KCVlc3ApCisJbW92bAklZWN4LDgoJWVzcCkKKwltb3ZsCSVlZHgsMTIoJWVzcCkKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwltb3ZsCTIwKCVlc2kpLCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJbW92bAklZWF4LDE2KCVlc3ApCisJbW92bAklZWJ4LDIwKCVlc3ApCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZWR4LDI4KCVlc3ApCisJbW92bAkzMiglZXNpKSwlZWF4CisJbW92bAkzNiglZXNpKSwlZWJ4CisJbW92bAk0MCglZXNpKSwlZWN4CisJbW92bAk0NCglZXNpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCW1vdmwJJWVheCwzMiglZXNwKQorCW1vdmwJJWVieCwzNiglZXNwKQorCW1vdmwJJWVjeCw0MCglZXNwKQorCW1vdmwJJWVkeCw0NCglZXNwKQorCW1vdmwJNDgoJWVzaSksJWVheAorCW1vdmwJNTIoJWVzaSksJWVieAorCW1vdmwJNTYoJWVzaSksJWVjeAorCW1vdmwJNjAoJWVzaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwltb3ZsCSVlYXgsNDgoJWVzcCkKKwltb3ZsCSVlYngsNTIoJWVzcCkKKwltb3ZsCSVlY3gsNTYoJWVzcCkKKwltb3ZsCSVlZHgsNjAoJWVzcCkKKwltb3ZsCSVlc2ksMTAwKCVlc3ApCisJbW92bAkoJWVicCksJWVheAorCW1vdmwJNCglZWJwKSwlZWJ4CisJbW92bAk4KCVlYnApLCVlY3gKKwltb3ZsCTEyKCVlYnApLCVlZHgKKworCW1vdmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlZHgsJWVzaQorCWFkZGwJJWVkaSwlZWJwCisJbW92bAkoJWVzcCksJWVkaQorCWFuZGwJJWVieCwlZXNpCisJcm9ybAkkMiwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWRpLDEpLCVlYnAKKwlhZGRsCSVlc2ksJWVicAorCisJbW92bAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWR4LCVlYnAKKwltb3ZsCTQoJWVzcCksJWVkeAorCWFuZGwJJWVheCwlZWRpCisJcm9ybAkkMiwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWR4LDEpLCVlYnAKKwlhZGRsCSVlZGksJWVicAorCisJbW92bAklZWF4LCVlZHgKKwltb3ZsCSVlYnAsJWVkaQorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVieCwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTgoJWVzcCksJWVjeAorCWFuZGwJJWVzaSwlZWR4CisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlZHgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWN4LDEpLCVlYnAKKwlhZGRsCSVlZHgsJWVicAorCisJbW92bAklZXNpLCVlY3gKKwltb3ZsCSVlYnAsJWVkeAorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVheCwlZWN4CisJYWRkbAklZWJ4LCVlYnAKKwltb3ZsCTEyKCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVjeAorCXJvcmwJJDIsJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVieCwxKSwlZWJwCisJYWRkbAklZWN4LCVlYnAKKworCW1vdmwJJWVkaSwlZWJ4CisJbW92bAklZWJwLCVlY3gKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlc2ksJWVieAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkxNiglZXNwKSwlZWF4CisJYW5kbAklZWR4LCVlYngKKwlyb3JsCSQyLCVlZHgKKwl4b3JsCSVlc2ksJWVieAorCWxlYWwJMTUxODUwMDI0OSglZWJwLCVlYXgsMSksJWVicAorCWFkZGwJJWVieCwlZWJwCisKKwltb3ZsCSVlZHgsJWVheAorCW1vdmwJJWVicCwlZWJ4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCW1vdmwJMjAoJWVzcCksJWVzaQorCWFuZGwJJWVjeCwlZWF4CisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZXNpLDEpLCVlYnAKKwlhZGRsCSVlYXgsJWVicAorCisJbW92bAklZWN4LCVlc2kKKwltb3ZsCSVlYnAsJWVheAorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVkeCwlZXNpCisJYWRkbAklZWRpLCVlYnAKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwlhbmRsCSVlYngsJWVzaQorCXJvcmwJJDIsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVkaSwxKSwlZWJwCisJYWRkbAklZXNpLCVlYnAKKworCW1vdmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkeCwlZWJwCisJbW92bAkyOCglZXNwKSwlZWR4CisJYW5kbAklZWF4LCVlZGkKKwlyb3JsCSQyLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCWxlYWwJMTUxODUwMDI0OSglZWJwLCVlZHgsMSksJWVicAorCWFkZGwJJWVkaSwlZWJwCisKKwltb3ZsCSVlYXgsJWVkeAorCW1vdmwJJWVicCwlZWRpCisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWJ4LCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJMzIoJWVzcCksJWVjeAorCWFuZGwJJWVzaSwlZWR4CisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlZHgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWN4LDEpLCVlYnAKKwlhZGRsCSVlZHgsJWVicAorCisJbW92bAklZXNpLCVlY3gKKwltb3ZsCSVlYnAsJWVkeAorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVheCwlZWN4CisJYWRkbAklZWJ4LCVlYnAKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVjeAorCXJvcmwJJDIsJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVieCwxKSwlZWJwCisJYWRkbAklZWN4LCVlYnAKKworCW1vdmwJJWVkaSwlZWJ4CisJbW92bAklZWJwLCVlY3gKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlc2ksJWVieAorCWFkZGwJJWVheCwlZWJwCisJbW92bAk0MCglZXNwKSwlZWF4CisJYW5kbAklZWR4LCVlYngKKwlyb3JsCSQyLCVlZHgKKwl4b3JsCSVlc2ksJWVieAorCWxlYWwJMTUxODUwMDI0OSglZWJwLCVlYXgsMSksJWVicAorCWFkZGwJJWVieCwlZWJwCisKKwltb3ZsCSVlZHgsJWVheAorCW1vdmwJJWVicCwlZWJ4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCW1vdmwJNDQoJWVzcCksJWVzaQorCWFuZGwJJWVjeCwlZWF4CisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZXNpLDEpLCVlYnAKKwlhZGRsCSVlYXgsJWVicAorCisJbW92bAklZWN4LCVlc2kKKwltb3ZsCSVlYnAsJWVheAorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVkeCwlZXNpCisJYWRkbAklZWRpLCVlYnAKKwltb3ZsCTQ4KCVlc3ApLCVlZGkKKwlhbmRsCSVlYngsJWVzaQorCXJvcmwJJDIsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVkaSwxKSwlZWJwCisJYWRkbAklZXNpLCVlYnAKKworCW1vdmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkeCwlZWJwCisJbW92bAk1MiglZXNwKSwlZWR4CisJYW5kbAklZWF4LCVlZGkKKwlyb3JsCSQyLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCWxlYWwJMTUxODUwMDI0OSglZWJwLCVlZHgsMSksJWVicAorCWFkZGwJJWVkaSwlZWJwCisKKwltb3ZsCSVlYXgsJWVkeAorCW1vdmwJJWVicCwlZWRpCisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWJ4LCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNTYoJWVzcCksJWVjeAorCWFuZGwJJWVzaSwlZWR4CisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlZHgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWN4LDEpLCVlYnAKKwlhZGRsCSVlZHgsJWVicAorCisJbW92bAklZXNpLCVlY3gKKwltb3ZsCSVlYnAsJWVkeAorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVheCwlZWN4CisJYWRkbAklZWJ4LCVlYnAKKwltb3ZsCTYwKCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVjeAorCXJvcmwJJDIsJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVieCwxKSwlZWJwCisJbW92bAkoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWN4CisKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTMyKCVlc3ApLCVlYngKKwlhbmRsCSVlZHgsJWVicAorCXhvcmwJNTIoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCXhvcmwJJWVzaSwlZWJwCisJYWRkbAklZWJwLCVlYXgKKwltb3ZsCSVlY3gsJWVicAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVieCwoJWVzcCkKKwlyb2xsCSQ1LCVlYnAKKwlsZWFsCTE1MTg1MDAyNDkoJWVieCwlZWF4LDEpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJMTIoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWF4CisJYW5kbAklZWN4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlYXgKKwlyb2xsCSQxLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCWFkZGwJJWVicCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYXgsNCglZXNwKQorCXJvbGwJJDUsJWVicAorCWxlYWwJMTUxODUwMDI0OSglZWF4LCVlc2ksMSksJWVheAorCW1vdmwJOCglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKworCW1vdmwJJWVjeCwlZWJwCisJeG9ybAkxNiglZXNwKSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlc2kKKwlhbmRsCSVlYngsJWVicAorCXhvcmwJNjAoJWVzcCksJWVzaQorCXJvbGwJJDEsJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJYWRkbAklZWJwLCVlZGkKKwltb3ZsCSVlYXgsJWVicAorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVzaSw4KCVlc3ApCisJcm9sbAkkNSwlZWJwCisJbGVhbAkxNTE4NTAwMjQ5KCVlc2ksJWVkaSwxKSwlZXNpCisJbW92bAkxMiglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlc2kKKworCW1vdmwJJWVieCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlZGkKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJKCVlc3ApLCVlZGkKKwlyb2xsCSQxLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCWFkZGwJJWVicCwlZWR4CisJbW92bAklZXNpLCVlYnAKKwlyb3JsCSQyLCVlYXgKKwltb3ZsCSVlZGksMTIoJWVzcCkKKwlyb2xsCSQ1LCVlYnAKKwlsZWFsCTE1MTg1MDAyNDkoJWVkaSwlZWR4LDEpLCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlYnAsJWVkaQorCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJNDgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWR4LDE2KCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlZHgsJWVjeCwxKSwlZWR4CisJbW92bAkyMCglZXNwKSwlZWN4CisJYWRkbAklZWJwLCVlZHgKKworCW1vdmwJJWVkaSwlZWJwCisJeG9ybAkyOCglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTUyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJOCglZXNwKSwlZWN4CisJcm9sbAkkMSwlZWN4CisJYWRkbAklZWJwLCVlYngKKwlyb3JsCSQyLCVlZGkKKwltb3ZsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVjeCwyMCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWN4LCVlYngsMSksJWVjeAorCW1vdmwJMjQoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWN4CisKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJMzIoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAk1NiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlYngKKwlyb2xsCSQxLCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWJ4LDI0KCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlYngsJWVheCwxKSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWF4CisJYWRkbAklZWJwLCVlYngKKworCW1vdmwJJWVjeCwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJMTYoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCWFkZGwJJWVicCwlZXNpCisJcm9ybAkkMiwlZWN4CisJbW92bAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYXgsMjgoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVheCwlZXNpLDEpLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwlhZGRsCSVlYnAsJWVheAorCisJbW92bAklZWJ4LCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJMjAoJWVzcCksJWVzaQorCXJvbGwJJDEsJWVzaQorCWFkZGwJJWVicCwlZWRpCisJcm9ybAkkMiwlZWJ4CisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlc2ksMzIoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVzaSwlZWRpLDEpLCVlc2kKKwltb3ZsCTM2KCVlc3ApLCVlZGkKKwlhZGRsCSVlYnAsJWVzaQorCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlZGkKKwlyb2xsCSQxLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXJvcmwJJDIsJWVheAorCW1vdmwJJWVzaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWRpLDM2KCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlZGksJWVkeCwxKSwlZWRpCisJbW92bAk0MCglZXNwKSwlZWR4CisJYWRkbAklZWJwLCVlZGkKKworCW1vdmwJJWVzaSwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCTgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAkyOCglZXNwKSwlZWR4CisJcm9sbAkkMSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkeCw0MCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWR4LCVlY3gsMSksJWVkeAorCW1vdmwJNDQoJWVzcCksJWVjeAorCWFkZGwJJWVicCwlZWR4CisKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCTMyKCVlc3ApLCVlY3gKKwlyb2xsCSQxLCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXJvcmwJJDIsJWVkaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWN4LDQ0KCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlY3gsJWVieCwxKSwlZWN4CisJbW92bAk0OCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKworCW1vdmwJJWVkeCwlZWJwCisJeG9ybAk1NiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJMzYoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYngsNDgoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVieCwlZWF4LDEpLCVlYngKKwltb3ZsCTUyKCVlc3ApLCVlYXgKKwlhZGRsCSVlYnAsJWVieAorCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJMjAoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAk0MCglZXNwKSwlZWF4CisJcm9sbAkkMSwlZWF4CisJYWRkbAklZWJwLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYngsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVheCw1MiglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWF4LCVlc2ksMSksJWVheAorCW1vdmwJNTYoJWVzcCksJWVzaQorCWFkZGwJJWVicCwlZWF4CisKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAk0NCglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJYWRkbAklZWJwLCVlZGkKKwlyb3JsCSQyLCVlYngKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVzaSw1NiglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZXNpLCVlZGksMSksJWVzaQorCW1vdmwJNjAoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJNDgoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlZGksNjAoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVkaSwlZWR4LDEpLCVlZGkKKwltb3ZsCSglZXNwKSwlZWR4CisJYWRkbAklZWJwLCVlZGkKKworCW1vdmwJJWVzaSwlZWJwCisJeG9ybAk4KCVlc3ApLCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJMzIoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk1MiglZXNwKSwlZWR4CisJcm9sbAkkMSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkeCwoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVkeCwlZWN4LDEpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVjeAorCWFkZGwJJWVicCwlZWR4CisKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJMTIoJWVzcCksJWVjeAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlY3gKKwlyb2xsCSQxLCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXJvcmwJJDIsJWVkaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWN4LDQoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVjeCwlZWJ4LDEpLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWN4CisKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJMTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAk0MCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlYngKKwlyb2xsCSQxLCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWJ4LDgoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVieCwlZWF4LDEpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlYXgKKwlhZGRsCSVlYnAsJWVieAorCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTIwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJNDQoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAkoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCWFkZGwJJWVicCwlZXNpCisJcm9ybAkkMiwlZWN4CisJbW92bAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYXgsMTIoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVheCwlZXNpLDEpLCVlYXgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwlhZGRsCSVlYnAsJWVheAorCisJbW92bAklZWJ4LCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJNDgoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlc2kKKwlyb2xsCSQxLCVlc2kKKwlhZGRsCSVlYnAsJWVkaQorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZXNpLDE2KCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlc2ksJWVkaSwxKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlc2kKKworCW1vdmwJJWVheCwlZWJwCisJeG9ybAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTUyKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJOCglZXNwKSwlZWRpCisJcm9sbAkkMSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwlyb3JsCSQyLCVlYXgKKwltb3ZsCSVlc2ksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkaSwyMCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWRpLCVlZHgsMSksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVicCwlZWRpCisKKwltb3ZsCSVlc2ksJWVicAorCXhvcmwJMzIoJWVzcCksJWVkeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk1NiglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWR4LDI0KCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlZHgsJWVjeCwxKSwlZWR4CisJbW92bAkyOCglZXNwKSwlZWN4CisJYWRkbAklZWJwLCVlZHgKKworCW1vdmwJJWVkaSwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJMTYoJWVzcCksJWVjeAorCXJvbGwJJDEsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJcm9ybAkkMiwlZWRpCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlY3gsMjgoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVjeCwlZWJ4LDEpLCVlY3gKKwltb3ZsCTMyKCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVjeAorCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJKCVlc3ApLCVlYngKKwlhbmRsCSVlZHgsJWVicAorCXhvcmwJMjAoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCWFkZGwJJWVheCwlZWJwCisJcm9ybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYXgKKwlyb2xsCSQ1LCVlYXgKKwltb3ZsCSVlYngsMzIoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVieCwlZWJwLDEpLCVlYngKKwltb3ZsCSVlZGksJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYW5kbAklZXNpLCVlYnAKKwltb3ZsCTM2KCVlc3ApLCVlYXgKKwlhZGRsCSVlYnAsJWVieAorCisJbW92bAklZWR4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJNCglZXNwKSwlZWF4CisJYW5kbAklZWN4LCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlYXgKKwlyb2xsCSQxLCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXJvcmwJJDIsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZXNpCisJbW92bAklZWF4LDM2KCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlYXgsJWVicCwxKSwlZWF4CisJbW92bAklZWR4LCVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFuZGwJJWVkaSwlZWJwCisJbW92bAk0MCglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKworCW1vdmwJJWVjeCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTgoJWVzcCksJWVzaQorCWFuZGwJJWVieCwlZWJwCisJeG9ybAkyOCglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJYWRkbAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlYngKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDUsJWVkaQorCW1vdmwJJWVzaSw0MCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZXNpLCVlYnAsMSksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJYWRkbAklZWRpLCVlc2kKKwlhbmRsCSVlZHgsJWVicAorCW1vdmwJNDQoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJNTIoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWRpCisJYW5kbAklZWF4LCVlYnAKKwl4b3JsCTMyKCVlc3ApLCVlZGkKKwlyb2xsCSQxLCVlZGkKKwlhZGRsCSVlZHgsJWVicAorCXJvcmwJJDIsJWVheAorCW1vdmwJJWVzaSwlZWR4CisJcm9sbAkkNSwlZWR4CisJbW92bAklZWRpLDQ0KCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlZGksJWVicCwxKSwlZWRpCisJbW92bAklZWJ4LCVlYnAKKwlhZGRsCSVlZHgsJWVkaQorCWFuZGwJJWVjeCwlZWJwCisJbW92bAk0OCglZXNwKSwlZWR4CisJYWRkbAklZWJwLCVlZGkKKworCW1vdmwJJWVheCwlZWJwCisJeG9ybAk1NiglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTE2KCVlc3ApLCVlZHgKKwlhbmRsCSVlc2ksJWVicAorCXhvcmwJMzYoJWVzcCksJWVkeAorCXJvbGwJJDEsJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJcm9ybAkkMiwlZXNpCisJbW92bAklZWRpLCVlY3gKKwlyb2xsCSQ1LCVlY3gKKwltb3ZsCSVlZHgsNDgoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVkeCwlZWJwLDEpLCVlZHgKKwltb3ZsCSVlYXgsJWVicAorCWFkZGwJJWVjeCwlZWR4CisJYW5kbAklZWJ4LCVlYnAKKwltb3ZsCTUyKCVlc3ApLCVlY3gKKwlhZGRsCSVlYnAsJWVkeAorCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJMjAoJWVzcCksJWVjeAorCWFuZGwJJWVkaSwlZWJwCisJeG9ybAk0MCglZXNwKSwlZWN4CisJcm9sbAkkMSwlZWN4CisJYWRkbAklZWJ4LCVlYnAKKwlyb3JsCSQyLCVlZGkKKwltb3ZsCSVlZHgsJWVieAorCXJvbGwJJDUsJWVieAorCW1vdmwJJWVjeCw1MiglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWN4LCVlYnAsMSksJWVjeAorCW1vdmwJJWVzaSwlZWJwCisJYWRkbAklZWJ4LCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCW1vdmwJNTYoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWN4CisKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJMjQoJWVzcCksJWVieAorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAk0NCglZXNwKSwlZWJ4CisJcm9sbAkkMSwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlyb3JsCSQyLCVlZHgKKwltb3ZsCSVlY3gsJWVheAorCXJvbGwJJDUsJWVheAorCW1vdmwJJWVieCw1NiglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWJ4LCVlYnAsMSksJWVieAorCW1vdmwJJWVkaSwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhbmRsCSVlc2ksJWVicAorCW1vdmwJNjAoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJNCglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJNDgoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlc2kKKwltb3ZsCSVlYXgsNjAoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVheCwlZWJwLDEpLCVlYXgKKwltb3ZsCSVlZHgsJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYW5kbAklZWRpLCVlYnAKKwltb3ZsCSglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKworCW1vdmwJJWVjeCwlZWJwCisJeG9ybAk4KCVlc3ApLCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJMzIoJWVzcCksJWVzaQorCWFuZGwJJWVieCwlZWJwCisJeG9ybAk1MiglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJYWRkbAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlYngKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDUsJWVkaQorCW1vdmwJJWVzaSwoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVzaSwlZWJwLDEpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCWFkZGwJJWVkaSwlZXNpCisJYW5kbAklZWR4LCVlYnAKKwltb3ZsCTQoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWRpCisJYW5kbAklZWF4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlZGkKKwlyb2xsCSQxLCVlZGkKKwlhZGRsCSVlZHgsJWVicAorCXJvcmwJJDIsJWVheAorCW1vdmwJJWVzaSwlZWR4CisJcm9sbAkkNSwlZWR4CisJbW92bAklZWRpLDQoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVkaSwlZWJwLDEpLCVlZGkKKwltb3ZsCSVlYngsJWVicAorCWFkZGwJJWVkeCwlZWRpCisJYW5kbAklZWN4LCVlYnAKKwltb3ZsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVicCwlZWRpCisKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJMTYoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk0MCglZXNwKSwlZWR4CisJYW5kbAklZXNpLCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWN4CisJcm9sbAkkNSwlZWN4CisJbW92bAklZWR4LDgoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVkeCwlZWJwLDEpLCVlZHgKKwltb3ZsCSVlYXgsJWVicAorCWFkZGwJJWVjeCwlZWR4CisJYW5kbAklZWJ4LCVlYnAKKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwlhZGRsCSVlYnAsJWVkeAorCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTIwKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJNDQoJWVzcCksJWVjeAorCWFuZGwJJWVkaSwlZWJwCisJeG9ybAkoJWVzcCksJWVjeAorCXJvbGwJJDEsJWVjeAorCWFkZGwJJWVieCwlZWJwCisJcm9ybAkkMiwlZWRpCisJbW92bAklZWR4LCVlYngKKwlyb2xsCSQ1LCVlYngKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVjeCwlZWJwLDEpLCVlY3gKKwltb3ZsCSVlc2ksJWVicAorCWFkZGwJJWVieCwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwltb3ZsCTE2KCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVjeAorCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJNDgoJWVzcCksJWVieAorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlYngKKwlyb2xsCSQxLCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJcm9sbAkkNSwlZWF4CisJbW92bAklZWJ4LDE2KCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlYngsJWVicCwxKSwlZWJ4CisJbW92bAklZWRpLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFuZGwJJWVzaSwlZWJwCisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRkbAklZWJwLCVlYngKKworCW1vdmwJJWVkeCwlZWJwCisJeG9ybAkyOCglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTUyKCVlc3ApLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJOCglZXNwKSwlZWF4CisJcm9sbAkkMSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVzaQorCW1vdmwJJWVheCwyMCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWF4LCVlYnAsMSksJWVheAorCW1vdmwJJWVkeCwlZWJwCisJYWRkbAklZXNpLCVlYXgKKwlhbmRsCSVlZGksJWVicAorCW1vdmwJMjQoJWVzcCksJWVzaQorCWFkZGwJJWVicCwlZWF4CisKKwltb3ZsCSVlY3gsJWVicAorCXhvcmwJMzIoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAk1NiglZXNwKSwlZXNpCisJYW5kbAklZWJ4LCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlc2kKKwlyb2xsCSQxLCVlc2kKKwlhZGRsCSVlZGksJWVicAorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWRpCisJbW92bAklZXNpLDI0KCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlc2ksJWVicCwxKSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlhZGRsCSVlZGksJWVzaQorCWFuZGwJJWVkeCwlZWJwCisJbW92bAkyOCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlc2kKKworCW1vdmwJJWVieCwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlZGkKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJMTYoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVkeCwlZWJwCisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlZHgKKwlyb2xsCSQ1LCVlZHgKKwltb3ZsCSVlZGksMjgoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVkaSwlZWJwLDEpLCVlZGkKKwltb3ZsCSVlYngsJWVicAorCWFkZGwJJWVkeCwlZWRpCisJYW5kbAklZWN4LCVlYnAKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwlhZGRsCSVlYnAsJWVkaQorCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJKCVlc3ApLCVlZHgKKwlhbmRsCSVlc2ksJWVicAorCXhvcmwJMjAoJWVzcCksJWVkeAorCXJvbGwJJDEsJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJcm9ybAkkMiwlZXNpCisJbW92bAklZWRpLCVlY3gKKwlyb2xsCSQ1LCVlY3gKKwltb3ZsCSVlZHgsMzIoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVkeCwlZWJwLDEpLCVlZHgKKwltb3ZsCSVlYXgsJWVicAorCWFkZGwJJWVjeCwlZWR4CisJYW5kbAklZWJ4LCVlYnAKKwltb3ZsCTM2KCVlc3ApLCVlY3gKKwlhZGRsCSVlYnAsJWVkeAorCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJNCglZXNwKSwlZWN4CisJYW5kbAklZWRpLCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlY3gKKwlyb2xsCSQxLCVlY3gKKwlhZGRsCSVlYngsJWVicAorCXJvcmwJJDIsJWVkaQorCW1vdmwJJWVkeCwlZWJ4CisJcm9sbAkkNSwlZWJ4CisJbW92bAklZWN4LDM2KCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlY3gsJWVicCwxKSwlZWN4CisJbW92bAklZXNpLCVlYnAKKwlhZGRsCSVlYngsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbW92bAk0MCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKworCW1vdmwJJWVkaSwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTgoJWVzcCksJWVieAorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAkyOCglZXNwKSwlZWJ4CisJcm9sbAkkMSwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlyb3JsCSQyLCVlZHgKKwltb3ZsCSVlY3gsJWVheAorCXJvbGwJJDUsJWVheAorCW1vdmwJJWVieCw0MCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWJ4LCVlYnAsMSksJWVieAorCW1vdmwJJWVkaSwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhbmRsCSVlc2ksJWVicAorCW1vdmwJNDQoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJNTIoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWF4CisJYW5kbAklZWN4LCVlYnAKKwl4b3JsCTMyKCVlc3ApLCVlYXgKKwlyb2xsCSQxLCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXJvcmwJJDIsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZXNpCisJbW92bAklZWF4LDQ0KCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlYXgsJWVicCwxKSwlZWF4CisJbW92bAklZWR4LCVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFuZGwJJWVkaSwlZWJwCisJbW92bAk0OCglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKworCW1vdmwJJWVieCwlZWJwCisJeG9ybAk1NiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJMzYoJWVzcCksJWVzaQorCXJvbGwJJDEsJWVzaQorCWFkZGwJJWVicCwlZWRpCisJcm9ybAkkMiwlZWJ4CisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlc2ksNDgoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVzaSwlZWRpLDEpLCVlc2kKKwltb3ZsCTUyKCVlc3ApLCVlZGkKKwlhZGRsCSVlYnAsJWVzaQorCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAk0MCglZXNwKSwlZWRpCisJcm9sbAkkMSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwlyb3JsCSQyLCVlYXgKKwltb3ZsCSVlc2ksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkaSw1MiglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWRpLCVlZHgsMSksJWVkaQorCW1vdmwJNTYoJWVzcCksJWVkeAorCWFkZGwJJWVicCwlZWRpCisKKwltb3ZsCSVlc2ksJWVicAorCXhvcmwJKCVlc3ApLCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJMjQoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk0NCglZXNwKSwlZWR4CisJcm9sbAkkMSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkeCw1NiglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWR4LCVlY3gsMSksJWVkeAorCW1vdmwJNjAoJWVzcCksJWVjeAorCWFkZGwJJWVicCwlZWR4CisKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJNCglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJNDgoJWVzcCksJWVjeAorCXJvbGwJJDEsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJcm9ybAkkMiwlZWRpCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlY3gsNjAoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVjeCwlZWJ4LDEpLCVlY3gKKwltb3ZsCSglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKworCW1vdmwJJWVkeCwlZWJwCisJeG9ybAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJMzIoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAk1MiglZXNwKSwlZWJ4CisJcm9sbAkkMSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwlyb3JsCSQyLCVlZHgKKwltb3ZsCSVlY3gsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVieCwoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVieCwlZWF4LDEpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisKKwltb3ZsCSVlY3gsJWVicAorCXhvcmwJMTIoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlYXgKKwlyb2xsCSQxLCVlYXgKKwlhZGRsCSVlYnAsJWVzaQorCXJvcmwJJDIsJWVjeAorCW1vdmwJJWVieCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWF4LDQoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVheCwlZXNpLDEpLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVzaQorCWFkZGwJJWVicCwlZWF4CisKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJMTYoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAk0MCglZXNwKSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlc2kKKwlyb2xsCSQxLCVlc2kKKwlhZGRsCSVlYnAsJWVkaQorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZXNpLDgoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVzaSwlZWRpLDEpLCVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwlhZGRsCSVlYnAsJWVzaQorCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJNDQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAkoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlZGksMTIoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVkaSwlZWR4LDEpLCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlYnAsJWVkaQorCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJNDgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWR4LDE2KCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlZHgsJWVjeCwxKSwlZWR4CisJbW92bAkyMCglZXNwKSwlZWN4CisJYWRkbAklZWJwLCVlZHgKKworCW1vdmwJJWVkaSwlZWJwCisJeG9ybAkyOCglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTUyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJOCglZXNwKSwlZWN4CisJcm9sbAkkMSwlZWN4CisJYWRkbAklZWJwLCVlYngKKwlyb3JsCSQyLCVlZGkKKwltb3ZsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVjeCwyMCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWN4LCVlYngsMSksJWVjeAorCW1vdmwJMjQoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWN4CisKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJMzIoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAk1NiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlYngKKwlyb2xsCSQxLCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWJ4LDI0KCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlYngsJWVheCwxKSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWF4CisJYWRkbAklZWJwLCVlYngKKworCW1vdmwJJWVjeCwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJMTYoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCWFkZGwJJWVicCwlZXNpCisJcm9ybAkkMiwlZWN4CisJbW92bAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYXgsMjgoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVheCwlZXNpLDEpLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwlhZGRsCSVlYnAsJWVheAorCisJbW92bAklZWJ4LCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJMjAoJWVzcCksJWVzaQorCXJvbGwJJDEsJWVzaQorCWFkZGwJJWVicCwlZWRpCisJcm9ybAkkMiwlZWJ4CisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlc2ksMzIoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVzaSwlZWRpLDEpLCVlc2kKKwltb3ZsCTM2KCVlc3ApLCVlZGkKKwlhZGRsCSVlYnAsJWVzaQorCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTI0KCVlc3ApLCVlZGkKKwlyb2xsCSQxLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXJvcmwJJDIsJWVheAorCW1vdmwJJWVzaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWRpLDM2KCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlZGksJWVkeCwxKSwlZWRpCisJbW92bAk0MCglZXNwKSwlZWR4CisJYWRkbAklZWJwLCVlZGkKKworCW1vdmwJJWVzaSwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCTgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAkyOCglZXNwKSwlZWR4CisJcm9sbAkkMSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkeCw0MCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWR4LCVlY3gsMSksJWVkeAorCW1vdmwJNDQoJWVzcCksJWVjeAorCWFkZGwJJWVicCwlZWR4CisKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCTMyKCVlc3ApLCVlY3gKKwlyb2xsCSQxLCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXJvcmwJJDIsJWVkaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWN4LDQ0KCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlY3gsJWVieCwxKSwlZWN4CisJbW92bAk0OCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKworCW1vdmwJJWVkeCwlZWJwCisJeG9ybAk1NiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJMzYoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYngsNDgoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVieCwlZWF4LDEpLCVlYngKKwltb3ZsCTUyKCVlc3ApLCVlYXgKKwlhZGRsCSVlYnAsJWVieAorCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTYwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJMjAoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAk0MCglZXNwKSwlZWF4CisJcm9sbAkkMSwlZWF4CisJYWRkbAklZWJwLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYngsJWVicAorCXJvbGwJJDUsJWVicAorCWxlYWwJMzM5NTQ2OTc4MiglZWF4LCVlc2ksMSksJWVheAorCW1vdmwJNTYoJWVzcCksJWVzaQorCWFkZGwJJWVicCwlZWF4CisKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAk0NCglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJYWRkbAklZWJwLCVlZGkKKwlyb3JsCSQyLCVlYngKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVicAorCWxlYWwJMzM5NTQ2OTc4MiglZXNpLCVlZGksMSksJWVzaQorCW1vdmwJNjAoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJNDgoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwlsZWFsCTMzOTU0Njk3ODIoJWVkaSwlZWR4LDEpLCVlZGkKKwlhZGRsCSVlYnAsJWVkaQorCW1vdmwJOTYoJWVzcCksJWVicAorCW1vdmwJMTAwKCVlc3ApLCVlZHgKKwlhZGRsCSglZWJwKSwlZWRpCisJYWRkbAk0KCVlYnApLCVlc2kKKwlhZGRsCTgoJWVicCksJWVheAorCWFkZGwJMTIoJWVicCksJWVieAorCWFkZGwJMTYoJWVicCksJWVjeAorCW1vdmwJJWVkaSwoJWVicCkKKwlhZGRsCSQ2NCwlZWR4CisJbW92bAklZXNpLDQoJWVicCkKKwljbXBsCTEwNCglZXNwKSwlZWR4CisJbW92bAklZWF4LDgoJWVicCkKKwltb3ZsCSVlY3gsJWVkaQorCW1vdmwJJWVieCwxMiglZWJwKQorCW1vdmwJJWVkeCwlZXNpCisJbW92bAklZWN4LDE2KCVlYnApCisJamIJLkwwMDJsb29wCisJYWRkbAkkNzYsJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyLC4tLkxfc2hhMV9ibG9ja19kYXRhX29yZGVyX2JlZ2luCisuaGlkZGVuCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMKKy50eXBlCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTM6CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCWNhbGwJLkwwMDNwaWNfcG9pbnQKKy5MMDAzcGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJLkxLX1hYX1hYLS5MMDAzcGljX3BvaW50KCVlYnApLCVlYnAKKy5Mc3NzZTNfc2hvcnRjdXQ6CisJbW92ZHFhCSglZWJwKSwleG1tNworCW1vdmRxYQkxNiglZWJwKSwleG1tMAorCW1vdmRxYQkzMiglZWJwKSwleG1tMQorCW1vdmRxYQk0OCglZWJwKSwleG1tMgorCW1vdmRxYQk2NCglZWJwKSwleG1tNgorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVicAorCW1vdmwJMjgoJWVzcCksJWVkeAorCW1vdmwJJWVzcCwlZXNpCisJc3VibAkkMjA4LCVlc3AKKwlhbmRsCSQtNjQsJWVzcAorCW1vdmRxYQkleG1tMCwxMTIoJWVzcCkKKwltb3ZkcWEJJXhtbTEsMTI4KCVlc3ApCisJbW92ZHFhCSV4bW0yLDE0NCglZXNwKQorCXNobGwJJDYsJWVkeAorCW1vdmRxYQkleG1tNywxNjAoJWVzcCkKKwlhZGRsCSVlYnAsJWVkeAorCW1vdmRxYQkleG1tNiwxNzYoJWVzcCkKKwlhZGRsCSQ2NCwlZWJwCisJbW92bAklZWRpLDE5MiglZXNwKQorCW1vdmwJJWVicCwxOTYoJWVzcCkKKwltb3ZsCSVlZHgsMjAwKCVlc3ApCisJbW92bAklZXNpLDIwNCglZXNwKQorCW1vdmwJKCVlZGkpLCVlYXgKKwltb3ZsCTQoJWVkaSksJWVieAorCW1vdmwJOCglZWRpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJbW92bAkxNiglZWRpKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwltb3ZkcXUJLTY0KCVlYnApLCV4bW0wCisJbW92ZHF1CS00OCglZWJwKSwleG1tMQorCW1vdmRxdQktMzIoJWVicCksJXhtbTIKKwltb3ZkcXUJLTE2KCVlYnApLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTgKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNgorLmJ5dGUJMTAyLDE1LDU2LDAsMjE0CisJbW92ZHFhCSV4bW03LDk2KCVlc3ApCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAkleG1tNywleG1tMAorCXBhZGRkCSV4bW03LCV4bW0xCisJcGFkZGQJJXhtbTcsJXhtbTIKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJcHN1YmQJJXhtbTcsJXhtbTAKKwltb3ZkcWEJJXhtbTEsMTYoJWVzcCkKKwlwc3ViZAkleG1tNywleG1tMQorCW1vdmRxYQkleG1tMiwzMiglZXNwKQorCW1vdmwJJWVjeCwlZWJwCisJcHN1YmQJJXhtbTcsJXhtbTIKKwl4b3JsCSVlZHgsJWVicAorCXBzaHVmZAkkMjM4LCV4bW0wLCV4bW00CisJYW5kbAklZWJwLCVlc2kKKwlqbXAJLkwwMDRsb29wCisuYWxpZ24JMTYKKy5MMDA0bG9vcDoKKwlyb3JsCSQyLCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVheCwlZWJwCisJcHVucGNrbHFkcQkleG1tMSwleG1tNAorCW1vdmRxYQkleG1tMywleG1tNgorCWFkZGwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVieAorCXBhZGRkCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW0wLDY0KCVlc3ApCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlZGkKKwlwc3JsZHEJJDQsJXhtbTYKKwlhbmRsCSVlYngsJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJcHhvcgkleG1tMCwleG1tNAorCWFkZGwJJWVheCwlZWRpCisJcm9ybAkkNywlZWF4CisJcHhvcgkleG1tMiwleG1tNgorCXhvcmwJJWVjeCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlhZGRsCTQoJWVzcCksJWVkeAorCXB4b3IJJXhtbTYsJXhtbTQKKwl4b3JsCSVlYngsJWVheAorCXJvbGwJJDUsJWVkaQorCW1vdmRxYQkleG1tNyw0OCglZXNwKQorCWFkZGwJJWVicCwlZWR4CisJYW5kbAklZWF4LCVlc2kKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJcm9ybAkkNywlZWRpCisJbW92ZHFhCSV4bW00LCV4bW02CisJeG9ybAklZWJ4LCVlc2kKKwlwc2xsZHEJJDEyLCV4bW0wCisJcGFkZGQJJXhtbTQsJXhtbTQKKwltb3ZsCSVlZHgsJWVicAorCWFkZGwJOCglZXNwKSwlZWN4CisJcHNybGQJJDMxLCV4bW02CisJeG9ybAklZWF4LCVlZGkKKwlyb2xsCSQ1LCVlZHgKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwlhZGRsCSVlc2ksJWVjeAorCWFuZGwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlwc3JsZAkkMzAsJXhtbTAKKwlhZGRsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVkeAorCXBvcgkleG1tNiwleG1tNAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWN4LCVlc2kKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwlwc2xsZAkkMiwleG1tNworCXhvcmwJJWVkaSwlZWR4CisJcm9sbAkkNSwlZWN4CisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxYQk5NiglZXNwKSwleG1tMAorCWFkZGwJJWVicCwlZWJ4CisJYW5kbAklZWR4LCVlc2kKKwlweG9yCSV4bW03LCV4bW00CisJcHNodWZkCSQyMzgsJXhtbTEsJXhtbTUKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYngsJWVicAorCXB1bnBja2xxZHEJJXhtbTIsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTcKKwlhZGRsCTE2KCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVjeAorCXBhZGRkCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW0xLDgwKCVlc3ApCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwlwc3JsZHEJJDQsJXhtbTcKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJcHhvcgkleG1tMSwleG1tNQorCWFkZGwJJWVieCwlZWF4CisJcm9ybAkkNywlZWJ4CisJcHhvcgkleG1tMywleG1tNworCXhvcmwJJWVkeCwlZWJwCisJbW92bAklZWF4LCVlc2kKKwlhZGRsCTIwKCVlc3ApLCVlZGkKKwlweG9yCSV4bW03LCV4bW01CisJeG9ybAklZWN4LCVlYngKKwlyb2xsCSQ1LCVlYXgKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJYWRkbAklZWJwLCVlZGkKKwlhbmRsCSVlYngsJWVzaQorCW1vdmRxYQkleG1tNSwleG1tMQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlYXgKKwltb3ZkcWEJJXhtbTUsJXhtbTcKKwl4b3JsCSVlY3gsJWVzaQorCXBzbGxkcQkkMTIsJXhtbTEKKwlwYWRkZAkleG1tNSwleG1tNQorCW1vdmwJJWVkaSwlZWJwCisJYWRkbAkyNCglZXNwKSwlZWR4CisJcHNybGQJJDMxLCV4bW03CisJeG9ybAklZWJ4LCVlYXgKKwlyb2xsCSQ1LCVlZGkKKwltb3ZkcWEJJXhtbTEsJXhtbTAKKwlhZGRsCSVlc2ksJWVkeAorCWFuZGwJJWVheCwlZWJwCisJeG9ybAklZWJ4LCVlYXgKKwlwc3JsZAkkMzAsJXhtbTEKKwlhZGRsCSVlZGksJWVkeAorCXJvcmwJJDcsJWVkaQorCXBvcgkleG1tNywleG1tNQorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlhZGRsCTI4KCVlc3ApLCVlY3gKKwlwc2xsZAkkMiwleG1tMAorCXhvcmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWR4CisJcHhvcgkleG1tMSwleG1tNQorCW1vdmRxYQkxMTIoJWVzcCksJXhtbTEKKwlhZGRsCSVlYnAsJWVjeAorCWFuZGwJJWVkaSwlZXNpCisJcHhvcgkleG1tMCwleG1tNQorCXBzaHVmZAkkMjM4LCV4bW0yLCV4bW02CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVkeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlwdW5wY2tscWRxCSV4bW0zLCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW0wCisJYWRkbAkzMiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlZHgKKwlwYWRkZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMiw5NiglZXNwKQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJcHNybGRxCSQ0LCV4bW0wCisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCSVlZGksJWVkeAorCXB4b3IJJXhtbTIsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVjeAorCXB4b3IJJXhtbTQsJXhtbTAKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVieCwlZXNpCisJYWRkbAkzNiglZXNwKSwlZWF4CisJcHhvcgkleG1tMCwleG1tNgorCXhvcmwJJWVkeCwlZWN4CisJcm9sbAkkNSwlZWJ4CisJbW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJYWRkbAklZWJwLCVlYXgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmRxYQkleG1tNiwleG1tMgorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlyb3JsCSQ3LCVlYngKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwl4b3JsCSVlZHgsJWVzaQorCXBzbGxkcQkkMTIsJXhtbTIKKwlwYWRkZAkleG1tNiwleG1tNgorCW1vdmwJJWVheCwlZWJwCisJYWRkbAk0MCglZXNwKSwlZWRpCisJcHNybGQJJDMxLCV4bW0wCisJeG9ybAklZWN4LCVlYngKKwlyb2xsCSQ1LCVlYXgKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwlhZGRsCSVlc2ksJWVkaQorCWFuZGwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlwc3JsZAkkMzAsJXhtbTIKKwlhZGRsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVheAorCXBvcgkleG1tMCwleG1tNgorCXhvcmwJJWVjeCwlZWJwCisJbW92ZHFhCTY0KCVlc3ApLCV4bW0wCisJbW92bAklZWRpLCVlc2kKKwlhZGRsCTQ0KCVlc3ApLCVlZHgKKwlwc2xsZAkkMiwleG1tMQorCXhvcmwJJWVieCwlZWF4CisJcm9sbAkkNSwlZWRpCisJcHhvcgkleG1tMiwleG1tNgorCW1vdmRxYQkxMTIoJWVzcCksJXhtbTIKKwlhZGRsCSVlYnAsJWVkeAorCWFuZGwJJWVheCwlZXNpCisJcHhvcgkleG1tMSwleG1tNgorCXBzaHVmZAkkMjM4LCV4bW0zLCV4bW03CisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXJvcmwJJDcsJWVkaQorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWR4LCVlYnAKKwlwdW5wY2tscWRxCSV4bW00LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW0xCisJYWRkbAk0OCglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlwYWRkZAkleG1tNiwleG1tMgorCW1vdmRxYQkleG1tMyw2NCglZXNwKQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJcHNybGRxCSQ0LCV4bW0xCisJYW5kbAklZWRpLCVlYnAKKwl4b3JsCSVlYXgsJWVkaQorCXB4b3IJJXhtbTMsJXhtbTcKKwlhZGRsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTEKKwl4b3JsCSVlYXgsJWVicAorCW1vdmwJJWVjeCwlZXNpCisJYWRkbAk1MiglZXNwKSwlZWJ4CisJcHhvcgkleG1tMSwleG1tNworCXhvcmwJJWVkaSwlZWR4CisJcm9sbAkkNSwlZWN4CisJbW92ZHFhCSV4bW0yLDMyKCVlc3ApCisJYWRkbAklZWJwLCVlYngKKwlhbmRsCSVlZHgsJWVzaQorCW1vdmRxYQkleG1tNywleG1tMworCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlY3gKKwltb3ZkcWEJJXhtbTcsJXhtbTEKKwl4b3JsCSVlZGksJWVzaQorCXBzbGxkcQkkMTIsJXhtbTMKKwlwYWRkZAkleG1tNywleG1tNworCW1vdmwJJWVieCwlZWJwCisJYWRkbAk1NiglZXNwKSwlZWF4CisJcHNybGQJJDMxLCV4bW0xCisJeG9ybAklZWR4LCVlY3gKKwlyb2xsCSQ1LCVlYngKKwltb3ZkcWEJJXhtbTMsJXhtbTIKKwlhZGRsCSVlc2ksJWVheAorCWFuZGwJJWVjeCwlZWJwCisJeG9ybAklZWR4LCVlY3gKKwlwc3JsZAkkMzAsJXhtbTMKKwlhZGRsCSVlYngsJWVheAorCXJvcmwJJDcsJWVieAorCXBvcgkleG1tMSwleG1tNworCXhvcmwJJWVkeCwlZWJwCisJbW92ZHFhCTgwKCVlc3ApLCV4bW0xCisJbW92bAklZWF4LCVlc2kKKwlhZGRsCTYwKCVlc3ApLCVlZGkKKwlwc2xsZAkkMiwleG1tMgorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkNSwlZWF4CisJcHhvcgkleG1tMywleG1tNworCW1vdmRxYQkxMTIoJWVzcCksJXhtbTMKKwlhZGRsCSVlYnAsJWVkaQorCWFuZGwJJWVieCwlZXNpCisJcHhvcgkleG1tMiwleG1tNworCXBzaHVmZAkkMjM4LCV4bW02LCV4bW0yCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVheAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwdW5wY2tscWRxCSV4bW03LCV4bW0yCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCWFkZGwJKCVlc3ApLCVlZHgKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW00LDgwKCVlc3ApCisJeG9ybAklZWJ4LCVlYXgKKwlyb2xsCSQ1LCVlZGkKKwltb3ZkcWEJJXhtbTMsJXhtbTQKKwlhZGRsCSVlc2ksJWVkeAorCXBhZGRkCSV4bW03LCV4bW0zCisJYW5kbAklZWF4LCVlYnAKKwlweG9yCSV4bW0yLCV4bW0wCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXJvcmwJJDcsJWVkaQorCXhvcmwJJWVieCwlZWJwCisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW0zLDQ4KCVlc3ApCisJbW92bAklZWR4LCVlc2kKKwlhZGRsCTQoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWR4CisJcHNsbGQJJDIsJXhtbTAKKwlhZGRsCSVlYnAsJWVjeAorCWFuZGwJJWVkaSwlZXNpCisJcHNybGQJJDMwLCV4bW0yCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVkeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlhZGRsCTgoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWR4CisJcm9sbAkkNSwlZWN4CisJcG9yCSV4bW0yLCV4bW0wCisJYWRkbAklZXNpLCVlYngKKwlhbmRsCSVlZHgsJWVicAorCW1vdmRxYQk5NiglZXNwKSwleG1tMgorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVieCwlZXNpCisJcHNodWZkCSQyMzgsJXhtbTcsJXhtbTMKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZGkKKwlweG9yCSV4bW01LCV4bW0xCisJcHVucGNrbHFkcQkleG1tMCwleG1tMworCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYXgKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW01LDk2KCVlc3ApCisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmRxYQkleG1tNCwleG1tNQorCXJvcmwJJDcsJWVieAorCXBhZGRkCSV4bW0wLCV4bW00CisJYWRkbAklZWF4LCVlZGkKKwlweG9yCSV4bW0zLCV4bW0xCisJYWRkbAkyMCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwltb3ZsCSVlZGksJWVzaQorCXJvbGwJJDUsJWVkaQorCW1vdmRxYQkleG1tMSwleG1tMworCW1vdmRxYQkleG1tNCwoJWVzcCkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlwc2xsZAkkMiwleG1tMQorCWFkZGwJMjQoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJcHNybGQJJDMwLCV4bW0zCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJcm9ybAkkNywlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlwb3IJJXhtbTMsJXhtbTEKKwlhZGRsCTI4KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmRxYQk2NCglZXNwKSwleG1tMworCW1vdmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDcsJWVkeAorCXBzaHVmZAkkMjM4LCV4bW0wLCV4bW00CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTMyKCVlc3ApLCVlYXgKKwlweG9yCSV4bW02LCV4bW0yCisJcHVucGNrbHFkcQkleG1tMSwleG1tNAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlYngKKwlweG9yCSV4bW0zLCV4bW0yCisJbW92ZHFhCSV4bW02LDY0KCVlc3ApCisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCW1vdmRxYQkxMjgoJWVzcCksJXhtbTYKKwlyb3JsCSQ3LCVlY3gKKwlwYWRkZAkleG1tMSwleG1tNQorCWFkZGwJJWVieCwlZWF4CisJcHhvcgkleG1tNCwleG1tMgorCWFkZGwJMzYoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJbW92bAklZWF4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwltb3ZkcWEJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTUsMTYoJWVzcCkKKwlhZGRsCSVlYnAsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlwc2xsZAkkMiwleG1tMgorCWFkZGwJNDAoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcHNybGQJJDMwLCV4bW00CisJbW92bAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlwb3IJJXhtbTQsJXhtbTIKKwlhZGRsCTQ0KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCW1vdmRxYQk4MCglZXNwKSwleG1tNAorCW1vdmwJJWVkeCwlZXNpCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVkaQorCXBzaHVmZAkkMjM4LCV4bW0xLCV4bW01CisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTQ4KCVlc3ApLCVlYngKKwlweG9yCSV4bW03LCV4bW0zCisJcHVucGNrbHFkcQkleG1tMiwleG1tNQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlY3gKKwlweG9yCSV4bW00LCV4bW0zCisJbW92ZHFhCSV4bW03LDgwKCVlc3ApCisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmRxYQkleG1tNiwleG1tNworCXJvcmwJJDcsJWVkeAorCXBhZGRkCSV4bW0yLCV4bW02CisJYWRkbAklZWN4LCVlYngKKwlweG9yCSV4bW01LCV4bW0zCisJYWRkbAk1MiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVieAorCW1vdmRxYQkleG1tMywleG1tNQorCW1vdmRxYQkleG1tNiwzMiglZXNwKQorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXBzbGxkCSQyLCV4bW0zCisJYWRkbAk1NiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwlwc3JsZAkkMzAsJXhtbTUKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXBvcgkleG1tNSwleG1tMworCWFkZGwJNjAoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92ZHFhCTk2KCVlc3ApLCV4bW01CisJbW92bAklZWRpLCVlc2kKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcm9ybAkkNywlZWF4CisJcHNodWZkCSQyMzgsJXhtbTIsJXhtbTYKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJKCVlc3ApLCVlY3gKKwlweG9yCSV4bW0wLCV4bW00CisJcHVucGNrbHFkcQkleG1tMywleG1tNgorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlZHgKKwlweG9yCSV4bW01LCV4bW00CisJbW92ZHFhCSV4bW0wLDk2KCVlc3ApCisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCW1vdmRxYQkleG1tNywleG1tMAorCXJvcmwJJDcsJWVkaQorCXBhZGRkCSV4bW0zLCV4bW03CisJYWRkbAklZWR4LCVlY3gKKwlweG9yCSV4bW02LCV4bW00CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW02CisJbW92ZHFhCSV4bW03LDQ4KCVlc3ApCisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJcHNsbGQJJDIsJXhtbTQKKwlhZGRsCTgoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJcHNybGQJJDMwLCV4bW02CisJbW92bAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlwb3IJJXhtbTYsJXhtbTQKKwlhZGRsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmRxYQk2NCglZXNwKSwleG1tNgorCW1vdmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCXBzaHVmZAkkMjM4LCV4bW0zLCV4bW03CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlweG9yCSV4bW0xLCV4bW01CisJcHVucGNrbHFkcQkleG1tNCwleG1tNworCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlZGkKKwlweG9yCSV4bW02LCV4bW01CisJbW92ZHFhCSV4bW0xLDY0KCVlc3ApCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCW1vdmRxYQkleG1tMCwleG1tMQorCXJvcmwJJDcsJWVheAorCXBhZGRkCSV4bW00LCV4bW0wCisJYWRkbAklZWRpLCVlZHgKKwlweG9yCSV4bW03LCV4bW01CisJYWRkbAkyMCglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXJvbGwJJDUsJWVkeAorCW1vdmRxYQkleG1tNSwleG1tNworCW1vdmRxYQkleG1tMCwoJWVzcCkKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZXNpCisJcm9ybAkkNywlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlwc2xsZAkkMiwleG1tNQorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcHNybGQJJDMwLCV4bW03CisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlwb3IJJXhtbTcsJXhtbTUKKwlhZGRsCTI4KCVlc3ApLCVlYXgKKwltb3ZkcWEJODAoJWVzcCksJXhtbTcKKwlyb3JsCSQ3LCVlY3gKKwltb3ZsCSVlYngsJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWJ4CisJcHNodWZkCSQyMzgsJXhtbTQsJXhtbTAKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMzIoJWVzcCksJWVkaQorCXB4b3IJJXhtbTIsJXhtbTYKKwlwdW5wY2tscWRxCSV4bW01LCV4bW0wCisJYW5kbAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVieAorCXB4b3IJJXhtbTcsJXhtbTYKKwltb3ZkcWEJJXhtbTIsODAoJWVzcCkKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWF4CisJbW92ZHFhCSV4bW0xLCV4bW0yCisJYWRkbAklZXNpLCVlZGkKKwlwYWRkZAkleG1tNSwleG1tMQorCXhvcmwJJWVieCwlZWJwCisJcHhvcgkleG1tMCwleG1tNgorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTM2KCVlc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVicAorCW1vdmRxYQkleG1tNiwleG1tMAorCW1vdmRxYQkleG1tMSwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkNywlZWF4CisJbW92bAklZWRpLCVlc2kKKwl4b3JsCSVlYngsJWVicAorCXJvbGwJJDUsJWVkaQorCXBzbGxkCSQyLCV4bW02CisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXBzcmxkCSQzMCwleG1tMAorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTQwKCVlc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJcm9ybAkkNywlZWRpCisJcG9yCSV4bW0wLCV4bW02CisJbW92bAklZWR4LCVlYnAKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmRxYQk5NiglZXNwKSwleG1tMAorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJcHNodWZkCSQyMzgsJXhtbTUsJXhtbTEKKwlhZGRsCTQ0KCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVicAorCXhvcmwJJWVheCwlZWRpCisJcm9ybAkkNywlZWR4CisJbW92bAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVicAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0OCglZXNwKSwlZWF4CisJcHhvcgkleG1tMywleG1tNworCXB1bnBja2xxZHEJJXhtbTYsJXhtbTEKKwlhbmRsCSVlZHgsJWVzaQorCXhvcmwJJWVkaSwlZWR4CisJcm9ybAkkNywlZWN4CisJcHhvcgkleG1tMCwleG1tNworCW1vdmRxYQkleG1tMyw5NiglZXNwKQorCW1vdmwJJWVieCwlZWJwCisJeG9ybAklZWR4LCVlc2kKKwlyb2xsCSQ1LCVlYngKKwltb3ZkcWEJMTQ0KCVlc3ApLCV4bW0zCisJYWRkbAklZXNpLCVlYXgKKwlwYWRkZAkleG1tNiwleG1tMgorCXhvcmwJJWVjeCwlZWJwCisJcHhvcgkleG1tMSwleG1tNworCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTUyKCVlc3ApLCVlZGkKKwlhbmRsCSVlY3gsJWVicAorCW1vdmRxYQkleG1tNywleG1tMQorCW1vdmRxYQkleG1tMiwzMiglZXNwKQorCXhvcmwJJWVkeCwlZWN4CisJcm9ybAkkNywlZWJ4CisJbW92bAklZWF4LCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXJvbGwJJDUsJWVheAorCXBzbGxkCSQyLCV4bW03CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCXBzcmxkCSQzMCwleG1tMQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTU2KCVlc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkNywlZWF4CisJcG9yCSV4bW0xLCV4bW03CisJbW92bAklZWRpLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCW1vdmRxYQk2NCglZXNwKSwleG1tMQorCXJvbGwJJDUsJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJcHNodWZkCSQyMzgsJXhtbTYsJXhtbTIKKwlhZGRsCTYwKCVlc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJJWVieCwlZWF4CisJcm9ybAkkNywlZWRpCisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkoJWVzcCksJWVieAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwdW5wY2tscWRxCSV4bW03LCV4bW0yCisJYW5kbAklZWRpLCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVkeAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJJXhtbTQsNjQoJWVzcCkKKwltb3ZsCSVlY3gsJWVicAorCXhvcmwJJWVkaSwlZXNpCisJcm9sbAkkNSwlZWN4CisJbW92ZHFhCSV4bW0zLCV4bW00CisJYWRkbAklZXNpLCVlYngKKwlwYWRkZAkleG1tNywleG1tMworCXhvcmwJJWVkeCwlZWJwCisJcHhvcgkleG1tMiwleG1tMAorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQoJWVzcCksJWVheAorCWFuZGwJJWVkeCwlZWJwCisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW0zLDQ4KCVlc3ApCisJeG9ybAklZWRpLCVlZHgKKwlyb3JsCSQ3LCVlY3gKKwltb3ZsCSVlYngsJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWJ4CisJcHNsbGQJJDIsJXhtbTAKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVjeCwlZXNpCisJcHNybGQJJDMwLCV4bW0yCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJOCglZXNwKSwlZWRpCisJYW5kbAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVieAorCXBvcgkleG1tMiwleG1tMAorCW1vdmwJJWVheCwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwltb3ZkcWEJODAoJWVzcCksJXhtbTIKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlc2ksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXBzaHVmZAkkMjM4LCV4bW03LCV4bW0zCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYW5kbAklZWJ4LCVlYnAKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVheAorCW1vdmwJJWVkaSwlZXNpCisJeG9ybAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJMTYoJWVzcCksJWVjeAorCXB4b3IJJXhtbTUsJXhtbTEKKwlwdW5wY2tscWRxCSV4bW0wLCV4bW0zCisJYW5kbAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCXJvcmwJJDcsJWVkaQorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTUsODAoJWVzcCkKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWR4CisJbW92ZHFhCSV4bW00LCV4bW01CisJYWRkbAklZXNpLCVlY3gKKwlwYWRkZAkleG1tMCwleG1tNAorCXhvcmwJJWVkaSwlZWJwCisJcHhvcgkleG1tMywleG1tMQorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTIwKCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVicAorCW1vdmRxYQkleG1tMSwleG1tMworCW1vdmRxYQkleG1tNCwoJWVzcCkKKwl4b3JsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVkeAorCW1vdmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlY3gKKwlwc2xsZAkkMiwleG1tMQorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwlwc3JsZAkkMzAsJXhtbTMKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWF4CisJYW5kbAklZWR4LCVlc2kKKwl4b3JsCSVlZGksJWVkeAorCXJvcmwJJDcsJWVjeAorCXBvcgkleG1tMywleG1tMQorCW1vdmwJJWVieCwlZWJwCisJeG9ybAklZWR4LCVlc2kKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTMKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXBzaHVmZAkkMjM4LCV4bW0wLCV4bW00CisJYWRkbAkyOCglZXNwKSwlZWRpCisJYW5kbAklZWN4LCVlYnAKKwl4b3JsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVieAorCW1vdmwJJWVheCwlZXNpCisJeG9ybAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYnAsJWVkaQorCXhvcmwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMzIoJWVzcCksJWVkeAorCXB4b3IJJXhtbTYsJXhtbTIKKwlwdW5wY2tscWRxCSV4bW0xLCV4bW00CisJYW5kbAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVheAorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcWEJJXhtbTYsOTYoJWVzcCkKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWRpCisJbW92ZHFhCSV4bW01LCV4bW02CisJYWRkbAklZXNpLCVlZHgKKwlwYWRkZAkleG1tMSwleG1tNQorCXhvcmwJJWVheCwlZWJwCisJcHhvcgkleG1tNCwleG1tMgorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTM2KCVlc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCW1vdmRxYQkleG1tMiwleG1tNAorCW1vdmRxYQkleG1tNSwxNiglZXNwKQorCXhvcmwJJWVieCwlZWF4CisJcm9ybAkkNywlZWRpCisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVkeAorCXBzbGxkCSQyLCV4bW0yCisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXBzcmxkCSQzMCwleG1tNAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTQwKCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVzaQorCXhvcmwJJWVheCwlZWRpCisJcm9ybAkkNywlZWR4CisJcG9yCSV4bW00LCV4bW0yCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCW1vdmRxYQk2NCglZXNwKSwleG1tNAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJcHNodWZkCSQyMzgsJXhtbTEsJXhtbTUKKwlhZGRsCTQ0KCVlc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVicAorCXhvcmwJJWVkaSwlZWR4CisJcm9ybAkkNywlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNDgoJWVzcCksJWVkaQorCXB4b3IJJXhtbTcsJXhtbTMKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW01CisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVheAorCXB4b3IJJXhtbTQsJXhtbTMKKwltb3ZkcWEJJXhtbTcsNjQoJWVzcCkKKwlhZGRsCSVlc2ksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJbW92ZHFhCSV4bW02LCV4bW03CisJcm9ybAkkNywlZWJ4CisJcGFkZGQJJXhtbTIsJXhtbTYKKwlhZGRsCSVlYXgsJWVkaQorCXB4b3IJJXhtbTUsJXhtbTMKKwlhZGRsCTUyKCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCW1vdmwJJWVkaSwlZXNpCisJcm9sbAkkNSwlZWRpCisJbW92ZHFhCSV4bW0zLCV4bW01CisJbW92ZHFhCSV4bW02LDMyKCVlc3ApCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJcHNsbGQJJDIsJXhtbTMKKwlhZGRsCTU2KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXBzcmxkCSQzMCwleG1tNQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXJvcmwJJDcsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJcG9yCSV4bW01LCV4bW0zCisJYWRkbAk2MCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWJwCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXJvcmwJJDcsJWVjeAorCXBhZGRkCSV4bW0zLCV4bW03CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJbW92bAklZWF4LCVlc2kKKwltb3ZkcWEJJXhtbTcsNDgoJWVzcCkKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYnAsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTEyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJbW92bAkxOTYoJWVzcCksJWVicAorCWNtcGwJMjAwKCVlc3ApLCVlYnAKKwlqZQkuTDAwNWRvbmUKKwltb3ZkcWEJMTYwKCVlc3ApLCV4bW03CisJbW92ZHFhCTE3NiglZXNwKSwleG1tNgorCW1vdmRxdQkoJWVicCksJXhtbTAKKwltb3ZkcXUJMTYoJWVicCksJXhtbTEKKwltb3ZkcXUJMzIoJWVicCksJXhtbTIKKwltb3ZkcXUJNDgoJWVicCksJXhtbTMKKwlhZGRsCSQ2NCwlZWJwCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTgKKwltb3ZsCSVlYnAsMTk2KCVlc3ApCisJbW92ZHFhCSV4bW03LDk2KCVlc3ApCisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQ3LCVlZHgKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNgorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyMCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXBhZGRkCSV4bW03LCV4bW0wCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXJvcmwJJDcsJWVjeAorCW1vdmRxYQkleG1tMCwoJWVzcCkKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlYnAKKwlwc3ViZAkleG1tNywleG1tMAorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMjgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXJvcmwJJDcsJWVkaQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE0CisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTM2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVjeCwlZXNpCisJcGFkZGQJJXhtbTcsJXhtbTEKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNywlZWR4CisJbW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWJwCisJcHN1YmQJJXhtbTcsJXhtbTEKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXJvbGwJJDUsJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwlyb3JsCSQ3LCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMgorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAk1MiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXBhZGRkCSV4bW03LCV4bW0yCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVkaQorCW1vdmRxYQkleG1tMiwzMiglZXNwKQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk1NiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCXBzdWJkCSV4bW03LCV4bW0yCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwltb3ZsCTE5MiglZXNwKSwlZWJwCisJYWRkbAkoJWVicCksJWVheAorCWFkZGwJNCglZWJwKSwlZXNpCisJYWRkbAk4KCVlYnApLCVlY3gKKwltb3ZsCSVlYXgsKCVlYnApCisJYWRkbAkxMiglZWJwKSwlZWR4CisJbW92bAklZXNpLDQoJWVicCkKKwlhZGRsCTE2KCVlYnApLCVlZGkKKwltb3ZsCSVlY3gsOCglZWJwKQorCW1vdmwJJWVjeCwlZWJ4CisJbW92bAklZWR4LDEyKCVlYnApCisJeG9ybAklZWR4LCVlYngKKwltb3ZsCSVlZGksMTYoJWVicCkKKwltb3ZsCSVlc2ksJWVicAorCXBzaHVmZAkkMjM4LCV4bW0wLCV4bW00CisJYW5kbAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVieAorCWptcAkuTDAwNGxvb3AKKy5hbGlnbgkxNgorLkwwMDVkb25lOgorCWFkZGwJMTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXJvcmwJJDcsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMjgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXJvcmwJJDcsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkzNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXJvbGwJJDUsJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZXNpCisJcm9ybAkkNywlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwltb3ZsCTE5MiglZXNwKSwlZWJwCisJYWRkbAkoJWVicCksJWVheAorCW1vdmwJMjA0KCVlc3ApLCVlc3AKKwlhZGRsCTQoJWVicCksJWVzaQorCWFkZGwJOCglZWJwKSwlZWN4CisJbW92bAklZWF4LCglZWJwKQorCWFkZGwJMTIoJWVicCksJWVkeAorCW1vdmwJJWVzaSw0KCVlYnApCisJYWRkbAkxNiglZWJwKSwlZWRpCisJbW92bAklZWN4LDgoJWVicCkKKwltb3ZsCSVlZHgsMTIoJWVicCkKKwltb3ZsCSVlZGksMTYoJWVicCkKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMsLi1fc2hhMV9ibG9ja19kYXRhX29yZGVyX3Nzc2UzCisuaGlkZGVuCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4CisudHlwZQlfc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdng6CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCWNhbGwJLkwwMDZwaWNfcG9pbnQKKy5MMDA2cGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJLkxLX1hYX1hYLS5MMDA2cGljX3BvaW50KCVlYnApLCVlYnAKKy5MYXZ4X3Nob3J0Y3V0OgorCXZ6ZXJvYWxsCisJdm1vdmRxYQkoJWVicCksJXhtbTcKKwl2bW92ZHFhCTE2KCVlYnApLCV4bW0wCisJdm1vdmRxYQkzMiglZWJwKSwleG1tMQorCXZtb3ZkcWEJNDgoJWVicCksJXhtbTIKKwl2bW92ZHFhCTY0KCVlYnApLCV4bW02CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZWJwCisJbW92bAkyOCglZXNwKSwlZWR4CisJbW92bAklZXNwLCVlc2kKKwlzdWJsCSQyMDgsJWVzcAorCWFuZGwJJC02NCwlZXNwCisJdm1vdmRxYQkleG1tMCwxMTIoJWVzcCkKKwl2bW92ZHFhCSV4bW0xLDEyOCglZXNwKQorCXZtb3ZkcWEJJXhtbTIsMTQ0KCVlc3ApCisJc2hsbAkkNiwlZWR4CisJdm1vdmRxYQkleG1tNywxNjAoJWVzcCkKKwlhZGRsCSVlYnAsJWVkeAorCXZtb3ZkcWEJJXhtbTYsMTc2KCVlc3ApCisJYWRkbAkkNjQsJWVicAorCW1vdmwJJWVkaSwxOTIoJWVzcCkKKwltb3ZsCSVlYnAsMTk2KCVlc3ApCisJbW92bAklZWR4LDIwMCglZXNwKQorCW1vdmwJJWVzaSwyMDQoJWVzcCkKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCW1vdmwJMTYoJWVkaSksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJdm1vdmRxdQktNjQoJWVicCksJXhtbTAKKwl2bW92ZHF1CS00OCglZWJwKSwleG1tMQorCXZtb3ZkcXUJLTMyKCVlYnApLCV4bW0yCisJdm1vdmRxdQktMTYoJWVicCksJXhtbTMKKwl2cHNodWZiCSV4bW02LCV4bW0wLCV4bW0wCisJdnBzaHVmYgkleG1tNiwleG1tMSwleG1tMQorCXZwc2h1ZmIJJXhtbTYsJXhtbTIsJXhtbTIKKwl2bW92ZHFhCSV4bW03LDk2KCVlc3ApCisJdnBzaHVmYgkleG1tNiwleG1tMywleG1tMworCXZwYWRkZAkleG1tNywleG1tMCwleG1tNAorCXZwYWRkZAkleG1tNywleG1tMSwleG1tNQorCXZwYWRkZAkleG1tNywleG1tMiwleG1tNgorCXZtb3ZkcWEJJXhtbTQsKCVlc3ApCisJbW92bAklZWN4LCVlYnAKKwl2bW92ZHFhCSV4bW01LDE2KCVlc3ApCisJeG9ybAklZWR4LCVlYnAKKwl2bW92ZHFhCSV4bW02LDMyKCVlc3ApCisJYW5kbAklZWJwLCVlc2kKKwlqbXAJLkwwMDdsb29wCisuYWxpZ24JMTYKKy5MMDA3bG9vcDoKKwlzaHJkbAkkMiwlZWJ4LCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW00CisJbW92bAklZWF4LCVlYnAKKwlhZGRsCSglZXNwKSwlZWRpCisJdnBhZGRkCSV4bW0zLCV4bW03LCV4bW03CisJdm1vdmRxYQkleG1tMCw2NCglZXNwKQorCXhvcmwJJWVjeCwlZWJ4CisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnBzcmxkcQkkNCwleG1tMywleG1tNgorCWFkZGwJJWVzaSwlZWRpCisJYW5kbAklZWJ4LCVlYnAKKwl2cHhvcgkleG1tMCwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCXNocmRsCSQ3LCVlYXgsJWVheAorCXhvcmwJJWVjeCwlZWJwCisJdm1vdmRxYQkleG1tNyw0OCglZXNwKQorCW1vdmwJJWVkaSwlZXNpCisJYWRkbAk0KCVlc3ApLCVlZHgKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJWVieCwlZWF4CisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwlhbmRsCSVlYXgsJWVzaQorCXZwc3JsZAkkMzEsJXhtbTQsJXhtbTYKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJc2hyZGwJJDcsJWVkaSwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwl2cHNsbGRxCSQxMiwleG1tNCwleG1tMAorCXZwYWRkZAkleG1tNCwleG1tNCwleG1tNAorCW1vdmwJJWVkeCwlZWJwCisJYWRkbAk4KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZwc3JsZAkkMzAsJXhtbTAsJXhtbTcKKwl2cG9yCSV4bW02LCV4bW00LCV4bW00CisJYWRkbAklZXNpLCVlY3gKKwlhbmRsCSVlZGksJWVicAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwl2cHNsbGQJJDIsJXhtbTAsJXhtbTAKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXZweG9yCSV4bW03LCV4bW00LCV4bW00CisJbW92bAklZWN4LCVlc2kKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVkeAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZweG9yCSV4bW0wLCV4bW00LCV4bW00CisJYWRkbAklZWJwLCVlYngKKwlhbmRsCSVlZHgsJWVzaQorCXZtb3ZkcWEJOTYoJWVzcCksJXhtbTAKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tNQorCW1vdmwJJWVieCwlZWJwCisJYWRkbAkxNiglZXNwKSwlZWF4CisJdnBhZGRkCSV4bW00LCV4bW0wLCV4bW0wCisJdm1vdmRxYQkleG1tMSw4MCglZXNwKQorCXhvcmwJJWVkeCwlZWN4CisJc2hsZGwJJDUsJWVieCwlZWJ4CisJdnBzcmxkcQkkNCwleG1tNCwleG1tNworCWFkZGwJJWVzaSwlZWF4CisJYW5kbAklZWN4LCVlYnAKKwl2cHhvcgkleG1tMSwleG1tNSwleG1tNQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cHhvcgkleG1tMywleG1tNywleG1tNworCXNocmRsCSQ3LCVlYngsJWVieAorCXhvcmwJJWVkeCwlZWJwCisJdm1vdmRxYQkleG1tMCwoJWVzcCkKKwltb3ZsCSVlYXgsJWVzaQorCWFkZGwJMjAoJWVzcCksJWVkaQorCXZweG9yCSV4bW03LCV4bW01LCV4bW01CisJeG9ybAklZWN4LCVlYngKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkaQorCWFuZGwJJWVieCwlZXNpCisJdnBzcmxkCSQzMSwleG1tNSwleG1tNworCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwl4b3JsCSVlY3gsJWVzaQorCXZwc2xsZHEJJDEyLCV4bW01LCV4bW0xCisJdnBhZGRkCSV4bW01LCV4bW01LCV4bW01CisJbW92bAklZWRpLCVlYnAKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVheAorCXNobGRsCSQ1LCVlZGksJWVkaQorCXZwc3JsZAkkMzAsJXhtbTEsJXhtbTAKKwl2cG9yCSV4bW03LCV4bW01LCV4bW01CisJYWRkbAklZXNpLCVlZHgKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwl2cHNsbGQJJDIsJXhtbTEsJXhtbTEKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXZweG9yCSV4bW0wLCV4bW01LCV4bW01CisJbW92bAklZWR4LCVlc2kKKwlhZGRsCTI4KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZweG9yCSV4bW0xLCV4bW01LCV4bW01CisJYWRkbAklZWJwLCVlY3gKKwlhbmRsCSVlZGksJWVzaQorCXZtb3ZkcWEJMTEyKCVlc3ApLCV4bW0xCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXhvcmwJJWVheCwlZXNpCisJdnBhbGlnbnIJJDgsJXhtbTIsJXhtbTMsJXhtbTYKKwltb3ZsCSVlY3gsJWVicAorCWFkZGwJMzIoJWVzcCksJWVieAorCXZwYWRkZAkleG1tNSwleG1tMSwleG1tMQorCXZtb3ZkcWEJJXhtbTIsOTYoJWVzcCkKKwl4b3JsCSVlZGksJWVkeAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZwc3JsZHEJJDQsJXhtbTUsJXhtbTAKKwlhZGRsCSVlc2ksJWVieAorCWFuZGwJJWVkeCwlZWJwCisJdnB4b3IJJXhtbTIsJXhtbTYsJXhtbTYKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnB4b3IJJXhtbTQsJXhtbTAsJXhtbTAKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwl4b3JsCSVlZGksJWVicAorCXZtb3ZkcWEJJXhtbTEsMTYoJWVzcCkKKwltb3ZsCSVlYngsJWVzaQorCWFkZGwJMzYoJWVzcCksJWVheAorCXZweG9yCSV4bW0wLCV4bW02LCV4bW02CisJeG9ybAklZWR4LCVlY3gKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCWFuZGwJJWVjeCwlZXNpCisJdnBzcmxkCSQzMSwleG1tNiwleG1tMAorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCXZwc2xsZHEJJDEyLCV4bW02LCV4bW0yCisJdnBhZGRkCSV4bW02LCV4bW02LCV4bW02CisJbW92bAklZWF4LCVlYnAKKwlhZGRsCTQwKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVieAorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZwc3JsZAkkMzAsJXhtbTIsJXhtbTEKKwl2cG9yCSV4bW0wLCV4bW02LCV4bW02CisJYWRkbAklZXNpLCVlZGkKKwlhbmRsCSVlYngsJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwl2cHNsbGQJJDIsJXhtbTIsJXhtbTIKKwl2bW92ZHFhCTY0KCVlc3ApLCV4bW0wCisJc2hyZGwJJDcsJWVheCwlZWF4CisJeG9ybAklZWN4LCVlYnAKKwl2cHhvcgkleG1tMSwleG1tNiwleG1tNgorCW1vdmwJJWVkaSwlZXNpCisJYWRkbAk0NCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYXgKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCWFkZGwJJWVicCwlZWR4CisJYW5kbAklZWF4LCVlc2kKKwl2bW92ZHFhCTExMiglZXNwKSwleG1tMgorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCXZwYWxpZ25yCSQ4LCV4bW0zLCV4bW00LCV4bW03CisJbW92bAklZWR4LCVlYnAKKwlhZGRsCTQ4KCVlc3ApLCVlY3gKKwl2cGFkZGQJJXhtbTYsJXhtbTIsJXhtbTIKKwl2bW92ZHFhCSV4bW0zLDY0KCVlc3ApCisJeG9ybAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cHNybGRxCSQ0LCV4bW02LCV4bW0xCisJYWRkbAklZXNpLCVlY3gKKwlhbmRsCSVlZGksJWVicAorCXZweG9yCSV4bW0zLCV4bW03LCV4bW03CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXZweG9yCSV4bW01LCV4bW0xLCV4bW0xCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJeG9ybAklZWF4LCVlYnAKKwl2bW92ZHFhCSV4bW0yLDMyKCVlc3ApCisJbW92bAklZWN4LCVlc2kKKwlhZGRsCTUyKCVlc3ApLCVlYngKKwl2cHhvcgkleG1tMSwleG1tNywleG1tNworCXhvcmwJJWVkaSwlZWR4CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWJwLCVlYngKKwlhbmRsCSVlZHgsJWVzaQorCXZwc3JsZAkkMzEsJXhtbTcsJXhtbTEKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl2cHNsbGRxCSQxMiwleG1tNywleG1tMworCXZwYWRkZAkleG1tNywleG1tNywleG1tNworCW1vdmwJJWVieCwlZWJwCisJYWRkbAk1NiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlY3gKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwl2cHNybGQJJDMwLCV4bW0zLCV4bW0yCisJdnBvcgkleG1tMSwleG1tNywleG1tNworCWFkZGwJJWVzaSwlZWF4CisJYW5kbAklZWN4LCVlYnAKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBzbGxkCSQyLCV4bW0zLCV4bW0zCisJdm1vdmRxYQk4MCglZXNwKSwleG1tMQorCXNocmRsCSQ3LCVlYngsJWVieAorCXhvcmwJJWVkeCwlZWJwCisJdnB4b3IJJXhtbTIsJXhtbTcsJXhtbTcKKwltb3ZsCSVlYXgsJWVzaQorCWFkZGwJNjAoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnB4b3IJJXhtbTMsJXhtbTcsJXhtbTcKKwlhZGRsCSVlYnAsJWVkaQorCWFuZGwJJWVieCwlZXNpCisJdm1vdmRxYQkxMTIoJWVzcCksJXhtbTMKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWRpCisJdnBhbGlnbnIJJDgsJXhtbTYsJXhtbTcsJXhtbTIKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXNocmRsCSQ3LCVlYXgsJWVheAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlhZGRsCSglZXNwKSwlZWR4CisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKwl2bW92ZHFhCSV4bW00LDgwKCVlc3ApCisJeG9ybAklZWJ4LCVlYXgKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwl2bW92ZHFhCSV4bW0zLCV4bW00CisJdnBhZGRkCSV4bW03LCV4bW0zLCV4bW0zCisJYWRkbAklZXNpLCVlZHgKKwlhbmRsCSVlYXgsJWVicAorCXZweG9yCSV4bW0yLCV4bW0wLCV4bW0wCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXNocmRsCSQ3LCVlZGksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJdnBzcmxkCSQzMCwleG1tMCwleG1tMgorCXZtb3ZkcWEJJXhtbTMsNDgoJWVzcCkKKwltb3ZsCSVlZHgsJWVzaQorCWFkZGwJNCglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cHNsbGQJJDIsJXhtbTAsJXhtbTAKKwlhZGRsCSVlYnAsJWVjeAorCWFuZGwJJWVkaSwlZXNpCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlhZGRsCTgoJWVzcCksJWVieAorCXZwb3IJJXhtbTIsJXhtbTAsJXhtbTAKKwl4b3JsCSVlZGksJWVkeAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZtb3ZkcWEJOTYoJWVzcCksJXhtbTIKKwlhZGRsCSVlc2ksJWVieAorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAklZWRpLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMTIoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAklZWJ4LCVlc2kKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cGFsaWducgkkOCwleG1tNywleG1tMCwleG1tMworCXZweG9yCSV4bW01LCV4bW0xLCV4bW0xCisJYWRkbAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdm1vdmRxYQkleG1tNSw5NiglZXNwKQorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl2bW92ZHFhCSV4bW00LCV4bW01CisJdnBhZGRkCSV4bW0wLCV4bW00LCV4bW00CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCWFkZGwJMjAoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwl2cHNybGQJJDMwLCV4bW0xLCV4bW0zCisJdm1vdmRxYQkleG1tNCwoJWVzcCkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwl2cHNsbGQJJDIsJXhtbTEsJXhtbTEKKwlhZGRsCTI0KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXNocmRsCSQ3LCVlZGksJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJdnBvcgkleG1tMywleG1tMSwleG1tMQorCWFkZGwJMjgoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJdm1vdmRxYQk2NCglZXNwKSwleG1tMworCW1vdmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNiwleG1tMiwleG1tMgorCWFkZGwJMzIoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwl2cHhvcgkleG1tMywleG1tMiwleG1tMgorCXZtb3ZkcWEJJXhtbTYsNjQoJWVzcCkKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJdm1vdmRxYQkxMjgoJWVzcCksJXhtbTYKKwl2cGFkZGQJJXhtbTEsJXhtbTUsJXhtbTUKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJYWRkbAkzNiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZwc3JsZAkkMzAsJXhtbTIsJXhtbTQKKwl2bW92ZHFhCSV4bW01LDE2KCVlc3ApCisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJdnBzbGxkCSQyLCV4bW0yLCV4bW0yCisJYWRkbAk0MCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXZwb3IJJXhtbTQsJXhtbTIsJXhtbTIKKwlhZGRsCTQ0KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXZtb3ZkcWEJODAoJWVzcCksJXhtbTQKKwltb3ZsCSVlZHgsJWVzaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0yLCV4bW01CisJdnB4b3IJJXhtbTcsJXhtbTMsJXhtbTMKKwlhZGRsCTQ4KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2bW92ZHFhCSV4bW03LDgwKCVlc3ApCisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXZtb3ZkcWEJJXhtbTYsJXhtbTcKKwl2cGFkZGQJJXhtbTIsJXhtbTYsJXhtbTYKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZweG9yCSV4bW01LCV4bW0zLCV4bW0zCisJYWRkbAk1MiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCXZwc3JsZAkkMzAsJXhtbTMsJXhtbTUKKwl2bW92ZHFhCSV4bW02LDMyKCVlc3ApCisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBzbGxkCSQyLCV4bW0zLCV4bW0zCisJYWRkbAk1NiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXZwb3IJJXhtbTUsJXhtbTMsJXhtbTMKKwlhZGRsCTYwKCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXZtb3ZkcWEJOTYoJWVzcCksJXhtbTUKKwltb3ZsCSVlZGksJWVzaQorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXZwYWxpZ25yCSQ4LCV4bW0yLCV4bW0zLCV4bW02CisJdnB4b3IJJXhtbTAsJXhtbTQsJXhtbTQKKwlhZGRsCSglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVicAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMCw5NiglZXNwKQorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwl2bW92ZHFhCSV4bW03LCV4bW0wCisJdnBhZGRkCSV4bW0zLCV4bW03LCV4bW03CisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCWFkZGwJNCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZwc3JsZAkkMzAsJXhtbTQsJXhtbTYKKwl2bW92ZHFhCSV4bW03LDQ4KCVlc3ApCisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBzbGxkCSQyLCV4bW00LCV4bW00CisJYWRkbAk4KCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWJwCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBvcgkleG1tNiwleG1tNCwleG1tNAorCWFkZGwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJdm1vdmRxYQk2NCglZXNwKSwleG1tNgorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJdnBhbGlnbnIJJDgsJXhtbTMsJXhtbTQsJXhtbTcKKwl2cHhvcgkleG1tMSwleG1tNSwleG1tNQorCWFkZGwJMTYoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwl2cHhvcgkleG1tNiwleG1tNSwleG1tNQorCXZtb3ZkcWEJJXhtbTEsNjQoJWVzcCkKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJdm1vdmRxYQkleG1tMCwleG1tMQorCXZwYWRkZAkleG1tNCwleG1tMCwleG1tMAorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJdnB4b3IJJXhtbTcsJXhtbTUsJXhtbTUKKwlhZGRsCTIwKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdnBzcmxkCSQzMCwleG1tNSwleG1tNworCXZtb3ZkcWEJJXhtbTAsKCVlc3ApCisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXNocmRsCSQ3LCVlZGksJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJdnBzbGxkCSQyLCV4bW01LCV4bW01CisJYWRkbAkyNCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwb3IJJXhtbTcsJXhtbTUsJXhtbTUKKwlhZGRsCTI4KCVlc3ApLCVlYXgKKwl2bW92ZHFhCTgwKCVlc3ApLCV4bW03CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBhbGlnbnIJJDgsJXhtbTQsJXhtbTUsJXhtbTAKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCWFkZGwJMzIoJWVzcCksJWVkaQorCWFuZGwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXZtb3ZkcWEJJXhtbTIsODAoJWVzcCkKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJJWVjeCwlZXNpCisJdm1vdmRxYQkleG1tMSwleG1tMgorCXZwYWRkZAkleG1tNSwleG1tMSwleG1tMQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJdnB4b3IJJXhtbTAsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTM2KCVlc3ApLCVlZHgKKwl2cHNybGQJJDMwLCV4bW02LCV4bW0wCisJdm1vdmRxYQkleG1tMSwxNiglZXNwKQorCWFuZGwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwltb3ZsCSVlZGksJWVzaQorCXZwc2xsZAkkMiwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWJwCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTQwKCVlc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVzaQorCXZwb3IJJXhtbTAsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlZGksJWVkaQorCXZtb3ZkcWEJOTYoJWVzcCksJXhtbTAKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTQ0KCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVicAorCXhvcmwJJWVheCwlZWRpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJbW92bAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVicAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBhbGlnbnIJJDgsJXhtbTUsJXhtbTYsJXhtbTEKKwl2cHhvcgkleG1tMywleG1tNywleG1tNworCWFkZGwJNDgoJWVzcCksJWVheAorCWFuZGwJJWVkeCwlZXNpCisJeG9ybAklZWRpLCVlZHgKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwl2cHhvcgkleG1tMCwleG1tNywleG1tNworCXZtb3ZkcWEJJXhtbTMsOTYoJWVzcCkKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJJWVkeCwlZXNpCisJdm1vdmRxYQkxNDQoJWVzcCksJXhtbTMKKwl2cGFkZGQJJXhtbTYsJXhtbTIsJXhtbTIKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXZweG9yCSV4bW0xLCV4bW03LCV4bW03CisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk1MiglZXNwKSwlZWRpCisJdnBzcmxkCSQzMCwleG1tNywleG1tMQorCXZtb3ZkcWEJJXhtbTIsMzIoJWVzcCkKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJbW92bAklZWF4LCVlc2kKKwl2cHNsbGQJJDIsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJWVicAorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk1NiglZXNwKSwlZWR4CisJYW5kbAklZWJ4LCVlc2kKKwl2cG9yCSV4bW0xLCV4bW03LCV4bW03CisJeG9ybAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwl2bW92ZHFhCTY0KCVlc3ApLCV4bW0xCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAk2MCglZXNwKSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwl4b3JsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlZGksJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXZwYWxpZ25yCSQ4LCV4bW02LCV4bW03LCV4bW0yCisJdnB4b3IJJXhtbTQsJXhtbTAsJXhtbTAKKwlhZGRsCSglZXNwKSwlZWJ4CisJYW5kbAklZWRpLCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXZweG9yCSV4bW0xLCV4bW0wLCV4bW0wCisJdm1vdmRxYQkleG1tNCw2NCglZXNwKQorCW1vdmwJJWVjeCwlZWJwCisJeG9ybAklZWRpLCVlc2kKKwl2bW92ZHFhCSV4bW0zLCV4bW00CisJdnBhZGRkCSV4bW03LCV4bW0zLCV4bW0zCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl2cHhvcgkleG1tMiwleG1tMCwleG1tMAorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAklZWRpLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNCglZXNwKSwlZWF4CisJdnBzcmxkCSQzMCwleG1tMCwleG1tMgorCXZtb3ZkcWEJJXhtbTMsNDgoJWVzcCkKKwlhbmRsCSVlZHgsJWVicAorCXhvcmwJJWVkaSwlZWR4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl2cHNsbGQJJDIsJXhtbTAsJXhtbTAKKwl4b3JsCSVlZHgsJWVicAorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk4KCVlc3ApLCVlZGkKKwlhbmRsCSVlY3gsJWVzaQorCXZwb3IJJXhtbTIsJXhtbTAsJXhtbTAKKwl4b3JsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlYngsJWVieAorCXZtb3ZkcWEJODAoJWVzcCksJXhtbTIKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVheCwlZWF4CisJbW92bAklZWRpLCVlc2kKKwl4b3JsCSVlYngsJWVicAorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJdnBhbGlnbnIJJDgsJXhtbTcsJXhtbTAsJXhtbTMKKwl2cHhvcgkleG1tNSwleG1tMSwleG1tMQorCWFkZGwJMTYoJWVzcCksJWVjeAorCWFuZGwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZtb3ZkcWEJJXhtbTUsODAoJWVzcCkKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJJWVheCwlZXNpCisJdm1vdmRxYQkleG1tNCwleG1tNQorCXZwYWRkZAkleG1tMCwleG1tNCwleG1tNAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTIwKCVlc3ApLCVlYngKKwl2cHNybGQJJDMwLCV4bW0xLCV4bW0zCisJdm1vdmRxYQkleG1tNCwoJWVzcCkKKwlhbmRsCSVlZGksJWVicAorCXhvcmwJJWVheCwlZWRpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJbW92bAklZWN4LCVlc2kKKwl2cHNsbGQJJDIsJXhtbTEsJXhtbTEKKwl4b3JsCSVlZGksJWVicAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWF4CisJYW5kbAklZWR4LCVlc2kKKwl2cG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJeG9ybAklZWRpLCVlZHgKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwl2bW92ZHFhCTk2KCVlc3ApLCV4bW0zCisJbW92bAklZWJ4LCVlYnAKKwl4b3JsCSVlZHgsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkyOCglZXNwKSwlZWRpCisJYW5kbAklZWN4LCVlYnAKKwl4b3JsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlYngsJWVieAorCW1vdmwJJWVheCwlZXNpCisJeG9ybAklZWN4LCVlYnAKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkaQorCXhvcmwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTYsJXhtbTIsJXhtbTIKKwlhZGRsCTMyKCVlc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVheCwlZWF4CisJdnB4b3IJJXhtbTMsJXhtbTIsJXhtbTIKKwl2bW92ZHFhCSV4bW02LDk2KCVlc3ApCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXZtb3ZkcWEJJXhtbTUsJXhtbTYKKwl2cGFkZGQJJXhtbTEsJXhtbTUsJXhtbTUKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwlhZGRsCSVlc2ksJWVkeAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAkzNiglZXNwKSwlZWN4CisJdnBzcmxkCSQzMCwleG1tMiwleG1tNAorCXZtb3ZkcWEJJXhtbTUsMTYoJWVzcCkKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJJWVieCwlZWF4CisJc2hyZGwJJDcsJWVkaSwlZWRpCisJbW92bAklZWR4LCVlc2kKKwl2cHNsbGQJJDIsJXhtbTIsJXhtbTIKKwl4b3JsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk0MCglZXNwKSwlZWJ4CisJYW5kbAklZWRpLCVlc2kKKwl2cG9yCSV4bW00LCV4bW0yLCV4bW0yCisJeG9ybAklZWF4LCVlZGkKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwl2bW92ZHFhCTY0KCVlc3ApLCV4bW00CisJbW92bAklZWN4LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0NCglZXNwKSwlZWF4CisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCSVlZGksJWVkeAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJYWRkbAklZWJ4LCVlYXgKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tNQorCXZweG9yCSV4bW03LCV4bW0zLCV4bW0zCisJYWRkbAk0OCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdm1vdmRxYQkleG1tNyw2NCglZXNwKQorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl2bW92ZHFhCSV4bW02LCV4bW03CisJdnBhZGRkCSV4bW0yLCV4bW02LCV4bW02CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwl2cHhvcgkleG1tNSwleG1tMywleG1tMworCWFkZGwJNTIoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwl2cHNybGQJJDMwLCV4bW0zLCV4bW01CisJdm1vdmRxYQkleG1tNiwzMiglZXNwKQorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXZwc2xsZAkkMiwleG1tMywleG1tMworCWFkZGwJNTYoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlYnAKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwl2cG9yCSV4bW01LCV4bW0zLCV4bW0zCisJYWRkbAk2MCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJKCVlc3ApLCVlYXgKKwl2cGFkZGQJJXhtbTMsJXhtbTcsJXhtbTcKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWJwCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl2bW92ZHFhCSV4bW03LDQ4KCVlc3ApCisJeG9ybAklZWR4LCVlYnAKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJOCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJMTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwltb3ZsCTE5NiglZXNwKSwlZWJwCisJY21wbAkyMDAoJWVzcCksJWVicAorCWplCS5MMDA4ZG9uZQorCXZtb3ZkcWEJMTYwKCVlc3ApLCV4bW03CisJdm1vdmRxYQkxNzYoJWVzcCksJXhtbTYKKwl2bW92ZHF1CSglZWJwKSwleG1tMAorCXZtb3ZkcXUJMTYoJWVicCksJXhtbTEKKwl2bW92ZHF1CTMyKCVlYnApLCV4bW0yCisJdm1vdmRxdQk0OCglZWJwKSwleG1tMworCWFkZGwJJDY0LCVlYnAKKwl2cHNodWZiCSV4bW02LCV4bW0wLCV4bW0wCisJbW92bAklZWJwLDE5NiglZXNwKQorCXZtb3ZkcWEJJXhtbTcsOTYoJWVzcCkKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXZwc2h1ZmIJJXhtbTYsJXhtbTEsJXhtbTEKKwltb3ZsCSVlY3gsJWVicAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZwYWRkZAkleG1tNywleG1tMCwleG1tNAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZtb3ZkcWEJJXhtbTQsKCVlc3ApCisJYWRkbAkyMCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlYnAKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlc2ksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCW1vdmwJJWVkaSwlZXNpCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAkzMiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwl2cHNodWZiCSV4bW02LCV4bW0yLCV4bW0yCisJbW92bAklZWR4LCVlYnAKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cGFkZGQJJXhtbTcsJXhtbTEsJXhtbTUKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwl2bW92ZHFhCSV4bW01LDE2KCVlc3ApCisJYWRkbAkzNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwl2cHNodWZiCSV4bW02LCV4bW0zLCV4bW0zCisJbW92bAklZWRpLCVlYnAKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwl2cGFkZGQJJXhtbTcsJXhtbTIsJXhtbTYKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwl2bW92ZHFhCSV4bW02LDMyKCVlc3ApCisJYWRkbAk1MiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTYwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCW1vdmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCW1vdmwJMTkyKCVlc3ApLCVlYnAKKwlhZGRsCSglZWJwKSwlZWF4CisJYWRkbAk0KCVlYnApLCVlc2kKKwlhZGRsCTgoJWVicCksJWVjeAorCW1vdmwJJWVheCwoJWVicCkKKwlhZGRsCTEyKCVlYnApLCVlZHgKKwltb3ZsCSVlc2ksNCglZWJwKQorCWFkZGwJMTYoJWVicCksJWVkaQorCW1vdmwJJWVjeCwlZWJ4CisJbW92bAklZWN4LDgoJWVicCkKKwl4b3JsCSVlZHgsJWVieAorCW1vdmwJJWVkeCwxMiglZWJwKQorCW1vdmwJJWVkaSwxNiglZWJwKQorCW1vdmwJJWVzaSwlZWJwCisJYW5kbAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVieAorCWptcAkuTDAwN2xvb3AKKy5hbGlnbgkxNgorLkwwMDhkb25lOgorCWFkZGwJMTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCW1vdmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMjgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXNocmRsCSQ3LCVlZGksJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkzNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2emVyb2FsbAorCW1vdmwJMTkyKCVlc3ApLCVlYnAKKwlhZGRsCSglZWJwKSwlZWF4CisJbW92bAkyMDQoJWVzcCksJWVzcAorCWFkZGwJNCglZWJwKSwlZXNpCisJYWRkbAk4KCVlYnApLCVlY3gKKwltb3ZsCSVlYXgsKCVlYnApCisJYWRkbAkxMiglZWJwKSwlZWR4CisJbW92bAklZXNpLDQoJWVicCkKKwlhZGRsCTE2KCVlYnApLCVlZGkKKwltb3ZsCSVlY3gsOCglZWJwKQorCW1vdmwJJWVkeCwxMiglZWJwKQorCW1vdmwJJWVkaSwxNiglZWJwKQorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngsLi1fc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eAorLmFsaWduCTY0CisuTEtfWFhfWFg6CisubG9uZwkxNTE4NTAwMjQ5LDE1MTg1MDAyNDksMTUxODUwMDI0OSwxNTE4NTAwMjQ5CisubG9uZwkxODU5Nzc1MzkzLDE4NTk3NzUzOTMsMTg1OTc3NTM5MywxODU5Nzc1MzkzCisubG9uZwkyNDAwOTU5NzA4LDI0MDA5NTk3MDgsMjQwMDk1OTcwOCwyNDAwOTU5NzA4CisubG9uZwkzMzk1NDY5NzgyLDMzOTU0Njk3ODIsMzM5NTQ2OTc4MiwzMzk1NDY5NzgyCisubG9uZwk2NjA1MSw2NzQzODA4NywxMzQ4MTAxMjMsMjAyMTgyMTU5CisuYnl0ZQkxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSwwCisuYnl0ZQk4Myw3Miw2NSw0OSwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3LDExMCwxMTUKKy5ieXRlCTEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsNDQsMzIsNjcsODIKKy5ieXRlCTg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyCisuYnl0ZQkxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni01ODYuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni01ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQ3NThmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LTU4Ni5TCkBAIC0wLDAgKzEsNTU2MCBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisuaGlkZGVuCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcixAZnVuY3Rpb24KKy5hbGlnbgkxNgorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CisuTF9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAkyOCglZXNwKSwlZWF4CisJbW92bAklZXNwLCVlYngKKwljYWxsCS5MMDAwcGljX3BvaW50CisuTDAwMHBpY19wb2ludDoKKwlwb3BsCSVlYnAKKwlsZWFsCS5MMDAxSzI1Ni0uTDAwMHBpY19wb2ludCglZWJwKSwlZWJwCisJc3VibAkkMTYsJWVzcAorCWFuZGwJJC02NCwlZXNwCisJc2hsbAkkNiwlZWF4CisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSVlc2ksKCVlc3ApCisJbW92bAklZWRpLDQoJWVzcCkKKwltb3ZsCSVlYXgsOCglZXNwKQorCW1vdmwJJWVieCwxMiglZXNwKQorCWxlYWwJT1BFTlNTTF9pYTMyY2FwX1AtLkwwMDFLMjU2KCVlYnApLCVlZHgKKwltb3ZsCSglZWR4KSwlZWN4CisJbW92bAk0KCVlZHgpLCVlYngKKwl0ZXN0bAkkMTA0ODU3NiwlZWN4CisJam56CS5MMDAybG9vcAorCW1vdmwJOCglZWR4KSwlZWR4CisJdGVzdGwJJDE2Nzc3MjE2LCVlY3gKKwlqegkuTDAwM25vX3htbQorCWFuZGwJJDEwNzM3NDE4MjQsJWVjeAorCWFuZGwJJDI2ODQzNTk2OCwlZWJ4CisJb3JsCSVlYngsJWVjeAorCWFuZGwJJDEzNDIxNzcyODAsJWVjeAorCWNtcGwJJDEzNDIxNzcyODAsJWVjeAorCWplCS5MMDA0QVZYCisJdGVzdGwJJDUxMiwlZWJ4CisJam56CS5MMDA1U1NTRTMKKy5MMDAzbm9feG1tOgorCXN1YmwJJWVkaSwlZWF4CisJY21wbAkkMjU2LCVlYXgKKwlqYWUJLkwwMDZ1bnJvbGxlZAorCWptcAkuTDAwMmxvb3AKKy5hbGlnbgkxNgorLkwwMDJsb29wOgorCW1vdmwJKCVlZGkpLCVlYXgKKwltb3ZsCTQoJWVkaSksJWVieAorCW1vdmwJOCglZWRpKSwlZWN4CisJYnN3YXAJJWVheAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWJzd2FwCSVlYngKKwlwdXNobAklZWF4CisJYnN3YXAJJWVjeAorCXB1c2hsCSVlYngKKwlic3dhcAklZWR4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwltb3ZsCTE2KCVlZGkpLCVlYXgKKwltb3ZsCTIwKCVlZGkpLCVlYngKKwltb3ZsCTI0KCVlZGkpLCVlY3gKKwlic3dhcAklZWF4CisJbW92bAkyOCglZWRpKSwlZWR4CisJYnN3YXAJJWVieAorCXB1c2hsCSVlYXgKKwlic3dhcAklZWN4CisJcHVzaGwJJWVieAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCW1vdmwJMzIoJWVkaSksJWVheAorCW1vdmwJMzYoJWVkaSksJWVieAorCW1vdmwJNDAoJWVkaSksJWVjeAorCWJzd2FwCSVlYXgKKwltb3ZsCTQ0KCVlZGkpLCVlZHgKKwlic3dhcAklZWJ4CisJcHVzaGwJJWVheAorCWJzd2FwCSVlY3gKKwlwdXNobAklZWJ4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJbW92bAk0OCglZWRpKSwlZWF4CisJbW92bAk1MiglZWRpKSwlZWJ4CisJbW92bAk1NiglZWRpKSwlZWN4CisJYnN3YXAJJWVheAorCW1vdmwJNjAoJWVkaSksJWVkeAorCWJzd2FwCSVlYngKKwlwdXNobAklZWF4CisJYnN3YXAJJWVjeAorCXB1c2hsCSVlYngKKwlic3dhcAklZWR4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwlhZGRsCSQ2NCwlZWRpCisJbGVhbAktMzYoJWVzcCksJWVzcAorCW1vdmwJJWVkaSwxMDQoJWVzcCkKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkaQorCW1vdmwJJWVieCw4KCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCSVlZGksMTYoJWVzcCkKKwltb3ZsCSVlYngsKCVlc3ApCisJbW92bAkxNiglZXNpKSwlZWR4CisJbW92bAkyMCglZXNpKSwlZWJ4CisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAkyOCglZXNpKSwlZWRpCisJbW92bAklZWJ4LDI0KCVlc3ApCisJbW92bAklZWN4LDI4KCVlc3ApCisJbW92bAklZWRpLDMyKCVlc3ApCisuYWxpZ24JMTYKKy5MMDA3MDBfMTU6CisJbW92bAklZWR4LCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWN4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJOTYoJWVzcCksJWVieAorCXJvcmwJJDUsJWVjeAorCWFuZGwJJWVkeCwlZXNpCisJbW92bAklZWR4LDIwKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsNCglZXNwKQorCWxlYWwJLTQoJWVzcCksJWVzcAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSglZWJwKSwlZXNpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCTIwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJbW92bAklZWF4LCglZXNwKQorCWFkZGwJJWVieCwlZWR4CisJYW5kbAk0KCVlc3ApLCVlYXgKKwlhZGRsCSVlY3gsJWVieAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkkNCwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwljbXBsCSQzMjQ4MjIyNTgwLCVlc2kKKwlqbmUJLkwwMDcwMF8xNQorCW1vdmwJMTU2KCVlc3ApLCVlY3gKKwlqbXAJLkwwMDgxNl82MworLmFsaWduCTE2CisuTDAwODE2XzYzOgorCW1vdmwJJWVjeCwlZWJ4CisJbW92bAkxMDQoJWVzcCksJWVzaQorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTE2MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMTI0KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVieCw5NiglZXNwKQorCXJvcmwJJDUsJWVjeAorCWFuZGwJJWVkeCwlZXNpCisJbW92bAklZWR4LDIwKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsNCglZXNwKQorCWxlYWwJLTQoJWVzcCksJWVzcAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSglZWJwKSwlZXNpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCTIwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJbW92bAklZWF4LCglZXNwKQorCWFkZGwJJWVieCwlZWR4CisJYW5kbAk0KCVlc3ApLCVlYXgKKwlhZGRsCSVlY3gsJWVieAorCXhvcmwJJWVkaSwlZWF4CisJbW92bAkxNTYoJWVzcCksJWVjeAorCWFkZGwJJDQsJWVicAorCWFkZGwJJWVieCwlZWF4CisJY21wbAkkMzMyOTMyNTI5OCwlZXNpCisJam5lCS5MMDA4MTZfNjMKKwltb3ZsCTM1NiglZXNwKSwlZXNpCisJbW92bAk4KCVlc3ApLCVlYngKKwltb3ZsCTE2KCVlc3ApLCVlY3gKKwlhZGRsCSglZXNpKSwlZWF4CisJYWRkbAk0KCVlc2kpLCVlYngKKwlhZGRsCTgoJWVzaSksJWVkaQorCWFkZGwJMTIoJWVzaSksJWVjeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVkaSw4KCVlc2kpCisJbW92bAklZWN4LDEyKCVlc2kpCisJbW92bAkyNCglZXNwKSwlZWF4CisJbW92bAkyOCglZXNwKSwlZWJ4CisJbW92bAkzMiglZXNwKSwlZWN4CisJbW92bAkzNjAoJWVzcCksJWVkaQorCWFkZGwJMTYoJWVzaSksJWVkeAorCWFkZGwJMjAoJWVzaSksJWVheAorCWFkZGwJMjQoJWVzaSksJWVieAorCWFkZGwJMjgoJWVzaSksJWVjeAorCW1vdmwJJWVkeCwxNiglZXNpKQorCW1vdmwJJWVheCwyMCglZXNpKQorCW1vdmwJJWVieCwyNCglZXNpKQorCW1vdmwJJWVjeCwyOCglZXNpKQorCWxlYWwJMzU2KCVlc3ApLCVlc3AKKwlzdWJsCSQyNTYsJWVicAorCWNtcGwJOCglZXNwKSwlZWRpCisJamIJLkwwMDJsb29wCisJbW92bAkxMiglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuYWxpZ24JNjQKKy5MMDAxSzI1NjoKKy5sb25nCTExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OAorLmxvbmcJNjYwNTEsNjc0MzgwODcsMTM0ODEwMTIzLDIwMjE4MjE1OQorLmJ5dGUJODMsNzIsNjUsNTAsNTMsNTQsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NworLmJ5dGUJMTEwLDExNSwxMDIsMTExLDExNCwxMDksMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDQ0LDMyCisuYnl0ZQk2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcKKy5ieXRlCTExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMKKy5ieXRlCTYyLDAKKy5hbGlnbgkxNgorLkwwMDZ1bnJvbGxlZDoKKwlsZWFsCS05NiglZXNwKSwlZXNwCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJwCisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlYngKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVjeCwlZWJwCisJbW92bAklZWN4LDgoJWVzcCkKKwltb3ZsCSVlYngsMTIoJWVzcCkKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKwltb3ZsCTIwKCVlc2kpLCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlc2kKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwltb3ZsCSVlc2ksMjgoJWVzcCkKKwlqbXAJLkwwMDlncmFuZF9sb29wCisuYWxpZ24JMTYKKy5MMDA5Z3JhbmRfbG9vcDoKKwltb3ZsCSglZWRpKSwlZWJ4CisJbW92bAk0KCVlZGkpLCVlY3gKKwlic3dhcAklZWJ4CisJbW92bAk4KCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDMyKCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCwzNiglZXNwKQorCW1vdmwJJWVzaSw0MCglZXNwKQorCW1vdmwJMTIoJWVkaSksJWVieAorCW1vdmwJMTYoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTIwKCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDQ0KCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw0OCglZXNwKQorCW1vdmwJJWVzaSw1MiglZXNwKQorCW1vdmwJMjQoJWVkaSksJWVieAorCW1vdmwJMjgoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTMyKCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDU2KCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw2MCglZXNwKQorCW1vdmwJJWVzaSw2NCglZXNwKQorCW1vdmwJMzYoJWVkaSksJWVieAorCW1vdmwJNDAoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTQ0KCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDY4KCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw3MiglZXNwKQorCW1vdmwJJWVzaSw3NiglZXNwKQorCW1vdmwJNDgoJWVkaSksJWVieAorCW1vdmwJNTIoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTU2KCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDgwKCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw4NCglZXNwKQorCW1vdmwJJWVzaSw4OCglZXNwKQorCW1vdmwJNjAoJWVkaSksJWVieAorCWFkZGwJJDY0LCVlZGkKKwlic3dhcAklZWJ4CisJbW92bAklZWRpLDEwMCglZXNwKQorCW1vdmwJJWVieCw5MiglZXNwKQorCW1vdmwJJWVkeCwlZWN4CisJbW92bAkyMCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkzMiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxMTE2MzUyNDA4KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJMzYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTE4OTk0NDc0NDEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAklZWR4LCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQwKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjAoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMzA0OTMyMzQ3MSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCW1vdmwJOCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAk0NCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTM5MjEwMDk1NzMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQ4KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk5NjE5ODcxNjMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJbW92bAkoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAk1MiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTE1MDg5NzA5OTMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJJWVkeCwlZWN4CisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJNTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJNCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTI0NTM2MzU3NDgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJbW92bAkyNCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAk2MCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyMCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCw0KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTI4NzA3NjMyMjEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJJWVkeCwlZWN4CisJbW92bAkyMCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk2NCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkzNjI0MzgxMDgwKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJNjgoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTMxMDU5ODQwMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJNzIoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk2MDcyMjUyNzgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJNzYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxNDI2ODgxOTg3KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAklZWR4LCVlY3gKKwltb3ZsCTQoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4MCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMTIoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMTkyNTA3ODM4OCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCSglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCTg0KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDI4KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTgoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMTIoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMjE2MjA3ODIwNiglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAklZWR4LCVlY3gKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4OCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMjYxNDg4ODEwMyglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCTkyKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDIwKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCSglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDQoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzI0ODIyMjU4MCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTM2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4OCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAkzMiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCwzMiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjgoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMzgzNTM5MDQwMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk5MiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAkzNiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNzIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCwzNiglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTQwMjIyMjQ3NzQoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk0NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNzYoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw0MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNjQzNDcwNzgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk0OCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAkzNiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk0NCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJODAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDQ0KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTYwNDgwNzYyOCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTUyKCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJNDAoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNDgoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTg0KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAk0KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDQ4KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMTIoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJNzcwMjU1OTgzKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNTYoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTQ0KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTUyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJKCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDUyKCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTEyNDkxNTAxMjIoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk2MCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJNDgoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNTYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTkyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDU2KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMTU1NTA4MTY5MiglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk1MiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk2MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMzIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw2MCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJKCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxOTk2MDY0OTg2KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNjgoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTY0KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAkzNiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDY0KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNTU0MjIwODgyKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNzIoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTYwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTY4KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDY4KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwxMiglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkyNCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMjgoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMjgyMTgzNDM0OSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTc2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTcyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMTIoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDcyKCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTIwKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTI5NTI5OTY4MDgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4MCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk2OCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk3NiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDc2KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTMyMTAzMTM2NzEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk4NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTcyKCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk1MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw4MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTMzMzY1NzE4OTEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4OCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJODQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsODQoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDI4KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTgoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMTIoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzU4NDUyODcxMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTkyKCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4MCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsODgoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTQoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxMTM5MjY5OTMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAkzMiglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJODQoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJOTIoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTY0KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkyNCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsOTIoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDIwKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCSglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDQoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzM4MjQxODk1KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJMzYoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTg4KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTMyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk2OCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDMyKCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk2NjYzMDcyMDUoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk0MCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJOTIoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJMzYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTcyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkxNiglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsMzYoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDEyKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTI0KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyOCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAk3NzM1Mjk5MTIoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk0NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNzYoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw0MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxMjk0NzU3MzcyKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNDgoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJMzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNDQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk4KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw0NCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxMzk2MTgyMjkxKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNTIoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk0MCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk0OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJODQoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTQoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsNDgoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxNjk1MTgzNzAwKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNTYoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTQ0KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTUyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJKCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDUyKCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTE5ODY2NjEwNTEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk2MCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJNDgoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNTYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTkyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDU2KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMjE3NzAyNjM1MCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk1MiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk2MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMzIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw2MCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJKCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkyNDU2OTU2MDM3KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNjgoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTY0KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAkzNiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDY0KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNzMwNDg1OTIxKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNzIoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTYwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTY4KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDY4KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwxMiglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkyNCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMjgoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMjgyMDMwMjQxMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTc2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTcyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMTIoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDcyKCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTIwKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTMyNTk3MzA4MDAoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4MCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk2OCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk3NiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDc2KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTMzNDU3NjQ3NzEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk4NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTcyKCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk1MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw4MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTM1MTYwNjU4MTcoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4OCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJODQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsODQoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDI4KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTgoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMTIoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzYwMDM1MjgwNCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTkyKCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4MCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsODgoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTQoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk0MDk0NTcxOTA5KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJMzIoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyMCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTg0KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTkyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk2NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMjQoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDkyKCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyMCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCw0KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTI3NTQyMzM0NCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTM2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4OCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAkzMiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCwzMiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjgoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJNDMwMjI3NzM0KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNDAoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTkyKCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTM2KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk3MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDM2KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwxMiglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkyNCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMjgoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJNTA2OTQ4NjE2KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNDQoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJMzIoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNDAoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTc2KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkxMiglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsNDAoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjAoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJNjU5MDYwNTU2KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNDgoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJMzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNDQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk4KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw0NCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAk4ODM5OTc4NzcoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk1MiglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTQ4KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk4NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw0OCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTk1ODEzOTU3MSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk0NCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk1MiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJODgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw1MiglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjgoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJOCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwxMiglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxMzIyODIyMjE4KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNjAoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTQ4KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk5MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw1NiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJNCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTE1MzcwMDIwNjMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk2NCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNTIoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNjAoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTMyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkyNCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsNjAoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDIwKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCSglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDQoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMTc0Nzg3Mzc3OSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTY4KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk1NiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk2NCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMzYoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw2NCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjgoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMTk1NTU2MjIyMiglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTcyKCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk2MCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk2OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw2OCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTIwMjQxMDQ4MTUoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk3NiglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk2NCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk3MiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDQoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw3MiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyMjI3NzMwNDUyKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJODAoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNjgoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNzYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTQ4KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk4KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw3NiglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkyMzYxODUyNDI0KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJODQoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk3MiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk4MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNTIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTQoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsODAoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNDI4NDM2NDc0KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJODgoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTc2KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTg0KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk1NiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJKCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDg0KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTI3NTY3MzQxODcoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk5MiglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJODAoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJODgoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTYwKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMzIwNDAzMTQ3OSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk4NCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk5MiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjQoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJKCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkzMzI5MzI1Mjk4KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTk2KCVlc3ApLCVlc2kKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJMTIoJWVzcCksJWVjeAorCWFkZGwJKCVlc2kpLCVlYXgKKwlhZGRsCTQoJWVzaSksJWVicAorCWFkZGwJOCglZXNpKSwlZWRpCisJYWRkbAkxMiglZXNpKSwlZWN4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVicCw0KCVlc2kpCisJbW92bAklZWRpLDgoJWVzaSkKKwltb3ZsCSVlY3gsMTIoJWVzaSkKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJbW92bAklZWRpLDgoJWVzcCkKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlY3gKKwlhZGRsCTE2KCVlc2kpLCVlZHgKKwlhZGRsCTIwKCVlc2kpLCVlZGkKKwlhZGRsCTI0KCVlc2kpLCVlYngKKwlhZGRsCTI4KCVlc2kpLCVlY3gKKwltb3ZsCSVlZHgsMTYoJWVzaSkKKwltb3ZsCSVlZGksMjAoJWVzaSkKKwltb3ZsCSVlYngsMjQoJWVzaSkKKwltb3ZsCSVlY3gsMjgoJWVzaSkKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwltb3ZsCTEwMCglZXNwKSwlZWRpCisJbW92bAklZWJ4LDI0KCVlc3ApCisJbW92bAklZWN4LDI4KCVlc3ApCisJY21wbAkxMDQoJWVzcCksJWVkaQorCWpiCS5MMDA5Z3JhbmRfbG9vcAorCW1vdmwJMTA4KCVlc3ApLCVlc3AKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgkzMgorLkwwMDVTU1NFMzoKKwlsZWFsCS05NiglZXNwKSwlZXNwCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZGkKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVjeCwlZWJ4CisJbW92bAklZWN4LDgoJWVzcCkKKwltb3ZsCSVlZGksMTIoJWVzcCkKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKwltb3ZsCTIwKCVlc2kpLCVlZGkKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlc2kKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwltb3ZsCTEwMCglZXNwKSwlZWRpCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZXNpLDI4KCVlc3ApCisJbW92ZHFhCTI1NiglZWJwKSwleG1tNworCWptcAkuTDAxMGdyYW5kX3Nzc2UzCisuYWxpZ24JMTYKKy5MMDEwZ3JhbmRfc3NzZTM6CisJbW92ZHF1CSglZWRpKSwleG1tMAorCW1vdmRxdQkxNiglZWRpKSwleG1tMQorCW1vdmRxdQkzMiglZWRpKSwleG1tMgorCW1vdmRxdQk0OCglZWRpKSwleG1tMworCWFkZGwJJDY0LCVlZGkKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OQorCW1vdmwJJWVkaSwxMDAoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNworCW1vdmRxYQkoJWVicCksJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorCW1vdmRxYQkxNiglZWJwKSwleG1tNQorCXBhZGRkCSV4bW0wLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKwltb3ZkcWEJMzIoJWVicCksJXhtbTYKKwlwYWRkZAkleG1tMSwleG1tNQorCW1vdmRxYQk0OCglZWJwKSwleG1tNworCW1vdmRxYQkleG1tNCwzMiglZXNwKQorCXBhZGRkCSV4bW0yLCV4bW02CisJbW92ZHFhCSV4bW01LDQ4KCVlc3ApCisJcGFkZGQJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTYsNjQoJWVzcCkKKwltb3ZkcWEJJXhtbTcsODAoJWVzcCkKKwlqbXAJLkwwMTFzc3NlM18wMF80NworLmFsaWduCTE2CisuTDAxMXNzc2UzXzAwXzQ3OgorCWFkZGwJJDY0LCVlYnAKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmRxYQkleG1tMSwleG1tNAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZkcWEJJXhtbTMsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNCw0CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1MCw0CisJbW92bAklZWN4LDE2KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmRxYQkleG1tNCwleG1tNQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXBzcmxkCSQzLCV4bW00CisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNywleG1tMAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXBzcmxkCSQ3LCV4bW02CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwlwc2h1ZmQJJDI1MCwleG1tMywleG1tNworCXhvcmwJJWVzaSwlZWN4CisJYWRkbAkzMiglZXNwKSwlZWR4CisJcHNsbGQJJDE0LCV4bW01CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlwc3JsZAkkMTEsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCXBzbGxkCSQxMSwleG1tNQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJcHhvcgkleG1tNiwleG1tNAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJcHNybGQJJDEwLCV4bW03CisJbW92bAkoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTQsJXhtbTAKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXBzcmxxCSQxNywleG1tNgorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJcHNybHEJJDIsJXhtbTYKKwlhZGRsCTM2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCXBzcmxkcQkkOCwleG1tNworCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXBhZGRkCSV4bW03LCV4bW0wCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJcHNodWZkCSQ4MCwleG1tMCwleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJcHNybGQJJDEwLCV4bW03CisJYW5kbAklZWF4LCVlYngKKwlwc3JscQkkMTcsJXhtbTYKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNDAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJcHhvcgkleG1tNiwleG1tNworCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlwc3JscQkkMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwlwc2h1ZmQJJDgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCW1vdmRxYQkoJWVicCksJXhtbTYKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw0KCVlc3ApCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCXBhZGRkCSV4bW03LCV4bW0wCisJbW92bAklZWJ4LDIwKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMTYoJWVzcCksJWVkeAorCXBhZGRkCSV4bW0wLCV4bW02CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTQ0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92ZHFhCSV4bW02LDMyKCVlc3ApCisJbW92bAklZWR4LCVlY3gKKwltb3ZkcWEJJXhtbTIsJXhtbTQKKwlyb3JsCSQxNCwlZWR4CisJbW92bAk0KCVlc3ApLCVlc2kKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI1LDQKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjUxLDQKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmRxYQkleG1tNCwleG1tNQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlwc3JsZAkkMywleG1tNAorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTcsJXhtbTEKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXBzcmxkCSQ3LCV4bW02CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwlwc2h1ZmQJJDI1MCwleG1tMCwleG1tNworCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk0OCglZXNwKSwlZWR4CisJcHNsbGQJJDE0LCV4bW01CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlwc3JsZAkkMTEsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwlwc2xsZAkkMTEsJXhtbTUKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJcHhvcgkleG1tNiwleG1tNAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI4KCVlc3ApCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJcHNybGQJJDEwLCV4bW03CisJbW92bAkxNiglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNCwleG1tMQorCW1vdmwJJWVieCwxMiglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJcHNybHEJJDE3LCV4bW02CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTgoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlweG9yCSV4bW02LCV4bW03CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCXBzcmxxCSQyLCV4bW02CisJYWRkbAk1MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW03CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlwc2h1ZmQJJDEyOCwleG1tNywleG1tNworCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCXBzcmxkcQkkOCwleG1tNworCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlwYWRkZAkleG1tNywleG1tMQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJcHNodWZkCSQ4MCwleG1tMSwleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTQoJWVzcCksJWVkeAorCW1vdmRxYQkleG1tNywleG1tNgorCXJvcmwJJDExLCVlY3gKKwlwc3JsZAkkMTAsJXhtbTcKKwlhbmRsCSVlYXgsJWVieAorCXBzcmxxCSQxNywleG1tNgorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk1NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW03CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlwc3JscQkkMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJcHNodWZkCSQ4LCV4bW03LCV4bW03CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwltb3ZkcWEJMTYoJWVicCksJXhtbTYKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyMCglZXNwKQorCXBzbGxkcQkkOCwleG1tNworCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCXBhZGRkCSV4bW03LCV4bW0xCisJbW92bAklZWJ4LDQoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkoJWVzcCksJWVkeAorCXBhZGRkCSV4bW0xLCV4bW02CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTYwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZkcWEJJXhtbTYsNDgoJWVzcCkKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmRxYQkleG1tMywleG1tNAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZkcWEJJXhtbTEsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNiw0CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0OCw0CisJbW92bAklZWN4LDE2KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmRxYQkleG1tNCwleG1tNQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXBzcmxkCSQzLCV4bW00CisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNywleG1tMgorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXBzcmxkCSQ3LCV4bW02CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwlwc2h1ZmQJJDI1MCwleG1tMSwleG1tNworCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk2NCglZXNwKSwlZWR4CisJcHNsbGQJJDE0LCV4bW01CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlwc3JsZAkkMTEsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCXBzbGxkCSQxMSwleG1tNQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJcHhvcgkleG1tNiwleG1tNAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJcHNybGQJJDEwLCV4bW03CisJbW92bAkoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTQsJXhtbTIKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXBzcmxxCSQxNywleG1tNgorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJcHNybHEJJDIsJXhtbTYKKwlhZGRsCTY4KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCXBzcmxkcQkkOCwleG1tNworCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXBhZGRkCSV4bW03LCV4bW0yCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJcHNodWZkCSQ4MCwleG1tMiwleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJcHNybGQJJDEwLCV4bW03CisJYW5kbAklZWF4LCVlYngKKwlwc3JscQkkMTcsJXhtbTYKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNzIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJcHhvcgkleG1tNiwleG1tNworCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlwc3JscQkkMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwlwc2h1ZmQJJDgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCW1vdmRxYQkzMiglZWJwKSwleG1tNgorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDQoJWVzcCkKKwlwc2xsZHEJJDgsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTcsJXhtbTIKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJcGFkZGQJJXhtbTIsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNzYoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZkcWEJJXhtbTYsNjQoJWVzcCkKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmRxYQkleG1tMCwleG1tNAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVzaQorCW1vdmRxYQkleG1tMiwleG1tNworCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjcsNAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDksNAorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJbW92ZHFhCSV4bW00LCV4bW01CisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXBzcmxkCSQzLCV4bW00CisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNywleG1tMworCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJcHNybGQJJDcsJXhtbTYKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMTIoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXBzaHVmZAkkMjUwLCV4bW0yLCV4bW03CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTgwKCVlc3ApLCVlZHgKKwlwc2xsZAkkMTQsJXhtbTUKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTQKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjgoJWVzcCksJWVkeAorCXBzcmxkCSQxMSwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCXBzbGxkCSQxMSwleG1tNQorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlweG9yCSV4bW02LCV4bW00CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjgoJWVzcCkKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwlwc3JsZAkkMTAsJXhtbTcKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCXBhZGRkCSV4bW00LCV4bW0zCisJbW92bAklZWJ4LDEyKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwlwc3JscQkkMTcsJXhtbTYKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJOCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJcHNybHEJJDIsJXhtbTYKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXBzaHVmZAkkMTI4LCV4bW03LCV4bW03CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJcHNybGRxCSQ4LCV4bW03CisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXBhZGRkCSV4bW03LCV4bW0zCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwlwc2h1ZmQJJDgwLCV4bW0zLCV4bW03CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJNCglZXNwKSwlZWR4CisJbW92ZHFhCSV4bW03LCV4bW02CisJcm9ybAkkMTEsJWVjeAorCXBzcmxkCSQxMCwleG1tNworCWFuZGwJJWVheCwlZWJ4CisJcHNybHEJJDE3LCV4bW02CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTg4KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjAoJWVzcCksJWVkeAorCXBzcmxxCSQyLCV4bW02CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlweG9yCSV4bW02LCV4bW03CisJbW92bAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwlwc2h1ZmQJJDgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCW1vdmRxYQk0OCglZWJwKSwleG1tNgorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDIwKCVlc3ApCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTcsJXhtbTMKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSglZXNwKSwlZWR4CisJcGFkZGQJJXhtbTMsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJOTIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmRxYQkleG1tNiw4MCglZXNwKQorCWNtcGwJJDY2MDUxLDY0KCVlYnApCisJam5lCS5MMDExc3NzZTNfMDBfNDcKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsKCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMjgoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAkzMiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTM2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNDAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAk4KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTQ0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAk0KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMTIoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVieCwxMiglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTgoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk1MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxMiglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTQoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk1NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDIwKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWJ4LDQoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk2MCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyMCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDE2KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNjQoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxMiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWJ4LDI4KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk2OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTcyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWJ4LDIwKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMTYoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk3NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJODAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYngsMTIoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJODQoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJODgoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyMCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJKCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJOTIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJOTYoJWVzcCksJWVzaQorCXhvcmwJJWVkaSwlZWJ4CisJbW92bAkxMiglZXNwKSwlZWN4CisJYWRkbAkoJWVzaSksJWVheAorCWFkZGwJNCglZXNpKSwlZWJ4CisJYWRkbAk4KCVlc2kpLCVlZGkKKwlhZGRsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlZGksOCglZXNpKQorCW1vdmwJJWVjeCwxMiglZXNpKQorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWRpLCVlYngKKwltb3ZsCSVlZGksOCglZXNwKQorCW1vdmwJJWVjeCwxMiglZXNwKQorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVjeAorCWFkZGwJMTYoJWVzaSksJWVkeAorCWFkZGwJMjAoJWVzaSksJWVkaQorCWFkZGwJMjQoJWVzaSksJWVjeAorCW1vdmwJJWVkeCwxNiglZXNpKQorCW1vdmwJJWVkaSwyMCglZXNpKQorCW1vdmwJJWVkaSwyMCglZXNwKQorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVjeCwyNCglZXNpKQorCWFkZGwJMjgoJWVzaSksJWVkaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCW1vdmwJJWVkaSwyOCglZXNpKQorCW1vdmwJJWVkaSwyOCglZXNwKQorCW1vdmwJMTAwKCVlc3ApLCVlZGkKKwltb3ZkcWEJNjQoJWVicCksJXhtbTcKKwlzdWJsCSQxOTIsJWVicAorCWNtcGwJMTA0KCVlc3ApLCVlZGkKKwlqYgkuTDAxMGdyYW5kX3Nzc2UzCisJbW92bAkxMDgoJWVzcCksJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTMyCisuTDAwNEFWWDoKKwlsZWFsCS05NiglZXNwKSwlZXNwCisJdnplcm9hbGwKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkaQorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwltb3ZsCSVlY3gsOCglZXNwKQorCW1vdmwJJWVkaSwxMiglZXNwKQorCW1vdmwJMTYoJWVzaSksJWVkeAorCW1vdmwJMjAoJWVzaSksJWVkaQorCW1vdmwJMjQoJWVzaSksJWVjeAorCW1vdmwJMjgoJWVzaSksJWVzaQorCW1vdmwJJWVkaSwyMCglZXNwKQorCW1vdmwJMTAwKCVlc3ApLCVlZGkKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwltb3ZsCSVlc2ksMjgoJWVzcCkKKwl2bW92ZHFhCTI1NiglZWJwKSwleG1tNworCWptcAkuTDAxMmdyYW5kX2F2eAorLmFsaWduCTMyCisuTDAxMmdyYW5kX2F2eDoKKwl2bW92ZHF1CSglZWRpKSwleG1tMAorCXZtb3ZkcXUJMTYoJWVkaSksJXhtbTEKKwl2bW92ZHF1CTMyKCVlZGkpLCV4bW0yCisJdm1vdmRxdQk0OCglZWRpKSwleG1tMworCWFkZGwJJDY0LCVlZGkKKwl2cHNodWZiCSV4bW03LCV4bW0wLCV4bW0wCisJbW92bAklZWRpLDEwMCglZXNwKQorCXZwc2h1ZmIJJXhtbTcsJXhtbTEsJXhtbTEKKwl2cHNodWZiCSV4bW03LCV4bW0yLCV4bW0yCisJdnBhZGRkCSglZWJwKSwleG1tMCwleG1tNAorCXZwc2h1ZmIJJXhtbTcsJXhtbTMsJXhtbTMKKwl2cGFkZGQJMTYoJWVicCksJXhtbTEsJXhtbTUKKwl2cGFkZGQJMzIoJWVicCksJXhtbTIsJXhtbTYKKwl2cGFkZGQJNDgoJWVicCksJXhtbTMsJXhtbTcKKwl2bW92ZHFhCSV4bW00LDMyKCVlc3ApCisJdm1vdmRxYQkleG1tNSw0OCglZXNwKQorCXZtb3ZkcWEJJXhtbTYsNjQoJWVzcCkKKwl2bW92ZHFhCSV4bW03LDgwKCVlc3ApCisJam1wCS5MMDEzYXZ4XzAwXzQ3CisuYWxpZ24JMTYKKy5MMDEzYXZ4XzAwXzQ3OgorCWFkZGwJJDY0LCVlYnAKKwl2cGFsaWducgkkNCwleG1tMCwleG1tMSwleG1tNAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjAoJWVzcCksJWVzaQorCXZwYWxpZ25yCSQ0LCV4bW0yLCV4bW0zLCV4bW03CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDE2KCVlc3ApCisJdnBhZGRkCSV4bW03LCV4bW0wLCV4bW0wCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCXZwc3JsZAkkMywleG1tNCwleG1tNworCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXZwc2xsZAkkMTQsJXhtbTQsJXhtbTUKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl2cHhvcgkleG1tNiwleG1tNywleG1tNAorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwl2cHNodWZkCSQyNTAsJXhtbTMsJXhtbTcKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXZwc3JsZAkkMTEsJXhtbTYsJXhtbTYKKwlhZGRsCTMyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwc2xsZAkkMTEsJXhtbTUsJXhtbTUKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybHEJJDE3LCV4bW03LCV4bW01CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl2cGFkZGQJJXhtbTQsJXhtbTAsJXhtbTAKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCwyOCglZXNwKQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXZwc3JscQkkMTksJXhtbTcsJXhtbTcKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAkzNiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNodWZkCSQxMzIsJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwl2cHNybGRxCSQ4LCV4bW03LCV4bW03CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkxMiglZXNwKSwlZXNpCisJdnBhZGRkCSV4bW03LCV4bW0wLCV4bW0wCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc2h1ZmQJJDgwLCV4bW0wLCV4bW03CisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxxCSQxNywleG1tNywleG1tNQorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl2cHhvcgkleG1tNSwleG1tNiwleG1tNgorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJdnBzcmxxCSQxOSwleG1tNywleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJdnBzaHVmZAkkMjMyLCV4bW02LCV4bW03CisJYWRkbAk0MCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNsbGRxCSQ4LCV4bW03LCV4bW03CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBhZGRkCSV4bW03LCV4bW0wLCV4bW0wCisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlc2kKKwl2cGFkZGQJKCVlYnApLCV4bW0wLCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDIwKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMTYoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk0NCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCXZtb3ZkcWEJJXhtbTYsMzIoJWVzcCkKKwl2cGFsaWducgkkNCwleG1tMSwleG1tMiwleG1tNAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJNCglZXNwKSwlZXNpCisJdnBhbGlnbnIJJDQsJXhtbTMsJXhtbTAsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNybGQJJDcsJXhtbTQsJXhtbTYKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl2cGFkZGQJJXhtbTcsJXhtbTEsJXhtbTEKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxkCSQzLCV4bW00LCV4bW03CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXZwc2xsZAkkMTQsJXhtbTQsJXhtbTUKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXZweG9yCSV4bW02LCV4bW03LCV4bW00CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMTIoJWVzcCksJWVkeAorCXZwc2h1ZmQJJDI1MCwleG1tMCwleG1tNworCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJdnBzcmxkCSQxMSwleG1tNiwleG1tNgorCWFkZGwJNDgoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBzbGxkCSQxMSwleG1tNSwleG1tNQorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJKCVlc3ApLCVlc2kKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyOCglZXNwKQorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTUKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJdnBhZGRkCSV4bW00LCV4bW0xLCV4bW0xCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMTIoJWVzcCkKKwl2cHhvcgkleG1tNSwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTgoJWVzcCksJWVkeAorCXZwc3JscQkkMTksJXhtbTcsJXhtbTcKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAk1MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNodWZkCSQxMzIsJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJdnBzcmxkcQkkOCwleG1tNywleG1tNworCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVzaQorCXZwYWRkZAkleG1tNywleG1tMSwleG1tMQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJdnBzaHVmZAkkODAsJXhtbTEsJXhtbTcKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxxCSQxNywleG1tNywleG1tNQorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl2cHhvcgkleG1tNSwleG1tNiwleG1tNgorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl2cHNybHEJJDE5LCV4bW03LCV4bW03CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJNCglZXNwKSwlZWR4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXZwc2h1ZmQJJDIzMiwleG1tNiwleG1tNworCWFkZGwJNTYoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJdnBzbGxkcQkkOCwleG1tNywleG1tNworCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cGFkZGQJJXhtbTcsJXhtbTEsJXhtbTEKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwl2cGFkZGQJMTYoJWVicCksJXhtbTEsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjAoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTYwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwl2bW92ZHFhCSV4bW02LDQ4KCVlc3ApCisJdnBhbGlnbnIJJDQsJXhtbTIsJXhtbTMsJXhtbTQKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwl2cGFsaWducgkkNCwleG1tMCwleG1tMSwleG1tNworCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNybGQJJDcsJXhtbTQsJXhtbTYKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXZwYWRkZAkleG1tNywleG1tMiwleG1tMgorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybGQJJDMsJXhtbTQsJXhtbTcKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl2cHNsbGQJJDE0LCV4bW00LCV4bW01CisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsKCVlc3ApCisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTQKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkyOCglZXNwKSwlZWR4CisJdnBzaHVmZAkkMjUwLCV4bW0xLCV4bW03CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwl2cHNybGQJJDExLCV4bW02LCV4bW02CisJYWRkbAk2NCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHNsbGQJJDExLCV4bW01LCV4bW01CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxxCSQxNywleG1tNywleG1tNQorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJdnBhZGRkCSV4bW00LCV4bW0yLCV4bW0yCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl2cHhvcgkleG1tNSwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwl2cHNybHEJJDE5LCV4bW03LCV4bW03CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCWFkZGwJNjgoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJdnBzaHVmZAkkMTMyLCV4bW02LCV4bW03CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJdnBzcmxkcQkkOCwleG1tNywleG1tNworCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXZwYWRkZAkleG1tNywleG1tMiwleG1tMgorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNodWZkCSQ4MCwleG1tMiwleG1tNworCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDgoJWVzcCkKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTUKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJdnB4b3IJJXhtbTUsJXhtbTYsJXhtbTYKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXZwc3JscQkkMTksJXhtbTcsJXhtbTcKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXZwc2h1ZmQJJDIzMiwleG1tNiwleG1tNworCWFkZGwJNzIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJdnBzbGxkcQkkOCwleG1tNywleG1tNworCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwYWRkZAkleG1tNywleG1tMiwleG1tMgorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJOCglZXNwKSwlZXNpCisJdnBhZGRkCTMyKCVlYnApLCV4bW0yLCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDIwKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMTYoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk3NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCXZtb3ZkcWEJJXhtbTYsNjQoJWVzcCkKKwl2cGFsaWducgkkNCwleG1tMywleG1tMCwleG1tNAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJNCglZXNwKSwlZXNpCisJdnBhbGlnbnIJJDQsJXhtbTEsJXhtbTIsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNybGQJJDcsJXhtbTQsJXhtbTYKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl2cGFkZGQJJXhtbTcsJXhtbTMsJXhtbTMKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxkCSQzLCV4bW00LCV4bW03CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXZwc2xsZAkkMTQsJXhtbTQsJXhtbTUKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXZweG9yCSV4bW02LCV4bW03LCV4bW00CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMTIoJWVzcCksJWVkeAorCXZwc2h1ZmQJJDI1MCwleG1tMiwleG1tNworCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJdnBzcmxkCSQxMSwleG1tNiwleG1tNgorCWFkZGwJODAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBzbGxkCSQxMSwleG1tNSwleG1tNQorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJKCVlc3ApLCVlc2kKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyOCglZXNwKQorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTUKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJdnBhZGRkCSV4bW00LCV4bW0zLCV4bW0zCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMTIoJWVzcCkKKwl2cHhvcgkleG1tNSwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTgoJWVzcCksJWVkeAorCXZwc3JscQkkMTksJXhtbTcsJXhtbTcKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAk4NCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNodWZkCSQxMzIsJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJdnBzcmxkcQkkOCwleG1tNywleG1tNworCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVzaQorCXZwYWRkZAkleG1tNywleG1tMywleG1tMworCXhvcmwJJWVjeCwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJdnBzaHVmZAkkODAsJXhtbTMsJXhtbTcKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxxCSQxNywleG1tNywleG1tNQorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl2cHhvcgkleG1tNSwleG1tNiwleG1tNgorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl2cHNybHEJJDE5LCV4bW03LCV4bW03CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJNCglZXNwKSwlZWR4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXZwc2h1ZmQJJDIzMiwleG1tNiwleG1tNworCWFkZGwJODgoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJdnBzbGxkcQkkOCwleG1tNywleG1tNworCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cGFkZGQJJXhtbTcsJXhtbTMsJXhtbTMKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwl2cGFkZGQJNDgoJWVicCksJXhtbTMsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjAoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTkyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwl2bW92ZHFhCSV4bW02LDgwKCVlc3ApCisJY21wbAkkNjYwNTEsNjQoJWVicCkKKwlqbmUJLkwwMTNhdnhfMDBfNDcKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsKCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMjgoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAkzMiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTM2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNDAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTQ0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMTIoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCwxMiglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTgoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk1MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxMiglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTQoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk1NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDIwKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDQoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk2MCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDE2KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNjQoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxMiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDI4KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk2OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTcyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDIwKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMTYoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk3NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJODAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMTIoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJODQoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJODgoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyMCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJKCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJOTIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJOTYoJWVzcCksJWVzaQorCXhvcmwJJWVkaSwlZWJ4CisJbW92bAkxMiglZXNwKSwlZWN4CisJYWRkbAkoJWVzaSksJWVheAorCWFkZGwJNCglZXNpKSwlZWJ4CisJYWRkbAk4KCVlc2kpLCVlZGkKKwlhZGRsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlZGksOCglZXNpKQorCW1vdmwJJWVjeCwxMiglZXNpKQorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWRpLCVlYngKKwltb3ZsCSVlZGksOCglZXNwKQorCW1vdmwJJWVjeCwxMiglZXNwKQorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVjeAorCWFkZGwJMTYoJWVzaSksJWVkeAorCWFkZGwJMjAoJWVzaSksJWVkaQorCWFkZGwJMjQoJWVzaSksJWVjeAorCW1vdmwJJWVkeCwxNiglZXNpKQorCW1vdmwJJWVkaSwyMCglZXNpKQorCW1vdmwJJWVkaSwyMCglZXNwKQorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVjeCwyNCglZXNpKQorCWFkZGwJMjgoJWVzaSksJWVkaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCW1vdmwJJWVkaSwyOCglZXNpKQorCW1vdmwJJWVkaSwyOCglZXNwKQorCW1vdmwJMTAwKCVlc3ApLCVlZGkKKwl2bW92ZHFhCTY0KCVlYnApLCV4bW03CisJc3VibAkkMTkyLCVlYnAKKwljbXBsCTEwNCglZXNwKSwlZWRpCisJamIJLkwwMTJncmFuZF9hdngKKwltb3ZsCTEwOCglZXNwKSwlZXNwCisJdnplcm9hbGwKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyLC4tLkxfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYmVnaW4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLTU4Ni5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLTU4Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTdjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItNTg2LlMKQEAgLTAsMCArMSwyODMwIEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisuZ2xvYmwJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKy5oaWRkZW4Jc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKy50eXBlCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyLEBmdW5jdGlvbgorLmFsaWduCTE2CitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcjoKKy5MX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCSVlc3AsJWVieAorCWNhbGwJLkwwMDBwaWNfcG9pbnQKKy5MMDAwcGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJLkwwMDFLNTEyLS5MMDAwcGljX3BvaW50KCVlYnApLCVlYnAKKwlzdWJsCSQxNiwlZXNwCisJYW5kbAkkLTY0LCVlc3AKKwlzaGxsCSQ3LCVlYXgKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJJWVzaSwoJWVzcCkKKwltb3ZsCSVlZGksNCglZXNwKQorCW1vdmwJJWVheCw4KCVlc3ApCisJbW92bAklZWJ4LDEyKCVlc3ApCisJbGVhbAlPUEVOU1NMX2lhMzJjYXBfUC0uTDAwMUs1MTIoJWVicCksJWVkeAorCW1vdmwJKCVlZHgpLCVlY3gKKwl0ZXN0bAkkNjcxMDg4NjQsJWVjeAorCWp6CS5MMDAybG9vcF94ODYKKwltb3ZsCTQoJWVkeCksJWVkeAorCW1vdnEJKCVlc2kpLCVtbTAKKwlhbmRsCSQxNjc3NzIxNiwlZWN4CisJbW92cQk4KCVlc2kpLCVtbTEKKwlhbmRsCSQ1MTIsJWVkeAorCW1vdnEJMTYoJWVzaSksJW1tMgorCW9ybAklZWR4LCVlY3gKKwltb3ZxCTI0KCVlc2kpLCVtbTMKKwltb3ZxCTMyKCVlc2kpLCVtbTQKKwltb3ZxCTQwKCVlc2kpLCVtbTUKKwltb3ZxCTQ4KCVlc2kpLCVtbTYKKwltb3ZxCTU2KCVlc2kpLCVtbTcKKwljbXBsCSQxNjc3NzcyOCwlZWN4CisJamUJLkwwMDNTU1NFMworCXN1YmwJJDgwLCVlc3AKKwlqbXAJLkwwMDRsb29wX3NzZTIKKy5hbGlnbgkxNgorLkwwMDRsb29wX3NzZTI6CisJbW92cQklbW0xLDgoJWVzcCkKKwltb3ZxCSVtbTIsMTYoJWVzcCkKKwltb3ZxCSVtbTMsMjQoJWVzcCkKKwltb3ZxCSVtbTUsNDAoJWVzcCkKKwltb3ZxCSVtbTYsNDgoJWVzcCkKKwlweG9yCSVtbTEsJW1tMgorCW1vdnEJJW1tNyw1NiglZXNwKQorCW1vdnEJJW1tMCwlbW0zCisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJNCglZWRpKSwlZWJ4CisJYWRkbAkkOCwlZWRpCisJbW92bAkkMTUsJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJam1wCS5MMDA1MDBfMTRfc3NlMgorLmFsaWduCTE2CisuTDAwNTAwXzE0X3NzZTI6CisJbW92ZAklZWF4LCVtbTEKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92ZAklZWJ4LCVtbTcKKwltb3ZsCTQoJWVkaSksJWVieAorCWFkZGwJJDgsJWVkaQorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJcHVucGNrbGRxCSVtbTEsJW1tNworCW1vdnEJJW1tNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwzMiglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwltb3ZxCSVtbTMsJW1tMAorCW1vdnEJJW1tNyw3MiglZXNwKQorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk1NiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcGFkZHEJKCVlYnApLCVtbTcKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMjQoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTgoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXN1YmwJJDgsJWVzcAorCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQk0MCglZXNwKSwlbW01CisJcGFkZHEJJW1tMiwlbW0zCisJbW92cQklbW0wLCVtbTIKKwlhZGRsCSQ4LCVlYnAKKwlwYWRkcQklbW02LCVtbTMKKwltb3ZxCTQ4KCVlc3ApLCVtbTYKKwlkZWNsCSVlZHgKKwlqbnoJLkwwMDUwMF8xNF9zc2UyCisJbW92ZAklZWF4LCVtbTEKKwltb3ZkCSVlYngsJW1tNworCXB1bnBja2xkcQklbW0xLCVtbTcKKwltb3ZxCSVtbTQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMzIoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJbW92cQklbW0zLCVtbTAKKwltb3ZxCSVtbTcsNzIoJWVzcCkKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXBhZGRxCSglZWJwKSwlbW03CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTI0KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlzdWJsCSQ4LCVlc3AKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMTkyKCVlc3ApLCVtbTcKKwlwYWRkcQklbW0yLCVtbTMKKwltb3ZxCSVtbTAsJW1tMgorCWFkZGwJJDgsJWVicAorCXBhZGRxCSVtbTYsJW1tMworCXB4b3IJJW1tMCwlbW0wCisJbW92bAkkMzIsJWVkeAorCWptcAkuTDAwNjE2Xzc5X3NzZTIKKy5hbGlnbgkxNgorLkwwMDYxNl83OV9zc2UyOgorCW1vdnEJODgoJWVzcCksJW1tNQorCW1vdnEJJW1tNywlbW0xCisJcHNybHEJJDEsJW1tNworCW1vdnEJJW1tNSwlbW02CisJcHNybHEJJDYsJW1tNQorCXBzbGxxCSQ1NiwlbW0xCisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW03LCVtbTMKKwlwc3JscQkkNiwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNywlbW0xCisJcHhvcgklbW03LCVtbTMKKwlwc3JscQkkMSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTUsJW1tMQorCXBzcmxxCSQxMywlbW01CisJcHhvcgklbW0zLCVtbTcKKwlwc2xscQkkMywlbW02CisJcHhvcgklbW01LCVtbTEKKwlwYWRkcQkyMDAoJWVzcCksJW1tNworCXB4b3IJJW1tNiwlbW0xCisJcHNybHEJJDQyLCVtbTUKKwlwYWRkcQkxMjgoJWVzcCksJW1tNworCXB4b3IJJW1tNSwlbW0xCisJcHNsbHEJJDQyLCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTUKKwlweG9yCSVtbTYsJW1tMQorCW1vdnEJNDgoJWVzcCksJW1tNgorCXBhZGRxCSVtbTEsJW1tNworCW1vdnEJJW1tNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwzMiglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwltb3ZxCSVtbTcsNzIoJWVzcCkKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXBhZGRxCSglZWJwKSwlbW03CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTI0KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlzdWJsCSQ4LCVlc3AKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMTkyKCVlc3ApLCVtbTcKKwlwYWRkcQklbW02LCVtbTIKKwlhZGRsCSQ4LCVlYnAKKwltb3ZxCTg4KCVlc3ApLCVtbTUKKwltb3ZxCSVtbTcsJW1tMQorCXBzcmxxCSQxLCVtbTcKKwltb3ZxCSVtbTUsJW1tNgorCXBzcmxxCSQ2LCVtbTUKKwlwc2xscQkkNTYsJW1tMQorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tNywlbW0zCisJcHNybHEJJDYsJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDcsJW1tMQorCXB4b3IJJW1tNywlbW0zCisJcHNybHEJJDEsJW1tNworCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW01LCVtbTEKKwlwc3JscQkkMTMsJW1tNQorCXB4b3IJJW1tMywlbW03CisJcHNsbHEJJDMsJW1tNgorCXB4b3IJJW1tNSwlbW0xCisJcGFkZHEJMjAwKCVlc3ApLCVtbTcKKwlweG9yCSVtbTYsJW1tMQorCXBzcmxxCSQ0MiwlbW01CisJcGFkZHEJMTI4KCVlc3ApLCVtbTcKKwlweG9yCSVtbTUsJW1tMQorCXBzbGxxCSQ0MiwlbW02CisJbW92cQk0MCglZXNwKSwlbW01CisJcHhvcgklbW02LCVtbTEKKwltb3ZxCTQ4KCVlc3ApLCVtbTYKKwlwYWRkcQklbW0xLCVtbTcKKwltb3ZxCSVtbTQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMzIoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJbW92cQklbW03LDcyKCVlc3ApCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlwYWRkcQkoJWVicCksJW1tNworCXB4b3IJJW1tNCwlbW0zCisJbW92cQkyNCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJOCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJc3VibAkkOCwlZXNwCisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTE5MiglZXNwKSwlbW03CisJcGFkZHEJJW1tNiwlbW0wCisJYWRkbAkkOCwlZWJwCisJZGVjbAklZWR4CisJam56CS5MMDA2MTZfNzlfc3NlMgorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJOCglZXNwKSwlbW0xCisJbW92cQkyNCglZXNwKSwlbW0zCisJbW92cQk0MCglZXNwKSwlbW01CisJbW92cQk0OCglZXNwKSwlbW02CisJbW92cQk1NiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwYWRkcQkoJWVzaSksJW1tMAorCXBhZGRxCTgoJWVzaSksJW1tMQorCXBhZGRxCTE2KCVlc2kpLCVtbTIKKwlwYWRkcQkyNCglZXNpKSwlbW0zCisJcGFkZHEJMzIoJWVzaSksJW1tNAorCXBhZGRxCTQwKCVlc2kpLCVtbTUKKwlwYWRkcQk0OCglZXNpKSwlbW02CisJcGFkZHEJNTYoJWVzaSksJW1tNworCW1vdmwJJDY0MCwlZWF4CisJbW92cQklbW0wLCglZXNpKQorCW1vdnEJJW1tMSw4KCVlc2kpCisJbW92cQklbW0yLDE2KCVlc2kpCisJbW92cQklbW0zLDI0KCVlc2kpCisJbW92cQklbW00LDMyKCVlc2kpCisJbW92cQklbW01LDQwKCVlc2kpCisJbW92cQklbW02LDQ4KCVlc2kpCisJbW92cQklbW03LDU2KCVlc2kpCisJbGVhbAkoJWVzcCwlZWF4LDEpLCVlc3AKKwlzdWJsCSVlYXgsJWVicAorCWNtcGwJODgoJWVzcCksJWVkaQorCWpiCS5MMDA0bG9vcF9zc2UyCisJbW92bAk5MiglZXNwKSwlZXNwCisJZW1tcworCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTMyCisuTDAwM1NTU0UzOgorCWxlYWwJLTY0KCVlc3ApLCVlZHgKKwlzdWJsCSQyNTYsJWVzcAorCW1vdmRxYQk2NDAoJWVicCksJXhtbTEKKwltb3ZkcXUJKCVlZGkpLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwltb3ZkcWEJKCVlYnApLCV4bW0zCisJbW92ZHFhCSV4bW0xLCV4bW0yCisJbW92ZHF1CTE2KCVlZGkpLCV4bW0xCisJcGFkZHEJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMgorCW1vdmRxYQkleG1tMywtMTI4KCVlZHgpCisJbW92ZHFhCTE2KCVlYnApLCV4bW00CisJbW92ZHFhCSV4bW0yLCV4bW0zCisJbW92ZHF1CTMyKCVlZGkpLCV4bW0yCisJcGFkZHEJJXhtbTEsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMQorCW1vdmRxYQkleG1tNCwtMTEyKCVlZHgpCisJbW92ZHFhCTMyKCVlYnApLCV4bW01CisJbW92ZHFhCSV4bW0zLCV4bW00CisJbW92ZHF1CTQ4KCVlZGkpLCV4bW0zCisJcGFkZHEJJXhtbTIsJXhtbTUKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMAorCW1vdmRxYQkleG1tNSwtOTYoJWVkeCkKKwltb3ZkcWEJNDgoJWVicCksJXhtbTYKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcXUJNjQoJWVkaSksJXhtbTQKKwlwYWRkcQkleG1tMywleG1tNgorLmJ5dGUJMTAyLDE1LDU2LDAsMjI5CisJbW92ZHFhCSV4bW02LC04MCglZWR4KQorCW1vdmRxYQk2NCglZWJwKSwleG1tNworCW1vdmRxYQkleG1tNSwleG1tNgorCW1vdmRxdQk4MCglZWRpKSwleG1tNQorCXBhZGRxCSV4bW00LCV4bW03CisuYnl0ZQkxMDIsMTUsNTYsMCwyMzgKKwltb3ZkcWEJJXhtbTcsLTY0KCVlZHgpCisJbW92ZHFhCSV4bW0wLCglZWR4KQorCW1vdmRxYQk4MCglZWJwKSwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tNworCW1vdmRxdQk5NiglZWRpKSwleG1tNgorCXBhZGRxCSV4bW01LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyNDcKKwltb3ZkcWEJJXhtbTAsLTQ4KCVlZHgpCisJbW92ZHFhCSV4bW0xLDE2KCVlZHgpCisJbW92ZHFhCTk2KCVlYnApLCV4bW0xCisJbW92ZHFhCSV4bW03LCV4bW0wCisJbW92ZHF1CTExMiglZWRpKSwleG1tNworCXBhZGRxCSV4bW02LCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyNDgKKwltb3ZkcWEJJXhtbTEsLTMyKCVlZHgpCisJbW92ZHFhCSV4bW0yLDMyKCVlZHgpCisJbW92ZHFhCTExMiglZWJwKSwleG1tMgorCW1vdmRxYQkoJWVkeCksJXhtbTAKKwlwYWRkcQkleG1tNywleG1tMgorCW1vdmRxYQkleG1tMiwtMTYoJWVkeCkKKwlub3AKKy5hbGlnbgkzMgorLkwwMDdsb29wX3Nzc2UzOgorCW1vdmRxYQkxNiglZWR4KSwleG1tMgorCW1vdmRxYQkleG1tMyw0OCglZWR4KQorCWxlYWwJMTI4KCVlYnApLCVlYnAKKwltb3ZxCSVtbTEsOCglZXNwKQorCW1vdmwJJWVkaSwlZWJ4CisJbW92cQklbW0yLDE2KCVlc3ApCisJbGVhbAkxMjgoJWVkaSksJWVkaQorCW1vdnEJJW1tMywyNCglZXNwKQorCWNtcGwJJWVheCwlZWRpCisJbW92cQklbW01LDQwKCVlc3ApCisJY21vdmJsCSVlZGksJWVieAorCW1vdnEJJW1tNiw0OCglZXNwKQorCW1vdmwJJDQsJWVjeAorCXB4b3IJJW1tMSwlbW0yCisJbW92cQklbW03LDU2KCVlc3ApCisJcHhvcgklbW0zLCVtbTMKKwlqbXAJLkwwMDgwMF80N19zc3NlMworLmFsaWduCTMyCisuTDAwODAwXzQ3X3Nzc2UzOgorCW1vdmRxYQkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwleG1tMQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIwOCw4CisJbW92ZHFhCSV4bW00LCglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyMCw4CisJbW92ZHFhCSV4bW0yLCV4bW00CisJcHNybHEJJDcsJXhtbTIKKwlwYWRkcQkleG1tMywleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzcmxxCSQxLCV4bW00CisJcHNsbHEJJDU2LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMgorCXBzcmxxCSQ3LCV4bW00CisJcHhvcgkleG1tMywleG1tMgorCXBzbGxxCSQ3LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMgorCW1vdmRxYQkleG1tNywleG1tNAorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcWEJJXhtbTcsJXhtbTMKKwlwc3JscQkkNiwleG1tNAorCXBhZGRxCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW03LCV4bW0yCisJcHNybHEJJDE5LCV4bW0zCisJcHNsbHEJJDMsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW00CisJcHNybHEJJDQyLCV4bW0zCisJcHhvcgkleG1tMiwleG1tNAorCXBzbGxxCSQ0MiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTQKKwltb3ZkcWEJMzIoJWVkeCksJXhtbTMKKwlweG9yCSV4bW0yLCV4bW00CisJbW92ZHFhCSglZWJwKSwleG1tMgorCW1vdnEJJW1tNCwlbW0xCisJcGFkZHEJJXhtbTQsJXhtbTAKKwltb3ZxCS0xMjgoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMzIoJWVzcCkKKwlwYWRkcQkleG1tMCwleG1tMgorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkyNCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJOCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTMyKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTQwKCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTEyMCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwyNCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw1NiglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk0OCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTE2KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTIsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0yLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQkyNCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkzMiglZXNwKSwlbW02CisJbW92ZHFhCSV4bW0yLC0xMjgoJWVkeCkKKwltb3ZkcWEJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTMsJXhtbTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMTcsOAorCW1vdmRxYQkleG1tNSwxNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOSw4CisJbW92ZHFhCSV4bW0zLCV4bW01CisJcHNybHEJJDcsJXhtbTMKKwlwYWRkcQkleG1tNCwleG1tMQorCW1vdmRxYQkleG1tNSwleG1tNAorCXBzcmxxCSQxLCV4bW01CisJcHNsbHEJJDU2LCV4bW00CisJcHhvcgkleG1tNSwleG1tMworCXBzcmxxCSQ3LCV4bW01CisJcHhvcgkleG1tNCwleG1tMworCXBzbGxxCSQ3LCV4bW00CisJcHhvcgkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTMKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwlwc3JscQkkNiwleG1tNQorCXBhZGRxCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNybHEJJDE5LCV4bW00CisJcHNsbHEJJDMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW01CisJcHNybHEJJDQyLCV4bW00CisJcHhvcgkleG1tMywleG1tNQorCXBzbGxxCSQ0MiwleG1tMworCXB4b3IJJXhtbTQsJXhtbTUKKwltb3ZkcWEJNDgoJWVkeCksJXhtbTQKKwlweG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTE2KCVlYnApLCV4bW0zCisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tNSwleG1tMQorCW1vdnEJLTExMiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwxNiglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0zCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDQ4KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTQwKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJOCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNTYoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQkxNiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQkyNCglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS0xMDQoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsOCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw0MCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkzMiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCSglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNDgoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTE2KCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTMsLTExMiglZWR4KQorCW1vdmRxYQkleG1tNywleG1tNQorCW1vdmRxYQkleG1tNCwleG1tMworLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNiw4CisJbW92ZHFhCSV4bW02LDMyKCVlZHgpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM4LDgKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwlwc3JscQkkNywleG1tNAorCXBhZGRxCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW02LCV4bW01CisJcHNybHEJJDEsJXhtbTYKKwlwc2xscQkkNTYsJXhtbTUKKwlweG9yCSV4bW02LCV4bW00CisJcHNybHEJJDcsJXhtbTYKKwlweG9yCSV4bW01LCV4bW00CisJcHNsbHEJJDcsJXhtbTUKKwlweG9yCSV4bW02LCV4bW00CisJbW92ZHFhCSV4bW0xLCV4bW02CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMSwleG1tNQorCXBzcmxxCSQ2LCV4bW02CisJcGFkZHEJJXhtbTQsJXhtbTIKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JscQkkMTksJXhtbTUKKwlwc2xscQkkMywleG1tNAorCXB4b3IJJXhtbTUsJXhtbTYKKwlwc3JscQkkNDIsJXhtbTUKKwlweG9yCSV4bW00LCV4bW02CisJcHNsbHEJJDQyLCV4bW00CisJcHhvcgkleG1tNSwleG1tNgorCW1vdmRxYQkoJWVkeCksJXhtbTUKKwlweG9yCSV4bW00LCV4bW02CisJbW92ZHFhCTMyKCVlYnApLCV4bW00CisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tNiwleG1tMgorCW1vdnEJLTk2KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LCglZXNwKQorCXBhZGRxCSV4bW0yLCV4bW00CisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDMyKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTI0KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNTYoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTgoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktODgoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNTYoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsMjQoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0OCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk1NiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tNCwtOTYoJWVkeCkKKwltb3ZkcWEJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzUsOAorCW1vdmRxYQkleG1tNyw0OCglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0Nyw4CisJbW92ZHFhCSV4bW01LCV4bW03CisJcHNybHEJJDcsJXhtbTUKKwlwYWRkcQkleG1tNiwleG1tMworCW1vdmRxYQkleG1tNywleG1tNgorCXBzcmxxCSQxLCV4bW03CisJcHNsbHEJJDU2LCV4bW02CisJcHhvcgkleG1tNywleG1tNQorCXBzcmxxCSQ3LCV4bW03CisJcHhvcgkleG1tNiwleG1tNQorCXBzbGxxCSQ3LCV4bW02CisJcHhvcgkleG1tNywleG1tNQorCW1vdmRxYQkleG1tMiwleG1tNworCXB4b3IJJXhtbTYsJXhtbTUKKwltb3ZkcWEJJXhtbTIsJXhtbTYKKwlwc3JscQkkNiwleG1tNworCXBhZGRxCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLCV4bW01CisJcHNybHEJJDE5LCV4bW02CisJcHNsbHEJJDMsJXhtbTUKKwlweG9yCSV4bW02LCV4bW03CisJcHNybHEJJDQyLCV4bW02CisJcHhvcgkleG1tNSwleG1tNworCXBzbGxxCSQ0MiwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTcKKwltb3ZkcWEJMTYoJWVkeCksJXhtbTYKKwlweG9yCSV4bW01LCV4bW03CisJbW92ZHFhCTQ4KCVlYnApLCV4bW01CisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tNywleG1tMworCW1vdnEJLTgwKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQ4KCVlc3ApCisJcGFkZHEJJXhtbTMsJXhtbTUKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsMTYoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJOCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTQwKCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkyNCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTQ4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTU2KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTcyKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQwKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDgoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMzIoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTE2KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNDAoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJNDgoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tNSwtODAoJWVkeCkKKwltb3ZkcWEJJXhtbTEsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDQsOAorCW1vdmRxYQkleG1tMCwoJWVkeCkKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDgsOAorCW1vdmRxYQkleG1tNiwleG1tMAorCXBzcmxxCSQ3LCV4bW02CisJcGFkZHEJJXhtbTcsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwlwc3JscQkkMSwleG1tMAorCXBzbGxxCSQ1NiwleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwlwc3JscQkkNywleG1tMAorCXB4b3IJJXhtbTcsJXhtbTYKKwlwc2xscQkkNywleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW03LCV4bW02CisJbW92ZHFhCSV4bW0zLCV4bW03CisJcHNybHEJJDYsJXhtbTAKKwlwYWRkcQkleG1tNiwleG1tNAorCW1vdmRxYQkleG1tMywleG1tNgorCXBzcmxxCSQxOSwleG1tNworCXBzbGxxCSQzLCV4bW02CisJcHhvcgkleG1tNywleG1tMAorCXBzcmxxCSQ0MiwleG1tNworCXB4b3IJJXhtbTYsJXhtbTAKKwlwc2xscQkkNDIsJXhtbTYKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHFhCTMyKCVlZHgpLCV4bW03CisJcHhvcgkleG1tNiwleG1tMAorCW1vdmRxYQk2NCglZWJwKSwleG1tNgorCW1vdnEJJW1tNCwlbW0xCisJcGFkZHEJJXhtbTAsJXhtbTQKKwltb3ZxCS02NCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwzMiglZXNwKQorCXBhZGRxCSV4bW00LCV4bW02CisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk1NiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTI0KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMgorCW1vdnEJNDAoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktNTYoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMjQoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsNTYoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNDgoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkxNiglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMjQoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJMzIoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tNiwtNjQoJWVkeCkKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTMsOAorCW1vdmRxYQkleG1tMSwxNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDE5Myw4CisJbW92ZHFhCSV4bW03LCV4bW0xCisJcHNybHEJJDcsJXhtbTcKKwlwYWRkcQkleG1tMCwleG1tNQorCW1vdmRxYQkleG1tMSwleG1tMAorCXBzcmxxCSQxLCV4bW0xCisJcHNsbHEJJDU2LCV4bW0wCisJcHhvcgkleG1tMSwleG1tNworCXBzcmxxCSQ3LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNworCXBzbGxxCSQ3LCV4bW0wCisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTcKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwlwc3JscQkkNiwleG1tMQorCXBhZGRxCSV4bW03LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW03CisJcHNybHEJJDE5LCV4bW0wCisJcHNsbHEJJDMsJXhtbTcKKwlweG9yCSV4bW0wLCV4bW0xCisJcHNybHEJJDQyLCV4bW0wCisJcHhvcgkleG1tNywleG1tMQorCXBzbGxxCSQ0MiwleG1tNworCXB4b3IJJXhtbTAsJXhtbTEKKwltb3ZkcWEJNDgoJWVkeCksJXhtbTAKKwlweG9yCSV4bW03LCV4bW0xCisJbW92ZHFhCTgwKCVlYnApLCV4bW03CisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tMSwleG1tNQorCW1vdnEJLTQ4KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDE2KCVlc3ApCisJcGFkZHEJJXhtbTUsJXhtbTcKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsNDgoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNDAoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk4KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk1NiglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTE2KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTI0KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTQwKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDgoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsNDAoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMzIoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQ4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJOCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkxNiglZXNwKSwlbW02CisJbW92ZHFhCSV4bW03LC00OCglZWR4KQorCW1vdmRxYQkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNworLmJ5dGUJMTAyLDE1LDU4LDE1LDE5OCw4CisJbW92ZHFhCSV4bW0yLDMyKCVlZHgpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjAyLDgKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwlwc3JscQkkNywleG1tMAorCXBhZGRxCSV4bW0xLCV4bW02CisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcHNybHEJJDEsJXhtbTIKKwlwc2xscQkkNTYsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0wCisJcHNybHEJJDcsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0wCisJcHNsbHEJJDcsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMQorCXBzcmxxCSQ2LCV4bW0yCisJcGFkZHEJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwlwc3JscQkkMTksJXhtbTEKKwlwc2xscQkkMywleG1tMAorCXB4b3IJJXhtbTEsJXhtbTIKKwlwc3JscQkkNDIsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW0yCisJcHNsbHEJJDQyLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMgorCW1vdmRxYQkoJWVkeCksJXhtbTEKKwlweG9yCSV4bW0wLCV4bW0yCisJbW92ZHFhCTk2KCVlYnApLCV4bW0wCisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tMiwleG1tNgorCW1vdnEJLTMyKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LCglZXNwKQorCXBhZGRxCSV4bW02LCV4bW0wCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDMyKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTI0KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNTYoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTgoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMjQoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNTYoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsMjQoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0OCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk1NiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tMCwtMzIoJWVkeCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwltb3ZkcWEJJXhtbTEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMDcsOAorCW1vdmRxYQkleG1tMyw0OCglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIxMSw4CisJbW92ZHFhCSV4bW0xLCV4bW0zCisJcHNybHEJJDcsJXhtbTEKKwlwYWRkcQkleG1tMiwleG1tNworCW1vdmRxYQkleG1tMywleG1tMgorCXBzcmxxCSQxLCV4bW0zCisJcHNsbHEJJDU2LCV4bW0yCisJcHhvcgkleG1tMywleG1tMQorCXBzcmxxCSQ3LCV4bW0zCisJcHhvcgkleG1tMiwleG1tMQorCXBzbGxxCSQ3LCV4bW0yCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNiwleG1tMworCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTYsJXhtbTIKKwlwc3JscQkkNiwleG1tMworCXBhZGRxCSV4bW0xLCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW0xCisJcHNybHEJJDE5LCV4bW0yCisJcHNsbHEJJDMsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNybHEJJDQyLCV4bW0yCisJcHhvcgkleG1tMSwleG1tMworCXBzbGxxCSQ0MiwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTMKKwltb3ZkcWEJMTYoJWVkeCksJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0zCisJbW92ZHFhCTExMiglZWJwKSwleG1tMQorCW1vdnEJJW1tNCwlbW0xCisJcGFkZHEJJXhtbTMsJXhtbTcKKwltb3ZxCS0xNiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCw0OCglZXNwKQorCXBhZGRxCSV4bW03LCV4bW0xCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDE2KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTgoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0MCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMjQoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQk0OCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQk1NiglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS04KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQwKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDgoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMzIoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTE2KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNDAoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJNDgoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tMSwtMTYoJWVkeCkKKwlsZWFsCTEyOCglZWJwKSwlZWJwCisJZGVjbAklZWN4CisJam56CS5MMDA4MDBfNDdfc3NzZTMKKwltb3ZkcWEJKCVlYnApLCV4bW0xCisJbGVhbAktNjQwKCVlYnApLCVlYnAKKwltb3ZkcXUJKCVlYngpLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwltb3ZkcWEJKCVlYnApLCV4bW0zCisJbW92ZHFhCSV4bW0xLCV4bW0yCisJbW92ZHF1CTE2KCVlYngpLCV4bW0xCisJcGFkZHEJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMTI4KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDMyKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk1NiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTI0KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMgorCW1vdnEJNDAoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMTIwKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDI0KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDU2KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTQ4KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMTYoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCSglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTI0KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTMyKCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTMsLTEyOCglZWR4KQorCW1vdmRxYQkxNiglZWJwKSwleG1tNAorCW1vdmRxYQkleG1tMiwleG1tMworCW1vdmRxdQkzMiglZWJ4KSwleG1tMgorCXBhZGRxCSV4bW0xLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTExMiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwxNiglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCw0OCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk0MCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTgoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTU2KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMTYoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMgorCW1vdnEJMjQoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMTA0KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDgoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsNDAoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMzIoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQ4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJOCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkxNiglZXNwKSwlbW02CisJbW92ZHFhCSV4bW00LC0xMTIoJWVkeCkKKwltb3ZkcWEJMzIoJWVicCksJXhtbTUKKwltb3ZkcWEJJXhtbTMsJXhtbTQKKwltb3ZkcXUJNDgoJWVieCksJXhtbTMKKwlwYWRkcQkleG1tMiwleG1tNQorLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJbW92cQklbW00LCVtbTEKKwltb3ZxCS05NiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsMzIoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMjQoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk1NiglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNDAoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQkoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMgorCW1vdnEJOCglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS04OCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCw1NiglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiwyNCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkxNiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTQ4KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTIsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0yLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkzMiglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTU2KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCSglZXNwKSwlbW02CisJbW92ZHFhCSV4bW01LC05NiglZWR4KQorCW1vdmRxYQk0OCglZWJwKSwleG1tNgorCW1vdmRxYQkleG1tNCwleG1tNQorCW1vdmRxdQk2NCglZWJ4KSwleG1tNAorCXBhZGRxCSV4bW0zLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjkKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTgwKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQ4KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDE2KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTgoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0MCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMjQoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQk0OCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQk1NiglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS03MiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCw0MCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw4KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCSglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTMyKCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTIsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0yLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkxNiglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTQ4KCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTYsLTgwKCVlZHgpCisJbW92ZHFhCTY0KCVlYnApLCV4bW03CisJbW92ZHFhCSV4bW01LCV4bW02CisJbW92ZHF1CTgwKCVlYngpLCV4bW01CisJcGFkZHEJJXhtbTQsJXhtbTcKKy5ieXRlCTEwMiwxNSw1NiwwLDIzOAorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktNjQoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMzIoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMjQoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTgoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQkzMiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQk0MCglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS01NiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwyNCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw1NiglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk0OCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTE2KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTIsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0yLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQkyNCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkzMiglZXNwKSwlbW02CisJbW92ZHFhCSV4bW03LC02NCglZWR4KQorCW1vdmRxYQkleG1tMCwoJWVkeCkKKwltb3ZkcWEJODAoJWVicCksJXhtbTAKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwltb3ZkcXUJOTYoJWVieCksJXhtbTYKKwlwYWRkcQkleG1tNSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ3CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS00OCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwxNiglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCw0OCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk0MCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTgoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTU2KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMTYoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMgorCW1vdnEJMjQoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktNDAoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsOCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw0MCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkzMiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCSglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNDgoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTE2KCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTAsLTQ4KCVlZHgpCisJbW92ZHFhCSV4bW0xLDE2KCVlZHgpCisJbW92ZHFhCTk2KCVlYnApLCV4bW0xCisJbW92ZHFhCSV4bW03LCV4bW0wCisJbW92ZHF1CTExMiglZWJ4KSwleG1tNworCXBhZGRxCSV4bW02LCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyNDgKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTMyKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwzMiglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkyNCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTU2KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk0MCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCSglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQk4KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTI0KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDU2KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDI0KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTE2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNDgoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTMyKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNTYoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJKCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTEsLTMyKCVlZHgpCisJbW92ZHFhCSV4bW0yLDMyKCVlZHgpCisJbW92ZHFhCTExMiglZWJwKSwleG1tMgorCW1vdmRxYQkoJWVkeCksJXhtbTAKKwlwYWRkcQkleG1tNywleG1tMgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMTYoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNDgoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsMTYoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJOCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTQwKCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkyNCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTQ4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTU2KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTgoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNDAoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsOCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkzMiglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMTYoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk0MCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQk0OCglZXNwKSwlbW02CisJbW92ZHFhCSV4bW0yLC0xNiglZWR4KQorCW1vdnEJOCglZXNwKSwlbW0xCisJcGFkZHEJJW1tMywlbW0wCisJbW92cQkyNCglZXNwKSwlbW0zCisJbW92cQk1NiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwYWRkcQkoJWVzaSksJW1tMAorCXBhZGRxCTgoJWVzaSksJW1tMQorCXBhZGRxCTE2KCVlc2kpLCVtbTIKKwlwYWRkcQkyNCglZXNpKSwlbW0zCisJcGFkZHEJMzIoJWVzaSksJW1tNAorCXBhZGRxCTQwKCVlc2kpLCVtbTUKKwlwYWRkcQk0OCglZXNpKSwlbW02CisJcGFkZHEJNTYoJWVzaSksJW1tNworCW1vdnEJJW1tMCwoJWVzaSkKKwltb3ZxCSVtbTEsOCglZXNpKQorCW1vdnEJJW1tMiwxNiglZXNpKQorCW1vdnEJJW1tMywyNCglZXNpKQorCW1vdnEJJW1tNCwzMiglZXNpKQorCW1vdnEJJW1tNSw0MCglZXNpKQorCW1vdnEJJW1tNiw0OCglZXNpKQorCW1vdnEJJW1tNyw1NiglZXNpKQorCWNtcGwJJWVheCwlZWRpCisJamIJLkwwMDdsb29wX3Nzc2UzCisJbW92bAk3NiglZWR4KSwlZXNwCisJZW1tcworCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTE2CisuTDAwMmxvb3BfeDg2OgorCW1vdmwJKCVlZGkpLCVlYXgKKwltb3ZsCTQoJWVkaSksJWVieAorCW1vdmwJOCglZWRpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwltb3ZsCTE2KCVlZGkpLCVlYXgKKwltb3ZsCTIwKCVlZGkpLCVlYngKKwltb3ZsCTI0KCVlZGkpLCVlY3gKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJcHVzaGwJJWVheAorCXB1c2hsCSVlYngKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCW1vdmwJMzIoJWVkaSksJWVheAorCW1vdmwJMzYoJWVkaSksJWVieAorCW1vdmwJNDAoJWVkaSksJWVjeAorCW1vdmwJNDQoJWVkaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWF4CisJcHVzaGwJJWVieAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJbW92bAk0OCglZWRpKSwlZWF4CisJbW92bAk1MiglZWRpKSwlZWJ4CisJbW92bAk1NiglZWRpKSwlZWN4CisJbW92bAk2MCglZWRpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwltb3ZsCTY0KCVlZGkpLCVlYXgKKwltb3ZsCTY4KCVlZGkpLCVlYngKKwltb3ZsCTcyKCVlZGkpLCVlY3gKKwltb3ZsCTc2KCVlZGkpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJcHVzaGwJJWVheAorCXB1c2hsCSVlYngKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCW1vdmwJODAoJWVkaSksJWVheAorCW1vdmwJODQoJWVkaSksJWVieAorCW1vdmwJODgoJWVkaSksJWVjeAorCW1vdmwJOTIoJWVkaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWF4CisJcHVzaGwJJWVieAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJbW92bAk5NiglZWRpKSwlZWF4CisJbW92bAkxMDAoJWVkaSksJWVieAorCW1vdmwJMTA0KCVlZGkpLCVlY3gKKwltb3ZsCTEwOCglZWRpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwltb3ZsCTExMiglZWRpKSwlZWF4CisJbW92bAkxMTYoJWVkaSksJWVieAorCW1vdmwJMTIwKCVlZGkpLCVlY3gKKwltb3ZsCTEyNCglZWRpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwlhZGRsCSQxMjgsJWVkaQorCXN1YmwJJDcyLCVlc3AKKwltb3ZsCSVlZGksMjA0KCVlc3ApCisJbGVhbAk4KCVlc3ApLCVlZGkKKwltb3ZsCSQxNiwlZWN4CisubG9uZwkyNzg0MjI5MDAxCisuYWxpZ24JMTYKKy5MMDA5MDBfMTVfeDg2OgorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJNDQoJWVzcCksJWVkeAorCW1vdmwJJWVjeCwlZXNpCisJc2hybAkkOSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQ5LCVlZHgKKwltb3ZsCSVlY3gsJWVieAorCXNobGwJJDE0LCVlc2kKKwltb3ZsCSVlZHgsJWVheAorCXNobGwJJDE0LCVlZGkKKwl4b3JsCSVlc2ksJWVieAorCXNocmwJJDUsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJc2hybAkkNSwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwlzaGxsCSQ0LCVlc2kKKwl4b3JsCSVlZHgsJWVieAorCXNobGwJJDQsJWVkaQorCXhvcmwJJWVzaSwlZWJ4CisJc2hybAkkNCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJsCSQ0LCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDUsJWVzaQorCXhvcmwJJWVkeCwlZWJ4CisJc2hsbAkkNSwlZWRpCisJeG9ybAklZXNpLCVlYXgKKwl4b3JsCSVlZGksJWVieAorCW1vdmwJNDgoJWVzcCksJWVjeAorCW1vdmwJNTIoJWVzcCksJWVkeAorCW1vdmwJNTYoJWVzcCksJWVzaQorCW1vdmwJNjAoJWVzcCksJWVkaQorCWFkZGwJNjQoJWVzcCksJWVheAorCWFkY2wJNjgoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlZHgKKwlhbmRsCTQwKCVlc3ApLCVlY3gKKwlhbmRsCTQ0KCVlc3ApLCVlZHgKKwlhZGRsCTE5MiglZXNwKSwlZWF4CisJYWRjbAkxOTYoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlZHgKKwltb3ZsCSglZWJwKSwlZXNpCisJbW92bAk0KCVlYnApLCVlZGkKKwlhZGRsCSVlY3gsJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkzMiglZXNwKSwlZWN4CisJbW92bAkzNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSVlZGksJWVieAorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYngsNCglZXNwKQorCWFkZGwJJWVjeCwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTgoJWVzcCksJWVjeAorCW1vdmwJMTIoJWVzcCksJWVkeAorCW1vdmwJJWVheCwzMiglZXNwKQorCW1vdmwJJWVieCwzNiglZXNwKQorCW1vdmwJJWVjeCwlZXNpCisJc2hybAkkMiwlZWN4CisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyLCVlZHgKKwltb3ZsCSVlY3gsJWVieAorCXNobGwJJDQsJWVzaQorCW1vdmwJJWVkeCwlZWF4CisJc2hsbAkkNCwlZWRpCisJeG9ybAklZXNpLCVlYngKKwlzaHJsCSQ1LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDUsJWVkeAorCXhvcmwJJWVjeCwlZWJ4CisJc2hsbAkkMjEsJWVzaQorCXhvcmwJJWVkeCwlZWF4CisJc2hsbAkkMjEsJWVkaQorCXhvcmwJJWVzaSwlZWF4CisJc2hybAkkMjEsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hybAkkMjEsJWVkeAorCXhvcmwJJWVjeCwlZWF4CisJc2hsbAkkNSwlZXNpCisJeG9ybAklZWR4LCVlYngKKwlzaGxsCSQ1LCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXhvcmwJJWVkaSwlZWJ4CisJbW92bAk4KCVlc3ApLCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlhZGRsCSglZXNwKSwlZWF4CisJYWRjbAk0KCVlc3ApLCVlYngKKwlvcmwJJWVzaSwlZWN4CisJb3JsCSVlZGksJWVkeAorCWFuZGwJMjQoJWVzcCksJWVjeAorCWFuZGwJMjgoJWVzcCksJWVkeAorCWFuZGwJOCglZXNwKSwlZXNpCisJYW5kbAkxMiglZXNwKSwlZWRpCisJb3JsCSVlc2ksJWVjeAorCW9ybAklZWRpLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAklZWF4LCglZXNwKQorCW1vdmwJJWVieCw0KCVlc3ApCisJbW92YgkoJWVicCksJWRsCisJc3VibAkkOCwlZXNwCisJbGVhbAk4KCVlYnApLCVlYnAKKwljbXBiCSQxNDgsJWRsCisJam5lCS5MMDA5MDBfMTVfeDg2CisuYWxpZ24JMTYKKy5MMDEwMTZfNzlfeDg2OgorCW1vdmwJMzEyKCVlc3ApLCVlY3gKKwltb3ZsCTMxNiglZXNwKSwlZWR4CisJbW92bAklZWN4LCVlc2kKKwlzaHJsCSQxLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDEsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJc2hsbAkkMjQsJWVzaQorCW1vdmwJJWVkeCwlZWJ4CisJc2hsbAkkMjQsJWVkaQorCXhvcmwJJWVzaSwlZWJ4CisJc2hybAkkNiwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJsCSQ2LCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDcsJWVzaQorCXhvcmwJJWVkeCwlZWJ4CisJc2hsbAkkMSwlZWRpCisJeG9ybAklZXNpLCVlYngKKwlzaHJsCSQxLCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDEsJWVkeAorCXhvcmwJJWVjeCwlZWF4CisJc2hsbAkkNiwlZWRpCisJeG9ybAklZWR4LCVlYngKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYngsNCglZXNwKQorCW1vdmwJMjA4KCVlc3ApLCVlY3gKKwltb3ZsCTIxMiglZXNwKSwlZWR4CisJbW92bAklZWN4LCVlc2kKKwlzaHJsCSQ2LCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDYsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJc2hsbAkkMywlZXNpCisJbW92bAklZWR4LCVlYngKKwlzaGxsCSQzLCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXNocmwJJDEzLCVlY3gKKwl4b3JsCSVlZGksJWVieAorCXNocmwJJDEzLCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDEwLCVlc2kKKwl4b3JsCSVlZHgsJWVieAorCXNobGwJJDEwLCVlZGkKKwl4b3JsCSVlc2ksJWVieAorCXNocmwJJDEwLCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDEwLCVlZHgKKwl4b3JsCSVlY3gsJWVieAorCXNobGwJJDEzLCVlZGkKKwl4b3JsCSVlZHgsJWVheAorCXhvcmwJJWVkaSwlZWF4CisJbW92bAkzMjAoJWVzcCksJWVjeAorCW1vdmwJMzI0KCVlc3ApLCVlZHgKKwlhZGRsCSglZXNwKSwlZWF4CisJYWRjbAk0KCVlc3ApLCVlYngKKwltb3ZsCTI0OCglZXNwKSwlZXNpCisJbW92bAkyNTIoJWVzcCksJWVkaQorCWFkZGwJJWVjeCwlZWF4CisJYWRjbAklZWR4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJWVkaSwlZWJ4CisJbW92bAklZWF4LDE5MiglZXNwKQorCW1vdmwJJWVieCwxOTYoJWVzcCkKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCTQ0KCVlc3ApLCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXNocmwJJDksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkOSwlZWR4CisJbW92bAklZWN4LCVlYngKKwlzaGxsCSQxNCwlZXNpCisJbW92bAklZWR4LCVlYXgKKwlzaGxsCSQxNCwlZWRpCisJeG9ybAklZXNpLCVlYngKKwlzaHJsCSQ1LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDUsJWVkeAorCXhvcmwJJWVjeCwlZWF4CisJc2hsbAkkNCwlZXNpCisJeG9ybAklZWR4LCVlYngKKwlzaGxsCSQ0LCVlZGkKKwl4b3JsCSVlc2ksJWVieAorCXNocmwJJDQsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJc2hybAkkNCwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwlzaGxsCSQ1LCVlc2kKKwl4b3JsCSVlZHgsJWVieAorCXNobGwJJDUsJWVkaQorCXhvcmwJJWVzaSwlZWF4CisJeG9ybAklZWRpLCVlYngKKwltb3ZsCTQ4KCVlc3ApLCVlY3gKKwltb3ZsCTUyKCVlc3ApLCVlZHgKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwltb3ZsCTYwKCVlc3ApLCVlZGkKKwlhZGRsCTY0KCVlc3ApLCVlYXgKKwlhZGNsCTY4KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWR4CisJYW5kbAk0MCglZXNwKSwlZWN4CisJYW5kbAk0NCglZXNwKSwlZWR4CisJYWRkbAkxOTIoJWVzcCksJWVheAorCWFkY2wJMTk2KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWR4CisJbW92bAkoJWVicCksJWVzaQorCW1vdmwJNCglZWJwKSwlZWRpCisJYWRkbAklZWN4LCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMzIoJWVzcCksJWVjeAorCW1vdmwJMzYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAklZWRpLCVlYngKKwltb3ZsCSVlYXgsKCVlc3ApCisJbW92bAklZWJ4LDQoJWVzcCkKKwlhZGRsCSVlY3gsJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk4KCVlc3ApLCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwltb3ZsCSVlYXgsMzIoJWVzcCkKKwltb3ZsCSVlYngsMzYoJWVzcCkKKwltb3ZsCSVlY3gsJWVzaQorCXNocmwJJDIsJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYngKKwlzaGxsCSQ0LCVlc2kKKwltb3ZsCSVlZHgsJWVheAorCXNobGwJJDQsJWVkaQorCXhvcmwJJWVzaSwlZWJ4CisJc2hybAkkNSwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJsCSQ1LCVlZHgKKwl4b3JsCSVlY3gsJWVieAorCXNobGwJJDIxLCVlc2kKKwl4b3JsCSVlZHgsJWVheAorCXNobGwJJDIxLCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXNocmwJJDIxLCVlY3gKKwl4b3JsCSVlZGksJWVieAorCXNocmwJJDIxLCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDUsJWVzaQorCXhvcmwJJWVkeCwlZWJ4CisJc2hsbAkkNSwlZWRpCisJeG9ybAklZXNpLCVlYXgKKwl4b3JsCSVlZGksJWVieAorCW1vdmwJOCglZXNwKSwlZWN4CisJbW92bAkxMiglZXNwKSwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRkbAkoJWVzcCksJWVheAorCWFkY2wJNCglZXNwKSwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW9ybAklZWRpLCVlZHgKKwlhbmRsCTI0KCVlc3ApLCVlY3gKKwlhbmRsCTI4KCVlc3ApLCVlZHgKKwlhbmRsCTgoJWVzcCksJWVzaQorCWFuZGwJMTIoJWVzcCksJWVkaQorCW9ybAklZXNpLCVlY3gKKwlvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYngsNCglZXNwKQorCW1vdmIJKCVlYnApLCVkbAorCXN1YmwJJDgsJWVzcAorCWxlYWwJOCglZWJwKSwlZWJwCisJY21wYgkkMjMsJWRsCisJam5lCS5MMDEwMTZfNzlfeDg2CisJbW92bAk4NDAoJWVzcCksJWVzaQorCW1vdmwJODQ0KCVlc3ApLCVlZGkKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkeAorCWFkZGwJOCglZXNwKSwlZWF4CisJYWRjbAkxMiglZXNwKSwlZWJ4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJYWRkbAkxNiglZXNwKSwlZWN4CisJYWRjbAkyMCglZXNwKSwlZWR4CisJbW92bAklZWN4LDgoJWVzaSkKKwltb3ZsCSVlZHgsMTIoJWVzaSkKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwltb3ZsCTIwKCVlc2kpLCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlZHgKKwlhZGRsCTI0KCVlc3ApLCVlYXgKKwlhZGNsCTI4KCVlc3ApLCVlYngKKwltb3ZsCSVlYXgsMTYoJWVzaSkKKwltb3ZsCSVlYngsMjAoJWVzaSkKKwlhZGRsCTMyKCVlc3ApLCVlY3gKKwlhZGNsCTM2KCVlc3ApLCVlZHgKKwltb3ZsCSVlY3gsMjQoJWVzaSkKKwltb3ZsCSVlZHgsMjgoJWVzaSkKKwltb3ZsCTMyKCVlc2kpLCVlYXgKKwltb3ZsCTM2KCVlc2kpLCVlYngKKwltb3ZsCTQwKCVlc2kpLCVlY3gKKwltb3ZsCTQ0KCVlc2kpLCVlZHgKKwlhZGRsCTQwKCVlc3ApLCVlYXgKKwlhZGNsCTQ0KCVlc3ApLCVlYngKKwltb3ZsCSVlYXgsMzIoJWVzaSkKKwltb3ZsCSVlYngsMzYoJWVzaSkKKwlhZGRsCTQ4KCVlc3ApLCVlY3gKKwlhZGNsCTUyKCVlc3ApLCVlZHgKKwltb3ZsCSVlY3gsNDAoJWVzaSkKKwltb3ZsCSVlZHgsNDQoJWVzaSkKKwltb3ZsCTQ4KCVlc2kpLCVlYXgKKwltb3ZsCTUyKCVlc2kpLCVlYngKKwltb3ZsCTU2KCVlc2kpLCVlY3gKKwltb3ZsCTYwKCVlc2kpLCVlZHgKKwlhZGRsCTU2KCVlc3ApLCVlYXgKKwlhZGNsCTYwKCVlc3ApLCVlYngKKwltb3ZsCSVlYXgsNDgoJWVzaSkKKwltb3ZsCSVlYngsNTIoJWVzaSkKKwlhZGRsCTY0KCVlc3ApLCVlY3gKKwlhZGNsCTY4KCVlc3ApLCVlZHgKKwltb3ZsCSVlY3gsNTYoJWVzaSkKKwltb3ZsCSVlZHgsNjAoJWVzaSkKKwlhZGRsCSQ4NDAsJWVzcAorCXN1YmwJJDY0MCwlZWJwCisJY21wbAk4KCVlc3ApLCVlZGkKKwlqYgkuTDAwMmxvb3BfeDg2CisJbW92bAkxMiglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuYWxpZ24JNjQKKy5MMDAxSzUxMjoKKy5sb25nCTM2MDk3Njc0NTgsMTExNjM1MjQwOAorLmxvbmcJNjAyODkxNzI1LDE4OTk0NDc0NDEKKy5sb25nCTM5NjQ0ODQzOTksMzA0OTMyMzQ3MQorLmxvbmcJMjE3MzI5NTU0OCwzOTIxMDA5NTczCisubG9uZwk0MDgxNjI4NDcyLDk2MTk4NzE2MworLmxvbmcJMzA1MzgzNDI2NSwxNTA4OTcwOTkzCisubG9uZwkyOTM3NjcxNTc5LDI0NTM2MzU3NDgKKy5sb25nCTM2NjQ2MDk1NjAsMjg3MDc2MzIyMQorLmxvbmcJMjczNDg4MzM5NCwzNjI0MzgxMDgwCisubG9uZwkxMTY0OTk2NTQyLDMxMDU5ODQwMQorLmxvbmcJMTMyMzYxMDc2NCw2MDcyMjUyNzgKKy5sb25nCTM1OTAzMDQ5OTQsMTQyNjg4MTk4NworLmxvbmcJNDA2ODE4MjM4MywxOTI1MDc4Mzg4CisubG9uZwk5OTEzMzYxMTMsMjE2MjA3ODIwNgorLmxvbmcJNjMzODAzMzE3LDI2MTQ4ODgxMDMKKy5sb25nCTM0Nzk3NzQ4NjgsMzI0ODIyMjU4MAorLmxvbmcJMjY2NjYxMzQ1OCwzODM1MzkwNDAxCisubG9uZwk5NDQ3MTExMzksNDAyMjIyNDc3NAorLmxvbmcJMjM0MTI2Mjc3MywyNjQzNDcwNzgKKy5sb25nCTIwMDc4MDA5MzMsNjA0ODA3NjI4CisubG9uZwkxNDk1OTkwOTAxLDc3MDI1NTk4MworLmxvbmcJMTg1NjQzMTIzNSwxMjQ5MTUwMTIyCisubG9uZwkzMTc1MjE4MTMyLDE1NTUwODE2OTIKKy5sb25nCTIxOTg5NTA4MzcsMTk5NjA2NDk4NgorLmxvbmcJMzk5OTcxOTMzOSwyNTU0MjIwODgyCisubG9uZwk3NjY3ODQwMTYsMjgyMTgzNDM0OQorLmxvbmcJMjU2NjU5NDg3OSwyOTUyOTk2ODA4CisubG9uZwkzMjAzMzM3OTU2LDMyMTAzMTM2NzEKKy5sb25nCTEwMzQ0NTcwMjYsMzMzNjU3MTg5MQorLmxvbmcJMjQ2Njk0ODkwMSwzNTg0NTI4NzExCisubG9uZwkzNzU4MzI2MzgzLDExMzkyNjk5MworLmxvbmcJMTY4NzE3OTM2LDMzODI0MTg5NQorLmxvbmcJMTE4ODE3OTk2NCw2NjYzMDcyMDUKKy5sb25nCTE1NDYwNDU3MzQsNzczNTI5OTEyCisubG9uZwkxNTIyODA1NDg1LDEyOTQ3NTczNzIKKy5sb25nCTI2NDM4MzM4MjMsMTM5NjE4MjI5MQorLmxvbmcJMjM0MzUyNzM5MCwxNjk1MTgzNzAwCisubG9uZwkxMDE0NDc3NDgwLDE5ODY2NjEwNTEKKy5sb25nCTEyMDY3NTkxNDIsMjE3NzAyNjM1MAorLmxvbmcJMzQ0MDc3NjI3LDI0NTY5NTYwMzcKKy5sb25nCTEyOTA4NjM0NjAsMjczMDQ4NTkyMQorLmxvbmcJMzE1ODQ1NDI3MywyODIwMzAyNDExCisubG9uZwkzNTA1OTUyNjU3LDMyNTk3MzA4MDAKKy5sb25nCTEwNjIxNzAwOCwzMzQ1NzY0NzcxCisubG9uZwkzNjA2MDA4MzQ0LDM1MTYwNjU4MTcKKy5sb25nCTE0MzI3MjU3NzYsMzYwMDM1MjgwNAorLmxvbmcJMTQ2NzAzMTU5NCw0MDk0NTcxOTA5CisubG9uZwk4NTExNjk3MjAsMjc1NDIzMzQ0CisubG9uZwkzMTAwODIzNzUyLDQzMDIyNzczNAorLmxvbmcJMTM2MzI1ODE5NSw1MDY5NDg2MTYKKy5sb25nCTM3NTA2ODU1OTMsNjU5MDYwNTU2CisubG9uZwkzNzg1MDUwMjgwLDg4Mzk5Nzg3NworLmxvbmcJMzMxODMwNzQyNyw5NTgxMzk1NzEKKy5sb25nCTM4MTI3MjM0MDMsMTMyMjgyMjIxOAorLmxvbmcJMjAwMzAzNDk5NSwxNTM3MDAyMDYzCisubG9uZwkzNjAyMDM2ODk5LDE3NDc4NzM3NzkKKy5sb25nCTE1NzU5OTAwMTIsMTk1NTU2MjIyMgorLmxvbmcJMTEyNTU5MjkyOCwyMDI0MTA0ODE1CisubG9uZwkyNzE2OTA0MzA2LDIyMjc3MzA0NTIKKy5sb25nCTQ0Mjc3NjA0NCwyMzYxODUyNDI0CisubG9uZwk1OTM2OTgzNDQsMjQyODQzNjQ3NAorLmxvbmcJMzczMzExMDI0OSwyNzU2NzM0MTg3CisubG9uZwkyOTk5MzUxNTczLDMyMDQwMzE0NzkKKy5sb25nCTM4MTU5MjA0MjcsMzMyOTMyNTI5OAorLmxvbmcJMzkyODM4MzkwMCwzMzkxNTY5NjE0CisubG9uZwk1NjYyODA3MTEsMzUxNTI2NzI3MQorLmxvbmcJMzQ1NDA2OTUzNCwzOTQwMTg3NjA2CisubG9uZwk0MDAwMjM5OTkyLDQxMTg2MzAyNzEKKy5sb25nCTE5MTQxMzg1NTQsMTE2NDE4NDc0CisubG9uZwkyNzMxMDU1MjcwLDE3NDI5MjQyMQorLmxvbmcJMzIwMzk5MzAwNiwyODkzODAzNTYKKy5sb25nCTMyMDYyMDMxNSw0NjAzOTMyNjkKKy5sb25nCTU4NzQ5NjgzNiw2ODU0NzE3MzMKKy5sb25nCTEwODY3OTI4NTEsODUyMTQyOTcxCisubG9uZwkzNjU1NDMxMDAsMTAxNzAzNjI5OAorLmxvbmcJMjYxODI5NzY3NiwxMTI2MDAwNTgwCisubG9uZwkzNDA5ODU1MTU4LDEyODgwMzM0NzAKKy5sb25nCTQyMzQ1MDk4NjYsMTUwMTUwNTk0OAorLmxvbmcJOTg3MTY3NDY4LDE2MDcxNjc5MTUKKy5sb25nCTEyNDYxODk1OTEsMTgxNjQwMjMxNgorLmxvbmcJNjc0MzgwODcsNjYwNTEKKy5sb25nCTIwMjE4MjE1OSwxMzQ4MTAxMjMKKy5zaXplCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyLC4tLkxfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYmVnaW4KKy5ieXRlCTgzLDcyLDY1LDUzLDQ5LDUwLDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcKKy5ieXRlCTExMCwxMTUsMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw0NCwzMgorLmJ5dGUJNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3CisuYnl0ZQkxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzCisuYnl0ZQk2MiwwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvdnBhZXMteDg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxN2I3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5TCkBAIC0wLDAgKzEsNjc1IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisuYWxpZ24JNjQKKy5MX3ZwYWVzX2NvbnN0czoKKy5sb25nCTIxODYyODQ4MCwyMzUyMTAyNTUsMTY4NDk2MTMwLDY3NTY4MzkzCisubG9uZwkyNTIzODEwNTYsMTcwNDE5MjYsMzM4ODQxNjksNTExODcyMTIKKy5sb25nCTI1MjY0NTEzNSwyNTI2NDUxMzUsMjUyNjQ1MTM1LDI1MjY0NTEzNQorLmxvbmcJMTUxMjczMDYyNCwzMjY2NTA0ODU2LDEzNzc5OTA2NjQsMzQwMTI0NDgxNgorLmxvbmcJODMwMjI5NzYwLDEyNzUxNDYzNjUsMjk2OTQyMjk3NywzNDQ3NzYzNDUyCisubG9uZwkzNDExMDMzNjAwLDI5Nzk3ODMwNTUsMzM4MzU5NjIwLDI3ODI4ODY1MTAKKy5sb25nCTQyMDkxMjQwOTYsOTA3NTk2ODIxLDIyMTE3NDI1NSwxMDA2MDk1NTUzCisubG9uZwkxOTE5NjQxNjAsMzc5OTY4NDAzOCwzMTY0MDkwMzE3LDE1ODkxMTExMjUKKy5sb25nCTE4MjUyODI1NiwxNzc3MDQzNTIwLDI4Nzc0MzI2NTAsMzI2NTM1Njc0NAorLmxvbmcJMTg3NDcwODIyNCwzNTAzNDUxNDE1LDMzMDUyODU3NTIsMzYzNTExNjc0CisubG9uZwkxNjA2MTE3ODg4LDM0ODc4NTU3ODEsMTA5MzM1MDkwNiwyMzg0MzY3ODI1CisubG9uZwkxOTcxMjEsNjc1NjkxNTcsMTM0OTQxMTkzLDIwMjMxMzIyOQorLmxvbmcJNjc1NjkxNTcsMTM0OTQxMTkzLDIwMjMxMzIyOSwxOTcxMjEKKy5sb25nCTEzNDk0MTE5MywyMDIzMTMyMjksMTk3MTIxLDY3NTY5MTU3CisubG9uZwkyMDIzMTMyMjksMTk3MTIxLDY3NTY5MTU3LDEzNDk0MTE5MworLmxvbmcJMzM2MTk5NzEsMTAwOTkyMDA3LDE2ODM2NDA0MywyMzU3MzYwNzkKKy5sb25nCTIzNTczNjA3OSwzMzYxOTk3MSwxMDA5OTIwMDcsMTY4MzY0MDQzCisubG9uZwkxNjgzNjQwNDMsMjM1NzM2MDc5LDMzNjE5OTcxLDEwMDk5MjAwNworLmxvbmcJMTAwOTkyMDA3LDE2ODM2NDA0MywyMzU3MzYwNzksMzM2MTk5NzEKKy5sb25nCTUwNDYyOTc2LDExNzgzNTAxMiwxODUyMDcwNDgsMjUyNTc5MDg0CisubG9uZwkyNTIzMTQ4ODAsNTEyNTE0NjAsMTE3NTc0OTIwLDE4NDk0Mjg2MAorLmxvbmcJMTg0NjgyNzUyLDI1MjA1NDc4OCw1MDk4NzI3MiwxMTgzNTkzMDgKKy5sb25nCTExODA5OTIwMCwxODU0NjcxNDAsMjUxNzkwNjAwLDUwNzI3MTgwCisubG9uZwkyOTQ2MzYzMDYyLDUyODcxNjIxNywxMzAwMDA0MjI1LDE4ODE4Mzk2MjQKKy5sb25nCTE1MzI3MTM4MTksMTUzMjcxMzgxOSwxNTMyNzEzODE5LDE1MzI3MTM4MTkKKy5sb25nCTM2MDIyNzYzNTIsNDI4ODYyOTAzMywzNzM3MDIwNDI0LDQxNTM4ODQ5NjEKKy5sb25nCTEzNTQ1NTg0NjQsMzIzNTc3MTMsMjk1ODgyMjYyNCwzNzc1NzQ5NTUzCisubG9uZwkxMjAxOTg4MzUyLDEzMjQyNDUxMiwxNTcyNzk2Njk4LDUwMzIzMjg1OAorLmxvbmcJMjIxMzE3NzYwMCwxNTk3NDIxMDIwLDQxMDM5Mzc2NTUsNjc1Mzk4MzE1CisubG9uZwkyNzQ5NjQ2NTkyLDQyNzM1NDM3NzMsMTUxMTg5ODg3MywxMjE2OTMwOTIKKy5sb25nCTMwNDAyNDg1NzYsMTEwMzI2MzczMiwyODcxNTY1NTk4LDE2MDgyODA1NTQKKy5sb25nCTIyMzY2NjcxMzYsMjU4ODkyMDM1MSw0ODI5NTQzOTMsNjQzNzc3MzQKKy5sb25nCTMwNjk5ODczMjgsMjkxMjM3Mjg3LDIxMTczNzA1NjgsMzY1MDI5OTI0NworLmxvbmcJNTMzMzIxMjE2LDM1NzM3NTA5ODYsMjU3MjExMjAwNiwxNDAxMjY0NzE2CisubG9uZwkxMzM5ODQ5NzA0LDI3MjExNTg2NjEsNTQ4NjA3MTExLDM0NDU1NTM1MTQKKy5sb25nCTIxMjgxOTMyODAsMzA1NDU5NjA0MCwyMTgzNDg2NDYwLDEyNTcwODM3MDAKKy5sb25nCTY1NTYzNTIwMCwxMTY1MzgxOTg2LDM5MjM0NDMxNTAsMjM0NDEzMjUyNAorLmxvbmcJMTkwMDc4NzIwLDI1NjkyNDQyMCwyOTAzNDIxNzAsMzU3MTg3ODcwCisubG9uZwkxNjEwOTY2MjcyLDIyNjMwNTczODIsNDEwMzIwNTI2OCwzMDk3OTQ2NzQKKy5sb25nCTI1OTI1Mjc4NzIsMjIzMzIwNTU4NywxMzM1NDQ2NzI5LDM0MDI5NjQ4MTYKKy5sb25nCTM5NzM1MzE5MDQsMzIyNTA5ODEyMSwzMDAyODM2MzI1LDE5MTg3NzQ0MzAKKy5sb25nCTM4NzA0MDEwMjQsMjEwMjkwNjA3OSwyMjg0NDcxMzUzLDQxMTc2NjY1NzkKKy5sb25nCTYxNzAwNzg3MiwxMDIxNTA4MzQzLDM2NjkzMTkyMyw2OTEwODMyNzcKKy5sb25nCTI1MjgzOTU3NzYsMzQ5MTkxNDg5OCwyOTY4NzA0MDA0LDE2MTMxMjEyNzAKKy5sb25nCTM0NDUxODgzNTIsMzI0Nzc0MTA5NCw4NDQ0NzQ5ODcsNDA5MzU3ODMwMgorLmxvbmcJNjUxNDgxMDg4LDExOTAzMDIzNTgsMTY4OTU4MTIzMiw1NzQ3NzUzMDAKKy5sb25nCTQyODkzODA2MDgsMjA2OTM5ODUzLDI1NTU5ODU0NTgsMjQ4OTg0MDQ5MQorLmxvbmcJMjEzMDI2NDA2NCwzMjc2NzQ0NTEsMzU2NjQ4NTAzNywzMzQ5ODM1MTkzCisubG9uZwkyNDcwNzE0NjI0LDMxNjEwMjE1OSwzNjM2ODI1NzU2LDMzOTM5NDU5NDUKKy5ieXRlCTg2LDEwMSw5OSwxMTYsMTExLDExNCwzMiw4MCwxMDEsMTE0LDEwOSwxMTcsMTE2LDk3LDExNiwxMDUKKy5ieXRlCTExMSwxMTAsMzIsNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDQ3LDgzCisuYnl0ZQk4Myw4Myw2OSw1MSw0NCwzMiw3NywxMDUsMTA3LDEwMSwzMiw3Miw5NywxMDksOTgsMTE3CisuYnl0ZQkxMTQsMTAzLDMyLDQwLDgzLDExNiw5NywxMTAsMTAyLDExMSwxMTQsMTAwLDMyLDg1LDExMCwxMDUKKy5ieXRlCTExOCwxMDEsMTE0LDExNSwxMDUsMTE2LDEyMSw0MSwwCisuYWxpZ24JNjQKKy5oaWRkZW4JX3ZwYWVzX3ByZWhlYXQKKy50eXBlCV92cGFlc19wcmVoZWF0LEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfcHJlaGVhdDoKKwlhZGRsCSglZXNwKSwlZWJwCisJbW92ZHFhCS00OCglZWJwKSwleG1tNworCW1vdmRxYQktMTYoJWVicCksJXhtbTYKKwlyZXQKKy5zaXplCV92cGFlc19wcmVoZWF0LC4tX3ZwYWVzX3ByZWhlYXQKKy5oaWRkZW4JX3ZwYWVzX2VuY3J5cHRfY29yZQorLnR5cGUJX3ZwYWVzX2VuY3J5cHRfY29yZSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3ZwYWVzX2VuY3J5cHRfY29yZToKKwltb3ZsCSQxNiwlZWN4CisJbW92bAkyNDAoJWVkeCksJWVheAorCW1vdmRxYQkleG1tNiwleG1tMQorCW1vdmRxYQkoJWVicCksJXhtbTIKKwlwYW5kbgkleG1tMCwleG1tMQorCXBhbmQJJXhtbTYsJXhtbTAKKwltb3ZkcXUJKCVlZHgpLCV4bW01CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwltb3ZkcWEJMTYoJWVicCksJXhtbTAKKwlweG9yCSV4bW01LCV4bW0yCisJcHNybGQJJDQsJXhtbTEKKwlhZGRsCSQxNiwlZWR4CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlsZWFsCTE5MiglZWJwKSwlZWJ4CisJcHhvcgkleG1tMiwleG1tMAorCWptcAkuTDAwMGVuY19lbnRyeQorLmFsaWduCTE2CisuTDAwMWVuY19sb29wOgorCW1vdmRxYQkzMiglZWJwKSwleG1tNAorCW1vdmRxYQk0OCglZWJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTUKKwlweG9yCSV4bW01LCV4bW00CisJbW92ZHFhCTY0KCVlYnApLCV4bW01CisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQktNjQoJWVieCwlZWN4LDEpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzQKKwltb3ZkcWEJODAoJWVicCksJXhtbTIKKwltb3ZkcWEJKCVlYngsJWVjeCwxKSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjExCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tNSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJYWRkbAkkMTYsJWVkeAorCXB4b3IJJXhtbTIsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMAorCWFkZGwJJDE2LCVlY3gKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlhbmRsCSQ0OCwlZWN4CisJc3VibAkkMSwlZWF4CisJcHhvcgkleG1tMywleG1tMAorLkwwMDBlbmNfZW50cnk6CisJbW92ZHFhCSV4bW02LCV4bW0xCisJbW92ZHFhCS0zMiglZWJwKSwleG1tNQorCXBhbmRuCSV4bW0wLCV4bW0xCisJcHNybGQJJDQsJXhtbTEKKwlwYW5kCSV4bW02LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzIKKwltb3ZkcWEJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcWEJJXhtbTcsJXhtbTQKKwlweG9yCSV4bW01LCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjQKKwltb3ZkcWEJJXhtbTcsJXhtbTIKKwlweG9yCSV4bW01LCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwltb3ZkcWEJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjAKKwltb3ZkcXUJKCVlZHgpLCV4bW01CisJcHhvcgkleG1tMSwleG1tMworCWpuegkuTDAwMWVuY19sb29wCisJbW92ZHFhCTk2KCVlYnApLCV4bW00CisJbW92ZHFhCTExMiglZWJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisJcHhvcgkleG1tNSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMTk1CisJbW92ZHFhCTY0KCVlYngsJWVjeCwxKSwleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCXJldAorLnNpemUJX3ZwYWVzX2VuY3J5cHRfY29yZSwuLV92cGFlc19lbmNyeXB0X2NvcmUKKy5oaWRkZW4JX3ZwYWVzX2RlY3J5cHRfY29yZQorLnR5cGUJX3ZwYWVzX2RlY3J5cHRfY29yZSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3ZwYWVzX2RlY3J5cHRfY29yZToKKwlsZWFsCTYwOCglZWJwKSwlZWJ4CisJbW92bAkyNDAoJWVkeCksJWVheAorCW1vdmRxYQkleG1tNiwleG1tMQorCW1vdmRxYQktNjQoJWVieCksJXhtbTIKKwlwYW5kbgkleG1tMCwleG1tMQorCW1vdmwJJWVheCwlZWN4CisJcHNybGQJJDQsJXhtbTEKKwltb3ZkcXUJKCVlZHgpLCV4bW01CisJc2hsbAkkNCwlZWN4CisJcGFuZAkleG1tNiwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCS00OCglZWJ4KSwleG1tMAorCXhvcmwJJDQ4LCVlY3gKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCWFuZGwJJDQ4LCVlY3gKKwlweG9yCSV4bW01LCV4bW0yCisJbW92ZHFhCTE3NiglZWJwKSwleG1tNQorCXB4b3IJJXhtbTIsJXhtbTAKKwlhZGRsCSQxNiwlZWR4CisJbGVhbAktMzUyKCVlYngsJWVjeCwxKSwlZWN4CisJam1wCS5MMDAyZGVjX2VudHJ5CisuYWxpZ24JMTYKKy5MMDAzZGVjX2xvb3A6CisJbW92ZHFhCS0zMiglZWJ4KSwleG1tNAorCW1vdmRxYQktMTYoJWVieCksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorLmJ5dGUJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQkoJWVieCksJXhtbTQKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCTE2KCVlYngpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQkzMiglZWJ4KSwleG1tNAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJNDgoJWVieCksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDMKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCTY0KCVlYngpLCV4bW00CisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQk4MCglZWJ4KSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMworCXB4b3IJJXhtbTQsJXhtbTAKKwlhZGRsCSQxNiwlZWR4CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDEyCisJcHhvcgkleG1tMSwleG1tMAorCXN1YmwJJDEsJWVheAorLkwwMDJkZWNfZW50cnk6CisJbW92ZHFhCSV4bW02LCV4bW0xCisJbW92ZHFhCS0zMiglZWJwKSwleG1tMgorCXBhbmRuCSV4bW0wLCV4bW0xCisJcGFuZAkleG1tNiwleG1tMAorCXBzcmxkCSQ0LCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwltb3ZkcWEJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcWEJJXhtbTcsJXhtbTQKKwlweG9yCSV4bW0yLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjQKKwlweG9yCSV4bW0yLCV4bW00CisJbW92ZHFhCSV4bW03LCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwltb3ZkcWEJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjAKKwltb3ZkcXUJKCVlZHgpLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMworCWpuegkuTDAwM2RlY19sb29wCisJbW92ZHFhCTk2KCVlYngpLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHFhCTExMiglZWJ4KSwleG1tMAorCW1vdmRxYQkoJWVjeCksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NQorCXB4b3IJJXhtbTQsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NAorCXJldAorLnNpemUJX3ZwYWVzX2RlY3J5cHRfY29yZSwuLV92cGFlc19kZWNyeXB0X2NvcmUKKy5oaWRkZW4JX3ZwYWVzX3NjaGVkdWxlX2NvcmUKKy50eXBlCV92cGFlc19zY2hlZHVsZV9jb3JlLEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfY29yZToKKwlhZGRsCSglZXNwKSwlZWJwCisJbW92ZHF1CSglZXNpKSwleG1tMAorCW1vdmRxYQkzMjAoJWVicCksJXhtbTIKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlsZWFsCSglZWJwKSwlZWJ4CisJbW92ZHFhCSV4bW0yLDQoJWVzcCkKKwljYWxsCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwl0ZXN0bAklZWRpLCVlZGkKKwlqbnoJLkwwMDRzY2hlZHVsZV9hbV9kZWNyeXB0aW5nCisJbW92ZHF1CSV4bW0wLCglZWR4KQorCWptcAkuTDAwNXNjaGVkdWxlX2dvCisuTDAwNHNjaGVkdWxlX2FtX2RlY3J5cHRpbmc6CisJbW92ZHFhCTI1NiglZWJwLCVlY3gsMSksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCW1vdmRxdQkleG1tMywoJWVkeCkKKwl4b3JsCSQ0OCwlZWN4CisuTDAwNXNjaGVkdWxlX2dvOgorCWNtcGwJJDE5MiwlZWF4CisJamEJLkwwMDZzY2hlZHVsZV8yNTYKKwlqZQkuTDAwN3NjaGVkdWxlXzE5MgorLkwwMDhzY2hlZHVsZV8xMjg6CisJbW92bAkkMTAsJWVheAorLkwwMDlsb29wX3NjaGVkdWxlXzEyODoKKwljYWxsCV92cGFlc19zY2hlZHVsZV9yb3VuZAorCWRlY2wJJWVheAorCWp6CS5MMDEwc2NoZWR1bGVfbWFuZ2xlX2xhc3QKKwljYWxsCV92cGFlc19zY2hlZHVsZV9tYW5nbGUKKwlqbXAJLkwwMDlsb29wX3NjaGVkdWxlXzEyOAorLmFsaWduCTE2CisuTDAwN3NjaGVkdWxlXzE5MjoKKwltb3ZkcXUJOCglZXNpKSwleG1tMAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmRxYQkleG1tMCwleG1tNgorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3ZobHBzCSV4bW00LCV4bW02CisJbW92bAkkNCwlZWF4CisuTDAxMWxvb3Bfc2NoZWR1bGVfMTkyOgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisuYnl0ZQkxMDIsMTUsNTgsMTUsMTk4LDgKKwljYWxsCV92cGFlc19zY2hlZHVsZV9tYW5nbGUKKwljYWxsCV92cGFlc19zY2hlZHVsZV8xOTJfc21lYXIKKwljYWxsCV92cGFlc19zY2hlZHVsZV9tYW5nbGUKKwljYWxsCV92cGFlc19zY2hlZHVsZV9yb3VuZAorCWRlY2wJJWVheAorCWp6CS5MMDEwc2NoZWR1bGVfbWFuZ2xlX2xhc3QKKwljYWxsCV92cGFlc19zY2hlZHVsZV9tYW5nbGUKKwljYWxsCV92cGFlc19zY2hlZHVsZV8xOTJfc21lYXIKKwlqbXAJLkwwMTFsb29wX3NjaGVkdWxlXzE5MgorLmFsaWduCTE2CisuTDAwNnNjaGVkdWxlXzI1NjoKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTAKKwljYWxsCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZsCSQ3LCVlYXgKKy5MMDEybG9vcF9zY2hlZHVsZV8yNTY6CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJbW92ZHFhCSV4bW0wLCV4bW02CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWNsCSVlYXgKKwlqegkuTDAxMHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJcHNodWZkCSQyNTUsJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTcsMjAoJWVzcCkKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwljYWxsCS5MX3ZwYWVzX3NjaGVkdWxlX2xvd19yb3VuZAorCW1vdmRxYQkyMCglZXNwKSwleG1tNworCWptcAkuTDAxMmxvb3Bfc2NoZWR1bGVfMjU2CisuYWxpZ24JMTYKKy5MMDEwc2NoZWR1bGVfbWFuZ2xlX2xhc3Q6CisJbGVhbAkzODQoJWVicCksJWVieAorCXRlc3RsCSVlZGksJWVkaQorCWpuegkuTDAxM3NjaGVkdWxlX21hbmdsZV9sYXN0X2RlYworCW1vdmRxYQkyNTYoJWVicCwlZWN4LDEpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlsZWFsCTM1MiglZWJwKSwlZWJ4CisJYWRkbAkkMzIsJWVkeAorLkwwMTNzY2hlZHVsZV9tYW5nbGVfbGFzdF9kZWM6CisJYWRkbAkkLTE2LCVlZHgKKwlweG9yCTMzNiglZWJwKSwleG1tMAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmRxdQkleG1tMCwoJWVkeCkKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW02LCV4bW02CisJcHhvcgkleG1tNywleG1tNworCXJldAorLnNpemUJX3ZwYWVzX3NjaGVkdWxlX2NvcmUsLi1fdnBhZXNfc2NoZWR1bGVfY29yZQorLmhpZGRlbglfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyCisudHlwZQlfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyLEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyOgorCXBzaHVmZAkkMTI4LCV4bW02LCV4bW0xCisJcHNodWZkCSQyNTQsJXhtbTcsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW02CisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwltb3ZobHBzCSV4bW0xLCV4bW02CisJcmV0Cisuc2l6ZQlfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyLC4tX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcgorLmhpZGRlbglfdnBhZXNfc2NoZWR1bGVfcm91bmQKKy50eXBlCV92cGFlc19zY2hlZHVsZV9yb3VuZCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3ZwYWVzX3NjaGVkdWxlX3JvdW5kOgorCW1vdmRxYQk4KCVlc3ApLCV4bW0yCisJcHhvcgkleG1tMSwleG1tMQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIwMiwxNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIxMCwxNQorCXB4b3IJJXhtbTEsJXhtbTcKKwlwc2h1ZmQJJDI1NSwleG1tMCwleG1tMAorLmJ5dGUJMTAyLDE1LDU4LDE1LDE5MiwxCisJbW92ZHFhCSV4bW0yLDgoJWVzcCkKKy5MX3ZwYWVzX3NjaGVkdWxlX2xvd19yb3VuZDoKKwltb3ZkcWEJJXhtbTcsJXhtbTEKKwlwc2xsZHEJJDQsJXhtbTcKKwlweG9yCSV4bW0xLCV4bW03CisJbW92ZHFhCSV4bW03LCV4bW0xCisJcHNsbGRxCSQ4LCV4bW03CisJcHhvcgkleG1tMSwleG1tNworCXB4b3IJMzM2KCVlYnApLCV4bW03CisJbW92ZHFhCS0xNiglZWJwKSwleG1tNAorCW1vdmRxYQktNDgoJWVicCksJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMCwleG1tMQorCXBzcmxkCSQ0LCV4bW0xCisJcGFuZAkleG1tNCwleG1tMAorCW1vdmRxYQktMzIoJWVicCksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJJXhtbTIsJXhtbTMKKwltb3ZkcWEJJXhtbTUsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNAorCXB4b3IJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMQorCXB4b3IJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMAorCXB4b3IJJXhtbTEsJXhtbTMKKwltb3ZkcWEJMzIoJWVicCksJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorCW1vdmRxYQk0OCglZWJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTk1CisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwlyZXQKKy5zaXplCV92cGFlc19zY2hlZHVsZV9yb3VuZCwuLV92cGFlc19zY2hlZHVsZV9yb3VuZAorLmhpZGRlbglfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtCisudHlwZQlfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtLEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtOgorCW1vdmRxYQktMTYoJWVicCksJXhtbTIKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwlwYW5kbgkleG1tMCwleG1tMQorCXBzcmxkCSQ0LCV4bW0xCisJcGFuZAkleG1tMiwleG1tMAorCW1vdmRxYQkoJWVieCksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQkxNiglZWJ4KSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJcHhvcgkleG1tMiwleG1tMAorCXJldAorLnNpemUJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybSwuLV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKy5oaWRkZW4JX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorLnR5cGUJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3ZwYWVzX3NjaGVkdWxlX21hbmdsZToKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJMTI4KCVlYnApLCV4bW01CisJdGVzdGwJJWVkaSwlZWRpCisJam56CS5MMDE0c2NoZWR1bGVfbWFuZ2xlX2RlYworCWFkZGwJJDE2LCVlZHgKKwlweG9yCTMzNiglZWJwKSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjI5CisJbW92ZHFhCSV4bW00LCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjkKKwlweG9yCSV4bW00LCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjkKKwlweG9yCSV4bW00LCV4bW0zCisJam1wCS5MMDE1c2NoZWR1bGVfbWFuZ2xlX2JvdGgKKy5hbGlnbgkxNgorLkwwMTRzY2hlZHVsZV9tYW5nbGVfZGVjOgorCW1vdmRxYQktMTYoJWVicCksJXhtbTIKKwlsZWFsCTQxNiglZWJwKSwlZXNpCisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcGFuZG4JJXhtbTQsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTIsJXhtbTQKKwltb3ZkcWEJKCVlc2kpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTIKKwltb3ZkcWEJMTYoJWVzaSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJJXhtbTIsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMQorCW1vdmRxYQkzMiglZXNpKSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjEyCisJcHhvcgkleG1tMywleG1tMgorCW1vdmRxYQk0OCglZXNpKSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgkleG1tMiwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIxCisJbW92ZHFhCTY0KCVlc2kpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTIKKwlweG9yCSV4bW0zLCV4bW0yCisJbW92ZHFhCTgwKCVlc2kpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCSV4bW0yLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjEKKwltb3ZkcWEJOTYoJWVzaSksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcWEJMTEyKCVlc2kpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCSV4bW0yLCV4bW0zCisJYWRkbAkkLTE2LCVlZHgKKy5MMDE1c2NoZWR1bGVfbWFuZ2xlX2JvdGg6CisJbW92ZHFhCTI1NiglZWJwLCVlY3gsMSksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCWFkZGwJJC0xNiwlZWN4CisJYW5kbAkkNDgsJWVjeAorCW1vdmRxdQkleG1tMywoJWVkeCkKKwlyZXQKKy5zaXplCV92cGFlc19zY2hlZHVsZV9tYW5nbGUsLi1fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisuZ2xvYmwJdnBhZXNfc2V0X2VuY3J5cHRfa2V5CisuaGlkZGVuCXZwYWVzX3NldF9lbmNyeXB0X2tleQorLnR5cGUJdnBhZXNfc2V0X2VuY3J5cHRfa2V5LEBmdW5jdGlvbgorLmFsaWduCTE2Cit2cGFlc19zZXRfZW5jcnlwdF9rZXk6CisuTF92cGFlc19zZXRfZW5jcnlwdF9rZXlfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCWxlYWwJLTU2KCVlc3ApLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlYXgKKwlhbmRsCSQtMTYsJWVieAorCW1vdmwJMjgoJWVzcCksJWVkeAorCXhjaGdsCSVlc3AsJWVieAorCW1vdmwJJWVieCw0OCglZXNwKQorCW1vdmwJJWVheCwlZWJ4CisJc2hybAkkNSwlZWJ4CisJYWRkbAkkNSwlZWJ4CisJbW92bAklZWJ4LDI0MCglZWR4KQorCW1vdmwJJDQ4LCVlY3gKKwltb3ZsCSQwLCVlZGkKKwlsZWFsCS5MX3ZwYWVzX2NvbnN0cysweDMwLS5MMDE2cGljX3BvaW50LCVlYnAKKwljYWxsCV92cGFlc19zY2hlZHVsZV9jb3JlCisuTDAxNnBpY19wb2ludDoKKwltb3ZsCTQ4KCVlc3ApLCVlc3AKKwl4b3JsCSVlYXgsJWVheAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNpemUJdnBhZXNfc2V0X2VuY3J5cHRfa2V5LC4tLkxfdnBhZXNfc2V0X2VuY3J5cHRfa2V5X2JlZ2luCisuZ2xvYmwJdnBhZXNfc2V0X2RlY3J5cHRfa2V5CisuaGlkZGVuCXZwYWVzX3NldF9kZWNyeXB0X2tleQorLnR5cGUJdnBhZXNfc2V0X2RlY3J5cHRfa2V5LEBmdW5jdGlvbgorLmFsaWduCTE2Cit2cGFlc19zZXRfZGVjcnlwdF9rZXk6CisuTF92cGFlc19zZXRfZGVjcnlwdF9rZXlfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCWxlYWwJLTU2KCVlc3ApLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlYXgKKwlhbmRsCSQtMTYsJWVieAorCW1vdmwJMjgoJWVzcCksJWVkeAorCXhjaGdsCSVlc3AsJWVieAorCW1vdmwJJWVieCw0OCglZXNwKQorCW1vdmwJJWVheCwlZWJ4CisJc2hybAkkNSwlZWJ4CisJYWRkbAkkNSwlZWJ4CisJbW92bAklZWJ4LDI0MCglZWR4KQorCXNobGwJJDQsJWVieAorCWxlYWwJMTYoJWVkeCwlZWJ4LDEpLCVlZHgKKwltb3ZsCSQxLCVlZGkKKwltb3ZsCSVlYXgsJWVjeAorCXNocmwJJDEsJWVjeAorCWFuZGwJJDMyLCVlY3gKKwl4b3JsCSQzMiwlZWN4CisJbGVhbAkuTF92cGFlc19jb25zdHMrMHgzMC0uTDAxN3BpY19wb2ludCwlZWJwCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfY29yZQorLkwwMTdwaWNfcG9pbnQ6CisJbW92bAk0OCglZXNwKSwlZXNwCisJeG9ybAklZWF4LCVlYXgKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCXZwYWVzX3NldF9kZWNyeXB0X2tleSwuLS5MX3ZwYWVzX3NldF9kZWNyeXB0X2tleV9iZWdpbgorLmdsb2JsCXZwYWVzX2VuY3J5cHQKKy5oaWRkZW4JdnBhZXNfZW5jcnlwdAorLnR5cGUJdnBhZXNfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgordnBhZXNfZW5jcnlwdDoKKy5MX3ZwYWVzX2VuY3J5cHRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCWxlYWwJLkxfdnBhZXNfY29uc3RzKzB4MzAtLkwwMThwaWNfcG9pbnQsJWVicAorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKy5MMDE4cGljX3BvaW50OgorCW1vdmwJMjAoJWVzcCksJWVzaQorCWxlYWwJLTU2KCVlc3ApLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwlhbmRsCSQtMTYsJWVieAorCW1vdmwJMjgoJWVzcCksJWVkeAorCXhjaGdsCSVlc3AsJWVieAorCW1vdmwJJWVieCw0OCglZXNwKQorCW1vdmRxdQkoJWVzaSksJXhtbTAKKwljYWxsCV92cGFlc19lbmNyeXB0X2NvcmUKKwltb3ZkcXUJJXhtbTAsKCVlZGkpCisJbW92bAk0OCglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQl2cGFlc19lbmNyeXB0LC4tLkxfdnBhZXNfZW5jcnlwdF9iZWdpbgorLmdsb2JsCXZwYWVzX2RlY3J5cHQKKy5oaWRkZW4JdnBhZXNfZGVjcnlwdAorLnR5cGUJdnBhZXNfZGVjcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgordnBhZXNfZGVjcnlwdDoKKy5MX3ZwYWVzX2RlY3J5cHRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCWxlYWwJLkxfdnBhZXNfY29uc3RzKzB4MzAtLkwwMTlwaWNfcG9pbnQsJWVicAorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKy5MMDE5cGljX3BvaW50OgorCW1vdmwJMjAoJWVzcCksJWVzaQorCWxlYWwJLTU2KCVlc3ApLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwlhbmRsCSQtMTYsJWVieAorCW1vdmwJMjgoJWVzcCksJWVkeAorCXhjaGdsCSVlc3AsJWVieAorCW1vdmwJJWVieCw0OCglZXNwKQorCW1vdmRxdQkoJWVzaSksJXhtbTAKKwljYWxsCV92cGFlc19kZWNyeXB0X2NvcmUKKwltb3ZkcXUJJXhtbTAsKCVlZGkpCisJbW92bAk0OCglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQl2cGFlc19kZWNyeXB0LC4tLkxfdnBhZXNfZGVjcnlwdF9iZWdpbgorLmdsb2JsCXZwYWVzX2NiY19lbmNyeXB0CisuaGlkZGVuCXZwYWVzX2NiY19lbmNyeXB0CisudHlwZQl2cGFlc19jYmNfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgordnBhZXNfY2JjX2VuY3J5cHQ6CisuTF92cGFlc19jYmNfZW5jcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAkyOCglZXNwKSwlZWF4CisJbW92bAkzMiglZXNwKSwlZWR4CisJc3VibAkkMTYsJWVheAorCWpjCS5MMDIwY2JjX2Fib3J0CisJbGVhbAktNTYoJWVzcCksJWVieAorCW1vdmwJMzYoJWVzcCksJWVicAorCWFuZGwJJC0xNiwlZWJ4CisJbW92bAk0MCglZXNwKSwlZWN4CisJeGNoZ2wJJWVzcCwlZWJ4CisJbW92ZHF1CSglZWJwKSwleG1tMQorCXN1YmwJJWVzaSwlZWRpCisJbW92bAklZWJ4LDQ4KCVlc3ApCisJbW92bAklZWRpLCglZXNwKQorCW1vdmwJJWVkeCw0KCVlc3ApCisJbW92bAklZWJwLDgoJWVzcCkKKwltb3ZsCSVlYXgsJWVkaQorCWxlYWwJLkxfdnBhZXNfY29uc3RzKzB4MzAtLkwwMjFwaWNfcG9pbnQsJWVicAorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKy5MMDIxcGljX3BvaW50OgorCWNtcGwJJDAsJWVjeAorCWplCS5MMDIyY2JjX2RlY19sb29wCisJam1wCS5MMDIzY2JjX2VuY19sb29wCisuYWxpZ24JMTYKKy5MMDIzY2JjX2VuY19sb29wOgorCW1vdmRxdQkoJWVzaSksJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0wCisJY2FsbAlfdnBhZXNfZW5jcnlwdF9jb3JlCisJbW92bAkoJWVzcCksJWVieAorCW1vdmwJNCglZXNwKSwlZWR4CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHF1CSV4bW0wLCglZWJ4LCVlc2ksMSkKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwlzdWJsCSQxNiwlZWRpCisJam5jCS5MMDIzY2JjX2VuY19sb29wCisJam1wCS5MMDI0Y2JjX2RvbmUKKy5hbGlnbgkxNgorLkwwMjJjYmNfZGVjX2xvb3A6CisJbW92ZHF1CSglZXNpKSwleG1tMAorCW1vdmRxYQkleG1tMSwxNiglZXNwKQorCW1vdmRxYQkleG1tMCwzMiglZXNwKQorCWNhbGwJX3ZwYWVzX2RlY3J5cHRfY29yZQorCW1vdmwJKCVlc3ApLCVlYngKKwltb3ZsCTQoJWVzcCksJWVkeAorCXB4b3IJMTYoJWVzcCksJXhtbTAKKwltb3ZkcWEJMzIoJWVzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTAsKCVlYngsJWVzaSwxKQorCWxlYWwJMTYoJWVzaSksJWVzaQorCXN1YmwJJDE2LCVlZGkKKwlqbmMJLkwwMjJjYmNfZGVjX2xvb3AKKy5MMDI0Y2JjX2RvbmU6CisJbW92bAk4KCVlc3ApLCVlYngKKwltb3ZsCTQ4KCVlc3ApLCVlc3AKKwltb3ZkcXUJJXhtbTEsKCVlYngpCisuTDAyMGNiY19hYm9ydDoKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zaXplCXZwYWVzX2NiY19lbmNyeXB0LC4tLkxfdnBhZXNfY2JjX2VuY3J5cHRfYmVnaW4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODYvY3J5cHRvL2ZpcHNtb2R1bGUveDg2LW1vbnQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3g4Ni1tb250LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjMjRlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2L2NyeXB0by9maXBzbW9kdWxlL3g4Ni1tb250LlMKQEAgLTAsMCArMSw0NzcgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5nbG9ibAlibl9tdWxfbW9udAorLmhpZGRlbglibl9tdWxfbW9udAorLnR5cGUJYm5fbXVsX21vbnQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2JuX211bF9tb250OgorLkxfYm5fbXVsX21vbnRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXhvcmwJJWVheCwlZWF4CisJbW92bAk0MCglZXNwKSwlZWRpCisJY21wbAkkNCwlZWRpCisJamwJLkwwMDBqdXN0X2xlYXZlCisJbGVhbAkyMCglZXNwKSwlZXNpCisJbGVhbAkyNCglZXNwKSwlZWR4CisJYWRkbAkkMiwlZWRpCisJbmVnbAklZWRpCisJbGVhbAktMzIoJWVzcCwlZWRpLDQpLCVlYnAKKwluZWdsCSVlZGkKKwltb3ZsCSVlYnAsJWVheAorCXN1YmwJJWVkeCwlZWF4CisJYW5kbAkkMjA0NywlZWF4CisJc3VibAklZWF4LCVlYnAKKwl4b3JsCSVlYnAsJWVkeAorCWFuZGwJJDIwNDgsJWVkeAorCXhvcmwJJDIwNDgsJWVkeAorCXN1YmwJJWVkeCwlZWJwCisJYW5kbAkkLTY0LCVlYnAKKwltb3ZsCSVlc3AsJWVheAorCXN1YmwJJWVicCwlZWF4CisJYW5kbAkkLTQwOTYsJWVheAorCW1vdmwJJWVzcCwlZWR4CisJbGVhbAkoJWVicCwlZWF4LDEpLCVlc3AKKwltb3ZsCSglZXNwKSwlZWF4CisJY21wbAklZWJwLCVlc3AKKwlqYQkuTDAwMXBhZ2Vfd2FsaworCWptcAkuTDAwMnBhZ2Vfd2Fsa19kb25lCisuYWxpZ24JMTYKKy5MMDAxcGFnZV93YWxrOgorCWxlYWwJLTQwOTYoJWVzcCksJWVzcAorCW1vdmwJKCVlc3ApLCVlYXgKKwljbXBsCSVlYnAsJWVzcAorCWphCS5MMDAxcGFnZV93YWxrCisuTDAwMnBhZ2Vfd2Fsa19kb25lOgorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWJwCisJbW92bAkxNiglZXNpKSwlZXNpCisJbW92bAkoJWVzaSksJWVzaQorCW1vdmwJJWVheCw0KCVlc3ApCisJbW92bAklZWJ4LDgoJWVzcCkKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCSVlYnAsMTYoJWVzcCkKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwlsZWFsCS0zKCVlZGkpLCVlYngKKwltb3ZsCSVlZHgsMjQoJWVzcCkKKwljYWxsCS5MMDAzUElDX21lX3VwCisuTDAwM1BJQ19tZV91cDoKKwlwb3BsCSVlYXgKKwlsZWFsCU9QRU5TU0xfaWEzMmNhcF9QLS5MMDAzUElDX21lX3VwKCVlYXgpLCVlYXgKKwlidGwJJDI2LCglZWF4KQorCWpuYwkuTDAwNG5vbl9zc2UyCisJbW92bAkkLTEsJWVheAorCW1vdmQJJWVheCwlbW03CisJbW92bAk4KCVlc3ApLCVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlYnAKKwl4b3JsCSVlZHgsJWVkeAorCXhvcmwJJWVjeCwlZWN4CisJbW92ZAkoJWVkaSksJW1tNAorCW1vdmQJKCVlc2kpLCVtbTUKKwltb3ZkCSglZWJwKSwlbW0zCisJcG11bHVkcQklbW00LCVtbTUKKwltb3ZxCSVtbTUsJW1tMgorCW1vdnEJJW1tNSwlbW0wCisJcGFuZAklbW03LCVtbTAKKwlwbXVsdWRxCTIwKCVlc3ApLCVtbTUKKwlwbXVsdWRxCSVtbTUsJW1tMworCXBhZGRxCSVtbTAsJW1tMworCW1vdmQJNCglZWJwKSwlbW0xCisJbW92ZAk0KCVlc2kpLCVtbTAKKwlwc3JscQkkMzIsJW1tMgorCXBzcmxxCSQzMiwlbW0zCisJaW5jbAklZWN4CisuYWxpZ24JMTYKKy5MMDA1MXN0OgorCXBtdWx1ZHEJJW1tNCwlbW0wCisJcG11bHVkcQklbW01LCVtbTEKKwlwYWRkcQklbW0wLCVtbTIKKwlwYWRkcQklbW0xLCVtbTMKKwltb3ZxCSVtbTIsJW1tMAorCXBhbmQJJW1tNywlbW0wCisJbW92ZAk0KCVlYnAsJWVjeCw0KSwlbW0xCisJcGFkZHEJJW1tMCwlbW0zCisJbW92ZAk0KCVlc2ksJWVjeCw0KSwlbW0wCisJcHNybHEJJDMyLCVtbTIKKwltb3ZkCSVtbTMsMjgoJWVzcCwlZWN4LDQpCisJcHNybHEJJDMyLCVtbTMKKwlsZWFsCTEoJWVjeCksJWVjeAorCWNtcGwJJWVieCwlZWN4CisJamwJLkwwMDUxc3QKKwlwbXVsdWRxCSVtbTQsJW1tMAorCXBtdWx1ZHEJJW1tNSwlbW0xCisJcGFkZHEJJW1tMCwlbW0yCisJcGFkZHEJJW1tMSwlbW0zCisJbW92cQklbW0yLCVtbTAKKwlwYW5kCSVtbTcsJW1tMAorCXBhZGRxCSVtbTAsJW1tMworCW1vdmQJJW1tMywyOCglZXNwLCVlY3gsNCkKKwlwc3JscQkkMzIsJW1tMgorCXBzcmxxCSQzMiwlbW0zCisJcGFkZHEJJW1tMiwlbW0zCisJbW92cQklbW0zLDMyKCVlc3AsJWVieCw0KQorCWluY2wJJWVkeAorLkwwMDZvdXRlcjoKKwl4b3JsCSVlY3gsJWVjeAorCW1vdmQJKCVlZGksJWVkeCw0KSwlbW00CisJbW92ZAkoJWVzaSksJW1tNQorCW1vdmQJMzIoJWVzcCksJW1tNgorCW1vdmQJKCVlYnApLCVtbTMKKwlwbXVsdWRxCSVtbTQsJW1tNQorCXBhZGRxCSVtbTYsJW1tNQorCW1vdnEJJW1tNSwlbW0wCisJbW92cQklbW01LCVtbTIKKwlwYW5kCSVtbTcsJW1tMAorCXBtdWx1ZHEJMjAoJWVzcCksJW1tNQorCXBtdWx1ZHEJJW1tNSwlbW0zCisJcGFkZHEJJW1tMCwlbW0zCisJbW92ZAkzNiglZXNwKSwlbW02CisJbW92ZAk0KCVlYnApLCVtbTEKKwltb3ZkCTQoJWVzaSksJW1tMAorCXBzcmxxCSQzMiwlbW0yCisJcHNybHEJJDMyLCVtbTMKKwlwYWRkcQklbW02LCVtbTIKKwlpbmNsCSVlY3gKKwlkZWNsCSVlYngKKy5MMDA3aW5uZXI6CisJcG11bHVkcQklbW00LCVtbTAKKwlwbXVsdWRxCSVtbTUsJW1tMQorCXBhZGRxCSVtbTAsJW1tMgorCXBhZGRxCSVtbTEsJW1tMworCW1vdnEJJW1tMiwlbW0wCisJbW92ZAkzNiglZXNwLCVlY3gsNCksJW1tNgorCXBhbmQJJW1tNywlbW0wCisJbW92ZAk0KCVlYnAsJWVjeCw0KSwlbW0xCisJcGFkZHEJJW1tMCwlbW0zCisJbW92ZAk0KCVlc2ksJWVjeCw0KSwlbW0wCisJcHNybHEJJDMyLCVtbTIKKwltb3ZkCSVtbTMsMjgoJWVzcCwlZWN4LDQpCisJcHNybHEJJDMyLCVtbTMKKwlwYWRkcQklbW02LCVtbTIKKwlkZWNsCSVlYngKKwlsZWFsCTEoJWVjeCksJWVjeAorCWpuegkuTDAwN2lubmVyCisJbW92bAklZWN4LCVlYngKKwlwbXVsdWRxCSVtbTQsJW1tMAorCXBtdWx1ZHEJJW1tNSwlbW0xCisJcGFkZHEJJW1tMCwlbW0yCisJcGFkZHEJJW1tMSwlbW0zCisJbW92cQklbW0yLCVtbTAKKwlwYW5kCSVtbTcsJW1tMAorCXBhZGRxCSVtbTAsJW1tMworCW1vdmQJJW1tMywyOCglZXNwLCVlY3gsNCkKKwlwc3JscQkkMzIsJW1tMgorCXBzcmxxCSQzMiwlbW0zCisJbW92ZAkzNiglZXNwLCVlYngsNCksJW1tNgorCXBhZGRxCSVtbTIsJW1tMworCXBhZGRxCSVtbTYsJW1tMworCW1vdnEJJW1tMywzMiglZXNwLCVlYngsNCkKKwlsZWFsCTEoJWVkeCksJWVkeAorCWNtcGwJJWVieCwlZWR4CisJamxlCS5MMDA2b3V0ZXIKKwllbW1zCisJam1wCS5MMDA4Y29tbW9uX3RhaWwKKy5hbGlnbgkxNgorLkwwMDRub25fc3NlMjoKKwltb3ZsCTgoJWVzcCksJWVzaQorCWxlYWwJMSglZWJ4KSwlZWJwCisJbW92bAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlY3gKKwltb3ZsCSVlc2ksJWVkeAorCWFuZGwJJDEsJWVicAorCXN1YmwJJWVkaSwlZWR4CisJbGVhbAk0KCVlZGksJWVieCw0KSwlZWF4CisJb3JsCSVlZHgsJWVicAorCW1vdmwJKCVlZGkpLCVlZGkKKwlqegkuTDAwOWJuX3Nxcl9tb250CisJbW92bAklZWF4LDI4KCVlc3ApCisJbW92bAkoJWVzaSksJWVheAorCXhvcmwJJWVkeCwlZWR4CisuYWxpZ24JMTYKKy5MMDEwbXVsbDoKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJJWVheCwlZWJwCisJbGVhbAkxKCVlY3gpLCVlY3gKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSglZXNpLCVlY3gsNCksJWVheAorCWNtcGwJJWVieCwlZWN4CisJbW92bAklZWJwLDI4KCVlc3AsJWVjeCw0KQorCWpsCS5MMDEwbXVsbAorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlYXgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwlhZGNsCSQwLCVlZHgKKwlpbXVsbAkzMiglZXNwKSwlZWRpCisJbW92bAklZWF4LDMyKCVlc3AsJWVieCw0KQorCXhvcmwJJWVjeCwlZWN4CisJbW92bAklZWR4LDM2KCVlc3AsJWVieCw0KQorCW1vdmwJJWVjeCw0MCglZXNwLCVlYngsNCkKKwltb3ZsCSglZXNpKSwlZWF4CisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlpbmNsCSVlY3gKKwlqbXAJLkwwMTEybmRtYWRkCisuYWxpZ24JMTYKKy5MMDEyMXN0bWFkZDoKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCwlZWN4LDQpLCVlYnAKKwlsZWFsCTEoJWVjeCksJWVjeAorCWFkY2wJJDAsJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkoJWVzaSwlZWN4LDQpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwljbXBsCSVlYngsJWVjeAorCW1vdmwJJWVicCwyOCglZXNwLCVlY3gsNCkKKwlqbAkuTDAxMjFzdG1hZGQKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCwlZWJ4LDQpLCVlYXgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJDAsJWVkeAorCWltdWxsCTMyKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVjeAorCWFkZGwJMzYoJWVzcCwlZWJ4LDQpLCVlZHgKKwltb3ZsCSVlYnAsMzIoJWVzcCwlZWJ4LDQpCisJYWRjbAkkMCwlZWN4CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJJWVkeCwzNiglZXNwLCVlYngsNCkKKwltb3ZsCSVlY3gsNDAoJWVzcCwlZWJ4LDQpCisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSQxLCVlY3gKKy5hbGlnbgkxNgorLkwwMTEybmRtYWRkOgorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwLCVlY3gsNCksJWVicAorCWxlYWwJMSglZWN4KSwlZWN4CisJYWRjbAkkMCwlZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCSglZXNpLCVlY3gsNCksJWVheAorCWFkY2wJJDAsJWVkeAorCWNtcGwJJWVieCwlZWN4CisJbW92bAklZWJwLDI0KCVlc3AsJWVjeCw0KQorCWpsCS5MMDExMm5kbWFkZAorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwLCVlYngsNCksJWVicAorCWFkY2wJJDAsJWVkeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAkkMCwlZWR4CisJbW92bAklZWJwLDI4KCVlc3AsJWVieCw0KQorCXhvcmwJJWVheCwlZWF4CisJbW92bAkxMiglZXNwKSwlZWN4CisJYWRkbAkzNiglZXNwLCVlYngsNCksJWVkeAorCWFkY2wJNDAoJWVzcCwlZWJ4LDQpLCVlYXgKKwlsZWFsCTQoJWVjeCksJWVjeAorCW1vdmwJJWVkeCwzMiglZXNwLCVlYngsNCkKKwljbXBsCTI4KCVlc3ApLCVlY3gKKwltb3ZsCSVlYXgsMzYoJWVzcCwlZWJ4LDQpCisJamUJLkwwMDhjb21tb25fdGFpbAorCW1vdmwJKCVlY3gpLCVlZGkKKwltb3ZsCTgoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwxMiglZXNwKQorCXhvcmwJJWVjeCwlZWN4CisJeG9ybAklZWR4LCVlZHgKKwltb3ZsCSglZXNpKSwlZWF4CisJam1wCS5MMDEyMXN0bWFkZAorLmFsaWduCTE2CisuTDAwOWJuX3Nxcl9tb250OgorCW1vdmwJJWVieCwoJWVzcCkKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCSVlZGksJWVheAorCW11bGwJJWVkaQorCW1vdmwJJWVheCwzMiglZXNwKQorCW1vdmwJJWVkeCwlZWJ4CisJc2hybAkkMSwlZWR4CisJYW5kbAkkMSwlZWJ4CisJaW5jbAklZWN4CisuYWxpZ24JMTYKKy5MMDEzc3FyOgorCW1vdmwJKCVlc2ksJWVjeCw0KSwlZWF4CisJbW92bAklZWR4LCVlYnAKKwltdWxsCSVlZGkKKwlhZGRsCSVlYnAsJWVheAorCWxlYWwJMSglZWN4KSwlZWN4CisJYWRjbAkkMCwlZWR4CisJbGVhbAkoJWVieCwlZWF4LDIpLCVlYnAKKwlzaHJsCSQzMSwlZWF4CisJY21wbAkoJWVzcCksJWVjeAorCW1vdmwJJWVheCwlZWJ4CisJbW92bAklZWJwLDI4KCVlc3AsJWVjeCw0KQorCWpsCS5MMDEzc3FyCisJbW92bAkoJWVzaSwlZWN4LDQpLCVlYXgKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJJWVicCwlZWF4CisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRjbAkkMCwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJbGVhbAkoJWVieCwlZWF4LDIpLCVlYnAKKwlpbXVsbAkzMiglZXNwKSwlZWRpCisJc2hybAkkMzEsJWVheAorCW1vdmwJJWVicCwzMiglZXNwLCVlY3gsNCkKKwlsZWFsCSglZWF4LCVlZHgsMiksJWVicAorCW1vdmwJKCVlc2kpLCVlYXgKKwlzaHJsCSQzMSwlZWR4CisJbW92bAklZWJwLDM2KCVlc3AsJWVjeCw0KQorCW1vdmwJJWVkeCw0MCglZXNwLCVlY3gsNCkKKwltdWxsCSVlZGkKKwlhZGRsCTMyKCVlc3ApLCVlYXgKKwltb3ZsCSVlY3gsJWVieAorCWFkY2wJJDAsJWVkeAorCW1vdmwJNCglZXNpKSwlZWF4CisJbW92bAkkMSwlZWN4CisuYWxpZ24JMTYKKy5MMDE0M3JkbWFkZDoKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCwlZWN4LDQpLCVlYnAKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJNCglZXNpLCVlY3gsNCksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVicCwyOCglZXNwLCVlY3gsNCkKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzYoJWVzcCwlZWN4LDQpLCVlYnAKKwlsZWFsCTIoJWVjeCksJWVjeAorCWFkY2wJJDAsJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkoJWVzaSwlZWN4LDQpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwljbXBsCSVlYngsJWVjeAorCW1vdmwJJWVicCwyNCglZXNwLCVlY3gsNCkKKwlqbAkuTDAxNDNyZG1hZGQKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCwlZWJ4LDQpLCVlYnAKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVicCwyOCglZXNwLCVlYngsNCkKKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVheAorCW1vdmwJOCglZXNwKSwlZXNpCisJYWRkbAkzNiglZXNwLCVlYngsNCksJWVkeAorCWFkY2wJNDAoJWVzcCwlZWJ4LDQpLCVlYXgKKwltb3ZsCSVlZHgsMzIoJWVzcCwlZWJ4LDQpCisJY21wbAklZWJ4LCVlY3gKKwltb3ZsCSVlYXgsMzYoJWVzcCwlZWJ4LDQpCisJamUJLkwwMDhjb21tb25fdGFpbAorCW1vdmwJNCglZXNpLCVlY3gsNCksJWVkaQorCWxlYWwJMSglZWN4KSwlZWN4CisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltdWxsCSVlZGkKKwlhZGRsCTMyKCVlc3AsJWVjeCw0KSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDMyKCVlc3AsJWVjeCw0KQorCXhvcmwJJWVicCwlZWJwCisJY21wbAklZWJ4LCVlY3gKKwlsZWFsCTEoJWVjeCksJWVjeAorCWplCS5MMDE1c3FybGFzdAorCW1vdmwJJWVkeCwlZWJ4CisJc2hybAkkMSwlZWR4CisJYW5kbAkkMSwlZWJ4CisuYWxpZ24JMTYKKy5MMDE2c3FyYWRkOgorCW1vdmwJKCVlc2ksJWVjeCw0KSwlZWF4CisJbW92bAklZWR4LCVlYnAKKwltdWxsCSVlZGkKKwlhZGRsCSVlYnAsJWVheAorCWxlYWwJKCVlYXgsJWVheCwxKSwlZWJwCisJYWRjbAkkMCwlZWR4CisJc2hybAkkMzEsJWVheAorCWFkZGwJMzIoJWVzcCwlZWN4LDQpLCVlYnAKKwlsZWFsCTEoJWVjeCksJWVjeAorCWFkY2wJJDAsJWVheAorCWFkZGwJJWVieCwlZWJwCisJYWRjbAkkMCwlZWF4CisJY21wbAkoJWVzcCksJWVjeAorCW1vdmwJJWVicCwyOCglZXNwLCVlY3gsNCkKKwltb3ZsCSVlYXgsJWVieAorCWpsZQkuTDAxNnNxcmFkZAorCW1vdmwJJWVkeCwlZWJwCisJYWRkbAklZWR4LCVlZHgKKwlzaHJsCSQzMSwlZWJwCisJYWRkbAklZWJ4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKy5MMDE1c3FybGFzdDoKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwlpbXVsbAkzMiglZXNwKSwlZWRpCisJYWRkbAkzMiglZXNwLCVlY3gsNCksJWVkeAorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlZHgsMzIoJWVzcCwlZWN4LDQpCisJbW92bAklZWJwLDM2KCVlc3AsJWVjeCw0KQorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCksJWVheAorCWxlYWwJLTEoJWVjeCksJWVieAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJDEsJWVjeAorCW1vdmwJNCglZXNpKSwlZWF4CisJam1wCS5MMDE0M3JkbWFkZAorLmFsaWduCTE2CisuTDAwOGNvbW1vbl90YWlsOgorCW1vdmwJMTYoJWVzcCksJWVicAorCW1vdmwJNCglZXNwKSwlZWRpCisJbGVhbAkzMiglZXNwKSwlZXNpCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJJWVieCwlZWN4CisJeG9ybAklZWR4LCVlZHgKKy5hbGlnbgkxNgorLkwwMTdzdWI6CisJc2JibAkoJWVicCwlZWR4LDQpLCVlYXgKKwltb3ZsCSVlYXgsKCVlZGksJWVkeCw0KQorCWRlY2wJJWVjeAorCW1vdmwJNCglZXNpLCVlZHgsNCksJWVheAorCWxlYWwJMSglZWR4KSwlZWR4CisJamdlCS5MMDE3c3ViCisJc2JibAkkMCwlZWF4CisJbW92bAkkLTEsJWVkeAorCXhvcmwJJWVheCwlZWR4CisJam1wCS5MMDE4Y29weQorLmFsaWduCTE2CisuTDAxOGNvcHk6CisJbW92bAkzMiglZXNwLCVlYngsNCksJWVzaQorCW1vdmwJKCVlZGksJWVieCw0KSwlZWJwCisJbW92bAklZWN4LDMyKCVlc3AsJWVieCw0KQorCWFuZGwJJWVheCwlZXNpCisJYW5kbAklZWR4LCVlYnAKKwlvcmwJJWVzaSwlZWJwCisJbW92bAklZWJwLCglZWRpLCVlYngsNCkKKwlkZWNsCSVlYngKKwlqZ2UJLkwwMThjb3B5CisJbW92bAkyNCglZXNwKSwlZXNwCisJbW92bAkkMSwlZWF4CisuTDAwMGp1c3RfbGVhdmU6CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0Cisuc2l6ZQlibl9tdWxfbW9udCwuLS5MX2JuX211bF9tb250X2JlZ2luCisuYnl0ZQk3NywxMTEsMTEwLDExNiwxMDMsMTExLDEwOSwxMDEsMTE0LDEyMSwzMiw3NywxMTcsMTA4LDExNiwxMDUKKy5ieXRlCTExMiwxMDgsMTA1LDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYKKy5ieXRlCTU0LDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMQorLmJ5dGUJMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NgorLmJ5dGUJMTExLDExNCwxMDMsNjIsMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9jaGFjaGEvY2hhY2hhLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGM3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODZfNjQuUwpAQCAtMCwwICsxLDE1ODYgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKy5oaWRkZW4gT1BFTlNTTF9pYTMyY2FwX1AKKworLmFsaWduCTY0CisuTHplcm86CisubG9uZwkwLDAsMCwwCisuTG9uZToKKy5sb25nCTEsMCwwLDAKKy5MaW5jOgorLmxvbmcJMCwxLDIsMworLkxmb3VyOgorLmxvbmcJNCw0LDQsNAorLkxpbmN5OgorLmxvbmcJMCwyLDQsNiwxLDMsNSw3CisuTGVpZ2h0OgorLmxvbmcJOCw4LDgsOCw4LDgsOCw4CisuTHJvdDE2OgorLmJ5dGUJMHgyLDB4MywweDAsMHgxLCAweDYsMHg3LDB4NCwweDUsIDB4YSwweGIsMHg4LDB4OSwgMHhlLDB4ZiwweGMsMHhkCisuTHJvdDI0OgorLmJ5dGUJMHgzLDB4MCwweDEsMHgyLCAweDcsMHg0LDB4NSwweDYsIDB4YiwweDgsMHg5LDB4YSwgMHhmLDB4YywweGQsMHhlCisuTHNpZ21hOgorLmJ5dGUJMTAxLDEyMCwxMTIsOTcsMTEwLDEwMCwzMiw1MSw1MCw0NSw5OCwxMjEsMTE2LDEwMSwzMiwxMDcsMAorLmFsaWduCTY0CisuTHplcm96OgorLmxvbmcJMCwwLDAsMCwgMSwwLDAsMCwgMiwwLDAsMCwgMywwLDAsMAorLkxmb3VyejoKKy5sb25nCTQsMCwwLDAsIDQsMCwwLDAsIDQsMCwwLDAsIDQsMCwwLDAKKy5MaW5jejoKKy5sb25nCTAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUKKy5Mc2l4dGVlbjoKKy5sb25nCTE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2CisuYnl0ZQk2NywxMDQsOTcsNjcsMTA0LDk3LDUwLDQ4LDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NCw1Miw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuZ2xvYmwJQ2hhQ2hhMjBfY3RyMzIKKy5oaWRkZW4gQ2hhQ2hhMjBfY3RyMzIKKy50eXBlCUNoYUNoYTIwX2N0cjMyLEBmdW5jdGlvbgorLmFsaWduCTY0CitDaGFDaGEyMF9jdHIzMjoKKwljbXBxCSQwLCVyZHgKKwlqZQkuTG5vX2RhdGEKKwltb3ZxCU9QRU5TU0xfaWEzMmNhcF9QKzQoJXJpcCksJXIxMAorCXRlc3RsCSQ1MTIsJXIxMGQKKwlqbnoJLkxDaGFDaGEyMF9zc3NlMworCisJcHVzaHEJJXJieAorCXB1c2hxCSVyYnAKKwlwdXNocQklcjEyCisJcHVzaHEJJXIxMworCXB1c2hxCSVyMTQKKwlwdXNocQklcjE1CisJc3VicQkkNjQrMjQsJXJzcAorLkxjdHIzMl9ib2R5OgorCisKKwltb3ZkcXUJKCVyY3gpLCV4bW0xCisJbW92ZHF1CTE2KCVyY3gpLCV4bW0yCisJbW92ZHF1CSglcjgpLCV4bW0zCisJbW92ZHFhCS5Mb25lKCVyaXApLCV4bW00CisKKworCW1vdmRxYQkleG1tMSwxNiglcnNwKQorCW1vdmRxYQkleG1tMiwzMiglcnNwKQorCW1vdmRxYQkleG1tMyw0OCglcnNwKQorCW1vdnEJJXJkeCwlcmJwCisJam1wCS5Mb29wX291dGVyCisKKy5hbGlnbgkzMgorLkxvb3Bfb3V0ZXI6CisJbW92bAkkMHg2MTcwNzg2NSwlZWF4CisJbW92bAkkMHgzMzIwNjQ2ZSwlZWJ4CisJbW92bAkkMHg3OTYyMmQzMiwlZWN4CisJbW92bAkkMHg2YjIwNjU3NCwlZWR4CisJbW92bAkxNiglcnNwKSwlcjhkCisJbW92bAkyMCglcnNwKSwlcjlkCisJbW92bAkyNCglcnNwKSwlcjEwZAorCW1vdmwJMjgoJXJzcCksJXIxMWQKKwltb3ZkCSV4bW0zLCVyMTJkCisJbW92bAk1MiglcnNwKSwlcjEzZAorCW1vdmwJNTYoJXJzcCksJXIxNGQKKwltb3ZsCTYwKCVyc3ApLCVyMTVkCisKKwltb3ZxCSVyYnAsNjQrMCglcnNwKQorCW1vdmwJJDEwLCVlYnAKKwltb3ZxCSVyc2ksNjQrOCglcnNwKQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTQKKwltb3ZxCSVyZGksNjQrMTYoJXJzcCkKKwltb3ZxCSVyc2ksJXJkaQorCXNocnEJJDMyLCVyZGkKKwlqbXAJLkxvb3AKKworLmFsaWduCTMyCisuTG9vcDoKKwlhZGRsCSVyOGQsJWVheAorCXhvcmwJJWVheCwlcjEyZAorCXJvbGwJJDE2LCVyMTJkCisJYWRkbAklcjlkLCVlYngKKwl4b3JsCSVlYngsJXIxM2QKKwlyb2xsCSQxNiwlcjEzZAorCWFkZGwJJXIxMmQsJWVzaQorCXhvcmwJJWVzaSwlcjhkCisJcm9sbAkkMTIsJXI4ZAorCWFkZGwJJXIxM2QsJWVkaQorCXhvcmwJJWVkaSwlcjlkCisJcm9sbAkkMTIsJXI5ZAorCWFkZGwJJXI4ZCwlZWF4CisJeG9ybAklZWF4LCVyMTJkCisJcm9sbAkkOCwlcjEyZAorCWFkZGwJJXI5ZCwlZWJ4CisJeG9ybAklZWJ4LCVyMTNkCisJcm9sbAkkOCwlcjEzZAorCWFkZGwJJXIxMmQsJWVzaQorCXhvcmwJJWVzaSwlcjhkCisJcm9sbAkkNywlcjhkCisJYWRkbAklcjEzZCwlZWRpCisJeG9ybAklZWRpLCVyOWQKKwlyb2xsCSQ3LCVyOWQKKwltb3ZsCSVlc2ksMzIoJXJzcCkKKwltb3ZsCSVlZGksMzYoJXJzcCkKKwltb3ZsCTQwKCVyc3ApLCVlc2kKKwltb3ZsCTQ0KCVyc3ApLCVlZGkKKwlhZGRsCSVyMTBkLCVlY3gKKwl4b3JsCSVlY3gsJXIxNGQKKwlyb2xsCSQxNiwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCXhvcmwJJWVkeCwlcjE1ZAorCXJvbGwJJDE2LCVyMTVkCisJYWRkbAklcjE0ZCwlZXNpCisJeG9ybAklZXNpLCVyMTBkCisJcm9sbAkkMTIsJXIxMGQKKwlhZGRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlZGksJXIxMWQKKwlyb2xsCSQxMiwlcjExZAorCWFkZGwJJXIxMGQsJWVjeAorCXhvcmwJJWVjeCwlcjE0ZAorCXJvbGwJJDgsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwl4b3JsCSVlZHgsJXIxNWQKKwlyb2xsCSQ4LCVyMTVkCisJYWRkbAklcjE0ZCwlZXNpCisJeG9ybAklZXNpLCVyMTBkCisJcm9sbAkkNywlcjEwZAorCWFkZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVkaSwlcjExZAorCXJvbGwJJDcsJXIxMWQKKwlhZGRsCSVyOWQsJWVheAorCXhvcmwJJWVheCwlcjE1ZAorCXJvbGwJJDE2LCVyMTVkCisJYWRkbAklcjEwZCwlZWJ4CisJeG9ybAklZWJ4LCVyMTJkCisJcm9sbAkkMTYsJXIxMmQKKwlhZGRsCSVyMTVkLCVlc2kKKwl4b3JsCSVlc2ksJXI5ZAorCXJvbGwJJDEyLCVyOWQKKwlhZGRsCSVyMTJkLCVlZGkKKwl4b3JsCSVlZGksJXIxMGQKKwlyb2xsCSQxMiwlcjEwZAorCWFkZGwJJXI5ZCwlZWF4CisJeG9ybAklZWF4LCVyMTVkCisJcm9sbAkkOCwlcjE1ZAorCWFkZGwJJXIxMGQsJWVieAorCXhvcmwJJWVieCwlcjEyZAorCXJvbGwJJDgsJXIxMmQKKwlhZGRsCSVyMTVkLCVlc2kKKwl4b3JsCSVlc2ksJXI5ZAorCXJvbGwJJDcsJXI5ZAorCWFkZGwJJXIxMmQsJWVkaQorCXhvcmwJJWVkaSwlcjEwZAorCXJvbGwJJDcsJXIxMGQKKwltb3ZsCSVlc2ksNDAoJXJzcCkKKwltb3ZsCSVlZGksNDQoJXJzcCkKKwltb3ZsCTMyKCVyc3ApLCVlc2kKKwltb3ZsCTM2KCVyc3ApLCVlZGkKKwlhZGRsCSVyMTFkLCVlY3gKKwl4b3JsCSVlY3gsJXIxM2QKKwlyb2xsCSQxNiwlcjEzZAorCWFkZGwJJXI4ZCwlZWR4CisJeG9ybAklZWR4LCVyMTRkCisJcm9sbAkkMTYsJXIxNGQKKwlhZGRsCSVyMTNkLCVlc2kKKwl4b3JsCSVlc2ksJXIxMWQKKwlyb2xsCSQxMiwlcjExZAorCWFkZGwJJXIxNGQsJWVkaQorCXhvcmwJJWVkaSwlcjhkCisJcm9sbAkkMTIsJXI4ZAorCWFkZGwJJXIxMWQsJWVjeAorCXhvcmwJJWVjeCwlcjEzZAorCXJvbGwJJDgsJXIxM2QKKwlhZGRsCSVyOGQsJWVkeAorCXhvcmwJJWVkeCwlcjE0ZAorCXJvbGwJJDgsJXIxNGQKKwlhZGRsCSVyMTNkLCVlc2kKKwl4b3JsCSVlc2ksJXIxMWQKKwlyb2xsCSQ3LCVyMTFkCisJYWRkbAklcjE0ZCwlZWRpCisJeG9ybAklZWRpLCVyOGQKKwlyb2xsCSQ3LCVyOGQKKwlkZWNsCSVlYnAKKwlqbnoJLkxvb3AKKwltb3ZsCSVlZGksMzYoJXJzcCkKKwltb3ZsCSVlc2ksMzIoJXJzcCkKKwltb3ZxCTY0KCVyc3ApLCVyYnAKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwltb3ZxCTY0KzgoJXJzcCksJXJzaQorCXBhZGRkCSV4bW00LCV4bW0zCisJbW92cQk2NCsxNiglcnNwKSwlcmRpCisKKwlhZGRsCSQweDYxNzA3ODY1LCVlYXgKKwlhZGRsCSQweDMzMjA2NDZlLCVlYngKKwlhZGRsCSQweDc5NjIyZDMyLCVlY3gKKwlhZGRsCSQweDZiMjA2NTc0LCVlZHgKKwlhZGRsCTE2KCVyc3ApLCVyOGQKKwlhZGRsCTIwKCVyc3ApLCVyOWQKKwlhZGRsCTI0KCVyc3ApLCVyMTBkCisJYWRkbAkyOCglcnNwKSwlcjExZAorCWFkZGwJNDgoJXJzcCksJXIxMmQKKwlhZGRsCTUyKCVyc3ApLCVyMTNkCisJYWRkbAk1NiglcnNwKSwlcjE0ZAorCWFkZGwJNjAoJXJzcCksJXIxNWQKKwlwYWRkZAkzMiglcnNwKSwleG1tMQorCisJY21wcQkkNjQsJXJicAorCWpiCS5MdGFpbAorCisJeG9ybAkwKCVyc2kpLCVlYXgKKwl4b3JsCTQoJXJzaSksJWVieAorCXhvcmwJOCglcnNpKSwlZWN4CisJeG9ybAkxMiglcnNpKSwlZWR4CisJeG9ybAkxNiglcnNpKSwlcjhkCisJeG9ybAkyMCglcnNpKSwlcjlkCisJeG9ybAkyNCglcnNpKSwlcjEwZAorCXhvcmwJMjgoJXJzaSksJXIxMWQKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTAKKwl4b3JsCTQ4KCVyc2kpLCVyMTJkCisJeG9ybAk1MiglcnNpKSwlcjEzZAorCXhvcmwJNTYoJXJzaSksJXIxNGQKKwl4b3JsCTYwKCVyc2kpLCVyMTVkCisJbGVhcQk2NCglcnNpKSwlcnNpCisJcHhvcgkleG1tMSwleG1tMAorCisJbW92ZHFhCSV4bW0yLDMyKCVyc3ApCisJbW92ZAkleG1tMyw0OCglcnNwKQorCisJbW92bAklZWF4LDAoJXJkaSkKKwltb3ZsCSVlYngsNCglcmRpKQorCW1vdmwJJWVjeCw4KCVyZGkpCisJbW92bAklZWR4LDEyKCVyZGkpCisJbW92bAklcjhkLDE2KCVyZGkpCisJbW92bAklcjlkLDIwKCVyZGkpCisJbW92bAklcjEwZCwyNCglcmRpKQorCW1vdmwJJXIxMWQsMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTAsMzIoJXJkaSkKKwltb3ZsCSVyMTJkLDQ4KCVyZGkpCisJbW92bAklcjEzZCw1MiglcmRpKQorCW1vdmwJJXIxNGQsNTYoJXJkaSkKKwltb3ZsCSVyMTVkLDYwKCVyZGkpCisJbGVhcQk2NCglcmRpKSwlcmRpCisKKwlzdWJxCSQ2NCwlcmJwCisJam56CS5Mb29wX291dGVyCisKKwlqbXAJLkxkb25lCisKKy5hbGlnbgkxNgorLkx0YWlsOgorCW1vdmwJJWVheCwwKCVyc3ApCisJbW92bAklZWJ4LDQoJXJzcCkKKwl4b3JxCSVyYngsJXJieAorCW1vdmwJJWVjeCw4KCVyc3ApCisJbW92bAklZWR4LDEyKCVyc3ApCisJbW92bAklcjhkLDE2KCVyc3ApCisJbW92bAklcjlkLDIwKCVyc3ApCisJbW92bAklcjEwZCwyNCglcnNwKQorCW1vdmwJJXIxMWQsMjgoJXJzcCkKKwltb3ZkcWEJJXhtbTEsMzIoJXJzcCkKKwltb3ZsCSVyMTJkLDQ4KCVyc3ApCisJbW92bAklcjEzZCw1MiglcnNwKQorCW1vdmwJJXIxNGQsNTYoJXJzcCkKKwltb3ZsCSVyMTVkLDYwKCVyc3ApCisKKy5Mb29wX3RhaWw6CisJbW92emJsCSglcnNpLCVyYngsMSksJWVheAorCW1vdnpibAkoJXJzcCwlcmJ4LDEpLCVlZHgKKwlsZWFxCTEoJXJieCksJXJieAorCXhvcmwJJWVkeCwlZWF4CisJbW92YgklYWwsLTEoJXJkaSwlcmJ4LDEpCisJZGVjcQklcmJwCisJam56CS5Mb29wX3RhaWwKKworLkxkb25lOgorCWxlYXEJNjQrMjQrNDgoJXJzcCksJXJzaQorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKwltb3ZxCS00MCglcnNpKSwlcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisJbGVhcQkoJXJzaSksJXJzcAorLkxub19kYXRhOgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJQ2hhQ2hhMjBfY3RyMzIsLi1DaGFDaGEyMF9jdHIzMgorLnR5cGUJQ2hhQ2hhMjBfc3NzZTMsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK0NoYUNoYTIwX3Nzc2UzOgorLkxDaGFDaGEyMF9zc3NlMzoKKwltb3ZxCSVyc3AsJXI5CisJY21wcQkkMTI4LCVyZHgKKwlqYQkuTENoYUNoYTIwXzR4CisKKy5MZG9fc3NlM19hZnRlcl9hbGw6CisJc3VicQkkNjQrOCwlcnNwCisJbW92ZHFhCS5Mc2lnbWEoJXJpcCksJXhtbTAKKwltb3ZkcXUJKCVyY3gpLCV4bW0xCisJbW92ZHF1CTE2KCVyY3gpLCV4bW0yCisJbW92ZHF1CSglcjgpLCV4bW0zCisJbW92ZHFhCS5Mcm90MTYoJXJpcCksJXhtbTYKKwltb3ZkcWEJLkxyb3QyNCglcmlwKSwleG1tNworCisJbW92ZHFhCSV4bW0wLDAoJXJzcCkKKwltb3ZkcWEJJXhtbTEsMTYoJXJzcCkKKwltb3ZkcWEJJXhtbTIsMzIoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNDgoJXJzcCkKKwltb3ZxCSQxMCwlcjgKKwlqbXAJLkxvb3Bfc3NzZTMKKworLmFsaWduCTMyCisuTG9vcF9vdXRlcl9zc3NlMzoKKwltb3ZkcWEJLkxvbmUoJXJpcCksJXhtbTMKKwltb3ZkcWEJMCglcnNwKSwleG1tMAorCW1vdmRxYQkxNiglcnNwKSwleG1tMQorCW1vdmRxYQkzMiglcnNwKSwleG1tMgorCXBhZGRkCTQ4KCVyc3ApLCV4bW0zCisJbW92cQkkMTAsJXI4CisJbW92ZHFhCSV4bW0zLDQ4KCVyc3ApCisJam1wCS5Mb29wX3Nzc2UzCisKKy5hbGlnbgkzMgorLkxvb3Bfc3NzZTM6CisJcGFkZGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JsZAkkMjAsJXhtbTEKKwlwc2xsZAkkMTIsJXhtbTQKKwlwb3IJJXhtbTQsJXhtbTEKKwlwYWRkZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworCXBhZGRkCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tMSwleG1tNAorCXBzcmxkCSQyNSwleG1tMQorCXBzbGxkCSQ3LCV4bW00CisJcG9yCSV4bW00LCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMgorCXBzaHVmZAkkNTcsJXhtbTEsJXhtbTEKKwlwc2h1ZmQJJDE0NywleG1tMywleG1tMworCW5vcAorCXBhZGRkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW0xLCV4bW00CisJcHNybGQJJDIwLCV4bW0xCisJcHNsbGQJJDEyLCV4bW00CisJcG9yCSV4bW00LCV4bW0xCisJcGFkZGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKwlwYWRkZAkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JsZAkkMjUsJXhtbTEKKwlwc2xsZAkkNywleG1tNAorCXBvcgkleG1tNCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTIKKwlwc2h1ZmQJJDE0NywleG1tMSwleG1tMQorCXBzaHVmZAkkNTcsJXhtbTMsJXhtbTMKKwlkZWNxCSVyOAorCWpuegkuTG9vcF9zc3NlMworCXBhZGRkCTAoJXJzcCksJXhtbTAKKwlwYWRkZAkxNiglcnNwKSwleG1tMQorCXBhZGRkCTMyKCVyc3ApLCV4bW0yCisJcGFkZGQJNDgoJXJzcCksJXhtbTMKKworCWNtcHEJJDY0LCVyZHgKKwlqYgkuTHRhaWxfc3NzZTMKKworCW1vdmRxdQkwKCVyc2kpLCV4bW00CisJbW92ZHF1CTE2KCVyc2kpLCV4bW01CisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxdQkzMiglcnNpKSwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTEKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTUKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlweG9yCSV4bW00LCV4bW0yCisJcHhvcgkleG1tNSwleG1tMworCisJbW92ZHF1CSV4bW0wLDAoJXJkaSkKKwltb3ZkcXUJJXhtbTEsMTYoJXJkaSkKKwltb3ZkcXUJJXhtbTIsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTMsNDgoJXJkaSkKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKworCXN1YnEJJDY0LCVyZHgKKwlqbnoJLkxvb3Bfb3V0ZXJfc3NzZTMKKworCWptcAkuTGRvbmVfc3NzZTMKKworLmFsaWduCTE2CisuTHRhaWxfc3NzZTM6CisJbW92ZHFhCSV4bW0wLDAoJXJzcCkKKwltb3ZkcWEJJXhtbTEsMTYoJXJzcCkKKwltb3ZkcWEJJXhtbTIsMzIoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNDgoJXJzcCkKKwl4b3JxCSVyOCwlcjgKKworLkxvb3BfdGFpbF9zc3NlMzoKKwltb3Z6YmwJKCVyc2ksJXI4LDEpLCVlYXgKKwltb3Z6YmwJKCVyc3AsJXI4LDEpLCVlY3gKKwlsZWFxCTEoJXI4KSwlcjgKKwl4b3JsCSVlY3gsJWVheAorCW1vdmIJJWFsLC0xKCVyZGksJXI4LDEpCisJZGVjcQklcmR4CisJam56CS5Mb29wX3RhaWxfc3NzZTMKKworLkxkb25lX3Nzc2UzOgorCWxlYXEJKCVyOSksJXJzcAorLkxzc3NlM19lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCUNoYUNoYTIwX3Nzc2UzLC4tQ2hhQ2hhMjBfc3NzZTMKKy50eXBlCUNoYUNoYTIwXzR4LEBmdW5jdGlvbgorLmFsaWduCTMyCitDaGFDaGEyMF80eDoKKy5MQ2hhQ2hhMjBfNHg6CisJbW92cQklcnNwLCVyOQorCW1vdnEJJXIxMCwlcjExCisJc2hycQkkMzIsJXIxMAorCXRlc3RxCSQzMiwlcjEwCisJam56CS5MQ2hhQ2hhMjBfOHgKKwljbXBxCSQxOTIsJXJkeAorCWphCS5McHJvY2VlZDR4CisKKwlhbmRxCSQ3MTMwMzE2OCwlcjExCisJY21wcQkkNDE5NDMwNCwlcjExCisJamUJLkxkb19zc2UzX2FmdGVyX2FsbAorCisuTHByb2NlZWQ0eDoKKwlzdWJxCSQweDE0MCs4LCVyc3AKKwltb3ZkcWEJLkxzaWdtYSglcmlwKSwleG1tMTEKKwltb3ZkcXUJKCVyY3gpLCV4bW0xNQorCW1vdmRxdQkxNiglcmN4KSwleG1tNworCW1vdmRxdQkoJXI4KSwleG1tMworCWxlYXEJMjU2KCVyc3ApLCVyY3gKKwlsZWFxCS5Mcm90MTYoJXJpcCksJXIxMAorCWxlYXEJLkxyb3QyNCglcmlwKSwlcjExCisKKwlwc2h1ZmQJJDB4MDAsJXhtbTExLCV4bW04CisJcHNodWZkCSQweDU1LCV4bW0xMSwleG1tOQorCW1vdmRxYQkleG1tOCw2NCglcnNwKQorCXBzaHVmZAkkMHhhYSwleG1tMTEsJXhtbTEwCisJbW92ZHFhCSV4bW05LDgwKCVyc3ApCisJcHNodWZkCSQweGZmLCV4bW0xMSwleG1tMTEKKwltb3ZkcWEJJXhtbTEwLDk2KCVyc3ApCisJbW92ZHFhCSV4bW0xMSwxMTIoJXJzcCkKKworCXBzaHVmZAkkMHgwMCwleG1tMTUsJXhtbTEyCisJcHNodWZkCSQweDU1LCV4bW0xNSwleG1tMTMKKwltb3ZkcWEJJXhtbTEyLDEyOC0yNTYoJXJjeCkKKwlwc2h1ZmQJJDB4YWEsJXhtbTE1LCV4bW0xNAorCW1vdmRxYQkleG1tMTMsMTQ0LTI1NiglcmN4KQorCXBzaHVmZAkkMHhmZiwleG1tMTUsJXhtbTE1CisJbW92ZHFhCSV4bW0xNCwxNjAtMjU2KCVyY3gpCisJbW92ZHFhCSV4bW0xNSwxNzYtMjU2KCVyY3gpCisKKwlwc2h1ZmQJJDB4MDAsJXhtbTcsJXhtbTQKKwlwc2h1ZmQJJDB4NTUsJXhtbTcsJXhtbTUKKwltb3ZkcWEJJXhtbTQsMTkyLTI1NiglcmN4KQorCXBzaHVmZAkkMHhhYSwleG1tNywleG1tNgorCW1vdmRxYQkleG1tNSwyMDgtMjU2KCVyY3gpCisJcHNodWZkCSQweGZmLCV4bW03LCV4bW03CisJbW92ZHFhCSV4bW02LDIyNC0yNTYoJXJjeCkKKwltb3ZkcWEJJXhtbTcsMjQwLTI1NiglcmN4KQorCisJcHNodWZkCSQweDAwLCV4bW0zLCV4bW0wCisJcHNodWZkCSQweDU1LCV4bW0zLCV4bW0xCisJcGFkZGQJLkxpbmMoJXJpcCksJXhtbTAKKwlwc2h1ZmQJJDB4YWEsJXhtbTMsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMjcyLTI1NiglcmN4KQorCXBzaHVmZAkkMHhmZiwleG1tMywleG1tMworCW1vdmRxYQkleG1tMiwyODgtMjU2KCVyY3gpCisJbW92ZHFhCSV4bW0zLDMwNC0yNTYoJXJjeCkKKworCWptcAkuTG9vcF9lbnRlcjR4CisKKy5hbGlnbgkzMgorLkxvb3Bfb3V0ZXI0eDoKKwltb3ZkcWEJNjQoJXJzcCksJXhtbTgKKwltb3ZkcWEJODAoJXJzcCksJXhtbTkKKwltb3ZkcWEJOTYoJXJzcCksJXhtbTEwCisJbW92ZHFhCTExMiglcnNwKSwleG1tMTEKKwltb3ZkcWEJMTI4LTI1NiglcmN4KSwleG1tMTIKKwltb3ZkcWEJMTQ0LTI1NiglcmN4KSwleG1tMTMKKwltb3ZkcWEJMTYwLTI1NiglcmN4KSwleG1tMTQKKwltb3ZkcWEJMTc2LTI1NiglcmN4KSwleG1tMTUKKwltb3ZkcWEJMTkyLTI1NiglcmN4KSwleG1tNAorCW1vdmRxYQkyMDgtMjU2KCVyY3gpLCV4bW01CisJbW92ZHFhCTIyNC0yNTYoJXJjeCksJXhtbTYKKwltb3ZkcWEJMjQwLTI1NiglcmN4KSwleG1tNworCW1vdmRxYQkyNTYtMjU2KCVyY3gpLCV4bW0wCisJbW92ZHFhCTI3Mi0yNTYoJXJjeCksJXhtbTEKKwltb3ZkcWEJMjg4LTI1NiglcmN4KSwleG1tMgorCW1vdmRxYQkzMDQtMjU2KCVyY3gpLCV4bW0zCisJcGFkZGQJLkxmb3VyKCVyaXApLCV4bW0wCisKKy5Mb29wX2VudGVyNHg6CisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJbW92ZHFhCSV4bW03LDQ4KCVyc3ApCisJbW92ZHFhCSglcjEwKSwleG1tNworCW1vdmwJJDEwLCVlYXgKKwltb3ZkcWEJJXhtbTAsMjU2LTI1NiglcmN4KQorCWptcAkuTG9vcDR4CisKKy5hbGlnbgkzMgorLkxvb3A0eDoKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0wCisJcHhvcgkleG1tOSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMTk5CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDcKKwlwYWRkZAkleG1tMCwleG1tNAorCXBhZGRkCSV4bW0xLCV4bW01CisJcHhvcgkleG1tNCwleG1tMTIKKwlweG9yCSV4bW01LCV4bW0xMworCW1vdmRxYQkleG1tMTIsJXhtbTYKKwlwc2xsZAkkMTIsJXhtbTEyCisJcHNybGQJJDIwLCV4bW02CisJbW92ZHFhCSV4bW0xMywleG1tNworCXBzbGxkCSQxMiwleG1tMTMKKwlwb3IJJXhtbTYsJXhtbTEyCisJcHNybGQJJDIwLCV4bW03CisJbW92ZHFhCSglcjExKSwleG1tNgorCXBvcgkleG1tNywleG1tMTMKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0wCisJcHhvcgkleG1tOSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMTk4CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDYKKwlwYWRkZAkleG1tMCwleG1tNAorCXBhZGRkCSV4bW0xLCV4bW01CisJcHhvcgkleG1tNCwleG1tMTIKKwlweG9yCSV4bW01LCV4bW0xMworCW1vdmRxYQkleG1tMTIsJXhtbTcKKwlwc2xsZAkkNywleG1tMTIKKwlwc3JsZAkkMjUsJXhtbTcKKwltb3ZkcWEJJXhtbTEzLCV4bW02CisJcHNsbGQJJDcsJXhtbTEzCisJcG9yCSV4bW03LCV4bW0xMgorCXBzcmxkCSQyNSwleG1tNgorCW1vdmRxYQkoJXIxMCksJXhtbTcKKwlwb3IJJXhtbTYsJXhtbTEzCisJbW92ZHFhCSV4bW00LDAoJXJzcCkKKwltb3ZkcWEJJXhtbTUsMTYoJXJzcCkKKwltb3ZkcWEJMzIoJXJzcCksJXhtbTQKKwltb3ZkcWEJNDgoJXJzcCksJXhtbTUKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXB4b3IJJXhtbTEwLCV4bW0yCisJcHhvcgkleG1tMTEsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorLmJ5dGUJMTAyLDE1LDU2LDAsMjIzCisJcGFkZGQJJXhtbTIsJXhtbTQKKwlwYWRkZAkleG1tMywleG1tNQorCXB4b3IJJXhtbTQsJXhtbTE0CisJcHhvcgkleG1tNSwleG1tMTUKKwltb3ZkcWEJJXhtbTE0LCV4bW02CisJcHNsbGQJJDEyLCV4bW0xNAorCXBzcmxkCSQyMCwleG1tNgorCW1vdmRxYQkleG1tMTUsJXhtbTcKKwlwc2xsZAkkMTIsJXhtbTE1CisJcG9yCSV4bW02LCV4bW0xNAorCXBzcmxkCSQyMCwleG1tNworCW1vdmRxYQkoJXIxMSksJXhtbTYKKwlwb3IJJXhtbTcsJXhtbTE1CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMgorCXB4b3IJJXhtbTExLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMgorCXBhZGRkCSV4bW0yLCV4bW00CisJcGFkZGQJJXhtbTMsJXhtbTUKKwlweG9yCSV4bW00LCV4bW0xNAorCXB4b3IJJXhtbTUsJXhtbTE1CisJbW92ZHFhCSV4bW0xNCwleG1tNworCXBzbGxkCSQ3LCV4bW0xNAorCXBzcmxkCSQyNSwleG1tNworCW1vdmRxYQkleG1tMTUsJXhtbTYKKwlwc2xsZAkkNywleG1tMTUKKwlwb3IJJXhtbTcsJXhtbTE0CisJcHNybGQJJDI1LCV4bW02CisJbW92ZHFhCSglcjEwKSwleG1tNworCXBvcgkleG1tNiwleG1tMTUKKwlwYWRkZAkleG1tMTMsJXhtbTgKKwlwYWRkZAkleG1tMTQsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0zCisJcHhvcgkleG1tOSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjIzCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwlwYWRkZAkleG1tMywleG1tNAorCXBhZGRkCSV4bW0wLCV4bW01CisJcHhvcgkleG1tNCwleG1tMTMKKwlweG9yCSV4bW01LCV4bW0xNAorCW1vdmRxYQkleG1tMTMsJXhtbTYKKwlwc2xsZAkkMTIsJXhtbTEzCisJcHNybGQJJDIwLCV4bW02CisJbW92ZHFhCSV4bW0xNCwleG1tNworCXBzbGxkCSQxMiwleG1tMTQKKwlwb3IJJXhtbTYsJXhtbTEzCisJcHNybGQJJDIwLCV4bW03CisJbW92ZHFhCSglcjExKSwleG1tNgorCXBvcgkleG1tNywleG1tMTQKKwlwYWRkZAkleG1tMTMsJXhtbTgKKwlwYWRkZAkleG1tMTQsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0zCisJcHhvcgkleG1tOSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjIyCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTgKKwlwYWRkZAkleG1tMywleG1tNAorCXBhZGRkCSV4bW0wLCV4bW01CisJcHhvcgkleG1tNCwleG1tMTMKKwlweG9yCSV4bW01LCV4bW0xNAorCW1vdmRxYQkleG1tMTMsJXhtbTcKKwlwc2xsZAkkNywleG1tMTMKKwlwc3JsZAkkMjUsJXhtbTcKKwltb3ZkcWEJJXhtbTE0LCV4bW02CisJcHNsbGQJJDcsJXhtbTE0CisJcG9yCSV4bW03LCV4bW0xMworCXBzcmxkCSQyNSwleG1tNgorCW1vdmRxYQkoJXIxMCksJXhtbTcKKwlwb3IJJXhtbTYsJXhtbTE0CisJbW92ZHFhCSV4bW00LDMyKCVyc3ApCisJbW92ZHFhCSV4bW01LDQ4KCVyc3ApCisJbW92ZHFhCTAoJXJzcCksJXhtbTQKKwltb3ZkcWEJMTYoJXJzcCksJXhtbTUKKwlwYWRkZAkleG1tMTUsJXhtbTEwCisJcGFkZGQJJXhtbTEyLCV4bW0xMQorCXB4b3IJJXhtbTEwLCV4bW0xCisJcHhvcgkleG1tMTEsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNworLmJ5dGUJMTAyLDE1LDU2LDAsMjE1CisJcGFkZGQJJXhtbTEsJXhtbTQKKwlwYWRkZAkleG1tMiwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTE1CisJcHhvcgkleG1tNSwleG1tMTIKKwltb3ZkcWEJJXhtbTE1LCV4bW02CisJcHNsbGQJJDEyLCV4bW0xNQorCXBzcmxkCSQyMCwleG1tNgorCW1vdmRxYQkleG1tMTIsJXhtbTcKKwlwc2xsZAkkMTIsJXhtbTEyCisJcG9yCSV4bW02LCV4bW0xNQorCXBzcmxkCSQyMCwleG1tNworCW1vdmRxYQkoJXIxMSksJXhtbTYKKwlwb3IJJXhtbTcsJXhtbTEyCisJcGFkZGQJJXhtbTE1LCV4bW0xMAorCXBhZGRkCSV4bW0xMiwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMQorCXB4b3IJJXhtbTExLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDYKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNAorCXBhZGRkCSV4bW0xLCV4bW00CisJcGFkZGQJJXhtbTIsJXhtbTUKKwlweG9yCSV4bW00LCV4bW0xNQorCXB4b3IJJXhtbTUsJXhtbTEyCisJbW92ZHFhCSV4bW0xNSwleG1tNworCXBzbGxkCSQ3LCV4bW0xNQorCXBzcmxkCSQyNSwleG1tNworCW1vdmRxYQkleG1tMTIsJXhtbTYKKwlwc2xsZAkkNywleG1tMTIKKwlwb3IJJXhtbTcsJXhtbTE1CisJcHNybGQJJDI1LCV4bW02CisJbW92ZHFhCSglcjEwKSwleG1tNworCXBvcgkleG1tNiwleG1tMTIKKwlkZWNsCSVlYXgKKwlqbnoJLkxvb3A0eAorCisJcGFkZGQJNjQoJXJzcCksJXhtbTgKKwlwYWRkZAk4MCglcnNwKSwleG1tOQorCXBhZGRkCTk2KCVyc3ApLCV4bW0xMAorCXBhZGRkCTExMiglcnNwKSwleG1tMTEKKworCW1vdmRxYQkleG1tOCwleG1tNgorCXB1bnBja2xkcQkleG1tOSwleG1tOAorCW1vdmRxYQkleG1tMTAsJXhtbTcKKwlwdW5wY2tsZHEJJXhtbTExLCV4bW0xMAorCXB1bnBja2hkcQkleG1tOSwleG1tNgorCXB1bnBja2hkcQkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwlwdW5wY2tscWRxCSV4bW0xMCwleG1tOAorCW1vdmRxYQkleG1tNiwleG1tMTEKKwlwdW5wY2tscWRxCSV4bW03LCV4bW02CisJcHVucGNraHFkcQkleG1tMTAsJXhtbTkKKwlwdW5wY2tocWRxCSV4bW03LCV4bW0xMQorCXBhZGRkCTEyOC0yNTYoJXJjeCksJXhtbTEyCisJcGFkZGQJMTQ0LTI1NiglcmN4KSwleG1tMTMKKwlwYWRkZAkxNjAtMjU2KCVyY3gpLCV4bW0xNAorCXBhZGRkCTE3Ni0yNTYoJXJjeCksJXhtbTE1CisKKwltb3ZkcWEJJXhtbTgsMCglcnNwKQorCW1vdmRxYQkleG1tOSwxNiglcnNwKQorCW1vdmRxYQkzMiglcnNwKSwleG1tOAorCW1vdmRxYQk0OCglcnNwKSwleG1tOQorCisJbW92ZHFhCSV4bW0xMiwleG1tMTAKKwlwdW5wY2tsZHEJJXhtbTEzLCV4bW0xMgorCW1vdmRxYQkleG1tMTQsJXhtbTcKKwlwdW5wY2tsZHEJJXhtbTE1LCV4bW0xNAorCXB1bnBja2hkcQkleG1tMTMsJXhtbTEwCisJcHVucGNraGRxCSV4bW0xNSwleG1tNworCW1vdmRxYQkleG1tMTIsJXhtbTEzCisJcHVucGNrbHFkcQkleG1tMTQsJXhtbTEyCisJbW92ZHFhCSV4bW0xMCwleG1tMTUKKwlwdW5wY2tscWRxCSV4bW03LCV4bW0xMAorCXB1bnBja2hxZHEJJXhtbTE0LCV4bW0xMworCXB1bnBja2hxZHEJJXhtbTcsJXhtbTE1CisJcGFkZGQJMTkyLTI1NiglcmN4KSwleG1tNAorCXBhZGRkCTIwOC0yNTYoJXJjeCksJXhtbTUKKwlwYWRkZAkyMjQtMjU2KCVyY3gpLCV4bW04CisJcGFkZGQJMjQwLTI1NiglcmN4KSwleG1tOQorCisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJbW92ZHFhCSV4bW0xMSw0OCglcnNwKQorCisJbW92ZHFhCSV4bW00LCV4bW0xNAorCXB1bnBja2xkcQkleG1tNSwleG1tNAorCW1vdmRxYQkleG1tOCwleG1tNworCXB1bnBja2xkcQkleG1tOSwleG1tOAorCXB1bnBja2hkcQkleG1tNSwleG1tMTQKKwlwdW5wY2toZHEJJXhtbTksJXhtbTcKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwlwdW5wY2tscWRxCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW0xNCwleG1tOQorCXB1bnBja2xxZHEJJXhtbTcsJXhtbTE0CisJcHVucGNraHFkcQkleG1tOCwleG1tNQorCXB1bnBja2hxZHEJJXhtbTcsJXhtbTkKKwlwYWRkZAkyNTYtMjU2KCVyY3gpLCV4bW0wCisJcGFkZGQJMjcyLTI1NiglcmN4KSwleG1tMQorCXBhZGRkCTI4OC0yNTYoJXJjeCksJXhtbTIKKwlwYWRkZAkzMDQtMjU2KCVyY3gpLCV4bW0zCisKKwltb3ZkcWEJJXhtbTAsJXhtbTgKKwlwdW5wY2tsZHEJJXhtbTEsJXhtbTAKKwltb3ZkcWEJJXhtbTIsJXhtbTcKKwlwdW5wY2tsZHEJJXhtbTMsJXhtbTIKKwlwdW5wY2toZHEJJXhtbTEsJXhtbTgKKwlwdW5wY2toZHEJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW04LCV4bW0zCisJcHVucGNrbHFkcQkleG1tNywleG1tOAorCXB1bnBja2hxZHEJJXhtbTIsJXhtbTEKKwlwdW5wY2tocWRxCSV4bW03LCV4bW0zCisJY21wcQkkMjU2LCVyZHgKKwlqYgkuTHRhaWw0eAorCisJbW92ZHF1CTAoJXJzaSksJXhtbTYKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTExCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJbW92ZHF1CTQ4KCVyc2kpLCV4bW03CisJcHhvcgkwKCVyc3ApLCV4bW02CisJcHhvcgkleG1tMTIsJXhtbTExCisJcHhvcgkleG1tNCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTcKKworCW1vdmRxdQkleG1tNiwwKCVyZGkpCisJbW92ZHF1CTY0KCVyc2kpLCV4bW02CisJbW92ZHF1CSV4bW0xMSwxNiglcmRpKQorCW1vdmRxdQk4MCglcnNpKSwleG1tMTEKKwltb3ZkcXUJJXhtbTIsMzIoJXJkaSkKKwltb3ZkcXUJOTYoJXJzaSksJXhtbTIKKwltb3ZkcXUJJXhtbTcsNDgoJXJkaSkKKwltb3ZkcXUJMTEyKCVyc2kpLCV4bW03CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXB4b3IJMTYoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xMywleG1tMTEKKwlweG9yCSV4bW01LCV4bW0yCisJcHhvcgkleG1tMSwleG1tNworCisJbW92ZHF1CSV4bW02LDY0KCVyZGkpCisJbW92ZHF1CTAoJXJzaSksJXhtbTYKKwltb3ZkcXUJJXhtbTExLDgwKCVyZGkpCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xMQorCW1vdmRxdQkleG1tMiw5NiglcmRpKQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQkleG1tNywxMTIoJXJkaSkKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisJbW92ZHF1CTQ4KCVyc2kpLCV4bW03CisJcHhvcgkzMiglcnNwKSwleG1tNgorCXB4b3IJJXhtbTEwLCV4bW0xMQorCXB4b3IJJXhtbTE0LCV4bW0yCisJcHhvcgkleG1tOCwleG1tNworCisJbW92ZHF1CSV4bW02LDAoJXJkaSkKKwltb3ZkcXUJNjQoJXJzaSksJXhtbTYKKwltb3ZkcXUJJXhtbTExLDE2KCVyZGkpCisJbW92ZHF1CTgwKCVyc2kpLCV4bW0xMQorCW1vdmRxdQkleG1tMiwzMiglcmRpKQorCW1vdmRxdQk5NiglcnNpKSwleG1tMgorCW1vdmRxdQkleG1tNyw0OCglcmRpKQorCW1vdmRxdQkxMTIoJXJzaSksJXhtbTcKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJcHhvcgk0OCglcnNwKSwleG1tNgorCXB4b3IJJXhtbTE1LCV4bW0xMQorCXB4b3IJJXhtbTksJXhtbTIKKwlweG9yCSV4bW0zLCV4bW03CisJbW92ZHF1CSV4bW02LDY0KCVyZGkpCisJbW92ZHF1CSV4bW0xMSw4MCglcmRpKQorCW1vdmRxdQkleG1tMiw5NiglcmRpKQorCW1vdmRxdQkleG1tNywxMTIoJXJkaSkKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisKKwlzdWJxCSQyNTYsJXJkeAorCWpuegkuTG9vcF9vdXRlcjR4CisKKwlqbXAJLkxkb25lNHgKKworLkx0YWlsNHg6CisJY21wcQkkMTkyLCVyZHgKKwlqYWUJLkwxOTJfb3JfbW9yZTR4CisJY21wcQkkMTI4LCVyZHgKKwlqYWUJLkwxMjhfb3JfbW9yZTR4CisJY21wcQkkNjQsJXJkeAorCWphZQkuTDY0X29yX21vcmU0eAorCisKKwl4b3JxCSVyMTAsJXIxMAorCisJbW92ZHFhCSV4bW0xMiwxNiglcnNwKQorCW1vdmRxYQkleG1tNCwzMiglcnNwKQorCW1vdmRxYQkleG1tMCw0OCglcnNwKQorCWptcAkuTG9vcF90YWlsNHgKKworLmFsaWduCTMyCisuTDY0X29yX21vcmU0eDoKKwltb3ZkcXUJMCglcnNpKSwleG1tNgorCW1vdmRxdQkxNiglcnNpKSwleG1tMTEKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTcKKwlweG9yCTAoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xMiwleG1tMTEKKwlweG9yCSV4bW00LCV4bW0yCisJcHhvcgkleG1tMCwleG1tNworCW1vdmRxdQkleG1tNiwwKCVyZGkpCisJbW92ZHF1CSV4bW0xMSwxNiglcmRpKQorCW1vdmRxdQkleG1tMiwzMiglcmRpKQorCW1vdmRxdQkleG1tNyw0OCglcmRpKQorCWplCS5MZG9uZTR4CisKKwltb3ZkcWEJMTYoJXJzcCksJXhtbTYKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwl4b3JxCSVyMTAsJXIxMAorCW1vdmRxYQkleG1tNiwwKCVyc3ApCisJbW92ZHFhCSV4bW0xMywxNiglcnNwKQorCWxlYXEJNjQoJXJkaSksJXJkaQorCW1vdmRxYQkleG1tNSwzMiglcnNwKQorCXN1YnEJJDY0LCVyZHgKKwltb3ZkcWEJJXhtbTEsNDgoJXJzcCkKKwlqbXAJLkxvb3BfdGFpbDR4CisKKy5hbGlnbgkzMgorLkwxMjhfb3JfbW9yZTR4OgorCW1vdmRxdQkwKCVyc2kpLCV4bW02CisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tNworCXB4b3IJMCglcnNwKSwleG1tNgorCXB4b3IJJXhtbTEyLCV4bW0xMQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW03CisKKwltb3ZkcXUJJXhtbTYsMCglcmRpKQorCW1vdmRxdQk2NCglcnNpKSwleG1tNgorCW1vdmRxdQkleG1tMTEsMTYoJXJkaSkKKwltb3ZkcXUJODAoJXJzaSksJXhtbTExCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CTk2KCVyc2kpLCV4bW0yCisJbW92ZHF1CSV4bW03LDQ4KCVyZGkpCisJbW92ZHF1CTExMiglcnNpKSwleG1tNworCXB4b3IJMTYoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xMywleG1tMTEKKwlweG9yCSV4bW01LCV4bW0yCisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxdQkleG1tNiw2NCglcmRpKQorCW1vdmRxdQkleG1tMTEsODAoJXJkaSkKKwltb3ZkcXUJJXhtbTIsOTYoJXJkaSkKKwltb3ZkcXUJJXhtbTcsMTEyKCVyZGkpCisJamUJLkxkb25lNHgKKworCW1vdmRxYQkzMiglcnNwKSwleG1tNgorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwl4b3JxCSVyMTAsJXIxMAorCW1vdmRxYQkleG1tNiwwKCVyc3ApCisJbW92ZHFhCSV4bW0xMCwxNiglcnNwKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwltb3ZkcWEJJXhtbTE0LDMyKCVyc3ApCisJc3VicQkkMTI4LCVyZHgKKwltb3ZkcWEJJXhtbTgsNDgoJXJzcCkKKwlqbXAJLkxvb3BfdGFpbDR4CisKKy5hbGlnbgkzMgorLkwxOTJfb3JfbW9yZTR4OgorCW1vdmRxdQkwKCVyc2kpLCV4bW02CisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tNworCXB4b3IJMCglcnNwKSwleG1tNgorCXB4b3IJJXhtbTEyLCV4bW0xMQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW03CisKKwltb3ZkcXUJJXhtbTYsMCglcmRpKQorCW1vdmRxdQk2NCglcnNpKSwleG1tNgorCW1vdmRxdQkleG1tMTEsMTYoJXJkaSkKKwltb3ZkcXUJODAoJXJzaSksJXhtbTExCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CTk2KCVyc2kpLCV4bW0yCisJbW92ZHF1CSV4bW03LDQ4KCVyZGkpCisJbW92ZHF1CTExMiglcnNpKSwleG1tNworCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlweG9yCTE2KCVyc3ApLCV4bW02CisJcHhvcgkleG1tMTMsJXhtbTExCisJcHhvcgkleG1tNSwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTcKKworCW1vdmRxdQkleG1tNiw2NCglcmRpKQorCW1vdmRxdQkwKCVyc2kpLCV4bW02CisJbW92ZHF1CSV4bW0xMSw4MCglcmRpKQorCW1vdmRxdQkxNiglcnNpKSwleG1tMTEKKwltb3ZkcXUJJXhtbTIsOTYoJXJkaSkKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwltb3ZkcXUJJXhtbTcsMTEyKCVyZGkpCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCW1vdmRxdQk0OCglcnNpKSwleG1tNworCXB4b3IJMzIoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xMCwleG1tMTEKKwlweG9yCSV4bW0xNCwleG1tMgorCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcXUJJXhtbTYsMCglcmRpKQorCW1vdmRxdQkleG1tMTEsMTYoJXJkaSkKKwltb3ZkcXUJJXhtbTIsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTcsNDgoJXJkaSkKKwlqZQkuTGRvbmU0eAorCisJbW92ZHFhCTQ4KCVyc3ApLCV4bW02CisJbGVhcQk2NCglcnNpKSwlcnNpCisJeG9ycQklcjEwLCVyMTAKKwltb3ZkcWEJJXhtbTYsMCglcnNwKQorCW1vdmRxYQkleG1tMTUsMTYoJXJzcCkKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwltb3ZkcWEJJXhtbTksMzIoJXJzcCkKKwlzdWJxCSQxOTIsJXJkeAorCW1vdmRxYQkleG1tMyw0OCglcnNwKQorCisuTG9vcF90YWlsNHg6CisJbW92emJsCSglcnNpLCVyMTAsMSksJWVheAorCW1vdnpibAkoJXJzcCwlcjEwLDEpLCVlY3gKKwlsZWFxCTEoJXIxMCksJXIxMAorCXhvcmwJJWVjeCwlZWF4CisJbW92YgklYWwsLTEoJXJkaSwlcjEwLDEpCisJZGVjcQklcmR4CisJam56CS5Mb29wX3RhaWw0eAorCisuTGRvbmU0eDoKKwlsZWFxCSglcjkpLCVyc3AKKy5MNHhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlDaGFDaGEyMF80eCwuLUNoYUNoYTIwXzR4CisudHlwZQlDaGFDaGEyMF84eCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorQ2hhQ2hhMjBfOHg6CisuTENoYUNoYTIwXzh4OgorCW1vdnEJJXJzcCwlcjkKKwlzdWJxCSQweDI4MCs4LCVyc3AKKwlhbmRxCSQtMzIsJXJzcAorCXZ6ZXJvdXBwZXIKKworCisKKworCisKKworCisKKworCXZicm9hZGNhc3RpMTI4CS5Mc2lnbWEoJXJpcCksJXltbTExCisJdmJyb2FkY2FzdGkxMjgJKCVyY3gpLCV5bW0zCisJdmJyb2FkY2FzdGkxMjgJMTYoJXJjeCksJXltbTE1CisJdmJyb2FkY2FzdGkxMjgJKCVyOCksJXltbTcKKwlsZWFxCTI1NiglcnNwKSwlcmN4CisJbGVhcQk1MTIoJXJzcCksJXJheAorCWxlYXEJLkxyb3QxNiglcmlwKSwlcjEwCisJbGVhcQkuTHJvdDI0KCVyaXApLCVyMTEKKworCXZwc2h1ZmQJJDB4MDAsJXltbTExLCV5bW04CisJdnBzaHVmZAkkMHg1NSwleW1tMTEsJXltbTkKKwl2bW92ZHFhCSV5bW04LDEyOC0yNTYoJXJjeCkKKwl2cHNodWZkCSQweGFhLCV5bW0xMSwleW1tMTAKKwl2bW92ZHFhCSV5bW05LDE2MC0yNTYoJXJjeCkKKwl2cHNodWZkCSQweGZmLCV5bW0xMSwleW1tMTEKKwl2bW92ZHFhCSV5bW0xMCwxOTItMjU2KCVyY3gpCisJdm1vdmRxYQkleW1tMTEsMjI0LTI1NiglcmN4KQorCisJdnBzaHVmZAkkMHgwMCwleW1tMywleW1tMAorCXZwc2h1ZmQJJDB4NTUsJXltbTMsJXltbTEKKwl2bW92ZHFhCSV5bW0wLDI1Ni0yNTYoJXJjeCkKKwl2cHNodWZkCSQweGFhLCV5bW0zLCV5bW0yCisJdm1vdmRxYQkleW1tMSwyODgtMjU2KCVyY3gpCisJdnBzaHVmZAkkMHhmZiwleW1tMywleW1tMworCXZtb3ZkcWEJJXltbTIsMzIwLTI1NiglcmN4KQorCXZtb3ZkcWEJJXltbTMsMzUyLTI1NiglcmN4KQorCisJdnBzaHVmZAkkMHgwMCwleW1tMTUsJXltbTEyCisJdnBzaHVmZAkkMHg1NSwleW1tMTUsJXltbTEzCisJdm1vdmRxYQkleW1tMTIsMzg0LTUxMiglcmF4KQorCXZwc2h1ZmQJJDB4YWEsJXltbTE1LCV5bW0xNAorCXZtb3ZkcWEJJXltbTEzLDQxNi01MTIoJXJheCkKKwl2cHNodWZkCSQweGZmLCV5bW0xNSwleW1tMTUKKwl2bW92ZHFhCSV5bW0xNCw0NDgtNTEyKCVyYXgpCisJdm1vdmRxYQkleW1tMTUsNDgwLTUxMiglcmF4KQorCisJdnBzaHVmZAkkMHgwMCwleW1tNywleW1tNAorCXZwc2h1ZmQJJDB4NTUsJXltbTcsJXltbTUKKwl2cGFkZGQJLkxpbmN5KCVyaXApLCV5bW00LCV5bW00CisJdnBzaHVmZAkkMHhhYSwleW1tNywleW1tNgorCXZtb3ZkcWEJJXltbTUsNTQ0LTUxMiglcmF4KQorCXZwc2h1ZmQJJDB4ZmYsJXltbTcsJXltbTcKKwl2bW92ZHFhCSV5bW02LDU3Ni01MTIoJXJheCkKKwl2bW92ZHFhCSV5bW03LDYwOC01MTIoJXJheCkKKworCWptcAkuTG9vcF9lbnRlcjh4CisKKy5hbGlnbgkzMgorLkxvb3Bfb3V0ZXI4eDoKKwl2bW92ZHFhCTEyOC0yNTYoJXJjeCksJXltbTgKKwl2bW92ZHFhCTE2MC0yNTYoJXJjeCksJXltbTkKKwl2bW92ZHFhCTE5Mi0yNTYoJXJjeCksJXltbTEwCisJdm1vdmRxYQkyMjQtMjU2KCVyY3gpLCV5bW0xMQorCXZtb3ZkcWEJMjU2LTI1NiglcmN4KSwleW1tMAorCXZtb3ZkcWEJMjg4LTI1NiglcmN4KSwleW1tMQorCXZtb3ZkcWEJMzIwLTI1NiglcmN4KSwleW1tMgorCXZtb3ZkcWEJMzUyLTI1NiglcmN4KSwleW1tMworCXZtb3ZkcWEJMzg0LTUxMiglcmF4KSwleW1tMTIKKwl2bW92ZHFhCTQxNi01MTIoJXJheCksJXltbTEzCisJdm1vdmRxYQk0NDgtNTEyKCVyYXgpLCV5bW0xNAorCXZtb3ZkcWEJNDgwLTUxMiglcmF4KSwleW1tMTUKKwl2bW92ZHFhCTUxMi01MTIoJXJheCksJXltbTQKKwl2bW92ZHFhCTU0NC01MTIoJXJheCksJXltbTUKKwl2bW92ZHFhCTU3Ni01MTIoJXJheCksJXltbTYKKwl2bW92ZHFhCTYwOC01MTIoJXJheCksJXltbTcKKwl2cGFkZGQJLkxlaWdodCglcmlwKSwleW1tNCwleW1tNAorCisuTG9vcF9lbnRlcjh4OgorCXZtb3ZkcWEJJXltbTE0LDY0KCVyc3ApCisJdm1vdmRxYQkleW1tMTUsOTYoJXJzcCkKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMCksJXltbTE1CisJdm1vdmRxYQkleW1tNCw1MTItNTEyKCVyYXgpCisJbW92bAkkMTAsJWVheAorCWptcAkuTG9vcDh4CisKKy5hbGlnbgkzMgorLkxvb3A4eDoKKwl2cGFkZGQJJXltbTAsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tNCwleW1tOCwleW1tNAorCXZwc2h1ZmIJJXltbTE1LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW0xLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTUsJXltbTksJXltbTUKKwl2cHNodWZiCSV5bW0xNSwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNCwleW1tMTIsJXltbTEyCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0wCisJdnBzbGxkCSQxMiwleW1tMCwleW1tMTQKKwl2cHNybGQJJDIwLCV5bW0wLCV5bW0wCisJdnBvcgkleW1tMCwleW1tMTQsJXltbTAKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMSksJXltbTE0CisJdnBhZGRkCSV5bW01LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEKKwl2cHNsbGQJJDEyLCV5bW0xLCV5bW0xNQorCXZwc3JsZAkkMjAsJXltbTEsJXltbTEKKwl2cG9yCSV5bW0xLCV5bW0xNSwleW1tMQorCXZwYWRkZAkleW1tMCwleW1tOCwleW1tOAorCXZweG9yCSV5bW00LCV5bW04LCV5bW00CisJdnBzaHVmYgkleW1tMTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTEsJXltbTksJXltbTkKKwl2cHhvcgkleW1tNSwleW1tOSwleW1tNQorCXZwc2h1ZmIJJXltbTE0LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW00LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTAKKwl2cHNsbGQJJDcsJXltbTAsJXltbTE1CisJdnBzcmxkCSQyNSwleW1tMCwleW1tMAorCXZwb3IJJXltbTAsJXltbTE1LCV5bW0wCisJdmJyb2FkY2FzdGkxMjgJKCVyMTApLCV5bW0xNQorCXZwYWRkZAkleW1tNSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xCisJdnBzbGxkCSQ3LCV5bW0xLCV5bW0xNAorCXZwc3JsZAkkMjUsJXltbTEsJXltbTEKKwl2cG9yCSV5bW0xLCV5bW0xNCwleW1tMQorCXZtb3ZkcWEJJXltbTEyLDAoJXJzcCkKKwl2bW92ZHFhCSV5bW0xMywzMiglcnNwKQorCXZtb3ZkcWEJNjQoJXJzcCksJXltbTEyCisJdm1vdmRxYQk5NiglcnNwKSwleW1tMTMKKwl2cGFkZGQJJXltbTIsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW02LCV5bW0xMCwleW1tNgorCXZwc2h1ZmIJJXltbTE1LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW0zLCV5bW0xMSwleW1tMTEKKwl2cHhvcgkleW1tNywleW1tMTEsJXltbTcKKwl2cHNodWZiCSV5bW0xNSwleW1tNywleW1tNworCXZwYWRkZAkleW1tNiwleW1tMTIsJXltbTEyCisJdnB4b3IJJXltbTIsJXltbTEyLCV5bW0yCisJdnBzbGxkCSQxMiwleW1tMiwleW1tMTQKKwl2cHNybGQJJDIwLCV5bW0yLCV5bW0yCisJdnBvcgkleW1tMiwleW1tMTQsJXltbTIKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMSksJXltbTE0CisJdnBhZGRkCSV5bW03LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMywleW1tMTMsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW0zLCV5bW0xNQorCXZwc3JsZAkkMjAsJXltbTMsJXltbTMKKwl2cG9yCSV5bW0zLCV5bW0xNSwleW1tMworCXZwYWRkZAkleW1tMiwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTYsJXltbTEwLCV5bW02CisJdnBzaHVmYgkleW1tMTQsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTMsJXltbTExLCV5bW0xMQorCXZweG9yCSV5bW03LCV5bW0xMSwleW1tNworCXZwc2h1ZmIJJXltbTE0LCV5bW03LCV5bW03CisJdnBhZGRkCSV5bW02LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMiwleW1tMTIsJXltbTIKKwl2cHNsbGQJJDcsJXltbTIsJXltbTE1CisJdnBzcmxkCSQyNSwleW1tMiwleW1tMgorCXZwb3IJJXltbTIsJXltbTE1LCV5bW0yCisJdmJyb2FkY2FzdGkxMjgJKCVyMTApLCV5bW0xNQorCXZwYWRkZAkleW1tNywleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTMsJXltbTEzLCV5bW0zCisJdnBzbGxkCSQ3LCV5bW0zLCV5bW0xNAorCXZwc3JsZAkkMjUsJXltbTMsJXltbTMKKwl2cG9yCSV5bW0zLCV5bW0xNCwleW1tMworCXZwYWRkZAkleW1tMSwleW1tOCwleW1tOAorCXZweG9yCSV5bW03LCV5bW04LCV5bW03CisJdnBzaHVmYgkleW1tMTUsJXltbTcsJXltbTcKKwl2cGFkZGQJJXltbTIsJXltbTksJXltbTkKKwl2cHhvcgkleW1tNCwleW1tOSwleW1tNAorCXZwc2h1ZmIJJXltbTE1LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW03LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMSwleW1tMTIsJXltbTEKKwl2cHNsbGQJJDEyLCV5bW0xLCV5bW0xNAorCXZwc3JsZAkkMjAsJXltbTEsJXltbTEKKwl2cG9yCSV5bW0xLCV5bW0xNCwleW1tMQorCXZicm9hZGNhc3RpMTI4CSglcjExKSwleW1tMTQKKwl2cGFkZGQJJXltbTQsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0yLCV5bW0xMywleW1tMgorCXZwc2xsZAkkMTIsJXltbTIsJXltbTE1CisJdnBzcmxkCSQyMCwleW1tMiwleW1tMgorCXZwb3IJJXltbTIsJXltbTE1LCV5bW0yCisJdnBhZGRkCSV5bW0xLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTcsJXltbTgsJXltbTcKKwl2cHNodWZiCSV5bW0xNCwleW1tNywleW1tNworCXZwYWRkZAkleW1tMiwleW1tOSwleW1tOQorCXZweG9yCSV5bW00LCV5bW05LCV5bW00CisJdnBzaHVmYgkleW1tMTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTcsJXltbTEyLCV5bW0xMgorCXZweG9yCSV5bW0xLCV5bW0xMiwleW1tMQorCXZwc2xsZAkkNywleW1tMSwleW1tMTUKKwl2cHNybGQJJDI1LCV5bW0xLCV5bW0xCisJdnBvcgkleW1tMSwleW1tMTUsJXltbTEKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMCksJXltbTE1CisJdnBhZGRkCSV5bW00LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMiwleW1tMTMsJXltbTIKKwl2cHNsbGQJJDcsJXltbTIsJXltbTE0CisJdnBzcmxkCSQyNSwleW1tMiwleW1tMgorCXZwb3IJJXltbTIsJXltbTE0LCV5bW0yCisJdm1vdmRxYQkleW1tMTIsNjQoJXJzcCkKKwl2bW92ZHFhCSV5bW0xMyw5NiglcnNwKQorCXZtb3ZkcWEJMCglcnNwKSwleW1tMTIKKwl2bW92ZHFhCTMyKCVyc3ApLCV5bW0xMworCXZwYWRkZAkleW1tMywleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTUsJXltbTEwLCV5bW01CisJdnBzaHVmYgkleW1tMTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTAsJXltbTExLCV5bW0xMQorCXZweG9yCSV5bW02LCV5bW0xMSwleW1tNgorCXZwc2h1ZmIJJXltbTE1LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW01LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMywleW1tMTIsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW0zLCV5bW0xNAorCXZwc3JsZAkkMjAsJXltbTMsJXltbTMKKwl2cG9yCSV5bW0zLCV5bW0xNCwleW1tMworCXZicm9hZGNhc3RpMTI4CSglcjExKSwleW1tMTQKKwl2cGFkZGQJJXltbTYsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMywleW1tMAorCXZwc2xsZAkkMTIsJXltbTAsJXltbTE1CisJdnBzcmxkCSQyMCwleW1tMCwleW1tMAorCXZwb3IJJXltbTAsJXltbTE1LCV5bW0wCisJdnBhZGRkCSV5bW0zLCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tNSwleW1tMTAsJXltbTUKKwl2cHNodWZiCSV5bW0xNCwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tMCwleW1tMTEsJXltbTExCisJdnB4b3IJJXltbTYsJXltbTExLCV5bW02CisJdnBzaHVmYgkleW1tMTQsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTUsJXltbTEyLCV5bW0xMgorCXZweG9yCSV5bW0zLCV5bW0xMiwleW1tMworCXZwc2xsZAkkNywleW1tMywleW1tMTUKKwl2cHNybGQJJDI1LCV5bW0zLCV5bW0zCisJdnBvcgkleW1tMywleW1tMTUsJXltbTMKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMCksJXltbTE1CisJdnBhZGRkCSV5bW02LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTMsJXltbTAKKwl2cHNsbGQJJDcsJXltbTAsJXltbTE0CisJdnBzcmxkCSQyNSwleW1tMCwleW1tMAorCXZwb3IJJXltbTAsJXltbTE0LCV5bW0wCisJZGVjbAklZWF4CisJam56CS5Mb29wOHgKKworCWxlYXEJNTEyKCVyc3ApLCVyYXgKKwl2cGFkZGQJMTI4LTI1NiglcmN4KSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAtMjU2KCVyY3gpLCV5bW05LCV5bW05CisJdnBhZGRkCTE5Mi0yNTYoJXJjeCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQtMjU2KCVyY3gpLCV5bW0xMSwleW1tMTEKKworCXZwdW5wY2tsZHEJJXltbTksJXltbTgsJXltbTE0CisJdnB1bnBja2xkcQkleW1tMTEsJXltbTEwLCV5bW0xNQorCXZwdW5wY2toZHEJJXltbTksJXltbTgsJXltbTgKKwl2cHVucGNraGRxCSV5bW0xMSwleW1tMTAsJXltbTEwCisJdnB1bnBja2xxZHEJJXltbTE1LCV5bW0xNCwleW1tOQorCXZwdW5wY2tocWRxCSV5bW0xNSwleW1tMTQsJXltbTE0CisJdnB1bnBja2xxZHEJJXltbTEwLCV5bW04LCV5bW0xMQorCXZwdW5wY2tocWRxCSV5bW0xMCwleW1tOCwleW1tOAorCXZwYWRkZAkyNTYtMjU2KCVyY3gpLCV5bW0wLCV5bW0wCisJdnBhZGRkCTI4OC0yNTYoJXJjeCksJXltbTEsJXltbTEKKwl2cGFkZGQJMzIwLTI1NiglcmN4KSwleW1tMiwleW1tMgorCXZwYWRkZAkzNTItMjU2KCVyY3gpLCV5bW0zLCV5bW0zCisKKwl2cHVucGNrbGRxCSV5bW0xLCV5bW0wLCV5bW0xMAorCXZwdW5wY2tsZHEJJXltbTMsJXltbTIsJXltbTE1CisJdnB1bnBja2hkcQkleW1tMSwleW1tMCwleW1tMAorCXZwdW5wY2toZHEJJXltbTMsJXltbTIsJXltbTIKKwl2cHVucGNrbHFkcQkleW1tMTUsJXltbTEwLCV5bW0xCisJdnB1bnBja2hxZHEJJXltbTE1LCV5bW0xMCwleW1tMTAKKwl2cHVucGNrbHFkcQkleW1tMiwleW1tMCwleW1tMworCXZwdW5wY2tocWRxCSV5bW0yLCV5bW0wLCV5bW0wCisJdnBlcm0yaTEyOAkkMHgyMCwleW1tMSwleW1tOSwleW1tMTUKKwl2cGVybTJpMTI4CSQweDMxLCV5bW0xLCV5bW05LCV5bW0xCisJdnBlcm0yaTEyOAkkMHgyMCwleW1tMTAsJXltbTE0LCV5bW05CisJdnBlcm0yaTEyOAkkMHgzMSwleW1tMTAsJXltbTE0LCV5bW0xMAorCXZwZXJtMmkxMjgJJDB4MjAsJXltbTMsJXltbTExLCV5bW0xNAorCXZwZXJtMmkxMjgJJDB4MzEsJXltbTMsJXltbTExLCV5bW0zCisJdnBlcm0yaTEyOAkkMHgyMCwleW1tMCwleW1tOCwleW1tMTEKKwl2cGVybTJpMTI4CSQweDMxLCV5bW0wLCV5bW04LCV5bW0wCisJdm1vdmRxYQkleW1tMTUsMCglcnNwKQorCXZtb3ZkcWEJJXltbTksMzIoJXJzcCkKKwl2bW92ZHFhCTY0KCVyc3ApLCV5bW0xNQorCXZtb3ZkcWEJOTYoJXJzcCksJXltbTkKKworCXZwYWRkZAkzODQtNTEyKCVyYXgpLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJNDE2LTUxMiglcmF4KSwleW1tMTMsJXltbTEzCisJdnBhZGRkCTQ0OC01MTIoJXJheCksJXltbTE1LCV5bW0xNQorCXZwYWRkZAk0ODAtNTEyKCVyYXgpLCV5bW05LCV5bW05CisKKwl2cHVucGNrbGRxCSV5bW0xMywleW1tMTIsJXltbTIKKwl2cHVucGNrbGRxCSV5bW05LCV5bW0xNSwleW1tOAorCXZwdW5wY2toZHEJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2cHVucGNraGRxCSV5bW05LCV5bW0xNSwleW1tMTUKKwl2cHVucGNrbHFkcQkleW1tOCwleW1tMiwleW1tMTMKKwl2cHVucGNraHFkcQkleW1tOCwleW1tMiwleW1tMgorCXZwdW5wY2tscWRxCSV5bW0xNSwleW1tMTIsJXltbTkKKwl2cHVucGNraHFkcQkleW1tMTUsJXltbTEyLCV5bW0xMgorCXZwYWRkZAk1MTItNTEyKCVyYXgpLCV5bW00LCV5bW00CisJdnBhZGRkCTU0NC01MTIoJXJheCksJXltbTUsJXltbTUKKwl2cGFkZGQJNTc2LTUxMiglcmF4KSwleW1tNiwleW1tNgorCXZwYWRkZAk2MDgtNTEyKCVyYXgpLCV5bW03LCV5bW03CisKKwl2cHVucGNrbGRxCSV5bW01LCV5bW00LCV5bW0xNQorCXZwdW5wY2tsZHEJJXltbTcsJXltbTYsJXltbTgKKwl2cHVucGNraGRxCSV5bW01LCV5bW00LCV5bW00CisJdnB1bnBja2hkcQkleW1tNywleW1tNiwleW1tNgorCXZwdW5wY2tscWRxCSV5bW04LCV5bW0xNSwleW1tNQorCXZwdW5wY2tocWRxCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHVucGNrbHFkcQkleW1tNiwleW1tNCwleW1tNworCXZwdW5wY2tocWRxCSV5bW02LCV5bW00LCV5bW00CisJdnBlcm0yaTEyOAkkMHgyMCwleW1tNSwleW1tMTMsJXltbTgKKwl2cGVybTJpMTI4CSQweDMxLCV5bW01LCV5bW0xMywleW1tNQorCXZwZXJtMmkxMjgJJDB4MjAsJXltbTE1LCV5bW0yLCV5bW0xMworCXZwZXJtMmkxMjgJJDB4MzEsJXltbTE1LCV5bW0yLCV5bW0xNQorCXZwZXJtMmkxMjgJJDB4MjAsJXltbTcsJXltbTksJXltbTIKKwl2cGVybTJpMTI4CSQweDMxLCV5bW03LCV5bW05LCV5bW03CisJdnBlcm0yaTEyOAkkMHgyMCwleW1tNCwleW1tMTIsJXltbTkKKwl2cGVybTJpMTI4CSQweDMxLCV5bW00LCV5bW0xMiwleW1tNAorCXZtb3ZkcWEJMCglcnNwKSwleW1tNgorCXZtb3ZkcWEJMzIoJXJzcCksJXltbTEyCisKKwljbXBxCSQ1MTIsJXJkeAorCWpiCS5MdGFpbDh4CisKKwl2cHhvcgkwKCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJMzIoJXJzaSksJXltbTgsJXltbTgKKwl2cHhvcgk2NCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTk2KCVyc2kpLCV5bW01LCV5bW01CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXZtb3ZkcXUJJXltbTYsMCglcmRpKQorCXZtb3ZkcXUJJXltbTgsMzIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xLDY0KCVyZGkpCisJdm1vdmRxdQkleW1tNSw5NiglcmRpKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKworCXZweG9yCTAoJXJzaSksJXltbTEyLCV5bW0xMgorCXZweG9yCTMyKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2cHhvcgk2NCglcnNpKSwleW1tMTAsJXltbTEwCisJdnB4b3IJOTYoJXJzaSksJXltbTE1LCV5bW0xNQorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwl2bW92ZHF1CSV5bW0xMiwwKCVyZGkpCisJdm1vdmRxdQkleW1tMTMsMzIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTE1LDk2KCVyZGkpCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCisJdnB4b3IJMCglcnNpKSwleW1tMTQsJXltbTE0CisJdnB4b3IJMzIoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgk2NCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTk2KCVyc2kpLCV5bW03LCV5bW03CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXZtb3ZkcXUJJXltbTE0LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMyw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTcsOTYoJXJkaSkKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisKKwl2cHhvcgkwKCVyc2kpLCV5bW0xMSwleW1tMTEKKwl2cHhvcgkzMiglcnNpKSwleW1tOSwleW1tOQorCXZweG9yCTY0KCVyc2kpLCV5bW0wLCV5bW0wCisJdnB4b3IJOTYoJXJzaSksJXltbTQsJXltbTQKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJdm1vdmRxdQkleW1tMTEsMCglcmRpKQorCXZtb3ZkcXUJJXltbTksMzIoJXJkaSkKKwl2bW92ZHF1CSV5bW0wLDY0KCVyZGkpCisJdm1vdmRxdQkleW1tNCw5NiglcmRpKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKworCXN1YnEJJDUxMiwlcmR4CisJam56CS5Mb29wX291dGVyOHgKKworCWptcAkuTGRvbmU4eAorCisuTHRhaWw4eDoKKwljbXBxCSQ0NDgsJXJkeAorCWphZQkuTDQ0OF9vcl9tb3JlOHgKKwljbXBxCSQzODQsJXJkeAorCWphZQkuTDM4NF9vcl9tb3JlOHgKKwljbXBxCSQzMjAsJXJkeAorCWphZQkuTDMyMF9vcl9tb3JlOHgKKwljbXBxCSQyNTYsJXJkeAorCWphZQkuTDI1Nl9vcl9tb3JlOHgKKwljbXBxCSQxOTIsJXJkeAorCWphZQkuTDE5Ml9vcl9tb3JlOHgKKwljbXBxCSQxMjgsJXJkeAorCWphZQkuTDEyOF9vcl9tb3JlOHgKKwljbXBxCSQ2NCwlcmR4CisJamFlCS5MNjRfb3JfbW9yZTh4CisKKwl4b3JxCSVyMTAsJXIxMAorCXZtb3ZkcWEJJXltbTYsMCglcnNwKQorCXZtb3ZkcWEJJXltbTgsMzIoJXJzcCkKKwlqbXAJLkxvb3BfdGFpbDh4CisKKy5hbGlnbgkzMgorLkw2NF9vcl9tb3JlOHg6CisJdnB4b3IJMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTMyKCVyc2kpLCV5bW04LCV5bW04CisJdm1vdmRxdQkleW1tNiwwKCVyZGkpCisJdm1vdmRxdQkleW1tOCwzMiglcmRpKQorCWplCS5MZG9uZTh4CisKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwl4b3JxCSVyMTAsJXIxMAorCXZtb3ZkcWEJJXltbTEsMCglcnNwKQorCWxlYXEJNjQoJXJkaSksJXJkaQorCXN1YnEJJDY0LCVyZHgKKwl2bW92ZHFhCSV5bW01LDMyKCVyc3ApCisJam1wCS5Mb29wX3RhaWw4eAorCisuYWxpZ24JMzIKKy5MMTI4X29yX21vcmU4eDoKKwl2cHhvcgkwKCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJMzIoJXJzaSksJXltbTgsJXltbTgKKwl2cHhvcgk2NCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTk2KCVyc2kpLCV5bW01LCV5bW01CisJdm1vdmRxdQkleW1tNiwwKCVyZGkpCisJdm1vdmRxdQkleW1tOCwzMiglcmRpKQorCXZtb3ZkcXUJJXltbTEsNjQoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDk2KCVyZGkpCisJamUJLkxkb25lOHgKKworCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwl4b3JxCSVyMTAsJXIxMAorCXZtb3ZkcWEJJXltbTEyLDAoJXJzcCkKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisJc3VicQkkMTI4LCVyZHgKKwl2bW92ZHFhCSV5bW0xMywzMiglcnNwKQorCWptcAkuTG9vcF90YWlsOHgKKworLmFsaWduCTMyCisuTDE5Ml9vcl9tb3JlOHg6CisJdnB4b3IJMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTMyKCVyc2kpLCV5bW04LCV5bW04CisJdnB4b3IJNjQoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk5NiglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTEyOCglcnNpKSwleW1tMTIsJXltbTEyCisJdnB4b3IJMTYwKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiwxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMywxNjAoJXJkaSkKKwlqZQkuTGRvbmU4eAorCisJbGVhcQkxOTIoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMTAsMCglcnNwKQorCWxlYXEJMTkyKCVyZGkpLCVyZGkKKwlzdWJxCSQxOTIsJXJkeAorCXZtb3ZkcWEJJXltbTE1LDMyKCVyc3ApCisJam1wCS5Mb29wX3RhaWw4eAorCisuYWxpZ24JMzIKKy5MMjU2X29yX21vcmU4eDoKKwl2cHhvcgkwKCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJMzIoJXJzaSksJXltbTgsJXltbTgKKwl2cHhvcgk2NCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTk2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJMTI4KCVyc2kpLCV5bW0xMiwleW1tMTIKKwl2cHhvcgkxNjAoJXJzaSksJXltbTEzLCV5bW0xMworCXZweG9yCTE5MiglcnNpKSwleW1tMTAsJXltbTEwCisJdnB4b3IJMjI0KCVyc2kpLCV5bW0xNSwleW1tMTUKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiwxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMywxNjAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCwxOTIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNSwyMjQoJXJkaSkKKwlqZQkuTGRvbmU4eAorCisJbGVhcQkyNTYoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMTQsMCglcnNwKQorCWxlYXEJMjU2KCVyZGkpLCVyZGkKKwlzdWJxCSQyNTYsJXJkeAorCXZtb3ZkcWEJJXltbTIsMzIoJXJzcCkKKwlqbXAJLkxvb3BfdGFpbDh4CisKKy5hbGlnbgkzMgorLkwzMjBfb3JfbW9yZTh4OgorCXZweG9yCTAoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgkzMiglcnNpKSwleW1tOCwleW1tOAorCXZweG9yCTY0KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJOTYoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgkxMjgoJXJzaSksJXltbTEyLCV5bW0xMgorCXZweG9yCTE2MCglcnNpKSwleW1tMTMsJXltbTEzCisJdnB4b3IJMTkyKCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2cHhvcgkyMjQoJXJzaSksJXltbTE1LCV5bW0xNQorCXZweG9yCTI1NiglcnNpKSwleW1tMTQsJXltbTE0CisJdnB4b3IJMjg4KCVyc2kpLCV5bW0yLCV5bW0yCisJdm1vdmRxdQkleW1tNiwwKCVyZGkpCisJdm1vdmRxdQkleW1tOCwzMiglcmRpKQorCXZtb3ZkcXUJJXltbTEsNjQoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDk2KCVyZGkpCisJdm1vdmRxdQkleW1tMTIsMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMTMsMTYwKCVyZGkpCisJdm1vdmRxdQkleW1tMTAsMTkyKCVyZGkpCisJdm1vdmRxdQkleW1tMTUsMjI0KCVyZGkpCisJdm1vdmRxdQkleW1tMTQsMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tMiwyODgoJXJkaSkKKwlqZQkuTGRvbmU4eAorCisJbGVhcQkzMjAoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMywwKCVyc3ApCisJbGVhcQkzMjAoJXJkaSksJXJkaQorCXN1YnEJJDMyMCwlcmR4CisJdm1vdmRxYQkleW1tNywzMiglcnNwKQorCWptcAkuTG9vcF90YWlsOHgKKworLmFsaWduCTMyCisuTDM4NF9vcl9tb3JlOHg6CisJdnB4b3IJMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTMyKCVyc2kpLCV5bW04LCV5bW04CisJdnB4b3IJNjQoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk5NiglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTEyOCglcnNpKSwleW1tMTIsJXltbTEyCisJdnB4b3IJMTYwKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2cHhvcgkxOTIoJXJzaSksJXltbTEwLCV5bW0xMAorCXZweG9yCTIyNCglcnNpKSwleW1tMTUsJXltbTE1CisJdnB4b3IJMjU2KCVyc2kpLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkyODgoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgkzMjAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzNTIoJXJzaSksJXltbTcsJXltbTcKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiwxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMywxNjAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCwxOTIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNSwyMjQoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNCwyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDI4OCglcmRpKQorCXZtb3ZkcXUJJXltbTMsMzIwKCVyZGkpCisJdm1vdmRxdQkleW1tNywzNTIoJXJkaSkKKwlqZQkuTGRvbmU4eAorCisJbGVhcQkzODQoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMTEsMCglcnNwKQorCWxlYXEJMzg0KCVyZGkpLCVyZGkKKwlzdWJxCSQzODQsJXJkeAorCXZtb3ZkcWEJJXltbTksMzIoJXJzcCkKKwlqbXAJLkxvb3BfdGFpbDh4CisKKy5hbGlnbgkzMgorLkw0NDhfb3JfbW9yZTh4OgorCXZweG9yCTAoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgkzMiglcnNpKSwleW1tOCwleW1tOAorCXZweG9yCTY0KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJOTYoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgkxMjgoJXJzaSksJXltbTEyLCV5bW0xMgorCXZweG9yCTE2MCglcnNpKSwleW1tMTMsJXltbTEzCisJdnB4b3IJMTkyKCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2cHhvcgkyMjQoJXJzaSksJXltbTE1LCV5bW0xNQorCXZweG9yCTI1NiglcnNpKSwleW1tMTQsJXltbTE0CisJdnB4b3IJMjg4KCVyc2kpLCV5bW0yLCV5bW0yCisJdnB4b3IJMzIwKCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzUyKCVyc2kpLCV5bW03LCV5bW03CisJdnB4b3IJMzg0KCVyc2kpLCV5bW0xMSwleW1tMTEKKwl2cHhvcgk0MTYoJXJzaSksJXltbTksJXltbTkKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiwxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMywxNjAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCwxOTIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNSwyMjQoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNCwyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDI4OCglcmRpKQorCXZtb3ZkcXUJJXltbTMsMzIwKCVyZGkpCisJdm1vdmRxdQkleW1tNywzNTIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSwzODQoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDQxNiglcmRpKQorCWplCS5MZG9uZTh4CisKKwlsZWFxCTQ0OCglcnNpKSwlcnNpCisJeG9ycQklcjEwLCVyMTAKKwl2bW92ZHFhCSV5bW0wLDAoJXJzcCkKKwlsZWFxCTQ0OCglcmRpKSwlcmRpCisJc3VicQkkNDQ4LCVyZHgKKwl2bW92ZHFhCSV5bW00LDMyKCVyc3ApCisKKy5Mb29wX3RhaWw4eDoKKwltb3Z6YmwJKCVyc2ksJXIxMCwxKSwlZWF4CisJbW92emJsCSglcnNwLCVyMTAsMSksJWVjeAorCWxlYXEJMSglcjEwKSwlcjEwCisJeG9ybAklZWN4LCVlYXgKKwltb3ZiCSVhbCwtMSglcmRpLCVyMTAsMSkKKwlkZWNxCSVyZHgKKwlqbnoJLkxvb3BfdGFpbDh4CisKKy5MZG9uZTh4OgorCXZ6ZXJvYWxsCisJbGVhcQkoJXI5KSwlcnNwCisuTDh4X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJQ2hhQ2hhMjBfOHgsLi1DaGFDaGEyMF84eAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2FlczEyOGdjbXNpdi14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9jaXBoZXJfZXh0cmEvYWVzMTI4Z2Ntc2l2LXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTI1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2FlczEyOGdjbXNpdi14ODZfNjQuUwpAQCAtMCwwICsxLDMwNjYgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLmRhdGEJCisKKy5hbGlnbgkxNgorb25lOgorLnF1YWQJMSwwCit0d286CisucXVhZAkyLDAKK3RocmVlOgorLnF1YWQJMywwCitmb3VyOgorLnF1YWQJNCwwCitmaXZlOgorLnF1YWQJNSwwCitzaXg6CisucXVhZAk2LDAKK3NldmVuOgorLnF1YWQJNywwCitlaWdodDoKKy5xdWFkCTgsMAorCitPUl9NQVNLOgorLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwMDAwMAorcG9seToKKy5xdWFkCTB4MSwgMHhjMjAwMDAwMDAwMDAwMDAwCittYXNrOgorLmxvbmcJMHgwYzBmMGUwZCwweDBjMGYwZTBkLDB4MGMwZjBlMGQsMHgwYzBmMGUwZAorY29uMToKKy5sb25nCTEsMSwxLDEKK2NvbjI6CisubG9uZwkweDFiLDB4MWIsMHgxYiwweDFiCitjb24zOgorLmJ5dGUJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNCw1LDYsNyw0LDUsNiw3CithbmRfbWFzazoKKy5sb25nCTAsMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZgorLnRleHQJCisudHlwZQlHRk1VTCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorR0ZNVUw6CisuY2ZpX3N0YXJ0cHJvYwkKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xLCV4bW0wLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMSwleG1tMCwleG1tNQorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEsJXhtbTAsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xLCV4bW0wLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ4LCV4bW0zLCV4bW00CisJdnBzcmxkcQkkOCwleG1tMywleG1tMworCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnB4b3IJJXhtbTMsJXhtbTUsJXhtbTUKKworCXZwY2xtdWxxZHEJJDB4MTAscG9seSglcmlwKSwleG1tMiwleG1tMworCXZwc2h1ZmQJJDc4LCV4bW0yLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTIKKworCXZwY2xtdWxxZHEJJDB4MTAscG9seSglcmlwKSwleG1tMiwleG1tMworCXZwc2h1ZmQJJDc4LCV4bW0yLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTIKKworCXZweG9yCSV4bW01LCV4bW0yLCV4bW0wCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlHRk1VTCwgLi1HRk1VTAorLmdsb2JsCWFlc2djbXNpdl9odGFibGVfaW5pdAorLmhpZGRlbiBhZXNnY21zaXZfaHRhYmxlX2luaXQKKy50eXBlCWFlc2djbXNpdl9odGFibGVfaW5pdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzZ2Ntc2l2X2h0YWJsZV9pbml0OgorLmNmaV9zdGFydHByb2MJCisJdm1vdmRxYQkoJXJzaSksJXhtbTAKKwl2bW92ZHFhCSV4bW0wLCV4bW0xCisJdm1vdmRxYQkleG1tMCwoJXJkaSkKKwljYWxsCUdGTVVMCisJdm1vdmRxYQkleG1tMCwxNiglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDMyKCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsNDgoJXJkaSkKKwljYWxsCUdGTVVMCisJdm1vdmRxYQkleG1tMCw2NCglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDgwKCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsOTYoJXJkaSkKKwljYWxsCUdGTVVMCisJdm1vdmRxYQkleG1tMCwxMTIoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlc2djbXNpdl9odGFibGVfaW5pdCwgLi1hZXNnY21zaXZfaHRhYmxlX2luaXQKKy5nbG9ibAlhZXNnY21zaXZfaHRhYmxlNl9pbml0CisuaGlkZGVuIGFlc2djbXNpdl9odGFibGU2X2luaXQKKy50eXBlCWFlc2djbXNpdl9odGFibGU2X2luaXQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc2djbXNpdl9odGFibGU2X2luaXQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwl2bW92ZHFhCSglcnNpKSwleG1tMAorCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKwl2bW92ZHFhCSV4bW0wLCglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDE2KCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsMzIoJXJkaSkKKwljYWxsCUdGTVVMCisJdm1vdmRxYQkleG1tMCw0OCglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDY0KCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsODAoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlc2djbXNpdl9odGFibGU2X2luaXQsIC4tYWVzZ2Ntc2l2X2h0YWJsZTZfaW5pdAorLmdsb2JsCWFlc2djbXNpdl9odGFibGVfcG9seXZhbAorLmhpZGRlbiBhZXNnY21zaXZfaHRhYmxlX3BvbHl2YWwKKy50eXBlCWFlc2djbXNpdl9odGFibGVfcG9seXZhbCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzZ2Ntc2l2X2h0YWJsZV9wb2x5dmFsOgorLmNmaV9zdGFydHByb2MJCisJdGVzdHEJJXJkeCwlcmR4CisJam56CS5MaHRhYmxlX3BvbHl2YWxfc3RhcnQKKwkuYnl0ZQkweGYzLDB4YzMKKworLkxodGFibGVfcG9seXZhbF9zdGFydDoKKwl2emVyb2FsbAorCisKKworCW1vdnEJJXJkeCwlcjExCisJYW5kcQkkMTI3LCVyMTEKKworCWp6CS5MaHRhYmxlX3BvbHl2YWxfbm9fcHJlZml4CisKKwl2cHhvcgkleG1tOSwleG1tOSwleG1tOQorCXZtb3ZkcWEJKCVyY3gpLCV4bW0xCisJc3VicQklcjExLCVyZHgKKworCXN1YnEJJDE2LCVyMTEKKworCisJdm1vdmRxdQkoJXJzaSksJXhtbTAKKwl2cHhvcgkleG1tMSwleG1tMCwleG1tMAorCisJdnBjbG11bHFkcQkkMHgwMSwoJXJkaSwlcjExLDEpLCV4bW0wLCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCwoJXJkaSwlcjExLDEpLCV4bW0wLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwoJXJkaSwlcjExLDEpLCV4bW0wLCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCwoJXJkaSwlcjExLDEpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCWxlYXEJMTYoJXJzaSksJXJzaQorCXRlc3RxCSVyMTEsJXIxMQorCWpuegkuTGh0YWJsZV9wb2x5dmFsX3ByZWZpeF9sb29wCisJam1wCS5MaHRhYmxlX3BvbHl2YWxfcHJlZml4X2NvbXBsZXRlCisKKworLmFsaWduCTY0CisuTGh0YWJsZV9wb2x5dmFsX3ByZWZpeF9sb29wOgorCXN1YnEJJDE2LCVyMTEKKworCXZtb3ZkcXUJKCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDAwLCglcmRpLCVyMTEsMSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsKCVyZGksJXIxMSwxKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgwMSwoJXJkaSwlcjExLDEpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDEwLCglcmRpLCVyMTEsMSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNSwleG1tNQorCisJdGVzdHEJJXIxMSwlcjExCisKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKworCWpuegkuTGh0YWJsZV9wb2x5dmFsX3ByZWZpeF9sb29wCisKKy5MaHRhYmxlX3BvbHl2YWxfcHJlZml4X2NvbXBsZXRlOgorCXZwc3JsZHEJJDgsJXhtbTUsJXhtbTYKKwl2cHNsbGRxCSQ4LCV4bW01LCV4bW01CisKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tOQorCXZweG9yCSV4bW01LCV4bW0zLCV4bW0xCisKKwlqbXAJLkxodGFibGVfcG9seXZhbF9tYWluX2xvb3AKKworLkxodGFibGVfcG9seXZhbF9ub19wcmVmaXg6CisKKworCisKKwl2cHhvcgkleG1tMSwleG1tMSwleG1tMQorCXZtb3ZkcWEJKCVyY3gpLCV4bW05CisKKy5hbGlnbgk2NAorLkxodGFibGVfcG9seXZhbF9tYWluX2xvb3A6CisJc3VicQkkMHg4MCwlcmR4CisJamIJLkxodGFibGVfcG9seXZhbF9vdXQKKworCXZtb3ZkcXUJMTEyKCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDAxLCglcmRpKSwleG1tMCwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsKCVyZGkpLCV4bW0wLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwoJXJkaSksJXhtbTAsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKworCXZtb3ZkcXUJOTYoJXJzaSksJXhtbTAKKwl2cGNsbXVscWRxCSQweDAxLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisKKwl2bW92ZHF1CTgwKCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDEwLHBvbHkoJXJpcCksJXhtbTEsJXhtbTcKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMSwleG1tMQorCisJdnBjbG11bHFkcQkkMHgwMSwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKworCXZweG9yCSV4bW03LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTY0KCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDAxLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisJdm1vdmRxdQk0OCglcnNpKSwleG1tMAorCisJdnBjbG11bHFkcQkkMHgxMCxwb2x5KCVyaXApLCV4bW0xLCV4bW03CisJdnBhbGlnbnIJJDgsJXhtbTEsJXhtbTEsJXhtbTEKKworCXZwY2xtdWxxZHEJJDB4MDEsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTAsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNSwleG1tNQorCisKKwl2cHhvcgkleG1tNywleG1tMSwleG1tMQorCisJdm1vdmRxdQkzMiglcnNpKSwleG1tMAorCisJdnBjbG11bHFkcQkkMHgwMSw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKworCXZweG9yCSV4bW05LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTE2KCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDAxLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisJdm1vdmRxdQkwKCVyc2kpLCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKworCXZwY2xtdWxxZHEJJDB4MDEsMTEyKCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDExMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwxMTIoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTAsMTEyKCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisJdnBzcmxkcQkkOCwleG1tNSwleG1tNgorCXZwc2xsZHEJJDgsJXhtbTUsJXhtbTUKKworCXZweG9yCSV4bW02LCV4bW00LCV4bW05CisJdnB4b3IJJXhtbTUsJXhtbTMsJXhtbTEKKworCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlqbXAJLkxodGFibGVfcG9seXZhbF9tYWluX2xvb3AKKworCisKKy5MaHRhYmxlX3BvbHl2YWxfb3V0OgorCXZwY2xtdWxxZHEJJDB4MTAscG9seSglcmlwKSwleG1tMSwleG1tNgorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTYsJXhtbTEsJXhtbTEKKworCXZwY2xtdWxxZHEJJDB4MTAscG9seSglcmlwKSwleG1tMSwleG1tNgorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTYsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tOSwleG1tMSwleG1tMQorCisJdm1vdmRxdQkleG1tMSwoJXJjeCkKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXNnY21zaXZfaHRhYmxlX3BvbHl2YWwsLi1hZXNnY21zaXZfaHRhYmxlX3BvbHl2YWwKKy5nbG9ibAlhZXNnY21zaXZfcG9seXZhbF9ob3JuZXIKKy5oaWRkZW4gYWVzZ2Ntc2l2X3BvbHl2YWxfaG9ybmVyCisudHlwZQlhZXNnY21zaXZfcG9seXZhbF9ob3JuZXIsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc2djbXNpdl9wb2x5dmFsX2hvcm5lcjoKKy5jZmlfc3RhcnRwcm9jCQorCXRlc3RxCSVyY3gsJXJjeAorCWpuegkuTHBvbHl2YWxfaG9ybmVyX3N0YXJ0CisJLmJ5dGUJMHhmMywweGMzCisKKy5McG9seXZhbF9ob3JuZXJfc3RhcnQ6CisKKworCisJeG9ycQklcjEwLCVyMTAKKwlzaGxxCSQ0LCVyY3gKKworCXZtb3ZkcWEJKCVyc2kpLCV4bW0xCisJdm1vdmRxYQkoJXJkaSksJXhtbTAKKworLkxwb2x5dmFsX2hvcm5lcl9sb29wOgorCXZweG9yCSglcmR4LCVyMTAsMSksJXhtbTAsJXhtbTAKKwljYWxsCUdGTVVMCisKKwlhZGRxCSQxNiwlcjEwCisJY21wcQklcjEwLCVyY3gKKwlqbmUJLkxwb2x5dmFsX2hvcm5lcl9sb29wCisKKworCXZtb3ZkcWEJJXhtbTAsKCVyZGkpCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXNnY21zaXZfcG9seXZhbF9ob3JuZXIsLi1hZXNnY21zaXZfcG9seXZhbF9ob3JuZXIKKy5nbG9ibAlhZXMxMjhnY21zaXZfYWVzX2tzCisuaGlkZGVuIGFlczEyOGdjbXNpdl9hZXNfa3MKKy50eXBlCWFlczEyOGdjbXNpdl9hZXNfa3MsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2FlczEyOGdjbXNpdl9hZXNfa3M6CisuY2ZpX3N0YXJ0cHJvYwkKKwl2bW92ZHF1CSglcmRpKSwleG1tMQorCXZtb3ZkcWEJJXhtbTEsKCVyc2kpCisKKwl2bW92ZHFhCWNvbjEoJXJpcCksJXhtbTAKKwl2bW92ZHFhCW1hc2soJXJpcCksJXhtbTE1CisKKwltb3ZxCSQ4LCVyYXgKKworLkxrczEyOF9sb29wOgorCWFkZHEJJDE2LCVyc2kKKwlzdWJxCSQxLCVyYXgKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxkcQkkNCwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tMywleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tMywleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2bW92ZHFhCSV4bW0xLCglcnNpKQorCWpuZQkuTGtzMTI4X2xvb3AKKworCXZtb3ZkcWEJY29uMiglcmlwKSwleG1tMAorCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbGRxCSQ0LCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZtb3ZkcWEJJXhtbTEsMTYoJXJzaSkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGRxCSQ0LCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZtb3ZkcWEJJXhtbTEsMzIoJXJzaSkKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlczEyOGdjbXNpdl9hZXNfa3MsLi1hZXMxMjhnY21zaXZfYWVzX2tzCisuZ2xvYmwJYWVzMjU2Z2Ntc2l2X2Flc19rcworLmhpZGRlbiBhZXMyNTZnY21zaXZfYWVzX2tzCisudHlwZQlhZXMyNTZnY21zaXZfYWVzX2tzLEBmdW5jdGlvbgorLmFsaWduCTE2CithZXMyNTZnY21zaXZfYWVzX2tzOgorLmNmaV9zdGFydHByb2MJCisJdm1vdmRxdQkoJXJkaSksJXhtbTEKKwl2bW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJdm1vdmRxYQkleG1tMSwoJXJzaSkKKwl2bW92ZHFhCSV4bW0zLDE2KCVyc2kpCisJdm1vdmRxYQljb24xKCVyaXApLCV4bW0wCisJdm1vdmRxYQltYXNrKCVyaXApLCV4bW0xNQorCXZweG9yCSV4bW0xNCwleG1tMTQsJXhtbTE0CisJbW92cQkkNiwlcmF4CisKKy5Ma3MyNTZfbG9vcDoKKwlhZGRxCSQzMiwlcnNpCisJc3VicQkkMSwlcmF4CisJdnBzaHVmYgkleG1tMTUsJXhtbTMsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2bW92ZHFhCSV4bW0xLCglcnNpKQorCXZwc2h1ZmQJJDB4ZmYsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMTQsJXhtbTIsJXhtbTIKKwl2cHNsbHEJJDMyLCV4bW0zLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTMsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZweG9yCSV4bW0yLCV4bW0zLCV4bW0zCisJdm1vdmRxYQkleG1tMywxNiglcnNpKQorCWpuZQkuTGtzMjU2X2xvb3AKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0zLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdm1vdmRxYQkleG1tMSwzMiglcnNpKQorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLmdsb2JsCWFlczEyOGdjbXNpdl9hZXNfa3NfZW5jX3gxCisuaGlkZGVuIGFlczEyOGdjbXNpdl9hZXNfa3NfZW5jX3gxCisudHlwZQlhZXMxMjhnY21zaXZfYWVzX2tzX2VuY194MSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzMTI4Z2Ntc2l2X2Flc19rc19lbmNfeDE6CisuY2ZpX3N0YXJ0cHJvYwkKKwl2bW92ZHFhCSglcmN4KSwleG1tMQorCXZtb3ZkcWEJMCglcmRpKSwleG1tNAorCisJdm1vdmRxYQkleG1tMSwoJXJkeCkKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCisJdm1vdmRxYQljb24xKCVyaXApLCV4bW0wCisJdm1vdmRxYQltYXNrKCVyaXApLCV4bW0xNQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKworCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0xLDE2KCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxxCSQzMiwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzaHVmYgljb24zKCVyaXApLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZtb3ZkcWEJJXhtbTEsMzIoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMSw0OCglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKworCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0xLDY0KCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxxCSQzMiwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzaHVmYgljb24zKCVyaXApLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZtb3ZkcWEJJXhtbTEsODAoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMSw5NiglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKworCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0xLDExMiglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKworCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0xLDEyOCglcmR4KQorCisKKwl2bW92ZHFhCWNvbjIoJXJpcCksJXhtbTAKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMSwxNDQoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jbGFzdAkleG1tMSwleG1tNCwleG1tNAorCXZtb3ZkcWEJJXhtbTEsMTYwKCVyZHgpCisKKworCXZtb3ZkcWEJJXhtbTQsMCglcnNpKQorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzMTI4Z2Ntc2l2X2Flc19rc19lbmNfeDEsLi1hZXMxMjhnY21zaXZfYWVzX2tzX2VuY194MQorLmdsb2JsCWFlczEyOGdjbXNpdl9rZGYKKy5oaWRkZW4gYWVzMTI4Z2Ntc2l2X2tkZgorLnR5cGUJYWVzMTI4Z2Ntc2l2X2tkZixAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzMTI4Z2Ntc2l2X2tkZjoKKy5jZmlfc3RhcnRwcm9jCQorCisKKworCisJdm1vdmRxYQkoJXJkeCksJXhtbTEKKwl2bW92ZHFhCTAoJXJkaSksJXhtbTkKKwl2bW92ZHFhCWFuZF9tYXNrKCVyaXApLCV4bW0xMgorCXZtb3ZkcWEJb25lKCVyaXApLCV4bW0xMworCXZwc2h1ZmQJJDB4OTAsJXhtbTksJXhtbTkKKwl2cGFuZAkleG1tMTIsJXhtbTksJXhtbTkKKwl2cGFkZGQJJXhtbTEzLCV4bW05LCV4bW0xMAorCXZwYWRkZAkleG1tMTMsJXhtbTEwLCV4bW0xMQorCXZwYWRkZAkleG1tMTMsJXhtbTExLCV4bW0xMgorCisJdnB4b3IJJXhtbTEsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMSwleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW0xLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJMTYoJXJkeCksJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMSwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHFhCTMyKCVyZHgpLCV4bW0yCisJdmFlc2VuYwkleG1tMiwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTIsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxYQk0OCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJNjQoJXJkeCksJXhtbTIKKwl2YWVzZW5jCSV4bW0yLCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMiwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHFhCTgwKCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTEsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxYQk5NiglcmR4KSwleG1tMgorCXZhZXNlbmMJJXhtbTIsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJMTEyKCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTEsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxYQkxMjgoJXJkeCksJXhtbTIKKwl2YWVzZW5jCSV4bW0yLCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMiwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHFhCTE0NCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJMTYwKCVyZHgpLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTksJXhtbTkKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tMTAsJXhtbTEwCisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW0xMiwleG1tMTIKKworCisJdm1vdmRxYQkleG1tOSwwKCVyc2kpCisJdm1vdmRxYQkleG1tMTAsMTYoJXJzaSkKKwl2bW92ZHFhCSV4bW0xMSwzMiglcnNpKQorCXZtb3ZkcWEJJXhtbTEyLDQ4KCVyc2kpCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXMxMjhnY21zaXZfa2RmLC4tYWVzMTI4Z2Ntc2l2X2tkZgorLmdsb2JsCWFlczEyOGdjbXNpdl9lbmNfbXNnX3g0CisuaGlkZGVuIGFlczEyOGdjbXNpdl9lbmNfbXNnX3g0CisudHlwZQlhZXMxMjhnY21zaXZfZW5jX21zZ194NCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwl0ZXN0cQklcjgsJXI4CisJam56CS5MMTI4X2VuY19tc2dfeDRfc3RhcnQKKwkuYnl0ZQkweGYzLDB4YzMKKworLkwxMjhfZW5jX21zZ194NF9zdGFydDoKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTE2CisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC0yNAorCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOCwlcjEwCisJc2hscQkkNjIsJXIxMAorCXNocnEJJDYyLCVyMTAKKworCisJdm1vdmRxYQkoJXJkeCksJXhtbTE1CisJdnBvcglPUl9NQVNLKCVyaXApLCV4bW0xNSwleG1tMTUKKworCXZtb3ZkcXUJZm91ciglcmlwKSwleG1tNAorCXZtb3ZkcWEJJXhtbTE1LCV4bW0wCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMTUsJXhtbTEKKwl2cGFkZGQJdHdvKCVyaXApLCV4bW0xNSwleG1tMgorCXZwYWRkZAl0aHJlZSglcmlwKSwleG1tMTUsJXhtbTMKKworCXNocnEJJDIsJXI4CisJamUJLkwxMjhfZW5jX21zZ194NF9jaGVja19yZW1haW5kZXIKKworCXN1YnEJJDY0LCVyc2kKKwlzdWJxCSQ2NCwlcmRpCisKKy5MMTI4X2VuY19tc2dfeDRfbG9vcDE6CisJYWRkcQkkNjQsJXJzaQorCWFkZHEJJDY0LCVyZGkKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTUKKwl2bW92ZHFhCSV4bW0xLCV4bW02CisJdm1vdmRxYQkleG1tMiwleG1tNworCXZtb3ZkcWEJJXhtbTMsJXhtbTgKKworCXZweG9yCSglcmN4KSwleG1tNSwleG1tNQorCXZweG9yCSglcmN4KSwleG1tNiwleG1tNgorCXZweG9yCSglcmN4KSwleG1tNywleG1tNworCXZweG9yCSglcmN4KSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdnBhZGRkCSV4bW00LCV4bW0wLCV4bW0wCisJdm1vdmRxdQkzMiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdnBhZGRkCSV4bW00LCV4bW0xLCV4bW0xCisJdm1vdmRxdQk0OCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdnBhZGRkCSV4bW00LCV4bW0yLCV4bW0yCisJdm1vdmRxdQk2NCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdnBhZGRkCSV4bW00LCV4bW0zLCV4bW0zCisKKwl2bW92ZHF1CTgwKCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTk2KCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTExMiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxMjgoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTQ0KCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE2MCglcmN4KSwleG1tMTIKKwl2YWVzZW5jbGFzdAkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jbGFzdAkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jbGFzdAkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jbGFzdAkleG1tMTIsJXhtbTgsJXhtbTgKKworCisKKwl2cHhvcgkwKCVyZGkpLCV4bW01LCV4bW01CisJdnB4b3IJMTYoJXJkaSksJXhtbTYsJXhtbTYKKwl2cHhvcgkzMiglcmRpKSwleG1tNywleG1tNworCXZweG9yCTQ4KCVyZGkpLCV4bW04LCV4bW04CisKKwlzdWJxCSQxLCVyOAorCisJdm1vdmRxdQkleG1tNSwwKCVyc2kpCisJdm1vdmRxdQkleG1tNiwxNiglcnNpKQorCXZtb3ZkcXUJJXhtbTcsMzIoJXJzaSkKKwl2bW92ZHF1CSV4bW04LDQ4KCVyc2kpCisKKwlqbmUJLkwxMjhfZW5jX21zZ194NF9sb29wMQorCisJYWRkcQkkNjQsJXJzaQorCWFkZHEJJDY0LCVyZGkKKworLkwxMjhfZW5jX21zZ194NF9jaGVja19yZW1haW5kZXI6CisJY21wcQkkMCwlcjEwCisJamUJLkwxMjhfZW5jX21zZ194NF9vdXQKKworLkwxMjhfZW5jX21zZ194NF9sb29wMjoKKworCisJdm1vdmRxYQkleG1tMCwleG1tNQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTAsJXhtbTAKKworCXZweG9yCSglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMTYoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTMyKCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwk0OCglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJNjQoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTgwKCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwk5NiglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMTEyKCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxMjgoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTE0NCglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmNsYXN0CTE2MCglcmN4KSwleG1tNSwleG1tNQorCisKKwl2cHhvcgkoJXJkaSksJXhtbTUsJXhtbTUKKwl2bW92ZHF1CSV4bW01LCglcnNpKQorCisJYWRkcQkkMTYsJXJkaQorCWFkZHEJJDE2LCVyc2kKKworCXN1YnEJJDEsJXIxMAorCWpuZQkuTDEyOF9lbmNfbXNnX3g0X2xvb3AyCisKKy5MMTI4X2VuY19tc2dfeDRfb3V0OgorCXBvcHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorLmNmaV9yZXN0b3JlCSVyMTMKKwlwb3BxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKy5jZmlfcmVzdG9yZQklcjEyCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXMxMjhnY21zaXZfZW5jX21zZ194NCwuLWFlczEyOGdjbXNpdl9lbmNfbXNnX3g0CisuZ2xvYmwJYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDgKKy5oaWRkZW4gYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDgKKy50eXBlCWFlczEyOGdjbXNpdl9lbmNfbXNnX3g4LEBmdW5jdGlvbgorLmFsaWduCTE2CithZXMxMjhnY21zaXZfZW5jX21zZ194ODoKKy5jZmlfc3RhcnRwcm9jCQorCXRlc3RxCSVyOCwlcjgKKwlqbnoJLkwxMjhfZW5jX21zZ194OF9zdGFydAorCS5ieXRlCTB4ZjMsMHhjMworCisuTDEyOF9lbmNfbXNnX3g4X3N0YXJ0OgorCXB1c2hxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMiwtMTYKKwlwdXNocQklcjEzCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTMsLTI0CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0zMgorCW1vdnEJJXJzcCwlcmJwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJcmJwCisKKworCXN1YnEJJDEyOCwlcnNwCisJYW5kcQkkLTY0LCVyc3AKKworCXNocnEJJDQsJXI4CisJbW92cQklcjgsJXIxMAorCXNobHEJJDYxLCVyMTAKKwlzaHJxCSQ2MSwlcjEwCisKKworCXZtb3ZkcXUJKCVyZHgpLCV4bW0xCisJdnBvcglPUl9NQVNLKCVyaXApLCV4bW0xLCV4bW0xCisKKworCXZwYWRkZAlzZXZlbiglcmlwKSwleG1tMSwleG1tMAorCXZtb3ZkcXUJJXhtbTAsKCVyc3ApCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMSwleG1tOQorCXZwYWRkZAl0d28oJXJpcCksJXhtbTEsJXhtbTEwCisJdnBhZGRkCXRocmVlKCVyaXApLCV4bW0xLCV4bW0xMQorCXZwYWRkZAlmb3VyKCVyaXApLCV4bW0xLCV4bW0xMgorCXZwYWRkZAlmaXZlKCVyaXApLCV4bW0xLCV4bW0xMworCXZwYWRkZAlzaXgoJXJpcCksJXhtbTEsJXhtbTE0CisJdm1vdmRxYQkleG1tMSwleG1tMAorCisJc2hycQkkMywlcjgKKwlqZQkuTDEyOF9lbmNfbXNnX3g4X2NoZWNrX3JlbWFpbmRlcgorCisJc3VicQkkMTI4LCVyc2kKKwlzdWJxCSQxMjgsJXJkaQorCisuTDEyOF9lbmNfbXNnX3g4X2xvb3AxOgorCWFkZHEJJDEyOCwlcnNpCisJYWRkcQkkMTI4LCVyZGkKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKwl2bW92ZHFhCSV4bW05LCV4bW0yCisJdm1vdmRxYQkleG1tMTAsJXhtbTMKKwl2bW92ZHFhCSV4bW0xMSwleG1tNAorCXZtb3ZkcWEJJXhtbTEyLCV4bW01CisJdm1vdmRxYQkleG1tMTMsJXhtbTYKKwl2bW92ZHFhCSV4bW0xNCwleG1tNworCisJdm1vdmRxdQkoJXJzcCksJXhtbTgKKworCXZweG9yCSglcmN4KSwleG1tMSwleG1tMQorCXZweG9yCSglcmN4KSwleG1tMiwleG1tMgorCXZweG9yCSglcmN4KSwleG1tMywleG1tMworCXZweG9yCSglcmN4KSwleG1tNCwleG1tNAorCXZweG9yCSglcmN4KSwleG1tNSwleG1tNQorCXZweG9yCSglcmN4KSwleG1tNiwleG1tNgorCXZweG9yCSglcmN4KSwleG1tNywleG1tNworCXZweG9yCSglcmN4KSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNiglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHF1CSglcnNwKSwleG1tMTQKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTE0LCV4bW0xNAorCXZtb3ZkcXUJJXhtbTE0LCglcnNwKQorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBzdWJkCW9uZSglcmlwKSwleG1tMTQsJXhtbTE0CisJdm1vdmRxdQk0OCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTAsJXhtbTAKKwl2bW92ZHF1CTY0KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tOSwleG1tOQorCXZtb3ZkcXUJODAoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW0xMCwleG1tMTAKKwl2bW92ZHF1CTk2KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tMTEsJXhtbTExCisJdm1vdmRxdQkxMTIoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW0xMiwleG1tMTIKKwl2bW92ZHF1CTEyOCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTEzLCV4bW0xMworCXZtb3ZkcXUJMTQ0KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTYwKCVyY3gpLCV4bW0xNQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tOCwleG1tOAorCisKKworCXZweG9yCTAoJXJkaSksJXhtbTEsJXhtbTEKKwl2cHhvcgkxNiglcmRpKSwleG1tMiwleG1tMgorCXZweG9yCTMyKCVyZGkpLCV4bW0zLCV4bW0zCisJdnB4b3IJNDgoJXJkaSksJXhtbTQsJXhtbTQKKwl2cHhvcgk2NCglcmRpKSwleG1tNSwleG1tNQorCXZweG9yCTgwKCVyZGkpLCV4bW02LCV4bW02CisJdnB4b3IJOTYoJXJkaSksJXhtbTcsJXhtbTcKKwl2cHhvcgkxMTIoJXJkaSksJXhtbTgsJXhtbTgKKworCWRlY3EJJXI4CisKKwl2bW92ZHF1CSV4bW0xLDAoJXJzaSkKKwl2bW92ZHF1CSV4bW0yLDE2KCVyc2kpCisJdm1vdmRxdQkleG1tMywzMiglcnNpKQorCXZtb3ZkcXUJJXhtbTQsNDgoJXJzaSkKKwl2bW92ZHF1CSV4bW01LDY0KCVyc2kpCisJdm1vdmRxdQkleG1tNiw4MCglcnNpKQorCXZtb3ZkcXUJJXhtbTcsOTYoJXJzaSkKKwl2bW92ZHF1CSV4bW04LDExMiglcnNpKQorCisJam5lCS5MMTI4X2VuY19tc2dfeDhfbG9vcDEKKworCWFkZHEJJDEyOCwlcnNpCisJYWRkcQkkMTI4LCVyZGkKKworLkwxMjhfZW5jX21zZ194OF9jaGVja19yZW1haW5kZXI6CisJY21wcQkkMCwlcjEwCisJamUJLkwxMjhfZW5jX21zZ194OF9vdXQKKworLkwxMjhfZW5jX21zZ194OF9sb29wMjoKKworCisJdm1vdmRxYQkleG1tMCwleG1tMQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTAsJXhtbTAKKworCXZweG9yCSglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTYoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTMyKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk0OCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJNjQoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTgwKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk5NiglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTEyKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxMjgoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE0NCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmNsYXN0CTE2MCglcmN4KSwleG1tMSwleG1tMQorCisKKwl2cHhvcgkoJXJkaSksJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJJXhtbTEsKCVyc2kpCisKKwlhZGRxCSQxNiwlcmRpCisJYWRkcQkkMTYsJXJzaQorCisJZGVjcQklcjEwCisJam5lCS5MMTI4X2VuY19tc2dfeDhfbG9vcDIKKworLkwxMjhfZW5jX21zZ194OF9vdXQ6CisJbW92cQklcmJwLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisJcG9wcQklcmJwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CS04CisuY2ZpX3Jlc3RvcmUJJXJicAorCXBvcHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorLmNmaV9yZXN0b3JlCSVyMTMKKwlwb3BxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKy5jZmlfcmVzdG9yZQklcjEyCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXMxMjhnY21zaXZfZW5jX21zZ194OCwuLWFlczEyOGdjbXNpdl9lbmNfbXNnX3g4CisuZ2xvYmwJYWVzMTI4Z2Ntc2l2X2RlYworLmhpZGRlbiBhZXMxMjhnY21zaXZfZGVjCisudHlwZQlhZXMxMjhnY21zaXZfZGVjLEBmdW5jdGlvbgorLmFsaWduCTE2CithZXMxMjhnY21zaXZfZGVjOgorLmNmaV9zdGFydHByb2MJCisJdGVzdHEJJH4xNSwlcjkKKwlqbnoJLkwxMjhfZGVjX3N0YXJ0CisJLmJ5dGUJMHhmMywweGMzCisKKy5MMTI4X2RlY19zdGFydDoKKwl2emVyb3VwcGVyCisJdm1vdmRxYQkoJXJkeCksJXhtbTAKKwltb3ZxCSVyZHgsJXJheAorCisJbGVhcQkzMiglcmF4KSwlcmF4CisJbGVhcQkzMiglcmN4KSwlcmN4CisKKworCXZtb3ZkcXUJKCVyZGksJXI5LDEpLCV4bW0xNQorCXZwb3IJT1JfTUFTSyglcmlwKSwleG1tMTUsJXhtbTE1CisJYW5kcQkkfjE1LCVyOQorCisKKwljbXBxCSQ5NiwlcjkKKwlqYgkuTDEyOF9kZWNfbG9vcDIKKworCisJc3VicQkkOTYsJXI5CisJdm1vdmRxYQkleG1tMTUsJXhtbTcKKwl2cGFkZGQJb25lKCVyaXApLCV4bW03LCV4bW04CisJdnBhZGRkCXR3byglcmlwKSwleG1tNywleG1tOQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTksJXhtbTEwCisJdnBhZGRkCXR3byglcmlwKSwleG1tOSwleG1tMTEKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0xMSwleG1tMTIKKwl2cGFkZGQJdHdvKCVyaXApLCV4bW0xMSwleG1tMTUKKworCXZweG9yCSglcjgpLCV4bW03LCV4bW03CisJdnB4b3IJKCVyOCksJXhtbTgsJXhtbTgKKwl2cHhvcgkoJXI4KSwleG1tOSwleG1tOQorCXZweG9yCSglcjgpLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkoJXI4KSwleG1tMTEsJXhtbTExCisJdnB4b3IJKCVyOCksJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTMyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJNDgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQk2NCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTgwKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJOTYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxMTIoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxMjgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNDQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNjAoJXI4KSwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisKKwl2cHhvcgkwKCVyZGkpLCV4bW03LCV4bW03CisJdnB4b3IJMTYoJXJkaSksJXhtbTgsJXhtbTgKKwl2cHhvcgkzMiglcmRpKSwleG1tOSwleG1tOQorCXZweG9yCTQ4KCVyZGkpLCV4bW0xMCwleG1tMTAKKwl2cHhvcgk2NCglcmRpKSwleG1tMTEsJXhtbTExCisJdnB4b3IJODAoJXJkaSksJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkleG1tNywwKCVyc2kpCisJdm1vdmRxdQkleG1tOCwxNiglcnNpKQorCXZtb3ZkcXUJJXhtbTksMzIoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMCw0OCglcnNpKQorCXZtb3ZkcXUJJXhtbTExLDY0KCVyc2kpCisJdm1vdmRxdQkleG1tMTIsODAoJXJzaSkKKworCWFkZHEJJDk2LCVyZGkKKwlhZGRxCSQ5NiwlcnNpCisJam1wCS5MMTI4X2RlY19sb29wMQorCisKKy5hbGlnbgk2NAorLkwxMjhfZGVjX2xvb3AxOgorCWNtcHEJJDk2LCVyOQorCWpiCS5MMTI4X2RlY19maW5pc2hfOTYKKwlzdWJxCSQ5NiwlcjkKKworCXZtb3ZkcWEJJXhtbTEyLCV4bW02CisJdm1vdmRxYQkleG1tMTEsMTYtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW0xMCwzMi0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTksNDgtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW04LDY0LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tNyw4MC0zMiglcmF4KQorCisJdm1vdmRxYQkleG1tMTUsJXhtbTcKKwl2cGFkZGQJb25lKCVyaXApLCV4bW03LCV4bW04CisJdnBhZGRkCXR3byglcmlwKSwleG1tNywleG1tOQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTksJXhtbTEwCisJdnBhZGRkCXR3byglcmlwKSwleG1tOSwleG1tMTEKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0xMSwleG1tMTIKKwl2cGFkZGQJdHdvKCVyaXApLCV4bW0xMSwleG1tMTUKKworCXZtb3ZkcWEJKCVyOCksJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tNywleG1tNworCXZweG9yCSV4bW00LCV4bW04LCV4bW04CisJdnB4b3IJJXhtbTQsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tNCwleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMC0zMiglcmN4KSwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTQsJXhtbTYsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW00LCV4bW02LCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tNCwleG1tNiwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTQsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkxNiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CS0xNiglcmF4KSwleG1tNgorCXZtb3ZkcXUJLTE2KCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisKKwl2bW92ZHF1CTMyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMCglcmF4KSwleG1tNgorCXZtb3ZkcXUJMCglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCisJdm1vdmRxdQk0OCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTE2KCVyYXgpLCV4bW02CisJdm1vdmRxdQkxNiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCisJdm1vdmRxdQk2NCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTMyKCVyYXgpLCV4bW02CisJdm1vdmRxdQkzMiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCisJdm1vdmRxdQk4MCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTk2KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTEyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCisJdm1vdmRxYQk4MC0zMiglcmF4KSwleG1tNgorCXZweG9yCSV4bW0wLCV4bW02LCV4bW02CisJdm1vdmRxdQk4MC0zMiglcmN4KSwleG1tNQorCisJdnBjbG11bHFkcQkkMHgwMSwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMCwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTEyOCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKworCXZwc3JsZHEJJDgsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tNQorCXZwc2xsZHEJJDgsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMAorCisJdm1vdmRxYQlwb2x5KCVyaXApLCV4bW0zCisKKwl2bW92ZHF1CTE0NCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTE2MCglcjgpLCV4bW02CisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTAsJXhtbTIKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTAsJXhtbTIsJXhtbTAKKworCXZweG9yCTAoJXJkaSksJXhtbTYsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tNywleG1tNworCXZweG9yCTE2KCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTgsJXhtbTgKKwl2cHhvcgkzMiglcmRpKSwleG1tNiwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW05LCV4bW05CisJdnB4b3IJNDgoJXJkaSksJXhtbTYsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tMTAsJXhtbTEwCisJdnB4b3IJNjQoJXJkaSksJXhtbTYsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tMTEsJXhtbTExCisJdnB4b3IJODAoJXJkaSksJXhtbTYsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMCwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tMCwleG1tMiwleG1tMAorCisJdm1vdmRxdQkleG1tNywwKCVyc2kpCisJdm1vdmRxdQkleG1tOCwxNiglcnNpKQorCXZtb3ZkcXUJJXhtbTksMzIoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMCw0OCglcnNpKQorCXZtb3ZkcXUJJXhtbTExLDY0KCVyc2kpCisJdm1vdmRxdQkleG1tMTIsODAoJXJzaSkKKworCXZweG9yCSV4bW01LCV4bW0wLCV4bW0wCisKKwlsZWFxCTk2KCVyZGkpLCVyZGkKKwlsZWFxCTk2KCVyc2kpLCVyc2kKKwlqbXAJLkwxMjhfZGVjX2xvb3AxCisKKy5MMTI4X2RlY19maW5pc2hfOTY6CisJdm1vdmRxYQkleG1tMTIsJXhtbTYKKwl2bW92ZHFhCSV4bW0xMSwxNi0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTEwLDMyLTMyKCVyYXgpCisJdm1vdmRxYQkleG1tOSw0OC0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTgsNjQtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW03LDgwLTMyKCVyYXgpCisKKwl2bW92ZHF1CTAtMzIoJXJjeCksJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLCV4bW00LCV4bW02LCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tNCwleG1tNiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTQsJXhtbTYsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW00LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJLTE2KCVyYXgpLCV4bW02CisJdm1vdmRxdQktMTYoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTAoJXJheCksJXhtbTYKKwl2bW92ZHF1CTAoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTE2KCVyYXgpLCV4bW02CisJdm1vdmRxdQkxNiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJMzIoJXJheCksJXhtbTYKKwl2bW92ZHF1CTMyKCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisKKwl2bW92ZHF1CTgwLTMyKCVyYXgpLCV4bW02CisJdnB4b3IJJXhtbTAsJXhtbTYsJXhtbTYKKwl2bW92ZHF1CTgwLTMyKCVyY3gpLCV4bW01CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMCwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgwMSwleG1tNSwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2cHNybGRxCSQ4LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTUKKwl2cHNsbGRxCSQ4LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTAKKworCXZtb3ZkcWEJcG9seSglcmlwKSwleG1tMworCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTAsJXhtbTIKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTAsJXhtbTIsJXhtbTAKKworCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0wLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tMCwleG1tMAorCXZweG9yCSV4bW0wLCV4bW0yLCV4bW0wCisKKwl2cHhvcgkleG1tNSwleG1tMCwleG1tMAorCisuTDEyOF9kZWNfbG9vcDI6CisKKworCisJY21wcQkkMTYsJXI5CisJamIJLkwxMjhfZGVjX291dAorCXN1YnEJJDE2LCVyOQorCisJdm1vdmRxYQkleG1tMTUsJXhtbTIKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0xNSwleG1tMTUKKworCXZweG9yCTAoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMTYoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMzIoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJNDgoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJNjQoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJODAoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJOTYoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMTEyKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTEyOCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkxNDQoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmNsYXN0CTE2MCglcjgpLCV4bW0yLCV4bW0yCisJdnB4b3IJKCVyZGkpLCV4bW0yLCV4bW0yCisJdm1vdmRxdQkleG1tMiwoJXJzaSkKKwlhZGRxCSQxNiwlcmRpCisJYWRkcQkkMTYsJXJzaQorCisJdnB4b3IJJXhtbTIsJXhtbTAsJXhtbTAKKwl2bW92ZHFhCS0zMiglcmN4KSwleG1tMQorCWNhbGwJR0ZNVUwKKworCWptcAkuTDEyOF9kZWNfbG9vcDIKKworLkwxMjhfZGVjX291dDoKKwl2bW92ZHF1CSV4bW0wLCglcmR4KQorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzMTI4Z2Ntc2l2X2RlYywgLi1hZXMxMjhnY21zaXZfZGVjCisuZ2xvYmwJYWVzMTI4Z2Ntc2l2X2VjYl9lbmNfYmxvY2sKKy5oaWRkZW4gYWVzMTI4Z2Ntc2l2X2VjYl9lbmNfYmxvY2sKKy50eXBlCWFlczEyOGdjbXNpdl9lY2JfZW5jX2Jsb2NrLEBmdW5jdGlvbgorLmFsaWduCTE2CithZXMxMjhnY21zaXZfZWNiX2VuY19ibG9jazoKKy5jZmlfc3RhcnRwcm9jCQorCXZtb3ZkcWEJKCVyZGkpLCV4bW0xCisKKwl2cHhvcgkoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE2KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkzMiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJNDgoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTY0KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk4MCglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJOTYoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTExMiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTI4KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNDQoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jbGFzdAkxNjAoJXJkeCksJXhtbTEsJXhtbTEKKworCXZtb3ZkcWEJJXhtbTEsKCVyc2kpCisKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlczEyOGdjbXNpdl9lY2JfZW5jX2Jsb2NrLC4tYWVzMTI4Z2Ntc2l2X2VjYl9lbmNfYmxvY2sKKy5nbG9ibAlhZXMyNTZnY21zaXZfYWVzX2tzX2VuY194MQorLmhpZGRlbiBhZXMyNTZnY21zaXZfYWVzX2tzX2VuY194MQorLnR5cGUJYWVzMjU2Z2Ntc2l2X2Flc19rc19lbmNfeDEsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2FlczI1NmdjbXNpdl9hZXNfa3NfZW5jX3gxOgorLmNmaV9zdGFydHByb2MJCisJdm1vdmRxYQljb24xKCVyaXApLCV4bW0wCisJdm1vdmRxYQltYXNrKCVyaXApLCV4bW0xNQorCXZtb3ZkcWEJKCVyZGkpLCV4bW04CisJdm1vdmRxYQkoJXJjeCksJXhtbTEKKwl2bW92ZHFhCTE2KCVyY3gpLCV4bW0zCisJdnB4b3IJJXhtbTEsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW0zLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMSwoJXJkeCkKKwl2bW92ZHF1CSV4bW0zLDE2KCVyZHgpCisJdnB4b3IJJXhtbTE0LCV4bW0xNCwleG1tMTQKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0zLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbGRxCSQ0LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0xLDMyKCVyZHgpCisKKwl2cHNodWZkCSQweGZmLCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTE0LCV4bW0yLCV4bW0yCisJdnBzbGxkcQkkNCwleG1tMywleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTIsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0zLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMyw0OCglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTMsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xsZHEJJDQsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTEsNjQoJXJkeCkKKworCXZwc2h1ZmQJJDB4ZmYsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMTQsJXhtbTIsJXhtbTIKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tMiwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTMsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0zLDgwKCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMywleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxkcQkkNCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMSw5NiglcmR4KQorCisJdnBzaHVmZAkkMHhmZiwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNCwleG1tMiwleG1tMgorCXZwc2xsZHEJJDQsJXhtbTMsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZweG9yCSV4bW0yLCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMywleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTMsMTEyKCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMywleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxkcQkkNCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMSwxMjgoJXJkeCkKKworCXZwc2h1ZmQJJDB4ZmYsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMTQsJXhtbTIsJXhtbTIKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tMiwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTMsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0zLDE0NCglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTMsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xsZHEJJDQsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTEsMTYwKCVyZHgpCisKKwl2cHNodWZkCSQweGZmLCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTE0LCV4bW0yLCV4bW0yCisJdnBzbGxkcQkkNCwleG1tMywleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTIsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0zLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMywxNzYoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0zLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbGRxCSQ0LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0xLDE5MiglcmR4KQorCisJdnBzaHVmZAkkMHhmZiwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNCwleG1tMiwleG1tMgorCXZwc2xsZHEJJDQsJXhtbTMsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZweG9yCSV4bW0yLCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMywleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTMsMjA4KCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMywleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkcQkkNCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2YWVzZW5jbGFzdAkleG1tMSwleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTEsMjI0KCVyZHgpCisKKwl2bW92ZHFhCSV4bW04LCglcnNpKQorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzMjU2Z2Ntc2l2X2Flc19rc19lbmNfeDEsLi1hZXMyNTZnY21zaXZfYWVzX2tzX2VuY194MQorLmdsb2JsCWFlczI1NmdjbXNpdl9lY2JfZW5jX2Jsb2NrCisuaGlkZGVuIGFlczI1NmdjbXNpdl9lY2JfZW5jX2Jsb2NrCisudHlwZQlhZXMyNTZnY21zaXZfZWNiX2VuY19ibG9jayxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzMjU2Z2Ntc2l2X2VjYl9lbmNfYmxvY2s6CisuY2ZpX3N0YXJ0cHJvYwkKKwl2bW92ZHFhCSglcmRpKSwleG1tMQorCXZweG9yCSglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTYoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTMyKCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk0OCglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJNjQoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTgwKCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk5NiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTEyKCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxMjgoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE0NCglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTYwKCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNzYoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE5MiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMjA4KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuY2xhc3QJMjI0KCVyZHgpLCV4bW0xLCV4bW0xCisJdm1vdmRxYQkleG1tMSwoJXJzaSkKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlczI1NmdjbXNpdl9lY2JfZW5jX2Jsb2NrLC4tYWVzMjU2Z2Ntc2l2X2VjYl9lbmNfYmxvY2sKKy5nbG9ibAlhZXMyNTZnY21zaXZfZW5jX21zZ194NAorLmhpZGRlbiBhZXMyNTZnY21zaXZfZW5jX21zZ194NAorLnR5cGUJYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2FlczI1NmdjbXNpdl9lbmNfbXNnX3g0OgorLmNmaV9zdGFydHByb2MJCisJdGVzdHEJJXI4LCVyOAorCWpuegkuTDI1Nl9lbmNfbXNnX3g0X3N0YXJ0CisJLmJ5dGUJMHhmMywweGMzCisKKy5MMjU2X2VuY19tc2dfeDRfc3RhcnQ6CisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJc2hscQkkNjAsJXIxMAorCWp6CS5MMjU2X2VuY19tc2dfeDRfc3RhcnQyCisJYWRkcQkkMSwlcjgKKworLkwyNTZfZW5jX21zZ194NF9zdGFydDI6CisJbW92cQklcjgsJXIxMAorCXNobHEJJDYyLCVyMTAKKwlzaHJxCSQ2MiwlcjEwCisKKworCXZtb3ZkcWEJKCVyZHgpLCV4bW0xNQorCXZwb3IJT1JfTUFTSyglcmlwKSwleG1tMTUsJXhtbTE1CisKKwl2bW92ZHFhCWZvdXIoJXJpcCksJXhtbTQKKwl2bW92ZHFhCSV4bW0xNSwleG1tMAorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTE1LCV4bW0xCisJdnBhZGRkCXR3byglcmlwKSwleG1tMTUsJXhtbTIKKwl2cGFkZGQJdGhyZWUoJXJpcCksJXhtbTE1LCV4bW0zCisKKwlzaHJxCSQyLCVyOAorCWplCS5MMjU2X2VuY19tc2dfeDRfY2hlY2tfcmVtYWluZGVyCisKKwlzdWJxCSQ2NCwlcnNpCisJc3VicQkkNjQsJXJkaQorCisuTDI1Nl9lbmNfbXNnX3g0X2xvb3AxOgorCWFkZHEJJDY0LCVyc2kKKwlhZGRxCSQ2NCwlcmRpCisKKwl2bW92ZHFhCSV4bW0wLCV4bW01CisJdm1vdmRxYQkleG1tMSwleG1tNgorCXZtb3ZkcWEJJXhtbTIsJXhtbTcKKwl2bW92ZHFhCSV4bW0zLCV4bW04CisKKwl2cHhvcgkoJXJjeCksJXhtbTUsJXhtbTUKKwl2cHhvcgkoJXJjeCksJXhtbTYsJXhtbTYKKwl2cHhvcgkoJXJjeCksJXhtbTcsJXhtbTcKKwl2cHhvcgkoJXJjeCksJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTYoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMCwleG1tMAorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMSwleG1tMQorCXZtb3ZkcXUJNDgoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMiwleG1tMgorCXZtb3ZkcXUJNjQoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMywleG1tMworCisJdm1vdmRxdQk4MCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQk5NiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxMTIoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTI4KCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE0NCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNjAoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTc2KCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE5MiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkyMDgoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMjI0KCVyY3gpLCV4bW0xMgorCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tOCwleG1tOAorCisKKworCXZweG9yCTAoJXJkaSksJXhtbTUsJXhtbTUKKwl2cHhvcgkxNiglcmRpKSwleG1tNiwleG1tNgorCXZweG9yCTMyKCVyZGkpLCV4bW03LCV4bW03CisJdnB4b3IJNDgoJXJkaSksJXhtbTgsJXhtbTgKKworCXN1YnEJJDEsJXI4CisKKwl2bW92ZHF1CSV4bW01LDAoJXJzaSkKKwl2bW92ZHF1CSV4bW02LDE2KCVyc2kpCisJdm1vdmRxdQkleG1tNywzMiglcnNpKQorCXZtb3ZkcXUJJXhtbTgsNDgoJXJzaSkKKworCWpuZQkuTDI1Nl9lbmNfbXNnX3g0X2xvb3AxCisKKwlhZGRxCSQ2NCwlcnNpCisJYWRkcQkkNjQsJXJkaQorCisuTDI1Nl9lbmNfbXNnX3g0X2NoZWNrX3JlbWFpbmRlcjoKKwljbXBxCSQwLCVyMTAKKwlqZQkuTDI1Nl9lbmNfbXNnX3g0X291dAorCisuTDI1Nl9lbmNfbXNnX3g0X2xvb3AyOgorCisKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTUKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0wLCV4bW0wCisJdnB4b3IJKCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxNiglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMzIoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTQ4KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwk2NCglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJODAoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTk2KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxMTIoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTEyOCglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMTQ0KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxNjAoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTE3NiglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMTkyKCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkyMDgoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jbGFzdAkyMjQoJXJjeCksJXhtbTUsJXhtbTUKKworCisJdnB4b3IJKCVyZGkpLCV4bW01LCV4bW01CisKKwl2bW92ZHF1CSV4bW01LCglcnNpKQorCisJYWRkcQkkMTYsJXJkaQorCWFkZHEJJDE2LCVyc2kKKworCXN1YnEJJDEsJXIxMAorCWpuZQkuTDI1Nl9lbmNfbXNnX3g0X2xvb3AyCisKKy5MMjU2X2VuY19tc2dfeDRfb3V0OgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDQsLi1hZXMyNTZnY21zaXZfZW5jX21zZ194NAorLmdsb2JsCWFlczI1NmdjbXNpdl9lbmNfbXNnX3g4CisuaGlkZGVuIGFlczI1NmdjbXNpdl9lbmNfbXNnX3g4CisudHlwZQlhZXMyNTZnY21zaXZfZW5jX21zZ194OCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDg6CisuY2ZpX3N0YXJ0cHJvYwkKKwl0ZXN0cQklcjgsJXI4CisJam56CS5MMjU2X2VuY19tc2dfeDhfc3RhcnQKKwkuYnl0ZQkweGYzLDB4YzMKKworLkwyNTZfZW5jX21zZ194OF9zdGFydDoKKworCW1vdnEJJXJzcCwlcjExCisJc3VicQkkMTYsJXIxMQorCWFuZHEJJC02NCwlcjExCisKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwlzaGxxCSQ2MCwlcjEwCisJanoJLkwyNTZfZW5jX21zZ194OF9zdGFydDIKKwlhZGRxCSQxLCVyOAorCisuTDI1Nl9lbmNfbXNnX3g4X3N0YXJ0MjoKKwltb3ZxCSVyOCwlcjEwCisJc2hscQkkNjEsJXIxMAorCXNocnEJJDYxLCVyMTAKKworCisJdm1vdmRxYQkoJXJkeCksJXhtbTEKKwl2cG9yCU9SX01BU0soJXJpcCksJXhtbTEsJXhtbTEKKworCisJdnBhZGRkCXNldmVuKCVyaXApLCV4bW0xLCV4bW0wCisJdm1vdmRxYQkleG1tMCwoJXIxMSkKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0xLCV4bW05CisJdnBhZGRkCXR3byglcmlwKSwleG1tMSwleG1tMTAKKwl2cGFkZGQJdGhyZWUoJXJpcCksJXhtbTEsJXhtbTExCisJdnBhZGRkCWZvdXIoJXJpcCksJXhtbTEsJXhtbTEyCisJdnBhZGRkCWZpdmUoJXJpcCksJXhtbTEsJXhtbTEzCisJdnBhZGRkCXNpeCglcmlwKSwleG1tMSwleG1tMTQKKwl2bW92ZHFhCSV4bW0xLCV4bW0wCisKKwlzaHJxCSQzLCVyOAorCWp6CS5MMjU2X2VuY19tc2dfeDhfY2hlY2tfcmVtYWluZGVyCisKKwlzdWJxCSQxMjgsJXJzaQorCXN1YnEJJDEyOCwlcmRpCisKKy5MMjU2X2VuY19tc2dfeDhfbG9vcDE6CisJYWRkcQkkMTI4LCVyc2kKKwlhZGRxCSQxMjgsJXJkaQorCisJdm1vdmRxYQkleG1tMCwleG1tMQorCXZtb3ZkcWEJJXhtbTksJXhtbTIKKwl2bW92ZHFhCSV4bW0xMCwleG1tMworCXZtb3ZkcWEJJXhtbTExLCV4bW00CisJdm1vdmRxYQkleG1tMTIsJXhtbTUKKwl2bW92ZHFhCSV4bW0xMywleG1tNgorCXZtb3ZkcWEJJXhtbTE0LCV4bW03CisKKwl2bW92ZHFhCSglcjExKSwleG1tOAorCisJdnB4b3IJKCVyY3gpLCV4bW0xLCV4bW0xCisJdnB4b3IJKCVyY3gpLCV4bW0yLCV4bW0yCisJdnB4b3IJKCVyY3gpLCV4bW0zLCV4bW0zCisJdnB4b3IJKCVyY3gpLCV4bW00LCV4bW00CisJdnB4b3IJKCVyY3gpLCV4bW01LCV4bW01CisJdnB4b3IJKCVyY3gpLCV4bW02LCV4bW02CisJdnB4b3IJKCVyY3gpLCV4bW03LCV4bW03CisJdnB4b3IJKCVyY3gpLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE2KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcWEJKCVyMTEpLCV4bW0xNAorCXZwYWRkZAllaWdodCglcmlwKSwleG1tMTQsJXhtbTE0CisJdm1vdmRxYQkleG1tMTQsKCVyMTEpCisJdm1vdmRxdQkzMiglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cHN1YmQJb25lKCVyaXApLCV4bW0xNCwleG1tMTQKKwl2bW92ZHF1CTQ4KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tMCwleG1tMAorCXZtb3ZkcXUJNjQoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW05LCV4bW05CisJdm1vdmRxdQk4MCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTEwLCV4bW0xMAorCXZtb3ZkcXUJOTYoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW0xMSwleG1tMTEKKwl2bW92ZHF1CTExMiglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTEyLCV4bW0xMgorCXZtb3ZkcXUJMTI4KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tMTMsJXhtbTEzCisJdm1vdmRxdQkxNDQoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNjAoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNzYoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxOTIoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkyMDgoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkyMjQoJXJjeCksJXhtbTE1CisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuY2xhc3QJJXhtbTE1LCV4bW04LCV4bW04CisKKworCisJdnB4b3IJMCglcmRpKSwleG1tMSwleG1tMQorCXZweG9yCTE2KCVyZGkpLCV4bW0yLCV4bW0yCisJdnB4b3IJMzIoJXJkaSksJXhtbTMsJXhtbTMKKwl2cHhvcgk0OCglcmRpKSwleG1tNCwleG1tNAorCXZweG9yCTY0KCVyZGkpLCV4bW01LCV4bW01CisJdnB4b3IJODAoJXJkaSksJXhtbTYsJXhtbTYKKwl2cHhvcgk5NiglcmRpKSwleG1tNywleG1tNworCXZweG9yCTExMiglcmRpKSwleG1tOCwleG1tOAorCisJc3VicQkkMSwlcjgKKworCXZtb3ZkcXUJJXhtbTEsMCglcnNpKQorCXZtb3ZkcXUJJXhtbTIsMTYoJXJzaSkKKwl2bW92ZHF1CSV4bW0zLDMyKCVyc2kpCisJdm1vdmRxdQkleG1tNCw0OCglcnNpKQorCXZtb3ZkcXUJJXhtbTUsNjQoJXJzaSkKKwl2bW92ZHF1CSV4bW02LDgwKCVyc2kpCisJdm1vdmRxdQkleG1tNyw5NiglcnNpKQorCXZtb3ZkcXUJJXhtbTgsMTEyKCVyc2kpCisKKwlqbmUJLkwyNTZfZW5jX21zZ194OF9sb29wMQorCisJYWRkcQkkMTI4LCVyc2kKKwlhZGRxCSQxMjgsJXJkaQorCisuTDI1Nl9lbmNfbXNnX3g4X2NoZWNrX3JlbWFpbmRlcjoKKwljbXBxCSQwLCVyMTAKKwlqZQkuTDI1Nl9lbmNfbXNnX3g4X291dAorCisuTDI1Nl9lbmNfbXNnX3g4X2xvb3AyOgorCisKKwl2bW92ZHFhCSV4bW0wLCV4bW0xCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMCwleG1tMAorCisJdnB4b3IJKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNiglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMzIoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTQ4KCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk2NCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJODAoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTk2KCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxMTIoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTEyOCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTQ0KCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNjAoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE3NiglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTkyKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkyMDgoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jbGFzdAkyMjQoJXJjeCksJXhtbTEsJXhtbTEKKworCisJdnB4b3IJKCVyZGkpLCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CSV4bW0xLCglcnNpKQorCisJYWRkcQkkMTYsJXJkaQorCWFkZHEJJDE2LCVyc2kKKwlzdWJxCSQxLCVyMTAKKwlqbnoJLkwyNTZfZW5jX21zZ194OF9sb29wMgorCisuTDI1Nl9lbmNfbXNnX3g4X291dDoKKwkuYnl0ZQkweGYzLDB4YzMKKworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDgsLi1hZXMyNTZnY21zaXZfZW5jX21zZ194OAorLmdsb2JsCWFlczI1NmdjbXNpdl9kZWMKKy5oaWRkZW4gYWVzMjU2Z2Ntc2l2X2RlYworLnR5cGUJYWVzMjU2Z2Ntc2l2X2RlYyxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzMjU2Z2Ntc2l2X2RlYzoKKy5jZmlfc3RhcnRwcm9jCQorCXRlc3RxCSR+MTUsJXI5CisJam56CS5MMjU2X2RlY19zdGFydAorCS5ieXRlCTB4ZjMsMHhjMworCisuTDI1Nl9kZWNfc3RhcnQ6CisJdnplcm91cHBlcgorCXZtb3ZkcWEJKCVyZHgpLCV4bW0wCisJbW92cQklcmR4LCVyYXgKKworCWxlYXEJMzIoJXJheCksJXJheAorCWxlYXEJMzIoJXJjeCksJXJjeAorCisKKwl2bW92ZHF1CSglcmRpLCVyOSwxKSwleG1tMTUKKwl2cG9yCU9SX01BU0soJXJpcCksJXhtbTE1LCV4bW0xNQorCWFuZHEJJH4xNSwlcjkKKworCisJY21wcQkkOTYsJXI5CisJamIJLkwyNTZfZGVjX2xvb3AyCisKKworCXN1YnEJJDk2LCVyOQorCXZtb3ZkcWEJJXhtbTE1LCV4bW03CisJdnBhZGRkCW9uZSglcmlwKSwleG1tNywleG1tOAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTcsJXhtbTkKKwl2cGFkZGQJb25lKCVyaXApLCV4bW05LCV4bW0xMAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTksJXhtbTExCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMTEsJXhtbTEyCisJdnBhZGRkCXR3byglcmlwKSwleG1tMTEsJXhtbTE1CisKKwl2cHhvcgkoJXI4KSwleG1tNywleG1tNworCXZweG9yCSglcjgpLCV4bW04LCV4bW04CisJdnB4b3IJKCVyOCksJXhtbTksJXhtbTkKKwl2cHhvcgkoJXI4KSwleG1tMTAsJXhtbTEwCisJdnB4b3IJKCVyOCksJXhtbTExLCV4bW0xMQorCXZweG9yCSglcjgpLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkzMiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTQ4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJNjQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQk4MCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTk2KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTEyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTI4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTQ0KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTYwKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTc2KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTkyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMjA4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMjI0KCVyOCksJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmNsYXN0CSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW0xMiwleG1tMTIKKworCisJdnB4b3IJMCglcmRpKSwleG1tNywleG1tNworCXZweG9yCTE2KCVyZGkpLCV4bW04LCV4bW04CisJdnB4b3IJMzIoJXJkaSksJXhtbTksJXhtbTkKKwl2cHhvcgk0OCglcmRpKSwleG1tMTAsJXhtbTEwCisJdnB4b3IJNjQoJXJkaSksJXhtbTExLCV4bW0xMQorCXZweG9yCTgwKCVyZGkpLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJJXhtbTcsMCglcnNpKQorCXZtb3ZkcXUJJXhtbTgsMTYoJXJzaSkKKwl2bW92ZHF1CSV4bW05LDMyKCVyc2kpCisJdm1vdmRxdQkleG1tMTAsNDgoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMSw2NCglcnNpKQorCXZtb3ZkcXUJJXhtbTEyLDgwKCVyc2kpCisKKwlhZGRxCSQ5NiwlcmRpCisJYWRkcQkkOTYsJXJzaQorCWptcAkuTDI1Nl9kZWNfbG9vcDEKKworCisuYWxpZ24JNjQKKy5MMjU2X2RlY19sb29wMToKKwljbXBxCSQ5NiwlcjkKKwlqYgkuTDI1Nl9kZWNfZmluaXNoXzk2CisJc3VicQkkOTYsJXI5CisKKwl2bW92ZHFhCSV4bW0xMiwleG1tNgorCXZtb3ZkcWEJJXhtbTExLDE2LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tMTAsMzItMzIoJXJheCkKKwl2bW92ZHFhCSV4bW05LDQ4LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tOCw2NC0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTcsODAtMzIoJXJheCkKKworCXZtb3ZkcWEJJXhtbTE1LCV4bW03CisJdnBhZGRkCW9uZSglcmlwKSwleG1tNywleG1tOAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTcsJXhtbTkKKwl2cGFkZGQJb25lKCVyaXApLCV4bW05LCV4bW0xMAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTksJXhtbTExCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMTEsJXhtbTEyCisJdnBhZGRkCXR3byglcmlwKSwleG1tMTEsJXhtbTE1CisKKwl2bW92ZHFhCSglcjgpLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTcsJXhtbTcKKwl2cHhvcgkleG1tNCwleG1tOCwleG1tOAorCXZweG9yCSV4bW00LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2cHhvcgkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTAtMzIoJXJjeCksJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW00LCV4bW02LCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNCwleG1tNiwleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTQsJXhtbTYsJXhtbTEKKwl2cGNsbXVscWRxCSQweDEwLCV4bW00LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJMTYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQktMTYoJXJheCksJXhtbTYKKwl2bW92ZHF1CS0xNiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCisJdm1vdmRxdQkzMiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTAoJXJheCksJXhtbTYKKwl2bW92ZHF1CTAoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJNDgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNiglcmF4KSwleG1tNgorCXZtb3ZkcXUJMTYoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJNjQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkzMiglcmF4KSwleG1tNgorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJODAoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQk5NiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTExMiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKworCXZtb3ZkcWEJODAtMzIoJXJheCksJXhtbTYKKwl2cHhvcgkleG1tMCwleG1tNiwleG1tNgorCXZtb3ZkcXUJODAtMzIoJXJjeCksJXhtbTUKKworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkxMjgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisKKwl2cHNybGRxCSQ4LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTUKKwl2cHNsbGRxCSQ4LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTAKKworCXZtb3ZkcWEJcG9seSglcmlwKSwleG1tMworCisJdm1vdmRxdQkxNDQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNjAoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNzYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxOTIoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkyMDgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkyMjQoJXI4KSwleG1tNgorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0wLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tMCwleG1tMAorCXZweG9yCSV4bW0wLCV4bW0yLCV4bW0wCisKKwl2cHhvcgkwKCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTcsJXhtbTcKKwl2cHhvcgkxNiglcmRpKSwleG1tNiwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW04LCV4bW04CisJdnB4b3IJMzIoJXJkaSksJXhtbTYsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tOSwleG1tOQorCXZweG9yCTQ4KCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZweG9yCTY0KCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZweG9yCTgwKCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTAsJXhtbTIKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTAsJXhtbTIsJXhtbTAKKworCXZtb3ZkcXUJJXhtbTcsMCglcnNpKQorCXZtb3ZkcXUJJXhtbTgsMTYoJXJzaSkKKwl2bW92ZHF1CSV4bW05LDMyKCVyc2kpCisJdm1vdmRxdQkleG1tMTAsNDgoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMSw2NCglcnNpKQorCXZtb3ZkcXUJJXhtbTEyLDgwKCVyc2kpCisKKwl2cHhvcgkleG1tNSwleG1tMCwleG1tMAorCisJbGVhcQk5NiglcmRpKSwlcmRpCisJbGVhcQk5NiglcnNpKSwlcnNpCisJam1wCS5MMjU2X2RlY19sb29wMQorCisuTDI1Nl9kZWNfZmluaXNoXzk2OgorCXZtb3ZkcWEJJXhtbTEyLCV4bW02CisJdm1vdmRxYQkleG1tMTEsMTYtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW0xMCwzMi0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTksNDgtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW04LDY0LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tNyw4MC0zMiglcmF4KQorCisJdm1vdmRxdQkwLTMyKCVyY3gpLCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNCwleG1tNiwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTQsJXhtbTYsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW00LCV4bW02LCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tNCwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CS0xNiglcmF4KSwleG1tNgorCXZtb3ZkcXUJLTE2KCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkwKCVyYXgpLCV4bW02CisJdm1vdmRxdQkwKCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkxNiglcmF4KSwleG1tNgorCXZtb3ZkcXUJMTYoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTMyKCVyYXgpLCV4bW02CisJdm1vdmRxdQkzMiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCisJdm1vdmRxdQk4MC0zMiglcmF4KSwleG1tNgorCXZweG9yCSV4bW0wLCV4bW02LCV4bW02CisJdm1vdmRxdQk4MC0zMiglcmN4KSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdnBzcmxkcQkkOCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW01CisJdnBzbGxkcQkkOCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0wCisKKwl2bW92ZHFhCXBvbHkoJXJpcCksJXhtbTMKKworCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0wLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tMCwleG1tMAorCXZweG9yCSV4bW0wLCV4bW0yLCV4bW0wCisKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMCwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tMCwleG1tMiwleG1tMAorCisJdnB4b3IJJXhtbTUsJXhtbTAsJXhtbTAKKworLkwyNTZfZGVjX2xvb3AyOgorCisKKworCWNtcHEJJDE2LCVyOQorCWpiCS5MMjU2X2RlY19vdXQKKwlzdWJxCSQxNiwlcjkKKworCXZtb3ZkcWEJJXhtbTE1LCV4bW0yCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMTUsJXhtbTE1CisKKwl2cHhvcgkwKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTE2KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTMyKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTQ4KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTY0KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTgwKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTk2KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTExMiglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkxMjgoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMTQ0KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTE2MCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkxNzYoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMTkyKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTIwOCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuY2xhc3QJMjI0KCVyOCksJXhtbTIsJXhtbTIKKwl2cHhvcgkoJXJkaSksJXhtbTIsJXhtbTIKKwl2bW92ZHF1CSV4bW0yLCglcnNpKQorCWFkZHEJJDE2LCVyZGkKKwlhZGRxCSQxNiwlcnNpCisKKwl2cHhvcgkleG1tMiwleG1tMCwleG1tMAorCXZtb3ZkcWEJLTMyKCVyY3gpLCV4bW0xCisJY2FsbAlHRk1VTAorCisJam1wCS5MMjU2X2RlY19sb29wMgorCisuTDI1Nl9kZWNfb3V0OgorCXZtb3ZkcXUJJXhtbTAsKCVyZHgpCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXMyNTZnY21zaXZfZGVjLCAuLWFlczI1NmdjbXNpdl9kZWMKKy5nbG9ibAlhZXMyNTZnY21zaXZfa2RmCisuaGlkZGVuIGFlczI1NmdjbXNpdl9rZGYKKy50eXBlCWFlczI1NmdjbXNpdl9rZGYsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2FlczI1NmdjbXNpdl9rZGY6CisuY2ZpX3N0YXJ0cHJvYwkKKworCisKKworCXZtb3ZkcWEJKCVyZHgpLCV4bW0xCisJdm1vdmRxYQkwKCVyZGkpLCV4bW00CisJdm1vdmRxYQlhbmRfbWFzayglcmlwKSwleG1tMTEKKwl2bW92ZHFhCW9uZSglcmlwKSwleG1tOAorCXZwc2h1ZmQJJDB4OTAsJXhtbTQsJXhtbTQKKwl2cGFuZAkleG1tMTEsJXhtbTQsJXhtbTQKKwl2cGFkZGQJJXhtbTgsJXhtbTQsJXhtbTYKKwl2cGFkZGQJJXhtbTgsJXhtbTYsJXhtbTcKKwl2cGFkZGQJJXhtbTgsJXhtbTcsJXhtbTExCisJdnBhZGRkCSV4bW04LCV4bW0xMSwleG1tMTIKKwl2cGFkZGQJJXhtbTgsJXhtbTEyLCV4bW0xMworCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tMSwleG1tNiwleG1tNgorCXZweG9yCSV4bW0xLCV4bW03LCV4bW03CisJdnB4b3IJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW0xLCV4bW0xMiwleG1tMTIKKwl2cHhvcgkleG1tMSwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTE2KCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTEsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMSwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTMyKCVyZHgpLCV4bW0yCisJdmFlc2VuYwkleG1tMiwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0yLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMiwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTQ4KCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTEsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMSwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTY0KCVyZHgpLCV4bW0yCisJdmFlc2VuYwkleG1tMiwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0yLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMiwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTgwKCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTEsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMSwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTk2KCVyZHgpLCV4bW0yCisJdmFlc2VuYwkleG1tMiwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0yLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMiwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTExMiglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkxMjgoJXJkeCksJXhtbTIKKwl2YWVzZW5jCSV4bW0yLCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMywleG1tMTMKKworCXZtb3ZkcWEJMTQ0KCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTEsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMSwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTE2MCglcmR4KSwleG1tMgorCXZhZXNlbmMJJXhtbTIsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0yLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTIsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkxNzYoJXJkeCksJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMywleG1tMTMKKworCXZtb3ZkcWEJMTkyKCVyZHgpLCV4bW0yCisJdmFlc2VuYwkleG1tMiwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0yLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMiwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTIwOCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkyMjQoJXJkeCksJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tNCwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW02LCV4bW02CisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW0xMywleG1tMTMKKworCisJdm1vdmRxYQkleG1tNCwwKCVyc2kpCisJdm1vdmRxYQkleG1tNiwxNiglcnNpKQorCXZtb3ZkcWEJJXhtbTcsMzIoJXJzaSkKKwl2bW92ZHFhCSV4bW0xMSw0OCglcnNpKQorCXZtb3ZkcWEJJXhtbTEyLDY0KCVyc2kpCisJdm1vdmRxYQkleG1tMTMsODAoJXJzaSkKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlczI1NmdjbXNpdl9rZGYsIC4tYWVzMjU2Z2Ntc2l2X2tkZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2NoYWNoYTIwX3BvbHkxMzA1X3g4Nl82NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY1ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuUwpAQCAtMCwwICsxLDg5NzQgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisuaGlkZGVuIE9QRU5TU0xfaWEzMmNhcF9QCisKK2NoYWNoYTIwX3BvbHkxMzA1X2NvbnN0YW50czoKKworLmFsaWduCTY0CisuY2hhY2hhMjBfY29uc3RzOgorLmJ5dGUJJ2UnLCd4JywncCcsJ2EnLCduJywnZCcsJyAnLCczJywnMicsJy0nLCdiJywneScsJ3QnLCdlJywnICcsJ2snCisuYnl0ZQknZScsJ3gnLCdwJywnYScsJ24nLCdkJywnICcsJzMnLCcyJywnLScsJ2InLCd5JywndCcsJ2UnLCcgJywnaycKKy5yb2w4OgorLmJ5dGUJMywwLDEsMiwgNyw0LDUsNiwgMTEsOCw5LDEwLCAxNSwxMiwxMywxNAorLmJ5dGUJMywwLDEsMiwgNyw0LDUsNiwgMTEsOCw5LDEwLCAxNSwxMiwxMywxNAorLnJvbDE2OgorLmJ5dGUJMiwzLDAsMSwgNiw3LDQsNSwgMTAsMTEsOCw5LCAxNCwxNSwxMiwxMworLmJ5dGUJMiwzLDAsMSwgNiw3LDQsNSwgMTAsMTEsOCw5LCAxNCwxNSwxMiwxMworLmF2eDJfaW5pdDoKKy5sb25nCTAsMCwwLDAKKy5zc2VfaW5jOgorLmxvbmcJMSwwLDAsMAorLmF2eDJfaW5jOgorLmxvbmcJMiwwLDAsMCwyLDAsMCwwCisuY2xhbXA6CisucXVhZAkweDBGRkZGRkZDMEZGRkZGRkYsIDB4MEZGRkZGRkMwRkZGRkZGQworLnF1YWQJMHhGRkZGRkZGRkZGRkZGRkZGLCAweEZGRkZGRkZGRkZGRkZGRkYKKy5hbGlnbgkxNgorLmFuZF9tYXNrczoKKy5ieXRlCTB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAKKy5ieXRlCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYKKworLnR5cGUJcG9seV9oYXNoX2FkX2ludGVybmFsLEBmdW5jdGlvbgorLmFsaWduCTY0Citwb2x5X2hhc2hfYWRfaW50ZXJuYWw6CisuY2ZpX3N0YXJ0cHJvYwkKKwl4b3JxCSVyMTAsJXIxMAorCXhvcnEJJXIxMSwlcjExCisJeG9ycQklcjEyLCVyMTIKKwljbXBxCSQxMywlcjgKKwlqbmUJaGFzaF9hZF9sb29wCitwb2x5X2Zhc3RfdGxzX2FkOgorCisJbW92cQkoJXJjeCksJXIxMAorCW1vdnEJNSglcmN4KSwlcjExCisJc2hycQkkMjQsJXIxMQorCW1vdnEJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwkuYnl0ZQkweGYzLDB4YzMKK2hhc2hfYWRfbG9vcDoKKworCWNtcHEJJDE2LCVyOAorCWpiCWhhc2hfYWRfdGFpbAorCWFkZHEJMCglcmN4KSwlcjEwCisJYWRjcQk4KzAoJXJjeCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwlzdWJxCSQxNiwlcjgKKwlqbXAJaGFzaF9hZF9sb29wCitoYXNoX2FkX3RhaWw6CisJY21wcQkkMCwlcjgKKwlqZQkxZgorCisJeG9ycQklcjEzLCVyMTMKKwl4b3JxCSVyMTQsJXIxNAorCXhvcnEJJXIxNSwlcjE1CisJYWRkcQklcjgsJXJjeAoraGFzaF9hZF90YWlsX2xvb3A6CisJc2hsZHEJJDgsJXIxMywlcjE0CisJc2hscQkkOCwlcjEzCisJbW92emJxCS0xKCVyY3gpLCVyMTUKKwl4b3JxCSVyMTUsJXIxMworCWRlY3EJJXJjeAorCWRlY3EJJXI4CisJam5lCWhhc2hfYWRfdGFpbF9sb29wCisKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCisxOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJcG9seV9oYXNoX2FkX2ludGVybmFsLCAuLXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorCisuZ2xvYmwJY2hhY2hhMjBfcG9seTEzMDVfb3BlbgorLmhpZGRlbiBjaGFjaGEyMF9wb2x5MTMwNV9vcGVuCisudHlwZQljaGFjaGEyMF9wb2x5MTMwNV9vcGVuLEBmdW5jdGlvbgorLmFsaWduCTY0CitjaGFjaGEyMF9wb2x5MTMwNV9vcGVuOgorLmNmaV9zdGFydHByb2MJCisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisJcHVzaHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisJcHVzaHEJJXIxNAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisJcHVzaHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisKKworCXB1c2hxCSVyOQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisJc3VicQkkMjg4ICsgMzIsJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAkyODggKyAzMgorLmNmaV9vZmZzZXQJcmJwLCAtMTYKKy5jZmlfb2Zmc2V0CXJieCwgLTI0CisuY2ZpX29mZnNldAlyMTIsIC0zMgorLmNmaV9vZmZzZXQJcjEzLCAtNDAKKy5jZmlfb2Zmc2V0CXIxNCwgLTQ4CisuY2ZpX29mZnNldAlyMTUsIC01NgorCWxlYXEJMzIoJXJzcCksJXJicAorCWFuZHEJJC0zMiwlcmJwCisJbW92cQklcmR4LDgrMzIoJXJicCkKKwltb3ZxCSVyOCwwKzMyKCVyYnApCisJbW92cQklcmR4LCVyYngKKworCW1vdmwJT1BFTlNTTF9pYTMyY2FwX1ArOCglcmlwKSwlZWF4CisJYW5kbAkkMjg4LCVlYXgKKwl4b3JsCSQyODgsJWVheAorCWp6CWNoYWNoYTIwX3BvbHkxMzA1X29wZW5fYXZ4MgorCisxOgorCWNtcHEJJDEyOCwlcmJ4CisJamJlCW9wZW5fc3NlXzEyOAorCisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcXUJMCglcjkpLCV4bW00CisJbW92ZHF1CTE2KCVyOSksJXhtbTgKKwltb3ZkcXUJMzIoJXI5KSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLCV4bW03CisKKwltb3ZkcWEJJXhtbTQsNDgoJXJicCkKKwltb3ZkcWEJJXhtbTgsNjQoJXJicCkKKwltb3ZkcWEJJXhtbTEyLDk2KCVyYnApCisJbW92cQkkMTAsJXIxMAorMToKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKworCWRlY3EJJXIxMAorCWpuZQkxYgorCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisKKwlwYW5kCS5jbGFtcCglcmlwKSwleG1tMAorCW1vdmRxYQkleG1tMCwwKCVyYnApCisJbW92ZHFhCSV4bW00LDE2KCVyYnApCisKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorb3Blbl9zc2VfbWFpbl9sb29wOgorCWNtcHEJJDI1NiwlcmJ4CisJamIJMmYKKworCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW00LCV4bW02CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxYQkleG1tMCwleG1tMworCW1vdmRxYQkleG1tNCwleG1tNworCW1vdmRxYQkleG1tOCwleG1tMTEKKwltb3ZkcWEJOTYoJXJicCksJXhtbTE1CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE1CisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTQKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMworCW1vdmRxYQkleG1tMTMsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCW1vdmRxYQkleG1tMTMsMTEyKCVyYnApCisJbW92ZHFhCSV4bW0xNCwxMjgoJXJicCkKKwltb3ZkcWEJJXhtbTE1LDE0NCglcmJwKQorCisKKworCW1vdnEJJDQsJXJjeAorCW1vdnEJJXJzaSwlcjgKKzE6CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCS5yb2wxNiglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlhZGRxCTAoJXI4KSwlcjEwCisJYWRjcQk4KzAoJXI4KSwlcjExCisJYWRjcQkkMSwlcjEyCisKKwlsZWFxCTE2KCVyOCksJXI4CisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZkcWEJLnJvbDgoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1NSw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsMTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJLnJvbDE2KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCS5yb2w4KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjU1LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0NiwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCisJZGVjcQklcmN4CisJamdlCTFiCisJYWRkcQkwKCVyOCksJXIxMAorCWFkY3EJOCswKCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyOCksJXI4CisJY21wcQkkLTYsJXJjeAorCWpnCTFiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMworCXBhZGRkCTQ4KCVyYnApLCV4bW03CisJcGFkZGQJNjQoJXJicCksJXhtbTExCisJcGFkZGQJMTQ0KCVyYnApLCV4bW0xNQorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAk0OCglcmJwKSwleG1tNgorCXBhZGRkCTY0KCVyYnApLCV4bW0xMAorCXBhZGRkCTEyOCglcmJwKSwleG1tMTQKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsODAoJXJicCkKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMywleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDAgKyAwKCVyZGkpCisJbW92ZHF1CTE2ICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW03LCV4bW0xMgorCW1vdmRxdQkleG1tMTIsMTYgKyAwKCVyZGkpCisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDMyICsgMCglcmRpKQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMTUsJXhtbTEyCisJbW92ZHF1CSV4bW0xMiw0OCArIDAoJXJkaSkKKwltb3ZkcXUJMCArIDY0KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgNjQoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyA2NCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyA2NCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tNywleG1tNgorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxdQkleG1tMiwwICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTYsMTYgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTAsMzIgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyA2NCglcmRpKQorCW1vdmRxdQkwICsgMTI4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgMTI4KCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMTI4KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDEyOCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTUsMTYgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMTI4KCVyZGkpCisJbW92ZHF1CTAgKyAxOTIoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAxOTIoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAxOTIoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgMTkyKCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW03LCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTgKKwlweG9yCTgwKCVyYnApLCV4bW0xNQorCW1vdmRxdQkleG1tMCwwICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW00LDE2ICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW04LDMyICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDE5MiglcmRpKQorCisJbGVhcQkyNTYoJXJzaSksJXJzaQorCWxlYXEJMjU2KCVyZGkpLCVyZGkKKwlzdWJxCSQyNTYsJXJieAorCWptcAlvcGVuX3NzZV9tYWluX2xvb3AKKzI6CisKKwl0ZXN0cQklcmJ4LCVyYngKKwlqeglvcGVuX3NzZV9maW5hbGl6ZQorCWNtcHEJJDY0LCVyYngKKwlqYQkzZgorCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCTk2KCVyYnApLCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsOTYoJXJicCkKKworCXhvcnEJJXI4LCVyOAorCW1vdnEJJXJieCwlcmN4CisJY21wcQkkMTYsJXJjeAorCWpiCTJmCisxOgorCWFkZHEJMCglcnNpLCVyOCksICVyMTAKKwlhZGNxCTgrMCglcnNpLCVyOCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJc3VicQkkMTYsJXJjeAorMjoKKwlhZGRxCSQxNiwlcjgKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKworCWNtcHEJJDE2LCVyY3gKKwlqYWUJMWIKKwljbXBxCSQxNjAsJXI4CisJam5lCTJiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKworCWptcAlvcGVuX3NzZV90YWlsXzY0X2RlY19sb29wCiszOgorCWNtcHEJJDEyOCwlcmJ4CisJamEJM2YKKwltb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCW1vdmRxYQk0OCglcmJwKSwleG1tNAorCW1vdmRxYQk2NCglcmJwKSwleG1tOAorCW1vdmRxYQkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tNCwleG1tNQorCW1vdmRxYQkleG1tOCwleG1tOQorCW1vdmRxYQk5NiglcmJwKSwleG1tMTMKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTMKKwltb3ZkcWEJJXhtbTEzLCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsOTYoJXJicCkKKwltb3ZkcWEJJXhtbTEzLDExMiglcmJwKQorCisJbW92cQklcmJ4LCVyY3gKKwlhbmRxCSQtMTYsJXJjeAorCXhvcnEJJXI4LCVyOAorMToKKwlhZGRxCTAoJXJzaSwlcjgpLCAlcjEwCisJYWRjcQk4KzAoJXJzaSwlcjgpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworMjoKKwlhZGRxCSQxNiwlcjgKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDQKKworCWNtcHEJJXJjeCwlcjgKKwlqYgkxYgorCWNtcHEJJDE2MCwlcjgKKwlqbmUJMmIKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCW1vdmRxdQkwICsgMCglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDAoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAwKCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW0xMSwleG1tOQorCXB4b3IJJXhtbTEzLCV4bW0xNQorCW1vdmRxdQkleG1tMSwwICsgMCglcmRpKQorCW1vdmRxdQkleG1tNSwxNiArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDAoJXJkaSkKKworCXN1YnEJJDY0LCVyYngKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwlqbXAJb3Blbl9zc2VfdGFpbF82NF9kZWNfbG9vcAorMzoKKwljbXBxCSQxOTIsJXJieAorCWphCTNmCisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcWEJNDgoJXJicCksJXhtbTQKKwltb3ZkcWEJNjQoJXJicCksJXhtbTgKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcWEJJXhtbTgsJXhtbTEwCisJbW92ZHFhCTk2KCVyYnApLCV4bW0xNAorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xNAorCW1vdmRxYQkleG1tMTQsJXhtbTEzCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEzCisJbW92ZHFhCSV4bW0xMywleG1tMTIKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLDk2KCVyYnApCisJbW92ZHFhCSV4bW0xMywxMTIoJXJicCkKKwltb3ZkcWEJJXhtbTE0LDEyOCglcmJwKQorCisJbW92cQklcmJ4LCVyY3gKKwltb3ZxCSQxNjAsJXI4CisJY21wcQkkMTYwLCVyY3gKKwljbW92Z3EJJXI4LCVyY3gKKwlhbmRxCSQtMTYsJXJjeAorCXhvcnEJJXI4LCVyOAorMToKKwlhZGRxCTAoJXJzaSwlcjgpLCAlcjEwCisJYWRjcQk4KzAoJXJzaSwlcjgpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworMjoKKwlhZGRxCSQxNiwlcjgKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW02CisJcHhvcgkleG1tMywleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorCisJY21wcQklcmN4LCVyOAorCWpiCTFiCisJY21wcQkkMTYwLCVyOAorCWpuZQkyYgorCWNtcHEJJDE3NiwlcmJ4CisJamIJMWYKKwlhZGRxCTE2MCglcnNpKSwlcjEwCisJYWRjcQk4KzE2MCglcnNpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWNtcHEJJDE5MiwlcmJ4CisJamIJMWYKKwlhZGRxCTE3NiglcnNpKSwlcjEwCisJYWRjcQk4KzE3NiglcnNpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworMToKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0yCisJcGFkZGQJNDgoJXJicCksJXhtbTYKKwlwYWRkZAk2NCglcmJwKSwleG1tMTAKKwlwYWRkZAkxMjgoJXJicCksJXhtbTE0CisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMQorCXBhZGRkCTQ4KCVyYnApLCV4bW01CisJcGFkZGQJNjQoJXJicCksJXhtbTkKKwlwYWRkZAkxMTIoJXJicCksJXhtbTEzCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAwKCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyAwKCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW03LCV4bW02CisJcHhvcgkleG1tMTEsJXhtbTEwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHF1CSV4bW0yLDAgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW02LDE2ICsgMCglcmRpKQorCW1vdmRxdQkleG1tMTAsMzIgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDAoJXJkaSkKKwltb3ZkcXUJMCArIDY0KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgNjQoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyA2NCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyA2NCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tNSwxNiArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW05LDMyICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgNjQoJXJkaSkKKworCXN1YnEJJDEyOCwlcmJ4CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwlqbXAJb3Blbl9zc2VfdGFpbF82NF9kZWNfbG9vcAorMzoKKworCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW00LCV4bW02CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxYQkleG1tMCwleG1tMworCW1vdmRxYQkleG1tNCwleG1tNworCW1vdmRxYQkleG1tOCwleG1tMTEKKwltb3ZkcWEJOTYoJXJicCksJXhtbTE1CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE1CisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTQKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMworCW1vdmRxYQkleG1tMTMsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCW1vdmRxYQkleG1tMTMsMTEyKCVyYnApCisJbW92ZHFhCSV4bW0xNCwxMjgoJXJicCkKKwltb3ZkcWEJJXhtbTE1LDE0NCglcmJwKQorCisJeG9ycQklcjgsJXI4CisxOgorCWFkZHEJMCglcnNpLCVyOCksICVyMTAKKwlhZGNxCTgrMCglcnNpLCVyOCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZkcWEJJXhtbTExLDgwKCVyYnApCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMTEKKwlwc2xsZAkkMTIsJXhtbTExCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTExCisJcHNsbGQJJDcsJXhtbTExCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDEyCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMTEKKwlwc2xsZAkkMTIsJXhtbTExCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTExCisJcHNsbGQJJDcsJXhtbTExCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDEyCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQxMiwleG1tMTEKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTExLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0NiwxMgorCW1vdmRxYQk4MCglcmJwKSwleG1tMTEKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZkcWEJJXhtbTksODAoJXJicCkKKwlwYWRkZAkleG1tNywleG1tMworCXB4b3IJJXhtbTMsJXhtbTE1CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkMTIsJXhtbTkKKwlwc3JsZAkkMjAsJXhtbTcKKwlweG9yCSV4bW05LCV4bW03CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0xNQorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkNywleG1tOQorCXBzcmxkCSQyNSwleG1tNworCXB4b3IJJXhtbTksJXhtbTcKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTUsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxOSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjU1LDEyCisJbW92ZHFhCTgwKCVyYnApLCV4bW05CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92ZHFhCSV4bW0xMSw4MCglcmJwKQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTExCisJcHNsbGQJJDEyLCV4bW0xMQorCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTExLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTExLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTExCisJcHNsbGQJJDEyLCV4bW0xMQorCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTExLCV4bW01CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTExLCV4bW01CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsNAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQxMiwleG1tMTEKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTExLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorCW1vdmRxYQk4MCglcmJwKSwleG1tMTEKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwltb3ZkcWEJJXhtbTksODAoJXJicCkKKwlwYWRkZAkleG1tNywleG1tMworCXB4b3IJJXhtbTMsJXhtbTE1CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkMTIsJXhtbTkKKwlwc3JsZAkkMjAsJXhtbTcKKwlweG9yCSV4bW05LCV4bW03CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0xNQorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkNywleG1tOQorCXBzcmxkCSQyNSwleG1tNworCXB4b3IJJXhtbTksJXhtbTcKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTUsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTksOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI1NSw0CisJbW92ZHFhCTgwKCVyYnApLCV4bW05CisKKwlhZGRxCSQxNiwlcjgKKwljbXBxCSQxNjAsJXI4CisJamIJMWIKKwltb3ZxCSVyYngsJXJjeAorCWFuZHEJJC0xNiwlcmN4CisxOgorCWFkZHEJMCglcnNpLCVyOCksICVyMTAKKwlhZGNxCTgrMCglcnNpLCVyOCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJYWRkcQkkMTYsJXI4CisJY21wcQklcmN4LCVyOAorCWpiCTFiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMworCXBhZGRkCTQ4KCVyYnApLCV4bW03CisJcGFkZGQJNjQoJXJicCksJXhtbTExCisJcGFkZGQJMTQ0KCVyYnApLCV4bW0xNQorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAk0OCglcmJwKSwleG1tNgorCXBhZGRkCTY0KCVyYnApLCV4bW0xMAorCXBhZGRkCTEyOCglcmJwKSwleG1tMTQKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsODAoJXJicCkKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMywleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDAgKyAwKCVyZGkpCisJbW92ZHF1CTE2ICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW03LCV4bW0xMgorCW1vdmRxdQkleG1tMTIsMTYgKyAwKCVyZGkpCisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDMyICsgMCglcmRpKQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMTUsJXhtbTEyCisJbW92ZHF1CSV4bW0xMiw0OCArIDAoJXJkaSkKKwltb3ZkcXUJMCArIDY0KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgNjQoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyA2NCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyA2NCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tNywleG1tNgorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxdQkleG1tMiwwICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTYsMTYgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTAsMzIgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyA2NCglcmRpKQorCW1vdmRxdQkwICsgMTI4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgMTI4KCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMTI4KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDEyOCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTUsMTYgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMTI4KCVyZGkpCisKKwltb3ZkcWEJODAoJXJicCksJXhtbTEyCisJc3VicQkkMTkyLCVyYngKKwlsZWFxCTE5MiglcnNpKSwlcnNpCisJbGVhcQkxOTIoJXJkaSksJXJkaQorCisKK29wZW5fc3NlX3RhaWxfNjRfZGVjX2xvb3A6CisJY21wcQkkMTYsJXJieAorCWpiCTFmCisJc3VicQkkMTYsJXJieAorCW1vdmRxdQkoJXJzaSksJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0wCisJbW92ZHF1CSV4bW0wLCglcmRpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWxlYXEJMTYoJXJkaSksJXJkaQorCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tMTIsJXhtbTgKKwlqbXAJb3Blbl9zc2VfdGFpbF82NF9kZWNfbG9vcAorMToKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKworCitvcGVuX3NzZV90YWlsXzE2OgorCXRlc3RxCSVyYngsJXJieAorCWp6CW9wZW5fc3NlX2ZpbmFsaXplCisKKworCisJcHhvcgkleG1tMywleG1tMworCWxlYXEJLTEoJXJzaSwlcmJ4KSwgJXJzaQorCW1vdnEJJXJieCwlcjgKKzI6CisJcHNsbGRxCSQxLCV4bW0zCisJcGluc3JiCSQwLCglcnNpKSwleG1tMworCXN1YnEJJDEsJXJzaQorCXN1YnEJJDEsJXI4CisJam56CTJiCisKKzM6CisuYnl0ZQkxMDIsNzMsMTUsMTI2LDIyMQorCXBleHRycQkkMSwleG1tMywlcjE0CisKKwlweG9yCSV4bW0xLCV4bW0zCisKKworMjoKKwlwZXh0cmIJJDAsJXhtbTMsKCVyZGkpCisJcHNybGRxCSQxLCV4bW0zCisJYWRkcQkkMSwlcmRpCisJc3VicQkkMSwlcmJ4CisJam5lCTJiCisKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCitvcGVuX3NzZV9maW5hbGl6ZToKKwlhZGRxCTMyKCVyYnApLCVyMTAKKwlhZGNxCTgrMzIoJXJicCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworCW1vdnEJJXIxMCwlcjEzCisJbW92cQklcjExLCVyMTQKKwltb3ZxCSVyMTIsJXIxNQorCXN1YnEJJC01LCVyMTAKKwlzYmJxCSQtMSwlcjExCisJc2JicQkkMywlcjEyCisJY21vdmNxCSVyMTMsJXIxMAorCWNtb3ZjcQklcjE0LCVyMTEKKwljbW92Y3EJJXIxNSwlcjEyCisKKwlhZGRxCTArMTYoJXJicCksJXIxMAorCWFkY3EJOCsxNiglcmJwKSwlcjExCisKKwlhZGRxCSQyODggKyAzMiwlcnNwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CS0oMjg4ICsgMzIpCisJcG9wcQklcjkKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwltb3ZxCSVyMTAsKCVyOSkKKwltb3ZxCSVyMTEsOCglcjkpCisKKwlwb3BxCSVyMTUKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwlwb3BxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwlwb3BxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwlwb3BxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwlwb3BxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwlwb3BxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJKDggKiA2KSArIDI4OCArIDMyCisKK29wZW5fc3NlXzEyODoKKwltb3ZkcXUJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tMCwleG1tMgorCW1vdmRxdQkwKCVyOSksJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcXUJMTYoJXI5KSwleG1tOAorCW1vdmRxYQkleG1tOCwleG1tOQorCW1vdmRxYQkleG1tOCwleG1tMTAKKwltb3ZkcXUJMzIoJXI5KSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMworCW1vdmRxYQkleG1tMTMsJXhtbTE0CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE0CisJbW92ZHFhCSV4bW00LCV4bW03CisJbW92ZHFhCSV4bW04LCV4bW0xMQorCW1vdmRxYQkleG1tMTMsJXhtbTE1CisJbW92cQkkMTAsJXIxMAorMToKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW02CisJcHhvcgkleG1tMywleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorCisJZGVjcQklcjEwCisJam56CTFiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTEKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0yCisJcGFkZGQJJXhtbTcsJXhtbTQKKwlwYWRkZAkleG1tNywleG1tNQorCXBhZGRkCSV4bW03LCV4bW02CisJcGFkZGQJJXhtbTExLCV4bW05CisJcGFkZGQJJXhtbTExLCV4bW0xMAorCXBhZGRkCSV4bW0xNSwleG1tMTMKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTE0CisKKwlwYW5kCS5jbGFtcCglcmlwKSwleG1tMAorCW1vdmRxYQkleG1tMCwwKCVyYnApCisJbW92ZHFhCSV4bW00LDE2KCVyYnApCisKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorMToKKwljbXBxCSQxNiwlcmJ4CisJamIJb3Blbl9zc2VfdGFpbF8xNgorCXN1YnEJJDE2LCVyYngKKwlhZGRxCTAoJXJzaSksJXIxMAorCWFkY3EJOCswKCVyc2kpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKworCisJbW92ZHF1CTAoJXJzaSksJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0xCisJbW92ZHF1CSV4bW0xLDAoJXJkaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTEzLCV4bW05CisJbW92ZHFhCSV4bW0yLCV4bW0xMworCW1vdmRxYQkleG1tNiwleG1tMgorCW1vdmRxYQkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMAorCWptcAkxYgorCWptcAlvcGVuX3NzZV90YWlsXzE2Cisuc2l6ZQljaGFjaGEyMF9wb2x5MTMwNV9vcGVuLCAuLWNoYWNoYTIwX3BvbHkxMzA1X29wZW4KKy5jZmlfZW5kcHJvYwkKKworCisKKworLmdsb2JsCWNoYWNoYTIwX3BvbHkxMzA1X3NlYWwKKy5oaWRkZW4gY2hhY2hhMjBfcG9seTEzMDVfc2VhbAorLnR5cGUJY2hhY2hhMjBfcG9seTEzMDVfc2VhbCxAZnVuY3Rpb24KKy5hbGlnbgk2NAorY2hhY2hhMjBfcG9seTEzMDVfc2VhbDoKKy5jZmlfc3RhcnRwcm9jCQorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorCXB1c2hxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorCXB1c2hxCSVyMTUKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorCisKKwlwdXNocQklcjkKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorCXN1YnEJJDI4OCArIDMyLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJMjg4ICsgMzIKKy5jZmlfb2Zmc2V0CXJicCwgLTE2CisuY2ZpX29mZnNldAlyYngsIC0yNAorLmNmaV9vZmZzZXQJcjEyLCAtMzIKKy5jZmlfb2Zmc2V0CXIxMywgLTQwCisuY2ZpX29mZnNldAlyMTQsIC00OAorLmNmaV9vZmZzZXQJcjE1LCAtNTYKKwlsZWFxCTMyKCVyc3ApLCVyYnAKKwlhbmRxCSQtMzIsJXJicAorCW1vdnEJNTYoJXI5KSwlcmJ4CisJYWRkcQklcmR4LCVyYngKKwltb3ZxCSVyYngsOCszMiglcmJwKQorCW1vdnEJJXI4LDArMzIoJXJicCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92bAlPUEVOU1NMX2lhMzJjYXBfUCs4KCVyaXApLCVlYXgKKwlhbmRsCSQyODgsJWVheAorCXhvcmwJJDI4OCwlZWF4CisJanoJY2hhY2hhMjBfcG9seTEzMDVfc2VhbF9hdngyCisKKwljbXBxCSQxMjgsJXJieAorCWpiZQlzZWFsX3NzZV8xMjgKKworCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHF1CTAoJXI5KSwleG1tNAorCW1vdmRxdQkxNiglcjkpLCV4bW04CisJbW92ZHF1CTMyKCVyOSksJXhtbTEyCisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW02CisJbW92ZHFhCSV4bW00LCV4bW03CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxYQkleG1tOCwleG1tMTEKKwltb3ZkcWEJJXhtbTEyLCV4bW0xNQorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsJXhtbTE0CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiwleG1tMTMKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTIKKworCW1vdmRxYQkleG1tNCw0OCglcmJwKQorCW1vdmRxYQkleG1tOCw2NCglcmJwKQorCW1vdmRxYQkleG1tMTIsOTYoJXJicCkKKwltb3ZkcWEJJXhtbTEzLDExMiglcmJwKQorCW1vdmRxYQkleG1tMTQsMTI4KCVyYnApCisJbW92ZHFhCSV4bW0xNSwxNDQoJXJicCkKKwltb3ZxCSQxMCwlcjEwCisxOgorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkucm9sMTYoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJLnJvbDgoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTUsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxOSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjU1LDEyCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0NiwxMgorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDEyCisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCS5yb2wxNiglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0xMCwleG1tNgorCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCSV4bW03LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW03CisJcHhvcgkleG1tOCwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNgorCXB4b3IJJXhtbTgsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTUKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW00CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkucm9sOCglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0xMCwleG1tNgorCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCSV4bW03LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW03CisJcHhvcgkleG1tOCwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNgorCXB4b3IJJXhtbTgsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTUKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW00CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1NSwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxOSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjU1LDQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0Niw0CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKworCWRlY3EJJXIxMAorCWpuegkxYgorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTMKKwlwYWRkZAk0OCglcmJwKSwleG1tNworCXBhZGRkCTY0KCVyYnApLCV4bW0xMQorCXBhZGRkCTE0NCglcmJwKSwleG1tMTUKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0yCisJcGFkZGQJNDgoJXJicCksJXhtbTYKKwlwYWRkZAk2NCglcmJwKSwleG1tMTAKKwlwYWRkZAkxMjgoJXJicCksJXhtbTE0CisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMQorCXBhZGRkCTQ4KCVyYnApLCV4bW01CisJcGFkZGQJNjQoJXJicCksJXhtbTkKKwlwYWRkZAkxMTIoJXJicCksJXhtbTEzCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKworCisJcGFuZAkuY2xhbXAoJXJpcCksJXhtbTMKKwltb3ZkcWEJJXhtbTMsMCglcmJwKQorCW1vdmRxYQkleG1tNywxNiglcmJwKQorCisJbW92cQklcjgsJXI4CisJY2FsbAlwb2x5X2hhc2hfYWRfaW50ZXJuYWwKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAwKCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyAwKCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW03LCV4bW02CisJcHhvcgkleG1tMTEsJXhtbTEwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHF1CSV4bW0yLDAgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW02LDE2ICsgMCglcmRpKQorCW1vdmRxdQkleG1tMTAsMzIgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDAoJXJkaSkKKwltb3ZkcXUJMCArIDY0KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgNjQoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyA2NCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyA2NCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tNSwxNiArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW05LDMyICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgNjQoJXJkaSkKKworCWNtcHEJJDE5MiwlcmJ4CisJamEJMWYKKwltb3ZxCSQxMjgsJXJjeAorCXN1YnEJJDEyOCwlcmJ4CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCWptcAlzZWFsX3NzZV8xMjhfc2VhbF9oYXNoCisxOgorCW1vdmRxdQkwICsgMTI4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgMTI4KCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMTI4KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDEyOCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0wCisJcHhvcgkleG1tNywleG1tNAorCXB4b3IJJXhtbTExLCV4bW04CisJcHhvcgkleG1tMTIsJXhtbTE1CisJbW92ZHF1CSV4bW0wLDAgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTQsMTYgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTgsMzIgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMTI4KCVyZGkpCisKKwltb3ZxCSQxOTIsJXJjeAorCXN1YnEJJDE5MiwlcmJ4CisJbGVhcQkxOTIoJXJzaSksJXJzaQorCW1vdnEJJDIsJXJjeAorCW1vdnEJJDgsJXI4CisJY21wcQkkNjQsJXJieAorCWpiZQlzZWFsX3NzZV90YWlsXzY0CisJY21wcQkkMTI4LCVyYngKKwlqYmUJc2VhbF9zc2VfdGFpbF8xMjgKKwljbXBxCSQxOTIsJXJieAorCWpiZQlzZWFsX3NzZV90YWlsXzE5MgorCisxOgorCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW00LCV4bW02CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxYQkleG1tMCwleG1tMworCW1vdmRxYQkleG1tNCwleG1tNworCW1vdmRxYQkleG1tOCwleG1tMTEKKwltb3ZkcWEJOTYoJXJicCksJXhtbTE1CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE1CisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTQKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMworCW1vdmRxYQkleG1tMTMsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCW1vdmRxYQkleG1tMTMsMTEyKCVyYnApCisJbW92ZHFhCSV4bW0xNCwxMjgoJXJicCkKKwltb3ZkcWEJJXhtbTE1LDE0NCglcmJwKQorCisyOgorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkucm9sMTYoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZkcWEJLnJvbDgoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1NSw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsMTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJLnJvbDE2KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCS5yb2w4KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjU1LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0NiwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCisJbGVhcQkxNiglcmRpKSwlcmRpCisJZGVjcQklcjgKKwlqZ2UJMmIKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisJZGVjcQklcmN4CisJamcJMmIKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0zCisJcGFkZGQJNDgoJXJicCksJXhtbTcKKwlwYWRkZAk2NCglcmJwKSwleG1tMTEKKwlwYWRkZAkxNDQoJXJicCksJXhtbTE1CisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMgorCXBhZGRkCTQ4KCVyYnApLCV4bW02CisJcGFkZGQJNjQoJXJicCksJXhtbTEwCisJcGFkZGQJMTI4KCVyYnApLCV4bW0xNAorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTEKKwlwYWRkZAk0OCglcmJwKSwleG1tNQorCXBhZGRkCTY0KCVyYnApLCV4bW05CisJcGFkZGQJMTEyKCVyYnApLCV4bW0xMworCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwlwYWRkZAk0OCglcmJwKSwleG1tNAorCXBhZGRkCTY0KCVyYnApLCV4bW04CisJcGFkZGQJOTYoJXJicCksJXhtbTEyCisKKwltb3ZkcWEJJXhtbTE0LDgwKCVyYnApCisJbW92ZHFhCSV4bW0xNCw4MCglcmJwKQorCW1vdmRxdQkwICsgMCglcnNpKSwleG1tMTQKKwlweG9yCSV4bW0zLCV4bW0xNAorCW1vdmRxdQkleG1tMTQsMCArIDAoJXJkaSkKKwltb3ZkcXUJMTYgKyAwKCVyc2kpLCV4bW0xNAorCXB4b3IJJXhtbTcsJXhtbTE0CisJbW92ZHF1CSV4bW0xNCwxNiArIDAoJXJkaSkKKwltb3ZkcXUJMzIgKyAwKCVyc2kpLCV4bW0xNAorCXB4b3IJJXhtbTExLCV4bW0xNAorCW1vdmRxdQkleG1tMTQsMzIgKyAwKCVyZGkpCisJbW92ZHF1CTQ4ICsgMCglcnNpKSwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTQKKwltb3ZkcXUJJXhtbTE0LDQ4ICsgMCglcmRpKQorCisJbW92ZHFhCTgwKCVyYnApLCV4bW0xNAorCW1vdmRxdQkwICsgNjQoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyA2NCglcnNpKSwleG1tNworCW1vdmRxdQkzMiArIDY0KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDY0KCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW03LCV4bW02CisJcHhvcgkleG1tMTEsJXhtbTEwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHF1CSV4bW0yLDAgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tNiwxNiArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW0xMCwzMiArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDY0KCVyZGkpCisJbW92ZHF1CTAgKyAxMjgoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAxMjgoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAxMjgoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgMTI4KCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW03LCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTUKKwltb3ZkcXUJJXhtbTEsMCArIDEyOCglcmRpKQorCW1vdmRxdQkleG1tNSwxNiArIDEyOCglcmRpKQorCW1vdmRxdQkleG1tOSwzMiArIDEyOCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyAxMjgoJXJkaSkKKworCWNtcHEJJDI1NiwlcmJ4CisJamEJM2YKKworCW1vdnEJJDE5MiwlcmN4CisJc3VicQkkMTkyLCVyYngKKwlsZWFxCTE5MiglcnNpKSwlcnNpCisJam1wCXNlYWxfc3NlXzEyOF9zZWFsX2hhc2gKKzM6CisJbW92ZHF1CTAgKyAxOTIoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAxOTIoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAxOTIoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgMTkyKCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW03LCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTgKKwlweG9yCSV4bW0xMiwleG1tMTUKKwltb3ZkcXUJJXhtbTAsMCArIDE5MiglcmRpKQorCW1vdmRxdQkleG1tNCwxNiArIDE5MiglcmRpKQorCW1vdmRxdQkleG1tOCwzMiArIDE5MiglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyAxOTIoJXJkaSkKKworCWxlYXEJMjU2KCVyc2kpLCVyc2kKKwlzdWJxCSQyNTYsJXJieAorCW1vdnEJJDYsJXJjeAorCW1vdnEJJDQsJXI4CisJY21wcQkkMTkyLCVyYngKKwlqZwkxYgorCW1vdnEJJXJieCwlcmN4CisJdGVzdHEJJXJieCwlcmJ4CisJamUJc2VhbF9zc2VfMTI4X3NlYWxfaGFzaAorCW1vdnEJJDYsJXJjeAorCWNtcHEJJDY0LCVyYngKKwlqZwkzZgorCitzZWFsX3NzZV90YWlsXzY0OgorCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCTk2KCVyYnApLCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsOTYoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCwxMgorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkxYgorCWRlY3EJJXI4CisJamdlCTJiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKworCWptcAlzZWFsX3NzZV8xMjhfc2VhbAorMzoKKwljbXBxCSQxMjgsJXJieAorCWpnCTNmCisKK3NlYWxfc3NlX3RhaWxfMTI4OgorCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCTk2KCVyYnApLCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMworCW1vdmRxYQkleG1tMTMsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCW1vdmRxYQkleG1tMTMsMTEyKCVyYnApCisKKzE6CisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXJkaSksJXJkaQorMjoKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsNAorCisJbGVhcQkxNiglcmRpKSwlcmRpCisJZGVjcQklcmN4CisJamcJMWIKKwlkZWNxCSVyOAorCWpnZQkyYgorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTEKKwlwYWRkZAk0OCglcmJwKSwleG1tNQorCXBhZGRkCTY0KCVyYnApLCV4bW05CisJcGFkZGQJMTEyKCVyYnApLCV4bW0xMworCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwlwYWRkZAk0OCglcmJwKSwleG1tNAorCXBhZGRkCTY0KCVyYnApLCV4bW04CisJcGFkZGQJOTYoJXJicCksJXhtbTEyCisJbW92ZHF1CTAgKyAwKCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgMCglcnNpKSwleG1tNworCW1vdmRxdQkzMiArIDAoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgMCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW01LDE2ICsgMCglcmRpKQorCW1vdmRxdQkleG1tOSwzMiArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMCglcmRpKQorCisJbW92cQkkNjQsJXJjeAorCXN1YnEJJDY0LCVyYngKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlqbXAJc2VhbF9zc2VfMTI4X3NlYWxfaGFzaAorMzoKKworc2VhbF9zc2VfdGFpbF8xOTI6CisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcWEJNDgoJXJicCksJXhtbTQKKwltb3ZkcWEJNjQoJXJicCksJXhtbTgKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcWEJJXhtbTgsJXhtbTEwCisJbW92ZHFhCTk2KCVyYnApLCV4bW0xNAorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xNAorCW1vdmRxYQkleG1tMTQsJXhtbTEzCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEzCisJbW92ZHFhCSV4bW0xMywleG1tMTIKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLDk2KCVyYnApCisJbW92ZHFhCSV4bW0xMywxMTIoJXJicCkKKwltb3ZkcWEJJXhtbTE0LDEyOCglcmJwKQorCisxOgorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKzI6CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDEyCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDEyCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW02CisJcHhvcgkleG1tMywleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0NiwxMgorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW02CisJcHhvcgkleG1tMywleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorCisJbGVhcQkxNiglcmRpKSwlcmRpCisJZGVjcQklcmN4CisJamcJMWIKKwlkZWNxCSVyOAorCWpnZQkyYgorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAk0OCglcmJwKSwleG1tNgorCXBhZGRkCTY0KCVyYnApLCV4bW0xMAorCXBhZGRkCTEyOCglcmJwKSwleG1tMTQKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCW1vdmRxdQkwICsgMCglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDAoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAwKCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTcsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tMTAKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcXUJJXhtbTIsMCArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTYsMTYgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW0xMCwzMiArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMCglcmRpKQorCW1vdmRxdQkwICsgNjQoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyA2NCglcnNpKSwleG1tNworCW1vdmRxdQkzMiArIDY0KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDY0KCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW03LCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTUKKwltb3ZkcXUJJXhtbTEsMCArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW01LDE2ICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyA2NCglcmRpKQorCisJbW92cQkkMTI4LCVyY3gKKwlzdWJxCSQxMjgsJXJieAorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKworc2VhbF9zc2VfMTI4X3NlYWxfaGFzaDoKKwljbXBxCSQxNiwlcmN4CisJamIJc2VhbF9zc2VfMTI4X3NlYWwKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJc3VicQkkMTYsJXJjeAorCWxlYXEJMTYoJXJkaSksJXJkaQorCWptcAlzZWFsX3NzZV8xMjhfc2VhbF9oYXNoCisKK3NlYWxfc3NlXzEyOF9zZWFsOgorCWNtcHEJJDE2LCVyYngKKwlqYglzZWFsX3NzZV90YWlsXzE2CisJc3VicQkkMTYsJXJieAorCisJbW92ZHF1CTAoJXJzaSksJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0wCisJbW92ZHF1CSV4bW0wLDAoJXJkaSkKKworCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTEyLCV4bW04CisJbW92ZHFhCSV4bW0xLCV4bW0xMgorCW1vdmRxYQkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tMTMsJXhtbTkKKwlqbXAJc2VhbF9zc2VfMTI4X3NlYWwKKworc2VhbF9zc2VfdGFpbF8xNjoKKwl0ZXN0cQklcmJ4LCVyYngKKwlqeglwcm9jZXNzX2Jsb2Nrc19vZl9leHRyYV9pbgorCisJbW92cQklcmJ4LCVyOAorCW1vdnEJJXJieCwlcmN4CisJbGVhcQktMSglcnNpLCVyYngpLCAlcnNpCisJcHhvcgkleG1tMTUsJXhtbTE1CisxOgorCXBzbGxkcQkkMSwleG1tMTUKKwlwaW5zcmIJJDAsKCVyc2kpLCV4bW0xNQorCWxlYXEJLTEoJXJzaSksJXJzaQorCWRlY3EJJXJjeAorCWpuZQkxYgorCisKKwlweG9yCSV4bW0wLCV4bW0xNQorCisKKwltb3ZxCSVyYngsJXJjeAorCW1vdmRxdQkleG1tMTUsJXhtbTAKKzI6CisJcGV4dHJiCSQwLCV4bW0wLCglcmRpKQorCXBzcmxkcQkkMSwleG1tMAorCWFkZHEJJDEsJXJkaQorCXN1YnEJJDEsJXJjeAorCWpuegkyYgorCisKKworCisKKworCisKKwltb3ZxCTI4OCszMiglcnNwKSwlcjkKKwltb3ZxCTU2KCVyOSksJXIxNAorCW1vdnEJNDgoJXI5KSwlcjEzCisJdGVzdHEJJXIxNCwlcjE0CisJanoJcHJvY2Vzc19wYXJ0aWFsX2Jsb2NrCisKKwltb3ZxCSQxNiwlcjE1CisJc3VicQklcmJ4LCVyMTUKKwljbXBxCSVyMTUsJXIxNAorCisJamdlCWxvYWRfZXh0cmFfaW4KKwltb3ZxCSVyMTQsJXIxNQorCitsb2FkX2V4dHJhX2luOgorCisKKwlsZWFxCS0xKCVyMTMsJXIxNSksICVyc2kKKworCisJYWRkcQklcjE1LCVyMTMKKwlzdWJxCSVyMTUsJXIxNAorCW1vdnEJJXIxMyw0OCglcjkpCisJbW92cQklcjE0LDU2KCVyOSkKKworCisKKwlhZGRxCSVyMTUsJXI4CisKKworCXB4b3IJJXhtbTExLCV4bW0xMQorMzoKKwlwc2xsZHEJJDEsJXhtbTExCisJcGluc3JiCSQwLCglcnNpKSwleG1tMTEKKwlsZWFxCS0xKCVyc2kpLCVyc2kKKwlzdWJxCSQxLCVyMTUKKwlqbnoJM2IKKworCisKKworCW1vdnEJJXJieCwlcjE1CisKKzQ6CisJcHNsbGRxCSQxLCV4bW0xMQorCXN1YnEJJDEsJXIxNQorCWpuegk0YgorCisKKworCisJbGVhcQkuYW5kX21hc2tzKCVyaXApLCVyMTUKKwlzaGxxCSQ0LCVyYngKKwlwYW5kCS0xNiglcjE1LCVyYngpLCAleG1tMTUKKworCisJcG9yCSV4bW0xMSwleG1tMTUKKworCisKKy5ieXRlCTEwMiw3NywxNSwxMjYsMjUzCisJcGV4dHJxCSQxLCV4bW0xNSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworcHJvY2Vzc19ibG9ja3Nfb2ZfZXh0cmFfaW46CisKKwltb3ZxCTI4OCszMiglcnNwKSwlcjkKKwltb3ZxCTQ4KCVyOSksJXJzaQorCW1vdnEJNTYoJXI5KSwlcjgKKwltb3ZxCSVyOCwlcmN4CisJc2hycQkkNCwlcjgKKworNToKKwlqeglwcm9jZXNzX2V4dHJhX2luX3RyYWlsZXIKKwlhZGRxCTAoJXJzaSksJXIxMAorCWFkY3EJOCswKCVyc2kpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcnNpKSwlcnNpCisJc3VicQkkMSwlcjgKKwlqbXAJNWIKKworcHJvY2Vzc19leHRyYV9pbl90cmFpbGVyOgorCWFuZHEJJDE1LCVyY3gKKwltb3ZxCSVyY3gsJXJieAorCWp6CWRvX2xlbmd0aF9ibG9jaworCWxlYXEJLTEoJXJzaSwlcmN4KSwgJXJzaQorCis2OgorCXBzbGxkcQkkMSwleG1tMTUKKwlwaW5zcmIJJDAsKCVyc2kpLCV4bW0xNQorCWxlYXEJLTEoJXJzaSksJXJzaQorCXN1YnEJJDEsJXJjeAorCWpuegk2YgorCitwcm9jZXNzX3BhcnRpYWxfYmxvY2s6CisKKwlsZWFxCS5hbmRfbWFza3MoJXJpcCksJXIxNQorCXNobHEJJDQsJXJieAorCXBhbmQJLTE2KCVyMTUsJXJieCksICV4bW0xNQorLmJ5dGUJMTAyLDc3LDE1LDEyNiwyNTMKKwlwZXh0cnEJJDEsJXhtbTE1LCVyMTQKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCitkb19sZW5ndGhfYmxvY2s6CisJYWRkcQkzMiglcmJwKSwlcjEwCisJYWRjcQk4KzMyKCVyYnApLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisKKwltb3ZxCSVyMTAsJXIxMworCW1vdnEJJXIxMSwlcjE0CisJbW92cQklcjEyLCVyMTUKKwlzdWJxCSQtNSwlcjEwCisJc2JicQkkLTEsJXIxMQorCXNiYnEJJDMsJXIxMgorCWNtb3ZjcQklcjEzLCVyMTAKKwljbW92Y3EJJXIxNCwlcjExCisJY21vdmNxCSVyMTUsJXIxMgorCisJYWRkcQkwKzE2KCVyYnApLCVyMTAKKwlhZGNxCTgrMTYoJXJicCksJXIxMQorCisJYWRkcQkkMjg4ICsgMzIsJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktKDI4OCArIDMyKQorCXBvcHEJJXI5CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CS04CisJbW92cQklcjEwLDAoJXI5KQorCW1vdnEJJXIxMSw4KCVyOSkKKworCXBvcHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorCXBvcHEJJXIxNAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorCXBvcHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorCXBvcHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorCXBvcHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorCXBvcHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktOAorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAkoOCAqIDYpICsgMjg4ICsgMzIKKworc2VhbF9zc2VfMTI4OgorCW1vdmRxdQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHF1CTAoJXI5KSwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tNgorCW1vdmRxdQkxNiglcjkpLCV4bW04CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxdQkzMiglcjkpLCV4bW0xNAorCW1vdmRxYQkleG1tMTQsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiwleG1tMTMKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTMKKwltb3ZkcWEJJXhtbTQsJXhtbTcKKwltb3ZkcWEJJXhtbTgsJXhtbTExCisJbW92ZHFhCSV4bW0xMiwleG1tMTUKKwltb3ZxCSQxMCwlcjEwCisxOgorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCwxMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNywxMgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xNAorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMCwleG1tNgorCW1vdmRxYQkleG1tNiwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xNAorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMCwleG1tNgorCW1vdmRxYQkleG1tNiwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW02CisJcHhvcgkleG1tMywleG1tNgorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0Niw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDQKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0Niw0CisKKwlkZWNxCSVyMTAKKwlqbnoJMWIKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMQorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAkleG1tNywleG1tNAorCXBhZGRkCSV4bW03LCV4bW01CisJcGFkZGQJJXhtbTcsJXhtbTYKKwlwYWRkZAkleG1tMTEsJXhtbTgKKwlwYWRkZAkleG1tMTEsJXhtbTkKKwlwYWRkZAkleG1tMTUsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE1CisJcGFkZGQJJXhtbTE1LCV4bW0xMworCisJcGFuZAkuY2xhbXAoJXJpcCksJXhtbTIKKwltb3ZkcWEJJXhtbTIsMCglcmJwKQorCW1vdmRxYQkleG1tNiwxNiglcmJwKQorCisJbW92cQklcjgsJXI4CisJY2FsbAlwb2x5X2hhc2hfYWRfaW50ZXJuYWwKKwlqbXAJc2VhbF9zc2VfMTI4X3NlYWwKKy5zaXplCWNoYWNoYTIwX3BvbHkxMzA1X3NlYWwsIC4tY2hhY2hhMjBfcG9seTEzMDVfc2VhbAorCisKKy50eXBlCWNoYWNoYTIwX3BvbHkxMzA1X29wZW5fYXZ4MixAZnVuY3Rpb24KKy5hbGlnbgk2NAorY2hhY2hhMjBfcG9seTEzMDVfb3Blbl9hdngyOgorCXZ6ZXJvdXBwZXIKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2YnJvYWRjYXN0aTEyOAkwKCVyOSksJXltbTQKKwl2YnJvYWRjYXN0aTEyOAkxNiglcjkpLCV5bW04CisJdmJyb2FkY2FzdGkxMjgJMzIoJXI5KSwleW1tMTIKKwl2cGFkZGQJLmF2eDJfaW5pdCglcmlwKSwleW1tMTIsJXltbTEyCisJY21wcQkkMTkyLCVyYngKKwlqYmUJb3Blbl9hdngyXzE5MgorCWNtcHEJJDMyMCwlcmJ4CisJamJlCW9wZW5fYXZ4Ml8zMjAKKworCXZtb3ZkcWEJJXltbTQsNjQoJXJicCkKKwl2bW92ZHFhCSV5bW04LDk2KCVyYnApCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisJbW92cQkkMTAsJXIxMAorMToKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisKKwlkZWNxCSVyMTAKKwlqbmUJMWIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCisJdnBhbmQJLmNsYW1wKCVyaXApLCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMywwKCVyYnApCisKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTQKKworCW1vdnEJJXI4LCVyOAorCWNhbGwJcG9seV9oYXNoX2FkX2ludGVybmFsCisJeG9ycQklcmN4LCVyY3gKKworMToKKwlhZGRxCTAoJXJzaSwlcmN4KSwgJXIxMAorCWFkY3EJOCswKCVyc2ksJXJjeCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJYWRkcQkkMTYsJXJjeAorCWNtcHEJJDY0LCVyY3gKKwlqbmUJMWIKKworCXZweG9yCTAoJXJzaSksJXltbTAsJXltbTAKKwl2cHhvcgkzMiglcnNpKSwleW1tNCwleW1tNAorCXZtb3ZkcXUJJXltbTAsMCglcmRpKQorCXZtb3ZkcXUJJXltbTQsMzIoJXJkaSkKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwlzdWJxCSQ2NCwlcmJ4CisxOgorCisJY21wcQkkNTEyLCVyYngKKwlqYgkzZgorCXZtb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMAorCXZtb3ZkcWEJNjQoJXJicCksJXltbTQKKwl2bW92ZHFhCTk2KCVyYnApLCV5bW04CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTQsJXltbTYKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZtb3ZkcWEJJXltbTAsJXltbTMKKwl2bW92ZHFhCSV5bW00LCV5bW03CisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTUKKwl2cGFkZGQJJXltbTE1LCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xNSwyNTYoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKworCXhvcnEJJXJjeCwlcmN4CisyOgorCWFkZHEJMCo4KCVyc2ksJXJjeCksICVyMTAKKwlhZGNxCTgrMCo4KCVyc2ksJXJjeCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCWFkZHEJMio4KCVyc2ksJXJjeCksICVyMTAKKwlhZGNxCTgrMio4KCVyc2ksJXJjeCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCXZwYWxpZ25yCSQ4LCV5bW0xMCwleW1tMTAsJXltbTEwCisJdnBhbGlnbnIJJDEyLCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJYWRkcQk0KjgoJXJzaSwlcmN4KSwgJXIxMAorCWFkY3EJOCs0KjgoJXJzaSwlcmN4KSwgJXIxMQorCWFkY3EJJDEsJXIxMgorCisJbGVhcQk0OCglcmN4KSwlcmN4CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkNCwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCXZwYWxpZ25yCSQ4LCV5bW0xMCwleW1tMTAsJXltbTEwCisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCisJY21wcQkkNjAqOCwlcmN4CisJam5lCTJiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTMsJXltbTMKKwl2cGFkZGQJNjQoJXJicCksJXltbTcsJXltbTcKKwl2cGFkZGQJOTYoJXJicCksJXltbTExLCV5bW0xMQorCXZwYWRkZAkyNTYoJXJicCksJXltbTE1LCV5bW0xNQorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCTY0KCVyYnApLCV5bW02LCV5bW02CisJdnBhZGRkCTk2KCVyYnApLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAk2NCglcmJwKSwleW1tNSwleW1tNQorCXZwYWRkZAk5NiglcmJwKSwleW1tOSwleW1tOQorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisKKwl2bW92ZHFhCSV5bW0wLDEyOCglcmJwKQorCWFkZHEJNjAqOCglcnNpKSwlcjEwCisJYWRjcQk4KzYwKjgoJXJzaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTMsJXltbTcsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0zLCV5bW03LCV5bW03CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTEsJXltbTE1LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTEsJXltbTE1LCV5bW0xMQorCXZweG9yCTArMCglcnNpKSwleW1tMCwleW1tMAorCXZweG9yCTMyKzAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW03LCV5bW03CisJdnB4b3IJOTYrMCglcnNpKSwleW1tMTEsJXltbTExCisJdm1vdmRxdQkleW1tMCwwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW03LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSw5NiswKCVyZGkpCisKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tMAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMiwleW1tNiwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTYKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMCwleW1tMTQsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTEwCisJdnB4b3IJMCsxMjgoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMisxMjgoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgk2NCsxMjgoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgk5NisxMjgoJXJzaSksJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJJXltbTMsMCsxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTYsNjQrMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMTAsOTYrMTI4KCVyZGkpCisJYWRkcQk2MCo4KzE2KCVyc2kpLCVyMTAKKwlhZGNxCTgrNjAqOCsxNiglcnNpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMSwleW1tNSwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEsJXltbTUsJXltbTUKKwl2cGVybTJpMTI4CSQweDAyLCV5bW05LCV5bW0xMywleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW05CisJdnB4b3IJMCsyNTYoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMisyNTYoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCsyNTYoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgk5NisyNTYoJXJzaSksJXltbTksJXltbTkKKwl2bW92ZHF1CSV5bW0zLDArMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tMSwzMisyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDY0KzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTksOTYrMjU2KCVyZGkpCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tNAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTgsJXltbTEyLCV5bW0wCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTgKKwl2cHhvcgkwKzM4NCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKzM4NCglcnNpKSwleW1tMCwleW1tMAorCXZweG9yCTY0KzM4NCglcnNpKSwleW1tNCwleW1tNAorCXZweG9yCTk2KzM4NCglcnNpKSwleW1tOCwleW1tOAorCXZtb3ZkcXUJJXltbTMsMCszODQoJXJkaSkKKwl2bW92ZHF1CSV5bW0wLDMyKzM4NCglcmRpKQorCXZtb3ZkcXUJJXltbTQsNjQrMzg0KCVyZGkpCisJdm1vdmRxdQkleW1tOCw5NiszODQoJXJkaSkKKworCWxlYXEJNTEyKCVyc2kpLCVyc2kKKwlsZWFxCTUxMiglcmRpKSwlcmRpCisJc3VicQkkNTEyLCVyYngKKwlqbXAJMWIKKzM6CisJdGVzdHEJJXJieCwlcmJ4CisJdnplcm91cHBlcgorCWplCW9wZW5fc3NlX2ZpbmFsaXplCiszOgorCWNtcHEJJDEyOCwlcmJ4CisJamEJM2YKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2bW92ZHFhCTY0KCVyYnApLCV5bW00CisJdm1vdmRxYQk5NiglcmJwKSwleW1tOAorCXZtb3ZkcWEJLmF2eDJfaW5jKCVyaXApLCV5bW0xMgorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTEyLDE2MCglcmJwKQorCisJeG9ycQklcjgsJXI4CisJbW92cQklcmJ4LCVyY3gKKwlhbmRxCSQtMTYsJXJjeAorCXRlc3RxCSVyY3gsJXJjeAorCWplCTJmCisxOgorCWFkZHEJMCo4KCVyc2ksJXI4KSwgJXIxMAorCWFkY3EJOCswKjgoJXJzaSwlcjgpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworMjoKKwlhZGRxCSQxNiwlcjgKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisKKwljbXBxCSVyY3gsJXI4CisJamIJMWIKKwljbXBxCSQxNjAsJXI4CisJam5lCTJiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTgsJXltbTEyLCV5bW00CisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMywleW1tOAorCisJam1wCW9wZW5fYXZ4Ml90YWlsX2xvb3AKKzM6CisJY21wcQkkMjU2LCVyYngKKwlqYQkzZgorCXZtb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMAorCXZtb3ZkcWEJNjQoJXJicCksJXltbTQKKwl2bW92ZHFhCTk2KCVyYnApLCV5bW04CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyCisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisJdm1vdmRxYQkleW1tMTMsMTkyKCVyYnApCisKKwltb3ZxCSVyYngsMTI4KCVyYnApCisJbW92cQklcmJ4LCVyY3gKKwlzdWJxCSQxMjgsJXJjeAorCXNocnEJJDQsJXJjeAorCW1vdnEJJDEwLCVyOAorCWNtcHEJJDEwLCVyY3gKKwljbW92Z3EJJXI4LCVyY3gKKwltb3ZxCSVyc2ksJXJieAorCXhvcnEJJXI4LCVyOAorMToKKwlhZGRxCTAoJXJieCksJXIxMAorCWFkY3EJOCswKCVyYngpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXJieCksJXJieAorMjoKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNSwleW1tMworCXZwc2xsZAkkMTIsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNsbGQJJDcsJXltbTUsJXltbTMKKwl2cHNybGQJJDI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFsaWducgkkMTIsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQ0LCV5bW01LCV5bW01LCV5bW01CisKKwlpbmNxCSVyOAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCisJY21wcQklcmN4LCVyOAorCWpiCTFiCisJY21wcQkkMTAsJXI4CisJam5lCTJiCisJbW92cQklcmJ4LCVyOAorCXN1YnEJJXJzaSwlcmJ4CisJbW92cQklcmJ4LCVyY3gKKwltb3ZxCTEyOCglcmJwKSwlcmJ4CisxOgorCWFkZHEJJDE2LCVyY3gKKwljbXBxCSVyYngsJXJjeAorCWpnCTFmCisJYWRkcQkwKCVyOCksJXIxMAorCWFkY3EJOCswKCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcjgpLCVyOAorCWptcAkxYgorMToKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAk2NCglcmJwKSwleW1tNSwleW1tNQorCXZwYWRkZAk5NiglcmJwKSwleW1tOSwleW1tOQorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMSwleW1tNSwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEsJXltbTUsJXltbTUKKwl2cGVybTJpMTI4CSQweDAyLCV5bW05LCV5bW0xMywleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW05CisJdnB4b3IJMCswKCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTY0KzAoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgk5NiswKCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzAoJXJkaSkKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTgsJXltbTEyLCV5bW00CisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMywleW1tOAorCisJbGVhcQkxMjgoJXJzaSksJXJzaQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwlzdWJxCSQxMjgsJXJieAorCWptcAlvcGVuX2F2eDJfdGFpbF9sb29wCiszOgorCWNtcHEJJDM4NCwlcmJ4CisJamEJM2YKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2bW92ZHFhCTY0KCVyYnApLCV5bW00CisJdm1vdmRxYQk5NiglcmJwKSwleW1tOAorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW02CisJdm1vdmRxYQkleW1tOCwleW1tMTAKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKworCW1vdnEJJXJieCwxMjgoJXJicCkKKwltb3ZxCSVyYngsJXJjeAorCXN1YnEJJDI1NiwlcmN4CisJc2hycQkkNCwlcmN4CisJYWRkcQkkNiwlcmN4CisJbW92cQkkMTAsJXI4CisJY21wcQkkMTAsJXJjeAorCWNtb3ZncQklcjgsJXJjeAorCW1vdnEJJXJzaSwlcmJ4CisJeG9ycQklcjgsJXI4CisxOgorCWFkZHEJMCglcmJ4KSwlcjEwCisJYWRjcQk4KzAoJXJieCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmJ4KSwlcmJ4CisyOgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNiwleW1tMworCXZwc2xsZAkkMTIsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNsbGQJJDcsJXltbTYsJXltbTMKKwl2cHNybGQJJDI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCWFkZHEJMCglcmJ4KSwlcjEwCisJYWRjcQk4KzAoJXJieCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyYngpLCVyYngKKwlpbmNxCSVyOAorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNiwleW1tMworCXZwc2xsZAkkMTIsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNsbGQJJDcsJXltbTYsJXltbTMKKwl2cHNybGQJJDI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQ4LCV5bW0xMCwleW1tMTAsJXltbTEwCisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCisJY21wcQklcmN4LCVyOAorCWpiCTFiCisJY21wcQkkMTAsJXI4CisJam5lCTJiCisJbW92cQklcmJ4LCVyOAorCXN1YnEJJXJzaSwlcmJ4CisJbW92cQklcmJ4LCVyY3gKKwltb3ZxCTEyOCglcmJwKSwlcmJ4CisxOgorCWFkZHEJJDE2LCVyY3gKKwljbXBxCSVyYngsJXJjeAorCWpnCTFmCisJYWRkcQkwKCVyOCksJXIxMAorCWFkY3EJOCswKCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcjgpLCVyOAorCWptcAkxYgorMToKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMiwleW1tMgorCXZwYWRkZAk2NCglcmJwKSwleW1tNiwleW1tNgorCXZwYWRkZAk5NiglcmJwKSwleW1tMTAsJXltbTEwCisJdnBhZGRkCTIyNCglcmJwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTEsJXltbTEKKwl2cGFkZGQJNjQoJXJicCksJXltbTUsJXltbTUKKwl2cGFkZGQJOTYoJXJicCksJXltbTksJXltbTkKKwl2cGFkZGQJMTkyKCVyYnApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0yLCV5bW02LCV5bW02CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTAsJXltbTE0LCV5bW0yCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTAsJXltbTE0LCV5bW0xMAorCXZweG9yCTArMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKzAoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJOTYrMCglcnNpKSwleW1tMTAsJXltbTEwCisJdm1vdmRxdQkleW1tMywwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW02LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCw5NiswKCVyZGkpCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMSwleW1tNSwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEsJXltbTUsJXltbTUKKwl2cGVybTJpMTI4CSQweDAyLCV5bW05LCV5bW0xMywleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW05CisJdnB4b3IJMCsxMjgoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMisxMjgoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCsxMjgoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgk5NisxMjgoJXJzaSksJXltbTksJXltbTkKKwl2bW92ZHF1CSV5bW0zLDArMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMSwzMisxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDY0KzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTksOTYrMTI4KCVyZGkpCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTMsJXltbTgKKworCWxlYXEJMjU2KCVyc2kpLCVyc2kKKwlsZWFxCTI1NiglcmRpKSwlcmRpCisJc3VicQkkMjU2LCVyYngKKwlqbXAJb3Blbl9hdngyX3RhaWxfbG9vcAorMzoKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2bW92ZHFhCTY0KCVyYnApLCV5bW00CisJdm1vdmRxYQk5NiglcmJwKSwleW1tOAorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW02CisJdm1vdmRxYQkleW1tOCwleW1tMTAKKwl2bW92ZHFhCSV5bW0wLCV5bW0zCisJdm1vdmRxYQkleW1tNCwleW1tNworCXZtb3ZkcWEJJXltbTgsJXltbTExCisJdm1vdmRxYQkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyCisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTE1CisJdnBhZGRkCSV5bW0xNSwleW1tMTIsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTIsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMTUsMjU2KCVyYnApCisJdm1vdmRxYQkleW1tMTQsMjI0KCVyYnApCisJdm1vdmRxYQkleW1tMTMsMTkyKCVyYnApCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisKKwl4b3JxCSVyY3gsJXJjeAorCW1vdnEJJXJzaSwlcjgKKzE6CisJYWRkcQkwKCVyOCksJXIxMAorCWFkY3EJOCswKCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyOCksJXI4CisyOgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJYWRkcQkwKCVyOCksJXIxMAorCWFkY3EJOCswKCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJYWRkcQkxNiglcjgpLCVyMTAKKwlhZGNxCTgrMTYoJXI4KSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbXVseHEJJXIxMCwlcjEzLCVyMTQKKwltdWx4cQklcjExLCVyYXgsJXJkeAorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmR4CisJbXVseHEJJXIxMCwlcjEwLCVyYXgKKwlhZGRxCSVyMTAsJXIxNAorCW11bHhxCSVyMTEsJXIxMSwlcjkKKwlhZGNxCSVyMTEsJXIxNQorCWFkY3EJJDAsJXI5CisJaW11bHEJJXIxMiwlcmR4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyOCksJXI4CisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyNSwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjUsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDI1LCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQ0LCV5bW0xNSwleW1tMTUsJXltbTE1CisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisKKwlpbmNxCSVyY3gKKwljbXBxCSQ0LCVyY3gKKwlqbAkxYgorCWNtcHEJJDEwLCVyY3gKKwlqbmUJMmIKKwltb3ZxCSVyYngsJXJjeAorCXN1YnEJJDM4NCwlcmN4CisJYW5kcQkkLTE2LCVyY3gKKzE6CisJdGVzdHEJJXJjeCwlcmN4CisJamUJMWYKKwlhZGRxCTAoJXI4KSwlcjEwCisJYWRjcQk4KzAoJXI4KSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbXVseHEJJXIxMCwlcjEzLCVyMTQKKwltdWx4cQklcjExLCVyYXgsJXJkeAorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmR4CisJbXVseHEJJXIxMCwlcjEwLCVyYXgKKwlhZGRxCSVyMTAsJXIxNAorCW11bHhxCSVyMTEsJXIxMSwlcjkKKwlhZGNxCSVyMTEsJXIxNQorCWFkY3EJJDAsJXI5CisJaW11bHEJJXIxMiwlcmR4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyOCksJXI4CisJc3VicQkkMTYsJXJjeAorCWptcAkxYgorMToKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMywleW1tMworCXZwYWRkZAk2NCglcmJwKSwleW1tNywleW1tNworCXZwYWRkZAk5NiglcmJwKSwleW1tMTEsJXltbTExCisJdnBhZGRkCTI1NiglcmJwKSwleW1tMTUsJXltbTE1CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTIsJXltbTIKKwl2cGFkZGQJNjQoJXJicCksJXltbTYsJXltbTYKKwl2cGFkZGQJOTYoJXJicCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQoJXJicCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0xLCV5bW0xCisJdnBhZGRkCTY0KCVyYnApLCV5bW01LCV5bW01CisJdnBhZGRkCTk2KCVyYnApLCV5bW05LCV5bW05CisJdnBhZGRkCTE5MiglcmJwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKworCXZtb3ZkcWEJJXltbTAsMTI4KCVyYnApCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMywleW1tNywleW1tMAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTMsJXltbTcsJXltbTcKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMSwleW1tMTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMSwleW1tMTUsJXltbTExCisJdnB4b3IJMCswKCVyc2kpLCV5bW0wLCV5bW0wCisJdnB4b3IJMzIrMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTY0KzAoJXJzaSksJXltbTcsJXltbTcKKwl2cHhvcgk5NiswKCVyc2kpLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CSV5bW0wLDArMCglcmRpKQorCXZtb3ZkcXUJJXltbTMsMzIrMCglcmRpKQorCXZtb3ZkcXUJJXltbTcsNjQrMCglcmRpKQorCXZtb3ZkcXUJJXltbTExLDk2KzAoJXJkaSkKKworCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW0wCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMiwleW1tNiwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTYKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMCwleW1tMTQsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTEwCisJdnB4b3IJMCsxMjgoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMisxMjgoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgk2NCsxMjgoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgk5NisxMjgoJXJzaSksJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJJXltbTMsMCsxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTYsNjQrMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMTAsOTYrMTI4KCVyZGkpCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMSwleW1tNSwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEsJXltbTUsJXltbTUKKwl2cGVybTJpMTI4CSQweDAyLCV5bW05LCV5bW0xMywleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW05CisJdnB4b3IJMCsyNTYoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMisyNTYoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCsyNTYoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgk5NisyNTYoJXJzaSksJXltbTksJXltbTkKKwl2bW92ZHF1CSV5bW0zLDArMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tMSwzMisyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDY0KzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTksOTYrMjU2KCVyZGkpCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTMsJXltbTgKKworCWxlYXEJMzg0KCVyc2kpLCVyc2kKKwlsZWFxCTM4NCglcmRpKSwlcmRpCisJc3VicQkkMzg0LCVyYngKK29wZW5fYXZ4Ml90YWlsX2xvb3A6CisJY21wcQkkMzIsJXJieAorCWpiCW9wZW5fYXZ4Ml90YWlsCisJc3VicQkkMzIsJXJieAorCXZweG9yCSglcnNpKSwleW1tMCwleW1tMAorCXZtb3ZkcXUJJXltbTAsKCVyZGkpCisJbGVhcQkzMiglcnNpKSwlcnNpCisJbGVhcQkzMiglcmRpKSwlcmRpCisJdm1vdmRxYQkleW1tNCwleW1tMAorCXZtb3ZkcWEJJXltbTgsJXltbTQKKwl2bW92ZHFhCSV5bW0xMiwleW1tOAorCWptcAlvcGVuX2F2eDJfdGFpbF9sb29wCitvcGVuX2F2eDJfdGFpbDoKKwljbXBxCSQxNiwlcmJ4CisJdm1vdmRxYQkleG1tMCwleG1tMQorCWpiCTFmCisJc3VicQkkMTYsJXJieAorCisJdnB4b3IJKCVyc2kpLCV4bW0wLCV4bW0xCisJdm1vdmRxdQkleG1tMSwoJXJkaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwl2cGVybTJpMTI4CSQweDExLCV5bW0wLCV5bW0wLCV5bW0wCisJdm1vdmRxYQkleG1tMCwleG1tMQorMToKKwl2emVyb3VwcGVyCisJam1wCW9wZW5fc3NlX3RhaWxfMTYKKworb3Blbl9hdngyXzE5MjoKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW00LCV5bW02CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTIsJXltbTEzCisJdm1vdmRxYQkleW1tMTIsJXltbTExCisJdm1vdmRxYQkleW1tMTMsJXltbTE1CisJbW92cQkkMTAsJXIxMAorMToKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNSwleW1tMworCXZwc2xsZAkkMTIsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNsbGQJJDcsJXltbTUsJXltbTMKKwl2cHNybGQJJDI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFsaWducgkkMTIsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQ0LCV5bW01LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTUsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzbGxkCSQ3LCV5bW01LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCisJZGVjcQklcjEwCisJam5lCTFiCisJdnBhZGRkCSV5bW0yLCV5bW0wLCV5bW0wCisJdnBhZGRkCSV5bW0yLCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW02LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW02LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW0xMCwleW1tOCwleW1tOAorCXZwYWRkZAkleW1tMTAsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTExLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTE1LCV5bW0xMywleW1tMTMKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0zCisKKwl2cGFuZAkuY2xhbXAoJXJpcCksJXltbTMsJXltbTMKKwl2bW92ZHFhCSV5bW0zLDAoJXJicCkKKworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTgKKwl2cGVybTJpMTI4CSQweDAyLCV5bW05LCV5bW0xMywleW1tMTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW0xCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOSwleW1tMTMsJXltbTUKK29wZW5fYXZ4Ml9zaG9ydDoKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorb3Blbl9hdngyX2hhc2hfYW5kX3hvcl9sb29wOgorCWNtcHEJJDMyLCVyYngKKwlqYglvcGVuX2F2eDJfc2hvcnRfdGFpbF8zMgorCXN1YnEJJDMyLCVyYngKKwlhZGRxCTAoJXJzaSksJXIxMAorCWFkY3EJOCswKCVyc2kpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJMTYoJXJzaSksJXIxMAorCWFkY3EJOCsxNiglcnNpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCisJdnB4b3IJKCVyc2kpLCV5bW0wLCV5bW0wCisJdm1vdmRxdQkleW1tMCwoJXJkaSkKKwlsZWFxCTMyKCVyc2kpLCVyc2kKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKworCXZtb3ZkcWEJJXltbTQsJXltbTAKKwl2bW92ZHFhCSV5bW04LCV5bW00CisJdm1vdmRxYQkleW1tMTIsJXltbTgKKwl2bW92ZHFhCSV5bW0xLCV5bW0xMgorCXZtb3ZkcWEJJXltbTUsJXltbTEKKwl2bW92ZHFhCSV5bW05LCV5bW01CisJdm1vdmRxYQkleW1tMTMsJXltbTkKKwl2bW92ZHFhCSV5bW0yLCV5bW0xMworCXZtb3ZkcWEJJXltbTYsJXltbTIKKwlqbXAJb3Blbl9hdngyX2hhc2hfYW5kX3hvcl9sb29wCitvcGVuX2F2eDJfc2hvcnRfdGFpbF8zMjoKKwljbXBxCSQxNiwlcmJ4CisJdm1vdmRxYQkleG1tMCwleG1tMQorCWpiCTFmCisJc3VicQkkMTYsJXJieAorCWFkZHEJMCglcnNpKSwlcjEwCisJYWRjcQk4KzAoJXJzaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwl2cHhvcgkoJXJzaSksJXhtbTAsJXhtbTMKKwl2bW92ZHF1CSV4bW0zLCglcmRpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWxlYXEJMTYoJXJkaSksJXJkaQorCXZleHRyYWN0aTEyOAkkMSwleW1tMCwleG1tMQorMToKKwl2emVyb3VwcGVyCisJam1wCW9wZW5fc3NlX3RhaWxfMTYKKworb3Blbl9hdngyXzMyMDoKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW00LCV5bW02CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTIsJXltbTEzCisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTMsJXltbTE0CisJdm1vdmRxYQkleW1tNCwleW1tNworCXZtb3ZkcWEJJXltbTgsJXltbTExCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisJdm1vdmRxYQkleW1tMTMsMTkyKCVyYnApCisJdm1vdmRxYQkleW1tMTQsMjI0KCVyYnApCisJbW92cQkkMTAsJXIxMAorMToKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNSwleW1tMworCXZwc2xsZAkkMTIsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNsbGQJJDcsJXltbTUsJXltbTMKKwl2cHNybGQJJDI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFsaWducgkkMTIsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQ0LCV5bW01LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNybGQJJDIwLCV5bW02LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc2xsZAkkNywleW1tNiwleW1tMworCXZwc3JsZAkkMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWxpZ25yCSQxMiwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQ4LCV5bW0xMCwleW1tMTAsJXltbTEwCisJdnBhbGlnbnIJJDQsJXltbTYsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNSwleW1tMworCXZwc2xsZAkkMTIsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNsbGQJJDcsJXltbTUsJXltbTMKKwl2cHNybGQJJDI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFsaWducgkkNCwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW01LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNybGQJJDIwLCV5bW02LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc2xsZAkkNywleW1tNiwleW1tMworCXZwc3JsZAkkMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWxpZ25yCSQ0LCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTYsJXltbTYsJXltbTYKKworCWRlY3EJJXIxMAorCWpuZQkxYgorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTEsJXltbTEKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNywleW1tNiwleW1tNgorCXZwYWRkZAkleW1tMTEsJXltbTgsJXltbTgKKwl2cGFkZGQJJXltbTExLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMSwleW1tMTAsJXltbTEwCisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCTE5MiglcmJwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCTIyNCglcmJwKSwleW1tMTQsJXltbTE0CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCisJdnBhbmQJLmNsYW1wKCVyaXApLCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMywwKCVyYnApCisKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xLCV5bW01LCV5bW04CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMSwleW1tNSwleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMiwleW1tNiwleW1tOQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEwLCV5bW0xNCwleW1tMTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0yLCV5bW02LCV5bW0yCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTAsJXltbTE0LCV5bW02CisJam1wCW9wZW5fYXZ4Ml9zaG9ydAorLnNpemUJY2hhY2hhMjBfcG9seTEzMDVfb3Blbl9hdngyLCAuLWNoYWNoYTIwX3BvbHkxMzA1X29wZW5fYXZ4MgorCisKKy50eXBlCWNoYWNoYTIwX3BvbHkxMzA1X3NlYWxfYXZ4MixAZnVuY3Rpb24KKy5hbGlnbgk2NAorY2hhY2hhMjBfcG9seTEzMDVfc2VhbF9hdngyOgorCXZ6ZXJvdXBwZXIKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2YnJvYWRjYXN0aTEyOAkwKCVyOSksJXltbTQKKwl2YnJvYWRjYXN0aTEyOAkxNiglcjkpLCV5bW04CisJdmJyb2FkY2FzdGkxMjgJMzIoJXI5KSwleW1tMTIKKwl2cGFkZGQJLmF2eDJfaW5pdCglcmlwKSwleW1tMTIsJXltbTEyCisJY21wcQkkMTkyLCVyYngKKwlqYmUJc2VhbF9hdngyXzE5MgorCWNtcHEJJDMyMCwlcmJ4CisJamJlCXNlYWxfYXZ4Ml8zMjAKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTAsJXltbTMKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTQsJXltbTcKKwl2bW92ZHFhCSV5bW00LDY0KCVyYnApCisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCSV5bW04LDk2KCVyYnApCisJdm1vdmRxYQkleW1tMTIsJXltbTE1CisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTUsJXltbTE0CisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTQsJXltbTEzCisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTMsJXltbTEyCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisJdm1vdmRxYQkleW1tMTMsMTkyKCVyYnApCisJdm1vdmRxYQkleW1tMTQsMjI0KCVyYnApCisJdm1vdmRxYQkleW1tMTUsMjU2KCVyYnApCisJbW92cQkkMTAsJXIxMAorMToKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyNSwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjUsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDI1LCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQ0LCV5bW0xNSwleW1tMTUsJXltbTE1CisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisKKwlkZWNxCSVyMTAKKwlqbnoJMWIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMywleW1tMworCXZwYWRkZAk2NCglcmJwKSwleW1tNywleW1tNworCXZwYWRkZAk5NiglcmJwKSwleW1tMTEsJXltbTExCisJdnBhZGRkCTI1NiglcmJwKSwleW1tMTUsJXltbTE1CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTIsJXltbTIKKwl2cGFkZGQJNjQoJXJicCksJXltbTYsJXltbTYKKwl2cGFkZGQJOTYoJXJicCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQoJXJicCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0xLCV5bW0xCisJdnBhZGRkCTY0KCVyYnApLCV5bW01LCV5bW01CisJdnBhZGRkCTk2KCVyYnApLCV5bW05LCV5bW05CisJdnBhZGRkCTE5MiglcmJwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTExLCV5bW0xNSwleW1tMTEKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0zLCV5bW03LCV5bW0xNQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTMsJXltbTcsJXltbTMKKwl2cGFuZAkuY2xhbXAoJXJpcCksJXltbTE1LCV5bW0xNQorCXZtb3ZkcWEJJXltbTE1LDAoJXJicCkKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorCisJdnB4b3IJMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKCVyc2kpLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CSV5bW0zLDAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSwzMiglcmRpKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTE1CisJdnBlcm0yaTEyOAkkMHgxMywleW1tMiwleW1tNiwleW1tNgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEwLCV5bW0xNCwleW1tMgorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEwLCV5bW0xNCwleW1tMTAKKwl2cHhvcgkwKzY0KCVyc2kpLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkzMis2NCglcnNpKSwleW1tMiwleW1tMgorCXZweG9yCTY0KzY0KCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJOTYrNjQoJXJzaSksJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJJXltbTE1LDArNjQoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKzY0KCVyZGkpCisJdm1vdmRxdQkleW1tNiw2NCs2NCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzY0KCVyZGkpCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMSwleW1tNSwleW1tMTUKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMTkyKCVyc2kpLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkzMisxOTIoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCsxOTIoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgk5NisxOTIoJXJzaSksJXltbTksJXltbTkKKwl2bW92ZHF1CSV5bW0xNSwwKzE5MiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMTkyKCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsxOTIoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzE5MiglcmRpKQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTE1CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTgsJXltbTEyLCV5bW00CisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMTUsJXltbTgKKworCWxlYXEJMzIwKCVyc2kpLCVyc2kKKwlzdWJxCSQzMjAsJXJieAorCW1vdnEJJDMyMCwlcmN4CisJY21wcQkkMTI4LCVyYngKKwlqYmUJc2VhbF9hdngyX2hhc2gKKwl2cHhvcgkwKCVyc2kpLCV5bW0wLCV5bW0wCisJdnB4b3IJMzIoJXJzaSksJXltbTQsJXltbTQKKwl2cHhvcgk2NCglcnNpKSwleW1tOCwleW1tOAorCXZweG9yCTk2KCVyc2kpLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CSV5bW0wLDMyMCglcmRpKQorCXZtb3ZkcXUJJXltbTQsMzUyKCVyZGkpCisJdm1vdmRxdQkleW1tOCwzODQoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiw0MTYoJXJkaSkKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJc3VicQkkMTI4LCVyYngKKwltb3ZxCSQ4LCVyY3gKKwltb3ZxCSQyLCVyOAorCWNtcHEJJDEyOCwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzEyOAorCWNtcHEJJDI1NiwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzI1NgorCWNtcHEJJDM4NCwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzM4NAorCWNtcHEJJDUxMiwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzUxMgorCXZtb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMAorCXZtb3ZkcWEJNjQoJXJicCksJXltbTQKKwl2bW92ZHFhCTk2KCVyYnApLCV5bW04CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTQsJXltbTYKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZtb3ZkcWEJJXltbTAsJXltbTMKKwl2bW92ZHFhCSV5bW00LCV5bW03CisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTUKKwl2cGFkZGQJJXltbTE1LCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xNSwyNTYoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyNSwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjUsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDI1LCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQ0LCV5bW0xNSwleW1tMTUsJXltbTE1CisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2bW92ZHFhCS5yb2wxNiglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyMCwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjAsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDIwLCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJLnJvbDgoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKworCXN1YnEJJDE2LCVyZGkKKwltb3ZxCSQ5LCVyY3gKKwlqbXAJNGYKKzE6CisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW0wLCV5bW0yCisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdm1vdmRxYQkleW1tMCwleW1tMworCXZtb3ZkcWEJJXltbTQsJXltbTcKKwl2bW92ZHFhCSV5bW04LCV5bW0xMQorCXZtb3ZkcWEJLmF2eDJfaW5jKCVyaXApLCV5bW0xMgorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xNQorCXZwYWRkZAkleW1tMTUsJXltbTEyLCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEyLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTE1LDI1NiglcmJwKQorCXZtb3ZkcWEJJXltbTE0LDIyNCglcmJwKQorCXZtb3ZkcWEJJXltbTEzLDE5MiglcmJwKQorCXZtb3ZkcWEJJXltbTEyLDE2MCglcmJwKQorCisJbW92cQkkMTAsJXJjeAorMjoKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCis0OgorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCWFkZHEJMTYoJXJkaSksJXIxMAorCWFkY3EJOCsxNiglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJbW92cQkwKzAoJXJicCksJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbXVseHEJJXIxMCwlcjEzLCVyMTQKKwltdWx4cQklcjExLCVyYXgsJXJkeAorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjUsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDI1LCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyNSwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjUsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkMTIsJXltbTE1LCV5bW0xNSwleW1tMTUKKwl2cGFsaWducgkkNCwleW1tNiwleW1tNiwleW1tNgorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQ0LCV5bW01LCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2bW92ZHFhCS5yb2wxNiglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyMCwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCWFkZHEJMzIoJXJkaSksJXIxMAorCWFkY3EJOCszMiglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisKKwlsZWFxCTQ4KCVyZGkpLCVyZGkKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNywleW1tNworCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyNSwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjUsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDI1LCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQ0LCV5bW0xNSwleW1tMTUsJXltbTE1CisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisKKwlkZWNxCSVyY3gKKwlqbmUJMmIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMywleW1tMworCXZwYWRkZAk2NCglcmJwKSwleW1tNywleW1tNworCXZwYWRkZAk5NiglcmJwKSwleW1tMTEsJXltbTExCisJdnBhZGRkCTI1NiglcmJwKSwleW1tMTUsJXltbTE1CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTIsJXltbTIKKwl2cGFkZGQJNjQoJXJicCksJXltbTYsJXltbTYKKwl2cGFkZGQJOTYoJXJicCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQoJXJicCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0xLCV5bW0xCisJdnBhZGRkCTY0KCVyYnApLCV5bW01LCV5bW01CisJdnBhZGRkCTk2KCVyYnApLCV5bW05LCV5bW05CisJdnBhZGRkCTE5MiglcmJwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKworCWxlYXEJMzIoJXJkaSksJXJkaQorCXZtb3ZkcWEJJXltbTAsMTI4KCVyYnApCisJYWRkcQktMzIoJXJkaSksJXIxMAorCWFkY3EJOCstMzIoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTMsJXltbTcsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0zLCV5bW03LCV5bW03CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTEsJXltbTE1LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTEsJXltbTE1LCV5bW0xMQorCXZweG9yCTArMCglcnNpKSwleW1tMCwleW1tMAorCXZweG9yCTMyKzAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW03LCV5bW03CisJdnB4b3IJOTYrMCglcnNpKSwleW1tMTEsJXltbTExCisJdm1vdmRxdQkleW1tMCwwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW03LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSw5NiswKCVyZGkpCisKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tMAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMiwleW1tNiwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTYKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMCwleW1tMTQsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTEwCisJdnB4b3IJMCsxMjgoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMisxMjgoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgk2NCsxMjgoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgk5NisxMjgoJXJzaSksJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJJXltbTMsMCsxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTYsNjQrMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMTAsOTYrMTI4KCVyZGkpCisJYWRkcQktMTYoJXJkaSksJXIxMAorCWFkY3EJOCstMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMjU2KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMjU2KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJNjQrMjU2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMjU2KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzI1NiglcmRpKQorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tMAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW04CisJdnB4b3IJMCszODQoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMiszODQoJXJzaSksJXltbTAsJXltbTAKKwl2cHhvcgk2NCszODQoJXJzaSksJXltbTQsJXltbTQKKwl2cHhvcgk5NiszODQoJXJzaSksJXltbTgsJXltbTgKKwl2bW92ZHF1CSV5bW0zLDArMzg0KCVyZGkpCisJdm1vdmRxdQkleW1tMCwzMiszODQoJXJkaSkKKwl2bW92ZHF1CSV5bW00LDY0KzM4NCglcmRpKQorCXZtb3ZkcXUJJXltbTgsOTYrMzg0KCVyZGkpCisKKwlsZWFxCTUxMiglcnNpKSwlcnNpCisJc3VicQkkNTEyLCVyYngKKwljbXBxCSQ1MTIsJXJieAorCWpnCTFiCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwltb3ZxCSQxMCwlcmN4CisJeG9ycQklcjgsJXI4CisJY21wcQkkMTI4LCVyYngKKwlqYQkzZgorCitzZWFsX2F2eDJfdGFpbF8xMjg6CisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCWFkZHEJMTYoJXJkaSksJXIxMAorCWFkY3EJOCsxNiglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMzIoJXJkaSksJXJkaQorCWRlY3EJJXJjeAorCWpnCTFiCisJZGVjcQklcjgKKwlqZ2UJMmIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTMKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0zLCV5bW04CisKKwlqbXAJc2VhbF9hdngyX3Nob3J0X2xvb3AKKzM6CisJY21wcQkkMjU2LCVyYngKKwlqYQkzZgorCitzZWFsX2F2eDJfdGFpbF8yNTY6CisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkxYgorCWRlY3EJJXI4CisJamdlCTJiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTEsJXltbTEKKwl2cGFkZGQJNjQoJXJicCksJXltbTUsJXltbTUKKwl2cGFkZGQJOTYoJXJicCksJXltbTksJXltbTkKKwl2cGFkZGQJMTkyKCVyYnApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKzAoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMCglcnNpKSwleW1tOSwleW1tOQorCXZtb3ZkcXUJJXltbTMsMCswKCVyZGkpCisJdm1vdmRxdQkleW1tMSwzMiswKCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCswKCVyZGkpCisJdm1vdmRxdQkleW1tOSw5NiswKCVyZGkpCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTMsJXltbTgKKworCW1vdnEJJDEyOCwlcmN4CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXN1YnEJJDEyOCwlcmJ4CisJam1wCXNlYWxfYXZ4Ml9oYXNoCiszOgorCWNtcHEJJDM4NCwlcmJ4CisJamEJc2VhbF9hdngyX3RhaWxfNTEyCisKK3NlYWxfYXZ4Ml90YWlsXzM4NDoKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2bW92ZHFhCTY0KCVyYnApLCV5bW00CisJdm1vdmRxYQk5NiglcmJwKSwleW1tOAorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW02CisJdm1vdmRxYQkleW1tOCwleW1tMTAKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNiwleW1tMworCXZwc2xsZAkkMTIsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNsbGQJJDcsJXltbTYsJXltbTMKKwl2cHNybGQJJDI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCisJbGVhcQkzMiglcmRpKSwlcmRpCisJZGVjcQklcmN4CisJamcJMWIKKwlkZWNxCSVyOAorCWpnZQkyYgorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCTY0KCVyYnApLCV5bW02LCV5bW02CisJdnBhZGRkCTk2KCVyYnApLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAk2NCglcmJwKSwleW1tNSwleW1tNQorCXZwYWRkZAk5NiglcmJwKSwleW1tOSwleW1tOQorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMiwleW1tNiwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTYKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMCwleW1tMTQsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTEwCisJdnB4b3IJMCswKCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMCglcnNpKSwleW1tMiwleW1tMgorCXZweG9yCTY0KzAoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgk5NiswKCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CSV5bW0zLDArMCglcmRpKQorCXZtb3ZkcXUJJXltbTIsMzIrMCglcmRpKQorCXZtb3ZkcXUJJXltbTYsNjQrMCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzAoJXJkaSkKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xLCV5bW01LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMSwleW1tNSwleW1tNQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTksJXltbTEzLCV5bW0xCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOSwleW1tMTMsJXltbTkKKwl2cHhvcgkwKzEyOCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKzEyOCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTY0KzEyOCglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTk2KzEyOCglcnNpKSwleW1tOSwleW1tOQorCXZtb3ZkcXUJJXltbTMsMCsxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xLDMyKzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTUsNjQrMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tOSw5NisxMjgoJXJkaSkKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTgsJXltbTEyLCV5bW00CisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMywleW1tOAorCisJbW92cQkkMjU2LCVyY3gKKwlsZWFxCTI1NiglcnNpKSwlcnNpCisJc3VicQkkMjU2LCVyYngKKwlqbXAJc2VhbF9hdngyX2hhc2gKKworc2VhbF9hdngyX3RhaWxfNTEyOgorCXZtb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMAorCXZtb3ZkcWEJNjQoJXJicCksJXltbTQKKwl2bW92ZHFhCTk2KCVyYnApLCV5bW04CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTQsJXltbTYKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZtb3ZkcWEJJXltbTAsJXltbTMKKwl2bW92ZHFhCSV5bW00LCV5bW03CisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTUKKwl2cGFkZGQJJXltbTE1LCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xNSwyNTYoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXJkaSksJXJkaQorMjoKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZtb3ZkcWEJLnJvbDgoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkNCwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQ0LCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDEyLCV5bW01LCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKworCisKKworCisKKworCisKKworCisKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkxYgorCWRlY3EJJXI4CisJamdlCTJiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTMsJXltbTMKKwl2cGFkZGQJNjQoJXJicCksJXltbTcsJXltbTcKKwl2cGFkZGQJOTYoJXJicCksJXltbTExLCV5bW0xMQorCXZwYWRkZAkyNTYoJXJicCksJXltbTE1LCV5bW0xNQorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCTY0KCVyYnApLCV5bW02LCV5bW02CisJdnBhZGRkCTk2KCVyYnApLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAk2NCglcmJwKSwleW1tNSwleW1tNQorCXZwYWRkZAk5NiglcmJwKSwleW1tOSwleW1tOQorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisKKwl2bW92ZHFhCSV5bW0wLDEyOCglcmJwKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTMsJXltbTcsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0zLCV5bW03LCV5bW03CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTEsJXltbTE1LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTEsJXltbTE1LCV5bW0xMQorCXZweG9yCTArMCglcnNpKSwleW1tMCwleW1tMAorCXZweG9yCTMyKzAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW03LCV5bW03CisJdnB4b3IJOTYrMCglcnNpKSwleW1tMTEsJXltbTExCisJdm1vdmRxdQkleW1tMCwwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW03LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSw5NiswKCVyZGkpCisKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0yLCV5bW02LCV5bW02CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTAsJXltbTE0LCV5bW0yCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTAsJXltbTE0LCV5bW0xMAorCXZweG9yCTArMTI4KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMTI4KCVyc2kpLCV5bW0yLCV5bW0yCisJdnB4b3IJNjQrMTI4KCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJOTYrMTI4KCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CSV5bW0zLDArMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMiwzMisxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW02LDY0KzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzEyOCglcmRpKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMjU2KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMjU2KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJNjQrMjU2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMjU2KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzI1NiglcmRpKQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTMKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0zLCV5bW04CisKKwltb3ZxCSQzODQsJXJjeAorCWxlYXEJMzg0KCVyc2kpLCVyc2kKKwlzdWJxCSQzODQsJXJieAorCWptcAlzZWFsX2F2eDJfaGFzaAorCitzZWFsX2F2eDJfMzIwOgorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW0wLCV5bW0yCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTQsJXltbTYKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkleW1tOCwleW1tMTAKKwl2cGFkZGQJLmF2eDJfaW5jKCVyaXApLCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJLmF2eDJfaW5jKCVyaXApLCV5bW0xMywleW1tMTQKKwl2bW92ZHFhCSV5bW00LCV5bW03CisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKwltb3ZxCSQxMCwlcjEwCisxOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDEyLCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tNiwleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCisJZGVjcQklcjEwCisJam5lCTFiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW03LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW03LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW03LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW0xMSwleW1tOCwleW1tOAorCXZwYWRkZAkleW1tMTEsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTExLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJMTkyKCVyYnApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0zCisKKwl2cGFuZAkuY2xhbXAoJXJpcCksJXltbTMsJXltbTMKKwl2bW92ZHFhCSV5bW0zLDAoJXJicCkKKworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTgKKwl2cGVybTJpMTI4CSQweDAyLCV5bW05LCV5bW0xMywleW1tMTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW0xCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOSwleW1tMTMsJXltbTUKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0yLCV5bW02LCV5bW05CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTAsJXltbTE0LCV5bW0xMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTYKKwlqbXAJc2VhbF9hdngyX3Nob3J0CisKK3NlYWxfYXZ4Ml8xOTI6CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZwYWRkZAkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyLCV5bW0xMworCXZtb3ZkcWEJJXltbTEyLCV5bW0xMQorCXZtb3ZkcWEJJXltbTEzLCV5bW0xNQorCW1vdnEJJDEwLCVyMTAKKzE6CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTUsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzbGxkCSQ3LCV5bW01LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKworCWRlY3EJJXIxMAorCWpuZQkxYgorCXZwYWRkZAkleW1tMiwleW1tMCwleW1tMAorCXZwYWRkZAkleW1tMiwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNiwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNiwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tMTAsJXltbTgsJXltbTgKKwl2cGFkZGQJJXltbTEwLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xNSwleW1tMTMsJXltbTEzCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCisJdnBhbmQJLmNsYW1wKCVyaXApLCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMywwKCVyYnApCisKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xLCV5bW01LCV5bW04CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMSwleW1tNSwleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW01CitzZWFsX2F2eDJfc2hvcnQ6CisJbW92cQklcjgsJXI4CisJY2FsbAlwb2x5X2hhc2hfYWRfaW50ZXJuYWwKKwl4b3JxCSVyY3gsJXJjeAorc2VhbF9hdngyX2hhc2g6CisJY21wcQkkMTYsJXJjeAorCWpiCXNlYWxfYXZ4Ml9zaG9ydF9sb29wCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCXN1YnEJJDE2LCVyY3gKKwlhZGRxCSQxNiwlcmRpCisJam1wCXNlYWxfYXZ4Ml9oYXNoCitzZWFsX2F2eDJfc2hvcnRfbG9vcDoKKwljbXBxCSQzMiwlcmJ4CisJamIJc2VhbF9hdngyX3Nob3J0X3RhaWwKKwlzdWJxCSQzMiwlcmJ4CisKKwl2cHhvcgkoJXJzaSksJXltbTAsJXltbTAKKwl2bW92ZHF1CSV5bW0wLCglcmRpKQorCWxlYXEJMzIoJXJzaSksJXJzaQorCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKworCXZtb3ZkcWEJJXltbTQsJXltbTAKKwl2bW92ZHFhCSV5bW04LCV5bW00CisJdm1vdmRxYQkleW1tMTIsJXltbTgKKwl2bW92ZHFhCSV5bW0xLCV5bW0xMgorCXZtb3ZkcWEJJXltbTUsJXltbTEKKwl2bW92ZHFhCSV5bW05LCV5bW01CisJdm1vdmRxYQkleW1tMTMsJXltbTkKKwl2bW92ZHFhCSV5bW0yLCV5bW0xMworCXZtb3ZkcWEJJXltbTYsJXltbTIKKwlqbXAJc2VhbF9hdngyX3Nob3J0X2xvb3AKK3NlYWxfYXZ4Ml9zaG9ydF90YWlsOgorCWNtcHEJJDE2LCVyYngKKwlqYgkxZgorCXN1YnEJJDE2LCVyYngKKwl2cHhvcgkoJXJzaSksJXhtbTAsJXhtbTMKKwl2bW92ZHF1CSV4bW0zLCglcmRpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwl2ZXh0cmFjdGkxMjgJJDEsJXltbTAsJXhtbTAKKzE6CisJdnplcm91cHBlcgorCWptcAlzZWFsX3NzZV90YWlsXzE2CisuY2ZpX2VuZHByb2MJCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flcy14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flcy14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJjYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzLXg4Nl82NC5TCkBAIC0wLDAgKzEsMjY0MCBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKy50eXBlCV94ODZfNjRfQUVTX2VuY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK194ODZfNjRfQUVTX2VuY3J5cHQ6CisJeG9ybAkwKCVyMTUpLCVlYXgKKwl4b3JsCTQoJXIxNSksJWVieAorCXhvcmwJOCglcjE1KSwlZWN4CisJeG9ybAkxMiglcjE1KSwlZWR4CisKKwltb3ZsCTI0MCglcjE1KSwlcjEzZAorCXN1YmwJJDEsJXIxM2QKKwlqbXAJLkxlbmNfbG9vcAorLmFsaWduCTE2CisuTGVuY19sb29wOgorCisJbW92emJsCSVhbCwlZXNpCisJbW92emJsCSVibCwlZWRpCisJbW92emJsCSVjbCwlZWJwCisJbW92bAkwKCVyMTQsJXJzaSw4KSwlcjEwZAorCW1vdmwJMCglcjE0LCVyZGksOCksJXIxMWQKKwltb3ZsCTAoJXIxNCwlcmJwLDgpLCVyMTJkCisKKwltb3Z6YmwJJWJoLCVlc2kKKwltb3Z6YmwJJWNoLCVlZGkKKwltb3Z6YmwJJWRsLCVlYnAKKwl4b3JsCTMoJXIxNCwlcnNpLDgpLCVyMTBkCisJeG9ybAkzKCVyMTQsJXJkaSw4KSwlcjExZAorCW1vdmwJMCglcjE0LCVyYnAsOCksJXI4ZAorCisJbW92emJsCSVkaCwlZXNpCisJc2hybAkkMTYsJWVjeAorCW1vdnpibAklYWgsJWVicAorCXhvcmwJMyglcjE0LCVyc2ksOCksJXIxMmQKKwlzaHJsCSQxNiwlZWR4CisJeG9ybAkzKCVyMTQsJXJicCw4KSwlcjhkCisKKwlzaHJsCSQxNiwlZWJ4CisJbGVhcQkxNiglcjE1KSwlcjE1CisJc2hybAkkMTYsJWVheAorCisJbW92emJsCSVjbCwlZXNpCisJbW92emJsCSVkbCwlZWRpCisJbW92emJsCSVhbCwlZWJwCisJeG9ybAkyKCVyMTQsJXJzaSw4KSwlcjEwZAorCXhvcmwJMiglcjE0LCVyZGksOCksJXIxMWQKKwl4b3JsCTIoJXIxNCwlcmJwLDgpLCVyMTJkCisKKwltb3Z6YmwJJWRoLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwltb3Z6YmwJJWJsLCVlYnAKKwl4b3JsCTEoJXIxNCwlcnNpLDgpLCVyMTBkCisJeG9ybAkxKCVyMTQsJXJkaSw4KSwlcjExZAorCXhvcmwJMiglcjE0LCVyYnAsOCksJXI4ZAorCisJbW92bAkxMiglcjE1KSwlZWR4CisJbW92emJsCSViaCwlZWRpCisJbW92emJsCSVjaCwlZWJwCisJbW92bAkwKCVyMTUpLCVlYXgKKwl4b3JsCTEoJXIxNCwlcmRpLDgpLCVyMTJkCisJeG9ybAkxKCVyMTQsJXJicCw4KSwlcjhkCisKKwltb3ZsCTQoJXIxNSksJWVieAorCW1vdmwJOCglcjE1KSwlZWN4CisJeG9ybAklcjEwZCwlZWF4CisJeG9ybAklcjExZCwlZWJ4CisJeG9ybAklcjEyZCwlZWN4CisJeG9ybAklcjhkLCVlZHgKKwlzdWJsCSQxLCVyMTNkCisJam56CS5MZW5jX2xvb3AKKwltb3Z6YmwJJWFsLCVlc2kKKwltb3Z6YmwJJWJsLCVlZGkKKwltb3Z6YmwJJWNsLCVlYnAKKwltb3Z6YmwJMiglcjE0LCVyc2ksOCksJXIxMGQKKwltb3Z6YmwJMiglcjE0LCVyZGksOCksJXIxMWQKKwltb3Z6YmwJMiglcjE0LCVyYnAsOCksJXIxMmQKKworCW1vdnpibAklZGwsJWVzaQorCW1vdnpibAklYmgsJWVkaQorCW1vdnpibAklY2gsJWVicAorCW1vdnpibAkyKCVyMTQsJXJzaSw4KSwlcjhkCisJbW92bAkwKCVyMTQsJXJkaSw4KSwlZWRpCisJbW92bAkwKCVyMTQsJXJicCw4KSwlZWJwCisKKwlhbmRsCSQweDAwMDBmZjAwLCVlZGkKKwlhbmRsCSQweDAwMDBmZjAwLCVlYnAKKworCXhvcmwJJWVkaSwlcjEwZAorCXhvcmwJJWVicCwlcjExZAorCXNocmwJJDE2LCVlY3gKKworCW1vdnpibAklZGgsJWVzaQorCW1vdnpibAklYWgsJWVkaQorCXNocmwJJDE2LCVlZHgKKwltb3ZsCTAoJXIxNCwlcnNpLDgpLCVlc2kKKwltb3ZsCTAoJXIxNCwlcmRpLDgpLCVlZGkKKworCWFuZGwJJDB4MDAwMGZmMDAsJWVzaQorCWFuZGwJJDB4MDAwMGZmMDAsJWVkaQorCXNocmwJJDE2LCVlYngKKwl4b3JsCSVlc2ksJXIxMmQKKwl4b3JsCSVlZGksJXI4ZAorCXNocmwJJDE2LCVlYXgKKworCW1vdnpibAklY2wsJWVzaQorCW1vdnpibAklZGwsJWVkaQorCW1vdnpibAklYWwsJWVicAorCW1vdmwJMCglcjE0LCVyc2ksOCksJWVzaQorCW1vdmwJMCglcjE0LCVyZGksOCksJWVkaQorCW1vdmwJMCglcjE0LCVyYnAsOCksJWVicAorCisJYW5kbAkkMHgwMGZmMDAwMCwlZXNpCisJYW5kbAkkMHgwMGZmMDAwMCwlZWRpCisJYW5kbAkkMHgwMGZmMDAwMCwlZWJwCisKKwl4b3JsCSVlc2ksJXIxMGQKKwl4b3JsCSVlZGksJXIxMWQKKwl4b3JsCSVlYnAsJXIxMmQKKworCW1vdnpibAklYmwsJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAklYWgsJWVicAorCW1vdmwJMCglcjE0LCVyc2ksOCksJWVzaQorCW1vdmwJMiglcjE0LCVyZGksOCksJWVkaQorCW1vdmwJMiglcjE0LCVyYnAsOCksJWVicAorCisJYW5kbAkkMHgwMGZmMDAwMCwlZXNpCisJYW5kbAkkMHhmZjAwMDAwMCwlZWRpCisJYW5kbAkkMHhmZjAwMDAwMCwlZWJwCisKKwl4b3JsCSVlc2ksJXI4ZAorCXhvcmwJJWVkaSwlcjEwZAorCXhvcmwJJWVicCwlcjExZAorCisJbW92emJsCSViaCwlZXNpCisJbW92emJsCSVjaCwlZWRpCisJbW92bAkxNisxMiglcjE1KSwlZWR4CisJbW92bAkyKCVyMTQsJXJzaSw4KSwlZXNpCisJbW92bAkyKCVyMTQsJXJkaSw4KSwlZWRpCisJbW92bAkxNiswKCVyMTUpLCVlYXgKKworCWFuZGwJJDB4ZmYwMDAwMDAsJWVzaQorCWFuZGwJJDB4ZmYwMDAwMDAsJWVkaQorCisJeG9ybAklZXNpLCVyMTJkCisJeG9ybAklZWRpLCVyOGQKKworCW1vdmwJMTYrNCglcjE1KSwlZWJ4CisJbW92bAkxNis4KCVyMTUpLCVlY3gKKwl4b3JsCSVyMTBkLCVlYXgKKwl4b3JsCSVyMTFkLCVlYngKKwl4b3JsCSVyMTJkLCVlY3gKKwl4b3JsCSVyOGQsJWVkeAorLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfeDg2XzY0X0FFU19lbmNyeXB0LC4tX3g4Nl82NF9BRVNfZW5jcnlwdAorLnR5cGUJX3g4Nl82NF9BRVNfZW5jcnlwdF9jb21wYWN0LEBmdW5jdGlvbgorLmFsaWduCTE2CitfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJbGVhcQkxMjgoJXIxNCksJXI4CisJbW92bAkwLTEyOCglcjgpLCVlZGkKKwltb3ZsCTMyLTEyOCglcjgpLCVlYnAKKwltb3ZsCTY0LTEyOCglcjgpLCVyMTBkCisJbW92bAk5Ni0xMjgoJXI4KSwlcjExZAorCW1vdmwJMTI4LTEyOCglcjgpLCVlZGkKKwltb3ZsCTE2MC0xMjgoJXI4KSwlZWJwCisJbW92bAkxOTItMTI4KCVyOCksJXIxMGQKKwltb3ZsCTIyNC0xMjgoJXI4KSwlcjExZAorCWptcAkuTGVuY19sb29wX2NvbXBhY3QKKy5hbGlnbgkxNgorLkxlbmNfbG9vcF9jb21wYWN0OgorCXhvcmwJMCglcjE1KSwlZWF4CisJeG9ybAk0KCVyMTUpLCVlYngKKwl4b3JsCTgoJXIxNSksJWVjeAorCXhvcmwJMTIoJXIxNSksJWVkeAorCWxlYXEJMTYoJXIxNSksJXIxNQorCW1vdnpibAklYWwsJXIxMGQKKwltb3Z6YmwJJWJsLCVyMTFkCisJbW92emJsCSVjbCwlcjEyZAorCW1vdnpibAklZGwsJXI4ZAorCW1vdnpibAklYmgsJWVzaQorCW1vdnpibAklY2gsJWVkaQorCXNocmwJJDE2LCVlY3gKKwltb3Z6YmwJJWRoLCVlYnAKKwltb3Z6YmwJKCVyMTQsJXIxMCwxKSwlcjEwZAorCW1vdnpibAkoJXIxNCwlcjExLDEpLCVyMTFkCisJbW92emJsCSglcjE0LCVyMTIsMSksJXIxMmQKKwltb3Z6YmwJKCVyMTQsJXI4LDEpLCVyOGQKKworCW1vdnpibAkoJXIxNCwlcnNpLDEpLCVyOWQKKwltb3Z6YmwJJWFoLCVlc2kKKwltb3Z6YmwJKCVyMTQsJXJkaSwxKSwlcjEzZAorCW1vdnpibAklY2wsJWVkaQorCW1vdnpibAkoJXIxNCwlcmJwLDEpLCVlYnAKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlZXNpCisKKwlzaGxsCSQ4LCVyOWQKKwlzaHJsCSQxNiwlZWR4CisJc2hsbAkkOCwlcjEzZAorCXhvcmwJJXI5ZCwlcjEwZAorCXNocmwJJDE2LCVlYXgKKwltb3Z6YmwJJWRsLCVyOWQKKwlzaHJsCSQxNiwlZWJ4CisJeG9ybAklcjEzZCwlcjExZAorCXNobGwJJDgsJWVicAorCW1vdnpibAklYWwsJXIxM2QKKwltb3Z6YmwJKCVyMTQsJXJkaSwxKSwlZWRpCisJeG9ybAklZWJwLCVyMTJkCisKKwlzaGxsCSQ4LCVlc2kKKwltb3Z6YmwJJWJsLCVlYnAKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZXNpLCVyOGQKKwltb3Z6YmwJKCVyMTQsJXI5LDEpLCVyOWQKKwltb3Z6YmwJJWRoLCVlc2kKKwltb3Z6YmwJKCVyMTQsJXIxMywxKSwlcjEzZAorCXhvcmwJJWVkaSwlcjEwZAorCisJc2hybAkkOCwlZWN4CisJbW92emJsCSVhaCwlZWRpCisJc2hsbAkkMTYsJXI5ZAorCXNocmwJJDgsJWVieAorCXNobGwJJDE2LCVyMTNkCisJeG9ybAklcjlkLCVyMTFkCisJbW92emJsCSglcjE0LCVyYnAsMSksJWVicAorCW1vdnpibAkoJXIxNCwlcnNpLDEpLCVlc2kKKwltb3Z6YmwJKCVyMTQsJXJkaSwxKSwlZWRpCisJbW92emJsCSglcjE0LCVyY3gsMSksJWVkeAorCW1vdnpibAkoJXIxNCwlcmJ4LDEpLCVlY3gKKworCXNobGwJJDE2LCVlYnAKKwl4b3JsCSVyMTNkLCVyMTJkCisJc2hsbAkkMjQsJWVzaQorCXhvcmwJJWVicCwlcjhkCisJc2hsbAkkMjQsJWVkaQorCXhvcmwJJWVzaSwlcjEwZAorCXNobGwJJDI0LCVlZHgKKwl4b3JsCSVlZGksJXIxMWQKKwlzaGxsCSQyNCwlZWN4CisJbW92bAklcjEwZCwlZWF4CisJbW92bAklcjExZCwlZWJ4CisJeG9ybAklcjEyZCwlZWN4CisJeG9ybAklcjhkLCVlZHgKKwljbXBxCTE2KCVyc3ApLCVyMTUKKwlqZQkuTGVuY19jb21wYWN0X2RvbmUKKwltb3ZsCSQweDgwODA4MDgwLCVyMTBkCisJbW92bAkkMHg4MDgwODA4MCwlcjExZAorCWFuZGwJJWVheCwlcjEwZAorCWFuZGwJJWVieCwlcjExZAorCW1vdmwJJXIxMGQsJWVzaQorCW1vdmwJJXIxMWQsJWVkaQorCXNocmwJJDcsJXIxMGQKKwlsZWFsCSglcmF4LCVyYXgsMSksJXI4ZAorCXNocmwJJDcsJXIxMWQKKwlsZWFsCSglcmJ4LCVyYngsMSksJXI5ZAorCXN1YmwJJXIxMGQsJWVzaQorCXN1YmwJJXIxMWQsJWVkaQorCWFuZGwJJDB4ZmVmZWZlZmUsJXI4ZAorCWFuZGwJJDB4ZmVmZWZlZmUsJXI5ZAorCWFuZGwJJDB4MWIxYjFiMWIsJWVzaQorCWFuZGwJJDB4MWIxYjFiMWIsJWVkaQorCW1vdmwJJWVheCwlcjEwZAorCW1vdmwJJWVieCwlcjExZAorCXhvcmwJJWVzaSwlcjhkCisJeG9ybAklZWRpLCVyOWQKKworCXhvcmwJJXI4ZCwlZWF4CisJeG9ybAklcjlkLCVlYngKKwltb3ZsCSQweDgwODA4MDgwLCVyMTJkCisJcm9sbAkkMjQsJWVheAorCW1vdmwJJDB4ODA4MDgwODAsJWVicAorCXJvbGwJJDI0LCVlYngKKwlhbmRsCSVlY3gsJXIxMmQKKwlhbmRsCSVlZHgsJWVicAorCXhvcmwJJXI4ZCwlZWF4CisJeG9ybAklcjlkLCVlYngKKwltb3ZsCSVyMTJkLCVlc2kKKwlyb3JsCSQxNiwlcjEwZAorCW1vdmwJJWVicCwlZWRpCisJcm9ybAkkMTYsJXIxMWQKKwlsZWFsCSglcmN4LCVyY3gsMSksJXI4ZAorCXNocmwJJDcsJXIxMmQKKwl4b3JsCSVyMTBkLCVlYXgKKwlzaHJsCSQ3LCVlYnAKKwl4b3JsCSVyMTFkLCVlYngKKwlyb3JsCSQ4LCVyMTBkCisJbGVhbAkoJXJkeCwlcmR4LDEpLCVyOWQKKwlyb3JsCSQ4LCVyMTFkCisJc3VibAklcjEyZCwlZXNpCisJc3VibAklZWJwLCVlZGkKKwl4b3JsCSVyMTBkLCVlYXgKKwl4b3JsCSVyMTFkLCVlYngKKworCWFuZGwJJDB4ZmVmZWZlZmUsJXI4ZAorCWFuZGwJJDB4ZmVmZWZlZmUsJXI5ZAorCWFuZGwJJDB4MWIxYjFiMWIsJWVzaQorCWFuZGwJJDB4MWIxYjFiMWIsJWVkaQorCW1vdmwJJWVjeCwlcjEyZAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAklZXNpLCVyOGQKKwl4b3JsCSVlZGksJXI5ZAorCisJcm9ybAkkMTYsJXIxMmQKKwl4b3JsCSVyOGQsJWVjeAorCXJvcmwJJDE2LCVlYnAKKwl4b3JsCSVyOWQsJWVkeAorCXJvbGwJJDI0LCVlY3gKKwltb3ZsCTAoJXIxNCksJWVzaQorCXJvbGwJJDI0LCVlZHgKKwl4b3JsCSVyOGQsJWVjeAorCW1vdmwJNjQoJXIxNCksJWVkaQorCXhvcmwJJXI5ZCwlZWR4CisJbW92bAkxMjgoJXIxNCksJXI4ZAorCXhvcmwJJXIxMmQsJWVjeAorCXJvcmwJJDgsJXIxMmQKKwl4b3JsCSVlYnAsJWVkeAorCXJvcmwJJDgsJWVicAorCXhvcmwJJXIxMmQsJWVjeAorCW1vdmwJMTkyKCVyMTQpLCVyOWQKKwl4b3JsCSVlYnAsJWVkeAorCWptcAkuTGVuY19sb29wX2NvbXBhY3QKKy5hbGlnbgkxNgorLkxlbmNfY29tcGFjdF9kb25lOgorCXhvcmwJMCglcjE1KSwlZWF4CisJeG9ybAk0KCVyMTUpLCVlYngKKwl4b3JsCTgoJXIxNSksJWVjeAorCXhvcmwJMTIoJXIxNSksJWVkeAorLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QsLi1feDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QKKy5hbGlnbgkxNgorLmdsb2JsCWFlc19ub2h3X2VuY3J5cHQKKy5oaWRkZW4gYWVzX25vaHdfZW5jcnlwdAorLnR5cGUJYWVzX25vaHdfZW5jcnlwdCxAZnVuY3Rpb24KKy5oaWRkZW4JYWVzX25vaHdfZW5jcnlwdAorYWVzX25vaHdfZW5jcnlwdDoKKy5jZmlfc3RhcnRwcm9jCQorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorCisKKwlsZWFxCS02MyglcmR4KSwlcmN4CisJYW5kcQkkLTY0LCVyc3AKKwlzdWJxCSVyc3AsJXJjeAorCW5lZ3EJJXJjeAorCWFuZHEJJDB4M2MwLCVyY3gKKwlzdWJxCSVyY3gsJXJzcAorCXN1YnEJJDMyLCVyc3AKKworCW1vdnEJJXJzaSwxNiglcnNwKQorCW1vdnEJJXJheCwyNCglcnNwKQorLmNmaV9lc2NhcGUJMHgwZiwweDA1LDB4NzcsMHgxOCwweDA2LDB4MjMsMHgwOAorLkxlbmNfcHJvbG9ndWU6CisKKwltb3ZxCSVyZHgsJXIxNQorCW1vdmwJMjQwKCVyMTUpLCVyMTNkCisKKwltb3ZsCTAoJXJkaSksJWVheAorCW1vdmwJNCglcmRpKSwlZWJ4CisJbW92bAk4KCVyZGkpLCVlY3gKKwltb3ZsCTEyKCVyZGkpLCVlZHgKKworCXNobGwJJDQsJXIxM2QKKwlsZWFxCSglcjE1LCVyMTMsMSksJXJicAorCW1vdnEJJXIxNSwoJXJzcCkKKwltb3ZxCSVyYnAsOCglcnNwKQorCisKKwlsZWFxCS5MQUVTX1RlKzIwNDgoJXJpcCksJXIxNAorCWxlYXEJNzY4KCVyc3ApLCVyYnAKKwlzdWJxCSVyMTQsJXJicAorCWFuZHEJJDB4MzAwLCVyYnAKKwlsZWFxCSglcjE0LCVyYnAsMSksJXIxNAorCisJY2FsbAlfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QKKworCW1vdnEJMTYoJXJzcCksJXI5CisJbW92cQkyNCglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw4CisJbW92bAklZWF4LDAoJXI5KQorCW1vdmwJJWVieCw0KCVyOSkKKwltb3ZsCSVlY3gsOCglcjkpCisJbW92bAklZWR4LDEyKCVyOSkKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyc2kpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MZW5jX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzX25vaHdfZW5jcnlwdCwuLWFlc19ub2h3X2VuY3J5cHQKKy50eXBlCV94ODZfNjRfQUVTX2RlY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK194ODZfNjRfQUVTX2RlY3J5cHQ6CisJeG9ybAkwKCVyMTUpLCVlYXgKKwl4b3JsCTQoJXIxNSksJWVieAorCXhvcmwJOCglcjE1KSwlZWN4CisJeG9ybAkxMiglcjE1KSwlZWR4CisKKwltb3ZsCTI0MCglcjE1KSwlcjEzZAorCXN1YmwJJDEsJXIxM2QKKwlqbXAJLkxkZWNfbG9vcAorLmFsaWduCTE2CisuTGRlY19sb29wOgorCisJbW92emJsCSVhbCwlZXNpCisJbW92emJsCSVibCwlZWRpCisJbW92emJsCSVjbCwlZWJwCisJbW92bAkwKCVyMTQsJXJzaSw4KSwlcjEwZAorCW1vdmwJMCglcjE0LCVyZGksOCksJXIxMWQKKwltb3ZsCTAoJXIxNCwlcmJwLDgpLCVyMTJkCisKKwltb3Z6YmwJJWRoLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwltb3Z6YmwJJWRsLCVlYnAKKwl4b3JsCTMoJXIxNCwlcnNpLDgpLCVyMTBkCisJeG9ybAkzKCVyMTQsJXJkaSw4KSwlcjExZAorCW1vdmwJMCglcjE0LCVyYnAsOCksJXI4ZAorCisJbW92emJsCSViaCwlZXNpCisJc2hybAkkMTYsJWVheAorCW1vdnpibAklY2gsJWVicAorCXhvcmwJMyglcjE0LCVyc2ksOCksJXIxMmQKKwlzaHJsCSQxNiwlZWR4CisJeG9ybAkzKCVyMTQsJXJicCw4KSwlcjhkCisKKwlzaHJsCSQxNiwlZWJ4CisJbGVhcQkxNiglcjE1KSwlcjE1CisJc2hybAkkMTYsJWVjeAorCisJbW92emJsCSVjbCwlZXNpCisJbW92emJsCSVkbCwlZWRpCisJbW92emJsCSVhbCwlZWJwCisJeG9ybAkyKCVyMTQsJXJzaSw4KSwlcjEwZAorCXhvcmwJMiglcjE0LCVyZGksOCksJXIxMWQKKwl4b3JsCTIoJXIxNCwlcmJwLDgpLCVyMTJkCisKKwltb3Z6YmwJJWJoLCVlc2kKKwltb3Z6YmwJJWNoLCVlZGkKKwltb3Z6YmwJJWJsLCVlYnAKKwl4b3JsCTEoJXIxNCwlcnNpLDgpLCVyMTBkCisJeG9ybAkxKCVyMTQsJXJkaSw4KSwlcjExZAorCXhvcmwJMiglcjE0LCVyYnAsOCksJXI4ZAorCisJbW92emJsCSVkaCwlZXNpCisJbW92bAkxMiglcjE1KSwlZWR4CisJbW92emJsCSVhaCwlZWJwCisJeG9ybAkxKCVyMTQsJXJzaSw4KSwlcjEyZAorCW1vdmwJMCglcjE1KSwlZWF4CisJeG9ybAkxKCVyMTQsJXJicCw4KSwlcjhkCisKKwl4b3JsCSVyMTBkLCVlYXgKKwltb3ZsCTQoJXIxNSksJWVieAorCW1vdmwJOCglcjE1KSwlZWN4CisJeG9ybAklcjEyZCwlZWN4CisJeG9ybAklcjExZCwlZWJ4CisJeG9ybAklcjhkLCVlZHgKKwlzdWJsCSQxLCVyMTNkCisJam56CS5MZGVjX2xvb3AKKwlsZWFxCTIwNDgoJXIxNCksJXIxNAorCW1vdnpibAklYWwsJWVzaQorCW1vdnpibAklYmwsJWVkaQorCW1vdnpibAklY2wsJWVicAorCW1vdnpibAkoJXIxNCwlcnNpLDEpLCVyMTBkCisJbW92emJsCSglcjE0LCVyZGksMSksJXIxMWQKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlcjEyZAorCisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCSVkaCwlZWRpCisJbW92emJsCSVhaCwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJXI4ZAorCW1vdnpibAkoJXIxNCwlcmRpLDEpLCVlZGkKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisKKwlzaGxsCSQ4LCVlZGkKKwlzaGxsCSQ4LCVlYnAKKworCXhvcmwJJWVkaSwlcjEwZAorCXhvcmwJJWVicCwlcjExZAorCXNocmwJJDE2LCVlZHgKKworCW1vdnpibAklYmgsJWVzaQorCW1vdnpibAklY2gsJWVkaQorCXNocmwJJDE2LCVlYXgKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJWVkaQorCisJc2hsbAkkOCwlZXNpCisJc2hsbAkkOCwlZWRpCisJc2hybAkkMTYsJWVieAorCXhvcmwJJWVzaSwlcjEyZAorCXhvcmwJJWVkaSwlcjhkCisJc2hybAkkMTYsJWVjeAorCisJbW92emJsCSVjbCwlZXNpCisJbW92emJsCSVkbCwlZWRpCisJbW92emJsCSVhbCwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJWVzaQorCW1vdnpibAkoJXIxNCwlcmRpLDEpLCVlZGkKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisKKwlzaGxsCSQxNiwlZXNpCisJc2hsbAkkMTYsJWVkaQorCXNobGwJJDE2LCVlYnAKKworCXhvcmwJJWVzaSwlcjEwZAorCXhvcmwJJWVkaSwlcjExZAorCXhvcmwJJWVicCwlcjEyZAorCisJbW92emJsCSVibCwlZXNpCisJbW92emJsCSViaCwlZWRpCisJbW92emJsCSVjaCwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJWVzaQorCW1vdnpibAkoJXIxNCwlcmRpLDEpLCVlZGkKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisKKwlzaGxsCSQxNiwlZXNpCisJc2hsbAkkMjQsJWVkaQorCXNobGwJJDI0LCVlYnAKKworCXhvcmwJJWVzaSwlcjhkCisJeG9ybAklZWRpLCVyMTBkCisJeG9ybAklZWJwLCVyMTFkCisKKwltb3Z6YmwJJWRoLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwltb3ZsCTE2KzEyKCVyMTUpLCVlZHgKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJWVkaQorCW1vdmwJMTYrMCglcjE1KSwlZWF4CisKKwlzaGxsCSQyNCwlZXNpCisJc2hsbAkkMjQsJWVkaQorCisJeG9ybAklZXNpLCVyMTJkCisJeG9ybAklZWRpLCVyOGQKKworCW1vdmwJMTYrNCglcjE1KSwlZWJ4CisJbW92bAkxNis4KCVyMTUpLCVlY3gKKwlsZWFxCS0yMDQ4KCVyMTQpLCVyMTQKKwl4b3JsCSVyMTBkLCVlYXgKKwl4b3JsCSVyMTFkLCVlYngKKwl4b3JsCSVyMTJkLCVlY3gKKwl4b3JsCSVyOGQsJWVkeAorLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfeDg2XzY0X0FFU19kZWNyeXB0LC4tX3g4Nl82NF9BRVNfZGVjcnlwdAorLnR5cGUJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0LEBmdW5jdGlvbgorLmFsaWduCTE2CitfeDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3Q6CisJbGVhcQkxMjgoJXIxNCksJXI4CisJbW92bAkwLTEyOCglcjgpLCVlZGkKKwltb3ZsCTMyLTEyOCglcjgpLCVlYnAKKwltb3ZsCTY0LTEyOCglcjgpLCVyMTBkCisJbW92bAk5Ni0xMjgoJXI4KSwlcjExZAorCW1vdmwJMTI4LTEyOCglcjgpLCVlZGkKKwltb3ZsCTE2MC0xMjgoJXI4KSwlZWJwCisJbW92bAkxOTItMTI4KCVyOCksJXIxMGQKKwltb3ZsCTIyNC0xMjgoJXI4KSwlcjExZAorCWptcAkuTGRlY19sb29wX2NvbXBhY3QKKworLmFsaWduCTE2CisuTGRlY19sb29wX2NvbXBhY3Q6CisJeG9ybAkwKCVyMTUpLCVlYXgKKwl4b3JsCTQoJXIxNSksJWVieAorCXhvcmwJOCglcjE1KSwlZWN4CisJeG9ybAkxMiglcjE1KSwlZWR4CisJbGVhcQkxNiglcjE1KSwlcjE1CisJbW92emJsCSVhbCwlcjEwZAorCW1vdnpibAklYmwsJXIxMWQKKwltb3Z6YmwJJWNsLCVyMTJkCisJbW92emJsCSVkbCwlcjhkCisJbW92emJsCSVkaCwlZXNpCisJbW92emJsCSVhaCwlZWRpCisJc2hybAkkMTYsJWVkeAorCW1vdnpibAklYmgsJWVicAorCW1vdnpibAkoJXIxNCwlcjEwLDEpLCVyMTBkCisJbW92emJsCSglcjE0LCVyMTEsMSksJXIxMWQKKwltb3Z6YmwJKCVyMTQsJXIxMiwxKSwlcjEyZAorCW1vdnpibAkoJXIxNCwlcjgsMSksJXI4ZAorCisJbW92emJsCSglcjE0LCVyc2ksMSksJXI5ZAorCW1vdnpibAklY2gsJWVzaQorCW1vdnpibAkoJXIxNCwlcmRpLDEpLCVyMTNkCisJbW92emJsCSglcjE0LCVyYnAsMSksJWVicAorCW1vdnpibAkoJXIxNCwlcnNpLDEpLCVlc2kKKworCXNocmwJJDE2LCVlY3gKKwlzaGxsCSQ4LCVyMTNkCisJc2hsbAkkOCwlcjlkCisJbW92emJsCSVjbCwlZWRpCisJc2hybAkkMTYsJWVheAorCXhvcmwJJXI5ZCwlcjEwZAorCXNocmwJJDE2LCVlYngKKwltb3Z6YmwJJWRsLCVyOWQKKworCXNobGwJJDgsJWVicAorCXhvcmwJJXIxM2QsJXIxMWQKKwlzaGxsCSQ4LCVlc2kKKwltb3Z6YmwJJWFsLCVyMTNkCisJbW92emJsCSglcjE0LCVyZGksMSksJWVkaQorCXhvcmwJJWVicCwlcjEyZAorCW1vdnpibAklYmwsJWVicAorCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVzaSwlcjhkCisJbW92emJsCSglcjE0LCVyOSwxKSwlcjlkCisJbW92emJsCSViaCwlZXNpCisJbW92emJsCSglcjE0LCVyYnAsMSksJWVicAorCXhvcmwJJWVkaSwlcjEwZAorCW1vdnpibAkoJXIxNCwlcjEzLDEpLCVyMTNkCisJbW92emJsCSVjaCwlZWRpCisKKwlzaGxsCSQxNiwlZWJwCisJc2hsbAkkMTYsJXI5ZAorCXNobGwJJDE2LCVyMTNkCisJeG9ybAklZWJwLCVyOGQKKwltb3Z6YmwJJWRoLCVlYnAKKwl4b3JsCSVyOWQsJXIxMWQKKwlzaHJsCSQ4LCVlYXgKKwl4b3JsCSVyMTNkLCVyMTJkCisKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJWVieAorCW1vdnpibAkoJXIxNCwlcmJwLDEpLCVlY3gKKwltb3Z6YmwJKCVyMTQsJXJheCwxKSwlZWR4CisKKwltb3ZsCSVyMTBkLCVlYXgKKwlzaGxsCSQyNCwlZXNpCisJc2hsbAkkMjQsJWVieAorCXNobGwJJDI0LCVlY3gKKwl4b3JsCSVlc2ksJWVheAorCXNobGwJJDI0LCVlZHgKKwl4b3JsCSVyMTFkLCVlYngKKwl4b3JsCSVyMTJkLCVlY3gKKwl4b3JsCSVyOGQsJWVkeAorCWNtcHEJMTYoJXJzcCksJXIxNQorCWplCS5MZGVjX2NvbXBhY3RfZG9uZQorCisJbW92cQkyNTYrMCglcjE0KSwlcnNpCisJc2hscQkkMzIsJXJieAorCXNobHEJJDMyLCVyZHgKKwltb3ZxCTI1Nis4KCVyMTQpLCVyZGkKKwlvcnEJJXJieCwlcmF4CisJb3JxCSVyZHgsJXJjeAorCW1vdnEJMjU2KzE2KCVyMTQpLCVyYnAKKwltb3ZxCSVyc2ksJXI5CisJbW92cQklcnNpLCVyMTIKKwlhbmRxCSVyYXgsJXI5CisJYW5kcQklcmN4LCVyMTIKKwltb3ZxCSVyOSwlcmJ4CisJbW92cQklcjEyLCVyZHgKKwlzaHJxCSQ3LCVyOQorCWxlYXEJKCVyYXgsJXJheCwxKSwlcjgKKwlzaHJxCSQ3LCVyMTIKKwlsZWFxCSglcmN4LCVyY3gsMSksJXIxMQorCXN1YnEJJXI5LCVyYngKKwlzdWJxCSVyMTIsJXJkeAorCWFuZHEJJXJkaSwlcjgKKwlhbmRxCSVyZGksJXIxMQorCWFuZHEJJXJicCwlcmJ4CisJYW5kcQklcmJwLCVyZHgKKwl4b3JxCSVyYngsJXI4CisJeG9ycQklcmR4LCVyMTEKKwltb3ZxCSVyc2ksJXIxMAorCW1vdnEJJXJzaSwlcjEzCisKKwlhbmRxCSVyOCwlcjEwCisJYW5kcQklcjExLCVyMTMKKwltb3ZxCSVyMTAsJXJieAorCW1vdnEJJXIxMywlcmR4CisJc2hycQkkNywlcjEwCisJbGVhcQkoJXI4LCVyOCwxKSwlcjkKKwlzaHJxCSQ3LCVyMTMKKwlsZWFxCSglcjExLCVyMTEsMSksJXIxMgorCXN1YnEJJXIxMCwlcmJ4CisJc3VicQklcjEzLCVyZHgKKwlhbmRxCSVyZGksJXI5CisJYW5kcQklcmRpLCVyMTIKKwlhbmRxCSVyYnAsJXJieAorCWFuZHEJJXJicCwlcmR4CisJeG9ycQklcmJ4LCVyOQorCXhvcnEJJXJkeCwlcjEyCisJbW92cQklcnNpLCVyMTAKKwltb3ZxCSVyc2ksJXIxMworCisJYW5kcQklcjksJXIxMAorCWFuZHEJJXIxMiwlcjEzCisJbW92cQklcjEwLCVyYngKKwltb3ZxCSVyMTMsJXJkeAorCXNocnEJJDcsJXIxMAorCXhvcnEJJXJheCwlcjgKKwlzaHJxCSQ3LCVyMTMKKwl4b3JxCSVyY3gsJXIxMQorCXN1YnEJJXIxMCwlcmJ4CisJc3VicQklcjEzLCVyZHgKKwlsZWFxCSglcjksJXI5LDEpLCVyMTAKKwlsZWFxCSglcjEyLCVyMTIsMSksJXIxMworCXhvcnEJJXJheCwlcjkKKwl4b3JxCSVyY3gsJXIxMgorCWFuZHEJJXJkaSwlcjEwCisJYW5kcQklcmRpLCVyMTMKKwlhbmRxCSVyYnAsJXJieAorCWFuZHEJJXJicCwlcmR4CisJeG9ycQklcmJ4LCVyMTAKKwl4b3JxCSVyZHgsJXIxMworCisJeG9ycQklcjEwLCVyYXgKKwl4b3JxCSVyMTMsJXJjeAorCXhvcnEJJXIxMCwlcjgKKwl4b3JxCSVyMTMsJXIxMQorCW1vdnEJJXJheCwlcmJ4CisJbW92cQklcmN4LCVyZHgKKwl4b3JxCSVyMTAsJXI5CisJc2hycQkkMzIsJXJieAorCXhvcnEJJXIxMywlcjEyCisJc2hycQkkMzIsJXJkeAorCXhvcnEJJXI4LCVyMTAKKwlyb2xsCSQ4LCVlYXgKKwl4b3JxCSVyMTEsJXIxMworCXJvbGwJJDgsJWVjeAorCXhvcnEJJXI5LCVyMTAKKwlyb2xsCSQ4LCVlYngKKwl4b3JxCSVyMTIsJXIxMworCisJcm9sbAkkOCwlZWR4CisJeG9ybAklcjEwZCwlZWF4CisJc2hycQkkMzIsJXIxMAorCXhvcmwJJXIxM2QsJWVjeAorCXNocnEJJDMyLCVyMTMKKwl4b3JsCSVyMTBkLCVlYngKKwl4b3JsCSVyMTNkLCVlZHgKKworCW1vdnEJJXI4LCVyMTAKKwlyb2xsCSQyNCwlcjhkCisJbW92cQklcjExLCVyMTMKKwlyb2xsCSQyNCwlcjExZAorCXNocnEJJDMyLCVyMTAKKwl4b3JsCSVyOGQsJWVheAorCXNocnEJJDMyLCVyMTMKKwl4b3JsCSVyMTFkLCVlY3gKKwlyb2xsCSQyNCwlcjEwZAorCW1vdnEJJXI5LCVyOAorCXJvbGwJJDI0LCVyMTNkCisJbW92cQklcjEyLCVyMTEKKwlzaHJxCSQzMiwlcjgKKwl4b3JsCSVyMTBkLCVlYngKKwlzaHJxCSQzMiwlcjExCisJeG9ybAklcjEzZCwlZWR4CisKKwltb3ZxCTAoJXIxNCksJXJzaQorCXJvbGwJJDE2LCVyOWQKKwltb3ZxCTY0KCVyMTQpLCVyZGkKKwlyb2xsCSQxNiwlcjEyZAorCW1vdnEJMTI4KCVyMTQpLCVyYnAKKwlyb2xsCSQxNiwlcjhkCisJbW92cQkxOTIoJXIxNCksJXIxMAorCXhvcmwJJXI5ZCwlZWF4CisJcm9sbAkkMTYsJXIxMWQKKwl4b3JsCSVyMTJkLCVlY3gKKwltb3ZxCTI1NiglcjE0KSwlcjEzCisJeG9ybAklcjhkLCVlYngKKwl4b3JsCSVyMTFkLCVlZHgKKwlqbXAJLkxkZWNfbG9vcF9jb21wYWN0CisuYWxpZ24JMTYKKy5MZGVjX2NvbXBhY3RfZG9uZToKKwl4b3JsCTAoJXIxNSksJWVheAorCXhvcmwJNCglcjE1KSwlZWJ4CisJeG9ybAk4KCVyMTUpLCVlY3gKKwl4b3JsCTEyKCVyMTUpLCVlZHgKKy5ieXRlCTB4ZjMsMHhjMworLnNpemUJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0LC4tX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0CisuYWxpZ24JMTYKKy5nbG9ibAlhZXNfbm9od19kZWNyeXB0CisuaGlkZGVuIGFlc19ub2h3X2RlY3J5cHQKKy50eXBlCWFlc19ub2h3X2RlY3J5cHQsQGZ1bmN0aW9uCisuaGlkZGVuCWFlc19ub2h3X2RlY3J5cHQKK2Flc19ub2h3X2RlY3J5cHQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwltb3ZxCSVyc3AsJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKwlwdXNocQklcmJ4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKworCisJbGVhcQktNjMoJXJkeCksJXJjeAorCWFuZHEJJC02NCwlcnNwCisJc3VicQklcnNwLCVyY3gKKwluZWdxCSVyY3gKKwlhbmRxCSQweDNjMCwlcmN4CisJc3VicQklcmN4LCVyc3AKKwlzdWJxCSQzMiwlcnNwCisKKwltb3ZxCSVyc2ksMTYoJXJzcCkKKwltb3ZxCSVyYXgsMjQoJXJzcCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwNSwweDc3LDB4MTgsMHgwNiwweDIzLDB4MDgKKy5MZGVjX3Byb2xvZ3VlOgorCisJbW92cQklcmR4LCVyMTUKKwltb3ZsCTI0MCglcjE1KSwlcjEzZAorCisJbW92bAkwKCVyZGkpLCVlYXgKKwltb3ZsCTQoJXJkaSksJWVieAorCW1vdmwJOCglcmRpKSwlZWN4CisJbW92bAkxMiglcmRpKSwlZWR4CisKKwlzaGxsCSQ0LCVyMTNkCisJbGVhcQkoJXIxNSwlcjEzLDEpLCVyYnAKKwltb3ZxCSVyMTUsKCVyc3ApCisJbW92cQklcmJwLDgoJXJzcCkKKworCisJbGVhcQkuTEFFU19UZCsyMDQ4KCVyaXApLCVyMTQKKwlsZWFxCTc2OCglcnNwKSwlcmJwCisJc3VicQklcjE0LCVyYnAKKwlhbmRxCSQweDMwMCwlcmJwCisJbGVhcQkoJXIxNCwlcmJwLDEpLCVyMTQKKwlzaHJxCSQzLCVyYnAKKwlhZGRxCSVyYnAsJXIxNAorCisJY2FsbAlfeDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3QKKworCW1vdnEJMTYoJXJzcCksJXI5CisJbW92cQkyNCglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw4CisJbW92bAklZWF4LDAoJXI5KQorCW1vdmwJJWVieCw0KCVyOSkKKwltb3ZsCSVlY3gsOCglcjkpCisJbW92bAklZWR4LDEyKCVyOSkKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyc2kpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MZGVjX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzX25vaHdfZGVjcnlwdCwuLWFlc19ub2h3X2RlY3J5cHQKKy5hbGlnbgkxNgorLmdsb2JsCWFlc19ub2h3X3NldF9lbmNyeXB0X2tleQorLmhpZGRlbiBhZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCWFlc19ub2h3X3NldF9lbmNyeXB0X2tleSxAZnVuY3Rpb24KK2Flc19ub2h3X3NldF9lbmNyeXB0X2tleToKKy5jZmlfc3RhcnRwcm9jCQorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE1LC01NgorCXN1YnEJJDgsJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuTGVuY19rZXlfcHJvbG9ndWU6CisKKwljYWxsCV94ODZfNjRfQUVTX3NldF9lbmNyeXB0X2tleQorCisJbW92cQk0MCglcnNwKSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCW1vdnEJNDgoJXJzcCksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlhZGRxCSQ1NiwlcnNwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CS01NgorLkxlbmNfa2V5X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5LC4tYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5CisKKy50eXBlCV94ODZfNjRfQUVTX3NldF9lbmNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3g4Nl82NF9BRVNfc2V0X2VuY3J5cHRfa2V5OgorCW1vdmwJJWVzaSwlZWN4CisJbW92cQklcmRpLCVyc2kKKwltb3ZxCSVyZHgsJXJkaQorCisJdGVzdHEJJC0xLCVyc2kKKwlqegkuTGJhZHBvaW50ZXIKKwl0ZXN0cQkkLTEsJXJkaQorCWp6CS5MYmFkcG9pbnRlcgorCisJbGVhcQkuTEFFU19UZSglcmlwKSwlcmJwCisJbGVhcQkyMDQ4KzEyOCglcmJwKSwlcmJwCisKKworCW1vdmwJMC0xMjgoJXJicCksJWVheAorCW1vdmwJMzItMTI4KCVyYnApLCVlYngKKwltb3ZsCTY0LTEyOCglcmJwKSwlcjhkCisJbW92bAk5Ni0xMjgoJXJicCksJWVkeAorCW1vdmwJMTI4LTEyOCglcmJwKSwlZWF4CisJbW92bAkxNjAtMTI4KCVyYnApLCVlYngKKwltb3ZsCTE5Mi0xMjgoJXJicCksJXI4ZAorCW1vdmwJMjI0LTEyOCglcmJwKSwlZWR4CisKKwljbXBsCSQxMjgsJWVjeAorCWplCS5MMTByb3VuZHMKKwljbXBsCSQxOTIsJWVjeAorCWplCS5MMTJyb3VuZHMKKwljbXBsCSQyNTYsJWVjeAorCWplCS5MMTRyb3VuZHMKKwltb3ZxCSQtMiwlcmF4CisJam1wCS5MZXhpdAorCisuTDEwcm91bmRzOgorCW1vdnEJMCglcnNpKSwlcmF4CisJbW92cQk4KCVyc2kpLCVyZHgKKwltb3ZxCSVyYXgsMCglcmRpKQorCW1vdnEJJXJkeCw4KCVyZGkpCisKKwlzaHJxCSQzMiwlcmR4CisJeG9ybAklZWN4LCVlY3gKKwlqbXAJLkwxMHNob3J0Y3V0CisuYWxpZ24JNAorLkwxMGxvb3A6CisJbW92bAkwKCVyZGkpLCVlYXgKKwltb3ZsCTEyKCVyZGkpLCVlZHgKKy5MMTBzaG9ydGN1dDoKKwltb3Z6YmwJJWRsLCVlc2kKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDI0LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwlzaHJsCSQxNiwlZWR4CisJbW92emJsCSVkbCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkOCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJc2hsbAkkMTYsJWVieAorCXhvcmwJJWVieCwlZWF4CisKKwl4b3JsCTEwMjQtMTI4KCVyYnAsJXJjeCw0KSwlZWF4CisJbW92bAklZWF4LDE2KCVyZGkpCisJeG9ybAk0KCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMjAoJXJkaSkKKwl4b3JsCTgoJXJkaSksJWVheAorCW1vdmwJJWVheCwyNCglcmRpKQorCXhvcmwJMTIoJXJkaSksJWVheAorCW1vdmwJJWVheCwyOCglcmRpKQorCWFkZGwJJDEsJWVjeAorCWxlYXEJMTYoJXJkaSksJXJkaQorCWNtcGwJJDEwLCVlY3gKKwlqbAkuTDEwbG9vcAorCisJbW92bAkkMTAsODAoJXJkaSkKKwl4b3JxCSVyYXgsJXJheAorCWptcAkuTGV4aXQKKworLkwxMnJvdW5kczoKKwltb3ZxCTAoJXJzaSksJXJheAorCW1vdnEJOCglcnNpKSwlcmJ4CisJbW92cQkxNiglcnNpKSwlcmR4CisJbW92cQklcmF4LDAoJXJkaSkKKwltb3ZxCSVyYngsOCglcmRpKQorCW1vdnEJJXJkeCwxNiglcmRpKQorCisJc2hycQkkMzIsJXJkeAorCXhvcmwJJWVjeCwlZWN4CisJam1wCS5MMTJzaG9ydGN1dAorLmFsaWduCTQKKy5MMTJsb29wOgorCW1vdmwJMCglcmRpKSwlZWF4CisJbW92bAkyMCglcmRpKSwlZWR4CisuTDEyc2hvcnRjdXQ6CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQyNCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJc2hybAkkMTYsJWVkeAorCW1vdnpibAklZGwsJWVzaQorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDgsJWVieAorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJeG9ybAkxMDI0LTEyOCglcmJwLCVyY3gsNCksJWVheAorCW1vdmwJJWVheCwyNCglcmRpKQorCXhvcmwJNCglcmRpKSwlZWF4CisJbW92bAklZWF4LDI4KCVyZGkpCisJeG9ybAk4KCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMzIoJXJkaSkKKwl4b3JsCTEyKCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMzYoJXJkaSkKKworCWNtcGwJJDcsJWVjeAorCWplCS5MMTJicmVhaworCWFkZGwJJDEsJWVjeAorCisJeG9ybAkxNiglcmRpKSwlZWF4CisJbW92bAklZWF4LDQwKCVyZGkpCisJeG9ybAkyMCglcmRpKSwlZWF4CisJbW92bAklZWF4LDQ0KCVyZGkpCisKKwlsZWFxCTI0KCVyZGkpLCVyZGkKKwlqbXAJLkwxMmxvb3AKKy5MMTJicmVhazoKKwltb3ZsCSQxMiw3MiglcmRpKQorCXhvcnEJJXJheCwlcmF4CisJam1wCS5MZXhpdAorCisuTDE0cm91bmRzOgorCW1vdnEJMCglcnNpKSwlcmF4CisJbW92cQk4KCVyc2kpLCVyYngKKwltb3ZxCTE2KCVyc2kpLCVyY3gKKwltb3ZxCTI0KCVyc2kpLCVyZHgKKwltb3ZxCSVyYXgsMCglcmRpKQorCW1vdnEJJXJieCw4KCVyZGkpCisJbW92cQklcmN4LDE2KCVyZGkpCisJbW92cQklcmR4LDI0KCVyZGkpCisKKwlzaHJxCSQzMiwlcmR4CisJeG9ybAklZWN4LCVlY3gKKwlqbXAJLkwxNHNob3J0Y3V0CisuYWxpZ24JNAorLkwxNGxvb3A6CisJbW92bAkwKCVyZGkpLCVlYXgKKwltb3ZsCTI4KCVyZGkpLCVlZHgKKy5MMTRzaG9ydGN1dDoKKwltb3Z6YmwJJWRsLCVlc2kKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDI0LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwlzaHJsCSQxNiwlZWR4CisJbW92emJsCSVkbCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkOCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJc2hsbAkkMTYsJWVieAorCXhvcmwJJWVieCwlZWF4CisKKwl4b3JsCTEwMjQtMTI4KCVyYnAsJXJjeCw0KSwlZWF4CisJbW92bAklZWF4LDMyKCVyZGkpCisJeG9ybAk0KCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMzYoJXJkaSkKKwl4b3JsCTgoJXJkaSksJWVheAorCW1vdmwJJWVheCw0MCglcmRpKQorCXhvcmwJMTIoJXJkaSksJWVheAorCW1vdmwJJWVheCw0NCglcmRpKQorCisJY21wbAkkNiwlZWN4CisJamUJLkwxNGJyZWFrCisJYWRkbAkkMSwlZWN4CisKKwltb3ZsCSVlYXgsJWVkeAorCW1vdmwJMTYoJXJkaSksJWVheAorCW1vdnpibAklZGwsJWVzaQorCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJc2hybAkkMTYsJWVkeAorCXNobGwJJDgsJWVieAorCW1vdnpibAklZGwsJWVzaQorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwlzaGxsCSQyNCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKworCW1vdmwJJWVheCw0OCglcmRpKQorCXhvcmwJMjAoJXJkaSksJWVheAorCW1vdmwJJWVheCw1MiglcmRpKQorCXhvcmwJMjQoJXJkaSksJWVheAorCW1vdmwJJWVheCw1NiglcmRpKQorCXhvcmwJMjgoJXJkaSksJWVheAorCW1vdmwJJWVheCw2MCglcmRpKQorCisJbGVhcQkzMiglcmRpKSwlcmRpCisJam1wCS5MMTRsb29wCisuTDE0YnJlYWs6CisJbW92bAkkMTQsNDgoJXJkaSkKKwl4b3JxCSVyYXgsJXJheAorCWptcAkuTGV4aXQKKworLkxiYWRwb2ludGVyOgorCW1vdnEJJC0xLCVyYXgKKy5MZXhpdDoKKy5ieXRlCTB4ZjMsMHhjMworLnNpemUJX3g4Nl82NF9BRVNfc2V0X2VuY3J5cHRfa2V5LC4tX3g4Nl82NF9BRVNfc2V0X2VuY3J5cHRfa2V5CisuYWxpZ24JMTYKKy5nbG9ibAlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXkKKy5oaWRkZW4gYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXksQGZ1bmN0aW9uCithZXNfbm9od19zZXRfZGVjcnlwdF9rZXk6CisuY2ZpX3N0YXJ0cHJvYwkKKwlwdXNocQklcmJ4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKwlwdXNocQklcmR4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5MZGVjX2tleV9wcm9sb2d1ZToKKworCWNhbGwJX3g4Nl82NF9BRVNfc2V0X2VuY3J5cHRfa2V5CisJbW92cQkoJXJzcCksJXI4CisJY21wbAkkMCwlZWF4CisJam5lCS5MYWJvcnQKKworCW1vdmwJMjQwKCVyOCksJXIxNGQKKwl4b3JxCSVyZGksJXJkaQorCWxlYXEJKCVyZGksJXIxNCw0KSwlcmN4CisJbW92cQklcjgsJXJzaQorCWxlYXEJKCVyOCwlcmN4LDQpLCVyZGkKKy5hbGlnbgk0CisuTGludmVydDoKKwltb3ZxCTAoJXJzaSksJXJheAorCW1vdnEJOCglcnNpKSwlcmJ4CisJbW92cQkwKCVyZGkpLCVyY3gKKwltb3ZxCTgoJXJkaSksJXJkeAorCW1vdnEJJXJheCwwKCVyZGkpCisJbW92cQklcmJ4LDgoJXJkaSkKKwltb3ZxCSVyY3gsMCglcnNpKQorCW1vdnEJJXJkeCw4KCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJbGVhcQktMTYoJXJkaSksJXJkaQorCWNtcHEJJXJzaSwlcmRpCisJam5lCS5MaW52ZXJ0CisKKwlsZWFxCS5MQUVTX1RlKzIwNDgrMTAyNCglcmlwKSwlcmF4CisKKwltb3ZxCTQwKCVyYXgpLCVyc2kKKwltb3ZxCTQ4KCVyYXgpLCVyZGkKKwltb3ZxCTU2KCVyYXgpLCVyYnAKKworCW1vdnEJJXI4LCVyMTUKKwlzdWJsCSQxLCVyMTRkCisuYWxpZ24JNAorLkxwZXJtdXRlOgorCWxlYXEJMTYoJXIxNSksJXIxNQorCW1vdnEJMCglcjE1KSwlcmF4CisJbW92cQk4KCVyMTUpLCVyY3gKKwltb3ZxCSVyc2ksJXI5CisJbW92cQklcnNpLCVyMTIKKwlhbmRxCSVyYXgsJXI5CisJYW5kcQklcmN4LCVyMTIKKwltb3ZxCSVyOSwlcmJ4CisJbW92cQklcjEyLCVyZHgKKwlzaHJxCSQ3LCVyOQorCWxlYXEJKCVyYXgsJXJheCwxKSwlcjgKKwlzaHJxCSQ3LCVyMTIKKwlsZWFxCSglcmN4LCVyY3gsMSksJXIxMQorCXN1YnEJJXI5LCVyYngKKwlzdWJxCSVyMTIsJXJkeAorCWFuZHEJJXJkaSwlcjgKKwlhbmRxCSVyZGksJXIxMQorCWFuZHEJJXJicCwlcmJ4CisJYW5kcQklcmJwLCVyZHgKKwl4b3JxCSVyYngsJXI4CisJeG9ycQklcmR4LCVyMTEKKwltb3ZxCSVyc2ksJXIxMAorCW1vdnEJJXJzaSwlcjEzCisKKwlhbmRxCSVyOCwlcjEwCisJYW5kcQklcjExLCVyMTMKKwltb3ZxCSVyMTAsJXJieAorCW1vdnEJJXIxMywlcmR4CisJc2hycQkkNywlcjEwCisJbGVhcQkoJXI4LCVyOCwxKSwlcjkKKwlzaHJxCSQ3LCVyMTMKKwlsZWFxCSglcjExLCVyMTEsMSksJXIxMgorCXN1YnEJJXIxMCwlcmJ4CisJc3VicQklcjEzLCVyZHgKKwlhbmRxCSVyZGksJXI5CisJYW5kcQklcmRpLCVyMTIKKwlhbmRxCSVyYnAsJXJieAorCWFuZHEJJXJicCwlcmR4CisJeG9ycQklcmJ4LCVyOQorCXhvcnEJJXJkeCwlcjEyCisJbW92cQklcnNpLCVyMTAKKwltb3ZxCSVyc2ksJXIxMworCisJYW5kcQklcjksJXIxMAorCWFuZHEJJXIxMiwlcjEzCisJbW92cQklcjEwLCVyYngKKwltb3ZxCSVyMTMsJXJkeAorCXNocnEJJDcsJXIxMAorCXhvcnEJJXJheCwlcjgKKwlzaHJxCSQ3LCVyMTMKKwl4b3JxCSVyY3gsJXIxMQorCXN1YnEJJXIxMCwlcmJ4CisJc3VicQklcjEzLCVyZHgKKwlsZWFxCSglcjksJXI5LDEpLCVyMTAKKwlsZWFxCSglcjEyLCVyMTIsMSksJXIxMworCXhvcnEJJXJheCwlcjkKKwl4b3JxCSVyY3gsJXIxMgorCWFuZHEJJXJkaSwlcjEwCisJYW5kcQklcmRpLCVyMTMKKwlhbmRxCSVyYnAsJXJieAorCWFuZHEJJXJicCwlcmR4CisJeG9ycQklcmJ4LCVyMTAKKwl4b3JxCSVyZHgsJXIxMworCisJeG9ycQklcjEwLCVyYXgKKwl4b3JxCSVyMTMsJXJjeAorCXhvcnEJJXIxMCwlcjgKKwl4b3JxCSVyMTMsJXIxMQorCW1vdnEJJXJheCwlcmJ4CisJbW92cQklcmN4LCVyZHgKKwl4b3JxCSVyMTAsJXI5CisJc2hycQkkMzIsJXJieAorCXhvcnEJJXIxMywlcjEyCisJc2hycQkkMzIsJXJkeAorCXhvcnEJJXI4LCVyMTAKKwlyb2xsCSQ4LCVlYXgKKwl4b3JxCSVyMTEsJXIxMworCXJvbGwJJDgsJWVjeAorCXhvcnEJJXI5LCVyMTAKKwlyb2xsCSQ4LCVlYngKKwl4b3JxCSVyMTIsJXIxMworCisJcm9sbAkkOCwlZWR4CisJeG9ybAklcjEwZCwlZWF4CisJc2hycQkkMzIsJXIxMAorCXhvcmwJJXIxM2QsJWVjeAorCXNocnEJJDMyLCVyMTMKKwl4b3JsCSVyMTBkLCVlYngKKwl4b3JsCSVyMTNkLCVlZHgKKworCW1vdnEJJXI4LCVyMTAKKwlyb2xsCSQyNCwlcjhkCisJbW92cQklcjExLCVyMTMKKwlyb2xsCSQyNCwlcjExZAorCXNocnEJJDMyLCVyMTAKKwl4b3JsCSVyOGQsJWVheAorCXNocnEJJDMyLCVyMTMKKwl4b3JsCSVyMTFkLCVlY3gKKwlyb2xsCSQyNCwlcjEwZAorCW1vdnEJJXI5LCVyOAorCXJvbGwJJDI0LCVyMTNkCisJbW92cQklcjEyLCVyMTEKKwlzaHJxCSQzMiwlcjgKKwl4b3JsCSVyMTBkLCVlYngKKwlzaHJxCSQzMiwlcjExCisJeG9ybAklcjEzZCwlZWR4CisKKworCXJvbGwJJDE2LCVyOWQKKworCXJvbGwJJDE2LCVyMTJkCisKKwlyb2xsCSQxNiwlcjhkCisKKwl4b3JsCSVyOWQsJWVheAorCXJvbGwJJDE2LCVyMTFkCisJeG9ybAklcjEyZCwlZWN4CisKKwl4b3JsCSVyOGQsJWVieAorCXhvcmwJJXIxMWQsJWVkeAorCW1vdmwJJWVheCwwKCVyMTUpCisJbW92bAklZWJ4LDQoJXIxNSkKKwltb3ZsCSVlY3gsOCglcjE1KQorCW1vdmwJJWVkeCwxMiglcjE1KQorCXN1YmwJJDEsJXIxNGQKKwlqbnoJLkxwZXJtdXRlCisKKwl4b3JxCSVyYXgsJXJheAorLkxhYm9ydDoKKwltb3ZxCTgoJXJzcCksJXIxNQorLmNmaV9yZXN0b3JlCSVyMTUKKwltb3ZxCTE2KCVyc3ApLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQkyNCglcnNwKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJMzIoJXJzcCksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCTQwKCVyc3ApLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQk0OCglcnNwKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWFkZHEJJDU2LCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTU2CisuTGRlY19rZXlfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXksLi1hZXNfbm9od19zZXRfZGVjcnlwdF9rZXkKKy5hbGlnbgkxNgorLmdsb2JsCWFlc19ub2h3X2NiY19lbmNyeXB0CisuaGlkZGVuIGFlc19ub2h3X2NiY19lbmNyeXB0CisudHlwZQlhZXNfbm9od19jYmNfZW5jcnlwdCxAZnVuY3Rpb24KKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKy5oaWRkZW4gT1BFTlNTTF9pYTMyY2FwX1AKKy5oaWRkZW4JYWVzX25vaHdfY2JjX2VuY3J5cHQKK2Flc19ub2h3X2NiY19lbmNyeXB0OgorLmNmaV9zdGFydHByb2MJCisJY21wcQkkMCwlcmR4CisJamUJLkxjYmNfZXBpbG9ndWUKKwlwdXNoZnEKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJNDksLTE2CisJcHVzaHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJ4LC0yNAorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMzIKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTQwCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00OAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNTYKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTY0CisuTGNiY19wcm9sb2d1ZToKKworCWNsZAorCW1vdmwJJXI5ZCwlcjlkCisKKwlsZWFxCS5MQUVTX1RlKCVyaXApLCVyMTQKKwlsZWFxCS5MQUVTX1RkKCVyaXApLCVyMTAKKwljbXBxCSQwLCVyOQorCWNtb3ZlcQklcjEwLCVyMTQKKworCWxlYXEJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXIxMAorCW1vdmwJKCVyMTApLCVyMTBkCisJY21wcQkkNTEyLCVyZHgKKwlqYgkuTGNiY19zbG93X3Byb2xvZ3VlCisJdGVzdHEJJDE1LCVyZHgKKwlqbnoJLkxjYmNfc2xvd19wcm9sb2d1ZQorCWJ0bAkkMjgsJXIxMGQKKwlqYwkuTGNiY19zbG93X3Byb2xvZ3VlCisKKworCWxlYXEJLTg4LTI0OCglcnNwKSwlcjE1CisJYW5kcQkkLTY0LCVyMTUKKworCisJbW92cQklcjE0LCVyMTAKKwlsZWFxCTIzMDQoJXIxNCksJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMHhGRkYsJXIxMAorCWFuZHEJJDB4RkZGLCVyMTEKKwlhbmRxCSQweEZGRiwlcjEyCisKKwljbXBxCSVyMTEsJXIxMgorCWpiCS5MY2JjX3RlX2JyZWFrX291dAorCXN1YnEJJXIxMSwlcjEyCisJc3VicQklcjEyLCVyMTUKKwlqbXAJLkxjYmNfdGVfb2sKKy5MY2JjX3RlX2JyZWFrX291dDoKKwlzdWJxCSVyMTAsJXIxMgorCWFuZHEJJDB4RkZGLCVyMTIKKwlhZGRxCSQzMjAsJXIxMgorCXN1YnEJJXIxMiwlcjE1CisuYWxpZ24JNAorLkxjYmNfdGVfb2s6CisKKwl4Y2hncQklcnNwLCVyMTUKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcjE1CisKKwltb3ZxCSVyMTUsMTYoJXJzcCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwNSwweDc3LDB4MTAsMHgwNiwweDIzLDB4NDAKKy5MY2JjX2Zhc3RfYm9keToKKwltb3ZxCSVyZGksMjQoJXJzcCkKKwltb3ZxCSVyc2ksMzIoJXJzcCkKKwltb3ZxCSVyZHgsNDAoJXJzcCkKKwltb3ZxCSVyY3gsNDgoJXJzcCkKKwltb3ZxCSVyOCw1NiglcnNwKQorCW1vdmwJJDAsODArMjQwKCVyc3ApCisJbW92cQklcjgsJXJicAorCW1vdnEJJXI5LCVyYngKKwltb3ZxCSVyc2ksJXI5CisJbW92cQklcmRpLCVyOAorCW1vdnEJJXJjeCwlcjE1CisKKwltb3ZsCTI0MCglcjE1KSwlZWF4CisKKwltb3ZxCSVyMTUsJXIxMAorCXN1YnEJJXIxNCwlcjEwCisJYW5kcQkkMHhmZmYsJXIxMAorCWNtcHEJJDIzMDQsJXIxMAorCWpiCS5MY2JjX2RvX2Vjb3B5CisJY21wcQkkNDA5Ni0yNDgsJXIxMAorCWpiCS5MY2JjX3NraXBfZWNvcHkKKy5hbGlnbgk0CisuTGNiY19kb19lY29weToKKwltb3ZxCSVyMTUsJXJzaQorCWxlYXEJODAoJXJzcCksJXJkaQorCWxlYXEJODAoJXJzcCksJXIxNQorCW1vdmwJJDMwLCVlY3gKKy5sb25nCTB4OTBBNTQ4RjMKKwltb3ZsCSVlYXgsKCVyZGkpCisuTGNiY19za2lwX2Vjb3B5OgorCW1vdnEJJXIxNSwwKCVyc3ApCisKKwltb3ZsCSQxOCwlZWN4CisuYWxpZ24JNAorLkxjYmNfcHJlZmV0Y2hfdGU6CisJbW92cQkwKCVyMTQpLCVyMTAKKwltb3ZxCTMyKCVyMTQpLCVyMTEKKwltb3ZxCTY0KCVyMTQpLCVyMTIKKwltb3ZxCTk2KCVyMTQpLCVyMTMKKwlsZWFxCTEyOCglcjE0KSwlcjE0CisJc3VibAkkMSwlZWN4CisJam56CS5MY2JjX3ByZWZldGNoX3RlCisJbGVhcQktMjMwNCglcjE0KSwlcjE0CisKKwljbXBxCSQwLCVyYngKKwlqZQkuTEZBU1RfREVDUllQVAorCisKKwltb3ZsCTAoJXJicCksJWVheAorCW1vdmwJNCglcmJwKSwlZWJ4CisJbW92bAk4KCVyYnApLCVlY3gKKwltb3ZsCTEyKCVyYnApLCVlZHgKKworLmFsaWduCTQKKy5MY2JjX2Zhc3RfZW5jX2xvb3A6CisJeG9ybAkwKCVyOCksJWVheAorCXhvcmwJNCglcjgpLCVlYngKKwl4b3JsCTgoJXI4KSwlZWN4CisJeG9ybAkxMiglcjgpLCVlZHgKKwltb3ZxCTAoJXJzcCksJXIxNQorCW1vdnEJJXI4LDI0KCVyc3ApCisKKwljYWxsCV94ODZfNjRfQUVTX2VuY3J5cHQKKworCW1vdnEJMjQoJXJzcCksJXI4CisJbW92cQk0MCglcnNwKSwlcjEwCisJbW92bAklZWF4LDAoJXI5KQorCW1vdmwJJWVieCw0KCVyOSkKKwltb3ZsCSVlY3gsOCglcjkpCisJbW92bAklZWR4LDEyKCVyOSkKKworCWxlYXEJMTYoJXI4KSwlcjgKKwlsZWFxCTE2KCVyOSksJXI5CisJc3VicQkkMTYsJXIxMAorCXRlc3RxCSQtMTYsJXIxMAorCW1vdnEJJXIxMCw0MCglcnNwKQorCWpuegkuTGNiY19mYXN0X2VuY19sb29wCisJbW92cQk1NiglcnNwKSwlcmJwCisJbW92bAklZWF4LDAoJXJicCkKKwltb3ZsCSVlYngsNCglcmJwKQorCW1vdmwJJWVjeCw4KCVyYnApCisJbW92bAklZWR4LDEyKCVyYnApCisKKwlqbXAJLkxjYmNfZmFzdF9jbGVhbnVwCisKKworLmFsaWduCTE2CisuTEZBU1RfREVDUllQVDoKKwljbXBxCSVyOCwlcjkKKwlqZQkuTGNiY19mYXN0X2RlY19pbl9wbGFjZQorCisJbW92cQklcmJwLDY0KCVyc3ApCisuYWxpZ24JNAorLkxjYmNfZmFzdF9kZWNfbG9vcDoKKwltb3ZsCTAoJXI4KSwlZWF4CisJbW92bAk0KCVyOCksJWVieAorCW1vdmwJOCglcjgpLCVlY3gKKwltb3ZsCTEyKCVyOCksJWVkeAorCW1vdnEJMCglcnNwKSwlcjE1CisJbW92cQklcjgsMjQoJXJzcCkKKworCWNhbGwJX3g4Nl82NF9BRVNfZGVjcnlwdAorCisJbW92cQk2NCglcnNwKSwlcmJwCisJbW92cQkyNCglcnNwKSwlcjgKKwltb3ZxCTQwKCVyc3ApLCVyMTAKKwl4b3JsCTAoJXJicCksJWVheAorCXhvcmwJNCglcmJwKSwlZWJ4CisJeG9ybAk4KCVyYnApLCVlY3gKKwl4b3JsCTEyKCVyYnApLCVlZHgKKwltb3ZxCSVyOCwlcmJwCisKKwlzdWJxCSQxNiwlcjEwCisJbW92cQklcjEwLDQwKCVyc3ApCisJbW92cQklcmJwLDY0KCVyc3ApCisKKwltb3ZsCSVlYXgsMCglcjkpCisJbW92bAklZWJ4LDQoJXI5KQorCW1vdmwJJWVjeCw4KCVyOSkKKwltb3ZsCSVlZHgsMTIoJXI5KQorCisJbGVhcQkxNiglcjgpLCVyOAorCWxlYXEJMTYoJXI5KSwlcjkKKwlqbnoJLkxjYmNfZmFzdF9kZWNfbG9vcAorCW1vdnEJNTYoJXJzcCksJXIxMgorCW1vdnEJMCglcmJwKSwlcjEwCisJbW92cQk4KCVyYnApLCVyMTEKKwltb3ZxCSVyMTAsMCglcjEyKQorCW1vdnEJJXIxMSw4KCVyMTIpCisJam1wCS5MY2JjX2Zhc3RfY2xlYW51cAorCisuYWxpZ24JMTYKKy5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlOgorCW1vdnEJMCglcmJwKSwlcjEwCisJbW92cQk4KCVyYnApLCVyMTEKKwltb3ZxCSVyMTAsMCs2NCglcnNwKQorCW1vdnEJJXIxMSw4KzY0KCVyc3ApCisuYWxpZ24JNAorLkxjYmNfZmFzdF9kZWNfaW5fcGxhY2VfbG9vcDoKKwltb3ZsCTAoJXI4KSwlZWF4CisJbW92bAk0KCVyOCksJWVieAorCW1vdmwJOCglcjgpLCVlY3gKKwltb3ZsCTEyKCVyOCksJWVkeAorCW1vdnEJMCglcnNwKSwlcjE1CisJbW92cQklcjgsMjQoJXJzcCkKKworCWNhbGwJX3g4Nl82NF9BRVNfZGVjcnlwdAorCisJbW92cQkyNCglcnNwKSwlcjgKKwltb3ZxCTQwKCVyc3ApLCVyMTAKKwl4b3JsCTArNjQoJXJzcCksJWVheAorCXhvcmwJNCs2NCglcnNwKSwlZWJ4CisJeG9ybAk4KzY0KCVyc3ApLCVlY3gKKwl4b3JsCTEyKzY0KCVyc3ApLCVlZHgKKworCW1vdnEJMCglcjgpLCVyMTEKKwltb3ZxCTgoJXI4KSwlcjEyCisJc3VicQkkMTYsJXIxMAorCWp6CS5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2RvbmUKKworCW1vdnEJJXIxMSwwKzY0KCVyc3ApCisJbW92cQklcjEyLDgrNjQoJXJzcCkKKworCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKwlsZWFxCTE2KCVyOCksJXI4CisJbGVhcQkxNiglcjkpLCVyOQorCW1vdnEJJXIxMCw0MCglcnNwKQorCWptcAkuTGNiY19mYXN0X2RlY19pbl9wbGFjZV9sb29wCisuTGNiY19mYXN0X2RlY19pbl9wbGFjZV9kb25lOgorCW1vdnEJNTYoJXJzcCksJXJkaQorCW1vdnEJJXIxMSwwKCVyZGkpCisJbW92cQklcjEyLDgoJXJkaSkKKworCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKy5hbGlnbgk0CisuTGNiY19mYXN0X2NsZWFudXA6CisJY21wbAkkMCw4MCsyNDAoJXJzcCkKKwlsZWFxCTgwKCVyc3ApLCVyZGkKKwlqZQkuTGNiY19leGl0CisJbW92bAkkMzAsJWVjeAorCXhvcnEJJXJheCwlcmF4CisubG9uZwkweDkwQUI0OEYzCisKKwlqbXAJLkxjYmNfZXhpdAorCisKKy5hbGlnbgkxNgorLkxjYmNfc2xvd19wcm9sb2d1ZToKKworCWxlYXEJLTg4KCVyc3ApLCVyYnAKKwlhbmRxCSQtNjQsJXJicAorCisJbGVhcQktODgtNjMoJXJjeCksJXIxMAorCXN1YnEJJXJicCwlcjEwCisJbmVncQklcjEwCisJYW5kcQkkMHgzYzAsJXIxMAorCXN1YnEJJXIxMCwlcmJwCisKKwl4Y2hncQklcnNwLCVyYnAKKworCW1vdnEJJXJicCwxNiglcnNwKQorLkxjYmNfc2xvd19ib2R5OgorCisKKworCisJbW92cQklcjgsNTYoJXJzcCkKKwltb3ZxCSVyOCwlcmJwCisJbW92cQklcjksJXJieAorCW1vdnEJJXJzaSwlcjkKKwltb3ZxCSVyZGksJXI4CisJbW92cQklcmN4LCVyMTUKKwltb3ZxCSVyZHgsJXIxMAorCisJbW92bAkyNDAoJXIxNSksJWVheAorCW1vdnEJJXIxNSwwKCVyc3ApCisJc2hsbAkkNCwlZWF4CisJbGVhcQkoJXIxNSwlcmF4LDEpLCVyYXgKKwltb3ZxCSVyYXgsOCglcnNwKQorCisKKwlsZWFxCTIwNDgoJXIxNCksJXIxNAorCWxlYXEJNzY4LTgoJXJzcCksJXJheAorCXN1YnEJJXIxNCwlcmF4CisJYW5kcQkkMHgzMDAsJXJheAorCWxlYXEJKCVyMTQsJXJheCwxKSwlcjE0CisKKwljbXBxCSQwLCVyYngKKwlqZQkuTFNMT1dfREVDUllQVAorCisKKwl0ZXN0cQkkLTE2LCVyMTAKKwltb3ZsCTAoJXJicCksJWVheAorCW1vdmwJNCglcmJwKSwlZWJ4CisJbW92bAk4KCVyYnApLCVlY3gKKwltb3ZsCTEyKCVyYnApLCVlZHgKKwlqegkuTGNiY19zbG93X2VuY190YWlsCisKKy5hbGlnbgk0CisuTGNiY19zbG93X2VuY19sb29wOgorCXhvcmwJMCglcjgpLCVlYXgKKwl4b3JsCTQoJXI4KSwlZWJ4CisJeG9ybAk4KCVyOCksJWVjeAorCXhvcmwJMTIoJXI4KSwlZWR4CisJbW92cQkwKCVyc3ApLCVyMTUKKwltb3ZxCSVyOCwyNCglcnNwKQorCW1vdnEJJXI5LDMyKCVyc3ApCisJbW92cQklcjEwLDQwKCVyc3ApCisKKwljYWxsCV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdAorCisJbW92cQkyNCglcnNwKSwlcjgKKwltb3ZxCTMyKCVyc3ApLCVyOQorCW1vdnEJNDAoJXJzcCksJXIxMAorCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKwlsZWFxCTE2KCVyOCksJXI4CisJbGVhcQkxNiglcjkpLCVyOQorCXN1YnEJJDE2LCVyMTAKKwl0ZXN0cQkkLTE2LCVyMTAKKwlqbnoJLkxjYmNfc2xvd19lbmNfbG9vcAorCXRlc3RxCSQxNSwlcjEwCisJam56CS5MY2JjX3Nsb3dfZW5jX3RhaWwKKwltb3ZxCTU2KCVyc3ApLCVyYnAKKwltb3ZsCSVlYXgsMCglcmJwKQorCW1vdmwJJWVieCw0KCVyYnApCisJbW92bAklZWN4LDgoJXJicCkKKwltb3ZsCSVlZHgsMTIoJXJicCkKKworCWptcAkuTGNiY19leGl0CisKKy5hbGlnbgk0CisuTGNiY19zbG93X2VuY190YWlsOgorCW1vdnEJJXJheCwlcjExCisJbW92cQklcmN4LCVyMTIKKwltb3ZxCSVyMTAsJXJjeAorCW1vdnEJJXI4LCVyc2kKKwltb3ZxCSVyOSwlcmRpCisubG9uZwkweDkwNjZBNEYzCisJbW92cQkkMTYsJXJjeAorCXN1YnEJJXIxMCwlcmN4CisJeG9ycQklcmF4LCVyYXgKKy5sb25nCTB4OTA2NkFBRjMKKwltb3ZxCSVyOSwlcjgKKwltb3ZxCSQxNiwlcjEwCisJbW92cQklcjExLCVyYXgKKwltb3ZxCSVyMTIsJXJjeAorCWptcAkuTGNiY19zbG93X2VuY19sb29wCisKKy5hbGlnbgkxNgorLkxTTE9XX0RFQ1JZUFQ6CisJc2hycQkkMywlcmF4CisJYWRkcQklcmF4LCVyMTQKKworCW1vdnEJMCglcmJwKSwlcjExCisJbW92cQk4KCVyYnApLCVyMTIKKwltb3ZxCSVyMTEsMCs2NCglcnNwKQorCW1vdnEJJXIxMiw4KzY0KCVyc3ApCisKKy5hbGlnbgk0CisuTGNiY19zbG93X2RlY19sb29wOgorCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92cQkwKCVyc3ApLCVyMTUKKwltb3ZxCSVyOCwyNCglcnNwKQorCW1vdnEJJXI5LDMyKCVyc3ApCisJbW92cQklcjEwLDQwKCVyc3ApCisKKwljYWxsCV94ODZfNjRfQUVTX2RlY3J5cHRfY29tcGFjdAorCisJbW92cQkyNCglcnNwKSwlcjgKKwltb3ZxCTMyKCVyc3ApLCVyOQorCW1vdnEJNDAoJXJzcCksJXIxMAorCXhvcmwJMCs2NCglcnNwKSwlZWF4CisJeG9ybAk0KzY0KCVyc3ApLCVlYngKKwl4b3JsCTgrNjQoJXJzcCksJWVjeAorCXhvcmwJMTIrNjQoJXJzcCksJWVkeAorCisJbW92cQkwKCVyOCksJXIxMQorCW1vdnEJOCglcjgpLCVyMTIKKwlzdWJxCSQxNiwlcjEwCisJamMJLkxjYmNfc2xvd19kZWNfcGFydGlhbAorCWp6CS5MY2JjX3Nsb3dfZGVjX2RvbmUKKworCW1vdnEJJXIxMSwwKzY0KCVyc3ApCisJbW92cQklcjEyLDgrNjQoJXJzcCkKKworCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKwlsZWFxCTE2KCVyOCksJXI4CisJbGVhcQkxNiglcjkpLCVyOQorCWptcAkuTGNiY19zbG93X2RlY19sb29wCisuTGNiY19zbG93X2RlY19kb25lOgorCW1vdnEJNTYoJXJzcCksJXJkaQorCW1vdnEJJXIxMSwwKCVyZGkpCisJbW92cQklcjEyLDgoJXJkaSkKKworCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKwlqbXAJLkxjYmNfZXhpdAorCisuYWxpZ24JNAorLkxjYmNfc2xvd19kZWNfcGFydGlhbDoKKwltb3ZxCTU2KCVyc3ApLCVyZGkKKwltb3ZxCSVyMTEsMCglcmRpKQorCW1vdnEJJXIxMiw4KCVyZGkpCisKKwltb3ZsCSVlYXgsMCs2NCglcnNwKQorCW1vdmwJJWVieCw0KzY0KCVyc3ApCisJbW92bAklZWN4LDgrNjQoJXJzcCkKKwltb3ZsCSVlZHgsMTIrNjQoJXJzcCkKKworCW1vdnEJJXI5LCVyZGkKKwlsZWFxCTY0KCVyc3ApLCVyc2kKKwlsZWFxCTE2KCVyMTApLCVyY3gKKy5sb25nCTB4OTA2NkE0RjMKKwlqbXAJLkxjYmNfZXhpdAorCisuYWxpZ24JMTYKKy5MY2JjX2V4aXQ6CisJbW92cQkxNiglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw2NAorCW1vdnEJKCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQk4KCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQkxNiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJMjQoJXJzaSksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCTMyKCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQk0MCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJNDgoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhCSVyc3AsMTYKKy5MY2JjX3BvcGZxOgorCXBvcGZxCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CS04CisuY2ZpX3Jlc3RvcmUJNDkKKy5MY2JjX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzX25vaHdfY2JjX2VuY3J5cHQsLi1hZXNfbm9od19jYmNfZW5jcnlwdAorLmFsaWduCTY0CisuTEFFU19UZToKKy5sb25nCTB4YTU2MzYzYzYsMHhhNTYzNjNjNgorLmxvbmcJMHg4NDdjN2NmOCwweDg0N2M3Y2Y4CisubG9uZwkweDk5Nzc3N2VlLDB4OTk3Nzc3ZWUKKy5sb25nCTB4OGQ3YjdiZjYsMHg4ZDdiN2JmNgorLmxvbmcJMHgwZGYyZjJmZiwweDBkZjJmMmZmCisubG9uZwkweGJkNmI2YmQ2LDB4YmQ2YjZiZDYKKy5sb25nCTB4YjE2ZjZmZGUsMHhiMTZmNmZkZQorLmxvbmcJMHg1NGM1YzU5MSwweDU0YzVjNTkxCisubG9uZwkweDUwMzAzMDYwLDB4NTAzMDMwNjAKKy5sb25nCTB4MDMwMTAxMDIsMHgwMzAxMDEwMgorLmxvbmcJMHhhOTY3NjdjZSwweGE5Njc2N2NlCisubG9uZwkweDdkMmIyYjU2LDB4N2QyYjJiNTYKKy5sb25nCTB4MTlmZWZlZTcsMHgxOWZlZmVlNworLmxvbmcJMHg2MmQ3ZDdiNSwweDYyZDdkN2I1CisubG9uZwkweGU2YWJhYjRkLDB4ZTZhYmFiNGQKKy5sb25nCTB4OWE3Njc2ZWMsMHg5YTc2NzZlYworLmxvbmcJMHg0NWNhY2E4ZiwweDQ1Y2FjYThmCisubG9uZwkweDlkODI4MjFmLDB4OWQ4MjgyMWYKKy5sb25nCTB4NDBjOWM5ODksMHg0MGM5Yzk4OQorLmxvbmcJMHg4NzdkN2RmYSwweDg3N2Q3ZGZhCisubG9uZwkweDE1ZmFmYWVmLDB4MTVmYWZhZWYKKy5sb25nCTB4ZWI1OTU5YjIsMHhlYjU5NTliMgorLmxvbmcJMHhjOTQ3NDc4ZSwweGM5NDc0NzhlCisubG9uZwkweDBiZjBmMGZiLDB4MGJmMGYwZmIKKy5sb25nCTB4ZWNhZGFkNDEsMHhlY2FkYWQ0MQorLmxvbmcJMHg2N2Q0ZDRiMywweDY3ZDRkNGIzCisubG9uZwkweGZkYTJhMjVmLDB4ZmRhMmEyNWYKKy5sb25nCTB4ZWFhZmFmNDUsMHhlYWFmYWY0NQorLmxvbmcJMHhiZjljOWMyMywweGJmOWM5YzIzCisubG9uZwkweGY3YTRhNDUzLDB4ZjdhNGE0NTMKKy5sb25nCTB4OTY3MjcyZTQsMHg5NjcyNzJlNAorLmxvbmcJMHg1YmMwYzA5YiwweDViYzBjMDliCisubG9uZwkweGMyYjdiNzc1LDB4YzJiN2I3NzUKKy5sb25nCTB4MWNmZGZkZTEsMHgxY2ZkZmRlMQorLmxvbmcJMHhhZTkzOTMzZCwweGFlOTM5MzNkCisubG9uZwkweDZhMjYyNjRjLDB4NmEyNjI2NGMKKy5sb25nCTB4NWEzNjM2NmMsMHg1YTM2MzY2YworLmxvbmcJMHg0MTNmM2Y3ZSwweDQxM2YzZjdlCisubG9uZwkweDAyZjdmN2Y1LDB4MDJmN2Y3ZjUKKy5sb25nCTB4NGZjY2NjODMsMHg0ZmNjY2M4MworLmxvbmcJMHg1YzM0MzQ2OCwweDVjMzQzNDY4CisubG9uZwkweGY0YTVhNTUxLDB4ZjRhNWE1NTEKKy5sb25nCTB4MzRlNWU1ZDEsMHgzNGU1ZTVkMQorLmxvbmcJMHgwOGYxZjFmOSwweDA4ZjFmMWY5CisubG9uZwkweDkzNzE3MWUyLDB4OTM3MTcxZTIKKy5sb25nCTB4NzNkOGQ4YWIsMHg3M2Q4ZDhhYgorLmxvbmcJMHg1MzMxMzE2MiwweDUzMzEzMTYyCisubG9uZwkweDNmMTUxNTJhLDB4M2YxNTE1MmEKKy5sb25nCTB4MGMwNDA0MDgsMHgwYzA0MDQwOAorLmxvbmcJMHg1MmM3Yzc5NSwweDUyYzdjNzk1CisubG9uZwkweDY1MjMyMzQ2LDB4NjUyMzIzNDYKKy5sb25nCTB4NWVjM2MzOWQsMHg1ZWMzYzM5ZAorLmxvbmcJMHgyODE4MTgzMCwweDI4MTgxODMwCisubG9uZwkweGExOTY5NjM3LDB4YTE5Njk2MzcKKy5sb25nCTB4MGYwNTA1MGEsMHgwZjA1MDUwYQorLmxvbmcJMHhiNTlhOWEyZiwweGI1OWE5YTJmCisubG9uZwkweDA5MDcwNzBlLDB4MDkwNzA3MGUKKy5sb25nCTB4MzYxMjEyMjQsMHgzNjEyMTIyNAorLmxvbmcJMHg5YjgwODAxYiwweDliODA4MDFiCisubG9uZwkweDNkZTJlMmRmLDB4M2RlMmUyZGYKKy5sb25nCTB4MjZlYmViY2QsMHgyNmViZWJjZAorLmxvbmcJMHg2OTI3Mjc0ZSwweDY5MjcyNzRlCisubG9uZwkweGNkYjJiMjdmLDB4Y2RiMmIyN2YKKy5sb25nCTB4OWY3NTc1ZWEsMHg5Zjc1NzVlYQorLmxvbmcJMHgxYjA5MDkxMiwweDFiMDkwOTEyCisubG9uZwkweDllODM4MzFkLDB4OWU4MzgzMWQKKy5sb25nCTB4NzQyYzJjNTgsMHg3NDJjMmM1OAorLmxvbmcJMHgyZTFhMWEzNCwweDJlMWExYTM0CisubG9uZwkweDJkMWIxYjM2LDB4MmQxYjFiMzYKKy5sb25nCTB4YjI2ZTZlZGMsMHhiMjZlNmVkYworLmxvbmcJMHhlZTVhNWFiNCwweGVlNWE1YWI0CisubG9uZwkweGZiYTBhMDViLDB4ZmJhMGEwNWIKKy5sb25nCTB4ZjY1MjUyYTQsMHhmNjUyNTJhNAorLmxvbmcJMHg0ZDNiM2I3NiwweDRkM2IzYjc2CisubG9uZwkweDYxZDZkNmI3LDB4NjFkNmQ2YjcKKy5sb25nCTB4Y2ViM2IzN2QsMHhjZWIzYjM3ZAorLmxvbmcJMHg3YjI5Mjk1MiwweDdiMjkyOTUyCisubG9uZwkweDNlZTNlM2RkLDB4M2VlM2UzZGQKKy5sb25nCTB4NzEyZjJmNWUsMHg3MTJmMmY1ZQorLmxvbmcJMHg5Nzg0ODQxMywweDk3ODQ4NDEzCisubG9uZwkweGY1NTM1M2E2LDB4ZjU1MzUzYTYKKy5sb25nCTB4NjhkMWQxYjksMHg2OGQxZDFiOQorLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisubG9uZwkweDJjZWRlZGMxLDB4MmNlZGVkYzEKKy5sb25nCTB4NjAyMDIwNDAsMHg2MDIwMjA0MAorLmxvbmcJMHgxZmZjZmNlMywweDFmZmNmY2UzCisubG9uZwkweGM4YjFiMTc5LDB4YzhiMWIxNzkKKy5sb25nCTB4ZWQ1YjViYjYsMHhlZDViNWJiNgorLmxvbmcJMHhiZTZhNmFkNCwweGJlNmE2YWQ0CisubG9uZwkweDQ2Y2JjYjhkLDB4NDZjYmNiOGQKKy5sb25nCTB4ZDliZWJlNjcsMHhkOWJlYmU2NworLmxvbmcJMHg0YjM5Mzk3MiwweDRiMzkzOTcyCisubG9uZwkweGRlNGE0YTk0LDB4ZGU0YTRhOTQKKy5sb25nCTB4ZDQ0YzRjOTgsMHhkNDRjNGM5OAorLmxvbmcJMHhlODU4NThiMCwweGU4NTg1OGIwCisubG9uZwkweDRhY2ZjZjg1LDB4NGFjZmNmODUKKy5sb25nCTB4NmJkMGQwYmIsMHg2YmQwZDBiYgorLmxvbmcJMHgyYWVmZWZjNSwweDJhZWZlZmM1CisubG9uZwkweGU1YWFhYTRmLDB4ZTVhYWFhNGYKKy5sb25nCTB4MTZmYmZiZWQsMHgxNmZiZmJlZAorLmxvbmcJMHhjNTQzNDM4NiwweGM1NDM0Mzg2CisubG9uZwkweGQ3NGQ0ZDlhLDB4ZDc0ZDRkOWEKKy5sb25nCTB4NTUzMzMzNjYsMHg1NTMzMzM2NgorLmxvbmcJMHg5NDg1ODUxMSwweDk0ODU4NTExCisubG9uZwkweGNmNDU0NThhLDB4Y2Y0NTQ1OGEKKy5sb25nCTB4MTBmOWY5ZTksMHgxMGY5ZjllOQorLmxvbmcJMHgwNjAyMDIwNCwweDA2MDIwMjA0CisubG9uZwkweDgxN2Y3ZmZlLDB4ODE3ZjdmZmUKKy5sb25nCTB4ZjA1MDUwYTAsMHhmMDUwNTBhMAorLmxvbmcJMHg0NDNjM2M3OCwweDQ0M2MzYzc4CisubG9uZwkweGJhOWY5ZjI1LDB4YmE5ZjlmMjUKKy5sb25nCTB4ZTNhOGE4NGIsMHhlM2E4YTg0YgorLmxvbmcJMHhmMzUxNTFhMiwweGYzNTE1MWEyCisubG9uZwkweGZlYTNhMzVkLDB4ZmVhM2EzNWQKKy5sb25nCTB4YzA0MDQwODAsMHhjMDQwNDA4MAorLmxvbmcJMHg4YThmOGYwNSwweDhhOGY4ZjA1CisubG9uZwkweGFkOTI5MjNmLDB4YWQ5MjkyM2YKKy5sb25nCTB4YmM5ZDlkMjEsMHhiYzlkOWQyMQorLmxvbmcJMHg0ODM4Mzg3MCwweDQ4MzgzODcwCisubG9uZwkweDA0ZjVmNWYxLDB4MDRmNWY1ZjEKKy5sb25nCTB4ZGZiY2JjNjMsMHhkZmJjYmM2MworLmxvbmcJMHhjMWI2YjY3NywweGMxYjZiNjc3CisubG9uZwkweDc1ZGFkYWFmLDB4NzVkYWRhYWYKKy5sb25nCTB4NjMyMTIxNDIsMHg2MzIxMjE0MgorLmxvbmcJMHgzMDEwMTAyMCwweDMwMTAxMDIwCisubG9uZwkweDFhZmZmZmU1LDB4MWFmZmZmZTUKKy5sb25nCTB4MGVmM2YzZmQsMHgwZWYzZjNmZAorLmxvbmcJMHg2ZGQyZDJiZiwweDZkZDJkMmJmCisubG9uZwkweDRjY2RjZDgxLDB4NGNjZGNkODEKKy5sb25nCTB4MTQwYzBjMTgsMHgxNDBjMGMxOAorLmxvbmcJMHgzNTEzMTMyNiwweDM1MTMxMzI2CisubG9uZwkweDJmZWNlY2MzLDB4MmZlY2VjYzMKKy5sb25nCTB4ZTE1ZjVmYmUsMHhlMTVmNWZiZQorLmxvbmcJMHhhMjk3OTczNSwweGEyOTc5NzM1CisubG9uZwkweGNjNDQ0NDg4LDB4Y2M0NDQ0ODgKKy5sb25nCTB4MzkxNzE3MmUsMHgzOTE3MTcyZQorLmxvbmcJMHg1N2M0YzQ5MywweDU3YzRjNDkzCisubG9uZwkweGYyYTdhNzU1LDB4ZjJhN2E3NTUKKy5sb25nCTB4ODI3ZTdlZmMsMHg4MjdlN2VmYworLmxvbmcJMHg0NzNkM2Q3YSwweDQ3M2QzZDdhCisubG9uZwkweGFjNjQ2NGM4LDB4YWM2NDY0YzgKKy5sb25nCTB4ZTc1ZDVkYmEsMHhlNzVkNWRiYQorLmxvbmcJMHgyYjE5MTkzMiwweDJiMTkxOTMyCisubG9uZwkweDk1NzM3M2U2LDB4OTU3MzczZTYKKy5sb25nCTB4YTA2MDYwYzAsMHhhMDYwNjBjMAorLmxvbmcJMHg5ODgxODExOSwweDk4ODE4MTE5CisubG9uZwkweGQxNGY0ZjllLDB4ZDE0ZjRmOWUKKy5sb25nCTB4N2ZkY2RjYTMsMHg3ZmRjZGNhMworLmxvbmcJMHg2NjIyMjI0NCwweDY2MjIyMjQ0CisubG9uZwkweDdlMmEyYTU0LDB4N2UyYTJhNTQKKy5sb25nCTB4YWI5MDkwM2IsMHhhYjkwOTAzYgorLmxvbmcJMHg4Mzg4ODgwYiwweDgzODg4ODBiCisubG9uZwkweGNhNDY0NjhjLDB4Y2E0NjQ2OGMKKy5sb25nCTB4MjllZWVlYzcsMHgyOWVlZWVjNworLmxvbmcJMHhkM2I4Yjg2YiwweGQzYjhiODZiCisubG9uZwkweDNjMTQxNDI4LDB4M2MxNDE0MjgKKy5sb25nCTB4NzlkZWRlYTcsMHg3OWRlZGVhNworLmxvbmcJMHhlMjVlNWViYywweGUyNWU1ZWJjCisubG9uZwkweDFkMGIwYjE2LDB4MWQwYjBiMTYKKy5sb25nCTB4NzZkYmRiYWQsMHg3NmRiZGJhZAorLmxvbmcJMHgzYmUwZTBkYiwweDNiZTBlMGRiCisubG9uZwkweDU2MzIzMjY0LDB4NTYzMjMyNjQKKy5sb25nCTB4NGUzYTNhNzQsMHg0ZTNhM2E3NAorLmxvbmcJMHgxZTBhMGExNCwweDFlMGEwYTE0CisubG9uZwkweGRiNDk0OTkyLDB4ZGI0OTQ5OTIKKy5sb25nCTB4MGEwNjA2MGMsMHgwYTA2MDYwYworLmxvbmcJMHg2YzI0MjQ0OCwweDZjMjQyNDQ4CisubG9uZwkweGU0NWM1Y2I4LDB4ZTQ1YzVjYjgKKy5sb25nCTB4NWRjMmMyOWYsMHg1ZGMyYzI5ZgorLmxvbmcJMHg2ZWQzZDNiZCwweDZlZDNkM2JkCisubG9uZwkweGVmYWNhYzQzLDB4ZWZhY2FjNDMKKy5sb25nCTB4YTY2MjYyYzQsMHhhNjYyNjJjNAorLmxvbmcJMHhhODkxOTEzOSwweGE4OTE5MTM5CisubG9uZwkweGE0OTU5NTMxLDB4YTQ5NTk1MzEKKy5sb25nCTB4MzdlNGU0ZDMsMHgzN2U0ZTRkMworLmxvbmcJMHg4Yjc5NzlmMiwweDhiNzk3OWYyCisubG9uZwkweDMyZTdlN2Q1LDB4MzJlN2U3ZDUKKy5sb25nCTB4NDNjOGM4OGIsMHg0M2M4Yzg4YgorLmxvbmcJMHg1OTM3Mzc2ZSwweDU5MzczNzZlCisubG9uZwkweGI3NmQ2ZGRhLDB4Yjc2ZDZkZGEKKy5sb25nCTB4OGM4ZDhkMDEsMHg4YzhkOGQwMQorLmxvbmcJMHg2NGQ1ZDViMSwweDY0ZDVkNWIxCisubG9uZwkweGQyNGU0ZTljLDB4ZDI0ZTRlOWMKKy5sb25nCTB4ZTBhOWE5NDksMHhlMGE5YTk0OQorLmxvbmcJMHhiNDZjNmNkOCwweGI0NmM2Y2Q4CisubG9uZwkweGZhNTY1NmFjLDB4ZmE1NjU2YWMKKy5sb25nCTB4MDdmNGY0ZjMsMHgwN2Y0ZjRmMworLmxvbmcJMHgyNWVhZWFjZiwweDI1ZWFlYWNmCisubG9uZwkweGFmNjU2NWNhLDB4YWY2NTY1Y2EKKy5sb25nCTB4OGU3YTdhZjQsMHg4ZTdhN2FmNAorLmxvbmcJMHhlOWFlYWU0NywweGU5YWVhZTQ3CisubG9uZwkweDE4MDgwODEwLDB4MTgwODA4MTAKKy5sb25nCTB4ZDViYWJhNmYsMHhkNWJhYmE2ZgorLmxvbmcJMHg4ODc4NzhmMCwweDg4Nzg3OGYwCisubG9uZwkweDZmMjUyNTRhLDB4NmYyNTI1NGEKKy5sb25nCTB4NzIyZTJlNWMsMHg3MjJlMmU1YworLmxvbmcJMHgyNDFjMWMzOCwweDI0MWMxYzM4CisubG9uZwkweGYxYTZhNjU3LDB4ZjFhNmE2NTcKKy5sb25nCTB4YzdiNGI0NzMsMHhjN2I0YjQ3MworLmxvbmcJMHg1MWM2YzY5NywweDUxYzZjNjk3CisubG9uZwkweDIzZThlOGNiLDB4MjNlOGU4Y2IKKy5sb25nCTB4N2NkZGRkYTEsMHg3Y2RkZGRhMQorLmxvbmcJMHg5Yzc0NzRlOCwweDljNzQ3NGU4CisubG9uZwkweDIxMWYxZjNlLDB4MjExZjFmM2UKKy5sb25nCTB4ZGQ0YjRiOTYsMHhkZDRiNGI5NgorLmxvbmcJMHhkY2JkYmQ2MSwweGRjYmRiZDYxCisubG9uZwkweDg2OGI4YjBkLDB4ODY4YjhiMGQKKy5sb25nCTB4ODU4YThhMGYsMHg4NThhOGEwZgorLmxvbmcJMHg5MDcwNzBlMCwweDkwNzA3MGUwCisubG9uZwkweDQyM2UzZTdjLDB4NDIzZTNlN2MKKy5sb25nCTB4YzRiNWI1NzEsMHhjNGI1YjU3MQorLmxvbmcJMHhhYTY2NjZjYywweGFhNjY2NmNjCisubG9uZwkweGQ4NDg0ODkwLDB4ZDg0ODQ4OTAKKy5sb25nCTB4MDUwMzAzMDYsMHgwNTAzMDMwNgorLmxvbmcJMHgwMWY2ZjZmNywweDAxZjZmNmY3CisubG9uZwkweDEyMGUwZTFjLDB4MTIwZTBlMWMKKy5sb25nCTB4YTM2MTYxYzIsMHhhMzYxNjFjMgorLmxvbmcJMHg1ZjM1MzU2YSwweDVmMzUzNTZhCisubG9uZwkweGY5NTc1N2FlLDB4Zjk1NzU3YWUKKy5sb25nCTB4ZDBiOWI5NjksMHhkMGI5Yjk2OQorLmxvbmcJMHg5MTg2ODYxNywweDkxODY4NjE3CisubG9uZwkweDU4YzFjMTk5LDB4NThjMWMxOTkKKy5sb25nCTB4MjcxZDFkM2EsMHgyNzFkMWQzYQorLmxvbmcJMHhiOTllOWUyNywweGI5OWU5ZTI3CisubG9uZwkweDM4ZTFlMWQ5LDB4MzhlMWUxZDkKKy5sb25nCTB4MTNmOGY4ZWIsMHgxM2Y4ZjhlYgorLmxvbmcJMHhiMzk4OTgyYiwweGIzOTg5ODJiCisubG9uZwkweDMzMTExMTIyLDB4MzMxMTExMjIKKy5sb25nCTB4YmI2OTY5ZDIsMHhiYjY5NjlkMgorLmxvbmcJMHg3MGQ5ZDlhOSwweDcwZDlkOWE5CisubG9uZwkweDg5OGU4ZTA3LDB4ODk4ZThlMDcKKy5sb25nCTB4YTc5NDk0MzMsMHhhNzk0OTQzMworLmxvbmcJMHhiNjliOWIyZCwweGI2OWI5YjJkCisubG9uZwkweDIyMWUxZTNjLDB4MjIxZTFlM2MKKy5sb25nCTB4OTI4Nzg3MTUsMHg5Mjg3ODcxNQorLmxvbmcJMHgyMGU5ZTljOSwweDIwZTllOWM5CisubG9uZwkweDQ5Y2VjZTg3LDB4NDljZWNlODcKKy5sb25nCTB4ZmY1NTU1YWEsMHhmZjU1NTVhYQorLmxvbmcJMHg3ODI4Mjg1MCwweDc4MjgyODUwCisubG9uZwkweDdhZGZkZmE1LDB4N2FkZmRmYTUKKy5sb25nCTB4OGY4YzhjMDMsMHg4ZjhjOGMwMworLmxvbmcJMHhmOGExYTE1OSwweGY4YTFhMTU5CisubG9uZwkweDgwODk4OTA5LDB4ODA4OTg5MDkKKy5sb25nCTB4MTcwZDBkMWEsMHgxNzBkMGQxYQorLmxvbmcJMHhkYWJmYmY2NSwweGRhYmZiZjY1CisubG9uZwkweDMxZTZlNmQ3LDB4MzFlNmU2ZDcKKy5sb25nCTB4YzY0MjQyODQsMHhjNjQyNDI4NAorLmxvbmcJMHhiODY4NjhkMCwweGI4Njg2OGQwCisubG9uZwkweGMzNDE0MTgyLDB4YzM0MTQxODIKKy5sb25nCTB4YjA5OTk5MjksMHhiMDk5OTkyOQorLmxvbmcJMHg3NzJkMmQ1YSwweDc3MmQyZDVhCisubG9uZwkweDExMGYwZjFlLDB4MTEwZjBmMWUKKy5sb25nCTB4Y2JiMGIwN2IsMHhjYmIwYjA3YgorLmxvbmcJMHhmYzU0NTRhOCwweGZjNTQ1NGE4CisubG9uZwkweGQ2YmJiYjZkLDB4ZDZiYmJiNmQKKy5sb25nCTB4M2ExNjE2MmMsMHgzYTE2MTYyYworLmJ5dGUJMHg2MywweDdjLDB4NzcsMHg3YiwweGYyLDB4NmIsMHg2ZiwweGM1CisuYnl0ZQkweDMwLDB4MDEsMHg2NywweDJiLDB4ZmUsMHhkNywweGFiLDB4NzYKKy5ieXRlCTB4Y2EsMHg4MiwweGM5LDB4N2QsMHhmYSwweDU5LDB4NDcsMHhmMAorLmJ5dGUJMHhhZCwweGQ0LDB4YTIsMHhhZiwweDljLDB4YTQsMHg3MiwweGMwCisuYnl0ZQkweGI3LDB4ZmQsMHg5MywweDI2LDB4MzYsMHgzZiwweGY3LDB4Y2MKKy5ieXRlCTB4MzQsMHhhNSwweGU1LDB4ZjEsMHg3MSwweGQ4LDB4MzEsMHgxNQorLmJ5dGUJMHgwNCwweGM3LDB4MjMsMHhjMywweDE4LDB4OTYsMHgwNSwweDlhCisuYnl0ZQkweDA3LDB4MTIsMHg4MCwweGUyLDB4ZWIsMHgyNywweGIyLDB4NzUKKy5ieXRlCTB4MDksMHg4MywweDJjLDB4MWEsMHgxYiwweDZlLDB4NWEsMHhhMAorLmJ5dGUJMHg1MiwweDNiLDB4ZDYsMHhiMywweDI5LDB4ZTMsMHgyZiwweDg0CisuYnl0ZQkweDUzLDB4ZDEsMHgwMCwweGVkLDB4MjAsMHhmYywweGIxLDB4NWIKKy5ieXRlCTB4NmEsMHhjYiwweGJlLDB4MzksMHg0YSwweDRjLDB4NTgsMHhjZgorLmJ5dGUJMHhkMCwweGVmLDB4YWEsMHhmYiwweDQzLDB4NGQsMHgzMywweDg1CisuYnl0ZQkweDQ1LDB4ZjksMHgwMiwweDdmLDB4NTAsMHgzYywweDlmLDB4YTgKKy5ieXRlCTB4NTEsMHhhMywweDQwLDB4OGYsMHg5MiwweDlkLDB4MzgsMHhmNQorLmJ5dGUJMHhiYywweGI2LDB4ZGEsMHgyMSwweDEwLDB4ZmYsMHhmMywweGQyCisuYnl0ZQkweGNkLDB4MGMsMHgxMywweGVjLDB4NWYsMHg5NywweDQ0LDB4MTcKKy5ieXRlCTB4YzQsMHhhNywweDdlLDB4M2QsMHg2NCwweDVkLDB4MTksMHg3MworLmJ5dGUJMHg2MCwweDgxLDB4NGYsMHhkYywweDIyLDB4MmEsMHg5MCwweDg4CisuYnl0ZQkweDQ2LDB4ZWUsMHhiOCwweDE0LDB4ZGUsMHg1ZSwweDBiLDB4ZGIKKy5ieXRlCTB4ZTAsMHgzMiwweDNhLDB4MGEsMHg0OSwweDA2LDB4MjQsMHg1YworLmJ5dGUJMHhjMiwweGQzLDB4YWMsMHg2MiwweDkxLDB4OTUsMHhlNCwweDc5CisuYnl0ZQkweGU3LDB4YzgsMHgzNywweDZkLDB4OGQsMHhkNSwweDRlLDB4YTkKKy5ieXRlCTB4NmMsMHg1NiwweGY0LDB4ZWEsMHg2NSwweDdhLDB4YWUsMHgwOAorLmJ5dGUJMHhiYSwweDc4LDB4MjUsMHgyZSwweDFjLDB4YTYsMHhiNCwweGM2CisuYnl0ZQkweGU4LDB4ZGQsMHg3NCwweDFmLDB4NGIsMHhiZCwweDhiLDB4OGEKKy5ieXRlCTB4NzAsMHgzZSwweGI1LDB4NjYsMHg0OCwweDAzLDB4ZjYsMHgwZQorLmJ5dGUJMHg2MSwweDM1LDB4NTcsMHhiOSwweDg2LDB4YzEsMHgxZCwweDllCisuYnl0ZQkweGUxLDB4ZjgsMHg5OCwweDExLDB4NjksMHhkOSwweDhlLDB4OTQKKy5ieXRlCTB4OWIsMHgxZSwweDg3LDB4ZTksMHhjZSwweDU1LDB4MjgsMHhkZgorLmJ5dGUJMHg4YywweGExLDB4ODksMHgwZCwweGJmLDB4ZTYsMHg0MiwweDY4CisuYnl0ZQkweDQxLDB4OTksMHgyZCwweDBmLDB4YjAsMHg1NCwweGJiLDB4MTYKKy5ieXRlCTB4NjMsMHg3YywweDc3LDB4N2IsMHhmMiwweDZiLDB4NmYsMHhjNQorLmJ5dGUJMHgzMCwweDAxLDB4NjcsMHgyYiwweGZlLDB4ZDcsMHhhYiwweDc2CisuYnl0ZQkweGNhLDB4ODIsMHhjOSwweDdkLDB4ZmEsMHg1OSwweDQ3LDB4ZjAKKy5ieXRlCTB4YWQsMHhkNCwweGEyLDB4YWYsMHg5YywweGE0LDB4NzIsMHhjMAorLmJ5dGUJMHhiNywweGZkLDB4OTMsMHgyNiwweDM2LDB4M2YsMHhmNywweGNjCisuYnl0ZQkweDM0LDB4YTUsMHhlNSwweGYxLDB4NzEsMHhkOCwweDMxLDB4MTUKKy5ieXRlCTB4MDQsMHhjNywweDIzLDB4YzMsMHgxOCwweDk2LDB4MDUsMHg5YQorLmJ5dGUJMHgwNywweDEyLDB4ODAsMHhlMiwweGViLDB4MjcsMHhiMiwweDc1CisuYnl0ZQkweDA5LDB4ODMsMHgyYywweDFhLDB4MWIsMHg2ZSwweDVhLDB4YTAKKy5ieXRlCTB4NTIsMHgzYiwweGQ2LDB4YjMsMHgyOSwweGUzLDB4MmYsMHg4NAorLmJ5dGUJMHg1MywweGQxLDB4MDAsMHhlZCwweDIwLDB4ZmMsMHhiMSwweDViCisuYnl0ZQkweDZhLDB4Y2IsMHhiZSwweDM5LDB4NGEsMHg0YywweDU4LDB4Y2YKKy5ieXRlCTB4ZDAsMHhlZiwweGFhLDB4ZmIsMHg0MywweDRkLDB4MzMsMHg4NQorLmJ5dGUJMHg0NSwweGY5LDB4MDIsMHg3ZiwweDUwLDB4M2MsMHg5ZiwweGE4CisuYnl0ZQkweDUxLDB4YTMsMHg0MCwweDhmLDB4OTIsMHg5ZCwweDM4LDB4ZjUKKy5ieXRlCTB4YmMsMHhiNiwweGRhLDB4MjEsMHgxMCwweGZmLDB4ZjMsMHhkMgorLmJ5dGUJMHhjZCwweDBjLDB4MTMsMHhlYywweDVmLDB4OTcsMHg0NCwweDE3CisuYnl0ZQkweGM0LDB4YTcsMHg3ZSwweDNkLDB4NjQsMHg1ZCwweDE5LDB4NzMKKy5ieXRlCTB4NjAsMHg4MSwweDRmLDB4ZGMsMHgyMiwweDJhLDB4OTAsMHg4OAorLmJ5dGUJMHg0NiwweGVlLDB4YjgsMHgxNCwweGRlLDB4NWUsMHgwYiwweGRiCisuYnl0ZQkweGUwLDB4MzIsMHgzYSwweDBhLDB4NDksMHgwNiwweDI0LDB4NWMKKy5ieXRlCTB4YzIsMHhkMywweGFjLDB4NjIsMHg5MSwweDk1LDB4ZTQsMHg3OQorLmJ5dGUJMHhlNywweGM4LDB4MzcsMHg2ZCwweDhkLDB4ZDUsMHg0ZSwweGE5CisuYnl0ZQkweDZjLDB4NTYsMHhmNCwweGVhLDB4NjUsMHg3YSwweGFlLDB4MDgKKy5ieXRlCTB4YmEsMHg3OCwweDI1LDB4MmUsMHgxYywweGE2LDB4YjQsMHhjNgorLmJ5dGUJMHhlOCwweGRkLDB4NzQsMHgxZiwweDRiLDB4YmQsMHg4YiwweDhhCisuYnl0ZQkweDcwLDB4M2UsMHhiNSwweDY2LDB4NDgsMHgwMywweGY2LDB4MGUKKy5ieXRlCTB4NjEsMHgzNSwweDU3LDB4YjksMHg4NiwweGMxLDB4MWQsMHg5ZQorLmJ5dGUJMHhlMSwweGY4LDB4OTgsMHgxMSwweDY5LDB4ZDksMHg4ZSwweDk0CisuYnl0ZQkweDliLDB4MWUsMHg4NywweGU5LDB4Y2UsMHg1NSwweDI4LDB4ZGYKKy5ieXRlCTB4OGMsMHhhMSwweDg5LDB4MGQsMHhiZiwweGU2LDB4NDIsMHg2OAorLmJ5dGUJMHg0MSwweDk5LDB4MmQsMHgwZiwweGIwLDB4NTQsMHhiYiwweDE2CisuYnl0ZQkweDYzLDB4N2MsMHg3NywweDdiLDB4ZjIsMHg2YiwweDZmLDB4YzUKKy5ieXRlCTB4MzAsMHgwMSwweDY3LDB4MmIsMHhmZSwweGQ3LDB4YWIsMHg3NgorLmJ5dGUJMHhjYSwweDgyLDB4YzksMHg3ZCwweGZhLDB4NTksMHg0NywweGYwCisuYnl0ZQkweGFkLDB4ZDQsMHhhMiwweGFmLDB4OWMsMHhhNCwweDcyLDB4YzAKKy5ieXRlCTB4YjcsMHhmZCwweDkzLDB4MjYsMHgzNiwweDNmLDB4ZjcsMHhjYworLmJ5dGUJMHgzNCwweGE1LDB4ZTUsMHhmMSwweDcxLDB4ZDgsMHgzMSwweDE1CisuYnl0ZQkweDA0LDB4YzcsMHgyMywweGMzLDB4MTgsMHg5NiwweDA1LDB4OWEKKy5ieXRlCTB4MDcsMHgxMiwweDgwLDB4ZTIsMHhlYiwweDI3LDB4YjIsMHg3NQorLmJ5dGUJMHgwOSwweDgzLDB4MmMsMHgxYSwweDFiLDB4NmUsMHg1YSwweGEwCisuYnl0ZQkweDUyLDB4M2IsMHhkNiwweGIzLDB4MjksMHhlMywweDJmLDB4ODQKKy5ieXRlCTB4NTMsMHhkMSwweDAwLDB4ZWQsMHgyMCwweGZjLDB4YjEsMHg1YgorLmJ5dGUJMHg2YSwweGNiLDB4YmUsMHgzOSwweDRhLDB4NGMsMHg1OCwweGNmCisuYnl0ZQkweGQwLDB4ZWYsMHhhYSwweGZiLDB4NDMsMHg0ZCwweDMzLDB4ODUKKy5ieXRlCTB4NDUsMHhmOSwweDAyLDB4N2YsMHg1MCwweDNjLDB4OWYsMHhhOAorLmJ5dGUJMHg1MSwweGEzLDB4NDAsMHg4ZiwweDkyLDB4OWQsMHgzOCwweGY1CisuYnl0ZQkweGJjLDB4YjYsMHhkYSwweDIxLDB4MTAsMHhmZiwweGYzLDB4ZDIKKy5ieXRlCTB4Y2QsMHgwYywweDEzLDB4ZWMsMHg1ZiwweDk3LDB4NDQsMHgxNworLmJ5dGUJMHhjNCwweGE3LDB4N2UsMHgzZCwweDY0LDB4NWQsMHgxOSwweDczCisuYnl0ZQkweDYwLDB4ODEsMHg0ZiwweGRjLDB4MjIsMHgyYSwweDkwLDB4ODgKKy5ieXRlCTB4NDYsMHhlZSwweGI4LDB4MTQsMHhkZSwweDVlLDB4MGIsMHhkYgorLmJ5dGUJMHhlMCwweDMyLDB4M2EsMHgwYSwweDQ5LDB4MDYsMHgyNCwweDVjCisuYnl0ZQkweGMyLDB4ZDMsMHhhYywweDYyLDB4OTEsMHg5NSwweGU0LDB4NzkKKy5ieXRlCTB4ZTcsMHhjOCwweDM3LDB4NmQsMHg4ZCwweGQ1LDB4NGUsMHhhOQorLmJ5dGUJMHg2YywweDU2LDB4ZjQsMHhlYSwweDY1LDB4N2EsMHhhZSwweDA4CisuYnl0ZQkweGJhLDB4NzgsMHgyNSwweDJlLDB4MWMsMHhhNiwweGI0LDB4YzYKKy5ieXRlCTB4ZTgsMHhkZCwweDc0LDB4MWYsMHg0YiwweGJkLDB4OGIsMHg4YQorLmJ5dGUJMHg3MCwweDNlLDB4YjUsMHg2NiwweDQ4LDB4MDMsMHhmNiwweDBlCisuYnl0ZQkweDYxLDB4MzUsMHg1NywweGI5LDB4ODYsMHhjMSwweDFkLDB4OWUKKy5ieXRlCTB4ZTEsMHhmOCwweDk4LDB4MTEsMHg2OSwweGQ5LDB4OGUsMHg5NAorLmJ5dGUJMHg5YiwweDFlLDB4ODcsMHhlOSwweGNlLDB4NTUsMHgyOCwweGRmCisuYnl0ZQkweDhjLDB4YTEsMHg4OSwweDBkLDB4YmYsMHhlNiwweDQyLDB4NjgKKy5ieXRlCTB4NDEsMHg5OSwweDJkLDB4MGYsMHhiMCwweDU0LDB4YmIsMHgxNgorLmJ5dGUJMHg2MywweDdjLDB4NzcsMHg3YiwweGYyLDB4NmIsMHg2ZiwweGM1CisuYnl0ZQkweDMwLDB4MDEsMHg2NywweDJiLDB4ZmUsMHhkNywweGFiLDB4NzYKKy5ieXRlCTB4Y2EsMHg4MiwweGM5LDB4N2QsMHhmYSwweDU5LDB4NDcsMHhmMAorLmJ5dGUJMHhhZCwweGQ0LDB4YTIsMHhhZiwweDljLDB4YTQsMHg3MiwweGMwCisuYnl0ZQkweGI3LDB4ZmQsMHg5MywweDI2LDB4MzYsMHgzZiwweGY3LDB4Y2MKKy5ieXRlCTB4MzQsMHhhNSwweGU1LDB4ZjEsMHg3MSwweGQ4LDB4MzEsMHgxNQorLmJ5dGUJMHgwNCwweGM3LDB4MjMsMHhjMywweDE4LDB4OTYsMHgwNSwweDlhCisuYnl0ZQkweDA3LDB4MTIsMHg4MCwweGUyLDB4ZWIsMHgyNywweGIyLDB4NzUKKy5ieXRlCTB4MDksMHg4MywweDJjLDB4MWEsMHgxYiwweDZlLDB4NWEsMHhhMAorLmJ5dGUJMHg1MiwweDNiLDB4ZDYsMHhiMywweDI5LDB4ZTMsMHgyZiwweDg0CisuYnl0ZQkweDUzLDB4ZDEsMHgwMCwweGVkLDB4MjAsMHhmYywweGIxLDB4NWIKKy5ieXRlCTB4NmEsMHhjYiwweGJlLDB4MzksMHg0YSwweDRjLDB4NTgsMHhjZgorLmJ5dGUJMHhkMCwweGVmLDB4YWEsMHhmYiwweDQzLDB4NGQsMHgzMywweDg1CisuYnl0ZQkweDQ1LDB4ZjksMHgwMiwweDdmLDB4NTAsMHgzYywweDlmLDB4YTgKKy5ieXRlCTB4NTEsMHhhMywweDQwLDB4OGYsMHg5MiwweDlkLDB4MzgsMHhmNQorLmJ5dGUJMHhiYywweGI2LDB4ZGEsMHgyMSwweDEwLDB4ZmYsMHhmMywweGQyCisuYnl0ZQkweGNkLDB4MGMsMHgxMywweGVjLDB4NWYsMHg5NywweDQ0LDB4MTcKKy5ieXRlCTB4YzQsMHhhNywweDdlLDB4M2QsMHg2NCwweDVkLDB4MTksMHg3MworLmJ5dGUJMHg2MCwweDgxLDB4NGYsMHhkYywweDIyLDB4MmEsMHg5MCwweDg4CisuYnl0ZQkweDQ2LDB4ZWUsMHhiOCwweDE0LDB4ZGUsMHg1ZSwweDBiLDB4ZGIKKy5ieXRlCTB4ZTAsMHgzMiwweDNhLDB4MGEsMHg0OSwweDA2LDB4MjQsMHg1YworLmJ5dGUJMHhjMiwweGQzLDB4YWMsMHg2MiwweDkxLDB4OTUsMHhlNCwweDc5CisuYnl0ZQkweGU3LDB4YzgsMHgzNywweDZkLDB4OGQsMHhkNSwweDRlLDB4YTkKKy5ieXRlCTB4NmMsMHg1NiwweGY0LDB4ZWEsMHg2NSwweDdhLDB4YWUsMHgwOAorLmJ5dGUJMHhiYSwweDc4LDB4MjUsMHgyZSwweDFjLDB4YTYsMHhiNCwweGM2CisuYnl0ZQkweGU4LDB4ZGQsMHg3NCwweDFmLDB4NGIsMHhiZCwweDhiLDB4OGEKKy5ieXRlCTB4NzAsMHgzZSwweGI1LDB4NjYsMHg0OCwweDAzLDB4ZjYsMHgwZQorLmJ5dGUJMHg2MSwweDM1LDB4NTcsMHhiOSwweDg2LDB4YzEsMHgxZCwweDllCisuYnl0ZQkweGUxLDB4ZjgsMHg5OCwweDExLDB4NjksMHhkOSwweDhlLDB4OTQKKy5ieXRlCTB4OWIsMHgxZSwweDg3LDB4ZTksMHhjZSwweDU1LDB4MjgsMHhkZgorLmJ5dGUJMHg4YywweGExLDB4ODksMHgwZCwweGJmLDB4ZTYsMHg0MiwweDY4CisuYnl0ZQkweDQxLDB4OTksMHgyZCwweDBmLDB4YjAsMHg1NCwweGJiLDB4MTYKKy5sb25nCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgKKy5sb25nCTB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODAKKy5sb25nCTB4MDAwMDAwMWIsIDB4MDAwMDAwMzYsIDB4ODA4MDgwODAsIDB4ODA4MDgwODAKKy5sb25nCTB4ZmVmZWZlZmUsIDB4ZmVmZWZlZmUsIDB4MWIxYjFiMWIsIDB4MWIxYjFiMWIKKy5hbGlnbgk2NAorLkxBRVNfVGQ6CisubG9uZwkweDUwYTdmNDUxLDB4NTBhN2Y0NTEKKy5sb25nCTB4NTM2NTQxN2UsMHg1MzY1NDE3ZQorLmxvbmcJMHhjM2E0MTcxYSwweGMzYTQxNzFhCisubG9uZwkweDk2NWUyNzNhLDB4OTY1ZTI3M2EKKy5sb25nCTB4Y2I2YmFiM2IsMHhjYjZiYWIzYgorLmxvbmcJMHhmMTQ1OWQxZiwweGYxNDU5ZDFmCisubG9uZwkweGFiNThmYWFjLDB4YWI1OGZhYWMKKy5sb25nCTB4OTMwM2UzNGIsMHg5MzAzZTM0YgorLmxvbmcJMHg1NWZhMzAyMCwweDU1ZmEzMDIwCisubG9uZwkweGY2NmQ3NmFkLDB4ZjY2ZDc2YWQKKy5sb25nCTB4OTE3NmNjODgsMHg5MTc2Y2M4OAorLmxvbmcJMHgyNTRjMDJmNSwweDI1NGMwMmY1CisubG9uZwkweGZjZDdlNTRmLDB4ZmNkN2U1NGYKKy5sb25nCTB4ZDdjYjJhYzUsMHhkN2NiMmFjNQorLmxvbmcJMHg4MDQ0MzUyNiwweDgwNDQzNTI2CisubG9uZwkweDhmYTM2MmI1LDB4OGZhMzYyYjUKKy5sb25nCTB4NDk1YWIxZGUsMHg0OTVhYjFkZQorLmxvbmcJMHg2NzFiYmEyNSwweDY3MWJiYTI1CisubG9uZwkweDk4MGVlYTQ1LDB4OTgwZWVhNDUKKy5sb25nCTB4ZTFjMGZlNWQsMHhlMWMwZmU1ZAorLmxvbmcJMHgwMjc1MmZjMywweDAyNzUyZmMzCisubG9uZwkweDEyZjA0YzgxLDB4MTJmMDRjODEKKy5sb25nCTB4YTM5NzQ2OGQsMHhhMzk3NDY4ZAorLmxvbmcJMHhjNmY5ZDM2YiwweGM2ZjlkMzZiCisubG9uZwkweGU3NWY4ZjAzLDB4ZTc1ZjhmMDMKKy5sb25nCTB4OTU5YzkyMTUsMHg5NTljOTIxNQorLmxvbmcJMHhlYjdhNmRiZiwweGViN2E2ZGJmCisubG9uZwkweGRhNTk1Mjk1LDB4ZGE1OTUyOTUKKy5sb25nCTB4MmQ4M2JlZDQsMHgyZDgzYmVkNAorLmxvbmcJMHhkMzIxNzQ1OCwweGQzMjE3NDU4CisubG9uZwkweDI5NjllMDQ5LDB4Mjk2OWUwNDkKKy5sb25nCTB4NDRjOGM5OGUsMHg0NGM4Yzk4ZQorLmxvbmcJMHg2YTg5YzI3NSwweDZhODljMjc1CisubG9uZwkweDc4Nzk4ZWY0LDB4Nzg3OThlZjQKKy5sb25nCTB4NmIzZTU4OTksMHg2YjNlNTg5OQorLmxvbmcJMHhkZDcxYjkyNywweGRkNzFiOTI3CisubG9uZwkweGI2NGZlMWJlLDB4YjY0ZmUxYmUKKy5sb25nCTB4MTdhZDg4ZjAsMHgxN2FkODhmMAorLmxvbmcJMHg2NmFjMjBjOSwweDY2YWMyMGM5CisubG9uZwkweGI0M2FjZTdkLDB4YjQzYWNlN2QKKy5sb25nCTB4MTg0YWRmNjMsMHgxODRhZGY2MworLmxvbmcJMHg4MjMxMWFlNSwweDgyMzExYWU1CisubG9uZwkweDYwMzM1MTk3LDB4NjAzMzUxOTcKKy5sb25nCTB4NDU3ZjUzNjIsMHg0NTdmNTM2MgorLmxvbmcJMHhlMDc3NjRiMSwweGUwNzc2NGIxCisubG9uZwkweDg0YWU2YmJiLDB4ODRhZTZiYmIKKy5sb25nCTB4MWNhMDgxZmUsMHgxY2EwODFmZQorLmxvbmcJMHg5NDJiMDhmOSwweDk0MmIwOGY5CisubG9uZwkweDU4Njg0ODcwLDB4NTg2ODQ4NzAKKy5sb25nCTB4MTlmZDQ1OGYsMHgxOWZkNDU4ZgorLmxvbmcJMHg4NzZjZGU5NCwweDg3NmNkZTk0CisubG9uZwkweGI3Zjg3YjUyLDB4YjdmODdiNTIKKy5sb25nCTB4MjNkMzczYWIsMHgyM2QzNzNhYgorLmxvbmcJMHhlMjAyNGI3MiwweGUyMDI0YjcyCisubG9uZwkweDU3OGYxZmUzLDB4NTc4ZjFmZTMKKy5sb25nCTB4MmFhYjU1NjYsMHgyYWFiNTU2NgorLmxvbmcJMHgwNzI4ZWJiMiwweDA3MjhlYmIyCisubG9uZwkweDAzYzJiNTJmLDB4MDNjMmI1MmYKKy5sb25nCTB4OWE3YmM1ODYsMHg5YTdiYzU4NgorLmxvbmcJMHhhNTA4MzdkMywweGE1MDgzN2QzCisubG9uZwkweGYyODcyODMwLDB4ZjI4NzI4MzAKKy5sb25nCTB4YjJhNWJmMjMsMHhiMmE1YmYyMworLmxvbmcJMHhiYTZhMDMwMiwweGJhNmEwMzAyCisubG9uZwkweDVjODIxNmVkLDB4NWM4MjE2ZWQKKy5sb25nCTB4MmIxY2NmOGEsMHgyYjFjY2Y4YQorLmxvbmcJMHg5MmI0NzlhNywweDkyYjQ3OWE3CisubG9uZwkweGYwZjIwN2YzLDB4ZjBmMjA3ZjMKKy5sb25nCTB4YTFlMjY5NGUsMHhhMWUyNjk0ZQorLmxvbmcJMHhjZGY0ZGE2NSwweGNkZjRkYTY1CisubG9uZwkweGQ1YmUwNTA2LDB4ZDViZTA1MDYKKy5sb25nCTB4MWY2MjM0ZDEsMHgxZjYyMzRkMQorLmxvbmcJMHg4YWZlYTZjNCwweDhhZmVhNmM0CisubG9uZwkweDlkNTMyZTM0LDB4OWQ1MzJlMzQKKy5sb25nCTB4YTA1NWYzYTIsMHhhMDU1ZjNhMgorLmxvbmcJMHgzMmUxOGEwNSwweDMyZTE4YTA1CisubG9uZwkweDc1ZWJmNmE0LDB4NzVlYmY2YTQKKy5sb25nCTB4MzllYzgzMGIsMHgzOWVjODMwYgorLmxvbmcJMHhhYWVmNjA0MCwweGFhZWY2MDQwCisubG9uZwkweDA2OWY3MTVlLDB4MDY5ZjcxNWUKKy5sb25nCTB4NTExMDZlYmQsMHg1MTEwNmViZAorLmxvbmcJMHhmOThhMjEzZSwweGY5OGEyMTNlCisubG9uZwkweDNkMDZkZDk2LDB4M2QwNmRkOTYKKy5sb25nCTB4YWUwNTNlZGQsMHhhZTA1M2VkZAorLmxvbmcJMHg0NmJkZTY0ZCwweDQ2YmRlNjRkCisubG9uZwkweGI1OGQ1NDkxLDB4YjU4ZDU0OTEKKy5sb25nCTB4MDU1ZGM0NzEsMHgwNTVkYzQ3MQorLmxvbmcJMHg2ZmQ0MDYwNCwweDZmZDQwNjA0CisubG9uZwkweGZmMTU1MDYwLDB4ZmYxNTUwNjAKKy5sb25nCTB4MjRmYjk4MTksMHgyNGZiOTgxOQorLmxvbmcJMHg5N2U5YmRkNiwweDk3ZTliZGQ2CisubG9uZwkweGNjNDM0MDg5LDB4Y2M0MzQwODkKKy5sb25nCTB4Nzc5ZWQ5NjcsMHg3NzllZDk2NworLmxvbmcJMHhiZDQyZThiMCwweGJkNDJlOGIwCisubG9uZwkweDg4OGI4OTA3LDB4ODg4Yjg5MDcKKy5sb25nCTB4Mzg1YjE5ZTcsMHgzODViMTllNworLmxvbmcJMHhkYmVlYzg3OSwweGRiZWVjODc5CisubG9uZwkweDQ3MGE3Y2ExLDB4NDcwYTdjYTEKKy5sb25nCTB4ZTkwZjQyN2MsMHhlOTBmNDI3YworLmxvbmcJMHhjOTFlODRmOCwweGM5MWU4NGY4CisubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKKy5sb25nCTB4ODM4NjgwMDksMHg4Mzg2ODAwOQorLmxvbmcJMHg0OGVkMmIzMiwweDQ4ZWQyYjMyCisubG9uZwkweGFjNzAxMTFlLDB4YWM3MDExMWUKKy5sb25nCTB4NGU3MjVhNmMsMHg0ZTcyNWE2YworLmxvbmcJMHhmYmZmMGVmZCwweGZiZmYwZWZkCisubG9uZwkweDU2Mzg4NTBmLDB4NTYzODg1MGYKKy5sb25nCTB4MWVkNWFlM2QsMHgxZWQ1YWUzZAorLmxvbmcJMHgyNzM5MmQzNiwweDI3MzkyZDM2CisubG9uZwkweDY0ZDkwZjBhLDB4NjRkOTBmMGEKKy5sb25nCTB4MjFhNjVjNjgsMHgyMWE2NWM2OAorLmxvbmcJMHhkMTU0NWI5YiwweGQxNTQ1YjliCisubG9uZwkweDNhMmUzNjI0LDB4M2EyZTM2MjQKKy5sb25nCTB4YjE2NzBhMGMsMHhiMTY3MGEwYworLmxvbmcJMHgwZmU3NTc5MywweDBmZTc1NzkzCisubG9uZwkweGQyOTZlZWI0LDB4ZDI5NmVlYjQKKy5sb25nCTB4OWU5MTliMWIsMHg5ZTkxOWIxYgorLmxvbmcJMHg0ZmM1YzA4MCwweDRmYzVjMDgwCisubG9uZwkweGEyMjBkYzYxLDB4YTIyMGRjNjEKKy5sb25nCTB4Njk0Yjc3NWEsMHg2OTRiNzc1YQorLmxvbmcJMHgxNjFhMTIxYywweDE2MWExMjFjCisubG9uZwkweDBhYmE5M2UyLDB4MGFiYTkzZTIKKy5sb25nCTB4ZTUyYWEwYzAsMHhlNTJhYTBjMAorLmxvbmcJMHg0M2UwMjIzYywweDQzZTAyMjNjCisubG9uZwkweDFkMTcxYjEyLDB4MWQxNzFiMTIKKy5sb25nCTB4MGIwZDA5MGUsMHgwYjBkMDkwZQorLmxvbmcJMHhhZGM3OGJmMiwweGFkYzc4YmYyCisubG9uZwkweGI5YThiNjJkLDB4YjlhOGI2MmQKKy5sb25nCTB4YzhhOTFlMTQsMHhjOGE5MWUxNAorLmxvbmcJMHg4NTE5ZjE1NywweDg1MTlmMTU3CisubG9uZwkweDRjMDc3NWFmLDB4NGMwNzc1YWYKKy5sb25nCTB4YmJkZDk5ZWUsMHhiYmRkOTllZQorLmxvbmcJMHhmZDYwN2ZhMywweGZkNjA3ZmEzCisubG9uZwkweDlmMjYwMWY3LDB4OWYyNjAxZjcKKy5sb25nCTB4YmNmNTcyNWMsMHhiY2Y1NzI1YworLmxvbmcJMHhjNTNiNjY0NCwweGM1M2I2NjQ0CisubG9uZwkweDM0N2VmYjViLDB4MzQ3ZWZiNWIKKy5sb25nCTB4NzYyOTQzOGIsMHg3NjI5NDM4YgorLmxvbmcJMHhkY2M2MjNjYiwweGRjYzYyM2NiCisubG9uZwkweDY4ZmNlZGI2LDB4NjhmY2VkYjYKKy5sb25nCTB4NjNmMWU0YjgsMHg2M2YxZTRiOAorLmxvbmcJMHhjYWRjMzFkNywweGNhZGMzMWQ3CisubG9uZwkweDEwODU2MzQyLDB4MTA4NTYzNDIKKy5sb25nCTB4NDAyMjk3MTMsMHg0MDIyOTcxMworLmxvbmcJMHgyMDExYzY4NCwweDIwMTFjNjg0CisubG9uZwkweDdkMjQ0YTg1LDB4N2QyNDRhODUKKy5sb25nCTB4ZjgzZGJiZDIsMHhmODNkYmJkMgorLmxvbmcJMHgxMTMyZjlhZSwweDExMzJmOWFlCisubG9uZwkweDZkYTEyOWM3LDB4NmRhMTI5YzcKKy5sb25nCTB4NGIyZjllMWQsMHg0YjJmOWUxZAorLmxvbmcJMHhmMzMwYjJkYywweGYzMzBiMmRjCisubG9uZwkweGVjNTI4NjBkLDB4ZWM1Mjg2MGQKKy5sb25nCTB4ZDBlM2MxNzcsMHhkMGUzYzE3NworLmxvbmcJMHg2YzE2YjMyYiwweDZjMTZiMzJiCisubG9uZwkweDk5Yjk3MGE5LDB4OTliOTcwYTkKKy5sb25nCTB4ZmE0ODk0MTEsMHhmYTQ4OTQxMQorLmxvbmcJMHgyMjY0ZTk0NywweDIyNjRlOTQ3CisubG9uZwkweGM0OGNmY2E4LDB4YzQ4Y2ZjYTgKKy5sb25nCTB4MWEzZmYwYTAsMHgxYTNmZjBhMAorLmxvbmcJMHhkODJjN2Q1NiwweGQ4MmM3ZDU2CisubG9uZwkweGVmOTAzMzIyLDB4ZWY5MDMzMjIKKy5sb25nCTB4Yzc0ZTQ5ODcsMHhjNzRlNDk4NworLmxvbmcJMHhjMWQxMzhkOSwweGMxZDEzOGQ5CisubG9uZwkweGZlYTJjYThjLDB4ZmVhMmNhOGMKKy5sb25nCTB4MzYwYmQ0OTgsMHgzNjBiZDQ5OAorLmxvbmcJMHhjZjgxZjVhNiwweGNmODFmNWE2CisubG9uZwkweDI4ZGU3YWE1LDB4MjhkZTdhYTUKKy5sb25nCTB4MjY4ZWI3ZGEsMHgyNjhlYjdkYQorLmxvbmcJMHhhNGJmYWQzZiwweGE0YmZhZDNmCisubG9uZwkweGU0OWQzYTJjLDB4ZTQ5ZDNhMmMKKy5sb25nCTB4MGQ5Mjc4NTAsMHgwZDkyNzg1MAorLmxvbmcJMHg5YmNjNWY2YSwweDliY2M1ZjZhCisubG9uZwkweDYyNDY3ZTU0LDB4NjI0NjdlNTQKKy5sb25nCTB4YzIxMzhkZjYsMHhjMjEzOGRmNgorLmxvbmcJMHhlOGI4ZDg5MCwweGU4YjhkODkwCisubG9uZwkweDVlZjczOTJlLDB4NWVmNzM5MmUKKy5sb25nCTB4ZjVhZmMzODIsMHhmNWFmYzM4MgorLmxvbmcJMHhiZTgwNWQ5ZiwweGJlODA1ZDlmCisubG9uZwkweDdjOTNkMDY5LDB4N2M5M2QwNjkKKy5sb25nCTB4YTkyZGQ1NmYsMHhhOTJkZDU2ZgorLmxvbmcJMHhiMzEyMjVjZiwweGIzMTIyNWNmCisubG9uZwkweDNiOTlhY2M4LDB4M2I5OWFjYzgKKy5sb25nCTB4YTc3ZDE4MTAsMHhhNzdkMTgxMAorLmxvbmcJMHg2ZTYzOWNlOCwweDZlNjM5Y2U4CisubG9uZwkweDdiYmIzYmRiLDB4N2JiYjNiZGIKKy5sb25nCTB4MDk3ODI2Y2QsMHgwOTc4MjZjZAorLmxvbmcJMHhmNDE4NTk2ZSwweGY0MTg1OTZlCisubG9uZwkweDAxYjc5YWVjLDB4MDFiNzlhZWMKKy5sb25nCTB4YTg5YTRmODMsMHhhODlhNGY4MworLmxvbmcJMHg2NTZlOTVlNiwweDY1NmU5NWU2CisubG9uZwkweDdlZTZmZmFhLDB4N2VlNmZmYWEKKy5sb25nCTB4MDhjZmJjMjEsMHgwOGNmYmMyMQorLmxvbmcJMHhlNmU4MTVlZiwweGU2ZTgxNWVmCisubG9uZwkweGQ5OWJlN2JhLDB4ZDk5YmU3YmEKKy5sb25nCTB4Y2UzNjZmNGEsMHhjZTM2NmY0YQorLmxvbmcJMHhkNDA5OWZlYSwweGQ0MDk5ZmVhCisubG9uZwkweGQ2N2NiMDI5LDB4ZDY3Y2IwMjkKKy5sb25nCTB4YWZiMmE0MzEsMHhhZmIyYTQzMQorLmxvbmcJMHgzMTIzM2YyYSwweDMxMjMzZjJhCisubG9uZwkweDMwOTRhNWM2LDB4MzA5NGE1YzYKKy5sb25nCTB4YzA2NmEyMzUsMHhjMDY2YTIzNQorLmxvbmcJMHgzN2JjNGU3NCwweDM3YmM0ZTc0CisubG9uZwkweGE2Y2E4MmZjLDB4YTZjYTgyZmMKKy5sb25nCTB4YjBkMDkwZTAsMHhiMGQwOTBlMAorLmxvbmcJMHgxNWQ4YTczMywweDE1ZDhhNzMzCisubG9uZwkweDRhOTgwNGYxLDB4NGE5ODA0ZjEKKy5sb25nCTB4ZjdkYWVjNDEsMHhmN2RhZWM0MQorLmxvbmcJMHgwZTUwY2Q3ZiwweDBlNTBjZDdmCisubG9uZwkweDJmZjY5MTE3LDB4MmZmNjkxMTcKKy5sb25nCTB4OGRkNjRkNzYsMHg4ZGQ2NGQ3NgorLmxvbmcJMHg0ZGIwZWY0MywweDRkYjBlZjQzCisubG9uZwkweDU0NGRhYWNjLDB4NTQ0ZGFhY2MKKy5sb25nCTB4ZGYwNDk2ZTQsMHhkZjA0OTZlNAorLmxvbmcJMHhlM2I1ZDE5ZSwweGUzYjVkMTllCisubG9uZwkweDFiODg2YTRjLDB4MWI4ODZhNGMKKy5sb25nCTB4YjgxZjJjYzEsMHhiODFmMmNjMQorLmxvbmcJMHg3ZjUxNjU0NiwweDdmNTE2NTQ2CisubG9uZwkweDA0ZWE1ZTlkLDB4MDRlYTVlOWQKKy5sb25nCTB4NWQzNThjMDEsMHg1ZDM1OGMwMQorLmxvbmcJMHg3Mzc0ODdmYSwweDczNzQ4N2ZhCisubG9uZwkweDJlNDEwYmZiLDB4MmU0MTBiZmIKKy5sb25nCTB4NWExZDY3YjMsMHg1YTFkNjdiMworLmxvbmcJMHg1MmQyZGI5MiwweDUyZDJkYjkyCisubG9uZwkweDMzNTYxMGU5LDB4MzM1NjEwZTkKKy5sb25nCTB4MTM0N2Q2NmQsMHgxMzQ3ZDY2ZAorLmxvbmcJMHg4YzYxZDc5YSwweDhjNjFkNzlhCisubG9uZwkweDdhMGNhMTM3LDB4N2EwY2ExMzcKKy5sb25nCTB4OGUxNGY4NTksMHg4ZTE0Zjg1OQorLmxvbmcJMHg4OTNjMTNlYiwweDg5M2MxM2ViCisubG9uZwkweGVlMjdhOWNlLDB4ZWUyN2E5Y2UKKy5sb25nCTB4MzVjOTYxYjcsMHgzNWM5NjFiNworLmxvbmcJMHhlZGU1MWNlMSwweGVkZTUxY2UxCisubG9uZwkweDNjYjE0NzdhLDB4M2NiMTQ3N2EKKy5sb25nCTB4NTlkZmQyOWMsMHg1OWRmZDI5YworLmxvbmcJMHgzZjczZjI1NSwweDNmNzNmMjU1CisubG9uZwkweDc5Y2UxNDE4LDB4NzljZTE0MTgKKy5sb25nCTB4YmYzN2M3NzMsMHhiZjM3Yzc3MworLmxvbmcJMHhlYWNkZjc1MywweGVhY2RmNzUzCisubG9uZwkweDViYWFmZDVmLDB4NWJhYWZkNWYKKy5sb25nCTB4MTQ2ZjNkZGYsMHgxNDZmM2RkZgorLmxvbmcJMHg4NmRiNDQ3OCwweDg2ZGI0NDc4CisubG9uZwkweDgxZjNhZmNhLDB4ODFmM2FmY2EKKy5sb25nCTB4M2VjNDY4YjksMHgzZWM0NjhiOQorLmxvbmcJMHgyYzM0MjQzOCwweDJjMzQyNDM4CisubG9uZwkweDVmNDBhM2MyLDB4NWY0MGEzYzIKKy5sb25nCTB4NzJjMzFkMTYsMHg3MmMzMWQxNgorLmxvbmcJMHgwYzI1ZTJiYywweDBjMjVlMmJjCisubG9uZwkweDhiNDkzYzI4LDB4OGI0OTNjMjgKKy5sb25nCTB4NDE5NTBkZmYsMHg0MTk1MGRmZgorLmxvbmcJMHg3MTAxYTgzOSwweDcxMDFhODM5CisubG9uZwkweGRlYjMwYzA4LDB4ZGViMzBjMDgKKy5sb25nCTB4OWNlNGI0ZDgsMHg5Y2U0YjRkOAorLmxvbmcJMHg5MGMxNTY2NCwweDkwYzE1NjY0CisubG9uZwkweDYxODRjYjdiLDB4NjE4NGNiN2IKKy5sb25nCTB4NzBiNjMyZDUsMHg3MGI2MzJkNQorLmxvbmcJMHg3NDVjNmM0OCwweDc0NWM2YzQ4CisubG9uZwkweDQyNTdiOGQwLDB4NDI1N2I4ZDAKKy5ieXRlCTB4NTIsMHgwOSwweDZhLDB4ZDUsMHgzMCwweDM2LDB4YTUsMHgzOAorLmJ5dGUJMHhiZiwweDQwLDB4YTMsMHg5ZSwweDgxLDB4ZjMsMHhkNywweGZiCisuYnl0ZQkweDdjLDB4ZTMsMHgzOSwweDgyLDB4OWIsMHgyZiwweGZmLDB4ODcKKy5ieXRlCTB4MzQsMHg4ZSwweDQzLDB4NDQsMHhjNCwweGRlLDB4ZTksMHhjYgorLmJ5dGUJMHg1NCwweDdiLDB4OTQsMHgzMiwweGE2LDB4YzIsMHgyMywweDNkCisuYnl0ZQkweGVlLDB4NGMsMHg5NSwweDBiLDB4NDIsMHhmYSwweGMzLDB4NGUKKy5ieXRlCTB4MDgsMHgyZSwweGExLDB4NjYsMHgyOCwweGQ5LDB4MjQsMHhiMgorLmJ5dGUJMHg3NiwweDViLDB4YTIsMHg0OSwweDZkLDB4OGIsMHhkMSwweDI1CisuYnl0ZQkweDcyLDB4ZjgsMHhmNiwweDY0LDB4ODYsMHg2OCwweDk4LDB4MTYKKy5ieXRlCTB4ZDQsMHhhNCwweDVjLDB4Y2MsMHg1ZCwweDY1LDB4YjYsMHg5MgorLmJ5dGUJMHg2YywweDcwLDB4NDgsMHg1MCwweGZkLDB4ZWQsMHhiOSwweGRhCisuYnl0ZQkweDVlLDB4MTUsMHg0NiwweDU3LDB4YTcsMHg4ZCwweDlkLDB4ODQKKy5ieXRlCTB4OTAsMHhkOCwweGFiLDB4MDAsMHg4YywweGJjLDB4ZDMsMHgwYQorLmJ5dGUJMHhmNywweGU0LDB4NTgsMHgwNSwweGI4LDB4YjMsMHg0NSwweDA2CisuYnl0ZQkweGQwLDB4MmMsMHgxZSwweDhmLDB4Y2EsMHgzZiwweDBmLDB4MDIKKy5ieXRlCTB4YzEsMHhhZiwweGJkLDB4MDMsMHgwMSwweDEzLDB4OGEsMHg2YgorLmJ5dGUJMHgzYSwweDkxLDB4MTEsMHg0MSwweDRmLDB4NjcsMHhkYywweGVhCisuYnl0ZQkweDk3LDB4ZjIsMHhjZiwweGNlLDB4ZjAsMHhiNCwweGU2LDB4NzMKKy5ieXRlCTB4OTYsMHhhYywweDc0LDB4MjIsMHhlNywweGFkLDB4MzUsMHg4NQorLmJ5dGUJMHhlMiwweGY5LDB4MzcsMHhlOCwweDFjLDB4NzUsMHhkZiwweDZlCisuYnl0ZQkweDQ3LDB4ZjEsMHgxYSwweDcxLDB4MWQsMHgyOSwweGM1LDB4ODkKKy5ieXRlCTB4NmYsMHhiNywweDYyLDB4MGUsMHhhYSwweDE4LDB4YmUsMHgxYgorLmJ5dGUJMHhmYywweDU2LDB4M2UsMHg0YiwweGM2LDB4ZDIsMHg3OSwweDIwCisuYnl0ZQkweDlhLDB4ZGIsMHhjMCwweGZlLDB4NzgsMHhjZCwweDVhLDB4ZjQKKy5ieXRlCTB4MWYsMHhkZCwweGE4LDB4MzMsMHg4OCwweDA3LDB4YzcsMHgzMQorLmJ5dGUJMHhiMSwweDEyLDB4MTAsMHg1OSwweDI3LDB4ODAsMHhlYywweDVmCisuYnl0ZQkweDYwLDB4NTEsMHg3ZiwweGE5LDB4MTksMHhiNSwweDRhLDB4MGQKKy5ieXRlCTB4MmQsMHhlNSwweDdhLDB4OWYsMHg5MywweGM5LDB4OWMsMHhlZgorLmJ5dGUJMHhhMCwweGUwLDB4M2IsMHg0ZCwweGFlLDB4MmEsMHhmNSwweGIwCisuYnl0ZQkweGM4LDB4ZWIsMHhiYiwweDNjLDB4ODMsMHg1MywweDk5LDB4NjEKKy5ieXRlCTB4MTcsMHgyYiwweDA0LDB4N2UsMHhiYSwweDc3LDB4ZDYsMHgyNgorLmJ5dGUJMHhlMSwweDY5LDB4MTQsMHg2MywweDU1LDB4MjEsMHgwYywweDdkCisubG9uZwkweDgwODA4MDgwLCAweDgwODA4MDgwLCAweGZlZmVmZWZlLCAweGZlZmVmZWZlCisubG9uZwkweDFiMWIxYjFiLCAweDFiMWIxYjFiLCAwLCAwCisuYnl0ZQkweDUyLDB4MDksMHg2YSwweGQ1LDB4MzAsMHgzNiwweGE1LDB4MzgKKy5ieXRlCTB4YmYsMHg0MCwweGEzLDB4OWUsMHg4MSwweGYzLDB4ZDcsMHhmYgorLmJ5dGUJMHg3YywweGUzLDB4MzksMHg4MiwweDliLDB4MmYsMHhmZiwweDg3CisuYnl0ZQkweDM0LDB4OGUsMHg0MywweDQ0LDB4YzQsMHhkZSwweGU5LDB4Y2IKKy5ieXRlCTB4NTQsMHg3YiwweDk0LDB4MzIsMHhhNiwweGMyLDB4MjMsMHgzZAorLmJ5dGUJMHhlZSwweDRjLDB4OTUsMHgwYiwweDQyLDB4ZmEsMHhjMywweDRlCisuYnl0ZQkweDA4LDB4MmUsMHhhMSwweDY2LDB4MjgsMHhkOSwweDI0LDB4YjIKKy5ieXRlCTB4NzYsMHg1YiwweGEyLDB4NDksMHg2ZCwweDhiLDB4ZDEsMHgyNQorLmJ5dGUJMHg3MiwweGY4LDB4ZjYsMHg2NCwweDg2LDB4NjgsMHg5OCwweDE2CisuYnl0ZQkweGQ0LDB4YTQsMHg1YywweGNjLDB4NWQsMHg2NSwweGI2LDB4OTIKKy5ieXRlCTB4NmMsMHg3MCwweDQ4LDB4NTAsMHhmZCwweGVkLDB4YjksMHhkYQorLmJ5dGUJMHg1ZSwweDE1LDB4NDYsMHg1NywweGE3LDB4OGQsMHg5ZCwweDg0CisuYnl0ZQkweDkwLDB4ZDgsMHhhYiwweDAwLDB4OGMsMHhiYywweGQzLDB4MGEKKy5ieXRlCTB4ZjcsMHhlNCwweDU4LDB4MDUsMHhiOCwweGIzLDB4NDUsMHgwNgorLmJ5dGUJMHhkMCwweDJjLDB4MWUsMHg4ZiwweGNhLDB4M2YsMHgwZiwweDAyCisuYnl0ZQkweGMxLDB4YWYsMHhiZCwweDAzLDB4MDEsMHgxMywweDhhLDB4NmIKKy5ieXRlCTB4M2EsMHg5MSwweDExLDB4NDEsMHg0ZiwweDY3LDB4ZGMsMHhlYQorLmJ5dGUJMHg5NywweGYyLDB4Y2YsMHhjZSwweGYwLDB4YjQsMHhlNiwweDczCisuYnl0ZQkweDk2LDB4YWMsMHg3NCwweDIyLDB4ZTcsMHhhZCwweDM1LDB4ODUKKy5ieXRlCTB4ZTIsMHhmOSwweDM3LDB4ZTgsMHgxYywweDc1LDB4ZGYsMHg2ZQorLmJ5dGUJMHg0NywweGYxLDB4MWEsMHg3MSwweDFkLDB4MjksMHhjNSwweDg5CisuYnl0ZQkweDZmLDB4YjcsMHg2MiwweDBlLDB4YWEsMHgxOCwweGJlLDB4MWIKKy5ieXRlCTB4ZmMsMHg1NiwweDNlLDB4NGIsMHhjNiwweGQyLDB4NzksMHgyMAorLmJ5dGUJMHg5YSwweGRiLDB4YzAsMHhmZSwweDc4LDB4Y2QsMHg1YSwweGY0CisuYnl0ZQkweDFmLDB4ZGQsMHhhOCwweDMzLDB4ODgsMHgwNywweGM3LDB4MzEKKy5ieXRlCTB4YjEsMHgxMiwweDEwLDB4NTksMHgyNywweDgwLDB4ZWMsMHg1ZgorLmJ5dGUJMHg2MCwweDUxLDB4N2YsMHhhOSwweDE5LDB4YjUsMHg0YSwweDBkCisuYnl0ZQkweDJkLDB4ZTUsMHg3YSwweDlmLDB4OTMsMHhjOSwweDljLDB4ZWYKKy5ieXRlCTB4YTAsMHhlMCwweDNiLDB4NGQsMHhhZSwweDJhLDB4ZjUsMHhiMAorLmJ5dGUJMHhjOCwweGViLDB4YmIsMHgzYywweDgzLDB4NTMsMHg5OSwweDYxCisuYnl0ZQkweDE3LDB4MmIsMHgwNCwweDdlLDB4YmEsMHg3NywweGQ2LDB4MjYKKy5ieXRlCTB4ZTEsMHg2OSwweDE0LDB4NjMsMHg1NSwweDIxLDB4MGMsMHg3ZAorLmxvbmcJMHg4MDgwODA4MCwgMHg4MDgwODA4MCwgMHhmZWZlZmVmZSwgMHhmZWZlZmVmZQorLmxvbmcJMHgxYjFiMWIxYiwgMHgxYjFiMWIxYiwgMCwgMAorLmJ5dGUJMHg1MiwweDA5LDB4NmEsMHhkNSwweDMwLDB4MzYsMHhhNSwweDM4CisuYnl0ZQkweGJmLDB4NDAsMHhhMywweDllLDB4ODEsMHhmMywweGQ3LDB4ZmIKKy5ieXRlCTB4N2MsMHhlMywweDM5LDB4ODIsMHg5YiwweDJmLDB4ZmYsMHg4NworLmJ5dGUJMHgzNCwweDhlLDB4NDMsMHg0NCwweGM0LDB4ZGUsMHhlOSwweGNiCisuYnl0ZQkweDU0LDB4N2IsMHg5NCwweDMyLDB4YTYsMHhjMiwweDIzLDB4M2QKKy5ieXRlCTB4ZWUsMHg0YywweDk1LDB4MGIsMHg0MiwweGZhLDB4YzMsMHg0ZQorLmJ5dGUJMHgwOCwweDJlLDB4YTEsMHg2NiwweDI4LDB4ZDksMHgyNCwweGIyCisuYnl0ZQkweDc2LDB4NWIsMHhhMiwweDQ5LDB4NmQsMHg4YiwweGQxLDB4MjUKKy5ieXRlCTB4NzIsMHhmOCwweGY2LDB4NjQsMHg4NiwweDY4LDB4OTgsMHgxNgorLmJ5dGUJMHhkNCwweGE0LDB4NWMsMHhjYywweDVkLDB4NjUsMHhiNiwweDkyCisuYnl0ZQkweDZjLDB4NzAsMHg0OCwweDUwLDB4ZmQsMHhlZCwweGI5LDB4ZGEKKy5ieXRlCTB4NWUsMHgxNSwweDQ2LDB4NTcsMHhhNywweDhkLDB4OWQsMHg4NAorLmJ5dGUJMHg5MCwweGQ4LDB4YWIsMHgwMCwweDhjLDB4YmMsMHhkMywweDBhCisuYnl0ZQkweGY3LDB4ZTQsMHg1OCwweDA1LDB4YjgsMHhiMywweDQ1LDB4MDYKKy5ieXRlCTB4ZDAsMHgyYywweDFlLDB4OGYsMHhjYSwweDNmLDB4MGYsMHgwMgorLmJ5dGUJMHhjMSwweGFmLDB4YmQsMHgwMywweDAxLDB4MTMsMHg4YSwweDZiCisuYnl0ZQkweDNhLDB4OTEsMHgxMSwweDQxLDB4NGYsMHg2NywweGRjLDB4ZWEKKy5ieXRlCTB4OTcsMHhmMiwweGNmLDB4Y2UsMHhmMCwweGI0LDB4ZTYsMHg3MworLmJ5dGUJMHg5NiwweGFjLDB4NzQsMHgyMiwweGU3LDB4YWQsMHgzNSwweDg1CisuYnl0ZQkweGUyLDB4ZjksMHgzNywweGU4LDB4MWMsMHg3NSwweGRmLDB4NmUKKy5ieXRlCTB4NDcsMHhmMSwweDFhLDB4NzEsMHgxZCwweDI5LDB4YzUsMHg4OQorLmJ5dGUJMHg2ZiwweGI3LDB4NjIsMHgwZSwweGFhLDB4MTgsMHhiZSwweDFiCisuYnl0ZQkweGZjLDB4NTYsMHgzZSwweDRiLDB4YzYsMHhkMiwweDc5LDB4MjAKKy5ieXRlCTB4OWEsMHhkYiwweGMwLDB4ZmUsMHg3OCwweGNkLDB4NWEsMHhmNAorLmJ5dGUJMHgxZiwweGRkLDB4YTgsMHgzMywweDg4LDB4MDcsMHhjNywweDMxCisuYnl0ZQkweGIxLDB4MTIsMHgxMCwweDU5LDB4MjcsMHg4MCwweGVjLDB4NWYKKy5ieXRlCTB4NjAsMHg1MSwweDdmLDB4YTksMHgxOSwweGI1LDB4NGEsMHgwZAorLmJ5dGUJMHgyZCwweGU1LDB4N2EsMHg5ZiwweDkzLDB4YzksMHg5YywweGVmCisuYnl0ZQkweGEwLDB4ZTAsMHgzYiwweDRkLDB4YWUsMHgyYSwweGY1LDB4YjAKKy5ieXRlCTB4YzgsMHhlYiwweGJiLDB4M2MsMHg4MywweDUzLDB4OTksMHg2MQorLmJ5dGUJMHgxNywweDJiLDB4MDQsMHg3ZSwweGJhLDB4NzcsMHhkNiwweDI2CisuYnl0ZQkweGUxLDB4NjksMHgxNCwweDYzLDB4NTUsMHgyMSwweDBjLDB4N2QKKy5sb25nCTB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ZmVmZWZlZmUsIDB4ZmVmZWZlZmUKKy5sb25nCTB4MWIxYjFiMWIsIDB4MWIxYjFiMWIsIDAsIDAKKy5ieXRlCTB4NTIsMHgwOSwweDZhLDB4ZDUsMHgzMCwweDM2LDB4YTUsMHgzOAorLmJ5dGUJMHhiZiwweDQwLDB4YTMsMHg5ZSwweDgxLDB4ZjMsMHhkNywweGZiCisuYnl0ZQkweDdjLDB4ZTMsMHgzOSwweDgyLDB4OWIsMHgyZiwweGZmLDB4ODcKKy5ieXRlCTB4MzQsMHg4ZSwweDQzLDB4NDQsMHhjNCwweGRlLDB4ZTksMHhjYgorLmJ5dGUJMHg1NCwweDdiLDB4OTQsMHgzMiwweGE2LDB4YzIsMHgyMywweDNkCisuYnl0ZQkweGVlLDB4NGMsMHg5NSwweDBiLDB4NDIsMHhmYSwweGMzLDB4NGUKKy5ieXRlCTB4MDgsMHgyZSwweGExLDB4NjYsMHgyOCwweGQ5LDB4MjQsMHhiMgorLmJ5dGUJMHg3NiwweDViLDB4YTIsMHg0OSwweDZkLDB4OGIsMHhkMSwweDI1CisuYnl0ZQkweDcyLDB4ZjgsMHhmNiwweDY0LDB4ODYsMHg2OCwweDk4LDB4MTYKKy5ieXRlCTB4ZDQsMHhhNCwweDVjLDB4Y2MsMHg1ZCwweDY1LDB4YjYsMHg5MgorLmJ5dGUJMHg2YywweDcwLDB4NDgsMHg1MCwweGZkLDB4ZWQsMHhiOSwweGRhCisuYnl0ZQkweDVlLDB4MTUsMHg0NiwweDU3LDB4YTcsMHg4ZCwweDlkLDB4ODQKKy5ieXRlCTB4OTAsMHhkOCwweGFiLDB4MDAsMHg4YywweGJjLDB4ZDMsMHgwYQorLmJ5dGUJMHhmNywweGU0LDB4NTgsMHgwNSwweGI4LDB4YjMsMHg0NSwweDA2CisuYnl0ZQkweGQwLDB4MmMsMHgxZSwweDhmLDB4Y2EsMHgzZiwweDBmLDB4MDIKKy5ieXRlCTB4YzEsMHhhZiwweGJkLDB4MDMsMHgwMSwweDEzLDB4OGEsMHg2YgorLmJ5dGUJMHgzYSwweDkxLDB4MTEsMHg0MSwweDRmLDB4NjcsMHhkYywweGVhCisuYnl0ZQkweDk3LDB4ZjIsMHhjZiwweGNlLDB4ZjAsMHhiNCwweGU2LDB4NzMKKy5ieXRlCTB4OTYsMHhhYywweDc0LDB4MjIsMHhlNywweGFkLDB4MzUsMHg4NQorLmJ5dGUJMHhlMiwweGY5LDB4MzcsMHhlOCwweDFjLDB4NzUsMHhkZiwweDZlCisuYnl0ZQkweDQ3LDB4ZjEsMHgxYSwweDcxLDB4MWQsMHgyOSwweGM1LDB4ODkKKy5ieXRlCTB4NmYsMHhiNywweDYyLDB4MGUsMHhhYSwweDE4LDB4YmUsMHgxYgorLmJ5dGUJMHhmYywweDU2LDB4M2UsMHg0YiwweGM2LDB4ZDIsMHg3OSwweDIwCisuYnl0ZQkweDlhLDB4ZGIsMHhjMCwweGZlLDB4NzgsMHhjZCwweDVhLDB4ZjQKKy5ieXRlCTB4MWYsMHhkZCwweGE4LDB4MzMsMHg4OCwweDA3LDB4YzcsMHgzMQorLmJ5dGUJMHhiMSwweDEyLDB4MTAsMHg1OSwweDI3LDB4ODAsMHhlYywweDVmCisuYnl0ZQkweDYwLDB4NTEsMHg3ZiwweGE5LDB4MTksMHhiNSwweDRhLDB4MGQKKy5ieXRlCTB4MmQsMHhlNSwweDdhLDB4OWYsMHg5MywweGM5LDB4OWMsMHhlZgorLmJ5dGUJMHhhMCwweGUwLDB4M2IsMHg0ZCwweGFlLDB4MmEsMHhmNSwweGIwCisuYnl0ZQkweGM4LDB4ZWIsMHhiYiwweDNjLDB4ODMsMHg1MywweDk5LDB4NjEKKy5ieXRlCTB4MTcsMHgyYiwweDA0LDB4N2UsMHhiYSwweDc3LDB4ZDYsMHgyNgorLmJ5dGUJMHhlMSwweDY5LDB4MTQsMHg2MywweDU1LDB4MjEsMHgwYywweDdkCisubG9uZwkweDgwODA4MDgwLCAweDgwODA4MDgwLCAweGZlZmVmZWZlLCAweGZlZmVmZWZlCisubG9uZwkweDFiMWIxYjFiLCAweDFiMWIxYjFiLCAwLCAwCisuYnl0ZQk2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTY0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLWdjbS14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLWdjbS14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2I0YzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzbmktZ2NtLXg4Nl82NC5TCkBAIC0wLDAgKzEsODM0IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisudHlwZQlfYWVzbmlfY3RyMzJfZ2hhc2hfNngsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19hZXNuaV9jdHIzMl9naGFzaF82eDoKKy5jZmlfc3RhcnRwcm9jCQorCXZtb3ZkcXUJMzIoJXIxMSksJXhtbTIKKwlzdWJxCSQ2LCVyZHgKKwl2cHhvcgkleG1tNCwleG1tNCwleG1tNAorCXZtb3ZkcXUJMC0xMjgoJXJjeCksJXhtbTE1CisJdnBhZGRiCSV4bW0yLCV4bW0xLCV4bW0xMAorCXZwYWRkYgkleG1tMiwleG1tMTAsJXhtbTExCisJdnBhZGRiCSV4bW0yLCV4bW0xMSwleG1tMTIKKwl2cGFkZGIJJXhtbTIsJXhtbTEyLCV4bW0xMworCXZwYWRkYgkleG1tMiwleG1tMTMsJXhtbTE0CisJdnB4b3IJJXhtbTE1LCV4bW0xLCV4bW05CisJdm1vdmRxdQkleG1tNCwxNis4KCVyc3ApCisJam1wCS5Mb29wNngKKworLmFsaWduCTMyCisuTG9vcDZ4OgorCWFkZGwJJDEwMDY2MzI5NiwlZWJ4CisJamMJLkxoYW5kbGVfY3RyMzIKKwl2bW92ZHF1CTAtMzIoJXI5KSwleG1tMworCXZwYWRkYgkleG1tMiwleG1tMTQsJXhtbTEKKwl2cHhvcgkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW0xNSwleG1tMTEsJXhtbTExCisKKy5McmVzdW1lX2N0cjMyOgorCXZtb3ZkcXUJJXhtbTEsKCVyOCkKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW03LCV4bW01CisJdnB4b3IJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwl2bW92dXBzCTE2LTEyOCglcmN4KSwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTMsJXhtbTcsJXhtbTYKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisJeG9ycQklcjEyLCVyMTIKKwljbXBxCSVyMTQsJXIxNQorCisJdmFlc2VuYwkleG1tMiwleG1tOSwleG1tOQorCXZtb3ZkcXUJNDgrOCglcnNwKSwleG1tMAorCXZweG9yCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMywleG1tNywleG1tMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW0xNSwleG1tMTQsJXhtbTE0CisJc2V0bmMJJXIxMmIKKwl2cGNsbXVscWRxCSQweDExLCV4bW0zLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdm1vdmRxdQkxNi0zMiglcjkpLCV4bW0zCisJbmVncQklcjEyCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisJdnB4b3IJJXhtbTUsJXhtbTYsJXhtbTYKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0zLCV4bW0wLCV4bW01CisJdnB4b3IJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMywleG1tMTMKKwl2cHhvcgkleG1tNSwleG1tMSwleG1tNAorCWFuZHEJJDB4NjAsJXIxMgorCXZtb3Z1cHMJMzItMTI4KCVyY3gpLCV4bW0xNQorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTAsJXhtbTEKKwl2YWVzZW5jCSV4bW0yLCV4bW0xNCwleG1tMTQKKworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTMsJXhtbTAsJXhtbTIKKwlsZWFxCSglcjE0LCVyMTIsMSksJXIxNAorCXZhZXNlbmMJJXhtbTE1LCV4bW05LCV4bW05CisJdnB4b3IJMTYrOCglcnNwKSwleG1tOCwleG1tOAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTMsJXhtbTAsJXhtbTMKKwl2bW92ZHF1CTY0KzgoJXJzcCksJXhtbTAKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJbW92YmVxCTg4KCVyMTQpLCVyMTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTEsJXhtbTExCisJbW92YmVxCTgwKCVyMTQpLCVyMTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTIsJXhtbTEyCisJbW92cQklcjEzLDMyKzgoJXJzcCkKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJbW92cQklcjEyLDQwKzgoJXJzcCkKKwl2bW92ZHF1CTQ4LTMyKCVyOSksJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTQsJXhtbTE0CisKKwl2bW92dXBzCTQ4LTEyOCglcmN4KSwleG1tMTUKKwl2cHhvcgkleG1tMSwleG1tNiwleG1tNgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTUsJXhtbTAsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZweG9yCSV4bW0yLCV4bW02LCV4bW02CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNSwleG1tMCwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tMywleG1tNywleG1tNworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTUsJXhtbTAsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTEsJXhtbTExCisJdnBjbG11bHFkcQkkMHgxMSwleG1tNSwleG1tMCwleG1tNQorCXZtb3ZkcXUJODArOCglcnNwKSwleG1tMAorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CTY0LTMyKCVyOSksJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTQsJXhtbTE0CisKKwl2bW92dXBzCTY0LTEyOCglcmN4KSwleG1tMTUKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEsJXhtbTAsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZweG9yCSV4bW0zLCV4bW02LCV4bW02CisJdnBjbG11bHFkcQkkMHgxMCwleG1tMSwleG1tMCwleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW0xMCwleG1tMTAKKwltb3ZiZXEJNzIoJXIxNCksJXIxMworCXZweG9yCSV4bW01LCV4bW03LCV4bW03CisJdnBjbG11bHFkcQkkMHgwMSwleG1tMSwleG1tMCwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMSwleG1tMTEKKwltb3ZiZXEJNjQoJXIxNCksJXIxMgorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEsJXhtbTAsJXhtbTEKKwl2bW92ZHF1CTk2KzgoJXJzcCksJXhtbTAKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTIsJXhtbTEyCisJbW92cQklcjEzLDQ4KzgoJXJzcCkKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJbW92cQklcjEyLDU2KzgoJXJzcCkKKwl2cHhvcgkleG1tMiwleG1tNCwleG1tNAorCXZtb3ZkcXUJOTYtMzIoJXI5KSwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0xNCwleG1tMTQKKworCXZtb3Z1cHMJODAtMTI4KCVyY3gpLCV4bW0xNQorCXZweG9yCSV4bW0zLCV4bW02LCV4bW02CisJdnBjbG11bHFkcQkkMHgwMCwleG1tMiwleG1tMCwleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTUsJXhtbTYsJXhtbTYKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0yLCV4bW0wLCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCW1vdmJlcQk1NiglcjE0KSwlcjEzCisJdnB4b3IJJXhtbTEsJXhtbTcsJXhtbTcKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0yLCV4bW0wLCV4bW0xCisJdnB4b3IJMTEyKzgoJXJzcCksJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTEsJXhtbTExCisJbW92YmVxCTQ4KCVyMTQpLCVyMTIKKwl2cGNsbXVscWRxCSQweDExLCV4bW0yLCV4bW0wLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCW1vdnEJJXIxMyw2NCs4KCVyc3ApCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCW1vdnEJJXIxMiw3Mis4KCVyc3ApCisJdnB4b3IJJXhtbTMsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CTExMi0zMiglcjkpLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCisJdm1vdnVwcwk5Ni0xMjgoJXJjeCksJXhtbTE1CisJdnB4b3IJJXhtbTUsJXhtbTYsJXhtbTYKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW04LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMSwleG1tNiwleG1tNgorCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTMsJXhtbTgsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJbW92YmVxCTQwKCVyMTQpLCVyMTMKKwl2cHhvcgkleG1tMiwleG1tNywleG1tNworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTMsJXhtbTgsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTEsJXhtbTExCisJbW92YmVxCTMyKCVyMTQpLCVyMTIKKwl2cGNsbXVscWRxCSQweDExLCV4bW0zLCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCW1vdnEJJXIxMyw4MCs4KCVyc3ApCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCW1vdnEJJXIxMiw4OCs4KCVyc3ApCisJdnB4b3IJJXhtbTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTQsJXhtbTE0CisJdnB4b3IJJXhtbTEsJXhtbTYsJXhtbTYKKworCXZtb3Z1cHMJMTEyLTEyOCglcmN4KSwleG1tMTUKKwl2cHNsbGRxCSQ4LCV4bW02LCV4bW01CisJdnB4b3IJJXhtbTIsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CTE2KCVyMTEpLCV4bW0zCisKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZweG9yCSV4bW04LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJbW92YmVxCTI0KCVyMTQpLCVyMTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTEsJXhtbTExCisJbW92YmVxCTE2KCVyMTQpLCVyMTIKKwl2cGFsaWducgkkOCwleG1tNCwleG1tNCwleG1tMAorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTQsJXhtbTQKKwltb3ZxCSVyMTMsOTYrOCglcnNwKQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwltb3ZxCSVyMTIsMTA0KzgoJXJzcCkKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJdm1vdnVwcwkxMjgtMTI4KCVyY3gpLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCisJdmFlc2VuYwkleG1tMSwleG1tOSwleG1tOQorCXZtb3Z1cHMJMTQ0LTEyOCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMCwleG1tMTAKKwl2cHNybGRxCSQ4LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKwl2cHhvcgkleG1tMCwleG1tNCwleG1tNAorCW1vdmJlcQk4KCVyMTQpLCVyMTMKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMywleG1tMTMKKwltb3ZiZXEJMCglcjE0KSwlcjEyCisJdmFlc2VuYwkleG1tMSwleG1tMTQsJXhtbTE0CisJdm1vdnVwcwkxNjAtMTI4KCVyY3gpLCV4bW0xCisJY21wbAkkMTEsJWVicAorCWpiCS5MZW5jX3RhaWwKKworCXZhZXNlbmMJJXhtbTE1LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZhZXNlbmMJJXhtbTE1LCV4bW0xNCwleG1tMTQKKworCXZhZXNlbmMJJXhtbTEsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMywleG1tMTMKKwl2bW92dXBzCTE3Ni0xMjgoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMSwleG1tMTQsJXhtbTE0CisJdm1vdnVwcwkxOTItMTI4KCVyY3gpLCV4bW0xCisJamUJLkxlbmNfdGFpbAorCisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCisJdmFlc2VuYwkleG1tMSwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTEsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEsJXhtbTEzLCV4bW0xMworCXZtb3Z1cHMJMjA4LTEyOCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xLCV4bW0xNCwleG1tMTQKKwl2bW92dXBzCTIyNC0xMjgoJXJjeCksJXhtbTEKKwlqbXAJLkxlbmNfdGFpbAorCisuYWxpZ24JMzIKKy5MaGFuZGxlX2N0cjMyOgorCXZtb3ZkcXUJKCVyMTEpLCV4bW0wCisJdnBzaHVmYgkleG1tMCwleG1tMSwleG1tNgorCXZtb3ZkcXUJNDgoJXIxMSksJXhtbTUKKwl2cGFkZGQJNjQoJXIxMSksJXhtbTYsJXhtbTEwCisJdnBhZGRkCSV4bW01LCV4bW02LCV4bW0xMQorCXZtb3ZkcXUJMC0zMiglcjkpLCV4bW0zCisJdnBhZGRkCSV4bW01LCV4bW0xMCwleG1tMTIKKwl2cHNodWZiCSV4bW0wLCV4bW0xMCwleG1tMTAKKwl2cGFkZGQJJXhtbTUsJXhtbTExLCV4bW0xMworCXZwc2h1ZmIJJXhtbTAsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJdnBhZGRkCSV4bW01LCV4bW0xMiwleG1tMTQKKwl2cHNodWZiCSV4bW0wLCV4bW0xMiwleG1tMTIKKwl2cHhvcgkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZwYWRkZAkleG1tNSwleG1tMTMsJXhtbTEKKwl2cHNodWZiCSV4bW0wLCV4bW0xMywleG1tMTMKKwl2cHNodWZiCSV4bW0wLCV4bW0xNCwleG1tMTQKKwl2cHNodWZiCSV4bW0wLCV4bW0xLCV4bW0xCisJam1wCS5McmVzdW1lX2N0cjMyCisKKy5hbGlnbgkzMgorLkxlbmNfdGFpbDoKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZtb3ZkcXUJJXhtbTcsMTYrOCglcnNwKQorCXZwYWxpZ25yCSQ4LCV4bW00LCV4bW00LCV4bW04CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTQsJXhtbTQKKwl2cHhvcgkwKCVyZGkpLCV4bW0xLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZweG9yCTE2KCVyZGkpLCV4bW0xLCV4bW0wCisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCXZweG9yCTMyKCVyZGkpLCV4bW0xLCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZweG9yCTQ4KCVyZGkpLCV4bW0xLCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXZweG9yCTY0KCVyZGkpLCV4bW0xLCV4bW03CisJdnB4b3IJODAoJXJkaSksJXhtbTEsJXhtbTMKKwl2bW92ZHF1CSglcjgpLCV4bW0xCisKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tOSwleG1tOQorCXZtb3ZkcXUJMzIoJXIxMSksJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMTAsJXhtbTEwCisJdnBhZGRiCSV4bW0yLCV4bW0xLCV4bW0wCisJbW92cQklcjEzLDExMis4KCVyc3ApCisJbGVhcQk5NiglcmRpKSwlcmRpCisJdmFlc2VuY2xhc3QJJXhtbTUsJXhtbTExLCV4bW0xMQorCXZwYWRkYgkleG1tMiwleG1tMCwleG1tNQorCW1vdnEJJXIxMiwxMjArOCglcnNwKQorCWxlYXEJOTYoJXJzaSksJXJzaQorCXZtb3ZkcXUJMC0xMjgoJXJjeCksJXhtbTE1CisJdmFlc2VuY2xhc3QJJXhtbTYsJXhtbTEyLCV4bW0xMgorCXZwYWRkYgkleG1tMiwleG1tNSwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW03LCV4bW0xMywleG1tMTMKKwl2cGFkZGIJJXhtbTIsJXhtbTYsJXhtbTcKKwl2YWVzZW5jbGFzdAkleG1tMywleG1tMTQsJXhtbTE0CisJdnBhZGRiCSV4bW0yLCV4bW03LCV4bW0zCisKKwlhZGRxCSQweDYwLCVyMTAKKwlzdWJxCSQweDYsJXJkeAorCWpjCS5MNnhfZG9uZQorCisJdm1vdnVwcwkleG1tOSwtOTYoJXJzaSkKKwl2cHhvcgkleG1tMTUsJXhtbTEsJXhtbTkKKwl2bW92dXBzCSV4bW0xMCwtODAoJXJzaSkKKwl2bW92ZHFhCSV4bW0wLCV4bW0xMAorCXZtb3Z1cHMJJXhtbTExLC02NCglcnNpKQorCXZtb3ZkcWEJJXhtbTUsJXhtbTExCisJdm1vdnVwcwkleG1tMTIsLTQ4KCVyc2kpCisJdm1vdmRxYQkleG1tNiwleG1tMTIKKwl2bW92dXBzCSV4bW0xMywtMzIoJXJzaSkKKwl2bW92ZHFhCSV4bW03LCV4bW0xMworCXZtb3Z1cHMJJXhtbTE0LC0xNiglcnNpKQorCXZtb3ZkcWEJJXhtbTMsJXhtbTE0CisJdm1vdmRxdQkzMis4KCVyc3ApLCV4bW03CisJam1wCS5Mb29wNngKKworLkw2eF9kb25lOgorCXZweG9yCTE2KzgoJXJzcCksJXhtbTgsJXhtbTgKKwl2cHhvcgkleG1tNCwleG1tOCwleG1tOAorCisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlfYWVzbmlfY3RyMzJfZ2hhc2hfNngsLi1fYWVzbmlfY3RyMzJfZ2hhc2hfNngKKy5nbG9ibAlhZXNuaV9nY21fZGVjcnlwdAorLmhpZGRlbiBhZXNuaV9nY21fZGVjcnlwdAorLnR5cGUJYWVzbmlfZ2NtX2RlY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK2Flc25pX2djbV9kZWNyeXB0OgorLmNmaV9zdGFydHByb2MJCisJeG9ycQklcjEwLCVyMTAKKworCisKKwljbXBxCSQweDYwLCVyZHgKKwlqYgkuTGdjbV9kZWNfYWJvcnQKKworCWxlYXEJKCVyc3ApLCVyYXgKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcmF4CisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJdnplcm91cHBlcgorCisJdm1vdmRxdQkoJXI4KSwleG1tMQorCWFkZHEJJC0xMjgsJXJzcAorCW1vdmwJMTIoJXI4KSwlZWJ4CisJbGVhcQkuTGJzd2FwX21hc2soJXJpcCksJXIxMQorCWxlYXEJLTEyOCglcmN4KSwlcjE0CisJbW92cQkkMHhmODAsJXIxNQorCXZtb3ZkcXUJKCVyOSksJXhtbTgKKwlhbmRxCSQtMTI4LCVyc3AKKwl2bW92ZHF1CSglcjExKSwleG1tMAorCWxlYXEJMTI4KCVyY3gpLCVyY3gKKwlsZWFxCTMyKzMyKCVyOSksJXI5CisJbW92bAkyNDAtMTI4KCVyY3gpLCVlYnAKKwl2cHNodWZiCSV4bW0wLCV4bW04LCV4bW04CisKKwlhbmRxCSVyMTUsJXIxNAorCWFuZHEJJXJzcCwlcjE1CisJc3VicQklcjE0LCVyMTUKKwlqYwkuTGRlY19ub19rZXlfYWxpYXNpbmcKKwljbXBxCSQ3NjgsJXIxNQorCWpuYwkuTGRlY19ub19rZXlfYWxpYXNpbmcKKwlzdWJxCSVyMTUsJXJzcAorLkxkZWNfbm9fa2V5X2FsaWFzaW5nOgorCisJdm1vdmRxdQk4MCglcmRpKSwleG1tNworCWxlYXEJKCVyZGkpLCVyMTQKKwl2bW92ZHF1CTY0KCVyZGkpLCV4bW00CisKKworCisKKworCisKKwlsZWFxCS0xOTIoJXJkaSwlcmR4LDEpLCVyMTUKKworCXZtb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlzaHJxCSQ0LCVyZHgKKwl4b3JxCSVyMTAsJXIxMAorCXZtb3ZkcXUJMzIoJXJkaSksJXhtbTYKKwl2cHNodWZiCSV4bW0wLCV4bW03LCV4bW03CisJdm1vdmRxdQkxNiglcmRpKSwleG1tMgorCXZwc2h1ZmIJJXhtbTAsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CSglcmRpKSwleG1tMworCXZwc2h1ZmIJJXhtbTAsJXhtbTUsJXhtbTUKKwl2bW92ZHF1CSV4bW00LDQ4KCVyc3ApCisJdnBzaHVmYgkleG1tMCwleG1tNiwleG1tNgorCXZtb3ZkcXUJJXhtbTUsNjQoJXJzcCkKKwl2cHNodWZiCSV4bW0wLCV4bW0yLCV4bW0yCisJdm1vdmRxdQkleG1tNiw4MCglcnNwKQorCXZwc2h1ZmIJJXhtbTAsJXhtbTMsJXhtbTMKKwl2bW92ZHF1CSV4bW0yLDk2KCVyc3ApCisJdm1vdmRxdQkleG1tMywxMTIoJXJzcCkKKworCWNhbGwJX2Flc25pX2N0cjMyX2doYXNoXzZ4CisKKwl2bW92dXBzCSV4bW05LC05NiglcnNpKQorCXZtb3Z1cHMJJXhtbTEwLC04MCglcnNpKQorCXZtb3Z1cHMJJXhtbTExLC02NCglcnNpKQorCXZtb3Z1cHMJJXhtbTEyLC00OCglcnNpKQorCXZtb3Z1cHMJJXhtbTEzLC0zMiglcnNpKQorCXZtb3Z1cHMJJXhtbTE0LC0xNiglcnNpKQorCisJdnBzaHVmYgkoJXIxMSksJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW04LC02NCglcjkpCisKKwl2emVyb3VwcGVyCisJbW92cQktNDgoJXJheCksJXIxNQorLmNmaV9yZXN0b3JlCSVyMTUKKwltb3ZxCS00MCglcmF4KSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJLTMyKCVyYXgpLCVyMTMKKy5jZmlfcmVzdG9yZQklcjEzCisJbW92cQktMjQoJXJheCksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCS0xNiglcmF4KSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCW1vdnEJLTgoJXJheCksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlsZWFxCSglcmF4KSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxnY21fZGVjX2Fib3J0OgorCW1vdnEJJXIxMCwlcmF4CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXNuaV9nY21fZGVjcnlwdCwuLWFlc25pX2djbV9kZWNyeXB0CisudHlwZQlfYWVzbmlfY3RyMzJfNngsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19hZXNuaV9jdHIzMl82eDoKKy5jZmlfc3RhcnRwcm9jCQorCXZtb3ZkcXUJMC0xMjgoJXJjeCksJXhtbTQKKwl2bW92ZHF1CTMyKCVyMTEpLCV4bW0yCisJbGVhcQktMSglcmJwKSwlcjEzCisJdm1vdnVwcwkxNi0xMjgoJXJjeCksJXhtbTE1CisJbGVhcQkzMi0xMjgoJXJjeCksJXIxMgorCXZweG9yCSV4bW00LCV4bW0xLCV4bW05CisJYWRkbAkkMTAwNjYzMjk2LCVlYngKKwlqYwkuTGhhbmRsZV9jdHIzMl8yCisJdnBhZGRiCSV4bW0yLCV4bW0xLCV4bW0xMAorCXZwYWRkYgkleG1tMiwleG1tMTAsJXhtbTExCisJdnB4b3IJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZwYWRkYgkleG1tMiwleG1tMTEsJXhtbTEyCisJdnB4b3IJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZwYWRkYgkleG1tMiwleG1tMTIsJXhtbTEzCisJdnB4b3IJJXhtbTQsJXhtbTEyLCV4bW0xMgorCXZwYWRkYgkleG1tMiwleG1tMTMsJXhtbTE0CisJdnB4b3IJJXhtbTQsJXhtbTEzLCV4bW0xMworCXZwYWRkYgkleG1tMiwleG1tMTQsJXhtbTEKKwl2cHhvcgkleG1tNCwleG1tMTQsJXhtbTE0CisJam1wCS5Mb29wX2N0cjMyCisKKy5hbGlnbgkxNgorLkxvb3BfY3RyMzI6CisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXZtb3Z1cHMJKCVyMTIpLCV4bW0xNQorCWxlYXEJMTYoJXIxMiksJXIxMgorCWRlY2wJJXIxM2QKKwlqbnoJLkxvb3BfY3RyMzIKKworCXZtb3ZkcXUJKCVyMTIpLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2cHhvcgkwKCVyZGkpLCV4bW0zLCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZweG9yCTE2KCVyZGkpLCV4bW0zLCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZweG9yCTMyKCVyZGkpLCV4bW0zLCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCXZweG9yCTQ4KCVyZGkpLCV4bW0zLCV4bW04CisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZweG9yCTY0KCVyZGkpLCV4bW0zLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXZweG9yCTgwKCVyZGkpLCV4bW0zLCV4bW0zCisJbGVhcQk5NiglcmRpKSwlcmRpCisKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmNsYXN0CSV4bW01LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jbGFzdAkleG1tNiwleG1tMTEsJXhtbTExCisJdmFlc2VuY2xhc3QJJXhtbTgsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW0xMywleG1tMTMKKwl2YWVzZW5jbGFzdAkleG1tMywleG1tMTQsJXhtbTE0CisJdm1vdnVwcwkleG1tOSwwKCVyc2kpCisJdm1vdnVwcwkleG1tMTAsMTYoJXJzaSkKKwl2bW92dXBzCSV4bW0xMSwzMiglcnNpKQorCXZtb3Z1cHMJJXhtbTEyLDQ4KCVyc2kpCisJdm1vdnVwcwkleG1tMTMsNjQoJXJzaSkKKwl2bW92dXBzCSV4bW0xNCw4MCglcnNpKQorCWxlYXEJOTYoJXJzaSksJXJzaQorCisJLmJ5dGUJMHhmMywweGMzCisuYWxpZ24JMzIKKy5MaGFuZGxlX2N0cjMyXzI6CisJdnBzaHVmYgkleG1tMCwleG1tMSwleG1tNgorCXZtb3ZkcXUJNDgoJXIxMSksJXhtbTUKKwl2cGFkZGQJNjQoJXIxMSksJXhtbTYsJXhtbTEwCisJdnBhZGRkCSV4bW01LCV4bW02LCV4bW0xMQorCXZwYWRkZAkleG1tNSwleG1tMTAsJXhtbTEyCisJdnBzaHVmYgkleG1tMCwleG1tMTAsJXhtbTEwCisJdnBhZGRkCSV4bW01LCV4bW0xMSwleG1tMTMKKwl2cHNodWZiCSV4bW0wLCV4bW0xMSwleG1tMTEKKwl2cHhvcgkleG1tNCwleG1tMTAsJXhtbTEwCisJdnBhZGRkCSV4bW01LCV4bW0xMiwleG1tMTQKKwl2cHNodWZiCSV4bW0wLCV4bW0xMiwleG1tMTIKKwl2cHhvcgkleG1tNCwleG1tMTEsJXhtbTExCisJdnBhZGRkCSV4bW01LCV4bW0xMywleG1tMQorCXZwc2h1ZmIJJXhtbTAsJXhtbTEzLCV4bW0xMworCXZweG9yCSV4bW00LCV4bW0xMiwleG1tMTIKKwl2cHNodWZiCSV4bW0wLCV4bW0xNCwleG1tMTQKKwl2cHhvcgkleG1tNCwleG1tMTMsJXhtbTEzCisJdnBzaHVmYgkleG1tMCwleG1tMSwleG1tMQorCXZweG9yCSV4bW00LCV4bW0xNCwleG1tMTQKKwlqbXAJLkxvb3BfY3RyMzIKKy5jZmlfZW5kcHJvYwkKKy5zaXplCV9hZXNuaV9jdHIzMl82eCwuLV9hZXNuaV9jdHIzMl82eAorCisuZ2xvYmwJYWVzbmlfZ2NtX2VuY3J5cHQKKy5oaWRkZW4gYWVzbmlfZ2NtX2VuY3J5cHQKKy50eXBlCWFlc25pX2djbV9lbmNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTMyCithZXNuaV9nY21fZW5jcnlwdDoKKy5jZmlfc3RhcnRwcm9jCQorCXhvcnEJJXIxMCwlcjEwCisKKworCisKKwljbXBxCSQyODgsJXJkeAorCWpiCS5MZ2NtX2VuY19hYm9ydAorCisJbGVhcQkoJXJzcCksJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKwlwdXNocQklcmJ4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CSglcjgpLCV4bW0xCisJYWRkcQkkLTEyOCwlcnNwCisJbW92bAkxMiglcjgpLCVlYngKKwlsZWFxCS5MYnN3YXBfbWFzayglcmlwKSwlcjExCisJbGVhcQktMTI4KCVyY3gpLCVyMTQKKwltb3ZxCSQweGY4MCwlcjE1CisJbGVhcQkxMjgoJXJjeCksJXJjeAorCXZtb3ZkcXUJKCVyMTEpLCV4bW0wCisJYW5kcQkkLTEyOCwlcnNwCisJbW92bAkyNDAtMTI4KCVyY3gpLCVlYnAKKworCWFuZHEJJXIxNSwlcjE0CisJYW5kcQklcnNwLCVyMTUKKwlzdWJxCSVyMTQsJXIxNQorCWpjCS5MZW5jX25vX2tleV9hbGlhc2luZworCWNtcHEJJDc2OCwlcjE1CisJam5jCS5MZW5jX25vX2tleV9hbGlhc2luZworCXN1YnEJJXIxNSwlcnNwCisuTGVuY19ub19rZXlfYWxpYXNpbmc6CisKKwlsZWFxCSglcnNpKSwlcjE0CisKKworCisKKworCisKKworCWxlYXEJLTE5MiglcnNpLCVyZHgsMSksJXIxNQorCisJc2hycQkkNCwlcmR4CisKKwljYWxsCV9hZXNuaV9jdHIzMl82eAorCXZwc2h1ZmIJJXhtbTAsJXhtbTksJXhtbTgKKwl2cHNodWZiCSV4bW0wLCV4bW0xMCwleG1tMgorCXZtb3ZkcXUJJXhtbTgsMTEyKCVyc3ApCisJdnBzaHVmYgkleG1tMCwleG1tMTEsJXhtbTQKKwl2bW92ZHF1CSV4bW0yLDk2KCVyc3ApCisJdnBzaHVmYgkleG1tMCwleG1tMTIsJXhtbTUKKwl2bW92ZHF1CSV4bW00LDgwKCVyc3ApCisJdnBzaHVmYgkleG1tMCwleG1tMTMsJXhtbTYKKwl2bW92ZHF1CSV4bW01LDY0KCVyc3ApCisJdnBzaHVmYgkleG1tMCwleG1tMTQsJXhtbTcKKwl2bW92ZHF1CSV4bW02LDQ4KCVyc3ApCisKKwljYWxsCV9hZXNuaV9jdHIzMl82eAorCisJdm1vdmRxdQkoJXI5KSwleG1tOAorCWxlYXEJMzIrMzIoJXI5KSwlcjkKKwlzdWJxCSQxMiwlcmR4CisJbW92cQkkMTkyLCVyMTAKKwl2cHNodWZiCSV4bW0wLCV4bW04LCV4bW04CisKKwljYWxsCV9hZXNuaV9jdHIzMl9naGFzaF82eAorCXZtb3ZkcXUJMzIoJXJzcCksJXhtbTcKKwl2bW92ZHF1CSglcjExKSwleG1tMAorCXZtb3ZkcXUJMC0zMiglcjkpLCV4bW0zCisJdnB1bnBja2hxZHEJJXhtbTcsJXhtbTcsJXhtbTEKKwl2bW92ZHF1CTMyLTMyKCVyOSksJXhtbTE1CisJdm1vdnVwcwkleG1tOSwtOTYoJXJzaSkKKwl2cHNodWZiCSV4bW0wLCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTcsJXhtbTEsJXhtbTEKKwl2bW92dXBzCSV4bW0xMCwtODAoJXJzaSkKKwl2cHNodWZiCSV4bW0wLCV4bW0xMCwleG1tMTAKKwl2bW92dXBzCSV4bW0xMSwtNjQoJXJzaSkKKwl2cHNodWZiCSV4bW0wLCV4bW0xMSwleG1tMTEKKwl2bW92dXBzCSV4bW0xMiwtNDgoJXJzaSkKKwl2cHNodWZiCSV4bW0wLCV4bW0xMiwleG1tMTIKKwl2bW92dXBzCSV4bW0xMywtMzIoJXJzaSkKKwl2cHNodWZiCSV4bW0wLCV4bW0xMywleG1tMTMKKwl2bW92dXBzCSV4bW0xNCwtMTYoJXJzaSkKKwl2cHNodWZiCSV4bW0wLCV4bW0xNCwleG1tMTQKKwl2bW92ZHF1CSV4bW05LDE2KCVyc3ApCisJdm1vdmRxdQk0OCglcnNwKSwleG1tNgorCXZtb3ZkcXUJMTYtMzIoJXI5KSwleG1tMAorCXZwdW5wY2tocWRxCSV4bW02LCV4bW02LCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMywleG1tNywleG1tNQorCXZweG9yCSV4bW02LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tNywleG1tNworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTE1LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTY0KCVyc3ApLCV4bW05CisJdnBjbG11bHFkcQkkMHgwMCwleG1tMCwleG1tNiwleG1tNAorCXZtb3ZkcXUJNDgtMzIoJXI5KSwleG1tMworCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJdnB1bnBja2hxZHEJJXhtbTksJXhtbTksJXhtbTUKKwl2cGNsbXVscWRxCSQweDExLCV4bW0wLCV4bW02LCV4bW02CisJdnB4b3IJJXhtbTksJXhtbTUsJXhtbTUKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTE1LCV4bW0yLCV4bW0yCisJdm1vdmRxdQk4MC0zMiglcjkpLCV4bW0xNQorCXZweG9yCSV4bW0xLCV4bW0yLCV4bW0yCisKKwl2bW92ZHF1CTgwKCVyc3ApLCV4bW0xCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMywleG1tOSwleG1tNworCXZtb3ZkcXUJNjQtMzIoJXI5KSwleG1tMAorCXZweG9yCSV4bW00LCV4bW03LCV4bW03CisJdnB1bnBja2hxZHEJJXhtbTEsJXhtbTEsJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW0zLCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNiwleG1tOSwleG1tOQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTE1LCV4bW01LCV4bW01CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKworCXZtb3ZkcXUJOTYoJXJzcCksJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0wLCV4bW0xLCV4bW02CisJdm1vdmRxdQk5Ni0zMiglcjkpLCV4bW0zCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwl2cHVucGNraHFkcQkleG1tMiwleG1tMiwleG1tNworCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTAsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tNywleG1tNworCXZweG9yCSV4bW05LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTUsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CTEyOC0zMiglcjkpLCV4bW0xNQorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisKKwl2cHhvcgkxMTIoJXJzcCksJXhtbTgsJXhtbTgKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0zLCV4bW0yLCV4bW01CisJdm1vdmRxdQkxMTItMzIoJXI5KSwleG1tMAorCXZwdW5wY2tocWRxCSV4bW04LCV4bW04LCV4bW05CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDExLCV4bW0zLCV4bW0yLCV4bW0yCisJdnB4b3IJJXhtbTgsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMSwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTE1LCV4bW03LCV4bW03CisJdnB4b3IJJXhtbTQsJXhtbTcsJXhtbTQKKworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTAsJXhtbTgsJXhtbTYKKwl2bW92ZHF1CTAtMzIoJXI5KSwleG1tMworCXZwdW5wY2tocWRxCSV4bW0xNCwleG1tMTQsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0wLCV4bW04LCV4bW04CisJdnB4b3IJJXhtbTE0LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTUsJXhtbTYsJXhtbTUKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xNSwleG1tOSwleG1tOQorCXZtb3ZkcXUJMzItMzIoJXI5KSwleG1tMTUKKwl2cHhvcgkleG1tMiwleG1tOCwleG1tNworCXZweG9yCSV4bW00LCV4bW05LCV4bW02CisKKwl2bW92ZHF1CTE2LTMyKCVyOSksJXhtbTAKKwl2cHhvcgkleG1tNSwleG1tNywleG1tOQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTMsJXhtbTE0LCV4bW00CisJdnB4b3IJJXhtbTksJXhtbTYsJXhtbTYKKwl2cHVucGNraHFkcQkleG1tMTMsJXhtbTEzLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tMTQsJXhtbTE0CisJdnB4b3IJJXhtbTEzLCV4bW0yLCV4bW0yCisJdnBzbGxkcQkkOCwleG1tNiwleG1tOQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTE1LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTksJXhtbTUsJXhtbTgKKwl2cHNybGRxCSQ4LCV4bW02LCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTcKKworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTAsJXhtbTEzLCV4bW01CisJdm1vdmRxdQk0OC0zMiglcjkpLCV4bW0zCisJdnB4b3IJJXhtbTQsJXhtbTUsJXhtbTUKKwl2cHVucGNraHFkcQkleG1tMTIsJXhtbTEyLCV4bW05CisJdnBjbG11bHFkcQkkMHgxMSwleG1tMCwleG1tMTMsJXhtbTEzCisJdnB4b3IJJXhtbTEyLCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTE0LCV4bW0xMywleG1tMTMKKwl2cGFsaWducgkkOCwleG1tOCwleG1tOCwleG1tMTQKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xNSwleG1tMiwleG1tMgorCXZtb3ZkcXUJODAtMzIoJXI5KSwleG1tMTUKKwl2cHhvcgkleG1tMSwleG1tMiwleG1tMgorCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMywleG1tMTIsJXhtbTQKKwl2bW92ZHF1CTY0LTMyKCVyOSksJXhtbTAKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCXZwdW5wY2tocWRxCSV4bW0xMSwleG1tMTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0zLCV4bW0xMiwleG1tMTIKKwl2cHhvcgkleG1tMTEsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMTMsJXhtbTEyLCV4bW0xMgorCXZ4b3JwcwkxNiglcnNwKSwleG1tNywleG1tNworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTE1LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTIsJXhtbTksJXhtbTkKKworCXZwY2xtdWxxZHEJJDB4MTAsMTYoJXIxMSksJXhtbTgsJXhtbTgKKwl2eG9ycHMJJXhtbTE0LCV4bW04LCV4bW04CisKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0wLCV4bW0xMSwleG1tNQorCXZtb3ZkcXUJOTYtMzIoJXI5KSwleG1tMworCXZweG9yCSV4bW00LCV4bW01LCV4bW01CisJdnB1bnBja2hxZHEJJXhtbTEwLCV4bW0xMCwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTAsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW0xMCwleG1tMiwleG1tMgorCXZwYWxpZ25yCSQ4LCV4bW04LCV4bW04LCV4bW0xNAorCXZweG9yCSV4bW0xMiwleG1tMTEsJXhtbTExCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTUsJXhtbTEsJXhtbTEKKwl2bW92ZHF1CTEyOC0zMiglcjkpLCV4bW0xNQorCXZweG9yCSV4bW05LCV4bW0xLCV4bW0xCisKKwl2eG9ycHMJJXhtbTcsJXhtbTE0LCV4bW0xNAorCXZwY2xtdWxxZHEJJDB4MTAsMTYoJXIxMSksJXhtbTgsJXhtbTgKKwl2eG9ycHMJJXhtbTE0LCV4bW04LCV4bW04CisKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0zLCV4bW0xMCwleG1tNAorCXZtb3ZkcXUJMTEyLTMyKCVyOSksJXhtbTAKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCXZwdW5wY2tocWRxCSV4bW04LCV4bW04LCV4bW05CisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTgsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMTEsJXhtbTEwLCV4bW0xMAorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTE1LCV4bW0yLCV4bW0yCisJdnB4b3IJJXhtbTEsJXhtbTIsJXhtbTIKKworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTAsJXhtbTgsJXhtbTUKKwl2cGNsbXVscWRxCSQweDExLCV4bW0wLCV4bW04LCV4bW03CisJdnB4b3IJJXhtbTQsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xNSwleG1tOSwleG1tNgorCXZweG9yCSV4bW0xMCwleG1tNywleG1tNworCXZweG9yCSV4bW0yLCV4bW02LCV4bW02CisKKwl2cHhvcgkleG1tNSwleG1tNywleG1tNAorCXZweG9yCSV4bW00LCV4bW02LCV4bW02CisJdnBzbGxkcQkkOCwleG1tNiwleG1tMQorCXZtb3ZkcXUJMTYoJXIxMSksJXhtbTMKKwl2cHNybGRxCSQ4LCV4bW02LCV4bW02CisJdnB4b3IJJXhtbTEsJXhtbTUsJXhtbTgKKwl2cHhvcgkleG1tNiwleG1tNywleG1tNworCisJdnBhbGlnbnIJJDgsJXhtbTgsJXhtbTgsJXhtbTIKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW04LCV4bW04CisJdnB4b3IJJXhtbTIsJXhtbTgsJXhtbTgKKworCXZwYWxpZ25yCSQ4LCV4bW04LCV4bW04LCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tOCwleG1tOAorCXZweG9yCSV4bW03LCV4bW0yLCV4bW0yCisJdnB4b3IJJXhtbTIsJXhtbTgsJXhtbTgKKwl2cHNodWZiCSglcjExKSwleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTgsLTY0KCVyOSkKKworCXZ6ZXJvdXBwZXIKKwltb3ZxCS00OCglcmF4KSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyYXgpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJheCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyYXgpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcmF4KSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyYXgpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGdjbV9lbmNfYWJvcnQ6CisJbW92cQklcjEwLCVyYXgKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlc25pX2djbV9lbmNyeXB0LC4tYWVzbmlfZ2NtX2VuY3J5cHQKKy5hbGlnbgk2NAorLkxic3dhcF9tYXNrOgorLmJ5dGUJMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDcsNiw1LDQsMywyLDEsMAorLkxwb2x5OgorLmJ5dGUJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMHhjMgorLkxvbmVfbXNiOgorLmJ5dGUJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMQorLkx0d29fbHNiOgorLmJ5dGUJMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorLkxvbmVfbHNiOgorLmJ5dGUJMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorLmJ5dGUJNjUsNjksODMsNDUsNzgsNzMsMzIsNzEsNjcsNzcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgk2NAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYmY5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODZfNjQuUwpAQCAtMCwwICsxLDQ0NTEgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisuaGlkZGVuIE9QRU5TU0xfaWEzMmNhcF9QCisuZ2xvYmwJYWVzX2h3X2VuY3J5cHQKKy5oaWRkZW4gYWVzX2h3X2VuY3J5cHQKKy50eXBlCWFlc19od19lbmNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNfaHdfZW5jcnlwdDoKKwltb3Z1cHMJKCVyZGkpLCV4bW0yCisJbW92bAkyNDAoJXJkeCksJWVheAorCW1vdnVwcwkoJXJkeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJkeCksJXhtbTEKKwlsZWFxCTMyKCVyZHgpLCVyZHgKKwl4b3JwcwkleG1tMCwleG1tMgorLkxvb3BfZW5jMV8xOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyZHgpLCV4bW0xCisJbGVhcQkxNiglcmR4KSwlcmR4CisJam56CS5Mb29wX2VuYzFfMQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwlweG9yCSV4bW0yLCV4bW0yCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlhZXNfaHdfZW5jcnlwdCwuLWFlc19od19lbmNyeXB0CisKKy5nbG9ibAlhZXNfaHdfZGVjcnlwdAorLmhpZGRlbiBhZXNfaHdfZGVjcnlwdAorLnR5cGUJYWVzX2h3X2RlY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc19od19kZWNyeXB0OgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwltb3ZsCTI0MCglcmR4KSwlZWF4CisJbW92dXBzCSglcmR4KSwleG1tMAorCW1vdnVwcwkxNiglcmR4KSwleG1tMQorCWxlYXEJMzIoJXJkeCksJXJkeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9kZWMxXzI6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXJkeCksJXhtbTEKKwlsZWFxCTE2KCVyZHgpLCVyZHgKKwlqbnoJLkxvb3BfZGVjMV8yCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCWFlc19od19kZWNyeXB0LCAuLWFlc19od19kZWNyeXB0CisudHlwZQlfYWVzbmlfZW5jcnlwdDIsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9lbmNyeXB0MjoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwkzMiglcmN4KSwleG1tMAorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKwlhZGRxCSQxNiwlcmF4CisKKy5MZW5jX2xvb3AyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpuegkuTGVuY19sb29wMgorCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX2Flc25pX2VuY3J5cHQyLC4tX2Flc25pX2VuY3J5cHQyCisudHlwZQlfYWVzbmlfZGVjcnlwdDIsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9kZWNyeXB0MjoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwkzMiglcmN4KSwleG1tMAorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKwlhZGRxCSQxNiwlcmF4CisKKy5MZGVjX2xvb3AyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpuegkuTGRlY19sb29wMgorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIxNgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX2Flc25pX2RlY3J5cHQyLC4tX2Flc25pX2RlY3J5cHQyCisudHlwZQlfYWVzbmlfZW5jcnlwdDMsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9lbmNyeXB0MzoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCXhvcnBzCSV4bW0wLCV4bW00CisJbW92dXBzCTMyKCVyY3gpLCV4bW0wCisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorCW5lZ3EJJXJheAorCWFkZHEJJDE2LCVyYXgKKworLkxlbmNfbG9vcDM6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxlbmNfbG9vcDMKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX2Flc25pX2VuY3J5cHQzLC4tX2Flc25pX2VuY3J5cHQzCisudHlwZQlfYWVzbmlfZGVjcnlwdDMsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9kZWNyeXB0MzoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCXhvcnBzCSV4bW0wLCV4bW00CisJbW92dXBzCTMyKCVyY3gpLCV4bW0wCisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorCW5lZ3EJJXJheAorCWFkZHEJJDE2LCVyYXgKKworLkxkZWNfbG9vcDM6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxkZWNfbG9vcDMKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIyNAorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX2Flc25pX2RlY3J5cHQzLC4tX2Flc25pX2RlY3J5cHQzCisudHlwZQlfYWVzbmlfZW5jcnlwdDQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9lbmNyeXB0NDoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCXhvcnBzCSV4bW0wLCV4bW00CisJeG9ycHMJJXhtbTAsJXhtbTUKKwltb3Z1cHMJMzIoJXJjeCksJXhtbTAKKwlsZWFxCTMyKCVyY3gsJXJheCwxKSwlcmN4CisJbmVncQklcmF4CisuYnl0ZQkweDBmLDB4MWYsMHgwMAorCWFkZHEJJDE2LCVyYXgKKworLkxlbmNfbG9vcDQ6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpuegkuTGVuY19sb29wNAorCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMzIKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9hZXNuaV9lbmNyeXB0NCwuLV9hZXNuaV9lbmNyeXB0NAorLnR5cGUJX2Flc25pX2RlY3J5cHQ0LEBmdW5jdGlvbgorLmFsaWduCTE2CitfYWVzbmlfZGVjcnlwdDQ6CisJbW92dXBzCSglcmN4KSwleG1tMAorCXNobGwJJDQsJWVheAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJeG9ycHMJJXhtbTAsJXhtbTMKKwl4b3JwcwkleG1tMCwleG1tNAorCXhvcnBzCSV4bW0wLCV4bW01CisJbW92dXBzCTMyKCVyY3gpLCV4bW0wCisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorCW5lZ3EJJXJheAorLmJ5dGUJMHgwZiwweDFmLDB4MDAKKwlhZGRxCSQxNiwlcmF4CisKKy5MZGVjX2xvb3A0OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxkZWNfbG9vcDQKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjMyCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfYWVzbmlfZGVjcnlwdDQsLi1fYWVzbmlfZGVjcnlwdDQKKy50eXBlCV9hZXNuaV9lbmNyeXB0NixAZnVuY3Rpb24KKy5hbGlnbgkxNgorX2Flc25pX2VuY3J5cHQ2OgorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwlzaGxsCSQ0LCVlYXgKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcHhvcgkleG1tMCwleG1tNQorCXB4b3IJJXhtbTAsJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJcHhvcgkleG1tMCwleG1tNworCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0wCisJYWRkcQkkMTYsJXJheAorCWptcAkuTGVuY19sb29wNl9lbnRlcgorLmFsaWduCTE2CisuTGVuY19sb29wNjoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5MZW5jX2xvb3A2X2VudGVyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CS5MZW5jX2xvb3A2CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyNDgKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9hZXNuaV9lbmNyeXB0NiwuLV9hZXNuaV9lbmNyeXB0NgorLnR5cGUJX2Flc25pX2RlY3J5cHQ2LEBmdW5jdGlvbgorLmFsaWduCTE2CitfYWVzbmlfZGVjcnlwdDY6CisJbW92dXBzCSglcmN4KSwleG1tMAorCXNobGwJJDQsJWVheAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorCW5lZ3EJJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwlweG9yCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMCwleG1tNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKwlweG9yCSV4bW0wLCV4bW03CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTAKKwlhZGRxCSQxNiwlcmF4CisJam1wCS5MZGVjX2xvb3A2X2VudGVyCisuYWxpZ24JMTYKKy5MZGVjX2xvb3A2OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLkxkZWNfbG9vcDZfZW50ZXI6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxkZWNfbG9vcDYKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDI0OAorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX2Flc25pX2RlY3J5cHQ2LC4tX2Flc25pX2RlY3J5cHQ2CisudHlwZQlfYWVzbmlfZW5jcnlwdDgsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19hZXNuaV9lbmNyeXB0ODoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMCwleG1tNgorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJcHhvcgkleG1tMCwleG1tNworCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcHhvcgkleG1tMCwleG1tOQorCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0wCisJYWRkcQkkMTYsJXJheAorCWptcAkuTGVuY19sb29wOF9pbm5lcgorLmFsaWduCTE2CisuTGVuY19sb29wODoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLkxlbmNfbG9vcDhfaW5uZXI6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisuTGVuY19sb29wOF9lbnRlcjoKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMAorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CS5MZW5jX2xvb3A4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMSwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjEsMjAwCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfYWVzbmlfZW5jcnlwdDgsLi1fYWVzbmlfZW5jcnlwdDgKKy50eXBlCV9hZXNuaV9kZWNyeXB0OCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX2Flc25pX2RlY3J5cHQ4OgorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwlzaGxsCSQ0LCVlYXgKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXhvcnBzCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tNAorCXB4b3IJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW02CisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorCW5lZ3EJJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlweG9yCSV4bW0wLCV4bW03CisJcHhvcgkleG1tMCwleG1tOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwlweG9yCSV4bW0wLCV4bW05CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTAKKwlhZGRxCSQxNiwlcmF4CisJam1wCS5MZGVjX2xvb3A4X2lubmVyCisuYWxpZ24JMTYKKy5MZGVjX2xvb3A4OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuTGRlY19sb29wOF9pbm5lcjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKy5MZGVjX2xvb3A4X2VudGVyOgorCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAwCisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxkZWNfbG9vcDgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIzLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMywyMDAKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9hZXNuaV9kZWNyeXB0OCwuLV9hZXNuaV9kZWNyeXB0OAorLmdsb2JsCWFlc19od19lY2JfZW5jcnlwdAorLmhpZGRlbiBhZXNfaHdfZWNiX2VuY3J5cHQKKy50eXBlCWFlc19od19lY2JfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzX2h3X2VjYl9lbmNyeXB0OgorCWFuZHEJJC0xNiwlcmR4CisJanoJLkxlY2JfcmV0CisKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnEJJXJjeCwlcjExCisJbW92bAklZWF4LCVyMTBkCisJdGVzdGwJJXI4ZCwlcjhkCisJanoJLkxlY2JfZGVjcnlwdAorCisJY21wcQkkMHg4MCwlcmR4CisJamIJLkxlY2JfZW5jX3RhaWwKKworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTgKKwltb3ZkcXUJMTEyKCVyZGkpLCV4bW05CisJbGVhcQkxMjgoJXJkaSksJXJkaQorCXN1YnEJJDB4ODAsJXJkeAorCWptcAkuTGVjYl9lbmNfbG9vcDhfZW50ZXIKKy5hbGlnbgkxNgorLkxlY2JfZW5jX2xvb3A4OgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3ZxCSVyMTEsJXJjeAorCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZsCSVyMTBkLCVlYXgKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwltb3Z1cHMJJXhtbTgsOTYoJXJzaSkKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTgKKwltb3Z1cHMJJXhtbTksMTEyKCVyc2kpCisJbGVhcQkxMjgoJXJzaSksJXJzaQorCW1vdmRxdQkxMTIoJXJkaSksJXhtbTkKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisuTGVjYl9lbmNfbG9vcDhfZW50ZXI6CisKKwljYWxsCV9hZXNuaV9lbmNyeXB0OAorCisJc3VicQkkMHg4MCwlcmR4CisJam5jCS5MZWNiX2VuY19sb29wOAorCisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnEJJXIxMSwlcmN4CisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92bAklcjEwZCwlZWF4CisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJbW92dXBzCSV4bW04LDk2KCVyc2kpCisJbW92dXBzCSV4bW05LDExMiglcnNpKQorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlhZGRxCSQweDgwLCVyZHgKKwlqegkuTGVjYl9yZXQKKworLkxlY2JfZW5jX3RhaWw6CisJbW92dXBzCSglcmRpKSwleG1tMgorCWNtcHEJJDB4MjAsJXJkeAorCWpiCS5MZWNiX2VuY19vbmUKKwltb3Z1cHMJMTYoJXJkaSksJXhtbTMKKwlqZQkuTGVjYl9lbmNfdHdvCisJbW92dXBzCTMyKCVyZGkpLCV4bW00CisJY21wcQkkMHg0MCwlcmR4CisJamIJLkxlY2JfZW5jX3RocmVlCisJbW92dXBzCTQ4KCVyZGkpLCV4bW01CisJamUJLkxlY2JfZW5jX2ZvdXIKKwltb3Z1cHMJNjQoJXJkaSksJXhtbTYKKwljbXBxCSQweDYwLCVyZHgKKwlqYgkuTGVjYl9lbmNfZml2ZQorCW1vdnVwcwk4MCglcmRpKSwleG1tNworCWplCS5MZWNiX2VuY19zaXgKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTgKKwl4b3JwcwkleG1tOSwleG1tOQorCWNhbGwJX2Flc25pX2VuY3J5cHQ4CisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCW1vdnVwcwkleG1tOCw5NiglcnNpKQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZW5jX29uZToKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKKy5Mb29wX2VuYzFfMzoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpuegkuTG9vcF9lbmMxXzMKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92dXBzCSV4bW0yLCglcnNpKQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZW5jX3R3bzoKKwljYWxsCV9hZXNuaV9lbmNyeXB0MgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2VuY190aHJlZToKKwljYWxsCV9hZXNuaV9lbmNyeXB0MworCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2VuY19mb3VyOgorCWNhbGwJX2Flc25pX2VuY3J5cHQ0CisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZW5jX2ZpdmU6CisJeG9ycHMJJXhtbTcsJXhtbTcKKwljYWxsCV9hZXNuaV9lbmNyeXB0NgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2VuY19zaXg6CisJY2FsbAlfYWVzbmlfZW5jcnlwdDYKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJam1wCS5MZWNiX3JldAorCisuYWxpZ24JMTYKKy5MZWNiX2RlY3J5cHQ6CisJY21wcQkkMHg4MCwlcmR4CisJamIJLkxlY2JfZGVjX3RhaWwKKworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTgKKwltb3ZkcXUJMTEyKCVyZGkpLCV4bW05CisJbGVhcQkxMjgoJXJkaSksJXJkaQorCXN1YnEJJDB4ODAsJXJkeAorCWptcAkuTGVjYl9kZWNfbG9vcDhfZW50ZXIKKy5hbGlnbgkxNgorLkxlY2JfZGVjX2xvb3A4OgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3ZxCSVyMTEsJXJjeAorCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZsCSVyMTBkLCVlYXgKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwltb3Z1cHMJJXhtbTgsOTYoJXJzaSkKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTgKKwltb3Z1cHMJJXhtbTksMTEyKCVyc2kpCisJbGVhcQkxMjgoJXJzaSksJXJzaQorCW1vdmRxdQkxMTIoJXJkaSksJXhtbTkKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisuTGVjYl9kZWNfbG9vcDhfZW50ZXI6CisKKwljYWxsCV9hZXNuaV9kZWNyeXB0OAorCisJbW92dXBzCSglcjExKSwleG1tMAorCXN1YnEJJDB4ODAsJXJkeAorCWpuYwkuTGVjYl9kZWNfbG9vcDgKKworCW1vdnVwcwkleG1tMiwoJXJzaSkKKwlweG9yCSV4bW0yLCV4bW0yCisJbW92cQklcjExLCVyY3gKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJbW92bAklcjEwZCwlZWF4CisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tNAorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCXB4b3IJJXhtbTUsJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwlweG9yCSV4bW02LCV4bW02CisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJcHhvcgkleG1tNywleG1tNworCW1vdnVwcwkleG1tOCw5NiglcnNpKQorCXB4b3IJJXhtbTgsJXhtbTgKKwltb3Z1cHMJJXhtbTksMTEyKCVyc2kpCisJcHhvcgkleG1tOSwleG1tOQorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlhZGRxCSQweDgwLCVyZHgKKwlqegkuTGVjYl9yZXQKKworLkxlY2JfZGVjX3RhaWw6CisJbW92dXBzCSglcmRpKSwleG1tMgorCWNtcHEJJDB4MjAsJXJkeAorCWpiCS5MZWNiX2RlY19vbmUKKwltb3Z1cHMJMTYoJXJkaSksJXhtbTMKKwlqZQkuTGVjYl9kZWNfdHdvCisJbW92dXBzCTMyKCVyZGkpLCV4bW00CisJY21wcQkkMHg0MCwlcmR4CisJamIJLkxlY2JfZGVjX3RocmVlCisJbW92dXBzCTQ4KCVyZGkpLCV4bW01CisJamUJLkxlY2JfZGVjX2ZvdXIKKwltb3Z1cHMJNjQoJXJkaSksJXhtbTYKKwljbXBxCSQweDYwLCVyZHgKKwlqYgkuTGVjYl9kZWNfZml2ZQorCW1vdnVwcwk4MCglcmRpKSwleG1tNworCWplCS5MZWNiX2RlY19zaXgKKwltb3Z1cHMJOTYoJXJkaSksJXhtbTgKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJeG9ycHMJJXhtbTksJXhtbTkKKwljYWxsCV9hZXNuaV9kZWNyeXB0OAorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwlweG9yCSV4bW0yLCV4bW0yCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwlweG9yCSV4bW01LCV4bW01CisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJcHhvcgkleG1tNiwleG1tNgorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCXB4b3IJJXhtbTcsJXhtbTcKKwltb3Z1cHMJJXhtbTgsOTYoJXJzaSkKKwlweG9yCSV4bW04LCV4bW04CisJcHhvcgkleG1tOSwleG1tOQorCWptcAkuTGVjYl9yZXQKKy5hbGlnbgkxNgorLkxlY2JfZGVjX29uZToKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKKy5Mb29wX2RlYzFfNDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpuegkuTG9vcF9kZWMxXzQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2RlY190d286CisJY2FsbAlfYWVzbmlfZGVjcnlwdDIKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2RlY190aHJlZToKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCW1vdnVwcwkleG1tMiwoJXJzaSkKKwlweG9yCSV4bW0yLCV4bW0yCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTQsJXhtbTQKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2RlY19mb3VyOgorCWNhbGwJX2Flc25pX2RlY3J5cHQ0CisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tNAorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCXB4b3IJJXhtbTUsJXhtbTUKKwlqbXAJLkxlY2JfcmV0CisuYWxpZ24JMTYKKy5MZWNiX2RlY19maXZlOgorCXhvcnBzCSV4bW03LCV4bW03CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tNQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJam1wCS5MZWNiX3JldAorLmFsaWduCTE2CisuTGVjYl9kZWNfc2l4OgorCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tNAorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCXB4b3IJJXhtbTUsJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwlweG9yCSV4bW02LCV4bW02CisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJcHhvcgkleG1tNywleG1tNworCisuTGVjYl9yZXQ6CisJeG9ycHMJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlhZXNfaHdfZWNiX2VuY3J5cHQsLi1hZXNfaHdfZWNiX2VuY3J5cHQKKy5nbG9ibAlhZXNfaHdfY2NtNjRfZW5jcnlwdF9ibG9ja3MKKy5oaWRkZW4gYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzCisudHlwZQlhZXNfaHdfY2NtNjRfZW5jcnlwdF9ibG9ja3MsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc19od19jY202NF9lbmNyeXB0X2Jsb2NrczoKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJbW92ZHF1CSglcjgpLCV4bW02CisJbW92ZHFhCS5MaW5jcmVtZW50NjQoJXJpcCksJXhtbTkKKwltb3ZkcWEJLkxic3dhcF9tYXNrKCVyaXApLCV4bW03CisKKwlzaGxsCSQ0LCVlYXgKKwltb3ZsCSQxNiwlcjEwZAorCWxlYXEJMCglcmN4KSwlcjExCisJbW92ZHF1CSglcjkpLCV4bW0zCisJbW92ZHFhCSV4bW02LCV4bW0yCisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ3CisJc3VicQklcmF4LCVyMTAKKwlqbXAJLkxjY202NF9lbmNfb3V0ZXIKKy5hbGlnbgkxNgorLkxjY202NF9lbmNfb3V0ZXI6CisJbW92dXBzCSglcjExKSwleG1tMAorCW1vdnEJJXIxMCwlcmF4CisJbW92dXBzCSglcmRpKSwleG1tOAorCisJeG9ycHMJJXhtbTAsJXhtbTIKKwltb3Z1cHMJMTYoJXIxMSksJXhtbTEKKwl4b3JwcwkleG1tOCwleG1tMAorCXhvcnBzCSV4bW0wLCV4bW0zCisJbW92dXBzCTMyKCVyMTEpLCV4bW0wCisKKy5MY2NtNjRfZW5jMl9sb29wOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpuegkuTGNjbTY0X2VuYzJfbG9vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcGFkZHEJJXhtbTksJXhtbTYKKwlkZWNxCSVyZHgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisJeG9ycHMJJXhtbTIsJXhtbTgKKwltb3ZkcWEJJXhtbTYsJXhtbTIKKwltb3Z1cHMJJXhtbTgsKCVyc2kpCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlqbnoJLkxjY202NF9lbmNfb3V0ZXIKKworCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywoJXI5KQorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW04LCV4bW04CisJcHhvcgkleG1tNiwleG1tNgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzLC4tYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzCisuZ2xvYmwJYWVzX2h3X2NjbTY0X2RlY3J5cHRfYmxvY2tzCisuaGlkZGVuIGFlc19od19jY202NF9kZWNyeXB0X2Jsb2NrcworLnR5cGUJYWVzX2h3X2NjbTY0X2RlY3J5cHRfYmxvY2tzLEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNfaHdfY2NtNjRfZGVjcnlwdF9ibG9ja3M6CisJbW92bAkyNDAoJXJjeCksJWVheAorCW1vdnVwcwkoJXI4KSwleG1tNgorCW1vdmRxdQkoJXI5KSwleG1tMworCW1vdmRxYQkuTGluY3JlbWVudDY0KCVyaXApLCV4bW05CisJbW92ZHFhCS5MYnN3YXBfbWFzayglcmlwKSwleG1tNworCisJbW92YXBzCSV4bW02LCV4bW0yCisJbW92bAklZWF4LCVyMTBkCisJbW92cQklcmN4LCVyMTEKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NworCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwl4b3JwcwkleG1tMCwleG1tMgorLkxvb3BfZW5jMV81OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CS5Mb29wX2VuYzFfNQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwlzaGxsCSQ0LCVyMTBkCisJbW92bAkkMTYsJWVheAorCW1vdnVwcwkoJXJkaSksJXhtbTgKKwlwYWRkcQkleG1tOSwleG1tNgorCWxlYXEJMTYoJXJkaSksJXJkaQorCXN1YnEJJXIxMCwlcmF4CisJbGVhcQkzMiglcjExLCVyMTAsMSksJXJjeAorCW1vdnEJJXJheCwlcjEwCisJam1wCS5MY2NtNjRfZGVjX291dGVyCisuYWxpZ24JMTYKKy5MY2NtNjRfZGVjX291dGVyOgorCXhvcnBzCSV4bW0yLCV4bW04CisJbW92ZHFhCSV4bW02LCV4bW0yCisJbW92dXBzCSV4bW04LCglcnNpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE1CisKKwlzdWJxCSQxLCVyZHgKKwlqegkuTGNjbTY0X2RlY19icmVhaworCisJbW92dXBzCSglcjExKSwleG1tMAorCW1vdnEJJXIxMCwlcmF4CisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTgKKwl4b3JwcwkleG1tMCwleG1tMgorCXhvcnBzCSV4bW04LCV4bW0zCisJbW92dXBzCTMyKCVyMTEpLCV4bW0wCisJam1wCS5MY2NtNjRfZGVjMl9sb29wCisuYWxpZ24JMTYKKy5MY2NtNjRfZGVjMl9sb29wOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpuegkuTGNjbTY0X2RlYzJfbG9vcAorCW1vdnVwcwkoJXJkaSksJXhtbTgKKwlwYWRkcQkleG1tOSwleG1tNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTYKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwlqbXAJLkxjY202NF9kZWNfb3V0ZXIKKworLmFsaWduCTE2CisuTGNjbTY0X2RlY19icmVhazoKKworCW1vdmwJMjQwKCVyMTEpLCVlYXgKKwltb3Z1cHMJKCVyMTEpLCV4bW0wCisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTgKKwlsZWFxCTMyKCVyMTEpLCVyMTEKKwl4b3JwcwkleG1tOCwleG1tMworLkxvb3BfZW5jMV82OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyMTEpLCV4bW0xCisJbGVhcQkxNiglcjExKSwlcjExCisJam56CS5Mb29wX2VuYzFfNgorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTcKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3Z1cHMJJXhtbTMsKCVyOSkKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTYsJXhtbTYKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCWFlc19od19jY202NF9kZWNyeXB0X2Jsb2NrcywuLWFlc19od19jY202NF9kZWNyeXB0X2Jsb2NrcworLmdsb2JsCWFlc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLmhpZGRlbiBhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy50eXBlCWFlc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcyxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzOgorLmNmaV9zdGFydHByb2MJCisJY21wcQkkMSwlcmR4CisJam5lCS5MY3RyMzJfYnVsaworCisKKworCW1vdnVwcwkoJXI4KSwleG1tMgorCW1vdnVwcwkoJXJkaSksJXhtbTMKKwltb3ZsCTI0MCglcmN4KSwlZWR4CisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9lbmMxXzc6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVkeAorCW1vdnVwcwkoJXJjeCksJXhtbTEKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwlqbnoJLkxvb3BfZW5jMV83CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJeG9ycHMJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJbW92dXBzCSV4bW0yLCglcnNpKQorCXhvcnBzCSV4bW0yLCV4bW0yCisJam1wCS5MY3RyMzJfZXBpbG9ndWUKKworLmFsaWduCTE2CisuTGN0cjMyX2J1bGs6CisJbGVhcQkoJXJzcCksJXIxMQorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyMTEKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0xNgorCXN1YnEJJDEyOCwlcnNwCisJYW5kcQkkLTE2LCVyc3AKKworCisKKworCW1vdmRxdQkoJXI4KSwleG1tMgorCW1vdmRxdQkoJXJjeCksJXhtbTAKKwltb3ZsCTEyKCVyOCksJXI4ZAorCXB4b3IJJXhtbTAsJXhtbTIKKwltb3ZsCTEyKCVyY3gpLCVlYnAKKwltb3ZkcWEJJXhtbTIsMCglcnNwKQorCWJzd2FwbAklcjhkCisJbW92ZHFhCSV4bW0yLCV4bW0zCisJbW92ZHFhCSV4bW0yLCV4bW00CisJbW92ZHFhCSV4bW0yLCV4bW01CisJbW92ZHFhCSV4bW0yLDY0KCVyc3ApCisJbW92ZHFhCSV4bW0yLDgwKCVyc3ApCisJbW92ZHFhCSV4bW0yLDk2KCVyc3ApCisJbW92cQklcmR4LCVyMTAKKwltb3ZkcWEJJXhtbTIsMTEyKCVyc3ApCisKKwlsZWFxCTEoJXI4KSwlcmF4CisJbGVhcQkyKCVyOCksJXJkeAorCWJzd2FwbAklZWF4CisJYnN3YXBsCSVlZHgKKwl4b3JsCSVlYnAsJWVheAorCXhvcmwJJWVicCwlZWR4CisuYnl0ZQkxMDIsMTUsNTgsMzQsMjE2LDMKKwlsZWFxCTMoJXI4KSwlcmF4CisJbW92ZHFhCSV4bW0zLDE2KCVyc3ApCisuYnl0ZQkxMDIsMTUsNTgsMzQsMjI2LDMKKwlic3dhcGwJJWVheAorCW1vdnEJJXIxMCwlcmR4CisJbGVhcQk0KCVyOCksJXIxMAorCW1vdmRxYQkleG1tNCwzMiglcnNwKQorCXhvcmwJJWVicCwlZWF4CisJYnN3YXBsCSVyMTBkCisuYnl0ZQkxMDIsMTUsNTgsMzQsMjMyLDMKKwl4b3JsCSVlYnAsJXIxMGQKKwltb3ZkcWEJJXhtbTUsNDgoJXJzcCkKKwlsZWFxCTUoJXI4KSwlcjkKKwltb3ZsCSVyMTBkLDY0KzEyKCVyc3ApCisJYnN3YXBsCSVyOWQKKwlsZWFxCTYoJXI4KSwlcjEwCisJbW92bAkyNDAoJXJjeCksJWVheAorCXhvcmwJJWVicCwlcjlkCisJYnN3YXBsCSVyMTBkCisJbW92bAklcjlkLDgwKzEyKCVyc3ApCisJeG9ybAklZWJwLCVyMTBkCisJbGVhcQk3KCVyOCksJXI5CisJbW92bAklcjEwZCw5NisxMiglcnNwKQorCWJzd2FwbAklcjlkCisJbGVhcQlPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjEwCisJbW92bAk0KCVyMTApLCVyMTBkCisJeG9ybAklZWJwLCVyOWQKKwlhbmRsCSQ3MTMwMzE2OCwlcjEwZAorCW1vdmwJJXI5ZCwxMTIrMTIoJXJzcCkKKworCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCisJbW92ZHFhCTY0KCVyc3ApLCV4bW02CisJbW92ZHFhCTgwKCVyc3ApLCV4bW03CisKKwljbXBxCSQ4LCVyZHgKKwlqYgkuTGN0cjMyX3RhaWwKKworCXN1YnEJJDYsJXJkeAorCWNtcGwJJDQxOTQzMDQsJXIxMGQKKwlqZQkuTGN0cjMyXzZ4CisKKwlsZWFxCTEyOCglcmN4KSwlcmN4CisJc3VicQkkMiwlcmR4CisJam1wCS5MY3RyMzJfbG9vcDgKKworLmFsaWduCTE2CisuTGN0cjMyXzZ4OgorCXNobGwJJDQsJWVheAorCW1vdmwJJDQ4LCVyMTBkCisJYnN3YXBsCSVlYnAKKwlsZWFxCTMyKCVyY3gsJXJheCwxKSwlcmN4CisJc3VicQklcmF4LCVyMTAKKwlqbXAJLkxjdHIzMl9sb29wNgorCisuYWxpZ24JMTYKKy5MY3RyMzJfbG9vcDY6CisJYWRkbAkkNiwlcjhkCisJbW92dXBzCS00OCglcmN4LCVyMTAsMSksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92bAklcjhkLCVlYXgKKwl4b3JsCSVlYnAsJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCwxMgorCWxlYWwJMSglcjgpLCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJeG9ybAklZWJwLCVlYXgKKy5ieXRlCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCwyOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwlsZWFsCTIoJXI4KSwlZWF4CisJeG9ybAklZWJwLCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkweDBmLDB4MzgsMHhmMSwweDQ0LDB4MjQsNDQKKwlsZWFsCTMoJXI4KSwlZWF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwktMzIoJXJjeCwlcjEwLDEpLCV4bW0xCisJeG9ybAklZWJwLCVlYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCw2MAorCWxlYWwJNCglcjgpLCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJeG9ybAklZWJwLCVlYXgKKy5ieXRlCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCw3NgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKwlsZWFsCTUoJXI4KSwlZWF4CisJeG9ybAklZWJwLCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkweDBmLDB4MzgsMHhmMSwweDQ0LDB4MjQsOTIKKwltb3ZxCSVyMTAsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCS0xNiglcmN4LCVyMTAsMSksJXhtbTAKKworCWNhbGwJLkxlbmNfbG9vcDYKKworCW1vdmRxdQkoJXJkaSksJXhtbTgKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTkKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTEwCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW0xMQorCW1vdmRxdQk2NCglcmRpKSwleG1tMTIKKwltb3ZkcXUJODAoJXJkaSksJXhtbTEzCisJbGVhcQk5NiglcmRpKSwlcmRpCisJbW92dXBzCS02NCglcmN4LCVyMTAsMSksJXhtbTEKKwlweG9yCSV4bW0yLCV4bW04CisJbW92YXBzCTAoJXJzcCksJXhtbTIKKwlweG9yCSV4bW0zLCV4bW05CisJbW92YXBzCTE2KCVyc3ApLCV4bW0zCisJcHhvcgkleG1tNCwleG1tMTAKKwltb3ZhcHMJMzIoJXJzcCksJXhtbTQKKwlweG9yCSV4bW01LCV4bW0xMQorCW1vdmFwcwk0OCglcnNwKSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTEyCisJbW92YXBzCTY0KCVyc3ApLCV4bW02CisJcHhvcgkleG1tNywleG1tMTMKKwltb3ZhcHMJODAoJXJzcCksJXhtbTcKKwltb3ZkcXUJJXhtbTgsKCVyc2kpCisJbW92ZHF1CSV4bW05LDE2KCVyc2kpCisJbW92ZHF1CSV4bW0xMCwzMiglcnNpKQorCW1vdmRxdQkleG1tMTEsNDgoJXJzaSkKKwltb3ZkcXUJJXhtbTEyLDY0KCVyc2kpCisJbW92ZHF1CSV4bW0xMyw4MCglcnNpKQorCWxlYXEJOTYoJXJzaSksJXJzaQorCisJc3VicQkkNiwlcmR4CisJam5jCS5MY3RyMzJfbG9vcDYKKworCWFkZHEJJDYsJXJkeAorCWp6CS5MY3RyMzJfZG9uZQorCisJbGVhbAktNDgoJXIxMCksJWVheAorCWxlYXEJLTgwKCVyY3gsJXIxMCwxKSwlcmN4CisJbmVnbAklZWF4CisJc2hybAkkNCwlZWF4CisJam1wCS5MY3RyMzJfdGFpbAorCisuYWxpZ24JMzIKKy5MY3RyMzJfbG9vcDg6CisJYWRkbAkkOCwlcjhkCisJbW92ZHFhCTk2KCVyc3ApLCV4bW04CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCW1vdmwJJXI4ZCwlcjlkCisJbW92ZHFhCTExMiglcnNwKSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlic3dhcGwJJXI5ZAorCW1vdnVwcwkzMi0xMjgoJXJjeCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJeG9ybAklZWJwLCVyOWQKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92bAklcjlkLDArMTIoJXJzcCkKKwlsZWFxCTEoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTQ4LTEyOCglcmN4KSwleG1tMQorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3ZsCSVyOWQsMTYrMTIoJXJzcCkKKwlsZWFxCTIoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTY0LTEyOCglcmN4KSwleG1tMAorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3ZsCSVyOWQsMzIrMTIoJXJzcCkKKwlsZWFxCTMoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTgwLTEyOCglcmN4KSwleG1tMQorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3ZsCSVyOWQsNDgrMTIoJXJzcCkKKwlsZWFxCTQoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTk2LTEyOCglcmN4KSwleG1tMAorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3ZsCSVyOWQsNjQrMTIoJXJzcCkKKwlsZWFxCTUoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTExMi0xMjgoJXJjeCksJXhtbTEKKwlic3dhcGwJJXI5ZAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJeG9ybAklZWJwLCVyOWQKKy5ieXRlCTB4NjYsMHg5MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92bAklcjlkLDgwKzEyKCVyc3ApCisJbGVhcQk2KCVyOCksJXI5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMAorCW1vdnVwcwkxMjgtMTI4KCVyY3gpLCV4bW0wCisJYnN3YXBsCSVyOWQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCXhvcmwJJWVicCwlcjlkCisuYnl0ZQkweDY2LDB4OTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdmwJJXI5ZCw5NisxMiglcnNwKQorCWxlYXEJNyglcjgpLCVyOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3Z1cHMJMTQ0LTEyOCglcmN4KSwleG1tMQorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisJeG9ybAklZWJwLCVyOWQKKwltb3ZkcXUJMCglcmRpKSwleG1tMTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92bAklcjlkLDExMisxMiglcnNwKQorCWNtcGwJJDExLCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTE2MC0xMjgoJXJjeCksJXhtbTAKKworCWpiCS5MY3RyMzJfZW5jX2RvbmUKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTE3Ni0xMjgoJXJjeCksJXhtbTEKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTE5Mi0xMjgoJXJjeCksJXhtbTAKKwlqZQkuTGN0cjMyX2VuY19kb25lCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMQorCW1vdnVwcwkyMDgtMTI4KCVyY3gpLCV4bW0xCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMAorCW1vdnVwcwkyMjQtMTI4KCVyY3gpLCV4bW0wCisJam1wCS5MY3RyMzJfZW5jX2RvbmUKKworLmFsaWduCTE2CisuTGN0cjMyX2VuY19kb25lOgorCW1vdmRxdQkxNiglcmRpKSwleG1tMTEKKwlweG9yCSV4bW0wLCV4bW0xMAorCW1vdmRxdQkzMiglcmRpKSwleG1tMTIKKwlweG9yCSV4bW0wLCV4bW0xMQorCW1vdmRxdQk0OCglcmRpKSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorCW1vdmRxdQk2NCglcmRpKSwleG1tMTQKKwlweG9yCSV4bW0wLCV4bW0xMworCW1vdmRxdQk4MCglcmRpKSwleG1tMTUKKwlweG9yCSV4bW0wLCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTE1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTEKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjEwCisJcHhvcgkleG1tMCwleG1tMQorCW1vdmRxdQkxMTItMTI4KCVyZGkpLCV4bW0xMAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyMTkKKwlweG9yCSV4bW0wLCV4bW0xMAorCW1vdmRxYQkwKCVyc3ApLCV4bW0xMQorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyMjgKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjM3CisJbW92ZHFhCTE2KCVyc3ApLCV4bW0xMgorCW1vdmRxYQkzMiglcnNwKSwleG1tMTMKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjQ2CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDI1NQorCW1vdmRxYQk0OCglcnNwKSwleG1tMTQKKwltb3ZkcWEJNjQoJXJzcCksJXhtbTE1CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIxLDE5MworCW1vdmRxYQk4MCglcnNwKSwleG1tMAorCW1vdnVwcwkxNi0xMjgoJXJjeCksJXhtbTEKKy5ieXRlCTEwMiw2OSwxNSw1NiwyMjEsMjAyCisKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92ZHFhCSV4bW0xMSwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdmRxYQkleG1tMTIsJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3ZkcWEJJXhtbTEzLCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJbW92ZHFhCSV4bW0xNCwleG1tNQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCW1vdmRxYQkleG1tMTUsJXhtbTYKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwltb3Z1cHMJJXhtbTgsOTYoJXJzaSkKKwltb3Z1cHMJJXhtbTksMTEyKCVyc2kpCisJbGVhcQkxMjgoJXJzaSksJXJzaQorCisJc3VicQkkOCwlcmR4CisJam5jCS5MY3RyMzJfbG9vcDgKKworCWFkZHEJJDgsJXJkeAorCWp6CS5MY3RyMzJfZG9uZQorCWxlYXEJLTEyOCglcmN4KSwlcmN4CisKKy5MY3RyMzJfdGFpbDoKKworCisJbGVhcQkxNiglcmN4KSwlcmN4CisJY21wcQkkNCwlcmR4CisJamIJLkxjdHIzMl9sb29wMworCWplCS5MY3RyMzJfbG9vcDQKKworCisJc2hsbAkkNCwlZWF4CisJbW92ZHFhCTk2KCVyc3ApLCV4bW04CisJcHhvcgkleG1tOSwleG1tOQorCisJbW92dXBzCTE2KCVyY3gpLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlsZWFxCTMyLTE2KCVyY3gsJXJheCwxKSwlcmN4CisJbmVncQklcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorCWFkZHEJJDE2LCVyYXgKKwltb3Z1cHMJKCVyZGkpLCV4bW0xMAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisJbW92dXBzCTE2KCVyZGkpLCV4bW0xMQorCW1vdnVwcwkzMiglcmRpKSwleG1tMTIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDE5MworCisJY2FsbAkuTGVuY19sb29wOF9lbnRlcgorCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW0xMworCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHF1CTY0KCVyZGkpLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW0xMCwleG1tNgorCW1vdmRxdQkleG1tNSw0OCglcnNpKQorCW1vdmRxdQkleG1tNiw2NCglcnNpKQorCWNtcHEJJDYsJXJkeAorCWpiCS5MY3RyMzJfZG9uZQorCisJbW92dXBzCTgwKCVyZGkpLCV4bW0xMQorCXhvcnBzCSV4bW0xMSwleG1tNworCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCWplCS5MY3RyMzJfZG9uZQorCisJbW92dXBzCTk2KCVyZGkpLCV4bW0xMgorCXhvcnBzCSV4bW0xMiwleG1tOAorCW1vdnVwcwkleG1tOCw5NiglcnNpKQorCWptcAkuTGN0cjMyX2RvbmUKKworLmFsaWduCTMyCisuTGN0cjMyX2xvb3A0OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwlkZWNsCSVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJam56CS5MY3RyMzJfbG9vcDQKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNworCW1vdnVwcwkoJXJkaSksJXhtbTEwCisJbW92dXBzCTE2KCVyZGkpLCV4bW0xMQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjMzCisJbW92dXBzCTMyKCVyZGkpLCV4bW0xMgorCW1vdnVwcwk0OCglcmRpKSwleG1tMTMKKworCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0xMiwleG1tNAorCW1vdmRxdQkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJam1wCS5MY3RyMzJfZG9uZQorCisuYWxpZ24JMzIKKy5MY3RyMzJfbG9vcDM6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWRlY2wJJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJbW92dXBzCSglcmN4KSwleG1tMQorCWpuegkuTGN0cjMyX2xvb3AzCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjI1CisKKwltb3Z1cHMJKCVyZGkpLCV4bW0xMAorCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwljbXBxCSQyLCVyZHgKKwlqYgkuTGN0cjMyX2RvbmUKKworCW1vdnVwcwkxNiglcmRpKSwleG1tMTEKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlqZQkuTGN0cjMyX2RvbmUKKworCW1vdnVwcwkzMiglcmRpKSwleG1tMTIKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKworLkxjdHIzMl9kb25lOgorCXhvcnBzCSV4bW0wLCV4bW0wCisJeG9ybAklZWJwLCVlYnAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJbW92YXBzCSV4bW0wLDAoJXJzcCkKKwlweG9yCSV4bW04LCV4bW04CisJbW92YXBzCSV4bW0wLDE2KCVyc3ApCisJcHhvcgkleG1tOSwleG1tOQorCW1vdmFwcwkleG1tMCwzMiglcnNwKQorCXB4b3IJJXhtbTEwLCV4bW0xMAorCW1vdmFwcwkleG1tMCw0OCglcnNwKQorCXB4b3IJJXhtbTExLCV4bW0xMQorCW1vdmFwcwkleG1tMCw2NCglcnNwKQorCXB4b3IJJXhtbTEyLCV4bW0xMgorCW1vdmFwcwkleG1tMCw4MCglcnNwKQorCXB4b3IJJXhtbTEzLCV4bW0xMworCW1vdmFwcwkleG1tMCw5NiglcnNwKQorCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmFwcwkleG1tMCwxMTIoJXJzcCkKKwlweG9yCSV4bW0xNSwleG1tMTUKKwltb3ZxCS04KCVyMTEpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXIxMSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MY3RyMzJfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MsLi1hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy5nbG9ibAlhZXNfaHdfeHRzX2VuY3J5cHQKKy5oaWRkZW4gYWVzX2h3X3h0c19lbmNyeXB0CisudHlwZQlhZXNfaHdfeHRzX2VuY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc19od194dHNfZW5jcnlwdDoKKy5jZmlfc3RhcnRwcm9jCQorCWxlYXEJKCVyc3ApLCVyMTEKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcjExCisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMTYKKwlzdWJxCSQxMTIsJXJzcAorCWFuZHEJJC0xNiwlcnNwCisJbW92dXBzCSglcjkpLCV4bW0yCisJbW92bAkyNDAoJXI4KSwlZWF4CisJbW92bAkyNDAoJXJjeCksJXIxMGQKKwltb3Z1cHMJKCVyOCksJXhtbTAKKwltb3Z1cHMJMTYoJXI4KSwleG1tMQorCWxlYXEJMzIoJXI4KSwlcjgKKwl4b3JwcwkleG1tMCwleG1tMgorLkxvb3BfZW5jMV84OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyOCksJXhtbTEKKwlsZWFxCTE2KCVyOCksJXI4CisJam56CS5Mb29wX2VuYzFfOAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92cQklcmN4LCVyYnAKKwltb3ZsCSVyMTBkLCVlYXgKKwlzaGxsCSQ0LCVyMTBkCisJbW92cQklcmR4LCVyOQorCWFuZHEJJC0xNiwlcmR4CisKKwltb3Z1cHMJMTYoJXJjeCwlcjEwLDEpLCV4bW0xCisKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksJXhtbTgKKwltb3ZkcWEJJXhtbTIsJXhtbTE1CisJcHNodWZkCSQweDVmLCV4bW0yLCV4bW05CisJcHhvcgkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNyYWQJJDMxLCV4bW0xNAorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTEwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisJbW92ZHFhCSV4bW0xNSwleG1tMTEKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisJcHhvcgkleG1tMCwleG1tMTEKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisJcGFkZGQJJXhtbTksJXhtbTkKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMgorCXBzcmFkCSQzMSwleG1tMTQKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMTQKKwlweG9yCSV4bW0wLCV4bW0xMgorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorCW1vdmRxYQkleG1tMTUsJXhtbTEzCisJcHNyYWQJJDMxLCV4bW0xNAorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKwlwc3JhZAkkMzEsJXhtbTkKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tOQorCXB4b3IJJXhtbTAsJXhtbTE0CisJcHhvcgkleG1tOSwleG1tMTUKKwltb3ZhcHMJJXhtbTEsOTYoJXJzcCkKKworCXN1YnEJJDk2LCVyZHgKKwlqYwkuTHh0c19lbmNfc2hvcnQKKworCW1vdmwJJDE2Kzk2LCVlYXgKKwlsZWFxCTMyKCVyYnAsJXIxMCwxKSwlcmN4CisJc3VicQklcjEwLCVyYXgKKwltb3Z1cHMJMTYoJXJicCksJXhtbTEKKwltb3ZxCSVyYXgsJXIxMAorCWxlYXEJLkx4dHNfbWFnaWMoJXJpcCksJXI4CisJam1wCS5MeHRzX2VuY19ncmFuZGxvb3AKKworLmFsaWduCTMyCisuTHh0c19lbmNfZ3JhbmRsb29wOgorCW1vdmRxdQkwKCVyZGkpLCV4bW0yCisJbW92ZHFhCSV4bW0wLCV4bW04CisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwlweG9yCSV4bW0xMSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlweG9yCSV4bW0xMiwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwlweG9yCSV4bW0xMywleG1tNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwlweG9yCSV4bW0xNSwleG1tOAorCW1vdmRxYQk5NiglcnNwKSwleG1tOQorCXB4b3IJJXhtbTE0LCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdnVwcwkzMiglcmJwKSwleG1tMAorCWxlYXEJOTYoJXJkaSksJXJkaQorCXB4b3IJJXhtbTgsJXhtbTcKKworCXB4b3IJJXhtbTksJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorCXB4b3IJJXhtbTksJXhtbTExCisJbW92ZHFhCSV4bW0xMCwwKCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwk0OCglcmJwKSwleG1tMQorCXB4b3IJJXhtbTksJXhtbTEyCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisJcHhvcgkleG1tOSwleG1tMTMKKwltb3ZkcWEJJXhtbTExLDE2KCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorCXB4b3IJJXhtbTksJXhtbTE0CisJbW92ZHFhCSV4bW0xMiwzMiglcnNwKQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJcHhvcgkleG1tOSwleG1tOAorCW1vdmRxYQkleG1tMTQsNjQoJXJzcCkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorCW1vdnVwcwk2NCglcmJwKSwleG1tMAorCW1vdmRxYQkleG1tOCw4MCglcnNwKQorCXBzaHVmZAkkMHg1ZiwleG1tMTUsJXhtbTkKKwlqbXAJLkx4dHNfZW5jX2xvb3A2CisuYWxpZ24JMzIKKy5MeHRzX2VuY19sb29wNjoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKwltb3Z1cHMJLTY0KCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorCW1vdnVwcwktODAoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CS5MeHRzX2VuY19sb29wNgorCisJbW92ZHFhCSglcjgpLCV4bW04CisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwc3JhZAkkMzEsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCXBhbmQJJXhtbTgsJXhtbTE0CisJbW92dXBzCSglcmJwKSwleG1tMTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZhcHMJJXhtbTEwLCV4bW0xMQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKwltb3Z1cHMJLTY0KCVyY3gpLCV4bW0xCisKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorCXBhZGRkCSV4bW05LCV4bW05CisJcHhvcgkleG1tMTUsJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorCXBzcmFkCSQzMSwleG1tMTQKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwlwYW5kCSV4bW04LCV4bW0xNAorCW1vdmFwcwkleG1tMTEsJXhtbTEyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxYQkleG1tOSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCS00OCglcmN4KSwleG1tMAorCisJcGFkZGQJJXhtbTksJXhtbTkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJcHhvcgkleG1tMTUsJXhtbTExCisJcHNyYWQJJDMxLCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdmRxYQkleG1tMTMsNDgoJXJzcCkKKwlweG9yCSV4bW0xNCwleG1tMTUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisJbW92YXBzCSV4bW0xMiwleG1tMTMKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwktMzIoJXJjeCksJXhtbTEKKworCXBhZGRkCSV4bW05LCV4bW05CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorCXB4b3IJJXhtbTE1LCV4bW0xMgorCXBzcmFkCSQzMSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92YXBzCSV4bW0xMywleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisKKwltb3ZkcWEJJXhtbTksJXhtbTAKKwlwYWRkZAkleG1tOSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlweG9yCSV4bW0xNSwleG1tMTMKKwlwc3JhZAkkMzEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCXB4b3IJJXhtbTAsJXhtbTE1CisJbW92dXBzCSglcmJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCTE2KCVyYnApLCV4bW0xCisKKwlweG9yCSV4bW0xNSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjEsODQsMzYsMAorCXBzcmFkCSQzMSwleG1tOQorCXBhZGRxCSV4bW0xNSwleG1tMTUKKy5ieXRlCTEwMiwxNSw1NiwyMjEsOTIsMzYsMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMTAwLDM2LDMyCisJcGFuZAkleG1tOCwleG1tOQorCW1vdnEJJXIxMCwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDEwOCwzNiw0OAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwxMTYsMzYsNjQKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMTI0LDM2LDgwCisJcHhvcgkleG1tOSwleG1tMTUKKworCWxlYXEJOTYoJXJzaSksJXJzaQorCW1vdnVwcwkleG1tMiwtOTYoJXJzaSkKKwltb3Z1cHMJJXhtbTMsLTgwKCVyc2kpCisJbW92dXBzCSV4bW00LC02NCglcnNpKQorCW1vdnVwcwkleG1tNSwtNDgoJXJzaSkKKwltb3Z1cHMJJXhtbTYsLTMyKCVyc2kpCisJbW92dXBzCSV4bW03LC0xNiglcnNpKQorCXN1YnEJJDk2LCVyZHgKKwlqbmMJLkx4dHNfZW5jX2dyYW5kbG9vcAorCisJbW92bAkkMTYrOTYsJWVheAorCXN1YmwJJXIxMGQsJWVheAorCW1vdnEJJXJicCwlcmN4CisJc2hybAkkNCwlZWF4CisKKy5MeHRzX2VuY19zaG9ydDoKKworCW1vdmwJJWVheCwlcjEwZAorCXB4b3IJJXhtbTAsJXhtbTEwCisJYWRkcQkkOTYsJXJkeAorCWp6CS5MeHRzX2VuY19kb25lCisKKwlweG9yCSV4bW0wLCV4bW0xMQorCWNtcHEJJDB4MjAsJXJkeAorCWpiCS5MeHRzX2VuY19vbmUKKwlweG9yCSV4bW0wLCV4bW0xMgorCWplCS5MeHRzX2VuY190d28KKworCXB4b3IJJXhtbTAsJXhtbTEzCisJY21wcQkkMHg0MCwlcmR4CisJamIJLkx4dHNfZW5jX3RocmVlCisJcHhvcgkleG1tMCwleG1tMTQKKwlqZQkuTHh0c19lbmNfZm91cgorCisJbW92ZHF1CSglcmRpKSwleG1tMgorCW1vdmRxdQkxNiglcmRpKSwleG1tMworCW1vdmRxdQkzMiglcmRpKSwleG1tNAorCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwlsZWFxCTgwKCVyZGkpLCVyZGkKKwlweG9yCSV4bW0xMiwleG1tNAorCXB4b3IJJXhtbTEzLCV4bW01CisJcHhvcgkleG1tMTQsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisKKwljYWxsCV9hZXNuaV9lbmNyeXB0NgorCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJeG9ycHMJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJeG9ycHMJJXhtbTE0LCV4bW02CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJbW92ZHF1CSV4bW02LDY0KCVyc2kpCisJbGVhcQk4MCglcnNpKSwlcnNpCisJam1wCS5MeHRzX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZW5jX29uZToKKwltb3Z1cHMJKCVyZGkpLCV4bW0yCisJbGVhcQkxNiglcmRpKSwlcmRpCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9lbmMxXzk6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXJjeCksJXhtbTEKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwlqbnoJLkxvb3BfZW5jMV85CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTEsJXhtbTEwCisJbW92dXBzCSV4bW0yLCglcnNpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWptcAkuTHh0c19lbmNfZG9uZQorCisuYWxpZ24JMTYKKy5MeHRzX2VuY190d286CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCWxlYXEJMzIoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMCwleG1tMgorCXhvcnBzCSV4bW0xMSwleG1tMworCisJY2FsbAlfYWVzbmlfZW5jcnlwdDIKKworCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTIsJXhtbTEwCisJeG9ycHMJJXhtbTExLCV4bW0zCisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCWxlYXEJMzIoJXJzaSksJXJzaQorCWptcAkuTHh0c19lbmNfZG9uZQorCisuYWxpZ24JMTYKKy5MeHRzX2VuY190aHJlZToKKwltb3Z1cHMJKCVyZGkpLCV4bW0yCisJbW92dXBzCTE2KCVyZGkpLCV4bW0zCisJbW92dXBzCTMyKCVyZGkpLCV4bW00CisJbGVhcQk0OCglcmRpKSwlcmRpCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEyLCV4bW00CisKKwljYWxsCV9hZXNuaV9lbmNyeXB0MworCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0xMywleG1tMTAKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbGVhcQk0OCglcnNpKSwlcnNpCisJam1wCS5MeHRzX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZW5jX2ZvdXI6CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCW1vdnVwcwkzMiglcmRpKSwleG1tNAorCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdnVwcwk0OCglcmRpKSwleG1tNQorCWxlYXEJNjQoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMSwleG1tMworCXhvcnBzCSV4bW0xMiwleG1tNAorCXhvcnBzCSV4bW0xMywleG1tNQorCisJY2FsbAlfYWVzbmlfZW5jcnlwdDQKKworCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJbGVhcQk2NCglcnNpKSwlcnNpCisJam1wCS5MeHRzX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZW5jX2RvbmU6CisJYW5kcQkkMTUsJXI5CisJanoJLkx4dHNfZW5jX3JldAorCW1vdnEJJXI5LCVyZHgKKworLkx4dHNfZW5jX3N0ZWFsOgorCW1vdnpibAkoJXJkaSksJWVheAorCW1vdnpibAktMTYoJXJzaSksJWVjeAorCWxlYXEJMSglcmRpKSwlcmRpCisJbW92YgklYWwsLTE2KCVyc2kpCisJbW92YgklY2wsMCglcnNpKQorCWxlYXEJMSglcnNpKSwlcnNpCisJc3VicQkkMSwlcmR4CisJam56CS5MeHRzX2VuY19zdGVhbAorCisJc3VicQklcjksJXJzaQorCW1vdnEJJXJicCwlcmN4CisJbW92bAklcjEwZCwlZWF4CisKKwltb3Z1cHMJLTE2KCVyc2kpLCV4bW0yCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9lbmMxXzEwOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CS5Mb29wX2VuYzFfMTAKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSV4bW0yLC0xNiglcnNpKQorCisuTHh0c19lbmNfcmV0OgorCXhvcnBzCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW02LCV4bW02CisJcHhvcgkleG1tNywleG1tNworCW1vdmFwcwkleG1tMCwwKCVyc3ApCisJcHhvcgkleG1tOCwleG1tOAorCW1vdmFwcwkleG1tMCwxNiglcnNwKQorCXB4b3IJJXhtbTksJXhtbTkKKwltb3ZhcHMJJXhtbTAsMzIoJXJzcCkKKwlweG9yCSV4bW0xMCwleG1tMTAKKwltb3ZhcHMJJXhtbTAsNDgoJXJzcCkKKwlweG9yCSV4bW0xMSwleG1tMTEKKwltb3ZhcHMJJXhtbTAsNjQoJXJzcCkKKwlweG9yCSV4bW0xMiwleG1tMTIKKwltb3ZhcHMJJXhtbTAsODAoJXJzcCkKKwlweG9yCSV4bW0xMywleG1tMTMKKwltb3ZhcHMJJXhtbTAsOTYoJXJzcCkKKwlweG9yCSV4bW0xNCwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTUKKwltb3ZxCS04KCVyMTEpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXIxMSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MeHRzX2VuY19lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlc19od194dHNfZW5jcnlwdCwuLWFlc19od194dHNfZW5jcnlwdAorLmdsb2JsCWFlc19od194dHNfZGVjcnlwdAorLmhpZGRlbiBhZXNfaHdfeHRzX2RlY3J5cHQKKy50eXBlCWFlc19od194dHNfZGVjcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzX2h3X3h0c19kZWNyeXB0OgorLmNmaV9zdGFydHByb2MJCisJbGVhcQkoJXJzcCksJXIxMQorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyMTEKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0xNgorCXN1YnEJJDExMiwlcnNwCisJYW5kcQkkLTE2LCVyc3AKKwltb3Z1cHMJKCVyOSksJXhtbTIKKwltb3ZsCTI0MCglcjgpLCVlYXgKKwltb3ZsCTI0MCglcmN4KSwlcjEwZAorCW1vdnVwcwkoJXI4KSwleG1tMAorCW1vdnVwcwkxNiglcjgpLCV4bW0xCisJbGVhcQkzMiglcjgpLCVyOAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9lbmMxXzExOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyOCksJXhtbTEKKwlsZWFxCTE2KCVyOCksJXI4CisJam56CS5Mb29wX2VuYzFfMTEKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJeG9ybAklZWF4LCVlYXgKKwl0ZXN0cQkkMTUsJXJkeAorCXNldG56CSVhbAorCXNobHEJJDQsJXJheAorCXN1YnEJJXJheCwlcmR4CisKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92cQklcmN4LCVyYnAKKwltb3ZsCSVyMTBkLCVlYXgKKwlzaGxsCSQ0LCVyMTBkCisJbW92cQklcmR4LCVyOQorCWFuZHEJJC0xNiwlcmR4CisKKwltb3Z1cHMJMTYoJXJjeCwlcjEwLDEpLCV4bW0xCisKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksJXhtbTgKKwltb3ZkcWEJJXhtbTIsJXhtbTE1CisJcHNodWZkCSQweDVmLCV4bW0yLCV4bW05CisJcHhvcgkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNyYWQJJDMxLCV4bW0xNAorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTEwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisJbW92ZHFhCSV4bW0xNSwleG1tMTEKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisJcHhvcgkleG1tMCwleG1tMTEKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisJcGFkZGQJJXhtbTksJXhtbTkKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMgorCXBzcmFkCSQzMSwleG1tMTQKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMTQKKwlweG9yCSV4bW0wLCV4bW0xMgorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorCW1vdmRxYQkleG1tMTUsJXhtbTEzCisJcHNyYWQJJDMxLCV4bW0xNAorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKwlwc3JhZAkkMzEsJXhtbTkKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tOQorCXB4b3IJJXhtbTAsJXhtbTE0CisJcHhvcgkleG1tOSwleG1tMTUKKwltb3ZhcHMJJXhtbTEsOTYoJXJzcCkKKworCXN1YnEJJDk2LCVyZHgKKwlqYwkuTHh0c19kZWNfc2hvcnQKKworCW1vdmwJJDE2Kzk2LCVlYXgKKwlsZWFxCTMyKCVyYnAsJXIxMCwxKSwlcmN4CisJc3VicQklcjEwLCVyYXgKKwltb3Z1cHMJMTYoJXJicCksJXhtbTEKKwltb3ZxCSVyYXgsJXIxMAorCWxlYXEJLkx4dHNfbWFnaWMoJXJpcCksJXI4CisJam1wCS5MeHRzX2RlY19ncmFuZGxvb3AKKworLmFsaWduCTMyCisuTHh0c19kZWNfZ3JhbmRsb29wOgorCW1vdmRxdQkwKCVyZGkpLCV4bW0yCisJbW92ZHFhCSV4bW0wLCV4bW04CisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwlweG9yCSV4bW0xMSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlweG9yCSV4bW0xMiwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwlweG9yCSV4bW0xMywleG1tNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwlweG9yCSV4bW0xNSwleG1tOAorCW1vdmRxYQk5NiglcnNwKSwleG1tOQorCXB4b3IJJXhtbTE0LCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworCW1vdnVwcwkzMiglcmJwKSwleG1tMAorCWxlYXEJOTYoJXJkaSksJXJkaQorCXB4b3IJJXhtbTgsJXhtbTcKKworCXB4b3IJJXhtbTksJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorCXB4b3IJJXhtbTksJXhtbTExCisJbW92ZHFhCSV4bW0xMCwwKCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwk0OCglcmJwKSwleG1tMQorCXB4b3IJJXhtbTksJXhtbTEyCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisJcHhvcgkleG1tOSwleG1tMTMKKwltb3ZkcWEJJXhtbTExLDE2KCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorCXB4b3IJJXhtbTksJXhtbTE0CisJbW92ZHFhCSV4bW0xMiwzMiglcnNwKQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisJcHhvcgkleG1tOSwleG1tOAorCW1vdmRxYQkleG1tMTQsNjQoJXJzcCkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwk2NCglcmJwKSwleG1tMAorCW1vdmRxYQkleG1tOCw4MCglcnNwKQorCXBzaHVmZAkkMHg1ZiwleG1tMTUsJXhtbTkKKwlqbXAJLkx4dHNfZGVjX2xvb3A2CisuYWxpZ24JMzIKKy5MeHRzX2RlY19sb29wNjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJLTY0KCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwktODAoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CS5MeHRzX2RlY19sb29wNgorCisJbW92ZHFhCSglcjgpLCV4bW04CisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwc3JhZAkkMzEsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworCXBhbmQJJXhtbTgsJXhtbTE0CisJbW92dXBzCSglcmJwKSwleG1tMTAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZhcHMJJXhtbTEwLCV4bW0xMQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJLTY0KCVyY3gpLCV4bW0xCisKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorCXBhZGRkCSV4bW05LCV4bW05CisJcHhvcgkleG1tMTUsJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorCXBzcmFkCSQzMSwleG1tMTQKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKwlwYW5kCSV4bW04LCV4bW0xNAorCW1vdmFwcwkleG1tMTEsJXhtbTEyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxYQkleG1tOSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCS00OCglcmN4KSwleG1tMAorCisJcGFkZGQJJXhtbTksJXhtbTkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgkleG1tMTUsJXhtbTExCisJcHNyYWQJJDMxLCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworCW1vdmRxYQkleG1tMTMsNDgoJXJzcCkKKwlweG9yCSV4bW0xNCwleG1tMTUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisJbW92YXBzCSV4bW0xMiwleG1tMTMKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwktMzIoJXJjeCksJXhtbTEKKworCXBhZGRkCSV4bW05LCV4bW05CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorCXB4b3IJJXhtbTE1LCV4bW0xMgorCXBzcmFkCSQzMSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92YXBzCSV4bW0xMywleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisKKwltb3ZkcWEJJXhtbTksJXhtbTAKKwlwYWRkZAkleG1tOSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlweG9yCSV4bW0xNSwleG1tMTMKKwlwc3JhZAkkMzEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworCXB4b3IJJXhtbTAsJXhtbTE1CisJbW92dXBzCSglcmJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCTE2KCVyYnApLCV4bW0xCisKKwlweG9yCSV4bW0xNSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsODQsMzYsMAorCXBzcmFkCSQzMSwleG1tOQorCXBhZGRxCSV4bW0xNSwleG1tMTUKKy5ieXRlCTEwMiwxNSw1NiwyMjMsOTIsMzYsMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMTAwLDM2LDMyCisJcGFuZAkleG1tOCwleG1tOQorCW1vdnEJJXIxMCwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDEwOCwzNiw0OAorLmJ5dGUJMTAyLDE1LDU2LDIyMywxMTYsMzYsNjQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMTI0LDM2LDgwCisJcHhvcgkleG1tOSwleG1tMTUKKworCWxlYXEJOTYoJXJzaSksJXJzaQorCW1vdnVwcwkleG1tMiwtOTYoJXJzaSkKKwltb3Z1cHMJJXhtbTMsLTgwKCVyc2kpCisJbW92dXBzCSV4bW00LC02NCglcnNpKQorCW1vdnVwcwkleG1tNSwtNDgoJXJzaSkKKwltb3Z1cHMJJXhtbTYsLTMyKCVyc2kpCisJbW92dXBzCSV4bW03LC0xNiglcnNpKQorCXN1YnEJJDk2LCVyZHgKKwlqbmMJLkx4dHNfZGVjX2dyYW5kbG9vcAorCisJbW92bAkkMTYrOTYsJWVheAorCXN1YmwJJXIxMGQsJWVheAorCW1vdnEJJXJicCwlcmN4CisJc2hybAkkNCwlZWF4CisKKy5MeHRzX2RlY19zaG9ydDoKKworCW1vdmwJJWVheCwlcjEwZAorCXB4b3IJJXhtbTAsJXhtbTEwCisJcHhvcgkleG1tMCwleG1tMTEKKwlhZGRxCSQ5NiwlcmR4CisJanoJLkx4dHNfZGVjX2RvbmUKKworCXB4b3IJJXhtbTAsJXhtbTEyCisJY21wcQkkMHgyMCwlcmR4CisJamIJLkx4dHNfZGVjX29uZQorCXB4b3IJJXhtbTAsJXhtbTEzCisJamUJLkx4dHNfZGVjX3R3bworCisJcHhvcgkleG1tMCwleG1tMTQKKwljbXBxCSQweDQwLCVyZHgKKwlqYgkuTHh0c19kZWNfdGhyZWUKKwlqZQkuTHh0c19kZWNfZm91cgorCisJbW92ZHF1CSglcmRpKSwleG1tMgorCW1vdmRxdQkxNiglcmRpKSwleG1tMworCW1vdmRxdQkzMiglcmRpKSwleG1tNAorCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwlsZWFxCTgwKCVyZGkpLCVyZGkKKwlweG9yCSV4bW0xMiwleG1tNAorCXB4b3IJJXhtbTEzLCV4bW01CisJcHhvcgkleG1tMTQsJXhtbTYKKworCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJeG9ycHMJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJeG9ycHMJJXhtbTE0LCV4bW02CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJcGNtcGd0ZAkleG1tMTUsJXhtbTE0CisJbW92ZHF1CSV4bW02LDY0KCVyc2kpCisJbGVhcQk4MCglcnNpKSwlcnNpCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTEKKwlhbmRxCSQxNSwlcjkKKwlqegkuTHh0c19kZWNfcmV0CisKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xMQorCXB4b3IJJXhtbTE1LCV4bW0xMQorCWptcAkuTHh0c19kZWNfZG9uZTIKKworLmFsaWduCTE2CisuTHh0c19kZWNfb25lOgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKKy5Mb29wX2RlYzFfMTI6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXJjeCksJXhtbTEKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwlqbnoJLkxvb3BfZGVjMV8xMgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwltb3ZkcWEJJXhtbTExLCV4bW0xMAorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3ZkcWEJJXhtbTEyLCV4bW0xMQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWptcAkuTHh0c19kZWNfZG9uZQorCisuYWxpZ24JMTYKKy5MeHRzX2RlY190d286CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCWxlYXEJMzIoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMCwleG1tMgorCXhvcnBzCSV4bW0xMSwleG1tMworCisJY2FsbAlfYWVzbmlfZGVjcnlwdDIKKworCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTIsJXhtbTEwCisJeG9ycHMJJXhtbTExLCV4bW0zCisJbW92ZHFhCSV4bW0xMywleG1tMTEKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbGVhcQkzMiglcnNpKSwlcnNpCisJam1wCS5MeHRzX2RlY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZGVjX3RocmVlOgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwltb3Z1cHMJMTYoJXJkaSksJXhtbTMKKwltb3Z1cHMJMzIoJXJkaSksJXhtbTQKKwlsZWFxCTQ4KCVyZGkpLCVyZGkKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwl4b3JwcwkleG1tMTIsJXhtbTQKKworCWNhbGwJX2Flc25pX2RlY3J5cHQzCisKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwltb3ZkcWEJJXhtbTEzLCV4bW0xMAorCXhvcnBzCSV4bW0xMSwleG1tMworCW1vdmRxYQkleG1tMTQsJXhtbTExCisJeG9ycHMJJXhtbTEyLCV4bW00CisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCWxlYXEJNDgoJXJzaSksJXJzaQorCWptcAkuTHh0c19kZWNfZG9uZQorCisuYWxpZ24JMTYKKy5MeHRzX2RlY19mb3VyOgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwltb3Z1cHMJMTYoJXJkaSksJXhtbTMKKwltb3Z1cHMJMzIoJXJkaSksJXhtbTQKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwltb3Z1cHMJNDgoJXJkaSksJXhtbTUKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwl4b3JwcwkleG1tMTMsJXhtbTUKKworCWNhbGwJX2Flc25pX2RlY3J5cHQ0CisKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJbGVhcQk2NCglcnNpKSwlcnNpCisJam1wCS5MeHRzX2RlY19kb25lCisKKy5hbGlnbgkxNgorLkx4dHNfZGVjX2RvbmU6CisJYW5kcQkkMTUsJXI5CisJanoJLkx4dHNfZGVjX3JldAorLkx4dHNfZGVjX2RvbmUyOgorCW1vdnEJJXI5LCVyZHgKKwltb3ZxCSVyYnAsJXJjeAorCW1vdmwJJXIxMGQsJWVheAorCisJbW92dXBzCSglcmRpKSwleG1tMgorCXhvcnBzCSV4bW0xMSwleG1tMgorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwl4b3JwcwkleG1tMCwleG1tMgorLkxvb3BfZGVjMV8xMzoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpuegkuTG9vcF9kZWMxXzEzCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCSV4bW0xMSwleG1tMgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKworLkx4dHNfZGVjX3N0ZWFsOgorCW1vdnpibAkxNiglcmRpKSwlZWF4CisJbW92emJsCSglcnNpKSwlZWN4CisJbGVhcQkxKCVyZGkpLCVyZGkKKwltb3ZiCSVhbCwoJXJzaSkKKwltb3ZiCSVjbCwxNiglcnNpKQorCWxlYXEJMSglcnNpKSwlcnNpCisJc3VicQkkMSwlcmR4CisJam56CS5MeHRzX2RlY19zdGVhbAorCisJc3VicQklcjksJXJzaQorCW1vdnEJJXJicCwlcmN4CisJbW92bAklcjEwZCwlZWF4CisKKwltb3Z1cHMJKCVyc2kpLCV4bW0yCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9kZWMxXzE0OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CS5Mb29wX2RlYzFfMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSV4bW0yLCglcnNpKQorCisuTHh0c19kZWNfcmV0OgorCXhvcnBzCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW02LCV4bW02CisJcHhvcgkleG1tNywleG1tNworCW1vdmFwcwkleG1tMCwwKCVyc3ApCisJcHhvcgkleG1tOCwleG1tOAorCW1vdmFwcwkleG1tMCwxNiglcnNwKQorCXB4b3IJJXhtbTksJXhtbTkKKwltb3ZhcHMJJXhtbTAsMzIoJXJzcCkKKwlweG9yCSV4bW0xMCwleG1tMTAKKwltb3ZhcHMJJXhtbTAsNDgoJXJzcCkKKwlweG9yCSV4bW0xMSwleG1tMTEKKwltb3ZhcHMJJXhtbTAsNjQoJXJzcCkKKwlweG9yCSV4bW0xMiwleG1tMTIKKwltb3ZhcHMJJXhtbTAsODAoJXJzcCkKKwlweG9yCSV4bW0xMywleG1tMTMKKwltb3ZhcHMJJXhtbTAsOTYoJXJzcCkKKwlweG9yCSV4bW0xNCwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTUKKwltb3ZxCS04KCVyMTEpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXIxMSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MeHRzX2RlY19lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWFlc19od194dHNfZGVjcnlwdCwuLWFlc19od194dHNfZGVjcnlwdAorLmdsb2JsCWFlc19od19vY2JfZW5jcnlwdAorLmhpZGRlbiBhZXNfaHdfb2NiX2VuY3J5cHQKKy50eXBlCWFlc19od19vY2JfZW5jcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYWVzX2h3X29jYl9lbmNyeXB0OgorLmNmaV9zdGFydHByb2MJCisJbGVhcQkoJXJzcCksJXJheAorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJbW92cQk4KCVyYXgpLCVyYngKKwltb3ZxCTgrOCglcmF4KSwlcmJwCisKKwltb3ZsCTI0MCglcmN4KSwlcjEwZAorCW1vdnEJJXJjeCwlcjExCisJc2hsbAkkNCwlcjEwZAorCW1vdnVwcwkoJXJjeCksJXhtbTkKKwltb3Z1cHMJMTYoJXJjeCwlcjEwLDEpLCV4bW0xCisKKwltb3ZkcXUJKCVyOSksJXhtbTE1CisJcHhvcgkleG1tMSwleG1tOQorCXB4b3IJJXhtbTEsJXhtbTE1CisKKwltb3ZsCSQxNiszMiwlZWF4CisJbGVhcQkzMiglcjExLCVyMTAsMSksJXJjeAorCW1vdnVwcwkxNiglcjExKSwleG1tMQorCXN1YnEJJXIxMCwlcmF4CisJbW92cQklcmF4LCVyMTAKKworCW1vdmRxdQkoJXJieCksJXhtbTEwCisJbW92ZHF1CSglcmJwKSwleG1tOAorCisJdGVzdHEJJDEsJXI4CisJam56CS5Mb2NiX2VuY19vZGQKKworCWJzZnEJJXI4LCVyMTIKKwlhZGRxCSQxLCVyOAorCXNobHEJJDQsJXIxMgorCW1vdmRxdQkoJXJieCwlcjEyLDEpLCV4bW03CisJbW92ZHF1CSglcmRpKSwleG1tMgorCWxlYXEJMTYoJXJkaSksJXJkaQorCisJY2FsbAlfX29jYl9lbmNyeXB0MQorCisJbW92ZHFhCSV4bW03LCV4bW0xNQorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlzdWJxCSQxLCVyZHgKKwlqegkuTG9jYl9lbmNfZG9uZQorCisuTG9jYl9lbmNfb2RkOgorCWxlYXEJMSglcjgpLCVyMTIKKwlsZWFxCTMoJXI4KSwlcjEzCisJbGVhcQk1KCVyOCksJXIxNAorCWxlYXEJNiglcjgpLCVyOAorCWJzZnEJJXIxMiwlcjEyCisJYnNmcQklcjEzLCVyMTMKKwlic2ZxCSVyMTQsJXIxNAorCXNobHEJJDQsJXIxMgorCXNobHEJJDQsJXIxMworCXNobHEJJDQsJXIxNAorCisJc3VicQkkNiwlcmR4CisJamMJLkxvY2JfZW5jX3Nob3J0CisJam1wCS5Mb2NiX2VuY19ncmFuZGxvb3AKKworLmFsaWduCTMyCisuTG9jYl9lbmNfZ3JhbmRsb29wOgorCW1vdmRxdQkwKCVyZGkpLCV4bW0yCisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJbW92ZHF1CTMyKCVyZGkpLCV4bW00CisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJbW92ZHF1CTY0KCVyZGkpLCV4bW02CisJbW92ZHF1CTgwKCVyZGkpLCV4bW03CisJbGVhcQk5NiglcmRpKSwlcmRpCisKKwljYWxsCV9fb2NiX2VuY3J5cHQ2CisKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCWxlYXEJOTYoJXJzaSksJXJzaQorCXN1YnEJJDYsJXJkeAorCWpuYwkuTG9jYl9lbmNfZ3JhbmRsb29wCisKKy5Mb2NiX2VuY19zaG9ydDoKKwlhZGRxCSQ2LCVyZHgKKwlqegkuTG9jYl9lbmNfZG9uZQorCisJbW92ZHF1CTAoJXJkaSksJXhtbTIKKwljbXBxCSQyLCVyZHgKKwlqYgkuTG9jYl9lbmNfb25lCisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJamUJLkxvY2JfZW5jX3R3bworCisJbW92ZHF1CTMyKCVyZGkpLCV4bW00CisJY21wcQkkNCwlcmR4CisJamIJLkxvY2JfZW5jX3RocmVlCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJamUJLkxvY2JfZW5jX2ZvdXIKKworCW1vdmRxdQk2NCglcmRpKSwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKworCWNhbGwJX19vY2JfZW5jcnlwdDYKKworCW1vdmRxYQkleG1tMTQsJXhtbTE1CisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKworCWptcAkuTG9jYl9lbmNfZG9uZQorCisuYWxpZ24JMTYKKy5Mb2NiX2VuY19vbmU6CisJbW92ZHFhCSV4bW0xMCwleG1tNworCisJY2FsbAlfX29jYl9lbmNyeXB0MQorCisJbW92ZHFhCSV4bW03LCV4bW0xNQorCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJam1wCS5Mb2NiX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkxvY2JfZW5jX3R3bzoKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCisJY2FsbAlfX29jYl9lbmNyeXB0NAorCisJbW92ZHFhCSV4bW0xMSwleG1tMTUKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCisJam1wCS5Mb2NiX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkxvY2JfZW5jX3RocmVlOgorCXB4b3IJJXhtbTUsJXhtbTUKKworCWNhbGwJX19vY2JfZW5jcnlwdDQKKworCW1vdmRxYQkleG1tMTIsJXhtbTE1CisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKworCWptcAkuTG9jYl9lbmNfZG9uZQorCisuYWxpZ24JMTYKKy5Mb2NiX2VuY19mb3VyOgorCWNhbGwJX19vY2JfZW5jcnlwdDQKKworCW1vdmRxYQkleG1tMTMsJXhtbTE1CisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKworLkxvY2JfZW5jX2RvbmU6CisJcHhvcgkleG1tMCwleG1tMTUKKwltb3ZkcXUJJXhtbTgsKCVyYnApCisJbW92ZHF1CSV4bW0xNSwoJXI5KQorCisJeG9ycHMJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKKwlweG9yCSV4bW0xMCwleG1tMTAKKwlweG9yCSV4bW0xMSwleG1tMTEKKwlweG9yCSV4bW0xMiwleG1tMTIKKwlweG9yCSV4bW0xMywleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTUKKwlsZWFxCTQwKCVyc3ApLCVyYXgKKy5jZmlfZGVmX2NmYQklcmF4LDgKKwltb3ZxCS00MCglcmF4KSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJLTMyKCVyYXgpLCVyMTMKKy5jZmlfcmVzdG9yZQklcjEzCisJbW92cQktMjQoJXJheCksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCS0xNiglcmF4KSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCW1vdnEJLTgoJXJheCksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlsZWFxCSglcmF4KSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxvY2JfZW5jX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzX2h3X29jYl9lbmNyeXB0LC4tYWVzX2h3X29jYl9lbmNyeXB0CisKKy50eXBlCV9fb2NiX2VuY3J5cHQ2LEBmdW5jdGlvbgorLmFsaWduCTMyCitfX29jYl9lbmNyeXB0NjoKKwlweG9yCSV4bW05LCV4bW0xNQorCW1vdmRxdQkoJXJieCwlcjEyLDEpLCV4bW0xMQorCW1vdmRxYQkleG1tMTAsJXhtbTEyCisJbW92ZHF1CSglcmJ4LCVyMTMsMSksJXhtbTEzCisJbW92ZHFhCSV4bW0xMCwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTAKKwltb3ZkcXUJKCVyYngsJXIxNCwxKSwleG1tMTUKKwlweG9yCSV4bW0xMCwleG1tMTEKKwlweG9yCSV4bW0yLCV4bW04CisJcHhvcgkleG1tMTAsJXhtbTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0zLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTMKKwlweG9yCSV4bW0xMiwleG1tMTMKKwlweG9yCSV4bW00LCV4bW04CisJcHhvcgkleG1tMTIsJXhtbTQKKwlweG9yCSV4bW0xMywleG1tMTQKKwlweG9yCSV4bW01LCV4bW04CisJcHhvcgkleG1tMTMsJXhtbTUKKwlweG9yCSV4bW0xNCwleG1tMTUKKwlweG9yCSV4bW02LCV4bW04CisJcHhvcgkleG1tMTQsJXhtbTYKKwlweG9yCSV4bW03LCV4bW04CisJcHhvcgkleG1tMTUsJXhtbTcKKwltb3Z1cHMJMzIoJXIxMSksJXhtbTAKKworCWxlYXEJMSglcjgpLCVyMTIKKwlsZWFxCTMoJXI4KSwlcjEzCisJbGVhcQk1KCVyOCksJXIxNAorCWFkZHEJJDYsJXI4CisJcHhvcgkleG1tOSwleG1tMTAKKwlic2ZxCSVyMTIsJXIxMgorCWJzZnEJJXIxMywlcjEzCisJYnNmcQklcjE0LCVyMTQKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwlweG9yCSV4bW05LCV4bW0xMQorCXB4b3IJJXhtbTksJXhtbTEyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorCXB4b3IJJXhtbTksJXhtbTEzCisJcHhvcgkleG1tOSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCTQ4KCVyMTEpLCV4bW0xCisJcHhvcgkleG1tOSwleG1tMTUKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorCW1vdnVwcwk2NCglcjExKSwleG1tMAorCXNobHEJJDQsJXIxMgorCXNobHEJJDQsJXIxMworCWptcAkuTG9jYl9lbmNfbG9vcDYKKworLmFsaWduCTMyCisuTG9jYl9lbmNfbG9vcDY6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpuegkuTG9jYl9lbmNfbG9vcDYKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwkxNiglcjExKSwleG1tMQorCXNobHEJJDQsJXIxNAorCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIxMAorCW1vdmRxdQkoJXJieCksJXhtbTEwCisJbW92cQklcjEwLCVyYXgKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjE5CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIyOAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyMzcKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjQ2CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDI1NQorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX19vY2JfZW5jcnlwdDYsLi1fX29jYl9lbmNyeXB0NgorCisudHlwZQlfX29jYl9lbmNyeXB0NCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19vY2JfZW5jcnlwdDQ6CisJcHhvcgkleG1tOSwleG1tMTUKKwltb3ZkcXUJKCVyYngsJXIxMiwxKSwleG1tMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0xMgorCW1vdmRxdQkoJXJieCwlcjEzLDEpLCV4bW0xMworCXB4b3IJJXhtbTE1LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW0xMQorCXB4b3IJJXhtbTIsJXhtbTgKKwlweG9yCSV4bW0xMCwleG1tMgorCXB4b3IJJXhtbTExLCV4bW0xMgorCXB4b3IJJXhtbTMsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTEyLCV4bW0xMworCXB4b3IJJXhtbTQsJXhtbTgKKwlweG9yCSV4bW0xMiwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTgKKwlweG9yCSV4bW0xMywleG1tNQorCW1vdnVwcwkzMiglcjExKSwleG1tMAorCisJcHhvcgkleG1tOSwleG1tMTAKKwlweG9yCSV4bW05LCV4bW0xMQorCXB4b3IJJXhtbTksJXhtbTEyCisJcHhvcgkleG1tOSwleG1tMTMKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJNDgoJXIxMSksJXhtbTEKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3Z1cHMJNjQoJXIxMSksJXhtbTAKKwlqbXAJLkxvY2JfZW5jX2xvb3A0CisKKy5hbGlnbgkzMgorLkxvY2JfZW5jX2xvb3A0OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpuegkuTG9jYl9lbmNfbG9vcDQKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJMTYoJXIxMSksJXhtbTEKKwltb3ZxCSVyMTAsJXJheAorCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIxMAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyMTkKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjI4CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIzNworCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX19vY2JfZW5jcnlwdDQsLi1fX29jYl9lbmNyeXB0NAorCisudHlwZQlfX29jYl9lbmNyeXB0MSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19vY2JfZW5jcnlwdDE6CisJcHhvcgkleG1tMTUsJXhtbTcKKwlweG9yCSV4bW05LCV4bW03CisJcHhvcgkleG1tMiwleG1tOAorCXB4b3IJJXhtbTcsJXhtbTIKKwltb3Z1cHMJMzIoJXIxMSksJXhtbTAKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwltb3Z1cHMJNDgoJXIxMSksJXhtbTEKKwlweG9yCSV4bW05LCV4bW03CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisJbW92dXBzCTY0KCVyMTEpLCV4bW0wCisJam1wCS5Mb2NiX2VuY19sb29wMQorCisuYWxpZ24JMzIKKy5Mb2NiX2VuY19sb29wMToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxvY2JfZW5jX2xvb3AxCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJbW92cQklcjEwLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTUKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fb2NiX2VuY3J5cHQxLC4tX19vY2JfZW5jcnlwdDEKKworLmdsb2JsCWFlc19od19vY2JfZGVjcnlwdAorLmhpZGRlbiBhZXNfaHdfb2NiX2RlY3J5cHQKKy50eXBlCWFlc19od19vY2JfZGVjcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYWVzX2h3X29jYl9kZWNyeXB0OgorLmNmaV9zdGFydHByb2MJCisJbGVhcQkoJXJzcCksJXJheAorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJbW92cQk4KCVyYXgpLCVyYngKKwltb3ZxCTgrOCglcmF4KSwlcmJwCisKKwltb3ZsCTI0MCglcmN4KSwlcjEwZAorCW1vdnEJJXJjeCwlcjExCisJc2hsbAkkNCwlcjEwZAorCW1vdnVwcwkoJXJjeCksJXhtbTkKKwltb3Z1cHMJMTYoJXJjeCwlcjEwLDEpLCV4bW0xCisKKwltb3ZkcXUJKCVyOSksJXhtbTE1CisJcHhvcgkleG1tMSwleG1tOQorCXB4b3IJJXhtbTEsJXhtbTE1CisKKwltb3ZsCSQxNiszMiwlZWF4CisJbGVhcQkzMiglcjExLCVyMTAsMSksJXJjeAorCW1vdnVwcwkxNiglcjExKSwleG1tMQorCXN1YnEJJXIxMCwlcmF4CisJbW92cQklcmF4LCVyMTAKKworCW1vdmRxdQkoJXJieCksJXhtbTEwCisJbW92ZHF1CSglcmJwKSwleG1tOAorCisJdGVzdHEJJDEsJXI4CisJam56CS5Mb2NiX2RlY19vZGQKKworCWJzZnEJJXI4LCVyMTIKKwlhZGRxCSQxLCVyOAorCXNobHEJJDQsJXIxMgorCW1vdmRxdQkoJXJieCwlcjEyLDEpLCV4bW03CisJbW92ZHF1CSglcmRpKSwleG1tMgorCWxlYXEJMTYoJXJkaSksJXJkaQorCisJY2FsbAlfX29jYl9kZWNyeXB0MQorCisJbW92ZHFhCSV4bW03LCV4bW0xNQorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwl4b3JwcwkleG1tMiwleG1tOAorCWxlYXEJMTYoJXJzaSksJXJzaQorCXN1YnEJJDEsJXJkeAorCWp6CS5Mb2NiX2RlY19kb25lCisKKy5Mb2NiX2RlY19vZGQ6CisJbGVhcQkxKCVyOCksJXIxMgorCWxlYXEJMyglcjgpLCVyMTMKKwlsZWFxCTUoJXI4KSwlcjE0CisJbGVhcQk2KCVyOCksJXI4CisJYnNmcQklcjEyLCVyMTIKKwlic2ZxCSVyMTMsJXIxMworCWJzZnEJJXIxNCwlcjE0CisJc2hscQkkNCwlcjEyCisJc2hscQkkNCwlcjEzCisJc2hscQkkNCwlcjE0CisKKwlzdWJxCSQ2LCVyZHgKKwlqYwkuTG9jYl9kZWNfc2hvcnQKKwlqbXAJLkxvY2JfZGVjX2dyYW5kbG9vcAorCisuYWxpZ24JMzIKKy5Mb2NiX2RlY19ncmFuZGxvb3A6CisJbW92ZHF1CTAoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwlsZWFxCTk2KCVyZGkpLCVyZGkKKworCWNhbGwJX19vY2JfZGVjcnlwdDYKKworCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJcHhvcgkleG1tMiwleG1tOAorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTgKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW04CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tOAorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCXB4b3IJJXhtbTYsJXhtbTgKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwlweG9yCSV4bW03LCV4bW04CisJbGVhcQk5NiglcnNpKSwlcnNpCisJc3VicQkkNiwlcmR4CisJam5jCS5Mb2NiX2RlY19ncmFuZGxvb3AKKworLkxvY2JfZGVjX3Nob3J0OgorCWFkZHEJJDYsJXJkeAorCWp6CS5Mb2NiX2RlY19kb25lCisKKwltb3ZkcXUJMCglcmRpKSwleG1tMgorCWNtcHEJJDIsJXJkeAorCWpiCS5Mb2NiX2RlY19vbmUKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwlqZQkuTG9jYl9kZWNfdHdvCisKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwljbXBxCSQ0LCVyZHgKKwlqYgkuTG9jYl9kZWNfdGhyZWUKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlqZQkuTG9jYl9kZWNfZm91cgorCisJbW92ZHF1CTY0KCVyZGkpLCV4bW02CisJcHhvcgkleG1tNywleG1tNworCisJY2FsbAlfX29jYl9kZWNyeXB0NgorCisJbW92ZHFhCSV4bW0xNCwleG1tMTUKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTgKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW04CisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tOAorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCXB4b3IJJXhtbTUsJXhtbTgKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwlweG9yCSV4bW02LCV4bW04CisKKwlqbXAJLkxvY2JfZGVjX2RvbmUKKworLmFsaWduCTE2CisuTG9jYl9kZWNfb25lOgorCW1vdmRxYQkleG1tMTAsJXhtbTcKKworCWNhbGwJX19vY2JfZGVjcnlwdDEKKworCW1vdmRxYQkleG1tNywleG1tMTUKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCXhvcnBzCSV4bW0yLCV4bW04CisJam1wCS5Mb2NiX2RlY19kb25lCisKKy5hbGlnbgkxNgorLkxvY2JfZGVjX3R3bzoKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCisJY2FsbAlfX29jYl9kZWNyeXB0NAorCisJbW92ZHFhCSV4bW0xMSwleG1tMTUKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCXhvcnBzCSV4bW0yLCV4bW04CisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJeG9ycHMJJXhtbTMsJXhtbTgKKworCWptcAkuTG9jYl9kZWNfZG9uZQorCisuYWxpZ24JMTYKKy5Mb2NiX2RlY190aHJlZToKKwlweG9yCSV4bW01LCV4bW01CisKKwljYWxsCV9fb2NiX2RlY3J5cHQ0CisKKwltb3ZkcWEJJXhtbTEyLCV4bW0xNQorCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJeG9ycHMJJXhtbTIsJXhtbTgKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwl4b3JwcwkleG1tMywleG1tOAorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCXhvcnBzCSV4bW00LCV4bW04CisKKwlqbXAJLkxvY2JfZGVjX2RvbmUKKworLmFsaWduCTE2CisuTG9jYl9kZWNfZm91cjoKKwljYWxsCV9fb2NiX2RlY3J5cHQ0CisKKwltb3ZkcWEJJXhtbTEzLCV4bW0xNQorCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJcHhvcgkleG1tMiwleG1tOAorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTgKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW04CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tOAorCisuTG9jYl9kZWNfZG9uZToKKwlweG9yCSV4bW0wLCV4bW0xNQorCW1vdmRxdQkleG1tOCwoJXJicCkKKwltb3ZkcXUJJXhtbTE1LCglcjkpCisKKwl4b3JwcwkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwlweG9yCSV4bW04LCV4bW04CisJcHhvcgkleG1tOSwleG1tOQorCXB4b3IJJXhtbTEwLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0xMQorCXB4b3IJJXhtbTEyLCV4bW0xMgorCXB4b3IJJXhtbTEzLCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCXB4b3IJJXhtbTE1LCV4bW0xNQorCWxlYXEJNDAoJXJzcCksJXJheAorLmNmaV9kZWZfY2ZhCSVyYXgsOAorCW1vdnEJLTQwKCVyYXgpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJheCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyYXgpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcmF4KSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyYXgpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTG9jYl9kZWNfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlhZXNfaHdfb2NiX2RlY3J5cHQsLi1hZXNfaHdfb2NiX2RlY3J5cHQKKworLnR5cGUJX19vY2JfZGVjcnlwdDYsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19fb2NiX2RlY3J5cHQ2OgorCXB4b3IJJXhtbTksJXhtbTE1CisJbW92ZHF1CSglcmJ4LCVyMTIsMSksJXhtbTExCisJbW92ZHFhCSV4bW0xMCwleG1tMTIKKwltb3ZkcXUJKCVyYngsJXIxMywxKSwleG1tMTMKKwltb3ZkcWEJJXhtbTEwLCV4bW0xNAorCXB4b3IJJXhtbTE1LCV4bW0xMAorCW1vdmRxdQkoJXJieCwlcjE0LDEpLCV4bW0xNQorCXB4b3IJJXhtbTEwLCV4bW0xMQorCXB4b3IJJXhtbTEwLCV4bW0yCisJcHhvcgkleG1tMTEsJXhtbTEyCisJcHhvcgkleG1tMTEsJXhtbTMKKwlweG9yCSV4bW0xMiwleG1tMTMKKwlweG9yCSV4bW0xMiwleG1tNAorCXB4b3IJJXhtbTEzLCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW01CisJcHhvcgkleG1tMTQsJXhtbTE1CisJcHhvcgkleG1tMTQsJXhtbTYKKwlweG9yCSV4bW0xNSwleG1tNworCW1vdnVwcwkzMiglcjExKSwleG1tMAorCisJbGVhcQkxKCVyOCksJXIxMgorCWxlYXEJMyglcjgpLCVyMTMKKwlsZWFxCTUoJXI4KSwlcjE0CisJYWRkcQkkNiwlcjgKKwlweG9yCSV4bW05LCV4bW0xMAorCWJzZnEJJXIxMiwlcjEyCisJYnNmcQklcjEzLCVyMTMKKwlic2ZxCSVyMTQsJXIxNAorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworCXB4b3IJJXhtbTksJXhtbTExCisJcHhvcgkleG1tOSwleG1tMTIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisJcHhvcgkleG1tOSwleG1tMTMKKwlweG9yCSV4bW05LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJNDgoJXIxMSksJXhtbTEKKwlweG9yCSV4bW05LCV4bW0xNQorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCTY0KCVyMTEpLCV4bW0wCisJc2hscQkkNCwlcjEyCisJc2hscQkkNCwlcjEzCisJam1wCS5Mb2NiX2RlY19sb29wNgorCisuYWxpZ24JMzIKKy5Mb2NiX2RlY19sb29wNjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CS5Mb2NiX2RlY19sb29wNgorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJc2hscQkkNCwlcjE0CisKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjEwCisJbW92ZHF1CSglcmJ4KSwleG1tMTAKKwltb3ZxCSVyMTAsJXJheAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMTkKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjI4CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIzLDIzNworLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyNDYKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjU1CisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfX29jYl9kZWNyeXB0NiwuLV9fb2NiX2RlY3J5cHQ2CisKKy50eXBlCV9fb2NiX2RlY3J5cHQ0LEBmdW5jdGlvbgorLmFsaWduCTMyCitfX29jYl9kZWNyeXB0NDoKKwlweG9yCSV4bW05LCV4bW0xNQorCW1vdmRxdQkoJXJieCwlcjEyLDEpLCV4bW0xMQorCW1vdmRxYQkleG1tMTAsJXhtbTEyCisJbW92ZHF1CSglcmJ4LCVyMTMsMSksJXhtbTEzCisJcHhvcgkleG1tMTUsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTEyLCV4bW0xMworCXB4b3IJJXhtbTEyLCV4bW00CisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3Z1cHMJMzIoJXIxMSksJXhtbTAKKworCXB4b3IJJXhtbTksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMTEKKwlweG9yCSV4bW05LCV4bW0xMgorCXB4b3IJJXhtbTksJXhtbTEzCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCTQ4KCVyMTEpLCV4bW0xCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisJbW92dXBzCTY0KCVyMTEpLCV4bW0wCisJam1wCS5Mb2NiX2RlY19sb29wNAorCisuYWxpZ24JMzIKKy5Mb2NiX2RlY19sb29wNDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxvY2JfZGVjX2xvb3A0CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJbW92cQklcjEwLCVyYXgKKworLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMTAKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjE5CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIzLDIyOAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMzcKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fb2NiX2RlY3J5cHQ0LC4tX19vY2JfZGVjcnlwdDQKKworLnR5cGUJX19vY2JfZGVjcnlwdDEsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19fb2NiX2RlY3J5cHQxOgorCXB4b3IJJXhtbTE1LCV4bW03CisJcHhvcgkleG1tOSwleG1tNworCXB4b3IJJXhtbTcsJXhtbTIKKwltb3Z1cHMJMzIoJXIxMSksJXhtbTAKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwltb3Z1cHMJNDgoJXIxMSksJXhtbTEKKwlweG9yCSV4bW05LCV4bW03CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisJbW92dXBzCTY0KCVyMTEpLCV4bW0wCisJam1wCS5Mb2NiX2RlY19sb29wMQorCisuYWxpZ24JMzIKKy5Mb2NiX2RlY19sb29wMToKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJLkxvY2JfZGVjX2xvb3AxCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJbW92cQklcjEwLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMywyMTUKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fb2NiX2RlY3J5cHQxLC4tX19vY2JfZGVjcnlwdDEKKy5nbG9ibAlhZXNfaHdfY2JjX2VuY3J5cHQKKy5oaWRkZW4gYWVzX2h3X2NiY19lbmNyeXB0CisudHlwZQlhZXNfaHdfY2JjX2VuY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2Flc19od19jYmNfZW5jcnlwdDoKKy5jZmlfc3RhcnRwcm9jCQorCXRlc3RxCSVyZHgsJXJkeAorCWp6CS5MY2JjX3JldAorCisJbW92bAkyNDAoJXJjeCksJXIxMGQKKwltb3ZxCSVyY3gsJXIxMQorCXRlc3RsCSVyOWQsJXI5ZAorCWp6CS5MY2JjX2RlY3J5cHQKKworCW1vdnVwcwkoJXI4KSwleG1tMgorCW1vdmwJJXIxMGQsJWVheAorCWNtcHEJJDE2LCVyZHgKKwlqYgkuTGNiY19lbmNfdGFpbAorCXN1YnEJJDE2LCVyZHgKKwlqbXAJLkxjYmNfZW5jX2xvb3AKKy5hbGlnbgkxNgorLkxjYmNfZW5jX2xvb3A6CisJbW92dXBzCSglcmRpKSwleG1tMworCWxlYXEJMTYoJXJkaSksJXJkaQorCisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0zCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTMsJXhtbTIKKy5Mb29wX2VuYzFfMTU6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXJjeCksJXhtbTEKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwlqbnoJLkxvb3BfZW5jMV8xNQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwltb3ZsCSVyMTBkLCVlYXgKKwltb3ZxCSVyMTEsJXJjeAorCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJc3VicQkkMTYsJXJkeAorCWpuYwkuTGNiY19lbmNfbG9vcAorCWFkZHEJJDE2LCVyZHgKKwlqbnoJLkxjYmNfZW5jX3RhaWwKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCW1vdnVwcwkleG1tMiwoJXI4KQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJam1wCS5MY2JjX3JldAorCisuTGNiY19lbmNfdGFpbDoKKwltb3ZxCSVyZHgsJXJjeAorCXhjaGdxCSVyZGksJXJzaQorLmxvbmcJMHg5MDY2QTRGMworCW1vdmwJJDE2LCVlY3gKKwlzdWJxCSVyZHgsJXJjeAorCXhvcmwJJWVheCwlZWF4CisubG9uZwkweDkwNjZBQUYzCisJbGVhcQktMTYoJXJkaSksJXJkaQorCW1vdmwJJXIxMGQsJWVheAorCW1vdnEJJXJkaSwlcnNpCisJbW92cQklcjExLCVyY3gKKwl4b3JxCSVyZHgsJXJkeAorCWptcAkuTGNiY19lbmNfbG9vcAorCisuYWxpZ24JMTYKKy5MY2JjX2RlY3J5cHQ6CisJY21wcQkkMTYsJXJkeAorCWpuZQkuTGNiY19kZWNyeXB0X2J1bGsKKworCisKKwltb3ZkcXUJKCVyZGkpLCV4bW0yCisJbW92ZHF1CSglcjgpLCV4bW0zCisJbW92ZHFhCSV4bW0yLCV4bW00CisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9kZWMxXzE2OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVyMTBkCisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpuegkuTG9vcF9kZWMxXzE2CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJbW92ZHF1CSV4bW00LCglcjgpCisJeG9ycHMJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwlqbXAJLkxjYmNfcmV0CisuYWxpZ24JMTYKKy5MY2JjX2RlY3J5cHRfYnVsazoKKwlsZWFxCSglcnNwKSwlcjExCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXIxMQorCXB1c2hxCSVyYnAKKy5jZmlfb2Zmc2V0CSVyYnAsLTE2CisJc3VicQkkMTYsJXJzcAorCWFuZHEJJC0xNiwlcnNwCisJbW92cQklcmN4LCVyYnAKKwltb3Z1cHMJKCVyOCksJXhtbTEwCisJbW92bAklcjEwZCwlZWF4CisJY21wcQkkMHg1MCwlcmR4CisJamJlCS5MY2JjX2RlY190YWlsCisKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92ZHF1CTAoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcWEJJXhtbTIsJXhtbTExCisJbW92ZHF1CTMyKCVyZGkpLCV4bW00CisJbW92ZHFhCSV4bW0zLCV4bW0xMgorCW1vdmRxdQk0OCglcmRpKSwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tMTMKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTE0CisJbW92ZHF1CTgwKCVyZGkpLCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW0xNQorCWxlYXEJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXI5CisJbW92bAk0KCVyOSksJXI5ZAorCWNtcHEJJDB4NzAsJXJkeAorCWpiZQkuTGNiY19kZWNfc2l4X29yX3NldmVuCisKKwlhbmRsCSQ3MTMwMzE2OCwlcjlkCisJc3VicQkkMHg1MCwlcmR4CisJY21wbAkkNDE5NDMwNCwlcjlkCisJamUJLkxjYmNfZGVjX2xvb3A2X2VudGVyCisJc3VicQkkMHgyMCwlcmR4CisJbGVhcQkxMTIoJXJjeCksJXJjeAorCWptcAkuTGNiY19kZWNfbG9vcDhfZW50ZXIKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2xvb3A4OgorCW1vdnVwcwkleG1tOSwoJXJzaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKy5MY2JjX2RlY19sb29wOF9lbnRlcjoKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTgKKwlweG9yCSV4bW0wLCV4bW0yCisJbW92ZHF1CTExMiglcmRpKSwleG1tOQorCXB4b3IJJXhtbTAsJXhtbTMKKwltb3Z1cHMJMTYtMTEyKCVyY3gpLCV4bW0xCisJcHhvcgkleG1tMCwleG1tNAorCW1vdnEJJC0xLCVyYnAKKwljbXBxCSQweDcwLCVyZHgKKwlweG9yCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMCwleG1tNgorCXB4b3IJJXhtbTAsJXhtbTcKKwlweG9yCSV4bW0wLCV4bW04CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgkleG1tMCwleG1tOQorCW1vdnVwcwkzMi0xMTIoJXJjeCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTMKKwlhZGNxCSQwLCVyYnAKKwlhbmRxCSQxMjgsJXJicAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwlhZGRxCSVyZGksJXJicAorCW1vdnVwcwk0OC0xMTIoJXJjeCksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMAorCW1vdnVwcwk2NC0xMTIoJXJjeCksJXhtbTAKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMQorCW1vdnVwcwk4MC0xMTIoJXJjeCksJXhtbTEKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMAorCW1vdnVwcwk5Ni0xMTIoJXJjeCksJXhtbTAKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMQorCW1vdnVwcwkxMTItMTEyKCVyY3gpLCV4bW0xCisJbm9wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJMTI4LTExMiglcmN4KSwleG1tMAorCW5vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisJbW92dXBzCTE0NC0xMTIoJXJjeCksJXhtbTEKKwljbXBsCSQxMSwlZWF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJMTYwLTExMiglcmN4KSwleG1tMAorCWpiCS5MY2JjX2RlY19kb25lCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwltb3Z1cHMJMTc2LTExMiglcmN4KSwleG1tMQorCW5vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAwCisJbW92dXBzCTE5Mi0xMTIoJXJjeCksJXhtbTAKKwlqZQkuTGNiY19kZWNfZG9uZQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisJbW92dXBzCTIwOC0xMTIoJXJjeCksJXhtbTEKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMAorCW1vdnVwcwkyMjQtMTEyKCVyY3gpLCV4bW0wCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY19kb25lOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisJcHhvcgkleG1tMCwleG1tMTAKKwlweG9yCSV4bW0wLCV4bW0xMQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJcHhvcgkleG1tMCwleG1tMTIKKwlweG9yCSV4bW0wLCV4bW0xMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJcHhvcgkleG1tMCwleG1tMTQKKwlweG9yCSV4bW0wLCV4bW0xNQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisJbW92ZHF1CTgwKCVyZGkpLCV4bW0xCisKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjEwCisJbW92ZHF1CTk2KCVyZGkpLCV4bW0xMAorCXB4b3IJJXhtbTAsJXhtbTEKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjE5CisJcHhvcgkleG1tMCwleG1tMTAKKwltb3ZkcXUJMTEyKCVyZGkpLCV4bW0wCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIzLDIyOAorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwltb3ZkcXUJMCglcmJwKSwleG1tMTEKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjM3CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIzLDI0NgorCW1vdmRxdQkxNiglcmJwKSwleG1tMTIKKwltb3ZkcXUJMzIoJXJicCksJXhtbTEzCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIzLDI1NQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMywxOTMKKwltb3ZkcXUJNDgoJXJicCksJXhtbTE0CisJbW92ZHF1CTY0KCVyYnApLCV4bW0xNQorLmJ5dGUJMTAyLDY5LDE1LDU2LDIyMywyMDIKKwltb3ZkcWEJJXhtbTAsJXhtbTEwCisJbW92ZHF1CTgwKCVyYnApLCV4bW0xCisJbW92dXBzCS0xMTIoJXJjeCksJXhtbTAKKworCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3ZkcWEJJXhtbTExLCV4bW0yCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92ZHFhCSV4bW0xMiwleG1tMworCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCW1vdmRxYQkleG1tMTMsJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwltb3ZkcWEJJXhtbTE0LCV4bW01CisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJbW92ZHFhCSV4bW0xNSwleG1tNgorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCW1vdmRxYQkleG1tMSwleG1tNworCW1vdnVwcwkleG1tOCw5NiglcnNpKQorCWxlYXEJMTEyKCVyc2kpLCVyc2kKKworCXN1YnEJJDB4ODAsJXJkeAorCWphCS5MY2JjX2RlY19sb29wOAorCisJbW92YXBzCSV4bW05LCV4bW0yCisJbGVhcQktMTEyKCVyY3gpLCVyY3gKKwlhZGRxCSQweDcwLCVyZHgKKwlqbGUJLkxjYmNfZGVjX2NsZWFyX3RhaWxfY29sbGVjdGVkCisJbW92dXBzCSV4bW05LCglcnNpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWNtcHEJJDB4NTAsJXJkeAorCWpiZQkuTGNiY19kZWNfdGFpbAorCisJbW92YXBzCSV4bW0xMSwleG1tMgorLkxjYmNfZGVjX3NpeF9vcl9zZXZlbjoKKwljbXBxCSQweDYwLCVyZHgKKwlqYQkuTGNiY19kZWNfc2V2ZW4KKworCW1vdmFwcwkleG1tNywleG1tOAorCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZhcHMJJXhtbTgsJXhtbTEwCisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tMTQsJXhtbTYKKwltb3ZkcXUJJXhtbTUsNDgoJXJzaSkKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tMTUsJXhtbTcKKwltb3ZkcXUJJXhtbTYsNjQoJXJzaSkKKwlweG9yCSV4bW02LCV4bW02CisJbGVhcQk4MCglcnNpKSwlcnNpCisJbW92ZHFhCSV4bW03LCV4bW0yCisJcHhvcgkleG1tNywleG1tNworCWptcAkuTGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKworLmFsaWduCTE2CisuTGNiY19kZWNfc2V2ZW46CisJbW92dXBzCTk2KCVyZGkpLCV4bW04CisJeG9ycHMJJXhtbTksJXhtbTkKKwljYWxsCV9hZXNuaV9kZWNyeXB0OAorCW1vdnVwcwk4MCglcmRpKSwleG1tOQorCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92dXBzCTk2KCVyZGkpLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTE0LCV4bW02CisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTE1LCV4bW03CisJbW92ZHF1CSV4bW02LDY0KCVyc2kpCisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTksJXhtbTgKKwltb3ZkcXUJJXhtbTcsODAoJXJzaSkKKwlweG9yCSV4bW03LCV4bW03CisJbGVhcQk5NiglcnNpKSwlcnNpCisJbW92ZHFhCSV4bW04LCV4bW0yCisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKKwlqbXAJLkxjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2xvb3A2OgorCW1vdnVwcwkleG1tNywoJXJzaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwltb3ZkcXUJMCglcmRpKSwleG1tMgorCW1vdmRxdQkxNiglcmRpKSwleG1tMworCW1vdmRxYQkleG1tMiwleG1tMTEKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3ZkcWEJJXhtbTMsJXhtbTEyCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW0xMworCW1vdmRxdQk2NCglcmRpKSwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tMTQKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTE1CisuTGNiY19kZWNfbG9vcDZfZW50ZXI6CisJbGVhcQk5NiglcmRpKSwlcmRpCisJbW92ZHFhCSV4bW03LCV4bW04CisKKwljYWxsCV9hZXNuaV9kZWNyeXB0NgorCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZkcWEJJXhtbTgsJXhtbTEwCisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0xMywleG1tNQorCW1vdmRxdQkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTE0LCV4bW02CisJbW92cQklcmJwLCVyY3gKKwltb3ZkcXUJJXhtbTUsNDgoJXJzaSkKKwlweG9yCSV4bW0xNSwleG1tNworCW1vdmwJJXIxMGQsJWVheAorCW1vdmRxdQkleG1tNiw2NCglcnNpKQorCWxlYXEJODAoJXJzaSksJXJzaQorCXN1YnEJJDB4NjAsJXJkeAorCWphCS5MY2JjX2RlY19sb29wNgorCisJbW92ZHFhCSV4bW03LCV4bW0yCisJYWRkcQkkMHg1MCwlcmR4CisJamxlCS5MY2JjX2RlY19jbGVhcl90YWlsX2NvbGxlY3RlZAorCW1vdnVwcwkleG1tNywoJXJzaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKworLkxjYmNfZGVjX3RhaWw6CisJbW92dXBzCSglcmRpKSwleG1tMgorCXN1YnEJJDB4MTAsJXJkeAorCWpiZQkuTGNiY19kZWNfb25lCisKKwltb3Z1cHMJMTYoJXJkaSksJXhtbTMKKwltb3ZhcHMJJXhtbTIsJXhtbTExCisJc3VicQkkMHgxMCwlcmR4CisJamJlCS5MY2JjX2RlY190d28KKworCW1vdnVwcwkzMiglcmRpKSwleG1tNAorCW1vdmFwcwkleG1tMywleG1tMTIKKwlzdWJxCSQweDEwLCVyZHgKKwlqYmUJLkxjYmNfZGVjX3RocmVlCisKKwltb3Z1cHMJNDgoJXJkaSksJXhtbTUKKwltb3ZhcHMJJXhtbTQsJXhtbTEzCisJc3VicQkkMHgxMCwlcmR4CisJamJlCS5MY2JjX2RlY19mb3VyCisKKwltb3Z1cHMJNjQoJXJkaSksJXhtbTYKKwltb3ZhcHMJJXhtbTUsJXhtbTE0CisJbW92YXBzCSV4bW02LCV4bW0xNQorCXhvcnBzCSV4bW03LCV4bW03CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmFwcwkleG1tMTUsJXhtbTEwCisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tMTQsJXhtbTYKKwltb3ZkcXUJJXhtbTUsNDgoJXJzaSkKKwlweG9yCSV4bW01LCV4bW01CisJbGVhcQk2NCglcnNpKSwlcnNpCisJbW92ZHFhCSV4bW02LCV4bW0yCisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwlzdWJxCSQweDEwLCVyZHgKKwlqbXAJLkxjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisKKy5hbGlnbgkxNgorLkxjYmNfZGVjX29uZToKKwltb3ZhcHMJJXhtbTIsJXhtbTExCisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCisuTG9vcF9kZWMxXzE3OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CS5Mb29wX2RlYzFfMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92YXBzCSV4bW0xMSwleG1tMTAKKwlqbXAJLkxjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisuYWxpZ24JMTYKKy5MY2JjX2RlY190d286CisJbW92YXBzCSV4bW0zLCV4bW0xMgorCWNhbGwJX2Flc25pX2RlY3J5cHQyCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZhcHMJJXhtbTEyLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCW1vdmRxYQkleG1tMywleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlqbXAJLkxjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisuYWxpZ24JMTYKKy5MY2JjX2RlY190aHJlZToKKwltb3ZhcHMJJXhtbTQsJXhtbTEzCisJY2FsbAlfYWVzbmlfZGVjcnlwdDMKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmFwcwkleG1tMTMsJXhtbTEwCisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcHhvcgkleG1tNCwleG1tNAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWptcAkuTGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2ZvdXI6CisJbW92YXBzCSV4bW01LCV4bW0xNAorCWNhbGwJX2Flc25pX2RlY3J5cHQ0CisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZhcHMJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tNAorCW1vdmRxYQkleG1tNSwleG1tMgorCXB4b3IJJXhtbTUsJXhtbTUKKwlsZWFxCTQ4KCVyc2kpLCVyc2kKKwlqbXAJLkxjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisKKy5hbGlnbgkxNgorLkxjYmNfZGVjX2NsZWFyX3RhaWxfY29sbGVjdGVkOgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKKy5MY2JjX2RlY190YWlsX2NvbGxlY3RlZDoKKwltb3Z1cHMJJXhtbTEwLCglcjgpCisJYW5kcQkkMTUsJXJkeAorCWpuegkuTGNiY19kZWNfdGFpbF9wYXJ0aWFsCisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwlqbXAJLkxjYmNfZGVjX3JldAorLmFsaWduCTE2CisuTGNiY19kZWNfdGFpbF9wYXJ0aWFsOgorCW1vdmFwcwkleG1tMiwoJXJzcCkKKwlweG9yCSV4bW0yLCV4bW0yCisJbW92cQkkMTYsJXJjeAorCW1vdnEJJXJzaSwlcmRpCisJc3VicQklcmR4LCVyY3gKKwlsZWFxCSglcnNwKSwlcnNpCisubG9uZwkweDkwNjZBNEYzCisJbW92ZHFhCSV4bW0yLCglcnNwKQorCisuTGNiY19kZWNfcmV0OgorCXhvcnBzCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCW1vdnEJLTgoJXIxMSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwlsZWFxCSglcjExKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxjYmNfcmV0OgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYWVzX2h3X2NiY19lbmNyeXB0LC4tYWVzX2h3X2NiY19lbmNyeXB0CisuZ2xvYmwJYWVzX2h3X3NldF9kZWNyeXB0X2tleQorLmhpZGRlbiBhZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlhZXNfaHdfc2V0X2RlY3J5cHRfa2V5LEBmdW5jdGlvbgorLmFsaWduCTE2CithZXNfaHdfc2V0X2RlY3J5cHRfa2V5OgorLmNmaV9zdGFydHByb2MJCisuYnl0ZQkweDQ4LDB4ODMsMHhFQywweDA4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKwljYWxsCV9fYWVzbmlfc2V0X2VuY3J5cHRfa2V5CisJc2hsbAkkNCwlZXNpCisJdGVzdGwJJWVheCwlZWF4CisJam56CS5MZGVjX2tleV9yZXQKKwlsZWFxCTE2KCVyZHgsJXJzaSwxKSwlcmRpCisKKwltb3Z1cHMJKCVyZHgpLCV4bW0wCisJbW92dXBzCSglcmRpKSwleG1tMQorCW1vdnVwcwkleG1tMCwoJXJkaSkKKwltb3Z1cHMJJXhtbTEsKCVyZHgpCisJbGVhcQkxNiglcmR4KSwlcmR4CisJbGVhcQktMTYoJXJkaSksJXJkaQorCisuTGRlY19rZXlfaW52ZXJzZToKKwltb3Z1cHMJKCVyZHgpLCV4bW0wCisJbW92dXBzCSglcmRpKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDIxOSwxOTIKKy5ieXRlCTEwMiwxNSw1NiwyMTksMjAxCisJbGVhcQkxNiglcmR4KSwlcmR4CisJbGVhcQktMTYoJXJkaSksJXJkaQorCW1vdnVwcwkleG1tMCwxNiglcmRpKQorCW1vdnVwcwkleG1tMSwtMTYoJXJkeCkKKwljbXBxCSVyZHgsJXJkaQorCWphCS5MZGVjX2tleV9pbnZlcnNlCisKKwltb3Z1cHMJKCVyZHgpLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjE5LDE5MgorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTAsKCVyZGkpCisJcHhvcgkleG1tMCwleG1tMAorLkxkZWNfa2V5X3JldDoKKwlhZGRxCSQ4LCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTgKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5MU0VIX2VuZF9zZXRfZGVjcnlwdF9rZXk6Cisuc2l6ZQlhZXNfaHdfc2V0X2RlY3J5cHRfa2V5LC4tYWVzX2h3X3NldF9kZWNyeXB0X2tleQorLmdsb2JsCWFlc19od19zZXRfZW5jcnlwdF9rZXkKKy5oaWRkZW4gYWVzX2h3X3NldF9lbmNyeXB0X2tleQorLnR5cGUJYWVzX2h3X3NldF9lbmNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYWVzX2h3X3NldF9lbmNyeXB0X2tleToKK19fYWVzbmlfc2V0X2VuY3J5cHRfa2V5OgorLmNmaV9zdGFydHByb2MJCisuYnl0ZQkweDQ4LDB4ODMsMHhFQywweDA4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKwltb3ZxCSQtMSwlcmF4CisJdGVzdHEJJXJkaSwlcmRpCisJanoJLkxlbmNfa2V5X3JldAorCXRlc3RxCSVyZHgsJXJkeAorCWp6CS5MZW5jX2tleV9yZXQKKworCW1vdnVwcwkoJXJkaSksJXhtbTAKKwl4b3JwcwkleG1tNCwleG1tNAorCWxlYXEJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXIxMAorCW1vdmwJNCglcjEwKSwlcjEwZAorCWFuZGwJJDI2ODQzNzUwNCwlcjEwZAorCWxlYXEJMTYoJXJkeCksJXJheAorCWNtcGwJJDI1NiwlZXNpCisJamUJLkwxNHJvdW5kcworCWNtcGwJJDE5MiwlZXNpCisJamUJLkwxMnJvdW5kcworCWNtcGwJJDEyOCwlZXNpCisJam5lCS5MYmFkX2tleWJpdHMKKworLkwxMHJvdW5kczoKKwltb3ZsCSQ5LCVlc2kKKwljbXBsCSQyNjg0MzU0NTYsJXIxMGQKKwlqZQkuTDEwcm91bmRzX2FsdAorCisJbW92dXBzCSV4bW0wLCglcmR4KQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMQorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzEyOF9jb2xkCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwyCisJY2FsbAkuTGtleV9leHBhbnNpb25fMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw0CisJY2FsbAkuTGtleV9leHBhbnNpb25fMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw4CisJY2FsbAkuTGtleV9leHBhbnNpb25fMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxNgorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMzIKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDY0CisJY2FsbAkuTGtleV9leHBhbnNpb25fMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxMjgKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8xMjgKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDI3CisJY2FsbAkuTGtleV9leHBhbnNpb25fMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw1NAorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzEyOAorCW1vdnVwcwkleG1tMCwoJXJheCkKKwltb3ZsCSVlc2ksODAoJXJheCkKKwl4b3JsCSVlYXgsJWVheAorCWptcAkuTGVuY19rZXlfcmV0CisKKy5hbGlnbgkxNgorLkwxMHJvdW5kc19hbHQ6CisJbW92ZHFhCS5Ma2V5X3JvdGF0ZSglcmlwKSwleG1tNQorCW1vdmwJJDgsJXIxMGQKKwltb3ZkcWEJLkxrZXlfcmNvbjEoJXJpcCksJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwltb3ZkcXUJJXhtbTAsKCVyZHgpCisJam1wCS5Mb29wX2tleTEyOAorCisuYWxpZ24JMTYKKy5Mb29wX2tleTEyODoKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDIyMSwxOTYKKwlwc2xsZAkkMSwleG1tNAorCWxlYXEJMTYoJXJheCksJXJheAorCisJbW92ZHFhCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0yCisKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHF1CSV4bW0wLC0xNiglcmF4KQorCW1vdmRxYQkleG1tMCwleG1tMgorCisJZGVjbAklcjEwZAorCWpuegkuTG9vcF9rZXkxMjgKKworCW1vdmRxYQkuTGtleV9yY29uMWIoJXJpcCksJXhtbTQKKworLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDE5NgorCXBzbGxkCSQxLCV4bW00CisKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTIKKworCXB4b3IJJXhtbTIsJXhtbTAKKwltb3ZkcXUJJXhtbTAsKCVyYXgpCisKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDIyMSwxOTYKKworCW1vdmRxYQkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMywleG1tMgorCisJcHhvcgkleG1tMiwleG1tMAorCW1vdmRxdQkleG1tMCwxNiglcmF4KQorCisJbW92bAklZXNpLDk2KCVyYXgpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJLkxlbmNfa2V5X3JldAorCisuYWxpZ24JMTYKKy5MMTJyb3VuZHM6CisJbW92cQkxNiglcmRpKSwleG1tMgorCW1vdmwJJDExLCVlc2kKKwljbXBsCSQyNjg0MzU0NTYsJXIxMGQKKwlqZQkuTDEycm91bmRzX2FsdAorCisJbW92dXBzCSV4bW0wLCglcmR4KQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMQorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzE5MmFfY29sZAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMgorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzE5MmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDQKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8xOTJhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw4CisJY2FsbAkuTGtleV9leHBhbnNpb25fMTkyYgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMTYKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8xOTJhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiwzMgorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzE5MmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDY0CisJY2FsbAkuTGtleV9leHBhbnNpb25fMTkyYQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMTI4CisJY2FsbAkuTGtleV9leHBhbnNpb25fMTkyYgorCW1vdnVwcwkleG1tMCwoJXJheCkKKwltb3ZsCSVlc2ksNDgoJXJheCkKKwl4b3JxCSVyYXgsJXJheAorCWptcAkuTGVuY19rZXlfcmV0CisKKy5hbGlnbgkxNgorLkwxMnJvdW5kc19hbHQ6CisJbW92ZHFhCS5Ma2V5X3JvdGF0ZTE5MiglcmlwKSwleG1tNQorCW1vdmRxYQkuTGtleV9yY29uMSglcmlwKSwleG1tNAorCW1vdmwJJDgsJXIxMGQKKwltb3ZkcXUJJXhtbTAsKCVyZHgpCisJam1wCS5Mb29wX2tleTE5MgorCisuYWxpZ24JMTYKKy5Mb29wX2tleTE5MjoKKwltb3ZxCSV4bW0yLDAoJXJheCkKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTIKKwlwc2xsZAkkMSwleG1tNAorCWxlYXEJMjQoJXJheCksJXJheAorCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisKKwlwc2h1ZmQJJDB4ZmYsJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMworCisJcHhvcgkleG1tMiwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcXUJJXhtbTAsLTE2KCVyYXgpCisKKwlkZWNsCSVyMTBkCisJam56CS5Mb29wX2tleTE5MgorCisJbW92bAklZXNpLDMyKCVyYXgpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJLkxlbmNfa2V5X3JldAorCisuYWxpZ24JMTYKKy5MMTRyb3VuZHM6CisJbW92dXBzCTE2KCVyZGkpLCV4bW0yCisJbW92bAkkMTMsJWVzaQorCWxlYXEJMTYoJXJheCksJXJheAorCWNtcGwJJDI2ODQzNTQ1NiwlcjEwZAorCWplCS5MMTRyb3VuZHNfYWx0CisKKwltb3Z1cHMJJXhtbTAsKCVyZHgpCisJbW92dXBzCSV4bW0yLDE2KCVyZHgpCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiwxCisJY2FsbAkuTGtleV9leHBhbnNpb25fMjU2YV9jb2xkCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxCisJY2FsbAkuTGtleV9leHBhbnNpb25fMjU2YgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMgorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzI1NmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDIKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw0CisJY2FsbAkuTGtleV9leHBhbnNpb25fMjU2YQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsNAorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDgKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw4CisJY2FsbAkuTGtleV9leHBhbnNpb25fMjU2YgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMTYKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxNgorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDMyCisJY2FsbAkuTGtleV9leHBhbnNpb25fMjU2YQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMzIKKwljYWxsCS5Ma2V5X2V4cGFuc2lvbl8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw2NAorCWNhbGwJLkxrZXlfZXhwYW5zaW9uXzI1NmEKKwltb3Z1cHMJJXhtbTAsKCVyYXgpCisJbW92bAklZXNpLDE2KCVyYXgpCisJeG9ycQklcmF4LCVyYXgKKwlqbXAJLkxlbmNfa2V5X3JldAorCisuYWxpZ24JMTYKKy5MMTRyb3VuZHNfYWx0OgorCW1vdmRxYQkuTGtleV9yb3RhdGUoJXJpcCksJXhtbTUKKwltb3ZkcWEJLkxrZXlfcmNvbjEoJXJpcCksJXhtbTQKKwltb3ZsCSQ3LCVyMTBkCisJbW92ZHF1CSV4bW0wLDAoJXJkeCkKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwltb3ZkcXUJJXhtbTIsMTYoJXJkeCkKKwlqbXAJLkxvb3Bfa2V5MjU2CisKKy5hbGlnbgkxNgorLkxvb3Bfa2V5MjU2OgorLmJ5dGUJMTAyLDE1LDU2LDAsMjEzCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxMgorCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbGQJJDEsJXhtbTQKKworCXB4b3IJJXhtbTIsJXhtbTAKKwltb3ZkcXUJJXhtbTAsKCVyYXgpCisKKwlkZWNsCSVyMTBkCisJanoJLkxkb25lX2tleTI1NgorCisJcHNodWZkCSQweGZmLCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTEKKworCW1vdmRxYQkleG1tMSwleG1tMworCXBzbGxkcQkkNCwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0xCisJcHhvcgkleG1tMywleG1tMQorCisJcHhvcgkleG1tMSwleG1tMgorCW1vdmRxdQkleG1tMiwxNiglcmF4KQorCWxlYXEJMzIoJXJheCksJXJheAorCW1vdmRxYQkleG1tMiwleG1tMQorCisJam1wCS5Mb29wX2tleTI1NgorCisuTGRvbmVfa2V5MjU2OgorCW1vdmwJJWVzaSwxNiglcmF4KQorCXhvcmwJJWVheCwlZWF4CisJam1wCS5MZW5jX2tleV9yZXQKKworLmFsaWduCTE2CisuTGJhZF9rZXliaXRzOgorCW1vdnEJJC0yLCVyYXgKKy5MZW5jX2tleV9yZXQ6CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJYWRkcQkkOCwlcnNwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CS04CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuTFNFSF9lbmRfc2V0X2VuY3J5cHRfa2V5OgorCisuYWxpZ24JMTYKKy5Ma2V5X2V4cGFuc2lvbl8xMjg6CisJbW92dXBzCSV4bW0wLCglcmF4KQorCWxlYXEJMTYoJXJheCksJXJheAorLkxrZXlfZXhwYW5zaW9uXzEyOF9jb2xkOgorCXNodWZwcwkkMTYsJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwkkMTQwLCV4bW0wLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTAKKwlzaHVmcHMJJDI1NSwleG1tMSwleG1tMQorCXhvcnBzCSV4bW0xLCV4bW0wCisJLmJ5dGUJMHhmMywweGMzCisKKy5hbGlnbgkxNgorLkxrZXlfZXhwYW5zaW9uXzE5MmE6CisJbW92dXBzCSV4bW0wLCglcmF4KQorCWxlYXEJMTYoJXJheCksJXJheAorLkxrZXlfZXhwYW5zaW9uXzE5MmFfY29sZDoKKwltb3ZhcHMJJXhtbTIsJXhtbTUKKy5Ma2V5X2V4cGFuc2lvbl8xOTJiX3dhcm06CisJc2h1ZnBzCSQxNiwleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMiwleG1tMworCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQxNDAsJXhtbTAsJXhtbTQKKwlwc2xsZHEJJDQsJXhtbTMKKwl4b3JwcwkleG1tNCwleG1tMAorCXBzaHVmZAkkODUsJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMSwleG1tMAorCXBzaHVmZAkkMjU1LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMywleG1tMgorCS5ieXRlCTB4ZjMsMHhjMworCisuYWxpZ24JMTYKKy5Ma2V5X2V4cGFuc2lvbl8xOTJiOgorCW1vdmFwcwkleG1tMCwleG1tMworCXNodWZwcwkkNjgsJXhtbTAsJXhtbTUKKwltb3Z1cHMJJXhtbTUsKCVyYXgpCisJc2h1ZnBzCSQ3OCwleG1tMiwleG1tMworCW1vdnVwcwkleG1tMywxNiglcmF4KQorCWxlYXEJMzIoJXJheCksJXJheAorCWptcAkuTGtleV9leHBhbnNpb25fMTkyYl93YXJtCisKKy5hbGlnbgkxNgorLkxrZXlfZXhwYW5zaW9uXzI1NmE6CisJbW92dXBzCSV4bW0yLCglcmF4KQorCWxlYXEJMTYoJXJheCksJXJheAorLkxrZXlfZXhwYW5zaW9uXzI1NmFfY29sZDoKKwlzaHVmcHMJJDE2LCV4bW0wLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTAKKwlzaHVmcHMJJDE0MCwleG1tMCwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQyNTUsJXhtbTEsJXhtbTEKKwl4b3JwcwkleG1tMSwleG1tMAorCS5ieXRlCTB4ZjMsMHhjMworCisuYWxpZ24JMTYKKy5Ma2V5X2V4cGFuc2lvbl8yNTZiOgorCW1vdnVwcwkleG1tMCwoJXJheCkKKwlsZWFxCTE2KCVyYXgpLCVyYXgKKworCXNodWZwcwkkMTYsJXhtbTIsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMgorCXNodWZwcwkkMTQwLCV4bW0yLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTIKKwlzaHVmcHMJJDE3MCwleG1tMSwleG1tMQorCXhvcnBzCSV4bW0xLCV4bW0yCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlhZXNfaHdfc2V0X2VuY3J5cHRfa2V5LC4tYWVzX2h3X3NldF9lbmNyeXB0X2tleQorLnNpemUJX19hZXNuaV9zZXRfZW5jcnlwdF9rZXksLi1fX2Flc25pX3NldF9lbmNyeXB0X2tleQorLmFsaWduCTY0CisuTGJzd2FwX21hc2s6CisuYnl0ZQkxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSwwCisuTGluY3JlbWVudDMyOgorLmxvbmcJNiw2LDYsMAorLkxpbmNyZW1lbnQ2NDoKKy5sb25nCTEsMCwwLDAKKy5MeHRzX21hZ2ljOgorLmxvbmcJMHg4NywwLDEsMAorLkxpbmNyZW1lbnQxOgorLmJ5dGUJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMQorLkxrZXlfcm90YXRlOgorLmxvbmcJMHgwYzBmMGUwZCwweDBjMGYwZTBkLDB4MGMwZjBlMGQsMHgwYzBmMGUwZAorLkxrZXlfcm90YXRlMTkyOgorLmxvbmcJMHgwNDA3MDYwNSwweDA0MDcwNjA1LDB4MDQwNzA2MDUsMHgwNDA3MDYwNQorLkxrZXlfcmNvbjE6CisubG9uZwkxLDEsMSwxCisuTGtleV9yY29uMWI6CisubG9uZwkweDFiLDB4MWIsMHgxYiwweDFiCisKKy5ieXRlCTY1LDY5LDgzLDMyLDEwMiwxMTEsMTE0LDMyLDczLDExMCwxMTYsMTAxLDEwOCwzMiw2NSw2OSw4Myw0NSw3OCw3Myw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JNjQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYnNhZXMteDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9ic2Flcy14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjVjOGNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYnNhZXMteDg2XzY0LlMKQEAgLTAsMCArMSwyNTk4IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisuZXh0ZXJuCWFlc19ub2h3X2VuY3J5cHQKKy5oaWRkZW4gYWVzX25vaHdfZW5jcnlwdAorLmV4dGVybglhZXNfbm9od19kZWNyeXB0CisuaGlkZGVuIGFlc19ub2h3X2RlY3J5cHQKKworLnR5cGUJX2JzYWVzX2VuY3J5cHQ4LEBmdW5jdGlvbgorLmFsaWduCTY0CitfYnNhZXNfZW5jcnlwdDg6CisJbGVhcQkuTEJTMCglcmlwKSwlcjExCisKKwltb3ZkcWEJKCVyYXgpLCV4bW04CisJbGVhcQkxNiglcmF4KSwlcmF4CisJbW92ZHFhCTgwKCVyMTEpLCV4bW03CisJcHhvcgkleG1tOCwleG1tMTUKKwlweG9yCSV4bW04LCV4bW0wCisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTgsJXhtbTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwwLDI1NQorLmJ5dGUJMTAyLDE1LDU2LDAsMTk5CisJcHhvcgkleG1tOCwleG1tMworCXB4b3IJJXhtbTgsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNworLmJ5dGUJMTAyLDE1LDU2LDAsMjE1CisJcHhvcgkleG1tOCwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworLmJ5dGUJMTAyLDE1LDU2LDAsMjMxCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzkKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NworX2JzYWVzX2VuY3J5cHQ4X2JpdHNsaWNlOgorCW1vdmRxYQkwKCVyMTEpLCV4bW03CisJbW92ZHFhCTE2KCVyMTEpLCV4bW04CisJbW92ZHFhCSV4bW01LCV4bW05CisJcHNybHEJJDEsJXhtbTUKKwltb3ZkcWEJJXhtbTMsJXhtbTEwCisJcHNybHEJJDEsJXhtbTMKKwlweG9yCSV4bW02LCV4bW01CisJcHhvcgkleG1tNCwleG1tMworCXBhbmQJJXhtbTcsJXhtbTUKKwlwYW5kCSV4bW03LCV4bW0zCisJcHhvcgkleG1tNSwleG1tNgorCXBzbGxxCSQxLCV4bW01CisJcHhvcgkleG1tMywleG1tNAorCXBzbGxxCSQxLCV4bW0zCisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTEwLCV4bW0zCisJbW92ZHFhCSV4bW0xLCV4bW05CisJcHNybHEJJDEsJXhtbTEKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQxLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW0xNQorCXBhbmQJJXhtbTcsJXhtbTEKKwlwYW5kCSV4bW03LCV4bW0xNQorCXB4b3IJJXhtbTEsJXhtbTIKKwlwc2xscQkkMSwleG1tMQorCXB4b3IJJXhtbTE1LCV4bW0wCisJcHNsbHEJJDEsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tMQorCXB4b3IJJXhtbTEwLCV4bW0xNQorCW1vdmRxYQkzMiglcjExKSwleG1tNworCW1vdmRxYQkleG1tNCwleG1tOQorCXBzcmxxCSQyLCV4bW00CisJbW92ZHFhCSV4bW0zLCV4bW0xMAorCXBzcmxxCSQyLCV4bW0zCisJcHhvcgkleG1tNiwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTMKKwlwYW5kCSV4bW04LCV4bW00CisJcGFuZAkleG1tOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTYKKwlwc2xscQkkMiwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTUKKwlwc2xscQkkMiwleG1tMworCXB4b3IJJXhtbTksJXhtbTQKKwlweG9yCSV4bW0xMCwleG1tMworCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQyLCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkMiwleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0wCisJcGFuZAkleG1tOCwleG1tMTUKKwlweG9yCSV4bW0wLCV4bW0yCisJcHNsbHEJJDIsJXhtbTAKKwlweG9yCSV4bW0xNSwleG1tMQorCXBzbGxxCSQyLCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW0xMCwleG1tMTUKKwltb3ZkcWEJJXhtbTIsJXhtbTkKKwlwc3JscQkkNCwleG1tMgorCW1vdmRxYQkleG1tMSwleG1tMTAKKwlwc3JscQkkNCwleG1tMQorCXB4b3IJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW01LCV4bW0xCisJcGFuZAkleG1tNywleG1tMgorCXBhbmQJJXhtbTcsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW02CisJcHNsbHEJJDQsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW01CisJcHNsbHEJJDQsJXhtbTEKKwlweG9yCSV4bW05LCV4bW0yCisJcHhvcgkleG1tMTAsJXhtbTEKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwlwc3JscQkkNCwleG1tMAorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDQsJXhtbTE1CisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcGFuZAkleG1tNywleG1tMAorCXBhbmQJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tNAorCXBzbGxxCSQ0LCV4bW0wCisJcHhvcgkleG1tMTUsJXhtbTMKKwlwc2xscQkkNCwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0wCisJcHhvcgkleG1tMTAsJXhtbTE1CisJZGVjbAklcjEwZAorCWptcAkuTGVuY19zYm94CisuYWxpZ24JMTYKKy5MZW5jX2xvb3A6CisJcHhvcgkwKCVyYXgpLCV4bW0xNQorCXB4b3IJMTYoJXJheCksJXhtbTAKKwlweG9yCTMyKCVyYXgpLCV4bW0xCisJcHhvcgk0OCglcmF4KSwleG1tMgorLmJ5dGUJMTAyLDY4LDE1LDU2LDAsMjU1CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCTY0KCVyYXgpLCV4bW0zCisJcHhvcgk4MCglcmF4KSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKwlweG9yCTk2KCVyYXgpLCV4bW01CisJcHhvcgkxMTIoJXJheCksJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworLmJ5dGUJMTAyLDE1LDU2LDAsMjMxCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzkKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NworCWxlYXEJMTI4KCVyYXgpLCVyYXgKKy5MZW5jX3Nib3g6CisJcHhvcgkleG1tNSwleG1tNAorCXB4b3IJJXhtbTAsJXhtbTEKKwlweG9yCSV4bW0xNSwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTUKKwlweG9yCSV4bW0xNSwleG1tNAorCisJcHhvcgkleG1tMiwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW00LCV4bW02CisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTQsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0yCisKKwlweG9yCSV4bW02LCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tMTAKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwltb3ZkcWEJJXhtbTEsJXhtbTEyCisJbW92ZHFhCSV4bW01LCV4bW0xMQorCisJcHhvcgkleG1tMywleG1tMTAKKwlweG9yCSV4bW0xLCV4bW05CisJcHhvcgkleG1tMiwleG1tOAorCW1vdmRxYQkleG1tMTAsJXhtbTEzCisJcHhvcgkleG1tMywleG1tMTIKKwltb3ZkcWEJJXhtbTksJXhtbTcKKwlweG9yCSV4bW0xNSwleG1tMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0xNAorCisJcG9yCSV4bW04LCV4bW05CisJcG9yCSV4bW0xMSwleG1tMTAKKwlweG9yCSV4bW03LCV4bW0xNAorCXBhbmQJJXhtbTExLCV4bW0xMworCXB4b3IJJXhtbTgsJXhtbTExCisJcGFuZAkleG1tOCwleG1tNworCXBhbmQJJXhtbTExLCV4bW0xNAorCW1vdmRxYQkleG1tMiwleG1tMTEKKwlweG9yCSV4bW0xNSwleG1tMTEKKwlwYW5kCSV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0xMiwleG1tMTAKKwlweG9yCSV4bW0xMiwleG1tOQorCW1vdmRxYQkleG1tNiwleG1tMTIKKwltb3ZkcWEJJXhtbTQsJXhtbTExCisJcHhvcgkleG1tMCwleG1tMTIKKwlweG9yCSV4bW01LCV4bW0xMQorCW1vdmRxYQkleG1tMTIsJXhtbTgKKwlwYW5kCSV4bW0xMSwleG1tMTIKKwlwb3IJJXhtbTExLCV4bW04CisJcHhvcgkleG1tMTIsJXhtbTcKKwlweG9yCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTE0LCV4bW04CisJbW92ZHFhCSV4bW0xLCV4bW0xMQorCXB4b3IJJXhtbTEzLCV4bW03CisJbW92ZHFhCSV4bW0zLCV4bW0xMgorCXB4b3IJJXhtbTEzLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xMworCXBhbmQJJXhtbTIsJXhtbTExCisJbW92ZHFhCSV4bW02LCV4bW0xNAorCXBhbmQJJXhtbTE1LCV4bW0xMgorCXBhbmQJJXhtbTQsJXhtbTEzCisJcG9yCSV4bW01LCV4bW0xNAorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTEyLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTgKKwlweG9yCSV4bW0xNCwleG1tNworCisKKworCisKKwltb3ZkcWEJJXhtbTEwLCV4bW0xMQorCXBhbmQJJXhtbTgsJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMTEKKworCW1vdmRxYQkleG1tNywleG1tMTMKKwltb3ZkcWEJJXhtbTExLCV4bW0xNAorCXB4b3IJJXhtbTEwLCV4bW0xMworCXBhbmQJJXhtbTEzLCV4bW0xNAorCisJbW92ZHFhCSV4bW04LCV4bW0xMgorCXB4b3IJJXhtbTksJXhtbTE0CisJcHhvcgkleG1tNywleG1tMTIKKworCXB4b3IJJXhtbTksJXhtbTEwCisKKwlwYW5kCSV4bW0xMCwleG1tMTIKKworCW1vdmRxYQkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW03LCV4bW0xMgorCisJcHhvcgkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMiwleG1tOAorCisJcGFuZAkleG1tNywleG1tOQorCisJcHhvcgkleG1tOSwleG1tMTMKKwlweG9yCSV4bW05LCV4bW04CisKKwlwYW5kCSV4bW0xNCwleG1tMTMKKworCXB4b3IJJXhtbTExLCV4bW0xMworCW1vdmRxYQkleG1tNSwleG1tMTEKKwltb3ZkcWEJJXhtbTQsJXhtbTcKKwltb3ZkcWEJJXhtbTE0LCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTkKKwlwYW5kCSV4bW01LCV4bW05CisJcHhvcgkleG1tNCwleG1tNQorCXBhbmQJJXhtbTE0LCV4bW00CisJcGFuZAkleG1tMTMsJXhtbTUKKwlweG9yCSV4bW00LCV4bW01CisJcHhvcgkleG1tOSwleG1tNAorCXB4b3IJJXhtbTE1LCV4bW0xMQorCXB4b3IJJXhtbTIsJXhtbTcKKwlweG9yCSV4bW0xMiwleG1tMTQKKwlweG9yCSV4bW04LCV4bW0xMworCW1vdmRxYQkleG1tMTQsJXhtbTEwCisJbW92ZHFhCSV4bW0xMiwleG1tOQorCXB4b3IJJXhtbTEzLCV4bW0xMAorCXB4b3IJJXhtbTgsJXhtbTkKKwlwYW5kCSV4bW0xMSwleG1tMTAKKwlwYW5kCSV4bW0xNSwleG1tOQorCXB4b3IJJXhtbTcsJXhtbTExCisJcHhvcgkleG1tMiwleG1tMTUKKwlwYW5kCSV4bW0xNCwleG1tNworCXBhbmQJJXhtbTEyLCV4bW0yCisJcGFuZAkleG1tMTMsJXhtbTExCisJcGFuZAkleG1tOCwleG1tMTUKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTIsJXhtbTE1CisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tOSwleG1tMgorCXB4b3IJJXhtbTExLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTE1CisJcHhvcgkleG1tNywleG1tNAorCXB4b3IJJXhtbTcsJXhtbTIKKworCW1vdmRxYQkleG1tNiwleG1tMTEKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwlweG9yCSV4bW0zLCV4bW0xMQorCXB4b3IJJXhtbTEsJXhtbTcKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMAorCW1vdmRxYQkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTAKKwlweG9yCSV4bW04LCV4bW05CisJcGFuZAkleG1tMTEsJXhtbTEwCisJcGFuZAkleG1tMywleG1tOQorCXB4b3IJJXhtbTcsJXhtbTExCisJcHhvcgkleG1tMSwleG1tMworCXBhbmQJJXhtbTE0LCV4bW03CisJcGFuZAkleG1tMTIsJXhtbTEKKwlwYW5kCSV4bW0xMywleG1tMTEKKwlwYW5kCSV4bW04LCV4bW0zCisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0xLCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tOSwleG1tMQorCXB4b3IJJXhtbTEyLCV4bW0xNAorCXB4b3IJJXhtbTgsJXhtbTEzCisJbW92ZHFhCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMywleG1tMTAKKwlwYW5kCSV4bW02LCV4bW0xMAorCXB4b3IJJXhtbTAsJXhtbTYKKwlwYW5kCSV4bW0xNCwleG1tMAorCXBhbmQJJXhtbTEzLCV4bW02CisJcHhvcgkleG1tMCwleG1tNgorCXB4b3IJJXhtbTEwLCV4bW0wCisJcHhvcgkleG1tMTEsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTcsJXhtbTAKKwlweG9yCSV4bW03LCV4bW0xCisJcHhvcgkleG1tMTUsJXhtbTYKKwlweG9yCSV4bW01LCV4bW0wCisJcHhvcgkleG1tNiwleG1tMworCXB4b3IJJXhtbTE1LCV4bW01CisJcHhvcgkleG1tMCwleG1tMTUKKworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW00CisJcHhvcgkleG1tMiwleG1tMQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW00LCV4bW0zCisKKwlweG9yCSV4bW0yLCV4bW01CisJZGVjbAklcjEwZAorCWpsCS5MZW5jX2RvbmUKKwlwc2h1ZmQJJDB4OTMsJXhtbTE1LCV4bW03CisJcHNodWZkCSQweDkzLCV4bW0wLCV4bW04CisJcHhvcgkleG1tNywleG1tMTUKKwlwc2h1ZmQJJDB4OTMsJXhtbTMsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0wCisJcHNodWZkCSQweDkzLCV4bW01LCV4bW0xMAorCXB4b3IJJXhtbTksJXhtbTMKKwlwc2h1ZmQJJDB4OTMsJXhtbTIsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTUKKwlwc2h1ZmQJJDB4OTMsJXhtbTYsJXhtbTEyCisJcHhvcgkleG1tMTEsJXhtbTIKKwlwc2h1ZmQJJDB4OTMsJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMTIsJXhtbTYKKwlwc2h1ZmQJJDB4OTMsJXhtbTQsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTEKKwlweG9yCSV4bW0xNCwleG1tNAorCisJcHhvcgkleG1tMTUsJXhtbTgKKwlweG9yCSV4bW00LCV4bW03CisJcHhvcgkleG1tNCwleG1tOAorCXBzaHVmZAkkMHg0RSwleG1tMTUsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tOQorCXBzaHVmZAkkMHg0RSwleG1tMCwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEyCisJcHhvcgkleG1tNywleG1tMTUKKwlweG9yCSV4bW02LCV4bW0xMworCXB4b3IJJXhtbTgsJXhtbTAKKwlweG9yCSV4bW01LCV4bW0xMQorCXBzaHVmZAkkMHg0RSwleG1tMiwleG1tNworCXB4b3IJJXhtbTEsJXhtbTE0CisJcHNodWZkCSQweDRFLCV4bW02LCV4bW04CisJcHhvcgkleG1tMywleG1tMTAKKwlwc2h1ZmQJJDB4NEUsJXhtbTUsJXhtbTIKKwlweG9yCSV4bW00LCV4bW0xMAorCXBzaHVmZAkkMHg0RSwleG1tNCwleG1tNgorCXB4b3IJJXhtbTQsJXhtbTExCisJcHNodWZkCSQweDRFLCV4bW0xLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTcKKwlwc2h1ZmQJJDB4NEUsJXhtbTMsJXhtbTEKKwlweG9yCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTEwLCV4bW0yCisJcHhvcgkleG1tMTQsJXhtbTYKKwlweG9yCSV4bW0xMywleG1tNQorCW1vdmRxYQkleG1tNywleG1tMworCXB4b3IJJXhtbTksJXhtbTEKKwltb3ZkcWEJJXhtbTgsJXhtbTQKKwltb3ZkcWEJNDgoJXIxMSksJXhtbTcKKwlqbnoJLkxlbmNfbG9vcAorCW1vdmRxYQk2NCglcjExKSwleG1tNworCWptcAkuTGVuY19sb29wCisuYWxpZ24JMTYKKy5MZW5jX2RvbmU6CisJbW92ZHFhCTAoJXIxMSksJXhtbTcKKwltb3ZkcWEJMTYoJXIxMSksJXhtbTgKKwltb3ZkcWEJJXhtbTEsJXhtbTkKKwlwc3JscQkkMSwleG1tMQorCW1vdmRxYQkleG1tMiwleG1tMTAKKwlwc3JscQkkMSwleG1tMgorCXB4b3IJJXhtbTQsJXhtbTEKKwlweG9yCSV4bW02LCV4bW0yCisJcGFuZAkleG1tNywleG1tMQorCXBhbmQJJXhtbTcsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW00CisJcHNsbHEJJDEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW02CisJcHNsbHEJJDEsJXhtbTIKKwlweG9yCSV4bW05LCV4bW0xCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZkcWEJJXhtbTMsJXhtbTkKKwlwc3JscQkkMSwleG1tMworCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDEsJXhtbTE1CisJcHhvcgkleG1tNSwleG1tMworCXB4b3IJJXhtbTAsJXhtbTE1CisJcGFuZAkleG1tNywleG1tMworCXBhbmQJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tMywleG1tNQorCXBzbGxxCSQxLCV4bW0zCisJcHhvcgkleG1tMTUsJXhtbTAKKwlwc2xscQkkMSwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTE1CisJbW92ZHFhCTMyKCVyMTEpLCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW05CisJcHNybHEJJDIsJXhtbTYKKwltb3ZkcWEJJXhtbTIsJXhtbTEwCisJcHNybHEJJDIsJXhtbTIKKwlweG9yCSV4bW00LCV4bW02CisJcHhvcgkleG1tMSwleG1tMgorCXBhbmQJJXhtbTgsJXhtbTYKKwlwYW5kCSV4bW04LCV4bW0yCisJcHhvcgkleG1tNiwleG1tNAorCXBzbGxxCSQyLCV4bW02CisJcHhvcgkleG1tMiwleG1tMQorCXBzbGxxCSQyLCV4bW0yCisJcHhvcgkleG1tOSwleG1tNgorCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0wLCV4bW05CisJcHNybHEJJDIsJXhtbTAKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQyLCV4bW0xNQorCXB4b3IJJXhtbTUsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTAKKwlwYW5kCSV4bW04LCV4bW0xNQorCXB4b3IJJXhtbTAsJXhtbTUKKwlwc2xscQkkMiwleG1tMAorCXB4b3IJJXhtbTE1LCV4bW0zCisJcHNsbHEJJDIsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tMAorCXB4b3IJJXhtbTEwLCV4bW0xNQorCW1vdmRxYQkleG1tNSwleG1tOQorCXBzcmxxCSQ0LCV4bW01CisJbW92ZHFhCSV4bW0zLCV4bW0xMAorCXBzcmxxCSQ0LCV4bW0zCisJcHhvcgkleG1tNCwleG1tNQorCXB4b3IJJXhtbTEsJXhtbTMKKwlwYW5kCSV4bW03LCV4bW01CisJcGFuZAkleG1tNywleG1tMworCXB4b3IJJXhtbTUsJXhtbTQKKwlwc2xscQkkNCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTEKKwlwc2xscQkkNCwleG1tMworCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW0xMCwleG1tMworCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQ0LCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkNCwleG1tMTUKKwlweG9yCSV4bW02LCV4bW0wCisJcHhvcgkleG1tMiwleG1tMTUKKwlwYW5kCSV4bW03LCV4bW0wCisJcGFuZAkleG1tNywleG1tMTUKKwlweG9yCSV4bW0wLCV4bW02CisJcHNsbHEJJDQsJXhtbTAKKwlweG9yCSV4bW0xNSwleG1tMgorCXBzbGxxCSQ0LCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW0xMCwleG1tMTUKKwltb3ZkcWEJKCVyYXgpLCV4bW03CisJcHhvcgkleG1tNywleG1tMworCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW03LCV4bW0yCisJcHhvcgkleG1tNywleG1tNgorCXB4b3IJJXhtbTcsJXhtbTEKKwlweG9yCSV4bW03LCV4bW00CisJcHhvcgkleG1tNywleG1tMTUKKwlweG9yCSV4bW03LCV4bW0wCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfYnNhZXNfZW5jcnlwdDgsLi1fYnNhZXNfZW5jcnlwdDgKKworLnR5cGUJX2JzYWVzX2RlY3J5cHQ4LEBmdW5jdGlvbgorLmFsaWduCTY0CitfYnNhZXNfZGVjcnlwdDg6CisJbGVhcQkuTEJTMCglcmlwKSwlcjExCisKKwltb3ZkcWEJKCVyYXgpLCV4bW04CisJbGVhcQkxNiglcmF4KSwlcmF4CisJbW92ZHFhCS00OCglcjExKSwleG1tNworCXB4b3IJJXhtbTgsJXhtbTE1CisJcHhvcgkleG1tOCwleG1tMAorCXB4b3IJJXhtbTgsJXhtbTEKKwlweG9yCSV4bW04LCV4bW0yCisuYnl0ZQkxMDIsNjgsMTUsNTYsMCwyNTUKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OQorCXB4b3IJJXhtbTgsJXhtbTMKKwlweG9yCSV4bW04LCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDcKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorCXB4b3IJJXhtbTgsJXhtbTUKKwlweG9yCSV4bW04LCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKy5ieXRlCTEwMiwxNSw1NiwwLDIzMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjM5CisuYnl0ZQkxMDIsMTUsNTYsMCwyNDcKKwltb3ZkcWEJMCglcjExKSwleG1tNworCW1vdmRxYQkxNiglcjExKSwleG1tOAorCW1vdmRxYQkleG1tNSwleG1tOQorCXBzcmxxCSQxLCV4bW01CisJbW92ZHFhCSV4bW0zLCV4bW0xMAorCXBzcmxxCSQxLCV4bW0zCisJcHhvcgkleG1tNiwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTMKKwlwYW5kCSV4bW03LCV4bW01CisJcGFuZAkleG1tNywleG1tMworCXB4b3IJJXhtbTUsJXhtbTYKKwlwc2xscQkkMSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTQKKwlwc2xscQkkMSwleG1tMworCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW0xMCwleG1tMworCW1vdmRxYQkleG1tMSwleG1tOQorCXBzcmxxCSQxLCV4bW0xCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkMSwleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xCisJcHhvcgkleG1tMCwleG1tMTUKKwlwYW5kCSV4bW03LCV4bW0xCisJcGFuZAkleG1tNywleG1tMTUKKwlweG9yCSV4bW0xLCV4bW0yCisJcHNsbHEJJDEsJXhtbTEKKwlweG9yCSV4bW0xNSwleG1tMAorCXBzbGxxCSQxLCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTEKKwlweG9yCSV4bW0xMCwleG1tMTUKKwltb3ZkcWEJMzIoJXIxMSksJXhtbTcKKwltb3ZkcWEJJXhtbTQsJXhtbTkKKwlwc3JscQkkMiwleG1tNAorCW1vdmRxYQkleG1tMywleG1tMTAKKwlwc3JscQkkMiwleG1tMworCXB4b3IJJXhtbTYsJXhtbTQKKwlweG9yCSV4bW01LCV4bW0zCisJcGFuZAkleG1tOCwleG1tNAorCXBhbmQJJXhtbTgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW02CisJcHNsbHEJJDIsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW01CisJcHNsbHEJJDIsJXhtbTMKKwlweG9yCSV4bW05LCV4bW00CisJcHhvcgkleG1tMTAsJXhtbTMKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwlwc3JscQkkMiwleG1tMAorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDIsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMAorCXBhbmQJJXhtbTgsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tMgorCXBzbGxxCSQyLCV4bW0wCisJcHhvcgkleG1tMTUsJXhtbTEKKwlwc2xscQkkMiwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0wCisJcHhvcgkleG1tMTAsJXhtbTE1CisJbW92ZHFhCSV4bW0yLCV4bW05CisJcHNybHEJJDQsJXhtbTIKKwltb3ZkcWEJJXhtbTEsJXhtbTEwCisJcHNybHEJJDQsJXhtbTEKKwlweG9yCSV4bW02LCV4bW0yCisJcHhvcgkleG1tNSwleG1tMQorCXBhbmQJJXhtbTcsJXhtbTIKKwlwYW5kCSV4bW03LCV4bW0xCisJcHhvcgkleG1tMiwleG1tNgorCXBzbGxxCSQ0LCV4bW0yCisJcHhvcgkleG1tMSwleG1tNQorCXBzbGxxCSQ0LCV4bW0xCisJcHhvcgkleG1tOSwleG1tMgorCXB4b3IJJXhtbTEwLCV4bW0xCisJbW92ZHFhCSV4bW0wLCV4bW05CisJcHNybHEJJDQsJXhtbTAKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQ0LCV4bW0xNQorCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXBhbmQJJXhtbTcsJXhtbTAKKwlwYW5kCSV4bW03LCV4bW0xNQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc2xscQkkNCwleG1tMAorCXB4b3IJJXhtbTE1LCV4bW0zCisJcHNsbHEJJDQsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tMAorCXB4b3IJJXhtbTEwLCV4bW0xNQorCWRlY2wJJXIxMGQKKwlqbXAJLkxkZWNfc2JveAorLmFsaWduCTE2CisuTGRlY19sb29wOgorCXB4b3IJMCglcmF4KSwleG1tMTUKKwlweG9yCTE2KCVyYXgpLCV4bW0wCisJcHhvcgkzMiglcmF4KSwleG1tMQorCXB4b3IJNDgoJXJheCksJXhtbTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwwLDI1NQorLmJ5dGUJMTAyLDE1LDU2LDAsMTk5CisJcHhvcgk2NCglcmF4KSwleG1tMworCXB4b3IJODAoJXJheCksJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNworLmJ5dGUJMTAyLDE1LDU2LDAsMjE1CisJcHhvcgk5NiglcmF4KSwleG1tNQorCXB4b3IJMTEyKCVyYXgpLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKy5ieXRlCTEwMiwxNSw1NiwwLDIzMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjM5CisuYnl0ZQkxMDIsMTUsNTYsMCwyNDcKKwlsZWFxCTEyOCglcmF4KSwlcmF4CisuTGRlY19zYm94OgorCXB4b3IJJXhtbTMsJXhtbTIKKworCXB4b3IJJXhtbTYsJXhtbTMKKwlweG9yCSV4bW02LCV4bW0xCisJcHhvcgkleG1tMywleG1tNQorCXB4b3IJJXhtbTUsJXhtbTYKKwlweG9yCSV4bW02LCV4bW0wCisKKwlweG9yCSV4bW0wLCV4bW0xNQorCXB4b3IJJXhtbTQsJXhtbTEKKwlweG9yCSV4bW0xNSwleG1tMgorCXB4b3IJJXhtbTE1LCV4bW00CisJcHhvcgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tMiwleG1tMTAKKwltb3ZkcWEJJXhtbTYsJXhtbTkKKwltb3ZkcWEJJXhtbTAsJXhtbTgKKwltb3ZkcWEJJXhtbTMsJXhtbTEyCisJbW92ZHFhCSV4bW00LCV4bW0xMQorCisJcHhvcgkleG1tMTUsJXhtbTEwCisJcHhvcgkleG1tMywleG1tOQorCXB4b3IJJXhtbTUsJXhtbTgKKwltb3ZkcWEJJXhtbTEwLCV4bW0xMworCXB4b3IJJXhtbTE1LCV4bW0xMgorCW1vdmRxYQkleG1tOSwleG1tNworCXB4b3IJJXhtbTEsJXhtbTExCisJbW92ZHFhCSV4bW0xMCwleG1tMTQKKworCXBvcgkleG1tOCwleG1tOQorCXBvcgkleG1tMTEsJXhtbTEwCisJcHhvcgkleG1tNywleG1tMTQKKwlwYW5kCSV4bW0xMSwleG1tMTMKKwlweG9yCSV4bW04LCV4bW0xMQorCXBhbmQJJXhtbTgsJXhtbTcKKwlwYW5kCSV4bW0xMSwleG1tMTQKKwltb3ZkcWEJJXhtbTUsJXhtbTExCisJcHhvcgkleG1tMSwleG1tMTEKKwlwYW5kCSV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0xMiwleG1tMTAKKwlweG9yCSV4bW0xMiwleG1tOQorCW1vdmRxYQkleG1tMiwleG1tMTIKKwltb3ZkcWEJJXhtbTAsJXhtbTExCisJcHhvcgkleG1tNiwleG1tMTIKKwlweG9yCSV4bW00LCV4bW0xMQorCW1vdmRxYQkleG1tMTIsJXhtbTgKKwlwYW5kCSV4bW0xMSwleG1tMTIKKwlwb3IJJXhtbTExLCV4bW04CisJcHhvcgkleG1tMTIsJXhtbTcKKwlweG9yCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTE0LCV4bW04CisJbW92ZHFhCSV4bW0zLCV4bW0xMQorCXB4b3IJJXhtbTEzLCV4bW03CisJbW92ZHFhCSV4bW0xNSwleG1tMTIKKwlweG9yCSV4bW0xMywleG1tOAorCW1vdmRxYQkleG1tNiwleG1tMTMKKwlwYW5kCSV4bW01LCV4bW0xMQorCW1vdmRxYQkleG1tMiwleG1tMTQKKwlwYW5kCSV4bW0xLCV4bW0xMgorCXBhbmQJJXhtbTAsJXhtbTEzCisJcG9yCSV4bW00LCV4bW0xNAorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTEyLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTgKKwlweG9yCSV4bW0xNCwleG1tNworCisKKworCisKKwltb3ZkcWEJJXhtbTEwLCV4bW0xMQorCXBhbmQJJXhtbTgsJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMTEKKworCW1vdmRxYQkleG1tNywleG1tMTMKKwltb3ZkcWEJJXhtbTExLCV4bW0xNAorCXB4b3IJJXhtbTEwLCV4bW0xMworCXBhbmQJJXhtbTEzLCV4bW0xNAorCisJbW92ZHFhCSV4bW04LCV4bW0xMgorCXB4b3IJJXhtbTksJXhtbTE0CisJcHhvcgkleG1tNywleG1tMTIKKworCXB4b3IJJXhtbTksJXhtbTEwCisKKwlwYW5kCSV4bW0xMCwleG1tMTIKKworCW1vdmRxYQkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW03LCV4bW0xMgorCisJcHhvcgkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMiwleG1tOAorCisJcGFuZAkleG1tNywleG1tOQorCisJcHhvcgkleG1tOSwleG1tMTMKKwlweG9yCSV4bW05LCV4bW04CisKKwlwYW5kCSV4bW0xNCwleG1tMTMKKworCXB4b3IJJXhtbTExLCV4bW0xMworCW1vdmRxYQkleG1tNCwleG1tMTEKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwltb3ZkcWEJJXhtbTE0LCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTkKKwlwYW5kCSV4bW00LCV4bW05CisJcHhvcgkleG1tMCwleG1tNAorCXBhbmQJJXhtbTE0LCV4bW0wCisJcGFuZAkleG1tMTMsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW00CisJcHhvcgkleG1tOSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTExCisJcHhvcgkleG1tNSwleG1tNworCXB4b3IJJXhtbTEyLCV4bW0xNAorCXB4b3IJJXhtbTgsJXhtbTEzCisJbW92ZHFhCSV4bW0xNCwleG1tMTAKKwltb3ZkcWEJJXhtbTEyLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTEwCisJcHhvcgkleG1tOCwleG1tOQorCXBhbmQJJXhtbTExLCV4bW0xMAorCXBhbmQJJXhtbTEsJXhtbTkKKwlweG9yCSV4bW03LCV4bW0xMQorCXB4b3IJJXhtbTUsJXhtbTEKKwlwYW5kCSV4bW0xNCwleG1tNworCXBhbmQJJXhtbTEyLCV4bW01CisJcGFuZAkleG1tMTMsJXhtbTExCisJcGFuZAkleG1tOCwleG1tMQorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEwLCV4bW0xMQorCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW0xMSwleG1tNAorCXB4b3IJJXhtbTExLCV4bW0xCisJcHhvcgkleG1tNywleG1tMAorCXB4b3IJJXhtbTcsJXhtbTUKKworCW1vdmRxYQkleG1tMiwleG1tMTEKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwlweG9yCSV4bW0xNSwleG1tMTEKKwlweG9yCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW0xNCwleG1tMTAKKwltb3ZkcWEJJXhtbTEyLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTEwCisJcHhvcgkleG1tOCwleG1tOQorCXBhbmQJJXhtbTExLCV4bW0xMAorCXBhbmQJJXhtbTE1LCV4bW05CisJcHhvcgkleG1tNywleG1tMTEKKwlweG9yCSV4bW0zLCV4bW0xNQorCXBhbmQJJXhtbTE0LCV4bW03CisJcGFuZAkleG1tMTIsJXhtbTMKKwlwYW5kCSV4bW0xMywleG1tMTEKKwlwYW5kCSV4bW04LCV4bW0xNQorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0xMCwleG1tMTEKKwlweG9yCSV4bW05LCV4bW0zCisJcHhvcgkleG1tMTIsJXhtbTE0CisJcHhvcgkleG1tOCwleG1tMTMKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEzLCV4bW0xMAorCXBhbmQJJXhtbTIsJXhtbTEwCisJcHhvcgkleG1tNiwleG1tMgorCXBhbmQJJXhtbTE0LCV4bW02CisJcGFuZAkleG1tMTMsJXhtbTIKKwlweG9yCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tMgorCXB4b3IJJXhtbTExLCV4bW0xNQorCXB4b3IJJXhtbTcsJXhtbTYKKwlweG9yCSV4bW03LCV4bW0zCisJcHhvcgkleG1tNiwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTUKKworCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW02LCV4bW0xCisJcHhvcgkleG1tNiwleG1tNAorCXB4b3IJJXhtbTEsJXhtbTMKKwlweG9yCSV4bW0xNSwleG1tNgorCXB4b3IJJXhtbTQsJXhtbTMKKwlweG9yCSV4bW01LCV4bW0yCisJcHhvcgkleG1tMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTIKKworCXB4b3IJJXhtbTE1LCV4bW0zCisJcHhvcgkleG1tMiwleG1tNgorCWRlY2wJJXIxMGQKKwlqbAkuTGRlY19kb25lCisKKwlwc2h1ZmQJJDB4NEUsJXhtbTE1LCV4bW03CisJcHNodWZkCSQweDRFLCV4bW0yLCV4bW0xMworCXB4b3IJJXhtbTE1LCV4bW03CisJcHNodWZkCSQweDRFLCV4bW00LCV4bW0xNAorCXB4b3IJJXhtbTIsJXhtbTEzCisJcHNodWZkCSQweDRFLCV4bW0wLCV4bW04CisJcHhvcgkleG1tNCwleG1tMTQKKwlwc2h1ZmQJJDB4NEUsJXhtbTUsJXhtbTkKKwlweG9yCSV4bW0wLCV4bW04CisJcHNodWZkCSQweDRFLCV4bW0zLCV4bW0xMAorCXB4b3IJJXhtbTUsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTUKKwlweG9yCSV4bW0xMywleG1tMAorCXBzaHVmZAkkMHg0RSwleG1tMSwleG1tMTEKKwlweG9yCSV4bW0zLCV4bW0xMAorCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW04LCV4bW0zCisJcHNodWZkCSQweDRFLCV4bW02LCV4bW0xMgorCXB4b3IJJXhtbTEsJXhtbTExCisJcHhvcgkleG1tMTQsJXhtbTAKKwlweG9yCSV4bW05LCV4bW0xCisJcHhvcgkleG1tNiwleG1tMTIKKworCXB4b3IJJXhtbTE0LCV4bW01CisJcHhvcgkleG1tMTMsJXhtbTMKKwlweG9yCSV4bW0xMywleG1tMQorCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tMTEsJXhtbTIKKwlweG9yCSV4bW0xNCwleG1tMQorCXB4b3IJJXhtbTE0LCV4bW02CisJcHhvcgkleG1tMTIsJXhtbTQKKwlwc2h1ZmQJJDB4OTMsJXhtbTE1LCV4bW03CisJcHNodWZkCSQweDkzLCV4bW0wLCV4bW04CisJcHhvcgkleG1tNywleG1tMTUKKwlwc2h1ZmQJJDB4OTMsJXhtbTUsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0wCisJcHNodWZkCSQweDkzLCV4bW0zLCV4bW0xMAorCXB4b3IJJXhtbTksJXhtbTUKKwlwc2h1ZmQJJDB4OTMsJXhtbTEsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTMKKwlwc2h1ZmQJJDB4OTMsJXhtbTYsJXhtbTEyCisJcHhvcgkleG1tMTEsJXhtbTEKKwlwc2h1ZmQJJDB4OTMsJXhtbTIsJXhtbTEzCisJcHhvcgkleG1tMTIsJXhtbTYKKwlwc2h1ZmQJJDB4OTMsJXhtbTQsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTIKKwlweG9yCSV4bW0xNCwleG1tNAorCisJcHhvcgkleG1tMTUsJXhtbTgKKwlweG9yCSV4bW00LCV4bW03CisJcHhvcgkleG1tNCwleG1tOAorCXBzaHVmZAkkMHg0RSwleG1tMTUsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tOQorCXBzaHVmZAkkMHg0RSwleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEyCisJcHhvcgkleG1tNywleG1tMTUKKwlweG9yCSV4bW02LCV4bW0xMworCXB4b3IJJXhtbTgsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xMQorCXBzaHVmZAkkMHg0RSwleG1tMSwleG1tNworCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZkCSQweDRFLCV4bW02LCV4bW04CisJcHhvcgkleG1tNSwleG1tMTAKKwlwc2h1ZmQJJDB4NEUsJXhtbTMsJXhtbTEKKwlweG9yCSV4bW00LCV4bW0xMAorCXBzaHVmZAkkMHg0RSwleG1tNCwleG1tNgorCXB4b3IJJXhtbTQsJXhtbTExCisJcHNodWZkCSQweDRFLCV4bW0yLCV4bW0zCisJcHhvcgkleG1tMTEsJXhtbTcKKwlwc2h1ZmQJJDB4NEUsJXhtbTUsJXhtbTIKKwlweG9yCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTEsJXhtbTEwCisJcHhvcgkleG1tMTQsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW0xMworCW1vdmRxYQkleG1tNywleG1tMworCXB4b3IJJXhtbTksJXhtbTIKKwltb3ZkcWEJJXhtbTEzLCV4bW01CisJbW92ZHFhCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW0xMCwleG1tMgorCW1vdmRxYQktMTYoJXIxMSksJXhtbTcKKwlqbnoJLkxkZWNfbG9vcAorCW1vdmRxYQktMzIoJXIxMSksJXhtbTcKKwlqbXAJLkxkZWNfbG9vcAorLmFsaWduCTE2CisuTGRlY19kb25lOgorCW1vdmRxYQkwKCVyMTEpLCV4bW03CisJbW92ZHFhCTE2KCVyMTEpLCV4bW04CisJbW92ZHFhCSV4bW0yLCV4bW05CisJcHNybHEJJDEsJXhtbTIKKwltb3ZkcWEJJXhtbTEsJXhtbTEwCisJcHNybHEJJDEsJXhtbTEKKwlweG9yCSV4bW00LCV4bW0yCisJcHhvcgkleG1tNiwleG1tMQorCXBhbmQJJXhtbTcsJXhtbTIKKwlwYW5kCSV4bW03LCV4bW0xCisJcHhvcgkleG1tMiwleG1tNAorCXBzbGxxCSQxLCV4bW0yCisJcHhvcgkleG1tMSwleG1tNgorCXBzbGxxCSQxLCV4bW0xCisJcHhvcgkleG1tOSwleG1tMgorCXB4b3IJJXhtbTEwLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW05CisJcHNybHEJJDEsJXhtbTUKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQxLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW0xNQorCXBhbmQJJXhtbTcsJXhtbTUKKwlwYW5kCSV4bW03LCV4bW0xNQorCXB4b3IJJXhtbTUsJXhtbTMKKwlwc2xscQkkMSwleG1tNQorCXB4b3IJJXhtbTE1LCV4bW0wCisJcHNsbHEJJDEsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTEwLCV4bW0xNQorCW1vdmRxYQkzMiglcjExKSwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOQorCXBzcmxxCSQyLCV4bW02CisJbW92ZHFhCSV4bW0xLCV4bW0xMAorCXBzcmxxCSQyLCV4bW0xCisJcHhvcgkleG1tNCwleG1tNgorCXB4b3IJJXhtbTIsJXhtbTEKKwlwYW5kCSV4bW04LCV4bW02CisJcGFuZAkleG1tOCwleG1tMQorCXB4b3IJJXhtbTYsJXhtbTQKKwlwc2xscQkkMiwleG1tNgorCXB4b3IJJXhtbTEsJXhtbTIKKwlwc2xscQkkMiwleG1tMQorCXB4b3IJJXhtbTksJXhtbTYKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQyLCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkMiwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0wCisJcHhvcgkleG1tNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0wCisJcGFuZAkleG1tOCwleG1tMTUKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbHEJJDIsJXhtbTAKKwlweG9yCSV4bW0xNSwleG1tNQorCXBzbGxxCSQyLCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW0xMCwleG1tMTUKKwltb3ZkcWEJJXhtbTMsJXhtbTkKKwlwc3JscQkkNCwleG1tMworCW1vdmRxYQkleG1tNSwleG1tMTAKKwlwc3JscQkkNCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTMKKwlweG9yCSV4bW0yLCV4bW01CisJcGFuZAkleG1tNywleG1tMworCXBhbmQJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW00CisJcHNsbHEJJDQsJXhtbTMKKwlweG9yCSV4bW01LCV4bW0yCisJcHNsbHEJJDQsJXhtbTUKKwlweG9yCSV4bW05LCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTUKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwlwc3JscQkkNCwleG1tMAorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDQsJXhtbTE1CisJcHhvcgkleG1tNiwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTE1CisJcGFuZAkleG1tNywleG1tMAorCXBhbmQJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tNgorCXBzbGxxCSQ0LCV4bW0wCisJcHhvcgkleG1tMTUsJXhtbTEKKwlwc2xscQkkNCwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0wCisJcHhvcgkleG1tMTAsJXhtbTE1CisJbW92ZHFhCSglcmF4KSwleG1tNworCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW03LCV4bW0zCisJcHhvcgkleG1tNywleG1tMQorCXB4b3IJJXhtbTcsJXhtbTYKKwlweG9yCSV4bW03LCV4bW0yCisJcHhvcgkleG1tNywleG1tNAorCXB4b3IJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tNywleG1tMAorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX2JzYWVzX2RlY3J5cHQ4LC4tX2JzYWVzX2RlY3J5cHQ4CisudHlwZQlfYnNhZXNfa2V5X2NvbnZlcnQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19ic2Flc19rZXlfY29udmVydDoKKwlsZWFxCS5MbWFza3MoJXJpcCksJXIxMQorCW1vdmRxdQkoJXJjeCksJXhtbTcKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwltb3ZkcWEJMCglcjExKSwleG1tMAorCW1vdmRxYQkxNiglcjExKSwleG1tMQorCW1vdmRxYQkzMiglcjExKSwleG1tMgorCW1vdmRxYQk0OCglcjExKSwleG1tMworCW1vdmRxYQk2NCglcjExKSwleG1tNAorCXBjbXBlcWQJJXhtbTUsJXhtbTUKKworCW1vdmRxdQkoJXJjeCksJXhtbTYKKwltb3ZkcWEJJXhtbTcsKCVyYXgpCisJbGVhcQkxNiglcmF4KSwlcmF4CisJZGVjbAklcjEwZAorCWptcAkuTGtleV9sb29wCisuYWxpZ24JMTYKKy5Ma2V5X2xvb3A6CisuYnl0ZQkxMDIsMTUsNTYsMCwyNDQKKworCW1vdmRxYQkleG1tMCwleG1tOAorCW1vdmRxYQkleG1tMSwleG1tOQorCisJcGFuZAkleG1tNiwleG1tOAorCXBhbmQJJXhtbTYsJXhtbTkKKwltb3ZkcWEJJXhtbTIsJXhtbTEwCisJcGNtcGVxYgkleG1tMCwleG1tOAorCXBzbGxxCSQ0LCV4bW0wCisJbW92ZHFhCSV4bW0zLCV4bW0xMQorCXBjbXBlcWIJJXhtbTEsJXhtbTkKKwlwc2xscQkkNCwleG1tMQorCisJcGFuZAkleG1tNiwleG1tMTAKKwlwYW5kCSV4bW02LCV4bW0xMQorCW1vdmRxYQkleG1tMCwleG1tMTIKKwlwY21wZXFiCSV4bW0yLCV4bW0xMAorCXBzbGxxCSQ0LCV4bW0yCisJbW92ZHFhCSV4bW0xLCV4bW0xMworCXBjbXBlcWIJJXhtbTMsJXhtbTExCisJcHNsbHEJJDQsJXhtbTMKKworCW1vdmRxYQkleG1tMiwleG1tMTQKKwltb3ZkcWEJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tNSwleG1tOAorCXB4b3IJJXhtbTUsJXhtbTkKKworCXBhbmQJJXhtbTYsJXhtbTEyCisJcGFuZAkleG1tNiwleG1tMTMKKwltb3ZkcWEJJXhtbTgsMCglcmF4KQorCXBjbXBlcWIJJXhtbTAsJXhtbTEyCisJcHNybHEJJDQsJXhtbTAKKwltb3ZkcWEJJXhtbTksMTYoJXJheCkKKwlwY21wZXFiCSV4bW0xLCV4bW0xMworCXBzcmxxCSQ0LCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisKKwlwYW5kCSV4bW02LCV4bW0xNAorCXBhbmQJJXhtbTYsJXhtbTE1CisJbW92ZHFhCSV4bW0xMCwzMiglcmF4KQorCXBjbXBlcWIJJXhtbTIsJXhtbTE0CisJcHNybHEJJDQsJXhtbTIKKwltb3ZkcWEJJXhtbTExLDQ4KCVyYXgpCisJcGNtcGVxYgkleG1tMywleG1tMTUKKwlwc3JscQkkNCwleG1tMworCW1vdmRxdQkoJXJjeCksJXhtbTYKKworCXB4b3IJJXhtbTUsJXhtbTEzCisJcHhvcgkleG1tNSwleG1tMTQKKwltb3ZkcWEJJXhtbTEyLDY0KCVyYXgpCisJbW92ZHFhCSV4bW0xMyw4MCglcmF4KQorCW1vdmRxYQkleG1tMTQsOTYoJXJheCkKKwltb3ZkcWEJJXhtbTE1LDExMiglcmF4KQorCWxlYXEJMTI4KCVyYXgpLCVyYXgKKwlkZWNsCSVyMTBkCisJam56CS5Ma2V5X2xvb3AKKworCW1vdmRxYQk4MCglcjExKSwleG1tNworCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfYnNhZXNfa2V5X2NvbnZlcnQsLi1fYnNhZXNfa2V5X2NvbnZlcnQKKy5leHRlcm4JYWVzX25vaHdfY2JjX2VuY3J5cHQKKy5oaWRkZW4gYWVzX25vaHdfY2JjX2VuY3J5cHQKKy5nbG9ibAlic2Flc19jYmNfZW5jcnlwdAorLmhpZGRlbiBic2Flc19jYmNfZW5jcnlwdAorLnR5cGUJYnNhZXNfY2JjX2VuY3J5cHQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2JzYWVzX2NiY19lbmNyeXB0OgorLmNmaV9zdGFydHByb2MJCisJY21wbAkkMCwlcjlkCisJam5lCWFlc19ub2h3X2NiY19lbmNyeXB0CisJY21wcQkkMTI4LCVyZHgKKwlqYglhZXNfbm9od19jYmNfZW5jcnlwdAorCisJbW92cQklcnNwLCVyYXgKKy5MY2JjX2RlY19wcm9sb2d1ZToKKwlwdXNocQklcmJwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYnAsLTE2CisJcHVzaHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJ4LC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKwlsZWFxCS03MiglcnNwKSwlcnNwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTB4NDgKKwltb3ZxCSVyc3AsJXJicAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYnAKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJbW92cQklcmRpLCVyMTIKKwltb3ZxCSVyc2ksJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKwltb3ZxCSVyOCwlcmJ4CisJc2hycQkkNCwlcjE0CisKKwltb3ZsCSVlYXgsJWVkeAorCXNobHEJJDcsJXJheAorCXN1YnEJJDk2LCVyYXgKKwlzdWJxCSVyYXgsJXJzcAorCisJbW92cQklcnNwLCVyYXgKKwltb3ZxCSVyMTUsJXJjeAorCW1vdmwJJWVkeCwlcjEwZAorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkoJXJzcCksJXhtbTcKKwltb3ZkcWEJJXhtbTYsKCVyYXgpCisJbW92ZHFhCSV4bW03LCglcnNwKQorCisJbW92ZHF1CSglcmJ4KSwleG1tMTQKKwlzdWJxCSQ4LCVyMTQKKy5MY2JjX2RlY19sb29wOgorCW1vdmRxdQkwKCVyMTIpLCV4bW0xNQorCW1vdmRxdQkxNiglcjEyKSwleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tMQorCW1vdmRxdQk0OCglcjEyKSwleG1tMgorCW1vdmRxdQk2NCglcjEyKSwleG1tMworCW1vdmRxdQk4MCglcjEyKSwleG1tNAorCW1vdnEJJXJzcCwlcmF4CisJbW92ZHF1CTk2KCVyMTIpLCV4bW01CisJbW92bAklZWR4LCVyMTBkCisJbW92ZHF1CTExMiglcjEyKSwleG1tNgorCW1vdmRxYQkleG1tMTQsMzIoJXJicCkKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCTMyKCVyYnApLCV4bW0xNQorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMworCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tNgorCW1vdmRxdQk5NiglcjEyKSwleG1tMTMKKwlweG9yCSV4bW0xMiwleG1tMgorCW1vdmRxdQkxMTIoJXIxMiksJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTQKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlsZWFxCTEyOCglcjEyKSwlcjEyCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJbW92ZHF1CSV4bW0zLDQ4KCVyMTMpCisJbW92ZHF1CSV4bW0xLDY0KCVyMTMpCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJbW92ZHF1CSV4bW0yLDk2KCVyMTMpCisJbW92ZHF1CSV4bW00LDExMiglcjEzKQorCWxlYXEJMTI4KCVyMTMpLCVyMTMKKwlzdWJxCSQ4LCVyMTQKKwlqbmMJLkxjYmNfZGVjX2xvb3AKKworCWFkZHEJJDgsJXIxNAorCWp6CS5MY2JjX2RlY19kb25lCisKKwltb3ZkcXUJMCglcjEyKSwleG1tMTUKKwltb3ZxCSVyc3AsJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCWNtcHEJJDIsJXIxNAorCWpiCS5MY2JjX2RlY19vbmUKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTAKKwlqZQkuTGNiY19kZWNfdHdvCisJbW92ZHF1CTMyKCVyMTIpLCV4bW0xCisJY21wcQkkNCwlcjE0CisJamIJLkxjYmNfZGVjX3RocmVlCisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0yCisJamUJLkxjYmNfZGVjX2ZvdXIKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTMKKwljbXBxCSQ2LCVyMTQKKwlqYgkuTGNiY19kZWNfZml2ZQorCW1vdmRxdQk4MCglcjEyKSwleG1tNAorCWplCS5MY2JjX2RlY19zaXgKKwltb3ZkcXUJOTYoJXIxMiksJXhtbTUKKwltb3ZkcWEJJXhtbTE0LDMyKCVyYnApCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTMyKCVyYnApLCV4bW0xNQorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMworCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tNgorCW1vdmRxdQk5NiglcjEyKSwleG1tMTQKKwlweG9yCSV4bW0xMiwleG1tMgorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCW1vdmRxdQkleG1tMyw0OCglcjEzKQorCW1vdmRxdQkleG1tMSw2NCglcjEzKQorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCW1vdmRxdQkleG1tMiw5NiglcjEzKQorCWptcAkuTGNiY19kZWNfZG9uZQorLmFsaWduCTE2CisuTGNiY19kZWNfc2l4OgorCW1vdmRxYQkleG1tMTQsMzIoJXJicCkKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCXB4b3IJMzIoJXJicCksJXhtbTE1CisJbW92ZHF1CTAoJXIxMiksJXhtbTcKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxdQk0OCglcjEyKSwleG1tMTAKKwlweG9yCSV4bW05LCV4bW0zCisJbW92ZHF1CTY0KCVyMTIpLCV4bW0xMQorCXB4b3IJJXhtbTEwLCV4bW0xCisJbW92ZHF1CTgwKCVyMTIpLCV4bW0xNAorCXB4b3IJJXhtbTExLCV4bW02CisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJbW92ZHF1CSV4bW0zLDQ4KCVyMTMpCisJbW92ZHF1CSV4bW0xLDY0KCVyMTMpCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY19maXZlOgorCW1vdmRxYQkleG1tMTQsMzIoJXJicCkKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCXB4b3IJMzIoJXJicCksJXhtbTE1CisJbW92ZHF1CTAoJXIxMiksJXhtbTcKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxdQk0OCglcjEyKSwleG1tMTAKKwlweG9yCSV4bW05LCV4bW0zCisJbW92ZHF1CTY0KCVyMTIpLCV4bW0xNAorCXB4b3IJJXhtbTEwLCV4bW0xCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJbW92ZHF1CSV4bW0zLDQ4KCVyMTMpCisJbW92ZHF1CSV4bW0xLDY0KCVyMTMpCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY19mb3VyOgorCW1vdmRxYQkleG1tMTQsMzIoJXJicCkKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCXB4b3IJMzIoJXJicCksJXhtbTE1CisJbW92ZHF1CTAoJXIxMiksJXhtbTcKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxdQk0OCglcjEyKSwleG1tMTQKKwlweG9yCSV4bW05LCV4bW0zCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJbW92ZHF1CSV4bW0zLDQ4KCVyMTMpCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY190aHJlZToKKwltb3ZkcWEJJXhtbTE0LDMyKCVyYnApCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTMyKCVyYnApLCV4bW0xNQorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tMTQKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY190d286CisJbW92ZHFhCSV4bW0xNCwzMiglcmJwKQorCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisJcHhvcgkzMiglcmJwKSwleG1tMTUKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCW1vdmRxdQkxNiglcjEyKSwleG1tMTQKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJam1wCS5MY2JjX2RlY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY19vbmU6CisJbGVhcQkoJXIxMiksJXJkaQorCWxlYXEJMzIoJXJicCksJXJzaQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCWFlc19ub2h3X2RlY3J5cHQKKwlweG9yCTMyKCVyYnApLCV4bW0xNAorCW1vdmRxdQkleG1tMTQsKCVyMTMpCisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKworLkxjYmNfZGVjX2RvbmU6CisJbW92ZHF1CSV4bW0xNCwoJXJieCkKKwlsZWFxCSglcnNwKSwlcmF4CisJcHhvcgkleG1tMCwleG1tMAorLkxjYmNfZGVjX2J6ZXJvOgorCW1vdmRxYQkleG1tMCwwKCVyYXgpCisJbW92ZHFhCSV4bW0wLDE2KCVyYXgpCisJbGVhcQkzMiglcmF4KSwlcmF4CisJY21wcQklcmF4LCVyYnAKKwlqYQkuTGNiY19kZWNfYnplcm8KKworCWxlYXEJMTIwKCVyYnApLCVyYXgKKy5jZmlfZGVmX2NmYQklcmF4LDgKKwltb3ZxCS00OCglcmF4KSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyYXgpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJheCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyYXgpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbW92cQktOCglcmF4KSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCWxlYXEJKCVyYXgpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGNiY19kZWNfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlic2Flc19jYmNfZW5jcnlwdCwuLWJzYWVzX2NiY19lbmNyeXB0CisKKy5nbG9ibAlic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLmhpZGRlbiBic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLnR5cGUJYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3MsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2JzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzOgorLmNmaV9zdGFydHByb2MJCisJbW92cQklcnNwLCVyYXgKKy5MY3RyX2VuY19wcm9sb2d1ZToKKwlwdXNocQklcmJwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYnAsLTE2CisJcHVzaHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJ4LC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKwlsZWFxCS03MiglcnNwKSwlcnNwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTB4NDgKKwltb3ZxCSVyc3AsJXJicAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYnAKKwltb3ZkcXUJKCVyOCksJXhtbTAKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJbW92cQklcmRpLCVyMTIKKwltb3ZxCSVyc2ksJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKwltb3ZkcWEJJXhtbTAsMzIoJXJicCkKKwljbXBxCSQ4LCVyZHgKKwlqYgkuTGN0cl9lbmNfc2hvcnQKKworCW1vdmwJJWVheCwlZWJ4CisJc2hscQkkNywlcmF4CisJc3VicQkkOTYsJXJheAorCXN1YnEJJXJheCwlcnNwCisKKwltb3ZxCSVyc3AsJXJheAorCW1vdnEJJXIxNSwlcmN4CisJbW92bAklZWJ4LCVyMTBkCisJY2FsbAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlweG9yCSV4bW02LCV4bW03CisJbW92ZHFhCSV4bW03LCglcmF4KQorCisJbW92ZHFhCSglcnNwKSwleG1tOAorCWxlYXEJLkxBREQxKCVyaXApLCVyMTEKKwltb3ZkcWEJMzIoJXJicCksJXhtbTE1CisJbW92ZHFhCS0zMiglcjExKSwleG1tNworLmJ5dGUJMTAyLDY4LDE1LDU2LDAsMTk5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMCwyNTUKKwltb3ZkcWEJJXhtbTgsKCVyc3ApCisJam1wCS5MY3RyX2VuY19sb29wCisuYWxpZ24JMTYKKy5MY3RyX2VuY19sb29wOgorCW1vdmRxYQkleG1tMTUsMzIoJXJicCkKKwltb3ZkcWEJJXhtbTE1LCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMQorCXBhZGRkCTAoJXIxMSksJXhtbTAKKwltb3ZkcWEJJXhtbTE1LCV4bW0yCisJcGFkZGQJMTYoJXIxMSksJXhtbTEKKwltb3ZkcWEJJXhtbTE1LCV4bW0zCisJcGFkZGQJMzIoJXIxMSksJXhtbTIKKwltb3ZkcWEJJXhtbTE1LCV4bW00CisJcGFkZGQJNDgoJXIxMSksJXhtbTMKKwltb3ZkcWEJJXhtbTE1LCV4bW01CisJcGFkZGQJNjQoJXIxMSksJXhtbTQKKwltb3ZkcWEJJXhtbTE1LCV4bW02CisJcGFkZGQJODAoJXIxMSksJXhtbTUKKwlwYWRkZAk5NiglcjExKSwleG1tNgorCisKKworCW1vdmRxYQkoJXJzcCksJXhtbTgKKwlsZWFxCTE2KCVyc3ApLCVyYXgKKwltb3ZkcWEJLTE2KCVyMTEpLCV4bW03CisJcHhvcgkleG1tOCwleG1tMTUKKwlweG9yCSV4bW04LCV4bW0wCisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTgsJXhtbTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwwLDI1NQorLmJ5dGUJMTAyLDE1LDU2LDAsMTk5CisJcHhvcgkleG1tOCwleG1tMworCXB4b3IJJXhtbTgsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNworLmJ5dGUJMTAyLDE1LDU2LDAsMjE1CisJcHhvcgkleG1tOCwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworLmJ5dGUJMTAyLDE1LDU2LDAsMjMxCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzkKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NworCWxlYXEJLkxCUzAoJXJpcCksJXIxMQorCW1vdmwJJWVieCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDhfYml0c2xpY2UKKworCXN1YnEJJDgsJXIxNAorCWpjCS5MY3RyX2VuY19sb29wX2RvbmUKKworCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0xMAorCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwltb3ZkcXUJODAoJXIxMiksJXhtbTEyCisJbW92ZHF1CTk2KCVyMTIpLCV4bW0xMworCW1vdmRxdQkxMTIoJXIxMiksJXhtbTE0CisJbGVhcQkxMjgoJXIxMiksJXIxMgorCXB4b3IJJXhtbTE1LCV4bW03CisJbW92ZHFhCTMyKCVyYnApLCV4bW0xNQorCXB4b3IJJXhtbTgsJXhtbTAKKwltb3ZkcXUJJXhtbTcsMCglcjEzKQorCXB4b3IJJXhtbTksJXhtbTMKKwltb3ZkcXUJJXhtbTAsMTYoJXIxMykKKwlweG9yCSV4bW0xMCwleG1tNQorCW1vdmRxdQkleG1tMywzMiglcjEzKQorCXB4b3IJJXhtbTExLCV4bW0yCisJbW92ZHF1CSV4bW01LDQ4KCVyMTMpCisJcHhvcgkleG1tMTIsJXhtbTYKKwltb3ZkcXUJJXhtbTIsNjQoJXIxMykKKwlweG9yCSV4bW0xMywleG1tMQorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCXB4b3IJJXhtbTE0LCV4bW00CisJbW92ZHF1CSV4bW0xLDk2KCVyMTMpCisJbGVhcQkuTEFERDEoJXJpcCksJXIxMQorCW1vdmRxdQkleG1tNCwxMTIoJXIxMykKKwlsZWFxCTEyOCglcjEzKSwlcjEzCisJcGFkZGQJMTEyKCVyMTEpLCV4bW0xNQorCWpuegkuTGN0cl9lbmNfbG9vcAorCisJam1wCS5MY3RyX2VuY19kb25lCisuYWxpZ24JMTYKKy5MY3RyX2VuY19sb29wX2RvbmU6CisJYWRkcQkkOCwlcjE0CisJbW92ZHF1CTAoJXIxMiksJXhtbTcKKwlweG9yCSV4bW03LCV4bW0xNQorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCWNtcHEJJDIsJXIxNAorCWpiCS5MY3RyX2VuY19kb25lCisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tOCwleG1tMAorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCWplCS5MY3RyX2VuY19kb25lCisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJcHhvcgkleG1tOSwleG1tMworCW1vdmRxdQkleG1tMywzMiglcjEzKQorCWNtcHEJJDQsJXIxNAorCWpiCS5MY3RyX2VuY19kb25lCisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW01CisJbW92ZHF1CSV4bW01LDQ4KCVyMTMpCisJamUJLkxjdHJfZW5jX2RvbmUKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTIKKwltb3ZkcXUJJXhtbTIsNjQoJXIxMykKKwljbXBxCSQ2LCVyMTQKKwlqYgkuTGN0cl9lbmNfZG9uZQorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwlweG9yCSV4bW0xMiwleG1tNgorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCWplCS5MY3RyX2VuY19kb25lCisJbW92ZHF1CTk2KCVyMTIpLCV4bW0xMworCXB4b3IJJXhtbTEzLCV4bW0xCisJbW92ZHF1CSV4bW0xLDk2KCVyMTMpCisJam1wCS5MY3RyX2VuY19kb25lCisKKy5hbGlnbgkxNgorLkxjdHJfZW5jX3Nob3J0OgorCWxlYXEJMzIoJXJicCksJXJkaQorCWxlYXEJNDgoJXJicCksJXJzaQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCWFlc19ub2h3X2VuY3J5cHQKKwltb3ZkcXUJKCVyMTIpLCV4bW0wCisJbGVhcQkxNiglcjEyKSwlcjEyCisJbW92bAk0NCglcmJwKSwlZWF4CisJYnN3YXBsCSVlYXgKKwlweG9yCTQ4KCVyYnApLCV4bW0wCisJaW5jbAklZWF4CisJbW92ZHF1CSV4bW0wLCglcjEzKQorCWJzd2FwbAklZWF4CisJbGVhcQkxNiglcjEzKSwlcjEzCisJbW92bAklZWF4LDQ0KCVyc3ApCisJZGVjcQklcjE0CisJam56CS5MY3RyX2VuY19zaG9ydAorCisuTGN0cl9lbmNfZG9uZToKKwlsZWFxCSglcnNwKSwlcmF4CisJcHhvcgkleG1tMCwleG1tMAorLkxjdHJfZW5jX2J6ZXJvOgorCW1vdmRxYQkleG1tMCwwKCVyYXgpCisJbW92ZHFhCSV4bW0wLDE2KCVyYXgpCisJbGVhcQkzMiglcmF4KSwlcmF4CisJY21wcQklcmF4LCVyYnAKKwlqYQkuTGN0cl9lbmNfYnplcm8KKworCWxlYXEJMTIwKCVyYnApLCVyYXgKKy5jZmlfZGVmX2NmYQklcmF4LDgKKwltb3ZxCS00OCglcmF4KSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyYXgpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJheCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyYXgpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbW92cQktOCglcmF4KSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCWxlYXEJKCVyYXgpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGN0cl9lbmNfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcywuLWJzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisuZ2xvYmwJYnNhZXNfeHRzX2VuY3J5cHQKKy5oaWRkZW4gYnNhZXNfeHRzX2VuY3J5cHQKKy50eXBlCWJzYWVzX3h0c19lbmNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2Citic2Flc194dHNfZW5jcnlwdDoKKy5jZmlfc3RhcnRwcm9jCQorCW1vdnEJJXJzcCwlcmF4CisuTHh0c19lbmNfcHJvbG9ndWU6CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJbGVhcQktNzIoJXJzcCksJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAkweDQ4CisJbW92cQklcnNwLCVyYnAKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcmJwCisJbW92cQklcmRpLCVyMTIKKwltb3ZxCSVyc2ksJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKworCWxlYXEJKCVyOSksJXJkaQorCWxlYXEJMzIoJXJicCksJXJzaQorCWxlYXEJKCVyOCksJXJkeAorCWNhbGwJYWVzX25vaHdfZW5jcnlwdAorCisJbW92bAkyNDAoJXIxNSksJWVheAorCW1vdnEJJXIxNCwlcmJ4CisKKwltb3ZsCSVlYXgsJWVkeAorCXNobHEJJDcsJXJheAorCXN1YnEJJDk2LCVyYXgKKwlzdWJxCSVyYXgsJXJzcAorCisJbW92cQklcnNwLCVyYXgKKwltb3ZxCSVyMTUsJXJjeAorCW1vdmwJJWVkeCwlcjEwZAorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkleG1tNiwleG1tNworCW1vdmRxYQkleG1tNywoJXJheCkKKworCWFuZHEJJC0xNiwlcjE0CisJc3VicQkkMHg4MCwlcnNwCisJbW92ZHFhCTMyKCVyYnApLCV4bW02CisKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksJXhtbTEyCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKworCXN1YnEJJDB4ODAsJXIxNAorCWpjCS5MeHRzX2VuY19zaG9ydAorCWptcAkuTHh0c19lbmNfbG9vcAorCisuYWxpZ24JMTYKKy5MeHRzX2VuY19sb29wOgorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0xNQorCW1vdmRxYQkleG1tNiwwKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwltb3ZkcWEJJXhtbTYsMTYoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0xCisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tNywleG1tMTUKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMgorCW1vdmRxYQkleG1tNiw0OCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCXB4b3IJJXhtbTgsJXhtbTAKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMworCW1vdmRxYQkleG1tNiw2NCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk0OCglcjEyKSwleG1tMTAKKwlweG9yCSV4bW05LCV4bW0xCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTYsODAoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTIKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tNQorCW1vdmRxYQkleG1tNiw5NiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMworCW1vdmRxdQk5NiglcjEyKSwleG1tMTMKKwlweG9yCSV4bW0xMiwleG1tNAorCW1vdmRxdQkxMTIoJXIxMiksJXhtbTE0CisJbGVhcQkxMjgoJXIxMiksJXIxMgorCW1vdmRxYQkleG1tNiwxMTIoJXJzcCkKKwlweG9yCSV4bW0xMywleG1tNQorCWxlYXEJMTI4KCVyc3ApLCVyYXgKKwlweG9yCSV4bW0xNCwleG1tNgorCW1vdmwJJWVkeCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMCglcnNwKSwleG1tMTUKKwlweG9yCTE2KCVyc3ApLCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJcHhvcgkzMiglcnNwKSwleG1tMworCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCXB4b3IJNDgoJXJzcCksJXhtbTUKKwltb3ZkcXUJJXhtbTMsMzIoJXIxMykKKwlweG9yCTY0KCVyc3ApLCV4bW0yCisJbW92ZHF1CSV4bW01LDQ4KCVyMTMpCisJcHhvcgk4MCglcnNwKSwleG1tNgorCW1vdmRxdQkleG1tMiw2NCglcjEzKQorCXB4b3IJOTYoJXJzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTYsODAoJXIxMykKKwlweG9yCTExMiglcnNwKSwleG1tNAorCW1vdmRxdQkleG1tMSw5NiglcjEzKQorCW1vdmRxdQkleG1tNCwxMTIoJXIxMykKKwlsZWFxCTEyOCglcjEzKSwlcjEzCisKKwltb3ZkcWEJMTEyKCVyc3ApLCV4bW02CisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCS5MeHRzX21hZ2ljKCVyaXApLCV4bW0xMgorCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKworCXN1YnEJJDB4ODAsJXIxNAorCWpuYwkuTHh0c19lbmNfbG9vcAorCisuTHh0c19lbmNfc2hvcnQ6CisJYWRkcQkkMHg4MCwlcjE0CisJanoJLkx4dHNfZW5jX2RvbmUKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMTUKKwltb3ZkcWEJJXhtbTYsMCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0wCisJbW92ZHFhCSV4bW02LDE2KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTAoJXIxMiksJXhtbTcKKwljbXBxCSQxNiwlcjE0CisJamUJLkx4dHNfZW5jXzEKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMQorCW1vdmRxYQkleG1tNiwzMiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkxNiglcjEyKSwleG1tOAorCWNtcHEJJDMyLCVyMTQKKwlqZQkuTHh0c19lbmNfMgorCXB4b3IJJXhtbTcsJXhtbTE1CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTIKKwltb3ZkcWEJJXhtbTYsNDgoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMzIoJXIxMiksJXhtbTkKKwljbXBxCSQ0OCwlcjE0CisJamUJLkx4dHNfZW5jXzMKKwlweG9yCSV4bW04LCV4bW0wCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwltb3ZkcWEJJXhtbTYsNjQoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJY21wcQkkNjQsJXIxNAorCWplCS5MeHRzX2VuY180CisJcHhvcgkleG1tOSwleG1tMQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW00CisJbW92ZHFhCSV4bW02LDgwKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTY0KCVyMTIpLCV4bW0xMQorCWNtcHEJJDgwLCVyMTQKKwlqZQkuTHh0c19lbmNfNQorCXB4b3IJJXhtbTEwLCV4bW0yCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTUKKwltb3ZkcWEJJXhtbTYsOTYoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJODAoJXIxMiksJXhtbTEyCisJY21wcQkkOTYsJXIxNAorCWplCS5MeHRzX2VuY182CisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJOTYoJXIxMiksJXhtbTEzCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcWEJJXhtbTYsMTEyKCVyc3ApCisJbGVhcQkxMTIoJXIxMiksJXIxMgorCXB4b3IJJXhtbTEzLCV4bW01CisJbGVhcQkxMjgoJXJzcCksJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMCglcnNwKSwleG1tMTUKKwlweG9yCTE2KCVyc3ApLCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJcHhvcgkzMiglcnNwKSwleG1tMworCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCXB4b3IJNDgoJXJzcCksJXhtbTUKKwltb3ZkcXUJJXhtbTMsMzIoJXIxMykKKwlweG9yCTY0KCVyc3ApLCV4bW0yCisJbW92ZHF1CSV4bW01LDQ4KCVyMTMpCisJcHhvcgk4MCglcnNwKSwleG1tNgorCW1vdmRxdQkleG1tMiw2NCglcjEzKQorCXB4b3IJOTYoJXJzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTYsODAoJXIxMykKKwltb3ZkcXUJJXhtbTEsOTYoJXIxMykKKwlsZWFxCTExMiglcjEzKSwlcjEzCisKKwltb3ZkcWEJMTEyKCVyc3ApLCV4bW02CisJam1wCS5MeHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2VuY182OgorCXB4b3IJJXhtbTExLCV4bW0zCisJbGVhcQk5NiglcjEyKSwlcjEyCisJcHhvcgkleG1tMTIsJXhtbTQKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMywzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTIKKwltb3ZkcXUJJXhtbTUsNDgoJXIxMykKKwlweG9yCTgwKCVyc3ApLCV4bW02CisJbW92ZHF1CSV4bW0yLDY0KCVyMTMpCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJbGVhcQk5NiglcjEzKSwlcjEzCisKKwltb3ZkcWEJOTYoJXJzcCksJXhtbTYKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzU6CisJcHhvcgkleG1tMTAsJXhtbTIKKwlsZWFxCTgwKCVyMTIpLCVyMTIKKwlweG9yCSV4bW0xMSwleG1tMworCWxlYXEJMTI4KCVyc3ApLCVyYXgKKwltb3ZsCSVlZHgsJXIxMGQKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCTAoJXJzcCksJXhtbTE1CisJcHhvcgkxNiglcnNwKSwleG1tMAorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCXB4b3IJMzIoJXJzcCksJXhtbTMKKwltb3ZkcXUJJXhtbTAsMTYoJXIxMykKKwlweG9yCTQ4KCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0zLDMyKCVyMTMpCisJcHhvcgk2NCglcnNwKSwleG1tMgorCW1vdmRxdQkleG1tNSw0OCglcjEzKQorCW1vdmRxdQkleG1tMiw2NCglcjEzKQorCWxlYXEJODAoJXIxMyksJXIxMworCisJbW92ZHFhCTgwKCVyc3ApLCV4bW02CisJam1wCS5MeHRzX2VuY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2VuY180OgorCXB4b3IJJXhtbTksJXhtbTEKKwlsZWFxCTY0KCVyMTIpLCVyMTIKKwlweG9yCSV4bW0xMCwleG1tMgorCWxlYXEJMTI4KCVyc3ApLCVyYXgKKwltb3ZsCSVlZHgsJXIxMGQKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCTAoJXJzcCksJXhtbTE1CisJcHhvcgkxNiglcnNwKSwleG1tMAorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCXB4b3IJMzIoJXJzcCksJXhtbTMKKwltb3ZkcXUJJXhtbTAsMTYoJXIxMykKKwlweG9yCTQ4KCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0zLDMyKCVyMTMpCisJbW92ZHF1CSV4bW01LDQ4KCVyMTMpCisJbGVhcQk2NCglcjEzKSwlcjEzCisKKwltb3ZkcWEJNjQoJXJzcCksJXhtbTYKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzM6CisJcHhvcgkleG1tOCwleG1tMAorCWxlYXEJNDgoJXIxMiksJXIxMgorCXB4b3IJJXhtbTksJXhtbTEKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW0zLDMyKCVyMTMpCisJbGVhcQk0OCglcjEzKSwlcjEzCisKKwltb3ZkcWEJNDgoJXJzcCksJXhtbTYKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzI6CisJcHhvcgkleG1tNywleG1tMTUKKwlsZWFxCTMyKCVyMTIpLCVyMTIKKwlweG9yCSV4bW04LCV4bW0wCisJbGVhcQkxMjgoJXJzcCksJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMCglcnNwKSwleG1tMTUKKwlweG9yCTE2KCVyc3ApLCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbGVhcQkzMiglcjEzKSwlcjEzCisKKwltb3ZkcWEJMzIoJXJzcCksJXhtbTYKKwlqbXAJLkx4dHNfZW5jX2RvbmUKKy5hbGlnbgkxNgorLkx4dHNfZW5jXzE6CisJcHhvcgkleG1tMTUsJXhtbTcKKwlsZWFxCTE2KCVyMTIpLCVyMTIKKwltb3ZkcWEJJXhtbTcsMzIoJXJicCkKKwlsZWFxCTMyKCVyYnApLCVyZGkKKwlsZWFxCTMyKCVyYnApLCVyc2kKKwlsZWFxCSglcjE1KSwlcmR4CisJY2FsbAlhZXNfbm9od19lbmNyeXB0CisJcHhvcgkzMiglcmJwKSwleG1tMTUKKworCisKKworCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbGVhcQkxNiglcjEzKSwlcjEzCisKKwltb3ZkcWEJMTYoJXJzcCksJXhtbTYKKworLkx4dHNfZW5jX2RvbmU6CisJYW5kbAkkMTUsJWVieAorCWp6CS5MeHRzX2VuY19yZXQKKwltb3ZxCSVyMTMsJXJkeAorCisuTHh0c19lbmNfc3RlYWw6CisJbW92emJsCSglcjEyKSwlZWF4CisJbW92emJsCS0xNiglcmR4KSwlZWN4CisJbGVhcQkxKCVyMTIpLCVyMTIKKwltb3ZiCSVhbCwtMTYoJXJkeCkKKwltb3ZiCSVjbCwwKCVyZHgpCisJbGVhcQkxKCVyZHgpLCVyZHgKKwlzdWJsCSQxLCVlYngKKwlqbnoJLkx4dHNfZW5jX3N0ZWFsCisKKwltb3ZkcXUJLTE2KCVyMTMpLCV4bW0xNQorCWxlYXEJMzIoJXJicCksJXJkaQorCXB4b3IJJXhtbTYsJXhtbTE1CisJbGVhcQkzMiglcmJwKSwlcnNpCisJbW92ZHFhCSV4bW0xNSwzMiglcmJwKQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCWFlc19ub2h3X2VuY3J5cHQKKwlweG9yCTMyKCVyYnApLCV4bW02CisJbW92ZHF1CSV4bW02LC0xNiglcjEzKQorCisuTHh0c19lbmNfcmV0OgorCWxlYXEJKCVyc3ApLCVyYXgKKwlweG9yCSV4bW0wLCV4bW0wCisuTHh0c19lbmNfYnplcm86CisJbW92ZHFhCSV4bW0wLDAoJXJheCkKKwltb3ZkcWEJJXhtbTAsMTYoJXJheCkKKwlsZWFxCTMyKCVyYXgpLCVyYXgKKwljbXBxCSVyYXgsJXJicAorCWphCS5MeHRzX2VuY19iemVybworCisJbGVhcQkxMjAoJXJicCksJXJheAorLmNmaV9kZWZfY2ZhCSVyYXgsOAorCW1vdnEJLTQ4KCVyYXgpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJheCksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcmF4KSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyYXgpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJheCksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwltb3ZxCS04KCVyYXgpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXJheCksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MeHRzX2VuY19lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWJzYWVzX3h0c19lbmNyeXB0LC4tYnNhZXNfeHRzX2VuY3J5cHQKKworLmdsb2JsCWJzYWVzX3h0c19kZWNyeXB0CisuaGlkZGVuIGJzYWVzX3h0c19kZWNyeXB0CisudHlwZQlic2Flc194dHNfZGVjcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYnNhZXNfeHRzX2RlY3J5cHQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwltb3ZxCSVyc3AsJXJheAorLkx4dHNfZGVjX3Byb2xvZ3VlOgorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMTYKKwlwdXNocQklcmJ4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYngsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE1LC01NgorCWxlYXEJLTcyKCVyc3ApLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJMHg0OAorCW1vdnEJJXJzcCwlcmJwCisJbW92cQklcmRpLCVyMTIKKwltb3ZxCSVyc2ksJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKworCWxlYXEJKCVyOSksJXJkaQorCWxlYXEJMzIoJXJicCksJXJzaQorCWxlYXEJKCVyOCksJXJkeAorCWNhbGwJYWVzX25vaHdfZW5jcnlwdAorCisJbW92bAkyNDAoJXIxNSksJWVheAorCW1vdnEJJXIxNCwlcmJ4CisKKwltb3ZsCSVlYXgsJWVkeAorCXNobHEJJDcsJXJheAorCXN1YnEJJDk2LCVyYXgKKwlzdWJxCSVyYXgsJXJzcAorCisJbW92cQklcnNwLCVyYXgKKwltb3ZxCSVyMTUsJXJjeAorCW1vdmwJJWVkeCwlcjEwZAorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkoJXJzcCksJXhtbTcKKwltb3ZkcWEJJXhtbTYsKCVyYXgpCisJbW92ZHFhCSV4bW03LCglcnNwKQorCisJeG9ybAklZWF4LCVlYXgKKwlhbmRxCSQtMTYsJXIxNAorCXRlc3RsCSQxNSwlZWJ4CisJc2V0bnoJJWFsCisJc2hscQkkNCwlcmF4CisJc3VicQklcmF4LCVyMTQKKworCXN1YnEJJDB4ODAsJXJzcAorCW1vdmRxYQkzMiglcmJwKSwleG1tNgorCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCS5MeHRzX21hZ2ljKCVyaXApLCV4bW0xMgorCXBjbXBndGQJJXhtbTYsJXhtbTE0CisKKwlzdWJxCSQweDgwLCVyMTQKKwlqYwkuTHh0c19kZWNfc2hvcnQKKwlqbXAJLkx4dHNfZGVjX2xvb3AKKworLmFsaWduCTE2CisuTHh0c19kZWNfbG9vcDoKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMTUKKwltb3ZkcWEJJXhtbTYsMCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0wCisJbW92ZHFhCSV4bW02LDE2KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTAoJXIxMiksJXhtbTcKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMQorCW1vdmRxYQkleG1tNiwzMiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkxNiglcjEyKSwleG1tOAorCXB4b3IJJXhtbTcsJXhtbTE1CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTIKKwltb3ZkcWEJJXhtbTYsNDgoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMzIoJXIxMiksJXhtbTkKKwlweG9yCSV4bW04LCV4bW0wCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwltb3ZkcWEJJXhtbTYsNjQoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW00CisJbW92ZHFhCSV4bW02LDgwKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTY0KCVyMTIpLCV4bW0xMQorCXB4b3IJJXhtbTEwLCV4bW0yCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTUKKwltb3ZkcWEJJXhtbTYsOTYoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJODAoJXIxMiksJXhtbTEyCisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJOTYoJXIxMiksJXhtbTEzCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJMTEyKCVyMTIpLCV4bW0xNAorCWxlYXEJMTI4KCVyMTIpLCVyMTIKKwltb3ZkcWEJJXhtbTYsMTEyKCVyc3ApCisJcHhvcgkleG1tMTMsJXhtbTUKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJcHhvcgkleG1tMTQsJXhtbTYKKwltb3ZsCSVlZHgsJXIxMGQKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCTAoJXJzcCksJXhtbTE1CisJcHhvcgkxNiglcnNwKSwleG1tMAorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCXB4b3IJMzIoJXJzcCksJXhtbTUKKwltb3ZkcXUJJXhtbTAsMTYoJXIxMykKKwlweG9yCTQ4KCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJcHhvcgk2NCglcnNwKSwleG1tMQorCW1vdmRxdQkleG1tMyw0OCglcjEzKQorCXB4b3IJODAoJXJzcCksJXhtbTYKKwltb3ZkcXUJJXhtbTEsNjQoJXIxMykKKwlweG9yCTk2KCVyc3ApLCV4bW0yCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJcHhvcgkxMTIoJXJzcCksJXhtbTQKKwltb3ZkcXUJJXhtbTIsOTYoJXIxMykKKwltb3ZkcXUJJXhtbTQsMTEyKCVyMTMpCisJbGVhcQkxMjgoJXIxMyksJXIxMworCisJbW92ZHFhCTExMiglcnNwKSwleG1tNgorCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkuTHh0c19tYWdpYyglcmlwKSwleG1tMTIKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisKKwlzdWJxCSQweDgwLCVyMTQKKwlqbmMJLkx4dHNfZGVjX2xvb3AKKworLkx4dHNfZGVjX3Nob3J0OgorCWFkZHEJJDB4ODAsJXIxNAorCWp6CS5MeHRzX2RlY19kb25lCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTE1CisJbW92ZHFhCSV4bW02LDAoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMAorCW1vdmRxYQkleG1tNiwxNiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJY21wcQkkMTYsJXIxNAorCWplCS5MeHRzX2RlY18xCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwltb3ZkcWEJJXhtbTYsMzIoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwljbXBxCSQzMiwlcjE0CisJamUJLkx4dHNfZGVjXzIKKwlweG9yCSV4bW03LCV4bW0xNQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0yCisJbW92ZHFhCSV4bW02LDQ4KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJY21wcQkkNDgsJXIxNAorCWplCS5MeHRzX2RlY18zCisJcHhvcgkleG1tOCwleG1tMAorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0zCisJbW92ZHFhCSV4bW02LDY0KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0xMAorCWNtcHEJJDY0LCVyMTQKKwlqZQkuTHh0c19kZWNfNAorCXB4b3IJJXhtbTksJXhtbTEKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tNAorCW1vdmRxYQkleG1tNiw4MCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwljbXBxCSQ4MCwlcjE0CisJamUJLkx4dHNfZGVjXzUKKwlweG9yCSV4bW0xMCwleG1tMgorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW01CisJbW92ZHFhCSV4bW02LDk2KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTgwKCVyMTIpLCV4bW0xMgorCWNtcHEJJDk2LCVyMTQKKwlqZQkuTHh0c19kZWNfNgorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CTk2KCVyMTIpLCV4bW0xMworCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHFhCSV4bW02LDExMiglcnNwKQorCWxlYXEJMTEyKCVyMTIpLCVyMTIKKwlweG9yCSV4bW0xMywleG1tNQorCWxlYXEJMTI4KCVyc3ApLCVyYXgKKwltb3ZsCSVlZHgsJXIxMGQKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCTAoJXJzcCksJXhtbTE1CisJcHhvcgkxNiglcnNwKSwleG1tMAorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCXB4b3IJMzIoJXJzcCksJXhtbTUKKwltb3ZkcXUJJXhtbTAsMTYoJXIxMykKKwlweG9yCTQ4KCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJcHhvcgk2NCglcnNwKSwleG1tMQorCW1vdmRxdQkleG1tMyw0OCglcjEzKQorCXB4b3IJODAoJXJzcCksJXhtbTYKKwltb3ZkcXUJJXhtbTEsNjQoJXIxMykKKwlweG9yCTk2KCVyc3ApLCV4bW0yCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJbW92ZHF1CSV4bW0yLDk2KCVyMTMpCisJbGVhcQkxMTIoJXIxMyksJXIxMworCisJbW92ZHFhCTExMiglcnNwKSwleG1tNgorCWptcAkuTHh0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTHh0c19kZWNfNjoKKwlweG9yCSV4bW0xMSwleG1tMworCWxlYXEJOTYoJXIxMiksJXIxMgorCXB4b3IJJXhtbTEyLCV4bW00CisJbGVhcQkxMjgoJXJzcCksJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKworCXB4b3IJMCglcnNwKSwleG1tMTUKKwlweG9yCTE2KCVyc3ApLCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJcHhvcgkzMiglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCXB4b3IJNDgoJXJzcCksJXhtbTMKKwltb3ZkcXUJJXhtbTUsMzIoJXIxMykKKwlweG9yCTY0KCVyc3ApLCV4bW0xCisJbW92ZHF1CSV4bW0zLDQ4KCVyMTMpCisJcHhvcgk4MCglcnNwKSwleG1tNgorCW1vdmRxdQkleG1tMSw2NCglcjEzKQorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCWxlYXEJOTYoJXIxMyksJXIxMworCisJbW92ZHFhCTk2KCVyc3ApLCV4bW02CisJam1wCS5MeHRzX2RlY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2RlY181OgorCXB4b3IJJXhtbTEwLCV4bW0yCisJbGVhcQk4MCglcjEyKSwlcjEyCisJcHhvcgkleG1tMTEsJXhtbTMKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tMworCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTMsNDgoJXIxMykKKwltb3ZkcXUJJXhtbTEsNjQoJXIxMykKKwlsZWFxCTgwKCVyMTMpLCVyMTMKKworCW1vdmRxYQk4MCglcnNwKSwleG1tNgorCWptcAkuTHh0c19kZWNfZG9uZQorLmFsaWduCTE2CisuTHh0c19kZWNfNDoKKwlweG9yCSV4bW05LCV4bW0xCisJbGVhcQk2NCglcjEyKSwlcjEyCisJcHhvcgkleG1tMTAsJXhtbTIKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tMworCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCW1vdmRxdQkleG1tMyw0OCglcjEzKQorCWxlYXEJNjQoJXIxMyksJXIxMworCisJbW92ZHFhCTY0KCVyc3ApLCV4bW02CisJam1wCS5MeHRzX2RlY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2RlY18zOgorCXB4b3IJJXhtbTgsJXhtbTAKKwlsZWFxCTQ4KCVyMTIpLCVyMTIKKwlweG9yCSV4bW05LCV4bW0xCisJbGVhcQkxMjgoJXJzcCksJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKworCXB4b3IJMCglcnNwKSwleG1tMTUKKwlweG9yCTE2KCVyc3ApLCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJcHhvcgkzMiglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCWxlYXEJNDgoJXIxMyksJXIxMworCisJbW92ZHFhCTQ4KCVyc3ApLCV4bW02CisJam1wCS5MeHRzX2RlY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2RlY18yOgorCXB4b3IJJXhtbTcsJXhtbTE1CisJbGVhcQkzMiglcjEyKSwlcjEyCisJcHhvcgkleG1tOCwleG1tMAorCWxlYXEJMTI4KCVyc3ApLCVyYXgKKwltb3ZsCSVlZHgsJXIxMGQKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCTAoJXJzcCksJXhtbTE1CisJcHhvcgkxNiglcnNwKSwleG1tMAorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCWxlYXEJMzIoJXIxMyksJXIxMworCisJbW92ZHFhCTMyKCVyc3ApLCV4bW02CisJam1wCS5MeHRzX2RlY19kb25lCisuYWxpZ24JMTYKKy5MeHRzX2RlY18xOgorCXB4b3IJJXhtbTE1LCV4bW03CisJbGVhcQkxNiglcjEyKSwlcjEyCisJbW92ZHFhCSV4bW03LDMyKCVyYnApCisJbGVhcQkzMiglcmJwKSwlcmRpCisJbGVhcQkzMiglcmJwKSwlcnNpCisJbGVhcQkoJXIxNSksJXJkeAorCWNhbGwJYWVzX25vaHdfZGVjcnlwdAorCXB4b3IJMzIoJXJicCksJXhtbTE1CisKKworCisKKworCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCWxlYXEJMTYoJXIxMyksJXIxMworCisJbW92ZHFhCTE2KCVyc3ApLCV4bW02CisKKy5MeHRzX2RlY19kb25lOgorCWFuZGwJJDE1LCVlYngKKwlqegkuTHh0c19kZWNfcmV0CisKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJLkx4dHNfbWFnaWMoJXJpcCksJXhtbTEyCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCW1vdmRxYQkleG1tNiwleG1tNQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJbW92ZHF1CSglcjEyKSwleG1tMTUKKwlweG9yCSV4bW0xMywleG1tNgorCisJbGVhcQkzMiglcmJwKSwlcmRpCisJcHhvcgkleG1tNiwleG1tMTUKKwlsZWFxCTMyKCVyYnApLCVyc2kKKwltb3ZkcWEJJXhtbTE1LDMyKCVyYnApCisJbGVhcQkoJXIxNSksJXJkeAorCWNhbGwJYWVzX25vaHdfZGVjcnlwdAorCXB4b3IJMzIoJXJicCksJXhtbTYKKwltb3ZxCSVyMTMsJXJkeAorCW1vdmRxdQkleG1tNiwoJXIxMykKKworLkx4dHNfZGVjX3N0ZWFsOgorCW1vdnpibAkxNiglcjEyKSwlZWF4CisJbW92emJsCSglcmR4KSwlZWN4CisJbGVhcQkxKCVyMTIpLCVyMTIKKwltb3ZiCSVhbCwoJXJkeCkKKwltb3ZiCSVjbCwxNiglcmR4KQorCWxlYXEJMSglcmR4KSwlcmR4CisJc3VibAkkMSwlZWJ4CisJam56CS5MeHRzX2RlY19zdGVhbAorCisJbW92ZHF1CSglcjEzKSwleG1tMTUKKwlsZWFxCTMyKCVyYnApLCVyZGkKKwlweG9yCSV4bW01LCV4bW0xNQorCWxlYXEJMzIoJXJicCksJXJzaQorCW1vdmRxYQkleG1tMTUsMzIoJXJicCkKKwlsZWFxCSglcjE1KSwlcmR4CisJY2FsbAlhZXNfbm9od19kZWNyeXB0CisJcHhvcgkzMiglcmJwKSwleG1tNQorCW1vdmRxdQkleG1tNSwoJXIxMykKKworLkx4dHNfZGVjX3JldDoKKwlsZWFxCSglcnNwKSwlcmF4CisJcHhvcgkleG1tMCwleG1tMAorLkx4dHNfZGVjX2J6ZXJvOgorCW1vdmRxYQkleG1tMCwwKCVyYXgpCisJbW92ZHFhCSV4bW0wLDE2KCVyYXgpCisJbGVhcQkzMiglcmF4KSwlcmF4CisJY21wcQklcmF4LCVyYnAKKwlqYQkuTHh0c19kZWNfYnplcm8KKworCWxlYXEJMTIwKCVyYnApLCVyYXgKKy5jZmlfZGVmX2NmYQklcmF4LDgKKwltb3ZxCS00OCglcmF4KSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyYXgpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJheCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyYXgpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbW92cQktOCglcmF4KSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCWxlYXEJKCVyYXgpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTHh0c19kZWNfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlic2Flc194dHNfZGVjcnlwdCwuLWJzYWVzX3h0c19kZWNyeXB0CisudHlwZQlfYnNhZXNfY29uc3QsQG9iamVjdAorLmFsaWduCTY0CitfYnNhZXNfY29uc3Q6CisuTE0wSVNSOgorLnF1YWQJMHgwYTBlMDIwNjA3MGIwZjAzLCAweDAwMDQwODBjMGQwMTA1MDkKKy5MSVNSTTA6CisucXVhZAkweDAxMDQwYjBlMDIwNTA4MGYsIDB4MDMwNjA5MGMwMDA3MGEwZAorLkxJU1I6CisucXVhZAkweDA1MDQwNzA2MDIwMTAwMDMsIDB4MGYwZTBkMGMwODBiMGEwOQorLkxCUzA6CisucXVhZAkweDU1NTU1NTU1NTU1NTU1NTUsIDB4NTU1NTU1NTU1NTU1NTU1NQorLkxCUzE6CisucXVhZAkweDMzMzMzMzMzMzMzMzMzMzMsIDB4MzMzMzMzMzMzMzMzMzMzMworLkxCUzI6CisucXVhZAkweDBmMGYwZjBmMGYwZjBmMGYsIDB4MGYwZjBmMGYwZjBmMGYwZgorLkxTUjoKKy5xdWFkCTB4MDUwNDA3MDYwMDAzMDIwMSwgMHgwZjBlMGQwYzBhMDkwODBiCisuTFNSTTA6CisucXVhZAkweDAzMDQwOTBlMDAwNTBhMGYsIDB4MDEwNjBiMGMwMjA3MDgwZAorLkxNMFNSOgorLnF1YWQJMHgwYTBlMDIwNjBmMDMwNzBiLCAweDAwMDQwODBjMDUwOTBkMDEKKy5MU1dQVVA6CisucXVhZAkweDA3MDYwNTA0MDMwMjAxMDAsIDB4MGMwZDBlMGYwYjBhMDkwOAorLkxTV1BVUE0wU1I6CisucXVhZAkweDBhMGQwMjA2MGMwMzA3MGIsIDB4MDAwNDA4MGYwNTA5MGUwMQorLkxBREQxOgorLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAxMDAwMDAwMDAKKy5MQUREMjoKKy5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwMjAwMDAwMDAwCisuTEFERDM6CisucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDMwMDAwMDAwMAorLkxBREQ0OgorLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDA0MDAwMDAwMDAKKy5MQURENToKKy5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwNTAwMDAwMDAwCisuTEFERDY6CisucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDYwMDAwMDAwMAorLkxBREQ3OgorLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDA3MDAwMDAwMDAKKy5MQUREODoKKy5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwODAwMDAwMDAwCisuTHh0c19tYWdpYzoKKy5sb25nCTB4ODcsMCwxLDAKKy5MbWFza3M6CisucXVhZAkweDAxMDEwMTAxMDEwMTAxMDEsIDB4MDEwMTAxMDEwMTAxMDEwMQorLnF1YWQJMHgwMjAyMDIwMjAyMDIwMjAyLCAweDAyMDIwMjAyMDIwMjAyMDIKKy5xdWFkCTB4MDQwNDA0MDQwNDA0MDQwNCwgMHgwNDA0MDQwNDA0MDQwNDA0CisucXVhZAkweDA4MDgwODA4MDgwODA4MDgsIDB4MDgwODA4MDgwODA4MDgwOAorLkxNMDoKKy5xdWFkCTB4MDIwNjBhMGUwMzA3MGIwZiwgMHgwMDA0MDgwYzAxMDUwOTBkCisuTDYzOgorLnF1YWQJMHg2MzYzNjM2MzYzNjM2MzYzLCAweDYzNjM2MzYzNjM2MzYzNjMKKy5ieXRlCTY2LDEwNSwxMTYsNDUsMTE1LDEwOCwxMDUsOTksMTAxLDEwMCwzMiw2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDcsODMsODMsODMsNjksNTEsNDQsMzIsNjksMTA5LDEwNSwxMDgsMTA1LDk3LDMyLDc1LDE5NSwxNjQsMTE1LDExMiwxMDEsMTE0LDQ0LDMyLDgwLDEwMSwxMTYsMTAxLDExNCwzMiw4Myw5OSwxMDQsMTE5LDk3LDk4LDEwMSw0NCwzMiw2NSwxMTAsMTAwLDEyMSwzMiw4MCwxMTEsMTA4LDEyMSw5NywxMDcsMTExLDExOCwwCisuYWxpZ24JNjQKKy5zaXplCV9ic2Flc19jb25zdCwuLV9ic2Flc19jb25zdAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NGQ1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODZfNjQuUwpAQCAtMCwwICsxLDE4NDcgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisuaGlkZGVuIE9QRU5TU0xfaWEzMmNhcF9QCisKKy5nbG9ibAlnY21fZ211bHRfNGJpdAorLmhpZGRlbiBnY21fZ211bHRfNGJpdAorLnR5cGUJZ2NtX2dtdWx0XzRiaXQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2djbV9nbXVsdF80Yml0OgorLmNmaV9zdGFydHByb2MJCisJcHVzaHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJc3VicQkkMjgwLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJMjgwCisuTGdtdWx0X3Byb2xvZ3VlOgorCisJbW92emJxCTE1KCVyZGkpLCVyOAorCWxlYXEJLkxyZW1fNGJpdCglcmlwKSwlcjExCisJeG9ycQklcmF4LCVyYXgKKwl4b3JxCSVyYngsJXJieAorCW1vdmIJJXI4YiwlYWwKKwltb3ZiCSVyOGIsJWJsCisJc2hsYgkkNCwlYWwKKwltb3ZxCSQxNCwlcmN4CisJbW92cQk4KCVyc2ksJXJheCwxKSwlcjgKKwltb3ZxCSglcnNpLCVyYXgsMSksJXI5CisJYW5kYgkkMHhmMCwlYmwKKwltb3ZxCSVyOCwlcmR4CisJam1wCS5Mb29wMQorCisuYWxpZ24JMTYKKy5Mb29wMToKKwlzaHJxCSQ0LCVyOAorCWFuZHEJJDB4ZiwlcmR4CisJbW92cQklcjksJXIxMAorCW1vdmIJKCVyZGksJXJjeCwxKSwlYWwKKwlzaHJxCSQ0LCVyOQorCXhvcnEJOCglcnNpLCVyYngsMSksJXI4CisJc2hscQkkNjAsJXIxMAorCXhvcnEJKCVyc2ksJXJieCwxKSwlcjkKKwltb3ZiCSVhbCwlYmwKKwl4b3JxCSglcjExLCVyZHgsOCksJXI5CisJbW92cQklcjgsJXJkeAorCXNobGIJJDQsJWFsCisJeG9ycQklcjEwLCVyOAorCWRlY3EJJXJjeAorCWpzCS5MYnJlYWsxCisKKwlzaHJxCSQ0LCVyOAorCWFuZHEJJDB4ZiwlcmR4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwlzaGxxCSQ2MCwlcjEwCisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCWFuZGIJJDB4ZjAsJWJsCisJeG9ycQkoJXIxMSwlcmR4LDgpLCVyOQorCW1vdnEJJXI4LCVyZHgKKwl4b3JxCSVyMTAsJXI4CisJam1wCS5Mb29wMQorCisuYWxpZ24JMTYKKy5MYnJlYWsxOgorCXNocnEJJDQsJXI4CisJYW5kcQkkMHhmLCVyZHgKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXNobHEJJDYwLCVyMTAKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJYW5kYgkkMHhmMCwlYmwKKwl4b3JxCSglcjExLCVyZHgsOCksJXI5CisJbW92cQklcjgsJXJkeAorCXhvcnEJJXIxMCwlcjgKKworCXNocnEJJDQsJXI4CisJYW5kcQkkMHhmLCVyZHgKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwl4b3JxCTgoJXJzaSwlcmJ4LDEpLCVyOAorCXNobHEJJDYwLCVyMTAKKwl4b3JxCSglcnNpLCVyYngsMSksJXI5CisJeG9ycQklcjEwLCVyOAorCXhvcnEJKCVyMTEsJXJkeCw4KSwlcjkKKworCWJzd2FwcQklcjgKKwlic3dhcHEJJXI5CisJbW92cQklcjgsOCglcmRpKQorCW1vdnEJJXI5LCglcmRpKQorCisJbGVhcQkyODArNDgoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCW1vdnEJLTgoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlsZWFxCSglcnNpKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxnbXVsdF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWdjbV9nbXVsdF80Yml0LC4tZ2NtX2dtdWx0XzRiaXQKKy5nbG9ibAlnY21fZ2hhc2hfNGJpdAorLmhpZGRlbiBnY21fZ2hhc2hfNGJpdAorLnR5cGUJZ2NtX2doYXNoXzRiaXQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2djbV9naGFzaF80Yml0OgorLmNmaV9zdGFydHByb2MJCisJcHVzaHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJc3VicQkkMjgwLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJMjgwCisuTGdoYXNoX3Byb2xvZ3VlOgorCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKwlzdWJxCSQtMTI4LCVyc2kKKwlsZWFxCTE2KzEyOCglcnNwKSwlcmJwCisJeG9ybAklZWR4LCVlZHgKKwltb3ZxCTArMC0xMjgoJXJzaSksJXI4CisJbW92cQkwKzgtMTI4KCVyc2kpLCVyYXgKKwltb3ZiCSVhbCwlZGwKKwlzaHJxCSQ0LCVyYXgKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwltb3ZxCTE2KzAtMTI4KCVyc2kpLCVyOQorCXNobGIJJDQsJWRsCisJbW92cQkxNis4LTEyOCglcnNpKSwlcmJ4CisJc2hscQkkNjAsJXIxMAorCW1vdmIJJWRsLDAoJXJzcCkKKwlvcnEJJXIxMCwlcmF4CisJbW92YgklYmwsJWRsCisJc2hycQkkNCwlcmJ4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJbW92cQklcjgsMCglcmJwKQorCW1vdnEJMzIrMC0xMjgoJXJzaSksJXI4CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYXgsMC0xMjgoJXJicCkKKwltb3ZxCTMyKzgtMTI4KCVyc2kpLCVyYXgKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsMSglcnNwKQorCW9ycQklcjEwLCVyYngKKwltb3ZiCSVhbCwlZGwKKwlzaHJxCSQ0LCVyYXgKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOSw4KCVyYnApCisJbW92cQk0OCswLTEyOCglcnNpKSwlcjkKKwlzaGxiCSQ0LCVkbAorCW1vdnEJJXJieCw4LTEyOCglcmJwKQorCW1vdnEJNDgrOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCwyKCVyc3ApCisJb3JxCSVyMTAsJXJheAorCW1vdmIJJWJsLCVkbAorCXNocnEJJDQsJXJieAorCW1vdnEJJXI5LCVyMTAKKwlzaHJxCSQ0LCVyOQorCW1vdnEJJXI4LDE2KCVyYnApCisJbW92cQk2NCswLTEyOCglcnNpKSwlcjgKKwlzaGxiCSQ0LCVkbAorCW1vdnEJJXJheCwxNi0xMjgoJXJicCkKKwltb3ZxCTY0KzgtMTI4KCVyc2kpLCVyYXgKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsMyglcnNwKQorCW9ycQklcjEwLCVyYngKKwltb3ZiCSVhbCwlZGwKKwlzaHJxCSQ0LCVyYXgKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOSwyNCglcmJwKQorCW1vdnEJODArMC0xMjgoJXJzaSksJXI5CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYngsMjQtMTI4KCVyYnApCisJbW92cQk4MCs4LTEyOCglcnNpKSwlcmJ4CisJc2hscQkkNjAsJXIxMAorCW1vdmIJJWRsLDQoJXJzcCkKKwlvcnEJJXIxMCwlcmF4CisJbW92YgklYmwsJWRsCisJc2hycQkkNCwlcmJ4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJbW92cQklcjgsMzIoJXJicCkKKwltb3ZxCTk2KzAtMTI4KCVyc2kpLCVyOAorCXNobGIJJDQsJWRsCisJbW92cQklcmF4LDMyLTEyOCglcmJwKQorCW1vdnEJOTYrOC0xMjgoJXJzaSksJXJheAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCw1KCVyc3ApCisJb3JxCSVyMTAsJXJieAorCW1vdmIJJWFsLCVkbAorCXNocnEJJDQsJXJheAorCW1vdnEJJXI4LCVyMTAKKwlzaHJxCSQ0LCVyOAorCW1vdnEJJXI5LDQwKCVyYnApCisJbW92cQkxMTIrMC0xMjgoJXJzaSksJXI5CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYngsNDAtMTI4KCVyYnApCisJbW92cQkxMTIrOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCw2KCVyc3ApCisJb3JxCSVyMTAsJXJheAorCW1vdmIJJWJsLCVkbAorCXNocnEJJDQsJXJieAorCW1vdnEJJXI5LCVyMTAKKwlzaHJxCSQ0LCVyOQorCW1vdnEJJXI4LDQ4KCVyYnApCisJbW92cQkxMjgrMC0xMjgoJXJzaSksJXI4CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYXgsNDgtMTI4KCVyYnApCisJbW92cQkxMjgrOC0xMjgoJXJzaSksJXJheAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCw3KCVyc3ApCisJb3JxCSVyMTAsJXJieAorCW1vdmIJJWFsLCVkbAorCXNocnEJJDQsJXJheAorCW1vdnEJJXI4LCVyMTAKKwlzaHJxCSQ0LCVyOAorCW1vdnEJJXI5LDU2KCVyYnApCisJbW92cQkxNDQrMC0xMjgoJXJzaSksJXI5CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYngsNTYtMTI4KCVyYnApCisJbW92cQkxNDQrOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCw4KCVyc3ApCisJb3JxCSVyMTAsJXJheAorCW1vdmIJJWJsLCVkbAorCXNocnEJJDQsJXJieAorCW1vdnEJJXI5LCVyMTAKKwlzaHJxCSQ0LCVyOQorCW1vdnEJJXI4LDY0KCVyYnApCisJbW92cQkxNjArMC0xMjgoJXJzaSksJXI4CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYXgsNjQtMTI4KCVyYnApCisJbW92cQkxNjArOC0xMjgoJXJzaSksJXJheAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCw5KCVyc3ApCisJb3JxCSVyMTAsJXJieAorCW1vdmIJJWFsLCVkbAorCXNocnEJJDQsJXJheAorCW1vdnEJJXI4LCVyMTAKKwlzaHJxCSQ0LCVyOAorCW1vdnEJJXI5LDcyKCVyYnApCisJbW92cQkxNzYrMC0xMjgoJXJzaSksJXI5CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYngsNzItMTI4KCVyYnApCisJbW92cQkxNzYrOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCwxMCglcnNwKQorCW9ycQklcjEwLCVyYXgKKwltb3ZiCSVibCwlZGwKKwlzaHJxCSQ0LCVyYngKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwltb3ZxCSVyOCw4MCglcmJwKQorCW1vdnEJMTkyKzAtMTI4KCVyc2kpLCVyOAorCXNobGIJJDQsJWRsCisJbW92cQklcmF4LDgwLTEyOCglcmJwKQorCW1vdnEJMTkyKzgtMTI4KCVyc2kpLCVyYXgKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsMTEoJXJzcCkKKwlvcnEJJXIxMCwlcmJ4CisJbW92YgklYWwsJWRsCisJc2hycQkkNCwlcmF4CisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJbW92cQklcjksODgoJXJicCkKKwltb3ZxCTIwOCswLTEyOCglcnNpKSwlcjkKKwlzaGxiCSQ0LCVkbAorCW1vdnEJJXJieCw4OC0xMjgoJXJicCkKKwltb3ZxCTIwOCs4LTEyOCglcnNpKSwlcmJ4CisJc2hscQkkNjAsJXIxMAorCW1vdmIJJWRsLDEyKCVyc3ApCisJb3JxCSVyMTAsJXJheAorCW1vdmIJJWJsLCVkbAorCXNocnEJJDQsJXJieAorCW1vdnEJJXI5LCVyMTAKKwlzaHJxCSQ0LCVyOQorCW1vdnEJJXI4LDk2KCVyYnApCisJbW92cQkyMjQrMC0xMjgoJXJzaSksJXI4CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYXgsOTYtMTI4KCVyYnApCisJbW92cQkyMjQrOC0xMjgoJXJzaSksJXJheAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCwxMyglcnNwKQorCW9ycQklcjEwLCVyYngKKwltb3ZiCSVhbCwlZGwKKwlzaHJxCSQ0LCVyYXgKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOSwxMDQoJXJicCkKKwltb3ZxCTI0MCswLTEyOCglcnNpKSwlcjkKKwlzaGxiCSQ0LCVkbAorCW1vdnEJJXJieCwxMDQtMTI4KCVyYnApCisJbW92cQkyNDArOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCwxNCglcnNwKQorCW9ycQklcjEwLCVyYXgKKwltb3ZiCSVibCwlZGwKKwlzaHJxCSQ0LCVyYngKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwltb3ZxCSVyOCwxMTIoJXJicCkKKwlzaGxiCSQ0LCVkbAorCW1vdnEJJXJheCwxMTItMTI4KCVyYnApCisJc2hscQkkNjAsJXIxMAorCW1vdmIJJWRsLDE1KCVyc3ApCisJb3JxCSVyMTAsJXJieAorCW1vdnEJJXI5LDEyMCglcmJwKQorCW1vdnEJJXJieCwxMjAtMTI4KCVyYnApCisJYWRkcQkkLTEyOCwlcnNpCisJbW92cQk4KCVyZGkpLCVyOAorCW1vdnEJMCglcmRpKSwlcjkKKwlhZGRxCSVyMTQsJXIxNQorCWxlYXEJLkxyZW1fOGJpdCglcmlwKSwlcjExCisJam1wCS5Mb3V0ZXJfbG9vcAorLmFsaWduCTE2CisuTG91dGVyX2xvb3A6CisJeG9ycQkoJXIxNCksJXI5CisJbW92cQk4KCVyMTQpLCVyZHgKKwlsZWFxCTE2KCVyMTQpLCVyMTQKKwl4b3JxCSVyOCwlcmR4CisJbW92cQklcjksKCVyZGkpCisJbW92cQklcmR4LDgoJXJkaSkKKwlzaHJxCSQzMiwlcmR4CisJeG9ycQklcmF4LCVyYXgKKwlyb2xsCSQ4LCVlZHgKKwltb3ZiCSVkbCwlYWwKKwltb3Z6YmwJJWRsLCVlYngKKwlzaGxiCSQ0LCVhbAorCXNocmwJJDQsJWVieAorCXJvbGwJJDgsJWVkeAorCW1vdnEJOCglcnNpLCVyYXgsMSksJXI4CisJbW92cQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCXNocmwJJDQsJWVjeAorCXhvcnEJJXI4LCVyMTIKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxMmIsJXIxMgorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJbW92emJsCSVkbCwlZWJ4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJjeCwxKSwlcjEzCisJc2hybAkkNCwlZWJ4CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEyLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTNiLCVyMTMKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyY3gsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJjeCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCXNocmwJJDQsJWVjeAorCXNobHEJJDQ4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMywlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEyYiwlcjEyCisJbW92bAk4KCVyZGkpLCVlZHgKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyYngsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJieCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTIsMiksJXIxMgorCW1vdnpibAklZGwsJWVieAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyY3gsMSksJXIxMworCXNocmwJJDQsJWVieAorCXNobHEJJDQ4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMiwlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEzYiwlcjEzCisJc2hycQkkOCwlcjkKKwl4b3JxCS0xMjgoJXJicCwlcmN4LDgpLCVyOAorCXNobHEJJDU2LCVyMTAKKwl4b3JxCSglcmJwLCVyY3gsOCksJXI5CisJcm9sbAkkOCwlZWR4CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJeG9ycQklcjEwLCVyOAorCW1vdnp3cQkoJXIxMSwlcjEzLDIpLCVyMTMKKwltb3Z6YmwJJWRsLCVlY3gKKwlzaGxiCSQ0LCVhbAorCW1vdnpicQkoJXJzcCwlcmJ4LDEpLCVyMTIKKwlzaHJsCSQ0LCVlY3gKKwlzaGxxCSQ0OCwlcjEzCisJeG9ycQklcjgsJXIxMgorCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTMsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxMmIsJXIxMgorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJbW92emJsCSVkbCwlZWJ4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJjeCwxKSwlcjEzCisJc2hybAkkNCwlZWJ4CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEyLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTNiLCVyMTMKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyY3gsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJjeCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCXNocmwJJDQsJWVjeAorCXNobHEJJDQ4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMywlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEyYiwlcjEyCisJbW92bAk0KCVyZGkpLCVlZHgKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyYngsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJieCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTIsMiksJXIxMgorCW1vdnpibAklZGwsJWVieAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyY3gsMSksJXIxMworCXNocmwJJDQsJWVieAorCXNobHEJJDQ4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMiwlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEzYiwlcjEzCisJc2hycQkkOCwlcjkKKwl4b3JxCS0xMjgoJXJicCwlcmN4LDgpLCVyOAorCXNobHEJJDU2LCVyMTAKKwl4b3JxCSglcmJwLCVyY3gsOCksJXI5CisJcm9sbAkkOCwlZWR4CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJeG9ycQklcjEwLCVyOAorCW1vdnp3cQkoJXIxMSwlcjEzLDIpLCVyMTMKKwltb3Z6YmwJJWRsLCVlY3gKKwlzaGxiCSQ0LCVhbAorCW1vdnpicQkoJXJzcCwlcmJ4LDEpLCVyMTIKKwlzaHJsCSQ0LCVlY3gKKwlzaGxxCSQ0OCwlcjEzCisJeG9ycQklcjgsJXIxMgorCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTMsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxMmIsJXIxMgorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJbW92emJsCSVkbCwlZWJ4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJjeCwxKSwlcjEzCisJc2hybAkkNCwlZWJ4CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEyLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTNiLCVyMTMKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyY3gsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJjeCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCXNocmwJJDQsJWVjeAorCXNobHEJJDQ4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMywlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEyYiwlcjEyCisJbW92bAkwKCVyZGkpLCVlZHgKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyYngsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJieCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTIsMiksJXIxMgorCW1vdnpibAklZGwsJWVieAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyY3gsMSksJXIxMworCXNocmwJJDQsJWVieAorCXNobHEJJDQ4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMiwlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEzYiwlcjEzCisJc2hycQkkOCwlcjkKKwl4b3JxCS0xMjgoJXJicCwlcmN4LDgpLCVyOAorCXNobHEJJDU2LCVyMTAKKwl4b3JxCSglcmJwLCVyY3gsOCksJXI5CisJcm9sbAkkOCwlZWR4CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJeG9ycQklcjEwLCVyOAorCW1vdnp3cQkoJXIxMSwlcjEzLDIpLCVyMTMKKwltb3Z6YmwJJWRsLCVlY3gKKwlzaGxiCSQ0LCVhbAorCW1vdnpicQkoJXJzcCwlcmJ4LDEpLCVyMTIKKwlzaHJsCSQ0LCVlY3gKKwlzaGxxCSQ0OCwlcjEzCisJeG9ycQklcjgsJXIxMgorCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTMsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxMmIsJXIxMgorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJbW92emJsCSVkbCwlZWJ4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJjeCwxKSwlcjEzCisJc2hybAkkNCwlZWJ4CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEyLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTNiLCVyMTMKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyY3gsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJjeCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCWFuZGwJJDI0MCwlZWN4CisJc2hscQkkNDgsJXIxMworCXhvcnEJJXI4LCVyMTIKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEzLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTJiLCVyMTIKKwltb3ZsCS00KCVyZGkpLCVlZHgKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyYngsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJieCw4KSwlcjkKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXIxMCwlcjgKKwl4b3JxCSVyMTIsJXI5CisJbW92emJxCSVyOGIsJXIxMworCXNocnEJJDQsJXI4CisJbW92cQklcjksJXIxMAorCXNobGIJJDQsJXIxM2IKKwlzaHJxCSQ0LCVyOQorCXhvcnEJOCglcnNpLCVyY3gsMSksJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCXNobHEJJDYwLCVyMTAKKwl4b3JxCSglcnNpLCVyY3gsMSksJXI5CisJeG9ycQklcjEwLCVyOAorCXNobHEJJDQ4LCVyMTMKKwlic3dhcHEJJXI4CisJeG9ycQklcjEzLCVyOQorCWJzd2FwcQklcjkKKwljbXBxCSVyMTUsJXIxNAorCWpiCS5Mb3V0ZXJfbG9vcAorCW1vdnEJJXI4LDgoJXJkaSkKKwltb3ZxCSVyOSwoJXJkaSkKKworCWxlYXEJMjgwKzQ4KCVyc3ApLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJMCglcnNpKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxnaGFzaF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWdjbV9naGFzaF80Yml0LC4tZ2NtX2doYXNoXzRiaXQKKy5nbG9ibAlnY21faW5pdF9jbG11bAorLmhpZGRlbiBnY21faW5pdF9jbG11bAorLnR5cGUJZ2NtX2luaXRfY2xtdWwsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2djbV9pbml0X2NsbXVsOgorLkxfaW5pdF9jbG11bDoKKwltb3ZkcXUJKCVyc2kpLCV4bW0yCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMgorCisKKwlwc2h1ZmQJJDI1NSwleG1tMiwleG1tNAorCW1vdmRxYQkleG1tMiwleG1tMworCXBzbGxxCSQxLCV4bW0yCisJcHhvcgkleG1tNSwleG1tNQorCXBzcmxxCSQ2MywleG1tMworCXBjbXBndGQJJXhtbTQsJXhtbTUKKwlwc2xsZHEJJDgsJXhtbTMKKwlwb3IJJXhtbTMsJXhtbTIKKworCisJcGFuZAkuTDB4MWMyX3BvbHlub21pYWwoJXJpcCksJXhtbTUKKwlweG9yCSV4bW01LCV4bW0yCisKKworCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTYKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW02CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1OCw2OCwxOTQsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIwMiwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIyMiwwCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tMywleG1tNAorCXBzcmxkcQkkOCwleG1tMworCXBzbGxkcQkkOCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW00LCV4bW0wCisKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCisKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW00CisJcHNybHEJJDUsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0wCisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0wCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMworCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTQKKwlweG9yCSV4bW0yLCV4bW0zCisJbW92ZHF1CSV4bW0yLDAoJXJkaSkKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHF1CSV4bW0wLDE2KCVyZGkpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI3LDgKKwltb3ZkcXUJJXhtbTQsMzIoJXJkaSkKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIyLDAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisKKworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTUKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIyLDAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisKKworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDc4LCV4bW01LCV4bW0zCisJcHNodWZkCSQ3OCwleG1tMCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTMKKwltb3ZkcXUJJXhtbTUsNDgoJXJkaSkKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHF1CSV4bW0wLDY0KCVyZGkpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI3LDgKKwltb3ZkcXUJJXhtbTQsODAoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCWdjbV9pbml0X2NsbXVsLC4tZ2NtX2luaXRfY2xtdWwKKy5nbG9ibAlnY21fZ211bHRfY2xtdWwKKy5oaWRkZW4gZ2NtX2dtdWx0X2NsbXVsCisudHlwZQlnY21fZ211bHRfY2xtdWwsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2djbV9nbXVsdF9jbG11bDoKKy5MX2dtdWx0X2NsbXVsOgorCW1vdmRxdQkoJXJkaSksJXhtbTAKKwltb3ZkcWEJLkxic3dhcF9tYXNrKCVyaXApLCV4bW01CisJbW92ZHF1CSglcnNpKSwleG1tMgorCW1vdmRxdQkzMiglcnNpKSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1OCw2OCwxOTQsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIwMiwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIyMCwwCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tMywleG1tNAorCXBzcmxkcQkkOCwleG1tMworCXBzbGxkcQkkOCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW00LCV4bW0wCisKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCisKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW00CisJcHNybHEJJDUsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0wCisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKwltb3ZkcXUJJXhtbTAsKCVyZGkpCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlnY21fZ211bHRfY2xtdWwsLi1nY21fZ211bHRfY2xtdWwKKy5nbG9ibAlnY21fZ2hhc2hfY2xtdWwKKy5oaWRkZW4gZ2NtX2doYXNoX2NsbXVsCisudHlwZQlnY21fZ2hhc2hfY2xtdWwsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK2djbV9naGFzaF9jbG11bDoKKy5MX2doYXNoX2NsbXVsOgorCW1vdmRxYQkuTGJzd2FwX21hc2soJXJpcCksJXhtbTEwCisKKwltb3ZkcXUJKCVyZGkpLCV4bW0wCisJbW92ZHF1CSglcnNpKSwleG1tMgorCW1vdmRxdQkzMiglcnNpKSwleG1tNworLmJ5dGUJMTAyLDY1LDE1LDU2LDAsMTk0CisKKwlzdWJxCSQweDEwLCVyY3gKKwlqegkuTG9kZF90YWlsCisKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTYKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyYXgKKwltb3ZsCTQoJXJheCksJWVheAorCWNtcHEJJDB4MzAsJXJjeAorCWpiCS5Mc2tpcDR4CisKKwlhbmRsCSQ3MTMwMzE2OCwlZWF4CisJY21wbAkkNDE5NDMwNCwlZWF4CisJamUJLkxza2lwNHgKKworCXN1YnEJJDB4MzAsJXJjeAorCW1vdnEJJDB4QTA0MDYwODAyMEMwRTAwMCwlcmF4CisJbW92ZHF1CTQ4KCVyc2kpLCV4bW0xNAorCW1vdmRxdQk2NCglcnNpKSwleG1tMTUKKworCisKKworCW1vdmRxdQk0OCglcmR4KSwleG1tMworCW1vdmRxdQkzMiglcmR4KSwleG1tMTEKKy5ieXRlCTEwMiw2NSwxNSw1NiwwLDIxOAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjE4CisJbW92ZHFhCSV4bW0zLCV4bW01CisJcHNodWZkCSQ3OCwleG1tMywleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMTgsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIzNCwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIzMSwwCisKKwltb3ZkcWEJJXhtbTExLCV4bW0xMworCXBzaHVmZAkkNzgsJXhtbTExLCV4bW0xMgorCXB4b3IJJXhtbTExLCV4bW0xMgorLmJ5dGUJMTAyLDY4LDE1LDU4LDY4LDIyMiwwCisuYnl0ZQkxMDIsNjgsMTUsNTgsNjgsMjM4LDE3CisuYnl0ZQkxMDIsNjgsMTUsNTgsNjgsMjMxLDE2CisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEzLCV4bW01CisJbW92dXBzCTgwKCVyc2kpLCV4bW03CisJeG9ycHMJJXhtbTEyLCV4bW00CisKKwltb3ZkcXUJMTYoJXJkeCksJXhtbTExCisJbW92ZHF1CTAoJXJkeCksJXhtbTgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIxOAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMTk0CisJbW92ZHFhCSV4bW0xMSwleG1tMTMKKwlwc2h1ZmQJJDc4LCV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW04LCV4bW0wCisJcHhvcgkleG1tMTEsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTgsNjgsMjIyLDAKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW04CisJcHhvcgkleG1tMCwleG1tOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDY4LDIzOCwxNworLmJ5dGUJMTAyLDY4LDE1LDU4LDY4LDIzMSwwCisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEzLCV4bW01CisKKwlsZWFxCTY0KCVyZHgpLCVyZHgKKwlzdWJxCSQweDQwLCVyY3gKKwlqYwkuTHRhaWw0eAorCisJam1wCS5MbW9kNF9sb29wCisuYWxpZ24JMzIKKy5MbW9kNF9sb29wOgorLmJ5dGUJMTAyLDY1LDE1LDU4LDY4LDE5OSwwCisJeG9ycHMJJXhtbTEyLCV4bW00CisJbW92ZHF1CTQ4KCVyZHgpLCV4bW0xMQorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjE4CisuYnl0ZQkxMDIsNjUsMTUsNTgsNjgsMjA3LDE3CisJeG9ycHMJJXhtbTMsJXhtbTAKKwltb3ZkcXUJMzIoJXJkeCksJXhtbTMKKwltb3ZkcWEJJXhtbTExLCV4bW0xMworLmJ5dGUJMTAyLDY4LDE1LDU4LDY4LDE5OSwxNgorCXBzaHVmZAkkNzgsJXhtbTExLCV4bW0xMgorCXhvcnBzCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMTEsJXhtbTEyCisuYnl0ZQkxMDIsNjUsMTUsNTYsMCwyMTgKKwltb3Z1cHMJMzIoJXJzaSksJXhtbTcKKwl4b3JwcwkleG1tNCwleG1tOAorLmJ5dGUJMTAyLDY4LDE1LDU4LDY4LDIxOCwwCisJcHNodWZkCSQ3OCwleG1tMywleG1tNAorCisJcHhvcgkleG1tMCwleG1tOAorCW1vdmRxYQkleG1tMywleG1tNQorCXB4b3IJJXhtbTEsJXhtbTgKKwlweG9yCSV4bW0zLCV4bW00CisJbW92ZHFhCSV4bW04LCV4bW05CisuYnl0ZQkxMDIsNjgsMTUsNTgsNjgsMjM0LDE3CisJcHNsbGRxCSQ4LCV4bW04CisJcHNybGRxCSQ4LCV4bW05CisJcHhvcgkleG1tOCwleG1tMAorCW1vdmRxYQkuTDdfbWFzayglcmlwKSwleG1tOAorCXB4b3IJJXhtbTksJXhtbTEKKy5ieXRlCTEwMiw3NiwxNSwxMTAsMjAwCisKKwlwYW5kCSV4bW0wLCV4bW04CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMDAKKwlweG9yCSV4bW0wLCV4bW05CisuYnl0ZQkxMDIsNjgsMTUsNTgsNjgsMjMxLDAKKwlwc2xscQkkNTcsJXhtbTkKKwltb3ZkcWEJJXhtbTksJXhtbTgKKwlwc2xsZHEJJDgsJXhtbTkKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMjIsMAorCXBzcmxkcQkkOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW04LCV4bW0xCisJbW92ZHF1CTAoJXJkeCksJXhtbTgKKworCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQxLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjM4LDE3CisJeG9ycHMJJXhtbTExLCV4bW0zCisJbW92ZHF1CTE2KCVyZHgpLCV4bW0xMQorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjE4CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjMxLDE2CisJeG9ycHMJJXhtbTEzLCV4bW01CisJbW92dXBzCTgwKCVyc2kpLCV4bW03CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwxOTQKKwlweG9yCSV4bW05LCV4bW0xCisJcHhvcgkleG1tMCwleG1tOQorCXBzcmxxCSQ1LCV4bW0wCisKKwltb3ZkcWEJJXhtbTExLCV4bW0xMworCXB4b3IJJXhtbTEyLCV4bW00CisJcHNodWZkCSQ3OCwleG1tMTEsJXhtbTEyCisJcHhvcgkleG1tOSwleG1tMAorCXB4b3IJJXhtbTgsJXhtbTEKKwlweG9yCSV4bW0xMSwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCw2OCwyMjIsMAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMQorLmJ5dGUJMTAyLDY5LDE1LDU4LDY4LDIzOCwxNworCXhvcnBzCSV4bW0xMSwleG1tMworCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTgKKwlweG9yCSV4bW0wLCV4bW04CisKKy5ieXRlCTEwMiw2OCwxNSw1OCw2OCwyMzEsMAorCXhvcnBzCSV4bW0xMywleG1tNQorCisJbGVhcQk2NCglcmR4KSwlcmR4CisJc3VicQkkMHg0MCwlcmN4CisJam5jCS5MbW9kNF9sb29wCisKKy5MdGFpbDR4OgorLmJ5dGUJMTAyLDY1LDE1LDU4LDY4LDE5OSwwCisuYnl0ZQkxMDIsNjUsMTUsNTgsNjgsMjA3LDE3CisuYnl0ZQkxMDIsNjgsMTUsNTgsNjgsMTk5LDE2CisJeG9ycHMJJXhtbTEyLCV4bW00CisJeG9ycHMJJXhtbTMsJXhtbTAKKwl4b3JwcwkleG1tNSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTEKKwlweG9yCSV4bW00LCV4bW04CisKKwlweG9yCSV4bW0xLCV4bW04CisJcHhvcgkleG1tMCwleG1tMQorCisJbW92ZHFhCSV4bW04LCV4bW05CisJcHNybGRxCSQ4LCV4bW04CisJcHNsbGRxCSQ4LCV4bW05CisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTksJXhtbTAKKworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisKKworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwlhZGRxCSQweDQwLCVyY3gKKwlqegkuTGRvbmUKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTcKKwlzdWJxCSQweDEwLCVyY3gKKwlqegkuTG9kZF90YWlsCisuTHNraXA0eDoKKworCisKKworCisJbW92ZHF1CSglcmR4KSwleG1tOAorCW1vdmRxdQkxNiglcmR4KSwleG1tMworLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMTk0CisuYnl0ZQkxMDIsNjUsMTUsNTYsMCwyMTgKKwlweG9yCSV4bW04LCV4bW0wCisKKwltb3ZkcWEJJXhtbTMsJXhtbTUKKwlwc2h1ZmQJJDc4LCV4bW0zLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIxOCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjM0LDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjMxLDAKKworCWxlYXEJMzIoJXJkeCksJXJkeAorCW5vcAorCXN1YnEJJDB4MjAsJXJjeAorCWpiZQkuTGV2ZW5fdGFpbAorCW5vcAorCWptcAkuTG1vZF9sb29wCisKKy5hbGlnbgkzMgorLkxtb2RfbG9vcDoKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW00CisJcHhvcgkleG1tMCwleG1tNAorCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk4LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDYsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzEsMTYKKworCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW01LCV4bW0xCisJbW92ZHF1CSglcmR4KSwleG1tOQorCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIwMgorCW1vdmRxdQkxNiglcmR4KSwleG1tMworCisJcHhvcgkleG1tMSwleG1tOAorCXB4b3IJJXhtbTksJXhtbTEKKwlweG9yCSV4bW04LCV4bW00CisuYnl0ZQkxMDIsNjUsMTUsNTYsMCwyMTgKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZHEJJDgsJXhtbTgKKwlwc2xsZHEJJDgsJXhtbTQKKwlweG9yCSV4bW04LCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCisJbW92ZHFhCSV4bW0zLCV4bW01CisKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwltb3ZkcWEJJXhtbTAsJXhtbTgKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMTgsMAorCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tOCwleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tOAorCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTAKKwlwc2h1ZmQJJDc4LCV4bW01LCV4bW00CisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTUsJXhtbTQKKworCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQxLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjM0LDE3CisJcHhvcgkleG1tOSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTkKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTksJXhtbTAKKwlsZWFxCTMyKCVyZHgpLCVyZHgKKwlwc3JscQkkMSwleG1tMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIzMSwwCisJcHhvcgkleG1tMSwleG1tMAorCisJc3VicQkkMHgyMCwlcmN4CisJamEJLkxtb2RfbG9vcAorCisuTGV2ZW5fdGFpbDoKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW00CisJcHhvcgkleG1tMCwleG1tNAorCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk4LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDYsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzEsMTYKKworCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMCwleG1tOAorCXB4b3IJJXhtbTEsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGRxCSQ4LCV4bW04CisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisKKworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwl0ZXN0cQklcmN4LCVyY3gKKwlqbnoJLkxkb25lCisKKy5Mb2RkX3RhaWw6CisJbW92ZHF1CSglcmR4KSwleG1tOAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMTk0CisJcHhvcgkleG1tOCwleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk0LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDIsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMjMsMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTMsJXhtbTQKKwlwc3JsZHEJJDgsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCisJbW92ZHFhCSV4bW0wLCV4bW00CisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbHEJJDUsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbHEJJDEsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbHEJJDU3LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ4LCV4bW0wCisJcHNybGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTEKKworCisJbW92ZHFhCSV4bW0wLCV4bW00CisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNAorCXBzcmxxCSQ1LCV4bW0wCisJcHhvcgkleG1tNCwleG1tMAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMAorLkxkb25lOgorLmJ5dGUJMTAyLDY1LDE1LDU2LDAsMTk0CisJbW92ZHF1CSV4bW0wLCglcmRpKQorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJZ2NtX2doYXNoX2NsbXVsLC4tZ2NtX2doYXNoX2NsbXVsCisuZ2xvYmwJZ2NtX2luaXRfYXZ4CisuaGlkZGVuIGdjbV9pbml0X2F2eAorLnR5cGUJZ2NtX2luaXRfYXZ4LEBmdW5jdGlvbgorLmFsaWduCTMyCitnY21faW5pdF9hdng6CisJdnplcm91cHBlcgorCisJdm1vdmRxdQkoJXJzaSksJXhtbTIKKwl2cHNodWZkCSQ3OCwleG1tMiwleG1tMgorCisKKwl2cHNodWZkCSQyNTUsJXhtbTIsJXhtbTQKKwl2cHNybHEJJDYzLCV4bW0yLCV4bW0zCisJdnBzbGxxCSQxLCV4bW0yLCV4bW0yCisJdnB4b3IJJXhtbTUsJXhtbTUsJXhtbTUKKwl2cGNtcGd0ZAkleG1tNCwleG1tNSwleG1tNQorCXZwc2xsZHEJJDgsJXhtbTMsJXhtbTMKKwl2cG9yCSV4bW0zLCV4bW0yLCV4bW0yCisKKworCXZwYW5kCS5MMHgxYzJfcG9seW5vbWlhbCglcmlwKSwleG1tNSwleG1tNQorCXZweG9yCSV4bW01LCV4bW0yLCV4bW0yCisKKwl2cHVucGNraHFkcQkleG1tMiwleG1tMiwleG1tNgorCXZtb3ZkcWEJJXhtbTIsJXhtbTAKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCW1vdnEJJDQsJXIxMAorCWptcAkuTGluaXRfc3RhcnRfYXZ4CisuYWxpZ24JMzIKKy5MaW5pdF9sb29wX2F2eDoKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tNQorCXZtb3ZkcXUJJXhtbTUsLTE2KCVyZGkpCisJdnB1bnBja2hxZHEJJXhtbTAsJXhtbTAsJXhtbTMKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTIsJXhtbTAsJXhtbTEKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0yLCV4bW0wLCV4bW0wCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMywleG1tMworCXZweG9yCSV4bW0wLCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKworCXZwc2xsZHEJJDgsJXhtbTMsJXhtbTQKKwl2cHNybGRxCSQ4LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTQsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2xscQkkNTcsJXhtbTAsJXhtbTMKKwl2cHNsbHEJJDYyLCV4bW0wLCV4bW00CisJdnB4b3IJJXhtbTMsJXhtbTQsJXhtbTQKKwl2cHNsbHEJJDYzLCV4bW0wLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTQsJXhtbTQKKwl2cHNsbGRxCSQ4LCV4bW00LCV4bW0zCisJdnBzcmxkcQkkOCwleG1tNCwleG1tNAorCXZweG9yCSV4bW0zLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZwc3JscQkkMSwleG1tMCwleG1tNAorCXZweG9yCSV4bW0wLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTQsJXhtbTAsJXhtbTAKKwl2cHNybHEJJDUsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXZwc3JscQkkMSwleG1tMCwleG1tMAorCXZweG9yCSV4bW0xLCV4bW0wLCV4bW0wCisuTGluaXRfc3RhcnRfYXZ4OgorCXZtb3ZkcWEJJXhtbTAsJXhtbTUKKwl2cHVucGNraHFkcQkleG1tMCwleG1tMCwleG1tMworCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMiwleG1tMCwleG1tMQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTIsJXhtbTAsJXhtbTAKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTAsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCisJdnBzbGxkcQkkOCwleG1tMywleG1tNAorCXZwc3JsZHEJJDgsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxxCSQ1NywleG1tMCwleG1tMworCXZwc2xscQkkNjIsJXhtbTAsJXhtbTQKKwl2cHhvcgkleG1tMywleG1tNCwleG1tNAorCXZwc2xscQkkNjMsJXhtbTAsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tNCwleG1tNAorCXZwc2xsZHEJJDgsJXhtbTQsJXhtbTMKKwl2cHNybGRxCSQ4LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTMsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdnBzcmxxCSQxLCV4bW0wLCV4bW00CisJdnB4b3IJJXhtbTAsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXZwc3JscQkkNSwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0wLCV4bW0wCisJdnBzcmxxCSQxLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKwl2cHNodWZkCSQ3OCwleG1tNSwleG1tMworCXZwc2h1ZmQJJDc4LCV4bW0wLCV4bW00CisJdnB4b3IJJXhtbTUsJXhtbTMsJXhtbTMKKwl2bW92ZHF1CSV4bW01LDAoJXJkaSkKKwl2cHhvcgkleG1tMCwleG1tNCwleG1tNAorCXZtb3ZkcXUJJXhtbTAsMTYoJXJkaSkKKwlsZWFxCTQ4KCVyZGkpLCVyZGkKKwlzdWJxCSQxLCVyMTAKKwlqbnoJLkxpbml0X2xvb3BfYXZ4CisKKwl2cGFsaWducgkkOCwleG1tNCwleG1tMywleG1tNQorCXZtb3ZkcXUJJXhtbTUsLTE2KCVyZGkpCisKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlnY21faW5pdF9hdngsLi1nY21faW5pdF9hdngKKy5nbG9ibAlnY21fZ211bHRfYXZ4CisuaGlkZGVuIGdjbV9nbXVsdF9hdngKKy50eXBlCWdjbV9nbXVsdF9hdngsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK2djbV9nbXVsdF9hdng6CisJam1wCS5MX2dtdWx0X2NsbXVsCisuc2l6ZQlnY21fZ211bHRfYXZ4LC4tZ2NtX2dtdWx0X2F2eAorLmdsb2JsCWdjbV9naGFzaF9hdngKKy5oaWRkZW4gZ2NtX2doYXNoX2F2eAorLnR5cGUJZ2NtX2doYXNoX2F2eCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorZ2NtX2doYXNoX2F2eDoKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CSglcmRpKSwleG1tMTAKKwlsZWFxCS5MMHgxYzJfcG9seW5vbWlhbCglcmlwKSwlcjEwCisJbGVhcQk2NCglcnNpKSwlcnNpCisJdm1vdmRxdQkuTGJzd2FwX21hc2soJXJpcCksJXhtbTEzCisJdnBzaHVmYgkleG1tMTMsJXhtbTEwLCV4bW0xMAorCWNtcHEJJDB4ODAsJXJjeAorCWpiCS5Mc2hvcnRfYXZ4CisJc3VicQkkMHg4MCwlcmN4CisKKwl2bW92ZHF1CTExMiglcmR4KSwleG1tMTQKKwl2bW92ZHF1CTAtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE0CisJdm1vdmRxdQkzMi02NCglcnNpKSwleG1tNworCisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZtb3ZkcXUJOTYoJXJkeCksJXhtbTE1CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTQsJXhtbTAKKwl2cHhvcgkleG1tMTQsJXhtbTksJXhtbTkKKwl2cHNodWZiCSV4bW0xMywleG1tMTUsJXhtbTE1CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2bW92ZHF1CTE2LTY0KCVyc2kpLCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZtb3ZkcXUJODAoJXJkeCksJXhtbTE0CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOSwleG1tMgorCXZweG9yCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNAorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0zCisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW00CisJdm1vdmRxdQk0OC02NCglcnNpKSwleG1tNgorCXZweG9yCSV4bW0xNCwleG1tOSwleG1tOQorCXZtb3ZkcXUJNjQoJXJkeCksJXhtbTE1CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOCwleG1tNQorCXZtb3ZkcXUJODAtNjQoJXJzaSksJXhtbTcKKworCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNSwleG1tMTUKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE0LCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cHVucGNraHFkcQkleG1tMTUsJXhtbTE1LCV4bW04CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2bW92ZHF1CTY0LTY0KCVyc2kpLCV4bW02CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW05LCV4bW0yCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTQ4KCVyZHgpLCV4bW0xNAorCXZweG9yCSV4bW0zLCV4bW0wLCV4bW0wCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTMKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tNAorCXZtb3ZkcXUJOTYtNjQoJXJzaSksJXhtbTYKKwl2cHhvcgkleG1tNSwleG1tMiwleG1tMgorCXZwdW5wY2tocWRxCSV4bW0xNCwleG1tMTQsJXhtbTkKKwl2cGNsbXVscWRxCSQweDEwLCV4bW03LCV4bW04LCV4bW01CisJdm1vdmRxdQkxMjgtNjQoJXJzaSksJXhtbTcKKwl2cHhvcgkleG1tMTQsJXhtbTksJXhtbTkKKworCXZtb3ZkcXUJMzIoJXJkeCksJXhtbTE1CisJdnB4b3IJJXhtbTAsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNCwleG1tMAorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnBzaHVmYgkleG1tMTMsJXhtbTE1LCV4bW0xNQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE0LCV4bW0xCisJdm1vdmRxdQkxMTItNjQoJXJzaSksJXhtbTYKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW05LCV4bW0yCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE2KCVyZHgpLCV4bW0xNAorCXZweG9yCSV4bW0zLCV4bW0wLCV4bW0wCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTMKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tNAorCXZtb3ZkcXUJMTQ0LTY0KCVyc2kpLCV4bW02CisJdnB4b3IJJXhtbTUsJXhtbTIsJXhtbTIKKwl2cHVucGNraHFkcQkleG1tMTQsJXhtbTE0LCV4bW05CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOCwleG1tNQorCXZtb3ZkcXUJMTc2LTY0KCVyc2kpLCV4bW03CisJdnB4b3IJJXhtbTE0LCV4bW05LCV4bW05CisKKwl2bW92ZHF1CSglcmR4KSwleG1tMTUKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE0LCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cHNodWZiCSV4bW0xMywleG1tMTUsJXhtbTE1CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2bW92ZHF1CTE2MC02NCglcnNpKSwleG1tNgorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOSwleG1tMgorCisJbGVhcQkxMjgoJXJkeCksJXJkeAorCWNtcHEJJDB4ODAsJXJjeAorCWpiCS5MdGFpbF9hdngKKworCXZweG9yCSV4bW0xMCwleG1tMTUsJXhtbTE1CisJc3VicQkkMHg4MCwlcmN4CisJam1wCS5Mb29wOHhfYXZ4CisKKy5hbGlnbgkzMgorLkxvb3A4eF9hdng6CisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZtb3ZkcXUJMTEyKCVyZHgpLCV4bW0xNAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTEwCisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNAorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTUsJXhtbTExCisJdm1vdmRxdQkwLTY0KCVyc2kpLCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOCwleG1tMTIKKwl2bW92ZHF1CTMyLTY0KCVyc2kpLCV4bW03CisJdnB4b3IJJXhtbTE0LCV4bW05LCV4bW05CisKKwl2bW92ZHF1CTk2KCVyZHgpLCV4bW0xNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE0LCV4bW0wCisJdnB4b3IJJXhtbTMsJXhtbTEwLCV4bW0xMAorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNSwleG1tMTUKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNCwleG1tMQorCXZ4b3JwcwkleG1tNCwleG1tMTEsJXhtbTExCisJdm1vdmRxdQkxNi02NCglcnNpKSwleG1tNgorCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW05LCV4bW0yCisJdnB4b3IJJXhtbTUsJXhtbTEyLCV4bW0xMgorCXZ4b3JwcwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJODAoJXJkeCksJXhtbTE0CisJdnB4b3IJJXhtbTEwLCV4bW0xMiwleG1tMTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNSwleG1tMworCXZweG9yCSV4bW0xMSwleG1tMTIsJXhtbTEyCisJdnBzbGxkcQkkOCwleG1tMTIsJXhtbTkKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW00CisJdnBzcmxkcQkkOCwleG1tMTIsJXhtbTEyCisJdnB4b3IJJXhtbTksJXhtbTEwLCV4bW0xMAorCXZtb3ZkcXUJNDgtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE0CisJdnhvcnBzCSV4bW0xMiwleG1tMTEsJXhtbTExCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cHVucGNraHFkcQkleG1tMTQsJXhtbTE0LCV4bW05CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOCwleG1tNQorCXZtb3ZkcXUJODAtNjQoJXJzaSksJXhtbTcKKwl2cHhvcgkleG1tMTQsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCisJdm1vdmRxdQk2NCglcmR4KSwleG1tMTUKKwl2cGFsaWducgkkOCwleG1tMTAsJXhtbTEwLCV4bW0xMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE0LCV4bW0wCisJdnBzaHVmYgkleG1tMTMsJXhtbTE1LCV4bW0xNQorCXZweG9yCSV4bW0zLCV4bW0wLCV4bW0wCisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2bW92ZHF1CTY0LTY0KCVyc2kpLCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOSwleG1tMgorCXZ4b3JwcwkleG1tMTUsJXhtbTgsJXhtbTgKKwl2cHhvcgkleG1tNSwleG1tMiwleG1tMgorCisJdm1vdmRxdQk0OCglcmR4KSwleG1tMTQKKwl2cGNsbXVscWRxCSQweDEwLCglcjEwKSwleG1tMTAsJXhtbTEwCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTMKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE0CisJdnB4b3IJJXhtbTAsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tNAorCXZtb3ZkcXUJOTYtNjQoJXJzaSksJXhtbTYKKwl2cHVucGNraHFkcQkleG1tMTQsJXhtbTE0LCV4bW05CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLCV4bW03LCV4bW04LCV4bW01CisJdm1vdmRxdQkxMjgtNjQoJXJzaSksJXhtbTcKKwl2cHhvcgkleG1tMTQsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCisJdm1vdmRxdQkzMiglcmR4KSwleG1tMTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNCwleG1tMAorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNSwleG1tMTUKKwl2cHhvcgkleG1tMywleG1tMCwleG1tMAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE0LCV4bW0xCisJdm1vdmRxdQkxMTItNjQoJXJzaSksJXhtbTYKKwl2cHVucGNraHFkcQkleG1tMTUsJXhtbTE1LCV4bW04CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW05LCV4bW0yCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisJdnB4b3IJJXhtbTUsJXhtbTIsJXhtbTIKKwl2eG9ycHMJJXhtbTEyLCV4bW0xMCwleG1tMTAKKworCXZtb3ZkcXUJMTYoJXJkeCksJXhtbTE0CisJdnBhbGlnbnIJJDgsJXhtbTEwLCV4bW0xMCwleG1tMTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNSwleG1tMworCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTQKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW00CisJdm1vdmRxdQkxNDQtNjQoJXJzaSksJXhtbTYKKwl2cGNsbXVscWRxCSQweDEwLCglcjEwKSwleG1tMTAsJXhtbTEwCisJdnhvcnBzCSV4bW0xMSwleG1tMTIsJXhtbTEyCisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOCwleG1tNQorCXZtb3ZkcXUJMTc2LTY0KCVyc2kpLCV4bW03CisJdnB4b3IJJXhtbTE0LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKworCXZtb3ZkcXUJKCVyZHgpLCV4bW0xNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE0LCV4bW0wCisJdnBzaHVmYgkleG1tMTMsJXhtbTE1LCV4bW0xNQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE0LCV4bW0xCisJdm1vdmRxdQkxNjAtNjQoJXJzaSksJXhtbTYKKwl2cHhvcgkleG1tMTIsJXhtbTE1LCV4bW0xNQorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTcsJXhtbTksJXhtbTIKKwl2cHhvcgkleG1tMTAsJXhtbTE1LCV4bW0xNQorCisJbGVhcQkxMjgoJXJkeCksJXJkeAorCXN1YnEJJDB4ODAsJXJjeAorCWpuYwkuTG9vcDh4X2F2eAorCisJYWRkcQkkMHg4MCwlcmN4CisJam1wCS5MdGFpbF9ub194b3JfYXZ4CisKKy5hbGlnbgkzMgorLkxzaG9ydF9hdng6CisJdm1vdmRxdQktMTYoJXJkeCwlcmN4LDEpLCV4bW0xNAorCWxlYXEJKCVyZHgsJXJjeCwxKSwlcmR4CisJdm1vdmRxdQkwLTY0KCVyc2kpLCV4bW02CisJdm1vdmRxdQkzMi02NCglcnNpKSwleG1tNworCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTUKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTMKKwl2bW92ZHFhCSV4bW0xLCV4bW00CisJdm1vdmRxYQkleG1tMiwleG1tNQorCXN1YnEJJDB4MTAsJXJjeAorCWp6CS5MdGFpbF9hdngKKworCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0wCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisJdm1vdmRxdQktMzIoJXJkeCksJXhtbTE0CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tMQorCXZtb3ZkcXUJMTYtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE1CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW04LCV4bW0yCisJdnBzcmxkcQkkOCwleG1tNywleG1tNworCXN1YnEJJDB4MTAsJXJjeAorCWp6CS5MdGFpbF9hdngKKworCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0wCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisJdm1vdmRxdQktNDgoJXJkeCksJXhtbTE0CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tMQorCXZtb3ZkcXUJNDgtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE1CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW04LCV4bW0yCisJdm1vdmRxdQk4MC02NCglcnNpKSwleG1tNworCXN1YnEJJDB4MTAsJXJjeAorCWp6CS5MdGFpbF9hdngKKworCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0wCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisJdm1vdmRxdQktNjQoJXJkeCksJXhtbTE0CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tMQorCXZtb3ZkcXUJNjQtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE1CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW04LCV4bW0yCisJdnBzcmxkcQkkOCwleG1tNywleG1tNworCXN1YnEJJDB4MTAsJXJjeAorCWp6CS5MdGFpbF9hdngKKworCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0wCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisJdm1vdmRxdQktODAoJXJkeCksJXhtbTE0CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tMQorCXZtb3ZkcXUJOTYtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE1CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW04LCV4bW0yCisJdm1vdmRxdQkxMjgtNjQoJXJzaSksJXhtbTcKKwlzdWJxCSQweDEwLCVyY3gKKwlqegkuTHRhaWxfYXZ4CisKKwl2cHVucGNraHFkcQkleG1tMTUsJXhtbTE1LCV4bW04CisJdnB4b3IJJXhtbTAsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNSwleG1tMAorCXZweG9yCSV4bW0xNSwleG1tOCwleG1tOAorCXZtb3ZkcXUJLTk2KCVyZHgpLCV4bW0xNAorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTUsJXhtbTEKKwl2bW92ZHF1CTExMi02NCglcnNpKSwleG1tNgorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTUKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTcsJXhtbTgsJXhtbTIKKwl2cHNybGRxCSQ4LCV4bW03LCV4bW03CisJc3VicQkkMHgxMCwlcmN4CisJanoJLkx0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CS0xMTIoJXJkeCksJXhtbTE0CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tMQorCXZtb3ZkcXUJMTQ0LTY0KCVyc2kpLCV4bW02CisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNQorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOCwleG1tMgorCXZtb3ZxCTE4NC02NCglcnNpKSwleG1tNworCXN1YnEJJDB4MTAsJXJjeAorCWptcAkuTHRhaWxfYXZ4CisKKy5hbGlnbgkzMgorLkx0YWlsX2F2eDoKKwl2cHhvcgkleG1tMTAsJXhtbTE1LCV4bW0xNQorLkx0YWlsX25vX3hvcl9hdng6CisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTgsJXhtbTgKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW04LCV4bW0yCisKKwl2bW92ZHF1CSglcjEwKSwleG1tMTIKKworCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0xMAorCXZweG9yCSV4bW0xLCV4bW00LCV4bW0xMQorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisKKwl2cHhvcgkleG1tMTAsJXhtbTUsJXhtbTUKKwl2cHhvcgkleG1tMTEsJXhtbTUsJXhtbTUKKwl2cHNsbGRxCSQ4LCV4bW01LCV4bW05CisJdnBzcmxkcQkkOCwleG1tNSwleG1tNQorCXZweG9yCSV4bW05LCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tNSwleG1tMTEsJXhtbTExCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMiwleG1tMTAsJXhtbTkKKwl2cGFsaWducgkkOCwleG1tMTAsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW05LCV4bW0xMCwleG1tMTAKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEyLCV4bW0xMCwleG1tOQorCXZwYWxpZ25yCSQ4LCV4bW0xMCwleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTExLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tOSwleG1tMTAsJXhtbTEwCisKKwljbXBxCSQwLCVyY3gKKwlqbmUJLkxzaG9ydF9hdngKKworCXZwc2h1ZmIJJXhtbTEzLCV4bW0xMCwleG1tMTAKKwl2bW92ZHF1CSV4bW0xMCwoJXJkaSkKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlnY21fZ2hhc2hfYXZ4LC4tZ2NtX2doYXNoX2F2eAorLmFsaWduCTY0CisuTGJzd2FwX21hc2s6CisuYnl0ZQkxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSwwCisuTDB4MWMyX3BvbHlub21pYWw6CisuYnl0ZQkxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwweGMyCisuTDdfbWFzazoKKy5sb25nCTcsMCw3LDAKKy5MN19tYXNrX3BvbHk6CisubG9uZwk3LDAsNDUwLDAKKy5hbGlnbgk2NAorLnR5cGUJLkxyZW1fNGJpdCxAb2JqZWN0CisuTHJlbV80Yml0OgorLmxvbmcJMCwwLDAsNDcxODU5MjAwLDAsOTQzNzE4NDAwLDAsNjEwMjcxMjMyCisubG9uZwkwLDE4ODc0MzY4MDAsMCwxODIyNDI1MDg4LDAsMTIyMDU0MjQ2NCwwLDE0MjM5NjYyMDgKKy5sb25nCTAsMzc3NDg3MzYwMCwwLDQyNDY3MzI4MDAsMCwzNjQ0ODUwMTc2LDAsMzMxMTQwMzAwOAorLmxvbmcJMCwyNDQxMDg0OTI4LDAsMjM3NjA3MzIxNiwwLDI4NDc5MzI0MTYsMCwzMDUxMzU2MTYwCisudHlwZQkuTHJlbV84Yml0LEBvYmplY3QKKy5McmVtXzhiaXQ6CisudmFsdWUJMHgwMDAwLDB4MDFDMiwweDAzODQsMHgwMjQ2LDB4MDcwOCwweDA2Q0EsMHgwNDhDLDB4MDU0RQorLnZhbHVlCTB4MEUxMCwweDBGRDIsMHgwRDk0LDB4MEM1NiwweDA5MTgsMHgwOERBLDB4MEE5QywweDBCNUUKKy52YWx1ZQkweDFDMjAsMHgxREUyLDB4MUZBNCwweDFFNjYsMHgxQjI4LDB4MUFFQSwweDE4QUMsMHgxOTZFCisudmFsdWUJMHgxMjMwLDB4MTNGMiwweDExQjQsMHgxMDc2LDB4MTUzOCwweDE0RkEsMHgxNkJDLDB4MTc3RQorLnZhbHVlCTB4Mzg0MCwweDM5ODIsMHgzQkM0LDB4M0EwNiwweDNGNDgsMHgzRThBLDB4M0NDQywweDNEMEUKKy52YWx1ZQkweDM2NTAsMHgzNzkyLDB4MzVENCwweDM0MTYsMHgzMTU4LDB4MzA5QSwweDMyREMsMHgzMzFFCisudmFsdWUJMHgyNDYwLDB4MjVBMiwweDI3RTQsMHgyNjI2LDB4MjM2OCwweDIyQUEsMHgyMEVDLDB4MjEyRQorLnZhbHVlCTB4MkE3MCwweDJCQjIsMHgyOUY0LDB4MjgzNiwweDJENzgsMHgyQ0JBLDB4MkVGQywweDJGM0UKKy52YWx1ZQkweDcwODAsMHg3MTQyLDB4NzMwNCwweDcyQzYsMHg3Nzg4LDB4NzY0QSwweDc0MEMsMHg3NUNFCisudmFsdWUJMHg3RTkwLDB4N0Y1MiwweDdEMTQsMHg3Q0Q2LDB4Nzk5OCwweDc4NUEsMHg3QTFDLDB4N0JERQorLnZhbHVlCTB4NkNBMCwweDZENjIsMHg2RjI0LDB4NkVFNiwweDZCQTgsMHg2QTZBLDB4NjgyQywweDY5RUUKKy52YWx1ZQkweDYyQjAsMHg2MzcyLDB4NjEzNCwweDYwRjYsMHg2NUI4LDB4NjQ3QSwweDY2M0MsMHg2N0ZFCisudmFsdWUJMHg0OEMwLDB4NDkwMiwweDRCNDQsMHg0QTg2LDB4NEZDOCwweDRFMEEsMHg0QzRDLDB4NEQ4RQorLnZhbHVlCTB4NDZEMCwweDQ3MTIsMHg0NTU0LDB4NDQ5NiwweDQxRDgsMHg0MDFBLDB4NDI1QywweDQzOUUKKy52YWx1ZQkweDU0RTAsMHg1NTIyLDB4NTc2NCwweDU2QTYsMHg1M0U4LDB4NTIyQSwweDUwNkMsMHg1MUFFCisudmFsdWUJMHg1QUYwLDB4NUIzMiwweDU5NzQsMHg1OEI2LDB4NURGOCwweDVDM0EsMHg1RTdDLDB4NUZCRQorLnZhbHVlCTB4RTEwMCwweEUwQzIsMHhFMjg0LDB4RTM0NiwweEU2MDgsMHhFN0NBLDB4RTU4QywweEU0NEUKKy52YWx1ZQkweEVGMTAsMHhFRUQyLDB4RUM5NCwweEVENTYsMHhFODE4LDB4RTlEQSwweEVCOUMsMHhFQTVFCisudmFsdWUJMHhGRDIwLDB4RkNFMiwweEZFQTQsMHhGRjY2LDB4RkEyOCwweEZCRUEsMHhGOUFDLDB4Rjg2RQorLnZhbHVlCTB4RjMzMCwweEYyRjIsMHhGMEI0LDB4RjE3NiwweEY0MzgsMHhGNUZBLDB4RjdCQywweEY2N0UKKy52YWx1ZQkweEQ5NDAsMHhEODgyLDB4REFDNCwweERCMDYsMHhERTQ4LDB4REY4QSwweEREQ0MsMHhEQzBFCisudmFsdWUJMHhENzUwLDB4RDY5MiwweEQ0RDQsMHhENTE2LDB4RDA1OCwweEQxOUEsMHhEM0RDLDB4RDIxRQorLnZhbHVlCTB4QzU2MCwweEM0QTIsMHhDNkU0LDB4QzcyNiwweEMyNjgsMHhDM0FBLDB4QzFFQywweEMwMkUKKy52YWx1ZQkweENCNzAsMHhDQUIyLDB4QzhGNCwweEM5MzYsMHhDQzc4LDB4Q0RCQSwweENGRkMsMHhDRTNFCisudmFsdWUJMHg5MTgwLDB4OTA0MiwweDkyMDQsMHg5M0M2LDB4OTY4OCwweDk3NEEsMHg5NTBDLDB4OTRDRQorLnZhbHVlCTB4OUY5MCwweDlFNTIsMHg5QzE0LDB4OURENiwweDk4OTgsMHg5OTVBLDB4OUIxQywweDlBREUKKy52YWx1ZQkweDhEQTAsMHg4QzYyLDB4OEUyNCwweDhGRTYsMHg4QUE4LDB4OEI2QSwweDg5MkMsMHg4OEVFCisudmFsdWUJMHg4M0IwLDB4ODI3MiwweDgwMzQsMHg4MUY2LDB4ODRCOCwweDg1N0EsMHg4NzNDLDB4ODZGRQorLnZhbHVlCTB4QTlDMCwweEE4MDIsMHhBQTQ0LDB4QUI4NiwweEFFQzgsMHhBRjBBLDB4QUQ0QywweEFDOEUKKy52YWx1ZQkweEE3RDAsMHhBNjEyLDB4QTQ1NCwweEE1OTYsMHhBMEQ4LDB4QTExQSwweEEzNUMsMHhBMjlFCisudmFsdWUJMHhCNUUwLDB4QjQyMiwweEI2NjQsMHhCN0E2LDB4QjJFOCwweEIzMkEsMHhCMTZDLDB4QjBBRQorLnZhbHVlCTB4QkJGMCwweEJBMzIsMHhCODc0LDB4QjlCNiwweEJDRjgsMHhCRDNBLDB4QkY3QywweEJFQkUKKworLmJ5dGUJNzEsNzIsNjUsODMsNzIsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5hbGlnbgk2NAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9tZDUteDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9tZDUteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmNjUwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL21kNS14ODZfNjQuUwpAQCAtMCwwICsxLDY3MSBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKy5hbGlnbgkxNgorCisuZ2xvYmwJbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisuaGlkZGVuIG1kNV9ibG9ja19hc21fZGF0YV9vcmRlcgorLnR5cGUJbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyLEBmdW5jdGlvbgorbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyOgorCXB1c2hxCSVyYnAKKwlwdXNocQklcmJ4CisJcHVzaHEJJXIxMgorCXB1c2hxCSVyMTQKKwlwdXNocQklcjE1CisuTHByb2xvZ3VlOgorCisKKworCisJbW92cQklcmRpLCVyYnAKKwlzaGxxCSQ2LCVyZHgKKwlsZWFxCSglcnNpLCVyZHgsMSksJXJkaQorCW1vdmwJMCglcmJwKSwlZWF4CisJbW92bAk0KCVyYnApLCVlYngKKwltb3ZsCTgoJXJicCksJWVjeAorCW1vdmwJMTIoJXJicCksJWVkeAorCisKKworCisKKworCisJY21wcQklcmRpLCVyc2kKKwlqZQkuTGVuZAorCisKKy5MbG9vcDoKKwltb3ZsCSVlYXgsJXI4ZAorCW1vdmwJJWVieCwlcjlkCisJbW92bAklZWN4LCVyMTRkCisJbW92bAklZWR4LCVyMTVkCisJbW92bAkwKCVyc2kpLCVyMTBkCisJbW92bAklZWR4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJbGVhbAktNjgwODc2OTM2KCVyYXgsJXIxMCwxKSwlZWF4CisJYW5kbAklZWJ4LCVyMTFkCisJeG9ybAklZWR4LCVyMTFkCisJbW92bAk0KCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWF4CisJcm9sbAkkNywlZWF4CisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYngsJXIxMWQKKwlsZWFsCS0zODk1NjQ1ODYoJXJkeCwlcjEwLDEpLCVlZHgKKwlhbmRsCSVlYXgsJXIxMWQKKwl4b3JsCSVlY3gsJXIxMWQKKwltb3ZsCTgoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMiwlZWR4CisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJXIxMWQKKwlsZWFsCTYwNjEwNTgxOSglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCW1vdmwJMTIoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlY3gKKwlyb2xsCSQxNywlZWN4CisJbW92bAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwl4b3JsCSVlZHgsJXIxMWQKKwlsZWFsCS0xMDQ0NTI1MzMwKCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJbW92bAkxNiglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIyLCVlYngKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCXhvcmwJJWVjeCwlcjExZAorCWxlYWwJLTE3NjQxODg5NyglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCW1vdmwJMjAoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ3LCVlYXgKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVieCwlcjExZAorCWxlYWwJMTIwMDA4MDQyNiglcmR4LCVyMTAsMSksJWVkeAorCWFuZGwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCW1vdmwJMjQoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMiwlZWR4CisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJXIxMWQKKwlsZWFsCS0xNDczMjMxMzQxKCVyY3gsJXIxMCwxKSwlZWN4CisJYW5kbAklZWR4LCVyMTFkCisJeG9ybAklZWJ4LCVyMTFkCisJbW92bAkyOCglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE3LCVlY3gKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCXhvcmwJJWVkeCwlcjExZAorCWxlYWwJLTQ1NzA1OTgzKCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJbW92bAkzMiglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIyLCVlYngKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCXhvcmwJJWVjeCwlcjExZAorCWxlYWwJMTc3MDAzNTQxNiglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCW1vdmwJMzYoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ3LCVlYXgKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVieCwlcjExZAorCWxlYWwJLTE5NTg0MTQ0MTcoJXJkeCwlcjEwLDEpLCVlZHgKKwlhbmRsCSVlYXgsJXIxMWQKKwl4b3JsCSVlY3gsJXIxMWQKKwltb3ZsCTQwKCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWR4CisJcm9sbAkkMTIsJWVkeAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJWVheCwlZWR4CisJeG9ybAklZWF4LCVyMTFkCisJbGVhbAktNDIwNjMoJXJjeCwlcjEwLDEpLCVlY3gKKwlhbmRsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwltb3ZsCTQ0KCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWN4CisJcm9sbAkkMTcsJWVjeAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJWVkeCwlZWN4CisJeG9ybAklZWR4LCVyMTFkCisJbGVhbAktMTk5MDQwNDE2MiglcmJ4LCVyMTAsMSksJWVieAorCWFuZGwJJWVjeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCW1vdmwJNDgoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlYngKKwlyb2xsCSQyMiwlZWJ4CisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKwl4b3JsCSVlY3gsJXIxMWQKKwlsZWFsCTE4MDQ2MDM2ODIoJXJheCwlcjEwLDEpLCVlYXgKKwlhbmRsCSVlYngsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwltb3ZsCTUyKCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWF4CisJcm9sbAkkNywlZWF4CisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYngsJXIxMWQKKwlsZWFsCS00MDM0MTEwMSglcmR4LCVyMTAsMSksJWVkeAorCWFuZGwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCW1vdmwJNTYoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMiwlZWR4CisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJXIxMWQKKwlsZWFsCS0xNTAyMDAyMjkwKCVyY3gsJXIxMCwxKSwlZWN4CisJYW5kbAklZWR4LCVyMTFkCisJeG9ybAklZWJ4LCVyMTFkCisJbW92bAk2MCglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE3LCVlY3gKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCXhvcmwJJWVkeCwlcjExZAorCWxlYWwJMTIzNjUzNTMyOSglcmJ4LCVyMTAsMSksJWVieAorCWFuZGwJJWVjeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCW1vdmwJMCglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIyLCVlYngKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJNCglcnNpKSwlcjEwZAorCW1vdmwJJWVkeCwlcjExZAorCW1vdmwJJWVkeCwlcjEyZAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xNjU3OTY1MTAoJXJheCwlcjEwLDEpLCVlYXgKKwlhbmRsCSVlYngsJXIxMmQKKwlhbmRsCSVlY3gsJXIxMWQKKwltb3ZsCTI0KCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklcjEyZCwlZWF4CisJbW92bAklZWN4LCVyMTJkCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJ4LCVlYXgKKwlub3RsCSVyMTFkCisJbGVhbAktMTA2OTUwMTYzMiglcmR4LCVyMTAsMSksJWVkeAorCWFuZGwJJWVheCwlcjEyZAorCWFuZGwJJWVieCwlcjExZAorCW1vdmwJNDQoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKwltb3ZsCSVlYngsJXIxMmQKKwlyb2xsCSQ5LCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCW5vdGwJJXIxMWQKKwlsZWFsCTY0MzcxNzcxMyglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjEyZAorCWFuZGwJJWVheCwlcjExZAorCW1vdmwJMCglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJXIxMmQsJWVjeAorCW1vdmwJJWVheCwlcjEyZAorCXJvbGwJJDE0LCVlY3gKKwlhZGRsCSVlZHgsJWVjeAorCW5vdGwJJXIxMWQKKwlsZWFsCS0zNzM4OTczMDIoJXJieCwlcjEwLDEpLCVlYngKKwlhbmRsCSVlY3gsJXIxMmQKKwlhbmRsCSVlZHgsJXIxMWQKKwltb3ZsCTIwKCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklcjEyZCwlZWJ4CisJbW92bAklZWR4LCVyMTJkCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisJbm90bAklcjExZAorCWxlYWwJLTcwMTU1ODY5MSglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjEyZAorCWFuZGwJJWVjeCwlcjExZAorCW1vdmwJNDAoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVyMTJkLCVlYXgKKwltb3ZsCSVlY3gsJXIxMmQKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCW5vdGwJJXIxMWQKKwlsZWFsCTM4MDE2MDgzKCVyZHgsJXIxMCwxKSwlZWR4CisJYW5kbAklZWF4LCVyMTJkCisJYW5kbAklZWJ4LCVyMTFkCisJbW92bAk2MCglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCW1vdmwJJWVieCwlcjEyZAorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisJbm90bAklcjExZAorCWxlYWwJLTY2MDQ3ODMzNSglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjEyZAorCWFuZGwJJWVheCwlcjExZAorCW1vdmwJMTYoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTJkLCVlY3gKKwltb3ZsCSVlYXgsJXIxMmQKKwlyb2xsCSQxNCwlZWN4CisJYWRkbAklZWR4LCVlY3gKKwlub3RsCSVyMTFkCisJbGVhbAktNDA1NTM3ODQ4KCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTJkCisJYW5kbAklZWR4LCVyMTFkCisJbW92bAkzNiglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMmQsJWVieAorCW1vdmwJJWVkeCwlcjEyZAorCXJvbGwJJDIwLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCW5vdGwJJXIxMWQKKwlsZWFsCTU2ODQ0NjQzOCglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjEyZAorCWFuZGwJJWVjeCwlcjExZAorCW1vdmwJNTYoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVyMTJkLCVlYXgKKwltb3ZsCSVlY3gsJXIxMmQKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xMDE5ODAzNjkwKCVyZHgsJXIxMCwxKSwlZWR4CisJYW5kbAklZWF4LCVyMTJkCisJYW5kbAklZWJ4LCVyMTFkCisJbW92bAkxMiglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCW1vdmwJJWVieCwlcjEyZAorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisJbm90bAklcjExZAorCWxlYWwJLTE4NzM2Mzk2MSglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjEyZAorCWFuZGwJJWVheCwlcjExZAorCW1vdmwJMzIoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTJkLCVlY3gKKwltb3ZsCSVlYXgsJXIxMmQKKwlyb2xsCSQxNCwlZWN4CisJYWRkbAklZWR4LCVlY3gKKwlub3RsCSVyMTFkCisJbGVhbAkxMTYzNTMxNTAxKCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTJkCisJYW5kbAklZWR4LCVyMTFkCisJbW92bAk1MiglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMmQsJWVieAorCW1vdmwJJWVkeCwlcjEyZAorCXJvbGwJJDIwLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xNDQ0NjgxNDY3KCVyYXgsJXIxMCwxKSwlZWF4CisJYW5kbAklZWJ4LCVyMTJkCisJYW5kbAklZWN4LCVyMTFkCisJbW92bAk4KCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklcjEyZCwlZWF4CisJbW92bAklZWN4LCVyMTJkCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJ4LCVlYXgKKwlub3RsCSVyMTFkCisJbGVhbAktNTE0MDM3ODQoJXJkeCwlcjEwLDEpLCVlZHgKKwlhbmRsCSVlYXgsJXIxMmQKKwlhbmRsCSVlYngsJXIxMWQKKwltb3ZsCTI4KCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklcjEyZCwlZWR4CisJbW92bAklZWJ4LCVyMTJkCisJcm9sbAkkOSwlZWR4CisJYWRkbAklZWF4LCVlZHgKKwlub3RsCSVyMTFkCisJbGVhbAkxNzM1MzI4NDczKCVyY3gsJXIxMCwxKSwlZWN4CisJYW5kbAklZWR4LCVyMTJkCisJYW5kbAklZWF4LCVyMTFkCisJbW92bAk0OCglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJXIxMmQsJWVjeAorCW1vdmwJJWVheCwlcjEyZAorCXJvbGwJJDE0LCVlY3gKKwlhZGRsCSVlZHgsJWVjeAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xOTI2NjA3NzM0KCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTJkCisJYW5kbAklZWR4LCVyMTFkCisJbW92bAkwKCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklcjEyZCwlZWJ4CisJbW92bAklZWR4LCVyMTJkCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAkyMCglcnNpKSwlcjEwZAorCW1vdmwJJWVjeCwlcjExZAorCWxlYWwJLTM3ODU1OCglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJMzIoJXJzaSksJXIxMGQKKwl4b3JsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTIwMjI1NzQ0NjMoJXJkeCwlcjEwLDEpLCVlZHgKKwltb3ZsCTQ0KCVyc2kpLCVyMTBkCisJeG9ybAklZWN4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklcjExZCwlZWR4CisJcm9sbAkkMTEsJWVkeAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJWVheCwlZWR4CisJbGVhbAkxODM5MDMwNTYyKCVyY3gsJXIxMCwxKSwlZWN4CisJbW92bAk1NiglcnNpKSwlcjEwZAorCXhvcmwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE2LCVlY3gKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCWxlYWwJLTM1MzA5NTU2KCVyYngsJXIxMCwxKSwlZWJ4CisJbW92bAk0KCVyc2kpLCVyMTBkCisJeG9ybAklZWF4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklcjExZCwlZWJ4CisJcm9sbAkkMjMsJWVieAorCW1vdmwJJWVjeCwlcjExZAorCWFkZGwJJWVjeCwlZWJ4CisJbGVhbAktMTUzMDk5MjA2MCglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJMTYoJXJzaSksJXIxMGQKKwl4b3JsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJMTI3Mjg5MzM1MyglcmR4LCVyMTAsMSksJWVkeAorCW1vdmwJMjgoJXJzaSksJXIxMGQKKwl4b3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMSwlZWR4CisJbW92bAklZWF4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwlsZWFsCS0xNTU0OTc2MzIoJXJjeCwlcjEwLDEpLCVlY3gKKwltb3ZsCTQwKCVyc2kpLCVyMTBkCisJeG9ybAklZWJ4LCVyMTFkCisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklcjExZCwlZWN4CisJcm9sbAkkMTYsJWVjeAorCW1vdmwJJWVkeCwlcjExZAorCWFkZGwJJWVkeCwlZWN4CisJbGVhbAktMTA5NDczMDY0MCglcmJ4LCVyMTAsMSksJWVieAorCW1vdmwJNTIoJXJzaSksJXIxMGQKKwl4b3JsCSVlYXgsJXIxMWQKKwl4b3JsCSVlY3gsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYngKKwlyb2xsCSQyMywlZWJ4CisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKwlsZWFsCTY4MTI3OTE3NCglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJMCglcnNpKSwlcjEwZAorCXhvcmwJJWVkeCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJXIxMWQsJWVheAorCXJvbGwJJDQsJWVheAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJWVieCwlZWF4CisJbGVhbAktMzU4NTM3MjIyKCVyZHgsJXIxMCwxKSwlZWR4CisJbW92bAkxMiglcnNpKSwlcjEwZAorCXhvcmwJJWVjeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJXIxMWQsJWVkeAorCXJvbGwJJDExLCVlZHgKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVlYXgsJWVkeAorCWxlYWwJLTcyMjUyMTk3OSglcmN4LCVyMTAsMSksJWVjeAorCW1vdmwJMjQoJXJzaSksJXIxMGQKKwl4b3JsCSVlYngsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlY3gKKwlyb2xsCSQxNiwlZWN4CisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCTc2MDI5MTg5KCVyYngsJXIxMCwxKSwlZWJ4CisJbW92bAkzNiglcnNpKSwlcjEwZAorCXhvcmwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIzLCVlYngKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCWxlYWwJLTY0MDM2NDQ4NyglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJNDgoJXJzaSksJXIxMGQKKwl4b3JsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTQyMTgxNTgzNSglcmR4LCVyMTAsMSksJWVkeAorCW1vdmwJNjAoJXJzaSksJXIxMGQKKwl4b3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMSwlZWR4CisJbW92bAklZWF4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwlsZWFsCTUzMDc0MjUyMCglcmN4LCVyMTAsMSksJWVjeAorCW1vdmwJOCglcnNpKSwlcjEwZAorCXhvcmwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE2LCVlY3gKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCWxlYWwJLTk5NTMzODY1MSglcmJ4LCVyMTAsMSksJWVieAorCW1vdmwJMCglcnNpKSwlcjEwZAorCXhvcmwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIzLCVlYngKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJMCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlsZWFsCS0xOTg2MzA4NDQoJXJheCwlcjEwLDEpLCVlYXgKKwlvcmwJJWVieCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVheAorCW1vdmwJMjgoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkNiwlZWF4CisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwlsZWFsCTExMjY4OTE0MTUoJXJkeCwlcjEwLDEpLCVlZHgKKwlvcmwJJWVheCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJXIxMWQsJWVkeAorCW1vdmwJNTYoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkMTAsJWVkeAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJWVheCwlZWR4CisJbGVhbAktMTQxNjM1NDkwNSglcmN4LCVyMTAsMSksJWVjeAorCW9ybAklZWR4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklcjExZCwlZWN4CisJbW92bAkyMCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCS01NzQzNDA1NSglcmJ4LCVyMTAsMSksJWVieAorCW9ybAklZWN4LCVyMTFkCisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklcjExZCwlZWJ4CisJbW92bAk0OCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQyMSwlZWJ4CisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKwlsZWFsCTE3MDA0ODU1NzEoJXJheCwlcjEwLDEpLCVlYXgKKwlvcmwJJWVieCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVheAorCW1vdmwJMTIoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkNiwlZWF4CisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwlsZWFsCS0xODk0OTg2NjA2KCVyZHgsJXIxMCwxKSwlZWR4CisJb3JsCSVlYXgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwltb3ZsCTQwKCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDEwLCVlZHgKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVlYXgsJWVkeAorCWxlYWwJLTEwNTE1MjMoJXJjeCwlcjEwLDEpLCVlY3gKKwlvcmwJJWVkeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCW1vdmwJNCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCS0yMDU0OTIyNzk5KCVyYngsJXIxMCwxKSwlZWJ4CisJb3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYngKKwltb3ZsCTMyKCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDIxLCVlYngKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCWxlYWwJMTg3MzMxMzM1OSglcmF4LCVyMTAsMSksJWVheAorCW9ybAklZWJ4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklcjExZCwlZWF4CisJbW92bAk2MCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQ2LCVlYXgKKwl4b3JsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTMwNjExNzQ0KCVyZHgsJXIxMCwxKSwlZWR4CisJb3JsCSVlYXgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwltb3ZsCTI0KCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDEwLCVlZHgKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVlYXgsJWVkeAorCWxlYWwJLTE1NjAxOTgzODAoJXJjeCwlcjEwLDEpLCVlY3gKKwlvcmwJJWVkeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCW1vdmwJNTIoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkMTUsJWVjeAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJWVkeCwlZWN4CisJbGVhbAkxMzA5MTUxNjQ5KCVyYngsJXIxMCwxKSwlZWJ4CisJb3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYngKKwltb3ZsCTE2KCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDIxLCVlYngKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCWxlYWwJLTE0NTUyMzA3MCglcmF4LCVyMTAsMSksJWVheAorCW9ybAklZWJ4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklcjExZCwlZWF4CisJbW92bAk0NCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQ2LCVlYXgKKwl4b3JsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTExMjAyMTAzNzkoJXJkeCwlcjEwLDEpLCVlZHgKKwlvcmwJJWVheCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJXIxMWQsJWVkeAorCW1vdmwJOCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxMCwlZWR4CisJeG9ybAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwlsZWFsCTcxODc4NzI1OSglcmN4LCVyMTAsMSksJWVjeAorCW9ybAklZWR4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklcjExZCwlZWN4CisJbW92bAkzNiglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCS0zNDM0ODU1NTEoJXJieCwlcjEwLDEpLCVlYngKKwlvcmwJJWVjeCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMWQsJWVieAorCW1vdmwJMCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQyMSwlZWJ4CisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKworCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjlkLCVlYngKKwlhZGRsCSVyMTRkLCVlY3gKKwlhZGRsCSVyMTVkLCVlZHgKKworCisJYWRkcQkkNjQsJXJzaQorCWNtcHEJJXJkaSwlcnNpCisJamIJLkxsb29wCisKKworLkxlbmQ6CisJbW92bAklZWF4LDAoJXJicCkKKwltb3ZsCSVlYngsNCglcmJwKQorCW1vdmwJJWVjeCw4KCVyYnApCisJbW92bAklZWR4LDEyKCVyYnApCisKKwltb3ZxCSglcnNwKSwlcjE1CisJbW92cQk4KCVyc3ApLCVyMTQKKwltb3ZxCTE2KCVyc3ApLCVyMTIKKwltb3ZxCTI0KCVyc3ApLCVyYngKKwltb3ZxCTMyKCVyc3ApLCVyYnAKKwlhZGRxCSQ0MCwlcnNwCisuTGVwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyLC4tbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3AyNTYteDg2XzY0LWFzbS5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcDI1Ni14ODZfNjQtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhOTQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3AyNTYteDg2XzY0LWFzbS5TCkBAIC0wLDAgKzEsNDQ4MCBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKy5oaWRkZW4gT1BFTlNTTF9pYTMyY2FwX1AKKworCisuYWxpZ24JNjQKKy5McG9seToKKy5xdWFkCTB4ZmZmZmZmZmZmZmZmZmZmZiwgMHgwMDAwMDAwMGZmZmZmZmZmLCAweDAwMDAwMDAwMDAwMDAwMDAsIDB4ZmZmZmZmZmYwMDAwMDAwMQorCisuTE9uZToKKy5sb25nCTEsMSwxLDEsMSwxLDEsMQorLkxUd286CisubG9uZwkyLDIsMiwyLDIsMiwyLDIKKy5MVGhyZWU6CisubG9uZwkzLDMsMywzLDMsMywzLDMKKy5MT05FX21vbnQ6CisucXVhZAkweDAwMDAwMDAwMDAwMDAwMDEsIDB4ZmZmZmZmZmYwMDAwMDAwMCwgMHhmZmZmZmZmZmZmZmZmZmZmLCAweDAwMDAwMDAwZmZmZmZmZmUKKworCisuTG9yZDoKKy5xdWFkCTB4ZjNiOWNhYzJmYzYzMjU1MSwgMHhiY2U2ZmFhZGE3MTc5ZTg0LCAweGZmZmZmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmYwMDAwMDAwMAorLkxvcmRLOgorLnF1YWQJMHhjY2QxYzhhYWVlMDBiYzRmCisKKworCisuZ2xvYmwJZWNwX25pc3R6MjU2X25lZworLmhpZGRlbiBlY3BfbmlzdHoyNTZfbmVnCisudHlwZQllY3BfbmlzdHoyNTZfbmVnLEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfbmVnOgorLmNmaV9zdGFydHByb2MJCisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0xNgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtMjQKKy5MbmVnX2JvZHk6CisKKwl4b3JxCSVyOCwlcjgKKwl4b3JxCSVyOSwlcjkKKwl4b3JxCSVyMTAsJXIxMAorCXhvcnEJJXIxMSwlcjExCisJeG9ycQklcjEzLCVyMTMKKworCXN1YnEJMCglcnNpKSwlcjgKKwlzYmJxCTgoJXJzaSksJXI5CisJc2JicQkxNiglcnNpKSwlcjEwCisJbW92cQklcjgsJXJheAorCXNiYnEJMjQoJXJzaSksJXIxMQorCWxlYXEJLkxwb2x5KCVyaXApLCVyc2kKKwltb3ZxCSVyOSwlcmR4CisJc2JicQkkMCwlcjEzCisKKwlhZGRxCTAoJXJzaSksJXI4CisJbW92cQklcjEwLCVyY3gKKwlhZGNxCTgoJXJzaSksJXI5CisJYWRjcQkxNiglcnNpKSwlcjEwCisJbW92cQklcjExLCVyMTIKKwlhZGNxCTI0KCVyc2kpLCVyMTEKKwl0ZXN0cQklcjEzLCVyMTMKKworCWNtb3Z6cQklcmF4LCVyOAorCWNtb3Z6cQklcmR4LCVyOQorCW1vdnEJJXI4LDAoJXJkaSkKKwljbW92enEJJXJjeCwlcjEwCisJbW92cQklcjksOCglcmRpKQorCWNtb3Z6cQklcjEyLCVyMTEKKwltb3ZxCSVyMTAsMTYoJXJkaSkKKwltb3ZxCSVyMTEsMjQoJXJkaSkKKworCW1vdnEJMCglcnNwKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJOCglcnNwKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCWxlYXEJMTYoJXJzcCksJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktMTYKKy5MbmVnX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJZWNwX25pc3R6MjU2X25lZywuLWVjcF9uaXN0ejI1Nl9uZWcKKworCisKKworCisKKy5nbG9ibAllY3BfbmlzdHoyNTZfb3JkX211bF9tb250CisuaGlkZGVuIGVjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQKKy50eXBlCWVjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyY3gKKwltb3ZxCTgoJXJjeCksJXJjeAorCWFuZGwJJDB4ODAxMDAsJWVjeAorCWNtcGwJJDB4ODAxMDAsJWVjeAorCWplCS5MZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udHgKKwlwdXNocQklcmJwCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYnAsLTE2CisJcHVzaHEJJXJieAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJ4LC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKy5Mb3JkX211bF9ib2R5OgorCisJbW92cQkwKCVyZHgpLCVyYXgKKwltb3ZxCSVyZHgsJXJieAorCWxlYXEJLkxvcmQoJXJpcCksJXIxNAorCW1vdnEJLkxvcmRLKCVyaXApLCVyMTUKKworCisJbW92cQklcmF4LCVyY3gKKwltdWxxCTAoJXJzaSkKKwltb3ZxCSVyYXgsJXI4CisJbW92cQklcmN4LCVyYXgKKwltb3ZxCSVyZHgsJXI5CisKKwltdWxxCTgoJXJzaSkKKwlhZGRxCSVyYXgsJXI5CisJbW92cQklcmN4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQkxNiglcnNpKQorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmN4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXI4LCVyMTMKKwlpbXVscQklcjE1LCVyOAorCisJbW92cQklcmR4LCVyMTEKKwltdWxxCTI0KCVyc2kpCisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyOCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKworCisJbXVscQkwKCVyMTQpCisJbW92cQklcjgsJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQklcjgsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwlzdWJxCSVyOCwlcjEwCisJc2JicQkkMCwlcjgKKworCW11bHEJOCglcjE0KQorCWFkZHEJJXJjeCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXI5CisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSVyZHgsJXIxMAorCW1vdnEJJXJicCwlcmR4CisJYWRjcQkkMCwlcjgKKworCXNobHEJJDMyLCVyYXgKKwlzaHJxCSQzMiwlcmR4CisJc3VicQklcmF4LCVyMTEKKwltb3ZxCTgoJXJieCksJXJheAorCXNiYnEJJXJkeCwlcmJwCisKKwlhZGRxCSVyOCwlcjExCisJYWRjcQklcmJwLCVyMTIKKwlhZGNxCSQwLCVyMTMKKworCisJbW92cQklcmF4LCVyY3gKKwltdWxxCTAoJXJzaSkKKwlhZGRxCSVyYXgsJXI5CisJbW92cQklcmN4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJicAorCisJbXVscQk4KCVyc2kpCisJYWRkcQklcmJwLCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJMTYoJXJzaSkKKwlhZGRxCSVyYnAsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmN4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXI5LCVyY3gKKwlpbXVscQklcjE1LCVyOQorCisJbW92cQklcmR4LCVyYnAKKwltdWxxCTI0KCVyc2kpCisJYWRkcQklcmJwLCVyMTIKKwlhZGNxCSQwLCVyZHgKKwl4b3JxCSVyOCwlcjgKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXI5LCVyYXgKKwlhZGNxCSVyZHgsJXIxMworCWFkY3EJJDAsJXI4CisKKworCW11bHEJMCglcjE0KQorCW1vdnEJJXI5LCVyYnAKKwlhZGRxCSVyYXgsJXJjeAorCW1vdnEJJXI5LCVyYXgKKwlhZGNxCSVyZHgsJXJjeAorCisJc3VicQklcjksJXIxMQorCXNiYnEJJDAsJXI5CisKKwltdWxxCTgoJXIxNCkKKwlhZGRxCSVyY3gsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSVyZHgsJXIxMQorCW1vdnEJJXJicCwlcmR4CisJYWRjcQkkMCwlcjkKKworCXNobHEJJDMyLCVyYXgKKwlzaHJxCSQzMiwlcmR4CisJc3VicQklcmF4LCVyMTIKKwltb3ZxCTE2KCVyYngpLCVyYXgKKwlzYmJxCSVyZHgsJXJicAorCisJYWRkcQklcjksJXIxMgorCWFkY3EJJXJicCwlcjEzCisJYWRjcQkkMCwlcjgKKworCisJbW92cQklcmF4LCVyY3gKKwltdWxxCTAoJXJzaSkKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJOCglcnNpKQorCWFkZHEJJXJicCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyY3gsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJwCisKKwltdWxxCTE2KCVyc2kpCisJYWRkcQklcmJwLCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyMTAsJXJjeAorCWltdWxxCSVyMTUsJXIxMAorCisJbW92cQklcmR4LCVyYnAKKwltdWxxCTI0KCVyc2kpCisJYWRkcQklcmJwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwl4b3JxCSVyOSwlcjkKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJJXIxMCwlcmF4CisJYWRjcQklcmR4LCVyOAorCWFkY3EJJDAsJXI5CisKKworCW11bHEJMCglcjE0KQorCW1vdnEJJXIxMCwlcmJwCisJYWRkcQklcmF4LCVyY3gKKwltb3ZxCSVyMTAsJXJheAorCWFkY3EJJXJkeCwlcmN4CisKKwlzdWJxCSVyMTAsJXIxMgorCXNiYnEJJDAsJXIxMAorCisJbXVscQk4KCVyMTQpCisJYWRkcQklcmN4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJicCwlcmF4CisJYWRjcQklcmR4LCVyMTIKKwltb3ZxCSVyYnAsJXJkeAorCWFkY3EJJDAsJXIxMAorCisJc2hscQkkMzIsJXJheAorCXNocnEJJDMyLCVyZHgKKwlzdWJxCSVyYXgsJXIxMworCW1vdnEJMjQoJXJieCksJXJheAorCXNiYnEJJXJkeCwlcmJwCisKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJXJicCwlcjgKKwlhZGNxCSQwLCVyOQorCisKKwltb3ZxCSVyYXgsJXJjeAorCW11bHEJMCglcnNpKQorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmN4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJicAorCisJbXVscQk4KCVyc2kpCisJYWRkcQklcmJwLCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJMTYoJXJzaSkKKwlhZGRxCSVyYnAsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjEzCisJbW92cQklcmN4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXIxMSwlcmN4CisJaW11bHEJJXIxNSwlcjExCisKKwltb3ZxCSVyZHgsJXJicAorCW11bHEJMjQoJXJzaSkKKwlhZGRxCSVyYnAsJXI4CisJYWRjcQkkMCwlcmR4CisJeG9ycQklcjEwLCVyMTAKKwlhZGRxCSVyYXgsJXI4CisJbW92cQklcjExLCVyYXgKKwlhZGNxCSVyZHgsJXI5CisJYWRjcQkkMCwlcjEwCisKKworCW11bHEJMCglcjE0KQorCW1vdnEJJXIxMSwlcmJwCisJYWRkcQklcmF4LCVyY3gKKwltb3ZxCSVyMTEsJXJheAorCWFkY3EJJXJkeCwlcmN4CisKKwlzdWJxCSVyMTEsJXIxMworCXNiYnEJJDAsJXIxMQorCisJbXVscQk4KCVyMTQpCisJYWRkcQklcmN4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXJicCwlcmF4CisJYWRjcQklcmR4LCVyMTMKKwltb3ZxCSVyYnAsJXJkeAorCWFkY3EJJDAsJXIxMQorCisJc2hscQkkMzIsJXJheAorCXNocnEJJDMyLCVyZHgKKwlzdWJxCSVyYXgsJXI4CisJc2JicQklcmR4LCVyYnAKKworCWFkZHEJJXIxMSwlcjgKKwlhZGNxCSVyYnAsJXI5CisJYWRjcQkkMCwlcjEwCisKKworCW1vdnEJJXIxMiwlcnNpCisJc3VicQkwKCVyMTQpLCVyMTIKKwltb3ZxCSVyMTMsJXIxMQorCXNiYnEJOCglcjE0KSwlcjEzCisJbW92cQklcjgsJXJjeAorCXNiYnEJMTYoJXIxNCksJXI4CisJbW92cQklcjksJXJicAorCXNiYnEJMjQoJXIxNCksJXI5CisJc2JicQkkMCwlcjEwCisKKwljbW92Y3EJJXJzaSwlcjEyCisJY21vdmNxCSVyMTEsJXIxMworCWNtb3ZjcQklcmN4LCVyOAorCWNtb3ZjcQklcmJwLCVyOQorCisJbW92cQklcjEyLDAoJXJkaSkKKwltb3ZxCSVyMTMsOCglcmRpKQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKworCW1vdnEJMCglcnNwKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJOCglcnNwKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJMTYoJXJzcCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCTI0KCVyc3ApLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQkzMiglcnNwKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCW1vdnEJNDAoJXJzcCksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwlsZWFxCTQ4KCVyc3ApLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTQ4CisuTG9yZF9tdWxfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQllY3BfbmlzdHoyNTZfb3JkX211bF9tb250LC4tZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udAorCisKKworCisKKworCisuZ2xvYmwJZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udAorLmhpZGRlbiBlY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250CisudHlwZQllY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250LEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250OgorLmNmaV9zdGFydHByb2MJCisJbGVhcQlPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmN4CisJbW92cQk4KCVyY3gpLCVyY3gKKwlhbmRsCSQweDgwMTAwLCVlY3gKKwljbXBsCSQweDgwMTAwLCVlY3gKKwlqZQkuTGVjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnR4CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisuTG9yZF9zcXJfYm9keToKKworCW1vdnEJMCglcnNpKSwlcjgKKwltb3ZxCTgoJXJzaSksJXJheAorCW1vdnEJMTYoJXJzaSksJXIxNAorCW1vdnEJMjQoJXJzaSksJXIxNQorCWxlYXEJLkxvcmQoJXJpcCksJXJzaQorCW1vdnEJJXJkeCwlcmJ4CisJam1wCS5Mb29wX29yZF9zcXIKKworLmFsaWduCTMyCisuTG9vcF9vcmRfc3FyOgorCisJbW92cQklcmF4LCVyYnAKKwltdWxxCSVyOAorCW1vdnEJJXJheCwlcjkKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjA1CisJbW92cQklcjE0LCVyYXgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcjgKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXIxNSwlcmF4CisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyOAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcjE1LCVyYXgKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjIzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKworCisJbXVscQklcjE0CisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCW1vdnEJJXJkeCwlcjE0CisKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcjE1LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKworCWFkZHEJJXIxNSwlcjEyCisJYWRjcQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTQKKworCisJeG9ycQklcjE1LCVyMTUKKwltb3ZxCSVyOCwlcmF4CisJYWRkcQklcjksJXI5CisJYWRjcQklcjEwLCVyMTAKKwlhZGNxCSVyMTEsJXIxMQorCWFkY3EJJXIxMiwlcjEyCisJYWRjcQklcjEzLCVyMTMKKwlhZGNxCSVyMTQsJXIxNAorCWFkY3EJJDAsJXIxNQorCisKKwltdWxxCSVyYXgKKwltb3ZxCSVyYXgsJXI4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwMAorCW1vdnEJJXJkeCwlcmJwCisKKwltdWxxCSVyYXgKKwlhZGRxCSVyYnAsJXI5CisJYWRjcQklcmF4LCVyMTAKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJJXJheAorCWFkZHEJJXJicCwlcjExCisJYWRjcQklcmF4LCVyMTIKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjE2CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW1vdnEJJXI4LCVyY3gKKwlpbXVscQkzMiglcnNpKSwlcjgKKworCW11bHEJJXJheAorCWFkZHEJJXJicCwlcjEzCisJYWRjcQklcmF4LCVyMTQKKwltb3ZxCTAoJXJzaSksJXJheAorCWFkY3EJJXJkeCwlcjE1CisKKworCW11bHEJJXI4CisJbW92cQklcjgsJXJicAorCWFkZHEJJXJheCwlcmN4CisJbW92cQk4KCVyc2kpLCVyYXgKKwlhZGNxCSVyZHgsJXJjeAorCisJc3VicQklcjgsJXIxMAorCXNiYnEJJDAsJXJicAorCisJbXVscQklcjgKKwlhZGRxCSVyY3gsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyOQorCW1vdnEJJXI4LCVyYXgKKwlhZGNxCSVyZHgsJXIxMAorCW1vdnEJJXI4LCVyZHgKKwlhZGNxCSQwLCVyYnAKKworCW1vdnEJJXI5LCVyY3gKKwlpbXVscQkzMiglcnNpKSwlcjkKKworCXNobHEJJDMyLCVyYXgKKwlzaHJxCSQzMiwlcmR4CisJc3VicQklcmF4LCVyMTEKKwltb3ZxCTAoJXJzaSksJXJheAorCXNiYnEJJXJkeCwlcjgKKworCWFkZHEJJXJicCwlcjExCisJYWRjcQkkMCwlcjgKKworCisJbXVscQklcjkKKwltb3ZxCSVyOSwlcmJwCisJYWRkcQklcmF4LCVyY3gKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJXJkeCwlcmN4CisKKwlzdWJxCSVyOSwlcjExCisJc2JicQkkMCwlcmJwCisKKwltdWxxCSVyOQorCWFkZHEJJXJjeCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyOSwlcmF4CisJYWRjcQklcmR4LCVyMTEKKwltb3ZxCSVyOSwlcmR4CisJYWRjcQkkMCwlcmJwCisKKwltb3ZxCSVyMTAsJXJjeAorCWltdWxxCTMyKCVyc2kpLCVyMTAKKworCXNobHEJJDMyLCVyYXgKKwlzaHJxCSQzMiwlcmR4CisJc3VicQklcmF4LCVyOAorCW1vdnEJMCglcnNpKSwlcmF4CisJc2JicQklcmR4LCVyOQorCisJYWRkcQklcmJwLCVyOAorCWFkY3EJJDAsJXI5CisKKworCW11bHEJJXIxMAorCW1vdnEJJXIxMCwlcmJwCisJYWRkcQklcmF4LCVyY3gKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJXJkeCwlcmN4CisKKwlzdWJxCSVyMTAsJXI4CisJc2JicQkkMCwlcmJwCisKKwltdWxxCSVyMTAKKwlhZGRxCSVyY3gsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcjEwLCVyYXgKKwlhZGNxCSVyZHgsJXI4CisJbW92cQklcjEwLCVyZHgKKwlhZGNxCSQwLCVyYnAKKworCW1vdnEJJXIxMSwlcmN4CisJaW11bHEJMzIoJXJzaSksJXIxMQorCisJc2hscQkkMzIsJXJheAorCXNocnEJJDMyLCVyZHgKKwlzdWJxCSVyYXgsJXI5CisJbW92cQkwKCVyc2kpLCVyYXgKKwlzYmJxCSVyZHgsJXIxMAorCisJYWRkcQklcmJwLCVyOQorCWFkY3EJJDAsJXIxMAorCisKKwltdWxxCSVyMTEKKwltb3ZxCSVyMTEsJXJicAorCWFkZHEJJXJheCwlcmN4CisJbW92cQk4KCVyc2kpLCVyYXgKKwlhZGNxCSVyZHgsJXJjeAorCisJc3VicQklcjExLCVyOQorCXNiYnEJJDAsJXJicAorCisJbXVscQklcjExCisJYWRkcQklcmN4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjgKKwltb3ZxCSVyMTEsJXJheAorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTEsJXJkeAorCWFkY3EJJDAsJXJicAorCisJc2hscQkkMzIsJXJheAorCXNocnEJJDMyLCVyZHgKKwlzdWJxCSVyYXgsJXIxMAorCXNiYnEJJXJkeCwlcjExCisKKwlhZGRxCSVyYnAsJXIxMAorCWFkY3EJJDAsJXIxMQorCisKKwl4b3JxCSVyZHgsJXJkeAorCWFkZHEJJXIxMiwlcjgKKwlhZGNxCSVyMTMsJXI5CisJbW92cQklcjgsJXIxMgorCWFkY3EJJXIxNCwlcjEwCisJYWRjcQklcjE1LCVyMTEKKwltb3ZxCSVyOSwlcmF4CisJYWRjcQkkMCwlcmR4CisKKworCXN1YnEJMCglcnNpKSwlcjgKKwltb3ZxCSVyMTAsJXIxNAorCXNiYnEJOCglcnNpKSwlcjkKKwlzYmJxCTE2KCVyc2kpLCVyMTAKKwltb3ZxCSVyMTEsJXIxNQorCXNiYnEJMjQoJXJzaSksJXIxMQorCXNiYnEJJDAsJXJkeAorCisJY21vdmNxCSVyMTIsJXI4CisJY21vdm5jcQklcjksJXJheAorCWNtb3ZuY3EJJXIxMCwlcjE0CisJY21vdm5jcQklcjExLCVyMTUKKworCWRlY3EJJXJieAorCWpuegkuTG9vcF9vcmRfc3FyCisKKwltb3ZxCSVyOCwwKCVyZGkpCisJbW92cQklcmF4LDgoJXJkaSkKKwlweG9yCSV4bW0xLCV4bW0xCisJbW92cQklcjE0LDE2KCVyZGkpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnEJJXIxNSwyNCglcmRpKQorCXB4b3IJJXhtbTMsJXhtbTMKKworCW1vdnEJMCglcnNwKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJOCglcnNwKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJMTYoJXJzcCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCTI0KCVyc3ApLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQkzMiglcnNwKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCW1vdnEJNDAoJXJzcCksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwlsZWFxCTQ4KCVyc3ApLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTQ4CisuTG9yZF9zcXJfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQllY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250LC4tZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udAorCisudHlwZQllY3BfbmlzdHoyNTZfb3JkX211bF9tb250eCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udHg6CisuY2ZpX3N0YXJ0cHJvYwkKKy5MZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udHg6CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisuTG9yZF9tdWx4X2JvZHk6CisKKwltb3ZxCSVyZHgsJXJieAorCW1vdnEJMCglcmR4KSwlcmR4CisJbW92cQkwKCVyc2kpLCVyOQorCW1vdnEJOCglcnNpKSwlcjEwCisJbW92cQkxNiglcnNpKSwlcjExCisJbW92cQkyNCglcnNpKSwlcjEyCisJbGVhcQktMTI4KCVyc2kpLCVyc2kKKwlsZWFxCS5Mb3JkLTEyOCglcmlwKSwlcjE0CisJbW92cQkuTG9yZEsoJXJpcCksJXIxNQorCisKKwltdWx4cQklcjksJXI4LCVyOQorCW11bHhxCSVyMTAsJXJjeCwlcjEwCisJbXVseHEJJXIxMSwlcmJwLCVyMTEKKwlhZGRxCSVyY3gsJXI5CisJbXVseHEJJXIxMiwlcmN4LCVyMTIKKwltb3ZxCSVyOCwlcmR4CisJbXVseHEJJXIxNSwlcmR4LCVyYXgKKwlhZGNxCSVyYnAsJXIxMAorCWFkY3EJJXJjeCwlcjExCisJYWRjcQkkMCwlcjEyCisKKworCXhvcnEJJXIxMywlcjEzCisJbXVseHEJMCsxMjgoJXIxNCksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjgKKwlhZG94cQklcmJwLCVyOQorCisJbXVseHEJOCsxMjgoJXIxNCksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjkKKwlhZG94cQklcmJwLCVyMTAKKworCW11bHhxCTE2KzEyOCglcjE0KSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTAKKwlhZG94cQklcmJwLCVyMTEKKworCW11bHhxCTI0KzEyOCglcjE0KSwlcmN4LCVyYnAKKwltb3ZxCTgoJXJieCksJXJkeAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCWFkY3hxCSVyOCwlcjEyCisJYWRveHEJJXI4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCisJbXVseHEJMCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjkKKwlhZG94cQklcmJwLCVyMTAKKworCW11bHhxCTgrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJMTYrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCisJbXVseHEJMjQrMTI4KCVyc2kpLCVyY3gsJXJicAorCW1vdnEJJXI5LCVyZHgKKwltdWx4cQklcjE1LCVyZHgsJXJheAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCisJYWRjeHEJJXI4LCVyMTMKKwlhZG94cQklcjgsJXI4CisJYWRjcQkkMCwlcjgKKworCisJbXVseHEJMCsxMjgoJXIxNCksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjkKKwlhZG94cQklcmJwLCVyMTAKKworCW11bHhxCTgrMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJMTYrMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCisJbXVseHEJMjQrMTI4KCVyMTQpLCVyY3gsJXJicAorCW1vdnEJMTYoJXJieCksJXJkeAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCWFkY3hxCSVyOSwlcjEzCisJYWRveHEJJXI5LCVyOAorCWFkY3EJJDAsJXI4CisKKworCW11bHhxCTArMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJOCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQkxNisxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEyCisJYWRveHEJJXJicCwlcjEzCisKKwltdWx4cQkyNCsxMjgoJXJzaSksJXJjeCwlcmJwCisJbW92cQklcjEwLCVyZHgKKwltdWx4cQklcjE1LCVyZHgsJXJheAorCWFkY3hxCSVyY3gsJXIxMworCWFkb3hxCSVyYnAsJXI4CisKKwlhZGN4cQklcjksJXI4CisJYWRveHEJJXI5LCVyOQorCWFkY3EJJDAsJXI5CisKKworCW11bHhxCTArMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJOCsxMjgoJXIxNCksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQkxNisxMjgoJXIxNCksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEyCisJYWRveHEJJXJicCwlcjEzCisKKwltdWx4cQkyNCsxMjgoJXIxNCksJXJjeCwlcmJwCisJbW92cQkyNCglcmJ4KSwlcmR4CisJYWRjeHEJJXJjeCwlcjEzCisJYWRveHEJJXJicCwlcjgKKwlhZGN4cQklcjEwLCVyOAorCWFkb3hxCSVyMTAsJXI5CisJYWRjcQkkMCwlcjkKKworCisJbXVseHEJMCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQk4KzEyOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKworCW11bHhxCTE2KzEyOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTMKKwlhZG94cQklcmJwLCVyOAorCisJbXVseHEJMjQrMTI4KCVyc2kpLCVyY3gsJXJicAorCW1vdnEJJXIxMSwlcmR4CisJbXVseHEJJXIxNSwlcmR4LCVyYXgKKwlhZGN4cQklcmN4LCVyOAorCWFkb3hxCSVyYnAsJXI5CisKKwlhZGN4cQklcjEwLCVyOQorCWFkb3hxCSVyMTAsJXIxMAorCWFkY3EJJDAsJXIxMAorCisKKwltdWx4cQkwKzEyOCglcjE0KSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKworCW11bHhxCTgrMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCisJbXVseHEJMTYrMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMworCWFkb3hxCSVyYnAsJXI4CisKKwltdWx4cQkyNCsxMjgoJXIxNCksJXJjeCwlcmJwCisJbGVhcQkxMjgoJXIxNCksJXIxNAorCW1vdnEJJXIxMiwlcmJ4CisJYWRjeHEJJXJjeCwlcjgKKwlhZG94cQklcmJwLCVyOQorCW1vdnEJJXIxMywlcmR4CisJYWRjeHEJJXIxMSwlcjkKKwlhZG94cQklcjExLCVyMTAKKwlhZGNxCSQwLCVyMTAKKworCisKKwltb3ZxCSVyOCwlcmN4CisJc3VicQkwKCVyMTQpLCVyMTIKKwlzYmJxCTgoJXIxNCksJXIxMworCXNiYnEJMTYoJXIxNCksJXI4CisJbW92cQklcjksJXJicAorCXNiYnEJMjQoJXIxNCksJXI5CisJc2JicQkkMCwlcjEwCisKKwljbW92Y3EJJXJieCwlcjEyCisJY21vdmNxCSVyZHgsJXIxMworCWNtb3ZjcQklcmN4LCVyOAorCWNtb3ZjcQklcmJwLCVyOQorCisJbW92cQklcjEyLDAoJXJkaSkKKwltb3ZxCSVyMTMsOCglcmRpKQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKworCW1vdnEJMCglcnNwKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJOCglcnNwKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJMTYoJXJzcCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCTI0KCVyc3ApLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQkzMiglcnNwKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCW1vdnEJNDAoJXJzcCksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwlsZWFxCTQ4KCVyc3ApLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTQ4CisuTG9yZF9tdWx4X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udHgsLi1lY3BfbmlzdHoyNTZfb3JkX211bF9tb250eAorCisudHlwZQllY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250eCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udHg6CisuY2ZpX3N0YXJ0cHJvYwkKKy5MZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udHg6CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisuTG9yZF9zcXJ4X2JvZHk6CisKKwltb3ZxCSVyZHgsJXJieAorCW1vdnEJMCglcnNpKSwlcmR4CisJbW92cQk4KCVyc2kpLCVyMTQKKwltb3ZxCTE2KCVyc2kpLCVyMTUKKwltb3ZxCTI0KCVyc2kpLCVyOAorCWxlYXEJLkxvcmQoJXJpcCksJXJzaQorCWptcAkuTG9vcF9vcmRfc3FyeAorCisuYWxpZ24JMzIKKy5Mb29wX29yZF9zcXJ4OgorCW11bHhxCSVyMTQsJXI5LCVyMTAKKwltdWx4cQklcjE1LCVyY3gsJXIxMQorCW1vdnEJJXJkeCwlcmF4CisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIwNgorCW11bHhxCSVyOCwlcmJwLCVyMTIKKwltb3ZxCSVyMTQsJXJkeAorCWFkZHEJJXJjeCwlcjEwCisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIxNQorCWFkY3EJJXJicCwlcjExCisJYWRjcQkkMCwlcjEyCisJeG9ycQklcjEzLCVyMTMKKworCW11bHhxCSVyMTUsJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQklcjgsJXJjeCwlcmJwCisJbW92cQklcjE1LCVyZHgKKwlhZGN4cQklcmN4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCW11bHhxCSVyOCwlcmN4LCVyMTQKKwltb3ZxCSVyYXgsJXJkeAorLmJ5dGUJMTAyLDczLDE1LDExMCwyMTYKKwl4b3JxCSVyMTUsJXIxNQorCWFkY3hxCSVyOSwlcjkKKwlhZG94cQklcmN4LCVyMTMKKwlhZGN4cQklcjEwLCVyMTAKKwlhZG94cQklcjE1LCVyMTQKKworCisJbXVseHEJJXJkeCwlcjgsJXJicAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDIKKwlhZGN4cQklcjExLCVyMTEKKwlhZG94cQklcmJwLCVyOQorCWFkY3hxCSVyMTIsJXIxMgorCW11bHhxCSVyZHgsJXJjeCwlcmF4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIxMAorCWFkY3hxCSVyMTMsJXIxMworCWFkb3hxCSVyY3gsJXIxMAorCWFkY3hxCSVyMTQsJXIxNAorCW11bHhxCSVyZHgsJXJjeCwlcmJwCisuYnl0ZQkweDY3CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIxOAorCWFkb3hxCSVyYXgsJXIxMQorCWFkY3hxCSVyMTUsJXIxNQorCWFkb3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCW11bHhxCSVyZHgsJXJjeCwlcmF4CisJYWRveHEJJXJjeCwlcjE0CisJYWRveHEJJXJheCwlcjE1CisKKworCW1vdnEJJXI4LCVyZHgKKwltdWx4cQkzMiglcnNpKSwlcmR4LCVyY3gKKworCXhvcnEJJXJheCwlcmF4CisJbXVseHEJMCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyOAorCWFkb3hxCSVyYnAsJXI5CisJbXVseHEJOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyOQorCWFkb3hxCSVyYnAsJXIxMAorCW11bHhxCTE2KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCW11bHhxCTI0KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXI4CisJYWRjeHEJJXJheCwlcjgKKworCisJbW92cQklcjksJXJkeAorCW11bHhxCTMyKCVyc2kpLCVyZHgsJXJjeAorCisJbXVseHEJMCglcnNpKSwlcmN4LCVyYnAKKwlhZG94cQklcmN4LCVyOQorCWFkY3hxCSVyYnAsJXIxMAorCW11bHhxCTgoJXJzaSksJXJjeCwlcmJwCisJYWRveHEJJXJjeCwlcjEwCisJYWRjeHEJJXJicCwlcjExCisJbXVseHEJMTYoJXJzaSksJXJjeCwlcmJwCisJYWRveHEJJXJjeCwlcjExCisJYWRjeHEJJXJicCwlcjgKKwltdWx4cQkyNCglcnNpKSwlcmN4LCVyYnAKKwlhZG94cQklcmN4LCVyOAorCWFkY3hxCSVyYnAsJXI5CisJYWRveHEJJXJheCwlcjkKKworCisJbW92cQklcjEwLCVyZHgKKwltdWx4cQkzMiglcnNpKSwlcmR4LCVyY3gKKworCW11bHhxCTAoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEwCisJYWRveHEJJXJicCwlcjExCisJbXVseHEJOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyOAorCW11bHhxCTE2KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI4CisJYWRveHEJJXJicCwlcjkKKwltdWx4cQkyNCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyOQorCWFkb3hxCSVyYnAsJXIxMAorCWFkY3hxCSVyYXgsJXIxMAorCisKKwltb3ZxCSVyMTEsJXJkeAorCW11bHhxCTMyKCVyc2kpLCVyZHgsJXJjeAorCisJbXVseHEJMCglcnNpKSwlcmN4LCVyYnAKKwlhZG94cQklcmN4LCVyMTEKKwlhZGN4cQklcmJwLCVyOAorCW11bHhxCTgoJXJzaSksJXJjeCwlcmJwCisJYWRveHEJJXJjeCwlcjgKKwlhZGN4cQklcmJwLCVyOQorCW11bHhxCTE2KCVyc2kpLCVyY3gsJXJicAorCWFkb3hxCSVyY3gsJXI5CisJYWRjeHEJJXJicCwlcjEwCisJbXVseHEJMjQoJXJzaSksJXJjeCwlcmJwCisJYWRveHEJJXJjeCwlcjEwCisJYWRjeHEJJXJicCwlcjExCisJYWRveHEJJXJheCwlcjExCisKKworCWFkZHEJJXI4LCVyMTIKKwlhZGNxCSVyMTMsJXI5CisJbW92cQklcjEyLCVyZHgKKwlhZGNxCSVyMTQsJXIxMAorCWFkY3EJJXIxNSwlcjExCisJbW92cQklcjksJXIxNAorCWFkY3EJJDAsJXJheAorCisKKwlzdWJxCTAoJXJzaSksJXIxMgorCW1vdnEJJXIxMCwlcjE1CisJc2JicQk4KCVyc2kpLCVyOQorCXNiYnEJMTYoJXJzaSksJXIxMAorCW1vdnEJJXIxMSwlcjgKKwlzYmJxCTI0KCVyc2kpLCVyMTEKKwlzYmJxCSQwLCVyYXgKKworCWNtb3ZuY3EJJXIxMiwlcmR4CisJY21vdm5jcQklcjksJXIxNAorCWNtb3ZuY3EJJXIxMCwlcjE1CisJY21vdm5jcQklcjExLCVyOAorCisJZGVjcQklcmJ4CisJam56CS5Mb29wX29yZF9zcXJ4CisKKwltb3ZxCSVyZHgsMCglcmRpKQorCW1vdnEJJXIxNCw4KCVyZGkpCisJcHhvcgkleG1tMSwleG1tMQorCW1vdnEJJXIxNSwxNiglcmRpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3ZxCSVyOCwyNCglcmRpKQorCXB4b3IJJXhtbTMsJXhtbTMKKworCW1vdnEJMCglcnNwKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJOCglcnNwKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJMTYoJXJzcCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCTI0KCVyc3ApLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQkzMiglcnNwKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCW1vdnEJNDAoJXJzcCksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwlsZWFxCTQ4KCVyc3ApLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTQ4CisuTG9yZF9zcXJ4X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udHgsLi1lY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250eAorCisKKworCisKKworLmdsb2JsCWVjcF9uaXN0ejI1Nl9tdWxfbW9udAorLmhpZGRlbiBlY3BfbmlzdHoyNTZfbXVsX21vbnQKKy50eXBlCWVjcF9uaXN0ejI1Nl9tdWxfbW9udCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorZWNwX25pc3R6MjU2X211bF9tb250OgorLmNmaV9zdGFydHByb2MJCisJbGVhcQlPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmN4CisJbW92cQk4KCVyY3gpLCVyY3gKKwlhbmRsCSQweDgwMTAwLCVlY3gKKy5MbXVsX21vbnQ6CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisuTG11bF9ib2R5OgorCWNtcGwJJDB4ODAxMDAsJWVjeAorCWplCS5MbXVsX21vbnR4CisJbW92cQklcmR4LCVyYngKKwltb3ZxCTAoJXJkeCksJXJheAorCW1vdnEJMCglcnNpKSwlcjkKKwltb3ZxCTgoJXJzaSksJXIxMAorCW1vdnEJMTYoJXJzaSksJXIxMQorCW1vdnEJMjQoJXJzaSksJXIxMgorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKwlqbXAJLkxtdWxfbW9udF9kb25lCisKKy5hbGlnbgkzMgorLkxtdWxfbW9udHg6CisJbW92cQklcmR4LCVyYngKKwltb3ZxCTAoJXJkeCksJXJkeAorCW1vdnEJMCglcnNpKSwlcjkKKwltb3ZxCTgoJXJzaSksJXIxMAorCW1vdnEJMTYoJXJzaSksJXIxMQorCW1vdnEJMjQoJXJzaSksJXIxMgorCWxlYXEJLTEyOCglcnNpKSwlcnNpCisKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorLkxtdWxfbW9udF9kb25lOgorCW1vdnEJMCglcnNwKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJOCglcnNwKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJMTYoJXJzcCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCTI0KCVyc3ApLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQkzMiglcnNwKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCW1vdnEJNDAoJXJzcCksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwlsZWFxCTQ4KCVyc3ApLCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJLTQ4CisuTG11bF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWVjcF9uaXN0ejI1Nl9tdWxfbW9udCwuLWVjcF9uaXN0ejI1Nl9tdWxfbW9udAorCisudHlwZQlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19fZWNwX25pc3R6MjU2X211bF9tb250cToKKworCisJbW92cQklcmF4LCVyYnAKKwltdWxxCSVyOQorCW1vdnEJLkxwb2x5KzgoJXJpcCksJXIxNAorCW1vdnEJJXJheCwlcjgKKwltb3ZxCSVyYnAsJXJheAorCW1vdnEJJXJkeCwlcjkKKworCW11bHEJJXIxMAorCW1vdnEJLkxwb2x5KzI0KCVyaXApLCVyMTUKKwlhZGRxCSVyYXgsJXI5CisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyMTIKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXI4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwl4b3JxCSVyMTMsJXIxMworCW1vdnEJJXJkeCwlcjEyCisKKworCisKKworCisKKworCisKKwltb3ZxCSVyOCwlcmJwCisJc2hscQkkMzIsJXI4CisJbXVscQklcjE1CisJc2hycQkkMzIsJXJicAorCWFkZHEJJXI4LCVyOQorCWFkY3EJJXJicCwlcjEwCisJYWRjcQklcmF4LCVyMTEKKwltb3ZxCTgoJXJieCksJXJheAorCWFkY3EJJXJkeCwlcjEyCisJYWRjcQkkMCwlcjEzCisJeG9ycQklcjgsJXI4CisKKworCisJbW92cQklcmF4LCVyYnAKKwltdWxxCTAoJXJzaSkKKwlhZGRxCSVyYXgsJXI5CisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQk4KCVyc2kpCisJYWRkcQklcmN4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJicCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyY3gKKworCW11bHEJMTYoJXJzaSkKKwlhZGRxCSVyY3gsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQkyNCglcnNpKQorCWFkZHEJJXJjeCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCSVyOSwlcmF4CisJYWRjcQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyOAorCisKKworCW1vdnEJJXI5LCVyYnAKKwlzaGxxCSQzMiwlcjkKKwltdWxxCSVyMTUKKwlzaHJxCSQzMiwlcmJwCisJYWRkcQklcjksJXIxMAorCWFkY3EJJXJicCwlcjExCisJYWRjcQklcmF4LCVyMTIKKwltb3ZxCTE2KCVyYngpLCVyYXgKKwlhZGNxCSVyZHgsJXIxMworCWFkY3EJJDAsJXI4CisJeG9ycQklcjksJXI5CisKKworCisJbW92cQklcmF4LCVyYnAKKwltdWxxCTAoJXJzaSkKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJicCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyY3gKKworCW11bHEJOCglcnNpKQorCWFkZHEJJXJjeCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCTE2KCVyc2kpCisJYWRkcQklcmN4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXJicCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyY3gKKworCW11bHEJMjQoJXJzaSkKKwlhZGRxCSVyY3gsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjEzCisJbW92cQklcjEwLCVyYXgKKwlhZGNxCSVyZHgsJXI4CisJYWRjcQkkMCwlcjkKKworCisKKwltb3ZxCSVyMTAsJXJicAorCXNobHEJJDMyLCVyMTAKKwltdWxxCSVyMTUKKwlzaHJxCSQzMiwlcmJwCisJYWRkcQklcjEwLCVyMTEKKwlhZGNxCSVyYnAsJXIxMgorCWFkY3EJJXJheCwlcjEzCisJbW92cQkyNCglcmJ4KSwlcmF4CisJYWRjcQklcmR4LCVyOAorCWFkY3EJJDAsJXI5CisJeG9ycQklcjEwLCVyMTAKKworCisKKwltb3ZxCSVyYXgsJXJicAorCW11bHEJMCglcnNpKQorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQk4KCVyc2kpCisJYWRkcQklcmN4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXJicCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyY3gKKworCW11bHEJMTYoJXJzaSkKKwlhZGRxCSVyY3gsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjEzCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQkyNCglcnNpKQorCWFkZHEJJXJjeCwlcjgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXI4CisJbW92cQklcjExLCVyYXgKKwlhZGNxCSVyZHgsJXI5CisJYWRjcQkkMCwlcjEwCisKKworCisJbW92cQklcjExLCVyYnAKKwlzaGxxCSQzMiwlcjExCisJbXVscQklcjE1CisJc2hycQkkMzIsJXJicAorCWFkZHEJJXIxMSwlcjEyCisJYWRjcQklcmJwLCVyMTMKKwltb3ZxCSVyMTIsJXJjeAorCWFkY3EJJXJheCwlcjgKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyYnAKKwlhZGNxCSQwLCVyMTAKKworCisKKwlzdWJxCSQtMSwlcjEyCisJbW92cQklcjgsJXJieAorCXNiYnEJJXIxNCwlcjEzCisJc2JicQkkMCwlcjgKKwltb3ZxCSVyOSwlcmR4CisJc2JicQklcjE1LCVyOQorCXNiYnEJJDAsJXIxMAorCisJY21vdmNxCSVyY3gsJXIxMgorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcmJ4LCVyOAorCW1vdnEJJXIxMyw4KCVyZGkpCisJY21vdmNxCSVyZHgsJXI5CisJbW92cQklcjgsMTYoJXJkaSkKKwltb3ZxCSVyOSwyNCglcmRpKQorCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEsLi1fX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCisKKworCisKKworCisuZ2xvYmwJZWNwX25pc3R6MjU2X3Nxcl9tb250CisuaGlkZGVuIGVjcF9uaXN0ejI1Nl9zcXJfbW9udAorLnR5cGUJZWNwX25pc3R6MjU2X3Nxcl9tb250LEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfc3FyX21vbnQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyY3gKKwltb3ZxCTgoJXJjeCksJXJjeAorCWFuZGwJJDB4ODAxMDAsJWVjeAorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMTYKKwlwdXNocQklcmJ4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYngsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE1LC01NgorLkxzcXJfYm9keToKKwljbXBsCSQweDgwMTAwLCVlY3gKKwlqZQkuTHNxcl9tb250eAorCW1vdnEJMCglcnNpKSwlcmF4CisJbW92cQk4KCVyc2kpLCVyMTQKKwltb3ZxCTE2KCVyc2kpLCVyMTUKKwltb3ZxCTI0KCVyc2kpLCVyOAorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKwlqbXAJLkxzcXJfbW9udF9kb25lCisKKy5hbGlnbgkzMgorLkxzcXJfbW9udHg6CisJbW92cQkwKCVyc2kpLCVyZHgKKwltb3ZxCTgoJXJzaSksJXIxNAorCW1vdnEJMTYoJXJzaSksJXIxNQorCW1vdnEJMjQoJXJzaSksJXI4CisJbGVhcQktMTI4KCVyc2kpLCVyc2kKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisuTHNxcl9tb250X2RvbmU6CisJbW92cQkwKCVyc3ApLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQk4KCVyc3ApLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQkxNiglcnNwKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJMjQoJXJzcCksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCTMyKCVyc3ApLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbW92cQk0MCglcnNwKSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCWxlYXEJNDgoJXJzcCksJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAktNDgKKy5Mc3FyX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJZWNwX25pc3R6MjU2X3Nxcl9tb250LC4tZWNwX25pc3R6MjU2X3Nxcl9tb250CisKKy50eXBlCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxOgorCW1vdnEJJXJheCwlcjEzCisJbXVscQklcjE0CisJbW92cQklcmF4LCVyOQorCW1vdnEJJXIxNSwlcmF4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXIxMworCWFkZHEJJXJheCwlcjEwCisJbW92cQklcjgsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyMTMKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXIxNSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKworCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyOCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcjgsJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJicCwlcjEyCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCisJbXVscQklcjE1CisJeG9ycQklcjE1LCVyMTUKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJMCglcnNpKSwlcmF4CisJbW92cQklcmR4LCVyMTQKKwlhZGNxCSQwLCVyMTQKKworCWFkZHEJJXI5LCVyOQorCWFkY3EJJXIxMCwlcjEwCisJYWRjcQklcjExLCVyMTEKKwlhZGNxCSVyMTIsJXIxMgorCWFkY3EJJXIxMywlcjEzCisJYWRjcQklcjE0LCVyMTQKKwlhZGNxCSQwLCVyMTUKKworCW11bHEJJXJheAorCW1vdnEJJXJheCwlcjgKKwltb3ZxCTgoJXJzaSksJXJheAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCSVyYXgKKwlhZGRxCSVyY3gsJXI5CisJYWRjcQklcmF4LCVyMTAKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQklcmF4CisJYWRkcQklcmN4LCVyMTEKKwlhZGNxCSVyYXgsJXIxMgorCW1vdnEJMjQoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCSVyYXgKKwlhZGRxCSVyY3gsJXIxMworCWFkY3EJJXJheCwlcjE0CisJbW92cQklcjgsJXJheAorCWFkY3EJJXJkeCwlcjE1CisKKwltb3ZxCS5McG9seSs4KCVyaXApLCVyc2kKKwltb3ZxCS5McG9seSsyNCglcmlwKSwlcmJwCisKKworCisKKwltb3ZxCSVyOCwlcmN4CisJc2hscQkkMzIsJXI4CisJbXVscQklcmJwCisJc2hycQkkMzIsJXJjeAorCWFkZHEJJXI4LCVyOQorCWFkY3EJJXJjeCwlcjEwCisJYWRjcQklcmF4LCVyMTEKKwltb3ZxCSVyOSwlcmF4CisJYWRjcQkkMCwlcmR4CisKKworCisJbW92cQklcjksJXJjeAorCXNobHEJJDMyLCVyOQorCW1vdnEJJXJkeCwlcjgKKwltdWxxCSVyYnAKKwlzaHJxCSQzMiwlcmN4CisJYWRkcQklcjksJXIxMAorCWFkY3EJJXJjeCwlcjExCisJYWRjcQklcmF4LCVyOAorCW1vdnEJJXIxMCwlcmF4CisJYWRjcQkkMCwlcmR4CisKKworCisJbW92cQklcjEwLCVyY3gKKwlzaGxxCSQzMiwlcjEwCisJbW92cQklcmR4LCVyOQorCW11bHEJJXJicAorCXNocnEJJDMyLCVyY3gKKwlhZGRxCSVyMTAsJXIxMQorCWFkY3EJJXJjeCwlcjgKKwlhZGNxCSVyYXgsJXI5CisJbW92cQklcjExLCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCisKKwltb3ZxCSVyMTEsJXJjeAorCXNobHEJJDMyLCVyMTEKKwltb3ZxCSVyZHgsJXIxMAorCW11bHEJJXJicAorCXNocnEJJDMyLCVyY3gKKwlhZGRxCSVyMTEsJXI4CisJYWRjcQklcmN4LCVyOQorCWFkY3EJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJeG9ycQklcjExLCVyMTEKKworCisKKwlhZGRxCSVyOCwlcjEyCisJYWRjcQklcjksJXIxMworCW1vdnEJJXIxMiwlcjgKKwlhZGNxCSVyMTAsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQklcjEzLCVyOQorCWFkY3EJJDAsJXIxMQorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXIxNCwlcjEwCisJc2JicQklcnNpLCVyMTMKKwlzYmJxCSQwLCVyMTQKKwltb3ZxCSVyMTUsJXJjeAorCXNiYnEJJXJicCwlcjE1CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXI4LCVyMTIKKwljbW92Y3EJJXI5LCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcjEwLCVyMTQKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZjcQklcmN4LCVyMTUKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxLC4tX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisudHlwZQlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19fZWNwX25pc3R6MjU2X211bF9tb250eDoKKworCisJbXVseHEJJXI5LCVyOCwlcjkKKwltdWx4cQklcjEwLCVyY3gsJXIxMAorCW1vdnEJJDMyLCVyMTQKKwl4b3JxCSVyMTMsJXIxMworCW11bHhxCSVyMTEsJXJicCwlcjExCisJbW92cQkuTHBvbHkrMjQoJXJpcCksJXIxNQorCWFkY3EJJXJjeCwlcjkKKwltdWx4cQklcjEyLCVyY3gsJXIxMgorCW1vdnEJJXI4LCVyZHgKKwlhZGNxCSVyYnAsJXIxMAorCXNobHhxCSVyMTQsJXI4LCVyYnAKKwlhZGNxCSVyY3gsJXIxMQorCXNocnhxCSVyMTQsJXI4LCVyY3gKKwlhZGNxCSQwLCVyMTIKKworCisKKwlhZGRxCSVyYnAsJXI5CisJYWRjcQklcmN4LCVyMTAKKworCW11bHhxCSVyMTUsJXJjeCwlcmJwCisJbW92cQk4KCVyYngpLCVyZHgKKwlhZGNxCSVyY3gsJXIxMQorCWFkY3EJJXJicCwlcjEyCisJYWRjcQkkMCwlcjEzCisJeG9ycQklcjgsJXI4CisKKworCisJbXVseHEJMCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjkKKwlhZG94cQklcmJwLCVyMTAKKworCW11bHhxCTgrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJMTYrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCisJbXVseHEJMjQrMTI4KCVyc2kpLCVyY3gsJXJicAorCW1vdnEJJXI5LCVyZHgKKwlhZGN4cQklcmN4LCVyMTIKKwlzaGx4cQklcjE0LCVyOSwlcmN4CisJYWRveHEJJXJicCwlcjEzCisJc2hyeHEJJXIxNCwlcjksJXJicAorCisJYWRjeHEJJXI4LCVyMTMKKwlhZG94cQklcjgsJXI4CisJYWRjcQkkMCwlcjgKKworCisKKwlhZGRxCSVyY3gsJXIxMAorCWFkY3EJJXJicCwlcjExCisKKwltdWx4cQklcjE1LCVyY3gsJXJicAorCW1vdnEJMTYoJXJieCksJXJkeAorCWFkY3EJJXJjeCwlcjEyCisJYWRjcQklcmJwLCVyMTMKKwlhZGNxCSQwLCVyOAorCXhvcnEJJXI5LCVyOQorCisKKworCW11bHhxCTArMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJOCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQkxNisxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEyCisJYWRveHEJJXJicCwlcjEzCisKKwltdWx4cQkyNCsxMjgoJXJzaSksJXJjeCwlcmJwCisJbW92cQklcjEwLCVyZHgKKwlhZGN4cQklcmN4LCVyMTMKKwlzaGx4cQklcjE0LCVyMTAsJXJjeAorCWFkb3hxCSVyYnAsJXI4CisJc2hyeHEJJXIxNCwlcjEwLCVyYnAKKworCWFkY3hxCSVyOSwlcjgKKwlhZG94cQklcjksJXI5CisJYWRjcQkkMCwlcjkKKworCisKKwlhZGRxCSVyY3gsJXIxMQorCWFkY3EJJXJicCwlcjEyCisKKwltdWx4cQklcjE1LCVyY3gsJXJicAorCW1vdnEJMjQoJXJieCksJXJkeAorCWFkY3EJJXJjeCwlcjEzCisJYWRjcQklcmJwLCVyOAorCWFkY3EJJDAsJXI5CisJeG9ycQklcjEwLCVyMTAKKworCisKKwltdWx4cQkwKzEyOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKworCW11bHhxCTgrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCisJbXVseHEJMTYrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMworCWFkb3hxCSVyYnAsJXI4CisKKwltdWx4cQkyNCsxMjgoJXJzaSksJXJjeCwlcmJwCisJbW92cQklcjExLCVyZHgKKwlhZGN4cQklcmN4LCVyOAorCXNobHhxCSVyMTQsJXIxMSwlcmN4CisJYWRveHEJJXJicCwlcjkKKwlzaHJ4cQklcjE0LCVyMTEsJXJicAorCisJYWRjeHEJJXIxMCwlcjkKKwlhZG94cQklcjEwLCVyMTAKKwlhZGNxCSQwLCVyMTAKKworCisKKwlhZGRxCSVyY3gsJXIxMgorCWFkY3EJJXJicCwlcjEzCisKKwltdWx4cQklcjE1LCVyY3gsJXJicAorCW1vdnEJJXIxMiwlcmJ4CisJbW92cQkuTHBvbHkrOCglcmlwKSwlcjE0CisJYWRjcQklcmN4LCVyOAorCW1vdnEJJXIxMywlcmR4CisJYWRjcQklcmJwLCVyOQorCWFkY3EJJDAsJXIxMAorCisKKworCXhvcmwJJWVheCwlZWF4CisJbW92cQklcjgsJXJjeAorCXNiYnEJJC0xLCVyMTIKKwlzYmJxCSVyMTQsJXIxMworCXNiYnEJJDAsJXI4CisJbW92cQklcjksJXJicAorCXNiYnEJJXIxNSwlcjkKKwlzYmJxCSQwLCVyMTAKKworCWNtb3ZjcQklcmJ4LCVyMTIKKwljbW92Y3EJJXJkeCwlcjEzCisJbW92cQklcjEyLDAoJXJkaSkKKwljbW92Y3EJJXJjeCwlcjgKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZjcQklcmJwLCVyOQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4LC4tX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKy50eXBlCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4OgorCW11bHhxCSVyMTQsJXI5LCVyMTAKKwltdWx4cQklcjE1LCVyY3gsJXIxMQorCXhvcmwJJWVheCwlZWF4CisJYWRjcQklcmN4LCVyMTAKKwltdWx4cQklcjgsJXJicCwlcjEyCisJbW92cQklcjE0LCVyZHgKKwlhZGNxCSVyYnAsJXIxMQorCWFkY3EJJDAsJXIxMgorCXhvcnEJJXIxMywlcjEzCisKKworCW11bHhxCSVyMTUsJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQklcjgsJXJjeCwlcmJwCisJbW92cQklcjE1LCVyZHgKKwlhZGN4cQklcmN4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCisJbXVseHEJJXI4LCVyY3gsJXIxNAorCW1vdnEJMCsxMjgoJXJzaSksJXJkeAorCXhvcnEJJXIxNSwlcjE1CisJYWRjeHEJJXI5LCVyOQorCWFkb3hxCSVyY3gsJXIxMworCWFkY3hxCSVyMTAsJXIxMAorCWFkb3hxCSVyMTUsJXIxNAorCisJbXVseHEJJXJkeCwlcjgsJXJicAorCW1vdnEJOCsxMjgoJXJzaSksJXJkeAorCWFkY3hxCSVyMTEsJXIxMQorCWFkb3hxCSVyYnAsJXI5CisJYWRjeHEJJXIxMiwlcjEyCisJbXVseHEJJXJkeCwlcmN4LCVyYXgKKwltb3ZxCTE2KzEyOCglcnNpKSwlcmR4CisJYWRjeHEJJXIxMywlcjEzCisJYWRveHEJJXJjeCwlcjEwCisJYWRjeHEJJXIxNCwlcjE0CisuYnl0ZQkweDY3CisJbXVseHEJJXJkeCwlcmN4LCVyYnAKKwltb3ZxCTI0KzEyOCglcnNpKSwlcmR4CisJYWRveHEJJXJheCwlcjExCisJYWRjeHEJJXIxNSwlcjE1CisJYWRveHEJJXJjeCwlcjEyCisJbW92cQkkMzIsJXJzaQorCWFkb3hxCSVyYnAsJXIxMworLmJ5dGUJMHg2NywweDY3CisJbXVseHEJJXJkeCwlcmN4LCVyYXgKKwltb3ZxCS5McG9seSsyNCglcmlwKSwlcmR4CisJYWRveHEJJXJjeCwlcjE0CisJc2hseHEJJXJzaSwlcjgsJXJjeAorCWFkb3hxCSVyYXgsJXIxNQorCXNocnhxCSVyc2ksJXI4LCVyYXgKKwltb3ZxCSVyZHgsJXJicAorCisKKwlhZGRxCSVyY3gsJXI5CisJYWRjcQklcmF4LCVyMTAKKworCW11bHhxCSVyOCwlcmN4LCVyOAorCWFkY3EJJXJjeCwlcjExCisJc2hseHEJJXJzaSwlcjksJXJjeAorCWFkY3EJJDAsJXI4CisJc2hyeHEJJXJzaSwlcjksJXJheAorCisKKwlhZGRxCSVyY3gsJXIxMAorCWFkY3EJJXJheCwlcjExCisKKwltdWx4cQklcjksJXJjeCwlcjkKKwlhZGNxCSVyY3gsJXI4CisJc2hseHEJJXJzaSwlcjEwLCVyY3gKKwlhZGNxCSQwLCVyOQorCXNocnhxCSVyc2ksJXIxMCwlcmF4CisKKworCWFkZHEJJXJjeCwlcjExCisJYWRjcQklcmF4LCVyOAorCisJbXVseHEJJXIxMCwlcmN4LCVyMTAKKwlhZGNxCSVyY3gsJXI5CisJc2hseHEJJXJzaSwlcjExLCVyY3gKKwlhZGNxCSQwLCVyMTAKKwlzaHJ4cQklcnNpLCVyMTEsJXJheAorCisKKwlhZGRxCSVyY3gsJXI4CisJYWRjcQklcmF4LCVyOQorCisJbXVseHEJJXIxMSwlcmN4LCVyMTEKKwlhZGNxCSVyY3gsJXIxMAorCWFkY3EJJDAsJXIxMQorCisJeG9ycQklcmR4LCVyZHgKKwlhZGRxCSVyOCwlcjEyCisJbW92cQkuTHBvbHkrOCglcmlwKSwlcnNpCisJYWRjcQklcjksJXIxMworCW1vdnEJJXIxMiwlcjgKKwlhZGNxCSVyMTAsJXIxNAorCWFkY3EJJXIxMSwlcjE1CisJbW92cQklcjEzLCVyOQorCWFkY3EJJDAsJXJkeAorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXIxNCwlcjEwCisJc2JicQklcnNpLCVyMTMKKwlzYmJxCSQwLCVyMTQKKwltb3ZxCSVyMTUsJXIxMQorCXNiYnEJJXJicCwlcjE1CisJc2JicQkkMCwlcmR4CisKKwljbW92Y3EJJXI4LCVyMTIKKwljbW92Y3EJJXI5LCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcjEwLCVyMTQKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZjcQklcjExLCVyMTUKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4LC4tX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKworLmdsb2JsCWVjcF9uaXN0ejI1Nl9zZWxlY3RfdzUKKy5oaWRkZW4gZWNwX25pc3R6MjU2X3NlbGVjdF93NQorLnR5cGUJZWNwX25pc3R6MjU2X3NlbGVjdF93NSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorZWNwX25pc3R6MjU2X3NlbGVjdF93NToKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyYXgKKwltb3ZxCTgoJXJheCksJXJheAorCXRlc3RsCSQzMiwlZWF4CisJam56CS5MYXZ4Ml9zZWxlY3RfdzUKKwltb3ZkcWEJLkxPbmUoJXJpcCksJXhtbTAKKwltb3ZkCSVlZHgsJXhtbTEKKworCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW02LCV4bW02CisJcHhvcgkleG1tNywleG1tNworCisJbW92ZHFhCSV4bW0wLCV4bW04CisJcHNodWZkCSQwLCV4bW0xLCV4bW0xCisKKwltb3ZxCSQxNiwlcmF4CisuTHNlbGVjdF9sb29wX3NzZV93NToKKworCW1vdmRxYQkleG1tOCwleG1tMTUKKwlwYWRkZAkleG1tMCwleG1tOAorCXBjbXBlcWQJJXhtbTEsJXhtbTE1CisKKwltb3ZkcWEJMCglcnNpKSwleG1tOQorCW1vdmRxYQkxNiglcnNpKSwleG1tMTAKKwltb3ZkcWEJMzIoJXJzaSksJXhtbTExCisJbW92ZHFhCTQ4KCVyc2kpLCV4bW0xMgorCW1vdmRxYQk2NCglcnNpKSwleG1tMTMKKwltb3ZkcWEJODAoJXJzaSksJXhtbTE0CisJbGVhcQk5NiglcnNpKSwlcnNpCisKKwlwYW5kCSV4bW0xNSwleG1tOQorCXBhbmQJJXhtbTE1LCV4bW0xMAorCXBvcgkleG1tOSwleG1tMgorCXBhbmQJJXhtbTE1LCV4bW0xMQorCXBvcgkleG1tMTAsJXhtbTMKKwlwYW5kCSV4bW0xNSwleG1tMTIKKwlwb3IJJXhtbTExLCV4bW00CisJcGFuZAkleG1tMTUsJXhtbTEzCisJcG9yCSV4bW0xMiwleG1tNQorCXBhbmQJJXhtbTE1LCV4bW0xNAorCXBvcgkleG1tMTMsJXhtbTYKKwlwb3IJJXhtbTE0LCV4bW03CisKKwlkZWNxCSVyYXgKKwlqbnoJLkxzZWxlY3RfbG9vcF9zc2VfdzUKKworCW1vdmRxdQkleG1tMiwwKCVyZGkpCisJbW92ZHF1CSV4bW0zLDE2KCVyZGkpCisJbW92ZHF1CSV4bW00LDMyKCVyZGkpCisJbW92ZHF1CSV4bW01LDQ4KCVyZGkpCisJbW92ZHF1CSV4bW02LDY0KCVyZGkpCisJbW92ZHF1CSV4bW03LDgwKCVyZGkpCisJLmJ5dGUJMHhmMywweGMzCisuTFNFSF9lbmRfZWNwX25pc3R6MjU2X3NlbGVjdF93NToKKy5zaXplCWVjcF9uaXN0ejI1Nl9zZWxlY3RfdzUsLi1lY3BfbmlzdHoyNTZfc2VsZWN0X3c1CisKKworCisuZ2xvYmwJZWNwX25pc3R6MjU2X3NlbGVjdF93NworLmhpZGRlbiBlY3BfbmlzdHoyNTZfc2VsZWN0X3c3CisudHlwZQllY3BfbmlzdHoyNTZfc2VsZWN0X3c3LEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfc2VsZWN0X3c3OgorCWxlYXEJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXJheAorCW1vdnEJOCglcmF4KSwlcmF4CisJdGVzdGwJJDMyLCVlYXgKKwlqbnoJLkxhdngyX3NlbGVjdF93NworCW1vdmRxYQkuTE9uZSglcmlwKSwleG1tOAorCW1vdmQJJWVkeCwleG1tMQorCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCisJbW92ZHFhCSV4bW04LCV4bW0wCisJcHNodWZkCSQwLCV4bW0xLCV4bW0xCisJbW92cQkkNjQsJXJheAorCisuTHNlbGVjdF9sb29wX3NzZV93NzoKKwltb3ZkcWEJJXhtbTgsJXhtbTE1CisJcGFkZGQJJXhtbTAsJXhtbTgKKwltb3ZkcWEJMCglcnNpKSwleG1tOQorCW1vdmRxYQkxNiglcnNpKSwleG1tMTAKKwlwY21wZXFkCSV4bW0xLCV4bW0xNQorCW1vdmRxYQkzMiglcnNpKSwleG1tMTEKKwltb3ZkcWEJNDgoJXJzaSksJXhtbTEyCisJbGVhcQk2NCglcnNpKSwlcnNpCisKKwlwYW5kCSV4bW0xNSwleG1tOQorCXBhbmQJJXhtbTE1LCV4bW0xMAorCXBvcgkleG1tOSwleG1tMgorCXBhbmQJJXhtbTE1LCV4bW0xMQorCXBvcgkleG1tMTAsJXhtbTMKKwlwYW5kCSV4bW0xNSwleG1tMTIKKwlwb3IJJXhtbTExLCV4bW00CisJcHJlZmV0Y2h0MAkyNTUoJXJzaSkKKwlwb3IJJXhtbTEyLCV4bW01CisKKwlkZWNxCSVyYXgKKwlqbnoJLkxzZWxlY3RfbG9vcF9zc2VfdzcKKworCW1vdmRxdQkleG1tMiwwKCVyZGkpCisJbW92ZHF1CSV4bW0zLDE2KCVyZGkpCisJbW92ZHF1CSV4bW00LDMyKCVyZGkpCisJbW92ZHF1CSV4bW01LDQ4KCVyZGkpCisJLmJ5dGUJMHhmMywweGMzCisuTFNFSF9lbmRfZWNwX25pc3R6MjU2X3NlbGVjdF93NzoKKy5zaXplCWVjcF9uaXN0ejI1Nl9zZWxlY3RfdzcsLi1lY3BfbmlzdHoyNTZfc2VsZWN0X3c3CisKKworLnR5cGUJZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3c1LEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzU6CisuTGF2eDJfc2VsZWN0X3c1OgorCXZ6ZXJvdXBwZXIKKwl2bW92ZHFhCS5MVHdvKCVyaXApLCV5bW0wCisKKwl2cHhvcgkleW1tMiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0zLCV5bW0zLCV5bW0zCisJdnB4b3IJJXltbTQsJXltbTQsJXltbTQKKworCXZtb3ZkcWEJLkxPbmUoJXJpcCksJXltbTUKKwl2bW92ZHFhCS5MVHdvKCVyaXApLCV5bW0xMAorCisJdm1vdmQJJWVkeCwleG1tMQorCXZwZXJtZAkleW1tMSwleW1tMiwleW1tMQorCisJbW92cQkkOCwlcmF4CisuTHNlbGVjdF9sb29wX2F2eDJfdzU6CisKKwl2bW92ZHFhCTAoJXJzaSksJXltbTYKKwl2bW92ZHFhCTMyKCVyc2kpLCV5bW03CisJdm1vdmRxYQk2NCglcnNpKSwleW1tOAorCisJdm1vdmRxYQk5NiglcnNpKSwleW1tMTEKKwl2bW92ZHFhCTEyOCglcnNpKSwleW1tMTIKKwl2bW92ZHFhCTE2MCglcnNpKSwleW1tMTMKKworCXZwY21wZXFkCSV5bW0xLCV5bW01LCV5bW05CisJdnBjbXBlcWQJJXltbTEsJXltbTEwLCV5bW0xNAorCisJdnBhZGRkCSV5bW0wLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW0wLCV5bW0xMCwleW1tMTAKKwlsZWFxCTE5MiglcnNpKSwlcnNpCisKKwl2cGFuZAkleW1tOSwleW1tNiwleW1tNgorCXZwYW5kCSV5bW05LCV5bW03LCV5bW03CisJdnBhbmQJJXltbTksJXltbTgsJXltbTgKKwl2cGFuZAkleW1tMTQsJXltbTExLCV5bW0xMQorCXZwYW5kCSV5bW0xNCwleW1tMTIsJXltbTEyCisJdnBhbmQJJXltbTE0LCV5bW0xMywleW1tMTMKKworCXZweG9yCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTcsJXltbTMsJXltbTMKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZweG9yCSV5bW0xMSwleW1tMiwleW1tMgorCXZweG9yCSV5bW0xMiwleW1tMywleW1tMworCXZweG9yCSV5bW0xMywleW1tNCwleW1tNAorCisJZGVjcQklcmF4CisJam56CS5Mc2VsZWN0X2xvb3BfYXZ4Ml93NQorCisJdm1vdmRxdQkleW1tMiwwKCVyZGkpCisJdm1vdmRxdQkleW1tMywzMiglcmRpKQorCXZtb3ZkcXUJJXltbTQsNjQoJXJkaSkKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCisuTFNFSF9lbmRfZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3c1OgorLnNpemUJZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3c1LC4tZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3c1CisKKworCisuZ2xvYmwJZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3c3CisuaGlkZGVuIGVjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NworLnR5cGUJZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3c3LEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3Rfdzc6CisuTGF2eDJfc2VsZWN0X3c3OgorCXZ6ZXJvdXBwZXIKKwl2bW92ZHFhCS5MVGhyZWUoJXJpcCksJXltbTAKKworCXZweG9yCSV5bW0yLCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTMsJXltbTMsJXltbTMKKworCXZtb3ZkcWEJLkxPbmUoJXJpcCksJXltbTQKKwl2bW92ZHFhCS5MVHdvKCVyaXApLCV5bW04CisJdm1vdmRxYQkuTFRocmVlKCVyaXApLCV5bW0xMgorCisJdm1vdmQJJWVkeCwleG1tMQorCXZwZXJtZAkleW1tMSwleW1tMiwleW1tMQorCisKKwltb3ZxCSQyMSwlcmF4CisuTHNlbGVjdF9sb29wX2F2eDJfdzc6CisKKwl2bW92ZHFhCTAoJXJzaSksJXltbTUKKwl2bW92ZHFhCTMyKCVyc2kpLCV5bW02CisKKwl2bW92ZHFhCTY0KCVyc2kpLCV5bW05CisJdm1vdmRxYQk5NiglcnNpKSwleW1tMTAKKworCXZtb3ZkcWEJMTI4KCVyc2kpLCV5bW0xMworCXZtb3ZkcWEJMTYwKCVyc2kpLCV5bW0xNAorCisJdnBjbXBlcWQJJXltbTEsJXltbTQsJXltbTcKKwl2cGNtcGVxZAkleW1tMSwleW1tOCwleW1tMTEKKwl2cGNtcGVxZAkleW1tMSwleW1tMTIsJXltbTE1CisKKwl2cGFkZGQJJXltbTAsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTAsJXltbTgsJXltbTgKKwl2cGFkZGQJJXltbTAsJXltbTEyLCV5bW0xMgorCWxlYXEJMTkyKCVyc2kpLCVyc2kKKworCXZwYW5kCSV5bW03LCV5bW01LCV5bW01CisJdnBhbmQJJXltbTcsJXltbTYsJXltbTYKKwl2cGFuZAkleW1tMTEsJXltbTksJXltbTkKKwl2cGFuZAkleW1tMTEsJXltbTEwLCV5bW0xMAorCXZwYW5kCSV5bW0xNSwleW1tMTMsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW0xNCwleW1tMTQKKworCXZweG9yCSV5bW01LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTYsJXltbTMsJXltbTMKKwl2cHhvcgkleW1tOSwleW1tMiwleW1tMgorCXZweG9yCSV5bW0xMCwleW1tMywleW1tMworCXZweG9yCSV5bW0xMywleW1tMiwleW1tMgorCXZweG9yCSV5bW0xNCwleW1tMywleW1tMworCisJZGVjcQklcmF4CisJam56CS5Mc2VsZWN0X2xvb3BfYXZ4Ml93NworCisKKwl2bW92ZHFhCTAoJXJzaSksJXltbTUKKwl2bW92ZHFhCTMyKCVyc2kpLCV5bW02CisKKwl2cGNtcGVxZAkleW1tMSwleW1tNCwleW1tNworCisJdnBhbmQJJXltbTcsJXltbTUsJXltbTUKKwl2cGFuZAkleW1tNywleW1tNiwleW1tNgorCisJdnB4b3IJJXltbTUsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tNiwleW1tMywleW1tMworCisJdm1vdmRxdQkleW1tMiwwKCVyZGkpCisJdm1vdmRxdQkleW1tMywzMiglcmRpKQorCXZ6ZXJvdXBwZXIKKwkuYnl0ZQkweGYzLDB4YzMKKy5MU0VIX2VuZF9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3Rfdzc6Cisuc2l6ZQllY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzcsLi1lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzcKKy50eXBlCV9fZWNwX25pc3R6MjU2X2FkZF90b3EsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19fZWNwX25pc3R6MjU2X2FkZF90b3E6CisJeG9ycQklcjExLCVyMTEKKwlhZGRxCTAoJXJieCksJXIxMgorCWFkY3EJOCglcmJ4KSwlcjEzCisJbW92cQklcjEyLCVyYXgKKwlhZGNxCTE2KCVyYngpLCVyOAorCWFkY3EJMjQoJXJieCksJXI5CisJbW92cQklcjEzLCVyYnAKKwlhZGNxCSQwLCVyMTEKKworCXN1YnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXJheCwlcjEyCisJY21vdmNxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwwKCVyZGkpCisJY21vdmNxCSVyY3gsJXI4CisJbW92cQklcjEzLDgoJXJkaSkKKwljbW92Y3EJJXIxMCwlcjkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fZWNwX25pc3R6MjU2X2FkZF90b3EsLi1fX2VjcF9uaXN0ejI1Nl9hZGRfdG9xCisKKy50eXBlCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xOgorCXN1YnEJMCglcmJ4KSwlcjEyCisJc2JicQk4KCVyYngpLCVyMTMKKwltb3ZxCSVyMTIsJXJheAorCXNiYnEJMTYoJXJieCksJXI4CisJc2JicQkyNCglcmJ4KSwlcjkKKwltb3ZxCSVyMTMsJXJicAorCXNiYnEJJXIxMSwlcjExCisKKwlhZGRxCSQtMSwlcjEyCisJbW92cQklcjgsJXJjeAorCWFkY3EJJXIxNCwlcjEzCisJYWRjcQkkMCwlcjgKKwltb3ZxCSVyOSwlcjEwCisJYWRjcQklcjE1LCVyOQorCXRlc3RxCSVyMTEsJXIxMQorCisJY21vdnpxCSVyYXgsJXIxMgorCWNtb3Z6cQklcmJwLCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3Z6cQklcmN4LCVyOAorCW1vdnEJJXIxMyw4KCVyZGkpCisJY21vdnpxCSVyMTAsJXI5CisJbW92cQklcjgsMTYoJXJkaSkKKwltb3ZxCSVyOSwyNCglcmRpKQorCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEsLi1fX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworLnR5cGUJX19lY3BfbmlzdHoyNTZfc3VicSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19lY3BfbmlzdHoyNTZfc3VicToKKwlzdWJxCSVyMTIsJXJheAorCXNiYnEJJXIxMywlcmJwCisJbW92cQklcmF4LCVyMTIKKwlzYmJxCSVyOCwlcmN4CisJc2JicQklcjksJXIxMAorCW1vdnEJJXJicCwlcjEzCisJc2JicQklcjExLCVyMTEKKworCWFkZHEJJC0xLCVyYXgKKwltb3ZxCSVyY3gsJXI4CisJYWRjcQklcjE0LCVyYnAKKwlhZGNxCSQwLCVyY3gKKwltb3ZxCSVyMTAsJXI5CisJYWRjcQklcjE1LCVyMTAKKwl0ZXN0cQklcjExLCVyMTEKKworCWNtb3ZuenEJJXJheCwlcjEyCisJY21vdm56cQklcmJwLCVyMTMKKwljbW92bnpxCSVyY3gsJXI4CisJY21vdm56cQklcjEwLCVyOQorCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfX2VjcF9uaXN0ejI1Nl9zdWJxLC4tX19lY3BfbmlzdHoyNTZfc3VicQorCisudHlwZQlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19fZWNwX25pc3R6MjU2X211bF9ieV8ycToKKwl4b3JxCSVyMTEsJXIxMQorCWFkZHEJJXIxMiwlcjEyCisJYWRjcQklcjEzLCVyMTMKKwltb3ZxCSVyMTIsJXJheAorCWFkY3EJJXI4LCVyOAorCWFkY3EJJXI5LCVyOQorCW1vdnEJJXIxMywlcmJwCisJYWRjcQkkMCwlcjExCisKKwlzdWJxCSQtMSwlcjEyCisJbW92cQklcjgsJXJjeAorCXNiYnEJJXIxNCwlcjEzCisJc2JicQkkMCwlcjgKKwltb3ZxCSVyOSwlcjEwCisJc2JicQklcjE1LCVyOQorCXNiYnEJJDAsJXIxMQorCisJY21vdmNxCSVyYXgsJXIxMgorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcmN4LCVyOAorCW1vdnEJJXIxMyw4KCVyZGkpCisJY21vdmNxCSVyMTAsJXI5CisJbW92cQklcjgsMTYoJXJkaSkKKwltb3ZxCSVyOSwyNCglcmRpKQorCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEsLi1fX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEKKy5nbG9ibAllY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxlCisuaGlkZGVuIGVjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGUKKy50eXBlCWVjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGUsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGU6CisuY2ZpX3N0YXJ0cHJvYwkKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyY3gKKwltb3ZxCTgoJXJjeCksJXJjeAorCWFuZGwJJDB4ODAxMDAsJWVjeAorCWNtcGwJJDB4ODAxMDAsJWVjeAorCWplCS5McG9pbnRfZG91YmxleAorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMTYKKwlwdXNocQklcmJ4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYngsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE1LC01NgorCXN1YnEJJDE2MCs4LCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJMzIqNSs4CisuTHBvaW50X2RvdWJsZXFfYm9keToKKworLkxwb2ludF9kb3VibGVfc2hvcnRjdXRxOgorCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJbW92cQklcnNpLCVyYngKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTEKKwltb3ZxCTMyKzAoJXJzaSksJXIxMgorCW1vdnEJMzIrOCglcnNpKSwlcjEzCisJbW92cQkzMisxNiglcnNpKSwlcjgKKwltb3ZxCTMyKzI0KCVyc2kpLCVyOQorCW1vdnEJLkxwb2x5KzgoJXJpcCksJXIxNAorCW1vdnEJLkxwb2x5KzI0KCVyaXApLCVyMTUKKwltb3ZkcWEJJXhtbTAsOTYoJXJzcCkKKwltb3ZkcWEJJXhtbTEsOTYrMTYoJXJzcCkKKwlsZWFxCTMyKCVyZGkpLCVyMTAKKwlsZWFxCTY0KCVyZGkpLCVyMTEKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMTk5CisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIwMgorLmJ5dGUJMTAyLDczLDE1LDExMCwyMTEKKworCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEKKworCW1vdnEJNjQrMCglcnNpKSwlcmF4CisJbW92cQk2NCs4KCVyc2kpLCVyMTQKKwltb3ZxCTY0KzE2KCVyc2kpLCVyMTUKKwltb3ZxCTY0KzI0KCVyc2kpLCVyOAorCWxlYXEJNjQtMCglcnNpKSwlcnNpCisJbGVhcQk2NCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCW1vdnEJMCswKCVyc3ApLCVyYXgKKwltb3ZxCTgrMCglcnNwKSwlcjE0CisJbGVhcQkwKzAoJXJzcCksJXJzaQorCW1vdnEJMTYrMCglcnNwKSwlcjE1CisJbW92cQkyNCswKCVyc3ApLCVyOAorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCW1vdnEJMzIoJXJieCksJXJheAorCW1vdnEJNjQrMCglcmJ4KSwlcjkKKwltb3ZxCTY0KzgoJXJieCksJXIxMAorCW1vdnEJNjQrMTYoJXJieCksJXIxMQorCW1vdnEJNjQrMjQoJXJieCksJXIxMgorCWxlYXEJNjQtMCglcmJ4KSwlcnNpCisJbGVhcQkzMiglcmJ4KSwlcmJ4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIxNQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEKKworCW1vdnEJOTYrMCglcnNwKSwlcjEyCisJbW92cQk5Nis4KCVyc3ApLCVyMTMKKwlsZWFxCTY0KCVyc3ApLCVyYngKKwltb3ZxCTk2KzE2KCVyc3ApLCVyOAorCW1vdnEJOTYrMjQoJXJzcCksJXI5CisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9hZGRfdG9xCisKKwltb3ZxCTk2KzAoJXJzcCksJXIxMgorCW1vdnEJOTYrOCglcnNwKSwlcjEzCisJbGVhcQk2NCglcnNwKSwlcmJ4CisJbW92cQk5NisxNiglcnNwKSwlcjgKKwltb3ZxCTk2KzI0KCVyc3ApLCVyOQorCWxlYXEJNjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwltb3ZxCTArMCglcnNwKSwlcmF4CisJbW92cQk4KzAoJXJzcCksJXIxNAorCWxlYXEJMCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxNQorCW1vdnEJMjQrMCglcnNwKSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA3CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKwl4b3JxCSVyOSwlcjkKKwltb3ZxCSVyMTIsJXJheAorCWFkZHEJJC0xLCVyMTIKKwltb3ZxCSVyMTMsJXIxMAorCWFkY3EJJXJzaSwlcjEzCisJbW92cQklcjE0LCVyY3gKKwlhZGNxCSQwLCVyMTQKKwltb3ZxCSVyMTUsJXI4CisJYWRjcQklcmJwLCVyMTUKKwlhZGNxCSQwLCVyOQorCXhvcnEJJXJzaSwlcnNpCisJdGVzdHEJJDEsJXJheAorCisJY21vdnpxCSVyYXgsJXIxMgorCWNtb3Z6cQklcjEwLCVyMTMKKwljbW92enEJJXJjeCwlcjE0CisJY21vdnpxCSVyOCwlcjE1CisJY21vdnpxCSVyc2ksJXI5CisKKwltb3ZxCSVyMTMsJXJheAorCXNocnEJJDEsJXIxMgorCXNobHEJJDYzLCVyYXgKKwltb3ZxCSVyMTQsJXIxMAorCXNocnEJJDEsJXIxMworCW9ycQklcmF4LCVyMTIKKwlzaGxxCSQ2MywlcjEwCisJbW92cQklcjE1LCVyY3gKKwlzaHJxCSQxLCVyMTQKKwlvcnEJJXIxMCwlcjEzCisJc2hscQkkNjMsJXJjeAorCW1vdnEJJXIxMiwwKCVyZGkpCisJc2hycQkkMSwlcjE1CisJbW92cQklcjEzLDgoJXJkaSkKKwlzaGxxCSQ2MywlcjkKKwlvcnEJJXJjeCwlcjE0CisJb3JxCSVyOSwlcjE1CisJbW92cQklcjE0LDE2KCVyZGkpCisJbW92cQklcjE1LDI0KCVyZGkpCisJbW92cQk2NCglcnNwKSwlcmF4CisJbGVhcQk2NCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbGVhcQkxMjgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJxCisKKwlsZWFxCTMyKCVyc3ApLCVyYngKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X2FkZF90b3EKKworCW1vdnEJOTYoJXJzcCksJXJheAorCWxlYXEJOTYoJXJzcCksJXJieAorCW1vdnEJMCswKCVyc3ApLCVyOQorCW1vdnEJOCswKCVyc3ApLCVyMTAKKwlsZWFxCTArMCglcnNwKSwlcnNpCisJbW92cQkxNiswKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzAoJXJzcCksJXIxMgorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYXEJMTI4KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8ycQorCisJbW92cQkwKzMyKCVyc3ApLCVyYXgKKwltb3ZxCTgrMzIoJXJzcCksJXIxNAorCWxlYXEJMCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjE1CisJbW92cQkyNCszMiglcnNwKSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCWxlYXEJMTI4KCVyc3ApLCVyYngKKwltb3ZxCSVyMTQsJXI4CisJbW92cQklcjE1LCVyOQorCW1vdnEJJXJzaSwlcjE0CisJbW92cQklcmJwLCVyMTUKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92cQkwKzAoJXJzcCksJXJheAorCW1vdnEJMCs4KCVyc3ApLCVyYnAKKwltb3ZxCTArMTYoJXJzcCksJXJjeAorCW1vdnEJMCsyNCglcnNwKSwlcjEwCisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YnEKKworCW1vdnEJMzIoJXJzcCksJXJheAorCWxlYXEJMzIoJXJzcCksJXJieAorCW1vdnEJJXIxMiwlcjE0CisJeG9ybAklZWN4LCVlY3gKKwltb3ZxCSVyMTIsMCswKCVyc3ApCisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTMsMCs4KCVyc3ApCisJY21vdnpxCSVyOCwlcjExCisJbW92cQklcjgsMCsxNiglcnNwKQorCWxlYXEJMC0wKCVyc3ApLCVyc2kKKwljbW92enEJJXI5LCVyMTIKKwltb3ZxCSVyOSwwKzI0KCVyc3ApCisJbW92cQklcjE0LCVyOQorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDMKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA3CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCWxlYXEJMTYwKzU2KCVyc3ApLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbW92cQktOCglcnNpKSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTHBvaW50X2RvdWJsZXFfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQllY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxlLC4tZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZQorLmdsb2JsCWVjcF9uaXN0ejI1Nl9wb2ludF9hZGQKKy5oaWRkZW4gZWNwX25pc3R6MjU2X3BvaW50X2FkZAorLnR5cGUJZWNwX25pc3R6MjU2X3BvaW50X2FkZCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorZWNwX25pc3R6MjU2X3BvaW50X2FkZDoKKy5jZmlfc3RhcnRwcm9jCQorCWxlYXEJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXJjeAorCW1vdnEJOCglcmN4KSwlcmN4CisJYW5kbAkkMHg4MDEwMCwlZWN4CisJY21wbAkkMHg4MDEwMCwlZWN4CisJamUJLkxwb2ludF9hZGR4CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJc3VicQkkNTc2KzgsJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAkzMioxOCs4CisuTHBvaW50X2FkZHFfYm9keToKKworCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJbW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTY0KCVyc2kpLCV4bW00CisJbW92ZHF1CTgwKCVyc2kpLCV4bW01CisJbW92cQklcnNpLCVyYngKKwltb3ZxCSVyZHgsJXJzaQorCW1vdmRxYQkleG1tMCwzODQoJXJzcCkKKwltb3ZkcWEJJXhtbTEsMzg0KzE2KCVyc3ApCisJbW92ZHFhCSV4bW0yLDQxNiglcnNwKQorCW1vdmRxYQkleG1tMyw0MTYrMTYoJXJzcCkKKwltb3ZkcWEJJXhtbTQsNDQ4KCVyc3ApCisJbW92ZHFhCSV4bW01LDQ0OCsxNiglcnNwKQorCXBvcgkleG1tNCwleG1tNQorCisJbW92ZHF1CTAoJXJzaSksJXhtbTAKKwlwc2h1ZmQJJDB4YjEsJXhtbTUsJXhtbTMKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTEKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTMKKwltb3ZxCTY0KzAoJXJzaSksJXJheAorCW1vdnEJNjQrOCglcnNpKSwlcjE0CisJbW92cQk2NCsxNiglcnNpKSwlcjE1CisJbW92cQk2NCsyNCglcnNpKSwlcjgKKwltb3ZkcWEJJXhtbTAsNDgwKCVyc3ApCisJcHNodWZkCSQweDFlLCV4bW01LCV4bW00CisJbW92ZHFhCSV4bW0xLDQ4MCsxNiglcnNwKQorCW1vdmRxdQk2NCglcnNpKSwleG1tMAorCW1vdmRxdQk4MCglcnNpKSwleG1tMQorCW1vdmRxYQkleG1tMiw1MTIoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNTEyKzE2KCVyc3ApCisJcG9yCSV4bW00LCV4bW01CisJcHhvcgkleG1tNCwleG1tNAorCXBvcgkleG1tMCwleG1tMQorLmJ5dGUJMTAyLDcyLDE1LDExMCwxOTkKKworCWxlYXEJNjQtMCglcnNpKSwlcnNpCisJbW92cQklcmF4LDU0NCswKCVyc3ApCisJbW92cQklcjE0LDU0NCs4KCVyc3ApCisJbW92cQklcjE1LDU0NCsxNiglcnNwKQorCW1vdnEJJXI4LDU0NCsyNCglcnNwKQorCWxlYXEJOTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwlwY21wZXFkCSV4bW00LCV4bW01CisJcHNodWZkCSQweGIxLCV4bW0xLCV4bW00CisJcG9yCSV4bW0xLCV4bW00CisJcHNodWZkCSQwLCV4bW01LCV4bW01CisJcHNodWZkCSQweDFlLCV4bW00LCV4bW0zCisJcG9yCSV4bW0zLCV4bW00CisJcHhvcgkleG1tMywleG1tMworCXBjbXBlcWQJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTQsJXhtbTQKKwltb3ZxCTY0KzAoJXJieCksJXJheAorCW1vdnEJNjQrOCglcmJ4KSwlcjE0CisJbW92cQk2NCsxNiglcmJ4KSwlcjE1CisJbW92cQk2NCsyNCglcmJ4KSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjAzCisKKwlsZWFxCTY0LTAoJXJieCksJXJzaQorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwltb3ZxCTU0NCglcnNwKSwlcmF4CisJbGVhcQk1NDQoJXJzcCksJXJieAorCW1vdnEJMCs5NiglcnNwKSwlcjkKKwltb3ZxCTgrOTYoJXJzcCksJXIxMAorCWxlYXEJMCs5NiglcnNwKSwlcnNpCisJbW92cQkxNis5NiglcnNwKSwlcjExCisJbW92cQkyNCs5NiglcnNwKSwlcjEyCisJbGVhcQkyMjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTQ0OCglcnNwKSwlcmF4CisJbGVhcQk0NDgoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJMCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTQxNiglcnNwKSwlcmF4CisJbGVhcQk0MTYoJXJzcCksJXJieAorCW1vdnEJMCsyMjQoJXJzcCksJXI5CisJbW92cQk4KzIyNCglcnNwKSwlcjEwCisJbGVhcQkwKzIyNCglcnNwKSwlcnNpCisJbW92cQkxNisyMjQoJXJzcCksJXIxMQorCW1vdnEJMjQrMjI0KCVyc3ApLCVyMTIKKwlsZWFxCTIyNCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCW1vdnEJNTEyKCVyc3ApLCVyYXgKKwlsZWFxCTUxMiglcnNwKSwlcmJ4CisJbW92cQkwKzI1NiglcnNwKSwlcjkKKwltb3ZxCTgrMjU2KCVyc3ApLCVyMTAKKwlsZWFxCTArMjU2KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzI1NiglcnNwKSwlcjExCisJbW92cQkyNCsyNTYoJXJzcCksJXIxMgorCWxlYXEJMjU2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbGVhcQkyMjQoJXJzcCksJXJieAorCWxlYXEJNjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwlvcnEJJXIxMywlcjEyCisJbW92ZHFhCSV4bW00LCV4bW0yCisJb3JxCSVyOCwlcjEyCisJb3JxCSVyOSwlcjEyCisJcG9yCSV4bW01LCV4bW0yCisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIyMAorCisJbW92cQkzODQoJXJzcCksJXJheAorCWxlYXEJMzg0KCVyc3ApLCVyYngKKwltb3ZxCTArOTYoJXJzcCksJXI5CisJbW92cQk4Kzk2KCVyc3ApLCVyMTAKKwlsZWFxCTArOTYoJXJzcCksJXJzaQorCW1vdnEJMTYrOTYoJXJzcCksJXIxMQorCW1vdnEJMjQrOTYoJXJzcCksJXIxMgorCWxlYXEJMTYwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92cQk0ODAoJXJzcCksJXJheAorCWxlYXEJNDgwKCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCTArMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMTkyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbGVhcQkxNjAoJXJzcCksJXJieAorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCW9ycQklcjEzLCVyMTIKKwlvcnEJJXI4LCVyMTIKKwlvcnEJJXI5LCVyMTIKKworLmJ5dGUJMHgzZQorCWpuegkuTGFkZF9wcm9jZWVkcQorLmJ5dGUJMTAyLDczLDE1LDEyNiwyMDgKKy5ieXRlCTEwMiw3MywxNSwxMjYsMjE3CisJdGVzdHEJJXI4LCVyOAorCWpuegkuTGFkZF9wcm9jZWVkcQorCXRlc3RxCSVyOSwlcjkKKwlqegkuTGFkZF9kb3VibGVxCisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxdQkleG1tMCwwKCVyZGkpCisJbW92ZHF1CSV4bW0wLDE2KCVyZGkpCisJbW92ZHF1CSV4bW0wLDMyKCVyZGkpCisJbW92ZHF1CSV4bW0wLDQ4KCVyZGkpCisJbW92ZHF1CSV4bW0wLDY0KCVyZGkpCisJbW92ZHF1CSV4bW0wLDgwKCVyZGkpCisJam1wCS5MYWRkX2RvbmVxCisKKy5hbGlnbgkzMgorLkxhZGRfZG91YmxlcToKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA2CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5OQorCWFkZHEJJDQxNiwlcnNwCisJam1wCS5McG9pbnRfZG91YmxlX3Nob3J0Y3V0cQorCisuYWxpZ24JMzIKKy5MYWRkX3Byb2NlZWRxOgorCW1vdnEJMCs2NCglcnNwKSwlcmF4CisJbW92cQk4KzY0KCVyc3ApLCVyMTQKKwlsZWFxCTArNjQoJXJzcCksJXJzaQorCW1vdnEJMTYrNjQoJXJzcCksJXIxNQorCW1vdnEJMjQrNjQoJXJzcCksJXI4CisJbGVhcQk5NiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCW1vdnEJNDQ4KCVyc3ApLCVyYXgKKwlsZWFxCTQ0OCglcnNwKSwlcmJ4CisJbW92cQkwKzAoJXJzcCksJXI5CisJbW92cQk4KzAoJXJzcCksJXIxMAorCWxlYXEJMCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxMQorCW1vdnEJMjQrMCglcnNwKSwlcjEyCisJbGVhcQkzNTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTArMCglcnNwKSwlcmF4CisJbW92cQk4KzAoJXJzcCksJXIxNAorCWxlYXEJMCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxNQorCW1vdnEJMjQrMCglcnNwKSwlcjgKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92cQk1NDQoJXJzcCksJXJheAorCWxlYXEJNTQ0KCVyc3ApLCVyYngKKwltb3ZxCTArMzUyKCVyc3ApLCVyOQorCW1vdnEJOCszNTIoJXJzcCksJXIxMAorCWxlYXEJMCszNTIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzUyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzM1MiglcnNwKSwlcjEyCisJbGVhcQkzNTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTAoJXJzcCksJXJheAorCWxlYXEJMCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTEyOCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCW1vdnEJMTYwKCVyc3ApLCVyYXgKKwlsZWFxCTE2MCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTE5MiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCisKKworCXhvcnEJJXIxMSwlcjExCisJYWRkcQklcjEyLCVyMTIKKwlsZWFxCTk2KCVyc3ApLCVyc2kKKwlhZGNxCSVyMTMsJXIxMworCW1vdnEJJXIxMiwlcmF4CisJYWRjcQklcjgsJXI4CisJYWRjcQklcjksJXI5CisJbW92cQklcjEzLCVyYnAKKwlhZGNxCSQwLCVyMTEKKworCXN1YnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXJheCwlcjEyCisJbW92cQkwKCVyc2kpLCVyYXgKKwljbW92Y3EJJXJicCwlcjEzCisJbW92cQk4KCVyc2kpLCVyYnAKKwljbW92Y3EJJXJjeCwlcjgKKwltb3ZxCTE2KCVyc2kpLCVyY3gKKwljbW92Y3EJJXIxMCwlcjkKKwltb3ZxCTI0KCVyc2kpLCVyMTAKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VicQorCisJbGVhcQkxMjgoJXJzcCksJXJieAorCWxlYXEJMjg4KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92cQkxOTIrMCglcnNwKSwlcmF4CisJbW92cQkxOTIrOCglcnNwKSwlcmJwCisJbW92cQkxOTIrMTYoJXJzcCksJXJjeAorCW1vdnEJMTkyKzI0KCVyc3ApLCVyMTAKKwlsZWFxCTMyMCglcnNwKSwlcmRpCisKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YnEKKworCW1vdnEJJXIxMiwwKCVyZGkpCisJbW92cQklcjEzLDgoJXJkaSkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisJbW92cQkxMjgoJXJzcCksJXJheAorCWxlYXEJMTI4KCVyc3ApLCVyYngKKwltb3ZxCTArMjI0KCVyc3ApLCVyOQorCW1vdnEJOCsyMjQoJXJzcCksJXIxMAorCWxlYXEJMCsyMjQoJXJzcCksJXJzaQorCW1vdnEJMTYrMjI0KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzIyNCglcnNwKSwlcjEyCisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTMyMCglcnNwKSwlcmF4CisJbGVhcQkzMjAoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJMCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkzMjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWFxCTI1NiglcnNwKSwlcmJ4CisJbGVhcQkzMjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkzNTIoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkzNTIrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTU0NCglcnNwKSwleG1tMgorCXBhbmQJNTQ0KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAk0NDgoJXJzcCksJXhtbTIKKwlwYW5kCTQ0OCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiw2NCglcmRpKQorCW1vdmRxdQkleG1tMyw4MCglcmRpKQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMjg4KCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMjg4KzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAk0ODAoJXJzcCksJXhtbTIKKwlwYW5kCTQ4MCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYW5kbgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhbmQJMzg0KCVyc3ApLCV4bW0yCisJcGFuZAkzODQrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsMCglcmRpKQorCW1vdmRxdQkleG1tMywxNiglcmRpKQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMzIwKCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMzIwKzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAk1MTIoJXJzcCksJXhtbTIKKwlwYW5kCTUxMisxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYW5kbgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhbmQJNDE2KCVyc3ApLCV4bW0yCisJcGFuZAk0MTYrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTMsNDgoJXJkaSkKKworLkxhZGRfZG9uZXE6CisJbGVhcQk1NzYrNTYoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwltb3ZxCS04KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5McG9pbnRfYWRkcV9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWVjcF9uaXN0ejI1Nl9wb2ludF9hZGQsLi1lY3BfbmlzdHoyNTZfcG9pbnRfYWRkCisuZ2xvYmwJZWNwX25pc3R6MjU2X3BvaW50X2FkZF9hZmZpbmUKKy5oaWRkZW4gZWNwX25pc3R6MjU2X3BvaW50X2FkZF9hZmZpbmUKKy50eXBlCWVjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lLEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZToKKy5jZmlfc3RhcnRwcm9jCQorCWxlYXEJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXJjeAorCW1vdnEJOCglcmN4KSwlcmN4CisJYW5kbAkkMHg4MDEwMCwlZWN4CisJY21wbAkkMHg4MDEwMCwlZWN4CisJamUJLkxwb2ludF9hZGRfYWZmaW5leAorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMTYKKwlwdXNocQklcmJ4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYngsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE1LC01NgorCXN1YnEJJDQ4MCs4LCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJMzIqMTUrOAorLkxhZGRfYWZmaW5lcV9ib2R5OgorCisJbW92ZHF1CTAoJXJzaSksJXhtbTAKKwltb3ZxCSVyZHgsJXJieAorCW1vdmRxdQkxNiglcnNpKSwleG1tMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tMworCW1vdmRxdQk2NCglcnNpKSwleG1tNAorCW1vdmRxdQk4MCglcnNpKSwleG1tNQorCW1vdnEJNjQrMCglcnNpKSwlcmF4CisJbW92cQk2NCs4KCVyc2kpLCVyMTQKKwltb3ZxCTY0KzE2KCVyc2kpLCVyMTUKKwltb3ZxCTY0KzI0KCVyc2kpLCVyOAorCW1vdmRxYQkleG1tMCwzMjAoJXJzcCkKKwltb3ZkcWEJJXhtbTEsMzIwKzE2KCVyc3ApCisJbW92ZHFhCSV4bW0yLDM1MiglcnNwKQorCW1vdmRxYQkleG1tMywzNTIrMTYoJXJzcCkKKwltb3ZkcWEJJXhtbTQsMzg0KCVyc3ApCisJbW92ZHFhCSV4bW01LDM4NCsxNiglcnNwKQorCXBvcgkleG1tNCwleG1tNQorCisJbW92ZHF1CTAoJXJieCksJXhtbTAKKwlwc2h1ZmQJJDB4YjEsJXhtbTUsJXhtbTMKKwltb3ZkcXUJMTYoJXJieCksJXhtbTEKKwltb3ZkcXUJMzIoJXJieCksJXhtbTIKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcXUJNDgoJXJieCksJXhtbTMKKwltb3ZkcWEJJXhtbTAsNDE2KCVyc3ApCisJcHNodWZkCSQweDFlLCV4bW01LCV4bW00CisJbW92ZHFhCSV4bW0xLDQxNisxNiglcnNwKQorCXBvcgkleG1tMCwleG1tMQorLmJ5dGUJMTAyLDcyLDE1LDExMCwxOTkKKwltb3ZkcWEJJXhtbTIsNDQ4KCVyc3ApCisJbW92ZHFhCSV4bW0zLDQ0OCsxNiglcnNwKQorCXBvcgkleG1tMiwleG1tMworCXBvcgkleG1tNCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTQKKwlwb3IJJXhtbTEsJXhtbTMKKworCWxlYXEJNjQtMCglcnNpKSwlcnNpCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCXBjbXBlcWQJJXhtbTQsJXhtbTUKKwlwc2h1ZmQJJDB4YjEsJXhtbTMsJXhtbTQKKwltb3ZxCTAoJXJieCksJXJheAorCisJbW92cQklcjEyLCVyOQorCXBvcgkleG1tMywleG1tNAorCXBzaHVmZAkkMCwleG1tNSwleG1tNQorCXBzaHVmZAkkMHgxZSwleG1tNCwleG1tMworCW1vdnEJJXIxMywlcjEwCisJcG9yCSV4bW0zLCV4bW00CisJcHhvcgkleG1tMywleG1tMworCW1vdnEJJXIxNCwlcjExCisJcGNtcGVxZAkleG1tMywleG1tNAorCXBzaHVmZAkkMCwleG1tNCwleG1tNAorCisJbGVhcQkzMi0wKCVyc3ApLCVyc2kKKwltb3ZxCSVyMTUsJXIxMgorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYXEJMzIwKCVyc3ApLCVyYngKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92cQkzODQoJXJzcCksJXJheAorCWxlYXEJMzg0KCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCTArMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTM4NCglcnNwKSwlcmF4CisJbGVhcQkzODQoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJMCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkyODgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTQ0OCglcnNwKSwlcmF4CisJbGVhcQk0NDgoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJMCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYXEJMzUyKCVyc3ApLCVyYngKKwlsZWFxCTk2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92cQkwKzY0KCVyc3ApLCVyYXgKKwltb3ZxCTgrNjQoJXJzcCksJXIxNAorCWxlYXEJMCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjE1CisJbW92cQkyNCs2NCglcnNwKSwlcjgKKwlsZWFxCTEyOCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCW1vdnEJMCs5NiglcnNwKSwlcmF4CisJbW92cQk4Kzk2KCVyc3ApLCVyMTQKKwlsZWFxCTArOTYoJXJzcCksJXJzaQorCW1vdnEJMTYrOTYoJXJzcCksJXIxNQorCW1vdnEJMjQrOTYoJXJzcCksJXI4CisJbGVhcQkxOTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwltb3ZxCTEyOCglcnNwKSwlcmF4CisJbGVhcQkxMjgoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJMCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkxNjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTMyMCglcnNwKSwlcmF4CisJbGVhcQkzMjAoJXJzcCksJXJieAorCW1vdnEJMCsxMjgoJXJzcCksJXI5CisJbW92cQk4KzEyOCglcnNwKSwlcjEwCisJbGVhcQkwKzEyOCglcnNwKSwlcnNpCisJbW92cQkxNisxMjgoJXJzcCksJXIxMQorCW1vdnEJMjQrMTI4KCVyc3ApLCVyMTIKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKworCisKKwl4b3JxCSVyMTEsJXIxMQorCWFkZHEJJXIxMiwlcjEyCisJbGVhcQkxOTIoJXJzcCksJXJzaQorCWFkY3EJJXIxMywlcjEzCisJbW92cQklcjEyLCVyYXgKKwlhZGNxCSVyOCwlcjgKKwlhZGNxCSVyOSwlcjkKKwltb3ZxCSVyMTMsJXJicAorCWFkY3EJJDAsJXIxMQorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXI4LCVyY3gKKwlzYmJxCSVyMTQsJXIxMworCXNiYnEJJDAsJXI4CisJbW92cQklcjksJXIxMAorCXNiYnEJJXIxNSwlcjkKKwlzYmJxCSQwLCVyMTEKKworCWNtb3ZjcQklcmF4LCVyMTIKKwltb3ZxCTAoJXJzaSksJXJheAorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCTgoJXJzaSksJXJicAorCWNtb3ZjcQklcmN4LCVyOAorCW1vdnEJMTYoJXJzaSksJXJjeAorCWNtb3ZjcQklcjEwLCVyOQorCW1vdnEJMjQoJXJzaSksJXIxMAorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJxCisKKwlsZWFxCTE2MCglcnNwKSwlcmJ4CisJbGVhcQkyMjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwltb3ZxCTArMCglcnNwKSwlcmF4CisJbW92cQkwKzgoJXJzcCksJXJicAorCW1vdnEJMCsxNiglcnNwKSwlcmN4CisJbW92cQkwKzI0KCVyc3ApLCVyMTAKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VicQorCisJbW92cQklcjEyLDAoJXJkaSkKKwltb3ZxCSVyMTMsOCglcmRpKQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKwltb3ZxCTM1MiglcnNwKSwlcmF4CisJbGVhcQkzNTIoJXJzcCksJXJieAorCW1vdnEJMCsxNjAoJXJzcCksJXI5CisJbW92cQk4KzE2MCglcnNwKSwlcjEwCisJbGVhcQkwKzE2MCglcnNwKSwlcnNpCisJbW92cQkxNisxNjAoJXJzcCksJXIxMQorCW1vdnEJMjQrMTYwKCVyc3ApLCVyMTIKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92cQk5NiglcnNwKSwlcmF4CisJbGVhcQk5NiglcnNwKSwlcmJ4CisJbW92cQkwKzY0KCVyc3ApLCVyOQorCW1vdnEJOCs2NCglcnNwKSwlcjEwCisJbGVhcQkwKzY0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzY0KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzY0KCVyc3ApLCVyMTIKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbGVhcQkzMiglcnNwKSwlcmJ4CisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyODgoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyODgrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCS5MT05FX21vbnQoJXJpcCksJXhtbTIKKwlwYW5kCS5MT05FX21vbnQrMTYoJXJpcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMQorCXBhbmRuCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFuZG4JJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYW5kCTM4NCglcnNwKSwleG1tMgorCXBhbmQJMzg0KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisJbW92ZHF1CSV4bW0yLDY0KCVyZGkpCisJbW92ZHF1CSV4bW0zLDgwKCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyMjQoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyMjQrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTQxNiglcnNwKSwleG1tMgorCXBhbmQJNDE2KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzMjAoJXJzcCksJXhtbTIKKwlwYW5kCTMyMCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwwKCVyZGkpCisJbW92ZHF1CSV4bW0zLDE2KCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyNTYoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyNTYrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTQ0OCglcnNwKSwleG1tMgorCXBhbmQJNDQ4KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzNTIoJXJzcCksJXhtbTIKKwlwYW5kCTM1MisxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwzMiglcmRpKQorCW1vdmRxdQkleG1tMyw0OCglcmRpKQorCisJbGVhcQk0ODArNTYoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwltb3ZxCS04KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MYWRkX2FmZmluZXFfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQllY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZSwuLWVjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lCisudHlwZQlfX2VjcF9uaXN0ejI1Nl9hZGRfdG94LEBmdW5jdGlvbgorLmFsaWduCTMyCitfX2VjcF9uaXN0ejI1Nl9hZGRfdG94OgorCXhvcnEJJXIxMSwlcjExCisJYWRjcQkwKCVyYngpLCVyMTIKKwlhZGNxCTgoJXJieCksJXIxMworCW1vdnEJJXIxMiwlcmF4CisJYWRjcQkxNiglcmJ4KSwlcjgKKwlhZGNxCTI0KCVyYngpLCVyOQorCW1vdnEJJXIxMywlcmJwCisJYWRjcQkkMCwlcjExCisKKwl4b3JxCSVyMTAsJXIxMAorCXNiYnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXJheCwlcjEyCisJY21vdmNxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwwKCVyZGkpCisJY21vdmNxCSVyY3gsJXI4CisJbW92cQklcjEzLDgoJXJkaSkKKwljbW92Y3EJJXIxMCwlcjkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fZWNwX25pc3R6MjU2X2FkZF90b3gsLi1fX2VjcF9uaXN0ejI1Nl9hZGRfdG94CisKKy50eXBlCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214OgorCXhvcnEJJXIxMSwlcjExCisJc2JicQkwKCVyYngpLCVyMTIKKwlzYmJxCTgoJXJieCksJXIxMworCW1vdnEJJXIxMiwlcmF4CisJc2JicQkxNiglcmJ4KSwlcjgKKwlzYmJxCTI0KCVyYngpLCVyOQorCW1vdnEJJXIxMywlcmJwCisJc2JicQkkMCwlcjExCisKKwl4b3JxCSVyMTAsJXIxMAorCWFkY3EJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJYWRjcQklcjE0LCVyMTMKKwlhZGNxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlhZGNxCSVyMTUsJXI5CisKKwlidHEJJDAsJXIxMQorCWNtb3ZuY3EJJXJheCwlcjEyCisJY21vdm5jcQklcmJwLCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZuY3EJJXJjeCwlcjgKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZuY3EJJXIxMCwlcjkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teCwuLV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisudHlwZQlfX2VjcF9uaXN0ejI1Nl9zdWJ4LEBmdW5jdGlvbgorLmFsaWduCTMyCitfX2VjcF9uaXN0ejI1Nl9zdWJ4OgorCXhvcnEJJXIxMSwlcjExCisJc2JicQklcjEyLCVyYXgKKwlzYmJxCSVyMTMsJXJicAorCW1vdnEJJXJheCwlcjEyCisJc2JicQklcjgsJXJjeAorCXNiYnEJJXI5LCVyMTAKKwltb3ZxCSVyYnAsJXIxMworCXNiYnEJJDAsJXIxMQorCisJeG9ycQklcjksJXI5CisJYWRjcQkkLTEsJXJheAorCW1vdnEJJXJjeCwlcjgKKwlhZGNxCSVyMTQsJXJicAorCWFkY3EJJDAsJXJjeAorCW1vdnEJJXIxMCwlcjkKKwlhZGNxCSVyMTUsJXIxMAorCisJYnRxCSQwLCVyMTEKKwljbW92Y3EJJXJheCwlcjEyCisJY21vdmNxCSVyYnAsJXIxMworCWNtb3ZjcQklcmN4LCVyOAorCWNtb3ZjcQklcjEwLCVyOQorCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfX2VjcF9uaXN0ejI1Nl9zdWJ4LC4tX19lY3BfbmlzdHoyNTZfc3VieAorCisudHlwZQlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMngsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK19fZWNwX25pc3R6MjU2X211bF9ieV8yeDoKKwl4b3JxCSVyMTEsJXIxMQorCWFkY3EJJXIxMiwlcjEyCisJYWRjcQklcjEzLCVyMTMKKwltb3ZxCSVyMTIsJXJheAorCWFkY3EJJXI4LCVyOAorCWFkY3EJJXI5LCVyOQorCW1vdnEJJXIxMywlcmJwCisJYWRjcQkkMCwlcjExCisKKwl4b3JxCSVyMTAsJXIxMAorCXNiYnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXJheCwlcjEyCisJY21vdmNxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwwKCVyZGkpCisJY21vdmNxCSVyY3gsJXI4CisJbW92cQklcjEzLDgoJXJkaSkKKwljbW92Y3EJJXIxMCwlcjkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fZWNwX25pc3R6MjU2X211bF9ieV8yeCwuLV9fZWNwX25pc3R6MjU2X211bF9ieV8yeAorLnR5cGUJZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZXgsQGZ1bmN0aW9uCisuYWxpZ24JMzIKK2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGV4OgorLmNmaV9zdGFydHByb2MJCisuTHBvaW50X2RvdWJsZXg6CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJc3VicQkkMTYwKzgsJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAkzMio1KzgKKy5McG9pbnRfZG91YmxleF9ib2R5OgorCisuTHBvaW50X2RvdWJsZV9zaG9ydGN1dHg6CisJbW92ZHF1CTAoJXJzaSksJXhtbTAKKwltb3ZxCSVyc2ksJXJieAorCW1vdmRxdQkxNiglcnNpKSwleG1tMQorCW1vdnEJMzIrMCglcnNpKSwlcjEyCisJbW92cQkzMis4KCVyc2kpLCVyMTMKKwltb3ZxCTMyKzE2KCVyc2kpLCVyOAorCW1vdnEJMzIrMjQoJXJzaSksJXI5CisJbW92cQkuTHBvbHkrOCglcmlwKSwlcjE0CisJbW92cQkuTHBvbHkrMjQoJXJpcCksJXIxNQorCW1vdmRxYQkleG1tMCw5NiglcnNwKQorCW1vdmRxYQkleG1tMSw5NisxNiglcnNwKQorCWxlYXEJMzIoJXJkaSksJXIxMAorCWxlYXEJNjQoJXJkaSksJXIxMQorLmJ5dGUJMTAyLDcyLDE1LDExMCwxOTkKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjAyCisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIxMQorCisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8yeAorCisJbW92cQk2NCswKCVyc2kpLCVyZHgKKwltb3ZxCTY0KzgoJXJzaSksJXIxNAorCW1vdnEJNjQrMTYoJXJzaSksJXIxNQorCW1vdnEJNjQrMjQoJXJzaSksJXI4CisJbGVhcQk2NC0xMjgoJXJzaSksJXJzaQorCWxlYXEJNjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3ZxCTArMCglcnNwKSwlcmR4CisJbW92cQk4KzAoJXJzcCksJXIxNAorCWxlYXEJLTEyOCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxNQorCW1vdnEJMjQrMCglcnNwKSwlcjgKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3ZxCTMyKCVyYngpLCVyZHgKKwltb3ZxCTY0KzAoJXJieCksJXI5CisJbW92cQk2NCs4KCVyYngpLCVyMTAKKwltb3ZxCTY0KzE2KCVyYngpLCVyMTEKKwltb3ZxCTY0KzI0KCVyYngpLCVyMTIKKwlsZWFxCTY0LTEyOCglcmJ4KSwlcnNpCisJbGVhcQkzMiglcmJ4KSwlcmJ4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIxNQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMngKKworCW1vdnEJOTYrMCglcnNwKSwlcjEyCisJbW92cQk5Nis4KCVyc3ApLCVyMTMKKwlsZWFxCTY0KCVyc3ApLCVyYngKKwltb3ZxCTk2KzE2KCVyc3ApLCVyOAorCW1vdnEJOTYrMjQoJXJzcCksJXI5CisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9hZGRfdG94CisKKwltb3ZxCTk2KzAoJXJzcCksJXIxMgorCW1vdnEJOTYrOCglcnNwKSwlcjEzCisJbGVhcQk2NCglcnNwKSwlcmJ4CisJbW92cQk5NisxNiglcnNwKSwlcjgKKwltb3ZxCTk2KzI0KCVyc3ApLCVyOQorCWxlYXEJNjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKwltb3ZxCTArMCglcnNwKSwlcmR4CisJbW92cQk4KzAoJXJzcCksJXIxNAorCWxlYXEJLTEyOCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxNQorCW1vdnEJMjQrMCglcnNwKSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA3CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKwl4b3JxCSVyOSwlcjkKKwltb3ZxCSVyMTIsJXJheAorCWFkZHEJJC0xLCVyMTIKKwltb3ZxCSVyMTMsJXIxMAorCWFkY3EJJXJzaSwlcjEzCisJbW92cQklcjE0LCVyY3gKKwlhZGNxCSQwLCVyMTQKKwltb3ZxCSVyMTUsJXI4CisJYWRjcQklcmJwLCVyMTUKKwlhZGNxCSQwLCVyOQorCXhvcnEJJXJzaSwlcnNpCisJdGVzdHEJJDEsJXJheAorCisJY21vdnpxCSVyYXgsJXIxMgorCWNtb3Z6cQklcjEwLCVyMTMKKwljbW92enEJJXJjeCwlcjE0CisJY21vdnpxCSVyOCwlcjE1CisJY21vdnpxCSVyc2ksJXI5CisKKwltb3ZxCSVyMTMsJXJheAorCXNocnEJJDEsJXIxMgorCXNobHEJJDYzLCVyYXgKKwltb3ZxCSVyMTQsJXIxMAorCXNocnEJJDEsJXIxMworCW9ycQklcmF4LCVyMTIKKwlzaGxxCSQ2MywlcjEwCisJbW92cQklcjE1LCVyY3gKKwlzaHJxCSQxLCVyMTQKKwlvcnEJJXIxMCwlcjEzCisJc2hscQkkNjMsJXJjeAorCW1vdnEJJXIxMiwwKCVyZGkpCisJc2hycQkkMSwlcjE1CisJbW92cQklcjEzLDgoJXJkaSkKKwlzaGxxCSQ2MywlcjkKKwlvcnEJJXJjeCwlcjE0CisJb3JxCSVyOSwlcjE1CisJbW92cQklcjE0LDE2KCVyZGkpCisJbW92cQklcjE1LDI0KCVyZGkpCisJbW92cQk2NCglcnNwKSwlcmR4CisJbGVhcQk2NCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQktMTI4KzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbGVhcQkxMjgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJ4CisKKwlsZWFxCTMyKCVyc3ApLCVyYngKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X2FkZF90b3gKKworCW1vdnEJOTYoJXJzcCksJXJkeAorCWxlYXEJOTYoJXJzcCksJXJieAorCW1vdnEJMCswKCVyc3ApLCVyOQorCW1vdnEJOCswKCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMCglcnNwKSwlcnNpCisJbW92cQkxNiswKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzAoJXJzcCksJXIxMgorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYXEJMTI4KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8yeAorCisJbW92cQkwKzMyKCVyc3ApLCVyZHgKKwltb3ZxCTgrMzIoJXJzcCksJXIxNAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjE1CisJbW92cQkyNCszMiglcnNwKSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCWxlYXEJMTI4KCVyc3ApLCVyYngKKwltb3ZxCSVyMTQsJXI4CisJbW92cQklcjE1LCVyOQorCW1vdnEJJXJzaSwlcjE0CisJbW92cQklcmJwLCVyMTUKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJbW92cQkwKzAoJXJzcCksJXJheAorCW1vdnEJMCs4KCVyc3ApLCVyYnAKKwltb3ZxCTArMTYoJXJzcCksJXJjeAorCW1vdnEJMCsyNCglcnNwKSwlcjEwCisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YngKKworCW1vdnEJMzIoJXJzcCksJXJkeAorCWxlYXEJMzIoJXJzcCksJXJieAorCW1vdnEJJXIxMiwlcjE0CisJeG9ybAklZWN4LCVlY3gKKwltb3ZxCSVyMTIsMCswKCVyc3ApCisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTMsMCs4KCVyc3ApCisJY21vdnpxCSVyOCwlcjExCisJbW92cQklcjgsMCsxNiglcnNwKQorCWxlYXEJMC0xMjgoJXJzcCksJXJzaQorCWNtb3Z6cQklcjksJXIxMgorCW1vdnEJJXI5LDArMjQoJXJzcCkKKwltb3ZxCSVyMTQsJXI5CisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwMworLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDcKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJbGVhcQkxNjArNTYoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwltb3ZxCS04KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5McG9pbnRfZG91YmxleF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWVjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGV4LC4tZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZXgKKy50eXBlCWVjcF9uaXN0ejI1Nl9wb2ludF9hZGR4LEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfcG9pbnRfYWRkeDoKKy5jZmlfc3RhcnRwcm9jCQorLkxwb2ludF9hZGR4OgorCXB1c2hxCSVyYnAKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJicCwtMTYKKwlwdXNocQklcmJ4CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyYngsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjE1LC01NgorCXN1YnEJJDU3Nis4LCVyc3AKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJMzIqMTgrOAorLkxwb2ludF9hZGR4X2JvZHk6CisKKwltb3ZkcXUJMCglcnNpKSwleG1tMAorCW1vdmRxdQkxNiglcnNpKSwleG1tMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tMworCW1vdmRxdQk2NCglcnNpKSwleG1tNAorCW1vdmRxdQk4MCglcnNpKSwleG1tNQorCW1vdnEJJXJzaSwlcmJ4CisJbW92cQklcmR4LCVyc2kKKwltb3ZkcWEJJXhtbTAsMzg0KCVyc3ApCisJbW92ZHFhCSV4bW0xLDM4NCsxNiglcnNwKQorCW1vdmRxYQkleG1tMiw0MTYoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNDE2KzE2KCVyc3ApCisJbW92ZHFhCSV4bW00LDQ0OCglcnNwKQorCW1vdmRxYQkleG1tNSw0NDgrMTYoJXJzcCkKKwlwb3IJJXhtbTQsJXhtbTUKKworCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJcHNodWZkCSQweGIxLCV4bW01LCV4bW0zCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJbW92cQk2NCswKCVyc2kpLCVyZHgKKwltb3ZxCTY0KzgoJXJzaSksJXIxNAorCW1vdnEJNjQrMTYoJXJzaSksJXIxNQorCW1vdnEJNjQrMjQoJXJzaSksJXI4CisJbW92ZHFhCSV4bW0wLDQ4MCglcnNwKQorCXBzaHVmZAkkMHgxZSwleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMSw0ODArMTYoJXJzcCkKKwltb3ZkcXUJNjQoJXJzaSksJXhtbTAKKwltb3ZkcXUJODAoJXJzaSksJXhtbTEKKwltb3ZkcWEJJXhtbTIsNTEyKCVyc3ApCisJbW92ZHFhCSV4bW0zLDUxMisxNiglcnNwKQorCXBvcgkleG1tNCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTQKKwlwb3IJJXhtbTAsJXhtbTEKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMTk5CisKKwlsZWFxCTY0LTEyOCglcnNpKSwlcnNpCisJbW92cQklcmR4LDU0NCswKCVyc3ApCisJbW92cQklcjE0LDU0NCs4KCVyc3ApCisJbW92cQklcjE1LDU0NCsxNiglcnNwKQorCW1vdnEJJXI4LDU0NCsyNCglcnNwKQorCWxlYXEJOTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwlwY21wZXFkCSV4bW00LCV4bW01CisJcHNodWZkCSQweGIxLCV4bW0xLCV4bW00CisJcG9yCSV4bW0xLCV4bW00CisJcHNodWZkCSQwLCV4bW01LCV4bW01CisJcHNodWZkCSQweDFlLCV4bW00LCV4bW0zCisJcG9yCSV4bW0zLCV4bW00CisJcHhvcgkleG1tMywleG1tMworCXBjbXBlcWQJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTQsJXhtbTQKKwltb3ZxCTY0KzAoJXJieCksJXJkeAorCW1vdnEJNjQrOCglcmJ4KSwlcjE0CisJbW92cQk2NCsxNiglcmJ4KSwlcjE1CisJbW92cQk2NCsyNCglcmJ4KSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjAzCisKKwlsZWFxCTY0LTEyOCglcmJ4KSwlcnNpCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCW1vdnEJNTQ0KCVyc3ApLCVyZHgKKwlsZWFxCTU0NCglcnNwKSwlcmJ4CisJbW92cQkwKzk2KCVyc3ApLCVyOQorCW1vdnEJOCs5NiglcnNwKSwlcjEwCisJbGVhcQktMTI4Kzk2KCVyc3ApLCVyc2kKKwltb3ZxCTE2Kzk2KCVyc3ApLCVyMTEKKwltb3ZxCTI0Kzk2KCVyc3ApLCVyMTIKKwlsZWFxCTIyNCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdnEJNDQ4KCVyc3ApLCVyZHgKKwlsZWFxCTQ0OCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQktMTI4KzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTI1NiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdnEJNDE2KCVyc3ApLCVyZHgKKwlsZWFxCTQxNiglcnNwKSwlcmJ4CisJbW92cQkwKzIyNCglcnNwKSwlcjkKKwltb3ZxCTgrMjI0KCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMjI0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzIyNCglcnNwKSwlcjExCisJbW92cQkyNCsyMjQoJXJzcCksJXIxMgorCWxlYXEJMjI0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQk1MTIoJXJzcCksJXJkeAorCWxlYXEJNTEyKCVyc3ApLCVyYngKKwltb3ZxCTArMjU2KCVyc3ApLCVyOQorCW1vdnEJOCsyNTYoJXJzcCksJXIxMAorCWxlYXEJLTEyOCsyNTYoJXJzcCksJXJzaQorCW1vdnEJMTYrMjU2KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzI1NiglcnNwKSwlcjEyCisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwlsZWFxCTIyNCglcnNwKSwlcmJ4CisJbGVhcQk2NCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW9ycQklcjEzLCVyMTIKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlvcnEJJXI4LCVyMTIKKwlvcnEJJXI5LCVyMTIKKwlwb3IJJXhtbTUsJXhtbTIKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjIwCisKKwltb3ZxCTM4NCglcnNwKSwlcmR4CisJbGVhcQkzODQoJXJzcCksJXJieAorCW1vdnEJMCs5NiglcnNwKSwlcjkKKwltb3ZxCTgrOTYoJXJzcCksJXIxMAorCWxlYXEJLTEyOCs5NiglcnNwKSwlcnNpCisJbW92cQkxNis5NiglcnNwKSwlcjExCisJbW92cQkyNCs5NiglcnNwKSwlcjEyCisJbGVhcQkxNjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTQ4MCglcnNwKSwlcmR4CisJbGVhcQk0ODAoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkxOTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwlsZWFxCTE2MCglcnNwKSwlcmJ4CisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJb3JxCSVyMTMsJXIxMgorCW9ycQklcjgsJXIxMgorCW9ycQklcjksJXIxMgorCisuYnl0ZQkweDNlCisJam56CS5MYWRkX3Byb2NlZWR4CisuYnl0ZQkxMDIsNzMsMTUsMTI2LDIwOAorLmJ5dGUJMTAyLDczLDE1LDEyNiwyMTcKKwl0ZXN0cQklcjgsJXI4CisJam56CS5MYWRkX3Byb2NlZWR4CisJdGVzdHEJJXI5LCVyOQorCWp6CS5MYWRkX2RvdWJsZXgKKworLmJ5dGUJMTAyLDcyLDE1LDEyNiwxOTkKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHF1CSV4bW0wLDAoJXJkaSkKKwltb3ZkcXUJJXhtbTAsMTYoJXJkaSkKKwltb3ZkcXUJJXhtbTAsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTAsNDgoJXJkaSkKKwltb3ZkcXUJJXhtbTAsNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTAsODAoJXJkaSkKKwlqbXAJLkxhZGRfZG9uZXgKKworLmFsaWduCTMyCisuTGFkZF9kb3VibGV4OgorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDYKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisJYWRkcQkkNDE2LCVyc3AKKwlqbXAJLkxwb2ludF9kb3VibGVfc2hvcnRjdXR4CisKKy5hbGlnbgkzMgorLkxhZGRfcHJvY2VlZHg6CisJbW92cQkwKzY0KCVyc3ApLCVyZHgKKwltb3ZxCTgrNjQoJXJzcCksJXIxNAorCWxlYXEJLTEyOCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjE1CisJbW92cQkyNCs2NCglcnNwKSwlcjgKKwlsZWFxCTk2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eAorCisJbW92cQk0NDgoJXJzcCksJXJkeAorCWxlYXEJNDQ4KCVyc3ApLCVyYngKKwltb3ZxCTArMCglcnNwKSwlcjkKKwltb3ZxCTgrMCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzAoJXJzcCksJXJzaQorCW1vdnEJMTYrMCglcnNwKSwlcjExCisJbW92cQkyNCswKCVyc3ApLCVyMTIKKwlsZWFxCTM1MiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdnEJMCswKCVyc3ApLCVyZHgKKwltb3ZxCTgrMCglcnNwKSwlcjE0CisJbGVhcQktMTI4KzAoJXJzcCksJXJzaQorCW1vdnEJMTYrMCglcnNwKSwlcjE1CisJbW92cQkyNCswKCVyc3ApLCVyOAorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3ZxCTU0NCglcnNwKSwlcmR4CisJbGVhcQk1NDQoJXJzcCksJXJieAorCW1vdnEJMCszNTIoJXJzcCksJXI5CisJbW92cQk4KzM1MiglcnNwKSwlcjEwCisJbGVhcQktMTI4KzM1MiglcnNwKSwlcnNpCisJbW92cQkxNiszNTIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzUyKCVyc3ApLCVyMTIKKwlsZWFxCTM1MiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdnEJMCglcnNwKSwlcmR4CisJbGVhcQkwKCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMTI4KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQkxNjAoJXJzcCksJXJkeAorCWxlYXEJMTYwKCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMTkyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisKKworCisJeG9ycQklcjExLCVyMTEKKwlhZGRxCSVyMTIsJXIxMgorCWxlYXEJOTYoJXJzcCksJXJzaQorCWFkY3EJJXIxMywlcjEzCisJbW92cQklcjEyLCVyYXgKKwlhZGNxCSVyOCwlcjgKKwlhZGNxCSVyOSwlcjkKKwltb3ZxCSVyMTMsJXJicAorCWFkY3EJJDAsJXIxMQorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXI4LCVyY3gKKwlzYmJxCSVyMTQsJXIxMworCXNiYnEJJDAsJXI4CisJbW92cQklcjksJXIxMAorCXNiYnEJJXIxNSwlcjkKKwlzYmJxCSQwLCVyMTEKKworCWNtb3ZjcQklcmF4LCVyMTIKKwltb3ZxCTAoJXJzaSksJXJheAorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCTgoJXJzaSksJXJicAorCWNtb3ZjcQklcmN4LCVyOAorCW1vdnEJMTYoJXJzaSksJXJjeAorCWNtb3ZjcQklcjEwLCVyOQorCW1vdnEJMjQoJXJzaSksJXIxMAorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwlsZWFxCTEyOCglcnNwKSwlcmJ4CisJbGVhcQkyODgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKwltb3ZxCTE5MiswKCVyc3ApLCVyYXgKKwltb3ZxCTE5Mis4KCVyc3ApLCVyYnAKKwltb3ZxCTE5MisxNiglcnNwKSwlcmN4CisJbW92cQkxOTIrMjQoJXJzcCksJXIxMAorCWxlYXEJMzIwKCVyc3ApLCVyZGkKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VieAorCisJbW92cQklcjEyLDAoJXJkaSkKKwltb3ZxCSVyMTMsOCglcmRpKQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKwltb3ZxCTEyOCglcnNwKSwlcmR4CisJbGVhcQkxMjgoJXJzcCksJXJieAorCW1vdnEJMCsyMjQoJXJzcCksJXI5CisJbW92cQk4KzIyNCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzIyNCglcnNwKSwlcnNpCisJbW92cQkxNisyMjQoJXJzcCksJXIxMQorCW1vdnEJMjQrMjI0KCVyc3ApLCVyMTIKKwlsZWFxCTI1NiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdnEJMzIwKCVyc3ApLCVyZHgKKwlsZWFxCTMyMCglcnNwKSwlcmJ4CisJbW92cQkwKzY0KCVyc3ApLCVyOQorCW1vdnEJOCs2NCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzY0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzY0KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzY0KCVyc3ApLCVyMTIKKwlsZWFxCTMyMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYXEJMjU2KCVyc3ApLCVyYngKKwlsZWFxCTMyMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworLmJ5dGUJMTAyLDcyLDE1LDEyNiwxOTkKKworCW1vdmRxYQkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMQorCXBhbmRuCTM1MiglcnNwKSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMgorCXBhbmRuCTM1MisxNiglcnNwKSwleG1tMQorCW1vdmRxYQkleG1tNSwleG1tMworCXBhbmQJNTQ0KCVyc3ApLCV4bW0yCisJcGFuZAk1NDQrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMQorCXBhbmRuCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFuZG4JJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYW5kCTQ0OCglcnNwKSwleG1tMgorCXBhbmQJNDQ4KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisJbW92ZHF1CSV4bW0yLDY0KCVyZGkpCisJbW92ZHF1CSV4bW0zLDgwKCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyODgoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyODgrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTQ4MCglcnNwKSwleG1tMgorCXBhbmQJNDgwKzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzODQoJXJzcCksJXhtbTIKKwlwYW5kCTM4NCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwwKCVyZGkpCisJbW92ZHF1CSV4bW0zLDE2KCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkzMjAoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkzMjArMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTUxMiglcnNwKSwleG1tMgorCXBhbmQJNTEyKzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAk0MTYoJXJzcCksJXhtbTIKKwlwYW5kCTQxNisxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwzMiglcmRpKQorCW1vdmRxdQkleG1tMyw0OCglcmRpKQorCisuTGFkZF9kb25leDoKKwlsZWFxCTU3Nis1NiglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw4CisJbW92cQktNDgoJXJzaSksJXIxNQorLmNmaV9yZXN0b3JlCSVyMTUKKwltb3ZxCS00MCglcnNpKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJLTMyKCVyc2kpLCVyMTMKKy5jZmlfcmVzdG9yZQklcjEzCisJbW92cQktMjQoJXJzaSksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCS0xNiglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCW1vdnEJLTgoJXJzaSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwlsZWFxCSglcnNpKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxwb2ludF9hZGR4X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJZWNwX25pc3R6MjU2X3BvaW50X2FkZHgsLi1lY3BfbmlzdHoyNTZfcG9pbnRfYWRkeAorLnR5cGUJZWNwX25pc3R6MjU2X3BvaW50X2FkZF9hZmZpbmV4LEBmdW5jdGlvbgorLmFsaWduCTMyCitlY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZXg6CisuY2ZpX3N0YXJ0cHJvYwkKKy5McG9pbnRfYWRkX2FmZmluZXg6CisJcHVzaHEJJXJicAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcmJwLC0xNgorCXB1c2hxCSVyYngKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXJieCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9hZGp1c3RfY2ZhX29mZnNldAk4CisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfYWRqdXN0X2NmYV9vZmZzZXQJOAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CTgKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJc3VicQkkNDgwKzgsJXJzcAorLmNmaV9hZGp1c3RfY2ZhX29mZnNldAkzMioxNSs4CisuTGFkZF9hZmZpbmV4X2JvZHk6CisKKwltb3ZkcXUJMCglcnNpKSwleG1tMAorCW1vdnEJJXJkeCwlcmJ4CisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJbW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTY0KCVyc2kpLCV4bW00CisJbW92ZHF1CTgwKCVyc2kpLCV4bW01CisJbW92cQk2NCswKCVyc2kpLCVyZHgKKwltb3ZxCTY0KzgoJXJzaSksJXIxNAorCW1vdnEJNjQrMTYoJXJzaSksJXIxNQorCW1vdnEJNjQrMjQoJXJzaSksJXI4CisJbW92ZHFhCSV4bW0wLDMyMCglcnNwKQorCW1vdmRxYQkleG1tMSwzMjArMTYoJXJzcCkKKwltb3ZkcWEJJXhtbTIsMzUyKCVyc3ApCisJbW92ZHFhCSV4bW0zLDM1MisxNiglcnNwKQorCW1vdmRxYQkleG1tNCwzODQoJXJzcCkKKwltb3ZkcWEJJXhtbTUsMzg0KzE2KCVyc3ApCisJcG9yCSV4bW00LCV4bW01CisKKwltb3ZkcXUJMCglcmJ4KSwleG1tMAorCXBzaHVmZAkkMHhiMSwleG1tNSwleG1tMworCW1vdmRxdQkxNiglcmJ4KSwleG1tMQorCW1vdmRxdQkzMiglcmJ4KSwleG1tMgorCXBvcgkleG1tMywleG1tNQorCW1vdmRxdQk0OCglcmJ4KSwleG1tMworCW1vdmRxYQkleG1tMCw0MTYoJXJzcCkKKwlwc2h1ZmQJJDB4MWUsJXhtbTUsJXhtbTQKKwltb3ZkcWEJJXhtbTEsNDE2KzE2KCVyc3ApCisJcG9yCSV4bW0wLCV4bW0xCisuYnl0ZQkxMDIsNzIsMTUsMTEwLDE5OQorCW1vdmRxYQkleG1tMiw0NDgoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNDQ4KzE2KCVyc3ApCisJcG9yCSV4bW0yLCV4bW0zCisJcG9yCSV4bW00LCV4bW01CisJcHhvcgkleG1tNCwleG1tNAorCXBvcgkleG1tMSwleG1tMworCisJbGVhcQk2NC0xMjgoJXJzaSksJXJzaQorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwlwY21wZXFkCSV4bW00LCV4bW01CisJcHNodWZkCSQweGIxLCV4bW0zLCV4bW00CisJbW92cQkwKCVyYngpLCVyZHgKKworCW1vdnEJJXIxMiwlcjkKKwlwb3IJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTUsJXhtbTUKKwlwc2h1ZmQJJDB4MWUsJXhtbTQsJXhtbTMKKwltb3ZxCSVyMTMsJXIxMAorCXBvcgkleG1tMywleG1tNAorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3ZxCSVyMTQsJXIxMQorCXBjbXBlcWQJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTQsJXhtbTQKKworCWxlYXEJMzItMTI4KCVyc3ApLCVyc2kKKwltb3ZxCSVyMTUsJXIxMgorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYXEJMzIwKCVyc3ApLCVyYngKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJbW92cQkzODQoJXJzcCksJXJkeAorCWxlYXEJMzg0KCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTM4NCglcnNwKSwlcmR4CisJbGVhcQkzODQoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJLTEyOCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkyODgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTQ0OCglcnNwKSwlcmR4CisJbGVhcQk0NDgoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYXEJMzUyKCVyc3ApLCVyYngKKwlsZWFxCTk2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJbW92cQkwKzY0KCVyc3ApLCVyZHgKKwltb3ZxCTgrNjQoJXJzcCksJXIxNAorCWxlYXEJLTEyOCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjE1CisJbW92cQkyNCs2NCglcnNwKSwlcjgKKwlsZWFxCTEyOCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCW1vdnEJMCs5NiglcnNwKSwlcmR4CisJbW92cQk4Kzk2KCVyc3ApLCVyMTQKKwlsZWFxCS0xMjgrOTYoJXJzcCksJXJzaQorCW1vdnEJMTYrOTYoJXJzcCksJXIxNQorCW1vdnEJMjQrOTYoJXJzcCksJXI4CisJbGVhcQkxOTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3ZxCTEyOCglcnNwKSwlcmR4CisJbGVhcQkxMjgoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJLTEyOCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkxNjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTMyMCglcnNwKSwlcmR4CisJbGVhcQkzMjAoJXJzcCksJXJieAorCW1vdnEJMCsxMjgoJXJzcCksJXI5CisJbW92cQk4KzEyOCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzEyOCglcnNwKSwlcnNpCisJbW92cQkxNisxMjgoJXJzcCksJXIxMQorCW1vdnEJMjQrMTI4KCVyc3ApLCVyMTIKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKworCisKKwl4b3JxCSVyMTEsJXIxMQorCWFkZHEJJXIxMiwlcjEyCisJbGVhcQkxOTIoJXJzcCksJXJzaQorCWFkY3EJJXIxMywlcjEzCisJbW92cQklcjEyLCVyYXgKKwlhZGNxCSVyOCwlcjgKKwlhZGNxCSVyOSwlcjkKKwltb3ZxCSVyMTMsJXJicAorCWFkY3EJJDAsJXIxMQorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXI4LCVyY3gKKwlzYmJxCSVyMTQsJXIxMworCXNiYnEJJDAsJXI4CisJbW92cQklcjksJXIxMAorCXNiYnEJJXIxNSwlcjkKKwlzYmJxCSQwLCVyMTEKKworCWNtb3ZjcQklcmF4LCVyMTIKKwltb3ZxCTAoJXJzaSksJXJheAorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCTgoJXJzaSksJXJicAorCWNtb3ZjcQklcmN4LCVyOAorCW1vdnEJMTYoJXJzaSksJXJjeAorCWNtb3ZjcQklcjEwLCVyOQorCW1vdnEJMjQoJXJzaSksJXIxMAorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwlsZWFxCTE2MCglcnNwKSwlcmJ4CisJbGVhcQkyMjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKwltb3ZxCTArMCglcnNwKSwlcmF4CisJbW92cQkwKzgoJXJzcCksJXJicAorCW1vdnEJMCsxNiglcnNwKSwlcmN4CisJbW92cQkwKzI0KCVyc3ApLCVyMTAKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VieAorCisJbW92cQklcjEyLDAoJXJkaSkKKwltb3ZxCSVyMTMsOCglcmRpKQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKwltb3ZxCTM1MiglcnNwKSwlcmR4CisJbGVhcQkzNTIoJXJzcCksJXJieAorCW1vdnEJMCsxNjAoJXJzcCksJXI5CisJbW92cQk4KzE2MCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzE2MCglcnNwKSwlcnNpCisJbW92cQkxNisxNjAoJXJzcCksJXIxMQorCW1vdnEJMjQrMTYwKCVyc3ApLCVyMTIKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQk5NiglcnNwKSwlcmR4CisJbGVhcQk5NiglcnNwKSwlcmJ4CisJbW92cQkwKzY0KCVyc3ApLCVyOQorCW1vdnEJOCs2NCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzY0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzY0KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzY0KCVyc3ApLCVyMTIKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbGVhcQkzMiglcnNwKSwlcmJ4CisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyODgoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyODgrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCS5MT05FX21vbnQoJXJpcCksJXhtbTIKKwlwYW5kCS5MT05FX21vbnQrMTYoJXJpcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMQorCXBhbmRuCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFuZG4JJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYW5kCTM4NCglcnNwKSwleG1tMgorCXBhbmQJMzg0KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisJbW92ZHF1CSV4bW0yLDY0KCVyZGkpCisJbW92ZHF1CSV4bW0zLDgwKCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyMjQoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyMjQrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTQxNiglcnNwKSwleG1tMgorCXBhbmQJNDE2KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzMjAoJXJzcCksJXhtbTIKKwlwYW5kCTMyMCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwwKCVyZGkpCisJbW92ZHF1CSV4bW0zLDE2KCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyNTYoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyNTYrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTQ0OCglcnNwKSwleG1tMgorCXBhbmQJNDQ4KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzNTIoJXJzcCksJXhtbTIKKwlwYW5kCTM1MisxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwzMiglcmRpKQorCW1vdmRxdQkleG1tMyw0OCglcmRpKQorCisJbGVhcQk0ODArNTYoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwltb3ZxCS04KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MYWRkX2FmZmluZXhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQllY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZXgsLi1lY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZXgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcmRyYW5kLXg4Nl82NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcmRyYW5kLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZmE5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9yZHJhbmQteDg2XzY0LlMKQEAgLTAsMCArMSw1MiBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKworCisKKworLmdsb2JsCUNSWVBUT19yZHJhbmQKKy5oaWRkZW4gQ1JZUFRPX3JkcmFuZAorLnR5cGUJQ1JZUFRPX3JkcmFuZCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorQ1JZUFRPX3JkcmFuZDoKKy5jZmlfc3RhcnRwcm9jCQorCXhvcnEJJXJheCwlcmF4CisKKworLmJ5dGUJMHg0OCwgMHgwZiwgMHhjNywgMHhmMQorCisJYWRjcQklcmF4LCVyYXgKKwltb3ZxCSVyY3gsMCglcmRpKQorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorCisKKworCisKKy5nbG9ibAlDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYKKy5oaWRkZW4gQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmCisudHlwZQlDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK0NSWVBUT19yZHJhbmRfbXVsdGlwbGU4X2J1ZjoKKy5jZmlfc3RhcnRwcm9jCQorCXRlc3RxCSVyc2ksJXJzaQorCWp6CS5Mb3V0CisJbW92cQkkOCwlcmR4CisuTGxvb3A6CisKKworLmJ5dGUJMHg0OCwgMHgwZiwgMHhjNywgMHhmMQorCWpuYwkuTGVycgorCW1vdnEJJXJjeCwwKCVyZGkpCisJYWRkcQklcmR4LCVyZGkKKwlzdWJxCSVyZHgsJXJzaQorCWpuegkuTGxvb3AKKy5Mb3V0OgorCW1vdnEJJDEsJXJheAorCS5ieXRlCTB4ZjMsMHhjMworLkxlcnI6CisJeG9ycQklcmF4LCVyYXgKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcnNhei1hdngyLlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9yc2F6LWF2eDIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmRiN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcnNhei1hdngyLlMKQEAgLTAsMCArMSwxNzQ5IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisuZ2xvYmwJcnNhel8xMDI0X3Nxcl9hdngyCisuaGlkZGVuIHJzYXpfMTAyNF9zcXJfYXZ4MgorLnR5cGUJcnNhel8xMDI0X3Nxcl9hdngyLEBmdW5jdGlvbgorLmFsaWduCTY0Cityc2F6XzEwMjRfc3FyX2F2eDI6CisuY2ZpX3N0YXJ0cHJvYwkKKwlsZWFxCSglcnNwKSwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorCXZ6ZXJvdXBwZXIKKwltb3ZxCSVyYXgsJXJicAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYnAKKwltb3ZxCSVyZHgsJXIxMworCXN1YnEJJDgzMiwlcnNwCisJbW92cQklcjEzLCVyMTUKKwlzdWJxCSQtMTI4LCVyZGkKKwlzdWJxCSQtMTI4LCVyc2kKKwlzdWJxCSQtMTI4LCVyMTMKKworCWFuZHEJJDQwOTUsJXIxNQorCWFkZHEJJDMyMCwlcjE1CisJc2hycQkkMTIsJXIxNQorCXZweG9yCSV5bW05LCV5bW05LCV5bW05CisJanoJLkxzcXJfMTAyNF9ub19uX2NvcHkKKworCisKKworCisJc3VicQkkMzIwLCVyc3AKKwl2bW92ZHF1CTAtMTI4KCVyMTMpLCV5bW0wCisJYW5kcQkkLTIwNDgsJXJzcAorCXZtb3ZkcXUJMzItMTI4KCVyMTMpLCV5bW0xCisJdm1vdmRxdQk2NC0xMjgoJXIxMyksJXltbTIKKwl2bW92ZHF1CTk2LTEyOCglcjEzKSwleW1tMworCXZtb3ZkcXUJMTI4LTEyOCglcjEzKSwleW1tNAorCXZtb3ZkcXUJMTYwLTEyOCglcjEzKSwleW1tNQorCXZtb3ZkcXUJMTkyLTEyOCglcjEzKSwleW1tNgorCXZtb3ZkcXUJMjI0LTEyOCglcjEzKSwleW1tNworCXZtb3ZkcXUJMjU2LTEyOCglcjEzKSwleW1tOAorCWxlYXEJODMyKzEyOCglcnNwKSwlcjEzCisJdm1vdmRxdQkleW1tMCwwLTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTEsMzItMTI4KCVyMTMpCisJdm1vdmRxdQkleW1tMiw2NC0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW0zLDk2LTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTQsMTI4LTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTUsMTYwLTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTYsMTkyLTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTcsMjI0LTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTgsMjU2LTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTksMjg4LTEyOCglcjEzKQorCisuTHNxcl8xMDI0X25vX25fY29weToKKwlhbmRxCSQtMTAyNCwlcnNwCisKKwl2bW92ZHF1CTMyLTEyOCglcnNpKSwleW1tMQorCXZtb3ZkcXUJNjQtMTI4KCVyc2kpLCV5bW0yCisJdm1vdmRxdQk5Ni0xMjgoJXJzaSksJXltbTMKKwl2bW92ZHF1CTEyOC0xMjgoJXJzaSksJXltbTQKKwl2bW92ZHF1CTE2MC0xMjgoJXJzaSksJXltbTUKKwl2bW92ZHF1CTE5Mi0xMjgoJXJzaSksJXltbTYKKwl2bW92ZHF1CTIyNC0xMjgoJXJzaSksJXltbTcKKwl2bW92ZHF1CTI1Ni0xMjgoJXJzaSksJXltbTgKKworCWxlYXEJMTkyKCVyc3ApLCVyYngKKwl2bW92ZHF1CS5MYW5kX21hc2soJXJpcCksJXltbTE1CisJam1wCS5MT09QX0dSQU5ERV9TUVJfMTAyNAorCisuYWxpZ24JMzIKKy5MT09QX0dSQU5ERV9TUVJfMTAyNDoKKwlsZWFxCTU3NisxMjgoJXJzcCksJXI5CisJbGVhcQk0NDgoJXJzcCksJXIxMgorCisKKworCisJdnBhZGRxCSV5bW0xLCV5bW0xLCV5bW0xCisJdnBicm9hZGNhc3RxCTAtMTI4KCVyc2kpLCV5bW0xMAorCXZwYWRkcQkleW1tMiwleW1tMiwleW1tMgorCXZtb3ZkcWEJJXltbTEsMC0xMjgoJXI5KQorCXZwYWRkcQkleW1tMywleW1tMywleW1tMworCXZtb3ZkcWEJJXltbTIsMzItMTI4KCVyOSkKKwl2cGFkZHEJJXltbTQsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW0zLDY0LTEyOCglcjkpCisJdnBhZGRxCSV5bW01LCV5bW01LCV5bW01CisJdm1vdmRxYQkleW1tNCw5Ni0xMjgoJXI5KQorCXZwYWRkcQkleW1tNiwleW1tNiwleW1tNgorCXZtb3ZkcWEJJXltbTUsMTI4LTEyOCglcjkpCisJdnBhZGRxCSV5bW03LCV5bW03LCV5bW03CisJdm1vdmRxYQkleW1tNiwxNjAtMTI4KCVyOSkKKwl2cGFkZHEJJXltbTgsJXltbTgsJXltbTgKKwl2bW92ZHFhCSV5bW03LDE5Mi0xMjgoJXI5KQorCXZweG9yCSV5bW05LCV5bW05LCV5bW05CisJdm1vdmRxYQkleW1tOCwyMjQtMTI4KCVyOSkKKworCXZwbXVsdWRxCTAtMTI4KCVyc2kpLCV5bW0xMCwleW1tMAorCXZwYnJvYWRjYXN0cQkzMi0xMjgoJXJzaSksJXltbTExCisJdm1vdmRxdQkleW1tOSwyODgtMTkyKCVyYngpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xLCV5bW0xCisJdm1vdmRxdQkleW1tOSwzMjAtNDQ4KCVyMTIpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0yLCV5bW0yCisJdm1vdmRxdQkleW1tOSwzNTItNDQ4KCVyMTIpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0zLCV5bW0zCisJdm1vdmRxdQkleW1tOSwzODQtNDQ4KCVyMTIpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW00LCV5bW00CisJdm1vdmRxdQkleW1tOSw0MTYtNDQ4KCVyMTIpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW01LCV5bW01CisJdm1vdmRxdQkleW1tOSw0NDgtNDQ4KCVyMTIpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW02LCV5bW02CisJdm1vdmRxdQkleW1tOSw0ODAtNDQ4KCVyMTIpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW03LCV5bW03CisJdm1vdmRxdQkleW1tOSw1MTItNDQ4KCVyMTIpCisJdnBtdWx1ZHEJJXltbTEwLCV5bW04LCV5bW04CisJdnBicm9hZGNhc3RxCTY0LTEyOCglcnNpKSwleW1tMTAKKwl2bW92ZHF1CSV5bW05LDU0NC00NDgoJXIxMikKKworCW1vdnEJJXJzaSwlcjE1CisJbW92bAkkNCwlcjE0ZAorCWptcAkuTHNxcl9lbnRyeV8xMDI0CisuYWxpZ24JMzIKKy5MT09QX1NRUl8xMDI0OgorCXZwYnJvYWRjYXN0cQkzMi0xMjgoJXIxNSksJXltbTExCisJdnBtdWx1ZHEJMC0xMjgoJXJzaSksJXltbTEwLCV5bW0wCisJdnBhZGRxCTAtMTkyKCVyYngpLCV5bW0wLCV5bW0wCisJdnBtdWx1ZHEJMC0xMjgoJXI5KSwleW1tMTAsJXltbTEKKwl2cGFkZHEJMzItMTkyKCVyYngpLCV5bW0xLCV5bW0xCisJdnBtdWx1ZHEJMzItMTI4KCVyOSksJXltbTEwLCV5bW0yCisJdnBhZGRxCTY0LTE5MiglcmJ4KSwleW1tMiwleW1tMgorCXZwbXVsdWRxCTY0LTEyOCglcjkpLCV5bW0xMCwleW1tMworCXZwYWRkcQk5Ni0xOTIoJXJieCksJXltbTMsJXltbTMKKwl2cG11bHVkcQk5Ni0xMjgoJXI5KSwleW1tMTAsJXltbTQKKwl2cGFkZHEJMTI4LTE5MiglcmJ4KSwleW1tNCwleW1tNAorCXZwbXVsdWRxCTEyOC0xMjgoJXI5KSwleW1tMTAsJXltbTUKKwl2cGFkZHEJMTYwLTE5MiglcmJ4KSwleW1tNSwleW1tNQorCXZwbXVsdWRxCTE2MC0xMjgoJXI5KSwleW1tMTAsJXltbTYKKwl2cGFkZHEJMTkyLTE5MiglcmJ4KSwleW1tNiwleW1tNgorCXZwbXVsdWRxCTE5Mi0xMjgoJXI5KSwleW1tMTAsJXltbTcKKwl2cGFkZHEJMjI0LTE5MiglcmJ4KSwleW1tNywleW1tNworCXZwbXVsdWRxCTIyNC0xMjgoJXI5KSwleW1tMTAsJXltbTgKKwl2cGJyb2FkY2FzdHEJNjQtMTI4KCVyMTUpLCV5bW0xMAorCXZwYWRkcQkyNTYtMTkyKCVyYngpLCV5bW04LCV5bW04CisuTHNxcl9lbnRyeV8xMDI0OgorCXZtb3ZkcXUJJXltbTAsMC0xOTIoJXJieCkKKwl2bW92ZHF1CSV5bW0xLDMyLTE5MiglcmJ4KQorCisJdnBtdWx1ZHEJMzItMTI4KCVyc2kpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJMzItMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTMsJXltbTMKKwl2cG11bHVkcQk2NC0xMjgoJXI5KSwleW1tMTEsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tNCwleW1tNAorCXZwbXVsdWRxCTk2LTEyOCglcjkpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJMTI4LTEyOCglcjkpLCV5bW0xMSwleW1tMTQKKwl2cGFkZHEJJXltbTE0LCV5bW02LCV5bW02CisJdnBtdWx1ZHEJMTYwLTEyOCglcjkpLCV5bW0xMSwleW1tMTMKKwl2cGFkZHEJJXltbTEzLCV5bW03LCV5bW03CisJdnBtdWx1ZHEJMTkyLTEyOCglcjkpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW04LCV5bW04CisJdnBtdWx1ZHEJMjI0LTEyOCglcjkpLCV5bW0xMSwleW1tMAorCXZwYnJvYWRjYXN0cQk5Ni0xMjgoJXIxNSksJXltbTExCisJdnBhZGRxCTI4OC0xOTIoJXJieCksJXltbTAsJXltbTAKKworCXZtb3ZkcXUJJXltbTIsNjQtMTkyKCVyYngpCisJdm1vdmRxdQkleW1tMyw5Ni0xOTIoJXJieCkKKworCXZwbXVsdWRxCTY0LTEyOCglcnNpKSwleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tNCwleW1tNAorCXZwbXVsdWRxCTY0LTEyOCglcjkpLCV5bW0xMCwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJOTYtMTI4KCVyOSksJXltbTEwLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTYsJXltbTYKKwl2cG11bHVkcQkxMjgtMTI4KCVyOSksJXltbTEwLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTcsJXltbTcKKwl2cG11bHVkcQkxNjAtMTI4KCVyOSksJXltbTEwLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTgsJXltbTgKKwl2cG11bHVkcQkxOTItMTI4KCVyOSksJXltbTEwLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTAsJXltbTAKKwl2cG11bHVkcQkyMjQtMTI4KCVyOSksJXltbTEwLCV5bW0xCisJdnBicm9hZGNhc3RxCTEyOC0xMjgoJXIxNSksJXltbTEwCisJdnBhZGRxCTMyMC00NDgoJXIxMiksJXltbTEsJXltbTEKKworCXZtb3ZkcXUJJXltbTQsMTI4LTE5MiglcmJ4KQorCXZtb3ZkcXUJJXltbTUsMTYwLTE5MiglcmJ4KQorCisJdnBtdWx1ZHEJOTYtMTI4KCVyc2kpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJOTYtMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTcsJXltbTcKKwl2cG11bHVkcQkxMjgtMTI4KCVyOSksJXltbTExLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTgsJXltbTgKKwl2cG11bHVkcQkxNjAtMTI4KCVyOSksJXltbTExLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTAsJXltbTAKKwl2cG11bHVkcQkxOTItMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTEsJXltbTEKKwl2cG11bHVkcQkyMjQtMTI4KCVyOSksJXltbTExLCV5bW0yCisJdnBicm9hZGNhc3RxCTE2MC0xMjgoJXIxNSksJXltbTExCisJdnBhZGRxCTM1Mi00NDgoJXIxMiksJXltbTIsJXltbTIKKworCXZtb3ZkcXUJJXltbTYsMTkyLTE5MiglcmJ4KQorCXZtb3ZkcXUJJXltbTcsMjI0LTE5MiglcmJ4KQorCisJdnBtdWx1ZHEJMTI4LTEyOCglcnNpKSwleW1tMTAsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tOCwleW1tOAorCXZwbXVsdWRxCTEyOC0xMjgoJXI5KSwleW1tMTAsJXltbTE0CisJdnBhZGRxCSV5bW0xNCwleW1tMCwleW1tMAorCXZwbXVsdWRxCTE2MC0xMjgoJXI5KSwleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tMSwleW1tMQorCXZwbXVsdWRxCTE5Mi0xMjgoJXI5KSwleW1tMTAsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tMiwleW1tMgorCXZwbXVsdWRxCTIyNC0xMjgoJXI5KSwleW1tMTAsJXltbTMKKwl2cGJyb2FkY2FzdHEJMTkyLTEyOCglcjE1KSwleW1tMTAKKwl2cGFkZHEJMzg0LTQ0OCglcjEyKSwleW1tMywleW1tMworCisJdm1vdmRxdQkleW1tOCwyNTYtMTkyKCVyYngpCisJdm1vdmRxdQkleW1tMCwyODgtMTkyKCVyYngpCisJbGVhcQk4KCVyYngpLCVyYngKKworCXZwbXVsdWRxCTE2MC0xMjgoJXJzaSksJXltbTExLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTEsJXltbTEKKwl2cG11bHVkcQkxNjAtMTI4KCVyOSksJXltbTExLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTIsJXltbTIKKwl2cG11bHVkcQkxOTItMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTMsJXltbTMKKwl2cG11bHVkcQkyMjQtMTI4KCVyOSksJXltbTExLCV5bW00CisJdnBicm9hZGNhc3RxCTIyNC0xMjgoJXIxNSksJXltbTExCisJdnBhZGRxCTQxNi00NDgoJXIxMiksJXltbTQsJXltbTQKKworCXZtb3ZkcXUJJXltbTEsMzIwLTQ0OCglcjEyKQorCXZtb3ZkcXUJJXltbTIsMzUyLTQ0OCglcjEyKQorCisJdnBtdWx1ZHEJMTkyLTEyOCglcnNpKSwleW1tMTAsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tMywleW1tMworCXZwbXVsdWRxCTE5Mi0xMjgoJXI5KSwleW1tMTAsJXltbTE0CisJdnBicm9hZGNhc3RxCTI1Ni0xMjgoJXIxNSksJXltbTAKKwl2cGFkZHEJJXltbTE0LCV5bW00LCV5bW00CisJdnBtdWx1ZHEJMjI0LTEyOCglcjkpLCV5bW0xMCwleW1tNQorCXZwYnJvYWRjYXN0cQkwKzgtMTI4KCVyMTUpLCV5bW0xMAorCXZwYWRkcQk0NDgtNDQ4KCVyMTIpLCV5bW01LCV5bW01CisKKwl2bW92ZHF1CSV5bW0zLDM4NC00NDgoJXIxMikKKwl2bW92ZHF1CSV5bW00LDQxNi00NDgoJXIxMikKKwlsZWFxCTgoJXIxNSksJXIxNQorCisJdnBtdWx1ZHEJMjI0LTEyOCglcnNpKSwleW1tMTEsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwbXVsdWRxCTIyNC0xMjgoJXI5KSwleW1tMTEsJXltbTYKKwl2cGFkZHEJNDgwLTQ0OCglcjEyKSwleW1tNiwleW1tNgorCisJdnBtdWx1ZHEJMjU2LTEyOCglcnNpKSwleW1tMCwleW1tNworCXZtb3ZkcXUJJXltbTUsNDQ4LTQ0OCglcjEyKQorCXZwYWRkcQk1MTItNDQ4KCVyMTIpLCV5bW03LCV5bW03CisJdm1vdmRxdQkleW1tNiw0ODAtNDQ4KCVyMTIpCisJdm1vdmRxdQkleW1tNyw1MTItNDQ4KCVyMTIpCisJbGVhcQk4KCVyMTIpLCVyMTIKKworCWRlY2wJJXIxNGQKKwlqbnoJLkxPT1BfU1FSXzEwMjQKKworCXZtb3ZkcXUJMjU2KCVyc3ApLCV5bW04CisJdm1vdmRxdQkyODgoJXJzcCksJXltbTEKKwl2bW92ZHF1CTMyMCglcnNwKSwleW1tMgorCWxlYXEJMTkyKCVyc3ApLCVyYngKKworCXZwc3JscQkkMjksJXltbTgsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW04LCV5bW04CisJdnBzcmxxCSQyOSwleW1tMSwleW1tMTEKKwl2cGFuZAkleW1tMTUsJXltbTEsJXltbTEKKworCXZwZXJtcQkkMHg5MywleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTksJXltbTksJXltbTkKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCisJdnBibGVuZGQJJDMsJXltbTksJXltbTE0LCV5bW0xMAorCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTEsJXltbTE0CisJdnBhZGRxCSV5bW0xMCwleW1tOCwleW1tOAorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tOSwleW1tMTEKKwl2cGFkZHEJJXltbTE0LCV5bW0xLCV5bW0xCisJdnBhZGRxCSV5bW0xMSwleW1tMiwleW1tMgorCXZtb3ZkcXUJJXltbTEsMjg4LTE5MiglcmJ4KQorCXZtb3ZkcXUJJXltbTIsMzIwLTE5MiglcmJ4KQorCisJbW92cQkoJXJzcCksJXJheAorCW1vdnEJOCglcnNwKSwlcjEwCisJbW92cQkxNiglcnNwKSwlcjExCisJbW92cQkyNCglcnNwKSwlcjEyCisJdm1vdmRxdQkzMiglcnNwKSwleW1tMQorCXZtb3ZkcXUJNjQtMTkyKCVyYngpLCV5bW0yCisJdm1vdmRxdQk5Ni0xOTIoJXJieCksJXltbTMKKwl2bW92ZHF1CTEyOC0xOTIoJXJieCksJXltbTQKKwl2bW92ZHF1CTE2MC0xOTIoJXJieCksJXltbTUKKwl2bW92ZHF1CTE5Mi0xOTIoJXJieCksJXltbTYKKwl2bW92ZHF1CTIyNC0xOTIoJXJieCksJXltbTcKKworCW1vdnEJJXJheCwlcjkKKwlpbXVsbAklZWN4LCVlYXgKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKwl2bW92ZAklZWF4LCV4bW0xMgorCisJbW92cQklcmF4LCVyZHgKKwlpbXVscQktMTI4KCVyMTMpLCVyYXgKKwl2cGJyb2FkY2FzdHEJJXhtbTEyLCV5bW0xMgorCWFkZHEJJXJheCwlcjkKKwltb3ZxCSVyZHgsJXJheAorCWltdWxxCTgtMTI4KCVyMTMpLCVyYXgKKwlzaHJxCSQyOSwlcjkKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJMTYtMTI4KCVyMTMpLCVyYXgKKwlhZGRxCSVyOSwlcjEwCisJYWRkcQklcmF4LCVyMTEKKwlpbXVscQkyNC0xMjgoJXIxMyksJXJkeAorCWFkZHEJJXJkeCwlcjEyCisKKwltb3ZxCSVyMTAsJXJheAorCWltdWxsCSVlY3gsJWVheAorCWFuZGwJJDB4MWZmZmZmZmYsJWVheAorCisJbW92bAkkOSwlcjE0ZAorCWptcAkuTE9PUF9SRURVQ0VfMTAyNAorCisuYWxpZ24JMzIKKy5MT09QX1JFRFVDRV8xMDI0OgorCXZtb3ZkCSVlYXgsJXhtbTEzCisJdnBicm9hZGNhc3RxCSV4bW0xMywleW1tMTMKKworCXZwbXVsdWRxCTMyLTEyOCglcjEzKSwleW1tMTIsJXltbTEwCisJbW92cQklcmF4LCVyZHgKKwlpbXVscQktMTI4KCVyMTMpLCVyYXgKKwl2cGFkZHEJJXltbTEwLCV5bW0xLCV5bW0xCisJYWRkcQklcmF4LCVyMTAKKwl2cG11bHVkcQk2NC0xMjgoJXIxMyksJXltbTEyLCV5bW0xNAorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJOC0xMjgoJXIxMyksJXJheAorCXZwYWRkcQkleW1tMTQsJXltbTIsJXltbTIKKwl2cG11bHVkcQk5Ni0xMjgoJXIxMyksJXltbTEyLCV5bW0xMQorLmJ5dGUJMHg2NworCWFkZHEJJXJheCwlcjExCisuYnl0ZQkweDY3CisJbW92cQklcmR4LCVyYXgKKwlpbXVscQkxNi0xMjgoJXIxMyksJXJheAorCXNocnEJJDI5LCVyMTAKKwl2cGFkZHEJJXltbTExLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJMTI4LTEyOCglcjEzKSwleW1tMTIsJXltbTEwCisJYWRkcQklcmF4LCVyMTIKKwlhZGRxCSVyMTAsJXIxMQorCXZwYWRkcQkleW1tMTAsJXltbTQsJXltbTQKKwl2cG11bHVkcQkxNjAtMTI4KCVyMTMpLCV5bW0xMiwleW1tMTQKKwltb3ZxCSVyMTEsJXJheAorCWltdWxsCSVlY3gsJWVheAorCXZwYWRkcQkleW1tMTQsJXltbTUsJXltbTUKKwl2cG11bHVkcQkxOTItMTI4KCVyMTMpLCV5bW0xMiwleW1tMTEKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKwl2cGFkZHEJJXltbTExLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJMjI0LTEyOCglcjEzKSwleW1tMTIsJXltbTEwCisJdnBhZGRxCSV5bW0xMCwleW1tNywleW1tNworCXZwbXVsdWRxCTI1Ni0xMjgoJXIxMyksJXltbTEyLCV5bW0xNAorCXZtb3ZkCSVlYXgsJXhtbTEyCisKKwl2cGFkZHEJJXltbTE0LCV5bW04LCV5bW04CisKKwl2cGJyb2FkY2FzdHEJJXhtbTEyLCV5bW0xMgorCisJdnBtdWx1ZHEJMzItOC0xMjgoJXIxMyksJXltbTEzLCV5bW0xMQorCXZtb3ZkcXUJOTYtOC0xMjgoJXIxMyksJXltbTE0CisJbW92cQklcmF4LCVyZHgKKwlpbXVscQktMTI4KCVyMTMpLCVyYXgKKwl2cGFkZHEJJXltbTExLCV5bW0xLCV5bW0xCisJdnBtdWx1ZHEJNjQtOC0xMjgoJXIxMyksJXltbTEzLCV5bW0xMAorCXZtb3ZkcXUJMTI4LTgtMTI4KCVyMTMpLCV5bW0xMQorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmR4LCVyYXgKKwlpbXVscQk4LTEyOCglcjEzKSwlcmF4CisJdnBhZGRxCSV5bW0xMCwleW1tMiwleW1tMgorCWFkZHEJJXIxMiwlcmF4CisJc2hycQkkMjksJXIxMQorCXZwbXVsdWRxCSV5bW0xMywleW1tMTQsJXltbTE0CisJdm1vdmRxdQkxNjAtOC0xMjgoJXIxMyksJXltbTEwCisJYWRkcQklcjExLCVyYXgKKwl2cGFkZHEJJXltbTE0LCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJJXltbTEzLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CTE5Mi04LTEyOCglcjEzKSwleW1tMTQKKy5ieXRlCTB4NjcKKwltb3ZxCSVyYXgsJXIxMgorCWltdWxsCSVlY3gsJWVheAorCXZwYWRkcQkleW1tMTEsJXltbTQsJXltbTQKKwl2cG11bHVkcQkleW1tMTMsJXltbTEwLCV5bW0xMAorLmJ5dGUJMHhjNCwweDQxLDB4N2UsMHg2ZiwweDlkLDB4NTgsMHgwMCwweDAwLDB4MDAKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKwl2cGFkZHEJJXltbTEwLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJJXltbTEzLCV5bW0xNCwleW1tMTQKKwl2bW92ZHF1CTI1Ni04LTEyOCglcjEzKSwleW1tMTAKKwl2cGFkZHEJJXltbTE0LCV5bW02LCV5bW02CisJdnBtdWx1ZHEJJXltbTEzLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CTI4OC04LTEyOCglcjEzKSwleW1tOQorCXZtb3ZkCSVlYXgsJXhtbTAKKwlpbXVscQktMTI4KCVyMTMpLCVyYXgKKwl2cGFkZHEJJXltbTExLCV5bW03LCV5bW03CisJdnBtdWx1ZHEJJXltbTEzLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CTMyLTE2LTEyOCglcjEzKSwleW1tMTQKKwl2cGJyb2FkY2FzdHEJJXhtbTAsJXltbTAKKwl2cGFkZHEJJXltbTEwLCV5bW04LCV5bW04CisJdnBtdWx1ZHEJJXltbTEzLCV5bW05LCV5bW05CisJdm1vdmRxdQk2NC0xNi0xMjgoJXIxMyksJXltbTExCisJYWRkcQklcmF4LCVyMTIKKworCXZtb3ZkcXUJMzItMjQtMTI4KCVyMTMpLCV5bW0xMworCXZwbXVsdWRxCSV5bW0xMiwleW1tMTQsJXltbTE0CisJdm1vdmRxdQk5Ni0xNi0xMjgoJXIxMyksJXltbTEwCisJdnBhZGRxCSV5bW0xNCwleW1tMSwleW1tMQorCXZwbXVsdWRxCSV5bW0wLCV5bW0xMywleW1tMTMKKwl2cG11bHVkcQkleW1tMTIsJXltbTExLCV5bW0xMQorLmJ5dGUJMHhjNCwweDQxLDB4N2UsMHg2ZiwweGI1LDB4ZjAsMHhmZiwweGZmLDB4ZmYKKwl2cGFkZHEJJXltbTEsJXltbTEzLCV5bW0xMworCXZwYWRkcQkleW1tMTEsJXltbTIsJXltbTIKKwl2cG11bHVkcQkleW1tMTIsJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJMTYwLTE2LTEyOCglcjEzKSwleW1tMTEKKy5ieXRlCTB4NjcKKwl2bW92cQkleG1tMTMsJXJheAorCXZtb3ZkcXUJJXltbTEzLCglcnNwKQorCXZwYWRkcQkleW1tMTAsJXltbTMsJXltbTMKKwl2cG11bHVkcQkleW1tMTIsJXltbTE0LCV5bW0xNAorCXZtb3ZkcXUJMTkyLTE2LTEyOCglcjEzKSwleW1tMTAKKwl2cGFkZHEJJXltbTE0LCV5bW00LCV5bW00CisJdnBtdWx1ZHEJJXltbTEyLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CTIyNC0xNi0xMjgoJXIxMyksJXltbTE0CisJdnBhZGRxCSV5bW0xMSwleW1tNSwleW1tNQorCXZwbXVsdWRxCSV5bW0xMiwleW1tMTAsJXltbTEwCisJdm1vdmRxdQkyNTYtMTYtMTI4KCVyMTMpLCV5bW0xMQorCXZwYWRkcQkleW1tMTAsJXltbTYsJXltbTYKKwl2cG11bHVkcQkleW1tMTIsJXltbTE0LCV5bW0xNAorCXNocnEJJDI5LCVyMTIKKwl2bW92ZHF1CTI4OC0xNi0xMjgoJXIxMyksJXltbTEwCisJYWRkcQklcjEyLCVyYXgKKwl2cGFkZHEJJXltbTE0LCV5bW03LCV5bW03CisJdnBtdWx1ZHEJJXltbTEyLCV5bW0xMSwleW1tMTEKKworCW1vdnEJJXJheCwlcjkKKwlpbXVsbAklZWN4LCVlYXgKKwl2cGFkZHEJJXltbTExLCV5bW04LCV5bW04CisJdnBtdWx1ZHEJJXltbTEyLCV5bW0xMCwleW1tMTAKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKwl2bW92ZAklZWF4LCV4bW0xMgorCXZtb3ZkcXUJOTYtMjQtMTI4KCVyMTMpLCV5bW0xMQorLmJ5dGUJMHg2NworCXZwYWRkcQkleW1tMTAsJXltbTksJXltbTkKKwl2cGJyb2FkY2FzdHEJJXhtbTEyLCV5bW0xMgorCisJdnBtdWx1ZHEJNjQtMjQtMTI4KCVyMTMpLCV5bW0wLCV5bW0xNAorCXZtb3ZkcXUJMTI4LTI0LTEyOCglcjEzKSwleW1tMTAKKwltb3ZxCSVyYXgsJXJkeAorCWltdWxxCS0xMjgoJXIxMyksJXJheAorCW1vdnEJOCglcnNwKSwlcjEwCisJdnBhZGRxCSV5bW0xNCwleW1tMiwleW1tMQorCXZwbXVsdWRxCSV5bW0wLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CTE2MC0yNC0xMjgoJXIxMyksJXltbTE0CisJYWRkcQklcmF4LCVyOQorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJOC0xMjgoJXIxMyksJXJheAorLmJ5dGUJMHg2NworCXNocnEJJDI5LCVyOQorCW1vdnEJMTYoJXJzcCksJXIxMQorCXZwYWRkcQkleW1tMTEsJXltbTMsJXltbTIKKwl2cG11bHVkcQkleW1tMCwleW1tMTAsJXltbTEwCisJdm1vdmRxdQkxOTItMjQtMTI4KCVyMTMpLCV5bW0xMQorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmR4LCVyYXgKKwlpbXVscQkxNi0xMjgoJXIxMyksJXJheAorCXZwYWRkcQkleW1tMTAsJXltbTQsJXltbTMKKwl2cG11bHVkcQkleW1tMCwleW1tMTQsJXltbTE0CisJdm1vdmRxdQkyMjQtMjQtMTI4KCVyMTMpLCV5bW0xMAorCWltdWxxCTI0LTEyOCglcjEzKSwlcmR4CisJYWRkcQklcmF4LCVyMTEKKwlsZWFxCSglcjksJXIxMCwxKSwlcmF4CisJdnBhZGRxCSV5bW0xNCwleW1tNSwleW1tNAorCXZwbXVsdWRxCSV5bW0wLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CTI1Ni0yNC0xMjgoJXIxMyksJXltbTE0CisJbW92cQklcmF4LCVyMTAKKwlpbXVsbAklZWN4LCVlYXgKKwl2cG11bHVkcQkleW1tMCwleW1tMTAsJXltbTEwCisJdnBhZGRxCSV5bW0xMSwleW1tNiwleW1tNQorCXZtb3ZkcXUJMjg4LTI0LTEyOCglcjEzKSwleW1tMTEKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKwl2cGFkZHEJJXltbTEwLCV5bW03LCV5bW02CisJdnBtdWx1ZHEJJXltbTAsJXltbTE0LCV5bW0xNAorCWFkZHEJMjQoJXJzcCksJXJkeAorCXZwYWRkcQkleW1tMTQsJXltbTgsJXltbTcKKwl2cG11bHVkcQkleW1tMCwleW1tMTEsJXltbTExCisJdnBhZGRxCSV5bW0xMSwleW1tOSwleW1tOAorCXZtb3ZxCSVyMTIsJXhtbTkKKwltb3ZxCSVyZHgsJXIxMgorCisJZGVjbAklcjE0ZAorCWpuegkuTE9PUF9SRURVQ0VfMTAyNAorCWxlYXEJNDQ4KCVyc3ApLCVyMTIKKwl2cGFkZHEJJXltbTksJXltbTEzLCV5bW0wCisJdnB4b3IJJXltbTksJXltbTksJXltbTkKKworCXZwYWRkcQkyODgtMTkyKCVyYngpLCV5bW0wLCV5bW0wCisJdnBhZGRxCTMyMC00NDgoJXIxMiksJXltbTEsJXltbTEKKwl2cGFkZHEJMzUyLTQ0OCglcjEyKSwleW1tMiwleW1tMgorCXZwYWRkcQkzODQtNDQ4KCVyMTIpLCV5bW0zLCV5bW0zCisJdnBhZGRxCTQxNi00NDgoJXIxMiksJXltbTQsJXltbTQKKwl2cGFkZHEJNDQ4LTQ0OCglcjEyKSwleW1tNSwleW1tNQorCXZwYWRkcQk0ODAtNDQ4KCVyMTIpLCV5bW02LCV5bW02CisJdnBhZGRxCTUxMi00NDgoJXIxMiksJXltbTcsJXltbTcKKwl2cGFkZHEJNTQ0LTQ0OCglcjEyKSwleW1tOCwleW1tOAorCisJdnBzcmxxCSQyOSwleW1tMCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTAsJXltbTAKKwl2cHNybHEJJDI5LCV5bW0xLCV5bW0xMQorCXZwYW5kCSV5bW0xNSwleW1tMSwleW1tMQorCXZwc3JscQkkMjksJXltbTIsJXltbTEyCisJdnBlcm1xCSQweDkzLCV5bW0xNCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTIsJXltbTIKKwl2cHNybHEJJDI5LCV5bW0zLCV5bW0xMworCXZwZXJtcQkkMHg5MywleW1tMTEsJXltbTExCisJdnBhbmQJJXltbTE1LCV5bW0zLCV5bW0zCisJdnBlcm1xCSQweDkzLCV5bW0xMiwleW1tMTIKKworCXZwYmxlbmRkCSQzLCV5bW05LCV5bW0xNCwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTEzLCV5bW0xMworCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTEsJXltbTE0CisJdnBhZGRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tMTIsJXltbTExCisJdnBhZGRxCSV5bW0xNCwleW1tMSwleW1tMQorCXZwYmxlbmRkCSQzLCV5bW0xMiwleW1tMTMsJXltbTEyCisJdnBhZGRxCSV5bW0xMSwleW1tMiwleW1tMgorCXZwYmxlbmRkCSQzLCV5bW0xMywleW1tOSwleW1tMTMKKwl2cGFkZHEJJXltbTEyLCV5bW0zLCV5bW0zCisJdnBhZGRxCSV5bW0xMywleW1tNCwleW1tNAorCisJdnBzcmxxCSQyOSwleW1tMCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTAsJXltbTAKKwl2cHNybHEJJDI5LCV5bW0xLCV5bW0xMQorCXZwYW5kCSV5bW0xNSwleW1tMSwleW1tMQorCXZwc3JscQkkMjksJXltbTIsJXltbTEyCisJdnBlcm1xCSQweDkzLCV5bW0xNCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTIsJXltbTIKKwl2cHNybHEJJDI5LCV5bW0zLCV5bW0xMworCXZwZXJtcQkkMHg5MywleW1tMTEsJXltbTExCisJdnBhbmQJJXltbTE1LCV5bW0zLCV5bW0zCisJdnBlcm1xCSQweDkzLCV5bW0xMiwleW1tMTIKKworCXZwYmxlbmRkCSQzLCV5bW05LCV5bW0xNCwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTEzLCV5bW0xMworCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTEsJXltbTE0CisJdnBhZGRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tMTIsJXltbTExCisJdnBhZGRxCSV5bW0xNCwleW1tMSwleW1tMQorCXZtb3ZkcXUJJXltbTAsMC0xMjgoJXJkaSkKKwl2cGJsZW5kZAkkMywleW1tMTIsJXltbTEzLCV5bW0xMgorCXZwYWRkcQkleW1tMTEsJXltbTIsJXltbTIKKwl2bW92ZHF1CSV5bW0xLDMyLTEyOCglcmRpKQorCXZwYmxlbmRkCSQzLCV5bW0xMywleW1tOSwleW1tMTMKKwl2cGFkZHEJJXltbTEyLCV5bW0zLCV5bW0zCisJdm1vdmRxdQkleW1tMiw2NC0xMjgoJXJkaSkKKwl2cGFkZHEJJXltbTEzLCV5bW00LCV5bW00CisJdm1vdmRxdQkleW1tMyw5Ni0xMjgoJXJkaSkKKwl2cHNybHEJJDI5LCV5bW00LCV5bW0xNAorCXZwYW5kCSV5bW0xNSwleW1tNCwleW1tNAorCXZwc3JscQkkMjksJXltbTUsJXltbTExCisJdnBhbmQJJXltbTE1LCV5bW01LCV5bW01CisJdnBzcmxxCSQyOSwleW1tNiwleW1tMTIKKwl2cGVybXEJJDB4OTMsJXltbTE0LCV5bW0xNAorCXZwYW5kCSV5bW0xNSwleW1tNiwleW1tNgorCXZwc3JscQkkMjksJXltbTcsJXltbTEzCisJdnBlcm1xCSQweDkzLCV5bW0xMSwleW1tMTEKKwl2cGFuZAkleW1tMTUsJXltbTcsJXltbTcKKwl2cHNybHEJJDI5LCV5bW04LCV5bW0wCisJdnBlcm1xCSQweDkzLCV5bW0xMiwleW1tMTIKKwl2cGFuZAkleW1tMTUsJXltbTgsJXltbTgKKwl2cGVybXEJJDB4OTMsJXltbTEzLCV5bW0xMworCisJdnBibGVuZGQJJDMsJXltbTksJXltbTE0LCV5bW0xMAorCXZwZXJtcQkkMHg5MywleW1tMCwleW1tMAorCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTEsJXltbTE0CisJdnBhZGRxCSV5bW0xMCwleW1tNCwleW1tNAorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tMTIsJXltbTExCisJdnBhZGRxCSV5bW0xNCwleW1tNSwleW1tNQorCXZwYmxlbmRkCSQzLCV5bW0xMiwleW1tMTMsJXltbTEyCisJdnBhZGRxCSV5bW0xMSwleW1tNiwleW1tNgorCXZwYmxlbmRkCSQzLCV5bW0xMywleW1tMCwleW1tMTMKKwl2cGFkZHEJJXltbTEyLCV5bW03LCV5bW03CisJdnBhZGRxCSV5bW0xMywleW1tOCwleW1tOAorCisJdnBzcmxxCSQyOSwleW1tNCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTQsJXltbTQKKwl2cHNybHEJJDI5LCV5bW01LCV5bW0xMQorCXZwYW5kCSV5bW0xNSwleW1tNSwleW1tNQorCXZwc3JscQkkMjksJXltbTYsJXltbTEyCisJdnBlcm1xCSQweDkzLCV5bW0xNCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTYsJXltbTYKKwl2cHNybHEJJDI5LCV5bW03LCV5bW0xMworCXZwZXJtcQkkMHg5MywleW1tMTEsJXltbTExCisJdnBhbmQJJXltbTE1LCV5bW03LCV5bW03CisJdnBzcmxxCSQyOSwleW1tOCwleW1tMAorCXZwZXJtcQkkMHg5MywleW1tMTIsJXltbTEyCisJdnBhbmQJJXltbTE1LCV5bW04LCV5bW04CisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKworCXZwYmxlbmRkCSQzLCV5bW05LCV5bW0xNCwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTQsJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTAsJXltbTQsJXltbTQKKwl2cGJsZW5kZAkkMywleW1tMTEsJXltbTEyLCV5bW0xMQorCXZwYWRkcQkleW1tMTQsJXltbTUsJXltbTUKKwl2bW92ZHF1CSV5bW00LDEyOC0xMjgoJXJkaSkKKwl2cGJsZW5kZAkkMywleW1tMTIsJXltbTEzLCV5bW0xMgorCXZwYWRkcQkleW1tMTEsJXltbTYsJXltbTYKKwl2bW92ZHF1CSV5bW01LDE2MC0xMjgoJXJkaSkKKwl2cGJsZW5kZAkkMywleW1tMTMsJXltbTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tNywleW1tNworCXZtb3ZkcXUJJXltbTYsMTkyLTEyOCglcmRpKQorCXZwYWRkcQkleW1tMTMsJXltbTgsJXltbTgKKwl2bW92ZHF1CSV5bW03LDIyNC0xMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDI1Ni0xMjgoJXJkaSkKKworCW1vdnEJJXJkaSwlcnNpCisJZGVjbAklcjhkCisJam5lCS5MT09QX0dSQU5ERV9TUVJfMTAyNAorCisJdnplcm9hbGwKKwltb3ZxCSVyYnAsJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKwltb3ZxCS00OCglcmF4KSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyYXgpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJheCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyYXgpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcmF4KSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyYXgpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTHNxcl8xMDI0X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJcnNhel8xMDI0X3Nxcl9hdngyLC4tcnNhel8xMDI0X3Nxcl9hdngyCisuZ2xvYmwJcnNhel8xMDI0X211bF9hdngyCisuaGlkZGVuIHJzYXpfMTAyNF9tdWxfYXZ4MgorLnR5cGUJcnNhel8xMDI0X211bF9hdngyLEBmdW5jdGlvbgorLmFsaWduCTY0Cityc2F6XzEwMjRfbXVsX2F2eDI6CisuY2ZpX3N0YXJ0cHJvYwkKKwlsZWFxCSglcnNwKSwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorCW1vdnEJJXJheCwlcmJwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJicAorCXZ6ZXJvYWxsCisJbW92cQklcmR4LCVyMTMKKwlzdWJxCSQ2NCwlcnNwCisKKworCisKKworCisuYnl0ZQkweDY3LDB4NjcKKwltb3ZxCSVyc2ksJXIxNQorCWFuZHEJJDQwOTUsJXIxNQorCWFkZHEJJDMyMCwlcjE1CisJc2hycQkkMTIsJXIxNQorCW1vdnEJJXJzaSwlcjE1CisJY21vdm56cQklcjEzLCVyc2kKKwljbW92bnpxCSVyMTUsJXIxMworCisJbW92cQklcmN4LCVyMTUKKwlzdWJxCSQtMTI4LCVyc2kKKwlzdWJxCSQtMTI4LCVyY3gKKwlzdWJxCSQtMTI4LCVyZGkKKworCWFuZHEJJDQwOTUsJXIxNQorCWFkZHEJJDMyMCwlcjE1CisuYnl0ZQkweDY3LDB4NjcKKwlzaHJxCSQxMiwlcjE1CisJanoJLkxtdWxfMTAyNF9ub19uX2NvcHkKKworCisKKworCisJc3VicQkkMzIwLCVyc3AKKwl2bW92ZHF1CTAtMTI4KCVyY3gpLCV5bW0wCisJYW5kcQkkLTUxMiwlcnNwCisJdm1vdmRxdQkzMi0xMjgoJXJjeCksJXltbTEKKwl2bW92ZHF1CTY0LTEyOCglcmN4KSwleW1tMgorCXZtb3ZkcXUJOTYtMTI4KCVyY3gpLCV5bW0zCisJdm1vdmRxdQkxMjgtMTI4KCVyY3gpLCV5bW00CisJdm1vdmRxdQkxNjAtMTI4KCVyY3gpLCV5bW01CisJdm1vdmRxdQkxOTItMTI4KCVyY3gpLCV5bW02CisJdm1vdmRxdQkyMjQtMTI4KCVyY3gpLCV5bW03CisJdm1vdmRxdQkyNTYtMTI4KCVyY3gpLCV5bW04CisJbGVhcQk2NCsxMjgoJXJzcCksJXJjeAorCXZtb3ZkcXUJJXltbTAsMC0xMjgoJXJjeCkKKwl2cHhvcgkleW1tMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJJXltbTEsMzItMTI4KCVyY3gpCisJdnB4b3IJJXltbTEsJXltbTEsJXltbTEKKwl2bW92ZHF1CSV5bW0yLDY0LTEyOCglcmN4KQorCXZweG9yCSV5bW0yLCV5bW0yLCV5bW0yCisJdm1vdmRxdQkleW1tMyw5Ni0xMjgoJXJjeCkKKwl2cHhvcgkleW1tMywleW1tMywleW1tMworCXZtb3ZkcXUJJXltbTQsMTI4LTEyOCglcmN4KQorCXZweG9yCSV5bW00LCV5bW00LCV5bW00CisJdm1vdmRxdQkleW1tNSwxNjAtMTI4KCVyY3gpCisJdnB4b3IJJXltbTUsJXltbTUsJXltbTUKKwl2bW92ZHF1CSV5bW02LDE5Mi0xMjgoJXJjeCkKKwl2cHhvcgkleW1tNiwleW1tNiwleW1tNgorCXZtb3ZkcXUJJXltbTcsMjI0LTEyOCglcmN4KQorCXZweG9yCSV5bW03LCV5bW03LCV5bW03CisJdm1vdmRxdQkleW1tOCwyNTYtMTI4KCVyY3gpCisJdm1vdmRxYQkleW1tMCwleW1tOAorCXZtb3ZkcXUJJXltbTksMjg4LTEyOCglcmN4KQorLkxtdWxfMTAyNF9ub19uX2NvcHk6CisJYW5kcQkkLTY0LCVyc3AKKworCW1vdnEJKCVyMTMpLCVyYngKKwl2cGJyb2FkY2FzdHEJKCVyMTMpLCV5bW0xMAorCXZtb3ZkcXUJJXltbTAsKCVyc3ApCisJeG9ycQklcjksJXI5CisuYnl0ZQkweDY3CisJeG9ycQklcjEwLCVyMTAKKwl4b3JxCSVyMTEsJXIxMQorCXhvcnEJJXIxMiwlcjEyCisKKwl2bW92ZHF1CS5MYW5kX21hc2soJXJpcCksJXltbTE1CisJbW92bAkkOSwlcjE0ZAorCXZtb3ZkcXUJJXltbTksMjg4LTEyOCglcmRpKQorCWptcAkuTG9vcF9tdWxfMTAyNAorCisuYWxpZ24JMzIKKy5Mb29wX211bF8xMDI0OgorCXZwc3JscQkkMjksJXltbTMsJXltbTkKKwltb3ZxCSVyYngsJXJheAorCWltdWxxCS0xMjgoJXJzaSksJXJheAorCWFkZHEJJXI5LCVyYXgKKwltb3ZxCSVyYngsJXIxMAorCWltdWxxCTgtMTI4KCVyc2kpLCVyMTAKKwlhZGRxCTgoJXJzcCksJXIxMAorCisJbW92cQklcmF4LCVyOQorCWltdWxsCSVyOGQsJWVheAorCWFuZGwJJDB4MWZmZmZmZmYsJWVheAorCisJbW92cQklcmJ4LCVyMTEKKwlpbXVscQkxNi0xMjgoJXJzaSksJXIxMQorCWFkZHEJMTYoJXJzcCksJXIxMQorCisJbW92cQklcmJ4LCVyMTIKKwlpbXVscQkyNC0xMjgoJXJzaSksJXIxMgorCWFkZHEJMjQoJXJzcCksJXIxMgorCXZwbXVsdWRxCTMyLTEyOCglcnNpKSwleW1tMTAsJXltbTAKKwl2bW92ZAklZWF4LCV4bW0xMQorCXZwYWRkcQkleW1tMCwleW1tMSwleW1tMQorCXZwbXVsdWRxCTY0LTEyOCglcnNpKSwleW1tMTAsJXltbTEyCisJdnBicm9hZGNhc3RxCSV4bW0xMSwleW1tMTEKKwl2cGFkZHEJJXltbTEyLCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJOTYtMTI4KCVyc2kpLCV5bW0xMCwleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTMsJXltbTMKKwl2cGFkZHEJJXltbTEzLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJMTI4LTEyOCglcnNpKSwleW1tMTAsJXltbTAKKwl2cGFkZHEJJXltbTAsJXltbTQsJXltbTQKKwl2cG11bHVkcQkxNjAtMTI4KCVyc2kpLCV5bW0xMCwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJMTkyLTEyOCglcnNpKSwleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tNiwleW1tNgorCXZwbXVsdWRxCTIyNC0xMjgoJXJzaSksJXltbTEwLCV5bW0wCisJdnBlcm1xCSQweDkzLCV5bW05LCV5bW05CisJdnBhZGRxCSV5bW0wLCV5bW03LCV5bW03CisJdnBtdWx1ZHEJMjU2LTEyOCglcnNpKSwleW1tMTAsJXltbTEyCisJdnBicm9hZGNhc3RxCTgoJXIxMyksJXltbTEwCisJdnBhZGRxCSV5bW0xMiwleW1tOCwleW1tOAorCisJbW92cQklcmF4LCVyZHgKKwlpbXVscQktMTI4KCVyY3gpLCVyYXgKKwlhZGRxCSVyYXgsJXI5CisJbW92cQklcmR4LCVyYXgKKwlpbXVscQk4LTEyOCglcmN4KSwlcmF4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyZHgsJXJheAorCWltdWxxCTE2LTEyOCglcmN4KSwlcmF4CisJYWRkcQklcmF4LCVyMTEKKwlzaHJxCSQyOSwlcjkKKwlpbXVscQkyNC0xMjgoJXJjeCksJXJkeAorCWFkZHEJJXJkeCwlcjEyCisJYWRkcQklcjksJXIxMAorCisJdnBtdWx1ZHEJMzItMTI4KCVyY3gpLCV5bW0xMSwleW1tMTMKKwl2bW92cQkleG1tMTAsJXJieAorCXZwYWRkcQkleW1tMTMsJXltbTEsJXltbTEKKwl2cG11bHVkcQk2NC0xMjgoJXJjeCksJXltbTExLCV5bW0wCisJdnBhZGRxCSV5bW0wLCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJOTYtMTI4KCVyY3gpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJMTI4LTEyOCglcmN4KSwleW1tMTEsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tNCwleW1tNAorCXZwbXVsdWRxCTE2MC0xMjgoJXJjeCksJXltbTExLCV5bW0wCisJdnBhZGRxCSV5bW0wLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJMTkyLTEyOCglcmN4KSwleW1tMTEsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tNiwleW1tNgorCXZwbXVsdWRxCTIyNC0xMjgoJXJjeCksJXltbTExLCV5bW0xMworCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tOSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW03LCV5bW03CisJdnBtdWx1ZHEJMjU2LTEyOCglcmN4KSwleW1tMTEsJXltbTAKKwl2cGFkZHEJJXltbTEyLCV5bW0zLCV5bW0zCisJdnBhZGRxCSV5bW0wLCV5bW04LCV5bW04CisKKwltb3ZxCSVyYngsJXJheAorCWltdWxxCS0xMjgoJXJzaSksJXJheAorCWFkZHEJJXJheCwlcjEwCisJdm1vdmRxdQktOCszMi0xMjgoJXJzaSksJXltbTEyCisJbW92cQklcmJ4LCVyYXgKKwlpbXVscQk4LTEyOCglcnNpKSwlcmF4CisJYWRkcQklcmF4LCVyMTEKKwl2bW92ZHF1CS04KzY0LTEyOCglcnNpKSwleW1tMTMKKworCW1vdnEJJXIxMCwlcmF4CisJdnBibGVuZGQJJDB4ZmMsJXltbTE0LCV5bW05LCV5bW05CisJaW11bGwJJXI4ZCwlZWF4CisJdnBhZGRxCSV5bW05LCV5bW00LCV5bW00CisJYW5kbAkkMHgxZmZmZmZmZiwlZWF4CisKKwlpbXVscQkxNi0xMjgoJXJzaSksJXJieAorCWFkZHEJJXJieCwlcjEyCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMiwleW1tMTIKKwl2bW92ZAklZWF4LCV4bW0xMQorCXZtb3ZkcXUJLTgrOTYtMTI4KCVyc2kpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tMSwleW1tMQorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTMsJXltbTEzCisJdnBicm9hZGNhc3RxCSV4bW0xMSwleW1tMTEKKwl2bW92ZHF1CS04KzEyOC0xMjgoJXJzaSksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tMiwleW1tMgorCXZwbXVsdWRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTgrMTYwLTEyOCglcnNpKSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTMsJXltbTMKKwl2cG11bHVkcQkleW1tMTAsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTgrMTkyLTEyOCglcnNpKSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTQsJXltbTQKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTgrMjI0LTEyOCglcnNpKSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktOCsyNTYtMTI4KCVyc2kpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tNiwleW1tNgorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTIsJXltbTEyCisJdm1vdmRxdQktOCsyODgtMTI4KCVyc2kpLCV5bW05CisJdnBhZGRxCSV5bW0xMiwleW1tNywleW1tNworCXZwbXVsdWRxCSV5bW0xMCwleW1tMTMsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tOCwleW1tOAorCXZwbXVsdWRxCSV5bW0xMCwleW1tOSwleW1tOQorCXZwYnJvYWRjYXN0cQkxNiglcjEzKSwleW1tMTAKKworCW1vdnEJJXJheCwlcmR4CisJaW11bHEJLTEyOCglcmN4KSwlcmF4CisJYWRkcQklcmF4LCVyMTAKKwl2bW92ZHF1CS04KzMyLTEyOCglcmN4KSwleW1tMAorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJOC0xMjgoJXJjeCksJXJheAorCWFkZHEJJXJheCwlcjExCisJdm1vdmRxdQktOCs2NC0xMjgoJXJjeCksJXltbTEyCisJc2hycQkkMjksJXIxMAorCWltdWxxCTE2LTEyOCglcmN4KSwlcmR4CisJYWRkcQklcmR4LCVyMTIKKwlhZGRxCSVyMTAsJXIxMQorCisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdnEJJXhtbTEwLCVyYngKKwl2bW92ZHF1CS04Kzk2LTEyOCglcmN4KSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTEsJXltbTEKKwl2cG11bHVkcQkleW1tMTEsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTgrMTI4LTEyOCglcmN4KSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTIsJXltbTIKKwl2cG11bHVkcQkleW1tMTEsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTgrMTYwLTEyOCglcmN4KSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktOCsxOTItMTI4KCVyY3gpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tNCwleW1tNAorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdm1vdmRxdQktOCsyMjQtMTI4KCVyY3gpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktOCsyNTYtMTI4KCVyY3gpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTYsJXltbTYKKwl2cG11bHVkcQkleW1tMTEsJXltbTAsJXltbTAKKwl2bW92ZHF1CS04KzI4OC0xMjgoJXJjeCksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW03LCV5bW03CisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMiwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW04LCV5bW04CisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMywleW1tMTMKKwl2cGFkZHEJJXltbTEzLCV5bW05LCV5bW05CisKKwl2bW92ZHF1CS0xNiszMi0xMjgoJXJzaSksJXltbTAKKwltb3ZxCSVyYngsJXJheAorCWltdWxxCS0xMjgoJXJzaSksJXJheAorCWFkZHEJJXIxMSwlcmF4CisKKwl2bW92ZHF1CS0xNis2NC0xMjgoJXJzaSksJXltbTEyCisJbW92cQklcmF4LCVyMTEKKwlpbXVsbAklcjhkLCVlYXgKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKworCWltdWxxCTgtMTI4KCVyc2kpLCVyYngKKwlhZGRxCSVyYngsJXIxMgorCXZwbXVsdWRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZtb3ZkCSVlYXgsJXhtbTExCisJdm1vdmRxdQktMTYrOTYtMTI4KCVyc2kpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tMSwleW1tMQorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTIsJXltbTEyCisJdnBicm9hZGNhc3RxCSV4bW0xMSwleW1tMTEKKwl2bW92ZHF1CS0xNisxMjgtMTI4KCVyc2kpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tMiwleW1tMgorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktMTYrMTYwLTEyOCglcnNpKSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktMTYrMTkyLTEyOCglcnNpKSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTQsJXltbTQKKwl2cG11bHVkcQkleW1tMTAsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTE2KzIyNC0xMjgoJXJzaSksJXltbTAKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CS0xNisyNTYtMTI4KCVyc2kpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTYsJXltbTYKKwl2cG11bHVkcQkleW1tMTAsJXltbTAsJXltbTAKKwl2bW92ZHF1CS0xNisyODgtMTI4KCVyc2kpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tNywleW1tNworCXZwbXVsdWRxCSV5bW0xMCwleW1tMTIsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tOCwleW1tOAorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTMsJXltbTEzCisJdnBicm9hZGNhc3RxCTI0KCVyMTMpLCV5bW0xMAorCXZwYWRkcQkleW1tMTMsJXltbTksJXltbTkKKworCXZtb3ZkcXUJLTE2KzMyLTEyOCglcmN4KSwleW1tMAorCW1vdnEJJXJheCwlcmR4CisJaW11bHEJLTEyOCglcmN4KSwlcmF4CisJYWRkcQklcmF4LCVyMTEKKwl2bW92ZHF1CS0xNis2NC0xMjgoJXJjeCksJXltbTEyCisJaW11bHEJOC0xMjgoJXJjeCksJXJkeAorCWFkZHEJJXJkeCwlcjEyCisJc2hycQkkMjksJXIxMQorCisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdnEJJXhtbTEwLCVyYngKKwl2bW92ZHF1CS0xNis5Ni0xMjgoJXJjeCksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW0xLCV5bW0xCisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CS0xNisxMjgtMTI4KCVyY3gpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tMiwleW1tMgorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktMTYrMTYwLTEyOCglcmN4KSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktMTYrMTkyLTEyOCglcmN4KSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTQsJXltbTQKKwl2cG11bHVkcQkleW1tMTEsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTE2KzIyNC0xMjgoJXJjeCksJXltbTAKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CS0xNisyNTYtMTI4KCVyY3gpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTYsJXltbTYKKwl2cG11bHVkcQkleW1tMTEsJXltbTAsJXltbTAKKwl2bW92ZHF1CS0xNisyODgtMTI4KCVyY3gpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tNywleW1tNworCXZwbXVsdWRxCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdm1vdmRxdQktMjQrMzItMTI4KCVyc2kpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tOCwleW1tOAorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktMjQrNjQtMTI4KCVyc2kpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTksJXltbTkKKworCWFkZHEJJXIxMSwlcjEyCisJaW11bHEJLTEyOCglcnNpKSwlcmJ4CisJYWRkcQklcmJ4LCVyMTIKKworCW1vdnEJJXIxMiwlcmF4CisJaW11bGwJJXI4ZCwlZWF4CisJYW5kbAkkMHgxZmZmZmZmZiwlZWF4CisKKwl2cG11bHVkcQkleW1tMTAsJXltbTAsJXltbTAKKwl2bW92ZAklZWF4LCV4bW0xMQorCXZtb3ZkcXUJLTI0Kzk2LTEyOCglcnNpKSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTEsJXltbTEKKwl2cG11bHVkcQkleW1tMTAsJXltbTEyLCV5bW0xMgorCXZwYnJvYWRjYXN0cQkleG1tMTEsJXltbTExCisJdm1vdmRxdQktMjQrMTI4LTEyOCglcnNpKSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTIsJXltbTIKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTI0KzE2MC0xMjgoJXJzaSksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tMywleW1tMworCXZwbXVsdWRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTI0KzE5Mi0xMjgoJXJzaSksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW00LCV5bW00CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CS0yNCsyMjQtMTI4KCVyc2kpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktMjQrMjU2LTEyOCglcnNpKSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktMjQrMjg4LTEyOCglcnNpKSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTcsJXltbTcKKwl2cG11bHVkcQkleW1tMTAsJXltbTEyLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTgsJXltbTgKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZwYnJvYWRjYXN0cQkzMiglcjEzKSwleW1tMTAKKwl2cGFkZHEJJXltbTEzLCV5bW05LCV5bW05CisJYWRkcQkkMzIsJXIxMworCisJdm1vdmRxdQktMjQrMzItMTI4KCVyY3gpLCV5bW0wCisJaW11bHEJLTEyOCglcmN4KSwlcmF4CisJYWRkcQklcmF4LCVyMTIKKwlzaHJxCSQyOSwlcjEyCisKKwl2bW92ZHF1CS0yNCs2NC0xMjgoJXJjeCksJXltbTEyCisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdnEJJXhtbTEwLCVyYngKKwl2bW92ZHF1CS0yNCs5Ni0xMjgoJXJjeCksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW0xLCV5bW0wCisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CSV5bW0wLCglcnNwKQorCXZwYWRkcQkleW1tMTIsJXltbTIsJXltbTEKKwl2bW92ZHF1CS0yNCsxMjgtMTI4KCVyY3gpLCV5bW0wCisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CS0yNCsxNjAtMTI4KCVyY3gpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTMsJXltbTIKKwl2cG11bHVkcQkleW1tMTEsJXltbTAsJXltbTAKKwl2bW92ZHF1CS0yNCsxOTItMTI4KCVyY3gpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tNCwleW1tMworCXZwbXVsdWRxCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdm1vdmRxdQktMjQrMjI0LTEyOCglcmN4KSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTUsJXltbTQKKwl2cG11bHVkcQkleW1tMTEsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTI0KzI1Ni0xMjgoJXJjeCksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tNiwleW1tNQorCXZwbXVsdWRxCSV5bW0xMSwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTI0KzI4OC0xMjgoJXJjeCksJXltbTEzCisJbW92cQklcjEyLCVyOQorCXZwYWRkcQkleW1tMCwleW1tNywleW1tNgorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTIsJXltbTEyCisJYWRkcQkoJXJzcCksJXI5CisJdnBhZGRxCSV5bW0xMiwleW1tOCwleW1tNworCXZwbXVsdWRxCSV5bW0xMSwleW1tMTMsJXltbTEzCisJdm1vdnEJJXIxMiwleG1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW05LCV5bW04CisKKwlkZWNsCSVyMTRkCisJam56CS5Mb29wX211bF8xMDI0CisJdnBhZGRxCSglcnNwKSwleW1tMTIsJXltbTAKKworCXZwc3JscQkkMjksJXltbTAsJXltbTEyCisJdnBhbmQJJXltbTE1LCV5bW0wLCV5bW0wCisJdnBzcmxxCSQyOSwleW1tMSwleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTEsJXltbTEKKwl2cHNybHEJJDI5LCV5bW0yLCV5bW0xMAorCXZwZXJtcQkkMHg5MywleW1tMTIsJXltbTEyCisJdnBhbmQJJXltbTE1LCV5bW0yLCV5bW0yCisJdnBzcmxxCSQyOSwleW1tMywleW1tMTEKKwl2cGVybXEJJDB4OTMsJXltbTEzLCV5bW0xMworCXZwYW5kCSV5bW0xNSwleW1tMywleW1tMworCisJdnBibGVuZGQJJDMsJXltbTE0LCV5bW0xMiwleW1tOQorCXZwZXJtcQkkMHg5MywleW1tMTAsJXltbTEwCisJdnBibGVuZGQJJDMsJXltbTEyLCV5bW0xMywleW1tMTIKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCXZwYWRkcQkleW1tOSwleW1tMCwleW1tMAorCXZwYmxlbmRkCSQzLCV5bW0xMywleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tMSwleW1tMQorCXZwYmxlbmRkCSQzLCV5bW0xMCwleW1tMTEsJXltbTEwCisJdnBhZGRxCSV5bW0xMywleW1tMiwleW1tMgorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tMTQsJXltbTExCisJdnBhZGRxCSV5bW0xMCwleW1tMywleW1tMworCXZwYWRkcQkleW1tMTEsJXltbTQsJXltbTQKKworCXZwc3JscQkkMjksJXltbTAsJXltbTEyCisJdnBhbmQJJXltbTE1LCV5bW0wLCV5bW0wCisJdnBzcmxxCSQyOSwleW1tMSwleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTEsJXltbTEKKwl2cHNybHEJJDI5LCV5bW0yLCV5bW0xMAorCXZwZXJtcQkkMHg5MywleW1tMTIsJXltbTEyCisJdnBhbmQJJXltbTE1LCV5bW0yLCV5bW0yCisJdnBzcmxxCSQyOSwleW1tMywleW1tMTEKKwl2cGVybXEJJDB4OTMsJXltbTEzLCV5bW0xMworCXZwYW5kCSV5bW0xNSwleW1tMywleW1tMworCXZwZXJtcQkkMHg5MywleW1tMTAsJXltbTEwCisKKwl2cGJsZW5kZAkkMywleW1tMTQsJXltbTEyLCV5bW05CisJdnBlcm1xCSQweDkzLCV5bW0xMSwleW1tMTEKKwl2cGJsZW5kZAkkMywleW1tMTIsJXltbTEzLCV5bW0xMgorCXZwYWRkcQkleW1tOSwleW1tMCwleW1tMAorCXZwYmxlbmRkCSQzLCV5bW0xMywleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tMSwleW1tMQorCXZwYmxlbmRkCSQzLCV5bW0xMCwleW1tMTEsJXltbTEwCisJdnBhZGRxCSV5bW0xMywleW1tMiwleW1tMgorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tMTQsJXltbTExCisJdnBhZGRxCSV5bW0xMCwleW1tMywleW1tMworCXZwYWRkcQkleW1tMTEsJXltbTQsJXltbTQKKworCXZtb3ZkcXUJJXltbTAsMC0xMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xLDMyLTEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTIsNjQtMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMyw5Ni0xMjgoJXJkaSkKKwl2cHNybHEJJDI5LCV5bW00LCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tNCwleW1tNAorCXZwc3JscQkkMjksJXltbTUsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW01LCV5bW01CisJdnBzcmxxCSQyOSwleW1tNiwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTEyLCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tNiwleW1tNgorCXZwc3JscQkkMjksJXltbTcsJXltbTExCisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTcsJXltbTcKKwl2cHNybHEJJDI5LCV5bW04LCV5bW0wCisJdnBlcm1xCSQweDkzLCV5bW0xMCwleW1tMTAKKwl2cGFuZAkleW1tMTUsJXltbTgsJXltbTgKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCisJdnBibGVuZGQJJDMsJXltbTE0LCV5bW0xMiwleW1tOQorCXZwZXJtcQkkMHg5MywleW1tMCwleW1tMAorCXZwYmxlbmRkCSQzLCV5bW0xMiwleW1tMTMsJXltbTEyCisJdnBhZGRxCSV5bW05LCV5bW00LCV5bW00CisJdnBibGVuZGQJJDMsJXltbTEzLCV5bW0xMCwleW1tMTMKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBibGVuZGQJJDMsJXltbTEwLCV5bW0xMSwleW1tMTAKKwl2cGFkZHEJJXltbTEzLCV5bW02LCV5bW02CisJdnBibGVuZGQJJDMsJXltbTExLCV5bW0wLCV5bW0xMQorCXZwYWRkcQkleW1tMTAsJXltbTcsJXltbTcKKwl2cGFkZHEJJXltbTExLCV5bW04LCV5bW04CisKKwl2cHNybHEJJDI5LCV5bW00LCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tNCwleW1tNAorCXZwc3JscQkkMjksJXltbTUsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW01LCV5bW01CisJdnBzcmxxCSQyOSwleW1tNiwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTEyLCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tNiwleW1tNgorCXZwc3JscQkkMjksJXltbTcsJXltbTExCisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTcsJXltbTcKKwl2cHNybHEJJDI5LCV5bW04LCV5bW0wCisJdnBlcm1xCSQweDkzLCV5bW0xMCwleW1tMTAKKwl2cGFuZAkleW1tMTUsJXltbTgsJXltbTgKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCisJdnBibGVuZGQJJDMsJXltbTE0LCV5bW0xMiwleW1tOQorCXZwZXJtcQkkMHg5MywleW1tMCwleW1tMAorCXZwYmxlbmRkCSQzLCV5bW0xMiwleW1tMTMsJXltbTEyCisJdnBhZGRxCSV5bW05LCV5bW00LCV5bW00CisJdnBibGVuZGQJJDMsJXltbTEzLCV5bW0xMCwleW1tMTMKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBibGVuZGQJJDMsJXltbTEwLCV5bW0xMSwleW1tMTAKKwl2cGFkZHEJJXltbTEzLCV5bW02LCV5bW02CisJdnBibGVuZGQJJDMsJXltbTExLCV5bW0wLCV5bW0xMQorCXZwYWRkcQkleW1tMTAsJXltbTcsJXltbTcKKwl2cGFkZHEJJXltbTExLCV5bW04LCV5bW04CisKKwl2bW92ZHF1CSV5bW00LDEyOC0xMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDE2MC0xMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW02LDE5Mi0xMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW03LDIyNC0xMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDI1Ni0xMjgoJXJkaSkKKwl2emVyb3VwcGVyCisKKwltb3ZxCSVyYnAsJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKwltb3ZxCS00OCglcmF4KSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyYXgpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJheCksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyYXgpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcmF4KSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyYXgpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTG11bF8xMDI0X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJcnNhel8xMDI0X211bF9hdngyLC4tcnNhel8xMDI0X211bF9hdngyCisuZ2xvYmwJcnNhel8xMDI0X3JlZDJub3JtX2F2eDIKKy5oaWRkZW4gcnNhel8xMDI0X3JlZDJub3JtX2F2eDIKKy50eXBlCXJzYXpfMTAyNF9yZWQybm9ybV9hdngyLEBmdW5jdGlvbgorLmFsaWduCTMyCityc2F6XzEwMjRfcmVkMm5vcm1fYXZ4MjoKKwlzdWJxCSQtMTI4LCVyc2kKKwl4b3JxCSVyYXgsJXJheAorCW1vdnEJLTEyOCglcnNpKSwlcjgKKwltb3ZxCS0xMjAoJXJzaSksJXI5CisJbW92cQktMTEyKCVyc2kpLCVyMTAKKwlzaGxxCSQwLCVyOAorCXNobHEJJDI5LCVyOQorCW1vdnEJJXIxMCwlcjExCisJc2hscQkkNTgsJXIxMAorCXNocnEJJDYsJXIxMQorCWFkZHEJJXI4LCVyYXgKKwlhZGRxCSVyOSwlcmF4CisJYWRkcQklcjEwLCVyYXgKKwlhZGNxCSQwLCVyMTEKKwltb3ZxCSVyYXgsMCglcmRpKQorCW1vdnEJJXIxMSwlcmF4CisJbW92cQktMTA0KCVyc2kpLCVyOAorCW1vdnEJLTk2KCVyc2kpLCVyOQorCXNobHEJJDIzLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzaGxxCSQ1MiwlcjkKKwlzaHJxCSQxMiwlcjEwCisJYWRkcQklcjgsJXJheAorCWFkZHEJJXI5LCVyYXgKKwlhZGNxCSQwLCVyMTAKKwltb3ZxCSVyYXgsOCglcmRpKQorCW1vdnEJJXIxMCwlcmF4CisJbW92cQktODgoJXJzaSksJXIxMQorCW1vdnEJLTgwKCVyc2kpLCVyOAorCXNobHEJJDE3LCVyMTEKKwltb3ZxCSVyOCwlcjkKKwlzaGxxCSQ0NiwlcjgKKwlzaHJxCSQxOCwlcjkKKwlhZGRxCSVyMTEsJXJheAorCWFkZHEJJXI4LCVyYXgKKwlhZGNxCSQwLCVyOQorCW1vdnEJJXJheCwxNiglcmRpKQorCW1vdnEJJXI5LCVyYXgKKwltb3ZxCS03MiglcnNpKSwlcjEwCisJbW92cQktNjQoJXJzaSksJXIxMQorCXNobHEJJDExLCVyMTAKKwltb3ZxCSVyMTEsJXI4CisJc2hscQkkNDAsJXIxMQorCXNocnEJJDI0LCVyOAorCWFkZHEJJXIxMCwlcmF4CisJYWRkcQklcjExLCVyYXgKKwlhZGNxCSQwLCVyOAorCW1vdnEJJXJheCwyNCglcmRpKQorCW1vdnEJJXI4LCVyYXgKKwltb3ZxCS01NiglcnNpKSwlcjkKKwltb3ZxCS00OCglcnNpKSwlcjEwCisJbW92cQktNDAoJXJzaSksJXIxMQorCXNobHEJJDUsJXI5CisJc2hscQkkMzQsJXIxMAorCW1vdnEJJXIxMSwlcjgKKwlzaGxxCSQ2MywlcjExCisJc2hycQkkMSwlcjgKKwlhZGRxCSVyOSwlcmF4CisJYWRkcQklcjEwLCVyYXgKKwlhZGRxCSVyMTEsJXJheAorCWFkY3EJJDAsJXI4CisJbW92cQklcmF4LDMyKCVyZGkpCisJbW92cQklcjgsJXJheAorCW1vdnEJLTMyKCVyc2kpLCVyOQorCW1vdnEJLTI0KCVyc2kpLCVyMTAKKwlzaGxxCSQyOCwlcjkKKwltb3ZxCSVyMTAsJXIxMQorCXNobHEJJDU3LCVyMTAKKwlzaHJxCSQ3LCVyMTEKKwlhZGRxCSVyOSwlcmF4CisJYWRkcQklcjEwLCVyYXgKKwlhZGNxCSQwLCVyMTEKKwltb3ZxCSVyYXgsNDAoJXJkaSkKKwltb3ZxCSVyMTEsJXJheAorCW1vdnEJLTE2KCVyc2kpLCVyOAorCW1vdnEJLTgoJXJzaSksJXI5CisJc2hscQkkMjIsJXI4CisJbW92cQklcjksJXIxMAorCXNobHEJJDUxLCVyOQorCXNocnEJJDEzLCVyMTAKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjksJXJheAorCWFkY3EJJDAsJXIxMAorCW1vdnEJJXJheCw0OCglcmRpKQorCW1vdnEJJXIxMCwlcmF4CisJbW92cQkwKCVyc2kpLCVyMTEKKwltb3ZxCTgoJXJzaSksJXI4CisJc2hscQkkMTYsJXIxMQorCW1vdnEJJXI4LCVyOQorCXNobHEJJDQ1LCVyOAorCXNocnEJJDE5LCVyOQorCWFkZHEJJXIxMSwlcmF4CisJYWRkcQklcjgsJXJheAorCWFkY3EJJDAsJXI5CisJbW92cQklcmF4LDU2KCVyZGkpCisJbW92cQklcjksJXJheAorCW1vdnEJMTYoJXJzaSksJXIxMAorCW1vdnEJMjQoJXJzaSksJXIxMQorCXNobHEJJDEwLCVyMTAKKwltb3ZxCSVyMTEsJXI4CisJc2hscQkkMzksJXIxMQorCXNocnEJJDI1LCVyOAorCWFkZHEJJXIxMCwlcmF4CisJYWRkcQklcjExLCVyYXgKKwlhZGNxCSQwLCVyOAorCW1vdnEJJXJheCw2NCglcmRpKQorCW1vdnEJJXI4LCVyYXgKKwltb3ZxCTMyKCVyc2kpLCVyOQorCW1vdnEJNDAoJXJzaSksJXIxMAorCW1vdnEJNDgoJXJzaSksJXIxMQorCXNobHEJJDQsJXI5CisJc2hscQkkMzMsJXIxMAorCW1vdnEJJXIxMSwlcjgKKwlzaGxxCSQ2MiwlcjExCisJc2hycQkkMiwlcjgKKwlhZGRxCSVyOSwlcmF4CisJYWRkcQklcjEwLCVyYXgKKwlhZGRxCSVyMTEsJXJheAorCWFkY3EJJDAsJXI4CisJbW92cQklcmF4LDcyKCVyZGkpCisJbW92cQklcjgsJXJheAorCW1vdnEJNTYoJXJzaSksJXI5CisJbW92cQk2NCglcnNpKSwlcjEwCisJc2hscQkkMjcsJXI5CisJbW92cQklcjEwLCVyMTEKKwlzaGxxCSQ1NiwlcjEwCisJc2hycQkkOCwlcjExCisJYWRkcQklcjksJXJheAorCWFkZHEJJXIxMCwlcmF4CisJYWRjcQkkMCwlcjExCisJbW92cQklcmF4LDgwKCVyZGkpCisJbW92cQklcjExLCVyYXgKKwltb3ZxCTcyKCVyc2kpLCVyOAorCW1vdnEJODAoJXJzaSksJXI5CisJc2hscQkkMjEsJXI4CisJbW92cQklcjksJXIxMAorCXNobHEJJDUwLCVyOQorCXNocnEJJDE0LCVyMTAKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjksJXJheAorCWFkY3EJJDAsJXIxMAorCW1vdnEJJXJheCw4OCglcmRpKQorCW1vdnEJJXIxMCwlcmF4CisJbW92cQk4OCglcnNpKSwlcjExCisJbW92cQk5NiglcnNpKSwlcjgKKwlzaGxxCSQxNSwlcjExCisJbW92cQklcjgsJXI5CisJc2hscQkkNDQsJXI4CisJc2hycQkkMjAsJXI5CisJYWRkcQklcjExLCVyYXgKKwlhZGRxCSVyOCwlcmF4CisJYWRjcQkkMCwlcjkKKwltb3ZxCSVyYXgsOTYoJXJkaSkKKwltb3ZxCSVyOSwlcmF4CisJbW92cQkxMDQoJXJzaSksJXIxMAorCW1vdnEJMTEyKCVyc2kpLCVyMTEKKwlzaGxxCSQ5LCVyMTAKKwltb3ZxCSVyMTEsJXI4CisJc2hscQkkMzgsJXIxMQorCXNocnEJJDI2LCVyOAorCWFkZHEJJXIxMCwlcmF4CisJYWRkcQklcjExLCVyYXgKKwlhZGNxCSQwLCVyOAorCW1vdnEJJXJheCwxMDQoJXJkaSkKKwltb3ZxCSVyOCwlcmF4CisJbW92cQkxMjAoJXJzaSksJXI5CisJbW92cQkxMjgoJXJzaSksJXIxMAorCW1vdnEJMTM2KCVyc2kpLCVyMTEKKwlzaGxxCSQzLCVyOQorCXNobHEJJDMyLCVyMTAKKwltb3ZxCSVyMTEsJXI4CisJc2hscQkkNjEsJXIxMQorCXNocnEJJDMsJXI4CisJYWRkcQklcjksJXJheAorCWFkZHEJJXIxMCwlcmF4CisJYWRkcQklcjExLCVyYXgKKwlhZGNxCSQwLCVyOAorCW1vdnEJJXJheCwxMTIoJXJkaSkKKwltb3ZxCSVyOCwlcmF4CisJbW92cQkxNDQoJXJzaSksJXI5CisJbW92cQkxNTIoJXJzaSksJXIxMAorCXNobHEJJDI2LCVyOQorCW1vdnEJJXIxMCwlcjExCisJc2hscQkkNTUsJXIxMAorCXNocnEJJDksJXIxMQorCWFkZHEJJXI5LCVyYXgKKwlhZGRxCSVyMTAsJXJheAorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXJheCwxMjAoJXJkaSkKKwltb3ZxCSVyMTEsJXJheAorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJcnNhel8xMDI0X3JlZDJub3JtX2F2eDIsLi1yc2F6XzEwMjRfcmVkMm5vcm1fYXZ4MgorCisuZ2xvYmwJcnNhel8xMDI0X25vcm0ycmVkX2F2eDIKKy5oaWRkZW4gcnNhel8xMDI0X25vcm0ycmVkX2F2eDIKKy50eXBlCXJzYXpfMTAyNF9ub3JtMnJlZF9hdngyLEBmdW5jdGlvbgorLmFsaWduCTMyCityc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MjoKKwlzdWJxCSQtMTI4LCVyZGkKKwltb3ZxCSglcnNpKSwlcjgKKwltb3ZsCSQweDFmZmZmZmZmLCVlYXgKKwltb3ZxCTgoJXJzaSksJXI5CisJbW92cQklcjgsJXIxMQorCXNocnEJJDAsJXIxMQorCWFuZHEJJXJheCwlcjExCisJbW92cQklcjExLC0xMjgoJXJkaSkKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkMjksJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLC0xMjAoJXJkaSkKKwlzaHJkcQkkNTgsJXI5LCVyOAorCWFuZHEJJXJheCwlcjgKKwltb3ZxCSVyOCwtMTEyKCVyZGkpCisJbW92cQkxNiglcnNpKSwlcjEwCisJbW92cQklcjksJXI4CisJc2hycQkkMjMsJXI4CisJYW5kcQklcmF4LCVyOAorCW1vdnEJJXI4LC0xMDQoJXJkaSkKKwlzaHJkcQkkNTIsJXIxMCwlcjkKKwlhbmRxCSVyYXgsJXI5CisJbW92cQklcjksLTk2KCVyZGkpCisJbW92cQkyNCglcnNpKSwlcjExCisJbW92cQklcjEwLCVyOQorCXNocnEJJDE3LCVyOQorCWFuZHEJJXJheCwlcjkKKwltb3ZxCSVyOSwtODgoJXJkaSkKKwlzaHJkcQkkNDYsJXIxMSwlcjEwCisJYW5kcQklcmF4LCVyMTAKKwltb3ZxCSVyMTAsLTgwKCVyZGkpCisJbW92cQkzMiglcnNpKSwlcjgKKwltb3ZxCSVyMTEsJXIxMAorCXNocnEJJDExLCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCwtNzIoJXJkaSkKKwlzaHJkcQkkNDAsJXI4LCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSwtNjQoJXJkaSkKKwltb3ZxCTQwKCVyc2kpLCVyOQorCW1vdnEJJXI4LCVyMTEKKwlzaHJxCSQ1LCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSwtNTYoJXJkaSkKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkMzQsJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLC00OCglcmRpKQorCXNocmRxCSQ2MywlcjksJXI4CisJYW5kcQklcmF4LCVyOAorCW1vdnEJJXI4LC00MCglcmRpKQorCW1vdnEJNDgoJXJzaSksJXIxMAorCW1vdnEJJXI5LCVyOAorCXNocnEJJDI4LCVyOAorCWFuZHEJJXJheCwlcjgKKwltb3ZxCSVyOCwtMzIoJXJkaSkKKwlzaHJkcQkkNTcsJXIxMCwlcjkKKwlhbmRxCSVyYXgsJXI5CisJbW92cQklcjksLTI0KCVyZGkpCisJbW92cQk1NiglcnNpKSwlcjExCisJbW92cQklcjEwLCVyOQorCXNocnEJJDIyLCVyOQorCWFuZHEJJXJheCwlcjkKKwltb3ZxCSVyOSwtMTYoJXJkaSkKKwlzaHJkcQkkNTEsJXIxMSwlcjEwCisJYW5kcQklcmF4LCVyMTAKKwltb3ZxCSVyMTAsLTgoJXJkaSkKKwltb3ZxCTY0KCVyc2kpLCVyOAorCW1vdnEJJXIxMSwlcjEwCisJc2hycQkkMTYsJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLDAoJXJkaSkKKwlzaHJkcQkkNDUsJXI4LCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSw4KCVyZGkpCisJbW92cQk3MiglcnNpKSwlcjkKKwltb3ZxCSVyOCwlcjExCisJc2hycQkkMTAsJXIxMQorCWFuZHEJJXJheCwlcjExCisJbW92cQklcjExLDE2KCVyZGkpCisJc2hyZHEJJDM5LCVyOSwlcjgKKwlhbmRxCSVyYXgsJXI4CisJbW92cQklcjgsMjQoJXJkaSkKKwltb3ZxCTgwKCVyc2kpLCVyMTAKKwltb3ZxCSVyOSwlcjgKKwlzaHJxCSQ0LCVyOAorCWFuZHEJJXJheCwlcjgKKwltb3ZxCSVyOCwzMiglcmRpKQorCW1vdnEJJXI5LCVyMTEKKwlzaHJxCSQzMywlcjExCisJYW5kcQklcmF4LCVyMTEKKwltb3ZxCSVyMTEsNDAoJXJkaSkKKwlzaHJkcQkkNjIsJXIxMCwlcjkKKwlhbmRxCSVyYXgsJXI5CisJbW92cQklcjksNDgoJXJkaSkKKwltb3ZxCTg4KCVyc2kpLCVyMTEKKwltb3ZxCSVyMTAsJXI5CisJc2hycQkkMjcsJXI5CisJYW5kcQklcmF4LCVyOQorCW1vdnEJJXI5LDU2KCVyZGkpCisJc2hyZHEJJDU2LCVyMTEsJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLDY0KCVyZGkpCisJbW92cQk5NiglcnNpKSwlcjgKKwltb3ZxCSVyMTEsJXIxMAorCXNocnEJJDIxLCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCw3MiglcmRpKQorCXNocmRxCSQ1MCwlcjgsJXIxMQorCWFuZHEJJXJheCwlcjExCisJbW92cQklcjExLDgwKCVyZGkpCisJbW92cQkxMDQoJXJzaSksJXI5CisJbW92cQklcjgsJXIxMQorCXNocnEJJDE1LCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSw4OCglcmRpKQorCXNocmRxCSQ0NCwlcjksJXI4CisJYW5kcQklcmF4LCVyOAorCW1vdnEJJXI4LDk2KCVyZGkpCisJbW92cQkxMTIoJXJzaSksJXIxMAorCW1vdnEJJXI5LCVyOAorCXNocnEJJDksJXI4CisJYW5kcQklcmF4LCVyOAorCW1vdnEJJXI4LDEwNCglcmRpKQorCXNocmRxCSQzOCwlcjEwLCVyOQorCWFuZHEJJXJheCwlcjkKKwltb3ZxCSVyOSwxMTIoJXJkaSkKKwltb3ZxCTEyMCglcnNpKSwlcjExCisJbW92cQklcjEwLCVyOQorCXNocnEJJDMsJXI5CisJYW5kcQklcmF4LCVyOQorCW1vdnEJJXI5LDEyMCglcmRpKQorCW1vdnEJJXIxMCwlcjgKKwlzaHJxCSQzMiwlcjgKKwlhbmRxCSVyYXgsJXI4CisJbW92cQklcjgsMTI4KCVyZGkpCisJc2hyZHEJJDYxLCVyMTEsJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLDEzNiglcmRpKQorCXhvcnEJJXI4LCVyOAorCW1vdnEJJXIxMSwlcjEwCisJc2hycQkkMjYsJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLDE0NCglcmRpKQorCXNocmRxCSQ1NSwlcjgsJXIxMQorCWFuZHEJJXJheCwlcjExCisJbW92cQklcjExLDE1MiglcmRpKQorCW1vdnEJJXI4LDE2MCglcmRpKQorCW1vdnEJJXI4LDE2OCglcmRpKQorCW1vdnEJJXI4LDE3NiglcmRpKQorCW1vdnEJJXI4LDE4NCglcmRpKQorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJcnNhel8xMDI0X25vcm0ycmVkX2F2eDIsLi1yc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MgorLmdsb2JsCXJzYXpfMTAyNF9zY2F0dGVyNV9hdngyCisuaGlkZGVuIHJzYXpfMTAyNF9zY2F0dGVyNV9hdngyCisudHlwZQlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4MixAZnVuY3Rpb24KKy5hbGlnbgkzMgorcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDI6CisJdnplcm91cHBlcgorCXZtb3ZkcXUJLkxzY2F0dGVyX3Blcm1kKCVyaXApLCV5bW01CisJc2hsbAkkNCwlZWR4CisJbGVhcQkoJXJkaSwlcmR4LDEpLCVyZGkKKwltb3ZsCSQ5LCVlYXgKKwlqbXAJLkxvb3Bfc2NhdHRlcl8xMDI0CisKKy5hbGlnbgkzMgorLkxvb3Bfc2NhdHRlcl8xMDI0OgorCXZtb3ZkcXUJKCVyc2kpLCV5bW0wCisJbGVhcQkzMiglcnNpKSwlcnNpCisJdnBlcm1kCSV5bW0wLCV5bW01LCV5bW0wCisJdm1vdmRxdQkleG1tMCwoJXJkaSkKKwlsZWFxCTUxMiglcmRpKSwlcmRpCisJZGVjbAklZWF4CisJam56CS5Mb29wX3NjYXR0ZXJfMTAyNAorCisJdnplcm91cHBlcgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDIsLi1yc2F6XzEwMjRfc2NhdHRlcjVfYXZ4MgorCisuZ2xvYmwJcnNhel8xMDI0X2dhdGhlcjVfYXZ4MgorLmhpZGRlbiByc2F6XzEwMjRfZ2F0aGVyNV9hdngyCisudHlwZQlyc2F6XzEwMjRfZ2F0aGVyNV9hdngyLEBmdW5jdGlvbgorLmFsaWduCTMyCityc2F6XzEwMjRfZ2F0aGVyNV9hdngyOgorLmNmaV9zdGFydHByb2MJCisJdnplcm91cHBlcgorCW1vdnEJJXJzcCwlcjExCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXIxMQorCWxlYXEJLTI1NiglcnNwKSwlcnNwCisJYW5kcQkkLTMyLCVyc3AKKwlsZWFxCS5MaW5jKCVyaXApLCVyMTAKKwlsZWFxCS0xMjgoJXJzcCksJXJheAorCisJdm1vdmQJJWVkeCwleG1tNAorCXZtb3ZkcWEJKCVyMTApLCV5bW0wCisJdm1vdmRxYQkzMiglcjEwKSwleW1tMQorCXZtb3ZkcWEJNjQoJXIxMCksJXltbTUKKwl2cGJyb2FkY2FzdGQJJXhtbTQsJXltbTQKKworCXZwYWRkZAkleW1tNSwleW1tMCwleW1tMgorCXZwY21wZXFkCSV5bW00LCV5bW0wLCV5bW0wCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0zCisJdnBjbXBlcWQJJXltbTQsJXltbTEsJXltbTEKKwl2bW92ZHFhCSV5bW0wLDArMTI4KCVyYXgpCisJdnBhZGRkCSV5bW01LCV5bW0yLCV5bW0wCisJdnBjbXBlcWQJJXltbTQsJXltbTIsJXltbTIKKwl2bW92ZHFhCSV5bW0xLDMyKzEyOCglcmF4KQorCXZwYWRkZAkleW1tNSwleW1tMywleW1tMQorCXZwY21wZXFkCSV5bW00LCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMiw2NCsxMjgoJXJheCkKKwl2cGFkZGQJJXltbTUsJXltbTAsJXltbTIKKwl2cGNtcGVxZAkleW1tNCwleW1tMCwleW1tMAorCXZtb3ZkcWEJJXltbTMsOTYrMTI4KCVyYXgpCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0zCisJdnBjbXBlcWQJJXltbTQsJXltbTEsJXltbTEKKwl2bW92ZHFhCSV5bW0wLDEyOCsxMjgoJXJheCkKKwl2cGFkZGQJJXltbTUsJXltbTIsJXltbTgKKwl2cGNtcGVxZAkleW1tNCwleW1tMiwleW1tMgorCXZtb3ZkcWEJJXltbTEsMTYwKzEyOCglcmF4KQorCXZwYWRkZAkleW1tNSwleW1tMywleW1tOQorCXZwY21wZXFkCSV5bW00LCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMiwxOTIrMTI4KCVyYXgpCisJdnBhZGRkCSV5bW01LCV5bW04LCV5bW0xMAorCXZwY21wZXFkCSV5bW00LCV5bW04LCV5bW04CisJdm1vdmRxYQkleW1tMywyMjQrMTI4KCVyYXgpCisJdnBhZGRkCSV5bW01LCV5bW05LCV5bW0xMQorCXZwY21wZXFkCSV5bW00LCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW01LCV5bW0xMCwleW1tMTIKKwl2cGNtcGVxZAkleW1tNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW01LCV5bW0xMSwleW1tMTMKKwl2cGNtcGVxZAkleW1tNCwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW01LCV5bW0xMiwleW1tMTQKKwl2cGNtcGVxZAkleW1tNCwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW01LCV5bW0xMywleW1tMTUKKwl2cGNtcGVxZAkleW1tNCwleW1tMTMsJXltbTEzCisJdnBjbXBlcWQJJXltbTQsJXltbTE0LCV5bW0xNAorCXZwY21wZXFkCSV5bW00LCV5bW0xNSwleW1tMTUKKworCXZtb3ZkcWEJLTMyKCVyMTApLCV5bW03CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCW1vdmwJJDksJWVkeAorCisuTG9vcF9nYXRoZXJfMTAyNDoKKwl2bW92ZHFhCTAtMTI4KCVyc2kpLCV5bW0wCisJdm1vdmRxYQkzMi0xMjgoJXJzaSksJXltbTEKKwl2bW92ZHFhCTY0LTEyOCglcnNpKSwleW1tMgorCXZtb3ZkcWEJOTYtMTI4KCVyc2kpLCV5bW0zCisJdnBhbmQJMCsxMjgoJXJheCksJXltbTAsJXltbTAKKwl2cGFuZAkzMisxMjgoJXJheCksJXltbTEsJXltbTEKKwl2cGFuZAk2NCsxMjgoJXJheCksJXltbTIsJXltbTIKKwl2cG9yCSV5bW0wLCV5bW0xLCV5bW00CisJdnBhbmQJOTYrMTI4KCVyYXgpLCV5bW0zLCV5bW0zCisJdm1vdmRxYQkxMjgtMTI4KCVyc2kpLCV5bW0wCisJdm1vdmRxYQkxNjAtMTI4KCVyc2kpLCV5bW0xCisJdnBvcgkleW1tMiwleW1tMywleW1tNQorCXZtb3ZkcWEJMTkyLTEyOCglcnNpKSwleW1tMgorCXZtb3ZkcWEJMjI0LTEyOCglcnNpKSwleW1tMworCXZwYW5kCTEyOCsxMjgoJXJheCksJXltbTAsJXltbTAKKwl2cGFuZAkxNjArMTI4KCVyYXgpLCV5bW0xLCV5bW0xCisJdnBhbmQJMTkyKzEyOCglcmF4KSwleW1tMiwleW1tMgorCXZwb3IJJXltbTAsJXltbTQsJXltbTQKKwl2cGFuZAkyMjQrMTI4KCVyYXgpLCV5bW0zLCV5bW0zCisJdnBhbmQJMjU2LTEyOCglcnNpKSwleW1tOCwleW1tMAorCXZwb3IJJXltbTEsJXltbTUsJXltbTUKKwl2cGFuZAkyODgtMTI4KCVyc2kpLCV5bW05LCV5bW0xCisJdnBvcgkleW1tMiwleW1tNCwleW1tNAorCXZwYW5kCTMyMC0xMjgoJXJzaSksJXltbTEwLCV5bW0yCisJdnBvcgkleW1tMywleW1tNSwleW1tNQorCXZwYW5kCTM1Mi0xMjgoJXJzaSksJXltbTExLCV5bW0zCisJdnBvcgkleW1tMCwleW1tNCwleW1tNAorCXZwYW5kCTM4NC0xMjgoJXJzaSksJXltbTEyLCV5bW0wCisJdnBvcgkleW1tMSwleW1tNSwleW1tNQorCXZwYW5kCTQxNi0xMjgoJXJzaSksJXltbTEzLCV5bW0xCisJdnBvcgkleW1tMiwleW1tNCwleW1tNAorCXZwYW5kCTQ0OC0xMjgoJXJzaSksJXltbTE0LCV5bW0yCisJdnBvcgkleW1tMywleW1tNSwleW1tNQorCXZwYW5kCTQ4MC0xMjgoJXJzaSksJXltbTE1LCV5bW0zCisJbGVhcQk1MTIoJXJzaSksJXJzaQorCXZwb3IJJXltbTAsJXltbTQsJXltbTQKKwl2cG9yCSV5bW0xLCV5bW01LCV5bW01CisJdnBvcgkleW1tMiwleW1tNCwleW1tNAorCXZwb3IJJXltbTMsJXltbTUsJXltbTUKKworCXZwb3IJJXltbTUsJXltbTQsJXltbTQKKwl2ZXh0cmFjdGkxMjgJJDEsJXltbTQsJXhtbTUKKwl2cG9yCSV4bW00LCV4bW01LCV4bW01CisJdnBlcm1kCSV5bW01LCV5bW03LCV5bW01CisJdm1vdmRxdQkleW1tNSwoJXJkaSkKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlkZWNsCSVlZHgKKwlqbnoJLkxvb3BfZ2F0aGVyXzEwMjQKKworCXZweG9yCSV5bW0wLCV5bW0wLCV5bW0wCisJdm1vdmRxdQkleW1tMCwoJXJkaSkKKwl2emVyb3VwcGVyCisJbGVhcQkoJXIxMSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5MU0VIX2VuZF9yc2F6XzEwMjRfZ2F0aGVyNToKKy5zaXplCXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIsLi1yc2F6XzEwMjRfZ2F0aGVyNV9hdngyCisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisuaGlkZGVuIE9QRU5TU0xfaWEzMmNhcF9QCisuZ2xvYmwJcnNhel9hdngyX2VsaWdpYmxlCisuaGlkZGVuIHJzYXpfYXZ4Ml9lbGlnaWJsZQorLnR5cGUJcnNhel9hdngyX2VsaWdpYmxlLEBmdW5jdGlvbgorLmFsaWduCTMyCityc2F6X2F2eDJfZWxpZ2libGU6CisJbGVhcQlPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmF4CisJbW92bAk4KCVyYXgpLCVlYXgKKwltb3ZsCSQ1MjQ1NDQsJWVjeAorCW1vdmwJJDAsJWVkeAorCWFuZGwJJWVheCwlZWN4CisJY21wbAkkNTI0NTQ0LCVlY3gKKwljbW92ZWwJJWVkeCwlZWF4CisJYW5kbAkkMzIsJWVheAorCXNocmwJJDUsJWVheAorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJcnNhel9hdngyX2VsaWdpYmxlLC4tcnNhel9hdngyX2VsaWdpYmxlCisKKy5hbGlnbgk2NAorLkxhbmRfbWFzazoKKy5xdWFkCTB4MWZmZmZmZmYsMHgxZmZmZmZmZiwweDFmZmZmZmZmLDB4MWZmZmZmZmYKKy5Mc2NhdHRlcl9wZXJtZDoKKy5sb25nCTAsMiw0LDYsNyw3LDcsNworLkxnYXRoZXJfcGVybWQ6CisubG9uZwkwLDcsMSw3LDIsNywzLDcKKy5MaW5jOgorLmxvbmcJMCwwLDAsMCwgMSwxLDEsMQorLmxvbmcJMiwyLDIsMiwgMywzLDMsMworLmxvbmcJNCw0LDQsNCwgNCw0LDQsNAorLmFsaWduCTY0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTEteDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NmFjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLXg4Nl82NC5TCkBAIC0wLDAgKzEsMzU4OCBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKy5oaWRkZW4gT1BFTlNTTF9pYTMyY2FwX1AKKworLmdsb2JsCXNoYTFfYmxvY2tfZGF0YV9vcmRlcgorLmhpZGRlbiBzaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy50eXBlCXNoYTFfYmxvY2tfZGF0YV9vcmRlcixAZnVuY3Rpb24KKy5hbGlnbgkxNgorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorLmNmaV9zdGFydHByb2MJCisJbGVhcQlPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjEwCisJbW92bAkwKCVyMTApLCVyOWQKKwltb3ZsCTQoJXIxMCksJXI4ZAorCW1vdmwJOCglcjEwKSwlcjEwZAorCXRlc3RsCSQ1MTIsJXI4ZAorCWp6CS5MaWFsdQorCWFuZGwJJDI2ODQzNTQ1NiwlcjhkCisJYW5kbAkkMTA3Mzc0MTgyNCwlcjlkCisJb3JsCSVyOWQsJXI4ZAorCWNtcGwJJDEzNDIxNzcyODAsJXI4ZAorCWplCV9hdnhfc2hvcnRjdXQKKwlqbXAJX3Nzc2UzX3Nob3J0Y3V0CisKKy5hbGlnbgkxNgorLkxpYWx1OgorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwltb3ZxCSVyZGksJXI4CisJc3VicQkkNzIsJXJzcAorCW1vdnEJJXJzaSwlcjkKKwlhbmRxCSQtNjQsJXJzcAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQklcmF4LDY0KCVyc3ApCisuY2ZpX2VzY2FwZQkweDBmLDB4MDYsMHg3NywweGMwLDB4MDAsMHgwNiwweDIzLDB4MDgKKy5McHJvbG9ndWU6CisKKwltb3ZsCTAoJXI4KSwlZXNpCisJbW92bAk0KCVyOCksJWVkaQorCW1vdmwJOCglcjgpLCVyMTFkCisJbW92bAkxMiglcjgpLCVyMTJkCisJbW92bAkxNiglcjgpLCVyMTNkCisJam1wCS5MbG9vcAorCisuYWxpZ24JMTYKKy5MbG9vcDoKKwltb3ZsCTAoJXI5KSwlZWR4CisJYnN3YXBsCSVlZHgKKwltb3ZsCTQoJXI5KSwlZWJwCisJbW92bAklcjEyZCwlZWF4CisJbW92bAklZWR4LDAoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCWJzd2FwbAklZWJwCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklZWRpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJkeCwlcjEzLDEpLCVyMTNkCisJYWRkbAklZWN4LCVyMTNkCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVheCwlcjEzZAorCW1vdmwJOCglcjkpLCVyMTRkCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWJwLDQoJXJzcCkKKwltb3ZsCSVyMTNkLCVlY3gKKwlic3dhcGwJJXIxNGQKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJWVzaSwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyYnAsJXIxMiwxKSwlcjEyZAorCWFkZGwJJWVjeCwlcjEyZAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYXgsJXIxMmQKKwltb3ZsCTEyKCVyOSksJWVkeAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklcjE0ZCw4KCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJYnN3YXBsCSVlZHgKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJXIxM2QsJWVheAorCWxlYWwJMTUxODUwMDI0OSglcjE0LCVyMTEsMSksJXIxMWQKKwlhZGRsCSVlY3gsJXIxMWQKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJbW92bAkxNiglcjkpLCVlYnAKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVkeCwxMiglcnNwKQorCW1vdmwJJXIxMWQsJWVjeAorCWJzd2FwbAklZWJwCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklcjEyZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyZHgsJXJkaSwxKSwlZWRpCisJYWRkbAklZWN4LCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWF4LCVlZGkKKwltb3ZsCTIwKCVyOSksJXIxNGQKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVlYnAsMTYoJXJzcCkKKwltb3ZsCSVlZGksJWVjeAorCWJzd2FwbAklcjE0ZAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJXIxMWQsJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmJwLCVyc2ksMSksJWVzaQorCWFkZGwJJWVjeCwlZXNpCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYXgsJWVzaQorCW1vdmwJMjQoJXI5KSwlZWR4CisJbW92bAklcjEyZCwlZWF4CisJbW92bAklcjE0ZCwyMCglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJYnN3YXBsCSVlZHgKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVlZGksJWVheAorCWxlYWwJMTUxODUwMDI0OSglcjE0LCVyMTMsMSksJXIxM2QKKwlhZGRsCSVlY3gsJXIxM2QKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJbW92bAkyOCglcjkpLCVlYnAKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVlZHgsMjQoJXJzcCkKKwltb3ZsCSVyMTNkLCVlY3gKKwlic3dhcGwJJWVicAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklZXNpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJkeCwlcjEyLDEpLCVyMTJkCisJYWRkbAklZWN4LCVyMTJkCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVheCwlcjEyZAorCW1vdmwJMzIoJXI5KSwlcjE0ZAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWJwLDI4KCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJYnN3YXBsCSVyMTRkCisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVyMTNkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJicCwlcjExLDEpLCVyMTFkCisJYWRkbAklZWN4LCVyMTFkCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVheCwlcjExZAorCW1vdmwJMzYoJXI5KSwlZWR4CisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVyMTRkLDMyKCVyc3ApCisJbW92bAklcjExZCwlZWN4CisJYnN3YXBsCSVlZHgKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVyMTJkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXIxNCwlcmRpLDEpLCVlZGkKKwlhZGRsCSVlY3gsJWVkaQorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYXgsJWVkaQorCW1vdmwJNDAoJXI5KSwlZWJwCisJbW92bAklcjEzZCwlZWF4CisJbW92bAklZWR4LDM2KCVyc3ApCisJbW92bAklZWRpLCVlY3gKKwlic3dhcGwJJWVicAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJXIxMWQsJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmR4LCVyc2ksMSksJWVzaQorCWFkZGwJJWVjeCwlZXNpCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYXgsJWVzaQorCW1vdmwJNDQoJXI5KSwlcjE0ZAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJWVicCw0MCglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJYnN3YXBsCSVyMTRkCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklZWRpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJicCwlcjEzLDEpLCVyMTNkCisJYWRkbAklZWN4LCVyMTNkCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVheCwlcjEzZAorCW1vdmwJNDgoJXI5KSwlZWR4CisJbW92bAklcjExZCwlZWF4CisJbW92bAklcjE0ZCw0NCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCWJzd2FwbAklZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVlc2ksJWVheAorCWxlYWwJMTUxODUwMDI0OSglcjE0LCVyMTIsMSksJXIxMmQKKwlhZGRsCSVlY3gsJXIxMmQKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJbW92bAk1MiglcjkpLCVlYnAKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJWVkeCw0OCglcnNwKQorCW1vdmwJJXIxMmQsJWVjeAorCWJzd2FwbAklZWJwCisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVyMTNkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJkeCwlcjExLDEpLCVyMTFkCisJYWRkbAklZWN4LCVyMTFkCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVheCwlcjExZAorCW1vdmwJNTYoJXI5KSwlcjE0ZAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWJwLDUyKCVyc3ApCisJbW92bAklcjExZCwlZWN4CisJYnN3YXBsCSVyMTRkCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklcjEyZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyYnAsJXJkaSwxKSwlZWRpCisJYWRkbAklZWN4LCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWF4LCVlZGkKKwltb3ZsCTYwKCVyOSksJWVkeAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJXIxNGQsNTYoJXJzcCkKKwltb3ZsCSVlZGksJWVjeAorCWJzd2FwbAklZWR4CisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklcjExZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyMTQsJXJzaSwxKSwlZXNpCisJYWRkbAklZWN4LCVlc2kKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVheCwlZXNpCisJeG9ybAkwKCVyc3ApLCVlYnAKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVlZHgsNjAoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJOCglcnNwKSwlZWJwCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkzMiglcnNwKSwlZWJwCisJYW5kbAklZWRpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJkeCwlcjEzLDEpLCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCXhvcmwJJXIxMmQsJWVheAorCWFkZGwJJWVjeCwlcjEzZAorCXJvbGwJJDEsJWVicAorCWFkZGwJJWVheCwlcjEzZAorCXhvcmwJNCglcnNwKSwlcjE0ZAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJWVicCwwKCVyc3ApCisJbW92bAklcjEzZCwlZWN4CisJeG9ybAkxMiglcnNwKSwlcjE0ZAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkzNiglcnNwKSwlcjE0ZAorCWFuZGwJJWVzaSwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyYnAsJXIxMiwxKSwlcjEyZAorCXJvbGwJJDMwLCVlc2kKKwl4b3JsCSVyMTFkLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQxLCVyMTRkCisJYWRkbAklZWF4LCVyMTJkCisJeG9ybAk4KCVyc3ApLCVlZHgKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJXIxNGQsNCglcnNwKQorCW1vdmwJJXIxMmQsJWVjeAorCXhvcmwJMTYoJXJzcCksJWVkeAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0MCglcnNwKSwlZWR4CisJYW5kbAklcjEzZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyMTQsJXIxMSwxKSwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMWQKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYXgsJXIxMWQKKwl4b3JsCTEyKCVyc3ApLCVlYnAKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVkeCw4KCVyc3ApCisJbW92bAklcjExZCwlZWN4CisJeG9ybAkyMCglcnNwKSwlZWJwCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0NCglcnNwKSwlZWJwCisJYW5kbAklcjEyZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyZHgsJXJkaSwxKSwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMSwlZWJwCisJYWRkbAklZWF4LCVlZGkKKwl4b3JsCTE2KCVyc3ApLCVyMTRkCisJbW92bAklcjEzZCwlZWF4CisJbW92bAklZWJwLDEyKCVyc3ApCisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTI0KCVyc3ApLCVyMTRkCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0OCglcnNwKSwlcjE0ZAorCWFuZGwJJXIxMWQsJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmJwLCVyc2ksMSksJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQxLCVyMTRkCisJYWRkbAklZWF4LCVlc2kKKwl4b3JsCTIwKCVyc3ApLCVlZHgKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJXIxNGQsMTYoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJMjgoJXJzcCksJWVkeAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNTIoJXJzcCksJWVkeAorCWxlYWwJMTg1OTc3NTM5MyglcjE0LCVyMTMsMSksJXIxM2QKKwl4b3JsCSVyMTFkLCVlYXgKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlZWR4CisJeG9ybAkyNCglcnNwKSwlZWJwCisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlZHgsMjAoJXJzcCkKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTMyKCVyc3ApLCVlYnAKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTU2KCVyc3ApLCVlYnAKKwlsZWFsCTE4NTk3NzUzOTMoJXJkeCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlZWJwCisJeG9ybAkyOCglcnNwKSwlcjE0ZAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJWVicCwyNCglcnNwKQorCW1vdmwJJXIxMmQsJWVjeAorCXhvcmwJMzYoJXJzcCksJXIxNGQKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNjAoJXJzcCksJXIxNGQKKwlsZWFsCTE4NTk3NzUzOTMoJXJicCwlcjExLDEpLCVyMTFkCisJeG9ybAklZXNpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMWQKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVheCwlcjExZAorCXJvbGwJJDEsJXIxNGQKKwl4b3JsCTMyKCVyc3ApLCVlZHgKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVyMTRkLDI4KCVyc3ApCisJbW92bAklcjExZCwlZWN4CisJeG9ybAk0MCglcnNwKSwlZWR4CisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTAoJXJzcCksJWVkeAorCWxlYWwJMTg1OTc3NTM5MyglcjE0LCVyZGksMSksJWVkaQorCXhvcmwJJXIxM2QsJWVheAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYXgsJWVkaQorCXJvbGwJJDEsJWVkeAorCXhvcmwJMzYoJXJzcCksJWVicAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJWVkeCwzMiglcnNwKQorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAk0NCglcnNwKSwlZWJwCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0KCVyc3ApLCVlYnAKKwlsZWFsCTE4NTk3NzUzOTMoJXJkeCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTQwKCVyc3ApLCVyMTRkCisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVlYnAsMzYoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJNDgoJXJzcCksJXIxNGQKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTgoJXJzcCksJXIxNGQKKwlsZWFsCTE4NTk3NzUzOTMoJXJicCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWF4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJXIxNGQKKwl4b3JsCTQ0KCVyc3ApLCVlZHgKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJXIxNGQsNDAoJXJzcCkKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTUyKCVyc3ApLCVlZHgKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTEyKCVyc3ApLCVlZHgKKwlsZWFsCTE4NTk3NzUzOTMoJXIxNCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlZWR4CisJeG9ybAk0OCglcnNwKSwlZWJwCisJbW92bAklcjEzZCwlZWF4CisJbW92bAklZWR4LDQ0KCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAk1NiglcnNwKSwlZWJwCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTE2KCVyc3ApLCVlYnAKKwlsZWFsCTE4NTk3NzUzOTMoJXJkeCwlcjExLDEpLCVyMTFkCisJeG9ybAklZXNpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMWQKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVheCwlcjExZAorCXJvbGwJJDEsJWVicAorCXhvcmwJNTIoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVlYnAsNDgoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTYwKCVyc3ApLCVyMTRkCisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTIwKCVyc3ApLCVyMTRkCisJbGVhbAkxODU5Nzc1MzkzKCVyYnAsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJNTYoJXJzcCksJWVkeAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJXIxNGQsNTIoJXJzcCkKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJMCglcnNwKSwlZWR4CisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkyNCglcnNwKSwlZWR4CisJbGVhbAkxODU5Nzc1MzkzKCVyMTQsJXJzaSwxKSwlZXNpCisJeG9ybAklcjEyZCwlZWF4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVheCwlZXNpCisJcm9sbAkkMSwlZWR4CisJeG9ybAk2MCglcnNwKSwlZWJwCisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVlZHgsNTYoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJNCglcnNwKSwlZWJwCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkyOCglcnNwKSwlZWJwCisJbGVhbAkxODU5Nzc1MzkzKCVyZHgsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVheAorCWFkZGwJJWVjeCwlcjEzZAorCXJvbGwJJDMwLCVlZGkKKwlhZGRsCSVlYXgsJXIxM2QKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTAoJXJzcCksJXIxNGQKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVicCw2MCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJOCglcnNwKSwlcjE0ZAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMzIoJXJzcCksJXIxNGQKKwlsZWFsCTE4NTk3NzUzOTMoJXJicCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJNCglcnNwKSwlZWR4CisJbW92bAklcjEzZCwlZWF4CisJbW92bAklcjE0ZCwwKCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAkxMiglcnNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTM2KCVyc3ApLCVlZHgKKwlsZWFsCTE4NTk3NzUzOTMoJXIxNCwlcjExLDEpLCVyMTFkCisJeG9ybAklZXNpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMWQKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVheCwlcjExZAorCXJvbGwJJDEsJWVkeAorCXhvcmwJOCglcnNwKSwlZWJwCisJbW92bAklcjEyZCwlZWF4CisJbW92bAklZWR4LDQoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTE2KCVyc3ApLCVlYnAKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNDAoJXJzcCksJWVicAorCWxlYWwJMTg1OTc3NTM5MyglcmR4LCVyZGksMSksJWVkaQorCXhvcmwJJXIxM2QsJWVheAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYXgsJWVkaQorCXJvbGwJJDEsJWVicAorCXhvcmwJMTIoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVlYnAsOCglcnNwKQorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAkyMCglcnNwKSwlcjE0ZAorCXhvcmwJJXIxM2QsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNDQoJXJzcCksJXIxNGQKKwlsZWFsCTE4NTk3NzUzOTMoJXJicCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAkxNiglcnNwKSwlZWR4CisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVyMTRkLDEyKCVyc3ApCisJbW92bAklZXNpLCVlY3gKKwl4b3JsCTI0KCVyc3ApLCVlZHgKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTQ4KCVyc3ApLCVlZHgKKwlsZWFsCTE4NTk3NzUzOTMoJXIxNCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWF4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJWVkeAorCXhvcmwJMjAoJXJzcCksJWVicAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWR4LDE2KCVyc3ApCisJbW92bAklcjEzZCwlZWN4CisJeG9ybAkyOCglcnNwKSwlZWJwCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk1MiglcnNwKSwlZWJwCisJbGVhbAkxODU5Nzc1MzkzKCVyZHgsJXIxMiwxKSwlcjEyZAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVheCwlcjEyZAorCXJvbGwJJDEsJWVicAorCXhvcmwJMjQoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVlYnAsMjAoJXJzcCkKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTMyKCVyc3ApLCVyMTRkCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTU2KCVyc3ApLCVyMTRkCisJbGVhbAkxODU5Nzc1MzkzKCVyYnAsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWF4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYXgsJXIxMWQKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAkyOCglcnNwKSwlZWR4CisJbW92bAklcjEyZCwlZWF4CisJbW92bAklcjE0ZCwyNCglcnNwKQorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJMzYoJXJzcCksJWVkeAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk2MCglcnNwKSwlZWR4CisJbGVhbAkxODU5Nzc1MzkzKCVyMTQsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlZWR4CisJeG9ybAkzMiglcnNwKSwlZWJwCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWR4LDI4KCVyc3ApCisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTQwKCVyc3ApLCVlYnAKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTAoJXJzcCksJWVicAorCWxlYWwJMTg1OTc3NTM5MyglcmR4LCVyc2ksMSksJWVzaQorCXhvcmwJJXIxMmQsJWVheAorCWFkZGwJJWVjeCwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYXgsJWVzaQorCXJvbGwJJDEsJWVicAorCXhvcmwJMzYoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVlYnAsMzIoJXJzcCkKKwltb3ZsCSVyMTJkLCVlYngKKwl4b3JsCTQ0KCVyc3ApLCVyMTRkCisJYW5kbAklcjExZCwlZWF4CisJbW92bAklZXNpLCVlY3gKKwl4b3JsCTQoJXJzcCksJXIxNGQKKwlsZWFsCS0xODk0MDA3NTg4KCVyYnAsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJXIxNGQKKwlhbmRsCSVlZGksJWVieAorCWFkZGwJJWVjeCwlcjEzZAorCXJvbGwJJDMwLCVlZGkKKwlhZGRsCSVlYngsJXIxM2QKKwl4b3JsCTQwKCVyc3ApLCVlZHgKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVyMTRkLDM2KCVyc3ApCisJbW92bAklcjExZCwlZWJ4CisJeG9ybAk0OCglcnNwKSwlZWR4CisJYW5kbAklZWRpLCVlYXgKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTgoJXJzcCksJWVkeAorCWxlYWwJLTE4OTQwMDc1ODgoJXIxNCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJXIxMmQKKwlyb2xsCSQxLCVlZHgKKwlhbmRsCSVlc2ksJWVieAorCWFkZGwJJWVjeCwlcjEyZAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYngsJXIxMmQKKwl4b3JsCTQ0KCVyc3ApLCVlYnAKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJWVkeCw0MCglcnNwKQorCW1vdmwJJWVkaSwlZWJ4CisJeG9ybAk1MiglcnNwKSwlZWJwCisJYW5kbAklZXNpLCVlYXgKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTEyKCVyc3ApLCVlYnAKKwlsZWFsCS0xODk0MDA3NTg4KCVyZHgsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWJwCisJYW5kbAklcjEzZCwlZWJ4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYngsJXIxMWQKKwl4b3JsCTQ4KCVyc3ApLCVyMTRkCisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlYnAsNDQoJXJzcCkKKwltb3ZsCSVlc2ksJWVieAorCXhvcmwJNTYoJXJzcCksJXIxNGQKKwlhbmRsCSVyMTNkLCVlYXgKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTE2KCVyc3ApLCVyMTRkCisJbGVhbAktMTg5NDAwNzU4OCglcmJwLCVyZGksMSksJWVkaQorCXhvcmwJJXIxM2QsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlcjE0ZAorCWFuZGwJJXIxMmQsJWVieAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYngsJWVkaQorCXhvcmwJNTIoJXJzcCksJWVkeAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJXIxNGQsNDgoJXJzcCkKKwltb3ZsCSVyMTNkLCVlYngKKwl4b3JsCTYwKCVyc3ApLCVlZHgKKwlhbmRsCSVyMTJkLCVlYXgKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJMjAoJXJzcCksJWVkeAorCWxlYWwJLTE4OTQwMDc1ODgoJXIxNCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJWVzaQorCXJvbGwJJDEsJWVkeAorCWFuZGwJJXIxMWQsJWVieAorCWFkZGwJJWVjeCwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYngsJWVzaQorCXhvcmwJNTYoJXJzcCksJWVicAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJWVkeCw1MiglcnNwKQorCW1vdmwJJXIxMmQsJWVieAorCXhvcmwJMCglcnNwKSwlZWJwCisJYW5kbAklcjExZCwlZWF4CisJbW92bAklZXNpLCVlY3gKKwl4b3JsCTI0KCVyc3ApLCVlYnAKKwlsZWFsCS0xODk0MDA3NTg4KCVyZHgsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJWVicAorCWFuZGwJJWVkaSwlZWJ4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVieCwlcjEzZAorCXhvcmwJNjAoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVlYnAsNTYoJXJzcCkKKwltb3ZsCSVyMTFkLCVlYngKKwl4b3JsCTQoJXJzcCksJXIxNGQKKwlhbmRsCSVlZGksJWVheAorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJMjgoJXJzcCksJXIxNGQKKwlsZWFsCS0xODk0MDA3NTg4KCVyYnAsJXIxMiwxKSwlcjEyZAorCXhvcmwJJWVkaSwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlcjE0ZAorCWFuZGwJJWVzaSwlZWJ4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVieCwlcjEyZAorCXhvcmwJMCglcnNwKSwlZWR4CisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVyMTRkLDYwKCVyc3ApCisJbW92bAklZWRpLCVlYngKKwl4b3JsCTgoJXJzcCksJWVkeAorCWFuZGwJJWVzaSwlZWF4CisJbW92bAklcjEyZCwlZWN4CisJeG9ybAkzMiglcnNwKSwlZWR4CisJbGVhbAktMTg5NDAwNzU4OCglcjE0LCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjExZAorCXJvbGwJJDEsJWVkeAorCWFuZGwJJXIxM2QsJWVieAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWJ4LCVyMTFkCisJeG9ybAk0KCVyc3ApLCVlYnAKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVkeCwwKCVyc3ApCisJbW92bAklZXNpLCVlYngKKwl4b3JsCTEyKCVyc3ApLCVlYnAKKwlhbmRsCSVyMTNkLCVlYXgKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTM2KCVyc3ApLCVlYnAKKwlsZWFsCS0xODk0MDA3NTg4KCVyZHgsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVlZGkKKwlyb2xsCSQxLCVlYnAKKwlhbmRsCSVyMTJkLCVlYngKKwlhZGRsCSVlY3gsJWVkaQorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWJ4LCVlZGkKKwl4b3JsCTgoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVlYnAsNCglcnNwKQorCW1vdmwJJXIxM2QsJWVieAorCXhvcmwJMTYoJXJzcCksJXIxNGQKKwlhbmRsCSVyMTJkLCVlYXgKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJNDAoJXJzcCksJXIxNGQKKwlsZWFsCS0xODk0MDA3NTg4KCVyYnAsJXJzaSwxKSwlZXNpCisJeG9ybAklcjEyZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVyMTRkCisJYW5kbAklcjExZCwlZWJ4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVieCwlZXNpCisJeG9ybAkxMiglcnNwKSwlZWR4CisJbW92bAklcjEyZCwlZWF4CisJbW92bAklcjE0ZCw4KCVyc3ApCisJbW92bAklcjEyZCwlZWJ4CisJeG9ybAkyMCglcnNwKSwlZWR4CisJYW5kbAklcjExZCwlZWF4CisJbW92bAklZXNpLCVlY3gKKwl4b3JsCTQ0KCVyc3ApLCVlZHgKKwlsZWFsCS0xODk0MDA3NTg4KCVyMTQsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJWVkeAorCWFuZGwJJWVkaSwlZWJ4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVieCwlcjEzZAorCXhvcmwJMTYoJXJzcCksJWVicAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJWVkeCwxMiglcnNwKQorCW1vdmwJJXIxMWQsJWVieAorCXhvcmwJMjQoJXJzcCksJWVicAorCWFuZGwJJWVkaSwlZWF4CisJbW92bAklcjEzZCwlZWN4CisJeG9ybAk0OCglcnNwKSwlZWJwCisJbGVhbAktMTg5NDAwNzU4OCglcmR4LCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjEyZAorCXJvbGwJJDEsJWVicAorCWFuZGwJJWVzaSwlZWJ4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVieCwlcjEyZAorCXhvcmwJMjAoJXJzcCksJXIxNGQKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJWVicCwxNiglcnNwKQorCW1vdmwJJWVkaSwlZWJ4CisJeG9ybAkyOCglcnNwKSwlcjE0ZAorCWFuZGwJJWVzaSwlZWF4CisJbW92bAklcjEyZCwlZWN4CisJeG9ybAk1MiglcnNwKSwlcjE0ZAorCWxlYWwJLTE4OTQwMDc1ODgoJXJicCwlcjExLDEpLCVyMTFkCisJeG9ybAklZXNpLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJXIxMWQKKwlyb2xsCSQxLCVyMTRkCisJYW5kbAklcjEzZCwlZWJ4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYngsJXIxMWQKKwl4b3JsCTI0KCVyc3ApLCVlZHgKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJXIxNGQsMjAoJXJzcCkKKwltb3ZsCSVlc2ksJWVieAorCXhvcmwJMzIoJXJzcCksJWVkeAorCWFuZGwJJXIxM2QsJWVheAorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJNTYoJXJzcCksJWVkeAorCWxlYWwJLTE4OTQwMDc1ODgoJXIxNCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJWVkaQorCXJvbGwJJDEsJWVkeAorCWFuZGwJJXIxMmQsJWVieAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYngsJWVkaQorCXhvcmwJMjgoJXJzcCksJWVicAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJWVkeCwyNCglcnNwKQorCW1vdmwJJXIxM2QsJWVieAorCXhvcmwJMzYoJXJzcCksJWVicAorCWFuZGwJJXIxMmQsJWVheAorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAk2MCglcnNwKSwlZWJwCisJbGVhbAktMTg5NDAwNzU4OCglcmR4LCVyc2ksMSksJWVzaQorCXhvcmwJJXIxMmQsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlZXNpCisJcm9sbAkkMSwlZWJwCisJYW5kbAklcjExZCwlZWJ4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVieCwlZXNpCisJeG9ybAkzMiglcnNwKSwlcjE0ZAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJWVicCwyOCglcnNwKQorCW1vdmwJJXIxMmQsJWVieAorCXhvcmwJNDAoJXJzcCksJXIxNGQKKwlhbmRsCSVyMTFkLCVlYXgKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJMCglcnNwKSwlcjE0ZAorCWxlYWwJLTE4OTQwMDc1ODgoJXJicCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlcjE0ZAorCWFuZGwJJWVkaSwlZWJ4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVieCwlcjEzZAorCXhvcmwJMzYoJXJzcCksJWVkeAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJXIxNGQsMzIoJXJzcCkKKwltb3ZsCSVyMTFkLCVlYngKKwl4b3JsCTQ0KCVyc3ApLCVlZHgKKwlhbmRsCSVlZGksJWVheAorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJNCglcnNwKSwlZWR4CisJbGVhbAktMTg5NDAwNzU4OCglcjE0LCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjEyZAorCXJvbGwJJDEsJWVkeAorCWFuZGwJJWVzaSwlZWJ4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVieCwlcjEyZAorCXhvcmwJNDAoJXJzcCksJWVicAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWR4LDM2KCVyc3ApCisJbW92bAklZWRpLCVlYngKKwl4b3JsCTQ4KCVyc3ApLCVlYnAKKwlhbmRsCSVlc2ksJWVheAorCW1vdmwJJXIxMmQsJWVjeAorCXhvcmwJOCglcnNwKSwlZWJwCisJbGVhbAktMTg5NDAwNzU4OCglcmR4LCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjExZAorCXJvbGwJJDEsJWVicAorCWFuZGwJJXIxM2QsJWVieAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWJ4LCVyMTFkCisJeG9ybAk0NCglcnNwKSwlcjE0ZAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWJwLDQwKCVyc3ApCisJbW92bAklZXNpLCVlYngKKwl4b3JsCTUyKCVyc3ApLCVyMTRkCisJYW5kbAklcjEzZCwlZWF4CisJbW92bAklcjExZCwlZWN4CisJeG9ybAkxMiglcnNwKSwlcjE0ZAorCWxlYWwJLTE4OTQwMDc1ODgoJXJicCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJWVkaQorCXJvbGwJJDEsJXIxNGQKKwlhbmRsCSVyMTJkLCVlYngKKwlhZGRsCSVlY3gsJWVkaQorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWJ4LCVlZGkKKwl4b3JsCTQ4KCVyc3ApLCVlZHgKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVyMTRkLDQ0KCVyc3ApCisJbW92bAklcjEzZCwlZWJ4CisJeG9ybAk1NiglcnNwKSwlZWR4CisJYW5kbAklcjEyZCwlZWF4CisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTE2KCVyc3ApLCVlZHgKKwlsZWFsCS0xODk0MDA3NTg4KCVyMTQsJXJzaSwxKSwlZXNpCisJeG9ybAklcjEyZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVlZHgKKwlhbmRsCSVyMTFkLCVlYngKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWJ4LCVlc2kKKwl4b3JsCTUyKCVyc3ApLCVlYnAKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJWVkeCw0OCglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAk2MCglcnNwKSwlZWJwCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkyMCglcnNwKSwlZWJwCisJbGVhbAktODk5NDk3NTE0KCVyZHgsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVheAorCWFkZGwJJWVjeCwlcjEzZAorCXJvbGwJJDMwLCVlZGkKKwlhZGRsCSVlYXgsJXIxM2QKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTU2KCVyc3ApLCVyMTRkCisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlYnAsNTIoJXJzcCkKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTAoJXJzcCksJXIxNGQKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTI0KCVyc3ApLCVyMTRkCisJbGVhbAktODk5NDk3NTE0KCVyYnAsJXIxMiwxKSwlcjEyZAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVheCwlcjEyZAorCXJvbGwJJDEsJXIxNGQKKwl4b3JsCTYwKCVyc3ApLCVlZHgKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVyMTRkLDU2KCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAk0KCVyc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMjgoJXJzcCksJWVkeAorCWxlYWwJLTg5OTQ5NzUxNCglcjE0LCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWR4CisJeG9ybAkwKCVyc3ApLCVlYnAKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVlZHgsNjAoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTgoJXJzcCksJWVicAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkzMiglcnNwKSwlZWJwCisJbGVhbAktODk5NDk3NTE0KCVyZHgsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlZWJwCisJeG9ybAk0KCVyc3ApLCVyMTRkCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWJwLDAoJXJzcCkKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJMTIoJXJzcCksJXIxNGQKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTM2KCVyc3ApLCVyMTRkCisJbGVhbAktODk5NDk3NTE0KCVyYnAsJXJzaSwxKSwlZXNpCisJeG9ybAklcjEyZCwlZWF4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVheCwlZXNpCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJOCglcnNwKSwlZWR4CisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVyMTRkLDQoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJMTYoJXJzcCksJWVkeAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNDAoJXJzcCksJWVkeAorCWxlYWwJLTg5OTQ5NzUxNCglcjE0LCVyMTMsMSksJXIxM2QKKwl4b3JsCSVyMTFkLCVlYXgKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlZWR4CisJeG9ybAkxMiglcnNwKSwlZWJwCisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlZHgsOCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJMjAoJXJzcCksJWVicAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNDQoJXJzcCksJWVicAorCWxlYWwJLTg5OTQ5NzUxNCglcmR4LCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJJWVjeCwlcjEyZAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYXgsJXIxMmQKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTE2KCVyc3ApLCVyMTRkCisJbW92bAklcjEzZCwlZWF4CisJbW92bAklZWJwLDEyKCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAkyNCglcnNwKSwlcjE0ZAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0OCglcnNwKSwlcjE0ZAorCWxlYWwJLTg5OTQ5NzUxNCglcmJwLCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJMjAoJXJzcCksJWVkeAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJXIxNGQsMTYoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTI4KCVyc3ApLCVlZHgKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNTIoJXJzcCksJWVkeAorCWxlYWwJLTg5OTQ5NzUxNCglcjE0LCVyZGksMSksJWVkaQorCXhvcmwJJXIxM2QsJWVheAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYXgsJWVkaQorCXJvbGwJJDEsJWVkeAorCXhvcmwJMjQoJXJzcCksJWVicAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJWVkeCwyMCglcnNwKQorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAkzMiglcnNwKSwlZWJwCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk1NiglcnNwKSwlZWJwCisJbGVhbAktODk5NDk3NTE0KCVyZHgsJXJzaSwxKSwlZXNpCisJeG9ybAklcjEyZCwlZWF4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVheCwlZXNpCisJcm9sbAkkMSwlZWJwCisJeG9ybAkyOCglcnNwKSwlcjE0ZAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWJwLDI0KCVyc3ApCisJbW92bAklZXNpLCVlY3gKKwl4b3JsCTM2KCVyc3ApLCVyMTRkCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk2MCglcnNwKSwlcjE0ZAorCWxlYWwJLTg5OTQ5NzUxNCglcmJwLCVyMTMsMSksJXIxM2QKKwl4b3JsCSVyMTFkLCVlYXgKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJMzIoJXJzcCksJWVkeAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklcjE0ZCwyOCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJNDAoJXJzcCksJWVkeAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMCglcnNwKSwlZWR4CisJbGVhbAktODk5NDk3NTE0KCVyMTQsJXIxMiwxKSwlcjEyZAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVheCwlcjEyZAorCXJvbGwJJDEsJWVkeAorCXhvcmwJMzYoJXJzcCksJWVicAorCW1vdmwJJXIxM2QsJWVheAorCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAk0NCglcnNwKSwlZWJwCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTQoJXJzcCksJWVicAorCWxlYWwJLTg5OTQ5NzUxNCglcmR4LCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWJwCisJeG9ybAk0MCglcnNwKSwlcjE0ZAorCW1vdmwJJXIxMmQsJWVheAorCisJbW92bAklcjExZCwlZWN4CisJeG9ybAk0OCglcnNwKSwlcjE0ZAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk4KCVyc3ApLCVyMTRkCisJbGVhbAktODk5NDk3NTE0KCVyYnAsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJNDQoJXJzcCksJWVkeAorCW1vdmwJJXIxMWQsJWVheAorCisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTUyKCVyc3ApLCVlZHgKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTEyKCVyc3ApLCVlZHgKKwlsZWFsCS04OTk0OTc1MTQoJXIxNCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTQ4KCVyc3ApLCVlYnAKKwltb3ZsCSVlZGksJWVheAorCisJbW92bAklZXNpLCVlY3gKKwl4b3JsCTU2KCVyc3ApLCVlYnAKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTE2KCVyc3ApLCVlYnAKKwlsZWFsCS04OTk0OTc1MTQoJXJkeCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWF4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJWVicAorCXhvcmwJNTIoJXJzcCksJXIxNGQKKwltb3ZsCSVlc2ksJWVheAorCisJbW92bAklcjEzZCwlZWN4CisJeG9ybAk2MCglcnNwKSwlcjE0ZAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMjAoJXJzcCksJXIxNGQKKwlsZWFsCS04OTk0OTc1MTQoJXJicCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJNTYoJXJzcCksJWVkeAorCW1vdmwJJXIxM2QsJWVheAorCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAkwKCVyc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMjQoJXJzcCksJWVkeAorCWxlYWwJLTg5OTQ5NzUxNCglcjE0LCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWR4CisJeG9ybAk2MCglcnNwKSwlZWJwCisJbW92bAklcjEyZCwlZWF4CisKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTQoJXJzcCksJWVicAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkyOCglcnNwKSwlZWJwCisJbGVhbAktODk5NDk3NTE0KCVyZHgsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlZWJwCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWRpLCVlY3gKKwl4b3JsCSVyMTNkLCVlYXgKKwlsZWFsCS04OTk0OTc1MTQoJXJicCwlcnNpLDEpLCVlc2kKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCSVyMTJkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwlhZGRsCTAoJXI4KSwlZXNpCisJYWRkbAk0KCVyOCksJWVkaQorCWFkZGwJOCglcjgpLCVyMTFkCisJYWRkbAkxMiglcjgpLCVyMTJkCisJYWRkbAkxNiglcjgpLCVyMTNkCisJbW92bAklZXNpLDAoJXI4KQorCW1vdmwJJWVkaSw0KCVyOCkKKwltb3ZsCSVyMTFkLDgoJXI4KQorCW1vdmwJJXIxMmQsMTIoJXI4KQorCW1vdmwJJXIxM2QsMTYoJXI4KQorCisJc3VicQkkMSwlcjEwCisJbGVhcQk2NCglcjkpLCVyOQorCWpuegkuTGxvb3AKKworCW1vdnEJNjQoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGVwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyLC4tc2hhMV9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMzoKK19zc3NlM19zaG9ydGN1dDoKKy5jZmlfc3RhcnRwcm9jCQorCW1vdnEJJXJzcCwlcjExCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXIxMQorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlsZWFxCS02NCglcnNwKSwlcnNwCisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZGksJXI4CisJbW92cQklcnNpLCVyOQorCW1vdnEJJXJkeCwlcjEwCisKKwlzaGxxCSQ2LCVyMTAKKwlhZGRxCSVyOSwlcjEwCisJbGVhcQlLX1hYX1hYKzY0KCVyaXApLCVyMTQKKworCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92bAklZWJ4LCVlc2kKKwltb3ZsCTE2KCVyOCksJWVicAorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlZGkKKwlhbmRsCSVlZGksJWVzaQorCisJbW92ZHFhCTY0KCVyMTQpLCV4bW02CisJbW92ZHFhCS02NCglcjE0KSwleG1tOQorCW1vdmRxdQkwKCVyOSksJXhtbTAKKwltb3ZkcXUJMTYoJXI5KSwleG1tMQorCW1vdmRxdQkzMiglcjkpLCV4bW0yCisJbW92ZHF1CTQ4KCVyOSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA2CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTQKKwlhZGRxCSQ2NCwlcjkKKwlwYWRkZAkleG1tOSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJJXhtbTksJXhtbTEKKwlwYWRkZAkleG1tOSwleG1tMgorCW1vdmRxYQkleG1tMCwwKCVyc3ApCisJcHN1YmQJJXhtbTksJXhtbTAKKwltb3ZkcWEJJXhtbTEsMTYoJXJzcCkKKwlwc3ViZAkleG1tOSwleG1tMQorCW1vdmRxYQkleG1tMiwzMiglcnNwKQorCXBzdWJkCSV4bW05LCV4bW0yCisJam1wCS5Mb29wX3Nzc2UzCisuYWxpZ24JMTYKKy5Mb29wX3Nzc2UzOgorCXJvcmwJJDIsJWVieAorCXBzaHVmZAkkMjM4LCV4bW0wLCV4bW00CisJeG9ybAklZWR4LCVlc2kKKwltb3ZkcWEJJXhtbTMsJXhtbTgKKwlwYWRkZAkleG1tMywleG1tOQorCW1vdmwJJWVheCwlZWRpCisJYWRkbAkwKCVyc3ApLCVlYnAKKwlwdW5wY2tscWRxCSV4bW0xLCV4bW00CisJeG9ybAklZWN4LCVlYngKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXBzcmxkcQkkNCwleG1tOAorCWFuZGwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlweG9yCSV4bW0wLCV4bW00CisJYWRkbAklZWF4LCVlYnAKKwlyb3JsCSQ3LCVlYXgKKwlweG9yCSV4bW0yLCV4bW04CisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJNCglcnNwKSwlZWR4CisJcHhvcgkleG1tOCwleG1tNAorCXhvcmwJJWVieCwlZWF4CisJcm9sbAkkNSwlZWJwCisJbW92ZHFhCSV4bW05LDQ4KCVyc3ApCisJYWRkbAklZWRpLCVlZHgKKwlhbmRsCSVlYXgsJWVzaQorCW1vdmRxYQkleG1tNCwleG1tMTAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkNywlZWJwCisJbW92ZHFhCSV4bW00LCV4bW04CisJeG9ybAklZWJ4LCVlc2kKKwlwc2xsZHEJJDEyLCV4bW0xMAorCXBhZGRkCSV4bW00LCV4bW00CisJbW92bAklZWR4LCVlZGkKKwlhZGRsCTgoJXJzcCksJWVjeAorCXBzcmxkCSQzMSwleG1tOAorCXhvcmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwltb3ZkcWEJJXhtbTEwLCV4bW05CisJYW5kbAklZWJwLCVlZGkKKwl4b3JsCSVlYXgsJWVicAorCXBzcmxkCSQzMCwleG1tMTAKKwlhZGRsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVkeAorCXBvcgkleG1tOCwleG1tNAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlhZGRsCTEyKCVyc3ApLCVlYngKKwlwc2xsZAkkMiwleG1tOQorCXB4b3IJJXhtbTEwLCV4bW00CisJeG9ybAklZWJwLCVlZHgKKwltb3ZkcWEJLTY0KCVyMTQpLCV4bW0xMAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJYW5kbAklZWR4LCVlc2kKKwlweG9yCSV4bW05LCV4bW00CisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVjeAorCXBzaHVmZAkkMjM4LCV4bW0xLCV4bW01CisJeG9ybAklZWJwLCVlc2kKKwltb3ZkcWEJJXhtbTQsJXhtbTkKKwlwYWRkZAkleG1tNCwleG1tMTAKKwltb3ZsCSVlYngsJWVkaQorCWFkZGwJMTYoJXJzcCksJWVheAorCXB1bnBja2xxZHEJJXhtbTIsJXhtbTUKKwl4b3JsCSVlZHgsJWVjeAorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJcHNybGRxCSQ0LCV4bW05CisJYW5kbAklZWN4LCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCXB4b3IJJXhtbTEsJXhtbTUKKwlhZGRsCSVlYngsJWVheAorCXJvcmwJJDcsJWVieAorCXB4b3IJJXhtbTMsJXhtbTkKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVheCwlZXNpCisJYWRkbAkyMCglcnNwKSwlZWJwCisJcHhvcgkleG1tOSwleG1tNQorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkNSwlZWF4CisJbW92ZHFhCSV4bW0xMCwwKCVyc3ApCisJYWRkbAklZWRpLCVlYnAKKwlhbmRsCSVlYngsJWVzaQorCW1vdmRxYQkleG1tNSwleG1tOAorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlyb3JsCSQ3LCVlYXgKKwltb3ZkcWEJJXhtbTUsJXhtbTkKKwl4b3JsCSVlY3gsJWVzaQorCXBzbGxkcQkkMTIsJXhtbTgKKwlwYWRkZAkleG1tNSwleG1tNQorCW1vdmwJJWVicCwlZWRpCisJYWRkbAkyNCglcnNwKSwlZWR4CisJcHNybGQJJDMxLCV4bW05CisJeG9ybAklZWJ4LCVlYXgKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCW1vdmRxYQkleG1tOCwleG1tMTAKKwlhbmRsCSVlYXgsJWVkaQorCXhvcmwJJWVieCwlZWF4CisJcHNybGQJJDMwLCV4bW04CisJYWRkbAklZWJwLCVlZHgKKwlyb3JsCSQ3LCVlYnAKKwlwb3IJJXhtbTksJXhtbTUKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJYWRkbAkyOCglcnNwKSwlZWN4CisJcHNsbGQJJDIsJXhtbTEwCisJcHhvcgkleG1tOCwleG1tNQorCXhvcmwJJWVheCwlZWJwCisJbW92ZHFhCS0zMiglcjE0KSwleG1tOAorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVkaSwlZWN4CisJYW5kbAklZWJwLCVlc2kKKwlweG9yCSV4bW0xMCwleG1tNQorCXhvcmwJJWVheCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlZHgKKwlwc2h1ZmQJJDIzOCwleG1tMiwleG1tNgorCXhvcmwJJWVheCwlZXNpCisJbW92ZHFhCSV4bW01LCV4bW0xMAorCXBhZGRkCSV4bW01LCV4bW04CisJbW92bAklZWN4LCVlZGkKKwlhZGRsCTMyKCVyc3ApLCVlYngKKwlwdW5wY2tscWRxCSV4bW0zLCV4bW02CisJeG9ybAklZWJwLCVlZHgKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXBzcmxkcQkkNCwleG1tMTAKKwlhbmRsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJcHhvcgkleG1tMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJcm9ybAkkNywlZWN4CisJcHhvcgkleG1tNCwleG1tMTAKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJYWRkbAkzNiglcnNwKSwlZWF4CisJcHhvcgkleG1tMTAsJXhtbTYKKwl4b3JsCSVlZHgsJWVjeAorCXJvbGwJJDUsJWVieAorCW1vdmRxYQkleG1tOCwxNiglcnNwKQorCWFkZGwJJWVkaSwlZWF4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZkcWEJJXhtbTYsJXhtbTkKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJcm9ybAkkNywlZWJ4CisJbW92ZHFhCSV4bW02LCV4bW0xMAorCXhvcmwJJWVkeCwlZXNpCisJcHNsbGRxCSQxMiwleG1tOQorCXBhZGRkCSV4bW02LCV4bW02CisJbW92bAklZWF4LCVlZGkKKwlhZGRsCTQwKCVyc3ApLCVlYnAKKwlwc3JsZAkkMzEsJXhtbTEwCisJeG9ybAklZWN4LCVlYngKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCW1vdmRxYQkleG1tOSwleG1tOAorCWFuZGwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlwc3JsZAkkMzAsJXhtbTkKKwlhZGRsCSVlYXgsJWVicAorCXJvcmwJJDcsJWVheAorCXBvcgkleG1tMTAsJXhtbTYKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJYWRkbAk0NCglcnNwKSwlZWR4CisJcHNsbGQJJDIsJXhtbTgKKwlweG9yCSV4bW05LCV4bW02CisJeG9ybAklZWJ4LCVlYXgKKwltb3ZkcWEJLTMyKCVyMTQpLCV4bW05CisJcm9sbAkkNSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwlhbmRsCSVlYXgsJWVzaQorCXB4b3IJJXhtbTgsJXhtbTYKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkNywlZWJwCisJcHNodWZkCSQyMzgsJXhtbTMsJXhtbTcKKwl4b3JsCSVlYngsJWVzaQorCW1vdmRxYQkleG1tNiwleG1tOAorCXBhZGRkCSV4bW02LCV4bW05CisJbW92bAklZWR4LCVlZGkKKwlhZGRsCTQ4KCVyc3ApLCVlY3gKKwlwdW5wY2tscWRxCSV4bW00LCV4bW03CisJeG9ybAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXBzcmxkcQkkNCwleG1tOAorCWFuZGwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlweG9yCSV4bW0zLCV4bW03CisJYWRkbAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlZHgKKwlweG9yCSV4bW01LCV4bW04CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCWFkZGwJNTIoJXJzcCksJWVieAorCXB4b3IJJXhtbTgsJXhtbTcKKwl4b3JsCSVlYnAsJWVkeAorCXJvbGwJJDUsJWVjeAorCW1vdmRxYQkleG1tOSwzMiglcnNwKQorCWFkZGwJJWVkaSwlZWJ4CisJYW5kbAklZWR4LCVlc2kKKwltb3ZkcWEJJXhtbTcsJXhtbTEwCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVjeAorCW1vdmRxYQkleG1tNywleG1tOAorCXhvcmwJJWVicCwlZXNpCisJcHNsbGRxCSQxMiwleG1tMTAKKwlwYWRkZAkleG1tNywleG1tNworCW1vdmwJJWVieCwlZWRpCisJYWRkbAk1NiglcnNwKSwlZWF4CisJcHNybGQJJDMxLCV4bW04CisJeG9ybAklZWR4LCVlY3gKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCW1vdmRxYQkleG1tMTAsJXhtbTkKKwlhbmRsCSVlY3gsJWVkaQorCXhvcmwJJWVkeCwlZWN4CisJcHNybGQJJDMwLCV4bW0xMAorCWFkZGwJJWVieCwlZWF4CisJcm9ybAkkNywlZWJ4CisJcG9yCSV4bW04LCV4bW03CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCWFkZGwJNjAoJXJzcCksJWVicAorCXBzbGxkCSQyLCV4bW05CisJcHhvcgkleG1tMTAsJXhtbTcKKwl4b3JsCSVlY3gsJWVieAorCW1vdmRxYQktMzIoJXIxNCksJXhtbTEwCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwlhbmRsCSVlYngsJWVzaQorCXB4b3IJJXhtbTksJXhtbTcKKwlwc2h1ZmQJJDIzOCwleG1tNiwleG1tOQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlyb3JsCSQ3LCVlYXgKKwlweG9yCSV4bW00LCV4bW0wCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorCWFkZGwJMCglcnNwKSwlZWR4CisJcHVucGNrbHFkcQkleG1tNywleG1tOQorCXhvcmwJJWVieCwlZWF4CisJcm9sbAkkNSwlZWJwCisJcHhvcgkleG1tMSwleG1tMAorCWFkZGwJJWVzaSwlZWR4CisJYW5kbAklZWF4LCVlZGkKKwltb3ZkcWEJJXhtbTEwLCV4bW04CisJeG9ybAklZWJ4LCVlYXgKKwlwYWRkZAkleG1tNywleG1tMTAKKwlhZGRsCSVlYnAsJWVkeAorCXB4b3IJJXhtbTksJXhtbTAKKwlyb3JsCSQ3LCVlYnAKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJYWRkbAk0KCVyc3ApLCVlY3gKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwl4b3JsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVkeAorCW1vdmRxYQkleG1tMTAsNDgoJXJzcCkKKwlhZGRsCSVlZGksJWVjeAorCWFuZGwJJWVicCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlwc2xsZAkkMiwleG1tMAorCWFkZGwJJWVkeCwlZWN4CisJcm9ybAkkNywlZWR4CisJcHNybGQJJDMwLCV4bW05CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCWFkZGwJOCglcnNwKSwlZWJ4CisJcG9yCSV4bW05LCV4bW0wCisJeG9ybAklZWJwLCVlZHgKKwlyb2xsCSQ1LCVlY3gKKwlwc2h1ZmQJJDIzOCwleG1tNywleG1tMTAKKwlhZGRsCSVlc2ksJWVieAorCWFuZGwJJWVkeCwlZWRpCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMTIoJXJzcCksJWVheAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlweG9yCSV4bW01LCV4bW0xCisJYWRkbAkxNiglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlwdW5wY2tscWRxCSV4bW0wLCV4bW0xMAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWF4CisJcHhvcgkleG1tMiwleG1tMQorCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwlyb3JsCSQ3LCVlYngKKwlwYWRkZAkleG1tMCwleG1tOAorCWFkZGwJJWVheCwlZWJwCisJcHhvcgkleG1tMTAsJXhtbTEKKwlhZGRsCTIwKCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJcm9sbAkkNSwlZWJwCisJbW92ZHFhCSV4bW0xLCV4bW0xMAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZkcWEJJXhtbTgsMCglcnNwKQorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAkyNCglcnNwKSwlZWN4CisJcHNsbGQJJDIsJXhtbTEKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJcHNybGQJJDMwLCV4bW0xMAorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlYnAKKwlwb3IJJXhtbTEwLCV4bW0xCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTI4KCVyc3ApLCVlYngKKwlwc2h1ZmQJJDIzOCwleG1tMCwleG1tOAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlweG9yCSV4bW02LCV4bW0yCisJYWRkbAkzMiglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlwdW5wY2tscWRxCSV4bW0xLCV4bW04CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ1LCVlYngKKwlweG9yCSV4bW0zLCV4bW0yCisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmRxYQkwKCVyMTQpLCV4bW0xMAorCXJvcmwJJDcsJWVjeAorCXBhZGRkCSV4bW0xLCV4bW05CisJYWRkbAklZWJ4LCVlYXgKKwlweG9yCSV4bW04LCV4bW0yCisJYWRkbAkzNiglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvbGwJJDUsJWVheAorCW1vdmRxYQkleG1tMiwleG1tOAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwltb3ZkcWEJJXhtbTksMTYoJXJzcCkKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJNDAoJXJzcCksJWVkeAorCXBzbGxkCSQyLCV4bW0yCisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorCXBzcmxkCSQzMCwleG1tOAorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlyb3JsCSQ3LCVlYXgKKwlwb3IJJXhtbTgsJXhtbTIKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJNDQoJXJzcCksJWVjeAorCXBzaHVmZAkkMjM4LCV4bW0xLCV4bW05CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVkaSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlyb3JsCSQ3LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXB4b3IJJXhtbTcsJXhtbTMKKwlhZGRsCTQ4KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXB1bnBja2xxZHEJJXhtbTIsJXhtbTkKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDUsJWVjeAorCXB4b3IJJXhtbTQsJXhtbTMKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJbW92ZHFhCSV4bW0xMCwleG1tOAorCXJvcmwJJDcsJWVkeAorCXBhZGRkCSV4bW0yLCV4bW0xMAorCWFkZGwJJWVjeCwlZWJ4CisJcHhvcgkleG1tOSwleG1tMworCWFkZGwJNTIoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlYngKKwltb3ZkcWEJJXhtbTMsJXhtbTkKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92ZHFhCSV4bW0xMCwzMiglcnNwKQorCXJvcmwJJDcsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk1NiglcnNwKSwlZWJwCisJcHNsbGQJJDIsJXhtbTMKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWRpCisJcHNybGQJJDMwLCV4bW05CisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDcsJWVieAorCXBvcgkleG1tOSwleG1tMworCWFkZGwJJWVheCwlZWJwCisJYWRkbAk2MCglcnNwKSwlZWR4CisJcHNodWZkCSQyMzgsJXhtbTIsJXhtbTEwCisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXB4b3IJJXhtbTAsJXhtbTQKKwlhZGRsCTAoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJcHVucGNrbHFkcQkleG1tMywleG1tMTAKKwltb3ZsCSVlZHgsJWVkaQorCXJvbGwJJDUsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92ZHFhCSV4bW04LCV4bW05CisJcm9ybAkkNywlZWJwCisJcGFkZGQJJXhtbTMsJXhtbTgKKwlhZGRsCSVlZHgsJWVjeAorCXB4b3IJJXhtbTEwLCV4bW00CisJYWRkbAk0KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW0xMAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwltb3ZkcWEJJXhtbTgsNDgoJXJzcCkKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJOCglcnNwKSwlZWF4CisJcHNsbGQJJDIsJXhtbTQKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJcHNybGQJJDMwLCV4bW0xMAorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwlyb3JsCSQ3LCVlY3gKKwlwb3IJJXhtbTEwLCV4bW00CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTEyKCVyc3ApLCVlYnAKKwlwc2h1ZmQJJDIzOCwleG1tMywleG1tOAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlweG9yCSV4bW0xLCV4bW01CisJYWRkbAkxNiglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlwdW5wY2tscWRxCSV4bW00LCV4bW04CisJbW92bAklZWJwLCVlZGkKKwlyb2xsCSQ1LCVlYnAKKwlweG9yCSV4bW02LCV4bW01CisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmRxYQkleG1tOSwleG1tMTAKKwlyb3JsCSQ3LCVlYXgKKwlwYWRkZAkleG1tNCwleG1tOQorCWFkZGwJJWVicCwlZWR4CisJcHhvcgkleG1tOCwleG1tNQorCWFkZGwJMjAoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwlyb2xsCSQ1LCVlZHgKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92ZHFhCSV4bW05LDAoJXJzcCkKKwlyb3JsCSQ3LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJMjQoJXJzcCksJWVieAorCXBzbGxkCSQyLCV4bW01CisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXBzcmxkCSQzMCwleG1tOAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwlyb3JsCSQ3LCVlZHgKKwlwb3IJJXhtbTgsJXhtbTUKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMjgoJXJzcCksJWVheAorCXBzaHVmZAkkMjM4LCV4bW00LCV4bW05CisJcm9ybAkkNywlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVkaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJcHhvcgkleG1tMiwleG1tNgorCWFkZGwJMzIoJXJzcCksJWVicAorCWFuZGwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlYngKKwlwdW5wY2tscWRxCSV4bW01LCV4bW05CisJbW92bAklZWF4LCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXB4b3IJJXhtbTcsJXhtbTYKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCW1vdmRxYQkleG1tMTAsJXhtbTgKKwl4b3JsCSVlYngsJWVkaQorCXBhZGRkCSV4bW01LCV4bW0xMAorCXhvcmwJJWVjeCwlZWJ4CisJcHhvcgkleG1tOSwleG1tNgorCWFkZGwJJWVheCwlZWJwCisJYWRkbAkzNiglcnNwKSwlZWR4CisJYW5kbAklZWJ4LCVlZGkKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVheAorCW1vdmRxYQkleG1tNiwleG1tOQorCW1vdmwJJWVicCwlZXNpCisJeG9ybAklZWJ4LCVlZGkKKwltb3ZkcWEJJXhtbTEwLDE2KCVyc3ApCisJcm9sbAkkNSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXBzbGxkCSQyLCV4bW02CisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXBzcmxkCSQzMCwleG1tOQorCWFkZGwJNDAoJXJzcCksJWVjeAorCWFuZGwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlwb3IJJXhtbTksJXhtbTYKKwlyb3JsCSQ3LCVlYnAKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWR4CisJcHNodWZkCSQyMzgsJXhtbTUsJXhtbTEwCisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYnAsJWVkaQorCXhvcmwJJWVheCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTQ0KCVyc3ApLCVlYngKKwlhbmRsCSVlYnAsJWVkaQorCXhvcmwJJWVheCwlZWJwCisJcm9ybAkkNywlZWR4CisJbW92bAklZWN4LCVlc2kKKwl4b3JsCSVlYnAsJWVkaQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwl4b3JsCSVlYnAsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJcHhvcgkleG1tMywleG1tNworCWFkZGwJNDgoJXJzcCksJWVheAorCWFuZGwJJWVkeCwlZXNpCisJeG9ybAklZWJwLCVlZHgKKwlyb3JsCSQ3LCVlY3gKKwlwdW5wY2tscWRxCSV4bW02LCV4bW0xMAorCW1vdmwJJWVieCwlZWRpCisJeG9ybAklZWR4LCVlc2kKKwlweG9yCSV4bW0wLCV4bW03CisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZkcWEJMzIoJXIxNCksJXhtbTkKKwl4b3JsCSVlY3gsJWVkaQorCXBhZGRkCSV4bW02LCV4bW04CisJeG9ybAklZWR4LCVlY3gKKwlweG9yCSV4bW0xMCwleG1tNworCWFkZGwJJWVieCwlZWF4CisJYWRkbAk1MiglcnNwKSwlZWJwCisJYW5kbAklZWN4LCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVieAorCW1vdmRxYQkleG1tNywleG1tMTAKKwltb3ZsCSVlYXgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92ZHFhCSV4bW04LDMyKCVyc3ApCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXBzbGxkCSQyLCV4bW03CisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXBzcmxkCSQzMCwleG1tMTAKKwlhZGRsCTU2KCVyc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcG9yCSV4bW0xMCwleG1tNworCXJvcmwJJDcsJWVheAorCW1vdmwJJWVicCwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlYnAKKwlwc2h1ZmQJJDIzOCwleG1tNiwleG1tOAorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAk2MCglcnNwKSwlZWN4CisJYW5kbAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCXJvcmwJJDcsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWF4LCVlZGkKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVicCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXB4b3IJJXhtbTQsJXhtbTAKKwlhZGRsCTAoJXJzcCksJWVieAorCWFuZGwJJWVicCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlyb3JsCSQ3LCVlZHgKKwlwdW5wY2tscWRxCSV4bW03LCV4bW04CisJbW92bAklZWN4LCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCXB4b3IJJXhtbTEsJXhtbTAKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCW1vdmRxYQkleG1tOSwleG1tMTAKKwl4b3JsCSVlZHgsJWVkaQorCXBhZGRkCSV4bW03LCV4bW05CisJeG9ybAklZWJwLCVlZHgKKwlweG9yCSV4bW04LCV4bW0wCisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQoJXJzcCksJWVheAorCWFuZGwJJWVkeCwlZWRpCisJeG9ybAklZWJwLCVlZHgKKwlyb3JsCSQ3LCVlY3gKKwltb3ZkcWEJJXhtbTAsJXhtbTgKKwltb3ZsCSVlYngsJWVzaQorCXhvcmwJJWVkeCwlZWRpCisJbW92ZHFhCSV4bW05LDQ4KCVyc3ApCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlY3gsJWVzaQorCXBzbGxkCSQyLCV4bW0wCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXBzcmxkCSQzMCwleG1tOAorCWFkZGwJOCglcnNwKSwlZWJwCisJYW5kbAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCXBvcgkleG1tOCwleG1tMAorCXJvcmwJJDcsJWVieAorCW1vdmwJJWVheCwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwlwc2h1ZmQJJDIzOCwleG1tNywleG1tOQorCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWJ4LCVlZGkKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJYWRkbAkxMiglcnNwKSwlZWR4CisJYW5kbAklZWJ4LCVlZGkKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVheAorCW1vdmwJJWVicCwlZXNpCisJeG9ybAklZWJ4LCVlZGkKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTEKKwlhZGRsCTE2KCVyc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJcm9ybAkkNywlZWJwCisJcHVucGNrbHFkcQkleG1tMCwleG1tOQorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZWF4LCVlc2kKKwlweG9yCSV4bW0yLCV4bW0xCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwltb3ZkcWEJJXhtbTEwLCV4bW04CisJeG9ybAklZWJwLCVlZGkKKwlwYWRkZAkleG1tMCwleG1tMTAKKwl4b3JsCSVlYXgsJWVicAorCXB4b3IJJXhtbTksJXhtbTEKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJMjAoJXJzcCksJWVieAorCWFuZGwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlyb3JsCSQ3LCVlZHgKKwltb3ZkcWEJJXhtbTEsJXhtbTkKKwltb3ZsCSVlY3gsJWVzaQorCXhvcmwJJWVicCwlZWRpCisJbW92ZHFhCSV4bW0xMCwwKCVyc3ApCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCXBzbGxkCSQyLCV4bW0xCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXBzcmxkCSQzMCwleG1tOQorCWFkZGwJMjQoJXJzcCksJWVheAorCWFuZGwJJWVkeCwlZXNpCisJeG9ybAklZWJwLCVlZHgKKwlwb3IJJXhtbTksJXhtbTEKKwlyb3JsCSQ3LCVlY3gKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJWVkeCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJcHNodWZkCSQyMzgsJXhtbTAsJXhtbTEwCisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI4KCVyc3ApLCVlYnAKKwlhbmRsCSVlY3gsJWVkaQorCXhvcmwJJWVkeCwlZWN4CisJcm9ybAkkNywlZWJ4CisJbW92bAklZWF4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJcHhvcgkleG1tNiwleG1tMgorCWFkZGwJMzIoJXJzcCksJWVkeAorCWFuZGwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlYXgKKwlwdW5wY2tscWRxCSV4bW0xLCV4bW0xMAorCW1vdmwJJWVicCwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwlweG9yCSV4bW0zLCV4bW0yCisJcm9sbAkkNSwlZWJwCisJYWRkbAklZXNpLCVlZHgKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwl4b3JsCSVlYXgsJWVkaQorCXBhZGRkCSV4bW0xLCV4bW04CisJeG9ybAklZWJ4LCVlYXgKKwlweG9yCSV4bW0xMCwleG1tMgorCWFkZGwJJWVicCwlZWR4CisJYWRkbAkzNiglcnNwKSwlZWN4CisJYW5kbAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCXJvcmwJJDcsJWVicAorCW1vdmRxYQkleG1tMiwleG1tMTAKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVheCwlZWRpCisJbW92ZHFhCSV4bW04LDE2KCVyc3ApCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYnAsJWVzaQorCXBzbGxkCSQyLCV4bW0yCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXBzcmxkCSQzMCwleG1tMTAKKwlhZGRsCTQwKCVyc3ApLCVlYngKKwlhbmRsCSVlYnAsJWVzaQorCXhvcmwJJWVheCwlZWJwCisJcG9yCSV4bW0xMCwleG1tMgorCXJvcmwJJDcsJWVkeAorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwlyb2xsCSQ1LCVlY3gKKwlwc2h1ZmQJJDIzOCwleG1tMSwleG1tOAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwl4b3JsCSVlYnAsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0NCglcnNwKSwlZWF4CisJYW5kbAklZWR4LCVlZGkKKwl4b3JsCSVlYnAsJWVkeAorCXJvcmwJJDcsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJeG9ybAklZWR4LCVlZGkKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJYWRkbAklZWJ4LCVlYXgKKwlweG9yCSV4bW03LCV4bW0zCisJYWRkbAk0OCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW04CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQ1LCVlYXgKKwlweG9yCSV4bW00LCV4bW0zCisJYWRkbAklZXNpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmRxYQkleG1tOSwleG1tMTAKKwlyb3JsCSQ3LCVlYngKKwlwYWRkZAkleG1tMiwleG1tOQorCWFkZGwJJWVheCwlZWJwCisJcHhvcgkleG1tOCwleG1tMworCWFkZGwJNTIoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlyb2xsCSQ1LCVlYnAKKwltb3ZkcWEJJXhtbTMsJXhtbTgKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92ZHFhCSV4bW05LDMyKCVyc3ApCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTU2KCVyc3ApLCVlY3gKKwlwc2xsZAkkMiwleG1tMworCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlwc3JsZAkkMzAsJXhtbTgKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJcm9ybAkkNywlZWJwCisJcG9yCSV4bW04LCV4bW0zCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTYwKCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJcm9sbAkkNSwlZWJ4CisJcGFkZGQJJXhtbTMsJXhtbTEwCisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmRxYQkleG1tMTAsNDgoJXJzcCkKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJOCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMTIoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJcm9ybAkkNywlZWJwCisJYWRkbAklZWR4LCVlY3gKKwljbXBxCSVyMTAsJXI5CisJamUJLkxkb25lX3Nzc2UzCisJbW92ZHFhCTY0KCVyMTQpLCV4bW02CisJbW92ZHFhCS02NCglcjE0KSwleG1tOQorCW1vdmRxdQkwKCVyOSksJXhtbTAKKwltb3ZkcXUJMTYoJXI5KSwleG1tMQorCW1vdmRxdQkzMiglcjkpLCV4bW0yCisJbW92ZHF1CTQ4KCVyOSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OAorCWFkZHEJJDY0LCVyOQorCWFkZGwJMTYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlZGkKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNgorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwlyb3JsCSQ3LCVlZHgKKwlwYWRkZAkleG1tOSwleG1tMAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyMCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCW1vdmRxYQkleG1tMCwwKCVyc3ApCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXJvcmwJJDcsJWVjeAorCXBzdWJkCSV4bW05LCV4bW0wCisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI0KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWJwCisJYWRkbAkyOCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMzIoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlZGkKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNAorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlYnAKKwlwYWRkZAkleG1tOSwleG1tMQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkzNiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCW1vdmRxYQkleG1tMSwxNiglcnNwKQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwlyb3JsCSQ3LCVlZHgKKwlwc3ViZAkleG1tOSwleG1tMQorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0MCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNDQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTQ4KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVicCwlZWRpCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjIKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJcm9ybAkkNywlZWF4CisJcGFkZGQJJXhtbTksJXhtbTIKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJNTIoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwltb3ZkcWEJJXhtbTIsMzIoJXJzcCkKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJcm9ybAkkNywlZWJwCisJcHN1YmQJJXhtbTksJXhtbTIKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNTYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTYwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMCglcjgpLCVlYXgKKwlhZGRsCTQoJXI4KSwlZXNpCisJYWRkbAk4KCVyOCksJWVjeAorCWFkZGwJMTIoJXI4KSwlZWR4CisJbW92bAklZWF4LDAoJXI4KQorCWFkZGwJMTYoJXI4KSwlZWJwCisJbW92bAklZXNpLDQoJXI4KQorCW1vdmwJJWVzaSwlZWJ4CisJbW92bAklZWN4LDgoJXI4KQorCW1vdmwJJWVjeCwlZWRpCisJbW92bAklZWR4LDEyKCVyOCkKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVicCwxNiglcjgpCisJYW5kbAklZWRpLCVlc2kKKwlqbXAJLkxvb3Bfc3NzZTMKKworLmFsaWduCTE2CisuTGRvbmVfc3NzZTM6CisJYWRkbAkxNiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMjAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI0KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWJwCisJYWRkbAkyOCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMzIoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJcm9ybAkkNywlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTM2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0MCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNDQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTQ4KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVicCwlZWRpCisJcm9sbAkkNSwlZWJwCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAk1MiglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVkaSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlyb3JsCSQ3LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNTYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTYwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMCglcjgpLCVlYXgKKwlhZGRsCTQoJXI4KSwlZXNpCisJYWRkbAk4KCVyOCksJWVjeAorCW1vdmwJJWVheCwwKCVyOCkKKwlhZGRsCTEyKCVyOCksJWVkeAorCW1vdmwJJWVzaSw0KCVyOCkKKwlhZGRsCTE2KCVyOCksJWVicAorCW1vdmwJJWVjeCw4KCVyOCkKKwltb3ZsCSVlZHgsMTIoJXI4KQorCW1vdmwJJWVicCwxNiglcjgpCisJbW92cQktNDAoJXIxMSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcjExKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyMTEpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXIxMSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyMTEpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXIxMSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MZXBpbG9ndWVfc3NzZTM6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMsLi1zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMKKy50eXBlCXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdng6CitfYXZ4X3Nob3J0Y3V0OgorLmNmaV9zdGFydHByb2MJCisJbW92cQklcnNwLCVyMTEKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcjExCisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCWxlYXEJLTY0KCVyc3ApLCVyc3AKKwl2emVyb3VwcGVyCisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZGksJXI4CisJbW92cQklcnNpLCVyOQorCW1vdnEJJXJkeCwlcjEwCisKKwlzaGxxCSQ2LCVyMTAKKwlhZGRxCSVyOSwlcjEwCisJbGVhcQlLX1hYX1hYKzY0KCVyaXApLCVyMTQKKworCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92bAklZWJ4LCVlc2kKKwltb3ZsCTE2KCVyOCksJWVicAorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlZGkKKwlhbmRsCSVlZGksJWVzaQorCisJdm1vdmRxYQk2NCglcjE0KSwleG1tNgorCXZtb3ZkcWEJLTY0KCVyMTQpLCV4bW0xMQorCXZtb3ZkcXUJMCglcjkpLCV4bW0wCisJdm1vdmRxdQkxNiglcjkpLCV4bW0xCisJdm1vdmRxdQkzMiglcjkpLCV4bW0yCisJdm1vdmRxdQk0OCglcjkpLCV4bW0zCisJdnBzaHVmYgkleG1tNiwleG1tMCwleG1tMAorCWFkZHEJJDY0LCVyOQorCXZwc2h1ZmIJJXhtbTYsJXhtbTEsJXhtbTEKKwl2cHNodWZiCSV4bW02LCV4bW0yLCV4bW0yCisJdnBzaHVmYgkleG1tNiwleG1tMywleG1tMworCXZwYWRkZAkleG1tMTEsJXhtbTAsJXhtbTQKKwl2cGFkZGQJJXhtbTExLCV4bW0xLCV4bW01CisJdnBhZGRkCSV4bW0xMSwleG1tMiwleG1tNgorCXZtb3ZkcWEJJXhtbTQsMCglcnNwKQorCXZtb3ZkcWEJJXhtbTUsMTYoJXJzcCkKKwl2bW92ZHFhCSV4bW02LDMyKCVyc3ApCisJam1wCS5Mb29wX2F2eAorLmFsaWduCTE2CisuTG9vcF9hdng6CisJc2hyZGwJJDIsJWVieCwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMSwleG1tNAorCW1vdmwJJWVheCwlZWRpCisJYWRkbAkwKCVyc3ApLCVlYnAKKwl2cGFkZGQJJXhtbTMsJXhtbTExLCV4bW05CisJeG9ybAklZWN4LCVlYngKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwl2cHNybGRxCSQ0LCV4bW0zLCV4bW04CisJYWRkbAklZXNpLCVlYnAKKwlhbmRsCSVlYngsJWVkaQorCXZweG9yCSV4bW0wLCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXZweG9yCSV4bW0yLCV4bW04LCV4bW04CisJc2hyZGwJJDcsJWVheCwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJNCglcnNwKSwlZWR4CisJdnB4b3IJJXhtbTgsJXhtbTQsJXhtbTQKKwl4b3JsCSVlYngsJWVheAorCXNobGRsCSQ1LCVlYnAsJWVicAorCXZtb3ZkcWEJJXhtbTksNDgoJXJzcCkKKwlhZGRsCSVlZGksJWVkeAorCWFuZGwJJWVheCwlZXNpCisJdnBzcmxkCSQzMSwleG1tNCwleG1tOAorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXZwc2xsZHEJJDEyLCV4bW00LCV4bW0xMAorCXZwYWRkZAkleG1tNCwleG1tNCwleG1tNAorCW1vdmwJJWVkeCwlZWRpCisJYWRkbAk4KCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZwc3JsZAkkMzAsJXhtbTEwLCV4bW05CisJdnBvcgkleG1tOCwleG1tNCwleG1tNAorCWFkZGwJJWVzaSwlZWN4CisJYW5kbAklZWJwLCVlZGkKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJdnBzbGxkCSQyLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tOSwleG1tNCwleG1tNAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlhZGRsCTEyKCVyc3ApLCVlYngKKwl2cHhvcgkleG1tMTAsJXhtbTQsJXhtbTQKKwl4b3JsCSVlYnAsJWVkeAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJYW5kbAklZWR4LCVlc2kKKwl4b3JsCSVlYnAsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJeG9ybAklZWJwLCVlc2kKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tNQorCW1vdmwJJWVieCwlZWRpCisJYWRkbAkxNiglcnNwKSwlZWF4CisJdnBhZGRkCSV4bW00LCV4bW0xMSwleG1tOQorCXhvcmwJJWVkeCwlZWN4CisJc2hsZGwJJDUsJWVieCwlZWJ4CisJdnBzcmxkcQkkNCwleG1tNCwleG1tOAorCWFkZGwJJWVzaSwlZWF4CisJYW5kbAklZWN4LCVlZGkKKwl2cHhvcgkleG1tMSwleG1tNSwleG1tNQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cHhvcgkleG1tMywleG1tOCwleG1tOAorCXNocmRsCSQ3LCVlYngsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlhZGRsCTIwKCVyc3ApLCVlYnAKKwl2cHhvcgkleG1tOCwleG1tNSwleG1tNQorCXhvcmwJJWVjeCwlZWJ4CisJc2hsZGwJJDUsJWVheCwlZWF4CisJdm1vdmRxYQkleG1tOSwwKCVyc3ApCisJYWRkbAklZWRpLCVlYnAKKwlhbmRsCSVlYngsJWVzaQorCXZwc3JsZAkkMzEsJXhtbTUsJXhtbTgKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJc2hyZGwJJDcsJWVheCwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwl2cHNsbGRxCSQxMiwleG1tNSwleG1tMTAKKwl2cGFkZGQJJXhtbTUsJXhtbTUsJXhtbTUKKwltb3ZsCSVlYnAsJWVkaQorCWFkZGwJMjQoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZWF4CisJc2hsZGwJJDUsJWVicCwlZWJwCisJdnBzcmxkCSQzMCwleG1tMTAsJXhtbTkKKwl2cG9yCSV4bW04LCV4bW01LCV4bW01CisJYWRkbAklZXNpLCVlZHgKKwlhbmRsCSVlYXgsJWVkaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwl2cHNsbGQJJDIsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW05LCV4bW01LCV4bW01CisJc2hyZGwJJDcsJWVicCwlZWJwCisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCWFkZGwJMjgoJXJzcCksJWVjeAorCXZweG9yCSV4bW0xMCwleG1tNSwleG1tNQorCXhvcmwJJWVheCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdm1vdmRxYQktMzIoJXIxNCksJXhtbTExCisJYWRkbAklZWRpLCVlY3gKKwlhbmRsCSVlYnAsJWVzaQorCXhvcmwJJWVheCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXZwYWxpZ25yCSQ4LCV4bW0yLCV4bW0zLCV4bW02CisJbW92bAklZWN4LCVlZGkKKwlhZGRsCTMyKCVyc3ApLCVlYngKKwl2cGFkZGQJJXhtbTUsJXhtbTExLCV4bW05CisJeG9ybAklZWJwLCVlZHgKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwl2cHNybGRxCSQ0LCV4bW01LCV4bW04CisJYWRkbAklZXNpLCVlYngKKwlhbmRsCSVlZHgsJWVkaQorCXZweG9yCSV4bW0yLCV4bW02LCV4bW02CisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZweG9yCSV4bW00LCV4bW04LCV4bW04CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCWFkZGwJMzYoJXJzcCksJWVheAorCXZweG9yCSV4bW04LCV4bW02LCV4bW02CisJeG9ybAklZWR4LCVlY3gKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwl2bW92ZHFhCSV4bW05LDE2KCVyc3ApCisJYWRkbAklZWRpLCVlYXgKKwlhbmRsCSVlY3gsJWVzaQorCXZwc3JsZAkkMzEsJXhtbTYsJXhtbTgKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwl2cHNsbGRxCSQxMiwleG1tNiwleG1tMTAKKwl2cGFkZGQJJXhtbTYsJXhtbTYsJXhtbTYKKwltb3ZsCSVlYXgsJWVkaQorCWFkZGwJNDAoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnBzcmxkCSQzMCwleG1tMTAsJXhtbTkKKwl2cG9yCSV4bW04LCV4bW02LCV4bW02CisJYWRkbAklZXNpLCVlYnAKKwlhbmRsCSVlYngsJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cHNsbGQJJDIsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW05LCV4bW02LCV4bW02CisJc2hyZGwJJDcsJWVheCwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJNDQoJXJzcCksJWVkeAorCXZweG9yCSV4bW0xMCwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWF4CisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwlhbmRsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXZwYWxpZ25yCSQ4LCV4bW0zLCV4bW00LCV4bW03CisJbW92bAklZWR4LCVlZGkKKwlhZGRsCTQ4KCVyc3ApLCVlY3gKKwl2cGFkZGQJJXhtbTYsJXhtbTExLCV4bW05CisJeG9ybAklZWF4LCVlYnAKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cHNybGRxCSQ0LCV4bW02LCV4bW04CisJYWRkbAklZXNpLCVlY3gKKwlhbmRsCSVlYnAsJWVkaQorCXZweG9yCSV4bW0zLCV4bW03LCV4bW03CisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXZweG9yCSV4bW01LCV4bW04LCV4bW04CisJc2hyZGwJJDcsJWVkeCwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCWFkZGwJNTIoJXJzcCksJWVieAorCXZweG9yCSV4bW04LCV4bW03LCV4bW03CisJeG9ybAklZWJwLCVlZHgKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwl2bW92ZHFhCSV4bW05LDMyKCVyc3ApCisJYWRkbAklZWRpLCVlYngKKwlhbmRsCSVlZHgsJWVzaQorCXZwc3JsZAkkMzEsJXhtbTcsJXhtbTgKKwl4b3JsCSVlYnAsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJeG9ybAklZWJwLCVlc2kKKwl2cHNsbGRxCSQxMiwleG1tNywleG1tMTAKKwl2cGFkZGQJJXhtbTcsJXhtbTcsJXhtbTcKKwltb3ZsCSVlYngsJWVkaQorCWFkZGwJNTYoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWN4CisJc2hsZGwJJDUsJWVieCwlZWJ4CisJdnBzcmxkCSQzMCwleG1tMTAsJXhtbTkKKwl2cG9yCSV4bW04LCV4bW03LCV4bW03CisJYWRkbAklZXNpLCVlYXgKKwlhbmRsCSVlY3gsJWVkaQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cHNsbGQJJDIsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW05LCV4bW03LCV4bW03CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCWFkZGwJNjAoJXJzcCksJWVicAorCXZweG9yCSV4bW0xMCwleG1tNywleG1tNworCXhvcmwJJWVjeCwlZWJ4CisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwlhbmRsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cGFsaWducgkkOCwleG1tNiwleG1tNywleG1tOAorCXZweG9yCSV4bW00LCV4bW0wLCV4bW0wCisJc2hyZGwJJDcsJWVheCwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorCWFkZGwJMCglcnNwKSwlZWR4CisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKwl4b3JsCSVlYngsJWVheAorCXNobGRsCSQ1LCVlYnAsJWVicAorCXZwYWRkZAkleG1tNywleG1tMTEsJXhtbTkKKwlhZGRsCSVlc2ksJWVkeAorCWFuZGwJJWVheCwlZWRpCisJdnB4b3IJJXhtbTgsJXhtbTAsJXhtbTAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJc2hyZGwJJDcsJWVicCwlZWJwCisJeG9ybAklZWJ4LCVlZGkKKwl2cHNybGQJJDMwLCV4bW0wLCV4bW04CisJdm1vdmRxYQkleG1tOSw0OCglcnNwKQorCW1vdmwJJWVkeCwlZXNpCisJYWRkbAk0KCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZwc2xsZAkkMiwleG1tMCwleG1tMAorCWFkZGwJJWVkaSwlZWN4CisJYW5kbAklZWJwLCVlc2kKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVkeCwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCWFkZGwJOCglcnNwKSwlZWJ4CisJdnBvcgkleG1tOCwleG1tMCwleG1tMAorCXhvcmwJJWVicCwlZWR4CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwlhbmRsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTEyKCVyc3ApLCVlYXgKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBhbGlnbnIJJDgsJXhtbTcsJXhtbTAsJXhtbTgKKwl2cHhvcgkleG1tNSwleG1tMSwleG1tMQorCWFkZGwJMTYoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwl2cGFkZGQJJXhtbTAsJXhtbTExLCV4bW05CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cHhvcgkleG1tOCwleG1tMSwleG1tMQorCWFkZGwJMjAoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwl2cHNybGQJJDMwLCV4bW0xLCV4bW04CisJdm1vdmRxYQkleG1tOSwwKCVyc3ApCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdnBzbGxkCSQyLCV4bW0xLCV4bW0xCisJYWRkbAkyNCglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXZwb3IJJXhtbTgsJXhtbTEsJXhtbTEKKwlhZGRsCTI4KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTEsJXhtbTgKKwl2cHhvcgkleG1tNiwleG1tMiwleG1tMgorCWFkZGwJMzIoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwl2cHhvcgkleG1tMywleG1tMiwleG1tMgorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwl2cGFkZGQJJXhtbTEsJXhtbTExLCV4bW05CisJdm1vdmRxYQkwKCVyMTQpLCV4bW0xMQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnB4b3IJJXhtbTgsJXhtbTIsJXhtbTIKKwlhZGRsCTM2KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnBzcmxkCSQzMCwleG1tMiwleG1tOAorCXZtb3ZkcWEJJXhtbTksMTYoJXJzcCkKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cHNsbGQJJDIsJXhtbTIsJXhtbTIKKwlhZGRsCTQwKCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVicCwlZWRpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdnBvcgkleG1tOCwleG1tMiwleG1tMgorCWFkZGwJNDQoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tOAorCXZweG9yCSV4bW03LCV4bW0zLCV4bW0zCisJYWRkbAk0OCglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCXZwYWRkZAkleG1tMiwleG1tMTEsJXhtbTkKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZweG9yCSV4bW04LCV4bW0zLCV4bW0zCisJYWRkbAk1MiglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCXZwc3JsZAkkMzAsJXhtbTMsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDMyKCVyc3ApCisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBzbGxkCSQyLCV4bW0zLCV4bW0zCisJYWRkbAk1NiglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXZwb3IJJXhtbTgsJXhtbTMsJXhtbTMKKwlhZGRsCTYwKCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdnBhbGlnbnIJJDgsJXhtbTIsJXhtbTMsJXhtbTgKKwl2cHhvcgkleG1tMCwleG1tNCwleG1tNAorCWFkZGwJMCglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXZwYWRkZAkleG1tMywleG1tMTEsJXhtbTkKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXZweG9yCSV4bW04LCV4bW00LCV4bW00CisJYWRkbAk0KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdnBzcmxkCSQzMCwleG1tNCwleG1tOAorCXZtb3ZkcWEJJXhtbTksNDgoJXJzcCkKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHNsbGQJJDIsJXhtbTQsJXhtbTQKKwlhZGRsCTgoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cG9yCSV4bW04LCV4bW00LCV4bW00CisJYWRkbAkxMiglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXZwYWxpZ25yCSQ4LCV4bW0zLCV4bW00LCV4bW04CisJdnB4b3IJJXhtbTEsJXhtbTUsJXhtbTUKKwlhZGRsCTE2KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVicCwlZWRpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJdnBhZGRkCSV4bW00LCV4bW0xMSwleG1tOQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdnB4b3IJJXhtbTgsJXhtbTUsJXhtbTUKKwlhZGRsCTIwKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdnBzcmxkCSQzMCwleG1tNSwleG1tOAorCXZtb3ZkcWEJJXhtbTksMCglcnNwKQorCWFkZGwJJWVkaSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXZwc2xsZAkkMiwleG1tNSwleG1tNQorCWFkZGwJMjQoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cG9yCSV4bW04LCV4bW01LCV4bW01CisJYWRkbAkyOCglcnNwKSwlZWF4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBhbGlnbnIJJDgsJXhtbTQsJXhtbTUsJXhtbTgKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCWFkZGwJMzIoJXJzcCksJWVicAorCWFuZGwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCW1vdmwJJWVheCwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwl2cGFkZGQJJXhtbTUsJXhtbTExLCV4bW05CisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwl2cHhvcgkleG1tOCwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJMzYoJXJzcCksJWVkeAorCXZwc3JsZAkkMzAsJXhtbTYsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDE2KCVyc3ApCisJYW5kbAklZWJ4LCVlZGkKKwl4b3JsCSVlY3gsJWVieAorCXNocmRsCSQ3LCVlYXgsJWVheAorCW1vdmwJJWVicCwlZXNpCisJdnBzbGxkCSQyLCV4bW02LCV4bW02CisJeG9ybAklZWJ4LCVlZGkKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJNDAoJXJzcCksJWVjeAorCWFuZGwJJWVheCwlZXNpCisJdnBvcgkleG1tOCwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWF4CisJc2hyZGwJJDcsJWVicCwlZWJwCisJbW92bAklZWR4LCVlZGkKKwl4b3JsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWJwLCVlZGkKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk0NCglcnNwKSwlZWJ4CisJYW5kbAklZWJwLCVlZGkKKwl4b3JsCSVlYXgsJWVicAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCW1vdmwJJWVjeCwlZXNpCisJeG9ybAklZWJwLCVlZGkKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVkeCwlZXNpCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwYWxpZ25yCSQ4LCV4bW01LCV4bW02LCV4bW04CisJdnB4b3IJJXhtbTMsJXhtbTcsJXhtbTcKKwlhZGRsCTQ4KCVyc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVzaQorCXhvcmwJJWVicCwlZWR4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJdnB4b3IJJXhtbTAsJXhtbTcsJXhtbTcKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJWVkeCwlZXNpCisJdnBhZGRkCSV4bW02LCV4bW0xMSwleG1tOQorCXZtb3ZkcWEJMzIoJXIxNCksJXhtbTExCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl2cHhvcgkleG1tOCwleG1tNywleG1tNworCXhvcmwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNTIoJXJzcCksJWVicAorCXZwc3JsZAkkMzAsJXhtbTcsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDMyKCVyc3ApCisJYW5kbAklZWN4LCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlYngsJWVieAorCW1vdmwJJWVheCwlZXNpCisJdnBzbGxkCSQyLCV4bW03LCV4bW03CisJeG9ybAklZWN4LCVlZGkKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJNTYoJXJzcCksJWVkeAorCWFuZGwJJWVieCwlZXNpCisJdnBvcgkleG1tOCwleG1tNywleG1tNworCXhvcmwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVheCwlZWF4CisJbW92bAklZWJwLCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAk2MCglcnNwKSwlZWN4CisJYW5kbAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlYnAsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVicCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXZwYWxpZ25yCSQ4LCV4bW02LCV4bW03LCV4bW04CisJdnB4b3IJJXhtbTQsJXhtbTAsJXhtbTAKKwlhZGRsCTAoJXJzcCksJWVieAorCWFuZGwJJWVicCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwl2cHhvcgkleG1tMSwleG1tMCwleG1tMAorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwl2cGFkZGQJJXhtbTcsJXhtbTExLCV4bW05CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl2cHhvcgkleG1tOCwleG1tMCwleG1tMAorCXhvcmwJJWVkeCwlZWRpCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNCglcnNwKSwlZWF4CisJdnBzcmxkCSQzMCwleG1tMCwleG1tOAorCXZtb3ZkcWEJJXhtbTksNDgoJXJzcCkKKwlhbmRsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl2cHNsbGQJJDIsJXhtbTAsJXhtbTAKKwl4b3JsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk4KCVyc3ApLCVlYnAKKwlhbmRsCSVlY3gsJWVzaQorCXZwb3IJJXhtbTgsJXhtbTAsJXhtbTAKKwl4b3JsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlYngsJWVieAorCW1vdmwJJWVheCwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJMTIoJXJzcCksJWVkeAorCWFuZGwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwltb3ZsCSVlYnAsJWVzaQorCXhvcmwJJWVieCwlZWRpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwl2cGFsaWducgkkOCwleG1tNywleG1tMCwleG1tOAorCXZweG9yCSV4bW01LCV4bW0xLCV4bW0xCisJYWRkbAkxNiglcnNwKSwlZWN4CisJYW5kbAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlYnAsJWVicAorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJbW92bAklZWR4LCVlZGkKKwl4b3JsCSVlYXgsJWVzaQorCXZwYWRkZAkleG1tMCwleG1tMTEsJXhtbTkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXZweG9yCSV4bW04LCV4bW0xLCV4bW0xCisJeG9ybAklZWJwLCVlZGkKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkyMCglcnNwKSwlZWJ4CisJdnBzcmxkCSQzMCwleG1tMSwleG1tOAorCXZtb3ZkcWEJJXhtbTksMCglcnNwKQorCWFuZGwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXZwc2xsZAkkMiwleG1tMSwleG1tMQorCXhvcmwJJWVicCwlZWRpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTI0KCVyc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVzaQorCXZwb3IJJXhtbTgsJXhtbTEsJXhtbTEKKwl4b3JsCSVlYnAsJWVkeAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCW1vdmwJJWVieCwlZWRpCisJeG9ybAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMjgoJXJzcCksJWVicAorCWFuZGwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwltb3ZsCSVlYXgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMSwleG1tOAorCXZweG9yCSV4bW02LCV4bW0yLCV4bW0yCisJYWRkbAkzMiglcnNwKSwlZWR4CisJYW5kbAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXNocmRsCSQ3LCVlYXgsJWVheAorCXZweG9yCSV4bW0zLCV4bW0yLCV4bW0yCisJbW92bAklZWJwLCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCXZwYWRkZAkleG1tMSwleG1tMTEsJXhtbTkKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXZweG9yCSV4bW04LCV4bW0yLCV4bW0yCisJeG9ybAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAkzNiglcnNwKSwlZWN4CisJdnBzcmxkCSQzMCwleG1tMiwleG1tOAorCXZtb3ZkcWEJJXhtbTksMTYoJXJzcCkKKwlhbmRsCSVlYXgsJWVkaQorCXhvcmwJJWVieCwlZWF4CisJc2hyZGwJJDcsJWVicCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwl2cHNsbGQJJDIsJXhtbTIsJXhtbTIKKwl4b3JsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVkaSwlZWN4CisJeG9ybAklZWJwLCVlc2kKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk0MCglcnNwKSwlZWJ4CisJYW5kbAklZWJwLCVlc2kKKwl2cG9yCSV4bW04LCV4bW0yLCV4bW0yCisJeG9ybAklZWF4LCVlYnAKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwltb3ZsCSVlY3gsJWVkaQorCXhvcmwJJWVicCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQ0KCVyc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlhZGRsCSVlYngsJWVheAorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0yLCV4bW04CisJdnB4b3IJJXhtbTcsJXhtbTMsJXhtbTMKKwlhZGRsCTQ4KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWRpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJdnBhZGRkCSV4bW0yLCV4bW0xMSwleG1tOQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWJwCisJdnB4b3IJJXhtbTgsJXhtbTMsJXhtbTMKKwlhZGRsCTUyKCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJdnBzcmxkCSQzMCwleG1tMywleG1tOAorCXZtb3ZkcWEJJXhtbTksMzIoJXJzcCkKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwl2cHNsbGQJJDIsJXhtbTMsJXhtbTMKKwlhZGRsCTU2KCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXNocmRsCSQ3LCVlYnAsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJdnBvcgkleG1tOCwleG1tMywleG1tMworCWFkZGwJNjAoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTAoJXJzcCksJWVheAorCXZwYWRkZAkleG1tMywleG1tMTEsJXhtbTkKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl2bW92ZHFhCSV4bW05LDQ4KCVyc3ApCisJeG9ybAklZWR4LCVlZGkKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJOCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMTIoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwljbXBxCSVyMTAsJXI5CisJamUJLkxkb25lX2F2eAorCXZtb3ZkcWEJNjQoJXIxNCksJXhtbTYKKwl2bW92ZHFhCS02NCglcjE0KSwleG1tMTEKKwl2bW92ZHF1CTAoJXI5KSwleG1tMAorCXZtb3ZkcXUJMTYoJXI5KSwleG1tMQorCXZtb3ZkcXUJMzIoJXI5KSwleG1tMgorCXZtb3ZkcXUJNDgoJXI5KSwleG1tMworCXZwc2h1ZmIJJXhtbTYsJXhtbTAsJXhtbTAKKwlhZGRxCSQ2NCwlcjkKKwlhZGRsCTE2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXZwc2h1ZmIJJXhtbTYsJXhtbTEsJXhtbTEKKwltb3ZsCSVlY3gsJWVkaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZwYWRkZAkleG1tMTEsJXhtbTAsJXhtbTQKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2bW92ZHFhCSV4bW00LDAoJXJzcCkKKwlhZGRsCTIwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkyNCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJMjgoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTMyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXZwc2h1ZmIJJXhtbTYsJXhtbTIsJXhtbTIKKwltb3ZsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZwYWRkZAkleG1tMTEsJXhtbTEsJXhtbTUKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwl2bW92ZHFhCSV4bW01LDE2KCVyc3ApCisJYWRkbAkzNiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWJwCisJYWRkbAk0OCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwl2cHNodWZiCSV4bW02LCV4bW0zLCV4bW0zCisJbW92bAklZWJwLCVlZGkKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwl2cGFkZGQJJXhtbTExLCV4bW0yLCV4bW02CisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdm1vdmRxYQkleG1tNiwzMiglcnNwKQorCWFkZGwJNTIoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTU2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTAoJXI4KSwlZWF4CisJYWRkbAk0KCVyOCksJWVzaQorCWFkZGwJOCglcjgpLCVlY3gKKwlhZGRsCTEyKCVyOCksJWVkeAorCW1vdmwJJWVheCwwKCVyOCkKKwlhZGRsCTE2KCVyOCksJWVicAorCW1vdmwJJWVzaSw0KCVyOCkKKwltb3ZsCSVlc2ksJWVieAorCW1vdmwJJWVjeCw4KCVyOCkKKwltb3ZsCSVlY3gsJWVkaQorCW1vdmwJJWVkeCwxMiglcjgpCisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYnAsMTYoJXI4KQorCWFuZGwJJWVkaSwlZXNpCisJam1wCS5Mb29wX2F2eAorCisuYWxpZ24JMTYKKy5MZG9uZV9hdng6CisJYWRkbAkxNiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMjAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI0KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWRpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWJwCisJYWRkbAkyOCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMzIoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTM2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0MCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNDQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTQ4KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVicCwlZWRpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAk1MiglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVkaSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNTYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTYwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZ6ZXJvdXBwZXIKKworCWFkZGwJMCglcjgpLCVlYXgKKwlhZGRsCTQoJXI4KSwlZXNpCisJYWRkbAk4KCVyOCksJWVjeAorCW1vdmwJJWVheCwwKCVyOCkKKwlhZGRsCTEyKCVyOCksJWVkeAorCW1vdmwJJWVzaSw0KCVyOCkKKwlhZGRsCTE2KCVyOCksJWVicAorCW1vdmwJJWVjeCw4KCVyOCkKKwltb3ZsCSVlZHgsMTIoJXI4KQorCW1vdmwJJWVicCwxNiglcjgpCisJbW92cQktNDAoJXIxMSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcjExKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyMTEpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXIxMSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyMTEpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXIxMSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MZXBpbG9ndWVfYXZ4OgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eCwuLXNoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdngKKy5hbGlnbgk2NAorS19YWF9YWDoKKy5sb25nCTB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkKKy5sb25nCTB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkKKy5sb25nCTB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEKKy5sb25nCTB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEKKy5sb25nCTB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMKKy5sb25nCTB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMKKy5sb25nCTB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYKKy5sb25nCTB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5ieXRlCTB4ZiwweGUsMHhkLDB4YywweGIsMHhhLDB4OSwweDgsMHg3LDB4NiwweDUsMHg0LDB4MywweDIsMHgxLDB4MAorLmJ5dGUJODMsNzIsNjUsNDksMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmFsaWduCTY0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzVmMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LXg4Nl82NC5TCkBAIC0wLDAgKzEsMzk2MCBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKworLmV4dGVybglPUEVOU1NMX2lhMzJjYXBfUAorLmhpZGRlbiBPUEVOU1NMX2lhMzJjYXBfUAorLmdsb2JsCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisuaGlkZGVuIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcixAZnVuY3Rpb24KKy5hbGlnbgkxNgorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CisuY2ZpX3N0YXJ0cHJvYwkKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTEKKwltb3ZsCTAoJXIxMSksJXI5ZAorCW1vdmwJNCglcjExKSwlcjEwZAorCW1vdmwJOCglcjExKSwlcjExZAorCWFuZGwJJDEwNzM3NDE4MjQsJXI5ZAorCWFuZGwJJDI2ODQzNTk2OCwlcjEwZAorCW9ybAklcjlkLCVyMTBkCisJY21wbAkkMTM0MjE3Nzc5MiwlcjEwZAorCWplCS5MYXZ4X3Nob3J0Y3V0CisJdGVzdGwJJDUxMiwlcjEwZAorCWpuegkuTHNzc2UzX3Nob3J0Y3V0CisJbW92cQklcnNwLCVyYXgKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcmF4CisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJc2hscQkkNCwlcmR4CisJc3VicQkkNjQrMzIsJXJzcAorCWxlYXEJKCVyc2ksJXJkeCw0KSwlcmR4CisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZGksNjQrMCglcnNwKQorCW1vdnEJJXJzaSw2NCs4KCVyc3ApCisJbW92cQklcmR4LDY0KzE2KCVyc3ApCisJbW92cQklcmF4LDg4KCVyc3ApCisuY2ZpX2VzY2FwZQkweDBmLDB4MDYsMHg3NywweGQ4LDB4MDAsMHgwNiwweDIzLDB4MDgKKy5McHJvbG9ndWU6CisKKwltb3ZsCTAoJXJkaSksJWVheAorCW1vdmwJNCglcmRpKSwlZWJ4CisJbW92bAk4KCVyZGkpLCVlY3gKKwltb3ZsCTEyKCVyZGkpLCVlZHgKKwltb3ZsCTE2KCVyZGkpLCVyOGQKKwltb3ZsCTIwKCVyZGkpLCVyOWQKKwltb3ZsCTI0KCVyZGkpLCVyMTBkCisJbW92bAkyOCglcmRpKSwlcjExZAorCWptcAkuTGxvb3AKKworLmFsaWduCTE2CisuTGxvb3A6CisJbW92bAklZWJ4LCVlZGkKKwlsZWFxCUsyNTYoJXJpcCksJXJicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkwKCVyc2kpLCVyMTJkCisJbW92bAklcjhkLCVyMTNkCisJbW92bAklZWF4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyOWQsJXIxNWQKKworCXhvcmwJJXI4ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTVkCisKKwltb3ZsCSVyMTJkLDAoJXJzcCkKKwl4b3JsCSVlYXgsJXIxNGQKKwlhbmRsCSVyOGQsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVyMTFkLCVyMTJkCisJeG9ybAklcjEwZCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyOGQsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVlYXgsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVheCwlcjE0ZAorCisJeG9ybAklZWJ4LCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVieCwlcjExZAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCWFkZGwJJXIxMmQsJXIxMWQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjExZAorCW1vdmwJNCglcnNpKSwlcjEyZAorCW1vdmwJJWVkeCwlcjEzZAorCW1vdmwJJXIxMWQsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXI4ZCwlZWRpCisKKwl4b3JsCSVlZHgsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVlZGkKKworCW1vdmwJJXIxMmQsNCglcnNwKQorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyOWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJXIxMWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjExZCwlcjE0ZAorCisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWF4LCVyMTBkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjEwZAorCWFkZGwJJXIxMmQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjEwZAorCW1vdmwJOCglcnNpKSwlcjEyZAorCW1vdmwJJWVjeCwlcjEzZAorCW1vdmwJJXIxMGQsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVkeCwlcjE1ZAorCisJeG9ybAklZWN4LCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjE1ZAorCisJbW92bAklcjEyZCw4KCVyc3ApCisJeG9ybAklcjEwZCwlcjE0ZAorCWFuZGwJJWVjeCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXI5ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVyMTBkLCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTRkCisKKwl4b3JsCSVyMTFkLCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXIxMWQsJXI5ZAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlcjlkCisJYWRkbAklcjEyZCwlZWJ4CisJYWRkbAklcjEyZCwlcjlkCisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJXI5ZAorCW1vdmwJMTIoJXJzaSksJXIxMmQKKwltb3ZsCSVlYngsJXIxM2QKKwltb3ZsCSVyOWQsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVjeCwlZWRpCisKKwl4b3JsCSVlYngsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWR4LCVlZGkKKworCW1vdmwJJXIxMmQsMTIoJXJzcCkKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXI4ZCwlcjEyZAorCXhvcmwJJWVkeCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklcjlkLCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXI5ZCwlcjE0ZAorCisJeG9ybAklcjEwZCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXIxMGQsJXI4ZAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJXI4ZAorCWFkZGwJJXIxMmQsJWVheAorCWFkZGwJJXIxMmQsJXI4ZAorCisJbGVhcQkyMCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjhkCisJbW92bAkxNiglcnNpKSwlcjEyZAorCW1vdmwJJWVheCwlcjEzZAorCW1vdmwJJXI4ZCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWJ4LCVyMTVkCisKKwl4b3JsCSVlYXgsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWN4LCVyMTVkCisKKwltb3ZsCSVyMTJkLDE2KCVyc3ApCisJeG9ybAklcjhkLCVyMTRkCisJYW5kbAklZWF4LCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWR4LCVyMTJkCisJeG9ybAklZWN4LCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJXI4ZCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjhkLCVyMTRkCisKKwl4b3JsCSVyOWQsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjlkLCVlZHgKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJXIxMmQsJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlZWR4CisJbW92bAkyMCglcnNpKSwlcjEyZAorCW1vdmwJJXIxMWQsJXIxM2QKKwltb3ZsCSVlZHgsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVheCwlZWRpCisKKwl4b3JsCSVyMTFkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVieCwlZWRpCisKKwltb3ZsCSVyMTJkLDIwKCVyc3ApCisJeG9ybAklZWR4LCVyMTRkCisJYW5kbAklcjExZCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWN4LCVyMTJkCisJeG9ybAklZWJ4LCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklZWR4LCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVkeCwlcjE0ZAorCisJeG9ybAklcjhkLCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjhkLCVlY3gKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVlY3gKKwlhZGRsCSVyMTJkLCVyMTBkCisJYWRkbAklcjEyZCwlZWN4CisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJWVjeAorCW1vdmwJMjQoJXJzaSksJXIxMmQKKwltb3ZsCSVyMTBkLCVyMTNkCisJbW92bAklZWN4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTFkLCVyMTVkCisKKwl4b3JsCSVyMTBkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVheCwlcjE1ZAorCisJbW92bAklcjEyZCwyNCglcnNwKQorCXhvcmwJJWVjeCwlcjE0ZAorCWFuZGwJJXIxMGQsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlYngsJXIxMmQKKwl4b3JsCSVlYXgsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJWVjeCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWN4LCVyMTRkCisKKwl4b3JsCSVlZHgsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWR4LCVlYngKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJJXIxMmQsJXI5ZAorCWFkZGwJJXIxMmQsJWVieAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVlYngKKwltb3ZsCTI4KCVyc2kpLCVyMTJkCisJbW92bAklcjlkLCVyMTNkCisJbW92bAklZWJ4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTBkLCVlZGkKKworCXhvcmwJJXI5ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTFkLCVlZGkKKworCW1vdmwJJXIxMmQsMjgoJXJzcCkKKwl4b3JsCSVlYngsJXIxNGQKKwlhbmRsCSVyOWQsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVheCwlcjEyZAorCXhvcmwJJXIxMWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJWVieCwlZWRpCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlYngsJXIxNGQKKworCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVjeCwlZWF4CisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlZWF4CisJYWRkbAklcjEyZCwlcjhkCisJYWRkbAklcjEyZCwlZWF4CisKKwlsZWFxCTIwKCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVlYXgKKwltb3ZsCTMyKCVyc2kpLCVyMTJkCisJbW92bAklcjhkLCVyMTNkCisJbW92bAklZWF4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyOWQsJXIxNWQKKworCXhvcmwJJXI4ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTVkCisKKwltb3ZsCSVyMTJkLDMyKCVyc3ApCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklZWF4LCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlYXgsJXIxNGQKKworCXhvcmwJJWVieCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlYngsJXIxMWQKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKwlhZGRsCSVyMTJkLCVyMTFkCisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJXIxMWQKKwltb3ZsCTM2KCVyc2kpLCVyMTJkCisJbW92bAklZWR4LCVyMTNkCisJbW92bAklcjExZCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjhkLCVlZGkKKworCXhvcmwJJWVkeCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOWQsJWVkaQorCisJbW92bAklcjEyZCwzNiglcnNwKQorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyOWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJXIxMWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjExZCwlcjE0ZAorCisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWF4LCVyMTBkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjEwZAorCWFkZGwJJXIxMmQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjEwZAorCW1vdmwJNDAoJXJzaSksJXIxMmQKKwltb3ZsCSVlY3gsJXIxM2QKKwltb3ZsCSVyMTBkLCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlZHgsJXIxNWQKKworCXhvcmwJJWVjeCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOGQsJXIxNWQKKworCW1vdmwJJXIxMmQsNDAoJXJzcCkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYW5kbAklZWN4LCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjlkLCVyMTJkCisJeG9ybAklcjhkLCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJXIxMGQsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXIxMGQsJXIxNGQKKworCXhvcmwJJXIxMWQsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjExZCwlcjlkCisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVyOWQKKwlhZGRsCSVyMTJkLCVlYngKKwlhZGRsCSVyMTJkLCVyOWQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjlkCisJbW92bAk0NCglcnNpKSwlcjEyZAorCW1vdmwJJWVieCwlcjEzZAorCW1vdmwJJXI5ZCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWN4LCVlZGkKKworCXhvcmwJJWVieCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlZHgsJWVkaQorCisJbW92bAklcjEyZCw0NCglcnNwKQorCXhvcmwJJXI5ZCwlcjE0ZAorCWFuZGwJJWVieCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjhkLCVyMTJkCisJeG9ybAklZWR4LCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVyOWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjlkLCVyMTRkCisKKwl4b3JsCSVyMTBkLCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjEwZCwlcjhkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjhkCisJYWRkbAklcjEyZCwlZWF4CisJYWRkbAklcjEyZCwlcjhkCisKKwlsZWFxCTIwKCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVyOGQKKwltb3ZsCTQ4KCVyc2kpLCVyMTJkCisJbW92bAklZWF4LCVyMTNkCisJbW92bAklcjhkLCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlYngsJXIxNWQKKworCXhvcmwJJWVheCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlY3gsJXIxNWQKKworCW1vdmwJJXIxMmQsNDgoJXJzcCkKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlY3gsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklcjhkLCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyOGQsJXIxNGQKKworCXhvcmwJJXI5ZCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyOWQsJWVkeAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklcjEyZCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVlZHgKKwltb3ZsCTUyKCVyc2kpLCVyMTJkCisJbW92bAklcjExZCwlcjEzZAorCW1vdmwJJWVkeCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWF4LCVlZGkKKworCXhvcmwJJXIxMWQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWJ4LCVlZGkKKworCW1vdmwJJXIxMmQsNTIoJXJzcCkKKwl4b3JsCSVlZHgsJXIxNGQKKwlhbmRsCSVyMTFkLCVlZGkKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlYngsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVlZHgsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWR4LCVyMTRkCisKKwl4b3JsCSVyOGQsJWVkaQorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyOGQsJWVjeAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKwlhZGRsCSVyMTJkLCVlY3gKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlZWN4CisJbW92bAk1NiglcnNpKSwlcjEyZAorCW1vdmwJJXIxMGQsJXIxM2QKKwltb3ZsCSVlY3gsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxMWQsJXIxNWQKKworCXhvcmwJJXIxMGQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWF4LCVyMTVkCisKKwltb3ZsCSVyMTJkLDU2KCVyc3ApCisJeG9ybAklZWN4LCVyMTRkCisJYW5kbAklcjEwZCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVieCwlcjEyZAorCXhvcmwJJWVheCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklZWN4LCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlY3gsJXIxNGQKKworCXhvcmwJJWVkeCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlZHgsJWVieAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAklcjEyZCwlcjlkCisJYWRkbAklcjEyZCwlZWJ4CisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJWVieAorCW1vdmwJNjAoJXJzaSksJXIxMmQKKwltb3ZsCSVyOWQsJXIxM2QKKwltb3ZsCSVlYngsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxMGQsJWVkaQorCisJeG9ybAklcjlkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJWVkaQorCisJbW92bAklcjEyZCw2MCglcnNwKQorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWF4LCVyMTJkCisJeG9ybAklcjExZCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklZWJ4LCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVieCwlcjE0ZAorCisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWN4LCVlYXgKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVlYXgKKwlhZGRsCSVyMTJkLCVyOGQKKwlhZGRsCSVyMTJkLCVlYXgKKworCWxlYXEJMjAoJXJicCksJXJicAorCWptcAkuTHJvdW5kc18xNl94eAorLmFsaWduCTE2CisuTHJvdW5kc18xNl94eDoKKwltb3ZsCTQoJXJzcCksJXIxM2QKKwltb3ZsCTU2KCVyc3ApLCVyMTVkCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVlYXgKKwltb3ZsCSVyMTVkLCVyMTRkCisJcm9ybAkkMiwlcjE1ZAorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlcjE1ZAorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlcjE1ZAorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVyMTVkCisJYWRkbAkzNiglcnNwKSwlcjEyZAorCisJYWRkbAkwKCVyc3ApLCVyMTJkCisJbW92bAklcjhkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCW1vdmwJJWVheCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjlkLCVyMTVkCisKKwl4b3JsCSVyOGQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjEwZCwlcjE1ZAorCisJbW92bAklcjEyZCwwKCVyc3ApCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklZWF4LCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlYXgsJXIxNGQKKworCXhvcmwJJWVieCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlYngsJXIxMWQKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKwlhZGRsCSVyMTJkLCVyMTFkCisKKwlsZWFxCTQoJXJicCksJXJicAorCW1vdmwJOCglcnNwKSwlcjEzZAorCW1vdmwJNjAoJXJzcCksJWVkaQorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlcjExZAorCW1vdmwJJWVkaSwlcjE0ZAorCXJvcmwJJDIsJWVkaQorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlZWRpCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVlZGkKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlZWRpCisJYWRkbAk0MCglcnNwKSwlcjEyZAorCisJYWRkbAk0KCVyc3ApLCVyMTJkCisJbW92bAklZWR4LCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisJbW92bAklcjExZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjhkLCVlZGkKKworCXhvcmwJJWVkeCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOWQsJWVkaQorCisJbW92bAklcjEyZCw0KCVyc3ApCisJeG9ybAklcjExZCwlcjE0ZAorCWFuZGwJJWVkeCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjEwZCwlcjEyZAorCXhvcmwJJXI5ZCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVkeCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklcjExZCwlZWRpCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTRkCisKKwl4b3JsCSVlYXgsJWVkaQorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlYXgsJXIxMGQKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVyMTBkCisJYWRkbAklcjEyZCwlZWN4CisJYWRkbAklcjEyZCwlcjEwZAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTEyKCVyc3ApLCVyMTNkCisJbW92bAkwKCVyc3ApLCVyMTVkCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVyMTBkCisJbW92bAklcjE1ZCwlcjE0ZAorCXJvcmwJJDIsJXIxNWQKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJXIxNWQKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlcjE1ZAorCWFkZGwJNDQoJXJzcCksJXIxMmQKKworCWFkZGwJOCglcnNwKSwlcjEyZAorCW1vdmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKwltb3ZsCSVyMTBkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlZHgsJXIxNWQKKworCXhvcmwJJWVjeCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOGQsJXIxNWQKKworCW1vdmwJJXIxMmQsOCglcnNwKQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhbmRsCSVlY3gsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVyOWQsJXIxMmQKKwl4b3JsCSVyOGQsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklcjEwZCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjEwZCwlcjE0ZAorCisJeG9ybAklcjExZCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyMTFkLCVyOWQKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJXI5ZAorCWFkZGwJJXIxMmQsJWVieAorCWFkZGwJJXIxMmQsJXI5ZAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTE2KCVyc3ApLCVyMTNkCisJbW92bAk0KCVyc3ApLCVlZGkKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJXI5ZAorCW1vdmwJJWVkaSwlcjE0ZAorCXJvcmwJJDIsJWVkaQorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlZWRpCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVlZGkKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlZWRpCisJYWRkbAk0OCglcnNwKSwlcjEyZAorCisJYWRkbAkxMiglcnNwKSwlcjEyZAorCW1vdmwJJWVieCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCW1vdmwJJXI5ZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWN4LCVlZGkKKworCXhvcmwJJWVieCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlZHgsJWVkaQorCisJbW92bAklcjEyZCwxMiglcnNwKQorCXhvcmwJJXI5ZCwlcjE0ZAorCWFuZGwJJWVieCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjhkLCVyMTJkCisJeG9ybAklZWR4LCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVyOWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjlkLCVyMTRkCisKKwl4b3JsCSVyMTBkLCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjEwZCwlcjhkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjhkCisJYWRkbAklcjEyZCwlZWF4CisJYWRkbAklcjEyZCwlcjhkCisKKwlsZWFxCTIwKCVyYnApLCVyYnAKKwltb3ZsCTIwKCVyc3ApLCVyMTNkCisJbW92bAk4KCVyc3ApLCVyMTVkCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVyOGQKKwltb3ZsCSVyMTVkLCVyMTRkCisJcm9ybAkkMiwlcjE1ZAorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlcjE1ZAorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlcjE1ZAorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVyMTVkCisJYWRkbAk1MiglcnNwKSwlcjEyZAorCisJYWRkbAkxNiglcnNwKSwlcjEyZAorCW1vdmwJJWVheCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKwltb3ZsCSVyOGQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVieCwlcjE1ZAorCisJeG9ybAklZWF4LCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVjeCwlcjE1ZAorCisJbW92bAklcjEyZCwxNiglcnNwKQorCXhvcmwJJXI4ZCwlcjE0ZAorCWFuZGwJJWVheCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVkeCwlcjEyZAorCXhvcmwJJWVjeCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlYXgsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVyOGQsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXI4ZCwlcjE0ZAorCisJeG9ybAklcjlkLCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXI5ZCwlZWR4CisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVlZHgKKwlhZGRsCSVyMTJkLCVyMTFkCisJYWRkbAklcjEyZCwlZWR4CisKKwlsZWFxCTQoJXJicCksJXJicAorCW1vdmwJMjQoJXJzcCksJXIxM2QKKwltb3ZsCTEyKCVyc3ApLCVlZGkKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJWVkeAorCW1vdmwJJWVkaSwlcjE0ZAorCXJvcmwJJDIsJWVkaQorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlZWRpCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVlZGkKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlZWRpCisJYWRkbAk1NiglcnNwKSwlcjEyZAorCisJYWRkbAkyMCglcnNwKSwlcjEyZAorCW1vdmwJJXIxMWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKwltb3ZsCSVlZHgsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVheCwlZWRpCisKKwl4b3JsCSVyMTFkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVieCwlZWRpCisKKwltb3ZsCSVyMTJkLDIwKCVyc3ApCisJeG9ybAklZWR4LCVyMTRkCisJYW5kbAklcjExZCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWN4LCVyMTJkCisJeG9ybAklZWJ4LCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklZWR4LCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVkeCwlcjE0ZAorCisJeG9ybAklcjhkLCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjhkLCVlY3gKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVlY3gKKwlhZGRsCSVyMTJkLCVyMTBkCisJYWRkbAklcjEyZCwlZWN4CisKKwlsZWFxCTQoJXJicCksJXJicAorCW1vdmwJMjgoJXJzcCksJXIxM2QKKwltb3ZsCTE2KCVyc3ApLCVyMTVkCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVlY3gKKwltb3ZsCSVyMTVkLCVyMTRkCisJcm9ybAkkMiwlcjE1ZAorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlcjE1ZAorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlcjE1ZAorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVyMTVkCisJYWRkbAk2MCglcnNwKSwlcjEyZAorCisJYWRkbAkyNCglcnNwKSwlcjEyZAorCW1vdmwJJXIxMGQsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisJbW92bAklZWN4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTFkLCVyMTVkCisKKwl4b3JsCSVyMTBkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVheCwlcjE1ZAorCisJbW92bAklcjEyZCwyNCglcnNwKQorCXhvcmwJJWVjeCwlcjE0ZAorCWFuZGwJJXIxMGQsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlYngsJXIxMmQKKwl4b3JsCSVlYXgsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJWVjeCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWN4LCVyMTRkCisKKwl4b3JsCSVlZHgsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWR4LCVlYngKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJJXIxMmQsJXI5ZAorCWFkZGwJJXIxMmQsJWVieAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTMyKCVyc3ApLCVyMTNkCisJbW92bAkyMCglcnNwKSwlZWRpCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVlYngKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJMCglcnNwKSwlcjEyZAorCisJYWRkbAkyOCglcnNwKSwlcjEyZAorCW1vdmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCW1vdmwJJWVieCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjEwZCwlZWRpCisKKwl4b3JsCSVyOWQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjExZCwlZWRpCisKKwltb3ZsCSVyMTJkLDI4KCVyc3ApCisJeG9ybAklZWJ4LCVyMTRkCisJYW5kbAklcjlkLCVlZGkKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlYXgsJXIxMmQKKwl4b3JsCSVyMTFkLCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVlYngsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWJ4LCVyMTRkCisKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlY3gsJWVheAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJWVheAorCWFkZGwJJXIxMmQsJXI4ZAorCWFkZGwJJXIxMmQsJWVheAorCisJbGVhcQkyMCglcmJwKSwlcmJwCisJbW92bAkzNiglcnNwKSwlcjEzZAorCW1vdmwJMjQoJXJzcCksJXIxNWQKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJWVheAorCW1vdmwJJXIxNWQsJXIxNGQKKwlyb3JsCSQyLCVyMTVkCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVyMTVkCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVyMTVkCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlhZGRsCTQoJXJzcCksJXIxMmQKKworCWFkZGwJMzIoJXJzcCksJXIxMmQKKwltb3ZsCSVyOGQsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisJbW92bAklZWF4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyOWQsJXIxNWQKKworCXhvcmwJJXI4ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTVkCisKKwltb3ZsCSVyMTJkLDMyKCVyc3ApCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklZWF4LCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlYXgsJXIxNGQKKworCXhvcmwJJWVieCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlYngsJXIxMWQKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKwlhZGRsCSVyMTJkLCVyMTFkCisKKwlsZWFxCTQoJXJicCksJXJicAorCW1vdmwJNDAoJXJzcCksJXIxM2QKKwltb3ZsCTI4KCVyc3ApLCVlZGkKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJXIxMWQKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJOCglcnNwKSwlcjEyZAorCisJYWRkbAkzNiglcnNwKSwlcjEyZAorCW1vdmwJJWVkeCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCW1vdmwJJXIxMWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXI4ZCwlZWRpCisKKwl4b3JsCSVlZHgsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVlZGkKKworCW1vdmwJJXIxMmQsMzYoJXJzcCkKKwl4b3JsCSVyMTFkLCVyMTRkCisJYW5kbAklZWR4LCVlZGkKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVyMTBkLCVyMTJkCisJeG9ybAklcjlkLCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWR4LCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVyMTFkLCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXIxMWQsJXIxNGQKKworCXhvcmwJJWVheCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVheCwlcjEwZAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJXIxMGQKKwlhZGRsCSVyMTJkLCVlY3gKKwlhZGRsCSVyMTJkLCVyMTBkCisKKwlsZWFxCTQoJXJicCksJXJicAorCW1vdmwJNDQoJXJzcCksJXIxM2QKKwltb3ZsCTMyKCVyc3ApLCVyMTVkCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVyMTBkCisJbW92bAklcjE1ZCwlcjE0ZAorCXJvcmwJJDIsJXIxNWQKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJXIxNWQKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlcjE1ZAorCWFkZGwJMTIoJXJzcCksJXIxMmQKKworCWFkZGwJNDAoJXJzcCksJXIxMmQKKwltb3ZsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisJbW92bAklcjEwZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWR4LCVyMTVkCisKKwl4b3JsCSVlY3gsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjhkLCVyMTVkCisKKwltb3ZsCSVyMTJkLDQwKCVyc3ApCisJeG9ybAklcjEwZCwlcjE0ZAorCWFuZGwJJWVjeCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXI5ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVyMTBkLCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTRkCisKKwl4b3JsCSVyMTFkLCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXIxMWQsJXI5ZAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlcjlkCisJYWRkbAklcjEyZCwlZWJ4CisJYWRkbAklcjEyZCwlcjlkCisKKwlsZWFxCTQoJXJicCksJXJicAorCW1vdmwJNDgoJXJzcCksJXIxM2QKKwltb3ZsCTM2KCVyc3ApLCVlZGkKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJXI5ZAorCW1vdmwJJWVkaSwlcjE0ZAorCXJvcmwJJDIsJWVkaQorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlZWRpCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVlZGkKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlZWRpCisJYWRkbAkxNiglcnNwKSwlcjEyZAorCisJYWRkbAk0NCglcnNwKSwlcjEyZAorCW1vdmwJJWVieCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCW1vdmwJJXI5ZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWN4LCVlZGkKKworCXhvcmwJJWVieCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlZHgsJWVkaQorCisJbW92bAklcjEyZCw0NCglcnNwKQorCXhvcmwJJXI5ZCwlcjE0ZAorCWFuZGwJJWVieCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjhkLCVyMTJkCisJeG9ybAklZWR4LCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVyOWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjlkLCVyMTRkCisKKwl4b3JsCSVyMTBkLCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjEwZCwlcjhkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjhkCisJYWRkbAklcjEyZCwlZWF4CisJYWRkbAklcjEyZCwlcjhkCisKKwlsZWFxCTIwKCVyYnApLCVyYnAKKwltb3ZsCTUyKCVyc3ApLCVyMTNkCisJbW92bAk0MCglcnNwKSwlcjE1ZAorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlcjhkCisJbW92bAklcjE1ZCwlcjE0ZAorCXJvcmwJJDIsJXIxNWQKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJXIxNWQKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlcjE1ZAorCWFkZGwJMjAoJXJzcCksJXIxMmQKKworCWFkZGwJNDgoJXJzcCksJXIxMmQKKwltb3ZsCSVlYXgsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisJbW92bAklcjhkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlYngsJXIxNWQKKworCXhvcmwJJWVheCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlY3gsJXIxNWQKKworCW1vdmwJJXIxMmQsNDgoJXJzcCkKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlY3gsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklcjhkLCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyOGQsJXIxNGQKKworCXhvcmwJJXI5ZCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyOWQsJWVkeAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklcjEyZCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTU2KCVyc3ApLCVyMTNkCisJbW92bAk0NCglcnNwKSwlZWRpCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVlZHgKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJMjQoJXJzcCksJXIxMmQKKworCWFkZGwJNTIoJXJzcCksJXIxMmQKKwltb3ZsCSVyMTFkLCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisJbW92bAklZWR4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlYXgsJWVkaQorCisJeG9ybAklcjExZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYngsJWVkaQorCisJbW92bAklcjEyZCw1MiglcnNwKQorCXhvcmwJJWVkeCwlcjE0ZAorCWFuZGwJJXIxMWQsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVjeCwlcjEyZAorCXhvcmwJJWVieCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJWVkeCwlZWRpCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlZHgsJXIxNGQKKworCXhvcmwJJXI4ZCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXI4ZCwlZWN4CisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlZWN4CisJYWRkbAklcjEyZCwlcjEwZAorCWFkZGwJJXIxMmQsJWVjeAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTYwKCVyc3ApLCVyMTNkCisJbW92bAk0OCglcnNwKSwlcjE1ZAorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlZWN4CisJbW92bAklcjE1ZCwlcjE0ZAorCXJvcmwJJDIsJXIxNWQKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJXIxNWQKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlcjE1ZAorCWFkZGwJMjgoJXJzcCksJXIxMmQKKworCWFkZGwJNTYoJXJzcCksJXIxMmQKKwltb3ZsCSVyMTBkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCW1vdmwJJWVjeCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjExZCwlcjE1ZAorCisJeG9ybAklcjEwZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYXgsJXIxNWQKKworCW1vdmwJJXIxMmQsNTYoJXJzcCkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWJ4LCVyMTJkCisJeG9ybAklZWF4LCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVlY3gsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVjeCwlcjE0ZAorCisJeG9ybAklZWR4LCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVkeCwlZWJ4CisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSVyMTJkLCVyOWQKKwlhZGRsCSVyMTJkLCVlYngKKworCWxlYXEJNCglcmJwKSwlcmJwCisJbW92bAkwKCVyc3ApLCVyMTNkCisJbW92bAk1MiglcnNwKSwlZWRpCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVlYngKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJMzIoJXJzcCksJXIxMmQKKworCWFkZGwJNjAoJXJzcCksJXIxMmQKKwltb3ZsCSVyOWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKwltb3ZsCSVlYngsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxMGQsJWVkaQorCisJeG9ybAklcjlkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJWVkaQorCisJbW92bAklcjEyZCw2MCglcnNwKQorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWF4LCVyMTJkCisJeG9ybAklcjExZCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklZWJ4LCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVieCwlcjE0ZAorCisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWN4LCVlYXgKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVlYXgKKwlhZGRsCSVyMTJkLCVyOGQKKwlhZGRsCSVyMTJkLCVlYXgKKworCWxlYXEJMjAoJXJicCksJXJicAorCWNtcGIJJDAsMyglcmJwKQorCWpuegkuTHJvdW5kc18xNl94eAorCisJbW92cQk2NCswKCVyc3ApLCVyZGkKKwlhZGRsCSVyMTRkLCVlYXgKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKworCWFkZGwJMCglcmRpKSwlZWF4CisJYWRkbAk0KCVyZGkpLCVlYngKKwlhZGRsCTgoJXJkaSksJWVjeAorCWFkZGwJMTIoJXJkaSksJWVkeAorCWFkZGwJMTYoJXJkaSksJXI4ZAorCWFkZGwJMjAoJXJkaSksJXI5ZAorCWFkZGwJMjQoJXJkaSksJXIxMGQKKwlhZGRsCTI4KCVyZGkpLCVyMTFkCisKKwljbXBxCTY0KzE2KCVyc3ApLCVyc2kKKworCW1vdmwJJWVheCwwKCVyZGkpCisJbW92bAklZWJ4LDQoJXJkaSkKKwltb3ZsCSVlY3gsOCglcmRpKQorCW1vdmwJJWVkeCwxMiglcmRpKQorCW1vdmwJJXI4ZCwxNiglcmRpKQorCW1vdmwJJXI5ZCwyMCglcmRpKQorCW1vdmwJJXIxMGQsMjQoJXJkaSkKKwltb3ZsCSVyMTFkLDI4KCVyZGkpCisJamIJLkxsb29wCisKKwltb3ZxCTg4KCVyc3ApLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGVwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIsLi1zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLmFsaWduCTY0CisudHlwZQlLMjU2LEBvYmplY3QKK0syNTY6CisubG9uZwkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisubG9uZwkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisubG9uZwkweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1CisubG9uZwkweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1CisubG9uZwkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzCisubG9uZwkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzCisubG9uZwkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisubG9uZwkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisubG9uZwkweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjCisubG9uZwkweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjCisubG9uZwkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhCisubG9uZwkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhCisubG9uZwkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisubG9uZwkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisubG9uZwkweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3CisubG9uZwkweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3CisubG9uZwkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzCisubG9uZwkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzCisubG9uZwkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisubG9uZwkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisubG9uZwkweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzCisubG9uZwkweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzCisubG9uZwkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwCisubG9uZwkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwCisubG9uZwkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisubG9uZwkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisubG9uZwkweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzCisubG9uZwkweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzCisubG9uZwkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4CisubG9uZwkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4CisubG9uZwkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisubG9uZwkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5sb25nCTB4MDMwMjAxMDAsMHgwYjBhMDkwOCwweGZmZmZmZmZmLDB4ZmZmZmZmZmYKKy5sb25nCTB4MDMwMjAxMDAsMHgwYjBhMDkwOCwweGZmZmZmZmZmLDB4ZmZmZmZmZmYKKy5sb25nCTB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweDAzMDIwMTAwLDB4MGIwYTA5MDgKKy5sb25nCTB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweDAzMDIwMTAwLDB4MGIwYTA5MDgKKy5ieXRlCTgzLDcyLDY1LDUwLDUzLDU0LDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcsMTEwLDExNSwxMDIsMTExLDExNCwxMDksMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy50eXBlCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX3Nzc2UzLEBmdW5jdGlvbgorLmFsaWduCTY0CitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMzoKKy5jZmlfc3RhcnRwcm9jCQorLkxzc3NlM19zaG9ydGN1dDoKKwltb3ZxCSVyc3AsJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKwlwdXNocQklcmJ4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKwlzaGxxCSQ0LCVyZHgKKwlzdWJxCSQ5NiwlcnNwCisJbGVhcQkoJXJzaSwlcmR4LDQpLCVyZHgKKwlhbmRxCSQtNjQsJXJzcAorCW1vdnEJJXJkaSw2NCswKCVyc3ApCisJbW92cQklcnNpLDY0KzgoJXJzcCkKKwltb3ZxCSVyZHgsNjQrMTYoJXJzcCkKKwltb3ZxCSVyYXgsODgoJXJzcCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwNiwweDc3LDB4ZDgsMHgwMCwweDA2LDB4MjMsMHgwOAorLkxwcm9sb2d1ZV9zc3NlMzoKKworCW1vdmwJMCglcmRpKSwlZWF4CisJbW92bAk0KCVyZGkpLCVlYngKKwltb3ZsCTgoJXJkaSksJWVjeAorCW1vdmwJMTIoJXJkaSksJWVkeAorCW1vdmwJMTYoJXJkaSksJXI4ZAorCW1vdmwJMjAoJXJkaSksJXI5ZAorCW1vdmwJMjQoJXJkaSksJXIxMGQKKwltb3ZsCTI4KCVyZGkpLCVyMTFkCisKKworCWptcAkuTGxvb3Bfc3NzZTMKKy5hbGlnbgkxNgorLkxsb29wX3Nzc2UzOgorCW1vdmRxYQlLMjU2KzUxMiglcmlwKSwleG1tNworCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTMKKwlsZWFxCUsyNTYoJXJpcCksJXJicAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisJbW92ZHFhCTAoJXJicCksJXhtbTQKKwltb3ZkcWEJMzIoJXJicCksJXhtbTUKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorCXBhZGRkCSV4bW0wLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKwltb3ZkcWEJOTYoJXJicCksJXhtbTcKKwlwYWRkZAkleG1tMSwleG1tNQorCXBhZGRkCSV4bW0yLCV4bW02CisJcGFkZGQJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTQsMCglcnNwKQorCW1vdmwJJWVheCwlcjE0ZAorCW1vdmRxYQkleG1tNSwxNiglcnNwKQorCW1vdmwJJWVieCwlZWRpCisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJeG9ybAklZWN4LCVlZGkKKwltb3ZkcWEJJXhtbTcsNDgoJXJzcCkKKwltb3ZsCSVyOGQsJXIxM2QKKwlqbXAJLkxzc3NlM18wMF80NworCisuYWxpZ24JMTYKKy5Mc3NzZTNfMDBfNDc6CisJc3VicQkkLTEyOCwlcmJwCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwltb3ZsCSVyMTRkLCVlYXgKKwltb3ZsCSVyOWQsJXIxMmQKKwltb3ZkcWEJJXhtbTMsJXhtbTcKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJeG9ybAklcjEwZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlYXgsJXIxNGQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjQsNAorCWFuZGwJJXI4ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjEzZAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1MCw0CisJYWRkbAkwKCVyc3ApLCVyMTFkCisJbW92bAklZWF4LCVyMTVkCisJeG9ybAklcjEwZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJbW92ZHFhCSV4bW00LCV4bW01CisJeG9ybAklZWJ4LCVyMTVkCisJYWRkbAklcjEyZCwlcjExZAorCW1vdmRxYQkleG1tNCwleG1tNgorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwlwc3JsZAkkMywleG1tNAorCXhvcmwJJWVheCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMWQKKwl4b3JsCSVlYngsJWVkaQorCXBhZGRkCSV4bW03LCV4bW0wCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCXBzcmxkCSQ3LCV4bW02CisJYWRkbAklZWRpLCVyMTFkCisJbW92bAklZWR4LCVyMTNkCisJcHNodWZkCSQyNTAsJXhtbTMsJXhtbTcKKwlhZGRsCSVyMTFkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwlwc2xsZAkkMTQsJXhtbTUKKwltb3ZsCSVyMTRkLCVyMTFkCisJbW92bAklcjhkLCVyMTJkCisJcHhvcgkleG1tNiwleG1tNAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwl4b3JsCSVyOWQsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJcHNybGQJJDExLCV4bW02CisJeG9ybAklcjExZCwlcjE0ZAorCXB4b3IJJXhtbTUsJXhtbTQKKwlhbmRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlZHgsJXIxM2QKKwlwc2xsZAkkMTEsJXhtbTUKKwlhZGRsCTQoJXJzcCksJXIxMGQKKwltb3ZsCSVyMTFkLCVlZGkKKwlweG9yCSV4bW02LCV4bW00CisJeG9ybAklcjlkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJXIxMmQsJXIxMGQKKwlweG9yCSV4bW01LCV4bW00CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlwc3JsZAkkMTAsJXhtbTcKKwlhZGRsCSVyMTNkLCVyMTBkCisJeG9ybAklZWF4LCVyMTVkCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEwZCwlZWN4CisJcHNybHEJJDE3LCV4bW02CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxMGQsJXIxNGQKKwlweG9yCSV4bW02LCV4bW03CisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTBkCisJbW92bAklZWR4LCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXBzcmxxCSQyLCV4bW02CisJeG9ybAklZWN4LCVyMTNkCisJeG9ybAklcjhkLCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTRkCisJYW5kbAklZWN4LCVyMTJkCisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTgoJXJzcCksJXI5ZAorCW1vdmwJJXIxMGQsJXIxNWQKKwlwc3JsZHEJJDgsJXhtbTcKKwl4b3JsCSVyOGQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVyOWQKKwlyb3JsCSQ2LCVyMTNkCisJcGFkZGQJJXhtbTcsJXhtbTAKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYWRkbAklcjEzZCwlcjlkCisJcHNodWZkCSQ4MCwleG1tMCwleG1tNworCXhvcmwJJXIxMWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyOWQsJWVieAorCW1vdmRxYQkleG1tNywleG1tNgorCWFkZGwJJWVkaSwlcjlkCisJbW92bAklZWJ4LCVyMTNkCisJcHNybGQJJDEwLCV4bW03CisJYWRkbAklcjlkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwlwc3JscQkkMTcsJXhtbTYKKwltb3ZsCSVyMTRkLCVyOWQKKwltb3ZsCSVlY3gsJXIxMmQKKwlweG9yCSV4bW02LCV4bW03CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCXhvcmwJJWVkeCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyOWQsJXIxNGQKKwlwc3JscQkkMiwleG1tNgorCWFuZGwJJWVieCwlcjEyZAorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJMTIoJXJzcCksJXI4ZAorCXB4b3IJJXhtbTYsJXhtbTcKKwltb3ZsCSVyOWQsJWVkaQorCXhvcmwJJWVkeCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJcHNodWZkCSQ4LCV4bW03LCV4bW03CisJeG9ybAklcjEwZCwlZWRpCisJYWRkbAklcjEyZCwlcjhkCisJbW92ZHFhCTAoJXJicCksJXhtbTYKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklcjlkLCVyMTRkCisJYWRkbAklcjEzZCwlcjhkCisJeG9ybAklcjEwZCwlcjE1ZAorCXBhZGRkCSV4bW03LCV4bW0wCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJcGFkZGQJJXhtbTAsJXhtbTYKKwltb3ZsCSVlYXgsJXIxM2QKKwlhZGRsCSVyOGQsJXIxNGQKKwltb3ZkcWEJJXhtbTYsMCglcnNwKQorCXJvcmwJJDE0LCVyMTNkCisJbW92ZHFhCSV4bW0yLCV4bW00CisJbW92bAklcjE0ZCwlcjhkCisJbW92bAklZWJ4LCVyMTJkCisJbW92ZHFhCSV4bW0wLCV4bW03CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCXhvcmwJJWVjeCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyOGQsJXIxNGQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjUsNAorCWFuZGwJJWVheCwlcjEyZAorCXhvcmwJJWVheCwlcjEzZAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1MSw0CisJYWRkbAkxNiglcnNwKSwlZWR4CisJbW92bAklcjhkLCVyMTVkCisJeG9ybAklZWN4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwl4b3JsCSVyOWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVlZHgKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJcHNybGQJJDMsJXhtbTQKKwl4b3JsCSVyOGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVlZHgKKwl4b3JsCSVyOWQsJWVkaQorCXBhZGRkCSV4bW03LCV4bW0xCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVkeCwlcjExZAorCXBzcmxkCSQ3LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVyMTFkLCVyMTNkCisJcHNodWZkCSQyNTAsJXhtbTAsJXhtbTcKKwlhZGRsCSVlZHgsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCXBzbGxkCSQxNCwleG1tNQorCW1vdmwJJXIxNGQsJWVkeAorCW1vdmwJJWVheCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCXhvcmwJJWVieCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwlwc3JsZAkkMTEsJXhtbTYKKwl4b3JsCSVlZHgsJXIxNGQKKwlweG9yCSV4bW01LCV4bW00CisJYW5kbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlwc2xsZAkkMTEsJXhtbTUKKwlhZGRsCTIwKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXB4b3IJJXhtbTYsJXhtbTQKKwl4b3JsCSVlYngsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCW1vdmRxYQkleG1tNywleG1tNgorCXhvcmwJJXI4ZCwlZWRpCisJYWRkbAklcjEyZCwlZWN4CisJcHhvcgkleG1tNSwleG1tNAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlZHgsJXIxNGQKKwlwc3JsZAkkMTAsJXhtbTcKKwlhZGRsCSVyMTNkLCVlY3gKKwl4b3JsCSVyOGQsJXIxNWQKKwlwYWRkZAkleG1tNCwleG1tMQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlY3gsJXIxMGQKKwlwc3JscQkkMTcsJXhtbTYKKwlhZGRsCSVyMTVkLCVlY3gKKwltb3ZsCSVyMTBkLCVyMTNkCisJYWRkbAklZWN4LCVyMTRkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlZWN4CisJbW92bAklcjExZCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwlwc3JscQkkMiwleG1tNgorCXhvcmwJJXIxMGQsJXIxM2QKKwl4b3JsCSVlYXgsJXIxMmQKKwlweG9yCSV4bW02LCV4bW03CisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVjeCwlcjE0ZAorCWFuZGwJJXIxMGQsJXIxMmQKKwlwc2h1ZmQJJDEyOCwleG1tNywleG1tNworCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCTI0KCVyc3ApLCVlYngKKwltb3ZsCSVlY3gsJXIxNWQKKwlwc3JsZHEJJDgsJXhtbTcKKwl4b3JsCSVlYXgsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVkeCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVieAorCXJvcmwJJDYsJXIxM2QKKwlwYWRkZAkleG1tNywleG1tMQorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVjeCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVieAorCXBzaHVmZAkkODAsJXhtbTEsJXhtbTcKKwl4b3JsCSVlZHgsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlYngsJXI5ZAorCW1vdmRxYQkleG1tNywleG1tNgorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklcjlkLCVyMTNkCisJcHNybGQJJDEwLCV4bW03CisJYWRkbAklZWJ4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwlwc3JscQkkMTcsJXhtbTYKKwltb3ZsCSVyMTRkLCVlYngKKwltb3ZsCSVyMTBkLCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVieCwlcjE0ZAorCXBzcmxxCSQyLCV4bW02CisJYW5kbAklcjlkLCVyMTJkCisJeG9ybAklcjlkLCVyMTNkCisJYWRkbAkyOCglcnNwKSwlZWF4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJJWVieCwlZWRpCisJeG9ybAklcjExZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJcHNodWZkCSQ4LCV4bW03LCV4bW03CisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVyMTJkLCVlYXgKKwltb3ZkcWEJMzIoJXJicCksJXhtbTYKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklZWJ4LCVyMTRkCisJYWRkbAklcjEzZCwlZWF4CisJeG9ybAklZWN4LCVyMTVkCisJcGFkZGQJJXhtbTcsJXhtbTEKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWF4LCVyOGQKKwlhZGRsCSVyMTVkLCVlYXgKKwlwYWRkZAkleG1tMSwleG1tNgorCW1vdmwJJXI4ZCwlcjEzZAorCWFkZGwJJWVheCwlcjE0ZAorCW1vdmRxYQkleG1tNiwxNiglcnNwKQorCXJvcmwJJDE0LCVyMTNkCisJbW92ZHFhCSV4bW0zLCV4bW00CisJbW92bAklcjE0ZCwlZWF4CisJbW92bAklcjlkLCVyMTJkCisJbW92ZHFhCSV4bW0xLCV4bW03CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklZWF4LCVyMTRkCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI2LDQKKwlhbmRsCSVyOGQsJXIxMmQKKwl4b3JsCSVyOGQsJXIxM2QKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDgsNAorCWFkZGwJMzIoJXJzcCksJXIxMWQKKwltb3ZsCSVlYXgsJXIxNWQKKwl4b3JsCSVyMTBkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwl4b3JsCSVlYngsJXIxNWQKKwlhZGRsCSVyMTJkLCVyMTFkCisJbW92ZHFhCSV4bW00LCV4bW02CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXBzcmxkCSQzLCV4bW00CisJeG9ybAklZWF4LCVyMTRkCisJYWRkbAklcjEzZCwlcjExZAorCXhvcmwJJWVieCwlZWRpCisJcGFkZGQJJXhtbTcsJXhtbTIKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjExZCwlZWR4CisJcHNybGQJJDcsJXhtbTYKKwlhZGRsCSVlZGksJXIxMWQKKwltb3ZsCSVlZHgsJXIxM2QKKwlwc2h1ZmQJJDI1MCwleG1tMSwleG1tNworCWFkZGwJJXIxMWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCXBzbGxkCSQxNCwleG1tNQorCW1vdmwJJXIxNGQsJXIxMWQKKwltb3ZsCSVyOGQsJXIxMmQKKwlweG9yCSV4bW02LCV4bW00CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVkeCwlcjEzZAorCXhvcmwJJXI5ZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwlwc3JsZAkkMTEsJXhtbTYKKwl4b3JsCSVyMTFkLCVyMTRkCisJcHhvcgkleG1tNSwleG1tNAorCWFuZGwJJWVkeCwlcjEyZAorCXhvcmwJJWVkeCwlcjEzZAorCXBzbGxkCSQxMSwleG1tNQorCWFkZGwJMzYoJXJzcCksJXIxMGQKKwltb3ZsCSVyMTFkLCVlZGkKKwlweG9yCSV4bW02LCV4bW00CisJeG9ybAklcjlkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJXIxMmQsJXIxMGQKKwlweG9yCSV4bW01LCV4bW00CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlwc3JsZAkkMTAsJXhtbTcKKwlhZGRsCSVyMTNkLCVyMTBkCisJeG9ybAklZWF4LCVyMTVkCisJcGFkZGQJJXhtbTQsJXhtbTIKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEwZCwlZWN4CisJcHNybHEJJDE3LCV4bW02CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxMGQsJXIxNGQKKwlweG9yCSV4bW02LCV4bW03CisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTBkCisJbW92bAklZWR4LCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXBzcmxxCSQyLCV4bW02CisJeG9ybAklZWN4LCVyMTNkCisJeG9ybAklcjhkLCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTRkCisJYW5kbAklZWN4LCVyMTJkCisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTQwKCVyc3ApLCVyOWQKKwltb3ZsCSVyMTBkLCVyMTVkCisJcHNybGRxCSQ4LCV4bW03CisJeG9ybAklcjhkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTVkCisJYWRkbAklcjEyZCwlcjlkCisJcm9ybAkkNiwlcjEzZAorCXBhZGRkCSV4bW03LCV4bW0yCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjEwZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI5ZAorCXBzaHVmZAkkODAsJXhtbTIsJXhtbTcKKwl4b3JsCSVyMTFkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjlkLCVlYngKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlhZGRsCSVlZGksJXI5ZAorCW1vdmwJJWVieCwlcjEzZAorCXBzcmxkCSQxMCwleG1tNworCWFkZGwJJXI5ZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJcHNybHEJJDE3LCV4bW02CisJbW92bAklcjE0ZCwlcjlkCisJbW92bAklZWN4LCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYngsJXIxM2QKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjlkLCVyMTRkCisJcHNybHEJJDIsJXhtbTYKKwlhbmRsCSVlYngsJXIxMmQKKwl4b3JsCSVlYngsJXIxM2QKKwlhZGRsCTQ0KCVyc3ApLCVyOGQKKwlweG9yCSV4bW02LCV4bW03CisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXBzaHVmZAkkOCwleG1tNywleG1tNworCXhvcmwJJXIxMGQsJWVkaQorCWFkZGwJJXIxMmQsJXI4ZAorCW1vdmRxYQk2NCglcmJwKSwleG1tNgorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwlwc2xsZHEJJDgsJXhtbTcKKwl4b3JsCSVyOWQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOGQKKwl4b3JsCSVyMTBkLCVyMTVkCisJcGFkZGQJJXhtbTcsJXhtbTIKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjhkLCVlYXgKKwlhZGRsCSVyMTVkLCVyOGQKKwlwYWRkZAkleG1tMiwleG1tNgorCW1vdmwJJWVheCwlcjEzZAorCWFkZGwJJXI4ZCwlcjE0ZAorCW1vdmRxYQkleG1tNiwzMiglcnNwKQorCXJvcmwJJDE0LCVyMTNkCisJbW92ZHFhCSV4bW0wLCV4bW00CisJbW92bAklcjE0ZCwlcjhkCisJbW92bAklZWJ4LCVyMTJkCisJbW92ZHFhCSV4bW0yLCV4bW03CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCXhvcmwJJWVjeCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyOGQsJXIxNGQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjcsNAorCWFuZGwJJWVheCwlcjEyZAorCXhvcmwJJWVheCwlcjEzZAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0OSw0CisJYWRkbAk0OCglcnNwKSwlZWR4CisJbW92bAklcjhkLCVyMTVkCisJeG9ybAklZWN4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwl4b3JsCSVyOWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVlZHgKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJcHNybGQJJDMsJXhtbTQKKwl4b3JsCSVyOGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVlZHgKKwl4b3JsCSVyOWQsJWVkaQorCXBhZGRkCSV4bW03LCV4bW0zCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVkeCwlcjExZAorCXBzcmxkCSQ3LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVyMTFkLCVyMTNkCisJcHNodWZkCSQyNTAsJXhtbTIsJXhtbTcKKwlhZGRsCSVlZHgsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCXBzbGxkCSQxNCwleG1tNQorCW1vdmwJJXIxNGQsJWVkeAorCW1vdmwJJWVheCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCXhvcmwJJWVieCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwlwc3JsZAkkMTEsJXhtbTYKKwl4b3JsCSVlZHgsJXIxNGQKKwlweG9yCSV4bW01LCV4bW00CisJYW5kbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlwc2xsZAkkMTEsJXhtbTUKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXB4b3IJJXhtbTYsJXhtbTQKKwl4b3JsCSVlYngsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCW1vdmRxYQkleG1tNywleG1tNgorCXhvcmwJJXI4ZCwlZWRpCisJYWRkbAklcjEyZCwlZWN4CisJcHhvcgkleG1tNSwleG1tNAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlZHgsJXIxNGQKKwlwc3JsZAkkMTAsJXhtbTcKKwlhZGRsCSVyMTNkLCVlY3gKKwl4b3JsCSVyOGQsJXIxNWQKKwlwYWRkZAkleG1tNCwleG1tMworCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlY3gsJXIxMGQKKwlwc3JscQkkMTcsJXhtbTYKKwlhZGRsCSVyMTVkLCVlY3gKKwltb3ZsCSVyMTBkLCVyMTNkCisJYWRkbAklZWN4LCVyMTRkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlZWN4CisJbW92bAklcjExZCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwlwc3JscQkkMiwleG1tNgorCXhvcmwJJXIxMGQsJXIxM2QKKwl4b3JsCSVlYXgsJXIxMmQKKwlweG9yCSV4bW02LCV4bW03CisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVjeCwlcjE0ZAorCWFuZGwJJXIxMGQsJXIxMmQKKwlwc2h1ZmQJJDEyOCwleG1tNywleG1tNworCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCTU2KCVyc3ApLCVlYngKKwltb3ZsCSVlY3gsJXIxNWQKKwlwc3JsZHEJJDgsJXhtbTcKKwl4b3JsCSVlYXgsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVkeCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVieAorCXJvcmwJJDYsJXIxM2QKKwlwYWRkZAkleG1tNywleG1tMworCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVjeCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVieAorCXBzaHVmZAkkODAsJXhtbTMsJXhtbTcKKwl4b3JsCSVlZHgsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlYngsJXI5ZAorCW1vdmRxYQkleG1tNywleG1tNgorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklcjlkLCVyMTNkCisJcHNybGQJJDEwLCV4bW03CisJYWRkbAklZWJ4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwlwc3JscQkkMTcsJXhtbTYKKwltb3ZsCSVyMTRkLCVlYngKKwltb3ZsCSVyMTBkLCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVieCwlcjE0ZAorCXBzcmxxCSQyLCV4bW02CisJYW5kbAklcjlkLCVyMTJkCisJeG9ybAklcjlkLCVyMTNkCisJYWRkbAk2MCglcnNwKSwlZWF4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJJWVieCwlZWRpCisJeG9ybAklcjExZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJcHNodWZkCSQ4LCV4bW03LCV4bW03CisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVyMTJkLCVlYXgKKwltb3ZkcWEJOTYoJXJicCksJXhtbTYKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklZWJ4LCVyMTRkCisJYWRkbAklcjEzZCwlZWF4CisJeG9ybAklZWN4LCVyMTVkCisJcGFkZGQJJXhtbTcsJXhtbTMKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWF4LCVyOGQKKwlhZGRsCSVyMTVkLCVlYXgKKwlwYWRkZAkleG1tMywleG1tNgorCW1vdmwJJXI4ZCwlcjEzZAorCWFkZGwJJWVheCwlcjE0ZAorCW1vdmRxYQkleG1tNiw0OCglcnNwKQorCWNtcGIJJDAsMTMxKCVyYnApCisJam5lCS5Mc3NzZTNfMDBfNDcKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVheAorCW1vdmwJJXI5ZCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOGQsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVheCwlcjE0ZAorCWFuZGwJJXI4ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjEzZAorCWFkZGwJMCglcnNwKSwlcjExZAorCW1vdmwJJWVheCwlcjE1ZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVieCwlcjE1ZAorCWFkZGwJJXIxMmQsJXIxMWQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWF4LCVyMTRkCisJYWRkbAklcjEzZCwlcjExZAorCXhvcmwJJWVieCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCWFkZGwJJWVkaSwlcjExZAorCW1vdmwJJWVkeCwlcjEzZAorCWFkZGwJJXIxMWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJXIxMWQKKwltb3ZsCSVyOGQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWR4LCVyMTNkCisJeG9ybAklcjlkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCTQoJXJzcCksJXIxMGQKKwltb3ZsCSVyMTFkLCVlZGkKKwl4b3JsCSVyOWQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklcjEyZCwlcjEwZAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyMTFkLCVyMTRkCisJYWRkbAklcjEzZCwlcjEwZAorCXhvcmwJJWVheCwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTBkLCVlY3gKKwlhZGRsCSVyMTVkLCVyMTBkCisJbW92bAklZWN4LCVyMTNkCisJYWRkbAklcjEwZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlcjEwZAorCW1vdmwJJWVkeCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwl4b3JsCSVyOGQsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjEwZCwlcjE0ZAorCWFuZGwJJWVjeCwlcjEyZAorCXhvcmwJJWVjeCwlcjEzZAorCWFkZGwJOCglcnNwKSwlcjlkCisJbW92bAklcjEwZCwlcjE1ZAorCXhvcmwJJXI4ZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjExZCwlcjE1ZAorCWFkZGwJJXIxMmQsJXI5ZAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYWRkbAklcjEzZCwlcjlkCisJeG9ybAklcjExZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXI5ZCwlZWJ4CisJYWRkbAklZWRpLCVyOWQKKwltb3ZsCSVlYngsJXIxM2QKKwlhZGRsCSVyOWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJXI5ZAorCW1vdmwJJWVjeCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYngsJXIxM2QKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjlkLCVyMTRkCisJYW5kbAklZWJ4LCVyMTJkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAkxMiglcnNwKSwlcjhkCisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMGQsJWVkaQorCWFkZGwJJXIxMmQsJXI4ZAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyOWQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOGQKKwl4b3JsCSVyMTBkLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjhkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOGQKKwltb3ZsCSVlYngsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJeG9ybAklZWN4LCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXI4ZCwlcjE0ZAorCWFuZGwJJWVheCwlcjEyZAorCXhvcmwJJWVheCwlcjEzZAorCWFkZGwJMTYoJXJzcCksJWVkeAorCW1vdmwJJXI4ZCwlcjE1ZAorCXhvcmwJJWVjeCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjlkLCVyMTVkCisJYWRkbAklcjEyZCwlZWR4CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXI4ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVkeAorCXhvcmwJJXI5ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVkeCwlcjExZAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklcjExZCwlcjEzZAorCWFkZGwJJWVkeCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlZWR4CisJbW92bAklZWF4LCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxM2QKKwl4b3JsCSVlYngsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklZWR4LCVyMTRkCisJYW5kbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlhZGRsCTIwKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjhkLCVlZGkKKwlhZGRsCSVyMTJkLCVlY3gKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWR4LCVyMTRkCisJYWRkbAklcjEzZCwlZWN4CisJeG9ybAklcjhkLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVjeCwlcjEwZAorCWFkZGwJJXIxNWQsJWVjeAorCW1vdmwJJXIxMGQsJXIxM2QKKwlhZGRsCSVlY3gsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVjeAorCW1vdmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCXhvcmwJJWVheCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTJkCisJeG9ybAklcjEwZCwlcjEzZAorCWFkZGwJMjQoJXJzcCksJWVieAorCW1vdmwJJWVjeCwlcjE1ZAorCXhvcmwJJWVheCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWR4LCVyMTVkCisJYWRkbAklcjEyZCwlZWJ4CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVjeCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVieCwlcjlkCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVyOWQsJXIxM2QKKwlhZGRsCSVlYngsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVieAorCW1vdmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJeG9ybAklcjExZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlYngsJXIxNGQKKwlhbmRsCSVyOWQsJXIxMmQKKwl4b3JsCSVyOWQsJXIxM2QKKwlhZGRsCTI4KCVyc3ApLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklcjEyZCwlZWF4CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVieCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVheAorCXhvcmwJJWVjeCwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlYXgsJXI4ZAorCWFkZGwJJXIxNWQsJWVheAorCW1vdmwJJXI4ZCwlcjEzZAorCWFkZGwJJWVheCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlZWF4CisJbW92bAklcjlkLCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTJkCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAkzMiglcnNwKSwlcjExZAorCW1vdmwJJWVheCwlcjE1ZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVieCwlcjE1ZAorCWFkZGwJJXIxMmQsJXIxMWQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWF4LCVyMTRkCisJYWRkbAklcjEzZCwlcjExZAorCXhvcmwJJWVieCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCWFkZGwJJWVkaSwlcjExZAorCW1vdmwJJWVkeCwlcjEzZAorCWFkZGwJJXIxMWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJXIxMWQKKwltb3ZsCSVyOGQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWR4LCVyMTNkCisJeG9ybAklcjlkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCTM2KCVyc3ApLCVyMTBkCisJbW92bAklcjExZCwlZWRpCisJeG9ybAklcjlkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJXIxMmQsJXIxMGQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjExZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMGQKKwl4b3JsCSVlYXgsJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEwZCwlZWN4CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxMGQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJXIxMGQKKwltb3ZsCSVlZHgsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWN4LCVyMTNkCisJeG9ybAklcjhkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXIxMGQsJXIxNGQKKwlhbmRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTQwKCVyc3ApLCVyOWQKKwltb3ZsCSVyMTBkLCVyMTVkCisJeG9ybAklcjhkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTVkCisJYWRkbAklcjEyZCwlcjlkCisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOWQKKwl4b3JsCSVyMTFkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjlkLCVlYngKKwlhZGRsCSVlZGksJXI5ZAorCW1vdmwJJWVieCwlcjEzZAorCWFkZGwJJXI5ZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlcjlkCisJbW92bAklZWN4LCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCXhvcmwJJWVkeCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJXIxMmQKKwl4b3JsCSVlYngsJXIxM2QKKwlhZGRsCTQ0KCVyc3ApLCVyOGQKKwltb3ZsCSVyOWQsJWVkaQorCXhvcmwJJWVkeCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjEwZCwlZWRpCisJYWRkbAklcjEyZCwlcjhkCisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI4ZAorCXhvcmwJJXIxMGQsJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjhkLCVlYXgKKwlhZGRsCSVyMTVkLCVyOGQKKwltb3ZsCSVlYXgsJXIxM2QKKwlhZGRsCSVyOGQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJXI4ZAorCW1vdmwJJWVieCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYXgsJXIxM2QKKwl4b3JsCSVlY3gsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjhkLCVyMTRkCisJYW5kbAklZWF4LCVyMTJkCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAk0OCglcnNwKSwlZWR4CisJbW92bAklcjhkLCVyMTVkCisJeG9ybAklZWN4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyOWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVlZHgKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjhkLCVyMTRkCisJYWRkbAklcjEzZCwlZWR4CisJeG9ybAklcjlkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWR4LCVyMTFkCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVyMTFkLCVyMTNkCisJYWRkbAklZWR4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVlZHgKKwltb3ZsCSVlYXgsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCXhvcmwJJWVieCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlZHgsJXIxNGQKKwlhbmRsCSVyMTFkLCVyMTJkCisJeG9ybAklcjExZCwlcjEzZAorCWFkZGwJNTIoJXJzcCksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZWJ4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyOGQsJWVkaQorCWFkZGwJJXIxMmQsJWVjeAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlZHgsJXIxNGQKKwlhZGRsCSVyMTNkLCVlY3gKKwl4b3JsCSVyOGQsJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWN4LCVyMTBkCisJYWRkbAklcjE1ZCwlZWN4CisJbW92bAklcjEwZCwlcjEzZAorCWFkZGwJJWVjeCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlZWN4CisJbW92bAklcjExZCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJeG9ybAklZWF4LCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVjeCwlcjE0ZAorCWFuZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAk1NiglcnNwKSwlZWJ4CisJbW92bAklZWN4LCVyMTVkCisJeG9ybAklZWF4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxNWQKKwlhZGRsCSVyMTJkLCVlYngKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWN4LCVyMTRkCisJYWRkbAklcjEzZCwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWJ4LCVyOWQKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVieCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlZWJ4CisJbW92bAklcjEwZCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlcjEyZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJNjAoJXJzcCksJWVheAorCW1vdmwJJWVieCwlZWRpCisJeG9ybAklcjExZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVyMTJkLCVlYXgKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWJ4LCVyMTRkCisJYWRkbAklcjEzZCwlZWF4CisJeG9ybAklZWN4LCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVheCwlcjhkCisJYWRkbAklcjE1ZCwlZWF4CisJbW92bAklcjhkLCVyMTNkCisJYWRkbAklZWF4LCVyMTRkCisJbW92cQk2NCswKCVyc3ApLCVyZGkKKwltb3ZsCSVyMTRkLCVlYXgKKworCWFkZGwJMCglcmRpKSwlZWF4CisJbGVhcQk2NCglcnNpKSwlcnNpCisJYWRkbAk0KCVyZGkpLCVlYngKKwlhZGRsCTgoJXJkaSksJWVjeAorCWFkZGwJMTIoJXJkaSksJWVkeAorCWFkZGwJMTYoJXJkaSksJXI4ZAorCWFkZGwJMjAoJXJkaSksJXI5ZAorCWFkZGwJMjQoJXJkaSksJXIxMGQKKwlhZGRsCTI4KCVyZGkpLCVyMTFkCisKKwljbXBxCTY0KzE2KCVyc3ApLCVyc2kKKworCW1vdmwJJWVheCwwKCVyZGkpCisJbW92bAklZWJ4LDQoJXJkaSkKKwltb3ZsCSVlY3gsOCglcmRpKQorCW1vdmwJJWVkeCwxMiglcmRpKQorCW1vdmwJJXI4ZCwxNiglcmRpKQorCW1vdmwJJXI5ZCwyMCglcmRpKQorCW1vdmwJJXIxMGQsMjQoJXJkaSkKKwltb3ZsCSVyMTFkLDI4KCVyZGkpCisJamIJLkxsb29wX3Nzc2UzCisKKwltb3ZxCTg4KCVyc3ApLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGVwaWxvZ3VlX3Nzc2UzOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMsLi1zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMworLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXZ4LEBmdW5jdGlvbgorLmFsaWduCTY0CitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9hdng6CisuY2ZpX3N0YXJ0cHJvYwkKKy5MYXZ4X3Nob3J0Y3V0OgorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorCXNobHEJJDQsJXJkeAorCXN1YnEJJDk2LCVyc3AKKwlsZWFxCSglcnNpLCVyZHgsNCksJXJkeAorCWFuZHEJJC02NCwlcnNwCisJbW92cQklcmRpLDY0KzAoJXJzcCkKKwltb3ZxCSVyc2ksNjQrOCglcnNwKQorCW1vdnEJJXJkeCw2NCsxNiglcnNwKQorCW1vdnEJJXJheCw4OCglcnNwKQorLmNmaV9lc2NhcGUJMHgwZiwweDA2LDB4NzcsMHhkOCwweDAwLDB4MDYsMHgyMywweDA4CisuTHByb2xvZ3VlX2F2eDoKKworCXZ6ZXJvdXBwZXIKKwltb3ZsCTAoJXJkaSksJWVheAorCW1vdmwJNCglcmRpKSwlZWJ4CisJbW92bAk4KCVyZGkpLCVlY3gKKwltb3ZsCTEyKCVyZGkpLCVlZHgKKwltb3ZsCTE2KCVyZGkpLCVyOGQKKwltb3ZsCTIwKCVyZGkpLCVyOWQKKwltb3ZsCTI0KCVyZGkpLCVyMTBkCisJbW92bAkyOCglcmRpKSwlcjExZAorCXZtb3ZkcWEJSzI1Nis1MTIrMzIoJXJpcCksJXhtbTgKKwl2bW92ZHFhCUsyNTYrNTEyKzY0KCVyaXApLCV4bW05CisJam1wCS5MbG9vcF9hdngKKy5hbGlnbgkxNgorLkxsb29wX2F2eDoKKwl2bW92ZHFhCUsyNTYrNTEyKCVyaXApLCV4bW03CisJdm1vdmRxdQkwKCVyc2kpLCV4bW0wCisJdm1vdmRxdQkxNiglcnNpKSwleG1tMQorCXZtb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwl2bW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJdnBzaHVmYgkleG1tNywleG1tMCwleG1tMAorCWxlYXEJSzI1NiglcmlwKSwlcmJwCisJdnBzaHVmYgkleG1tNywleG1tMSwleG1tMQorCXZwc2h1ZmIJJXhtbTcsJXhtbTIsJXhtbTIKKwl2cGFkZGQJMCglcmJwKSwleG1tMCwleG1tNAorCXZwc2h1ZmIJJXhtbTcsJXhtbTMsJXhtbTMKKwl2cGFkZGQJMzIoJXJicCksJXhtbTEsJXhtbTUKKwl2cGFkZGQJNjQoJXJicCksJXhtbTIsJXhtbTYKKwl2cGFkZGQJOTYoJXJicCksJXhtbTMsJXhtbTcKKwl2bW92ZHFhCSV4bW00LDAoJXJzcCkKKwltb3ZsCSVlYXgsJXIxNGQKKwl2bW92ZHFhCSV4bW01LDE2KCVyc3ApCisJbW92bAklZWJ4LCVlZGkKKwl2bW92ZHFhCSV4bW02LDMyKCVyc3ApCisJeG9ybAklZWN4LCVlZGkKKwl2bW92ZHFhCSV4bW03LDQ4KCVyc3ApCisJbW92bAklcjhkLCVyMTNkCisJam1wCS5MYXZ4XzAwXzQ3CisKKy5hbGlnbgkxNgorLkxhdnhfMDBfNDc6CisJc3VicQkkLTEyOCwlcmJwCisJdnBhbGlnbnIJJDQsJXhtbTAsJXhtbTEsJXhtbTQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYXgKKwltb3ZsCSVyOWQsJXIxMmQKKwl2cGFsaWducgkkNCwleG1tMiwleG1tMywleG1tNworCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJeG9ybAklcjEwZCwlcjEyZAorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTJkCisJdnBhZGRkCSV4bW03LCV4bW0wLCV4bW0wCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAkwKCVyc3ApLCVyMTFkCisJbW92bAklZWF4LCVyMTVkCisJdnBzcmxkCSQzLCV4bW00LCV4bW03CisJeG9ybAklcjEwZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVieCwlcjE1ZAorCXZwc2xsZAkkMTQsJXhtbTQsJXhtbTUKKwlhZGRsCSVyMTJkLCVyMTFkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl2cHhvcgkleG1tNiwleG1tNywleG1tNAorCXhvcmwJJWVheCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMWQKKwl4b3JsCSVlYngsJWVkaQorCXZwc2h1ZmQJJDI1MCwleG1tMywleG1tNworCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjExZCwlZWR4CisJYWRkbAklZWRpLCVyMTFkCisJdnBzcmxkCSQxMSwleG1tNiwleG1tNgorCW1vdmwJJWVkeCwlcjEzZAorCWFkZGwJJXIxMWQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCW1vdmwJJXIxNGQsJXIxMWQKKwltb3ZsCSVyOGQsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXZwc2xsZAkkMTEsJXhtbTUsJXhtbTUKKwl4b3JsCSVlZHgsJXIxM2QKKwl4b3JsCSVyOWQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJeG9ybAklcjExZCwlcjE0ZAorCWFuZGwJJWVkeCwlcjEyZAorCXhvcmwJJWVkeCwlcjEzZAorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwlhZGRsCTQoJXJzcCksJXIxMGQKKwltb3ZsCSVyMTFkLCVlZGkKKwl4b3JsCSVyOWQsJXIxMmQKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklcjEyZCwlcjEwZAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTcKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXIxMWQsJXIxNGQKKwl2cGFkZGQJJXhtbTQsJXhtbTAsJXhtbTAKKwlhZGRsCSVyMTNkLCVyMTBkCisJeG9ybAklZWF4LCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCWFkZGwJJXIxMGQsJWVjeAorCWFkZGwJJXIxNWQsJXIxMGQKKwltb3ZsCSVlY3gsJXIxM2QKKwl2cHNybHEJJDIsJXhtbTcsJXhtbTcKKwlhZGRsCSVyMTBkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjEwZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJbW92bAklZWR4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwl2cHNodWZiCSV4bW04LCV4bW02LCV4bW02CisJeG9ybAklcjhkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTRkCisJdnBhZGRkCSV4bW02LCV4bW0wLCV4bW0wCisJYW5kbAklZWN4LCVyMTJkCisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAk4KCVyc3ApLCVyOWQKKwl2cHNodWZkCSQ4MCwleG1tMCwleG1tNworCW1vdmwJJXIxMGQsJXIxNWQKKwl4b3JsCSVyOGQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJeG9ybAklcjExZCwlcjE1ZAorCWFkZGwJJXIxMmQsJXI5ZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJdnBzcmxxCSQxNywleG1tNywleG1tNworCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOWQKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXhvcmwJJXIxMWQsJWVkaQorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjlkLCVlYngKKwl2cHNybHEJJDIsJXhtbTcsJXhtbTcKKwlhZGRsCSVlZGksJXI5ZAorCW1vdmwJJWVieCwlcjEzZAorCWFkZGwJJXI5ZCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjlkCisJbW92bAklZWN4LCVyMTJkCisJdnBzaHVmYgkleG1tOSwleG1tNiwleG1tNgorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJeG9ybAklZWR4LCVyMTJkCisJdnBhZGRkCSV4bW02LCV4bW0wLCV4bW0wCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJXIxMmQKKwl2cGFkZGQJMCglcmJwKSwleG1tMCwleG1tNgorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJMTIoJXJzcCksJXI4ZAorCW1vdmwJJXI5ZCwlZWRpCisJeG9ybAklZWR4LCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjEwZCwlZWRpCisJYWRkbAklcjEyZCwlcjhkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyOWQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOGQKKwl4b3JsCSVyMTBkLCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyOGQsJWVheAorCWFkZGwJJXIxNWQsJXI4ZAorCW1vdmwJJWVheCwlcjEzZAorCWFkZGwJJXI4ZCwlcjE0ZAorCXZtb3ZkcWEJJXhtbTYsMCglcnNwKQorCXZwYWxpZ25yCSQ0LCV4bW0xLCV4bW0yLCV4bW00CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjhkCisJbW92bAklZWJ4LCVyMTJkCisJdnBhbGlnbnIJJDQsJXhtbTMsJXhtbTAsJXhtbTcKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCXhvcmwJJWVjeCwlcjEyZAorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklcjhkLCVyMTRkCisJYW5kbAklZWF4LCVyMTJkCisJdnBhZGRkCSV4bW03LCV4bW0xLCV4bW0xCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAkxNiglcnNwKSwlZWR4CisJbW92bAklcjhkLCVyMTVkCisJdnBzcmxkCSQzLCV4bW00LCV4bW03CisJeG9ybAklZWN4LCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjlkLCVyMTVkCisJdnBzbGxkCSQxNCwleG1tNCwleG1tNQorCWFkZGwJJXIxMmQsJWVkeAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTQKKwl4b3JsCSVyOGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVlZHgKKwl4b3JsCSVyOWQsJWVkaQorCXZwc2h1ZmQJJDI1MCwleG1tMCwleG1tNworCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWR4LCVyMTFkCisJYWRkbAklZWRpLCVlZHgKKwl2cHNybGQJJDExLCV4bW02LCV4bW02CisJbW92bAklcjExZCwlcjEzZAorCWFkZGwJJWVkeCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJbW92bAklcjE0ZCwlZWR4CisJbW92bAklZWF4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl2cHNsbGQJJDExLCV4bW01LCV4bW01CisJeG9ybAklcjExZCwlcjEzZAorCXhvcmwJJWVieCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl4b3JsCSVlZHgsJXIxNGQKKwlhbmRsCSVyMTFkLCVyMTJkCisJeG9ybAklcjExZCwlcjEzZAorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwlhZGRsCTIwKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlcjEyZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjhkLCVlZGkKKwlhZGRsCSVyMTJkLCVlY3gKKwl2cHNybHEJJDE3LCV4bW03LCV4bW03CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlZHgsJXIxNGQKKwl2cGFkZGQJJXhtbTQsJXhtbTEsJXhtbTEKKwlhZGRsCSVyMTNkLCVlY3gKKwl4b3JsCSVyOGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAklZWN4LCVyMTBkCisJYWRkbAklcjE1ZCwlZWN4CisJbW92bAklcjEwZCwlcjEzZAorCXZwc3JscQkkMiwleG1tNywleG1tNworCWFkZGwJJWVjeCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVjeAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJbW92bAklcjExZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCXZwc2h1ZmIJJXhtbTgsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYXgsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVjeCwlcjE0ZAorCXZwYWRkZAkleG1tNiwleG1tMSwleG1tMQorCWFuZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAkyNCglcnNwKSwlZWJ4CisJdnBzaHVmZAkkODAsJXhtbTEsJXhtbTcKKwltb3ZsCSVlY3gsJXIxNWQKKwl4b3JsCSVlYXgsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJeG9ybAklZWR4LCVyMTVkCisJYWRkbAklcjEyZCwlZWJ4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwl2cHNybHEJJDE3LCV4bW03LCV4bW03CisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWN4LCVyMTRkCisJYWRkbAklcjEzZCwlZWJ4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwl4b3JsCSVlZHgsJWVkaQorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWJ4LCVyOWQKKwl2cHNybHEJJDIsJXhtbTcsJXhtbTcKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVieCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWJ4CisJbW92bAklcjEwZCwlcjEyZAorCXZwc2h1ZmIJJXhtbTksJXhtbTYsJXhtbTYKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCXhvcmwJJXIxMWQsJXIxMmQKKwl2cGFkZGQJJXhtbTYsJXhtbTEsJXhtbTEKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlcjEyZAorCXZwYWRkZAkzMiglcmJwKSwleG1tMSwleG1tNgorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJMjgoJXJzcCksJWVheAorCW1vdmwJJWVieCwlZWRpCisJeG9ybAklcjExZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklcjEyZCwlZWF4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlYngsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYXgKKwl4b3JsCSVlY3gsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVheCwlcjhkCisJYWRkbAklcjE1ZCwlZWF4CisJbW92bAklcjhkLCVyMTNkCisJYWRkbAklZWF4LCVyMTRkCisJdm1vdmRxYQkleG1tNiwxNiglcnNwKQorCXZwYWxpZ25yCSQ0LCV4bW0yLCV4bW0zLCV4bW00CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWF4CisJbW92bAklcjlkLCVyMTJkCisJdnBhbGlnbnIJJDQsJXhtbTAsJXhtbTEsJXhtbTcKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxMmQKKwl2cHNybGQJJDcsJXhtbTQsJXhtbTYKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVheCwlcjE0ZAorCWFuZGwJJXI4ZCwlcjEyZAorCXZwYWRkZAkleG1tNywleG1tMiwleG1tMgorCXhvcmwJJXI4ZCwlcjEzZAorCWFkZGwJMzIoJXJzcCksJXIxMWQKKwltb3ZsCSVlYXgsJXIxNWQKKwl2cHNybGQJJDMsJXhtbTQsJXhtbTcKKwl4b3JsCSVyMTBkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWJ4LCVyMTVkCisJdnBzbGxkCSQxNCwleG1tNCwleG1tNQorCWFkZGwJJXIxMmQsJXIxMWQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXZweG9yCSV4bW02LCV4bW03LCV4bW00CisJeG9ybAklZWF4LCVyMTRkCisJYWRkbAklcjEzZCwlcjExZAorCXhvcmwJJWVieCwlZWRpCisJdnBzaHVmZAkkMjUwLCV4bW0xLCV4bW03CisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlhZGRsCSVlZGksJXIxMWQKKwl2cHNybGQJJDExLCV4bW02LCV4bW02CisJbW92bAklZWR4LCVyMTNkCisJYWRkbAklcjExZCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJbW92bAklcjE0ZCwlcjExZAorCW1vdmwJJXI4ZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJdnBzbGxkCSQxMSwleG1tNSwleG1tNQorCXhvcmwJJWVkeCwlcjEzZAorCXhvcmwJJXI5ZCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl4b3JsCSVyMTFkLCVyMTRkCisJYW5kbAklZWR4LCVyMTJkCisJeG9ybAklZWR4LCVyMTNkCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCWFkZGwJMzYoJXJzcCksJXIxMGQKKwltb3ZsCSVyMTFkLCVlZGkKKwl4b3JsCSVyOWQsJXIxMmQKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklcjEyZCwlcjEwZAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTcKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXIxMWQsJXIxNGQKKwl2cGFkZGQJJXhtbTQsJXhtbTIsJXhtbTIKKwlhZGRsCSVyMTNkLCVyMTBkCisJeG9ybAklZWF4LCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCWFkZGwJJXIxMGQsJWVjeAorCWFkZGwJJXIxNWQsJXIxMGQKKwltb3ZsCSVlY3gsJXIxM2QKKwl2cHNybHEJJDIsJXhtbTcsJXhtbTcKKwlhZGRsCSVyMTBkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjEwZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJbW92bAklZWR4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwl2cHNodWZiCSV4bW04LCV4bW02LCV4bW02CisJeG9ybAklcjhkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTRkCisJdnBhZGRkCSV4bW02LCV4bW0yLCV4bW0yCisJYW5kbAklZWN4LCVyMTJkCisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAk0MCglcnNwKSwlcjlkCisJdnBzaHVmZAkkODAsJXhtbTIsJXhtbTcKKwltb3ZsCSVyMTBkLCVyMTVkCisJeG9ybAklcjhkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCXhvcmwJJXIxMWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVyOWQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTcKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYWRkbAklcjEzZCwlcjlkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwl4b3JsCSVyMTFkLCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXI5ZCwlZWJ4CisJdnBzcmxxCSQyLCV4bW03LCV4bW03CisJYWRkbAklZWRpLCVyOWQKKwltb3ZsCSVlYngsJXIxM2QKKwlhZGRsCSVyOWQsJXIxNGQKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJXI5ZAorCW1vdmwJJWVjeCwlcjEyZAorCXZwc2h1ZmIJJXhtbTksJXhtbTYsJXhtbTYKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCXhvcmwJJWVkeCwlcjEyZAorCXZwYWRkZAkleG1tNiwleG1tMiwleG1tMgorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklcjlkLCVyMTRkCisJYW5kbAklZWJ4LCVyMTJkCisJdnBhZGRkCTY0KCVyYnApLCV4bW0yLCV4bW02CisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAk0NCglcnNwKSwlcjhkCisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVlZGkKKwlhZGRsCSVyMTJkLCVyOGQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI4ZAorCXhvcmwJJXIxMGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjhkLCVyMTRkCisJdm1vdmRxYQkleG1tNiwzMiglcnNwKQorCXZwYWxpZ25yCSQ0LCV4bW0zLCV4bW0wLCV4bW00CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjhkCisJbW92bAklZWJ4LCVyMTJkCisJdnBhbGlnbnIJJDQsJXhtbTEsJXhtbTIsJXhtbTcKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCXhvcmwJJWVjeCwlcjEyZAorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklcjhkLCVyMTRkCisJYW5kbAklZWF4LCVyMTJkCisJdnBhZGRkCSV4bW03LCV4bW0zLCV4bW0zCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAk0OCglcnNwKSwlZWR4CisJbW92bAklcjhkLCVyMTVkCisJdnBzcmxkCSQzLCV4bW00LCV4bW03CisJeG9ybAklZWN4LCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjlkLCVyMTVkCisJdnBzbGxkCSQxNCwleG1tNCwleG1tNQorCWFkZGwJJXIxMmQsJWVkeAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTQKKwl4b3JsCSVyOGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVlZHgKKwl4b3JsCSVyOWQsJWVkaQorCXZwc2h1ZmQJJDI1MCwleG1tMiwleG1tNworCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWR4LCVyMTFkCisJYWRkbAklZWRpLCVlZHgKKwl2cHNybGQJJDExLCV4bW02LCV4bW02CisJbW92bAklcjExZCwlcjEzZAorCWFkZGwJJWVkeCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJbW92bAklcjE0ZCwlZWR4CisJbW92bAklZWF4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl2cHNsbGQJJDExLCV4bW01LCV4bW01CisJeG9ybAklcjExZCwlcjEzZAorCXhvcmwJJWVieCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl4b3JsCSVlZHgsJXIxNGQKKwlhbmRsCSVyMTFkLCVyMTJkCisJeG9ybAklcjExZCwlcjEzZAorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlcjEyZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjhkLCVlZGkKKwlhZGRsCSVyMTJkLCVlY3gKKwl2cHNybHEJJDE3LCV4bW03LCV4bW03CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlZHgsJXIxNGQKKwl2cGFkZGQJJXhtbTQsJXhtbTMsJXhtbTMKKwlhZGRsCSVyMTNkLCVlY3gKKwl4b3JsCSVyOGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAklZWN4LCVyMTBkCisJYWRkbAklcjE1ZCwlZWN4CisJbW92bAklcjEwZCwlcjEzZAorCXZwc3JscQkkMiwleG1tNywleG1tNworCWFkZGwJJWVjeCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVjeAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJbW92bAklcjExZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCXZwc2h1ZmIJJXhtbTgsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYXgsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVjeCwlcjE0ZAorCXZwYWRkZAkleG1tNiwleG1tMywleG1tMworCWFuZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAk1NiglcnNwKSwlZWJ4CisJdnBzaHVmZAkkODAsJXhtbTMsJXhtbTcKKwltb3ZsCSVlY3gsJXIxNWQKKwl4b3JsCSVlYXgsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJeG9ybAklZWR4LCVyMTVkCisJYWRkbAklcjEyZCwlZWJ4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwl2cHNybHEJJDE3LCV4bW03LCV4bW03CisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWN4LCVyMTRkCisJYWRkbAklcjEzZCwlZWJ4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwl4b3JsCSVlZHgsJWVkaQorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWJ4LCVyOWQKKwl2cHNybHEJJDIsJXhtbTcsJXhtbTcKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVieCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWJ4CisJbW92bAklcjEwZCwlcjEyZAorCXZwc2h1ZmIJJXhtbTksJXhtbTYsJXhtbTYKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCXhvcmwJJXIxMWQsJXIxMmQKKwl2cGFkZGQJJXhtbTYsJXhtbTMsJXhtbTMKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlcjEyZAorCXZwYWRkZAk5NiglcmJwKSwleG1tMywleG1tNgorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJNjAoJXJzcCksJWVheAorCW1vdmwJJWVieCwlZWRpCisJeG9ybAklcjExZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklcjEyZCwlZWF4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlYngsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYXgKKwl4b3JsCSVlY3gsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVheCwlcjhkCisJYWRkbAklcjE1ZCwlZWF4CisJbW92bAklcjhkLCVyMTNkCisJYWRkbAklZWF4LCVyMTRkCisJdm1vdmRxYQkleG1tNiw0OCglcnNwKQorCWNtcGIJJDAsMTMxKCVyYnApCisJam5lCS5MYXZ4XzAwXzQ3CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWF4CisJbW92bAklcjlkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyOGQsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVlYXgsJXIxNGQKKwlhbmRsCSVyOGQsJXIxMmQKKwl4b3JsCSVyOGQsJXIxM2QKKwlhZGRsCTAoJXJzcCksJXIxMWQKKwltb3ZsCSVlYXgsJXIxNWQKKwl4b3JsCSVyMTBkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWJ4LCVyMTVkCisJYWRkbAklcjEyZCwlcjExZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWF4LCVyMTRkCisJYWRkbAklcjEzZCwlcjExZAorCXhvcmwJJWVieCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlhZGRsCSVlZGksJXIxMWQKKwltb3ZsCSVlZHgsJXIxM2QKKwlhZGRsCSVyMTFkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjExZAorCW1vdmwJJXI4ZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWR4LCVyMTNkCisJeG9ybAklcjlkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTRkCisJYW5kbAklZWR4LCVyMTJkCisJeG9ybAklZWR4LCVyMTNkCisJYWRkbAk0KCVyc3ApLCVyMTBkCisJbW92bAklcjExZCwlZWRpCisJeG9ybAklcjlkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVyMTJkLCVyMTBkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyMTFkLCVyMTRkCisJYWRkbAklcjEzZCwlcjEwZAorCXhvcmwJJWVheCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjEwZCwlZWN4CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxMGQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTBkCisJbW92bAklZWR4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwl4b3JsCSVyOGQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxNGQKKwlhbmRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTgoJXJzcCksJXI5ZAorCW1vdmwJJXIxMGQsJXIxNWQKKwl4b3JsCSVyOGQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTVkCisJYWRkbAklcjEyZCwlcjlkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYWRkbAklcjEzZCwlcjlkCisJeG9ybAklcjExZCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyOWQsJWVieAorCWFkZGwJJWVkaSwlcjlkCisJbW92bAklZWJ4LCVyMTNkCisJYWRkbAklcjlkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjlkCisJbW92bAklZWN4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlYngsJXIxM2QKKwl4b3JsCSVlZHgsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFuZGwJJWVieCwlcjEyZAorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJMTIoJXJzcCksJXI4ZAorCW1vdmwJJXI5ZCwlZWRpCisJeG9ybAklZWR4LCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjEwZCwlZWRpCisJYWRkbAklcjEyZCwlcjhkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyOWQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOGQKKwl4b3JsCSVyMTBkLCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyOGQsJWVheAorCWFkZGwJJXIxNWQsJXI4ZAorCW1vdmwJJWVheCwlcjEzZAorCWFkZGwJJXI4ZCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJXI4ZAorCW1vdmwJJWVieCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJeG9ybAklZWN4LCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxMmQKKwl4b3JsCSVlYXgsJXIxM2QKKwlhZGRsCTE2KCVyc3ApLCVlZHgKKwltb3ZsCSVyOGQsJXIxNWQKKwl4b3JsCSVlY3gsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyOWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVlZHgKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXI4ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVkeAorCXhvcmwJJXI5ZCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJXIxMWQsJXIxM2QKKwlhZGRsCSVlZHgsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlZHgKKwltb3ZsCSVlYXgsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxM2QKKwl4b3JsCSVlYngsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVkeCwlcjE0ZAorCWFuZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTNkCisJYWRkbAkyMCglcnNwKSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwl4b3JsCSVlYngsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyOGQsJWVkaQorCWFkZGwJJXIxMmQsJWVjeAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWR4LCVyMTRkCisJYWRkbAklcjEzZCwlZWN4CisJeG9ybAklcjhkLCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlY3gsJXIxMGQKKwlhZGRsCSVyMTVkLCVlY3gKKwltb3ZsCSVyMTBkLCVyMTNkCisJYWRkbAklZWN4LCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWN4CisJbW92bAklcjExZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCXhvcmwJJWVheCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWN4LCVyMTRkCisJYW5kbAklcjEwZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCTI0KCVyc3ApLCVlYngKKwltb3ZsCSVlY3gsJXIxNWQKKwl4b3JsCSVlYXgsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVlZHgsJXIxNWQKKwlhZGRsCSVyMTJkLCVlYngKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVjeCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlYngsJXI5ZAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklcjlkLCVyMTNkCisJYWRkbAklZWJ4LCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWJ4CisJbW92bAklcjEwZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJeG9ybAklcjExZCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWJ4LCVyMTRkCisJYW5kbAklcjlkLCVyMTJkCisJeG9ybAklcjlkLCVyMTNkCisJYWRkbAkyOCglcnNwKSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwl4b3JsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVyMTJkLCVlYXgKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVieCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVheAorCXhvcmwJJWVjeCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWF4LCVyOGQKKwlhZGRsCSVyMTVkLCVlYXgKKwltb3ZsCSVyOGQsJXIxM2QKKwlhZGRsCSVlYXgsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYXgKKwltb3ZsCSVyOWQsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVheCwlcjE0ZAorCWFuZGwJJXI4ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjEzZAorCWFkZGwJMzIoJXJzcCksJXIxMWQKKwltb3ZsCSVlYXgsJXIxNWQKKwl4b3JsCSVyMTBkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWJ4LCVyMTVkCisJYWRkbAklcjEyZCwlcjExZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWF4LCVyMTRkCisJYWRkbAklcjEzZCwlcjExZAorCXhvcmwJJWVieCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlhZGRsCSVlZGksJXIxMWQKKwltb3ZsCSVlZHgsJXIxM2QKKwlhZGRsCSVyMTFkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjExZAorCW1vdmwJJXI4ZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWR4LCVyMTNkCisJeG9ybAklcjlkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTRkCisJYW5kbAklZWR4LCVyMTJkCisJeG9ybAklZWR4LCVyMTNkCisJYWRkbAkzNiglcnNwKSwlcjEwZAorCW1vdmwJJXIxMWQsJWVkaQorCXhvcmwJJXI5ZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklcjEyZCwlcjEwZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjExZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMGQKKwl4b3JsCSVlYXgsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXIxMGQsJWVjeAorCWFkZGwJJXIxNWQsJXIxMGQKKwltb3ZsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTBkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjEwZAorCW1vdmwJJWVkeCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWN4LCVyMTNkCisJeG9ybAklcjhkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTRkCisJYW5kbAklZWN4LCVyMTJkCisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAk0MCglcnNwKSwlcjlkCisJbW92bAklcjEwZCwlcjE1ZAorCXhvcmwJJXI4ZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVyOWQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOWQKKwl4b3JsCSVyMTFkLCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXI5ZCwlZWJ4CisJYWRkbAklZWRpLCVyOWQKKwltb3ZsCSVlYngsJXIxM2QKKwlhZGRsCSVyOWQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOWQKKwltb3ZsCSVlY3gsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCXhvcmwJJWVkeCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklcjlkLCVyMTRkCisJYW5kbAklZWJ4LCVyMTJkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAk0NCglcnNwKSwlcjhkCisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVlZGkKKwlhZGRsCSVyMTJkLCVyOGQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI4ZAorCXhvcmwJJXIxMGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjhkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjhkCisJbW92bAklZWJ4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlYXgsJXIxM2QKKwl4b3JsCSVlY3gsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXI4ZCwlcjE0ZAorCWFuZGwJJWVheCwlcjEyZAorCXhvcmwJJWVheCwlcjEzZAorCWFkZGwJNDgoJXJzcCksJWVkeAorCW1vdmwJJXI4ZCwlcjE1ZAorCXhvcmwJJWVjeCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI5ZCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVkeAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjhkLCVyMTRkCisJYWRkbAklcjEzZCwlZWR4CisJeG9ybAklcjlkLCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVkeCwlcjExZAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklcjExZCwlcjEzZAorCWFkZGwJJWVkeCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVkeAorCW1vdmwJJWVheCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCXhvcmwJJWVieCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWR4LCVyMTRkCisJYW5kbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI4ZCwlZWRpCisJYWRkbAklcjEyZCwlZWN4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlZHgsJXIxNGQKKwlhZGRsCSVyMTNkLCVlY3gKKwl4b3JsCSVyOGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVjeCwlcjEwZAorCWFkZGwJJXIxNWQsJWVjeAorCW1vdmwJJXIxMGQsJXIxM2QKKwlhZGRsCSVlY3gsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlY3gKKwltb3ZsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJeG9ybAklZWF4LCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTJkCisJeG9ybAklcjEwZCwlcjEzZAorCWFkZGwJNTYoJXJzcCksJWVieAorCW1vdmwJJWVjeCwlcjE1ZAorCXhvcmwJJWVheCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVkeCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVieAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWN4LCVyMTRkCisJYWRkbAklcjEzZCwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVieCwlcjlkCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVyOWQsJXIxM2QKKwlhZGRsCSVlYngsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYngKKwltb3ZsCSVyMTBkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVlYngsJXIxNGQKKwlhbmRsCSVyOWQsJXIxMmQKKwl4b3JsCSVyOWQsJXIxM2QKKwlhZGRsCTYwKCVyc3ApLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJXIxMWQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJXIxMmQsJWVheAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWJ4LCVyMTRkCisJYWRkbAklcjEzZCwlZWF4CisJeG9ybAklZWN4LCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlYXgsJXI4ZAorCWFkZGwJJXIxNWQsJWVheAorCW1vdmwJJXI4ZCwlcjEzZAorCWFkZGwJJWVheCwlcjE0ZAorCW1vdnEJNjQrMCglcnNwKSwlcmRpCisJbW92bAklcjE0ZCwlZWF4CisKKwlhZGRsCTAoJXJkaSksJWVheAorCWxlYXEJNjQoJXJzaSksJXJzaQorCWFkZGwJNCglcmRpKSwlZWJ4CisJYWRkbAk4KCVyZGkpLCVlY3gKKwlhZGRsCTEyKCVyZGkpLCVlZHgKKwlhZGRsCTE2KCVyZGkpLCVyOGQKKwlhZGRsCTIwKCVyZGkpLCVyOWQKKwlhZGRsCTI0KCVyZGkpLCVyMTBkCisJYWRkbAkyOCglcmRpKSwlcjExZAorCisJY21wcQk2NCsxNiglcnNwKSwlcnNpCisKKwltb3ZsCSVlYXgsMCglcmRpKQorCW1vdmwJJWVieCw0KCVyZGkpCisJbW92bAklZWN4LDgoJXJkaSkKKwltb3ZsCSVlZHgsMTIoJXJkaSkKKwltb3ZsCSVyOGQsMTYoJXJkaSkKKwltb3ZsCSVyOWQsMjAoJXJkaSkKKwltb3ZsCSVyMTBkLDI0KCVyZGkpCisJbW92bAklcjExZCwyOCglcmRpKQorCWpiCS5MbG9vcF9hdngKKworCW1vdnEJODgoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCXZ6ZXJvdXBwZXIKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGVwaWxvZ3VlX2F2eDoKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eCwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTIteDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTIteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxOThiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi14ODZfNjQuUwpAQCAtMCwwICsxLDQwODIgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKy5oaWRkZW4gT1BFTlNTTF9pYTMyY2FwX1AKKy5nbG9ibAlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLmhpZGRlbiBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorLmNmaV9zdGFydHByb2MJCisJbGVhcQlPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjExCisJbW92bAkwKCVyMTEpLCVyOWQKKwltb3ZsCTQoJXIxMSksJXIxMGQKKwltb3ZsCTgoJXIxMSksJXIxMWQKKwl0ZXN0bAkkMjA0OCwlcjEwZAorCWpuegkuTHhvcF9zaG9ydGN1dAorCWFuZGwJJDEwNzM3NDE4MjQsJXI5ZAorCWFuZGwJJDI2ODQzNTk2OCwlcjEwZAorCW9ybAklcjlkLCVyMTBkCisJY21wbAkkMTM0MjE3Nzc5MiwlcjEwZAorCWplCS5MYXZ4X3Nob3J0Y3V0CisJbW92cQklcnNwLCVyYXgKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcmF4CisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisJc2hscQkkNCwlcmR4CisJc3VicQkkMTI4KzMyLCVyc3AKKwlsZWFxCSglcnNpLCVyZHgsOCksJXJkeAorCWFuZHEJJC02NCwlcnNwCisJbW92cQklcmRpLDEyOCswKCVyc3ApCisJbW92cQklcnNpLDEyOCs4KCVyc3ApCisJbW92cQklcmR4LDEyOCsxNiglcnNwKQorCW1vdnEJJXJheCwxNTIoJXJzcCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwNiwweDc3LDB4OTgsMHgwMSwweDA2LDB4MjMsMHgwOAorLkxwcm9sb2d1ZToKKworCW1vdnEJMCglcmRpKSwlcmF4CisJbW92cQk4KCVyZGkpLCVyYngKKwltb3ZxCTE2KCVyZGkpLCVyY3gKKwltb3ZxCTI0KCVyZGkpLCVyZHgKKwltb3ZxCTMyKCVyZGkpLCVyOAorCW1vdnEJNDAoJXJkaSksJXI5CisJbW92cQk0OCglcmRpKSwlcjEwCisJbW92cQk1NiglcmRpKSwlcjExCisJam1wCS5MbG9vcAorCisuYWxpZ24JMTYKKy5MbG9vcDoKKwltb3ZxCSVyYngsJXJkaQorCWxlYXEJSzUxMiglcmlwKSwlcmJwCisJeG9ycQklcmN4LCVyZGkKKwltb3ZxCTAoJXJzaSksJXIxMgorCW1vdnEJJXI4LCVyMTMKKwltb3ZxCSVyYXgsJXIxNAorCWJzd2FwcQklcjEyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXI5LCVyMTUKKworCXhvcnEJJXI4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTAsJXIxNQorCisJbW92cQklcjEyLDAoJXJzcCkKKwl4b3JxCSVyYXgsJXIxNAorCWFuZHEJJXI4LCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXIxMSwlcjEyCisJeG9ycQklcjEwLCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXI4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcmF4LCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcmF4LCVyMTQKKworCXhvcnEJJXJieCwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJieCwlcjExCisKKwlhbmRxCSVyMTUsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcmRpLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCWFkZHEJJXIxMiwlcjExCisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjExCisJbW92cQk4KCVyc2kpLCVyMTIKKwltb3ZxCSVyZHgsJXIxMworCW1vdnEJJXIxMSwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjgsJXJkaQorCisJeG9ycQklcmR4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcmRpCisKKwltb3ZxCSVyMTIsOCglcnNwKQorCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXIxMCwlcjEyCisJeG9ycQklcjksJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcjExLCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjExLCVyMTQKKworCXhvcnEJJXJheCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJheCwlcjEwCisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCWFkZHEJJXIxMiwlcjEwCisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXIxMAorCW1vdnEJMTYoJXJzaSksJXIxMgorCW1vdnEJJXJjeCwlcjEzCisJbW92cQklcjEwLCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyZHgsJXIxNQorCisJeG9ycQklcmN4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjE1CisKKwltb3ZxCSVyMTIsMTYoJXJzcCkKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOSwlcjEyCisJeG9ycQklcjgsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcjEwLCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjEwLCVyMTQKKworCXhvcnEJJXIxMSwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMSwlcjkKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXI5CisJYWRkcQklcjEyLCVyYngKKwlhZGRxCSVyMTIsJXI5CisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjkKKwltb3ZxCTI0KCVyc2kpLCVyMTIKKwltb3ZxCSVyYngsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyY3gsJXJkaQorCisJeG9ycQklcmJ4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXJkaQorCisJbW92cQklcjEyLDI0KCVyc3ApCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOCwlcjEyCisJeG9ycQklcmR4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXI5LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjksJXIxNAorCisJeG9ycQklcjEwLCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjEwLCVyOAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjgKKwlhZGRxCSVyMTIsJXJheAorCWFkZHEJJXIxMiwlcjgKKworCWxlYXEJMjQoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjgKKwltb3ZxCTMyKCVyc2kpLCVyMTIKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXI4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYngsJXIxNQorCisJeG9ycQklcmF4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyY3gsJXIxNQorCisJbW92cQklcjEyLDMyKCVyc3ApCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyZHgsJXIxMgorCXhvcnEJJXJjeCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyOCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI4LCVyMTQKKworCXhvcnEJJXI5LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjksJXJkeAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmR4CisJYWRkcQklcjEyLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJkeAorCW1vdnEJNDAoJXJzaSksJXIxMgorCW1vdnEJJXIxMSwlcjEzCisJbW92cQklcmR4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYXgsJXJkaQorCisJeG9ycQklcjExLCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyYngsJXJkaQorCisJbW92cQklcjEyLDQwKCVyc3ApCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcmN4LCVyMTIKKwl4b3JxCSVyYngsJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjExLCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcmR4LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcmR4LCVyMTQKKworCXhvcnEJJXI4LCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjgsJXJjeAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmN4CisJYWRkcQklcjEyLCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCisJbGVhcQkyNCglcmJwKSwlcmJwCisJYWRkcQklcjE0LCVyY3gKKwltb3ZxCTQ4KCVyc2kpLCVyMTIKKwltb3ZxCSVyMTAsJXIxMworCW1vdnEJJXJjeCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjExLCVyMTUKKworCXhvcnEJJXIxMCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTUKKworCW1vdnEJJXIxMiw0OCglcnNwKQorCXhvcnEJJXJjeCwlcjE0CisJYW5kcQklcjEwLCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJieCwlcjEyCisJeG9ycQklcmF4LCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXJjeCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJjeCwlcjE0CisKKwl4b3JxCSVyZHgsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyZHgsJXJieAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmJ4CisJYWRkcQklcjEyLCVyOQorCWFkZHEJJXIxMiwlcmJ4CisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcmJ4CisJbW92cQk1NiglcnNpKSwlcjEyCisJbW92cQklcjksJXIxMworCW1vdnEJJXJieCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjEwLCVyZGkKKworCXhvcnEJJXI5LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTEsJXJkaQorCisJbW92cQklcjEyLDU2KCVyc3ApCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYXgsJXIxMgorCXhvcnEJJXIxMSwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXJieCwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJieCwlcjE0CisKKwl4b3JxCSVyY3gsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyY3gsJXJheAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmF4CisJYWRkcQklcjEyLCVyOAorCWFkZHEJJXIxMiwlcmF4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJheAorCW1vdnEJNjQoJXJzaSksJXIxMgorCW1vdnEJJXI4LCVyMTMKKwltb3ZxCSVyYXgsJXIxNAorCWJzd2FwcQklcjEyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXI5LCVyMTUKKworCXhvcnEJJXI4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTAsJXIxNQorCisJbW92cQklcjEyLDY0KCVyc3ApCisJeG9ycQklcmF4LCVyMTQKKwlhbmRxCSVyOCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXJheCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJheCwlcjE0CisKKwl4b3JxCSVyYngsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyYngsJXIxMQorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcjExCisJYWRkcQklcjEyLCVyZHgKKwlhZGRxCSVyMTIsJXIxMQorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXIxMQorCW1vdnEJNzIoJXJzaSksJXIxMgorCW1vdnEJJXJkeCwlcjEzCisJbW92cQklcjExLCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyOCwlcmRpCisKKwl4b3JxCSVyZHgsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXI5LCVyZGkKKworCW1vdnEJJXIxMiw3MiglcnNwKQorCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXIxMCwlcjEyCisJeG9ycQklcjksJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcjExLCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjExLCVyMTQKKworCXhvcnEJJXJheCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJheCwlcjEwCisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCWFkZHEJJXIxMiwlcjEwCisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXIxMAorCW1vdnEJODAoJXJzaSksJXIxMgorCW1vdnEJJXJjeCwlcjEzCisJbW92cQklcjEwLCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyZHgsJXIxNQorCisJeG9ycQklcmN4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjE1CisKKwltb3ZxCSVyMTIsODAoJXJzcCkKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOSwlcjEyCisJeG9ycQklcjgsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcjEwLCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjEwLCVyMTQKKworCXhvcnEJJXIxMSwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMSwlcjkKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXI5CisJYWRkcQklcjEyLCVyYngKKwlhZGRxCSVyMTIsJXI5CisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjkKKwltb3ZxCTg4KCVyc2kpLCVyMTIKKwltb3ZxCSVyYngsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyY3gsJXJkaQorCisJeG9ycQklcmJ4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXJkaQorCisJbW92cQklcjEyLDg4KCVyc3ApCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOCwlcjEyCisJeG9ycQklcmR4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXI5LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjksJXIxNAorCisJeG9ycQklcjEwLCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjEwLCVyOAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjgKKwlhZGRxCSVyMTIsJXJheAorCWFkZHEJJXIxMiwlcjgKKworCWxlYXEJMjQoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjgKKwltb3ZxCTk2KCVyc2kpLCVyMTIKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXI4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYngsJXIxNQorCisJeG9ycQklcmF4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyY3gsJXIxNQorCisJbW92cQklcjEyLDk2KCVyc3ApCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyZHgsJXIxMgorCXhvcnEJJXJjeCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyOCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI4LCVyMTQKKworCXhvcnEJJXI5LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjksJXJkeAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmR4CisJYWRkcQklcjEyLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJkeAorCW1vdnEJMTA0KCVyc2kpLCVyMTIKKwltb3ZxCSVyMTEsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcmF4LCVyZGkKKworCXhvcnEJJXIxMSwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmJ4LCVyZGkKKworCW1vdnEJJXIxMiwxMDQoJXJzcCkKKwl4b3JxCSVyZHgsJXIxNAorCWFuZHEJJXIxMSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyY3gsJXIxMgorCXhvcnEJJXJieCwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTEsJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyZHgsJXJkaQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyZHgsJXIxNAorCisJeG9ycQklcjgsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyOCwlcmN4CisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyY3gKKwlhZGRxCSVyMTIsJXIxMAorCWFkZHEJJXIxMiwlcmN4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJjeAorCW1vdnEJMTEyKCVyc2kpLCVyMTIKKwltb3ZxCSVyMTAsJXIxMworCW1vdnEJJXJjeCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjExLCVyMTUKKworCXhvcnEJJXIxMCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTUKKworCW1vdnEJJXIxMiwxMTIoJXJzcCkKKwl4b3JxCSVyY3gsJXIxNAorCWFuZHEJJXIxMCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYngsJXIxMgorCXhvcnEJJXJheCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyY3gsJXIxNQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyY3gsJXIxNAorCisJeG9ycQklcmR4LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmR4LCVyYngKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXJieAorCWFkZHEJJXIxMiwlcjkKKwlhZGRxCSVyMTIsJXJieAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJieAorCW1vdnEJMTIwKCVyc2kpLCVyMTIKKwltb3ZxCSVyOSwlcjEzCisJbW92cQklcmJ4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTAsJXJkaQorCisJeG9ycQklcjksJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMSwlcmRpCisKKwltb3ZxCSVyMTIsMTIwKCVyc3ApCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYXgsJXIxMgorCXhvcnEJJXIxMSwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXJieCwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJieCwlcjE0CisKKwl4b3JxCSVyY3gsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyY3gsJXJheAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmF4CisJYWRkcQklcjEyLCVyOAorCWFkZHEJJXIxMiwlcmF4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlqbXAJLkxyb3VuZHNfMTZfeHgKKy5hbGlnbgkxNgorLkxyb3VuZHNfMTZfeHg6CisJbW92cQk4KCVyc3ApLCVyMTMKKwltb3ZxCTExMiglcnNwKSwlcjE1CisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcmF4CisJbW92cQklcjE1LCVyMTQKKwlyb3JxCSQ0MiwlcjE1CisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcjE1CisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcjE1CisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXIxNQorCWFkZHEJNzIoJXJzcCksJXIxMgorCisJYWRkcQkwKCVyc3ApLCVyMTIKKwltb3ZxCSVyOCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKwltb3ZxCSVyYXgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyOSwlcjE1CisKKwl4b3JxCSVyOCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjEwLCVyMTUKKworCW1vdnEJJXIxMiwwKCVyc3ApCisJeG9ycQklcmF4LCVyMTQKKwlhbmRxCSVyOCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXJheCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJheCwlcjE0CisKKwl4b3JxCSVyYngsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyYngsJXIxMQorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcjExCisJYWRkcQklcjEyLCVyZHgKKwlhZGRxCSVyMTIsJXIxMQorCisJbGVhcQk4KCVyYnApLCVyYnAKKwltb3ZxCTE2KCVyc3ApLCVyMTMKKwltb3ZxCTEyMCglcnNwKSwlcmRpCisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcjExCisJbW92cQklcmRpLCVyMTQKKwlyb3JxCSQ0MiwlcmRpCisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcmRpCisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcmRpCisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXJkaQorCWFkZHEJODAoJXJzcCksJXIxMgorCisJYWRkcQk4KCVyc3ApLCVyMTIKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXJkaSwlcjEyCisJbW92cQklcjExLCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjgsJXJkaQorCisJeG9ycQklcmR4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcmRpCisKKwltb3ZxCSVyMTIsOCglcnNwKQorCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXIxMCwlcjEyCisJeG9ycQklcjksJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcjExLCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjExLCVyMTQKKworCXhvcnEJJXJheCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJheCwlcjEwCisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCWFkZHEJJXIxMiwlcjEwCisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwltb3ZxCTI0KCVyc3ApLCVyMTMKKwltb3ZxCTAoJXJzcCksJXIxNQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXIxMAorCW1vdnEJJXIxNSwlcjE0CisJcm9ycQkkNDIsJXIxNQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXIxNQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXIxNQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyMTUKKwlhZGRxCTg4KCVyc3ApLCVyMTIKKworCWFkZHEJMTYoJXJzcCksJXIxMgorCW1vdnEJJXJjeCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKwltb3ZxCSVyMTAsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyZHgsJXIxNQorCisJeG9ycQklcmN4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjE1CisKKwltb3ZxCSVyMTIsMTYoJXJzcCkKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOSwlcjEyCisJeG9ycQklcjgsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcjEwLCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjEwLCVyMTQKKworCXhvcnEJJXIxMSwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMSwlcjkKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXI5CisJYWRkcQklcjEyLCVyYngKKwlhZGRxCSVyMTIsJXI5CisKKwlsZWFxCTgoJXJicCksJXJicAorCW1vdnEJMzIoJXJzcCksJXIxMworCW1vdnEJOCglcnNwKSwlcmRpCisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcjkKKwltb3ZxCSVyZGksJXIxNAorCXJvcnEJJDQyLCVyZGkKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyZGkKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyZGkKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcmRpCisJYWRkcQk5NiglcnNwKSwlcjEyCisKKwlhZGRxCTI0KCVyc3ApLCVyMTIKKwltb3ZxCSVyYngsJXIxMworCWFkZHEJJXJkaSwlcjEyCisJbW92cQklcjksJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyY3gsJXJkaQorCisJeG9ycQklcmJ4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXJkaQorCisJbW92cQklcjEyLDI0KCVyc3ApCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOCwlcjEyCisJeG9ycQklcmR4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXI5LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjksJXIxNAorCisJeG9ycQklcjEwLCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjEwLCVyOAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjgKKwlhZGRxCSVyMTIsJXJheAorCWFkZHEJJXIxMiwlcjgKKworCWxlYXEJMjQoJXJicCksJXJicAorCW1vdnEJNDAoJXJzcCksJXIxMworCW1vdnEJMTYoJXJzcCksJXIxNQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXI4CisJbW92cQklcjE1LCVyMTQKKwlyb3JxCSQ0MiwlcjE1CisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcjE1CisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcjE1CisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXIxNQorCWFkZHEJMTA0KCVyc3ApLCVyMTIKKworCWFkZHEJMzIoJXJzcCksJXIxMgorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKwltb3ZxCSVyOCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXJieCwlcjE1CisKKwl4b3JxCSVyYXgsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJjeCwlcjE1CisKKwltb3ZxCSVyMTIsMzIoJXJzcCkKKwl4b3JxCSVyOCwlcjE0CisJYW5kcQklcmF4LCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJkeCwlcjEyCisJeG9ycQklcmN4LCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJheCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXI4LCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjgsJXIxNAorCisJeG9ycQklcjksJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyOSwlcmR4CisKKwlhbmRxCSVyMTUsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcmRpLCVyZHgKKwlhZGRxCSVyMTIsJXIxMQorCWFkZHEJJXIxMiwlcmR4CisKKwlsZWFxCTgoJXJicCksJXJicAorCW1vdnEJNDgoJXJzcCksJXIxMworCW1vdnEJMjQoJXJzcCksJXJkaQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXJkeAorCW1vdnEJJXJkaSwlcjE0CisJcm9ycQkkNDIsJXJkaQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXJkaQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXJkaQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyZGkKKwlhZGRxCTExMiglcnNwKSwlcjEyCisKKwlhZGRxCTQwKCVyc3ApLCVyMTIKKwltb3ZxCSVyMTEsJXIxMworCWFkZHEJJXJkaSwlcjEyCisJbW92cQklcmR4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcmF4LCVyZGkKKworCXhvcnEJJXIxMSwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmJ4LCVyZGkKKworCW1vdnEJJXIxMiw0MCglcnNwKQorCXhvcnEJJXJkeCwlcjE0CisJYW5kcQklcjExLCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJjeCwlcjEyCisJeG9ycQklcmJ4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXJkeCwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJkeCwlcjE0CisKKwl4b3JxCSVyOCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXI4LCVyY3gKKworCWFuZHEJJXJkaSwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyMTUsJXJjeAorCWFkZHEJJXIxMiwlcjEwCisJYWRkcQklcjEyLCVyY3gKKworCWxlYXEJMjQoJXJicCksJXJicAorCW1vdnEJNTYoJXJzcCksJXIxMworCW1vdnEJMzIoJXJzcCksJXIxNQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXJjeAorCW1vdnEJJXIxNSwlcjE0CisJcm9ycQkkNDIsJXIxNQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXIxNQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXIxNQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyMTUKKwlhZGRxCTEyMCglcnNwKSwlcjEyCisKKwlhZGRxCTQ4KCVyc3ApLCVyMTIKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXIxNSwlcjEyCisJbW92cQklcmN4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjExLCVyMTUKKworCXhvcnEJJXIxMCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTUKKworCW1vdnEJJXIxMiw0OCglcnNwKQorCXhvcnEJJXJjeCwlcjE0CisJYW5kcQklcjEwLCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJieCwlcjEyCisJeG9ycQklcmF4LCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXJjeCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJjeCwlcjE0CisKKwl4b3JxCSVyZHgsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyZHgsJXJieAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmJ4CisJYWRkcQklcjEyLCVyOQorCWFkZHEJJXIxMiwlcmJ4CisKKwlsZWFxCTgoJXJicCksJXJicAorCW1vdnEJNjQoJXJzcCksJXIxMworCW1vdnEJNDAoJXJzcCksJXJkaQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXJieAorCW1vdnEJJXJkaSwlcjE0CisJcm9ycQkkNDIsJXJkaQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXJkaQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXJkaQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyZGkKKwlhZGRxCTAoJXJzcCksJXIxMgorCisJYWRkcQk1NiglcnNwKSwlcjEyCisJbW92cQklcjksJXIxMworCWFkZHEJJXJkaSwlcjEyCisJbW92cQklcmJ4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjEwLCVyZGkKKworCXhvcnEJJXI5LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTEsJXJkaQorCisJbW92cQklcjEyLDU2KCVyc3ApCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYXgsJXIxMgorCXhvcnEJJXIxMSwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXJieCwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJieCwlcjE0CisKKwl4b3JxCSVyY3gsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyY3gsJXJheAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmF4CisJYWRkcQklcjEyLCVyOAorCWFkZHEJJXIxMiwlcmF4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwltb3ZxCTcyKCVyc3ApLCVyMTMKKwltb3ZxCTQ4KCVyc3ApLCVyMTUKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyYXgKKwltb3ZxCSVyMTUsJXIxNAorCXJvcnEJJDQyLCVyMTUKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyMTUKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyMTUKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcjE1CisJYWRkcQk4KCVyc3ApLCVyMTIKKworCWFkZHEJNjQoJXJzcCksJXIxMgorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCW1vdnEJJXJheCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXI5LCVyMTUKKworCXhvcnEJJXI4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTAsJXIxNQorCisJbW92cQklcjEyLDY0KCVyc3ApCisJeG9ycQklcmF4LCVyMTQKKwlhbmRxCSVyOCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXJheCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJheCwlcjE0CisKKwl4b3JxCSVyYngsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyYngsJXIxMQorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcjExCisJYWRkcQklcjEyLCVyZHgKKwlhZGRxCSVyMTIsJXIxMQorCisJbGVhcQk4KCVyYnApLCVyYnAKKwltb3ZxCTgwKCVyc3ApLCVyMTMKKwltb3ZxCTU2KCVyc3ApLCVyZGkKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyMTEKKwltb3ZxCSVyZGksJXIxNAorCXJvcnEJJDQyLCVyZGkKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyZGkKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyZGkKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcmRpCisJYWRkcQkxNiglcnNwKSwlcjEyCisKKwlhZGRxCTcyKCVyc3ApLCVyMTIKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXJkaSwlcjEyCisJbW92cQklcjExLCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjgsJXJkaQorCisJeG9ycQklcmR4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcmRpCisKKwltb3ZxCSVyMTIsNzIoJXJzcCkKKwl4b3JxCSVyMTEsJXIxNAorCWFuZHEJJXJkeCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyMTAsJXIxMgorCXhvcnEJJXI5LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJkeCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXIxMSwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXIxMSwlcjE0CisKKwl4b3JxCSVyYXgsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyYXgsJXIxMAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjEwCisJYWRkcQklcjEyLCVyY3gKKwlhZGRxCSVyMTIsJXIxMAorCisJbGVhcQkyNCglcmJwKSwlcmJwCisJbW92cQk4OCglcnNwKSwlcjEzCisJbW92cQk2NCglcnNwKSwlcjE1CisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcjEwCisJbW92cQklcjE1LCVyMTQKKwlyb3JxCSQ0MiwlcjE1CisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcjE1CisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcjE1CisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXIxNQorCWFkZHEJMjQoJXJzcCksJXIxMgorCisJYWRkcQk4MCglcnNwKSwlcjEyCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCW1vdnEJJXIxMCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXJkeCwlcjE1CisKKwl4b3JxCSVyY3gsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXI4LCVyMTUKKworCW1vdnEJJXIxMiw4MCglcnNwKQorCXhvcnEJJXIxMCwlcjE0CisJYW5kcQklcmN4LCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXI5LCVyMTIKKwl4b3JxCSVyOCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyY3gsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyMTAsJXIxNQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyMTAsJXIxNAorCisJeG9ycQklcjExLCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjExLCVyOQorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcjkKKwlhZGRxCSVyMTIsJXJieAorCWFkZHEJJXIxMiwlcjkKKworCWxlYXEJOCglcmJwKSwlcmJwCisJbW92cQk5NiglcnNwKSwlcjEzCisJbW92cQk3MiglcnNwKSwlcmRpCisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcjkKKwltb3ZxCSVyZGksJXIxNAorCXJvcnEJJDQyLCVyZGkKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyZGkKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyZGkKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcmRpCisJYWRkcQkzMiglcnNwKSwlcjEyCisKKwlhZGRxCTg4KCVyc3ApLCVyMTIKKwltb3ZxCSVyYngsJXIxMworCWFkZHEJJXJkaSwlcjEyCisJbW92cQklcjksJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyY3gsJXJkaQorCisJeG9ycQklcmJ4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXJkaQorCisJbW92cQklcjEyLDg4KCVyc3ApCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOCwlcjEyCisJeG9ycQklcmR4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXI5LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjksJXIxNAorCisJeG9ycQklcjEwLCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjEwLCVyOAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjgKKwlhZGRxCSVyMTIsJXJheAorCWFkZHEJJXIxMiwlcjgKKworCWxlYXEJMjQoJXJicCksJXJicAorCW1vdnEJMTA0KCVyc3ApLCVyMTMKKwltb3ZxCTgwKCVyc3ApLCVyMTUKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyOAorCW1vdnEJJXIxNSwlcjE0CisJcm9ycQkkNDIsJXIxNQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXIxNQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXIxNQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyMTUKKwlhZGRxCTQwKCVyc3ApLCVyMTIKKworCWFkZHEJOTYoJXJzcCksJXIxMgorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKwltb3ZxCSVyOCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXJieCwlcjE1CisKKwl4b3JxCSVyYXgsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJjeCwlcjE1CisKKwltb3ZxCSVyMTIsOTYoJXJzcCkKKwl4b3JxCSVyOCwlcjE0CisJYW5kcQklcmF4LCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJkeCwlcjEyCisJeG9ycQklcmN4LCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJheCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXI4LCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjgsJXIxNAorCisJeG9ycQklcjksJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyOSwlcmR4CisKKwlhbmRxCSVyMTUsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcmRpLCVyZHgKKwlhZGRxCSVyMTIsJXIxMQorCWFkZHEJJXIxMiwlcmR4CisKKwlsZWFxCTgoJXJicCksJXJicAorCW1vdnEJMTEyKCVyc3ApLCVyMTMKKwltb3ZxCTg4KCVyc3ApLCVyZGkKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyZHgKKwltb3ZxCSVyZGksJXIxNAorCXJvcnEJJDQyLCVyZGkKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyZGkKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyZGkKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcmRpCisJYWRkcQk0OCglcnNwKSwlcjEyCisKKwlhZGRxCTEwNCglcnNwKSwlcjEyCisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXJkeCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXJheCwlcmRpCisKKwl4b3JxCSVyMTEsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJieCwlcmRpCisKKwltb3ZxCSVyMTIsMTA0KCVyc3ApCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcmN4LCVyMTIKKwl4b3JxCSVyYngsJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjExLCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcmR4LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcmR4LCVyMTQKKworCXhvcnEJJXI4LCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjgsJXJjeAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmN4CisJYWRkcQklcjEyLCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCisJbGVhcQkyNCglcmJwKSwlcmJwCisJbW92cQkxMjAoJXJzcCksJXIxMworCW1vdnEJOTYoJXJzcCksJXIxNQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXJjeAorCW1vdnEJJXIxNSwlcjE0CisJcm9ycQkkNDIsJXIxNQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXIxNQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXIxNQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyMTUKKwlhZGRxCTU2KCVyc3ApLCVyMTIKKworCWFkZHEJMTEyKCVyc3ApLCVyMTIKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXIxNSwlcjEyCisJbW92cQklcmN4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjExLCVyMTUKKworCXhvcnEJJXIxMCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTUKKworCW1vdnEJJXIxMiwxMTIoJXJzcCkKKwl4b3JxCSVyY3gsJXIxNAorCWFuZHEJJXIxMCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYngsJXIxMgorCXhvcnEJJXJheCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyY3gsJXIxNQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyY3gsJXIxNAorCisJeG9ycQklcmR4LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmR4LCVyYngKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXJieAorCWFkZHEJJXIxMiwlcjkKKwlhZGRxCSVyMTIsJXJieAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwltb3ZxCTAoJXJzcCksJXIxMworCW1vdnEJMTA0KCVyc3ApLCVyZGkKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyYngKKwltb3ZxCSVyZGksJXIxNAorCXJvcnEJJDQyLCVyZGkKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyZGkKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyZGkKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcmRpCisJYWRkcQk2NCglcnNwKSwlcjEyCisKKwlhZGRxCTEyMCglcnNwKSwlcjEyCisJbW92cQklcjksJXIxMworCWFkZHEJJXJkaSwlcjEyCisJbW92cQklcmJ4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjEwLCVyZGkKKworCXhvcnEJJXI5LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTEsJXJkaQorCisJbW92cQklcjEyLDEyMCglcnNwKQorCXhvcnEJJXJieCwlcjE0CisJYW5kcQklcjksJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcmF4LCVyMTIKKwl4b3JxCSVyMTEsJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjksJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyYngsJXJkaQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyYngsJXIxNAorCisJeG9ycQklcmN4LCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmN4LCVyYXgKKworCWFuZHEJJXJkaSwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyMTUsJXJheAorCWFkZHEJJXIxMiwlcjgKKwlhZGRxCSVyMTIsJXJheAorCisJbGVhcQkyNCglcmJwKSwlcmJwCisJY21wYgkkMCw3KCVyYnApCisJam56CS5Mcm91bmRzXzE2X3h4CisKKwltb3ZxCTEyOCswKCVyc3ApLCVyZGkKKwlhZGRxCSVyMTQsJXJheAorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKworCWFkZHEJMCglcmRpKSwlcmF4CisJYWRkcQk4KCVyZGkpLCVyYngKKwlhZGRxCTE2KCVyZGkpLCVyY3gKKwlhZGRxCTI0KCVyZGkpLCVyZHgKKwlhZGRxCTMyKCVyZGkpLCVyOAorCWFkZHEJNDAoJXJkaSksJXI5CisJYWRkcQk0OCglcmRpKSwlcjEwCisJYWRkcQk1NiglcmRpKSwlcjExCisKKwljbXBxCTEyOCsxNiglcnNwKSwlcnNpCisKKwltb3ZxCSVyYXgsMCglcmRpKQorCW1vdnEJJXJieCw4KCVyZGkpCisJbW92cQklcmN4LDE2KCVyZGkpCisJbW92cQklcmR4LDI0KCVyZGkpCisJbW92cQklcjgsMzIoJXJkaSkKKwltb3ZxCSVyOSw0MCglcmRpKQorCW1vdnEJJXIxMCw0OCglcmRpKQorCW1vdnEJJXIxMSw1NiglcmRpKQorCWpiCS5MbG9vcAorCisJbW92cQkxNTIoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyc2kpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisuYWxpZ24JNjQKKy50eXBlCUs1MTIsQG9iamVjdAorSzUxMjoKKy5xdWFkCTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKy5xdWFkCTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKy5xdWFkCTB4YjVjMGZiY2ZlYzRkM2IyZiwweGU5YjVkYmE1ODE4OWRiYmMKKy5xdWFkCTB4YjVjMGZiY2ZlYzRkM2IyZiwweGU5YjVkYmE1ODE4OWRiYmMKKy5xdWFkCTB4Mzk1NmMyNWJmMzQ4YjUzOCwweDU5ZjExMWYxYjYwNWQwMTkKKy5xdWFkCTB4Mzk1NmMyNWJmMzQ4YjUzOCwweDU5ZjExMWYxYjYwNWQwMTkKKy5xdWFkCTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKy5xdWFkCTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKy5xdWFkCTB4ZDgwN2FhOThhMzAzMDI0MiwweDEyODM1YjAxNDU3MDZmYmUKKy5xdWFkCTB4ZDgwN2FhOThhMzAzMDI0MiwweDEyODM1YjAxNDU3MDZmYmUKKy5xdWFkCTB4MjQzMTg1YmU0ZWU0YjI4YywweDU1MGM3ZGMzZDVmZmI0ZTIKKy5xdWFkCTB4MjQzMTg1YmU0ZWU0YjI4YywweDU1MGM3ZGMzZDVmZmI0ZTIKKy5xdWFkCTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKy5xdWFkCTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKy5xdWFkCTB4OWJkYzA2YTcyNWM3MTIzNSwweGMxOWJmMTc0Y2Y2OTI2OTQKKy5xdWFkCTB4OWJkYzA2YTcyNWM3MTIzNSwweGMxOWJmMTc0Y2Y2OTI2OTQKKy5xdWFkCTB4ZTQ5YjY5YzE5ZWYxNGFkMiwweGVmYmU0Nzg2Mzg0ZjI1ZTMKKy5xdWFkCTB4ZTQ5YjY5YzE5ZWYxNGFkMiwweGVmYmU0Nzg2Mzg0ZjI1ZTMKKy5xdWFkCTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKy5xdWFkCTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKy5xdWFkCTB4MmRlOTJjNmY1OTJiMDI3NSwweDRhNzQ4NGFhNmVhNmU0ODMKKy5xdWFkCTB4MmRlOTJjNmY1OTJiMDI3NSwweDRhNzQ4NGFhNmVhNmU0ODMKKy5xdWFkCTB4NWNiMGE5ZGNiZDQxZmJkNCwweDc2Zjk4OGRhODMxMTUzYjUKKy5xdWFkCTB4NWNiMGE5ZGNiZDQxZmJkNCwweDc2Zjk4OGRhODMxMTUzYjUKKy5xdWFkCTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKy5xdWFkCTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKy5xdWFkCTB4YjAwMzI3Yzg5OGZiMjEzZiwweGJmNTk3ZmM3YmVlZjBlZTQKKy5xdWFkCTB4YjAwMzI3Yzg5OGZiMjEzZiwweGJmNTk3ZmM3YmVlZjBlZTQKKy5xdWFkCTB4YzZlMDBiZjMzZGE4OGZjMiwweGQ1YTc5MTQ3OTMwYWE3MjUKKy5xdWFkCTB4YzZlMDBiZjMzZGE4OGZjMiwweGQ1YTc5MTQ3OTMwYWE3MjUKKy5xdWFkCTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKy5xdWFkCTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKy5xdWFkCTB4MjdiNzBhODU0NmQyMmZmYywweDJlMWIyMTM4NWMyNmM5MjYKKy5xdWFkCTB4MjdiNzBhODU0NmQyMmZmYywweDJlMWIyMTM4NWMyNmM5MjYKKy5xdWFkCTB4NGQyYzZkZmM1YWM0MmFlZCwweDUzMzgwZDEzOWQ5NWIzZGYKKy5xdWFkCTB4NGQyYzZkZmM1YWM0MmFlZCwweDUzMzgwZDEzOWQ5NWIzZGYKKy5xdWFkCTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKy5xdWFkCTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKy5xdWFkCTB4ODFjMmM5MmU0N2VkYWVlNiwweDkyNzIyYzg1MTQ4MjM1M2IKKy5xdWFkCTB4ODFjMmM5MmU0N2VkYWVlNiwweDkyNzIyYzg1MTQ4MjM1M2IKKy5xdWFkCTB4YTJiZmU4YTE0Y2YxMDM2NCwweGE4MWE2NjRiYmM0MjMwMDEKKy5xdWFkCTB4YTJiZmU4YTE0Y2YxMDM2NCwweGE4MWE2NjRiYmM0MjMwMDEKKy5xdWFkCTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKy5xdWFkCTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKy5xdWFkCTB4ZDE5MmU4MTlkNmVmNTIxOCwweGQ2OTkwNjI0NTU2NWE5MTAKKy5xdWFkCTB4ZDE5MmU4MTlkNmVmNTIxOCwweGQ2OTkwNjI0NTU2NWE5MTAKKy5xdWFkCTB4ZjQwZTM1ODU1NzcxMjAyYSwweDEwNmFhMDcwMzJiYmQxYjgKKy5xdWFkCTB4ZjQwZTM1ODU1NzcxMjAyYSwweDEwNmFhMDcwMzJiYmQxYjgKKy5xdWFkCTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKy5xdWFkCTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKy5xdWFkCTB4Mjc0ODc3NGNkZjhlZWI5OSwweDM0YjBiY2I1ZTE5YjQ4YTgKKy5xdWFkCTB4Mjc0ODc3NGNkZjhlZWI5OSwweDM0YjBiY2I1ZTE5YjQ4YTgKKy5xdWFkCTB4MzkxYzBjYjNjNWM5NWE2MywweDRlZDhhYTRhZTM0MThhY2IKKy5xdWFkCTB4MzkxYzBjYjNjNWM5NWE2MywweDRlZDhhYTRhZTM0MThhY2IKKy5xdWFkCTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKy5xdWFkCTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKy5xdWFkCTB4NzQ4ZjgyZWU1ZGVmYjJmYywweDc4YTU2MzZmNDMxNzJmNjAKKy5xdWFkCTB4NzQ4ZjgyZWU1ZGVmYjJmYywweDc4YTU2MzZmNDMxNzJmNjAKKy5xdWFkCTB4ODRjODc4MTRhMWYwYWI3MiwweDhjYzcwMjA4MWE2NDM5ZWMKKy5xdWFkCTB4ODRjODc4MTRhMWYwYWI3MiwweDhjYzcwMjA4MWE2NDM5ZWMKKy5xdWFkCTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKy5xdWFkCTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKy5xdWFkCTB4YmVmOWEzZjdiMmM2NzkxNSwweGM2NzE3OGYyZTM3MjUzMmIKKy5xdWFkCTB4YmVmOWEzZjdiMmM2NzkxNSwweGM2NzE3OGYyZTM3MjUzMmIKKy5xdWFkCTB4Y2EyNzNlY2VlYTI2NjE5YywweGQxODZiOGM3MjFjMGMyMDcKKy5xdWFkCTB4Y2EyNzNlY2VlYTI2NjE5YywweGQxODZiOGM3MjFjMGMyMDcKKy5xdWFkCTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKy5xdWFkCTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKy5xdWFkCTB4MDZmMDY3YWE3MjE3NmZiYSwweDBhNjM3ZGM1YTJjODk4YTYKKy5xdWFkCTB4MDZmMDY3YWE3MjE3NmZiYSwweDBhNjM3ZGM1YTJjODk4YTYKKy5xdWFkCTB4MTEzZjk4MDRiZWY5MGRhZSwweDFiNzEwYjM1MTMxYzQ3MWIKKy5xdWFkCTB4MTEzZjk4MDRiZWY5MGRhZSwweDFiNzEwYjM1MTMxYzQ3MWIKKy5xdWFkCTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKy5xdWFkCTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKy5xdWFkCTB4M2M5ZWJlMGExNWM5YmViYywweDQzMWQ2N2M0OWMxMDBkNGMKKy5xdWFkCTB4M2M5ZWJlMGExNWM5YmViYywweDQzMWQ2N2M0OWMxMDBkNGMKKy5xdWFkCTB4NGNjNWQ0YmVjYjNlNDJiNiwweDU5N2YyOTljZmM2NTdlMmEKKy5xdWFkCTB4NGNjNWQ0YmVjYjNlNDJiNiwweDU5N2YyOTljZmM2NTdlMmEKKy5xdWFkCTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKKy5xdWFkCTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKKworLnF1YWQJMHgwMDAxMDIwMzA0MDUwNjA3LDB4MDgwOTBhMGIwYzBkMGUwZgorLnF1YWQJMHgwMDAxMDIwMzA0MDUwNjA3LDB4MDgwOTBhMGIwYzBkMGUwZgorLmJ5dGUJODMsNzIsNjUsNTMsNDksNTAsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLnR5cGUJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfeG9wLEBmdW5jdGlvbgorLmFsaWduCTY0CitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl94b3A6CisuY2ZpX3N0YXJ0cHJvYwkKKy5MeG9wX3Nob3J0Y3V0OgorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorCXNobHEJJDQsJXJkeAorCXN1YnEJJDE2MCwlcnNwCisJbGVhcQkoJXJzaSwlcmR4LDgpLCVyZHgKKwlhbmRxCSQtNjQsJXJzcAorCW1vdnEJJXJkaSwxMjgrMCglcnNwKQorCW1vdnEJJXJzaSwxMjgrOCglcnNwKQorCW1vdnEJJXJkeCwxMjgrMTYoJXJzcCkKKwltb3ZxCSVyYXgsMTUyKCVyc3ApCisuY2ZpX2VzY2FwZQkweDBmLDB4MDYsMHg3NywweDk4LDB4MDEsMHgwNiwweDIzLDB4MDgKKy5McHJvbG9ndWVfeG9wOgorCisJdnplcm91cHBlcgorCW1vdnEJMCglcmRpKSwlcmF4CisJbW92cQk4KCVyZGkpLCVyYngKKwltb3ZxCTE2KCVyZGkpLCVyY3gKKwltb3ZxCTI0KCVyZGkpLCVyZHgKKwltb3ZxCTMyKCVyZGkpLCVyOAorCW1vdnEJNDAoJXJkaSksJXI5CisJbW92cQk0OCglcmRpKSwlcjEwCisJbW92cQk1NiglcmRpKSwlcjExCisJam1wCS5MbG9vcF94b3AKKy5hbGlnbgkxNgorLkxsb29wX3hvcDoKKwl2bW92ZHFhCUs1MTIrMTI4MCglcmlwKSwleG1tMTEKKwl2bW92ZHF1CTAoJXJzaSksJXhtbTAKKwlsZWFxCUs1MTIrMTI4KCVyaXApLCVyYnAKKwl2bW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJdm1vdmRxdQkzMiglcnNpKSwleG1tMgorCXZwc2h1ZmIJJXhtbTExLCV4bW0wLCV4bW0wCisJdm1vdmRxdQk0OCglcnNpKSwleG1tMworCXZwc2h1ZmIJJXhtbTExLCV4bW0xLCV4bW0xCisJdm1vdmRxdQk2NCglcnNpKSwleG1tNAorCXZwc2h1ZmIJJXhtbTExLCV4bW0yLCV4bW0yCisJdm1vdmRxdQk4MCglcnNpKSwleG1tNQorCXZwc2h1ZmIJJXhtbTExLCV4bW0zLCV4bW0zCisJdm1vdmRxdQk5NiglcnNpKSwleG1tNgorCXZwc2h1ZmIJJXhtbTExLCV4bW00LCV4bW00CisJdm1vdmRxdQkxMTIoJXJzaSksJXhtbTcKKwl2cHNodWZiCSV4bW0xMSwleG1tNSwleG1tNQorCXZwYWRkcQktMTI4KCVyYnApLCV4bW0wLCV4bW04CisJdnBzaHVmYgkleG1tMTEsJXhtbTYsJXhtbTYKKwl2cGFkZHEJLTk2KCVyYnApLCV4bW0xLCV4bW05CisJdnBzaHVmYgkleG1tMTEsJXhtbTcsJXhtbTcKKwl2cGFkZHEJLTY0KCVyYnApLCV4bW0yLCV4bW0xMAorCXZwYWRkcQktMzIoJXJicCksJXhtbTMsJXhtbTExCisJdm1vdmRxYQkleG1tOCwwKCVyc3ApCisJdnBhZGRxCTAoJXJicCksJXhtbTQsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDE2KCVyc3ApCisJdnBhZGRxCTMyKCVyYnApLCV4bW01LCV4bW05CisJdm1vdmRxYQkleG1tMTAsMzIoJXJzcCkKKwl2cGFkZHEJNjQoJXJicCksJXhtbTYsJXhtbTEwCisJdm1vdmRxYQkleG1tMTEsNDgoJXJzcCkKKwl2cGFkZHEJOTYoJXJicCksJXhtbTcsJXhtbTExCisJdm1vdmRxYQkleG1tOCw2NCglcnNwKQorCW1vdnEJJXJheCwlcjE0CisJdm1vdmRxYQkleG1tOSw4MCglcnNwKQorCW1vdnEJJXJieCwlcmRpCisJdm1vdmRxYQkleG1tMTAsOTYoJXJzcCkKKwl4b3JxCSVyY3gsJXJkaQorCXZtb3ZkcWEJJXhtbTExLDExMiglcnNwKQorCW1vdnEJJXI4LCVyMTMKKwlqbXAJLkx4b3BfMDBfNDcKKworLmFsaWduCTE2CisuTHhvcF8wMF80NzoKKwlhZGRxCSQyNTYsJXJicAorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW04CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmF4CisJdnBhbGlnbnIJJDgsJXhtbTQsJXhtbTUsJXhtbTExCisJbW92cQklcjksJXIxMgorCXJvcnEJJDUsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAwLDU2CisJeG9ycQklcjgsJXIxMworCXhvcnEJJXIxMCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmF4LCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW0wLCV4bW0wCisJYW5kcQklcjgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwlhZGRxCTAoJXJzcCksJXIxMQorCW1vdnEJJXJheCwlcjE1CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcnEJJXIxMCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwl4b3JxCSVyYngsJXIxNQorCWFkZHEJJXIxMiwlcjExCisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjIzLDMKKwl4b3JxCSVyYXgsJXIxNAorCWFkZHEJJXIxMywlcjExCisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmJ4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJdnBzcmxxCSQ2LCV4bW03LCV4bW0xMAorCWFkZHEJJXIxMSwlcmR4CisJYWRkcQklcmRpLCVyMTEKKwl2cGFkZHEJJXhtbTgsJXhtbTAsJXhtbTAKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXIxMSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDMsNDIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyMTEKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCW1vdnEJJXI4LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXIxMworCXhvcnEJJXI5LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjExLCVyMTQKKwlhbmRxCSVyZHgsJXIxMgorCXhvcnEJJXJkeCwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tMCwleG1tMAorCWFkZHEJOCglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnBhZGRxCS0xMjgoJXJicCksJXhtbTAsJXhtbTEwCisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDAoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCXZwYWxpZ25yCSQ4LCV4bW01LCV4bW02LCV4bW0xMQorCW1vdnEJJXJkeCwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyY3gsJXIxMworCXhvcnEJJXI4LCVyMTIKKwl2cHNybHEJJDcsJXhtbTgsJXhtbTgKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyMTAsJXIxNAorCXZwYWRkcQkleG1tMTEsJXhtbTEsJXhtbTEKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJYWRkcQkxNiglcnNwKSwlcjkKKwltb3ZxCSVyMTAsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyOCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwl4b3JxCSVyMTEsJXIxNQorCWFkZHEJJXIxMiwlcjkKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKy5ieXRlCTE0MywxMDQsMTIwLDE5NSwyMTYsMworCXhvcnEJJXIxMCwlcjE0CisJYWRkcQklcjEzLCVyOQorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXIxMSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tMCwleG1tMTAKKwlhZGRxCSVyOSwlcmJ4CisJYWRkcQklcmRpLCVyOQorCXZwYWRkcQkleG1tOCwleG1tMSwleG1tMQorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcjkKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCW1vdnEJJXJjeCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmJ4LCVyMTMKKwl4b3JxCSVyZHgsJXIxMgorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyOSwlcjE0CisJYW5kcQklcmJ4LCVyMTIKKwl4b3JxCSVyYngsJXIxMworCXZwYWRkcQkleG1tMTEsJXhtbTEsJXhtbTEKKwlhZGRxCTI0KCVyc3ApLCVyOAorCW1vdnEJJXI5LCVyZGkKKwl4b3JxCSVyZHgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZwYWRkcQktOTYoJXJicCksJXhtbTEsJXhtbTEwCisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjksJXIxNAorCWFkZHEJJXIxMywlcjgKKwl4b3JxCSVyMTAsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjE1LCVyOAorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDE2KCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTIsJXhtbTMsJXhtbTgKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCXZwYWxpZ25yCSQ4LCV4bW02LCV4bW03LCV4bW0xMQorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyYXgsJXIxMworCXhvcnEJJXJjeCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjgsJXIxNAorCXZwYWRkcQkleG1tMTEsJXhtbTIsJXhtbTIKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQkzMiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjE3LDMKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyOSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tMSwleG1tMTAKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJdnBhZGRxCSV4bW04LCV4bW0yLCV4bW0yCisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmR4CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyYXgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMSwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tMiwleG1tMgorCWFkZHEJNDAoJXJzcCksJXJjeAorCW1vdnEJJXJkeCwlcmRpCisJeG9ycQklcmJ4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cGFkZHEJLTY0KCVyYnApLCV4bW0yLCV4bW0xMAorCXhvcnEJJXI4LCVyZGkKKwlhZGRxCSVyMTIsJXJjeAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl4b3JxCSVyOCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJdm1vdmRxYQkleG1tMTAsMzIoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCXZwYWxpZ25yCSQ4LCV4bW03LCV4bW0wLCV4bW0xMQorCW1vdnEJJXIxMSwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyMTAsJXIxMworCXhvcnEJJXJheCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmN4LCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW0zLCV4bW0zCisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJNDgoJXJzcCksJXJieAorCW1vdnEJJXJjeCwlcjE1CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcnEJJXJheCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwl4b3JxCSVyZHgsJXIxNQorCWFkZHEJJXIxMiwlcmJ4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjE4LDMKKwl4b3JxCSVyY3gsJXIxNAorCWFkZHEJJXIxMywlcmJ4CisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmR4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJdnBzcmxxCSQ2LCV4bW0yLCV4bW0xMAorCWFkZHEJJXJieCwlcjkKKwlhZGRxCSVyZGksJXJieAorCXZwYWRkcQkleG1tOCwleG1tMywleG1tMworCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyYngsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmJ4CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyMTAsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXI5LCVyMTMKKwl4b3JxCSVyMTEsJXIxMgorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyYngsJXIxNAorCWFuZHEJJXI5LCVyMTIKKwl4b3JxCSVyOSwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tMywleG1tMworCWFkZHEJNTYoJXJzcCksJXJheAorCW1vdnEJJXJieCwlcmRpCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cGFkZHEJLTMyKCVyYnApLCV4bW0zLCV4bW0xMAorCXhvcnEJJXJjeCwlcmRpCisJYWRkcQklcjEyLCVyYXgKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyYngsJXIxNAorCWFkZHEJJXIxMywlcmF4CisJeG9ycQklcmN4LCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcmF4LCVyOAorCWFkZHEJJXIxNSwlcmF4CisJbW92cQklcjgsJXIxMworCWFkZHEJJXJheCwlcjE0CisJdm1vdmRxYQkleG1tMTAsNDgoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNCwleG1tNSwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW0xMQorCW1vdnEJJXI5LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMCw1NgorCXhvcnEJJXI4LCVyMTMKKwl4b3JxCSVyMTAsJXIxMgorCXZwc3JscQkkNywleG1tOCwleG1tOAorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJheCwlcjE0CisJdnBhZGRxCSV4bW0xMSwleG1tNCwleG1tNAorCWFuZHEJJXI4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQk2NCglcnNwKSwlcjExCisJbW92cQklcmF4LCVyMTUKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwOSw3CisJeG9ycQklcjEwLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCXhvcnEJJXJieCwlcjE1CisJYWRkcQklcjEyLCVyMTEKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKy5ieXRlCTE0MywxMDQsMTIwLDE5NSwyMTksMworCXhvcnEJJXJheCwlcjE0CisJYWRkcQklcjEzLCVyMTEKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyYngsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwl2cHNybHEJJDYsJXhtbTMsJXhtbTEwCisJYWRkcQklcjExLCVyZHgKKwlhZGRxCSVyZGksJXIxMQorCXZwYWRkcQkleG1tOCwleG1tNCwleG1tNAorCW1vdnEJJXJkeCwlcjEzCisJYWRkcQklcjExLCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJbW92cQklcjgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJkeCwlcjEzCisJeG9ycQklcjksJXIxMgorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyMTEsJXIxNAorCWFuZHEJJXJkeCwlcjEyCisJeG9ycQklcmR4LCVyMTMKKwl2cGFkZHEJJXhtbTExLCV4bW00LCV4bW00CisJYWRkcQk3MiglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnBhZGRxCTAoJXJicCksJXhtbTQsJXhtbTEwCisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDY0KCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTUsJXhtbTYsJXhtbTgKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyMTAKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tMTEKKwltb3ZxCSVyZHgsJXIxMgorCXJvcnEJJDUsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAwLDU2CisJeG9ycQklcmN4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjEwLCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW01LCV4bW01CisJYW5kcQklcmN4LCVyMTIKKwl4b3JxCSVyY3gsJXIxMworCWFkZHEJODAoJXJzcCksJXI5CisJbW92cQklcjEwLCVyMTUKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwOSw3CisJeG9ycQklcjgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcjExLCVyMTUKKwlhZGRxCSVyMTIsJXI5CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjIwLDMKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyMTEsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwl2cHNybHEJJDYsJXhtbTQsJXhtbTEwCisJYWRkcQklcjksJXJieAorCWFkZHEJJXJkaSwlcjkKKwl2cGFkZHEJJXhtbTgsJXhtbTUsJXhtbTUKKwltb3ZxCSVyYngsJXIxMworCWFkZHEJJXI5LCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXI5CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyY3gsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJeG9ycQklcmR4LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcjEyCisJeG9ycQklcmJ4LCVyMTMKKwl2cGFkZHEJJXhtbTExLCV4bW01LCV4bW01CisJYWRkcQk4OCglcnNwKSwlcjgKKwltb3ZxCSVyOSwlcmRpCisJeG9ycQklcmR4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cGFkZHEJMzIoJXJicCksJXhtbTUsJXhtbTEwCisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjksJXIxNAorCWFkZHEJJXIxMywlcjgKKwl4b3JxCSVyMTAsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjE1LCVyOAorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDgwKCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTYsJXhtbTcsJXhtbTgKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCXZwYWxpZ25yCSQ4LCV4bW0yLCV4bW0zLCV4bW0xMQorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyYXgsJXIxMworCXhvcnEJJXJjeCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjgsJXIxNAorCXZwYWRkcQkleG1tMTEsJXhtbTYsJXhtbTYKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQk5NiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjIxLDMKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyOSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tNSwleG1tMTAKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJdnBhZGRxCSV4bW04LCV4bW02LCV4bW02CisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmR4CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyYXgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMSwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tNiwleG1tNgorCWFkZHEJMTA0KCVyc3ApLCVyY3gKKwltb3ZxCSVyZHgsJXJkaQorCXhvcnEJJXJieCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnBhZGRxCTY0KCVyYnApLCV4bW02LCV4bW0xMAorCXhvcnEJJXI4LCVyZGkKKwlhZGRxCSVyMTIsJXJjeAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl4b3JxCSVyOCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJdm1vdmRxYQkleG1tMTAsOTYoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNywleG1tMCwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCXZwYWxpZ25yCSQ4LCV4bW0zLCV4bW00LCV4bW0xMQorCW1vdnEJJXIxMSwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyMTAsJXIxMworCXhvcnEJJXJheCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmN4LCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW03LCV4bW03CisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJMTEyKCVyc3ApLCVyYngKKwltb3ZxCSVyY3gsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyYXgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcmR4LCVyMTUKKwlhZGRxCSVyMTIsJXJieAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorLmJ5dGUJMTQzLDEwNCwxMjAsMTk1LDIyMiwzCisJeG9ycQklcmN4LCVyMTQKKwlhZGRxCSVyMTMsJXJieAorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXJkeCwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tNiwleG1tMTAKKwlhZGRxCSVyYngsJXI5CisJYWRkcQklcmRpLCVyYngKKwl2cGFkZHEJJXhtbTgsJXhtbTcsJXhtbTcKKwltb3ZxCSVyOSwlcjEzCisJYWRkcQklcmJ4LCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJieAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJbW92cQklcjEwLCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJeG9ycQklcjExLCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcjEyCisJeG9ycQklcjksJXIxMworCXZwYWRkcQkleG1tMTEsJXhtbTcsJXhtbTcKKwlhZGRxCTEyMCglcnNwKSwlcmF4CisJbW92cQklcmJ4LCVyZGkKKwl4b3JxCSVyMTEsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZwYWRkcQk5NiglcmJwKSwleG1tNywleG1tMTAKKwl4b3JxCSVyY3gsJXJkaQorCWFkZHEJJXIxMiwlcmF4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXhvcnEJJXJjeCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJheCwlcjgKKwlhZGRxCSVyMTUsJXJheAorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyYXgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDExMiglcnNwKQorCWNtcGIJJDAsMTM1KCVyYnApCisJam5lCS5MeG9wXzAwXzQ3CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmF4CisJbW92cQklcjksJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXI4LCVyMTMKKwl4b3JxCSVyMTAsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJheCwlcjE0CisJYW5kcQklcjgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwlhZGRxCTAoJXJzcCksJXIxMQorCW1vdnEJJXJheCwlcjE1CisJeG9ycQklcjEwLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYngsJXIxNQorCWFkZHEJJXIxMiwlcjExCisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcmF4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMQorCXhvcnEJJXJieCwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMSwlcmR4CisJYWRkcQklcmRpLCVyMTEKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXIxMSwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJkeCwlcjEzCisJeG9ycQklcjksJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyMTIKKwl4b3JxCSVyZHgsJXIxMworCWFkZHEJOCglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCW1vdnEJJXJkeCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjEwLCVyMTQKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJYWRkcQkxNiglcnNwKSwlcjkKKwltb3ZxCSVyMTAsJXIxNQorCXhvcnEJJXI4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTEsJXIxNQorCWFkZHEJJXIxMiwlcjkKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl4b3JxCSVyMTEsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOSwlcmJ4CisJYWRkcQklcmRpLCVyOQorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXI5CisJbW92cQklcmN4LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyYngsJXIxMworCXhvcnEJJXJkeCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcjEyCisJeG9ycQklcmJ4LCVyMTMKKwlhZGRxCTI0KCVyc3ApLCVyOAorCW1vdnEJJXI5LCVyZGkKKwl4b3JxCSVyZHgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMCwlcmRpCisJYWRkcQklcjEyLCVyOAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXI5LCVyMTQKKwlhZGRxCSVyMTMsJXI4CisJeG9ycQklcjEwLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjgsJXJheAorCWFkZHEJJXIxNSwlcjgKKwltb3ZxCSVyYXgsJXIxMworCWFkZHEJJXI4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTMKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXI4LCVyMTQKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQkzMiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorCXhvcnEJJXJjeCwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcjgsJXIxNAorCWFkZHEJJXIxMywlcmR4CisJeG9ycQklcjksJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJkeAorCW1vdnEJJXJheCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjExLCVyMTMKKwl4b3JxCSVyYngsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJkeCwlcjE0CisJYW5kcQklcjExLCVyMTIKKwl4b3JxCSVyMTEsJXIxMworCWFkZHEJNDAoJXJzcCksJXJjeAorCW1vdnEJJXJkeCwlcmRpCisJeG9ycQklcmJ4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOCwlcmRpCisJYWRkcQklcjEyLCVyY3gKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyZHgsJXIxNAorCWFkZHEJJXIxMywlcmN4CisJeG9ycQklcjgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyY3gsJXIxMAorCWFkZHEJJXIxNSwlcmN4CisJbW92cQklcjEwLCVyMTMKKwlhZGRxCSVyY3gsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCW1vdnEJJXIxMSwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjEwLCVyMTMKKwl4b3JxCSVyYXgsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJjeCwlcjE0CisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJNDgoJXJzcCksJXJieAorCW1vdnEJJXJjeCwlcjE1CisJeG9ycQklcmF4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyZHgsJXIxNQorCWFkZHEJJXIxMiwlcmJ4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcmN4LCVyMTQKKwlhZGRxCSVyMTMsJXJieAorCXhvcnEJJXJkeCwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJieCwlcjkKKwlhZGRxCSVyZGksJXJieAorCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyYngsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJieAorCW1vdnEJJXIxMCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjksJXIxMworCXhvcnEJJXIxMSwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcjEyCisJeG9ycQklcjksJXIxMworCWFkZHEJNTYoJXJzcCksJXJheAorCW1vdnEJJXJieCwlcmRpCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyY3gsJXJkaQorCWFkZHEJJXIxMiwlcmF4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXhvcnEJJXJjeCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJheCwlcjgKKwlhZGRxCSVyMTUsJXJheAorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyYXgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCW1vdnEJJXI5LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjEzCisJeG9ycQklcjEwLCVyMTIKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyYXgsJXIxNAorCWFuZHEJJXI4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQk2NCglcnNwKSwlcjExCisJbW92cQklcmF4LCVyMTUKKwl4b3JxCSVyMTAsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjE1CisJYWRkcQklcjEyLCVyMTEKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyYXgsJXIxNAorCWFkZHEJJXIxMywlcjExCisJeG9ycQklcmJ4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjExLCVyZHgKKwlhZGRxCSVyZGksJXIxMQorCW1vdnEJJXJkeCwlcjEzCisJYWRkcQklcjExLCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyOCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjExLCVyMTQKKwlhbmRxCSVyZHgsJXIxMgorCXhvcnEJJXJkeCwlcjEzCisJYWRkcQk3MiglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCW1vdnEJJXJkeCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjEwLCVyMTQKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJYWRkcQk4MCglcnNwKSwlcjkKKwltb3ZxCSVyMTAsJXIxNQorCXhvcnEJJXI4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTEsJXIxNQorCWFkZHEJJXIxMiwlcjkKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl4b3JxCSVyMTEsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOSwlcmJ4CisJYWRkcQklcmRpLCVyOQorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXI5CisJbW92cQklcmN4LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyYngsJXIxMworCXhvcnEJJXJkeCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcjEyCisJeG9ycQklcmJ4LCVyMTMKKwlhZGRxCTg4KCVyc3ApLCVyOAorCW1vdnEJJXI5LCVyZGkKKwl4b3JxCSVyZHgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMCwlcmRpCisJYWRkcQklcjEyLCVyOAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXI5LCVyMTQKKwlhZGRxCSVyMTMsJXI4CisJeG9ycQklcjEwLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjgsJXJheAorCWFkZHEJJXIxNSwlcjgKKwltb3ZxCSVyYXgsJXIxMworCWFkZHEJJXI4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTMKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXI4LCVyMTQKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQk5NiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorCXhvcnEJJXJjeCwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcjgsJXIxNAorCWFkZHEJJXIxMywlcmR4CisJeG9ycQklcjksJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJkeAorCW1vdnEJJXJheCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjExLCVyMTMKKwl4b3JxCSVyYngsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJkeCwlcjE0CisJYW5kcQklcjExLCVyMTIKKwl4b3JxCSVyMTEsJXIxMworCWFkZHEJMTA0KCVyc3ApLCVyY3gKKwltb3ZxCSVyZHgsJXJkaQorCXhvcnEJJXJieCwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjgsJXJkaQorCWFkZHEJJXIxMiwlcmN4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmR4LCVyMTQKKwlhZGRxCSVyMTMsJXJjeAorCXhvcnEJJXI4LCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcmN4LCVyMTAKKwlhZGRxCSVyMTUsJXJjeAorCW1vdnEJJXIxMCwlcjEzCisJYWRkcQklcmN4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyY3gKKwltb3ZxCSVyMTEsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMCwlcjEzCisJeG9ycQklcmF4LCVyMTIKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyY3gsJXIxNAorCWFuZHEJJXIxMCwlcjEyCisJeG9ycQklcjEwLCVyMTMKKwlhZGRxCTExMiglcnNwKSwlcmJ4CisJbW92cQklcmN4LCVyMTUKKwl4b3JxCSVyYXgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJkeCwlcjE1CisJYWRkcQklcjEyLCVyYngKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyY3gsJXIxNAorCWFkZHEJJXIxMywlcmJ4CisJeG9ycQklcmR4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcmJ4LCVyOQorCWFkZHEJJXJkaSwlcmJ4CisJbW92cQklcjksJXIxMworCWFkZHEJJXJieCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmJ4CisJbW92cQklcjEwLCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyYngsJXIxNAorCWFuZHEJJXI5LCVyMTIKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQkxMjAoJXJzcCksJXJheAorCW1vdnEJJXJieCwlcmRpCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyY3gsJXJkaQorCWFkZHEJJXIxMiwlcmF4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXhvcnEJJXJjeCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJheCwlcjgKKwlhZGRxCSVyMTUsJXJheAorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyYXgsJXIxNAorCW1vdnEJMTI4KzAoJXJzcCksJXJkaQorCW1vdnEJJXIxNCwlcmF4CisKKwlhZGRxCTAoJXJkaSksJXJheAorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlhZGRxCTgoJXJkaSksJXJieAorCWFkZHEJMTYoJXJkaSksJXJjeAorCWFkZHEJMjQoJXJkaSksJXJkeAorCWFkZHEJMzIoJXJkaSksJXI4CisJYWRkcQk0MCglcmRpKSwlcjkKKwlhZGRxCTQ4KCVyZGkpLCVyMTAKKwlhZGRxCTU2KCVyZGkpLCVyMTEKKworCWNtcHEJMTI4KzE2KCVyc3ApLCVyc2kKKworCW1vdnEJJXJheCwwKCVyZGkpCisJbW92cQklcmJ4LDgoJXJkaSkKKwltb3ZxCSVyY3gsMTYoJXJkaSkKKwltb3ZxCSVyZHgsMjQoJXJkaSkKKwltb3ZxCSVyOCwzMiglcmRpKQorCW1vdnEJJXI5LDQwKCVyZGkpCisJbW92cQklcjEwLDQ4KCVyZGkpCisJbW92cQklcjExLDU2KCVyZGkpCisJamIJLkxsb29wX3hvcAorCisJbW92cQkxNTIoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCXZ6ZXJvdXBwZXIKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTGVwaWxvZ3VlX3hvcDoKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyX3hvcCwuLXNoYTUxMl9ibG9ja19kYXRhX29yZGVyX3hvcAorLnR5cGUJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4LEBmdW5jdGlvbgorLmFsaWduCTY0CitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl9hdng6CisuY2ZpX3N0YXJ0cHJvYwkKKy5MYXZ4X3Nob3J0Y3V0OgorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorCXNobHEJJDQsJXJkeAorCXN1YnEJJDE2MCwlcnNwCisJbGVhcQkoJXJzaSwlcmR4LDgpLCVyZHgKKwlhbmRxCSQtNjQsJXJzcAorCW1vdnEJJXJkaSwxMjgrMCglcnNwKQorCW1vdnEJJXJzaSwxMjgrOCglcnNwKQorCW1vdnEJJXJkeCwxMjgrMTYoJXJzcCkKKwltb3ZxCSVyYXgsMTUyKCVyc3ApCisuY2ZpX2VzY2FwZQkweDBmLDB4MDYsMHg3NywweDk4LDB4MDEsMHgwNiwweDIzLDB4MDgKKy5McHJvbG9ndWVfYXZ4OgorCisJdnplcm91cHBlcgorCW1vdnEJMCglcmRpKSwlcmF4CisJbW92cQk4KCVyZGkpLCVyYngKKwltb3ZxCTE2KCVyZGkpLCVyY3gKKwltb3ZxCTI0KCVyZGkpLCVyZHgKKwltb3ZxCTMyKCVyZGkpLCVyOAorCW1vdnEJNDAoJXJkaSksJXI5CisJbW92cQk0OCglcmRpKSwlcjEwCisJbW92cQk1NiglcmRpKSwlcjExCisJam1wCS5MbG9vcF9hdngKKy5hbGlnbgkxNgorLkxsb29wX2F2eDoKKwl2bW92ZHFhCUs1MTIrMTI4MCglcmlwKSwleG1tMTEKKwl2bW92ZHF1CTAoJXJzaSksJXhtbTAKKwlsZWFxCUs1MTIrMTI4KCVyaXApLCVyYnAKKwl2bW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJdm1vdmRxdQkzMiglcnNpKSwleG1tMgorCXZwc2h1ZmIJJXhtbTExLCV4bW0wLCV4bW0wCisJdm1vdmRxdQk0OCglcnNpKSwleG1tMworCXZwc2h1ZmIJJXhtbTExLCV4bW0xLCV4bW0xCisJdm1vdmRxdQk2NCglcnNpKSwleG1tNAorCXZwc2h1ZmIJJXhtbTExLCV4bW0yLCV4bW0yCisJdm1vdmRxdQk4MCglcnNpKSwleG1tNQorCXZwc2h1ZmIJJXhtbTExLCV4bW0zLCV4bW0zCisJdm1vdmRxdQk5NiglcnNpKSwleG1tNgorCXZwc2h1ZmIJJXhtbTExLCV4bW00LCV4bW00CisJdm1vdmRxdQkxMTIoJXJzaSksJXhtbTcKKwl2cHNodWZiCSV4bW0xMSwleG1tNSwleG1tNQorCXZwYWRkcQktMTI4KCVyYnApLCV4bW0wLCV4bW04CisJdnBzaHVmYgkleG1tMTEsJXhtbTYsJXhtbTYKKwl2cGFkZHEJLTk2KCVyYnApLCV4bW0xLCV4bW05CisJdnBzaHVmYgkleG1tMTEsJXhtbTcsJXhtbTcKKwl2cGFkZHEJLTY0KCVyYnApLCV4bW0yLCV4bW0xMAorCXZwYWRkcQktMzIoJXJicCksJXhtbTMsJXhtbTExCisJdm1vdmRxYQkleG1tOCwwKCVyc3ApCisJdnBhZGRxCTAoJXJicCksJXhtbTQsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDE2KCVyc3ApCisJdnBhZGRxCTMyKCVyYnApLCV4bW01LCV4bW05CisJdm1vdmRxYQkleG1tMTAsMzIoJXJzcCkKKwl2cGFkZHEJNjQoJXJicCksJXhtbTYsJXhtbTEwCisJdm1vdmRxYQkleG1tMTEsNDgoJXJzcCkKKwl2cGFkZHEJOTYoJXJicCksJXhtbTcsJXhtbTExCisJdm1vdmRxYQkleG1tOCw2NCglcnNwKQorCW1vdnEJJXJheCwlcjE0CisJdm1vdmRxYQkleG1tOSw4MCglcnNwKQorCW1vdnEJJXJieCwlcmRpCisJdm1vdmRxYQkleG1tMTAsOTYoJXJzcCkKKwl4b3JxCSVyY3gsJXJkaQorCXZtb3ZkcWEJJXhtbTExLDExMiglcnNwKQorCW1vdnEJJXI4LCVyMTMKKwlqbXAJLkxhdnhfMDBfNDcKKworLmFsaWduCTE2CisuTGF2eF8wMF80NzoKKwlhZGRxCSQyNTYsJXJicAorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW04CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmF4CisJdnBhbGlnbnIJJDgsJXhtbTQsJXhtbTUsJXhtbTExCisJbW92cQklcjksJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMSwleG1tOCwleG1tMTAKKwl4b3JxCSVyOCwlcjEzCisJeG9ycQklcjEwLCVyMTIKKwl2cGFkZHEJJXhtbTExLCV4bW0wLCV4bW0wCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmF4LCVyMTQKKwl2cHNybHEJJDcsJXhtbTgsJXhtbTExCisJYW5kcQklcjgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwl2cHNsbHEJJDU2LCV4bW04LCV4bW05CisJYWRkcQkwKCVyc3ApLCVyMTEKKwltb3ZxCSVyYXgsJXIxNQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTgKKwl4b3JxCSVyMTAsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZwc3JscQkkNywleG1tMTAsJXhtbTEwCisJeG9ycQklcmJ4LCVyMTUKKwlhZGRxCSVyMTIsJXIxMQorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJdnBzbGxxCSQ3LCV4bW05LCV4bW05CisJeG9ycQklcmF4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMQorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXJieCwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCXZwc3JscQkkNiwleG1tNywleG1tMTEKKwlhZGRxCSVyMTEsJXJkeAorCWFkZHEJJXJkaSwlcjExCisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXIxMSwlcjE0CisJdnBzbGxxCSQzLCV4bW03LCV4bW0xMAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMQorCXZwYWRkcQkleG1tOCwleG1tMCwleG1tMAorCW1vdnEJJXI4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDE5LCV4bW03LCV4bW05CisJeG9ycQklcmR4LCVyMTMKKwl4b3JxCSVyOSwlcjEyCisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTEsJXIxNAorCXZwc2xscQkkNDIsJXhtbTEwLCV4bW0xMAorCWFuZHEJJXJkeCwlcjEyCisJeG9ycQklcmR4LCVyMTMKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJYWRkcQk4KCVyc3ApLCVyMTAKKwltb3ZxCSVyMTEsJXJkaQorCXZwc3JscQkkNDIsJXhtbTksJXhtbTkKKwl4b3JxCSVyOSwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwl4b3JxCSVyYXgsJXJkaQorCWFkZHEJJXIxMiwlcjEwCisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXZwYWRkcQkleG1tMTEsJXhtbTAsJXhtbTAKKwl4b3JxCSVyMTEsJXIxNAorCWFkZHEJJXIxMywlcjEwCisJdnBhZGRxCS0xMjgoJXJicCksJXhtbTAsJXhtbTEwCisJeG9ycQklcmF4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjEwLCVyY3gKKwlhZGRxCSVyMTUsJXIxMAorCW1vdnEJJXJjeCwlcjEzCisJYWRkcQklcjEwLCVyMTQKKwl2bW92ZHFhCSV4bW0xMCwwKCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTEsJXhtbTIsJXhtbTgKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyMTAKKwl2cGFsaWducgkkOCwleG1tNSwleG1tNiwleG1tMTEKKwltb3ZxCSVyZHgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMSwleG1tOCwleG1tMTAKKwl4b3JxCSVyY3gsJXIxMworCXhvcnEJJXI4LCVyMTIKKwl2cGFkZHEJJXhtbTExLCV4bW0xLCV4bW0xCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcjEwLCVyMTQKKwl2cHNybHEJJDcsJXhtbTgsJXhtbTExCisJYW5kcQklcmN4LCVyMTIKKwl4b3JxCSVyY3gsJXIxMworCXZwc2xscQkkNTYsJXhtbTgsJXhtbTkKKwlhZGRxCTE2KCVyc3ApLCVyOQorCW1vdnEJJXIxMCwlcjE1CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tOAorCXhvcnEJJXI4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHNybHEJJDcsJXhtbTEwLCV4bW0xMAorCXhvcnEJJXIxMSwlcjE1CisJYWRkcQklcjEyLCVyOQorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJdnBzbGxxCSQ3LCV4bW05LCV4bW05CisJeG9ycQklcjEwLCVyMTQKKwlhZGRxCSVyMTMsJXI5CisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcjExLCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJdnBzcmxxCSQ2LCV4bW0wLCV4bW0xMQorCWFkZHEJJXI5LCVyYngKKwlhZGRxCSVyZGksJXI5CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwltb3ZxCSVyYngsJXIxMworCWFkZHEJJXI5LCVyMTQKKwl2cHNsbHEJJDMsJXhtbTAsJXhtbTEwCisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjkKKwl2cGFkZHEJJXhtbTgsJXhtbTEsJXhtbTEKKwltb3ZxCSVyY3gsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMTksJXhtbTAsJXhtbTkKKwl4b3JxCSVyYngsJXIxMworCXhvcnEJJXJkeCwlcjEyCisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyOSwlcjE0CisJdnBzbGxxCSQ0MiwleG1tMTAsJXhtbTEwCisJYW5kcQklcmJ4LCVyMTIKKwl4b3JxCSVyYngsJXIxMworCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlhZGRxCTI0KCVyc3ApLCVyOAorCW1vdnEJJXI5LCVyZGkKKwl2cHNybHEJJDQyLCV4bW05LCV4bW05CisJeG9ycQklcmR4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXhvcnEJJXIxMCwlcmRpCisJYWRkcQklcjEyLCVyOAorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl2cGFkZHEJJXhtbTExLCV4bW0xLCV4bW0xCisJeG9ycQklcjksJXIxNAorCWFkZHEJJXIxMywlcjgKKwl2cGFkZHEJLTk2KCVyYnApLCV4bW0xLCV4bW0xMAorCXhvcnEJJXIxMCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXI4LCVyYXgKKwlhZGRxCSVyMTUsJXI4CisJbW92cQklcmF4LCVyMTMKKwlhZGRxCSVyOCwlcjE0CisJdm1vdmRxYQkleG1tMTAsMTYoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tMiwleG1tMywleG1tOAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXI4CisJdnBhbGlnbnIJJDgsJXhtbTYsJXhtbTcsJXhtbTExCisJbW92cQklcmJ4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDEsJXhtbTgsJXhtbTEwCisJeG9ycQklcmF4LCVyMTMKKwl4b3JxCSVyY3gsJXIxMgorCXZwYWRkcQkleG1tMTEsJXhtbTIsJXhtbTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyOCwlcjE0CisJdnBzcmxxCSQ3LCV4bW04LCV4bW0xMQorCWFuZHEJJXJheCwlcjEyCisJeG9ycQklcmF4LCVyMTMKKwl2cHNsbHEJJDU2LCV4bW04LCV4bW05CisJYWRkcQkzMiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTgKKwl4b3JxCSVyY3gsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZwc3JscQkkNywleG1tMTAsJXhtbTEwCisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyOSwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCXZwc3JscQkkNiwleG1tMSwleG1tMTEKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwltb3ZxCSVyMTEsJXIxMworCWFkZHEJJXJkeCwlcjE0CisJdnBzbGxxCSQzLCV4bW0xLCV4bW0xMAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJkeAorCXZwYWRkcQkleG1tOCwleG1tMiwleG1tMgorCW1vdnEJJXJheCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxOSwleG1tMSwleG1tOQorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJkeCwlcjE0CisJdnBzbGxxCSQ0MiwleG1tMTAsJXhtbTEwCisJYW5kcQklcjExLCVyMTIKKwl4b3JxCSVyMTEsJXIxMworCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlhZGRxCTQwKCVyc3ApLCVyY3gKKwltb3ZxCSVyZHgsJXJkaQorCXZwc3JscQkkNDIsJXhtbTksJXhtbTkKKwl4b3JxCSVyYngsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJeG9ycQklcjgsJXJkaQorCWFkZHEJJXIxMiwlcmN4CisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXZwYWRkcQkleG1tMTEsJXhtbTIsJXhtbTIKKwl4b3JxCSVyZHgsJXIxNAorCWFkZHEJJXIxMywlcmN4CisJdnBhZGRxCS02NCglcmJwKSwleG1tMiwleG1tMTAKKwl4b3JxCSVyOCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJdm1vdmRxYQkleG1tMTAsMzIoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tOAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCXZwYWxpZ25yCSQ4LCV4bW03LCV4bW0wLCV4bW0xMQorCW1vdnEJJXIxMSwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxLCV4bW04LCV4bW0xMAorCXhvcnEJJXIxMCwlcjEzCisJeG9ycQklcmF4LCVyMTIKKwl2cGFkZHEJJXhtbTExLCV4bW0zLCV4bW0zCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmN4LCVyMTQKKwl2cHNybHEJJDcsJXhtbTgsJXhtbTExCisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCXZwc2xscQkkNTYsJXhtbTgsJXhtbTkKKwlhZGRxCTQ4KCVyc3ApLCVyYngKKwltb3ZxCSVyY3gsJXIxNQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTgKKwl4b3JxCSVyYXgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZwc3JscQkkNywleG1tMTAsJXhtbTEwCisJeG9ycQklcmR4LCVyMTUKKwlhZGRxCSVyMTIsJXJieAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJdnBzbGxxCSQ3LCV4bW05LCV4bW05CisJeG9ycQklcmN4LCVyMTQKKwlhZGRxCSVyMTMsJXJieAorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXJkeCwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCXZwc3JscQkkNiwleG1tMiwleG1tMTEKKwlhZGRxCSVyYngsJXI5CisJYWRkcQklcmRpLCVyYngKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyYngsJXIxNAorCXZwc2xscQkkMywleG1tMiwleG1tMTAKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyYngKKwl2cGFkZHEJJXhtbTgsJXhtbTMsJXhtbTMKKwltb3ZxCSVyMTAsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMTksJXhtbTIsJXhtbTkKKwl4b3JxCSVyOSwlcjEzCisJeG9ycQklcjExLCVyMTIKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJieCwlcjE0CisJdnBzbGxxCSQ0MiwleG1tMTAsJXhtbTEwCisJYW5kcQklcjksJXIxMgorCXhvcnEJJXI5LCVyMTMKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJYWRkcQk1NiglcnNwKSwlcmF4CisJbW92cQklcmJ4LCVyZGkKKwl2cHNybHEJJDQyLCV4bW05LCV4bW05CisJeG9ycQklcjExLCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXhvcnEJJXJjeCwlcmRpCisJYWRkcQklcjEyLCVyYXgKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJdnBhZGRxCSV4bW0xMSwleG1tMywleG1tMworCXhvcnEJJXJieCwlcjE0CisJYWRkcQklcjEzLCVyYXgKKwl2cGFkZHEJLTMyKCVyYnApLCV4bW0zLCV4bW0xMAorCXhvcnEJJXJjeCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJheCwlcjgKKwlhZGRxCSVyMTUsJXJheAorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyYXgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDQ4KCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTQsJXhtbTUsJXhtbTgKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyYXgKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMSwleG1tMTEKKwltb3ZxCSVyOSwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxLCV4bW04LCV4bW0xMAorCXhvcnEJJXI4LCVyMTMKKwl4b3JxCSVyMTAsJXIxMgorCXZwYWRkcQkleG1tMTEsJXhtbTQsJXhtbTQKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyYXgsJXIxNAorCXZwc3JscQkkNywleG1tOCwleG1tMTEKKwlhbmRxCSVyOCwlcjEyCisJeG9ycQklcjgsJXIxMworCXZwc2xscQkkNTYsJXhtbTgsJXhtbTkKKwlhZGRxCTY0KCVyc3ApLCVyMTEKKwltb3ZxCSVyYXgsJXIxNQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTgKKwl4b3JxCSVyMTAsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZwc3JscQkkNywleG1tMTAsJXhtbTEwCisJeG9ycQklcmJ4LCVyMTUKKwlhZGRxCSVyMTIsJXIxMQorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJdnBzbGxxCSQ3LCV4bW05LCV4bW05CisJeG9ycQklcmF4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMQorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXJieCwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCXZwc3JscQkkNiwleG1tMywleG1tMTEKKwlhZGRxCSVyMTEsJXJkeAorCWFkZHEJJXJkaSwlcjExCisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXIxMSwlcjE0CisJdnBzbGxxCSQzLCV4bW0zLCV4bW0xMAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMQorCXZwYWRkcQkleG1tOCwleG1tNCwleG1tNAorCW1vdnEJJXI4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDE5LCV4bW0zLCV4bW05CisJeG9ycQklcmR4LCVyMTMKKwl4b3JxCSVyOSwlcjEyCisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTEsJXIxNAorCXZwc2xscQkkNDIsJXhtbTEwLCV4bW0xMAorCWFuZHEJJXJkeCwlcjEyCisJeG9ycQklcmR4LCVyMTMKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJYWRkcQk3MiglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl2cHNybHEJJDQyLCV4bW05LCV4bW05CisJeG9ycQklcjksJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl2cGFkZHEJJXhtbTExLCV4bW00LCV4bW00CisJeG9ycQklcjExLCVyMTQKKwlhZGRxCSVyMTMsJXIxMAorCXZwYWRkcQkwKCVyYnApLCV4bW00LCV4bW0xMAorCXhvcnEJJXJheCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXIxMCwlcmN4CisJYWRkcQklcjE1LCVyMTAKKwltb3ZxCSVyY3gsJXIxMworCWFkZHEJJXIxMCwlcjE0CisJdm1vdmRxYQkleG1tMTAsNjQoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNSwleG1tNiwleG1tOAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0yLCV4bW0xMQorCW1vdnEJJXJkeCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxLCV4bW04LCV4bW0xMAorCXhvcnEJJXJjeCwlcjEzCisJeG9ycQklcjgsJXIxMgorCXZwYWRkcQkleG1tMTEsJXhtbTUsJXhtbTUKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTAsJXIxNAorCXZwc3JscQkkNywleG1tOCwleG1tMTEKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJdnBzbGxxCSQ1NiwleG1tOCwleG1tOQorCWFkZHEJODAoJXJzcCksJXI5CisJbW92cQklcjEwLCVyMTUKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW04CisJeG9ycQklcjgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZwc3JscQkkNywleG1tMTAsJXhtbTEwCisJeG9ycQklcjExLCVyMTUKKwlhZGRxCSVyMTIsJXI5CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyMTEsJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwl2cHNybHEJJDYsJXhtbTQsJXhtbTExCisJYWRkcQklcjksJXJieAorCWFkZHEJJXJkaSwlcjkKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorCXZwc2xscQkkMywleG1tNCwleG1tMTAKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyOQorCXZwYWRkcQkleG1tOCwleG1tNSwleG1tNQorCW1vdnEJJXJjeCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxOSwleG1tNCwleG1tOQorCXhvcnEJJXJieCwlcjEzCisJeG9ycQklcmR4LCVyMTIKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXI5LCVyMTQKKwl2cHNsbHEJJDQyLCV4bW0xMCwleG1tMTAKKwlhbmRxCSVyYngsJXIxMgorCXhvcnEJJXJieCwlcjEzCisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCWFkZHEJODgoJXJzcCksJXI4CisJbW92cQklcjksJXJkaQorCXZwc3JscQkkNDIsJXhtbTksJXhtbTkKKwl4b3JxCSVyZHgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXZwYWRkcQkleG1tMTEsJXhtbTUsJXhtbTUKKwl4b3JxCSVyOSwlcjE0CisJYWRkcQklcjEzLCVyOAorCXZwYWRkcQkzMiglcmJwKSwleG1tNSwleG1tMTAKKwl4b3JxCSVyMTAsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjE1LCVyOAorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDgwKCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTYsJXhtbTcsJXhtbTgKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyOAorCXZwYWxpZ25yCSQ4LCV4bW0yLCV4bW0zLCV4bW0xMQorCW1vdnEJJXJieCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxLCV4bW04LCV4bW0xMAorCXhvcnEJJXJheCwlcjEzCisJeG9ycQklcmN4LCVyMTIKKwl2cGFkZHEJJXhtbTExLCV4bW02LCV4bW02CisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcjgsJXIxNAorCXZwc3JscQkkNywleG1tOCwleG1tMTEKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJdnBzbGxxCSQ1NiwleG1tOCwleG1tOQorCWFkZHEJOTYoJXJzcCksJXJkeAorCW1vdnEJJXI4LCVyMTUKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW04CisJeG9ycQklcmN4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHNybHEJJDcsJXhtbTEwLCV4bW0xMAorCXhvcnEJJXI5LCVyMTUKKwlhZGRxCSVyMTIsJXJkeAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJdnBzbGxxCSQ3LCV4bW05LCV4bW05CisJeG9ycQklcjgsJXIxNAorCWFkZHEJJXIxMywlcmR4CisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcjksJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwl2cHNybHEJJDYsJXhtbTUsJXhtbTExCisJYWRkcQklcmR4LCVyMTEKKwlhZGRxCSVyZGksJXJkeAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorCXZwc2xscQkkMywleG1tNSwleG1tMTAKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyZHgKKwl2cGFkZHEJJXhtbTgsJXhtbTYsJXhtbTYKKwltb3ZxCSVyYXgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMTksJXhtbTUsJXhtbTkKKwl4b3JxCSVyMTEsJXIxMworCXhvcnEJJXJieCwlcjEyCisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyZHgsJXIxNAorCXZwc2xscQkkNDIsJXhtbTEwLCV4bW0xMAorCWFuZHEJJXIxMSwlcjEyCisJeG9ycQklcjExLCVyMTMKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJYWRkcQkxMDQoJXJzcCksJXJjeAorCW1vdnEJJXJkeCwlcmRpCisJdnBzcmxxCSQ0MiwleG1tOSwleG1tOQorCXhvcnEJJXJieCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwl4b3JxCSVyOCwlcmRpCisJYWRkcQklcjEyLCVyY3gKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJdnBhZGRxCSV4bW0xMSwleG1tNiwleG1tNgorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl2cGFkZHEJNjQoJXJicCksJXhtbTYsJXhtbTEwCisJeG9ycQklcjgsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyY3gsJXIxMAorCWFkZHEJJXIxNSwlcmN4CisJbW92cQklcjEwLCVyMTMKKwlhZGRxCSVyY3gsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDk2KCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTcsJXhtbTAsJXhtbTgKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyY3gKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tMTEKKwltb3ZxCSVyMTEsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMSwleG1tOCwleG1tMTAKKwl4b3JxCSVyMTAsJXIxMworCXhvcnEJJXJheCwlcjEyCisJdnBhZGRxCSV4bW0xMSwleG1tNywleG1tNworCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJjeCwlcjE0CisJdnBzcmxxCSQ3LCV4bW04LCV4bW0xMQorCWFuZHEJJXIxMCwlcjEyCisJeG9ycQklcjEwLCVyMTMKKwl2cHNsbHEJJDU2LCV4bW04LCV4bW05CisJYWRkcQkxMTIoJXJzcCksJXJieAorCW1vdnEJJXJjeCwlcjE1CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tOAorCXhvcnEJJXJheCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnBzcmxxCSQ3LCV4bW0xMCwleG1tMTAKKwl4b3JxCSVyZHgsJXIxNQorCWFkZHEJJXIxMiwlcmJ4CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyY3gsJXIxNAorCWFkZHEJJXIxMywlcmJ4CisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmR4LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJdnBzcmxxCSQ2LCV4bW02LCV4bW0xMQorCWFkZHEJJXJieCwlcjkKKwlhZGRxCSVyZGksJXJieAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJbW92cQklcjksJXIxMworCWFkZHEJJXJieCwlcjE0CisJdnBzbGxxCSQzLCV4bW02LCV4bW0xMAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJieAorCXZwYWRkcQkleG1tOCwleG1tNywleG1tNworCW1vdnEJJXIxMCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxOSwleG1tNiwleG1tOQorCXhvcnEJJXI5LCVyMTMKKwl4b3JxCSVyMTEsJXIxMgorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmJ4LCVyMTQKKwl2cHNsbHEJJDQyLCV4bW0xMCwleG1tMTAKKwlhbmRxCSVyOSwlcjEyCisJeG9ycQklcjksJXIxMworCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlhZGRxCTEyMCglcnNwKSwlcmF4CisJbW92cQklcmJ4LCVyZGkKKwl2cHNybHEJJDQyLCV4bW05LCV4bW05CisJeG9ycQklcjExLCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXhvcnEJJXJjeCwlcmRpCisJYWRkcQklcjEyLCVyYXgKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJdnBhZGRxCSV4bW0xMSwleG1tNywleG1tNworCXhvcnEJJXJieCwlcjE0CisJYWRkcQklcjEzLCVyYXgKKwl2cGFkZHEJOTYoJXJicCksJXhtbTcsJXhtbTEwCisJeG9ycQklcmN4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmF4LCVyOAorCWFkZHEJJXIxNSwlcmF4CisJbW92cQklcjgsJXIxMworCWFkZHEJJXJheCwlcjE0CisJdm1vdmRxYQkleG1tMTAsMTEyKCVyc3ApCisJY21wYgkkMCwxMzUoJXJicCkKKwlqbmUJLkxhdnhfMDBfNDcKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyYXgKKwltb3ZxCSVyOSwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJeG9ycQklcjgsJXIxMworCXhvcnEJJXIxMCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmF4LCVyMTQKKwlhbmRxCSVyOCwlcjEyCisJeG9ycQklcjgsJXIxMworCWFkZHEJMCglcnNwKSwlcjExCisJbW92cQklcmF4LCVyMTUKKwl4b3JxCSVyMTAsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXJieCwlcjE1CisJYWRkcQklcjEyLCVyMTEKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyYXgsJXIxNAorCWFkZHEJJXIxMywlcjExCisJeG9ycQklcmJ4LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjExLCVyZHgKKwlhZGRxCSVyZGksJXIxMQorCW1vdnEJJXJkeCwlcjEzCisJYWRkcQklcjExLCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyOCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwl4b3JxCSVyOSwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcjExLCVyMTQKKwlhbmRxCSVyZHgsJXIxMgorCXhvcnEJJXJkeCwlcjEzCisJYWRkcQk4KCVyc3ApLCVyMTAKKwltb3ZxCSVyMTEsJXJkaQorCXhvcnEJJXI5LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyYXgsJXJkaQorCWFkZHEJJXIxMiwlcjEwCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjExLCVyMTQKKwlhZGRxCSVyMTMsJXIxMAorCXhvcnEJJXJheCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXIxMCwlcmN4CisJYWRkcQklcjE1LCVyMTAKKwltb3ZxCSVyY3gsJXIxMworCWFkZHEJJXIxMCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjEwCisJbW92cQklcmR4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyY3gsJXIxMworCXhvcnEJJXI4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjEyCisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCTE2KCVyc3ApLCVyOQorCW1vdnEJJXIxMCwlcjE1CisJeG9ycQklcjgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXIxMSwlcjE1CisJYWRkcQklcjEyLCVyOQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXIxMCwlcjE0CisJYWRkcQklcjEzLCVyOQorCXhvcnEJJXIxMSwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXI5LCVyYngKKwlhZGRxCSVyZGksJXI5CisJbW92cQklcmJ4LCVyMTMKKwlhZGRxCSVyOSwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjkKKwltb3ZxCSVyY3gsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJeG9ycQklcmR4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyOSwlcjE0CisJYW5kcQklcmJ4LCVyMTIKKwl4b3JxCSVyYngsJXIxMworCWFkZHEJMjQoJXJzcCksJXI4CisJbW92cQklcjksJXJkaQorCXhvcnEJJXJkeCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjksJXIxNAorCWFkZHEJJXIxMywlcjgKKwl4b3JxCSVyMTAsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjE1LCVyOAorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjgsJXIxNAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXI4CisJbW92cQklcmJ4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCXhvcnEJJXJjeCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjEyCisJeG9ycQklcmF4LCVyMTMKKwlhZGRxCTMyKCVyc3ApLCVyZHgKKwltb3ZxCSVyOCwlcjE1CisJeG9ycQklcmN4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyOSwlcjE1CisJYWRkcQklcjEyLCVyZHgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl4b3JxCSVyOSwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJkeCwlcjExCisJYWRkcQklcmRpLCVyZHgKKwltb3ZxCSVyMTEsJXIxMworCWFkZHEJJXJkeCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmR4CisJbW92cQklcmF4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyMTEsJXIxMworCXhvcnEJJXJieCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMSwlcjEzCisJYWRkcQk0MCglcnNwKSwlcmN4CisJbW92cQklcmR4LCVyZGkKKwl4b3JxCSVyYngsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXI4LCVyZGkKKwlhZGRxCSVyMTIsJXJjeAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl4b3JxCSVyOCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmN4CisJbW92cQklcjExLCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyMTAsJXIxMworCXhvcnEJJXJheCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmN4LCVyMTQKKwlhbmRxCSVyMTAsJXIxMgorCXhvcnEJJXIxMCwlcjEzCisJYWRkcQk0OCglcnNwKSwlcmJ4CisJbW92cQklcmN4LCVyMTUKKwl4b3JxCSVyYXgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXJkeCwlcjE1CisJYWRkcQklcjEyLCVyYngKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyY3gsJXIxNAorCWFkZHEJJXIxMywlcmJ4CisJeG9ycQklcmR4LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmJ4LCVyOQorCWFkZHEJJXJkaSwlcmJ4CisJbW92cQklcjksJXIxMworCWFkZHEJJXJieCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmJ4CisJbW92cQklcjEwLCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJeG9ycQklcjExLCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyYngsJXIxNAorCWFuZHEJJXI5LCVyMTIKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQk1NiglcnNwKSwlcmF4CisJbW92cQklcmJ4LCVyZGkKKwl4b3JxCSVyMTEsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXJjeCwlcmRpCisJYWRkcQklcjEyLCVyYXgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyYngsJXIxNAorCWFkZHEJJXIxMywlcmF4CisJeG9ycQklcmN4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmF4LCVyOAorCWFkZHEJJXIxNSwlcmF4CisJbW92cQklcjgsJXIxMworCWFkZHEJJXJheCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmF4CisJbW92cQklcjksJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXI4LCVyMTMKKwl4b3JxCSVyMTAsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJheCwlcjE0CisJYW5kcQklcjgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwlhZGRxCTY0KCVyc3ApLCVyMTEKKwltb3ZxCSVyYXgsJXIxNQorCXhvcnEJJXIxMCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcmJ4LCVyMTUKKwlhZGRxCSVyMTIsJXIxMQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXJheCwlcjE0CisJYWRkcQklcjEzLCVyMTEKKwl4b3JxCSVyYngsJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyMTEsJXJkeAorCWFkZHEJJXJkaSwlcjExCisJbW92cQklcmR4LCVyMTMKKwlhZGRxCSVyMTEsJXIxNAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXI4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyZHgsJXIxMworCXhvcnEJJXI5LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTEsJXIxNAorCWFuZHEJJXJkeCwlcjEyCisJeG9ycQklcmR4LCVyMTMKKwlhZGRxCTcyKCVyc3ApLCVyMTAKKwltb3ZxCSVyMTEsJXJkaQorCXhvcnEJJXI5LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyYXgsJXJkaQorCWFkZHEJJXIxMiwlcjEwCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjExLCVyMTQKKwlhZGRxCSVyMTMsJXIxMAorCXhvcnEJJXJheCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXIxMCwlcmN4CisJYWRkcQklcjE1LCVyMTAKKwltb3ZxCSVyY3gsJXIxMworCWFkZHEJJXIxMCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjEwCisJbW92cQklcmR4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyY3gsJXIxMworCXhvcnEJJXI4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjEyCisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCTgwKCVyc3ApLCVyOQorCW1vdnEJJXIxMCwlcjE1CisJeG9ycQklcjgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXIxMSwlcjE1CisJYWRkcQklcjEyLCVyOQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXIxMCwlcjE0CisJYWRkcQklcjEzLCVyOQorCXhvcnEJJXIxMSwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXI5LCVyYngKKwlhZGRxCSVyZGksJXI5CisJbW92cQklcmJ4LCVyMTMKKwlhZGRxCSVyOSwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjkKKwltb3ZxCSVyY3gsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJeG9ycQklcmR4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyOSwlcjE0CisJYW5kcQklcmJ4LCVyMTIKKwl4b3JxCSVyYngsJXIxMworCWFkZHEJODgoJXJzcCksJXI4CisJbW92cQklcjksJXJkaQorCXhvcnEJJXJkeCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjksJXIxNAorCWFkZHEJJXIxMywlcjgKKwl4b3JxCSVyMTAsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjE1LCVyOAorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjgsJXIxNAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXI4CisJbW92cQklcmJ4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCXhvcnEJJXJjeCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjEyCisJeG9ycQklcmF4LCVyMTMKKwlhZGRxCTk2KCVyc3ApLCVyZHgKKwltb3ZxCSVyOCwlcjE1CisJeG9ycQklcmN4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyOSwlcjE1CisJYWRkcQklcjEyLCVyZHgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl4b3JxCSVyOSwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJkeCwlcjExCisJYWRkcQklcmRpLCVyZHgKKwltb3ZxCSVyMTEsJXIxMworCWFkZHEJJXJkeCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmR4CisJbW92cQklcmF4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyMTEsJXIxMworCXhvcnEJJXJieCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMSwlcjEzCisJYWRkcQkxMDQoJXJzcCksJXJjeAorCW1vdnEJJXJkeCwlcmRpCisJeG9ycQklcmJ4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyOCwlcmRpCisJYWRkcQklcjEyLCVyY3gKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyZHgsJXIxNAorCWFkZHEJJXIxMywlcmN4CisJeG9ycQklcjgsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyY3gsJXIxMAorCWFkZHEJJXIxNSwlcmN4CisJbW92cQklcjEwLCVyMTMKKwlhZGRxCSVyY3gsJXIxNAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCW1vdnEJJXIxMSwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJeG9ycQklcjEwLCVyMTMKKwl4b3JxCSVyYXgsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJjeCwlcjE0CisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJMTEyKCVyc3ApLCVyYngKKwltb3ZxCSVyY3gsJXIxNQorCXhvcnEJJXJheCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcmR4LCVyMTUKKwlhZGRxCSVyMTIsJXJieAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXJjeCwlcjE0CisJYWRkcQklcjEzLCVyYngKKwl4b3JxCSVyZHgsJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyYngsJXI5CisJYWRkcQklcmRpLCVyYngKKwltb3ZxCSVyOSwlcjEzCisJYWRkcQklcmJ4LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyYngKKwltb3ZxCSVyMTAsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXI5LCVyMTMKKwl4b3JxCSVyMTEsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJieCwlcjE0CisJYW5kcQklcjksJXIxMgorCXhvcnEJJXI5LCVyMTMKKwlhZGRxCTEyMCglcnNwKSwlcmF4CisJbW92cQklcmJ4LCVyZGkKKwl4b3JxCSVyMTEsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXJjeCwlcmRpCisJYWRkcQklcjEyLCVyYXgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyYngsJXIxNAorCWFkZHEJJXIxMywlcmF4CisJeG9ycQklcmN4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmF4LCVyOAorCWFkZHEJJXIxNSwlcmF4CisJbW92cQklcjgsJXIxMworCWFkZHEJJXJheCwlcjE0CisJbW92cQkxMjgrMCglcnNwKSwlcmRpCisJbW92cQklcjE0LCVyYXgKKworCWFkZHEJMCglcmRpKSwlcmF4CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCWFkZHEJOCglcmRpKSwlcmJ4CisJYWRkcQkxNiglcmRpKSwlcmN4CisJYWRkcQkyNCglcmRpKSwlcmR4CisJYWRkcQkzMiglcmRpKSwlcjgKKwlhZGRxCTQwKCVyZGkpLCVyOQorCWFkZHEJNDgoJXJkaSksJXIxMAorCWFkZHEJNTYoJXJkaSksJXIxMQorCisJY21wcQkxMjgrMTYoJXJzcCksJXJzaQorCisJbW92cQklcmF4LDAoJXJkaSkKKwltb3ZxCSVyYngsOCglcmRpKQorCW1vdnEJJXJjeCwxNiglcmRpKQorCW1vdnEJJXJkeCwyNCglcmRpKQorCW1vdnEJJXI4LDMyKCVyZGkpCisJbW92cQklcjksNDAoJXJkaSkKKwltb3ZxCSVyMTAsNDgoJXJkaSkKKwltb3ZxCSVyMTEsNTYoJXJkaSkKKwlqYgkuTGxvb3BfYXZ4CisKKwltb3ZxCTE1MiglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw4CisJdnplcm91cHBlcgorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyc2kpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MZXBpbG9ndWVfYXZ4OgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4LC4tc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Nl82NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvdnBhZXMteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhMDg5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbGludXgteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Nl82NC5TCkBAIC0wLDAgKzEsODM0IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisKKworCisKKworCisKKworCisKKworCisKKworCisudHlwZQlfdnBhZXNfZW5jcnlwdF9jb3JlLEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfZW5jcnlwdF9jb3JlOgorCW1vdnEJJXJkeCwlcjkKKwltb3ZxCSQxNiwlcjExCisJbW92bAkyNDAoJXJkeCksJWVheAorCW1vdmRxYQkleG1tOSwleG1tMQorCW1vdmRxYQkuTGtfaXB0KCVyaXApLCV4bW0yCisJcGFuZG4JJXhtbTAsJXhtbTEKKwltb3ZkcXUJKCVyOSksJXhtbTUKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQkuTGtfaXB0KzE2KCVyaXApLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlweG9yCSV4bW01LCV4bW0yCisJYWRkcQkkMTYsJXI5CisJcHhvcgkleG1tMiwleG1tMAorCWxlYXEJLkxrX21jX2JhY2t3YXJkKCVyaXApLCVyMTAKKwlqbXAJLkxlbmNfZW50cnkKKworLmFsaWduCTE2CisuTGVuY19sb29wOgorCisJbW92ZHFhCSV4bW0xMywleG1tNAorCW1vdmRxYQkleG1tMTIsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk1CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMTUsJXhtbTUKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCS02NCglcjExLCVyMTAsMSksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIzNAorCW1vdmRxYQkoJXIxMSwlcjEwLDEpLCV4bW00CisJbW92ZHFhCSV4bW0xNCwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjExCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tNSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJYWRkcQkkMTYsJXI5CisJcHhvcgkleG1tMiwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJYWRkcQkkMTYsJXIxMQorCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCWFuZHEJJDB4MzAsJXIxMQorCXN1YnEJJDEsJXJheAorCXB4b3IJJXhtbTMsJXhtbTAKKworLkxlbmNfZW50cnk6CisKKwltb3ZkcWEJJXhtbTksJXhtbTEKKwltb3ZkcWEJJXhtbTExLCV4bW01CisJcGFuZG4JJXhtbTAsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIzMgorCW1vdmRxYQkleG1tMTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcWEJJXhtbTEwLCV4bW00CisJcHhvcgkleG1tNSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjI0CisJbW92ZHFhCSV4bW0xMCwleG1tMgorCXB4b3IJJXhtbTUsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMQorCW1vdmRxYQkleG1tMTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjAKKwltb3ZkcXUJKCVyOSksJXhtbTUKKwlweG9yCSV4bW0xLCV4bW0zCisJam56CS5MZW5jX2xvb3AKKworCisJbW92ZHFhCS05NiglcjEwKSwleG1tNAorCW1vdmRxYQktODAoJXIxMCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorCXB4b3IJJXhtbTUsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NQorCW1vdmRxYQk2NCglcjExLCVyMTAsMSksJXhtbTEKKwlweG9yCSV4bW00LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV92cGFlc19lbmNyeXB0X2NvcmUsLi1fdnBhZXNfZW5jcnlwdF9jb3JlCisKKworCisKKworCisudHlwZQlfdnBhZXNfZGVjcnlwdF9jb3JlLEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfZGVjcnlwdF9jb3JlOgorCW1vdnEJJXJkeCwlcjkKKwltb3ZsCTI0MCglcmR4KSwlZWF4CisJbW92ZHFhCSV4bW05LCV4bW0xCisJbW92ZHFhCS5Ma19kaXB0KCVyaXApLCV4bW0yCisJcGFuZG4JJXhtbTAsJXhtbTEKKwltb3ZxCSVyYXgsJXIxMQorCXBzcmxkCSQ0LCV4bW0xCisJbW92ZHF1CSglcjkpLCV4bW01CisJc2hscQkkNCwlcjExCisJcGFuZAkleG1tOSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCS5Ma19kaXB0KzE2KCVyaXApLCV4bW0wCisJeG9ycQkkMHgzMCwlcjExCisJbGVhcQkuTGtfZHNiZCglcmlwKSwlcjEwCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlhbmRxCSQweDMwLCVyMTEKKwlweG9yCSV4bW01LCV4bW0yCisJbW92ZHFhCS5Ma19tY19mb3J3YXJkKzQ4KCVyaXApLCV4bW01CisJcHhvcgkleG1tMiwleG1tMAorCWFkZHEJJDE2LCVyOQorCWFkZHEJJXIxMCwlcjExCisJam1wCS5MZGVjX2VudHJ5CisKKy5hbGlnbgkxNgorLkxkZWNfbG9vcDoKKworCisKKwltb3ZkcWEJLTMyKCVyMTApLCV4bW00CisJbW92ZHFhCS0xNiglcjEwKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDMKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCTAoJXIxMCksJXhtbTQKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCTE2KCVyMTApLCV4bW0xCisKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDMKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCTMyKCVyMTApLCV4bW00CisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQk0OCglcjEwKSwleG1tMQorCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQk2NCglcjEwKSwleG1tNAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJODAoJXIxMCksJXhtbTEKKworLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMworCXB4b3IJJXhtbTQsJXhtbTAKKwlhZGRxCSQxNiwlcjkKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKwlweG9yCSV4bW0xLCV4bW0wCisJc3VicQkkMSwlcmF4CisKKy5MZGVjX2VudHJ5OgorCisJbW92ZHFhCSV4bW05LCV4bW0xCisJcGFuZG4JJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTExLCV4bW0yCisJcHNybGQJJDQsJXhtbTEKKwlwYW5kCSV4bW05LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwltb3ZkcWEJJXhtbTEwLCV4bW0zCisJcHhvcgkleG1tMSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJbW92ZHFhCSV4bW0xMCwleG1tNAorCXB4b3IJJXhtbTIsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNAorCXB4b3IJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTEwLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJbW92ZHF1CSglcjkpLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMworCWpuegkuTGRlY19sb29wCisKKworCW1vdmRxYQk5NiglcjEwKSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxYQkxMTIoJXIxMCksJXhtbTAKKwltb3ZkcWEJLTM1MiglcjExKSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk1CisJcHhvcgkleG1tNCwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTk0CisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfdnBhZXNfZGVjcnlwdF9jb3JlLC4tX3ZwYWVzX2RlY3J5cHRfY29yZQorCisKKworCisKKworLnR5cGUJX3ZwYWVzX3NjaGVkdWxlX2NvcmUsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK192cGFlc19zY2hlZHVsZV9jb3JlOgorCisKKworCisKKwljYWxsCV92cGFlc19wcmVoZWF0CisJbW92ZHFhCS5Ma19yY29uKCVyaXApLCV4bW04CisJbW92ZHF1CSglcmRpKSwleG1tMAorCisKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlsZWFxCS5Ma19pcHQoJXJpcCksJXIxMQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmRxYQkleG1tMCwleG1tNworCisJbGVhcQkuTGtfc3IoJXJpcCksJXIxMAorCXRlc3RxCSVyY3gsJXJjeAorCWpuegkuTHNjaGVkdWxlX2FtX2RlY3J5cHRpbmcKKworCisJbW92ZHF1CSV4bW0wLCglcmR4KQorCWptcAkuTHNjaGVkdWxlX2dvCisKKy5Mc2NoZWR1bGVfYW1fZGVjcnlwdGluZzoKKworCW1vdmRxYQkoJXI4LCVyMTAsMSksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCW1vdmRxdQkleG1tMywoJXJkeCkKKwl4b3JxCSQweDMwLCVyOAorCisuTHNjaGVkdWxlX2dvOgorCWNtcGwJJDE5MiwlZXNpCisJamEJLkxzY2hlZHVsZV8yNTYKKwlqZQkuTHNjaGVkdWxlXzE5MgorCisKKworCisKKworCisKKworCisuTHNjaGVkdWxlXzEyODoKKwltb3ZsCSQxMCwlZXNpCisKKy5Mb29wX3NjaGVkdWxlXzEyODoKKwljYWxsCV92cGFlc19zY2hlZHVsZV9yb3VuZAorCWRlY3EJJXJzaQorCWp6CS5Mc2NoZWR1bGVfbWFuZ2xlX2xhc3QKKwljYWxsCV92cGFlc19zY2hlZHVsZV9tYW5nbGUKKwlqbXAJLkxvb3Bfc2NoZWR1bGVfMTI4CisKKworCisKKworCisKKworCisKKworCisKKworCisKKy5hbGlnbgkxNgorLkxzY2hlZHVsZV8xOTI6CisJbW92ZHF1CTgoJXJkaSksJXhtbTAKKwljYWxsCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcWEJJXhtbTAsJXhtbTYKKwlweG9yCSV4bW00LCV4bW00CisJbW92aGxwcwkleG1tNCwleG1tNgorCW1vdmwJJDQsJWVzaQorCisuTG9vcF9zY2hlZHVsZV8xOTI6CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKy5ieXRlCTEwMiwxNSw1OCwxNSwxOTgsOAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJZGVjcQklcnNpCisJanoJLkxzY2hlZHVsZV9tYW5nbGVfbGFzdAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcgorCWptcAkuTG9vcF9zY2hlZHVsZV8xOTIKKworCisKKworCisKKworCisKKworCisuYWxpZ24JMTYKKy5Mc2NoZWR1bGVfMjU2OgorCW1vdmRxdQkxNiglcmRpKSwleG1tMAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmwJJDcsJWVzaQorCisuTG9vcF9zY2hlZHVsZV8yNTY6CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJbW92ZHFhCSV4bW0wLCV4bW02CisKKworCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJZGVjcQklcnNpCisJanoJLkxzY2hlZHVsZV9tYW5nbGVfbGFzdAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCisKKwlwc2h1ZmQJJDB4RkYsJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTcsJXhtbTUKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwljYWxsCV92cGFlc19zY2hlZHVsZV9sb3dfcm91bmQKKwltb3ZkcWEJJXhtbTUsJXhtbTcKKworCWptcAkuTG9vcF9zY2hlZHVsZV8yNTYKKworCisKKworCisKKworCisKKworCisKKy5hbGlnbgkxNgorLkxzY2hlZHVsZV9tYW5nbGVfbGFzdDoKKworCWxlYXEJLkxrX2Rlc2tldyglcmlwKSwlcjExCisJdGVzdHEJJXJjeCwlcmN4CisJam56CS5Mc2NoZWR1bGVfbWFuZ2xlX2xhc3RfZGVjCisKKworCW1vdmRxYQkoJXI4LCVyMTAsMSksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCWxlYXEJLkxrX29wdCglcmlwKSwlcjExCisJYWRkcQkkMzIsJXJkeAorCisuTHNjaGVkdWxlX21hbmdsZV9sYXN0X2RlYzoKKwlhZGRxCSQtMTYsJXJkeAorCXB4b3IJLkxrX3M2MyglcmlwKSwleG1tMAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmRxdQkleG1tMCwoJXJkeCkKKworCisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV92cGFlc19zY2hlZHVsZV9jb3JlLC4tX3ZwYWVzX3NjaGVkdWxlX2NvcmUKKworCisKKworCisKKworCisKKworCisKKworCisKKy50eXBlCV92cGFlc19zY2hlZHVsZV8xOTJfc21lYXIsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK192cGFlc19zY2hlZHVsZV8xOTJfc21lYXI6CisJcHNodWZkCSQweDgwLCV4bW02LCV4bW0xCisJcHNodWZkCSQweEZFLCV4bW03LCV4bW0wCisJcHhvcgkleG1tMSwleG1tNgorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0wCisJbW92aGxwcwkleG1tMSwleG1tNgorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhciwuLV92cGFlc19zY2hlZHVsZV8xOTJfc21lYXIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworLnR5cGUJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kLEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfcm91bmQ6CisKKwlweG9yCSV4bW0xLCV4bW0xCisuYnl0ZQkxMDIsNjUsMTUsNTgsMTUsMjAwLDE1CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDE1CisJcHhvcgkleG1tMSwleG1tNworCisKKwlwc2h1ZmQJJDB4RkYsJXhtbTAsJXhtbTAKKy5ieXRlCTEwMiwxNSw1OCwxNSwxOTIsMQorCisKKworCitfdnBhZXNfc2NoZWR1bGVfbG93X3JvdW5kOgorCisJbW92ZHFhCSV4bW03LCV4bW0xCisJcHNsbGRxCSQ0LCV4bW03CisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tNywleG1tMQorCXBzbGxkcQkkOCwleG1tNworCXB4b3IJJXhtbTEsJXhtbTcKKwlweG9yCS5Ma19zNjMoJXJpcCksJXhtbTcKKworCisJbW92ZHFhCSV4bW05LCV4bW0xCisJcGFuZG4JJXhtbTAsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTksJXhtbTAKKwltb3ZkcWEJJXhtbTExLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0xMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgkleG1tMiwleG1tMworCW1vdmRxYQkleG1tMTAsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNAorCXB4b3IJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTEwLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwlweG9yCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW0xMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJcHhvcgkleG1tMSwleG1tMworCW1vdmRxYQkleG1tMTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorCW1vdmRxYQkleG1tMTIsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NQorCXB4b3IJJXhtbTQsJXhtbTAKKworCisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tNworCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kLC4tX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisKKworCisKKworCisKKworCisKKy50eXBlCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0sQGZ1bmN0aW9uCisuYWxpZ24JMTYKK192cGFlc19zY2hlZHVsZV90cmFuc2Zvcm06CisJbW92ZHFhCSV4bW05LCV4bW0xCisJcGFuZG4JJXhtbTAsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTksJXhtbTAKKwltb3ZkcWEJKCVyMTEpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwltb3ZkcWEJMTYoJXIxMSksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCXB4b3IJJXhtbTIsJXhtbTAKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0sLi1fdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisudHlwZQlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlLEBmdW5jdGlvbgorLmFsaWduCTE2CitfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlOgorCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkuTGtfbWNfZm9yd2FyZCglcmlwKSwleG1tNQorCXRlc3RxCSVyY3gsJXJjeAorCWpuegkuTHNjaGVkdWxlX21hbmdsZV9kZWMKKworCisJYWRkcQkkMTYsJXJkeAorCXB4b3IJLkxrX3M2MyglcmlwKSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjI5CisJbW92ZHFhCSV4bW00LCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjkKKwlweG9yCSV4bW00LCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjkKKwlweG9yCSV4bW00LCV4bW0zCisKKwlqbXAJLkxzY2hlZHVsZV9tYW5nbGVfYm90aAorLmFsaWduCTE2CisuTHNjaGVkdWxlX21hbmdsZV9kZWM6CisKKwlsZWFxCS5Ma19ka3NkKCVyaXApLCVyMTEKKwltb3ZkcWEJJXhtbTksJXhtbTEKKwlwYW5kbgkleG1tNCwleG1tMQorCXBzcmxkCSQ0LCV4bW0xCisJcGFuZAkleG1tOSwleG1tNAorCisJbW92ZHFhCTAoJXIxMSksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMgorCW1vdmRxYQkxNiglcjExKSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgkleG1tMiwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIxCisKKwltb3ZkcWEJMzIoJXIxMSksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcWEJNDgoJXIxMSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJJXhtbTIsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMQorCisJbW92ZHFhCTY0KCVyMTEpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTIKKwlweG9yCSV4bW0zLCV4bW0yCisJbW92ZHFhCTgwKCVyMTEpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCSV4bW0yLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjEKKworCW1vdmRxYQk5NiglcjExKSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjEyCisJcHhvcgkleG1tMywleG1tMgorCW1vdmRxYQkxMTIoJXIxMSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJJXhtbTIsJXhtbTMKKworCWFkZHEJJC0xNiwlcmR4CisKKy5Mc2NoZWR1bGVfbWFuZ2xlX2JvdGg6CisJbW92ZHFhCSglcjgsJXIxMCwxKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJYWRkcQkkLTE2LCVyOAorCWFuZHEJJDB4MzAsJXI4CisJbW92ZHF1CSV4bW0zLCglcmR4KQorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZSwuLV92cGFlc19zY2hlZHVsZV9tYW5nbGUKKworCisKKworLmdsb2JsCXZwYWVzX3NldF9lbmNyeXB0X2tleQorLmhpZGRlbiB2cGFlc19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCXZwYWVzX3NldF9lbmNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgordnBhZXNfc2V0X2VuY3J5cHRfa2V5OgorCW1vdmwJJWVzaSwlZWF4CisJc2hybAkkNSwlZWF4CisJYWRkbAkkNSwlZWF4CisJbW92bAklZWF4LDI0MCglcmR4KQorCisJbW92bAkkMCwlZWN4CisJbW92bAkkMHgzMCwlcjhkCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfY29yZQorCXhvcmwJJWVheCwlZWF4CisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQl2cGFlc19zZXRfZW5jcnlwdF9rZXksLi12cGFlc19zZXRfZW5jcnlwdF9rZXkKKworLmdsb2JsCXZwYWVzX3NldF9kZWNyeXB0X2tleQorLmhpZGRlbiB2cGFlc19zZXRfZGVjcnlwdF9rZXkKKy50eXBlCXZwYWVzX3NldF9kZWNyeXB0X2tleSxAZnVuY3Rpb24KKy5hbGlnbgkxNgordnBhZXNfc2V0X2RlY3J5cHRfa2V5OgorCW1vdmwJJWVzaSwlZWF4CisJc2hybAkkNSwlZWF4CisJYWRkbAkkNSwlZWF4CisJbW92bAklZWF4LDI0MCglcmR4KQorCXNobGwJJDQsJWVheAorCWxlYXEJMTYoJXJkeCwlcmF4LDEpLCVyZHgKKworCW1vdmwJJDEsJWVjeAorCW1vdmwJJWVzaSwlcjhkCisJc2hybAkkMSwlcjhkCisJYW5kbAkkMzIsJXI4ZAorCXhvcmwJJDMyLCVyOGQKKwljYWxsCV92cGFlc19zY2hlZHVsZV9jb3JlCisJeG9ybAklZWF4LCVlYXgKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCXZwYWVzX3NldF9kZWNyeXB0X2tleSwuLXZwYWVzX3NldF9kZWNyeXB0X2tleQorCisuZ2xvYmwJdnBhZXNfZW5jcnlwdAorLmhpZGRlbiB2cGFlc19lbmNyeXB0CisudHlwZQl2cGFlc19lbmNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2Cit2cGFlc19lbmNyeXB0OgorCW1vdmRxdQkoJXJkaSksJXhtbTAKKwljYWxsCV92cGFlc19wcmVoZWF0CisJY2FsbAlfdnBhZXNfZW5jcnlwdF9jb3JlCisJbW92ZHF1CSV4bW0wLCglcnNpKQorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJdnBhZXNfZW5jcnlwdCwuLXZwYWVzX2VuY3J5cHQKKworLmdsb2JsCXZwYWVzX2RlY3J5cHQKKy5oaWRkZW4gdnBhZXNfZGVjcnlwdAorLnR5cGUJdnBhZXNfZGVjcnlwdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgordnBhZXNfZGVjcnlwdDoKKwltb3ZkcXUJKCVyZGkpLCV4bW0wCisJY2FsbAlfdnBhZXNfcHJlaGVhdAorCWNhbGwJX3ZwYWVzX2RlY3J5cHRfY29yZQorCW1vdmRxdQkleG1tMCwoJXJzaSkKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCXZwYWVzX2RlY3J5cHQsLi12cGFlc19kZWNyeXB0CisuZ2xvYmwJdnBhZXNfY2JjX2VuY3J5cHQKKy5oaWRkZW4gdnBhZXNfY2JjX2VuY3J5cHQKKy50eXBlCXZwYWVzX2NiY19lbmNyeXB0LEBmdW5jdGlvbgorLmFsaWduCTE2Cit2cGFlc19jYmNfZW5jcnlwdDoKKwl4Y2hncQklcmN4LCVyZHgKKwlzdWJxCSQxNiwlcmN4CisJamMJLkxjYmNfYWJvcnQKKwltb3ZkcXUJKCVyOCksJXhtbTYKKwlzdWJxCSVyZGksJXJzaQorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKwljbXBsCSQwLCVyOWQKKwlqZQkuTGNiY19kZWNfbG9vcAorCWptcAkuTGNiY19lbmNfbG9vcAorLmFsaWduCTE2CisuTGNiY19lbmNfbG9vcDoKKwltb3ZkcXUJKCVyZGkpLCV4bW0wCisJcHhvcgkleG1tNiwleG1tMAorCWNhbGwJX3ZwYWVzX2VuY3J5cHRfY29yZQorCW1vdmRxYQkleG1tMCwleG1tNgorCW1vdmRxdQkleG1tMCwoJXJzaSwlcmRpLDEpCisJbGVhcQkxNiglcmRpKSwlcmRpCisJc3VicQkkMTYsJXJjeAorCWpuYwkuTGNiY19lbmNfbG9vcAorCWptcAkuTGNiY19kb25lCisuYWxpZ24JMTYKKy5MY2JjX2RlY19sb29wOgorCW1vdmRxdQkoJXJkaSksJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwljYWxsCV92cGFlc19kZWNyeXB0X2NvcmUKKwlweG9yCSV4bW02LCV4bW0wCisJbW92ZHFhCSV4bW03LCV4bW02CisJbW92ZHF1CSV4bW0wLCglcnNpLCVyZGksMSkKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwlzdWJxCSQxNiwlcmN4CisJam5jCS5MY2JjX2RlY19sb29wCisuTGNiY19kb25lOgorCW1vdmRxdQkleG1tNiwoJXI4KQorLkxjYmNfYWJvcnQ6CisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQl2cGFlc19jYmNfZW5jcnlwdCwuLXZwYWVzX2NiY19lbmNyeXB0CisKKworCisKKworCisudHlwZQlfdnBhZXNfcHJlaGVhdCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3ZwYWVzX3ByZWhlYXQ6CisJbGVhcQkuTGtfczBGKCVyaXApLCVyMTAKKwltb3ZkcWEJLTMyKCVyMTApLCV4bW0xMAorCW1vdmRxYQktMTYoJXIxMCksJXhtbTExCisJbW92ZHFhCTAoJXIxMCksJXhtbTkKKwltb3ZkcWEJNDgoJXIxMCksJXhtbTEzCisJbW92ZHFhCTY0KCVyMTApLCV4bW0xMgorCW1vdmRxYQk4MCglcjEwKSwleG1tMTUKKwltb3ZkcWEJOTYoJXIxMCksJXhtbTE0CisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfdnBhZXNfcHJlaGVhdCwuLV92cGFlc19wcmVoZWF0CisKKworCisKKworLnR5cGUJX3ZwYWVzX2NvbnN0cyxAb2JqZWN0CisuYWxpZ24JNjQKK192cGFlc19jb25zdHM6CisuTGtfaW52OgorLnF1YWQJMHgwRTA1MDYwRjBEMDgwMTgwLCAweDA0MDcwMzA5MEEwQjBDMDIKKy5xdWFkCTB4MDEwNDBBMDYwRjBCMDc4MCwgMHgwMzBEMEUwQzAyMDUwODA5CisKKy5Ma19zMEY6CisucXVhZAkweDBGMEYwRjBGMEYwRjBGMEYsIDB4MEYwRjBGMEYwRjBGMEYwRgorCisuTGtfaXB0OgorLnF1YWQJMHhDMkIyRTg5ODVBMkE3MDAwLCAweENBQkFFMDkwNTIyMjc4MDgKKy5xdWFkCTB4NEMwMTMwN0QzMTdDNEQwMCwgMHhDRDgwQjFGQ0IwRkRDQzgxCisKKy5Ma19zYjE6CisucXVhZAkweEIxOUJFMThGQ0I1MDNFMDAsIDB4QTVERjdBNkUxNDJBRjU0NAorLnF1YWQJMHgzNjE4RDQxNUZBRTIyMzAwLCAweDNCRjdDQ0MxMEQyRUQ5RUYKKy5Ma19zYjI6CisucXVhZAkweEUyN0E5M0M2MEI3MTI0MDAsIDB4NUVCN0U5NTVCQzk4MkZDRAorLnF1YWQJMHg2OUVCODg0MDBBRTEyOTAwLCAweEMyQTE2M0M4QUI4MjIzNEEKKy5Ma19zYm86CisucXVhZAkweEQwRDI2RDE3NkZCREM3MDAsIDB4MTVBQUJGN0FDNTAyQTg3OAorLnF1YWQJMHhDRkU0NzRBNTVGQkI2QTAwLCAweDhFMUU5MEQxNDEyQjM1RkEKKworLkxrX21jX2ZvcndhcmQ6CisucXVhZAkweDA0MDcwNjA1MDAwMzAyMDEsIDB4MEMwRjBFMEQwODBCMEEwOQorLnF1YWQJMHgwODBCMEEwOTA0MDcwNjA1LCAweDAwMDMwMjAxMEMwRjBFMEQKKy5xdWFkCTB4MEMwRjBFMEQwODBCMEEwOSwgMHgwNDA3MDYwNTAwMDMwMjAxCisucXVhZAkweDAwMDMwMjAxMEMwRjBFMEQsIDB4MDgwQjBBMDkwNDA3MDYwNQorCisuTGtfbWNfYmFja3dhcmQ6CisucXVhZAkweDA2MDUwNDA3MDIwMTAwMDMsIDB4MEUwRDBDMEYwQTA5MDgwQgorLnF1YWQJMHgwMjAxMDAwMzBFMEQwQzBGLCAweDBBMDkwODBCMDYwNTA0MDcKKy5xdWFkCTB4MEUwRDBDMEYwQTA5MDgwQiwgMHgwNjA1MDQwNzAyMDEwMDAzCisucXVhZAkweDBBMDkwODBCMDYwNTA0MDcsIDB4MDIwMTAwMDMwRTBEMEMwRgorCisuTGtfc3I6CisucXVhZAkweDA3MDYwNTA0MDMwMjAxMDAsIDB4MEYwRTBEMEMwQjBBMDkwOAorLnF1YWQJMHgwMzBFMDkwNDBGMEEwNTAwLCAweDBCMDYwMTBDMDcwMjBEMDgKKy5xdWFkCTB4MEYwNjBEMDQwQjAyMDkwMCwgMHgwNzBFMDUwQzAzMEEwMTA4CisucXVhZAkweDBCMEUwMTA0MDcwQTBEMDAsIDB4MDMwNjA5MEMwRjAyMDUwOAorCisuTGtfcmNvbjoKKy5xdWFkCTB4MUY4MzkxQjlBRjlERUVCNiwgMHg3MDJBOTgwODREN0M3RDgxCisKKy5Ma19zNjM6CisucXVhZAkweDVCNUI1QjVCNUI1QjVCNUIsIDB4NUI1QjVCNUI1QjVCNUI1QgorCisuTGtfb3B0OgorLnF1YWQJMHhGRjlGNDkyOUQ2QjY2MDAwLCAweEY3OTc0MTIxREVCRTY4MDgKKy5xdWFkCTB4MDFFREJENTE1MEJDRUMwMCwgMHhFMTBENURCMUIwNUMwQ0UwCisKKy5Ma19kZXNrZXc6CisucXVhZAkweDA3RTRBMzQwNDdBNEUzMDAsIDB4MURGRUI5NUE1REJFRjkxQQorLnF1YWQJMHg1RjM2QjVEQzgzRUE2OTAwLCAweDI4NDFDMkFCRjQ5RDFFNzcKKworCisKKworCisuTGtfZGtzZDoKKy5xdWFkCTB4RkVCOTFBNURBM0U0NDcwMCwgMHgwNzQwRTNBNDVBMURCRUY5CisucXVhZAkweDQxQzI3N0Y0QjUzNjgzMDAsIDB4NUZEQzY5RUFBQjI4OUQxRQorLkxrX2Rrc2I6CisucXVhZAkweDlBNEZDQTFGODU1MEQ1MDAsIDB4MDNENjUzODYxQ0M5NEM5OQorLnF1YWQJMHgxMTVCRURBN0I2RkM0QTAwLCAweEQ5OTMyNTZGN0UzNDgyQzgKKy5Ma19ka3NlOgorLnF1YWQJMHhENTAzMUNDQTFGQzlENjAwLCAweDUzODU5QTRDOTk0RjUwODYKKy5xdWFkCTB4QTIzMTk2MDU0RkRDN0JFOCwgMHhDRDVFRjk2QTIwQjMxNDg3CisuTGtfZGtzOToKKy5xdWFkCTB4QjYxMTZGQzg3RUQ5QTcwMCwgMHg0QUVEOTMzNDgyMjU1QkZDCisucXVhZAkweDQ1NzY1MTYyMjcxNDMzMDAsIDB4OEJCODlGQUNFOURBRkRDRQorCisKKworCisKKy5Ma19kaXB0OgorLnF1YWQJMHgwRjUwNUIwNDBCNTQ1RjAwLCAweDE1NEE0MTFFMTE0RTQ1MUEKKy5xdWFkCTB4ODZFMzgzRTY2MDA1NjUwMCwgMHgxMjc3MTc3MkY0OTFGMTk0CisKKy5Ma19kc2I5OgorLnF1YWQJMHg4NTFDMDM1MzlBODZENjAwLCAweENBRDUxRjUwNEY5OTRDQzkKKy5xdWFkCTB4QzAzQjE3ODlFQ0Q3NDkwMCwgMHg3MjVFMkM5RUIyRkJBNTY1CisuTGtfZHNiZDoKKy5xdWFkCTB4N0Q1N0NDREZFNkIxQTIwMCwgMHhGNTZFOUIxMzg4MkE0NDM5CisucXVhZAkweDNDRTJGQUY3MjRDNkNCMDAsIDB4MjkzMTE4MEQxNURFRUZEMworLkxrX2RzYmI6CisucXVhZAkweEQwMjI2NDkyOTZCNDQyMDAsIDB4NjAyNjQ2RjZCMEYyRDQwNAorLnF1YWQJMHhDMTk0OThBNkNENTk2NzAwLCAweEYzRkYwQzNFMzI1NUFBNkIKKy5Ma19kc2JlOgorLnF1YWQJMHg0NkYyOTI5NjI2RDREMDAwLCAweDIyNDI2MDA0NjRCNEY2QjAKKy5xdWFkCTB4MEM1NUE2Q0RGRkFBQzEwMCwgMHg5NDY3RjM2Qjk4NTkzRTMyCisuTGtfZHNibzoKKy5xdWFkCTB4MTM4N0VBNTM3RUY5NDAwMCwgMHhDN0FBNkRCOUQ0OTQzRTJECisucXVhZAkweDEyRDc1NjBGOTM0NDFEMDAsIDB4Q0E0QjgxNTlEOEM1OEU5QworLmJ5dGUJODYsMTAxLDk5LDExNiwxMTEsMTE0LDMyLDgwLDEwMSwxMTQsMTA5LDExNywxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDY1LDY5LDgzLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NCw1Miw0Nyw4Myw4Myw4Myw2OSw1MSw0NCwzMiw3NywxMDUsMTA3LDEwMSwzMiw3Miw5NywxMDksOTgsMTE3LDExNCwxMDMsMzIsNDAsODMsMTE2LDk3LDExMCwxMDIsMTExLDExNCwxMDAsMzIsODUsMTEwLDEwNSwxMTgsMTAxLDExNCwxMTUsMTA1LDExNiwxMjEsNDEsMAorLmFsaWduCTY0Cisuc2l6ZQlfdnBhZXNfY29uc3RzLC4tX3ZwYWVzX2NvbnN0cworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS94ODZfNjQtbW9udC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg2N2NkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQuUwpAQCAtMCwwICsxLDEyNDcgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKy5oaWRkZW4gT1BFTlNTTF9pYTMyY2FwX1AKKworLmdsb2JsCWJuX211bF9tb250CisuaGlkZGVuIGJuX211bF9tb250CisudHlwZQlibl9tdWxfbW9udCxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYm5fbXVsX21vbnQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwltb3ZsCSVyOWQsJXI5ZAorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXRlc3RsCSQzLCVyOWQKKwlqbnoJLkxtdWxfZW50ZXIKKwljbXBsCSQ4LCVyOWQKKwlqYgkuTG11bF9lbnRlcgorCWxlYXEJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXIxMQorCW1vdmwJOCglcjExKSwlcjExZAorCWNtcHEJJXJzaSwlcmR4CisJam5lCS5MbXVsNHhfZW50ZXIKKwl0ZXN0bAkkNywlcjlkCisJanoJLkxzcXI4eF9lbnRlcgorCWptcAkuTG11bDR4X2VudGVyCisKKy5hbGlnbgkxNgorLkxtdWxfZW50ZXI6CisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisKKwluZWdxCSVyOQorCW1vdnEJJXJzcCwlcjExCisJbGVhcQktMTYoJXJzcCwlcjksOCksJXIxMAorCW5lZ3EJJXI5CisJYW5kcQkkLTEwMjQsJXIxMAorCisKKworCisKKworCisKKworCXN1YnEJJXIxMCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTAsJXIxMSwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMQorCWNtcHEJJXIxMCwlcnNwCisJamEJLkxtdWxfcGFnZV93YWxrCisJam1wCS5MbXVsX3BhZ2Vfd2Fsa19kb25lCisKKy5hbGlnbgkxNgorLkxtdWxfcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTEKKwljbXBxCSVyMTAsJXJzcAorCWphCS5MbXVsX3BhZ2Vfd2FsaworLkxtdWxfcGFnZV93YWxrX2RvbmU6CisKKwltb3ZxCSVyYXgsOCglcnNwLCVyOSw4KQorLmNmaV9lc2NhcGUJMHgwZiwweDBhLDB4NzcsMHgwOCwweDc5LDB4MDAsMHgzOCwweDFlLDB4MjIsMHgwNiwweDIzLDB4MDgKKy5MbXVsX2JvZHk6CisJbW92cQklcmR4LCVyMTIKKwltb3ZxCSglcjgpLCVyOAorCW1vdnEJKCVyMTIpLCVyYngKKwltb3ZxCSglcnNpKSwlcmF4CisKKwl4b3JxCSVyMTQsJXIxNAorCXhvcnEJJXIxNSwlcjE1CisKKwltb3ZxCSVyOCwlcmJwCisJbXVscQklcmJ4CisJbW92cQklcmF4LCVyMTAKKwltb3ZxCSglcmN4KSwlcmF4CisKKwlpbXVscQklcjEwLCVyYnAKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEzCisKKwlsZWFxCTEoJXIxNSksJXIxNQorCWptcAkuTDFzdF9lbnRlcgorCisuYWxpZ24JMTYKKy5MMXN0OgorCWFkZHEJJXJheCwlcjEzCisJbW92cQkoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCW1vdnEJJXIxMCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisuTDFzdF9lbnRlcjoKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbGVhcQkxKCVyMTUpLCVyMTUKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJY21wcQklcjksJXIxNQorCWpuZQkuTDFzdAorCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisJbW92cQklcjEwLCVyMTEKKworCXhvcnEJJXJkeCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjksOCkKKwltb3ZxCSVyZHgsKCVyc3AsJXI5LDgpCisKKwlsZWFxCTEoJXIxNCksJXIxNAorCWptcAkuTG91dGVyCisuYWxpZ24JMTYKKy5Mb3V0ZXI6CisJbW92cQkoJXIxMiwlcjE0LDgpLCVyYngKKwl4b3JxCSVyMTUsJXIxNQorCW1vdnEJJXI4LCVyYnAKKwltb3ZxCSglcnNwKSwlcjEwCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisKKwlpbXVscQklcjEwLCVyYnAKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJOCglcnNwKSwlcjEwCisJbW92cQklcmR4LCVyMTMKKworCWxlYXEJMSglcjE1KSwlcjE1CisJam1wCS5MaW5uZXJfZW50ZXIKKworLmFsaWduCTE2CisuTGlubmVyOgorCWFkZHEJJXJheCwlcjEzCisJbW92cQkoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCW1vdnEJKCVyc3AsJXIxNSw4KSwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisuTGlubmVyX2VudGVyOgorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQkoJXJjeCwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisJbGVhcQkxKCVyMTUpLCVyMTUKKworCW11bHEJJXJicAorCWNtcHEJJXI5LCVyMTUKKwlqbmUJLkxpbm5lcgorCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTMKKwltb3ZxCSglcnNwLCVyMTUsOCksJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtMTYoJXJzcCwlcjE1LDgpCisJbW92cQklcmR4LCVyMTMKKworCXhvcnEJJXJkeCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtOCglcnNwLCVyOSw4KQorCW1vdnEJJXJkeCwoJXJzcCwlcjksOCkKKworCWxlYXEJMSglcjE0KSwlcjE0CisJY21wcQklcjksJXIxNAorCWpiCS5Mb3V0ZXIKKworCXhvcnEJJXIxNCwlcjE0CisJbW92cQkoJXJzcCksJXJheAorCW1vdnEJJXI5LCVyMTUKKworLmFsaWduCTE2CisuTHN1YjoJc2JicQkoJXJjeCwlcjE0LDgpLCVyYXgKKwltb3ZxCSVyYXgsKCVyZGksJXIxNCw4KQorCW1vdnEJOCglcnNwLCVyMTQsOCksJXJheAorCWxlYXEJMSglcjE0KSwlcjE0CisJZGVjcQklcjE1CisJam56CS5Mc3ViCisKKwlzYmJxCSQwLCVyYXgKKwltb3ZxCSQtMSwlcmJ4CisJeG9ycQklcmF4LCVyYngKKwl4b3JxCSVyMTQsJXIxNAorCW1vdnEJJXI5LCVyMTUKKworLkxjb3B5OgorCW1vdnEJKCVyZGksJXIxNCw4KSwlcmN4CisJbW92cQkoJXJzcCwlcjE0LDgpLCVyZHgKKwlhbmRxCSVyYngsJXJjeAorCWFuZHEJJXJheCwlcmR4CisJbW92cQklcjksKCVyc3AsJXIxNCw4KQorCW9ycQklcmN4LCVyZHgKKwltb3ZxCSVyZHgsKCVyZGksJXIxNCw4KQorCWxlYXEJMSglcjE0KSwlcjE0CisJc3VicQkkMSwlcjE1CisJam56CS5MY29weQorCisJbW92cQk4KCVyc3AsJXI5LDgpLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCSQxLCVyYXgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTG11bF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWJuX211bF9tb250LC4tYm5fbXVsX21vbnQKKy50eXBlCWJuX211bDR4X21vbnQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK2JuX211bDR4X21vbnQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwltb3ZsCSVyOWQsJXI5ZAorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorLkxtdWw0eF9lbnRlcjoKKwlhbmRsCSQweDgwMTAwLCVyMTFkCisJY21wbAkkMHg4MDEwMCwlcjExZAorCWplCS5MbXVseDR4X2VudGVyCisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisKKwluZWdxCSVyOQorCW1vdnEJJXJzcCwlcjExCisJbGVhcQktMzIoJXJzcCwlcjksOCksJXIxMAorCW5lZ3EJJXI5CisJYW5kcQkkLTEwMjQsJXIxMAorCisJc3VicQklcjEwLCVyMTEKKwlhbmRxCSQtNDA5NiwlcjExCisJbGVhcQkoJXIxMCwlcjExLDEpLCVyc3AKKwltb3ZxCSglcnNwKSwlcjExCisJY21wcQklcjEwLCVyc3AKKwlqYQkuTG11bDR4X3BhZ2Vfd2FsaworCWptcAkuTG11bDR4X3BhZ2Vfd2Fsa19kb25lCisKKy5MbXVsNHhfcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTEKKwljbXBxCSVyMTAsJXJzcAorCWphCS5MbXVsNHhfcGFnZV93YWxrCisuTG11bDR4X3BhZ2Vfd2Fsa19kb25lOgorCisJbW92cQklcmF4LDgoJXJzcCwlcjksOCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwYSwweDc3LDB4MDgsMHg3OSwweDAwLDB4MzgsMHgxZSwweDIyLDB4MDYsMHgyMywweDA4CisuTG11bDR4X2JvZHk6CisJbW92cQklcmRpLDE2KCVyc3AsJXI5LDgpCisJbW92cQklcmR4LCVyMTIKKwltb3ZxCSglcjgpLCVyOAorCW1vdnEJKCVyMTIpLCVyYngKKwltb3ZxCSglcnNpKSwlcmF4CisKKwl4b3JxCSVyMTQsJXIxNAorCXhvcnEJJXIxNSwlcjE1CisKKwltb3ZxCSVyOCwlcmJwCisJbXVscQklcmJ4CisJbW92cQklcmF4LCVyMTAKKwltb3ZxCSglcmN4KSwlcmF4CisKKwlpbXVscQklcjEwLCVyYnAKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkxNiglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlsZWFxCTQoJXIxNSksJXIxNQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkaSwoJXJzcCkKKwltb3ZxCSVyZHgsJXIxMworCWptcAkuTDFzdDR4CisuYWxpZ24JMTYKKy5MMXN0NHg6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJLTgoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtMjQoJXJzcCwlcjE1LDgpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQktOCglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJKCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQk4KCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjE1LDgpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQk4KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbGVhcQk0KCVyMTUpLCVyMTUKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCS0xNiglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0zMiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCWNtcHEJJXI5LCVyMTUKKwlqYgkuTDFzdDR4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJLTE2KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCS04KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisJeG9ycQklcmRpLCVyZGkKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkaQorCW1vdnEJJXIxMywtOCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZGksKCVyc3AsJXIxNSw4KQorCisJbGVhcQkxKCVyMTQpLCVyMTQKKy5hbGlnbgk0CisuTG91dGVyNHg6CisJbW92cQkoJXIxMiwlcjE0LDgpLCVyYngKKwl4b3JxCSVyMTUsJXIxNQorCW1vdnEJKCVyc3ApLCVyMTAKKwltb3ZxCSVyOCwlcmJwCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisKKwlpbXVscQklcjEwLCVyYnAKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQk4KCVyc3ApLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWxlYXEJNCglcjE1KSwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLCglcnNwKQorCW1vdnEJJXJkeCwlcjEzCisJam1wCS5MaW5uZXI0eAorLmFsaWduCTE2CisuTGlubmVyNHg6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJLTE2KCVyc3AsJXIxNSw4KSwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCS04KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQktOCglcnNwLCVyMTUsOCksJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJKCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQkoJXJzcCwlcjE1LDgpLCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCTgoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtOCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCTgoJXJjeCwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCTgoJXJzcCwlcjE1LDgpLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlsZWFxCTQoJXIxNSksJXIxNQorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJLTE2KCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTMyKCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisJY21wcQklcjksJXIxNQorCWpiCS5MaW5uZXI0eAorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJLTE2KCVyc3AsJXIxNSw4KSwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCS04KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQktOCglcnNwLCVyMTUsOCksJXIxMQorCWFkY3EJJDAsJXJkeAorCWxlYXEJMSglcjE0KSwlcjE0CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisJeG9ycQklcmRpLCVyZGkKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkaQorCWFkZHEJKCVyc3AsJXI5LDgpLCVyMTMKKwlhZGNxCSQwLCVyZGkKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjE1LDgpCisJbW92cQklcmRpLCglcnNwLCVyMTUsOCkKKworCWNtcHEJJXI5LCVyMTQKKwlqYgkuTG91dGVyNHgKKwltb3ZxCTE2KCVyc3AsJXI5LDgpLCVyZGkKKwlsZWFxCS00KCVyOSksJXIxNQorCW1vdnEJMCglcnNwKSwlcmF4CisJbW92cQk4KCVyc3ApLCVyZHgKKwlzaHJxCSQyLCVyMTUKKwlsZWFxCSglcnNwKSwlcnNpCisJeG9ycQklcjE0LCVyMTQKKworCXN1YnEJMCglcmN4KSwlcmF4CisJbW92cQkxNiglcnNpKSwlcmJ4CisJbW92cQkyNCglcnNpKSwlcmJwCisJc2JicQk4KCVyY3gpLCVyZHgKKworLkxzdWI0eDoKKwltb3ZxCSVyYXgsMCglcmRpLCVyMTQsOCkKKwltb3ZxCSVyZHgsOCglcmRpLCVyMTQsOCkKKwlzYmJxCTE2KCVyY3gsJXIxNCw4KSwlcmJ4CisJbW92cQkzMiglcnNpLCVyMTQsOCksJXJheAorCW1vdnEJNDAoJXJzaSwlcjE0LDgpLCVyZHgKKwlzYmJxCTI0KCVyY3gsJXIxNCw4KSwlcmJwCisJbW92cQklcmJ4LDE2KCVyZGksJXIxNCw4KQorCW1vdnEJJXJicCwyNCglcmRpLCVyMTQsOCkKKwlzYmJxCTMyKCVyY3gsJXIxNCw4KSwlcmF4CisJbW92cQk0OCglcnNpLCVyMTQsOCksJXJieAorCW1vdnEJNTYoJXJzaSwlcjE0LDgpLCVyYnAKKwlzYmJxCTQwKCVyY3gsJXIxNCw4KSwlcmR4CisJbGVhcQk0KCVyMTQpLCVyMTQKKwlkZWNxCSVyMTUKKwlqbnoJLkxzdWI0eAorCisJbW92cQklcmF4LDAoJXJkaSwlcjE0LDgpCisJbW92cQkzMiglcnNpLCVyMTQsOCksJXJheAorCXNiYnEJMTYoJXJjeCwlcjE0LDgpLCVyYngKKwltb3ZxCSVyZHgsOCglcmRpLCVyMTQsOCkKKwlzYmJxCTI0KCVyY3gsJXIxNCw4KSwlcmJwCisJbW92cQklcmJ4LDE2KCVyZGksJXIxNCw4KQorCisJc2JicQkkMCwlcmF4CisJbW92cQklcmJwLDI0KCVyZGksJXIxNCw4KQorCXB4b3IJJXhtbTAsJXhtbTAKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjI0CisJcGNtcGVxZAkleG1tNSwleG1tNQorCXBzaHVmZAkkMCwleG1tNCwleG1tNAorCW1vdnEJJXI5LCVyMTUKKwlweG9yCSV4bW00LCV4bW01CisJc2hycQkkMiwlcjE1CisJeG9ybAklZWF4LCVlYXgKKworCWptcAkuTGNvcHk0eAorLmFsaWduCTE2CisuTGNvcHk0eDoKKwltb3ZkcWEJKCVyc3AsJXJheCwxKSwleG1tMQorCW1vdmRxdQkoJXJkaSwlcmF4LDEpLCV4bW0yCisJcGFuZAkleG1tNCwleG1tMQorCXBhbmQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJMTYoJXJzcCwlcmF4LDEpLCV4bW0zCisJbW92ZHFhCSV4bW0wLCglcnNwLCVyYXgsMSkKKwlwb3IJJXhtbTIsJXhtbTEKKwltb3ZkcXUJMTYoJXJkaSwlcmF4LDEpLCV4bW0yCisJbW92ZHF1CSV4bW0xLCglcmRpLCVyYXgsMSkKKwlwYW5kCSV4bW00LCV4bW0zCisJcGFuZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMCwxNiglcnNwLCVyYXgsMSkKKwlwb3IJJXhtbTIsJXhtbTMKKwltb3ZkcXUJJXhtbTMsMTYoJXJkaSwlcmF4LDEpCisJbGVhcQkzMiglcmF4KSwlcmF4CisJZGVjcQklcjE1CisJam56CS5MY29weTR4CisJbW92cQk4KCVyc3AsJXI5LDgpLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLCA4CisJbW92cQkkMSwlcmF4CisJbW92cQktNDgoJXJzaSksJXIxNQorLmNmaV9yZXN0b3JlCSVyMTUKKwltb3ZxCS00MCglcnNpKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJLTMyKCVyc2kpLCVyMTMKKy5jZmlfcmVzdG9yZQklcjEzCisJbW92cQktMjQoJXJzaSksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCW1vdnEJLTgoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlsZWFxCSglcnNpKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxtdWw0eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWJuX211bDR4X21vbnQsLi1ibl9tdWw0eF9tb250CisuZXh0ZXJuCWJuX3Nxcng4eF9pbnRlcm5hbAorLmhpZGRlbiBibl9zcXJ4OHhfaW50ZXJuYWwKKy5leHRlcm4JYm5fc3FyOHhfaW50ZXJuYWwKKy5oaWRkZW4gYm5fc3FyOHhfaW50ZXJuYWwKKworLnR5cGUJYm5fc3FyOHhfbW9udCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYm5fc3FyOHhfbW9udDoKKy5jZmlfc3RhcnRwcm9jCQorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorLkxzcXI4eF9lbnRlcjoKKwlwdXNocQklcmJ4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKy5Mc3FyOHhfcHJvbG9ndWU6CisKKwltb3ZsCSVyOWQsJXIxMGQKKwlzaGxsCSQzLCVyOWQKKwlzaGxxCSQzKzIsJXIxMAorCW5lZ3EJJXI5CisKKworCisKKworCisJbGVhcQktNjQoJXJzcCwlcjksMiksJXIxMQorCW1vdnEJJXJzcCwlcmJwCisJbW92cQkoJXI4KSwlcjgKKwlzdWJxCSVyc2ksJXIxMQorCWFuZHEJJDQwOTUsJXIxMQorCWNtcHEJJXIxMSwlcjEwCisJamIJLkxzcXI4eF9zcF9hbHQKKwlzdWJxCSVyMTEsJXJicAorCWxlYXEJLTY0KCVyYnAsJXI5LDIpLCVyYnAKKwlqbXAJLkxzcXI4eF9zcF9kb25lCisKKy5hbGlnbgkzMgorLkxzcXI4eF9zcF9hbHQ6CisJbGVhcQk0MDk2LTY0KCwlcjksMiksJXIxMAorCWxlYXEJLTY0KCVyYnAsJXI5LDIpLCVyYnAKKwlzdWJxCSVyMTAsJXIxMQorCW1vdnEJJDAsJXIxMAorCWNtb3ZjcQklcjEwLCVyMTEKKwlzdWJxCSVyMTEsJXJicAorLkxzcXI4eF9zcF9kb25lOgorCWFuZHEJJC02NCwlcmJwCisJbW92cQklcnNwLCVyMTEKKwlzdWJxCSVyYnAsJXIxMQorCWFuZHEJJC00MDk2LCVyMTEKKwlsZWFxCSglcjExLCVyYnAsMSksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCS5Mc3FyOHhfcGFnZV93YWxrCisJam1wCS5Mc3FyOHhfcGFnZV93YWxrX2RvbmUKKworLmFsaWduCTE2CisuTHNxcjh4X3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQkuTHNxcjh4X3BhZ2Vfd2FsaworLkxzcXI4eF9wYWdlX3dhbGtfZG9uZToKKworCW1vdnEJJXI5LCVyMTAKKwluZWdxCSVyOQorCisJbW92cQklcjgsMzIoJXJzcCkKKwltb3ZxCSVyYXgsNDAoJXJzcCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwNSwweDc3LDB4MjgsMHgwNiwweDIzLDB4MDgKKy5Mc3FyOHhfYm9keToKKworLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDkKKwlweG9yCSV4bW0wLCV4bW0wCisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwNworLmJ5dGUJMTAyLDczLDE1LDExMCwyMTgKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyYXgKKwltb3ZsCTgoJXJheCksJWVheAorCWFuZGwJJDB4ODAxMDAsJWVheAorCWNtcGwJJDB4ODAxMDAsJWVheAorCWpuZQkuTHNxcjh4X25veAorCisJY2FsbAlibl9zcXJ4OHhfaW50ZXJuYWwKKworCisKKworCWxlYXEJKCVyOCwlcmN4LDEpLCVyYngKKwltb3ZxCSVyY3gsJXI5CisJbW92cQklcmN4LCVyZHgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA3CisJc2FycQkkMysyLCVyY3gKKwlqbXAJLkxzcXI4eF9zdWIKKworLmFsaWduCTMyCisuTHNxcjh4X25veDoKKwljYWxsCWJuX3Nxcjh4X2ludGVybmFsCisKKworCisKKwlsZWFxCSglcmRpLCVyOSwxKSwlcmJ4CisJbW92cQklcjksJXJjeAorCW1vdnEJJXI5LCVyZHgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA3CisJc2FycQkkMysyLCVyY3gKKwlqbXAJLkxzcXI4eF9zdWIKKworLmFsaWduCTMyCisuTHNxcjh4X3N1YjoKKwltb3ZxCTAoJXJieCksJXIxMgorCW1vdnEJOCglcmJ4KSwlcjEzCisJbW92cQkxNiglcmJ4KSwlcjE0CisJbW92cQkyNCglcmJ4KSwlcjE1CisJbGVhcQkzMiglcmJ4KSwlcmJ4CisJc2JicQkwKCVyYnApLCVyMTIKKwlzYmJxCTgoJXJicCksJXIxMworCXNiYnEJMTYoJXJicCksJXIxNAorCXNiYnEJMjQoJXJicCksJXIxNQorCWxlYXEJMzIoJXJicCksJXJicAorCW1vdnEJJXIxMiwwKCVyZGkpCisJbW92cQklcjEzLDgoJXJkaSkKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlpbmNxCSVyY3gKKwlqbnoJLkxzcXI4eF9zdWIKKworCXNiYnEJJDAsJXJheAorCWxlYXEJKCVyYngsJXI5LDEpLCVyYngKKwlsZWFxCSglcmRpLCVyOSwxKSwlcmRpCisKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjAwCisJcHhvcgkleG1tMCwleG1tMAorCXBzaHVmZAkkMCwleG1tMSwleG1tMQorCW1vdnEJNDAoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCWptcAkuTHNxcjh4X2NvbmRfY29weQorCisuYWxpZ24JMzIKKy5Mc3FyOHhfY29uZF9jb3B5OgorCW1vdmRxYQkwKCVyYngpLCV4bW0yCisJbW92ZHFhCTE2KCVyYngpLCV4bW0zCisJbGVhcQkzMiglcmJ4KSwlcmJ4CisJbW92ZHF1CTAoJXJkaSksJXhtbTQKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTUKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwltb3ZkcWEJJXhtbTAsLTMyKCVyYngpCisJbW92ZHFhCSV4bW0wLC0xNiglcmJ4KQorCW1vdmRxYQkleG1tMCwtMzIoJXJieCwlcmR4LDEpCisJbW92ZHFhCSV4bW0wLC0xNiglcmJ4LCVyZHgsMSkKKwlwY21wZXFkCSV4bW0xLCV4bW0wCisJcGFuZAkleG1tMSwleG1tMgorCXBhbmQJJXhtbTEsJXhtbTMKKwlwYW5kCSV4bW0wLCV4bW00CisJcGFuZAkleG1tMCwleG1tNQorCXB4b3IJJXhtbTAsJXhtbTAKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcXUJJXhtbTQsLTMyKCVyZGkpCisJbW92ZHF1CSV4bW01LC0xNiglcmRpKQorCWFkZHEJJDMyLCVyOQorCWpuegkuTHNxcjh4X2NvbmRfY29weQorCisJbW92cQkkMSwlcmF4CisJbW92cQktNDgoJXJzaSksJXIxNQorLmNmaV9yZXN0b3JlCSVyMTUKKwltb3ZxCS00MCglcnNpKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJLTMyKCVyc2kpLCVyMTMKKy5jZmlfcmVzdG9yZQklcjEzCisJbW92cQktMjQoJXJzaSksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCW1vdnEJLTgoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlsZWFxCSglcnNpKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxzcXI4eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWJuX3Nxcjh4X21vbnQsLi1ibl9zcXI4eF9tb250CisudHlwZQlibl9tdWx4NHhfbW9udCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYm5fbXVseDR4X21vbnQ6CisuY2ZpX3N0YXJ0cHJvYwkKKwltb3ZxCSVyc3AsJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKy5MbXVseDR4X2VudGVyOgorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorLkxtdWx4NHhfcHJvbG9ndWU6CisKKwlzaGxsCSQzLCVyOWQKKwl4b3JxCSVyMTAsJXIxMAorCXN1YnEJJXI5LCVyMTAKKwltb3ZxCSglcjgpLCVyOAorCWxlYXEJLTcyKCVyc3AsJXIxMCwxKSwlcmJwCisJYW5kcQkkLTEyOCwlcmJwCisJbW92cQklcnNwLCVyMTEKKwlzdWJxCSVyYnAsJXIxMQorCWFuZHEJJC00MDk2LCVyMTEKKwlsZWFxCSglcjExLCVyYnAsMSksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCS5MbXVseDR4X3BhZ2Vfd2FsaworCWptcAkuTG11bHg0eF9wYWdlX3dhbGtfZG9uZQorCisuYWxpZ24JMTYKKy5MbXVseDR4X3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQkuTG11bHg0eF9wYWdlX3dhbGsKKy5MbXVseDR4X3BhZ2Vfd2Fsa19kb25lOgorCisJbGVhcQkoJXJkeCwlcjksMSksJXIxMAorCisKKworCisKKworCisKKworCisKKworCW1vdnEJJXI5LDAoJXJzcCkKKwlzaHJxCSQ1LCVyOQorCW1vdnEJJXIxMCwxNiglcnNwKQorCXN1YnEJJDEsJXI5CisJbW92cQklcjgsMjQoJXJzcCkKKwltb3ZxCSVyZGksMzIoJXJzcCkKKwltb3ZxCSVyYXgsNDAoJXJzcCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwNSwweDc3LDB4MjgsMHgwNiwweDIzLDB4MDgKKwltb3ZxCSVyOSw0OCglcnNwKQorCWptcAkuTG11bHg0eF9ib2R5CisKKy5hbGlnbgkzMgorLkxtdWx4NHhfYm9keToKKwlsZWFxCTgoJXJkeCksJXJkaQorCW1vdnEJKCVyZHgpLCVyZHgKKwlsZWFxCTY0KzMyKCVyc3ApLCVyYngKKwltb3ZxCSVyZHgsJXI5CisKKwltdWx4cQkwKCVyc2kpLCVyOCwlcmF4CisJbXVseHEJOCglcnNpKSwlcjExLCVyMTQKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJkaSw4KCVyc3ApCisJbXVseHEJMTYoJXJzaSksJXIxMiwlcjEzCisJYWRjcQklcjE0LCVyMTIKKwlhZGNxCSQwLCVyMTMKKworCW1vdnEJJXI4LCVyZGkKKwlpbXVscQkyNCglcnNwKSwlcjgKKwl4b3JxCSVyYnAsJXJicAorCisJbXVseHEJMjQoJXJzaSksJXJheCwlcjE0CisJbW92cQklcjgsJXJkeAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWFkY3hxCSVyYXgsJXIxMworCWFkY3hxCSVyYnAsJXIxNAorCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTAKKwlhZGN4cQklcmF4LCVyZGkKKwlhZG94cQklcjExLCVyMTAKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxMQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTIsJXIxMQorLmJ5dGUJMHhjNCwweDYyLDB4ZmIsMHhmNiwweGExLDB4MTAsMHgwMCwweDAwLDB4MDAKKwltb3ZxCTQ4KCVyc3ApLCVyZGkKKwltb3ZxCSVyMTAsLTMyKCVyYngpCisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxMywlcjEyCisJbXVseHEJMjQoJXJjeCksJXJheCwlcjE1CisJbW92cQklcjksJXJkeAorCW1vdnEJJXIxMSwtMjQoJXJieCkKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcmJwLCVyMTUKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCSVyMTIsLTE2KCVyYngpCisKKwlqbXAJLkxtdWx4NHhfMXN0CisKKy5hbGlnbgkzMgorLkxtdWx4NHhfMXN0OgorCWFkY3hxCSVyYnAsJXIxNQorCW11bHhxCTAoJXJzaSksJXIxMCwlcmF4CisJYWRjeHEJJXIxNCwlcjEwCisJbXVseHEJOCglcnNpKSwlcjExLCVyMTQKKwlhZGN4cQklcmF4LCVyMTEKKwltdWx4cQkxNiglcnNpKSwlcjEyLCVyYXgKKwlhZGN4cQklcjE0LCVyMTIKKwltdWx4cQkyNCglcnNpKSwlcjEzLCVyMTQKKy5ieXRlCTB4NjcsMHg2NworCW1vdnEJJXI4LCVyZHgKKwlhZGN4cQklcmF4LCVyMTMKKwlhZGN4cQklcmJwLCVyMTQKKwlsZWFxCTMyKCVyc2kpLCVyc2kKKwlsZWFxCTMyKCVyYngpLCVyYngKKworCWFkb3hxCSVyMTUsJXIxMAorCW11bHhxCTAoJXJjeCksJXJheCwlcjE1CisJYWRjeHEJJXJheCwlcjEwCisJYWRveHEJJXIxNSwlcjExCisJbXVseHEJOCglcmN4KSwlcmF4LCVyMTUKKwlhZGN4cQklcmF4LCVyMTEKKwlhZG94cQklcjE1LCVyMTIKKwltdWx4cQkxNiglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyMTAsLTQwKCVyYngpCisJYWRjeHEJJXJheCwlcjEyCisJbW92cQklcjExLC0zMiglcmJ4KQorCWFkb3hxCSVyMTUsJXIxMworCW11bHhxCTI0KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXI5LCVyZHgKKwltb3ZxCSVyMTIsLTI0KCVyYngpCisJYWRjeHEJJXJheCwlcjEzCisJYWRveHEJJXJicCwlcjE1CisJbGVhcQkzMiglcmN4KSwlcmN4CisJbW92cQklcjEzLC0xNiglcmJ4KQorCisJZGVjcQklcmRpCisJam56CS5MbXVseDR4XzFzdAorCisJbW92cQkwKCVyc3ApLCVyYXgKKwltb3ZxCTgoJXJzcCksJXJkaQorCWFkY3EJJXJicCwlcjE1CisJYWRkcQklcjE1LCVyMTQKKwlzYmJxCSVyMTUsJXIxNQorCW1vdnEJJXIxNCwtOCglcmJ4KQorCWptcAkuTG11bHg0eF9vdXRlcgorCisuYWxpZ24JMzIKKy5MbXVseDR4X291dGVyOgorCW1vdnEJKCVyZGkpLCVyZHgKKwlsZWFxCTgoJXJkaSksJXJkaQorCXN1YnEJJXJheCwlcnNpCisJbW92cQklcjE1LCglcmJ4KQorCWxlYXEJNjQrMzIoJXJzcCksJXJieAorCXN1YnEJJXJheCwlcmN4CisKKwltdWx4cQkwKCVyc2kpLCVyOCwlcjExCisJeG9ybAklZWJwLCVlYnAKKwltb3ZxCSVyZHgsJXI5CisJbXVseHEJOCglcnNpKSwlcjE0LCVyMTIKKwlhZG94cQktMzIoJXJieCksJXI4CisJYWRjeHEJJXIxNCwlcjExCisJbXVseHEJMTYoJXJzaSksJXIxNSwlcjEzCisJYWRveHEJLTI0KCVyYngpLCVyMTEKKwlhZGN4cQklcjE1LCVyMTIKKwlhZG94cQktMTYoJXJieCksJXIxMgorCWFkY3hxCSVyYnAsJXIxMworCWFkb3hxCSVyYnAsJXIxMworCisJbW92cQklcmRpLDgoJXJzcCkKKwltb3ZxCSVyOCwlcjE1CisJaW11bHEJMjQoJXJzcCksJXI4CisJeG9ybAklZWJwLCVlYnAKKworCW11bHhxCTI0KCVyc2kpLCVyYXgsJXIxNAorCW1vdnEJJXI4LCVyZHgKKwlhZGN4cQklcmF4LCVyMTMKKwlhZG94cQktOCglcmJ4KSwlcjEzCisJYWRjeHEJJXJicCwlcjE0CisJbGVhcQkzMiglcnNpKSwlcnNpCisJYWRveHEJJXJicCwlcjE0CisKKwltdWx4cQkwKCVyY3gpLCVyYXgsJXIxMAorCWFkY3hxCSVyYXgsJXIxNQorCWFkb3hxCSVyMTEsJXIxMAorCW11bHhxCTgoJXJjeCksJXJheCwlcjExCisJYWRjeHEJJXJheCwlcjEwCisJYWRveHEJJXIxMiwlcjExCisJbXVseHEJMTYoJXJjeCksJXJheCwlcjEyCisJbW92cQklcjEwLC0zMiglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTMsJXIxMgorCW11bHhxCTI0KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXI5LCVyZHgKKwltb3ZxCSVyMTEsLTI0KCVyYngpCisJbGVhcQkzMiglcmN4KSwlcmN4CisJYWRjeHEJJXJheCwlcjEyCisJYWRveHEJJXJicCwlcjE1CisJbW92cQk0OCglcnNwKSwlcmRpCisJbW92cQklcjEyLC0xNiglcmJ4KQorCisJam1wCS5MbXVseDR4X2lubmVyCisKKy5hbGlnbgkzMgorLkxtdWx4NHhfaW5uZXI6CisJbXVseHEJMCglcnNpKSwlcjEwLCVyYXgKKwlhZGN4cQklcmJwLCVyMTUKKwlhZG94cQklcjE0LCVyMTAKKwltdWx4cQk4KCVyc2kpLCVyMTEsJXIxNAorCWFkY3hxCTAoJXJieCksJXIxMAorCWFkb3hxCSVyYXgsJXIxMQorCW11bHhxCTE2KCVyc2kpLCVyMTIsJXJheAorCWFkY3hxCTgoJXJieCksJXIxMQorCWFkb3hxCSVyMTQsJXIxMgorCW11bHhxCTI0KCVyc2kpLCVyMTMsJXIxNAorCW1vdnEJJXI4LCVyZHgKKwlhZGN4cQkxNiglcmJ4KSwlcjEyCisJYWRveHEJJXJheCwlcjEzCisJYWRjeHEJMjQoJXJieCksJXIxMworCWFkb3hxCSVyYnAsJXIxNAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWxlYXEJMzIoJXJieCksJXJieAorCWFkY3hxCSVyYnAsJXIxNAorCisJYWRveHEJJXIxNSwlcjEwCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTUKKwlhZGN4cQklcmF4LCVyMTAKKwlhZG94cQklcjE1LCVyMTEKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxNQorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTUsJXIxMgorCW11bHhxCTE2KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXIxMCwtNDAoJXJieCkKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcjE1LCVyMTMKKwltdWx4cQkyNCglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyOSwlcmR4CisJbW92cQklcjExLC0zMiglcmJ4KQorCW1vdnEJJXIxMiwtMjQoJXJieCkKKwlhZGN4cQklcmF4LCVyMTMKKwlhZG94cQklcmJwLCVyMTUKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCSVyMTMsLTE2KCVyYngpCisKKwlkZWNxCSVyZGkKKwlqbnoJLkxtdWx4NHhfaW5uZXIKKworCW1vdnEJMCglcnNwKSwlcmF4CisJbW92cQk4KCVyc3ApLCVyZGkKKwlhZGNxCSVyYnAsJXIxNQorCXN1YnEJMCglcmJ4KSwlcmJwCisJYWRjcQklcjE1LCVyMTQKKwlzYmJxCSVyMTUsJXIxNQorCW1vdnEJJXIxNCwtOCglcmJ4KQorCisJY21wcQkxNiglcnNwKSwlcmRpCisJam5lCS5MbXVseDR4X291dGVyCisKKwlsZWFxCTY0KCVyc3ApLCVyYngKKwlzdWJxCSVyYXgsJXJjeAorCW5lZ3EJJXIxNQorCW1vdnEJJXJheCwlcmR4CisJc2hycQkkMysyLCVyYXgKKwltb3ZxCTMyKCVyc3ApLCVyZGkKKwlqbXAJLkxtdWx4NHhfc3ViCisKKy5hbGlnbgkzMgorLkxtdWx4NHhfc3ViOgorCW1vdnEJMCglcmJ4KSwlcjExCisJbW92cQk4KCVyYngpLCVyMTIKKwltb3ZxCTE2KCVyYngpLCVyMTMKKwltb3ZxCTI0KCVyYngpLCVyMTQKKwlsZWFxCTMyKCVyYngpLCVyYngKKwlzYmJxCTAoJXJjeCksJXIxMQorCXNiYnEJOCglcmN4KSwlcjEyCisJc2JicQkxNiglcmN4KSwlcjEzCisJc2JicQkyNCglcmN4KSwlcjE0CisJbGVhcQkzMiglcmN4KSwlcmN4CisJbW92cQklcjExLDAoJXJkaSkKKwltb3ZxCSVyMTIsOCglcmRpKQorCW1vdnEJJXIxMywxNiglcmRpKQorCW1vdnEJJXIxNCwyNCglcmRpKQorCWxlYXEJMzIoJXJkaSksJXJkaQorCWRlY3EJJXJheAorCWpuegkuTG11bHg0eF9zdWIKKworCXNiYnEJJDAsJXIxNQorCWxlYXEJNjQoJXJzcCksJXJieAorCXN1YnEJJXJkeCwlcmRpCisKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjA3CisJcHhvcgkleG1tMCwleG1tMAorCXBzaHVmZAkkMCwleG1tMSwleG1tMQorCW1vdnEJNDAoJXJzcCksJXJzaQorLmNmaV9kZWZfY2ZhCSVyc2ksOAorCWptcAkuTG11bHg0eF9jb25kX2NvcHkKKworLmFsaWduCTMyCisuTG11bHg0eF9jb25kX2NvcHk6CisJbW92ZHFhCTAoJXJieCksJXhtbTIKKwltb3ZkcWEJMTYoJXJieCksJXhtbTMKKwlsZWFxCTMyKCVyYngpLCVyYngKKwltb3ZkcXUJMCglcmRpKSwleG1tNAorCW1vdmRxdQkxNiglcmRpKSwleG1tNQorCWxlYXEJMzIoJXJkaSksJXJkaQorCW1vdmRxYQkleG1tMCwtMzIoJXJieCkKKwltb3ZkcWEJJXhtbTAsLTE2KCVyYngpCisJcGNtcGVxZAkleG1tMSwleG1tMAorCXBhbmQJJXhtbTEsJXhtbTIKKwlwYW5kCSV4bW0xLCV4bW0zCisJcGFuZAkleG1tMCwleG1tNAorCXBhbmQJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW0wCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHF1CSV4bW00LC0zMiglcmRpKQorCW1vdmRxdQkleG1tNSwtMTYoJXJkaSkKKwlzdWJxCSQzMiwlcmR4CisJam56CS5MbXVseDR4X2NvbmRfY29weQorCisJbW92cQklcmR4LCglcmJ4KQorCisJbW92cQkkMSwlcmF4CisJbW92cQktNDgoJXJzaSksJXIxNQorLmNmaV9yZXN0b3JlCSVyMTUKKwltb3ZxCS00MCglcnNpKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJLTMyKCVyc2kpLCVyMTMKKy5jZmlfcmVzdG9yZQklcjEzCisJbW92cQktMjQoJXJzaSksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCW1vdnEJLTgoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlsZWFxCSglcnNpKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxtdWx4NHhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisuY2ZpX2VuZHByb2MJCisuc2l6ZQlibl9tdWx4NHhfbW9udCwuLWJuX211bHg0eF9tb250CisuYnl0ZQk3NywxMTEsMTEwLDExNiwxMDMsMTExLDEwOSwxMDEsMTE0LDEyMSwzMiw3NywxMTcsMTA4LDExNiwxMDUsMTEyLDEwOCwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NCw1Miw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuYWxpZ24JMTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQ1LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2xpbnV4LXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS94ODZfNjQtbW9udDUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzRlMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9saW51eC14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQ1LlMKQEAgLTAsMCArMSwzNzU2IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCisuaGlkZGVuIE9QRU5TU0xfaWEzMmNhcF9QCisKKy5nbG9ibAlibl9tdWxfbW9udF9nYXRoZXI1CisuaGlkZGVuIGJuX211bF9tb250X2dhdGhlcjUKKy50eXBlCWJuX211bF9tb250X2dhdGhlcjUsQGZ1bmN0aW9uCisuYWxpZ24JNjQKK2JuX211bF9tb250X2dhdGhlcjU6CisuY2ZpX3N0YXJ0cHJvYwkKKwltb3ZsCSVyOWQsJXI5ZAorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorCXRlc3RsCSQ3LCVyOWQKKwlqbnoJLkxtdWxfZW50ZXIKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTEKKwltb3ZsCTgoJXIxMSksJXIxMWQKKwlqbXAJLkxtdWw0eF9lbnRlcgorCisuYWxpZ24JMTYKKy5MbXVsX2VudGVyOgorCW1vdmQJOCglcnNwKSwleG1tNQorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorCisJbmVncQklcjkKKwltb3ZxCSVyc3AsJXIxMQorCWxlYXEJLTI4MCglcnNwLCVyOSw4KSwlcjEwCisJbmVncQklcjkKKwlhbmRxCSQtMTAyNCwlcjEwCisKKworCisKKworCisKKworCisJc3VicQklcjEwLCVyMTEKKwlhbmRxCSQtNDA5NiwlcjExCisJbGVhcQkoJXIxMCwlcjExLDEpLCVyc3AKKwltb3ZxCSglcnNwKSwlcjExCisJY21wcQklcjEwLCVyc3AKKwlqYQkuTG11bF9wYWdlX3dhbGsKKwlqbXAJLkxtdWxfcGFnZV93YWxrX2RvbmUKKworLkxtdWxfcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTEKKwljbXBxCSVyMTAsJXJzcAorCWphCS5MbXVsX3BhZ2Vfd2FsaworLkxtdWxfcGFnZV93YWxrX2RvbmU6CisKKwlsZWFxCS5MaW5jKCVyaXApLCVyMTAKKwltb3ZxCSVyYXgsOCglcnNwLCVyOSw4KQorLmNmaV9lc2NhcGUJMHgwZiwweDBhLDB4NzcsMHgwOCwweDc5LDB4MDAsMHgzOCwweDFlLDB4MjIsMHgwNiwweDIzLDB4MDgKKy5MbXVsX2JvZHk6CisKKwlsZWFxCTEyOCglcmR4KSwlcjEyCisJbW92ZHFhCTAoJXIxMCksJXhtbTAKKwltb3ZkcWEJMTYoJXIxMCksJXhtbTEKKwlsZWFxCTI0LTExMiglcnNwLCVyOSw4KSwlcjEwCisJYW5kcQkkLTE2LCVyMTAKKworCXBzaHVmZAkkMCwleG1tNSwleG1tNQorCW1vdmRxYQkleG1tMSwleG1tNAorCW1vdmRxYQkleG1tMSwleG1tMgorCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorLmJ5dGUJMHg2NworCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwxMTIoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwxMjgoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwxNDQoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKworCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMywxNjAoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsMTc2KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMTkyKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMjA4KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0yCisKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTMsMjI0KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDI0MCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDI1NiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDI3MiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMgorCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLDI4OCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwzMDQoJXIxMCkKKworCXBhZGRkCSV4bW0yLCV4bW0zCisuYnl0ZQkweDY3CisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwzMjAoJXIxMCkKKworCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMzM2KCVyMTApCisJcGFuZAk2NCglcjEyKSwleG1tMAorCisJcGFuZAk4MCglcjEyKSwleG1tMQorCXBhbmQJOTYoJXIxMiksJXhtbTIKKwltb3ZkcWEJJXhtbTMsMzUyKCVyMTApCisJcGFuZAkxMTIoJXIxMiksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTAKKwlwb3IJJXhtbTMsJXhtbTEKKwltb3ZkcWEJLTEyOCglcjEyKSwleG1tNAorCW1vdmRxYQktMTEyKCVyMTIpLCV4bW01CisJbW92ZHFhCS05NiglcjEyKSwleG1tMgorCXBhbmQJMTEyKCVyMTApLCV4bW00CisJbW92ZHFhCS04MCglcjEyKSwleG1tMworCXBhbmQJMTI4KCVyMTApLCV4bW01CisJcG9yCSV4bW00LCV4bW0wCisJcGFuZAkxNDQoJXIxMCksJXhtbTIKKwlwb3IJJXhtbTUsJXhtbTEKKwlwYW5kCTE2MCglcjEwKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCW1vdmRxYQktNjQoJXIxMiksJXhtbTQKKwltb3ZkcWEJLTQ4KCVyMTIpLCV4bW01CisJbW92ZHFhCS0zMiglcjEyKSwleG1tMgorCXBhbmQJMTc2KCVyMTApLCV4bW00CisJbW92ZHFhCS0xNiglcjEyKSwleG1tMworCXBhbmQJMTkyKCVyMTApLCV4bW01CisJcG9yCSV4bW00LCV4bW0wCisJcGFuZAkyMDgoJXIxMCksJXhtbTIKKwlwb3IJJXhtbTUsJXhtbTEKKwlwYW5kCTIyNCglcjEwKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCW1vdmRxYQkwKCVyMTIpLCV4bW00CisJbW92ZHFhCTE2KCVyMTIpLCV4bW01CisJbW92ZHFhCTMyKCVyMTIpLCV4bW0yCisJcGFuZAkyNDAoJXIxMCksJXhtbTQKKwltb3ZkcWEJNDgoJXIxMiksJXhtbTMKKwlwYW5kCTI1NiglcjEwKSwleG1tNQorCXBvcgkleG1tNCwleG1tMAorCXBhbmQJMjcyKCVyMTApLCV4bW0yCisJcG9yCSV4bW01LCV4bW0xCisJcGFuZAkyODgoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTAKKwlwb3IJJXhtbTMsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDB4NGUsJXhtbTAsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTAKKwlsZWFxCTI1NiglcjEyKSwlcjEyCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5NQorCisJbW92cQkoJXI4KSwlcjgKKwltb3ZxCSglcnNpKSwlcmF4CisKKwl4b3JxCSVyMTQsJXIxNAorCXhvcnEJJXIxNSwlcjE1CisKKwltb3ZxCSVyOCwlcmJwCisJbXVscQklcmJ4CisJbW92cQklcmF4LCVyMTAKKwltb3ZxCSglcmN4KSwlcmF4CisKKwlpbXVscQklcjEwLCVyYnAKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEzCisKKwlsZWFxCTEoJXIxNSksJXIxNQorCWptcAkuTDFzdF9lbnRlcgorCisuYWxpZ24JMTYKKy5MMXN0OgorCWFkZHEJJXJheCwlcjEzCisJbW92cQkoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCW1vdnEJJXIxMCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisuTDFzdF9lbnRlcjoKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbGVhcQkxKCVyMTUpLCVyMTUKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJY21wcQklcjksJXIxNQorCWpuZQkuTDFzdAorCisKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyOSw4KQorCW1vdnEJJXJkeCwlcjEzCisJbW92cQklcjEwLCVyMTEKKworCXhvcnEJJXJkeCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjksOCkKKwltb3ZxCSVyZHgsKCVyc3AsJXI5LDgpCisKKwlsZWFxCTEoJXIxNCksJXIxNAorCWptcAkuTG91dGVyCisuYWxpZ24JMTYKKy5Mb3V0ZXI6CisJbGVhcQkyNCsxMjgoJXJzcCwlcjksOCksJXJkeAorCWFuZHEJJC0xNiwlcmR4CisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwltb3ZkcWEJLTEyOCglcjEyKSwleG1tMAorCW1vdmRxYQktMTEyKCVyMTIpLCV4bW0xCisJbW92ZHFhCS05NiglcjEyKSwleG1tMgorCW1vdmRxYQktODAoJXIxMiksJXhtbTMKKwlwYW5kCS0xMjgoJXJkeCksJXhtbTAKKwlwYW5kCS0xMTIoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS05NiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTgwKCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCS02NCglcjEyKSwleG1tMAorCW1vdmRxYQktNDgoJXIxMiksJXhtbTEKKwltb3ZkcWEJLTMyKCVyMTIpLCV4bW0yCisJbW92ZHFhCS0xNiglcjEyKSwleG1tMworCXBhbmQJLTY0KCVyZHgpLCV4bW0wCisJcGFuZAktNDgoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS0zMiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTE2KCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTAoJXIxMiksJXhtbTAKKwltb3ZkcWEJMTYoJXIxMiksJXhtbTEKKwltb3ZkcWEJMzIoJXIxMiksJXhtbTIKKwltb3ZkcWEJNDgoJXIxMiksJXhtbTMKKwlwYW5kCTAoJXJkeCksJXhtbTAKKwlwYW5kCTE2KCVyZHgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAkzMiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDgoJXJkeCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJNjQoJXIxMiksJXhtbTAKKwltb3ZkcWEJODAoJXIxMiksJXhtbTEKKwltb3ZkcWEJOTYoJXIxMiksJXhtbTIKKwltb3ZkcWEJMTEyKCVyMTIpLCV4bW0zCisJcGFuZAk2NCglcmR4KSwleG1tMAorCXBhbmQJODAoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTk2KCVyZHgpLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkxMTIoJXJkeCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwlwb3IJJXhtbTUsJXhtbTQKKwlwc2h1ZmQJJDB4NGUsJXhtbTQsJXhtbTAKKwlwb3IJJXhtbTQsJXhtbTAKKwlsZWFxCTI1NiglcjEyKSwlcjEyCisKKwltb3ZxCSglcnNpKSwlcmF4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5NQorCisJeG9ycQklcjE1LCVyMTUKKwltb3ZxCSVyOCwlcmJwCisJbW92cQkoJXJzcCksJXIxMAorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisKKwlpbXVscQklcjEwLCVyYnAKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJOCglcnNwKSwlcjEwCisJbW92cQklcmR4LCVyMTMKKworCWxlYXEJMSglcjE1KSwlcjE1CisJam1wCS5MaW5uZXJfZW50ZXIKKworLmFsaWduCTE2CisuTGlubmVyOgorCWFkZHEJJXJheCwlcjEzCisJbW92cQkoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCW1vdnEJKCVyc3AsJXIxNSw4KSwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisuTGlubmVyX2VudGVyOgorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQkoJXJjeCwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisJbGVhcQkxKCVyMTUpLCVyMTUKKworCW11bHEJJXJicAorCWNtcHEJJXI5LCVyMTUKKwlqbmUJLkxpbm5lcgorCisJYWRkcQklcmF4LCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCW1vdnEJKCVyc3AsJXI5LDgpLCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTE2KCVyc3AsJXI5LDgpCisJbW92cQklcmR4LCVyMTMKKworCXhvcnEJJXJkeCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtOCglcnNwLCVyOSw4KQorCW1vdnEJJXJkeCwoJXJzcCwlcjksOCkKKworCWxlYXEJMSglcjE0KSwlcjE0CisJY21wcQklcjksJXIxNAorCWpiCS5Mb3V0ZXIKKworCXhvcnEJJXIxNCwlcjE0CisJbW92cQkoJXJzcCksJXJheAorCWxlYXEJKCVyc3ApLCVyc2kKKwltb3ZxCSVyOSwlcjE1CisJam1wCS5Mc3ViCisuYWxpZ24JMTYKKy5Mc3ViOglzYmJxCSglcmN4LCVyMTQsOCksJXJheAorCW1vdnEJJXJheCwoJXJkaSwlcjE0LDgpCisJbW92cQk4KCVyc2ksJXIxNCw4KSwlcmF4CisJbGVhcQkxKCVyMTQpLCVyMTQKKwlkZWNxCSVyMTUKKwlqbnoJLkxzdWIKKworCXNiYnEJJDAsJXJheAorCW1vdnEJJC0xLCVyYngKKwl4b3JxCSVyYXgsJXJieAorCXhvcnEJJXIxNCwlcjE0CisJbW92cQklcjksJXIxNQorCisuTGNvcHk6CisJbW92cQkoJXJkaSwlcjE0LDgpLCVyY3gKKwltb3ZxCSglcnNwLCVyMTQsOCksJXJkeAorCWFuZHEJJXJieCwlcmN4CisJYW5kcQklcmF4LCVyZHgKKwltb3ZxCSVyMTQsKCVyc3AsJXIxNCw4KQorCW9ycQklcmN4LCVyZHgKKwltb3ZxCSVyZHgsKCVyZGksJXIxNCw4KQorCWxlYXEJMSglcjE0KSwlcjE0CisJc3VicQkkMSwlcjE1CisJam56CS5MY29weQorCisJbW92cQk4KCVyc3AsJXI5LDgpLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCSQxLCVyYXgKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyc2kpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5MbXVsX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYm5fbXVsX21vbnRfZ2F0aGVyNSwuLWJuX211bF9tb250X2dhdGhlcjUKKy50eXBlCWJuX211bDR4X21vbnRfZ2F0aGVyNSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYm5fbXVsNHhfbW9udF9nYXRoZXI1OgorLmNmaV9zdGFydHByb2MJCisuYnl0ZQkweDY3CisJbW92cQklcnNwLCVyYXgKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcmF4CisuTG11bDR4X2VudGVyOgorCWFuZGwJJDB4ODAxMDgsJXIxMWQKKwljbXBsCSQweDgwMTA4LCVyMTFkCisJamUJLkxtdWx4NHhfZW50ZXIKKwlwdXNocQklcmJ4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKy5MbXVsNHhfcHJvbG9ndWU6CisKKy5ieXRlCTB4NjcKKwlzaGxsCSQzLCVyOWQKKwlsZWFxCSglcjksJXI5LDIpLCVyMTAKKwluZWdxCSVyOQorCisKKworCisKKworCisKKworCisJbGVhcQktMzIwKCVyc3AsJXI5LDIpLCVyMTEKKwltb3ZxCSVyc3AsJXJicAorCXN1YnEJJXJkaSwlcjExCisJYW5kcQkkNDA5NSwlcjExCisJY21wcQklcjExLCVyMTAKKwlqYgkuTG11bDR4c3BfYWx0CisJc3VicQklcjExLCVyYnAKKwlsZWFxCS0zMjAoJXJicCwlcjksMiksJXJicAorCWptcAkuTG11bDR4c3BfZG9uZQorCisuYWxpZ24JMzIKKy5MbXVsNHhzcF9hbHQ6CisJbGVhcQk0MDk2LTMyMCgsJXI5LDIpLCVyMTAKKwlsZWFxCS0zMjAoJXJicCwlcjksMiksJXJicAorCXN1YnEJJXIxMCwlcjExCisJbW92cQkkMCwlcjEwCisJY21vdmNxCSVyMTAsJXIxMQorCXN1YnEJJXIxMSwlcmJwCisuTG11bDR4c3BfZG9uZToKKwlhbmRxCSQtNjQsJXJicAorCW1vdnEJJXJzcCwlcjExCisJc3VicQklcmJwLCVyMTEKKwlhbmRxCSQtNDA5NiwlcjExCisJbGVhcQkoJXIxMSwlcmJwLDEpLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQkuTG11bDR4X3BhZ2Vfd2FsaworCWptcAkuTG11bDR4X3BhZ2Vfd2Fsa19kb25lCisKKy5MbXVsNHhfcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCS5MbXVsNHhfcGFnZV93YWxrCisuTG11bDR4X3BhZ2Vfd2Fsa19kb25lOgorCisJbmVncQklcjkKKworCW1vdnEJJXJheCw0MCglcnNwKQorLmNmaV9lc2NhcGUJMHgwZiwweDA1LDB4NzcsMHgyOCwweDA2LDB4MjMsMHgwOAorLkxtdWw0eF9ib2R5OgorCisJY2FsbAltdWw0eF9pbnRlcm5hbAorCisJbW92cQk0MCglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw4CisJbW92cQkkMSwlcmF4CisKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTG11bDR4X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYm5fbXVsNHhfbW9udF9nYXRoZXI1LC4tYm5fbXVsNHhfbW9udF9nYXRoZXI1CisKKy50eXBlCW11bDR4X2ludGVybmFsLEBmdW5jdGlvbgorLmFsaWduCTMyCittdWw0eF9pbnRlcm5hbDoKKwlzaGxxCSQ1LCVyOQorCW1vdmQJOCglcmF4KSwleG1tNQorCWxlYXEJLkxpbmMoJXJpcCksJXJheAorCWxlYXEJMTI4KCVyZHgsJXI5LDEpLCVyMTMKKwlzaHJxCSQ1LCVyOQorCW1vdmRxYQkwKCVyYXgpLCV4bW0wCisJbW92ZHFhCTE2KCVyYXgpLCV4bW0xCisJbGVhcQk4OC0xMTIoJXJzcCwlcjksMSksJXIxMAorCWxlYXEJMTI4KCVyZHgpLCVyMTIKKworCXBzaHVmZAkkMCwleG1tNSwleG1tNQorCW1vdmRxYQkleG1tMSwleG1tNAorLmJ5dGUJMHg2NywweDY3CisJbW92ZHFhCSV4bW0xLCV4bW0yCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisuYnl0ZQkweDY3CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDExMiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDEyOCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDE0NCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMgorCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLDE2MCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwxNzYoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwxOTIoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwyMDgoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKworCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMywyMjQoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsMjQwKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMjU2KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMjcyKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0yCisKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTMsMjg4KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDMwNCglcjEwKQorCisJcGFkZGQJJXhtbTIsJXhtbTMKKy5ieXRlCTB4NjcKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDMyMCglcjEwKQorCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwzMzYoJXIxMCkKKwlwYW5kCTY0KCVyMTIpLCV4bW0wCisKKwlwYW5kCTgwKCVyMTIpLCV4bW0xCisJcGFuZAk5NiglcjEyKSwleG1tMgorCW1vdmRxYQkleG1tMywzNTIoJXIxMCkKKwlwYW5kCTExMiglcjEyKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCW1vdmRxYQktMTI4KCVyMTIpLCV4bW00CisJbW92ZHFhCS0xMTIoJXIxMiksJXhtbTUKKwltb3ZkcWEJLTk2KCVyMTIpLCV4bW0yCisJcGFuZAkxMTIoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTgwKCVyMTIpLCV4bW0zCisJcGFuZAkxMjgoJXIxMCksJXhtbTUKKwlwb3IJJXhtbTQsJXhtbTAKKwlwYW5kCTE0NCglcjEwKSwleG1tMgorCXBvcgkleG1tNSwleG1tMQorCXBhbmQJMTYwKCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCS02NCglcjEyKSwleG1tNAorCW1vdmRxYQktNDgoJXIxMiksJXhtbTUKKwltb3ZkcWEJLTMyKCVyMTIpLCV4bW0yCisJcGFuZAkxNzYoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTE2KCVyMTIpLCV4bW0zCisJcGFuZAkxOTIoJXIxMCksJXhtbTUKKwlwb3IJJXhtbTQsJXhtbTAKKwlwYW5kCTIwOCglcjEwKSwleG1tMgorCXBvcgkleG1tNSwleG1tMQorCXBhbmQJMjI0KCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCTAoJXIxMiksJXhtbTQKKwltb3ZkcWEJMTYoJXIxMiksJXhtbTUKKwltb3ZkcWEJMzIoJXIxMiksJXhtbTIKKwlwYW5kCTI0MCglcjEwKSwleG1tNAorCW1vdmRxYQk0OCglcjEyKSwleG1tMworCXBhbmQJMjU2KCVyMTApLCV4bW01CisJcG9yCSV4bW00LCV4bW0wCisJcGFuZAkyNzIoJXIxMCksJXhtbTIKKwlwb3IJJXhtbTUsJXhtbTEKKwlwYW5kCTI4OCglcjEwKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCXBvcgkleG1tMSwleG1tMAorCXBzaHVmZAkkMHg0ZSwleG1tMCwleG1tMQorCXBvcgkleG1tMSwleG1tMAorCWxlYXEJMjU2KCVyMTIpLCVyMTIKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk1CisKKwltb3ZxCSVyMTMsMTYrOCglcnNwKQorCW1vdnEJJXJkaSw1Nis4KCVyc3ApCisKKwltb3ZxCSglcjgpLCVyOAorCW1vdnEJKCVyc2kpLCVyYXgKKwlsZWFxCSglcnNpLCVyOSwxKSwlcnNpCisJbmVncQklcjkKKworCW1vdnEJJXI4LCVyYnAKKwltdWxxCSVyYngKKwltb3ZxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gpLCVyYXgKKworCWltdWxxCSVyMTAsJXJicAorCWxlYXEJNjQrOCglcnNwKSwlcjE0CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJbW92cQk4KCVyc2ksJXI5LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCTgoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJMTYoJXJzaSwlcjksMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJbGVhcQkzMiglcjkpLCVyMTUKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksKCVyMTQpCisJbW92cQklcmR4LCVyMTMKKwlqbXAJLkwxc3Q0eAorCisuYWxpZ24JMzIKKy5MMXN0NHg6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4KSwlcmF4CisJbGVhcQkzMiglcjE0KSwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpLCVyMTUsMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcjE0KQorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJLTgoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJKCVyc2ksJXIxNSwxKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTE2KCVyMTQpCisJbW92cQklcmR4LCVyMTMKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQkwKCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCTgoJXJzaSwlcjE1LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtOCglcjE0KQorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkxNiglcnNpLCVyMTUsMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJbGVhcQkzMiglcmN4KSwlcmN4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLCglcjE0KQorCW1vdnEJJXJkeCwlcjEzCisKKwlhZGRxCSQzMiwlcjE1CisJam56CS5MMXN0NHgKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQktMTYoJXJjeCksJXJheAorCWxlYXEJMzIoJXIxNCksJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJLTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcjE0KQorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJLTgoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJKCVyc2ksJXI5LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkaSwtMTYoJXIxNCkKKwltb3ZxCSVyZHgsJXIxMworCisJbGVhcQkoJXJjeCwlcjksMSksJXJjeAorCisJeG9ycQklcmRpLCVyZGkKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkaQorCW1vdnEJJXIxMywtOCglcjE0KQorCisJam1wCS5Mb3V0ZXI0eAorCisuYWxpZ24JMzIKKy5Mb3V0ZXI0eDoKKwlsZWFxCTE2KzEyOCglcjE0KSwlcmR4CisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwltb3ZkcWEJLTEyOCglcjEyKSwleG1tMAorCW1vdmRxYQktMTEyKCVyMTIpLCV4bW0xCisJbW92ZHFhCS05NiglcjEyKSwleG1tMgorCW1vdmRxYQktODAoJXIxMiksJXhtbTMKKwlwYW5kCS0xMjgoJXJkeCksJXhtbTAKKwlwYW5kCS0xMTIoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS05NiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTgwKCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCS02NCglcjEyKSwleG1tMAorCW1vdmRxYQktNDgoJXIxMiksJXhtbTEKKwltb3ZkcWEJLTMyKCVyMTIpLCV4bW0yCisJbW92ZHFhCS0xNiglcjEyKSwleG1tMworCXBhbmQJLTY0KCVyZHgpLCV4bW0wCisJcGFuZAktNDgoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS0zMiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTE2KCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTAoJXIxMiksJXhtbTAKKwltb3ZkcWEJMTYoJXIxMiksJXhtbTEKKwltb3ZkcWEJMzIoJXIxMiksJXhtbTIKKwltb3ZkcWEJNDgoJXIxMiksJXhtbTMKKwlwYW5kCTAoJXJkeCksJXhtbTAKKwlwYW5kCTE2KCVyZHgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAkzMiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDgoJXJkeCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJNjQoJXIxMiksJXhtbTAKKwltb3ZkcWEJODAoJXIxMiksJXhtbTEKKwltb3ZkcWEJOTYoJXIxMiksJXhtbTIKKwltb3ZkcWEJMTEyKCVyMTIpLCV4bW0zCisJcGFuZAk2NCglcmR4KSwleG1tMAorCXBhbmQJODAoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTk2KCVyZHgpLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkxMTIoJXJkeCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwlwb3IJJXhtbTUsJXhtbTQKKwlwc2h1ZmQJJDB4NGUsJXhtbTQsJXhtbTAKKwlwb3IJJXhtbTQsJXhtbTAKKwlsZWFxCTI1NiglcjEyKSwlcjEyCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5NQorCisJbW92cQkoJXIxNCwlcjksMSksJXIxMAorCW1vdnEJJXI4LCVyYnAKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCWltdWxxCSVyMTAsJXJicAorCW1vdnEJJXJkeCwlcjExCisJbW92cQklcmRpLCglcjE0KQorCisJbGVhcQkoJXIxNCwlcjksMSksJXIxNAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSwlcjksMSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQk4KCVyMTQpLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCTE2KCVyc2ksJXI5LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWxlYXEJMzIoJXI5KSwlcjE1CisJbGVhcQkzMiglcmN4KSwlcmN4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTMKKwlqbXAJLkxpbm5lcjR4CisKKy5hbGlnbgkzMgorLkxpbm5lcjR4OgorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQktMTYoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJMTYoJXIxNCksJXIxMAorCWxlYXEJMzIoJXIxNCksJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJLTgoJXJzaSwlcjE1LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkaSwtMzIoJXIxNCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCS04KCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCS04KCVyMTQpLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCSglcnNpLCVyMTUsMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcjE0KQorCW1vdnEJJXJkeCwlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJMCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQkoJXIxNCksJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJOCglcnNpLCVyMTUsMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0xNiglcjE0KQorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQk4KCVyMTQpLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCTE2KCVyc2ksJXIxNSwxKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTgoJXIxNCkKKwltb3ZxCSVyZHgsJXIxMworCisJYWRkcQkkMzIsJXIxNQorCWpuegkuTGlubmVyNHgKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQktMTYoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJMTYoJXIxNCksJXIxMAorCWxlYXEJMzIoJXIxNCksJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJLTgoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0zMiglcjE0KQorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJicCwlcmF4CisJbW92cQktOCglcmN4KSwlcmJwCisJYWRjcQkkMCwlcmR4CisJYWRkcQktOCglcjE0KSwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSwlcjksMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcjE0KQorCW1vdnEJJXJkeCwlcjEzCisKKwltb3ZxCSVyZGksLTE2KCVyMTQpCisJbGVhcQkoJXJjeCwlcjksMSksJXJjeAorCisJeG9ycQklcmRpLCVyZGkKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkaQorCWFkZHEJKCVyMTQpLCVyMTMKKwlhZGNxCSQwLCVyZGkKKwltb3ZxCSVyMTMsLTgoJXIxNCkKKworCWNtcHEJMTYrOCglcnNwKSwlcjEyCisJamIJLkxvdXRlcjR4CisJeG9ycQklcmF4LCVyYXgKKwlzdWJxCSVyMTMsJXJicAorCWFkY3EJJXIxNSwlcjE1CisJb3JxCSVyMTUsJXJkaQorCXN1YnEJJXJkaSwlcmF4CisJbGVhcQkoJXIxNCwlcjksMSksJXJieAorCW1vdnEJKCVyY3gpLCVyMTIKKwlsZWFxCSglcmN4KSwlcmJwCisJbW92cQklcjksJXJjeAorCXNhcnEJJDMrMiwlcmN4CisJbW92cQk1Nis4KCVyc3ApLCVyZGkKKwlkZWNxCSVyMTIKKwl4b3JxCSVyMTAsJXIxMAorCW1vdnEJOCglcmJwKSwlcjEzCisJbW92cQkxNiglcmJwKSwlcjE0CisJbW92cQkyNCglcmJwKSwlcjE1CisJam1wCS5Mc3FyNHhfc3ViX2VudHJ5Cisuc2l6ZQltdWw0eF9pbnRlcm5hbCwuLW11bDR4X2ludGVybmFsCisuZ2xvYmwJYm5fcG93ZXI1CisuaGlkZGVuIGJuX3Bvd2VyNQorLnR5cGUJYm5fcG93ZXI1LEBmdW5jdGlvbgorLmFsaWduCTMyCitibl9wb3dlcjU6CisuY2ZpX3N0YXJ0cHJvYwkKKwltb3ZxCSVyc3AsJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTEKKwltb3ZsCTgoJXIxMSksJXIxMWQKKwlhbmRsCSQweDgwMTA4LCVyMTFkCisJY21wbAkkMHg4MDEwOCwlcjExZAorCWplCS5McG93ZXJ4NV9lbnRlcgorCXB1c2hxCSVyYngKKy5jZmlfb2Zmc2V0CSVyYngsLTE2CisJcHVzaHEJJXJicAorLmNmaV9vZmZzZXQJJXJicCwtMjQKKwlwdXNocQklcjEyCisuY2ZpX29mZnNldAklcjEyLC0zMgorCXB1c2hxCSVyMTMKKy5jZmlfb2Zmc2V0CSVyMTMsLTQwCisJcHVzaHEJJXIxNAorLmNmaV9vZmZzZXQJJXIxNCwtNDgKKwlwdXNocQklcjE1CisuY2ZpX29mZnNldAklcjE1LC01NgorLkxwb3dlcjVfcHJvbG9ndWU6CisKKwlzaGxsCSQzLCVyOWQKKwlsZWFsCSglcjksJXI5LDIpLCVyMTBkCisJbmVncQklcjkKKwltb3ZxCSglcjgpLCVyOAorCisKKworCisKKworCisKKwlsZWFxCS0zMjAoJXJzcCwlcjksMiksJXIxMQorCW1vdnEJJXJzcCwlcmJwCisJc3VicQklcmRpLCVyMTEKKwlhbmRxCSQ0MDk1LCVyMTEKKwljbXBxCSVyMTEsJXIxMAorCWpiCS5McHdyX3NwX2FsdAorCXN1YnEJJXIxMSwlcmJwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlqbXAJLkxwd3Jfc3BfZG9uZQorCisuYWxpZ24JMzIKKy5McHdyX3NwX2FsdDoKKwlsZWFxCTQwOTYtMzIwKCwlcjksMiksJXIxMAorCWxlYXEJLTMyMCglcmJwLCVyOSwyKSwlcmJwCisJc3VicQklcjEwLCVyMTEKKwltb3ZxCSQwLCVyMTAKKwljbW92Y3EJJXIxMCwlcjExCisJc3VicQklcjExLCVyYnAKKy5McHdyX3NwX2RvbmU6CisJYW5kcQkkLTY0LCVyYnAKKwltb3ZxCSVyc3AsJXIxMQorCXN1YnEJJXJicCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTEsJXJicCwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMAorCWNtcHEJJXJicCwlcnNwCisJamEJLkxwd3JfcGFnZV93YWxrCisJam1wCS5McHdyX3BhZ2Vfd2Fsa19kb25lCisKKy5McHdyX3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQkuTHB3cl9wYWdlX3dhbGsKKy5McHdyX3BhZ2Vfd2Fsa19kb25lOgorCisJbW92cQklcjksJXIxMAorCW5lZ3EJJXI5CisKKworCisKKworCisKKworCisKKwltb3ZxCSVyOCwzMiglcnNwKQorCW1vdnEJJXJheCw0MCglcnNwKQorLmNmaV9lc2NhcGUJMHgwZiwweDA1LDB4NzcsMHgyOCwweDA2LDB4MjMsMHgwOAorLkxwb3dlcjVfYm9keToKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjA3CisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwOQorLmJ5dGUJMTAyLDczLDE1LDExMCwyMTgKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjI2CisKKwljYWxsCV9fYm5fc3FyOHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdDR4X2ludGVybmFsCisJY2FsbAlfX2JuX3Nxcjh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3Q0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9wb3N0NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyOHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdDR4X2ludGVybmFsCisJY2FsbAlfX2JuX3Nxcjh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3Q0eF9pbnRlcm5hbAorCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwOQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMjYKKwltb3ZxCSVyc2ksJXJkaQorCW1vdnEJNDAoJXJzcCksJXJheAorCWxlYXEJMzIoJXJzcCksJXI4CisKKwljYWxsCW11bDR4X2ludGVybmFsCisKKwltb3ZxCTQwKCVyc3ApLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCSQxLCVyYXgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTHBvd2VyNV9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWJuX3Bvd2VyNSwuLWJuX3Bvd2VyNQorCisuZ2xvYmwJYm5fc3FyOHhfaW50ZXJuYWwKKy5oaWRkZW4gYm5fc3FyOHhfaW50ZXJuYWwKKy5oaWRkZW4JYm5fc3FyOHhfaW50ZXJuYWwKKy50eXBlCWJuX3Nxcjh4X2ludGVybmFsLEBmdW5jdGlvbgorLmFsaWduCTMyCitibl9zcXI4eF9pbnRlcm5hbDoKK19fYm5fc3FyOHhfaW50ZXJuYWw6CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwlsZWFxCTMyKCVyMTApLCVyYnAKKwlsZWFxCSglcnNpLCVyOSwxKSwlcnNpCisKKwltb3ZxCSVyOSwlcmN4CisKKworCW1vdnEJLTMyKCVyc2ksJXJicCwxKSwlcjE0CisJbGVhcQk0OCs4KCVyc3AsJXI5LDIpLCVyZGkKKwltb3ZxCS0yNCglcnNpLCVyYnAsMSksJXJheAorCWxlYXEJLTMyKCVyZGksJXJicCwxKSwlcmRpCisJbW92cQktMTYoJXJzaSwlcmJwLDEpLCVyYngKKwltb3ZxCSVyYXgsJXIxNQorCisJbXVscQklcjE0CisJbW92cQklcmF4LCVyMTAKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXJkeCwlcjExCisJbW92cQklcjEwLC0yNCglcmRpLCVyYnAsMSkKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmJ4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTEsLTE2KCVyZGksJXJicCwxKQorCW1vdnEJJXJkeCwlcjEwCisKKworCW1vdnEJLTgoJXJzaSwlcmJwLDEpLCVyYngKKwltdWxxCSVyMTUKKwltb3ZxCSVyYXgsJXIxMgorCW1vdnEJJXJieCwlcmF4CisJbW92cQklcmR4LCVyMTMKKworCWxlYXEJKCVyYnApLCVyY3gKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJieCwlcmF4CisJbW92cQklcmR4LCVyMTEKKwlhZGNxCSQwLCVyMTEKKwlhZGRxCSVyMTIsJXIxMAorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXIxMCwtOCglcmRpLCVyY3gsMSkKKwlqbXAJLkxzcXI0eF8xc3QKKworLmFsaWduCTMyCisuTHNxcjR4XzFzdDoKKwltb3ZxCSglcnNpLCVyY3gsMSksJXJieAorCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEzCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyZHgsJXIxMgorCWFkY3EJJDAsJXIxMgorCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJOCglcnNpLCVyY3gsMSksJXJieAorCW1vdnEJJXJkeCwlcjEwCisJYWRjcQkkMCwlcjEwCisJYWRkcQklcjEzLCVyMTEKKwlhZGNxCSQwLCVyMTAKKworCisJbXVscQklcjE1CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXIxMSwoJXJkaSwlcmN4LDEpCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCTE2KCVyc2ksJXJjeCwxKSwlcmJ4CisJbW92cQklcmR4LCVyMTEKKwlhZGNxCSQwLCVyMTEKKwlhZGRxCSVyMTIsJXIxMAorCWFkY3EJJDAsJXIxMQorCisJbXVscQklcjE1CisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXIxMCw4KCVyZGksJXJjeCwxKQorCW1vdnEJJXJkeCwlcjEyCisJYWRjcQkkMCwlcjEyCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJieCwlcmF4CisJbW92cQkyNCglcnNpLCVyY3gsMSksJXJieAorCW1vdnEJJXJkeCwlcjEwCisJYWRjcQkkMCwlcjEwCisJYWRkcQklcjEzLCVyMTEKKwlhZGNxCSQwLCVyMTAKKworCisJbXVscQklcjE1CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXIxMSwxNiglcmRpLCVyY3gsMSkKKwltb3ZxCSVyZHgsJXIxMworCWFkY3EJJDAsJXIxMworCWxlYXEJMzIoJXJjeCksJXJjeAorCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisJYWRkcQklcjEyLCVyMTAKKwlhZGNxCSQwLCVyMTEKKwltb3ZxCSVyMTAsLTgoJXJkaSwlcmN4LDEpCisKKwljbXBxCSQwLCVyY3gKKwlqbmUJLkxzcXI0eF8xc3QKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEzCisJbGVhcQkxNiglcmJwKSwlcmJwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKworCW1vdnEJJXIxMywoJXJkaSkKKwltb3ZxCSVyZHgsJXIxMgorCW1vdnEJJXJkeCw4KCVyZGkpCisJam1wCS5Mc3FyNHhfb3V0ZXIKKworLmFsaWduCTMyCisuTHNxcjR4X291dGVyOgorCW1vdnEJLTMyKCVyc2ksJXJicCwxKSwlcjE0CisJbGVhcQk0OCs4KCVyc3AsJXI5LDIpLCVyZGkKKwltb3ZxCS0yNCglcnNpLCVyYnAsMSksJXJheAorCWxlYXEJLTMyKCVyZGksJXJicCwxKSwlcmRpCisJbW92cQktMTYoJXJzaSwlcmJwLDEpLCVyYngKKwltb3ZxCSVyYXgsJXIxNQorCisJbXVscQklcjE0CisJbW92cQktMjQoJXJkaSwlcmJwLDEpLCVyMTAKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJieCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEwLC0yNCglcmRpLCVyYnAsMSkKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYngsJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJLTE2KCVyZGksJXJicCwxKSwlcjExCisJbW92cQklcmR4LCVyMTAKKwlhZGNxCSQwLCVyMTAKKwltb3ZxCSVyMTEsLTE2KCVyZGksJXJicCwxKQorCisJeG9ycQklcjEyLCVyMTIKKworCW1vdnEJLTgoJXJzaSwlcmJwLDEpLCVyYngKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXJieCwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQktOCglcmRpLCVyYnAsMSksJXIxMgorCW1vdnEJJXJkeCwlcjEzCisJYWRjcQkkMCwlcjEzCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJieCwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEyLCVyMTAKKwltb3ZxCSVyZHgsJXIxMQorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXIxMCwtOCglcmRpLCVyYnAsMSkKKworCWxlYXEJKCVyYnApLCVyY3gKKwlqbXAJLkxzcXI0eF9pbm5lcgorCisuYWxpZ24JMzIKKy5Mc3FyNHhfaW5uZXI6CisJbW92cQkoJXJzaSwlcmN4LDEpLCVyYngKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJJXJieCwlcmF4CisJbW92cQklcmR4LCVyMTIKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSglcmRpLCVyY3gsMSksJXIxMworCWFkY3EJJDAsJXIxMgorCisuYnl0ZQkweDY3CisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJOCglcnNpLCVyY3gsMSksJXJieAorCW1vdnEJJXJkeCwlcjEwCisJYWRjcQkkMCwlcjEwCisJYWRkcQklcjEzLCVyMTEKKwlhZGNxCSQwLCVyMTAKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcjExLCglcmRpLCVyY3gsMSkKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXJkeCwlcjEzCisJYWRjcQkkMCwlcjEzCisJYWRkcQk4KCVyZGksJXJjeCwxKSwlcjEyCisJbGVhcQkxNiglcmN4KSwlcmN4CisJYWRjcQkkMCwlcjEzCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJieCwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEyLCVyMTAKKwltb3ZxCSVyZHgsJXIxMQorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXIxMCwtOCglcmRpLCVyY3gsMSkKKworCWNtcHEJJDAsJXJjeAorCWpuZQkuTHNxcjR4X2lubmVyCisKKy5ieXRlCTB4NjcKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEzCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyMTMsKCVyZGkpCisJbW92cQklcmR4LCVyMTIKKwltb3ZxCSVyZHgsOCglcmRpKQorCisJYWRkcQkkMTYsJXJicAorCWpuegkuTHNxcjR4X291dGVyCisKKworCW1vdnEJLTMyKCVyc2kpLCVyMTQKKwlsZWFxCTQ4KzgoJXJzcCwlcjksMiksJXJkaQorCW1vdnEJLTI0KCVyc2kpLCVyYXgKKwlsZWFxCS0zMiglcmRpLCVyYnAsMSksJXJkaQorCW1vdnEJLTE2KCVyc2kpLCVyYngKKwltb3ZxCSVyYXgsJXIxNQorCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJieCwlcmF4CisJbW92cQklcjEwLC0yNCglcmRpKQorCW1vdnEJJXJkeCwlcjEwCisJYWRjcQkkMCwlcjEwCisJYWRkcQklcjEzLCVyMTEKKwltb3ZxCS04KCVyc2kpLCVyYngKKwlhZGNxCSQwLCVyMTAKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyMTEsLTE2KCVyZGkpCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyZHgsJXIxMQorCWFkY3EJJDAsJXIxMQorCWFkZHEJJXIxMiwlcjEwCisJYWRjcQkkMCwlcjExCisJbW92cQklcjEwLC04KCVyZGkpCisKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJLTE2KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCWFkY3EJJDAsJXJkeAorCisJbW92cQklcjEzLCglcmRpKQorCW1vdnEJJXJkeCwlcjEyCisJbW92cQklcmR4LDgoJXJkaSkKKworCW11bHEJJXJieAorCWFkZHEJJDE2LCVyYnAKKwl4b3JxCSVyMTQsJXIxNAorCXN1YnEJJXI5LCVyYnAKKwl4b3JxCSVyMTUsJXIxNQorCisJYWRkcQklcjEyLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyYXgsOCglcmRpKQorCW1vdnEJJXJkeCwxNiglcmRpKQorCW1vdnEJJXIxNSwyNCglcmRpKQorCisJbW92cQktMTYoJXJzaSwlcmJwLDEpLCVyYXgKKwlsZWFxCTQ4KzgoJXJzcCksJXJkaQorCXhvcnEJJXIxMCwlcjEwCisJbW92cQk4KCVyZGkpLCVyMTEKKworCWxlYXEJKCVyMTQsJXIxMCwyKSwlcjEyCisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjEzCisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyMTMKKwltb3ZxCTE2KCVyZGkpLCVyMTAKKwltb3ZxCSVyMTEsJXIxNAorCW11bHEJJXJheAorCW5lZ3EJJXIxNQorCW1vdnEJMjQoJXJkaSksJXIxMQorCWFkY3EJJXJheCwlcjEyCisJbW92cQktOCglcnNpLCVyYnAsMSksJXJheAorCW1vdnEJJXIxMiwoJXJkaSkKKwlhZGNxCSVyZHgsJXIxMworCisJbGVhcQkoJXIxNCwlcjEwLDIpLCVyYngKKwltb3ZxCSVyMTMsOCglcmRpKQorCXNiYnEJJXIxNSwlcjE1CisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjgKKwlzaHJxCSQ2MywlcjExCisJb3JxCSVyMTAsJXI4CisJbW92cQkzMiglcmRpKSwlcjEwCisJbW92cQklcjExLCVyMTQKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwltb3ZxCTQwKCVyZGkpLCVyMTEKKwlhZGNxCSVyYXgsJXJieAorCW1vdnEJMCglcnNpLCVyYnAsMSksJXJheAorCW1vdnEJJXJieCwxNiglcmRpKQorCWFkY3EJJXJkeCwlcjgKKwlsZWFxCTE2KCVyYnApLCVyYnAKKwltb3ZxCSVyOCwyNCglcmRpKQorCXNiYnEJJXIxNSwlcjE1CisJbGVhcQk2NCglcmRpKSwlcmRpCisJam1wCS5Mc3FyNHhfc2hpZnRfbl9hZGQKKworLmFsaWduCTMyCisuTHNxcjR4X3NoaWZ0X25fYWRkOgorCWxlYXEJKCVyMTQsJXIxMCwyKSwlcjEyCisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjEzCisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyMTMKKwltb3ZxCS0xNiglcmRpKSwlcjEwCisJbW92cQklcjExLCVyMTQKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwltb3ZxCS04KCVyZGkpLCVyMTEKKwlhZGNxCSVyYXgsJXIxMgorCW1vdnEJLTgoJXJzaSwlcmJwLDEpLCVyYXgKKwltb3ZxCSVyMTIsLTMyKCVyZGkpCisJYWRjcQklcmR4LCVyMTMKKworCWxlYXEJKCVyMTQsJXIxMCwyKSwlcmJ4CisJbW92cQklcjEzLC0yNCglcmRpKQorCXNiYnEJJXIxNSwlcjE1CisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjgKKwlzaHJxCSQ2MywlcjExCisJb3JxCSVyMTAsJXI4CisJbW92cQkwKCVyZGkpLCVyMTAKKwltb3ZxCSVyMTEsJXIxNAorCW11bHEJJXJheAorCW5lZ3EJJXIxNQorCW1vdnEJOCglcmRpKSwlcjExCisJYWRjcQklcmF4LCVyYngKKwltb3ZxCTAoJXJzaSwlcmJwLDEpLCVyYXgKKwltb3ZxCSVyYngsLTE2KCVyZGkpCisJYWRjcQklcmR4LCVyOAorCisJbGVhcQkoJXIxNCwlcjEwLDIpLCVyMTIKKwltb3ZxCSVyOCwtOCglcmRpKQorCXNiYnEJJXIxNSwlcjE1CisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjEzCisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyMTMKKwltb3ZxCTE2KCVyZGkpLCVyMTAKKwltb3ZxCSVyMTEsJXIxNAorCW11bHEJJXJheAorCW5lZ3EJJXIxNQorCW1vdnEJMjQoJXJkaSksJXIxMQorCWFkY3EJJXJheCwlcjEyCisJbW92cQk4KCVyc2ksJXJicCwxKSwlcmF4CisJbW92cQklcjEyLDAoJXJkaSkKKwlhZGNxCSVyZHgsJXIxMworCisJbGVhcQkoJXIxNCwlcjEwLDIpLCVyYngKKwltb3ZxCSVyMTMsOCglcmRpKQorCXNiYnEJJXIxNSwlcjE1CisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjgKKwlzaHJxCSQ2MywlcjExCisJb3JxCSVyMTAsJXI4CisJbW92cQkzMiglcmRpKSwlcjEwCisJbW92cQklcjExLCVyMTQKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwltb3ZxCTQwKCVyZGkpLCVyMTEKKwlhZGNxCSVyYXgsJXJieAorCW1vdnEJMTYoJXJzaSwlcmJwLDEpLCVyYXgKKwltb3ZxCSVyYngsMTYoJXJkaSkKKwlhZGNxCSVyZHgsJXI4CisJbW92cQklcjgsMjQoJXJkaSkKKwlzYmJxCSVyMTUsJXIxNQorCWxlYXEJNjQoJXJkaSksJXJkaQorCWFkZHEJJDMyLCVyYnAKKwlqbnoJLkxzcXI0eF9zaGlmdF9uX2FkZAorCisJbGVhcQkoJXIxNCwlcjEwLDIpLCVyMTIKKy5ieXRlCTB4NjcKKwlzaHJxCSQ2MywlcjEwCisJbGVhcQkoJXJjeCwlcjExLDIpLCVyMTMKKwlzaHJxCSQ2MywlcjExCisJb3JxCSVyMTAsJXIxMworCW1vdnEJLTE2KCVyZGkpLCVyMTAKKwltb3ZxCSVyMTEsJXIxNAorCW11bHEJJXJheAorCW5lZ3EJJXIxNQorCW1vdnEJLTgoJXJkaSksJXIxMQorCWFkY3EJJXJheCwlcjEyCisJbW92cQktOCglcnNpKSwlcmF4CisJbW92cQklcjEyLC0zMiglcmRpKQorCWFkY3EJJXJkeCwlcjEzCisKKwlsZWFxCSglcjE0LCVyMTAsMiksJXJieAorCW1vdnEJJXIxMywtMjQoJXJkaSkKKwlzYmJxCSVyMTUsJXIxNQorCXNocnEJJDYzLCVyMTAKKwlsZWFxCSglcmN4LCVyMTEsMiksJXI4CisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyOAorCW11bHEJJXJheAorCW5lZ3EJJXIxNQorCWFkY3EJJXJheCwlcmJ4CisJYWRjcQklcmR4LCVyOAorCW1vdnEJJXJieCwtMTYoJXJkaSkKKwltb3ZxCSVyOCwtOCglcmRpKQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTMKK19fYm5fc3FyOHhfcmVkdWN0aW9uOgorCXhvcnEJJXJheCwlcmF4CisJbGVhcQkoJXI5LCVyYnAsMSksJXJjeAorCWxlYXEJNDgrOCglcnNwLCVyOSwyKSwlcmR4CisJbW92cQklcmN4LDArOCglcnNwKQorCWxlYXEJNDgrOCglcnNwLCVyOSwxKSwlcmRpCisJbW92cQklcmR4LDgrOCglcnNwKQorCW5lZ3EJJXI5CisJam1wCS5MOHhfcmVkdWN0aW9uX2xvb3AKKworLmFsaWduCTMyCisuTDh4X3JlZHVjdGlvbl9sb29wOgorCWxlYXEJKCVyZGksJXI5LDEpLCVyZGkKKy5ieXRlCTB4NjYKKwltb3ZxCTAoJXJkaSksJXJieAorCW1vdnEJOCglcmRpKSwlcjkKKwltb3ZxCTE2KCVyZGkpLCVyMTAKKwltb3ZxCTI0KCVyZGkpLCVyMTEKKwltb3ZxCTMyKCVyZGkpLCVyMTIKKwltb3ZxCTQwKCVyZGkpLCVyMTMKKwltb3ZxCTQ4KCVyZGkpLCVyMTQKKwltb3ZxCTU2KCVyZGkpLCVyMTUKKwltb3ZxCSVyYXgsKCVyZHgpCisJbGVhcQk2NCglcmRpKSwlcmRpCisKKy5ieXRlCTB4NjcKKwltb3ZxCSVyYngsJXI4CisJaW11bHEJMzIrOCglcnNwKSwlcmJ4CisJbW92cQkwKCVyYnApLCVyYXgKKwltb3ZsCSQ4LCVlY3gKKwlqbXAJLkw4eF9yZWR1Y2UKKworLmFsaWduCTMyCisuTDh4X3JlZHVjZToKKwltdWxxCSVyYngKKwltb3ZxCTgoJXJicCksJXJheAorCW5lZ3EJJXI4CisJbW92cQklcmR4LCVyOAorCWFkY3EJJDAsJXI4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXI5CisJbW92cQkxNiglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjksJXI4CisJbW92cQklcmJ4LDQ4LTgrOCglcnNwLCVyY3gsOCkKKwltb3ZxCSVyZHgsJXI5CisJYWRjcQkkMCwlcjkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQkyNCglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyOQorCW1vdnEJMzIrOCglcnNwKSwlcnNpCisJbW92cQklcmR4LCVyMTAKKwlhZGNxCSQwLCVyMTAKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQkzMiglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXI4LCVyc2kKKwlhZGRxCSVyMTEsJXIxMAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJNDAoJXJicCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMiwlcjExCisJbW92cQklcmR4LCVyMTIKKwlhZGNxCSQwLCVyMTIKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEzCisJbW92cQk0OCglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEzLCVyMTIKKwltb3ZxCSVyZHgsJXIxMworCWFkY3EJJDAsJXIxMworCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTQKKwltb3ZxCTU2KCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTQsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJYWRjcQkkMCwlcjE0CisKKwltdWxxCSVyYngKKwltb3ZxCSVyc2ksJXJieAorCWFkZHEJJXJheCwlcjE1CisJbW92cQkwKCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTUsJXIxNAorCW1vdnEJJXJkeCwlcjE1CisJYWRjcQkkMCwlcjE1CisKKwlkZWNsCSVlY3gKKwlqbnoJLkw4eF9yZWR1Y2UKKworCWxlYXEJNjQoJXJicCksJXJicAorCXhvcnEJJXJheCwlcmF4CisJbW92cQk4KzgoJXJzcCksJXJkeAorCWNtcHEJMCs4KCVyc3ApLCVyYnAKKwlqYWUJLkw4eF9ub190YWlsCisKKy5ieXRlCTB4NjYKKwlhZGRxCTAoJXJkaSksJXI4CisJYWRjcQk4KCVyZGkpLCVyOQorCWFkY3EJMTYoJXJkaSksJXIxMAorCWFkY3EJMjQoJXJkaSksJXIxMQorCWFkY3EJMzIoJXJkaSksJXIxMgorCWFkY3EJNDAoJXJkaSksJXIxMworCWFkY3EJNDgoJXJkaSksJXIxNAorCWFkY3EJNTYoJXJkaSksJXIxNQorCXNiYnEJJXJzaSwlcnNpCisKKwltb3ZxCTQ4KzU2KzgoJXJzcCksJXJieAorCW1vdmwJJDgsJWVjeAorCW1vdnEJMCglcmJwKSwlcmF4CisJam1wCS5MOHhfdGFpbAorCisuYWxpZ24JMzIKKy5MOHhfdGFpbDoKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXI4CisJbW92cQk4KCVyYnApLCVyYXgKKwltb3ZxCSVyOCwoJXJkaSkKKwltb3ZxCSVyZHgsJXI4CisJYWRjcQkkMCwlcjgKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjkKKwltb3ZxCTE2KCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyOSwlcjgKKwlsZWFxCTgoJXJkaSksJXJkaQorCW1vdnEJJXJkeCwlcjkKKwlhZGNxCSQwLCVyOQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTI0KCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXI5CisJbW92cQklcmR4LCVyMTAKKwlhZGNxCSQwLCVyMTAKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQkzMiglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyMTAKKwltb3ZxCSVyZHgsJXIxMQorCWFkY3EJJDAsJXIxMQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCTQwKCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTIsJXIxMQorCW1vdnEJJXJkeCwlcjEyCisJYWRjcQkkMCwlcjEyCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJNDgoJXJicCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMywlcjEyCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjE0CisJbW92cQk1NiglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjE0LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCWFkY3EJJDAsJXIxNAorCisJbXVscQklcmJ4CisJbW92cQk0OC0xNis4KCVyc3AsJXJjeCw4KSwlcmJ4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTUsJXIxNAorCW1vdnEJMCglcmJwKSwlcmF4CisJbW92cQklcmR4LCVyMTUKKwlhZGNxCSQwLCVyMTUKKworCWRlY2wJJWVjeAorCWpuegkuTDh4X3RhaWwKKworCWxlYXEJNjQoJXJicCksJXJicAorCW1vdnEJOCs4KCVyc3ApLCVyZHgKKwljbXBxCTArOCglcnNwKSwlcmJwCisJamFlCS5MOHhfdGFpbF9kb25lCisKKwltb3ZxCTQ4KzU2KzgoJXJzcCksJXJieAorCW5lZ3EJJXJzaQorCW1vdnEJMCglcmJwKSwlcmF4CisJYWRjcQkwKCVyZGkpLCVyOAorCWFkY3EJOCglcmRpKSwlcjkKKwlhZGNxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTI0KCVyZGkpLCVyMTEKKwlhZGNxCTMyKCVyZGkpLCVyMTIKKwlhZGNxCTQwKCVyZGkpLCVyMTMKKwlhZGNxCTQ4KCVyZGkpLCVyMTQKKwlhZGNxCTU2KCVyZGkpLCVyMTUKKwlzYmJxCSVyc2ksJXJzaQorCisJbW92bAkkOCwlZWN4CisJam1wCS5MOHhfdGFpbAorCisuYWxpZ24JMzIKKy5MOHhfdGFpbF9kb25lOgorCXhvcnEJJXJheCwlcmF4CisJYWRkcQkoJXJkeCksJXI4CisJYWRjcQkkMCwlcjkKKwlhZGNxCSQwLCVyMTAKKwlhZGNxCSQwLCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGNxCSQwLCVyMTMKKwlhZGNxCSQwLCVyMTQKKwlhZGNxCSQwLCVyMTUKKwlhZGNxCSQwLCVyYXgKKworCW5lZ3EJJXJzaQorLkw4eF9ub190YWlsOgorCWFkY3EJMCglcmRpKSwlcjgKKwlhZGNxCTgoJXJkaSksJXI5CisJYWRjcQkxNiglcmRpKSwlcjEwCisJYWRjcQkyNCglcmRpKSwlcjExCisJYWRjcQkzMiglcmRpKSwlcjEyCisJYWRjcQk0MCglcmRpKSwlcjEzCisJYWRjcQk0OCglcmRpKSwlcjE0CisJYWRjcQk1NiglcmRpKSwlcjE1CisJYWRjcQkkMCwlcmF4CisJbW92cQktOCglcmJwKSwlcmN4CisJeG9ycQklcnNpLCVyc2kKKworLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTMKKworCW1vdnEJJXI4LDAoJXJkaSkKKwltb3ZxCSVyOSw4KCVyZGkpCisuYnl0ZQkxMDIsNzMsMTUsMTI2LDIxNworCW1vdnEJJXIxMCwxNiglcmRpKQorCW1vdnEJJXIxMSwyNCglcmRpKQorCW1vdnEJJXIxMiwzMiglcmRpKQorCW1vdnEJJXIxMyw0MCglcmRpKQorCW1vdnEJJXIxNCw0OCglcmRpKQorCW1vdnEJJXIxNSw1NiglcmRpKQorCWxlYXEJNjQoJXJkaSksJXJkaQorCisJY21wcQklcmR4LCVyZGkKKwlqYgkuTDh4X3JlZHVjdGlvbl9sb29wCisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlibl9zcXI4eF9pbnRlcm5hbCwuLWJuX3Nxcjh4X2ludGVybmFsCisudHlwZQlfX2JuX3Bvc3Q0eF9pbnRlcm5hbCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorX19ibl9wb3N0NHhfaW50ZXJuYWw6CisJbW92cQkwKCVyYnApLCVyMTIKKwlsZWFxCSglcmRpLCVyOSwxKSwlcmJ4CisJbW92cQklcjksJXJjeAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDcKKwluZWdxCSVyYXgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA2CisJc2FycQkkMysyLCVyY3gKKwlkZWNxCSVyMTIKKwl4b3JxCSVyMTAsJXIxMAorCW1vdnEJOCglcmJwKSwlcjEzCisJbW92cQkxNiglcmJwKSwlcjE0CisJbW92cQkyNCglcmJwKSwlcjE1CisJam1wCS5Mc3FyNHhfc3ViX2VudHJ5CisKKy5hbGlnbgkxNgorLkxzcXI0eF9zdWI6CisJbW92cQkwKCVyYnApLCVyMTIKKwltb3ZxCTgoJXJicCksJXIxMworCW1vdnEJMTYoJXJicCksJXIxNAorCW1vdnEJMjQoJXJicCksJXIxNQorLkxzcXI0eF9zdWJfZW50cnk6CisJbGVhcQkzMiglcmJwKSwlcmJwCisJbm90cQklcjEyCisJbm90cQklcjEzCisJbm90cQklcjE0CisJbm90cQklcjE1CisJYW5kcQklcmF4LCVyMTIKKwlhbmRxCSVyYXgsJXIxMworCWFuZHEJJXJheCwlcjE0CisJYW5kcQklcmF4LCVyMTUKKworCW5lZ3EJJXIxMAorCWFkY3EJMCglcmJ4KSwlcjEyCisJYWRjcQk4KCVyYngpLCVyMTMKKwlhZGNxCTE2KCVyYngpLCVyMTQKKwlhZGNxCTI0KCVyYngpLCVyMTUKKwltb3ZxCSVyMTIsMCglcmRpKQorCWxlYXEJMzIoJXJieCksJXJieAorCW1vdnEJJXIxMyw4KCVyZGkpCisJc2JicQklcjEwLCVyMTAKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKworCWluY3EJJXJjeAorCWpuegkuTHNxcjR4X3N1YgorCisJbW92cQklcjksJXIxMAorCW5lZ3EJJXI5CisJLmJ5dGUJMHhmMywweGMzCisuc2l6ZQlfX2JuX3Bvc3Q0eF9pbnRlcm5hbCwuLV9fYm5fcG9zdDR4X2ludGVybmFsCisuZ2xvYmwJYm5fZnJvbV9tb250Z29tZXJ5CisuaGlkZGVuIGJuX2Zyb21fbW9udGdvbWVyeQorLnR5cGUJYm5fZnJvbV9tb250Z29tZXJ5LEBmdW5jdGlvbgorLmFsaWduCTMyCitibl9mcm9tX21vbnRnb21lcnk6CisJdGVzdGwJJDcsJXI5ZAorCWp6CWJuX2Zyb21fbW9udDh4CisJeG9ybAklZWF4LCVlYXgKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCWJuX2Zyb21fbW9udGdvbWVyeSwuLWJuX2Zyb21fbW9udGdvbWVyeQorCisudHlwZQlibl9mcm9tX21vbnQ4eCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYm5fZnJvbV9tb250OHg6CisuY2ZpX3N0YXJ0cHJvYwkKKy5ieXRlCTB4NjcKKwltb3ZxCSVyc3AsJXJheAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyYXgKKwlwdXNocQklcmJ4CisuY2ZpX29mZnNldAklcmJ4LC0xNgorCXB1c2hxCSVyYnAKKy5jZmlfb2Zmc2V0CSVyYnAsLTI0CisJcHVzaHEJJXIxMgorLmNmaV9vZmZzZXQJJXIxMiwtMzIKKwlwdXNocQklcjEzCisuY2ZpX29mZnNldAklcjEzLC00MAorCXB1c2hxCSVyMTQKKy5jZmlfb2Zmc2V0CSVyMTQsLTQ4CisJcHVzaHEJJXIxNQorLmNmaV9vZmZzZXQJJXIxNSwtNTYKKy5MZnJvbV9wcm9sb2d1ZToKKworCXNobGwJJDMsJXI5ZAorCWxlYXEJKCVyOSwlcjksMiksJXIxMAorCW5lZ3EJJXI5CisJbW92cQkoJXI4KSwlcjgKKworCisKKworCisKKworCisJbGVhcQktMzIwKCVyc3AsJXI5LDIpLCVyMTEKKwltb3ZxCSVyc3AsJXJicAorCXN1YnEJJXJkaSwlcjExCisJYW5kcQkkNDA5NSwlcjExCisJY21wcQklcjExLCVyMTAKKwlqYgkuTGZyb21fc3BfYWx0CisJc3VicQklcjExLCVyYnAKKwlsZWFxCS0zMjAoJXJicCwlcjksMiksJXJicAorCWptcAkuTGZyb21fc3BfZG9uZQorCisuYWxpZ24JMzIKKy5MZnJvbV9zcF9hbHQ6CisJbGVhcQk0MDk2LTMyMCgsJXI5LDIpLCVyMTAKKwlsZWFxCS0zMjAoJXJicCwlcjksMiksJXJicAorCXN1YnEJJXIxMCwlcjExCisJbW92cQkkMCwlcjEwCisJY21vdmNxCSVyMTAsJXIxMQorCXN1YnEJJXIxMSwlcmJwCisuTGZyb21fc3BfZG9uZToKKwlhbmRxCSQtNjQsJXJicAorCW1vdnEJJXJzcCwlcjExCisJc3VicQklcmJwLCVyMTEKKwlhbmRxCSQtNDA5NiwlcjExCisJbGVhcQkoJXIxMSwlcmJwLDEpLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQkuTGZyb21fcGFnZV93YWxrCisJam1wCS5MZnJvbV9wYWdlX3dhbGtfZG9uZQorCisuTGZyb21fcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCS5MZnJvbV9wYWdlX3dhbGsKKy5MZnJvbV9wYWdlX3dhbGtfZG9uZToKKworCW1vdnEJJXI5LCVyMTAKKwluZWdxCSVyOQorCisKKworCisKKworCisKKworCisJbW92cQklcjgsMzIoJXJzcCkKKwltb3ZxCSVyYXgsNDAoJXJzcCkKKy5jZmlfZXNjYXBlCTB4MGYsMHgwNSwweDc3LDB4MjgsMHgwNiwweDIzLDB4MDgKKy5MZnJvbV9ib2R5OgorCW1vdnEJJXI5LCVyMTEKKwlsZWFxCTQ4KCVyc3ApLCVyYXgKKwlweG9yCSV4bW0wLCV4bW0wCisJam1wCS5MbXVsX2J5XzEKKworLmFsaWduCTMyCisuTG11bF9ieV8xOgorCW1vdmRxdQkoJXJzaSksJXhtbTEKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTIKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTMKKwltb3ZkcWEJJXhtbTAsKCVyYXgsJXI5LDEpCisJbW92ZHF1CTQ4KCVyc2kpLCV4bW00CisJbW92ZHFhCSV4bW0wLDE2KCVyYXgsJXI5LDEpCisuYnl0ZQkweDQ4LDB4OGQsMHhiNiwweDQwLDB4MDAsMHgwMCwweDAwCisJbW92ZHFhCSV4bW0xLCglcmF4KQorCW1vdmRxYQkleG1tMCwzMiglcmF4LCVyOSwxKQorCW1vdmRxYQkleG1tMiwxNiglcmF4KQorCW1vdmRxYQkleG1tMCw0OCglcmF4LCVyOSwxKQorCW1vdmRxYQkleG1tMywzMiglcmF4KQorCW1vdmRxYQkleG1tNCw0OCglcmF4KQorCWxlYXEJNjQoJXJheCksJXJheAorCXN1YnEJJDY0LCVyMTEKKwlqbnoJLkxtdWxfYnlfMQorCisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwNworLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDkKKy5ieXRlCTB4NjcKKwltb3ZxCSVyY3gsJXJicAorLmJ5dGUJMTAyLDczLDE1LDExMCwyMTgKKwlsZWFxCU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTEKKwltb3ZsCTgoJXIxMSksJXIxMWQKKwlhbmRsCSQweDgwMTA4LCVyMTFkCisJY21wbAkkMHg4MDEwOCwlcjExZAorCWpuZQkuTGZyb21fbW9udF9ub3gKKworCWxlYXEJKCVyYXgsJXI5LDEpLCVyZGkKKwljYWxsCV9fYm5fc3FyeDh4X3JlZHVjdGlvbgorCWNhbGwJX19ibl9wb3N0eDR4X2ludGVybmFsCisKKwlweG9yCSV4bW0wLCV4bW0wCisJbGVhcQk0OCglcnNwKSwlcmF4CisJam1wCS5MZnJvbV9tb250X3plcm8KKworLmFsaWduCTMyCisuTGZyb21fbW9udF9ub3g6CisJY2FsbAlfX2JuX3Nxcjh4X3JlZHVjdGlvbgorCWNhbGwJX19ibl9wb3N0NHhfaW50ZXJuYWwKKworCXB4b3IJJXhtbTAsJXhtbTAKKwlsZWFxCTQ4KCVyc3ApLCVyYXgKKwlqbXAJLkxmcm9tX21vbnRfemVybworCisuYWxpZ24JMzIKKy5MZnJvbV9tb250X3plcm86CisJbW92cQk0MCglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw4CisJbW92ZHFhCSV4bW0wLDAoJXJheCkKKwltb3ZkcWEJJXhtbTAsMTYoJXJheCkKKwltb3ZkcWEJJXhtbTAsMzIoJXJheCkKKwltb3ZkcWEJJXhtbTAsNDgoJXJheCkKKwlsZWFxCTY0KCVyYXgpLCVyYXgKKwlzdWJxCSQzMiwlcjkKKwlqbnoJLkxmcm9tX21vbnRfemVybworCisJbW92cQkkMSwlcmF4CisJbW92cQktNDgoJXJzaSksJXIxNQorLmNmaV9yZXN0b3JlCSVyMTUKKwltb3ZxCS00MCglcnNpKSwlcjE0CisuY2ZpX3Jlc3RvcmUJJXIxNAorCW1vdnEJLTMyKCVyc2kpLCVyMTMKKy5jZmlfcmVzdG9yZQklcjEzCisJbW92cQktMjQoJXJzaSksJXIxMgorLmNmaV9yZXN0b3JlCSVyMTIKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisuY2ZpX3Jlc3RvcmUJJXJicAorCW1vdnEJLTgoJXJzaSksJXJieAorLmNmaV9yZXN0b3JlCSVyYngKKwlsZWFxCSglcnNpKSwlcnNwCisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJzcAorLkxmcm9tX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworLmNmaV9lbmRwcm9jCQorLnNpemUJYm5fZnJvbV9tb250OHgsLi1ibl9mcm9tX21vbnQ4eAorLnR5cGUJYm5fbXVseDR4X21vbnRfZ2F0aGVyNSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYm5fbXVseDR4X21vbnRfZ2F0aGVyNToKKy5jZmlfc3RhcnRwcm9jCQorCW1vdnEJJXJzcCwlcmF4CisuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJJXJheAorLkxtdWx4NHhfZW50ZXI6CisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisuTG11bHg0eF9wcm9sb2d1ZToKKworCXNobGwJJDMsJXI5ZAorCWxlYXEJKCVyOSwlcjksMiksJXIxMAorCW5lZ3EJJXI5CisJbW92cQkoJXI4KSwlcjgKKworCisKKworCisKKworCisKKworCWxlYXEJLTMyMCglcnNwLCVyOSwyKSwlcjExCisJbW92cQklcnNwLCVyYnAKKwlzdWJxCSVyZGksJXIxMQorCWFuZHEJJDQwOTUsJXIxMQorCWNtcHEJJXIxMSwlcjEwCisJamIJLkxtdWx4NHhzcF9hbHQKKwlzdWJxCSVyMTEsJXJicAorCWxlYXEJLTMyMCglcmJwLCVyOSwyKSwlcmJwCisJam1wCS5MbXVseDR4c3BfZG9uZQorCisuTG11bHg0eHNwX2FsdDoKKwlsZWFxCTQwOTYtMzIwKCwlcjksMiksJXIxMAorCWxlYXEJLTMyMCglcmJwLCVyOSwyKSwlcmJwCisJc3VicQklcjEwLCVyMTEKKwltb3ZxCSQwLCVyMTAKKwljbW92Y3EJJXIxMCwlcjExCisJc3VicQklcjExLCVyYnAKKy5MbXVseDR4c3BfZG9uZToKKwlhbmRxCSQtNjQsJXJicAorCW1vdnEJJXJzcCwlcjExCisJc3VicQklcmJwLCVyMTEKKwlhbmRxCSQtNDA5NiwlcjExCisJbGVhcQkoJXIxMSwlcmJwLDEpLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQkuTG11bHg0eF9wYWdlX3dhbGsKKwlqbXAJLkxtdWx4NHhfcGFnZV93YWxrX2RvbmUKKworLkxtdWx4NHhfcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCS5MbXVseDR4X3BhZ2Vfd2FsaworLkxtdWx4NHhfcGFnZV93YWxrX2RvbmU6CisKKworCisKKworCisKKworCisKKworCisKKwltb3ZxCSVyOCwzMiglcnNwKQorCW1vdnEJJXJheCw0MCglcnNwKQorLmNmaV9lc2NhcGUJMHgwZiwweDA1LDB4NzcsMHgyOCwweDA2LDB4MjMsMHgwOAorLkxtdWx4NHhfYm9keToKKwljYWxsCW11bHg0eF9pbnRlcm5hbAorCisJbW92cQk0MCglcnNwKSwlcnNpCisuY2ZpX2RlZl9jZmEJJXJzaSw4CisJbW92cQkkMSwlcmF4CisKKwltb3ZxCS00OCglcnNpKSwlcjE1CisuY2ZpX3Jlc3RvcmUJJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKy5jZmlfcmVzdG9yZQklcjE0CisJbW92cQktMzIoJXJzaSksJXIxMworLmNmaV9yZXN0b3JlCSVyMTMKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisuY2ZpX3Jlc3RvcmUJJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKy5jZmlfcmVzdG9yZQklcmJwCisJbW92cQktOCglcnNpKSwlcmJ4CisuY2ZpX3Jlc3RvcmUJJXJieAorCWxlYXEJKCVyc2kpLCVyc3AKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcnNwCisuTG11bHg0eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWJuX211bHg0eF9tb250X2dhdGhlcjUsLi1ibl9tdWx4NHhfbW9udF9nYXRoZXI1CisKKy50eXBlCW11bHg0eF9pbnRlcm5hbCxAZnVuY3Rpb24KKy5hbGlnbgkzMgorbXVseDR4X2ludGVybmFsOgorCW1vdnEJJXI5LDgoJXJzcCkKKwltb3ZxCSVyOSwlcjEwCisJbmVncQklcjkKKwlzaGxxCSQ1LCVyOQorCW5lZ3EJJXIxMAorCWxlYXEJMTI4KCVyZHgsJXI5LDEpLCVyMTMKKwlzaHJxCSQ1KzUsJXI5CisJbW92ZAk4KCVyYXgpLCV4bW01CisJc3VicQkkMSwlcjkKKwlsZWFxCS5MaW5jKCVyaXApLCVyYXgKKwltb3ZxCSVyMTMsMTYrOCglcnNwKQorCW1vdnEJJXI5LDI0KzgoJXJzcCkKKwltb3ZxCSVyZGksNTYrOCglcnNwKQorCW1vdmRxYQkwKCVyYXgpLCV4bW0wCisJbW92ZHFhCTE2KCVyYXgpLCV4bW0xCisJbGVhcQk4OC0xMTIoJXJzcCwlcjEwLDEpLCVyMTAKKwlsZWFxCTEyOCglcmR4KSwlcmRpCisKKwlwc2h1ZmQJJDAsJXhtbTUsJXhtbTUKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKy5ieXRlCTB4NjcKKwltb3ZkcWEJJXhtbTEsJXhtbTIKKy5ieXRlCTB4NjcKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsMTEyKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMTI4KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMTQ0KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0yCisKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTMsMTYwKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDE3NiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDE5MiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDIwOCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMgorCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLDIyNCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwyNDAoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwyNTYoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwyNzIoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKworCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMywyODgoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKy5ieXRlCTB4NjcKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsMzA0KCVyMTApCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMzIwKCVyMTApCisKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDMzNiglcjEwKQorCisJcGFuZAk2NCglcmRpKSwleG1tMAorCXBhbmQJODAoJXJkaSksJXhtbTEKKwlwYW5kCTk2KCVyZGkpLCV4bW0yCisJbW92ZHFhCSV4bW0zLDM1MiglcjEwKQorCXBhbmQJMTEyKCVyZGkpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCS0xMjgoJXJkaSksJXhtbTQKKwltb3ZkcWEJLTExMiglcmRpKSwleG1tNQorCW1vdmRxYQktOTYoJXJkaSksJXhtbTIKKwlwYW5kCTExMiglcjEwKSwleG1tNAorCW1vdmRxYQktODAoJXJkaSksJXhtbTMKKwlwYW5kCTEyOCglcjEwKSwleG1tNQorCXBvcgkleG1tNCwleG1tMAorCXBhbmQJMTQ0KCVyMTApLCV4bW0yCisJcG9yCSV4bW01LCV4bW0xCisJcGFuZAkxNjAoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTAKKwlwb3IJJXhtbTMsJXhtbTEKKwltb3ZkcWEJLTY0KCVyZGkpLCV4bW00CisJbW92ZHFhCS00OCglcmRpKSwleG1tNQorCW1vdmRxYQktMzIoJXJkaSksJXhtbTIKKwlwYW5kCTE3NiglcjEwKSwleG1tNAorCW1vdmRxYQktMTYoJXJkaSksJXhtbTMKKwlwYW5kCTE5MiglcjEwKSwleG1tNQorCXBvcgkleG1tNCwleG1tMAorCXBhbmQJMjA4KCVyMTApLCV4bW0yCisJcG9yCSV4bW01LCV4bW0xCisJcGFuZAkyMjQoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTAKKwlwb3IJJXhtbTMsJXhtbTEKKwltb3ZkcWEJMCglcmRpKSwleG1tNAorCW1vdmRxYQkxNiglcmRpKSwleG1tNQorCW1vdmRxYQkzMiglcmRpKSwleG1tMgorCXBhbmQJMjQwKCVyMTApLCV4bW00CisJbW92ZHFhCTQ4KCVyZGkpLCV4bW0zCisJcGFuZAkyNTYoJXIxMCksJXhtbTUKKwlwb3IJJXhtbTQsJXhtbTAKKwlwYW5kCTI3MiglcjEwKSwleG1tMgorCXBvcgkleG1tNSwleG1tMQorCXBhbmQJMjg4KCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tMSwleG1tMAorCXBzaHVmZAkkMHg0ZSwleG1tMCwleG1tMQorCXBvcgkleG1tMSwleG1tMAorCWxlYXEJMjU2KCVyZGkpLCVyZGkKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk0CisJbGVhcQk2NCszMis4KCVyc3ApLCVyYngKKworCW1vdnEJJXJkeCwlcjkKKwltdWx4cQkwKCVyc2kpLCVyOCwlcmF4CisJbXVseHEJOCglcnNpKSwlcjExLCVyMTIKKwlhZGRxCSVyYXgsJXIxMQorCW11bHhxCTE2KCVyc2kpLCVyYXgsJXIxMworCWFkY3EJJXJheCwlcjEyCisJYWRjcQkkMCwlcjEzCisJbXVseHEJMjQoJXJzaSksJXJheCwlcjE0CisKKwltb3ZxCSVyOCwlcjE1CisJaW11bHEJMzIrOCglcnNwKSwlcjgKKwl4b3JxCSVyYnAsJXJicAorCW1vdnEJJXI4LCVyZHgKKworCW1vdnEJJXJkaSw4KzgoJXJzcCkKKworCWxlYXEJMzIoJXJzaSksJXJzaQorCWFkY3hxCSVyYXgsJXIxMworCWFkY3hxCSVyYnAsJXIxNAorCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTAKKwlhZGN4cQklcmF4LCVyMTUKKwlhZG94cQklcjExLCVyMTAKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxMQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTIsJXIxMQorCW11bHhxCTE2KCVyY3gpLCVyYXgsJXIxMgorCW1vdnEJMjQrOCglcnNwKSwlcmRpCisJbW92cQklcjEwLC0zMiglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTMsJXIxMgorCW11bHhxCTI0KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXI5LCVyZHgKKwltb3ZxCSVyMTEsLTI0KCVyYngpCisJYWRjeHEJJXJheCwlcjEyCisJYWRveHEJJXJicCwlcjE1CisJbGVhcQkzMiglcmN4KSwlcmN4CisJbW92cQklcjEyLC0xNiglcmJ4KQorCWptcAkuTG11bHg0eF8xc3QKKworLmFsaWduCTMyCisuTG11bHg0eF8xc3Q6CisJYWRjeHEJJXJicCwlcjE1CisJbXVseHEJMCglcnNpKSwlcjEwLCVyYXgKKwlhZGN4cQklcjE0LCVyMTAKKwltdWx4cQk4KCVyc2kpLCVyMTEsJXIxNAorCWFkY3hxCSVyYXgsJXIxMQorCW11bHhxCTE2KCVyc2kpLCVyMTIsJXJheAorCWFkY3hxCSVyMTQsJXIxMgorCW11bHhxCTI0KCVyc2kpLCVyMTMsJXIxNAorLmJ5dGUJMHg2NywweDY3CisJbW92cQklcjgsJXJkeAorCWFkY3hxCSVyYXgsJXIxMworCWFkY3hxCSVyYnAsJXIxNAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWxlYXEJMzIoJXJieCksJXJieAorCisJYWRveHEJJXIxNSwlcjEwCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTUKKwlhZGN4cQklcmF4LCVyMTAKKwlhZG94cQklcjE1LCVyMTEKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxNQorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTUsJXIxMgorCW11bHhxCTE2KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXIxMCwtNDAoJXJieCkKKwlhZGN4cQklcmF4LCVyMTIKKwltb3ZxCSVyMTEsLTMyKCVyYngpCisJYWRveHEJJXIxNSwlcjEzCisJbXVseHEJMjQoJXJjeCksJXJheCwlcjE1CisJbW92cQklcjksJXJkeAorCW1vdnEJJXIxMiwtMjQoJXJieCkKKwlhZGN4cQklcmF4LCVyMTMKKwlhZG94cQklcmJwLCVyMTUKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCSVyMTMsLTE2KCVyYngpCisKKwlkZWNxCSVyZGkKKwlqbnoJLkxtdWx4NHhfMXN0CisKKwltb3ZxCTgoJXJzcCksJXJheAorCWFkY3EJJXJicCwlcjE1CisJbGVhcQkoJXJzaSwlcmF4LDEpLCVyc2kKKwlhZGRxCSVyMTUsJXIxNAorCW1vdnEJOCs4KCVyc3ApLCVyZGkKKwlhZGNxCSVyYnAsJXJicAorCW1vdnEJJXIxNCwtOCglcmJ4KQorCWptcAkuTG11bHg0eF9vdXRlcgorCisuYWxpZ24JMzIKKy5MbXVseDR4X291dGVyOgorCWxlYXEJMTYtMjU2KCVyYngpLCVyMTAKKwlweG9yCSV4bW00LCV4bW00CisuYnl0ZQkweDY3LDB4NjcKKwlweG9yCSV4bW01LCV4bW01CisJbW92ZHFhCS0xMjgoJXJkaSksJXhtbTAKKwltb3ZkcWEJLTExMiglcmRpKSwleG1tMQorCW1vdmRxYQktOTYoJXJkaSksJXhtbTIKKwlwYW5kCTI1NiglcjEwKSwleG1tMAorCW1vdmRxYQktODAoJXJkaSksJXhtbTMKKwlwYW5kCTI3MiglcjEwKSwleG1tMQorCXBvcgkleG1tMCwleG1tNAorCXBhbmQJMjg4KCVyMTApLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkzMDQoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJLTY0KCVyZGkpLCV4bW0wCisJbW92ZHFhCS00OCglcmRpKSwleG1tMQorCW1vdmRxYQktMzIoJXJkaSksJXhtbTIKKwlwYW5kCTMyMCglcjEwKSwleG1tMAorCW1vdmRxYQktMTYoJXJkaSksJXhtbTMKKwlwYW5kCTMzNiglcjEwKSwleG1tMQorCXBvcgkleG1tMCwleG1tNAorCXBhbmQJMzUyKCVyMTApLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkzNjgoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJMCglcmRpKSwleG1tMAorCW1vdmRxYQkxNiglcmRpKSwleG1tMQorCW1vdmRxYQkzMiglcmRpKSwleG1tMgorCXBhbmQJMzg0KCVyMTApLCV4bW0wCisJbW92ZHFhCTQ4KCVyZGkpLCV4bW0zCisJcGFuZAk0MDAoJXIxMCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTQxNiglcjEwKSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDMyKCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTY0KCVyZGkpLCV4bW0wCisJbW92ZHFhCTgwKCVyZGkpLCV4bW0xCisJbW92ZHFhCTk2KCVyZGkpLCV4bW0yCisJcGFuZAk0NDgoJXIxMCksJXhtbTAKKwltb3ZkcWEJMTEyKCVyZGkpLCV4bW0zCisJcGFuZAk0NjQoJXIxMCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTQ4MCglcjEwKSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDk2KCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJcG9yCSV4bW01LCV4bW00CisJcHNodWZkCSQweDRlLCV4bW00LCV4bW0wCisJcG9yCSV4bW00LCV4bW0wCisJbGVhcQkyNTYoJXJkaSksJXJkaQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwxOTQKKworCW1vdnEJJXJicCwoJXJieCkKKwlsZWFxCTMyKCVyYngsJXJheCwxKSwlcmJ4CisJbXVseHEJMCglcnNpKSwlcjgsJXIxMQorCXhvcnEJJXJicCwlcmJwCisJbW92cQklcmR4LCVyOQorCW11bHhxCTgoJXJzaSksJXIxNCwlcjEyCisJYWRveHEJLTMyKCVyYngpLCVyOAorCWFkY3hxCSVyMTQsJXIxMQorCW11bHhxCTE2KCVyc2kpLCVyMTUsJXIxMworCWFkb3hxCS0yNCglcmJ4KSwlcjExCisJYWRjeHEJJXIxNSwlcjEyCisJbXVseHEJMjQoJXJzaSksJXJkeCwlcjE0CisJYWRveHEJLTE2KCVyYngpLCVyMTIKKwlhZGN4cQklcmR4LCVyMTMKKwlsZWFxCSglcmN4LCVyYXgsMSksJXJjeAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWFkb3hxCS04KCVyYngpLCVyMTMKKwlhZGN4cQklcmJwLCVyMTQKKwlhZG94cQklcmJwLCVyMTQKKworCW1vdnEJJXI4LCVyMTUKKwlpbXVscQkzMis4KCVyc3ApLCVyOAorCisJbW92cQklcjgsJXJkeAorCXhvcnEJJXJicCwlcmJwCisJbW92cQklcmRpLDgrOCglcnNwKQorCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTAKKwlhZGN4cQklcmF4LCVyMTUKKwlhZG94cQklcjExLCVyMTAKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxMQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTIsJXIxMQorCW11bHhxCTE2KCVyY3gpLCVyYXgsJXIxMgorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTMsJXIxMgorCW11bHhxCTI0KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXI5LCVyZHgKKwltb3ZxCTI0KzgoJXJzcCksJXJkaQorCW1vdnEJJXIxMCwtMzIoJXJieCkKKwlhZGN4cQklcmF4LCVyMTIKKwltb3ZxCSVyMTEsLTI0KCVyYngpCisJYWRveHEJJXJicCwlcjE1CisJbW92cQklcjEyLC0xNiglcmJ4KQorCWxlYXEJMzIoJXJjeCksJXJjeAorCWptcAkuTG11bHg0eF9pbm5lcgorCisuYWxpZ24JMzIKKy5MbXVseDR4X2lubmVyOgorCW11bHhxCTAoJXJzaSksJXIxMCwlcmF4CisJYWRjeHEJJXJicCwlcjE1CisJYWRveHEJJXIxNCwlcjEwCisJbXVseHEJOCglcnNpKSwlcjExLCVyMTQKKwlhZGN4cQkwKCVyYngpLCVyMTAKKwlhZG94cQklcmF4LCVyMTEKKwltdWx4cQkxNiglcnNpKSwlcjEyLCVyYXgKKwlhZGN4cQk4KCVyYngpLCVyMTEKKwlhZG94cQklcjE0LCVyMTIKKwltdWx4cQkyNCglcnNpKSwlcjEzLCVyMTQKKwltb3ZxCSVyOCwlcmR4CisJYWRjeHEJMTYoJXJieCksJXIxMgorCWFkb3hxCSVyYXgsJXIxMworCWFkY3hxCTI0KCVyYngpLCVyMTMKKwlhZG94cQklcmJwLCVyMTQKKwlsZWFxCTMyKCVyc2kpLCVyc2kKKwlsZWFxCTMyKCVyYngpLCVyYngKKwlhZGN4cQklcmJwLCVyMTQKKworCWFkb3hxCSVyMTUsJXIxMAorCW11bHhxCTAoJXJjeCksJXJheCwlcjE1CisJYWRjeHEJJXJheCwlcjEwCisJYWRveHEJJXIxNSwlcjExCisJbXVseHEJOCglcmN4KSwlcmF4LCVyMTUKKwlhZGN4cQklcmF4LCVyMTEKKwlhZG94cQklcjE1LCVyMTIKKwltdWx4cQkxNiglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyMTAsLTQwKCVyYngpCisJYWRjeHEJJXJheCwlcjEyCisJYWRveHEJJXIxNSwlcjEzCisJbW92cQklcjExLC0zMiglcmJ4KQorCW11bHhxCTI0KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXI5LCVyZHgKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCSVyMTIsLTI0KCVyYngpCisJYWRjeHEJJXJheCwlcjEzCisJYWRveHEJJXJicCwlcjE1CisJbW92cQklcjEzLC0xNiglcmJ4KQorCisJZGVjcQklcmRpCisJam56CS5MbXVseDR4X2lubmVyCisKKwltb3ZxCTArOCglcnNwKSwlcmF4CisJYWRjcQklcmJwLCVyMTUKKwlzdWJxCTAoJXJieCksJXJkaQorCW1vdnEJOCs4KCVyc3ApLCVyZGkKKwltb3ZxCTE2KzgoJXJzcCksJXIxMAorCWFkY3EJJXIxNSwlcjE0CisJbGVhcQkoJXJzaSwlcmF4LDEpLCVyc2kKKwlhZGNxCSVyYnAsJXJicAorCW1vdnEJJXIxNCwtOCglcmJ4KQorCisJY21wcQklcjEwLCVyZGkKKwlqYgkuTG11bHg0eF9vdXRlcgorCisJbW92cQktOCglcmN4KSwlcjEwCisJbW92cQklcmJwLCVyOAorCW1vdnEJKCVyY3gsJXJheCwxKSwlcjEyCisJbGVhcQkoJXJjeCwlcmF4LDEpLCVyYnAKKwltb3ZxCSVyYXgsJXJjeAorCWxlYXEJKCVyYngsJXJheCwxKSwlcmRpCisJeG9ybAklZWF4LCVlYXgKKwl4b3JxCSVyMTUsJXIxNQorCXN1YnEJJXIxNCwlcjEwCisJYWRjcQklcjE1LCVyMTUKKwlvcnEJJXIxNSwlcjgKKwlzYXJxCSQzKzIsJXJjeAorCXN1YnEJJXI4LCVyYXgKKwltb3ZxCTU2KzgoJXJzcCksJXJkeAorCWRlY3EJJXIxMgorCW1vdnEJOCglcmJwKSwlcjEzCisJeG9ycQklcjgsJXI4CisJbW92cQkxNiglcmJwKSwlcjE0CisJbW92cQkyNCglcmJwKSwlcjE1CisJam1wCS5Mc3FyeDR4X3N1Yl9lbnRyeQorLnNpemUJbXVseDR4X2ludGVybmFsLC4tbXVseDR4X2ludGVybmFsCisudHlwZQlibl9wb3dlcng1LEBmdW5jdGlvbgorLmFsaWduCTMyCitibl9wb3dlcng1OgorLmNmaV9zdGFydHByb2MJCisJbW92cQklcnNwLCVyYXgKKy5jZmlfZGVmX2NmYV9yZWdpc3RlcgklcmF4CisuTHBvd2VyeDVfZW50ZXI6CisJcHVzaHEJJXJieAorLmNmaV9vZmZzZXQJJXJieCwtMTYKKwlwdXNocQklcmJwCisuY2ZpX29mZnNldAklcmJwLC0yNAorCXB1c2hxCSVyMTIKKy5jZmlfb2Zmc2V0CSVyMTIsLTMyCisJcHVzaHEJJXIxMworLmNmaV9vZmZzZXQJJXIxMywtNDAKKwlwdXNocQklcjE0CisuY2ZpX29mZnNldAklcjE0LC00OAorCXB1c2hxCSVyMTUKKy5jZmlfb2Zmc2V0CSVyMTUsLTU2CisuTHBvd2VyeDVfcHJvbG9ndWU6CisKKwlzaGxsCSQzLCVyOWQKKwlsZWFxCSglcjksJXI5LDIpLCVyMTAKKwluZWdxCSVyOQorCW1vdnEJKCVyOCksJXI4CisKKworCisKKworCisKKworCWxlYXEJLTMyMCglcnNwLCVyOSwyKSwlcjExCisJbW92cQklcnNwLCVyYnAKKwlzdWJxCSVyZGksJXIxMQorCWFuZHEJJDQwOTUsJXIxMQorCWNtcHEJJXIxMSwlcjEwCisJamIJLkxwd3J4X3NwX2FsdAorCXN1YnEJJXIxMSwlcmJwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlqbXAJLkxwd3J4X3NwX2RvbmUKKworLmFsaWduCTMyCisuTHB3cnhfc3BfYWx0OgorCWxlYXEJNDA5Ni0zMjAoLCVyOSwyKSwlcjEwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlzdWJxCSVyMTAsJXIxMQorCW1vdnEJJDAsJXIxMAorCWNtb3ZjcQklcjEwLCVyMTEKKwlzdWJxCSVyMTEsJXJicAorLkxwd3J4X3NwX2RvbmU6CisJYW5kcQkkLTY0LCVyYnAKKwltb3ZxCSVyc3AsJXIxMQorCXN1YnEJJXJicCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTEsJXJicCwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMAorCWNtcHEJJXJicCwlcnNwCisJamEJLkxwd3J4X3BhZ2Vfd2FsaworCWptcAkuTHB3cnhfcGFnZV93YWxrX2RvbmUKKworLkxwd3J4X3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQkuTHB3cnhfcGFnZV93YWxrCisuTHB3cnhfcGFnZV93YWxrX2RvbmU6CisKKwltb3ZxCSVyOSwlcjEwCisJbmVncQklcjkKKworCisKKworCisKKworCisKKworCisKKwlweG9yCSV4bW0wLCV4bW0wCisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwNworLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDkKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjE4CisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIyNgorCW1vdnEJJXI4LDMyKCVyc3ApCisJbW92cQklcmF4LDQwKCVyc3ApCisuY2ZpX2VzY2FwZQkweDBmLDB4MDUsMHg3NywweDI4LDB4MDYsMHgyMywweDA4CisuTHBvd2VyeDVfYm9keToKKworCWNhbGwJX19ibl9zcXJ4OHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdHg0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXJ4OHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdHg0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXJ4OHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdHg0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXJ4OHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdHg0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXJ4OHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdHg0eF9pbnRlcm5hbAorCisJbW92cQklcjEwLCVyOQorCW1vdnEJJXJzaSwlcmRpCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwOQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMjYKKwltb3ZxCTQwKCVyc3ApLCVyYXgKKworCWNhbGwJbXVseDR4X2ludGVybmFsCisKKwltb3ZxCTQwKCVyc3ApLCVyc2kKKy5jZmlfZGVmX2NmYQklcnNpLDgKKwltb3ZxCSQxLCVyYXgKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKy5jZmlfcmVzdG9yZQklcjE1CisJbW92cQktNDAoJXJzaSksJXIxNAorLmNmaV9yZXN0b3JlCSVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisuY2ZpX3Jlc3RvcmUJJXIxMworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKy5jZmlfcmVzdG9yZQklcjEyCisJbW92cQktMTYoJXJzaSksJXJicAorLmNmaV9yZXN0b3JlCSVyYnAKKwltb3ZxCS04KCVyc2kpLCVyYngKKy5jZmlfcmVzdG9yZQklcmJ4CisJbGVhcQkoJXJzaSksJXJzcAorLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCSVyc3AKKy5McG93ZXJ4NV9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5jZmlfZW5kcHJvYwkKKy5zaXplCWJuX3Bvd2VyeDUsLi1ibl9wb3dlcng1CisKKy5nbG9ibAlibl9zcXJ4OHhfaW50ZXJuYWwKKy5oaWRkZW4gYm5fc3FyeDh4X2ludGVybmFsCisuaGlkZGVuCWJuX3Nxcng4eF9pbnRlcm5hbAorLnR5cGUJYm5fc3FyeDh4X2ludGVybmFsLEBmdW5jdGlvbgorLmFsaWduCTMyCitibl9zcXJ4OHhfaW50ZXJuYWw6CitfX2JuX3Nxcng4eF9pbnRlcm5hbDoKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCWxlYXEJNDgrOCglcnNwKSwlcmRpCisJbGVhcQkoJXJzaSwlcjksMSksJXJicAorCW1vdnEJJXI5LDArOCglcnNwKQorCW1vdnEJJXJicCw4KzgoJXJzcCkKKwlqbXAJLkxzcXI4eF96ZXJvX3N0YXJ0CisKKy5hbGlnbgkzMgorLmJ5dGUJMHg2NiwweDY2LDB4NjYsMHgyZSwweDBmLDB4MWYsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKy5Mc3FyeDh4X3plcm86CisuYnl0ZQkweDNlCisJbW92ZHFhCSV4bW0wLDAoJXJkaSkKKwltb3ZkcWEJJXhtbTAsMTYoJXJkaSkKKwltb3ZkcWEJJXhtbTAsMzIoJXJkaSkKKwltb3ZkcWEJJXhtbTAsNDgoJXJkaSkKKy5Mc3FyOHhfemVyb19zdGFydDoKKwltb3ZkcWEJJXhtbTAsNjQoJXJkaSkKKwltb3ZkcWEJJXhtbTAsODAoJXJkaSkKKwltb3ZkcWEJJXhtbTAsOTYoJXJkaSkKKwltb3ZkcWEJJXhtbTAsMTEyKCVyZGkpCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCXN1YnEJJDY0LCVyOQorCWpuegkuTHNxcng4eF96ZXJvCisKKwltb3ZxCTAoJXJzaSksJXJkeAorCisJeG9ycQklcjEwLCVyMTAKKwl4b3JxCSVyMTEsJXIxMQorCXhvcnEJJXIxMiwlcjEyCisJeG9ycQklcjEzLCVyMTMKKwl4b3JxCSVyMTQsJXIxNAorCXhvcnEJJXIxNSwlcjE1CisJbGVhcQk0OCs4KCVyc3ApLCVyZGkKKwl4b3JxCSVyYnAsJXJicAorCWptcAkuTHNxcng4eF9vdXRlcl9sb29wCisKKy5hbGlnbgkzMgorLkxzcXJ4OHhfb3V0ZXJfbG9vcDoKKwltdWx4cQk4KCVyc2kpLCVyOCwlcmF4CisJYWRjeHEJJXI5LCVyOAorCWFkb3hxCSVyYXgsJXIxMAorCW11bHhxCTE2KCVyc2kpLCVyOSwlcmF4CisJYWRjeHEJJXIxMCwlcjkKKwlhZG94cQklcmF4LCVyMTEKKy5ieXRlCTB4YzQsMHhlMiwweGFiLDB4ZjYsMHg4NiwweDE4LDB4MDAsMHgwMCwweDAwCisJYWRjeHEJJXIxMSwlcjEwCisJYWRveHEJJXJheCwlcjEyCisuYnl0ZQkweGM0LDB4ZTIsMHhhMywweGY2LDB4ODYsMHgyMCwweDAwLDB4MDAsMHgwMAorCWFkY3hxCSVyMTIsJXIxMQorCWFkb3hxCSVyYXgsJXIxMworCW11bHhxCTQwKCVyc2kpLCVyMTIsJXJheAorCWFkY3hxCSVyMTMsJXIxMgorCWFkb3hxCSVyYXgsJXIxNAorCW11bHhxCTQ4KCVyc2kpLCVyMTMsJXJheAorCWFkY3hxCSVyMTQsJXIxMworCWFkb3hxCSVyMTUsJXJheAorCW11bHhxCTU2KCVyc2kpLCVyMTQsJXIxNQorCW1vdnEJOCglcnNpKSwlcmR4CisJYWRjeHEJJXJheCwlcjE0CisJYWRveHEJJXJicCwlcjE1CisJYWRjcQk2NCglcmRpKSwlcjE1CisJbW92cQklcjgsOCglcmRpKQorCW1vdnEJJXI5LDE2KCVyZGkpCisJc2JicQklcmN4LCVyY3gKKwl4b3JxCSVyYnAsJXJicAorCisKKwltdWx4cQkxNiglcnNpKSwlcjgsJXJieAorCW11bHhxCTI0KCVyc2kpLCVyOSwlcmF4CisJYWRjeHEJJXIxMCwlcjgKKwlhZG94cQklcmJ4LCVyOQorCW11bHhxCTMyKCVyc2kpLCVyMTAsJXJieAorCWFkY3hxCSVyMTEsJXI5CisJYWRveHEJJXJheCwlcjEwCisuYnl0ZQkweGM0LDB4ZTIsMHhhMywweGY2LDB4ODYsMHgyOCwweDAwLDB4MDAsMHgwMAorCWFkY3hxCSVyMTIsJXIxMAorCWFkb3hxCSVyYngsJXIxMQorLmJ5dGUJMHhjNCwweGUyLDB4OWIsMHhmNiwweDllLDB4MzAsMHgwMCwweDAwLDB4MDAKKwlhZGN4cQklcjEzLCVyMTEKKwlhZG94cQklcjE0LCVyMTIKKy5ieXRlCTB4YzQsMHg2MiwweDkzLDB4ZjYsMHhiNiwweDM4LDB4MDAsMHgwMCwweDAwCisJbW92cQkxNiglcnNpKSwlcmR4CisJYWRjeHEJJXJheCwlcjEyCisJYWRveHEJJXJieCwlcjEzCisJYWRjeHEJJXIxNSwlcjEzCisJYWRveHEJJXJicCwlcjE0CisJYWRjeHEJJXJicCwlcjE0CisKKwltb3ZxCSVyOCwyNCglcmRpKQorCW1vdnEJJXI5LDMyKCVyZGkpCisKKwltdWx4cQkyNCglcnNpKSwlcjgsJXJieAorCW11bHhxCTMyKCVyc2kpLCVyOSwlcmF4CisJYWRjeHEJJXIxMCwlcjgKKwlhZG94cQklcmJ4LCVyOQorCW11bHhxCTQwKCVyc2kpLCVyMTAsJXJieAorCWFkY3hxCSVyMTEsJXI5CisJYWRveHEJJXJheCwlcjEwCisuYnl0ZQkweGM0LDB4ZTIsMHhhMywweGY2LDB4ODYsMHgzMCwweDAwLDB4MDAsMHgwMAorCWFkY3hxCSVyMTIsJXIxMAorCWFkb3hxCSVyMTMsJXIxMQorLmJ5dGUJMHhjNCwweDYyLDB4OWIsMHhmNiwweGFlLDB4MzgsMHgwMCwweDAwLDB4MDAKKy5ieXRlCTB4M2UKKwltb3ZxCTI0KCVyc2kpLCVyZHgKKwlhZGN4cQklcmJ4LCVyMTEKKwlhZG94cQklcmF4LCVyMTIKKwlhZGN4cQklcjE0LCVyMTIKKwltb3ZxCSVyOCw0MCglcmRpKQorCW1vdnEJJXI5LDQ4KCVyZGkpCisJbXVseHEJMzIoJXJzaSksJXI4LCVyYXgKKwlhZG94cQklcmJwLCVyMTMKKwlhZGN4cQklcmJwLCVyMTMKKworCW11bHhxCTQwKCVyc2kpLCVyOSwlcmJ4CisJYWRjeHEJJXIxMCwlcjgKKwlhZG94cQklcmF4LCVyOQorCW11bHhxCTQ4KCVyc2kpLCVyMTAsJXJheAorCWFkY3hxCSVyMTEsJXI5CisJYWRveHEJJXIxMiwlcjEwCisJbXVseHEJNTYoJXJzaSksJXIxMSwlcjEyCisJbW92cQkzMiglcnNpKSwlcmR4CisJbW92cQk0MCglcnNpKSwlcjE0CisJYWRjeHEJJXJieCwlcjEwCisJYWRveHEJJXJheCwlcjExCisJbW92cQk0OCglcnNpKSwlcjE1CisJYWRjeHEJJXIxMywlcjExCisJYWRveHEJJXJicCwlcjEyCisJYWRjeHEJJXJicCwlcjEyCisKKwltb3ZxCSVyOCw1NiglcmRpKQorCW1vdnEJJXI5LDY0KCVyZGkpCisKKwltdWx4cQklcjE0LCVyOSwlcmF4CisJbW92cQk1NiglcnNpKSwlcjgKKwlhZGN4cQklcjEwLCVyOQorCW11bHhxCSVyMTUsJXIxMCwlcmJ4CisJYWRveHEJJXJheCwlcjEwCisJYWRjeHEJJXIxMSwlcjEwCisJbXVseHEJJXI4LCVyMTEsJXJheAorCW1vdnEJJXIxNCwlcmR4CisJYWRveHEJJXJieCwlcjExCisJYWRjeHEJJXIxMiwlcjExCisKKwlhZGN4cQklcmJwLCVyYXgKKworCW11bHhxCSVyMTUsJXIxNCwlcmJ4CisJbXVseHEJJXI4LCVyMTIsJXIxMworCW1vdnEJJXIxNSwlcmR4CisJbGVhcQk2NCglcnNpKSwlcnNpCisJYWRjeHEJJXIxNCwlcjExCisJYWRveHEJJXJieCwlcjEyCisJYWRjeHEJJXJheCwlcjEyCisJYWRveHEJJXJicCwlcjEzCisKKy5ieXRlCTB4NjcsMHg2NworCW11bHhxCSVyOCwlcjgsJXIxNAorCWFkY3hxCSVyOCwlcjEzCisJYWRjeHEJJXJicCwlcjE0CisKKwljbXBxCTgrOCglcnNwKSwlcnNpCisJamUJLkxzcXJ4OHhfb3V0ZXJfYnJlYWsKKworCW5lZ3EJJXJjeAorCW1vdnEJJC04LCVyY3gKKwltb3ZxCSVyYnAsJXIxNQorCW1vdnEJNjQoJXJkaSksJXI4CisJYWRjeHEJNzIoJXJkaSksJXI5CisJYWRjeHEJODAoJXJkaSksJXIxMAorCWFkY3hxCTg4KCVyZGkpLCVyMTEKKwlhZGNxCTk2KCVyZGkpLCVyMTIKKwlhZGNxCTEwNCglcmRpKSwlcjEzCisJYWRjcQkxMTIoJXJkaSksJXIxNAorCWFkY3EJMTIwKCVyZGkpLCVyMTUKKwlsZWFxCSglcnNpKSwlcmJwCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCXNiYnEJJXJheCwlcmF4CisKKwltb3ZxCS02NCglcnNpKSwlcmR4CisJbW92cQklcmF4LDE2KzgoJXJzcCkKKwltb3ZxCSVyZGksMjQrOCglcnNwKQorCisKKwl4b3JsCSVlYXgsJWVheAorCWptcAkuTHNxcng4eF9sb29wCisKKy5hbGlnbgkzMgorLkxzcXJ4OHhfbG9vcDoKKwltb3ZxCSVyOCwlcmJ4CisJbXVseHEJMCglcmJwKSwlcmF4LCVyOAorCWFkY3hxCSVyYXgsJXJieAorCWFkb3hxCSVyOSwlcjgKKworCW11bHhxCTgoJXJicCksJXJheCwlcjkKKwlhZGN4cQklcmF4LCVyOAorCWFkb3hxCSVyMTAsJXI5CisKKwltdWx4cQkxNiglcmJwKSwlcmF4LCVyMTAKKwlhZGN4cQklcmF4LCVyOQorCWFkb3hxCSVyMTEsJXIxMAorCisJbXVseHEJMjQoJXJicCksJXJheCwlcjExCisJYWRjeHEJJXJheCwlcjEwCisJYWRveHEJJXIxMiwlcjExCisKKy5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhhNSwweDIwLDB4MDAsMHgwMCwweDAwCisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxMywlcjEyCisKKwltdWx4cQk0MCglcmJwKSwlcmF4LCVyMTMKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcjE0LCVyMTMKKworCW11bHhxCTQ4KCVyYnApLCVyYXgsJXIxNAorCW1vdnEJJXJieCwoJXJkaSwlcmN4LDgpCisJbW92bAkkMCwlZWJ4CisJYWRjeHEJJXJheCwlcjEzCisJYWRveHEJJXIxNSwlcjE0CisKKy5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhiZCwweDM4LDB4MDAsMHgwMCwweDAwCisJbW92cQk4KCVyc2ksJXJjeCw4KSwlcmR4CisJYWRjeHEJJXJheCwlcjE0CisJYWRveHEJJXJieCwlcjE1CisJYWRjeHEJJXJieCwlcjE1CisKKy5ieXRlCTB4NjcKKwlpbmNxCSVyY3gKKwlqbnoJLkxzcXJ4OHhfbG9vcAorCisJbGVhcQk2NCglcmJwKSwlcmJwCisJbW92cQkkLTgsJXJjeAorCWNtcHEJOCs4KCVyc3ApLCVyYnAKKwlqZQkuTHNxcng4eF9icmVhaworCisJc3VicQkxNis4KCVyc3ApLCVyYngKKy5ieXRlCTB4NjYKKwltb3ZxCS02NCglcnNpKSwlcmR4CisJYWRjeHEJMCglcmRpKSwlcjgKKwlhZGN4cQk4KCVyZGkpLCVyOQorCWFkY3EJMTYoJXJkaSksJXIxMAorCWFkY3EJMjQoJXJkaSksJXIxMQorCWFkY3EJMzIoJXJkaSksJXIxMgorCWFkY3EJNDAoJXJkaSksJXIxMworCWFkY3EJNDgoJXJkaSksJXIxNAorCWFkY3EJNTYoJXJkaSksJXIxNQorCWxlYXEJNjQoJXJkaSksJXJkaQorLmJ5dGUJMHg2NworCXNiYnEJJXJheCwlcmF4CisJeG9ybAklZWJ4LCVlYngKKwltb3ZxCSVyYXgsMTYrOCglcnNwKQorCWptcAkuTHNxcng4eF9sb29wCisKKy5hbGlnbgkzMgorLkxzcXJ4OHhfYnJlYWs6CisJeG9ycQklcmJwLCVyYnAKKwlzdWJxCTE2KzgoJXJzcCksJXJieAorCWFkY3hxCSVyYnAsJXI4CisJbW92cQkyNCs4KCVyc3ApLCVyY3gKKwlhZGN4cQklcmJwLCVyOQorCW1vdnEJMCglcnNpKSwlcmR4CisJYWRjcQkkMCwlcjEwCisJbW92cQklcjgsMCglcmRpKQorCWFkY3EJJDAsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkY3EJJDAsJXIxMworCWFkY3EJJDAsJXIxNAorCWFkY3EJJDAsJXIxNQorCWNtcHEJJXJjeCwlcmRpCisJamUJLkxzcXJ4OHhfb3V0ZXJfbG9vcAorCisJbW92cQklcjksOCglcmRpKQorCW1vdnEJOCglcmN4KSwlcjkKKwltb3ZxCSVyMTAsMTYoJXJkaSkKKwltb3ZxCTE2KCVyY3gpLCVyMTAKKwltb3ZxCSVyMTEsMjQoJXJkaSkKKwltb3ZxCTI0KCVyY3gpLCVyMTEKKwltb3ZxCSVyMTIsMzIoJXJkaSkKKwltb3ZxCTMyKCVyY3gpLCVyMTIKKwltb3ZxCSVyMTMsNDAoJXJkaSkKKwltb3ZxCTQwKCVyY3gpLCVyMTMKKwltb3ZxCSVyMTQsNDgoJXJkaSkKKwltb3ZxCTQ4KCVyY3gpLCVyMTQKKwltb3ZxCSVyMTUsNTYoJXJkaSkKKwltb3ZxCTU2KCVyY3gpLCVyMTUKKwltb3ZxCSVyY3gsJXJkaQorCWptcAkuTHNxcng4eF9vdXRlcl9sb29wCisKKy5hbGlnbgkzMgorLkxzcXJ4OHhfb3V0ZXJfYnJlYWs6CisJbW92cQklcjksNzIoJXJkaSkKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjE3CisJbW92cQklcjEwLDgwKCVyZGkpCisJbW92cQklcjExLDg4KCVyZGkpCisJbW92cQklcjEyLDk2KCVyZGkpCisJbW92cQklcjEzLDEwNCglcmRpKQorCW1vdnEJJXIxNCwxMTIoJXJkaSkKKwlsZWFxCTQ4KzgoJXJzcCksJXJkaQorCW1vdnEJKCVyc2ksJXJjeCwxKSwlcmR4CisKKwltb3ZxCTgoJXJkaSksJXIxMQorCXhvcnEJJXIxMCwlcjEwCisJbW92cQkwKzgoJXJzcCksJXI5CisJYWRveHEJJXIxMSwlcjExCisJbW92cQkxNiglcmRpKSwlcjEyCisJbW92cQkyNCglcmRpKSwlcjEzCisKKworLmFsaWduCTMyCisuTHNxcng0eF9zaGlmdF9uX2FkZDoKKwltdWx4cQklcmR4LCVyYXgsJXJieAorCWFkb3hxCSVyMTIsJXIxMgorCWFkY3hxCSVyMTAsJXJheAorLmJ5dGUJMHg0OCwweDhiLDB4OTQsMHgwZSwweDA4LDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweDRjLDB4OGIsMHg5NywweDIwLDB4MDAsMHgwMCwweDAwCisJYWRveHEJJXIxMywlcjEzCisJYWRjeHEJJXIxMSwlcmJ4CisJbW92cQk0MCglcmRpKSwlcjExCisJbW92cQklcmF4LDAoJXJkaSkKKwltb3ZxCSVyYngsOCglcmRpKQorCisJbXVseHEJJXJkeCwlcmF4LCVyYngKKwlhZG94cQklcjEwLCVyMTAKKwlhZGN4cQklcjEyLCVyYXgKKwltb3ZxCTE2KCVyc2ksJXJjeCwxKSwlcmR4CisJbW92cQk0OCglcmRpKSwlcjEyCisJYWRveHEJJXIxMSwlcjExCisJYWRjeHEJJXIxMywlcmJ4CisJbW92cQk1NiglcmRpKSwlcjEzCisJbW92cQklcmF4LDE2KCVyZGkpCisJbW92cQklcmJ4LDI0KCVyZGkpCisKKwltdWx4cQklcmR4LCVyYXgsJXJieAorCWFkb3hxCSVyMTIsJXIxMgorCWFkY3hxCSVyMTAsJXJheAorCW1vdnEJMjQoJXJzaSwlcmN4LDEpLCVyZHgKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCTY0KCVyZGkpLCVyMTAKKwlhZG94cQklcjEzLCVyMTMKKwlhZGN4cQklcjExLCVyYngKKwltb3ZxCTcyKCVyZGkpLCVyMTEKKwltb3ZxCSVyYXgsMzIoJXJkaSkKKwltb3ZxCSVyYngsNDAoJXJkaSkKKworCW11bHhxCSVyZHgsJXJheCwlcmJ4CisJYWRveHEJJXIxMCwlcjEwCisJYWRjeHEJJXIxMiwlcmF4CisJanJjeHoJLkxzcXJ4NHhfc2hpZnRfbl9hZGRfYnJlYWsKKy5ieXRlCTB4NDgsMHg4YiwweDk0LDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMAorCWFkb3hxCSVyMTEsJXIxMQorCWFkY3hxCSVyMTMsJXJieAorCW1vdnEJODAoJXJkaSksJXIxMgorCW1vdnEJODgoJXJkaSksJXIxMworCW1vdnEJJXJheCw0OCglcmRpKQorCW1vdnEJJXJieCw1NiglcmRpKQorCWxlYXEJNjQoJXJkaSksJXJkaQorCW5vcAorCWptcAkuTHNxcng0eF9zaGlmdF9uX2FkZAorCisuYWxpZ24JMzIKKy5Mc3FyeDR4X3NoaWZ0X25fYWRkX2JyZWFrOgorCWFkY3hxCSVyMTMsJXJieAorCW1vdnEJJXJheCw0OCglcmRpKQorCW1vdnEJJXJieCw1NiglcmRpKQorCWxlYXEJNjQoJXJkaSksJXJkaQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTMKK19fYm5fc3FyeDh4X3JlZHVjdGlvbjoKKwl4b3JsCSVlYXgsJWVheAorCW1vdnEJMzIrOCglcnNwKSwlcmJ4CisJbW92cQk0OCs4KCVyc3ApLCVyZHgKKwlsZWFxCS02NCglcmJwLCVyOSwxKSwlcmN4CisKKwltb3ZxCSVyY3gsMCs4KCVyc3ApCisJbW92cQklcmRpLDgrOCglcnNwKQorCisJbGVhcQk0OCs4KCVyc3ApLCVyZGkKKwlqbXAJLkxzcXJ4OHhfcmVkdWN0aW9uX2xvb3AKKworLmFsaWduCTMyCisuTHNxcng4eF9yZWR1Y3Rpb25fbG9vcDoKKwltb3ZxCTgoJXJkaSksJXI5CisJbW92cQkxNiglcmRpKSwlcjEwCisJbW92cQkyNCglcmRpKSwlcjExCisJbW92cQkzMiglcmRpKSwlcjEyCisJbW92cQklcmR4LCVyOAorCWltdWxxCSVyYngsJXJkeAorCW1vdnEJNDAoJXJkaSksJXIxMworCW1vdnEJNDgoJXJkaSksJXIxNAorCW1vdnEJNTYoJXJkaSksJXIxNQorCW1vdnEJJXJheCwyNCs4KCVyc3ApCisKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwl4b3JxCSVyc2ksJXJzaQorCW1vdnEJJC04LCVyY3gKKwlqbXAJLkxzcXJ4OHhfcmVkdWNlCisKKy5hbGlnbgkzMgorLkxzcXJ4OHhfcmVkdWNlOgorCW1vdnEJJXI4LCVyYngKKwltdWx4cQkwKCVyYnApLCVyYXgsJXI4CisJYWRjeHEJJXJieCwlcmF4CisJYWRveHEJJXI5LCVyOAorCisJbXVseHEJOCglcmJwKSwlcmJ4LCVyOQorCWFkY3hxCSVyYngsJXI4CisJYWRveHEJJXIxMCwlcjkKKworCW11bHhxCTE2KCVyYnApLCVyYngsJXIxMAorCWFkY3hxCSVyYngsJXI5CisJYWRveHEJJXIxMSwlcjEwCisKKwltdWx4cQkyNCglcmJwKSwlcmJ4LCVyMTEKKwlhZGN4cQklcmJ4LCVyMTAKKwlhZG94cQklcjEyLCVyMTEKKworLmJ5dGUJMHhjNCwweDYyLDB4ZTMsMHhmNiwweGE1LDB4MjAsMHgwMCwweDAwLDB4MDAKKwltb3ZxCSVyZHgsJXJheAorCW1vdnEJJXI4LCVyZHgKKwlhZGN4cQklcmJ4LCVyMTEKKwlhZG94cQklcjEzLCVyMTIKKworCW11bHhxCTMyKzgoJXJzcCksJXJieCwlcmR4CisJbW92cQklcmF4LCVyZHgKKwltb3ZxCSVyYXgsNjQrNDgrOCglcnNwLCVyY3gsOCkKKworCW11bHhxCTQwKCVyYnApLCVyYXgsJXIxMworCWFkY3hxCSVyYXgsJXIxMgorCWFkb3hxCSVyMTQsJXIxMworCisJbXVseHEJNDgoJXJicCksJXJheCwlcjE0CisJYWRjeHEJJXJheCwlcjEzCisJYWRveHEJJXIxNSwlcjE0CisKKwltdWx4cQk1NiglcmJwKSwlcmF4LCVyMTUKKwltb3ZxCSVyYngsJXJkeAorCWFkY3hxCSVyYXgsJXIxNAorCWFkb3hxCSVyc2ksJXIxNQorCWFkY3hxCSVyc2ksJXIxNQorCisuYnl0ZQkweDY3LDB4NjcsMHg2NworCWluY3EJJXJjeAorCWpuegkuTHNxcng4eF9yZWR1Y2UKKworCW1vdnEJJXJzaSwlcmF4CisJY21wcQkwKzgoJXJzcCksJXJicAorCWphZQkuTHNxcng4eF9ub190YWlsCisKKwltb3ZxCTQ4KzgoJXJzcCksJXJkeAorCWFkZHEJMCglcmRpKSwlcjgKKwlsZWFxCTY0KCVyYnApLCVyYnAKKwltb3ZxCSQtOCwlcmN4CisJYWRjeHEJOCglcmRpKSwlcjkKKwlhZGN4cQkxNiglcmRpKSwlcjEwCisJYWRjcQkyNCglcmRpKSwlcjExCisJYWRjcQkzMiglcmRpKSwlcjEyCisJYWRjcQk0MCglcmRpKSwlcjEzCisJYWRjcQk0OCglcmRpKSwlcjE0CisJYWRjcQk1NiglcmRpKSwlcjE1CisJbGVhcQk2NCglcmRpKSwlcmRpCisJc2JicQklcmF4LCVyYXgKKworCXhvcnEJJXJzaSwlcnNpCisJbW92cQklcmF4LDE2KzgoJXJzcCkKKwlqbXAJLkxzcXJ4OHhfdGFpbAorCisuYWxpZ24JMzIKKy5Mc3FyeDh4X3RhaWw6CisJbW92cQklcjgsJXJieAorCW11bHhxCTAoJXJicCksJXJheCwlcjgKKwlhZGN4cQklcmF4LCVyYngKKwlhZG94cQklcjksJXI4CisKKwltdWx4cQk4KCVyYnApLCVyYXgsJXI5CisJYWRjeHEJJXJheCwlcjgKKwlhZG94cQklcjEwLCVyOQorCisJbXVseHEJMTYoJXJicCksJXJheCwlcjEwCisJYWRjeHEJJXJheCwlcjkKKwlhZG94cQklcjExLCVyMTAKKworCW11bHhxCTI0KCVyYnApLCVyYXgsJXIxMQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTIsJXIxMQorCisuYnl0ZQkweGM0LDB4NjIsMHhmYiwweGY2LDB4YTUsMHgyMCwweDAwLDB4MDAsMHgwMAorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTMsJXIxMgorCisJbXVseHEJNDAoJXJicCksJXJheCwlcjEzCisJYWRjeHEJJXJheCwlcjEyCisJYWRveHEJJXIxNCwlcjEzCisKKwltdWx4cQk0OCglcmJwKSwlcmF4LCVyMTQKKwlhZGN4cQklcmF4LCVyMTMKKwlhZG94cQklcjE1LCVyMTQKKworCW11bHhxCTU2KCVyYnApLCVyYXgsJXIxNQorCW1vdnEJNzIrNDgrOCglcnNwLCVyY3gsOCksJXJkeAorCWFkY3hxCSVyYXgsJXIxNAorCWFkb3hxCSVyc2ksJXIxNQorCW1vdnEJJXJieCwoJXJkaSwlcmN4LDgpCisJbW92cQklcjgsJXJieAorCWFkY3hxCSVyc2ksJXIxNQorCisJaW5jcQklcmN4CisJam56CS5Mc3FyeDh4X3RhaWwKKworCWNtcHEJMCs4KCVyc3ApLCVyYnAKKwlqYWUJLkxzcXJ4OHhfdGFpbF9kb25lCisKKwlzdWJxCTE2KzgoJXJzcCksJXJzaQorCW1vdnEJNDgrOCglcnNwKSwlcmR4CisJbGVhcQk2NCglcmJwKSwlcmJwCisJYWRjcQkwKCVyZGkpLCVyOAorCWFkY3EJOCglcmRpKSwlcjkKKwlhZGNxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTI0KCVyZGkpLCVyMTEKKwlhZGNxCTMyKCVyZGkpLCVyMTIKKwlhZGNxCTQwKCVyZGkpLCVyMTMKKwlhZGNxCTQ4KCVyZGkpLCVyMTQKKwlhZGNxCTU2KCVyZGkpLCVyMTUKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwlzYmJxCSVyYXgsJXJheAorCXN1YnEJJDgsJXJjeAorCisJeG9ycQklcnNpLCVyc2kKKwltb3ZxCSVyYXgsMTYrOCglcnNwKQorCWptcAkuTHNxcng4eF90YWlsCisKKy5hbGlnbgkzMgorLkxzcXJ4OHhfdGFpbF9kb25lOgorCXhvcnEJJXJheCwlcmF4CisJYWRkcQkyNCs4KCVyc3ApLCVyOAorCWFkY3EJJDAsJXI5CisJYWRjcQkkMCwlcjEwCisJYWRjcQkkMCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRjcQkkMCwlcjEzCisJYWRjcQkkMCwlcjE0CisJYWRjcQkkMCwlcjE1CisJYWRjcQkkMCwlcmF4CisKKwlzdWJxCTE2KzgoJXJzcCksJXJzaQorLkxzcXJ4OHhfbm9fdGFpbDoKKwlhZGNxCTAoJXJkaSksJXI4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIxNworCWFkY3EJOCglcmRpKSwlcjkKKwltb3ZxCTU2KCVyYnApLCVyc2kKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjEzCisJYWRjcQkxNiglcmRpKSwlcjEwCisJYWRjcQkyNCglcmRpKSwlcjExCisJYWRjcQkzMiglcmRpKSwlcjEyCisJYWRjcQk0MCglcmRpKSwlcjEzCisJYWRjcQk0OCglcmRpKSwlcjE0CisJYWRjcQk1NiglcmRpKSwlcjE1CisJYWRjcQkkMCwlcmF4CisKKwltb3ZxCTMyKzgoJXJzcCksJXJieAorCW1vdnEJNjQoJXJkaSwlcmN4LDEpLCVyZHgKKworCW1vdnEJJXI4LDAoJXJkaSkKKwlsZWFxCTY0KCVyZGkpLCVyOAorCW1vdnEJJXI5LDgoJXJkaSkKKwltb3ZxCSVyMTAsMTYoJXJkaSkKKwltb3ZxCSVyMTEsMjQoJXJkaSkKKwltb3ZxCSVyMTIsMzIoJXJkaSkKKwltb3ZxCSVyMTMsNDAoJXJkaSkKKwltb3ZxCSVyMTQsNDgoJXJkaSkKKwltb3ZxCSVyMTUsNTYoJXJkaSkKKworCWxlYXEJNjQoJXJkaSwlcmN4LDEpLCVyZGkKKwljbXBxCTgrOCglcnNwKSwlcjgKKwlqYgkuTHNxcng4eF9yZWR1Y3Rpb25fbG9vcAorCS5ieXRlCTB4ZjMsMHhjMworLnNpemUJYm5fc3FyeDh4X2ludGVybmFsLC4tYm5fc3FyeDh4X2ludGVybmFsCisuYWxpZ24JMzIKK19fYm5fcG9zdHg0eF9pbnRlcm5hbDoKKwltb3ZxCTAoJXJicCksJXIxMgorCW1vdnEJJXJjeCwlcjEwCisJbW92cQklcmN4LCVyOQorCW5lZ3EJJXJheAorCXNhcnEJJDMrMiwlcmN4CisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjAyCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwNgorCWRlY3EJJXIxMgorCW1vdnEJOCglcmJwKSwlcjEzCisJeG9ycQklcjgsJXI4CisJbW92cQkxNiglcmJwKSwlcjE0CisJbW92cQkyNCglcmJwKSwlcjE1CisJam1wCS5Mc3FyeDR4X3N1Yl9lbnRyeQorCisuYWxpZ24JMTYKKy5Mc3FyeDR4X3N1YjoKKwltb3ZxCTAoJXJicCksJXIxMgorCW1vdnEJOCglcmJwKSwlcjEzCisJbW92cQkxNiglcmJwKSwlcjE0CisJbW92cQkyNCglcmJwKSwlcjE1CisuTHNxcng0eF9zdWJfZW50cnk6CisJYW5kbnEJJXJheCwlcjEyLCVyMTIKKwlsZWFxCTMyKCVyYnApLCVyYnAKKwlhbmRucQklcmF4LCVyMTMsJXIxMworCWFuZG5xCSVyYXgsJXIxNCwlcjE0CisJYW5kbnEJJXJheCwlcjE1LCVyMTUKKworCW5lZ3EJJXI4CisJYWRjcQkwKCVyZGkpLCVyMTIKKwlhZGNxCTgoJXJkaSksJXIxMworCWFkY3EJMTYoJXJkaSksJXIxNAorCWFkY3EJMjQoJXJkaSksJXIxNQorCW1vdnEJJXIxMiwwKCVyZHgpCisJbGVhcQkzMiglcmRpKSwlcmRpCisJbW92cQklcjEzLDgoJXJkeCkKKwlzYmJxCSVyOCwlcjgKKwltb3ZxCSVyMTQsMTYoJXJkeCkKKwltb3ZxCSVyMTUsMjQoJXJkeCkKKwlsZWFxCTMyKCVyZHgpLCVyZHgKKworCWluY3EJJXJjeAorCWpuegkuTHNxcng0eF9zdWIKKworCW5lZ3EJJXI5CisKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCV9fYm5fcG9zdHg0eF9pbnRlcm5hbCwuLV9fYm5fcG9zdHg0eF9pbnRlcm5hbAorLmdsb2JsCWJuX3NjYXR0ZXI1CisuaGlkZGVuIGJuX3NjYXR0ZXI1CisudHlwZQlibl9zY2F0dGVyNSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorYm5fc2NhdHRlcjU6CisJY21wbAkkMCwlZXNpCisJanoJLkxzY2F0dGVyX2VwaWxvZ3VlCisJbGVhcQkoJXJkeCwlcmN4LDgpLCVyZHgKKy5Mc2NhdHRlcjoKKwltb3ZxCSglcmRpKSwlcmF4CisJbGVhcQk4KCVyZGkpLCVyZGkKKwltb3ZxCSVyYXgsKCVyZHgpCisJbGVhcQkyNTYoJXJkeCksJXJkeAorCXN1YmwJJDEsJWVzaQorCWpuegkuTHNjYXR0ZXIKKy5Mc2NhdHRlcl9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKy5zaXplCWJuX3NjYXR0ZXI1LC4tYm5fc2NhdHRlcjUKKworLmdsb2JsCWJuX2dhdGhlcjUKKy5oaWRkZW4gYm5fZ2F0aGVyNQorLnR5cGUJYm5fZ2F0aGVyNSxAZnVuY3Rpb24KKy5hbGlnbgkzMgorYm5fZ2F0aGVyNToKKy5MU0VIX2JlZ2luX2JuX2dhdGhlcjU6CisKKy5ieXRlCTB4NGMsMHg4ZCwweDE0LDB4MjQKKy5ieXRlCTB4NDgsMHg4MSwweGVjLDB4MDgsMHgwMSwweDAwLDB4MDAKKwlsZWFxCS5MaW5jKCVyaXApLCVyYXgKKwlhbmRxCSQtMTYsJXJzcAorCisJbW92ZAklZWN4LCV4bW01CisJbW92ZHFhCTAoJXJheCksJXhtbTAKKwltb3ZkcWEJMTYoJXJheCksJXhtbTEKKwlsZWFxCTEyOCglcmR4KSwlcjExCisJbGVhcQkxMjgoJXJzcCksJXJheAorCisJcHNodWZkCSQwLCV4bW01LCV4bW01CisJbW92ZHFhCSV4bW0xLCV4bW00CisJbW92ZHFhCSV4bW0xLCV4bW0yCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0zCisKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsLTEyOCglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLC0xMTIoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwtOTYoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTMsLTgwKCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0zCisKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsLTY0KCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsLTQ4KCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsLTMyKCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLC0xNiglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMworCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDAoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwxNiglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDMyKCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLDQ4KCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0zCisKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsNjQoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSw4MCglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDk2KCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0yCisJbW92ZHFhCSV4bW0zLDExMiglcmF4KQorCWptcAkuTGdhdGhlcgorCisuYWxpZ24JMzIKKy5MZ2F0aGVyOgorCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJbW92ZHFhCS0xMjgoJXIxMSksJXhtbTAKKwltb3ZkcWEJLTExMiglcjExKSwleG1tMQorCW1vdmRxYQktOTYoJXIxMSksJXhtbTIKKwlwYW5kCS0xMjgoJXJheCksJXhtbTAKKwltb3ZkcWEJLTgwKCVyMTEpLCV4bW0zCisJcGFuZAktMTEyKCVyYXgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAktOTYoJXJheCksJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTUKKwlwYW5kCS04MCglcmF4KSwleG1tMworCXBvcgkleG1tMiwleG1tNAorCXBvcgkleG1tMywleG1tNQorCW1vdmRxYQktNjQoJXIxMSksJXhtbTAKKwltb3ZkcWEJLTQ4KCVyMTEpLCV4bW0xCisJbW92ZHFhCS0zMiglcjExKSwleG1tMgorCXBhbmQJLTY0KCVyYXgpLCV4bW0wCisJbW92ZHFhCS0xNiglcjExKSwleG1tMworCXBhbmQJLTQ4KCVyYXgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAktMzIoJXJheCksJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTUKKwlwYW5kCS0xNiglcmF4KSwleG1tMworCXBvcgkleG1tMiwleG1tNAorCXBvcgkleG1tMywleG1tNQorCW1vdmRxYQkwKCVyMTEpLCV4bW0wCisJbW92ZHFhCTE2KCVyMTEpLCV4bW0xCisJbW92ZHFhCTMyKCVyMTEpLCV4bW0yCisJcGFuZAkwKCVyYXgpLCV4bW0wCisJbW92ZHFhCTQ4KCVyMTEpLCV4bW0zCisJcGFuZAkxNiglcmF4KSwleG1tMQorCXBvcgkleG1tMCwleG1tNAorCXBhbmQJMzIoJXJheCksJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTUKKwlwYW5kCTQ4KCVyYXgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTY0KCVyMTEpLCV4bW0wCisJbW92ZHFhCTgwKCVyMTEpLCV4bW0xCisJbW92ZHFhCTk2KCVyMTEpLCV4bW0yCisJcGFuZAk2NCglcmF4KSwleG1tMAorCW1vdmRxYQkxMTIoJXIxMSksJXhtbTMKKwlwYW5kCTgwKCVyYXgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAk5NiglcmF4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJMTEyKCVyYXgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJcG9yCSV4bW01LCV4bW00CisJbGVhcQkyNTYoJXIxMSksJXIxMQorCXBzaHVmZAkkMHg0ZSwleG1tNCwleG1tMAorCXBvcgkleG1tNCwleG1tMAorCW1vdnEJJXhtbTAsKCVyZGkpCisJbGVhcQk4KCVyZGkpLCVyZGkKKwlzdWJsCSQxLCVlc2kKKwlqbnoJLkxnYXRoZXIKKworCWxlYXEJKCVyMTApLCVyc3AKKwkuYnl0ZQkweGYzLDB4YzMKKy5MU0VIX2VuZF9ibl9nYXRoZXI1OgorLnNpemUJYm5fZ2F0aGVyNSwuLWJuX2dhdGhlcjUKKy5hbGlnbgk2NAorLkxpbmM6CisubG9uZwkwLDAsIDEsMQorLmxvbmcJMiwyLCAyLDIKKy5ieXRlCTc3LDExMSwxMTAsMTE2LDEwMywxMTEsMTA5LDEwMSwxMTQsMTIxLDMyLDc3LDExNywxMDgsMTE2LDEwNSwxMTIsMTA4LDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExNSw5OSw5NywxMTYsMTE2LDEwMSwxMTQsNDcsMTAzLDk3LDExNiwxMDQsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2NoYWNoYS9jaGFjaGEteDg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2NoYWNoYS9jaGFjaGEteDg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NDY3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODYuUwpAQCAtMCwwICsxLDk2OCBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCV9DaGFDaGEyMF9jdHIzMgorLnByaXZhdGVfZXh0ZXJuCV9DaGFDaGEyMF9jdHIzMgorLmFsaWduCTQKK19DaGFDaGEyMF9jdHIzMjoKK0xfQ2hhQ2hhMjBfY3RyMzJfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXhvcmwJJWVheCwlZWF4CisJY21wbAkyOCglZXNwKSwlZWF4CisJamUJTDAwMG5vX2RhdGEKKwljYWxsCUxwaWNfcG9pbnQKK0xwaWNfcG9pbnQ6CisJcG9wbAklZWF4CisJbW92bAlMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0ci1McGljX3BvaW50KCVlYXgpLCVlYnAKKwl0ZXN0bAkkMTY3NzcyMTYsKCVlYnApCisJanoJTDAwMXg4NgorCXRlc3RsCSQ1MTIsNCglZWJwKQorCWp6CUwwMDF4ODYKKwlqbXAJTHNzc2UzX3Nob3J0Y3V0CitMMDAxeDg2OgorCW1vdmwJMzIoJWVzcCksJWVzaQorCW1vdmwJMzYoJWVzcCksJWVkaQorCXN1YmwJJDEzMiwlZXNwCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsODAoJWVzcCkKKwltb3ZsCSVlYngsODQoJWVzcCkKKwltb3ZsCSVlY3gsODgoJWVzcCkKKwltb3ZsCSVlZHgsOTIoJWVzcCkKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwltb3ZsCTIwKCVlc2kpLCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsOTYoJWVzcCkKKwltb3ZsCSVlYngsMTAwKCVlc3ApCisJbW92bAklZWN4LDEwNCglZXNwKQorCW1vdmwJJWVkeCwxMDgoJWVzcCkKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCXN1YmwJJDEsJWVheAorCW1vdmwJJWVheCwxMTIoJWVzcCkKKwltb3ZsCSVlYngsMTE2KCVlc3ApCisJbW92bAklZWN4LDEyMCglZXNwKQorCW1vdmwJJWVkeCwxMjQoJWVzcCkKKwlqbXAJTDAwMmVudHJ5CisuYWxpZ24JNCwweDkwCitMMDAzb3V0ZXJfbG9vcDoKKwltb3ZsCSVlYngsMTU2KCVlc3ApCisJbW92bAklZWF4LDE1MiglZXNwKQorCW1vdmwJJWVjeCwxNjAoJWVzcCkKK0wwMDJlbnRyeToKKwltb3ZsCSQxNjM0NzYwODA1LCVlYXgKKwltb3ZsCSQ4NTc3NjA4NzgsNCglZXNwKQorCW1vdmwJJDIwMzY0NzcyMzQsOCglZXNwKQorCW1vdmwJJDE3OTcyODUyMzYsMTIoJWVzcCkKKwltb3ZsCTg0KCVlc3ApLCVlYngKKwltb3ZsCTg4KCVlc3ApLCVlYnAKKwltb3ZsCTEwNCglZXNwKSwlZWN4CisJbW92bAkxMDgoJWVzcCksJWVzaQorCW1vdmwJMTE2KCVlc3ApLCVlZHgKKwltb3ZsCTEyMCglZXNwKSwlZWRpCisJbW92bAklZWJ4LDIwKCVlc3ApCisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAklZWN4LDQwKCVlc3ApCisJbW92bAklZXNpLDQ0KCVlc3ApCisJbW92bAklZWR4LDUyKCVlc3ApCisJbW92bAklZWRpLDU2KCVlc3ApCisJbW92bAk5MiglZXNwKSwlZWJ4CisJbW92bAkxMjQoJWVzcCksJWVkaQorCW1vdmwJMTEyKCVlc3ApLCVlZHgKKwltb3ZsCTgwKCVlc3ApLCVlYnAKKwltb3ZsCTk2KCVlc3ApLCVlY3gKKwltb3ZsCTEwMCglZXNwKSwlZXNpCisJYWRkbAkkMSwlZWR4CisJbW92bAklZWJ4LDI4KCVlc3ApCisJbW92bAklZWRpLDYwKCVlc3ApCisJbW92bAklZWR4LDExMiglZXNwKQorCW1vdmwJJDEwLCVlYngKKwlqbXAJTDAwNGxvb3AKKy5hbGlnbgk0LDB4OTAKK0wwMDRsb29wOgorCWFkZGwJJWVicCwlZWF4CisJbW92bAklZWJ4LDEyOCglZXNwKQorCW1vdmwJJWVicCwlZWJ4CisJeG9ybAklZWF4LCVlZHgKKwlyb2xsCSQxNiwlZWR4CisJYWRkbAklZWR4LCVlY3gKKwl4b3JsCSVlY3gsJWVieAorCW1vdmwJNTIoJWVzcCksJWVkaQorCXJvbGwJJDEyLCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlYnAKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVheCwlZWR4CisJbW92bAklZWF4LCglZXNwKQorCXJvbGwJJDgsJWVkeAorCW1vdmwJNCglZXNwKSwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwltb3ZsCSVlZHgsNDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9sbAkkNywlZWJ4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlY3gsMzIoJWVzcCkKKwlyb2xsCSQxNiwlZWRpCisJbW92bAklZWJ4LDE2KCVlc3ApCisJYWRkbAklZWRpLCVlc2kKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwl4b3JsCSVlc2ksJWVicAorCW1vdmwJNTYoJWVzcCksJWVkeAorCXJvbGwJJDEyLCVlYnAKKwltb3ZsCTI0KCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWF4LDQoJWVzcCkKKwlyb2xsCSQ4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVheAorCWFkZGwJJWVkaSwlZXNpCisJbW92bAklZWRpLDUyKCVlc3ApCisJeG9ybAklZXNpLCVlYnAKKwlhZGRsCSVlYngsJWVheAorCXJvbGwJJDcsJWVicAorCXhvcmwJJWVheCwlZWR4CisJbW92bAklZXNpLDM2KCVlc3ApCisJcm9sbAkkMTYsJWVkeAorCW1vdmwJJWVicCwyMCglZXNwKQorCWFkZGwJJWVkeCwlZWN4CisJbW92bAk0NCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwltb3ZsCTYwKCVlc3ApLCVlZGkKKwlyb2xsCSQxMiwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJJWVheCw4KCVlc3ApCisJcm9sbAkkOCwlZWR4CisJbW92bAkxMiglZXNwKSwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwltb3ZsCSVlZHgsNTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9sbAkkNywlZWJ4CisJeG9ybAklZWF4LCVlZGkKKwlyb2xsCSQxNiwlZWRpCisJbW92bAklZWJ4LDI0KCVlc3ApCisJYWRkbAklZWRpLCVlc2kKKwl4b3JsCSVlc2ksJWVicAorCXJvbGwJJDEyLCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWF4LDEyKCVlc3ApCisJcm9sbAkkOCwlZWRpCisJbW92bAkoJWVzcCksJWVheAorCWFkZGwJJWVkaSwlZXNpCisJbW92bAklZWRpLCVlZHgKKwl4b3JsCSVlc2ksJWVicAorCWFkZGwJJWVieCwlZWF4CisJcm9sbAkkNywlZWJwCisJeG9ybAklZWF4LCVlZHgKKwlyb2xsCSQxNiwlZWR4CisJbW92bAklZWJwLDI4KCVlc3ApCisJYWRkbAklZWR4LCVlY3gKKwl4b3JsCSVlY3gsJWVieAorCW1vdmwJNDgoJWVzcCksJWVkaQorCXJvbGwJJDEyLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlYnAKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVheCwlZWR4CisJbW92bAklZWF4LCglZXNwKQorCXJvbGwJJDgsJWVkeAorCW1vdmwJNCglZXNwKSwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwltb3ZsCSVlZHgsNjAoJWVzcCkKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9sbAkkNywlZWJ4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwlyb2xsCSQxNiwlZWRpCisJbW92bAklZWJ4LDIwKCVlc3ApCisJYWRkbAklZWRpLCVlc2kKKwltb3ZsCTMyKCVlc3ApLCVlY3gKKwl4b3JsCSVlc2ksJWVicAorCW1vdmwJNTIoJWVzcCksJWVkeAorCXJvbGwJJDEyLCVlYnAKKwltb3ZsCTI4KCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWF4LDQoJWVzcCkKKwlyb2xsCSQ4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVheAorCWFkZGwJJWVkaSwlZXNpCisJbW92bAklZWRpLDQ4KCVlc3ApCisJeG9ybAklZXNpLCVlYnAKKwlhZGRsCSVlYngsJWVheAorCXJvbGwJJDcsJWVicAorCXhvcmwJJWVheCwlZWR4CisJbW92bAklZXNpLDQ0KCVlc3ApCisJcm9sbAkkMTYsJWVkeAorCW1vdmwJJWVicCwyNCglZXNwKQorCWFkZGwJJWVkeCwlZWN4CisJbW92bAkzNiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwltb3ZsCTU2KCVlc3ApLCVlZGkKKwlyb2xsCSQxMiwlZWJ4CisJbW92bAkxNiglZXNwKSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYXgsJWVkeAorCW1vdmwJJWVheCw4KCVlc3ApCisJcm9sbAkkOCwlZWR4CisJbW92bAkxMiglZXNwKSwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwltb3ZsCSVlZHgsNTIoJWVzcCkKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9sbAkkNywlZWJ4CisJeG9ybAklZWF4LCVlZGkKKwlyb2xsCSQxNiwlZWRpCisJbW92bAklZWJ4LDI4KCVlc3ApCisJYWRkbAklZWRpLCVlc2kKKwl4b3JsCSVlc2ksJWVicAorCW1vdmwJNDgoJWVzcCksJWVkeAorCXJvbGwJJDEyLCVlYnAKKwltb3ZsCTEyOCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVheCwxMiglZXNwKQorCXJvbGwJJDgsJWVkaQorCW1vdmwJKCVlc3ApLCVlYXgKKwlhZGRsCSVlZGksJWVzaQorCW1vdmwJJWVkaSw1NiglZXNwKQorCXhvcmwJJWVzaSwlZWJwCisJcm9sbAkkNywlZWJwCisJZGVjbAklZWJ4CisJam56CUwwMDRsb29wCisJbW92bAkxNjAoJWVzcCksJWVieAorCWFkZGwJJDE2MzQ3NjA4MDUsJWVheAorCWFkZGwJODAoJWVzcCksJWVicAorCWFkZGwJOTYoJWVzcCksJWVjeAorCWFkZGwJMTAwKCVlc3ApLCVlc2kKKwljbXBsCSQ2NCwlZWJ4CisJamIJTDAwNXRhaWwKKwltb3ZsCTE1NiglZXNwKSwlZWJ4CisJYWRkbAkxMTIoJWVzcCksJWVkeAorCWFkZGwJMTIwKCVlc3ApLCVlZGkKKwl4b3JsCSglZWJ4KSwlZWF4CisJeG9ybAkxNiglZWJ4KSwlZWJwCisJbW92bAklZWF4LCglZXNwKQorCW1vdmwJMTUyKCVlc3ApLCVlYXgKKwl4b3JsCTMyKCVlYngpLCVlY3gKKwl4b3JsCTM2KCVlYngpLCVlc2kKKwl4b3JsCTQ4KCVlYngpLCVlZHgKKwl4b3JsCTU2KCVlYngpLCVlZGkKKwltb3ZsCSVlYnAsMTYoJWVheCkKKwltb3ZsCSVlY3gsMzIoJWVheCkKKwltb3ZsCSVlc2ksMzYoJWVheCkKKwltb3ZsCSVlZHgsNDgoJWVheCkKKwltb3ZsCSVlZGksNTYoJWVheCkKKwltb3ZsCTQoJWVzcCksJWVicAorCW1vdmwJOCglZXNwKSwlZWN4CisJbW92bAkxMiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJYWRkbAkkODU3NzYwODc4LCVlYnAKKwlhZGRsCSQyMDM2NDc3MjM0LCVlY3gKKwlhZGRsCSQxNzk3Mjg1MjM2LCVlc2kKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwlhZGRsCTg4KCVlc3ApLCVlZGkKKwl4b3JsCTQoJWVieCksJWVicAorCXhvcmwJOCglZWJ4KSwlZWN4CisJeG9ybAkxMiglZWJ4KSwlZXNpCisJeG9ybAkyMCglZWJ4KSwlZWR4CisJeG9ybAkyNCglZWJ4KSwlZWRpCisJbW92bAklZWJwLDQoJWVheCkKKwltb3ZsCSVlY3gsOCglZWF4KQorCW1vdmwJJWVzaSwxMiglZWF4KQorCW1vdmwJJWVkeCwyMCglZWF4KQorCW1vdmwJJWVkaSwyNCglZWF4KQorCW1vdmwJMjgoJWVzcCksJWVicAorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJNDQoJWVzcCksJWVzaQorCW1vdmwJNTIoJWVzcCksJWVkeAorCW1vdmwJNjAoJWVzcCksJWVkaQorCWFkZGwJOTIoJWVzcCksJWVicAorCWFkZGwJMTA0KCVlc3ApLCVlY3gKKwlhZGRsCTEwOCglZXNwKSwlZXNpCisJYWRkbAkxMTYoJWVzcCksJWVkeAorCWFkZGwJMTI0KCVlc3ApLCVlZGkKKwl4b3JsCTI4KCVlYngpLCVlYnAKKwl4b3JsCTQwKCVlYngpLCVlY3gKKwl4b3JsCTQ0KCVlYngpLCVlc2kKKwl4b3JsCTUyKCVlYngpLCVlZHgKKwl4b3JsCTYwKCVlYngpLCVlZGkKKwlsZWFsCTY0KCVlYngpLCVlYngKKwltb3ZsCSVlYnAsMjgoJWVheCkKKwltb3ZsCSglZXNwKSwlZWJwCisJbW92bAklZWN4LDQwKCVlYXgpCisJbW92bAkxNjAoJWVzcCksJWVjeAorCW1vdmwJJWVzaSw0NCglZWF4KQorCW1vdmwJJWVkeCw1MiglZWF4KQorCW1vdmwJJWVkaSw2MCglZWF4KQorCW1vdmwJJWVicCwoJWVheCkKKwlsZWFsCTY0KCVlYXgpLCVlYXgKKwlzdWJsCSQ2NCwlZWN4CisJam56CUwwMDNvdXRlcl9sb29wCisJam1wCUwwMDZkb25lCitMMDA1dGFpbDoKKwlhZGRsCTExMiglZXNwKSwlZWR4CisJYWRkbAkxMjAoJWVzcCksJWVkaQorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYnAsMTYoJWVzcCkKKwltb3ZsCSVlY3gsMzIoJWVzcCkKKwltb3ZsCSVlc2ksMzYoJWVzcCkKKwltb3ZsCSVlZHgsNDgoJWVzcCkKKwltb3ZsCSVlZGksNTYoJWVzcCkKKwltb3ZsCTQoJWVzcCksJWVicAorCW1vdmwJOCglZXNwKSwlZWN4CisJbW92bAkxMiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJYWRkbAkkODU3NzYwODc4LCVlYnAKKwlhZGRsCSQyMDM2NDc3MjM0LCVlY3gKKwlhZGRsCSQxNzk3Mjg1MjM2LCVlc2kKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwlhZGRsCTg4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYnAsNCglZXNwKQorCW1vdmwJJWVjeCw4KCVlc3ApCisJbW92bAklZXNpLDEyKCVlc3ApCisJbW92bAklZWR4LDIwKCVlc3ApCisJbW92bAklZWRpLDI0KCVlc3ApCisJbW92bAkyOCglZXNwKSwlZWJwCisJbW92bAk0MCglZXNwKSwlZWN4CisJbW92bAk0NCglZXNwKSwlZXNpCisJbW92bAk1MiglZXNwKSwlZWR4CisJbW92bAk2MCglZXNwKSwlZWRpCisJYWRkbAk5MiglZXNwKSwlZWJwCisJYWRkbAkxMDQoJWVzcCksJWVjeAorCWFkZGwJMTA4KCVlc3ApLCVlc2kKKwlhZGRsCTExNiglZXNwKSwlZWR4CisJYWRkbAkxMjQoJWVzcCksJWVkaQorCW1vdmwJJWVicCwyOCglZXNwKQorCW1vdmwJMTU2KCVlc3ApLCVlYnAKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwltb3ZsCTE1MiglZXNwKSwlZWN4CisJbW92bAklZXNpLDQ0KCVlc3ApCisJeG9ybAklZXNpLCVlc2kKKwltb3ZsCSVlZHgsNTIoJWVzcCkKKwltb3ZsCSVlZGksNjAoJWVzcCkKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVkeCwlZWR4CitMMDA3dGFpbF9sb29wOgorCW1vdmIJKCVlc2ksJWVicCwxKSwlYWwKKwltb3ZiCSglZXNwLCVlc2ksMSksJWRsCisJbGVhbAkxKCVlc2kpLCVlc2kKKwl4b3JiCSVkbCwlYWwKKwltb3ZiCSVhbCwtMSglZWN4LCVlc2ksMSkKKwlkZWNsCSVlYngKKwlqbnoJTDAwN3RhaWxfbG9vcAorTDAwNmRvbmU6CisJYWRkbAkkMTMyLCVlc3AKK0wwMDBub19kYXRhOgorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmdsb2JsCV9DaGFDaGEyMF9zc3NlMworLnByaXZhdGVfZXh0ZXJuCV9DaGFDaGEyMF9zc3NlMworLmFsaWduCTQKK19DaGFDaGEyMF9zc3NlMzoKK0xfQ2hhQ2hhMjBfc3NzZTNfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorTHNzc2UzX3Nob3J0Y3V0OgorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVzaQorCW1vdmwJMjgoJWVzcCksJWVjeAorCW1vdmwJMzIoJWVzcCksJWVkeAorCW1vdmwJMzYoJWVzcCksJWVieAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkNTI0LCVlc3AKKwlhbmRsCSQtNjQsJWVzcAorCW1vdmwJJWVicCw1MTIoJWVzcCkKKwlsZWFsCUxzc3NlM19kYXRhLUxwaWNfcG9pbnQoJWVheCksJWVheAorCW1vdmRxdQkoJWVieCksJXhtbTMKKwljbXBsCSQyNTYsJWVjeAorCWpiCUwwMDgxeAorCW1vdmwJJWVkeCw1MTYoJWVzcCkKKwltb3ZsCSVlYngsNTIwKCVlc3ApCisJc3VibAkkMjU2LCVlY3gKKwlsZWFsCTM4NCglZXNwKSwlZWJwCisJbW92ZHF1CSglZWR4KSwleG1tNworCXBzaHVmZAkkMCwleG1tMywleG1tMAorCXBzaHVmZAkkODUsJXhtbTMsJXhtbTEKKwlwc2h1ZmQJJDE3MCwleG1tMywleG1tMgorCXBzaHVmZAkkMjU1LCV4bW0zLCV4bW0zCisJcGFkZGQJNDgoJWVheCksJXhtbTAKKwlwc2h1ZmQJJDAsJXhtbTcsJXhtbTQKKwlwc2h1ZmQJJDg1LCV4bW03LCV4bW01CisJcHN1YmQJNjQoJWVheCksJXhtbTAKKwlwc2h1ZmQJJDE3MCwleG1tNywleG1tNgorCXBzaHVmZAkkMjU1LCV4bW03LCV4bW03CisJbW92ZHFhCSV4bW0wLDY0KCVlYnApCisJbW92ZHFhCSV4bW0xLDgwKCVlYnApCisJbW92ZHFhCSV4bW0yLDk2KCVlYnApCisJbW92ZHFhCSV4bW0zLDExMiglZWJwKQorCW1vdmRxdQkxNiglZWR4KSwleG1tMworCW1vdmRxYQkleG1tNCwtNjQoJWVicCkKKwltb3ZkcWEJJXhtbTUsLTQ4KCVlYnApCisJbW92ZHFhCSV4bW02LC0zMiglZWJwKQorCW1vdmRxYQkleG1tNywtMTYoJWVicCkKKwltb3ZkcWEJMzIoJWVheCksJXhtbTcKKwlsZWFsCTEyOCglZXNwKSwlZWJ4CisJcHNodWZkCSQwLCV4bW0zLCV4bW0wCisJcHNodWZkCSQ4NSwleG1tMywleG1tMQorCXBzaHVmZAkkMTcwLCV4bW0zLCV4bW0yCisJcHNodWZkCSQyNTUsJXhtbTMsJXhtbTMKKwlwc2h1ZmQJJDAsJXhtbTcsJXhtbTQKKwlwc2h1ZmQJJDg1LCV4bW03LCV4bW01CisJcHNodWZkCSQxNzAsJXhtbTcsJXhtbTYKKwlwc2h1ZmQJJDI1NSwleG1tNywleG1tNworCW1vdmRxYQkleG1tMCwoJWVicCkKKwltb3ZkcWEJJXhtbTEsMTYoJWVicCkKKwltb3ZkcWEJJXhtbTIsMzIoJWVicCkKKwltb3ZkcWEJJXhtbTMsNDgoJWVicCkKKwltb3ZkcWEJJXhtbTQsLTEyOCglZWJwKQorCW1vdmRxYQkleG1tNSwtMTEyKCVlYnApCisJbW92ZHFhCSV4bW02LC05NiglZWJwKQorCW1vdmRxYQkleG1tNywtODAoJWVicCkKKwlsZWFsCTEyOCglZXNpKSwlZXNpCisJbGVhbAkxMjgoJWVkaSksJWVkaQorCWptcAlMMDA5b3V0ZXJfbG9vcAorLmFsaWduCTQsMHg5MAorTDAwOW91dGVyX2xvb3A6CisJbW92ZHFhCS0xMTIoJWVicCksJXhtbTEKKwltb3ZkcWEJLTk2KCVlYnApLCV4bW0yCisJbW92ZHFhCS04MCglZWJwKSwleG1tMworCW1vdmRxYQktNDgoJWVicCksJXhtbTUKKwltb3ZkcWEJLTMyKCVlYnApLCV4bW02CisJbW92ZHFhCS0xNiglZWJwKSwleG1tNworCW1vdmRxYQkleG1tMSwtMTEyKCVlYngpCisJbW92ZHFhCSV4bW0yLC05NiglZWJ4KQorCW1vdmRxYQkleG1tMywtODAoJWVieCkKKwltb3ZkcWEJJXhtbTUsLTQ4KCVlYngpCisJbW92ZHFhCSV4bW02LC0zMiglZWJ4KQorCW1vdmRxYQkleG1tNywtMTYoJWVieCkKKwltb3ZkcWEJMzIoJWVicCksJXhtbTIKKwltb3ZkcWEJNDgoJWVicCksJXhtbTMKKwltb3ZkcWEJNjQoJWVicCksJXhtbTQKKwltb3ZkcWEJODAoJWVicCksJXhtbTUKKwltb3ZkcWEJOTYoJWVicCksJXhtbTYKKwltb3ZkcWEJMTEyKCVlYnApLCV4bW03CisJcGFkZGQJNjQoJWVheCksJXhtbTQKKwltb3ZkcWEJJXhtbTIsMzIoJWVieCkKKwltb3ZkcWEJJXhtbTMsNDgoJWVieCkKKwltb3ZkcWEJJXhtbTQsNjQoJWVieCkKKwltb3ZkcWEJJXhtbTUsODAoJWVieCkKKwltb3ZkcWEJJXhtbTYsOTYoJWVieCkKKwltb3ZkcWEJJXhtbTcsMTEyKCVlYngpCisJbW92ZHFhCSV4bW00LDY0KCVlYnApCisJbW92ZHFhCS0xMjgoJWVicCksJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcWEJLTY0KCVlYnApLCV4bW0zCisJbW92ZHFhCSglZWJwKSwleG1tNAorCW1vdmRxYQkxNiglZWJwKSwleG1tNQorCW1vdmwJJDEwLCVlZHgKKwlub3AKKy5hbGlnbgk0LDB4OTAKK0wwMTBsb29wOgorCXBhZGRkCSV4bW0zLCV4bW0wCisJbW92ZHFhCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMCwleG1tNgorCXBzaHVmYgkoJWVheCksJXhtbTYKKwlwYWRkZAkleG1tNiwleG1tNAorCXB4b3IJJXhtbTQsJXhtbTIKKwltb3ZkcWEJLTQ4KCVlYngpLCV4bW0zCisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcHNsbGQJJDEyLCV4bW0yCisJcHNybGQJJDIwLCV4bW0xCisJcG9yCSV4bW0xLCV4bW0yCisJbW92ZHFhCS0xMTIoJWVieCksJXhtbTEKKwlwYWRkZAkleG1tMiwleG1tMAorCW1vdmRxYQk4MCglZWJ4KSwleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTAsLTEyOCglZWJ4KQorCXBzaHVmYgkxNiglZWF4KSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW00CisJbW92ZHFhCSV4bW02LDY0KCVlYngpCisJcHhvcgkleG1tNCwleG1tMgorCXBhZGRkCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW0yLCV4bW0wCisJcHNsbGQJJDcsJXhtbTIKKwlwc3JsZAkkMjUsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW03CisJcG9yCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW00LCglZWJ4KQorCXBzaHVmYgkoJWVheCksJXhtbTcKKwltb3ZkcWEJJXhtbTIsLTY0KCVlYngpCisJcGFkZGQJJXhtbTcsJXhtbTUKKwltb3ZkcWEJMzIoJWVieCksJXhtbTQKKwlweG9yCSV4bW01LCV4bW0zCisJbW92ZHFhCS0zMiglZWJ4KSwleG1tMgorCW1vdmRxYQkleG1tMywleG1tMAorCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tMAorCXBvcgkleG1tMCwleG1tMworCW1vdmRxYQktOTYoJWVieCksJXhtbTAKKwlwYWRkZAkleG1tMywleG1tMQorCW1vdmRxYQk5NiglZWJ4KSwleG1tNgorCXB4b3IJJXhtbTEsJXhtbTcKKwltb3ZkcWEJJXhtbTEsLTExMiglZWJ4KQorCXBzaHVmYgkxNiglZWF4KSwleG1tNworCXBhZGRkCSV4bW03LCV4bW01CisJbW92ZHFhCSV4bW03LDgwKCVlYngpCisJcHhvcgkleG1tNSwleG1tMworCXBhZGRkCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW0zLCV4bW0xCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW02CisJcG9yCSV4bW0xLCV4bW0zCisJbW92ZHFhCSV4bW01LDE2KCVlYngpCisJcHNodWZiCSglZWF4KSwleG1tNgorCW1vdmRxYQkleG1tMywtNDgoJWVieCkKKwlwYWRkZAkleG1tNiwleG1tNAorCW1vdmRxYQk0OCglZWJ4KSwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTIKKwltb3ZkcWEJLTE2KCVlYngpLCV4bW0zCisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcHNsbGQJJDEyLCV4bW0yCisJcHNybGQJJDIwLCV4bW0xCisJcG9yCSV4bW0xLCV4bW0yCisJbW92ZHFhCS04MCglZWJ4KSwleG1tMQorCXBhZGRkCSV4bW0yLCV4bW0wCisJbW92ZHFhCTExMiglZWJ4KSwleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTAsLTk2KCVlYngpCisJcHNodWZiCTE2KCVlYXgpLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTYsOTYoJWVieCkKKwlweG9yCSV4bW00LCV4bW0yCisJcGFkZGQJJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwlwc2xsZAkkNywleG1tMgorCXBzcmxkCSQyNSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTcKKwlwb3IJJXhtbTAsJXhtbTIKKwlwc2h1ZmIJKCVlYXgpLCV4bW03CisJbW92ZHFhCSV4bW0yLC0zMiglZWJ4KQorCXBhZGRkCSV4bW03LCV4bW01CisJcHhvcgkleG1tNSwleG1tMworCW1vdmRxYQktNDgoJWVieCksJXhtbTIKKwltb3ZkcWEJJXhtbTMsJXhtbTAKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTAKKwlwb3IJJXhtbTAsJXhtbTMKKwltb3ZkcWEJLTEyOCglZWJ4KSwleG1tMAorCXBhZGRkCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tMSwtODAoJWVieCkKKwlwc2h1ZmIJMTYoJWVheCksJXhtbTcKKwlwYWRkZAkleG1tNywleG1tNQorCW1vdmRxYQkleG1tNywleG1tNgorCXB4b3IJJXhtbTUsJXhtbTMKKwlwYWRkZAkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tMywleG1tMQorCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNgorCXBvcgkleG1tMSwleG1tMworCXBzaHVmYgkoJWVheCksJXhtbTYKKwltb3ZkcWEJJXhtbTMsLTE2KCVlYngpCisJcGFkZGQJJXhtbTYsJXhtbTQKKwlweG9yCSV4bW00LCV4bW0yCisJbW92ZHFhCS0zMiglZWJ4KSwleG1tMworCW1vdmRxYQkleG1tMiwleG1tMQorCXBzbGxkCSQxMiwleG1tMgorCXBzcmxkCSQyMCwleG1tMQorCXBvcgkleG1tMSwleG1tMgorCW1vdmRxYQktMTEyKCVlYngpLCV4bW0xCisJcGFkZGQJJXhtbTIsJXhtbTAKKwltb3ZkcWEJNjQoJWVieCksJXhtbTcKKwlweG9yCSV4bW0wLCV4bW02CisJbW92ZHFhCSV4bW0wLC0xMjgoJWVieCkKKwlwc2h1ZmIJMTYoJWVheCksJXhtbTYKKwlwYWRkZAkleG1tNiwleG1tNAorCW1vdmRxYQkleG1tNiwxMTIoJWVieCkKKwlweG9yCSV4bW00LCV4bW0yCisJcGFkZGQJJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwlwc2xsZAkkNywleG1tMgorCXBzcmxkCSQyNSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTcKKwlwb3IJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTQsMzIoJWVieCkKKwlwc2h1ZmIJKCVlYXgpLCV4bW03CisJbW92ZHFhCSV4bW0yLC00OCglZWJ4KQorCXBhZGRkCSV4bW03LCV4bW01CisJbW92ZHFhCSglZWJ4KSwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTMKKwltb3ZkcWEJLTE2KCVlYngpLCV4bW0yCisJbW92ZHFhCSV4bW0zLCV4bW0wCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW0wCisJcG9yCSV4bW0wLCV4bW0zCisJbW92ZHFhCS05NiglZWJ4KSwleG1tMAorCXBhZGRkCSV4bW0zLCV4bW0xCisJbW92ZHFhCTgwKCVlYngpLCV4bW02CisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tMSwtMTEyKCVlYngpCisJcHNodWZiCTE2KCVlYXgpLCV4bW03CisJcGFkZGQJJXhtbTcsJXhtbTUKKwltb3ZkcWEJJXhtbTcsNjQoJWVieCkKKwlweG9yCSV4bW01LCV4bW0zCisJcGFkZGQJJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTMsJXhtbTEKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTYKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcWEJJXhtbTUsNDgoJWVieCkKKwlwc2h1ZmIJKCVlYXgpLCV4bW02CisJbW92ZHFhCSV4bW0zLC0zMiglZWJ4KQorCXBhZGRkCSV4bW02LCV4bW00CisJbW92ZHFhCTE2KCVlYngpLCV4bW01CisJcHhvcgkleG1tNCwleG1tMgorCW1vdmRxYQktNjQoJWVieCksJXhtbTMKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwlwc2xsZAkkMTIsJXhtbTIKKwlwc3JsZAkkMjAsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTIKKwltb3ZkcWEJLTgwKCVlYngpLCV4bW0xCisJcGFkZGQJJXhtbTIsJXhtbTAKKwltb3ZkcWEJOTYoJWVieCksJXhtbTcKKwlweG9yCSV4bW0wLCV4bW02CisJbW92ZHFhCSV4bW0wLC05NiglZWJ4KQorCXBzaHVmYgkxNiglZWF4KSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW00CisJbW92ZHFhCSV4bW02LDgwKCVlYngpCisJcHhvcgkleG1tNCwleG1tMgorCXBhZGRkCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW0yLCV4bW0wCisJcHNsbGQJJDcsJXhtbTIKKwlwc3JsZAkkMjUsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW03CisJcG9yCSV4bW0wLCV4bW0yCisJcHNodWZiCSglZWF4KSwleG1tNworCW1vdmRxYQkleG1tMiwtMTYoJWVieCkKKwlwYWRkZAkleG1tNywleG1tNQorCXB4b3IJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTMsJXhtbTAKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTAKKwlwb3IJJXhtbTAsJXhtbTMKKwltb3ZkcWEJLTEyOCglZWJ4KSwleG1tMAorCXBhZGRkCSV4bW0zLCV4bW0xCisJbW92ZHFhCTY0KCVlYngpLCV4bW02CisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tMSwtODAoJWVieCkKKwlwc2h1ZmIJMTYoJWVheCksJXhtbTcKKwlwYWRkZAkleG1tNywleG1tNQorCW1vdmRxYQkleG1tNyw5NiglZWJ4KQorCXB4b3IJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTMsJXhtbTEKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tMQorCXBvcgkleG1tMSwleG1tMworCWRlY2wJJWVkeAorCWpueglMMDEwbG9vcAorCW1vdmRxYQkleG1tMywtNjQoJWVieCkKKwltb3ZkcWEJJXhtbTQsKCVlYngpCisJbW92ZHFhCSV4bW01LDE2KCVlYngpCisJbW92ZHFhCSV4bW02LDY0KCVlYngpCisJbW92ZHFhCSV4bW03LDk2KCVlYngpCisJbW92ZHFhCS0xMTIoJWVieCksJXhtbTEKKwltb3ZkcWEJLTk2KCVlYngpLCV4bW0yCisJbW92ZHFhCS04MCglZWJ4KSwleG1tMworCXBhZGRkCS0xMjgoJWVicCksJXhtbTAKKwlwYWRkZAktMTEyKCVlYnApLCV4bW0xCisJcGFkZGQJLTk2KCVlYnApLCV4bW0yCisJcGFkZGQJLTgwKCVlYnApLCV4bW0zCisJbW92ZHFhCSV4bW0wLCV4bW02CisJcHVucGNrbGRxCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0yLCV4bW03CisJcHVucGNrbGRxCSV4bW0zLCV4bW0yCisJcHVucGNraGRxCSV4bW0xLCV4bW02CisJcHVucGNraGRxCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHVucGNrbHFkcQkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tMworCXB1bnBja2xxZHEJJXhtbTcsJXhtbTYKKwlwdW5wY2tocWRxCSV4bW0yLCV4bW0xCisJcHVucGNraHFkcQkleG1tNywleG1tMworCW1vdmRxdQktMTI4KCVlc2kpLCV4bW00CisJbW92ZHF1CS02NCglZXNpKSwleG1tNQorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTcKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHFhCS02NCglZWJ4KSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTUKKwltb3ZkcWEJLTQ4KCVlYngpLCV4bW0xCisJcHhvcgkleG1tMiwleG1tNgorCW1vdmRxYQktMzIoJWVieCksJXhtbTIKKwlweG9yCSV4bW0zLCV4bW03CisJbW92ZHFhCS0xNiglZWJ4KSwleG1tMworCW1vdmRxdQkleG1tNCwtMTI4KCVlZGkpCisJbW92ZHF1CSV4bW01LC02NCglZWRpKQorCW1vdmRxdQkleG1tNiwoJWVkaSkKKwltb3ZkcXUJJXhtbTcsNjQoJWVkaSkKKwlsZWFsCTE2KCVlZGkpLCVlZGkKKwlwYWRkZAktNjQoJWVicCksJXhtbTAKKwlwYWRkZAktNDgoJWVicCksJXhtbTEKKwlwYWRkZAktMzIoJWVicCksJXhtbTIKKwlwYWRkZAktMTYoJWVicCksJXhtbTMKKwltb3ZkcWEJJXhtbTAsJXhtbTYKKwlwdW5wY2tsZHEJJXhtbTEsJXhtbTAKKwltb3ZkcWEJJXhtbTIsJXhtbTcKKwlwdW5wY2tsZHEJJXhtbTMsJXhtbTIKKwlwdW5wY2toZHEJJXhtbTEsJXhtbTYKKwlwdW5wY2toZHEJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHVucGNrbHFkcQkleG1tNywleG1tNgorCXB1bnBja2hxZHEJJXhtbTIsJXhtbTEKKwlwdW5wY2tocWRxCSV4bW03LCV4bW0zCisJbW92ZHF1CS0xMjgoJWVzaSksJXhtbTQKKwltb3ZkcXUJLTY0KCVlc2kpLCV4bW01CisJbW92ZHF1CSglZXNpKSwleG1tMgorCW1vdmRxdQk2NCglZXNpKSwleG1tNworCWxlYWwJMTYoJWVzaSksJWVzaQorCXB4b3IJJXhtbTAsJXhtbTQKKwltb3ZkcWEJKCVlYngpLCV4bW0wCisJcHhvcgkleG1tMSwleG1tNQorCW1vdmRxYQkxNiglZWJ4KSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTYKKwltb3ZkcWEJMzIoJWVieCksJXhtbTIKKwlweG9yCSV4bW0zLCV4bW03CisJbW92ZHFhCTQ4KCVlYngpLCV4bW0zCisJbW92ZHF1CSV4bW00LC0xMjgoJWVkaSkKKwltb3ZkcXUJJXhtbTUsLTY0KCVlZGkpCisJbW92ZHF1CSV4bW02LCglZWRpKQorCW1vdmRxdQkleG1tNyw2NCglZWRpKQorCWxlYWwJMTYoJWVkaSksJWVkaQorCXBhZGRkCSglZWJwKSwleG1tMAorCXBhZGRkCTE2KCVlYnApLCV4bW0xCisJcGFkZGQJMzIoJWVicCksJXhtbTIKKwlwYWRkZAk0OCglZWJwKSwleG1tMworCW1vdmRxYQkleG1tMCwleG1tNgorCXB1bnBja2xkcQkleG1tMSwleG1tMAorCW1vdmRxYQkleG1tMiwleG1tNworCXB1bnBja2xkcQkleG1tMywleG1tMgorCXB1bnBja2hkcQkleG1tMSwleG1tNgorCXB1bnBja2hkcQkleG1tMywleG1tNworCW1vdmRxYQkleG1tMCwleG1tMQorCXB1bnBja2xxZHEJJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwdW5wY2tscWRxCSV4bW03LCV4bW02CisJcHVucGNraHFkcQkleG1tMiwleG1tMQorCXB1bnBja2hxZHEJJXhtbTcsJXhtbTMKKwltb3ZkcXUJLTEyOCglZXNpKSwleG1tNAorCW1vdmRxdQktNjQoJWVzaSksJXhtbTUKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92ZHF1CTY0KCVlc2kpLCV4bW03CisJbGVhbAkxNiglZXNpKSwlZXNpCisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxYQk2NCglZWJ4KSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTUKKwltb3ZkcWEJODAoJWVieCksJXhtbTEKKwlweG9yCSV4bW0yLCV4bW02CisJbW92ZHFhCTk2KCVlYngpLCV4bW0yCisJcHhvcgkleG1tMywleG1tNworCW1vdmRxYQkxMTIoJWVieCksJXhtbTMKKwltb3ZkcXUJJXhtbTQsLTEyOCglZWRpKQorCW1vdmRxdQkleG1tNSwtNjQoJWVkaSkKKwltb3ZkcXUJJXhtbTYsKCVlZGkpCisJbW92ZHF1CSV4bW03LDY0KCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisJcGFkZGQJNjQoJWVicCksJXhtbTAKKwlwYWRkZAk4MCglZWJwKSwleG1tMQorCXBhZGRkCTk2KCVlYnApLCV4bW0yCisJcGFkZGQJMTEyKCVlYnApLCV4bW0zCisJbW92ZHFhCSV4bW0wLCV4bW02CisJcHVucGNrbGRxCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0yLCV4bW03CisJcHVucGNrbGRxCSV4bW0zLCV4bW0yCisJcHVucGNraGRxCSV4bW0xLCV4bW02CisJcHVucGNraGRxCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHVucGNrbHFkcQkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tMworCXB1bnBja2xxZHEJJXhtbTcsJXhtbTYKKwlwdW5wY2tocWRxCSV4bW0yLCV4bW0xCisJcHVucGNraHFkcQkleG1tNywleG1tMworCW1vdmRxdQktMTI4KCVlc2kpLCV4bW00CisJbW92ZHF1CS02NCglZXNpKSwleG1tNQorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTcKKwlsZWFsCTIwOCglZXNpKSwlZXNpCisJcHhvcgkleG1tMCwleG1tNAorCXB4b3IJJXhtbTEsJXhtbTUKKwlweG9yCSV4bW0yLCV4bW02CisJcHhvcgkleG1tMywleG1tNworCW1vdmRxdQkleG1tNCwtMTI4KCVlZGkpCisJbW92ZHF1CSV4bW01LC02NCglZWRpKQorCW1vdmRxdQkleG1tNiwoJWVkaSkKKwltb3ZkcXUJJXhtbTcsNjQoJWVkaSkKKwlsZWFsCTIwOCglZWRpKSwlZWRpCisJc3VibAkkMjU2LCVlY3gKKwlqbmMJTDAwOW91dGVyX2xvb3AKKwlhZGRsCSQyNTYsJWVjeAorCWp6CUwwMTFkb25lCisJbW92bAk1MjAoJWVzcCksJWVieAorCWxlYWwJLTEyOCglZXNpKSwlZXNpCisJbW92bAk1MTYoJWVzcCksJWVkeAorCWxlYWwJLTEyOCglZWRpKSwlZWRpCisJbW92ZAk2NCglZWJwKSwleG1tMgorCW1vdmRxdQkoJWVieCksJXhtbTMKKwlwYWRkZAk5NiglZWF4KSwleG1tMgorCXBhbmQJMTEyKCVlYXgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0zCitMMDA4MXg6CisJbW92ZHFhCTMyKCVlYXgpLCV4bW0wCisJbW92ZHF1CSglZWR4KSwleG1tMQorCW1vdmRxdQkxNiglZWR4KSwleG1tMgorCW1vdmRxYQkoJWVheCksJXhtbTYKKwltb3ZkcWEJMTYoJWVheCksJXhtbTcKKwltb3ZsCSVlYnAsNDgoJWVzcCkKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJbW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJbW92ZHFhCSV4bW0yLDMyKCVlc3ApCisJbW92ZHFhCSV4bW0zLDQ4KCVlc3ApCisJbW92bAkkMTAsJWVkeAorCWptcAlMMDEybG9vcDF4CisuYWxpZ24JNCwweDkwCitMMDEzb3V0ZXIxeDoKKwltb3ZkcWEJODAoJWVheCksJXhtbTMKKwltb3ZkcWEJKCVlc3ApLCV4bW0wCisJbW92ZHFhCTE2KCVlc3ApLCV4bW0xCisJbW92ZHFhCTMyKCVlc3ApLCV4bW0yCisJcGFkZGQJNDgoJWVzcCksJXhtbTMKKwltb3ZsCSQxMCwlZWR4CisJbW92ZHFhCSV4bW0zLDQ4KCVlc3ApCisJam1wCUwwMTJsb29wMXgKKy5hbGlnbgk0LDB4OTAKK0wwMTJsb29wMXg6CisJcGFkZGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JsZAkkMjAsJXhtbTEKKwlwc2xsZAkkMTIsJXhtbTQKKwlwb3IJJXhtbTQsJXhtbTEKKwlwYWRkZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworCXBhZGRkCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tMSwleG1tNAorCXBzcmxkCSQyNSwleG1tMQorCXBzbGxkCSQ3LCV4bW00CisJcG9yCSV4bW00LCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMgorCXBzaHVmZAkkNTcsJXhtbTEsJXhtbTEKKwlwc2h1ZmQJJDE0NywleG1tMywleG1tMworCW5vcAorCXBhZGRkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW0xLCV4bW00CisJcHNybGQJJDIwLCV4bW0xCisJcHNsbGQJJDEyLCV4bW00CisJcG9yCSV4bW00LCV4bW0xCisJcGFkZGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKwlwYWRkZAkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JsZAkkMjUsJXhtbTEKKwlwc2xsZAkkNywleG1tNAorCXBvcgkleG1tNCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTIKKwlwc2h1ZmQJJDE0NywleG1tMSwleG1tMQorCXBzaHVmZAkkNTcsJXhtbTMsJXhtbTMKKwlkZWNsCSVlZHgKKwlqbnoJTDAxMmxvb3AxeAorCXBhZGRkCSglZXNwKSwleG1tMAorCXBhZGRkCTE2KCVlc3ApLCV4bW0xCisJcGFkZGQJMzIoJWVzcCksJXhtbTIKKwlwYWRkZAk0OCglZXNwKSwleG1tMworCWNtcGwJJDY0LCVlY3gKKwlqYglMMDE0dGFpbAorCW1vdmRxdQkoJWVzaSksJXhtbTQKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTUKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJcHhvcgkleG1tNSwleG1tMQorCW1vdmRxdQk0OCglZXNpKSwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW01LCV4bW0zCisJbGVhbAk2NCglZXNpKSwlZXNpCisJbW92ZHF1CSV4bW0wLCglZWRpKQorCW1vdmRxdQkleG1tMSwxNiglZWRpKQorCW1vdmRxdQkleG1tMiwzMiglZWRpKQorCW1vdmRxdQkleG1tMyw0OCglZWRpKQorCWxlYWwJNjQoJWVkaSksJWVkaQorCXN1YmwJJDY0LCVlY3gKKwlqbnoJTDAxM291dGVyMXgKKwlqbXAJTDAxMWRvbmUKK0wwMTR0YWlsOgorCW1vdmRxYQkleG1tMCwoJWVzcCkKKwltb3ZkcWEJJXhtbTEsMTYoJWVzcCkKKwltb3ZkcWEJJXhtbTIsMzIoJWVzcCkKKwltb3ZkcWEJJXhtbTMsNDgoJWVzcCkKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVkeCwlZWR4CisJeG9ybAklZWJwLCVlYnAKK0wwMTV0YWlsX2xvb3A6CisJbW92YgkoJWVzcCwlZWJwLDEpLCVhbAorCW1vdmIJKCVlc2ksJWVicCwxKSwlZGwKKwlsZWFsCTEoJWVicCksJWVicAorCXhvcmIJJWRsLCVhbAorCW1vdmIJJWFsLC0xKCVlZGksJWVicCwxKQorCWRlY2wJJWVjeAorCWpueglMMDE1dGFpbF9sb29wCitMMDExZG9uZToKKwltb3ZsCTUxMiglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuYWxpZ24JNiwweDkwCitMc3NzZTNfZGF0YToKKy5ieXRlCTIsMywwLDEsNiw3LDQsNSwxMCwxMSw4LDksMTQsMTUsMTIsMTMKKy5ieXRlCTMsMCwxLDIsNyw0LDUsNiwxMSw4LDksMTAsMTUsMTIsMTMsMTQKKy5sb25nCTE2MzQ3NjA4MDUsODU3NzYwODc4LDIwMzY0NzcyMzQsMTc5NzI4NTIzNgorLmxvbmcJMCwxLDIsMworLmxvbmcJNCw0LDQsNAorLmxvbmcJMSwwLDAsMAorLmxvbmcJNCwwLDAsMAorLmxvbmcJMCwtMSwtMSwtMQorLmFsaWduCTYsMHg5MAorLmJ5dGUJNjcsMTA0LDk3LDY3LDEwNCw5Nyw1MCw0OCwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQKKy5ieXRlCTQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMgorLmJ5dGUJNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEKKy5ieXRlCTExNCwxMDMsNjIsMAorLnNlY3Rpb24gX19JTVBPUlQsX19wb2ludGVycyxub25fbGF6eV9zeW1ib2xfcG9pbnRlcnMKK0xfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyOgorLmluZGlyZWN0X3N5bWJvbAlfT1BFTlNTTF9pYTMyY2FwX1AKKy5sb25nCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL2Flcy01ODYuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXMtNTg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5NTFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXMtNTg2LlMKQEAgLTAsMCArMSwzMjIwIEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisucHJpdmF0ZV9leHRlcm4JX194ODZfQUVTX2VuY3J5cHRfY29tcGFjdAorLmFsaWduCTQKK19feDg2X0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJbW92bAklZWRpLDIwKCVlc3ApCisJeG9ybAkoJWVkaSksJWVheAorCXhvcmwJNCglZWRpKSwlZWJ4CisJeG9ybAk4KCVlZGkpLCVlY3gKKwl4b3JsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCTI0MCglZWRpKSwlZXNpCisJbGVhbAktMiglZXNpLCVlc2ksMSksJWVzaQorCWxlYWwJKCVlZGksJWVzaSw4KSwlZXNpCisJbW92bAklZXNpLDI0KCVlc3ApCisJbW92bAktMTI4KCVlYnApLCVlZGkKKwltb3ZsCS05NiglZWJwKSwlZXNpCisJbW92bAktNjQoJWVicCksJWVkaQorCW1vdmwJLTMyKCVlYnApLCVlc2kKKwltb3ZsCSglZWJwKSwlZWRpCisJbW92bAkzMiglZWJwKSwlZXNpCisJbW92bAk2NCglZWJwKSwlZWRpCisJbW92bAk5NiglZWJwKSwlZXNpCisuYWxpZ24JNCwweDkwCitMMDAwbG9vcDoKKwltb3ZsCSVlYXgsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDgsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDE2LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMjQsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMjQsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZXNpLDQoJWVzcCkKKwltb3ZsCSVlYngsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJc2hybAkkMTYsJWVieAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZXNpCisJbW92emJsCSVjaCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQ4LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVzaSw4KCVlc3ApCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDI0LCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCWFuZGwJJDI1NSwlZWR4CisJbW92emJsCS0xMjgoJWVicCwlZWR4LDEpLCVlZHgKKwltb3Z6YmwJJWFoLCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlYXgsMSksJWVheAorCXNobGwJJDgsJWVheAorCXhvcmwJJWVheCwlZWR4CisJbW92bAk0KCVlc3ApLCVlYXgKKwlhbmRsCSQyNTUsJWVieAorCW1vdnpibAktMTI4KCVlYnAsJWVieCwxKSwlZWJ4CisJc2hsbAkkMTYsJWVieAorCXhvcmwJJWVieCwlZWR4CisJbW92bAk4KCVlc3ApLCVlYngKKwltb3Z6YmwJLTEyOCglZWJwLCVlY3gsMSksJWVjeAorCXNobGwJJDI0LCVlY3gKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVzaSwlZWN4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWN4LCVlYnAKKwlsZWFsCSglZWN4LCVlY3gsMSksJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJYW5kbAkkNDI3ODEyNDI4NiwlZWRpCisJc3VibAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9ybAkkMTYsJWVicAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwl4b3JsCSVlc2ksJWVjeAorCXJvcmwJJDI0LCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCXJvbGwJJDI0LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCXhvcmwJJWVzaSwlZWN4CisJYW5kbAklZWR4LCVlYnAKKwlsZWFsCSglZWR4LCVlZHgsMSksJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJYW5kbAkkNDI3ODEyNDI4NiwlZWRpCisJc3VibAklZWJwLCVlc2kKKwltb3ZsCSVlZHgsJWVicAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9ybAkkMTYsJWVicAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCXJvcmwJJDI0LCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCXJvbGwJJDI0LCVlZHgKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCXhvcmwJJWVzaSwlZWR4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCSglZWF4LCVlYXgsMSksJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJYW5kbAkkNDI3ODEyNDI4NiwlZWRpCisJc3VibAklZWJwLCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9ybAkkMTYsJWVicAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWF4LCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXJvcmwJJDI0LCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCXJvbGwJJDI0LCVlYXgKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCXhvcmwJJWVzaSwlZWF4CisJYW5kbAklZWJ4LCVlYnAKKwlsZWFsCSglZWJ4LCVlYngsMSksJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJYW5kbAkkNDI3ODEyNDI4NiwlZWRpCisJc3VibAklZWJwLCVlc2kKKwltb3ZsCSVlYngsJWVicAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9ybAkkMTYsJWVicAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDI0LCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCXJvbGwJJDI0LCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVzaSwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyOCglZXNwKSwlZWJwCisJYWRkbAkkMTYsJWVkaQorCXhvcmwJKCVlZGkpLCVlYXgKKwl4b3JsCTQoJWVkaSksJWVieAorCXhvcmwJOCglZWRpKSwlZWN4CisJeG9ybAkxMiglZWRpKSwlZWR4CisJY21wbAkyNCglZXNwKSwlZWRpCisJbW92bAklZWRpLDIwKCVlc3ApCisJamIJTDAwMGxvb3AKKwltb3ZsCSVlYXgsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDgsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDE2LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMjQsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMjQsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZXNpLDQoJWVzcCkKKwltb3ZsCSVlYngsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJc2hybAkkMTYsJWVieAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZXNpCisJbW92emJsCSVjaCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQ4LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVzaSw4KCVlc3ApCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDI0LCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCWFuZGwJJDI1NSwlZWR4CisJbW92emJsCS0xMjgoJWVicCwlZWR4LDEpLCVlZHgKKwltb3Z6YmwJJWFoLCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlYXgsMSksJWVheAorCXNobGwJJDgsJWVheAorCXhvcmwJJWVheCwlZWR4CisJbW92bAk0KCVlc3ApLCVlYXgKKwlhbmRsCSQyNTUsJWVieAorCW1vdnpibAktMTI4KCVlYnAsJWVieCwxKSwlZWJ4CisJc2hsbAkkMTYsJWVieAorCXhvcmwJJWVieCwlZWR4CisJbW92bAk4KCVlc3ApLCVlYngKKwltb3Z6YmwJLTEyOCglZWJwLCVlY3gsMSksJWVjeAorCXNobGwJJDI0LCVlY3gKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAkxNiglZWRpKSwlZWF4CisJeG9ybAkyMCglZWRpKSwlZWJ4CisJeG9ybAkyNCglZWRpKSwlZWN4CisJeG9ybAkyOCglZWRpKSwlZWR4CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX19zc2VfQUVTX2VuY3J5cHRfY29tcGFjdAorLmFsaWduCTQKK19fc3NlX0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJcHhvcgkoJWVkaSksJW1tMAorCXB4b3IJOCglZWRpKSwlbW00CisJbW92bAkyNDAoJWVkaSksJWVzaQorCWxlYWwJLTIoJWVzaSwlZXNpLDEpLCVlc2kKKwlsZWFsCSglZWRpLCVlc2ksOCksJWVzaQorCW1vdmwJJWVzaSwyNCglZXNwKQorCW1vdmwJJDQ1NDc2MTI0MywlZWF4CisJbW92bAklZWF4LDgoJWVzcCkKKwltb3ZsCSVlYXgsMTIoJWVzcCkKKwltb3ZsCS0xMjgoJWVicCksJWVheAorCW1vdmwJLTk2KCVlYnApLCVlYngKKwltb3ZsCS02NCglZWJwKSwlZWN4CisJbW92bAktMzIoJWVicCksJWVkeAorCW1vdmwJKCVlYnApLCVlYXgKKwltb3ZsCTMyKCVlYnApLCVlYngKKwltb3ZsCTY0KCVlYnApLCVlY3gKKwltb3ZsCTk2KCVlYnApLCVlZHgKKy5hbGlnbgk0LDB4OTAKK0wwMDFsb29wOgorCXBzaHVmdwkkOCwlbW0wLCVtbTEKKwlwc2h1ZncJJDEzLCVtbTQsJW1tNQorCW1vdmQJJW1tMSwlZWF4CisJbW92ZAklbW01LCVlYngKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwltb3Z6YmwJJWFsLCVlc2kKKwltb3Z6YmwJJWFoLCVlZHgKKwlwc2h1ZncJJDEzLCVtbTAsJW1tMgorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWN4CisJbW92emJsCSVibCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWR4LDEpLCVlZHgKKwlzaHJsCSQxNiwlZWF4CisJc2hsbAkkOCwlZWR4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwlzaGxsCSQxNiwlZXNpCisJcHNodWZ3CSQ4LCVtbTQsJW1tNgorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYWgsJWVkaQorCXNobGwJJDI0LCVlc2kKKwlzaHJsCSQxNiwlZWJ4CisJb3JsCSVlc2ksJWVkeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkOCwlZXNpCisJb3JsCSVlc2ksJWVjeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSVhbCwlZWRpCisJc2hsbAkkMjQsJWVzaQorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmwsJWVkaQorCW1vdmQJJW1tMiwlZWF4CisJbW92ZAklZWN4LCVtbTAKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVjeAorCW1vdnpibAklYWgsJWVkaQorCXNobGwJJDE2LCVlY3gKKwltb3ZkCSVtbTYsJWVieAorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCXNobGwJJDI0LCVlc2kKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWJsLCVlZGkKKwlzaGxsCSQ4LCVlc2kKKwlzaHJsCSQxNiwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSVhbCwlZWRpCisJc2hybAkkMTYsJWVheAorCW1vdmQJJWVjeCwlbW0xCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlY3gKKwltb3Z6YmwJJWFoLCVlZGkKKwlzaGxsCSQxNiwlZWN4CisJYW5kbAkkMjU1LCVlYXgKKwlvcmwJJWVzaSwlZWN4CisJcHVucGNrbGRxCSVtbTEsJW1tMAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkMjQsJWVzaQorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCS0xMjgoJWVicCwlZWF4LDEpLCVlYXgKKwlvcmwJJWVzaSwlZWN4CisJc2hsbAkkMTYsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJb3JsCSVlYXgsJWVkeAorCXNobGwJJDgsJWVzaQorCW1vdnpibAktMTI4KCVlYnAsJWVieCwxKSwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW9ybAklZWJ4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZkCSVlY3gsJW1tNAorCW1vdmQJJWVkeCwlbW01CisJcHVucGNrbGRxCSVtbTUsJW1tNAorCWFkZGwJJDE2LCVlZGkKKwljbXBsCTI0KCVlc3ApLCVlZGkKKwlqYQlMMDAyb3V0CisJbW92cQk4KCVlc3ApLCVtbTIKKwlweG9yCSVtbTMsJW1tMworCXB4b3IJJW1tNywlbW03CisJbW92cQklbW0wLCVtbTEKKwltb3ZxCSVtbTQsJW1tNQorCXBjbXBndGIJJW1tMCwlbW0zCisJcGNtcGd0YgklbW00LCVtbTcKKwlwYW5kCSVtbTIsJW1tMworCXBhbmQJJW1tMiwlbW03CisJcHNodWZ3CSQxNzcsJW1tMCwlbW0yCisJcHNodWZ3CSQxNzcsJW1tNCwlbW02CisJcGFkZGIJJW1tMCwlbW0wCisJcGFkZGIJJW1tNCwlbW00CisJcHhvcgklbW0zLCVtbTAKKwlweG9yCSVtbTcsJW1tNAorCXBzaHVmdwkkMTc3LCVtbTIsJW1tMworCXBzaHVmdwkkMTc3LCVtbTYsJW1tNworCXB4b3IJJW1tMCwlbW0xCisJcHhvcgklbW00LCVtbTUKKwlweG9yCSVtbTIsJW1tMAorCXB4b3IJJW1tNiwlbW00CisJbW92cQklbW0zLCVtbTIKKwltb3ZxCSVtbTcsJW1tNgorCXBzbGxkCSQ4LCVtbTMKKwlwc2xsZAkkOCwlbW03CisJcHNybGQJJDI0LCVtbTIKKwlwc3JsZAkkMjQsJW1tNgorCXB4b3IJJW1tMywlbW0wCisJcHhvcgklbW03LCVtbTQKKwlweG9yCSVtbTIsJW1tMAorCXB4b3IJJW1tNiwlbW00CisJbW92cQklbW0xLCVtbTMKKwltb3ZxCSVtbTUsJW1tNworCW1vdnEJKCVlZGkpLCVtbTIKKwltb3ZxCTgoJWVkaSksJW1tNgorCXBzcmxkCSQ4LCVtbTEKKwlwc3JsZAkkOCwlbW01CisJbW92bAktMTI4KCVlYnApLCVlYXgKKwlwc2xsZAkkMjQsJW1tMworCXBzbGxkCSQyNCwlbW03CisJbW92bAktNjQoJWVicCksJWVieAorCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW01LCVtbTQKKwltb3ZsCSglZWJwKSwlZWN4CisJcHhvcgklbW0zLCVtbTAKKwlweG9yCSVtbTcsJW1tNAorCW1vdmwJNjQoJWVicCksJWVkeAorCXB4b3IJJW1tMiwlbW0wCisJcHhvcgklbW02LCVtbTQKKwlqbXAJTDAwMWxvb3AKKy5hbGlnbgk0LDB4OTAKK0wwMDJvdXQ6CisJcHhvcgkoJWVkaSksJW1tMAorCXB4b3IJOCglZWRpKSwlbW00CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX194ODZfQUVTX2VuY3J5cHQKKy5hbGlnbgk0CitfX3g4Nl9BRVNfZW5jcnlwdDoKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCW1vdmwJMjQwKCVlZGkpLCVlc2kKKwlsZWFsCS0yKCVlc2ksJWVzaSwxKSwlZXNpCisJbGVhbAkoJWVkaSwlZXNpLDgpLCVlc2kKKwltb3ZsCSVlc2ksMjQoJWVzcCkKKy5hbGlnbgk0LDB4OTAKK0wwMDNsb29wOgorCW1vdmwJJWVheCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3ZsCSglZWJwLCVlc2ksOCksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCXhvcmwJMyglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJeG9ybAkyKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJeG9ybAkxKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZXNpLDQoJWVzcCkKKwltb3ZsCSVlYngsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJc2hybAkkMTYsJWVieAorCW1vdmwJKCVlYnAsJWVzaSw4KSwlZXNpCisJbW92emJsCSVjaCwlZWRpCisJeG9ybAkzKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwl4b3JsCTIoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwl4b3JsCTEoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlc2ksOCglZXNwKQorCW1vdmwJJWVjeCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwlzaHJsCSQyNCwlZWN4CisJbW92bAkoJWVicCwlZXNpLDgpLCVlc2kKKwltb3Z6YmwJJWRoLCVlZGkKKwl4b3JsCTMoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCWFuZGwJJDI1NSwlZWRpCisJeG9ybAkyKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJeG9ybAkxKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkoJWVicCwlZWR4LDgpLCVlZHgKKwltb3Z6YmwJJWFoLCVlYXgKKwl4b3JsCTMoJWVicCwlZWF4LDgpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFuZGwJJDI1NSwlZWJ4CisJeG9ybAkyKCVlYnAsJWVieCw4KSwlZWR4CisJbW92bAk4KCVlc3ApLCVlYngKKwl4b3JsCTEoJWVicCwlZWN4LDgpLCVlZHgKKwltb3ZsCSVlc2ksJWVjeAorCWFkZGwJJDE2LCVlZGkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCWNtcGwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVkaSwyMCglZXNwKQorCWpiCUwwMDNsb29wCisJbW92bAklZWF4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdmwJMiglZWJwLCVlc2ksOCksJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJbW92bAkoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQ2NTI4MCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdmwJKCVlYnAsJWVkaSw4KSwlZWRpCisJYW5kbAkkMTY3MTE2ODAsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92bAkyKCVlYnAsJWVkaSw4KSwlZWRpCisJYW5kbAkkNDI3ODE5MDA4MCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCW1vdmwJJWVieCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwlzaHJsCSQxNiwlZWJ4CisJbW92bAkyKCVlYnAsJWVzaSw4KSwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJJWNoLCVlZGkKKwltb3ZsCSglZWJwLCVlZGksOCksJWVkaQorCWFuZGwJJDY1MjgwLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92bAkoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQxNjcxMTY4MCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3ZsCTIoJWVicCwlZWRpLDgpLCVlZGkKKwlhbmRsCSQ0Mjc4MTkwMDgwLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVzaSw4KCVlc3ApCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCXNocmwJJDI0LCVlY3gKKwltb3ZsCTIoJWVicCwlZXNpLDgpLCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdmwJKCVlYnAsJWVkaSw4KSwlZWRpCisJYW5kbAkkNjUyODAsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZHgKKwlhbmRsCSQyNTUsJWVkaQorCW1vdmwJKCVlYnAsJWVkaSw4KSwlZWRpCisJYW5kbAkkMTY3MTE2ODAsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJbW92bAkyKCVlYnAsJWVkaSw4KSwlZWRpCisJYW5kbAkkNDI3ODE5MDA4MCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlhbmRsCSQyNTUsJWVkeAorCW1vdmwJMiglZWJwLCVlZHgsOCksJWVkeAorCWFuZGwJJDI1NSwlZWR4CisJbW92emJsCSVhaCwlZWF4CisJbW92bAkoJWVicCwlZWF4LDgpLCVlYXgKKwlhbmRsCSQ2NTI4MCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFuZGwJJDI1NSwlZWJ4CisJbW92bAkoJWVicCwlZWJ4LDgpLCVlYngKKwlhbmRsCSQxNjcxMTY4MCwlZWJ4CisJeG9ybAklZWJ4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVieAorCW1vdmwJMiglZWJwLCVlY3gsOCksJWVjeAorCWFuZGwJJDQyNzgxOTAwODAsJWVjeAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZXNpLCVlY3gKKwlhZGRsCSQxNiwlZWRpCisJeG9ybAkoJWVkaSksJWVheAorCXhvcmwJNCglZWRpKSwlZWJ4CisJeG9ybAk4KCVlZGkpLCVlY3gKKwl4b3JsCTEyKCVlZGkpLCVlZHgKKwlyZXQKKy5hbGlnbgk2LDB4OTAKK0xBRVNfVGU6CisubG9uZwkyNzc0NzU0MjQ2LDI3NzQ3NTQyNDYKKy5sb25nCTIyMjI3NTA5NjgsMjIyMjc1MDk2OAorLmxvbmcJMjU3NDc0MzUzNCwyNTc0NzQzNTM0CisubG9uZwkyMzczNjgwMTE4LDIzNzM2ODAxMTgKKy5sb25nCTIzNDAyNTcyNywyMzQwMjU3MjcKKy5sb25nCTMxNzc5MzM3ODIsMzE3NzkzMzc4MgorLmxvbmcJMjk3Njg3MDM2NiwyOTc2ODcwMzY2CisubG9uZwkxNDIyMjQ3MzEzLDE0MjIyNDczMTMKKy5sb25nCTEzNDUzMzUzOTIsMTM0NTMzNTM5MgorLmxvbmcJNTAzOTc0NDIsNTAzOTc0NDIKKy5sb25nCTI4NDIxMjYyODYsMjg0MjEyNjI4NgorLmxvbmcJMjA5OTk4MTE0MiwyMDk5OTgxMTQyCisubG9uZwk0MzYxNDE3OTksNDM2MTQxNzk5CisubG9uZwkxNjU4MzEyNjI5LDE2NTgzMTI2MjkKKy5sb25nCTM4NzAwMTAxODksMzg3MDAxMDE4OQorLmxvbmcJMjU5MTQ1NDk1NiwyNTkxNDU0OTU2CisubG9uZwkxMTcwOTE4MDMxLDExNzA5MTgwMzEKKy5sb25nCTI2NDI1NzU5MDMsMjY0MjU3NTkwMworLmxvbmcJMTA4Njk2NjE1MywxMDg2OTY2MTUzCisubG9uZwkyMjczMTQ4NDEwLDIyNzMxNDg0MTAKKy5sb25nCTM2ODc2OTc3NSwzNjg3Njk3NzUKKy5sb25nCTM5NDg1MDE0MjYsMzk0ODUwMTQyNgorLmxvbmcJMzM3Njg5MTc5MCwzMzc2ODkxNzkwCisubG9uZwkyMDAzMzk3MDcsMjAwMzM5NzA3CisubG9uZwkzOTcwODA1MDU3LDM5NzA4MDUwNTcKKy5sb25nCTE3NDIwMDEzMzEsMTc0MjAwMTMzMQorLmxvbmcJNDI1NTI5NDA0Nyw0MjU1Mjk0MDQ3CisubG9uZwkzOTM3MzgyMjEzLDM5MzczODIyMTMKKy5sb25nCTMyMTQ3MTE4NDMsMzIxNDcxMTg0MworLmxvbmcJNDE1NDc2MjMyMyw0MTU0NzYyMzIzCisubG9uZwkyNTI0MDgyOTE2LDI1MjQwODI5MTYKKy5sb25nCTE1MzkzNTg4NzUsMTUzOTM1ODg3NQorLmxvbmcJMzI2NjgxOTk1NywzMjY2ODE5OTU3CisubG9uZwk0ODY0MDc2NDksNDg2NDA3NjQ5CisubG9uZwkyOTI4OTA3MDY5LDI5Mjg5MDcwNjkKKy5sb25nCTE3ODA4ODUwNjgsMTc4MDg4NTA2OAorLmxvbmcJMTUxMzUwMjMxNiwxNTEzNTAyMzE2CisubG9uZwkxMDk0NjY0MDYyLDEwOTQ2NjQwNjIKKy5sb25nCTQ5ODA1MzAxLDQ5ODA1MzAxCisubG9uZwkxMzM4ODIxNzYzLDEzMzg4MjE3NjMKKy5sb25nCTE1NDY5MjUxNjAsMTU0NjkyNTE2MAorLmxvbmcJNDEwNDQ5NjQ2NSw0MTA0NDk2NDY1CisubG9uZwk4ODc0ODE4MDksODg3NDgxODA5CisubG9uZwkxNTAwNzM4NDksMTUwMDczODQ5CisubG9uZwkyNDczNjg1NDc0LDI0NzM2ODU0NzQKKy5sb25nCTE5NDM1OTEwODMsMTk0MzU5MTA4MworLmxvbmcJMTM5NTczMjgzNCwxMzk1NzMyODM0CisubG9uZwkxMDU4MzQ2MjgyLDEwNTgzNDYyODIKKy5sb25nCTIwMTU4OTc2OCwyMDE1ODk3NjgKKy5sb25nCTEzODg4MjQ0NjksMTM4ODgyNDQ2OQorLmxvbmcJMTY5NjgwMTYwNiwxNjk2ODAxNjA2CisubG9uZwkxNTg5ODg3OTAxLDE1ODk4ODc5MDEKKy5sb25nCTY3MjY2NzY5Niw2NzI2Njc2OTYKKy5sb25nCTI3MTEwMDA2MzEsMjcxMTAwMDYzMQorLmxvbmcJMjUxOTg3MjEwLDI1MTk4NzIxMAorLmxvbmcJMzA0NjgwODExMSwzMDQ2ODA4MTExCisubG9uZwkxNTE0NTU1MDIsMTUxNDU1NTAyCisubG9uZwk5MDcxNTM5NTYsOTA3MTUzOTU2CisubG9uZwkyNjA4ODg5ODgzLDI2MDg4ODk4ODMKKy5sb25nCTEwMzgyNzkzOTEsMTAzODI3OTM5MQorLmxvbmcJNjUyOTk1NTMzLDY1Mjk5NTUzMworLmxvbmcJMTc2NDE3MzY0NiwxNzY0MTczNjQ2CisubG9uZwkzNDUxMDQwMzgzLDM0NTEwNDAzODMKKy5sb25nCTI2NzUyNzUyNDIsMjY3NTI3NTI0MgorLmxvbmcJNDUzNTc2OTc4LDQ1MzU3Njk3OAorLmxvbmcJMjY1OTQxODkwOSwyNjU5NDE4OTA5CisubG9uZwkxOTQ5MDUxOTkyLDE5NDkwNTE5OTIKKy5sb25nCTc3MzQ2MjU4MCw3NzM0NjI1ODAKKy5sb25nCTc1Njc1MTE1OCw3NTY3NTExNTgKKy5sb25nCTI5OTM1ODE3ODgsMjk5MzU4MTc4OAorLmxvbmcJMzk5ODg5ODg2OCwzOTk4ODk4ODY4CisubG9uZwk0MjIxNjA4MDI3LDQyMjE2MDgwMjcKKy5sb25nCTQxMzI1OTAyNDQsNDEzMjU5MDI0NAorLmxvbmcJMTI5NTcyNzQ3OCwxMjk1NzI3NDc4CisubG9uZwkxNjQxNDY5NjIzLDE2NDE0Njk2MjMKKy5sb25nCTM0Njc4ODMzODksMzQ2Nzg4MzM4OQorLmxvbmcJMjA2NjI5NTEyMiwyMDY2Mjk1MTIyCisubG9uZwkxMDU1MTIyMzk3LDEwNTUxMjIzOTcKKy5sb25nCTE4OTg5MTc3MjYsMTg5ODkxNzcyNgorLmxvbmcJMjU0MjA0NDE3OSwyNTQyMDQ0MTc5CisubG9uZwk0MTE1ODc4ODIyLDQxMTU4Nzg4MjIKKy5sb25nCTE3NTg1ODExNzcsMTc1ODU4MTE3NworLmxvbmcJMCwwCisubG9uZwk3NTM3OTA0MDEsNzUzNzkwNDAxCisubG9uZwkxNjEyNzE4MTQ0LDE2MTI3MTgxNDQKKy5sb25nCTUzNjY3MzUwNyw1MzY2NzM1MDcKKy5sb25nCTMzNjcwODg1MDUsMzM2NzA4ODUwNQorLmxvbmcJMzk4MjE4NzQ0NiwzOTgyMTg3NDQ2CisubG9uZwkzMTk0NjQ1MjA0LDMxOTQ2NDUyMDQKKy5sb25nCTExODc3NjEwMzcsMTE4Nzc2MTAzNworLmxvbmcJMzY1MzE1NjQ1NSwzNjUzMTU2NDU1CisubG9uZwkxMjYyMDQxNDU4LDEyNjIwNDE0NTgKKy5sb25nCTM3Mjk0MTA3MDgsMzcyOTQxMDcwOAorLmxvbmcJMzU2MTc3MDEzNiwzNTYxNzcwMTM2CisubG9uZwkzODk4MTAzOTg0LDM4OTgxMDM5ODQKKy5sb25nCTEyNTUxMzMwNjEsMTI1NTEzMzA2MQorLmxvbmcJMTgwODg0NzAzNSwxODA4ODQ3MDM1CisubG9uZwk3MjAzNjc1NTcsNzIwMzY3NTU3CisubG9uZwkzODUzMTY3MTgzLDM4NTMxNjcxODMKKy5sb25nCTM4NTYxMjc4MSwzODU2MTI3ODEKKy5sb25nCTMzMDk1MTk3NTAsMzMwOTUxOTc1MAorLmxvbmcJMzYxMjE2NzU3OCwzNjEyMTY3NTc4CisubG9uZwkxNDI5NDE4ODU0LDE0Mjk0MTg4NTQKKy5sb25nCTI0OTE3NzgzMjEsMjQ5MTc3ODMyMQorLmxvbmcJMzQ3NzQyMzQ5OCwzNDc3NDIzNDk4CisubG9uZwkyODQ4MTc4OTcsMjg0ODE3ODk3CisubG9uZwkxMDA3OTQ4ODQsMTAwNzk0ODg0CisubG9uZwkyMTcyNjE2NzAyLDIxNzI2MTY3MDIKKy5sb25nCTQwMzE3OTUzNjAsNDAzMTc5NTM2MAorLmxvbmcJMTE0NDc5ODMyOCwxMTQ0Nzk4MzI4CisubG9uZwkzMTMxMDIzMTQxLDMxMzEwMjMxNDEKKy5sb25nCTM4MTk0ODExNjMsMzgxOTQ4MTE2MworLmxvbmcJNDA4MjE5MjgwMiw0MDgyMTkyODAyCisubG9uZwk0MjcyMTM3MDUzLDQyNzIxMzcwNTMKKy5sb25nCTMyMjU0MzYyODgsMzIyNTQzNjI4OAorLmxvbmcJMjMyNDY2NDA2OSwyMzI0NjY0MDY5CisubG9uZwkyOTEyMDY0MDYzLDI5MTIwNjQwNjMKKy5sb25nCTMxNjQ0NDU5ODUsMzE2NDQ0NTk4NQorLmxvbmcJMTIxMTY0NDAxNiwxMjExNjQ0MDE2CisubG9uZwk4MzIyODE0NSw4MzIyODE0NQorLmxvbmcJMzc1MzY4ODE2MywzNzUzNjg4MTYzCisubG9uZwkzMjQ5OTc2OTUxLDMyNDk5NzY5NTEKKy5sb25nCTE5NzcyNzcxMDMsMTk3NzI3NzEwMworLmxvbmcJMTY2MzExNTU4NiwxNjYzMTE1NTg2CisubG9uZwk4MDYzNTkwNzIsODA2MzU5MDcyCisubG9uZwk0NTI5ODQ4MDUsNDUyOTg0ODA1CisubG9uZwkyNTA4Njg3MzMsMjUwODY4NzMzCisubG9uZwkxODQyNTMzMDU1LDE4NDI1MzMwNTUKKy5sb25nCTEyODg1NTU5MDUsMTI4ODU1NTkwNQorLmxvbmcJMzM2MzMzODQ4LDMzNjMzMzg0OAorLmxvbmcJODkwNDQyNTM0LDg5MDQ0MjUzNAorLmxvbmcJODA0MDU2MjU5LDgwNDA1NjI1OQorLmxvbmcJMzc4MTEyNDAzMCwzNzgxMTI0MDMwCisubG9uZwkyNzI3ODQzNjM3LDI3Mjc4NDM2MzcKKy5sb25nCTM0MjcwMjYwNTYsMzQyNzAyNjA1NgorLmxvbmcJOTU3ODE0NTc0LDk1NzgxNDU3NAorLmxvbmcJMTQ3MjUxMzE3MSwxNDcyNTEzMTcxCisubG9uZwk0MDcxMDczNjIxLDQwNzEwNzM2MjEKKy5sb25nCTIxODkzMjgxMjQsMjE4OTMyODEyNAorLmxvbmcJMTE5NTE5NTc3MCwxMTk1MTk1NzcwCisubG9uZwkyODkyMjYwNTUyLDI4OTIyNjA1NTIKKy5sb25nCTM4ODE2NTU3MzgsMzg4MTY1NTczOAorLmxvbmcJNzIzMDY1MTM4LDcyMzA2NTEzOAorLmxvbmcJMjUwNzM3MTQ5NCwyNTA3MzcxNDk0CisubG9uZwkyNjkwNjcwNzg0LDI2OTA2NzA3ODQKKy5sb25nCTI1NTg2MjQwMjUsMjU1ODYyNDAyNQorLmxvbmcJMzUxMTYzNTg3MCwzNTExNjM1ODcwCisubG9uZwkyMTQ1MTgwODM1LDIxNDUxODA4MzUKKy5sb25nCTE3MTM1MTMwMjgsMTcxMzUxMzAyOAorLmxvbmcJMjExNjY5MjU2NCwyMTE2NjkyNTY0CisubG9uZwkyODc4Mzc4MDQzLDI4NzgzNzgwNDMKKy5sb25nCTIyMDY3NjMwMTksMjIwNjc2MzAxOQorLmxvbmcJMzM5MzYwMzIxMiwzMzkzNjAzMjEyCisubG9uZwk3MDM1MjQ1NTEsNzAzNTI0NTUxCisubG9uZwkzNTUyMDk4NDExLDM1NTIwOTg0MTEKKy5sb25nCTEwMDc5NDg4NDAsMTAwNzk0ODg0MAorLmxvbmcJMjA0NDY0OTEyNywyMDQ0NjQ5MTI3CisubG9uZwkzNzk3ODM1NDUyLDM3OTc4MzU0NTIKKy5sb25nCTQ4NzI2Mjk5OCw0ODcyNjI5OTgKKy5sb25nCTE5OTQxMjAxMDksMTk5NDEyMDEwOQorLmxvbmcJMTAwNDU5MzM3MSwxMDA0NTkzMzcxCisubG9uZwkxNDQ2MTMwMjc2LDE0NDYxMzAyNzYKKy5sb25nCTEzMTI0Mzg5MDAsMTMxMjQzODkwMAorLmxvbmcJNTAzOTc0NDIwLDUwMzk3NDQyMAorLmxvbmcJMzY3OTAxMzI2NiwzNjc5MDEzMjY2CisubG9uZwkxNjgxNjY5MjQsMTY4MTY2OTI0CisubG9uZwkxODE0MzA3OTEyLDE4MTQzMDc5MTIKKy5sb25nCTM4MzEyNTgyOTYsMzgzMTI1ODI5NgorLmxvbmcJMTU3MzA0NDg5NSwxNTczMDQ0ODk1CisubG9uZwkxODU5Mzc2MDYxLDE4NTkzNzYwNjEKKy5sb25nCTQwMjEwNzA5MTUsNDAyMTA3MDkxNQorLmxvbmcJMjc5MTQ2NTY2OCwyNzkxNDY1NjY4CisubG9uZwkyODI4MTEyMTg1LDI4MjgxMTIxODUKKy5sb25nCTI3NjEyNjY0ODEsMjc2MTI2NjQ4MQorLmxvbmcJOTM3NzQ3NjY3LDkzNzc0NzY2NworLmxvbmcJMjMzOTk5NDA5OCwyMzM5OTk0MDk4CisubG9uZwk4NTQwNTg5NjUsODU0MDU4OTY1CisubG9uZwkxMTM3MjMyMDExLDExMzcyMzIwMTEKKy5sb25nCTE0OTY3OTA4OTQsMTQ5Njc5MDg5NAorLmxvbmcJMzA3NzQwMjA3NCwzMDc3NDAyMDc0CisubG9uZwkyMzU4MDg2OTEzLDIzNTgwODY5MTMKKy5sb25nCTE2OTE3MzU0NzMsMTY5MTczNTQ3MworLmxvbmcJMzUyODM0NzI5MiwzNTI4MzQ3MjkyCisubG9uZwkzNzY5MjE1MzA1LDM3NjkyMTUzMDUKKy5sb25nCTMwMjcwMDQ2MzIsMzAyNzAwNDYzMgorLmxvbmcJNDE5OTk2MjI4NCw0MTk5OTYyMjg0CisubG9uZwkxMzM0OTQwMDMsMTMzNDk0MDAzCisubG9uZwk2MzYxNTI1MjcsNjM2MTUyNTI3CisubG9uZwkyOTQyNjU3OTk0LDI5NDI2NTc5OTQKKy5sb25nCTIzOTAzOTE1NDAsMjM5MDM5MTU0MAorLmxvbmcJMzkyMDUzOTIwNywzOTIwNTM5MjA3CisubG9uZwk0MDMxNzk1MzYsNDAzMTc5NTM2CisubG9uZwkzNTg1Nzg0NDMxLDM1ODU3ODQ0MzEKKy5sb25nCTIyODk1OTY2NTYsMjI4OTU5NjY1NgorLmxvbmcJMTg2NDcwNTM1NCwxODY0NzA1MzU0CisubG9uZwkxOTE1NjI5MTQ4LDE5MTU2MjkxNDgKKy5sb25nCTYwNTgyMjAwOCw2MDU4MjIwMDgKKy5sb25nCTQwNTQyMzA2MTUsNDA1NDIzMDYxNQorLmxvbmcJMzM1MDUwODY1OSwzMzUwNTA4NjU5CisubG9uZwkxMzcxOTgxNDYzLDEzNzE5ODE0NjMKKy5sb25nCTYwMjQ2NjUwNyw2MDI0NjY1MDcKKy5sb25nCTIwOTQ5MTQ5NzcsMjA5NDkxNDk3NworLmxvbmcJMjYyNDg3NzgwMCwyNjI0ODc3ODAwCisubG9uZwk1NTU2ODc3NDIsNTU1Njg3NzQyCisubG9uZwkzNzEyNjk5Mjg2LDM3MTI2OTkyODYKKy5sb25nCTM3MDM0MjIzMDUsMzcwMzQyMjMwNQorLmxvbmcJMjI1NzI5MjA0NSwyMjU3MjkyMDQ1CisubG9uZwkyMjQwNDQ5MDM5LDIyNDA0NDkwMzkKKy5sb25nCTI0MjMyODgwMzIsMjQyMzI4ODAzMgorLmxvbmcJMTExMTM3NTQ4NCwxMTExMzc1NDg0CisubG9uZwkzMzAwMjQyODAxLDMzMDAyNDI4MDEKKy5sb25nCTI4NTg4Mzc3MDgsMjg1ODgzNzcwOAorLmxvbmcJMzYyODYxNTgyNCwzNjI4NjE1ODI0CisubG9uZwk4NDA4MzQ2Miw4NDA4MzQ2MgorLmxvbmcJMzI5NjIyOTUsMzI5NjIyOTUKKy5sb25nCTMwMjkxMTAwNCwzMDI5MTEwMDQKKy5sb25nCTI3NDEwNjgyMjYsMjc0MTA2ODIyNgorLmxvbmcJMTU5NzMyMjYwMiwxNTk3MzIyNjAyCisubG9uZwk0MTgzMjUwODYyLDQxODMyNTA4NjIKKy5sb25nCTM1MDE4MzI1NTMsMzUwMTgzMjU1MworLmxvbmcJMjQ0MTUxMjQ3MSwyNDQxNTEyNDcxCisubG9uZwkxNDg5MDkzMDE3LDE0ODkwOTMwMTcKKy5sb25nCTY1NjIxOTQ1MCw2NTYyMTk0NTAKKy5sb25nCTMxMTQxODAxMzUsMzExNDE4MDEzNQorLmxvbmcJOTU0MzI3NTEzLDk1NDMyNzUxMworLmxvbmcJMzM1MDgzNzU1LDMzNTA4Mzc1NQorLmxvbmcJMzAxMzEyMjA5MSwzMDEzMTIyMDkxCisubG9uZwk4NTY3NTY1MTQsODU2NzU2NTE0CisubG9uZwkzMTQ0MjQ3NzYyLDMxNDQyNDc3NjIKKy5sb25nCTE4OTMzMjUyMjUsMTg5MzMyNTIyNQorLmxvbmcJMjMwNzgyMTA2MywyMzA3ODIxMDYzCisubG9uZwkyODExNTMyMzM5LDI4MTE1MzIzMzkKKy5sb25nCTMwNjM2NTExMTcsMzA2MzY1MTExNworLmxvbmcJNTcyMzk5MTY0LDU3MjM5OTE2NAorLmxvbmcJMjQ1ODM1NTQ3NywyNDU4MzU1NDc3CisubG9uZwk1NTIyMDA2NDksNTUyMjAwNjQ5CisubG9uZwkxMjM4MjkwMDU1LDEyMzgyOTAwNTUKKy5sb25nCTQyODM3ODI1NzAsNDI4Mzc4MjU3MAorLmxvbmcJMjAxNTg5NzY4MCwyMDE1ODk3NjgwCisubG9uZwkyMDYxNDkyMTMzLDIwNjE0OTIxMzMKKy5sb25nCTI0MDgzNTI3NzEsMjQwODM1Mjc3MQorLmxvbmcJNDE3MTM0MjE2OSw0MTcxMzQyMTY5CisubG9uZwkyMTU2NDk3MTYxLDIxNTY0OTcxNjEKKy5sb25nCTM4NjczMTI5MCwzODY3MzEyOTAKKy5sb25nCTM2Njk5OTk0NjEsMzY2OTk5OTQ2MQorLmxvbmcJODM3MjE1OTU5LDgzNzIxNTk1OQorLmxvbmcJMzMyNjIzMTE3MiwzMzI2MjMxMTcyCisubG9uZwkzMDkzODUwMzIwLDMwOTM4NTAzMjAKKy5sb25nCTMyNzU4MzM3MzAsMzI3NTgzMzczMAorLmxvbmcJMjk2Mjg1NjIzMywyOTYyODU2MjMzCisubG9uZwkxOTk5NDQ5NDM0LDE5OTk0NDk0MzQKKy5sb25nCTI4NjE5OTU4MiwyODYxOTk1ODIKKy5sb25nCTM0MTczNTQzNjMsMzQxNzM1NDM2MworLmxvbmcJNDIzMzM4NTEyOCw0MjMzMzg1MTI4CisubG9uZwkzNjAyNjI3NDM3LDM2MDI2Mjc0MzcKKy5sb25nCTk3NDUyNTk5Niw5NzQ1MjU5OTYKKy5ieXRlCTk5LDEyNCwxMTksMTIzLDI0MiwxMDcsMTExLDE5NworLmJ5dGUJNDgsMSwxMDMsNDMsMjU0LDIxNSwxNzEsMTE4CisuYnl0ZQkyMDIsMTMwLDIwMSwxMjUsMjUwLDg5LDcxLDI0MAorLmJ5dGUJMTczLDIxMiwxNjIsMTc1LDE1NiwxNjQsMTE0LDE5MgorLmJ5dGUJMTgzLDI1MywxNDcsMzgsNTQsNjMsMjQ3LDIwNAorLmJ5dGUJNTIsMTY1LDIyOSwyNDEsMTEzLDIxNiw0OSwyMQorLmJ5dGUJNCwxOTksMzUsMTk1LDI0LDE1MCw1LDE1NAorLmJ5dGUJNywxOCwxMjgsMjI2LDIzNSwzOSwxNzgsMTE3CisuYnl0ZQk5LDEzMSw0NCwyNiwyNywxMTAsOTAsMTYwCisuYnl0ZQk4Miw1OSwyMTQsMTc5LDQxLDIyNyw0NywxMzIKKy5ieXRlCTgzLDIwOSwwLDIzNywzMiwyNTIsMTc3LDkxCisuYnl0ZQkxMDYsMjAzLDE5MCw1Nyw3NCw3Niw4OCwyMDcKKy5ieXRlCTIwOCwyMzksMTcwLDI1MSw2Nyw3Nyw1MSwxMzMKKy5ieXRlCTY5LDI0OSwyLDEyNyw4MCw2MCwxNTksMTY4CisuYnl0ZQk4MSwxNjMsNjQsMTQzLDE0NiwxNTcsNTYsMjQ1CisuYnl0ZQkxODgsMTgyLDIxOCwzMywxNiwyNTUsMjQzLDIxMAorLmJ5dGUJMjA1LDEyLDE5LDIzNiw5NSwxNTEsNjgsMjMKKy5ieXRlCTE5NiwxNjcsMTI2LDYxLDEwMCw5MywyNSwxMTUKKy5ieXRlCTk2LDEyOSw3OSwyMjAsMzQsNDIsMTQ0LDEzNgorLmJ5dGUJNzAsMjM4LDE4NCwyMCwyMjIsOTQsMTEsMjE5CisuYnl0ZQkyMjQsNTAsNTgsMTAsNzMsNiwzNiw5MgorLmJ5dGUJMTk0LDIxMSwxNzIsOTgsMTQ1LDE0OSwyMjgsMTIxCisuYnl0ZQkyMzEsMjAwLDU1LDEwOSwxNDEsMjEzLDc4LDE2OQorLmJ5dGUJMTA4LDg2LDI0NCwyMzQsMTAxLDEyMiwxNzQsOAorLmJ5dGUJMTg2LDEyMCwzNyw0NiwyOCwxNjYsMTgwLDE5OAorLmJ5dGUJMjMyLDIyMSwxMTYsMzEsNzUsMTg5LDEzOSwxMzgKKy5ieXRlCTExMiw2MiwxODEsMTAyLDcyLDMsMjQ2LDE0CisuYnl0ZQk5Nyw1Myw4NywxODUsMTM0LDE5MywyOSwxNTgKKy5ieXRlCTIyNSwyNDgsMTUyLDE3LDEwNSwyMTcsMTQyLDE0OAorLmJ5dGUJMTU1LDMwLDEzNSwyMzMsMjA2LDg1LDQwLDIyMworLmJ5dGUJMTQwLDE2MSwxMzcsMTMsMTkxLDIzMCw2NiwxMDQKKy5ieXRlCTY1LDE1Myw0NSwxNSwxNzYsODQsMTg3LDIyCisuYnl0ZQk5OSwxMjQsMTE5LDEyMywyNDIsMTA3LDExMSwxOTcKKy5ieXRlCTQ4LDEsMTAzLDQzLDI1NCwyMTUsMTcxLDExOAorLmJ5dGUJMjAyLDEzMCwyMDEsMTI1LDI1MCw4OSw3MSwyNDAKKy5ieXRlCTE3MywyMTIsMTYyLDE3NSwxNTYsMTY0LDExNCwxOTIKKy5ieXRlCTE4MywyNTMsMTQ3LDM4LDU0LDYzLDI0NywyMDQKKy5ieXRlCTUyLDE2NSwyMjksMjQxLDExMywyMTYsNDksMjEKKy5ieXRlCTQsMTk5LDM1LDE5NSwyNCwxNTAsNSwxNTQKKy5ieXRlCTcsMTgsMTI4LDIyNiwyMzUsMzksMTc4LDExNworLmJ5dGUJOSwxMzEsNDQsMjYsMjcsMTEwLDkwLDE2MAorLmJ5dGUJODIsNTksMjE0LDE3OSw0MSwyMjcsNDcsMTMyCisuYnl0ZQk4MywyMDksMCwyMzcsMzIsMjUyLDE3Nyw5MQorLmJ5dGUJMTA2LDIwMywxOTAsNTcsNzQsNzYsODgsMjA3CisuYnl0ZQkyMDgsMjM5LDE3MCwyNTEsNjcsNzcsNTEsMTMzCisuYnl0ZQk2OSwyNDksMiwxMjcsODAsNjAsMTU5LDE2OAorLmJ5dGUJODEsMTYzLDY0LDE0MywxNDYsMTU3LDU2LDI0NQorLmJ5dGUJMTg4LDE4MiwyMTgsMzMsMTYsMjU1LDI0MywyMTAKKy5ieXRlCTIwNSwxMiwxOSwyMzYsOTUsMTUxLDY4LDIzCisuYnl0ZQkxOTYsMTY3LDEyNiw2MSwxMDAsOTMsMjUsMTE1CisuYnl0ZQk5NiwxMjksNzksMjIwLDM0LDQyLDE0NCwxMzYKKy5ieXRlCTcwLDIzOCwxODQsMjAsMjIyLDk0LDExLDIxOQorLmJ5dGUJMjI0LDUwLDU4LDEwLDczLDYsMzYsOTIKKy5ieXRlCTE5NCwyMTEsMTcyLDk4LDE0NSwxNDksMjI4LDEyMQorLmJ5dGUJMjMxLDIwMCw1NSwxMDksMTQxLDIxMyw3OCwxNjkKKy5ieXRlCTEwOCw4NiwyNDQsMjM0LDEwMSwxMjIsMTc0LDgKKy5ieXRlCTE4NiwxMjAsMzcsNDYsMjgsMTY2LDE4MCwxOTgKKy5ieXRlCTIzMiwyMjEsMTE2LDMxLDc1LDE4OSwxMzksMTM4CisuYnl0ZQkxMTIsNjIsMTgxLDEwMiw3MiwzLDI0NiwxNAorLmJ5dGUJOTcsNTMsODcsMTg1LDEzNCwxOTMsMjksMTU4CisuYnl0ZQkyMjUsMjQ4LDE1MiwxNywxMDUsMjE3LDE0MiwxNDgKKy5ieXRlCTE1NSwzMCwxMzUsMjMzLDIwNiw4NSw0MCwyMjMKKy5ieXRlCTE0MCwxNjEsMTM3LDEzLDE5MSwyMzAsNjYsMTA0CisuYnl0ZQk2NSwxNTMsNDUsMTUsMTc2LDg0LDE4NywyMgorLmJ5dGUJOTksMTI0LDExOSwxMjMsMjQyLDEwNywxMTEsMTk3CisuYnl0ZQk0OCwxLDEwMyw0MywyNTQsMjE1LDE3MSwxMTgKKy5ieXRlCTIwMiwxMzAsMjAxLDEyNSwyNTAsODksNzEsMjQwCisuYnl0ZQkxNzMsMjEyLDE2MiwxNzUsMTU2LDE2NCwxMTQsMTkyCisuYnl0ZQkxODMsMjUzLDE0NywzOCw1NCw2MywyNDcsMjA0CisuYnl0ZQk1MiwxNjUsMjI5LDI0MSwxMTMsMjE2LDQ5LDIxCisuYnl0ZQk0LDE5OSwzNSwxOTUsMjQsMTUwLDUsMTU0CisuYnl0ZQk3LDE4LDEyOCwyMjYsMjM1LDM5LDE3OCwxMTcKKy5ieXRlCTksMTMxLDQ0LDI2LDI3LDExMCw5MCwxNjAKKy5ieXRlCTgyLDU5LDIxNCwxNzksNDEsMjI3LDQ3LDEzMgorLmJ5dGUJODMsMjA5LDAsMjM3LDMyLDI1MiwxNzcsOTEKKy5ieXRlCTEwNiwyMDMsMTkwLDU3LDc0LDc2LDg4LDIwNworLmJ5dGUJMjA4LDIzOSwxNzAsMjUxLDY3LDc3LDUxLDEzMworLmJ5dGUJNjksMjQ5LDIsMTI3LDgwLDYwLDE1OSwxNjgKKy5ieXRlCTgxLDE2Myw2NCwxNDMsMTQ2LDE1Nyw1NiwyNDUKKy5ieXRlCTE4OCwxODIsMjE4LDMzLDE2LDI1NSwyNDMsMjEwCisuYnl0ZQkyMDUsMTIsMTksMjM2LDk1LDE1MSw2OCwyMworLmJ5dGUJMTk2LDE2NywxMjYsNjEsMTAwLDkzLDI1LDExNQorLmJ5dGUJOTYsMTI5LDc5LDIyMCwzNCw0MiwxNDQsMTM2CisuYnl0ZQk3MCwyMzgsMTg0LDIwLDIyMiw5NCwxMSwyMTkKKy5ieXRlCTIyNCw1MCw1OCwxMCw3Myw2LDM2LDkyCisuYnl0ZQkxOTQsMjExLDE3Miw5OCwxNDUsMTQ5LDIyOCwxMjEKKy5ieXRlCTIzMSwyMDAsNTUsMTA5LDE0MSwyMTMsNzgsMTY5CisuYnl0ZQkxMDgsODYsMjQ0LDIzNCwxMDEsMTIyLDE3NCw4CisuYnl0ZQkxODYsMTIwLDM3LDQ2LDI4LDE2NiwxODAsMTk4CisuYnl0ZQkyMzIsMjIxLDExNiwzMSw3NSwxODksMTM5LDEzOAorLmJ5dGUJMTEyLDYyLDE4MSwxMDIsNzIsMywyNDYsMTQKKy5ieXRlCTk3LDUzLDg3LDE4NSwxMzQsMTkzLDI5LDE1OAorLmJ5dGUJMjI1LDI0OCwxNTIsMTcsMTA1LDIxNywxNDIsMTQ4CisuYnl0ZQkxNTUsMzAsMTM1LDIzMywyMDYsODUsNDAsMjIzCisuYnl0ZQkxNDAsMTYxLDEzNywxMywxOTEsMjMwLDY2LDEwNAorLmJ5dGUJNjUsMTUzLDQ1LDE1LDE3Niw4NCwxODcsMjIKKy5ieXRlCTk5LDEyNCwxMTksMTIzLDI0MiwxMDcsMTExLDE5NworLmJ5dGUJNDgsMSwxMDMsNDMsMjU0LDIxNSwxNzEsMTE4CisuYnl0ZQkyMDIsMTMwLDIwMSwxMjUsMjUwLDg5LDcxLDI0MAorLmJ5dGUJMTczLDIxMiwxNjIsMTc1LDE1NiwxNjQsMTE0LDE5MgorLmJ5dGUJMTgzLDI1MywxNDcsMzgsNTQsNjMsMjQ3LDIwNAorLmJ5dGUJNTIsMTY1LDIyOSwyNDEsMTEzLDIxNiw0OSwyMQorLmJ5dGUJNCwxOTksMzUsMTk1LDI0LDE1MCw1LDE1NAorLmJ5dGUJNywxOCwxMjgsMjI2LDIzNSwzOSwxNzgsMTE3CisuYnl0ZQk5LDEzMSw0NCwyNiwyNywxMTAsOTAsMTYwCisuYnl0ZQk4Miw1OSwyMTQsMTc5LDQxLDIyNyw0NywxMzIKKy5ieXRlCTgzLDIwOSwwLDIzNywzMiwyNTIsMTc3LDkxCisuYnl0ZQkxMDYsMjAzLDE5MCw1Nyw3NCw3Niw4OCwyMDcKKy5ieXRlCTIwOCwyMzksMTcwLDI1MSw2Nyw3Nyw1MSwxMzMKKy5ieXRlCTY5LDI0OSwyLDEyNyw4MCw2MCwxNTksMTY4CisuYnl0ZQk4MSwxNjMsNjQsMTQzLDE0NiwxNTcsNTYsMjQ1CisuYnl0ZQkxODgsMTgyLDIxOCwzMywxNiwyNTUsMjQzLDIxMAorLmJ5dGUJMjA1LDEyLDE5LDIzNiw5NSwxNTEsNjgsMjMKKy5ieXRlCTE5NiwxNjcsMTI2LDYxLDEwMCw5MywyNSwxMTUKKy5ieXRlCTk2LDEyOSw3OSwyMjAsMzQsNDIsMTQ0LDEzNgorLmJ5dGUJNzAsMjM4LDE4NCwyMCwyMjIsOTQsMTEsMjE5CisuYnl0ZQkyMjQsNTAsNTgsMTAsNzMsNiwzNiw5MgorLmJ5dGUJMTk0LDIxMSwxNzIsOTgsMTQ1LDE0OSwyMjgsMTIxCisuYnl0ZQkyMzEsMjAwLDU1LDEwOSwxNDEsMjEzLDc4LDE2OQorLmJ5dGUJMTA4LDg2LDI0NCwyMzQsMTAxLDEyMiwxNzQsOAorLmJ5dGUJMTg2LDEyMCwzNyw0NiwyOCwxNjYsMTgwLDE5OAorLmJ5dGUJMjMyLDIyMSwxMTYsMzEsNzUsMTg5LDEzOSwxMzgKKy5ieXRlCTExMiw2MiwxODEsMTAyLDcyLDMsMjQ2LDE0CisuYnl0ZQk5Nyw1Myw4NywxODUsMTM0LDE5MywyOSwxNTgKKy5ieXRlCTIyNSwyNDgsMTUyLDE3LDEwNSwyMTcsMTQyLDE0OAorLmJ5dGUJMTU1LDMwLDEzNSwyMzMsMjA2LDg1LDQwLDIyMworLmJ5dGUJMTQwLDE2MSwxMzcsMTMsMTkxLDIzMCw2NiwxMDQKKy5ieXRlCTY1LDE1Myw0NSwxNSwxNzYsODQsMTg3LDIyCisubG9uZwkxLDIsNCw4CisubG9uZwkxNiwzMiw2NCwxMjgKKy5sb25nCTI3LDU0LDAsMAorLmxvbmcJMCwwLDAsMAorLmdsb2JsCV9hZXNfbm9od19lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2Flc19ub2h3X2VuY3J5cHQKKy5hbGlnbgk0CitfYWVzX25vaHdfZW5jcnlwdDoKK0xfYWVzX25vaHdfZW5jcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAklZXNwLCVlYXgKKwlzdWJsCSQzNiwlZXNwCisJYW5kbAkkLTY0LCVlc3AKKwlsZWFsCS0xMjcoJWVkaSksJWVieAorCXN1YmwJJWVzcCwlZWJ4CisJbmVnbAklZWJ4CisJYW5kbAkkOTYwLCVlYngKKwlzdWJsCSVlYngsJWVzcAorCWFkZGwJJDQsJWVzcAorCW1vdmwJJWVheCwyOCglZXNwKQorCWNhbGwJTDAwNHBpY19wb2ludAorTDAwNHBpY19wb2ludDoKKwlwb3BsCSVlYnAKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUwwMDRwaWNfcG9pbnQoJWVicCksJWVheAorCWxlYWwJTEFFU19UZS1MMDA0cGljX3BvaW50KCVlYnApLCVlYnAKKwlsZWFsCTc2NCglZXNwKSwlZWJ4CisJc3VibAklZWJwLCVlYngKKwlhbmRsCSQ3NjgsJWVieAorCWxlYWwJMjE3NiglZWJwLCVlYngsMSksJWVicAorCWJ0bAkkMjUsKCVlYXgpCisJam5jCUwwMDV4ODYKKwltb3ZxCSglZXNpKSwlbW0wCisJbW92cQk4KCVlc2kpLCVtbTQKKwljYWxsCV9fc3NlX0FFU19lbmNyeXB0X2NvbXBhY3QKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZxCSVtbTAsKCVlc2kpCisJbW92cQklbW00LDgoJWVzaSkKKwllbW1zCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuYWxpZ24JNCwweDkwCitMMDA1eDg2OgorCW1vdmwJJWVicCwyNCglZXNwKQorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisJY2FsbAlfX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0CisJbW92bAkyOCglZXNwKSwlZXNwCisJbW92bAkyNCglZXNwKSwlZXNpCisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJbW92bAklZWN4LDgoJWVzaSkKKwltb3ZsCSVlZHgsMTIoJWVzaSkKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX3g4Nl9BRVNfZGVjcnlwdF9jb21wYWN0CisuYWxpZ24JNAorX194ODZfQUVTX2RlY3J5cHRfY29tcGFjdDoKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCW1vdmwJMjQwKCVlZGkpLCVlc2kKKwlsZWFsCS0yKCVlc2ksJWVzaSwxKSwlZXNpCisJbGVhbAkoJWVkaSwlZXNpLDgpLCVlc2kKKwltb3ZsCSVlc2ksMjQoJWVzcCkKKwltb3ZsCS0xMjgoJWVicCksJWVkaQorCW1vdmwJLTk2KCVlYnApLCVlc2kKKwltb3ZsCS02NCglZWJwKSwlZWRpCisJbW92bAktMzIoJWVicCksJWVzaQorCW1vdmwJKCVlYnApLCVlZGkKKwltb3ZsCTMyKCVlYnApLCVlc2kKKwltb3ZsCTY0KCVlYnApLCVlZGkKKwltb3ZsCTk2KCVlYnApLCVlc2kKKy5hbGlnbgk0LDB4OTAKK0wwMDZsb29wOgorCW1vdmwJJWVheCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklZGgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCW1vdmwJJWVieCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYWgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksOCglZXNwKQorCW1vdmwJJWVjeCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlhbmRsCSQyNTUsJWVkeAorCW1vdnpibAktMTI4KCVlYnAsJWVkeCwxKSwlZWR4CisJbW92emJsCSVjaCwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWN4LDEpLCVlY3gKKwlzaGxsCSQ4LCVlY3gKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVzaSwlZWN4CisJc2hybAkkMTYsJWVieAorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCS0xMjgoJWVicCwlZWJ4LDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlZHgKKwlzaHJsCSQyNCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZWF4LDEpLCVlYXgKKwlzaGxsCSQyNCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVjeCwlZWN4LDEpLCVlYXgKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVheAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZXNpLCVlYXgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlYngKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVieAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWN4LCVlYXgKKwl4b3JsCSVlc2ksJWVieAorCW1vdmwJJDIxNTU5MDUxNTIsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAklZWRpLCVlc2kKKwlzaHJsCSQ3LCVlZGkKKwlsZWFsCSglZWJ4LCVlYngsMSksJWVicAorCXN1YmwJJWVkaSwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJwCisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvbGwJJDgsJWVjeAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlYnAsJWVheAorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWJwLCVlYngKKwlyb2xsCSQyNCwlZWF4CisJeG9ybAklZWJwLCVlY3gKKwlyb2xsCSQxNiwlZWJ4CisJeG9ybAklZWF4LCVlY3gKKwlyb2xsCSQ4LCVlYnAKKwl4b3JsCSVlYngsJWVjeAorCW1vdmwJNCglZXNwKSwlZWF4CisJeG9ybAklZWJwLCVlY3gKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVkeCwlZWR4LDEpLCVlYngKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVieAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZXNpLCVlYngKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlYngsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVieCwlZWJ4LDEpLCVlY3gKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVjeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWR4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCW1vdmwJJDIxNTU5MDUxNTIsJWVkaQorCWFuZGwJJWVjeCwlZWRpCisJbW92bAklZWRpLCVlc2kKKwlzaHJsCSQ3LCVlZGkKKwlsZWFsCSglZWN4LCVlY3gsMSksJWVicAorCXN1YmwJJWVkaSwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJwCisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCXJvbGwJJDgsJWVkeAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAklZWJ4LCVlZHgKKwl4b3JsCSVlYnAsJWVieAorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZWJwLCVlY3gKKwlyb2xsCSQyNCwlZWJ4CisJeG9ybAklZWJwLCVlZHgKKwlyb2xsCSQxNiwlZWN4CisJeG9ybAklZWJ4LCVlZHgKKwlyb2xsCSQ4LCVlYnAKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZHgKKwltb3ZsCSVlZHgsMTYoJWVzcCkKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlY3gKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVjeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZXNpLCVlY3gKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVjeCwlZWN4LDEpLCVlZHgKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVkeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJDIxNTU5MDUxNTIsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbW92bAklZWRpLCVlc2kKKwlzaHJsCSQ3LCVlZGkKKwlsZWFsCSglZWR4LCVlZHgsMSksJWVicAorCXN1YmwJJWVkaSwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJwCisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlYXgsJWVkeAorCXJvbGwJJDgsJWVheAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlYXgKKwl4b3JsCSVlYnAsJWVjeAorCXhvcmwJJWVkeCwlZWF4CisJeG9ybAklZWJwLCVlZHgKKwlyb2xsCSQyNCwlZWN4CisJeG9ybAklZWJwLCVlYXgKKwlyb2xsCSQxNiwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwlyb2xsCSQ4LCVlYnAKKwl4b3JsCSVlZHgsJWVheAorCXhvcmwJJWVicCwlZWF4CisJbW92bAkkMjE1NTkwNTE1MiwlZWRpCisJYW5kbAklZWJ4LCVlZGkKKwltb3ZsCSVlZGksJWVzaQorCXNocmwJJDcsJWVkaQorCWxlYWwJKCVlYngsJWVieCwxKSwlZWN4CisJc3VibAklZWRpLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlY3gKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVzaSwlZWN4CisJbW92bAkkMjE1NTkwNTE1MiwlZWRpCisJYW5kbAklZWN4LCVlZGkKKwltb3ZsCSVlZGksJWVzaQorCXNocmwJJDcsJWVkaQorCWxlYWwJKCVlY3gsJWVjeCwxKSwlZWR4CisJc3VibAklZWRpLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlZHgKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCW1vdmwJJWVkaSwlZXNpCisJc2hybAkkNywlZWRpCisJbGVhbAkoJWVkeCwlZWR4LDEpLCVlYnAKKwlzdWJsCSVlZGksJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVicAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWJ4LCVlZHgKKwlyb2xsCSQ4LCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJeG9ybAklZWJwLCVlY3gKKwl4b3JsCSVlZHgsJWVieAorCXhvcmwJJWVicCwlZWR4CisJcm9sbAkkMjQsJWVjeAorCXhvcmwJJWVicCwlZWJ4CisJcm9sbAkkMTYsJWVkeAorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkOCwlZWJwCisJeG9ybAklZWR4LCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYnAsJWVieAorCW1vdmwJMTYoJWVzcCksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVicAorCWFkZGwJJDE2LCVlZGkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCWNtcGwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVkaSwyMCglZXNwKQorCWpiCUwwMDZsb29wCisJbW92bAklZWF4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZXNpCisJbW92emJsCSVkaCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQ4LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVzaSw0KCVlc3ApCisJbW92bAklZWJ4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZXNpCisJbW92emJsCSVhaCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQ4LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVzaSw4KCVlc3ApCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQ4LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVheCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCWFuZGwJJDI1NSwlZWR4CisJbW92emJsCS0xMjgoJWVicCwlZWR4LDEpLCVlZHgKKwltb3Z6YmwJJWNoLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlY3gsMSksJWVjeAorCXNobGwJJDgsJWVjeAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZXNpLCVlY3gKKwlzaHJsCSQxNiwlZWJ4CisJYW5kbAkkMjU1LCVlYngKKwltb3Z6YmwJLTEyOCglZWJwLCVlYngsMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVkeAorCW1vdmwJOCglZXNwKSwlZWJ4CisJc2hybAkkMjQsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVheCwxKSwlZWF4CisJc2hsbAkkMjQsJWVheAorCXhvcmwJJWVheCwlZWR4CisJbW92bAk0KCVlc3ApLCVlYXgKKwl4b3JsCTE2KCVlZGkpLCVlYXgKKwl4b3JsCTIwKCVlZGkpLCVlYngKKwl4b3JsCTI0KCVlZGkpLCVlY3gKKwl4b3JsCTI4KCVlZGkpLCVlZHgKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0CisuYWxpZ24JNAorX19zc2VfQUVTX2RlY3J5cHRfY29tcGFjdDoKKwlweG9yCSglZWRpKSwlbW0wCisJcHhvcgk4KCVlZGkpLCVtbTQKKwltb3ZsCTI0MCglZWRpKSwlZXNpCisJbGVhbAktMiglZXNpLCVlc2ksMSksJWVzaQorCWxlYWwJKCVlZGksJWVzaSw4KSwlZXNpCisJbW92bAklZXNpLDI0KCVlc3ApCisJbW92bAkkNDU0NzYxMjQzLCVlYXgKKwltb3ZsCSVlYXgsOCglZXNwKQorCW1vdmwJJWVheCwxMiglZXNwKQorCW1vdmwJLTEyOCglZWJwKSwlZWF4CisJbW92bAktOTYoJWVicCksJWVieAorCW1vdmwJLTY0KCVlYnApLCVlY3gKKwltb3ZsCS0zMiglZWJwKSwlZWR4CisJbW92bAkoJWVicCksJWVheAorCW1vdmwJMzIoJWVicCksJWVieAorCW1vdmwJNjQoJWVicCksJWVjeAorCW1vdmwJOTYoJWVicCksJWVkeAorLmFsaWduCTQsMHg5MAorTDAwN2xvb3A6CisJcHNodWZ3CSQxMiwlbW0wLCVtbTEKKwlwc2h1ZncJJDksJW1tNCwlbW01CisJbW92ZAklbW0xLCVlYXgKKwltb3ZkCSVtbTUsJWVieAorCW1vdmwJJWVkaSwyMCglZXNwKQorCW1vdnpibAklYWwsJWVzaQorCW1vdnpibAklYWgsJWVkeAorCXBzaHVmdwkkNiwlbW0wLCVtbTIKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVjeAorCW1vdnpibAklYmwsJWVkaQorCW1vdnpibAktMTI4KCVlYnAsJWVkeCwxKSwlZWR4CisJc2hybAkkMTYsJWVheAorCXNobGwJJDgsJWVkeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkMTYsJWVzaQorCXBzaHVmdwkkMywlbW00LCVtbTYKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwlzaGxsCSQyNCwlZXNpCisJc2hybAkkMTYsJWVieAorCW9ybAklZXNpLCVlZHgKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCXNobGwJJDI0LCVlc2kKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWFsLCVlZGkKKwlzaGxsCSQ4LCVlc2kKKwltb3ZkCSVtbTIsJWVheAorCW9ybAklZXNpLCVlY3gKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmwsJWVkaQorCXNobGwJJDE2LCVlc2kKKwltb3ZkCSVtbTYsJWVieAorCW1vdmQJJWVjeCwlbW0wCisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlY3gKKwltb3Z6YmwJJWFsLCVlZGkKKwlvcmwJJWVzaSwlZWN4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWJsLCVlZGkKKwlvcmwJJWVzaSwlZWR4CisJbW92emJsCS0xMjgoJWVicCwlZWRpLDEpLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwlzaGxsCSQxNiwlZXNpCisJc2hybAkkMTYsJWVheAorCW9ybAklZXNpLCVlZHgKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYmgsJWVkaQorCXNocmwJJDE2LCVlYngKKwlzaGxsCSQ4LCVlc2kKKwltb3ZkCSVlZHgsJW1tMQorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZWR4CisJbW92emJsCSViaCwlZWRpCisJc2hsbAkkMjQsJWVkeAorCWFuZGwJJDI1NSwlZWJ4CisJb3JsCSVlc2ksJWVkeAorCXB1bnBja2xkcQklbW0xLCVtbTAKKwltb3Z6YmwJLTEyOCglZWJwLCVlZGksMSksJWVzaQorCW1vdnpibAklYWwsJWVkaQorCXNobGwJJDgsJWVzaQorCW1vdnpibAklYWgsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVieCwxKSwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW1vdnpibAktMTI4KCVlYnAsJWVkaSwxKSwlZXNpCisJb3JsCSVlYngsJWVkeAorCXNobGwJJDE2LCVlc2kKKwltb3Z6YmwJLTEyOCglZWJwLCVlYXgsMSksJWVheAorCW9ybAklZXNpLCVlZHgKKwlzaGxsCSQyNCwlZWF4CisJb3JsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmQJJWVkeCwlbW00CisJbW92ZAklZWN4LCVtbTUKKwlwdW5wY2tsZHEJJW1tNSwlbW00CisJYWRkbAkkMTYsJWVkaQorCWNtcGwJMjQoJWVzcCksJWVkaQorCWphCUwwMDhvdXQKKwltb3ZxCSVtbTAsJW1tMworCW1vdnEJJW1tNCwlbW03CisJcHNodWZ3CSQyMjgsJW1tMCwlbW0yCisJcHNodWZ3CSQyMjgsJW1tNCwlbW02CisJbW92cQklbW0wLCVtbTEKKwltb3ZxCSVtbTQsJW1tNQorCXBzaHVmdwkkMTc3LCVtbTAsJW1tMAorCXBzaHVmdwkkMTc3LCVtbTQsJW1tNAorCXBzbGxkCSQ4LCVtbTIKKwlwc2xsZAkkOCwlbW02CisJcHNybGQJJDgsJW1tMworCXBzcmxkCSQ4LCVtbTcKKwlweG9yCSVtbTIsJW1tMAorCXB4b3IJJW1tNiwlbW00CisJcHhvcgklbW0zLCVtbTAKKwlweG9yCSVtbTcsJW1tNAorCXBzbGxkCSQxNiwlbW0yCisJcHNsbGQJJDE2LCVtbTYKKwlwc3JsZAkkMTYsJW1tMworCXBzcmxkCSQxNiwlbW03CisJcHhvcgklbW0yLCVtbTAKKwlweG9yCSVtbTYsJW1tNAorCXB4b3IJJW1tMywlbW0wCisJcHhvcgklbW03LCVtbTQKKwltb3ZxCTgoJWVzcCksJW1tMworCXB4b3IJJW1tMiwlbW0yCisJcHhvcgklbW02LCVtbTYKKwlwY21wZ3RiCSVtbTEsJW1tMgorCXBjbXBndGIJJW1tNSwlbW02CisJcGFuZAklbW0zLCVtbTIKKwlwYW5kCSVtbTMsJW1tNgorCXBhZGRiCSVtbTEsJW1tMQorCXBhZGRiCSVtbTUsJW1tNQorCXB4b3IJJW1tMiwlbW0xCisJcHhvcgklbW02LCVtbTUKKwltb3ZxCSVtbTEsJW1tMworCW1vdnEJJW1tNSwlbW03CisJbW92cQklbW0xLCVtbTIKKwltb3ZxCSVtbTUsJW1tNgorCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW01LCVtbTQKKwlwc2xsZAkkMjQsJW1tMworCXBzbGxkCSQyNCwlbW03CisJcHNybGQJJDgsJW1tMgorCXBzcmxkCSQ4LCVtbTYKKwlweG9yCSVtbTMsJW1tMAorCXB4b3IJJW1tNywlbW00CisJcHhvcgklbW0yLCVtbTAKKwlweG9yCSVtbTYsJW1tNAorCW1vdnEJOCglZXNwKSwlbW0yCisJcHhvcgklbW0zLCVtbTMKKwlweG9yCSVtbTcsJW1tNworCXBjbXBndGIJJW1tMSwlbW0zCisJcGNtcGd0YgklbW01LCVtbTcKKwlwYW5kCSVtbTIsJW1tMworCXBhbmQJJW1tMiwlbW03CisJcGFkZGIJJW1tMSwlbW0xCisJcGFkZGIJJW1tNSwlbW01CisJcHhvcgklbW0zLCVtbTEKKwlweG9yCSVtbTcsJW1tNQorCXBzaHVmdwkkMTc3LCVtbTEsJW1tMworCXBzaHVmdwkkMTc3LCVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW01LCVtbTQKKwlweG9yCSVtbTMsJW1tMAorCXB4b3IJJW1tNywlbW00CisJcHhvcgklbW0zLCVtbTMKKwlweG9yCSVtbTcsJW1tNworCXBjbXBndGIJJW1tMSwlbW0zCisJcGNtcGd0YgklbW01LCVtbTcKKwlwYW5kCSVtbTIsJW1tMworCXBhbmQJJW1tMiwlbW03CisJcGFkZGIJJW1tMSwlbW0xCisJcGFkZGIJJW1tNSwlbW01CisJcHhvcgklbW0zLCVtbTEKKwlweG9yCSVtbTcsJW1tNQorCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW01LCVtbTQKKwltb3ZxCSVtbTEsJW1tMworCW1vdnEJJW1tNSwlbW03CisJcHNodWZ3CSQxNzcsJW1tMSwlbW0yCisJcHNodWZ3CSQxNzcsJW1tNSwlbW02CisJcHhvcgklbW0yLCVtbTAKKwlweG9yCSVtbTYsJW1tNAorCXBzbGxkCSQ4LCVtbTEKKwlwc2xsZAkkOCwlbW01CisJcHNybGQJJDgsJW1tMworCXBzcmxkCSQ4LCVtbTcKKwltb3ZxCSglZWRpKSwlbW0yCisJbW92cQk4KCVlZGkpLCVtbTYKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNSwlbW00CisJcHhvcgklbW0zLCVtbTAKKwlweG9yCSVtbTcsJW1tNAorCW1vdmwJLTEyOCglZWJwKSwlZWF4CisJcHNsbGQJJDE2LCVtbTEKKwlwc2xsZAkkMTYsJW1tNQorCW1vdmwJLTY0KCVlYnApLCVlYngKKwlwc3JsZAkkMTYsJW1tMworCXBzcmxkCSQxNiwlbW03CisJbW92bAkoJWVicCksJWVjeAorCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW01LCVtbTQKKwltb3ZsCTY0KCVlYnApLCVlZHgKKwlweG9yCSVtbTMsJW1tMAorCXB4b3IJJW1tNywlbW00CisJcHhvcgklbW0yLCVtbTAKKwlweG9yCSVtbTYsJW1tNAorCWptcAlMMDA3bG9vcAorLmFsaWduCTQsMHg5MAorTDAwOG91dDoKKwlweG9yCSglZWRpKSwlbW0wCisJcHhvcgk4KCVlZGkpLCVtbTQKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX3g4Nl9BRVNfZGVjcnlwdAorLmFsaWduCTQKK19feDg2X0FFU19kZWNyeXB0OgorCW1vdmwJJWVkaSwyMCglZXNwKQorCXhvcmwJKCVlZGkpLCVlYXgKKwl4b3JsCTQoJWVkaSksJWVieAorCXhvcmwJOCglZWRpKSwlZWN4CisJeG9ybAkxMiglZWRpKSwlZWR4CisJbW92bAkyNDAoJWVkaSksJWVzaQorCWxlYWwJLTIoJWVzaSwlZXNpLDEpLCVlc2kKKwlsZWFsCSglZWRpLCVlc2ksOCksJWVzaQorCW1vdmwJJWVzaSwyNCglZXNwKQorLmFsaWduCTQsMHg5MAorTDAwOWxvb3A6CisJbW92bAklZWF4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdmwJKCVlYnAsJWVzaSw4KSwlZXNpCisJbW92emJsCSVkaCwlZWRpCisJeG9ybAkzKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwl4b3JsCTIoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXNocmwJJDI0LCVlZGkKKwl4b3JsCTEoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlc2ksNCglZXNwKQorCW1vdmwJJWVieCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3ZsCSglZWJwLCVlc2ksOCksJWVzaQorCW1vdnpibAklYWgsJWVkaQorCXhvcmwJMyglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJeG9ybAkyKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJeG9ybAkxKCVlYnAsJWVkaSw4KSwlZXNpCisJbW92bAklZXNpLDgoJWVzcCkKKwltb3ZsCSVlY3gsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92bAkoJWVicCwlZXNpLDgpLCVlc2kKKwltb3Z6YmwJJWJoLCVlZGkKKwl4b3JsCTMoJWVicCwlZWRpLDgpLCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCXhvcmwJMiglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMjQsJWVkaQorCXhvcmwJMSglZWJwLCVlZGksOCksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCWFuZGwJJDI1NSwlZWR4CisJbW92bAkoJWVicCwlZWR4LDgpLCVlZHgKKwltb3Z6YmwJJWNoLCVlY3gKKwl4b3JsCTMoJWVicCwlZWN4LDgpLCVlZHgKKwltb3ZsCSVlc2ksJWVjeAorCXNocmwJJDE2LCVlYngKKwlhbmRsCSQyNTUsJWVieAorCXhvcmwJMiglZWJwLCVlYngsOCksJWVkeAorCW1vdmwJOCglZXNwKSwlZWJ4CisJc2hybAkkMjQsJWVheAorCXhvcmwJMSglZWJwLCVlYXgsOCksJWVkeAorCW1vdmwJNCglZXNwKSwlZWF4CisJYWRkbAkkMTYsJWVkaQorCXhvcmwJKCVlZGkpLCVlYXgKKwl4b3JsCTQoJWVkaSksJWVieAorCXhvcmwJOCglZWRpKSwlZWN4CisJeG9ybAkxMiglZWRpKSwlZWR4CisJY21wbAkyNCglZXNwKSwlZWRpCisJbW92bAklZWRpLDIwKCVlc3ApCisJamIJTDAwOWxvb3AKKwlsZWFsCTIxNzYoJWVicCksJWVicAorCW1vdmwJLTEyOCglZWJwKSwlZWRpCisJbW92bAktOTYoJWVicCksJWVzaQorCW1vdmwJLTY0KCVlYnApLCVlZGkKKwltb3ZsCS0zMiglZWJwKSwlZXNpCisJbW92bAkoJWVicCksJWVkaQorCW1vdmwJMzIoJWVicCksJWVzaQorCW1vdmwJNjQoJWVicCksJWVkaQorCW1vdmwJOTYoJWVicCksJWVzaQorCWxlYWwJLTEyOCglZWJwKSwlZWJwCisJbW92bAklZWF4LCVlc2kKKwlhbmRsCSQyNTUsJWVzaQorCW1vdnpibAkoJWVicCwlZXNpLDEpLCVlc2kKKwltb3Z6YmwJJWRoLCVlZGkKKwltb3Z6YmwJKCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkOCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNocmwJJDE2LCVlZGkKKwlhbmRsCSQyNTUsJWVkaQorCW1vdnpibAkoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXNocmwJJDI0LCVlZGkKKwltb3Z6YmwJKCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMjQsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZXNpLDQoJWVzcCkKKwltb3ZsCSVlYngsJWVzaQorCWFuZGwJJDI1NSwlZXNpCisJbW92emJsCSglZWJwLCVlc2ksMSksJWVzaQorCW1vdnpibAklYWgsJWVkaQorCW1vdnpibAkoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQ4LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMTYsJWVkaQorCWFuZGwJJDI1NSwlZWRpCisJbW92emJsCSglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDE2LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hybAkkMjQsJWVkaQorCW1vdnpibAkoJWVicCwlZWRpLDEpLCVlZGkKKwlzaGxsCSQyNCwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlc2ksOCglZXNwKQorCW1vdmwJJWVjeCwlZXNpCisJYW5kbAkkMjU1LCVlc2kKKwltb3Z6YmwJKCVlYnAsJWVzaSwxKSwlZXNpCisJbW92emJsCSViaCwlZWRpCisJbW92emJsCSglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDgsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaHJsCSQxNiwlZWRpCisJYW5kbAkkMjU1LCVlZGkKKwltb3Z6YmwJKCVlYnAsJWVkaSwxKSwlZWRpCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaHJsCSQyNCwlZWRpCisJbW92emJsCSglZWJwLCVlZGksMSksJWVkaQorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCWFuZGwJJDI1NSwlZWR4CisJbW92emJsCSglZWJwLCVlZHgsMSksJWVkeAorCW1vdnpibAklY2gsJWVjeAorCW1vdnpibAkoJWVicCwlZWN4LDEpLCVlY3gKKwlzaGxsCSQ4LCVlY3gKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVzaSwlZWN4CisJc2hybAkkMTYsJWVieAorCWFuZGwJJDI1NSwlZWJ4CisJbW92emJsCSglZWJwLCVlYngsMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVkeAorCW1vdmwJOCglZXNwKSwlZWJ4CisJc2hybAkkMjQsJWVheAorCW1vdnpibAkoJWVicCwlZWF4LDEpLCVlYXgKKwlzaGxsCSQyNCwlZWF4CisJeG9ybAklZWF4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWxlYWwJLTIwNDgoJWVicCksJWVicAorCWFkZGwJJDE2LCVlZGkKKwl4b3JsCSglZWRpKSwlZWF4CisJeG9ybAk0KCVlZGkpLCVlYngKKwl4b3JsCTgoJWVkaSksJWVjeAorCXhvcmwJMTIoJWVkaSksJWVkeAorCXJldAorLmFsaWduCTYsMHg5MAorTEFFU19UZDoKKy5sb25nCTEzNTMxODQzMzcsMTM1MzE4NDMzNworLmxvbmcJMTM5OTE0NDgzMCwxMzk5MTQ0ODMwCisubG9uZwkzMjgyMzEwOTM4LDMyODIzMTA5MzgKKy5sb25nCTI1MjI3NTI4MjYsMjUyMjc1MjgyNgorLmxvbmcJMzQxMjgzMTAzNSwzNDEyODMxMDM1CisubG9uZwk0MDQ3ODcxMjYzLDQwNDc4NzEyNjMKKy5sb25nCTI4NzQ3MzUyNzYsMjg3NDczNTI3NgorLmxvbmcJMjQ2NjUwNTU0NywyNDY2NTA1NTQ3CisubG9uZwkxNDQyNDU5NjgwLDE0NDI0NTk2ODAKKy5sb25nCTQxMzQzNjg5NDEsNDEzNDM2ODk0MQorLmxvbmcJMjQ0MDQ4MTkyOCwyNDQwNDgxOTI4CisubG9uZwk2MjU3Mzg0ODUsNjI1NzM4NDg1CisubG9uZwk0MjQyMDA3Mzc1LDQyNDIwMDczNzUKKy5sb25nCTM2MjA0MTYxOTcsMzYyMDQxNjE5NworLmxvbmcJMjE1MTk1MzcwMiwyMTUxOTUzNzAyCisubG9uZwkyNDA5ODQ5NTI1LDI0MDk4NDk1MjUKKy5sb25nCTEyMzA2ODA1NDIsMTIzMDY4MDU0MgorLmxvbmcJMTcyOTg3MDM3MywxNzI5ODcwMzczCisubG9uZwkyNTUxMTE0MzA5LDI1NTExMTQzMDkKKy5sb25nCTM3ODc1MjE2MjksMzc4NzUyMTYyOQorLmxvbmcJNDEyMzQzNzEsNDEyMzQzNzEKKy5sb25nCTMxNzczODExMywzMTc3MzgxMTMKKy5sb25nCTI3NDQ2MDAyMDUsMjc0NDYwMDIwNQorLmxvbmcJMzMzODI2MTM1NSwzMzM4MjYxMzU1CisubG9uZwkzODgxNzk5NDI3LDM4ODE3OTk0MjcKKy5sb25nCTI1MTAwNjYxOTcsMjUxMDA2NjE5NworLmxvbmcJMzk1MDY2OTI0NywzOTUwNjY5MjQ3CisubG9uZwkzNjYzMjg2OTMzLDM2NjMyODY5MzMKKy5sb25nCTc2MzYwODc4OCw3NjM2MDg3ODgKKy5sb25nCTM1NDIxODUwNDgsMzU0MjE4NTA0OAorLmxvbmcJNjk0ODA0NTUzLDY5NDgwNDU1MworLmxvbmcJMTE1NDAwOTQ4NiwxMTU0MDA5NDg2CisubG9uZwkxNzg3NDEzMTA5LDE3ODc0MTMxMDkKKy5sb25nCTIwMjEyMzIzNzIsMjAyMTIzMjM3MgorLmxvbmcJMTc5OTI0ODAyNSwxNzk5MjQ4MDI1CisubG9uZwkzNzE1MjE3NzAzLDM3MTUyMTc3MDMKKy5sb25nCTMwNTg2ODg0NDYsMzA1ODY4ODQ0NgorLmxvbmcJMzk3MjQ4NzUyLDM5NzI0ODc1MgorLmxvbmcJMTcyMjU1NjYxNywxNzIyNTU2NjE3CisubG9uZwkzMDIzNzUyODI5LDMwMjM3NTI4MjkKKy5sb25nCTQwNzU2MDAzNSw0MDc1NjAwMzUKKy5sb25nCTIxODQyNTYyMjksMjE4NDI1NjIyOQorLmxvbmcJMTYxMzk3NTk1OSwxNjEzOTc1OTU5CisubG9uZwkxMTY1OTcyMzIyLDExNjU5NzIzMjIKKy5sb25nCTM3NjU5MjA5NDUsMzc2NTkyMDk0NQorLmxvbmcJMjIyNjAyMzM1NSwyMjI2MDIzMzU1CisubG9uZwk0ODAyODEwODYsNDgwMjgxMDg2CisubG9uZwkyNDg1ODQ4MzEzLDI0ODU4NDgzMTMKKy5sb25nCTE0ODMyMjkyOTYsMTQ4MzIyOTI5NgorLmxvbmcJNDM2MDI4ODE1LDQzNjAyODgxNQorLmxvbmcJMjI3MjA1OTAyOCwyMjcyMDU5MDI4CisubG9uZwkzMDg2NTE1MDI2LDMwODY1MTUwMjYKKy5sb25nCTYwMTA2MDI2Nyw2MDEwNjAyNjcKKy5sb25nCTM3OTE4MDEyMDIsMzc5MTgwMTIwMgorLmxvbmcJMTQ2ODk5NzYwMywxNDY4OTk3NjAzCisubG9uZwk3MTU4NzE1OTAsNzE1ODcxNTkwCisubG9uZwkxMjAxMjIyOTAsMTIwMTIyMjkwCisubG9uZwk2MzA5MjAxNSw2MzA5MjAxNQorLmxvbmcJMjU5MTgwMjc1OCwyNTkxODAyNzU4CisubG9uZwkyNzY4Nzc5MjE5LDI3Njg3NzkyMTkKKy5sb25nCTQwNjg5NDM5MjAsNDA2ODk0MzkyMAorLmxvbmcJMjk5NzIwNjgxOSwyOTk3MjA2ODE5CisubG9uZwkzMTI3NTA5NzYyLDMxMjc1MDk3NjIKKy5sb25nCTE1NTIwMjk0MjEsMTU1MjAyOTQyMQorLmxvbmcJNzIzMzA4NDI2LDcyMzMwODQyNgorLmxvbmcJMjQ2MTMwMTE1OSwyNDYxMzAxMTU5CisubG9uZwk0MDQyMzkzNTg3LDQwNDIzOTM1ODcKKy5sb25nCTI3MTU5Njk4NzAsMjcxNTk2OTg3MAorLmxvbmcJMzQ1NTM3NTk3MywzNDU1Mzc1OTczCisubG9uZwkzNTg2MDAwMTM0LDM1ODYwMDAxMzQKKy5sb25nCTUyNjUyOTc0NSw1MjY1Mjk3NDUKKy5sb25nCTIzMzE5NDQ2NDQsMjMzMTk0NDY0NAorLmxvbmcJMjYzOTQ3NDIyOCwyNjM5NDc0MjI4CisubG9uZwkyNjg5OTg3NDkwLDI2ODk5ODc0OTAKKy5sb25nCTg1MzY0MTczMyw4NTM2NDE3MzMKKy5sb25nCTE5NzgzOTgzNzIsMTk3ODM5ODM3MgorLmxvbmcJOTcxODAxMzU1LDk3MTgwMTM1NQorLmxvbmcJMjg2NzgxNDQ2NCwyODY3ODE0NDY0CisubG9uZwkxMTExMTI1NDIsMTExMTEyNTQyCisubG9uZwkxMzYwMDMxNDIxLDEzNjAwMzE0MjEKKy5sb25nCTQxODY1NzkyNjIsNDE4NjU3OTI2MgorLmxvbmcJMTAyMzg2MDExOCwxMDIzODYwMTE4CisubG9uZwkyOTE5NTc5MzU3LDI5MTk1NzkzNTcKKy5sb25nCTExODY4NTAzODEsMTE4Njg1MDM4MQorLmxvbmcJMzA0NTkzODMyMSwzMDQ1OTM4MzIxCisubG9uZwk5MDAzMTIxNyw5MDAzMTIxNworLmxvbmcJMTg3NjE2NjE0OCwxODc2MTY2MTQ4CisubG9uZwk0Mjc5NTg2OTEyLDQyNzk1ODY5MTIKKy5sb25nCTYyMDQ2ODI0OSw2MjA0NjgyNDkKKy5sb25nCTI1NDg2NzgxMDIsMjU0ODY3ODEwMgorLmxvbmcJMzQyNjk1OTQ5NywzNDI2OTU5NDk3CisubG9uZwkyMDA2ODk5MDQ3LDIwMDY4OTkwNDcKKy5sb25nCTMxNzUyNzg3NjgsMzE3NTI3ODc2OAorLmxvbmcJMjI5MDg0NTk1OSwyMjkwODQ1OTU5CisubG9uZwk5NDU0OTQ1MDMsOTQ1NDk0NTAzCisubG9uZwkzNjg5ODU5MTkzLDM2ODk4NTkxOTMKKy5sb25nCTExOTE4Njk2MDEsMTE5MTg2OTYwMQorLmxvbmcJMzkxMDA5MTM4OCwzOTEwMDkxMzg4CisubG9uZwkzMzc0MjIwNTM2LDMzNzQyMjA1MzYKKy5sb25nCTAsMAorLmxvbmcJMjIwNjYyOTg5NywyMjA2NjI5ODk3CisubG9uZwkxMjIzNTAyNjQyLDEyMjM1MDI2NDIKKy5sb25nCTI4OTMwMjU1NjYsMjg5MzAyNTU2NgorLmxvbmcJMTMxNjExNzEwMCwxMzE2MTE3MTAwCisubG9uZwk0MjI3Nzk2NzMzLDQyMjc3OTY3MzMKKy5sb25nCTE0NDY1NDQ2NTUsMTQ0NjU0NDY1NQorLmxvbmcJNTE3MzIwMjUzLDUxNzMyMDI1MworLmxvbmcJNjU4MDU4NTUwLDY1ODA1ODU1MAorLmxvbmcJMTY5MTk0Njc2MiwxNjkxOTQ2NzYyCisubG9uZwk1NjQ1NTA3NjAsNTY0NTUwNzYwCisubG9uZwkzNTExOTY2NjE5LDM1MTE5NjY2MTkKKy5sb25nCTk3NjEwNzA0NCw5NzYxMDcwNDQKKy5sb25nCTI5NzYzMjAwMTIsMjk3NjMyMDAxMgorLmxvbmcJMjY2ODE5NDc1LDI2NjgxOTQ3NQorLmxvbmcJMzUzMzEwNjg2OCwzNTMzMTA2ODY4CisubG9uZwkyNjYwMzQyNTU1LDI2NjAzNDI1NTUKKy5sb25nCTEzMzgzNTk5MzYsMTMzODM1OTkzNgorLmxvbmcJMjcyMDA2MjU2MSwyNzIwMDYyNTYxCisubG9uZwkxNzY2NTUzNDM0LDE3NjY1NTM0MzQKKy5sb25nCTM3MDgwNzMyNCwzNzA4MDczMjQKKy5sb25nCTE3OTk5OTcxNCwxNzk5OTk3MTQKKy5sb25nCTM4NDQ3NzYxMjgsMzg0NDc3NjEyOAorLmxvbmcJMTEzODc2MjMwMCwxMTM4NzYyMzAwCisubG9uZwk0ODgwNTM1MjIsNDg4MDUzNTIyCisubG9uZwkxODU0MDM2NjIsMTg1NDAzNjYyCisubG9uZwkyOTE1NTM1ODU4LDI5MTU1MzU4NTgKKy5sb25nCTMxMTQ4NDE2NDUsMzExNDg0MTY0NQorLmxvbmcJMzM2NjUyNjQ4NCwzMzY2NTI2NDg0CisubG9uZwkyMjMzMDY5OTExLDIyMzMwNjk5MTEKKy5sb25nCTEyNzU1NTcyOTUsMTI3NTU1NzI5NQorLmxvbmcJMzE1MTg2MjI1NCwzMTUxODYyMjU0CisubG9uZwk0MjUwOTU5Nzc5LDQyNTA5NTk3NzkKKy5sb25nCTI2NzAwNjgyMTUsMjY3MDA2ODIxNQorLmxvbmcJMzE3MDIwMjIwNCwzMTcwMjAyMjA0CisubG9uZwkzMzA5MDA0MzU2LDMzMDkwMDQzNTYKKy5sb25nCTg4MDczNzExNSw4ODA3MzcxMTUKKy5sb25nCTE5ODI0MTU3NTUsMTk4MjQxNTc1NQorLmxvbmcJMzcwMzk3MjgxMSwzNzAzOTcyODExCisubG9uZwkxNzYxNDA2MzkwLDE3NjE0MDYzOTAKKy5sb25nCTE2NzY3OTcxMTIsMTY3Njc5NzExMgorLmxvbmcJMzQwMzQyODMxMSwzNDAzNDI4MzExCisubG9uZwkyNzcxNzcxNTQsMjc3MTc3MTU0CisubG9uZwkxMDc2MDA4NzIzLDEwNzYwMDg3MjMKKy5sb25nCTUzODAzNTg0NCw1MzgwMzU4NDQKKy5sb25nCTIwOTk1MzAzNzMsMjA5OTUzMDM3MworLmxvbmcJNDE2NDc5NTM0Niw0MTY0Nzk1MzQ2CisubG9uZwkyODg1NTMzOTAsMjg4NTUzMzkwCisubG9uZwkxODM5Mjc4NTM1LDE4MzkyNzg1MzUKKy5sb25nCTEyNjE0MTE4NjksMTI2MTQxMTg2OQorLmxvbmcJNDA4MDA1NTAwNCw0MDgwMDU1MDA0CisubG9uZwkzOTY0ODMxMjQ1LDM5NjQ4MzEyNDUKKy5sb25nCTM1MDQ1ODcxMjcsMzUwNDU4NzEyNworLmxvbmcJMTgxMzQyNjk4NywxODEzNDI2OTg3CisubG9uZwkyNTc5MDY3MDQ5LDI1NzkwNjcwNDkKKy5sb25nCTQxOTkwNjA0OTcsNDE5OTA2MDQ5NworLmxvbmcJNTc3MDM4NjYzLDU3NzAzODY2MworLmxvbmcJMzI5NzU3NDA1NiwzMjk3NTc0MDU2CisubG9uZwk0NDAzOTc5ODQsNDQwMzk3OTg0CisubG9uZwkzNjI2Nzk0MzI2LDM2MjY3OTQzMjYKKy5sb25nCTQwMTkyMDQ4OTgsNDAxOTIwNDg5OAorLmxvbmcJMzM0Mzc5NjYxNSwzMzQzNzk2NjE1CisubG9uZwkzMjUxNzE0MjY1LDMyNTE3MTQyNjUKKy5sb25nCTQyNzIwODE1NDgsNDI3MjA4MTU0OAorLmxvbmcJOTA2NzQ0OTg0LDkwNjc0NDk4NAorLmxvbmcJMzQ4MTQwMDc0MiwzNDgxNDAwNzQyCisubG9uZwk2ODU2NjkwMjksNjg1NjY5MDI5CisubG9uZwk2NDY4ODczODYsNjQ2ODg3Mzg2CisubG9uZwkyNzY0MDI1MTUxLDI3NjQwMjUxNTEKKy5sb25nCTM4MzU1MDkyOTIsMzgzNTUwOTI5MgorLmxvbmcJMjI3NzAyODY0LDIyNzcwMjg2NAorLmxvbmcJMjYxMzg2MjI1MCwyNjEzODYyMjUwCisubG9uZwkxNjQ4Nzg3MDI4LDE2NDg3ODcwMjgKKy5sb25nCTMyNTYwNjE0MzAsMzI1NjA2MTQzMAorLmxvbmcJMzkwNDQyODE3NiwzOTA0NDI4MTc2CisubG9uZwkxNTkzMjYwMzM0LDE1OTMyNjAzMzQKKy5sb25nCTQxMjE5MzY3NzAsNDEyMTkzNjc3MAorLmxvbmcJMzE5NjA4MzYxNSwzMTk2MDgzNjE1CisubG9uZwkyMDkwMDYxOTI5LDIwOTAwNjE5MjkKKy5sb25nCTI4MzgzNTMyNjMsMjgzODM1MzI2MworLmxvbmcJMzAwNDMxMDk5MSwzMDA0MzEwOTkxCisubG9uZwk5OTk5MjY5ODQsOTk5OTI2OTg0CisubG9uZwkyODA5OTkzMjMyLDI4MDk5OTMyMzIKKy5sb25nCTE4NTIwMjE5OTIsMTg1MjAyMTk5MgorLmxvbmcJMjA3NTg2ODEyMywyMDc1ODY4MTIzCisubG9uZwkxNTg4NjkxOTcsMTU4ODY5MTk3CisubG9uZwk0MDk1MjM2NDYyLDQwOTUyMzY0NjIKKy5sb25nCTI4ODA5OTY0LDI4ODA5OTY0CisubG9uZwkyODI4Njg1MTg3LDI4Mjg2ODUxODcKKy5sb25nCTE3MDE3NDYxNTAsMTcwMTc0NjE1MAorLmxvbmcJMjEyOTA2Nzk0NiwyMTI5MDY3OTQ2CisubG9uZwkxNDc4MzE4NDEsMTQ3ODMxODQxCisubG9uZwkzODczOTY5NjQ3LDM4NzM5Njk2NDcKKy5sb25nCTM2NTA4NzMyNzQsMzY1MDg3MzI3NAorLmxvbmcJMzQ1OTY3MzkzMCwzNDU5NjczOTMwCisubG9uZwkzNTU3NDAwNTU0LDM1NTc0MDA1NTQKKy5sb25nCTM1OTg0OTU3ODUsMzU5ODQ5NTc4NQorLmxvbmcJMjk0NzcyMDI0MSwyOTQ3NzIwMjQxCisubG9uZwk4MjQzOTM1MTQsODI0MzkzNTE0CisubG9uZwk4MTUwNDgxMzQsODE1MDQ4MTM0CisubG9uZwkzMjI3OTUxNjY5LDMyMjc5NTE2NjkKKy5sb25nCTkzNTA4NzczMiw5MzUwODc3MzIKKy5sb25nCTI3OTgyODk2NjAsMjc5ODI4OTY2MAorLmxvbmcJMjk2NjQ1ODU5MiwyOTY2NDU4NTkyCisubG9uZwkzNjY1MjAxMTUsMzY2NTIwMTE1CisubG9uZwkxMjUxNDc2NzIxLDEyNTE0NzY3MjEKKy5sb25nCTQxNTgzMTk2ODEsNDE1ODMxOTY4MQorLmxvbmcJMjQwMTc2NTExLDI0MDE3NjUxMQorLmxvbmcJODA0Njg4MTUxLDgwNDY4ODE1MQorLmxvbmcJMjM3OTYzMTk5MCwyMzc5NjMxOTkwCisubG9uZwkxMzAzNDQxMjE5LDEzMDM0NDEyMTkKKy5sb25nCTE0MTQzNzYxNDAsMTQxNDM3NjE0MAorLmxvbmcJMzc0MTYxOTk0MCwzNzQxNjE5OTQwCisubG9uZwkzODIwMzQzNzEwLDM4MjAzNDM3MTAKKy5sb25nCTQ2MTkyNDk0MCw0NjE5MjQ5NDAKKy5sb25nCTMwODkwNTA4MTcsMzA4OTA1MDgxNworLmxvbmcJMjEzNjA0MDc3NCwyMTM2MDQwNzc0CisubG9uZwk4MjQ2ODUwOSw4MjQ2ODUwOQorLmxvbmcJMTU2Mzc5MDMzNywxNTYzNzkwMzM3CisubG9uZwkxOTM3MDE2ODI2LDE5MzcwMTY4MjYKKy5sb25nCTc3NjAxNDg0Myw3NzYwMTQ4NDMKKy5sb25nCTE1MTE4NzY1MzEsMTUxMTg3NjUzMQorLmxvbmcJMTM4OTU1MDQ4MiwxMzg5NTUwNDgyCisubG9uZwk4NjEyNzg0NDEsODYxMjc4NDQxCisubG9uZwkzMjM0NzUwNTMsMzIzNDc1MDUzCisubG9uZwkyMzU1MjIyNDI2LDIzNTUyMjI0MjYKKy5sb25nCTIwNDc2NDgwNTUsMjA0NzY0ODA1NQorLmxvbmcJMjM4MzczODk2OSwyMzgzNzM4OTY5CisubG9uZwkyMzAyNDE1ODUxLDIzMDI0MTU4NTEKKy5sb25nCTM5OTU1NzY3ODIsMzk5NTU3Njc4MgorLmxvbmcJOTAyMzkwMTk5LDkwMjM5MDE5OQorLmxvbmcJMzk5MTIxNTMyOSwzOTkxMjE1MzI5CisubG9uZwkxMDE4MjUxMTMwLDEwMTgyNTExMzAKKy5sb25nCTE1MDc4NDA2NjgsMTUwNzg0MDY2OAorLmxvbmcJMTA2NDU2MzI4NSwxMDY0NTYzMjg1CisubG9uZwkyMDQzNTQ4Njk2LDIwNDM1NDg2OTYKKy5sb25nCTMyMDgxMDM3OTUsMzIwODEwMzc5NQorLmxvbmcJMzkzOTM2NjczOSwzOTM5MzY2NzM5CisubG9uZwkxNTM3OTMyNjM5LDE1Mzc5MzI2MzkKKy5sb25nCTM0MjgzNDY1NSwzNDI4MzQ2NTUKKy5sb25nCTIyNjI1MTY4NTYsMjI2MjUxNjg1NgorLmxvbmcJMjE4MDIzMTExNCwyMTgwMjMxMTE0CisubG9uZwkxMDUzMDU5MjU3LDEwNTMwNTkyNTcKKy5sb25nCTc0MTYxNDY0OCw3NDE2MTQ2NDgKKy5sb25nCTE1OTgwNzE3NDYsMTU5ODA3MTc0NgorLmxvbmcJMTkyNTM4OTU5MCwxOTI1Mzg5NTkwCisubG9uZwkyMDM4MDk0NjgsMjAzODA5NDY4CisubG9uZwkyMzM2ODMyNTUyLDIzMzY4MzI1NTIKKy5sb25nCTExMDAyODc0ODcsMTEwMDI4NzQ4NworLmxvbmcJMTg5NTkzNDAwOSwxODk1OTM0MDA5CisubG9uZwkzNzM2Mjc1OTc2LDM3MzYyNzU5NzYKKy5sb25nCTI2MzIyMzQyMDAsMjYzMjIzNDIwMAorLmxvbmcJMjQyODU4OTY2OCwyNDI4NTg5NjY4CisubG9uZwkxNjM2MDkyNzk1LDE2MzYwOTI3OTUKKy5sb25nCTE4OTA5ODg3NTcsMTg5MDk4ODc1NworLmxvbmcJMTk1MjIxNDA4OCwxOTUyMjE0MDg4CisubG9uZwkxMTEzMDQ1MjAwLDExMTMwNDUyMDAKKy5ieXRlCTgyLDksMTA2LDIxMyw0OCw1NCwxNjUsNTYKKy5ieXRlCTE5MSw2NCwxNjMsMTU4LDEyOSwyNDMsMjE1LDI1MQorLmJ5dGUJMTI0LDIyNyw1NywxMzAsMTU1LDQ3LDI1NSwxMzUKKy5ieXRlCTUyLDE0Miw2Nyw2OCwxOTYsMjIyLDIzMywyMDMKKy5ieXRlCTg0LDEyMywxNDgsNTAsMTY2LDE5NCwzNSw2MQorLmJ5dGUJMjM4LDc2LDE0OSwxMSw2NiwyNTAsMTk1LDc4CisuYnl0ZQk4LDQ2LDE2MSwxMDIsNDAsMjE3LDM2LDE3OAorLmJ5dGUJMTE4LDkxLDE2Miw3MywxMDksMTM5LDIwOSwzNworLmJ5dGUJMTE0LDI0OCwyNDYsMTAwLDEzNCwxMDQsMTUyLDIyCisuYnl0ZQkyMTIsMTY0LDkyLDIwNCw5MywxMDEsMTgyLDE0NgorLmJ5dGUJMTA4LDExMiw3Miw4MCwyNTMsMjM3LDE4NSwyMTgKKy5ieXRlCTk0LDIxLDcwLDg3LDE2NywxNDEsMTU3LDEzMgorLmJ5dGUJMTQ0LDIxNiwxNzEsMCwxNDAsMTg4LDIxMSwxMAorLmJ5dGUJMjQ3LDIyOCw4OCw1LDE4NCwxNzksNjksNgorLmJ5dGUJMjA4LDQ0LDMwLDE0MywyMDIsNjMsMTUsMgorLmJ5dGUJMTkzLDE3NSwxODksMywxLDE5LDEzOCwxMDcKKy5ieXRlCTU4LDE0NSwxNyw2NSw3OSwxMDMsMjIwLDIzNAorLmJ5dGUJMTUxLDI0MiwyMDcsMjA2LDI0MCwxODAsMjMwLDExNQorLmJ5dGUJMTUwLDE3MiwxMTYsMzQsMjMxLDE3Myw1MywxMzMKKy5ieXRlCTIyNiwyNDksNTUsMjMyLDI4LDExNywyMjMsMTEwCisuYnl0ZQk3MSwyNDEsMjYsMTEzLDI5LDQxLDE5NywxMzcKKy5ieXRlCTExMSwxODMsOTgsMTQsMTcwLDI0LDE5MCwyNworLmJ5dGUJMjUyLDg2LDYyLDc1LDE5OCwyMTAsMTIxLDMyCisuYnl0ZQkxNTQsMjE5LDE5MiwyNTQsMTIwLDIwNSw5MCwyNDQKKy5ieXRlCTMxLDIyMSwxNjgsNTEsMTM2LDcsMTk5LDQ5CisuYnl0ZQkxNzcsMTgsMTYsODksMzksMTI4LDIzNiw5NQorLmJ5dGUJOTYsODEsMTI3LDE2OSwyNSwxODEsNzQsMTMKKy5ieXRlCTQ1LDIyOSwxMjIsMTU5LDE0NywyMDEsMTU2LDIzOQorLmJ5dGUJMTYwLDIyNCw1OSw3NywxNzQsNDIsMjQ1LDE3NgorLmJ5dGUJMjAwLDIzNSwxODcsNjAsMTMxLDgzLDE1Myw5NworLmJ5dGUJMjMsNDMsNCwxMjYsMTg2LDExOSwyMTQsMzgKKy5ieXRlCTIyNSwxMDUsMjAsOTksODUsMzMsMTIsMTI1CisuYnl0ZQk4Miw5LDEwNiwyMTMsNDgsNTQsMTY1LDU2CisuYnl0ZQkxOTEsNjQsMTYzLDE1OCwxMjksMjQzLDIxNSwyNTEKKy5ieXRlCTEyNCwyMjcsNTcsMTMwLDE1NSw0NywyNTUsMTM1CisuYnl0ZQk1MiwxNDIsNjcsNjgsMTk2LDIyMiwyMzMsMjAzCisuYnl0ZQk4NCwxMjMsMTQ4LDUwLDE2NiwxOTQsMzUsNjEKKy5ieXRlCTIzOCw3NiwxNDksMTEsNjYsMjUwLDE5NSw3OAorLmJ5dGUJOCw0NiwxNjEsMTAyLDQwLDIxNywzNiwxNzgKKy5ieXRlCTExOCw5MSwxNjIsNzMsMTA5LDEzOSwyMDksMzcKKy5ieXRlCTExNCwyNDgsMjQ2LDEwMCwxMzQsMTA0LDE1MiwyMgorLmJ5dGUJMjEyLDE2NCw5MiwyMDQsOTMsMTAxLDE4MiwxNDYKKy5ieXRlCTEwOCwxMTIsNzIsODAsMjUzLDIzNywxODUsMjE4CisuYnl0ZQk5NCwyMSw3MCw4NywxNjcsMTQxLDE1NywxMzIKKy5ieXRlCTE0NCwyMTYsMTcxLDAsMTQwLDE4OCwyMTEsMTAKKy5ieXRlCTI0NywyMjgsODgsNSwxODQsMTc5LDY5LDYKKy5ieXRlCTIwOCw0NCwzMCwxNDMsMjAyLDYzLDE1LDIKKy5ieXRlCTE5MywxNzUsMTg5LDMsMSwxOSwxMzgsMTA3CisuYnl0ZQk1OCwxNDUsMTcsNjUsNzksMTAzLDIyMCwyMzQKKy5ieXRlCTE1MSwyNDIsMjA3LDIwNiwyNDAsMTgwLDIzMCwxMTUKKy5ieXRlCTE1MCwxNzIsMTE2LDM0LDIzMSwxNzMsNTMsMTMzCisuYnl0ZQkyMjYsMjQ5LDU1LDIzMiwyOCwxMTcsMjIzLDExMAorLmJ5dGUJNzEsMjQxLDI2LDExMywyOSw0MSwxOTcsMTM3CisuYnl0ZQkxMTEsMTgzLDk4LDE0LDE3MCwyNCwxOTAsMjcKKy5ieXRlCTI1Miw4Niw2Miw3NSwxOTgsMjEwLDEyMSwzMgorLmJ5dGUJMTU0LDIxOSwxOTIsMjU0LDEyMCwyMDUsOTAsMjQ0CisuYnl0ZQkzMSwyMjEsMTY4LDUxLDEzNiw3LDE5OSw0OQorLmJ5dGUJMTc3LDE4LDE2LDg5LDM5LDEyOCwyMzYsOTUKKy5ieXRlCTk2LDgxLDEyNywxNjksMjUsMTgxLDc0LDEzCisuYnl0ZQk0NSwyMjksMTIyLDE1OSwxNDcsMjAxLDE1NiwyMzkKKy5ieXRlCTE2MCwyMjQsNTksNzcsMTc0LDQyLDI0NSwxNzYKKy5ieXRlCTIwMCwyMzUsMTg3LDYwLDEzMSw4MywxNTMsOTcKKy5ieXRlCTIzLDQzLDQsMTI2LDE4NiwxMTksMjE0LDM4CisuYnl0ZQkyMjUsMTA1LDIwLDk5LDg1LDMzLDEyLDEyNQorLmJ5dGUJODIsOSwxMDYsMjEzLDQ4LDU0LDE2NSw1NgorLmJ5dGUJMTkxLDY0LDE2MywxNTgsMTI5LDI0MywyMTUsMjUxCisuYnl0ZQkxMjQsMjI3LDU3LDEzMCwxNTUsNDcsMjU1LDEzNQorLmJ5dGUJNTIsMTQyLDY3LDY4LDE5NiwyMjIsMjMzLDIwMworLmJ5dGUJODQsMTIzLDE0OCw1MCwxNjYsMTk0LDM1LDYxCisuYnl0ZQkyMzgsNzYsMTQ5LDExLDY2LDI1MCwxOTUsNzgKKy5ieXRlCTgsNDYsMTYxLDEwMiw0MCwyMTcsMzYsMTc4CisuYnl0ZQkxMTgsOTEsMTYyLDczLDEwOSwxMzksMjA5LDM3CisuYnl0ZQkxMTQsMjQ4LDI0NiwxMDAsMTM0LDEwNCwxNTIsMjIKKy5ieXRlCTIxMiwxNjQsOTIsMjA0LDkzLDEwMSwxODIsMTQ2CisuYnl0ZQkxMDgsMTEyLDcyLDgwLDI1MywyMzcsMTg1LDIxOAorLmJ5dGUJOTQsMjEsNzAsODcsMTY3LDE0MSwxNTcsMTMyCisuYnl0ZQkxNDQsMjE2LDE3MSwwLDE0MCwxODgsMjExLDEwCisuYnl0ZQkyNDcsMjI4LDg4LDUsMTg0LDE3OSw2OSw2CisuYnl0ZQkyMDgsNDQsMzAsMTQzLDIwMiw2MywxNSwyCisuYnl0ZQkxOTMsMTc1LDE4OSwzLDEsMTksMTM4LDEwNworLmJ5dGUJNTgsMTQ1LDE3LDY1LDc5LDEwMywyMjAsMjM0CisuYnl0ZQkxNTEsMjQyLDIwNywyMDYsMjQwLDE4MCwyMzAsMTE1CisuYnl0ZQkxNTAsMTcyLDExNiwzNCwyMzEsMTczLDUzLDEzMworLmJ5dGUJMjI2LDI0OSw1NSwyMzIsMjgsMTE3LDIyMywxMTAKKy5ieXRlCTcxLDI0MSwyNiwxMTMsMjksNDEsMTk3LDEzNworLmJ5dGUJMTExLDE4Myw5OCwxNCwxNzAsMjQsMTkwLDI3CisuYnl0ZQkyNTIsODYsNjIsNzUsMTk4LDIxMCwxMjEsMzIKKy5ieXRlCTE1NCwyMTksMTkyLDI1NCwxMjAsMjA1LDkwLDI0NAorLmJ5dGUJMzEsMjIxLDE2OCw1MSwxMzYsNywxOTksNDkKKy5ieXRlCTE3NywxOCwxNiw4OSwzOSwxMjgsMjM2LDk1CisuYnl0ZQk5Niw4MSwxMjcsMTY5LDI1LDE4MSw3NCwxMworLmJ5dGUJNDUsMjI5LDEyMiwxNTksMTQ3LDIwMSwxNTYsMjM5CisuYnl0ZQkxNjAsMjI0LDU5LDc3LDE3NCw0MiwyNDUsMTc2CisuYnl0ZQkyMDAsMjM1LDE4Nyw2MCwxMzEsODMsMTUzLDk3CisuYnl0ZQkyMyw0Myw0LDEyNiwxODYsMTE5LDIxNCwzOAorLmJ5dGUJMjI1LDEwNSwyMCw5OSw4NSwzMywxMiwxMjUKKy5ieXRlCTgyLDksMTA2LDIxMyw0OCw1NCwxNjUsNTYKKy5ieXRlCTE5MSw2NCwxNjMsMTU4LDEyOSwyNDMsMjE1LDI1MQorLmJ5dGUJMTI0LDIyNyw1NywxMzAsMTU1LDQ3LDI1NSwxMzUKKy5ieXRlCTUyLDE0Miw2Nyw2OCwxOTYsMjIyLDIzMywyMDMKKy5ieXRlCTg0LDEyMywxNDgsNTAsMTY2LDE5NCwzNSw2MQorLmJ5dGUJMjM4LDc2LDE0OSwxMSw2NiwyNTAsMTk1LDc4CisuYnl0ZQk4LDQ2LDE2MSwxMDIsNDAsMjE3LDM2LDE3OAorLmJ5dGUJMTE4LDkxLDE2Miw3MywxMDksMTM5LDIwOSwzNworLmJ5dGUJMTE0LDI0OCwyNDYsMTAwLDEzNCwxMDQsMTUyLDIyCisuYnl0ZQkyMTIsMTY0LDkyLDIwNCw5MywxMDEsMTgyLDE0NgorLmJ5dGUJMTA4LDExMiw3Miw4MCwyNTMsMjM3LDE4NSwyMTgKKy5ieXRlCTk0LDIxLDcwLDg3LDE2NywxNDEsMTU3LDEzMgorLmJ5dGUJMTQ0LDIxNiwxNzEsMCwxNDAsMTg4LDIxMSwxMAorLmJ5dGUJMjQ3LDIyOCw4OCw1LDE4NCwxNzksNjksNgorLmJ5dGUJMjA4LDQ0LDMwLDE0MywyMDIsNjMsMTUsMgorLmJ5dGUJMTkzLDE3NSwxODksMywxLDE5LDEzOCwxMDcKKy5ieXRlCTU4LDE0NSwxNyw2NSw3OSwxMDMsMjIwLDIzNAorLmJ5dGUJMTUxLDI0MiwyMDcsMjA2LDI0MCwxODAsMjMwLDExNQorLmJ5dGUJMTUwLDE3MiwxMTYsMzQsMjMxLDE3Myw1MywxMzMKKy5ieXRlCTIyNiwyNDksNTUsMjMyLDI4LDExNywyMjMsMTEwCisuYnl0ZQk3MSwyNDEsMjYsMTEzLDI5LDQxLDE5NywxMzcKKy5ieXRlCTExMSwxODMsOTgsMTQsMTcwLDI0LDE5MCwyNworLmJ5dGUJMjUyLDg2LDYyLDc1LDE5OCwyMTAsMTIxLDMyCisuYnl0ZQkxNTQsMjE5LDE5MiwyNTQsMTIwLDIwNSw5MCwyNDQKKy5ieXRlCTMxLDIyMSwxNjgsNTEsMTM2LDcsMTk5LDQ5CisuYnl0ZQkxNzcsMTgsMTYsODksMzksMTI4LDIzNiw5NQorLmJ5dGUJOTYsODEsMTI3LDE2OSwyNSwxODEsNzQsMTMKKy5ieXRlCTQ1LDIyOSwxMjIsMTU5LDE0NywyMDEsMTU2LDIzOQorLmJ5dGUJMTYwLDIyNCw1OSw3NywxNzQsNDIsMjQ1LDE3NgorLmJ5dGUJMjAwLDIzNSwxODcsNjAsMTMxLDgzLDE1Myw5NworLmJ5dGUJMjMsNDMsNCwxMjYsMTg2LDExOSwyMTQsMzgKKy5ieXRlCTIyNSwxMDUsMjAsOTksODUsMzMsMTIsMTI1CisuZ2xvYmwJX2Flc19ub2h3X2RlY3J5cHQKKy5wcml2YXRlX2V4dGVybglfYWVzX25vaHdfZGVjcnlwdAorLmFsaWduCTQKK19hZXNfbm9od19kZWNyeXB0OgorTF9hZXNfbm9od19kZWNyeXB0X2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwltb3ZsCSVlc3AsJWVheAorCXN1YmwJJDM2LCVlc3AKKwlhbmRsCSQtNjQsJWVzcAorCWxlYWwJLTEyNyglZWRpKSwlZWJ4CisJc3VibAklZXNwLCVlYngKKwluZWdsCSVlYngKKwlhbmRsCSQ5NjAsJWVieAorCXN1YmwJJWVieCwlZXNwCisJYWRkbAkkNCwlZXNwCisJbW92bAklZWF4LDI4KCVlc3ApCisJY2FsbAlMMDEwcGljX3BvaW50CitMMDEwcGljX3BvaW50OgorCXBvcGwJJWVicAorCW1vdmwJTF9PUEVOU1NMX2lhMzJjYXBfUCRub25fbGF6eV9wdHItTDAxMHBpY19wb2ludCglZWJwKSwlZWF4CisJbGVhbAlMQUVTX1RkLUwwMTBwaWNfcG9pbnQoJWVicCksJWVicAorCWxlYWwJNzY0KCVlc3ApLCVlYngKKwlzdWJsCSVlYnAsJWVieAorCWFuZGwJJDc2OCwlZWJ4CisJbGVhbAkyMTc2KCVlYnAsJWVieCwxKSwlZWJwCisJYnRsCSQyNSwoJWVheCkKKwlqbmMJTDAxMXg4NgorCW1vdnEJKCVlc2kpLCVtbTAKKwltb3ZxCTgoJWVzaSksJW1tNAorCWNhbGwJX19zc2VfQUVTX2RlY3J5cHRfY29tcGFjdAorCW1vdmwJMjgoJWVzcCksJWVzcAorCW1vdmwJMjQoJWVzcCksJWVzaQorCW1vdnEJJW1tMCwoJWVzaSkKKwltb3ZxCSVtbTQsOCglZXNpKQorCWVtbXMKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgk0LDB4OTAKK0wwMTF4ODY6CisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwljYWxsCV9feDg2X0FFU19kZWNyeXB0X2NvbXBhY3QKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlY3gsOCglZXNpKQorCW1vdmwJJWVkeCwxMiglZXNpKQorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmdsb2JsCV9hZXNfbm9od19jYmNfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuCV9hZXNfbm9od19jYmNfZW5jcnlwdAorLmFsaWduCTQKK19hZXNfbm9od19jYmNfZW5jcnlwdDoKK0xfYWVzX25vaHdfY2JjX2VuY3J5cHRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjgoJWVzcCksJWVjeAorCWNtcGwJJDAsJWVjeAorCWplCUwwMTJkcm9wX291dAorCWNhbGwJTDAxM3BpY19wb2ludAorTDAxM3BpY19wb2ludDoKKwlwb3BsCSVlYnAKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUwwMTNwaWNfcG9pbnQoJWVicCksJWVheAorCWNtcGwJJDAsNDAoJWVzcCkKKwlsZWFsCUxBRVNfVGUtTDAxM3BpY19wb2ludCglZWJwKSwlZWJwCisJam5lCUwwMTRwaWNrZWRfdGUKKwlsZWFsCUxBRVNfVGQtTEFFU19UZSglZWJwKSwlZWJwCitMMDE0cGlja2VkX3RlOgorCXB1c2hmbAorCWNsZAorCWNtcGwJJDUxMiwlZWN4CisJamIJTDAxNXNsb3dfd2F5CisJdGVzdGwJJDE1LCVlY3gKKwlqbnoJTDAxNXNsb3dfd2F5CisJYnRsCSQyOCwoJWVheCkKKwlqYwlMMDE1c2xvd193YXkKKwlsZWFsCS0zMjQoJWVzcCksJWVzaQorCWFuZGwJJC02NCwlZXNpCisJbW92bAklZWJwLCVlYXgKKwlsZWFsCTIzMDQoJWVicCksJWVieAorCW1vdmwJJWVzaSwlZWR4CisJYW5kbAkkNDA5NSwlZWF4CisJYW5kbAkkNDA5NSwlZWJ4CisJYW5kbAkkNDA5NSwlZWR4CisJY21wbAklZWJ4LCVlZHgKKwlqYglMMDE2dGJsX2JyZWFrX291dAorCXN1YmwJJWVieCwlZWR4CisJc3VibAklZWR4LCVlc2kKKwlqbXAJTDAxN3RibF9vaworLmFsaWduCTIsMHg5MAorTDAxNnRibF9icmVha19vdXQ6CisJc3VibAklZWF4LCVlZHgKKwlhbmRsCSQ0MDk1LCVlZHgKKwlhZGRsCSQzODQsJWVkeAorCXN1YmwJJWVkeCwlZXNpCisuYWxpZ24JMiwweDkwCitMMDE3dGJsX29rOgorCWxlYWwJMjQoJWVzcCksJWVkeAorCXhjaGdsCSVlc2ksJWVzcAorCWFkZGwJJDQsJWVzcAorCW1vdmwJJWVicCwyNCglZXNwKQorCW1vdmwJJWVzaSwyOCglZXNwKQorCW1vdmwJKCVlZHgpLCVlYXgKKwltb3ZsCTQoJWVkeCksJWVieAorCW1vdmwJMTIoJWVkeCksJWVkaQorCW1vdmwJMTYoJWVkeCksJWVzaQorCW1vdmwJMjAoJWVkeCksJWVkeAorCW1vdmwJJWVheCwzMiglZXNwKQorCW1vdmwJJWVieCwzNiglZXNwKQorCW1vdmwJJWVjeCw0MCglZXNwKQorCW1vdmwJJWVkaSw0NCglZXNwKQorCW1vdmwJJWVzaSw0OCglZXNwKQorCW1vdmwJJDAsMzE2KCVlc3ApCisJbW92bAklZWRpLCVlYngKKwltb3ZsCSQ2MSwlZWN4CisJc3VibAklZWJwLCVlYngKKwltb3ZsCSVlZGksJWVzaQorCWFuZGwJJDQwOTUsJWVieAorCWxlYWwJNzYoJWVzcCksJWVkaQorCWNtcGwJJDIzMDQsJWVieAorCWpiCUwwMThkb19jb3B5CisJY21wbAkkMzg1MiwlZWJ4CisJamIJTDAxOXNraXBfY29weQorLmFsaWduCTIsMHg5MAorTDAxOGRvX2NvcHk6CisJbW92bAklZWRpLDQ0KCVlc3ApCisubG9uZwkyNzg0MjI5MDAxCitMMDE5c2tpcF9jb3B5OgorCW1vdmwJJDE2LCVlZGkKKy5hbGlnbgkyLDB4OTAKK0wwMjBwcmVmZXRjaF90Ymw6CisJbW92bAkoJWVicCksJWVheAorCW1vdmwJMzIoJWVicCksJWVieAorCW1vdmwJNjQoJWVicCksJWVjeAorCW1vdmwJOTYoJWVicCksJWVzaQorCWxlYWwJMTI4KCVlYnApLCVlYnAKKwlzdWJsCSQxLCVlZGkKKwlqbnoJTDAyMHByZWZldGNoX3RibAorCXN1YmwJJDIwNDgsJWVicAorCW1vdmwJMzIoJWVzcCksJWVzaQorCW1vdmwJNDgoJWVzcCksJWVkaQorCWNtcGwJJDAsJWVkeAorCWplCUwwMjFmYXN0X2RlY3J5cHQKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKy5hbGlnbgk0LDB4OTAKK0wwMjJmYXN0X2VuY19sb29wOgorCW1vdmwJOCglZWRpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJeG9ybAkoJWVzaSksJWVheAorCXhvcmwJNCglZXNpKSwlZWJ4CisJeG9ybAk4KCVlc2kpLCVlY3gKKwl4b3JsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV9feDg2X0FFU19lbmNyeXB0CisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAkzNiglZXNwKSwlZWRpCisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVieCw0KCVlZGkpCisJbW92bAklZWN4LDgoJWVkaSkKKwltb3ZsCSVlZHgsMTIoJWVkaSkKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksMzIoJWVzcCkKKwlsZWFsCTE2KCVlZGkpLCVlZHgKKwltb3ZsCSVlZHgsMzYoJWVzcCkKKwlzdWJsCSQxNiwlZWN4CisJbW92bAklZWN4LDQwKCVlc3ApCisJam56CUwwMjJmYXN0X2VuY19sb29wCisJbW92bAk0OCglZXNwKSwlZXNpCisJbW92bAk4KCVlZGkpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlY3gsOCglZXNpKQorCW1vdmwJJWVkeCwxMiglZXNpKQorCWNtcGwJJDAsMzE2KCVlc3ApCisJbW92bAk0NCglZXNwKSwlZWRpCisJamUJTDAyM3NraXBfZXplcm8KKwltb3ZsCSQ2MCwlZWN4CisJeG9ybAklZWF4LCVlYXgKKy5hbGlnbgkyLDB4OTAKKy5sb25nCTI4ODQ4OTIyOTcKK0wwMjNza2lwX2V6ZXJvOgorCW1vdmwJMjgoJWVzcCksJWVzcAorCXBvcGZsCitMMDEyZHJvcF9vdXQ6CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisJcHVzaGZsCisuYWxpZ24JNCwweDkwCitMMDIxZmFzdF9kZWNyeXB0OgorCWNtcGwJMzYoJWVzcCksJWVzaQorCWplCUwwMjRmYXN0X2RlY19pbl9wbGFjZQorCW1vdmwJJWVkaSw1MiglZXNwKQorLmFsaWduCTIsMHg5MAorLmFsaWduCTQsMHg5MAorTDAyNWZhc3RfZGVjX2xvb3A6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV9feDg2X0FFU19kZWNyeXB0CisJbW92bAk1MiglZXNwKSwlZWRpCisJbW92bAk0MCglZXNwKSwlZXNpCisJeG9ybAkoJWVkaSksJWVheAorCXhvcmwJNCglZWRpKSwlZWJ4CisJeG9ybAk4KCVlZGkpLCVlY3gKKwl4b3JsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlZGkKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJJWVzaSw1MiglZXNwKQorCWxlYWwJMTYoJWVzaSksJWVzaQorCW1vdmwJJWVzaSwzMiglZXNwKQorCWxlYWwJMTYoJWVkaSksJWVkaQorCW1vdmwJJWVkaSwzNiglZXNwKQorCXN1YmwJJDE2LCVlY3gKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwlqbnoJTDAyNWZhc3RfZGVjX2xvb3AKKwltb3ZsCTUyKCVlc3ApLCVlZGkKKwltb3ZsCTQ4KCVlc3ApLCVlc2kKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJam1wCUwwMjZmYXN0X2RlY19vdXQKKy5hbGlnbgk0LDB4OTAKK0wwMjRmYXN0X2RlY19pbl9wbGFjZToKK0wwMjdmYXN0X2RlY19pbl9wbGFjZV9sb29wOgorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisJbGVhbAk2MCglZXNwKSwlZWRpCisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVieCw0KCVlZGkpCisJbW92bAklZWN4LDgoJWVkaSkKKwltb3ZsCSVlZHgsMTIoJWVkaSkKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV9feDg2X0FFU19kZWNyeXB0CisJbW92bAk0OCglZXNwKSwlZWRpCisJbW92bAkzNiglZXNwKSwlZXNpCisJeG9ybAkoJWVkaSksJWVheAorCXhvcmwJNCglZWRpKSwlZWJ4CisJeG9ybAk4KCVlZGkpLCVlY3gKKwl4b3JsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlY3gsOCglZXNpKQorCW1vdmwJJWVkeCwxMiglZXNpKQorCWxlYWwJMTYoJWVzaSksJWVzaQorCW1vdmwJJWVzaSwzNiglZXNwKQorCWxlYWwJNjAoJWVzcCksJWVzaQorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVieCw0KCVlZGkpCisJbW92bAklZWN4LDgoJWVkaSkKKwltb3ZsCSVlZHgsMTIoJWVkaSkKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwltb3ZsCSVlc2ksMzIoJWVzcCkKKwlzdWJsCSQxNiwlZWN4CisJbW92bAklZWN4LDQwKCVlc3ApCisJam56CUwwMjdmYXN0X2RlY19pbl9wbGFjZV9sb29wCisuYWxpZ24JMiwweDkwCitMMDI2ZmFzdF9kZWNfb3V0OgorCWNtcGwJJDAsMzE2KCVlc3ApCisJbW92bAk0NCglZXNwKSwlZWRpCisJamUJTDAyOHNraXBfZHplcm8KKwltb3ZsCSQ2MCwlZWN4CisJeG9ybAklZWF4LCVlYXgKKy5hbGlnbgkyLDB4OTAKKy5sb25nCTI4ODQ4OTIyOTcKK0wwMjhza2lwX2R6ZXJvOgorCW1vdmwJMjgoJWVzcCksJWVzcAorCXBvcGZsCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisJcHVzaGZsCisuYWxpZ24JNCwweDkwCitMMDE1c2xvd193YXk6CisJbW92bAkoJWVheCksJWVheAorCW1vdmwJMzYoJWVzcCksJWVkaQorCWxlYWwJLTgwKCVlc3ApLCVlc2kKKwlhbmRsCSQtNjQsJWVzaQorCWxlYWwJLTE0MyglZWRpKSwlZWJ4CisJc3VibAklZXNpLCVlYngKKwluZWdsCSVlYngKKwlhbmRsCSQ5NjAsJWVieAorCXN1YmwJJWVieCwlZXNpCisJbGVhbAk3NjgoJWVzaSksJWVieAorCXN1YmwJJWVicCwlZWJ4CisJYW5kbAkkNzY4LCVlYngKKwlsZWFsCTIxNzYoJWVicCwlZWJ4LDEpLCVlYnAKKwlsZWFsCTI0KCVlc3ApLCVlZHgKKwl4Y2hnbAklZXNpLCVlc3AKKwlhZGRsCSQ0LCVlc3AKKwltb3ZsCSVlYnAsMjQoJWVzcCkKKwltb3ZsCSVlc2ksMjgoJWVzcCkKKwltb3ZsCSVlYXgsNTIoJWVzcCkKKwltb3ZsCSglZWR4KSwlZWF4CisJbW92bAk0KCVlZHgpLCVlYngKKwltb3ZsCTE2KCVlZHgpLCVlc2kKKwltb3ZsCTIwKCVlZHgpLCVlZHgKKwltb3ZsCSVlYXgsMzIoJWVzcCkKKwltb3ZsCSVlYngsMzYoJWVzcCkKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwltb3ZsCSVlZGksNDQoJWVzcCkKKwltb3ZsCSVlc2ksNDgoJWVzcCkKKwltb3ZsCSVlc2ksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJY21wbAkkMCwlZWR4CisJamUJTDAyOXNsb3dfZGVjcnlwdAorCWNtcGwJJDE2LCVlY3gKKwltb3ZsCSVlYngsJWVkeAorCWpiCUwwMzBzbG93X2VuY190YWlsCisJYnRsCSQyNSw1MiglZXNwKQorCWpuYwlMMDMxc2xvd19lbmNfeDg2CisJbW92cQkoJWVkaSksJW1tMAorCW1vdnEJOCglZWRpKSwlbW00CisuYWxpZ24JNCwweDkwCitMMDMyc2xvd19lbmNfbG9vcF9zc2U6CisJcHhvcgkoJWVzaSksJW1tMAorCXB4b3IJOCglZXNpKSwlbW00CisJbW92bAk0NCglZXNwKSwlZWRpCisJY2FsbAlfX3NzZV9BRVNfZW5jcnlwdF9jb21wYWN0CisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAkzNiglZXNwKSwlZWRpCisJbW92bAk0MCglZXNwKSwlZWN4CisJbW92cQklbW0wLCglZWRpKQorCW1vdnEJJW1tNCw4KCVlZGkpCisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJbGVhbAkxNiglZWRpKSwlZWR4CisJbW92bAklZWR4LDM2KCVlc3ApCisJc3VibAkkMTYsJWVjeAorCWNtcGwJJDE2LCVlY3gKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwlqYWUJTDAzMnNsb3dfZW5jX2xvb3Bfc3NlCisJdGVzdGwJJDE1LCVlY3gKKwlqbnoJTDAzMHNsb3dfZW5jX3RhaWwKKwltb3ZsCTQ4KCVlc3ApLCVlc2kKKwltb3ZxCSVtbTAsKCVlc2kpCisJbW92cQklbW00LDgoJWVzaSkKKwllbW1zCisJbW92bAkyOCglZXNwKSwlZXNwCisJcG9wZmwKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKwlwdXNoZmwKKy5hbGlnbgk0LDB4OTAKK0wwMzFzbG93X2VuY194ODY6CisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJNCglZWRpKSwlZWJ4CisuYWxpZ24JMiwweDkwCitMMDMzc2xvd19lbmNfbG9vcF94ODY6CisJbW92bAk4KCVlZGkpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwl4b3JsCSglZXNpKSwlZWF4CisJeG9ybAk0KCVlc2kpLCVlYngKKwl4b3JsCTgoJWVzaSksJWVjeAorCXhvcmwJMTIoJWVzaSksJWVkeAorCW1vdmwJNDQoJWVzcCksJWVkaQorCWNhbGwJX194ODZfQUVTX2VuY3J5cHRfY29tcGFjdAorCW1vdmwJMzIoJWVzcCksJWVzaQorCW1vdmwJMzYoJWVzcCksJWVkaQorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJbW92bAk0MCglZXNwKSwlZWN4CisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJbGVhbAkxNiglZWRpKSwlZWR4CisJbW92bAklZWR4LDM2KCVlc3ApCisJc3VibAkkMTYsJWVjeAorCWNtcGwJJDE2LCVlY3gKKwltb3ZsCSVlY3gsNDAoJWVzcCkKKwlqYWUJTDAzM3Nsb3dfZW5jX2xvb3BfeDg2CisJdGVzdGwJJDE1LCVlY3gKKwlqbnoJTDAzMHNsb3dfZW5jX3RhaWwKKwltb3ZsCTQ4KCVlc3ApLCVlc2kKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJbW92bAkyOCglZXNwKSwlZXNwCisJcG9wZmwKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKwlwdXNoZmwKKy5hbGlnbgk0LDB4OTAKK0wwMzBzbG93X2VuY190YWlsOgorCWVtbXMKKwltb3ZsCSVlZHgsJWVkaQorCW1vdmwJJDE2LCVlYngKKwlzdWJsCSVlY3gsJWVieAorCWNtcGwJJWVzaSwlZWRpCisJamUJTDAzNGVuY19pbl9wbGFjZQorLmFsaWduCTIsMHg5MAorLmxvbmcJMjc2NzQ1MTc4NQorCWptcAlMMDM1ZW5jX3NraXBfaW5fcGxhY2UKK0wwMzRlbmNfaW5fcGxhY2U6CisJbGVhbAkoJWVkaSwlZWN4LDEpLCVlZGkKK0wwMzVlbmNfc2tpcF9pbl9wbGFjZToKKwltb3ZsCSVlYngsJWVjeAorCXhvcmwJJWVheCwlZWF4CisuYWxpZ24JMiwweDkwCisubG9uZwkyODY4MTE1MDgxCisJbW92bAk0OCglZXNwKSwlZWRpCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKwltb3ZsCSQxNiw0MCglZXNwKQorCWptcAlMMDMzc2xvd19lbmNfbG9vcF94ODYKKy5hbGlnbgk0LDB4OTAKK0wwMjlzbG93X2RlY3J5cHQ6CisJYnRsCSQyNSw1MiglZXNwKQorCWpuYwlMMDM2c2xvd19kZWNfbG9vcF94ODYKKy5hbGlnbgkyLDB4OTAKK0wwMzdzbG93X2RlY19sb29wX3NzZToKKwltb3ZxCSglZXNpKSwlbW0wCisJbW92cQk4KCVlc2kpLCVtbTQKKwltb3ZsCTQ0KCVlc3ApLCVlZGkKKwljYWxsCV9fc3NlX0FFU19kZWNyeXB0X2NvbXBhY3QKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwlsZWFsCTYwKCVlc3ApLCVlYXgKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCTQ4KCVlc3ApLCVlZGkKKwltb3ZxCSglZXNpKSwlbW0xCisJbW92cQk4KCVlc2kpLCVtbTUKKwlweG9yCSglZWRpKSwlbW0wCisJcHhvcgk4KCVlZGkpLCVtbTQKKwltb3ZxCSVtbTEsKCVlZGkpCisJbW92cQklbW01LDgoJWVkaSkKKwlzdWJsCSQxNiwlZWN4CisJamMJTDAzOHNsb3dfZGVjX3BhcnRpYWxfc3NlCisJbW92cQklbW0wLCglZWJ4KQorCW1vdnEJJW1tNCw4KCVlYngpCisJbGVhbAkxNiglZWJ4KSwlZWJ4CisJbW92bAklZWJ4LDM2KCVlc3ApCisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDMyKCVlc3ApCisJbW92bAklZWN4LDQwKCVlc3ApCisJam56CUwwMzdzbG93X2RlY19sb29wX3NzZQorCWVtbXMKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwlwb3BmbAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorCXB1c2hmbAorLmFsaWduCTQsMHg5MAorTDAzOHNsb3dfZGVjX3BhcnRpYWxfc3NlOgorCW1vdnEJJW1tMCwoJWVheCkKKwltb3ZxCSVtbTQsOCglZWF4KQorCWVtbXMKKwlhZGRsCSQxNiwlZWN4CisJbW92bAklZWJ4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorLmFsaWduCTIsMHg5MAorLmxvbmcJMjc2NzQ1MTc4NQorCW1vdmwJMjgoJWVzcCksJWVzcAorCXBvcGZsCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisJcHVzaGZsCisuYWxpZ24JNCwweDkwCitMMDM2c2xvd19kZWNfbG9vcF94ODY6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwlsZWFsCTYwKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJNDQoJWVzcCksJWVkaQorCWNhbGwJX194ODZfQUVTX2RlY3J5cHRfY29tcGFjdAorCW1vdmwJNDgoJWVzcCksJWVkaQorCW1vdmwJNDAoJWVzcCksJWVzaQorCXhvcmwJKCVlZGkpLCVlYXgKKwl4b3JsCTQoJWVkaSksJWVieAorCXhvcmwJOCglZWRpKSwlZWN4CisJeG9ybAkxMiglZWRpKSwlZWR4CisJc3VibAkkMTYsJWVzaQorCWpjCUwwMzlzbG93X2RlY19wYXJ0aWFsX3g4NgorCW1vdmwJJWVzaSw0MCglZXNwKQorCW1vdmwJMzYoJWVzcCksJWVzaQorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJbGVhbAkxNiglZXNpKSwlZXNpCisJbW92bAklZXNpLDM2KCVlc3ApCisJbGVhbAk2MCglZXNwKSwlZXNpCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJMzIoJWVzcCksJWVzaQorCWxlYWwJMTYoJWVzaSksJWVzaQorCW1vdmwJJWVzaSwzMiglZXNwKQorCWpueglMMDM2c2xvd19kZWNfbG9vcF94ODYKKwltb3ZsCTI4KCVlc3ApLCVlc3AKKwlwb3BmbAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorCXB1c2hmbAorLmFsaWduCTQsMHg5MAorTDAzOXNsb3dfZGVjX3BhcnRpYWxfeDg2OgorCWxlYWwJNjAoJWVzcCksJWVzaQorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJNDAoJWVzcCksJWVjeAorCW1vdmwJMzYoJWVzcCksJWVkaQorCWxlYWwJNjAoJWVzcCksJWVzaQorLmFsaWduCTIsMHg5MAorLmxvbmcJMjc2NzQ1MTc4NQorCW1vdmwJMjgoJWVzcCksJWVzcAorCXBvcGZsCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisucHJpdmF0ZV9leHRlcm4JX194ODZfQUVTX3NldF9lbmNyeXB0X2tleQorLmFsaWduCTQKK19feDg2X0FFU19zZXRfZW5jcnlwdF9rZXk6CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjQoJWVzcCksJWVzaQorCW1vdmwJMzIoJWVzcCksJWVkaQorCXRlc3RsCSQtMSwlZXNpCisJanoJTDA0MGJhZHBvaW50ZXIKKwl0ZXN0bAkkLTEsJWVkaQorCWp6CUwwNDBiYWRwb2ludGVyCisJY2FsbAlMMDQxcGljX3BvaW50CitMMDQxcGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJTEFFU19UZS1MMDQxcGljX3BvaW50KCVlYnApLCVlYnAKKwlsZWFsCTIxNzYoJWVicCksJWVicAorCW1vdmwJLTEyOCglZWJwKSwlZWF4CisJbW92bAktOTYoJWVicCksJWVieAorCW1vdmwJLTY0KCVlYnApLCVlY3gKKwltb3ZsCS0zMiglZWJwKSwlZWR4CisJbW92bAkoJWVicCksJWVheAorCW1vdmwJMzIoJWVicCksJWVieAorCW1vdmwJNjQoJWVicCksJWVjeAorCW1vdmwJOTYoJWVicCksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVjeAorCWNtcGwJJDEyOCwlZWN4CisJamUJTDA0MjEwcm91bmRzCisJY21wbAkkMTkyLCVlY3gKKwlqZQlMMDQzMTJyb3VuZHMKKwljbXBsCSQyNTYsJWVjeAorCWplCUwwNDQxNHJvdW5kcworCW1vdmwJJC0yLCVlYXgKKwlqbXAJTDA0NWV4aXQKK0wwNDIxMHJvdW5kczoKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJeG9ybAklZWN4LCVlY3gKKwlqbXAJTDA0NjEwc2hvcnRjdXQKKy5hbGlnbgkyLDB4OTAKK0wwNDcxMGxvb3A6CisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJMTIoJWVkaSksJWVkeAorTDA0NjEwc2hvcnRjdXQ6CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQyNCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNocmwJJDE2LCVlZHgKKwltb3Z6YmwJJWRsLCVlc2kKKwl4b3JsCSVlYngsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkOCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVheAorCXhvcmwJODk2KCVlYnAsJWVjeCw0KSwlZWF4CisJbW92bAklZWF4LDE2KCVlZGkpCisJeG9ybAk0KCVlZGkpLCVlYXgKKwltb3ZsCSVlYXgsMjAoJWVkaSkKKwl4b3JsCTgoJWVkaSksJWVheAorCW1vdmwJJWVheCwyNCglZWRpKQorCXhvcmwJMTIoJWVkaSksJWVheAorCW1vdmwJJWVheCwyOCglZWRpKQorCWluY2wJJWVjeAorCWFkZGwJJDE2LCVlZGkKKwljbXBsCSQxMCwlZWN4CisJamwJTDA0NzEwbG9vcAorCW1vdmwJJDEwLDgwKCVlZGkpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJTDA0NWV4aXQKK0wwNDMxMnJvdW5kczoKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCw4KCVlZGkpCisJbW92bAklZWR4LDEyKCVlZGkpCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAkyMCglZXNpKSwlZWR4CisJbW92bAklZWN4LDE2KCVlZGkpCisJbW92bAklZWR4LDIwKCVlZGkpCisJeG9ybAklZWN4LCVlY3gKKwlqbXAJTDA0ODEyc2hvcnRjdXQKKy5hbGlnbgkyLDB4OTAKK0wwNDkxMmxvb3A6CisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJMjAoJWVkaSksJWVkeAorTDA0ODEyc2hvcnRjdXQ6CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQyNCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNocmwJJDE2LCVlZHgKKwltb3Z6YmwJJWRsLCVlc2kKKwl4b3JsCSVlYngsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkOCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVheAorCXhvcmwJODk2KCVlYnAsJWVjeCw0KSwlZWF4CisJbW92bAklZWF4LDI0KCVlZGkpCisJeG9ybAk0KCVlZGkpLCVlYXgKKwltb3ZsCSVlYXgsMjgoJWVkaSkKKwl4b3JsCTgoJWVkaSksJWVheAorCW1vdmwJJWVheCwzMiglZWRpKQorCXhvcmwJMTIoJWVkaSksJWVheAorCW1vdmwJJWVheCwzNiglZWRpKQorCWNtcGwJJDcsJWVjeAorCWplCUwwNTAxMmJyZWFrCisJaW5jbAklZWN4CisJeG9ybAkxNiglZWRpKSwlZWF4CisJbW92bAklZWF4LDQwKCVlZGkpCisJeG9ybAkyMCglZWRpKSwlZWF4CisJbW92bAklZWF4LDQ0KCVlZGkpCisJYWRkbAkkMjQsJWVkaQorCWptcAlMMDQ5MTJsb29wCitMMDUwMTJicmVhazoKKwltb3ZsCSQxMiw3MiglZWRpKQorCXhvcmwJJWVheCwlZWF4CisJam1wCUwwNDVleGl0CitMMDQ0MTRyb3VuZHM6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJWVkeCwxMiglZWRpKQorCW1vdmwJMTYoJWVzaSksJWVheAorCW1vdmwJMjAoJWVzaSksJWVieAorCW1vdmwJMjQoJWVzaSksJWVjeAorCW1vdmwJMjgoJWVzaSksJWVkeAorCW1vdmwJJWVheCwxNiglZWRpKQorCW1vdmwJJWVieCwyMCglZWRpKQorCW1vdmwJJWVjeCwyNCglZWRpKQorCW1vdmwJJWVkeCwyOCglZWRpKQorCXhvcmwJJWVjeCwlZWN4CisJam1wCUwwNTExNHNob3J0Y3V0CisuYWxpZ24JMiwweDkwCitMMDUyMTRsb29wOgorCW1vdmwJMjgoJWVkaSksJWVkeAorTDA1MTE0c2hvcnRjdXQ6CisJbW92bAkoJWVkaSksJWVheAorCW1vdnpibAklZGwsJWVzaQorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkMjQsJWVieAorCXhvcmwJJWVieCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwlzaHJsCSQxNiwlZWR4CisJbW92emJsCSVkbCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDgsJWVieAorCXhvcmwJJWVieCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwl4b3JsCTg5NiglZWJwLCVlY3gsNCksJWVheAorCW1vdmwJJWVheCwzMiglZWRpKQorCXhvcmwJNCglZWRpKSwlZWF4CisJbW92bAklZWF4LDM2KCVlZGkpCisJeG9ybAk4KCVlZGkpLCVlYXgKKwltb3ZsCSVlYXgsNDAoJWVkaSkKKwl4b3JsCTEyKCVlZGkpLCVlYXgKKwltb3ZsCSVlYXgsNDQoJWVkaSkKKwljbXBsCSQ2LCVlY3gKKwlqZQlMMDUzMTRicmVhaworCWluY2wJJWVjeAorCW1vdmwJJWVheCwlZWR4CisJbW92bAkxNiglZWRpKSwlZWF4CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwl4b3JsCSVlYngsJWVheAorCW1vdnpibAktMTI4KCVlYnAsJWVzaSwxKSwlZWJ4CisJc2hybAkkMTYsJWVkeAorCXNobGwJJDgsJWVieAorCW1vdnpibAklZGwsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJbW92emJsCS0xMjgoJWVicCwlZXNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKwltb3Z6YmwJLTEyOCglZWJwLCVlc2ksMSksJWVieAorCXNobGwJJDI0LCVlYngKKwl4b3JsCSVlYngsJWVheAorCW1vdmwJJWVheCw0OCglZWRpKQorCXhvcmwJMjAoJWVkaSksJWVheAorCW1vdmwJJWVheCw1MiglZWRpKQorCXhvcmwJMjQoJWVkaSksJWVheAorCW1vdmwJJWVheCw1NiglZWRpKQorCXhvcmwJMjgoJWVkaSksJWVheAorCW1vdmwJJWVheCw2MCglZWRpKQorCWFkZGwJJDMyLCVlZGkKKwlqbXAJTDA1MjE0bG9vcAorTDA1MzE0YnJlYWs6CisJbW92bAkkMTQsNDgoJWVkaSkKKwl4b3JsCSVlYXgsJWVheAorCWptcAlMMDQ1ZXhpdAorTDA0MGJhZHBvaW50ZXI6CisJbW92bAkkLTEsJWVheAorTDA0NWV4aXQ6CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX2Flc19ub2h3X3NldF9lbmNyeXB0X2tleQorLnByaXZhdGVfZXh0ZXJuCV9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKy5hbGlnbgk0CitfYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5OgorTF9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXlfYmVnaW46CisJY2FsbAlfX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5CisJcmV0CisuZ2xvYmwJX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleQorLnByaXZhdGVfZXh0ZXJuCV9hZXNfbm9od19zZXRfZGVjcnlwdF9rZXkKKy5hbGlnbgk0CitfYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5OgorTF9hZXNfbm9od19zZXRfZGVjcnlwdF9rZXlfYmVnaW46CisJY2FsbAlfX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5CisJY21wbAkkMCwlZWF4CisJamUJTDA1NHByb2NlZWQKKwlyZXQKK0wwNTRwcm9jZWVkOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwltb3ZsCTI0MCglZXNpKSwlZWN4CisJbGVhbAkoLCVlY3gsNCksJWVjeAorCWxlYWwJKCVlc2ksJWVjeCw0KSwlZWRpCisuYWxpZ24JMiwweDkwCitMMDU1aW52ZXJ0OgorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJKCVlZGkpLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlYngsNCglZWRpKQorCW1vdmwJJWVjeCwoJWVzaSkKKwltb3ZsCSVlZHgsNCglZXNpKQorCW1vdmwJOCglZXNpKSwlZWF4CisJbW92bAkxMiglZXNpKSwlZWJ4CisJbW92bAk4KCVlZGkpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCSVlYXgsOCglZWRpKQorCW1vdmwJJWVieCwxMiglZWRpKQorCW1vdmwJJWVjeCw4KCVlc2kpCisJbW92bAklZWR4LDEyKCVlc2kpCisJYWRkbAkkMTYsJWVzaQorCXN1YmwJJDE2LCVlZGkKKwljbXBsCSVlZGksJWVzaQorCWpuZQlMMDU1aW52ZXJ0CisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAkyNDAoJWVkaSksJWVzaQorCWxlYWwJLTIoJWVzaSwlZXNpLDEpLCVlc2kKKwlsZWFsCSglZWRpLCVlc2ksOCksJWVzaQorCW1vdmwJJWVzaSwyOCglZXNwKQorCW1vdmwJMTYoJWVkaSksJWVheAorLmFsaWduCTIsMHg5MAorTDA1NnBlcm11dGU6CisJYWRkbAkkMTYsJWVkaQorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlYngKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJ4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlc2ksJWVieAorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVieCwlZWJwCisJbGVhbAkoJWVieCwlZWJ4LDEpLCVlY3gKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWN4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWN4LCVlYnAKKwlsZWFsCSglZWN4LCVlY3gsMSksJWVkeAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJeG9ybAklZWF4LCVlY3gKKwlzdWJsCSVlYnAsJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVkeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9sbAkkOCwlZWF4CisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCTQoJWVkaSksJWVicAorCXhvcmwJJWVieCwlZWF4CisJeG9ybAklZWR4LCVlYngKKwl4b3JsCSVlY3gsJWVheAorCXJvbGwJJDI0LCVlYngKKwl4b3JsCSVlZHgsJWVjeAorCXhvcmwJJWVkeCwlZWF4CisJcm9sbAkkMTYsJWVjeAorCXhvcmwJJWVieCwlZWF4CisJcm9sbAkkOCwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwltb3ZsCSVlYnAsJWVieAorCXhvcmwJJWVkeCwlZWF4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVieCwlZWJwCisJbGVhbAkoJWVieCwlZWJ4LDEpLCVlY3gKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWN4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlc2ksJWVjeAorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVjeCwlZWJwCisJbGVhbAkoJWVjeCwlZWN4LDEpLCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWR4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVzaSwlZWR4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWR4LCVlYnAKKwlsZWFsCSglZWR4LCVlZHgsMSksJWVheAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJeG9ybAklZWJ4LCVlZHgKKwlzdWJsCSVlYnAsJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVheAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9sbAkkOCwlZWJ4CisJeG9ybAklZXNpLCVlYXgKKwltb3ZsCTgoJWVkaSksJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZHgsJWVieAorCXJvbGwJJDI0LCVlY3gKKwl4b3JsCSVlYXgsJWVkeAorCXhvcmwJJWVheCwlZWJ4CisJcm9sbAkkMTYsJWVkeAorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkOCwlZWF4CisJeG9ybAklZWR4LCVlYngKKwltb3ZsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZWJ4CisJbW92bAklZWJ4LDQoJWVkaSkKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwlhbmRsCSVlY3gsJWVicAorCWxlYWwJKCVlY3gsJWVjeCwxKSwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlzaHJsCSQ3LCVlYnAKKwlzdWJsCSVlYnAsJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVkeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSQyMTU1OTA1MTUyLCVlYnAKKwlhbmRsCSVlZHgsJWVicAorCWxlYWwJKCVlZHgsJWVkeCwxKSwlZWF4CisJbW92bAklZWJwLCVlc2kKKwlzaHJsCSQ3LCVlYnAKKwlzdWJsCSVlYnAsJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVheAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVheAorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlYngKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXhvcmwJJWVjeCwlZWF4CisJc3VibAklZWJwLCVlc2kKKwlhbmRsCSQ0Mjc4MTI0Mjg2LCVlYngKKwlhbmRsCSQ0NTQ3NjEyNDMsJWVzaQorCXJvbGwJJDgsJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJbW92bAkxMiglZWRpKSwlZWJwCisJeG9ybAklZWR4LCVlY3gKKwl4b3JsCSVlYngsJWVkeAorCXhvcmwJJWVheCwlZWN4CisJcm9sbAkkMjQsJWVkeAorCXhvcmwJJWVieCwlZWF4CisJeG9ybAklZWJ4LCVlY3gKKwlyb2xsCSQxNiwlZWF4CisJeG9ybAklZWR4LCVlY3gKKwlyb2xsCSQ4LCVlYngKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVicCwlZWR4CisJeG9ybAklZWJ4LCVlY3gKKwltb3ZsCSVlY3gsOCglZWRpKQorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVkeCwlZWJwCisJbGVhbAkoJWVkeCwlZWR4LDEpLCVlYXgKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWF4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlc2ksJWVheAorCW1vdmwJJDIxNTU5MDUxNTIsJWVicAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkoJWVheCwlZWF4LDEpLCVlYngKKwltb3ZsCSVlYnAsJWVzaQorCXNocmwJJDcsJWVicAorCXN1YmwJJWVicCwlZXNpCisJYW5kbAkkNDI3ODEyNDI4NiwlZWJ4CisJYW5kbAkkNDU0NzYxMjQzLCVlc2kKKwl4b3JsCSVlZHgsJWVheAorCXhvcmwJJWVzaSwlZWJ4CisJbW92bAkkMjE1NTkwNTE1MiwlZWJwCisJYW5kbAklZWJ4LCVlYnAKKwlsZWFsCSglZWJ4LCVlYngsMSksJWVjeAorCW1vdmwJJWVicCwlZXNpCisJc2hybAkkNywlZWJwCisJeG9ybAklZWR4LCVlYngKKwlzdWJsCSVlYnAsJWVzaQorCWFuZGwJJDQyNzgxMjQyODYsJWVjeAorCWFuZGwJJDQ1NDc2MTI0MywlZXNpCisJcm9sbAkkOCwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwltb3ZsCTE2KCVlZGkpLCVlYnAKKwl4b3JsCSVlYXgsJWVkeAorCXhvcmwJJWVjeCwlZWF4CisJeG9ybAklZWJ4LCVlZHgKKwlyb2xsCSQyNCwlZWF4CisJeG9ybAklZWN4LCVlYngKKwl4b3JsCSVlY3gsJWVkeAorCXJvbGwJJDE2LCVlYngKKwl4b3JsCSVlYXgsJWVkeAorCXJvbGwJJDgsJWVjeAorCXhvcmwJJWVieCwlZWR4CisJbW92bAklZWJwLCVlYXgKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVkeCwxMiglZWRpKQorCWNtcGwJMjgoJWVzcCksJWVkaQorCWpiCUwwNTZwZXJtdXRlCisJeG9ybAklZWF4LCVlYXgKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5ieXRlCTY1LDY5LDgzLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw0NCwzMiw2Nyw4Miw4OQorLmJ5dGUJODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0CisuYnl0ZQkxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5zZWN0aW9uIF9fSU1QT1JULF9fcG9pbnRlcnMsbm9uX2xhenlfc3ltYm9sX3BvaW50ZXJzCitMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0cjoKKy5pbmRpcmVjdF9zeW1ib2wJX09QRU5TU0xfaWEzMmNhcF9QCisubG9uZwkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODYuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmUwZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Ni5TCkBAIC0wLDAgKzEsMjQzMiBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCV9hZXNuaV9lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2Flc25pX2VuY3J5cHQKKy5hbGlnbgk0CitfYWVzbmlfZW5jcnlwdDoKK0xfYWVzbmlfZW5jcnlwdF9iZWdpbjoKKwltb3ZsCTQoJWVzcCksJWVheAorCW1vdmwJMTIoJWVzcCksJWVkeAorCW1vdnVwcwkoJWVheCksJXhtbTIKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJbW92bAk4KCVlc3ApLCVlYXgKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwMDBlbmMxX2xvb3BfMToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpueglMMDAwZW5jMV9sb29wXzEKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTIsKCVlYXgpCisJcHhvcgkleG1tMiwleG1tMgorCXJldAorLmdsb2JsCV9hZXNuaV9kZWNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2Flc25pX2RlY3J5cHQKKy5hbGlnbgk0CitfYWVzbmlfZGVjcnlwdDoKK0xfYWVzbmlfZGVjcnlwdF9iZWdpbjoKKwltb3ZsCTQoJWVzcCksJWVheAorCW1vdmwJMTIoJWVzcCksJWVkeAorCW1vdnVwcwkoJWVheCksJXhtbTIKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJbW92bAk4KCVlc3ApLCVlYXgKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwMDFkZWMxX2xvb3BfMjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpueglMMDAxZGVjMV9sb29wXzIKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTIsKCVlYXgpCisJcHhvcgkleG1tMiwleG1tMgorCXJldAorLnByaXZhdGVfZXh0ZXJuCV9fYWVzbmlfZW5jcnlwdDIKKy5hbGlnbgk0CitfX2Flc25pX2VuY3J5cHQyOgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwlzaGxsCSQ0LCVlY3gKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwltb3Z1cHMJMzIoJWVkeCksJXhtbTAKKwlsZWFsCTMyKCVlZHgsJWVjeCwxKSwlZWR4CisJbmVnbAklZWN4CisJYWRkbAkkMTYsJWVjeAorTDAwMmVuYzJfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0xCisJYWRkbAkkMzIsJWVjeAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJTDAwMmVuYzJfbG9vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTYKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX2Flc25pX2RlY3J5cHQyCisuYWxpZ24JNAorX19hZXNuaV9kZWNyeXB0MjoKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJc2hsbAkkNCwlZWN4CisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0zCisJbW92dXBzCTMyKCVlZHgpLCV4bW0wCisJbGVhbAkzMiglZWR4LCVlY3gsMSksJWVkeAorCW5lZ2wJJWVjeAorCWFkZGwJJDE2LCVlY3gKK0wwMDNkZWMyX2xvb3A6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwltb3Z1cHMJKCVlZHgsJWVjeCwxKSwleG1tMQorCWFkZGwJJDMyLCVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorCW1vdnVwcwktMTYoJWVkeCwlZWN4LDEpLCV4bW0wCisJam56CUwwMDNkZWMyX2xvb3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjE2CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX19hZXNuaV9lbmNyeXB0MworLmFsaWduCTQKK19fYWVzbmlfZW5jcnlwdDM6CisJbW92dXBzCSglZWR4KSwleG1tMAorCXNobGwJJDQsJWVjeAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKwltb3Z1cHMJMzIoJWVkeCksJXhtbTAKKwlsZWFsCTMyKCVlZHgsJWVjeCwxKSwlZWR4CisJbmVnbAklZWN4CisJYWRkbAkkMTYsJWVjeAorTDAwNGVuYzNfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKwltb3Z1cHMJKCVlZHgsJWVjeCwxKSwleG1tMQorCWFkZGwJJDMyLCVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKwltb3Z1cHMJLTE2KCVlZHgsJWVjeCwxKSwleG1tMAorCWpueglMMDA0ZW5jM19sb29wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjI0CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX19hZXNuaV9kZWNyeXB0MworLmFsaWduCTQKK19fYWVzbmlfZGVjcnlwdDM6CisJbW92dXBzCSglZWR4KSwleG1tMAorCXNobGwJJDQsJWVjeAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKwltb3Z1cHMJMzIoJWVkeCksJXhtbTAKKwlsZWFsCTMyKCVlZHgsJWVjeCwxKSwlZWR4CisJbmVnbAklZWN4CisJYWRkbAkkMTYsJWVjeAorTDAwNWRlYzNfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKwltb3Z1cHMJKCVlZHgsJWVjeCwxKSwleG1tMQorCWFkZGwJJDMyLCVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKwltb3Z1cHMJLTE2KCVlZHgsJWVjeCwxKSwleG1tMAorCWpueglMMDA1ZGVjM19sb29wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjI0CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX19hZXNuaV9lbmNyeXB0NAorLmFsaWduCTQKK19fYWVzbmlfZW5jcnlwdDQ6CisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCXNobGwJJDQsJWVjeAorCXhvcnBzCSV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW01CisJbW92dXBzCTMyKCVlZHgpLCV4bW0wCisJbGVhbAkzMiglZWR4LCVlY3gsMSksJWVkeAorCW5lZ2wJJWVjeAorLmJ5dGUJMTUsMzEsNjQsMAorCWFkZGwJJDE2LCVlY3gKK0wwMDZlbmM0X2xvb3A6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0xCisJYWRkbAkkMzIsJWVjeAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3Z1cHMJLTE2KCVlZHgsJWVjeCwxKSwleG1tMAorCWpueglMMDA2ZW5jNF9sb29wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMzIKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX2Flc25pX2RlY3J5cHQ0CisuYWxpZ24JNAorX19hZXNuaV9kZWNyeXB0NDoKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJc2hsbAkkNCwlZWN4CisJeG9ycHMJJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tNAorCXB4b3IJJXhtbTAsJXhtbTUKKwltb3Z1cHMJMzIoJWVkeCksJXhtbTAKKwlsZWFsCTMyKCVlZHgsJWVjeCwxKSwlZWR4CisJbmVnbAklZWN4CisuYnl0ZQkxNSwzMSw2NCwwCisJYWRkbAkkMTYsJWVjeAorTDAwN2RlYzRfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorCW1vdnVwcwktMTYoJWVkeCwlZWN4LDEpLCV4bW0wCisJam56CUwwMDdkZWM0X2xvb3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIzMgorCXJldAorLnByaXZhdGVfZXh0ZXJuCV9fYWVzbmlfZW5jcnlwdDYKKy5hbGlnbgk0CitfX2Flc25pX2VuY3J5cHQ2OgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwlzaGxsCSQ0LCVlY3gKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJcHhvcgkleG1tMCwleG1tNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0wCisJYWRkbAkkMTYsJWVjeAorCWptcAlMMDA4X2Flc25pX2VuY3J5cHQ2X2lubmVyCisuYWxpZ24JNCwweDkwCitMMDA5ZW5jNl9sb29wOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorTDAwOF9hZXNuaV9lbmNyeXB0Nl9pbm5lcjoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKK0xfYWVzbmlfZW5jcnlwdDZfZW50ZXI6CisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJTDAwOWVuYzZfbG9vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDI0OAorCXJldAorLnByaXZhdGVfZXh0ZXJuCV9fYWVzbmlfZGVjcnlwdDYKKy5hbGlnbgk0CitfX2Flc25pX2RlY3J5cHQ2OgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwlzaGxsCSQ0LCVlY3gKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCXB4b3IJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwluZWdsCSVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisJcHhvcgkleG1tMCwleG1tNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0wCisJYWRkbAkkMTYsJWVjeAorCWptcAlMMDEwX2Flc25pX2RlY3J5cHQ2X2lubmVyCisuYWxpZ24JNCwweDkwCitMMDExZGVjNl9sb29wOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorTDAxMF9hZXNuaV9kZWNyeXB0Nl9pbm5lcjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKK0xfYWVzbmlfZGVjcnlwdDZfZW50ZXI6CisJbW92dXBzCSglZWR4LCVlY3gsMSksJXhtbTEKKwlhZGRsCSQzMiwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJTDAxMWRlYzZfbG9vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDI0OAorCXJldAorLmdsb2JsCV9hZXNuaV9lY2JfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuCV9hZXNuaV9lY2JfZW5jcnlwdAorLmFsaWduCTQKK19hZXNuaV9lY2JfZW5jcnlwdDoKK0xfYWVzbmlfZWNiX2VuY3J5cHRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVheAorCW1vdmwJMzIoJWVzcCksJWVkeAorCW1vdmwJMzYoJWVzcCksJWVieAorCWFuZGwJJC0xNiwlZWF4CisJanoJTDAxMmVjYl9yZXQKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJdGVzdGwJJWVieCwlZWJ4CisJanoJTDAxM2VjYl9kZWNyeXB0CisJbW92bAklZWR4LCVlYnAKKwltb3ZsCSVlY3gsJWVieAorCWNtcGwJJDk2LCVlYXgKKwlqYglMMDE0ZWNiX2VuY190YWlsCisJbW92ZHF1CSglZXNpKSwleG1tMgorCW1vdmRxdQkxNiglZXNpKSwleG1tMworCW1vdmRxdQkzMiglZXNpKSwleG1tNAorCW1vdmRxdQk0OCglZXNpKSwleG1tNQorCW1vdmRxdQk2NCglZXNpKSwleG1tNgorCW1vdmRxdQk4MCglZXNpKSwleG1tNworCWxlYWwJOTYoJWVzaSksJWVzaQorCXN1YmwJJDk2LCVlYXgKKwlqbXAJTDAxNWVjYl9lbmNfbG9vcDZfZW50ZXIKKy5hbGlnbgk0LDB4OTAKK0wwMTZlY2JfZW5jX2xvb3A2OgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJbW92dXBzCSV4bW03LDgwKCVlZGkpCisJbGVhbAk5NiglZWRpKSwlZWRpCisJbW92ZHF1CTgwKCVlc2kpLCV4bW03CisJbGVhbAk5NiglZXNpKSwlZXNpCitMMDE1ZWNiX2VuY19sb29wNl9lbnRlcjoKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDYKKwltb3ZsCSVlYnAsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJc3VibAkkOTYsJWVheAorCWpuYwlMMDE2ZWNiX2VuY19sb29wNgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwltb3Z1cHMJJXhtbTcsODAoJWVkaSkKKwlsZWFsCTk2KCVlZGkpLCVlZGkKKwlhZGRsCSQ5NiwlZWF4CisJanoJTDAxMmVjYl9yZXQKK0wwMTRlY2JfZW5jX3RhaWw6CisJbW92dXBzCSglZXNpKSwleG1tMgorCWNtcGwJJDMyLCVlYXgKKwlqYglMMDE3ZWNiX2VuY19vbmUKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTMKKwlqZQlMMDE4ZWNiX2VuY190d28KKwltb3Z1cHMJMzIoJWVzaSksJXhtbTQKKwljbXBsCSQ2NCwlZWF4CisJamIJTDAxOWVjYl9lbmNfdGhyZWUKKwltb3Z1cHMJNDgoJWVzaSksJXhtbTUKKwlqZQlMMDIwZWNiX2VuY19mb3VyCisJbW92dXBzCTY0KCVlc2kpLCV4bW02CisJeG9ycHMJJXhtbTcsJXhtbTcKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDYKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJam1wCUwwMTJlY2JfcmV0CisuYWxpZ24JNCwweDkwCitMMDE3ZWNiX2VuY19vbmU6CisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCWxlYWwJMzIoJWVkeCksJWVkeAorCXhvcnBzCSV4bW0wLCV4bW0yCitMMDIxZW5jMV9sb29wXzM6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJTDAyMWVuYzFfbG9vcF8zCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwlqbXAJTDAxMmVjYl9yZXQKKy5hbGlnbgk0LDB4OTAKK0wwMThlY2JfZW5jX3R3bzoKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDIKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJam1wCUwwMTJlY2JfcmV0CisuYWxpZ24JNCwweDkwCitMMDE5ZWNiX2VuY190aHJlZToKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJam1wCUwwMTJlY2JfcmV0CisuYWxpZ24JNCwweDkwCitMMDIwZWNiX2VuY19mb3VyOgorCWNhbGwJX19hZXNuaV9lbmNyeXB0NAorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwlqbXAJTDAxMmVjYl9yZXQKKy5hbGlnbgk0LDB4OTAKK0wwMTNlY2JfZGVjcnlwdDoKKwltb3ZsCSVlZHgsJWVicAorCW1vdmwJJWVjeCwlZWJ4CisJY21wbAkkOTYsJWVheAorCWpiCUwwMjJlY2JfZGVjX3RhaWwKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJbW92ZHF1CTgwKCVlc2kpLCV4bW03CisJbGVhbAk5NiglZXNpKSwlZXNpCisJc3VibAkkOTYsJWVheAorCWptcAlMMDIzZWNiX2RlY19sb29wNl9lbnRlcgorLmFsaWduCTQsMHg5MAorTDAyNGVjYl9kZWNfbG9vcDY6CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdmRxdQkoJWVzaSksJXhtbTIKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3ZkcXUJMzIoJWVzaSksJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwltb3ZkcXUJNjQoJWVzaSksJXhtbTYKKwltb3Z1cHMJJXhtbTcsODAoJWVkaSkKKwlsZWFsCTk2KCVlZGkpLCVlZGkKKwltb3ZkcXUJODAoJWVzaSksJXhtbTcKKwlsZWFsCTk2KCVlc2kpLCVlc2kKK0wwMjNlY2JfZGVjX2xvb3A2X2VudGVyOgorCWNhbGwJX19hZXNuaV9kZWNyeXB0NgorCW1vdmwJJWVicCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlzdWJsCSQ5NiwlZWF4CisJam5jCUwwMjRlY2JfZGVjX2xvb3A2CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCW1vdnVwcwkleG1tNSw0OCglZWRpKQorCW1vdnVwcwkleG1tNiw2NCglZWRpKQorCW1vdnVwcwkleG1tNyw4MCglZWRpKQorCWxlYWwJOTYoJWVkaSksJWVkaQorCWFkZGwJJDk2LCVlYXgKKwlqeglMMDEyZWNiX3JldAorTDAyMmVjYl9kZWNfdGFpbDoKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJY21wbAkkMzIsJWVheAorCWpiCUwwMjVlY2JfZGVjX29uZQorCW1vdnVwcwkxNiglZXNpKSwleG1tMworCWplCUwwMjZlY2JfZGVjX3R3bworCW1vdnVwcwkzMiglZXNpKSwleG1tNAorCWNtcGwJJDY0LCVlYXgKKwlqYglMMDI3ZWNiX2RlY190aHJlZQorCW1vdnVwcwk0OCglZXNpKSwleG1tNQorCWplCUwwMjhlY2JfZGVjX2ZvdXIKKwltb3Z1cHMJNjQoJWVzaSksJXhtbTYKKwl4b3JwcwkleG1tNywleG1tNworCWNhbGwJX19hZXNuaV9kZWNyeXB0NgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlqbXAJTDAxMmVjYl9yZXQKKy5hbGlnbgk0LDB4OTAKK0wwMjVlY2JfZGVjX29uZToKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwMjlkZWMxX2xvb3BfNDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpueglMMDI5ZGVjMV9sb29wXzQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJbW92dXBzCSV4bW0yLCglZWRpKQorCWptcAlMMDEyZWNiX3JldAorLmFsaWduCTQsMHg5MAorTDAyNmVjYl9kZWNfdHdvOgorCWNhbGwJX19hZXNuaV9kZWNyeXB0MgorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwlqbXAJTDAxMmVjYl9yZXQKKy5hbGlnbgk0LDB4OTAKK0wwMjdlY2JfZGVjX3RocmVlOgorCWNhbGwJX19hZXNuaV9kZWNyeXB0MworCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwlqbXAJTDAxMmVjYl9yZXQKKy5hbGlnbgk0LDB4OTAKK0wwMjhlY2JfZGVjX2ZvdXI6CisJY2FsbAlfX2Flc25pX2RlY3J5cHQ0CisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCW1vdnVwcwkleG1tNSw0OCglZWRpKQorTDAxMmVjYl9yZXQ6CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5nbG9ibAlfYWVzbmlfY2NtNjRfZW5jcnlwdF9ibG9ja3MKKy5wcml2YXRlX2V4dGVybglfYWVzbmlfY2NtNjRfZW5jcnlwdF9ibG9ja3MKKy5hbGlnbgk0CitfYWVzbmlfY2NtNjRfZW5jcnlwdF9ibG9ja3M6CitMX2Flc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDYwLCVlc3AKKwlhbmRsCSQtMTYsJWVzcAorCW1vdmwJJWVicCw0OCglZXNwKQorCW1vdmRxdQkoJWVieCksJXhtbTcKKwltb3ZkcXUJKCVlY3gpLCV4bW0zCisJbW92bAkyNDAoJWVkeCksJWVjeAorCW1vdmwJJDIwMjE4MjE1OSwoJWVzcCkKKwltb3ZsCSQxMzQ4MTAxMjMsNCglZXNwKQorCW1vdmwJJDY3NDM4MDg3LDgoJWVzcCkKKwltb3ZsCSQ2NjA1MSwxMiglZXNwKQorCW1vdmwJJDEsJWVieAorCXhvcmwJJWVicCwlZWJwCisJbW92bAklZWJ4LDE2KCVlc3ApCisJbW92bAklZWJwLDIwKCVlc3ApCisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAklZWJwLDI4KCVlc3ApCisJc2hsbAkkNCwlZWN4CisJbW92bAkkMTYsJWVieAorCWxlYWwJKCVlZHgpLCVlYnAKKwltb3ZkcWEJKCVlc3ApLCV4bW01CisJbW92ZHFhCSV4bW03LCV4bW0yCisJbGVhbAkzMiglZWR4LCVlY3gsMSksJWVkeAorCXN1YmwJJWVjeCwlZWJ4CisuYnl0ZQkxMDIsMTUsNTYsMCwyNTMKK0wwMzBjY202NF9lbmNfb3V0ZXI6CisJbW92dXBzCSglZWJwKSwleG1tMAorCW1vdmwJJWVieCwlZWN4CisJbW92dXBzCSglZXNpKSwleG1tNgorCXhvcnBzCSV4bW0wLCV4bW0yCisJbW92dXBzCTE2KCVlYnApLCV4bW0xCisJeG9ycHMJJXhtbTYsJXhtbTAKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwkzMiglZWJwKSwleG1tMAorTDAzMWNjbTY0X2VuYzJfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCW1vdnVwcwkoJWVkeCwlZWN4LDEpLCV4bW0xCisJYWRkbAkkMzIsJWVjeAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCS0xNiglZWR4LCVlY3gsMSksJXhtbTAKKwlqbnoJTDAzMWNjbTY0X2VuYzJfbG9vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcGFkZHEJMTYoJWVzcCksJXhtbTcKKwlkZWNsCSVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorCWxlYWwJMTYoJWVzaSksJWVzaQorCXhvcnBzCSV4bW0yLCV4bW02CisJbW92ZHFhCSV4bW03LCV4bW0yCisJbW92dXBzCSV4bW02LCglZWRpKQorLmJ5dGUJMTAyLDE1LDU2LDAsMjEzCisJbGVhbAkxNiglZWRpKSwlZWRpCisJam56CUwwMzBjY202NF9lbmNfb3V0ZXIKKwltb3ZsCTQ4KCVlc3ApLCVlc3AKKwltb3ZsCTQwKCVlc3ApLCVlZGkKKwltb3Z1cHMJJXhtbTMsKCVlZGkpCisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5nbG9ibAlfYWVzbmlfY2NtNjRfZGVjcnlwdF9ibG9ja3MKKy5wcml2YXRlX2V4dGVybglfYWVzbmlfY2NtNjRfZGVjcnlwdF9ibG9ja3MKKy5hbGlnbgk0CitfYWVzbmlfY2NtNjRfZGVjcnlwdF9ibG9ja3M6CitMX2Flc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYngKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDYwLCVlc3AKKwlhbmRsCSQtMTYsJWVzcAorCW1vdmwJJWVicCw0OCglZXNwKQorCW1vdmRxdQkoJWVieCksJXhtbTcKKwltb3ZkcXUJKCVlY3gpLCV4bW0zCisJbW92bAkyNDAoJWVkeCksJWVjeAorCW1vdmwJJDIwMjE4MjE1OSwoJWVzcCkKKwltb3ZsCSQxMzQ4MTAxMjMsNCglZXNwKQorCW1vdmwJJDY3NDM4MDg3LDgoJWVzcCkKKwltb3ZsCSQ2NjA1MSwxMiglZXNwKQorCW1vdmwJJDEsJWVieAorCXhvcmwJJWVicCwlZWJwCisJbW92bAklZWJ4LDE2KCVlc3ApCisJbW92bAklZWJwLDIwKCVlc3ApCisJbW92bAklZWJwLDI0KCVlc3ApCisJbW92bAklZWJwLDI4KCVlc3ApCisJbW92ZHFhCSglZXNwKSwleG1tNQorCW1vdmRxYQkleG1tNywleG1tMgorCW1vdmwJJWVkeCwlZWJwCisJbW92bAklZWN4LCVlYngKKy5ieXRlCTEwMiwxNSw1NiwwLDI1MworCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJMTYoJWVkeCksJXhtbTEKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tMCwleG1tMgorTDAzMmVuYzFfbG9vcF81OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CUwwMzJlbmMxX2xvb3BfNQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwlzaGxsCSQ0LCVlYngKKwltb3ZsCSQxNiwlZWN4CisJbW92dXBzCSglZXNpKSwleG1tNgorCXBhZGRxCTE2KCVlc3ApLCV4bW03CisJbGVhbAkxNiglZXNpKSwlZXNpCisJc3VibAklZWJ4LCVlY3gKKwlsZWFsCTMyKCVlYnAsJWVieCwxKSwlZWR4CisJbW92bAklZWN4LCVlYngKKwlqbXAJTDAzM2NjbTY0X2RlY19vdXRlcgorLmFsaWduCTQsMHg5MAorTDAzM2NjbTY0X2RlY19vdXRlcjoKKwl4b3JwcwkleG1tMiwleG1tNgorCW1vdmRxYQkleG1tNywleG1tMgorCW1vdnVwcwkleG1tNiwoJWVkaSkKKwlsZWFsCTE2KCVlZGkpLCVlZGkKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMworCXN1YmwJJDEsJWVheAorCWp6CUwwMzRjY202NF9kZWNfYnJlYWsKKwltb3Z1cHMJKCVlYnApLCV4bW0wCisJbW92bAklZWJ4LCVlY3gKKwltb3Z1cHMJMTYoJWVicCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tNgorCXhvcnBzCSV4bW0wLCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTMKKwltb3Z1cHMJMzIoJWVicCksJXhtbTAKK0wwMzVjY202NF9kZWMyX2xvb3A6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3Z1cHMJKCVlZHgsJWVjeCwxKSwleG1tMQorCWFkZGwJJDMyLCVlY3gKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorCW1vdnVwcwktMTYoJWVkeCwlZWN4LDEpLCV4bW0wCisJam56CUwwMzVjY202NF9kZWMyX2xvb3AKKwltb3Z1cHMJKCVlc2kpLCV4bW02CisJcGFkZHEJMTYoJWVzcCksJXhtbTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisJbGVhbAkxNiglZXNpKSwlZXNpCisJam1wCUwwMzNjY202NF9kZWNfb3V0ZXIKKy5hbGlnbgk0LDB4OTAKK0wwMzRjY202NF9kZWNfYnJlYWs6CisJbW92bAkyNDAoJWVicCksJWVjeAorCW1vdmwJJWVicCwlZWR4CisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW02CisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTYsJXhtbTMKK0wwMzZlbmMxX2xvb3BfNjoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpueglMMDM2ZW5jMV9sb29wXzYKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE3CisJbW92bAk0OCglZXNwKSwlZXNwCisJbW92bAk0MCglZXNwKSwlZWRpCisJbW92dXBzCSV4bW0zLCglZWRpKQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX2Flc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisucHJpdmF0ZV9leHRlcm4JX2Flc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisuYWxpZ24JNAorX2Flc25pX2N0cjMyX2VuY3J5cHRfYmxvY2tzOgorTF9hZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2Nrc19iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAkyOCglZXNwKSwlZWF4CisJbW92bAkzMiglZXNwKSwlZWR4CisJbW92bAkzNiglZXNwKSwlZWJ4CisJbW92bAklZXNwLCVlYnAKKwlzdWJsCSQ4OCwlZXNwCisJYW5kbAkkLTE2LCVlc3AKKwltb3ZsCSVlYnAsODAoJWVzcCkKKwljbXBsCSQxLCVlYXgKKwlqZQlMMDM3Y3RyMzJfb25lX3Nob3J0Y3V0CisJbW92ZHF1CSglZWJ4KSwleG1tNworCW1vdmwJJDIwMjE4MjE1OSwoJWVzcCkKKwltb3ZsCSQxMzQ4MTAxMjMsNCglZXNwKQorCW1vdmwJJDY3NDM4MDg3LDgoJWVzcCkKKwltb3ZsCSQ2NjA1MSwxMiglZXNwKQorCW1vdmwJJDYsJWVjeAorCXhvcmwJJWVicCwlZWJwCisJbW92bAklZWN4LDE2KCVlc3ApCisJbW92bAklZWN4LDIwKCVlc3ApCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZWJwLDI4KCVlc3ApCisuYnl0ZQkxMDIsMTUsNTgsMjIsMjUxLDMKKy5ieXRlCTEwMiwxNSw1OCwzNCwyNTMsMworCW1vdmwJMjQwKCVlZHgpLCVlY3gKKwlic3dhcAklZWJ4CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3ZkcWEJKCVlc3ApLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTgsMzQsMTk1LDAKKwlsZWFsCTMoJWVieCksJWVicAorLmJ5dGUJMTAyLDE1LDU4LDM0LDIwNSwwCisJaW5jbAklZWJ4CisuYnl0ZQkxMDIsMTUsNTgsMzQsMTk1LDEKKwlpbmNsCSVlYnAKKy5ieXRlCTEwMiwxNSw1OCwzNCwyMDUsMQorCWluY2wJJWVieAorLmJ5dGUJMTAyLDE1LDU4LDM0LDE5NSwyCisJaW5jbAklZWJwCisuYnl0ZQkxMDIsMTUsNTgsMzQsMjA1LDIKKwltb3ZkcWEJJXhtbTAsNDgoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NAorCW1vdmRxdQkoJWVkeCksJXhtbTYKKwltb3ZkcWEJJXhtbTEsNjQoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMgorCXBzaHVmZAkkMTkyLCV4bW0wLCV4bW0yCisJcHNodWZkCSQxMjgsJXhtbTAsJXhtbTMKKwljbXBsCSQ2LCVlYXgKKwlqYglMMDM4Y3RyMzJfdGFpbAorCXB4b3IJJXhtbTYsJXhtbTcKKwlzaGxsCSQ0LCVlY3gKKwltb3ZsCSQxNiwlZWJ4CisJbW92ZHFhCSV4bW03LDMyKCVlc3ApCisJbW92bAklZWR4LCVlYnAKKwlzdWJsCSVlY3gsJWVieAorCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwlzdWJsCSQ2LCVlYXgKKwlqbXAJTDAzOWN0cjMyX2xvb3A2CisuYWxpZ24JNCwweDkwCitMMDM5Y3RyMzJfbG9vcDY6CisJcHNodWZkCSQ2NCwleG1tMCwleG1tNAorCW1vdmRxYQkzMiglZXNwKSwleG1tMAorCXBzaHVmZAkkMTkyLCV4bW0xLCV4bW01CisJcHhvcgkleG1tMCwleG1tMgorCXBzaHVmZAkkMTI4LCV4bW0xLCV4bW02CisJcHhvcgkleG1tMCwleG1tMworCXBzaHVmZAkkNjQsJXhtbTEsJXhtbTcKKwltb3Z1cHMJMTYoJWVicCksJXhtbTEKKwlweG9yCSV4bW0wLCV4bW00CisJcHhvcgkleG1tMCwleG1tNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlweG9yCSV4bW0wLCV4bW02CisJcHhvcgkleG1tMCwleG1tNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3Z1cHMJMzIoJWVicCksJXhtbTAKKwltb3ZsCSVlYngsJWVjeAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKwljYWxsCUxfYWVzbmlfZW5jcnlwdDZfZW50ZXIKKwltb3Z1cHMJKCVlc2kpLCV4bW0xCisJbW92dXBzCTE2KCVlc2kpLCV4bW0wCisJeG9ycHMJJXhtbTEsJXhtbTIKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwkleG1tMiwoJWVkaSkKKwltb3ZkcWEJMTYoJWVzcCksJXhtbTAKKwl4b3JwcwkleG1tMSwleG1tNAorCW1vdmRxYQk2NCglZXNwKSwleG1tMQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCXBhZGRkCSV4bW0wLCV4bW0xCisJcGFkZGQJNDgoJWVzcCksJXhtbTAKKwltb3ZkcWEJKCVlc3ApLCV4bW0yCisJbW92dXBzCTQ4KCVlc2kpLCV4bW0zCisJbW92dXBzCTY0KCVlc2kpLCV4bW00CisJeG9ycHMJJXhtbTMsJXhtbTUKKwltb3Z1cHMJODAoJWVzaSksJXhtbTMKKwlsZWFsCTk2KCVlc2kpLCVlc2kKKwltb3ZkcWEJJXhtbTAsNDgoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NAorCXhvcnBzCSV4bW00LCV4bW02CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJeG9ycHMJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTEsNjQoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMgorCW1vdnVwcwkleG1tNiw2NCglZWRpKQorCXBzaHVmZAkkMTkyLCV4bW0wLCV4bW0yCisJbW92dXBzCSV4bW03LDgwKCVlZGkpCisJbGVhbAk5NiglZWRpKSwlZWRpCisJcHNodWZkCSQxMjgsJXhtbTAsJXhtbTMKKwlzdWJsCSQ2LCVlYXgKKwlqbmMJTDAzOWN0cjMyX2xvb3A2CisJYWRkbAkkNiwlZWF4CisJanoJTDA0MGN0cjMyX3JldAorCW1vdmRxdQkoJWVicCksJXhtbTcKKwltb3ZsCSVlYnAsJWVkeAorCXB4b3IJMzIoJWVzcCksJXhtbTcKKwltb3ZsCTI0MCglZWJwKSwlZWN4CitMMDM4Y3RyMzJfdGFpbDoKKwlwb3IJJXhtbTcsJXhtbTIKKwljbXBsCSQyLCVlYXgKKwlqYglMMDQxY3RyMzJfb25lCisJcHNodWZkCSQ2NCwleG1tMCwleG1tNAorCXBvcgkleG1tNywleG1tMworCWplCUwwNDJjdHIzMl90d28KKwlwc2h1ZmQJJDE5MiwleG1tMSwleG1tNQorCXBvcgkleG1tNywleG1tNAorCWNtcGwJJDQsJWVheAorCWpiCUwwNDNjdHIzMl90aHJlZQorCXBzaHVmZAkkMTI4LCV4bW0xLCV4bW02CisJcG9yCSV4bW03LCV4bW01CisJamUJTDA0NGN0cjMyX2ZvdXIKKwlwb3IJJXhtbTcsJXhtbTYKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDYKKwltb3Z1cHMJKCVlc2kpLCV4bW0xCisJbW92dXBzCTE2KCVlc2kpLCV4bW0wCisJeG9ycHMJJXhtbTEsJXhtbTIKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwk0OCglZXNpKSwleG1tMAorCXhvcnBzCSV4bW0xLCV4bW00CisJbW92dXBzCTY0KCVlc2kpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTUKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTEsJXhtbTYKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlqbXAJTDA0MGN0cjMyX3JldAorLmFsaWduCTQsMHg5MAorTDAzN2N0cjMyX29uZV9zaG9ydGN1dDoKKwltb3Z1cHMJKCVlYngpLCV4bW0yCisJbW92bAkyNDAoJWVkeCksJWVjeAorTDA0MWN0cjMyX29uZToKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwNDVlbmMxX2xvb3BfNzoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpueglMMDQ1ZW5jMV9sb29wXzcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92dXBzCSglZXNpKSwleG1tNgorCXhvcnBzCSV4bW0yLCV4bW02CisJbW92dXBzCSV4bW02LCglZWRpKQorCWptcAlMMDQwY3RyMzJfcmV0CisuYWxpZ24JNCwweDkwCitMMDQyY3RyMzJfdHdvOgorCWNhbGwJX19hZXNuaV9lbmNyeXB0MgorCW1vdnVwcwkoJWVzaSksJXhtbTUKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTYKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCWptcAlMMDQwY3RyMzJfcmV0CisuYWxpZ24JNCwweDkwCitMMDQzY3RyMzJfdGhyZWU6CisJY2FsbAlfX2Flc25pX2VuY3J5cHQzCisJbW92dXBzCSglZXNpKSwleG1tNQorCW1vdnVwcwkxNiglZXNpKSwleG1tNgorCXhvcnBzCSV4bW01LCV4bW0yCisJbW92dXBzCTMyKCVlc2kpLCV4bW03CisJeG9ycHMJJXhtbTYsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTcsJXhtbTQKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwlqbXAJTDA0MGN0cjMyX3JldAorLmFsaWduCTQsMHg5MAorTDA0NGN0cjMyX2ZvdXI6CisJY2FsbAlfX2Flc25pX2VuY3J5cHQ0CisJbW92dXBzCSglZXNpKSwleG1tNgorCW1vdnVwcwkxNiglZXNpKSwleG1tNworCW1vdnVwcwkzMiglZXNpKSwleG1tMQorCXhvcnBzCSV4bW02LCV4bW0yCisJbW92dXBzCTQ4KCVlc2kpLCV4bW0wCisJeG9ycHMJJXhtbTcsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTEsJXhtbTQKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwl4b3JwcwkleG1tMCwleG1tNQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCW1vdnVwcwkleG1tNSw0OCglZWRpKQorTDA0MGN0cjMyX3JldDoKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCW1vdmRxYQkleG1tMCwzMiglZXNwKQorCXB4b3IJJXhtbTUsJXhtbTUKKwltb3ZkcWEJJXhtbTAsNDgoJWVzcCkKKwlweG9yCSV4bW02LCV4bW02CisJbW92ZHFhCSV4bW0wLDY0KCVlc3ApCisJcHhvcgkleG1tNywleG1tNworCW1vdmwJODAoJWVzcCksJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmdsb2JsCV9hZXNuaV94dHNfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuCV9hZXNuaV94dHNfZW5jcnlwdAorLmFsaWduCTQKK19hZXNuaV94dHNfZW5jcnlwdDoKK0xfYWVzbmlfeHRzX2VuY3J5cHRfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMzYoJWVzcCksJWVkeAorCW1vdmwJNDAoJWVzcCksJWVzaQorCW1vdmwJMjQwKCVlZHgpLCVlY3gKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCWxlYWwJMzIoJWVkeCksJWVkeAorCXhvcnBzCSV4bW0wLCV4bW0yCitMMDQ2ZW5jMV9sb29wXzg6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJTDA0NmVuYzFfbG9vcF84CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVheAorCW1vdmwJMzIoJWVzcCksJWVkeAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkMTIwLCVlc3AKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJYW5kbAkkLTE2LCVlc3AKKwltb3ZsCSQxMzUsOTYoJWVzcCkKKwltb3ZsCSQwLDEwMCglZXNwKQorCW1vdmwJJDEsMTA0KCVlc3ApCisJbW92bAkkMCwxMDgoJWVzcCkKKwltb3ZsCSVlYXgsMTEyKCVlc3ApCisJbW92bAklZWJwLDExNiglZXNwKQorCW1vdmRxYQkleG1tMiwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTMKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJYW5kbAkkLTE2LCVlYXgKKwltb3ZsCSVlZHgsJWVicAorCW1vdmwJJWVjeCwlZWJ4CisJc3VibAkkOTYsJWVheAorCWpjCUwwNDd4dHNfZW5jX3Nob3J0CisJc2hsbAkkNCwlZWN4CisJbW92bAkkMTYsJWVieAorCXN1YmwJJWVjeCwlZWJ4CisJbGVhbAkzMiglZWR4LCVlY3gsMSksJWVkeAorCWptcAlMMDQ4eHRzX2VuY19sb29wNgorLmFsaWduCTQsMHg5MAorTDA0OHh0c19lbmNfbG9vcDY6CisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsKCVlc3ApCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQkleG1tMSwxNiglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsMzIoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLDQ4KCVlc3ApCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW03CisJbW92ZHFhCSV4bW0xLDY0KCVlc3ApCisJcGFkZHEJJXhtbTEsJXhtbTEKKwltb3Z1cHMJKCVlYnApLCV4bW0wCisJcGFuZAkleG1tMywleG1tNworCW1vdnVwcwkoJWVzaSksJXhtbTIKKwlweG9yCSV4bW0xLCV4bW03CisJbW92bAklZWJ4LCVlY3gKKwltb3ZkcXUJMTYoJWVzaSksJXhtbTMKKwl4b3JwcwkleG1tMCwleG1tMgorCW1vdmRxdQkzMiglZXNpKSwleG1tNAorCXB4b3IJJXhtbTAsJXhtbTMKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJcHhvcgkleG1tMCwleG1tNQorCW1vdmRxdQk4MCglZXNpKSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTYKKwlsZWFsCTk2KCVlc2kpLCVlc2kKKwlweG9yCSglZXNwKSwleG1tMgorCW1vdmRxYQkleG1tNyw4MCglZXNwKQorCXB4b3IJJXhtbTEsJXhtbTcKKwltb3Z1cHMJMTYoJWVicCksJXhtbTEKKwlweG9yCTE2KCVlc3ApLCV4bW0zCisJcHhvcgkzMiglZXNwKSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlweG9yCTQ4KCVlc3ApLCV4bW01CisJcHhvcgk2NCglZXNwKSwleG1tNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlweG9yCSV4bW0wLCV4bW03CisJbW92dXBzCTMyKCVlYnApLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCWNhbGwJTF9hZXNuaV9lbmNyeXB0Nl9lbnRlcgorCW1vdmRxYQk4MCglZXNwKSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTAKKwl4b3JwcwkoJWVzcCksJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJeG9ycHMJMTYoJWVzcCksJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJMzIoJWVzcCksJXhtbTQKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwl4b3Jwcwk0OCglZXNwKSwleG1tNQorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCXhvcnBzCTY0KCVlc3ApLCV4bW02CisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJeG9ycHMJJXhtbTEsJXhtbTcKKwltb3Z1cHMJJXhtbTYsNjQoJWVkaSkKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJbW92dXBzCSV4bW03LDgwKCVlZGkpCisJbGVhbAk5NiglZWRpKSwlZWRpCisJbW92ZHFhCTk2KCVlc3ApLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMAorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJc3VibAkkOTYsJWVheAorCWpuYwlMMDQ4eHRzX2VuY19sb29wNgorCW1vdmwJMjQwKCVlYnApLCVlY3gKKwltb3ZsCSVlYnAsJWVkeAorCW1vdmwJJWVjeCwlZWJ4CitMMDQ3eHRzX2VuY19zaG9ydDoKKwlhZGRsCSQ5NiwlZWF4CisJanoJTDA0OXh0c19lbmNfZG9uZTZ4CisJbW92ZHFhCSV4bW0xLCV4bW01CisJY21wbAkkMzIsJWVheAorCWpiCUwwNTB4dHNfZW5jX29uZQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlqZQlMMDUxeHRzX2VuY190d28KKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQkleG1tMSwleG1tNgorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJY21wbAkkNjQsJWVheAorCWpiCUwwNTJ4dHNfZW5jX3RocmVlCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsJXhtbTcKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tNSwoJWVzcCkKKwltb3ZkcWEJJXhtbTYsMTYoJWVzcCkKKwlqZQlMMDUzeHRzX2VuY19mb3VyCisJbW92ZHFhCSV4bW03LDMyKCVlc3ApCisJcHNodWZkCSQxOSwleG1tMCwleG1tNworCW1vdmRxYQkleG1tMSw0OCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tNworCXB4b3IJJXhtbTEsJXhtbTcKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJcHhvcgkoJWVzcCksJXhtbTIKKwltb3ZkcXUJNDgoJWVzaSksJXhtbTUKKwlweG9yCTE2KCVlc3ApLCV4bW0zCisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJcHhvcgkzMiglZXNwKSwleG1tNAorCWxlYWwJODAoJWVzaSksJWVzaQorCXB4b3IJNDgoJWVzcCksJXhtbTUKKwltb3ZkcWEJJXhtbTcsNjQoJWVzcCkKKwlweG9yCSV4bW03LCV4bW02CisJY2FsbAlfX2Flc25pX2VuY3J5cHQ2CisJbW92YXBzCTY0KCVlc3ApLCV4bW0xCisJeG9ycHMJKCVlc3ApLCV4bW0yCisJeG9ycHMJMTYoJWVzcCksJXhtbTMKKwl4b3JwcwkzMiglZXNwKSwleG1tNAorCW1vdnVwcwkleG1tMiwoJWVkaSkKKwl4b3Jwcwk0OCglZXNwKSwleG1tNQorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCXhvcnBzCSV4bW0xLCV4bW02CisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92dXBzCSV4bW01LDQ4KCVlZGkpCisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJbGVhbAk4MCglZWRpKSwlZWRpCisJam1wCUwwNTR4dHNfZW5jX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwNTB4dHNfZW5jX29uZToKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbGVhbAkxNiglZXNpKSwlZXNpCisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwNTVlbmMxX2xvb3BfOToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpueglMMDU1ZW5jMV9sb29wXzkKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW01LCV4bW0xCisJam1wCUwwNTR4dHNfZW5jX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwNTF4dHNfZW5jX3R3bzoKKwltb3ZhcHMJJXhtbTEsJXhtbTYKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbW92dXBzCTE2KCVlc2kpLCV4bW0zCisJbGVhbAkzMiglZXNpKSwlZXNpCisJeG9ycHMJJXhtbTUsJXhtbTIKKwl4b3JwcwkleG1tNiwleG1tMworCWNhbGwJX19hZXNuaV9lbmNyeXB0MgorCXhvcnBzCSV4bW01LCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbGVhbAkzMiglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW02LCV4bW0xCisJam1wCUwwNTR4dHNfZW5jX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwNTJ4dHNfZW5jX3RocmVlOgorCW1vdmFwcwkleG1tMSwleG1tNworCW1vdnVwcwkoJWVzaSksJXhtbTIKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTMKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTQKKwlsZWFsCTQ4KCVlc2kpLCVlc2kKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDMKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbGVhbAk0OCglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW03LCV4bW0xCisJam1wCUwwNTR4dHNfZW5jX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwNTN4dHNfZW5jX2ZvdXI6CisJbW92YXBzCSV4bW0xLCV4bW02CisJbW92dXBzCSglZXNpKSwleG1tMgorCW1vdnVwcwkxNiglZXNpKSwleG1tMworCW1vdnVwcwkzMiglZXNpKSwleG1tNAorCXhvcnBzCSglZXNwKSwleG1tMgorCW1vdnVwcwk0OCglZXNpKSwleG1tNQorCWxlYWwJNjQoJWVzaSksJWVzaQorCXhvcnBzCTE2KCVlc3ApLCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwl4b3JwcwkleG1tNiwleG1tNQorCWNhbGwJX19hZXNuaV9lbmNyeXB0NAorCXhvcnBzCSglZXNwKSwleG1tMgorCXhvcnBzCTE2KCVlc3ApLCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTYsJXhtbTUKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwlsZWFsCTY0KCVlZGkpLCVlZGkKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwlqbXAJTDA1NHh0c19lbmNfZG9uZQorLmFsaWduCTQsMHg5MAorTDA0OXh0c19lbmNfZG9uZTZ4OgorCW1vdmwJMTEyKCVlc3ApLCVlYXgKKwlhbmRsCSQxNSwlZWF4CisJanoJTDA1Nnh0c19lbmNfcmV0CisJbW92ZHFhCSV4bW0xLCV4bW01CisJbW92bAklZWF4LDExMiglZXNwKQorCWptcAlMMDU3eHRzX2VuY19zdGVhbAorLmFsaWduCTQsMHg5MAorTDA1NHh0c19lbmNfZG9uZToKKwltb3ZsCTExMiglZXNwKSwlZWF4CisJcHhvcgkleG1tMCwleG1tMAorCWFuZGwJJDE1LCVlYXgKKwlqeglMMDU2eHRzX2VuY19yZXQKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJbW92bAklZWF4LDExMiglZXNwKQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTUKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJOTYoJWVzcCksJXhtbTUKKwlweG9yCSV4bW0xLCV4bW01CitMMDU3eHRzX2VuY19zdGVhbDoKKwltb3Z6YmwJKCVlc2kpLCVlY3gKKwltb3Z6YmwJLTE2KCVlZGkpLCVlZHgKKwlsZWFsCTEoJWVzaSksJWVzaQorCW1vdmIJJWNsLC0xNiglZWRpKQorCW1vdmIJJWRsLCglZWRpKQorCWxlYWwJMSglZWRpKSwlZWRpCisJc3VibAkkMSwlZWF4CisJam56CUwwNTd4dHNfZW5jX3N0ZWFsCisJc3VibAkxMTIoJWVzcCksJWVkaQorCW1vdmwJJWVicCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwltb3Z1cHMJLTE2KCVlZGkpLCV4bW0yCisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwNThlbmMxX2xvb3BfMTA6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJTDA1OGVuYzFfbG9vcF8xMAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwl4b3JwcwkleG1tNSwleG1tMgorCW1vdnVwcwkleG1tMiwtMTYoJWVkaSkKK0wwNTZ4dHNfZW5jX3JldDoKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJcHhvcgkleG1tMywleG1tMworCW1vdmRxYQkleG1tMCwxNiglZXNwKQorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3ZkcWEJJXhtbTAsMzIoJWVzcCkKKwlweG9yCSV4bW01LCV4bW01CisJbW92ZHFhCSV4bW0wLDQ4KCVlc3ApCisJcHhvcgkleG1tNiwleG1tNgorCW1vdmRxYQkleG1tMCw2NCglZXNwKQorCXB4b3IJJXhtbTcsJXhtbTcKKwltb3ZkcWEJJXhtbTAsODAoJWVzcCkKKwltb3ZsCTExNiglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX2Flc25pX3h0c19kZWNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2Flc25pX3h0c19kZWNyeXB0CisuYWxpZ24JNAorX2Flc25pX3h0c19kZWNyeXB0OgorTF9hZXNuaV94dHNfZGVjcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkzNiglZXNwKSwlZWR4CisJbW92bAk0MCglZXNwKSwlZXNpCisJbW92bAkyNDAoJWVkeCksJWVjeAorCW1vdnVwcwkoJWVzaSksJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwNTllbmMxX2xvb3BfMTE6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJTDA1OWVuYzFfbG9vcF8xMQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDEyMCwlZXNwCisJYW5kbAkkLTE2LCVlc3AKKwl4b3JsCSVlYngsJWVieAorCXRlc3RsCSQxNSwlZWF4CisJc2V0bnoJJWJsCisJc2hsbAkkNCwlZWJ4CisJc3VibAklZWJ4LCVlYXgKKwltb3ZsCSQxMzUsOTYoJWVzcCkKKwltb3ZsCSQwLDEwMCglZXNwKQorCW1vdmwJJDEsMTA0KCVlc3ApCisJbW92bAkkMCwxMDgoJWVzcCkKKwltb3ZsCSVlYXgsMTEyKCVlc3ApCisJbW92bAklZWJwLDExNiglZXNwKQorCW1vdmwJMjQwKCVlZHgpLCVlY3gKKwltb3ZsCSVlZHgsJWVicAorCW1vdmwJJWVjeCwlZWJ4CisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQk5NiglZXNwKSwleG1tMworCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlhbmRsCSQtMTYsJWVheAorCXN1YmwJJDk2LCVlYXgKKwlqYwlMMDYweHRzX2RlY19zaG9ydAorCXNobGwJJDQsJWVjeAorCW1vdmwJJDE2LCVlYngKKwlzdWJsCSVlY3gsJWVieAorCWxlYWwJMzIoJWVkeCwlZWN4LDEpLCVlZHgKKwlqbXAJTDA2MXh0c19kZWNfbG9vcDYKKy5hbGlnbgk0LDB4OTAKK0wwNjF4dHNfZGVjX2xvb3A2OgorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsMTYoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLDMyKCVlc3ApCisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmRxYQkleG1tMSw0OCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJcHNodWZkCSQxOSwleG1tMCwleG1tNworCW1vdmRxYQkleG1tMSw2NCglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0xCisJbW92dXBzCSglZWJwKSwleG1tMAorCXBhbmQJJXhtbTMsJXhtbTcKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJcHhvcgkleG1tMSwleG1tNworCW1vdmwJJWVieCwlZWN4CisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJeG9ycHMJJXhtbTAsJXhtbTIKKwltb3ZkcXUJMzIoJWVzaSksJXhtbTQKKwlweG9yCSV4bW0wLCV4bW0zCisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxdQk2NCglZXNpKSwleG1tNgorCXB4b3IJJXhtbTAsJXhtbTUKKwltb3ZkcXUJODAoJWVzaSksJXhtbTEKKwlweG9yCSV4bW0wLCV4bW02CisJbGVhbAk5NiglZXNpKSwlZXNpCisJcHhvcgkoJWVzcCksJXhtbTIKKwltb3ZkcWEJJXhtbTcsODAoJWVzcCkKKwlweG9yCSV4bW0xLCV4bW03CisJbW92dXBzCTE2KCVlYnApLCV4bW0xCisJcHhvcgkxNiglZXNwKSwleG1tMworCXB4b3IJMzIoJWVzcCksJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgk0OCglZXNwKSwleG1tNQorCXB4b3IJNjQoJWVzcCksJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisJcHhvcgkleG1tMCwleG1tNworCW1vdnVwcwkzMiglZWJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwljYWxsCUxfYWVzbmlfZGVjcnlwdDZfZW50ZXIKKwltb3ZkcWEJODAoJWVzcCksJXhtbTEKKwlweG9yCSV4bW0wLCV4bW0wCisJeG9ycHMJKCVlc3ApLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXhvcnBzCTE2KCVlc3ApLCV4bW0zCisJbW92dXBzCSV4bW0yLCglZWRpKQorCXhvcnBzCTMyKCVlc3ApLCV4bW00CisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJeG9ycHMJNDgoJWVzcCksJXhtbTUKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwl4b3Jwcwk2NCglZXNwKSwleG1tNgorCW1vdnVwcwkleG1tNSw0OCglZWRpKQorCXhvcnBzCSV4bW0xLCV4bW03CisJbW92dXBzCSV4bW02LDY0KCVlZGkpCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCW1vdnVwcwkleG1tNyw4MCglZWRpKQorCWxlYWwJOTYoJWVkaSksJWVkaQorCW1vdmRxYQk5NiglZXNwKSwleG1tMworCXB4b3IJJXhtbTAsJXhtbTAKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCXN1YmwJJDk2LCVlYXgKKwlqbmMJTDA2MXh0c19kZWNfbG9vcDYKKwltb3ZsCTI0MCglZWJwKSwlZWN4CisJbW92bAklZWJwLCVlZHgKKwltb3ZsCSVlY3gsJWVieAorTDA2MHh0c19kZWNfc2hvcnQ6CisJYWRkbAkkOTYsJWVheAorCWp6CUwwNjJ4dHNfZGVjX2RvbmU2eAorCW1vdmRxYQkleG1tMSwleG1tNQorCWNtcGwJJDMyLCVlYXgKKwlqYglMMDYzeHRzX2RlY19vbmUKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMCwleG1tMAorCXBhZGRxCSV4bW0xLCV4bW0xCisJcGFuZAkleG1tMywleG1tMgorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW0xCisJamUJTDA2NHh0c19kZWNfdHdvCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTEsJXhtbTYKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorCWNtcGwJJDY0LCVlYXgKKwlqYglMMDY1eHRzX2RlY190aHJlZQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW0xLCV4bW03CisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW0yCisJcGNtcGd0ZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTUsKCVlc3ApCisJbW92ZHFhCSV4bW02LDE2KCVlc3ApCisJamUJTDA2Nnh0c19kZWNfZm91cgorCW1vdmRxYQkleG1tNywzMiglZXNwKQorCXBzaHVmZAkkMTksJXhtbTAsJXhtbTcKKwltb3ZkcWEJJXhtbTEsNDgoJWVzcCkKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTcKKwlweG9yCSV4bW0xLCV4bW03CisJbW92ZHF1CSglZXNpKSwleG1tMgorCW1vdmRxdQkxNiglZXNpKSwleG1tMworCW1vdmRxdQkzMiglZXNpKSwleG1tNAorCXB4b3IJKCVlc3ApLCV4bW0yCisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJcHhvcgkxNiglZXNwKSwleG1tMworCW1vdmRxdQk2NCglZXNpKSwleG1tNgorCXB4b3IJMzIoJWVzcCksJXhtbTQKKwlsZWFsCTgwKCVlc2kpLCVlc2kKKwlweG9yCTQ4KCVlc3ApLCV4bW01CisJbW92ZHFhCSV4bW03LDY0KCVlc3ApCisJcHhvcgkleG1tNywleG1tNgorCWNhbGwJX19hZXNuaV9kZWNyeXB0NgorCW1vdmFwcwk2NCglZXNwKSwleG1tMQorCXhvcnBzCSglZXNwKSwleG1tMgorCXhvcnBzCTE2KCVlc3ApLCV4bW0zCisJeG9ycHMJMzIoJWVzcCksJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJNDgoJWVzcCksJXhtbTUKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwl4b3JwcwkleG1tMSwleG1tNgorCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCW1vdnVwcwkleG1tNSw0OCglZWRpKQorCW1vdnVwcwkleG1tNiw2NCglZWRpKQorCWxlYWwJODAoJWVkaSksJWVkaQorCWptcAlMMDY3eHRzX2RlY19kb25lCisuYWxpZ24JNCwweDkwCitMMDYzeHRzX2RlY19vbmU6CisJbW92dXBzCSglZXNpKSwleG1tMgorCWxlYWwJMTYoJWVzaSksJWVzaQorCXhvcnBzCSV4bW01LCV4bW0yCisJbW92dXBzCSglZWR4KSwleG1tMAorCW1vdnVwcwkxNiglZWR4KSwleG1tMQorCWxlYWwJMzIoJWVkeCksJWVkeAorCXhvcnBzCSV4bW0wLCV4bW0yCitMMDY4ZGVjMV9sb29wXzEyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlY3gKKwltb3Z1cHMJKCVlZHgpLCV4bW0xCisJbGVhbAkxNiglZWR4KSwlZWR4CisJam56CUwwNjhkZWMxX2xvb3BfMTIKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW01LCV4bW0xCisJam1wCUwwNjd4dHNfZGVjX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwNjR4dHNfZGVjX3R3bzoKKwltb3ZhcHMJJXhtbTEsJXhtbTYKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJbW92dXBzCTE2KCVlc2kpLCV4bW0zCisJbGVhbAkzMiglZXNpKSwlZXNpCisJeG9ycHMJJXhtbTUsJXhtbTIKKwl4b3JwcwkleG1tNiwleG1tMworCWNhbGwJX19hZXNuaV9kZWNyeXB0MgorCXhvcnBzCSV4bW01LCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbGVhbAkzMiglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW02LCV4bW0xCisJam1wCUwwNjd4dHNfZGVjX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwNjV4dHNfZGVjX3RocmVlOgorCW1vdmFwcwkleG1tMSwleG1tNworCW1vdnVwcwkoJWVzaSksJXhtbTIKKwltb3Z1cHMJMTYoJWVzaSksJXhtbTMKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTQKKwlsZWFsCTQ4KCVlc2kpLCVlc2kKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDMKKwl4b3JwcwkleG1tNSwleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbGVhbAk0OCglZWRpKSwlZWRpCisJbW92ZHFhCSV4bW03LCV4bW0xCisJam1wCUwwNjd4dHNfZGVjX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwNjZ4dHNfZGVjX2ZvdXI6CisJbW92YXBzCSV4bW0xLCV4bW02CisJbW92dXBzCSglZXNpKSwleG1tMgorCW1vdnVwcwkxNiglZXNpKSwleG1tMworCW1vdnVwcwkzMiglZXNpKSwleG1tNAorCXhvcnBzCSglZXNwKSwleG1tMgorCW1vdnVwcwk0OCglZXNpKSwleG1tNQorCWxlYWwJNjQoJWVzaSksJWVzaQorCXhvcnBzCTE2KCVlc3ApLCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwl4b3JwcwkleG1tNiwleG1tNQorCWNhbGwJX19hZXNuaV9kZWNyeXB0NAorCXhvcnBzCSglZXNwKSwleG1tMgorCXhvcnBzCTE2KCVlc3ApLCV4bW0zCisJeG9ycHMJJXhtbTcsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTYsJXhtbTUKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwlsZWFsCTY0KCVlZGkpLCVlZGkKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwlqbXAJTDA2N3h0c19kZWNfZG9uZQorLmFsaWduCTQsMHg5MAorTDA2Mnh0c19kZWNfZG9uZTZ4OgorCW1vdmwJMTEyKCVlc3ApLCVlYXgKKwlhbmRsCSQxNSwlZWF4CisJanoJTDA2OXh0c19kZWNfcmV0CisJbW92bAklZWF4LDExMiglZXNwKQorCWptcAlMMDcweHRzX2RlY19vbmx5X29uZV9tb3JlCisuYWxpZ24JNCwweDkwCitMMDY3eHRzX2RlY19kb25lOgorCW1vdmwJMTEyKCVlc3ApLCVlYXgKKwlweG9yCSV4bW0wLCV4bW0wCisJYW5kbAkkMTUsJWVheAorCWp6CUwwNjl4dHNfZGVjX3JldAorCXBjbXBndGQJJXhtbTEsJXhtbTAKKwltb3ZsCSVlYXgsMTEyKCVlc3ApCisJcHNodWZkCSQxOSwleG1tMCwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTMKKwlwYWRkcQkleG1tMSwleG1tMQorCXBhbmQJJXhtbTMsJXhtbTIKKwlwY21wZ3RkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMiwleG1tMQorTDA3MHh0c19kZWNfb25seV9vbmVfbW9yZToKKwlwc2h1ZmQJJDE5LCV4bW0wLCV4bW01CisJbW92ZHFhCSV4bW0xLCV4bW02CisJcGFkZHEJJXhtbTEsJXhtbTEKKwlwYW5kCSV4bW0zLCV4bW01CisJcHhvcgkleG1tMSwleG1tNQorCW1vdmwJJWVicCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJeG9ycHMJJXhtbTUsJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwNzFkZWMxX2xvb3BfMTM6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJTDA3MWRlYzFfbG9vcF8xMworLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwl4b3JwcwkleG1tNSwleG1tMgorCW1vdnVwcwkleG1tMiwoJWVkaSkKK0wwNzJ4dHNfZGVjX3N0ZWFsOgorCW1vdnpibAkxNiglZXNpKSwlZWN4CisJbW92emJsCSglZWRpKSwlZWR4CisJbGVhbAkxKCVlc2kpLCVlc2kKKwltb3ZiCSVjbCwoJWVkaSkKKwltb3ZiCSVkbCwxNiglZWRpKQorCWxlYWwJMSglZWRpKSwlZWRpCisJc3VibAkkMSwlZWF4CisJam56CUwwNzJ4dHNfZGVjX3N0ZWFsCisJc3VibAkxMTIoJWVzcCksJWVkaQorCW1vdmwJJWVicCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwltb3Z1cHMJKCVlZGkpLCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTIKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwNzNkZWMxX2xvb3BfMTQ6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJTDA3M2RlYzFfbG9vcF8xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwl4b3JwcwkleG1tNiwleG1tMgorCW1vdnVwcwkleG1tMiwoJWVkaSkKK0wwNjl4dHNfZGVjX3JldDoKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJcHhvcgkleG1tMywleG1tMworCW1vdmRxYQkleG1tMCwxNiglZXNwKQorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3ZkcWEJJXhtbTAsMzIoJWVzcCkKKwlweG9yCSV4bW01LCV4bW01CisJbW92ZHFhCSV4bW0wLDQ4KCVlc3ApCisJcHhvcgkleG1tNiwleG1tNgorCW1vdmRxYQkleG1tMCw2NCglZXNwKQorCXB4b3IJJXhtbTcsJXhtbTcKKwltb3ZkcWEJJXhtbTAsODAoJWVzcCkKKwltb3ZsCTExNiglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX2Flc25pX2NiY19lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4JX2Flc25pX2NiY19lbmNyeXB0CisuYWxpZ24JNAorX2Flc25pX2NiY19lbmNyeXB0OgorTF9hZXNuaV9jYmNfZW5jcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAklZXNwLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwlzdWJsCSQyNCwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWF4CisJYW5kbAkkLTE2LCVlYngKKwltb3ZsCTMyKCVlc3ApLCVlZHgKKwltb3ZsCTM2KCVlc3ApLCVlYnAKKwl0ZXN0bAklZWF4LCVlYXgKKwlqeglMMDc0Y2JjX2Fib3J0CisJY21wbAkkMCw0MCglZXNwKQorCXhjaGdsCSVlc3AsJWVieAorCW1vdnVwcwkoJWVicCksJXhtbTcKKwltb3ZsCTI0MCglZWR4KSwlZWN4CisJbW92bAklZWR4LCVlYnAKKwltb3ZsCSVlYngsMTYoJWVzcCkKKwltb3ZsCSVlY3gsJWVieAorCWplCUwwNzVjYmNfZGVjcnlwdAorCW1vdmFwcwkleG1tNywleG1tMgorCWNtcGwJJDE2LCVlYXgKKwlqYglMMDc2Y2JjX2VuY190YWlsCisJc3VibAkkMTYsJWVheAorCWptcAlMMDc3Y2JjX2VuY19sb29wCisuYWxpZ24JNCwweDkwCitMMDc3Y2JjX2VuY19sb29wOgorCW1vdnVwcwkoJWVzaSksJXhtbTcKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTcKKwlsZWFsCTMyKCVlZHgpLCVlZHgKKwl4b3JwcwkleG1tNywleG1tMgorTDA3OGVuYzFfbG9vcF8xNToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWN4CisJbW92dXBzCSglZWR4KSwleG1tMQorCWxlYWwJMTYoJWVkeCksJWVkeAorCWpueglMMDc4ZW5jMV9sb29wXzE1CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdmwJJWVieCwlZWN4CisJbW92bAklZWJwLCVlZHgKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCisJc3VibAkkMTYsJWVheAorCWpuYwlMMDc3Y2JjX2VuY19sb29wCisJYWRkbAkkMTYsJWVheAorCWpueglMMDc2Y2JjX2VuY190YWlsCisJbW92YXBzCSV4bW0yLCV4bW03CisJcHhvcgkleG1tMiwleG1tMgorCWptcAlMMDc5Y2JjX3JldAorTDA3NmNiY19lbmNfdGFpbDoKKwltb3ZsCSVlYXgsJWVjeAorLmxvbmcJMjc2NzQ1MTc4NQorCW1vdmwJJDE2LCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCXhvcmwJJWVheCwlZWF4CisubG9uZwkyODY4MTE1MDgxCisJbGVhbAktMTYoJWVkaSksJWVkaQorCW1vdmwJJWVieCwlZWN4CisJbW92bAklZWRpLCVlc2kKKwltb3ZsCSVlYnAsJWVkeAorCWptcAlMMDc3Y2JjX2VuY19sb29wCisuYWxpZ24JNCwweDkwCitMMDc1Y2JjX2RlY3J5cHQ6CisJY21wbAkkODAsJWVheAorCWpiZQlMMDgwY2JjX2RlY190YWlsCisJbW92YXBzCSV4bW03LCglZXNwKQorCXN1YmwJJDgwLCVlYXgKKwlqbXAJTDA4MWNiY19kZWNfbG9vcDZfZW50ZXIKKy5hbGlnbgk0LDB4OTAKK0wwODJjYmNfZGVjX2xvb3A2OgorCW1vdmFwcwkleG1tMCwoJWVzcCkKKwltb3Z1cHMJJXhtbTcsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCitMMDgxY2JjX2RlY19sb29wNl9lbnRlcjoKKwltb3ZkcXUJKCVlc2kpLCV4bW0yCisJbW92ZHF1CTE2KCVlc2kpLCV4bW0zCisJbW92ZHF1CTMyKCVlc2kpLCV4bW00CisJbW92ZHF1CTQ4KCVlc2kpLCV4bW01CisJbW92ZHF1CTY0KCVlc2kpLCV4bW02CisJbW92ZHF1CTgwKCVlc2kpLCV4bW03CisJY2FsbAlfX2Flc25pX2RlY3J5cHQ2CisJbW92dXBzCSglZXNpKSwleG1tMQorCW1vdnVwcwkxNiglZXNpKSwleG1tMAorCXhvcnBzCSglZXNwKSwleG1tMgorCXhvcnBzCSV4bW0xLCV4bW0zCisJbW92dXBzCTMyKCVlc2kpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTQKKwltb3Z1cHMJNDgoJWVzaSksJXhtbTAKKwl4b3JwcwkleG1tMSwleG1tNQorCW1vdnVwcwk2NCglZXNpKSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW02CisJbW92dXBzCTgwKCVlc2kpLCV4bW0wCisJeG9ycHMJJXhtbTEsJXhtbTcKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJbGVhbAk5NiglZXNpKSwlZXNpCisJbW92dXBzCSV4bW00LDMyKCVlZGkpCisJbW92bAklZWJ4LCVlY3gKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwltb3ZsCSVlYnAsJWVkeAorCW1vdnVwcwkleG1tNiw2NCglZWRpKQorCWxlYWwJODAoJWVkaSksJWVkaQorCXN1YmwJJDk2LCVlYXgKKwlqYQlMMDgyY2JjX2RlY19sb29wNgorCW1vdmFwcwkleG1tNywleG1tMgorCW1vdmFwcwkleG1tMCwleG1tNworCWFkZGwJJDgwLCVlYXgKKwlqbGUJTDA4M2NiY19kZWNfY2xlYXJfdGFpbF9jb2xsZWN0ZWQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbGVhbAkxNiglZWRpKSwlZWRpCitMMDgwY2JjX2RlY190YWlsOgorCW1vdnVwcwkoJWVzaSksJXhtbTIKKwltb3ZhcHMJJXhtbTIsJXhtbTYKKwljbXBsCSQxNiwlZWF4CisJamJlCUwwODRjYmNfZGVjX29uZQorCW1vdnVwcwkxNiglZXNpKSwleG1tMworCW1vdmFwcwkleG1tMywleG1tNQorCWNtcGwJJDMyLCVlYXgKKwlqYmUJTDA4NWNiY19kZWNfdHdvCisJbW92dXBzCTMyKCVlc2kpLCV4bW00CisJY21wbAkkNDgsJWVheAorCWpiZQlMMDg2Y2JjX2RlY190aHJlZQorCW1vdnVwcwk0OCglZXNpKSwleG1tNQorCWNtcGwJJDY0LCVlYXgKKwlqYmUJTDA4N2NiY19kZWNfZm91cgorCW1vdnVwcwk2NCglZXNpKSwleG1tNgorCW1vdmFwcwkleG1tNywoJWVzcCkKKwltb3Z1cHMJKCVlc2kpLCV4bW0yCisJeG9ycHMJJXhtbTcsJXhtbTcKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDYKKwltb3Z1cHMJKCVlc2kpLCV4bW0xCisJbW92dXBzCTE2KCVlc2kpLCV4bW0wCisJeG9ycHMJKCVlc3ApLCV4bW0yCisJeG9ycHMJJXhtbTEsJXhtbTMKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tNAorCW1vdnVwcwk0OCglZXNpKSwleG1tMAorCXhvcnBzCSV4bW0xLCV4bW01CisJbW92dXBzCTY0KCVlc2kpLCV4bW03CisJeG9ycHMJJXhtbTAsJXhtbTYKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92dXBzCSV4bW0zLDE2KCVlZGkpCisJcHhvcgkleG1tMywleG1tMworCW1vdnVwcwkleG1tNCwzMiglZWRpKQorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJWVkaSkKKwlweG9yCSV4bW01LCV4bW01CisJbGVhbAk2NCglZWRpKSwlZWRpCisJbW92YXBzCSV4bW02LCV4bW0yCisJcHhvcgkleG1tNiwleG1tNgorCXN1YmwJJDgwLCVlYXgKKwlqbXAJTDA4OGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgk0LDB4OTAKK0wwODRjYmNfZGVjX29uZToKKwltb3Z1cHMJKCVlZHgpLCV4bW0wCisJbW92dXBzCTE2KCVlZHgpLCV4bW0xCisJbGVhbAkzMiglZWR4KSwlZWR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wwODlkZWMxX2xvb3BfMTY6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVjeAorCW1vdnVwcwkoJWVkeCksJXhtbTEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlqbnoJTDA4OWRlYzFfbG9vcF8xNgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwl4b3JwcwkleG1tNywleG1tMgorCW1vdmFwcwkleG1tNiwleG1tNworCXN1YmwJJDE2LCVlYXgKKwlqbXAJTDA4OGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgk0LDB4OTAKK0wwODVjYmNfZGVjX3R3bzoKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDIKKwl4b3JwcwkleG1tNywleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJbW92dXBzCSV4bW0yLCglZWRpKQorCW1vdmFwcwkleG1tMywleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlsZWFsCTE2KCVlZGkpLCVlZGkKKwltb3ZhcHMJJXhtbTUsJXhtbTcKKwlzdWJsCSQzMiwlZWF4CisJam1wCUwwODhjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisuYWxpZ24JNCwweDkwCitMMDg2Y2JjX2RlY190aHJlZToKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDMKKwl4b3JwcwkleG1tNywleG1tMgorCXhvcnBzCSV4bW02LCV4bW0zCisJeG9ycHMJJXhtbTUsJXhtbTQKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJbW92YXBzCSV4bW00LCV4bW0yCisJcHhvcgkleG1tNCwleG1tNAorCW1vdnVwcwkleG1tMywxNiglZWRpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwlsZWFsCTMyKCVlZGkpLCVlZGkKKwltb3Z1cHMJMzIoJWVzaSksJXhtbTcKKwlzdWJsCSQ0OCwlZWF4CisJam1wCUwwODhjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisuYWxpZ24JNCwweDkwCitMMDg3Y2JjX2RlY19mb3VyOgorCWNhbGwJX19hZXNuaV9kZWNyeXB0NAorCW1vdnVwcwkxNiglZXNpKSwleG1tMQorCW1vdnVwcwkzMiglZXNpKSwleG1tMAorCXhvcnBzCSV4bW03LCV4bW0yCisJbW92dXBzCTQ4KCVlc2kpLCV4bW03CisJeG9ycHMJJXhtbTYsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVlZGkpCisJeG9ycHMJJXhtbTEsJXhtbTQKKwltb3Z1cHMJJXhtbTMsMTYoJWVkaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJeG9ycHMJJXhtbTAsJXhtbTUKKwltb3Z1cHMJJXhtbTQsMzIoJWVkaSkKKwlweG9yCSV4bW00LCV4bW00CisJbGVhbAk0OCglZWRpKSwlZWRpCisJbW92YXBzCSV4bW01LCV4bW0yCisJcHhvcgkleG1tNSwleG1tNQorCXN1YmwJJDY0LCVlYXgKKwlqbXAJTDA4OGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5hbGlnbgk0LDB4OTAKK0wwODNjYmNfZGVjX2NsZWFyX3RhaWxfY29sbGVjdGVkOgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKK0wwODhjYmNfZGVjX3RhaWxfY29sbGVjdGVkOgorCWFuZGwJJDE1LCVlYXgKKwlqbnoJTDA5MGNiY19kZWNfdGFpbF9wYXJ0aWFsCisJbW92dXBzCSV4bW0yLCglZWRpKQorCXB4b3IJJXhtbTAsJXhtbTAKKwlqbXAJTDA3OWNiY19yZXQKKy5hbGlnbgk0LDB4OTAKK0wwOTBjYmNfZGVjX3RhaWxfcGFydGlhbDoKKwltb3ZhcHMJJXhtbTIsKCVlc3ApCisJcHhvcgkleG1tMCwleG1tMAorCW1vdmwJJDE2LCVlY3gKKwltb3ZsCSVlc3AsJWVzaQorCXN1YmwJJWVheCwlZWN4CisubG9uZwkyNzY3NDUxNzg1CisJbW92ZHFhCSV4bW0yLCglZXNwKQorTDA3OWNiY19yZXQ6CisJbW92bAkxNiglZXNwKSwlZXNwCisJbW92bAkzNiglZXNwKSwlZWJwCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTcsKCVlYnApCisJcHhvcgkleG1tNywleG1tNworTDA3NGNiY19hYm9ydDoKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX2Flc25pX3NldF9lbmNyeXB0X2tleQorLmFsaWduCTQKK19fYWVzbmlfc2V0X2VuY3J5cHRfa2V5OgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJdGVzdGwJJWVheCwlZWF4CisJanoJTDA5MWJhZF9wb2ludGVyCisJdGVzdGwJJWVkeCwlZWR4CisJanoJTDA5MWJhZF9wb2ludGVyCisJY2FsbAlMMDkycGljCitMMDkycGljOgorCXBvcGwJJWVieAorCWxlYWwJTGtleV9jb25zdC1MMDkycGljKCVlYngpLCVlYngKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUxrZXlfY29uc3QoJWVieCksJWVicAorCW1vdnVwcwkoJWVheCksJXhtbTAKKwl4b3JwcwkleG1tNCwleG1tNAorCW1vdmwJNCglZWJwKSwlZWJwCisJbGVhbAkxNiglZWR4KSwlZWR4CisJYW5kbAkkMjY4NDM3NTA0LCVlYnAKKwljbXBsCSQyNTYsJWVjeAorCWplCUwwOTMxNHJvdW5kcworCWNtcGwJJDE5MiwlZWN4CisJamUJTDA5NDEycm91bmRzCisJY21wbAkkMTI4LCVlY3gKKwlqbmUJTDA5NWJhZF9rZXliaXRzCisuYWxpZ24JNCwweDkwCitMMDk2MTByb3VuZHM6CisJY21wbAkkMjY4NDM1NDU2LCVlYnAKKwlqZQlMMDk3MTByb3VuZHNfYWx0CisJbW92bAkkOSwlZWN4CisJbW92dXBzCSV4bW0wLC0xNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMQorCWNhbGwJTDA5OGtleV8xMjhfY29sZAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMgorCWNhbGwJTDA5OWtleV8xMjgKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDQKKwljYWxsCUwwOTlrZXlfMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw4CisJY2FsbAlMMDk5a2V5XzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMTYKKwljYWxsCUwwOTlrZXlfMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwzMgorCWNhbGwJTDA5OWtleV8xMjgKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDY0CisJY2FsbAlMMDk5a2V5XzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMTI4CisJY2FsbAlMMDk5a2V5XzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMjcKKwljYWxsCUwwOTlrZXlfMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw1NAorCWNhbGwJTDA5OWtleV8xMjgKKwltb3Z1cHMJJXhtbTAsKCVlZHgpCisJbW92bAklZWN4LDgwKCVlZHgpCisJam1wCUwxMDBnb29kX2tleQorLmFsaWduCTQsMHg5MAorTDA5OWtleV8xMjg6CisJbW92dXBzCSV4bW0wLCglZWR4KQorCWxlYWwJMTYoJWVkeCksJWVkeAorTDA5OGtleV8xMjhfY29sZDoKKwlzaHVmcHMJJDE2LCV4bW0wLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTAKKwlzaHVmcHMJJDE0MCwleG1tMCwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQyNTUsJXhtbTEsJXhtbTEKKwl4b3JwcwkleG1tMSwleG1tMAorCXJldAorLmFsaWduCTQsMHg5MAorTDA5NzEwcm91bmRzX2FsdDoKKwltb3ZkcWEJKCVlYngpLCV4bW01CisJbW92bAkkOCwlZWN4CisJbW92ZHFhCTMyKCVlYngpLCV4bW00CisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHF1CSV4bW0wLC0xNiglZWR4KQorTDEwMWxvb3Bfa2V5MTI4OgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDE5NgorCXBzbGxkCSQxLCV4bW00CisJbGVhbAkxNiglZWR4KSwlZWR4CisJbW92ZHFhCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMiwleG1tMAorCW1vdmRxdQkleG1tMCwtMTYoJWVkeCkKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwlkZWNsCSVlY3gKKwlqbnoJTDEwMWxvb3Bfa2V5MTI4CisJbW92ZHFhCTQ4KCVlYngpLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMTk2CisJcHNsbGQJJDEsJXhtbTQKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHF1CSV4bW0wLCglZWR4KQorCW1vdmRxYQkleG1tMCwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDE5NgorCW1vdmRxYQkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTAKKwltb3ZkcXUJJXhtbTAsMTYoJWVkeCkKKwltb3ZsCSQ5LCVlY3gKKwltb3ZsCSVlY3gsOTYoJWVkeCkKKwlqbXAJTDEwMGdvb2Rfa2V5CisuYWxpZ24JNCwweDkwCitMMDk0MTJyb3VuZHM6CisJbW92cQkxNiglZWF4KSwleG1tMgorCWNtcGwJJDI2ODQzNTQ1NiwlZWJwCisJamUJTDEwMjEycm91bmRzX2FsdAorCW1vdmwJJDExLCVlY3gKKwltb3Z1cHMJJXhtbTAsLTE2KCVlZHgpCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiwxCisJY2FsbAlMMTAza2V5XzE5MmFfY29sZAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMgorCWNhbGwJTDEwNGtleV8xOTJiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw0CisJY2FsbAlMMTA1a2V5XzE5MmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDgKKwljYWxsCUwxMDRrZXlfMTkyYgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMTYKKwljYWxsCUwxMDVrZXlfMTkyYQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMzIKKwljYWxsCUwxMDRrZXlfMTkyYgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsNjQKKwljYWxsCUwxMDVrZXlfMTkyYQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMTI4CisJY2FsbAlMMTA0a2V5XzE5MmIKKwltb3Z1cHMJJXhtbTAsKCVlZHgpCisJbW92bAklZWN4LDQ4KCVlZHgpCisJam1wCUwxMDBnb29kX2tleQorLmFsaWduCTQsMHg5MAorTDEwNWtleV8xOTJhOgorCW1vdnVwcwkleG1tMCwoJWVkeCkKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKy5hbGlnbgk0LDB4OTAKK0wxMDNrZXlfMTkyYV9jb2xkOgorCW1vdmFwcwkleG1tMiwleG1tNQorTDEwNmtleV8xOTJiX3dhcm06CisJc2h1ZnBzCSQxNiwleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMiwleG1tMworCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQxNDAsJXhtbTAsJXhtbTQKKwlwc2xsZHEJJDQsJXhtbTMKKwl4b3JwcwkleG1tNCwleG1tMAorCXBzaHVmZAkkODUsJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMSwleG1tMAorCXBzaHVmZAkkMjU1LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMywleG1tMgorCXJldAorLmFsaWduCTQsMHg5MAorTDEwNGtleV8xOTJiOgorCW1vdmFwcwkleG1tMCwleG1tMworCXNodWZwcwkkNjgsJXhtbTAsJXhtbTUKKwltb3Z1cHMJJXhtbTUsKCVlZHgpCisJc2h1ZnBzCSQ3OCwleG1tMiwleG1tMworCW1vdnVwcwkleG1tMywxNiglZWR4KQorCWxlYWwJMzIoJWVkeCksJWVkeAorCWptcAlMMTA2a2V5XzE5MmJfd2FybQorLmFsaWduCTQsMHg5MAorTDEwMjEycm91bmRzX2FsdDoKKwltb3ZkcWEJMTYoJWVieCksJXhtbTUKKwltb3ZkcWEJMzIoJWVieCksJXhtbTQKKwltb3ZsCSQ4LCVlY3gKKwltb3ZkcXUJJXhtbTAsLTE2KCVlZHgpCitMMTA3bG9vcF9rZXkxOTI6CisJbW92cQkleG1tMiwoJWVkeCkKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTIKKwlwc2xsZAkkMSwleG1tNAorCWxlYWwJMjQoJWVkeCksJWVkeAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzaHVmZAkkMjU1LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMSwleG1tMworCXBzbGxkcQkkNCwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTMKKwlweG9yCSV4bW0yLCV4bW0wCisJcHhvcgkleG1tMywleG1tMgorCW1vdmRxdQkleG1tMCwtMTYoJWVkeCkKKwlkZWNsCSVlY3gKKwlqbnoJTDEwN2xvb3Bfa2V5MTkyCisJbW92bAkkMTEsJWVjeAorCW1vdmwJJWVjeCwzMiglZWR4KQorCWptcAlMMTAwZ29vZF9rZXkKKy5hbGlnbgk0LDB4OTAKK0wwOTMxNHJvdW5kczoKKwltb3Z1cHMJMTYoJWVheCksJXhtbTIKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwljbXBsCSQyNjg0MzU0NTYsJWVicAorCWplCUwxMDgxNHJvdW5kc19hbHQKKwltb3ZsCSQxMywlZWN4CisJbW92dXBzCSV4bW0wLC0zMiglZWR4KQorCW1vdnVwcwkleG1tMiwtMTYoJWVkeCkKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDEKKwljYWxsCUwxMDlrZXlfMjU2YV9jb2xkCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwxCisJY2FsbAlMMTEwa2V5XzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDIKKwljYWxsCUwxMTFrZXlfMjU2YQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMgorCWNhbGwJTDExMGtleV8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw0CisJY2FsbAlMMTExa2V5XzI1NmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDQKKwljYWxsCUwxMTBrZXlfMjU2YgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsOAorCWNhbGwJTDExMWtleV8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw4CisJY2FsbAlMMTEwa2V5XzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDE2CisJY2FsbAlMMTExa2V5XzI1NmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDE2CisJY2FsbAlMMTEwa2V5XzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDMyCisJY2FsbAlMMTExa2V5XzI1NmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDMyCisJY2FsbAlMMTEwa2V5XzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDY0CisJY2FsbAlMMTExa2V5XzI1NmEKKwltb3Z1cHMJJXhtbTAsKCVlZHgpCisJbW92bAklZWN4LDE2KCVlZHgpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJTDEwMGdvb2Rfa2V5CisuYWxpZ24JNCwweDkwCitMMTExa2V5XzI1NmE6CisJbW92dXBzCSV4bW0yLCglZWR4KQorCWxlYWwJMTYoJWVkeCksJWVkeAorTDEwOWtleV8yNTZhX2NvbGQ6CisJc2h1ZnBzCSQxNiwleG1tMCwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQxNDAsJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwkkMjU1LCV4bW0xLCV4bW0xCisJeG9ycHMJJXhtbTEsJXhtbTAKKwlyZXQKKy5hbGlnbgk0LDB4OTAKK0wxMTBrZXlfMjU2YjoKKwltb3Z1cHMJJXhtbTAsKCVlZHgpCisJbGVhbAkxNiglZWR4KSwlZWR4CisJc2h1ZnBzCSQxNiwleG1tMiwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0yCisJc2h1ZnBzCSQxNDAsJXhtbTIsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMgorCXNodWZwcwkkMTcwLCV4bW0xLCV4bW0xCisJeG9ycHMJJXhtbTEsJXhtbTIKKwlyZXQKKy5hbGlnbgk0LDB4OTAKK0wxMDgxNHJvdW5kc19hbHQ6CisJbW92ZHFhCSglZWJ4KSwleG1tNQorCW1vdmRxYQkzMiglZWJ4KSwleG1tNAorCW1vdmwJJDcsJWVjeAorCW1vdmRxdQkleG1tMCwtMzIoJWVkeCkKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwltb3ZkcXUJJXhtbTIsLTE2KCVlZHgpCitMMTEybG9vcF9rZXkyNTY6CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTMKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjEyCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbGQJJDEsJXhtbTQKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHF1CSV4bW0wLCglZWR4KQorCWRlY2wJJWVjeAorCWp6CUwxMTNkb25lX2tleTI1NgorCXBzaHVmZAkkMjU1LCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTEKKwltb3ZkcWEJJXhtbTEsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMworCXBzbGxkcQkkNCwleG1tMQorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0yCisJbW92ZHF1CSV4bW0yLDE2KCVlZHgpCisJbGVhbAkzMiglZWR4KSwlZWR4CisJbW92ZHFhCSV4bW0yLCV4bW0xCisJam1wCUwxMTJsb29wX2tleTI1NgorTDExM2RvbmVfa2V5MjU2OgorCW1vdmwJJDEzLCVlY3gKKwltb3ZsCSVlY3gsMTYoJWVkeCkKK0wxMDBnb29kX2tleToKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwl4b3JsCSVlYXgsJWVheAorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTIsMHg5MAorTDA5MWJhZF9wb2ludGVyOgorCW1vdmwJJC0xLCVlYXgKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgkyLDB4OTAKK0wwOTViYWRfa2V5Yml0czoKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92bAkkLTIsJWVheAorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmdsb2JsCV9hZXNuaV9zZXRfZW5jcnlwdF9rZXkKKy5wcml2YXRlX2V4dGVybglfYWVzbmlfc2V0X2VuY3J5cHRfa2V5CisuYWxpZ24JNAorX2Flc25pX3NldF9lbmNyeXB0X2tleToKK0xfYWVzbmlfc2V0X2VuY3J5cHRfa2V5X2JlZ2luOgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwljYWxsCV9fYWVzbmlfc2V0X2VuY3J5cHRfa2V5CisJcmV0CisuZ2xvYmwJX2Flc25pX3NldF9kZWNyeXB0X2tleQorLnByaXZhdGVfZXh0ZXJuCV9hZXNuaV9zZXRfZGVjcnlwdF9rZXkKKy5hbGlnbgk0CitfYWVzbmlfc2V0X2RlY3J5cHRfa2V5OgorTF9hZXNuaV9zZXRfZGVjcnlwdF9rZXlfYmVnaW46CisJbW92bAk0KCVlc3ApLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVjeAorCW1vdmwJMTIoJWVzcCksJWVkeAorCWNhbGwJX19hZXNuaV9zZXRfZW5jcnlwdF9rZXkKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwlzaGxsCSQ0LCVlY3gKKwl0ZXN0bAklZWF4LCVlYXgKKwlqbnoJTDExNGRlY19rZXlfcmV0CisJbGVhbAkxNiglZWR4LCVlY3gsMSksJWVheAorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJKCVlYXgpLCV4bW0xCisJbW92dXBzCSV4bW0wLCglZWF4KQorCW1vdnVwcwkleG1tMSwoJWVkeCkKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlsZWFsCS0xNiglZWF4KSwlZWF4CitMMTE1ZGVjX2tleV9pbnZlcnNlOgorCW1vdnVwcwkoJWVkeCksJXhtbTAKKwltb3Z1cHMJKCVlYXgpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMjE5LDE5MgorLmJ5dGUJMTAyLDE1LDU2LDIxOSwyMDEKKwlsZWFsCTE2KCVlZHgpLCVlZHgKKwlsZWFsCS0xNiglZWF4KSwlZWF4CisJbW92dXBzCSV4bW0wLDE2KCVlYXgpCisJbW92dXBzCSV4bW0xLC0xNiglZWR4KQorCWNtcGwJJWVkeCwlZWF4CisJamEJTDExNWRlY19rZXlfaW52ZXJzZQorCW1vdnVwcwkoJWVkeCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMTksMTkyCisJbW92dXBzCSV4bW0wLCglZWR4KQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJeG9ybAklZWF4LCVlYXgKK0wxMTRkZWNfa2V5X3JldDoKKwlyZXQKKy5hbGlnbgk2LDB4OTAKK0xrZXlfY29uc3Q6CisubG9uZwkyMDIzMTMyMjksMjAyMzEzMjI5LDIwMjMxMzIyOSwyMDIzMTMyMjkKKy5sb25nCTY3NTY5MTU3LDY3NTY5MTU3LDY3NTY5MTU3LDY3NTY5MTU3CisubG9uZwkxLDEsMSwxCisubG9uZwkyNywyNywyNywyNworLmJ5dGUJNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsNzMsMTEwLDExNiwxMDEsMTA4LDMyLDY1LDY5CisuYnl0ZQk4Myw0NSw3OCw3Myw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MworLmJ5dGUJMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1CisuYnl0ZQkxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5zZWN0aW9uIF9fSU1QT1JULF9fcG9pbnRlcnMsbm9uX2xhenlfc3ltYm9sX3BvaW50ZXJzCitMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0cjoKKy5pbmRpcmVjdF9zeW1ib2wJX09QRU5TU0xfaWEzMmNhcF9QCisubG9uZwkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9ibi01ODYuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9ibi01ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJlMDQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL2JuLTU4Ni5TCkBAIC0wLDAgKzEsMTUyNyBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCV9ibl9tdWxfYWRkX3dvcmRzCisucHJpdmF0ZV9leHRlcm4JX2JuX211bF9hZGRfd29yZHMKKy5hbGlnbgk0CitfYm5fbXVsX2FkZF93b3JkczoKK0xfYm5fbXVsX2FkZF93b3Jkc19iZWdpbjoKKwljYWxsCUwwMDBQSUNfbWVfdXAKK0wwMDBQSUNfbWVfdXA6CisJcG9wbAklZWF4CisJbW92bAlMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0ci1MMDAwUElDX21lX3VwKCVlYXgpLCVlYXgKKwlidGwJJDI2LCglZWF4KQorCWpuYwlMMDAxbWF3X25vbl9zc2UyCisJbW92bAk0KCVlc3ApLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVjeAorCW1vdmQJMTYoJWVzcCksJW1tMAorCXB4b3IJJW1tMSwlbW0xCisJam1wCUwwMDJtYXdfc3NlMl9lbnRyeQorLmFsaWduCTQsMHg5MAorTDAwM21hd19zc2UyX3Vucm9sbGVkOgorCW1vdmQJKCVlYXgpLCVtbTMKKwlwYWRkcQklbW0zLCVtbTEKKwltb3ZkCSglZWR4KSwlbW0yCisJcG11bHVkcQklbW0wLCVtbTIKKwltb3ZkCTQoJWVkeCksJW1tNAorCXBtdWx1ZHEJJW1tMCwlbW00CisJbW92ZAk4KCVlZHgpLCVtbTYKKwlwbXVsdWRxCSVtbTAsJW1tNgorCW1vdmQJMTIoJWVkeCksJW1tNworCXBtdWx1ZHEJJW1tMCwlbW03CisJcGFkZHEJJW1tMiwlbW0xCisJbW92ZAk0KCVlYXgpLCVtbTMKKwlwYWRkcQklbW00LCVtbTMKKwltb3ZkCTgoJWVheCksJW1tNQorCXBhZGRxCSVtbTYsJW1tNQorCW1vdmQJMTIoJWVheCksJW1tNAorCXBhZGRxCSVtbTQsJW1tNworCW1vdmQJJW1tMSwoJWVheCkKKwltb3ZkCTE2KCVlZHgpLCVtbTIKKwlwbXVsdWRxCSVtbTAsJW1tMgorCXBzcmxxCSQzMiwlbW0xCisJbW92ZAkyMCglZWR4KSwlbW00CisJcG11bHVkcQklbW0wLCVtbTQKKwlwYWRkcQklbW0zLCVtbTEKKwltb3ZkCTI0KCVlZHgpLCVtbTYKKwlwbXVsdWRxCSVtbTAsJW1tNgorCW1vdmQJJW1tMSw0KCVlYXgpCisJcHNybHEJJDMyLCVtbTEKKwltb3ZkCTI4KCVlZHgpLCVtbTMKKwlhZGRsCSQzMiwlZWR4CisJcG11bHVkcQklbW0wLCVtbTMKKwlwYWRkcQklbW01LCVtbTEKKwltb3ZkCTE2KCVlYXgpLCVtbTUKKwlwYWRkcQklbW01LCVtbTIKKwltb3ZkCSVtbTEsOCglZWF4KQorCXBzcmxxCSQzMiwlbW0xCisJcGFkZHEJJW1tNywlbW0xCisJbW92ZAkyMCglZWF4KSwlbW01CisJcGFkZHEJJW1tNSwlbW00CisJbW92ZAklbW0xLDEyKCVlYXgpCisJcHNybHEJJDMyLCVtbTEKKwlwYWRkcQklbW0yLCVtbTEKKwltb3ZkCTI0KCVlYXgpLCVtbTUKKwlwYWRkcQklbW01LCVtbTYKKwltb3ZkCSVtbTEsMTYoJWVheCkKKwlwc3JscQkkMzIsJW1tMQorCXBhZGRxCSVtbTQsJW1tMQorCW1vdmQJMjgoJWVheCksJW1tNQorCXBhZGRxCSVtbTUsJW1tMworCW1vdmQJJW1tMSwyMCglZWF4KQorCXBzcmxxCSQzMiwlbW0xCisJcGFkZHEJJW1tNiwlbW0xCisJbW92ZAklbW0xLDI0KCVlYXgpCisJcHNybHEJJDMyLCVtbTEKKwlwYWRkcQklbW0zLCVtbTEKKwltb3ZkCSVtbTEsMjgoJWVheCkKKwlsZWFsCTMyKCVlYXgpLCVlYXgKKwlwc3JscQkkMzIsJW1tMQorCXN1YmwJJDgsJWVjeAorCWp6CUwwMDRtYXdfc3NlMl9leGl0CitMMDAybWF3X3NzZTJfZW50cnk6CisJdGVzdGwJJDQyOTQ5NjcyODgsJWVjeAorCWpueglMMDAzbWF3X3NzZTJfdW5yb2xsZWQKKy5hbGlnbgkyLDB4OTAKK0wwMDVtYXdfc3NlMl9sb29wOgorCW1vdmQJKCVlZHgpLCVtbTIKKwltb3ZkCSglZWF4KSwlbW0zCisJcG11bHVkcQklbW0wLCVtbTIKKwlsZWFsCTQoJWVkeCksJWVkeAorCXBhZGRxCSVtbTMsJW1tMQorCXBhZGRxCSVtbTIsJW1tMQorCW1vdmQJJW1tMSwoJWVheCkKKwlzdWJsCSQxLCVlY3gKKwlwc3JscQkkMzIsJW1tMQorCWxlYWwJNCglZWF4KSwlZWF4CisJam56CUwwMDVtYXdfc3NlMl9sb29wCitMMDA0bWF3X3NzZTJfZXhpdDoKKwltb3ZkCSVtbTEsJWVheAorCWVtbXMKKwlyZXQKKy5hbGlnbgk0LDB4OTAKK0wwMDFtYXdfbm9uX3NzZTI6CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCisJeG9ybAklZXNpLCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlYngKKwlhbmRsCSQ0Mjk0OTY3Mjg4LCVlY3gKKwltb3ZsCTMyKCVlc3ApLCVlYnAKKwlwdXNobAklZWN4CisJanoJTDAwNm1hd19maW5pc2gKKy5hbGlnbgk0LDB4OTAKK0wwMDdtYXdfbG9vcDoKKwkjIFJvdW5kIDAgCisJbW92bAkoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCSMgUm91bmQgNCAKKwltb3ZsCTQoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAk0KCVlZGkpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJIyBSb3VuZCA4IAorCW1vdmwJOCglZWJ4KSwlZWF4CisJbXVsbAklZWJwCisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCTgoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCw4KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDEyIAorCW1vdmwJMTIoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkxMiglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDEyKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDE2IAorCW1vdmwJMTYoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkxNiglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDE2KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDIwIAorCW1vdmwJMjAoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkyMCglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDIwKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDI0IAorCW1vdmwJMjQoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkyNCglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDI0KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDI4IAorCW1vdmwJMjgoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAkyOCglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDI4KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKworCXN1YmwJJDgsJWVjeAorCWxlYWwJMzIoJWVieCksJWVieAorCWxlYWwJMzIoJWVkaSksJWVkaQorCWpueglMMDA3bWF3X2xvb3AKK0wwMDZtYXdfZmluaXNoOgorCW1vdmwJMzIoJWVzcCksJWVjeAorCWFuZGwJJDcsJWVjeAorCWpueglMMDA4bWF3X2ZpbmlzaDIKKwlqbXAJTDAwOW1hd19lbmQKK0wwMDhtYXdfZmluaXNoMjoKKwkjIFRhaWwgUm91bmQgMCAKKwltb3ZsCSglZWJ4KSwlZWF4CisJbXVsbAklZWJwCisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCSglZWRpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJZGVjbAklZWN4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJanoJTDAwOW1hd19lbmQKKwkjIFRhaWwgUm91bmQgMSAKKwltb3ZsCTQoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAk0KCVlZGkpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlkZWNsCSVlY3gKKwltb3ZsCSVlYXgsNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJanoJTDAwOW1hd19lbmQKKwkjIFRhaWwgUm91bmQgMiAKKwltb3ZsCTgoJWVieCksJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJYWRkbAk4KCVlZGkpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlkZWNsCSVlY3gKKwltb3ZsCSVlYXgsOCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJanoJTDAwOW1hd19lbmQKKwkjIFRhaWwgUm91bmQgMyAKKwltb3ZsCTEyKCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMTIoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCWRlY2wJJWVjeAorCW1vdmwJJWVheCwxMiglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJanoJTDAwOW1hd19lbmQKKwkjIFRhaWwgUm91bmQgNCAKKwltb3ZsCTE2KCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMTYoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCWRlY2wJJWVjeAorCW1vdmwJJWVheCwxNiglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJanoJTDAwOW1hd19lbmQKKwkjIFRhaWwgUm91bmQgNSAKKwltb3ZsCTIwKCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMjAoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCWRlY2wJJWVjeAorCW1vdmwJJWVheCwyMCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJanoJTDAwOW1hd19lbmQKKwkjIFRhaWwgUm91bmQgNiAKKwltb3ZsCTI0KCVlYngpLCVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCWFkZGwJMjQoJWVkaSksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwyNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCitMMDA5bWF3X2VuZDoKKwltb3ZsCSVlc2ksJWVheAorCXBvcGwJJWVjeAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmdsb2JsCV9ibl9tdWxfd29yZHMKKy5wcml2YXRlX2V4dGVybglfYm5fbXVsX3dvcmRzCisuYWxpZ24JNAorX2JuX211bF93b3JkczoKK0xfYm5fbXVsX3dvcmRzX2JlZ2luOgorCWNhbGwJTDAxMFBJQ19tZV91cAorTDAxMFBJQ19tZV91cDoKKwlwb3BsCSVlYXgKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUwwMTBQSUNfbWVfdXAoJWVheCksJWVheAorCWJ0bAkkMjYsKCVlYXgpCisJam5jCUwwMTFtd19ub25fc3NlMgorCW1vdmwJNCglZXNwKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwltb3ZkCTE2KCVlc3ApLCVtbTAKKwlweG9yCSVtbTEsJW1tMQorLmFsaWduCTQsMHg5MAorTDAxMm13X3NzZTJfbG9vcDoKKwltb3ZkCSglZWR4KSwlbW0yCisJcG11bHVkcQklbW0wLCVtbTIKKwlsZWFsCTQoJWVkeCksJWVkeAorCXBhZGRxCSVtbTIsJW1tMQorCW1vdmQJJW1tMSwoJWVheCkKKwlzdWJsCSQxLCVlY3gKKwlwc3JscQkkMzIsJW1tMQorCWxlYWwJNCglZWF4KSwlZWF4CisJam56CUwwMTJtd19zc2UyX2xvb3AKKwltb3ZkCSVtbTEsJWVheAorCWVtbXMKKwlyZXQKKy5hbGlnbgk0LDB4OTAKK0wwMTFtd19ub25fc3NlMjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisKKwl4b3JsCSVlc2ksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVieAorCW1vdmwJMjgoJWVzcCksJWVicAorCW1vdmwJMzIoJWVzcCksJWVjeAorCWFuZGwJJDQyOTQ5NjcyODgsJWVicAorCWp6CUwwMTNtd19maW5pc2gKK0wwMTRtd19sb29wOgorCSMgUm91bmQgMCAKKwltb3ZsCSglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDQgCisJbW92bAk0KCVlYngpLCVlYXgKKwltdWxsCSVlY3gKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCw0KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDggCisJbW92bAk4KCVlYngpLCVlYXgKKwltdWxsCSVlY3gKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCw4KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDEyIAorCW1vdmwJMTIoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDEyKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDE2IAorCW1vdmwJMTYoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDE2KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDIwIAorCW1vdmwJMjAoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDIwKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDI0IAorCW1vdmwJMjQoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDI0KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwkjIFJvdW5kIDI4IAorCW1vdmwJMjgoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDI4KCVlZGkpCisJbW92bAklZWR4LCVlc2kKKworCWFkZGwJJDMyLCVlYngKKwlhZGRsCSQzMiwlZWRpCisJc3VibAkkOCwlZWJwCisJanoJTDAxM213X2ZpbmlzaAorCWptcAlMMDE0bXdfbG9vcAorTDAxM213X2ZpbmlzaDoKKwltb3ZsCTI4KCVlc3ApLCVlYnAKKwlhbmRsCSQ3LCVlYnAKKwlqbnoJTDAxNW13X2ZpbmlzaDIKKwlqbXAJTDAxNm13X2VuZAorTDAxNW13X2ZpbmlzaDI6CisJIyBUYWlsIFJvdW5kIDAgCisJbW92bAkoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJZGVjbAklZWJwCisJanoJTDAxNm13X2VuZAorCSMgVGFpbCBSb3VuZCAxIAorCW1vdmwJNCglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsNCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJZGVjbAklZWJwCisJanoJTDAxNm13X2VuZAorCSMgVGFpbCBSb3VuZCAyIAorCW1vdmwJOCglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsOCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJZGVjbAklZWJwCisJanoJTDAxNm13X2VuZAorCSMgVGFpbCBSb3VuZCAzIAorCW1vdmwJMTIoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDEyKCVlZGkpCisJbW92bAklZWR4LCVlc2kKKwlkZWNsCSVlYnAKKwlqeglMMDE2bXdfZW5kCisJIyBUYWlsIFJvdW5kIDQgCisJbW92bAkxNiglZWJ4KSwlZWF4CisJbXVsbAklZWN4CisJYWRkbAklZXNpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSVlYXgsMTYoJWVkaSkKKwltb3ZsCSVlZHgsJWVzaQorCWRlY2wJJWVicAorCWp6CUwwMTZtd19lbmQKKwkjIFRhaWwgUm91bmQgNSAKKwltb3ZsCTIwKCVlYngpLCVlYXgKKwltdWxsCSVlY3gKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwyMCglZWRpKQorCW1vdmwJJWVkeCwlZXNpCisJZGVjbAklZWJwCisJanoJTDAxNm13X2VuZAorCSMgVGFpbCBSb3VuZCA2IAorCW1vdmwJMjQoJWVieCksJWVheAorCW11bGwJJWVjeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAklZWF4LDI0KCVlZGkpCisJbW92bAklZWR4LCVlc2kKK0wwMTZtd19lbmQ6CisJbW92bAklZXNpLCVlYXgKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5nbG9ibAlfYm5fc3FyX3dvcmRzCisucHJpdmF0ZV9leHRlcm4JX2JuX3Nxcl93b3JkcworLmFsaWduCTQKK19ibl9zcXJfd29yZHM6CitMX2JuX3Nxcl93b3Jkc19iZWdpbjoKKwljYWxsCUwwMTdQSUNfbWVfdXAKK0wwMTdQSUNfbWVfdXA6CisJcG9wbAklZWF4CisJbW92bAlMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0ci1MMDE3UElDX21lX3VwKCVlYXgpLCVlYXgKKwlidGwJJDI2LCglZWF4KQorCWpuYwlMMDE4c3FyX25vbl9zc2UyCisJbW92bAk0KCVlc3ApLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVjeAorLmFsaWduCTQsMHg5MAorTDAxOXNxcl9zc2UyX2xvb3A6CisJbW92ZAkoJWVkeCksJW1tMAorCXBtdWx1ZHEJJW1tMCwlbW0wCisJbGVhbAk0KCVlZHgpLCVlZHgKKwltb3ZxCSVtbTAsKCVlYXgpCisJc3VibAkkMSwlZWN4CisJbGVhbAk4KCVlYXgpLCVlYXgKKwlqbnoJTDAxOXNxcl9zc2UyX2xvb3AKKwllbW1zCisJcmV0CisuYWxpZ24JNCwweDkwCitMMDE4c3FyX25vbl9zc2UyOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKworCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVieAorCWFuZGwJJDQyOTQ5NjcyODgsJWVieAorCWp6CUwwMjBzd19maW5pc2gKK0wwMjFzd19sb29wOgorCSMgUm91bmQgMCAKKwltb3ZsCSglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVkeCw0KCVlc2kpCisJIyBSb3VuZCA0IAorCW1vdmwJNCglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDgoJWVzaSkKKwltb3ZsCSVlZHgsMTIoJWVzaSkKKwkjIFJvdW5kIDggCisJbW92bAk4KCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsMTYoJWVzaSkKKwltb3ZsCSVlZHgsMjAoJWVzaSkKKwkjIFJvdW5kIDEyIAorCW1vdmwJMTIoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCwyNCglZXNpKQorCW1vdmwJJWVkeCwyOCglZXNpKQorCSMgUm91bmQgMTYgCisJbW92bAkxNiglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDMyKCVlc2kpCisJbW92bAklZWR4LDM2KCVlc2kpCisJIyBSb3VuZCAyMCAKKwltb3ZsCTIwKCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsNDAoJWVzaSkKKwltb3ZsCSVlZHgsNDQoJWVzaSkKKwkjIFJvdW5kIDI0IAorCW1vdmwJMjQoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCw0OCglZXNpKQorCW1vdmwJJWVkeCw1MiglZXNpKQorCSMgUm91bmQgMjggCisJbW92bAkyOCglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDU2KCVlc2kpCisJbW92bAklZWR4LDYwKCVlc2kpCisKKwlhZGRsCSQzMiwlZWRpCisJYWRkbAkkNjQsJWVzaQorCXN1YmwJJDgsJWVieAorCWpueglMMDIxc3dfbG9vcAorTDAyMHN3X2ZpbmlzaDoKKwltb3ZsCTI4KCVlc3ApLCVlYngKKwlhbmRsCSQ3LCVlYngKKwlqeglMMDIyc3dfZW5kCisJIyBUYWlsIFJvdW5kIDAgCisJbW92bAkoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCwoJWVzaSkKKwlkZWNsCSVlYngKKwltb3ZsCSVlZHgsNCglZXNpKQorCWp6CUwwMjJzd19lbmQKKwkjIFRhaWwgUm91bmQgMSAKKwltb3ZsCTQoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCw4KCVlc2kpCisJZGVjbAklZWJ4CisJbW92bAklZWR4LDEyKCVlc2kpCisJanoJTDAyMnN3X2VuZAorCSMgVGFpbCBSb3VuZCAyIAorCW1vdmwJOCglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDE2KCVlc2kpCisJZGVjbAklZWJ4CisJbW92bAklZWR4LDIwKCVlc2kpCisJanoJTDAyMnN3X2VuZAorCSMgVGFpbCBSb3VuZCAzIAorCW1vdmwJMTIoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCwyNCglZXNpKQorCWRlY2wJJWVieAorCW1vdmwJJWVkeCwyOCglZXNpKQorCWp6CUwwMjJzd19lbmQKKwkjIFRhaWwgUm91bmQgNCAKKwltb3ZsCTE2KCVlZGkpLCVlYXgKKwltdWxsCSVlYXgKKwltb3ZsCSVlYXgsMzIoJWVzaSkKKwlkZWNsCSVlYngKKwltb3ZsCSVlZHgsMzYoJWVzaSkKKwlqeglMMDIyc3dfZW5kCisJIyBUYWlsIFJvdW5kIDUgCisJbW92bAkyMCglZWRpKSwlZWF4CisJbXVsbAklZWF4CisJbW92bAklZWF4LDQwKCVlc2kpCisJZGVjbAklZWJ4CisJbW92bAklZWR4LDQ0KCVlc2kpCisJanoJTDAyMnN3X2VuZAorCSMgVGFpbCBSb3VuZCA2IAorCW1vdmwJMjQoJWVkaSksJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCw0OCglZXNpKQorCW1vdmwJJWVkeCw1MiglZXNpKQorTDAyMnN3X2VuZDoKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5nbG9ibAlfYm5fZGl2X3dvcmRzCisucHJpdmF0ZV9leHRlcm4JX2JuX2Rpdl93b3JkcworLmFsaWduCTQKK19ibl9kaXZfd29yZHM6CitMX2JuX2Rpdl93b3Jkc19iZWdpbjoKKwltb3ZsCTQoJWVzcCksJWVkeAorCW1vdmwJOCglZXNwKSwlZWF4CisJbW92bAkxMiglZXNwKSwlZWN4CisJZGl2bAklZWN4CisJcmV0CisuZ2xvYmwJX2JuX2FkZF93b3JkcworLnByaXZhdGVfZXh0ZXJuCV9ibl9hZGRfd29yZHMKKy5hbGlnbgk0CitfYm5fYWRkX3dvcmRzOgorTF9ibl9hZGRfd29yZHNfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCisJbW92bAkyMCglZXNwKSwlZWJ4CisJbW92bAkyNCglZXNwKSwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAkzMiglZXNwKSwlZWJwCisJeG9ybAklZWF4LCVlYXgKKwlhbmRsCSQ0Mjk0OTY3Mjg4LCVlYnAKKwlqeglMMDIzYXdfZmluaXNoCitMMDI0YXdfbG9vcDoKKwkjIFJvdW5kIDAgCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJIyBSb3VuZCAxIAorCW1vdmwJNCglZXNpKSwlZWN4CisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsNCglZWJ4KQorCSMgUm91bmQgMiAKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDgoJWVieCkKKwkjIFJvdW5kIDMgCisJbW92bAkxMiglZXNpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDEyKCVlYngpCisJIyBSb3VuZCA0IAorCW1vdmwJMTYoJWVzaSksJWVjeAorCW1vdmwJMTYoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwxNiglZWJ4KQorCSMgUm91bmQgNSAKKwltb3ZsCTIwKCVlc2kpLCVlY3gKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjAoJWVieCkKKwkjIFJvdW5kIDYgCisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDI0KCVlYngpCisJIyBSb3VuZCA3IAorCW1vdmwJMjgoJWVzaSksJWVjeAorCW1vdmwJMjgoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwyOCglZWJ4KQorCisJYWRkbAkkMzIsJWVzaQorCWFkZGwJJDMyLCVlZGkKKwlhZGRsCSQzMiwlZWJ4CisJc3VibAkkOCwlZWJwCisJam56CUwwMjRhd19sb29wCitMMDIzYXdfZmluaXNoOgorCW1vdmwJMzIoJWVzcCksJWVicAorCWFuZGwJJDcsJWVicAorCWp6CUwwMjVhd19lbmQKKwkjIFRhaWwgUm91bmQgMCAKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwoJWVieCkKKwlqeglMMDI1YXdfZW5kCisJIyBUYWlsIFJvdW5kIDEgCisJbW92bAk0KCVlc2kpLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCw0KCVlYngpCisJanoJTDAyNWF3X2VuZAorCSMgVGFpbCBSb3VuZCAyIAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsOCglZWJ4KQorCWp6CUwwMjVhd19lbmQKKwkjIFRhaWwgUm91bmQgMyAKKwltb3ZsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwlqeglMMDI1YXdfZW5kCisJIyBUYWlsIFJvdW5kIDQgCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCWFkZGwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDE2KCVlYngpCisJanoJTDAyNWF3X2VuZAorCSMgVGFpbCBSb3VuZCA1IAorCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlhZGRsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCWp6CUwwMjVhd19lbmQKKwkjIFRhaWwgUm91bmQgNiAKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJYWRkbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKK0wwMjVhd19lbmQ6CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX2JuX3N1Yl93b3JkcworLnByaXZhdGVfZXh0ZXJuCV9ibl9zdWJfd29yZHMKKy5hbGlnbgk0CitfYm5fc3ViX3dvcmRzOgorTF9ibl9zdWJfd29yZHNfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCisJbW92bAkyMCglZXNwKSwlZWJ4CisJbW92bAkyNCglZXNwKSwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAkzMiglZXNwKSwlZWJwCisJeG9ybAklZWF4LCVlYXgKKwlhbmRsCSQ0Mjk0OTY3Mjg4LCVlYnAKKwlqeglMMDI2YXdfZmluaXNoCitMMDI3YXdfbG9vcDoKKwkjIFJvdW5kIDAgCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJIyBSb3VuZCAxIAorCW1vdmwJNCglZXNpKSwlZWN4CisJbW92bAk0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsNCglZWJ4KQorCSMgUm91bmQgMiAKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDgoJWVieCkKKwkjIFJvdW5kIDMgCisJbW92bAkxMiglZXNpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDEyKCVlYngpCisJIyBSb3VuZCA0IAorCW1vdmwJMTYoJWVzaSksJWVjeAorCW1vdmwJMTYoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwxNiglZWJ4KQorCSMgUm91bmQgNSAKKwltb3ZsCTIwKCVlc2kpLCVlY3gKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjAoJWVieCkKKwkjIFJvdW5kIDYgCisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDI0KCVlYngpCisJIyBSb3VuZCA3IAorCW1vdmwJMjgoJWVzaSksJWVjeAorCW1vdmwJMjgoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwyOCglZWJ4KQorCisJYWRkbAkkMzIsJWVzaQorCWFkZGwJJDMyLCVlZGkKKwlhZGRsCSQzMiwlZWJ4CisJc3VibAkkOCwlZWJwCisJam56CUwwMjdhd19sb29wCitMMDI2YXdfZmluaXNoOgorCW1vdmwJMzIoJWVzcCksJWVicAorCWFuZGwJJDcsJWVicAorCWp6CUwwMjhhd19lbmQKKwkjIFRhaWwgUm91bmQgMCAKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwoJWVieCkKKwlqeglMMDI4YXdfZW5kCisJIyBUYWlsIFJvdW5kIDEgCisJbW92bAk0KCVlc2kpLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCw0KCVlYngpCisJanoJTDAyOGF3X2VuZAorCSMgVGFpbCBSb3VuZCAyIAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsOCglZWJ4KQorCWp6CUwwMjhhd19lbmQKKwkjIFRhaWwgUm91bmQgMyAKKwltb3ZsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwlkZWNsCSVlYnAKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwlqeglMMDI4YXdfZW5kCisJIyBUYWlsIFJvdW5kIDQgCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDE2KCVlYngpCisJanoJTDAyOGF3X2VuZAorCSMgVGFpbCBSb3VuZCA1IAorCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCWp6CUwwMjhhd19lbmQKKwkjIFRhaWwgUm91bmQgNiAKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKK0wwMjhhd19lbmQ6CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX2JuX3N1Yl9wYXJ0X3dvcmRzCisucHJpdmF0ZV9leHRlcm4JX2JuX3N1Yl9wYXJ0X3dvcmRzCisuYWxpZ24JNAorX2JuX3N1Yl9wYXJ0X3dvcmRzOgorTF9ibl9zdWJfcGFydF93b3Jkc19iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisKKwltb3ZsCTIwKCVlc3ApLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwltb3ZsCTMyKCVlc3ApLCVlYnAKKwl4b3JsCSVlYXgsJWVheAorCWFuZGwJJDQyOTQ5NjcyODgsJWVicAorCWp6CUwwMjlhd19maW5pc2gKK0wwMzBhd19sb29wOgorCSMgUm91bmQgMCAKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwoJWVieCkKKwkjIFJvdW5kIDEgCisJbW92bAk0KCVlc2kpLCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCw0KCVlYngpCisJIyBSb3VuZCAyIAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsOCglZWJ4KQorCSMgUm91bmQgMyAKKwltb3ZsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwkjIFJvdW5kIDQgCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDE2KCVlYngpCisJIyBSb3VuZCA1IAorCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCSMgUm91bmQgNiAKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKKwkjIFJvdW5kIDcgCisJbW92bAkyOCglZXNpKSwlZWN4CisJbW92bAkyOCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDI4KCVlYngpCisKKwlhZGRsCSQzMiwlZXNpCisJYWRkbAkkMzIsJWVkaQorCWFkZGwJJDMyLCVlYngKKwlzdWJsCSQ4LCVlYnAKKwlqbnoJTDAzMGF3X2xvb3AKK0wwMjlhd19maW5pc2g6CisJbW92bAkzMiglZXNwKSwlZWJwCisJYW5kbAkkNywlZWJwCisJanoJTDAzMWF3X2VuZAorCSMgVGFpbCBSb3VuZCAwIAorCW1vdmwJKCVlc2kpLCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LCglZWJ4KQorCWFkZGwJJDQsJWVzaQorCWFkZGwJJDQsJWVkaQorCWFkZGwJJDQsJWVieAorCWRlY2wJJWVicAorCWp6CUwwMzFhd19lbmQKKwkjIFRhaWwgUm91bmQgMSAKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwoJWVieCkKKwlhZGRsCSQ0LCVlc2kKKwlhZGRsCSQ0LCVlZGkKKwlhZGRsCSQ0LCVlYngKKwlkZWNsCSVlYnAKKwlqeglMMDMxYXdfZW5kCisJIyBUYWlsIFJvdW5kIDIgCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJYWRkbAkkNCwlZXNpCisJYWRkbAkkNCwlZWRpCisJYWRkbAkkNCwlZWJ4CisJZGVjbAklZWJwCisJanoJTDAzMWF3X2VuZAorCSMgVGFpbCBSb3VuZCAzIAorCW1vdmwJKCVlc2kpLCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LCglZWJ4KQorCWFkZGwJJDQsJWVzaQorCWFkZGwJJDQsJWVkaQorCWFkZGwJJDQsJWVieAorCWRlY2wJJWVicAorCWp6CUwwMzFhd19lbmQKKwkjIFRhaWwgUm91bmQgNCAKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCW1vdmwJJWVjeCwoJWVieCkKKwlhZGRsCSQ0LCVlc2kKKwlhZGRsCSQ0LCVlZGkKKwlhZGRsCSQ0LCVlYngKKwlkZWNsCSVlYnAKKwlqeglMMDMxYXdfZW5kCisJIyBUYWlsIFJvdW5kIDUgCisJbW92bAkoJWVzaSksJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJYWRkbAkkNCwlZXNpCisJYWRkbAkkNCwlZWRpCisJYWRkbAkkNCwlZWJ4CisJZGVjbAklZWJwCisJanoJTDAzMWF3X2VuZAorCSMgVGFpbCBSb3VuZCA2IAorCW1vdmwJKCVlc2kpLCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LCglZWJ4KQorCWFkZGwJJDQsJWVzaQorCWFkZGwJJDQsJWVkaQorCWFkZGwJJDQsJWVieAorTDAzMWF3X2VuZDoKKwljbXBsCSQwLDM2KCVlc3ApCisJamUJTDAzMnB3X2VuZAorCW1vdmwJMzYoJWVzcCksJWVicAorCWNtcGwJJDAsJWVicAorCWplCUwwMzJwd19lbmQKKwlqZ2UJTDAzM3B3X3BvcworCSMgcHdfbmVnIAorCW1vdmwJJDAsJWVkeAorCXN1YmwJJWVicCwlZWR4CisJbW92bAklZWR4LCVlYnAKKwlhbmRsCSQ0Mjk0OTY3Mjg4LCVlYnAKKwlqeglMMDM0cHdfbmVnX2ZpbmlzaAorTDAzNXB3X25lZ19sb29wOgorCSMgZGw8MCBSb3VuZCAwIAorCW1vdmwJJDAsJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsKCVlYngpCisJIyBkbDwwIFJvdW5kIDEgCisJbW92bAkkMCwlZWN4CisJbW92bAk0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsNCglZWJ4KQorCSMgZGw8MCBSb3VuZCAyIAorCW1vdmwJJDAsJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDgoJWVieCkKKwkjIGRsPDAgUm91bmQgMyAKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwkjIGRsPDAgUm91bmQgNCAKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTE2KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMTYoJWVieCkKKwkjIGRsPDAgUm91bmQgNSAKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjAoJWVieCkKKwkjIGRsPDAgUm91bmQgNiAKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjQoJWVieCkKKwkjIGRsPDAgUm91bmQgNyAKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJDAsJWVheAorCWFkY2wJJWVheCwlZWF4CisJc3VibAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYXgKKwltb3ZsCSVlY3gsMjgoJWVieCkKKworCWFkZGwJJDMyLCVlZGkKKwlhZGRsCSQzMiwlZWJ4CisJc3VibAkkOCwlZWJwCisJam56CUwwMzVwd19uZWdfbG9vcAorTDAzNHB3X25lZ19maW5pc2g6CisJbW92bAkzNiglZXNwKSwlZWR4CisJbW92bAkkMCwlZWJwCisJc3VibAklZWR4LCVlYnAKKwlhbmRsCSQ3LCVlYnAKKwlqeglMMDMycHdfZW5kCisJIyBkbDwwIFRhaWwgUm91bmQgMCAKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LCglZWJ4KQorCWp6CUwwMzJwd19lbmQKKwkjIGRsPDAgVGFpbCBSb3VuZCAxIAorCW1vdmwJJDAsJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDQoJWVieCkKKwlqeglMMDMycHdfZW5kCisJIyBkbDwwIFRhaWwgUm91bmQgMiAKKwltb3ZsCSQwLCVlY3gKKwltb3ZsCTgoJWVkaSksJWVkeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAkkMCwlZWF4CisJYWRjbAklZWF4LCVlYXgKKwlzdWJsCSVlZHgsJWVjeAorCWFkY2wJJDAsJWVheAorCWRlY2wJJWVicAorCW1vdmwJJWVjeCw4KCVlYngpCisJanoJTDAzMnB3X2VuZAorCSMgZGw8MCBUYWlsIFJvdW5kIDMgCisJbW92bAkkMCwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDEyKCVlYngpCisJanoJTDAzMnB3X2VuZAorCSMgZGw8MCBUYWlsIFJvdW5kIDQgCisJbW92bAkkMCwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDE2KCVlYngpCisJanoJTDAzMnB3X2VuZAorCSMgZGw8MCBUYWlsIFJvdW5kIDUgCisJbW92bAkkMCwlZWN4CisJbW92bAkyMCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJZGVjbAklZWJwCisJbW92bAklZWN4LDIwKCVlYngpCisJanoJTDAzMnB3X2VuZAorCSMgZGw8MCBUYWlsIFJvdW5kIDYgCisJbW92bAkkMCwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSQwLCVlYXgKKwlhZGNsCSVlYXgsJWVheAorCXN1YmwJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWF4CisJbW92bAklZWN4LDI0KCVlYngpCisJam1wCUwwMzJwd19lbmQKK0wwMzNwd19wb3M6CisJYW5kbAkkNDI5NDk2NzI4OCwlZWJwCisJanoJTDAzNnB3X3Bvc19maW5pc2gKK0wwMzdwd19wb3NfbG9vcDoKKwkjIGRsPjAgUm91bmQgMCAKKwltb3ZsCSglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsKCVlYngpCisJam5jCUwwMzhwd19uYzAKKwkjIGRsPjAgUm91bmQgMSAKKwltb3ZsCTQoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDQoJWVieCkKKwlqbmMJTDAzOXB3X25jMQorCSMgZGw+MCBSb3VuZCAyIAorCW1vdmwJOCglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsOCglZWJ4KQorCWpuYwlMMDQwcHdfbmMyCisJIyBkbD4wIFJvdW5kIDMgCisJbW92bAkxMiglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsMTIoJWVieCkKKwlqbmMJTDA0MXB3X25jMworCSMgZGw+MCBSb3VuZCA0IAorCW1vdmwJMTYoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDE2KCVlYngpCisJam5jCUwwNDJwd19uYzQKKwkjIGRsPjAgUm91bmQgNSAKKwltb3ZsCTIwKCVlc2kpLCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCwyMCglZWJ4KQorCWpuYwlMMDQzcHdfbmM1CisJIyBkbD4wIFJvdW5kIDYgCisJbW92bAkyNCglZXNpKSwlZWN4CisJc3VibAklZWF4LCVlY3gKKwltb3ZsCSVlY3gsMjQoJWVieCkKKwlqbmMJTDA0NHB3X25jNgorCSMgZGw+MCBSb3VuZCA3IAorCW1vdmwJMjgoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDI4KCVlYngpCisJam5jCUwwNDVwd19uYzcKKworCWFkZGwJJDMyLCVlc2kKKwlhZGRsCSQzMiwlZWJ4CisJc3VibAkkOCwlZWJwCisJam56CUwwMzdwd19wb3NfbG9vcAorTDAzNnB3X3Bvc19maW5pc2g6CisJbW92bAkzNiglZXNwKSwlZWJwCisJYW5kbAkkNywlZWJwCisJanoJTDAzMnB3X2VuZAorCSMgZGw+MCBUYWlsIFJvdW5kIDAgCisJbW92bAkoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LCglZWJ4KQorCWpuYwlMMDQ2cHdfdGFpbF9uYzAKKwlkZWNsCSVlYnAKKwlqeglMMDMycHdfZW5kCisJIyBkbD4wIFRhaWwgUm91bmQgMSAKKwltb3ZsCTQoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDQoJWVieCkKKwlqbmMJTDA0N3B3X3RhaWxfbmMxCisJZGVjbAklZWJwCisJanoJTDAzMnB3X2VuZAorCSMgZGw+MCBUYWlsIFJvdW5kIDIgCisJbW92bAk4KCVlc2kpLCVlY3gKKwlzdWJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCw4KCVlYngpCisJam5jCUwwNDhwd190YWlsX25jMgorCWRlY2wJJWVicAorCWp6CUwwMzJwd19lbmQKKwkjIGRsPjAgVGFpbCBSb3VuZCAzIAorCW1vdmwJMTIoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDEyKCVlYngpCisJam5jCUwwNDlwd190YWlsX25jMworCWRlY2wJJWVicAorCWp6CUwwMzJwd19lbmQKKwkjIGRsPjAgVGFpbCBSb3VuZCA0IAorCW1vdmwJMTYoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDE2KCVlYngpCisJam5jCUwwNTBwd190YWlsX25jNAorCWRlY2wJJWVicAorCWp6CUwwMzJwd19lbmQKKwkjIGRsPjAgVGFpbCBSb3VuZCA1IAorCW1vdmwJMjAoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDIwKCVlYngpCisJam5jCUwwNTFwd190YWlsX25jNQorCWRlY2wJJWVicAorCWp6CUwwMzJwd19lbmQKKwkjIGRsPjAgVGFpbCBSb3VuZCA2IAorCW1vdmwJMjQoJWVzaSksJWVjeAorCXN1YmwJJWVheCwlZWN4CisJbW92bAklZWN4LDI0KCVlYngpCisJam5jCUwwNTJwd190YWlsX25jNgorCW1vdmwJJDEsJWVheAorCWptcAlMMDMycHdfZW5kCitMMDUzcHdfbmNfbG9vcDoKKwltb3ZsCSglZXNpKSwlZWN4CisJbW92bAklZWN4LCglZWJ4KQorTDAzOHB3X25jMDoKKwltb3ZsCTQoJWVzaSksJWVjeAorCW1vdmwJJWVjeCw0KCVlYngpCitMMDM5cHdfbmMxOgorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAklZWN4LDgoJWVieCkKK0wwNDBwd19uYzI6CisJbW92bAkxMiglZXNpKSwlZWN4CisJbW92bAklZWN4LDEyKCVlYngpCitMMDQxcHdfbmMzOgorCW1vdmwJMTYoJWVzaSksJWVjeAorCW1vdmwJJWVjeCwxNiglZWJ4KQorTDA0MnB3X25jNDoKKwltb3ZsCTIwKCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsMjAoJWVieCkKK0wwNDNwd19uYzU6CisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAklZWN4LDI0KCVlYngpCitMMDQ0cHdfbmM2OgorCW1vdmwJMjgoJWVzaSksJWVjeAorCW1vdmwJJWVjeCwyOCglZWJ4KQorTDA0NXB3X25jNzoKKworCWFkZGwJJDMyLCVlc2kKKwlhZGRsCSQzMiwlZWJ4CisJc3VibAkkOCwlZWJwCisJam56CUwwNTNwd19uY19sb29wCisJbW92bAkzNiglZXNwKSwlZWJwCisJYW5kbAkkNywlZWJwCisJanoJTDA1NHB3X25jX2VuZAorCW1vdmwJKCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsKCVlYngpCitMMDQ2cHdfdGFpbF9uYzA6CisJZGVjbAklZWJwCisJanoJTDA1NHB3X25jX2VuZAorCW1vdmwJNCglZXNpKSwlZWN4CisJbW92bAklZWN4LDQoJWVieCkKK0wwNDdwd190YWlsX25jMToKKwlkZWNsCSVlYnAKKwlqeglMMDU0cHdfbmNfZW5kCisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsOCglZWJ4KQorTDA0OHB3X3RhaWxfbmMyOgorCWRlY2wJJWVicAorCWp6CUwwNTRwd19uY19lbmQKKwltb3ZsCTEyKCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsMTIoJWVieCkKK0wwNDlwd190YWlsX25jMzoKKwlkZWNsCSVlYnAKKwlqeglMMDU0cHdfbmNfZW5kCisJbW92bAkxNiglZXNpKSwlZWN4CisJbW92bAklZWN4LDE2KCVlYngpCitMMDUwcHdfdGFpbF9uYzQ6CisJZGVjbAklZWJwCisJanoJTDA1NHB3X25jX2VuZAorCW1vdmwJMjAoJWVzaSksJWVjeAorCW1vdmwJJWVjeCwyMCglZWJ4KQorTDA1MXB3X3RhaWxfbmM1OgorCWRlY2wJJWVicAorCWp6CUwwNTRwd19uY19lbmQKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCSVlY3gsMjQoJWVieCkKK0wwNTJwd190YWlsX25jNjoKK0wwNTRwd19uY19lbmQ6CisJbW92bAkkMCwlZWF4CitMMDMycHdfZW5kOgorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnNlY3Rpb24gX19JTVBPUlQsX19wb2ludGVycyxub25fbGF6eV9zeW1ib2xfcG9pbnRlcnMKK0xfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyOgorLmluZGlyZWN0X3N5bWJvbAlfT1BFTlNTTF9pYTMyY2FwX1AKKy5sb25nCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL2NvLTU4Ni5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL2NvLTU4Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGJhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvY28tNTg2LlMKQEAgLTAsMCArMSwxMjUxIEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisuZ2xvYmwJX2JuX211bF9jb21iYTgKKy5wcml2YXRlX2V4dGVybglfYm5fbXVsX2NvbWJhOAorLmFsaWduCTQKK19ibl9tdWxfY29tYmE4OgorTF9ibl9tdWxfY29tYmE4X2JlZ2luOgorCXB1c2hsCSVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZWRpCisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwl4b3JsCSVlYngsJWVieAorCW1vdmwJKCVlc2kpLCVlYXgKKwl4b3JsCSVlY3gsJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAwIAorCXhvcmwJJWVicCwlZWJwCisJIyBtdWwgYVswXSpiWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCSglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LCglZWF4KQorCW1vdmwJNCglZXNpKSwlZWF4CisJIyBzYXZlZCByWzBdIAorCSMgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEgCisJeG9ybAklZWJ4LCVlYngKKwkjIG11bCBhWzFdKmJbMF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbMF0qYlsxXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCW1vdmwJJWVjeCw0KCVlYXgpCisJbW92bAk4KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMV0gCisJIyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMiAKKwl4b3JsCSVlY3gsJWVjeAorCSMgbXVsIGFbMl0qYlswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCSMgbXVsIGFbMV0qYlsxXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJIyBtdWwgYVswXSpiWzJdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCSglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDgoJWVheCkKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMl0gCisJIyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMyAKKwl4b3JsCSVlYnAsJWVicAorCSMgbXVsIGFbM10qYlswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbMl0qYlsxXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbMV0qYlsyXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbMF0qYlszXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwxMiglZWF4KQorCW1vdmwJMTYoJWVzaSksJWVheAorCSMgc2F2ZWQgclszXSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA0IAorCXhvcmwJJWVieCwlZWJ4CisJIyBtdWwgYVs0XSpiWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkxMiglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbM10qYlsxXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbMl0qYlsyXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwkjIG11bCBhWzFdKmJbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTE2KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwkjIG11bCBhWzBdKmJbNF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsMTYoJWVheCkKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbNF0gCisJIyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNSAKKwl4b3JsCSVlY3gsJWVjeAorCSMgbXVsIGFbNV0qYlswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzRdKmJbMV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJIyBtdWwgYVszXSpiWzJdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCSMgbXVsIGFbMl0qYlszXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTE2KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzFdKmJbNF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzBdKmJbNV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsMjAoJWVheCkKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbNV0gCisJIyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNiAKKwl4b3JsCSVlYnAsJWVicAorCSMgbXVsIGFbNl0qYlswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAk0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwkjIG11bCBhWzVdKmJbMV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJIyBtdWwgYVs0XSpiWzJdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkxMiglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwkjIG11bCBhWzNdKmJbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJIyBtdWwgYVsyXSpiWzRdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbMV0qYls1XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbMF0qYls2XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwyNCglZWF4KQorCW1vdmwJMjgoJWVzaSksJWVheAorCSMgc2F2ZWQgcls2XSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA3IAorCXhvcmwJJWVieCwlZWJ4CisJIyBtdWwgYVs3XSpiWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbNl0qYlsxXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwkjIG11bCBhWzVdKmJbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbNF0qYlszXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJIyBtdWwgYVszXSpiWzRdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMjAoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbMl0qYls1XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwkjIG11bCBhWzFdKmJbNl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwkjIG11bCBhWzBdKmJbN10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDI4KCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisJIyBzYXZlZCByWzddIAorCSMgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDggCisJeG9ybAklZWN4LCVlY3gKKwkjIG11bCBhWzddKmJbMV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJIyBtdWwgYVs2XSpiWzJdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyMCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzVdKmJbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTYoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCSMgbXVsIGFbNF0qYls0XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyMCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJIyBtdWwgYVszXSpiWzVdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMjQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCSMgbXVsIGFbMl0qYls2XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzFdKmJbN10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDMyKCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisJIyBzYXZlZCByWzhdIAorCSMgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDkgCisJeG9ybAklZWJwLCVlYnAKKwkjIG11bCBhWzddKmJbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbNl0qYlszXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJIyBtdWwgYVs1XSpiWzRdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkxNiglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwkjIG11bCBhWzRdKmJbNV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbM10qYls2XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwkjIG11bCBhWzJdKmJbN10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwzNiglZWF4KQorCW1vdmwJMjgoJWVzaSksJWVheAorCSMgc2F2ZWQgcls5XSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAxMCAKKwl4b3JsCSVlYngsJWVieAorCSMgbXVsIGFbN10qYlszXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxNiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJIyBtdWwgYVs2XSpiWzRdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkyMCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwkjIG11bCBhWzVdKmJbNV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlY3gKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMjQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbNF0qYls2XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMTIoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJIyBtdWwgYVszXSpiWzddIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTE2KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsNDAoJWVheCkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMTBdIAorCSMgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDExIAorCXhvcmwJJWVjeCwlZWN4CisJIyBtdWwgYVs3XSpiWzRdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzZdKmJbNV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMjQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCSMgbXVsIGFbNV0qYls2XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMTYoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJIyBtdWwgYVs0XSpiWzddIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTIwKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsNDQoJWVheCkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMTFdIAorCSMgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEyIAorCXhvcmwJJWVicCwlZWJwCisJIyBtdWwgYVs3XSpiWzVdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI0KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwkjIG11bCBhWzZdKmJbNl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjgoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCSMgbXVsIGFbNV0qYls3XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDQ4KCVlYXgpCisJbW92bAkyOCglZXNpKSwlZWF4CisJIyBzYXZlZCByWzEyXSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAxMyAKKwl4b3JsCSVlYngsJWVieAorCSMgbXVsIGFbN10qYls2XSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJIyBtdWwgYVs2XSpiWzddIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsNTIoJWVheCkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMTNdIAorCSMgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDE0IAorCXhvcmwJJWVjeCwlZWN4CisJIyBtdWwgYVs3XSpiWzddIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsNTYoJWVheCkKKwkjIHNhdmVkIHJbMTRdIAorCSMgc2F2ZSByWzE1XSAKKwltb3ZsCSVlYngsNjAoJWVheCkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlyZXQKKy5nbG9ibAlfYm5fbXVsX2NvbWJhNAorLnByaXZhdGVfZXh0ZXJuCV9ibl9tdWxfY29tYmE0CisuYWxpZ24JNAorX2JuX211bF9jb21iYTQ6CitMX2JuX211bF9jb21iYTRfYmVnaW46CisJcHVzaGwJJWVzaQorCW1vdmwJMTIoJWVzcCksJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXhvcmwJJWVieCwlZWJ4CisJbW92bAkoJWVzaSksJWVheAorCXhvcmwJJWVjeCwlZWN4CisJbW92bAkoJWVkaSksJWVkeAorCSMgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDAgCisJeG9ybAklZWJwLCVlYnAKKwkjIG11bCBhWzBdKmJbMF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsKCVlYXgpCisJbW92bAk0KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMF0gCisJIyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMSAKKwl4b3JsCSVlYngsJWVieAorCSMgbXVsIGFbMV0qYlswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJKCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJIyBtdWwgYVswXSpiWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCSglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDQoJWVheCkKKwltb3ZsCTgoJWVzaSksJWVheAorCSMgc2F2ZWQgclsxXSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAyIAorCXhvcmwJJWVjeCwlZWN4CisJIyBtdWwgYVsyXSpiWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJIyBtdWwgYVsxXSpiWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzBdKmJbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsOCglZWF4KQorCW1vdmwJMTIoJWVzaSksJWVheAorCSMgc2F2ZWQgclsyXSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAzIAorCXhvcmwJJWVicCwlZWJwCisJIyBtdWwgYVszXSpiWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJNCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJIyBtdWwgYVsyXSpiWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJIyBtdWwgYVsxXSpiWzJdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkoJWVzaSksJWVheAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJwCisJIyBtdWwgYVswXSpiWzNdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTQoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwxMiglZWF4KQorCW1vdmwJMTIoJWVzaSksJWVheAorCSMgc2F2ZWQgclszXSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA0IAorCXhvcmwJJWVieCwlZWJ4CisJIyBtdWwgYVszXSpiWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJOCglZWRpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJIyBtdWwgYVsyXSpiWzJdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWN4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVieAorCSMgbXVsIGFbMV0qYlszXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVheAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk4KCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsMTYoJWVheCkKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbNF0gCisJIyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNSAKKwl4b3JsCSVlY3gsJWVjeAorCSMgbXVsIGFbM10qYlsyXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwlhZGNsCSQwLCVlY3gKKwkjIG11bCBhWzJdKmJbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCW1vdmwJJWVicCwyMCglZWF4KQorCW1vdmwJMTIoJWVzaSksJWVheAorCSMgc2F2ZWQgcls1XSAKKwkjICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA2IAorCXhvcmwJJWVicCwlZWJwCisJIyBtdWwgYVszXSpiWzNdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWF4CisJYWRjbAklZWR4LCVlY3gKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsMjQoJWVheCkKKwkjIHNhdmVkIHJbNl0gCisJIyBzYXZlIHJbN10gCisJbW92bAklZWN4LDI4KCVlYXgpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcmV0CisuZ2xvYmwJX2JuX3Nxcl9jb21iYTgKKy5wcml2YXRlX2V4dGVybglfYm5fc3FyX2NvbWJhOAorLmFsaWduCTQKK19ibl9zcXJfY29tYmE4OgorTF9ibl9zcXJfY29tYmE4X2JlZ2luOgorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwl4b3JsCSVlYngsJWVieAorCXhvcmwJJWVjeCwlZWN4CisJbW92bAkoJWVzaSksJWVheAorCSMgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDAgCisJeG9ybAklZWJwLCVlYnAKKwkjIHNxciBhWzBdKmFbMF0gCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJKCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsKCVlZGkpCisJbW92bAk0KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMF0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMSAKKwl4b3JsCSVlYngsJWVieAorCSMgc3FyIGFbMV0qYVswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJ4CisJYWRkbAklZWF4LCVlY3gKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDQoJWVkaSkKKwltb3ZsCSglZXNpKSwlZWR4CisJIyBzYXZlZCByWzFdIAorCSMgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDIgCisJeG9ybAklZWN4LCVlY3gKKwkjIHNxciBhWzJdKmFbMF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCSMgc3FyIGFbMV0qYVsxXSAKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkoJWVzaSksJWVkeAorCWFkY2wJJDAsJWVjeAorCW1vdmwJJWVicCw4KCVlZGkpCisJbW92bAkxMiglZXNpKSwlZWF4CisJIyBzYXZlZCByWzJdIAorCSMgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDMgCisJeG9ybAklZWJwLCVlYnAKKwkjIHNxciBhWzNdKmFbMF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJDAsJWVicAorCW1vdmwJNCglZXNpKSwlZWR4CisJIyBzcXIgYVsyXSphWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxNiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDEyKCVlZGkpCisJbW92bAkoJWVzaSksJWVkeAorCSMgc2F2ZWQgclszXSAKKwkjICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA0IAorCXhvcmwJJWVieCwlZWJ4CisJIyBzcXIgYVs0XSphWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkxMiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisJbW92bAk0KCVlc2kpLCVlZHgKKwkjIHNxciBhWzNdKmFbMV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTgoJWVzaSksJWVheAorCWFkY2wJJDAsJWVieAorCSMgc3FyIGFbMl0qYVsyXSAKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkoJWVzaSksJWVkeAorCWFkY2wJJDAsJWVieAorCW1vdmwJJWVjeCwxNiglZWRpKQorCW1vdmwJMjAoJWVzaSksJWVheAorCSMgc2F2ZWQgcls0XSAKKwkjICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA1IAorCXhvcmwJJWVjeCwlZWN4CisJIyBzcXIgYVs1XSphWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlY3gKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkxNiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWN4CisJbW92bAk0KCVlc2kpLCVlZHgKKwkjIHNxciBhWzRdKmFbMV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCTgoJWVzaSksJWVkeAorCSMgc3FyIGFbM10qYVsyXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWN4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVjeAorCW1vdmwJJWVicCwyMCglZWRpKQorCW1vdmwJKCVlc2kpLCVlZHgKKwkjIHNhdmVkIHJbNV0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNiAKKwl4b3JsCSVlYnAsJWVicAorCSMgc3FyIGFbNl0qYVswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJMjAoJWVzaSksJWVheAorCWFkY2wJJDAsJWVicAorCW1vdmwJNCglZXNpKSwlZWR4CisJIyBzcXIgYVs1XSphWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkxNiglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJbW92bAk4KCVlc2kpLCVlZHgKKwkjIHNxciBhWzRdKmFbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKwkjIHNxciBhWzNdKmFbM10gCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJKCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsMjQoJWVkaSkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbNl0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNyAKKwl4b3JsCSVlYngsJWVieAorCSMgc3FyIGFbN10qYVswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJ4CisJYWRkbAklZWF4LCVlY3gKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMjQoJWVzaSksJWVheAorCWFkY2wJJDAsJWVieAorCW1vdmwJNCglZXNpKSwlZWR4CisJIyBzcXIgYVs2XSphWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyMCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisJbW92bAk4KCVlc2kpLCVlZHgKKwkjIHNxciBhWzVdKmFbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwkjIHNxciBhWzRdKmFbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsMjgoJWVkaSkKKwltb3ZsCTQoJWVzaSksJWVkeAorCSMgc2F2ZWQgcls3XSAKKwkjICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA4IAorCXhvcmwJJWVjeCwlZWN4CisJIyBzcXIgYVs3XSphWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlY3gKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWN4CisJbW92bAk4KCVlc2kpLCVlZHgKKwkjIHNxciBhWzZdKmFbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwkjIHNxciBhWzVdKmFbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlY3gKKwkjIHNxciBhWzRdKmFbNF0gCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJOCglZXNpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDMyKCVlZGkpCisJbW92bAkyOCglZXNpKSwlZWF4CisJIyBzYXZlZCByWzhdIAorCSMgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDkgCisJeG9ybAklZWJwLCVlYnAKKwkjIHNxciBhWzddKmFbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwkjIHNxciBhWzZdKmFbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKwkjIHNxciBhWzVdKmFbNF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsMzYoJWVkaSkKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwkjIHNhdmVkIHJbOV0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMTAgCisJeG9ybAklZWJ4LCVlYngKKwkjIHNxciBhWzddKmFbM10gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKwkjIHNxciBhWzZdKmFbNF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVieAorCWFkZGwJJWVheCwlZWN4CisJYWRjbAklZWR4LCVlYnAKKwltb3ZsCTIwKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwkjIHNxciBhWzVdKmFbNV0gCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlY3gKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJMTYoJWVzaSksJWVkeAorCWFkY2wJJDAsJWVieAorCW1vdmwJJWVjeCw0MCglZWRpKQorCW1vdmwJMjgoJWVzaSksJWVheAorCSMgc2F2ZWQgclsxMF0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMTEgCisJeG9ybAklZWN4LCVlY3gKKwkjIHNxciBhWzddKmFbNF0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCTIwKCVlc2kpLCVlZHgKKwkjIHNxciBhWzZdKmFbNV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsNDQoJWVkaSkKKwltb3ZsCTIwKCVlc2kpLCVlZHgKKwkjIHNhdmVkIHJbMTFdIAorCSMgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEyIAorCXhvcmwJJWVicCwlZWJwCisJIyBzcXIgYVs3XSphWzVdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkyNCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJIyBzcXIgYVs2XSphWzZdIAorCW11bGwJJWVheAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTI0KCVlc2kpLCVlZHgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsNDgoJWVkaSkKKwltb3ZsCTI4KCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMTJdIAorCSMgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEzIAorCXhvcmwJJWVieCwlZWJ4CisJIyBzcXIgYVs3XSphWzZdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAkyOCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDUyKCVlZGkpCisJIyBzYXZlZCByWzEzXSAKKwkjICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAxNCAKKwl4b3JsCSVlY3gsJWVjeAorCSMgc3FyIGFbN10qYVs3XSAKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVicAorCWFkY2wJJWVkeCwlZWJ4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDU2KCVlZGkpCisJIyBzYXZlZCByWzE0XSAKKwltb3ZsCSVlYngsNjAoJWVkaSkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlyZXQKKy5nbG9ibAlfYm5fc3FyX2NvbWJhNAorLnByaXZhdGVfZXh0ZXJuCV9ibl9zcXJfY29tYmE0CisuYWxpZ24JNAorX2JuX3Nxcl9jb21iYTQ6CitMX2JuX3Nxcl9jb21iYTRfYmVnaW46CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVieCwlZWJ4CisJeG9ybAklZWN4LCVlY3gKKwltb3ZsCSglZXNpKSwlZWF4CisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMCAKKwl4b3JsCSVlYnAsJWVicAorCSMgc3FyIGFbMF0qYVswXSAKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJbW92bAkoJWVzaSksJWVkeAorCWFkY2wJJDAsJWVicAorCW1vdmwJJWVieCwoJWVkaSkKKwltb3ZsCTQoJWVzaSksJWVheAorCSMgc2F2ZWQgclswXSAKKwkjICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAxIAorCXhvcmwJJWVieCwlZWJ4CisJIyBzcXIgYVsxXSphWzBdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwltb3ZsCSVlY3gsNCglZWRpKQorCW1vdmwJKCVlc2kpLCVlZHgKKwkjIHNhdmVkIHJbMV0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMiAKKwl4b3JsCSVlY3gsJWVjeAorCSMgc3FyIGFbMl0qYVswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWN4CisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWN4CisJIyBzcXIgYVsxXSphWzFdIAorCW11bGwJJWVheAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCSglZXNpKSwlZWR4CisJYWRjbAkkMCwlZWN4CisJbW92bAklZWJwLDgoJWVkaSkKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwkjIHNhdmVkIHJbMl0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMyAKKwl4b3JsCSVlYnAsJWVicAorCSMgc3FyIGFbM10qYVswXSAKKwltdWxsCSVlZHgKKwlhZGRsCSVlYXgsJWVheAorCWFkY2wJJWVkeCwlZWR4CisJYWRjbAkkMCwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCW1vdmwJOCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJbW92bAk0KCVlc2kpLCVlZHgKKwkjIHNxciBhWzJdKmFbMV0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYnAKKwltb3ZsCSVlYngsMTIoJWVkaSkKKwltb3ZsCTQoJWVzaSksJWVkeAorCSMgc2F2ZWQgclszXSAKKwkjICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA0IAorCXhvcmwJJWVieCwlZWJ4CisJIyBzcXIgYVszXSphWzFdIAorCW11bGwJJWVkeAorCWFkZGwJJWVheCwlZWF4CisJYWRjbAklZWR4LCVlZHgKKwlhZGNsCSQwLCVlYngKKwlhZGRsCSVlYXgsJWVjeAorCWFkY2wJJWVkeCwlZWJwCisJbW92bAk4KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlYngKKwkjIHNxciBhWzJdKmFbMl0gCisJbXVsbAklZWF4CisJYWRkbAklZWF4LCVlY3gKKwlhZGNsCSVlZHgsJWVicAorCW1vdmwJOCglZXNpKSwlZWR4CisJYWRjbAkkMCwlZWJ4CisJbW92bAklZWN4LDE2KCVlZGkpCisJbW92bAkxMiglZXNpKSwlZWF4CisJIyBzYXZlZCByWzRdIAorCSMgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDUgCisJeG9ybAklZWN4LCVlY3gKKwkjIHNxciBhWzNdKmFbMl0gCisJbXVsbAklZWR4CisJYWRkbAklZWF4LCVlYXgKKwlhZGNsCSVlZHgsJWVkeAorCWFkY2wJJDAsJWVjeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAklZWR4LCVlYngKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlY3gKKwltb3ZsCSVlYnAsMjAoJWVkaSkKKwkjIHNhdmVkIHJbNV0gCisJIyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNiAKKwl4b3JsCSVlYnAsJWVicAorCSMgc3FyIGFbM10qYVszXSAKKwltdWxsCSVlYXgKKwlhZGRsCSVlYXgsJWVieAorCWFkY2wJJWVkeCwlZWN4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWJ4LDI0KCVlZGkpCisJIyBzYXZlZCByWzZdIAorCW1vdmwJJWVjeCwyOCglZWRpKQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXJldAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gteDg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvZ2hhc2gteDg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwY2Q0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODYuUwpAQCAtMCwwICsxLDEwNTggQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5nbG9ibAlfZ2NtX2dtdWx0XzRiaXRfbW14CisucHJpdmF0ZV9leHRlcm4JX2djbV9nbXVsdF80Yml0X21teAorLmFsaWduCTQKK19nY21fZ211bHRfNGJpdF9tbXg6CitMX2djbV9nbXVsdF80Yml0X21teF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZXNpCisJY2FsbAlMMDAwcGljX3BvaW50CitMMDAwcGljX3BvaW50OgorCXBvcGwJJWVheAorCWxlYWwJTHJlbV80Yml0LUwwMDBwaWNfcG9pbnQoJWVheCksJWVheAorCW1vdnpibAkxNSglZWRpKSwlZWJ4CisJeG9ybAklZWN4LCVlY3gKKwltb3ZsCSVlYngsJWVkeAorCW1vdmIJJWRsLCVjbAorCW1vdmwJJDE0LCVlYnAKKwlzaGxiCSQ0LCVjbAorCWFuZGwJJDI0MCwlZWR4CisJbW92cQk4KCVlc2ksJWVjeCwxKSwlbW0wCisJbW92cQkoJWVzaSwlZWN4LDEpLCVtbTEKKwltb3ZkCSVtbTAsJWVieAorCWptcAlMMDAxbW14X2xvb3AKKy5hbGlnbgk0LDB4OTAKK0wwMDFtbXhfbG9vcDoKKwlwc3JscQkkNCwlbW0wCisJYW5kbAkkMTUsJWVieAorCW1vdnEJJW1tMSwlbW0yCisJcHNybHEJJDQsJW1tMQorCXB4b3IJOCglZXNpLCVlZHgsMSksJW1tMAorCW1vdmIJKCVlZGksJWVicCwxKSwlY2wKKwlwc2xscQkkNjAsJW1tMgorCXB4b3IJKCVlYXgsJWVieCw4KSwlbW0xCisJZGVjbAklZWJwCisJbW92ZAklbW0wLCVlYngKKwlweG9yCSglZXNpLCVlZHgsMSksJW1tMQorCW1vdmwJJWVjeCwlZWR4CisJcHhvcgklbW0yLCVtbTAKKwlqcwlMMDAybW14X2JyZWFrCisJc2hsYgkkNCwlY2wKKwlhbmRsCSQxNSwlZWJ4CisJcHNybHEJJDQsJW1tMAorCWFuZGwJJDI0MCwlZWR4CisJbW92cQklbW0xLCVtbTIKKwlwc3JscQkkNCwlbW0xCisJcHhvcgk4KCVlc2ksJWVjeCwxKSwlbW0wCisJcHNsbHEJJDYwLCVtbTIKKwlweG9yCSglZWF4LCVlYngsOCksJW1tMQorCW1vdmQJJW1tMCwlZWJ4CisJcHhvcgkoJWVzaSwlZWN4LDEpLCVtbTEKKwlweG9yCSVtbTIsJW1tMAorCWptcAlMMDAxbW14X2xvb3AKKy5hbGlnbgk0LDB4OTAKK0wwMDJtbXhfYnJlYWs6CisJc2hsYgkkNCwlY2wKKwlhbmRsCSQxNSwlZWJ4CisJcHNybHEJJDQsJW1tMAorCWFuZGwJJDI0MCwlZWR4CisJbW92cQklbW0xLCVtbTIKKwlwc3JscQkkNCwlbW0xCisJcHhvcgk4KCVlc2ksJWVjeCwxKSwlbW0wCisJcHNsbHEJJDYwLCVtbTIKKwlweG9yCSglZWF4LCVlYngsOCksJW1tMQorCW1vdmQJJW1tMCwlZWJ4CisJcHhvcgkoJWVzaSwlZWN4LDEpLCVtbTEKKwlweG9yCSVtbTIsJW1tMAorCXBzcmxxCSQ0LCVtbTAKKwlhbmRsCSQxNSwlZWJ4CisJbW92cQklbW0xLCVtbTIKKwlwc3JscQkkNCwlbW0xCisJcHhvcgk4KCVlc2ksJWVkeCwxKSwlbW0wCisJcHNsbHEJJDYwLCVtbTIKKwlweG9yCSglZWF4LCVlYngsOCksJW1tMQorCW1vdmQJJW1tMCwlZWJ4CisJcHhvcgkoJWVzaSwlZWR4LDEpLCVtbTEKKwlweG9yCSVtbTIsJW1tMAorCXBzcmxxCSQzMiwlbW0wCisJbW92ZAklbW0xLCVlZHgKKwlwc3JscQkkMzIsJW1tMQorCW1vdmQJJW1tMCwlZWN4CisJbW92ZAklbW0xLCVlYnAKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVkeAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWJwCisJZW1tcworCW1vdmwJJWVieCwxMiglZWRpKQorCW1vdmwJJWVkeCw0KCVlZGkpCisJbW92bAklZWN4LDgoJWVkaSkKKwltb3ZsCSVlYnAsKCVlZGkpCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX2djbV9naGFzaF80Yml0X21teAorLnByaXZhdGVfZXh0ZXJuCV9nY21fZ2hhc2hfNGJpdF9tbXgKKy5hbGlnbgk0CitfZ2NtX2doYXNoXzRiaXRfbW14OgorTF9nY21fZ2hhc2hfNGJpdF9tbXhfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVheAorCW1vdmwJMjQoJWVzcCksJWVieAorCW1vdmwJMjgoJWVzcCksJWVjeAorCW1vdmwJMzIoJWVzcCksJWVkeAorCW1vdmwJJWVzcCwlZWJwCisJY2FsbAlMMDAzcGljX3BvaW50CitMMDAzcGljX3BvaW50OgorCXBvcGwJJWVzaQorCWxlYWwJTHJlbV84Yml0LUwwMDNwaWNfcG9pbnQoJWVzaSksJWVzaQorCXN1YmwJJDU0NCwlZXNwCisJYW5kbAkkLTY0LCVlc3AKKwlzdWJsCSQxNiwlZXNwCisJYWRkbAklZWN4LCVlZHgKKwltb3ZsCSVlYXgsNTQ0KCVlc3ApCisJbW92bAklZWR4LDU1MiglZXNwKQorCW1vdmwJJWVicCw1NTYoJWVzcCkKKwlhZGRsCSQxMjgsJWVieAorCWxlYWwJMTQ0KCVlc3ApLCVlZGkKKwlsZWFsCTQwMCglZXNwKSwlZWJwCisJbW92bAktMTIwKCVlYngpLCVlZHgKKwltb3ZxCS0xMjAoJWVieCksJW1tMAorCW1vdnEJLTEyOCglZWJ4KSwlbW0zCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsKCVlc3ApCisJbW92bAktMTA0KCVlYngpLCVlZHgKKwltb3ZxCS0xMDQoJWVieCksJW1tMgorCW1vdnEJLTExMiglZWJ4KSwlbW01CisJbW92cQklbW0wLC0xMjgoJWVkaSkKKwlwc3JscQkkNCwlbW0wCisJbW92cQklbW0zLCglZWRpKQorCW1vdnEJJW1tMywlbW03CisJcHNybHEJJDQsJW1tMworCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDEoJWVzcCkKKwltb3ZsCS04OCglZWJ4KSwlZWR4CisJbW92cQktODgoJWVieCksJW1tMQorCXBzbGxxCSQ2MCwlbW03CisJbW92cQktOTYoJWVieCksJW1tNAorCXBvcgklbW03LCVtbTAKKwltb3ZxCSVtbTIsLTEyMCglZWRpKQorCXBzcmxxCSQ0LCVtbTIKKwltb3ZxCSVtbTUsOCglZWRpKQorCW1vdnEJJW1tNSwlbW02CisJbW92cQklbW0wLC0xMjgoJWVicCkKKwlwc3JscQkkNCwlbW01CisJbW92cQklbW0zLCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDIoJWVzcCkKKwltb3ZsCS03MiglZWJ4KSwlZWR4CisJbW92cQktNzIoJWVieCksJW1tMAorCXBzbGxxCSQ2MCwlbW02CisJbW92cQktODAoJWVieCksJW1tMworCXBvcgklbW02LCVtbTIKKwltb3ZxCSVtbTEsLTExMiglZWRpKQorCXBzcmxxCSQ0LCVtbTEKKwltb3ZxCSVtbTQsMTYoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNworCW1vdnEJJW1tMiwtMTIwKCVlYnApCisJcHNybHEJJDQsJW1tNAorCW1vdnEJJW1tNSw4KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsMyglZXNwKQorCW1vdmwJLTU2KCVlYngpLCVlZHgKKwltb3ZxCS01NiglZWJ4KSwlbW0yCisJcHNsbHEJJDYwLCVtbTcKKwltb3ZxCS02NCglZWJ4KSwlbW01CisJcG9yCSVtbTcsJW1tMQorCW1vdnEJJW1tMCwtMTA0KCVlZGkpCisJcHNybHEJJDQsJW1tMAorCW1vdnEJJW1tMywyNCglZWRpKQorCW1vdnEJJW1tMywlbW02CisJbW92cQklbW0xLC0xMTIoJWVicCkKKwlwc3JscQkkNCwlbW0zCisJbW92cQklbW00LDE2KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsNCglZXNwKQorCW1vdmwJLTQwKCVlYngpLCVlZHgKKwltb3ZxCS00MCglZWJ4KSwlbW0xCisJcHNsbHEJJDYwLCVtbTYKKwltb3ZxCS00OCglZWJ4KSwlbW00CisJcG9yCSVtbTYsJW1tMAorCW1vdnEJJW1tMiwtOTYoJWVkaSkKKwlwc3JscQkkNCwlbW0yCisJbW92cQklbW01LDMyKCVlZGkpCisJbW92cQklbW01LCVtbTcKKwltb3ZxCSVtbTAsLTEwNCglZWJwKQorCXBzcmxxCSQ0LCVtbTUKKwltb3ZxCSVtbTMsMjQoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCw1KCVlc3ApCisJbW92bAktMjQoJWVieCksJWVkeAorCW1vdnEJLTI0KCVlYngpLCVtbTAKKwlwc2xscQkkNjAsJW1tNworCW1vdnEJLTMyKCVlYngpLCVtbTMKKwlwb3IJJW1tNywlbW0yCisJbW92cQklbW0xLC04OCglZWRpKQorCXBzcmxxCSQ0LCVtbTEKKwltb3ZxCSVtbTQsNDAoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNgorCW1vdnEJJW1tMiwtOTYoJWVicCkKKwlwc3JscQkkNCwlbW00CisJbW92cQklbW01LDMyKCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsNiglZXNwKQorCW1vdmwJLTgoJWVieCksJWVkeAorCW1vdnEJLTgoJWVieCksJW1tMgorCXBzbGxxCSQ2MCwlbW02CisJbW92cQktMTYoJWVieCksJW1tNQorCXBvcgklbW02LCVtbTEKKwltb3ZxCSVtbTAsLTgwKCVlZGkpCisJcHNybHEJJDQsJW1tMAorCW1vdnEJJW1tMyw0OCglZWRpKQorCW1vdnEJJW1tMywlbW03CisJbW92cQklbW0xLC04OCglZWJwKQorCXBzcmxxCSQ0LCVtbTMKKwltb3ZxCSVtbTQsNDAoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCw3KCVlc3ApCisJbW92bAk4KCVlYngpLCVlZHgKKwltb3ZxCTgoJWVieCksJW1tMQorCXBzbGxxCSQ2MCwlbW03CisJbW92cQkoJWVieCksJW1tNAorCXBvcgklbW03LCVtbTAKKwltb3ZxCSVtbTIsLTcyKCVlZGkpCisJcHNybHEJJDQsJW1tMgorCW1vdnEJJW1tNSw1NiglZWRpKQorCW1vdnEJJW1tNSwlbW02CisJbW92cQklbW0wLC04MCglZWJwKQorCXBzcmxxCSQ0LCVtbTUKKwltb3ZxCSVtbTMsNDgoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCw4KCVlc3ApCisJbW92bAkyNCglZWJ4KSwlZWR4CisJbW92cQkyNCglZWJ4KSwlbW0wCisJcHNsbHEJJDYwLCVtbTYKKwltb3ZxCTE2KCVlYngpLCVtbTMKKwlwb3IJJW1tNiwlbW0yCisJbW92cQklbW0xLC02NCglZWRpKQorCXBzcmxxCSQ0LCVtbTEKKwltb3ZxCSVtbTQsNjQoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNworCW1vdnEJJW1tMiwtNzIoJWVicCkKKwlwc3JscQkkNCwlbW00CisJbW92cQklbW01LDU2KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsOSglZXNwKQorCW1vdmwJNDAoJWVieCksJWVkeAorCW1vdnEJNDAoJWVieCksJW1tMgorCXBzbGxxCSQ2MCwlbW03CisJbW92cQkzMiglZWJ4KSwlbW01CisJcG9yCSVtbTcsJW1tMQorCW1vdnEJJW1tMCwtNTYoJWVkaSkKKwlwc3JscQkkNCwlbW0wCisJbW92cQklbW0zLDcyKCVlZGkpCisJbW92cQklbW0zLCVtbTYKKwltb3ZxCSVtbTEsLTY0KCVlYnApCisJcHNybHEJJDQsJW1tMworCW1vdnEJJW1tNCw2NCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDEwKCVlc3ApCisJbW92bAk1NiglZWJ4KSwlZWR4CisJbW92cQk1NiglZWJ4KSwlbW0xCisJcHNsbHEJJDYwLCVtbTYKKwltb3ZxCTQ4KCVlYngpLCVtbTQKKwlwb3IJJW1tNiwlbW0wCisJbW92cQklbW0yLC00OCglZWRpKQorCXBzcmxxCSQ0LCVtbTIKKwltb3ZxCSVtbTUsODAoJWVkaSkKKwltb3ZxCSVtbTUsJW1tNworCW1vdnEJJW1tMCwtNTYoJWVicCkKKwlwc3JscQkkNCwlbW01CisJbW92cQklbW0zLDcyKCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsMTEoJWVzcCkKKwltb3ZsCTcyKCVlYngpLCVlZHgKKwltb3ZxCTcyKCVlYngpLCVtbTAKKwlwc2xscQkkNjAsJW1tNworCW1vdnEJNjQoJWVieCksJW1tMworCXBvcgklbW03LCVtbTIKKwltb3ZxCSVtbTEsLTQwKCVlZGkpCisJcHNybHEJJDQsJW1tMQorCW1vdnEJJW1tNCw4OCglZWRpKQorCW1vdnEJJW1tNCwlbW02CisJbW92cQklbW0yLC00OCglZWJwKQorCXBzcmxxCSQ0LCVtbTQKKwltb3ZxCSVtbTUsODAoJWVicCkKKwlzaGxsCSQ0LCVlZHgKKwltb3ZiCSVkbCwxMiglZXNwKQorCW1vdmwJODgoJWVieCksJWVkeAorCW1vdnEJODgoJWVieCksJW1tMgorCXBzbGxxCSQ2MCwlbW02CisJbW92cQk4MCglZWJ4KSwlbW01CisJcG9yCSVtbTYsJW1tMQorCW1vdnEJJW1tMCwtMzIoJWVkaSkKKwlwc3JscQkkNCwlbW0wCisJbW92cQklbW0zLDk2KCVlZGkpCisJbW92cQklbW0zLCVtbTcKKwltb3ZxCSVtbTEsLTQwKCVlYnApCisJcHNybHEJJDQsJW1tMworCW1vdnEJJW1tNCw4OCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDEzKCVlc3ApCisJbW92bAkxMDQoJWVieCksJWVkeAorCW1vdnEJMTA0KCVlYngpLCVtbTEKKwlwc2xscQkkNjAsJW1tNworCW1vdnEJOTYoJWVieCksJW1tNAorCXBvcgklbW03LCVtbTAKKwltb3ZxCSVtbTIsLTI0KCVlZGkpCisJcHNybHEJJDQsJW1tMgorCW1vdnEJJW1tNSwxMDQoJWVkaSkKKwltb3ZxCSVtbTUsJW1tNgorCW1vdnEJJW1tMCwtMzIoJWVicCkKKwlwc3JscQkkNCwlbW01CisJbW92cQklbW0zLDk2KCVlYnApCisJc2hsbAkkNCwlZWR4CisJbW92YgklZGwsMTQoJWVzcCkKKwltb3ZsCTEyMCglZWJ4KSwlZWR4CisJbW92cQkxMjAoJWVieCksJW1tMAorCXBzbGxxCSQ2MCwlbW02CisJbW92cQkxMTIoJWVieCksJW1tMworCXBvcgklbW02LCVtbTIKKwltb3ZxCSVtbTEsLTE2KCVlZGkpCisJcHNybHEJJDQsJW1tMQorCW1vdnEJJW1tNCwxMTIoJWVkaSkKKwltb3ZxCSVtbTQsJW1tNworCW1vdnEJJW1tMiwtMjQoJWVicCkKKwlwc3JscQkkNCwlbW00CisJbW92cQklbW01LDEwNCglZWJwKQorCXNobGwJJDQsJWVkeAorCW1vdmIJJWRsLDE1KCVlc3ApCisJcHNsbHEJJDYwLCVtbTcKKwlwb3IJJW1tNywlbW0xCisJbW92cQklbW0wLC04KCVlZGkpCisJcHNybHEJJDQsJW1tMAorCW1vdnEJJW1tMywxMjAoJWVkaSkKKwltb3ZxCSVtbTMsJW1tNgorCW1vdnEJJW1tMSwtMTYoJWVicCkKKwlwc3JscQkkNCwlbW0zCisJbW92cQklbW00LDExMiglZWJwKQorCXBzbGxxCSQ2MCwlbW02CisJcG9yCSVtbTYsJW1tMAorCW1vdnEJJW1tMCwtOCglZWJwKQorCW1vdnEJJW1tMywxMjAoJWVicCkKKwltb3ZxCSglZWF4KSwlbW02CisJbW92bAk4KCVlYXgpLCVlYngKKwltb3ZsCTEyKCVlYXgpLCVlZHgKKy5hbGlnbgk0LDB4OTAKK0wwMDRvdXRlcjoKKwl4b3JsCTEyKCVlY3gpLCVlZHgKKwl4b3JsCTgoJWVjeCksJWVieAorCXB4b3IJKCVlY3gpLCVtbTYKKwlsZWFsCTE2KCVlY3gpLCVlY3gKKwltb3ZsCSVlYngsNTM2KCVlc3ApCisJbW92cQklbW02LDUyOCglZXNwKQorCW1vdmwJJWVjeCw1NDgoJWVzcCkKKwl4b3JsCSVlYXgsJWVheAorCXJvbGwJJDgsJWVkeAorCW1vdmIJJWRsLCVhbAorCW1vdmwJJWVheCwlZWJwCisJYW5kYgkkMTUsJWFsCisJc2hybAkkNCwlZWJwCisJcHhvcgklbW0wLCVtbTAKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCSVtbTEsJW1tMQorCXB4b3IJJW1tMiwlbW0yCisJbW92cQkxNiglZXNwLCVlYXgsOCksJW1tNworCW1vdnEJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJc2hybAkkNCwlZWRpCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0yCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUzNiglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0yLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0xCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlweG9yCSVtbTEsJW1tNgorCXNocmwJJDQsJWVicAorCXBpbnNydwkkMiwoJWVzaSwlZWJ4LDIpLCVtbTAKKwlweG9yCTE2KCVlc3AsJWVheCw4KSwlbW03CisJcm9sbAkkOCwlZWR4CisJcHhvcgkxNDQoJWVzcCwlZWF4LDgpLCVtbTYKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJNDAwKCVlc3AsJWVkaSw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWRpLDEpLCVjbAorCW1vdmIJJWRsLCVhbAorCW1vdmQJJW1tNywlZWJ4CisJbW92emJsCSVjbCwlZWN4CisJcHNybHEJJDgsJW1tNworCW1vdnEJJW1tNiwlbW0zCisJbW92bAklZWF4LCVlZGkKKwlwc3JscQkkOCwlbW02CisJcHhvcgkyNzIoJWVzcCwlZWJwLDgpLCVtbTcKKwlhbmRiCSQxNSwlYWwKKwlwc2xscQkkNTYsJW1tMworCXB4b3IJJW1tMCwlbW02CisJc2hybAkkNCwlZWRpCisJcGluc3J3CSQyLCglZXNpLCVlY3gsMiksJW1tMgorCXB4b3IJMTYoJWVzcCwlZWF4LDgpLCVtbTcKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCTE0NCglZXNwLCVlYXgsOCksJW1tNgorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwl4b3JiCSglZXNwLCVlYnAsMSksJWJsCisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlY3gKKwltb3Z6YmwJJWJsLCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVicAorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlZGksOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0yLCVtbTYKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0xCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUzMiglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0xLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0wCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlweG9yCSVtbTAsJW1tNgorCXNocmwJJDQsJWVicAorCXBpbnNydwkkMiwoJWVzaSwlZWJ4LDIpLCVtbTIKKwlweG9yCTE2KCVlc3AsJWVheCw4KSwlbW03CisJcm9sbAkkOCwlZWR4CisJcHhvcgkxNDQoJWVzcCwlZWF4LDgpLCVtbTYKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJNDAwKCVlc3AsJWVkaSw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWRpLDEpLCVjbAorCW1vdmIJJWRsLCVhbAorCW1vdmQJJW1tNywlZWJ4CisJbW92emJsCSVjbCwlZWN4CisJcHNybHEJJDgsJW1tNworCW1vdnEJJW1tNiwlbW0zCisJbW92bAklZWF4LCVlZGkKKwlwc3JscQkkOCwlbW02CisJcHhvcgkyNzIoJWVzcCwlZWJwLDgpLCVtbTcKKwlhbmRiCSQxNSwlYWwKKwlwc2xscQkkNTYsJW1tMworCXB4b3IJJW1tMiwlbW02CisJc2hybAkkNCwlZWRpCisJcGluc3J3CSQyLCglZXNpLCVlY3gsMiksJW1tMQorCXB4b3IJMTYoJWVzcCwlZWF4LDgpLCVtbTcKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCTE0NCglZXNwLCVlYXgsOCksJW1tNgorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwl4b3JiCSglZXNwLCVlYnAsMSksJWJsCisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlY3gKKwltb3Z6YmwJJWJsLCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVicAorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlZGksOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0xLCVtbTYKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0wCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUyOCglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0wLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0yCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlYnAsOCksJW1tNgorCXhvcmIJKCVlc3AsJWVicCwxKSwlYmwKKwltb3ZiCSVkbCwlYWwKKwltb3ZkCSVtbTcsJWVjeAorCW1vdnpibAklYmwsJWVieAorCXBzcmxxCSQ4LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCW1vdmwJJWVheCwlZWJwCisJcHNybHEJJDgsJW1tNgorCXB4b3IJMjcyKCVlc3AsJWVkaSw4KSwlbW03CisJYW5kYgkkMTUsJWFsCisJcHNsbHEJJDU2LCVtbTMKKwlweG9yCSVtbTIsJW1tNgorCXNocmwJJDQsJWVicAorCXBpbnNydwkkMiwoJWVzaSwlZWJ4LDIpLCVtbTEKKwlweG9yCTE2KCVlc3AsJWVheCw4KSwlbW03CisJcm9sbAkkOCwlZWR4CisJcHhvcgkxNDQoJWVzcCwlZWF4LDgpLCVtbTYKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJNDAwKCVlc3AsJWVkaSw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWRpLDEpLCVjbAorCW1vdmIJJWRsLCVhbAorCW1vdmQJJW1tNywlZWJ4CisJbW92emJsCSVjbCwlZWN4CisJcHNybHEJJDgsJW1tNworCW1vdnEJJW1tNiwlbW0zCisJbW92bAklZWF4LCVlZGkKKwlwc3JscQkkOCwlbW02CisJcHhvcgkyNzIoJWVzcCwlZWJwLDgpLCVtbTcKKwlhbmRiCSQxNSwlYWwKKwlwc2xscQkkNTYsJW1tMworCXB4b3IJJW1tMSwlbW02CisJc2hybAkkNCwlZWRpCisJcGluc3J3CSQyLCglZXNpLCVlY3gsMiksJW1tMAorCXB4b3IJMTYoJWVzcCwlZWF4LDgpLCVtbTcKKwlyb2xsCSQ4LCVlZHgKKwlweG9yCTE0NCglZXNwLCVlYXgsOCksJW1tNgorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwl4b3JiCSglZXNwLCVlYnAsMSksJWJsCisJbW92YgklZGwsJWFsCisJbW92ZAklbW03LCVlY3gKKwltb3Z6YmwJJWJsLCVlYngKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVicAorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlZGksOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0wLCVtbTYKKwlzaHJsCSQ0LCVlYnAKKwlwaW5zcncJJDIsKCVlc2ksJWVieCwyKSwlbW0yCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXJvbGwJJDgsJWVkeAorCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJcHhvcgklbW0zLCVtbTcKKwlweG9yCTQwMCglZXNwLCVlZGksOCksJW1tNgorCXhvcmIJKCVlc3AsJWVkaSwxKSwlY2wKKwltb3ZiCSVkbCwlYWwKKwltb3ZsCTUyNCglZXNwKSwlZWR4CisJbW92ZAklbW03LCVlYngKKwltb3Z6YmwJJWNsLCVlY3gKKwlwc3JscQkkOCwlbW03CisJbW92cQklbW02LCVtbTMKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxxCSQ4LCVtbTYKKwlweG9yCTI3MiglZXNwLCVlYnAsOCksJW1tNworCWFuZGIJJDE1LCVhbAorCXBzbGxxCSQ1NiwlbW0zCisJcHhvcgklbW0yLCVtbTYKKwlzaHJsCSQ0LCVlZGkKKwlwaW5zcncJJDIsKCVlc2ksJWVjeCwyKSwlbW0xCisJcHhvcgkxNiglZXNwLCVlYXgsOCksJW1tNworCXB4b3IJMTQ0KCVlc3AsJWVheCw4KSwlbW02CisJeG9yYgkoJWVzcCwlZWJwLDEpLCVibAorCXB4b3IJJW1tMywlbW03CisJcHhvcgk0MDAoJWVzcCwlZWJwLDgpLCVtbTYKKwltb3Z6YmwJJWJsLCVlYngKKwlweG9yCSVtbTIsJW1tMgorCXBzbGxxCSQ0LCVtbTEKKwltb3ZkCSVtbTcsJWVjeAorCXBzcmxxCSQ0LCVtbTcKKwltb3ZxCSVtbTYsJW1tMworCXBzcmxxCSQ0LCVtbTYKKwlzaGxsCSQ0LCVlY3gKKwlweG9yCTE2KCVlc3AsJWVkaSw4KSwlbW03CisJcHNsbHEJJDYwLCVtbTMKKwltb3Z6YmwJJWNsLCVlY3gKKwlweG9yCSVtbTMsJW1tNworCXB4b3IJMTQ0KCVlc3AsJWVkaSw4KSwlbW02CisJcGluc3J3CSQyLCglZXNpLCVlYngsMiksJW1tMAorCXB4b3IJJW1tMSwlbW02CisJbW92ZAklbW03LCVlZHgKKwlwaW5zcncJJDMsKCVlc2ksJWVjeCwyKSwlbW0yCisJcHNsbHEJJDEyLCVtbTAKKwlweG9yCSVtbTAsJW1tNgorCXBzcmxxCSQzMiwlbW03CisJcHhvcgklbW0yLCVtbTYKKwltb3ZsCTU0OCglZXNwKSwlZWN4CisJbW92ZAklbW03LCVlYngKKwltb3ZxCSVtbTYsJW1tMworCXBzbGx3CSQ4LCVtbTYKKwlwc3JsdwkkOCwlbW0zCisJcG9yCSVtbTMsJW1tNgorCWJzd2FwCSVlZHgKKwlwc2h1ZncJJDI3LCVtbTYsJW1tNgorCWJzd2FwCSVlYngKKwljbXBsCTU1MiglZXNwKSwlZWN4CisJam5lCUwwMDRvdXRlcgorCW1vdmwJNTQ0KCVlc3ApLCVlYXgKKwltb3ZsCSVlZHgsMTIoJWVheCkKKwltb3ZsCSVlYngsOCglZWF4KQorCW1vdnEJJW1tNiwoJWVheCkKKwltb3ZsCTU1NiglZXNwKSwlZXNwCisJZW1tcworCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmdsb2JsCV9nY21faW5pdF9jbG11bAorLnByaXZhdGVfZXh0ZXJuCV9nY21faW5pdF9jbG11bAorLmFsaWduCTQKK19nY21faW5pdF9jbG11bDoKK0xfZ2NtX2luaXRfY2xtdWxfYmVnaW46CisJbW92bAk0KCVlc3ApLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVheAorCWNhbGwJTDAwNXBpYworTDAwNXBpYzoKKwlwb3BsCSVlY3gKKwlsZWFsCUxic3dhcC1MMDA1cGljKCVlY3gpLCVlY3gKKwltb3ZkcXUJKCVlYXgpLCV4bW0yCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMgorCXBzaHVmZAkkMjU1LCV4bW0yLCV4bW00CisJbW92ZHFhCSV4bW0yLCV4bW0zCisJcHNsbHEJJDEsJXhtbTIKKwlweG9yCSV4bW01LCV4bW01CisJcHNybHEJJDYzLCV4bW0zCisJcGNtcGd0ZAkleG1tNCwleG1tNQorCXBzbGxkcQkkOCwleG1tMworCXBvcgkleG1tMywleG1tMgorCXBhbmQJMTYoJWVjeCksJXhtbTUKKwlweG9yCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMCwleG1tMworCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMiwleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIwLDAKKwl4b3JwcwkleG1tMCwleG1tMworCXhvcnBzCSV4bW0xLCV4bW0zCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDc4LCV4bW0yLCV4bW0zCisJcHNodWZkCSQ3OCwleG1tMCwleG1tNAorCXB4b3IJJXhtbTIsJXhtbTMKKwltb3ZkcXUJJXhtbTIsKCVlZHgpCisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxdQkleG1tMCwxNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNyw4CisJbW92ZHF1CSV4bW00LDMyKCVlZHgpCisJcmV0CisuZ2xvYmwJX2djbV9nbXVsdF9jbG11bAorLnByaXZhdGVfZXh0ZXJuCV9nY21fZ211bHRfY2xtdWwKKy5hbGlnbgk0CitfZ2NtX2dtdWx0X2NsbXVsOgorTF9nY21fZ211bHRfY2xtdWxfYmVnaW46CisJbW92bAk0KCVlc3ApLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVkeAorCWNhbGwJTDAwNnBpYworTDAwNnBpYzoKKwlwb3BsCSVlY3gKKwlsZWFsCUxic3dhcC1MMDA2cGljKCVlY3gpLCVlY3gKKwltb3ZkcXUJKCVlYXgpLCV4bW0wCisJbW92ZHFhCSglZWN4KSwleG1tNQorCW1vdnVwcwkoJWVkeCksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworCW1vdnVwcwkzMiglZWR4KSwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk0LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDIsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMjAsMAorCXhvcnBzCSV4bW0wLCV4bW0zCisJeG9ycHMJJXhtbTEsJXhtbTMKKwltb3ZkcWEJJXhtbTMsJXhtbTQKKwlwc3JsZHEJJDgsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW0wLCV4bW00CisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNAorCXBzcmxxCSQ1LCV4bW0wCisJcHhvcgkleG1tNCwleG1tMAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisJbW92ZHF1CSV4bW0wLCglZWF4KQorCXJldAorLmdsb2JsCV9nY21fZ2hhc2hfY2xtdWwKKy5wcml2YXRlX2V4dGVybglfZ2NtX2doYXNoX2NsbXVsCisuYWxpZ24JNAorX2djbV9naGFzaF9jbG11bDoKK0xfZ2NtX2doYXNoX2NsbXVsX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwltb3ZsCTI0KCVlc3ApLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwltb3ZsCTMyKCVlc3ApLCVlYngKKwljYWxsCUwwMDdwaWMKK0wwMDdwaWM6CisJcG9wbAklZWN4CisJbGVhbAlMYnN3YXAtTDAwN3BpYyglZWN4KSwlZWN4CisJbW92ZHF1CSglZWF4KSwleG1tMAorCW1vdmRxYQkoJWVjeCksJXhtbTUKKwltb3ZkcXUJKCVlZHgpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKwlzdWJsCSQxNiwlZWJ4CisJanoJTDAwOG9kZF90YWlsCisJbW92ZHF1CSglZXNpKSwleG1tMworCW1vdmRxdQkxNiglZXNpKSwleG1tNgorLmJ5dGUJMTAyLDE1LDU2LDAsMjIxCisuYnl0ZQkxMDIsMTUsNTYsMCwyNDUKKwltb3ZkcXUJMzIoJWVkeCksJXhtbTUKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNodWZkCSQ3OCwleG1tNiwleG1tMworCW1vdmRxYQkleG1tNiwleG1tNworCXB4b3IJJXhtbTYsJXhtbTMKKwlsZWFsCTMyKCVlc2kpLCVlc2kKKy5ieXRlCTEwMiwxNSw1OCw2OCwyNDIsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDI1MCwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIyMSwwCisJbW92dXBzCTE2KCVlZHgpLCV4bW0yCisJbm9wCisJc3VibAkkMzIsJWVieAorCWpiZQlMMDA5ZXZlbl90YWlsCisJam1wCUwwMTBtb2RfbG9vcAorLmFsaWduCTUsMHg5MAorTDAxMG1vZF9sb29wOgorCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW00CisJbm9wCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk0LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDIsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMjksMTYKKwltb3Z1cHMJKCVlZHgpLCV4bW0yCisJeG9ycHMJJXhtbTYsJXhtbTAKKwltb3ZkcWEJKCVlY3gpLCV4bW01CisJeG9ycHMJJXhtbTcsJXhtbTEKKwltb3ZkcXUJKCVlc2kpLCV4bW03CisJcHhvcgkleG1tMCwleG1tMworCW1vdmRxdQkxNiglZXNpKSwleG1tNgorCXB4b3IJJXhtbTEsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDI1MworCXB4b3IJJXhtbTMsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc3JsZHEJJDgsJXhtbTQKKwlwc2xsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0xCisJcHhvcgkleG1tMywleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ1CisJcHhvcgkleG1tNywleG1tMQorCW1vdmRxYQkleG1tNiwleG1tNworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDI0MiwwCisJbW92dXBzCTMyKCVlZHgpLCV4bW01CisJcHNsbHEJJDU3LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ4LCV4bW0wCisJcHNybGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW03LCV4bW0zCisJbW92ZHFhCSV4bW0wLCV4bW00CisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW03LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMQorLmJ5dGUJMTAyLDE1LDU4LDY4LDI1MCwxNworCW1vdnVwcwkxNiglZWR4KSwleG1tMgorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMjEsMAorCWxlYWwJMzIoJWVzaSksJWVzaQorCXN1YmwJJDMyLCVlYngKKwlqYQlMMDEwbW9kX2xvb3AKK0wwMDlldmVuX3RhaWw6CisJcHNodWZkCSQ3OCwleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCw2OCwxOTQsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIwMiwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIyOSwxNgorCW1vdmRxYQkoJWVjeCksJXhtbTUKKwl4b3JwcwkleG1tNiwleG1tMAorCXhvcnBzCSV4bW03LCV4bW0xCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTEsJXhtbTMKKwlweG9yCSV4bW0zLCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNybGRxCSQ4LCV4bW00CisJcHNsbGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTMsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwl0ZXN0bAklZWJ4LCVlYngKKwlqbnoJTDAxMWRvbmUKKwltb3Z1cHMJKCVlZHgpLCV4bW0yCitMMDA4b2RkX3RhaWw6CisJbW92ZHF1CSglZXNpKSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIxCisJcHhvcgkleG1tMywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTMKKwlwc2h1ZmQJJDc4LCV4bW0yLCV4bW00CisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTIsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCw2OCwxOTQsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIwMiwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIyMCwwCisJeG9ycHMJJXhtbTAsJXhtbTMKKwl4b3JwcwkleG1tMSwleG1tMworCW1vdmRxYQkleG1tMywleG1tNAorCXBzcmxkcQkkOCwleG1tMworCXBzbGxkcQkkOCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW00CisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbHEJJDUsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbHEJJDEsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbHEJJDU3LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ4LCV4bW0wCisJcHNybGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW00CisJcHNybHEJJDUsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0wCisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0wCitMMDExZG9uZToKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworCW1vdmRxdQkleG1tMCwoJWVheCkKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgk2LDB4OTAKK0xic3dhcDoKKy5ieXRlCTE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDAKKy5ieXRlCTEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE5NAorLmFsaWduCTYsMHg5MAorTHJlbV84Yml0OgorLnZhbHVlCTAsNDUwLDkwMCw1ODIsMTgwMCwxNzM4LDExNjQsMTM1OAorLnZhbHVlCTM2MDAsNDA1MCwzNDc2LDMxNTgsMjMyOCwyMjY2LDI3MTYsMjkxMAorLnZhbHVlCTcyMDAsNzY1MCw4MTAwLDc3ODIsNjk1Miw2ODkwLDYzMTYsNjUxMAorLnZhbHVlCTQ2NTYsNTEwNiw0NTMyLDQyMTQsNTQzMiw1MzcwLDU4MjAsNjAxNAorLnZhbHVlCTE0NDAwLDE0NzIyLDE1MzAwLDE0ODU0LDE2MjAwLDE2MDEwLDE1NTY0LDE1NjMwCisudmFsdWUJMTM5MDQsMTQyMjYsMTM3ODAsMTMzMzQsMTI2MzIsMTI0NDIsMTMwMjAsMTMwODYKKy52YWx1ZQk5MzEyLDk2MzQsMTAyMTIsOTc2Niw5MDY0LDg4NzQsODQyOCw4NDk0CisudmFsdWUJMTA4NjQsMTExODYsMTA3NDAsMTAyOTQsMTE2NDAsMTE0NTAsMTIwMjgsMTIwOTQKKy52YWx1ZQkyODgwMCwyODk5NCwyOTQ0NCwyOTM4MiwzMDYwMCwzMDI4MiwyOTcwOCwzMDE1OAorLnZhbHVlCTMyNDAwLDMyNTk0LDMyMDIwLDMxOTU4LDMxMTI4LDMwODEwLDMxMjYwLDMxNzEwCisudmFsdWUJMjc4MDgsMjgwMDIsMjg0NTIsMjgzOTAsMjc1NjAsMjcyNDIsMjY2NjgsMjcxMTgKKy52YWx1ZQkyNTI2NCwyNTQ1OCwyNDg4NCwyNDgyMiwyNjA0MCwyNTcyMiwyNjE3MiwyNjYyMgorLnZhbHVlCTE4NjI0LDE4NjkwLDE5MjY4LDE5MDc4LDIwNDI0LDE5OTc4LDE5NTMyLDE5ODU0CisudmFsdWUJMTgxMjgsMTgxOTQsMTc3NDgsMTc1NTgsMTY4NTYsMTY0MTAsMTY5ODgsMTczMTAKKy52YWx1ZQkyMTcyOCwyMTc5NCwyMjM3MiwyMjE4MiwyMTQ4MCwyMTAzNCwyMDU4OCwyMDkxMAorLnZhbHVlCTIzMjgwLDIzMzQ2LDIyOTAwLDIyNzEwLDI0MDU2LDIzNjEwLDI0MTg4LDI0NTEwCisudmFsdWUJNTc2MDAsNTc1MzgsNTc5ODgsNTgxODIsNTg4ODgsNTkzMzgsNTg3NjQsNTg0NDYKKy52YWx1ZQk2MTIwMCw2MTEzOCw2MDU2NCw2MDc1OCw1OTQxNiw1OTg2Niw2MDMxNiw1OTk5OAorLnZhbHVlCTY0ODAwLDY0NzM4LDY1MTg4LDY1MzgyLDY0MDQwLDY0NDkwLDYzOTE2LDYzNTk4CisudmFsdWUJNjIyNTYsNjIxOTQsNjE2MjAsNjE4MTQsNjI1MjAsNjI5NzAsNjM0MjAsNjMxMDIKKy52YWx1ZQk1NTYxNiw1NTQyNiw1NjAwNCw1NjA3MCw1NjkwNCw1NzIyNiw1Njc4MCw1NjMzNAorLnZhbHVlCTU1MTIwLDU0OTMwLDU0NDg0LDU0NTUwLDUzMzM2LDUzNjU4LDU0MjM2LDUzNzkwCisudmFsdWUJNTA1MjgsNTAzMzgsNTA5MTYsNTA5ODIsNDk3NjgsNTAwOTAsNDk2NDQsNDkxOTgKKy52YWx1ZQk1MjA4MCw1MTg5MCw1MTQ0NCw1MTUxMCw1MjM0NCw1MjY2Niw1MzI0NCw1Mjc5OAorLnZhbHVlCTM3MjQ4LDM2OTMwLDM3MzgwLDM3ODMwLDM4NTM2LDM4NzMwLDM4MTU2LDM4MDk0CisudmFsdWUJNDA4NDgsNDA1MzAsMzk5NTYsNDA0MDYsMzkwNjQsMzkyNTgsMzk3MDgsMzk2NDYKKy52YWx1ZQkzNjI1NiwzNTkzOCwzNjM4OCwzNjgzOCwzNTQ5NiwzNTY5MCwzNTExNiwzNTA1NAorLnZhbHVlCTMzNzEyLDMzMzk0LDMyODIwLDMzMjcwLDMzOTc2LDM0MTcwLDM0NjIwLDM0NTU4CisudmFsdWUJNDM0NTYsNDMwMTAsNDM1ODgsNDM5MTAsNDQ3NDQsNDQ4MTAsNDQzNjQsNDQxNzQKKy52YWx1ZQk0Mjk2MCw0MjUxNCw0MjA2OCw0MjM5MCw0MTE3Niw0MTI0Miw0MTgyMCw0MTYzMAorLnZhbHVlCTQ2NTYwLDQ2MTE0LDQ2NjkyLDQ3MDE0LDQ1ODAwLDQ1ODY2LDQ1NDIwLDQ1MjMwCisudmFsdWUJNDgxMTIsNDc2NjYsNDcyMjAsNDc1NDIsNDgzNzYsNDg0NDIsNDkwMjAsNDg4MzAKKy5hbGlnbgk2LDB4OTAKK0xyZW1fNGJpdDoKKy5sb25nCTAsMCwwLDQ3MTg1OTIwMCwwLDk0MzcxODQwMCwwLDYxMDI3MTIzMgorLmxvbmcJMCwxODg3NDM2ODAwLDAsMTgyMjQyNTA4OCwwLDEyMjA1NDI0NjQsMCwxNDIzOTY2MjA4CisubG9uZwkwLDM3NzQ4NzM2MDAsMCw0MjQ2NzMyODAwLDAsMzY0NDg1MDE3NiwwLDMzMTE0MDMwMDgKKy5sb25nCTAsMjQ0MTA4NDkyOCwwLDIzNzYwNzMyMTYsMCwyODQ3OTMyNDE2LDAsMzA1MTM1NjE2MAorLmJ5dGUJNzEsNzIsNjUsODMsNzIsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDQ0LDMyLDY3CisuYnl0ZQk4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyCisuYnl0ZQkxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIKKy5ieXRlCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL21kNS01ODYuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9tZDUtNTg2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1ZTQyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9tZDUtNTg2LlMKQEAgLTAsMCArMSw2NzkgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5nbG9ibAlfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisucHJpdmF0ZV9leHRlcm4JX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcgorLmFsaWduCTQKK19tZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXI6CitMX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcl9iZWdpbjoKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCW1vdmwJMTYoJWVzcCksJWVzaQorCW1vdmwJMjAoJWVzcCksJWVjeAorCXB1c2hsCSVlYnAKKwlzaGxsCSQ2LCVlY3gKKwlwdXNobAklZWJ4CisJYWRkbAklZXNpLCVlY3gKKwlzdWJsCSQ2NCwlZWN4CisJbW92bAkoJWVkaSksJWVheAorCXB1c2hsCSVlY3gKKwltb3ZsCTQoJWVkaSksJWVieAorCW1vdmwJOCglZWRpKSwlZWN4CisJbW92bAkxMiglZWRpKSwlZWR4CitMMDAwc3RhcnQ6CisKKwkjIFIwIHNlY3Rpb24gCisJbW92bAklZWN4LCVlZGkKKwltb3ZsCSglZXNpKSwlZWJwCisJIyBSMCAwIAorCXhvcmwJJWVkeCwlZWRpCisJYW5kbAklZWJ4LCVlZGkKKwlsZWFsCTM2MTQwOTAzNjAoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ3LCVlYXgKKwltb3ZsCTQoJWVzaSksJWVicAorCWFkZGwJJWVieCwlZWF4CisJIyBSMCAxIAorCXhvcmwJJWVjeCwlZWRpCisJYW5kbAklZWF4LCVlZGkKKwlsZWFsCTM5MDU0MDI3MTAoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQxMiwlZWR4CisJbW92bAk4KCVlc2kpLCVlYnAKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjAgMiAKKwl4b3JsCSVlYngsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbGVhbAk2MDYxMDU4MTkoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVkaSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwlyb2xsCSQxNywlZWN4CisJbW92bAkxMiglZXNpKSwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwkjIFIwIDMgCisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCWxlYWwJMzI1MDQ0MTk2NiglZWJ4LCVlYnAsMSksJWVieAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDIyLCVlYngKKwltb3ZsCTE2KCVlc2kpLCVlYnAKKwlhZGRsCSVlY3gsJWVieAorCSMgUjAgNCAKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbGVhbAk0MTE4NTQ4Mzk5KCVlYXgsJWVicCwxKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJJWVieCwlZWRpCisJcm9sbAkkNywlZWF4CisJbW92bAkyMCglZXNpKSwlZWJwCisJYWRkbAklZWJ4LCVlYXgKKwkjIFIwIDUgCisJeG9ybAklZWN4LCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCWxlYWwJMTIwMDA4MDQyNiglZWR4LCVlYnAsMSksJWVkeAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDEyLCVlZHgKKwltb3ZsCTI0KCVlc2kpLCVlYnAKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjAgNiAKKwl4b3JsCSVlYngsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbGVhbAkyODIxNzM1OTU1KCVlY3gsJWVicCwxKSwlZWN4CisJeG9ybAklZWJ4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTcsJWVjeAorCW1vdmwJMjgoJWVzaSksJWVicAorCWFkZGwJJWVkeCwlZWN4CisJIyBSMCA3IAorCXhvcmwJJWVheCwlZWRpCisJYW5kbAklZWN4LCVlZGkKKwlsZWFsCTQyNDkyNjEzMTMoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQyMiwlZWJ4CisJbW92bAkzMiglZXNpKSwlZWJwCisJYWRkbAklZWN4LCVlYngKKwkjIFIwIDggCisJeG9ybAklZWR4LCVlZGkKKwlhbmRsCSVlYngsJWVkaQorCWxlYWwJMTc3MDAzNTQxNiglZWF4LCVlYnAsMSksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDcsJWVheAorCW1vdmwJMzYoJWVzaSksJWVicAorCWFkZGwJJWVieCwlZWF4CisJIyBSMCA5IAorCXhvcmwJJWVjeCwlZWRpCisJYW5kbAklZWF4LCVlZGkKKwlsZWFsCTIzMzY1NTI4NzkoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQxMiwlZWR4CisJbW92bAk0MCglZXNpKSwlZWJwCisJYWRkbAklZWF4LCVlZHgKKwkjIFIwIDEwIAorCXhvcmwJJWVieCwlZWRpCisJYW5kbAklZWR4LCVlZGkKKwlsZWFsCTQyOTQ5MjUyMzMoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVkaSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwlyb2xsCSQxNywlZWN4CisJbW92bAk0NCglZXNpKSwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwkjIFIwIDExIAorCXhvcmwJJWVheCwlZWRpCisJYW5kbAklZWN4LCVlZGkKKwlsZWFsCTIzMDQ1NjMxMzQoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQyMiwlZWJ4CisJbW92bAk0OCglZXNpKSwlZWJwCisJYWRkbAklZWN4LCVlYngKKwkjIFIwIDEyIAorCXhvcmwJJWVkeCwlZWRpCisJYW5kbAklZWJ4LCVlZGkKKwlsZWFsCTE4MDQ2MDM2ODIoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ3LCVlYXgKKwltb3ZsCTUyKCVlc2kpLCVlYnAKKwlhZGRsCSVlYngsJWVheAorCSMgUjAgMTMgCisJeG9ybAklZWN4LCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCWxlYWwJNDI1NDYyNjE5NSglZWR4LCVlYnAsMSksJWVkeAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDEyLCVlZHgKKwltb3ZsCTU2KCVlc2kpLCVlYnAKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjAgMTQgCisJeG9ybAklZWJ4LCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCWxlYWwJMjc5Mjk2NTAwNiglZWN4LCVlYnAsMSksJWVjeAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXJvbGwJJDE3LCVlY3gKKwltb3ZsCTYwKCVlc2kpLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCSMgUjAgMTUgCisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCWxlYWwJMTIzNjUzNTMyOSglZWJ4LCVlYnAsMSksJWVieAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDIyLCVlYngKKwltb3ZsCTQoJWVzaSksJWVicAorCWFkZGwJJWVjeCwlZWJ4CisKKwkjIFIxIHNlY3Rpb24gCisJIyBSMSAxNiAKKwlsZWFsCTQxMjkxNzA3ODYoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlYngsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbW92bAkyNCglZXNpKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJJWVieCwlZWRpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJ4LCVlYXgKKwkjIFIxIDE3IAorCWxlYWwJMzIyNTQ2NTY2NCglZWR4LCVlYnAsMSksJWVkeAorCXhvcmwJJWVheCwlZWRpCisJYW5kbAklZWN4LCVlZGkKKwltb3ZsCTQ0KCVlc2kpLCVlYnAKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQ5LCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjEgMTggCisJbGVhbAk2NDM3MTc3MTMoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAkoJWVzaSksJWVicAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWRpLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXJvbGwJJDE0LCVlY3gKKwlhZGRsCSVlZHgsJWVjeAorCSMgUjEgMTkgCisJbGVhbAkzOTIxMDY5OTk0KCVlYngsJWVicCwxKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlhbmRsCSVlYXgsJWVkaQorCW1vdmwJMjAoJWVzaSksJWVicAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDIwLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCSMgUjEgMjAgCisJbGVhbAkzNTkzNDA4NjA1KCVlYXgsJWVicCwxKSwlZWF4CisJeG9ybAklZWJ4LCVlZGkKKwlhbmRsCSVlZHgsJWVkaQorCW1vdmwJNDAoJWVzaSksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVieCwlZWF4CisJIyBSMSAyMSAKKwlsZWFsCTM4MDE2MDgzKCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJNjAoJWVzaSksJWVicAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisJIyBSMSAyMiAKKwlsZWFsCTM2MzQ0ODg5NjEoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAkxNiglZXNpKSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTQsJWVjeAorCWFkZGwJJWVkeCwlZWN4CisJIyBSMSAyMyAKKwlsZWFsCTM4ODk0Mjk0NDgoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCWFuZGwJJWVheCwlZWRpCisJbW92bAkzNiglZXNpKSwlZWJwCisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisJIyBSMSAyNCAKKwlsZWFsCTU2ODQ0NjQzOCglZWF4LCVlYnAsMSksJWVheAorCXhvcmwJJWVieCwlZWRpCisJYW5kbAklZWR4LCVlZGkKKwltb3ZsCTU2KCVlc2kpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCSMgUjEgMjUgCisJbGVhbAkzMjc1MTYzNjA2KCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJMTIoJWVzaSksJWVicAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisJIyBSMSAyNiAKKwlsZWFsCTQxMDc2MDMzMzUoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAkzMiglZXNpKSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTQsJWVjeAorCWFkZGwJJWVkeCwlZWN4CisJIyBSMSAyNyAKKwlsZWFsCTExNjM1MzE1MDEoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCWFuZGwJJWVheCwlZWRpCisJbW92bAk1MiglZXNpKSwlZWJwCisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisJIyBSMSAyOCAKKwlsZWFsCTI4NTAyODU4MjkoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlYngsJWVkaQorCWFuZGwJJWVkeCwlZWRpCisJbW92bAk4KCVlc2kpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCSMgUjEgMjkgCisJbGVhbAk0MjQzNTYzNTEyKCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWF4LCVlZGkKKwlhbmRsCSVlY3gsJWVkaQorCW1vdmwJMjgoJWVzaSksJWVicAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisJIyBSMSAzMCAKKwlsZWFsCTE3MzUzMjg0NzMoJWVjeCwlZWJwLDEpLCVlY3gKKwl4b3JsCSVlZHgsJWVkaQorCWFuZGwJJWVieCwlZWRpCisJbW92bAk0OCglZXNpKSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJcm9sbAkkMTQsJWVjeAorCWFkZGwJJWVkeCwlZWN4CisJIyBSMSAzMSAKKwlsZWFsCTIzNjgzNTk1NjIoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCWFuZGwJJWVheCwlZWRpCisJbW92bAkyMCglZXNpKSwlZWJwCisJeG9ybAklZWR4LCVlZGkKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisKKwkjIFIyIHNlY3Rpb24gCisJIyBSMiAzMiAKKwl4b3JsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlZWRpCisJbGVhbAk0Mjk0NTg4NzM4KCVlYXgsJWVicCwxKSwlZWF4CisJYWRkbAklZWRpLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCTMyKCVlc2kpLCVlYnAKKwltb3ZsCSVlYngsJWVkaQorCSMgUjIgMzMgCisJbGVhbAkyMjcyMzkyODMzKCVlZHgsJWVicCwxKSwlZWR4CisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCXhvcmwJJWVheCwlZWRpCisJbW92bAk0NCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDExLCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjIgMzQgCisJeG9ybAklZWJ4LCVlZGkKKwl4b3JsCSVlZHgsJWVkaQorCWxlYWwJMTgzOTAzMDU2MiglZWN4LCVlYnAsMSksJWVjeAorCWFkZGwJJWVkaSwlZWN4CisJcm9sbAkkMTYsJWVjeAorCW1vdmwJNTYoJWVzaSksJWVicAorCW1vdmwJJWVkeCwlZWRpCisJIyBSMiAzNSAKKwlsZWFsCTQyNTk2NTc3NDAoJWVieCwlZWJwLDEpLCVlYngKKwlhZGRsCSVlZHgsJWVjeAorCXhvcmwJJWVheCwlZWRpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTQoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQyMywlZWJ4CisJYWRkbAklZWN4LCVlYngKKwkjIFIyIDM2IAorCXhvcmwJJWVkeCwlZWRpCisJeG9ybAklZWJ4LCVlZGkKKwlsZWFsCTI3NjM5NzUyMzYoJWVheCwlZWJwLDEpLCVlYXgKKwlhZGRsCSVlZGksJWVheAorCXJvbGwJJDQsJWVheAorCW1vdmwJMTYoJWVzaSksJWVicAorCW1vdmwJJWVieCwlZWRpCisJIyBSMiAzNyAKKwlsZWFsCTEyNzI4OTMzNTMoJWVkeCwlZWJwLDEpLCVlZHgKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCTI4KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkMTEsJWVkeAorCWFkZGwJJWVheCwlZWR4CisJIyBSMiAzOCAKKwl4b3JsCSVlYngsJWVkaQorCXhvcmwJJWVkeCwlZWRpCisJbGVhbAk0MTM5NDY5NjY0KCVlY3gsJWVicCwxKSwlZWN4CisJYWRkbAklZWRpLCVlY3gKKwlyb2xsCSQxNiwlZWN4CisJbW92bAk0MCglZXNpKSwlZWJwCisJbW92bAklZWR4LCVlZGkKKwkjIFIyIDM5IAorCWxlYWwJMzIwMDIzNjY1NiglZWJ4LCVlYnAsMSksJWVieAorCWFkZGwJJWVkeCwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJNTIoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQyMywlZWJ4CisJYWRkbAklZWN4LCVlYngKKwkjIFIyIDQwIAorCXhvcmwJJWVkeCwlZWRpCisJeG9ybAklZWJ4LCVlZGkKKwlsZWFsCTY4MTI3OTE3NCglZWF4LCVlYnAsMSksJWVheAorCWFkZGwJJWVkaSwlZWF4CisJcm9sbAkkNCwlZWF4CisJbW92bAkoJWVzaSksJWVicAorCW1vdmwJJWVieCwlZWRpCisJIyBSMiA0MSAKKwlsZWFsCTM5MzY0MzAwNzQoJWVkeCwlZWJwLDEpLCVlZHgKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCTEyKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkMTEsJWVkeAorCWFkZGwJJWVheCwlZWR4CisJIyBSMiA0MiAKKwl4b3JsCSVlYngsJWVkaQorCXhvcmwJJWVkeCwlZWRpCisJbGVhbAkzNTcyNDQ1MzE3KCVlY3gsJWVicCwxKSwlZWN4CisJYWRkbAklZWRpLCVlY3gKKwlyb2xsCSQxNiwlZWN4CisJbW92bAkyNCglZXNpKSwlZWJwCisJbW92bAklZWR4LCVlZGkKKwkjIFIyIDQzIAorCWxlYWwJNzYwMjkxODkoJWVieCwlZWJwLDEpLCVlYngKKwlhZGRsCSVlZHgsJWVjeAorCXhvcmwJJWVheCwlZWRpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTM2KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkMjMsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisJIyBSMiA0NCAKKwl4b3JsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlZWRpCisJbGVhbAkzNjU0NjAyODA5KCVlYXgsJWVicCwxKSwlZWF4CisJYWRkbAklZWRpLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCTQ4KCVlc2kpLCVlYnAKKwltb3ZsCSVlYngsJWVkaQorCSMgUjIgNDUgCisJbGVhbAkzODczMTUxNDYxKCVlZHgsJWVicCwxKSwlZWR4CisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCXhvcmwJJWVheCwlZWRpCisJbW92bAk2MCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDExLCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjIgNDYgCisJeG9ybAklZWJ4LCVlZGkKKwl4b3JsCSVlZHgsJWVkaQorCWxlYWwJNTMwNzQyNTIwKCVlY3gsJWVicCwxKSwlZWN4CisJYWRkbAklZWRpLCVlY3gKKwlyb2xsCSQxNiwlZWN4CisJbW92bAk4KCVlc2kpLCVlYnAKKwltb3ZsCSVlZHgsJWVkaQorCSMgUjIgNDcgCisJbGVhbAkzMjk5NjI4NjQ1KCVlYngsJWVicCwxKSwlZWJ4CisJYWRkbAklZWR4LCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDIzLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCisJIyBSMyBzZWN0aW9uIAorCSMgUjMgNDggCisJeG9ybAklZWR4LCVlZGkKKwlvcmwJJWVieCwlZWRpCisJbGVhbAk0MDk2MzM2NDUyKCVlYXgsJWVicCwxKSwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTI4KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQ2LCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVieCwlZWF4CisJIyBSMyA0OSAKKwlvcmwJJWVheCwlZWRpCisJbGVhbAkxMTI2ODkxNDE1KCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCTU2KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQxMCwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjMgNTAgCisJb3JsCSVlZHgsJWVkaQorCWxlYWwJMjg3ODYxMjM5MSglZWN4LCVlYnAsMSksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAkyMCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlY3gKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkMTUsJWVjeAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwkjIFIzIDUxIAorCW9ybAklZWN4LCVlZGkKKwlsZWFsCTQyMzc1MzMyNDEoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJNDgoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDIxLCVlYngKKwl4b3JsCSVlZHgsJWVkaQorCWFkZGwJJWVjeCwlZWJ4CisJIyBSMyA1MiAKKwlvcmwJJWVieCwlZWRpCisJbGVhbAkxNzAwNDg1NTcxKCVlYXgsJWVicCwxKSwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTEyKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQ2LCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVieCwlZWF4CisJIyBSMyA1MyAKKwlvcmwJJWVheCwlZWRpCisJbGVhbAkyMzk5OTgwNjkwKCVlZHgsJWVicCwxKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCTQwKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQxMCwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlhZGRsCSVlYXgsJWVkeAorCSMgUjMgNTQgCisJb3JsCSVlZHgsJWVkaQorCWxlYWwJNDI5MzkxNTc3MyglZWN4LCVlYnAsMSksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAk0KCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCSMgUjMgNTUgCisJb3JsCSVlY3gsJWVkaQorCWxlYWwJMjI0MDA0NDQ5NyglZWJ4LCVlYnAsMSksJWVieAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAkzMiglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkMjEsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWN4LCVlYngKKwkjIFIzIDU2IAorCW9ybAklZWJ4LCVlZGkKKwlsZWFsCTE4NzMzMTMzNTkoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJNjAoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWF4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDYsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWJ4LCVlYXgKKwkjIFIzIDU3IAorCW9ybAklZWF4LCVlZGkKKwlsZWFsCTQyNjQzNTU1NTIoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJMjQoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDEwLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCWFkZGwJJWVheCwlZWR4CisJIyBSMyA1OCAKKwlvcmwJJWVkeCwlZWRpCisJbGVhbAkyNzM0NzY4OTE2KCVlY3gsJWVicCwxKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCTUyKCVlc2kpLCVlYnAKKwlhZGRsCSVlZGksJWVjeAorCW1vdmwJJC0xLCVlZGkKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCSMgUjMgNTkgCisJb3JsCSVlY3gsJWVkaQorCWxlYWwJMTMwOTE1MTY0OSglZWJ4LCVlYnAsMSksJWVieAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAkxNiglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkMjEsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJYWRkbAklZWN4LCVlYngKKwkjIFIzIDYwIAorCW9ybAklZWJ4LCVlZGkKKwlsZWFsCTQxNDk0NDQyMjYoJWVheCwlZWJwLDEpLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJNDQoJWVzaSksJWVicAorCWFkZGwJJWVkaSwlZWF4CisJbW92bAkkLTEsJWVkaQorCXJvbGwJJDYsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWJ4LCVlYXgKKwkjIFIzIDYxIAorCW9ybAklZWF4LCVlZGkKKwlsZWFsCTMxNzQ3NTY5MTcoJWVkeCwlZWJwLDEpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJOCglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkMTAsJWVkeAorCXhvcmwJJWVieCwlZWRpCisJYWRkbAklZWF4LCVlZHgKKwkjIFIzIDYyIAorCW9ybAklZWR4LCVlZGkKKwlsZWFsCTcxODc4NzI1OSglZWN4LCVlYnAsMSksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAkzNiglZXNpKSwlZWJwCisJYWRkbAklZWRpLCVlY3gKKwltb3ZsCSQtMSwlZWRpCisJcm9sbAkkMTUsJWVjeAorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwkjIFIzIDYzIAorCW9ybAklZWN4LCVlZGkKKwlsZWFsCTM5NTE0ODE3NDUoJWVieCwlZWJwLDEpLCVlYngKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJMjQoJWVzcCksJWVicAorCWFkZGwJJWVkaSwlZWJ4CisJYWRkbAkkNjQsJWVzaQorCXJvbGwJJDIxLCVlYngKKwltb3ZsCSglZWJwKSwlZWRpCisJYWRkbAklZWN4LCVlYngKKwlhZGRsCSVlZGksJWVheAorCW1vdmwJNCglZWJwKSwlZWRpCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTgoJWVicCksJWVkaQorCWFkZGwJJWVkaSwlZWN4CisJbW92bAkxMiglZWJwKSwlZWRpCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVlYXgsKCVlYnApCisJbW92bAklZWJ4LDQoJWVicCkKKwltb3ZsCSglZXNwKSwlZWRpCisJbW92bAklZWN4LDgoJWVicCkKKwltb3ZsCSVlZHgsMTIoJWVicCkKKwljbXBsCSVlc2ksJWVkaQorCWphZQlMMDAwc3RhcnQKKwlwb3BsCSVlYXgKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlyZXQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTEtNTg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS01ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmI2ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTEtNTg2LlMKQEAgLTAsMCArMSwzNzk5IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisuZ2xvYmwJX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorLnByaXZhdGVfZXh0ZXJuCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy5hbGlnbgk0Citfc2hhMV9ibG9ja19kYXRhX29yZGVyOgorTF9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCWNhbGwJTDAwMHBpY19wb2ludAorTDAwMHBpY19wb2ludDoKKwlwb3BsCSVlYnAKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUwwMDBwaWNfcG9pbnQoJWVicCksJWVzaQorCWxlYWwJTEtfWFhfWFgtTDAwMHBpY19wb2ludCglZWJwKSwlZWJwCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWR4CisJdGVzdGwJJDUxMiwlZWR4CisJanoJTDAwMXg4NgorCW1vdmwJOCglZXNpKSwlZWN4CisJdGVzdGwJJDE2Nzc3MjE2LCVlYXgKKwlqeglMMDAxeDg2CisJYW5kbAkkMjY4NDM1NDU2LCVlZHgKKwlhbmRsCSQxMDczNzQxODI0LCVlYXgKKwlvcmwJJWVkeCwlZWF4CisJY21wbAkkMTM0MjE3NzI4MCwlZWF4CisJamUJTGF2eF9zaG9ydGN1dAorCWptcAlMc3NzZTNfc2hvcnRjdXQKKy5hbGlnbgk0LDB4OTAKK0wwMDF4ODY6CisJbW92bAkyMCglZXNwKSwlZWJwCisJbW92bAkyNCglZXNwKSwlZXNpCisJbW92bAkyOCglZXNwKSwlZWF4CisJc3VibAkkNzYsJWVzcAorCXNobGwJJDYsJWVheAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAklZWF4LDEwNCglZXNwKQorCW1vdmwJMTYoJWVicCksJWVkaQorCWptcAlMMDAybG9vcAorLmFsaWduCTQsMHg5MAorTDAwMmxvb3A6CisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJbW92bAklZWF4LCglZXNwKQorCW1vdmwJJWVieCw0KCVlc3ApCisJbW92bAklZWN4LDgoJWVzcCkKKwltb3ZsCSVlZHgsMTIoJWVzcCkKKwltb3ZsCTE2KCVlc2kpLCVlYXgKKwltb3ZsCTIwKCVlc2kpLCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJbW92bAklZWF4LDE2KCVlc3ApCisJbW92bAklZWJ4LDIwKCVlc3ApCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZWR4LDI4KCVlc3ApCisJbW92bAkzMiglZXNpKSwlZWF4CisJbW92bAkzNiglZXNpKSwlZWJ4CisJbW92bAk0MCglZXNpKSwlZWN4CisJbW92bAk0NCglZXNpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCW1vdmwJJWVheCwzMiglZXNwKQorCW1vdmwJJWVieCwzNiglZXNwKQorCW1vdmwJJWVjeCw0MCglZXNwKQorCW1vdmwJJWVkeCw0NCglZXNwKQorCW1vdmwJNDgoJWVzaSksJWVheAorCW1vdmwJNTIoJWVzaSksJWVieAorCW1vdmwJNTYoJWVzaSksJWVjeAorCW1vdmwJNjAoJWVzaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwltb3ZsCSVlYXgsNDgoJWVzcCkKKwltb3ZsCSVlYngsNTIoJWVzcCkKKwltb3ZsCSVlY3gsNTYoJWVzcCkKKwltb3ZsCSVlZHgsNjAoJWVzcCkKKwltb3ZsCSVlc2ksMTAwKCVlc3ApCisJbW92bAkoJWVicCksJWVheAorCW1vdmwJNCglZWJwKSwlZWJ4CisJbW92bAk4KCVlYnApLCVlY3gKKwltb3ZsCTEyKCVlYnApLCVlZHgKKwkjIDAwXzE1IDAgCisJbW92bAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVkeCwlZXNpCisJYWRkbAklZWRpLCVlYnAKKwltb3ZsCSglZXNwKSwlZWRpCisJYW5kbAklZWJ4LCVlc2kKKwlyb3JsCSQyLCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCWxlYWwJMTUxODUwMDI0OSglZWJwLCVlZGksMSksJWVicAorCWFkZGwJJWVzaSwlZWJwCisJIyAwMF8xNSAxIAorCW1vdmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJWVkeCwlZWJwCisJbW92bAk0KCVlc3ApLCVlZHgKKwlhbmRsCSVlYXgsJWVkaQorCXJvcmwJJDIsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVkeCwxKSwlZWJwCisJYWRkbAklZWRpLCVlYnAKKwkjIDAwXzE1IDIgCisJbW92bAklZWF4LCVlZHgKKwltb3ZsCSVlYnAsJWVkaQorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVieCwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTgoJWVzcCksJWVjeAorCWFuZGwJJWVzaSwlZWR4CisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlZHgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWN4LDEpLCVlYnAKKwlhZGRsCSVlZHgsJWVicAorCSMgMDBfMTUgMyAKKwltb3ZsCSVlc2ksJWVjeAorCW1vdmwJJWVicCwlZWR4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWF4LCVlY3gKKwlhZGRsCSVlYngsJWVicAorCW1vdmwJMTIoJWVzcCksJWVieAorCWFuZGwJJWVkaSwlZWN4CisJcm9ybAkkMiwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWJ4LDEpLCVlYnAKKwlhZGRsCSVlY3gsJWVicAorCSMgMDBfMTUgNCAKKwltb3ZsCSVlZGksJWVieAorCW1vdmwJJWVicCwlZWN4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZXNpLCVlYngKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJMTYoJWVzcCksJWVheAorCWFuZGwJJWVkeCwlZWJ4CisJcm9ybAkkMiwlZWR4CisJeG9ybAklZXNpLCVlYngKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWF4LDEpLCVlYnAKKwlhZGRsCSVlYngsJWVicAorCSMgMDBfMTUgNSAKKwltb3ZsCSVlZHgsJWVheAorCW1vdmwJJWVicCwlZWJ4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCW1vdmwJMjAoJWVzcCksJWVzaQorCWFuZGwJJWVjeCwlZWF4CisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZXNpLDEpLCVlYnAKKwlhZGRsCSVlYXgsJWVicAorCSMgMDBfMTUgNiAKKwltb3ZsCSVlY3gsJWVzaQorCW1vdmwJJWVicCwlZWF4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWR4LCVlc2kKKwlhZGRsCSVlZGksJWVicAorCW1vdmwJMjQoJWVzcCksJWVkaQorCWFuZGwJJWVieCwlZXNpCisJcm9ybAkkMiwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWRpLDEpLCVlYnAKKwlhZGRsCSVlc2ksJWVicAorCSMgMDBfMTUgNyAKKwltb3ZsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVlZHgsJWVicAorCW1vdmwJMjgoJWVzcCksJWVkeAorCWFuZGwJJWVheCwlZWRpCisJcm9ybAkkMiwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWR4LDEpLCVlYnAKKwlhZGRsCSVlZGksJWVicAorCSMgMDBfMTUgOCAKKwltb3ZsCSVlYXgsJWVkeAorCW1vdmwJJWVicCwlZWRpCisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWJ4LCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJMzIoJWVzcCksJWVjeAorCWFuZGwJJWVzaSwlZWR4CisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlZHgKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWN4LDEpLCVlYnAKKwlhZGRsCSVlZHgsJWVicAorCSMgMDBfMTUgOSAKKwltb3ZsCSVlc2ksJWVjeAorCW1vdmwJJWVicCwlZWR4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWF4LCVlY3gKKwlhZGRsCSVlYngsJWVicAorCW1vdmwJMzYoJWVzcCksJWVieAorCWFuZGwJJWVkaSwlZWN4CisJcm9ybAkkMiwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWJ4LDEpLCVlYnAKKwlhZGRsCSVlY3gsJWVicAorCSMgMDBfMTUgMTAgCisJbW92bAklZWRpLCVlYngKKwltb3ZsCSVlYnAsJWVjeAorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVzaSwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCTQwKCVlc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVieAorCXJvcmwJJDIsJWVkeAorCXhvcmwJJWVzaSwlZWJ4CisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVheCwxKSwlZWJwCisJYWRkbAklZWJ4LCVlYnAKKwkjIDAwXzE1IDExIAorCW1vdmwJJWVkeCwlZWF4CisJbW92bAklZWJwLCVlYngKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJJWVzaSwlZWJwCisJbW92bAk0NCglZXNwKSwlZXNpCisJYW5kbAklZWN4LCVlYXgKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWxlYWwJMTUxODUwMDI0OSglZWJwLCVlc2ksMSksJWVicAorCWFkZGwJJWVheCwlZWJwCisJIyAwMF8xNSAxMiAKKwltb3ZsCSVlY3gsJWVzaQorCW1vdmwJJWVicCwlZWF4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWR4LCVlc2kKKwlhZGRsCSVlZGksJWVicAorCW1vdmwJNDgoJWVzcCksJWVkaQorCWFuZGwJJWVieCwlZXNpCisJcm9ybAkkMiwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWRpLDEpLCVlYnAKKwlhZGRsCSVlc2ksJWVicAorCSMgMDBfMTUgMTMgCisJbW92bAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXJvbGwJJDUsJWVicAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklZWR4LCVlYnAKKwltb3ZsCTUyKCVlc3ApLCVlZHgKKwlhbmRsCSVlYXgsJWVkaQorCXJvcmwJJDIsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJbGVhbAkxNTE4NTAwMjQ5KCVlYnAsJWVkeCwxKSwlZWJwCisJYWRkbAklZWRpLCVlYnAKKwkjIDAwXzE1IDE0IAorCW1vdmwJJWVheCwlZWR4CisJbW92bAklZWJwLCVlZGkKKwlyb2xsCSQ1LCVlYnAKKwl4b3JsCSVlYngsJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk1NiglZXNwKSwlZWN4CisJYW5kbAklZXNpLCVlZHgKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVkeAorCWxlYWwJMTUxODUwMDI0OSglZWJwLCVlY3gsMSksJWVicAorCWFkZGwJJWVkeCwlZWJwCisJIyAwMF8xNSAxNSAKKwltb3ZsCSVlc2ksJWVjeAorCW1vdmwJJWVicCwlZWR4CisJcm9sbAkkNSwlZWJwCisJeG9ybAklZWF4LCVlY3gKKwlhZGRsCSVlYngsJWVicAorCW1vdmwJNjAoJWVzcCksJWVieAorCWFuZGwJJWVkaSwlZWN4CisJcm9ybAkkMiwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwlsZWFsCTE1MTg1MDAyNDkoJWVicCwlZWJ4LDEpLCVlYnAKKwltb3ZsCSglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKwkjIDE2XzE5IDE2IAorCW1vdmwJJWVkaSwlZWJwCisJeG9ybAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJMzIoJWVzcCksJWVieAorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAk1MiglZXNwKSwlZWJ4CisJcm9sbAkkMSwlZWJ4CisJeG9ybAklZXNpLCVlYnAKKwlhZGRsCSVlYnAsJWVheAorCW1vdmwJJWVjeCwlZWJwCisJcm9ybAkkMiwlZWR4CisJbW92bAklZWJ4LCglZXNwKQorCXJvbGwJJDUsJWVicAorCWxlYWwJMTUxODUwMDI0OSglZWJ4LCVlYXgsMSksJWVieAorCW1vdmwJNCglZXNwKSwlZWF4CisJYWRkbAklZWJwLCVlYngKKwkjIDE2XzE5IDE3IAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJNTYoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCXhvcmwJJWVkaSwlZWJwCisJYWRkbAklZWJwLCVlc2kKKwltb3ZsCSVlYngsJWVicAorCXJvcmwJJDIsJWVjeAorCW1vdmwJJWVheCw0KCVlc3ApCisJcm9sbAkkNSwlZWJwCisJbGVhbAkxNTE4NTAwMjQ5KCVlYXgsJWVzaSwxKSwlZWF4CisJbW92bAk4KCVlc3ApLCVlc2kKKwlhZGRsCSVlYnAsJWVheAorCSMgMTZfMTkgMTggCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJNDAoJWVzcCksJWVzaQorCWFuZGwJJWVieCwlZWJwCisJeG9ybAk2MCglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwlhZGRsCSVlYnAsJWVkaQorCW1vdmwJJWVheCwlZWJwCisJcm9ybAkkMiwlZWJ4CisJbW92bAklZXNpLDgoJWVzcCkKKwlyb2xsCSQ1LCVlYnAKKwlsZWFsCTE1MTg1MDAyNDkoJWVzaSwlZWRpLDEpLCVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwlhZGRsCSVlYnAsJWVzaQorCSMgMTZfMTkgMTkgCisJbW92bAklZWJ4LCVlYnAKKwl4b3JsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJNDQoJWVzcCksJWVkaQorCWFuZGwJJWVheCwlZWJwCisJeG9ybAkoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJYWRkbAklZWJwLCVlZHgKKwltb3ZsCSVlc2ksJWVicAorCXJvcmwJJDIsJWVheAorCW1vdmwJJWVkaSwxMiglZXNwKQorCXJvbGwJJDUsJWVicAorCWxlYWwJMTUxODUwMDI0OSglZWRpLCVlZHgsMSksJWVkaQorCW1vdmwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVicCwlZWRpCisJIyAyMF8zOSAyMCAKKwltb3ZsCSVlc2ksJWVicAorCXhvcmwJMjQoJWVzcCksJWVkeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTQoJWVzcCksJWVkeAorCXJvbGwJJDEsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJcm9ybAkkMiwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlZHgsMTYoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVkeCwlZWN4LDEpLCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlY3gKKwlhZGRsCSVlYnAsJWVkeAorCSMgMjBfMzkgMjEgCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlY3gKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk4KCVlc3ApLCVlY3gKKwlyb2xsCSQxLCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXJvcmwJJDIsJWVkaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWN4LDIwKCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlY3gsJWVieCwxKSwlZWN4CisJbW92bAkyNCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKwkjIDIwXzM5IDIyIAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAkzMiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJMTIoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYngsMjQoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVieCwlZWF4LDEpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwlhZGRsCSVlYnAsJWVieAorCSMgMjBfMzkgMjMgCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJNjAoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAkxNiglZXNwKSwlZWF4CisJcm9sbAkkMSwlZWF4CisJYWRkbAklZWJwLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYngsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVheCwyOCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWF4LCVlc2ksMSksJWVheAorCW1vdmwJMzIoJWVzcCksJWVzaQorCWFkZGwJJWVicCwlZWF4CisJIyAyMF8zOSAyNCAKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJNDAoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAkoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJYWRkbAklZWJwLCVlZGkKKwlyb3JsCSQyLCVlYngKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVzaSwzMiglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZXNpLCVlZGksMSksJWVzaQorCW1vdmwJMzYoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisJIyAyMF8zOSAyNSAKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJNDQoJWVzcCksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJMjQoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlZGksMzYoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVkaSwlZWR4LDEpLCVlZGkKKwltb3ZsCTQwKCVlc3ApLCVlZHgKKwlhZGRsCSVlYnAsJWVkaQorCSMgMjBfMzkgMjYgCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTQ4KCVlc3ApLCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJOCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWR4LDQwKCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlZHgsJWVjeCwxKSwlZWR4CisJbW92bAk0NCglZXNwKSwlZWN4CisJYWRkbAklZWJwLCVlZHgKKwkjIDIwXzM5IDI3IAorCW1vdmwJJWVkaSwlZWJwCisJeG9ybAk1MiglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJMzIoJWVzcCksJWVjeAorCXJvbGwJJDEsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJcm9ybAkkMiwlZWRpCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlY3gsNDQoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVjeCwlZWJ4LDEpLCVlY3gKKwltb3ZsCTQ4KCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVjeAorCSMgMjBfMzkgMjggCisJbW92bAklZWR4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJMTYoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWJ4CisJcm9sbAkkMSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwlyb3JsCSQyLCVlZHgKKwltb3ZsCSVlY3gsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVieCw0OCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWJ4LCVlYXgsMSksJWVieAorCW1vdmwJNTIoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisJIyAyMF8zOSAyOSAKKwltb3ZsCSVlY3gsJWVicAorCXhvcmwJNjAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlYXgKKwlyb2xsCSQxLCVlYXgKKwlhZGRsCSVlYnAsJWVzaQorCXJvcmwJJDIsJWVjeAorCW1vdmwJJWVieCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWF4LDUyKCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlYXgsJWVzaSwxKSwlZWF4CisJbW92bAk1NiglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKwkjIDIwXzM5IDMwIAorCW1vdmwJJWVieCwlZWJwCisJeG9ybAkoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlc2kKKwlyb2xsCSQxLCVlc2kKKwlhZGRsCSVlYnAsJWVkaQorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZXNpLDU2KCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlc2ksJWVkaSwxKSwlZXNpCisJbW92bAk2MCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlc2kKKwkjIDIwXzM5IDMxIAorCW1vdmwJJWVheCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWRpCisJcm9sbAkkMSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwlyb3JsCSQyLCVlYXgKKwltb3ZsCSVlc2ksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkaSw2MCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWRpLCVlZHgsMSksJWVkaQorCW1vdmwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlYnAsJWVkaQorCSMgMjBfMzkgMzIgCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTgoJWVzcCksJWVkeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAkzMiglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTUyKCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWR4LCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWR4LCVlY3gsMSksJWVkeAorCW1vdmwJNCglZXNwKSwlZWN4CisJYWRkbAklZWJwLCVlZHgKKwkjIDIwXzM5IDMzIAorCW1vdmwJJWVkaSwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJNTYoJWVzcCksJWVjeAorCXJvbGwJJDEsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJcm9ybAkkMiwlZWRpCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlY3gsNCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWN4LCVlYngsMSksJWVjeAorCW1vdmwJOCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKwkjIDIwXzM5IDM0IAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJNjAoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYngsOCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWJ4LCVlYXgsMSksJWVieAorCW1vdmwJMTIoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisJIyAyMF8zOSAzNSAKKwltb3ZsCSVlY3gsJWVicAorCXhvcmwJMjAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAk0NCglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCSglZXNwKSwlZWF4CisJcm9sbAkkMSwlZWF4CisJYWRkbAklZWJwLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYngsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVheCwxMiglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWF4LCVlc2ksMSksJWVheAorCW1vdmwJMTYoJWVzcCksJWVzaQorCWFkZGwJJWVicCwlZWF4CisJIyAyMF8zOSAzNiAKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTQoJWVzcCksJWVzaQorCXJvbGwJJDEsJWVzaQorCWFkZGwJJWVicCwlZWRpCisJcm9ybAkkMiwlZWJ4CisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlc2ksMTYoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVzaSwlZWRpLDEpLCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlhZGRsCSVlYnAsJWVzaQorCSMgMjBfMzkgMzcgCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJNTIoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAk4KCVlc3ApLCVlZGkKKwlyb2xsCSQxLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXJvcmwJJDIsJWVheAorCW1vdmwJJWVzaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWRpLDIwKCVlc3ApCisJbGVhbAkxODU5Nzc1MzkzKCVlZGksJWVkeCwxKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZWR4CisJYWRkbAklZWJwLCVlZGkKKwkjIDIwXzM5IDM4IAorCW1vdmwJJWVzaSwlZWJwCisJeG9ybAkzMiglZXNwKSwlZWR4CisJeG9ybAklZWF4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJMTIoJWVzcCksJWVkeAorCXJvbGwJJDEsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJcm9ybAkkMiwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlZHgsMjQoJWVzcCkKKwlsZWFsCTE4NTk3NzUzOTMoJWVkeCwlZWN4LDEpLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlY3gKKwlhZGRsCSVlYnAsJWVkeAorCSMgMjBfMzkgMzkgCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlY3gKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJNjAoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAkxNiglZXNwKSwlZWN4CisJcm9sbAkkMSwlZWN4CisJYWRkbAklZWJwLCVlYngKKwlyb3JsCSQyLCVlZGkKKwltb3ZsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVjeCwyOCglZXNwKQorCWxlYWwJMTg1OTc3NTM5MyglZWN4LCVlYngsMSksJWVjeAorCW1vdmwJMzIoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWN4CisJIyA0MF81OSA0MCAKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJNDAoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAkoJWVzcCksJWVieAorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZWJ4CisJcm9sbAkkMSwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlyb3JsCSQyLCVlZHgKKwltb3ZsCSVlY3gsJWVheAorCXJvbGwJJDUsJWVheAorCW1vdmwJJWVieCwzMiglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWJ4LCVlYnAsMSksJWVieAorCW1vdmwJJWVkaSwlZWJwCisJYWRkbAklZWF4LCVlYngKKwlhbmRsCSVlc2ksJWVicAorCW1vdmwJMzYoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisJIyA0MF81OSA0MSAKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJNDQoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAk0KCVlc3ApLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJMjQoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlc2kKKwltb3ZsCSVlYXgsMzYoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVheCwlZWJwLDEpLCVlYXgKKwltb3ZsCSVlZHgsJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYW5kbAklZWRpLCVlYnAKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwlhZGRsCSVlYnAsJWVheAorCSMgNDBfNTkgNDIgCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTQ4KCVlc3ApLCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJOCglZXNwKSwlZXNpCisJYW5kbAklZWJ4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlc2kKKwlyb2xsCSQxLCVlc2kKKwlhZGRsCSVlZGksJWVicAorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWRpCisJbW92bAklZXNpLDQwKCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlc2ksJWVicCwxKSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlhZGRsCSVlZGksJWVzaQorCWFuZGwJJWVkeCwlZWJwCisJbW92bAk0NCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlc2kKKwkjIDQwXzU5IDQzIAorCW1vdmwJJWVieCwlZWJwCisJeG9ybAk1MiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlZGkKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJMzIoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVkeCwlZWJwCisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlZHgKKwlyb2xsCSQ1LCVlZHgKKwltb3ZsCSVlZGksNDQoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVkaSwlZWJwLDEpLCVlZGkKKwltb3ZsCSVlYngsJWVicAorCWFkZGwJJWVkeCwlZWRpCisJYW5kbAklZWN4LCVlYnAKKwltb3ZsCTQ4KCVlc3ApLCVlZHgKKwlhZGRsCSVlYnAsJWVkaQorCSMgNDBfNTkgNDQgCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJMTYoJWVzcCksJWVkeAorCWFuZGwJJWVzaSwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWR4CisJcm9sbAkkMSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwlyb3JsCSQyLCVlc2kKKwltb3ZsCSVlZGksJWVjeAorCXJvbGwJJDUsJWVjeAorCW1vdmwJJWVkeCw0OCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWR4LCVlYnAsMSksJWVkeAorCW1vdmwJJWVheCwlZWJwCisJYWRkbAklZWN4LCVlZHgKKwlhbmRsCSVlYngsJWVicAorCW1vdmwJNTIoJWVzcCksJWVjeAorCWFkZGwJJWVicCwlZWR4CisJIyA0MF81OSA0NSAKKwltb3ZsCSVlc2ksJWVicAorCXhvcmwJNjAoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZWN4CisJYW5kbAklZWRpLCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlY3gKKwlyb2xsCSQxLCVlY3gKKwlhZGRsCSVlYngsJWVicAorCXJvcmwJJDIsJWVkaQorCW1vdmwJJWVkeCwlZWJ4CisJcm9sbAkkNSwlZWJ4CisJbW92bAklZWN4LDUyKCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlY3gsJWVicCwxKSwlZWN4CisJbW92bAklZXNpLCVlYnAKKwlhZGRsCSVlYngsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbW92bAk1NiglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKwkjIDQwXzU5IDQ2IAorCW1vdmwJJWVkaSwlZWJwCisJeG9ybAkoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAkyNCglZXNwKSwlZWJ4CisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlYngKKwlyb2xsCSQxLCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJcm9sbAkkNSwlZWF4CisJbW92bAklZWJ4LDU2KCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlYngsJWVicCwxKSwlZWJ4CisJbW92bAklZWRpLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFuZGwJJWVzaSwlZWJwCisJbW92bAk2MCglZXNwKSwlZWF4CisJYWRkbAklZWJwLCVlYngKKwkjIDQwXzU5IDQ3IAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJMjgoJWVzcCksJWVheAorCWFuZGwJJWVjeCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWF4CisJcm9sbAkkMSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVzaQorCW1vdmwJJWVheCw2MCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWF4LCVlYnAsMSksJWVheAorCW1vdmwJJWVkeCwlZWJwCisJYWRkbAklZXNpLCVlYXgKKwlhbmRsCSVlZGksJWVicAorCW1vdmwJKCVlc3ApLCVlc2kKKwlhZGRsCSVlYnAsJWVheAorCSMgNDBfNTkgNDggCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTgoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAkzMiglZXNwKSwlZXNpCisJYW5kbAklZWJ4LCVlYnAKKwl4b3JsCTUyKCVlc3ApLCVlc2kKKwlyb2xsCSQxLCVlc2kKKwlhZGRsCSVlZGksJWVicAorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWRpCisJbW92bAklZXNpLCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZXNpLCVlYnAsMSksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJYWRkbAklZWRpLCVlc2kKKwlhbmRsCSVlZHgsJWVicAorCW1vdmwJNCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlc2kKKwkjIDQwXzU5IDQ5IAorCW1vdmwJJWVieCwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlZGkKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJNTYoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVkeCwlZWJwCisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlZHgKKwlyb2xsCSQ1LCVlZHgKKwltb3ZsCSVlZGksNCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWRpLCVlYnAsMSksJWVkaQorCW1vdmwJJWVieCwlZWJwCisJYWRkbAklZWR4LCVlZGkKKwlhbmRsCSVlY3gsJWVicAorCW1vdmwJOCglZXNwKSwlZWR4CisJYWRkbAklZWJwLCVlZGkKKwkjIDQwXzU5IDUwIAorCW1vdmwJJWVheCwlZWJwCisJeG9ybAkxNiglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlZHgKKwlhbmRsCSVlc2ksJWVicAorCXhvcmwJNjAoJWVzcCksJWVkeAorCXJvbGwJJDEsJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJcm9ybAkkMiwlZXNpCisJbW92bAklZWRpLCVlY3gKKwlyb2xsCSQ1LCVlY3gKKwltb3ZsCSVlZHgsOCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWR4LCVlYnAsMSksJWVkeAorCW1vdmwJJWVheCwlZWJwCisJYWRkbAklZWN4LCVlZHgKKwlhbmRsCSVlYngsJWVicAorCW1vdmwJMTIoJWVzcCksJWVjeAorCWFkZGwJJWVicCwlZWR4CisJIyA0MF81OSA1MSAKKwltb3ZsCSVlc2ksJWVicAorCXhvcmwJMjAoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk0NCglZXNwKSwlZWN4CisJYW5kbAklZWRpLCVlYnAKKwl4b3JsCSglZXNwKSwlZWN4CisJcm9sbAkkMSwlZWN4CisJYWRkbAklZWJ4LCVlYnAKKwlyb3JsCSQyLCVlZGkKKwltb3ZsCSVlZHgsJWVieAorCXJvbGwJJDUsJWVieAorCW1vdmwJJWVjeCwxMiglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWN4LCVlYnAsMSksJWVjeAorCW1vdmwJJWVzaSwlZWJwCisJYWRkbAklZWJ4LCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCW1vdmwJMTYoJWVzcCksJWVieAorCWFkZGwJJWVicCwlZWN4CisJIyA0MF81OSA1MiAKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWJ4CisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCTQoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCWFkZGwJJWVheCwlZWJwCisJcm9ybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYXgKKwlyb2xsCSQ1LCVlYXgKKwltb3ZsCSVlYngsMTYoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVieCwlZWJwLDEpLCVlYngKKwltb3ZsCSVlZGksJWVicAorCWFkZGwJJWVheCwlZWJ4CisJYW5kbAklZXNpLCVlYnAKKwltb3ZsCTIwKCVlc3ApLCVlYXgKKwlhZGRsCSVlYnAsJWVieAorCSMgNDBfNTkgNTMgCisJbW92bAklZWR4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJNTIoJWVzcCksJWVheAorCWFuZGwJJWVjeCwlZWJwCisJeG9ybAk4KCVlc3ApLCVlYXgKKwlyb2xsCSQxLCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXJvcmwJJDIsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZXNpCisJbW92bAklZWF4LDIwKCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlYXgsJWVicCwxKSwlZWF4CisJbW92bAklZWR4LCVlYnAKKwlhZGRsCSVlc2ksJWVheAorCWFuZGwJJWVkaSwlZWJwCisJbW92bAkyNCglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKwkjIDQwXzU5IDU0IAorCW1vdmwJJWVjeCwlZWJwCisJeG9ybAkzMiglZXNwKSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlc2kKKwlhbmRsCSVlYngsJWVicAorCXhvcmwJMTIoJWVzcCksJWVzaQorCXJvbGwJJDEsJWVzaQorCWFkZGwJJWVkaSwlZWJwCisJcm9ybAkkMiwlZWJ4CisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQ1LCVlZGkKKwltb3ZsCSVlc2ksMjQoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVzaSwlZWJwLDEpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCWFkZGwJJWVkaSwlZXNpCisJYW5kbAklZWR4LCVlYnAKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwlhZGRsCSVlYnAsJWVzaQorCSMgNDBfNTkgNTUgCisJbW92bAklZWJ4LCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJNjAoJWVzcCksJWVkaQorCWFuZGwJJWVheCwlZWJwCisJeG9ybAkxNiglZXNwKSwlZWRpCisJcm9sbAkkMSwlZWRpCisJYWRkbAklZWR4LCVlYnAKKwlyb3JsCSQyLCVlYXgKKwltb3ZsCSVlc2ksJWVkeAorCXJvbGwJJDUsJWVkeAorCW1vdmwJJWVkaSwyOCglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWRpLCVlYnAsMSksJWVkaQorCW1vdmwJJWVieCwlZWJwCisJYWRkbAklZWR4LCVlZGkKKwlhbmRsCSVlY3gsJWVicAorCW1vdmwJMzIoJWVzcCksJWVkeAorCWFkZGwJJWVicCwlZWRpCisJIyA0MF81OSA1NiAKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJNDAoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJeG9ybAkoJWVzcCksJWVkeAorCWFuZGwJJWVzaSwlZWJwCisJeG9ybAkyMCglZXNwKSwlZWR4CisJcm9sbAkkMSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwlyb3JsCSQyLCVlc2kKKwltb3ZsCSVlZGksJWVjeAorCXJvbGwJJDUsJWVjeAorCW1vdmwJJWVkeCwzMiglZXNwKQorCWxlYWwJMjQwMDk1OTcwOCglZWR4LCVlYnAsMSksJWVkeAorCW1vdmwJJWVheCwlZWJwCisJYWRkbAklZWN4LCVlZHgKKwlhbmRsCSVlYngsJWVicAorCW1vdmwJMzYoJWVzcCksJWVjeAorCWFkZGwJJWVicCwlZWR4CisJIyA0MF81OSA1NyAKKwltb3ZsCSVlc2ksJWVicAorCXhvcmwJNDQoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlY3gKKwlhbmRsCSVlZGksJWVicAorCXhvcmwJMjQoJWVzcCksJWVjeAorCXJvbGwJJDEsJWVjeAorCWFkZGwJJWVieCwlZWJwCisJcm9ybAkkMiwlZWRpCisJbW92bAklZWR4LCVlYngKKwlyb2xsCSQ1LCVlYngKKwltb3ZsCSVlY3gsMzYoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVjeCwlZWJwLDEpLCVlY3gKKwltb3ZsCSVlc2ksJWVicAorCWFkZGwJJWVieCwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwltb3ZsCTQwKCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVjeAorCSMgNDBfNTkgNTggCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCTQ4KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJOCglZXNwKSwlZWJ4CisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlYngKKwlyb2xsCSQxLCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJcm9sbAkkNSwlZWF4CisJbW92bAklZWJ4LDQwKCVlc3ApCisJbGVhbAkyNDAwOTU5NzA4KCVlYngsJWVicCwxKSwlZWJ4CisJbW92bAklZWRpLCVlYnAKKwlhZGRsCSVlYXgsJWVieAorCWFuZGwJJWVzaSwlZWJwCisJbW92bAk0NCglZXNwKSwlZWF4CisJYWRkbAklZWJwLCVlYngKKwkjIDQwXzU5IDU5IAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAk1MiglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJMzIoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlc2kKKwltb3ZsCSVlYXgsNDQoJWVzcCkKKwlsZWFsCTI0MDA5NTk3MDgoJWVheCwlZWJwLDEpLCVlYXgKKwltb3ZsCSVlZHgsJWVicAorCWFkZGwJJWVzaSwlZWF4CisJYW5kbAklZWRpLCVlYnAKKwltb3ZsCTQ4KCVlc3ApLCVlc2kKKwlhZGRsCSVlYnAsJWVheAorCSMgMjBfMzkgNjAgCisJbW92bAklZWJ4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJMTYoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAkzNiglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJYWRkbAklZWJwLCVlZGkKKwlyb3JsCSQyLCVlYngKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVzaSw0OCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZXNpLCVlZGksMSksJWVzaQorCW1vdmwJNTIoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisJIyAyMF8zOSA2MSAKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJNjAoJWVzcCksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlZGkKKwlyb2xsCSQxLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXJvcmwJJDIsJWVheAorCW1vdmwJJWVzaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWRpLDUyKCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlZGksJWVkeCwxKSwlZWRpCisJbW92bAk1NiglZXNwKSwlZWR4CisJYWRkbAklZWJwLCVlZGkKKwkjIDIwXzM5IDYyIAorCW1vdmwJJWVzaSwlZWJwCisJeG9ybAkoJWVzcCksJWVkeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAkyNCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWR4LDU2KCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlZHgsJWVjeCwxKSwlZWR4CisJbW92bAk2MCglZXNwKSwlZWN4CisJYWRkbAklZWJwLCVlZHgKKwkjIDIwXzM5IDYzIAorCW1vdmwJJWVkaSwlZWJwCisJeG9ybAk0KCVlc3ApLCVlY3gKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJMjgoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWN4CisJcm9sbAkkMSwlZWN4CisJYWRkbAklZWJwLCVlYngKKwlyb3JsCSQyLCVlZGkKKwltb3ZsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVjeCw2MCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWN4LCVlYngsMSksJWVjeAorCW1vdmwJKCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVjeAorCSMgMjBfMzkgNjQgCisJbW92bAklZWR4LCVlYnAKKwl4b3JsCTgoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAkzMiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTUyKCVlc3ApLCVlYngKKwlyb2xsCSQxLCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXJvcmwJJDIsJWVkeAorCW1vdmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWJ4LCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWJ4LCVlYXgsMSksJWVieAorCW1vdmwJNCglZXNwKSwlZWF4CisJYWRkbAklZWJwLCVlYngKKwkjIDIwXzM5IDY1IAorCW1vdmwJJWVjeCwlZWJwCisJeG9ybAkxMiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlYXgKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJNTYoJWVzcCksJWVheAorCXJvbGwJJDEsJWVheAorCWFkZGwJJWVicCwlZXNpCisJcm9ybAkkMiwlZWN4CisJbW92bAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYXgsNCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWF4LCVlc2ksMSksJWVheAorCW1vdmwJOCglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKwkjIDIwXzM5IDY2IAorCW1vdmwJJWVieCwlZWJwCisJeG9ybAkxNiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJNjAoJWVzcCksJWVzaQorCXJvbGwJJDEsJWVzaQorCWFkZGwJJWVicCwlZWRpCisJcm9ybAkkMiwlZWJ4CisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlc2ksOCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZXNpLCVlZGksMSksJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisJIyAyMF8zOSA2NyAKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk0NCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl4b3JsCSglZXNwKSwlZWRpCisJcm9sbAkkMSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwlyb3JsCSQyLCVlYXgKKwltb3ZsCSVlc2ksJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVkaSwxMiglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWRpLCVlZHgsMSksJWVkaQorCW1vdmwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVicCwlZWRpCisJIyAyMF8zOSA2OCAKKwltb3ZsCSVlc2ksJWVicAorCXhvcmwJMjQoJWVzcCksJWVkeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTQoJWVzcCksJWVkeAorCXJvbGwJJDEsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJcm9ybAkkMiwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlZHgsMTYoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVkeCwlZWN4LDEpLCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlY3gKKwlhZGRsCSVlYnAsJWVkeAorCSMgMjBfMzkgNjkgCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlY3gKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAk4KCVlc3ApLCVlY3gKKwlyb2xsCSQxLCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXJvcmwJJDIsJWVkaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWN4LDIwKCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlY3gsJWVieCwxKSwlZWN4CisJbW92bAkyNCglZXNwKSwlZWJ4CisJYWRkbAklZWJwLCVlY3gKKwkjIDIwXzM5IDcwIAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAkzMiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVicAorCXhvcmwJMTIoJWVzcCksJWVieAorCXJvbGwJJDEsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlYngsMjQoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVieCwlZWF4LDEpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwlhZGRsCSVlYnAsJWVieAorCSMgMjBfMzkgNzEgCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCTM2KCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJNjAoJWVzcCksJWVheAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAkxNiglZXNwKSwlZWF4CisJcm9sbAkkMSwlZWF4CisJYWRkbAklZWJwLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwltb3ZsCSVlYngsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVheCwyOCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWF4LCVlc2ksMSksJWVheAorCW1vdmwJMzIoJWVzcCksJWVzaQorCWFkZGwJJWVicCwlZWF4CisJIyAyMF8zOSA3MiAKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJNDAoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAkoJWVzcCksJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZXNpCisJcm9sbAkkMSwlZXNpCisJYWRkbAklZWJwLCVlZGkKKwlyb3JsCSQyLCVlYngKKwltb3ZsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVzaSwzMiglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZXNpLCVlZGksMSksJWVzaQorCW1vdmwJMzYoJWVzcCksJWVkaQorCWFkZGwJJWVicCwlZXNpCisJIyAyMF8zOSA3MyAKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJNDQoJWVzcCksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJMjQoJWVzcCksJWVkaQorCXJvbGwJJDEsJWVkaQorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkMiwlZWF4CisJbW92bAklZXNpLCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlZGksMzYoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVkaSwlZWR4LDEpLCVlZGkKKwltb3ZsCTQwKCVlc3ApLCVlZHgKKwlhZGRsCSVlYnAsJWVkaQorCSMgMjBfMzkgNzQgCisJbW92bAklZXNpLCVlYnAKKwl4b3JsCTQ4KCVlc3ApLCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJOCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl4b3JsCTI4KCVlc3ApLCVlZHgKKwlyb2xsCSQxLCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXJvcmwJJDIsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWJwCisJbW92bAklZWR4LDQwKCVlc3ApCisJbGVhbAkzMzk1NDY5NzgyKCVlZHgsJWVjeCwxKSwlZWR4CisJbW92bAk0NCglZXNwKSwlZWN4CisJYWRkbAklZWJwLCVlZHgKKwkjIDIwXzM5IDc1IAorCW1vdmwJJWVkaSwlZWJwCisJeG9ybAk1MiglZXNwKSwlZWN4CisJeG9ybAklZXNpLCVlYnAKKwl4b3JsCTEyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJMzIoJWVzcCksJWVjeAorCXJvbGwJJDEsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJcm9ybAkkMiwlZWRpCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlYnAKKwltb3ZsCSVlY3gsNDQoJWVzcCkKKwlsZWFsCTMzOTU0Njk3ODIoJWVjeCwlZWJ4LDEpLCVlY3gKKwltb3ZsCTQ4KCVlc3ApLCVlYngKKwlhZGRsCSVlYnAsJWVjeAorCSMgMjBfMzkgNzYgCisJbW92bAklZWR4LCVlYnAKKwl4b3JsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXhvcmwJMTYoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWJwCisJeG9ybAkzNiglZXNwKSwlZWJ4CisJcm9sbAkkMSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwlyb3JsCSQyLCVlZHgKKwltb3ZsCSVlY3gsJWVicAorCXJvbGwJJDUsJWVicAorCW1vdmwJJWVieCw0OCglZXNwKQorCWxlYWwJMzM5NTQ2OTc4MiglZWJ4LCVlYXgsMSksJWVieAorCW1vdmwJNTIoJWVzcCksJWVheAorCWFkZGwJJWVicCwlZWJ4CisJIyAyMF8zOSA3NyAKKwltb3ZsCSVlY3gsJWVicAorCXhvcmwJNjAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAkyMCglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwl4b3JsCTQwKCVlc3ApLCVlYXgKKwlyb2xsCSQxLCVlYXgKKwlhZGRsCSVlYnAsJWVzaQorCXJvcmwJJDIsJWVjeAorCW1vdmwJJWVieCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbGVhbAkzMzk1NDY5NzgyKCVlYXgsJWVzaSwxKSwlZWF4CisJbW92bAk1NiglZXNwKSwlZXNpCisJYWRkbAklZWJwLCVlYXgKKwkjIDIwXzM5IDc4IAorCW1vdmwJJWVieCwlZWJwCisJeG9ybAkoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCTQ0KCVlc3ApLCVlc2kKKwlyb2xsCSQxLCVlc2kKKwlhZGRsCSVlYnAsJWVkaQorCXJvcmwJJDIsJWVieAorCW1vdmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWJwCisJbGVhbAkzMzk1NDY5NzgyKCVlc2ksJWVkaSwxKSwlZXNpCisJbW92bAk2MCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlc2kKKwkjIDIwXzM5IDc5IAorCW1vdmwJJWVheCwlZWJwCisJeG9ybAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJeG9ybAk0OCglZXNwKSwlZWRpCisJcm9sbAkkMSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwlyb3JsCSQyLCVlYXgKKwltb3ZsCSVlc2ksJWVicAorCXJvbGwJJDUsJWVicAorCWxlYWwJMzM5NTQ2OTc4MiglZWRpLCVlZHgsMSksJWVkaQorCWFkZGwJJWVicCwlZWRpCisJbW92bAk5NiglZXNwKSwlZWJwCisJbW92bAkxMDAoJWVzcCksJWVkeAorCWFkZGwJKCVlYnApLCVlZGkKKwlhZGRsCTQoJWVicCksJWVzaQorCWFkZGwJOCglZWJwKSwlZWF4CisJYWRkbAkxMiglZWJwKSwlZWJ4CisJYWRkbAkxNiglZWJwKSwlZWN4CisJbW92bAklZWRpLCglZWJwKQorCWFkZGwJJDY0LCVlZHgKKwltb3ZsCSVlc2ksNCglZWJwKQorCWNtcGwJMTA0KCVlc3ApLCVlZHgKKwltb3ZsCSVlYXgsOCglZWJwKQorCW1vdmwJJWVjeCwlZWRpCisJbW92bAklZWJ4LDEyKCVlYnApCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVicCkKKwlqYglMMDAybG9vcAorCWFkZGwJJDc2LCVlc3AKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMworLmFsaWduCTQKK19fc2hhMV9ibG9ja19kYXRhX29yZGVyX3Nzc2UzOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwljYWxsCUwwMDNwaWNfcG9pbnQKK0wwMDNwaWNfcG9pbnQ6CisJcG9wbAklZWJwCisJbGVhbAlMS19YWF9YWC1MMDAzcGljX3BvaW50KCVlYnApLCVlYnAKK0xzc3NlM19zaG9ydGN1dDoKKwltb3ZkcWEJKCVlYnApLCV4bW03CisJbW92ZHFhCTE2KCVlYnApLCV4bW0wCisJbW92ZHFhCTMyKCVlYnApLCV4bW0xCisJbW92ZHFhCTQ4KCVlYnApLCV4bW0yCisJbW92ZHFhCTY0KCVlYnApLCV4bW02CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZWJwCisJbW92bAkyOCglZXNwKSwlZWR4CisJbW92bAklZXNwLCVlc2kKKwlzdWJsCSQyMDgsJWVzcAorCWFuZGwJJC02NCwlZXNwCisJbW92ZHFhCSV4bW0wLDExMiglZXNwKQorCW1vdmRxYQkleG1tMSwxMjgoJWVzcCkKKwltb3ZkcWEJJXhtbTIsMTQ0KCVlc3ApCisJc2hsbAkkNiwlZWR4CisJbW92ZHFhCSV4bW03LDE2MCglZXNwKQorCWFkZGwJJWVicCwlZWR4CisJbW92ZHFhCSV4bW02LDE3NiglZXNwKQorCWFkZGwJJDY0LCVlYnAKKwltb3ZsCSVlZGksMTkyKCVlc3ApCisJbW92bAklZWJwLDE5NiglZXNwKQorCW1vdmwJJWVkeCwyMDAoJWVzcCkKKwltb3ZsCSVlc2ksMjA0KCVlc3ApCisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJNCglZWRpKSwlZWJ4CisJbW92bAk4KCVlZGkpLCVlY3gKKwltb3ZsCTEyKCVlZGkpLCVlZHgKKwltb3ZsCTE2KCVlZGkpLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCW1vdmRxdQktNjQoJWVicCksJXhtbTAKKwltb3ZkcXUJLTQ4KCVlYnApLCV4bW0xCisJbW92ZHF1CS0zMiglZWJwKSwleG1tMgorCW1vdmRxdQktMTYoJWVicCksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA2CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTQKKwltb3ZkcWEJJXhtbTcsOTYoJWVzcCkKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMgorCXBhZGRkCSV4bW03LCV4bW0wCisJcGFkZGQJJXhtbTcsJXhtbTEKKwlwYWRkZAkleG1tNywleG1tMgorCW1vdmRxYQkleG1tMCwoJWVzcCkKKwlwc3ViZAkleG1tNywleG1tMAorCW1vdmRxYQkleG1tMSwxNiglZXNwKQorCXBzdWJkCSV4bW03LCV4bW0xCisJbW92ZHFhCSV4bW0yLDMyKCVlc3ApCisJbW92bAklZWN4LCVlYnAKKwlwc3ViZAkleG1tNywleG1tMgorCXhvcmwJJWVkeCwlZWJwCisJcHNodWZkCSQyMzgsJXhtbTAsJXhtbTQKKwlhbmRsCSVlYnAsJWVzaQorCWptcAlMMDA0bG9vcAorLmFsaWduCTQsMHg5MAorTDAwNGxvb3A6CisJcm9ybAkkMiwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXB1bnBja2xxZHEJJXhtbTEsJXhtbTQKKwltb3ZkcWEJJXhtbTMsJXhtbTYKKwlhZGRsCSglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlwYWRkZAkleG1tMywleG1tNworCW1vdmRxYQkleG1tMCw2NCglZXNwKQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJcHNybGRxCSQ0LCV4bW02CisJYW5kbAklZWJ4LCVlYnAKKwl4b3JsCSVlY3gsJWVieAorCXB4b3IJJXhtbTAsJXhtbTQKKwlhZGRsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVheAorCXB4b3IJJXhtbTIsJXhtbTYKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVkaSwlZXNpCisJYWRkbAk0KCVlc3ApLCVlZHgKKwlweG9yCSV4bW02LCV4bW00CisJeG9ybAklZWJ4LCVlYXgKKwlyb2xsCSQ1LCVlZGkKKwltb3ZkcWEJJXhtbTcsNDgoJWVzcCkKKwlhZGRsCSVlYnAsJWVkeAorCWFuZGwJJWVheCwlZXNpCisJbW92ZHFhCSV4bW00LCV4bW0wCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXJvcmwJJDcsJWVkaQorCW1vdmRxYQkleG1tNCwleG1tNgorCXhvcmwJJWVieCwlZXNpCisJcHNsbGRxCSQxMiwleG1tMAorCXBhZGRkCSV4bW00LCV4bW00CisJbW92bAklZWR4LCVlYnAKKwlhZGRsCTgoJWVzcCksJWVjeAorCXBzcmxkCSQzMSwleG1tNgorCXhvcmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWR4CisJbW92ZHFhCSV4bW0wLCV4bW03CisJYWRkbAklZXNpLCVlY3gKKwlhbmRsCSVlZGksJWVicAorCXhvcmwJJWVheCwlZWRpCisJcHNybGQJJDMwLCV4bW0wCisJYWRkbAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlZHgKKwlwb3IJJXhtbTYsJXhtbTQKKwl4b3JsCSVlYXgsJWVicAorCW1vdmwJJWVjeCwlZXNpCisJYWRkbAkxMiglZXNwKSwlZWJ4CisJcHNsbGQJJDIsJXhtbTcKKwl4b3JsCSVlZGksJWVkeAorCXJvbGwJJDUsJWVjeAorCXB4b3IJJXhtbTAsJXhtbTQKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTAKKwlhZGRsCSVlYnAsJWVieAorCWFuZGwJJWVkeCwlZXNpCisJcHhvcgkleG1tNywleG1tNAorCXBzaHVmZAkkMjM4LCV4bW0xLCV4bW01CisJeG9ybAklZWRpLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW03CisJYWRkbAkxNiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlY3gKKwlwYWRkZAkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tMSw4MCglZXNwKQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJcHNybGRxCSQ0LCV4bW03CisJYW5kbAklZWN4LCVlYnAKKwl4b3JsCSVlZHgsJWVjeAorCXB4b3IJJXhtbTEsJXhtbTUKKwlhZGRsCSVlYngsJWVheAorCXJvcmwJJDcsJWVieAorCXB4b3IJJXhtbTMsJXhtbTcKKwl4b3JsCSVlZHgsJWVicAorCW1vdmwJJWVheCwlZXNpCisJYWRkbAkyMCglZXNwKSwlZWRpCisJcHhvcgkleG1tNywleG1tNQorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkNSwlZWF4CisJbW92ZHFhCSV4bW0wLCglZXNwKQorCWFkZGwJJWVicCwlZWRpCisJYW5kbAklZWJ4LCVlc2kKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWRpCisJcm9ybAkkNywlZWF4CisJbW92ZHFhCSV4bW01LCV4bW03CisJeG9ybAklZWN4LCVlc2kKKwlwc2xsZHEJJDEyLCV4bW0xCisJcGFkZGQJJXhtbTUsJXhtbTUKKwltb3ZsCSVlZGksJWVicAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXBzcmxkCSQzMSwleG1tNworCXhvcmwJJWVieCwlZWF4CisJcm9sbAkkNSwlZWRpCisJbW92ZHFhCSV4bW0xLCV4bW0wCisJYWRkbAklZXNpLCVlZHgKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJJWVieCwlZWF4CisJcHNybGQJJDMwLCV4bW0xCisJYWRkbAklZWRpLCVlZHgKKwlyb3JsCSQ3LCVlZGkKKwlwb3IJJXhtbTcsJXhtbTUKKwl4b3JsCSVlYngsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJYWRkbAkyOCglZXNwKSwlZWN4CisJcHNsbGQJJDIsJXhtbTAKKwl4b3JsCSVlYXgsJWVkaQorCXJvbGwJJDUsJWVkeAorCXB4b3IJJXhtbTEsJXhtbTUKKwltb3ZkcWEJMTEyKCVlc3ApLCV4bW0xCisJYWRkbAklZWJwLCVlY3gKKwlhbmRsCSVlZGksJWVzaQorCXB4b3IJJXhtbTAsJXhtbTUKKwlwc2h1ZmQJJDIzOCwleG1tMiwleG1tNgorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJcHVucGNrbHFkcQkleG1tMywleG1tNgorCW1vdmRxYQkleG1tNSwleG1tMAorCWFkZGwJMzIoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWR4CisJcGFkZGQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTIsOTYoJWVzcCkKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXBzcmxkcQkkNCwleG1tMAorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAklZWRpLCVlZHgKKwlweG9yCSV4bW0yLCV4bW02CisJYWRkbAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlY3gKKwlweG9yCSV4bW00LCV4bW0wCisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCWFkZGwJMzYoJWVzcCksJWVheAorCXB4b3IJJXhtbTAsJXhtbTYKKwl4b3JsCSVlZHgsJWVjeAorCXJvbGwJJDUsJWVieAorCW1vdmRxYQkleG1tMSwxNiglZXNwKQorCWFkZGwJJWVicCwlZWF4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZkcWEJJXhtbTYsJXhtbTIKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJcm9ybAkkNywlZWJ4CisJbW92ZHFhCSV4bW02LCV4bW0wCisJeG9ybAklZWR4LCVlc2kKKwlwc2xsZHEJJDEyLCV4bW0yCisJcGFkZGQJJXhtbTYsJXhtbTYKKwltb3ZsCSVlYXgsJWVicAorCWFkZGwJNDAoJWVzcCksJWVkaQorCXBzcmxkCSQzMSwleG1tMAorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkNSwlZWF4CisJbW92ZHFhCSV4bW0yLCV4bW0xCisJYWRkbAklZXNpLCVlZGkKKwlhbmRsCSVlYngsJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJcHNybGQJJDMwLCV4bW0yCisJYWRkbAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlYXgKKwlwb3IJJXhtbTAsJXhtbTYKKwl4b3JsCSVlY3gsJWVicAorCW1vdmRxYQk2NCglZXNwKSwleG1tMAorCW1vdmwJJWVkaSwlZXNpCisJYWRkbAk0NCglZXNwKSwlZWR4CisJcHNsbGQJJDIsJXhtbTEKKwl4b3JsCSVlYngsJWVheAorCXJvbGwJJDUsJWVkaQorCXB4b3IJJXhtbTIsJXhtbTYKKwltb3ZkcWEJMTEyKCVlc3ApLCV4bW0yCisJYWRkbAklZWJwLCVlZHgKKwlhbmRsCSVlYXgsJWVzaQorCXB4b3IJJXhtbTEsJXhtbTYKKwlwc2h1ZmQJJDIzOCwleG1tMywleG1tNworCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlyb3JsCSQ3LCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJcHVucGNrbHFkcQkleG1tNCwleG1tNworCW1vdmRxYQkleG1tNiwleG1tMQorCWFkZGwJNDgoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJcGFkZGQJJXhtbTYsJXhtbTIKKwltb3ZkcWEJJXhtbTMsNjQoJWVzcCkKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXBzcmxkcQkkNCwleG1tMQorCWFuZGwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlweG9yCSV4bW0zLCV4bW03CisJYWRkbAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlZHgKKwlweG9yCSV4bW01LCV4bW0xCisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCWFkZGwJNTIoJWVzcCksJWVieAorCXB4b3IJJXhtbTEsJXhtbTcKKwl4b3JsCSVlZGksJWVkeAorCXJvbGwJJDUsJWVjeAorCW1vdmRxYQkleG1tMiwzMiglZXNwKQorCWFkZGwJJWVicCwlZWJ4CisJYW5kbAklZWR4LCVlc2kKKwltb3ZkcWEJJXhtbTcsJXhtbTMKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJcm9ybAkkNywlZWN4CisJbW92ZHFhCSV4bW03LCV4bW0xCisJeG9ybAklZWRpLCVlc2kKKwlwc2xsZHEJJDEyLCV4bW0zCisJcGFkZGQJJXhtbTcsJXhtbTcKKwltb3ZsCSVlYngsJWVicAorCWFkZGwJNTYoJWVzcCksJWVheAorCXBzcmxkCSQzMSwleG1tMQorCXhvcmwJJWVkeCwlZWN4CisJcm9sbAkkNSwlZWJ4CisJbW92ZHFhCSV4bW0zLCV4bW0yCisJYWRkbAklZXNpLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJcHNybGQJJDMwLCV4bW0zCisJYWRkbAklZWJ4LCVlYXgKKwlyb3JsCSQ3LCVlYngKKwlwb3IJJXhtbTEsJXhtbTcKKwl4b3JsCSVlZHgsJWVicAorCW1vdmRxYQk4MCglZXNwKSwleG1tMQorCW1vdmwJJWVheCwlZXNpCisJYWRkbAk2MCglZXNwKSwlZWRpCisJcHNsbGQJJDIsJXhtbTIKKwl4b3JsCSVlY3gsJWVieAorCXJvbGwJJDUsJWVheAorCXB4b3IJJXhtbTMsJXhtbTcKKwltb3ZkcWEJMTEyKCVlc3ApLCV4bW0zCisJYWRkbAklZWJwLCVlZGkKKwlhbmRsCSVlYngsJWVzaQorCXB4b3IJJXhtbTIsJXhtbTcKKwlwc2h1ZmQJJDIzOCwleG1tNiwleG1tMgorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlYXgKKwlweG9yCSV4bW00LCV4bW0wCisJcHVucGNrbHFkcQkleG1tNywleG1tMgorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWRpLCVlYnAKKwlhZGRsCSglZXNwKSwlZWR4CisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQkleG1tNCw4MCglZXNwKQorCXhvcmwJJWVieCwlZWF4CisJcm9sbAkkNSwlZWRpCisJbW92ZHFhCSV4bW0zLCV4bW00CisJYWRkbAklZXNpLCVlZHgKKwlwYWRkZAkleG1tNywleG1tMworCWFuZGwJJWVheCwlZWJwCisJcHhvcgkleG1tMiwleG1tMAorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlyb3JsCSQ3LCVlZGkKKwl4b3JsCSVlYngsJWVicAorCW1vdmRxYQkleG1tMCwleG1tMgorCW1vdmRxYQkleG1tMyw0OCglZXNwKQorCW1vdmwJJWVkeCwlZXNpCisJYWRkbAk0KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXJvbGwJJDUsJWVkeAorCXBzbGxkCSQyLCV4bW0wCisJYWRkbAklZWJwLCVlY3gKKwlhbmRsCSVlZGksJWVzaQorCXBzcmxkCSQzMCwleG1tMgorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVkeAorCXJvbGwJJDUsJWVjeAorCXBvcgkleG1tMiwleG1tMAorCWFkZGwJJWVzaSwlZWJ4CisJYW5kbAklZWR4LCVlYnAKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTIKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkxMiglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXBzaHVmZAkkMjM4LCV4bW03LCV4bW0zCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXJvcmwJJDcsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWRpCisJcHhvcgkleG1tNSwleG1tMQorCXB1bnBja2xxZHEJJXhtbTAsJXhtbTMKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWF4CisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tNSw5NiglZXNwKQorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwlyb3JsCSQ3LCVlYngKKwlwYWRkZAkleG1tMCwleG1tNAorCWFkZGwJJWVheCwlZWRpCisJcHhvcgkleG1tMywleG1tMQorCWFkZGwJMjAoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlyb2xsCSQ1LCVlZGkKKwltb3ZkcWEJJXhtbTEsJXhtbTMKKwltb3ZkcWEJJXhtbTQsKCVlc3ApCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJcHNsbGQJJDIsJXhtbTEKKwlhZGRsCTI0KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXBzcmxkCSQzMCwleG1tMworCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXJvcmwJJDcsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJcG9yCSV4bW0zLCV4bW0xCisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZkcWEJNjQoJWVzcCksJXhtbTMKKwltb3ZsCSVlY3gsJWVzaQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ3LCVlZHgKKwlwc2h1ZmQJJDIzOCwleG1tMCwleG1tNAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkzMiglZXNwKSwlZWF4CisJcHhvcgkleG1tNiwleG1tMgorCXB1bnBja2xxZHEJJXhtbTEsJXhtbTQKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWJwCisJcm9sbAkkNSwlZWJ4CisJcHhvcgkleG1tMywleG1tMgorCW1vdmRxYQkleG1tNiw2NCglZXNwKQorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZkcWEJMTI4KCVlc3ApLCV4bW02CisJcm9ybAkkNywlZWN4CisJcGFkZGQJJXhtbTEsJXhtbTUKKwlhZGRsCSVlYngsJWVheAorCXB4b3IJJXhtbTQsJXhtbTIKKwlhZGRsCTM2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWF4CisJbW92ZHFhCSV4bW0yLCV4bW00CisJbW92ZHFhCSV4bW01LDE2KCVlc3ApCisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWRpCisJcHNsbGQJJDIsJXhtbTIKKwlhZGRsCTQwKCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXBzcmxkCSQzMCwleG1tNAorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWRpCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJcG9yCSV4bW00LCV4bW0yCisJYWRkbAk0NCglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZkcWEJODAoJWVzcCksJXhtbTQKKwltb3ZsCSVlZHgsJWVzaQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlyb3JsCSQ3LCVlZGkKKwlwc2h1ZmQJJDIzOCwleG1tMSwleG1tNQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk0OCglZXNwKSwlZWJ4CisJcHhvcgkleG1tNywleG1tMworCXB1bnBja2xxZHEJJXhtbTIsJXhtbTUKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWN4CisJcHhvcgkleG1tNCwleG1tMworCW1vdmRxYQkleG1tNyw4MCglZXNwKQorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwlyb3JsCSQ3LCVlZHgKKwlwYWRkZAkleG1tMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJcHhvcgkleG1tNSwleG1tMworCWFkZGwJNTIoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlYngKKwltb3ZkcWEJJXhtbTMsJXhtbTUKKwltb3ZkcWEJJXhtbTYsMzIoJWVzcCkKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlwc2xsZAkkMiwleG1tMworCWFkZGwJNTYoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJcHNybGQJJDMwLCV4bW01CisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlc2ksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlwb3IJJXhtbTUsJXhtbTMKKwlhZGRsCTYwKCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCW1vdmRxYQk5NiglZXNwKSwleG1tNQorCW1vdmwJJWVkaSwlZXNpCisJcm9sbAkkNSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXJvcmwJJDcsJWVheAorCXBzaHVmZAkkMjM4LCV4bW0yLCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCSglZXNwKSwlZWN4CisJcHhvcgkleG1tMCwleG1tNAorCXB1bnBja2xxZHEJJXhtbTMsJXhtbTYKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWR4CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMCw5NiglZXNwKQorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZkcWEJJXhtbTcsJXhtbTAKKwlyb3JsCSQ3LCVlZGkKKwlwYWRkZAkleG1tMywleG1tNworCWFkZGwJJWVkeCwlZWN4CisJcHhvcgkleG1tNiwleG1tNAorCWFkZGwJNCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXJvbGwJJDUsJWVjeAorCW1vdmRxYQkleG1tNCwleG1tNgorCW1vdmRxYQkleG1tNyw0OCglZXNwKQorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXBzbGxkCSQyLCV4bW00CisJYWRkbAk4KCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXBzcmxkCSQzMCwleG1tNgorCW1vdmwJJWVieCwlZWJwCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXJvcmwJJDcsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJcG9yCSV4bW02LCV4bW00CisJYWRkbAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwltb3ZkcWEJNjQoJWVzcCksJXhtbTYKKwltb3ZsCSVlYXgsJWVzaQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVicCwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwlyb3JsCSQ3LCVlYngKKwlwc2h1ZmQJJDIzOCwleG1tMywleG1tNworCWFkZGwJJWVheCwlZWRpCisJYWRkbAkxNiglZXNwKSwlZWR4CisJcHhvcgkleG1tMSwleG1tNQorCXB1bnBja2xxZHEJJXhtbTQsJXhtbTcKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWRpCisJcHhvcgkleG1tNiwleG1tNQorCW1vdmRxYQkleG1tMSw2NCglZXNwKQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlyb3JsCSQ3LCVlYXgKKwlwYWRkZAkleG1tNCwleG1tMAorCWFkZGwJJWVkaSwlZWR4CisJcHhvcgkleG1tNywleG1tNQorCWFkZGwJMjAoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlyb2xsCSQ1LCVlZHgKKwltb3ZkcWEJJXhtbTUsJXhtbTcKKwltb3ZkcWEJJXhtbTAsKCVlc3ApCisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJcHNsbGQJJDIsJXhtbTUKKwlhZGRsCTI0KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXBzcmxkCSQzMCwleG1tNworCW1vdmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJcG9yCSV4bW03LCV4bW01CisJYWRkbAkyOCglZXNwKSwlZWF4CisJbW92ZHFhCTgwKCVlc3ApLCV4bW03CisJcm9ybAkkNywlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVieAorCXBzaHVmZAkkMjM4LCV4bW00LCV4bW0wCisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTMyKCVlc3ApLCVlZGkKKwlweG9yCSV4bW0yLCV4bW02CisJcHVucGNrbHFkcQkleG1tNSwleG1tMAorCWFuZGwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlYngKKwlweG9yCSV4bW03LCV4bW02CisJbW92ZHFhCSV4bW0yLDgwKCVlc3ApCisJbW92bAklZWF4LCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCXJvbGwJJDUsJWVheAorCW1vdmRxYQkleG1tMSwleG1tMgorCWFkZGwJJWVzaSwlZWRpCisJcGFkZGQJJXhtbTUsJXhtbTEKKwl4b3JsCSVlYngsJWVicAorCXB4b3IJJXhtbTAsJXhtbTYKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAkzNiglZXNwKSwlZWR4CisJYW5kbAklZWJ4LCVlYnAKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwltb3ZkcWEJJXhtbTEsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVheAorCW1vdmwJJWVkaSwlZXNpCisJeG9ybAklZWJ4LCVlYnAKKwlyb2xsCSQ1LCVlZGkKKwlwc2xsZAkkMiwleG1tNgorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwlwc3JsZAkkMzAsJXhtbTAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAk0MCglZXNwKSwlZWN4CisJYW5kbAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCXJvcmwJJDcsJWVkaQorCXBvcgkleG1tMCwleG1tNgorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAklZWF4LCVlc2kKKwltb3ZkcWEJOTYoJWVzcCksJXhtbTAKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXBzaHVmZAkkMjM4LCV4bW01LCV4bW0xCisJYWRkbAk0NCglZXNwKSwlZWJ4CisJYW5kbAklZWRpLCVlYnAKKwl4b3JsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVkeAorCW1vdmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYnAKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJeG9ybAklZWRpLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDgoJWVzcCksJWVheAorCXB4b3IJJXhtbTMsJXhtbTcKKwlwdW5wY2tscWRxCSV4bW02LCV4bW0xCisJYW5kbAklZWR4LCVlc2kKKwl4b3JsCSVlZGksJWVkeAorCXJvcmwJJDcsJWVjeAorCXB4b3IJJXhtbTAsJXhtbTcKKwltb3ZkcWEJJXhtbTMsOTYoJWVzcCkKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJJWVkeCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJbW92ZHFhCTE0NCglZXNwKSwleG1tMworCWFkZGwJJWVzaSwlZWF4CisJcGFkZGQJJXhtbTYsJXhtbTIKKwl4b3JsCSVlY3gsJWVicAorCXB4b3IJJXhtbTEsJXhtbTcKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk1MiglZXNwKSwlZWRpCisJYW5kbAklZWN4LCVlYnAKKwltb3ZkcWEJJXhtbTcsJXhtbTEKKwltb3ZkcWEJJXhtbTIsMzIoJWVzcCkKKwl4b3JsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVieAorCW1vdmwJJWVheCwlZXNpCisJeG9ybAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlYXgKKwlwc2xsZAkkMiwleG1tNworCWFkZGwJJWVicCwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwlwc3JsZAkkMzAsJXhtbTEKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk1NiglZXNwKSwlZWR4CisJYW5kbAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVheAorCXBvcgkleG1tMSwleG1tNworCW1vdmwJJWVkaSwlZWJwCisJeG9ybAklZWJ4LCVlc2kKKwltb3ZkcWEJNjQoJWVzcCksJXhtbTEKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVheCwlZWJwCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXBzaHVmZAkkMjM4LCV4bW02LCV4bW0yCisJYWRkbAk2MCglZXNwKSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwl4b3JsCSVlYngsJWVheAorCXJvcmwJJDcsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJKCVlc3ApLCVlYngKKwlweG9yCSV4bW00LCV4bW0wCisJcHVucGNrbHFkcQkleG1tNywleG1tMgorCWFuZGwJJWVkaSwlZXNpCisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlZHgKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW00LDY0KCVlc3ApCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCXJvbGwJJDUsJWVjeAorCW1vdmRxYQkleG1tMywleG1tNAorCWFkZGwJJWVzaSwlZWJ4CisJcGFkZGQJJXhtbTcsJXhtbTMKKwl4b3JsCSVlZHgsJWVicAorCXB4b3IJJXhtbTIsJXhtbTAKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVicAorCW1vdmRxYQkleG1tMCwleG1tMgorCW1vdmRxYQkleG1tMyw0OCglZXNwKQorCXhvcmwJJWVkaSwlZWR4CisJcm9ybAkkNywlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVieAorCXBzbGxkCSQyLCV4bW0wCisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlY3gsJWVzaQorCXBzcmxkCSQzMCwleG1tMgorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkaQorCWFuZGwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlYngKKwlwb3IJJXhtbTIsJXhtbTAKKwltb3ZsCSVlYXgsJWVicAorCXhvcmwJJWVjeCwlZXNpCisJbW92ZHFhCTgwKCVlc3ApLCV4bW0yCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlYngsJWVicAorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlwc2h1ZmQJJDIzOCwleG1tNywleG1tMworCWFkZGwJMTIoJWVzcCksJWVkeAorCWFuZGwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlYXgKKwltb3ZsCSVlZGksJWVzaQorCXhvcmwJJWVieCwlZWJwCisJcm9sbAkkNSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlY3gKKwlweG9yCSV4bW01LCV4bW0xCisJcHVucGNrbHFkcQkleG1tMCwleG1tMworCWFuZGwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlyb3JsCSQ3LCVlZGkKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW01LDgwKCVlc3ApCisJbW92bAklZWR4LCVlYnAKKwl4b3JsCSVlYXgsJWVzaQorCXJvbGwJJDUsJWVkeAorCW1vdmRxYQkleG1tNCwleG1tNQorCWFkZGwJJWVzaSwlZWN4CisJcGFkZGQJJXhtbTAsJXhtbTQKKwl4b3JsCSVlZGksJWVicAorCXB4b3IJJXhtbTMsJXhtbTEKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJYW5kbAklZWRpLCVlYnAKKwltb3ZkcWEJJXhtbTEsJXhtbTMKKwltb3ZkcWEJJXhtbTQsKCVlc3ApCisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWN4CisJcHNsbGQJJDIsJXhtbTEKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJcHNybGQJJDMwLCV4bW0zCisJeG9ybAklZWRpLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMjQoJWVzcCksJWVheAorCWFuZGwJJWVkeCwlZXNpCisJeG9ybAklZWRpLCVlZHgKKwlyb3JsCSQ3LCVlY3gKKwlwb3IJJXhtbTMsJXhtbTEKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJJWVkeCwlZXNpCisJbW92ZHFhCTk2KCVlc3ApLCV4bW0zCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlwc2h1ZmQJJDIzOCwleG1tMCwleG1tNAorCWFkZGwJMjgoJWVzcCksJWVkaQorCWFuZGwJJWVjeCwlZWJwCisJeG9ybAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlYngKKwltb3ZsCSVlYXgsJWVzaQorCXhvcmwJJWVjeCwlZWJwCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTMyKCVlc3ApLCVlZHgKKwlweG9yCSV4bW02LCV4bW0yCisJcHVucGNrbHFkcQkleG1tMSwleG1tNAorCWFuZGwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlYXgKKwlweG9yCSV4bW0zLCV4bW0yCisJbW92ZHFhCSV4bW02LDk2KCVlc3ApCisJbW92bAklZWRpLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVkaQorCW1vdmRxYQkleG1tNSwleG1tNgorCWFkZGwJJWVzaSwlZWR4CisJcGFkZGQJJXhtbTEsJXhtbTUKKwl4b3JsCSVlYXgsJWVicAorCXB4b3IJJXhtbTQsJXhtbTIKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAkzNiglZXNwKSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwltb3ZkcWEJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTUsMTYoJWVzcCkKKwl4b3JsCSVlYngsJWVheAorCXJvcmwJJDcsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlZHgKKwlwc2xsZAkkMiwleG1tMgorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWRpLCVlc2kKKwlwc3JsZAkkMzAsJXhtbTQKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk0MCglZXNwKSwlZWJ4CisJYW5kbAklZWRpLCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVkeAorCXBvcgkleG1tNCwleG1tMgorCW1vdmwJJWVjeCwlZWJwCisJeG9ybAklZWRpLCVlc2kKKwltb3ZkcWEJNjQoJWVzcCksJXhtbTQKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkeCwlZWJwCisJeG9ybAklZWRpLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXBzaHVmZAkkMjM4LCV4bW0xLCV4bW01CisJYWRkbAk0NCglZXNwKSwlZWF4CisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCSVlZGksJWVkeAorCXJvcmwJJDcsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJeG9ybAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ4KCVlc3ApLCVlZGkKKwlweG9yCSV4bW03LCV4bW0zCisJcHVucGNrbHFkcQkleG1tMiwleG1tNQorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlYXgKKwlweG9yCSV4bW00LCV4bW0zCisJbW92ZHFhCSV4bW03LDY0KCVlc3ApCisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmRxYQkleG1tNiwleG1tNworCXJvcmwJJDcsJWVieAorCXBhZGRkCSV4bW0yLCV4bW02CisJYWRkbAklZWF4LCVlZGkKKwlweG9yCSV4bW01LCV4bW0zCisJYWRkbAk1MiglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwltb3ZsCSVlZGksJWVzaQorCXJvbGwJJDUsJWVkaQorCW1vdmRxYQkleG1tMywleG1tNQorCW1vdmRxYQkleG1tNiwzMiglZXNwKQorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXBzbGxkCSQyLCV4bW0zCisJYWRkbAk1NiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlwc3JsZAkkMzAsJXhtbTUKKwltb3ZsCSVlZHgsJWVicAorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwlyb3JsCSQ3LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXBvcgkleG1tNSwleG1tMworCWFkZGwJNjAoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAklZWN4LCVlc2kKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCSglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVicAorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwlyb3JsCSQ3LCVlY3gKKwlwYWRkZAkleG1tMywleG1tNworCWFkZGwJJWVieCwlZWF4CisJYWRkbAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJbW92ZHFhCSV4bW03LDQ4KCVlc3ApCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk4KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWRpCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlyb3JsCSQ3LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCW1vdmwJMTk2KCVlc3ApLCVlYnAKKwljbXBsCTIwMCglZXNwKSwlZWJwCisJamUJTDAwNWRvbmUKKwltb3ZkcWEJMTYwKCVlc3ApLCV4bW03CisJbW92ZHFhCTE3NiglZXNwKSwleG1tNgorCW1vdmRxdQkoJWVicCksJXhtbTAKKwltb3ZkcXUJMTYoJWVicCksJXhtbTEKKwltb3ZkcXUJMzIoJWVicCksJXhtbTIKKwltb3ZkcXUJNDgoJWVicCksJXhtbTMKKwlhZGRsCSQ2NCwlZWJwCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTgKKwltb3ZsCSVlYnAsMTk2KCVlc3ApCisJbW92ZHFhCSV4bW03LDk2KCVlc3ApCisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQ3LCVlZHgKKy5ieXRlCTEwMiwxNSw1NiwwLDIwNgorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyMCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXBhZGRkCSV4bW03LCV4bW0wCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXJvcmwJJDcsJWVjeAorCW1vdmRxYQkleG1tMCwoJWVzcCkKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlYnAKKwlwc3ViZAkleG1tNywleG1tMAorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMjgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlyb2xsCSQ1LCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXJvcmwJJDcsJWVkaQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE0CisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTM2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVjeCwlZXNpCisJcGFkZGQJJXhtbTcsJXhtbTEKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNywlZWR4CisJbW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWJwCisJcHN1YmQJJXhtbTcsJXhtbTEKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXJvbGwJJDUsJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwlyb3JsCSQ3LCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMgorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAk1MiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXBhZGRkCSV4bW03LCV4bW0yCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVkaQorCW1vdmRxYQkleG1tMiwzMiglZXNwKQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk1NiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCXBzdWJkCSV4bW03LCV4bW0yCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVicCwlZWF4CisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwltb3ZsCTE5MiglZXNwKSwlZWJwCisJYWRkbAkoJWVicCksJWVheAorCWFkZGwJNCglZWJwKSwlZXNpCisJYWRkbAk4KCVlYnApLCVlY3gKKwltb3ZsCSVlYXgsKCVlYnApCisJYWRkbAkxMiglZWJwKSwlZWR4CisJbW92bAklZXNpLDQoJWVicCkKKwlhZGRsCTE2KCVlYnApLCVlZGkKKwltb3ZsCSVlY3gsOCglZWJwKQorCW1vdmwJJWVjeCwlZWJ4CisJbW92bAklZWR4LDEyKCVlYnApCisJeG9ybAklZWR4LCVlYngKKwltb3ZsCSVlZGksMTYoJWVicCkKKwltb3ZsCSVlc2ksJWVicAorCXBzaHVmZAkkMjM4LCV4bW0wLCV4bW00CisJYW5kbAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVieAorCWptcAlMMDA0bG9vcAorLmFsaWduCTQsMHg5MAorTDAwNWRvbmU6CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMjAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAkyOCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwltb3ZsCSVlZGksJWVzaQorCXJvbGwJJDUsJWVkaQorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJMzIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlYnAKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJcm9ybAkkNywlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTM2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0MCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVicAorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNDQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJwCisJbW92bAklZWF4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYnAsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTQ4KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJcm9sbAkkNSwlZWRpCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAk1MiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlyb3JsCSQ3LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTYwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCW1vdmwJMTkyKCVlc3ApLCVlYnAKKwlhZGRsCSglZWJwKSwlZWF4CisJbW92bAkyMDQoJWVzcCksJWVzcAorCWFkZGwJNCglZWJwKSwlZXNpCisJYWRkbAk4KCVlYnApLCVlY3gKKwltb3ZsCSVlYXgsKCVlYnApCisJYWRkbAkxMiglZWJwKSwlZWR4CisJbW92bAklZXNpLDQoJWVicCkKKwlhZGRsCTE2KCVlYnApLCVlZGkKKwltb3ZsCSVlY3gsOCglZWJwKQorCW1vdmwJJWVkeCwxMiglZWJwKQorCW1vdmwJJWVkaSwxNiglZWJwKQorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLnByaXZhdGVfZXh0ZXJuCV9fc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eAorLmFsaWduCTQKK19fc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eDoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJY2FsbAlMMDA2cGljX3BvaW50CitMMDA2cGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJTEtfWFhfWFgtTDAwNnBpY19wb2ludCglZWJwKSwlZWJwCitMYXZ4X3Nob3J0Y3V0OgorCXZ6ZXJvYWxsCisJdm1vdmRxYQkoJWVicCksJXhtbTcKKwl2bW92ZHFhCTE2KCVlYnApLCV4bW0wCisJdm1vdmRxYQkzMiglZWJwKSwleG1tMQorCXZtb3ZkcWEJNDgoJWVicCksJXhtbTIKKwl2bW92ZHFhCTY0KCVlYnApLCV4bW02CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZWJwCisJbW92bAkyOCglZXNwKSwlZWR4CisJbW92bAklZXNwLCVlc2kKKwlzdWJsCSQyMDgsJWVzcAorCWFuZGwJJC02NCwlZXNwCisJdm1vdmRxYQkleG1tMCwxMTIoJWVzcCkKKwl2bW92ZHFhCSV4bW0xLDEyOCglZXNwKQorCXZtb3ZkcWEJJXhtbTIsMTQ0KCVlc3ApCisJc2hsbAkkNiwlZWR4CisJdm1vdmRxYQkleG1tNywxNjAoJWVzcCkKKwlhZGRsCSVlYnAsJWVkeAorCXZtb3ZkcWEJJXhtbTYsMTc2KCVlc3ApCisJYWRkbAkkNjQsJWVicAorCW1vdmwJJWVkaSwxOTIoJWVzcCkKKwltb3ZsCSVlYnAsMTk2KCVlc3ApCisJbW92bAklZWR4LDIwMCglZXNwKQorCW1vdmwJJWVzaSwyMDQoJWVzcCkKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCW1vdmwJMTYoJWVkaSksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJdm1vdmRxdQktNjQoJWVicCksJXhtbTAKKwl2bW92ZHF1CS00OCglZWJwKSwleG1tMQorCXZtb3ZkcXUJLTMyKCVlYnApLCV4bW0yCisJdm1vdmRxdQktMTYoJWVicCksJXhtbTMKKwl2cHNodWZiCSV4bW02LCV4bW0wLCV4bW0wCisJdnBzaHVmYgkleG1tNiwleG1tMSwleG1tMQorCXZwc2h1ZmIJJXhtbTYsJXhtbTIsJXhtbTIKKwl2bW92ZHFhCSV4bW03LDk2KCVlc3ApCisJdnBzaHVmYgkleG1tNiwleG1tMywleG1tMworCXZwYWRkZAkleG1tNywleG1tMCwleG1tNAorCXZwYWRkZAkleG1tNywleG1tMSwleG1tNQorCXZwYWRkZAkleG1tNywleG1tMiwleG1tNgorCXZtb3ZkcWEJJXhtbTQsKCVlc3ApCisJbW92bAklZWN4LCVlYnAKKwl2bW92ZHFhCSV4bW01LDE2KCVlc3ApCisJeG9ybAklZWR4LCVlYnAKKwl2bW92ZHFhCSV4bW02LDMyKCVlc3ApCisJYW5kbAklZWJwLCVlc2kKKwlqbXAJTDAwN2xvb3AKKy5hbGlnbgk0LDB4OTAKK0wwMDdsb29wOgorCXNocmRsCSQyLCVlYngsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTEsJXhtbTQKKwltb3ZsCSVlYXgsJWVicAorCWFkZGwJKCVlc3ApLCVlZGkKKwl2cGFkZGQJJXhtbTMsJXhtbTcsJXhtbTcKKwl2bW92ZHFhCSV4bW0wLDY0KCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwl2cHNybGRxCSQ0LCV4bW0zLCV4bW02CisJYWRkbAklZXNpLCVlZGkKKwlhbmRsCSVlYngsJWVicAorCXZweG9yCSV4bW0wLCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXZweG9yCSV4bW0yLCV4bW02LCV4bW02CisJc2hyZGwJJDcsJWVheCwlZWF4CisJeG9ybAklZWN4LCVlYnAKKwl2bW92ZHFhCSV4bW03LDQ4KCVlc3ApCisJbW92bAklZWRpLCVlc2kKKwlhZGRsCTQoJWVzcCksJWVkeAorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJeG9ybAklZWJ4LCVlYXgKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCWFuZGwJJWVheCwlZXNpCisJdnBzcmxkCSQzMSwleG1tNCwleG1tNgorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCXZwc2xsZHEJJDEyLCV4bW00LCV4bW0wCisJdnBhZGRkCSV4bW00LCV4bW00LCV4bW00CisJbW92bAklZWR4LCVlYnAKKwlhZGRsCTgoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdnBzcmxkCSQzMCwleG1tMCwleG1tNworCXZwb3IJJXhtbTYsJXhtbTQsJXhtbTQKKwlhZGRsCSVlc2ksJWVjeAorCWFuZGwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXZwc2xsZAkkMiwleG1tMCwleG1tMAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXhvcmwJJWVheCwlZWJwCisJdnB4b3IJJXhtbTcsJXhtbTQsJXhtbTQKKwltb3ZsCSVlY3gsJWVzaQorCWFkZGwJMTIoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWR4CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdnB4b3IJJXhtbTAsJXhtbTQsJXhtbTQKKwlhZGRsCSVlYnAsJWVieAorCWFuZGwJJWVkeCwlZXNpCisJdm1vdmRxYQk5NiglZXNwKSwleG1tMAorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0yLCV4bW01CisJbW92bAklZWJ4LCVlYnAKKwlhZGRsCTE2KCVlc3ApLCVlYXgKKwl2cGFkZGQJJXhtbTQsJXhtbTAsJXhtbTAKKwl2bW92ZHFhCSV4bW0xLDgwKCVlc3ApCisJeG9ybAklZWR4LCVlY3gKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwl2cHNybGRxCSQ0LCV4bW00LCV4bW03CisJYWRkbAklZXNpLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXZweG9yCSV4bW0xLCV4bW01LCV4bW01CisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZweG9yCSV4bW0zLCV4bW03LCV4bW03CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJeG9ybAklZWR4LCVlYnAKKwl2bW92ZHFhCSV4bW0wLCglZXNwKQorCW1vdmwJJWVheCwlZXNpCisJYWRkbAkyMCglZXNwKSwlZWRpCisJdnB4b3IJJXhtbTcsJXhtbTUsJXhtbTUKKwl4b3JsCSVlY3gsJWVieAorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWRpCisJYW5kbAklZWJ4LCVlc2kKKwl2cHNybGQJJDMxLCV4bW01LCV4bW03CisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCXhvcmwJJWVjeCwlZXNpCisJdnBzbGxkcQkkMTIsJXhtbTUsJXhtbTEKKwl2cGFkZGQJJXhtbTUsJXhtbTUsJXhtbTUKKwltb3ZsCSVlZGksJWVicAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWF4CisJc2hsZGwJJDUsJWVkaSwlZWRpCisJdnBzcmxkCSQzMCwleG1tMSwleG1tMAorCXZwb3IJJXhtbTcsJXhtbTUsJXhtbTUKKwlhZGRsCSVlc2ksJWVkeAorCWFuZGwJJWVheCwlZWJwCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXZwc2xsZAkkMiwleG1tMSwleG1tMQorCXNocmRsCSQ3LCVlZGksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJdnB4b3IJJXhtbTAsJXhtbTUsJXhtbTUKKwltb3ZsCSVlZHgsJWVzaQorCWFkZGwJMjgoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdnB4b3IJJXhtbTEsJXhtbTUsJXhtbTUKKwlhZGRsCSVlYnAsJWVjeAorCWFuZGwJJWVkaSwlZXNpCisJdm1vdmRxYQkxMTIoJWVzcCksJXhtbTEKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVkeCwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwl2cGFsaWducgkkOCwleG1tMiwleG1tMywleG1tNgorCW1vdmwJJWVjeCwlZWJwCisJYWRkbAkzMiglZXNwKSwlZWJ4CisJdnBhZGRkCSV4bW01LCV4bW0xLCV4bW0xCisJdm1vdmRxYQkleG1tMiw5NiglZXNwKQorCXhvcmwJJWVkaSwlZWR4CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdnBzcmxkcQkkNCwleG1tNSwleG1tMAorCWFkZGwJJWVzaSwlZWJ4CisJYW5kbAklZWR4LCVlYnAKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJdm1vdmRxYQkleG1tMSwxNiglZXNwKQorCW1vdmwJJWVieCwlZXNpCisJYWRkbAkzNiglZXNwKSwlZWF4CisJdnB4b3IJJXhtbTAsJXhtbTYsJXhtbTYKKwl4b3JsCSVlZHgsJWVjeAorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJYW5kbAklZWN4LCVlc2kKKwl2cHNybGQJJDMxLCV4bW02LCV4bW0wCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlYngsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJdnBzbGxkcQkkMTIsJXhtbTYsJXhtbTIKKwl2cGFkZGQJJXhtbTYsJXhtbTYsJXhtbTYKKwltb3ZsCSVlYXgsJWVicAorCWFkZGwJNDAoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnBzcmxkCSQzMCwleG1tMiwleG1tMQorCXZwb3IJJXhtbTAsJXhtbTYsJXhtbTYKKwlhZGRsCSVlc2ksJWVkaQorCWFuZGwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXZwc2xsZAkkMiwleG1tMiwleG1tMgorCXZtb3ZkcWEJNjQoJWVzcCksJXhtbTAKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwl4b3JsCSVlY3gsJWVicAorCXZweG9yCSV4bW0xLCV4bW02LCV4bW02CisJbW92bAklZWRpLCVlc2kKKwlhZGRsCTQ0KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVheAorCXNobGRsCSQ1LCVlZGksJWVkaQorCXZweG9yCSV4bW0yLCV4bW02LCV4bW02CisJYWRkbAklZWJwLCVlZHgKKwlhbmRsCSVlYXgsJWVzaQorCXZtb3ZkcWEJMTEyKCVlc3ApLCV4bW0yCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXNocmRsCSQ3LCVlZGksJWVkaQorCXhvcmwJJWVieCwlZXNpCisJdnBhbGlnbnIJJDgsJXhtbTMsJXhtbTQsJXhtbTcKKwltb3ZsCSVlZHgsJWVicAorCWFkZGwJNDgoJWVzcCksJWVjeAorCXZwYWRkZAkleG1tNiwleG1tMiwleG1tMgorCXZtb3ZkcWEJJXhtbTMsNjQoJWVzcCkKKwl4b3JsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZwc3JsZHEJJDQsJXhtbTYsJXhtbTEKKwlhZGRsCSVlc2ksJWVjeAorCWFuZGwJJWVkaSwlZWJwCisJdnB4b3IJJXhtbTMsJXhtbTcsJXhtbTcKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJdnB4b3IJJXhtbTUsJXhtbTEsJXhtbTEKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXZtb3ZkcWEJJXhtbTIsMzIoJWVzcCkKKwltb3ZsCSVlY3gsJWVzaQorCWFkZGwJNTIoJWVzcCksJWVieAorCXZweG9yCSV4bW0xLCV4bW03LCV4bW03CisJeG9ybAklZWRpLCVlZHgKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCWFuZGwJJWVkeCwlZXNpCisJdnBzcmxkCSQzMSwleG1tNywleG1tMQorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXZwc2xsZHEJJDEyLCV4bW03LCV4bW0zCisJdnBhZGRkCSV4bW03LCV4bW03LCV4bW03CisJbW92bAklZWJ4LCVlYnAKKwlhZGRsCTU2KCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVjeAorCXNobGRsCSQ1LCVlYngsJWVieAorCXZwc3JsZAkkMzAsJXhtbTMsJXhtbTIKKwl2cG9yCSV4bW0xLCV4bW03LCV4bW03CisJYWRkbAklZXNpLCVlYXgKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cHNsbGQJJDIsJXhtbTMsJXhtbTMKKwl2bW92ZHFhCTgwKCVlc3ApLCV4bW0xCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJeG9ybAklZWR4LCVlYnAKKwl2cHhvcgkleG1tMiwleG1tNywleG1tNworCW1vdmwJJWVheCwlZXNpCisJYWRkbAk2MCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwl2cHhvcgkleG1tMywleG1tNywleG1tNworCWFkZGwJJWVicCwlZWRpCisJYW5kbAklZWJ4LCVlc2kKKwl2bW92ZHFhCTExMiglZXNwKSwleG1tMworCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwl2cGFsaWducgkkOCwleG1tNiwleG1tNywleG1tMgorCXZweG9yCSV4bW00LCV4bW0wLCV4bW0wCisJc2hyZGwJJDcsJWVheCwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCWFkZGwJKCVlc3ApLCVlZHgKKwl2cHhvcgkleG1tMSwleG1tMCwleG1tMAorCXZtb3ZkcWEJJXhtbTQsODAoJWVzcCkKKwl4b3JsCSVlYngsJWVheAorCXNobGRsCSQ1LCVlZGksJWVkaQorCXZtb3ZkcWEJJXhtbTMsJXhtbTQKKwl2cGFkZGQJJXhtbTcsJXhtbTMsJXhtbTMKKwlhZGRsCSVlc2ksJWVkeAorCWFuZGwJJWVheCwlZWJwCisJdnB4b3IJJXhtbTIsJXhtbTAsJXhtbTAKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJc2hyZGwJJDcsJWVkaSwlZWRpCisJeG9ybAklZWJ4LCVlYnAKKwl2cHNybGQJJDMwLCV4bW0wLCV4bW0yCisJdm1vdmRxYQkleG1tMyw0OCglZXNwKQorCW1vdmwJJWVkeCwlZXNpCisJYWRkbAk0KCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZwc2xsZAkkMiwleG1tMCwleG1tMAorCWFkZGwJJWVicCwlZWN4CisJYW5kbAklZWRpLCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVkeCwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlY3gsJWVicAorCWFkZGwJOCglZXNwKSwlZWJ4CisJdnBvcgkleG1tMiwleG1tMCwleG1tMAorCXhvcmwJJWVkaSwlZWR4CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdm1vdmRxYQk5NiglZXNwKSwleG1tMgorCWFkZGwJJWVzaSwlZWJ4CisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkxMiglZXNwKSwlZWF4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZwYWxpZ25yCSQ4LCV4bW03LCV4bW0wLCV4bW0zCisJdnB4b3IJJXhtbTUsJXhtbTEsJXhtbTEKKwlhZGRsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWJwCisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2bW92ZHFhCSV4bW01LDk2KCVlc3ApCisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXZtb3ZkcWEJJXhtbTQsJXhtbTUKKwl2cGFkZGQJJXhtbTAsJXhtbTQsJXhtbTQKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJYWRkbAkyMCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwltb3ZsCSVlZGksJWVzaQorCXNobGRsCSQ1LCVlZGksJWVkaQorCXZwc3JsZAkkMzAsJXhtbTEsJXhtbTMKKwl2bW92ZHFhCSV4bW00LCglZXNwKQorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCXZwc2xsZAkkMiwleG1tMSwleG1tMQorCWFkZGwJMjQoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlYnAKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwl2cG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwl2bW92ZHFhCTY0KCVlc3ApLCV4bW0zCisJbW92bAklZWN4LCVlc2kKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMSwleG1tNAorCXZweG9yCSV4bW02LCV4bW0yLCV4bW0yCisJYWRkbAkzMiglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVicAorCXNobGRsCSQ1LCVlYngsJWVieAorCXZweG9yCSV4bW0zLCV4bW0yLCV4bW0yCisJdm1vdmRxYQkleG1tNiw2NCglZXNwKQorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwl2bW92ZHFhCTEyOCglZXNwKSwleG1tNgorCXZwYWRkZAkleG1tMSwleG1tNSwleG1tNQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwlhZGRsCTM2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnBzcmxkCSQzMCwleG1tMiwleG1tNAorCXZtb3ZkcWEJJXhtbTUsMTYoJWVzcCkKKwlhZGRsCSVlYnAsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwl2cHNsbGQJJDIsJXhtbTIsJXhtbTIKKwlhZGRsCTQwKCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJdnBvcgkleG1tNCwleG1tMiwleG1tMgorCWFkZGwJNDQoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJdm1vdmRxYQk4MCglZXNwKSwleG1tNAorCW1vdmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXNocmRsCSQ3LCVlZGksJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJdnBhbGlnbnIJJDgsJXhtbTEsJXhtbTIsJXhtbTUKKwl2cHhvcgkleG1tNywleG1tMywleG1tMworCWFkZGwJNDgoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZtb3ZkcWEJJXhtbTcsODAoJWVzcCkKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJdm1vdmRxYQkleG1tNiwleG1tNworCXZwYWRkZAkleG1tMiwleG1tNiwleG1tNgorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnB4b3IJJXhtbTUsJXhtbTMsJXhtbTMKKwlhZGRsCTUyKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCW1vdmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJdnBzcmxkCSQzMCwleG1tMywleG1tNQorCXZtb3ZkcWEJJXhtbTYsMzIoJWVzcCkKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cHNsbGQJJDIsJXhtbTMsJXhtbTMKKwlhZGRsCTU2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWJwCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJdnBvcgkleG1tNSwleG1tMywleG1tMworCWFkZGwJNjAoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJdm1vdmRxYQk5NiglZXNwKSwleG1tNQorCW1vdmwJJWVkaSwlZXNpCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJdnBhbGlnbnIJJDgsJXhtbTIsJXhtbTMsJXhtbTYKKwl2cHhvcgkleG1tMCwleG1tNCwleG1tNAorCWFkZGwJKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0wLDk2KCVlc3ApCisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXZtb3ZkcWEJJXhtbTcsJXhtbTAKKwl2cGFkZGQJJXhtbTMsJXhtbTcsJXhtbTcKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdnBzcmxkCSQzMCwleG1tNCwleG1tNgorCXZtb3ZkcWEJJXhtbTcsNDgoJWVzcCkKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHNsbGQJJDIsJXhtbTQsJXhtbTQKKwlhZGRsCTgoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cG9yCSV4bW02LCV4bW00LCV4bW00CisJYWRkbAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwl2bW92ZHFhCTY0KCVlc3ApLCV4bW02CisJbW92bAklZWF4LCVlc2kKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tNworCXZweG9yCSV4bW0xLCV4bW01LCV4bW01CisJYWRkbAkxNiglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXNobGRsCSQ1LCVlZGksJWVkaQorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisJdm1vdmRxYQkleG1tMSw2NCglZXNwKQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwl2bW92ZHFhCSV4bW0wLCV4bW0xCisJdnBhZGRkCSV4bW00LCV4bW0wLCV4bW0wCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwl2cHhvcgkleG1tNywleG1tNSwleG1tNQorCWFkZGwJMjAoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cHNybGQJJDMwLCV4bW01LCV4bW03CisJdm1vdmRxYQkleG1tMCwoJWVzcCkKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwl2cHNsbGQJJDIsJXhtbTUsJXhtbTUKKwlhZGRsCTI0KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBvcgkleG1tNywleG1tNSwleG1tNQorCWFkZGwJMjgoJWVzcCksJWVheAorCXZtb3ZkcWEJODAoJWVzcCksJXhtbTcKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwltb3ZsCSVlYngsJWVzaQorCXhvcmwJJWVkeCwlZWJwCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2cGFsaWducgkkOCwleG1tNCwleG1tNSwleG1tMAorCXZweG9yCSV4bW0yLCV4bW02LCV4bW02CisJYWRkbAkzMiglZXNwKSwlZWRpCisJYW5kbAklZWN4LCVlc2kKKwl4b3JsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlYngsJWVieAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJdm1vdmRxYQkleG1tMiw4MCglZXNwKQorCW1vdmwJJWVheCwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwl2bW92ZHFhCSV4bW0xLCV4bW0yCisJdnBhZGRkCSV4bW01LCV4bW0xLCV4bW0xCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZXNpLCVlZGkKKwl2cHhvcgkleG1tMCwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMzYoJWVzcCksJWVkeAorCXZwc3JsZAkkMzAsJXhtbTYsJXhtbTAKKwl2bW92ZHFhCSV4bW0xLDE2KCVlc3ApCisJYW5kbAklZWJ4LCVlYnAKKwl4b3JsCSVlY3gsJWVieAorCXNocmRsCSQ3LCVlYXgsJWVheAorCW1vdmwJJWVkaSwlZXNpCisJdnBzbGxkCSQyLCV4bW02LCV4bW02CisJeG9ybAklZWJ4LCVlYnAKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJNDAoJWVzcCksJWVjeAorCWFuZGwJJWVheCwlZXNpCisJdnBvcgkleG1tMCwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWF4CisJc2hyZGwJJDcsJWVkaSwlZWRpCisJdm1vdmRxYQk5NiglZXNwKSwleG1tMAorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAklZWF4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNDQoJWVzcCksJWVieAorCWFuZGwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWJwCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cGFsaWducgkkOCwleG1tNSwleG1tNiwleG1tMQorCXZweG9yCSV4bW0zLCV4bW03LCV4bW03CisJYWRkbAk0OCglZXNwKSwlZWF4CisJYW5kbAklZWR4LCVlc2kKKwl4b3JsCSVlZGksJWVkeAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCXZweG9yCSV4bW0wLCV4bW03LCV4bW03CisJdm1vdmRxYQkleG1tMyw5NiglZXNwKQorCW1vdmwJJWVieCwlZWJwCisJeG9ybAklZWR4LCVlc2kKKwl2bW92ZHFhCTE0NCglZXNwKSwleG1tMworCXZwYWRkZAkleG1tNiwleG1tMiwleG1tMgorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJdnB4b3IJJXhtbTEsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTUyKCVlc3ApLCVlZGkKKwl2cHNybGQJJDMwLCV4bW03LCV4bW0xCisJdm1vdmRxYQkleG1tMiwzMiglZXNwKQorCWFuZGwJJWVjeCwlZWJwCisJeG9ybAklZWR4LCVlY3gKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwltb3ZsCSVlYXgsJWVzaQorCXZwc2xsZAkkMiwleG1tNywleG1tNworCXhvcmwJJWVjeCwlZWJwCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlZGkKKwlhZGRsCTU2KCVlc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVzaQorCXZwb3IJJXhtbTEsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJWVieAorCXNocmRsCSQ3LCVlYXgsJWVheAorCXZtb3ZkcWEJNjQoJWVzcCksJXhtbTEKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTYwKCVlc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCXhvcmwJJWVieCwlZWF4CisJc2hyZGwJJDcsJWVkaSwlZWRpCisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJdnBhbGlnbnIJJDgsJXhtbTYsJXhtbTcsJXhtbTIKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCWFkZGwJKCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVzaQorCXhvcmwJJWVheCwlZWRpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKwl2bW92ZHFhCSV4bW00LDY0KCVlc3ApCisJbW92bAklZWN4LCVlYnAKKwl4b3JsCSVlZGksJWVzaQorCXZtb3ZkcWEJJXhtbTMsJXhtbTQKKwl2cGFkZGQJJXhtbTcsJXhtbTMsJXhtbTMKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXZweG9yCSV4bW0yLCV4bW0wLCV4bW0wCisJeG9ybAklZWR4LCVlYnAKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlYXgKKwl2cHNybGQJJDMwLCV4bW0wLCV4bW0yCisJdm1vdmRxYQkleG1tMyw0OCglZXNwKQorCWFuZGwJJWVkeCwlZWJwCisJeG9ybAklZWRpLCVlZHgKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwltb3ZsCSVlYngsJWVzaQorCXZwc2xsZAkkMiwleG1tMCwleG1tMAorCXhvcmwJJWVkeCwlZWJwCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkaQorCWFuZGwJJWVjeCwlZXNpCisJdnBvcgkleG1tMiwleG1tMCwleG1tMAorCXhvcmwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJdm1vdmRxYQk4MCglZXNwKSwleG1tMgorCW1vdmwJJWVheCwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlc2ksJWVkaQorCXhvcmwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFuZGwJJWVieCwlZWJwCisJeG9ybAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwltb3ZsCSVlZGksJWVzaQorCXhvcmwJJWVieCwlZWJwCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwl2cGFsaWducgkkOCwleG1tNywleG1tMCwleG1tMworCXZweG9yCSV4bW01LCV4bW0xLCV4bW0xCisJYWRkbAkxNiglZXNwKSwlZWN4CisJYW5kbAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlZGksJWVkaQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdm1vdmRxYQkleG1tNSw4MCglZXNwKQorCW1vdmwJJWVkeCwlZWJwCisJeG9ybAklZWF4LCVlc2kKKwl2bW92ZHFhCSV4bW00LCV4bW01CisJdnBhZGRkCSV4bW0wLCV4bW00LCV4bW00CisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXhvcmwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJMjAoJWVzcCksJWVieAorCXZwc3JsZAkkMzAsJXhtbTEsJXhtbTMKKwl2bW92ZHFhCSV4bW00LCglZXNwKQorCWFuZGwJJWVkaSwlZWJwCisJeG9ybAklZWF4LCVlZGkKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXZwc2xsZAkkMiwleG1tMSwleG1tMQorCXhvcmwJJWVkaSwlZWJwCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTI0KCVlc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVzaQorCXZwb3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl4b3JsCSVlZGksJWVkeAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCXZtb3ZkcWEJOTYoJWVzcCksJXhtbTMKKwltb3ZsCSVlYngsJWVicAorCXhvcmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZGkKKwlhbmRsCSVlY3gsJWVicAorCXhvcmwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJbW92bAklZWF4LCVlc2kKKwl4b3JsCSVlY3gsJWVicAorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWRpCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNiwleG1tMiwleG1tMgorCWFkZGwJMzIoJWVzcCksJWVkeAorCWFuZGwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwl2cHhvcgkleG1tMywleG1tMiwleG1tMgorCXZtb3ZkcWEJJXhtbTYsOTYoJWVzcCkKKwltb3ZsCSVlZGksJWVicAorCXhvcmwJJWVieCwlZXNpCisJdm1vdmRxYQkleG1tNSwleG1tNgorCXZwYWRkZAkleG1tMSwleG1tNSwleG1tNQorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl4b3JsCSVlYXgsJWVicAorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTM2KCVlc3ApLCVlY3gKKwl2cHNybGQJJDMwLCV4bW0yLCV4bW00CisJdm1vdmRxYQkleG1tNSwxNiglZXNwKQorCWFuZGwJJWVheCwlZWJwCisJeG9ybAklZWJ4LCVlYXgKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCXZwc2xsZAkkMiwleG1tMiwleG1tMgorCXhvcmwJJWVheCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZWJwLCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVheCwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTQwKCVlc3ApLCVlYngKKwlhbmRsCSVlZGksJWVzaQorCXZwb3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl4b3JsCSVlYXgsJWVkaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXZtb3ZkcWEJNjQoJWVzcCksJXhtbTQKKwltb3ZsCSVlY3gsJWVicAorCXhvcmwJJWVkaSwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZHgsJWVicAorCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQ0KCVlc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVicAorCXhvcmwJJWVkaSwlZWR4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVicAorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlhZGRsCSVlYngsJWVheAorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0yLCV4bW01CisJdnB4b3IJJXhtbTcsJXhtbTMsJXhtbTMKKwlhZGRsCTQ4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWJwCisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2bW92ZHFhCSV4bW03LDY0KCVlc3ApCisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXZtb3ZkcWEJJXhtbTYsJXhtbTcKKwl2cGFkZGQJJXhtbTIsJXhtbTYsJXhtbTYKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCXZweG9yCSV4bW01LCV4bW0zLCV4bW0zCisJYWRkbAk1MiglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwltb3ZsCSVlZGksJWVzaQorCXNobGRsCSQ1LCVlZGksJWVkaQorCXZwc3JsZAkkMzAsJXhtbTMsJXhtbTUKKwl2bW92ZHFhCSV4bW02LDMyKCVlc3ApCisJYWRkbAklZWJwLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJdnBzbGxkCSQyLCV4bW0zLCV4bW0zCisJYWRkbAk1NiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVicAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCXZwb3IJJXhtbTUsJXhtbTMsJXhtbTMKKwlhZGRsCTYwKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWJwLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkoJWVzcCksJWVheAorCXZwYWRkZAkleG1tMywleG1tNywleG1tNworCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXZtb3ZkcWEJJXhtbTcsNDgoJWVzcCkKKwl4b3JsCSVlZHgsJWVicAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk4KCVlc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmwJJWVkaSwlZWJwCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVicCwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwlzaHJkbAkkNywlZWRpLCVlZGkKKwlhZGRsCSVlZHgsJWVjeAorCW1vdmwJMTk2KCVlc3ApLCVlYnAKKwljbXBsCTIwMCglZXNwKSwlZWJwCisJamUJTDAwOGRvbmUKKwl2bW92ZHFhCTE2MCglZXNwKSwleG1tNworCXZtb3ZkcWEJMTc2KCVlc3ApLCV4bW02CisJdm1vdmRxdQkoJWVicCksJXhtbTAKKwl2bW92ZHF1CTE2KCVlYnApLCV4bW0xCisJdm1vdmRxdQkzMiglZWJwKSwleG1tMgorCXZtb3ZkcXUJNDgoJWVicCksJXhtbTMKKwlhZGRsCSQ2NCwlZWJwCisJdnBzaHVmYgkleG1tNiwleG1tMCwleG1tMAorCW1vdmwJJWVicCwxOTYoJWVzcCkKKwl2bW92ZHFhCSV4bW03LDk2KCVlc3ApCisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwl2cHNodWZiCSV4bW02LCV4bW0xLCV4bW0xCisJbW92bAklZWN4LCVlYnAKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwl2cGFkZGQJJXhtbTcsJXhtbTAsJXhtbTQKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2bW92ZHFhCSV4bW00LCglZXNwKQorCWFkZGwJMjAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJbW92bAklZWJ4LCVlc2kKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlYnAsJWVheAorCXhvcmwJJWVkeCwlZXNpCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWJwCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZXNpLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAkyOCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwltb3ZsCSVlZGksJWVzaQorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVicCwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJMzIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJdnBzaHVmYgkleG1tNiwleG1tMiwleG1tMgorCW1vdmwJJWVkeCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdnBhZGRkCSV4bW03LCV4bW0xLCV4bW01CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXNocmRsCSQ3LCVlZGksJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJdm1vdmRxYQkleG1tNSwxNiglZXNwKQorCWFkZGwJMzYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAklZWN4LCVlc2kKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlYnAsJWVieAorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWJwCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk0NCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJNDgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJdnBzaHVmYgkleG1tNiwleG1tMywleG1tMworCW1vdmwJJWVkaSwlZWJwCisJc2hsZGwJJDUsJWVkaSwlZWRpCisJdnBhZGRkCSV4bW03LCV4bW0yLCV4bW02CisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVicAorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWR4CisJdm1vdmRxYQkleG1tNiwzMiglZXNwKQorCWFkZGwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwltb3ZsCTE5MiglZXNwKSwlZWJwCisJYWRkbAkoJWVicCksJWVheAorCWFkZGwJNCglZWJwKSwlZXNpCisJYWRkbAk4KCVlYnApLCVlY3gKKwltb3ZsCSVlYXgsKCVlYnApCisJYWRkbAkxMiglZWJwKSwlZWR4CisJbW92bAklZXNpLDQoJWVicCkKKwlhZGRsCTE2KCVlYnApLCVlZGkKKwltb3ZsCSVlY3gsJWVieAorCW1vdmwJJWVjeCw4KCVlYnApCisJeG9ybAklZWR4LCVlYngKKwltb3ZsCSVlZHgsMTIoJWVicCkKKwltb3ZsCSVlZGksMTYoJWVicCkKKwltb3ZsCSVlc2ksJWVicAorCWFuZGwJJWVieCwlZXNpCisJbW92bAklZWJwLCVlYngKKwlqbXAJTDAwN2xvb3AKKy5hbGlnbgk0LDB4OTAKK0wwMDhkb25lOgorCWFkZGwJMTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAklZWN4LCVlYnAKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkaSwlZWJwCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVicAorCW1vdmwJJWVieCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZWJwLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVzaSwlZWRpCisJeG9ybAklZWN4LCVlYnAKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVkaQorCWFkZGwJMjgoJWVzcCksJWVkeAorCXhvcmwJJWVieCwlZWJwCisJbW92bAklZWRpLCVlc2kKKwlzaGxkbAkkNSwlZWRpLCVlZGkKKwlhZGRsCSVlYnAsJWVkeAorCXhvcmwJJWVieCwlZXNpCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVicAorCXNocmRsCSQ3LCVlZGksJWVkaQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkzNiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVicCwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDAoJWVzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlYnAKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWJwCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVheCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZGkKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWRpCisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlZGksJWVicAorCXNobGRsCSQ1LCVlZGksJWVkaQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlYnAKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVkeAorCWFkZGwJNTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlYnAsJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVkaSwlZWRpCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVjeCwlZWJwCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlZGksJWVicAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglZXNwKSwlZWF4CisJeG9ybAklZWR4LCVlYnAKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVicCwlZWF4CisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwl2emVyb2FsbAorCW1vdmwJMTkyKCVlc3ApLCVlYnAKKwlhZGRsCSglZWJwKSwlZWF4CisJbW92bAkyMDQoJWVzcCksJWVzcAorCWFkZGwJNCglZWJwKSwlZXNpCisJYWRkbAk4KCVlYnApLCVlY3gKKwltb3ZsCSVlYXgsKCVlYnApCisJYWRkbAkxMiglZWJwKSwlZWR4CisJbW92bAklZXNpLDQoJWVicCkKKwlhZGRsCTE2KCVlYnApLCVlZGkKKwltb3ZsCSVlY3gsOCglZWJwKQorCW1vdmwJJWVkeCwxMiglZWJwKQorCW1vdmwJJWVkaSwxNiglZWJwKQorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTYsMHg5MAorTEtfWFhfWFg6CisubG9uZwkxNTE4NTAwMjQ5LDE1MTg1MDAyNDksMTUxODUwMDI0OSwxNTE4NTAwMjQ5CisubG9uZwkxODU5Nzc1MzkzLDE4NTk3NzUzOTMsMTg1OTc3NTM5MywxODU5Nzc1MzkzCisubG9uZwkyNDAwOTU5NzA4LDI0MDA5NTk3MDgsMjQwMDk1OTcwOCwyNDAwOTU5NzA4CisubG9uZwkzMzk1NDY5NzgyLDMzOTU0Njk3ODIsMzM5NTQ2OTc4MiwzMzk1NDY5NzgyCisubG9uZwk2NjA1MSw2NzQzODA4NywxMzQ4MTAxMjMsMjAyMTgyMTU5CisuYnl0ZQkxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSwwCisuYnl0ZQk4Myw3Miw2NSw0OSwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3LDExMCwxMTUKKy5ieXRlCTEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsNDQsMzIsNjcsODIKKy5ieXRlCTg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyCisuYnl0ZQkxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisuc2VjdGlvbiBfX0lNUE9SVCxfX3BvaW50ZXJzLG5vbl9sYXp5X3N5bWJvbF9wb2ludGVycworTF9PUEVOU1NMX2lhMzJjYXBfUCRub25fbGF6eV9wdHI6CisuaW5kaXJlY3Rfc3ltYm9sCV9PUEVOU1NMX2lhMzJjYXBfUAorLmxvbmcJMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LTU4Ni5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni01ODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE1Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni01ODYuUwpAQCAtMCwwICsxLDU1NjIgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5nbG9ibAlfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKy5wcml2YXRlX2V4dGVybglfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKy5hbGlnbgk0Citfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CitMX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlYXgKKwltb3ZsCSVlc3AsJWVieAorCWNhbGwJTDAwMHBpY19wb2ludAorTDAwMHBpY19wb2ludDoKKwlwb3BsCSVlYnAKKwlsZWFsCUwwMDFLMjU2LUwwMDBwaWNfcG9pbnQoJWVicCksJWVicAorCXN1YmwJJDE2LCVlc3AKKwlhbmRsCSQtNjQsJWVzcAorCXNobGwJJDYsJWVheAorCWFkZGwJJWVkaSwlZWF4CisJbW92bAklZXNpLCglZXNwKQorCW1vdmwJJWVkaSw0KCVlc3ApCisJbW92bAklZWF4LDgoJWVzcCkKKwltb3ZsCSVlYngsMTIoJWVzcCkKKwltb3ZsCUxfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyLUwwMDFLMjU2KCVlYnApLCVlZHgKKwltb3ZsCSglZWR4KSwlZWN4CisJbW92bAk0KCVlZHgpLCVlYngKKwl0ZXN0bAkkMTA0ODU3NiwlZWN4CisJam56CUwwMDJsb29wCisJbW92bAk4KCVlZHgpLCVlZHgKKwl0ZXN0bAkkMTY3NzcyMTYsJWVjeAorCWp6CUwwMDNub194bW0KKwlhbmRsCSQxMDczNzQxODI0LCVlY3gKKwlhbmRsCSQyNjg0MzU5NjgsJWVieAorCW9ybAklZWJ4LCVlY3gKKwlhbmRsCSQxMzQyMTc3MjgwLCVlY3gKKwljbXBsCSQxMzQyMTc3MjgwLCVlY3gKKwlqZQlMMDA0QVZYCisJdGVzdGwJJDUxMiwlZWJ4CisJam56CUwwMDVTU1NFMworTDAwM25vX3htbToKKwlzdWJsCSVlZGksJWVheAorCWNtcGwJJDI1NiwlZWF4CisJamFlCUwwMDZ1bnJvbGxlZAorCWptcAlMMDAybG9vcAorLmFsaWduCTQsMHg5MAorTDAwMmxvb3A6CisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJNCglZWRpKSwlZWJ4CisJbW92bAk4KCVlZGkpLCVlY3gKKwlic3dhcAklZWF4CisJbW92bAkxMiglZWRpKSwlZWR4CisJYnN3YXAJJWVieAorCXB1c2hsCSVlYXgKKwlic3dhcAklZWN4CisJcHVzaGwJJWVieAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCW1vdmwJMTYoJWVkaSksJWVheAorCW1vdmwJMjAoJWVkaSksJWVieAorCW1vdmwJMjQoJWVkaSksJWVjeAorCWJzd2FwCSVlYXgKKwltb3ZsCTI4KCVlZGkpLCVlZHgKKwlic3dhcAklZWJ4CisJcHVzaGwJJWVheAorCWJzd2FwCSVlY3gKKwlwdXNobAklZWJ4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJbW92bAkzMiglZWRpKSwlZWF4CisJbW92bAkzNiglZWRpKSwlZWJ4CisJbW92bAk0MCglZWRpKSwlZWN4CisJYnN3YXAJJWVheAorCW1vdmwJNDQoJWVkaSksJWVkeAorCWJzd2FwCSVlYngKKwlwdXNobAklZWF4CisJYnN3YXAJJWVjeAorCXB1c2hsCSVlYngKKwlic3dhcAklZWR4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwltb3ZsCTQ4KCVlZGkpLCVlYXgKKwltb3ZsCTUyKCVlZGkpLCVlYngKKwltb3ZsCTU2KCVlZGkpLCVlY3gKKwlic3dhcAklZWF4CisJbW92bAk2MCglZWRpKSwlZWR4CisJYnN3YXAJJWVieAorCXB1c2hsCSVlYXgKKwlic3dhcAklZWN4CisJcHVzaGwJJWVieAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCWFkZGwJJDY0LCVlZGkKKwlsZWFsCS0zNiglZXNwKSwlZXNwCisJbW92bAklZWRpLDEwNCglZXNwKQorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWRpCisJbW92bAklZWJ4LDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVieAorCW1vdmwJJWVjeCwxMiglZXNwKQorCW1vdmwJJWVkaSwxNiglZXNwKQorCW1vdmwJJWVieCwoJWVzcCkKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKwltb3ZsCTIwKCVlc2kpLCVlYngKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlZGkKKwltb3ZsCSVlYngsMjQoJWVzcCkKKwltb3ZsCSVlY3gsMjgoJWVzcCkKKwltb3ZsCSVlZGksMzIoJWVzcCkKKy5hbGlnbgk0LDB4OTAKK0wwMDcwMF8xNToKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlY3gKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJbW92bAk5NiglZXNwKSwlZWJ4CisJcm9ybAkkNSwlZWN4CisJYW5kbAklZWR4LCVlc2kKKwltb3ZsCSVlZHgsMjAoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMzIoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXJvcmwJJDksJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCw0KCVlc3ApCisJbGVhbAktNCglZXNwKSwlZXNwCisJcm9ybAkkMTEsJWVjeAorCW1vdmwJKCVlYnApLCVlc2kKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJMjAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZXNpLCVlYngKKwltb3ZsCSVlYXgsKCVlc3ApCisJYWRkbAklZWJ4LCVlZHgKKwlhbmRsCTQoJWVzcCksJWVheAorCWFkZGwJJWVjeCwlZWJ4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSQ0LCVlYnAKKwlhZGRsCSVlYngsJWVheAorCWNtcGwJJDMyNDgyMjI1ODAsJWVzaQorCWpuZQlMMDA3MDBfMTUKKwltb3ZsCTE1NiglZXNwKSwlZWN4CisJam1wCUwwMDgxNl82MworLmFsaWduCTQsMHg5MAorTDAwODE2XzYzOgorCW1vdmwJJWVjeCwlZWJ4CisJbW92bAkxMDQoJWVzcCksJWVzaQorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTE2MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMTI0KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCW1vdmwJJWVieCw5NiglZXNwKQorCXJvcmwJJDUsJWVjeAorCWFuZGwJJWVkeCwlZXNpCisJbW92bAklZWR4LDIwKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTMyKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsNCglZXNwKQorCWxlYWwJLTQoJWVzcCksJWVzcAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSglZWJwKSwlZXNpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCTIwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJbW92bAklZWF4LCglZXNwKQorCWFkZGwJJWVieCwlZWR4CisJYW5kbAk0KCVlc3ApLCVlYXgKKwlhZGRsCSVlY3gsJWVieAorCXhvcmwJJWVkaSwlZWF4CisJbW92bAkxNTYoJWVzcCksJWVjeAorCWFkZGwJJDQsJWVicAorCWFkZGwJJWVieCwlZWF4CisJY21wbAkkMzMyOTMyNTI5OCwlZXNpCisJam5lCUwwMDgxNl82MworCW1vdmwJMzU2KCVlc3ApLCVlc2kKKwltb3ZsCTgoJWVzcCksJWVieAorCW1vdmwJMTYoJWVzcCksJWVjeAorCWFkZGwJKCVlc2kpLCVlYXgKKwlhZGRsCTQoJWVzaSksJWVieAorCWFkZGwJOCglZXNpKSwlZWRpCisJYWRkbAkxMiglZXNpKSwlZWN4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJbW92bAklZWRpLDgoJWVzaSkKKwltb3ZsCSVlY3gsMTIoJWVzaSkKKwltb3ZsCTI0KCVlc3ApLCVlYXgKKwltb3ZsCTI4KCVlc3ApLCVlYngKKwltb3ZsCTMyKCVlc3ApLCVlY3gKKwltb3ZsCTM2MCglZXNwKSwlZWRpCisJYWRkbAkxNiglZXNpKSwlZWR4CisJYWRkbAkyMCglZXNpKSwlZWF4CisJYWRkbAkyNCglZXNpKSwlZWJ4CisJYWRkbAkyOCglZXNpKSwlZWN4CisJbW92bAklZWR4LDE2KCVlc2kpCisJbW92bAklZWF4LDIwKCVlc2kpCisJbW92bAklZWJ4LDI0KCVlc2kpCisJbW92bAklZWN4LDI4KCVlc2kpCisJbGVhbAkzNTYoJWVzcCksJWVzcAorCXN1YmwJJDI1NiwlZWJwCisJY21wbAk4KCVlc3ApLCVlZGkKKwlqYglMMDAybG9vcAorCW1vdmwJMTIoJWVzcCksJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTYsMHg5MAorTDAwMUsyNTY6CisubG9uZwkxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOTgKKy5sb25nCTY2MDUxLDY3NDM4MDg3LDEzNDgxMDEyMywyMDIxODIxNTkKKy5ieXRlCTgzLDcyLDY1LDUwLDUzLDU0LDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcKKy5ieXRlCTExMCwxMTUsMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw0NCwzMgorLmJ5dGUJNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3CisuYnl0ZQkxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzCisuYnl0ZQk2MiwwCisuYWxpZ24JNCwweDkwCitMMDA2dW5yb2xsZWQ6CisJbGVhbAktOTYoJWVzcCksJWVzcAorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVicAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWJ4CisJbW92bAklZWJwLDQoJWVzcCkKKwl4b3JsCSVlY3gsJWVicAorCW1vdmwJJWVjeCw4KCVlc3ApCisJbW92bAklZWJ4LDEyKCVlc3ApCisJbW92bAkxNiglZXNpKSwlZWR4CisJbW92bAkyMCglZXNpKSwlZWJ4CisJbW92bAkyNCglZXNpKSwlZWN4CisJbW92bAkyOCglZXNpKSwlZXNpCisJbW92bAklZWJ4LDIwKCVlc3ApCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZXNpLDI4KCVlc3ApCisJam1wCUwwMDlncmFuZF9sb29wCisuYWxpZ24JNCwweDkwCitMMDA5Z3JhbmRfbG9vcDoKKwltb3ZsCSglZWRpKSwlZWJ4CisJbW92bAk0KCVlZGkpLCVlY3gKKwlic3dhcAklZWJ4CisJbW92bAk4KCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDMyKCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCwzNiglZXNwKQorCW1vdmwJJWVzaSw0MCglZXNwKQorCW1vdmwJMTIoJWVkaSksJWVieAorCW1vdmwJMTYoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTIwKCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDQ0KCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw0OCglZXNwKQorCW1vdmwJJWVzaSw1MiglZXNwKQorCW1vdmwJMjQoJWVkaSksJWVieAorCW1vdmwJMjgoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTMyKCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDU2KCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw2MCglZXNwKQorCW1vdmwJJWVzaSw2NCglZXNwKQorCW1vdmwJMzYoJWVkaSksJWVieAorCW1vdmwJNDAoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTQ0KCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDY4KCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw3MiglZXNwKQorCW1vdmwJJWVzaSw3NiglZXNwKQorCW1vdmwJNDgoJWVkaSksJWVieAorCW1vdmwJNTIoJWVkaSksJWVjeAorCWJzd2FwCSVlYngKKwltb3ZsCTU2KCVlZGkpLCVlc2kKKwlic3dhcAklZWN4CisJbW92bAklZWJ4LDgwKCVlc3ApCisJYnN3YXAJJWVzaQorCW1vdmwJJWVjeCw4NCglZXNwKQorCW1vdmwJJWVzaSw4OCglZXNwKQorCW1vdmwJNjAoJWVkaSksJWVieAorCWFkZGwJJDY0LCVlZGkKKwlic3dhcAklZWJ4CisJbW92bAklZWRpLDEwMCglZXNwKQorCW1vdmwJJWVieCw5MiglZXNwKQorCW1vdmwJJWVkeCwlZWN4CisJbW92bAkyMCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkzMiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxMTE2MzUyNDA4KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJMzYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTE4OTk0NDc0NDEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAklZWR4LCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQwKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjAoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMzA0OTMyMzQ3MSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCW1vdmwJOCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAk0NCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTM5MjEwMDk1NzMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQ4KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk5NjE5ODcxNjMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJbW92bAkoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAk1MiglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTE1MDg5NzA5OTMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJJWVkeCwlZWN4CisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJNTYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJNCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTI0NTM2MzU3NDgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJbW92bAkyNCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAk2MCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyMCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCw0KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTI4NzA3NjMyMjEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJJWVkeCwlZWN4CisJbW92bAkyMCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk2NCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkzNjI0MzgxMDgwKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJNjgoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTMxMDU5ODQwMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJNzIoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk2MDcyMjUyNzgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJNzYoJWVzcCksJWVieAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxNDI2ODgxOTg3KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAklZWR4LCVlY3gKKwltb3ZsCTQoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4MCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMTIoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMTkyNTA3ODM4OCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCSglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCTg0KCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDI4KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTgoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMTIoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMjE2MjA3ODIwNiglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAklZWR4LCVlY3gKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4OCglZXNwKSwlZWJ4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMjYxNDg4ODEwMyglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAklZWR4LCVlc2kKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCTkyKCVlc3ApLCVlYngKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDIwKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCSglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDQoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzI0ODIyMjU4MCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTM2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4OCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAkzMiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCwzMiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjgoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMzgzNTM5MDQwMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk5MiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAkzNiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNzIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCwzNiglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTQwMjIyMjQ3NzQoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk0NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNzYoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw0MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNjQzNDcwNzgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk0OCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAkzNiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk0NCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJODAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDQ0KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTYwNDgwNzYyOCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTUyKCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJNDAoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNDgoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTg0KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAk0KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDQ4KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMTIoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJNzcwMjU1OTgzKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNTYoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTQ0KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTUyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJKCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDUyKCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTEyNDkxNTAxMjIoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk2MCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJNDgoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNTYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTkyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDU2KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMTU1NTA4MTY5MiglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk1MiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk2MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMzIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw2MCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJKCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxOTk2MDY0OTg2KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNjgoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTY0KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAkzNiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDY0KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNTU0MjIwODgyKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNzIoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTYwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTY4KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDY4KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwxMiglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkyNCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMjgoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMjgyMTgzNDM0OSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTc2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTcyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMTIoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDcyKCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTIwKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTI5NTI5OTY4MDgoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4MCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk2OCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk3NiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDc2KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTMyMTAzMTM2NzEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk4NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTcyKCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk1MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw4MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTMzMzY1NzE4OTEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4OCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJODQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsODQoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDI4KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTgoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMTIoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzU4NDUyODcxMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTkyKCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4MCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsODgoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTQoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxMTM5MjY5OTMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAkzMiglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJODQoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJOTIoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTY0KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkyNCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsOTIoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDIwKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCSglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDQoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzM4MjQxODk1KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJMzYoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTg4KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTMyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk2OCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDMyKCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk2NjYzMDcyMDUoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk0MCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJOTIoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJMzYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTcyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkxNiglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsMzYoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDEyKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTI0KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyOCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAk3NzM1Mjk5MTIoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk0NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAkzMiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNzYoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw0MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxMjk0NzU3MzcyKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNDgoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJMzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNDQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk4KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw0NCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxMzk2MTgyMjkxKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNTIoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk0MCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk0OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJODQoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTQoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsNDgoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkxNjk1MTgzNzAwKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNTYoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTQ0KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTUyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJKCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDUyKCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTE5ODY2NjEwNTEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk2MCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJNDgoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNTYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTkyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDU2KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMjE3NzAyNjM1MCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk1MiglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk2MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMzIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw2MCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJKCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkyNDU2OTU2MDM3KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNjgoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTY0KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAkzNiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDY0KCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyOCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNzMwNDg1OTIxKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNzIoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTYwKCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTY4KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0MCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDY4KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwxMiglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkyNCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMjgoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMjgyMDMwMjQxMSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTc2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTY0KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTcyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk0NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMTIoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAklZWJ4LDcyKCVlc3ApCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTIwKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTMyNTk3MzA4MDAoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4MCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk2OCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk3NiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTgoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDc2KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSw0KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTE2KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDIwKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTMzNDU3NjQ3NzEoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk4NCglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTcyKCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk1MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw4MCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTM1MTYwNjU4MTcoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk4OCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJODQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsODQoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDI4KCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCTgoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMTIoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMzYwMDM1MjgwNCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTkyKCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4MCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk4OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsODgoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTQoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAk0MDk0NTcxOTA5KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJMzIoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyMCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTg0KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTkyKCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk2NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMjQoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDkyKCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyMCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCw0KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTI3NTQyMzM0NCglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTM2KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk4OCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAkzMiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCwzMiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjgoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJNDMwMjI3NzM0KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNDAoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTkyKCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTM2KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk3MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJMTYoJWVzcCksJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDM2KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwxMiglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkyNCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsMjgoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJNTA2OTQ4NjE2KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNDQoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJMzIoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJNDAoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTc2KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkxMiglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsNDAoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjAoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWF4LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJNjU5MDYwNTU2KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJNDgoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJMzYoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNDQoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTgwKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk4KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw0NCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAk4ODM5OTc4NzcoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk1MiglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTQwKCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTQ4KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk4NCglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJNCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw0OCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwlhZGRsCTEyKCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTk1ODEzOTU3MSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk0NCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk1MiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJODgoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw1MiglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjgoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJOCglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwxMiglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkxMzIyODIyMjE4KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJNjAoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTQ4KCVlc3ApLCVlc2kKKwltb3ZsCSVlY3gsJWVieAorCXJvcmwJJDExLCVlY3gKKwltb3ZsCSVlc2ksJWVkaQorCXJvcmwJJDIsJWVzaQorCXhvcmwJJWVieCwlZWN4CisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZWN4CisJeG9ybAklZWRpLCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXJvcmwJJDE3LCVlc2kKKwlhZGRsCTU2KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk5MiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw1NiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJNCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYnAKKwlsZWFsCTE1MzcwMDIwNjMoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWJwCisJbW92bAk2NCglZXNwKSwlZXNpCisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYnAKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNTIoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNjAoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTMyKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkyNCglZXNwKSwlZWN4CisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZXNpLCVlZHgKKwltb3ZsCSVlYngsNjAoJWVzcCkKKwl4b3JsCSVlZGksJWVjeAorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVzaSwlZWN4CisJbW92bAklZXNpLDIwKCVlc3ApCisJeG9ybAklZXNpLCVlZHgKKwlhZGRsCSglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDQoJWVzcCkKKwl4b3JsCSVlZGksJWVicAorCXJvcmwJJDExLCVlc2kKKwlhbmRsCSVlYnAsJWVheAorCWxlYWwJMTc0Nzg3Mzc3OSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWRpLCVlYXgKKwltb3ZsCTY4KCVlc3ApLCVlY3gKKwlyb3JsCSQyLCVlc2kKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk1NiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk2NCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJMzYoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw2NCglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCWFkZGwJMjgoJWVzcCksJWVieAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwlZXNpCisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMTk1NTU2MjIyMiglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTcyKCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk2MCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk2OCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDAoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTE2KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw2OCglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMTIoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVieAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJwLCVlc2kKKwlhZGRsCSVlZGksJWVieAorCXJvcmwJJDksJWVzaQorCW1vdmwJJWVicCwlZWN4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDI4KCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTIwMjQxMDQ4MTUoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk3NiglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk2NCglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk3MiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNDQoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJJWVieCw3MiglZXNwKQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkyMCglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyMjI3NzMwNDUyKCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJODAoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVicAorCW1vdmwJNjgoJWVzcCksJWVjeAorCW1vdmwJJWVzaSwlZWJ4CisJcm9ybAkkMTEsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9ybAkkMiwlZWN4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlc2kKKwl4b3JsCSVlZGksJWVjeAorCXhvcmwJJWVzaSwlZWJ4CisJcm9ybAkkMTcsJWVjeAorCWFkZGwJNzYoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTQ4KCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVjeCwlZWRpCisJbW92bAk4KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCW1vdmwJJWVieCw3NiglZXNwKQorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksNCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAkxNiglZXNwKSwlZWJ4CisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZXNpCisJbW92bAklZWJwLCVlY3gKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVicCwyMCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkyMzYxODUyNDI0KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJODQoJWVzcCksJWVjeAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJbW92bAk3MiglZXNwKSwlZXNpCisJbW92bAklZWN4LCVlYngKKwlyb3JsCSQxMSwlZWN4CisJbW92bAklZXNpLCVlZGkKKwlyb3JsCSQyLCVlc2kKKwl4b3JsCSVlYngsJWVjeAorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVjeAorCXhvcmwJJWVkaSwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQxNywlZXNpCisJYWRkbAk4MCglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNTIoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZWN4CisJeG9ybAklZXNpLCVlZGkKKwltb3ZsCTQoJWVzcCksJWVzaQorCXJvcmwJJDE0LCVlZHgKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSVlYngsODAoJWVzcCkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAkxMiglZXNwKSwlZWJ4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LCVlc2kKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlYXgsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJwCisJbGVhbAkyNDI4NDM2NDc0KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZXNpLCVlY3gKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJODgoJWVzcCksJWVzaQorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJwCisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYnAKKwltb3ZsCTc2KCVlc3ApLCVlY3gKKwltb3ZsCSVlc2ksJWVieAorCXJvcmwJJDExLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvcmwJJDIsJWVjeAorCXhvcmwJJWVieCwlZXNpCisJc2hybAkkMywlZWJ4CisJcm9ybAkkNywlZXNpCisJeG9ybAklZWRpLCVlY3gKKwl4b3JsCSVlc2ksJWVieAorCXJvcmwJJDE3LCVlY3gKKwlhZGRsCTg0KCVlc3ApLCVlYngKKwlzaHJsCSQxMCwlZWRpCisJYWRkbAk1NiglZXNwKSwlZWJ4CisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJKCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVzaSwlZWR4CisJbW92bAklZWJ4LDg0KCVlc3ApCisJeG9ybAklZWRpLCVlY3gKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlc2ksJWVjeAorCW1vdmwJJWVzaSwyOCglZXNwKQorCXhvcmwJJWVzaSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWJwLDEyKCVlc3ApCisJeG9ybAklZWRpLCVlYnAKKwlyb3JsCSQxMSwlZXNpCisJYW5kbAklZWJwLCVlYXgKKwlsZWFsCTI3NTY3MzQxODcoJWVieCwlZWR4LDEpLCVlZHgKKwl4b3JsCSVlY3gsJWVzaQorCXhvcmwJJWVkaSwlZWF4CisJbW92bAk5MiglZXNwKSwlZWN4CisJcm9ybAkkMiwlZXNpCisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlc2ksJWVheAorCW1vdmwJODAoJWVzcCksJWVzaQorCW1vdmwJJWVjeCwlZWJ4CisJcm9ybAkkMTEsJWVjeAorCW1vdmwJJWVzaSwlZWRpCisJcm9ybAkkMiwlZXNpCisJeG9ybAklZWJ4LCVlY3gKKwlzaHJsCSQzLCVlYngKKwlyb3JsCSQ3LCVlY3gKKwl4b3JsCSVlZGksJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkMTcsJWVzaQorCWFkZGwJODgoJWVzcCksJWVieAorCXNocmwJJDEwLCVlZGkKKwlhZGRsCTYwKCVlc3ApLCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXhvcmwJJWVzaSwlZWRpCisJbW92bAkyOCglZXNwKSwlZXNpCisJcm9ybAkkMTQsJWVkeAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJYWRkbAk0KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVheCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVicAorCWxlYWwJMzIwNDAzMTQ3OSglZWJ4LCVlZHgsMSksJWVkeAorCXhvcmwJJWVzaSwlZWN4CisJeG9ybAklZWRpLCVlYnAKKwltb3ZsCTMyKCVlc3ApLCVlc2kKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVicAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJwCisJbW92bAk4NCglZXNwKSwlZWN4CisJbW92bAklZXNpLCVlYngKKwlyb3JsCSQxMSwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlyb3JsCSQyLCVlY3gKKwl4b3JsCSVlYngsJWVzaQorCXNocmwJJDMsJWVieAorCXJvcmwJJDcsJWVzaQorCXhvcmwJJWVkaSwlZWN4CisJeG9ybAklZXNpLCVlYngKKwlyb3JsCSQxNywlZWN4CisJYWRkbAk5MiglZXNwKSwlZWJ4CisJc2hybAkkMTAsJWVkaQorCWFkZGwJNjQoJWVzcCksJWVieAorCW1vdmwJJWVkeCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJYWRkbAklZWRpLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlc2ksJWVkeAorCXhvcmwJJWVkaSwlZWN4CisJcm9ybAkkNSwlZWR4CisJYW5kbAklZXNpLCVlY3gKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwl4b3JsCSVlc2ksJWVkeAorCWFkZGwJKCVlc3ApLCVlYngKKwl4b3JsCSVlY3gsJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVicCwlZXNpCisJYWRkbAklZWRpLCVlYngKKwlyb3JsCSQ5LCVlc2kKKwltb3ZsCSVlYnAsJWVjeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJcm9ybAkkMTEsJWVzaQorCWFuZGwJJWVicCwlZWF4CisJbGVhbAkzMzI5MzI1Mjk4KCVlYngsJWVkeCwxKSwlZWR4CisJeG9ybAklZWN4LCVlc2kKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVzaQorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZsCTk2KCVlc3ApLCVlc2kKKwl4b3JsCSVlZGksJWVicAorCW1vdmwJMTIoJWVzcCksJWVjeAorCWFkZGwJKCVlc2kpLCVlYXgKKwlhZGRsCTQoJWVzaSksJWVicAorCWFkZGwJOCglZXNpKSwlZWRpCisJYWRkbAkxMiglZXNpKSwlZWN4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVicCw0KCVlc2kpCisJbW92bAklZWRpLDgoJWVzaSkKKwltb3ZsCSVlY3gsMTIoJWVzaSkKKwltb3ZsCSVlYnAsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJwCisJbW92bAklZWRpLDgoJWVzcCkKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlY3gKKwlhZGRsCTE2KCVlc2kpLCVlZHgKKwlhZGRsCTIwKCVlc2kpLCVlZGkKKwlhZGRsCTI0KCVlc2kpLCVlYngKKwlhZGRsCTI4KCVlc2kpLCVlY3gKKwltb3ZsCSVlZHgsMTYoJWVzaSkKKwltb3ZsCSVlZGksMjAoJWVzaSkKKwltb3ZsCSVlYngsMjQoJWVzaSkKKwltb3ZsCSVlY3gsMjgoJWVzaSkKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwltb3ZsCTEwMCglZXNwKSwlZWRpCisJbW92bAklZWJ4LDI0KCVlc3ApCisJbW92bAklZWN4LDI4KCVlc3ApCisJY21wbAkxMDQoJWVzcCksJWVkaQorCWpiCUwwMDlncmFuZF9sb29wCisJbW92bAkxMDgoJWVzcCksJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTUsMHg5MAorTDAwNVNTU0UzOgorCWxlYWwJLTk2KCVlc3ApLCVlc3AKKwltb3ZsCSglZXNpKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCTgoJWVzaSksJWVjeAorCW1vdmwJMTIoJWVzaSksJWVkaQorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWN4LCVlYngKKwltb3ZsCSVlY3gsOCglZXNwKQorCW1vdmwJJWVkaSwxMiglZXNwKQorCW1vdmwJMTYoJWVzaSksJWVkeAorCW1vdmwJMjAoJWVzaSksJWVkaQorCW1vdmwJMjQoJWVzaSksJWVjeAorCW1vdmwJMjgoJWVzaSksJWVzaQorCW1vdmwJJWVkaSwyMCglZXNwKQorCW1vdmwJMTAwKCVlc3ApLCVlZGkKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwltb3ZsCSVlc2ksMjgoJWVzcCkKKwltb3ZkcWEJMjU2KCVlYnApLCV4bW03CisJam1wCUwwMTBncmFuZF9zc3NlMworLmFsaWduCTQsMHg5MAorTDAxMGdyYW5kX3Nzc2UzOgorCW1vdmRxdQkoJWVkaSksJXhtbTAKKwltb3ZkcXUJMTYoJWVkaSksJXhtbTEKKwltb3ZkcXUJMzIoJWVkaSksJXhtbTIKKwltb3ZkcXUJNDgoJWVkaSksJXhtbTMKKwlhZGRsCSQ2NCwlZWRpCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwltb3ZsCSVlZGksMTAwKCVlc3ApCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDcKKwltb3ZkcWEJKCVlYnApLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKwltb3ZkcWEJMTYoJWVicCksJXhtbTUKKwlwYWRkZAkleG1tMCwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjIzCisJbW92ZHFhCTMyKCVlYnApLCV4bW02CisJcGFkZGQJJXhtbTEsJXhtbTUKKwltb3ZkcWEJNDgoJWVicCksJXhtbTcKKwltb3ZkcWEJJXhtbTQsMzIoJWVzcCkKKwlwYWRkZAkleG1tMiwleG1tNgorCW1vdmRxYQkleG1tNSw0OCglZXNwKQorCXBhZGRkCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW02LDY0KCVlc3ApCisJbW92ZHFhCSV4bW03LDgwKCVlc3ApCisJam1wCUwwMTFzc3NlM18wMF80NworLmFsaWduCTQsMHg5MAorTDAxMXNzc2UzXzAwXzQ3OgorCWFkZGwJJDY0LCVlYnAKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmRxYQkleG1tMSwleG1tNAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZkcWEJJXhtbTMsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNCw0CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1MCw0CisJbW92bAklZWN4LDE2KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmRxYQkleG1tNCwleG1tNQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXBzcmxkCSQzLCV4bW00CisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNywleG1tMAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXBzcmxkCSQ3LCV4bW02CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwlwc2h1ZmQJJDI1MCwleG1tMywleG1tNworCXhvcmwJJWVzaSwlZWN4CisJYWRkbAkzMiglZXNwKSwlZWR4CisJcHNsbGQJJDE0LCV4bW01CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlwc3JsZAkkMTEsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCXBzbGxkCSQxMSwleG1tNQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJcHhvcgkleG1tNiwleG1tNAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJcHNybGQJJDEwLCV4bW03CisJbW92bAkoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTQsJXhtbTAKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXBzcmxxCSQxNywleG1tNgorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJcHNybHEJJDIsJXhtbTYKKwlhZGRsCTM2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCXBzcmxkcQkkOCwleG1tNworCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXBhZGRkCSV4bW03LCV4bW0wCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJcHNodWZkCSQ4MCwleG1tMCwleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJcHNybGQJJDEwLCV4bW03CisJYW5kbAklZWF4LCVlYngKKwlwc3JscQkkMTcsJXhtbTYKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNDAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJcHhvcgkleG1tNiwleG1tNworCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlwc3JscQkkMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwlwc2h1ZmQJJDgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCW1vdmRxYQkoJWVicCksJXhtbTYKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw0KCVlc3ApCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCXBhZGRkCSV4bW03LCV4bW0wCisJbW92bAklZWJ4LDIwKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMTYoJWVzcCksJWVkeAorCXBhZGRkCSV4bW0wLCV4bW02CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTQ0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92ZHFhCSV4bW02LDMyKCVlc3ApCisJbW92bAklZWR4LCVlY3gKKwltb3ZkcWEJJXhtbTIsJXhtbTQKKwlyb3JsCSQxNCwlZWR4CisJbW92bAk0KCVlc3ApLCVlc2kKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI1LDQKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjUxLDQKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmRxYQkleG1tNCwleG1tNQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwlwc3JsZAkkMywleG1tNAorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTcsJXhtbTEKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXBzcmxkCSQ3LCV4bW02CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwlwc2h1ZmQJJDI1MCwleG1tMCwleG1tNworCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk0OCglZXNwKSwlZWR4CisJcHNsbGQJJDE0LCV4bW01CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlwc3JsZAkkMTEsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwlwc2xsZAkkMTEsJXhtbTUKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJcHhvcgkleG1tNiwleG1tNAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI4KCVlc3ApCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJcHNybGQJJDEwLCV4bW03CisJbW92bAkxNiglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNCwleG1tMQorCW1vdmwJJWVieCwxMiglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJcHNybHEJJDE3LCV4bW02CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTgoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlweG9yCSV4bW02LCV4bW03CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCXBzcmxxCSQyLCV4bW02CisJYWRkbAk1MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW03CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlwc2h1ZmQJJDEyOCwleG1tNywleG1tNworCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCXBzcmxkcQkkOCwleG1tNworCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlwYWRkZAkleG1tNywleG1tMQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJcHNodWZkCSQ4MCwleG1tMSwleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTQoJWVzcCksJWVkeAorCW1vdmRxYQkleG1tNywleG1tNgorCXJvcmwJJDExLCVlY3gKKwlwc3JsZAkkMTAsJXhtbTcKKwlhbmRsCSVlYXgsJWVieAorCXBzcmxxCSQxNywleG1tNgorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk1NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW03CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlwc3JscQkkMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJcHNodWZkCSQ4LCV4bW03LCV4bW03CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwltb3ZkcWEJMTYoJWVicCksJXhtbTYKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyMCglZXNwKQorCXBzbGxkcQkkOCwleG1tNworCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCXBhZGRkCSV4bW03LCV4bW0xCisJbW92bAklZWJ4LDQoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkoJWVzcCksJWVkeAorCXBhZGRkCSV4bW0xLCV4bW02CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTYwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZkcWEJJXhtbTYsNDgoJWVzcCkKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmRxYQkleG1tMywleG1tNAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwltb3ZkcWEJJXhtbTEsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNiw0CisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0OCw0CisJbW92bAklZWN4LDE2KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCW1vdmRxYQkleG1tNCwleG1tNQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJbW92ZHFhCSV4bW00LCV4bW02CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXBzcmxkCSQzLCV4bW00CisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNywleG1tMgorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXBzcmxkCSQ3LCV4bW02CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwlwc2h1ZmQJJDI1MCwleG1tMSwleG1tNworCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk2NCglZXNwKSwlZWR4CisJcHNsbGQJJDE0LCV4bW01CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlweG9yCSV4bW02LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlwc3JsZAkkMTEsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCXBzbGxkCSQxMSwleG1tNQorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJcHhvcgkleG1tNiwleG1tNAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJcHNybGQJJDEwLCV4bW03CisJbW92bAkoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTQsJXhtbTIKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXBzcmxxCSQxNywleG1tNgorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJcHNybHEJJDIsJXhtbTYKKwlhZGRsCTY4KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCXBzcmxkcQkkOCwleG1tNworCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXBhZGRkCSV4bW03LCV4bW0yCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJcHNodWZkCSQ4MCwleG1tMiwleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJcHNybGQJJDEwLCV4bW03CisJYW5kbAklZWF4LCVlYngKKwlwc3JscQkkMTcsJXhtbTYKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNzIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJcHhvcgkleG1tNiwleG1tNworCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlwc3JscQkkMiwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwlwc2h1ZmQJJDgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCW1vdmRxYQkzMiglZWJwKSwleG1tNgorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDQoJWVzcCkKKwlwc2xsZHEJJDgsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTcsJXhtbTIKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJcGFkZGQJJXhtbTIsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNzYoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZkcWEJJXhtbTYsNjQoJWVzcCkKKwltb3ZsCSVlZHgsJWVjeAorCW1vdmRxYQkleG1tMCwleG1tNAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVzaQorCW1vdmRxYQkleG1tMiwleG1tNworCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjcsNAorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDksNAorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJbW92ZHFhCSV4bW00LCV4bW01CisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXBzcmxkCSQzLCV4bW00CisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwlwYWRkZAkleG1tNywleG1tMworCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJcHNybGQJJDcsJXhtbTYKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMTIoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXBzaHVmZAkkMjUwLCV4bW0yLCV4bW03CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTgwKCVlc3ApLCVlZHgKKwlwc2xsZAkkMTQsJXhtbTUKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTQKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjgoJWVzcCksJWVkeAorCXBzcmxkCSQxMSwleG1tNgorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCXBzbGxkCSQxMSwleG1tNQorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlweG9yCSV4bW02LCV4bW00CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjgoJWVzcCkKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwlwc3JsZAkkMTAsJXhtbTcKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCXBhZGRkCSV4bW00LCV4bW0zCisJbW92bAklZWJ4LDEyKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwlwc3JscQkkMTcsJXhtbTYKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJOCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJcHNybHEJJDIsJXhtbTYKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXBzaHVmZAkkMTI4LCV4bW03LCV4bW03CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJcHNybGRxCSQ4LCV4bW03CisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXBhZGRkCSV4bW03LCV4bW0zCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwlwc2h1ZmQJJDgwLCV4bW0zLCV4bW03CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJNCglZXNwKSwlZWR4CisJbW92ZHFhCSV4bW03LCV4bW02CisJcm9ybAkkMTEsJWVjeAorCXBzcmxkCSQxMCwleG1tNworCWFuZGwJJWVheCwlZWJ4CisJcHNybHEJJDE3LCV4bW02CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTg4KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCXB4b3IJJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjAoJWVzcCksJWVkeAorCXBzcmxxCSQyLCV4bW02CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwlweG9yCSV4bW02LCV4bW03CisJbW92bAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwlwc2h1ZmQJJDgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCW1vdmRxYQk0OCglZWJwKSwleG1tNgorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDIwKCVlc3ApCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJcGFkZGQJJXhtbTcsJXhtbTMKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSglZXNwKSwlZWR4CisJcGFkZGQJJXhtbTMsJXhtbTYKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJOTIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmRxYQkleG1tNiw4MCglZXNwKQorCWNtcGwJJDY2MDUxLDY0KCVlYnApCisJam5lCUwwMTFzc3NlM18wMF80NworCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMjAoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkyOCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTMyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVieCwyOCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJMzYoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkxMiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMjAoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk0MCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVieCwyMCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNDQoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkxMiglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTQ4KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCSglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWJ4LDEyKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJOCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTUyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJNCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTU2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjAoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTYwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXJvcmwJJDE0LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsKCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMjgoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk2NCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYngsMjgoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTY4KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJcm9ybAkkMTQsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVheCwyNCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlyb3JsCSQxMSwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNzIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJcm9ybAkkMiwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAk4KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJcm9ybAkkNSwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJcm9ybAkkMTEsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTc2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvcmwJJDIsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAk0KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJcm9ybAkkNiwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMTIoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk4MCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI4KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvcmwJJDksJWVjeAorCW1vdmwJJWVieCwxMiglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTgoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk4NCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMjQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlyb3JsCSQ1LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlyb3JsCSQ2LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxMiglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb3JsCSQ5LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTQoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk4OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMjAoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAklZWR4LCVlY3gKKwlyb3JsCSQxNCwlZWR4CisJbW92bAkyNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXJvcmwJJDUsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDIwKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXJvcmwJJDYsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9ybAkkOSwlZWN4CisJbW92bAklZWJ4LDQoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkoJWVzcCksJWVkeAorCXJvcmwJJDExLCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk5MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlyb3JsCSQyLCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJMTYoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAk5NiglZXNwKSwlZXNpCisJeG9ybAklZWRpLCVlYngKKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwlhZGRsCSglZXNpKSwlZWF4CisJYWRkbAk0KCVlc2kpLCVlYngKKwlhZGRsCTgoJWVzaSksJWVkaQorCWFkZGwJMTIoJWVzaSksJWVjeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVkaSw4KCVlc2kpCisJbW92bAklZWN4LDEyKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzcCkKKwl4b3JsCSVlZGksJWVieAorCW1vdmwJJWVkaSw4KCVlc3ApCisJbW92bAklZWN4LDEyKCVlc3ApCisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkyNCglZXNwKSwlZWN4CisJYWRkbAkxNiglZXNpKSwlZWR4CisJYWRkbAkyMCglZXNpKSwlZWRpCisJYWRkbAkyNCglZXNpKSwlZWN4CisJbW92bAklZWR4LDE2KCVlc2kpCisJbW92bAklZWRpLDIwKCVlc2kpCisJbW92bAklZWRpLDIwKCVlc3ApCisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAklZWN4LDI0KCVlc2kpCisJYWRkbAkyOCglZXNpKSwlZWRpCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZWRpLDI4KCVlc2kpCisJbW92bAklZWRpLDI4KCVlc3ApCisJbW92bAkxMDAoJWVzcCksJWVkaQorCW1vdmRxYQk2NCglZWJwKSwleG1tNworCXN1YmwJJDE5MiwlZWJwCisJY21wbAkxMDQoJWVzcCksJWVkaQorCWpiCUwwMTBncmFuZF9zc3NlMworCW1vdmwJMTA4KCVlc3ApLCVlc3AKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgk1LDB4OTAKK0wwMDRBVlg6CisJbGVhbAktOTYoJWVzcCksJWVzcAorCXZ6ZXJvYWxsCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAk4KCVlc2kpLCVlY3gKKwltb3ZsCTEyKCVlc2kpLCVlZGkKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVjeCwlZWJ4CisJbW92bAklZWN4LDgoJWVzcCkKKwltb3ZsCSVlZGksMTIoJWVzcCkKKwltb3ZsCTE2KCVlc2kpLCVlZHgKKwltb3ZsCTIwKCVlc2kpLCVlZGkKKwltb3ZsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCTI4KCVlc2kpLCVlc2kKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwltb3ZsCTEwMCglZXNwKSwlZWRpCisJbW92bAklZWN4LDI0KCVlc3ApCisJbW92bAklZXNpLDI4KCVlc3ApCisJdm1vdmRxYQkyNTYoJWVicCksJXhtbTcKKwlqbXAJTDAxMmdyYW5kX2F2eAorLmFsaWduCTUsMHg5MAorTDAxMmdyYW5kX2F2eDoKKwl2bW92ZHF1CSglZWRpKSwleG1tMAorCXZtb3ZkcXUJMTYoJWVkaSksJXhtbTEKKwl2bW92ZHF1CTMyKCVlZGkpLCV4bW0yCisJdm1vdmRxdQk0OCglZWRpKSwleG1tMworCWFkZGwJJDY0LCVlZGkKKwl2cHNodWZiCSV4bW03LCV4bW0wLCV4bW0wCisJbW92bAklZWRpLDEwMCglZXNwKQorCXZwc2h1ZmIJJXhtbTcsJXhtbTEsJXhtbTEKKwl2cHNodWZiCSV4bW03LCV4bW0yLCV4bW0yCisJdnBhZGRkCSglZWJwKSwleG1tMCwleG1tNAorCXZwc2h1ZmIJJXhtbTcsJXhtbTMsJXhtbTMKKwl2cGFkZGQJMTYoJWVicCksJXhtbTEsJXhtbTUKKwl2cGFkZGQJMzIoJWVicCksJXhtbTIsJXhtbTYKKwl2cGFkZGQJNDgoJWVicCksJXhtbTMsJXhtbTcKKwl2bW92ZHFhCSV4bW00LDMyKCVlc3ApCisJdm1vdmRxYQkleG1tNSw0OCglZXNwKQorCXZtb3ZkcWEJJXhtbTYsNjQoJWVzcCkKKwl2bW92ZHFhCSV4bW03LDgwKCVlc3ApCisJam1wCUwwMTNhdnhfMDBfNDcKKy5hbGlnbgk0LDB4OTAKK0wwMTNhdnhfMDBfNDc6CisJYWRkbAkkNjQsJWVicAorCXZwYWxpZ25yCSQ0LCV4bW0wLCV4bW0xLCV4bW00CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZXNpCisJdnBhbGlnbnIJJDQsJXhtbTIsJXhtbTMsJXhtbTcKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJdnBzcmxkCSQ3LCV4bW00LCV4bW02CisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTYoJWVzcCkKKwl2cGFkZGQJJXhtbTcsJXhtbTAsJXhtbTAKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxkCSQzLCV4bW00LCV4bW03CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJdnBzbGxkCSQxNCwleG1tNCwleG1tNQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXZweG9yCSV4bW02LCV4bW03LCV4bW00CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMjgoJWVzcCksJWVkeAorCXZwc2h1ZmQJJDI1MCwleG1tMywleG1tNworCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJdnBzcmxkCSQxMSwleG1tNiwleG1tNgorCWFkZGwJMzIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJMTIoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBzbGxkCSQxMSwleG1tNSwleG1tNQorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVzaQorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxMiglZXNwKQorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTUKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXZwYWRkZAkleG1tNCwleG1tMCwleG1tMAorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDI4KCVlc3ApCisJdnB4b3IJJXhtbTUsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJdnBzcmxxCSQxOSwleG1tNywleG1tNworCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlhZGRsCTM2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCXZwc2h1ZmQJJDEzMiwleG1tNiwleG1tNworCWFkZGwJJWVkeCwlZWF4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCXZwc3JsZHEJJDgsJXhtbTcsJXhtbTcKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwl2cGFkZGQJJXhtbTcsJXhtbTAsJXhtbTAKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJdnBzaHVmZAkkODAsJXhtbTAsJXhtbTcKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw4KCVlc3ApCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybHEJJDE3LCV4bW03LCV4bW01CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl2cHNybHEJJDE5LCV4bW03LCV4bW03CisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMjAoJWVzcCksJWVkeAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwl2cHNodWZkCSQyMzIsJXhtbTYsJXhtbTcKKwlhZGRsCTQwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCXZwc2xsZHEJJDgsJXhtbTcsJXhtbTcKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cGFkZGQJJXhtbTcsJXhtbTAsJXhtbTAKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVzaQorCXZwYWRkZAkoJWVicCksJXhtbTAsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTQ0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJdm1vdmRxYQkleG1tNiwzMiglZXNwKQorCXZwYWxpZ25yCSQ0LCV4bW0xLCV4bW0yLCV4bW00CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlc2kKKwl2cGFsaWducgkkNCwleG1tMywleG1tMCwleG1tNworCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXZwYWRkZAkleG1tNywleG1tMSwleG1tMQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybGQJJDMsJXhtbTQsJXhtbTcKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJdnBzbGxkCSQxNCwleG1tNCwleG1tNQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTQKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkxMiglZXNwKSwlZWR4CisJdnBzaHVmZAkkMjUwLCV4bW0wLCV4bW03CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwl2cHNybGQJJDExLCV4bW02LCV4bW02CisJYWRkbAk0OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHNsbGQJJDExLCV4bW01LCV4bW01CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkoJWVzcCksJWVzaQorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI4KCVlc3ApCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxxCSQxNywleG1tNywleG1tNQorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl2cGFkZGQJJXhtbTQsJXhtbTEsJXhtbTEKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCwxMiglZXNwKQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJOCglZXNwKSwlZWR4CisJdnBzcmxxCSQxOSwleG1tNywleG1tNworCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlhZGRsCTUyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCXZwc2h1ZmQJJDEzMiwleG1tNiwleG1tNworCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwl2cHNybGRxCSQ4LCV4bW03LCV4bW03CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZXNpCisJdnBhZGRkCSV4bW03LCV4bW0xLCV4bW0xCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNodWZkCSQ4MCwleG1tMSwleG1tNworCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybHEJJDE3LCV4bW03LCV4bW01CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXZwc3JscQkkMTksJXhtbTcsJXhtbTcKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJdnBzaHVmZAkkMjMyLCV4bW02LCV4bW03CisJYWRkbAk1NiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNsbGRxCSQ4LCV4bW03LCV4bW03CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwYWRkZAkleG1tNywleG1tMSwleG1tMQorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVzaQorCXZwYWRkZAkxNiglZWJwKSwleG1tMSwleG1tNgorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyMCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJKCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNjAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCXZtb3ZkcWEJJXhtbTYsNDgoJWVzcCkKKwl2cGFsaWducgkkNCwleG1tMiwleG1tMywleG1tNAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjAoJWVzcCksJWVzaQorCXZwYWxpZ25yCSQ0LCV4bW0wLCV4bW0xLCV4bW03CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDE2KCVlc3ApCisJdnBhZGRkCSV4bW03LCV4bW0yLCV4bW0yCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCXZwc3JsZAkkMywleG1tNCwleG1tNworCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXZwc2xsZAkkMTQsJXhtbTQsJXhtbTUKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl2cHhvcgkleG1tNiwleG1tNywleG1tNAorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwl2cHNodWZkCSQyNTAsJXhtbTEsJXhtbTcKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXZwc3JsZAkkMTEsJXhtbTYsJXhtbTYKKwlhZGRsCTY0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwc2xsZAkkMTEsJXhtbTUsJXhtbTUKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybHEJJDE3LCV4bW03LCV4bW01CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl2cGFkZGQJJXhtbTQsJXhtbTIsJXhtbTIKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCwyOCglZXNwKQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXZwc3JscQkkMTksJXhtbTcsJXhtbTcKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAk2OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNodWZkCSQxMzIsJXhtbTYsJXhtbTcKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwl2cHNybGRxCSQ4LCV4bW03LCV4bW03CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkxMiglZXNwKSwlZXNpCisJdnBhZGRkCSV4bW03LCV4bW0yLCV4bW0yCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc2h1ZmQJJDgwLCV4bW0yLCV4bW03CisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxxCSQxNywleG1tNywleG1tNQorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwl2cHhvcgkleG1tNSwleG1tNiwleG1tNgorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJdnBzcmxxCSQxOSwleG1tNywleG1tNworCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJdnBzaHVmZAkkMjMyLCV4bW02LCV4bW03CisJYWRkbAk3MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNsbGRxCSQ4LCV4bW03LCV4bW03CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTQoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBhZGRkCSV4bW03LCV4bW0yLCV4bW0yCisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlc2kKKwl2cGFkZGQJMzIoJWVicCksJXhtbTIsJXhtbTYKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsNCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMjAoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTc2KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJdm1vdmRxYQkleG1tNiw2NCglZXNwKQorCXZwYWxpZ25yCSQ0LCV4bW0zLCV4bW0wLCV4bW00CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAk0KCVlc3ApLCVlc2kKKwl2cGFsaWducgkkNCwleG1tMSwleG1tMiwleG1tNworCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXZwYWRkZAkleG1tNywleG1tMywleG1tMworCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybGQJJDMsJXhtbTQsJXhtbTcKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJdnBzbGxkCSQxNCwleG1tNCwleG1tNQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDE2KCVlc3ApCisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTQKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkxMiglZXNwKSwlZWR4CisJdnBzaHVmZAkkMjUwLCV4bW0yLCV4bW03CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwl2cHNybGQJJDExLCV4bW02LCV4bW02CisJYWRkbAk4MCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHNsbGQJJDExLCV4bW01LCV4bW01CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkoJWVzcCksJWVzaQorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI4KCVlc3ApCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJdnBzcmxxCSQxNywleG1tNywleG1tNQorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl2cGFkZGQJJXhtbTQsJXhtbTMsJXhtbTMKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCwxMiglZXNwKQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJOCglZXNwKSwlZWR4CisJdnBzcmxxCSQxOSwleG1tNywleG1tNworCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCXZwc2h1ZmQJJDEzMiwleG1tNiwleG1tNworCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwl2cHNybGRxCSQ4LCV4bW03LCV4bW03CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZXNpCisJdnBhZGRkCSV4bW03LCV4bW0zLCV4bW0zCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCSglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwl2cHNodWZkCSQ4MCwleG1tMywleG1tNworCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwl2cHNybHEJJDE3LCV4bW03LCV4bW01CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsOCglZXNwKQorCXZwc3JscQkkMTksJXhtbTcsJXhtbTcKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJdnBzaHVmZAkkMjMyLCV4bW02LCV4bW03CisJYWRkbAk4OCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwl2cHNsbGRxCSQ4LCV4bW03LCV4bW03CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwYWRkZAkleG1tNywleG1tMywleG1tMworCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVzaQorCXZwYWRkZAk0OCglZWJwKSwleG1tMywleG1tNgorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyMCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJKCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJOTIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCXZtb3ZkcWEJJXhtbTYsODAoJWVzcCkKKwljbXBsCSQ2NjA1MSw2NCglZWJwKQorCWpuZQlMMDEzYXZ4XzAwXzQ3CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDE2KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LCglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJMzIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxMiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDI4KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMjQoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAkzNiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsMjQoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTQwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJOCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDIwKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJMTYoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYngsJWVheAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk0NCglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVheAorCWFkZGwJKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJNCglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsKCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwxNiglZXNwKQorCXhvcmwJJWVheCwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCTEyKCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNDgoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTI4KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJKCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyOCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkxNiglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsMTIoJWVzcCkKKwl4b3JsCSVlYngsJWVjeAorCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAk4KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNTIoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDgoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAk0KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWF4LCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNTYoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWJ4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYngKKwlhZGRsCTIwKCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyOCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwyMCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYngsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCw0KCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJKCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNjAoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlhZGRsCSVlY3gsJWVheAorCW1vdmwJJWVkeCwlZWN4CisJc2hyZGwJJDE0LCVlZHgsJWVkeAorCW1vdmwJMjAoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkyNCglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCwxNiglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAk0KCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCwoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkyOCglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTY0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkxMiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjAoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCwyOCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTI0KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNjgoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCTgoJWVzcCksJWVkeAorCWFkZGwJJWVjeCwlZWF4CisJbW92bAklZWR4LCVlY3gKKwlzaHJkbAkkMTQsJWVkeCwlZWR4CisJbW92bAkxMiglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTE2KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWF4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCW1vdmwJJWVheCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWF4LDI0KCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJMjAoJWVzcCksJWVkeAorCXNocmRsCSQxMSwlZWN4LCVlY3gKKwlhbmRsCSVlYXgsJWVieAorCXhvcmwJJWVzaSwlZWN4CisJYWRkbAk3MiglZXNwKSwlZWR4CisJeG9ybAklZWRpLCVlYngKKwlzaHJkbAkkMiwlZWN4LCVlY3gKKwlhZGRsCSVlZHgsJWVieAorCWFkZGwJNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTgoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAkxMiglZXNwKSwlZWRpCisJeG9ybAklZWRpLCVlc2kKKwlzaHJkbAkkNSwlZWR4LCVlZHgKKwlhbmRsCSVlY3gsJWVzaQorCW1vdmwJJWVjeCw0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVieCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVieCwyMCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCTE2KCVlc3ApLCVlZHgKKwlzaHJkbAkkMTEsJWVjeCwlZWN4CisJYW5kbAklZWJ4LCVlYXgKKwl4b3JsCSVlc2ksJWVjeAorCWFkZGwJNzYoJWVzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJc2hyZGwJJDIsJWVjeCwlZWN4CisJYWRkbAklZWR4LCVlYXgKKwlhZGRsCSglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVzaQorCXhvcmwJJWVjeCwlZWR4CisJbW92bAk4KCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LCglZXNwKQorCXhvcmwJJWVjeCwlZWR4CisJeG9ybAklZXNpLCVlZGkKKwlzaHJkbAkkNiwlZWR4LCVlZHgKKwltb3ZsCSVlYXgsJWVjeAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYXgsMTYoJWVzcCkKKwl4b3JsCSVlYXgsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAkxMiglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTgwKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyOCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCSglZXNwKSwlZXNpCisJeG9ybAklZWN4LCVlZHgKKwltb3ZsCTQoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjgoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJMTYoJWVzcCksJWVkaQorCW1vdmwJJWVieCwlZXNpCisJc2hyZGwJJDksJWVjeCwlZWN4CisJbW92bAklZWJ4LDEyKCVlc3ApCisJeG9ybAklZWJ4LCVlY3gKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJOCglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTg0KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkyNCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTI4KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJKCVlc3ApLCVlZGkKKwl4b3JsCSVlZGksJWVzaQorCXNocmRsCSQ1LCVlZHgsJWVkeAorCWFuZGwJJWVjeCwlZXNpCisJbW92bAklZWN4LDI0KCVlc3ApCisJeG9ybAklZWN4LCVlZHgKKwl4b3JsCSVlc2ksJWVkaQorCXNocmRsCSQ2LCVlZHgsJWVkeAorCW1vdmwJJWVheCwlZWN4CisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNocmRsCSQ5LCVlY3gsJWVjeAorCW1vdmwJJWVheCw4KCVlc3ApCisJeG9ybAklZWF4LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJNCglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVheCwlZWJ4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTg4KCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVieAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWJ4CisJYWRkbAkyMCglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYngKKwltb3ZsCSVlZHgsJWVjeAorCXNocmRsCSQxNCwlZWR4LCVlZHgKKwltb3ZsCTI0KCVlc3ApLCVlc2kKKwl4b3JsCSVlY3gsJWVkeAorCW1vdmwJMjgoJWVzcCksJWVkaQorCXhvcmwJJWVkaSwlZXNpCisJc2hyZGwJJDUsJWVkeCwlZWR4CisJYW5kbAklZWN4LCVlc2kKKwltb3ZsCSVlY3gsMjAoJWVzcCkKKwl4b3JsCSVlY3gsJWVkeAorCXhvcmwJJWVzaSwlZWRpCisJc2hyZGwJJDYsJWVkeCwlZWR4CisJbW92bAklZWJ4LCVlY3gKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJOCglZXNwKSwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaHJkbAkkOSwlZWN4LCVlY3gKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVieCwlZWN4CisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSglZXNwKSwlZWR4CisJc2hyZGwJJDExLCVlY3gsJWVjeAorCWFuZGwJJWVieCwlZWF4CisJeG9ybAklZXNpLCVlY3gKKwlhZGRsCTkyKCVlc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXNocmRsCSQyLCVlY3gsJWVjeAorCWFkZGwJJWVkeCwlZWF4CisJYWRkbAkxNiglZXNwKSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwltb3ZsCTk2KCVlc3ApLCVlc2kKKwl4b3JsCSVlZGksJWVieAorCW1vdmwJMTIoJWVzcCksJWVjeAorCWFkZGwJKCVlc2kpLCVlYXgKKwlhZGRsCTQoJWVzaSksJWVieAorCWFkZGwJOCglZXNpKSwlZWRpCisJYWRkbAkxMiglZXNpKSwlZWN4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJbW92bAklZWRpLDgoJWVzaSkKKwltb3ZsCSVlY3gsMTIoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNwKQorCXhvcmwJJWVkaSwlZWJ4CisJbW92bAklZWRpLDgoJWVzcCkKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCTIwKCVlc3ApLCVlZGkKKwltb3ZsCTI0KCVlc3ApLCVlY3gKKwlhZGRsCTE2KCVlc2kpLCVlZHgKKwlhZGRsCTIwKCVlc2kpLCVlZGkKKwlhZGRsCTI0KCVlc2kpLCVlY3gKKwltb3ZsCSVlZHgsMTYoJWVzaSkKKwltb3ZsCSVlZGksMjAoJWVzaSkKKwltb3ZsCSVlZGksMjAoJWVzcCkKKwltb3ZsCTI4KCVlc3ApLCVlZGkKKwltb3ZsCSVlY3gsMjQoJWVzaSkKKwlhZGRsCTI4KCVlc2kpLCVlZGkKKwltb3ZsCSVlY3gsMjQoJWVzcCkKKwltb3ZsCSVlZGksMjgoJWVzaSkKKwltb3ZsCSVlZGksMjgoJWVzcCkKKwltb3ZsCTEwMCglZXNwKSwlZWRpCisJdm1vdmRxYQk2NCglZWJwKSwleG1tNworCXN1YmwJJDE5MiwlZWJwCisJY21wbAkxMDQoJWVzcCksJWVkaQorCWpiCUwwMTJncmFuZF9hdngKKwltb3ZsCTEwOCglZXNwKSwlZXNwCisJdnplcm9hbGwKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5zZWN0aW9uIF9fSU1QT1JULF9fcG9pbnRlcnMsbm9uX2xhenlfc3ltYm9sX3BvaW50ZXJzCitMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0cjoKKy5pbmRpcmVjdF9zeW1ib2wJX09QRU5TU0xfaWEzMmNhcF9QCisubG9uZwkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTItNTg2LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLTU4Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWNiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLTU4Ni5TCkBAIC0wLDAgKzEsMjgzMiBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pCisudGV4dAorLmdsb2JsCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnByaXZhdGVfZXh0ZXJuCV9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLmFsaWduCTQKK19zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcjoKK0xfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCW1vdmwJMjQoJWVzcCksJWVkaQorCW1vdmwJMjgoJWVzcCksJWVheAorCW1vdmwJJWVzcCwlZWJ4CisJY2FsbAlMMDAwcGljX3BvaW50CitMMDAwcGljX3BvaW50OgorCXBvcGwJJWVicAorCWxlYWwJTDAwMUs1MTItTDAwMHBpY19wb2ludCglZWJwKSwlZWJwCisJc3VibAkkMTYsJWVzcAorCWFuZGwJJC02NCwlZXNwCisJc2hsbAkkNywlZWF4CisJYWRkbAklZWRpLCVlYXgKKwltb3ZsCSVlc2ksKCVlc3ApCisJbW92bAklZWRpLDQoJWVzcCkKKwltb3ZsCSVlYXgsOCglZXNwKQorCW1vdmwJJWVieCwxMiglZXNwKQorCW1vdmwJTF9PUEVOU1NMX2lhMzJjYXBfUCRub25fbGF6eV9wdHItTDAwMUs1MTIoJWVicCksJWVkeAorCW1vdmwJKCVlZHgpLCVlY3gKKwl0ZXN0bAkkNjcxMDg4NjQsJWVjeAorCWp6CUwwMDJsb29wX3g4NgorCW1vdmwJNCglZWR4KSwlZWR4CisJbW92cQkoJWVzaSksJW1tMAorCWFuZGwJJDE2Nzc3MjE2LCVlY3gKKwltb3ZxCTgoJWVzaSksJW1tMQorCWFuZGwJJDUxMiwlZWR4CisJbW92cQkxNiglZXNpKSwlbW0yCisJb3JsCSVlZHgsJWVjeAorCW1vdnEJMjQoJWVzaSksJW1tMworCW1vdnEJMzIoJWVzaSksJW1tNAorCW1vdnEJNDAoJWVzaSksJW1tNQorCW1vdnEJNDgoJWVzaSksJW1tNgorCW1vdnEJNTYoJWVzaSksJW1tNworCWNtcGwJJDE2Nzc3NzI4LCVlY3gKKwlqZQlMMDAzU1NTRTMKKwlzdWJsCSQ4MCwlZXNwCisJam1wCUwwMDRsb29wX3NzZTIKKy5hbGlnbgk0LDB4OTAKK0wwMDRsb29wX3NzZTI6CisJbW92cQklbW0xLDgoJWVzcCkKKwltb3ZxCSVtbTIsMTYoJWVzcCkKKwltb3ZxCSVtbTMsMjQoJWVzcCkKKwltb3ZxCSVtbTUsNDAoJWVzcCkKKwltb3ZxCSVtbTYsNDgoJWVzcCkKKwlweG9yCSVtbTEsJW1tMgorCW1vdnEJJW1tNyw1NiglZXNwKQorCW1vdnEJJW1tMCwlbW0zCisJbW92bAkoJWVkaSksJWVheAorCW1vdmwJNCglZWRpKSwlZWJ4CisJYWRkbAkkOCwlZWRpCisJbW92bAkkMTUsJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJam1wCUwwMDUwMF8xNF9zc2UyCisuYWxpZ24JNCwweDkwCitMMDA1MDBfMTRfc3NlMjoKKwltb3ZkCSVlYXgsJW1tMQorCW1vdmwJKCVlZGkpLCVlYXgKKwltb3ZkCSVlYngsJW1tNworCW1vdmwJNCglZWRpKSwlZWJ4CisJYWRkbAkkOCwlZWRpCisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlwdW5wY2tsZHEJJW1tMSwlbW03CisJbW92cQklbW00LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDMyKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCW1vdnEJJW1tMywlbW0wCisJbW92cQklbW03LDcyKCVlc3ApCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlwYWRkcQkoJWVicCksJW1tNworCXB4b3IJJW1tNCwlbW0zCisJbW92cQkyNCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJOCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJc3VibAkkOCwlZXNwCisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTUKKwlwYWRkcQklbW0yLCVtbTMKKwltb3ZxCSVtbTAsJW1tMgorCWFkZGwJJDgsJWVicAorCXBhZGRxCSVtbTYsJW1tMworCW1vdnEJNDgoJWVzcCksJW1tNgorCWRlY2wJJWVkeAorCWpueglMMDA1MDBfMTRfc3NlMgorCW1vdmQJJWVheCwlbW0xCisJbW92ZAklZWJ4LCVtbTcKKwlwdW5wY2tsZHEJJW1tMSwlbW03CisJbW92cQklbW00LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDMyKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCW1vdnEJJW1tMywlbW0wCisJbW92cQklbW03LDcyKCVlc3ApCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlwYWRkcQkoJWVicCksJW1tNworCXB4b3IJJW1tNCwlbW0zCisJbW92cQkyNCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJOCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJc3VibAkkOCwlZXNwCisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTE5MiglZXNwKSwlbW03CisJcGFkZHEJJW1tMiwlbW0zCisJbW92cQklbW0wLCVtbTIKKwlhZGRsCSQ4LCVlYnAKKwlwYWRkcQklbW02LCVtbTMKKwlweG9yCSVtbTAsJW1tMAorCW1vdmwJJDMyLCVlZHgKKwlqbXAJTDAwNjE2Xzc5X3NzZTIKKy5hbGlnbgk0LDB4OTAKK0wwMDYxNl83OV9zc2UyOgorCW1vdnEJODgoJWVzcCksJW1tNQorCW1vdnEJJW1tNywlbW0xCisJcHNybHEJJDEsJW1tNworCW1vdnEJJW1tNSwlbW02CisJcHNybHEJJDYsJW1tNQorCXBzbGxxCSQ1NiwlbW0xCisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW03LCVtbTMKKwlwc3JscQkkNiwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNywlbW0xCisJcHhvcgklbW03LCVtbTMKKwlwc3JscQkkMSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTUsJW1tMQorCXBzcmxxCSQxMywlbW01CisJcHhvcgklbW0zLCVtbTcKKwlwc2xscQkkMywlbW02CisJcHhvcgklbW01LCVtbTEKKwlwYWRkcQkyMDAoJWVzcCksJW1tNworCXB4b3IJJW1tNiwlbW0xCisJcHNybHEJJDQyLCVtbTUKKwlwYWRkcQkxMjgoJWVzcCksJW1tNworCXB4b3IJJW1tNSwlbW0xCisJcHNsbHEJJDQyLCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTUKKwlweG9yCSVtbTYsJW1tMQorCW1vdnEJNDgoJWVzcCksJW1tNgorCXBhZGRxCSVtbTEsJW1tNworCW1vdnEJJW1tNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwzMiglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwltb3ZxCSVtbTcsNzIoJWVzcCkKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXBhZGRxCSglZWJwKSwlbW03CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTI0KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlzdWJsCSQ4LCVlc3AKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMTkyKCVlc3ApLCVtbTcKKwlwYWRkcQklbW02LCVtbTIKKwlhZGRsCSQ4LCVlYnAKKwltb3ZxCTg4KCVlc3ApLCVtbTUKKwltb3ZxCSVtbTcsJW1tMQorCXBzcmxxCSQxLCVtbTcKKwltb3ZxCSVtbTUsJW1tNgorCXBzcmxxCSQ2LCVtbTUKKwlwc2xscQkkNTYsJW1tMQorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tNywlbW0zCisJcHNybHEJJDYsJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDcsJW1tMQorCXB4b3IJJW1tNywlbW0zCisJcHNybHEJJDEsJW1tNworCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW01LCVtbTEKKwlwc3JscQkkMTMsJW1tNQorCXB4b3IJJW1tMywlbW03CisJcHNsbHEJJDMsJW1tNgorCXB4b3IJJW1tNSwlbW0xCisJcGFkZHEJMjAwKCVlc3ApLCVtbTcKKwlweG9yCSVtbTYsJW1tMQorCXBzcmxxCSQ0MiwlbW01CisJcGFkZHEJMTI4KCVlc3ApLCVtbTcKKwlweG9yCSVtbTUsJW1tMQorCXBzbGxxCSQ0MiwlbW02CisJbW92cQk0MCglZXNwKSwlbW01CisJcHhvcgklbW02LCVtbTEKKwltb3ZxCTQ4KCVlc3ApLCVtbTYKKwlwYWRkcQklbW0xLCVtbTcKKwltb3ZxCSVtbTQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMzIoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJbW92cQklbW03LDcyKCVlc3ApCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlwYWRkcQkoJWVicCksJW1tNworCXB4b3IJJW1tNCwlbW0zCisJbW92cQkyNCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJOCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJc3VibAkkOCwlZXNwCisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTE5MiglZXNwKSwlbW03CisJcGFkZHEJJW1tNiwlbW0wCisJYWRkbAkkOCwlZWJwCisJZGVjbAklZWR4CisJam56CUwwMDYxNl83OV9zc2UyCisJcGFkZHEJJW1tMywlbW0wCisJbW92cQk4KCVlc3ApLCVtbTEKKwltb3ZxCTI0KCVlc3ApLCVtbTMKKwltb3ZxCTQwKCVlc3ApLCVtbTUKKwltb3ZxCTQ4KCVlc3ApLCVtbTYKKwltb3ZxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBhZGRxCSglZXNpKSwlbW0wCisJcGFkZHEJOCglZXNpKSwlbW0xCisJcGFkZHEJMTYoJWVzaSksJW1tMgorCXBhZGRxCTI0KCVlc2kpLCVtbTMKKwlwYWRkcQkzMiglZXNpKSwlbW00CisJcGFkZHEJNDAoJWVzaSksJW1tNQorCXBhZGRxCTQ4KCVlc2kpLCVtbTYKKwlwYWRkcQk1NiglZXNpKSwlbW03CisJbW92bAkkNjQwLCVlYXgKKwltb3ZxCSVtbTAsKCVlc2kpCisJbW92cQklbW0xLDgoJWVzaSkKKwltb3ZxCSVtbTIsMTYoJWVzaSkKKwltb3ZxCSVtbTMsMjQoJWVzaSkKKwltb3ZxCSVtbTQsMzIoJWVzaSkKKwltb3ZxCSVtbTUsNDAoJWVzaSkKKwltb3ZxCSVtbTYsNDgoJWVzaSkKKwltb3ZxCSVtbTcsNTYoJWVzaSkKKwlsZWFsCSglZXNwLCVlYXgsMSksJWVzcAorCXN1YmwJJWVheCwlZWJwCisJY21wbAk4OCglZXNwKSwlZWRpCisJamIJTDAwNGxvb3Bfc3NlMgorCW1vdmwJOTIoJWVzcCksJWVzcAorCWVtbXMKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgk1LDB4OTAKK0wwMDNTU1NFMzoKKwlsZWFsCS02NCglZXNwKSwlZWR4CisJc3VibAkkMjU2LCVlc3AKKwltb3ZkcWEJNjQwKCVlYnApLCV4bW0xCisJbW92ZHF1CSglZWRpKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJbW92ZHFhCSglZWJwKSwleG1tMworCW1vdmRxYQkleG1tMSwleG1tMgorCW1vdmRxdQkxNiglZWRpKSwleG1tMQorCXBhZGRxCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDIKKwltb3ZkcWEJJXhtbTMsLTEyOCglZWR4KQorCW1vdmRxYQkxNiglZWJwKSwleG1tNAorCW1vdmRxYQkleG1tMiwleG1tMworCW1vdmRxdQkzMiglZWRpKSwleG1tMgorCXBhZGRxCSV4bW0xLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwltb3ZkcWEJJXhtbTQsLTExMiglZWR4KQorCW1vdmRxYQkzMiglZWJwKSwleG1tNQorCW1vdmRxYQkleG1tMywleG1tNAorCW1vdmRxdQk0OCglZWRpKSwleG1tMworCXBhZGRxCSV4bW0yLCV4bW01CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjAKKwltb3ZkcWEJJXhtbTUsLTk2KCVlZHgpCisJbW92ZHFhCTQ4KCVlYnApLCV4bW02CisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHF1CTY0KCVlZGkpLCV4bW00CisJcGFkZHEJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwwLDIyOQorCW1vdmRxYQkleG1tNiwtODAoJWVkeCkKKwltb3ZkcWEJNjQoJWVicCksJXhtbTcKKwltb3ZkcWEJJXhtbTUsJXhtbTYKKwltb3ZkcXUJODAoJWVkaSksJXhtbTUKKwlwYWRkcQkleG1tNCwleG1tNworLmJ5dGUJMTAyLDE1LDU2LDAsMjM4CisJbW92ZHFhCSV4bW03LC02NCglZWR4KQorCW1vdmRxYQkleG1tMCwoJWVkeCkKKwltb3ZkcWEJODAoJWVicCksJXhtbTAKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwltb3ZkcXUJOTYoJWVkaSksJXhtbTYKKwlwYWRkcQkleG1tNSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ3CisJbW92ZHFhCSV4bW0wLC00OCglZWR4KQorCW1vdmRxYQkleG1tMSwxNiglZWR4KQorCW1vdmRxYQk5NiglZWJwKSwleG1tMQorCW1vdmRxYQkleG1tNywleG1tMAorCW1vdmRxdQkxMTIoJWVkaSksJXhtbTcKKwlwYWRkcQkleG1tNiwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ4CisJbW92ZHFhCSV4bW0xLC0zMiglZWR4KQorCW1vdmRxYQkleG1tMiwzMiglZWR4KQorCW1vdmRxYQkxMTIoJWVicCksJXhtbTIKKwltb3ZkcWEJKCVlZHgpLCV4bW0wCisJcGFkZHEJJXhtbTcsJXhtbTIKKwltb3ZkcWEJJXhtbTIsLTE2KCVlZHgpCisJbm9wCisuYWxpZ24JNSwweDkwCitMMDA3bG9vcF9zc3NlMzoKKwltb3ZkcWEJMTYoJWVkeCksJXhtbTIKKwltb3ZkcWEJJXhtbTMsNDgoJWVkeCkKKwlsZWFsCTEyOCglZWJwKSwlZWJwCisJbW92cQklbW0xLDgoJWVzcCkKKwltb3ZsCSVlZGksJWVieAorCW1vdnEJJW1tMiwxNiglZXNwKQorCWxlYWwJMTI4KCVlZGkpLCVlZGkKKwltb3ZxCSVtbTMsMjQoJWVzcCkKKwljbXBsCSVlYXgsJWVkaQorCW1vdnEJJW1tNSw0MCglZXNwKQorCWNtb3ZibAklZWRpLCVlYngKKwltb3ZxCSVtbTYsNDgoJWVzcCkKKwltb3ZsCSQ0LCVlY3gKKwlweG9yCSVtbTEsJW1tMgorCW1vdnEJJW1tNyw1NiglZXNwKQorCXB4b3IJJW1tMywlbW0zCisJam1wCUwwMDgwMF80N19zc3NlMworLmFsaWduCTUsMHg5MAorTDAwODAwXzQ3X3Nzc2UzOgorCW1vdmRxYQkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwleG1tMQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIwOCw4CisJbW92ZHFhCSV4bW00LCglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyMCw4CisJbW92ZHFhCSV4bW0yLCV4bW00CisJcHNybHEJJDcsJXhtbTIKKwlwYWRkcQkleG1tMywleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzcmxxCSQxLCV4bW00CisJcHNsbHEJJDU2LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMgorCXBzcmxxCSQ3LCV4bW00CisJcHhvcgkleG1tMywleG1tMgorCXBzbGxxCSQ3LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMgorCW1vdmRxYQkleG1tNywleG1tNAorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcWEJJXhtbTcsJXhtbTMKKwlwc3JscQkkNiwleG1tNAorCXBhZGRxCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW03LCV4bW0yCisJcHNybHEJJDE5LCV4bW0zCisJcHNsbHEJJDMsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW00CisJcHNybHEJJDQyLCV4bW0zCisJcHhvcgkleG1tMiwleG1tNAorCXBzbGxxCSQ0MiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTQKKwltb3ZkcWEJMzIoJWVkeCksJXhtbTMKKwlweG9yCSV4bW0yLCV4bW00CisJbW92ZHFhCSglZWJwKSwleG1tMgorCW1vdnEJJW1tNCwlbW0xCisJcGFkZHEJJXhtbTQsJXhtbTAKKwltb3ZxCS0xMjgoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMzIoJWVzcCkKKwlwYWRkcQkleG1tMCwleG1tMgorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkyNCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJOCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTMyKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTQwKCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTEyMCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwyNCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw1NiglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk0OCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTE2KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTIsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0yLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQkyNCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkzMiglZXNwKSwlbW02CisJbW92ZHFhCSV4bW0yLC0xMjgoJWVkeCkKKwltb3ZkcWEJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTMsJXhtbTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMTcsOAorCW1vdmRxYQkleG1tNSwxNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOSw4CisJbW92ZHFhCSV4bW0zLCV4bW01CisJcHNybHEJJDcsJXhtbTMKKwlwYWRkcQkleG1tNCwleG1tMQorCW1vdmRxYQkleG1tNSwleG1tNAorCXBzcmxxCSQxLCV4bW01CisJcHNsbHEJJDU2LCV4bW00CisJcHhvcgkleG1tNSwleG1tMworCXBzcmxxCSQ3LCV4bW01CisJcHhvcgkleG1tNCwleG1tMworCXBzbGxxCSQ3LCV4bW00CisJcHhvcgkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTMKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwlwc3JscQkkNiwleG1tNQorCXBhZGRxCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNybHEJJDE5LCV4bW00CisJcHNsbHEJJDMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW01CisJcHNybHEJJDQyLCV4bW00CisJcHhvcgkleG1tMywleG1tNQorCXBzbGxxCSQ0MiwleG1tMworCXB4b3IJJXhtbTQsJXhtbTUKKwltb3ZkcWEJNDgoJWVkeCksJXhtbTQKKwlweG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTE2KCVlYnApLCV4bW0zCisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tNSwleG1tMQorCW1vdnEJLTExMiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwxNiglZXNwKQorCXBhZGRxCSV4bW0xLCV4bW0zCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDQ4KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTQwKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJOCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNTYoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQkxNiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQkyNCglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS0xMDQoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsOCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw0MCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkzMiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCSglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNDgoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTE2KCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTMsLTExMiglZWR4KQorCW1vdmRxYQkleG1tNywleG1tNQorCW1vdmRxYQkleG1tNCwleG1tMworLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNiw4CisJbW92ZHFhCSV4bW02LDMyKCVlZHgpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM4LDgKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwlwc3JscQkkNywleG1tNAorCXBhZGRxCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW02LCV4bW01CisJcHNybHEJJDEsJXhtbTYKKwlwc2xscQkkNTYsJXhtbTUKKwlweG9yCSV4bW02LCV4bW00CisJcHNybHEJJDcsJXhtbTYKKwlweG9yCSV4bW01LCV4bW00CisJcHNsbHEJJDcsJXhtbTUKKwlweG9yCSV4bW02LCV4bW00CisJbW92ZHFhCSV4bW0xLCV4bW02CisJcHhvcgkleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMSwleG1tNQorCXBzcmxxCSQ2LCV4bW02CisJcGFkZHEJJXhtbTQsJXhtbTIKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JscQkkMTksJXhtbTUKKwlwc2xscQkkMywleG1tNAorCXB4b3IJJXhtbTUsJXhtbTYKKwlwc3JscQkkNDIsJXhtbTUKKwlweG9yCSV4bW00LCV4bW02CisJcHNsbHEJJDQyLCV4bW00CisJcHhvcgkleG1tNSwleG1tNgorCW1vdmRxYQkoJWVkeCksJXhtbTUKKwlweG9yCSV4bW00LCV4bW02CisJbW92ZHFhCTMyKCVlYnApLCV4bW00CisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tNiwleG1tMgorCW1vdnEJLTk2KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LCglZXNwKQorCXBhZGRxCSV4bW0yLCV4bW00CisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDMyKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTI0KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNTYoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTgoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktODgoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNTYoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsMjQoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0OCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk1NiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tNCwtOTYoJWVkeCkKKwltb3ZkcWEJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzUsOAorCW1vdmRxYQkleG1tNyw0OCglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0Nyw4CisJbW92ZHFhCSV4bW01LCV4bW03CisJcHNybHEJJDcsJXhtbTUKKwlwYWRkcQkleG1tNiwleG1tMworCW1vdmRxYQkleG1tNywleG1tNgorCXBzcmxxCSQxLCV4bW03CisJcHNsbHEJJDU2LCV4bW02CisJcHhvcgkleG1tNywleG1tNQorCXBzcmxxCSQ3LCV4bW03CisJcHhvcgkleG1tNiwleG1tNQorCXBzbGxxCSQ3LCV4bW02CisJcHhvcgkleG1tNywleG1tNQorCW1vdmRxYQkleG1tMiwleG1tNworCXB4b3IJJXhtbTYsJXhtbTUKKwltb3ZkcWEJJXhtbTIsJXhtbTYKKwlwc3JscQkkNiwleG1tNworCXBhZGRxCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLCV4bW01CisJcHNybHEJJDE5LCV4bW02CisJcHNsbHEJJDMsJXhtbTUKKwlweG9yCSV4bW02LCV4bW03CisJcHNybHEJJDQyLCV4bW02CisJcHhvcgkleG1tNSwleG1tNworCXBzbGxxCSQ0MiwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTcKKwltb3ZkcWEJMTYoJWVkeCksJXhtbTYKKwlweG9yCSV4bW01LCV4bW03CisJbW92ZHFhCTQ4KCVlYnApLCV4bW01CisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tNywleG1tMworCW1vdnEJLTgwKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQ4KCVlc3ApCisJcGFkZHEJJXhtbTMsJXhtbTUKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsMTYoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJOCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTQwKCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkyNCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTQ4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTU2KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTcyKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQwKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDgoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMzIoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTE2KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNDAoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJNDgoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tNSwtODAoJWVkeCkKKwltb3ZkcWEJJXhtbTEsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDQsOAorCW1vdmRxYQkleG1tMCwoJWVkeCkKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDgsOAorCW1vdmRxYQkleG1tNiwleG1tMAorCXBzcmxxCSQ3LCV4bW02CisJcGFkZHEJJXhtbTcsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwlwc3JscQkkMSwleG1tMAorCXBzbGxxCSQ1NiwleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwlwc3JscQkkNywleG1tMAorCXB4b3IJJXhtbTcsJXhtbTYKKwlwc2xscQkkNywleG1tNworCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW03LCV4bW02CisJbW92ZHFhCSV4bW0zLCV4bW03CisJcHNybHEJJDYsJXhtbTAKKwlwYWRkcQkleG1tNiwleG1tNAorCW1vdmRxYQkleG1tMywleG1tNgorCXBzcmxxCSQxOSwleG1tNworCXBzbGxxCSQzLCV4bW02CisJcHhvcgkleG1tNywleG1tMAorCXBzcmxxCSQ0MiwleG1tNworCXB4b3IJJXhtbTYsJXhtbTAKKwlwc2xscQkkNDIsJXhtbTYKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHFhCTMyKCVlZHgpLCV4bW03CisJcHhvcgkleG1tNiwleG1tMAorCW1vdmRxYQk2NCglZWJwKSwleG1tNgorCW1vdnEJJW1tNCwlbW0xCisJcGFkZHEJJXhtbTAsJXhtbTQKKwltb3ZxCS02NCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwzMiglZXNwKQorCXBhZGRxCSV4bW00LCV4bW02CisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk1NiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTI0KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMgorCW1vdnEJNDAoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktNTYoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMjQoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsNTYoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNDgoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkxNiglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMjQoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJMzIoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tNiwtNjQoJWVkeCkKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTMsOAorCW1vdmRxYQkleG1tMSwxNiglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDE5Myw4CisJbW92ZHFhCSV4bW03LCV4bW0xCisJcHNybHEJJDcsJXhtbTcKKwlwYWRkcQkleG1tMCwleG1tNQorCW1vdmRxYQkleG1tMSwleG1tMAorCXBzcmxxCSQxLCV4bW0xCisJcHNsbHEJJDU2LCV4bW0wCisJcHhvcgkleG1tMSwleG1tNworCXBzcmxxCSQ3LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNworCXBzbGxxCSQ3LCV4bW0wCisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTcKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwlwc3JscQkkNiwleG1tMQorCXBhZGRxCSV4bW03LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW03CisJcHNybHEJJDE5LCV4bW0wCisJcHNsbHEJJDMsJXhtbTcKKwlweG9yCSV4bW0wLCV4bW0xCisJcHNybHEJJDQyLCV4bW0wCisJcHhvcgkleG1tNywleG1tMQorCXBzbGxxCSQ0MiwleG1tNworCXB4b3IJJXhtbTAsJXhtbTEKKwltb3ZkcWEJNDgoJWVkeCksJXhtbTAKKwlweG9yCSV4bW03LCV4bW0xCisJbW92ZHFhCTgwKCVlYnApLCV4bW03CisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tMSwleG1tNQorCW1vdnEJLTQ4KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDE2KCVlc3ApCisJcGFkZHEJJXhtbTUsJXhtbTcKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsNDgoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNDAoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk4KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk1NiglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTE2KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTI0KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTQwKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDgoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsNDAoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMzIoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQ4KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJOCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkxNiglZXNwKSwlbW02CisJbW92ZHFhCSV4bW03LC00OCglZWR4KQorCW1vdmRxYQkleG1tMywleG1tMQorCW1vdmRxYQkleG1tMCwleG1tNworLmJ5dGUJMTAyLDE1LDU4LDE1LDE5OCw4CisJbW92ZHFhCSV4bW0yLDMyKCVlZHgpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjAyLDgKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwlwc3JscQkkNywleG1tMAorCXBhZGRxCSV4bW0xLCV4bW02CisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcHNybHEJJDEsJXhtbTIKKwlwc2xscQkkNTYsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0wCisJcHNybHEJJDcsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0wCisJcHNsbHEJJDcsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMQorCXBzcmxxCSQ2LCV4bW0yCisJcGFkZHEJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwlwc3JscQkkMTksJXhtbTEKKwlwc2xscQkkMywleG1tMAorCXB4b3IJJXhtbTEsJXhtbTIKKwlwc3JscQkkNDIsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW0yCisJcHNsbHEJJDQyLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMgorCW1vdmRxYQkoJWVkeCksJXhtbTEKKwlweG9yCSV4bW0wLCV4bW0yCisJbW92ZHFhCTk2KCVlYnApLCV4bW0wCisJbW92cQklbW00LCVtbTEKKwlwYWRkcQkleG1tMiwleG1tNgorCW1vdnEJLTMyKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LCglZXNwKQorCXBhZGRxCSV4bW02LCV4bW0wCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDMyKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTI0KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNTYoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTgoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMjQoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNTYoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsMjQoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0OCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk1NiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tMCwtMzIoJWVkeCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwltb3ZkcWEJJXhtbTEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMDcsOAorCW1vdmRxYQkleG1tMyw0OCglZWR4KQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIxMSw4CisJbW92ZHFhCSV4bW0xLCV4bW0zCisJcHNybHEJJDcsJXhtbTEKKwlwYWRkcQkleG1tMiwleG1tNworCW1vdmRxYQkleG1tMywleG1tMgorCXBzcmxxCSQxLCV4bW0zCisJcHNsbHEJJDU2LCV4bW0yCisJcHhvcgkleG1tMywleG1tMQorCXBzcmxxCSQ3LCV4bW0zCisJcHhvcgkleG1tMiwleG1tMQorCXBzbGxxCSQ3LCV4bW0yCisJcHhvcgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNiwleG1tMworCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTYsJXhtbTIKKwlwc3JscQkkNiwleG1tMworCXBhZGRxCSV4bW0xLCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW0xCisJcHNybHEJJDE5LCV4bW0yCisJcHNsbHEJJDMsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNybHEJJDQyLCV4bW0yCisJcHhvcgkleG1tMSwleG1tMworCXBzbGxxCSQ0MiwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTMKKwltb3ZkcWEJMTYoJWVkeCksJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0zCisJbW92ZHFhCTExMiglZWJwKSwleG1tMQorCW1vdnEJJW1tNCwlbW0xCisJcGFkZHEJJXhtbTMsJXhtbTcKKwltb3ZxCS0xNiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCw0OCglZXNwKQorCXBhZGRxCSV4bW03LCV4bW0xCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDE2KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTgoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0MCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMjQoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQk0OCglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQk1NiglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS04KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQwKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDgoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMzIoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTE2KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNDAoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJNDgoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tMSwtMTYoJWVkeCkKKwlsZWFsCTEyOCglZWJwKSwlZWJwCisJZGVjbAklZWN4CisJam56CUwwMDgwMF80N19zc3NlMworCW1vdmRxYQkoJWVicCksJXhtbTEKKwlsZWFsCS02NDAoJWVicCksJWVicAorCW1vdmRxdQkoJWVieCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCW1vdmRxYQkoJWVicCksJXhtbTMKKwltb3ZkcWEJJXhtbTEsJXhtbTIKKwltb3ZkcXUJMTYoJWVieCksJXhtbTEKKwlwYWRkcQkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjAyCisJbW92cQklbW00LCVtbTEKKwltb3ZxCS0xMjgoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMzIoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMjQoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTgoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQkzMiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQk0MCglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS0xMjAoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsMjQoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsNTYoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNDgoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkxNiglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJMjQoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJMzIoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tMywtMTI4KCVlZHgpCisJbW92ZHFhCTE2KCVlYnApLCV4bW00CisJbW92ZHFhCSV4bW0yLCV4bW0zCisJbW92ZHF1CTMyKCVlYngpLCV4bW0yCisJcGFkZHEJJXhtbTEsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMQorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMTEyKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDE2KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDQ4KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTQwKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJOCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNTYoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQkxNiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQkyNCglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS0xMDQoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsOCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw0MCglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkzMiglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCSglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNDgoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTE2KCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTQsLTExMiglZWR4KQorCW1vdmRxYQkzMiglZWJwKSwleG1tNQorCW1vdmRxYQkleG1tMywleG1tNAorCW1vdmRxdQk0OCglZWJ4KSwleG1tMworCXBhZGRxCSV4bW0yLCV4bW01CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjAKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTk2KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwzMiglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQkyNCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTU2KCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk0MCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCSglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQk4KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTg4KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDU2KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDI0KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTE2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNDgoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTMyKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNTYoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJKCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTUsLTk2KCVlZHgpCisJbW92ZHFhCTQ4KCVlYnApLCV4bW02CisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHF1CTY0KCVlYngpLCV4bW00CisJcGFkZHEJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwwLDIyOQorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktODAoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNDgoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0wCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTAsMTYoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJOCglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTQwKCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTAsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0wLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkyNCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTQ4KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTU2KCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTcyKCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDQwKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDgoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMzIoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTE2KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMiwlbW0wCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNDAoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJNDgoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tNiwtODAoJWVkeCkKKwltb3ZkcWEJNjQoJWVicCksJXhtbTcKKwltb3ZkcWEJJXhtbTUsJXhtbTYKKwltb3ZkcXUJODAoJWVieCksJXhtbTUKKwlwYWRkcQkleG1tNCwleG1tNworLmJ5dGUJMTAyLDE1LDU2LDAsMjM4CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS02NCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCwzMiglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJNTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQkyNCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJOCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTAKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTAsJW1tMgorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTMyKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTQwKCVlc3ApLCVtbTYKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTU2KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDI0KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDU2KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTQ4KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJMTYoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMiwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTIsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCSglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTI0KCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTMyKCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTcsLTY0KCVlZHgpCisJbW92ZHFhCSV4bW0wLCglZWR4KQorCW1vdmRxYQk4MCglZWJwKSwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tNworCW1vdmRxdQk5NiglZWJ4KSwleG1tNgorCXBhZGRxCSV4bW01LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyNDcKKwltb3ZxCSVtbTQsJW1tMQorCW1vdnEJLTQ4KCVlZHgpLCVtbTcKKwlweG9yCSVtbTYsJW1tNQorCXBzcmxxCSQxNCwlbW0xCisJbW92cQklbW00LDE2KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDQ4KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTQwKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJOCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0wLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMCwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJNTYoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0wLCVtbTIKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXB4b3IJJW1tNywlbW02CisJbW92cQkxNiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0yCisJbW92cQkyNCglZXNwKSwlbW02CisJbW92cQklbW00LCVtbTEKKwltb3ZxCS00MCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCw4KCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMgorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0yLDQwKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTMyKCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJKCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTIsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0yLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQk0OCglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTgoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMAorCW1vdnEJMTYoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tMCwtNDgoJWVkeCkKKwltb3ZkcWEJJXhtbTEsMTYoJWVkeCkKKwltb3ZkcWEJOTYoJWVicCksJXhtbTEKKwltb3ZkcWEJJXhtbTcsJXhtbTAKKwltb3ZkcXUJMTEyKCVlYngpLCV4bW03CisJcGFkZHEJJXhtbTYsJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDI0OAorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMzIoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsKCVlc3ApCisJcGFuZAklbW00LCVtbTUKKwlwc2xscQkkMjMsJW1tNAorCXBhZGRxCSVtbTMsJW1tMAorCW1vdnEJJW1tMSwlbW0zCisJcHNybHEJJDQsJW1tMQorCXB4b3IJJW1tNiwlbW01CisJcHhvcgklbW00LCVtbTMKKwlwc2xscQkkMjMsJW1tNAorCXB4b3IJJW1tMSwlbW0zCisJbW92cQklbW0wLDMyKCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCTI0KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNTYoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTIKKwltb3ZxCTgoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktMjQoJWVkeCksJW1tNworCXB4b3IJJW1tNiwlbW01CisJcHNybHEJJDE0LCVtbTEKKwltb3ZxCSVtbTQsNTYoJWVzcCkKKwlwYW5kCSVtbTQsJW1tNQorCXBzbGxxCSQyMywlbW00CisJcGFkZHEJJW1tMywlbW0yCisJbW92cQklbW0xLCVtbTMKKwlwc3JscQkkNCwlbW0xCisJcHhvcgklbW02LCVtbTUKKwlweG9yCSVtbTQsJW1tMworCXBzbGxxCSQyMywlbW00CisJcHhvcgklbW0xLCVtbTMKKwltb3ZxCSVtbTIsMjQoJWVzcCkKKwlwYWRkcQklbW01LCVtbTcKKwlweG9yCSVtbTQsJW1tMworCXBzcmxxCSQyMywlbW0xCisJcGFkZHEJMTYoJWVzcCksJW1tNworCXB4b3IJJW1tMSwlbW0zCisJcHNsbHEJJDQsJW1tNAorCXB4b3IJJW1tNCwlbW0zCisJbW92cQk0OCglZXNwKSwlbW00CisJcGFkZHEJJW1tNywlbW0zCisJbW92cQklbW0yLCVtbTUKKwlwc3JscQkkMjgsJW1tNQorCXBhZGRxCSVtbTMsJW1tNAorCW1vdnEJJW1tMiwlbW02CisJbW92cQklbW01LCVtbTcKKwlwc2xscQkkMjUsJW1tNgorCW1vdnEJMzIoJWVzcCksJW1tMQorCXBzcmxxCSQ2LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBzbGxxCSQ1LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0yCisJcHNybHEJJDUsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcGFuZAklbW0yLCVtbTAKKwlwc2xscQkkNiwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXB4b3IJJW1tNywlbW02CisJbW92cQk1NiglZXNwKSwlbW01CisJcGFkZHEJJW1tNiwlbW0wCisJbW92cQkoJWVzcCksJW1tNgorCW1vdmRxYQkleG1tMSwtMzIoJWVkeCkKKwltb3ZkcWEJJXhtbTIsMzIoJWVkeCkKKwltb3ZkcWEJMTEyKCVlYnApLCV4bW0yCisJbW92ZHFhCSglZWR4KSwleG1tMAorCXBhZGRxCSV4bW03LCV4bW0yCisJbW92cQklbW00LCVtbTEKKwltb3ZxCS0xNiglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCw0OCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMCwxNiglZXNwKQorCXBhZGRxCSVtbTUsJW1tNworCXB4b3IJJW1tNCwlbW0zCisJcHNybHEJJDIzLCVtbTEKKwlwYWRkcQk4KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMworCXBzbGxxCSQ0LCVtbTQKKwlweG9yCSVtbTQsJW1tMworCW1vdnEJNDAoJWVzcCksJW1tNAorCXBhZGRxCSVtbTcsJW1tMworCW1vdnEJJW1tMCwlbW01CisJcHNybHEJJDI4LCVtbTUKKwlwYWRkcQklbW0zLCVtbTQKKwltb3ZxCSVtbTAsJW1tNgorCW1vdnEJJW1tNSwlbW03CisJcHNsbHEJJDI1LCVtbTYKKwltb3ZxCTI0KCVlc3ApLCVtbTEKKwlwc3JscQkkNiwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwc2xscQkkNSwlbW02CisJcHhvcgklbW01LCVtbTcKKwlweG9yCSVtbTEsJW1tMAorCXBzcmxxCSQ1LCVtbTUKKwlweG9yCSVtbTYsJW1tNworCXBhbmQJJW1tMCwlbW0yCisJcHNsbHEJJDYsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlweG9yCSVtbTcsJW1tNgorCW1vdnEJNDgoJWVzcCksJW1tNQorCXBhZGRxCSVtbTYsJW1tMgorCW1vdnEJNTYoJWVzcCksJW1tNgorCW1vdnEJJW1tNCwlbW0xCisJbW92cQktOCglZWR4KSwlbW03CisJcHhvcgklbW02LCVtbTUKKwlwc3JscQkkMTQsJW1tMQorCW1vdnEJJW1tNCw0MCglZXNwKQorCXBhbmQJJW1tNCwlbW01CisJcHNsbHEJJDIzLCVtbTQKKwlwYWRkcQklbW0zLCVtbTIKKwltb3ZxCSVtbTEsJW1tMworCXBzcmxxCSQ0LCVtbTEKKwlweG9yCSVtbTYsJW1tNQorCXB4b3IJJW1tNCwlbW0zCisJcHNsbHEJJDIzLCVtbTQKKwlweG9yCSVtbTEsJW1tMworCW1vdnEJJW1tMiw4KCVlc3ApCisJcGFkZHEJJW1tNSwlbW03CisJcHhvcgklbW00LCVtbTMKKwlwc3JscQkkMjMsJW1tMQorCXBhZGRxCSglZXNwKSwlbW03CisJcHhvcgklbW0xLCVtbTMKKwlwc2xscQkkNCwlbW00CisJcHhvcgklbW00LCVtbTMKKwltb3ZxCTMyKCVlc3ApLCVtbTQKKwlwYWRkcQklbW03LCVtbTMKKwltb3ZxCSVtbTIsJW1tNQorCXBzcmxxCSQyOCwlbW01CisJcGFkZHEJJW1tMywlbW00CisJbW92cQklbW0yLCVtbTYKKwltb3ZxCSVtbTUsJW1tNworCXBzbGxxCSQyNSwlbW02CisJbW92cQkxNiglZXNwKSwlbW0xCisJcHNybHEJJDYsJW1tNQorCXB4b3IJJW1tNiwlbW03CisJcHNsbHEJJDUsJW1tNgorCXB4b3IJJW1tNSwlbW03CisJcHhvcgklbW0xLCVtbTIKKwlwc3JscQkkNSwlbW01CisJcHhvcgklbW02LCVtbTcKKwlwYW5kCSVtbTIsJW1tMAorCXBzbGxxCSQ2LCVtbTYKKwlweG9yCSVtbTUsJW1tNworCXB4b3IJJW1tMSwlbW0wCisJcHhvcgklbW03LCVtbTYKKwltb3ZxCTQwKCVlc3ApLCVtbTUKKwlwYWRkcQklbW02LCVtbTAKKwltb3ZxCTQ4KCVlc3ApLCVtbTYKKwltb3ZkcWEJJXhtbTIsLTE2KCVlZHgpCisJbW92cQk4KCVlc3ApLCVtbTEKKwlwYWRkcQklbW0zLCVtbTAKKwltb3ZxCTI0KCVlc3ApLCVtbTMKKwltb3ZxCTU2KCVlc3ApLCVtbTcKKwlweG9yCSVtbTEsJW1tMgorCXBhZGRxCSglZXNpKSwlbW0wCisJcGFkZHEJOCglZXNpKSwlbW0xCisJcGFkZHEJMTYoJWVzaSksJW1tMgorCXBhZGRxCTI0KCVlc2kpLCVtbTMKKwlwYWRkcQkzMiglZXNpKSwlbW00CisJcGFkZHEJNDAoJWVzaSksJW1tNQorCXBhZGRxCTQ4KCVlc2kpLCVtbTYKKwlwYWRkcQk1NiglZXNpKSwlbW03CisJbW92cQklbW0wLCglZXNpKQorCW1vdnEJJW1tMSw4KCVlc2kpCisJbW92cQklbW0yLDE2KCVlc2kpCisJbW92cQklbW0zLDI0KCVlc2kpCisJbW92cQklbW00LDMyKCVlc2kpCisJbW92cQklbW01LDQwKCVlc2kpCisJbW92cQklbW02LDQ4KCVlc2kpCisJbW92cQklbW03LDU2KCVlc2kpCisJY21wbAklZWF4LCVlZGkKKwlqYglMMDA3bG9vcF9zc3NlMworCW1vdmwJNzYoJWVkeCksJWVzcAorCWVtbXMKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5hbGlnbgk0LDB4OTAKK0wwMDJsb29wX3g4NjoKKwltb3ZsCSglZWRpKSwlZWF4CisJbW92bAk0KCVlZGkpLCVlYngKKwltb3ZsCTgoJWVkaSksJWVjeAorCW1vdmwJMTIoJWVkaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWF4CisJcHVzaGwJJWVieAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJbW92bAkxNiglZWRpKSwlZWF4CisJbW92bAkyMCglZWRpKSwlZWJ4CisJbW92bAkyNCglZWRpKSwlZWN4CisJbW92bAkyOCglZWRpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwltb3ZsCTMyKCVlZGkpLCVlYXgKKwltb3ZsCTM2KCVlZGkpLCVlYngKKwltb3ZsCTQwKCVlZGkpLCVlY3gKKwltb3ZsCTQ0KCVlZGkpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJcHVzaGwJJWVheAorCXB1c2hsCSVlYngKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCW1vdmwJNDgoJWVkaSksJWVheAorCW1vdmwJNTIoJWVkaSksJWVieAorCW1vdmwJNTYoJWVkaSksJWVjeAorCW1vdmwJNjAoJWVkaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWF4CisJcHVzaGwJJWVieAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJbW92bAk2NCglZWRpKSwlZWF4CisJbW92bAk2OCglZWRpKSwlZWJ4CisJbW92bAk3MiglZWRpKSwlZWN4CisJbW92bAk3NiglZWRpKSwlZWR4CisJYnN3YXAJJWVheAorCWJzd2FwCSVlYngKKwlic3dhcAklZWN4CisJYnN3YXAJJWVkeAorCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwltb3ZsCTgwKCVlZGkpLCVlYXgKKwltb3ZsCTg0KCVlZGkpLCVlYngKKwltb3ZsCTg4KCVlZGkpLCVlY3gKKwltb3ZsCTkyKCVlZGkpLCVlZHgKKwlic3dhcAklZWF4CisJYnN3YXAJJWVieAorCWJzd2FwCSVlY3gKKwlic3dhcAklZWR4CisJcHVzaGwJJWVheAorCXB1c2hsCSVlYngKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCW1vdmwJOTYoJWVkaSksJWVheAorCW1vdmwJMTAwKCVlZGkpLCVlYngKKwltb3ZsCTEwNCglZWRpKSwlZWN4CisJbW92bAkxMDgoJWVkaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWF4CisJcHVzaGwJJWVieAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJbW92bAkxMTIoJWVkaSksJWVheAorCW1vdmwJMTE2KCVlZGkpLCVlYngKKwltb3ZsCTEyMCglZWRpKSwlZWN4CisJbW92bAkxMjQoJWVkaSksJWVkeAorCWJzd2FwCSVlYXgKKwlic3dhcAklZWJ4CisJYnN3YXAJJWVjeAorCWJzd2FwCSVlZHgKKwlwdXNobAklZWF4CisJcHVzaGwJJWVieAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWR4CisJYWRkbAkkMTI4LCVlZGkKKwlzdWJsCSQ3MiwlZXNwCisJbW92bAklZWRpLDIwNCglZXNwKQorCWxlYWwJOCglZXNwKSwlZWRpCisJbW92bAkkMTYsJWVjeAorLmxvbmcJMjc4NDIyOTAwMQorLmFsaWduCTQsMHg5MAorTDAwOTAwXzE1X3g4NjoKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCTQ0KCVlc3ApLCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXNocmwJJDksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkOSwlZWR4CisJbW92bAklZWN4LCVlYngKKwlzaGxsCSQxNCwlZXNpCisJbW92bAklZWR4LCVlYXgKKwlzaGxsCSQxNCwlZWRpCisJeG9ybAklZXNpLCVlYngKKwlzaHJsCSQ1LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDUsJWVkeAorCXhvcmwJJWVjeCwlZWF4CisJc2hsbAkkNCwlZXNpCisJeG9ybAklZWR4LCVlYngKKwlzaGxsCSQ0LCVlZGkKKwl4b3JsCSVlc2ksJWVieAorCXNocmwJJDQsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJc2hybAkkNCwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwlzaGxsCSQ1LCVlc2kKKwl4b3JsCSVlZHgsJWVieAorCXNobGwJJDUsJWVkaQorCXhvcmwJJWVzaSwlZWF4CisJeG9ybAklZWRpLCVlYngKKwltb3ZsCTQ4KCVlc3ApLCVlY3gKKwltb3ZsCTUyKCVlc3ApLCVlZHgKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwltb3ZsCTYwKCVlc3ApLCVlZGkKKwlhZGRsCTY0KCVlc3ApLCVlYXgKKwlhZGNsCTY4KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWR4CisJYW5kbAk0MCglZXNwKSwlZWN4CisJYW5kbAk0NCglZXNwKSwlZWR4CisJYWRkbAkxOTIoJWVzcCksJWVheAorCWFkY2wJMTk2KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWR4CisJbW92bAkoJWVicCksJWVzaQorCW1vdmwJNCglZWJwKSwlZWRpCisJYWRkbAklZWN4LCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMzIoJWVzcCksJWVjeAorCW1vdmwJMzYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAklZWRpLCVlYngKKwltb3ZsCSVlYXgsKCVlc3ApCisJbW92bAklZWJ4LDQoJWVzcCkKKwlhZGRsCSVlY3gsJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk4KCVlc3ApLCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwltb3ZsCSVlYXgsMzIoJWVzcCkKKwltb3ZsCSVlYngsMzYoJWVzcCkKKwltb3ZsCSVlY3gsJWVzaQorCXNocmwJJDIsJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYngKKwlzaGxsCSQ0LCVlc2kKKwltb3ZsCSVlZHgsJWVheAorCXNobGwJJDQsJWVkaQorCXhvcmwJJWVzaSwlZWJ4CisJc2hybAkkNSwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJsCSQ1LCVlZHgKKwl4b3JsCSVlY3gsJWVieAorCXNobGwJJDIxLCVlc2kKKwl4b3JsCSVlZHgsJWVheAorCXNobGwJJDIxLCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXNocmwJJDIxLCVlY3gKKwl4b3JsCSVlZGksJWVieAorCXNocmwJJDIxLCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDUsJWVzaQorCXhvcmwJJWVkeCwlZWJ4CisJc2hsbAkkNSwlZWRpCisJeG9ybAklZXNpLCVlYXgKKwl4b3JsCSVlZGksJWVieAorCW1vdmwJOCglZXNwKSwlZWN4CisJbW92bAkxMiglZXNwKSwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRkbAkoJWVzcCksJWVheAorCWFkY2wJNCglZXNwKSwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW9ybAklZWRpLCVlZHgKKwlhbmRsCTI0KCVlc3ApLCVlY3gKKwlhbmRsCTI4KCVlc3ApLCVlZHgKKwlhbmRsCTgoJWVzcCksJWVzaQorCWFuZGwJMTIoJWVzcCksJWVkaQorCW9ybAklZXNpLCVlY3gKKwlvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYngsNCglZXNwKQorCW1vdmIJKCVlYnApLCVkbAorCXN1YmwJJDgsJWVzcAorCWxlYWwJOCglZWJwKSwlZWJwCisJY21wYgkkMTQ4LCVkbAorCWpuZQlMMDA5MDBfMTVfeDg2CisuYWxpZ24JNCwweDkwCitMMDEwMTZfNzlfeDg2OgorCW1vdmwJMzEyKCVlc3ApLCVlY3gKKwltb3ZsCTMxNiglZXNwKSwlZWR4CisJbW92bAklZWN4LCVlc2kKKwlzaHJsCSQxLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDEsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJc2hsbAkkMjQsJWVzaQorCW1vdmwJJWVkeCwlZWJ4CisJc2hsbAkkMjQsJWVkaQorCXhvcmwJJWVzaSwlZWJ4CisJc2hybAkkNiwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJsCSQ2LCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDcsJWVzaQorCXhvcmwJJWVkeCwlZWJ4CisJc2hsbAkkMSwlZWRpCisJeG9ybAklZXNpLCVlYngKKwlzaHJsCSQxLCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDEsJWVkeAorCXhvcmwJJWVjeCwlZWF4CisJc2hsbAkkNiwlZWRpCisJeG9ybAklZWR4LCVlYngKKwl4b3JsCSVlZGksJWVheAorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYngsNCglZXNwKQorCW1vdmwJMjA4KCVlc3ApLCVlY3gKKwltb3ZsCTIxMiglZXNwKSwlZWR4CisJbW92bAklZWN4LCVlc2kKKwlzaHJsCSQ2LCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXNocmwJJDYsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJc2hsbAkkMywlZXNpCisJbW92bAklZWR4LCVlYngKKwlzaGxsCSQzLCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXNocmwJJDEzLCVlY3gKKwl4b3JsCSVlZGksJWVieAorCXNocmwJJDEzLCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDEwLCVlc2kKKwl4b3JsCSVlZHgsJWVieAorCXNobGwJJDEwLCVlZGkKKwl4b3JsCSVlc2ksJWVieAorCXNocmwJJDEwLCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDEwLCVlZHgKKwl4b3JsCSVlY3gsJWVieAorCXNobGwJJDEzLCVlZGkKKwl4b3JsCSVlZHgsJWVheAorCXhvcmwJJWVkaSwlZWF4CisJbW92bAkzMjAoJWVzcCksJWVjeAorCW1vdmwJMzI0KCVlc3ApLCVlZHgKKwlhZGRsCSglZXNwKSwlZWF4CisJYWRjbAk0KCVlc3ApLCVlYngKKwltb3ZsCTI0OCglZXNwKSwlZXNpCisJbW92bAkyNTIoJWVzcCksJWVkaQorCWFkZGwJJWVjeCwlZWF4CisJYWRjbAklZWR4LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCWFkY2wJJWVkaSwlZWJ4CisJbW92bAklZWF4LDE5MiglZXNwKQorCW1vdmwJJWVieCwxOTYoJWVzcCkKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwltb3ZsCTQ0KCVlc3ApLCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXNocmwJJDksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkOSwlZWR4CisJbW92bAklZWN4LCVlYngKKwlzaGxsCSQxNCwlZXNpCisJbW92bAklZWR4LCVlYXgKKwlzaGxsCSQxNCwlZWRpCisJeG9ybAklZXNpLCVlYngKKwlzaHJsCSQ1LCVlY3gKKwl4b3JsCSVlZGksJWVheAorCXNocmwJJDUsJWVkeAorCXhvcmwJJWVjeCwlZWF4CisJc2hsbAkkNCwlZXNpCisJeG9ybAklZWR4LCVlYngKKwlzaGxsCSQ0LCVlZGkKKwl4b3JsCSVlc2ksJWVieAorCXNocmwJJDQsJWVjeAorCXhvcmwJJWVkaSwlZWF4CisJc2hybAkkNCwlZWR4CisJeG9ybAklZWN4LCVlYXgKKwlzaGxsCSQ1LCVlc2kKKwl4b3JsCSVlZHgsJWVieAorCXNobGwJJDUsJWVkaQorCXhvcmwJJWVzaSwlZWF4CisJeG9ybAklZWRpLCVlYngKKwltb3ZsCTQ4KCVlc3ApLCVlY3gKKwltb3ZsCTUyKCVlc3ApLCVlZHgKKwltb3ZsCTU2KCVlc3ApLCVlc2kKKwltb3ZsCTYwKCVlc3ApLCVlZGkKKwlhZGRsCTY0KCVlc3ApLCVlYXgKKwlhZGNsCTY4KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWR4CisJYW5kbAk0MCglZXNwKSwlZWN4CisJYW5kbAk0NCglZXNwKSwlZWR4CisJYWRkbAkxOTIoJWVzcCksJWVheAorCWFkY2wJMTk2KCVlc3ApLCVlYngKKwl4b3JsCSVlc2ksJWVjeAorCXhvcmwJJWVkaSwlZWR4CisJbW92bAkoJWVicCksJWVzaQorCW1vdmwJNCglZWJwKSwlZWRpCisJYWRkbAklZWN4LCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJMzIoJWVzcCksJWVjeAorCW1vdmwJMzYoJWVzcCksJWVkeAorCWFkZGwJJWVzaSwlZWF4CisJYWRjbAklZWRpLCVlYngKKwltb3ZsCSVlYXgsKCVlc3ApCisJbW92bAklZWJ4LDQoJWVzcCkKKwlhZGRsCSVlY3gsJWVheAorCWFkY2wJJWVkeCwlZWJ4CisJbW92bAk4KCVlc3ApLCVlY3gKKwltb3ZsCTEyKCVlc3ApLCVlZHgKKwltb3ZsCSVlYXgsMzIoJWVzcCkKKwltb3ZsCSVlYngsMzYoJWVzcCkKKwltb3ZsCSVlY3gsJWVzaQorCXNocmwJJDIsJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJc2hybAkkMiwlZWR4CisJbW92bAklZWN4LCVlYngKKwlzaGxsCSQ0LCVlc2kKKwltb3ZsCSVlZHgsJWVheAorCXNobGwJJDQsJWVkaQorCXhvcmwJJWVzaSwlZWJ4CisJc2hybAkkNSwlZWN4CisJeG9ybAklZWRpLCVlYXgKKwlzaHJsCSQ1LCVlZHgKKwl4b3JsCSVlY3gsJWVieAorCXNobGwJJDIxLCVlc2kKKwl4b3JsCSVlZHgsJWVheAorCXNobGwJJDIxLCVlZGkKKwl4b3JsCSVlc2ksJWVheAorCXNocmwJJDIxLCVlY3gKKwl4b3JsCSVlZGksJWVieAorCXNocmwJJDIxLCVlZHgKKwl4b3JsCSVlY3gsJWVheAorCXNobGwJJDUsJWVzaQorCXhvcmwJJWVkeCwlZWJ4CisJc2hsbAkkNSwlZWRpCisJeG9ybAklZXNpLCVlYXgKKwl4b3JsCSVlZGksJWVieAorCW1vdmwJOCglZXNwKSwlZWN4CisJbW92bAkxMiglZXNwKSwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRkbAkoJWVzcCksJWVheAorCWFkY2wJNCglZXNwKSwlZWJ4CisJb3JsCSVlc2ksJWVjeAorCW9ybAklZWRpLCVlZHgKKwlhbmRsCTI0KCVlc3ApLCVlY3gKKwlhbmRsCTI4KCVlc3ApLCVlZHgKKwlhbmRsCTgoJWVzcCksJWVzaQorCWFuZGwJMTIoJWVzcCksJWVkaQorCW9ybAklZXNpLCVlY3gKKwlvcmwJJWVkaSwlZWR4CisJYWRkbAklZWN4LCVlYXgKKwlhZGNsCSVlZHgsJWVieAorCW1vdmwJJWVheCwoJWVzcCkKKwltb3ZsCSVlYngsNCglZXNwKQorCW1vdmIJKCVlYnApLCVkbAorCXN1YmwJJDgsJWVzcAorCWxlYWwJOCglZWJwKSwlZWJwCisJY21wYgkkMjMsJWRsCisJam5lCUwwMTAxNl83OV94ODYKKwltb3ZsCTg0MCglZXNwKSwlZXNpCisJbW92bAk4NDQoJWVzcCksJWVkaQorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWR4CisJYWRkbAk4KCVlc3ApLCVlYXgKKwlhZGNsCTEyKCVlc3ApLCVlYngKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwlhZGRsCTE2KCVlc3ApLCVlY3gKKwlhZGNsCTIwKCVlc3ApLCVlZHgKKwltb3ZsCSVlY3gsOCglZXNpKQorCW1vdmwJJWVkeCwxMiglZXNpKQorCW1vdmwJMTYoJWVzaSksJWVheAorCW1vdmwJMjAoJWVzaSksJWVieAorCW1vdmwJMjQoJWVzaSksJWVjeAorCW1vdmwJMjgoJWVzaSksJWVkeAorCWFkZGwJMjQoJWVzcCksJWVheAorCWFkY2wJMjgoJWVzcCksJWVieAorCW1vdmwJJWVheCwxNiglZXNpKQorCW1vdmwJJWVieCwyMCglZXNpKQorCWFkZGwJMzIoJWVzcCksJWVjeAorCWFkY2wJMzYoJWVzcCksJWVkeAorCW1vdmwJJWVjeCwyNCglZXNpKQorCW1vdmwJJWVkeCwyOCglZXNpKQorCW1vdmwJMzIoJWVzaSksJWVheAorCW1vdmwJMzYoJWVzaSksJWVieAorCW1vdmwJNDAoJWVzaSksJWVjeAorCW1vdmwJNDQoJWVzaSksJWVkeAorCWFkZGwJNDAoJWVzcCksJWVheAorCWFkY2wJNDQoJWVzcCksJWVieAorCW1vdmwJJWVheCwzMiglZXNpKQorCW1vdmwJJWVieCwzNiglZXNpKQorCWFkZGwJNDgoJWVzcCksJWVjeAorCWFkY2wJNTIoJWVzcCksJWVkeAorCW1vdmwJJWVjeCw0MCglZXNpKQorCW1vdmwJJWVkeCw0NCglZXNpKQorCW1vdmwJNDgoJWVzaSksJWVheAorCW1vdmwJNTIoJWVzaSksJWVieAorCW1vdmwJNTYoJWVzaSksJWVjeAorCW1vdmwJNjAoJWVzaSksJWVkeAorCWFkZGwJNTYoJWVzcCksJWVheAorCWFkY2wJNjAoJWVzcCksJWVieAorCW1vdmwJJWVheCw0OCglZXNpKQorCW1vdmwJJWVieCw1MiglZXNpKQorCWFkZGwJNjQoJWVzcCksJWVjeAorCWFkY2wJNjgoJWVzcCksJWVkeAorCW1vdmwJJWVjeCw1NiglZXNpKQorCW1vdmwJJWVkeCw2MCglZXNpKQorCWFkZGwJJDg0MCwlZXNwCisJc3VibAkkNjQwLCVlYnAKKwljbXBsCTgoJWVzcCksJWVkaQorCWpiCUwwMDJsb29wX3g4NgorCW1vdmwJMTIoJWVzcCksJWVzcAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCXJldAorLmFsaWduCTYsMHg5MAorTDAwMUs1MTI6CisubG9uZwkzNjA5NzY3NDU4LDExMTYzNTI0MDgKKy5sb25nCTYwMjg5MTcyNSwxODk5NDQ3NDQxCisubG9uZwkzOTY0NDg0Mzk5LDMwNDkzMjM0NzEKKy5sb25nCTIxNzMyOTU1NDgsMzkyMTAwOTU3MworLmxvbmcJNDA4MTYyODQ3Miw5NjE5ODcxNjMKKy5sb25nCTMwNTM4MzQyNjUsMTUwODk3MDk5MworLmxvbmcJMjkzNzY3MTU3OSwyNDUzNjM1NzQ4CisubG9uZwkzNjY0NjA5NTYwLDI4NzA3NjMyMjEKKy5sb25nCTI3MzQ4ODMzOTQsMzYyNDM4MTA4MAorLmxvbmcJMTE2NDk5NjU0MiwzMTA1OTg0MDEKKy5sb25nCTEzMjM2MTA3NjQsNjA3MjI1Mjc4CisubG9uZwkzNTkwMzA0OTk0LDE0MjY4ODE5ODcKKy5sb25nCTQwNjgxODIzODMsMTkyNTA3ODM4OAorLmxvbmcJOTkxMzM2MTEzLDIxNjIwNzgyMDYKKy5sb25nCTYzMzgwMzMxNywyNjE0ODg4MTAzCisubG9uZwkzNDc5Nzc0ODY4LDMyNDgyMjI1ODAKKy5sb25nCTI2NjY2MTM0NTgsMzgzNTM5MDQwMQorLmxvbmcJOTQ0NzExMTM5LDQwMjIyMjQ3NzQKKy5sb25nCTIzNDEyNjI3NzMsMjY0MzQ3MDc4CisubG9uZwkyMDA3ODAwOTMzLDYwNDgwNzYyOAorLmxvbmcJMTQ5NTk5MDkwMSw3NzAyNTU5ODMKKy5sb25nCTE4NTY0MzEyMzUsMTI0OTE1MDEyMgorLmxvbmcJMzE3NTIxODEzMiwxNTU1MDgxNjkyCisubG9uZwkyMTk4OTUwODM3LDE5OTYwNjQ5ODYKKy5sb25nCTM5OTk3MTkzMzksMjU1NDIyMDg4MgorLmxvbmcJNzY2Nzg0MDE2LDI4MjE4MzQzNDkKKy5sb25nCTI1NjY1OTQ4NzksMjk1Mjk5NjgwOAorLmxvbmcJMzIwMzMzNzk1NiwzMjEwMzEzNjcxCisubG9uZwkxMDM0NDU3MDI2LDMzMzY1NzE4OTEKKy5sb25nCTI0NjY5NDg5MDEsMzU4NDUyODcxMQorLmxvbmcJMzc1ODMyNjM4MywxMTM5MjY5OTMKKy5sb25nCTE2ODcxNzkzNiwzMzgyNDE4OTUKKy5sb25nCTExODgxNzk5NjQsNjY2MzA3MjA1CisubG9uZwkxNTQ2MDQ1NzM0LDc3MzUyOTkxMgorLmxvbmcJMTUyMjgwNTQ4NSwxMjk0NzU3MzcyCisubG9uZwkyNjQzODMzODIzLDEzOTYxODIyOTEKKy5sb25nCTIzNDM1MjczOTAsMTY5NTE4MzcwMAorLmxvbmcJMTAxNDQ3NzQ4MCwxOTg2NjYxMDUxCisubG9uZwkxMjA2NzU5MTQyLDIxNzcwMjYzNTAKKy5sb25nCTM0NDA3NzYyNywyNDU2OTU2MDM3CisubG9uZwkxMjkwODYzNDYwLDI3MzA0ODU5MjEKKy5sb25nCTMxNTg0NTQyNzMsMjgyMDMwMjQxMQorLmxvbmcJMzUwNTk1MjY1NywzMjU5NzMwODAwCisubG9uZwkxMDYyMTcwMDgsMzM0NTc2NDc3MQorLmxvbmcJMzYwNjAwODM0NCwzNTE2MDY1ODE3CisubG9uZwkxNDMyNzI1Nzc2LDM2MDAzNTI4MDQKKy5sb25nCTE0NjcwMzE1OTQsNDA5NDU3MTkwOQorLmxvbmcJODUxMTY5NzIwLDI3NTQyMzM0NAorLmxvbmcJMzEwMDgyMzc1Miw0MzAyMjc3MzQKKy5sb25nCTEzNjMyNTgxOTUsNTA2OTQ4NjE2CisubG9uZwkzNzUwNjg1NTkzLDY1OTA2MDU1NgorLmxvbmcJMzc4NTA1MDI4MCw4ODM5OTc4NzcKKy5sb25nCTMzMTgzMDc0MjcsOTU4MTM5NTcxCisubG9uZwkzODEyNzIzNDAzLDEzMjI4MjIyMTgKKy5sb25nCTIwMDMwMzQ5OTUsMTUzNzAwMjA2MworLmxvbmcJMzYwMjAzNjg5OSwxNzQ3ODczNzc5CisubG9uZwkxNTc1OTkwMDEyLDE5NTU1NjIyMjIKKy5sb25nCTExMjU1OTI5MjgsMjAyNDEwNDgxNQorLmxvbmcJMjcxNjkwNDMwNiwyMjI3NzMwNDUyCisubG9uZwk0NDI3NzYwNDQsMjM2MTg1MjQyNAorLmxvbmcJNTkzNjk4MzQ0LDI0Mjg0MzY0NzQKKy5sb25nCTM3MzMxMTAyNDksMjc1NjczNDE4NworLmxvbmcJMjk5OTM1MTU3MywzMjA0MDMxNDc5CisubG9uZwkzODE1OTIwNDI3LDMzMjkzMjUyOTgKKy5sb25nCTM5MjgzODM5MDAsMzM5MTU2OTYxNAorLmxvbmcJNTY2MjgwNzExLDM1MTUyNjcyNzEKKy5sb25nCTM0NTQwNjk1MzQsMzk0MDE4NzYwNgorLmxvbmcJNDAwMDIzOTk5Miw0MTE4NjMwMjcxCisubG9uZwkxOTE0MTM4NTU0LDExNjQxODQ3NAorLmxvbmcJMjczMTA1NTI3MCwxNzQyOTI0MjEKKy5sb25nCTMyMDM5OTMwMDYsMjg5MzgwMzU2CisubG9uZwkzMjA2MjAzMTUsNDYwMzkzMjY5CisubG9uZwk1ODc0OTY4MzYsNjg1NDcxNzMzCisubG9uZwkxMDg2NzkyODUxLDg1MjE0Mjk3MQorLmxvbmcJMzY1NTQzMTAwLDEwMTcwMzYyOTgKKy5sb25nCTI2MTgyOTc2NzYsMTEyNjAwMDU4MAorLmxvbmcJMzQwOTg1NTE1OCwxMjg4MDMzNDcwCisubG9uZwk0MjM0NTA5ODY2LDE1MDE1MDU5NDgKKy5sb25nCTk4NzE2NzQ2OCwxNjA3MTY3OTE1CisubG9uZwkxMjQ2MTg5NTkxLDE4MTY0MDIzMTYKKy5sb25nCTY3NDM4MDg3LDY2MDUxCisubG9uZwkyMDIxODIxNTksMTM0ODEwMTIzCisuYnl0ZQk4Myw3Miw2NSw1Myw0OSw1MCwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3CisuYnl0ZQkxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsNDQsMzIKKy5ieXRlCTY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NworLmJ5dGUJMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMworLmJ5dGUJNjIsMAorLnNlY3Rpb24gX19JTVBPUlQsX19wb2ludGVycyxub25fbGF6eV9zeW1ib2xfcG9pbnRlcnMKK0xfT1BFTlNTTF9pYTMyY2FwX1Akbm9uX2xhenlfcHRyOgorLmluZGlyZWN0X3N5bWJvbAlfT1BFTlNTTF9pYTMyY2FwX1AKKy5sb25nCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWU5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvdnBhZXMteDg2LlMKQEAgLTAsMCArMSw2NDkgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLnRleHQKKy5hbGlnbgk2LDB4OTAKK0xfdnBhZXNfY29uc3RzOgorLmxvbmcJMjE4NjI4NDgwLDIzNTIxMDI1NSwxNjg0OTYxMzAsNjc1NjgzOTMKKy5sb25nCTI1MjM4MTA1NiwxNzA0MTkyNiwzMzg4NDE2OSw1MTE4NzIxMgorLmxvbmcJMjUyNjQ1MTM1LDI1MjY0NTEzNSwyNTI2NDUxMzUsMjUyNjQ1MTM1CisubG9uZwkxNTEyNzMwNjI0LDMyNjY1MDQ4NTYsMTM3Nzk5MDY2NCwzNDAxMjQ0ODE2CisubG9uZwk4MzAyMjk3NjAsMTI3NTE0NjM2NSwyOTY5NDIyOTc3LDM0NDc3NjM0NTIKKy5sb25nCTM0MTEwMzM2MDAsMjk3OTc4MzA1NSwzMzgzNTk2MjAsMjc4Mjg4NjUxMAorLmxvbmcJNDIwOTEyNDA5Niw5MDc1OTY4MjEsMjIxMTc0MjU1LDEwMDYwOTU1NTMKKy5sb25nCTE5MTk2NDE2MCwzNzk5Njg0MDM4LDMxNjQwOTAzMTcsMTU4OTExMTEyNQorLmxvbmcJMTgyNTI4MjU2LDE3NzcwNDM1MjAsMjg3NzQzMjY1MCwzMjY1MzU2NzQ0CisubG9uZwkxODc0NzA4MjI0LDM1MDM0NTE0MTUsMzMwNTI4NTc1MiwzNjM1MTE2NzQKKy5sb25nCTE2MDYxMTc4ODgsMzQ4Nzg1NTc4MSwxMDkzMzUwOTA2LDIzODQzNjc4MjUKKy5sb25nCTE5NzEyMSw2NzU2OTE1NywxMzQ5NDExOTMsMjAyMzEzMjI5CisubG9uZwk2NzU2OTE1NywxMzQ5NDExOTMsMjAyMzEzMjI5LDE5NzEyMQorLmxvbmcJMTM0OTQxMTkzLDIwMjMxMzIyOSwxOTcxMjEsNjc1NjkxNTcKKy5sb25nCTIwMjMxMzIyOSwxOTcxMjEsNjc1NjkxNTcsMTM0OTQxMTkzCisubG9uZwkzMzYxOTk3MSwxMDA5OTIwMDcsMTY4MzY0MDQzLDIzNTczNjA3OQorLmxvbmcJMjM1NzM2MDc5LDMzNjE5OTcxLDEwMDk5MjAwNywxNjgzNjQwNDMKKy5sb25nCTE2ODM2NDA0MywyMzU3MzYwNzksMzM2MTk5NzEsMTAwOTkyMDA3CisubG9uZwkxMDA5OTIwMDcsMTY4MzY0MDQzLDIzNTczNjA3OSwzMzYxOTk3MQorLmxvbmcJNTA0NjI5NzYsMTE3ODM1MDEyLDE4NTIwNzA0OCwyNTI1NzkwODQKKy5sb25nCTI1MjMxNDg4MCw1MTI1MTQ2MCwxMTc1NzQ5MjAsMTg0OTQyODYwCisubG9uZwkxODQ2ODI3NTIsMjUyMDU0Nzg4LDUwOTg3MjcyLDExODM1OTMwOAorLmxvbmcJMTE4MDk5MjAwLDE4NTQ2NzE0MCwyNTE3OTA2MDAsNTA3MjcxODAKKy5sb25nCTI5NDYzNjMwNjIsNTI4NzE2MjE3LDEzMDAwMDQyMjUsMTg4MTgzOTYyNAorLmxvbmcJMTUzMjcxMzgxOSwxNTMyNzEzODE5LDE1MzI3MTM4MTksMTUzMjcxMzgxOQorLmxvbmcJMzYwMjI3NjM1Miw0Mjg4NjI5MDMzLDM3MzcwMjA0MjQsNDE1Mzg4NDk2MQorLmxvbmcJMTM1NDU1ODQ2NCwzMjM1NzcxMywyOTU4ODIyNjI0LDM3NzU3NDk1NTMKKy5sb25nCTEyMDE5ODgzNTIsMTMyNDI0NTEyLDE1NzI3OTY2OTgsNTAzMjMyODU4CisubG9uZwkyMjEzMTc3NjAwLDE1OTc0MjEwMjAsNDEwMzkzNzY1NSw2NzUzOTgzMTUKKy5sb25nCTI3NDk2NDY1OTIsNDI3MzU0Mzc3MywxNTExODk4ODczLDEyMTY5MzA5MgorLmxvbmcJMzA0MDI0ODU3NiwxMTAzMjYzNzMyLDI4NzE1NjU1OTgsMTYwODI4MDU1NAorLmxvbmcJMjIzNjY2NzEzNiwyNTg4OTIwMzUxLDQ4Mjk1NDM5Myw2NDM3NzczNAorLmxvbmcJMzA2OTk4NzMyOCwyOTEyMzcyODcsMjExNzM3MDU2OCwzNjUwMjk5MjQ3CisubG9uZwk1MzMzMjEyMTYsMzU3Mzc1MDk4NiwyNTcyMTEyMDA2LDE0MDEyNjQ3MTYKKy5sb25nCTEzMzk4NDk3MDQsMjcyMTE1ODY2MSw1NDg2MDcxMTEsMzQ0NTU1MzUxNAorLmxvbmcJMjEyODE5MzI4MCwzMDU0NTk2MDQwLDIxODM0ODY0NjAsMTI1NzA4MzcwMAorLmxvbmcJNjU1NjM1MjAwLDExNjUzODE5ODYsMzkyMzQ0MzE1MCwyMzQ0MTMyNTI0CisubG9uZwkxOTAwNzg3MjAsMjU2OTI0NDIwLDI5MDM0MjE3MCwzNTcxODc4NzAKKy5sb25nCTE2MTA5NjYyNzIsMjI2MzA1NzM4Miw0MTAzMjA1MjY4LDMwOTc5NDY3NAorLmxvbmcJMjU5MjUyNzg3MiwyMjMzMjA1NTg3LDEzMzU0NDY3MjksMzQwMjk2NDgxNgorLmxvbmcJMzk3MzUzMTkwNCwzMjI1MDk4MTIxLDMwMDI4MzYzMjUsMTkxODc3NDQzMAorLmxvbmcJMzg3MDQwMTAyNCwyMTAyOTA2MDc5LDIyODQ0NzEzNTMsNDExNzY2NjU3OQorLmxvbmcJNjE3MDA3ODcyLDEwMjE1MDgzNDMsMzY2OTMxOTIzLDY5MTA4MzI3NworLmxvbmcJMjUyODM5NTc3NiwzNDkxOTE0ODk4LDI5Njg3MDQwMDQsMTYxMzEyMTI3MAorLmxvbmcJMzQ0NTE4ODM1MiwzMjQ3NzQxMDk0LDg0NDQ3NDk4Nyw0MDkzNTc4MzAyCisubG9uZwk2NTE0ODEwODgsMTE5MDMwMjM1OCwxNjg5NTgxMjMyLDU3NDc3NTMwMAorLmxvbmcJNDI4OTM4MDYwOCwyMDY5Mzk4NTMsMjU1NTk4NTQ1OCwyNDg5ODQwNDkxCisubG9uZwkyMTMwMjY0MDY0LDMyNzY3NDQ1MSwzNTY2NDg1MDM3LDMzNDk4MzUxOTMKKy5sb25nCTI0NzA3MTQ2MjQsMzE2MTAyMTU5LDM2MzY4MjU3NTYsMzM5Mzk0NTk0NQorLmJ5dGUJODYsMTAxLDk5LDExNiwxMTEsMTE0LDMyLDgwLDEwMSwxMTQsMTA5LDExNywxMTYsOTcsMTE2LDEwNQorLmJ5dGUJMTExLDExMCwzMiw2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsNDcsODMKKy5ieXRlCTgzLDgzLDY5LDUxLDQ0LDMyLDc3LDEwNSwxMDcsMTAxLDMyLDcyLDk3LDEwOSw5OCwxMTcKKy5ieXRlCTExNCwxMDMsMzIsNDAsODMsMTE2LDk3LDExMCwxMDIsMTExLDExNCwxMDAsMzIsODUsMTEwLDEwNQorLmJ5dGUJMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTYsMTIxLDQxLDAKKy5hbGlnbgk2LDB4OTAKKy5wcml2YXRlX2V4dGVybglfX3ZwYWVzX3ByZWhlYXQKKy5hbGlnbgk0CitfX3ZwYWVzX3ByZWhlYXQ6CisJYWRkbAkoJWVzcCksJWVicAorCW1vdmRxYQktNDgoJWVicCksJXhtbTcKKwltb3ZkcWEJLTE2KCVlYnApLCV4bW02CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX192cGFlc19lbmNyeXB0X2NvcmUKKy5hbGlnbgk0CitfX3ZwYWVzX2VuY3J5cHRfY29yZToKKwltb3ZsCSQxNiwlZWN4CisJbW92bAkyNDAoJWVkeCksJWVheAorCW1vdmRxYQkleG1tNiwleG1tMQorCW1vdmRxYQkoJWVicCksJXhtbTIKKwlwYW5kbgkleG1tMCwleG1tMQorCXBhbmQJJXhtbTYsJXhtbTAKKwltb3ZkcXUJKCVlZHgpLCV4bW01CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwltb3ZkcWEJMTYoJWVicCksJXhtbTAKKwlweG9yCSV4bW01LCV4bW0yCisJcHNybGQJJDQsJXhtbTEKKwlhZGRsCSQxNiwlZWR4CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlsZWFsCTE5MiglZWJwKSwlZWJ4CisJcHhvcgkleG1tMiwleG1tMAorCWptcAlMMDAwZW5jX2VudHJ5CisuYWxpZ24JNCwweDkwCitMMDAxZW5jX2xvb3A6CisJbW92ZHFhCTMyKCVlYnApLCV4bW00CisJbW92ZHFhCTQ4KCVlYnApLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NQorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZkcWEJNjQoJWVicCksJXhtbTUKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCS02NCglZWJ4LCVlY3gsMSksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIzNAorCW1vdmRxYQk4MCglZWJwKSwleG1tMgorCW1vdmRxYQkoJWVieCwlZWN4LDEpLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW01LCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlhZGRsCSQxNiwlZWR4CisJcHhvcgkleG1tMiwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJYWRkbAkkMTYsJWVjeAorCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCWFuZGwJJDQ4LCVlY3gKKwlzdWJsCSQxLCVlYXgKKwlweG9yCSV4bW0zLCV4bW0wCitMMDAwZW5jX2VudHJ5OgorCW1vdmRxYQkleG1tNiwleG1tMQorCW1vdmRxYQktMzIoJWVicCksJXhtbTUKKwlwYW5kbgkleG1tMCwleG1tMQorCXBzcmxkCSQ0LCV4bW0xCisJcGFuZAkleG1tNiwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjMyCisJbW92ZHFhCSV4bW03LCV4bW0zCisJcHhvcgkleG1tMSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJbW92ZHFhCSV4bW03LCV4bW00CisJcHhvcgkleG1tNSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjI0CisJbW92ZHFhCSV4bW03LCV4bW0yCisJcHhvcgkleG1tNSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjExCisJbW92ZHFhCSV4bW03LCV4bW0zCisJcHhvcgkleG1tMCwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJbW92ZHF1CSglZWR4KSwleG1tNQorCXB4b3IJJXhtbTEsJXhtbTMKKwlqbnoJTDAwMWVuY19sb29wCisJbW92ZHFhCTk2KCVlYnApLCV4bW00CisJbW92ZHFhCTExMiglZWJwKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisJcHhvcgkleG1tNSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMTk1CisJbW92ZHFhCTY0KCVlYngsJWVjeCwxKSwleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCXJldAorLnByaXZhdGVfZXh0ZXJuCV9fdnBhZXNfZGVjcnlwdF9jb3JlCisuYWxpZ24JNAorX192cGFlc19kZWNyeXB0X2NvcmU6CisJbGVhbAk2MDgoJWVicCksJWVieAorCW1vdmwJMjQwKCVlZHgpLCVlYXgKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwltb3ZkcWEJLTY0KCVlYngpLCV4bW0yCisJcGFuZG4JJXhtbTAsJXhtbTEKKwltb3ZsCSVlYXgsJWVjeAorCXBzcmxkCSQ0LCV4bW0xCisJbW92ZHF1CSglZWR4KSwleG1tNQorCXNobGwJJDQsJWVjeAorCXBhbmQJJXhtbTYsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQktNDgoJWVieCksJXhtbTAKKwl4b3JsCSQ0OCwlZWN4CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlhbmRsCSQ0OCwlZWN4CisJcHhvcgkleG1tNSwleG1tMgorCW1vdmRxYQkxNzYoJWVicCksJXhtbTUKKwlweG9yCSV4bW0yLCV4bW0wCisJYWRkbAkkMTYsJWVkeAorCWxlYWwJLTM1MiglZWJ4LCVlY3gsMSksJWVjeAorCWptcAlMMDAyZGVjX2VudHJ5CisuYWxpZ24JNCwweDkwCitMMDAzZGVjX2xvb3A6CisJbW92ZHFhCS0zMiglZWJ4KSwleG1tNAorCW1vdmRxYQktMTYoJWVieCksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorLmJ5dGUJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQkoJWVieCksJXhtbTQKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCTE2KCVlYngpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQkzMiglZWJ4KSwleG1tNAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJNDgoJWVieCksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDMKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCTY0KCVlYngpLCV4bW00CisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQk4MCglZWJ4KSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMworCXB4b3IJJXhtbTQsJXhtbTAKKwlhZGRsCSQxNiwlZWR4CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDEyCisJcHhvcgkleG1tMSwleG1tMAorCXN1YmwJJDEsJWVheAorTDAwMmRlY19lbnRyeToKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwltb3ZkcWEJLTMyKCVlYnApLCV4bW0yCisJcGFuZG4JJXhtbTAsJXhtbTEKKwlwYW5kCSV4bW02LCV4bW0wCisJcHNybGQJJDQsJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQkleG1tNywleG1tMworCXB4b3IJJXhtbTEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCW1vdmRxYQkleG1tNywleG1tNAorCXB4b3IJJXhtbTIsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNAorCXB4b3IJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTcsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMQorCW1vdmRxYQkleG1tNywleG1tMworCXB4b3IJJXhtbTAsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMAorCW1vdmRxdQkoJWVkeCksJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0zCisJam56CUwwMDNkZWNfbG9vcAorCW1vdmRxYQk5NiglZWJ4KSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisJcHhvcgkleG1tMCwleG1tNAorCW1vdmRxYQkxMTIoJWVieCksJXhtbTAKKwltb3ZkcWEJKCVlY3gpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTUKKwlweG9yCSV4bW00LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTQKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX3ZwYWVzX3NjaGVkdWxlX2NvcmUKKy5hbGlnbgk0CitfX3ZwYWVzX3NjaGVkdWxlX2NvcmU6CisJYWRkbAkoJWVzcCksJWVicAorCW1vdmRxdQkoJWVzaSksJXhtbTAKKwltb3ZkcWEJMzIwKCVlYnApLCV4bW0yCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJbGVhbAkoJWVicCksJWVieAorCW1vdmRxYQkleG1tMiw0KCVlc3ApCisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmRxYQkleG1tMCwleG1tNworCXRlc3RsCSVlZGksJWVkaQorCWpueglMMDA0c2NoZWR1bGVfYW1fZGVjcnlwdGluZworCW1vdmRxdQkleG1tMCwoJWVkeCkKKwlqbXAJTDAwNXNjaGVkdWxlX2dvCitMMDA0c2NoZWR1bGVfYW1fZGVjcnlwdGluZzoKKwltb3ZkcWEJMjU2KCVlYnAsJWVjeCwxKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJbW92ZHF1CSV4bW0zLCglZWR4KQorCXhvcmwJJDQ4LCVlY3gKK0wwMDVzY2hlZHVsZV9nbzoKKwljbXBsCSQxOTIsJWVheAorCWphCUwwMDZzY2hlZHVsZV8yNTYKKwlqZQlMMDA3c2NoZWR1bGVfMTkyCitMMDA4c2NoZWR1bGVfMTI4OgorCW1vdmwJJDEwLCVlYXgKK0wwMDlsb29wX3NjaGVkdWxlXzEyODoKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWNsCSVlYXgKKwlqeglMMDEwc2NoZWR1bGVfbWFuZ2xlX2xhc3QKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJam1wCUwwMDlsb29wX3NjaGVkdWxlXzEyOAorLmFsaWduCTQsMHg5MAorTDAwN3NjaGVkdWxlXzE5MjoKKwltb3ZkcXUJOCglZXNpKSwleG1tMAorCWNhbGwJX192cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcWEJJXhtbTAsJXhtbTYKKwlweG9yCSV4bW00LCV4bW00CisJbW92aGxwcwkleG1tNCwleG1tNgorCW1vdmwJJDQsJWVheAorTDAxMWxvb3Bfc2NoZWR1bGVfMTkyOgorCWNhbGwJX192cGFlc19zY2hlZHVsZV9yb3VuZAorLmJ5dGUJMTAyLDE1LDU4LDE1LDE5OCw4CisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWNhbGwJX192cGFlc19zY2hlZHVsZV8xOTJfc21lYXIKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJZGVjbAklZWF4CisJanoJTDAxMHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWNhbGwJX192cGFlc19zY2hlZHVsZV8xOTJfc21lYXIKKwlqbXAJTDAxMWxvb3Bfc2NoZWR1bGVfMTkyCisuYWxpZ24JNCwweDkwCitMMDA2c2NoZWR1bGVfMjU2OgorCW1vdmRxdQkxNiglZXNpKSwleG1tMAorCWNhbGwJX192cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZsCSQ3LCVlYXgKK0wwMTJsb29wX3NjaGVkdWxlXzI1NjoKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJbW92ZHFhCSV4bW0wLCV4bW02CisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJZGVjbAklZWF4CisJanoJTDAxMHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCXBzaHVmZAkkMjU1LCV4bW0wLCV4bW0wCisJbW92ZHFhCSV4bW03LDIwKCVlc3ApCisJbW92ZHFhCSV4bW02LCV4bW03CisJY2FsbAlMX3ZwYWVzX3NjaGVkdWxlX2xvd19yb3VuZAorCW1vdmRxYQkyMCglZXNwKSwleG1tNworCWptcAlMMDEybG9vcF9zY2hlZHVsZV8yNTYKKy5hbGlnbgk0LDB4OTAKK0wwMTBzY2hlZHVsZV9tYW5nbGVfbGFzdDoKKwlsZWFsCTM4NCglZWJwKSwlZWJ4CisJdGVzdGwJJWVkaSwlZWRpCisJam56CUwwMTNzY2hlZHVsZV9tYW5nbGVfbGFzdF9kZWMKKwltb3ZkcWEJMjU2KCVlYnAsJWVjeCwxKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJbGVhbAkzNTIoJWVicCksJWVieAorCWFkZGwJJDMyLCVlZHgKK0wwMTNzY2hlZHVsZV9tYW5nbGVfbGFzdF9kZWM6CisJYWRkbAkkLTE2LCVlZHgKKwlweG9yCTMzNiglZWJwKSwleG1tMAorCWNhbGwJX192cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcXUJJXhtbTAsKCVlZHgpCisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcgorLmFsaWduCTQKK19fdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyOgorCXBzaHVmZAkkMTI4LCV4bW02LCV4bW0xCisJcHNodWZkCSQyNTQsJXhtbTcsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW02CisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwltb3ZobHBzCSV4bW0xLCV4bW02CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX192cGFlc19zY2hlZHVsZV9yb3VuZAorLmFsaWduCTQKK19fdnBhZXNfc2NoZWR1bGVfcm91bmQ6CisJbW92ZHFhCTgoJWVzcCksJXhtbTIKKwlweG9yCSV4bW0xLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjAyLDE1CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjEwLDE1CisJcHhvcgkleG1tMSwleG1tNworCXBzaHVmZAkkMjU1LCV4bW0wLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTgsMTUsMTkyLDEKKwltb3ZkcWEJJXhtbTIsOCglZXNwKQorTF92cGFlc19zY2hlZHVsZV9sb3dfcm91bmQ6CisJbW92ZHFhCSV4bW03LCV4bW0xCisJcHNsbGRxCSQ0LCV4bW03CisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tNywleG1tMQorCXBzbGxkcQkkOCwleG1tNworCXB4b3IJJXhtbTEsJXhtbTcKKwlweG9yCTMzNiglZWJwKSwleG1tNworCW1vdmRxYQktMTYoJWVicCksJXhtbTQKKwltb3ZkcWEJLTQ4KCVlYnApLCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTAsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTQsJXhtbTAKKwltb3ZkcWEJLTMyKCVlYnApLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCSV4bW0yLCV4bW0zCisJbW92ZHFhCSV4bW01LCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjQKKwlweG9yCSV4bW0yLCV4bW00CisJbW92ZHFhCSV4bW01LCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwlweG9yCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW01LCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjAKKwlweG9yCSV4bW0xLCV4bW0zCisJbW92ZHFhCTMyKCVlYnApLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKwltb3ZkcWEJNDgoJWVicCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NQorCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW03CisJcmV0CisucHJpdmF0ZV9leHRlcm4JX192cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKy5hbGlnbgk0CitfX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybToKKwltb3ZkcWEJLTE2KCVlYnApLCV4bW0yCisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcGFuZG4JJXhtbTAsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTIsJXhtbTAKKwltb3ZkcWEJKCVlYngpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwltb3ZkcWEJMTYoJWVieCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCXB4b3IJJXhtbTIsJXhtbTAKKwlyZXQKKy5wcml2YXRlX2V4dGVybglfX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorLmFsaWduCTQKK19fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlOgorCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkxMjgoJWVicCksJXhtbTUKKwl0ZXN0bAklZWRpLCVlZGkKKwlqbnoJTDAxNHNjaGVkdWxlX21hbmdsZV9kZWMKKwlhZGRsCSQxNiwlZWR4CisJcHhvcgkzMzYoJWVicCksJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyOQorCW1vdmRxYQkleG1tNCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjI5CisJcHhvcgkleG1tNCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjI5CisJcHhvcgkleG1tNCwleG1tMworCWptcAlMMDE1c2NoZWR1bGVfbWFuZ2xlX2JvdGgKKy5hbGlnbgk0LDB4OTAKK0wwMTRzY2hlZHVsZV9tYW5nbGVfZGVjOgorCW1vdmRxYQktMTYoJWVicCksJXhtbTIKKwlsZWFsCTQxNiglZWJwKSwlZXNpCisJbW92ZHFhCSV4bW0yLCV4bW0xCisJcGFuZG4JJXhtbTQsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTIsJXhtbTQKKwltb3ZkcWEJKCVlc2kpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTIKKwltb3ZkcWEJMTYoJWVzaSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJJXhtbTIsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMQorCW1vdmRxYQkzMiglZXNpKSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjEyCisJcHhvcgkleG1tMywleG1tMgorCW1vdmRxYQk0OCglZXNpKSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgkleG1tMiwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIxCisJbW92ZHFhCTY0KCVlc2kpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTIKKwlweG9yCSV4bW0zLCV4bW0yCisJbW92ZHFhCTgwKCVlc2kpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCSV4bW0yLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjEKKwltb3ZkcWEJOTYoJWVzaSksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcWEJMTEyKCVlc2kpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCSV4bW0yLCV4bW0zCisJYWRkbAkkLTE2LCVlZHgKK0wwMTVzY2hlZHVsZV9tYW5nbGVfYm90aDoKKwltb3ZkcWEJMjU2KCVlYnAsJWVjeCwxKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJYWRkbAkkLTE2LCVlY3gKKwlhbmRsCSQ0OCwlZWN4CisJbW92ZHF1CSV4bW0zLCglZWR4KQorCXJldAorLmdsb2JsCV92cGFlc19zZXRfZW5jcnlwdF9rZXkKKy5wcml2YXRlX2V4dGVybglfdnBhZXNfc2V0X2VuY3J5cHRfa2V5CisuYWxpZ24JNAorX3ZwYWVzX3NldF9lbmNyeXB0X2tleToKK0xfdnBhZXNfc2V0X2VuY3J5cHRfa2V5X2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwltb3ZsCTIwKCVlc3ApLCVlc2kKKwlsZWFsCS01NiglZXNwKSwlZWJ4CisJbW92bAkyNCglZXNwKSwlZWF4CisJYW5kbAkkLTE2LCVlYngKKwltb3ZsCTI4KCVlc3ApLCVlZHgKKwl4Y2hnbAklZXNwLCVlYngKKwltb3ZsCSVlYngsNDgoJWVzcCkKKwltb3ZsCSVlYXgsJWVieAorCXNocmwJJDUsJWVieAorCWFkZGwJJDUsJWVieAorCW1vdmwJJWVieCwyNDAoJWVkeCkKKwltb3ZsCSQ0OCwlZWN4CisJbW92bAkkMCwlZWRpCisJbGVhbAlMX3ZwYWVzX2NvbnN0cysweDMwLUwwMTZwaWNfcG9pbnQsJWVicAorCWNhbGwJX192cGFlc19zY2hlZHVsZV9jb3JlCitMMDE2cGljX3BvaW50OgorCW1vdmwJNDgoJWVzcCksJWVzcAorCXhvcmwJJWVheCwlZWF4CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX3ZwYWVzX3NldF9kZWNyeXB0X2tleQorLnByaXZhdGVfZXh0ZXJuCV92cGFlc19zZXRfZGVjcnlwdF9rZXkKKy5hbGlnbgk0CitfdnBhZXNfc2V0X2RlY3J5cHRfa2V5OgorTF92cGFlc19zZXRfZGVjcnlwdF9rZXlfYmVnaW46CisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCW1vdmwJMjAoJWVzcCksJWVzaQorCWxlYWwJLTU2KCVlc3ApLCVlYngKKwltb3ZsCTI0KCVlc3ApLCVlYXgKKwlhbmRsCSQtMTYsJWVieAorCW1vdmwJMjgoJWVzcCksJWVkeAorCXhjaGdsCSVlc3AsJWVieAorCW1vdmwJJWVieCw0OCglZXNwKQorCW1vdmwJJWVheCwlZWJ4CisJc2hybAkkNSwlZWJ4CisJYWRkbAkkNSwlZWJ4CisJbW92bAklZWJ4LDI0MCglZWR4KQorCXNobGwJJDQsJWVieAorCWxlYWwJMTYoJWVkeCwlZWJ4LDEpLCVlZHgKKwltb3ZsCSQxLCVlZGkKKwltb3ZsCSVlYXgsJWVjeAorCXNocmwJJDEsJWVjeAorCWFuZGwJJDMyLCVlY3gKKwl4b3JsCSQzMiwlZWN4CisJbGVhbAlMX3ZwYWVzX2NvbnN0cysweDMwLUwwMTdwaWNfcG9pbnQsJWVicAorCWNhbGwJX192cGFlc19zY2hlZHVsZV9jb3JlCitMMDE3cGljX3BvaW50OgorCW1vdmwJNDgoJWVzcCksJWVzcAorCXhvcmwJJWVheCwlZWF4CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX3ZwYWVzX2VuY3J5cHQKKy5wcml2YXRlX2V4dGVybglfdnBhZXNfZW5jcnlwdAorLmFsaWduCTQKK192cGFlc19lbmNyeXB0OgorTF92cGFlc19lbmNyeXB0X2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlsZWFsCUxfdnBhZXNfY29uc3RzKzB4MzAtTDAxOHBpY19wb2ludCwlZWJwCisJY2FsbAlfX3ZwYWVzX3ByZWhlYXQKK0wwMThwaWNfcG9pbnQ6CisJbW92bAkyMCglZXNwKSwlZXNpCisJbGVhbAktNTYoJWVzcCksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCWFuZGwJJC0xNiwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWR4CisJeGNoZ2wJJWVzcCwlZWJ4CisJbW92bAklZWJ4LDQ4KCVlc3ApCisJbW92ZHF1CSglZXNpKSwleG1tMAorCWNhbGwJX192cGFlc19lbmNyeXB0X2NvcmUKKwltb3ZkcXUJJXhtbTAsKCVlZGkpCisJbW92bAk0OCglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX3ZwYWVzX2RlY3J5cHQKKy5wcml2YXRlX2V4dGVybglfdnBhZXNfZGVjcnlwdAorLmFsaWduCTQKK192cGFlc19kZWNyeXB0OgorTF92cGFlc19kZWNyeXB0X2JlZ2luOgorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlsZWFsCUxfdnBhZXNfY29uc3RzKzB4MzAtTDAxOXBpY19wb2ludCwlZWJwCisJY2FsbAlfX3ZwYWVzX3ByZWhlYXQKK0wwMTlwaWNfcG9pbnQ6CisJbW92bAkyMCglZXNwKSwlZXNpCisJbGVhbAktNTYoJWVzcCksJWVieAorCW1vdmwJMjQoJWVzcCksJWVkaQorCWFuZGwJJC0xNiwlZWJ4CisJbW92bAkyOCglZXNwKSwlZWR4CisJeGNoZ2wJJWVzcCwlZWJ4CisJbW92bAklZWJ4LDQ4KCVlc3ApCisJbW92ZHF1CSglZXNpKSwleG1tMAorCWNhbGwJX192cGFlc19kZWNyeXB0X2NvcmUKKwltb3ZkcXUJJXhtbTAsKCVlZGkpCisJbW92bAk0OCglZXNwKSwlZXNwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisuZ2xvYmwJX3ZwYWVzX2NiY19lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4JX3ZwYWVzX2NiY19lbmNyeXB0CisuYWxpZ24JNAorX3ZwYWVzX2NiY19lbmNyeXB0OgorTF92cGFlc19jYmNfZW5jcnlwdF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJbW92bAkyMCglZXNwKSwlZXNpCisJbW92bAkyNCglZXNwKSwlZWRpCisJbW92bAkyOCglZXNwKSwlZWF4CisJbW92bAkzMiglZXNwKSwlZWR4CisJc3VibAkkMTYsJWVheAorCWpjCUwwMjBjYmNfYWJvcnQKKwlsZWFsCS01NiglZXNwKSwlZWJ4CisJbW92bAkzNiglZXNwKSwlZWJwCisJYW5kbAkkLTE2LCVlYngKKwltb3ZsCTQwKCVlc3ApLCVlY3gKKwl4Y2hnbAklZXNwLCVlYngKKwltb3ZkcXUJKCVlYnApLCV4bW0xCisJc3VibAklZXNpLCVlZGkKKwltb3ZsCSVlYngsNDgoJWVzcCkKKwltb3ZsCSVlZGksKCVlc3ApCisJbW92bAklZWR4LDQoJWVzcCkKKwltb3ZsCSVlYnAsOCglZXNwKQorCW1vdmwJJWVheCwlZWRpCisJbGVhbAlMX3ZwYWVzX2NvbnN0cysweDMwLUwwMjFwaWNfcG9pbnQsJWVicAorCWNhbGwJX192cGFlc19wcmVoZWF0CitMMDIxcGljX3BvaW50OgorCWNtcGwJJDAsJWVjeAorCWplCUwwMjJjYmNfZGVjX2xvb3AKKwlqbXAJTDAyM2NiY19lbmNfbG9vcAorLmFsaWduCTQsMHg5MAorTDAyM2NiY19lbmNfbG9vcDoKKwltb3ZkcXUJKCVlc2kpLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMAorCWNhbGwJX192cGFlc19lbmNyeXB0X2NvcmUKKwltb3ZsCSglZXNwKSwlZWJ4CisJbW92bAk0KCVlc3ApLCVlZHgKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcXUJJXhtbTAsKCVlYngsJWVzaSwxKQorCWxlYWwJMTYoJWVzaSksJWVzaQorCXN1YmwJJDE2LCVlZGkKKwlqbmMJTDAyM2NiY19lbmNfbG9vcAorCWptcAlMMDI0Y2JjX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwMjJjYmNfZGVjX2xvb3A6CisJbW92ZHF1CSglZXNpKSwleG1tMAorCW1vdmRxYQkleG1tMSwxNiglZXNwKQorCW1vdmRxYQkleG1tMCwzMiglZXNwKQorCWNhbGwJX192cGFlc19kZWNyeXB0X2NvcmUKKwltb3ZsCSglZXNwKSwlZWJ4CisJbW92bAk0KCVlc3ApLCVlZHgKKwlweG9yCTE2KCVlc3ApLCV4bW0wCisJbW92ZHFhCTMyKCVlc3ApLCV4bW0xCisJbW92ZHF1CSV4bW0wLCglZWJ4LCVlc2ksMSkKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwlzdWJsCSQxNiwlZWRpCisJam5jCUwwMjJjYmNfZGVjX2xvb3AKK0wwMjRjYmNfZG9uZToKKwltb3ZsCTgoJWVzcCksJWVieAorCW1vdmwJNDgoJWVzcCksJWVzcAorCW1vdmRxdQkleG1tMSwoJWVieCkKK0wwMjBjYmNfYWJvcnQ6CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS94ODYtbW9udC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2L2NyeXB0by9maXBzbW9kdWxlL3g4Ni1tb250LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxOTU0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS94ODYtbW9udC5TCkBAIC0wLDAgKzEsNDc5IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykKKy50ZXh0CisuZ2xvYmwJX2JuX211bF9tb250CisucHJpdmF0ZV9leHRlcm4JX2JuX211bF9tb250CisuYWxpZ24JNAorX2JuX211bF9tb250OgorTF9ibl9tdWxfbW9udF9iZWdpbjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCTQwKCVlc3ApLCVlZGkKKwljbXBsCSQ0LCVlZGkKKwlqbAlMMDAwanVzdF9sZWF2ZQorCWxlYWwJMjAoJWVzcCksJWVzaQorCWxlYWwJMjQoJWVzcCksJWVkeAorCWFkZGwJJDIsJWVkaQorCW5lZ2wJJWVkaQorCWxlYWwJLTMyKCVlc3AsJWVkaSw0KSwlZWJwCisJbmVnbAklZWRpCisJbW92bAklZWJwLCVlYXgKKwlzdWJsCSVlZHgsJWVheAorCWFuZGwJJDIwNDcsJWVheAorCXN1YmwJJWVheCwlZWJwCisJeG9ybAklZWJwLCVlZHgKKwlhbmRsCSQyMDQ4LCVlZHgKKwl4b3JsCSQyMDQ4LCVlZHgKKwlzdWJsCSVlZHgsJWVicAorCWFuZGwJJC02NCwlZWJwCisJbW92bAklZXNwLCVlYXgKKwlzdWJsCSVlYnAsJWVheAorCWFuZGwJJC00MDk2LCVlYXgKKwltb3ZsCSVlc3AsJWVkeAorCWxlYWwJKCVlYnAsJWVheCwxKSwlZXNwCisJbW92bAkoJWVzcCksJWVheAorCWNtcGwJJWVicCwlZXNwCisJamEJTDAwMXBhZ2Vfd2FsaworCWptcAlMMDAycGFnZV93YWxrX2RvbmUKKy5hbGlnbgk0LDB4OTAKK0wwMDFwYWdlX3dhbGs6CisJbGVhbAktNDA5NiglZXNwKSwlZXNwCisJbW92bAkoJWVzcCksJWVheAorCWNtcGwJJWVicCwlZXNwCisJamEJTDAwMXBhZ2Vfd2FsaworTDAwMnBhZ2Vfd2Fsa19kb25lOgorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJOCglZXNpKSwlZWN4CisJbW92bAkxMiglZXNpKSwlZWJwCisJbW92bAkxNiglZXNpKSwlZXNpCisJbW92bAkoJWVzaSksJWVzaQorCW1vdmwJJWVheCw0KCVlc3ApCisJbW92bAklZWJ4LDgoJWVzcCkKKwltb3ZsCSVlY3gsMTIoJWVzcCkKKwltb3ZsCSVlYnAsMTYoJWVzcCkKKwltb3ZsCSVlc2ksMjAoJWVzcCkKKwlsZWFsCS0zKCVlZGkpLCVlYngKKwltb3ZsCSVlZHgsMjQoJWVzcCkKKwljYWxsCUwwMDNQSUNfbWVfdXAKK0wwMDNQSUNfbWVfdXA6CisJcG9wbAklZWF4CisJbW92bAlMX09QRU5TU0xfaWEzMmNhcF9QJG5vbl9sYXp5X3B0ci1MMDAzUElDX21lX3VwKCVlYXgpLCVlYXgKKwlidGwJJDI2LCglZWF4KQorCWpuYwlMMDA0bm9uX3NzZTIKKwltb3ZsCSQtMSwlZWF4CisJbW92ZAklZWF4LCVtbTcKKwltb3ZsCTgoJWVzcCksJWVzaQorCW1vdmwJMTIoJWVzcCksJWVkaQorCW1vdmwJMTYoJWVzcCksJWVicAorCXhvcmwJJWVkeCwlZWR4CisJeG9ybAklZWN4LCVlY3gKKwltb3ZkCSglZWRpKSwlbW00CisJbW92ZAkoJWVzaSksJW1tNQorCW1vdmQJKCVlYnApLCVtbTMKKwlwbXVsdWRxCSVtbTQsJW1tNQorCW1vdnEJJW1tNSwlbW0yCisJbW92cQklbW01LCVtbTAKKwlwYW5kCSVtbTcsJW1tMAorCXBtdWx1ZHEJMjAoJWVzcCksJW1tNQorCXBtdWx1ZHEJJW1tNSwlbW0zCisJcGFkZHEJJW1tMCwlbW0zCisJbW92ZAk0KCVlYnApLCVtbTEKKwltb3ZkCTQoJWVzaSksJW1tMAorCXBzcmxxCSQzMiwlbW0yCisJcHNybHEJJDMyLCVtbTMKKwlpbmNsCSVlY3gKKy5hbGlnbgk0LDB4OTAKK0wwMDUxc3Q6CisJcG11bHVkcQklbW00LCVtbTAKKwlwbXVsdWRxCSVtbTUsJW1tMQorCXBhZGRxCSVtbTAsJW1tMgorCXBhZGRxCSVtbTEsJW1tMworCW1vdnEJJW1tMiwlbW0wCisJcGFuZAklbW03LCVtbTAKKwltb3ZkCTQoJWVicCwlZWN4LDQpLCVtbTEKKwlwYWRkcQklbW0wLCVtbTMKKwltb3ZkCTQoJWVzaSwlZWN4LDQpLCVtbTAKKwlwc3JscQkkMzIsJW1tMgorCW1vdmQJJW1tMywyOCglZXNwLCVlY3gsNCkKKwlwc3JscQkkMzIsJW1tMworCWxlYWwJMSglZWN4KSwlZWN4CisJY21wbAklZWJ4LCVlY3gKKwlqbAlMMDA1MXN0CisJcG11bHVkcQklbW00LCVtbTAKKwlwbXVsdWRxCSVtbTUsJW1tMQorCXBhZGRxCSVtbTAsJW1tMgorCXBhZGRxCSVtbTEsJW1tMworCW1vdnEJJW1tMiwlbW0wCisJcGFuZAklbW03LCVtbTAKKwlwYWRkcQklbW0wLCVtbTMKKwltb3ZkCSVtbTMsMjgoJWVzcCwlZWN4LDQpCisJcHNybHEJJDMyLCVtbTIKKwlwc3JscQkkMzIsJW1tMworCXBhZGRxCSVtbTIsJW1tMworCW1vdnEJJW1tMywzMiglZXNwLCVlYngsNCkKKwlpbmNsCSVlZHgKK0wwMDZvdXRlcjoKKwl4b3JsCSVlY3gsJWVjeAorCW1vdmQJKCVlZGksJWVkeCw0KSwlbW00CisJbW92ZAkoJWVzaSksJW1tNQorCW1vdmQJMzIoJWVzcCksJW1tNgorCW1vdmQJKCVlYnApLCVtbTMKKwlwbXVsdWRxCSVtbTQsJW1tNQorCXBhZGRxCSVtbTYsJW1tNQorCW1vdnEJJW1tNSwlbW0wCisJbW92cQklbW01LCVtbTIKKwlwYW5kCSVtbTcsJW1tMAorCXBtdWx1ZHEJMjAoJWVzcCksJW1tNQorCXBtdWx1ZHEJJW1tNSwlbW0zCisJcGFkZHEJJW1tMCwlbW0zCisJbW92ZAkzNiglZXNwKSwlbW02CisJbW92ZAk0KCVlYnApLCVtbTEKKwltb3ZkCTQoJWVzaSksJW1tMAorCXBzcmxxCSQzMiwlbW0yCisJcHNybHEJJDMyLCVtbTMKKwlwYWRkcQklbW02LCVtbTIKKwlpbmNsCSVlY3gKKwlkZWNsCSVlYngKK0wwMDdpbm5lcjoKKwlwbXVsdWRxCSVtbTQsJW1tMAorCXBtdWx1ZHEJJW1tNSwlbW0xCisJcGFkZHEJJW1tMCwlbW0yCisJcGFkZHEJJW1tMSwlbW0zCisJbW92cQklbW0yLCVtbTAKKwltb3ZkCTM2KCVlc3AsJWVjeCw0KSwlbW02CisJcGFuZAklbW03LCVtbTAKKwltb3ZkCTQoJWVicCwlZWN4LDQpLCVtbTEKKwlwYWRkcQklbW0wLCVtbTMKKwltb3ZkCTQoJWVzaSwlZWN4LDQpLCVtbTAKKwlwc3JscQkkMzIsJW1tMgorCW1vdmQJJW1tMywyOCglZXNwLCVlY3gsNCkKKwlwc3JscQkkMzIsJW1tMworCXBhZGRxCSVtbTYsJW1tMgorCWRlY2wJJWVieAorCWxlYWwJMSglZWN4KSwlZWN4CisJam56CUwwMDdpbm5lcgorCW1vdmwJJWVjeCwlZWJ4CisJcG11bHVkcQklbW00LCVtbTAKKwlwbXVsdWRxCSVtbTUsJW1tMQorCXBhZGRxCSVtbTAsJW1tMgorCXBhZGRxCSVtbTEsJW1tMworCW1vdnEJJW1tMiwlbW0wCisJcGFuZAklbW03LCVtbTAKKwlwYWRkcQklbW0wLCVtbTMKKwltb3ZkCSVtbTMsMjgoJWVzcCwlZWN4LDQpCisJcHNybHEJJDMyLCVtbTIKKwlwc3JscQkkMzIsJW1tMworCW1vdmQJMzYoJWVzcCwlZWJ4LDQpLCVtbTYKKwlwYWRkcQklbW0yLCVtbTMKKwlwYWRkcQklbW02LCVtbTMKKwltb3ZxCSVtbTMsMzIoJWVzcCwlZWJ4LDQpCisJbGVhbAkxKCVlZHgpLCVlZHgKKwljbXBsCSVlYngsJWVkeAorCWpsZQlMMDA2b3V0ZXIKKwllbW1zCisJam1wCUwwMDhjb21tb25fdGFpbAorLmFsaWduCTQsMHg5MAorTDAwNG5vbl9zc2UyOgorCW1vdmwJOCglZXNwKSwlZXNpCisJbGVhbAkxKCVlYngpLCVlYnAKKwltb3ZsCTEyKCVlc3ApLCVlZGkKKwl4b3JsCSVlY3gsJWVjeAorCW1vdmwJJWVzaSwlZWR4CisJYW5kbAkkMSwlZWJwCisJc3VibAklZWRpLCVlZHgKKwlsZWFsCTQoJWVkaSwlZWJ4LDQpLCVlYXgKKwlvcmwJJWVkeCwlZWJwCisJbW92bAkoJWVkaSksJWVkaQorCWp6CUwwMDlibl9zcXJfbW9udAorCW1vdmwJJWVheCwyOCglZXNwKQorCW1vdmwJKCVlc2kpLCVlYXgKKwl4b3JsCSVlZHgsJWVkeAorLmFsaWduCTQsMHg5MAorTDAxMG11bGw6CisJbW92bAklZWR4LCVlYnAKKwltdWxsCSVlZGkKKwlhZGRsCSVlYXgsJWVicAorCWxlYWwJMSglZWN4KSwlZWN4CisJYWRjbAkkMCwlZWR4CisJbW92bAkoJWVzaSwlZWN4LDQpLCVlYXgKKwljbXBsCSVlYngsJWVjeAorCW1vdmwJJWVicCwyOCglZXNwLCVlY3gsNCkKKwlqbAlMMDEwbXVsbAorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRkbAklZWJwLCVlYXgKKwltb3ZsCTE2KCVlc3ApLCVlc2kKKwlhZGNsCSQwLCVlZHgKKwlpbXVsbAkzMiglZXNwKSwlZWRpCisJbW92bAklZWF4LDMyKCVlc3AsJWVieCw0KQorCXhvcmwJJWVjeCwlZWN4CisJbW92bAklZWR4LDM2KCVlc3AsJWVieCw0KQorCW1vdmwJJWVjeCw0MCglZXNwLCVlYngsNCkKKwltb3ZsCSglZXNpKSwlZWF4CisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwKSwlZWF4CisJbW92bAk0KCVlc2kpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlpbmNsCSVlY3gKKwlqbXAJTDAxMTJuZG1hZGQKKy5hbGlnbgk0LDB4OTAKK0wwMTIxc3RtYWRkOgorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwLCVlY3gsNCksJWVicAorCWxlYWwJMSglZWN4KSwlZWN4CisJYWRjbAkkMCwlZWR4CisJYWRkbAklZWF4LCVlYnAKKwltb3ZsCSglZXNpLCVlY3gsNCksJWVheAorCWFkY2wJJDAsJWVkeAorCWNtcGwJJWVieCwlZWN4CisJbW92bAklZWJwLDI4KCVlc3AsJWVjeCw0KQorCWpsCUwwMTIxc3RtYWRkCisJbW92bAklZWR4LCVlYnAKKwltdWxsCSVlZGkKKwlhZGRsCTMyKCVlc3AsJWVieCw0KSwlZWF4CisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRjbAkkMCwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJYWRkbAklZWF4LCVlYnAKKwlhZGNsCSQwLCVlZHgKKwlpbXVsbAkzMiglZXNwKSwlZWRpCisJeG9ybAklZWN4LCVlY3gKKwlhZGRsCTM2KCVlc3AsJWVieCw0KSwlZWR4CisJbW92bAklZWJwLDMyKCVlc3AsJWVieCw0KQorCWFkY2wJJDAsJWVjeAorCW1vdmwJKCVlc2kpLCVlYXgKKwltb3ZsCSVlZHgsMzYoJWVzcCwlZWJ4LDQpCisJbW92bAklZWN4LDQwKCVlc3AsJWVieCw0KQorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCksJWVheAorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWR4CisJbW92bAkkMSwlZWN4CisuYWxpZ24JNCwweDkwCitMMDExMm5kbWFkZDoKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCwlZWN4LDQpLCVlYnAKKwlsZWFsCTEoJWVjeCksJWVjeAorCWFkY2wJJDAsJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkoJWVzaSwlZWN4LDQpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwljbXBsCSVlYngsJWVjeAorCW1vdmwJJWVicCwyNCglZXNwLCVlY3gsNCkKKwlqbAlMMDExMm5kbWFkZAorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwLCVlYngsNCksJWVicAorCWFkY2wJJDAsJWVkeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAkkMCwlZWR4CisJbW92bAklZWJwLDI4KCVlc3AsJWVieCw0KQorCXhvcmwJJWVheCwlZWF4CisJbW92bAkxMiglZXNwKSwlZWN4CisJYWRkbAkzNiglZXNwLCVlYngsNCksJWVkeAorCWFkY2wJNDAoJWVzcCwlZWJ4LDQpLCVlYXgKKwlsZWFsCTQoJWVjeCksJWVjeAorCW1vdmwJJWVkeCwzMiglZXNwLCVlYngsNCkKKwljbXBsCTI4KCVlc3ApLCVlY3gKKwltb3ZsCSVlYXgsMzYoJWVzcCwlZWJ4LDQpCisJamUJTDAwOGNvbW1vbl90YWlsCisJbW92bAkoJWVjeCksJWVkaQorCW1vdmwJOCglZXNwKSwlZXNpCisJbW92bAklZWN4LDEyKCVlc3ApCisJeG9ybAklZWN4LCVlY3gKKwl4b3JsCSVlZHgsJWVkeAorCW1vdmwJKCVlc2kpLCVlYXgKKwlqbXAJTDAxMjFzdG1hZGQKKy5hbGlnbgk0LDB4OTAKK0wwMDlibl9zcXJfbW9udDoKKwltb3ZsCSVlYngsKCVlc3ApCisJbW92bAklZWN4LDEyKCVlc3ApCisJbW92bAklZWRpLCVlYXgKKwltdWxsCSVlZGkKKwltb3ZsCSVlYXgsMzIoJWVzcCkKKwltb3ZsCSVlZHgsJWVieAorCXNocmwJJDEsJWVkeAorCWFuZGwJJDEsJWVieAorCWluY2wJJWVjeAorLmFsaWduCTQsMHg5MAorTDAxM3NxcjoKKwltb3ZsCSglZXNpLCVlY3gsNCksJWVheAorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJYWRkbAklZWJwLCVlYXgKKwlsZWFsCTEoJWVjeCksJWVjeAorCWFkY2wJJDAsJWVkeAorCWxlYWwJKCVlYngsJWVheCwyKSwlZWJwCisJc2hybAkkMzEsJWVheAorCWNtcGwJKCVlc3ApLCVlY3gKKwltb3ZsCSVlYXgsJWVieAorCW1vdmwJJWVicCwyOCglZXNwLCVlY3gsNCkKKwlqbAlMMDEzc3FyCisJbW92bAkoJWVzaSwlZWN4LDQpLCVlYXgKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJJWVicCwlZWF4CisJbW92bAkyMCglZXNwKSwlZWRpCisJYWRjbAkkMCwlZWR4CisJbW92bAkxNiglZXNwKSwlZXNpCisJbGVhbAkoJWVieCwlZWF4LDIpLCVlYnAKKwlpbXVsbAkzMiglZXNwKSwlZWRpCisJc2hybAkkMzEsJWVheAorCW1vdmwJJWVicCwzMiglZXNwLCVlY3gsNCkKKwlsZWFsCSglZWF4LCVlZHgsMiksJWVicAorCW1vdmwJKCVlc2kpLCVlYXgKKwlzaHJsCSQzMSwlZWR4CisJbW92bAklZWJwLDM2KCVlc3AsJWVjeCw0KQorCW1vdmwJJWVkeCw0MCglZXNwLCVlY3gsNCkKKwltdWxsCSVlZGkKKwlhZGRsCTMyKCVlc3ApLCVlYXgKKwltb3ZsCSVlY3gsJWVieAorCWFkY2wJJDAsJWVkeAorCW1vdmwJNCglZXNpKSwlZWF4CisJbW92bAkkMSwlZWN4CisuYWxpZ24JNCwweDkwCitMMDE0M3JkbWFkZDoKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzIoJWVzcCwlZWN4LDQpLCVlYnAKKwlhZGNsCSQwLCVlZHgKKwlhZGRsCSVlYXgsJWVicAorCW1vdmwJNCglZXNpLCVlY3gsNCksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVicCwyOCglZXNwLCVlY3gsNCkKKwltb3ZsCSVlZHgsJWVicAorCW11bGwJJWVkaQorCWFkZGwJMzYoJWVzcCwlZWN4LDQpLCVlYnAKKwlsZWFsCTIoJWVjeCksJWVjeAorCWFkY2wJJDAsJWVkeAorCWFkZGwJJWVheCwlZWJwCisJbW92bAkoJWVzaSwlZWN4LDQpLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwljbXBsCSVlYngsJWVjeAorCW1vdmwJJWVicCwyNCglZXNwLCVlY3gsNCkKKwlqbAlMMDE0M3JkbWFkZAorCW1vdmwJJWVkeCwlZWJwCisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwLCVlYngsNCksJWVicAorCWFkY2wJJDAsJWVkeAorCWFkZGwJJWVheCwlZWJwCisJYWRjbAkkMCwlZWR4CisJbW92bAklZWJwLDI4KCVlc3AsJWVieCw0KQorCW1vdmwJMTIoJWVzcCksJWVjeAorCXhvcmwJJWVheCwlZWF4CisJbW92bAk4KCVlc3ApLCVlc2kKKwlhZGRsCTM2KCVlc3AsJWVieCw0KSwlZWR4CisJYWRjbAk0MCglZXNwLCVlYngsNCksJWVheAorCW1vdmwJJWVkeCwzMiglZXNwLCVlYngsNCkKKwljbXBsCSVlYngsJWVjeAorCW1vdmwJJWVheCwzNiglZXNwLCVlYngsNCkKKwlqZQlMMDA4Y29tbW9uX3RhaWwKKwltb3ZsCTQoJWVzaSwlZWN4LDQpLCVlZGkKKwlsZWFsCTEoJWVjeCksJWVjeAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWN4LDEyKCVlc3ApCisJbXVsbAklZWRpCisJYWRkbAkzMiglZXNwLCVlY3gsNCksJWVheAorCWFkY2wJJDAsJWVkeAorCW1vdmwJJWVheCwzMiglZXNwLCVlY3gsNCkKKwl4b3JsCSVlYnAsJWVicAorCWNtcGwJJWVieCwlZWN4CisJbGVhbAkxKCVlY3gpLCVlY3gKKwlqZQlMMDE1c3FybGFzdAorCW1vdmwJJWVkeCwlZWJ4CisJc2hybAkkMSwlZWR4CisJYW5kbAkkMSwlZWJ4CisuYWxpZ24JNCwweDkwCitMMDE2c3FyYWRkOgorCW1vdmwJKCVlc2ksJWVjeCw0KSwlZWF4CisJbW92bAklZWR4LCVlYnAKKwltdWxsCSVlZGkKKwlhZGRsCSVlYnAsJWVheAorCWxlYWwJKCVlYXgsJWVheCwxKSwlZWJwCisJYWRjbAkkMCwlZWR4CisJc2hybAkkMzEsJWVheAorCWFkZGwJMzIoJWVzcCwlZWN4LDQpLCVlYnAKKwlsZWFsCTEoJWVjeCksJWVjeAorCWFkY2wJJDAsJWVheAorCWFkZGwJJWVieCwlZWJwCisJYWRjbAkkMCwlZWF4CisJY21wbAkoJWVzcCksJWVjeAorCW1vdmwJJWVicCwyOCglZXNwLCVlY3gsNCkKKwltb3ZsCSVlYXgsJWVieAorCWpsZQlMMDE2c3FyYWRkCisJbW92bAklZWR4LCVlYnAKKwlhZGRsCSVlZHgsJWVkeAorCXNocmwJJDMxLCVlYnAKKwlhZGRsCSVlYngsJWVkeAorCWFkY2wJJDAsJWVicAorTDAxNXNxcmxhc3Q6CisJbW92bAkyMCglZXNwKSwlZWRpCisJbW92bAkxNiglZXNwKSwlZXNpCisJaW11bGwJMzIoJWVzcCksJWVkaQorCWFkZGwJMzIoJWVzcCwlZWN4LDQpLCVlZHgKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRjbAkkMCwlZWJwCisJbW92bAklZWR4LDMyKCVlc3AsJWVjeCw0KQorCW1vdmwJJWVicCwzNiglZXNwLCVlY3gsNCkKKwltdWxsCSVlZGkKKwlhZGRsCTMyKCVlc3ApLCVlYXgKKwlsZWFsCS0xKCVlY3gpLCVlYngKKwlhZGNsCSQwLCVlZHgKKwltb3ZsCSQxLCVlY3gKKwltb3ZsCTQoJWVzaSksJWVheAorCWptcAlMMDE0M3JkbWFkZAorLmFsaWduCTQsMHg5MAorTDAwOGNvbW1vbl90YWlsOgorCW1vdmwJMTYoJWVzcCksJWVicAorCW1vdmwJNCglZXNwKSwlZWRpCisJbGVhbAkzMiglZXNwKSwlZXNpCisJbW92bAkoJWVzaSksJWVheAorCW1vdmwJJWVieCwlZWN4CisJeG9ybAklZWR4LCVlZHgKKy5hbGlnbgk0LDB4OTAKK0wwMTdzdWI6CisJc2JibAkoJWVicCwlZWR4LDQpLCVlYXgKKwltb3ZsCSVlYXgsKCVlZGksJWVkeCw0KQorCWRlY2wJJWVjeAorCW1vdmwJNCglZXNpLCVlZHgsNCksJWVheAorCWxlYWwJMSglZWR4KSwlZWR4CisJamdlCUwwMTdzdWIKKwlzYmJsCSQwLCVlYXgKKwltb3ZsCSQtMSwlZWR4CisJeG9ybAklZWF4LCVlZHgKKwlqbXAJTDAxOGNvcHkKKy5hbGlnbgk0LDB4OTAKK0wwMThjb3B5OgorCW1vdmwJMzIoJWVzcCwlZWJ4LDQpLCVlc2kKKwltb3ZsCSglZWRpLCVlYngsNCksJWVicAorCW1vdmwJJWVjeCwzMiglZXNwLCVlYngsNCkKKwlhbmRsCSVlYXgsJWVzaQorCWFuZGwJJWVkeCwlZWJwCisJb3JsCSVlc2ksJWVicAorCW1vdmwJJWVicCwoJWVkaSwlZWJ4LDQpCisJZGVjbAklZWJ4CisJamdlCUwwMThjb3B5CisJbW92bAkyNCglZXNwKSwlZXNwCisJbW92bAkkMSwlZWF4CitMMDAwanVzdF9sZWF2ZToKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKKy5ieXRlCTc3LDExMSwxMTAsMTE2LDEwMywxMTEsMTA5LDEwMSwxMTQsMTIxLDMyLDc3LDExNywxMDgsMTE2LDEwNQorLmJ5dGUJMTEyLDEwOCwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1NgorLmJ5dGUJNTQsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxCisuYnl0ZQkzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2CisuYnl0ZQkxMTEsMTE0LDEwMyw2MiwwCisuc2VjdGlvbiBfX0lNUE9SVCxfX3BvaW50ZXJzLG5vbl9sYXp5X3N5bWJvbF9wb2ludGVycworTF9PUEVOU1NMX2lhMzJjYXBfUCRub25fbGF6eV9wdHI6CisuaW5kaXJlY3Rfc3ltYm9sCV9PUEVOU1NMX2lhMzJjYXBfUAorLmxvbmcJMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2NoYWNoYS9jaGFjaGEteDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2NoYWNoYS9jaGFjaGEteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlZGM3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODZfNjQuUwpAQCAtMCwwICsxLDE1ODUgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisKKworCisucDJhbGlnbgk2CitMJHplcm86CisubG9uZwkwLDAsMCwwCitMJG9uZToKKy5sb25nCTEsMCwwLDAKK0wkaW5jOgorLmxvbmcJMCwxLDIsMworTCRmb3VyOgorLmxvbmcJNCw0LDQsNAorTCRpbmN5OgorLmxvbmcJMCwyLDQsNiwxLDMsNSw3CitMJGVpZ2h0OgorLmxvbmcJOCw4LDgsOCw4LDgsOCw4CitMJHJvdDE2OgorLmJ5dGUJMHgyLDB4MywweDAsMHgxLCAweDYsMHg3LDB4NCwweDUsIDB4YSwweGIsMHg4LDB4OSwgMHhlLDB4ZiwweGMsMHhkCitMJHJvdDI0OgorLmJ5dGUJMHgzLDB4MCwweDEsMHgyLCAweDcsMHg0LDB4NSwweDYsIDB4YiwweDgsMHg5LDB4YSwgMHhmLDB4YywweGQsMHhlCitMJHNpZ21hOgorLmJ5dGUJMTAxLDEyMCwxMTIsOTcsMTEwLDEwMCwzMiw1MSw1MCw0NSw5OCwxMjEsMTE2LDEwMSwzMiwxMDcsMAorLnAyYWxpZ24JNgorTCR6ZXJvejoKKy5sb25nCTAsMCwwLDAsIDEsMCwwLDAsIDIsMCwwLDAsIDMsMCwwLDAKK0wkZm91cno6CisubG9uZwk0LDAsMCwwLCA0LDAsMCwwLCA0LDAsMCwwLCA0LDAsMCwwCitMJGluY3o6CisubG9uZwkwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CitMJHNpeHRlZW46CisubG9uZwkxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNgorLmJ5dGUJNjcsMTA0LDk3LDY3LDEwNCw5Nyw1MCw0OCwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLmdsb2JsCV9DaGFDaGEyMF9jdHIzMgorLnByaXZhdGVfZXh0ZXJuIF9DaGFDaGEyMF9jdHIzMgorCisucDJhbGlnbgk2CitfQ2hhQ2hhMjBfY3RyMzI6CisJY21wcQkkMCwlcmR4CisJamUJTCRub19kYXRhCisJbW92cQlfT1BFTlNTTF9pYTMyY2FwX1ArNCglcmlwKSwlcjEwCisJdGVzdGwJJDUxMiwlcjEwZAorCWpueglMJENoYUNoYTIwX3Nzc2UzCisKKwlwdXNocQklcmJ4CisJcHVzaHEJJXJicAorCXB1c2hxCSVyMTIKKwlwdXNocQklcjEzCisJcHVzaHEJJXIxNAorCXB1c2hxCSVyMTUKKwlzdWJxCSQ2NCsyNCwlcnNwCitMJGN0cjMyX2JvZHk6CisKKworCW1vdmRxdQkoJXJjeCksJXhtbTEKKwltb3ZkcXUJMTYoJXJjeCksJXhtbTIKKwltb3ZkcXUJKCVyOCksJXhtbTMKKwltb3ZkcWEJTCRvbmUoJXJpcCksJXhtbTQKKworCisJbW92ZHFhCSV4bW0xLDE2KCVyc3ApCisJbW92ZHFhCSV4bW0yLDMyKCVyc3ApCisJbW92ZHFhCSV4bW0zLDQ4KCVyc3ApCisJbW92cQklcmR4LCVyYnAKKwlqbXAJTCRvb3Bfb3V0ZXIKKworLnAyYWxpZ24JNQorTCRvb3Bfb3V0ZXI6CisJbW92bAkkMHg2MTcwNzg2NSwlZWF4CisJbW92bAkkMHgzMzIwNjQ2ZSwlZWJ4CisJbW92bAkkMHg3OTYyMmQzMiwlZWN4CisJbW92bAkkMHg2YjIwNjU3NCwlZWR4CisJbW92bAkxNiglcnNwKSwlcjhkCisJbW92bAkyMCglcnNwKSwlcjlkCisJbW92bAkyNCglcnNwKSwlcjEwZAorCW1vdmwJMjgoJXJzcCksJXIxMWQKKwltb3ZkCSV4bW0zLCVyMTJkCisJbW92bAk1MiglcnNwKSwlcjEzZAorCW1vdmwJNTYoJXJzcCksJXIxNGQKKwltb3ZsCTYwKCVyc3ApLCVyMTVkCisKKwltb3ZxCSVyYnAsNjQrMCglcnNwKQorCW1vdmwJJDEwLCVlYnAKKwltb3ZxCSVyc2ksNjQrOCglcnNwKQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTQKKwltb3ZxCSVyZGksNjQrMTYoJXJzcCkKKwltb3ZxCSVyc2ksJXJkaQorCXNocnEJJDMyLCVyZGkKKwlqbXAJTCRvb3AKKworLnAyYWxpZ24JNQorTCRvb3A6CisJYWRkbAklcjhkLCVlYXgKKwl4b3JsCSVlYXgsJXIxMmQKKwlyb2xsCSQxNiwlcjEyZAorCWFkZGwJJXI5ZCwlZWJ4CisJeG9ybAklZWJ4LCVyMTNkCisJcm9sbAkkMTYsJXIxM2QKKwlhZGRsCSVyMTJkLCVlc2kKKwl4b3JsCSVlc2ksJXI4ZAorCXJvbGwJJDEyLCVyOGQKKwlhZGRsCSVyMTNkLCVlZGkKKwl4b3JsCSVlZGksJXI5ZAorCXJvbGwJJDEyLCVyOWQKKwlhZGRsCSVyOGQsJWVheAorCXhvcmwJJWVheCwlcjEyZAorCXJvbGwJJDgsJXIxMmQKKwlhZGRsCSVyOWQsJWVieAorCXhvcmwJJWVieCwlcjEzZAorCXJvbGwJJDgsJXIxM2QKKwlhZGRsCSVyMTJkLCVlc2kKKwl4b3JsCSVlc2ksJXI4ZAorCXJvbGwJJDcsJXI4ZAorCWFkZGwJJXIxM2QsJWVkaQorCXhvcmwJJWVkaSwlcjlkCisJcm9sbAkkNywlcjlkCisJbW92bAklZXNpLDMyKCVyc3ApCisJbW92bAklZWRpLDM2KCVyc3ApCisJbW92bAk0MCglcnNwKSwlZXNpCisJbW92bAk0NCglcnNwKSwlZWRpCisJYWRkbAklcjEwZCwlZWN4CisJeG9ybAklZWN4LCVyMTRkCisJcm9sbAkkMTYsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwl4b3JsCSVlZHgsJXIxNWQKKwlyb2xsCSQxNiwlcjE1ZAorCWFkZGwJJXIxNGQsJWVzaQorCXhvcmwJJWVzaSwlcjEwZAorCXJvbGwJJDEyLCVyMTBkCisJYWRkbAklcjE1ZCwlZWRpCisJeG9ybAklZWRpLCVyMTFkCisJcm9sbAkkMTIsJXIxMWQKKwlhZGRsCSVyMTBkLCVlY3gKKwl4b3JsCSVlY3gsJXIxNGQKKwlyb2xsCSQ4LCVyMTRkCisJYWRkbAklcjExZCwlZWR4CisJeG9ybAklZWR4LCVyMTVkCisJcm9sbAkkOCwlcjE1ZAorCWFkZGwJJXIxNGQsJWVzaQorCXhvcmwJJWVzaSwlcjEwZAorCXJvbGwJJDcsJXIxMGQKKwlhZGRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlZGksJXIxMWQKKwlyb2xsCSQ3LCVyMTFkCisJYWRkbAklcjlkLCVlYXgKKwl4b3JsCSVlYXgsJXIxNWQKKwlyb2xsCSQxNiwlcjE1ZAorCWFkZGwJJXIxMGQsJWVieAorCXhvcmwJJWVieCwlcjEyZAorCXJvbGwJJDE2LCVyMTJkCisJYWRkbAklcjE1ZCwlZXNpCisJeG9ybAklZXNpLCVyOWQKKwlyb2xsCSQxMiwlcjlkCisJYWRkbAklcjEyZCwlZWRpCisJeG9ybAklZWRpLCVyMTBkCisJcm9sbAkkMTIsJXIxMGQKKwlhZGRsCSVyOWQsJWVheAorCXhvcmwJJWVheCwlcjE1ZAorCXJvbGwJJDgsJXIxNWQKKwlhZGRsCSVyMTBkLCVlYngKKwl4b3JsCSVlYngsJXIxMmQKKwlyb2xsCSQ4LCVyMTJkCisJYWRkbAklcjE1ZCwlZXNpCisJeG9ybAklZXNpLCVyOWQKKwlyb2xsCSQ3LCVyOWQKKwlhZGRsCSVyMTJkLCVlZGkKKwl4b3JsCSVlZGksJXIxMGQKKwlyb2xsCSQ3LCVyMTBkCisJbW92bAklZXNpLDQwKCVyc3ApCisJbW92bAklZWRpLDQ0KCVyc3ApCisJbW92bAkzMiglcnNwKSwlZXNpCisJbW92bAkzNiglcnNwKSwlZWRpCisJYWRkbAklcjExZCwlZWN4CisJeG9ybAklZWN4LCVyMTNkCisJcm9sbAkkMTYsJXIxM2QKKwlhZGRsCSVyOGQsJWVkeAorCXhvcmwJJWVkeCwlcjE0ZAorCXJvbGwJJDE2LCVyMTRkCisJYWRkbAklcjEzZCwlZXNpCisJeG9ybAklZXNpLCVyMTFkCisJcm9sbAkkMTIsJXIxMWQKKwlhZGRsCSVyMTRkLCVlZGkKKwl4b3JsCSVlZGksJXI4ZAorCXJvbGwJJDEyLCVyOGQKKwlhZGRsCSVyMTFkLCVlY3gKKwl4b3JsCSVlY3gsJXIxM2QKKwlyb2xsCSQ4LCVyMTNkCisJYWRkbAklcjhkLCVlZHgKKwl4b3JsCSVlZHgsJXIxNGQKKwlyb2xsCSQ4LCVyMTRkCisJYWRkbAklcjEzZCwlZXNpCisJeG9ybAklZXNpLCVyMTFkCisJcm9sbAkkNywlcjExZAorCWFkZGwJJXIxNGQsJWVkaQorCXhvcmwJJWVkaSwlcjhkCisJcm9sbAkkNywlcjhkCisJZGVjbAklZWJwCisJam56CUwkb29wCisJbW92bAklZWRpLDM2KCVyc3ApCisJbW92bAklZXNpLDMyKCVyc3ApCisJbW92cQk2NCglcnNwKSwlcmJwCisJbW92ZHFhCSV4bW0yLCV4bW0xCisJbW92cQk2NCs4KCVyc3ApLCVyc2kKKwlwYWRkZAkleG1tNCwleG1tMworCW1vdnEJNjQrMTYoJXJzcCksJXJkaQorCisJYWRkbAkkMHg2MTcwNzg2NSwlZWF4CisJYWRkbAkkMHgzMzIwNjQ2ZSwlZWJ4CisJYWRkbAkkMHg3OTYyMmQzMiwlZWN4CisJYWRkbAkkMHg2YjIwNjU3NCwlZWR4CisJYWRkbAkxNiglcnNwKSwlcjhkCisJYWRkbAkyMCglcnNwKSwlcjlkCisJYWRkbAkyNCglcnNwKSwlcjEwZAorCWFkZGwJMjgoJXJzcCksJXIxMWQKKwlhZGRsCTQ4KCVyc3ApLCVyMTJkCisJYWRkbAk1MiglcnNwKSwlcjEzZAorCWFkZGwJNTYoJXJzcCksJXIxNGQKKwlhZGRsCTYwKCVyc3ApLCVyMTVkCisJcGFkZGQJMzIoJXJzcCksJXhtbTEKKworCWNtcHEJJDY0LCVyYnAKKwlqYglMJHRhaWwKKworCXhvcmwJMCglcnNpKSwlZWF4CisJeG9ybAk0KCVyc2kpLCVlYngKKwl4b3JsCTgoJXJzaSksJWVjeAorCXhvcmwJMTIoJXJzaSksJWVkeAorCXhvcmwJMTYoJXJzaSksJXI4ZAorCXhvcmwJMjAoJXJzaSksJXI5ZAorCXhvcmwJMjQoJXJzaSksJXIxMGQKKwl4b3JsCTI4KCVyc2kpLCVyMTFkCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0wCisJeG9ybAk0OCglcnNpKSwlcjEyZAorCXhvcmwJNTIoJXJzaSksJXIxM2QKKwl4b3JsCTU2KCVyc2kpLCVyMTRkCisJeG9ybAk2MCglcnNpKSwlcjE1ZAorCWxlYXEJNjQoJXJzaSksJXJzaQorCXB4b3IJJXhtbTEsJXhtbTAKKworCW1vdmRxYQkleG1tMiwzMiglcnNwKQorCW1vdmQJJXhtbTMsNDgoJXJzcCkKKworCW1vdmwJJWVheCwwKCVyZGkpCisJbW92bAklZWJ4LDQoJXJkaSkKKwltb3ZsCSVlY3gsOCglcmRpKQorCW1vdmwJJWVkeCwxMiglcmRpKQorCW1vdmwJJXI4ZCwxNiglcmRpKQorCW1vdmwJJXI5ZCwyMCglcmRpKQorCW1vdmwJJXIxMGQsMjQoJXJkaSkKKwltb3ZsCSVyMTFkLDI4KCVyZGkpCisJbW92ZHF1CSV4bW0wLDMyKCVyZGkpCisJbW92bAklcjEyZCw0OCglcmRpKQorCW1vdmwJJXIxM2QsNTIoJXJkaSkKKwltb3ZsCSVyMTRkLDU2KCVyZGkpCisJbW92bAklcjE1ZCw2MCglcmRpKQorCWxlYXEJNjQoJXJkaSksJXJkaQorCisJc3VicQkkNjQsJXJicAorCWpueglMJG9vcF9vdXRlcgorCisJam1wCUwkZG9uZQorCisucDJhbGlnbgk0CitMJHRhaWw6CisJbW92bAklZWF4LDAoJXJzcCkKKwltb3ZsCSVlYngsNCglcnNwKQorCXhvcnEJJXJieCwlcmJ4CisJbW92bAklZWN4LDgoJXJzcCkKKwltb3ZsCSVlZHgsMTIoJXJzcCkKKwltb3ZsCSVyOGQsMTYoJXJzcCkKKwltb3ZsCSVyOWQsMjAoJXJzcCkKKwltb3ZsCSVyMTBkLDI0KCVyc3ApCisJbW92bAklcjExZCwyOCglcnNwKQorCW1vdmRxYQkleG1tMSwzMiglcnNwKQorCW1vdmwJJXIxMmQsNDgoJXJzcCkKKwltb3ZsCSVyMTNkLDUyKCVyc3ApCisJbW92bAklcjE0ZCw1NiglcnNwKQorCW1vdmwJJXIxNWQsNjAoJXJzcCkKKworTCRvb3BfdGFpbDoKKwltb3Z6YmwJKCVyc2ksJXJieCwxKSwlZWF4CisJbW92emJsCSglcnNwLCVyYngsMSksJWVkeAorCWxlYXEJMSglcmJ4KSwlcmJ4CisJeG9ybAklZWR4LCVlYXgKKwltb3ZiCSVhbCwtMSglcmRpLCVyYngsMSkKKwlkZWNxCSVyYnAKKwlqbnoJTCRvb3BfdGFpbAorCitMJGRvbmU6CisJbGVhcQk2NCsyNCs0OCglcnNwKSwlcnNpCisJbW92cQktNDgoJXJzaSksJXIxNQorCW1vdnEJLTQwKCVyc2kpLCVyMTQKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisJbW92cQktMjQoJXJzaSksJXIxMgorCW1vdnEJLTE2KCVyc2kpLCVyYnAKKwltb3ZxCS04KCVyc2kpLCVyYngKKwlsZWFxCSglcnNpKSwlcnNwCitMJG5vX2RhdGE6CisJLmJ5dGUJMHhmMywweGMzCisKKworLnAyYWxpZ24JNQorQ2hhQ2hhMjBfc3NzZTM6CitMJENoYUNoYTIwX3Nzc2UzOgorCW1vdnEJJXJzcCwlcjkKKwljbXBxCSQxMjgsJXJkeAorCWphCUwkQ2hhQ2hhMjBfNHgKKworTCRkb19zc2UzX2FmdGVyX2FsbDoKKwlzdWJxCSQ2NCs4LCVyc3AKKwltb3ZkcWEJTCRzaWdtYSglcmlwKSwleG1tMAorCW1vdmRxdQkoJXJjeCksJXhtbTEKKwltb3ZkcXUJMTYoJXJjeCksJXhtbTIKKwltb3ZkcXUJKCVyOCksJXhtbTMKKwltb3ZkcWEJTCRyb3QxNiglcmlwKSwleG1tNgorCW1vdmRxYQlMJHJvdDI0KCVyaXApLCV4bW03CisKKwltb3ZkcWEJJXhtbTAsMCglcnNwKQorCW1vdmRxYQkleG1tMSwxNiglcnNwKQorCW1vdmRxYQkleG1tMiwzMiglcnNwKQorCW1vdmRxYQkleG1tMyw0OCglcnNwKQorCW1vdnEJJDEwLCVyOAorCWptcAlMJG9vcF9zc3NlMworCisucDJhbGlnbgk1CitMJG9vcF9vdXRlcl9zc3NlMzoKKwltb3ZkcWEJTCRvbmUoJXJpcCksJXhtbTMKKwltb3ZkcWEJMCglcnNwKSwleG1tMAorCW1vdmRxYQkxNiglcnNwKSwleG1tMQorCW1vdmRxYQkzMiglcnNwKSwleG1tMgorCXBhZGRkCTQ4KCVyc3ApLCV4bW0zCisJbW92cQkkMTAsJXI4CisJbW92ZHFhCSV4bW0zLDQ4KCVyc3ApCisJam1wCUwkb29wX3Nzc2UzCisKKy5wMmFsaWduCTUKK0wkb29wX3Nzc2UzOgorCXBhZGRkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW0xLCV4bW00CisJcHNybGQJJDIwLCV4bW0xCisJcHNsbGQJJDEyLCV4bW00CisJcG9yCSV4bW00LCV4bW0xCisJcGFkZGQJJXhtbTEsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKwlwYWRkZAkleG1tMywleG1tMgorCXB4b3IJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKwlwc3JsZAkkMjUsJXhtbTEKKwlwc2xsZAkkNywleG1tNAorCXBvcgkleG1tNCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTIKKwlwc2h1ZmQJJDU3LCV4bW0xLCV4bW0xCisJcHNodWZkCSQxNDcsJXhtbTMsJXhtbTMKKwlub3AKKwlwYWRkZAkleG1tMSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMgorCXBhZGRkCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tMiwleG1tMQorCW1vdmRxYQkleG1tMSwleG1tNAorCXBzcmxkCSQyMCwleG1tMQorCXBzbGxkCSQxMiwleG1tNAorCXBvcgkleG1tNCwleG1tMQorCXBhZGRkCSV4bW0xLCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIzCisJcGFkZGQJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xCisJbW92ZHFhCSV4bW0xLCV4bW00CisJcHNybGQJJDI1LCV4bW0xCisJcHNsbGQJJDcsJXhtbTQKKwlwb3IJJXhtbTQsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0yLCV4bW0yCisJcHNodWZkCSQxNDcsJXhtbTEsJXhtbTEKKwlwc2h1ZmQJJDU3LCV4bW0zLCV4bW0zCisJZGVjcQklcjgKKwlqbnoJTCRvb3Bfc3NzZTMKKwlwYWRkZAkwKCVyc3ApLCV4bW0wCisJcGFkZGQJMTYoJXJzcCksJXhtbTEKKwlwYWRkZAkzMiglcnNwKSwleG1tMgorCXBhZGRkCTQ4KCVyc3ApLCV4bW0zCisKKwljbXBxCSQ2NCwlcmR4CisJamIJTCR0YWlsX3Nzc2UzCisKKwltb3ZkcXUJMCglcnNpKSwleG1tNAorCW1vdmRxdQkxNiglcnNpKSwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTAKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTQKKwlweG9yCSV4bW01LCV4bW0xCisJbW92ZHF1CTQ4KCVyc2kpLCV4bW01CisJbGVhcQk2NCglcnNpKSwlcnNpCisJcHhvcgkleG1tNCwleG1tMgorCXB4b3IJJXhtbTUsJXhtbTMKKworCW1vdmRxdQkleG1tMCwwKCVyZGkpCisJbW92ZHF1CSV4bW0xLDE2KCVyZGkpCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CSV4bW0zLDQ4KCVyZGkpCisJbGVhcQk2NCglcmRpKSwlcmRpCisKKwlzdWJxCSQ2NCwlcmR4CisJam56CUwkb29wX291dGVyX3Nzc2UzCisKKwlqbXAJTCRkb25lX3Nzc2UzCisKKy5wMmFsaWduCTQKK0wkdGFpbF9zc3NlMzoKKwltb3ZkcWEJJXhtbTAsMCglcnNwKQorCW1vdmRxYQkleG1tMSwxNiglcnNwKQorCW1vdmRxYQkleG1tMiwzMiglcnNwKQorCW1vdmRxYQkleG1tMyw0OCglcnNwKQorCXhvcnEJJXI4LCVyOAorCitMJG9vcF90YWlsX3Nzc2UzOgorCW1vdnpibAkoJXJzaSwlcjgsMSksJWVheAorCW1vdnpibAkoJXJzcCwlcjgsMSksJWVjeAorCWxlYXEJMSglcjgpLCVyOAorCXhvcmwJJWVjeCwlZWF4CisJbW92YgklYWwsLTEoJXJkaSwlcjgsMSkKKwlkZWNxCSVyZHgKKwlqbnoJTCRvb3BfdGFpbF9zc3NlMworCitMJGRvbmVfc3NzZTM6CisJbGVhcQkoJXI5KSwlcnNwCitMJHNzc2UzX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTUKK0NoYUNoYTIwXzR4OgorTCRDaGFDaGEyMF80eDoKKwltb3ZxCSVyc3AsJXI5CisJbW92cQklcjEwLCVyMTEKKwlzaHJxCSQzMiwlcjEwCisJdGVzdHEJJDMyLCVyMTAKKwlqbnoJTCRDaGFDaGEyMF84eAorCWNtcHEJJDE5MiwlcmR4CisJamEJTCRwcm9jZWVkNHgKKworCWFuZHEJJDcxMzAzMTY4LCVyMTEKKwljbXBxCSQ0MTk0MzA0LCVyMTEKKwlqZQlMJGRvX3NzZTNfYWZ0ZXJfYWxsCisKK0wkcHJvY2VlZDR4OgorCXN1YnEJJDB4MTQwKzgsJXJzcAorCW1vdmRxYQlMJHNpZ21hKCVyaXApLCV4bW0xMQorCW1vdmRxdQkoJXJjeCksJXhtbTE1CisJbW92ZHF1CTE2KCVyY3gpLCV4bW03CisJbW92ZHF1CSglcjgpLCV4bW0zCisJbGVhcQkyNTYoJXJzcCksJXJjeAorCWxlYXEJTCRyb3QxNiglcmlwKSwlcjEwCisJbGVhcQlMJHJvdDI0KCVyaXApLCVyMTEKKworCXBzaHVmZAkkMHgwMCwleG1tMTEsJXhtbTgKKwlwc2h1ZmQJJDB4NTUsJXhtbTExLCV4bW05CisJbW92ZHFhCSV4bW04LDY0KCVyc3ApCisJcHNodWZkCSQweGFhLCV4bW0xMSwleG1tMTAKKwltb3ZkcWEJJXhtbTksODAoJXJzcCkKKwlwc2h1ZmQJJDB4ZmYsJXhtbTExLCV4bW0xMQorCW1vdmRxYQkleG1tMTAsOTYoJXJzcCkKKwltb3ZkcWEJJXhtbTExLDExMiglcnNwKQorCisJcHNodWZkCSQweDAwLCV4bW0xNSwleG1tMTIKKwlwc2h1ZmQJJDB4NTUsJXhtbTE1LCV4bW0xMworCW1vdmRxYQkleG1tMTIsMTI4LTI1NiglcmN4KQorCXBzaHVmZAkkMHhhYSwleG1tMTUsJXhtbTE0CisJbW92ZHFhCSV4bW0xMywxNDQtMjU2KCVyY3gpCisJcHNodWZkCSQweGZmLCV4bW0xNSwleG1tMTUKKwltb3ZkcWEJJXhtbTE0LDE2MC0yNTYoJXJjeCkKKwltb3ZkcWEJJXhtbTE1LDE3Ni0yNTYoJXJjeCkKKworCXBzaHVmZAkkMHgwMCwleG1tNywleG1tNAorCXBzaHVmZAkkMHg1NSwleG1tNywleG1tNQorCW1vdmRxYQkleG1tNCwxOTItMjU2KCVyY3gpCisJcHNodWZkCSQweGFhLCV4bW03LCV4bW02CisJbW92ZHFhCSV4bW01LDIwOC0yNTYoJXJjeCkKKwlwc2h1ZmQJJDB4ZmYsJXhtbTcsJXhtbTcKKwltb3ZkcWEJJXhtbTYsMjI0LTI1NiglcmN4KQorCW1vdmRxYQkleG1tNywyNDAtMjU2KCVyY3gpCisKKwlwc2h1ZmQJJDB4MDAsJXhtbTMsJXhtbTAKKwlwc2h1ZmQJJDB4NTUsJXhtbTMsJXhtbTEKKwlwYWRkZAlMJGluYyglcmlwKSwleG1tMAorCXBzaHVmZAkkMHhhYSwleG1tMywleG1tMgorCW1vdmRxYQkleG1tMSwyNzItMjU2KCVyY3gpCisJcHNodWZkCSQweGZmLCV4bW0zLCV4bW0zCisJbW92ZHFhCSV4bW0yLDI4OC0yNTYoJXJjeCkKKwltb3ZkcWEJJXhtbTMsMzA0LTI1NiglcmN4KQorCisJam1wCUwkb29wX2VudGVyNHgKKworLnAyYWxpZ24JNQorTCRvb3Bfb3V0ZXI0eDoKKwltb3ZkcWEJNjQoJXJzcCksJXhtbTgKKwltb3ZkcWEJODAoJXJzcCksJXhtbTkKKwltb3ZkcWEJOTYoJXJzcCksJXhtbTEwCisJbW92ZHFhCTExMiglcnNwKSwleG1tMTEKKwltb3ZkcWEJMTI4LTI1NiglcmN4KSwleG1tMTIKKwltb3ZkcWEJMTQ0LTI1NiglcmN4KSwleG1tMTMKKwltb3ZkcWEJMTYwLTI1NiglcmN4KSwleG1tMTQKKwltb3ZkcWEJMTc2LTI1NiglcmN4KSwleG1tMTUKKwltb3ZkcWEJMTkyLTI1NiglcmN4KSwleG1tNAorCW1vdmRxYQkyMDgtMjU2KCVyY3gpLCV4bW01CisJbW92ZHFhCTIyNC0yNTYoJXJjeCksJXhtbTYKKwltb3ZkcWEJMjQwLTI1NiglcmN4KSwleG1tNworCW1vdmRxYQkyNTYtMjU2KCVyY3gpLCV4bW0wCisJbW92ZHFhCTI3Mi0yNTYoJXJjeCksJXhtbTEKKwltb3ZkcWEJMjg4LTI1NiglcmN4KSwleG1tMgorCW1vdmRxYQkzMDQtMjU2KCVyY3gpLCV4bW0zCisJcGFkZGQJTCRmb3VyKCVyaXApLCV4bW0wCisKK0wkb29wX2VudGVyNHg6CisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJbW92ZHFhCSV4bW03LDQ4KCVyc3ApCisJbW92ZHFhCSglcjEwKSwleG1tNworCW1vdmwJJDEwLCVlYXgKKwltb3ZkcWEJJXhtbTAsMjU2LTI1NiglcmN4KQorCWptcAlMJG9vcDR4CisKKy5wMmFsaWduCTUKK0wkb29wNHg6CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOCwleG1tMAorCXB4b3IJJXhtbTksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OQorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisJcGFkZGQJJXhtbTAsJXhtbTQKKwlwYWRkZAkleG1tMSwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTEyCisJcHhvcgkleG1tNSwleG1tMTMKKwltb3ZkcWEJJXhtbTEyLCV4bW02CisJcHNsbGQJJDEyLCV4bW0xMgorCXBzcmxkCSQyMCwleG1tNgorCW1vdmRxYQkleG1tMTMsJXhtbTcKKwlwc2xsZAkkMTIsJXhtbTEzCisJcG9yCSV4bW02LCV4bW0xMgorCXBzcmxkCSQyMCwleG1tNworCW1vdmRxYQkoJXIxMSksJXhtbTYKKwlwb3IJJXhtbTcsJXhtbTEzCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOCwleG1tMAorCXB4b3IJJXhtbTksJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA2CisJcGFkZGQJJXhtbTAsJXhtbTQKKwlwYWRkZAkleG1tMSwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTEyCisJcHhvcgkleG1tNSwleG1tMTMKKwltb3ZkcWEJJXhtbTEyLCV4bW03CisJcHNsbGQJJDcsJXhtbTEyCisJcHNybGQJJDI1LCV4bW03CisJbW92ZHFhCSV4bW0xMywleG1tNgorCXBzbGxkCSQ3LCV4bW0xMworCXBvcgkleG1tNywleG1tMTIKKwlwc3JsZAkkMjUsJXhtbTYKKwltb3ZkcWEJKCVyMTApLCV4bW03CisJcG9yCSV4bW02LCV4bW0xMworCW1vdmRxYQkleG1tNCwwKCVyc3ApCisJbW92ZHFhCSV4bW01LDE2KCVyc3ApCisJbW92ZHFhCTMyKCVyc3ApLCV4bW00CisJbW92ZHFhCTQ4KCVyc3ApLCV4bW01CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMgorCXB4b3IJJXhtbTExLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworCXBhZGRkCSV4bW0yLCV4bW00CisJcGFkZGQJJXhtbTMsJXhtbTUKKwlweG9yCSV4bW00LCV4bW0xNAorCXB4b3IJJXhtbTUsJXhtbTE1CisJbW92ZHFhCSV4bW0xNCwleG1tNgorCXBzbGxkCSQxMiwleG1tMTQKKwlwc3JsZAkkMjAsJXhtbTYKKwltb3ZkcWEJJXhtbTE1LCV4bW03CisJcHNsbGQJJDEyLCV4bW0xNQorCXBvcgkleG1tNiwleG1tMTQKKwlwc3JsZAkkMjAsJXhtbTcKKwltb3ZkcWEJKCVyMTEpLCV4bW02CisJcG9yCSV4bW03LCV4bW0xNQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTIKKwlweG9yCSV4bW0xMSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjE0CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAkleG1tMiwleG1tNAorCXBhZGRkCSV4bW0zLCV4bW01CisJcHhvcgkleG1tNCwleG1tMTQKKwlweG9yCSV4bW01LCV4bW0xNQorCW1vdmRxYQkleG1tMTQsJXhtbTcKKwlwc2xsZAkkNywleG1tMTQKKwlwc3JsZAkkMjUsJXhtbTcKKwltb3ZkcWEJJXhtbTE1LCV4bW02CisJcHNsbGQJJDcsJXhtbTE1CisJcG9yCSV4bW03LCV4bW0xNAorCXBzcmxkCSQyNSwleG1tNgorCW1vdmRxYQkoJXIxMCksJXhtbTcKKwlwb3IJJXhtbTYsJXhtbTE1CisJcGFkZGQJJXhtbTEzLCV4bW04CisJcGFkZGQJJXhtbTE0LCV4bW05CisJcHhvcgkleG1tOCwleG1tMworCXB4b3IJJXhtbTksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworLmJ5dGUJMTAyLDE1LDU2LDAsMTk5CisJcGFkZGQJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tMCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTEzCisJcHhvcgkleG1tNSwleG1tMTQKKwltb3ZkcWEJJXhtbTEzLCV4bW02CisJcHNsbGQJJDEyLCV4bW0xMworCXBzcmxkCSQyMCwleG1tNgorCW1vdmRxYQkleG1tMTQsJXhtbTcKKwlwc2xsZAkkMTIsJXhtbTE0CisJcG9yCSV4bW02LCV4bW0xMworCXBzcmxkCSQyMCwleG1tNworCW1vdmRxYQkoJXIxMSksJXhtbTYKKwlwb3IJJXhtbTcsJXhtbTE0CisJcGFkZGQJJXhtbTEzLCV4bW04CisJcGFkZGQJJXhtbTE0LCV4bW05CisJcHhvcgkleG1tOCwleG1tMworCXB4b3IJJXhtbTksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk4CisJcGFkZGQJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tMCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTEzCisJcHhvcgkleG1tNSwleG1tMTQKKwltb3ZkcWEJJXhtbTEzLCV4bW03CisJcHNsbGQJJDcsJXhtbTEzCisJcHNybGQJJDI1LCV4bW03CisJbW92ZHFhCSV4bW0xNCwleG1tNgorCXBzbGxkCSQ3LCV4bW0xNAorCXBvcgkleG1tNywleG1tMTMKKwlwc3JsZAkkMjUsJXhtbTYKKwltb3ZkcWEJKCVyMTApLCV4bW03CisJcG9yCSV4bW02LCV4bW0xNAorCW1vdmRxYQkleG1tNCwzMiglcnNwKQorCW1vdmRxYQkleG1tNSw0OCglcnNwKQorCW1vdmRxYQkwKCVyc3ApLCV4bW00CisJbW92ZHFhCTE2KCVyc3ApLCV4bW01CisJcGFkZGQJJXhtbTE1LCV4bW0xMAorCXBhZGRkCSV4bW0xMiwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMQorCXB4b3IJJXhtbTExLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDcKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorCXBhZGRkCSV4bW0xLCV4bW00CisJcGFkZGQJJXhtbTIsJXhtbTUKKwlweG9yCSV4bW00LCV4bW0xNQorCXB4b3IJJXhtbTUsJXhtbTEyCisJbW92ZHFhCSV4bW0xNSwleG1tNgorCXBzbGxkCSQxMiwleG1tMTUKKwlwc3JsZAkkMjAsJXhtbTYKKwltb3ZkcWEJJXhtbTEyLCV4bW03CisJcHNsbGQJJDEyLCV4bW0xMgorCXBvcgkleG1tNiwleG1tMTUKKwlwc3JsZAkkMjAsJXhtbTcKKwltb3ZkcWEJKCVyMTEpLCV4bW02CisJcG9yCSV4bW03LCV4bW0xMgorCXBhZGRkCSV4bW0xNSwleG1tMTAKKwlwYWRkZAkleG1tMTIsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTEKKwlweG9yCSV4bW0xMSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjA2CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTQKKwlwYWRkZAkleG1tMSwleG1tNAorCXBhZGRkCSV4bW0yLCV4bW01CisJcHhvcgkleG1tNCwleG1tMTUKKwlweG9yCSV4bW01LCV4bW0xMgorCW1vdmRxYQkleG1tMTUsJXhtbTcKKwlwc2xsZAkkNywleG1tMTUKKwlwc3JsZAkkMjUsJXhtbTcKKwltb3ZkcWEJJXhtbTEyLCV4bW02CisJcHNsbGQJJDcsJXhtbTEyCisJcG9yCSV4bW03LCV4bW0xNQorCXBzcmxkCSQyNSwleG1tNgorCW1vdmRxYQkoJXIxMCksJXhtbTcKKwlwb3IJJXhtbTYsJXhtbTEyCisJZGVjbAklZWF4CisJam56CUwkb29wNHgKKworCXBhZGRkCTY0KCVyc3ApLCV4bW04CisJcGFkZGQJODAoJXJzcCksJXhtbTkKKwlwYWRkZAk5NiglcnNwKSwleG1tMTAKKwlwYWRkZAkxMTIoJXJzcCksJXhtbTExCisKKwltb3ZkcWEJJXhtbTgsJXhtbTYKKwlwdW5wY2tsZHEJJXhtbTksJXhtbTgKKwltb3ZkcWEJJXhtbTEwLCV4bW03CisJcHVucGNrbGRxCSV4bW0xMSwleG1tMTAKKwlwdW5wY2toZHEJJXhtbTksJXhtbTYKKwlwdW5wY2toZHEJJXhtbTExLCV4bW03CisJbW92ZHFhCSV4bW04LCV4bW05CisJcHVucGNrbHFkcQkleG1tMTAsJXhtbTgKKwltb3ZkcWEJJXhtbTYsJXhtbTExCisJcHVucGNrbHFkcQkleG1tNywleG1tNgorCXB1bnBja2hxZHEJJXhtbTEwLCV4bW05CisJcHVucGNraHFkcQkleG1tNywleG1tMTEKKwlwYWRkZAkxMjgtMjU2KCVyY3gpLCV4bW0xMgorCXBhZGRkCTE0NC0yNTYoJXJjeCksJXhtbTEzCisJcGFkZGQJMTYwLTI1NiglcmN4KSwleG1tMTQKKwlwYWRkZAkxNzYtMjU2KCVyY3gpLCV4bW0xNQorCisJbW92ZHFhCSV4bW04LDAoJXJzcCkKKwltb3ZkcWEJJXhtbTksMTYoJXJzcCkKKwltb3ZkcWEJMzIoJXJzcCksJXhtbTgKKwltb3ZkcWEJNDgoJXJzcCksJXhtbTkKKworCW1vdmRxYQkleG1tMTIsJXhtbTEwCisJcHVucGNrbGRxCSV4bW0xMywleG1tMTIKKwltb3ZkcWEJJXhtbTE0LCV4bW03CisJcHVucGNrbGRxCSV4bW0xNSwleG1tMTQKKwlwdW5wY2toZHEJJXhtbTEzLCV4bW0xMAorCXB1bnBja2hkcQkleG1tMTUsJXhtbTcKKwltb3ZkcWEJJXhtbTEyLCV4bW0xMworCXB1bnBja2xxZHEJJXhtbTE0LCV4bW0xMgorCW1vdmRxYQkleG1tMTAsJXhtbTE1CisJcHVucGNrbHFkcQkleG1tNywleG1tMTAKKwlwdW5wY2tocWRxCSV4bW0xNCwleG1tMTMKKwlwdW5wY2tocWRxCSV4bW03LCV4bW0xNQorCXBhZGRkCTE5Mi0yNTYoJXJjeCksJXhtbTQKKwlwYWRkZAkyMDgtMjU2KCVyY3gpLCV4bW01CisJcGFkZGQJMjI0LTI1NiglcmN4KSwleG1tOAorCXBhZGRkCTI0MC0yNTYoJXJjeCksJXhtbTkKKworCW1vdmRxYQkleG1tNiwzMiglcnNwKQorCW1vdmRxYQkleG1tMTEsNDgoJXJzcCkKKworCW1vdmRxYQkleG1tNCwleG1tMTQKKwlwdW5wY2tsZHEJJXhtbTUsJXhtbTQKKwltb3ZkcWEJJXhtbTgsJXhtbTcKKwlwdW5wY2tsZHEJJXhtbTksJXhtbTgKKwlwdW5wY2toZHEJJXhtbTUsJXhtbTE0CisJcHVucGNraGRxCSV4bW05LCV4bW03CisJbW92ZHFhCSV4bW00LCV4bW01CisJcHVucGNrbHFkcQkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tMTQsJXhtbTkKKwlwdW5wY2tscWRxCSV4bW03LCV4bW0xNAorCXB1bnBja2hxZHEJJXhtbTgsJXhtbTUKKwlwdW5wY2tocWRxCSV4bW03LCV4bW05CisJcGFkZGQJMjU2LTI1NiglcmN4KSwleG1tMAorCXBhZGRkCTI3Mi0yNTYoJXJjeCksJXhtbTEKKwlwYWRkZAkyODgtMjU2KCVyY3gpLCV4bW0yCisJcGFkZGQJMzA0LTI1NiglcmN4KSwleG1tMworCisJbW92ZHFhCSV4bW0wLCV4bW04CisJcHVucGNrbGRxCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0yLCV4bW03CisJcHVucGNrbGRxCSV4bW0zLCV4bW0yCisJcHVucGNraGRxCSV4bW0xLCV4bW04CisJcHVucGNraGRxCSV4bW0zLCV4bW03CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHVucGNrbHFkcQkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tOCwleG1tMworCXB1bnBja2xxZHEJJXhtbTcsJXhtbTgKKwlwdW5wY2tocWRxCSV4bW0yLCV4bW0xCisJcHVucGNraHFkcQkleG1tNywleG1tMworCWNtcHEJJDI1NiwlcmR4CisJamIJTCR0YWlsNHgKKworCW1vdmRxdQkwKCVyc2kpLCV4bW02CisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tNworCXB4b3IJMCglcnNwKSwleG1tNgorCXB4b3IJJXhtbTEyLCV4bW0xMQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW03CisKKwltb3ZkcXUJJXhtbTYsMCglcmRpKQorCW1vdmRxdQk2NCglcnNpKSwleG1tNgorCW1vdmRxdQkleG1tMTEsMTYoJXJkaSkKKwltb3ZkcXUJODAoJXJzaSksJXhtbTExCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CTk2KCVyc2kpLCV4bW0yCisJbW92ZHF1CSV4bW03LDQ4KCVyZGkpCisJbW92ZHF1CTExMiglcnNpKSwleG1tNworCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlweG9yCTE2KCVyc3ApLCV4bW02CisJcHhvcgkleG1tMTMsJXhtbTExCisJcHhvcgkleG1tNSwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTcKKworCW1vdmRxdQkleG1tNiw2NCglcmRpKQorCW1vdmRxdQkwKCVyc2kpLCV4bW02CisJbW92ZHF1CSV4bW0xMSw4MCglcmRpKQorCW1vdmRxdQkxNiglcnNpKSwleG1tMTEKKwltb3ZkcXUJJXhtbTIsOTYoJXJkaSkKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwltb3ZkcXUJJXhtbTcsMTEyKCVyZGkpCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCW1vdmRxdQk0OCglcnNpKSwleG1tNworCXB4b3IJMzIoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xMCwleG1tMTEKKwlweG9yCSV4bW0xNCwleG1tMgorCXB4b3IJJXhtbTgsJXhtbTcKKworCW1vdmRxdQkleG1tNiwwKCVyZGkpCisJbW92ZHF1CTY0KCVyc2kpLCV4bW02CisJbW92ZHF1CSV4bW0xMSwxNiglcmRpKQorCW1vdmRxdQk4MCglcnNpKSwleG1tMTEKKwltb3ZkcXUJJXhtbTIsMzIoJXJkaSkKKwltb3ZkcXUJOTYoJXJzaSksJXhtbTIKKwltb3ZkcXUJJXhtbTcsNDgoJXJkaSkKKwltb3ZkcXUJMTEyKCVyc2kpLCV4bW03CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXB4b3IJNDgoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xNSwleG1tMTEKKwlweG9yCSV4bW05LCV4bW0yCisJcHhvcgkleG1tMywleG1tNworCW1vdmRxdQkleG1tNiw2NCglcmRpKQorCW1vdmRxdQkleG1tMTEsODAoJXJkaSkKKwltb3ZkcXUJJXhtbTIsOTYoJXJkaSkKKwltb3ZkcXUJJXhtbTcsMTEyKCVyZGkpCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCisJc3VicQkkMjU2LCVyZHgKKwlqbnoJTCRvb3Bfb3V0ZXI0eAorCisJam1wCUwkZG9uZTR4CisKK0wkdGFpbDR4OgorCWNtcHEJJDE5MiwlcmR4CisJamFlCUwkMTkyX29yX21vcmU0eAorCWNtcHEJJDEyOCwlcmR4CisJamFlCUwkMTI4X29yX21vcmU0eAorCWNtcHEJJDY0LCVyZHgKKwlqYWUJTCQ2NF9vcl9tb3JlNHgKKworCisJeG9ycQklcjEwLCVyMTAKKworCW1vdmRxYQkleG1tMTIsMTYoJXJzcCkKKwltb3ZkcWEJJXhtbTQsMzIoJXJzcCkKKwltb3ZkcWEJJXhtbTAsNDgoJXJzcCkKKwlqbXAJTCRvb3BfdGFpbDR4CisKKy5wMmFsaWduCTUKK0wkNjRfb3JfbW9yZTR4OgorCW1vdmRxdQkwKCVyc2kpLCV4bW02CisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tNworCXB4b3IJMCglcnNwKSwleG1tNgorCXB4b3IJJXhtbTEyLCV4bW0xMQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW03CisJbW92ZHF1CSV4bW02LDAoJXJkaSkKKwltb3ZkcXUJJXhtbTExLDE2KCVyZGkpCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CSV4bW03LDQ4KCVyZGkpCisJamUJTCRkb25lNHgKKworCW1vdmRxYQkxNiglcnNwKSwleG1tNgorCWxlYXEJNjQoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJbW92ZHFhCSV4bW02LDAoJXJzcCkKKwltb3ZkcWEJJXhtbTEzLDE2KCVyc3ApCisJbGVhcQk2NCglcmRpKSwlcmRpCisJbW92ZHFhCSV4bW01LDMyKCVyc3ApCisJc3VicQkkNjQsJXJkeAorCW1vdmRxYQkleG1tMSw0OCglcnNwKQorCWptcAlMJG9vcF90YWlsNHgKKworLnAyYWxpZ24JNQorTCQxMjhfb3JfbW9yZTR4OgorCW1vdmRxdQkwKCVyc2kpLCV4bW02CisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tNworCXB4b3IJMCglcnNwKSwleG1tNgorCXB4b3IJJXhtbTEyLCV4bW0xMQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW03CisKKwltb3ZkcXUJJXhtbTYsMCglcmRpKQorCW1vdmRxdQk2NCglcnNpKSwleG1tNgorCW1vdmRxdQkleG1tMTEsMTYoJXJkaSkKKwltb3ZkcXUJODAoJXJzaSksJXhtbTExCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CTk2KCVyc2kpLCV4bW0yCisJbW92ZHF1CSV4bW03LDQ4KCVyZGkpCisJbW92ZHF1CTExMiglcnNpKSwleG1tNworCXB4b3IJMTYoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xMywleG1tMTEKKwlweG9yCSV4bW01LCV4bW0yCisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxdQkleG1tNiw2NCglcmRpKQorCW1vdmRxdQkleG1tMTEsODAoJXJkaSkKKwltb3ZkcXUJJXhtbTIsOTYoJXJkaSkKKwltb3ZkcXUJJXhtbTcsMTEyKCVyZGkpCisJamUJTCRkb25lNHgKKworCW1vdmRxYQkzMiglcnNwKSwleG1tNgorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwl4b3JxCSVyMTAsJXIxMAorCW1vdmRxYQkleG1tNiwwKCVyc3ApCisJbW92ZHFhCSV4bW0xMCwxNiglcnNwKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwltb3ZkcWEJJXhtbTE0LDMyKCVyc3ApCisJc3VicQkkMTI4LCVyZHgKKwltb3ZkcWEJJXhtbTgsNDgoJXJzcCkKKwlqbXAJTCRvb3BfdGFpbDR4CisKKy5wMmFsaWduCTUKK0wkMTkyX29yX21vcmU0eDoKKwltb3ZkcXUJMCglcnNpKSwleG1tNgorCW1vdmRxdQkxNiglcnNpKSwleG1tMTEKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTcKKwlweG9yCTAoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xMiwleG1tMTEKKwlweG9yCSV4bW00LCV4bW0yCisJcHhvcgkleG1tMCwleG1tNworCisJbW92ZHF1CSV4bW02LDAoJXJkaSkKKwltb3ZkcXUJNjQoJXJzaSksJXhtbTYKKwltb3ZkcXUJJXhtbTExLDE2KCVyZGkpCisJbW92ZHF1CTgwKCVyc2kpLCV4bW0xMQorCW1vdmRxdQkleG1tMiwzMiglcmRpKQorCW1vdmRxdQk5NiglcnNpKSwleG1tMgorCW1vdmRxdQkleG1tNyw0OCglcmRpKQorCW1vdmRxdQkxMTIoJXJzaSksJXhtbTcKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJcHhvcgkxNiglcnNwKSwleG1tNgorCXB4b3IJJXhtbTEzLCV4bW0xMQorCXB4b3IJJXhtbTUsJXhtbTIKKwlweG9yCSV4bW0xLCV4bW03CisKKwltb3ZkcXUJJXhtbTYsNjQoJXJkaSkKKwltb3ZkcXUJMCglcnNpKSwleG1tNgorCW1vdmRxdQkleG1tMTEsODAoJXJkaSkKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTExCisJbW92ZHF1CSV4bW0yLDk2KCVyZGkpCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJbW92ZHF1CSV4bW03LDExMiglcmRpKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTcKKwlweG9yCTMyKCVyc3ApLCV4bW02CisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tMTQsJXhtbTIKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHF1CSV4bW02LDAoJXJkaSkKKwltb3ZkcXUJJXhtbTExLDE2KCVyZGkpCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CSV4bW03LDQ4KCVyZGkpCisJamUJTCRkb25lNHgKKworCW1vdmRxYQk0OCglcnNwKSwleG1tNgorCWxlYXEJNjQoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJbW92ZHFhCSV4bW02LDAoJXJzcCkKKwltb3ZkcWEJJXhtbTE1LDE2KCVyc3ApCisJbGVhcQk2NCglcmRpKSwlcmRpCisJbW92ZHFhCSV4bW05LDMyKCVyc3ApCisJc3VicQkkMTkyLCVyZHgKKwltb3ZkcWEJJXhtbTMsNDgoJXJzcCkKKworTCRvb3BfdGFpbDR4OgorCW1vdnpibAkoJXJzaSwlcjEwLDEpLCVlYXgKKwltb3Z6YmwJKCVyc3AsJXIxMCwxKSwlZWN4CisJbGVhcQkxKCVyMTApLCVyMTAKKwl4b3JsCSVlY3gsJWVheAorCW1vdmIJJWFsLC0xKCVyZGksJXIxMCwxKQorCWRlY3EJJXJkeAorCWpueglMJG9vcF90YWlsNHgKKworTCRkb25lNHg6CisJbGVhcQkoJXI5KSwlcnNwCitMJDR4X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTUKK0NoYUNoYTIwXzh4OgorTCRDaGFDaGEyMF84eDoKKwltb3ZxCSVyc3AsJXI5CisJc3VicQkkMHgyODArOCwlcnNwCisJYW5kcQkkLTMyLCVyc3AKKwl2emVyb3VwcGVyCisKKworCisKKworCisKKworCisKKwl2YnJvYWRjYXN0aTEyOAlMJHNpZ21hKCVyaXApLCV5bW0xMQorCXZicm9hZGNhc3RpMTI4CSglcmN4KSwleW1tMworCXZicm9hZGNhc3RpMTI4CTE2KCVyY3gpLCV5bW0xNQorCXZicm9hZGNhc3RpMTI4CSglcjgpLCV5bW03CisJbGVhcQkyNTYoJXJzcCksJXJjeAorCWxlYXEJNTEyKCVyc3ApLCVyYXgKKwlsZWFxCUwkcm90MTYoJXJpcCksJXIxMAorCWxlYXEJTCRyb3QyNCglcmlwKSwlcjExCisKKwl2cHNodWZkCSQweDAwLCV5bW0xMSwleW1tOAorCXZwc2h1ZmQJJDB4NTUsJXltbTExLCV5bW05CisJdm1vdmRxYQkleW1tOCwxMjgtMjU2KCVyY3gpCisJdnBzaHVmZAkkMHhhYSwleW1tMTEsJXltbTEwCisJdm1vdmRxYQkleW1tOSwxNjAtMjU2KCVyY3gpCisJdnBzaHVmZAkkMHhmZiwleW1tMTEsJXltbTExCisJdm1vdmRxYQkleW1tMTAsMTkyLTI1NiglcmN4KQorCXZtb3ZkcWEJJXltbTExLDIyNC0yNTYoJXJjeCkKKworCXZwc2h1ZmQJJDB4MDAsJXltbTMsJXltbTAKKwl2cHNodWZkCSQweDU1LCV5bW0zLCV5bW0xCisJdm1vdmRxYQkleW1tMCwyNTYtMjU2KCVyY3gpCisJdnBzaHVmZAkkMHhhYSwleW1tMywleW1tMgorCXZtb3ZkcWEJJXltbTEsMjg4LTI1NiglcmN4KQorCXZwc2h1ZmQJJDB4ZmYsJXltbTMsJXltbTMKKwl2bW92ZHFhCSV5bW0yLDMyMC0yNTYoJXJjeCkKKwl2bW92ZHFhCSV5bW0zLDM1Mi0yNTYoJXJjeCkKKworCXZwc2h1ZmQJJDB4MDAsJXltbTE1LCV5bW0xMgorCXZwc2h1ZmQJJDB4NTUsJXltbTE1LCV5bW0xMworCXZtb3ZkcWEJJXltbTEyLDM4NC01MTIoJXJheCkKKwl2cHNodWZkCSQweGFhLCV5bW0xNSwleW1tMTQKKwl2bW92ZHFhCSV5bW0xMyw0MTYtNTEyKCVyYXgpCisJdnBzaHVmZAkkMHhmZiwleW1tMTUsJXltbTE1CisJdm1vdmRxYQkleW1tMTQsNDQ4LTUxMiglcmF4KQorCXZtb3ZkcWEJJXltbTE1LDQ4MC01MTIoJXJheCkKKworCXZwc2h1ZmQJJDB4MDAsJXltbTcsJXltbTQKKwl2cHNodWZkCSQweDU1LCV5bW03LCV5bW01CisJdnBhZGRkCUwkaW5jeSglcmlwKSwleW1tNCwleW1tNAorCXZwc2h1ZmQJJDB4YWEsJXltbTcsJXltbTYKKwl2bW92ZHFhCSV5bW01LDU0NC01MTIoJXJheCkKKwl2cHNodWZkCSQweGZmLCV5bW03LCV5bW03CisJdm1vdmRxYQkleW1tNiw1NzYtNTEyKCVyYXgpCisJdm1vdmRxYQkleW1tNyw2MDgtNTEyKCVyYXgpCisKKwlqbXAJTCRvb3BfZW50ZXI4eAorCisucDJhbGlnbgk1CitMJG9vcF9vdXRlcjh4OgorCXZtb3ZkcWEJMTI4LTI1NiglcmN4KSwleW1tOAorCXZtb3ZkcWEJMTYwLTI1NiglcmN4KSwleW1tOQorCXZtb3ZkcWEJMTkyLTI1NiglcmN4KSwleW1tMTAKKwl2bW92ZHFhCTIyNC0yNTYoJXJjeCksJXltbTExCisJdm1vdmRxYQkyNTYtMjU2KCVyY3gpLCV5bW0wCisJdm1vdmRxYQkyODgtMjU2KCVyY3gpLCV5bW0xCisJdm1vdmRxYQkzMjAtMjU2KCVyY3gpLCV5bW0yCisJdm1vdmRxYQkzNTItMjU2KCVyY3gpLCV5bW0zCisJdm1vdmRxYQkzODQtNTEyKCVyYXgpLCV5bW0xMgorCXZtb3ZkcWEJNDE2LTUxMiglcmF4KSwleW1tMTMKKwl2bW92ZHFhCTQ0OC01MTIoJXJheCksJXltbTE0CisJdm1vdmRxYQk0ODAtNTEyKCVyYXgpLCV5bW0xNQorCXZtb3ZkcWEJNTEyLTUxMiglcmF4KSwleW1tNAorCXZtb3ZkcWEJNTQ0LTUxMiglcmF4KSwleW1tNQorCXZtb3ZkcWEJNTc2LTUxMiglcmF4KSwleW1tNgorCXZtb3ZkcWEJNjA4LTUxMiglcmF4KSwleW1tNworCXZwYWRkZAlMJGVpZ2h0KCVyaXApLCV5bW00LCV5bW00CisKK0wkb29wX2VudGVyOHg6CisJdm1vdmRxYQkleW1tMTQsNjQoJXJzcCkKKwl2bW92ZHFhCSV5bW0xNSw5NiglcnNwKQorCXZicm9hZGNhc3RpMTI4CSglcjEwKSwleW1tMTUKKwl2bW92ZHFhCSV5bW00LDUxMi01MTIoJXJheCkKKwltb3ZsCSQxMCwlZWF4CisJam1wCUwkb29wOHgKKworLnAyYWxpZ24JNQorTCRvb3A4eDoKKwl2cGFkZGQJJXltbTAsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tNCwleW1tOCwleW1tNAorCXZwc2h1ZmIJJXltbTE1LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW0xLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTUsJXltbTksJXltbTUKKwl2cHNodWZiCSV5bW0xNSwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNCwleW1tMTIsJXltbTEyCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0wCisJdnBzbGxkCSQxMiwleW1tMCwleW1tMTQKKwl2cHNybGQJJDIwLCV5bW0wLCV5bW0wCisJdnBvcgkleW1tMCwleW1tMTQsJXltbTAKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMSksJXltbTE0CisJdnBhZGRkCSV5bW01LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEKKwl2cHNsbGQJJDEyLCV5bW0xLCV5bW0xNQorCXZwc3JsZAkkMjAsJXltbTEsJXltbTEKKwl2cG9yCSV5bW0xLCV5bW0xNSwleW1tMQorCXZwYWRkZAkleW1tMCwleW1tOCwleW1tOAorCXZweG9yCSV5bW00LCV5bW04LCV5bW00CisJdnBzaHVmYgkleW1tMTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTEsJXltbTksJXltbTkKKwl2cHhvcgkleW1tNSwleW1tOSwleW1tNQorCXZwc2h1ZmIJJXltbTE0LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW00LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTAKKwl2cHNsbGQJJDcsJXltbTAsJXltbTE1CisJdnBzcmxkCSQyNSwleW1tMCwleW1tMAorCXZwb3IJJXltbTAsJXltbTE1LCV5bW0wCisJdmJyb2FkY2FzdGkxMjgJKCVyMTApLCV5bW0xNQorCXZwYWRkZAkleW1tNSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xCisJdnBzbGxkCSQ3LCV5bW0xLCV5bW0xNAorCXZwc3JsZAkkMjUsJXltbTEsJXltbTEKKwl2cG9yCSV5bW0xLCV5bW0xNCwleW1tMQorCXZtb3ZkcWEJJXltbTEyLDAoJXJzcCkKKwl2bW92ZHFhCSV5bW0xMywzMiglcnNwKQorCXZtb3ZkcWEJNjQoJXJzcCksJXltbTEyCisJdm1vdmRxYQk5NiglcnNwKSwleW1tMTMKKwl2cGFkZGQJJXltbTIsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW02LCV5bW0xMCwleW1tNgorCXZwc2h1ZmIJJXltbTE1LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW0zLCV5bW0xMSwleW1tMTEKKwl2cHhvcgkleW1tNywleW1tMTEsJXltbTcKKwl2cHNodWZiCSV5bW0xNSwleW1tNywleW1tNworCXZwYWRkZAkleW1tNiwleW1tMTIsJXltbTEyCisJdnB4b3IJJXltbTIsJXltbTEyLCV5bW0yCisJdnBzbGxkCSQxMiwleW1tMiwleW1tMTQKKwl2cHNybGQJJDIwLCV5bW0yLCV5bW0yCisJdnBvcgkleW1tMiwleW1tMTQsJXltbTIKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMSksJXltbTE0CisJdnBhZGRkCSV5bW03LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMywleW1tMTMsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW0zLCV5bW0xNQorCXZwc3JsZAkkMjAsJXltbTMsJXltbTMKKwl2cG9yCSV5bW0zLCV5bW0xNSwleW1tMworCXZwYWRkZAkleW1tMiwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTYsJXltbTEwLCV5bW02CisJdnBzaHVmYgkleW1tMTQsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTMsJXltbTExLCV5bW0xMQorCXZweG9yCSV5bW03LCV5bW0xMSwleW1tNworCXZwc2h1ZmIJJXltbTE0LCV5bW03LCV5bW03CisJdnBhZGRkCSV5bW02LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMiwleW1tMTIsJXltbTIKKwl2cHNsbGQJJDcsJXltbTIsJXltbTE1CisJdnBzcmxkCSQyNSwleW1tMiwleW1tMgorCXZwb3IJJXltbTIsJXltbTE1LCV5bW0yCisJdmJyb2FkY2FzdGkxMjgJKCVyMTApLCV5bW0xNQorCXZwYWRkZAkleW1tNywleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTMsJXltbTEzLCV5bW0zCisJdnBzbGxkCSQ3LCV5bW0zLCV5bW0xNAorCXZwc3JsZAkkMjUsJXltbTMsJXltbTMKKwl2cG9yCSV5bW0zLCV5bW0xNCwleW1tMworCXZwYWRkZAkleW1tMSwleW1tOCwleW1tOAorCXZweG9yCSV5bW03LCV5bW04LCV5bW03CisJdnBzaHVmYgkleW1tMTUsJXltbTcsJXltbTcKKwl2cGFkZGQJJXltbTIsJXltbTksJXltbTkKKwl2cHhvcgkleW1tNCwleW1tOSwleW1tNAorCXZwc2h1ZmIJJXltbTE1LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW03LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMSwleW1tMTIsJXltbTEKKwl2cHNsbGQJJDEyLCV5bW0xLCV5bW0xNAorCXZwc3JsZAkkMjAsJXltbTEsJXltbTEKKwl2cG9yCSV5bW0xLCV5bW0xNCwleW1tMQorCXZicm9hZGNhc3RpMTI4CSglcjExKSwleW1tMTQKKwl2cGFkZGQJJXltbTQsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0yLCV5bW0xMywleW1tMgorCXZwc2xsZAkkMTIsJXltbTIsJXltbTE1CisJdnBzcmxkCSQyMCwleW1tMiwleW1tMgorCXZwb3IJJXltbTIsJXltbTE1LCV5bW0yCisJdnBhZGRkCSV5bW0xLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTcsJXltbTgsJXltbTcKKwl2cHNodWZiCSV5bW0xNCwleW1tNywleW1tNworCXZwYWRkZAkleW1tMiwleW1tOSwleW1tOQorCXZweG9yCSV5bW00LCV5bW05LCV5bW00CisJdnBzaHVmYgkleW1tMTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTcsJXltbTEyLCV5bW0xMgorCXZweG9yCSV5bW0xLCV5bW0xMiwleW1tMQorCXZwc2xsZAkkNywleW1tMSwleW1tMTUKKwl2cHNybGQJJDI1LCV5bW0xLCV5bW0xCisJdnBvcgkleW1tMSwleW1tMTUsJXltbTEKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMCksJXltbTE1CisJdnBhZGRkCSV5bW00LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMiwleW1tMTMsJXltbTIKKwl2cHNsbGQJJDcsJXltbTIsJXltbTE0CisJdnBzcmxkCSQyNSwleW1tMiwleW1tMgorCXZwb3IJJXltbTIsJXltbTE0LCV5bW0yCisJdm1vdmRxYQkleW1tMTIsNjQoJXJzcCkKKwl2bW92ZHFhCSV5bW0xMyw5NiglcnNwKQorCXZtb3ZkcWEJMCglcnNwKSwleW1tMTIKKwl2bW92ZHFhCTMyKCVyc3ApLCV5bW0xMworCXZwYWRkZAkleW1tMywleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTUsJXltbTEwLCV5bW01CisJdnBzaHVmYgkleW1tMTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTAsJXltbTExLCV5bW0xMQorCXZweG9yCSV5bW02LCV5bW0xMSwleW1tNgorCXZwc2h1ZmIJJXltbTE1LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW01LCV5bW0xMiwleW1tMTIKKwl2cHhvcgkleW1tMywleW1tMTIsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW0zLCV5bW0xNAorCXZwc3JsZAkkMjAsJXltbTMsJXltbTMKKwl2cG9yCSV5bW0zLCV5bW0xNCwleW1tMworCXZicm9hZGNhc3RpMTI4CSglcjExKSwleW1tMTQKKwl2cGFkZGQJJXltbTYsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMywleW1tMAorCXZwc2xsZAkkMTIsJXltbTAsJXltbTE1CisJdnBzcmxkCSQyMCwleW1tMCwleW1tMAorCXZwb3IJJXltbTAsJXltbTE1LCV5bW0wCisJdnBhZGRkCSV5bW0zLCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tNSwleW1tMTAsJXltbTUKKwl2cHNodWZiCSV5bW0xNCwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tMCwleW1tMTEsJXltbTExCisJdnB4b3IJJXltbTYsJXltbTExLCV5bW02CisJdnBzaHVmYgkleW1tMTQsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTUsJXltbTEyLCV5bW0xMgorCXZweG9yCSV5bW0zLCV5bW0xMiwleW1tMworCXZwc2xsZAkkNywleW1tMywleW1tMTUKKwl2cHNybGQJJDI1LCV5bW0zLCV5bW0zCisJdnBvcgkleW1tMywleW1tMTUsJXltbTMKKwl2YnJvYWRjYXN0aTEyOAkoJXIxMCksJXltbTE1CisJdnBhZGRkCSV5bW02LCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTMsJXltbTAKKwl2cHNsbGQJJDcsJXltbTAsJXltbTE0CisJdnBzcmxkCSQyNSwleW1tMCwleW1tMAorCXZwb3IJJXltbTAsJXltbTE0LCV5bW0wCisJZGVjbAklZWF4CisJam56CUwkb29wOHgKKworCWxlYXEJNTEyKCVyc3ApLCVyYXgKKwl2cGFkZGQJMTI4LTI1NiglcmN4KSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAtMjU2KCVyY3gpLCV5bW05LCV5bW05CisJdnBhZGRkCTE5Mi0yNTYoJXJjeCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQtMjU2KCVyY3gpLCV5bW0xMSwleW1tMTEKKworCXZwdW5wY2tsZHEJJXltbTksJXltbTgsJXltbTE0CisJdnB1bnBja2xkcQkleW1tMTEsJXltbTEwLCV5bW0xNQorCXZwdW5wY2toZHEJJXltbTksJXltbTgsJXltbTgKKwl2cHVucGNraGRxCSV5bW0xMSwleW1tMTAsJXltbTEwCisJdnB1bnBja2xxZHEJJXltbTE1LCV5bW0xNCwleW1tOQorCXZwdW5wY2tocWRxCSV5bW0xNSwleW1tMTQsJXltbTE0CisJdnB1bnBja2xxZHEJJXltbTEwLCV5bW04LCV5bW0xMQorCXZwdW5wY2tocWRxCSV5bW0xMCwleW1tOCwleW1tOAorCXZwYWRkZAkyNTYtMjU2KCVyY3gpLCV5bW0wLCV5bW0wCisJdnBhZGRkCTI4OC0yNTYoJXJjeCksJXltbTEsJXltbTEKKwl2cGFkZGQJMzIwLTI1NiglcmN4KSwleW1tMiwleW1tMgorCXZwYWRkZAkzNTItMjU2KCVyY3gpLCV5bW0zLCV5bW0zCisKKwl2cHVucGNrbGRxCSV5bW0xLCV5bW0wLCV5bW0xMAorCXZwdW5wY2tsZHEJJXltbTMsJXltbTIsJXltbTE1CisJdnB1bnBja2hkcQkleW1tMSwleW1tMCwleW1tMAorCXZwdW5wY2toZHEJJXltbTMsJXltbTIsJXltbTIKKwl2cHVucGNrbHFkcQkleW1tMTUsJXltbTEwLCV5bW0xCisJdnB1bnBja2hxZHEJJXltbTE1LCV5bW0xMCwleW1tMTAKKwl2cHVucGNrbHFkcQkleW1tMiwleW1tMCwleW1tMworCXZwdW5wY2tocWRxCSV5bW0yLCV5bW0wLCV5bW0wCisJdnBlcm0yaTEyOAkkMHgyMCwleW1tMSwleW1tOSwleW1tMTUKKwl2cGVybTJpMTI4CSQweDMxLCV5bW0xLCV5bW05LCV5bW0xCisJdnBlcm0yaTEyOAkkMHgyMCwleW1tMTAsJXltbTE0LCV5bW05CisJdnBlcm0yaTEyOAkkMHgzMSwleW1tMTAsJXltbTE0LCV5bW0xMAorCXZwZXJtMmkxMjgJJDB4MjAsJXltbTMsJXltbTExLCV5bW0xNAorCXZwZXJtMmkxMjgJJDB4MzEsJXltbTMsJXltbTExLCV5bW0zCisJdnBlcm0yaTEyOAkkMHgyMCwleW1tMCwleW1tOCwleW1tMTEKKwl2cGVybTJpMTI4CSQweDMxLCV5bW0wLCV5bW04LCV5bW0wCisJdm1vdmRxYQkleW1tMTUsMCglcnNwKQorCXZtb3ZkcWEJJXltbTksMzIoJXJzcCkKKwl2bW92ZHFhCTY0KCVyc3ApLCV5bW0xNQorCXZtb3ZkcWEJOTYoJXJzcCksJXltbTkKKworCXZwYWRkZAkzODQtNTEyKCVyYXgpLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJNDE2LTUxMiglcmF4KSwleW1tMTMsJXltbTEzCisJdnBhZGRkCTQ0OC01MTIoJXJheCksJXltbTE1LCV5bW0xNQorCXZwYWRkZAk0ODAtNTEyKCVyYXgpLCV5bW05LCV5bW05CisKKwl2cHVucGNrbGRxCSV5bW0xMywleW1tMTIsJXltbTIKKwl2cHVucGNrbGRxCSV5bW05LCV5bW0xNSwleW1tOAorCXZwdW5wY2toZHEJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2cHVucGNraGRxCSV5bW05LCV5bW0xNSwleW1tMTUKKwl2cHVucGNrbHFkcQkleW1tOCwleW1tMiwleW1tMTMKKwl2cHVucGNraHFkcQkleW1tOCwleW1tMiwleW1tMgorCXZwdW5wY2tscWRxCSV5bW0xNSwleW1tMTIsJXltbTkKKwl2cHVucGNraHFkcQkleW1tMTUsJXltbTEyLCV5bW0xMgorCXZwYWRkZAk1MTItNTEyKCVyYXgpLCV5bW00LCV5bW00CisJdnBhZGRkCTU0NC01MTIoJXJheCksJXltbTUsJXltbTUKKwl2cGFkZGQJNTc2LTUxMiglcmF4KSwleW1tNiwleW1tNgorCXZwYWRkZAk2MDgtNTEyKCVyYXgpLCV5bW03LCV5bW03CisKKwl2cHVucGNrbGRxCSV5bW01LCV5bW00LCV5bW0xNQorCXZwdW5wY2tsZHEJJXltbTcsJXltbTYsJXltbTgKKwl2cHVucGNraGRxCSV5bW01LCV5bW00LCV5bW00CisJdnB1bnBja2hkcQkleW1tNywleW1tNiwleW1tNgorCXZwdW5wY2tscWRxCSV5bW04LCV5bW0xNSwleW1tNQorCXZwdW5wY2tocWRxCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHVucGNrbHFkcQkleW1tNiwleW1tNCwleW1tNworCXZwdW5wY2tocWRxCSV5bW02LCV5bW00LCV5bW00CisJdnBlcm0yaTEyOAkkMHgyMCwleW1tNSwleW1tMTMsJXltbTgKKwl2cGVybTJpMTI4CSQweDMxLCV5bW01LCV5bW0xMywleW1tNQorCXZwZXJtMmkxMjgJJDB4MjAsJXltbTE1LCV5bW0yLCV5bW0xMworCXZwZXJtMmkxMjgJJDB4MzEsJXltbTE1LCV5bW0yLCV5bW0xNQorCXZwZXJtMmkxMjgJJDB4MjAsJXltbTcsJXltbTksJXltbTIKKwl2cGVybTJpMTI4CSQweDMxLCV5bW03LCV5bW05LCV5bW03CisJdnBlcm0yaTEyOAkkMHgyMCwleW1tNCwleW1tMTIsJXltbTkKKwl2cGVybTJpMTI4CSQweDMxLCV5bW00LCV5bW0xMiwleW1tNAorCXZtb3ZkcWEJMCglcnNwKSwleW1tNgorCXZtb3ZkcWEJMzIoJXJzcCksJXltbTEyCisKKwljbXBxCSQ1MTIsJXJkeAorCWpiCUwkdGFpbDh4CisKKwl2cHhvcgkwKCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJMzIoJXJzaSksJXltbTgsJXltbTgKKwl2cHhvcgk2NCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTk2KCVyc2kpLCV5bW01LCV5bW01CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXZtb3ZkcXUJJXltbTYsMCglcmRpKQorCXZtb3ZkcXUJJXltbTgsMzIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xLDY0KCVyZGkpCisJdm1vdmRxdQkleW1tNSw5NiglcmRpKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKworCXZweG9yCTAoJXJzaSksJXltbTEyLCV5bW0xMgorCXZweG9yCTMyKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2cHhvcgk2NCglcnNpKSwleW1tMTAsJXltbTEwCisJdnB4b3IJOTYoJXJzaSksJXltbTE1LCV5bW0xNQorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwl2bW92ZHF1CSV5bW0xMiwwKCVyZGkpCisJdm1vdmRxdQkleW1tMTMsMzIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTE1LDk2KCVyZGkpCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCisJdnB4b3IJMCglcnNpKSwleW1tMTQsJXltbTE0CisJdnB4b3IJMzIoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgk2NCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTk2KCVyc2kpLCV5bW03LCV5bW03CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXZtb3ZkcXUJJXltbTE0LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMyw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTcsOTYoJXJkaSkKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisKKwl2cHhvcgkwKCVyc2kpLCV5bW0xMSwleW1tMTEKKwl2cHhvcgkzMiglcnNpKSwleW1tOSwleW1tOQorCXZweG9yCTY0KCVyc2kpLCV5bW0wLCV5bW0wCisJdnB4b3IJOTYoJXJzaSksJXltbTQsJXltbTQKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJdm1vdmRxdQkleW1tMTEsMCglcmRpKQorCXZtb3ZkcXUJJXltbTksMzIoJXJkaSkKKwl2bW92ZHF1CSV5bW0wLDY0KCVyZGkpCisJdm1vdmRxdQkleW1tNCw5NiglcmRpKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKworCXN1YnEJJDUxMiwlcmR4CisJam56CUwkb29wX291dGVyOHgKKworCWptcAlMJGRvbmU4eAorCitMJHRhaWw4eDoKKwljbXBxCSQ0NDgsJXJkeAorCWphZQlMJDQ0OF9vcl9tb3JlOHgKKwljbXBxCSQzODQsJXJkeAorCWphZQlMJDM4NF9vcl9tb3JlOHgKKwljbXBxCSQzMjAsJXJkeAorCWphZQlMJDMyMF9vcl9tb3JlOHgKKwljbXBxCSQyNTYsJXJkeAorCWphZQlMJDI1Nl9vcl9tb3JlOHgKKwljbXBxCSQxOTIsJXJkeAorCWphZQlMJDE5Ml9vcl9tb3JlOHgKKwljbXBxCSQxMjgsJXJkeAorCWphZQlMJDEyOF9vcl9tb3JlOHgKKwljbXBxCSQ2NCwlcmR4CisJamFlCUwkNjRfb3JfbW9yZTh4CisKKwl4b3JxCSVyMTAsJXIxMAorCXZtb3ZkcWEJJXltbTYsMCglcnNwKQorCXZtb3ZkcWEJJXltbTgsMzIoJXJzcCkKKwlqbXAJTCRvb3BfdGFpbDh4CisKKy5wMmFsaWduCTUKK0wkNjRfb3JfbW9yZTh4OgorCXZweG9yCTAoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgkzMiglcnNpKSwleW1tOCwleW1tOAorCXZtb3ZkcXUJJXltbTYsMCglcmRpKQorCXZtb3ZkcXUJJXltbTgsMzIoJXJkaSkKKwlqZQlMJGRvbmU4eAorCisJbGVhcQk2NCglcnNpKSwlcnNpCisJeG9ycQklcjEwLCVyMTAKKwl2bW92ZHFhCSV5bW0xLDAoJXJzcCkKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwlzdWJxCSQ2NCwlcmR4CisJdm1vdmRxYQkleW1tNSwzMiglcnNwKQorCWptcAlMJG9vcF90YWlsOHgKKworLnAyYWxpZ24JNQorTCQxMjhfb3JfbW9yZTh4OgorCXZweG9yCTAoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgkzMiglcnNpKSwleW1tOCwleW1tOAorCXZweG9yCTY0KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJOTYoJXJzaSksJXltbTUsJXltbTUKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwlqZQlMJGRvbmU4eAorCisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMTIsMCglcnNwKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwlzdWJxCSQxMjgsJXJkeAorCXZtb3ZkcWEJJXltbTEzLDMyKCVyc3ApCisJam1wCUwkb29wX3RhaWw4eAorCisucDJhbGlnbgk1CitMJDE5Ml9vcl9tb3JlOHg6CisJdnB4b3IJMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTMyKCVyc2kpLCV5bW04LCV5bW04CisJdnB4b3IJNjQoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk5NiglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTEyOCglcnNpKSwleW1tMTIsJXltbTEyCisJdnB4b3IJMTYwKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiwxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMywxNjAoJXJkaSkKKwlqZQlMJGRvbmU4eAorCisJbGVhcQkxOTIoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMTAsMCglcnNwKQorCWxlYXEJMTkyKCVyZGkpLCVyZGkKKwlzdWJxCSQxOTIsJXJkeAorCXZtb3ZkcWEJJXltbTE1LDMyKCVyc3ApCisJam1wCUwkb29wX3RhaWw4eAorCisucDJhbGlnbgk1CitMJDI1Nl9vcl9tb3JlOHg6CisJdnB4b3IJMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTMyKCVyc2kpLCV5bW04LCV5bW04CisJdnB4b3IJNjQoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk5NiglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTEyOCglcnNpKSwleW1tMTIsJXltbTEyCisJdnB4b3IJMTYwKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2cHhvcgkxOTIoJXJzaSksJXltbTEwLCV5bW0xMAorCXZweG9yCTIyNCglcnNpKSwleW1tMTUsJXltbTE1CisJdm1vdmRxdQkleW1tNiwwKCVyZGkpCisJdm1vdmRxdQkleW1tOCwzMiglcmRpKQorCXZtb3ZkcXUJJXltbTEsNjQoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDk2KCVyZGkpCisJdm1vdmRxdQkleW1tMTIsMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMTMsMTYwKCVyZGkpCisJdm1vdmRxdQkleW1tMTAsMTkyKCVyZGkpCisJdm1vdmRxdQkleW1tMTUsMjI0KCVyZGkpCisJamUJTCRkb25lOHgKKworCWxlYXEJMjU2KCVyc2kpLCVyc2kKKwl4b3JxCSVyMTAsJXIxMAorCXZtb3ZkcWEJJXltbTE0LDAoJXJzcCkKKwlsZWFxCTI1NiglcmRpKSwlcmRpCisJc3VicQkkMjU2LCVyZHgKKwl2bW92ZHFhCSV5bW0yLDMyKCVyc3ApCisJam1wCUwkb29wX3RhaWw4eAorCisucDJhbGlnbgk1CitMJDMyMF9vcl9tb3JlOHg6CisJdnB4b3IJMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTMyKCVyc2kpLCV5bW04LCV5bW04CisJdnB4b3IJNjQoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk5NiglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTEyOCglcnNpKSwleW1tMTIsJXltbTEyCisJdnB4b3IJMTYwKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2cHhvcgkxOTIoJXJzaSksJXltbTEwLCV5bW0xMAorCXZweG9yCTIyNCglcnNpKSwleW1tMTUsJXltbTE1CisJdnB4b3IJMjU2KCVyc2kpLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkyODgoJXJzaSksJXltbTIsJXltbTIKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiwxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMywxNjAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCwxOTIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNSwyMjQoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNCwyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDI4OCglcmRpKQorCWplCUwkZG9uZTh4CisKKwlsZWFxCTMyMCglcnNpKSwlcnNpCisJeG9ycQklcjEwLCVyMTAKKwl2bW92ZHFhCSV5bW0zLDAoJXJzcCkKKwlsZWFxCTMyMCglcmRpKSwlcmRpCisJc3VicQkkMzIwLCVyZHgKKwl2bW92ZHFhCSV5bW03LDMyKCVyc3ApCisJam1wCUwkb29wX3RhaWw4eAorCisucDJhbGlnbgk1CitMJDM4NF9vcl9tb3JlOHg6CisJdnB4b3IJMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTMyKCVyc2kpLCV5bW04LCV5bW04CisJdnB4b3IJNjQoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk5NiglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTEyOCglcnNpKSwleW1tMTIsJXltbTEyCisJdnB4b3IJMTYwKCVyc2kpLCV5bW0xMywleW1tMTMKKwl2cHhvcgkxOTIoJXJzaSksJXltbTEwLCV5bW0xMAorCXZweG9yCTIyNCglcnNpKSwleW1tMTUsJXltbTE1CisJdnB4b3IJMjU2KCVyc2kpLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkyODgoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgkzMjAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzNTIoJXJzaSksJXltbTcsJXltbTcKKwl2bW92ZHF1CSV5bW02LDAoJXJkaSkKKwl2bW92ZHF1CSV5bW04LDMyKCVyZGkpCisJdm1vdmRxdQkleW1tMSw2NCglcmRpKQorCXZtb3ZkcXUJJXltbTUsOTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiwxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMywxNjAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMCwxOTIoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNSwyMjQoJXJkaSkKKwl2bW92ZHF1CSV5bW0xNCwyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDI4OCglcmRpKQorCXZtb3ZkcXUJJXltbTMsMzIwKCVyZGkpCisJdm1vdmRxdQkleW1tNywzNTIoJXJkaSkKKwlqZQlMJGRvbmU4eAorCisJbGVhcQkzODQoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMTEsMCglcnNwKQorCWxlYXEJMzg0KCVyZGkpLCVyZGkKKwlzdWJxCSQzODQsJXJkeAorCXZtb3ZkcWEJJXltbTksMzIoJXJzcCkKKwlqbXAJTCRvb3BfdGFpbDh4CisKKy5wMmFsaWduCTUKK0wkNDQ4X29yX21vcmU4eDoKKwl2cHhvcgkwKCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJMzIoJXJzaSksJXltbTgsJXltbTgKKwl2cHhvcgk2NCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTk2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJMTI4KCVyc2kpLCV5bW0xMiwleW1tMTIKKwl2cHhvcgkxNjAoJXJzaSksJXltbTEzLCV5bW0xMworCXZweG9yCTE5MiglcnNpKSwleW1tMTAsJXltbTEwCisJdnB4b3IJMjI0KCVyc2kpLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkyNTYoJXJzaSksJXltbTE0LCV5bW0xNAorCXZweG9yCTI4OCglcnNpKSwleW1tMiwleW1tMgorCXZweG9yCTMyMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTM1MiglcnNpKSwleW1tNywleW1tNworCXZweG9yCTM4NCglcnNpKSwleW1tMTEsJXltbTExCisJdnB4b3IJNDE2KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tNiwwKCVyZGkpCisJdm1vdmRxdQkleW1tOCwzMiglcmRpKQorCXZtb3ZkcXUJJXltbTEsNjQoJXJkaSkKKwl2bW92ZHF1CSV5bW01LDk2KCVyZGkpCisJdm1vdmRxdQkleW1tMTIsMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMTMsMTYwKCVyZGkpCisJdm1vdmRxdQkleW1tMTAsMTkyKCVyZGkpCisJdm1vdmRxdQkleW1tMTUsMjI0KCVyZGkpCisJdm1vdmRxdQkleW1tMTQsMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tMiwyODgoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyMCglcmRpKQorCXZtb3ZkcXUJJXltbTcsMzUyKCVyZGkpCisJdm1vdmRxdQkleW1tMTEsMzg0KCVyZGkpCisJdm1vdmRxdQkleW1tOSw0MTYoJXJkaSkKKwlqZQlMJGRvbmU4eAorCisJbGVhcQk0NDgoJXJzaSksJXJzaQorCXhvcnEJJXIxMCwlcjEwCisJdm1vdmRxYQkleW1tMCwwKCVyc3ApCisJbGVhcQk0NDgoJXJkaSksJXJkaQorCXN1YnEJJDQ0OCwlcmR4CisJdm1vdmRxYQkleW1tNCwzMiglcnNwKQorCitMJG9vcF90YWlsOHg6CisJbW92emJsCSglcnNpLCVyMTAsMSksJWVheAorCW1vdnpibAkoJXJzcCwlcjEwLDEpLCVlY3gKKwlsZWFxCTEoJXIxMCksJXIxMAorCXhvcmwJJWVjeCwlZWF4CisJbW92YgklYWwsLTEoJXJkaSwlcjEwLDEpCisJZGVjcQklcmR4CisJam56CUwkb29wX3RhaWw4eAorCitMJGRvbmU4eDoKKwl2emVyb2FsbAorCWxlYXEJKCVyOSksJXJzcAorTCQ4eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9hZXMxMjhnY21zaXYteDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9hZXMxMjhnY21zaXYteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhNTI2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2FlczEyOGdjbXNpdi14ODZfNjQuUwpAQCAtMCwwICsxLDMwNTYgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLmRhdGEJCisKKy5wMmFsaWduCTQKK29uZToKKy5xdWFkCTEsMAordHdvOgorLnF1YWQJMiwwCit0aHJlZToKKy5xdWFkCTMsMAorZm91cjoKKy5xdWFkCTQsMAorZml2ZToKKy5xdWFkCTUsMAorc2l4OgorLnF1YWQJNiwwCitzZXZlbjoKKy5xdWFkCTcsMAorZWlnaHQ6CisucXVhZAk4LDAKKworT1JfTUFTSzoKKy5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDAKK3BvbHk6CisucXVhZAkweDEsIDB4YzIwMDAwMDAwMDAwMDAwMAorbWFzazoKKy5sb25nCTB4MGMwZjBlMGQsMHgwYzBmMGUwZCwweDBjMGYwZTBkLDB4MGMwZjBlMGQKK2NvbjE6CisubG9uZwkxLDEsMSwxCitjb24yOgorLmxvbmcJMHgxYiwweDFiLDB4MWIsMHgxYgorY29uMzoKKy5ieXRlCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDQsNSw2LDcsNCw1LDYsNworYW5kX21hc2s6CisubG9uZwkwLDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYKKy50ZXh0CQorCisucDJhbGlnbgk0CitHRk1VTDoKKworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEsJXhtbTAsJXhtbTIKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xLCV4bW0wLCV4bW01CisJdnBjbG11bHFkcQkkMHgxMCwleG1tMSwleG1tMCwleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEsJXhtbTAsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDgsJXhtbTMsJXhtbTQKKwl2cHNybGRxCSQ4LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cHhvcgkleG1tMywleG1tNSwleG1tNQorCisJdnBjbG11bHFkcQkkMHgxMCxwb2x5KCVyaXApLCV4bW0yLCV4bW0zCisJdnBzaHVmZAkkNzgsJXhtbTIsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMgorCisJdnBjbG11bHFkcQkkMHgxMCxwb2x5KCVyaXApLCV4bW0yLCV4bW0zCisJdnBzaHVmZAkkNzgsJXhtbTIsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMgorCisJdnB4b3IJJXhtbTUsJXhtbTIsJXhtbTAKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2Flc2djbXNpdl9odGFibGVfaW5pdAorLnByaXZhdGVfZXh0ZXJuIF9hZXNnY21zaXZfaHRhYmxlX2luaXQKKworLnAyYWxpZ24JNAorX2Flc2djbXNpdl9odGFibGVfaW5pdDoKKworCXZtb3ZkcWEJKCVyc2kpLCV4bW0wCisJdm1vdmRxYQkleG1tMCwleG1tMQorCXZtb3ZkcWEJJXhtbTAsKCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsMTYoJXJkaSkKKwljYWxsCUdGTVVMCisJdm1vdmRxYQkleG1tMCwzMiglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDQ4KCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsNjQoJXJkaSkKKwljYWxsCUdGTVVMCisJdm1vdmRxYQkleG1tMCw4MCglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDk2KCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsMTEyKCVyZGkpCisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9hZXNnY21zaXZfaHRhYmxlNl9pbml0CisucHJpdmF0ZV9leHRlcm4gX2Flc2djbXNpdl9odGFibGU2X2luaXQKKworLnAyYWxpZ24JNAorX2Flc2djbXNpdl9odGFibGU2X2luaXQ6CisKKwl2bW92ZHFhCSglcnNpKSwleG1tMAorCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKwl2bW92ZHFhCSV4bW0wLCglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDE2KCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsMzIoJXJkaSkKKwljYWxsCUdGTVVMCisJdm1vdmRxYQkleG1tMCw0OCglcmRpKQorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCSV4bW0wLDY0KCVyZGkpCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJJXhtbTAsODAoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2Flc2djbXNpdl9odGFibGVfcG9seXZhbAorLnByaXZhdGVfZXh0ZXJuIF9hZXNnY21zaXZfaHRhYmxlX3BvbHl2YWwKKworLnAyYWxpZ24JNAorX2Flc2djbXNpdl9odGFibGVfcG9seXZhbDoKKworCXRlc3RxCSVyZHgsJXJkeAorCWpueglMJGh0YWJsZV9wb2x5dmFsX3N0YXJ0CisJLmJ5dGUJMHhmMywweGMzCisKK0wkaHRhYmxlX3BvbHl2YWxfc3RhcnQ6CisJdnplcm9hbGwKKworCisKKwltb3ZxCSVyZHgsJXIxMQorCWFuZHEJJDEyNywlcjExCisKKwlqeglMJGh0YWJsZV9wb2x5dmFsX25vX3ByZWZpeAorCisJdnB4b3IJJXhtbTksJXhtbTksJXhtbTkKKwl2bW92ZHFhCSglcmN4KSwleG1tMQorCXN1YnEJJXIxMSwlcmR4CisKKwlzdWJxCSQxNiwlcjExCisKKworCXZtb3ZkcXUJKCVyc2kpLCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKworCXZwY2xtdWxxZHEJJDB4MDEsKCVyZGksJXIxMSwxKSwleG1tMCwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsKCVyZGksJXIxMSwxKSwleG1tMCwleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsKCVyZGksJXIxMSwxKSwleG1tMCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTAsKCVyZGksJXIxMSwxKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwl0ZXN0cQklcjExLCVyMTEKKwlqbnoJTCRodGFibGVfcG9seXZhbF9wcmVmaXhfbG9vcAorCWptcAlMJGh0YWJsZV9wb2x5dmFsX3ByZWZpeF9jb21wbGV0ZQorCisKKy5wMmFsaWduCTYKK0wkaHRhYmxlX3BvbHl2YWxfcHJlZml4X2xvb3A6CisJc3VicQkkMTYsJXIxMQorCisJdm1vdmRxdQkoJXJzaSksJXhtbTAKKworCXZwY2xtdWxxZHEJJDB4MDAsKCVyZGksJXIxMSwxKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwoJXJkaSwlcjExLDEpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDAxLCglcmRpLCVyMTEsMSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MTAsKCVyZGksJXIxMSwxKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKwl0ZXN0cQklcjExLCVyMTEKKworCWxlYXEJMTYoJXJzaSksJXJzaQorCisJam56CUwkaHRhYmxlX3BvbHl2YWxfcHJlZml4X2xvb3AKKworTCRodGFibGVfcG9seXZhbF9wcmVmaXhfY29tcGxldGU6CisJdnBzcmxkcQkkOCwleG1tNSwleG1tNgorCXZwc2xsZHEJJDgsJXhtbTUsJXhtbTUKKworCXZweG9yCSV4bW02LCV4bW00LCV4bW05CisJdnB4b3IJJXhtbTUsJXhtbTMsJXhtbTEKKworCWptcAlMJGh0YWJsZV9wb2x5dmFsX21haW5fbG9vcAorCitMJGh0YWJsZV9wb2x5dmFsX25vX3ByZWZpeDoKKworCisKKworCXZweG9yCSV4bW0xLCV4bW0xLCV4bW0xCisJdm1vdmRxYQkoJXJjeCksJXhtbTkKKworLnAyYWxpZ24JNgorTCRodGFibGVfcG9seXZhbF9tYWluX2xvb3A6CisJc3VicQkkMHg4MCwlcmR4CisJamIJTCRodGFibGVfcG9seXZhbF9vdXQKKworCXZtb3ZkcXUJMTEyKCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDAxLCglcmRpKSwleG1tMCwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsKCVyZGkpLCV4bW0wLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwoJXJkaSksJXhtbTAsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKworCXZtb3ZkcXUJOTYoJXJzaSksJXhtbTAKKwl2cGNsbXVscWRxCSQweDAxLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLDE2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisKKwl2bW92ZHF1CTgwKCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDEwLHBvbHkoJXJpcCksJXhtbTEsJXhtbTcKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMSwleG1tMQorCisJdnBjbG11bHFkcQkkMHgwMSwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCwzMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKworCXZweG9yCSV4bW03LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTY0KCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDAxLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLDQ4KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisJdm1vdmRxdQk0OCglcnNpKSwleG1tMAorCisJdnBjbG11bHFkcQkkMHgxMCxwb2x5KCVyaXApLCV4bW0xLCV4bW03CisJdnBhbGlnbnIJJDgsJXhtbTEsJXhtbTEsJXhtbTEKKworCXZwY2xtdWxxZHEJJDB4MDEsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTAsNjQoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNSwleG1tNQorCisKKwl2cHhvcgkleG1tNywleG1tMSwleG1tMQorCisJdm1vdmRxdQkzMiglcnNpKSwleG1tMAorCisJdnBjbG11bHFkcQkkMHgwMSw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCw4MCglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisKKworCXZweG9yCSV4bW05LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTE2KCVyc2kpLCV4bW0wCisKKwl2cGNsbXVscWRxCSQweDAxLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDEwLDk2KCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisJdm1vdmRxdQkwKCVyc2kpLCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKworCXZwY2xtdWxxZHEJJDB4MDEsMTEyKCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLDExMiglcmRpKSwleG1tMCwleG1tNgorCXZweG9yCSV4bW02LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwxMTIoJXJkaSksJXhtbTAsJXhtbTYKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTAsMTEyKCVyZGkpLCV4bW0wLCV4bW02CisJdnB4b3IJJXhtbTYsJXhtbTUsJXhtbTUKKworCisJdnBzcmxkcQkkOCwleG1tNSwleG1tNgorCXZwc2xsZHEJJDgsJXhtbTUsJXhtbTUKKworCXZweG9yCSV4bW02LCV4bW00LCV4bW05CisJdnB4b3IJJXhtbTUsJXhtbTMsJXhtbTEKKworCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlqbXAJTCRodGFibGVfcG9seXZhbF9tYWluX2xvb3AKKworCisKK0wkaHRhYmxlX3BvbHl2YWxfb3V0OgorCXZwY2xtdWxxZHEJJDB4MTAscG9seSglcmlwKSwleG1tMSwleG1tNgorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTYsJXhtbTEsJXhtbTEKKworCXZwY2xtdWxxZHEJJDB4MTAscG9seSglcmlwKSwleG1tMSwleG1tNgorCXZwYWxpZ25yCSQ4LCV4bW0xLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTYsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tOSwleG1tMSwleG1tMQorCisJdm1vdmRxdQkleG1tMSwoJXJjeCkKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9hZXNnY21zaXZfcG9seXZhbF9ob3JuZXIKKy5wcml2YXRlX2V4dGVybiBfYWVzZ2Ntc2l2X3BvbHl2YWxfaG9ybmVyCisKKy5wMmFsaWduCTQKK19hZXNnY21zaXZfcG9seXZhbF9ob3JuZXI6CisKKwl0ZXN0cQklcmN4LCVyY3gKKwlqbnoJTCRwb2x5dmFsX2hvcm5lcl9zdGFydAorCS5ieXRlCTB4ZjMsMHhjMworCitMJHBvbHl2YWxfaG9ybmVyX3N0YXJ0OgorCisKKworCXhvcnEJJXIxMCwlcjEwCisJc2hscQkkNCwlcmN4CisKKwl2bW92ZHFhCSglcnNpKSwleG1tMQorCXZtb3ZkcWEJKCVyZGkpLCV4bW0wCisKK0wkcG9seXZhbF9ob3JuZXJfbG9vcDoKKwl2cHhvcgkoJXJkeCwlcjEwLDEpLCV4bW0wLCV4bW0wCisJY2FsbAlHRk1VTAorCisJYWRkcQkkMTYsJXIxMAorCWNtcHEJJXIxMCwlcmN4CisJam5lCUwkcG9seXZhbF9ob3JuZXJfbG9vcAorCisKKwl2bW92ZHFhCSV4bW0wLCglcmRpKQorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzMTI4Z2Ntc2l2X2Flc19rcworLnByaXZhdGVfZXh0ZXJuIF9hZXMxMjhnY21zaXZfYWVzX2tzCisKKy5wMmFsaWduCTQKK19hZXMxMjhnY21zaXZfYWVzX2tzOgorCisJdm1vdmRxdQkoJXJkaSksJXhtbTEKKwl2bW92ZHFhCSV4bW0xLCglcnNpKQorCisJdm1vdmRxYQljb24xKCVyaXApLCV4bW0wCisJdm1vdmRxYQltYXNrKCVyaXApLCV4bW0xNQorCisJbW92cQkkOCwlcmF4CisKK0wka3MxMjhfbG9vcDoKKwlhZGRxCSQxNiwlcnNpCisJc3VicQkkMSwlcmF4CisJdnBzaHVmYgkleG1tMTUsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xsZHEJJDQsJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdm1vdmRxYQkleG1tMSwoJXJzaSkKKwlqbmUJTCRrczEyOF9sb29wCisKKwl2bW92ZHFhCWNvbjIoJXJpcCksJXhtbTAKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxkcQkkNCwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tMywleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tMywleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2bW92ZHFhCSV4bW0xLDE2KCVyc2kpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkcQkkNCwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tMywleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tMywleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2bW92ZHFhCSV4bW0xLDMyKCVyc2kpCisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9hZXMyNTZnY21zaXZfYWVzX2tzCisucHJpdmF0ZV9leHRlcm4gX2FlczI1NmdjbXNpdl9hZXNfa3MKKworLnAyYWxpZ24JNAorX2FlczI1NmdjbXNpdl9hZXNfa3M6CisKKwl2bW92ZHF1CSglcmRpKSwleG1tMQorCXZtb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwl2bW92ZHFhCSV4bW0xLCglcnNpKQorCXZtb3ZkcWEJJXhtbTMsMTYoJXJzaSkKKwl2bW92ZHFhCWNvbjEoJXJpcCksJXhtbTAKKwl2bW92ZHFhCW1hc2soJXJpcCksJXhtbTE1CisJdnB4b3IJJXhtbTE0LCV4bW0xNCwleG1tMTQKKwltb3ZxCSQ2LCVyYXgKKworTCRrczI1Nl9sb29wOgorCWFkZHEJJDMyLCVyc2kKKwlzdWJxCSQxLCVyYXgKKwl2cHNodWZiCSV4bW0xNSwleG1tMywleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxxCSQzMiwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzaHVmYgljb24zKCVyaXApLCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZtb3ZkcWEJJXhtbTEsKCVyc2kpCisJdnBzaHVmZAkkMHhmZiwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNCwleG1tMiwleG1tMgorCXZwc2xscQkkMzIsJXhtbTMsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMywleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTIsJXhtbTMsJXhtbTMKKwl2bW92ZHFhCSV4bW0zLDE2KCVyc2kpCisJam5lCUwka3MyNTZfbG9vcAorCisJdnBzaHVmYgkleG1tMTUsJXhtbTMsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2bW92ZHFhCSV4bW0xLDMyKCVyc2kpCisJLmJ5dGUJMHhmMywweGMzCisKKy5nbG9ibAlfYWVzMTI4Z2Ntc2l2X2Flc19rc19lbmNfeDEKKy5wcml2YXRlX2V4dGVybiBfYWVzMTI4Z2Ntc2l2X2Flc19rc19lbmNfeDEKKworLnAyYWxpZ24JNAorX2FlczEyOGdjbXNpdl9hZXNfa3NfZW5jX3gxOgorCisJdm1vdmRxYQkoJXJjeCksJXhtbTEKKwl2bW92ZHFhCTAoJXJkaSksJXhtbTQKKworCXZtb3ZkcWEJJXhtbTEsKCVyZHgpCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKworCXZtb3ZkcWEJY29uMSglcmlwKSwleG1tMAorCXZtb3ZkcWEJbWFzayglcmlwKSwleG1tMTUKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMSwxNiglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKworCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0xLDMyKCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxxCSQzMiwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzaHVmYgljb24zKCVyaXApLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZtb3ZkcWEJJXhtbTEsNDgoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMSw2NCglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xscQkkMzIsJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2h1ZmIJY29uMyglcmlwKSwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKworCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0xLDgwKCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxxCSQzMiwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzaHVmYgljb24zKCVyaXApLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZtb3ZkcWEJJXhtbTEsOTYoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMSwxMTIoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbHEJJDMyLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHNodWZiCWNvbjMoJXJpcCksJXhtbTEsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxYQkleG1tMSwxMjgoJXJkeCkKKworCisJdm1vdmRxYQljb24yKCVyaXApLCV4bW0wCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxxCSQzMiwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzaHVmYgljb24zKCVyaXApLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZtb3ZkcWEJJXhtbTEsMTQ0KCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxxCSQzMiwleG1tMSwleG1tMworCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzaHVmYgljb24zKCVyaXApLCV4bW0xLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCisJdmFlc2VuY2xhc3QJJXhtbTEsJXhtbTQsJXhtbTQKKwl2bW92ZHFhCSV4bW0xLDE2MCglcmR4KQorCisKKwl2bW92ZHFhCSV4bW00LDAoJXJzaSkKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2FlczEyOGdjbXNpdl9rZGYKKy5wcml2YXRlX2V4dGVybiBfYWVzMTI4Z2Ntc2l2X2tkZgorCisucDJhbGlnbgk0CitfYWVzMTI4Z2Ntc2l2X2tkZjoKKworCisKKworCisJdm1vdmRxYQkoJXJkeCksJXhtbTEKKwl2bW92ZHFhCTAoJXJkaSksJXhtbTkKKwl2bW92ZHFhCWFuZF9tYXNrKCVyaXApLCV4bW0xMgorCXZtb3ZkcWEJb25lKCVyaXApLCV4bW0xMworCXZwc2h1ZmQJJDB4OTAsJXhtbTksJXhtbTkKKwl2cGFuZAkleG1tMTIsJXhtbTksJXhtbTkKKwl2cGFkZGQJJXhtbTEzLCV4bW05LCV4bW0xMAorCXZwYWRkZAkleG1tMTMsJXhtbTEwLCV4bW0xMQorCXZwYWRkZAkleG1tMTMsJXhtbTExLCV4bW0xMgorCisJdnB4b3IJJXhtbTEsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMSwleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW0xLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJMTYoJXJkeCksJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMSwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHFhCTMyKCVyZHgpLCV4bW0yCisJdmFlc2VuYwkleG1tMiwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTIsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxYQk0OCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJNjQoJXJkeCksJXhtbTIKKwl2YWVzZW5jCSV4bW0yLCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMiwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHFhCTgwKCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTEsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxYQk5NiglcmR4KSwleG1tMgorCXZhZXNlbmMJJXhtbTIsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJMTEyKCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTEsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxYQkxMjgoJXJkeCksJXhtbTIKKwl2YWVzZW5jCSV4bW0yLCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMiwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHFhCTE0NCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcWEJMTYwKCVyZHgpLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTksJXhtbTkKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tMTAsJXhtbTEwCisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW0xMiwleG1tMTIKKworCisJdm1vdmRxYQkleG1tOSwwKCVyc2kpCisJdm1vdmRxYQkleG1tMTAsMTYoJXJzaSkKKwl2bW92ZHFhCSV4bW0xMSwzMiglcnNpKQorCXZtb3ZkcWEJJXhtbTEyLDQ4KCVyc2kpCisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9hZXMxMjhnY21zaXZfZW5jX21zZ194NAorLnByaXZhdGVfZXh0ZXJuIF9hZXMxMjhnY21zaXZfZW5jX21zZ194NAorCisucDJhbGlnbgk0CitfYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDQ6CisKKwl0ZXN0cQklcjgsJXI4CisJam56CUwkMTI4X2VuY19tc2dfeDRfc3RhcnQKKwkuYnl0ZQkweGYzLDB4YzMKKworTCQxMjhfZW5jX21zZ194NF9zdGFydDoKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKworCXNocnEJJDQsJXI4CisJbW92cQklcjgsJXIxMAorCXNobHEJJDYyLCVyMTAKKwlzaHJxCSQ2MiwlcjEwCisKKworCXZtb3ZkcWEJKCVyZHgpLCV4bW0xNQorCXZwb3IJT1JfTUFTSyglcmlwKSwleG1tMTUsJXhtbTE1CisKKwl2bW92ZHF1CWZvdXIoJXJpcCksJXhtbTQKKwl2bW92ZHFhCSV4bW0xNSwleG1tMAorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTE1LCV4bW0xCisJdnBhZGRkCXR3byglcmlwKSwleG1tMTUsJXhtbTIKKwl2cGFkZGQJdGhyZWUoJXJpcCksJXhtbTE1LCV4bW0zCisKKwlzaHJxCSQyLCVyOAorCWplCUwkMTI4X2VuY19tc2dfeDRfY2hlY2tfcmVtYWluZGVyCisKKwlzdWJxCSQ2NCwlcnNpCisJc3VicQkkNjQsJXJkaQorCitMJDEyOF9lbmNfbXNnX3g0X2xvb3AxOgorCWFkZHEJJDY0LCVyc2kKKwlhZGRxCSQ2NCwlcmRpCisKKwl2bW92ZHFhCSV4bW0wLCV4bW01CisJdm1vdmRxYQkleG1tMSwleG1tNgorCXZtb3ZkcWEJJXhtbTIsJXhtbTcKKwl2bW92ZHFhCSV4bW0zLCV4bW04CisKKwl2cHhvcgkoJXJjeCksJXhtbTUsJXhtbTUKKwl2cHhvcgkoJXJjeCksJXhtbTYsJXhtbTYKKwl2cHhvcgkoJXJjeCksJXhtbTcsJXhtbTcKKwl2cHhvcgkoJXJjeCksJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTYoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMCwleG1tMAorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMSwleG1tMQorCXZtb3ZkcXUJNDgoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMiwleG1tMgorCXZtb3ZkcXUJNjQoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMywleG1tMworCisJdm1vdmRxdQk4MCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQk5NiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxMTIoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTI4KCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE0NCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNjAoJXJjeCksJXhtbTEyCisJdmFlc2VuY2xhc3QJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuY2xhc3QJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuY2xhc3QJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuY2xhc3QJJXhtbTEyLCV4bW04LCV4bW04CisKKworCisJdnB4b3IJMCglcmRpKSwleG1tNSwleG1tNQorCXZweG9yCTE2KCVyZGkpLCV4bW02LCV4bW02CisJdnB4b3IJMzIoJXJkaSksJXhtbTcsJXhtbTcKKwl2cHhvcgk0OCglcmRpKSwleG1tOCwleG1tOAorCisJc3VicQkkMSwlcjgKKworCXZtb3ZkcXUJJXhtbTUsMCglcnNpKQorCXZtb3ZkcXUJJXhtbTYsMTYoJXJzaSkKKwl2bW92ZHF1CSV4bW03LDMyKCVyc2kpCisJdm1vdmRxdQkleG1tOCw0OCglcnNpKQorCisJam5lCUwkMTI4X2VuY19tc2dfeDRfbG9vcDEKKworCWFkZHEJJDY0LCVyc2kKKwlhZGRxCSQ2NCwlcmRpCisKK0wkMTI4X2VuY19tc2dfeDRfY2hlY2tfcmVtYWluZGVyOgorCWNtcHEJJDAsJXIxMAorCWplCUwkMTI4X2VuY19tc2dfeDRfb3V0CisKK0wkMTI4X2VuY19tc2dfeDRfbG9vcDI6CisKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTUKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0wLCV4bW0wCisKKwl2cHhvcgkoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTE2KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkzMiglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJNDgoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTY0KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwk4MCglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJOTYoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTExMiglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMTI4KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxNDQoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jbGFzdAkxNjAoJXJjeCksJXhtbTUsJXhtbTUKKworCisJdnB4b3IJKCVyZGkpLCV4bW01LCV4bW01CisJdm1vdmRxdQkleG1tNSwoJXJzaSkKKworCWFkZHEJJDE2LCVyZGkKKwlhZGRxCSQxNiwlcnNpCisKKwlzdWJxCSQxLCVyMTAKKwlqbmUJTCQxMjhfZW5jX21zZ194NF9sb29wMgorCitMJDEyOF9lbmNfbXNnX3g0X291dDoKKwlwb3BxCSVyMTMKKworCXBvcHEJJXIxMgorCisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9hZXMxMjhnY21zaXZfZW5jX21zZ194OAorLnByaXZhdGVfZXh0ZXJuIF9hZXMxMjhnY21zaXZfZW5jX21zZ194OAorCisucDJhbGlnbgk0CitfYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDg6CisKKwl0ZXN0cQklcjgsJXI4CisJam56CUwkMTI4X2VuY19tc2dfeDhfc3RhcnQKKwkuYnl0ZQkweGYzLDB4YzMKKworTCQxMjhfZW5jX21zZ194OF9zdGFydDoKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcmJwCisKKwltb3ZxCSVyc3AsJXJicAorCisKKworCXN1YnEJJDEyOCwlcnNwCisJYW5kcQkkLTY0LCVyc3AKKworCXNocnEJJDQsJXI4CisJbW92cQklcjgsJXIxMAorCXNobHEJJDYxLCVyMTAKKwlzaHJxCSQ2MSwlcjEwCisKKworCXZtb3ZkcXUJKCVyZHgpLCV4bW0xCisJdnBvcglPUl9NQVNLKCVyaXApLCV4bW0xLCV4bW0xCisKKworCXZwYWRkZAlzZXZlbiglcmlwKSwleG1tMSwleG1tMAorCXZtb3ZkcXUJJXhtbTAsKCVyc3ApCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMSwleG1tOQorCXZwYWRkZAl0d28oJXJpcCksJXhtbTEsJXhtbTEwCisJdnBhZGRkCXRocmVlKCVyaXApLCV4bW0xLCV4bW0xMQorCXZwYWRkZAlmb3VyKCVyaXApLCV4bW0xLCV4bW0xMgorCXZwYWRkZAlmaXZlKCVyaXApLCV4bW0xLCV4bW0xMworCXZwYWRkZAlzaXgoJXJpcCksJXhtbTEsJXhtbTE0CisJdm1vdmRxYQkleG1tMSwleG1tMAorCisJc2hycQkkMywlcjgKKwlqZQlMJDEyOF9lbmNfbXNnX3g4X2NoZWNrX3JlbWFpbmRlcgorCisJc3VicQkkMTI4LCVyc2kKKwlzdWJxCSQxMjgsJXJkaQorCitMJDEyOF9lbmNfbXNnX3g4X2xvb3AxOgorCWFkZHEJJDEyOCwlcnNpCisJYWRkcQkkMTI4LCVyZGkKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKwl2bW92ZHFhCSV4bW05LCV4bW0yCisJdm1vdmRxYQkleG1tMTAsJXhtbTMKKwl2bW92ZHFhCSV4bW0xMSwleG1tNAorCXZtb3ZkcWEJJXhtbTEyLCV4bW01CisJdm1vdmRxYQkleG1tMTMsJXhtbTYKKwl2bW92ZHFhCSV4bW0xNCwleG1tNworCisJdm1vdmRxdQkoJXJzcCksJXhtbTgKKworCXZweG9yCSglcmN4KSwleG1tMSwleG1tMQorCXZweG9yCSglcmN4KSwleG1tMiwleG1tMgorCXZweG9yCSglcmN4KSwleG1tMywleG1tMworCXZweG9yCSglcmN4KSwleG1tNCwleG1tNAorCXZweG9yCSglcmN4KSwleG1tNSwleG1tNQorCXZweG9yCSglcmN4KSwleG1tNiwleG1tNgorCXZweG9yCSglcmN4KSwleG1tNywleG1tNworCXZweG9yCSglcmN4KSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNiglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHF1CSglcnNwKSwleG1tMTQKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTE0LCV4bW0xNAorCXZtb3ZkcXUJJXhtbTE0LCglcnNwKQorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBzdWJkCW9uZSglcmlwKSwleG1tMTQsJXhtbTE0CisJdm1vdmRxdQk0OCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTAsJXhtbTAKKwl2bW92ZHF1CTY0KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tOSwleG1tOQorCXZtb3ZkcXUJODAoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW0xMCwleG1tMTAKKwl2bW92ZHF1CTk2KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tMTEsJXhtbTExCisJdm1vdmRxdQkxMTIoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW0xMiwleG1tMTIKKwl2bW92ZHF1CTEyOCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTEzLCV4bW0xMworCXZtb3ZkcXUJMTQ0KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTYwKCVyY3gpLCV4bW0xNQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tOCwleG1tOAorCisKKworCXZweG9yCTAoJXJkaSksJXhtbTEsJXhtbTEKKwl2cHhvcgkxNiglcmRpKSwleG1tMiwleG1tMgorCXZweG9yCTMyKCVyZGkpLCV4bW0zLCV4bW0zCisJdnB4b3IJNDgoJXJkaSksJXhtbTQsJXhtbTQKKwl2cHhvcgk2NCglcmRpKSwleG1tNSwleG1tNQorCXZweG9yCTgwKCVyZGkpLCV4bW02LCV4bW02CisJdnB4b3IJOTYoJXJkaSksJXhtbTcsJXhtbTcKKwl2cHhvcgkxMTIoJXJkaSksJXhtbTgsJXhtbTgKKworCWRlY3EJJXI4CisKKwl2bW92ZHF1CSV4bW0xLDAoJXJzaSkKKwl2bW92ZHF1CSV4bW0yLDE2KCVyc2kpCisJdm1vdmRxdQkleG1tMywzMiglcnNpKQorCXZtb3ZkcXUJJXhtbTQsNDgoJXJzaSkKKwl2bW92ZHF1CSV4bW01LDY0KCVyc2kpCisJdm1vdmRxdQkleG1tNiw4MCglcnNpKQorCXZtb3ZkcXUJJXhtbTcsOTYoJXJzaSkKKwl2bW92ZHF1CSV4bW04LDExMiglcnNpKQorCisJam5lCUwkMTI4X2VuY19tc2dfeDhfbG9vcDEKKworCWFkZHEJJDEyOCwlcnNpCisJYWRkcQkkMTI4LCVyZGkKKworTCQxMjhfZW5jX21zZ194OF9jaGVja19yZW1haW5kZXI6CisJY21wcQkkMCwlcjEwCisJamUJTCQxMjhfZW5jX21zZ194OF9vdXQKKworTCQxMjhfZW5jX21zZ194OF9sb29wMjoKKworCisJdm1vdmRxYQkleG1tMCwleG1tMQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTAsJXhtbTAKKworCXZweG9yCSglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTYoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTMyKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk0OCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJNjQoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTgwKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk5NiglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTEyKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxMjgoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE0NCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmNsYXN0CTE2MCglcmN4KSwleG1tMSwleG1tMQorCisKKwl2cHhvcgkoJXJkaSksJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJJXhtbTEsKCVyc2kpCisKKwlhZGRxCSQxNiwlcmRpCisJYWRkcQkkMTYsJXJzaQorCisJZGVjcQklcjEwCisJam5lCUwkMTI4X2VuY19tc2dfeDhfbG9vcDIKKworTCQxMjhfZW5jX21zZ194OF9vdXQ6CisJbW92cQklcmJwLCVyc3AKKworCXBvcHEJJXJicAorCisJcG9wcQklcjEzCisKKwlwb3BxCSVyMTIKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzMTI4Z2Ntc2l2X2RlYworLnByaXZhdGVfZXh0ZXJuIF9hZXMxMjhnY21zaXZfZGVjCisKKy5wMmFsaWduCTQKK19hZXMxMjhnY21zaXZfZGVjOgorCisJdGVzdHEJJH4xNSwlcjkKKwlqbnoJTCQxMjhfZGVjX3N0YXJ0CisJLmJ5dGUJMHhmMywweGMzCisKK0wkMTI4X2RlY19zdGFydDoKKwl2emVyb3VwcGVyCisJdm1vdmRxYQkoJXJkeCksJXhtbTAKKwltb3ZxCSVyZHgsJXJheAorCisJbGVhcQkzMiglcmF4KSwlcmF4CisJbGVhcQkzMiglcmN4KSwlcmN4CisKKworCXZtb3ZkcXUJKCVyZGksJXI5LDEpLCV4bW0xNQorCXZwb3IJT1JfTUFTSyglcmlwKSwleG1tMTUsJXhtbTE1CisJYW5kcQkkfjE1LCVyOQorCisKKwljbXBxCSQ5NiwlcjkKKwlqYglMJDEyOF9kZWNfbG9vcDIKKworCisJc3VicQkkOTYsJXI5CisJdm1vdmRxYQkleG1tMTUsJXhtbTcKKwl2cGFkZGQJb25lKCVyaXApLCV4bW03LCV4bW04CisJdnBhZGRkCXR3byglcmlwKSwleG1tNywleG1tOQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTksJXhtbTEwCisJdnBhZGRkCXR3byglcmlwKSwleG1tOSwleG1tMTEKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0xMSwleG1tMTIKKwl2cGFkZGQJdHdvKCVyaXApLCV4bW0xMSwleG1tMTUKKworCXZweG9yCSglcjgpLCV4bW03LCV4bW03CisJdnB4b3IJKCVyOCksJXhtbTgsJXhtbTgKKwl2cHhvcgkoJXI4KSwleG1tOSwleG1tOQorCXZweG9yCSglcjgpLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkoJXI4KSwleG1tMTEsJXhtbTExCisJdnB4b3IJKCVyOCksJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTMyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJNDgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQk2NCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTgwKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJOTYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxMTIoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxMjgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNDQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNjAoJXI4KSwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisKKwl2cHhvcgkwKCVyZGkpLCV4bW03LCV4bW03CisJdnB4b3IJMTYoJXJkaSksJXhtbTgsJXhtbTgKKwl2cHhvcgkzMiglcmRpKSwleG1tOSwleG1tOQorCXZweG9yCTQ4KCVyZGkpLCV4bW0xMCwleG1tMTAKKwl2cHhvcgk2NCglcmRpKSwleG1tMTEsJXhtbTExCisJdnB4b3IJODAoJXJkaSksJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkleG1tNywwKCVyc2kpCisJdm1vdmRxdQkleG1tOCwxNiglcnNpKQorCXZtb3ZkcXUJJXhtbTksMzIoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMCw0OCglcnNpKQorCXZtb3ZkcXUJJXhtbTExLDY0KCVyc2kpCisJdm1vdmRxdQkleG1tMTIsODAoJXJzaSkKKworCWFkZHEJJDk2LCVyZGkKKwlhZGRxCSQ5NiwlcnNpCisJam1wCUwkMTI4X2RlY19sb29wMQorCisKKy5wMmFsaWduCTYKK0wkMTI4X2RlY19sb29wMToKKwljbXBxCSQ5NiwlcjkKKwlqYglMJDEyOF9kZWNfZmluaXNoXzk2CisJc3VicQkkOTYsJXI5CisKKwl2bW92ZHFhCSV4bW0xMiwleG1tNgorCXZtb3ZkcWEJJXhtbTExLDE2LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tMTAsMzItMzIoJXJheCkKKwl2bW92ZHFhCSV4bW05LDQ4LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tOCw2NC0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTcsODAtMzIoJXJheCkKKworCXZtb3ZkcWEJJXhtbTE1LCV4bW03CisJdnBhZGRkCW9uZSglcmlwKSwleG1tNywleG1tOAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTcsJXhtbTkKKwl2cGFkZGQJb25lKCVyaXApLCV4bW05LCV4bW0xMAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTksJXhtbTExCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMTEsJXhtbTEyCisJdnBhZGRkCXR3byglcmlwKSwleG1tMTEsJXhtbTE1CisKKwl2bW92ZHFhCSglcjgpLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTcsJXhtbTcKKwl2cHhvcgkleG1tNCwleG1tOCwleG1tOAorCXZweG9yCSV4bW00LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2cHhvcgkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTAtMzIoJXJjeCksJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW00LCV4bW02LCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNCwleG1tNiwleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTQsJXhtbTYsJXhtbTEKKwl2cGNsbXVscWRxCSQweDEwLCV4bW00LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJMTYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQktMTYoJXJheCksJXhtbTYKKwl2bW92ZHF1CS0xNiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCisJdm1vdmRxdQkzMiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTAoJXJheCksJXhtbTYKKwl2bW92ZHF1CTAoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJNDgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNiglcmF4KSwleG1tNgorCXZtb3ZkcXUJMTYoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJNjQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkzMiglcmF4KSwleG1tNgorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJODAoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQk5NiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTExMiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKworCXZtb3ZkcWEJODAtMzIoJXJheCksJXhtbTYKKwl2cHhvcgkleG1tMCwleG1tNiwleG1tNgorCXZtb3ZkcXUJODAtMzIoJXJjeCksJXhtbTUKKworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkxMjgoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisKKwl2cHNybGRxCSQ4LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTUKKwl2cHNsbGRxCSQ4LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTAKKworCXZtb3ZkcWEJcG9seSglcmlwKSwleG1tMworCisJdm1vdmRxdQkxNDQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxNjAoJXI4KSwleG1tNgorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0wLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tMCwleG1tMAorCXZweG9yCSV4bW0wLCV4bW0yLCV4bW0wCisKKwl2cHhvcgkwKCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTcsJXhtbTcKKwl2cHhvcgkxNiglcmRpKSwleG1tNiwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW04LCV4bW04CisJdnB4b3IJMzIoJXJkaSksJXhtbTYsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tOSwleG1tOQorCXZweG9yCTQ4KCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZweG9yCTY0KCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZweG9yCTgwKCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTAsJXhtbTIKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTAsJXhtbTIsJXhtbTAKKworCXZtb3ZkcXUJJXhtbTcsMCglcnNpKQorCXZtb3ZkcXUJJXhtbTgsMTYoJXJzaSkKKwl2bW92ZHF1CSV4bW05LDMyKCVyc2kpCisJdm1vdmRxdQkleG1tMTAsNDgoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMSw2NCglcnNpKQorCXZtb3ZkcXUJJXhtbTEyLDgwKCVyc2kpCisKKwl2cHhvcgkleG1tNSwleG1tMCwleG1tMAorCisJbGVhcQk5NiglcmRpKSwlcmRpCisJbGVhcQk5NiglcnNpKSwlcnNpCisJam1wCUwkMTI4X2RlY19sb29wMQorCitMJDEyOF9kZWNfZmluaXNoXzk2OgorCXZtb3ZkcWEJJXhtbTEyLCV4bW02CisJdm1vdmRxYQkleG1tMTEsMTYtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW0xMCwzMi0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTksNDgtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW04LDY0LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tNyw4MC0zMiglcmF4KQorCisJdm1vdmRxdQkwLTMyKCVyY3gpLCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNCwleG1tNiwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTQsJXhtbTYsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW00LCV4bW02LCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tNCwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CS0xNiglcmF4KSwleG1tNgorCXZtb3ZkcXUJLTE2KCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkwKCVyYXgpLCV4bW02CisJdm1vdmRxdQkwKCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkxNiglcmF4KSwleG1tNgorCXZtb3ZkcXUJMTYoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTMyKCVyYXgpLCV4bW02CisJdm1vdmRxdQkzMiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCisJdm1vdmRxdQk4MC0zMiglcmF4KSwleG1tNgorCXZweG9yCSV4bW0wLCV4bW02LCV4bW02CisJdm1vdmRxdQk4MC0zMiglcmN4KSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTUsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdnBzcmxkcQkkOCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW01CisJdnBzbGxkcQkkOCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0wCisKKwl2bW92ZHFhCXBvbHkoJXJpcCksJXhtbTMKKworCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0wLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tMCwleG1tMAorCXZweG9yCSV4bW0wLCV4bW0yLCV4bW0wCisKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMCwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tMCwleG1tMiwleG1tMAorCisJdnB4b3IJJXhtbTUsJXhtbTAsJXhtbTAKKworTCQxMjhfZGVjX2xvb3AyOgorCisKKworCWNtcHEJJDE2LCVyOQorCWpiCUwkMTI4X2RlY19vdXQKKwlzdWJxCSQxNiwlcjkKKworCXZtb3ZkcWEJJXhtbTE1LCV4bW0yCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMTUsJXhtbTE1CisKKwl2cHhvcgkwKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTE2KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTMyKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTQ4KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTY0KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTgwKCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTk2KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTExMiglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkxMjgoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMTQ0KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jbGFzdAkxNjAoJXI4KSwleG1tMiwleG1tMgorCXZweG9yCSglcmRpKSwleG1tMiwleG1tMgorCXZtb3ZkcXUJJXhtbTIsKCVyc2kpCisJYWRkcQkkMTYsJXJkaQorCWFkZHEJJDE2LCVyc2kKKworCXZweG9yCSV4bW0yLCV4bW0wLCV4bW0wCisJdm1vdmRxYQktMzIoJXJjeCksJXhtbTEKKwljYWxsCUdGTVVMCisKKwlqbXAJTCQxMjhfZGVjX2xvb3AyCisKK0wkMTI4X2RlY19vdXQ6CisJdm1vdmRxdQkleG1tMCwoJXJkeCkKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2FlczEyOGdjbXNpdl9lY2JfZW5jX2Jsb2NrCisucHJpdmF0ZV9leHRlcm4gX2FlczEyOGdjbXNpdl9lY2JfZW5jX2Jsb2NrCisKKy5wMmFsaWduCTQKK19hZXMxMjhnY21zaXZfZWNiX2VuY19ibG9jazoKKworCXZtb3ZkcWEJKCVyZGkpLCV4bW0xCisKKwl2cHhvcgkoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE2KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkzMiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJNDgoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTY0KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk4MCglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJOTYoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTExMiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTI4KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNDQoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jbGFzdAkxNjAoJXJkeCksJXhtbTEsJXhtbTEKKworCXZtb3ZkcWEJJXhtbTEsKCVyc2kpCisKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2FlczI1NmdjbXNpdl9hZXNfa3NfZW5jX3gxCisucHJpdmF0ZV9leHRlcm4gX2FlczI1NmdjbXNpdl9hZXNfa3NfZW5jX3gxCisKKy5wMmFsaWduCTQKK19hZXMyNTZnY21zaXZfYWVzX2tzX2VuY194MToKKworCXZtb3ZkcWEJY29uMSglcmlwKSwleG1tMAorCXZtb3ZkcWEJbWFzayglcmlwKSwleG1tMTUKKwl2bW92ZHFhCSglcmRpKSwleG1tOAorCXZtb3ZkcWEJKCVyY3gpLCV4bW0xCisJdm1vdmRxYQkxNiglcmN4KSwleG1tMworCXZweG9yCSV4bW0xLCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tMywleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTEsKCVyZHgpCisJdm1vdmRxdQkleG1tMywxNiglcmR4KQorCXZweG9yCSV4bW0xNCwleG1tMTQsJXhtbTE0CisKKwl2cHNodWZiCSV4bW0xNSwleG1tMywleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxkcQkkNCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMSwzMiglcmR4KQorCisJdnBzaHVmZAkkMHhmZiwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNCwleG1tMiwleG1tMgorCXZwc2xsZHEJJDQsJXhtbTMsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZweG9yCSV4bW0yLCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMywleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTMsNDgoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0zLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbGRxCSQ0LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0xLDY0KCVyZHgpCisKKwl2cHNodWZkCSQweGZmLCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTE0LCV4bW0yLCV4bW0yCisJdnBzbGxkcQkkNCwleG1tMywleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTIsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0zLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMyw4MCglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTMsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xsZHEJJDQsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTEsOTYoJXJkeCkKKworCXZwc2h1ZmQJJDB4ZmYsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMTQsJXhtbTIsJXhtbTIKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tMiwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTMsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0zLDExMiglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTMsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZAkkMSwleG1tMCwleG1tMAorCXZwc2xsZHEJJDQsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTEsMTI4KCVyZHgpCisKKwl2cHNodWZkCSQweGZmLCV4bW0xLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTE0LCV4bW0yLCV4bW0yCisJdnBzbGxkcQkkNCwleG1tMywleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTIsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0zLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMywxNDQoJXJkeCkKKworCXZwc2h1ZmIJJXhtbTE1LCV4bW0zLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTAsJXhtbTIsJXhtbTIKKwl2cHNsbGQJJDEsJXhtbTAsJXhtbTAKKwl2cHNsbGRxCSQ0LCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0xLDE2MCglcmR4KQorCisJdnBzaHVmZAkkMHhmZiwleG1tMSwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNCwleG1tMiwleG1tMgorCXZwc2xsZHEJJDQsJXhtbTMsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZweG9yCSV4bW0yLCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMywleG1tOCwleG1tOAorCXZtb3ZkcXUJJXhtbTMsMTc2KCVyZHgpCisKKwl2cHNodWZiCSV4bW0xNSwleG1tMywleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0wLCV4bW0yLCV4bW0yCisJdnBzbGxkCSQxLCV4bW0wLCV4bW0wCisJdnBzbGxkcQkkNCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBzbGxkcQkkNCwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW04LCV4bW04CisJdm1vdmRxdQkleG1tMSwxOTIoJXJkeCkKKworCXZwc2h1ZmQJJDB4ZmYsJXhtbTEsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMTQsJXhtbTIsJXhtbTIKKwl2cHNsbGRxCSQ0LCV4bW0zLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHNsbGRxCSQ0LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tMiwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTMsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0zLDIwOCglcmR4KQorCisJdnBzaHVmYgkleG1tMTUsJXhtbTMsJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMiwleG1tMgorCXZwc2xsZHEJJDQsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2xsZHEJJDQsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZweG9yCSV4bW0yLCV4bW0xLCV4bW0xCisJdmFlc2VuY2xhc3QJJXhtbTEsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW0xLDIyNCglcmR4KQorCisJdm1vdmRxYQkleG1tOCwoJXJzaSkKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2FlczI1NmdjbXNpdl9lY2JfZW5jX2Jsb2NrCisucHJpdmF0ZV9leHRlcm4gX2FlczI1NmdjbXNpdl9lY2JfZW5jX2Jsb2NrCisKKy5wMmFsaWduCTQKK19hZXMyNTZnY21zaXZfZWNiX2VuY19ibG9jazoKKworCXZtb3ZkcWEJKCVyZGkpLCV4bW0xCisJdnB4b3IJKCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMzIoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTQ4KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk2NCglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJODAoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTk2KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxMTIoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTEyOCglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTQ0KCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNjAoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE3NiglcmR4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTkyKCVyZHgpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkyMDgoJXJkeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jbGFzdAkyMjQoJXJkeCksJXhtbTEsJXhtbTEKKwl2bW92ZHFhCSV4bW0xLCglcnNpKQorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDQKKy5wcml2YXRlX2V4dGVybiBfYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDQKKworLnAyYWxpZ24JNAorX2FlczI1NmdjbXNpdl9lbmNfbXNnX3g0OgorCisJdGVzdHEJJXI4LCVyOAorCWpueglMJDI1Nl9lbmNfbXNnX3g0X3N0YXJ0CisJLmJ5dGUJMHhmMywweGMzCisKK0wkMjU2X2VuY19tc2dfeDRfc3RhcnQ6CisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJc2hscQkkNjAsJXIxMAorCWp6CUwkMjU2X2VuY19tc2dfeDRfc3RhcnQyCisJYWRkcQkkMSwlcjgKKworTCQyNTZfZW5jX21zZ194NF9zdGFydDI6CisJbW92cQklcjgsJXIxMAorCXNobHEJJDYyLCVyMTAKKwlzaHJxCSQ2MiwlcjEwCisKKworCXZtb3ZkcWEJKCVyZHgpLCV4bW0xNQorCXZwb3IJT1JfTUFTSyglcmlwKSwleG1tMTUsJXhtbTE1CisKKwl2bW92ZHFhCWZvdXIoJXJpcCksJXhtbTQKKwl2bW92ZHFhCSV4bW0xNSwleG1tMAorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTE1LCV4bW0xCisJdnBhZGRkCXR3byglcmlwKSwleG1tMTUsJXhtbTIKKwl2cGFkZGQJdGhyZWUoJXJpcCksJXhtbTE1LCV4bW0zCisKKwlzaHJxCSQyLCVyOAorCWplCUwkMjU2X2VuY19tc2dfeDRfY2hlY2tfcmVtYWluZGVyCisKKwlzdWJxCSQ2NCwlcnNpCisJc3VicQkkNjQsJXJkaQorCitMJDI1Nl9lbmNfbXNnX3g0X2xvb3AxOgorCWFkZHEJJDY0LCVyc2kKKwlhZGRxCSQ2NCwlcmRpCisKKwl2bW92ZHFhCSV4bW0wLCV4bW01CisJdm1vdmRxYQkleG1tMSwleG1tNgorCXZtb3ZkcWEJJXhtbTIsJXhtbTcKKwl2bW92ZHFhCSV4bW0zLCV4bW04CisKKwl2cHhvcgkoJXJjeCksJXhtbTUsJXhtbTUKKwl2cHhvcgkoJXJjeCksJXhtbTYsJXhtbTYKKwl2cHhvcgkoJXJjeCksJXhtbTcsJXhtbTcKKwl2cHhvcgkoJXJjeCksJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTYoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMCwleG1tMAorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMSwleG1tMQorCXZtb3ZkcXUJNDgoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMiwleG1tMgorCXZtb3ZkcXUJNjQoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZwYWRkZAkleG1tNCwleG1tMywleG1tMworCisJdm1vdmRxdQk4MCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQk5NiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxMTIoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTI4KCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE0NCglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNjAoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTc2KCVyY3gpLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEyLCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEyLCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE5MiglcmN4KSwleG1tMTIKKwl2YWVzZW5jCSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTEyLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xMiwleG1tOCwleG1tOAorCisJdm1vdmRxdQkyMDgoJXJjeCksJXhtbTEyCisJdmFlc2VuYwkleG1tMTIsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEyLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTIsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMjI0KCVyY3gpLCV4bW0xMgorCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tNSwleG1tNQorCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tNiwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tNywleG1tNworCXZhZXNlbmNsYXN0CSV4bW0xMiwleG1tOCwleG1tOAorCisKKworCXZweG9yCTAoJXJkaSksJXhtbTUsJXhtbTUKKwl2cHhvcgkxNiglcmRpKSwleG1tNiwleG1tNgorCXZweG9yCTMyKCVyZGkpLCV4bW03LCV4bW03CisJdnB4b3IJNDgoJXJkaSksJXhtbTgsJXhtbTgKKworCXN1YnEJJDEsJXI4CisKKwl2bW92ZHF1CSV4bW01LDAoJXJzaSkKKwl2bW92ZHF1CSV4bW02LDE2KCVyc2kpCisJdm1vdmRxdQkleG1tNywzMiglcnNpKQorCXZtb3ZkcXUJJXhtbTgsNDgoJXJzaSkKKworCWpuZQlMJDI1Nl9lbmNfbXNnX3g0X2xvb3AxCisKKwlhZGRxCSQ2NCwlcnNpCisJYWRkcQkkNjQsJXJkaQorCitMJDI1Nl9lbmNfbXNnX3g0X2NoZWNrX3JlbWFpbmRlcjoKKwljbXBxCSQwLCVyMTAKKwlqZQlMJDI1Nl9lbmNfbXNnX3g0X291dAorCitMJDI1Nl9lbmNfbXNnX3g0X2xvb3AyOgorCisKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTUKKwl2cGFkZGQJb25lKCVyaXApLCV4bW0wLCV4bW0wCisJdnB4b3IJKCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxNiglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMzIoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTQ4KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwk2NCglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJODAoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTk2KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxMTIoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTEyOCglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMTQ0KCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkxNjAoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jCTE3NiglcmN4KSwleG1tNSwleG1tNQorCXZhZXNlbmMJMTkyKCVyY3gpLCV4bW01LCV4bW01CisJdmFlc2VuYwkyMDgoJXJjeCksJXhtbTUsJXhtbTUKKwl2YWVzZW5jbGFzdAkyMjQoJXJjeCksJXhtbTUsJXhtbTUKKworCisJdnB4b3IJKCVyZGkpLCV4bW01LCV4bW01CisKKwl2bW92ZHF1CSV4bW01LCglcnNpKQorCisJYWRkcQkkMTYsJXJkaQorCWFkZHEJJDE2LCVyc2kKKworCXN1YnEJJDEsJXIxMAorCWpuZQlMJDI1Nl9lbmNfbXNnX3g0X2xvb3AyCisKK0wkMjU2X2VuY19tc2dfeDRfb3V0OgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDgKKy5wcml2YXRlX2V4dGVybiBfYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDgKKworLnAyYWxpZ24JNAorX2FlczI1NmdjbXNpdl9lbmNfbXNnX3g4OgorCisJdGVzdHEJJXI4LCVyOAorCWpueglMJDI1Nl9lbmNfbXNnX3g4X3N0YXJ0CisJLmJ5dGUJMHhmMywweGMzCisKK0wkMjU2X2VuY19tc2dfeDhfc3RhcnQ6CisKKwltb3ZxCSVyc3AsJXIxMQorCXN1YnEJJDE2LCVyMTEKKwlhbmRxCSQtNjQsJXIxMQorCisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJc2hscQkkNjAsJXIxMAorCWp6CUwkMjU2X2VuY19tc2dfeDhfc3RhcnQyCisJYWRkcQkkMSwlcjgKKworTCQyNTZfZW5jX21zZ194OF9zdGFydDI6CisJbW92cQklcjgsJXIxMAorCXNobHEJJDYxLCVyMTAKKwlzaHJxCSQ2MSwlcjEwCisKKworCXZtb3ZkcWEJKCVyZHgpLCV4bW0xCisJdnBvcglPUl9NQVNLKCVyaXApLCV4bW0xLCV4bW0xCisKKworCXZwYWRkZAlzZXZlbiglcmlwKSwleG1tMSwleG1tMAorCXZtb3ZkcWEJJXhtbTAsKCVyMTEpCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMSwleG1tOQorCXZwYWRkZAl0d28oJXJpcCksJXhtbTEsJXhtbTEwCisJdnBhZGRkCXRocmVlKCVyaXApLCV4bW0xLCV4bW0xMQorCXZwYWRkZAlmb3VyKCVyaXApLCV4bW0xLCV4bW0xMgorCXZwYWRkZAlmaXZlKCVyaXApLCV4bW0xLCV4bW0xMworCXZwYWRkZAlzaXgoJXJpcCksJXhtbTEsJXhtbTE0CisJdm1vdmRxYQkleG1tMSwleG1tMAorCisJc2hycQkkMywlcjgKKwlqeglMJDI1Nl9lbmNfbXNnX3g4X2NoZWNrX3JlbWFpbmRlcgorCisJc3VicQkkMTI4LCVyc2kKKwlzdWJxCSQxMjgsJXJkaQorCitMJDI1Nl9lbmNfbXNnX3g4X2xvb3AxOgorCWFkZHEJJDEyOCwlcnNpCisJYWRkcQkkMTI4LCVyZGkKKworCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKwl2bW92ZHFhCSV4bW05LCV4bW0yCisJdm1vdmRxYQkleG1tMTAsJXhtbTMKKwl2bW92ZHFhCSV4bW0xMSwleG1tNAorCXZtb3ZkcWEJJXhtbTEyLCV4bW01CisJdm1vdmRxYQkleG1tMTMsJXhtbTYKKwl2bW92ZHFhCSV4bW0xNCwleG1tNworCisJdm1vdmRxYQkoJXIxMSksJXhtbTgKKworCXZweG9yCSglcmN4KSwleG1tMSwleG1tMQorCXZweG9yCSglcmN4KSwleG1tMiwleG1tMgorCXZweG9yCSglcmN4KSwleG1tMywleG1tMworCXZweG9yCSglcmN4KSwleG1tNCwleG1tNAorCXZweG9yCSglcmN4KSwleG1tNSwleG1tNQorCXZweG9yCSglcmN4KSwleG1tNiwleG1tNgorCXZweG9yCSglcmN4KSwleG1tNywleG1tNworCXZweG9yCSglcmN4KSwleG1tOCwleG1tOAorCisJdm1vdmRxdQkxNiglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHFhCSglcjExKSwleG1tMTQKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTE0LCV4bW0xNAorCXZtb3ZkcWEJJXhtbTE0LCglcjExKQorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBzdWJkCW9uZSglcmlwKSwleG1tMTQsJXhtbTE0CisJdm1vdmRxdQk0OCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTAsJXhtbTAKKwl2bW92ZHF1CTY0KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tOSwleG1tOQorCXZtb3ZkcXUJODAoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW0xMCwleG1tMTAKKwl2bW92ZHF1CTk2KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZwYWRkZAllaWdodCglcmlwKSwleG1tMTEsJXhtbTExCisJdm1vdmRxdQkxMTIoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMTUsJXhtbTEsJXhtbTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0zLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBhZGRkCWVpZ2h0KCVyaXApLCV4bW0xMiwleG1tMTIKKwl2bW92ZHF1CTEyOCglcmN4KSwleG1tMTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0yLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTMsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTE1LCV4bW01LCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2cGFkZGQJZWlnaHQoJXJpcCksJXhtbTEzLCV4bW0xMworCXZtb3ZkcXUJMTQ0KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTYwKCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTc2KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMTkyKCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMjA4KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTIsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTUsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTE1LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMTUsJXhtbTgsJXhtbTgKKworCXZtb3ZkcXUJMjI0KCVyY3gpLCV4bW0xNQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMSwleG1tMQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMiwleG1tMgorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tMywleG1tMworCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNCwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNSwleG1tNQorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNiwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tNywleG1tNworCXZhZXNlbmNsYXN0CSV4bW0xNSwleG1tOCwleG1tOAorCisKKworCXZweG9yCTAoJXJkaSksJXhtbTEsJXhtbTEKKwl2cHhvcgkxNiglcmRpKSwleG1tMiwleG1tMgorCXZweG9yCTMyKCVyZGkpLCV4bW0zLCV4bW0zCisJdnB4b3IJNDgoJXJkaSksJXhtbTQsJXhtbTQKKwl2cHhvcgk2NCglcmRpKSwleG1tNSwleG1tNQorCXZweG9yCTgwKCVyZGkpLCV4bW02LCV4bW02CisJdnB4b3IJOTYoJXJkaSksJXhtbTcsJXhtbTcKKwl2cHhvcgkxMTIoJXJkaSksJXhtbTgsJXhtbTgKKworCXN1YnEJJDEsJXI4CisKKwl2bW92ZHF1CSV4bW0xLDAoJXJzaSkKKwl2bW92ZHF1CSV4bW0yLDE2KCVyc2kpCisJdm1vdmRxdQkleG1tMywzMiglcnNpKQorCXZtb3ZkcXUJJXhtbTQsNDgoJXJzaSkKKwl2bW92ZHF1CSV4bW01LDY0KCVyc2kpCisJdm1vdmRxdQkleG1tNiw4MCglcnNpKQorCXZtb3ZkcXUJJXhtbTcsOTYoJXJzaSkKKwl2bW92ZHF1CSV4bW04LDExMiglcnNpKQorCisJam5lCUwkMjU2X2VuY19tc2dfeDhfbG9vcDEKKworCWFkZHEJJDEyOCwlcnNpCisJYWRkcQkkMTI4LCVyZGkKKworTCQyNTZfZW5jX21zZ194OF9jaGVja19yZW1haW5kZXI6CisJY21wcQkkMCwlcjEwCisJamUJTCQyNTZfZW5jX21zZ194OF9vdXQKKworTCQyNTZfZW5jX21zZ194OF9sb29wMjoKKworCisJdm1vdmRxYQkleG1tMCwleG1tMQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTAsJXhtbTAKKworCXZweG9yCSglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTYoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTMyKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk0OCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJNjQoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTgwKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwk5NiglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTEyKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxMjgoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE0NCglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMTYwKCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuYwkxNzYoJXJjeCksJXhtbTEsJXhtbTEKKwl2YWVzZW5jCTE5MiglcmN4KSwleG1tMSwleG1tMQorCXZhZXNlbmMJMjA4KCVyY3gpLCV4bW0xLCV4bW0xCisJdmFlc2VuY2xhc3QJMjI0KCVyY3gpLCV4bW0xLCV4bW0xCisKKworCXZweG9yCSglcmRpKSwleG1tMSwleG1tMQorCisJdm1vdmRxdQkleG1tMSwoJXJzaSkKKworCWFkZHEJJDE2LCVyZGkKKwlhZGRxCSQxNiwlcnNpCisJc3VicQkkMSwlcjEwCisJam56CUwkMjU2X2VuY19tc2dfeDhfbG9vcDIKKworTCQyNTZfZW5jX21zZ194OF9vdXQ6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisuZ2xvYmwJX2FlczI1NmdjbXNpdl9kZWMKKy5wcml2YXRlX2V4dGVybiBfYWVzMjU2Z2Ntc2l2X2RlYworCisucDJhbGlnbgk0CitfYWVzMjU2Z2Ntc2l2X2RlYzoKKworCXRlc3RxCSR+MTUsJXI5CisJam56CUwkMjU2X2RlY19zdGFydAorCS5ieXRlCTB4ZjMsMHhjMworCitMJDI1Nl9kZWNfc3RhcnQ6CisJdnplcm91cHBlcgorCXZtb3ZkcWEJKCVyZHgpLCV4bW0wCisJbW92cQklcmR4LCVyYXgKKworCWxlYXEJMzIoJXJheCksJXJheAorCWxlYXEJMzIoJXJjeCksJXJjeAorCisKKwl2bW92ZHF1CSglcmRpLCVyOSwxKSwleG1tMTUKKwl2cG9yCU9SX01BU0soJXJpcCksJXhtbTE1LCV4bW0xNQorCWFuZHEJJH4xNSwlcjkKKworCisJY21wcQkkOTYsJXI5CisJamIJTCQyNTZfZGVjX2xvb3AyCisKKworCXN1YnEJJDk2LCVyOQorCXZtb3ZkcWEJJXhtbTE1LCV4bW03CisJdnBhZGRkCW9uZSglcmlwKSwleG1tNywleG1tOAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTcsJXhtbTkKKwl2cGFkZGQJb25lKCVyaXApLCV4bW05LCV4bW0xMAorCXZwYWRkZAl0d28oJXJpcCksJXhtbTksJXhtbTExCisJdnBhZGRkCW9uZSglcmlwKSwleG1tMTEsJXhtbTEyCisJdnBhZGRkCXR3byglcmlwKSwleG1tMTEsJXhtbTE1CisKKwl2cHhvcgkoJXI4KSwleG1tNywleG1tNworCXZweG9yCSglcjgpLCV4bW04LCV4bW04CisJdnB4b3IJKCVyOCksJXhtbTksJXhtbTkKKwl2cHhvcgkoJXI4KSwleG1tMTAsJXhtbTEwCisJdnB4b3IJKCVyOCksJXhtbTExLCV4bW0xMQorCXZweG9yCSglcjgpLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkzMiglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTQ4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJNjQoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQk4MCglcjgpLCV4bW00CisJdmFlc2VuYwkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTQsJXhtbTgsJXhtbTgKKwl2YWVzZW5jCSV4bW00LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tNCwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tNCwleG1tMTIsJXhtbTEyCisKKwl2bW92ZHF1CTk2KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTEyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTI4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTQ0KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTYwKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTc2KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTkyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMjA4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMjI0KCVyOCksJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tNywleG1tNworCXZhZXNlbmNsYXN0CSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tMTAsJXhtbTEwCisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW0xMiwleG1tMTIKKworCisJdnB4b3IJMCglcmRpKSwleG1tNywleG1tNworCXZweG9yCTE2KCVyZGkpLCV4bW04LCV4bW04CisJdnB4b3IJMzIoJXJkaSksJXhtbTksJXhtbTkKKwl2cHhvcgk0OCglcmRpKSwleG1tMTAsJXhtbTEwCisJdnB4b3IJNjQoJXJkaSksJXhtbTExLCV4bW0xMQorCXZweG9yCTgwKCVyZGkpLCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJJXhtbTcsMCglcnNpKQorCXZtb3ZkcXUJJXhtbTgsMTYoJXJzaSkKKwl2bW92ZHF1CSV4bW05LDMyKCVyc2kpCisJdm1vdmRxdQkleG1tMTAsNDgoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMSw2NCglcnNpKQorCXZtb3ZkcXUJJXhtbTEyLDgwKCVyc2kpCisKKwlhZGRxCSQ5NiwlcmRpCisJYWRkcQkkOTYsJXJzaQorCWptcAlMJDI1Nl9kZWNfbG9vcDEKKworCisucDJhbGlnbgk2CitMJDI1Nl9kZWNfbG9vcDE6CisJY21wcQkkOTYsJXI5CisJamIJTCQyNTZfZGVjX2ZpbmlzaF85NgorCXN1YnEJJDk2LCVyOQorCisJdm1vdmRxYQkleG1tMTIsJXhtbTYKKwl2bW92ZHFhCSV4bW0xMSwxNi0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTEwLDMyLTMyKCVyYXgpCisJdm1vdmRxYQkleG1tOSw0OC0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTgsNjQtMzIoJXJheCkKKwl2bW92ZHFhCSV4bW03LDgwLTMyKCVyYXgpCisKKwl2bW92ZHFhCSV4bW0xNSwleG1tNworCXZwYWRkZAlvbmUoJXJpcCksJXhtbTcsJXhtbTgKKwl2cGFkZGQJdHdvKCVyaXApLCV4bW03LCV4bW05CisJdnBhZGRkCW9uZSglcmlwKSwleG1tOSwleG1tMTAKKwl2cGFkZGQJdHdvKCVyaXApLCV4bW05LCV4bW0xMQorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTExLCV4bW0xMgorCXZwYWRkZAl0d28oJXJpcCksJXhtbTExLCV4bW0xNQorCisJdm1vdmRxYQkoJXI4KSwleG1tNAorCXZweG9yCSV4bW00LCV4bW03LCV4bW03CisJdnB4b3IJJXhtbTQsJXhtbTgsJXhtbTgKKwl2cHhvcgkleG1tNCwleG1tOSwleG1tOQorCXZweG9yCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tNCwleG1tMTEsJXhtbTExCisJdnB4b3IJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkwLTMyKCVyY3gpLCV4bW00CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNCwleG1tNiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTQsJXhtbTYsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW00LCV4bW02LCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMCwleG1tNCwleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKwl2bW92ZHF1CTE2KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJLTE2KCVyYXgpLCV4bW02CisJdm1vdmRxdQktMTYoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJMzIoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkwKCVyYXgpLCV4bW02CisJdm1vdmRxdQkwKCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisKKwl2bW92ZHF1CTQ4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTYoJXJheCksJXhtbTYKKwl2bW92ZHF1CTE2KCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisKKwl2bW92ZHF1CTY0KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMzIoJXJheCksJXhtbTYKKwl2bW92ZHF1CTMyKCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisKKwl2bW92ZHF1CTgwKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJOTYoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisJdm1vdmRxdQkxMTIoJXI4KSwleG1tNAorCXZhZXNlbmMJJXhtbTQsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTQsJXhtbTEyLCV4bW0xMgorCisKKwl2bW92ZHFhCTgwLTMyKCVyYXgpLCV4bW02CisJdnB4b3IJJXhtbTAsJXhtbTYsJXhtbTYKKwl2bW92ZHF1CTgwLTMyKCVyY3gpLCV4bW01CisKKwl2cGNsbXVscWRxCSQweDAxLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDEwLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJMTI4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCisJdnBzcmxkcQkkOCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW01CisJdnBzbGxkcQkkOCwleG1tMSwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0wCisKKwl2bW92ZHFhCXBvbHkoJXJpcCksJXhtbTMKKworCXZtb3ZkcXUJMTQ0KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTYwKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTc2KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMTkyKCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMjA4KCVyOCksJXhtbTQKKwl2YWVzZW5jCSV4bW00LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tNCwleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTQsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW00LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW00LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZtb3ZkcXUJMjI0KCVyOCksJXhtbTYKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMCwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tMCwleG1tMiwleG1tMAorCisJdnB4b3IJMCglcmRpKSwleG1tNiwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW03LCV4bW03CisJdnB4b3IJMTYoJXJkaSksJXhtbTYsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tOCwleG1tOAorCXZweG9yCTMyKCVyZGkpLCV4bW02LCV4bW00CisJdmFlc2VuY2xhc3QJJXhtbTQsJXhtbTksJXhtbTkKKwl2cHhvcgk0OCglcmRpKSwleG1tNiwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW0xMCwleG1tMTAKKwl2cHhvcgk2NCglcmRpKSwleG1tNiwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW0xMSwleG1tMTEKKwl2cHhvcgk4MCglcmRpKSwleG1tNiwleG1tNAorCXZhZXNlbmNsYXN0CSV4bW00LCV4bW0xMiwleG1tMTIKKworCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0wLCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tMCwleG1tMAorCXZweG9yCSV4bW0wLCV4bW0yLCV4bW0wCisKKwl2bW92ZHF1CSV4bW03LDAoJXJzaSkKKwl2bW92ZHF1CSV4bW04LDE2KCVyc2kpCisJdm1vdmRxdQkleG1tOSwzMiglcnNpKQorCXZtb3ZkcXUJJXhtbTEwLDQ4KCVyc2kpCisJdm1vdmRxdQkleG1tMTEsNjQoJXJzaSkKKwl2bW92ZHF1CSV4bW0xMiw4MCglcnNpKQorCisJdnB4b3IJJXhtbTUsJXhtbTAsJXhtbTAKKworCWxlYXEJOTYoJXJkaSksJXJkaQorCWxlYXEJOTYoJXJzaSksJXJzaQorCWptcAlMJDI1Nl9kZWNfbG9vcDEKKworTCQyNTZfZGVjX2ZpbmlzaF85NjoKKwl2bW92ZHFhCSV4bW0xMiwleG1tNgorCXZtb3ZkcWEJJXhtbTExLDE2LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tMTAsMzItMzIoJXJheCkKKwl2bW92ZHFhCSV4bW05LDQ4LTMyKCVyYXgpCisJdm1vdmRxYQkleG1tOCw2NC0zMiglcmF4KQorCXZtb3ZkcWEJJXhtbTcsODAtMzIoJXJheCkKKworCXZtb3ZkcXUJMC0zMiglcmN4KSwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTQsJXhtbTYsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW00LCV4bW02LCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNCwleG1tNiwleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTQsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQktMTYoJXJheCksJXhtbTYKKwl2bW92ZHF1CS0xNiglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJMCglcmF4KSwleG1tNgorCXZtb3ZkcXUJMCglcmN4KSwleG1tMTMKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0yLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZtb3ZkcXUJMTYoJXJheCksJXhtbTYKKwl2bW92ZHF1CTE2KCVyY3gpLCV4bW0xMworCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdm1vdmRxdQkzMiglcmF4KSwleG1tNgorCXZtb3ZkcXUJMzIoJXJjeCksJXhtbTEzCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMTMsJXhtbTYsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTEzLCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0xMywleG1tNiwleG1tNAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisKKworCXZtb3ZkcXUJODAtMzIoJXJheCksJXhtbTYKKwl2cHhvcgkleG1tMCwleG1tNiwleG1tNgorCXZtb3ZkcXUJODAtMzIoJXJjeCksJXhtbTUKKwl2cGNsbXVscWRxCSQweDExLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDEwLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKwl2cGNsbXVscWRxCSQweDAxLCV4bW01LCV4bW02LCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZwc3JsZHEJJDgsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMiwleG1tNQorCXZwc2xsZHEJJDgsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMAorCisJdm1vdmRxYQlwb2x5KCVyaXApLCV4bW0zCisKKwl2cGFsaWducgkkOCwleG1tMCwleG1tMCwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tMCwleG1tMiwleG1tMAorCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTAsJXhtbTIKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTAsJXhtbTIsJXhtbTAKKworCXZweG9yCSV4bW01LCV4bW0wLCV4bW0wCisKK0wkMjU2X2RlY19sb29wMjoKKworCisKKwljbXBxCSQxNiwlcjkKKwlqYglMJDI1Nl9kZWNfb3V0CisJc3VicQkkMTYsJXI5CisKKwl2bW92ZHFhCSV4bW0xNSwleG1tMgorCXZwYWRkZAlvbmUoJXJpcCksJXhtbTE1LCV4bW0xNQorCisJdnB4b3IJMCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkxNiglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkzMiglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwk0OCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwk2NCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwk4MCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwk5NiglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkxMTIoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMTI4KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTE0NCglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkxNjAoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmMJMTc2KCVyOCksJXhtbTIsJXhtbTIKKwl2YWVzZW5jCTE5MiglcjgpLCV4bW0yLCV4bW0yCisJdmFlc2VuYwkyMDgoJXI4KSwleG1tMiwleG1tMgorCXZhZXNlbmNsYXN0CTIyNCglcjgpLCV4bW0yLCV4bW0yCisJdnB4b3IJKCVyZGkpLCV4bW0yLCV4bW0yCisJdm1vdmRxdQkleG1tMiwoJXJzaSkKKwlhZGRxCSQxNiwlcmRpCisJYWRkcQkkMTYsJXJzaQorCisJdnB4b3IJJXhtbTIsJXhtbTAsJXhtbTAKKwl2bW92ZHFhCS0zMiglcmN4KSwleG1tMQorCWNhbGwJR0ZNVUwKKworCWptcAlMJDI1Nl9kZWNfbG9vcDIKKworTCQyNTZfZGVjX291dDoKKwl2bW92ZHF1CSV4bW0wLCglcmR4KQorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzMjU2Z2Ntc2l2X2tkZgorLnByaXZhdGVfZXh0ZXJuIF9hZXMyNTZnY21zaXZfa2RmCisKKy5wMmFsaWduCTQKK19hZXMyNTZnY21zaXZfa2RmOgorCisKKworCisKKwl2bW92ZHFhCSglcmR4KSwleG1tMQorCXZtb3ZkcWEJMCglcmRpKSwleG1tNAorCXZtb3ZkcWEJYW5kX21hc2soJXJpcCksJXhtbTExCisJdm1vdmRxYQlvbmUoJXJpcCksJXhtbTgKKwl2cHNodWZkCSQweDkwLCV4bW00LCV4bW00CisJdnBhbmQJJXhtbTExLCV4bW00LCV4bW00CisJdnBhZGRkCSV4bW04LCV4bW00LCV4bW02CisJdnBhZGRkCSV4bW04LCV4bW02LCV4bW03CisJdnBhZGRkCSV4bW04LCV4bW03LCV4bW0xMQorCXZwYWRkZAkleG1tOCwleG1tMTEsJXhtbTEyCisJdnBhZGRkCSV4bW04LCV4bW0xMiwleG1tMTMKKworCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTEsJXhtbTYsJXhtbTYKKwl2cHhvcgkleG1tMSwleG1tNywleG1tNworCXZweG9yCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2cHhvcgkleG1tMSwleG1tMTIsJXhtbTEyCisJdnB4b3IJJXhtbTEsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkxNiglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkzMiglcmR4KSwleG1tMgorCXZhZXNlbmMJJXhtbTIsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0yLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTIsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQk0OCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQk2NCglcmR4KSwleG1tMgorCXZhZXNlbmMJJXhtbTIsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0yLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTIsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQk4MCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQk5NiglcmR4KSwleG1tMgorCXZhZXNlbmMJJXhtbTIsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0yLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTIsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkxMTIoJXJkeCksJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMywleG1tMTMKKworCXZtb3ZkcWEJMTI4KCVyZHgpLCV4bW0yCisJdmFlc2VuYwkleG1tMiwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTIsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0yLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMiwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMiwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMiwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTE0NCglcmR4KSwleG1tMQorCXZhZXNlbmMJJXhtbTEsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0xLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMSwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTEsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTEsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkxNjAoJXJkeCksJXhtbTIKKwl2YWVzZW5jCSV4bW0yLCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMiwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTIsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMywleG1tMTMKKworCXZtb3ZkcWEJMTc2KCVyZHgpLCV4bW0xCisJdmFlc2VuYwkleG1tMSwleG1tNCwleG1tNAorCXZhZXNlbmMJJXhtbTEsJXhtbTYsJXhtbTYKKwl2YWVzZW5jCSV4bW0xLCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMSwleG1tMTMsJXhtbTEzCisKKwl2bW92ZHFhCTE5MiglcmR4KSwleG1tMgorCXZhZXNlbmMJJXhtbTIsJXhtbTQsJXhtbTQKKwl2YWVzZW5jCSV4bW0yLCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMiwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTIsJXhtbTEzLCV4bW0xMworCisJdm1vdmRxYQkyMDgoJXJkeCksJXhtbTEKKwl2YWVzZW5jCSV4bW0xLCV4bW00LCV4bW00CisJdmFlc2VuYwkleG1tMSwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEsJXhtbTcsJXhtbTcKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMywleG1tMTMKKworCXZtb3ZkcWEJMjI0KCVyZHgpLCV4bW0yCisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTQsJXhtbTQKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tNiwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW03LCV4bW03CisJdmFlc2VuY2xhc3QJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tMTMsJXhtbTEzCisKKworCXZtb3ZkcWEJJXhtbTQsMCglcnNpKQorCXZtb3ZkcWEJJXhtbTYsMTYoJXJzaSkKKwl2bW92ZHFhCSV4bW03LDMyKCVyc2kpCisJdm1vdmRxYQkleG1tMTEsNDgoJXJzaSkKKwl2bW92ZHFhCSV4bW0xMiw2NCglcnNpKQorCXZtb3ZkcWEJJXhtbTEzLDgwKCVyc2kpCisJLmJ5dGUJMHhmMywweGMzCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2NoYWNoYTIwX3BvbHkxMzA1X3g4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDQ0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuUwpAQCAtMCwwICsxLDg5NzMgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisKKworY2hhY2hhMjBfcG9seTEzMDVfY29uc3RhbnRzOgorCisucDJhbGlnbgk2CisuY2hhY2hhMjBfY29uc3RzOgorLmJ5dGUJJ2UnLCd4JywncCcsJ2EnLCduJywnZCcsJyAnLCczJywnMicsJy0nLCdiJywneScsJ3QnLCdlJywnICcsJ2snCisuYnl0ZQknZScsJ3gnLCdwJywnYScsJ24nLCdkJywnICcsJzMnLCcyJywnLScsJ2InLCd5JywndCcsJ2UnLCcgJywnaycKKy5yb2w4OgorLmJ5dGUJMywwLDEsMiwgNyw0LDUsNiwgMTEsOCw5LDEwLCAxNSwxMiwxMywxNAorLmJ5dGUJMywwLDEsMiwgNyw0LDUsNiwgMTEsOCw5LDEwLCAxNSwxMiwxMywxNAorLnJvbDE2OgorLmJ5dGUJMiwzLDAsMSwgNiw3LDQsNSwgMTAsMTEsOCw5LCAxNCwxNSwxMiwxMworLmJ5dGUJMiwzLDAsMSwgNiw3LDQsNSwgMTAsMTEsOCw5LCAxNCwxNSwxMiwxMworLmF2eDJfaW5pdDoKKy5sb25nCTAsMCwwLDAKKy5zc2VfaW5jOgorLmxvbmcJMSwwLDAsMAorLmF2eDJfaW5jOgorLmxvbmcJMiwwLDAsMCwyLDAsMCwwCisuY2xhbXA6CisucXVhZAkweDBGRkZGRkZDMEZGRkZGRkYsIDB4MEZGRkZGRkMwRkZGRkZGQworLnF1YWQJMHhGRkZGRkZGRkZGRkZGRkZGLCAweEZGRkZGRkZGRkZGRkZGRkYKKy5wMmFsaWduCTQKKy5hbmRfbWFza3M6CisuYnl0ZQkweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwCisuYnl0ZQkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmCisKKworLnAyYWxpZ24JNgorcG9seV9oYXNoX2FkX2ludGVybmFsOgorCisJeG9ycQklcjEwLCVyMTAKKwl4b3JxCSVyMTEsJXIxMQorCXhvcnEJJXIxMiwlcjEyCisJY21wcQkkMTMsJXI4CisJam5lCWhhc2hfYWRfbG9vcAorcG9seV9mYXN0X3Rsc19hZDoKKworCW1vdnEJKCVyY3gpLCVyMTAKKwltb3ZxCTUoJXJjeCksJXIxMQorCXNocnEJJDI0LCVyMTEKKwltb3ZxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJLmJ5dGUJMHhmMywweGMzCitoYXNoX2FkX2xvb3A6CisKKwljbXBxCSQxNiwlcjgKKwlqYgloYXNoX2FkX3RhaWwKKwlhZGRxCTAoJXJjeCksJXIxMAorCWFkY3EJOCswKCVyY3gpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmN4KSwlcmN4CisJc3VicQkkMTYsJXI4CisJam1wCWhhc2hfYWRfbG9vcAoraGFzaF9hZF90YWlsOgorCWNtcHEJJDAsJXI4CisJamUJMWYKKworCXhvcnEJJXIxMywlcjEzCisJeG9ycQklcjE0LCVyMTQKKwl4b3JxCSVyMTUsJXIxNQorCWFkZHEJJXI4LCVyY3gKK2hhc2hfYWRfdGFpbF9sb29wOgorCXNobGRxCSQ4LCVyMTMsJXIxNAorCXNobHEJJDgsJXIxMworCW1vdnpicQktMSglcmN4KSwlcjE1CisJeG9ycQklcjE1LCVyMTMKKwlkZWNxCSVyY3gKKwlkZWNxCSVyOAorCWpuZQloYXNoX2FkX3RhaWxfbG9vcAorCisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworMToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5nbG9ibAlfY2hhY2hhMjBfcG9seTEzMDVfb3BlbgorLnByaXZhdGVfZXh0ZXJuIF9jaGFjaGEyMF9wb2x5MTMwNV9vcGVuCisKKy5wMmFsaWduCTYKK19jaGFjaGEyMF9wb2x5MTMwNV9vcGVuOgorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisKKworCXB1c2hxCSVyOQorCisJc3VicQkkMjg4ICsgMzIsJXJzcAorCisKKworCisKKworCisJbGVhcQkzMiglcnNwKSwlcmJwCisJYW5kcQkkLTMyLCVyYnAKKwltb3ZxCSVyZHgsOCszMiglcmJwKQorCW1vdnEJJXI4LDArMzIoJXJicCkKKwltb3ZxCSVyZHgsJXJieAorCisJbW92bAlfT1BFTlNTTF9pYTMyY2FwX1ArOCglcmlwKSwlZWF4CisJYW5kbAkkMjg4LCVlYXgKKwl4b3JsCSQyODgsJWVheAorCWp6CWNoYWNoYTIwX3BvbHkxMzA1X29wZW5fYXZ4MgorCisxOgorCWNtcHEJJDEyOCwlcmJ4CisJamJlCW9wZW5fc3NlXzEyOAorCisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcXUJMCglcjkpLCV4bW00CisJbW92ZHF1CTE2KCVyOSksJXhtbTgKKwltb3ZkcXUJMzIoJXI5KSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLCV4bW03CisKKwltb3ZkcWEJJXhtbTQsNDgoJXJicCkKKwltb3ZkcWEJJXhtbTgsNjQoJXJicCkKKwltb3ZkcWEJJXhtbTEyLDk2KCVyYnApCisJbW92cQkkMTAsJXIxMAorMToKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKworCWRlY3EJJXIxMAorCWpuZQkxYgorCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisKKwlwYW5kCS5jbGFtcCglcmlwKSwleG1tMAorCW1vdmRxYQkleG1tMCwwKCVyYnApCisJbW92ZHFhCSV4bW00LDE2KCVyYnApCisKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorb3Blbl9zc2VfbWFpbl9sb29wOgorCWNtcHEJJDI1NiwlcmJ4CisJamIJMmYKKworCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW00LCV4bW02CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxYQkleG1tMCwleG1tMworCW1vdmRxYQkleG1tNCwleG1tNworCW1vdmRxYQkleG1tOCwleG1tMTEKKwltb3ZkcWEJOTYoJXJicCksJXhtbTE1CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE1CisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTQKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMworCW1vdmRxYQkleG1tMTMsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCW1vdmRxYQkleG1tMTMsMTEyKCVyYnApCisJbW92ZHFhCSV4bW0xNCwxMjgoJXJicCkKKwltb3ZkcWEJJXhtbTE1LDE0NCglcmJwKQorCisKKworCW1vdnEJJDQsJXJjeAorCW1vdnEJJXJzaSwlcjgKKzE6CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCS5yb2wxNiglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlhZGRxCTAoJXI4KSwlcjEwCisJYWRjcQk4KzAoJXI4KSwlcjExCisJYWRjcQkkMSwlcjEyCisKKwlsZWFxCTE2KCVyOCksJXI4CisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZkcWEJLnJvbDgoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1NSw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsMTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJLnJvbDE2KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCS5yb2w4KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjU1LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0NiwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCisJZGVjcQklcmN4CisJamdlCTFiCisJYWRkcQkwKCVyOCksJXIxMAorCWFkY3EJOCswKCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyOCksJXI4CisJY21wcQkkLTYsJXJjeAorCWpnCTFiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMworCXBhZGRkCTQ4KCVyYnApLCV4bW03CisJcGFkZGQJNjQoJXJicCksJXhtbTExCisJcGFkZGQJMTQ0KCVyYnApLCV4bW0xNQorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAk0OCglcmJwKSwleG1tNgorCXBhZGRkCTY0KCVyYnApLCV4bW0xMAorCXBhZGRkCTEyOCglcmJwKSwleG1tMTQKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsODAoJXJicCkKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMywleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDAgKyAwKCVyZGkpCisJbW92ZHF1CTE2ICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW03LCV4bW0xMgorCW1vdmRxdQkleG1tMTIsMTYgKyAwKCVyZGkpCisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDMyICsgMCglcmRpKQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMTUsJXhtbTEyCisJbW92ZHF1CSV4bW0xMiw0OCArIDAoJXJkaSkKKwltb3ZkcXUJMCArIDY0KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgNjQoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyA2NCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyA2NCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tNywleG1tNgorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxdQkleG1tMiwwICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTYsMTYgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTAsMzIgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyA2NCglcmRpKQorCW1vdmRxdQkwICsgMTI4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgMTI4KCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMTI4KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDEyOCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTUsMTYgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMTI4KCVyZGkpCisJbW92ZHF1CTAgKyAxOTIoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAxOTIoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAxOTIoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgMTkyKCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW03LCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTgKKwlweG9yCTgwKCVyYnApLCV4bW0xNQorCW1vdmRxdQkleG1tMCwwICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW00LDE2ICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW04LDMyICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDE5MiglcmRpKQorCisJbGVhcQkyNTYoJXJzaSksJXJzaQorCWxlYXEJMjU2KCVyZGkpLCVyZGkKKwlzdWJxCSQyNTYsJXJieAorCWptcAlvcGVuX3NzZV9tYWluX2xvb3AKKzI6CisKKwl0ZXN0cQklcmJ4LCVyYngKKwlqeglvcGVuX3NzZV9maW5hbGl6ZQorCWNtcHEJJDY0LCVyYngKKwlqYQkzZgorCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCTk2KCVyYnApLCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsOTYoJXJicCkKKworCXhvcnEJJXI4LCVyOAorCW1vdnEJJXJieCwlcmN4CisJY21wcQkkMTYsJXJjeAorCWpiCTJmCisxOgorCWFkZHEJMCglcnNpLCVyOCksICVyMTAKKwlhZGNxCTgrMCglcnNpLCVyOCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJc3VicQkkMTYsJXJjeAorMjoKKwlhZGRxCSQxNiwlcjgKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKworCWNtcHEJJDE2LCVyY3gKKwlqYWUJMWIKKwljbXBxCSQxNjAsJXI4CisJam5lCTJiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKworCWptcAlvcGVuX3NzZV90YWlsXzY0X2RlY19sb29wCiszOgorCWNtcHEJJDEyOCwlcmJ4CisJamEJM2YKKwltb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCW1vdmRxYQk0OCglcmJwKSwleG1tNAorCW1vdmRxYQk2NCglcmJwKSwleG1tOAorCW1vdmRxYQkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tNCwleG1tNQorCW1vdmRxYQkleG1tOCwleG1tOQorCW1vdmRxYQk5NiglcmJwKSwleG1tMTMKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTMKKwltb3ZkcWEJJXhtbTEzLCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsOTYoJXJicCkKKwltb3ZkcWEJJXhtbTEzLDExMiglcmJwKQorCisJbW92cQklcmJ4LCVyY3gKKwlhbmRxCSQtMTYsJXJjeAorCXhvcnEJJXI4LCVyOAorMToKKwlhZGRxCTAoJXJzaSwlcjgpLCAlcjEwCisJYWRjcQk4KzAoJXJzaSwlcjgpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworMjoKKwlhZGRxCSQxNiwlcjgKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDQKKworCWNtcHEJJXJjeCwlcjgKKwlqYgkxYgorCWNtcHEJJDE2MCwlcjgKKwlqbmUJMmIKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCW1vdmRxdQkwICsgMCglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDAoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAwKCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW0xMSwleG1tOQorCXB4b3IJJXhtbTEzLCV4bW0xNQorCW1vdmRxdQkleG1tMSwwICsgMCglcmRpKQorCW1vdmRxdQkleG1tNSwxNiArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDAoJXJkaSkKKworCXN1YnEJJDY0LCVyYngKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwlqbXAJb3Blbl9zc2VfdGFpbF82NF9kZWNfbG9vcAorMzoKKwljbXBxCSQxOTIsJXJieAorCWphCTNmCisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcWEJNDgoJXJicCksJXhtbTQKKwltb3ZkcWEJNjQoJXJicCksJXhtbTgKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcWEJJXhtbTgsJXhtbTEwCisJbW92ZHFhCTk2KCVyYnApLCV4bW0xNAorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xNAorCW1vdmRxYQkleG1tMTQsJXhtbTEzCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEzCisJbW92ZHFhCSV4bW0xMywleG1tMTIKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLDk2KCVyYnApCisJbW92ZHFhCSV4bW0xMywxMTIoJXJicCkKKwltb3ZkcWEJJXhtbTE0LDEyOCglcmJwKQorCisJbW92cQklcmJ4LCVyY3gKKwltb3ZxCSQxNjAsJXI4CisJY21wcQkkMTYwLCVyY3gKKwljbW92Z3EJJXI4LCVyY3gKKwlhbmRxCSQtMTYsJXJjeAorCXhvcnEJJXI4LCVyOAorMToKKwlhZGRxCTAoJXJzaSwlcjgpLCAlcjEwCisJYWRjcQk4KzAoJXJzaSwlcjgpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworMjoKKwlhZGRxCSQxNiwlcjgKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW02CisJcHhvcgkleG1tMywleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorCisJY21wcQklcmN4LCVyOAorCWpiCTFiCisJY21wcQkkMTYwLCVyOAorCWpuZQkyYgorCWNtcHEJJDE3NiwlcmJ4CisJamIJMWYKKwlhZGRxCTE2MCglcnNpKSwlcjEwCisJYWRjcQk4KzE2MCglcnNpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWNtcHEJJDE5MiwlcmJ4CisJamIJMWYKKwlhZGRxCTE3NiglcnNpKSwlcjEwCisJYWRjcQk4KzE3NiglcnNpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworMToKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0yCisJcGFkZGQJNDgoJXJicCksJXhtbTYKKwlwYWRkZAk2NCglcmJwKSwleG1tMTAKKwlwYWRkZAkxMjgoJXJicCksJXhtbTE0CisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMQorCXBhZGRkCTQ4KCVyYnApLCV4bW01CisJcGFkZGQJNjQoJXJicCksJXhtbTkKKwlwYWRkZAkxMTIoJXJicCksJXhtbTEzCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAwKCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyAwKCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTIKKwlweG9yCSV4bW03LCV4bW02CisJcHhvcgkleG1tMTEsJXhtbTEwCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHF1CSV4bW0yLDAgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW02LDE2ICsgMCglcmRpKQorCW1vdmRxdQkleG1tMTAsMzIgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDAoJXJkaSkKKwltb3ZkcXUJMCArIDY0KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgNjQoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyA2NCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyA2NCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tNSwxNiArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW05LDMyICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgNjQoJXJkaSkKKworCXN1YnEJJDEyOCwlcmJ4CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwlqbXAJb3Blbl9zc2VfdGFpbF82NF9kZWNfbG9vcAorMzoKKworCW1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCTQ4KCVyYnApLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW01CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW00LCV4bW02CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxYQkleG1tMCwleG1tMworCW1vdmRxYQkleG1tNCwleG1tNworCW1vdmRxYQkleG1tOCwleG1tMTEKKwltb3ZkcWEJOTYoJXJicCksJXhtbTE1CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE1CisJbW92ZHFhCSV4bW0xNSwleG1tMTQKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTQKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMworCW1vdmRxYQkleG1tMTMsJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCW1vdmRxYQkleG1tMTMsMTEyKCVyYnApCisJbW92ZHFhCSV4bW0xNCwxMjgoJXJicCkKKwltb3ZkcWEJJXhtbTE1LDE0NCglcmJwKQorCisJeG9ycQklcjgsJXI4CisxOgorCWFkZHEJMCglcnNpLCVyOCksICVyMTAKKwlhZGNxCTgrMCglcnNpLCVyOCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZkcWEJJXhtbTExLDgwKCVyYnApCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMTEKKwlwc2xsZAkkMTIsJXhtbTExCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTExCisJcHNsbGQJJDcsJXhtbTExCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDEyCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMTEKKwlwc2xsZAkkMTIsJXhtbTExCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTExCisJcHNsbGQJJDcsJXhtbTExCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDEyCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQxMiwleG1tMTEKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTExLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0NiwxMgorCW1vdmRxYQk4MCglcmJwKSwleG1tMTEKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZkcWEJJXhtbTksODAoJXJicCkKKwlwYWRkZAkleG1tNywleG1tMworCXB4b3IJJXhtbTMsJXhtbTE1CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkMTIsJXhtbTkKKwlwc3JsZAkkMjAsJXhtbTcKKwlweG9yCSV4bW05LCV4bW03CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0xNQorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkNywleG1tOQorCXBzcmxkCSQyNSwleG1tNworCXB4b3IJJXhtbTksJXhtbTcKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTUsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxOSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjU1LDEyCisJbW92ZHFhCTgwKCVyYnApLCV4bW05CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92ZHFhCSV4bW0xMSw4MCglcmJwKQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTExCisJcHNsbGQJJDEyLCV4bW0xMQorCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTExLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTExLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTExCisJcHNsbGQJJDEyLCV4bW0xMQorCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTExLCV4bW01CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTExLCV4bW01CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsNAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQxMiwleG1tMTEKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0xMQorCXBzbGxkCSQ3LCV4bW0xMQorCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTExLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorCW1vdmRxYQk4MCglcmJwKSwleG1tMTEKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwltb3ZkcWEJJXhtbTksODAoJXJicCkKKwlwYWRkZAkleG1tNywleG1tMworCXB4b3IJJXhtbTMsJXhtbTE1CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkMTIsJXhtbTkKKwlwc3JsZAkkMjAsJXhtbTcKKwlweG9yCSV4bW05LCV4bW03CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0xNQorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTUKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTEsJXhtbTcKKwltb3ZkcWEJJXhtbTcsJXhtbTkKKwlwc2xsZAkkNywleG1tOQorCXBzcmxkCSQyNSwleG1tNworCXB4b3IJJXhtbTksJXhtbTcKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTUsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTksOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI1NSw0CisJbW92ZHFhCTgwKCVyYnApLCV4bW05CisKKwlhZGRxCSQxNiwlcjgKKwljbXBxCSQxNjAsJXI4CisJamIJMWIKKwltb3ZxCSVyYngsJXJjeAorCWFuZHEJJC0xNiwlcmN4CisxOgorCWFkZHEJMCglcnNpLCVyOCksICVyMTAKKwlhZGNxCTgrMCglcnNpLCVyOCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJYWRkcQkkMTYsJXI4CisJY21wcQklcmN4LCVyOAorCWpiCTFiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMworCXBhZGRkCTQ4KCVyYnApLCV4bW03CisJcGFkZGQJNjQoJXJicCksJXhtbTExCisJcGFkZGQJMTQ0KCVyYnApLCV4bW0xNQorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAk0OCglcmJwKSwleG1tNgorCXBhZGRkCTY0KCVyYnApLCV4bW0xMAorCXBhZGRkCTEyOCglcmJwKSwleG1tMTQKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsODAoJXJicCkKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMywleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDAgKyAwKCVyZGkpCisJbW92ZHF1CTE2ICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW03LCV4bW0xMgorCW1vdmRxdQkleG1tMTIsMTYgKyAwKCVyZGkpCisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwltb3ZkcXUJJXhtbTEyLDMyICsgMCglcmRpKQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTEyCisJcHhvcgkleG1tMTUsJXhtbTEyCisJbW92ZHF1CSV4bW0xMiw0OCArIDAoJXJkaSkKKwltb3ZkcXUJMCArIDY0KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgNjQoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyA2NCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyA2NCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tNywleG1tNgorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxdQkleG1tMiwwICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTYsMTYgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTAsMzIgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyA2NCglcmRpKQorCW1vdmRxdQkwICsgMTI4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgMTI4KCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMTI4KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDEyOCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTExLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTE1CisJbW92ZHF1CSV4bW0xLDAgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTUsMTYgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyAxMjgoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMTI4KCVyZGkpCisKKwltb3ZkcWEJODAoJXJicCksJXhtbTEyCisJc3VicQkkMTkyLCVyYngKKwlsZWFxCTE5MiglcnNpKSwlcnNpCisJbGVhcQkxOTIoJXJkaSksJXJkaQorCisKK29wZW5fc3NlX3RhaWxfNjRfZGVjX2xvb3A6CisJY21wcQkkMTYsJXJieAorCWpiCTFmCisJc3VicQkkMTYsJXJieAorCW1vdmRxdQkoJXJzaSksJXhtbTMKKwlweG9yCSV4bW0zLCV4bW0wCisJbW92ZHF1CSV4bW0wLCglcmRpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWxlYXEJMTYoJXJkaSksJXJkaQorCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tMTIsJXhtbTgKKwlqbXAJb3Blbl9zc2VfdGFpbF82NF9kZWNfbG9vcAorMToKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKworCitvcGVuX3NzZV90YWlsXzE2OgorCXRlc3RxCSVyYngsJXJieAorCWp6CW9wZW5fc3NlX2ZpbmFsaXplCisKKworCisJcHhvcgkleG1tMywleG1tMworCWxlYXEJLTEoJXJzaSwlcmJ4KSwgJXJzaQorCW1vdnEJJXJieCwlcjgKKzI6CisJcHNsbGRxCSQxLCV4bW0zCisJcGluc3JiCSQwLCglcnNpKSwleG1tMworCXN1YnEJJDEsJXJzaQorCXN1YnEJJDEsJXI4CisJam56CTJiCisKKzM6CisuYnl0ZQkxMDIsNzMsMTUsMTI2LDIyMQorCXBleHRycQkkMSwleG1tMywlcjE0CisKKwlweG9yCSV4bW0xLCV4bW0zCisKKworMjoKKwlwZXh0cmIJJDAsJXhtbTMsKCVyZGkpCisJcHNybGRxCSQxLCV4bW0zCisJYWRkcQkkMSwlcmRpCisJc3VicQkkMSwlcmJ4CisJam5lCTJiCisKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCitvcGVuX3NzZV9maW5hbGl6ZToKKwlhZGRxCTMyKCVyYnApLCVyMTAKKwlhZGNxCTgrMzIoJXJicCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworCW1vdnEJJXIxMCwlcjEzCisJbW92cQklcjExLCVyMTQKKwltb3ZxCSVyMTIsJXIxNQorCXN1YnEJJC01LCVyMTAKKwlzYmJxCSQtMSwlcjExCisJc2JicQkkMywlcjEyCisJY21vdmNxCSVyMTMsJXIxMAorCWNtb3ZjcQklcjE0LCVyMTEKKwljbW92Y3EJJXIxNSwlcjEyCisKKwlhZGRxCTArMTYoJXJicCksJXIxMAorCWFkY3EJOCsxNiglcmJwKSwlcjExCisKKwlhZGRxCSQyODggKyAzMiwlcnNwCisKKwlwb3BxCSVyOQorCisJbW92cQklcjEwLCglcjkpCisJbW92cQklcjExLDgoJXI5KQorCisJcG9wcQklcjE1CisKKwlwb3BxCSVyMTQKKworCXBvcHEJJXIxMworCisJcG9wcQklcjEyCisKKwlwb3BxCSVyYngKKworCXBvcHEJJXJicAorCisJLmJ5dGUJMHhmMywweGMzCisKKworb3Blbl9zc2VfMTI4OgorCW1vdmRxdQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW0wLCV4bW0yCisJbW92ZHF1CTAoJXI5KSwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tNgorCW1vdmRxdQkxNiglcjkpLCV4bW04CisJbW92ZHFhCSV4bW04LCV4bW05CisJbW92ZHFhCSV4bW04LCV4bW0xMAorCW1vdmRxdQkzMiglcjkpLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsJXhtbTEzCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEzCisJbW92ZHFhCSV4bW0xMywleG1tMTQKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTQKKwltb3ZkcWEJJXhtbTQsJXhtbTcKKwltb3ZkcWEJJXhtbTgsJXhtbTExCisJbW92ZHFhCSV4bW0xMywleG1tMTUKKwltb3ZxCSQxMCwlcjEwCisxOgorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCwxMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNywxMgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xNAorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMCwleG1tNgorCW1vdmRxYQkleG1tNiwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xNAorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMCwleG1tNgorCW1vdmRxYQkleG1tNiwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW02CisJcHhvcgkleG1tMywleG1tNgorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0Niw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDQKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0Niw0CisKKwlkZWNxCSVyMTAKKwlqbnoJMWIKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMQorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAkleG1tNywleG1tNAorCXBhZGRkCSV4bW03LCV4bW01CisJcGFkZGQJJXhtbTcsJXhtbTYKKwlwYWRkZAkleG1tMTEsJXhtbTkKKwlwYWRkZAkleG1tMTEsJXhtbTEwCisJcGFkZGQJJXhtbTE1LCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xNQorCXBhZGRkCSV4bW0xNSwleG1tMTQKKworCXBhbmQJLmNsYW1wKCVyaXApLCV4bW0wCisJbW92ZHFhCSV4bW0wLDAoJXJicCkKKwltb3ZkcWEJJXhtbTQsMTYoJXJicCkKKworCW1vdnEJJXI4LCVyOAorCWNhbGwJcG9seV9oYXNoX2FkX2ludGVybmFsCisxOgorCWNtcHEJJDE2LCVyYngKKwlqYglvcGVuX3NzZV90YWlsXzE2CisJc3VicQkkMTYsJXJieAorCWFkZHEJMCglcnNpKSwlcjEwCisJYWRjcQk4KzAoJXJzaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCisKKwltb3ZkcXUJMCglcnNpKSwleG1tMworCXB4b3IJJXhtbTMsJXhtbTEKKwltb3ZkcXUJJXhtbTEsMCglcmRpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWxlYXEJMTYoJXJkaSksJXJkaQorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworCW1vdmRxYQkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tMTMsJXhtbTkKKwltb3ZkcWEJJXhtbTIsJXhtbTEzCisJbW92ZHFhCSV4bW02LCV4bW0yCisJbW92ZHFhCSV4bW0xMCwleG1tNgorCW1vdmRxYQkleG1tMTQsJXhtbTEwCisJam1wCTFiCisJam1wCW9wZW5fc3NlX3RhaWxfMTYKKworCisKKworCisKKy5nbG9ibAlfY2hhY2hhMjBfcG9seTEzMDVfc2VhbAorLnByaXZhdGVfZXh0ZXJuIF9jaGFjaGEyMF9wb2x5MTMwNV9zZWFsCisKKy5wMmFsaWduCTYKK19jaGFjaGEyMF9wb2x5MTMwNV9zZWFsOgorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisKKworCXB1c2hxCSVyOQorCisJc3VicQkkMjg4ICsgMzIsJXJzcAorCisKKworCisKKworCisJbGVhcQkzMiglcnNwKSwlcmJwCisJYW5kcQkkLTMyLCVyYnAKKwltb3ZxCTU2KCVyOSksJXJieAorCWFkZHEJJXJkeCwlcmJ4CisJbW92cQklcmJ4LDgrMzIoJXJicCkKKwltb3ZxCSVyOCwwKzMyKCVyYnApCisJbW92cQklcmR4LCVyYngKKworCW1vdmwJX09QRU5TU0xfaWEzMmNhcF9QKzgoJXJpcCksJWVheAorCWFuZGwJJDI4OCwlZWF4CisJeG9ybAkkMjg4LCVlYXgKKwlqegljaGFjaGEyMF9wb2x5MTMwNV9zZWFsX2F2eDIKKworCWNtcHEJJDEyOCwlcmJ4CisJamJlCXNlYWxfc3NlXzEyOAorCisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcXUJMCglcjkpLCV4bW00CisJbW92ZHF1CTE2KCVyOSksJXhtbTgKKwltb3ZkcXUJMzIoJXI5KSwleG1tMTIKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcWEJJXhtbTQsJXhtbTcKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwltb3ZkcWEJJXhtbTgsJXhtbTEwCisJbW92ZHFhCSV4bW04LCV4bW0xMQorCW1vdmRxYQkleG1tMTIsJXhtbTE1CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiwleG1tMTQKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLCV4bW0xMworCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCisJbW92ZHFhCSV4bW00LDQ4KCVyYnApCisJbW92ZHFhCSV4bW04LDY0KCVyYnApCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCW1vdmRxYQkleG1tMTMsMTEyKCVyYnApCisJbW92ZHFhCSV4bW0xNCwxMjgoJXJicCkKKwltb3ZkcWEJJXhtbTE1LDE0NCglcmJwKQorCW1vdnEJJDEwLCVyMTAKKzE6CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCS5yb2wxNiglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0xMCwleG1tNgorCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCSV4bW03LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW03CisJcHhvcgkleG1tOCwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNgorCXB4b3IJJXhtbTgsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTUKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW00CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkucm9sOCglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0xMCwleG1tNgorCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCSV4bW03LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW03CisJcHhvcgkleG1tOCwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNgorCXB4b3IJJXhtbTgsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTUKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW00CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI1NSw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsMTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJLnJvbDE2KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCS5yb2w4KCVyaXApLCV4bW04CisJcGFkZGQJJXhtbTcsJXhtbTMKKwlwYWRkZAkleG1tNiwleG1tMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHhvcgkleG1tMSwleG1tMTMKKwlweG9yCSV4bW0wLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQ4CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDAKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIzMgorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjI0CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisJcGFkZGQJJXhtbTE1LCV4bW0xMQorCXBhZGRkCSV4bW0xNCwleG1tMTAKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTEwLCV4bW02CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTgsODAoJXJicCkKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTcKKwlweG9yCSV4bW04LCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW02CisJcHhvcgkleG1tOCwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTQKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCTgwKCVyYnApLCV4bW04CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjU1LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjE5LDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNTUsNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0NiwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsNAorCisJZGVjcQklcjEwCisJam56CTFiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMworCXBhZGRkCTQ4KCVyYnApLCV4bW03CisJcGFkZGQJNjQoJXJicCksJXhtbTExCisJcGFkZGQJMTQ0KCVyYnApLCV4bW0xNQorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTIKKwlwYWRkZAk0OCglcmJwKSwleG1tNgorCXBhZGRkCTY0KCVyYnApLCV4bW0xMAorCXBhZGRkCTEyOCglcmJwKSwleG1tMTQKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0xCisJcGFkZGQJNDgoJXJicCksJXhtbTUKKwlwYWRkZAk2NCglcmJwKSwleG1tOQorCXBhZGRkCTExMiglcmJwKSwleG1tMTMKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCisKKwlwYW5kCS5jbGFtcCglcmlwKSwleG1tMworCW1vdmRxYQkleG1tMywwKCVyYnApCisJbW92ZHFhCSV4bW03LDE2KCVyYnApCisKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorCW1vdmRxdQkwICsgMCglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDAoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAwKCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDAoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTcsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tMTAKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcXUJJXhtbTIsMCArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTYsMTYgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW0xMCwzMiArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgMCglcmRpKQorCW1vdmRxdQkwICsgNjQoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyA2NCglcnNpKSwleG1tNworCW1vdmRxdQkzMiArIDY0KCVyc2kpLCV4bW0xMQorCW1vdmRxdQk0OCArIDY0KCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW03LCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTUKKwltb3ZkcXUJJXhtbTEsMCArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW01LDE2ICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTksMzIgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyA2NCglcmRpKQorCisJY21wcQkkMTkyLCVyYngKKwlqYQkxZgorCW1vdnEJJDEyOCwlcmN4CisJc3VicQkkMTI4LCVyYngKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJam1wCXNlYWxfc3NlXzEyOF9zZWFsX2hhc2gKKzE6CisJbW92ZHF1CTAgKyAxMjgoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAxMjgoJXJzaSksJXhtbTcKKwltb3ZkcXUJMzIgKyAxMjgoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgMTI4KCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW03LCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTgKKwlweG9yCSV4bW0xMiwleG1tMTUKKwltb3ZkcXUJJXhtbTAsMCArIDEyOCglcmRpKQorCW1vdmRxdQkleG1tNCwxNiArIDEyOCglcmRpKQorCW1vdmRxdQkleG1tOCwzMiArIDEyOCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyAxMjgoJXJkaSkKKworCW1vdnEJJDE5MiwlcmN4CisJc3VicQkkMTkyLCVyYngKKwlsZWFxCTE5MiglcnNpKSwlcnNpCisJbW92cQkkMiwlcmN4CisJbW92cQkkOCwlcjgKKwljbXBxCSQ2NCwlcmJ4CisJamJlCXNlYWxfc3NlX3RhaWxfNjQKKwljbXBxCSQxMjgsJXJieAorCWpiZQlzZWFsX3NzZV90YWlsXzEyOAorCWNtcHEJJDE5MiwlcmJ4CisJamJlCXNlYWxfc3NlX3RhaWxfMTkyCisKKzE6CisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcWEJNDgoJXJicCksJXhtbTQKKwltb3ZkcWEJNjQoJXJicCksJXhtbTgKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcWEJJXhtbTgsJXhtbTEwCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJbW92ZHFhCSV4bW00LCV4bW03CisJbW92ZHFhCSV4bW04LCV4bW0xMQorCW1vdmRxYQk5NiglcmJwKSwleG1tMTUKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTUKKwltb3ZkcWEJJXhtbTE1LCV4bW0xNAorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xNAorCW1vdmRxYQkleG1tMTQsJXhtbTEzCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEzCisJbW92ZHFhCSV4bW0xMywleG1tMTIKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLDk2KCVyYnApCisJbW92ZHFhCSV4bW0xMywxMTIoJXJicCkKKwltb3ZkcWEJJXhtbTE0LDEyOCglcmJwKQorCW1vdmRxYQkleG1tMTUsMTQ0KCVyYnApCisKKzI6CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCS5yb2wxNiglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwlweG9yCSV4bW0xMCwleG1tNgorCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCSV4bW03LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW03CisJcHhvcgkleG1tOCwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNgorCXB4b3IJJXhtbTgsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTUKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW00CisJcHhvcgkleG1tOCwleG1tNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdmRxYQkucm9sOCglcmlwKSwleG1tOAorCXBhZGRkCSV4bW03LCV4bW0zCisJcGFkZGQJJXhtbTYsJXhtbTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlweG9yCSV4bW0yLCV4bW0xNAorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0OAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjQwCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMzIKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIyNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCXBhZGRkCSV4bW0xNSwleG1tMTEKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0xMCwleG1tNgorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCXB4b3IJJXhtbTksJXhtbTUKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW04LDgwKCVyYnApCisJbW92ZHFhCSV4bW03LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW03CisJcHhvcgkleG1tOCwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNgorCXB4b3IJJXhtbTgsJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTUKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW00CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQk4MCglcmJwKSwleG1tOAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjU1LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTksOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI1NSwxMgorLmJ5dGUJMTAyLDE1LDU4LDE1LDI0Niw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsMTIKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDEyCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCwxMgorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkucm9sMTYoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjAsJXhtbTgKKwlwc2xsZAkkMzItMjAsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDIwLCV4bW04CisJcHNsbGQJJDMyLTIwLCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyMCwleG1tOAorCXBzbGxkCSQzMi0yMCwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJLnJvbDgoJXJpcCksJXhtbTgKKwlwYWRkZAkleG1tNywleG1tMworCXBhZGRkCSV4bW02LCV4bW0yCisJcGFkZGQJJXhtbTUsJXhtbTEKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMTQKKwlweG9yCSV4bW0xLCV4bW0xMworCXB4b3IJJXhtbTAsJXhtbTEyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyNDgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDI0MAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMjMyCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMjQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKwlwYWRkZAkleG1tMTUsJXhtbTExCisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXBhZGRkCSV4bW0xMywleG1tOQorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTExLCV4bW03CisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tOCw4MCglcmJwKQorCW1vdmRxYQkleG1tNywleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNworCXB4b3IJJXhtbTgsJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwc3JsZAkkMjUsJXhtbTgKKwlwc2xsZAkkMzItMjUsJXhtbTYKKwlweG9yCSV4bW04LCV4bW02CisJbW92ZHFhCSV4bW01LCV4bW04CisJcHNybGQJJDI1LCV4bW04CisJcHNsbGQJJDMyLTI1LCV4bW01CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tOAorCXBzcmxkCSQyNSwleG1tOAorCXBzbGxkCSQzMi0yNSwleG1tNAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJODAoJXJicCksJXhtbTgKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTUsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTksOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI1NSw0CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwlkZWNxCSVyOAorCWpnZQkyYgorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkyYgorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTMKKwlwYWRkZAk0OCglcmJwKSwleG1tNworCXBhZGRkCTY0KCVyYnApLCV4bW0xMQorCXBhZGRkCTE0NCglcmJwKSwleG1tMTUKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0yCisJcGFkZGQJNDgoJXJicCksJXhtbTYKKwlwYWRkZAk2NCglcmJwKSwleG1tMTAKKwlwYWRkZAkxMjgoJXJicCksJXhtbTE0CisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMQorCXBhZGRkCTQ4KCVyYnApLCV4bW01CisJcGFkZGQJNjQoJXJicCksJXhtbTkKKwlwYWRkZAkxMTIoJXJicCksJXhtbTEzCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKworCW1vdmRxYQkleG1tMTQsODAoJXJicCkKKwltb3ZkcWEJJXhtbTE0LDgwKCVyYnApCisJbW92ZHF1CTAgKyAwKCVyc2kpLCV4bW0xNAorCXB4b3IJJXhtbTMsJXhtbTE0CisJbW92ZHF1CSV4bW0xNCwwICsgMCglcmRpKQorCW1vdmRxdQkxNiArIDAoJXJzaSksJXhtbTE0CisJcHhvcgkleG1tNywleG1tMTQKKwltb3ZkcXUJJXhtbTE0LDE2ICsgMCglcmRpKQorCW1vdmRxdQkzMiArIDAoJXJzaSksJXhtbTE0CisJcHhvcgkleG1tMTEsJXhtbTE0CisJbW92ZHF1CSV4bW0xNCwzMiArIDAoJXJkaSkKKwltb3ZkcXUJNDggKyAwKCVyc2kpLCV4bW0xNAorCXB4b3IJJXhtbTE1LCV4bW0xNAorCW1vdmRxdQkleG1tMTQsNDggKyAwKCVyZGkpCisKKwltb3ZkcWEJODAoJXJicCksJXhtbTE0CisJbW92ZHF1CTAgKyA2NCglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDY0KCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgNjQoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgNjQoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTcsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tMTAKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcXUJJXhtbTIsMCArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW02LDE2ICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTEwLDMyICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTE1LDQ4ICsgNjQoJXJkaSkKKwltb3ZkcXUJMCArIDEyOCglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDEyOCglcnNpKSwleG1tNworCW1vdmRxdQkzMiArIDEyOCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyAxMjgoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW0xMSwleG1tOQorCXB4b3IJJXhtbTEzLCV4bW0xNQorCW1vdmRxdQkleG1tMSwwICsgMTI4KCVyZGkpCisJbW92ZHF1CSV4bW01LDE2ICsgMTI4KCVyZGkpCisJbW92ZHF1CSV4bW05LDMyICsgMTI4KCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDEyOCglcmRpKQorCisJY21wcQkkMjU2LCVyYngKKwlqYQkzZgorCisJbW92cQkkMTkyLCVyY3gKKwlzdWJxCSQxOTIsJXJieAorCWxlYXEJMTkyKCVyc2kpLCVyc2kKKwlqbXAJc2VhbF9zc2VfMTI4X3NlYWxfaGFzaAorMzoKKwltb3ZkcXUJMCArIDE5MiglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDE5MiglcnNpKSwleG1tNworCW1vdmRxdQkzMiArIDE5MiglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyAxOTIoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMAorCXB4b3IJJXhtbTcsJXhtbTQKKwlweG9yCSV4bW0xMSwleG1tOAorCXB4b3IJJXhtbTEyLCV4bW0xNQorCW1vdmRxdQkleG1tMCwwICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW00LDE2ICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW04LDMyICsgMTkyKCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDE5MiglcmRpKQorCisJbGVhcQkyNTYoJXJzaSksJXJzaQorCXN1YnEJJDI1NiwlcmJ4CisJbW92cQkkNiwlcmN4CisJbW92cQkkNCwlcjgKKwljbXBxCSQxOTIsJXJieAorCWpnCTFiCisJbW92cQklcmJ4LCVyY3gKKwl0ZXN0cQklcmJ4LCVyYngKKwlqZQlzZWFsX3NzZV8xMjhfc2VhbF9oYXNoCisJbW92cQkkNiwlcmN4CisJY21wcQkkNjQsJXJieAorCWpnCTNmCisKK3NlYWxfc3NlX3RhaWxfNjQ6CisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcWEJNDgoJXJicCksJXhtbTQKKwltb3ZkcWEJNjQoJXJicCksJXhtbTgKKwltb3ZkcWEJOTYoJXJicCksJXhtbTEyCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEyCisJbW92ZHFhCSV4bW0xMiw5NiglcmJwKQorCisxOgorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKzI6CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDEyCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXJkaSksJXJkaQorCWRlY3EJJXJjeAorCWpnCTFiCisJZGVjcQklcjgKKwlqZ2UJMmIKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0wCisJcGFkZGQJNDgoJXJicCksJXhtbTQKKwlwYWRkZAk2NCglcmJwKSwleG1tOAorCXBhZGRkCTk2KCVyYnApLCV4bW0xMgorCisJam1wCXNlYWxfc3NlXzEyOF9zZWFsCiszOgorCWNtcHEJJDEyOCwlcmJ4CisJamcJM2YKKworc2VhbF9zc2VfdGFpbF8xMjg6CisJbW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwltb3ZkcWEJNDgoJXJicCksJXhtbTQKKwltb3ZkcWEJNjQoJXJicCksJXhtbTgKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwltb3ZkcWEJOTYoJXJicCksJXhtbTEzCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEzCisJbW92ZHFhCSV4bW0xMywleG1tMTIKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTIKKwltb3ZkcWEJJXhtbTEyLDk2KCVyYnApCisJbW92ZHFhCSV4bW0xMywxMTIoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI4LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCwxMgorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDE2KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW01CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjM3LDQKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNywxMgorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkxYgorCWRlY3EJJXI4CisJamdlCTJiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMQorCXBhZGRkCTQ4KCVyYnApLCV4bW01CisJcGFkZGQJNjQoJXJicCksJXhtbTkKKwlwYWRkZAkxMTIoJXJicCksJXhtbTEzCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCTQ4KCVyYnApLCV4bW00CisJcGFkZGQJNjQoJXJicCksJXhtbTgKKwlwYWRkZAk5NiglcmJwKSwleG1tMTIKKwltb3ZkcXUJMCArIDAoJXJzaSksJXhtbTMKKwltb3ZkcXUJMTYgKyAwKCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgMCglcnNpKSwleG1tMTEKKwltb3ZkcXUJNDggKyAwKCVyc2kpLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW03LCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTUKKwltb3ZkcXUJJXhtbTEsMCArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTUsMTYgKyAwKCVyZGkpCisJbW92ZHF1CSV4bW05LDMyICsgMCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyAwKCVyZGkpCisKKwltb3ZxCSQ2NCwlcmN4CisJc3VicQkkNjQsJXJieAorCWxlYXEJNjQoJXJzaSksJXJzaQorCWptcAlzZWFsX3NzZV8xMjhfc2VhbF9oYXNoCiszOgorCitzZWFsX3NzZV90YWlsXzE5MjoKKwltb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCW1vdmRxYQk0OCglcmJwKSwleG1tNAorCW1vdmRxYQk2NCglcmJwKSwleG1tOAorCW1vdmRxYQkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tNCwleG1tNQorCW1vdmRxYQkleG1tOCwleG1tOQorCW1vdmRxYQkleG1tMCwleG1tMgorCW1vdmRxYQkleG1tNCwleG1tNgorCW1vdmRxYQkleG1tOCwleG1tMTAKKwltb3ZkcWEJOTYoJXJicCksJXhtbTE0CisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTE0CisJbW92ZHFhCSV4bW0xNCwleG1tMTMKKwlwYWRkZAkuc3NlX2luYyglcmlwKSwleG1tMTMKKwltb3ZkcWEJJXhtbTEzLCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsOTYoJXJicCkKKwltb3ZkcWEJJXhtbTEzLDExMiglcmJwKQorCW1vdmRxYQkleG1tMTQsMTI4KCVyYnApCisKKzE6CisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXJkaSksJXJkaQorMjoKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCwxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDE5Miw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjI4LDQKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNywxMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIwMSw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjM3LDQKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMTAsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDI0Niw0CisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkxYgorCWRlY3EJJXI4CisJamdlCTJiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMgorCXBhZGRkCTQ4KCVyYnApLCV4bW02CisJcGFkZGQJNjQoJXJicCksJXhtbTEwCisJcGFkZGQJMTI4KCVyYnApLCV4bW0xNAorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTEKKwlwYWRkZAk0OCglcmJwKSwleG1tNQorCXBhZGRkCTY0KCVyYnApLCV4bW05CisJcGFkZGQJMTEyKCVyYnApLCV4bW0xMworCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTAKKwlwYWRkZAk0OCglcmJwKSwleG1tNAorCXBhZGRkCTY0KCVyYnApLCV4bW04CisJcGFkZGQJOTYoJXJicCksJXhtbTEyCisJbW92ZHF1CTAgKyAwKCVyc2kpLCV4bW0zCisJbW92ZHF1CTE2ICsgMCglcnNpKSwleG1tNworCW1vdmRxdQkzMiArIDAoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgMCglcnNpKSwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0yCisJcHhvcgkleG1tNywleG1tNgorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxdQkleG1tMiwwICsgMCglcmRpKQorCW1vdmRxdQkleG1tNiwxNiArIDAoJXJkaSkKKwltb3ZkcXUJJXhtbTEwLDMyICsgMCglcmRpKQorCW1vdmRxdQkleG1tMTUsNDggKyAwKCVyZGkpCisJbW92ZHF1CTAgKyA2NCglcnNpKSwleG1tMworCW1vdmRxdQkxNiArIDY0KCVyc2kpLCV4bW03CisJbW92ZHF1CTMyICsgNjQoJXJzaSksJXhtbTExCisJbW92ZHF1CTQ4ICsgNjQoJXJzaSksJXhtbTE1CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW0xMSwleG1tOQorCXB4b3IJJXhtbTEzLCV4bW0xNQorCW1vdmRxdQkleG1tMSwwICsgNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTUsMTYgKyA2NCglcmRpKQorCW1vdmRxdQkleG1tOSwzMiArIDY0KCVyZGkpCisJbW92ZHF1CSV4bW0xNSw0OCArIDY0KCVyZGkpCisKKwltb3ZxCSQxMjgsJXJjeAorCXN1YnEJJDEyOCwlcmJ4CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCitzZWFsX3NzZV8xMjhfc2VhbF9oYXNoOgorCWNtcHEJJDE2LCVyY3gKKwlqYglzZWFsX3NzZV8xMjhfc2VhbAorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlzdWJxCSQxNiwlcmN4CisJbGVhcQkxNiglcmRpKSwlcmRpCisJam1wCXNlYWxfc3NlXzEyOF9zZWFsX2hhc2gKKworc2VhbF9zc2VfMTI4X3NlYWw6CisJY21wcQkkMTYsJXJieAorCWpiCXNlYWxfc3NlX3RhaWxfMTYKKwlzdWJxCSQxNiwlcmJ4CisKKwltb3ZkcXUJMCglcnNpKSwleG1tMworCXB4b3IJJXhtbTMsJXhtbTAKKwltb3ZkcXUJJXhtbTAsMCglcmRpKQorCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCWxlYXEJMTYoJXJzaSksJXJzaQorCWxlYXEJMTYoJXJkaSksJXJkaQorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tMTIsJXhtbTgKKwltb3ZkcWEJJXhtbTEsJXhtbTEyCisJbW92ZHFhCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW0xMywleG1tOQorCWptcAlzZWFsX3NzZV8xMjhfc2VhbAorCitzZWFsX3NzZV90YWlsXzE2OgorCXRlc3RxCSVyYngsJXJieAorCWp6CXByb2Nlc3NfYmxvY2tzX29mX2V4dHJhX2luCisKKwltb3ZxCSVyYngsJXI4CisJbW92cQklcmJ4LCVyY3gKKwlsZWFxCS0xKCVyc2ksJXJieCksICVyc2kKKwlweG9yCSV4bW0xNSwleG1tMTUKKzE6CisJcHNsbGRxCSQxLCV4bW0xNQorCXBpbnNyYgkkMCwoJXJzaSksJXhtbTE1CisJbGVhcQktMSglcnNpKSwlcnNpCisJZGVjcQklcmN4CisJam5lCTFiCisKKworCXB4b3IJJXhtbTAsJXhtbTE1CisKKworCW1vdnEJJXJieCwlcmN4CisJbW92ZHF1CSV4bW0xNSwleG1tMAorMjoKKwlwZXh0cmIJJDAsJXhtbTAsKCVyZGkpCisJcHNybGRxCSQxLCV4bW0wCisJYWRkcQkkMSwlcmRpCisJc3VicQkkMSwlcmN4CisJam56CTJiCisKKworCisKKworCisKKworCW1vdnEJMjg4KzMyKCVyc3ApLCVyOQorCW1vdnEJNTYoJXI5KSwlcjE0CisJbW92cQk0OCglcjkpLCVyMTMKKwl0ZXN0cQklcjE0LCVyMTQKKwlqeglwcm9jZXNzX3BhcnRpYWxfYmxvY2sKKworCW1vdnEJJDE2LCVyMTUKKwlzdWJxCSVyYngsJXIxNQorCWNtcHEJJXIxNSwlcjE0CisKKwlqZ2UJbG9hZF9leHRyYV9pbgorCW1vdnEJJXIxNCwlcjE1CisKK2xvYWRfZXh0cmFfaW46CisKKworCWxlYXEJLTEoJXIxMywlcjE1KSwgJXJzaQorCisKKwlhZGRxCSVyMTUsJXIxMworCXN1YnEJJXIxNSwlcjE0CisJbW92cQklcjEzLDQ4KCVyOSkKKwltb3ZxCSVyMTQsNTYoJXI5KQorCisKKworCWFkZHEJJXIxNSwlcjgKKworCisJcHhvcgkleG1tMTEsJXhtbTExCiszOgorCXBzbGxkcQkkMSwleG1tMTEKKwlwaW5zcmIJJDAsKCVyc2kpLCV4bW0xMQorCWxlYXEJLTEoJXJzaSksJXJzaQorCXN1YnEJJDEsJXIxNQorCWpuegkzYgorCisKKworCisJbW92cQklcmJ4LCVyMTUKKworNDoKKwlwc2xsZHEJJDEsJXhtbTExCisJc3VicQkkMSwlcjE1CisJam56CTRiCisKKworCisKKwlsZWFxCS5hbmRfbWFza3MoJXJpcCksJXIxNQorCXNobHEJJDQsJXJieAorCXBhbmQJLTE2KCVyMTUsJXJieCksICV4bW0xNQorCisKKwlwb3IJJXhtbTExLCV4bW0xNQorCisKKworLmJ5dGUJMTAyLDc3LDE1LDEyNiwyNTMKKwlwZXh0cnEJJDEsJXhtbTE1LCVyMTQKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCitwcm9jZXNzX2Jsb2Nrc19vZl9leHRyYV9pbjoKKworCW1vdnEJMjg4KzMyKCVyc3ApLCVyOQorCW1vdnEJNDgoJXI5KSwlcnNpCisJbW92cQk1NiglcjkpLCVyOAorCW1vdnEJJXI4LCVyY3gKKwlzaHJxCSQ0LCVyOAorCis1OgorCWp6CXByb2Nlc3NfZXh0cmFfaW5fdHJhaWxlcgorCWFkZHEJMCglcnNpKSwlcjEwCisJYWRjcQk4KzAoJXJzaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlzdWJxCSQxLCVyOAorCWptcAk1YgorCitwcm9jZXNzX2V4dHJhX2luX3RyYWlsZXI6CisJYW5kcQkkMTUsJXJjeAorCW1vdnEJJXJjeCwlcmJ4CisJanoJZG9fbGVuZ3RoX2Jsb2NrCisJbGVhcQktMSglcnNpLCVyY3gpLCAlcnNpCisKKzY6CisJcHNsbGRxCSQxLCV4bW0xNQorCXBpbnNyYgkkMCwoJXJzaSksJXhtbTE1CisJbGVhcQktMSglcnNpKSwlcnNpCisJc3VicQkkMSwlcmN4CisJam56CTZiCisKK3Byb2Nlc3NfcGFydGlhbF9ibG9jazoKKworCWxlYXEJLmFuZF9tYXNrcyglcmlwKSwlcjE1CisJc2hscQkkNCwlcmJ4CisJcGFuZAktMTYoJXIxNSwlcmJ4KSwgJXhtbTE1CisuYnl0ZQkxMDIsNzcsMTUsMTI2LDI1MworCXBleHRycQkkMSwleG1tMTUsJXIxNAorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisKK2RvX2xlbmd0aF9ibG9jazoKKwlhZGRxCTMyKCVyYnApLCVyMTAKKwlhZGNxCTgrMzIoJXJicCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworCW1vdnEJJXIxMCwlcjEzCisJbW92cQklcjExLCVyMTQKKwltb3ZxCSVyMTIsJXIxNQorCXN1YnEJJC01LCVyMTAKKwlzYmJxCSQtMSwlcjExCisJc2JicQkkMywlcjEyCisJY21vdmNxCSVyMTMsJXIxMAorCWNtb3ZjcQklcjE0LCVyMTEKKwljbW92Y3EJJXIxNSwlcjEyCisKKwlhZGRxCTArMTYoJXJicCksJXIxMAorCWFkY3EJOCsxNiglcmJwKSwlcjExCisKKwlhZGRxCSQyODggKyAzMiwlcnNwCisKKwlwb3BxCSVyOQorCisJbW92cQklcjEwLDAoJXI5KQorCW1vdnEJJXIxMSw4KCVyOSkKKworCXBvcHEJJXIxNQorCisJcG9wcQklcjE0CisKKwlwb3BxCSVyMTMKKworCXBvcHEJJXIxMgorCisJcG9wcQklcmJ4CisKKwlwb3BxCSVyYnAKKworCS5ieXRlCTB4ZjMsMHhjMworCisKK3NlYWxfc3NlXzEyODoKKwltb3ZkcXUJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tMCwleG1tMgorCW1vdmRxdQkwKCVyOSksJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTUKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwltb3ZkcXUJMTYoJXI5KSwleG1tOAorCW1vdmRxYQkleG1tOCwleG1tOQorCW1vdmRxYQkleG1tOCwleG1tMTAKKwltb3ZkcXUJMzIoJXI5KSwleG1tMTQKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xMgorCW1vdmRxYQkleG1tMTIsJXhtbTEzCisJcGFkZGQJLnNzZV9pbmMoJXJpcCksJXhtbTEzCisJbW92ZHFhCSV4bW00LCV4bW03CisJbW92ZHFhCSV4bW04LCV4bW0xMQorCW1vdmRxYQkleG1tMTIsJXhtbTE1CisJbW92cQkkMTAsJXIxMAorMToKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTIKKwlwYWRkZAkleG1tMTIsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW00CisJcHhvcgkleG1tMywleG1tNAorCXBhZGRkCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMTIKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW00CisJcHhvcgkleG1tMywleG1tNAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyOCw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMjgsMTIKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTMKKwlwYWRkZAkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW05LCV4bW01CisJbW92ZHFhCSV4bW01LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW01CisJcHhvcgkleG1tMywleG1tNQorCXBhZGRkCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMTMKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQ3LCV4bW0zCisJcHNybGQJJDI1LCV4bW01CisJcHhvcgkleG1tMywleG1tNQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNyw0CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjAxLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMzcsMTIKKwlwYWRkZAkleG1tNiwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTE0CisJcHNodWZiCS5yb2wxNiglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkMTIsJXhtbTMKKwlwc3JsZAkkMjAsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sOCglcmlwKSwleG1tMTQKKwlwYWRkZAkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTYKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDYsNAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIxMCw4CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjQ2LDEyCisJcGFkZGQJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0xMgorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEyCisJcGFkZGQJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tOCwleG1tNAorCW1vdmRxYQkleG1tNCwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKwlwYWRkZAkleG1tNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMgorCXBhZGRkCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMjgsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwxOTIsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIyOCw0CisJcGFkZGQJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0xMworCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTEzCisJcGFkZGQJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tOSwleG1tNQorCW1vdmRxYQkleG1tNSwleG1tMworCXBzbGxkCSQxMiwleG1tMworCXBzcmxkCSQyMCwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwYWRkZAkleG1tNSwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTEzCisJcHNodWZiCS5yb2w4KCVyaXApLCV4bW0xMworCXBhZGRkCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTksJXhtbTUKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwc2xsZAkkNywleG1tMworCXBzcmxkCSQyNSwleG1tNQorCXB4b3IJJXhtbTMsJXhtbTUKKy5ieXRlCTEwMiwxNSw1OCwxNSwyMzcsMTIKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyMDEsOAorLmJ5dGUJMTAyLDY5LDE1LDU4LDE1LDIzNyw0CisJcGFkZGQJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0xNAorCXBzaHVmYgkucm9sMTYoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDEyLCV4bW0zCisJcHNybGQJJDIwLCV4bW02CisJcHhvcgkleG1tMywleG1tNgorCXBhZGRkCSV4bW02LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmIJLnJvbDgoJXJpcCksJXhtbTE0CisJcGFkZGQJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW02CisJbW92ZHFhCSV4bW02LCV4bW0zCisJcHNsbGQJJDcsJXhtbTMKKwlwc3JsZAkkMjUsJXhtbTYKKwlweG9yCSV4bW0zLCV4bW02CisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ2LDEyCisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMjEwLDgKKy5ieXRlCTEwMiw2OSwxNSw1OCwxNSwyNDYsNAorCisJZGVjcQklcjEwCisJam56CTFiCisJcGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleG1tMAorCXBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXhtbTEKKwlwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV4bW0yCisJcGFkZGQJJXhtbTcsJXhtbTQKKwlwYWRkZAkleG1tNywleG1tNQorCXBhZGRkCSV4bW03LCV4bW02CisJcGFkZGQJJXhtbTExLCV4bW04CisJcGFkZGQJJXhtbTExLCV4bW05CisJcGFkZGQJJXhtbTE1LCV4bW0xMgorCXBhZGRkCS5zc2VfaW5jKCVyaXApLCV4bW0xNQorCXBhZGRkCSV4bW0xNSwleG1tMTMKKworCXBhbmQJLmNsYW1wKCVyaXApLCV4bW0yCisJbW92ZHFhCSV4bW0yLDAoJXJicCkKKwltb3ZkcWEJJXhtbTYsMTYoJXJicCkKKworCW1vdnEJJXI4LCVyOAorCWNhbGwJcG9seV9oYXNoX2FkX2ludGVybmFsCisJam1wCXNlYWxfc3NlXzEyOF9zZWFsCisKKworCisKKy5wMmFsaWduCTYKK2NoYWNoYTIwX3BvbHkxMzA1X29wZW5fYXZ4MjoKKwl2emVyb3VwcGVyCisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdmJyb2FkY2FzdGkxMjgJMCglcjkpLCV5bW00CisJdmJyb2FkY2FzdGkxMjgJMTYoJXI5KSwleW1tOAorCXZicm9hZGNhc3RpMTI4CTMyKCVyOSksJXltbTEyCisJdnBhZGRkCS5hdngyX2luaXQoJXJpcCksJXltbTEyLCV5bW0xMgorCWNtcHEJJDE5MiwlcmJ4CisJamJlCW9wZW5fYXZ4Ml8xOTIKKwljbXBxCSQzMjAsJXJieAorCWpiZQlvcGVuX2F2eDJfMzIwCisKKwl2bW92ZHFhCSV5bW00LDY0KCVyYnApCisJdm1vdmRxYQkleW1tOCw5NiglcmJwKQorCXZtb3ZkcWEJJXltbTEyLDE2MCglcmJwKQorCW1vdnEJJDEwLCVyMTAKKzE6CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCisJZGVjcQklcjEwCisJam5lCTFiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTMKKworCXZwYW5kCS5jbGFtcCglcmlwKSwleW1tMywleW1tMworCXZtb3ZkcWEJJXltbTMsMCglcmJwKQorCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW00CisKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorCXhvcnEJJXJjeCwlcmN4CisKKzE6CisJYWRkcQkwKCVyc2ksJXJjeCksICVyMTAKKwlhZGNxCTgrMCglcnNpLCVyY3gpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWFkZHEJJDE2LCVyY3gKKwljbXBxCSQ2NCwlcmN4CisJam5lCTFiCisKKwl2cHhvcgkwKCVyc2kpLCV5bW0wLCV5bW0wCisJdnB4b3IJMzIoJXJzaSksJXltbTQsJXltbTQKKwl2bW92ZHF1CSV5bW0wLDAoJXJkaSkKKwl2bW92ZHF1CSV5bW00LDMyKCVyZGkpCisJbGVhcQk2NCglcnNpKSwlcnNpCisJbGVhcQk2NCglcmRpKSwlcmRpCisJc3VicQkkNjQsJXJieAorMToKKworCWNtcHEJJDUxMiwlcmJ4CisJamIJM2YKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2bW92ZHFhCTY0KCVyYnApLCV5bW00CisJdm1vdmRxYQk5NiglcmJwKSwleW1tOAorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW02CisJdm1vdmRxYQkleW1tOCwleW1tMTAKKwl2bW92ZHFhCSV5bW0wLCV5bW0zCisJdm1vdmRxYQkleW1tNCwleW1tNworCXZtb3ZkcWEJJXltbTgsJXltbTExCisJdm1vdmRxYQkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyCisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTE1CisJdnBhZGRkCSV5bW0xNSwleW1tMTIsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTIsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMTUsMjU2KCVyYnApCisJdm1vdmRxYQkleW1tMTQsMjI0KCVyYnApCisJdm1vdmRxYQkleW1tMTMsMTkyKCVyYnApCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisKKwl4b3JxCSVyY3gsJXJjeAorMjoKKwlhZGRxCTAqOCglcnNpLCVyY3gpLCAlcjEwCisJYWRjcQk4KzAqOCglcnNpLCVyY3gpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2bW92ZHFhCS5yb2wxNiglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwltb3ZxCTgrMCglcmJwKSwlcmR4CisJbXVseHEJJXIxMCwlcjEwLCVyYXgKKwlhZGRxCSVyMTAsJXIxNAorCW11bHhxCSVyMTEsJXIxMSwlcjkKKwlhZGNxCSVyMTEsJXIxNQorCWFkY3EJJDAsJXI5CisJaW11bHEJJXIxMiwlcmR4CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyMCwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjAsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDIwLCV5bW01LCV5bW04CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJdnBzbGxkCSQzMi0yMCwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJLnJvbDgoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwlhZGRxCTIqOCglcnNpLCVyY3gpLCAlcjEwCisJYWRjcQk4KzIqOCglcnNpLCVyY3gpLCAlcjExCisJYWRjcQkkMSwlcjEyCisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJbW92cQkwKzAoJXJicCksJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbXVseHEJJXIxMCwlcjEzLCVyMTQKKwltdWx4cQklcjExLCVyYXgsJXJkeAorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjUsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDI1LCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyNSwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjUsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkMTIsJXltbTE1LCV5bW0xNSwleW1tMTUKKwl2cGFsaWducgkkNCwleW1tNiwleW1tNiwleW1tNgorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQ0LCV5bW01LCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2bW92ZHFhCS5yb2wxNiglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyMCwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCWFkZHEJNCo4KCVyc2ksJXJjeCksICVyMTAKKwlhZGNxCTgrNCo4KCVyc2ksJXJjeCksICVyMTEKKwlhZGNxCSQxLCVyMTIKKworCWxlYXEJNDgoJXJjeCksJXJjeAorCXZwc3JsZAkkMjAsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDIwLCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJLnJvbDgoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJbW92cQkwKzAoJXJicCksJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbXVseHEJJXIxMCwlcjEzLCVyMTQKKwltdWx4cQklcjExLCVyYXgsJXJkeAorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwltb3ZxCTgrMCglcmJwKSwlcmR4CisJbXVseHEJJXIxMCwlcjEwLCVyYXgKKwlhZGRxCSVyMTAsJXIxNAorCW11bHhxCSVyMTEsJXIxMSwlcjkKKwlhZGNxCSVyMTEsJXIxNQorCWFkY3EJJDAsJXI5CisJaW11bHEJJXIxMiwlcmR4CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjUsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW03LCV5bW03CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDI1LCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyNSwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjUsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNywleW1tNywleW1tNworCXZwYWxpZ25yCSQ4LCV5bW0xMSwleW1tMTEsJXltbTExCisJdnBhbGlnbnIJJDQsJXltbTE1LCV5bW0xNSwleW1tMTUKKwl2cGFsaWducgkkMTIsJXltbTYsJXltbTYsJXltbTYKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQ0LCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDEyLCV5bW01LCV5bW01LCV5bW01CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKworCWNtcHEJJDYwKjgsJXJjeAorCWpuZQkyYgorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0zLCV5bW0zCisJdnBhZGRkCTY0KCVyYnApLCV5bW03LCV5bW03CisJdnBhZGRkCTk2KCVyYnApLCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJMjU2KCVyYnApLCV5bW0xNSwleW1tMTUKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMiwleW1tMgorCXZwYWRkZAk2NCglcmJwKSwleW1tNiwleW1tNgorCXZwYWRkZAk5NiglcmJwKSwleW1tMTAsJXltbTEwCisJdnBhZGRkCTIyNCglcmJwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTEsJXltbTEKKwl2cGFkZGQJNjQoJXJicCksJXltbTUsJXltbTUKKwl2cGFkZGQJOTYoJXJicCksJXltbTksJXltbTkKKwl2cGFkZGQJMTkyKCVyYnApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCisJdm1vdmRxYQkleW1tMCwxMjgoJXJicCkKKwlhZGRxCTYwKjgoJXJzaSksJXIxMAorCWFkY3EJOCs2MCo4KCVyc2kpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0zLCV5bW03LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMywleW1tNywleW1tNworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTExLCV5bW0xNSwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTExLCV5bW0xNSwleW1tMTEKKwl2cHhvcgkwKzAoJXJzaSksJXltbTAsJXltbTAKKwl2cHhvcgkzMiswKCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJNjQrMCglcnNpKSwleW1tNywleW1tNworCXZweG9yCTk2KzAoJXJzaSksJXltbTExLCV5bW0xMQorCXZtb3ZkcXUJJXltbTAsMCswKCVyZGkpCisJdm1vdmRxdQkleW1tMywzMiswKCVyZGkpCisJdm1vdmRxdQkleW1tNyw2NCswKCVyZGkpCisJdm1vdmRxdQkleW1tMTEsOTYrMCglcmRpKQorCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTAKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0yLCV5bW02LCV5bW02CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTAsJXltbTE0LCV5bW0yCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTAsJXltbTE0LCV5bW0xMAorCXZweG9yCTArMTI4KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMTI4KCVyc2kpLCV5bW0yLCV5bW0yCisJdnB4b3IJNjQrMTI4KCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJOTYrMTI4KCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CSV5bW0zLDArMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMiwzMisxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW02LDY0KzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzEyOCglcmRpKQorCWFkZHEJNjAqOCsxNiglcnNpKSwlcjEwCisJYWRjcQk4KzYwKjgrMTYoJXJzaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMjU2KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMjU2KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJNjQrMjU2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMjU2KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzI1NiglcmRpKQorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tMAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW04CisJdnB4b3IJMCszODQoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMiszODQoJXJzaSksJXltbTAsJXltbTAKKwl2cHhvcgk2NCszODQoJXJzaSksJXltbTQsJXltbTQKKwl2cHhvcgk5NiszODQoJXJzaSksJXltbTgsJXltbTgKKwl2bW92ZHF1CSV5bW0zLDArMzg0KCVyZGkpCisJdm1vdmRxdQkleW1tMCwzMiszODQoJXJkaSkKKwl2bW92ZHF1CSV5bW00LDY0KzM4NCglcmRpKQorCXZtb3ZkcXUJJXltbTgsOTYrMzg0KCVyZGkpCisKKwlsZWFxCTUxMiglcnNpKSwlcnNpCisJbGVhcQk1MTIoJXJkaSksJXJkaQorCXN1YnEJJDUxMiwlcmJ4CisJam1wCTFiCiszOgorCXRlc3RxCSVyYngsJXJieAorCXZ6ZXJvdXBwZXIKKwlqZQlvcGVuX3NzZV9maW5hbGl6ZQorMzoKKwljbXBxCSQxMjgsJXJieAorCWphCTNmCisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKworCXhvcnEJJXI4LCVyOAorCW1vdnEJJXJieCwlcmN4CisJYW5kcQkkLTE2LCVyY3gKKwl0ZXN0cQklcmN4LCVyY3gKKwlqZQkyZgorMToKKwlhZGRxCTAqOCglcnNpLCVyOCksICVyMTAKKwlhZGNxCTgrMCo4KCVyc2ksJXI4KSwgJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKzI6CisJYWRkcQkkMTYsJXI4CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCisJY21wcQklcmN4LCVyOAorCWpiCTFiCisJY21wcQkkMTYwLCVyOAorCWpuZQkyYgorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTMsJXltbTgKKworCWptcAlvcGVuX2F2eDJfdGFpbF9sb29wCiszOgorCWNtcHEJJDI1NiwlcmJ4CisJamEJM2YKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2bW92ZHFhCTY0KCVyYnApLCV5bW00CisJdm1vdmRxYQk5NiglcmJwKSwleW1tOAorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJLmF2eDJfaW5jKCVyaXApLCV5bW0xMgorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTEyLDE2MCglcmJwKQorCXZtb3ZkcWEJJXltbTEzLDE5MiglcmJwKQorCisJbW92cQklcmJ4LDEyOCglcmJwKQorCW1vdnEJJXJieCwlcmN4CisJc3VicQkkMTI4LCVyY3gKKwlzaHJxCSQ0LCVyY3gKKwltb3ZxCSQxMCwlcjgKKwljbXBxCSQxMCwlcmN4CisJY21vdmdxCSVyOCwlcmN4CisJbW92cQklcnNpLCVyYngKKwl4b3JxCSVyOCwlcjgKKzE6CisJYWRkcQkwKCVyYngpLCVyMTAKKwlhZGNxCTgrMCglcmJ4KSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbXVseHEJJXIxMCwlcjEzLCVyMTQKKwltdWx4cQklcjExLCVyYXgsJXJkeAorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmR4CisJbXVseHEJJXIxMCwlcjEwLCVyYXgKKwlhZGRxCSVyMTAsJXIxNAorCW11bHhxCSVyMTEsJXIxMSwlcjkKKwlhZGNxCSVyMTEsJXIxNQorCWFkY3EJJDAsJXI5CisJaW11bHEJJXIxMiwlcmR4CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyYngpLCVyYngKKzI6CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTUsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzbGxkCSQ3LCV5bW01LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCisJaW5jcQklcjgKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNSwleW1tMworCXZwc2xsZAkkMTIsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNsbGQJJDcsJXltbTUsJXltbTMKKwl2cHNybGQJJDI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFsaWducgkkNCwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW01LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNybGQJJDIwLCV5bW02LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc2xsZAkkNywleW1tNiwleW1tMworCXZwc3JsZAkkMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWxpZ25yCSQ0LCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTYsJXltbTYsJXltbTYKKworCWNtcHEJJXJjeCwlcjgKKwlqYgkxYgorCWNtcHEJJDEwLCVyOAorCWpuZQkyYgorCW1vdnEJJXJieCwlcjgKKwlzdWJxCSVyc2ksJXJieAorCW1vdnEJJXJieCwlcmN4CisJbW92cQkxMjgoJXJicCksJXJieAorMToKKwlhZGRxCSQxNiwlcmN4CisJY21wcQklcmJ4LCVyY3gKKwlqZwkxZgorCWFkZHEJMCglcjgpLCVyMTAKKwlhZGNxCTgrMCglcjgpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXI4KSwlcjgKKwlqbXAJMWIKKzE6CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTEsJXltbTEKKwl2cGFkZGQJNjQoJXJicCksJXltbTUsJXltbTUKKwl2cGFkZGQJOTYoJXJicCksJXltbTksJXltbTkKKwl2cGFkZGQJMTkyKCVyYnApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKzAoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMCglcnNpKSwleW1tOSwleW1tOQorCXZtb3ZkcXUJJXltbTMsMCswKCVyZGkpCisJdm1vdmRxdQkleW1tMSwzMiswKCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCswKCVyZGkpCisJdm1vdmRxdQkleW1tOSw5NiswKCVyZGkpCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTMsJXltbTgKKworCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisJc3VicQkkMTI4LCVyYngKKwlqbXAJb3Blbl9hdngyX3RhaWxfbG9vcAorMzoKKwljbXBxCSQzODQsJXJieAorCWphCTNmCisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW0wLCV5bW0yCisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdm1vdmRxYQkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyCisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTIsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisJdm1vdmRxYQkleW1tMTMsMTkyKCVyYnApCisJdm1vdmRxYQkleW1tMTQsMjI0KCVyYnApCisKKwltb3ZxCSVyYngsMTI4KCVyYnApCisJbW92cQklcmJ4LCVyY3gKKwlzdWJxCSQyNTYsJXJjeAorCXNocnEJJDQsJXJjeAorCWFkZHEJJDYsJXJjeAorCW1vdnEJJDEwLCVyOAorCWNtcHEJJDEwLCVyY3gKKwljbW92Z3EJJXI4LCVyY3gKKwltb3ZxCSVyc2ksJXJieAorCXhvcnEJJXI4LCVyOAorMToKKwlhZGRxCTAoJXJieCksJXIxMAorCWFkY3EJOCswKCVyYngpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXJieCksJXJieAorMjoKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDEyLCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tNiwleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNSwleW1tMworCXZwc2xsZAkkMTIsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNsbGQJJDcsJXltbTUsJXltbTMKKwl2cHNybGQJJDI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFsaWducgkkMTIsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQ0LCV5bW01LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwlhZGRxCTAoJXJieCksJXIxMAorCWFkY3EJOCswKCVyYngpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmJ4KSwlcmJ4CisJaW5jcQklcjgKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNSwleW1tMworCXZwc2xsZAkkMTIsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNsbGQJJDcsJXltbTUsJXltbTMKKwl2cHNybGQJJDI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFsaWducgkkNCwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW01LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKworCWNtcHEJJXJjeCwlcjgKKwlqYgkxYgorCWNtcHEJJDEwLCVyOAorCWpuZQkyYgorCW1vdnEJJXJieCwlcjgKKwlzdWJxCSVyc2ksJXJieAorCW1vdnEJJXJieCwlcmN4CisJbW92cQkxMjgoJXJicCksJXJieAorMToKKwlhZGRxCSQxNiwlcmN4CisJY21wcQklcmJ4LCVyY3gKKwlqZwkxZgorCWFkZHEJMCglcjgpLCVyMTAKKwlhZGNxCTgrMCglcjgpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXI4KSwlcjgKKwlqbXAJMWIKKzE6CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTIsJXltbTIKKwl2cGFkZGQJNjQoJXJicCksJXltbTYsJXltbTYKKwl2cGFkZGQJOTYoJXJicCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQoJXJicCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0xLCV5bW0xCisJdnBhZGRkCTY0KCVyYnApLCV5bW01LCV5bW01CisJdnBhZGRkCTk2KCVyYnApLCV5bW05LCV5bW05CisJdnBhZGRkCTE5MiglcmJwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0yLCV5bW02LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMiwleW1tNiwleW1tNgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEwLCV5bW0xNCwleW1tMgorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEwLCV5bW0xNCwleW1tMTAKKwl2cHhvcgkwKzAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMiswKCVyc2kpLCV5bW0yLCV5bW0yCisJdnB4b3IJNjQrMCglcnNpKSwleW1tNiwleW1tNgorCXZweG9yCTk2KzAoJXJzaSksJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJJXltbTMsMCswKCVyZGkpCisJdm1vdmRxdQkleW1tMiwzMiswKCVyZGkpCisJdm1vdmRxdQkleW1tNiw2NCswKCVyZGkpCisJdm1vdmRxdQkleW1tMTAsOTYrMCglcmRpKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMTI4KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMTI4KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJNjQrMTI4KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMTI4KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzEyOCglcmRpKQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTMKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0zLCV5bW04CisKKwlsZWFxCTI1NiglcnNpKSwlcnNpCisJbGVhcQkyNTYoJXJkaSksJXJkaQorCXN1YnEJJDI1NiwlcmJ4CisJam1wCW9wZW5fYXZ4Ml90YWlsX2xvb3AKKzM6CisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW0wLCV5bW0yCisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdm1vdmRxYQkleW1tMCwleW1tMworCXZtb3ZkcWEJJXltbTQsJXltbTcKKwl2bW92ZHFhCSV5bW04LCV5bW0xMQorCXZtb3ZkcWEJLmF2eDJfaW5jKCVyaXApLCV5bW0xMgorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xNQorCXZwYWRkZAkleW1tMTUsJXltbTEyLCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEyLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTE1LDI1NiglcmJwKQorCXZtb3ZkcWEJJXltbTE0LDIyNCglcmJwKQorCXZtb3ZkcWEJJXltbTEzLDE5MiglcmJwKQorCXZtb3ZkcWEJJXltbTEyLDE2MCglcmJwKQorCisJeG9ycQklcmN4LCVyY3gKKwltb3ZxCSVyc2ksJXI4CisxOgorCWFkZHEJMCglcjgpLCVyMTAKKwlhZGNxCTgrMCglcjgpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcjgpLCVyOAorMjoKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCWFkZHEJMCglcjgpLCVyMTAKKwlhZGNxCTgrMCglcjgpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjUsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDI1LCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyNSwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjUsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkMTIsJXltbTE1LCV5bW0xNSwleW1tMTUKKwl2cGFsaWducgkkNCwleW1tNiwleW1tNiwleW1tNgorCXZwYWxpZ25yCSQ4LCV5bW0xMCwleW1tMTAsJXltbTEwCisJdnBhbGlnbnIJJDEyLCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCWFkZHEJMTYoJXI4KSwlcjEwCisJYWRjcQk4KzE2KCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkzMiglcjgpLCVyOAorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkNCwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCXZwYWxpZ25yCSQ4LCV5bW0xMCwleW1tMTAsJXltbTEwCisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCisJaW5jcQklcmN4CisJY21wcQkkNCwlcmN4CisJamwJMWIKKwljbXBxCSQxMCwlcmN4CisJam5lCTJiCisJbW92cQklcmJ4LCVyY3gKKwlzdWJxCSQzODQsJXJjeAorCWFuZHEJJC0xNiwlcmN4CisxOgorCXRlc3RxCSVyY3gsJXJjeAorCWplCTFmCisJYWRkcQkwKCVyOCksJXIxMAorCWFkY3EJOCswKCVyOCksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcjgpLCVyOAorCXN1YnEJJDE2LCVyY3gKKwlqbXAJMWIKKzE6CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTMsJXltbTMKKwl2cGFkZGQJNjQoJXJicCksJXltbTcsJXltbTcKKwl2cGFkZGQJOTYoJXJicCksJXltbTExLCV5bW0xMQorCXZwYWRkZAkyNTYoJXJicCksJXltbTE1LCV5bW0xNQorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCTY0KCVyYnApLCV5bW02LCV5bW02CisJdnBhZGRkCTk2KCVyYnApLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAk2NCglcmJwKSwleW1tNSwleW1tNQorCXZwYWRkZAk5NiglcmJwKSwleW1tOSwleW1tOQorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisKKwl2bW92ZHFhCSV5bW0wLDEyOCglcmJwKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTMsJXltbTcsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0zLCV5bW03LCV5bW03CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTEsJXltbTE1LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTEsJXltbTE1LCV5bW0xMQorCXZweG9yCTArMCglcnNpKSwleW1tMCwleW1tMAorCXZweG9yCTMyKzAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW03LCV5bW03CisJdnB4b3IJOTYrMCglcnNpKSwleW1tMTEsJXltbTExCisJdm1vdmRxdQkleW1tMCwwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW03LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSw5NiswKCVyZGkpCisKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0yLCV5bW02LCV5bW02CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTAsJXltbTE0LCV5bW0yCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTAsJXltbTE0LCV5bW0xMAorCXZweG9yCTArMTI4KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMTI4KCVyc2kpLCV5bW0yLCV5bW0yCisJdnB4b3IJNjQrMTI4KCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJOTYrMTI4KCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CSV5bW0zLDArMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMiwzMisxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW02LDY0KzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzEyOCglcmRpKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMjU2KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMjU2KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJNjQrMjU2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMjU2KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzI1NiglcmRpKQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTMKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0zLCV5bW04CisKKwlsZWFxCTM4NCglcnNpKSwlcnNpCisJbGVhcQkzODQoJXJkaSksJXJkaQorCXN1YnEJJDM4NCwlcmJ4CitvcGVuX2F2eDJfdGFpbF9sb29wOgorCWNtcHEJJDMyLCVyYngKKwlqYglvcGVuX2F2eDJfdGFpbAorCXN1YnEJJDMyLCVyYngKKwl2cHhvcgkoJXJzaSksJXltbTAsJXltbTAKKwl2bW92ZHF1CSV5bW0wLCglcmRpKQorCWxlYXEJMzIoJXJzaSksJXJzaQorCWxlYXEJMzIoJXJkaSksJXJkaQorCXZtb3ZkcWEJJXltbTQsJXltbTAKKwl2bW92ZHFhCSV5bW04LCV5bW00CisJdm1vdmRxYQkleW1tMTIsJXltbTgKKwlqbXAJb3Blbl9hdngyX3RhaWxfbG9vcAorb3Blbl9hdngyX3RhaWw6CisJY21wcQkkMTYsJXJieAorCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKwlqYgkxZgorCXN1YnEJJDE2LCVyYngKKworCXZweG9yCSglcnNpKSwleG1tMCwleG1tMQorCXZtb3ZkcXUJJXhtbTEsKCVyZGkpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJbGVhcQkxNiglcmRpKSwlcmRpCisJdnBlcm0yaTEyOAkkMHgxMSwleW1tMCwleW1tMCwleW1tMAorCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKzE6CisJdnplcm91cHBlcgorCWptcAlvcGVuX3NzZV90YWlsXzE2CisKK29wZW5fYXZ4Ml8xOTI6CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZwYWRkZAkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyLCV5bW0xMworCXZtb3ZkcWEJJXltbTEyLCV5bW0xMQorCXZtb3ZkcWEJJXltbTEzLCV5bW0xNQorCW1vdnEJJDEwLCVyMTAKKzE6CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTUsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzbGxkCSQ3LCV5bW01LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKworCWRlY3EJJXIxMAorCWpuZQkxYgorCXZwYWRkZAkleW1tMiwleW1tMCwleW1tMAorCXZwYWRkZAkleW1tMiwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNiwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNiwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tMTAsJXltbTgsJXltbTgKKwl2cGFkZGQJJXltbTEwLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xNSwleW1tMTMsJXltbTEzCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCisJdnBhbmQJLmNsYW1wKCVyaXApLCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMywwKCVyYnApCisKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xLCV5bW01LCV5bW04CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMSwleW1tNSwleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW01CitvcGVuX2F2eDJfc2hvcnQ6CisJbW92cQklcjgsJXI4CisJY2FsbAlwb2x5X2hhc2hfYWRfaW50ZXJuYWwKK29wZW5fYXZ4Ml9oYXNoX2FuZF94b3JfbG9vcDoKKwljbXBxCSQzMiwlcmJ4CisJamIJb3Blbl9hdngyX3Nob3J0X3RhaWxfMzIKKwlzdWJxCSQzMiwlcmJ4CisJYWRkcQkwKCVyc2kpLCVyMTAKKwlhZGNxCTgrMCglcnNpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCTE2KCVyc2kpLCVyMTAKKwlhZGNxCTgrMTYoJXJzaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKworCXZweG9yCSglcnNpKSwleW1tMCwleW1tMAorCXZtb3ZkcXUJJXltbTAsKCVyZGkpCisJbGVhcQkzMiglcnNpKSwlcnNpCisJbGVhcQkzMiglcmRpKSwlcmRpCisKKwl2bW92ZHFhCSV5bW00LCV5bW0wCisJdm1vdmRxYQkleW1tOCwleW1tNAorCXZtb3ZkcWEJJXltbTEyLCV5bW04CisJdm1vdmRxYQkleW1tMSwleW1tMTIKKwl2bW92ZHFhCSV5bW01LCV5bW0xCisJdm1vdmRxYQkleW1tOSwleW1tNQorCXZtb3ZkcWEJJXltbTEzLCV5bW05CisJdm1vdmRxYQkleW1tMiwleW1tMTMKKwl2bW92ZHFhCSV5bW02LCV5bW0yCisJam1wCW9wZW5fYXZ4Ml9oYXNoX2FuZF94b3JfbG9vcAorb3Blbl9hdngyX3Nob3J0X3RhaWxfMzI6CisJY21wcQkkMTYsJXJieAorCXZtb3ZkcWEJJXhtbTAsJXhtbTEKKwlqYgkxZgorCXN1YnEJJDE2LCVyYngKKwlhZGRxCTAoJXJzaSksJXIxMAorCWFkY3EJOCswKCVyc2kpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJdnB4b3IJKCVyc2kpLCV4bW0wLCV4bW0zCisJdm1vdmRxdQkleG1tMywoJXJkaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwl2ZXh0cmFjdGkxMjgJJDEsJXltbTAsJXhtbTEKKzE6CisJdnplcm91cHBlcgorCWptcAlvcGVuX3NzZV90YWlsXzE2CisKK29wZW5fYXZ4Ml8zMjA6CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZwYWRkZAkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyLCV5bW0xMworCXZwYWRkZAkuYXZ4Ml9pbmMoJXJpcCksJXltbTEzLCV5bW0xNAorCXZtb3ZkcWEJJXltbTQsJXltbTcKKwl2bW92ZHFhCSV5bW04LCV5bW0xMQorCXZtb3ZkcWEJJXltbTEyLDE2MCglcmJwKQorCXZtb3ZkcWEJJXltbTEzLDE5MiglcmJwKQorCXZtb3ZkcWEJJXltbTE0LDIyNCglcmJwKQorCW1vdnEJJDEwLCVyMTAKKzE6CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTUsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzbGxkCSQ3LCV5bW01LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNiwleW1tMworCXZwc2xsZAkkMTIsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNsbGQJJDcsJXltbTYsJXltbTMKKwl2cHNybGQJJDI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTUsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzbGxkCSQ3LCV5bW01LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkOCwleW1tOSwleW1tOSwleW1tOQorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNiwleW1tMworCXZwc2xsZAkkMTIsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNsbGQJJDcsJXltbTYsJXltbTMKKwl2cHNybGQJJDI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQ4LCV5bW0xMCwleW1tMTAsJXltbTEwCisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisKKwlkZWNxCSVyMTAKKwlqbmUJMWIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0xLCV5bW0xCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTcsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTcsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTcsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTExLCV5bW04LCV5bW04CisJdnBhZGRkCSV5bW0xMSwleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTEsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkyMjQoJXJicCksJXltbTE0LCV5bW0xNAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTMKKworCXZwYW5kCS5jbGFtcCglcmlwKSwleW1tMywleW1tMworCXZtb3ZkcWEJJXltbTMsMCglcmJwKQorCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW00CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMSwleW1tNSwleW1tOAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTksJXltbTEzLCV5bW0xMgorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEsJXltbTUsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tNQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTkKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMCwleW1tMTQsJXltbTEzCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMiwleW1tNiwleW1tMgorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEwLCV5bW0xNCwleW1tNgorCWptcAlvcGVuX2F2eDJfc2hvcnQKKworCisKKworLnAyYWxpZ24JNgorY2hhY2hhMjBfcG9seTEzMDVfc2VhbF9hdngyOgorCXZ6ZXJvdXBwZXIKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2YnJvYWRjYXN0aTEyOAkwKCVyOSksJXltbTQKKwl2YnJvYWRjYXN0aTEyOAkxNiglcjkpLCV5bW04CisJdmJyb2FkY2FzdGkxMjgJMzIoJXI5KSwleW1tMTIKKwl2cGFkZGQJLmF2eDJfaW5pdCglcmlwKSwleW1tMTIsJXltbTEyCisJY21wcQkkMTkyLCVyYngKKwlqYmUJc2VhbF9hdngyXzE5MgorCWNtcHEJJDMyMCwlcmJ4CisJamJlCXNlYWxfYXZ4Ml8zMjAKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTAsJXltbTMKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTQsJXltbTcKKwl2bW92ZHFhCSV5bW00LDY0KCVyYnApCisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCSV5bW04LDk2KCVyYnApCisJdm1vdmRxYQkleW1tMTIsJXltbTE1CisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTUsJXltbTE0CisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTQsJXltbTEzCisJdnBhZGRkCS5hdngyX2luYyglcmlwKSwleW1tMTMsJXltbTEyCisJdm1vdmRxYQkleW1tMTIsMTYwKCVyYnApCisJdm1vdmRxYQkleW1tMTMsMTkyKCVyYnApCisJdm1vdmRxYQkleW1tMTQsMjI0KCVyYnApCisJdm1vdmRxYQkleW1tMTUsMjU2KCVyYnApCisJbW92cQkkMTAsJXIxMAorMToKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyNSwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjUsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDI1LCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQ0LCV5bW0xNSwleW1tMTUsJXltbTE1CisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisKKwlkZWNxCSVyMTAKKwlqbnoJMWIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMywleW1tMworCXZwYWRkZAk2NCglcmJwKSwleW1tNywleW1tNworCXZwYWRkZAk5NiglcmJwKSwleW1tMTEsJXltbTExCisJdnBhZGRkCTI1NiglcmJwKSwleW1tMTUsJXltbTE1CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTIsJXltbTIKKwl2cGFkZGQJNjQoJXJicCksJXltbTYsJXltbTYKKwl2cGFkZGQJOTYoJXJicCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQoJXJicCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0xLCV5bW0xCisJdnBhZGRkCTY0KCVyYnApLCV5bW01LCV5bW01CisJdnBhZGRkCTk2KCVyYnApLCV5bW05LCV5bW05CisJdnBhZGRkCTE5MiglcmJwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTExLCV5bW0xNSwleW1tMTEKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0zLCV5bW03LCV5bW0xNQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTMsJXltbTcsJXltbTMKKwl2cGFuZAkuY2xhbXAoJXJpcCksJXltbTE1LCV5bW0xNQorCXZtb3ZkcWEJJXltbTE1LDAoJXJicCkKKwltb3ZxCSVyOCwlcjgKKwljYWxsCXBvbHlfaGFzaF9hZF9pbnRlcm5hbAorCisJdnB4b3IJMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKCVyc2kpLCV5bW0xMSwleW1tMTEKKwl2bW92ZHF1CSV5bW0zLDAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSwzMiglcmRpKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTE1CisJdnBlcm0yaTEyOAkkMHgxMywleW1tMiwleW1tNiwleW1tNgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEwLCV5bW0xNCwleW1tMgorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTEwLCV5bW0xNCwleW1tMTAKKwl2cHhvcgkwKzY0KCVyc2kpLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkzMis2NCglcnNpKSwleW1tMiwleW1tMgorCXZweG9yCTY0KzY0KCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJOTYrNjQoJXJzaSksJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJJXltbTE1LDArNjQoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKzY0KCVyZGkpCisJdm1vdmRxdQkleW1tNiw2NCs2NCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzY0KCVyZGkpCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMSwleW1tNSwleW1tMTUKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMTkyKCVyc2kpLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkzMisxOTIoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCsxOTIoJXJzaSksJXltbTUsJXltbTUKKwl2cHhvcgk5NisxOTIoJXJzaSksJXltbTksJXltbTkKKwl2bW92ZHF1CSV5bW0xNSwwKzE5MiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMTkyKCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsxOTIoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzE5MiglcmRpKQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTE1CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTgsJXltbTEyLCV5bW00CisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMTUsJXltbTgKKworCWxlYXEJMzIwKCVyc2kpLCVyc2kKKwlzdWJxCSQzMjAsJXJieAorCW1vdnEJJDMyMCwlcmN4CisJY21wcQkkMTI4LCVyYngKKwlqYmUJc2VhbF9hdngyX2hhc2gKKwl2cHhvcgkwKCVyc2kpLCV5bW0wLCV5bW0wCisJdnB4b3IJMzIoJXJzaSksJXltbTQsJXltbTQKKwl2cHhvcgk2NCglcnNpKSwleW1tOCwleW1tOAorCXZweG9yCTk2KCVyc2kpLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CSV5bW0wLDMyMCglcmRpKQorCXZtb3ZkcXUJJXltbTQsMzUyKCVyZGkpCisJdm1vdmRxdQkleW1tOCwzODQoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMiw0MTYoJXJkaSkKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJc3VicQkkMTI4LCVyYngKKwltb3ZxCSQ4LCVyY3gKKwltb3ZxCSQyLCVyOAorCWNtcHEJJDEyOCwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzEyOAorCWNtcHEJJDI1NiwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzI1NgorCWNtcHEJJDM4NCwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzM4NAorCWNtcHEJJDUxMiwlcmJ4CisJamJlCXNlYWxfYXZ4Ml90YWlsXzUxMgorCXZtb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMAorCXZtb3ZkcWEJNjQoJXJicCksJXltbTQKKwl2bW92ZHFhCTk2KCVyYnApLCV5bW04CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTQsJXltbTYKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZtb3ZkcWEJJXltbTAsJXltbTMKKwl2bW92ZHFhCSV5bW00LCV5bW03CisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTUKKwl2cGFkZGQJJXltbTE1LCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xNSwyNTYoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyNSwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjUsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDI1LCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQ0LCV5bW0xNSwleW1tMTUsJXltbTE1CisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2bW92ZHFhCS5yb2wxNiglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyMCwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjAsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDIwLCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyMCwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJLnJvbDgoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKworCXN1YnEJJDE2LCVyZGkKKwltb3ZxCSQ5LCVyY3gKKwlqbXAJNGYKKzE6CisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW0wLCV5bW0yCisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTEwCisJdm1vdmRxYQkleW1tMCwleW1tMworCXZtb3ZkcWEJJXltbTQsJXltbTcKKwl2bW92ZHFhCSV5bW04LCV5bW0xMQorCXZtb3ZkcWEJLmF2eDJfaW5jKCVyaXApLCV5bW0xMgorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xNQorCXZwYWRkZAkleW1tMTUsJXltbTEyLCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEyLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTE1LDI1NiglcmJwKQorCXZtb3ZkcWEJJXltbTE0LDIyNCglcmJwKQorCXZtb3ZkcWEJJXltbTEzLDE5MiglcmJwKQorCXZtb3ZkcWEJJXltbTEyLDE2MCglcmJwKQorCisJbW92cQkkMTAsJXJjeAorMjoKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCis0OgorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCWFkZHEJMTYoJXJkaSksJXIxMAorCWFkY3EJOCsxNiglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJbW92cQkwKzAoJXJicCksJXJkeAorCW1vdnEJJXJkeCwlcjE1CisJbXVseHEJJXIxMCwlcjEzLCVyMTQKKwltdWx4cQklcjExLCVyYXgsJXJkeAorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjUsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDI1LCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyNSwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjUsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkMTIsJXltbTE1LCV5bW0xNSwleW1tMTUKKwl2cGFsaWducgkkNCwleW1tNiwleW1tNiwleW1tNgorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQ0LCV5bW01LCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkNCwleW1tNCwleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW0xMiwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2bW92ZHFhCS5yb2wxNiglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0zLCV5bW0xNSwleW1tMTUKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwl2cHNodWZiCSV5bW04LCV5bW0xNSwleW1tMTUKKwl2cHNodWZiCSV5bW04LCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCSV5bW04LCV5bW0xMywleW1tMTMKKwl2cHNodWZiCSV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tOAorCXZwYWRkZAkleW1tMTUsJXltbTExLCV5bW0xMQorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnB4b3IJJXltbTExLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyMCwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCWFkZHEJMzIoJXJkaSksJXIxMAorCWFkY3EJOCszMiglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisKKwlsZWFxCTQ4KCVyZGkpLCVyZGkKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCS5yb2w4KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNywleW1tNworCWFkZHEJJXJheCwlcjE1CisJYWRjcQklcmR4LCVyOQorCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyNSwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjUsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDI1LCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQ0LCV5bW0xNSwleW1tMTUsJXltbTE1CisJdnBhbGlnbnIJJDEyLCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tMTQsJXltbTE0LCV5bW0xNAorCXZwYWxpZ25yCSQxMiwleW1tNSwleW1tNSwleW1tNQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTEzLCV5bW0xMywleW1tMTMKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisKKwlkZWNxCSVyY3gKKwlqbmUJMmIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMywleW1tMworCXZwYWRkZAk2NCglcmJwKSwleW1tNywleW1tNworCXZwYWRkZAk5NiglcmJwKSwleW1tMTEsJXltbTExCisJdnBhZGRkCTI1NiglcmJwKSwleW1tMTUsJXltbTE1CisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTIsJXltbTIKKwl2cGFkZGQJNjQoJXJicCksJXltbTYsJXltbTYKKwl2cGFkZGQJOTYoJXJicCksJXltbTEwLCV5bW0xMAorCXZwYWRkZAkyMjQoJXJicCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0xLCV5bW0xCisJdnBhZGRkCTY0KCVyYnApLCV5bW01LCV5bW01CisJdnBhZGRkCTk2KCVyYnApLCV5bW05LCV5bW05CisJdnBhZGRkCTE5MiglcmJwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJNjQoJXJicCksJXltbTQsJXltbTQKKwl2cGFkZGQJOTYoJXJicCksJXltbTgsJXltbTgKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKworCWxlYXEJMzIoJXJkaSksJXJkaQorCXZtb3ZkcWEJJXltbTAsMTI4KCVyYnApCisJYWRkcQktMzIoJXJkaSksJXIxMAorCWFkY3EJOCstMzIoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTMsJXltbTcsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0zLCV5bW03LCV5bW03CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTEsJXltbTE1LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTEsJXltbTE1LCV5bW0xMQorCXZweG9yCTArMCglcnNpKSwleW1tMCwleW1tMAorCXZweG9yCTMyKzAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW03LCV5bW03CisJdnB4b3IJOTYrMCglcnNpKSwleW1tMTEsJXltbTExCisJdm1vdmRxdQkleW1tMCwwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW03LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSw5NiswKCVyZGkpCisKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tMAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMiwleW1tNiwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTYKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMCwleW1tMTQsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTEwCisJdnB4b3IJMCsxMjgoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMisxMjgoJXJzaSksJXltbTIsJXltbTIKKwl2cHhvcgk2NCsxMjgoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgk5NisxMjgoJXJzaSksJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJJXltbTMsMCsxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDMyKzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTYsNjQrMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMTAsOTYrMTI4KCVyZGkpCisJYWRkcQktMTYoJXJkaSksJXIxMAorCWFkY3EJOCstMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMjU2KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMjU2KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJNjQrMjU2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMjU2KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzI1NiglcmRpKQorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tMAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW04CisJdnB4b3IJMCszODQoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgkzMiszODQoJXJzaSksJXltbTAsJXltbTAKKwl2cHhvcgk2NCszODQoJXJzaSksJXltbTQsJXltbTQKKwl2cHhvcgk5NiszODQoJXJzaSksJXltbTgsJXltbTgKKwl2bW92ZHF1CSV5bW0zLDArMzg0KCVyZGkpCisJdm1vdmRxdQkleW1tMCwzMiszODQoJXJkaSkKKwl2bW92ZHF1CSV5bW00LDY0KzM4NCglcmRpKQorCXZtb3ZkcXUJJXltbTgsOTYrMzg0KCVyZGkpCisKKwlsZWFxCTUxMiglcnNpKSwlcnNpCisJc3VicQkkNTEyLCVyYngKKwljbXBxCSQ1MTIsJXJieAorCWpnCTFiCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwltb3ZxCSQxMCwlcmN4CisJeG9ycQklcjgsJXI4CisJY21wcQkkMTI4LCVyYngKKwlqYQkzZgorCitzZWFsX2F2eDJfdGFpbF8xMjg6CisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc3JsZAkkMjAsJXltbTQsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzbGxkCSQ3LCV5bW00LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCWFkZHEJMTYoJXJkaSksJXIxMAorCWFkY3EJOCsxNiglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMzIoJXJkaSksJXJkaQorCWRlY3EJJXJjeAorCWpnCTFiCisJZGVjcQklcjgKKwlqZ2UJMmIKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTMKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0zLCV5bW04CisKKwlqbXAJc2VhbF9hdngyX3Nob3J0X2xvb3AKKzM6CisJY21wcQkkMjU2LCVyYngKKwlqYQkzZgorCitzZWFsX2F2eDJfdGFpbF8yNTY6CisJdm1vdmRxYQkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wCisJdm1vdmRxYQk2NCglcmJwKSwleW1tNAorCXZtb3ZkcWEJOTYoJXJicCksJXltbTgKKwl2bW92ZHFhCSV5bW0wLCV5bW0xCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkxYgorCWRlY3EJJXI4CisJamdlCTJiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTEsJXltbTEKKwl2cGFkZGQJNjQoJXJicCksJXltbTUsJXltbTUKKwl2cGFkZGQJOTYoJXJicCksJXltbTksJXltbTkKKwl2cGFkZGQJMTkyKCVyYnApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMCwleW1tMAorCXZwYWRkZAk2NCglcmJwKSwleW1tNCwleW1tNAorCXZwYWRkZAk5NiglcmJwKSwleW1tOCwleW1tOAorCXZwYWRkZAkxNjAoJXJicCksJXltbTEyLCV5bW0xMgorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKzAoJXJzaSksJXltbTEsJXltbTEKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMCglcnNpKSwleW1tOSwleW1tOQorCXZtb3ZkcXUJJXltbTMsMCswKCVyZGkpCisJdm1vdmRxdQkleW1tMSwzMiswKCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCswKCVyZGkpCisJdm1vdmRxdQkleW1tOSw5NiswKCVyZGkpCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMCwleW1tNCwleW1tMworCXZwZXJtMmkxMjgJJDB4MDIsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDAyLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTMsJXltbTgKKworCW1vdnEJJDEyOCwlcmN4CisJbGVhcQkxMjgoJXJzaSksJXJzaQorCXN1YnEJJDEyOCwlcmJ4CisJam1wCXNlYWxfYXZ4Ml9oYXNoCiszOgorCWNtcHEJJDM4NCwlcmJ4CisJamEJc2VhbF9hdngyX3RhaWxfNTEyCisKK3NlYWxfYXZ4Ml90YWlsXzM4NDoKKwl2bW92ZHFhCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAKKwl2bW92ZHFhCTY0KCVyYnApLCV5bW00CisJdm1vdmRxYQk5NiglcmJwKSwleW1tOAorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tOCwleW1tOQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW02CisJdm1vdmRxYQkleW1tOCwleW1tMTAKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCisJbGVhcQkxNiglcmRpKSwlcmRpCisyOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyMTUKKwltdWxxCSVyMTAKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQkwKzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWltdWxxCSVyMTIsJXIxNQorCWFkZHEJJXJheCwlcjE0CisJYWRjcQklcmR4LCVyMTUKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbW92cQklcmF4LCVyOQorCW11bHEJJXIxMAorCWFkZHEJJXJheCwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKwltb3ZxCTgrMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSQwLCVyZHgKKwlpbXVscQklcjEyLCVyOQorCWFkZHEJJXIxMCwlcjE1CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyMTUsJXIxMgorCWFuZHEJJDMsJXIxMgorCW1vdnEJJXIxNSwlcjEzCisJYW5kcQkkLTQsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlzaHJkcQkkMiwlcjksJXIxNQorCXNocnEJJDIsJXI5CisJYWRkcQklcjEzLCVyMTAKKwlhZGNxCSVyMTQsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkZHEJJXIxNSwlcjEwCisJYWRjcQklcjksJXIxMQorCWFkY3EJJDAsJXIxMgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNiwleW1tMworCXZwc2xsZAkkMTIsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tMywleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHNsbGQJJDcsJXltbTYsJXltbTMKKwl2cHNybGQJJDI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ0LCV5bW0xMiwleW1tMTIsJXltbTEyCisJdnBhbGlnbnIJJDgsJXltbTgsJXltbTgsJXltbTgKKwl2cGFsaWducgkkMTIsJXltbTQsJXltbTQsJXltbTQKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCisJbGVhcQkzMiglcmRpKSwlcmRpCisJZGVjcQklcmN4CisJamcJMWIKKwlkZWNxCSVyOAorCWpnZQkyYgorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCTY0KCVyYnApLCV5bW02LCV5bW02CisJdnBhZGRkCTk2KCVyYnApLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAk2NCglcmJwKSwleW1tNSwleW1tNQorCXZwYWRkZAk5NiglcmJwKSwleW1tOSwleW1tOQorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMiwleW1tNiwleW1tMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTYKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xMCwleW1tMTQsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTEwCisJdnB4b3IJMCswKCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMCglcnNpKSwleW1tMiwleW1tMgorCXZweG9yCTY0KzAoJXJzaSksJXltbTYsJXltbTYKKwl2cHhvcgk5NiswKCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CSV5bW0zLDArMCglcmRpKQorCXZtb3ZkcXUJJXltbTIsMzIrMCglcmRpKQorCXZtb3ZkcXUJJXltbTYsNjQrMCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzAoJXJkaSkKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xLCV5bW01LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMSwleW1tNSwleW1tNQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTksJXltbTEzLCV5bW0xCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOSwleW1tMTMsJXltbTkKKwl2cHhvcgkwKzEyOCglcnNpKSwleW1tMywleW1tMworCXZweG9yCTMyKzEyOCglcnNpKSwleW1tMSwleW1tMQorCXZweG9yCTY0KzEyOCglcnNpKSwleW1tNSwleW1tNQorCXZweG9yCTk2KzEyOCglcnNpKSwleW1tOSwleW1tOQorCXZtb3ZkcXUJJXltbTMsMCsxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0xLDMyKzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTUsNjQrMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tOSw5NisxMjgoJXJkaSkKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTgsJXltbTEyLCV5bW00CisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkleW1tMywleW1tOAorCisJbW92cQkkMjU2LCVyY3gKKwlsZWFxCTI1NiglcnNpKSwlcnNpCisJc3VicQkkMjU2LCVyYngKKwlqbXAJc2VhbF9hdngyX2hhc2gKKworc2VhbF9hdngyX3RhaWxfNTEyOgorCXZtb3ZkcWEJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMAorCXZtb3ZkcWEJNjQoJXJicCksJXltbTQKKwl2bW92ZHFhCTk2KCVyYnApLCV5bW04CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTQsJXltbTUKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkleW1tMCwleW1tMgorCXZtb3ZkcWEJJXltbTQsJXltbTYKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZtb3ZkcWEJJXltbTAsJXltbTMKKwl2bW92ZHFhCSV5bW00LCV5bW03CisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCS5hdngyX2luYyglcmlwKSwleW1tMTIKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTUKKwl2cGFkZGQJJXltbTE1LCV5bW0xMiwleW1tMTQKKwl2cGFkZGQJJXltbTE0LCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0xNSwyNTYoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKworMToKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwltb3ZxCTArMCglcmJwKSwlcmR4CisJbW92cQklcmR4LCVyMTUKKwltdWx4cQklcjEwLCVyMTMsJXIxNAorCW11bHhxCSVyMTEsJXJheCwlcmR4CisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCWxlYXEJMTYoJXJkaSksJXJkaQorMjoKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZtb3ZkcWEJLnJvbDE2KCVyaXApLCV5bW04CisJdnBhZGRkCSV5bW03LCV5bW0zLCV5bW0zCisJdnBhZGRkCSV5bW02LCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwlhZGRxCTAoJXJkaSksJXIxMAorCWFkY3EJOCswKCVyZGkpLCVyMTEKKwlhZGNxCSQxLCVyMTIKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDIwLCV5bW03LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNywleW1tNworCXZweG9yCSV5bW04LCV5bW03LCV5bW03CisJdnBzcmxkCSQyMCwleW1tNiwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTUsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW00LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNCwleW1tNAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkucm9sOCglcmlwKSwleW1tOAorCXZwYWRkZAkleW1tNywleW1tMywleW1tMworCXZwYWRkZAkleW1tNiwleW1tMiwleW1tMgorCXZwYWRkZAkleW1tNSwleW1tMSwleW1tMQorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTMsJXltbTE1LCV5bW0xNQorCXZweG9yCSV5bW0yLCV5bW0xNCwleW1tMTQKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJJXltbTgsJXltbTE1LCV5bW0xNQorCXZwc2h1ZmIJJXltbTgsJXltbTE0LCV5bW0xNAorCXZwc2h1ZmIJJXltbTgsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJJXltbTgsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhZGRkCSV5bW0xNSwleW1tMTEsJXltbTExCisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tMTEsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tMTAsJXltbTYsJXltbTYKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdm1vdmRxYQkleW1tOCwxMjgoJXJicCkKKwl2cHNybGQJJDI1LCV5bW03LCV5bW04CisJbW92cQk4KzAoJXJicCksJXJkeAorCW11bHhxCSVyMTAsJXIxMCwlcmF4CisJYWRkcQklcjEwLCVyMTQKKwltdWx4cQklcjExLCVyMTEsJXI5CisJYWRjcQklcjExLCVyMTUKKwlhZGNxCSQwLCVyOQorCWltdWxxCSVyMTIsJXJkeAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTcsJXltbTcsJXltbTcKKwl2cGFsaWducgkkOCwleW1tMTEsJXltbTExLCV5bW0xMQorCXZwYWxpZ25yCSQxMiwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQ0LCV5bW02LCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkMTIsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJYWRkcQklcmF4LCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdm1vdmRxYQkucm9sMTYoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2bW92ZHFhCSV5bW04LDEyOCglcmJwKQorCXZwc3JsZAkkMjAsJXltbTcsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW03LCV5bW03CisJdnB4b3IJJXltbTgsJXltbTcsJXltbTcKKwl2cHNybGQJJDIwLCV5bW02LCV5bW04CisJdnBzbGxkCSQzMi0yMCwleW1tNiwleW1tNgorCXZweG9yCSV5bW04LCV5bW02LCV5bW02CisJdnBzcmxkCSQyMCwleW1tNSwleW1tOAorCXZwc2xsZAkkMzItMjAsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTQsJXltbTgKKwl2cHNsbGQJJDMyLTIwLCV5bW00LCV5bW00CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCXZtb3ZkcWEJLnJvbDgoJXJpcCksJXltbTgKKwl2cGFkZGQJJXltbTcsJXltbTMsJXltbTMKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cGFkZGQJJXltbTQsJXltbTAsJXltbTAKKwl2cHhvcgkleW1tMywleW1tMTUsJXltbTE1CisJdnB4b3IJJXltbTIsJXltbTE0LCV5bW0xNAorCXZweG9yCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cHhvcgkleW1tMCwleW1tMTIsJXltbTEyCisJdnBzaHVmYgkleW1tOCwleW1tMTUsJXltbTE1CisJdnBzaHVmYgkleW1tOCwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkleW1tOCwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkleW1tOCwleW1tMTIsJXltbTEyCisJdm1vdmRxYQkxMjgoJXJicCksJXltbTgKKwl2cGFkZGQJJXltbTE1LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTE0LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW0xMSwleW1tNywleW1tNworCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCW1vdnEJMCswKCVyYnApLCVyZHgKKwltb3ZxCSVyZHgsJXIxNQorCW11bHhxCSVyMTAsJXIxMywlcjE0CisJbXVseHEJJXIxMSwlcmF4LCVyZHgKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTgsMTI4KCVyYnApCisJdnBzcmxkCSQyNSwleW1tNywleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTcsJXltbTcKKwl2cHhvcgkleW1tOCwleW1tNywleW1tNworCXZwc3JsZAkkMjUsJXltbTYsJXltbTgKKwl2cHNsbGQJJDMyLTI1LCV5bW02LCV5bW02CisJdnB4b3IJJXltbTgsJXltbTYsJXltbTYKKwl2cHNybGQJJDI1LCV5bW01LCV5bW04CisJdnBzbGxkCSQzMi0yNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW04LCV5bW01LCV5bW01CisJdnBzcmxkCSQyNSwleW1tNCwleW1tOAorCXZwc2xsZAkkMzItMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZtb3ZkcWEJMTI4KCVyYnApLCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW03LCV5bW03LCV5bW03CisJdnBhbGlnbnIJJDgsJXltbTExLCV5bW0xMSwleW1tMTEKKwl2cGFsaWducgkkNCwleW1tMTUsJXltbTE1LCV5bW0xNQorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCW1vdnEJOCswKCVyYnApLCVyZHgKKwltdWx4cQklcjEwLCVyMTAsJXJheAorCWFkZHEJJXIxMCwlcjE0CisJbXVseHEJJXIxMSwlcjExLCVyOQorCWFkY3EJJXIxMSwlcjE1CisJYWRjcQkkMCwlcjkKKwlpbXVscQklcjEyLCVyZHgKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQ0LCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDEyLCV5bW01LCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQxMiwleW1tNCwleW1tNCwleW1tNAorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTEyLCV5bW0xMiwleW1tMTIKKworCisKKworCisKKworCisKKworCisKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJXJkeCwlcjkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlkZWNxCSVyY3gKKwlqZwkxYgorCWRlY3EJJXI4CisJamdlCTJiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTMsJXltbTMKKwl2cGFkZGQJNjQoJXJicCksJXltbTcsJXltbTcKKwl2cGFkZGQJOTYoJXJicCksJXltbTExLCV5bW0xMQorCXZwYWRkZAkyNTYoJXJicCksJXltbTE1LCV5bW0xNQorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCTY0KCVyYnApLCV5bW02LCV5bW02CisJdnBhZGRkCTk2KCVyYnApLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAk2NCglcmJwKSwleW1tNSwleW1tNQorCXZwYWRkZAk5NiglcmJwKSwleW1tOSwleW1tOQorCXZwYWRkZAkxOTIoJXJicCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0wLCV5bW0wCisJdnBhZGRkCTY0KCVyYnApLCV5bW00LCV5bW00CisJdnBhZGRkCTk2KCVyYnApLCV5bW04LCV5bW04CisJdnBhZGRkCTE2MCglcmJwKSwleW1tMTIsJXltbTEyCisKKwl2bW92ZHFhCSV5bW0wLDEyOCglcmJwKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTMsJXltbTcsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0zLCV5bW03LCV5bW03CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTEsJXltbTE1LCV5bW0zCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTEsJXltbTE1LCV5bW0xMQorCXZweG9yCTArMCglcnNpKSwleW1tMCwleW1tMAorCXZweG9yCTMyKzAoJXJzaSksJXltbTMsJXltbTMKKwl2cHhvcgk2NCswKCVyc2kpLCV5bW03LCV5bW03CisJdnB4b3IJOTYrMCglcnNpKSwleW1tMTEsJXltbTExCisJdm1vdmRxdQkleW1tMCwwKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyKzAoJXJkaSkKKwl2bW92ZHF1CSV5bW03LDY0KzAoJXJkaSkKKwl2bW92ZHF1CSV5bW0xMSw5NiswKCVyZGkpCisKKwl2bW92ZHFhCTEyOCglcmJwKSwleW1tMAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTIsJXltbTYsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0yLCV5bW02LCV5bW02CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTAsJXltbTE0LCV5bW0yCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMTAsJXltbTE0LCV5bW0xMAorCXZweG9yCTArMTI4KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMTI4KCVyc2kpLCV5bW0yLCV5bW0yCisJdnB4b3IJNjQrMTI4KCVyc2kpLCV5bW02LCV5bW02CisJdnB4b3IJOTYrMTI4KCVyc2kpLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CSV5bW0zLDArMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMiwzMisxMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW02LDY0KzEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTEwLDk2KzEyOCglcmRpKQorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTMKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW01CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEKKwl2cGVybTJpMTI4CSQweDEzLCV5bW05LCV5bW0xMywleW1tOQorCXZweG9yCTArMjU2KCVyc2kpLCV5bW0zLCV5bW0zCisJdnB4b3IJMzIrMjU2KCVyc2kpLCV5bW0xLCV5bW0xCisJdnB4b3IJNjQrMjU2KCVyc2kpLCV5bW01LCV5bW01CisJdnB4b3IJOTYrMjU2KCVyc2kpLCV5bW05LCV5bW05CisJdm1vdmRxdQkleW1tMywwKzI1NiglcmRpKQorCXZtb3ZkcXUJJXltbTEsMzIrMjU2KCVyZGkpCisJdm1vdmRxdQkleW1tNSw2NCsyNTYoJXJkaSkKKwl2bW92ZHF1CSV5bW05LDk2KzI1NiglcmRpKQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTMKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tMTIKKwl2bW92ZHFhCSV5bW0zLCV5bW04CisKKwltb3ZxCSQzODQsJXJjeAorCWxlYXEJMzg0KCVyc2kpLCVyc2kKKwlzdWJxCSQzODQsJXJieAorCWptcAlzZWFsX2F2eDJfaGFzaAorCitzZWFsX2F2eDJfMzIwOgorCXZtb3ZkcWEJJXltbTAsJXltbTEKKwl2bW92ZHFhCSV5bW0wLCV5bW0yCisJdm1vdmRxYQkleW1tNCwleW1tNQorCXZtb3ZkcWEJJXltbTQsJXltbTYKKwl2bW92ZHFhCSV5bW04LCV5bW05CisJdm1vdmRxYQkleW1tOCwleW1tMTAKKwl2cGFkZGQJLmF2eDJfaW5jKCVyaXApLCV5bW0xMiwleW1tMTMKKwl2cGFkZGQJLmF2eDJfaW5jKCVyaXApLCV5bW0xMywleW1tMTQKKwl2bW92ZHFhCSV5bW00LCV5bW03CisJdm1vdmRxYQkleW1tOCwleW1tMTEKKwl2bW92ZHFhCSV5bW0xMiwxNjAoJXJicCkKKwl2bW92ZHFhCSV5bW0xMywxOTIoJXJicCkKKwl2bW92ZHFhCSV5bW0xNCwyMjQoJXJicCkKKwltb3ZxCSQxMCwlcjEwCisxOgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkMTIsJXltbTEyLCV5bW0xMiwleW1tMTIKKwl2cGFsaWducgkkOCwleW1tOCwleW1tOCwleW1tOAorCXZwYWxpZ25yCSQ0LCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQxMiwleW1tMTMsJXltbTEzLCV5bW0xMworCXZwYWxpZ25yCSQ4LCV5bW05LCV5bW05LCV5bW05CisJdnBhbGlnbnIJJDQsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDEyLCV5bW0xNCwleW1tMTQsJXltbTE0CisJdnBhbGlnbnIJJDgsJXltbTEwLCV5bW0xMCwleW1tMTAKKwl2cGFsaWducgkkNCwleW1tNiwleW1tNiwleW1tNgorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTE0LCV5bW0xNAorCXZwYWRkZAkleW1tMTQsJXltbTEwLCV5bW0xMAorCXZweG9yCSV5bW0xMCwleW1tNiwleW1tNgorCXZwc3JsZAkkMjAsJXltbTYsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW02LCV5bW02CisJdnB4b3IJJXltbTMsJXltbTYsJXltbTYKKwl2cGFkZGQJJXltbTYsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMiwleW1tMTQsJXltbTE0CisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTQsJXltbTE0CisJdnBhZGRkCSV5bW0xNCwleW1tMTAsJXltbTEwCisJdnB4b3IJJXltbTEwLCV5bW02LCV5bW02CisJdnBzbGxkCSQ3LCV5bW02LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNiwleW1tNgorCXZweG9yCSV5bW0zLCV5bW02LCV5bW02CisJdnBhbGlnbnIJJDQsJXltbTE0LCV5bW0xNCwleW1tMTQKKwl2cGFsaWducgkkOCwleW1tMTAsJXltbTEwLCV5bW0xMAorCXZwYWxpZ25yCSQxMiwleW1tNiwleW1tNiwleW1tNgorCisJZGVjcQklcjEwCisJam5lCTFiCisJdnBhZGRkCS5jaGFjaGEyMF9jb25zdHMoJXJpcCksJXltbTAsJXltbTAKKwl2cGFkZGQJLmNoYWNoYTIwX2NvbnN0cyglcmlwKSwleW1tMSwleW1tMQorCXZwYWRkZAkuY2hhY2hhMjBfY29uc3RzKCVyaXApLCV5bW0yLCV5bW0yCisJdnBhZGRkCSV5bW03LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW03LCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW03LCV5bW02LCV5bW02CisJdnBhZGRkCSV5bW0xMSwleW1tOCwleW1tOAorCXZwYWRkZAkleW1tMTEsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTExLCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJMTYwKCVyYnApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJMTkyKCVyYnApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJMjI0KCVyYnApLCV5bW0xNCwleW1tMTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0wLCV5bW00LCV5bW0zCisKKwl2cGFuZAkuY2xhbXAoJXJpcCksJXltbTMsJXltbTMKKwl2bW92ZHFhCSV5bW0zLDAoJXJicCkKKworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTAsJXltbTQsJXltbTAKKwl2cGVybTJpMTI4CSQweDEzLCV5bW04LCV5bW0xMiwleW1tNAorCXZwZXJtMmkxMjgJJDB4MDIsJXltbTEsJXltbTUsJXltbTgKKwl2cGVybTJpMTI4CSQweDAyLCV5bW05LCV5bW0xMywleW1tMTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xLCV5bW01LCV5bW0xCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOSwleW1tMTMsJXltbTUKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0yLCV5bW02LCV5bW05CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMTAsJXltbTE0LCV5bW0xMworCXZwZXJtMmkxMjgJJDB4MTMsJXltbTIsJXltbTYsJXltbTIKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0xMCwleW1tMTQsJXltbTYKKwlqbXAJc2VhbF9hdngyX3Nob3J0CisKK3NlYWxfYXZ4Ml8xOTI6CisJdm1vdmRxYQkleW1tMCwleW1tMQorCXZtb3ZkcWEJJXltbTAsJXltbTIKKwl2bW92ZHFhCSV5bW00LCV5bW01CisJdm1vdmRxYQkleW1tNCwleW1tNgorCXZtb3ZkcWEJJXltbTgsJXltbTkKKwl2bW92ZHFhCSV5bW04LCV5bW0xMAorCXZwYWRkZAkuYXZ4Ml9pbmMoJXJpcCksJXltbTEyLCV5bW0xMworCXZtb3ZkcWEJJXltbTEyLCV5bW0xMQorCXZtb3ZkcWEJJXltbTEzLCV5bW0xNQorCW1vdnEJJDEwLCVyMTAKKzE6CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNybGQJJDIwLCV5bW00LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNCwleW1tNAorCXZweG9yCSV5bW0zLCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW00LCV5bW0wLCV5bW0wCisJdnB4b3IJJXltbTAsJXltbTEyLCV5bW0xMgorCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEyLCV5bW0xMgorCXZwYWRkZAkleW1tMTIsJXltbTgsJXltbTgKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZwc2xsZAkkNywleW1tNCwleW1tMworCXZwc3JsZAkkMjUsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWxpZ25yCSQxMiwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDQsJXltbTQsJXltbTQsJXltbTQKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sMTYoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc3JsZAkkMjAsJXltbTUsJXltbTMKKwl2cHNsbGQJJDEyLCV5bW01LCV5bW01CisJdnB4b3IJJXltbTMsJXltbTUsJXltbTUKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTEKKwl2cHhvcgkleW1tMSwleW1tMTMsJXltbTEzCisJdnBzaHVmYgkucm9sOCglcmlwKSwleW1tMTMsJXltbTEzCisJdnBhZGRkCSV5bW0xMywleW1tOSwleW1tOQorCXZweG9yCSV5bW05LCV5bW01LCV5bW01CisJdnBzbGxkCSQ3LCV5bW01LCV5bW0zCisJdnBzcmxkCSQyNSwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbGlnbnIJJDEyLCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkNCwleW1tNSwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2wxNiglcmlwKSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xMiwleW1tOCwleW1tOAorCXZweG9yCSV5bW04LCV5bW00LCV5bW00CisJdnBzcmxkCSQyMCwleW1tNCwleW1tMworCXZwc2xsZAkkMTIsJXltbTQsJXltbTQKKwl2cHhvcgkleW1tMywleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNCwleW1tMCwleW1tMAorCXZweG9yCSV5bW0wLCV5bW0xMiwleW1tMTIKKwl2cHNodWZiCS5yb2w4KCVyaXApLCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTEyLCV5bW04LCV5bW04CisJdnB4b3IJJXltbTgsJXltbTQsJXltbTQKKwl2cHNsbGQJJDcsJXltbTQsJXltbTMKKwl2cHNybGQJJDI1LCV5bW00LCV5bW00CisJdnB4b3IJJXltbTMsJXltbTQsJXltbTQKKwl2cGFsaWducgkkNCwleW1tMTIsJXltbTEyLCV5bW0xMgorCXZwYWxpZ25yCSQ4LCV5bW04LCV5bW04LCV5bW04CisJdnBhbGlnbnIJJDEyLCV5bW00LCV5bW00LCV5bW00CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDE2KCVyaXApLCV5bW0xMywleW1tMTMKKwl2cGFkZGQJJXltbTEzLCV5bW05LCV5bW05CisJdnB4b3IJJXltbTksJXltbTUsJXltbTUKKwl2cHNybGQJJDIwLCV5bW01LCV5bW0zCisJdnBzbGxkCSQxMiwleW1tNSwleW1tNQorCXZweG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW01LCV5bW0xLCV5bW0xCisJdnB4b3IJJXltbTEsJXltbTEzLCV5bW0xMworCXZwc2h1ZmIJLnJvbDgoJXJpcCksJXltbTEzLCV5bW0xMworCXZwYWRkZAkleW1tMTMsJXltbTksJXltbTkKKwl2cHhvcgkleW1tOSwleW1tNSwleW1tNQorCXZwc2xsZAkkNywleW1tNSwleW1tMworCXZwc3JsZAkkMjUsJXltbTUsJXltbTUKKwl2cHhvcgkleW1tMywleW1tNSwleW1tNQorCXZwYWxpZ25yCSQ0LCV5bW0xMywleW1tMTMsJXltbTEzCisJdnBhbGlnbnIJJDgsJXltbTksJXltbTksJXltbTkKKwl2cGFsaWducgkkMTIsJXltbTUsJXltbTUsJXltbTUKKworCWRlY3EJJXIxMAorCWpuZQkxYgorCXZwYWRkZAkleW1tMiwleW1tMCwleW1tMAorCXZwYWRkZAkleW1tMiwleW1tMSwleW1tMQorCXZwYWRkZAkleW1tNiwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tNiwleW1tNSwleW1tNQorCXZwYWRkZAkleW1tMTAsJXltbTgsJXltbTgKKwl2cGFkZGQJJXltbTEwLCV5bW05LCV5bW05CisJdnBhZGRkCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdnBhZGRkCSV5bW0xNSwleW1tMTMsJXltbTEzCisJdnBlcm0yaTEyOAkkMHgwMiwleW1tMCwleW1tNCwleW1tMworCisJdnBhbmQJLmNsYW1wKCVyaXApLCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMywwKCVyYnApCisKKwl2cGVybTJpMTI4CSQweDEzLCV5bW0wLCV5bW00LCV5bW0wCisJdnBlcm0yaTEyOAkkMHgxMywleW1tOCwleW1tMTIsJXltbTQKKwl2cGVybTJpMTI4CSQweDAyLCV5bW0xLCV5bW01LCV5bW04CisJdnBlcm0yaTEyOAkkMHgwMiwleW1tOSwleW1tMTMsJXltbTEyCisJdnBlcm0yaTEyOAkkMHgxMywleW1tMSwleW1tNSwleW1tMQorCXZwZXJtMmkxMjgJJDB4MTMsJXltbTksJXltbTEzLCV5bW01CitzZWFsX2F2eDJfc2hvcnQ6CisJbW92cQklcjgsJXI4CisJY2FsbAlwb2x5X2hhc2hfYWRfaW50ZXJuYWwKKwl4b3JxCSVyY3gsJXJjeAorc2VhbF9hdngyX2hhc2g6CisJY21wcQkkMTYsJXJjeAorCWpiCXNlYWxfYXZ4Ml9zaG9ydF9sb29wCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKworCXN1YnEJJDE2LCVyY3gKKwlhZGRxCSQxNiwlcmRpCisJam1wCXNlYWxfYXZ4Ml9oYXNoCitzZWFsX2F2eDJfc2hvcnRfbG9vcDoKKwljbXBxCSQzMiwlcmJ4CisJamIJc2VhbF9hdngyX3Nob3J0X3RhaWwKKwlzdWJxCSQzMiwlcmJ4CisKKwl2cHhvcgkoJXJzaSksJXltbTAsJXltbTAKKwl2bW92ZHF1CSV5bW0wLCglcmRpKQorCWxlYXEJMzIoJXJzaSksJXJzaQorCisJYWRkcQkwKCVyZGkpLCVyMTAKKwlhZGNxCTgrMCglcmRpKSwlcjExCisJYWRjcQkkMSwlcjEyCisJbW92cQkwKzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjE1CisJbXVscQklcjEwCisJbW92cQklcmF4LCVyMTMKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlpbXVscQklcjEyLCVyMTUKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQk4KzAoJXJicCksJXJheAorCW1vdnEJJXJheCwlcjkKKwltdWxxCSVyMTAKKwlhZGRxCSVyYXgsJXIxNAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisJbW92cQk4KzAoJXJicCksJXJheAorCW11bHEJJXIxMQorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXIxMiwlcjkKKwlhZGRxCSVyMTAsJXIxNQorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjE1LCVyMTIKKwlhbmRxCSQzLCVyMTIKKwltb3ZxCSVyMTUsJXIxMworCWFuZHEJJC00LCVyMTMKKwltb3ZxCSVyOSwlcjE0CisJc2hyZHEJJDIsJXI5LCVyMTUKKwlzaHJxCSQyLCVyOQorCWFkZHEJJXIxMywlcjEwCisJYWRjcQklcjE0LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSVyMTUsJXIxMAorCWFkY3EJJXI5LCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTgrMTYoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKworCXZtb3ZkcWEJJXltbTQsJXltbTAKKwl2bW92ZHFhCSV5bW04LCV5bW00CisJdm1vdmRxYQkleW1tMTIsJXltbTgKKwl2bW92ZHFhCSV5bW0xLCV5bW0xMgorCXZtb3ZkcWEJJXltbTUsJXltbTEKKwl2bW92ZHFhCSV5bW05LCV5bW01CisJdm1vdmRxYQkleW1tMTMsJXltbTkKKwl2bW92ZHFhCSV5bW0yLCV5bW0xMworCXZtb3ZkcWEJJXltbTYsJXltbTIKKwlqbXAJc2VhbF9hdngyX3Nob3J0X2xvb3AKK3NlYWxfYXZ4Ml9zaG9ydF90YWlsOgorCWNtcHEJJDE2LCVyYngKKwlqYgkxZgorCXN1YnEJJDE2LCVyYngKKwl2cHhvcgkoJXJzaSksJXhtbTAsJXhtbTMKKwl2bW92ZHF1CSV4bW0zLCglcmRpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCWFkZHEJMCglcmRpKSwlcjEwCisJYWRjcQk4KzAoJXJkaSksJXIxMQorCWFkY3EJJDEsJXIxMgorCW1vdnEJMCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXIxNQorCW11bHEJJXIxMAorCW1vdnEJJXJheCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCTArMCglcmJwKSwlcmF4CisJbXVscQklcjExCisJaW11bHEJJXIxMiwlcjE1CisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSVyZHgsJXIxNQorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltb3ZxCSVyYXgsJXI5CisJbXVscQklcjEwCisJYWRkcQklcmF4LCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJOCswKCVyYnApLCVyYXgKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxNQorCWFkY3EJJDAsJXJkeAorCWltdWxxCSVyMTIsJXI5CisJYWRkcQklcjEwLCVyMTUKKwlhZGNxCSVyZHgsJXI5CisJbW92cQklcjEzLCVyMTAKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMywlcjEyCisJbW92cQklcjE1LCVyMTMKKwlhbmRxCSQtNCwlcjEzCisJbW92cQklcjksJXIxNAorCXNocmRxCSQyLCVyOSwlcjE1CisJc2hycQkkMiwlcjkKKwlhZGRxCSVyMTMsJXIxMAorCWFkY3EJJXIxNCwlcjExCisJYWRjcQkkMCwlcjEyCisJYWRkcQklcjE1LCVyMTAKKwlhZGNxCSVyOSwlcjExCisJYWRjcQkkMCwlcjEyCisKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwl2ZXh0cmFjdGkxMjgJJDEsJXltbTAsJXhtbTAKKzE6CisJdnplcm91cHBlcgorCWptcAlzZWFsX3NzZV90YWlsXzE2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flcy14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXMteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlMzRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXMteDg2XzY0LlMKQEAgLTAsMCArMSwyNjE5IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisucDJhbGlnbgk0CitfeDg2XzY0X0FFU19lbmNyeXB0OgorCXhvcmwJMCglcjE1KSwlZWF4CisJeG9ybAk0KCVyMTUpLCVlYngKKwl4b3JsCTgoJXIxNSksJWVjeAorCXhvcmwJMTIoJXIxNSksJWVkeAorCisJbW92bAkyNDAoJXIxNSksJXIxM2QKKwlzdWJsCSQxLCVyMTNkCisJam1wCUwkZW5jX2xvb3AKKy5wMmFsaWduCTQKK0wkZW5jX2xvb3A6CisKKwltb3Z6YmwJJWFsLCVlc2kKKwltb3Z6YmwJJWJsLCVlZGkKKwltb3Z6YmwJJWNsLCVlYnAKKwltb3ZsCTAoJXIxNCwlcnNpLDgpLCVyMTBkCisJbW92bAkwKCVyMTQsJXJkaSw4KSwlcjExZAorCW1vdmwJMCglcjE0LCVyYnAsOCksJXIxMmQKKworCW1vdnpibAklYmgsJWVzaQorCW1vdnpibAklY2gsJWVkaQorCW1vdnpibAklZGwsJWVicAorCXhvcmwJMyglcjE0LCVyc2ksOCksJXIxMGQKKwl4b3JsCTMoJXIxNCwlcmRpLDgpLCVyMTFkCisJbW92bAkwKCVyMTQsJXJicCw4KSwlcjhkCisKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaHJsCSQxNiwlZWN4CisJbW92emJsCSVhaCwlZWJwCisJeG9ybAkzKCVyMTQsJXJzaSw4KSwlcjEyZAorCXNocmwJJDE2LCVlZHgKKwl4b3JsCTMoJXIxNCwlcmJwLDgpLCVyOGQKKworCXNocmwJJDE2LCVlYngKKwlsZWFxCTE2KCVyMTUpLCVyMTUKKwlzaHJsCSQxNiwlZWF4CisKKwltb3Z6YmwJJWNsLCVlc2kKKwltb3Z6YmwJJWRsLCVlZGkKKwltb3Z6YmwJJWFsLCVlYnAKKwl4b3JsCTIoJXIxNCwlcnNpLDgpLCVyMTBkCisJeG9ybAkyKCVyMTQsJXJkaSw4KSwlcjExZAorCXhvcmwJMiglcjE0LCVyYnAsOCksJXIxMmQKKworCW1vdnpibAklZGgsJWVzaQorCW1vdnpibAklYWgsJWVkaQorCW1vdnpibAklYmwsJWVicAorCXhvcmwJMSglcjE0LCVyc2ksOCksJXIxMGQKKwl4b3JsCTEoJXIxNCwlcmRpLDgpLCVyMTFkCisJeG9ybAkyKCVyMTQsJXJicCw4KSwlcjhkCisKKwltb3ZsCTEyKCVyMTUpLCVlZHgKKwltb3Z6YmwJJWJoLCVlZGkKKwltb3Z6YmwJJWNoLCVlYnAKKwltb3ZsCTAoJXIxNSksJWVheAorCXhvcmwJMSglcjE0LCVyZGksOCksJXIxMmQKKwl4b3JsCTEoJXIxNCwlcmJwLDgpLCVyOGQKKworCW1vdmwJNCglcjE1KSwlZWJ4CisJbW92bAk4KCVyMTUpLCVlY3gKKwl4b3JsCSVyMTBkLCVlYXgKKwl4b3JsCSVyMTFkLCVlYngKKwl4b3JsCSVyMTJkLCVlY3gKKwl4b3JsCSVyOGQsJWVkeAorCXN1YmwJJDEsJXIxM2QKKwlqbnoJTCRlbmNfbG9vcAorCW1vdnpibAklYWwsJWVzaQorCW1vdnpibAklYmwsJWVkaQorCW1vdnpibAklY2wsJWVicAorCW1vdnpibAkyKCVyMTQsJXJzaSw4KSwlcjEwZAorCW1vdnpibAkyKCVyMTQsJXJkaSw4KSwlcjExZAorCW1vdnpibAkyKCVyMTQsJXJicCw4KSwlcjEyZAorCisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCSViaCwlZWRpCisJbW92emJsCSVjaCwlZWJwCisJbW92emJsCTIoJXIxNCwlcnNpLDgpLCVyOGQKKwltb3ZsCTAoJXIxNCwlcmRpLDgpLCVlZGkKKwltb3ZsCTAoJXIxNCwlcmJwLDgpLCVlYnAKKworCWFuZGwJJDB4MDAwMGZmMDAsJWVkaQorCWFuZGwJJDB4MDAwMGZmMDAsJWVicAorCisJeG9ybAklZWRpLCVyMTBkCisJeG9ybAklZWJwLCVyMTFkCisJc2hybAkkMTYsJWVjeAorCisJbW92emJsCSVkaCwlZXNpCisJbW92emJsCSVhaCwlZWRpCisJc2hybAkkMTYsJWVkeAorCW1vdmwJMCglcjE0LCVyc2ksOCksJWVzaQorCW1vdmwJMCglcjE0LCVyZGksOCksJWVkaQorCisJYW5kbAkkMHgwMDAwZmYwMCwlZXNpCisJYW5kbAkkMHgwMDAwZmYwMCwlZWRpCisJc2hybAkkMTYsJWVieAorCXhvcmwJJWVzaSwlcjEyZAorCXhvcmwJJWVkaSwlcjhkCisJc2hybAkkMTYsJWVheAorCisJbW92emJsCSVjbCwlZXNpCisJbW92emJsCSVkbCwlZWRpCisJbW92emJsCSVhbCwlZWJwCisJbW92bAkwKCVyMTQsJXJzaSw4KSwlZXNpCisJbW92bAkwKCVyMTQsJXJkaSw4KSwlZWRpCisJbW92bAkwKCVyMTQsJXJicCw4KSwlZWJwCisKKwlhbmRsCSQweDAwZmYwMDAwLCVlc2kKKwlhbmRsCSQweDAwZmYwMDAwLCVlZGkKKwlhbmRsCSQweDAwZmYwMDAwLCVlYnAKKworCXhvcmwJJWVzaSwlcjEwZAorCXhvcmwJJWVkaSwlcjExZAorCXhvcmwJJWVicCwlcjEyZAorCisJbW92emJsCSVibCwlZXNpCisJbW92emJsCSVkaCwlZWRpCisJbW92emJsCSVhaCwlZWJwCisJbW92bAkwKCVyMTQsJXJzaSw4KSwlZXNpCisJbW92bAkyKCVyMTQsJXJkaSw4KSwlZWRpCisJbW92bAkyKCVyMTQsJXJicCw4KSwlZWJwCisKKwlhbmRsCSQweDAwZmYwMDAwLCVlc2kKKwlhbmRsCSQweGZmMDAwMDAwLCVlZGkKKwlhbmRsCSQweGZmMDAwMDAwLCVlYnAKKworCXhvcmwJJWVzaSwlcjhkCisJeG9ybAklZWRpLCVyMTBkCisJeG9ybAklZWJwLCVyMTFkCisKKwltb3Z6YmwJJWJoLCVlc2kKKwltb3Z6YmwJJWNoLCVlZGkKKwltb3ZsCTE2KzEyKCVyMTUpLCVlZHgKKwltb3ZsCTIoJXIxNCwlcnNpLDgpLCVlc2kKKwltb3ZsCTIoJXIxNCwlcmRpLDgpLCVlZGkKKwltb3ZsCTE2KzAoJXIxNSksJWVheAorCisJYW5kbAkkMHhmZjAwMDAwMCwlZXNpCisJYW5kbAkkMHhmZjAwMDAwMCwlZWRpCisKKwl4b3JsCSVlc2ksJXIxMmQKKwl4b3JsCSVlZGksJXI4ZAorCisJbW92bAkxNis0KCVyMTUpLCVlYngKKwltb3ZsCTE2KzgoJXIxNSksJWVjeAorCXhvcmwJJXIxMGQsJWVheAorCXhvcmwJJXIxMWQsJWVieAorCXhvcmwJJXIxMmQsJWVjeAorCXhvcmwJJXI4ZCwlZWR4CisuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0CitfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJbGVhcQkxMjgoJXIxNCksJXI4CisJbW92bAkwLTEyOCglcjgpLCVlZGkKKwltb3ZsCTMyLTEyOCglcjgpLCVlYnAKKwltb3ZsCTY0LTEyOCglcjgpLCVyMTBkCisJbW92bAk5Ni0xMjgoJXI4KSwlcjExZAorCW1vdmwJMTI4LTEyOCglcjgpLCVlZGkKKwltb3ZsCTE2MC0xMjgoJXI4KSwlZWJwCisJbW92bAkxOTItMTI4KCVyOCksJXIxMGQKKwltb3ZsCTIyNC0xMjgoJXI4KSwlcjExZAorCWptcAlMJGVuY19sb29wX2NvbXBhY3QKKy5wMmFsaWduCTQKK0wkZW5jX2xvb3BfY29tcGFjdDoKKwl4b3JsCTAoJXIxNSksJWVheAorCXhvcmwJNCglcjE1KSwlZWJ4CisJeG9ybAk4KCVyMTUpLCVlY3gKKwl4b3JsCTEyKCVyMTUpLCVlZHgKKwlsZWFxCTE2KCVyMTUpLCVyMTUKKwltb3Z6YmwJJWFsLCVyMTBkCisJbW92emJsCSVibCwlcjExZAorCW1vdnpibAklY2wsJXIxMmQKKwltb3Z6YmwJJWRsLCVyOGQKKwltb3Z6YmwJJWJoLCVlc2kKKwltb3Z6YmwJJWNoLCVlZGkKKwlzaHJsCSQxNiwlZWN4CisJbW92emJsCSVkaCwlZWJwCisJbW92emJsCSglcjE0LCVyMTAsMSksJXIxMGQKKwltb3Z6YmwJKCVyMTQsJXIxMSwxKSwlcjExZAorCW1vdnpibAkoJXIxNCwlcjEyLDEpLCVyMTJkCisJbW92emJsCSglcjE0LCVyOCwxKSwlcjhkCisKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlcjlkCisJbW92emJsCSVhaCwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJXIxM2QKKwltb3Z6YmwJJWNsLCVlZGkKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJWVzaQorCisJc2hsbAkkOCwlcjlkCisJc2hybAkkMTYsJWVkeAorCXNobGwJJDgsJXIxM2QKKwl4b3JsCSVyOWQsJXIxMGQKKwlzaHJsCSQxNiwlZWF4CisJbW92emJsCSVkbCwlcjlkCisJc2hybAkkMTYsJWVieAorCXhvcmwJJXIxM2QsJXIxMWQKKwlzaGxsCSQ4LCVlYnAKKwltb3Z6YmwJJWFsLCVyMTNkCisJbW92emJsCSglcjE0LCVyZGksMSksJWVkaQorCXhvcmwJJWVicCwlcjEyZAorCisJc2hsbAkkOCwlZXNpCisJbW92emJsCSVibCwlZWJwCisJc2hsbAkkMTYsJWVkaQorCXhvcmwJJWVzaSwlcjhkCisJbW92emJsCSglcjE0LCVyOSwxKSwlcjlkCisJbW92emJsCSVkaCwlZXNpCisJbW92emJsCSglcjE0LCVyMTMsMSksJXIxM2QKKwl4b3JsCSVlZGksJXIxMGQKKworCXNocmwJJDgsJWVjeAorCW1vdnpibAklYWgsJWVkaQorCXNobGwJJDE2LCVyOWQKKwlzaHJsCSQ4LCVlYngKKwlzaGxsCSQxNiwlcjEzZAorCXhvcmwJJXI5ZCwlcjExZAorCW1vdnpibAkoJXIxNCwlcmJwLDEpLCVlYnAKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJWVkaQorCW1vdnpibAkoJXIxNCwlcmN4LDEpLCVlZHgKKwltb3Z6YmwJKCVyMTQsJXJieCwxKSwlZWN4CisKKwlzaGxsCSQxNiwlZWJwCisJeG9ybAklcjEzZCwlcjEyZAorCXNobGwJJDI0LCVlc2kKKwl4b3JsCSVlYnAsJXI4ZAorCXNobGwJJDI0LCVlZGkKKwl4b3JsCSVlc2ksJXIxMGQKKwlzaGxsCSQyNCwlZWR4CisJeG9ybAklZWRpLCVyMTFkCisJc2hsbAkkMjQsJWVjeAorCW1vdmwJJXIxMGQsJWVheAorCW1vdmwJJXIxMWQsJWVieAorCXhvcmwJJXIxMmQsJWVjeAorCXhvcmwJJXI4ZCwlZWR4CisJY21wcQkxNiglcnNwKSwlcjE1CisJamUJTCRlbmNfY29tcGFjdF9kb25lCisJbW92bAkkMHg4MDgwODA4MCwlcjEwZAorCW1vdmwJJDB4ODA4MDgwODAsJXIxMWQKKwlhbmRsCSVlYXgsJXIxMGQKKwlhbmRsCSVlYngsJXIxMWQKKwltb3ZsCSVyMTBkLCVlc2kKKwltb3ZsCSVyMTFkLCVlZGkKKwlzaHJsCSQ3LCVyMTBkCisJbGVhbAkoJXJheCwlcmF4LDEpLCVyOGQKKwlzaHJsCSQ3LCVyMTFkCisJbGVhbAkoJXJieCwlcmJ4LDEpLCVyOWQKKwlzdWJsCSVyMTBkLCVlc2kKKwlzdWJsCSVyMTFkLCVlZGkKKwlhbmRsCSQweGZlZmVmZWZlLCVyOGQKKwlhbmRsCSQweGZlZmVmZWZlLCVyOWQKKwlhbmRsCSQweDFiMWIxYjFiLCVlc2kKKwlhbmRsCSQweDFiMWIxYjFiLCVlZGkKKwltb3ZsCSVlYXgsJXIxMGQKKwltb3ZsCSVlYngsJXIxMWQKKwl4b3JsCSVlc2ksJXI4ZAorCXhvcmwJJWVkaSwlcjlkCisKKwl4b3JsCSVyOGQsJWVheAorCXhvcmwJJXI5ZCwlZWJ4CisJbW92bAkkMHg4MDgwODA4MCwlcjEyZAorCXJvbGwJJDI0LCVlYXgKKwltb3ZsCSQweDgwODA4MDgwLCVlYnAKKwlyb2xsCSQyNCwlZWJ4CisJYW5kbAklZWN4LCVyMTJkCisJYW5kbAklZWR4LCVlYnAKKwl4b3JsCSVyOGQsJWVheAorCXhvcmwJJXI5ZCwlZWJ4CisJbW92bAklcjEyZCwlZXNpCisJcm9ybAkkMTYsJXIxMGQKKwltb3ZsCSVlYnAsJWVkaQorCXJvcmwJJDE2LCVyMTFkCisJbGVhbAkoJXJjeCwlcmN4LDEpLCVyOGQKKwlzaHJsCSQ3LCVyMTJkCisJeG9ybAklcjEwZCwlZWF4CisJc2hybAkkNywlZWJwCisJeG9ybAklcjExZCwlZWJ4CisJcm9ybAkkOCwlcjEwZAorCWxlYWwJKCVyZHgsJXJkeCwxKSwlcjlkCisJcm9ybAkkOCwlcjExZAorCXN1YmwJJXIxMmQsJWVzaQorCXN1YmwJJWVicCwlZWRpCisJeG9ybAklcjEwZCwlZWF4CisJeG9ybAklcjExZCwlZWJ4CisKKwlhbmRsCSQweGZlZmVmZWZlLCVyOGQKKwlhbmRsCSQweGZlZmVmZWZlLCVyOWQKKwlhbmRsCSQweDFiMWIxYjFiLCVlc2kKKwlhbmRsCSQweDFiMWIxYjFiLCVlZGkKKwltb3ZsCSVlY3gsJXIxMmQKKwltb3ZsCSVlZHgsJWVicAorCXhvcmwJJWVzaSwlcjhkCisJeG9ybAklZWRpLCVyOWQKKworCXJvcmwJJDE2LCVyMTJkCisJeG9ybAklcjhkLCVlY3gKKwlyb3JsCSQxNiwlZWJwCisJeG9ybAklcjlkLCVlZHgKKwlyb2xsCSQyNCwlZWN4CisJbW92bAkwKCVyMTQpLCVlc2kKKwlyb2xsCSQyNCwlZWR4CisJeG9ybAklcjhkLCVlY3gKKwltb3ZsCTY0KCVyMTQpLCVlZGkKKwl4b3JsCSVyOWQsJWVkeAorCW1vdmwJMTI4KCVyMTQpLCVyOGQKKwl4b3JsCSVyMTJkLCVlY3gKKwlyb3JsCSQ4LCVyMTJkCisJeG9ybAklZWJwLCVlZHgKKwlyb3JsCSQ4LCVlYnAKKwl4b3JsCSVyMTJkLCVlY3gKKwltb3ZsCTE5MiglcjE0KSwlcjlkCisJeG9ybAklZWJwLCVlZHgKKwlqbXAJTCRlbmNfbG9vcF9jb21wYWN0CisucDJhbGlnbgk0CitMJGVuY19jb21wYWN0X2RvbmU6CisJeG9ybAkwKCVyMTUpLCVlYXgKKwl4b3JsCTQoJXIxNSksJWVieAorCXhvcmwJOCglcjE1KSwlZWN4CisJeG9ybAkxMiglcjE1KSwlZWR4CisuYnl0ZQkweGYzLDB4YzMKKworLnAyYWxpZ24JNAorLmdsb2JsCV9hZXNfbm9od19lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4gX2Flc19ub2h3X2VuY3J5cHQKKworLnByaXZhdGVfZXh0ZXJuCV9hZXNfbm9od19lbmNyeXB0CitfYWVzX25vaHdfZW5jcnlwdDoKKworCW1vdnEJJXJzcCwlcmF4CisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKworCisJbGVhcQktNjMoJXJkeCksJXJjeAorCWFuZHEJJC02NCwlcnNwCisJc3VicQklcnNwLCVyY3gKKwluZWdxCSVyY3gKKwlhbmRxCSQweDNjMCwlcmN4CisJc3VicQklcmN4LCVyc3AKKwlzdWJxCSQzMiwlcnNwCisKKwltb3ZxCSVyc2ksMTYoJXJzcCkKKwltb3ZxCSVyYXgsMjQoJXJzcCkKKworTCRlbmNfcHJvbG9ndWU6CisKKwltb3ZxCSVyZHgsJXIxNQorCW1vdmwJMjQwKCVyMTUpLCVyMTNkCisKKwltb3ZsCTAoJXJkaSksJWVheAorCW1vdmwJNCglcmRpKSwlZWJ4CisJbW92bAk4KCVyZGkpLCVlY3gKKwltb3ZsCTEyKCVyZGkpLCVlZHgKKworCXNobGwJJDQsJXIxM2QKKwlsZWFxCSglcjE1LCVyMTMsMSksJXJicAorCW1vdnEJJXIxNSwoJXJzcCkKKwltb3ZxCSVyYnAsOCglcnNwKQorCisKKwlsZWFxCUwkQUVTX1RlKzIwNDgoJXJpcCksJXIxNAorCWxlYXEJNzY4KCVyc3ApLCVyYnAKKwlzdWJxCSVyMTQsJXJicAorCWFuZHEJJDB4MzAwLCVyYnAKKwlsZWFxCSglcjE0LCVyYnAsMSksJXIxNAorCisJY2FsbAlfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QKKworCW1vdnEJMTYoJXJzcCksJXI5CisJbW92cQkyNCglcnNwKSwlcnNpCisKKwltb3ZsCSVlYXgsMCglcjkpCisJbW92bAklZWJ4LDQoJXI5KQorCW1vdmwJJWVjeCw4KCVyOSkKKwltb3ZsCSVlZHgsMTIoJXI5KQorCisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJicAorCisJbW92cQktOCglcnNpKSwlcmJ4CisKKwlsZWFxCSglcnNpKSwlcnNwCisKK0wkZW5jX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNAorX3g4Nl82NF9BRVNfZGVjcnlwdDoKKwl4b3JsCTAoJXIxNSksJWVheAorCXhvcmwJNCglcjE1KSwlZWJ4CisJeG9ybAk4KCVyMTUpLCVlY3gKKwl4b3JsCTEyKCVyMTUpLCVlZHgKKworCW1vdmwJMjQwKCVyMTUpLCVyMTNkCisJc3VibAkkMSwlcjEzZAorCWptcAlMJGRlY19sb29wCisucDJhbGlnbgk0CitMJGRlY19sb29wOgorCisJbW92emJsCSVhbCwlZXNpCisJbW92emJsCSVibCwlZWRpCisJbW92emJsCSVjbCwlZWJwCisJbW92bAkwKCVyMTQsJXJzaSw4KSwlcjEwZAorCW1vdmwJMCglcjE0LCVyZGksOCksJXIxMWQKKwltb3ZsCTAoJXIxNCwlcmJwLDgpLCVyMTJkCisKKwltb3Z6YmwJJWRoLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwltb3Z6YmwJJWRsLCVlYnAKKwl4b3JsCTMoJXIxNCwlcnNpLDgpLCVyMTBkCisJeG9ybAkzKCVyMTQsJXJkaSw4KSwlcjExZAorCW1vdmwJMCglcjE0LCVyYnAsOCksJXI4ZAorCisJbW92emJsCSViaCwlZXNpCisJc2hybAkkMTYsJWVheAorCW1vdnpibAklY2gsJWVicAorCXhvcmwJMyglcjE0LCVyc2ksOCksJXIxMmQKKwlzaHJsCSQxNiwlZWR4CisJeG9ybAkzKCVyMTQsJXJicCw4KSwlcjhkCisKKwlzaHJsCSQxNiwlZWJ4CisJbGVhcQkxNiglcjE1KSwlcjE1CisJc2hybAkkMTYsJWVjeAorCisJbW92emJsCSVjbCwlZXNpCisJbW92emJsCSVkbCwlZWRpCisJbW92emJsCSVhbCwlZWJwCisJeG9ybAkyKCVyMTQsJXJzaSw4KSwlcjEwZAorCXhvcmwJMiglcjE0LCVyZGksOCksJXIxMWQKKwl4b3JsCTIoJXIxNCwlcmJwLDgpLCVyMTJkCisKKwltb3Z6YmwJJWJoLCVlc2kKKwltb3Z6YmwJJWNoLCVlZGkKKwltb3Z6YmwJJWJsLCVlYnAKKwl4b3JsCTEoJXIxNCwlcnNpLDgpLCVyMTBkCisJeG9ybAkxKCVyMTQsJXJkaSw4KSwlcjExZAorCXhvcmwJMiglcjE0LCVyYnAsOCksJXI4ZAorCisJbW92emJsCSVkaCwlZXNpCisJbW92bAkxMiglcjE1KSwlZWR4CisJbW92emJsCSVhaCwlZWJwCisJeG9ybAkxKCVyMTQsJXJzaSw4KSwlcjEyZAorCW1vdmwJMCglcjE1KSwlZWF4CisJeG9ybAkxKCVyMTQsJXJicCw4KSwlcjhkCisKKwl4b3JsCSVyMTBkLCVlYXgKKwltb3ZsCTQoJXIxNSksJWVieAorCW1vdmwJOCglcjE1KSwlZWN4CisJeG9ybAklcjEyZCwlZWN4CisJeG9ybAklcjExZCwlZWJ4CisJeG9ybAklcjhkLCVlZHgKKwlzdWJsCSQxLCVyMTNkCisJam56CUwkZGVjX2xvb3AKKwlsZWFxCTIwNDgoJXIxNCksJXIxNAorCW1vdnpibAklYWwsJWVzaQorCW1vdnpibAklYmwsJWVkaQorCW1vdnpibAklY2wsJWVicAorCW1vdnpibAkoJXIxNCwlcnNpLDEpLCVyMTBkCisJbW92emJsCSglcjE0LCVyZGksMSksJXIxMWQKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlcjEyZAorCisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCSVkaCwlZWRpCisJbW92emJsCSVhaCwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJXI4ZAorCW1vdnpibAkoJXIxNCwlcmRpLDEpLCVlZGkKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisKKwlzaGxsCSQ4LCVlZGkKKwlzaGxsCSQ4LCVlYnAKKworCXhvcmwJJWVkaSwlcjEwZAorCXhvcmwJJWVicCwlcjExZAorCXNocmwJJDE2LCVlZHgKKworCW1vdnpibAklYmgsJWVzaQorCW1vdnpibAklY2gsJWVkaQorCXNocmwJJDE2LCVlYXgKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJWVkaQorCisJc2hsbAkkOCwlZXNpCisJc2hsbAkkOCwlZWRpCisJc2hybAkkMTYsJWVieAorCXhvcmwJJWVzaSwlcjEyZAorCXhvcmwJJWVkaSwlcjhkCisJc2hybAkkMTYsJWVjeAorCisJbW92emJsCSVjbCwlZXNpCisJbW92emJsCSVkbCwlZWRpCisJbW92emJsCSVhbCwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJWVzaQorCW1vdnpibAkoJXIxNCwlcmRpLDEpLCVlZGkKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisKKwlzaGxsCSQxNiwlZXNpCisJc2hsbAkkMTYsJWVkaQorCXNobGwJJDE2LCVlYnAKKworCXhvcmwJJWVzaSwlcjEwZAorCXhvcmwJJWVkaSwlcjExZAorCXhvcmwJJWVicCwlcjEyZAorCisJbW92emJsCSVibCwlZXNpCisJbW92emJsCSViaCwlZWRpCisJbW92emJsCSVjaCwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJWVzaQorCW1vdnpibAkoJXIxNCwlcmRpLDEpLCVlZGkKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisKKwlzaGxsCSQxNiwlZXNpCisJc2hsbAkkMjQsJWVkaQorCXNobGwJJDI0LCVlYnAKKworCXhvcmwJJWVzaSwlcjhkCisJeG9ybAklZWRpLCVyMTBkCisJeG9ybAklZWJwLCVyMTFkCisKKwltb3Z6YmwJJWRoLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwltb3ZsCTE2KzEyKCVyMTUpLCVlZHgKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJWVkaQorCW1vdmwJMTYrMCglcjE1KSwlZWF4CisKKwlzaGxsCSQyNCwlZXNpCisJc2hsbAkkMjQsJWVkaQorCisJeG9ybAklZXNpLCVyMTJkCisJeG9ybAklZWRpLCVyOGQKKworCW1vdmwJMTYrNCglcjE1KSwlZWJ4CisJbW92bAkxNis4KCVyMTUpLCVlY3gKKwlsZWFxCS0yMDQ4KCVyMTQpLCVyMTQKKwl4b3JsCSVyMTBkLCVlYXgKKwl4b3JsCSVyMTFkLCVlYngKKwl4b3JsCSVyMTJkLCVlY3gKKwl4b3JsCSVyOGQsJWVkeAorLmJ5dGUJMHhmMywweGMzCisKKworLnAyYWxpZ24JNAorX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0OgorCWxlYXEJMTI4KCVyMTQpLCVyOAorCW1vdmwJMC0xMjgoJXI4KSwlZWRpCisJbW92bAkzMi0xMjgoJXI4KSwlZWJwCisJbW92bAk2NC0xMjgoJXI4KSwlcjEwZAorCW1vdmwJOTYtMTI4KCVyOCksJXIxMWQKKwltb3ZsCTEyOC0xMjgoJXI4KSwlZWRpCisJbW92bAkxNjAtMTI4KCVyOCksJWVicAorCW1vdmwJMTkyLTEyOCglcjgpLCVyMTBkCisJbW92bAkyMjQtMTI4KCVyOCksJXIxMWQKKwlqbXAJTCRkZWNfbG9vcF9jb21wYWN0CisKKy5wMmFsaWduCTQKK0wkZGVjX2xvb3BfY29tcGFjdDoKKwl4b3JsCTAoJXIxNSksJWVheAorCXhvcmwJNCglcjE1KSwlZWJ4CisJeG9ybAk4KCVyMTUpLCVlY3gKKwl4b3JsCTEyKCVyMTUpLCVlZHgKKwlsZWFxCTE2KCVyMTUpLCVyMTUKKwltb3Z6YmwJJWFsLCVyMTBkCisJbW92emJsCSVibCwlcjExZAorCW1vdnpibAklY2wsJXIxMmQKKwltb3Z6YmwJJWRsLCVyOGQKKwltb3Z6YmwJJWRoLCVlc2kKKwltb3Z6YmwJJWFoLCVlZGkKKwlzaHJsCSQxNiwlZWR4CisJbW92emJsCSViaCwlZWJwCisJbW92emJsCSglcjE0LCVyMTAsMSksJXIxMGQKKwltb3Z6YmwJKCVyMTQsJXIxMSwxKSwlcjExZAorCW1vdnpibAkoJXIxNCwlcjEyLDEpLCVyMTJkCisJbW92emJsCSglcjE0LCVyOCwxKSwlcjhkCisKKwltb3Z6YmwJKCVyMTQsJXJzaSwxKSwlcjlkCisJbW92emJsCSVjaCwlZXNpCisJbW92emJsCSglcjE0LCVyZGksMSksJXIxM2QKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisJbW92emJsCSglcjE0LCVyc2ksMSksJWVzaQorCisJc2hybAkkMTYsJWVjeAorCXNobGwJJDgsJXIxM2QKKwlzaGxsCSQ4LCVyOWQKKwltb3Z6YmwJJWNsLCVlZGkKKwlzaHJsCSQxNiwlZWF4CisJeG9ybAklcjlkLCVyMTBkCisJc2hybAkkMTYsJWVieAorCW1vdnpibAklZGwsJXI5ZAorCisJc2hsbAkkOCwlZWJwCisJeG9ybAklcjEzZCwlcjExZAorCXNobGwJJDgsJWVzaQorCW1vdnpibAklYWwsJXIxM2QKKwltb3Z6YmwJKCVyMTQsJXJkaSwxKSwlZWRpCisJeG9ybAklZWJwLCVyMTJkCisJbW92emJsCSVibCwlZWJwCisKKwlzaGxsCSQxNiwlZWRpCisJeG9ybAklZXNpLCVyOGQKKwltb3Z6YmwJKCVyMTQsJXI5LDEpLCVyOWQKKwltb3Z6YmwJJWJoLCVlc2kKKwltb3Z6YmwJKCVyMTQsJXJicCwxKSwlZWJwCisJeG9ybAklZWRpLCVyMTBkCisJbW92emJsCSglcjE0LCVyMTMsMSksJXIxM2QKKwltb3Z6YmwJJWNoLCVlZGkKKworCXNobGwJJDE2LCVlYnAKKwlzaGxsCSQxNiwlcjlkCisJc2hsbAkkMTYsJXIxM2QKKwl4b3JsCSVlYnAsJXI4ZAorCW1vdnpibAklZGgsJWVicAorCXhvcmwJJXI5ZCwlcjExZAorCXNocmwJJDgsJWVheAorCXhvcmwJJXIxM2QsJXIxMmQKKworCW1vdnpibAkoJXIxNCwlcnNpLDEpLCVlc2kKKwltb3Z6YmwJKCVyMTQsJXJkaSwxKSwlZWJ4CisJbW92emJsCSglcjE0LCVyYnAsMSksJWVjeAorCW1vdnpibAkoJXIxNCwlcmF4LDEpLCVlZHgKKworCW1vdmwJJXIxMGQsJWVheAorCXNobGwJJDI0LCVlc2kKKwlzaGxsCSQyNCwlZWJ4CisJc2hsbAkkMjQsJWVjeAorCXhvcmwJJWVzaSwlZWF4CisJc2hsbAkkMjQsJWVkeAorCXhvcmwJJXIxMWQsJWVieAorCXhvcmwJJXIxMmQsJWVjeAorCXhvcmwJJXI4ZCwlZWR4CisJY21wcQkxNiglcnNwKSwlcjE1CisJamUJTCRkZWNfY29tcGFjdF9kb25lCisKKwltb3ZxCTI1NiswKCVyMTQpLCVyc2kKKwlzaGxxCSQzMiwlcmJ4CisJc2hscQkkMzIsJXJkeAorCW1vdnEJMjU2KzgoJXIxNCksJXJkaQorCW9ycQklcmJ4LCVyYXgKKwlvcnEJJXJkeCwlcmN4CisJbW92cQkyNTYrMTYoJXIxNCksJXJicAorCW1vdnEJJXJzaSwlcjkKKwltb3ZxCSVyc2ksJXIxMgorCWFuZHEJJXJheCwlcjkKKwlhbmRxCSVyY3gsJXIxMgorCW1vdnEJJXI5LCVyYngKKwltb3ZxCSVyMTIsJXJkeAorCXNocnEJJDcsJXI5CisJbGVhcQkoJXJheCwlcmF4LDEpLCVyOAorCXNocnEJJDcsJXIxMgorCWxlYXEJKCVyY3gsJXJjeCwxKSwlcjExCisJc3VicQklcjksJXJieAorCXN1YnEJJXIxMiwlcmR4CisJYW5kcQklcmRpLCVyOAorCWFuZHEJJXJkaSwlcjExCisJYW5kcQklcmJwLCVyYngKKwlhbmRxCSVyYnAsJXJkeAorCXhvcnEJJXJieCwlcjgKKwl4b3JxCSVyZHgsJXIxMQorCW1vdnEJJXJzaSwlcjEwCisJbW92cQklcnNpLCVyMTMKKworCWFuZHEJJXI4LCVyMTAKKwlhbmRxCSVyMTEsJXIxMworCW1vdnEJJXIxMCwlcmJ4CisJbW92cQklcjEzLCVyZHgKKwlzaHJxCSQ3LCVyMTAKKwlsZWFxCSglcjgsJXI4LDEpLCVyOQorCXNocnEJJDcsJXIxMworCWxlYXEJKCVyMTEsJXIxMSwxKSwlcjEyCisJc3VicQklcjEwLCVyYngKKwlzdWJxCSVyMTMsJXJkeAorCWFuZHEJJXJkaSwlcjkKKwlhbmRxCSVyZGksJXIxMgorCWFuZHEJJXJicCwlcmJ4CisJYW5kcQklcmJwLCVyZHgKKwl4b3JxCSVyYngsJXI5CisJeG9ycQklcmR4LCVyMTIKKwltb3ZxCSVyc2ksJXIxMAorCW1vdnEJJXJzaSwlcjEzCisKKwlhbmRxCSVyOSwlcjEwCisJYW5kcQklcjEyLCVyMTMKKwltb3ZxCSVyMTAsJXJieAorCW1vdnEJJXIxMywlcmR4CisJc2hycQkkNywlcjEwCisJeG9ycQklcmF4LCVyOAorCXNocnEJJDcsJXIxMworCXhvcnEJJXJjeCwlcjExCisJc3VicQklcjEwLCVyYngKKwlzdWJxCSVyMTMsJXJkeAorCWxlYXEJKCVyOSwlcjksMSksJXIxMAorCWxlYXEJKCVyMTIsJXIxMiwxKSwlcjEzCisJeG9ycQklcmF4LCVyOQorCXhvcnEJJXJjeCwlcjEyCisJYW5kcQklcmRpLCVyMTAKKwlhbmRxCSVyZGksJXIxMworCWFuZHEJJXJicCwlcmJ4CisJYW5kcQklcmJwLCVyZHgKKwl4b3JxCSVyYngsJXIxMAorCXhvcnEJJXJkeCwlcjEzCisKKwl4b3JxCSVyMTAsJXJheAorCXhvcnEJJXIxMywlcmN4CisJeG9ycQklcjEwLCVyOAorCXhvcnEJJXIxMywlcjExCisJbW92cQklcmF4LCVyYngKKwltb3ZxCSVyY3gsJXJkeAorCXhvcnEJJXIxMCwlcjkKKwlzaHJxCSQzMiwlcmJ4CisJeG9ycQklcjEzLCVyMTIKKwlzaHJxCSQzMiwlcmR4CisJeG9ycQklcjgsJXIxMAorCXJvbGwJJDgsJWVheAorCXhvcnEJJXIxMSwlcjEzCisJcm9sbAkkOCwlZWN4CisJeG9ycQklcjksJXIxMAorCXJvbGwJJDgsJWVieAorCXhvcnEJJXIxMiwlcjEzCisKKwlyb2xsCSQ4LCVlZHgKKwl4b3JsCSVyMTBkLCVlYXgKKwlzaHJxCSQzMiwlcjEwCisJeG9ybAklcjEzZCwlZWN4CisJc2hycQkkMzIsJXIxMworCXhvcmwJJXIxMGQsJWVieAorCXhvcmwJJXIxM2QsJWVkeAorCisJbW92cQklcjgsJXIxMAorCXJvbGwJJDI0LCVyOGQKKwltb3ZxCSVyMTEsJXIxMworCXJvbGwJJDI0LCVyMTFkCisJc2hycQkkMzIsJXIxMAorCXhvcmwJJXI4ZCwlZWF4CisJc2hycQkkMzIsJXIxMworCXhvcmwJJXIxMWQsJWVjeAorCXJvbGwJJDI0LCVyMTBkCisJbW92cQklcjksJXI4CisJcm9sbAkkMjQsJXIxM2QKKwltb3ZxCSVyMTIsJXIxMQorCXNocnEJJDMyLCVyOAorCXhvcmwJJXIxMGQsJWVieAorCXNocnEJJDMyLCVyMTEKKwl4b3JsCSVyMTNkLCVlZHgKKworCW1vdnEJMCglcjE0KSwlcnNpCisJcm9sbAkkMTYsJXI5ZAorCW1vdnEJNjQoJXIxNCksJXJkaQorCXJvbGwJJDE2LCVyMTJkCisJbW92cQkxMjgoJXIxNCksJXJicAorCXJvbGwJJDE2LCVyOGQKKwltb3ZxCTE5MiglcjE0KSwlcjEwCisJeG9ybAklcjlkLCVlYXgKKwlyb2xsCSQxNiwlcjExZAorCXhvcmwJJXIxMmQsJWVjeAorCW1vdnEJMjU2KCVyMTQpLCVyMTMKKwl4b3JsCSVyOGQsJWVieAorCXhvcmwJJXIxMWQsJWVkeAorCWptcAlMJGRlY19sb29wX2NvbXBhY3QKKy5wMmFsaWduCTQKK0wkZGVjX2NvbXBhY3RfZG9uZToKKwl4b3JsCTAoJXIxNSksJWVheAorCXhvcmwJNCglcjE1KSwlZWJ4CisJeG9ybAk4KCVyMTUpLCVlY3gKKwl4b3JsCTEyKCVyMTUpLCVlZHgKKy5ieXRlCTB4ZjMsMHhjMworCisucDJhbGlnbgk0CisuZ2xvYmwJX2Flc19ub2h3X2RlY3J5cHQKKy5wcml2YXRlX2V4dGVybiBfYWVzX25vaHdfZGVjcnlwdAorCisucHJpdmF0ZV9leHRlcm4JX2Flc19ub2h3X2RlY3J5cHQKK19hZXNfbm9od19kZWNyeXB0OgorCisJbW92cQklcnNwLCVyYXgKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCisKKwlsZWFxCS02MyglcmR4KSwlcmN4CisJYW5kcQkkLTY0LCVyc3AKKwlzdWJxCSVyc3AsJXJjeAorCW5lZ3EJJXJjeAorCWFuZHEJJDB4M2MwLCVyY3gKKwlzdWJxCSVyY3gsJXJzcAorCXN1YnEJJDMyLCVyc3AKKworCW1vdnEJJXJzaSwxNiglcnNwKQorCW1vdnEJJXJheCwyNCglcnNwKQorCitMJGRlY19wcm9sb2d1ZToKKworCW1vdnEJJXJkeCwlcjE1CisJbW92bAkyNDAoJXIxNSksJXIxM2QKKworCW1vdmwJMCglcmRpKSwlZWF4CisJbW92bAk0KCVyZGkpLCVlYngKKwltb3ZsCTgoJXJkaSksJWVjeAorCW1vdmwJMTIoJXJkaSksJWVkeAorCisJc2hsbAkkNCwlcjEzZAorCWxlYXEJKCVyMTUsJXIxMywxKSwlcmJwCisJbW92cQklcjE1LCglcnNwKQorCW1vdnEJJXJicCw4KCVyc3ApCisKKworCWxlYXEJTCRBRVNfVGQrMjA0OCglcmlwKSwlcjE0CisJbGVhcQk3NjgoJXJzcCksJXJicAorCXN1YnEJJXIxNCwlcmJwCisJYW5kcQkkMHgzMDAsJXJicAorCWxlYXEJKCVyMTQsJXJicCwxKSwlcjE0CisJc2hycQkkMywlcmJwCisJYWRkcQklcmJwLCVyMTQKKworCWNhbGwJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0CisKKwltb3ZxCTE2KCVyc3ApLCVyOQorCW1vdnEJMjQoJXJzcCksJXJzaQorCisJbW92bAklZWF4LDAoJXI5KQorCW1vdmwJJWVieCw0KCVyOSkKKwltb3ZsCSVlY3gsOCglcjkpCisJbW92bAklZWR4LDEyKCVyOSkKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYnAKKworCW1vdnEJLTgoJXJzaSksJXJieAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJGRlY19lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0CisuZ2xvYmwJX2Flc19ub2h3X3NldF9lbmNyeXB0X2tleQorLnByaXZhdGVfZXh0ZXJuIF9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXkKKworX2Flc19ub2h3X3NldF9lbmNyeXB0X2tleToKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXN1YnEJJDgsJXJzcAorCitMJGVuY19rZXlfcHJvbG9ndWU6CisKKwljYWxsCV94ODZfNjRfQUVTX3NldF9lbmNyeXB0X2tleQorCisJbW92cQk0MCglcnNwKSwlcmJwCisKKwltb3ZxCTQ4KCVyc3ApLCVyYngKKworCWFkZHEJJDU2LCVyc3AKKworTCRlbmNfa2V5X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKworCisucDJhbGlnbgk0CitfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXk6CisJbW92bAklZXNpLCVlY3gKKwltb3ZxCSVyZGksJXJzaQorCW1vdnEJJXJkeCwlcmRpCisKKwl0ZXN0cQkkLTEsJXJzaQorCWp6CUwkYmFkcG9pbnRlcgorCXRlc3RxCSQtMSwlcmRpCisJanoJTCRiYWRwb2ludGVyCisKKwlsZWFxCUwkQUVTX1RlKCVyaXApLCVyYnAKKwlsZWFxCTIwNDgrMTI4KCVyYnApLCVyYnAKKworCisJbW92bAkwLTEyOCglcmJwKSwlZWF4CisJbW92bAkzMi0xMjgoJXJicCksJWVieAorCW1vdmwJNjQtMTI4KCVyYnApLCVyOGQKKwltb3ZsCTk2LTEyOCglcmJwKSwlZWR4CisJbW92bAkxMjgtMTI4KCVyYnApLCVlYXgKKwltb3ZsCTE2MC0xMjgoJXJicCksJWVieAorCW1vdmwJMTkyLTEyOCglcmJwKSwlcjhkCisJbW92bAkyMjQtMTI4KCVyYnApLCVlZHgKKworCWNtcGwJJDEyOCwlZWN4CisJamUJTCQxMHJvdW5kcworCWNtcGwJJDE5MiwlZWN4CisJamUJTCQxMnJvdW5kcworCWNtcGwJJDI1NiwlZWN4CisJamUJTCQxNHJvdW5kcworCW1vdnEJJC0yLCVyYXgKKwlqbXAJTCRleGl0CisKK0wkMTByb3VuZHM6CisJbW92cQkwKCVyc2kpLCVyYXgKKwltb3ZxCTgoJXJzaSksJXJkeAorCW1vdnEJJXJheCwwKCVyZGkpCisJbW92cQklcmR4LDgoJXJkaSkKKworCXNocnEJJDMyLCVyZHgKKwl4b3JsCSVlY3gsJWVjeAorCWptcAlMJDEwc2hvcnRjdXQKKy5wMmFsaWduCTIKK0wkMTBsb29wOgorCW1vdmwJMCglcmRpKSwlZWF4CisJbW92bAkxMiglcmRpKSwlZWR4CitMJDEwc2hvcnRjdXQ6CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQyNCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJc2hybAkkMTYsJWVkeAorCW1vdnpibAklZGwsJWVzaQorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDgsJWVieAorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJeG9ybAkxMDI0LTEyOCglcmJwLCVyY3gsNCksJWVheAorCW1vdmwJJWVheCwxNiglcmRpKQorCXhvcmwJNCglcmRpKSwlZWF4CisJbW92bAklZWF4LDIwKCVyZGkpCisJeG9ybAk4KCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMjQoJXJkaSkKKwl4b3JsCTEyKCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMjgoJXJkaSkKKwlhZGRsCSQxLCVlY3gKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwljbXBsCSQxMCwlZWN4CisJamwJTCQxMGxvb3AKKworCW1vdmwJJDEwLDgwKCVyZGkpCisJeG9ycQklcmF4LCVyYXgKKwlqbXAJTCRleGl0CisKK0wkMTJyb3VuZHM6CisJbW92cQkwKCVyc2kpLCVyYXgKKwltb3ZxCTgoJXJzaSksJXJieAorCW1vdnEJMTYoJXJzaSksJXJkeAorCW1vdnEJJXJheCwwKCVyZGkpCisJbW92cQklcmJ4LDgoJXJkaSkKKwltb3ZxCSVyZHgsMTYoJXJkaSkKKworCXNocnEJJDMyLCVyZHgKKwl4b3JsCSVlY3gsJWVjeAorCWptcAlMJDEyc2hvcnRjdXQKKy5wMmFsaWduCTIKK0wkMTJsb29wOgorCW1vdmwJMCglcmRpKSwlZWF4CisJbW92bAkyMCglcmRpKSwlZWR4CitMJDEyc2hvcnRjdXQ6CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQyNCwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJc2hybAkkMTYsJWVkeAorCW1vdnpibAklZGwsJWVzaQorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCW1vdnpibAklZGgsJWVzaQorCXNobGwJJDgsJWVieAorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCXNobGwJJDE2LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJeG9ybAkxMDI0LTEyOCglcmJwLCVyY3gsNCksJWVheAorCW1vdmwJJWVheCwyNCglcmRpKQorCXhvcmwJNCglcmRpKSwlZWF4CisJbW92bAklZWF4LDI4KCVyZGkpCisJeG9ybAk4KCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMzIoJXJkaSkKKwl4b3JsCTEyKCVyZGkpLCVlYXgKKwltb3ZsCSVlYXgsMzYoJXJkaSkKKworCWNtcGwJJDcsJWVjeAorCWplCUwkMTJicmVhaworCWFkZGwJJDEsJWVjeAorCisJeG9ybAkxNiglcmRpKSwlZWF4CisJbW92bAklZWF4LDQwKCVyZGkpCisJeG9ybAkyMCglcmRpKSwlZWF4CisJbW92bAklZWF4LDQ0KCVyZGkpCisKKwlsZWFxCTI0KCVyZGkpLCVyZGkKKwlqbXAJTCQxMmxvb3AKK0wkMTJicmVhazoKKwltb3ZsCSQxMiw3MiglcmRpKQorCXhvcnEJJXJheCwlcmF4CisJam1wCUwkZXhpdAorCitMJDE0cm91bmRzOgorCW1vdnEJMCglcnNpKSwlcmF4CisJbW92cQk4KCVyc2kpLCVyYngKKwltb3ZxCTE2KCVyc2kpLCVyY3gKKwltb3ZxCTI0KCVyc2kpLCVyZHgKKwltb3ZxCSVyYXgsMCglcmRpKQorCW1vdnEJJXJieCw4KCVyZGkpCisJbW92cQklcmN4LDE2KCVyZGkpCisJbW92cQklcmR4LDI0KCVyZGkpCisKKwlzaHJxCSQzMiwlcmR4CisJeG9ybAklZWN4LCVlY3gKKwlqbXAJTCQxNHNob3J0Y3V0CisucDJhbGlnbgkyCitMJDE0bG9vcDoKKwltb3ZsCTAoJXJkaSksJWVheAorCW1vdmwJMjgoJXJkaSksJWVkeAorTCQxNHNob3J0Y3V0OgorCW1vdnpibAklZGwsJWVzaQorCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkMjQsJWVieAorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCXNocmwJJDE2LCVlZHgKKwltb3Z6YmwJJWRsLCVlc2kKKwl4b3JsCSVlYngsJWVheAorCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwlzaGxsCSQ4LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwlzaGxsCSQxNiwlZWJ4CisJeG9ybAklZWJ4LCVlYXgKKworCXhvcmwJMTAyNC0xMjgoJXJicCwlcmN4LDQpLCVlYXgKKwltb3ZsCSVlYXgsMzIoJXJkaSkKKwl4b3JsCTQoJXJkaSksJWVheAorCW1vdmwJJWVheCwzNiglcmRpKQorCXhvcmwJOCglcmRpKSwlZWF4CisJbW92bAklZWF4LDQwKCVyZGkpCisJeG9ybAkxMiglcmRpKSwlZWF4CisJbW92bAklZWF4LDQ0KCVyZGkpCisKKwljbXBsCSQ2LCVlY3gKKwlqZQlMJDE0YnJlYWsKKwlhZGRsCSQxLCVlY3gKKworCW1vdmwJJWVheCwlZWR4CisJbW92bAkxNiglcmRpKSwlZWF4CisJbW92emJsCSVkbCwlZXNpCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwltb3Z6YmwJJWRoLCVlc2kKKwl4b3JsCSVlYngsJWVheAorCisJbW92emJsCS0xMjgoJXJicCwlcnNpLDEpLCVlYngKKwlzaHJsCSQxNiwlZWR4CisJc2hsbAkkOCwlZWJ4CisJbW92emJsCSVkbCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKworCW1vdnpibAktMTI4KCVyYnAsJXJzaSwxKSwlZWJ4CisJbW92emJsCSVkaCwlZXNpCisJc2hsbAkkMTYsJWVieAorCXhvcmwJJWVieCwlZWF4CisKKwltb3Z6YmwJLTEyOCglcmJwLCVyc2ksMSksJWVieAorCXNobGwJJDI0LCVlYngKKwl4b3JsCSVlYngsJWVheAorCisJbW92bAklZWF4LDQ4KCVyZGkpCisJeG9ybAkyMCglcmRpKSwlZWF4CisJbW92bAklZWF4LDUyKCVyZGkpCisJeG9ybAkyNCglcmRpKSwlZWF4CisJbW92bAklZWF4LDU2KCVyZGkpCisJeG9ybAkyOCglcmRpKSwlZWF4CisJbW92bAklZWF4LDYwKCVyZGkpCisKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlqbXAJTCQxNGxvb3AKK0wkMTRicmVhazoKKwltb3ZsCSQxNCw0OCglcmRpKQorCXhvcnEJJXJheCwlcmF4CisJam1wCUwkZXhpdAorCitMJGJhZHBvaW50ZXI6CisJbW92cQkkLTEsJXJheAorTCRleGl0OgorLmJ5dGUJMHhmMywweGMzCisKKy5wMmFsaWduCTQKKy5nbG9ibAlfYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5CisucHJpdmF0ZV9leHRlcm4gX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleQorCitfYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5OgorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJcHVzaHEJJXJkeAorCitMJGRlY19rZXlfcHJvbG9ndWU6CisKKwljYWxsCV94ODZfNjRfQUVTX3NldF9lbmNyeXB0X2tleQorCW1vdnEJKCVyc3ApLCVyOAorCWNtcGwJJDAsJWVheAorCWpuZQlMJGFib3J0CisKKwltb3ZsCTI0MCglcjgpLCVyMTRkCisJeG9ycQklcmRpLCVyZGkKKwlsZWFxCSglcmRpLCVyMTQsNCksJXJjeAorCW1vdnEJJXI4LCVyc2kKKwlsZWFxCSglcjgsJXJjeCw0KSwlcmRpCisucDJhbGlnbgkyCitMJGludmVydDoKKwltb3ZxCTAoJXJzaSksJXJheAorCW1vdnEJOCglcnNpKSwlcmJ4CisJbW92cQkwKCVyZGkpLCVyY3gKKwltb3ZxCTgoJXJkaSksJXJkeAorCW1vdnEJJXJheCwwKCVyZGkpCisJbW92cQklcmJ4LDgoJXJkaSkKKwltb3ZxCSVyY3gsMCglcnNpKQorCW1vdnEJJXJkeCw4KCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJbGVhcQktMTYoJXJkaSksJXJkaQorCWNtcHEJJXJzaSwlcmRpCisJam5lCUwkaW52ZXJ0CisKKwlsZWFxCUwkQUVTX1RlKzIwNDgrMTAyNCglcmlwKSwlcmF4CisKKwltb3ZxCTQwKCVyYXgpLCVyc2kKKwltb3ZxCTQ4KCVyYXgpLCVyZGkKKwltb3ZxCTU2KCVyYXgpLCVyYnAKKworCW1vdnEJJXI4LCVyMTUKKwlzdWJsCSQxLCVyMTRkCisucDJhbGlnbgkyCitMJHBlcm11dGU6CisJbGVhcQkxNiglcjE1KSwlcjE1CisJbW92cQkwKCVyMTUpLCVyYXgKKwltb3ZxCTgoJXIxNSksJXJjeAorCW1vdnEJJXJzaSwlcjkKKwltb3ZxCSVyc2ksJXIxMgorCWFuZHEJJXJheCwlcjkKKwlhbmRxCSVyY3gsJXIxMgorCW1vdnEJJXI5LCVyYngKKwltb3ZxCSVyMTIsJXJkeAorCXNocnEJJDcsJXI5CisJbGVhcQkoJXJheCwlcmF4LDEpLCVyOAorCXNocnEJJDcsJXIxMgorCWxlYXEJKCVyY3gsJXJjeCwxKSwlcjExCisJc3VicQklcjksJXJieAorCXN1YnEJJXIxMiwlcmR4CisJYW5kcQklcmRpLCVyOAorCWFuZHEJJXJkaSwlcjExCisJYW5kcQklcmJwLCVyYngKKwlhbmRxCSVyYnAsJXJkeAorCXhvcnEJJXJieCwlcjgKKwl4b3JxCSVyZHgsJXIxMQorCW1vdnEJJXJzaSwlcjEwCisJbW92cQklcnNpLCVyMTMKKworCWFuZHEJJXI4LCVyMTAKKwlhbmRxCSVyMTEsJXIxMworCW1vdnEJJXIxMCwlcmJ4CisJbW92cQklcjEzLCVyZHgKKwlzaHJxCSQ3LCVyMTAKKwlsZWFxCSglcjgsJXI4LDEpLCVyOQorCXNocnEJJDcsJXIxMworCWxlYXEJKCVyMTEsJXIxMSwxKSwlcjEyCisJc3VicQklcjEwLCVyYngKKwlzdWJxCSVyMTMsJXJkeAorCWFuZHEJJXJkaSwlcjkKKwlhbmRxCSVyZGksJXIxMgorCWFuZHEJJXJicCwlcmJ4CisJYW5kcQklcmJwLCVyZHgKKwl4b3JxCSVyYngsJXI5CisJeG9ycQklcmR4LCVyMTIKKwltb3ZxCSVyc2ksJXIxMAorCW1vdnEJJXJzaSwlcjEzCisKKwlhbmRxCSVyOSwlcjEwCisJYW5kcQklcjEyLCVyMTMKKwltb3ZxCSVyMTAsJXJieAorCW1vdnEJJXIxMywlcmR4CisJc2hycQkkNywlcjEwCisJeG9ycQklcmF4LCVyOAorCXNocnEJJDcsJXIxMworCXhvcnEJJXJjeCwlcjExCisJc3VicQklcjEwLCVyYngKKwlzdWJxCSVyMTMsJXJkeAorCWxlYXEJKCVyOSwlcjksMSksJXIxMAorCWxlYXEJKCVyMTIsJXIxMiwxKSwlcjEzCisJeG9ycQklcmF4LCVyOQorCXhvcnEJJXJjeCwlcjEyCisJYW5kcQklcmRpLCVyMTAKKwlhbmRxCSVyZGksJXIxMworCWFuZHEJJXJicCwlcmJ4CisJYW5kcQklcmJwLCVyZHgKKwl4b3JxCSVyYngsJXIxMAorCXhvcnEJJXJkeCwlcjEzCisKKwl4b3JxCSVyMTAsJXJheAorCXhvcnEJJXIxMywlcmN4CisJeG9ycQklcjEwLCVyOAorCXhvcnEJJXIxMywlcjExCisJbW92cQklcmF4LCVyYngKKwltb3ZxCSVyY3gsJXJkeAorCXhvcnEJJXIxMCwlcjkKKwlzaHJxCSQzMiwlcmJ4CisJeG9ycQklcjEzLCVyMTIKKwlzaHJxCSQzMiwlcmR4CisJeG9ycQklcjgsJXIxMAorCXJvbGwJJDgsJWVheAorCXhvcnEJJXIxMSwlcjEzCisJcm9sbAkkOCwlZWN4CisJeG9ycQklcjksJXIxMAorCXJvbGwJJDgsJWVieAorCXhvcnEJJXIxMiwlcjEzCisKKwlyb2xsCSQ4LCVlZHgKKwl4b3JsCSVyMTBkLCVlYXgKKwlzaHJxCSQzMiwlcjEwCisJeG9ybAklcjEzZCwlZWN4CisJc2hycQkkMzIsJXIxMworCXhvcmwJJXIxMGQsJWVieAorCXhvcmwJJXIxM2QsJWVkeAorCisJbW92cQklcjgsJXIxMAorCXJvbGwJJDI0LCVyOGQKKwltb3ZxCSVyMTEsJXIxMworCXJvbGwJJDI0LCVyMTFkCisJc2hycQkkMzIsJXIxMAorCXhvcmwJJXI4ZCwlZWF4CisJc2hycQkkMzIsJXIxMworCXhvcmwJJXIxMWQsJWVjeAorCXJvbGwJJDI0LCVyMTBkCisJbW92cQklcjksJXI4CisJcm9sbAkkMjQsJXIxM2QKKwltb3ZxCSVyMTIsJXIxMQorCXNocnEJJDMyLCVyOAorCXhvcmwJJXIxMGQsJWVieAorCXNocnEJJDMyLCVyMTEKKwl4b3JsCSVyMTNkLCVlZHgKKworCisJcm9sbAkkMTYsJXI5ZAorCisJcm9sbAkkMTYsJXIxMmQKKworCXJvbGwJJDE2LCVyOGQKKworCXhvcmwJJXI5ZCwlZWF4CisJcm9sbAkkMTYsJXIxMWQKKwl4b3JsCSVyMTJkLCVlY3gKKworCXhvcmwJJXI4ZCwlZWJ4CisJeG9ybAklcjExZCwlZWR4CisJbW92bAklZWF4LDAoJXIxNSkKKwltb3ZsCSVlYngsNCglcjE1KQorCW1vdmwJJWVjeCw4KCVyMTUpCisJbW92bAklZWR4LDEyKCVyMTUpCisJc3VibAkkMSwlcjE0ZAorCWpueglMJHBlcm11dGUKKworCXhvcnEJJXJheCwlcmF4CitMJGFib3J0OgorCW1vdnEJOCglcnNwKSwlcjE1CisKKwltb3ZxCTE2KCVyc3ApLCVyMTQKKworCW1vdnEJMjQoJXJzcCksJXIxMworCisJbW92cQkzMiglcnNwKSwlcjEyCisKKwltb3ZxCTQwKCVyc3ApLCVyYnAKKworCW1vdnEJNDgoJXJzcCksJXJieAorCisJYWRkcQkkNTYsJXJzcAorCitMJGRlY19rZXlfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworLnAyYWxpZ24JNAorLmdsb2JsCV9hZXNfbm9od19jYmNfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuIF9hZXNfbm9od19jYmNfZW5jcnlwdAorCisKKy5wcml2YXRlX2V4dGVybglfYWVzX25vaHdfY2JjX2VuY3J5cHQKK19hZXNfbm9od19jYmNfZW5jcnlwdDoKKworCWNtcHEJJDAsJXJkeAorCWplCUwkY2JjX2VwaWxvZ3VlCisJcHVzaGZxCisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKK0wkY2JjX3Byb2xvZ3VlOgorCisJY2xkCisJbW92bAklcjlkLCVyOWQKKworCWxlYXEJTCRBRVNfVGUoJXJpcCksJXIxNAorCWxlYXEJTCRBRVNfVGQoJXJpcCksJXIxMAorCWNtcHEJJDAsJXI5CisJY21vdmVxCSVyMTAsJXIxNAorCisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXIxMAorCW1vdmwJKCVyMTApLCVyMTBkCisJY21wcQkkNTEyLCVyZHgKKwlqYglMJGNiY19zbG93X3Byb2xvZ3VlCisJdGVzdHEJJDE1LCVyZHgKKwlqbnoJTCRjYmNfc2xvd19wcm9sb2d1ZQorCWJ0bAkkMjgsJXIxMGQKKwlqYwlMJGNiY19zbG93X3Byb2xvZ3VlCisKKworCWxlYXEJLTg4LTI0OCglcnNwKSwlcjE1CisJYW5kcQkkLTY0LCVyMTUKKworCisJbW92cQklcjE0LCVyMTAKKwlsZWFxCTIzMDQoJXIxNCksJXIxMQorCW1vdnEJJXIxNSwlcjEyCisJYW5kcQkkMHhGRkYsJXIxMAorCWFuZHEJJDB4RkZGLCVyMTEKKwlhbmRxCSQweEZGRiwlcjEyCisKKwljbXBxCSVyMTEsJXIxMgorCWpiCUwkY2JjX3RlX2JyZWFrX291dAorCXN1YnEJJXIxMSwlcjEyCisJc3VicQklcjEyLCVyMTUKKwlqbXAJTCRjYmNfdGVfb2sKK0wkY2JjX3RlX2JyZWFrX291dDoKKwlzdWJxCSVyMTAsJXIxMgorCWFuZHEJJDB4RkZGLCVyMTIKKwlhZGRxCSQzMjAsJXIxMgorCXN1YnEJJXIxMiwlcjE1CisucDJhbGlnbgkyCitMJGNiY190ZV9vazoKKworCXhjaGdxCSVyc3AsJXIxNQorCisKKwltb3ZxCSVyMTUsMTYoJXJzcCkKKworTCRjYmNfZmFzdF9ib2R5OgorCW1vdnEJJXJkaSwyNCglcnNwKQorCW1vdnEJJXJzaSwzMiglcnNwKQorCW1vdnEJJXJkeCw0MCglcnNwKQorCW1vdnEJJXJjeCw0OCglcnNwKQorCW1vdnEJJXI4LDU2KCVyc3ApCisJbW92bAkkMCw4MCsyNDAoJXJzcCkKKwltb3ZxCSVyOCwlcmJwCisJbW92cQklcjksJXJieAorCW1vdnEJJXJzaSwlcjkKKwltb3ZxCSVyZGksJXI4CisJbW92cQklcmN4LCVyMTUKKworCW1vdmwJMjQwKCVyMTUpLCVlYXgKKworCW1vdnEJJXIxNSwlcjEwCisJc3VicQklcjE0LCVyMTAKKwlhbmRxCSQweGZmZiwlcjEwCisJY21wcQkkMjMwNCwlcjEwCisJamIJTCRjYmNfZG9fZWNvcHkKKwljbXBxCSQ0MDk2LTI0OCwlcjEwCisJamIJTCRjYmNfc2tpcF9lY29weQorLnAyYWxpZ24JMgorTCRjYmNfZG9fZWNvcHk6CisJbW92cQklcjE1LCVyc2kKKwlsZWFxCTgwKCVyc3ApLCVyZGkKKwlsZWFxCTgwKCVyc3ApLCVyMTUKKwltb3ZsCSQzMCwlZWN4CisubG9uZwkweDkwQTU0OEYzCisJbW92bAklZWF4LCglcmRpKQorTCRjYmNfc2tpcF9lY29weToKKwltb3ZxCSVyMTUsMCglcnNwKQorCisJbW92bAkkMTgsJWVjeAorLnAyYWxpZ24JMgorTCRjYmNfcHJlZmV0Y2hfdGU6CisJbW92cQkwKCVyMTQpLCVyMTAKKwltb3ZxCTMyKCVyMTQpLCVyMTEKKwltb3ZxCTY0KCVyMTQpLCVyMTIKKwltb3ZxCTk2KCVyMTQpLCVyMTMKKwlsZWFxCTEyOCglcjE0KSwlcjE0CisJc3VibAkkMSwlZWN4CisJam56CUwkY2JjX3ByZWZldGNoX3RlCisJbGVhcQktMjMwNCglcjE0KSwlcjE0CisKKwljbXBxCSQwLCVyYngKKwlqZQlMJEZBU1RfREVDUllQVAorCisKKwltb3ZsCTAoJXJicCksJWVheAorCW1vdmwJNCglcmJwKSwlZWJ4CisJbW92bAk4KCVyYnApLCVlY3gKKwltb3ZsCTEyKCVyYnApLCVlZHgKKworLnAyYWxpZ24JMgorTCRjYmNfZmFzdF9lbmNfbG9vcDoKKwl4b3JsCTAoJXI4KSwlZWF4CisJeG9ybAk0KCVyOCksJWVieAorCXhvcmwJOCglcjgpLCVlY3gKKwl4b3JsCTEyKCVyOCksJWVkeAorCW1vdnEJMCglcnNwKSwlcjE1CisJbW92cQklcjgsMjQoJXJzcCkKKworCWNhbGwJX3g4Nl82NF9BRVNfZW5jcnlwdAorCisJbW92cQkyNCglcnNwKSwlcjgKKwltb3ZxCTQwKCVyc3ApLCVyMTAKKwltb3ZsCSVlYXgsMCglcjkpCisJbW92bAklZWJ4LDQoJXI5KQorCW1vdmwJJWVjeCw4KCVyOSkKKwltb3ZsCSVlZHgsMTIoJXI5KQorCisJbGVhcQkxNiglcjgpLCVyOAorCWxlYXEJMTYoJXI5KSwlcjkKKwlzdWJxCSQxNiwlcjEwCisJdGVzdHEJJC0xNiwlcjEwCisJbW92cQklcjEwLDQwKCVyc3ApCisJam56CUwkY2JjX2Zhc3RfZW5jX2xvb3AKKwltb3ZxCTU2KCVyc3ApLCVyYnAKKwltb3ZsCSVlYXgsMCglcmJwKQorCW1vdmwJJWVieCw0KCVyYnApCisJbW92bAklZWN4LDgoJXJicCkKKwltb3ZsCSVlZHgsMTIoJXJicCkKKworCWptcAlMJGNiY19mYXN0X2NsZWFudXAKKworCisucDJhbGlnbgk0CitMJEZBU1RfREVDUllQVDoKKwljbXBxCSVyOCwlcjkKKwlqZQlMJGNiY19mYXN0X2RlY19pbl9wbGFjZQorCisJbW92cQklcmJwLDY0KCVyc3ApCisucDJhbGlnbgkyCitMJGNiY19mYXN0X2RlY19sb29wOgorCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92cQkwKCVyc3ApLCVyMTUKKwltb3ZxCSVyOCwyNCglcnNwKQorCisJY2FsbAlfeDg2XzY0X0FFU19kZWNyeXB0CisKKwltb3ZxCTY0KCVyc3ApLCVyYnAKKwltb3ZxCTI0KCVyc3ApLCVyOAorCW1vdnEJNDAoJXJzcCksJXIxMAorCXhvcmwJMCglcmJwKSwlZWF4CisJeG9ybAk0KCVyYnApLCVlYngKKwl4b3JsCTgoJXJicCksJWVjeAorCXhvcmwJMTIoJXJicCksJWVkeAorCW1vdnEJJXI4LCVyYnAKKworCXN1YnEJJDE2LCVyMTAKKwltb3ZxCSVyMTAsNDAoJXJzcCkKKwltb3ZxCSVyYnAsNjQoJXJzcCkKKworCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKwlsZWFxCTE2KCVyOCksJXI4CisJbGVhcQkxNiglcjkpLCVyOQorCWpueglMJGNiY19mYXN0X2RlY19sb29wCisJbW92cQk1NiglcnNwKSwlcjEyCisJbW92cQkwKCVyYnApLCVyMTAKKwltb3ZxCTgoJXJicCksJXIxMQorCW1vdnEJJXIxMCwwKCVyMTIpCisJbW92cQklcjExLDgoJXIxMikKKwlqbXAJTCRjYmNfZmFzdF9jbGVhbnVwCisKKy5wMmFsaWduCTQKK0wkY2JjX2Zhc3RfZGVjX2luX3BsYWNlOgorCW1vdnEJMCglcmJwKSwlcjEwCisJbW92cQk4KCVyYnApLCVyMTEKKwltb3ZxCSVyMTAsMCs2NCglcnNwKQorCW1vdnEJJXIxMSw4KzY0KCVyc3ApCisucDJhbGlnbgkyCitMJGNiY19mYXN0X2RlY19pbl9wbGFjZV9sb29wOgorCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92cQkwKCVyc3ApLCVyMTUKKwltb3ZxCSVyOCwyNCglcnNwKQorCisJY2FsbAlfeDg2XzY0X0FFU19kZWNyeXB0CisKKwltb3ZxCTI0KCVyc3ApLCVyOAorCW1vdnEJNDAoJXJzcCksJXIxMAorCXhvcmwJMCs2NCglcnNwKSwlZWF4CisJeG9ybAk0KzY0KCVyc3ApLCVlYngKKwl4b3JsCTgrNjQoJXJzcCksJWVjeAorCXhvcmwJMTIrNjQoJXJzcCksJWVkeAorCisJbW92cQkwKCVyOCksJXIxMQorCW1vdnEJOCglcjgpLCVyMTIKKwlzdWJxCSQxNiwlcjEwCisJanoJTCRjYmNfZmFzdF9kZWNfaW5fcGxhY2VfZG9uZQorCisJbW92cQklcjExLDArNjQoJXJzcCkKKwltb3ZxCSVyMTIsOCs2NCglcnNwKQorCisJbW92bAklZWF4LDAoJXI5KQorCW1vdmwJJWVieCw0KCVyOSkKKwltb3ZsCSVlY3gsOCglcjkpCisJbW92bAklZWR4LDEyKCVyOSkKKworCWxlYXEJMTYoJXI4KSwlcjgKKwlsZWFxCTE2KCVyOSksJXI5CisJbW92cQklcjEwLDQwKCVyc3ApCisJam1wCUwkY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2xvb3AKK0wkY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2RvbmU6CisJbW92cQk1NiglcnNwKSwlcmRpCisJbW92cQklcjExLDAoJXJkaSkKKwltb3ZxCSVyMTIsOCglcmRpKQorCisJbW92bAklZWF4LDAoJXI5KQorCW1vdmwJJWVieCw0KCVyOSkKKwltb3ZsCSVlY3gsOCglcjkpCisJbW92bAklZWR4LDEyKCVyOSkKKworLnAyYWxpZ24JMgorTCRjYmNfZmFzdF9jbGVhbnVwOgorCWNtcGwJJDAsODArMjQwKCVyc3ApCisJbGVhcQk4MCglcnNwKSwlcmRpCisJamUJTCRjYmNfZXhpdAorCW1vdmwJJDMwLCVlY3gKKwl4b3JxCSVyYXgsJXJheAorLmxvbmcJMHg5MEFCNDhGMworCisJam1wCUwkY2JjX2V4aXQKKworCisucDJhbGlnbgk0CitMJGNiY19zbG93X3Byb2xvZ3VlOgorCisJbGVhcQktODgoJXJzcCksJXJicAorCWFuZHEJJC02NCwlcmJwCisKKwlsZWFxCS04OC02MyglcmN4KSwlcjEwCisJc3VicQklcmJwLCVyMTAKKwluZWdxCSVyMTAKKwlhbmRxCSQweDNjMCwlcjEwCisJc3VicQklcjEwLCVyYnAKKworCXhjaGdxCSVyc3AsJXJicAorCisJbW92cQklcmJwLDE2KCVyc3ApCitMJGNiY19zbG93X2JvZHk6CisKKworCisKKwltb3ZxCSVyOCw1NiglcnNwKQorCW1vdnEJJXI4LCVyYnAKKwltb3ZxCSVyOSwlcmJ4CisJbW92cQklcnNpLCVyOQorCW1vdnEJJXJkaSwlcjgKKwltb3ZxCSVyY3gsJXIxNQorCW1vdnEJJXJkeCwlcjEwCisKKwltb3ZsCTI0MCglcjE1KSwlZWF4CisJbW92cQklcjE1LDAoJXJzcCkKKwlzaGxsCSQ0LCVlYXgKKwlsZWFxCSglcjE1LCVyYXgsMSksJXJheAorCW1vdnEJJXJheCw4KCVyc3ApCisKKworCWxlYXEJMjA0OCglcjE0KSwlcjE0CisJbGVhcQk3NjgtOCglcnNwKSwlcmF4CisJc3VicQklcjE0LCVyYXgKKwlhbmRxCSQweDMwMCwlcmF4CisJbGVhcQkoJXIxNCwlcmF4LDEpLCVyMTQKKworCWNtcHEJJDAsJXJieAorCWplCUwkU0xPV19ERUNSWVBUCisKKworCXRlc3RxCSQtMTYsJXIxMAorCW1vdmwJMCglcmJwKSwlZWF4CisJbW92bAk0KCVyYnApLCVlYngKKwltb3ZsCTgoJXJicCksJWVjeAorCW1vdmwJMTIoJXJicCksJWVkeAorCWp6CUwkY2JjX3Nsb3dfZW5jX3RhaWwKKworLnAyYWxpZ24JMgorTCRjYmNfc2xvd19lbmNfbG9vcDoKKwl4b3JsCTAoJXI4KSwlZWF4CisJeG9ybAk0KCVyOCksJWVieAorCXhvcmwJOCglcjgpLCVlY3gKKwl4b3JsCTEyKCVyOCksJWVkeAorCW1vdnEJMCglcnNwKSwlcjE1CisJbW92cQklcjgsMjQoJXJzcCkKKwltb3ZxCSVyOSwzMiglcnNwKQorCW1vdnEJJXIxMCw0MCglcnNwKQorCisJY2FsbAlfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QKKworCW1vdnEJMjQoJXJzcCksJXI4CisJbW92cQkzMiglcnNwKSwlcjkKKwltb3ZxCTQwKCVyc3ApLCVyMTAKKwltb3ZsCSVlYXgsMCglcjkpCisJbW92bAklZWJ4LDQoJXI5KQorCW1vdmwJJWVjeCw4KCVyOSkKKwltb3ZsCSVlZHgsMTIoJXI5KQorCisJbGVhcQkxNiglcjgpLCVyOAorCWxlYXEJMTYoJXI5KSwlcjkKKwlzdWJxCSQxNiwlcjEwCisJdGVzdHEJJC0xNiwlcjEwCisJam56CUwkY2JjX3Nsb3dfZW5jX2xvb3AKKwl0ZXN0cQkkMTUsJXIxMAorCWpueglMJGNiY19zbG93X2VuY190YWlsCisJbW92cQk1NiglcnNwKSwlcmJwCisJbW92bAklZWF4LDAoJXJicCkKKwltb3ZsCSVlYngsNCglcmJwKQorCW1vdmwJJWVjeCw4KCVyYnApCisJbW92bAklZWR4LDEyKCVyYnApCisKKwlqbXAJTCRjYmNfZXhpdAorCisucDJhbGlnbgkyCitMJGNiY19zbG93X2VuY190YWlsOgorCW1vdnEJJXJheCwlcjExCisJbW92cQklcmN4LCVyMTIKKwltb3ZxCSVyMTAsJXJjeAorCW1vdnEJJXI4LCVyc2kKKwltb3ZxCSVyOSwlcmRpCisubG9uZwkweDkwNjZBNEYzCisJbW92cQkkMTYsJXJjeAorCXN1YnEJJXIxMCwlcmN4CisJeG9ycQklcmF4LCVyYXgKKy5sb25nCTB4OTA2NkFBRjMKKwltb3ZxCSVyOSwlcjgKKwltb3ZxCSQxNiwlcjEwCisJbW92cQklcjExLCVyYXgKKwltb3ZxCSVyMTIsJXJjeAorCWptcAlMJGNiY19zbG93X2VuY19sb29wCisKKy5wMmFsaWduCTQKK0wkU0xPV19ERUNSWVBUOgorCXNocnEJJDMsJXJheAorCWFkZHEJJXJheCwlcjE0CisKKwltb3ZxCTAoJXJicCksJXIxMQorCW1vdnEJOCglcmJwKSwlcjEyCisJbW92cQklcjExLDArNjQoJXJzcCkKKwltb3ZxCSVyMTIsOCs2NCglcnNwKQorCisucDJhbGlnbgkyCitMJGNiY19zbG93X2RlY19sb29wOgorCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92cQkwKCVyc3ApLCVyMTUKKwltb3ZxCSVyOCwyNCglcnNwKQorCW1vdnEJJXI5LDMyKCVyc3ApCisJbW92cQklcjEwLDQwKCVyc3ApCisKKwljYWxsCV94ODZfNjRfQUVTX2RlY3J5cHRfY29tcGFjdAorCisJbW92cQkyNCglcnNwKSwlcjgKKwltb3ZxCTMyKCVyc3ApLCVyOQorCW1vdnEJNDAoJXJzcCksJXIxMAorCXhvcmwJMCs2NCglcnNwKSwlZWF4CisJeG9ybAk0KzY0KCVyc3ApLCVlYngKKwl4b3JsCTgrNjQoJXJzcCksJWVjeAorCXhvcmwJMTIrNjQoJXJzcCksJWVkeAorCisJbW92cQkwKCVyOCksJXIxMQorCW1vdnEJOCglcjgpLCVyMTIKKwlzdWJxCSQxNiwlcjEwCisJamMJTCRjYmNfc2xvd19kZWNfcGFydGlhbAorCWp6CUwkY2JjX3Nsb3dfZGVjX2RvbmUKKworCW1vdnEJJXIxMSwwKzY0KCVyc3ApCisJbW92cQklcjEyLDgrNjQoJXJzcCkKKworCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKwlsZWFxCTE2KCVyOCksJXI4CisJbGVhcQkxNiglcjkpLCVyOQorCWptcAlMJGNiY19zbG93X2RlY19sb29wCitMJGNiY19zbG93X2RlY19kb25lOgorCW1vdnEJNTYoJXJzcCksJXJkaQorCW1vdnEJJXIxMSwwKCVyZGkpCisJbW92cQklcjEyLDgoJXJkaSkKKworCW1vdmwJJWVheCwwKCVyOSkKKwltb3ZsCSVlYngsNCglcjkpCisJbW92bAklZWN4LDgoJXI5KQorCW1vdmwJJWVkeCwxMiglcjkpCisKKwlqbXAJTCRjYmNfZXhpdAorCisucDJhbGlnbgkyCitMJGNiY19zbG93X2RlY19wYXJ0aWFsOgorCW1vdnEJNTYoJXJzcCksJXJkaQorCW1vdnEJJXIxMSwwKCVyZGkpCisJbW92cQklcjEyLDgoJXJkaSkKKworCW1vdmwJJWVheCwwKzY0KCVyc3ApCisJbW92bAklZWJ4LDQrNjQoJXJzcCkKKwltb3ZsCSVlY3gsOCs2NCglcnNwKQorCW1vdmwJJWVkeCwxMis2NCglcnNwKQorCisJbW92cQklcjksJXJkaQorCWxlYXEJNjQoJXJzcCksJXJzaQorCWxlYXEJMTYoJXIxMCksJXJjeAorLmxvbmcJMHg5MDY2QTRGMworCWptcAlMJGNiY19leGl0CisKKy5wMmFsaWduCTQKK0wkY2JjX2V4aXQ6CisJbW92cQkxNiglcnNwKSwlcnNpCisKKwltb3ZxCSglcnNpKSwlcjE1CisKKwltb3ZxCTgoJXJzaSksJXIxNAorCisJbW92cQkxNiglcnNpKSwlcjEzCisKKwltb3ZxCTI0KCVyc2kpLCVyMTIKKworCW1vdnEJMzIoJXJzaSksJXJicAorCisJbW92cQk0MCglcnNpKSwlcmJ4CisKKwlsZWFxCTQ4KCVyc2kpLCVyc3AKKworTCRjYmNfcG9wZnE6CisJcG9wZnEKKworTCRjYmNfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworLnAyYWxpZ24JNgorTCRBRVNfVGU6CisubG9uZwkweGE1NjM2M2M2LDB4YTU2MzYzYzYKKy5sb25nCTB4ODQ3YzdjZjgsMHg4NDdjN2NmOAorLmxvbmcJMHg5OTc3NzdlZSwweDk5Nzc3N2VlCisubG9uZwkweDhkN2I3YmY2LDB4OGQ3YjdiZjYKKy5sb25nCTB4MGRmMmYyZmYsMHgwZGYyZjJmZgorLmxvbmcJMHhiZDZiNmJkNiwweGJkNmI2YmQ2CisubG9uZwkweGIxNmY2ZmRlLDB4YjE2ZjZmZGUKKy5sb25nCTB4NTRjNWM1OTEsMHg1NGM1YzU5MQorLmxvbmcJMHg1MDMwMzA2MCwweDUwMzAzMDYwCisubG9uZwkweDAzMDEwMTAyLDB4MDMwMTAxMDIKKy5sb25nCTB4YTk2NzY3Y2UsMHhhOTY3NjdjZQorLmxvbmcJMHg3ZDJiMmI1NiwweDdkMmIyYjU2CisubG9uZwkweDE5ZmVmZWU3LDB4MTlmZWZlZTcKKy5sb25nCTB4NjJkN2Q3YjUsMHg2MmQ3ZDdiNQorLmxvbmcJMHhlNmFiYWI0ZCwweGU2YWJhYjRkCisubG9uZwkweDlhNzY3NmVjLDB4OWE3Njc2ZWMKKy5sb25nCTB4NDVjYWNhOGYsMHg0NWNhY2E4ZgorLmxvbmcJMHg5ZDgyODIxZiwweDlkODI4MjFmCisubG9uZwkweDQwYzljOTg5LDB4NDBjOWM5ODkKKy5sb25nCTB4ODc3ZDdkZmEsMHg4NzdkN2RmYQorLmxvbmcJMHgxNWZhZmFlZiwweDE1ZmFmYWVmCisubG9uZwkweGViNTk1OWIyLDB4ZWI1OTU5YjIKKy5sb25nCTB4Yzk0NzQ3OGUsMHhjOTQ3NDc4ZQorLmxvbmcJMHgwYmYwZjBmYiwweDBiZjBmMGZiCisubG9uZwkweGVjYWRhZDQxLDB4ZWNhZGFkNDEKKy5sb25nCTB4NjdkNGQ0YjMsMHg2N2Q0ZDRiMworLmxvbmcJMHhmZGEyYTI1ZiwweGZkYTJhMjVmCisubG9uZwkweGVhYWZhZjQ1LDB4ZWFhZmFmNDUKKy5sb25nCTB4YmY5YzljMjMsMHhiZjljOWMyMworLmxvbmcJMHhmN2E0YTQ1MywweGY3YTRhNDUzCisubG9uZwkweDk2NzI3MmU0LDB4OTY3MjcyZTQKKy5sb25nCTB4NWJjMGMwOWIsMHg1YmMwYzA5YgorLmxvbmcJMHhjMmI3Yjc3NSwweGMyYjdiNzc1CisubG9uZwkweDFjZmRmZGUxLDB4MWNmZGZkZTEKKy5sb25nCTB4YWU5MzkzM2QsMHhhZTkzOTMzZAorLmxvbmcJMHg2YTI2MjY0YywweDZhMjYyNjRjCisubG9uZwkweDVhMzYzNjZjLDB4NWEzNjM2NmMKKy5sb25nCTB4NDEzZjNmN2UsMHg0MTNmM2Y3ZQorLmxvbmcJMHgwMmY3ZjdmNSwweDAyZjdmN2Y1CisubG9uZwkweDRmY2NjYzgzLDB4NGZjY2NjODMKKy5sb25nCTB4NWMzNDM0NjgsMHg1YzM0MzQ2OAorLmxvbmcJMHhmNGE1YTU1MSwweGY0YTVhNTUxCisubG9uZwkweDM0ZTVlNWQxLDB4MzRlNWU1ZDEKKy5sb25nCTB4MDhmMWYxZjksMHgwOGYxZjFmOQorLmxvbmcJMHg5MzcxNzFlMiwweDkzNzE3MWUyCisubG9uZwkweDczZDhkOGFiLDB4NzNkOGQ4YWIKKy5sb25nCTB4NTMzMTMxNjIsMHg1MzMxMzE2MgorLmxvbmcJMHgzZjE1MTUyYSwweDNmMTUxNTJhCisubG9uZwkweDBjMDQwNDA4LDB4MGMwNDA0MDgKKy5sb25nCTB4NTJjN2M3OTUsMHg1MmM3Yzc5NQorLmxvbmcJMHg2NTIzMjM0NiwweDY1MjMyMzQ2CisubG9uZwkweDVlYzNjMzlkLDB4NWVjM2MzOWQKKy5sb25nCTB4MjgxODE4MzAsMHgyODE4MTgzMAorLmxvbmcJMHhhMTk2OTYzNywweGExOTY5NjM3CisubG9uZwkweDBmMDUwNTBhLDB4MGYwNTA1MGEKKy5sb25nCTB4YjU5YTlhMmYsMHhiNTlhOWEyZgorLmxvbmcJMHgwOTA3MDcwZSwweDA5MDcwNzBlCisubG9uZwkweDM2MTIxMjI0LDB4MzYxMjEyMjQKKy5sb25nCTB4OWI4MDgwMWIsMHg5YjgwODAxYgorLmxvbmcJMHgzZGUyZTJkZiwweDNkZTJlMmRmCisubG9uZwkweDI2ZWJlYmNkLDB4MjZlYmViY2QKKy5sb25nCTB4NjkyNzI3NGUsMHg2OTI3Mjc0ZQorLmxvbmcJMHhjZGIyYjI3ZiwweGNkYjJiMjdmCisubG9uZwkweDlmNzU3NWVhLDB4OWY3NTc1ZWEKKy5sb25nCTB4MWIwOTA5MTIsMHgxYjA5MDkxMgorLmxvbmcJMHg5ZTgzODMxZCwweDllODM4MzFkCisubG9uZwkweDc0MmMyYzU4LDB4NzQyYzJjNTgKKy5sb25nCTB4MmUxYTFhMzQsMHgyZTFhMWEzNAorLmxvbmcJMHgyZDFiMWIzNiwweDJkMWIxYjM2CisubG9uZwkweGIyNmU2ZWRjLDB4YjI2ZTZlZGMKKy5sb25nCTB4ZWU1YTVhYjQsMHhlZTVhNWFiNAorLmxvbmcJMHhmYmEwYTA1YiwweGZiYTBhMDViCisubG9uZwkweGY2NTI1MmE0LDB4ZjY1MjUyYTQKKy5sb25nCTB4NGQzYjNiNzYsMHg0ZDNiM2I3NgorLmxvbmcJMHg2MWQ2ZDZiNywweDYxZDZkNmI3CisubG9uZwkweGNlYjNiMzdkLDB4Y2ViM2IzN2QKKy5sb25nCTB4N2IyOTI5NTIsMHg3YjI5Mjk1MgorLmxvbmcJMHgzZWUzZTNkZCwweDNlZTNlM2RkCisubG9uZwkweDcxMmYyZjVlLDB4NzEyZjJmNWUKKy5sb25nCTB4OTc4NDg0MTMsMHg5Nzg0ODQxMworLmxvbmcJMHhmNTUzNTNhNiwweGY1NTM1M2E2CisubG9uZwkweDY4ZDFkMWI5LDB4NjhkMWQxYjkKKy5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorLmxvbmcJMHgyY2VkZWRjMSwweDJjZWRlZGMxCisubG9uZwkweDYwMjAyMDQwLDB4NjAyMDIwNDAKKy5sb25nCTB4MWZmY2ZjZTMsMHgxZmZjZmNlMworLmxvbmcJMHhjOGIxYjE3OSwweGM4YjFiMTc5CisubG9uZwkweGVkNWI1YmI2LDB4ZWQ1YjViYjYKKy5sb25nCTB4YmU2YTZhZDQsMHhiZTZhNmFkNAorLmxvbmcJMHg0NmNiY2I4ZCwweDQ2Y2JjYjhkCisubG9uZwkweGQ5YmViZTY3LDB4ZDliZWJlNjcKKy5sb25nCTB4NGIzOTM5NzIsMHg0YjM5Mzk3MgorLmxvbmcJMHhkZTRhNGE5NCwweGRlNGE0YTk0CisubG9uZwkweGQ0NGM0Yzk4LDB4ZDQ0YzRjOTgKKy5sb25nCTB4ZTg1ODU4YjAsMHhlODU4NThiMAorLmxvbmcJMHg0YWNmY2Y4NSwweDRhY2ZjZjg1CisubG9uZwkweDZiZDBkMGJiLDB4NmJkMGQwYmIKKy5sb25nCTB4MmFlZmVmYzUsMHgyYWVmZWZjNQorLmxvbmcJMHhlNWFhYWE0ZiwweGU1YWFhYTRmCisubG9uZwkweDE2ZmJmYmVkLDB4MTZmYmZiZWQKKy5sb25nCTB4YzU0MzQzODYsMHhjNTQzNDM4NgorLmxvbmcJMHhkNzRkNGQ5YSwweGQ3NGQ0ZDlhCisubG9uZwkweDU1MzMzMzY2LDB4NTUzMzMzNjYKKy5sb25nCTB4OTQ4NTg1MTEsMHg5NDg1ODUxMQorLmxvbmcJMHhjZjQ1NDU4YSwweGNmNDU0NThhCisubG9uZwkweDEwZjlmOWU5LDB4MTBmOWY5ZTkKKy5sb25nCTB4MDYwMjAyMDQsMHgwNjAyMDIwNAorLmxvbmcJMHg4MTdmN2ZmZSwweDgxN2Y3ZmZlCisubG9uZwkweGYwNTA1MGEwLDB4ZjA1MDUwYTAKKy5sb25nCTB4NDQzYzNjNzgsMHg0NDNjM2M3OAorLmxvbmcJMHhiYTlmOWYyNSwweGJhOWY5ZjI1CisubG9uZwkweGUzYThhODRiLDB4ZTNhOGE4NGIKKy5sb25nCTB4ZjM1MTUxYTIsMHhmMzUxNTFhMgorLmxvbmcJMHhmZWEzYTM1ZCwweGZlYTNhMzVkCisubG9uZwkweGMwNDA0MDgwLDB4YzA0MDQwODAKKy5sb25nCTB4OGE4ZjhmMDUsMHg4YThmOGYwNQorLmxvbmcJMHhhZDkyOTIzZiwweGFkOTI5MjNmCisubG9uZwkweGJjOWQ5ZDIxLDB4YmM5ZDlkMjEKKy5sb25nCTB4NDgzODM4NzAsMHg0ODM4Mzg3MAorLmxvbmcJMHgwNGY1ZjVmMSwweDA0ZjVmNWYxCisubG9uZwkweGRmYmNiYzYzLDB4ZGZiY2JjNjMKKy5sb25nCTB4YzFiNmI2NzcsMHhjMWI2YjY3NworLmxvbmcJMHg3NWRhZGFhZiwweDc1ZGFkYWFmCisubG9uZwkweDYzMjEyMTQyLDB4NjMyMTIxNDIKKy5sb25nCTB4MzAxMDEwMjAsMHgzMDEwMTAyMAorLmxvbmcJMHgxYWZmZmZlNSwweDFhZmZmZmU1CisubG9uZwkweDBlZjNmM2ZkLDB4MGVmM2YzZmQKKy5sb25nCTB4NmRkMmQyYmYsMHg2ZGQyZDJiZgorLmxvbmcJMHg0Y2NkY2Q4MSwweDRjY2RjZDgxCisubG9uZwkweDE0MGMwYzE4LDB4MTQwYzBjMTgKKy5sb25nCTB4MzUxMzEzMjYsMHgzNTEzMTMyNgorLmxvbmcJMHgyZmVjZWNjMywweDJmZWNlY2MzCisubG9uZwkweGUxNWY1ZmJlLDB4ZTE1ZjVmYmUKKy5sb25nCTB4YTI5Nzk3MzUsMHhhMjk3OTczNQorLmxvbmcJMHhjYzQ0NDQ4OCwweGNjNDQ0NDg4CisubG9uZwkweDM5MTcxNzJlLDB4MzkxNzE3MmUKKy5sb25nCTB4NTdjNGM0OTMsMHg1N2M0YzQ5MworLmxvbmcJMHhmMmE3YTc1NSwweGYyYTdhNzU1CisubG9uZwkweDgyN2U3ZWZjLDB4ODI3ZTdlZmMKKy5sb25nCTB4NDczZDNkN2EsMHg0NzNkM2Q3YQorLmxvbmcJMHhhYzY0NjRjOCwweGFjNjQ2NGM4CisubG9uZwkweGU3NWQ1ZGJhLDB4ZTc1ZDVkYmEKKy5sb25nCTB4MmIxOTE5MzIsMHgyYjE5MTkzMgorLmxvbmcJMHg5NTczNzNlNiwweDk1NzM3M2U2CisubG9uZwkweGEwNjA2MGMwLDB4YTA2MDYwYzAKKy5sb25nCTB4OTg4MTgxMTksMHg5ODgxODExOQorLmxvbmcJMHhkMTRmNGY5ZSwweGQxNGY0ZjllCisubG9uZwkweDdmZGNkY2EzLDB4N2ZkY2RjYTMKKy5sb25nCTB4NjYyMjIyNDQsMHg2NjIyMjI0NAorLmxvbmcJMHg3ZTJhMmE1NCwweDdlMmEyYTU0CisubG9uZwkweGFiOTA5MDNiLDB4YWI5MDkwM2IKKy5sb25nCTB4ODM4ODg4MGIsMHg4Mzg4ODgwYgorLmxvbmcJMHhjYTQ2NDY4YywweGNhNDY0NjhjCisubG9uZwkweDI5ZWVlZWM3LDB4MjllZWVlYzcKKy5sb25nCTB4ZDNiOGI4NmIsMHhkM2I4Yjg2YgorLmxvbmcJMHgzYzE0MTQyOCwweDNjMTQxNDI4CisubG9uZwkweDc5ZGVkZWE3LDB4NzlkZWRlYTcKKy5sb25nCTB4ZTI1ZTVlYmMsMHhlMjVlNWViYworLmxvbmcJMHgxZDBiMGIxNiwweDFkMGIwYjE2CisubG9uZwkweDc2ZGJkYmFkLDB4NzZkYmRiYWQKKy5sb25nCTB4M2JlMGUwZGIsMHgzYmUwZTBkYgorLmxvbmcJMHg1NjMyMzI2NCwweDU2MzIzMjY0CisubG9uZwkweDRlM2EzYTc0LDB4NGUzYTNhNzQKKy5sb25nCTB4MWUwYTBhMTQsMHgxZTBhMGExNAorLmxvbmcJMHhkYjQ5NDk5MiwweGRiNDk0OTkyCisubG9uZwkweDBhMDYwNjBjLDB4MGEwNjA2MGMKKy5sb25nCTB4NmMyNDI0NDgsMHg2YzI0MjQ0OAorLmxvbmcJMHhlNDVjNWNiOCwweGU0NWM1Y2I4CisubG9uZwkweDVkYzJjMjlmLDB4NWRjMmMyOWYKKy5sb25nCTB4NmVkM2QzYmQsMHg2ZWQzZDNiZAorLmxvbmcJMHhlZmFjYWM0MywweGVmYWNhYzQzCisubG9uZwkweGE2NjI2MmM0LDB4YTY2MjYyYzQKKy5sb25nCTB4YTg5MTkxMzksMHhhODkxOTEzOQorLmxvbmcJMHhhNDk1OTUzMSwweGE0OTU5NTMxCisubG9uZwkweDM3ZTRlNGQzLDB4MzdlNGU0ZDMKKy5sb25nCTB4OGI3OTc5ZjIsMHg4Yjc5NzlmMgorLmxvbmcJMHgzMmU3ZTdkNSwweDMyZTdlN2Q1CisubG9uZwkweDQzYzhjODhiLDB4NDNjOGM4OGIKKy5sb25nCTB4NTkzNzM3NmUsMHg1OTM3Mzc2ZQorLmxvbmcJMHhiNzZkNmRkYSwweGI3NmQ2ZGRhCisubG9uZwkweDhjOGQ4ZDAxLDB4OGM4ZDhkMDEKKy5sb25nCTB4NjRkNWQ1YjEsMHg2NGQ1ZDViMQorLmxvbmcJMHhkMjRlNGU5YywweGQyNGU0ZTljCisubG9uZwkweGUwYTlhOTQ5LDB4ZTBhOWE5NDkKKy5sb25nCTB4YjQ2YzZjZDgsMHhiNDZjNmNkOAorLmxvbmcJMHhmYTU2NTZhYywweGZhNTY1NmFjCisubG9uZwkweDA3ZjRmNGYzLDB4MDdmNGY0ZjMKKy5sb25nCTB4MjVlYWVhY2YsMHgyNWVhZWFjZgorLmxvbmcJMHhhZjY1NjVjYSwweGFmNjU2NWNhCisubG9uZwkweDhlN2E3YWY0LDB4OGU3YTdhZjQKKy5sb25nCTB4ZTlhZWFlNDcsMHhlOWFlYWU0NworLmxvbmcJMHgxODA4MDgxMCwweDE4MDgwODEwCisubG9uZwkweGQ1YmFiYTZmLDB4ZDViYWJhNmYKKy5sb25nCTB4ODg3ODc4ZjAsMHg4ODc4NzhmMAorLmxvbmcJMHg2ZjI1MjU0YSwweDZmMjUyNTRhCisubG9uZwkweDcyMmUyZTVjLDB4NzIyZTJlNWMKKy5sb25nCTB4MjQxYzFjMzgsMHgyNDFjMWMzOAorLmxvbmcJMHhmMWE2YTY1NywweGYxYTZhNjU3CisubG9uZwkweGM3YjRiNDczLDB4YzdiNGI0NzMKKy5sb25nCTB4NTFjNmM2OTcsMHg1MWM2YzY5NworLmxvbmcJMHgyM2U4ZThjYiwweDIzZThlOGNiCisubG9uZwkweDdjZGRkZGExLDB4N2NkZGRkYTEKKy5sb25nCTB4OWM3NDc0ZTgsMHg5Yzc0NzRlOAorLmxvbmcJMHgyMTFmMWYzZSwweDIxMWYxZjNlCisubG9uZwkweGRkNGI0Yjk2LDB4ZGQ0YjRiOTYKKy5sb25nCTB4ZGNiZGJkNjEsMHhkY2JkYmQ2MQorLmxvbmcJMHg4NjhiOGIwZCwweDg2OGI4YjBkCisubG9uZwkweDg1OGE4YTBmLDB4ODU4YThhMGYKKy5sb25nCTB4OTA3MDcwZTAsMHg5MDcwNzBlMAorLmxvbmcJMHg0MjNlM2U3YywweDQyM2UzZTdjCisubG9uZwkweGM0YjViNTcxLDB4YzRiNWI1NzEKKy5sb25nCTB4YWE2NjY2Y2MsMHhhYTY2NjZjYworLmxvbmcJMHhkODQ4NDg5MCwweGQ4NDg0ODkwCisubG9uZwkweDA1MDMwMzA2LDB4MDUwMzAzMDYKKy5sb25nCTB4MDFmNmY2ZjcsMHgwMWY2ZjZmNworLmxvbmcJMHgxMjBlMGUxYywweDEyMGUwZTFjCisubG9uZwkweGEzNjE2MWMyLDB4YTM2MTYxYzIKKy5sb25nCTB4NWYzNTM1NmEsMHg1ZjM1MzU2YQorLmxvbmcJMHhmOTU3NTdhZSwweGY5NTc1N2FlCisubG9uZwkweGQwYjliOTY5LDB4ZDBiOWI5NjkKKy5sb25nCTB4OTE4Njg2MTcsMHg5MTg2ODYxNworLmxvbmcJMHg1OGMxYzE5OSwweDU4YzFjMTk5CisubG9uZwkweDI3MWQxZDNhLDB4MjcxZDFkM2EKKy5sb25nCTB4Yjk5ZTllMjcsMHhiOTllOWUyNworLmxvbmcJMHgzOGUxZTFkOSwweDM4ZTFlMWQ5CisubG9uZwkweDEzZjhmOGViLDB4MTNmOGY4ZWIKKy5sb25nCTB4YjM5ODk4MmIsMHhiMzk4OTgyYgorLmxvbmcJMHgzMzExMTEyMiwweDMzMTExMTIyCisubG9uZwkweGJiNjk2OWQyLDB4YmI2OTY5ZDIKKy5sb25nCTB4NzBkOWQ5YTksMHg3MGQ5ZDlhOQorLmxvbmcJMHg4OThlOGUwNywweDg5OGU4ZTA3CisubG9uZwkweGE3OTQ5NDMzLDB4YTc5NDk0MzMKKy5sb25nCTB4YjY5YjliMmQsMHhiNjliOWIyZAorLmxvbmcJMHgyMjFlMWUzYywweDIyMWUxZTNjCisubG9uZwkweDkyODc4NzE1LDB4OTI4Nzg3MTUKKy5sb25nCTB4MjBlOWU5YzksMHgyMGU5ZTljOQorLmxvbmcJMHg0OWNlY2U4NywweDQ5Y2VjZTg3CisubG9uZwkweGZmNTU1NWFhLDB4ZmY1NTU1YWEKKy5sb25nCTB4NzgyODI4NTAsMHg3ODI4Mjg1MAorLmxvbmcJMHg3YWRmZGZhNSwweDdhZGZkZmE1CisubG9uZwkweDhmOGM4YzAzLDB4OGY4YzhjMDMKKy5sb25nCTB4ZjhhMWExNTksMHhmOGExYTE1OQorLmxvbmcJMHg4MDg5ODkwOSwweDgwODk4OTA5CisubG9uZwkweDE3MGQwZDFhLDB4MTcwZDBkMWEKKy5sb25nCTB4ZGFiZmJmNjUsMHhkYWJmYmY2NQorLmxvbmcJMHgzMWU2ZTZkNywweDMxZTZlNmQ3CisubG9uZwkweGM2NDI0Mjg0LDB4YzY0MjQyODQKKy5sb25nCTB4Yjg2ODY4ZDAsMHhiODY4NjhkMAorLmxvbmcJMHhjMzQxNDE4MiwweGMzNDE0MTgyCisubG9uZwkweGIwOTk5OTI5LDB4YjA5OTk5MjkKKy5sb25nCTB4NzcyZDJkNWEsMHg3NzJkMmQ1YQorLmxvbmcJMHgxMTBmMGYxZSwweDExMGYwZjFlCisubG9uZwkweGNiYjBiMDdiLDB4Y2JiMGIwN2IKKy5sb25nCTB4ZmM1NDU0YTgsMHhmYzU0NTRhOAorLmxvbmcJMHhkNmJiYmI2ZCwweGQ2YmJiYjZkCisubG9uZwkweDNhMTYxNjJjLDB4M2ExNjE2MmMKKy5ieXRlCTB4NjMsMHg3YywweDc3LDB4N2IsMHhmMiwweDZiLDB4NmYsMHhjNQorLmJ5dGUJMHgzMCwweDAxLDB4NjcsMHgyYiwweGZlLDB4ZDcsMHhhYiwweDc2CisuYnl0ZQkweGNhLDB4ODIsMHhjOSwweDdkLDB4ZmEsMHg1OSwweDQ3LDB4ZjAKKy5ieXRlCTB4YWQsMHhkNCwweGEyLDB4YWYsMHg5YywweGE0LDB4NzIsMHhjMAorLmJ5dGUJMHhiNywweGZkLDB4OTMsMHgyNiwweDM2LDB4M2YsMHhmNywweGNjCisuYnl0ZQkweDM0LDB4YTUsMHhlNSwweGYxLDB4NzEsMHhkOCwweDMxLDB4MTUKKy5ieXRlCTB4MDQsMHhjNywweDIzLDB4YzMsMHgxOCwweDk2LDB4MDUsMHg5YQorLmJ5dGUJMHgwNywweDEyLDB4ODAsMHhlMiwweGViLDB4MjcsMHhiMiwweDc1CisuYnl0ZQkweDA5LDB4ODMsMHgyYywweDFhLDB4MWIsMHg2ZSwweDVhLDB4YTAKKy5ieXRlCTB4NTIsMHgzYiwweGQ2LDB4YjMsMHgyOSwweGUzLDB4MmYsMHg4NAorLmJ5dGUJMHg1MywweGQxLDB4MDAsMHhlZCwweDIwLDB4ZmMsMHhiMSwweDViCisuYnl0ZQkweDZhLDB4Y2IsMHhiZSwweDM5LDB4NGEsMHg0YywweDU4LDB4Y2YKKy5ieXRlCTB4ZDAsMHhlZiwweGFhLDB4ZmIsMHg0MywweDRkLDB4MzMsMHg4NQorLmJ5dGUJMHg0NSwweGY5LDB4MDIsMHg3ZiwweDUwLDB4M2MsMHg5ZiwweGE4CisuYnl0ZQkweDUxLDB4YTMsMHg0MCwweDhmLDB4OTIsMHg5ZCwweDM4LDB4ZjUKKy5ieXRlCTB4YmMsMHhiNiwweGRhLDB4MjEsMHgxMCwweGZmLDB4ZjMsMHhkMgorLmJ5dGUJMHhjZCwweDBjLDB4MTMsMHhlYywweDVmLDB4OTcsMHg0NCwweDE3CisuYnl0ZQkweGM0LDB4YTcsMHg3ZSwweDNkLDB4NjQsMHg1ZCwweDE5LDB4NzMKKy5ieXRlCTB4NjAsMHg4MSwweDRmLDB4ZGMsMHgyMiwweDJhLDB4OTAsMHg4OAorLmJ5dGUJMHg0NiwweGVlLDB4YjgsMHgxNCwweGRlLDB4NWUsMHgwYiwweGRiCisuYnl0ZQkweGUwLDB4MzIsMHgzYSwweDBhLDB4NDksMHgwNiwweDI0LDB4NWMKKy5ieXRlCTB4YzIsMHhkMywweGFjLDB4NjIsMHg5MSwweDk1LDB4ZTQsMHg3OQorLmJ5dGUJMHhlNywweGM4LDB4MzcsMHg2ZCwweDhkLDB4ZDUsMHg0ZSwweGE5CisuYnl0ZQkweDZjLDB4NTYsMHhmNCwweGVhLDB4NjUsMHg3YSwweGFlLDB4MDgKKy5ieXRlCTB4YmEsMHg3OCwweDI1LDB4MmUsMHgxYywweGE2LDB4YjQsMHhjNgorLmJ5dGUJMHhlOCwweGRkLDB4NzQsMHgxZiwweDRiLDB4YmQsMHg4YiwweDhhCisuYnl0ZQkweDcwLDB4M2UsMHhiNSwweDY2LDB4NDgsMHgwMywweGY2LDB4MGUKKy5ieXRlCTB4NjEsMHgzNSwweDU3LDB4YjksMHg4NiwweGMxLDB4MWQsMHg5ZQorLmJ5dGUJMHhlMSwweGY4LDB4OTgsMHgxMSwweDY5LDB4ZDksMHg4ZSwweDk0CisuYnl0ZQkweDliLDB4MWUsMHg4NywweGU5LDB4Y2UsMHg1NSwweDI4LDB4ZGYKKy5ieXRlCTB4OGMsMHhhMSwweDg5LDB4MGQsMHhiZiwweGU2LDB4NDIsMHg2OAorLmJ5dGUJMHg0MSwweDk5LDB4MmQsMHgwZiwweGIwLDB4NTQsMHhiYiwweDE2CisuYnl0ZQkweDYzLDB4N2MsMHg3NywweDdiLDB4ZjIsMHg2YiwweDZmLDB4YzUKKy5ieXRlCTB4MzAsMHgwMSwweDY3LDB4MmIsMHhmZSwweGQ3LDB4YWIsMHg3NgorLmJ5dGUJMHhjYSwweDgyLDB4YzksMHg3ZCwweGZhLDB4NTksMHg0NywweGYwCisuYnl0ZQkweGFkLDB4ZDQsMHhhMiwweGFmLDB4OWMsMHhhNCwweDcyLDB4YzAKKy5ieXRlCTB4YjcsMHhmZCwweDkzLDB4MjYsMHgzNiwweDNmLDB4ZjcsMHhjYworLmJ5dGUJMHgzNCwweGE1LDB4ZTUsMHhmMSwweDcxLDB4ZDgsMHgzMSwweDE1CisuYnl0ZQkweDA0LDB4YzcsMHgyMywweGMzLDB4MTgsMHg5NiwweDA1LDB4OWEKKy5ieXRlCTB4MDcsMHgxMiwweDgwLDB4ZTIsMHhlYiwweDI3LDB4YjIsMHg3NQorLmJ5dGUJMHgwOSwweDgzLDB4MmMsMHgxYSwweDFiLDB4NmUsMHg1YSwweGEwCisuYnl0ZQkweDUyLDB4M2IsMHhkNiwweGIzLDB4MjksMHhlMywweDJmLDB4ODQKKy5ieXRlCTB4NTMsMHhkMSwweDAwLDB4ZWQsMHgyMCwweGZjLDB4YjEsMHg1YgorLmJ5dGUJMHg2YSwweGNiLDB4YmUsMHgzOSwweDRhLDB4NGMsMHg1OCwweGNmCisuYnl0ZQkweGQwLDB4ZWYsMHhhYSwweGZiLDB4NDMsMHg0ZCwweDMzLDB4ODUKKy5ieXRlCTB4NDUsMHhmOSwweDAyLDB4N2YsMHg1MCwweDNjLDB4OWYsMHhhOAorLmJ5dGUJMHg1MSwweGEzLDB4NDAsMHg4ZiwweDkyLDB4OWQsMHgzOCwweGY1CisuYnl0ZQkweGJjLDB4YjYsMHhkYSwweDIxLDB4MTAsMHhmZiwweGYzLDB4ZDIKKy5ieXRlCTB4Y2QsMHgwYywweDEzLDB4ZWMsMHg1ZiwweDk3LDB4NDQsMHgxNworLmJ5dGUJMHhjNCwweGE3LDB4N2UsMHgzZCwweDY0LDB4NWQsMHgxOSwweDczCisuYnl0ZQkweDYwLDB4ODEsMHg0ZiwweGRjLDB4MjIsMHgyYSwweDkwLDB4ODgKKy5ieXRlCTB4NDYsMHhlZSwweGI4LDB4MTQsMHhkZSwweDVlLDB4MGIsMHhkYgorLmJ5dGUJMHhlMCwweDMyLDB4M2EsMHgwYSwweDQ5LDB4MDYsMHgyNCwweDVjCisuYnl0ZQkweGMyLDB4ZDMsMHhhYywweDYyLDB4OTEsMHg5NSwweGU0LDB4NzkKKy5ieXRlCTB4ZTcsMHhjOCwweDM3LDB4NmQsMHg4ZCwweGQ1LDB4NGUsMHhhOQorLmJ5dGUJMHg2YywweDU2LDB4ZjQsMHhlYSwweDY1LDB4N2EsMHhhZSwweDA4CisuYnl0ZQkweGJhLDB4NzgsMHgyNSwweDJlLDB4MWMsMHhhNiwweGI0LDB4YzYKKy5ieXRlCTB4ZTgsMHhkZCwweDc0LDB4MWYsMHg0YiwweGJkLDB4OGIsMHg4YQorLmJ5dGUJMHg3MCwweDNlLDB4YjUsMHg2NiwweDQ4LDB4MDMsMHhmNiwweDBlCisuYnl0ZQkweDYxLDB4MzUsMHg1NywweGI5LDB4ODYsMHhjMSwweDFkLDB4OWUKKy5ieXRlCTB4ZTEsMHhmOCwweDk4LDB4MTEsMHg2OSwweGQ5LDB4OGUsMHg5NAorLmJ5dGUJMHg5YiwweDFlLDB4ODcsMHhlOSwweGNlLDB4NTUsMHgyOCwweGRmCisuYnl0ZQkweDhjLDB4YTEsMHg4OSwweDBkLDB4YmYsMHhlNiwweDQyLDB4NjgKKy5ieXRlCTB4NDEsMHg5OSwweDJkLDB4MGYsMHhiMCwweDU0LDB4YmIsMHgxNgorLmJ5dGUJMHg2MywweDdjLDB4NzcsMHg3YiwweGYyLDB4NmIsMHg2ZiwweGM1CisuYnl0ZQkweDMwLDB4MDEsMHg2NywweDJiLDB4ZmUsMHhkNywweGFiLDB4NzYKKy5ieXRlCTB4Y2EsMHg4MiwweGM5LDB4N2QsMHhmYSwweDU5LDB4NDcsMHhmMAorLmJ5dGUJMHhhZCwweGQ0LDB4YTIsMHhhZiwweDljLDB4YTQsMHg3MiwweGMwCisuYnl0ZQkweGI3LDB4ZmQsMHg5MywweDI2LDB4MzYsMHgzZiwweGY3LDB4Y2MKKy5ieXRlCTB4MzQsMHhhNSwweGU1LDB4ZjEsMHg3MSwweGQ4LDB4MzEsMHgxNQorLmJ5dGUJMHgwNCwweGM3LDB4MjMsMHhjMywweDE4LDB4OTYsMHgwNSwweDlhCisuYnl0ZQkweDA3LDB4MTIsMHg4MCwweGUyLDB4ZWIsMHgyNywweGIyLDB4NzUKKy5ieXRlCTB4MDksMHg4MywweDJjLDB4MWEsMHgxYiwweDZlLDB4NWEsMHhhMAorLmJ5dGUJMHg1MiwweDNiLDB4ZDYsMHhiMywweDI5LDB4ZTMsMHgyZiwweDg0CisuYnl0ZQkweDUzLDB4ZDEsMHgwMCwweGVkLDB4MjAsMHhmYywweGIxLDB4NWIKKy5ieXRlCTB4NmEsMHhjYiwweGJlLDB4MzksMHg0YSwweDRjLDB4NTgsMHhjZgorLmJ5dGUJMHhkMCwweGVmLDB4YWEsMHhmYiwweDQzLDB4NGQsMHgzMywweDg1CisuYnl0ZQkweDQ1LDB4ZjksMHgwMiwweDdmLDB4NTAsMHgzYywweDlmLDB4YTgKKy5ieXRlCTB4NTEsMHhhMywweDQwLDB4OGYsMHg5MiwweDlkLDB4MzgsMHhmNQorLmJ5dGUJMHhiYywweGI2LDB4ZGEsMHgyMSwweDEwLDB4ZmYsMHhmMywweGQyCisuYnl0ZQkweGNkLDB4MGMsMHgxMywweGVjLDB4NWYsMHg5NywweDQ0LDB4MTcKKy5ieXRlCTB4YzQsMHhhNywweDdlLDB4M2QsMHg2NCwweDVkLDB4MTksMHg3MworLmJ5dGUJMHg2MCwweDgxLDB4NGYsMHhkYywweDIyLDB4MmEsMHg5MCwweDg4CisuYnl0ZQkweDQ2LDB4ZWUsMHhiOCwweDE0LDB4ZGUsMHg1ZSwweDBiLDB4ZGIKKy5ieXRlCTB4ZTAsMHgzMiwweDNhLDB4MGEsMHg0OSwweDA2LDB4MjQsMHg1YworLmJ5dGUJMHhjMiwweGQzLDB4YWMsMHg2MiwweDkxLDB4OTUsMHhlNCwweDc5CisuYnl0ZQkweGU3LDB4YzgsMHgzNywweDZkLDB4OGQsMHhkNSwweDRlLDB4YTkKKy5ieXRlCTB4NmMsMHg1NiwweGY0LDB4ZWEsMHg2NSwweDdhLDB4YWUsMHgwOAorLmJ5dGUJMHhiYSwweDc4LDB4MjUsMHgyZSwweDFjLDB4YTYsMHhiNCwweGM2CisuYnl0ZQkweGU4LDB4ZGQsMHg3NCwweDFmLDB4NGIsMHhiZCwweDhiLDB4OGEKKy5ieXRlCTB4NzAsMHgzZSwweGI1LDB4NjYsMHg0OCwweDAzLDB4ZjYsMHgwZQorLmJ5dGUJMHg2MSwweDM1LDB4NTcsMHhiOSwweDg2LDB4YzEsMHgxZCwweDllCisuYnl0ZQkweGUxLDB4ZjgsMHg5OCwweDExLDB4NjksMHhkOSwweDhlLDB4OTQKKy5ieXRlCTB4OWIsMHgxZSwweDg3LDB4ZTksMHhjZSwweDU1LDB4MjgsMHhkZgorLmJ5dGUJMHg4YywweGExLDB4ODksMHgwZCwweGJmLDB4ZTYsMHg0MiwweDY4CisuYnl0ZQkweDQxLDB4OTksMHgyZCwweDBmLDB4YjAsMHg1NCwweGJiLDB4MTYKKy5ieXRlCTB4NjMsMHg3YywweDc3LDB4N2IsMHhmMiwweDZiLDB4NmYsMHhjNQorLmJ5dGUJMHgzMCwweDAxLDB4NjcsMHgyYiwweGZlLDB4ZDcsMHhhYiwweDc2CisuYnl0ZQkweGNhLDB4ODIsMHhjOSwweDdkLDB4ZmEsMHg1OSwweDQ3LDB4ZjAKKy5ieXRlCTB4YWQsMHhkNCwweGEyLDB4YWYsMHg5YywweGE0LDB4NzIsMHhjMAorLmJ5dGUJMHhiNywweGZkLDB4OTMsMHgyNiwweDM2LDB4M2YsMHhmNywweGNjCisuYnl0ZQkweDM0LDB4YTUsMHhlNSwweGYxLDB4NzEsMHhkOCwweDMxLDB4MTUKKy5ieXRlCTB4MDQsMHhjNywweDIzLDB4YzMsMHgxOCwweDk2LDB4MDUsMHg5YQorLmJ5dGUJMHgwNywweDEyLDB4ODAsMHhlMiwweGViLDB4MjcsMHhiMiwweDc1CisuYnl0ZQkweDA5LDB4ODMsMHgyYywweDFhLDB4MWIsMHg2ZSwweDVhLDB4YTAKKy5ieXRlCTB4NTIsMHgzYiwweGQ2LDB4YjMsMHgyOSwweGUzLDB4MmYsMHg4NAorLmJ5dGUJMHg1MywweGQxLDB4MDAsMHhlZCwweDIwLDB4ZmMsMHhiMSwweDViCisuYnl0ZQkweDZhLDB4Y2IsMHhiZSwweDM5LDB4NGEsMHg0YywweDU4LDB4Y2YKKy5ieXRlCTB4ZDAsMHhlZiwweGFhLDB4ZmIsMHg0MywweDRkLDB4MzMsMHg4NQorLmJ5dGUJMHg0NSwweGY5LDB4MDIsMHg3ZiwweDUwLDB4M2MsMHg5ZiwweGE4CisuYnl0ZQkweDUxLDB4YTMsMHg0MCwweDhmLDB4OTIsMHg5ZCwweDM4LDB4ZjUKKy5ieXRlCTB4YmMsMHhiNiwweGRhLDB4MjEsMHgxMCwweGZmLDB4ZjMsMHhkMgorLmJ5dGUJMHhjZCwweDBjLDB4MTMsMHhlYywweDVmLDB4OTcsMHg0NCwweDE3CisuYnl0ZQkweGM0LDB4YTcsMHg3ZSwweDNkLDB4NjQsMHg1ZCwweDE5LDB4NzMKKy5ieXRlCTB4NjAsMHg4MSwweDRmLDB4ZGMsMHgyMiwweDJhLDB4OTAsMHg4OAorLmJ5dGUJMHg0NiwweGVlLDB4YjgsMHgxNCwweGRlLDB4NWUsMHgwYiwweGRiCisuYnl0ZQkweGUwLDB4MzIsMHgzYSwweDBhLDB4NDksMHgwNiwweDI0LDB4NWMKKy5ieXRlCTB4YzIsMHhkMywweGFjLDB4NjIsMHg5MSwweDk1LDB4ZTQsMHg3OQorLmJ5dGUJMHhlNywweGM4LDB4MzcsMHg2ZCwweDhkLDB4ZDUsMHg0ZSwweGE5CisuYnl0ZQkweDZjLDB4NTYsMHhmNCwweGVhLDB4NjUsMHg3YSwweGFlLDB4MDgKKy5ieXRlCTB4YmEsMHg3OCwweDI1LDB4MmUsMHgxYywweGE2LDB4YjQsMHhjNgorLmJ5dGUJMHhlOCwweGRkLDB4NzQsMHgxZiwweDRiLDB4YmQsMHg4YiwweDhhCisuYnl0ZQkweDcwLDB4M2UsMHhiNSwweDY2LDB4NDgsMHgwMywweGY2LDB4MGUKKy5ieXRlCTB4NjEsMHgzNSwweDU3LDB4YjksMHg4NiwweGMxLDB4MWQsMHg5ZQorLmJ5dGUJMHhlMSwweGY4LDB4OTgsMHgxMSwweDY5LDB4ZDksMHg4ZSwweDk0CisuYnl0ZQkweDliLDB4MWUsMHg4NywweGU5LDB4Y2UsMHg1NSwweDI4LDB4ZGYKKy5ieXRlCTB4OGMsMHhhMSwweDg5LDB4MGQsMHhiZiwweGU2LDB4NDIsMHg2OAorLmJ5dGUJMHg0MSwweDk5LDB4MmQsMHgwZiwweGIwLDB4NTQsMHhiYiwweDE2CisubG9uZwkweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDA4CisubG9uZwkweDAwMDAwMDEwLCAweDAwMDAwMDIwLCAweDAwMDAwMDQwLCAweDAwMDAwMDgwCisubG9uZwkweDAwMDAwMDFiLCAweDAwMDAwMDM2LCAweDgwODA4MDgwLCAweDgwODA4MDgwCisubG9uZwkweGZlZmVmZWZlLCAweGZlZmVmZWZlLCAweDFiMWIxYjFiLCAweDFiMWIxYjFiCisucDJhbGlnbgk2CitMJEFFU19UZDoKKy5sb25nCTB4NTBhN2Y0NTEsMHg1MGE3ZjQ1MQorLmxvbmcJMHg1MzY1NDE3ZSwweDUzNjU0MTdlCisubG9uZwkweGMzYTQxNzFhLDB4YzNhNDE3MWEKKy5sb25nCTB4OTY1ZTI3M2EsMHg5NjVlMjczYQorLmxvbmcJMHhjYjZiYWIzYiwweGNiNmJhYjNiCisubG9uZwkweGYxNDU5ZDFmLDB4ZjE0NTlkMWYKKy5sb25nCTB4YWI1OGZhYWMsMHhhYjU4ZmFhYworLmxvbmcJMHg5MzAzZTM0YiwweDkzMDNlMzRiCisubG9uZwkweDU1ZmEzMDIwLDB4NTVmYTMwMjAKKy5sb25nCTB4ZjY2ZDc2YWQsMHhmNjZkNzZhZAorLmxvbmcJMHg5MTc2Y2M4OCwweDkxNzZjYzg4CisubG9uZwkweDI1NGMwMmY1LDB4MjU0YzAyZjUKKy5sb25nCTB4ZmNkN2U1NGYsMHhmY2Q3ZTU0ZgorLmxvbmcJMHhkN2NiMmFjNSwweGQ3Y2IyYWM1CisubG9uZwkweDgwNDQzNTI2LDB4ODA0NDM1MjYKKy5sb25nCTB4OGZhMzYyYjUsMHg4ZmEzNjJiNQorLmxvbmcJMHg0OTVhYjFkZSwweDQ5NWFiMWRlCisubG9uZwkweDY3MWJiYTI1LDB4NjcxYmJhMjUKKy5sb25nCTB4OTgwZWVhNDUsMHg5ODBlZWE0NQorLmxvbmcJMHhlMWMwZmU1ZCwweGUxYzBmZTVkCisubG9uZwkweDAyNzUyZmMzLDB4MDI3NTJmYzMKKy5sb25nCTB4MTJmMDRjODEsMHgxMmYwNGM4MQorLmxvbmcJMHhhMzk3NDY4ZCwweGEzOTc0NjhkCisubG9uZwkweGM2ZjlkMzZiLDB4YzZmOWQzNmIKKy5sb25nCTB4ZTc1ZjhmMDMsMHhlNzVmOGYwMworLmxvbmcJMHg5NTljOTIxNSwweDk1OWM5MjE1CisubG9uZwkweGViN2E2ZGJmLDB4ZWI3YTZkYmYKKy5sb25nCTB4ZGE1OTUyOTUsMHhkYTU5NTI5NQorLmxvbmcJMHgyZDgzYmVkNCwweDJkODNiZWQ0CisubG9uZwkweGQzMjE3NDU4LDB4ZDMyMTc0NTgKKy5sb25nCTB4Mjk2OWUwNDksMHgyOTY5ZTA0OQorLmxvbmcJMHg0NGM4Yzk4ZSwweDQ0YzhjOThlCisubG9uZwkweDZhODljMjc1LDB4NmE4OWMyNzUKKy5sb25nCTB4Nzg3OThlZjQsMHg3ODc5OGVmNAorLmxvbmcJMHg2YjNlNTg5OSwweDZiM2U1ODk5CisubG9uZwkweGRkNzFiOTI3LDB4ZGQ3MWI5MjcKKy5sb25nCTB4YjY0ZmUxYmUsMHhiNjRmZTFiZQorLmxvbmcJMHgxN2FkODhmMCwweDE3YWQ4OGYwCisubG9uZwkweDY2YWMyMGM5LDB4NjZhYzIwYzkKKy5sb25nCTB4YjQzYWNlN2QsMHhiNDNhY2U3ZAorLmxvbmcJMHgxODRhZGY2MywweDE4NGFkZjYzCisubG9uZwkweDgyMzExYWU1LDB4ODIzMTFhZTUKKy5sb25nCTB4NjAzMzUxOTcsMHg2MDMzNTE5NworLmxvbmcJMHg0NTdmNTM2MiwweDQ1N2Y1MzYyCisubG9uZwkweGUwNzc2NGIxLDB4ZTA3NzY0YjEKKy5sb25nCTB4ODRhZTZiYmIsMHg4NGFlNmJiYgorLmxvbmcJMHgxY2EwODFmZSwweDFjYTA4MWZlCisubG9uZwkweDk0MmIwOGY5LDB4OTQyYjA4ZjkKKy5sb25nCTB4NTg2ODQ4NzAsMHg1ODY4NDg3MAorLmxvbmcJMHgxOWZkNDU4ZiwweDE5ZmQ0NThmCisubG9uZwkweDg3NmNkZTk0LDB4ODc2Y2RlOTQKKy5sb25nCTB4YjdmODdiNTIsMHhiN2Y4N2I1MgorLmxvbmcJMHgyM2QzNzNhYiwweDIzZDM3M2FiCisubG9uZwkweGUyMDI0YjcyLDB4ZTIwMjRiNzIKKy5sb25nCTB4NTc4ZjFmZTMsMHg1NzhmMWZlMworLmxvbmcJMHgyYWFiNTU2NiwweDJhYWI1NTY2CisubG9uZwkweDA3MjhlYmIyLDB4MDcyOGViYjIKKy5sb25nCTB4MDNjMmI1MmYsMHgwM2MyYjUyZgorLmxvbmcJMHg5YTdiYzU4NiwweDlhN2JjNTg2CisubG9uZwkweGE1MDgzN2QzLDB4YTUwODM3ZDMKKy5sb25nCTB4ZjI4NzI4MzAsMHhmMjg3MjgzMAorLmxvbmcJMHhiMmE1YmYyMywweGIyYTViZjIzCisubG9uZwkweGJhNmEwMzAyLDB4YmE2YTAzMDIKKy5sb25nCTB4NWM4MjE2ZWQsMHg1YzgyMTZlZAorLmxvbmcJMHgyYjFjY2Y4YSwweDJiMWNjZjhhCisubG9uZwkweDkyYjQ3OWE3LDB4OTJiNDc5YTcKKy5sb25nCTB4ZjBmMjA3ZjMsMHhmMGYyMDdmMworLmxvbmcJMHhhMWUyNjk0ZSwweGExZTI2OTRlCisubG9uZwkweGNkZjRkYTY1LDB4Y2RmNGRhNjUKKy5sb25nCTB4ZDViZTA1MDYsMHhkNWJlMDUwNgorLmxvbmcJMHgxZjYyMzRkMSwweDFmNjIzNGQxCisubG9uZwkweDhhZmVhNmM0LDB4OGFmZWE2YzQKKy5sb25nCTB4OWQ1MzJlMzQsMHg5ZDUzMmUzNAorLmxvbmcJMHhhMDU1ZjNhMiwweGEwNTVmM2EyCisubG9uZwkweDMyZTE4YTA1LDB4MzJlMThhMDUKKy5sb25nCTB4NzVlYmY2YTQsMHg3NWViZjZhNAorLmxvbmcJMHgzOWVjODMwYiwweDM5ZWM4MzBiCisubG9uZwkweGFhZWY2MDQwLDB4YWFlZjYwNDAKKy5sb25nCTB4MDY5ZjcxNWUsMHgwNjlmNzE1ZQorLmxvbmcJMHg1MTEwNmViZCwweDUxMTA2ZWJkCisubG9uZwkweGY5OGEyMTNlLDB4Zjk4YTIxM2UKKy5sb25nCTB4M2QwNmRkOTYsMHgzZDA2ZGQ5NgorLmxvbmcJMHhhZTA1M2VkZCwweGFlMDUzZWRkCisubG9uZwkweDQ2YmRlNjRkLDB4NDZiZGU2NGQKKy5sb25nCTB4YjU4ZDU0OTEsMHhiNThkNTQ5MQorLmxvbmcJMHgwNTVkYzQ3MSwweDA1NWRjNDcxCisubG9uZwkweDZmZDQwNjA0LDB4NmZkNDA2MDQKKy5sb25nCTB4ZmYxNTUwNjAsMHhmZjE1NTA2MAorLmxvbmcJMHgyNGZiOTgxOSwweDI0ZmI5ODE5CisubG9uZwkweDk3ZTliZGQ2LDB4OTdlOWJkZDYKKy5sb25nCTB4Y2M0MzQwODksMHhjYzQzNDA4OQorLmxvbmcJMHg3NzllZDk2NywweDc3OWVkOTY3CisubG9uZwkweGJkNDJlOGIwLDB4YmQ0MmU4YjAKKy5sb25nCTB4ODg4Yjg5MDcsMHg4ODhiODkwNworLmxvbmcJMHgzODViMTllNywweDM4NWIxOWU3CisubG9uZwkweGRiZWVjODc5LDB4ZGJlZWM4NzkKKy5sb25nCTB4NDcwYTdjYTEsMHg0NzBhN2NhMQorLmxvbmcJMHhlOTBmNDI3YywweGU5MGY0MjdjCisubG9uZwkweGM5MWU4NGY4LDB4YzkxZTg0ZjgKKy5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAorLmxvbmcJMHg4Mzg2ODAwOSwweDgzODY4MDA5CisubG9uZwkweDQ4ZWQyYjMyLDB4NDhlZDJiMzIKKy5sb25nCTB4YWM3MDExMWUsMHhhYzcwMTExZQorLmxvbmcJMHg0ZTcyNWE2YywweDRlNzI1YTZjCisubG9uZwkweGZiZmYwZWZkLDB4ZmJmZjBlZmQKKy5sb25nCTB4NTYzODg1MGYsMHg1NjM4ODUwZgorLmxvbmcJMHgxZWQ1YWUzZCwweDFlZDVhZTNkCisubG9uZwkweDI3MzkyZDM2LDB4MjczOTJkMzYKKy5sb25nCTB4NjRkOTBmMGEsMHg2NGQ5MGYwYQorLmxvbmcJMHgyMWE2NWM2OCwweDIxYTY1YzY4CisubG9uZwkweGQxNTQ1YjliLDB4ZDE1NDViOWIKKy5sb25nCTB4M2EyZTM2MjQsMHgzYTJlMzYyNAorLmxvbmcJMHhiMTY3MGEwYywweGIxNjcwYTBjCisubG9uZwkweDBmZTc1NzkzLDB4MGZlNzU3OTMKKy5sb25nCTB4ZDI5NmVlYjQsMHhkMjk2ZWViNAorLmxvbmcJMHg5ZTkxOWIxYiwweDllOTE5YjFiCisubG9uZwkweDRmYzVjMDgwLDB4NGZjNWMwODAKKy5sb25nCTB4YTIyMGRjNjEsMHhhMjIwZGM2MQorLmxvbmcJMHg2OTRiNzc1YSwweDY5NGI3NzVhCisubG9uZwkweDE2MWExMjFjLDB4MTYxYTEyMWMKKy5sb25nCTB4MGFiYTkzZTIsMHgwYWJhOTNlMgorLmxvbmcJMHhlNTJhYTBjMCwweGU1MmFhMGMwCisubG9uZwkweDQzZTAyMjNjLDB4NDNlMDIyM2MKKy5sb25nCTB4MWQxNzFiMTIsMHgxZDE3MWIxMgorLmxvbmcJMHgwYjBkMDkwZSwweDBiMGQwOTBlCisubG9uZwkweGFkYzc4YmYyLDB4YWRjNzhiZjIKKy5sb25nCTB4YjlhOGI2MmQsMHhiOWE4YjYyZAorLmxvbmcJMHhjOGE5MWUxNCwweGM4YTkxZTE0CisubG9uZwkweDg1MTlmMTU3LDB4ODUxOWYxNTcKKy5sb25nCTB4NGMwNzc1YWYsMHg0YzA3NzVhZgorLmxvbmcJMHhiYmRkOTllZSwweGJiZGQ5OWVlCisubG9uZwkweGZkNjA3ZmEzLDB4ZmQ2MDdmYTMKKy5sb25nCTB4OWYyNjAxZjcsMHg5ZjI2MDFmNworLmxvbmcJMHhiY2Y1NzI1YywweGJjZjU3MjVjCisubG9uZwkweGM1M2I2NjQ0LDB4YzUzYjY2NDQKKy5sb25nCTB4MzQ3ZWZiNWIsMHgzNDdlZmI1YgorLmxvbmcJMHg3NjI5NDM4YiwweDc2Mjk0MzhiCisubG9uZwkweGRjYzYyM2NiLDB4ZGNjNjIzY2IKKy5sb25nCTB4NjhmY2VkYjYsMHg2OGZjZWRiNgorLmxvbmcJMHg2M2YxZTRiOCwweDYzZjFlNGI4CisubG9uZwkweGNhZGMzMWQ3LDB4Y2FkYzMxZDcKKy5sb25nCTB4MTA4NTYzNDIsMHgxMDg1NjM0MgorLmxvbmcJMHg0MDIyOTcxMywweDQwMjI5NzEzCisubG9uZwkweDIwMTFjNjg0LDB4MjAxMWM2ODQKKy5sb25nCTB4N2QyNDRhODUsMHg3ZDI0NGE4NQorLmxvbmcJMHhmODNkYmJkMiwweGY4M2RiYmQyCisubG9uZwkweDExMzJmOWFlLDB4MTEzMmY5YWUKKy5sb25nCTB4NmRhMTI5YzcsMHg2ZGExMjljNworLmxvbmcJMHg0YjJmOWUxZCwweDRiMmY5ZTFkCisubG9uZwkweGYzMzBiMmRjLDB4ZjMzMGIyZGMKKy5sb25nCTB4ZWM1Mjg2MGQsMHhlYzUyODYwZAorLmxvbmcJMHhkMGUzYzE3NywweGQwZTNjMTc3CisubG9uZwkweDZjMTZiMzJiLDB4NmMxNmIzMmIKKy5sb25nCTB4OTliOTcwYTksMHg5OWI5NzBhOQorLmxvbmcJMHhmYTQ4OTQxMSwweGZhNDg5NDExCisubG9uZwkweDIyNjRlOTQ3LDB4MjI2NGU5NDcKKy5sb25nCTB4YzQ4Y2ZjYTgsMHhjNDhjZmNhOAorLmxvbmcJMHgxYTNmZjBhMCwweDFhM2ZmMGEwCisubG9uZwkweGQ4MmM3ZDU2LDB4ZDgyYzdkNTYKKy5sb25nCTB4ZWY5MDMzMjIsMHhlZjkwMzMyMgorLmxvbmcJMHhjNzRlNDk4NywweGM3NGU0OTg3CisubG9uZwkweGMxZDEzOGQ5LDB4YzFkMTM4ZDkKKy5sb25nCTB4ZmVhMmNhOGMsMHhmZWEyY2E4YworLmxvbmcJMHgzNjBiZDQ5OCwweDM2MGJkNDk4CisubG9uZwkweGNmODFmNWE2LDB4Y2Y4MWY1YTYKKy5sb25nCTB4MjhkZTdhYTUsMHgyOGRlN2FhNQorLmxvbmcJMHgyNjhlYjdkYSwweDI2OGViN2RhCisubG9uZwkweGE0YmZhZDNmLDB4YTRiZmFkM2YKKy5sb25nCTB4ZTQ5ZDNhMmMsMHhlNDlkM2EyYworLmxvbmcJMHgwZDkyNzg1MCwweDBkOTI3ODUwCisubG9uZwkweDliY2M1ZjZhLDB4OWJjYzVmNmEKKy5sb25nCTB4NjI0NjdlNTQsMHg2MjQ2N2U1NAorLmxvbmcJMHhjMjEzOGRmNiwweGMyMTM4ZGY2CisubG9uZwkweGU4YjhkODkwLDB4ZThiOGQ4OTAKKy5sb25nCTB4NWVmNzM5MmUsMHg1ZWY3MzkyZQorLmxvbmcJMHhmNWFmYzM4MiwweGY1YWZjMzgyCisubG9uZwkweGJlODA1ZDlmLDB4YmU4MDVkOWYKKy5sb25nCTB4N2M5M2QwNjksMHg3YzkzZDA2OQorLmxvbmcJMHhhOTJkZDU2ZiwweGE5MmRkNTZmCisubG9uZwkweGIzMTIyNWNmLDB4YjMxMjI1Y2YKKy5sb25nCTB4M2I5OWFjYzgsMHgzYjk5YWNjOAorLmxvbmcJMHhhNzdkMTgxMCwweGE3N2QxODEwCisubG9uZwkweDZlNjM5Y2U4LDB4NmU2MzljZTgKKy5sb25nCTB4N2JiYjNiZGIsMHg3YmJiM2JkYgorLmxvbmcJMHgwOTc4MjZjZCwweDA5NzgyNmNkCisubG9uZwkweGY0MTg1OTZlLDB4ZjQxODU5NmUKKy5sb25nCTB4MDFiNzlhZWMsMHgwMWI3OWFlYworLmxvbmcJMHhhODlhNGY4MywweGE4OWE0ZjgzCisubG9uZwkweDY1NmU5NWU2LDB4NjU2ZTk1ZTYKKy5sb25nCTB4N2VlNmZmYWEsMHg3ZWU2ZmZhYQorLmxvbmcJMHgwOGNmYmMyMSwweDA4Y2ZiYzIxCisubG9uZwkweGU2ZTgxNWVmLDB4ZTZlODE1ZWYKKy5sb25nCTB4ZDk5YmU3YmEsMHhkOTliZTdiYQorLmxvbmcJMHhjZTM2NmY0YSwweGNlMzY2ZjRhCisubG9uZwkweGQ0MDk5ZmVhLDB4ZDQwOTlmZWEKKy5sb25nCTB4ZDY3Y2IwMjksMHhkNjdjYjAyOQorLmxvbmcJMHhhZmIyYTQzMSwweGFmYjJhNDMxCisubG9uZwkweDMxMjMzZjJhLDB4MzEyMzNmMmEKKy5sb25nCTB4MzA5NGE1YzYsMHgzMDk0YTVjNgorLmxvbmcJMHhjMDY2YTIzNSwweGMwNjZhMjM1CisubG9uZwkweDM3YmM0ZTc0LDB4MzdiYzRlNzQKKy5sb25nCTB4YTZjYTgyZmMsMHhhNmNhODJmYworLmxvbmcJMHhiMGQwOTBlMCwweGIwZDA5MGUwCisubG9uZwkweDE1ZDhhNzMzLDB4MTVkOGE3MzMKKy5sb25nCTB4NGE5ODA0ZjEsMHg0YTk4MDRmMQorLmxvbmcJMHhmN2RhZWM0MSwweGY3ZGFlYzQxCisubG9uZwkweDBlNTBjZDdmLDB4MGU1MGNkN2YKKy5sb25nCTB4MmZmNjkxMTcsMHgyZmY2OTExNworLmxvbmcJMHg4ZGQ2NGQ3NiwweDhkZDY0ZDc2CisubG9uZwkweDRkYjBlZjQzLDB4NGRiMGVmNDMKKy5sb25nCTB4NTQ0ZGFhY2MsMHg1NDRkYWFjYworLmxvbmcJMHhkZjA0OTZlNCwweGRmMDQ5NmU0CisubG9uZwkweGUzYjVkMTllLDB4ZTNiNWQxOWUKKy5sb25nCTB4MWI4ODZhNGMsMHgxYjg4NmE0YworLmxvbmcJMHhiODFmMmNjMSwweGI4MWYyY2MxCisubG9uZwkweDdmNTE2NTQ2LDB4N2Y1MTY1NDYKKy5sb25nCTB4MDRlYTVlOWQsMHgwNGVhNWU5ZAorLmxvbmcJMHg1ZDM1OGMwMSwweDVkMzU4YzAxCisubG9uZwkweDczNzQ4N2ZhLDB4NzM3NDg3ZmEKKy5sb25nCTB4MmU0MTBiZmIsMHgyZTQxMGJmYgorLmxvbmcJMHg1YTFkNjdiMywweDVhMWQ2N2IzCisubG9uZwkweDUyZDJkYjkyLDB4NTJkMmRiOTIKKy5sb25nCTB4MzM1NjEwZTksMHgzMzU2MTBlOQorLmxvbmcJMHgxMzQ3ZDY2ZCwweDEzNDdkNjZkCisubG9uZwkweDhjNjFkNzlhLDB4OGM2MWQ3OWEKKy5sb25nCTB4N2EwY2ExMzcsMHg3YTBjYTEzNworLmxvbmcJMHg4ZTE0Zjg1OSwweDhlMTRmODU5CisubG9uZwkweDg5M2MxM2ViLDB4ODkzYzEzZWIKKy5sb25nCTB4ZWUyN2E5Y2UsMHhlZTI3YTljZQorLmxvbmcJMHgzNWM5NjFiNywweDM1Yzk2MWI3CisubG9uZwkweGVkZTUxY2UxLDB4ZWRlNTFjZTEKKy5sb25nCTB4M2NiMTQ3N2EsMHgzY2IxNDc3YQorLmxvbmcJMHg1OWRmZDI5YywweDU5ZGZkMjljCisubG9uZwkweDNmNzNmMjU1LDB4M2Y3M2YyNTUKKy5sb25nCTB4NzljZTE0MTgsMHg3OWNlMTQxOAorLmxvbmcJMHhiZjM3Yzc3MywweGJmMzdjNzczCisubG9uZwkweGVhY2RmNzUzLDB4ZWFjZGY3NTMKKy5sb25nCTB4NWJhYWZkNWYsMHg1YmFhZmQ1ZgorLmxvbmcJMHgxNDZmM2RkZiwweDE0NmYzZGRmCisubG9uZwkweDg2ZGI0NDc4LDB4ODZkYjQ0NzgKKy5sb25nCTB4ODFmM2FmY2EsMHg4MWYzYWZjYQorLmxvbmcJMHgzZWM0NjhiOSwweDNlYzQ2OGI5CisubG9uZwkweDJjMzQyNDM4LDB4MmMzNDI0MzgKKy5sb25nCTB4NWY0MGEzYzIsMHg1ZjQwYTNjMgorLmxvbmcJMHg3MmMzMWQxNiwweDcyYzMxZDE2CisubG9uZwkweDBjMjVlMmJjLDB4MGMyNWUyYmMKKy5sb25nCTB4OGI0OTNjMjgsMHg4YjQ5M2MyOAorLmxvbmcJMHg0MTk1MGRmZiwweDQxOTUwZGZmCisubG9uZwkweDcxMDFhODM5LDB4NzEwMWE4MzkKKy5sb25nCTB4ZGViMzBjMDgsMHhkZWIzMGMwOAorLmxvbmcJMHg5Y2U0YjRkOCwweDljZTRiNGQ4CisubG9uZwkweDkwYzE1NjY0LDB4OTBjMTU2NjQKKy5sb25nCTB4NjE4NGNiN2IsMHg2MTg0Y2I3YgorLmxvbmcJMHg3MGI2MzJkNSwweDcwYjYzMmQ1CisubG9uZwkweDc0NWM2YzQ4LDB4NzQ1YzZjNDgKKy5sb25nCTB4NDI1N2I4ZDAsMHg0MjU3YjhkMAorLmJ5dGUJMHg1MiwweDA5LDB4NmEsMHhkNSwweDMwLDB4MzYsMHhhNSwweDM4CisuYnl0ZQkweGJmLDB4NDAsMHhhMywweDllLDB4ODEsMHhmMywweGQ3LDB4ZmIKKy5ieXRlCTB4N2MsMHhlMywweDM5LDB4ODIsMHg5YiwweDJmLDB4ZmYsMHg4NworLmJ5dGUJMHgzNCwweDhlLDB4NDMsMHg0NCwweGM0LDB4ZGUsMHhlOSwweGNiCisuYnl0ZQkweDU0LDB4N2IsMHg5NCwweDMyLDB4YTYsMHhjMiwweDIzLDB4M2QKKy5ieXRlCTB4ZWUsMHg0YywweDk1LDB4MGIsMHg0MiwweGZhLDB4YzMsMHg0ZQorLmJ5dGUJMHgwOCwweDJlLDB4YTEsMHg2NiwweDI4LDB4ZDksMHgyNCwweGIyCisuYnl0ZQkweDc2LDB4NWIsMHhhMiwweDQ5LDB4NmQsMHg4YiwweGQxLDB4MjUKKy5ieXRlCTB4NzIsMHhmOCwweGY2LDB4NjQsMHg4NiwweDY4LDB4OTgsMHgxNgorLmJ5dGUJMHhkNCwweGE0LDB4NWMsMHhjYywweDVkLDB4NjUsMHhiNiwweDkyCisuYnl0ZQkweDZjLDB4NzAsMHg0OCwweDUwLDB4ZmQsMHhlZCwweGI5LDB4ZGEKKy5ieXRlCTB4NWUsMHgxNSwweDQ2LDB4NTcsMHhhNywweDhkLDB4OWQsMHg4NAorLmJ5dGUJMHg5MCwweGQ4LDB4YWIsMHgwMCwweDhjLDB4YmMsMHhkMywweDBhCisuYnl0ZQkweGY3LDB4ZTQsMHg1OCwweDA1LDB4YjgsMHhiMywweDQ1LDB4MDYKKy5ieXRlCTB4ZDAsMHgyYywweDFlLDB4OGYsMHhjYSwweDNmLDB4MGYsMHgwMgorLmJ5dGUJMHhjMSwweGFmLDB4YmQsMHgwMywweDAxLDB4MTMsMHg4YSwweDZiCisuYnl0ZQkweDNhLDB4OTEsMHgxMSwweDQxLDB4NGYsMHg2NywweGRjLDB4ZWEKKy5ieXRlCTB4OTcsMHhmMiwweGNmLDB4Y2UsMHhmMCwweGI0LDB4ZTYsMHg3MworLmJ5dGUJMHg5NiwweGFjLDB4NzQsMHgyMiwweGU3LDB4YWQsMHgzNSwweDg1CisuYnl0ZQkweGUyLDB4ZjksMHgzNywweGU4LDB4MWMsMHg3NSwweGRmLDB4NmUKKy5ieXRlCTB4NDcsMHhmMSwweDFhLDB4NzEsMHgxZCwweDI5LDB4YzUsMHg4OQorLmJ5dGUJMHg2ZiwweGI3LDB4NjIsMHgwZSwweGFhLDB4MTgsMHhiZSwweDFiCisuYnl0ZQkweGZjLDB4NTYsMHgzZSwweDRiLDB4YzYsMHhkMiwweDc5LDB4MjAKKy5ieXRlCTB4OWEsMHhkYiwweGMwLDB4ZmUsMHg3OCwweGNkLDB4NWEsMHhmNAorLmJ5dGUJMHgxZiwweGRkLDB4YTgsMHgzMywweDg4LDB4MDcsMHhjNywweDMxCisuYnl0ZQkweGIxLDB4MTIsMHgxMCwweDU5LDB4MjcsMHg4MCwweGVjLDB4NWYKKy5ieXRlCTB4NjAsMHg1MSwweDdmLDB4YTksMHgxOSwweGI1LDB4NGEsMHgwZAorLmJ5dGUJMHgyZCwweGU1LDB4N2EsMHg5ZiwweDkzLDB4YzksMHg5YywweGVmCisuYnl0ZQkweGEwLDB4ZTAsMHgzYiwweDRkLDB4YWUsMHgyYSwweGY1LDB4YjAKKy5ieXRlCTB4YzgsMHhlYiwweGJiLDB4M2MsMHg4MywweDUzLDB4OTksMHg2MQorLmJ5dGUJMHgxNywweDJiLDB4MDQsMHg3ZSwweGJhLDB4NzcsMHhkNiwweDI2CisuYnl0ZQkweGUxLDB4NjksMHgxNCwweDYzLDB4NTUsMHgyMSwweDBjLDB4N2QKKy5sb25nCTB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ZmVmZWZlZmUsIDB4ZmVmZWZlZmUKKy5sb25nCTB4MWIxYjFiMWIsIDB4MWIxYjFiMWIsIDAsIDAKKy5ieXRlCTB4NTIsMHgwOSwweDZhLDB4ZDUsMHgzMCwweDM2LDB4YTUsMHgzOAorLmJ5dGUJMHhiZiwweDQwLDB4YTMsMHg5ZSwweDgxLDB4ZjMsMHhkNywweGZiCisuYnl0ZQkweDdjLDB4ZTMsMHgzOSwweDgyLDB4OWIsMHgyZiwweGZmLDB4ODcKKy5ieXRlCTB4MzQsMHg4ZSwweDQzLDB4NDQsMHhjNCwweGRlLDB4ZTksMHhjYgorLmJ5dGUJMHg1NCwweDdiLDB4OTQsMHgzMiwweGE2LDB4YzIsMHgyMywweDNkCisuYnl0ZQkweGVlLDB4NGMsMHg5NSwweDBiLDB4NDIsMHhmYSwweGMzLDB4NGUKKy5ieXRlCTB4MDgsMHgyZSwweGExLDB4NjYsMHgyOCwweGQ5LDB4MjQsMHhiMgorLmJ5dGUJMHg3NiwweDViLDB4YTIsMHg0OSwweDZkLDB4OGIsMHhkMSwweDI1CisuYnl0ZQkweDcyLDB4ZjgsMHhmNiwweDY0LDB4ODYsMHg2OCwweDk4LDB4MTYKKy5ieXRlCTB4ZDQsMHhhNCwweDVjLDB4Y2MsMHg1ZCwweDY1LDB4YjYsMHg5MgorLmJ5dGUJMHg2YywweDcwLDB4NDgsMHg1MCwweGZkLDB4ZWQsMHhiOSwweGRhCisuYnl0ZQkweDVlLDB4MTUsMHg0NiwweDU3LDB4YTcsMHg4ZCwweDlkLDB4ODQKKy5ieXRlCTB4OTAsMHhkOCwweGFiLDB4MDAsMHg4YywweGJjLDB4ZDMsMHgwYQorLmJ5dGUJMHhmNywweGU0LDB4NTgsMHgwNSwweGI4LDB4YjMsMHg0NSwweDA2CisuYnl0ZQkweGQwLDB4MmMsMHgxZSwweDhmLDB4Y2EsMHgzZiwweDBmLDB4MDIKKy5ieXRlCTB4YzEsMHhhZiwweGJkLDB4MDMsMHgwMSwweDEzLDB4OGEsMHg2YgorLmJ5dGUJMHgzYSwweDkxLDB4MTEsMHg0MSwweDRmLDB4NjcsMHhkYywweGVhCisuYnl0ZQkweDk3LDB4ZjIsMHhjZiwweGNlLDB4ZjAsMHhiNCwweGU2LDB4NzMKKy5ieXRlCTB4OTYsMHhhYywweDc0LDB4MjIsMHhlNywweGFkLDB4MzUsMHg4NQorLmJ5dGUJMHhlMiwweGY5LDB4MzcsMHhlOCwweDFjLDB4NzUsMHhkZiwweDZlCisuYnl0ZQkweDQ3LDB4ZjEsMHgxYSwweDcxLDB4MWQsMHgyOSwweGM1LDB4ODkKKy5ieXRlCTB4NmYsMHhiNywweDYyLDB4MGUsMHhhYSwweDE4LDB4YmUsMHgxYgorLmJ5dGUJMHhmYywweDU2LDB4M2UsMHg0YiwweGM2LDB4ZDIsMHg3OSwweDIwCisuYnl0ZQkweDlhLDB4ZGIsMHhjMCwweGZlLDB4NzgsMHhjZCwweDVhLDB4ZjQKKy5ieXRlCTB4MWYsMHhkZCwweGE4LDB4MzMsMHg4OCwweDA3LDB4YzcsMHgzMQorLmJ5dGUJMHhiMSwweDEyLDB4MTAsMHg1OSwweDI3LDB4ODAsMHhlYywweDVmCisuYnl0ZQkweDYwLDB4NTEsMHg3ZiwweGE5LDB4MTksMHhiNSwweDRhLDB4MGQKKy5ieXRlCTB4MmQsMHhlNSwweDdhLDB4OWYsMHg5MywweGM5LDB4OWMsMHhlZgorLmJ5dGUJMHhhMCwweGUwLDB4M2IsMHg0ZCwweGFlLDB4MmEsMHhmNSwweGIwCisuYnl0ZQkweGM4LDB4ZWIsMHhiYiwweDNjLDB4ODMsMHg1MywweDk5LDB4NjEKKy5ieXRlCTB4MTcsMHgyYiwweDA0LDB4N2UsMHhiYSwweDc3LDB4ZDYsMHgyNgorLmJ5dGUJMHhlMSwweDY5LDB4MTQsMHg2MywweDU1LDB4MjEsMHgwYywweDdkCisubG9uZwkweDgwODA4MDgwLCAweDgwODA4MDgwLCAweGZlZmVmZWZlLCAweGZlZmVmZWZlCisubG9uZwkweDFiMWIxYjFiLCAweDFiMWIxYjFiLCAwLCAwCisuYnl0ZQkweDUyLDB4MDksMHg2YSwweGQ1LDB4MzAsMHgzNiwweGE1LDB4MzgKKy5ieXRlCTB4YmYsMHg0MCwweGEzLDB4OWUsMHg4MSwweGYzLDB4ZDcsMHhmYgorLmJ5dGUJMHg3YywweGUzLDB4MzksMHg4MiwweDliLDB4MmYsMHhmZiwweDg3CisuYnl0ZQkweDM0LDB4OGUsMHg0MywweDQ0LDB4YzQsMHhkZSwweGU5LDB4Y2IKKy5ieXRlCTB4NTQsMHg3YiwweDk0LDB4MzIsMHhhNiwweGMyLDB4MjMsMHgzZAorLmJ5dGUJMHhlZSwweDRjLDB4OTUsMHgwYiwweDQyLDB4ZmEsMHhjMywweDRlCisuYnl0ZQkweDA4LDB4MmUsMHhhMSwweDY2LDB4MjgsMHhkOSwweDI0LDB4YjIKKy5ieXRlCTB4NzYsMHg1YiwweGEyLDB4NDksMHg2ZCwweDhiLDB4ZDEsMHgyNQorLmJ5dGUJMHg3MiwweGY4LDB4ZjYsMHg2NCwweDg2LDB4NjgsMHg5OCwweDE2CisuYnl0ZQkweGQ0LDB4YTQsMHg1YywweGNjLDB4NWQsMHg2NSwweGI2LDB4OTIKKy5ieXRlCTB4NmMsMHg3MCwweDQ4LDB4NTAsMHhmZCwweGVkLDB4YjksMHhkYQorLmJ5dGUJMHg1ZSwweDE1LDB4NDYsMHg1NywweGE3LDB4OGQsMHg5ZCwweDg0CisuYnl0ZQkweDkwLDB4ZDgsMHhhYiwweDAwLDB4OGMsMHhiYywweGQzLDB4MGEKKy5ieXRlCTB4ZjcsMHhlNCwweDU4LDB4MDUsMHhiOCwweGIzLDB4NDUsMHgwNgorLmJ5dGUJMHhkMCwweDJjLDB4MWUsMHg4ZiwweGNhLDB4M2YsMHgwZiwweDAyCisuYnl0ZQkweGMxLDB4YWYsMHhiZCwweDAzLDB4MDEsMHgxMywweDhhLDB4NmIKKy5ieXRlCTB4M2EsMHg5MSwweDExLDB4NDEsMHg0ZiwweDY3LDB4ZGMsMHhlYQorLmJ5dGUJMHg5NywweGYyLDB4Y2YsMHhjZSwweGYwLDB4YjQsMHhlNiwweDczCisuYnl0ZQkweDk2LDB4YWMsMHg3NCwweDIyLDB4ZTcsMHhhZCwweDM1LDB4ODUKKy5ieXRlCTB4ZTIsMHhmOSwweDM3LDB4ZTgsMHgxYywweDc1LDB4ZGYsMHg2ZQorLmJ5dGUJMHg0NywweGYxLDB4MWEsMHg3MSwweDFkLDB4MjksMHhjNSwweDg5CisuYnl0ZQkweDZmLDB4YjcsMHg2MiwweDBlLDB4YWEsMHgxOCwweGJlLDB4MWIKKy5ieXRlCTB4ZmMsMHg1NiwweDNlLDB4NGIsMHhjNiwweGQyLDB4NzksMHgyMAorLmJ5dGUJMHg5YSwweGRiLDB4YzAsMHhmZSwweDc4LDB4Y2QsMHg1YSwweGY0CisuYnl0ZQkweDFmLDB4ZGQsMHhhOCwweDMzLDB4ODgsMHgwNywweGM3LDB4MzEKKy5ieXRlCTB4YjEsMHgxMiwweDEwLDB4NTksMHgyNywweDgwLDB4ZWMsMHg1ZgorLmJ5dGUJMHg2MCwweDUxLDB4N2YsMHhhOSwweDE5LDB4YjUsMHg0YSwweDBkCisuYnl0ZQkweDJkLDB4ZTUsMHg3YSwweDlmLDB4OTMsMHhjOSwweDljLDB4ZWYKKy5ieXRlCTB4YTAsMHhlMCwweDNiLDB4NGQsMHhhZSwweDJhLDB4ZjUsMHhiMAorLmJ5dGUJMHhjOCwweGViLDB4YmIsMHgzYywweDgzLDB4NTMsMHg5OSwweDYxCisuYnl0ZQkweDE3LDB4MmIsMHgwNCwweDdlLDB4YmEsMHg3NywweGQ2LDB4MjYKKy5ieXRlCTB4ZTEsMHg2OSwweDE0LDB4NjMsMHg1NSwweDIxLDB4MGMsMHg3ZAorLmxvbmcJMHg4MDgwODA4MCwgMHg4MDgwODA4MCwgMHhmZWZlZmVmZSwgMHhmZWZlZmVmZQorLmxvbmcJMHgxYjFiMWIxYiwgMHgxYjFiMWIxYiwgMCwgMAorLmJ5dGUJMHg1MiwweDA5LDB4NmEsMHhkNSwweDMwLDB4MzYsMHhhNSwweDM4CisuYnl0ZQkweGJmLDB4NDAsMHhhMywweDllLDB4ODEsMHhmMywweGQ3LDB4ZmIKKy5ieXRlCTB4N2MsMHhlMywweDM5LDB4ODIsMHg5YiwweDJmLDB4ZmYsMHg4NworLmJ5dGUJMHgzNCwweDhlLDB4NDMsMHg0NCwweGM0LDB4ZGUsMHhlOSwweGNiCisuYnl0ZQkweDU0LDB4N2IsMHg5NCwweDMyLDB4YTYsMHhjMiwweDIzLDB4M2QKKy5ieXRlCTB4ZWUsMHg0YywweDk1LDB4MGIsMHg0MiwweGZhLDB4YzMsMHg0ZQorLmJ5dGUJMHgwOCwweDJlLDB4YTEsMHg2NiwweDI4LDB4ZDksMHgyNCwweGIyCisuYnl0ZQkweDc2LDB4NWIsMHhhMiwweDQ5LDB4NmQsMHg4YiwweGQxLDB4MjUKKy5ieXRlCTB4NzIsMHhmOCwweGY2LDB4NjQsMHg4NiwweDY4LDB4OTgsMHgxNgorLmJ5dGUJMHhkNCwweGE0LDB4NWMsMHhjYywweDVkLDB4NjUsMHhiNiwweDkyCisuYnl0ZQkweDZjLDB4NzAsMHg0OCwweDUwLDB4ZmQsMHhlZCwweGI5LDB4ZGEKKy5ieXRlCTB4NWUsMHgxNSwweDQ2LDB4NTcsMHhhNywweDhkLDB4OWQsMHg4NAorLmJ5dGUJMHg5MCwweGQ4LDB4YWIsMHgwMCwweDhjLDB4YmMsMHhkMywweDBhCisuYnl0ZQkweGY3LDB4ZTQsMHg1OCwweDA1LDB4YjgsMHhiMywweDQ1LDB4MDYKKy5ieXRlCTB4ZDAsMHgyYywweDFlLDB4OGYsMHhjYSwweDNmLDB4MGYsMHgwMgorLmJ5dGUJMHhjMSwweGFmLDB4YmQsMHgwMywweDAxLDB4MTMsMHg4YSwweDZiCisuYnl0ZQkweDNhLDB4OTEsMHgxMSwweDQxLDB4NGYsMHg2NywweGRjLDB4ZWEKKy5ieXRlCTB4OTcsMHhmMiwweGNmLDB4Y2UsMHhmMCwweGI0LDB4ZTYsMHg3MworLmJ5dGUJMHg5NiwweGFjLDB4NzQsMHgyMiwweGU3LDB4YWQsMHgzNSwweDg1CisuYnl0ZQkweGUyLDB4ZjksMHgzNywweGU4LDB4MWMsMHg3NSwweGRmLDB4NmUKKy5ieXRlCTB4NDcsMHhmMSwweDFhLDB4NzEsMHgxZCwweDI5LDB4YzUsMHg4OQorLmJ5dGUJMHg2ZiwweGI3LDB4NjIsMHgwZSwweGFhLDB4MTgsMHhiZSwweDFiCisuYnl0ZQkweGZjLDB4NTYsMHgzZSwweDRiLDB4YzYsMHhkMiwweDc5LDB4MjAKKy5ieXRlCTB4OWEsMHhkYiwweGMwLDB4ZmUsMHg3OCwweGNkLDB4NWEsMHhmNAorLmJ5dGUJMHgxZiwweGRkLDB4YTgsMHgzMywweDg4LDB4MDcsMHhjNywweDMxCisuYnl0ZQkweGIxLDB4MTIsMHgxMCwweDU5LDB4MjcsMHg4MCwweGVjLDB4NWYKKy5ieXRlCTB4NjAsMHg1MSwweDdmLDB4YTksMHgxOSwweGI1LDB4NGEsMHgwZAorLmJ5dGUJMHgyZCwweGU1LDB4N2EsMHg5ZiwweDkzLDB4YzksMHg5YywweGVmCisuYnl0ZQkweGEwLDB4ZTAsMHgzYiwweDRkLDB4YWUsMHgyYSwweGY1LDB4YjAKKy5ieXRlCTB4YzgsMHhlYiwweGJiLDB4M2MsMHg4MywweDUzLDB4OTksMHg2MQorLmJ5dGUJMHgxNywweDJiLDB4MDQsMHg3ZSwweGJhLDB4NzcsMHhkNiwweDI2CisuYnl0ZQkweGUxLDB4NjksMHgxNCwweDYzLDB4NTUsMHgyMSwweDBjLDB4N2QKKy5sb25nCTB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ZmVmZWZlZmUsIDB4ZmVmZWZlZmUKKy5sb25nCTB4MWIxYjFiMWIsIDB4MWIxYjFiMWIsIDAsIDAKKy5ieXRlCTY1LDY5LDgzLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NCw1Miw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisucDJhbGlnbgk2CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS1nY20teDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzbmktZ2NtLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTM5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzbmktZ2NtLXg4Nl82NC5TCkBAIC0wLDAgKzEsODM0IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisKKy5wMmFsaWduCTUKK19hZXNuaV9jdHIzMl9naGFzaF82eDoKKworCXZtb3ZkcXUJMzIoJXIxMSksJXhtbTIKKwlzdWJxCSQ2LCVyZHgKKwl2cHhvcgkleG1tNCwleG1tNCwleG1tNAorCXZtb3ZkcXUJMC0xMjgoJXJjeCksJXhtbTE1CisJdnBhZGRiCSV4bW0yLCV4bW0xLCV4bW0xMAorCXZwYWRkYgkleG1tMiwleG1tMTAsJXhtbTExCisJdnBhZGRiCSV4bW0yLCV4bW0xMSwleG1tMTIKKwl2cGFkZGIJJXhtbTIsJXhtbTEyLCV4bW0xMworCXZwYWRkYgkleG1tMiwleG1tMTMsJXhtbTE0CisJdnB4b3IJJXhtbTE1LCV4bW0xLCV4bW05CisJdm1vdmRxdQkleG1tNCwxNis4KCVyc3ApCisJam1wCUwkb29wNngKKworLnAyYWxpZ24JNQorTCRvb3A2eDoKKwlhZGRsCSQxMDA2NjMyOTYsJWVieAorCWpjCUwkaGFuZGxlX2N0cjMyCisJdm1vdmRxdQkwLTMyKCVyOSksJXhtbTMKKwl2cGFkZGIJJXhtbTIsJXhtbTE0LCV4bW0xCisJdnB4b3IJJXhtbTE1LCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tMTUsJXhtbTExLCV4bW0xMQorCitMJHJlc3VtZV9jdHIzMjoKKwl2bW92ZHF1CSV4bW0xLCglcjgpCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tNywleG1tNQorCXZweG9yCSV4bW0xNSwleG1tMTIsJXhtbTEyCisJdm1vdnVwcwkxNi0xMjgoJXJjeCksJXhtbTIKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0zLCV4bW03LCV4bW02CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCXhvcnEJJXIxMiwlcjEyCisJY21wcQklcjE0LCVyMTUKKworCXZhZXNlbmMJJXhtbTIsJXhtbTksJXhtbTkKKwl2bW92ZHF1CTQ4KzgoJXJzcCksJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTMsJXhtbTcsJXhtbTEKKwl2YWVzZW5jCSV4bW0yLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXNldG5jCSVyMTJiCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTIsJXhtbTExLCV4bW0xMQorCXZtb3ZkcXUJMTYtMzIoJXI5KSwleG1tMworCW5lZ3EJJXIxMgorCXZhZXNlbmMJJXhtbTIsJXhtbTEyLCV4bW0xMgorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJdnBjbG11bHFkcQkkMHgwMCwleG1tMywleG1tMCwleG1tNQorCXZweG9yCSV4bW00LCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tMiwleG1tMTMsJXhtbTEzCisJdnB4b3IJJXhtbTUsJXhtbTEsJXhtbTQKKwlhbmRxCSQweDYwLCVyMTIKKwl2bW92dXBzCTMyLTEyOCglcmN4KSwleG1tMTUKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW0wLCV4bW0xCisJdmFlc2VuYwkleG1tMiwleG1tMTQsJXhtbTE0CisKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0zLCV4bW0wLCV4bW0yCisJbGVhcQkoJXIxNCwlcjEyLDEpLCVyMTQKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZweG9yCTE2KzgoJXJzcCksJXhtbTgsJXhtbTgKKwl2cGNsbXVscWRxCSQweDExLCV4bW0zLCV4bW0wLCV4bW0zCisJdm1vdmRxdQk2NCs4KCVyc3ApLCV4bW0wCisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCW1vdmJlcQk4OCglcjE0KSwlcjEzCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCW1vdmJlcQk4MCglcjE0KSwlcjEyCisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCW1vdnEJJXIxMywzMis4KCVyc3ApCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCW1vdnEJJXIxMiw0MCs4KCVyc3ApCisJdm1vdmRxdQk0OC0zMiglcjkpLCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCisJdm1vdnVwcwk0OC0xMjgoJXJjeCksJXhtbTE1CisJdnB4b3IJJXhtbTEsJXhtbTYsJXhtbTYKKwl2cGNsbXVscWRxCSQweDAwLCV4bW01LCV4bW0wLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTUsJXhtbTAsJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTMsJXhtbTcsJXhtbTcKKwl2cGNsbXVscWRxCSQweDAxLCV4bW01LCV4bW0wLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTUsJXhtbTAsJXhtbTUKKwl2bW92ZHF1CTgwKzgoJXJzcCksJXhtbTAKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdm1vdmRxdQk2NC0zMiglcjkpLCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCisJdm1vdnVwcwk2NC0xMjgoJXJjeCksJXhtbTE1CisJdnB4b3IJJXhtbTIsJXhtbTYsJXhtbTYKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xLCV4bW0wLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tMywleG1tNiwleG1tNgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEsJXhtbTAsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJbW92YmVxCTcyKCVyMTQpLCVyMTMKKwl2cHhvcgkleG1tNSwleG1tNywleG1tNworCXZwY2xtdWxxZHEJJDB4MDEsJXhtbTEsJXhtbTAsJXhtbTUKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTEsJXhtbTExCisJbW92YmVxCTY0KCVyMTQpLCVyMTIKKwl2cGNsbXVscWRxCSQweDExLCV4bW0xLCV4bW0wLCV4bW0xCisJdm1vdmRxdQk5Nis4KCVyc3ApLCV4bW0wCisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCW1vdnEJJXIxMyw0OCs4KCVyc3ApCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCW1vdnEJJXIxMiw1Nis4KCVyc3ApCisJdnB4b3IJJXhtbTIsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CTk2LTMyKCVyOSksJXhtbTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTQsJXhtbTE0CisKKwl2bW92dXBzCTgwLTEyOCglcmN4KSwleG1tMTUKKwl2cHhvcgkleG1tMywleG1tNiwleG1tNgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTIsJXhtbTAsJXhtbTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJdnBjbG11bHFkcQkkMHgxMCwleG1tMiwleG1tMCwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMCwleG1tMTAKKwltb3ZiZXEJNTYoJXIxNCksJXIxMworCXZweG9yCSV4bW0xLCV4bW03LCV4bW03CisJdnBjbG11bHFkcQkkMHgwMSwleG1tMiwleG1tMCwleG1tMQorCXZweG9yCTExMis4KCVyc3ApLCV4bW04LCV4bW04CisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCW1vdmJlcQk0OCglcjE0KSwlcjEyCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMiwleG1tMCwleG1tMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwltb3ZxCSVyMTMsNjQrOCglcnNwKQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMywleG1tMTMKKwltb3ZxCSVyMTIsNzIrOCglcnNwKQorCXZweG9yCSV4bW0zLCV4bW00LCV4bW00CisJdm1vdmRxdQkxMTItMzIoJXI5KSwleG1tMworCXZhZXNlbmMJJXhtbTE1LCV4bW0xNCwleG1tMTQKKworCXZtb3Z1cHMJOTYtMTI4KCVyY3gpLCV4bW0xNQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tOCwleG1tNQorCXZhZXNlbmMJJXhtbTE1LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTEsJXhtbTYsJXhtbTYKKwl2cGNsbXVscWRxCSQweDAxLCV4bW0zLCV4bW04LCV4bW0xCisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCW1vdmJlcQk0MCglcjE0KSwlcjEzCisJdnB4b3IJJXhtbTIsJXhtbTcsJXhtbTcKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0zLCV4bW04LCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCW1vdmJlcQkzMiglcjE0KSwlcjEyCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tOCwleG1tOAorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwltb3ZxCSVyMTMsODArOCglcnNwKQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMywleG1tMTMKKwltb3ZxCSVyMTIsODgrOCglcnNwKQorCXZweG9yCSV4bW01LCV4bW02LCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXZweG9yCSV4bW0xLCV4bW02LCV4bW02CisKKwl2bW92dXBzCTExMi0xMjgoJXJjeCksJXhtbTE1CisJdnBzbGxkcQkkOCwleG1tNiwleG1tNQorCXZweG9yCSV4bW0yLCV4bW00LCV4bW00CisJdm1vdmRxdQkxNiglcjExKSwleG1tMworCisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2cHhvcgkleG1tOCwleG1tNywleG1tNworCXZhZXNlbmMJJXhtbTE1LCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCW1vdmJlcQkyNCglcjE0KSwlcjEzCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCW1vdmJlcQkxNiglcjE0KSwlcjEyCisJdnBhbGlnbnIJJDgsJXhtbTQsJXhtbTQsJXhtbTAKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0zLCV4bW00LCV4bW00CisJbW92cQklcjEzLDk2KzgoJXJzcCkKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTIsJXhtbTEyCisJbW92cQklcjEyLDEwNCs4KCVyc3ApCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZtb3Z1cHMJMTI4LTEyOCglcmN4KSwleG1tMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xNCwleG1tMTQKKworCXZhZXNlbmMJJXhtbTEsJXhtbTksJXhtbTkKKwl2bW92dXBzCTE0NC0xMjgoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMSwleG1tMTAsJXhtbTEwCisJdnBzcmxkcQkkOCwleG1tNiwleG1tNgorCXZhZXNlbmMJJXhtbTEsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW02LCV4bW03LCV4bW03CisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisJdnB4b3IJJXhtbTAsJXhtbTQsJXhtbTQKKwltb3ZiZXEJOCglcjE0KSwlcjEzCisJdmFlc2VuYwkleG1tMSwleG1tMTMsJXhtbTEzCisJbW92YmVxCTAoJXIxNCksJXIxMgorCXZhZXNlbmMJJXhtbTEsJXhtbTE0LCV4bW0xNAorCXZtb3Z1cHMJMTYwLTEyOCglcmN4KSwleG1tMQorCWNtcGwJJDExLCVlYnAKKwlqYglMJGVuY190YWlsCisKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMywleG1tMTMKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTQsJXhtbTE0CisKKwl2YWVzZW5jCSV4bW0xLCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMSwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMSwleG1tMTEsJXhtbTExCisJdmFlc2VuYwkleG1tMSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMSwleG1tMTMsJXhtbTEzCisJdm1vdnVwcwkxNzYtMTI4KCVyY3gpLCV4bW0xNQorCXZhZXNlbmMJJXhtbTEsJXhtbTE0LCV4bW0xNAorCXZtb3Z1cHMJMTkyLTEyOCglcmN4KSwleG1tMQorCWplCUwkZW5jX3RhaWwKKworCXZhZXNlbmMJJXhtbTE1LCV4bW05LCV4bW05CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTIsJXhtbTEyCisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZhZXNlbmMJJXhtbTE1LCV4bW0xNCwleG1tMTQKKworCXZhZXNlbmMJJXhtbTEsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMSwleG1tMTEKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xLCV4bW0xMywleG1tMTMKKwl2bW92dXBzCTIwOC0xMjgoJXJjeCksJXhtbTE1CisJdmFlc2VuYwkleG1tMSwleG1tMTQsJXhtbTE0CisJdm1vdnVwcwkyMjQtMTI4KCVyY3gpLCV4bW0xCisJam1wCUwkZW5jX3RhaWwKKworLnAyYWxpZ24JNQorTCRoYW5kbGVfY3RyMzI6CisJdm1vdmRxdQkoJXIxMSksJXhtbTAKKwl2cHNodWZiCSV4bW0wLCV4bW0xLCV4bW02CisJdm1vdmRxdQk0OCglcjExKSwleG1tNQorCXZwYWRkZAk2NCglcjExKSwleG1tNiwleG1tMTAKKwl2cGFkZGQJJXhtbTUsJXhtbTYsJXhtbTExCisJdm1vdmRxdQkwLTMyKCVyOSksJXhtbTMKKwl2cGFkZGQJJXhtbTUsJXhtbTEwLCV4bW0xMgorCXZwc2h1ZmIJJXhtbTAsJXhtbTEwLCV4bW0xMAorCXZwYWRkZAkleG1tNSwleG1tMTEsJXhtbTEzCisJdnBzaHVmYgkleG1tMCwleG1tMTEsJXhtbTExCisJdnB4b3IJJXhtbTE1LCV4bW0xMCwleG1tMTAKKwl2cGFkZGQJJXhtbTUsJXhtbTEyLCV4bW0xNAorCXZwc2h1ZmIJJXhtbTAsJXhtbTEyLCV4bW0xMgorCXZweG9yCSV4bW0xNSwleG1tMTEsJXhtbTExCisJdnBhZGRkCSV4bW01LCV4bW0xMywleG1tMQorCXZwc2h1ZmIJJXhtbTAsJXhtbTEzLCV4bW0xMworCXZwc2h1ZmIJJXhtbTAsJXhtbTE0LCV4bW0xNAorCXZwc2h1ZmIJJXhtbTAsJXhtbTEsJXhtbTEKKwlqbXAJTCRyZXN1bWVfY3RyMzIKKworLnAyYWxpZ24JNQorTCRlbmNfdGFpbDoKKwl2YWVzZW5jCSV4bW0xNSwleG1tOSwleG1tOQorCXZtb3ZkcXUJJXhtbTcsMTYrOCglcnNwKQorCXZwYWxpZ25yCSQ4LCV4bW00LCV4bW00LCV4bW04CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTQsJXhtbTQKKwl2cHhvcgkwKCVyZGkpLCV4bW0xLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZweG9yCTE2KCVyZGkpLCV4bW0xLCV4bW0wCisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCXZweG9yCTMyKCVyZGkpLCV4bW0xLCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZweG9yCTQ4KCVyZGkpLCV4bW0xLCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXZweG9yCTY0KCVyZGkpLCV4bW0xLCV4bW03CisJdnB4b3IJODAoJXJkaSksJXhtbTEsJXhtbTMKKwl2bW92ZHF1CSglcjgpLCV4bW0xCisKKwl2YWVzZW5jbGFzdAkleG1tMiwleG1tOSwleG1tOQorCXZtb3ZkcXUJMzIoJXIxMSksJXhtbTIKKwl2YWVzZW5jbGFzdAkleG1tMCwleG1tMTAsJXhtbTEwCisJdnBhZGRiCSV4bW0yLCV4bW0xLCV4bW0wCisJbW92cQklcjEzLDExMis4KCVyc3ApCisJbGVhcQk5NiglcmRpKSwlcmRpCisJdmFlc2VuY2xhc3QJJXhtbTUsJXhtbTExLCV4bW0xMQorCXZwYWRkYgkleG1tMiwleG1tMCwleG1tNQorCW1vdnEJJXIxMiwxMjArOCglcnNwKQorCWxlYXEJOTYoJXJzaSksJXJzaQorCXZtb3ZkcXUJMC0xMjgoJXJjeCksJXhtbTE1CisJdmFlc2VuY2xhc3QJJXhtbTYsJXhtbTEyLCV4bW0xMgorCXZwYWRkYgkleG1tMiwleG1tNSwleG1tNgorCXZhZXNlbmNsYXN0CSV4bW03LCV4bW0xMywleG1tMTMKKwl2cGFkZGIJJXhtbTIsJXhtbTYsJXhtbTcKKwl2YWVzZW5jbGFzdAkleG1tMywleG1tMTQsJXhtbTE0CisJdnBhZGRiCSV4bW0yLCV4bW03LCV4bW0zCisKKwlhZGRxCSQweDYwLCVyMTAKKwlzdWJxCSQweDYsJXJkeAorCWpjCUwkNnhfZG9uZQorCisJdm1vdnVwcwkleG1tOSwtOTYoJXJzaSkKKwl2cHhvcgkleG1tMTUsJXhtbTEsJXhtbTkKKwl2bW92dXBzCSV4bW0xMCwtODAoJXJzaSkKKwl2bW92ZHFhCSV4bW0wLCV4bW0xMAorCXZtb3Z1cHMJJXhtbTExLC02NCglcnNpKQorCXZtb3ZkcWEJJXhtbTUsJXhtbTExCisJdm1vdnVwcwkleG1tMTIsLTQ4KCVyc2kpCisJdm1vdmRxYQkleG1tNiwleG1tMTIKKwl2bW92dXBzCSV4bW0xMywtMzIoJXJzaSkKKwl2bW92ZHFhCSV4bW03LCV4bW0xMworCXZtb3Z1cHMJJXhtbTE0LC0xNiglcnNpKQorCXZtb3ZkcWEJJXhtbTMsJXhtbTE0CisJdm1vdmRxdQkzMis4KCVyc3ApLCV4bW03CisJam1wCUwkb29wNngKKworTCQ2eF9kb25lOgorCXZweG9yCTE2KzgoJXJzcCksJXhtbTgsJXhtbTgKKwl2cHhvcgkleG1tNCwleG1tOCwleG1tOAorCisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9hZXNuaV9nY21fZGVjcnlwdAorLnByaXZhdGVfZXh0ZXJuIF9hZXNuaV9nY21fZGVjcnlwdAorCisucDJhbGlnbgk1CitfYWVzbmlfZ2NtX2RlY3J5cHQ6CisKKwl4b3JxCSVyMTAsJXIxMAorCisKKworCWNtcHEJJDB4NjAsJXJkeAorCWpiCUwkZ2NtX2RlY19hYm9ydAorCisJbGVhcQkoJXJzcCksJXJheAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJdnplcm91cHBlcgorCisJdm1vdmRxdQkoJXI4KSwleG1tMQorCWFkZHEJJC0xMjgsJXJzcAorCW1vdmwJMTIoJXI4KSwlZWJ4CisJbGVhcQlMJGJzd2FwX21hc2soJXJpcCksJXIxMQorCWxlYXEJLTEyOCglcmN4KSwlcjE0CisJbW92cQkkMHhmODAsJXIxNQorCXZtb3ZkcXUJKCVyOSksJXhtbTgKKwlhbmRxCSQtMTI4LCVyc3AKKwl2bW92ZHF1CSglcjExKSwleG1tMAorCWxlYXEJMTI4KCVyY3gpLCVyY3gKKwlsZWFxCTMyKzMyKCVyOSksJXI5CisJbW92bAkyNDAtMTI4KCVyY3gpLCVlYnAKKwl2cHNodWZiCSV4bW0wLCV4bW04LCV4bW04CisKKwlhbmRxCSVyMTUsJXIxNAorCWFuZHEJJXJzcCwlcjE1CisJc3VicQklcjE0LCVyMTUKKwlqYwlMJGRlY19ub19rZXlfYWxpYXNpbmcKKwljbXBxCSQ3NjgsJXIxNQorCWpuYwlMJGRlY19ub19rZXlfYWxpYXNpbmcKKwlzdWJxCSVyMTUsJXJzcAorTCRkZWNfbm9fa2V5X2FsaWFzaW5nOgorCisJdm1vdmRxdQk4MCglcmRpKSwleG1tNworCWxlYXEJKCVyZGkpLCVyMTQKKwl2bW92ZHF1CTY0KCVyZGkpLCV4bW00CisKKworCisKKworCisKKwlsZWFxCS0xOTIoJXJkaSwlcmR4LDEpLCVyMTUKKworCXZtb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlzaHJxCSQ0LCVyZHgKKwl4b3JxCSVyMTAsJXIxMAorCXZtb3ZkcXUJMzIoJXJkaSksJXhtbTYKKwl2cHNodWZiCSV4bW0wLCV4bW03LCV4bW03CisJdm1vdmRxdQkxNiglcmRpKSwleG1tMgorCXZwc2h1ZmIJJXhtbTAsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CSglcmRpKSwleG1tMworCXZwc2h1ZmIJJXhtbTAsJXhtbTUsJXhtbTUKKwl2bW92ZHF1CSV4bW00LDQ4KCVyc3ApCisJdnBzaHVmYgkleG1tMCwleG1tNiwleG1tNgorCXZtb3ZkcXUJJXhtbTUsNjQoJXJzcCkKKwl2cHNodWZiCSV4bW0wLCV4bW0yLCV4bW0yCisJdm1vdmRxdQkleG1tNiw4MCglcnNwKQorCXZwc2h1ZmIJJXhtbTAsJXhtbTMsJXhtbTMKKwl2bW92ZHF1CSV4bW0yLDk2KCVyc3ApCisJdm1vdmRxdQkleG1tMywxMTIoJXJzcCkKKworCWNhbGwJX2Flc25pX2N0cjMyX2doYXNoXzZ4CisKKwl2bW92dXBzCSV4bW05LC05NiglcnNpKQorCXZtb3Z1cHMJJXhtbTEwLC04MCglcnNpKQorCXZtb3Z1cHMJJXhtbTExLC02NCglcnNpKQorCXZtb3Z1cHMJJXhtbTEyLC00OCglcnNpKQorCXZtb3Z1cHMJJXhtbTEzLC0zMiglcnNpKQorCXZtb3Z1cHMJJXhtbTE0LC0xNiglcnNpKQorCisJdnBzaHVmYgkoJXIxMSksJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW04LC02NCglcjkpCisKKwl2emVyb3VwcGVyCisJbW92cQktNDgoJXJheCksJXIxNQorCisJbW92cQktNDAoJXJheCksJXIxNAorCisJbW92cQktMzIoJXJheCksJXIxMworCisJbW92cQktMjQoJXJheCksJXIxMgorCisJbW92cQktMTYoJXJheCksJXJicAorCisJbW92cQktOCglcmF4KSwlcmJ4CisKKwlsZWFxCSglcmF4KSwlcnNwCisKK0wkZ2NtX2RlY19hYm9ydDoKKwltb3ZxCSVyMTAsJXJheAorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorX2Flc25pX2N0cjMyXzZ4OgorCisJdm1vdmRxdQkwLTEyOCglcmN4KSwleG1tNAorCXZtb3ZkcXUJMzIoJXIxMSksJXhtbTIKKwlsZWFxCS0xKCVyYnApLCVyMTMKKwl2bW92dXBzCTE2LTEyOCglcmN4KSwleG1tMTUKKwlsZWFxCTMyLTEyOCglcmN4KSwlcjEyCisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTkKKwlhZGRsCSQxMDA2NjMyOTYsJWVieAorCWpjCUwkaGFuZGxlX2N0cjMyXzIKKwl2cGFkZGIJJXhtbTIsJXhtbTEsJXhtbTEwCisJdnBhZGRiCSV4bW0yLCV4bW0xMCwleG1tMTEKKwl2cHhvcgkleG1tNCwleG1tMTAsJXhtbTEwCisJdnBhZGRiCSV4bW0yLCV4bW0xMSwleG1tMTIKKwl2cHhvcgkleG1tNCwleG1tMTEsJXhtbTExCisJdnBhZGRiCSV4bW0yLCV4bW0xMiwleG1tMTMKKwl2cHhvcgkleG1tNCwleG1tMTIsJXhtbTEyCisJdnBhZGRiCSV4bW0yLCV4bW0xMywleG1tMTQKKwl2cHhvcgkleG1tNCwleG1tMTMsJXhtbTEzCisJdnBhZGRiCSV4bW0yLCV4bW0xNCwleG1tMQorCXZweG9yCSV4bW00LCV4bW0xNCwleG1tMTQKKwlqbXAJTCRvb3BfY3RyMzIKKworLnAyYWxpZ24JNAorTCRvb3BfY3RyMzI6CisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTAsJXhtbTEwCisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZhZXNlbmMJJXhtbTE1LCV4bW0xMiwleG1tMTIKKwl2YWVzZW5jCSV4bW0xNSwleG1tMTMsJXhtbTEzCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXZtb3Z1cHMJKCVyMTIpLCV4bW0xNQorCWxlYXEJMTYoJXIxMiksJXIxMgorCWRlY2wJJXIxM2QKKwlqbnoJTCRvb3BfY3RyMzIKKworCXZtb3ZkcXUJKCVyMTIpLCV4bW0zCisJdmFlc2VuYwkleG1tMTUsJXhtbTksJXhtbTkKKwl2cHhvcgkwKCVyZGkpLCV4bW0zLCV4bW00CisJdmFlc2VuYwkleG1tMTUsJXhtbTEwLCV4bW0xMAorCXZweG9yCTE2KCVyZGkpLCV4bW0zLCV4bW01CisJdmFlc2VuYwkleG1tMTUsJXhtbTExLCV4bW0xMQorCXZweG9yCTMyKCVyZGkpLCV4bW0zLCV4bW02CisJdmFlc2VuYwkleG1tMTUsJXhtbTEyLCV4bW0xMgorCXZweG9yCTQ4KCVyZGkpLCV4bW0zLCV4bW04CisJdmFlc2VuYwkleG1tMTUsJXhtbTEzLCV4bW0xMworCXZweG9yCTY0KCVyZGkpLCV4bW0zLCV4bW0yCisJdmFlc2VuYwkleG1tMTUsJXhtbTE0LCV4bW0xNAorCXZweG9yCTgwKCVyZGkpLCV4bW0zLCV4bW0zCisJbGVhcQk5NiglcmRpKSwlcmRpCisKKwl2YWVzZW5jbGFzdAkleG1tNCwleG1tOSwleG1tOQorCXZhZXNlbmNsYXN0CSV4bW01LCV4bW0xMCwleG1tMTAKKwl2YWVzZW5jbGFzdAkleG1tNiwleG1tMTEsJXhtbTExCisJdmFlc2VuY2xhc3QJJXhtbTgsJXhtbTEyLCV4bW0xMgorCXZhZXNlbmNsYXN0CSV4bW0yLCV4bW0xMywleG1tMTMKKwl2YWVzZW5jbGFzdAkleG1tMywleG1tMTQsJXhtbTE0CisJdm1vdnVwcwkleG1tOSwwKCVyc2kpCisJdm1vdnVwcwkleG1tMTAsMTYoJXJzaSkKKwl2bW92dXBzCSV4bW0xMSwzMiglcnNpKQorCXZtb3Z1cHMJJXhtbTEyLDQ4KCVyc2kpCisJdm1vdnVwcwkleG1tMTMsNjQoJXJzaSkKKwl2bW92dXBzCSV4bW0xNCw4MCglcnNpKQorCWxlYXEJOTYoJXJzaSksJXJzaQorCisJLmJ5dGUJMHhmMywweGMzCisucDJhbGlnbgk1CitMJGhhbmRsZV9jdHIzMl8yOgorCXZwc2h1ZmIJJXhtbTAsJXhtbTEsJXhtbTYKKwl2bW92ZHF1CTQ4KCVyMTEpLCV4bW01CisJdnBhZGRkCTY0KCVyMTEpLCV4bW02LCV4bW0xMAorCXZwYWRkZAkleG1tNSwleG1tNiwleG1tMTEKKwl2cGFkZGQJJXhtbTUsJXhtbTEwLCV4bW0xMgorCXZwc2h1ZmIJJXhtbTAsJXhtbTEwLCV4bW0xMAorCXZwYWRkZAkleG1tNSwleG1tMTEsJXhtbTEzCisJdnBzaHVmYgkleG1tMCwleG1tMTEsJXhtbTExCisJdnB4b3IJJXhtbTQsJXhtbTEwLCV4bW0xMAorCXZwYWRkZAkleG1tNSwleG1tMTIsJXhtbTE0CisJdnBzaHVmYgkleG1tMCwleG1tMTIsJXhtbTEyCisJdnB4b3IJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZwYWRkZAkleG1tNSwleG1tMTMsJXhtbTEKKwl2cHNodWZiCSV4bW0wLCV4bW0xMywleG1tMTMKKwl2cHhvcgkleG1tNCwleG1tMTIsJXhtbTEyCisJdnBzaHVmYgkleG1tMCwleG1tMTQsJXhtbTE0CisJdnB4b3IJJXhtbTQsJXhtbTEzLCV4bW0xMworCXZwc2h1ZmIJJXhtbTAsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tNCwleG1tMTQsJXhtbTE0CisJam1wCUwkb29wX2N0cjMyCisKKworCisuZ2xvYmwJX2Flc25pX2djbV9lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4gX2Flc25pX2djbV9lbmNyeXB0CisKKy5wMmFsaWduCTUKK19hZXNuaV9nY21fZW5jcnlwdDoKKworCXhvcnEJJXIxMCwlcjEwCisKKworCisKKwljbXBxCSQyODgsJXJkeAorCWpiCUwkZ2NtX2VuY19hYm9ydAorCisJbGVhcQkoJXJzcCksJXJheAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJdnplcm91cHBlcgorCisJdm1vdmRxdQkoJXI4KSwleG1tMQorCWFkZHEJJC0xMjgsJXJzcAorCW1vdmwJMTIoJXI4KSwlZWJ4CisJbGVhcQlMJGJzd2FwX21hc2soJXJpcCksJXIxMQorCWxlYXEJLTEyOCglcmN4KSwlcjE0CisJbW92cQkkMHhmODAsJXIxNQorCWxlYXEJMTI4KCVyY3gpLCVyY3gKKwl2bW92ZHF1CSglcjExKSwleG1tMAorCWFuZHEJJC0xMjgsJXJzcAorCW1vdmwJMjQwLTEyOCglcmN4KSwlZWJwCisKKwlhbmRxCSVyMTUsJXIxNAorCWFuZHEJJXJzcCwlcjE1CisJc3VicQklcjE0LCVyMTUKKwlqYwlMJGVuY19ub19rZXlfYWxpYXNpbmcKKwljbXBxCSQ3NjgsJXIxNQorCWpuYwlMJGVuY19ub19rZXlfYWxpYXNpbmcKKwlzdWJxCSVyMTUsJXJzcAorTCRlbmNfbm9fa2V5X2FsaWFzaW5nOgorCisJbGVhcQkoJXJzaSksJXIxNAorCisKKworCisKKworCisKKwlsZWFxCS0xOTIoJXJzaSwlcmR4LDEpLCVyMTUKKworCXNocnEJJDQsJXJkeAorCisJY2FsbAlfYWVzbmlfY3RyMzJfNngKKwl2cHNodWZiCSV4bW0wLCV4bW05LCV4bW04CisJdnBzaHVmYgkleG1tMCwleG1tMTAsJXhtbTIKKwl2bW92ZHF1CSV4bW04LDExMiglcnNwKQorCXZwc2h1ZmIJJXhtbTAsJXhtbTExLCV4bW00CisJdm1vdmRxdQkleG1tMiw5NiglcnNwKQorCXZwc2h1ZmIJJXhtbTAsJXhtbTEyLCV4bW01CisJdm1vdmRxdQkleG1tNCw4MCglcnNwKQorCXZwc2h1ZmIJJXhtbTAsJXhtbTEzLCV4bW02CisJdm1vdmRxdQkleG1tNSw2NCglcnNwKQorCXZwc2h1ZmIJJXhtbTAsJXhtbTE0LCV4bW03CisJdm1vdmRxdQkleG1tNiw0OCglcnNwKQorCisJY2FsbAlfYWVzbmlfY3RyMzJfNngKKworCXZtb3ZkcXUJKCVyOSksJXhtbTgKKwlsZWFxCTMyKzMyKCVyOSksJXI5CisJc3VicQkkMTIsJXJkeAorCW1vdnEJJDE5MiwlcjEwCisJdnBzaHVmYgkleG1tMCwleG1tOCwleG1tOAorCisJY2FsbAlfYWVzbmlfY3RyMzJfZ2hhc2hfNngKKwl2bW92ZHF1CTMyKCVyc3ApLCV4bW03CisJdm1vdmRxdQkoJXIxMSksJXhtbTAKKwl2bW92ZHF1CTAtMzIoJXI5KSwleG1tMworCXZwdW5wY2tocWRxCSV4bW03LCV4bW03LCV4bW0xCisJdm1vdmRxdQkzMi0zMiglcjkpLCV4bW0xNQorCXZtb3Z1cHMJJXhtbTksLTk2KCVyc2kpCisJdnBzaHVmYgkleG1tMCwleG1tOSwleG1tOQorCXZweG9yCSV4bW03LCV4bW0xLCV4bW0xCisJdm1vdnVwcwkleG1tMTAsLTgwKCVyc2kpCisJdnBzaHVmYgkleG1tMCwleG1tMTAsJXhtbTEwCisJdm1vdnVwcwkleG1tMTEsLTY0KCVyc2kpCisJdnBzaHVmYgkleG1tMCwleG1tMTEsJXhtbTExCisJdm1vdnVwcwkleG1tMTIsLTQ4KCVyc2kpCisJdnBzaHVmYgkleG1tMCwleG1tMTIsJXhtbTEyCisJdm1vdnVwcwkleG1tMTMsLTMyKCVyc2kpCisJdnBzaHVmYgkleG1tMCwleG1tMTMsJXhtbTEzCisJdm1vdnVwcwkleG1tMTQsLTE2KCVyc2kpCisJdnBzaHVmYgkleG1tMCwleG1tMTQsJXhtbTE0CisJdm1vdmRxdQkleG1tOSwxNiglcnNwKQorCXZtb3ZkcXUJNDgoJXJzcCksJXhtbTYKKwl2bW92ZHF1CTE2LTMyKCVyOSksJXhtbTAKKwl2cHVucGNraHFkcQkleG1tNiwleG1tNiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTMsJXhtbTcsJXhtbTUKKwl2cHhvcgkleG1tNiwleG1tMiwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTMsJXhtbTcsJXhtbTcKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xNSwleG1tMSwleG1tMQorCisJdm1vdmRxdQk2NCglcnNwKSwleG1tOQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTAsJXhtbTYsJXhtbTQKKwl2bW92ZHF1CTQ4LTMyKCVyOSksJXhtbTMKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCXZwdW5wY2tocWRxCSV4bW05LCV4bW05LCV4bW01CisJdnBjbG11bHFkcQkkMHgxMSwleG1tMCwleG1tNiwleG1tNgorCXZweG9yCSV4bW05LCV4bW01LCV4bW01CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xNSwleG1tMiwleG1tMgorCXZtb3ZkcXUJODAtMzIoJXI5KSwleG1tMTUKKwl2cHhvcgkleG1tMSwleG1tMiwleG1tMgorCisJdm1vdmRxdQk4MCglcnNwKSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTMsJXhtbTksJXhtbTcKKwl2bW92ZHF1CTY0LTMyKCVyOSksJXhtbTAKKwl2cHhvcgkleG1tNCwleG1tNywleG1tNworCXZwdW5wY2tocWRxCSV4bW0xLCV4bW0xLCV4bW00CisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tOSwleG1tOQorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTYsJXhtbTksJXhtbTkKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xNSwleG1tNSwleG1tNQorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisKKwl2bW92ZHF1CTk2KCVyc3ApLCV4bW0yCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMCwleG1tMSwleG1tNgorCXZtb3ZkcXUJOTYtMzIoJXI5KSwleG1tMworCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTIsJXhtbTIsJXhtbTcKKwl2cGNsbXVscWRxCSQweDExLCV4bW0wLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTcsJXhtbTcKKwl2cHhvcgkleG1tOSwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTE1LCV4bW00LCV4bW00CisJdm1vdmRxdQkxMjgtMzIoJXI5KSwleG1tMTUKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCisJdnB4b3IJMTEyKCVyc3ApLCV4bW04LCV4bW04CisJdnBjbG11bHFkcQkkMHgwMCwleG1tMywleG1tMiwleG1tNQorCXZtb3ZkcXUJMTEyLTMyKCVyOSksJXhtbTAKKwl2cHVucGNraHFkcQkleG1tOCwleG1tOCwleG1tOQorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tMiwleG1tMgorCXZweG9yCSV4bW04LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTEsJXhtbTIsJXhtbTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xNSwleG1tNywleG1tNworCXZweG9yCSV4bW00LCV4bW03LCV4bW00CisKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0wLCV4bW04LCV4bW02CisJdm1vdmRxdQkwLTMyKCVyOSksJXhtbTMKKwl2cHVucGNraHFkcQkleG1tMTQsJXhtbTE0LCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMCwleG1tOCwleG1tOAorCXZweG9yCSV4bW0xNCwleG1tMSwleG1tMQorCXZweG9yCSV4bW01LCV4bW02LCV4bW01CisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTUsJXhtbTksJXhtbTkKKwl2bW92ZHF1CTMyLTMyKCVyOSksJXhtbTE1CisJdnB4b3IJJXhtbTIsJXhtbTgsJXhtbTcKKwl2cHhvcgkleG1tNCwleG1tOSwleG1tNgorCisJdm1vdmRxdQkxNi0zMiglcjkpLCV4bW0wCisJdnB4b3IJJXhtbTUsJXhtbTcsJXhtbTkKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0zLCV4bW0xNCwleG1tNAorCXZweG9yCSV4bW05LCV4bW02LCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTEzLCV4bW0xMywleG1tMgorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTMsJXhtbTE0LCV4bW0xNAorCXZweG9yCSV4bW0xMywleG1tMiwleG1tMgorCXZwc2xsZHEJJDgsJXhtbTYsJXhtbTkKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xNSwleG1tMSwleG1tMQorCXZweG9yCSV4bW05LCV4bW01LCV4bW04CisJdnBzcmxkcQkkOCwleG1tNiwleG1tNgorCXZweG9yCSV4bW02LCV4bW03LCV4bW03CisKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0wLCV4bW0xMywleG1tNQorCXZtb3ZkcXUJNDgtMzIoJXI5KSwleG1tMworCXZweG9yCSV4bW00LCV4bW01LCV4bW01CisJdnB1bnBja2hxZHEJJXhtbTEyLCV4bW0xMiwleG1tOQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTAsJXhtbTEzLCV4bW0xMworCXZweG9yCSV4bW0xMiwleG1tOSwleG1tOQorCXZweG9yCSV4bW0xNCwleG1tMTMsJXhtbTEzCisJdnBhbGlnbnIJJDgsJXhtbTgsJXhtbTgsJXhtbTE0CisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTUsJXhtbTIsJXhtbTIKKwl2bW92ZHF1CTgwLTMyKCVyOSksJXhtbTE1CisJdnB4b3IJJXhtbTEsJXhtbTIsJXhtbTIKKworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTMsJXhtbTEyLCV4bW00CisJdm1vdmRxdQk2NC0zMiglcjkpLCV4bW0wCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwl2cHVucGNraHFkcQkleG1tMTEsJXhtbTExLCV4bW0xCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMywleG1tMTIsJXhtbTEyCisJdnB4b3IJJXhtbTExLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTEzLCV4bW0xMiwleG1tMTIKKwl2eG9ycHMJMTYoJXJzcCksJXhtbTcsJXhtbTcKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xNSwleG1tOSwleG1tOQorCXZweG9yCSV4bW0yLCV4bW05LCV4bW05CisKKwl2cGNsbXVscWRxCSQweDEwLDE2KCVyMTEpLCV4bW04LCV4bW04CisJdnhvcnBzCSV4bW0xNCwleG1tOCwleG1tOAorCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMCwleG1tMTEsJXhtbTUKKwl2bW92ZHF1CTk2LTMyKCVyOSksJXhtbTMKKwl2cHhvcgkleG1tNCwleG1tNSwleG1tNQorCXZwdW5wY2tocWRxCSV4bW0xMCwleG1tMTAsJXhtbTIKKwl2cGNsbXVscWRxCSQweDExLCV4bW0wLCV4bW0xMSwleG1tMTEKKwl2cHhvcgkleG1tMTAsJXhtbTIsJXhtbTIKKwl2cGFsaWducgkkOCwleG1tOCwleG1tOCwleG1tMTQKKwl2cHhvcgkleG1tMTIsJXhtbTExLCV4bW0xMQorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTE1LCV4bW0xLCV4bW0xCisJdm1vdmRxdQkxMjgtMzIoJXI5KSwleG1tMTUKKwl2cHhvcgkleG1tOSwleG1tMSwleG1tMQorCisJdnhvcnBzCSV4bW03LCV4bW0xNCwleG1tMTQKKwl2cGNsbXVscWRxCSQweDEwLDE2KCVyMTEpLCV4bW04LCV4bW04CisJdnhvcnBzCSV4bW0xNCwleG1tOCwleG1tOAorCisJdnBjbG11bHFkcQkkMHgwMCwleG1tMywleG1tMTAsJXhtbTQKKwl2bW92ZHF1CTExMi0zMiglcjkpLCV4bW0wCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwl2cHVucGNraHFkcQkleG1tOCwleG1tOCwleG1tOQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTMsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW04LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTExLCV4bW0xMCwleG1tMTAKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0xNSwleG1tMiwleG1tMgorCXZweG9yCSV4bW0xLCV4bW0yLCV4bW0yCisKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0wLCV4bW04LCV4bW01CisJdnBjbG11bHFkcQkkMHgxMSwleG1tMCwleG1tOCwleG1tNworCXZweG9yCSV4bW00LCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgxMCwleG1tMTUsJXhtbTksJXhtbTYKKwl2cHhvcgkleG1tMTAsJXhtbTcsJXhtbTcKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCisJdnB4b3IJJXhtbTUsJXhtbTcsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tNiwleG1tNgorCXZwc2xsZHEJJDgsJXhtbTYsJXhtbTEKKwl2bW92ZHF1CTE2KCVyMTEpLCV4bW0zCisJdnBzcmxkcQkkOCwleG1tNiwleG1tNgorCXZweG9yCSV4bW0xLCV4bW01LCV4bW04CisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTcKKworCXZwYWxpZ25yCSQ4LCV4bW04LCV4bW04LCV4bW0yCisJdnBjbG11bHFkcQkkMHgxMCwleG1tMywleG1tOCwleG1tOAorCXZweG9yCSV4bW0yLCV4bW04LCV4bW04CisKKwl2cGFsaWducgkkOCwleG1tOCwleG1tOCwleG1tMgorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTMsJXhtbTgsJXhtbTgKKwl2cHhvcgkleG1tNywleG1tMiwleG1tMgorCXZweG9yCSV4bW0yLCV4bW04LCV4bW04CisJdnBzaHVmYgkoJXIxMSksJXhtbTgsJXhtbTgKKwl2bW92ZHF1CSV4bW04LC02NCglcjkpCisKKwl2emVyb3VwcGVyCisJbW92cQktNDgoJXJheCksJXIxNQorCisJbW92cQktNDAoJXJheCksJXIxNAorCisJbW92cQktMzIoJXJheCksJXIxMworCisJbW92cQktMjQoJXJheCksJXIxMgorCisJbW92cQktMTYoJXJheCksJXJicAorCisJbW92cQktOCglcmF4KSwlcmJ4CisKKwlsZWFxCSglcmF4KSwlcnNwCisKK0wkZ2NtX2VuY19hYm9ydDoKKwltb3ZxCSVyMTAsJXJheAorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTYKK0wkYnN3YXBfbWFzazoKKy5ieXRlCTE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDAKK0wkcG9seToKKy5ieXRlCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB4YzIKK0wkb25lX21zYjoKKy5ieXRlCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEKK0wkdHdvX2xzYjoKKy5ieXRlCTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKK0wkb25lX2xzYjoKKy5ieXRlCTEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKy5ieXRlCTY1LDY5LDgzLDQ1LDc4LDczLDMyLDcxLDY3LDc3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NCw1Miw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisucDJhbGlnbgk2CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmE4Y2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Nl82NC5TCkBAIC0wLDAgKzEsNDQ0MCBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKworLmdsb2JsCV9hZXNfaHdfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuIF9hZXNfaHdfZW5jcnlwdAorCisucDJhbGlnbgk0CitfYWVzX2h3X2VuY3J5cHQ6CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdmwJMjQwKCVyZHgpLCVlYXgKKwltb3Z1cHMJKCVyZHgpLCV4bW0wCisJbW92dXBzCTE2KCVyZHgpLCV4bW0xCisJbGVhcQkzMiglcmR4KSwlcmR4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wkb29wX2VuYzFfMToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmR4KSwleG1tMQorCWxlYXEJMTYoJXJkeCksJXJkeAorCWpueglMJG9vcF9lbmMxXzEKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzX2h3X2RlY3J5cHQKKy5wcml2YXRlX2V4dGVybiBfYWVzX2h3X2RlY3J5cHQKKworLnAyYWxpZ24JNAorX2Flc19od19kZWNyeXB0OgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwltb3ZsCTI0MCglcmR4KSwlZWF4CisJbW92dXBzCSglcmR4KSwleG1tMAorCW1vdnVwcwkxNiglcmR4KSwleG1tMQorCWxlYXEJMzIoJXJkeCksJXJkeAorCXhvcnBzCSV4bW0wLCV4bW0yCitMJG9vcF9kZWMxXzI6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXJkeCksJXhtbTEKKwlsZWFxCTE2KCVyZHgpLCVyZHgKKwlqbnoJTCRvb3BfZGVjMV8yCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0CitfYWVzbmlfZW5jcnlwdDI6CisJbW92dXBzCSglcmN4KSwleG1tMAorCXNobGwJJDQsJWVheAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJeG9ycHMJJXhtbTAsJXhtbTMKKwltb3Z1cHMJMzIoJXJjeCksJXhtbTAKKwlsZWFxCTMyKCVyY3gsJXJheCwxKSwlcmN4CisJbmVncQklcmF4CisJYWRkcQkkMTYsJXJheAorCitMJGVuY19sb29wMjoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJTCRlbmNfbG9vcDIKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTYKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0CitfYWVzbmlfZGVjcnlwdDI6CisJbW92dXBzCSglcmN4KSwleG1tMAorCXNobGwJJDQsJWVheAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJeG9ycHMJJXhtbTAsJXhtbTMKKwltb3Z1cHMJMzIoJXJjeCksJXhtbTAKKwlsZWFxCTMyKCVyY3gsJXJheCwxKSwlcmN4CisJbmVncQklcmF4CisJYWRkcQkkMTYsJXJheAorCitMJGRlY19sb29wMjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJTCRkZWNfbG9vcDIKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMTYKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0CitfYWVzbmlfZW5jcnlwdDM6CisJbW92dXBzCSglcmN4KSwleG1tMAorCXNobGwJJDQsJWVheAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJeG9ycHMJJXhtbTAsJXhtbTMKKwl4b3JwcwkleG1tMCwleG1tNAorCW1vdnVwcwkzMiglcmN4KSwleG1tMAorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKwlhZGRxCSQxNiwlcmF4CisKK0wkZW5jX2xvb3AzOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CUwkZW5jX2xvb3AzCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMjQKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0CitfYWVzbmlfZGVjcnlwdDM6CisJbW92dXBzCSglcmN4KSwleG1tMAorCXNobGwJJDQsJWVheAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJeG9ycHMJJXhtbTAsJXhtbTMKKwl4b3JwcwkleG1tMCwleG1tNAorCW1vdnVwcwkzMiglcmN4KSwleG1tMAorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKwlhZGRxCSQxNiwlcmF4CisKK0wkZGVjX2xvb3AzOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CUwkZGVjX2xvb3AzCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMjQKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk0CitfYWVzbmlfZW5jcnlwdDQ6CisJbW92dXBzCSglcmN4KSwleG1tMAorCXNobGwJJDQsJWVheAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW0yCisJeG9ycHMJJXhtbTAsJXhtbTMKKwl4b3JwcwkleG1tMCwleG1tNAorCXhvcnBzCSV4bW0wLCV4bW01CisJbW92dXBzCTMyKCVyY3gpLCV4bW0wCisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorCW5lZ3EJJXJheAorLmJ5dGUJMHgwZiwweDFmLDB4MDAKKwlhZGRxCSQxNiwlcmF4CisKK0wkZW5jX2xvb3A0OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJTCRlbmNfbG9vcDQKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjMyCisJLmJ5dGUJMHhmMywweGMzCisKKworLnAyYWxpZ24JNAorX2Flc25pX2RlY3J5cHQ0OgorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwlzaGxsCSQ0LCVlYXgKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMgorCXhvcnBzCSV4bW0wLCV4bW0zCisJeG9ycHMJJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tMCwleG1tNQorCW1vdnVwcwkzMiglcmN4KSwleG1tMAorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKy5ieXRlCTB4MGYsMHgxZiwweDAwCisJYWRkcQkkMTYsJXJheAorCitMJGRlY19sb29wNDoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CUwkZGVjX2xvb3A0CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIzMgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTQKK19hZXNuaV9lbmNyeXB0NjoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlsZWFxCTMyKCVyY3gsJXJheCwxKSwlcmN4CisJbmVncQklcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCXB4b3IJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorCXB4b3IJJXhtbTAsJXhtbTcKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMAorCWFkZHEJJDE2LCVyYXgKKwlqbXAJTCRlbmNfbG9vcDZfZW50ZXIKKy5wMmFsaWduCTQKK0wkZW5jX2xvb3A2OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorTCRlbmNfbG9vcDZfZW50ZXI6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJTCRlbmNfbG9vcDYKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDI0OAorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTQKK19hZXNuaV9kZWNyeXB0NjoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlsZWFxCTMyKCVyY3gsJXJheCwxKSwlcmN4CisJbmVncQklcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworCXB4b3IJJXhtbTAsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorCXB4b3IJJXhtbTAsJXhtbTcKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMAorCWFkZHEJJDE2LCVyYXgKKwlqbXAJTCRkZWNfbG9vcDZfZW50ZXIKKy5wMmFsaWduCTQKK0wkZGVjX2xvb3A2OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorTCRkZWNfbG9vcDZfZW50ZXI6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJTCRkZWNfbG9vcDYKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDI0OAorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTQKK19hZXNuaV9lbmNyeXB0ODoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMCwleG1tNgorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJcHhvcgkleG1tMCwleG1tNworCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcHhvcgkleG1tMCwleG1tOQorCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0wCisJYWRkcQkkMTYsJXJheAorCWptcAlMJGVuY19sb29wOF9pbm5lcgorLnAyYWxpZ24JNAorTCRlbmNfbG9vcDg6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKK0wkZW5jX2xvb3A4X2lubmVyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMQorTCRlbmNfbG9vcDhfZW50ZXI6CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwyMDAKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpueglMJGVuY19sb29wOAorCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjEsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIxLDIwMAorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTQKK19hZXNuaV9kZWNyeXB0ODoKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJc2hsbAkkNCwlZWF4CisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTQKKwlweG9yCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMCwleG1tNgorCWxlYXEJMzIoJXJjeCwlcmF4LDEpLCVyY3gKKwluZWdxCSVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgkleG1tMCwleG1tNworCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisJcHhvcgkleG1tMCwleG1tOQorCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0wCisJYWRkcQkkMTYsJXJheAorCWptcAlMJGRlY19sb29wOF9pbm5lcgorLnAyYWxpZ24JNAorTCRkZWNfbG9vcDg6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKK0wkZGVjX2xvb3A4X2lubmVyOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMQorTCRkZWNfbG9vcDhfZW50ZXI6CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpueglMJGRlY19sb29wOAorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjMsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIzLDIwMAorCS5ieXRlCTB4ZjMsMHhjMworCisuZ2xvYmwJX2Flc19od19lY2JfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuIF9hZXNfaHdfZWNiX2VuY3J5cHQKKworLnAyYWxpZ24JNAorX2Flc19od19lY2JfZW5jcnlwdDoKKwlhbmRxCSQtMTYsJXJkeAorCWp6CUwkZWNiX3JldAorCisJbW92bAkyNDAoJXJjeCksJWVheAorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3ZxCSVyY3gsJXIxMQorCW1vdmwJJWVheCwlcjEwZAorCXRlc3RsCSVyOGQsJXI4ZAorCWp6CUwkZWNiX2RlY3J5cHQKKworCWNtcHEJJDB4ODAsJXJkeAorCWpiCUwkZWNiX2VuY190YWlsCisKKwltb3ZkcXUJKCVyZGkpLCV4bW0yCisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJbW92ZHF1CTMyKCVyZGkpLCV4bW00CisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJbW92ZHF1CTY0KCVyZGkpLCV4bW02CisJbW92ZHF1CTgwKCVyZGkpLCV4bW03CisJbW92ZHF1CTk2KCVyZGkpLCV4bW04CisJbW92ZHF1CTExMiglcmRpKSwleG1tOQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwlzdWJxCSQweDgwLCVyZHgKKwlqbXAJTCRlY2JfZW5jX2xvb3A4X2VudGVyCisucDJhbGlnbgk0CitMJGVjYl9lbmNfbG9vcDg6CisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnEJJXIxMSwlcmN4CisJbW92ZHF1CSglcmRpKSwleG1tMgorCW1vdmwJJXIxMGQsJWVheAorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdmRxdQkxNiglcmRpKSwleG1tMworCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCW1vdmRxdQkzMiglcmRpKSwleG1tNAorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCW1vdmRxdQk0OCglcmRpKSwleG1tNQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCW1vdmRxdQk2NCglcmRpKSwleG1tNgorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCW1vdmRxdQk4MCglcmRpKSwleG1tNworCW1vdnVwcwkleG1tOCw5NiglcnNpKQorCW1vdmRxdQk5NiglcmRpKSwleG1tOAorCW1vdnVwcwkleG1tOSwxMTIoJXJzaSkKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJbW92ZHF1CTExMiglcmRpKSwleG1tOQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKK0wkZWNiX2VuY19sb29wOF9lbnRlcjoKKworCWNhbGwJX2Flc25pX2VuY3J5cHQ4CisKKwlzdWJxCSQweDgwLCVyZHgKKwlqbmMJTCRlY2JfZW5jX2xvb3A4CisKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92cQklcjExLCVyY3gKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3ZsCSVyMTBkLCVlYXgKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwltb3Z1cHMJJXhtbTgsOTYoJXJzaSkKKwltb3Z1cHMJJXhtbTksMTEyKCVyc2kpCisJbGVhcQkxMjgoJXJzaSksJXJzaQorCWFkZHEJJDB4ODAsJXJkeAorCWp6CUwkZWNiX3JldAorCitMJGVjYl9lbmNfdGFpbDoKKwltb3Z1cHMJKCVyZGkpLCV4bW0yCisJY21wcQkkMHgyMCwlcmR4CisJamIJTCRlY2JfZW5jX29uZQorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCWplCUwkZWNiX2VuY190d28KKwltb3Z1cHMJMzIoJXJkaSksJXhtbTQKKwljbXBxCSQweDQwLCVyZHgKKwlqYglMJGVjYl9lbmNfdGhyZWUKKwltb3Z1cHMJNDgoJXJkaSksJXhtbTUKKwlqZQlMJGVjYl9lbmNfZm91cgorCW1vdnVwcwk2NCglcmRpKSwleG1tNgorCWNtcHEJJDB4NjAsJXJkeAorCWpiCUwkZWNiX2VuY19maXZlCisJbW92dXBzCTgwKCVyZGkpLCV4bW03CisJamUJTCRlY2JfZW5jX3NpeAorCW1vdmRxdQk5NiglcmRpKSwleG1tOAorCXhvcnBzCSV4bW05LCV4bW05CisJY2FsbAlfYWVzbmlfZW5jcnlwdDgKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJbW92dXBzCSV4bW04LDk2KCVyc2kpCisJam1wCUwkZWNiX3JldAorLnAyYWxpZ24JNAorTCRlY2JfZW5jX29uZToKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wkb29wX2VuYzFfMzoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpueglMJG9vcF9lbmMxXzMKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92dXBzCSV4bW0yLCglcnNpKQorCWptcAlMJGVjYl9yZXQKKy5wMmFsaWduCTQKK0wkZWNiX2VuY190d286CisJY2FsbAlfYWVzbmlfZW5jcnlwdDIKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJam1wCUwkZWNiX3JldAorLnAyYWxpZ24JNAorTCRlY2JfZW5jX3RocmVlOgorCWNhbGwJX2Flc25pX2VuY3J5cHQzCisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCWptcAlMJGVjYl9yZXQKKy5wMmFsaWduCTQKK0wkZWNiX2VuY19mb3VyOgorCWNhbGwJX2Flc25pX2VuY3J5cHQ0CisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCWptcAlMJGVjYl9yZXQKKy5wMmFsaWduCTQKK0wkZWNiX2VuY19maXZlOgorCXhvcnBzCSV4bW03LCV4bW03CisJY2FsbAlfYWVzbmlfZW5jcnlwdDYKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJam1wCUwkZWNiX3JldAorLnAyYWxpZ24JNAorTCRlY2JfZW5jX3NpeDoKKwljYWxsCV9hZXNuaV9lbmNyeXB0NgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwlqbXAJTCRlY2JfcmV0CisKKy5wMmFsaWduCTQKK0wkZWNiX2RlY3J5cHQ6CisJY21wcQkkMHg4MCwlcmR4CisJamIJTCRlY2JfZGVjX3RhaWwKKworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTgKKwltb3ZkcXUJMTEyKCVyZGkpLCV4bW05CisJbGVhcQkxMjgoJXJkaSksJXJkaQorCXN1YnEJJDB4ODAsJXJkeAorCWptcAlMJGVjYl9kZWNfbG9vcDhfZW50ZXIKKy5wMmFsaWduCTQKK0wkZWNiX2RlY19sb29wODoKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92cQklcjExLCVyY3gKKwltb3ZkcXUJKCVyZGkpLCV4bW0yCisJbW92bAklcjEwZCwlZWF4CisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92ZHF1CTMyKCVyZGkpLCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJbW92ZHF1CTY0KCVyZGkpLCV4bW02CisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJbW92ZHF1CTgwKCVyZGkpLCV4bW03CisJbW92dXBzCSV4bW04LDk2KCVyc2kpCisJbW92ZHF1CTk2KCVyZGkpLCV4bW04CisJbW92dXBzCSV4bW05LDExMiglcnNpKQorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwltb3ZkcXUJMTEyKCVyZGkpLCV4bW05CisJbGVhcQkxMjgoJXJkaSksJXJkaQorTCRlY2JfZGVjX2xvb3A4X2VudGVyOgorCisJY2FsbAlfYWVzbmlfZGVjcnlwdDgKKworCW1vdnVwcwkoJXIxMSksJXhtbTAKKwlzdWJxCSQweDgwLCVyZHgKKwlqbmMJTCRlY2JfZGVjX2xvb3A4CisKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnEJJXIxMSwlcmN4CisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCW1vdmwJJXIxMGQsJWVheAorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwlweG9yCSV4bW01LCV4bW01CisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJcHhvcgkleG1tNiwleG1tNgorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCXB4b3IJJXhtbTcsJXhtbTcKKwltb3Z1cHMJJXhtbTgsOTYoJXJzaSkKKwlweG9yCSV4bW04LCV4bW04CisJbW92dXBzCSV4bW05LDExMiglcnNpKQorCXB4b3IJJXhtbTksJXhtbTkKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJYWRkcQkkMHg4MCwlcmR4CisJanoJTCRlY2JfcmV0CisKK0wkZWNiX2RlY190YWlsOgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwljbXBxCSQweDIwLCVyZHgKKwlqYglMJGVjYl9kZWNfb25lCisJbW92dXBzCTE2KCVyZGkpLCV4bW0zCisJamUJTCRlY2JfZGVjX3R3bworCW1vdnVwcwkzMiglcmRpKSwleG1tNAorCWNtcHEJJDB4NDAsJXJkeAorCWpiCUwkZWNiX2RlY190aHJlZQorCW1vdnVwcwk0OCglcmRpKSwleG1tNQorCWplCUwkZWNiX2RlY19mb3VyCisJbW92dXBzCTY0KCVyZGkpLCV4bW02CisJY21wcQkkMHg2MCwlcmR4CisJamIJTCRlY2JfZGVjX2ZpdmUKKwltb3Z1cHMJODAoJXJkaSksJXhtbTcKKwlqZQlMJGVjYl9kZWNfc2l4CisJbW92dXBzCTk2KCVyZGkpLCV4bW04CisJbW92dXBzCSglcmN4KSwleG1tMAorCXhvcnBzCSV4bW05LCV4bW05CisJY2FsbAlfYWVzbmlfZGVjcnlwdDgKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tNQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCXB4b3IJJXhtbTYsJXhtbTYKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwlweG9yCSV4bW03LCV4bW03CisJbW92dXBzCSV4bW04LDk2KCVyc2kpCisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKKwlqbXAJTCRlY2JfcmV0CisucDJhbGlnbgk0CitMJGVjYl9kZWNfb25lOgorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwl4b3JwcwkleG1tMCwleG1tMgorTCRvb3BfZGVjMV80OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CUwkb29wX2RlYzFfNAorLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCWptcAlMJGVjYl9yZXQKKy5wMmFsaWduCTQKK0wkZWNiX2RlY190d286CisJY2FsbAlfYWVzbmlfZGVjcnlwdDIKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwlqbXAJTCRlY2JfcmV0CisucDJhbGlnbgk0CitMJGVjYl9kZWNfdGhyZWU6CisJY2FsbAlfYWVzbmlfZGVjcnlwdDMKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJam1wCUwkZWNiX3JldAorLnAyYWxpZ24JNAorTCRlY2JfZGVjX2ZvdXI6CisJY2FsbAlfYWVzbmlfZGVjcnlwdDQKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tNQorCWptcAlMJGVjYl9yZXQKKy5wMmFsaWduCTQKK0wkZWNiX2RlY19maXZlOgorCXhvcnBzCSV4bW03LCV4bW03CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tNQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJam1wCUwkZWNiX3JldAorLnAyYWxpZ24JNAorTCRlY2JfZGVjX3NpeDoKKwljYWxsCV9hZXNuaV9kZWNyeXB0NgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwlweG9yCSV4bW0yLCV4bW0yCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwlweG9yCSV4bW01LCV4bW01CisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJcHhvcgkleG1tNiwleG1tNgorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCXB4b3IJJXhtbTcsJXhtbTcKKworTCRlY2JfcmV0OgorCXhvcnBzCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCS5ieXRlCTB4ZjMsMHhjMworCisuZ2xvYmwJX2Flc19od19jY202NF9lbmNyeXB0X2Jsb2NrcworLnByaXZhdGVfZXh0ZXJuIF9hZXNfaHdfY2NtNjRfZW5jcnlwdF9ibG9ja3MKKworLnAyYWxpZ24JNAorX2Flc19od19jY202NF9lbmNyeXB0X2Jsb2NrczoKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJbW92ZHF1CSglcjgpLCV4bW02CisJbW92ZHFhCUwkaW5jcmVtZW50NjQoJXJpcCksJXhtbTkKKwltb3ZkcWEJTCRic3dhcF9tYXNrKCVyaXApLCV4bW03CisKKwlzaGxsCSQ0LCVlYXgKKwltb3ZsCSQxNiwlcjEwZAorCWxlYXEJMCglcmN4KSwlcjExCisJbW92ZHF1CSglcjkpLCV4bW0zCisJbW92ZHFhCSV4bW02LCV4bW0yCisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ3CisJc3VicQklcmF4LCVyMTAKKwlqbXAJTCRjY202NF9lbmNfb3V0ZXIKKy5wMmFsaWduCTQKK0wkY2NtNjRfZW5jX291dGVyOgorCW1vdnVwcwkoJXIxMSksJXhtbTAKKwltb3ZxCSVyMTAsJXJheAorCW1vdnVwcwkoJXJkaSksJXhtbTgKKworCXhvcnBzCSV4bW0wLCV4bW0yCisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJeG9ycHMJJXhtbTgsJXhtbTAKKwl4b3JwcwkleG1tMCwleG1tMworCW1vdnVwcwkzMiglcjExKSwleG1tMAorCitMJGNjbTY0X2VuYzJfbG9vcDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJTCRjY202NF9lbmMyX2xvb3AKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCXBhZGRxCSV4bW05LCV4bW02CisJZGVjcQklcmR4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTYKKworCWxlYXEJMTYoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0yLCV4bW04CisJbW92ZHFhCSV4bW02LCV4bW0yCisJbW92dXBzCSV4bW04LCglcnNpKQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE1CisJbGVhcQkxNiglcnNpKSwlcnNpCisJam56CUwkY2NtNjRfZW5jX291dGVyCisKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3Z1cHMJJXhtbTMsKCVyOSkKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTYsJXhtbTYKKwkuYnl0ZQkweGYzLDB4YzMKKworLmdsb2JsCV9hZXNfaHdfY2NtNjRfZGVjcnlwdF9ibG9ja3MKKy5wcml2YXRlX2V4dGVybiBfYWVzX2h3X2NjbTY0X2RlY3J5cHRfYmxvY2tzCisKKy5wMmFsaWduCTQKK19hZXNfaHdfY2NtNjRfZGVjcnlwdF9ibG9ja3M6CisJbW92bAkyNDAoJXJjeCksJWVheAorCW1vdnVwcwkoJXI4KSwleG1tNgorCW1vdmRxdQkoJXI5KSwleG1tMworCW1vdmRxYQlMJGluY3JlbWVudDY0KCVyaXApLCV4bW05CisJbW92ZHFhCUwkYnN3YXBfbWFzayglcmlwKSwleG1tNworCisJbW92YXBzCSV4bW02LCV4bW0yCisJbW92bAklZWF4LCVyMTBkCisJbW92cQklcmN4LCVyMTEKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NworCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwl4b3JwcwkleG1tMCwleG1tMgorTCRvb3BfZW5jMV81OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CUwkb29wX2VuYzFfNQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwlzaGxsCSQ0LCVyMTBkCisJbW92bAkkMTYsJWVheAorCW1vdnVwcwkoJXJkaSksJXhtbTgKKwlwYWRkcQkleG1tOSwleG1tNgorCWxlYXEJMTYoJXJkaSksJXJkaQorCXN1YnEJJXIxMCwlcmF4CisJbGVhcQkzMiglcjExLCVyMTAsMSksJXJjeAorCW1vdnEJJXJheCwlcjEwCisJam1wCUwkY2NtNjRfZGVjX291dGVyCisucDJhbGlnbgk0CitMJGNjbTY0X2RlY19vdXRlcjoKKwl4b3JwcwkleG1tMiwleG1tOAorCW1vdmRxYQkleG1tNiwleG1tMgorCW1vdnVwcwkleG1tOCwoJXJzaSkKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorCisJc3VicQkkMSwlcmR4CisJanoJTCRjY202NF9kZWNfYnJlYWsKKworCW1vdnVwcwkoJXIxMSksJXhtbTAKKwltb3ZxCSVyMTAsJXJheAorCW1vdnVwcwkxNiglcjExKSwleG1tMQorCXhvcnBzCSV4bW0wLCV4bW04CisJeG9ycHMJJXhtbTAsJXhtbTIKKwl4b3JwcwkleG1tOCwleG1tMworCW1vdnVwcwkzMiglcjExKSwleG1tMAorCWptcAlMJGNjbTY0X2RlYzJfbG9vcAorLnAyYWxpZ24JNAorTCRjY202NF9kZWMyX2xvb3A6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CUwkY2NtNjRfZGVjMl9sb29wCisJbW92dXBzCSglcmRpKSwleG1tOAorCXBhZGRxCSV4bW05LCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNgorCWxlYXEJMTYoJXJkaSksJXJkaQorCWptcAlMJGNjbTY0X2RlY19vdXRlcgorCisucDJhbGlnbgk0CitMJGNjbTY0X2RlY19icmVhazoKKworCW1vdmwJMjQwKCVyMTEpLCVlYXgKKwltb3Z1cHMJKCVyMTEpLCV4bW0wCisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJeG9ycHMJJXhtbTAsJXhtbTgKKwlsZWFxCTMyKCVyMTEpLCVyMTEKKwl4b3JwcwkleG1tOCwleG1tMworTCRvb3BfZW5jMV82OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyMTEpLCV4bW0xCisJbGVhcQkxNiglcjExKSwlcjExCisJam56CUwkb29wX2VuYzFfNgorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTcKKwlweG9yCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwltb3Z1cHMJJXhtbTMsKCVyOSkKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTYsJXhtbTYKKwkuYnl0ZQkweGYzLDB4YzMKKworLmdsb2JsCV9hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKy5wcml2YXRlX2V4dGVybiBfYWVzX2h3X2N0cjMyX2VuY3J5cHRfYmxvY2tzCisKKy5wMmFsaWduCTQKK19hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisKKwljbXBxCSQxLCVyZHgKKwlqbmUJTCRjdHIzMl9idWxrCisKKworCisJbW92dXBzCSglcjgpLCV4bW0yCisJbW92dXBzCSglcmRpKSwleG1tMworCW1vdmwJMjQwKCVyY3gpLCVlZHgKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wkb29wX2VuYzFfNzoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWR4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpueglMJG9vcF9lbmMxXzcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwl4b3JwcwkleG1tMywleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJeG9ycHMJJXhtbTIsJXhtbTIKKwlqbXAJTCRjdHIzMl9lcGlsb2d1ZQorCisucDJhbGlnbgk0CitMJGN0cjMyX2J1bGs6CisJbGVhcQkoJXJzcCksJXIxMQorCisJcHVzaHEJJXJicAorCisJc3VicQkkMTI4LCVyc3AKKwlhbmRxCSQtMTYsJXJzcAorCisKKworCisJbW92ZHF1CSglcjgpLCV4bW0yCisJbW92ZHF1CSglcmN4KSwleG1tMAorCW1vdmwJMTIoJXI4KSwlcjhkCisJcHhvcgkleG1tMCwleG1tMgorCW1vdmwJMTIoJXJjeCksJWVicAorCW1vdmRxYQkleG1tMiwwKCVyc3ApCisJYnN3YXBsCSVyOGQKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwltb3ZkcWEJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTIsJXhtbTUKKwltb3ZkcWEJJXhtbTIsNjQoJXJzcCkKKwltb3ZkcWEJJXhtbTIsODAoJXJzcCkKKwltb3ZkcWEJJXhtbTIsOTYoJXJzcCkKKwltb3ZxCSVyZHgsJXIxMAorCW1vdmRxYQkleG1tMiwxMTIoJXJzcCkKKworCWxlYXEJMSglcjgpLCVyYXgKKwlsZWFxCTIoJXI4KSwlcmR4CisJYnN3YXBsCSVlYXgKKwlic3dhcGwJJWVkeAorCXhvcmwJJWVicCwlZWF4CisJeG9ybAklZWJwLCVlZHgKKy5ieXRlCTEwMiwxNSw1OCwzNCwyMTYsMworCWxlYXEJMyglcjgpLCVyYXgKKwltb3ZkcWEJJXhtbTMsMTYoJXJzcCkKKy5ieXRlCTEwMiwxNSw1OCwzNCwyMjYsMworCWJzd2FwbAklZWF4CisJbW92cQklcjEwLCVyZHgKKwlsZWFxCTQoJXI4KSwlcjEwCisJbW92ZHFhCSV4bW00LDMyKCVyc3ApCisJeG9ybAklZWJwLCVlYXgKKwlic3dhcGwJJXIxMGQKKy5ieXRlCTEwMiwxNSw1OCwzNCwyMzIsMworCXhvcmwJJWVicCwlcjEwZAorCW1vdmRxYQkleG1tNSw0OCglcnNwKQorCWxlYXEJNSglcjgpLCVyOQorCW1vdmwJJXIxMGQsNjQrMTIoJXJzcCkKKwlic3dhcGwJJXI5ZAorCWxlYXEJNiglcjgpLCVyMTAKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJeG9ybAklZWJwLCVyOWQKKwlic3dhcGwJJXIxMGQKKwltb3ZsCSVyOWQsODArMTIoJXJzcCkKKwl4b3JsCSVlYnAsJXIxMGQKKwlsZWFxCTcoJXI4KSwlcjkKKwltb3ZsCSVyMTBkLDk2KzEyKCVyc3ApCisJYnN3YXBsCSVyOWQKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjEwCisJbW92bAk0KCVyMTApLCVyMTBkCisJeG9ybAklZWJwLCVyOWQKKwlhbmRsCSQ3MTMwMzE2OCwlcjEwZAorCW1vdmwJJXI5ZCwxMTIrMTIoJXJzcCkKKworCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCisJbW92ZHFhCTY0KCVyc3ApLCV4bW02CisJbW92ZHFhCTgwKCVyc3ApLCV4bW03CisKKwljbXBxCSQ4LCVyZHgKKwlqYglMJGN0cjMyX3RhaWwKKworCXN1YnEJJDYsJXJkeAorCWNtcGwJJDQxOTQzMDQsJXIxMGQKKwlqZQlMJGN0cjMyXzZ4CisKKwlsZWFxCTEyOCglcmN4KSwlcmN4CisJc3VicQkkMiwlcmR4CisJam1wCUwkY3RyMzJfbG9vcDgKKworLnAyYWxpZ24JNAorTCRjdHIzMl82eDoKKwlzaGxsCSQ0LCVlYXgKKwltb3ZsCSQ0OCwlcjEwZAorCWJzd2FwbAklZWJwCisJbGVhcQkzMiglcmN4LCVyYXgsMSksJXJjeAorCXN1YnEJJXJheCwlcjEwCisJam1wCUwkY3RyMzJfbG9vcDYKKworLnAyYWxpZ24JNAorTCRjdHIzMl9sb29wNjoKKwlhZGRsCSQ2LCVyOGQKKwltb3Z1cHMJLTQ4KCVyY3gsJXIxMCwxKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwltb3ZsCSVyOGQsJWVheAorCXhvcmwJJWVicCwlZWF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMHgwZiwweDM4LDB4ZjEsMHg0NCwweDI0LDEyCisJbGVhbAkxKCVyOCksJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKwl4b3JsCSVlYnAsJWVheAorLmJ5dGUJMHgwZiwweDM4LDB4ZjEsMHg0NCwweDI0LDI4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCWxlYWwJMiglcjgpLCVlYXgKKwl4b3JsCSVlYnAsJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCw0NAorCWxlYWwJMyglcjgpLCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCS0zMiglcmN4LCVyMTAsMSksJXhtbTEKKwl4b3JsCSVlYnAsJWVheAorCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMHgwZiwweDM4LDB4ZjEsMHg0NCwweDI0LDYwCisJbGVhbAk0KCVyOCksJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwl4b3JsCSVlYnAsJWVheAorLmJ5dGUJMHgwZiwweDM4LDB4ZjEsMHg0NCwweDI0LDc2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorCWxlYWwJNSglcjgpLCVlYXgKKwl4b3JsCSVlYnAsJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKy5ieXRlCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCw5MgorCW1vdnEJJXIxMCwlcmF4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKwltb3Z1cHMJLTE2KCVyY3gsJXIxMCwxKSwleG1tMAorCisJY2FsbAlMJGVuY19sb29wNgorCisJbW92ZHF1CSglcmRpKSwleG1tOAorCW1vdmRxdQkxNiglcmRpKSwleG1tOQorCW1vdmRxdQkzMiglcmRpKSwleG1tMTAKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTExCisJbW92ZHF1CTY0KCVyZGkpLCV4bW0xMgorCW1vdmRxdQk4MCglcmRpKSwleG1tMTMKKwlsZWFxCTk2KCVyZGkpLCVyZGkKKwltb3Z1cHMJLTY0KCVyY3gsJXIxMCwxKSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTgKKwltb3ZhcHMJMCglcnNwKSwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTkKKwltb3ZhcHMJMTYoJXJzcCksJXhtbTMKKwlweG9yCSV4bW00LCV4bW0xMAorCW1vdmFwcwkzMiglcnNwKSwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTExCisJbW92YXBzCTQ4KCVyc3ApLCV4bW01CisJcHhvcgkleG1tNiwleG1tMTIKKwltb3ZhcHMJNjQoJXJzcCksJXhtbTYKKwlweG9yCSV4bW03LCV4bW0xMworCW1vdmFwcwk4MCglcnNwKSwleG1tNworCW1vdmRxdQkleG1tOCwoJXJzaSkKKwltb3ZkcXUJJXhtbTksMTYoJXJzaSkKKwltb3ZkcXUJJXhtbTEwLDMyKCVyc2kpCisJbW92ZHF1CSV4bW0xMSw0OCglcnNpKQorCW1vdmRxdQkleG1tMTIsNjQoJXJzaSkKKwltb3ZkcXUJJXhtbTEzLDgwKCVyc2kpCisJbGVhcQk5NiglcnNpKSwlcnNpCisKKwlzdWJxCSQ2LCVyZHgKKwlqbmMJTCRjdHIzMl9sb29wNgorCisJYWRkcQkkNiwlcmR4CisJanoJTCRjdHIzMl9kb25lCisKKwlsZWFsCS00OCglcjEwKSwlZWF4CisJbGVhcQktODAoJXJjeCwlcjEwLDEpLCVyY3gKKwluZWdsCSVlYXgKKwlzaHJsCSQ0LCVlYXgKKwlqbXAJTCRjdHIzMl90YWlsCisKKy5wMmFsaWduCTUKK0wkY3RyMzJfbG9vcDg6CisJYWRkbAkkOCwlcjhkCisJbW92ZHFhCTk2KCVyc3ApLCV4bW04CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCW1vdmwJJXI4ZCwlcjlkCisJbW92ZHFhCTExMiglcnNwKSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlic3dhcGwJJXI5ZAorCW1vdnVwcwkzMi0xMjgoJXJjeCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJeG9ybAklZWJwLCVyOWQKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92bAklcjlkLDArMTIoJXJzcCkKKwlsZWFxCTEoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTQ4LTEyOCglcmN4KSwleG1tMQorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3ZsCSVyOWQsMTYrMTIoJXJzcCkKKwlsZWFxCTIoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTY0LTEyOCglcmN4KSwleG1tMAorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3ZsCSVyOWQsMzIrMTIoJXJzcCkKKwlsZWFxCTMoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTgwLTEyOCglcmN4KSwleG1tMQorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3ZsCSVyOWQsNDgrMTIoJXJzcCkKKwlsZWFxCTQoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTk2LTEyOCglcmN4KSwleG1tMAorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwl4b3JsCSVlYnAsJXI5ZAorLmJ5dGUJMHg2NiwweDkwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3ZsCSVyOWQsNjQrMTIoJXJzcCkKKwlsZWFxCTUoJXI4KSwlcjkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTExMi0xMjgoJXJjeCksJXhtbTEKKwlic3dhcGwJJXI5ZAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisJeG9ybAklZWJwLCVyOWQKKy5ieXRlCTB4NjYsMHg5MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92bAklcjlkLDgwKzEyKCVyc3ApCisJbGVhcQk2KCVyOCksJXI5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMAorCW1vdnVwcwkxMjgtMTI4KCVyY3gpLCV4bW0wCisJYnN3YXBsCSVyOWQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCXhvcmwJJWVicCwlcjlkCisuYnl0ZQkweDY2LDB4OTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdmwJJXI5ZCw5NisxMiglcnNwKQorCWxlYXEJNyglcjgpLCVyOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3Z1cHMJMTQ0LTEyOCglcmN4KSwleG1tMQorCWJzd2FwbAklcjlkCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisJeG9ybAklZWJwLCVyOWQKKwltb3ZkcXUJMCglcmRpKSwleG1tMTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92bAklcjlkLDExMisxMiglcnNwKQorCWNtcGwJJDExLCVlYXgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTE2MC0xMjgoJXJjeCksJXhtbTAKKworCWpiCUwkY3RyMzJfZW5jX2RvbmUKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCTE3Ni0xMjgoJXJjeCksJXhtbTEKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCTE5Mi0xMjgoJXJjeCksJXhtbTAKKwlqZQlMJGN0cjMyX2VuY19kb25lCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMQorCW1vdnVwcwkyMDgtMTI4KCVyY3gpLCV4bW0xCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIwLDIwMAorCW1vdnVwcwkyMjQtMTI4KCVyY3gpLCV4bW0wCisJam1wCUwkY3RyMzJfZW5jX2RvbmUKKworLnAyYWxpZ24JNAorTCRjdHIzMl9lbmNfZG9uZToKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTExCisJcHhvcgkleG1tMCwleG1tMTAKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTEyCisJcHhvcgkleG1tMCwleG1tMTEKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTEzCisJcHhvcgkleG1tMCwleG1tMTIKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTE0CisJcHhvcgkleG1tMCwleG1tMTMKKwltb3ZkcXUJODAoJXJkaSksJXhtbTE1CisJcHhvcgkleG1tMCwleG1tMTQKKwlweG9yCSV4bW0wLCV4bW0xNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92ZHF1CTk2KCVyZGkpLCV4bW0xCisJbGVhcQkxMjgoJXJkaSksJXJkaQorCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIxMAorCXB4b3IJJXhtbTAsJXhtbTEKKwltb3ZkcXUJMTEyLTEyOCglcmRpKSwleG1tMTAKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjE5CisJcHhvcgkleG1tMCwleG1tMTAKKwltb3ZkcWEJMCglcnNwKSwleG1tMTEKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjI4CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIzNworCW1vdmRxYQkxNiglcnNwKSwleG1tMTIKKwltb3ZkcWEJMzIoJXJzcCksJXhtbTEzCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDI0NgorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyNTUKKwltb3ZkcWEJNDgoJXJzcCksJXhtbTE0CisJbW92ZHFhCTY0KCVyc3ApLCV4bW0xNQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMSwxOTMKKwltb3ZkcWEJODAoJXJzcCksJXhtbTAKKwltb3Z1cHMJMTYtMTI4KCVyY3gpLCV4bW0xCisuYnl0ZQkxMDIsNjksMTUsNTYsMjIxLDIwMgorCisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdmRxYQkleG1tMTEsJXhtbTIKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3ZkcWEJJXhtbTEyLCV4bW0zCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92ZHFhCSV4bW0xMywleG1tNAorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCW1vdmRxYQkleG1tMTQsJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwltb3ZkcWEJJXhtbTE1LCV4bW02CisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJbW92ZHFhCSV4bW0wLCV4bW03CisJbW92dXBzCSV4bW04LDk2KCVyc2kpCisJbW92dXBzCSV4bW05LDExMiglcnNpKQorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKworCXN1YnEJJDgsJXJkeAorCWpuYwlMJGN0cjMyX2xvb3A4CisKKwlhZGRxCSQ4LCVyZHgKKwlqeglMJGN0cjMyX2RvbmUKKwlsZWFxCS0xMjgoJXJjeCksJXJjeAorCitMJGN0cjMyX3RhaWw6CisKKworCWxlYXEJMTYoJXJjeCksJXJjeAorCWNtcHEJJDQsJXJkeAorCWpiCUwkY3RyMzJfbG9vcDMKKwlqZQlMJGN0cjMyX2xvb3A0CisKKworCXNobGwJJDQsJWVheAorCW1vdmRxYQk5NiglcnNwKSwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKKworCW1vdnVwcwkxNiglcmN4KSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJbGVhcQkzMi0xNiglcmN4LCVyYXgsMSksJXJjeAorCW5lZ3EJJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKwlhZGRxCSQxNiwlcmF4CisJbW92dXBzCSglcmRpKSwleG1tMTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorCW1vdnVwcwkxNiglcmRpKSwleG1tMTEKKwltb3Z1cHMJMzIoJXJkaSksJXhtbTEyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMCwxOTMKKworCWNhbGwJTCRlbmNfbG9vcDhfZW50ZXIKKworCW1vdmRxdQk0OCglcmRpKSwleG1tMTMKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmRxdQk2NCglcmRpKSwleG1tMTAKKwlweG9yCSV4bW0xMSwleG1tMworCW1vdmRxdQkleG1tMiwoJXJzaSkKKwlweG9yCSV4bW0xMiwleG1tNAorCW1vdmRxdQkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tMTAsJXhtbTYKKwltb3ZkcXUJJXhtbTUsNDgoJXJzaSkKKwltb3ZkcXUJJXhtbTYsNjQoJXJzaSkKKwljbXBxCSQ2LCVyZHgKKwlqYglMJGN0cjMyX2RvbmUKKworCW1vdnVwcwk4MCglcmRpKSwleG1tMTEKKwl4b3JwcwkleG1tMTEsJXhtbTcKKwltb3Z1cHMJJXhtbTcsODAoJXJzaSkKKwlqZQlMJGN0cjMyX2RvbmUKKworCW1vdnVwcwk5NiglcmRpKSwleG1tMTIKKwl4b3JwcwkleG1tMTIsJXhtbTgKKwltb3Z1cHMJJXhtbTgsOTYoJXJzaSkKKwlqbXAJTCRjdHIzMl9kb25lCisKKy5wMmFsaWduCTUKK0wkY3RyMzJfbG9vcDQ6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWRlY2wJJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdnVwcwkoJXJjeCksJXhtbTEKKwlqbnoJTCRjdHIzMl9sb29wNAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjE3CisJbW92dXBzCSglcmRpKSwleG1tMTAKKwltb3Z1cHMJMTYoJXJkaSksJXhtbTExCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMzMKKwltb3Z1cHMJMzIoJXJkaSksJXhtbTEyCisJbW92dXBzCTQ4KCVyZGkpLCV4bW0xMworCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSV4bW0yLCglcnNpKQorCXhvcnBzCSV4bW0xMSwleG1tMworCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTUsNDgoJXJzaSkKKwlqbXAJTCRjdHIzMl9kb25lCisKKy5wMmFsaWduCTUKK0wkY3RyMzJfbG9vcDM6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWRlY2wJJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisJbW92dXBzCSglcmN4KSwleG1tMQorCWpueglMJGN0cjMyX2xvb3AzCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjI1CisKKwltb3Z1cHMJKCVyZGkpLCV4bW0xMAorCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwljbXBxCSQyLCVyZHgKKwlqYglMJGN0cjMyX2RvbmUKKworCW1vdnVwcwkxNiglcmRpKSwleG1tMTEKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwlqZQlMJGN0cjMyX2RvbmUKKworCW1vdnVwcwkzMiglcmRpKSwleG1tMTIKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKworTCRjdHIzMl9kb25lOgorCXhvcnBzCSV4bW0wLCV4bW0wCisJeG9ybAklZWJwLCVlYnAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJbW92YXBzCSV4bW0wLDAoJXJzcCkKKwlweG9yCSV4bW04LCV4bW04CisJbW92YXBzCSV4bW0wLDE2KCVyc3ApCisJcHhvcgkleG1tOSwleG1tOQorCW1vdmFwcwkleG1tMCwzMiglcnNwKQorCXB4b3IJJXhtbTEwLCV4bW0xMAorCW1vdmFwcwkleG1tMCw0OCglcnNwKQorCXB4b3IJJXhtbTExLCV4bW0xMQorCW1vdmFwcwkleG1tMCw2NCglcnNwKQorCXB4b3IJJXhtbTEyLCV4bW0xMgorCW1vdmFwcwkleG1tMCw4MCglcnNwKQorCXB4b3IJJXhtbTEzLCV4bW0xMworCW1vdmFwcwkleG1tMCw5NiglcnNwKQorCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmFwcwkleG1tMCwxMTIoJXJzcCkKKwlweG9yCSV4bW0xNSwleG1tMTUKKwltb3ZxCS04KCVyMTEpLCVyYnAKKworCWxlYXEJKCVyMTEpLCVyc3AKKworTCRjdHIzMl9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2Flc19od194dHNfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuIF9hZXNfaHdfeHRzX2VuY3J5cHQKKworLnAyYWxpZ24JNAorX2Flc19od194dHNfZW5jcnlwdDoKKworCWxlYXEJKCVyc3ApLCVyMTEKKworCXB1c2hxCSVyYnAKKworCXN1YnEJJDExMiwlcnNwCisJYW5kcQkkLTE2LCVyc3AKKwltb3Z1cHMJKCVyOSksJXhtbTIKKwltb3ZsCTI0MCglcjgpLCVlYXgKKwltb3ZsCTI0MCglcmN4KSwlcjEwZAorCW1vdnVwcwkoJXI4KSwleG1tMAorCW1vdnVwcwkxNiglcjgpLCV4bW0xCisJbGVhcQkzMiglcjgpLCVyOAorCXhvcnBzCSV4bW0wLCV4bW0yCitMJG9vcF9lbmMxXzg6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXI4KSwleG1tMQorCWxlYXEJMTYoJXI4KSwlcjgKKwlqbnoJTCRvb3BfZW5jMV84CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3ZxCSVyY3gsJXJicAorCW1vdmwJJXIxMGQsJWVheAorCXNobGwJJDQsJXIxMGQKKwltb3ZxCSVyZHgsJXI5CisJYW5kcQkkLTE2LCVyZHgKKworCW1vdnVwcwkxNiglcmN4LCVyMTAsMSksJXhtbTEKKworCW1vdmRxYQlMJHh0c19tYWdpYyglcmlwKSwleG1tOAorCW1vdmRxYQkleG1tMiwleG1tMTUKKwlwc2h1ZmQJJDB4NWYsJXhtbTIsJXhtbTkKKwlweG9yCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisJcHhvcgkleG1tMCwleG1tMTAKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisJcGFkZGQJJXhtbTksJXhtbTkKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMQorCXBzcmFkCSQzMSwleG1tMTQKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMTQKKwlweG9yCSV4bW0wLCV4bW0xMQorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorCW1vdmRxYQkleG1tMTUsJXhtbTEyCisJcHNyYWQJJDMxLCV4bW0xNAorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisJbW92ZHFhCSV4bW0xNSwleG1tMTMKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisJcHhvcgkleG1tMCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTE1LCV4bW0xNAorCXBzcmFkCSQzMSwleG1tOQorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW05CisJcHhvcgkleG1tMCwleG1tMTQKKwlweG9yCSV4bW05LCV4bW0xNQorCW1vdmFwcwkleG1tMSw5NiglcnNwKQorCisJc3VicQkkOTYsJXJkeAorCWpjCUwkeHRzX2VuY19zaG9ydAorCisJbW92bAkkMTYrOTYsJWVheAorCWxlYXEJMzIoJXJicCwlcjEwLDEpLCVyY3gKKwlzdWJxCSVyMTAsJXJheAorCW1vdnVwcwkxNiglcmJwKSwleG1tMQorCW1vdnEJJXJheCwlcjEwCisJbGVhcQlMJHh0c19tYWdpYyglcmlwKSwlcjgKKwlqbXAJTCR4dHNfZW5jX2dyYW5kbG9vcAorCisucDJhbGlnbgk1CitMJHh0c19lbmNfZ3JhbmRsb29wOgorCW1vdmRxdQkwKCVyZGkpLCV4bW0yCisJbW92ZHFhCSV4bW0wLCV4bW04CisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwlweG9yCSV4bW0xMSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlweG9yCSV4bW0xMiwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwlweG9yCSV4bW0xMywleG1tNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwlweG9yCSV4bW0xNSwleG1tOAorCW1vdmRxYQk5NiglcnNwKSwleG1tOQorCXB4b3IJJXhtbTE0LCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCW1vdnVwcwkzMiglcmJwKSwleG1tMAorCWxlYXEJOTYoJXJkaSksJXJkaQorCXB4b3IJJXhtbTgsJXhtbTcKKworCXB4b3IJJXhtbTksJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorCXB4b3IJJXhtbTksJXhtbTExCisJbW92ZHFhCSV4bW0xMCwwKCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwk0OCglcmJwKSwleG1tMQorCXB4b3IJJXhtbTksJXhtbTEyCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisJcHhvcgkleG1tOSwleG1tMTMKKwltb3ZkcWEJJXhtbTExLDE2KCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorCXB4b3IJJXhtbTksJXhtbTE0CisJbW92ZHFhCSV4bW0xMiwzMiglcnNwKQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJcHhvcgkleG1tOSwleG1tOAorCW1vdmRxYQkleG1tMTQsNjQoJXJzcCkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorCW1vdnVwcwk2NCglcmJwKSwleG1tMAorCW1vdmRxYQkleG1tOCw4MCglcnNwKQorCXBzaHVmZAkkMHg1ZiwleG1tMTUsJXhtbTkKKwlqbXAJTCR4dHNfZW5jX2xvb3A2CisucDJhbGlnbgk1CitMJHh0c19lbmNfbG9vcDY6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCS02NCglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKwltb3Z1cHMJLTgwKCVyY3gsJXJheCwxKSwleG1tMAorCWpueglMJHh0c19lbmNfbG9vcDYKKworCW1vdmRxYQkoJXI4KSwleG1tOAorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcHNyYWQJJDMxLCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKwlwYW5kCSV4bW04LCV4bW0xNAorCW1vdnVwcwkoJXJicCksJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92YXBzCSV4bW0xMCwleG1tMTEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCS02NCglcmN4KSwleG1tMQorCisJbW92ZHFhCSV4bW05LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKwlwYWRkZAkleG1tOSwleG1tOQorCXB4b3IJJXhtbTE1LCV4bW0xMAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJcGFuZAkleG1tOCwleG1tMTQKKwltb3ZhcHMJJXhtbTExLCV4bW0xMgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDAKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorCW1vdnVwcwktNDgoJXJjeCksJXhtbTAKKworCXBhZGRkCSV4bW05LCV4bW05CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJJXhtbTE1LCV4bW0xMQorCXBzcmFkCSQzMSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3ZkcWEJJXhtbTEzLDQ4KCVyc3ApCisJcHhvcgkleG1tMTQsJXhtbTE1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MQorCW1vdmFwcwkleG1tMTIsJXhtbTEzCisJbW92ZHFhCSV4bW05LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKwltb3Z1cHMJLTMyKCVyY3gpLCV4bW0xCisKKwlwYWRkZAkleG1tOSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKwlweG9yCSV4bW0xNSwleG1tMTIKKwlwc3JhZAkkMzEsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmFwcwkleG1tMTMsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OAorCisJbW92ZHFhCSV4bW05LCV4bW0wCisJcGFkZGQJJXhtbTksJXhtbTkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJcHhvcgkleG1tMTUsJXhtbTEzCisJcHNyYWQJJDMxLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwlweG9yCSV4bW0wLCV4bW0xNQorCW1vdnVwcwkoJXJicCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwkxNiglcmJwKSwleG1tMQorCisJcHhvcgkleG1tMTUsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDg0LDM2LDAKKwlwc3JhZAkkMzEsJXhtbTkKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDkyLDM2LDE2CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDEwMCwzNiwzMgorCXBhbmQJJXhtbTgsJXhtbTkKKwltb3ZxCSVyMTAsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMSwxMDgsMzYsNDgKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMTE2LDM2LDY0CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDEyNCwzNiw4MAorCXB4b3IJJXhtbTksJXhtbTE1CisKKwlsZWFxCTk2KCVyc2kpLCVyc2kKKwltb3Z1cHMJJXhtbTIsLTk2KCVyc2kpCisJbW92dXBzCSV4bW0zLC04MCglcnNpKQorCW1vdnVwcwkleG1tNCwtNjQoJXJzaSkKKwltb3Z1cHMJJXhtbTUsLTQ4KCVyc2kpCisJbW92dXBzCSV4bW02LC0zMiglcnNpKQorCW1vdnVwcwkleG1tNywtMTYoJXJzaSkKKwlzdWJxCSQ5NiwlcmR4CisJam5jCUwkeHRzX2VuY19ncmFuZGxvb3AKKworCW1vdmwJJDE2Kzk2LCVlYXgKKwlzdWJsCSVyMTBkLCVlYXgKKwltb3ZxCSVyYnAsJXJjeAorCXNocmwJJDQsJWVheAorCitMJHh0c19lbmNfc2hvcnQ6CisKKwltb3ZsCSVlYXgsJXIxMGQKKwlweG9yCSV4bW0wLCV4bW0xMAorCWFkZHEJJDk2LCVyZHgKKwlqeglMJHh0c19lbmNfZG9uZQorCisJcHhvcgkleG1tMCwleG1tMTEKKwljbXBxCSQweDIwLCVyZHgKKwlqYglMJHh0c19lbmNfb25lCisJcHhvcgkleG1tMCwleG1tMTIKKwlqZQlMJHh0c19lbmNfdHdvCisKKwlweG9yCSV4bW0wLCV4bW0xMworCWNtcHEJJDB4NDAsJXJkeAorCWpiCUwkeHRzX2VuY190aHJlZQorCXB4b3IJJXhtbTAsJXhtbTE0CisJamUJTCR4dHNfZW5jX2ZvdXIKKworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmRxdQk0OCglcmRpKSwleG1tNQorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CTY0KCVyZGkpLCV4bW02CisJbGVhcQk4MCglcmRpKSwlcmRpCisJcHhvcgkleG1tMTIsJXhtbTQKKwlweG9yCSV4bW0xMywleG1tNQorCXB4b3IJJXhtbTE0LCV4bW02CisJcHhvcgkleG1tNywleG1tNworCisJY2FsbAlfYWVzbmlfZW5jcnlwdDYKKworCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXhvcnBzCSV4bW0xMywleG1tNQorCW1vdmRxdQkleG1tMywxNiglcnNpKQorCXhvcnBzCSV4bW0xNCwleG1tNgorCW1vdmRxdQkleG1tNCwzMiglcnNpKQorCW1vdmRxdQkleG1tNSw0OCglcnNpKQorCW1vdmRxdQkleG1tNiw2NCglcnNpKQorCWxlYXEJODAoJXJzaSksJXJzaQorCWptcAlMJHh0c19lbmNfZG9uZQorCisucDJhbGlnbgk0CitMJHh0c19lbmNfb25lOgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wkb29wX2VuYzFfOToKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpueglMJG9vcF9lbmMxXzkKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0xMSwleG1tMTAKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJam1wCUwkeHRzX2VuY19kb25lCisKKy5wMmFsaWduCTQKK0wkeHRzX2VuY190d286CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCWxlYXEJMzIoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMCwleG1tMgorCXhvcnBzCSV4bW0xMSwleG1tMworCisJY2FsbAlfYWVzbmlfZW5jcnlwdDIKKworCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTIsJXhtbTEwCisJeG9ycHMJJXhtbTExLCV4bW0zCisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCWxlYXEJMzIoJXJzaSksJXJzaQorCWptcAlMJHh0c19lbmNfZG9uZQorCisucDJhbGlnbgk0CitMJHh0c19lbmNfdGhyZWU6CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCW1vdnVwcwkzMiglcmRpKSwleG1tNAorCWxlYXEJNDgoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMCwleG1tMgorCXhvcnBzCSV4bW0xMSwleG1tMworCXhvcnBzCSV4bW0xMiwleG1tNAorCisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKworCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTMsJXhtbTEwCisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEyLCV4bW00CisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCWxlYXEJNDgoJXJzaSksJXJzaQorCWptcAlMJHh0c19lbmNfZG9uZQorCisucDJhbGlnbgk0CitMJHh0c19lbmNfZm91cjoKKwltb3Z1cHMJKCVyZGkpLCV4bW0yCisJbW92dXBzCTE2KCVyZGkpLCV4bW0zCisJbW92dXBzCTMyKCVyZGkpLCV4bW00CisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCTQ4KCVyZGkpLCV4bW01CisJbGVhcQk2NCglcmRpKSwlcmRpCisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEyLCV4bW00CisJeG9ycHMJJXhtbTEzLCV4bW01CisKKwljYWxsCV9hZXNuaV9lbmNyeXB0NAorCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTMsMTYoJXJzaSkKKwltb3ZkcXUJJXhtbTQsMzIoJXJzaSkKKwltb3ZkcXUJJXhtbTUsNDgoJXJzaSkKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlqbXAJTCR4dHNfZW5jX2RvbmUKKworLnAyYWxpZ24JNAorTCR4dHNfZW5jX2RvbmU6CisJYW5kcQkkMTUsJXI5CisJanoJTCR4dHNfZW5jX3JldAorCW1vdnEJJXI5LCVyZHgKKworTCR4dHNfZW5jX3N0ZWFsOgorCW1vdnpibAkoJXJkaSksJWVheAorCW1vdnpibAktMTYoJXJzaSksJWVjeAorCWxlYXEJMSglcmRpKSwlcmRpCisJbW92YgklYWwsLTE2KCVyc2kpCisJbW92YgklY2wsMCglcnNpKQorCWxlYXEJMSglcnNpKSwlcnNpCisJc3VicQkkMSwlcmR4CisJam56CUwkeHRzX2VuY19zdGVhbAorCisJc3VicQklcjksJXJzaQorCW1vdnEJJXJicCwlcmN4CisJbW92bAklcjEwZCwlZWF4CisKKwltb3Z1cHMJLTE2KCVyc2kpLCV4bW0yCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCitMJG9vcF9lbmMxXzEwOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CUwkb29wX2VuYzFfMTAKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSV4bW0yLC0xNiglcnNpKQorCitMJHh0c19lbmNfcmV0OgorCXhvcnBzCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW02LCV4bW02CisJcHhvcgkleG1tNywleG1tNworCW1vdmFwcwkleG1tMCwwKCVyc3ApCisJcHhvcgkleG1tOCwleG1tOAorCW1vdmFwcwkleG1tMCwxNiglcnNwKQorCXB4b3IJJXhtbTksJXhtbTkKKwltb3ZhcHMJJXhtbTAsMzIoJXJzcCkKKwlweG9yCSV4bW0xMCwleG1tMTAKKwltb3ZhcHMJJXhtbTAsNDgoJXJzcCkKKwlweG9yCSV4bW0xMSwleG1tMTEKKwltb3ZhcHMJJXhtbTAsNjQoJXJzcCkKKwlweG9yCSV4bW0xMiwleG1tMTIKKwltb3ZhcHMJJXhtbTAsODAoJXJzcCkKKwlweG9yCSV4bW0xMywleG1tMTMKKwltb3ZhcHMJJXhtbTAsOTYoJXJzcCkKKwlweG9yCSV4bW0xNCwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTUKKwltb3ZxCS04KCVyMTEpLCVyYnAKKworCWxlYXEJKCVyMTEpLCVyc3AKKworTCR4dHNfZW5jX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzX2h3X3h0c19kZWNyeXB0CisucHJpdmF0ZV9leHRlcm4gX2Flc19od194dHNfZGVjcnlwdAorCisucDJhbGlnbgk0CitfYWVzX2h3X3h0c19kZWNyeXB0OgorCisJbGVhcQkoJXJzcCksJXIxMQorCisJcHVzaHEJJXJicAorCisJc3VicQkkMTEyLCVyc3AKKwlhbmRxCSQtMTYsJXJzcAorCW1vdnVwcwkoJXI5KSwleG1tMgorCW1vdmwJMjQwKCVyOCksJWVheAorCW1vdmwJMjQwKCVyY3gpLCVyMTBkCisJbW92dXBzCSglcjgpLCV4bW0wCisJbW92dXBzCTE2KCVyOCksJXhtbTEKKwlsZWFxCTMyKCVyOCksJXI4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wkb29wX2VuYzFfMTE6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXI4KSwleG1tMQorCWxlYXEJMTYoJXI4KSwlcjgKKwlqbnoJTCRvb3BfZW5jMV8xMQorLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMDkKKwl4b3JsCSVlYXgsJWVheAorCXRlc3RxCSQxNSwlcmR4CisJc2V0bnoJJWFsCisJc2hscQkkNCwlcmF4CisJc3VicQklcmF4LCVyZHgKKworCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3ZxCSVyY3gsJXJicAorCW1vdmwJJXIxMGQsJWVheAorCXNobGwJJDQsJXIxMGQKKwltb3ZxCSVyZHgsJXI5CisJYW5kcQkkLTE2LCVyZHgKKworCW1vdnVwcwkxNiglcmN4LCVyMTAsMSksJXhtbTEKKworCW1vdmRxYQlMJHh0c19tYWdpYyglcmlwKSwleG1tOAorCW1vdmRxYQkleG1tMiwleG1tMTUKKwlwc2h1ZmQJJDB4NWYsJXhtbTIsJXhtbTkKKwlweG9yCSV4bW0wLCV4bW0xCisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisJcHhvcgkleG1tMCwleG1tMTAKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisJcGFkZGQJJXhtbTksJXhtbTkKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMQorCXBzcmFkCSQzMSwleG1tMTQKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMTQKKwlweG9yCSV4bW0wLCV4bW0xMQorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorCW1vdmRxYQkleG1tMTUsJXhtbTEyCisJcHNyYWQJJDMxLCV4bW0xNAorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTEyCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92ZHFhCSV4bW05LCV4bW0xNAorCXBhZGRkCSV4bW05LCV4bW05CisJbW92ZHFhCSV4bW0xNSwleG1tMTMKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisJcHhvcgkleG1tMCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTE1LCV4bW0xNAorCXBzcmFkCSQzMSwleG1tOQorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW05CisJcHhvcgkleG1tMCwleG1tMTQKKwlweG9yCSV4bW05LCV4bW0xNQorCW1vdmFwcwkleG1tMSw5NiglcnNwKQorCisJc3VicQkkOTYsJXJkeAorCWpjCUwkeHRzX2RlY19zaG9ydAorCisJbW92bAkkMTYrOTYsJWVheAorCWxlYXEJMzIoJXJicCwlcjEwLDEpLCVyY3gKKwlzdWJxCSVyMTAsJXJheAorCW1vdnVwcwkxNiglcmJwKSwleG1tMQorCW1vdnEJJXJheCwlcjEwCisJbGVhcQlMJHh0c19tYWdpYyglcmlwKSwlcjgKKwlqbXAJTCR4dHNfZGVjX2dyYW5kbG9vcAorCisucDJhbGlnbgk1CitMJHh0c19kZWNfZ3JhbmRsb29wOgorCW1vdmRxdQkwKCVyZGkpLCV4bW0yCisJbW92ZHFhCSV4bW0wLCV4bW04CisJbW92ZHF1CTE2KCVyZGkpLCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwlweG9yCSV4bW0xMSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlweG9yCSV4bW0xMiwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwlweG9yCSV4bW0xMywleG1tNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwlweG9yCSV4bW0xNSwleG1tOAorCW1vdmRxYQk5NiglcnNwKSwleG1tOQorCXB4b3IJJXhtbTE0LCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworCW1vdnVwcwkzMiglcmJwKSwleG1tMAorCWxlYXEJOTYoJXJkaSksJXJkaQorCXB4b3IJJXhtbTgsJXhtbTcKKworCXB4b3IJJXhtbTksJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorCXB4b3IJJXhtbTksJXhtbTExCisJbW92ZHFhCSV4bW0xMCwwKCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwk0OCglcmJwKSwleG1tMQorCXB4b3IJJXhtbTksJXhtbTEyCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisJcHhvcgkleG1tOSwleG1tMTMKKwltb3ZkcWEJJXhtbTExLDE2KCVyc3ApCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorCXB4b3IJJXhtbTksJXhtbTE0CisJbW92ZHFhCSV4bW0xMiwzMiglcnNwKQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisJcHhvcgkleG1tOSwleG1tOAorCW1vdmRxYQkleG1tMTQsNjQoJXJzcCkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwk2NCglcmJwKSwleG1tMAorCW1vdmRxYQkleG1tOCw4MCglcnNwKQorCXBzaHVmZAkkMHg1ZiwleG1tMTUsJXhtbTkKKwlqbXAJTCR4dHNfZGVjX2xvb3A2CisucDJhbGlnbgk1CitMJHh0c19kZWNfbG9vcDY6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCS02NCglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDgKKwltb3Z1cHMJLTgwKCVyY3gsJXJheCwxKSwleG1tMAorCWpueglMJHh0c19kZWNfbG9vcDYKKworCW1vdmRxYQkoJXI4KSwleG1tOAorCW1vdmRxYQkleG1tOSwleG1tMTQKKwlwYWRkZAkleG1tOSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcHNyYWQJJDMxLCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwlwYW5kCSV4bW04LCV4bW0xNAorCW1vdnVwcwkoJXJicCksJXhtbTEwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisJcHhvcgkleG1tMTQsJXhtbTE1CisJbW92YXBzCSV4bW0xMCwleG1tMTEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCS02NCglcmN4KSwleG1tMQorCisJbW92ZHFhCSV4bW05LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKwlwYWRkZAkleG1tOSwleG1tOQorCXB4b3IJJXhtbTE1LCV4bW0xMAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKwlwc3JhZAkkMzEsJXhtbTE0CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisJcGFuZAkleG1tOCwleG1tMTQKKwltb3ZhcHMJJXhtbTExLCV4bW0xMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKwlweG9yCSV4bW0xNCwleG1tMTUKKwltb3ZkcWEJJXhtbTksJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwktNDgoJXJjeCksJXhtbTAKKworCXBhZGRkCSV4bW05LCV4bW05CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCXB4b3IJJXhtbTE1LCV4bW0xMQorCXBzcmFkCSQzMSwleG1tMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisJcGFkZHEJJXhtbTE1LCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKwltb3ZkcWEJJXhtbTEzLDQ4KCVyc3ApCisJcHhvcgkleG1tMTQsJXhtbTE1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorCW1vdmFwcwkleG1tMTIsJXhtbTEzCisJbW92ZHFhCSV4bW05LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJLTMyKCVyY3gpLCV4bW0xCisKKwlwYWRkZAkleG1tOSwleG1tOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKwlweG9yCSV4bW0xNSwleG1tMTIKKwlwc3JhZAkkMzEsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorCXB4b3IJJXhtbTE0LCV4bW0xNQorCW1vdmFwcwkleG1tMTMsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorCisJbW92ZHFhCSV4bW05LCV4bW0wCisJcGFkZGQJJXhtbTksJXhtbTkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgkleG1tMTUsJXhtbTEzCisJcHNyYWQJJDMxLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworCXBhZGRxCSV4bW0xNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKwlweG9yCSV4bW0wLCV4bW0xNQorCW1vdnVwcwkoJXJicCksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwkxNiglcmJwKSwleG1tMQorCisJcHhvcgkleG1tMTUsJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDg0LDM2LDAKKwlwc3JhZAkkMzEsJXhtbTkKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDkyLDM2LDE2CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDEwMCwzNiwzMgorCXBhbmQJJXhtbTgsJXhtbTkKKwltb3ZxCSVyMTAsJXJheAorLmJ5dGUJMTAyLDE1LDU2LDIyMywxMDgsMzYsNDgKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMTE2LDM2LDY0CisuYnl0ZQkxMDIsMTUsNTYsMjIzLDEyNCwzNiw4MAorCXB4b3IJJXhtbTksJXhtbTE1CisKKwlsZWFxCTk2KCVyc2kpLCVyc2kKKwltb3Z1cHMJJXhtbTIsLTk2KCVyc2kpCisJbW92dXBzCSV4bW0zLC04MCglcnNpKQorCW1vdnVwcwkleG1tNCwtNjQoJXJzaSkKKwltb3Z1cHMJJXhtbTUsLTQ4KCVyc2kpCisJbW92dXBzCSV4bW02LC0zMiglcnNpKQorCW1vdnVwcwkleG1tNywtMTYoJXJzaSkKKwlzdWJxCSQ5NiwlcmR4CisJam5jCUwkeHRzX2RlY19ncmFuZGxvb3AKKworCW1vdmwJJDE2Kzk2LCVlYXgKKwlzdWJsCSVyMTBkLCVlYXgKKwltb3ZxCSVyYnAsJXJjeAorCXNocmwJJDQsJWVheAorCitMJHh0c19kZWNfc2hvcnQ6CisKKwltb3ZsCSVlYXgsJXIxMGQKKwlweG9yCSV4bW0wLCV4bW0xMAorCXB4b3IJJXhtbTAsJXhtbTExCisJYWRkcQkkOTYsJXJkeAorCWp6CUwkeHRzX2RlY19kb25lCisKKwlweG9yCSV4bW0wLCV4bW0xMgorCWNtcHEJJDB4MjAsJXJkeAorCWpiCUwkeHRzX2RlY19vbmUKKwlweG9yCSV4bW0wLCV4bW0xMworCWplCUwkeHRzX2RlY190d28KKworCXB4b3IJJXhtbTAsJXhtbTE0CisJY21wcQkkMHg0MCwlcmR4CisJamIJTCR4dHNfZGVjX3RocmVlCisJamUJTCR4dHNfZGVjX2ZvdXIKKworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmRxdQk0OCglcmRpKSwleG1tNQorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CTY0KCVyZGkpLCV4bW02CisJbGVhcQk4MCglcmRpKSwlcmRpCisJcHhvcgkleG1tMTIsJXhtbTQKKwlweG9yCSV4bW0xMywleG1tNQorCXB4b3IJJXhtbTE0LCV4bW02CisKKwljYWxsCV9hZXNuaV9kZWNyeXB0NgorCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXhvcnBzCSV4bW0xMywleG1tNQorCW1vdmRxdQkleG1tMywxNiglcnNpKQorCXhvcnBzCSV4bW0xNCwleG1tNgorCW1vdmRxdQkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxdQkleG1tNSw0OCglcnNpKQorCXBjbXBndGQJJXhtbTE1LCV4bW0xNAorCW1vdmRxdQkleG1tNiw2NCglcnNpKQorCWxlYXEJODAoJXJzaSksJXJzaQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTExCisJYW5kcQkkMTUsJXI5CisJanoJTCR4dHNfZGVjX3JldAorCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwYWRkcQkleG1tMTUsJXhtbTE1CisJcGFuZAkleG1tOCwleG1tMTEKKwlweG9yCSV4bW0xNSwleG1tMTEKKwlqbXAJTCR4dHNfZGVjX2RvbmUyCisKKy5wMmFsaWduCTQKK0wkeHRzX2RlY19vbmU6CisJbW92dXBzCSglcmRpKSwleG1tMgorCWxlYXEJMTYoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwl4b3JwcwkleG1tMCwleG1tMgorTCRvb3BfZGVjMV8xMjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpueglMJG9vcF9kZWMxXzEyCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTEsJXhtbTEwCisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdmRxYQkleG1tMTIsJXhtbTExCisJbGVhcQkxNiglcnNpKSwlcnNpCisJam1wCUwkeHRzX2RlY19kb25lCisKKy5wMmFsaWduCTQKK0wkeHRzX2RlY190d286CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCWxlYXEJMzIoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMCwleG1tMgorCXhvcnBzCSV4bW0xMSwleG1tMworCisJY2FsbAlfYWVzbmlfZGVjcnlwdDIKKworCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMTIsJXhtbTEwCisJeG9ycHMJJXhtbTExLCV4bW0zCisJbW92ZHFhCSV4bW0xMywleG1tMTEKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbGVhcQkzMiglcnNpKSwlcnNpCisJam1wCUwkeHRzX2RlY19kb25lCisKKy5wMmFsaWduCTQKK0wkeHRzX2RlY190aHJlZToKKwltb3Z1cHMJKCVyZGkpLCV4bW0yCisJbW92dXBzCTE2KCVyZGkpLCV4bW0zCisJbW92dXBzCTMyKCVyZGkpLCV4bW00CisJbGVhcQk0OCglcmRpKSwlcmRpCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJeG9ycHMJJXhtbTExLCV4bW0zCisJeG9ycHMJJXhtbTEyLCV4bW00CisKKwljYWxsCV9hZXNuaV9kZWNyeXB0MworCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0xMywleG1tMTAKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMQorCXhvcnBzCSV4bW0xMiwleG1tNAorCW1vdnVwcwkleG1tMiwoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlsZWFxCTQ4KCVyc2kpLCVyc2kKKwlqbXAJTCR4dHNfZGVjX2RvbmUKKworLnAyYWxpZ24JNAorTCR4dHNfZGVjX2ZvdXI6CisJbW92dXBzCSglcmRpKSwleG1tMgorCW1vdnVwcwkxNiglcmRpKSwleG1tMworCW1vdnVwcwkzMiglcmRpKSwleG1tNAorCXhvcnBzCSV4bW0xMCwleG1tMgorCW1vdnVwcwk0OCglcmRpKSwleG1tNQorCWxlYXEJNjQoJXJkaSksJXJkaQorCXhvcnBzCSV4bW0xMSwleG1tMworCXhvcnBzCSV4bW0xMiwleG1tNAorCXhvcnBzCSV4bW0xMywleG1tNQorCisJY2FsbAlfYWVzbmlfZGVjcnlwdDQKKworCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMSwleG1tMworCW1vdmRxYQkleG1tMTUsJXhtbTExCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTMsMTYoJXJzaSkKKwltb3ZkcXUJJXhtbTQsMzIoJXJzaSkKKwltb3ZkcXUJJXhtbTUsNDgoJXJzaSkKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlqbXAJTCR4dHNfZGVjX2RvbmUKKworLnAyYWxpZ24JNAorTCR4dHNfZGVjX2RvbmU6CisJYW5kcQkkMTUsJXI5CisJanoJTCR4dHNfZGVjX3JldAorTCR4dHNfZGVjX2RvbmUyOgorCW1vdnEJJXI5LCVyZHgKKwltb3ZxCSVyYnAsJXJjeAorCW1vdmwJJXIxMGQsJWVheAorCisJbW92dXBzCSglcmRpKSwleG1tMgorCXhvcnBzCSV4bW0xMSwleG1tMgorCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwl4b3JwcwkleG1tMCwleG1tMgorTCRvb3BfZGVjMV8xMzoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjbAklZWF4CisJbW92dXBzCSglcmN4KSwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCWpueglMJG9vcF9kZWMxXzEzCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCSV4bW0xMSwleG1tMgorCW1vdnVwcwkleG1tMiwoJXJzaSkKKworTCR4dHNfZGVjX3N0ZWFsOgorCW1vdnpibAkxNiglcmRpKSwlZWF4CisJbW92emJsCSglcnNpKSwlZWN4CisJbGVhcQkxKCVyZGkpLCVyZGkKKwltb3ZiCSVhbCwoJXJzaSkKKwltb3ZiCSVjbCwxNiglcnNpKQorCWxlYXEJMSglcnNpKSwlcnNpCisJc3VicQkkMSwlcmR4CisJam56CUwkeHRzX2RlY19zdGVhbAorCisJc3VicQklcjksJXJzaQorCW1vdnEJJXJicCwlcmN4CisJbW92bAklcjEwZCwlZWF4CisKKwltb3Z1cHMJKCVyc2kpLCV4bW0yCisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSglcmN4KSwleG1tMAorCW1vdnVwcwkxNiglcmN4KSwleG1tMQorCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0wLCV4bW0yCitMJG9vcF9kZWMxXzE0OgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CUwkb29wX2RlYzFfMTQKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJJXhtbTEwLCV4bW0yCisJbW92dXBzCSV4bW0yLCglcnNpKQorCitMJHh0c19kZWNfcmV0OgorCXhvcnBzCSV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTIsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW02LCV4bW02CisJcHhvcgkleG1tNywleG1tNworCW1vdmFwcwkleG1tMCwwKCVyc3ApCisJcHhvcgkleG1tOCwleG1tOAorCW1vdmFwcwkleG1tMCwxNiglcnNwKQorCXB4b3IJJXhtbTksJXhtbTkKKwltb3ZhcHMJJXhtbTAsMzIoJXJzcCkKKwlweG9yCSV4bW0xMCwleG1tMTAKKwltb3ZhcHMJJXhtbTAsNDgoJXJzcCkKKwlweG9yCSV4bW0xMSwleG1tMTEKKwltb3ZhcHMJJXhtbTAsNjQoJXJzcCkKKwlweG9yCSV4bW0xMiwleG1tMTIKKwltb3ZhcHMJJXhtbTAsODAoJXJzcCkKKwlweG9yCSV4bW0xMywleG1tMTMKKwltb3ZhcHMJJXhtbTAsOTYoJXJzcCkKKwlweG9yCSV4bW0xNCwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTUKKwltb3ZxCS04KCVyMTEpLCVyYnAKKworCWxlYXEJKCVyMTEpLCVyc3AKKworTCR4dHNfZGVjX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzX2h3X29jYl9lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4gX2Flc19od19vY2JfZW5jcnlwdAorCisucDJhbGlnbgk1CitfYWVzX2h3X29jYl9lbmNyeXB0OgorCisJbGVhcQkoJXJzcCksJXJheAorCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCW1vdnEJOCglcmF4KSwlcmJ4CisJbW92cQk4KzgoJXJheCksJXJicAorCisJbW92bAkyNDAoJXJjeCksJXIxMGQKKwltb3ZxCSVyY3gsJXIxMQorCXNobGwJJDQsJXIxMGQKKwltb3Z1cHMJKCVyY3gpLCV4bW05CisJbW92dXBzCTE2KCVyY3gsJXIxMCwxKSwleG1tMQorCisJbW92ZHF1CSglcjkpLCV4bW0xNQorCXB4b3IJJXhtbTEsJXhtbTkKKwlweG9yCSV4bW0xLCV4bW0xNQorCisJbW92bAkkMTYrMzIsJWVheAorCWxlYXEJMzIoJXIxMSwlcjEwLDEpLCVyY3gKKwltb3Z1cHMJMTYoJXIxMSksJXhtbTEKKwlzdWJxCSVyMTAsJXJheAorCW1vdnEJJXJheCwlcjEwCisKKwltb3ZkcXUJKCVyYngpLCV4bW0xMAorCW1vdmRxdQkoJXJicCksJXhtbTgKKworCXRlc3RxCSQxLCVyOAorCWpueglMJG9jYl9lbmNfb2RkCisKKwlic2ZxCSVyOCwlcjEyCisJYWRkcQkkMSwlcjgKKwlzaGxxCSQ0LCVyMTIKKwltb3ZkcXUJKCVyYngsJXIxMiwxKSwleG1tNworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKworCWNhbGwJX19vY2JfZW5jcnlwdDEKKworCW1vdmRxYQkleG1tNywleG1tMTUKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJc3VicQkkMSwlcmR4CisJanoJTCRvY2JfZW5jX2RvbmUKKworTCRvY2JfZW5jX29kZDoKKwlsZWFxCTEoJXI4KSwlcjEyCisJbGVhcQkzKCVyOCksJXIxMworCWxlYXEJNSglcjgpLCVyMTQKKwlsZWFxCTYoJXI4KSwlcjgKKwlic2ZxCSVyMTIsJXIxMgorCWJzZnEJJXIxMywlcjEzCisJYnNmcQklcjE0LCVyMTQKKwlzaGxxCSQ0LCVyMTIKKwlzaGxxCSQ0LCVyMTMKKwlzaGxxCSQ0LCVyMTQKKworCXN1YnEJJDYsJXJkeAorCWpjCUwkb2NiX2VuY19zaG9ydAorCWptcAlMJG9jYl9lbmNfZ3JhbmRsb29wCisKKy5wMmFsaWduCTUKK0wkb2NiX2VuY19ncmFuZGxvb3A6CisJbW92ZHF1CTAoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwlsZWFxCTk2KCVyZGkpLCVyZGkKKworCWNhbGwJX19vY2JfZW5jcnlwdDYKKworCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJbGVhcQk5NiglcnNpKSwlcnNpCisJc3VicQkkNiwlcmR4CisJam5jCUwkb2NiX2VuY19ncmFuZGxvb3AKKworTCRvY2JfZW5jX3Nob3J0OgorCWFkZHEJJDYsJXJkeAorCWp6CUwkb2NiX2VuY19kb25lCisKKwltb3ZkcXUJMCglcmRpKSwleG1tMgorCWNtcHEJJDIsJXJkeAorCWpiCUwkb2NiX2VuY19vbmUKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwlqZQlMJG9jYl9lbmNfdHdvCisKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwljbXBxCSQ0LCVyZHgKKwlqYglMJG9jYl9lbmNfdGhyZWUKKwltb3ZkcXUJNDgoJXJkaSksJXhtbTUKKwlqZQlMJG9jYl9lbmNfZm91cgorCisJbW92ZHF1CTY0KCVyZGkpLCV4bW02CisJcHhvcgkleG1tNywleG1tNworCisJY2FsbAlfX29jYl9lbmNyeXB0NgorCisJbW92ZHFhCSV4bW0xNCwleG1tMTUKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCisJam1wCUwkb2NiX2VuY19kb25lCisKKy5wMmFsaWduCTQKK0wkb2NiX2VuY19vbmU6CisJbW92ZHFhCSV4bW0xMCwleG1tNworCisJY2FsbAlfX29jYl9lbmNyeXB0MQorCisJbW92ZHFhCSV4bW03LCV4bW0xNQorCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJam1wCUwkb2NiX2VuY19kb25lCisKKy5wMmFsaWduCTQKK0wkb2NiX2VuY190d286CisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKworCWNhbGwJX19vY2JfZW5jcnlwdDQKKworCW1vdmRxYQkleG1tMTEsJXhtbTE1CisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKworCWptcAlMJG9jYl9lbmNfZG9uZQorCisucDJhbGlnbgk0CitMJG9jYl9lbmNfdGhyZWU6CisJcHhvcgkleG1tNSwleG1tNQorCisJY2FsbAlfX29jYl9lbmNyeXB0NAorCisJbW92ZHFhCSV4bW0xMiwleG1tMTUKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCisJam1wCUwkb2NiX2VuY19kb25lCisKKy5wMmFsaWduCTQKK0wkb2NiX2VuY19mb3VyOgorCWNhbGwJX19vY2JfZW5jcnlwdDQKKworCW1vdmRxYQkleG1tMTMsJXhtbTE1CisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKworTCRvY2JfZW5jX2RvbmU6CisJcHhvcgkleG1tMCwleG1tMTUKKwltb3ZkcXUJJXhtbTgsKCVyYnApCisJbW92ZHF1CSV4bW0xNSwoJXI5KQorCisJeG9ycHMJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKKwlweG9yCSV4bW0xMCwleG1tMTAKKwlweG9yCSV4bW0xMSwleG1tMTEKKwlweG9yCSV4bW0xMiwleG1tMTIKKwlweG9yCSV4bW0xMywleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwlweG9yCSV4bW0xNSwleG1tMTUKKwlsZWFxCTQwKCVyc3ApLCVyYXgKKworCW1vdnEJLTQwKCVyYXgpLCVyMTQKKworCW1vdnEJLTMyKCVyYXgpLCVyMTMKKworCW1vdnEJLTI0KCVyYXgpLCVyMTIKKworCW1vdnEJLTE2KCVyYXgpLCVyYnAKKworCW1vdnEJLTgoJXJheCksJXJieAorCisJbGVhcQkoJXJheCksJXJzcAorCitMJG9jYl9lbmNfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKy5wMmFsaWduCTUKK19fb2NiX2VuY3J5cHQ2OgorCXB4b3IJJXhtbTksJXhtbTE1CisJbW92ZHF1CSglcmJ4LCVyMTIsMSksJXhtbTExCisJbW92ZHFhCSV4bW0xMCwleG1tMTIKKwltb3ZkcXUJKCVyYngsJXIxMywxKSwleG1tMTMKKwltb3ZkcWEJJXhtbTEwLCV4bW0xNAorCXB4b3IJJXhtbTE1LCV4bW0xMAorCW1vdmRxdQkoJXJieCwlcjE0LDEpLCV4bW0xNQorCXB4b3IJJXhtbTEwLCV4bW0xMQorCXB4b3IJJXhtbTIsJXhtbTgKKwlweG9yCSV4bW0xMCwleG1tMgorCXB4b3IJJXhtbTExLCV4bW0xMgorCXB4b3IJJXhtbTMsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTEyLCV4bW0xMworCXB4b3IJJXhtbTQsJXhtbTgKKwlweG9yCSV4bW0xMiwleG1tNAorCXB4b3IJJXhtbTEzLCV4bW0xNAorCXB4b3IJJXhtbTUsJXhtbTgKKwlweG9yCSV4bW0xMywleG1tNQorCXB4b3IJJXhtbTE0LCV4bW0xNQorCXB4b3IJJXhtbTYsJXhtbTgKKwlweG9yCSV4bW0xNCwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTgKKwlweG9yCSV4bW0xNSwleG1tNworCW1vdnVwcwkzMiglcjExKSwleG1tMAorCisJbGVhcQkxKCVyOCksJXIxMgorCWxlYXEJMyglcjgpLCVyMTMKKwlsZWFxCTUoJXI4KSwlcjE0CisJYWRkcQkkNiwlcjgKKwlweG9yCSV4bW05LCV4bW0xMAorCWJzZnEJJXIxMiwlcjEyCisJYnNmcQklcjEzLCVyMTMKKwlic2ZxCSVyMTQsJXIxNAorCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworCXB4b3IJJXhtbTksJXhtbTExCisJcHhvcgkleG1tOSwleG1tMTIKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisJcHhvcgkleG1tOSwleG1tMTMKKwlweG9yCSV4bW05LCV4bW0xNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDkKKwltb3Z1cHMJNDgoJXIxMSksJXhtbTEKKwlweG9yCSV4bW05LCV4bW0xNQorCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCTY0KCVyMTEpLCV4bW0wCisJc2hscQkkNCwlcjEyCisJc2hscQkkNCwlcjEzCisJam1wCUwkb2NiX2VuY19sb29wNgorCisucDJhbGlnbgk1CitMJG9jYl9lbmNfbG9vcDY6CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyNDgKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpueglMJG9jYl9lbmNfbG9vcDYKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwkxNiglcjExKSwleG1tMQorCXNobHEJJDQsJXIxNAorCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIxMAorCW1vdmRxdQkoJXJieCksJXhtbTEwCisJbW92cQklcjEwLCVyYXgKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjE5CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIyOAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyMzcKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjQ2CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDI1NQorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorX19vY2JfZW5jcnlwdDQ6CisJcHhvcgkleG1tOSwleG1tMTUKKwltb3ZkcXUJKCVyYngsJXIxMiwxKSwleG1tMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0xMgorCW1vdmRxdQkoJXJieCwlcjEzLDEpLCV4bW0xMworCXB4b3IJJXhtbTE1LCV4bW0xMAorCXB4b3IJJXhtbTEwLCV4bW0xMQorCXB4b3IJJXhtbTIsJXhtbTgKKwlweG9yCSV4bW0xMCwleG1tMgorCXB4b3IJJXhtbTExLCV4bW0xMgorCXB4b3IJJXhtbTMsJXhtbTgKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTEyLCV4bW0xMworCXB4b3IJJXhtbTQsJXhtbTgKKwlweG9yCSV4bW0xMiwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTgKKwlweG9yCSV4bW0xMywleG1tNQorCW1vdnVwcwkzMiglcjExKSwleG1tMAorCisJcHhvcgkleG1tOSwleG1tMTAKKwlweG9yCSV4bW05LCV4bW0xMQorCXB4b3IJJXhtbTksJXhtbTEyCisJcHhvcgkleG1tOSwleG1tMTMKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJNDgoJXIxMSksJXhtbTEKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3Z1cHMJNjQoJXIxMSksJXhtbTAKKwlqbXAJTCRvY2JfZW5jX2xvb3A0CisKKy5wMmFsaWduCTUKK0wkb2NiX2VuY19sb29wNDoKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92dXBzCSglcmN4LCVyYXgsMSksJXhtbTEKKwlhZGRxCSQzMiwlcmF4CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92dXBzCS0xNiglcmN4LCVyYXgsMSksJXhtbTAKKwlqbnoJTCRvY2JfZW5jX2xvb3A0CisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJbW92cQklcjEwLCVyYXgKKworLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyMTAKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjEsMjE5CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIxLDIyOAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMSwyMzcKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTUKK19fb2NiX2VuY3J5cHQxOgorCXB4b3IJJXhtbTE1LCV4bW03CisJcHhvcgkleG1tOSwleG1tNworCXB4b3IJJXhtbTIsJXhtbTgKKwlweG9yCSV4bW03LCV4bW0yCisJbW92dXBzCTMyKCVyMTEpLCV4bW0wCisKKy5ieXRlCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92dXBzCTQ4KCVyMTEpLCV4bW0xCisJcHhvcgkleG1tOSwleG1tNworCisuYnl0ZQkxMDIsMTUsNTYsMjIwLDIwOAorCW1vdnVwcwk2NCglcjExKSwleG1tMAorCWptcAlMJG9jYl9lbmNfbG9vcDEKKworLnAyYWxpZ24JNQorTCRvY2JfZW5jX2xvb3AxOgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDgKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpueglMJG9jYl9lbmNfbG9vcDEKKworLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwltb3Z1cHMJMTYoJXIxMSksJXhtbTEKKwltb3ZxCSVyMTAsJXJheAorCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxNQorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzX2h3X29jYl9kZWNyeXB0CisucHJpdmF0ZV9leHRlcm4gX2Flc19od19vY2JfZGVjcnlwdAorCisucDJhbGlnbgk1CitfYWVzX2h3X29jYl9kZWNyeXB0OgorCisJbGVhcQkoJXJzcCksJXJheAorCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCW1vdnEJOCglcmF4KSwlcmJ4CisJbW92cQk4KzgoJXJheCksJXJicAorCisJbW92bAkyNDAoJXJjeCksJXIxMGQKKwltb3ZxCSVyY3gsJXIxMQorCXNobGwJJDQsJXIxMGQKKwltb3Z1cHMJKCVyY3gpLCV4bW05CisJbW92dXBzCTE2KCVyY3gsJXIxMCwxKSwleG1tMQorCisJbW92ZHF1CSglcjkpLCV4bW0xNQorCXB4b3IJJXhtbTEsJXhtbTkKKwlweG9yCSV4bW0xLCV4bW0xNQorCisJbW92bAkkMTYrMzIsJWVheAorCWxlYXEJMzIoJXIxMSwlcjEwLDEpLCVyY3gKKwltb3Z1cHMJMTYoJXIxMSksJXhtbTEKKwlzdWJxCSVyMTAsJXJheAorCW1vdnEJJXJheCwlcjEwCisKKwltb3ZkcXUJKCVyYngpLCV4bW0xMAorCW1vdmRxdQkoJXJicCksJXhtbTgKKworCXRlc3RxCSQxLCVyOAorCWpueglMJG9jYl9kZWNfb2RkCisKKwlic2ZxCSVyOCwlcjEyCisJYWRkcQkkMSwlcjgKKwlzaGxxCSQ0LCVyMTIKKwltb3ZkcXUJKCVyYngsJXIxMiwxKSwleG1tNworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKworCWNhbGwJX19vY2JfZGVjcnlwdDEKKworCW1vdmRxYQkleG1tNywleG1tMTUKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJeG9ycHMJJXhtbTIsJXhtbTgKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlzdWJxCSQxLCVyZHgKKwlqeglMJG9jYl9kZWNfZG9uZQorCitMJG9jYl9kZWNfb2RkOgorCWxlYXEJMSglcjgpLCVyMTIKKwlsZWFxCTMoJXI4KSwlcjEzCisJbGVhcQk1KCVyOCksJXIxNAorCWxlYXEJNiglcjgpLCVyOAorCWJzZnEJJXIxMiwlcjEyCisJYnNmcQklcjEzLCVyMTMKKwlic2ZxCSVyMTQsJXIxNAorCXNobHEJJDQsJXIxMgorCXNobHEJJDQsJXIxMworCXNobHEJJDQsJXIxNAorCisJc3VicQkkNiwlcmR4CisJamMJTCRvY2JfZGVjX3Nob3J0CisJam1wCUwkb2NiX2RlY19ncmFuZGxvb3AKKworLnAyYWxpZ24JNQorTCRvY2JfZGVjX2dyYW5kbG9vcDoKKwltb3ZkcXUJMCglcmRpKSwleG1tMgorCW1vdmRxdQkxNiglcmRpKSwleG1tMworCW1vdmRxdQkzMiglcmRpKSwleG1tNAorCW1vdmRxdQk0OCglcmRpKSwleG1tNQorCW1vdmRxdQk2NCglcmRpKSwleG1tNgorCW1vdmRxdQk4MCglcmRpKSwleG1tNworCWxlYXEJOTYoJXJkaSksJXJkaQorCisJY2FsbAlfX29jYl9kZWNyeXB0NgorCisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwlweG9yCSV4bW0yLCV4bW04CisJbW92dXBzCSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tOAorCW1vdnVwcwkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTQsJXhtbTgKKwltb3Z1cHMJJXhtbTUsNDgoJXJzaSkKKwlweG9yCSV4bW01LCV4bW04CisJbW92dXBzCSV4bW02LDY0KCVyc2kpCisJcHhvcgkleG1tNiwleG1tOAorCW1vdnVwcwkleG1tNyw4MCglcnNpKQorCXB4b3IJJXhtbTcsJXhtbTgKKwlsZWFxCTk2KCVyc2kpLCVyc2kKKwlzdWJxCSQ2LCVyZHgKKwlqbmMJTCRvY2JfZGVjX2dyYW5kbG9vcAorCitMJG9jYl9kZWNfc2hvcnQ6CisJYWRkcQkkNiwlcmR4CisJanoJTCRvY2JfZGVjX2RvbmUKKworCW1vdmRxdQkwKCVyZGkpLCV4bW0yCisJY21wcQkkMiwlcmR4CisJamIJTCRvY2JfZGVjX29uZQorCW1vdmRxdQkxNiglcmRpKSwleG1tMworCWplCUwkb2NiX2RlY190d28KKworCW1vdmRxdQkzMiglcmRpKSwleG1tNAorCWNtcHEJJDQsJXJkeAorCWpiCUwkb2NiX2RlY190aHJlZQorCW1vdmRxdQk0OCglcmRpKSwleG1tNQorCWplCUwkb2NiX2RlY19mb3VyCisKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisKKwljYWxsCV9fb2NiX2RlY3J5cHQ2CisKKwltb3ZkcWEJJXhtbTE0LCV4bW0xNQorCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJcHhvcgkleG1tMiwleG1tOAorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTgKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW04CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tOAorCW1vdnVwcwkleG1tNiw2NCglcnNpKQorCXB4b3IJJXhtbTYsJXhtbTgKKworCWptcAlMJG9jYl9kZWNfZG9uZQorCisucDJhbGlnbgk0CitMJG9jYl9kZWNfb25lOgorCW1vdmRxYQkleG1tMTAsJXhtbTcKKworCWNhbGwJX19vY2JfZGVjcnlwdDEKKworCW1vdmRxYQkleG1tNywleG1tMTUKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCXhvcnBzCSV4bW0yLCV4bW04CisJam1wCUwkb2NiX2RlY19kb25lCisKKy5wMmFsaWduCTQKK0wkb2NiX2RlY190d286CisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKworCWNhbGwJX19vY2JfZGVjcnlwdDQKKworCW1vdmRxYQkleG1tMTEsJXhtbTE1CisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwl4b3JwcwkleG1tMiwleG1tOAorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXhvcnBzCSV4bW0zLCV4bW04CisKKwlqbXAJTCRvY2JfZGVjX2RvbmUKKworLnAyYWxpZ24JNAorTCRvY2JfZGVjX3RocmVlOgorCXB4b3IJJXhtbTUsJXhtbTUKKworCWNhbGwJX19vY2JfZGVjcnlwdDQKKworCW1vdmRxYQkleG1tMTIsJXhtbTE1CisJbW92dXBzCSV4bW0yLDAoJXJzaSkKKwl4b3JwcwkleG1tMiwleG1tOAorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXhvcnBzCSV4bW0zLCV4bW04CisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJeG9ycHMJJXhtbTQsJXhtbTgKKworCWptcAlMJG9jYl9kZWNfZG9uZQorCisucDJhbGlnbgk0CitMJG9jYl9kZWNfZm91cjoKKwljYWxsCV9fb2NiX2RlY3J5cHQ0CisKKwltb3ZkcWEJJXhtbTEzLCV4bW0xNQorCW1vdnVwcwkleG1tMiwwKCVyc2kpCisJcHhvcgkleG1tMiwleG1tOAorCW1vdnVwcwkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTgKKwltb3Z1cHMJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW04CisJbW92dXBzCSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tOAorCitMJG9jYl9kZWNfZG9uZToKKwlweG9yCSV4bW0wLCV4bW0xNQorCW1vdmRxdQkleG1tOCwoJXJicCkKKwltb3ZkcXUJJXhtbTE1LCglcjkpCisKKwl4b3JwcwkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwlweG9yCSV4bW04LCV4bW04CisJcHhvcgkleG1tOSwleG1tOQorCXB4b3IJJXhtbTEwLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0xMQorCXB4b3IJJXhtbTEyLCV4bW0xMgorCXB4b3IJJXhtbTEzLCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCXB4b3IJJXhtbTE1LCV4bW0xNQorCWxlYXEJNDAoJXJzcCksJXJheAorCisJbW92cQktNDAoJXJheCksJXIxNAorCisJbW92cQktMzIoJXJheCksJXIxMworCisJbW92cQktMjQoJXJheCksJXIxMgorCisJbW92cQktMTYoJXJheCksJXJicAorCisJbW92cQktOCglcmF4KSwlcmJ4CisKKwlsZWFxCSglcmF4KSwlcnNwCisKK0wkb2NiX2RlY19lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworLnAyYWxpZ24JNQorX19vY2JfZGVjcnlwdDY6CisJcHhvcgkleG1tOSwleG1tMTUKKwltb3ZkcXUJKCVyYngsJXIxMiwxKSwleG1tMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0xMgorCW1vdmRxdQkoJXJieCwlcjEzLDEpLCV4bW0xMworCW1vdmRxYQkleG1tMTAsJXhtbTE0CisJcHhvcgkleG1tMTUsJXhtbTEwCisJbW92ZHF1CSglcmJ4LCVyMTQsMSksJXhtbTE1CisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTEyLCV4bW0xMworCXB4b3IJJXhtbTEyLCV4bW00CisJcHhvcgkleG1tMTMsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTUKKwlweG9yCSV4bW0xNCwleG1tMTUKKwlweG9yCSV4bW0xNCwleG1tNgorCXB4b3IJJXhtbTE1LCV4bW03CisJbW92dXBzCTMyKCVyMTEpLCV4bW0wCisKKwlsZWFxCTEoJXI4KSwlcjEyCisJbGVhcQkzKCVyOCksJXIxMworCWxlYXEJNSglcjgpLCVyMTQKKwlhZGRxCSQ2LCVyOAorCXB4b3IJJXhtbTksJXhtbTEwCisJYnNmcQklcjEyLCVyMTIKKwlic2ZxCSVyMTMsJXIxMworCWJzZnEJJXIxNCwlcjE0CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJcHhvcgkleG1tOSwleG1tMTEKKwlweG9yCSV4bW05LCV4bW0xMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKwlweG9yCSV4bW05LCV4bW0xMworCXB4b3IJJXhtbTksJXhtbTE0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwk0OCglcjExKSwleG1tMQorCXB4b3IJJXhtbTksJXhtbTE1CisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDgKKwltb3Z1cHMJNjQoJXIxMSksJXhtbTAKKwlzaGxxCSQ0LCVyMTIKKwlzaGxxCSQ0LCVyMTMKKwlqbXAJTCRvY2JfZGVjX2xvb3A2CisKKy5wMmFsaWduCTUKK0wkb2NiX2RlY19sb29wNjoKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CUwkb2NiX2RlY19sb29wNgorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCTE2KCVyMTEpLCV4bW0xCisJc2hscQkkNCwlcjE0CisKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjEwCisJbW92ZHF1CSglcmJ4KSwleG1tMTAKKwltb3ZxCSVyMTAsJXJheAorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMTkKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjI4CisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIzLDIzNworLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyNDYKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjU1CisJLmJ5dGUJMHhmMywweGMzCisKKworCisucDJhbGlnbgk1CitfX29jYl9kZWNyeXB0NDoKKwlweG9yCSV4bW05LCV4bW0xNQorCW1vdmRxdQkoJXJieCwlcjEyLDEpLCV4bW0xMQorCW1vdmRxYQkleG1tMTAsJXhtbTEyCisJbW92ZHF1CSglcmJ4LCVyMTMsMSksJXhtbTEzCisJcHhvcgkleG1tMTUsJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTEyLCV4bW0xMworCXB4b3IJJXhtbTEyLCV4bW00CisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3Z1cHMJMzIoJXIxMSksJXhtbTAKKworCXB4b3IJJXhtbTksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMTEKKwlweG9yCSV4bW05LCV4bW0xMgorCXB4b3IJJXhtbTksJXhtbTEzCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCTQ4KCVyMTEpLCV4bW0xCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisJbW92dXBzCTY0KCVyMTEpLCV4bW0wCisJam1wCUwkb2NiX2RlY19sb29wNAorCisucDJhbGlnbgk1CitMJG9jYl9kZWNfbG9vcDQ6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworCW1vdnVwcwkoJXJjeCwlcmF4LDEpLCV4bW0xCisJYWRkcQkkMzIsJXJheAorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorCW1vdnVwcwktMTYoJXJjeCwlcmF4LDEpLCV4bW0wCisJam56CUwkb2NiX2RlY19sb29wNAorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworCW1vdnVwcwkxNiglcjExKSwleG1tMQorCW1vdnEJJXIxMCwlcmF4CisKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjEwCisuYnl0ZQkxMDIsNjUsMTUsNTYsMjIzLDIxOQorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMjgKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjM3CisJLmJ5dGUJMHhmMywweGMzCisKKworCisucDJhbGlnbgk1CitfX29jYl9kZWNyeXB0MToKKwlweG9yCSV4bW0xNSwleG1tNworCXB4b3IJJXhtbTksJXhtbTcKKwlweG9yCSV4bW03LCV4bW0yCisJbW92dXBzCTMyKCVyMTEpLCV4bW0wCisKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisJbW92dXBzCTQ4KCVyMTEpLCV4bW0xCisJcHhvcgkleG1tOSwleG1tNworCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorCW1vdnVwcwk2NCglcjExKSwleG1tMAorCWptcAlMJG9jYl9kZWNfbG9vcDEKKworLnAyYWxpZ24JNQorTCRvY2JfZGVjX2xvb3AxOgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwltb3Z1cHMJKCVyY3gsJXJheCwxKSwleG1tMQorCWFkZHEJJDMyLCVyYXgKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKwltb3Z1cHMJLTE2KCVyY3gsJXJheCwxKSwleG1tMAorCWpueglMJG9jYl9kZWNfbG9vcDEKKworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKwltb3Z1cHMJMTYoJXIxMSksJXhtbTEKKwltb3ZxCSVyMTAsJXJheAorCisuYnl0ZQkxMDIsMTUsNTYsMjIzLDIxNQorCS5ieXRlCTB4ZjMsMHhjMworCisuZ2xvYmwJX2Flc19od19jYmNfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuIF9hZXNfaHdfY2JjX2VuY3J5cHQKKworLnAyYWxpZ24JNAorX2Flc19od19jYmNfZW5jcnlwdDoKKworCXRlc3RxCSVyZHgsJXJkeAorCWp6CUwkY2JjX3JldAorCisJbW92bAkyNDAoJXJjeCksJXIxMGQKKwltb3ZxCSVyY3gsJXIxMQorCXRlc3RsCSVyOWQsJXI5ZAorCWp6CUwkY2JjX2RlY3J5cHQKKworCW1vdnVwcwkoJXI4KSwleG1tMgorCW1vdmwJJXIxMGQsJWVheAorCWNtcHEJJDE2LCVyZHgKKwlqYglMJGNiY19lbmNfdGFpbAorCXN1YnEJJDE2LCVyZHgKKwlqbXAJTCRjYmNfZW5jX2xvb3AKKy5wMmFsaWduCTQKK0wkY2JjX2VuY19sb29wOgorCW1vdnVwcwkoJXJkaSksJXhtbTMKKwlsZWFxCTE2KCVyZGkpLCVyZGkKKworCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3Z1cHMJMTYoJXJjeCksJXhtbTEKKwl4b3JwcwkleG1tMCwleG1tMworCWxlYXEJMzIoJXJjeCksJXJjeAorCXhvcnBzCSV4bW0zLCV4bW0yCitMJG9vcF9lbmMxXzE1OgorLmJ5dGUJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWNsCSVlYXgKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CUwkb29wX2VuYzFfMTUKKy5ieXRlCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92bAklcjEwZCwlZWF4CisJbW92cQklcjExLCVyY3gKKwltb3Z1cHMJJXhtbTIsMCglcnNpKQorCWxlYXEJMTYoJXJzaSksJXJzaQorCXN1YnEJJDE2LCVyZHgKKwlqbmMJTCRjYmNfZW5jX2xvb3AKKwlhZGRxCSQxNiwlcmR4CisJam56CUwkY2JjX2VuY190YWlsCisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTIsKCVyOCkKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCWptcAlMJGNiY19yZXQKKworTCRjYmNfZW5jX3RhaWw6CisJbW92cQklcmR4LCVyY3gKKwl4Y2hncQklcmRpLCVyc2kKKy5sb25nCTB4OTA2NkE0RjMKKwltb3ZsCSQxNiwlZWN4CisJc3VicQklcmR4LCVyY3gKKwl4b3JsCSVlYXgsJWVheAorLmxvbmcJMHg5MDY2QUFGMworCWxlYXEJLTE2KCVyZGkpLCVyZGkKKwltb3ZsCSVyMTBkLCVlYXgKKwltb3ZxCSVyZGksJXJzaQorCW1vdnEJJXIxMSwlcmN4CisJeG9ycQklcmR4LCVyZHgKKwlqbXAJTCRjYmNfZW5jX2xvb3AKKworLnAyYWxpZ24JNAorTCRjYmNfZGVjcnlwdDoKKwljbXBxCSQxNiwlcmR4CisJam5lCUwkY2JjX2RlY3J5cHRfYnVsaworCisKKworCW1vdmRxdQkoJXJkaSksJXhtbTIKKwltb3ZkcXUJKCVyOCksJXhtbTMKKwltb3ZkcWEJJXhtbTIsJXhtbTQKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wkb29wX2RlYzFfMTY6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJXIxMGQKKwltb3Z1cHMJKCVyY3gpLCV4bW0xCisJbGVhcQkxNiglcmN4KSwlcmN4CisJam56CUwkb29wX2RlYzFfMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjMsMjA5CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3ZkcXUJJXhtbTQsKCVyOCkKKwl4b3JwcwkleG1tMywleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3Z1cHMJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMiwleG1tMgorCWptcAlMJGNiY19yZXQKKy5wMmFsaWduCTQKK0wkY2JjX2RlY3J5cHRfYnVsazoKKwlsZWFxCSglcnNwKSwlcjExCisKKwlwdXNocQklcmJwCisKKwlzdWJxCSQxNiwlcnNwCisJYW5kcQkkLTE2LCVyc3AKKwltb3ZxCSVyY3gsJXJicAorCW1vdnVwcwkoJXI4KSwleG1tMTAKKwltb3ZsCSVyMTBkLCVlYXgKKwljbXBxCSQweDUwLCVyZHgKKwlqYmUJTCRjYmNfZGVjX3RhaWwKKworCW1vdnVwcwkoJXJjeCksJXhtbTAKKwltb3ZkcXUJMCglcmRpKSwleG1tMgorCW1vdmRxdQkxNiglcmRpKSwleG1tMworCW1vdmRxYQkleG1tMiwleG1tMTEKKwltb3ZkcXUJMzIoJXJkaSksJXhtbTQKKwltb3ZkcWEJJXhtbTMsJXhtbTEyCisJbW92ZHF1CTQ4KCVyZGkpLCV4bW01CisJbW92ZHFhCSV4bW00LCV4bW0xMworCW1vdmRxdQk2NCglcmRpKSwleG1tNgorCW1vdmRxYQkleG1tNSwleG1tMTQKKwltb3ZkcXUJODAoJXJkaSksJXhtbTcKKwltb3ZkcWEJJXhtbTYsJXhtbTE1CisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXI5CisJbW92bAk0KCVyOSksJXI5ZAorCWNtcHEJJDB4NzAsJXJkeAorCWpiZQlMJGNiY19kZWNfc2l4X29yX3NldmVuCisKKwlhbmRsCSQ3MTMwMzE2OCwlcjlkCisJc3VicQkkMHg1MCwlcmR4CisJY21wbAkkNDE5NDMwNCwlcjlkCisJamUJTCRjYmNfZGVjX2xvb3A2X2VudGVyCisJc3VicQkkMHgyMCwlcmR4CisJbGVhcQkxMTIoJXJjeCksJXJjeAorCWptcAlMJGNiY19kZWNfbG9vcDhfZW50ZXIKKy5wMmFsaWduCTQKK0wkY2JjX2RlY19sb29wODoKKwltb3Z1cHMJJXhtbTksKCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCitMJGNiY19kZWNfbG9vcDhfZW50ZXI6CisJbW92ZHF1CTk2KCVyZGkpLCV4bW04CisJcHhvcgkleG1tMCwleG1tMgorCW1vdmRxdQkxMTIoJXJkaSksJXhtbTkKKwlweG9yCSV4bW0wLCV4bW0zCisJbW92dXBzCTE2LTExMiglcmN4KSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwltb3ZxCSQtMSwlcmJwCisJY21wcQkkMHg3MCwlcmR4CisJcHhvcgkleG1tMCwleG1tNQorCXB4b3IJJXhtbTAsJXhtbTYKKwlweG9yCSV4bW0wLCV4bW03CisJcHhvcgkleG1tMCwleG1tOAorCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCXB4b3IJJXhtbTAsJXhtbTkKKwltb3Z1cHMJMzItMTEyKCVyY3gpLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkzCisJYWRjcQkkMCwlcmJwCisJYW5kcQkkMTI4LCVyYnAKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisJYWRkcQklcmRpLCVyYnAKKwltb3Z1cHMJNDgtMTEyKCVyY3gpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJNjQtMTEyKCVyY3gpLCV4bW0wCisJbm9wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwltb3Z1cHMJODAtMTEyKCVyY3gpLCV4bW0xCisJbm9wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJOTYtMTEyKCVyY3gpLCV4bW0wCisJbm9wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI1CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDEKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwltb3Z1cHMJMTEyLTExMiglcmN4KSwleG1tMQorCW5vcAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAwCisJbW92dXBzCTEyOC0xMTIoJXJjeCksJXhtbTAKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMQorCW1vdnVwcwkxNDQtMTEyKCVyY3gpLCV4bW0xCisJY21wbAkkMTEsJWVheAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDgKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE2CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzIKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQwCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OAorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTIKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAwCisJbW92dXBzCTE2MC0xMTIoJXJjeCksJXhtbTAKKwlqYglMJGNiY19kZWNfZG9uZQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMDkKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjE3CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQxCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0OQorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwxOTMKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisJbW92dXBzCTE3Ni0xMTIoJXJjeCksJXhtbTEKKwlub3AKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA4CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjQKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMyCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDgKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkyCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMAorCW1vdnVwcwkxOTItMTEyKCVyY3gpLCV4bW0wCisJamUJTCRjYmNfZGVjX2RvbmUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjA5CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIxNworLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMjUKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjMzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKy5ieXRlCTEwMiw2OCwxNSw1NiwyMjIsMTkzCisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDIwMQorCW1vdnVwcwkyMDgtMTEyKCVyY3gpLCV4bW0xCisJbm9wCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOAorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTYKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjI0CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIzMgorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDAKKy5ieXRlCTEwMiwxNSw1NiwyMjIsMjQ4CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MgorLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJMjI0LTExMiglcmN4KSwleG1tMAorCWptcAlMJGNiY19kZWNfZG9uZQorLnAyYWxpZ24JNAorTCRjYmNfZGVjX2RvbmU6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMTcKKwlweG9yCSV4bW0wLCV4bW0xMAorCXB4b3IJJXhtbTAsJXhtbTExCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIyNQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyMzMKKwlweG9yCSV4bW0wLCV4bW0xMgorCXB4b3IJJXhtbTAsJXhtbTEzCisuYnl0ZQkxMDIsMTUsNTYsMjIyLDI0MQorLmJ5dGUJMTAyLDE1LDU2LDIyMiwyNDkKKwlweG9yCSV4bW0wLCV4bW0xNAorCXB4b3IJJXhtbTAsJXhtbTE1CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIyLDE5MworLmJ5dGUJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwltb3ZkcXUJODAoJXJkaSksJXhtbTEKKworLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMTAKKwltb3ZkcXUJOTYoJXJkaSksJXhtbTEwCisJcHhvcgkleG1tMCwleG1tMQorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMTkKKwlweG9yCSV4bW0wLCV4bW0xMAorCW1vdmRxdQkxMTIoJXJkaSksJXhtbTAKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjI4CisJbGVhcQkxMjgoJXJkaSksJXJkaQorCW1vdmRxdQkwKCVyYnApLCV4bW0xMQorLmJ5dGUJMTAyLDY1LDE1LDU2LDIyMywyMzcKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjQ2CisJbW92ZHF1CTE2KCVyYnApLCV4bW0xMgorCW1vdmRxdQkzMiglcmJwKSwleG1tMTMKKy5ieXRlCTEwMiw2NSwxNSw1NiwyMjMsMjU1CisuYnl0ZQkxMDIsNjgsMTUsNTYsMjIzLDE5MworCW1vdmRxdQk0OCglcmJwKSwleG1tMTQKKwltb3ZkcXUJNjQoJXJicCksJXhtbTE1CisuYnl0ZQkxMDIsNjksMTUsNTYsMjIzLDIwMgorCW1vdmRxYQkleG1tMCwleG1tMTAKKwltb3ZkcXUJODAoJXJicCksJXhtbTEKKwltb3Z1cHMJLTExMiglcmN4KSwleG1tMAorCisJbW92dXBzCSV4bW0yLCglcnNpKQorCW1vdmRxYQkleG1tMTEsJXhtbTIKKwltb3Z1cHMJJXhtbTMsMTYoJXJzaSkKKwltb3ZkcWEJJXhtbTEyLCV4bW0zCisJbW92dXBzCSV4bW00LDMyKCVyc2kpCisJbW92ZHFhCSV4bW0xMywleG1tNAorCW1vdnVwcwkleG1tNSw0OCglcnNpKQorCW1vdmRxYQkleG1tMTQsJXhtbTUKKwltb3Z1cHMJJXhtbTYsNjQoJXJzaSkKKwltb3ZkcWEJJXhtbTE1LCV4bW02CisJbW92dXBzCSV4bW03LDgwKCVyc2kpCisJbW92ZHFhCSV4bW0xLCV4bW03CisJbW92dXBzCSV4bW04LDk2KCVyc2kpCisJbGVhcQkxMTIoJXJzaSksJXJzaQorCisJc3VicQkkMHg4MCwlcmR4CisJamEJTCRjYmNfZGVjX2xvb3A4CisKKwltb3ZhcHMJJXhtbTksJXhtbTIKKwlsZWFxCS0xMTIoJXJjeCksJXJjeAorCWFkZHEJJDB4NzAsJXJkeAorCWpsZQlMJGNiY19kZWNfY2xlYXJfdGFpbF9jb2xsZWN0ZWQKKwltb3Z1cHMJJXhtbTksKCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJY21wcQkkMHg1MCwlcmR4CisJamJlCUwkY2JjX2RlY190YWlsCisKKwltb3ZhcHMJJXhtbTExLCV4bW0yCitMJGNiY19kZWNfc2l4X29yX3NldmVuOgorCWNtcHEJJDB4NjAsJXJkeAorCWphCUwkY2JjX2RlY19zZXZlbgorCisJbW92YXBzCSV4bW03LCV4bW04CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmFwcwkleG1tOCwleG1tMTAKKwlweG9yCSV4bW0xMSwleG1tMworCW1vdmRxdQkleG1tMiwoJXJzaSkKKwlweG9yCSV4bW0xMiwleG1tNAorCW1vdmRxdQkleG1tMywxNiglcnNpKQorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW0xMywleG1tNQorCW1vdmRxdQkleG1tNCwzMiglcnNpKQorCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW0xNCwleG1tNgorCW1vdmRxdQkleG1tNSw0OCglcnNpKQorCXB4b3IJJXhtbTUsJXhtbTUKKwlweG9yCSV4bW0xNSwleG1tNworCW1vdmRxdQkleG1tNiw2NCglcnNpKQorCXB4b3IJJXhtbTYsJXhtbTYKKwlsZWFxCTgwKCVyc2kpLCVyc2kKKwltb3ZkcWEJJXhtbTcsJXhtbTIKKwlweG9yCSV4bW03LCV4bW03CisJam1wCUwkY2JjX2RlY190YWlsX2NvbGxlY3RlZAorCisucDJhbGlnbgk0CitMJGNiY19kZWNfc2V2ZW46CisJbW92dXBzCTk2KCVyZGkpLCV4bW04CisJeG9ycHMJJXhtbTksJXhtbTkKKwljYWxsCV9hZXNuaV9kZWNyeXB0OAorCW1vdnVwcwk4MCglcmRpKSwleG1tOQorCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92dXBzCTk2KCVyZGkpLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTE0LCV4bW02CisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTE1LCV4bW03CisJbW92ZHF1CSV4bW02LDY0KCVyc2kpCisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTksJXhtbTgKKwltb3ZkcXUJJXhtbTcsODAoJXJzaSkKKwlweG9yCSV4bW03LCV4bW03CisJbGVhcQk5NiglcnNpKSwlcnNpCisJbW92ZHFhCSV4bW04LCV4bW0yCisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKKwlqbXAJTCRjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisKKy5wMmFsaWduCTQKK0wkY2JjX2RlY19sb29wNjoKKwltb3Z1cHMJJXhtbTcsKCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisJbW92ZHF1CTAoJXJkaSksJXhtbTIKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTMKKwltb3ZkcWEJJXhtbTIsJXhtbTExCisJbW92ZHF1CTMyKCVyZGkpLCV4bW00CisJbW92ZHFhCSV4bW0zLCV4bW0xMgorCW1vdmRxdQk0OCglcmRpKSwleG1tNQorCW1vdmRxYQkleG1tNCwleG1tMTMKKwltb3ZkcXUJNjQoJXJkaSksJXhtbTYKKwltb3ZkcWEJJXhtbTUsJXhtbTE0CisJbW92ZHF1CTgwKCVyZGkpLCV4bW03CisJbW92ZHFhCSV4bW02LCV4bW0xNQorTCRjYmNfZGVjX2xvb3A2X2VudGVyOgorCWxlYXEJOTYoJXJkaSksJXJkaQorCW1vdmRxYQkleG1tNywleG1tOAorCisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKworCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW04LCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW0xNCwleG1tNgorCW1vdnEJJXJicCwlcmN4CisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tMTUsJXhtbTcKKwltb3ZsCSVyMTBkLCVlYXgKKwltb3ZkcXUJJXhtbTYsNjQoJXJzaSkKKwlsZWFxCTgwKCVyc2kpLCVyc2kKKwlzdWJxCSQweDYwLCVyZHgKKwlqYQlMJGNiY19kZWNfbG9vcDYKKworCW1vdmRxYQkleG1tNywleG1tMgorCWFkZHEJJDB4NTAsJXJkeAorCWpsZQlMJGNiY19kZWNfY2xlYXJfdGFpbF9jb2xsZWN0ZWQKKwltb3Z1cHMJJXhtbTcsKCVyc2kpCisJbGVhcQkxNiglcnNpKSwlcnNpCisKK0wkY2JjX2RlY190YWlsOgorCW1vdnVwcwkoJXJkaSksJXhtbTIKKwlzdWJxCSQweDEwLCVyZHgKKwlqYmUJTCRjYmNfZGVjX29uZQorCisJbW92dXBzCTE2KCVyZGkpLCV4bW0zCisJbW92YXBzCSV4bW0yLCV4bW0xMQorCXN1YnEJJDB4MTAsJXJkeAorCWpiZQlMJGNiY19kZWNfdHdvCisKKwltb3Z1cHMJMzIoJXJkaSksJXhtbTQKKwltb3ZhcHMJJXhtbTMsJXhtbTEyCisJc3VicQkkMHgxMCwlcmR4CisJamJlCUwkY2JjX2RlY190aHJlZQorCisJbW92dXBzCTQ4KCVyZGkpLCV4bW01CisJbW92YXBzCSV4bW00LCV4bW0xMworCXN1YnEJJDB4MTAsJXJkeAorCWpiZQlMJGNiY19kZWNfZm91cgorCisJbW92dXBzCTY0KCVyZGkpLCV4bW02CisJbW92YXBzCSV4bW01LCV4bW0xNAorCW1vdmFwcwkleG1tNiwleG1tMTUKKwl4b3JwcwkleG1tNywleG1tNworCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZhcHMJJXhtbTE1LCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTEzLCV4bW01CisJbW92ZHF1CSV4bW00LDMyKCVyc2kpCisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTE0LCV4bW02CisJbW92ZHF1CSV4bW01LDQ4KCVyc2kpCisJcHhvcgkleG1tNSwleG1tNQorCWxlYXEJNjQoJXJzaSksJXJzaQorCW1vdmRxYQkleG1tNiwleG1tMgorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJc3VicQkkMHgxMCwlcmR4CisJam1wCUwkY2JjX2RlY190YWlsX2NvbGxlY3RlZAorCisucDJhbGlnbgk0CitMJGNiY19kZWNfb25lOgorCW1vdmFwcwkleG1tMiwleG1tMTEKKwltb3Z1cHMJKCVyY3gpLCV4bW0wCisJbW92dXBzCTE2KCVyY3gpLCV4bW0xCisJbGVhcQkzMiglcmN4KSwlcmN4CisJeG9ycHMJJXhtbTAsJXhtbTIKK0wkb29wX2RlYzFfMTc6CisuYnl0ZQkxMDIsMTUsNTYsMjIyLDIwOQorCWRlY2wJJWVheAorCW1vdnVwcwkoJXJjeCksJXhtbTEKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwlqbnoJTCRvb3BfZGVjMV8xNworLmJ5dGUJMTAyLDE1LDU2LDIyMywyMDkKKwl4b3JwcwkleG1tMTAsJXhtbTIKKwltb3ZhcHMJJXhtbTExLCV4bW0xMAorCWptcAlMJGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKy5wMmFsaWduCTQKK0wkY2JjX2RlY190d286CisJbW92YXBzCSV4bW0zLCV4bW0xMgorCWNhbGwJX2Flc25pX2RlY3J5cHQyCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZhcHMJJXhtbTEyLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCW1vdmRxYQkleG1tMywleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlsZWFxCTE2KCVyc2kpLCVyc2kKKwlqbXAJTCRjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisucDJhbGlnbgk0CitMJGNiY19kZWNfdGhyZWU6CisJbW92YXBzCSV4bW00LCV4bW0xMworCWNhbGwJX2Flc25pX2RlY3J5cHQzCisJcHhvcgkleG1tMTAsJXhtbTIKKwltb3ZhcHMJJXhtbTEzLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CSV4bW0zLDE2KCVyc2kpCisJcHhvcgkleG1tMywleG1tMworCW1vdmRxYQkleG1tNCwleG1tMgorCXB4b3IJJXhtbTQsJXhtbTQKKwlsZWFxCTMyKCVyc2kpLCVyc2kKKwlqbXAJTCRjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisucDJhbGlnbgk0CitMJGNiY19kZWNfZm91cjoKKwltb3ZhcHMJJXhtbTUsJXhtbTE0CisJY2FsbAlfYWVzbmlfZGVjcnlwdDQKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmFwcwkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsKCVyc2kpCisJcHhvcgkleG1tMTIsJXhtbTQKKwltb3ZkcXUJJXhtbTMsMTYoJXJzaSkKKwlweG9yCSV4bW0zLCV4bW0zCisJcHhvcgkleG1tMTMsJXhtbTUKKwltb3ZkcXUJJXhtbTQsMzIoJXJzaSkKKwlweG9yCSV4bW00LCV4bW00CisJbW92ZHFhCSV4bW01LCV4bW0yCisJcHhvcgkleG1tNSwleG1tNQorCWxlYXEJNDgoJXJzaSksJXJzaQorCWptcAlMJGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKworLnAyYWxpZ24JNAorTCRjYmNfZGVjX2NsZWFyX3RhaWxfY29sbGVjdGVkOgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJcHhvcgkleG1tOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTkKK0wkY2JjX2RlY190YWlsX2NvbGxlY3RlZDoKKwltb3Z1cHMJJXhtbTEwLCglcjgpCisJYW5kcQkkMTUsJXJkeAorCWpueglMJGNiY19kZWNfdGFpbF9wYXJ0aWFsCisJbW92dXBzCSV4bW0yLCglcnNpKQorCXB4b3IJJXhtbTIsJXhtbTIKKwlqbXAJTCRjYmNfZGVjX3JldAorLnAyYWxpZ24JNAorTCRjYmNfZGVjX3RhaWxfcGFydGlhbDoKKwltb3ZhcHMJJXhtbTIsKCVyc3ApCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnEJJDE2LCVyY3gKKwltb3ZxCSVyc2ksJXJkaQorCXN1YnEJJXJkeCwlcmN4CisJbGVhcQkoJXJzcCksJXJzaQorLmxvbmcJMHg5MDY2QTRGMworCW1vdmRxYQkleG1tMiwoJXJzcCkKKworTCRjYmNfZGVjX3JldDoKKwl4b3JwcwkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3ZxCS04KCVyMTEpLCVyYnAKKworCWxlYXEJKCVyMTEpLCVyc3AKKworTCRjYmNfcmV0OgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYWVzX2h3X3NldF9kZWNyeXB0X2tleQorLnByaXZhdGVfZXh0ZXJuIF9hZXNfaHdfc2V0X2RlY3J5cHRfa2V5CisKKy5wMmFsaWduCTQKK19hZXNfaHdfc2V0X2RlY3J5cHRfa2V5OgorCisuYnl0ZQkweDQ4LDB4ODMsMHhFQywweDA4CisKKwljYWxsCV9fYWVzbmlfc2V0X2VuY3J5cHRfa2V5CisJc2hsbAkkNCwlZXNpCisJdGVzdGwJJWVheCwlZWF4CisJam56CUwkZGVjX2tleV9yZXQKKwlsZWFxCTE2KCVyZHgsJXJzaSwxKSwlcmRpCisKKwltb3Z1cHMJKCVyZHgpLCV4bW0wCisJbW92dXBzCSglcmRpKSwleG1tMQorCW1vdnVwcwkleG1tMCwoJXJkaSkKKwltb3Z1cHMJJXhtbTEsKCVyZHgpCisJbGVhcQkxNiglcmR4KSwlcmR4CisJbGVhcQktMTYoJXJkaSksJXJkaQorCitMJGRlY19rZXlfaW52ZXJzZToKKwltb3Z1cHMJKCVyZHgpLCV4bW0wCisJbW92dXBzCSglcmRpKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDIxOSwxOTIKKy5ieXRlCTEwMiwxNSw1NiwyMTksMjAxCisJbGVhcQkxNiglcmR4KSwlcmR4CisJbGVhcQktMTYoJXJkaSksJXJkaQorCW1vdnVwcwkleG1tMCwxNiglcmRpKQorCW1vdnVwcwkleG1tMSwtMTYoJXJkeCkKKwljbXBxCSVyZHgsJXJkaQorCWphCUwkZGVjX2tleV9pbnZlcnNlCisKKwltb3Z1cHMJKCVyZHgpLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMjE5LDE5MgorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3Z1cHMJJXhtbTAsKCVyZGkpCisJcHhvcgkleG1tMCwleG1tMAorTCRkZWNfa2V5X3JldDoKKwlhZGRxCSQ4LCVyc3AKKworCS5ieXRlCTB4ZjMsMHhjMworCitMJFNFSF9lbmRfc2V0X2RlY3J5cHRfa2V5OgorCisuZ2xvYmwJX2Flc19od19zZXRfZW5jcnlwdF9rZXkKKy5wcml2YXRlX2V4dGVybiBfYWVzX2h3X3NldF9lbmNyeXB0X2tleQorCisucDJhbGlnbgk0CitfYWVzX2h3X3NldF9lbmNyeXB0X2tleToKK19fYWVzbmlfc2V0X2VuY3J5cHRfa2V5OgorCisuYnl0ZQkweDQ4LDB4ODMsMHhFQywweDA4CisKKwltb3ZxCSQtMSwlcmF4CisJdGVzdHEJJXJkaSwlcmRpCisJanoJTCRlbmNfa2V5X3JldAorCXRlc3RxCSVyZHgsJXJkeAorCWp6CUwkZW5jX2tleV9yZXQKKworCW1vdnVwcwkoJXJkaSksJXhtbTAKKwl4b3JwcwkleG1tNCwleG1tNAorCWxlYXEJX09QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTAKKwltb3ZsCTQoJXIxMCksJXIxMGQKKwlhbmRsCSQyNjg0Mzc1MDQsJXIxMGQKKwlsZWFxCTE2KCVyZHgpLCVyYXgKKwljbXBsCSQyNTYsJWVzaQorCWplCUwkMTRyb3VuZHMKKwljbXBsCSQxOTIsJWVzaQorCWplCUwkMTJyb3VuZHMKKwljbXBsCSQxMjgsJWVzaQorCWpuZQlMJGJhZF9rZXliaXRzCisKK0wkMTByb3VuZHM6CisJbW92bAkkOSwlZXNpCisJY21wbAkkMjY4NDM1NDU2LCVyMTBkCisJamUJTCQxMHJvdW5kc19hbHQKKworCW1vdnVwcwkleG1tMCwoJXJkeCkKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDEKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8xMjhfY29sZAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMgorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsNAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsOAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMTYKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8xMjgKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDMyCisJY2FsbAlMJGtleV9leHBhbnNpb25fMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCw2NAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMTI4CisJY2FsbAlMJGtleV9leHBhbnNpb25fMTI4CisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwyNworCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzEyOAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsNTQKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8xMjgKKwltb3Z1cHMJJXhtbTAsKCVyYXgpCisJbW92bAklZXNpLDgwKCVyYXgpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJTCRlbmNfa2V5X3JldAorCisucDJhbGlnbgk0CitMJDEwcm91bmRzX2FsdDoKKwltb3ZkcWEJTCRrZXlfcm90YXRlKCVyaXApLCV4bW01CisJbW92bAkkOCwlcjEwZAorCW1vdmRxYQlMJGtleV9yY29uMSglcmlwKSwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMgorCW1vdmRxdQkleG1tMCwoJXJkeCkKKwlqbXAJTCRvb3Bfa2V5MTI4CisKKy5wMmFsaWduCTQKK0wkb29wX2tleTEyODoKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDIyMSwxOTYKKwlwc2xsZAkkMSwleG1tNAorCWxlYXEJMTYoJXJheCksJXJheAorCisJbW92ZHFhCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0zLCV4bW0yCisKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHF1CSV4bW0wLC0xNiglcmF4KQorCW1vdmRxYQkleG1tMCwleG1tMgorCisJZGVjbAklcjEwZAorCWpueglMJG9vcF9rZXkxMjgKKworCW1vdmRxYQlMJGtleV9yY29uMWIoJXJpcCksJXhtbTQKKworLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMjIxLDE5NgorCXBzbGxkCSQxLCV4bW00CisKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTIKKworCXB4b3IJJXhtbTIsJXhtbTAKKwltb3ZkcXUJJXhtbTAsKCVyYXgpCisKKwltb3ZkcWEJJXhtbTAsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDIyMSwxOTYKKworCW1vdmRxYQkleG1tMiwleG1tMworCXBzbGxkcQkkNCwleG1tMgorCXB4b3IJJXhtbTIsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTIKKwlweG9yCSV4bW0yLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0yCisJcHhvcgkleG1tMywleG1tMgorCisJcHhvcgkleG1tMiwleG1tMAorCW1vdmRxdQkleG1tMCwxNiglcmF4KQorCisJbW92bAklZXNpLDk2KCVyYXgpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJTCRlbmNfa2V5X3JldAorCisucDJhbGlnbgk0CitMJDEycm91bmRzOgorCW1vdnEJMTYoJXJkaSksJXhtbTIKKwltb3ZsCSQxMSwlZXNpCisJY21wbAkkMjY4NDM1NDU2LCVyMTBkCisJamUJTCQxMnJvdW5kc19hbHQKKworCW1vdnVwcwkleG1tMCwoJXJkeCkKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDEKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8xOTJhX2NvbGQKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDIKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8xOTJiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw0CisJY2FsbAlMJGtleV9leHBhbnNpb25fMTkyYQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsOAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzE5MmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDE2CisJY2FsbAlMJGtleV9leHBhbnNpb25fMTkyYQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMzIKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8xOTJiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw2NAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzE5MmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDEyOAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzE5MmIKKwltb3Z1cHMJJXhtbTAsKCVyYXgpCisJbW92bAklZXNpLDQ4KCVyYXgpCisJeG9ycQklcmF4LCVyYXgKKwlqbXAJTCRlbmNfa2V5X3JldAorCisucDJhbGlnbgk0CitMJDEycm91bmRzX2FsdDoKKwltb3ZkcWEJTCRrZXlfcm90YXRlMTkyKCVyaXApLCV4bW01CisJbW92ZHFhCUwka2V5X3Jjb24xKCVyaXApLCV4bW00CisJbW92bAkkOCwlcjEwZAorCW1vdmRxdQkleG1tMCwoJXJkeCkKKwlqbXAJTCRvb3Bfa2V5MTkyCisKKy5wMmFsaWduCTQKK0wkb29wX2tleTE5MjoKKwltb3ZxCSV4bW0yLDAoJXJheCkKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTIKKwlwc2xsZAkkMSwleG1tNAorCWxlYXEJMjQoJXJheCksJXJheAorCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisKKwlwc2h1ZmQJJDB4ZmYsJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0xCisJcHhvcgkleG1tMSwleG1tMworCisJcHhvcgkleG1tMiwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcXUJJXhtbTAsLTE2KCVyYXgpCisKKwlkZWNsCSVyMTBkCisJam56CUwkb29wX2tleTE5MgorCisJbW92bAklZXNpLDMyKCVyYXgpCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJTCRlbmNfa2V5X3JldAorCisucDJhbGlnbgk0CitMJDE0cm91bmRzOgorCW1vdnVwcwkxNiglcmRpKSwleG1tMgorCW1vdmwJJDEzLCVlc2kKKwlsZWFxCTE2KCVyYXgpLCVyYXgKKwljbXBsCSQyNjg0MzU0NTYsJXIxMGQKKwlqZQlMJDE0cm91bmRzX2FsdAorCisJbW92dXBzCSV4bW0wLCglcmR4KQorCW1vdnVwcwkleG1tMiwxNiglcmR4KQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsMQorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzI1NmFfY29sZAorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMQorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDIKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8yNTZhCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMCwyCisJY2FsbAlMJGtleV9leHBhbnNpb25fMjU2YgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsNAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzI1NmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDQKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiw4CisJY2FsbAlMJGtleV9leHBhbnNpb25fMjU2YQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsOAorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzI1NmIKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAyLDE2CisJY2FsbAlMJGtleV9leHBhbnNpb25fMjU2YQorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDAsMTYKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8yNTZiCisuYnl0ZQkxMDIsMTUsNTgsMjIzLDIwMiwzMgorCWNhbGwJTCRrZXlfZXhwYW5zaW9uXzI1NmEKKy5ieXRlCTEwMiwxNSw1OCwyMjMsMjAwLDMyCisJY2FsbAlMJGtleV9leHBhbnNpb25fMjU2YgorLmJ5dGUJMTAyLDE1LDU4LDIyMywyMDIsNjQKKwljYWxsCUwka2V5X2V4cGFuc2lvbl8yNTZhCisJbW92dXBzCSV4bW0wLCglcmF4KQorCW1vdmwJJWVzaSwxNiglcmF4KQorCXhvcnEJJXJheCwlcmF4CisJam1wCUwkZW5jX2tleV9yZXQKKworLnAyYWxpZ24JNAorTCQxNHJvdW5kc19hbHQ6CisJbW92ZHFhCUwka2V5X3JvdGF0ZSglcmlwKSwleG1tNQorCW1vdmRxYQlMJGtleV9yY29uMSglcmlwKSwleG1tNAorCW1vdmwJJDcsJXIxMGQKKwltb3ZkcXUJJXhtbTAsMCglcmR4KQorCW1vdmRxYQkleG1tMiwleG1tMQorCW1vdmRxdQkleG1tMiwxNiglcmR4KQorCWptcAlMJG9vcF9rZXkyNTYKKworLnAyYWxpZ24JNAorTCRvb3Bfa2V5MjU2OgorLmJ5dGUJMTAyLDE1LDU2LDAsMjEzCisuYnl0ZQkxMDIsMTUsNTYsMjIxLDIxMgorCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxkcQkkNCwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbGQJJDEsJXhtbTQKKworCXB4b3IJJXhtbTIsJXhtbTAKKwltb3ZkcXUJJXhtbTAsKCVyYXgpCisKKwlkZWNsCSVyMTBkCisJanoJTCRkb25lX2tleTI1NgorCisJcHNodWZkCSQweGZmLCV4bW0wLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworLmJ5dGUJMTAyLDE1LDU2LDIyMSwyMTEKKworCW1vdmRxYQkleG1tMSwleG1tMworCXBzbGxkcQkkNCwleG1tMQorCXB4b3IJJXhtbTEsJXhtbTMKKwlwc2xsZHEJJDQsJXhtbTEKKwlweG9yCSV4bW0xLCV4bW0zCisJcHNsbGRxCSQ0LCV4bW0xCisJcHhvcgkleG1tMywleG1tMQorCisJcHhvcgkleG1tMSwleG1tMgorCW1vdmRxdQkleG1tMiwxNiglcmF4KQorCWxlYXEJMzIoJXJheCksJXJheAorCW1vdmRxYQkleG1tMiwleG1tMQorCisJam1wCUwkb29wX2tleTI1NgorCitMJGRvbmVfa2V5MjU2OgorCW1vdmwJJWVzaSwxNiglcmF4KQorCXhvcmwJJWVheCwlZWF4CisJam1wCUwkZW5jX2tleV9yZXQKKworLnAyYWxpZ24JNAorTCRiYWRfa2V5Yml0czoKKwltb3ZxCSQtMiwlcmF4CitMJGVuY19rZXlfcmV0OgorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCWFkZHEJJDgsJXJzcAorCisJLmJ5dGUJMHhmMywweGMzCisKK0wkU0VIX2VuZF9zZXRfZW5jcnlwdF9rZXk6CisKKy5wMmFsaWduCTQKK0wka2V5X2V4cGFuc2lvbl8xMjg6CisJbW92dXBzCSV4bW0wLCglcmF4KQorCWxlYXEJMTYoJXJheCksJXJheAorTCRrZXlfZXhwYW5zaW9uXzEyOF9jb2xkOgorCXNodWZwcwkkMTYsJXhtbTAsJXhtbTQKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwkkMTQwLCV4bW0wLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTAKKwlzaHVmcHMJJDI1NSwleG1tMSwleG1tMQorCXhvcnBzCSV4bW0xLCV4bW0wCisJLmJ5dGUJMHhmMywweGMzCisKKy5wMmFsaWduCTQKK0wka2V5X2V4cGFuc2lvbl8xOTJhOgorCW1vdnVwcwkleG1tMCwoJXJheCkKKwlsZWFxCTE2KCVyYXgpLCVyYXgKK0wka2V5X2V4cGFuc2lvbl8xOTJhX2NvbGQ6CisJbW92YXBzCSV4bW0yLCV4bW01CitMJGtleV9leHBhbnNpb25fMTkyYl93YXJtOgorCXNodWZwcwkkMTYsJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTIsJXhtbTMKKwl4b3JwcwkleG1tNCwleG1tMAorCXNodWZwcwkkMTQwLCV4bW0wLCV4bW00CisJcHNsbGRxCSQ0LCV4bW0zCisJeG9ycHMJJXhtbTQsJXhtbTAKKwlwc2h1ZmQJJDg1LCV4bW0xLCV4bW0xCisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDI1NSwleG1tMCwleG1tMworCXB4b3IJJXhtbTMsJXhtbTIKKwkuYnl0ZQkweGYzLDB4YzMKKworLnAyYWxpZ24JNAorTCRrZXlfZXhwYW5zaW9uXzE5MmI6CisJbW92YXBzCSV4bW0wLCV4bW0zCisJc2h1ZnBzCSQ2OCwleG1tMCwleG1tNQorCW1vdnVwcwkleG1tNSwoJXJheCkKKwlzaHVmcHMJJDc4LCV4bW0yLCV4bW0zCisJbW92dXBzCSV4bW0zLDE2KCVyYXgpCisJbGVhcQkzMiglcmF4KSwlcmF4CisJam1wCUwka2V5X2V4cGFuc2lvbl8xOTJiX3dhcm0KKworLnAyYWxpZ24JNAorTCRrZXlfZXhwYW5zaW9uXzI1NmE6CisJbW92dXBzCSV4bW0yLCglcmF4KQorCWxlYXEJMTYoJXJheCksJXJheAorTCRrZXlfZXhwYW5zaW9uXzI1NmFfY29sZDoKKwlzaHVmcHMJJDE2LCV4bW0wLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTAKKwlzaHVmcHMJJDE0MCwleG1tMCwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0wCisJc2h1ZnBzCSQyNTUsJXhtbTEsJXhtbTEKKwl4b3JwcwkleG1tMSwleG1tMAorCS5ieXRlCTB4ZjMsMHhjMworCisucDJhbGlnbgk0CitMJGtleV9leHBhbnNpb25fMjU2YjoKKwltb3Z1cHMJJXhtbTAsKCVyYXgpCisJbGVhcQkxNiglcmF4KSwlcmF4CisKKwlzaHVmcHMJJDE2LCV4bW0yLCV4bW00CisJeG9ycHMJJXhtbTQsJXhtbTIKKwlzaHVmcHMJJDE0MCwleG1tMiwleG1tNAorCXhvcnBzCSV4bW00LCV4bW0yCisJc2h1ZnBzCSQxNzAsJXhtbTEsJXhtbTEKKwl4b3JwcwkleG1tMSwleG1tMgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTYKK0wkYnN3YXBfbWFzazoKKy5ieXRlCTE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDAKK0wkaW5jcmVtZW50MzI6CisubG9uZwk2LDYsNiwwCitMJGluY3JlbWVudDY0OgorLmxvbmcJMSwwLDAsMAorTCR4dHNfbWFnaWM6CisubG9uZwkweDg3LDAsMSwwCitMJGluY3JlbWVudDE6CisuYnl0ZQkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxCitMJGtleV9yb3RhdGU6CisubG9uZwkweDBjMGYwZTBkLDB4MGMwZjBlMGQsMHgwYzBmMGUwZCwweDBjMGYwZTBkCitMJGtleV9yb3RhdGUxOTI6CisubG9uZwkweDA0MDcwNjA1LDB4MDQwNzA2MDUsMHgwNDA3MDYwNSwweDA0MDcwNjA1CitMJGtleV9yY29uMToKKy5sb25nCTEsMSwxLDEKK0wka2V5X3Jjb24xYjoKKy5sb25nCTB4MWIsMHgxYiwweDFiLDB4MWIKKworLmJ5dGUJNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsNzMsMTEwLDExNiwxMDEsMTA4LDMyLDY1LDY5LDgzLDQ1LDc4LDczLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5wMmFsaWduCTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2JzYWVzLXg4Nl82NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2JzYWVzLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDA2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYnNhZXMteDg2XzY0LlMKQEAgLTAsMCArMSwyNTcxIEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisKKworCisKKy5wMmFsaWduCTYKK19ic2Flc19lbmNyeXB0ODoKKwlsZWFxCUwkQlMwKCVyaXApLCVyMTEKKworCW1vdmRxYQkoJXJheCksJXhtbTgKKwlsZWFxCTE2KCVyYXgpLCVyYXgKKwltb3ZkcWEJODAoJXIxMSksJXhtbTcKKwlweG9yCSV4bW04LCV4bW0xNQorCXB4b3IJJXhtbTgsJXhtbTAKKwlweG9yCSV4bW04LCV4bW0xCisJcHhvcgkleG1tOCwleG1tMgorLmJ5dGUJMTAyLDY4LDE1LDU2LDAsMjU1CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCSV4bW04LCV4bW0zCisJcHhvcgkleG1tOCwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKwlweG9yCSV4bW04LCV4bW01CisJcHhvcgkleG1tOCwleG1tNgorLmJ5dGUJMTAyLDE1LDU2LDAsMjIzCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzEKKy5ieXRlCTEwMiwxNSw1NiwwLDIzOQorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ3CitfYnNhZXNfZW5jcnlwdDhfYml0c2xpY2U6CisJbW92ZHFhCTAoJXIxMSksJXhtbTcKKwltb3ZkcWEJMTYoJXIxMSksJXhtbTgKKwltb3ZkcWEJJXhtbTUsJXhtbTkKKwlwc3JscQkkMSwleG1tNQorCW1vdmRxYQkleG1tMywleG1tMTAKKwlwc3JscQkkMSwleG1tMworCXB4b3IJJXhtbTYsJXhtbTUKKwlweG9yCSV4bW00LCV4bW0zCisJcGFuZAkleG1tNywleG1tNQorCXBhbmQJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW01LCV4bW02CisJcHNsbHEJJDEsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW00CisJcHNsbHEJJDEsJXhtbTMKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tMTAsJXhtbTMKKwltb3ZkcWEJJXhtbTEsJXhtbTkKKwlwc3JscQkkMSwleG1tMQorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDEsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTE1CisJcGFuZAkleG1tNywleG1tMQorCXBhbmQJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tMSwleG1tMgorCXBzbGxxCSQxLCV4bW0xCisJcHhvcgkleG1tMTUsJXhtbTAKKwlwc2xscQkkMSwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0xCisJcHhvcgkleG1tMTAsJXhtbTE1CisJbW92ZHFhCTMyKCVyMTEpLCV4bW03CisJbW92ZHFhCSV4bW00LCV4bW05CisJcHNybHEJJDIsJXhtbTQKKwltb3ZkcWEJJXhtbTMsJXhtbTEwCisJcHNybHEJJDIsJXhtbTMKKwlweG9yCSV4bW02LCV4bW00CisJcHhvcgkleG1tNSwleG1tMworCXBhbmQJJXhtbTgsJXhtbTQKKwlwYW5kCSV4bW04LCV4bW0zCisJcHhvcgkleG1tNCwleG1tNgorCXBzbGxxCSQyLCV4bW00CisJcHhvcgkleG1tMywleG1tNQorCXBzbGxxCSQyLCV4bW0zCisJcHhvcgkleG1tOSwleG1tNAorCXB4b3IJJXhtbTEwLCV4bW0zCisJbW92ZHFhCSV4bW0wLCV4bW05CisJcHNybHEJJDIsJXhtbTAKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQyLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTAKKwlwYW5kCSV4bW04LCV4bW0xNQorCXB4b3IJJXhtbTAsJXhtbTIKKwlwc2xscQkkMiwleG1tMAorCXB4b3IJJXhtbTE1LCV4bW0xCisJcHNsbHEJJDIsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tMAorCXB4b3IJJXhtbTEwLCV4bW0xNQorCW1vdmRxYQkleG1tMiwleG1tOQorCXBzcmxxCSQ0LCV4bW0yCisJbW92ZHFhCSV4bW0xLCV4bW0xMAorCXBzcmxxCSQ0LCV4bW0xCisJcHhvcgkleG1tNiwleG1tMgorCXB4b3IJJXhtbTUsJXhtbTEKKwlwYW5kCSV4bW03LCV4bW0yCisJcGFuZAkleG1tNywleG1tMQorCXB4b3IJJXhtbTIsJXhtbTYKKwlwc2xscQkkNCwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTUKKwlwc2xscQkkNCwleG1tMQorCXB4b3IJJXhtbTksJXhtbTIKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQ0LCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkNCwleG1tMTUKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlwYW5kCSV4bW03LCV4bW0wCisJcGFuZAkleG1tNywleG1tMTUKKwlweG9yCSV4bW0wLCV4bW00CisJcHNsbHEJJDQsJXhtbTAKKwlweG9yCSV4bW0xNSwleG1tMworCXBzbGxxCSQ0LCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW0xMCwleG1tMTUKKwlkZWNsCSVyMTBkCisJam1wCUwkZW5jX3Nib3gKKy5wMmFsaWduCTQKK0wkZW5jX2xvb3A6CisJcHhvcgkwKCVyYXgpLCV4bW0xNQorCXB4b3IJMTYoJXJheCksJXhtbTAKKwlweG9yCTMyKCVyYXgpLCV4bW0xCisJcHhvcgk0OCglcmF4KSwleG1tMgorLmJ5dGUJMTAyLDY4LDE1LDU2LDAsMjU1CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCTY0KCVyYXgpLCV4bW0zCisJcHhvcgk4MCglcmF4KSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKwlweG9yCTk2KCVyYXgpLCV4bW01CisJcHhvcgkxMTIoJXJheCksJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworLmJ5dGUJMTAyLDE1LDU2LDAsMjMxCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzkKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NworCWxlYXEJMTI4KCVyYXgpLCVyYXgKK0wkZW5jX3Nib3g6CisJcHhvcgkleG1tNSwleG1tNAorCXB4b3IJJXhtbTAsJXhtbTEKKwlweG9yCSV4bW0xNSwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTUKKwlweG9yCSV4bW0xNSwleG1tNAorCisJcHhvcgkleG1tMiwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW00LCV4bW02CisJcHhvcgkleG1tMywleG1tMgorCXB4b3IJJXhtbTQsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0yCisKKwlweG9yCSV4bW02LCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNiwleG1tMTAKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwltb3ZkcWEJJXhtbTEsJXhtbTEyCisJbW92ZHFhCSV4bW01LCV4bW0xMQorCisJcHhvcgkleG1tMywleG1tMTAKKwlweG9yCSV4bW0xLCV4bW05CisJcHhvcgkleG1tMiwleG1tOAorCW1vdmRxYQkleG1tMTAsJXhtbTEzCisJcHhvcgkleG1tMywleG1tMTIKKwltb3ZkcWEJJXhtbTksJXhtbTcKKwlweG9yCSV4bW0xNSwleG1tMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0xNAorCisJcG9yCSV4bW04LCV4bW05CisJcG9yCSV4bW0xMSwleG1tMTAKKwlweG9yCSV4bW03LCV4bW0xNAorCXBhbmQJJXhtbTExLCV4bW0xMworCXB4b3IJJXhtbTgsJXhtbTExCisJcGFuZAkleG1tOCwleG1tNworCXBhbmQJJXhtbTExLCV4bW0xNAorCW1vdmRxYQkleG1tMiwleG1tMTEKKwlweG9yCSV4bW0xNSwleG1tMTEKKwlwYW5kCSV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0xMiwleG1tMTAKKwlweG9yCSV4bW0xMiwleG1tOQorCW1vdmRxYQkleG1tNiwleG1tMTIKKwltb3ZkcWEJJXhtbTQsJXhtbTExCisJcHhvcgkleG1tMCwleG1tMTIKKwlweG9yCSV4bW01LCV4bW0xMQorCW1vdmRxYQkleG1tMTIsJXhtbTgKKwlwYW5kCSV4bW0xMSwleG1tMTIKKwlwb3IJJXhtbTExLCV4bW04CisJcHhvcgkleG1tMTIsJXhtbTcKKwlweG9yCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTE0LCV4bW04CisJbW92ZHFhCSV4bW0xLCV4bW0xMQorCXB4b3IJJXhtbTEzLCV4bW03CisJbW92ZHFhCSV4bW0zLCV4bW0xMgorCXB4b3IJJXhtbTEzLCV4bW04CisJbW92ZHFhCSV4bW0wLCV4bW0xMworCXBhbmQJJXhtbTIsJXhtbTExCisJbW92ZHFhCSV4bW02LCV4bW0xNAorCXBhbmQJJXhtbTE1LCV4bW0xMgorCXBhbmQJJXhtbTQsJXhtbTEzCisJcG9yCSV4bW01LCV4bW0xNAorCXB4b3IJJXhtbTExLCV4bW0xMAorCXB4b3IJJXhtbTEyLCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTgKKwlweG9yCSV4bW0xNCwleG1tNworCisKKworCisKKwltb3ZkcWEJJXhtbTEwLCV4bW0xMQorCXBhbmQJJXhtbTgsJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMTEKKworCW1vdmRxYQkleG1tNywleG1tMTMKKwltb3ZkcWEJJXhtbTExLCV4bW0xNAorCXB4b3IJJXhtbTEwLCV4bW0xMworCXBhbmQJJXhtbTEzLCV4bW0xNAorCisJbW92ZHFhCSV4bW04LCV4bW0xMgorCXB4b3IJJXhtbTksJXhtbTE0CisJcHhvcgkleG1tNywleG1tMTIKKworCXB4b3IJJXhtbTksJXhtbTEwCisKKwlwYW5kCSV4bW0xMCwleG1tMTIKKworCW1vdmRxYQkleG1tMTMsJXhtbTkKKwlweG9yCSV4bW03LCV4bW0xMgorCisJcHhvcgkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMiwleG1tOAorCisJcGFuZAkleG1tNywleG1tOQorCisJcHhvcgkleG1tOSwleG1tMTMKKwlweG9yCSV4bW05LCV4bW04CisKKwlwYW5kCSV4bW0xNCwleG1tMTMKKworCXB4b3IJJXhtbTExLCV4bW0xMworCW1vdmRxYQkleG1tNSwleG1tMTEKKwltb3ZkcWEJJXhtbTQsJXhtbTcKKwltb3ZkcWEJJXhtbTE0LCV4bW05CisJcHhvcgkleG1tMTMsJXhtbTkKKwlwYW5kCSV4bW01LCV4bW05CisJcHhvcgkleG1tNCwleG1tNQorCXBhbmQJJXhtbTE0LCV4bW00CisJcGFuZAkleG1tMTMsJXhtbTUKKwlweG9yCSV4bW00LCV4bW01CisJcHhvcgkleG1tOSwleG1tNAorCXB4b3IJJXhtbTE1LCV4bW0xMQorCXB4b3IJJXhtbTIsJXhtbTcKKwlweG9yCSV4bW0xMiwleG1tMTQKKwlweG9yCSV4bW04LCV4bW0xMworCW1vdmRxYQkleG1tMTQsJXhtbTEwCisJbW92ZHFhCSV4bW0xMiwleG1tOQorCXB4b3IJJXhtbTEzLCV4bW0xMAorCXB4b3IJJXhtbTgsJXhtbTkKKwlwYW5kCSV4bW0xMSwleG1tMTAKKwlwYW5kCSV4bW0xNSwleG1tOQorCXB4b3IJJXhtbTcsJXhtbTExCisJcHhvcgkleG1tMiwleG1tMTUKKwlwYW5kCSV4bW0xNCwleG1tNworCXBhbmQJJXhtbTEyLCV4bW0yCisJcGFuZAkleG1tMTMsJXhtbTExCisJcGFuZAkleG1tOCwleG1tMTUKKwlweG9yCSV4bW0xMSwleG1tNworCXB4b3IJJXhtbTIsJXhtbTE1CisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tOSwleG1tMgorCXB4b3IJJXhtbTExLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTE1CisJcHhvcgkleG1tNywleG1tNAorCXB4b3IJJXhtbTcsJXhtbTIKKworCW1vdmRxYQkleG1tNiwleG1tMTEKKwltb3ZkcWEJJXhtbTAsJXhtbTcKKwlweG9yCSV4bW0zLCV4bW0xMQorCXB4b3IJJXhtbTEsJXhtbTcKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMAorCW1vdmRxYQkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTAKKwlweG9yCSV4bW04LCV4bW05CisJcGFuZAkleG1tMTEsJXhtbTEwCisJcGFuZAkleG1tMywleG1tOQorCXB4b3IJJXhtbTcsJXhtbTExCisJcHhvcgkleG1tMSwleG1tMworCXBhbmQJJXhtbTE0LCV4bW03CisJcGFuZAkleG1tMTIsJXhtbTEKKwlwYW5kCSV4bW0xMywleG1tMTEKKwlwYW5kCSV4bW04LCV4bW0zCisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0xLCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tOSwleG1tMQorCXB4b3IJJXhtbTEyLCV4bW0xNAorCXB4b3IJJXhtbTgsJXhtbTEzCisJbW92ZHFhCSV4bW0xNCwleG1tMTAKKwlweG9yCSV4bW0xMywleG1tMTAKKwlwYW5kCSV4bW02LCV4bW0xMAorCXB4b3IJJXhtbTAsJXhtbTYKKwlwYW5kCSV4bW0xNCwleG1tMAorCXBhbmQJJXhtbTEzLCV4bW02CisJcHhvcgkleG1tMCwleG1tNgorCXB4b3IJJXhtbTEwLCV4bW0wCisJcHhvcgkleG1tMTEsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tMworCXB4b3IJJXhtbTcsJXhtbTAKKwlweG9yCSV4bW03LCV4bW0xCisJcHhvcgkleG1tMTUsJXhtbTYKKwlweG9yCSV4bW01LCV4bW0wCisJcHhvcgkleG1tNiwleG1tMworCXB4b3IJJXhtbTE1LCV4bW01CisJcHhvcgkleG1tMCwleG1tMTUKKworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW00CisJcHhvcgkleG1tMiwleG1tMQorCXB4b3IJJXhtbTQsJXhtbTIKKwlweG9yCSV4bW00LCV4bW0zCisKKwlweG9yCSV4bW0yLCV4bW01CisJZGVjbAklcjEwZAorCWpsCUwkZW5jX2RvbmUKKwlwc2h1ZmQJJDB4OTMsJXhtbTE1LCV4bW03CisJcHNodWZkCSQweDkzLCV4bW0wLCV4bW04CisJcHhvcgkleG1tNywleG1tMTUKKwlwc2h1ZmQJJDB4OTMsJXhtbTMsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0wCisJcHNodWZkCSQweDkzLCV4bW01LCV4bW0xMAorCXB4b3IJJXhtbTksJXhtbTMKKwlwc2h1ZmQJJDB4OTMsJXhtbTIsJXhtbTExCisJcHhvcgkleG1tMTAsJXhtbTUKKwlwc2h1ZmQJJDB4OTMsJXhtbTYsJXhtbTEyCisJcHhvcgkleG1tMTEsJXhtbTIKKwlwc2h1ZmQJJDB4OTMsJXhtbTEsJXhtbTEzCisJcHhvcgkleG1tMTIsJXhtbTYKKwlwc2h1ZmQJJDB4OTMsJXhtbTQsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTEKKwlweG9yCSV4bW0xNCwleG1tNAorCisJcHhvcgkleG1tMTUsJXhtbTgKKwlweG9yCSV4bW00LCV4bW03CisJcHhvcgkleG1tNCwleG1tOAorCXBzaHVmZAkkMHg0RSwleG1tMTUsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tOQorCXBzaHVmZAkkMHg0RSwleG1tMCwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTEyCisJcHhvcgkleG1tNywleG1tMTUKKwlweG9yCSV4bW02LCV4bW0xMworCXB4b3IJJXhtbTgsJXhtbTAKKwlweG9yCSV4bW01LCV4bW0xMQorCXBzaHVmZAkkMHg0RSwleG1tMiwleG1tNworCXB4b3IJJXhtbTEsJXhtbTE0CisJcHNodWZkCSQweDRFLCV4bW02LCV4bW04CisJcHhvcgkleG1tMywleG1tMTAKKwlwc2h1ZmQJJDB4NEUsJXhtbTUsJXhtbTIKKwlweG9yCSV4bW00LCV4bW0xMAorCXBzaHVmZAkkMHg0RSwleG1tNCwleG1tNgorCXB4b3IJJXhtbTQsJXhtbTExCisJcHNodWZkCSQweDRFLCV4bW0xLCV4bW01CisJcHhvcgkleG1tMTEsJXhtbTcKKwlwc2h1ZmQJJDB4NEUsJXhtbTMsJXhtbTEKKwlweG9yCSV4bW0xMiwleG1tOAorCXB4b3IJJXhtbTEwLCV4bW0yCisJcHhvcgkleG1tMTQsJXhtbTYKKwlweG9yCSV4bW0xMywleG1tNQorCW1vdmRxYQkleG1tNywleG1tMworCXB4b3IJJXhtbTksJXhtbTEKKwltb3ZkcWEJJXhtbTgsJXhtbTQKKwltb3ZkcWEJNDgoJXIxMSksJXhtbTcKKwlqbnoJTCRlbmNfbG9vcAorCW1vdmRxYQk2NCglcjExKSwleG1tNworCWptcAlMJGVuY19sb29wCisucDJhbGlnbgk0CitMJGVuY19kb25lOgorCW1vdmRxYQkwKCVyMTEpLCV4bW03CisJbW92ZHFhCTE2KCVyMTEpLCV4bW04CisJbW92ZHFhCSV4bW0xLCV4bW05CisJcHNybHEJJDEsJXhtbTEKKwltb3ZkcWEJJXhtbTIsJXhtbTEwCisJcHNybHEJJDEsJXhtbTIKKwlweG9yCSV4bW00LCV4bW0xCisJcHhvcgkleG1tNiwleG1tMgorCXBhbmQJJXhtbTcsJXhtbTEKKwlwYW5kCSV4bW03LCV4bW0yCisJcHhvcgkleG1tMSwleG1tNAorCXBzbGxxCSQxLCV4bW0xCisJcHhvcgkleG1tMiwleG1tNgorCXBzbGxxCSQxLCV4bW0yCisJcHhvcgkleG1tOSwleG1tMQorCXB4b3IJJXhtbTEwLCV4bW0yCisJbW92ZHFhCSV4bW0zLCV4bW05CisJcHNybHEJJDEsJXhtbTMKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQxLCV4bW0xNQorCXB4b3IJJXhtbTUsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0xNQorCXBhbmQJJXhtbTcsJXhtbTMKKwlwYW5kCSV4bW03LCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlwc2xscQkkMSwleG1tMworCXB4b3IJJXhtbTE1LCV4bW0wCisJcHNsbHEJJDEsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tMworCXB4b3IJJXhtbTEwLCV4bW0xNQorCW1vdmRxYQkzMiglcjExKSwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOQorCXBzcmxxCSQyLCV4bW02CisJbW92ZHFhCSV4bW0yLCV4bW0xMAorCXBzcmxxCSQyLCV4bW0yCisJcHhvcgkleG1tNCwleG1tNgorCXB4b3IJJXhtbTEsJXhtbTIKKwlwYW5kCSV4bW04LCV4bW02CisJcGFuZAkleG1tOCwleG1tMgorCXB4b3IJJXhtbTYsJXhtbTQKKwlwc2xscQkkMiwleG1tNgorCXB4b3IJJXhtbTIsJXhtbTEKKwlwc2xscQkkMiwleG1tMgorCXB4b3IJJXhtbTksJXhtbTYKKwlweG9yCSV4bW0xMCwleG1tMgorCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQyLCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkMiwleG1tMTUKKwlweG9yCSV4bW01LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0wCisJcGFuZAkleG1tOCwleG1tMTUKKwlweG9yCSV4bW0wLCV4bW01CisJcHNsbHEJJDIsJXhtbTAKKwlweG9yCSV4bW0xNSwleG1tMworCXBzbGxxCSQyLCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW0xMCwleG1tMTUKKwltb3ZkcWEJJXhtbTUsJXhtbTkKKwlwc3JscQkkNCwleG1tNQorCW1vdmRxYQkleG1tMywleG1tMTAKKwlwc3JscQkkNCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTUKKwlweG9yCSV4bW0xLCV4bW0zCisJcGFuZAkleG1tNywleG1tNQorCXBhbmQJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW01LCV4bW00CisJcHNsbHEJJDQsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW0xCisJcHNsbHEJJDQsJXhtbTMKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tMTAsJXhtbTMKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwlwc3JscQkkNCwleG1tMAorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDQsJXhtbTE1CisJcHhvcgkleG1tNiwleG1tMAorCXB4b3IJJXhtbTIsJXhtbTE1CisJcGFuZAkleG1tNywleG1tMAorCXBhbmQJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tNgorCXBzbGxxCSQ0LCV4bW0wCisJcHhvcgkleG1tMTUsJXhtbTIKKwlwc2xscQkkNCwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0wCisJcHhvcgkleG1tMTAsJXhtbTE1CisJbW92ZHFhCSglcmF4KSwleG1tNworCXB4b3IJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW03LCV4bW01CisJcHhvcgkleG1tNywleG1tMgorCXB4b3IJJXhtbTcsJXhtbTYKKwlweG9yCSV4bW03LCV4bW0xCisJcHhvcgkleG1tNywleG1tNAorCXB4b3IJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tNywleG1tMAorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNgorX2JzYWVzX2RlY3J5cHQ4OgorCWxlYXEJTCRCUzAoJXJpcCksJXIxMQorCisJbW92ZHFhCSglcmF4KSwleG1tOAorCWxlYXEJMTYoJXJheCksJXJheAorCW1vdmRxYQktNDgoJXIxMSksJXhtbTcKKwlweG9yCSV4bW04LCV4bW0xNQorCXB4b3IJJXhtbTgsJXhtbTAKKwlweG9yCSV4bW04LCV4bW0xCisJcHhvcgkleG1tOCwleG1tMgorLmJ5dGUJMTAyLDY4LDE1LDU2LDAsMjU1CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCSV4bW04LCV4bW0zCisJcHhvcgkleG1tOCwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKwlweG9yCSV4bW04LCV4bW01CisJcHhvcgkleG1tOCwleG1tNgorLmJ5dGUJMTAyLDE1LDU2LDAsMjIzCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzEKKy5ieXRlCTEwMiwxNSw1NiwwLDIzOQorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ3CisJbW92ZHFhCTAoJXIxMSksJXhtbTcKKwltb3ZkcWEJMTYoJXIxMSksJXhtbTgKKwltb3ZkcWEJJXhtbTUsJXhtbTkKKwlwc3JscQkkMSwleG1tNQorCW1vdmRxYQkleG1tMywleG1tMTAKKwlwc3JscQkkMSwleG1tMworCXB4b3IJJXhtbTYsJXhtbTUKKwlweG9yCSV4bW00LCV4bW0zCisJcGFuZAkleG1tNywleG1tNQorCXBhbmQJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW01LCV4bW02CisJcHNsbHEJJDEsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW00CisJcHNsbHEJJDEsJXhtbTMKKwlweG9yCSV4bW05LCV4bW01CisJcHhvcgkleG1tMTAsJXhtbTMKKwltb3ZkcWEJJXhtbTEsJXhtbTkKKwlwc3JscQkkMSwleG1tMQorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDEsJXhtbTE1CisJcHhvcgkleG1tMiwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTE1CisJcGFuZAkleG1tNywleG1tMQorCXBhbmQJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tMSwleG1tMgorCXBzbGxxCSQxLCV4bW0xCisJcHhvcgkleG1tMTUsJXhtbTAKKwlwc2xscQkkMSwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0xCisJcHhvcgkleG1tMTAsJXhtbTE1CisJbW92ZHFhCTMyKCVyMTEpLCV4bW03CisJbW92ZHFhCSV4bW00LCV4bW05CisJcHNybHEJJDIsJXhtbTQKKwltb3ZkcWEJJXhtbTMsJXhtbTEwCisJcHNybHEJJDIsJXhtbTMKKwlweG9yCSV4bW02LCV4bW00CisJcHhvcgkleG1tNSwleG1tMworCXBhbmQJJXhtbTgsJXhtbTQKKwlwYW5kCSV4bW04LCV4bW0zCisJcHhvcgkleG1tNCwleG1tNgorCXBzbGxxCSQyLCV4bW00CisJcHhvcgkleG1tMywleG1tNQorCXBzbGxxCSQyLCV4bW0zCisJcHhvcgkleG1tOSwleG1tNAorCXB4b3IJJXhtbTEwLCV4bW0zCisJbW92ZHFhCSV4bW0wLCV4bW05CisJcHNybHEJJDIsJXhtbTAKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQyLCV4bW0xNQorCXB4b3IJJXhtbTIsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xNQorCXBhbmQJJXhtbTgsJXhtbTAKKwlwYW5kCSV4bW04LCV4bW0xNQorCXB4b3IJJXhtbTAsJXhtbTIKKwlwc2xscQkkMiwleG1tMAorCXB4b3IJJXhtbTE1LCV4bW0xCisJcHNsbHEJJDIsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tMAorCXB4b3IJJXhtbTEwLCV4bW0xNQorCW1vdmRxYQkleG1tMiwleG1tOQorCXBzcmxxCSQ0LCV4bW0yCisJbW92ZHFhCSV4bW0xLCV4bW0xMAorCXBzcmxxCSQ0LCV4bW0xCisJcHhvcgkleG1tNiwleG1tMgorCXB4b3IJJXhtbTUsJXhtbTEKKwlwYW5kCSV4bW03LCV4bW0yCisJcGFuZAkleG1tNywleG1tMQorCXB4b3IJJXhtbTIsJXhtbTYKKwlwc2xscQkkNCwleG1tMgorCXB4b3IJJXhtbTEsJXhtbTUKKwlwc2xscQkkNCwleG1tMQorCXB4b3IJJXhtbTksJXhtbTIKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQ0LCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkNCwleG1tMTUKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMTUKKwlwYW5kCSV4bW03LCV4bW0wCisJcGFuZAkleG1tNywleG1tMTUKKwlweG9yCSV4bW0wLCV4bW00CisJcHNsbHEJJDQsJXhtbTAKKwlweG9yCSV4bW0xNSwleG1tMworCXBzbGxxCSQ0LCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW0xMCwleG1tMTUKKwlkZWNsCSVyMTBkCisJam1wCUwkZGVjX3Nib3gKKy5wMmFsaWduCTQKK0wkZGVjX2xvb3A6CisJcHhvcgkwKCVyYXgpLCV4bW0xNQorCXB4b3IJMTYoJXJheCksJXhtbTAKKwlweG9yCTMyKCVyYXgpLCV4bW0xCisJcHhvcgk0OCglcmF4KSwleG1tMgorLmJ5dGUJMTAyLDY4LDE1LDU2LDAsMjU1CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCTY0KCVyYXgpLCV4bW0zCisJcHhvcgk4MCglcmF4KSwleG1tNAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTUKKwlweG9yCTk2KCVyYXgpLCV4bW01CisJcHhvcgkxMTIoJXJheCksJXhtbTYKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMworLmJ5dGUJMTAyLDE1LDU2LDAsMjMxCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzkKKy5ieXRlCTEwMiwxNSw1NiwwLDI0NworCWxlYXEJMTI4KCVyYXgpLCVyYXgKK0wkZGVjX3Nib3g6CisJcHhvcgkleG1tMywleG1tMgorCisJcHhvcgkleG1tNiwleG1tMworCXB4b3IJJXhtbTYsJXhtbTEKKwlweG9yCSV4bW0zLCV4bW01CisJcHhvcgkleG1tNSwleG1tNgorCXB4b3IJJXhtbTYsJXhtbTAKKworCXB4b3IJJXhtbTAsJXhtbTE1CisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTE1LCV4bW0yCisJcHhvcgkleG1tMTUsJXhtbTQKKwlweG9yCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW0yLCV4bW0xMAorCW1vdmRxYQkleG1tNiwleG1tOQorCW1vdmRxYQkleG1tMCwleG1tOAorCW1vdmRxYQkleG1tMywleG1tMTIKKwltb3ZkcWEJJXhtbTQsJXhtbTExCisKKwlweG9yCSV4bW0xNSwleG1tMTAKKwlweG9yCSV4bW0zLCV4bW05CisJcHhvcgkleG1tNSwleG1tOAorCW1vdmRxYQkleG1tMTAsJXhtbTEzCisJcHhvcgkleG1tMTUsJXhtbTEyCisJbW92ZHFhCSV4bW05LCV4bW03CisJcHhvcgkleG1tMSwleG1tMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0xNAorCisJcG9yCSV4bW04LCV4bW05CisJcG9yCSV4bW0xMSwleG1tMTAKKwlweG9yCSV4bW03LCV4bW0xNAorCXBhbmQJJXhtbTExLCV4bW0xMworCXB4b3IJJXhtbTgsJXhtbTExCisJcGFuZAkleG1tOCwleG1tNworCXBhbmQJJXhtbTExLCV4bW0xNAorCW1vdmRxYQkleG1tNSwleG1tMTEKKwlweG9yCSV4bW0xLCV4bW0xMQorCXBhbmQJJXhtbTExLCV4bW0xMgorCXB4b3IJJXhtbTEyLCV4bW0xMAorCXB4b3IJJXhtbTEyLCV4bW05CisJbW92ZHFhCSV4bW0yLCV4bW0xMgorCW1vdmRxYQkleG1tMCwleG1tMTEKKwlweG9yCSV4bW02LCV4bW0xMgorCXB4b3IJJXhtbTQsJXhtbTExCisJbW92ZHFhCSV4bW0xMiwleG1tOAorCXBhbmQJJXhtbTExLCV4bW0xMgorCXBvcgkleG1tMTEsJXhtbTgKKwlweG9yCSV4bW0xMiwleG1tNworCXB4b3IJJXhtbTE0LCV4bW0xMAorCXB4b3IJJXhtbTEzLCV4bW05CisJcHhvcgkleG1tMTQsJXhtbTgKKwltb3ZkcWEJJXhtbTMsJXhtbTExCisJcHhvcgkleG1tMTMsJXhtbTcKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMgorCXB4b3IJJXhtbTEzLCV4bW04CisJbW92ZHFhCSV4bW02LCV4bW0xMworCXBhbmQJJXhtbTUsJXhtbTExCisJbW92ZHFhCSV4bW0yLCV4bW0xNAorCXBhbmQJJXhtbTEsJXhtbTEyCisJcGFuZAkleG1tMCwleG1tMTMKKwlwb3IJJXhtbTQsJXhtbTE0CisJcHhvcgkleG1tMTEsJXhtbTEwCisJcHhvcgkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tOAorCXB4b3IJJXhtbTE0LCV4bW03CisKKworCisKKworCW1vdmRxYQkleG1tMTAsJXhtbTExCisJcGFuZAkleG1tOCwleG1tMTAKKwlweG9yCSV4bW05LCV4bW0xMQorCisJbW92ZHFhCSV4bW03LCV4bW0xMworCW1vdmRxYQkleG1tMTEsJXhtbTE0CisJcHhvcgkleG1tMTAsJXhtbTEzCisJcGFuZAkleG1tMTMsJXhtbTE0CisKKwltb3ZkcWEJJXhtbTgsJXhtbTEyCisJcHhvcgkleG1tOSwleG1tMTQKKwlweG9yCSV4bW03LCV4bW0xMgorCisJcHhvcgkleG1tOSwleG1tMTAKKworCXBhbmQJJXhtbTEwLCV4bW0xMgorCisJbW92ZHFhCSV4bW0xMywleG1tOQorCXB4b3IJJXhtbTcsJXhtbTEyCisKKwlweG9yCSV4bW0xMiwleG1tOQorCXB4b3IJJXhtbTEyLCV4bW04CisKKwlwYW5kCSV4bW03LCV4bW05CisKKwlweG9yCSV4bW05LCV4bW0xMworCXB4b3IJJXhtbTksJXhtbTgKKworCXBhbmQJJXhtbTE0LCV4bW0xMworCisJcHhvcgkleG1tMTEsJXhtbTEzCisJbW92ZHFhCSV4bW00LCV4bW0xMQorCW1vdmRxYQkleG1tMCwleG1tNworCW1vdmRxYQkleG1tMTQsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tOQorCXBhbmQJJXhtbTQsJXhtbTkKKwlweG9yCSV4bW0wLCV4bW00CisJcGFuZAkleG1tMTQsJXhtbTAKKwlwYW5kCSV4bW0xMywleG1tNAorCXB4b3IJJXhtbTAsJXhtbTQKKwlweG9yCSV4bW05LCV4bW0wCisJcHhvcgkleG1tMSwleG1tMTEKKwlweG9yCSV4bW01LCV4bW03CisJcHhvcgkleG1tMTIsJXhtbTE0CisJcHhvcgkleG1tOCwleG1tMTMKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMAorCW1vdmRxYQkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTAKKwlweG9yCSV4bW04LCV4bW05CisJcGFuZAkleG1tMTEsJXhtbTEwCisJcGFuZAkleG1tMSwleG1tOQorCXB4b3IJJXhtbTcsJXhtbTExCisJcHhvcgkleG1tNSwleG1tMQorCXBhbmQJJXhtbTE0LCV4bW03CisJcGFuZAkleG1tMTIsJXhtbTUKKwlwYW5kCSV4bW0xMywleG1tMTEKKwlwYW5kCSV4bW04LCV4bW0xCisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMTAsJXhtbTExCisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTExLCV4bW00CisJcHhvcgkleG1tMTEsJXhtbTEKKwlweG9yCSV4bW03LCV4bW0wCisJcHhvcgkleG1tNywleG1tNQorCisJbW92ZHFhCSV4bW0yLCV4bW0xMQorCW1vdmRxYQkleG1tNiwleG1tNworCXB4b3IJJXhtbTE1LCV4bW0xMQorCXB4b3IJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTE0LCV4bW0xMAorCW1vdmRxYQkleG1tMTIsJXhtbTkKKwlweG9yCSV4bW0xMywleG1tMTAKKwlweG9yCSV4bW04LCV4bW05CisJcGFuZAkleG1tMTEsJXhtbTEwCisJcGFuZAkleG1tMTUsJXhtbTkKKwlweG9yCSV4bW03LCV4bW0xMQorCXB4b3IJJXhtbTMsJXhtbTE1CisJcGFuZAkleG1tMTQsJXhtbTcKKwlwYW5kCSV4bW0xMiwleG1tMworCXBhbmQJJXhtbTEzLCV4bW0xMQorCXBhbmQJJXhtbTgsJXhtbTE1CisJcHhvcgkleG1tMTEsJXhtbTcKKwlweG9yCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTEwLCV4bW0xMQorCXB4b3IJJXhtbTksJXhtbTMKKwlweG9yCSV4bW0xMiwleG1tMTQKKwlweG9yCSV4bW04LCV4bW0xMworCW1vdmRxYQkleG1tMTQsJXhtbTEwCisJcHhvcgkleG1tMTMsJXhtbTEwCisJcGFuZAkleG1tMiwleG1tMTAKKwlweG9yCSV4bW02LCV4bW0yCisJcGFuZAkleG1tMTQsJXhtbTYKKwlwYW5kCSV4bW0xMywleG1tMgorCXB4b3IJJXhtbTYsJXhtbTIKKwlweG9yCSV4bW0xMCwleG1tNgorCXB4b3IJJXhtbTExLCV4bW0yCisJcHhvcgkleG1tMTEsJXhtbTE1CisJcHhvcgkleG1tNywleG1tNgorCXB4b3IJJXhtbTcsJXhtbTMKKwlweG9yCSV4bW02LCV4bW0wCisJcHhvcgkleG1tNCwleG1tNQorCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTYsJXhtbTEKKwlweG9yCSV4bW02LCV4bW00CisJcHhvcgkleG1tMSwleG1tMworCXB4b3IJJXhtbTE1LCV4bW02CisJcHhvcgkleG1tNCwleG1tMworCXB4b3IJJXhtbTUsJXhtbTIKKwlweG9yCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMywleG1tMgorCisJcHhvcgkleG1tMTUsJXhtbTMKKwlweG9yCSV4bW0yLCV4bW02CisJZGVjbAklcjEwZAorCWpsCUwkZGVjX2RvbmUKKworCXBzaHVmZAkkMHg0RSwleG1tMTUsJXhtbTcKKwlwc2h1ZmQJJDB4NEUsJXhtbTIsJXhtbTEzCisJcHhvcgkleG1tMTUsJXhtbTcKKwlwc2h1ZmQJJDB4NEUsJXhtbTQsJXhtbTE0CisJcHhvcgkleG1tMiwleG1tMTMKKwlwc2h1ZmQJJDB4NEUsJXhtbTAsJXhtbTgKKwlweG9yCSV4bW00LCV4bW0xNAorCXBzaHVmZAkkMHg0RSwleG1tNSwleG1tOQorCXB4b3IJJXhtbTAsJXhtbTgKKwlwc2h1ZmQJJDB4NEUsJXhtbTMsJXhtbTEwCisJcHhvcgkleG1tNSwleG1tOQorCXB4b3IJJXhtbTEzLCV4bW0xNQorCXB4b3IJJXhtbTEzLCV4bW0wCisJcHNodWZkCSQweDRFLCV4bW0xLCV4bW0xMQorCXB4b3IJJXhtbTMsJXhtbTEwCisJcHhvcgkleG1tNywleG1tNQorCXB4b3IJJXhtbTgsJXhtbTMKKwlwc2h1ZmQJJDB4NEUsJXhtbTYsJXhtbTEyCisJcHhvcgkleG1tMSwleG1tMTEKKwlweG9yCSV4bW0xNCwleG1tMAorCXB4b3IJJXhtbTksJXhtbTEKKwlweG9yCSV4bW02LCV4bW0xMgorCisJcHhvcgkleG1tMTQsJXhtbTUKKwlweG9yCSV4bW0xMywleG1tMworCXB4b3IJJXhtbTEzLCV4bW0xCisJcHhvcgkleG1tMTAsJXhtbTYKKwlweG9yCSV4bW0xMSwleG1tMgorCXB4b3IJJXhtbTE0LCV4bW0xCisJcHhvcgkleG1tMTQsJXhtbTYKKwlweG9yCSV4bW0xMiwleG1tNAorCXBzaHVmZAkkMHg5MywleG1tMTUsJXhtbTcKKwlwc2h1ZmQJJDB4OTMsJXhtbTAsJXhtbTgKKwlweG9yCSV4bW03LCV4bW0xNQorCXBzaHVmZAkkMHg5MywleG1tNSwleG1tOQorCXB4b3IJJXhtbTgsJXhtbTAKKwlwc2h1ZmQJJDB4OTMsJXhtbTMsJXhtbTEwCisJcHhvcgkleG1tOSwleG1tNQorCXBzaHVmZAkkMHg5MywleG1tMSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMworCXBzaHVmZAkkMHg5MywleG1tNiwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMQorCXBzaHVmZAkkMHg5MywleG1tMiwleG1tMTMKKwlweG9yCSV4bW0xMiwleG1tNgorCXBzaHVmZAkkMHg5MywleG1tNCwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tMgorCXB4b3IJJXhtbTE0LCV4bW00CisKKwlweG9yCSV4bW0xNSwleG1tOAorCXB4b3IJJXhtbTQsJXhtbTcKKwlweG9yCSV4bW00LCV4bW04CisJcHNodWZkCSQweDRFLCV4bW0xNSwleG1tMTUKKwlweG9yCSV4bW0wLCV4bW05CisJcHNodWZkCSQweDRFLCV4bW0wLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMTIKKwlweG9yCSV4bW03LCV4bW0xNQorCXB4b3IJJXhtbTYsJXhtbTEzCisJcHhvcgkleG1tOCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTExCisJcHNodWZkCSQweDRFLCV4bW0xLCV4bW03CisJcHhvcgkleG1tMiwleG1tMTQKKwlwc2h1ZmQJJDB4NEUsJXhtbTYsJXhtbTgKKwlweG9yCSV4bW01LCV4bW0xMAorCXBzaHVmZAkkMHg0RSwleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTEwCisJcHNodWZkCSQweDRFLCV4bW00LCV4bW02CisJcHhvcgkleG1tNCwleG1tMTEKKwlwc2h1ZmQJJDB4NEUsJXhtbTIsJXhtbTMKKwlweG9yCSV4bW0xMSwleG1tNworCXBzaHVmZAkkMHg0RSwleG1tNSwleG1tMgorCXB4b3IJJXhtbTEyLCV4bW04CisJcHhvcgkleG1tMSwleG1tMTAKKwlweG9yCSV4bW0xNCwleG1tNgorCXB4b3IJJXhtbTMsJXhtbTEzCisJbW92ZHFhCSV4bW03LCV4bW0zCisJcHhvcgkleG1tOSwleG1tMgorCW1vdmRxYQkleG1tMTMsJXhtbTUKKwltb3ZkcWEJJXhtbTgsJXhtbTQKKwltb3ZkcWEJJXhtbTIsJXhtbTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0yCisJbW92ZHFhCS0xNiglcjExKSwleG1tNworCWpueglMJGRlY19sb29wCisJbW92ZHFhCS0zMiglcjExKSwleG1tNworCWptcAlMJGRlY19sb29wCisucDJhbGlnbgk0CitMJGRlY19kb25lOgorCW1vdmRxYQkwKCVyMTEpLCV4bW03CisJbW92ZHFhCTE2KCVyMTEpLCV4bW04CisJbW92ZHFhCSV4bW0yLCV4bW05CisJcHNybHEJJDEsJXhtbTIKKwltb3ZkcWEJJXhtbTEsJXhtbTEwCisJcHNybHEJJDEsJXhtbTEKKwlweG9yCSV4bW00LCV4bW0yCisJcHhvcgkleG1tNiwleG1tMQorCXBhbmQJJXhtbTcsJXhtbTIKKwlwYW5kCSV4bW03LCV4bW0xCisJcHhvcgkleG1tMiwleG1tNAorCXBzbGxxCSQxLCV4bW0yCisJcHhvcgkleG1tMSwleG1tNgorCXBzbGxxCSQxLCV4bW0xCisJcHhvcgkleG1tOSwleG1tMgorCXB4b3IJJXhtbTEwLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW05CisJcHNybHEJJDEsJXhtbTUKKwltb3ZkcWEJJXhtbTE1LCV4bW0xMAorCXBzcmxxCSQxLCV4bW0xNQorCXB4b3IJJXhtbTMsJXhtbTUKKwlweG9yCSV4bW0wLCV4bW0xNQorCXBhbmQJJXhtbTcsJXhtbTUKKwlwYW5kCSV4bW03LCV4bW0xNQorCXB4b3IJJXhtbTUsJXhtbTMKKwlwc2xscQkkMSwleG1tNQorCXB4b3IJJXhtbTE1LCV4bW0wCisJcHNsbHEJJDEsJXhtbTE1CisJcHhvcgkleG1tOSwleG1tNQorCXB4b3IJJXhtbTEwLCV4bW0xNQorCW1vdmRxYQkzMiglcjExKSwleG1tNworCW1vdmRxYQkleG1tNiwleG1tOQorCXBzcmxxCSQyLCV4bW02CisJbW92ZHFhCSV4bW0xLCV4bW0xMAorCXBzcmxxCSQyLCV4bW0xCisJcHhvcgkleG1tNCwleG1tNgorCXB4b3IJJXhtbTIsJXhtbTEKKwlwYW5kCSV4bW04LCV4bW02CisJcGFuZAkleG1tOCwleG1tMQorCXB4b3IJJXhtbTYsJXhtbTQKKwlwc2xscQkkMiwleG1tNgorCXB4b3IJJXhtbTEsJXhtbTIKKwlwc2xscQkkMiwleG1tMQorCXB4b3IJJXhtbTksJXhtbTYKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQyLCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMTAKKwlwc3JscQkkMiwleG1tMTUKKwlweG9yCSV4bW0zLCV4bW0wCisJcHhvcgkleG1tNSwleG1tMTUKKwlwYW5kCSV4bW04LCV4bW0wCisJcGFuZAkleG1tOCwleG1tMTUKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbHEJJDIsJXhtbTAKKwlweG9yCSV4bW0xNSwleG1tNQorCXBzbGxxCSQyLCV4bW0xNQorCXB4b3IJJXhtbTksJXhtbTAKKwlweG9yCSV4bW0xMCwleG1tMTUKKwltb3ZkcWEJJXhtbTMsJXhtbTkKKwlwc3JscQkkNCwleG1tMworCW1vdmRxYQkleG1tNSwleG1tMTAKKwlwc3JscQkkNCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTMKKwlweG9yCSV4bW0yLCV4bW01CisJcGFuZAkleG1tNywleG1tMworCXBhbmQJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW0zLCV4bW00CisJcHNsbHEJJDQsJXhtbTMKKwlweG9yCSV4bW01LCV4bW0yCisJcHNsbHEJJDQsJXhtbTUKKwlweG9yCSV4bW05LCV4bW0zCisJcHhvcgkleG1tMTAsJXhtbTUKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwlwc3JscQkkNCwleG1tMAorCW1vdmRxYQkleG1tMTUsJXhtbTEwCisJcHNybHEJJDQsJXhtbTE1CisJcHhvcgkleG1tNiwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTE1CisJcGFuZAkleG1tNywleG1tMAorCXBhbmQJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tMCwleG1tNgorCXBzbGxxCSQ0LCV4bW0wCisJcHhvcgkleG1tMTUsJXhtbTEKKwlwc2xscQkkNCwleG1tMTUKKwlweG9yCSV4bW05LCV4bW0wCisJcHhvcgkleG1tMTAsJXhtbTE1CisJbW92ZHFhCSglcmF4KSwleG1tNworCXB4b3IJJXhtbTcsJXhtbTUKKwlweG9yCSV4bW03LCV4bW0zCisJcHhvcgkleG1tNywleG1tMQorCXB4b3IJJXhtbTcsJXhtbTYKKwlweG9yCSV4bW03LCV4bW0yCisJcHhvcgkleG1tNywleG1tNAorCXB4b3IJJXhtbTcsJXhtbTE1CisJcHhvcgkleG1tNywleG1tMAorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTQKK19ic2Flc19rZXlfY29udmVydDoKKwlsZWFxCUwkbWFza3MoJXJpcCksJXIxMQorCW1vdmRxdQkoJXJjeCksJXhtbTcKKwlsZWFxCTE2KCVyY3gpLCVyY3gKKwltb3ZkcWEJMCglcjExKSwleG1tMAorCW1vdmRxYQkxNiglcjExKSwleG1tMQorCW1vdmRxYQkzMiglcjExKSwleG1tMgorCW1vdmRxYQk0OCglcjExKSwleG1tMworCW1vdmRxYQk2NCglcjExKSwleG1tNAorCXBjbXBlcWQJJXhtbTUsJXhtbTUKKworCW1vdmRxdQkoJXJjeCksJXhtbTYKKwltb3ZkcWEJJXhtbTcsKCVyYXgpCisJbGVhcQkxNiglcmF4KSwlcmF4CisJZGVjbAklcjEwZAorCWptcAlMJGtleV9sb29wCisucDJhbGlnbgk0CitMJGtleV9sb29wOgorLmJ5dGUJMTAyLDE1LDU2LDAsMjQ0CisKKwltb3ZkcWEJJXhtbTAsJXhtbTgKKwltb3ZkcWEJJXhtbTEsJXhtbTkKKworCXBhbmQJJXhtbTYsJXhtbTgKKwlwYW5kCSV4bW02LCV4bW05CisJbW92ZHFhCSV4bW0yLCV4bW0xMAorCXBjbXBlcWIJJXhtbTAsJXhtbTgKKwlwc2xscQkkNCwleG1tMAorCW1vdmRxYQkleG1tMywleG1tMTEKKwlwY21wZXFiCSV4bW0xLCV4bW05CisJcHNsbHEJJDQsJXhtbTEKKworCXBhbmQJJXhtbTYsJXhtbTEwCisJcGFuZAkleG1tNiwleG1tMTEKKwltb3ZkcWEJJXhtbTAsJXhtbTEyCisJcGNtcGVxYgkleG1tMiwleG1tMTAKKwlwc2xscQkkNCwleG1tMgorCW1vdmRxYQkleG1tMSwleG1tMTMKKwlwY21wZXFiCSV4bW0zLCV4bW0xMQorCXBzbGxxCSQ0LCV4bW0zCisKKwltb3ZkcWEJJXhtbTIsJXhtbTE0CisJbW92ZHFhCSV4bW0zLCV4bW0xNQorCXB4b3IJJXhtbTUsJXhtbTgKKwlweG9yCSV4bW01LCV4bW05CisKKwlwYW5kCSV4bW02LCV4bW0xMgorCXBhbmQJJXhtbTYsJXhtbTEzCisJbW92ZHFhCSV4bW04LDAoJXJheCkKKwlwY21wZXFiCSV4bW0wLCV4bW0xMgorCXBzcmxxCSQ0LCV4bW0wCisJbW92ZHFhCSV4bW05LDE2KCVyYXgpCisJcGNtcGVxYgkleG1tMSwleG1tMTMKKwlwc3JscQkkNCwleG1tMQorCWxlYXEJMTYoJXJjeCksJXJjeAorCisJcGFuZAkleG1tNiwleG1tMTQKKwlwYW5kCSV4bW02LCV4bW0xNQorCW1vdmRxYQkleG1tMTAsMzIoJXJheCkKKwlwY21wZXFiCSV4bW0yLCV4bW0xNAorCXBzcmxxCSQ0LCV4bW0yCisJbW92ZHFhCSV4bW0xMSw0OCglcmF4KQorCXBjbXBlcWIJJXhtbTMsJXhtbTE1CisJcHNybHEJJDQsJXhtbTMKKwltb3ZkcXUJKCVyY3gpLCV4bW02CisKKwlweG9yCSV4bW01LCV4bW0xMworCXB4b3IJJXhtbTUsJXhtbTE0CisJbW92ZHFhCSV4bW0xMiw2NCglcmF4KQorCW1vdmRxYQkleG1tMTMsODAoJXJheCkKKwltb3ZkcWEJJXhtbTE0LDk2KCVyYXgpCisJbW92ZHFhCSV4bW0xNSwxMTIoJXJheCkKKwlsZWFxCTEyOCglcmF4KSwlcmF4CisJZGVjbAklcjEwZAorCWpueglMJGtleV9sb29wCisKKwltb3ZkcWEJODAoJXIxMSksJXhtbTcKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYnNhZXNfY2JjX2VuY3J5cHQKKy5wcml2YXRlX2V4dGVybiBfYnNhZXNfY2JjX2VuY3J5cHQKKworLnAyYWxpZ24JNAorX2JzYWVzX2NiY19lbmNyeXB0OgorCisJY21wbAkkMCwlcjlkCisJam5lCV9hZXNfbm9od19jYmNfZW5jcnlwdAorCWNtcHEJJDEyOCwlcmR4CisJamIJX2Flc19ub2h3X2NiY19lbmNyeXB0CisKKwltb3ZxCSVyc3AsJXJheAorTCRjYmNfZGVjX3Byb2xvZ3VlOgorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCWxlYXEJLTcyKCVyc3ApLCVyc3AKKworCW1vdnEJJXJzcCwlcmJwCisKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJbW92cQklcmRpLCVyMTIKKwltb3ZxCSVyc2ksJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKwltb3ZxCSVyOCwlcmJ4CisJc2hycQkkNCwlcjE0CisKKwltb3ZsCSVlYXgsJWVkeAorCXNobHEJJDcsJXJheAorCXN1YnEJJDk2LCVyYXgKKwlzdWJxCSVyYXgsJXJzcAorCisJbW92cQklcnNwLCVyYXgKKwltb3ZxCSVyMTUsJXJjeAorCW1vdmwJJWVkeCwlcjEwZAorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkoJXJzcCksJXhtbTcKKwltb3ZkcWEJJXhtbTYsKCVyYXgpCisJbW92ZHFhCSV4bW03LCglcnNwKQorCisJbW92ZHF1CSglcmJ4KSwleG1tMTQKKwlzdWJxCSQ4LCVyMTQKK0wkY2JjX2RlY19sb29wOgorCW1vdmRxdQkwKCVyMTIpLCV4bW0xNQorCW1vdmRxdQkxNiglcjEyKSwleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tMQorCW1vdmRxdQk0OCglcjEyKSwleG1tMgorCW1vdmRxdQk2NCglcjEyKSwleG1tMworCW1vdmRxdQk4MCglcjEyKSwleG1tNAorCW1vdnEJJXJzcCwlcmF4CisJbW92ZHF1CTk2KCVyMTIpLCV4bW01CisJbW92bAklZWR4LCVyMTBkCisJbW92ZHF1CTExMiglcjEyKSwleG1tNgorCW1vdmRxYQkleG1tMTQsMzIoJXJicCkKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCTMyKCVyYnApLCV4bW0xNQorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMworCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tNgorCW1vdmRxdQk5NiglcjEyKSwleG1tMTMKKwlweG9yCSV4bW0xMiwleG1tMgorCW1vdmRxdQkxMTIoJXIxMiksJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTQKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlsZWFxCTEyOCglcjEyKSwlcjEyCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJbW92ZHF1CSV4bW0zLDQ4KCVyMTMpCisJbW92ZHF1CSV4bW0xLDY0KCVyMTMpCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJbW92ZHF1CSV4bW0yLDk2KCVyMTMpCisJbW92ZHF1CSV4bW00LDExMiglcjEzKQorCWxlYXEJMTI4KCVyMTMpLCVyMTMKKwlzdWJxCSQ4LCVyMTQKKwlqbmMJTCRjYmNfZGVjX2xvb3AKKworCWFkZHEJJDgsJXIxNAorCWp6CUwkY2JjX2RlY19kb25lCisKKwltb3ZkcXUJMCglcjEyKSwleG1tMTUKKwltb3ZxCSVyc3AsJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCWNtcHEJJDIsJXIxNAorCWpiCUwkY2JjX2RlY19vbmUKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTAKKwlqZQlMJGNiY19kZWNfdHdvCisJbW92ZHF1CTMyKCVyMTIpLCV4bW0xCisJY21wcQkkNCwlcjE0CisJamIJTCRjYmNfZGVjX3RocmVlCisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0yCisJamUJTCRjYmNfZGVjX2ZvdXIKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTMKKwljbXBxCSQ2LCVyMTQKKwlqYglMJGNiY19kZWNfZml2ZQorCW1vdmRxdQk4MCglcjEyKSwleG1tNAorCWplCUwkY2JjX2RlY19zaXgKKwltb3ZkcXUJOTYoJXIxMiksJXhtbTUKKwltb3ZkcWEJJXhtbTE0LDMyKCVyYnApCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTMyKCVyYnApLCV4bW0xNQorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMworCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tNgorCW1vdmRxdQk5NiglcjEyKSwleG1tMTQKKwlweG9yCSV4bW0xMiwleG1tMgorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCW1vdmRxdQkleG1tMyw0OCglcjEzKQorCW1vdmRxdQkleG1tMSw2NCglcjEzKQorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCW1vdmRxdQkleG1tMiw5NiglcjEzKQorCWptcAlMJGNiY19kZWNfZG9uZQorLnAyYWxpZ24JNAorTCRjYmNfZGVjX3NpeDoKKwltb3ZkcWEJJXhtbTE0LDMyKCVyYnApCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTMyKCVyYnApLCV4bW0xNQorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCXB4b3IJJXhtbTgsJXhtbTUKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJcHhvcgkleG1tOSwleG1tMworCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMQorCW1vdmRxdQk4MCglcjEyKSwleG1tMTQKKwlweG9yCSV4bW0xMSwleG1tNgorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCW1vdmRxdQkleG1tMyw0OCglcjEzKQorCW1vdmRxdQkleG1tMSw2NCglcjEzKQorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCWptcAlMJGNiY19kZWNfZG9uZQorLnAyYWxpZ24JNAorTCRjYmNfZGVjX2ZpdmU6CisJbW92ZHFhCSV4bW0xNCwzMiglcmJwKQorCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisJcHhvcgkzMiglcmJwKSwleG1tMTUKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCW1vdmRxdQkxNiglcjEyKSwleG1tOAorCXB4b3IJJXhtbTcsJXhtbTAKKwltb3ZkcXUJMzIoJXIxMiksJXhtbTkKKwlweG9yCSV4bW04LCV4bW01CisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0xMAorCXB4b3IJJXhtbTksJXhtbTMKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTE0CisJcHhvcgkleG1tMTAsJXhtbTEKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwltb3ZkcXUJJXhtbTAsMTYoJXIxMykKKwltb3ZkcXUJJXhtbTUsMzIoJXIxMykKKwltb3ZkcXUJJXhtbTMsNDgoJXIxMykKKwltb3ZkcXUJJXhtbTEsNjQoJXIxMykKKwlqbXAJTCRjYmNfZGVjX2RvbmUKKy5wMmFsaWduCTQKK0wkY2JjX2RlY19mb3VyOgorCW1vdmRxYQkleG1tMTQsMzIoJXJicCkKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCXB4b3IJMzIoJXJicCksJXhtbTE1CisJbW92ZHF1CTAoJXIxMiksJXhtbTcKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwlweG9yCSV4bW03LCV4bW0wCisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxdQk0OCglcjEyKSwleG1tMTQKKwlweG9yCSV4bW05LCV4bW0zCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJbW92ZHF1CSV4bW0zLDQ4KCVyMTMpCisJam1wCUwkY2JjX2RlY19kb25lCisucDJhbGlnbgk0CitMJGNiY19kZWNfdGhyZWU6CisJbW92ZHFhCSV4bW0xNCwzMiglcmJwKQorCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisJcHhvcgkzMiglcmJwKSwleG1tMTUKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCW1vdmRxdQkxNiglcjEyKSwleG1tOAorCXB4b3IJJXhtbTcsJXhtbTAKKwltb3ZkcXUJMzIoJXIxMiksJXhtbTE0CisJcHhvcgkleG1tOCwleG1tNQorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCWptcAlMJGNiY19kZWNfZG9uZQorLnAyYWxpZ24JNAorTCRjYmNfZGVjX3R3bzoKKwltb3ZkcWEJJXhtbTE0LDMyKCVyYnApCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCTMyKCVyYnApLCV4bW0xNQorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJbW92ZHF1CTE2KCVyMTIpLCV4bW0xNAorCXB4b3IJJXhtbTcsJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwltb3ZkcXUJJXhtbTAsMTYoJXIxMykKKwlqbXAJTCRjYmNfZGVjX2RvbmUKKy5wMmFsaWduCTQKK0wkY2JjX2RlY19vbmU6CisJbGVhcQkoJXIxMiksJXJkaQorCWxlYXEJMzIoJXJicCksJXJzaQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCV9hZXNfbm9od19kZWNyeXB0CisJcHhvcgkzMiglcmJwKSwleG1tMTQKKwltb3ZkcXUJJXhtbTE0LCglcjEzKQorCW1vdmRxYQkleG1tMTUsJXhtbTE0CisKK0wkY2JjX2RlY19kb25lOgorCW1vdmRxdQkleG1tMTQsKCVyYngpCisJbGVhcQkoJXJzcCksJXJheAorCXB4b3IJJXhtbTAsJXhtbTAKK0wkY2JjX2RlY19iemVybzoKKwltb3ZkcWEJJXhtbTAsMCglcmF4KQorCW1vdmRxYQkleG1tMCwxNiglcmF4KQorCWxlYXEJMzIoJXJheCksJXJheAorCWNtcHEJJXJheCwlcmJwCisJamEJTCRjYmNfZGVjX2J6ZXJvCisKKwlsZWFxCTEyMCglcmJwKSwlcmF4CisKKwltb3ZxCS00OCglcmF4KSwlcjE1CisKKwltb3ZxCS00MCglcmF4KSwlcjE0CisKKwltb3ZxCS0zMiglcmF4KSwlcjEzCisKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisKKwltb3ZxCS0xNiglcmF4KSwlcmJ4CisKKwltb3ZxCS04KCVyYXgpLCVyYnAKKworCWxlYXEJKCVyYXgpLCVyc3AKKworTCRjYmNfZGVjX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLmdsb2JsCV9ic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworLnByaXZhdGVfZXh0ZXJuIF9ic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrcworCisucDJhbGlnbgk0CitfYnNhZXNfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CisKKwltb3ZxCSVyc3AsJXJheAorTCRjdHJfZW5jX3Byb2xvZ3VlOgorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCWxlYXEJLTcyKCVyc3ApLCVyc3AKKworCW1vdnEJJXJzcCwlcmJwCisKKwltb3ZkcXUJKCVyOCksJXhtbTAKKwltb3ZsCTI0MCglcmN4KSwlZWF4CisJbW92cQklcmRpLCVyMTIKKwltb3ZxCSVyc2ksJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKwltb3ZkcWEJJXhtbTAsMzIoJXJicCkKKwljbXBxCSQ4LCVyZHgKKwlqYglMJGN0cl9lbmNfc2hvcnQKKworCW1vdmwJJWVheCwlZWJ4CisJc2hscQkkNywlcmF4CisJc3VicQkkOTYsJXJheAorCXN1YnEJJXJheCwlcnNwCisKKwltb3ZxCSVyc3AsJXJheAorCW1vdnEJJXIxNSwlcmN4CisJbW92bAklZWJ4LCVyMTBkCisJY2FsbAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlweG9yCSV4bW02LCV4bW03CisJbW92ZHFhCSV4bW03LCglcmF4KQorCisJbW92ZHFhCSglcnNwKSwleG1tOAorCWxlYXEJTCRBREQxKCVyaXApLCVyMTEKKwltb3ZkcWEJMzIoJXJicCksJXhtbTE1CisJbW92ZHFhCS0zMiglcjExKSwleG1tNworLmJ5dGUJMTAyLDY4LDE1LDU2LDAsMTk5CisuYnl0ZQkxMDIsNjgsMTUsNTYsMCwyNTUKKwltb3ZkcWEJJXhtbTgsKCVyc3ApCisJam1wCUwkY3RyX2VuY19sb29wCisucDJhbGlnbgk0CitMJGN0cl9lbmNfbG9vcDoKKwltb3ZkcWEJJXhtbTE1LDMyKCVyYnApCisJbW92ZHFhCSV4bW0xNSwleG1tMAorCW1vdmRxYQkleG1tMTUsJXhtbTEKKwlwYWRkZAkwKCVyMTEpLCV4bW0wCisJbW92ZHFhCSV4bW0xNSwleG1tMgorCXBhZGRkCTE2KCVyMTEpLCV4bW0xCisJbW92ZHFhCSV4bW0xNSwleG1tMworCXBhZGRkCTMyKCVyMTEpLCV4bW0yCisJbW92ZHFhCSV4bW0xNSwleG1tNAorCXBhZGRkCTQ4KCVyMTEpLCV4bW0zCisJbW92ZHFhCSV4bW0xNSwleG1tNQorCXBhZGRkCTY0KCVyMTEpLCV4bW00CisJbW92ZHFhCSV4bW0xNSwleG1tNgorCXBhZGRkCTgwKCVyMTEpLCV4bW01CisJcGFkZGQJOTYoJXIxMSksJXhtbTYKKworCisKKwltb3ZkcWEJKCVyc3ApLCV4bW04CisJbGVhcQkxNiglcnNwKSwlcmF4CisJbW92ZHFhCS0xNiglcjExKSwleG1tNworCXB4b3IJJXhtbTgsJXhtbTE1CisJcHhvcgkleG1tOCwleG1tMAorCXB4b3IJJXhtbTgsJXhtbTEKKwlweG9yCSV4bW04LCV4bW0yCisuYnl0ZQkxMDIsNjgsMTUsNTYsMCwyNTUKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OQorCXB4b3IJJXhtbTgsJXhtbTMKKwlweG9yCSV4bW04LCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDcKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorCXB4b3IJJXhtbTgsJXhtbTUKKwlweG9yCSV4bW04LCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKy5ieXRlCTEwMiwxNSw1NiwwLDIzMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjM5CisuYnl0ZQkxMDIsMTUsNTYsMCwyNDcKKwlsZWFxCUwkQlMwKCVyaXApLCVyMTEKKwltb3ZsCSVlYngsJXIxMGQKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4X2JpdHNsaWNlCisKKwlzdWJxCSQ4LCVyMTQKKwlqYwlMJGN0cl9lbmNfbG9vcF9kb25lCisKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCW1vdmRxdQkxNiglcjEyKSwleG1tOAorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCW1vdmRxdQk0OCglcjEyKSwleG1tMTAKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTExCisJbW92ZHF1CTgwKCVyMTIpLCV4bW0xMgorCW1vdmRxdQk5NiglcjEyKSwleG1tMTMKKwltb3ZkcXUJMTEyKCVyMTIpLCV4bW0xNAorCWxlYXEJMTI4KCVyMTIpLCVyMTIKKwlweG9yCSV4bW0xNSwleG1tNworCW1vdmRxYQkzMiglcmJwKSwleG1tMTUKKwlweG9yCSV4bW04LCV4bW0wCisJbW92ZHF1CSV4bW03LDAoJXIxMykKKwlweG9yCSV4bW05LCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgkleG1tMTAsJXhtbTUKKwltb3ZkcXUJJXhtbTMsMzIoJXIxMykKKwlweG9yCSV4bW0xMSwleG1tMgorCW1vdmRxdQkleG1tNSw0OCglcjEzKQorCXB4b3IJJXhtbTEyLCV4bW02CisJbW92ZHF1CSV4bW0yLDY0KCVyMTMpCisJcHhvcgkleG1tMTMsJXhtbTEKKwltb3ZkcXUJJXhtbTYsODAoJXIxMykKKwlweG9yCSV4bW0xNCwleG1tNAorCW1vdmRxdQkleG1tMSw5NiglcjEzKQorCWxlYXEJTCRBREQxKCVyaXApLCVyMTEKKwltb3ZkcXUJJXhtbTQsMTEyKCVyMTMpCisJbGVhcQkxMjgoJXIxMyksJXIxMworCXBhZGRkCTExMiglcjExKSwleG1tMTUKKwlqbnoJTCRjdHJfZW5jX2xvb3AKKworCWptcAlMJGN0cl9lbmNfZG9uZQorLnAyYWxpZ24JNAorTCRjdHJfZW5jX2xvb3BfZG9uZToKKwlhZGRxCSQ4LCVyMTQKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCXB4b3IJJXhtbTcsJXhtbTE1CisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJY21wcQkkMiwlcjE0CisJamIJTCRjdHJfZW5jX2RvbmUKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwlweG9yCSV4bW04LCV4bW0wCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJamUJTCRjdHJfZW5jX2RvbmUKKwltb3ZkcXUJMzIoJXIxMiksJXhtbTkKKwlweG9yCSV4bW05LCV4bW0zCisJbW92ZHF1CSV4bW0zLDMyKCVyMTMpCisJY21wcQkkNCwlcjE0CisJamIJTCRjdHJfZW5jX2RvbmUKKwltb3ZkcXUJNDgoJXIxMiksJXhtbTEwCisJcHhvcgkleG1tMTAsJXhtbTUKKwltb3ZkcXUJJXhtbTUsNDgoJXIxMykKKwlqZQlMJGN0cl9lbmNfZG9uZQorCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMSwleG1tMgorCW1vdmRxdQkleG1tMiw2NCglcjEzKQorCWNtcHEJJDYsJXIxNAorCWpiCUwkY3RyX2VuY19kb25lCisJbW92ZHF1CTgwKCVyMTIpLCV4bW0xMgorCXB4b3IJJXhtbTEyLCV4bW02CisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJamUJTCRjdHJfZW5jX2RvbmUKKwltb3ZkcXUJOTYoJXIxMiksJXhtbTEzCisJcHhvcgkleG1tMTMsJXhtbTEKKwltb3ZkcXUJJXhtbTEsOTYoJXIxMykKKwlqbXAJTCRjdHJfZW5jX2RvbmUKKworLnAyYWxpZ24JNAorTCRjdHJfZW5jX3Nob3J0OgorCWxlYXEJMzIoJXJicCksJXJkaQorCWxlYXEJNDgoJXJicCksJXJzaQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCV9hZXNfbm9od19lbmNyeXB0CisJbW92ZHF1CSglcjEyKSwleG1tMAorCWxlYXEJMTYoJXIxMiksJXIxMgorCW1vdmwJNDQoJXJicCksJWVheAorCWJzd2FwbAklZWF4CisJcHhvcgk0OCglcmJwKSwleG1tMAorCWluY2wJJWVheAorCW1vdmRxdQkleG1tMCwoJXIxMykKKwlic3dhcGwJJWVheAorCWxlYXEJMTYoJXIxMyksJXIxMworCW1vdmwJJWVheCw0NCglcnNwKQorCWRlY3EJJXIxNAorCWpueglMJGN0cl9lbmNfc2hvcnQKKworTCRjdHJfZW5jX2RvbmU6CisJbGVhcQkoJXJzcCksJXJheAorCXB4b3IJJXhtbTAsJXhtbTAKK0wkY3RyX2VuY19iemVybzoKKwltb3ZkcWEJJXhtbTAsMCglcmF4KQorCW1vdmRxYQkleG1tMCwxNiglcmF4KQorCWxlYXEJMzIoJXJheCksJXJheAorCWNtcHEJJXJheCwlcmJwCisJamEJTCRjdHJfZW5jX2J6ZXJvCisKKwlsZWFxCTEyMCglcmJwKSwlcmF4CisKKwltb3ZxCS00OCglcmF4KSwlcjE1CisKKwltb3ZxCS00MCglcmF4KSwlcjE0CisKKwltb3ZxCS0zMiglcmF4KSwlcjEzCisKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisKKwltb3ZxCS0xNiglcmF4KSwlcmJ4CisKKwltb3ZxCS04KCVyYXgpLCVyYnAKKworCWxlYXEJKCVyYXgpLCVyc3AKKworTCRjdHJfZW5jX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfYnNhZXNfeHRzX2VuY3J5cHQKKy5wcml2YXRlX2V4dGVybiBfYnNhZXNfeHRzX2VuY3J5cHQKKworLnAyYWxpZ24JNAorX2JzYWVzX3h0c19lbmNyeXB0OgorCisJbW92cQklcnNwLCVyYXgKK0wkeHRzX2VuY19wcm9sb2d1ZToKKwlwdXNocQklcmJwCisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKwlsZWFxCS03MiglcnNwKSwlcnNwCisKKwltb3ZxCSVyc3AsJXJicAorCisJbW92cQklcmRpLCVyMTIKKwltb3ZxCSVyc2ksJXIxMworCW1vdnEJJXJkeCwlcjE0CisJbW92cQklcmN4LCVyMTUKKworCWxlYXEJKCVyOSksJXJkaQorCWxlYXEJMzIoJXJicCksJXJzaQorCWxlYXEJKCVyOCksJXJkeAorCWNhbGwJX2Flc19ub2h3X2VuY3J5cHQKKworCW1vdmwJMjQwKCVyMTUpLCVlYXgKKwltb3ZxCSVyMTQsJXJieAorCisJbW92bAklZWF4LCVlZHgKKwlzaGxxCSQ3LCVyYXgKKwlzdWJxCSQ5NiwlcmF4CisJc3VicQklcmF4LCVyc3AKKworCW1vdnEJJXJzcCwlcmF4CisJbW92cQklcjE1LCVyY3gKKwltb3ZsCSVlZHgsJXIxMGQKKwljYWxsCV9ic2Flc19rZXlfY29udmVydAorCXB4b3IJJXhtbTYsJXhtbTcKKwltb3ZkcWEJJXhtbTcsKCVyYXgpCisKKwlhbmRxCSQtMTYsJXIxNAorCXN1YnEJJDB4ODAsJXJzcAorCW1vdmRxYQkzMiglcmJwKSwleG1tNgorCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCUwkeHRzX21hZ2ljKCVyaXApLCV4bW0xMgorCXBjbXBndGQJJXhtbTYsJXhtbTE0CisKKwlzdWJxCSQweDgwLCVyMTQKKwlqYwlMJHh0c19lbmNfc2hvcnQKKwlqbXAJTCR4dHNfZW5jX2xvb3AKKworLnAyYWxpZ24JNAorTCR4dHNfZW5jX2xvb3A6CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTE1CisJbW92ZHFhCSV4bW02LDAoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMAorCW1vdmRxYQkleG1tNiwxNiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwltb3ZkcWEJJXhtbTYsMzIoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwlweG9yCSV4bW03LCV4bW0xNQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0yCisJbW92ZHFhCSV4bW02LDQ4KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJcHhvcgkleG1tOCwleG1tMAorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0zCisJbW92ZHFhCSV4bW02LDY0KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0xMAorCXB4b3IJJXhtbTksJXhtbTEKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tNAorCW1vdmRxYQkleG1tNiw4MCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMgorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW01CisJbW92ZHFhCSV4bW02LDk2KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTgwKCVyMTIpLCV4bW0xMgorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CTk2KCVyMTIpLCV4bW0xMworCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CTExMiglcjEyKSwleG1tMTQKKwlsZWFxCTEyOCglcjEyKSwlcjEyCisJbW92ZHFhCSV4bW02LDExMiglcnNwKQorCXB4b3IJJXhtbTEzLCV4bW01CisJbGVhcQkxMjgoJXJzcCksJXJheAorCXB4b3IJJXhtbTE0LCV4bW02CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMywzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTIKKwltb3ZkcXUJJXhtbTUsNDgoJXIxMykKKwlweG9yCTgwKCVyc3ApLCV4bW02CisJbW92ZHF1CSV4bW0yLDY0KCVyMTMpCisJcHhvcgk5NiglcnNwKSwleG1tMQorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCXB4b3IJMTEyKCVyc3ApLCV4bW00CisJbW92ZHF1CSV4bW0xLDk2KCVyMTMpCisJbW92ZHF1CSV4bW00LDExMiglcjEzKQorCWxlYXEJMTI4KCVyMTMpLCVyMTMKKworCW1vdmRxYQkxMTIoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJTCR4dHNfbWFnaWMoJXJpcCksJXhtbTEyCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCisJc3VicQkkMHg4MCwlcjE0CisJam5jCUwkeHRzX2VuY19sb29wCisKK0wkeHRzX2VuY19zaG9ydDoKKwlhZGRxCSQweDgwLCVyMTQKKwlqeglMJHh0c19lbmNfZG9uZQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0xNQorCW1vdmRxYQkleG1tNiwwKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwltb3ZkcWEJJXhtbTYsMTYoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCWNtcHEJJDE2LCVyMTQKKwlqZQlMJHh0c19lbmNfMQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0xCisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJY21wcQkkMzIsJXIxNAorCWplCUwkeHRzX2VuY18yCisJcHhvcgkleG1tNywleG1tMTUKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMgorCW1vdmRxYQkleG1tNiw0OCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCWNtcHEJJDQ4LCVyMTQKKwlqZQlMJHh0c19lbmNfMworCXB4b3IJJXhtbTgsJXhtbTAKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMworCW1vdmRxYQkleG1tNiw2NCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk0OCglcjEyKSwleG1tMTAKKwljbXBxCSQ2NCwlcjE0CisJamUJTCR4dHNfZW5jXzQKKwlweG9yCSV4bW05LCV4bW0xCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTYsODAoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTExCisJY21wcQkkODAsJXIxNAorCWplCUwkeHRzX2VuY181CisJcHhvcgkleG1tMTAsJXhtbTIKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tNQorCW1vdmRxYQkleG1tNiw5NiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwljbXBxCSQ5NiwlcjE0CisJamUJTCR4dHNfZW5jXzYKKwlweG9yCSV4bW0xMSwleG1tMworCW1vdmRxdQk5NiglcjEyKSwleG1tMTMKKwlweG9yCSV4bW0xMiwleG1tNAorCW1vdmRxYQkleG1tNiwxMTIoJXJzcCkKKwlsZWFxCTExMiglcjEyKSwlcjEyCisJcHhvcgkleG1tMTMsJXhtbTUKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMywzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTIKKwltb3ZkcXUJJXhtbTUsNDgoJXIxMykKKwlweG9yCTgwKCVyc3ApLCV4bW02CisJbW92ZHF1CSV4bW0yLDY0KCVyMTMpCisJcHhvcgk5NiglcnNwKSwleG1tMQorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCW1vdmRxdQkleG1tMSw5NiglcjEzKQorCWxlYXEJMTEyKCVyMTMpLCVyMTMKKworCW1vdmRxYQkxMTIoJXJzcCksJXhtbTYKKwlqbXAJTCR4dHNfZW5jX2RvbmUKKy5wMmFsaWduCTQKK0wkeHRzX2VuY182OgorCXB4b3IJJXhtbTExLCV4bW0zCisJbGVhcQk5NiglcjEyKSwlcjEyCisJcHhvcgkleG1tMTIsJXhtbTQKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMywzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTIKKwltb3ZkcXUJJXhtbTUsNDgoJXIxMykKKwlweG9yCTgwKCVyc3ApLCV4bW02CisJbW92ZHF1CSV4bW0yLDY0KCVyMTMpCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJbGVhcQk5NiglcjEzKSwlcjEzCisKKwltb3ZkcWEJOTYoJXJzcCksJXhtbTYKKwlqbXAJTCR4dHNfZW5jX2RvbmUKKy5wMmFsaWduCTQKK0wkeHRzX2VuY181OgorCXB4b3IJJXhtbTEwLCV4bW0yCisJbGVhcQk4MCglcjEyKSwlcjEyCisJcHhvcgkleG1tMTEsJXhtbTMKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMywzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTIKKwltb3ZkcXUJJXhtbTUsNDgoJXIxMykKKwltb3ZkcXUJJXhtbTIsNjQoJXIxMykKKwlsZWFxCTgwKCVyMTMpLCVyMTMKKworCW1vdmRxYQk4MCglcnNwKSwleG1tNgorCWptcAlMJHh0c19lbmNfZG9uZQorLnAyYWxpZ24JNAorTCR4dHNfZW5jXzQ6CisJcHhvcgkleG1tOSwleG1tMQorCWxlYXEJNjQoJXIxMiksJXIxMgorCXB4b3IJJXhtbTEwLCV4bW0yCisJbGVhcQkxMjgoJXJzcCksJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJMCglcnNwKSwleG1tMTUKKwlweG9yCTE2KCVyc3ApLCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJcHhvcgkzMiglcnNwKSwleG1tMworCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCXB4b3IJNDgoJXJzcCksJXhtbTUKKwltb3ZkcXUJJXhtbTMsMzIoJXIxMykKKwltb3ZkcXUJJXhtbTUsNDgoJXIxMykKKwlsZWFxCTY0KCVyMTMpLCVyMTMKKworCW1vdmRxYQk2NCglcnNwKSwleG1tNgorCWptcAlMJHh0c19lbmNfZG9uZQorLnAyYWxpZ24JNAorTCR4dHNfZW5jXzM6CisJcHhvcgkleG1tOCwleG1tMAorCWxlYXEJNDgoJXIxMiksJXIxMgorCXB4b3IJJXhtbTksJXhtbTEKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW0zCisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW0zLDMyKCVyMTMpCisJbGVhcQk0OCglcjEzKSwlcjEzCisKKwltb3ZkcWEJNDgoJXJzcCksJXhtbTYKKwlqbXAJTCR4dHNfZW5jX2RvbmUKKy5wMmFsaWduCTQKK0wkeHRzX2VuY18yOgorCXB4b3IJJXhtbTcsJXhtbTE1CisJbGVhcQkzMiglcjEyKSwlcjEyCisJcHhvcgkleG1tOCwleG1tMAorCWxlYXEJMTI4KCVyc3ApLCVyYXgKKwltb3ZsCSVlZHgsJXIxMGQKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCTAoJXJzcCksJXhtbTE1CisJcHhvcgkxNiglcnNwKSwleG1tMAorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCWxlYXEJMzIoJXIxMyksJXIxMworCisJbW92ZHFhCTMyKCVyc3ApLCV4bW02CisJam1wCUwkeHRzX2VuY19kb25lCisucDJhbGlnbgk0CitMJHh0c19lbmNfMToKKwlweG9yCSV4bW0xNSwleG1tNworCWxlYXEJMTYoJXIxMiksJXIxMgorCW1vdmRxYQkleG1tNywzMiglcmJwKQorCWxlYXEJMzIoJXJicCksJXJkaQorCWxlYXEJMzIoJXJicCksJXJzaQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCV9hZXNfbm9od19lbmNyeXB0CisJcHhvcgkzMiglcmJwKSwleG1tMTUKKworCisKKworCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbGVhcQkxNiglcjEzKSwlcjEzCisKKwltb3ZkcWEJMTYoJXJzcCksJXhtbTYKKworTCR4dHNfZW5jX2RvbmU6CisJYW5kbAkkMTUsJWVieAorCWp6CUwkeHRzX2VuY19yZXQKKwltb3ZxCSVyMTMsJXJkeAorCitMJHh0c19lbmNfc3RlYWw6CisJbW92emJsCSglcjEyKSwlZWF4CisJbW92emJsCS0xNiglcmR4KSwlZWN4CisJbGVhcQkxKCVyMTIpLCVyMTIKKwltb3ZiCSVhbCwtMTYoJXJkeCkKKwltb3ZiCSVjbCwwKCVyZHgpCisJbGVhcQkxKCVyZHgpLCVyZHgKKwlzdWJsCSQxLCVlYngKKwlqbnoJTCR4dHNfZW5jX3N0ZWFsCisKKwltb3ZkcXUJLTE2KCVyMTMpLCV4bW0xNQorCWxlYXEJMzIoJXJicCksJXJkaQorCXB4b3IJJXhtbTYsJXhtbTE1CisJbGVhcQkzMiglcmJwKSwlcnNpCisJbW92ZHFhCSV4bW0xNSwzMiglcmJwKQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCV9hZXNfbm9od19lbmNyeXB0CisJcHhvcgkzMiglcmJwKSwleG1tNgorCW1vdmRxdQkleG1tNiwtMTYoJXIxMykKKworTCR4dHNfZW5jX3JldDoKKwlsZWFxCSglcnNwKSwlcmF4CisJcHhvcgkleG1tMCwleG1tMAorTCR4dHNfZW5jX2J6ZXJvOgorCW1vdmRxYQkleG1tMCwwKCVyYXgpCisJbW92ZHFhCSV4bW0wLDE2KCVyYXgpCisJbGVhcQkzMiglcmF4KSwlcmF4CisJY21wcQklcmF4LCVyYnAKKwlqYQlMJHh0c19lbmNfYnplcm8KKworCWxlYXEJMTIwKCVyYnApLCVyYXgKKworCW1vdnEJLTQ4KCVyYXgpLCVyMTUKKworCW1vdnEJLTQwKCVyYXgpLCVyMTQKKworCW1vdnEJLTMyKCVyYXgpLCVyMTMKKworCW1vdnEJLTI0KCVyYXgpLCVyMTIKKworCW1vdnEJLTE2KCVyYXgpLCVyYngKKworCW1vdnEJLTgoJXJheCksJXJicAorCisJbGVhcQkoJXJheCksJXJzcAorCitMJHh0c19lbmNfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisuZ2xvYmwJX2JzYWVzX3h0c19kZWNyeXB0CisucHJpdmF0ZV9leHRlcm4gX2JzYWVzX3h0c19kZWNyeXB0CisKKy5wMmFsaWduCTQKK19ic2Flc194dHNfZGVjcnlwdDoKKworCW1vdnEJJXJzcCwlcmF4CitMJHh0c19kZWNfcHJvbG9ndWU6CisJcHVzaHEJJXJicAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJbGVhcQktNzIoJXJzcCksJXJzcAorCisJbW92cQklcnNwLCVyYnAKKwltb3ZxCSVyZGksJXIxMgorCW1vdnEJJXJzaSwlcjEzCisJbW92cQklcmR4LCVyMTQKKwltb3ZxCSVyY3gsJXIxNQorCisJbGVhcQkoJXI5KSwlcmRpCisJbGVhcQkzMiglcmJwKSwlcnNpCisJbGVhcQkoJXI4KSwlcmR4CisJY2FsbAlfYWVzX25vaHdfZW5jcnlwdAorCisJbW92bAkyNDAoJXIxNSksJWVheAorCW1vdnEJJXIxNCwlcmJ4CisKKwltb3ZsCSVlYXgsJWVkeAorCXNobHEJJDcsJXJheAorCXN1YnEJJDk2LCVyYXgKKwlzdWJxCSVyYXgsJXJzcAorCisJbW92cQklcnNwLCVyYXgKKwltb3ZxCSVyMTUsJXJjeAorCW1vdmwJJWVkeCwlcjEwZAorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgkoJXJzcCksJXhtbTcKKwltb3ZkcWEJJXhtbTYsKCVyYXgpCisJbW92ZHFhCSV4bW03LCglcnNwKQorCisJeG9ybAklZWF4LCVlYXgKKwlhbmRxCSQtMTYsJXIxNAorCXRlc3RsCSQxNSwlZWJ4CisJc2V0bnoJJWFsCisJc2hscQkkNCwlcmF4CisJc3VicQklcmF4LCVyMTQKKworCXN1YnEJJDB4ODAsJXJzcAorCW1vdmRxYQkzMiglcmJwKSwleG1tNgorCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCUwkeHRzX21hZ2ljKCVyaXApLCV4bW0xMgorCXBjbXBndGQJJXhtbTYsJXhtbTE0CisKKwlzdWJxCSQweDgwLCVyMTQKKwlqYwlMJHh0c19kZWNfc2hvcnQKKwlqbXAJTCR4dHNfZGVjX2xvb3AKKworLnAyYWxpZ24JNAorTCR4dHNfZGVjX2xvb3A6CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTE1CisJbW92ZHFhCSV4bW02LDAoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMAorCW1vdmRxYQkleG1tNiwxNiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkwKCVyMTIpLCV4bW03CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTEKKwltb3ZkcWEJJXhtbTYsMzIoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMTYoJXIxMiksJXhtbTgKKwlweG9yCSV4bW03LCV4bW0xNQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0yCisJbW92ZHFhCSV4bW02LDQ4KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTMyKCVyMTIpLCV4bW05CisJcHhvcgkleG1tOCwleG1tMAorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0zCisJbW92ZHFhCSV4bW02LDY0KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTQ4KCVyMTIpLCV4bW0xMAorCXB4b3IJJXhtbTksJXhtbTEKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tNAorCW1vdmRxYQkleG1tNiw4MCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk2NCglcjEyKSwleG1tMTEKKwlweG9yCSV4bW0xMCwleG1tMgorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW01CisJbW92ZHFhCSV4bW02LDk2KCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTgwKCVyMTIpLCV4bW0xMgorCXB4b3IJJXhtbTExLCV4bW0zCisJbW92ZHF1CTk2KCVyMTIpLCV4bW0xMworCXB4b3IJJXhtbTEyLCV4bW00CisJbW92ZHF1CTExMiglcjEyKSwleG1tMTQKKwlsZWFxCTEyOCglcjEyKSwlcjEyCisJbW92ZHFhCSV4bW02LDExMiglcnNwKQorCXB4b3IJJXhtbTEzLCV4bW01CisJbGVhcQkxMjgoJXJzcCksJXJheAorCXB4b3IJJXhtbTE0LCV4bW02CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tMworCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTMsNDgoJXIxMykKKwlweG9yCTgwKCVyc3ApLCV4bW02CisJbW92ZHF1CSV4bW0xLDY0KCVyMTMpCisJcHhvcgk5NiglcnNwKSwleG1tMgorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCXB4b3IJMTEyKCVyc3ApLCV4bW00CisJbW92ZHF1CSV4bW0yLDk2KCVyMTMpCisJbW92ZHF1CSV4bW00LDExMiglcjEzKQorCWxlYXEJMTI4KCVyMTMpLCVyMTMKKworCW1vdmRxYQkxMTIoJXJzcCksJXhtbTYKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJTCR4dHNfbWFnaWMoJXJpcCksJXhtbTEyCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCisJc3VicQkkMHg4MCwlcjE0CisJam5jCUwkeHRzX2RlY19sb29wCisKK0wkeHRzX2RlY19zaG9ydDoKKwlhZGRxCSQweDgwLCVyMTQKKwlqeglMJHh0c19kZWNfZG9uZQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0xNQorCW1vdmRxYQkleG1tNiwwKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwltb3ZkcWEJJXhtbTYsMTYoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJMCglcjEyKSwleG1tNworCWNtcHEJJDE2LCVyMTQKKwlqZQlMJHh0c19kZWNfMQorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJcHhvcgkleG1tMTQsJXhtbTE0CisJbW92ZHFhCSV4bW02LCV4bW0xCisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXB4b3IJJXhtbTEzLCV4bW02CisJbW92ZHF1CTE2KCVyMTIpLCV4bW04CisJY21wcQkkMzIsJXIxNAorCWplCUwkeHRzX2RlY18yCisJcHhvcgkleG1tNywleG1tMTUKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMgorCW1vdmRxYQkleG1tNiw0OCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQkzMiglcjEyKSwleG1tOQorCWNtcHEJJDQ4LCVyMTQKKwlqZQlMJHh0c19kZWNfMworCXB4b3IJJXhtbTgsJXhtbTAKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tMworCW1vdmRxYQkleG1tNiw2NCglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk0OCglcjEyKSwleG1tMTAKKwljbXBxCSQ2NCwlcjE0CisJamUJTCR4dHNfZGVjXzQKKwlweG9yCSV4bW05LCV4bW0xCisJcHNodWZkCSQweDEzLCV4bW0xNCwleG1tMTMKKwlweG9yCSV4bW0xNCwleG1tMTQKKwltb3ZkcWEJJXhtbTYsJXhtbTQKKwltb3ZkcWEJJXhtbTYsODAoJXJzcCkKKwlwYWRkcQkleG1tNiwleG1tNgorCXBhbmQJJXhtbTEyLCV4bW0xMworCXBjbXBndGQJJXhtbTYsJXhtbTE0CisJcHhvcgkleG1tMTMsJXhtbTYKKwltb3ZkcXUJNjQoJXIxMiksJXhtbTExCisJY21wcQkkODAsJXIxNAorCWplCUwkeHRzX2RlY181CisJcHhvcgkleG1tMTAsJXhtbTIKKwlwc2h1ZmQJJDB4MTMsJXhtbTE0LCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQkleG1tNiwleG1tNQorCW1vdmRxYQkleG1tNiw5NiglcnNwKQorCXBhZGRxCSV4bW02LCV4bW02CisJcGFuZAkleG1tMTIsJXhtbTEzCisJcGNtcGd0ZAkleG1tNiwleG1tMTQKKwlweG9yCSV4bW0xMywleG1tNgorCW1vdmRxdQk4MCglcjEyKSwleG1tMTIKKwljbXBxCSQ5NiwlcjE0CisJamUJTCR4dHNfZGVjXzYKKwlweG9yCSV4bW0xMSwleG1tMworCW1vdmRxdQk5NiglcjEyKSwleG1tMTMKKwlweG9yCSV4bW0xMiwleG1tNAorCW1vdmRxYQkleG1tNiwxMTIoJXJzcCkKKwlsZWFxCTExMiglcjEyKSwlcjEyCisJcHhvcgkleG1tMTMsJXhtbTUKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tMworCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTMsNDgoJXIxMykKKwlweG9yCTgwKCVyc3ApLCV4bW02CisJbW92ZHF1CSV4bW0xLDY0KCVyMTMpCisJcHhvcgk5NiglcnNwKSwleG1tMgorCW1vdmRxdQkleG1tNiw4MCglcjEzKQorCW1vdmRxdQkleG1tMiw5NiglcjEzKQorCWxlYXEJMTEyKCVyMTMpLCVyMTMKKworCW1vdmRxYQkxMTIoJXJzcCksJXhtbTYKKwlqbXAJTCR4dHNfZGVjX2RvbmUKKy5wMmFsaWduCTQKK0wkeHRzX2RlY182OgorCXB4b3IJJXhtbTExLCV4bW0zCisJbGVhcQk5NiglcjEyKSwlcjEyCisJcHhvcgkleG1tMTIsJXhtbTQKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tMworCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTMsNDgoJXIxMykKKwlweG9yCTgwKCVyc3ApLCV4bW02CisJbW92ZHF1CSV4bW0xLDY0KCVyMTMpCisJbW92ZHF1CSV4bW02LDgwKCVyMTMpCisJbGVhcQk5NiglcjEzKSwlcjEzCisKKwltb3ZkcWEJOTYoJXJzcCksJXhtbTYKKwlqbXAJTCR4dHNfZGVjX2RvbmUKKy5wMmFsaWduCTQKK0wkeHRzX2RlY181OgorCXB4b3IJJXhtbTEwLCV4bW0yCisJbGVhcQk4MCglcjEyKSwlcjEyCisJcHhvcgkleG1tMTEsJXhtbTMKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJcHhvcgk0OCglcnNwKSwleG1tMworCW1vdmRxdQkleG1tNSwzMiglcjEzKQorCXB4b3IJNjQoJXJzcCksJXhtbTEKKwltb3ZkcXUJJXhtbTMsNDgoJXIxMykKKwltb3ZkcXUJJXhtbTEsNjQoJXIxMykKKwlsZWFxCTgwKCVyMTMpLCVyMTMKKworCW1vdmRxYQk4MCglcnNwKSwleG1tNgorCWptcAlMJHh0c19kZWNfZG9uZQorLnAyYWxpZ24JNAorTCR4dHNfZGVjXzQ6CisJcHhvcgkleG1tOSwleG1tMQorCWxlYXEJNjQoJXIxMiksJXIxMgorCXB4b3IJJXhtbTEwLCV4bW0yCisJbGVhcQkxMjgoJXJzcCksJXJheAorCW1vdmwJJWVkeCwlcjEwZAorCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKworCXB4b3IJMCglcnNwKSwleG1tMTUKKwlweG9yCTE2KCVyc3ApLCV4bW0wCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJcHhvcgkzMiglcnNwKSwleG1tNQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCXB4b3IJNDgoJXJzcCksJXhtbTMKKwltb3ZkcXUJJXhtbTUsMzIoJXIxMykKKwltb3ZkcXUJJXhtbTMsNDgoJXIxMykKKwlsZWFxCTY0KCVyMTMpLCVyMTMKKworCW1vdmRxYQk2NCglcnNwKSwleG1tNgorCWptcAlMJHh0c19kZWNfZG9uZQorLnAyYWxpZ24JNAorTCR4dHNfZGVjXzM6CisJcHhvcgkleG1tOCwleG1tMAorCWxlYXEJNDgoJXIxMiksJXIxMgorCXB4b3IJJXhtbTksJXhtbTEKKwlsZWFxCTEyOCglcnNwKSwlcmF4CisJbW92bAklZWR4LCVyMTBkCisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgkwKCVyc3ApLCV4bW0xNQorCXB4b3IJMTYoJXJzcCksJXhtbTAKKwltb3ZkcXUJJXhtbTE1LDAoJXIxMykKKwlweG9yCTMyKCVyc3ApLCV4bW01CisJbW92ZHF1CSV4bW0wLDE2KCVyMTMpCisJbW92ZHF1CSV4bW01LDMyKCVyMTMpCisJbGVhcQk0OCglcjEzKSwlcjEzCisKKwltb3ZkcWEJNDgoJXJzcCksJXhtbTYKKwlqbXAJTCR4dHNfZGVjX2RvbmUKKy5wMmFsaWduCTQKK0wkeHRzX2RlY18yOgorCXB4b3IJJXhtbTcsJXhtbTE1CisJbGVhcQkzMiglcjEyKSwlcjEyCisJcHhvcgkleG1tOCwleG1tMAorCWxlYXEJMTI4KCVyc3ApLCVyYXgKKwltb3ZsCSVlZHgsJXIxMGQKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCTAoJXJzcCksJXhtbTE1CisJcHhvcgkxNiglcnNwKSwleG1tMAorCW1vdmRxdQkleG1tMTUsMCglcjEzKQorCW1vdmRxdQkleG1tMCwxNiglcjEzKQorCWxlYXEJMzIoJXIxMyksJXIxMworCisJbW92ZHFhCTMyKCVyc3ApLCV4bW02CisJam1wCUwkeHRzX2RlY19kb25lCisucDJhbGlnbgk0CitMJHh0c19kZWNfMToKKwlweG9yCSV4bW0xNSwleG1tNworCWxlYXEJMTYoJXIxMiksJXIxMgorCW1vdmRxYQkleG1tNywzMiglcmJwKQorCWxlYXEJMzIoJXJicCksJXJkaQorCWxlYXEJMzIoJXJicCksJXJzaQorCWxlYXEJKCVyMTUpLCVyZHgKKwljYWxsCV9hZXNfbm9od19kZWNyeXB0CisJcHhvcgkzMiglcmJwKSwleG1tMTUKKworCisKKworCisJbW92ZHF1CSV4bW0xNSwwKCVyMTMpCisJbGVhcQkxNiglcjEzKSwlcjEzCisKKwltb3ZkcWEJMTYoJXJzcCksJXhtbTYKKworTCR4dHNfZGVjX2RvbmU6CisJYW5kbAkkMTUsJWVieAorCWp6CUwkeHRzX2RlY19yZXQKKworCXB4b3IJJXhtbTE0LCV4bW0xNAorCW1vdmRxYQlMJHh0c19tYWdpYyglcmlwKSwleG1tMTIKKwlwY21wZ3RkCSV4bW02LCV4bW0xNAorCXBzaHVmZAkkMHgxMywleG1tMTQsJXhtbTEzCisJbW92ZHFhCSV4bW02LCV4bW01CisJcGFkZHEJJXhtbTYsJXhtbTYKKwlwYW5kCSV4bW0xMiwleG1tMTMKKwltb3ZkcXUJKCVyMTIpLCV4bW0xNQorCXB4b3IJJXhtbTEzLCV4bW02CisKKwlsZWFxCTMyKCVyYnApLCVyZGkKKwlweG9yCSV4bW02LCV4bW0xNQorCWxlYXEJMzIoJXJicCksJXJzaQorCW1vdmRxYQkleG1tMTUsMzIoJXJicCkKKwlsZWFxCSglcjE1KSwlcmR4CisJY2FsbAlfYWVzX25vaHdfZGVjcnlwdAorCXB4b3IJMzIoJXJicCksJXhtbTYKKwltb3ZxCSVyMTMsJXJkeAorCW1vdmRxdQkleG1tNiwoJXIxMykKKworTCR4dHNfZGVjX3N0ZWFsOgorCW1vdnpibAkxNiglcjEyKSwlZWF4CisJbW92emJsCSglcmR4KSwlZWN4CisJbGVhcQkxKCVyMTIpLCVyMTIKKwltb3ZiCSVhbCwoJXJkeCkKKwltb3ZiCSVjbCwxNiglcmR4KQorCWxlYXEJMSglcmR4KSwlcmR4CisJc3VibAkkMSwlZWJ4CisJam56CUwkeHRzX2RlY19zdGVhbAorCisJbW92ZHF1CSglcjEzKSwleG1tMTUKKwlsZWFxCTMyKCVyYnApLCVyZGkKKwlweG9yCSV4bW01LCV4bW0xNQorCWxlYXEJMzIoJXJicCksJXJzaQorCW1vdmRxYQkleG1tMTUsMzIoJXJicCkKKwlsZWFxCSglcjE1KSwlcmR4CisJY2FsbAlfYWVzX25vaHdfZGVjcnlwdAorCXB4b3IJMzIoJXJicCksJXhtbTUKKwltb3ZkcXUJJXhtbTUsKCVyMTMpCisKK0wkeHRzX2RlY19yZXQ6CisJbGVhcQkoJXJzcCksJXJheAorCXB4b3IJJXhtbTAsJXhtbTAKK0wkeHRzX2RlY19iemVybzoKKwltb3ZkcWEJJXhtbTAsMCglcmF4KQorCW1vdmRxYQkleG1tMCwxNiglcmF4KQorCWxlYXEJMzIoJXJheCksJXJheAorCWNtcHEJJXJheCwlcmJwCisJamEJTCR4dHNfZGVjX2J6ZXJvCisKKwlsZWFxCTEyMCglcmJwKSwlcmF4CisKKwltb3ZxCS00OCglcmF4KSwlcjE1CisKKwltb3ZxCS00MCglcmF4KSwlcjE0CisKKwltb3ZxCS0zMiglcmF4KSwlcjEzCisKKwltb3ZxCS0yNCglcmF4KSwlcjEyCisKKwltb3ZxCS0xNiglcmF4KSwlcmJ4CisKKwltb3ZxCS04KCVyYXgpLCVyYnAKKworCWxlYXEJKCVyYXgpLCVyc3AKKworTCR4dHNfZGVjX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNgorX2JzYWVzX2NvbnN0OgorTCRNMElTUjoKKy5xdWFkCTB4MGEwZTAyMDYwNzBiMGYwMywgMHgwMDA0MDgwYzBkMDEwNTA5CitMJElTUk0wOgorLnF1YWQJMHgwMTA0MGIwZTAyMDUwODBmLCAweDAzMDYwOTBjMDAwNzBhMGQKK0wkSVNSOgorLnF1YWQJMHgwNTA0MDcwNjAyMDEwMDAzLCAweDBmMGUwZDBjMDgwYjBhMDkKK0wkQlMwOgorLnF1YWQJMHg1NTU1NTU1NTU1NTU1NTU1LCAweDU1NTU1NTU1NTU1NTU1NTUKK0wkQlMxOgorLnF1YWQJMHgzMzMzMzMzMzMzMzMzMzMzLCAweDMzMzMzMzMzMzMzMzMzMzMKK0wkQlMyOgorLnF1YWQJMHgwZjBmMGYwZjBmMGYwZjBmLCAweDBmMGYwZjBmMGYwZjBmMGYKK0wkU1I6CisucXVhZAkweDA1MDQwNzA2MDAwMzAyMDEsIDB4MGYwZTBkMGMwYTA5MDgwYgorTCRTUk0wOgorLnF1YWQJMHgwMzA0MDkwZTAwMDUwYTBmLCAweDAxMDYwYjBjMDIwNzA4MGQKK0wkTTBTUjoKKy5xdWFkCTB4MGEwZTAyMDYwZjAzMDcwYiwgMHgwMDA0MDgwYzA1MDkwZDAxCitMJFNXUFVQOgorLnF1YWQJMHgwNzA2MDUwNDAzMDIwMTAwLCAweDBjMGQwZTBmMGIwYTA5MDgKK0wkU1dQVVBNMFNSOgorLnF1YWQJMHgwYTBkMDIwNjBjMDMwNzBiLCAweDAwMDQwODBmMDUwOTBlMDEKK0wkQUREMToKKy5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwMTAwMDAwMDAwCitMJEFERDI6CisucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDIwMDAwMDAwMAorTCRBREQzOgorLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAzMDAwMDAwMDAKK0wkQURENDoKKy5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwNDAwMDAwMDAwCitMJEFERDU6CisucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDUwMDAwMDAwMAorTCRBREQ2OgorLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDA2MDAwMDAwMDAKK0wkQURENzoKKy5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwNzAwMDAwMDAwCitMJEFERDg6CisucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDgwMDAwMDAwMAorTCR4dHNfbWFnaWM6CisubG9uZwkweDg3LDAsMSwwCitMJG1hc2tzOgorLnF1YWQJMHgwMTAxMDEwMTAxMDEwMTAxLCAweDAxMDEwMTAxMDEwMTAxMDEKKy5xdWFkCTB4MDIwMjAyMDIwMjAyMDIwMiwgMHgwMjAyMDIwMjAyMDIwMjAyCisucXVhZAkweDA0MDQwNDA0MDQwNDA0MDQsIDB4MDQwNDA0MDQwNDA0MDQwNAorLnF1YWQJMHgwODA4MDgwODA4MDgwODA4LCAweDA4MDgwODA4MDgwODA4MDgKK0wkTTA6CisucXVhZAkweDAyMDYwYTBlMDMwNzBiMGYsIDB4MDAwNDA4MGMwMTA1MDkwZAorTCQ2MzoKKy5xdWFkCTB4NjM2MzYzNjM2MzYzNjM2MywgMHg2MzYzNjM2MzYzNjM2MzYzCisuYnl0ZQk2NiwxMDUsMTE2LDQ1LDExNSwxMDgsMTA1LDk5LDEwMSwxMDAsMzIsNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ3LDgzLDgzLDgzLDY5LDUxLDQ0LDMyLDY5LDEwOSwxMDUsMTA4LDEwNSw5NywzMiw3NSwxOTUsMTY0LDExNSwxMTIsMTAxLDExNCw0NCwzMiw4MCwxMDEsMTE2LDEwMSwxMTQsMzIsODMsOTksMTA0LDExOSw5Nyw5OCwxMDEsNDQsMzIsNjUsMTEwLDEwMCwxMjEsMzIsODAsMTExLDEwOCwxMjEsOTcsMTA3LDExMSwxMTgsMAorLnAyYWxpZ24JNgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmIzM2MyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Nl82NC5TCkBAIC0wLDAgKzEsMTgzNCBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKworCisuZ2xvYmwJX2djbV9nbXVsdF80Yml0CisucHJpdmF0ZV9leHRlcm4gX2djbV9nbXVsdF80Yml0CisKKy5wMmFsaWduCTQKK19nY21fZ211bHRfNGJpdDoKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXN1YnEJJDI4MCwlcnNwCisKK0wkZ211bHRfcHJvbG9ndWU6CisKKwltb3Z6YnEJMTUoJXJkaSksJXI4CisJbGVhcQlMJHJlbV80Yml0KCVyaXApLCVyMTEKKwl4b3JxCSVyYXgsJXJheAorCXhvcnEJJXJieCwlcmJ4CisJbW92YgklcjhiLCVhbAorCW1vdmIJJXI4YiwlYmwKKwlzaGxiCSQ0LCVhbAorCW1vdnEJJDE0LCVyY3gKKwltb3ZxCTgoJXJzaSwlcmF4LDEpLCVyOAorCW1vdnEJKCVyc2ksJXJheCwxKSwlcjkKKwlhbmRiCSQweGYwLCVibAorCW1vdnEJJXI4LCVyZHgKKwlqbXAJTCRvb3AxCisKKy5wMmFsaWduCTQKK0wkb29wMToKKwlzaHJxCSQ0LCVyOAorCWFuZHEJJDB4ZiwlcmR4CisJbW92cQklcjksJXIxMAorCW1vdmIJKCVyZGksJXJjeCwxKSwlYWwKKwlzaHJxCSQ0LCVyOQorCXhvcnEJOCglcnNpLCVyYngsMSksJXI4CisJc2hscQkkNjAsJXIxMAorCXhvcnEJKCVyc2ksJXJieCwxKSwlcjkKKwltb3ZiCSVhbCwlYmwKKwl4b3JxCSglcjExLCVyZHgsOCksJXI5CisJbW92cQklcjgsJXJkeAorCXNobGIJJDQsJWFsCisJeG9ycQklcjEwLCVyOAorCWRlY3EJJXJjeAorCWpzCUwkYnJlYWsxCisKKwlzaHJxCSQ0LCVyOAorCWFuZHEJJDB4ZiwlcmR4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwlzaGxxCSQ2MCwlcjEwCisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCWFuZGIJJDB4ZjAsJWJsCisJeG9ycQkoJXIxMSwlcmR4LDgpLCVyOQorCW1vdnEJJXI4LCVyZHgKKwl4b3JxCSVyMTAsJXI4CisJam1wCUwkb29wMQorCisucDJhbGlnbgk0CitMJGJyZWFrMToKKwlzaHJxCSQ0LCVyOAorCWFuZHEJJDB4ZiwlcmR4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwlzaGxxCSQ2MCwlcjEwCisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCWFuZGIJJDB4ZjAsJWJsCisJeG9ycQkoJXIxMSwlcmR4LDgpLCVyOQorCW1vdnEJJXI4LCVyZHgKKwl4b3JxCSVyMTAsJXI4CisKKwlzaHJxCSQ0LCVyOAorCWFuZHEJJDB4ZiwlcmR4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJeG9ycQk4KCVyc2ksJXJieCwxKSwlcjgKKwlzaGxxCSQ2MCwlcjEwCisJeG9ycQkoJXJzaSwlcmJ4LDEpLCVyOQorCXhvcnEJJXIxMCwlcjgKKwl4b3JxCSglcjExLCVyZHgsOCksJXI5CisKKwlic3dhcHEJJXI4CisJYnN3YXBxCSVyOQorCW1vdnEJJXI4LDgoJXJkaSkKKwltb3ZxCSVyOSwoJXJkaSkKKworCWxlYXEJMjgwKzQ4KCVyc3ApLCVyc2kKKworCW1vdnEJLTgoJXJzaSksJXJieAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJGdtdWx0X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfZ2NtX2doYXNoXzRiaXQKKy5wcml2YXRlX2V4dGVybiBfZ2NtX2doYXNoXzRiaXQKKworLnAyYWxpZ24JNAorX2djbV9naGFzaF80Yml0OgorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJc3VicQkkMjgwLCVyc3AKKworTCRnaGFzaF9wcm9sb2d1ZToKKwltb3ZxCSVyZHgsJXIxNAorCW1vdnEJJXJjeCwlcjE1CisJc3VicQkkLTEyOCwlcnNpCisJbGVhcQkxNisxMjgoJXJzcCksJXJicAorCXhvcmwJJWVkeCwlZWR4CisJbW92cQkwKzAtMTI4KCVyc2kpLCVyOAorCW1vdnEJMCs4LTEyOCglcnNpKSwlcmF4CisJbW92YgklYWwsJWRsCisJc2hycQkkNCwlcmF4CisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJbW92cQkxNiswLTEyOCglcnNpKSwlcjkKKwlzaGxiCSQ0LCVkbAorCW1vdnEJMTYrOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCwwKCVyc3ApCisJb3JxCSVyMTAsJXJheAorCW1vdmIJJWJsLCVkbAorCXNocnEJJDQsJXJieAorCW1vdnEJJXI5LCVyMTAKKwlzaHJxCSQ0LCVyOQorCW1vdnEJJXI4LDAoJXJicCkKKwltb3ZxCTMyKzAtMTI4KCVyc2kpLCVyOAorCXNobGIJJDQsJWRsCisJbW92cQklcmF4LDAtMTI4KCVyYnApCisJbW92cQkzMis4LTEyOCglcnNpKSwlcmF4CisJc2hscQkkNjAsJXIxMAorCW1vdmIJJWRsLDEoJXJzcCkKKwlvcnEJJXIxMCwlcmJ4CisJbW92YgklYWwsJWRsCisJc2hycQkkNCwlcmF4CisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJbW92cQklcjksOCglcmJwKQorCW1vdnEJNDgrMC0xMjgoJXJzaSksJXI5CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYngsOC0xMjgoJXJicCkKKwltb3ZxCTQ4KzgtMTI4KCVyc2kpLCVyYngKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsMiglcnNwKQorCW9ycQklcjEwLCVyYXgKKwltb3ZiCSVibCwlZGwKKwlzaHJxCSQ0LCVyYngKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwltb3ZxCSVyOCwxNiglcmJwKQorCW1vdnEJNjQrMC0xMjgoJXJzaSksJXI4CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYXgsMTYtMTI4KCVyYnApCisJbW92cQk2NCs4LTEyOCglcnNpKSwlcmF4CisJc2hscQkkNjAsJXIxMAorCW1vdmIJJWRsLDMoJXJzcCkKKwlvcnEJJXIxMCwlcmJ4CisJbW92YgklYWwsJWRsCisJc2hycQkkNCwlcmF4CisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJbW92cQklcjksMjQoJXJicCkKKwltb3ZxCTgwKzAtMTI4KCVyc2kpLCVyOQorCXNobGIJJDQsJWRsCisJbW92cQklcmJ4LDI0LTEyOCglcmJwKQorCW1vdnEJODArOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCw0KCVyc3ApCisJb3JxCSVyMTAsJXJheAorCW1vdmIJJWJsLCVkbAorCXNocnEJJDQsJXJieAorCW1vdnEJJXI5LCVyMTAKKwlzaHJxCSQ0LCVyOQorCW1vdnEJJXI4LDMyKCVyYnApCisJbW92cQk5NiswLTEyOCglcnNpKSwlcjgKKwlzaGxiCSQ0LCVkbAorCW1vdnEJJXJheCwzMi0xMjgoJXJicCkKKwltb3ZxCTk2KzgtMTI4KCVyc2kpLCVyYXgKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsNSglcnNwKQorCW9ycQklcjEwLCVyYngKKwltb3ZiCSVhbCwlZGwKKwlzaHJxCSQ0LCVyYXgKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOSw0MCglcmJwKQorCW1vdnEJMTEyKzAtMTI4KCVyc2kpLCVyOQorCXNobGIJJDQsJWRsCisJbW92cQklcmJ4LDQwLTEyOCglcmJwKQorCW1vdnEJMTEyKzgtMTI4KCVyc2kpLCVyYngKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsNiglcnNwKQorCW9ycQklcjEwLCVyYXgKKwltb3ZiCSVibCwlZGwKKwlzaHJxCSQ0LCVyYngKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwltb3ZxCSVyOCw0OCglcmJwKQorCW1vdnEJMTI4KzAtMTI4KCVyc2kpLCVyOAorCXNobGIJJDQsJWRsCisJbW92cQklcmF4LDQ4LTEyOCglcmJwKQorCW1vdnEJMTI4KzgtMTI4KCVyc2kpLCVyYXgKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsNyglcnNwKQorCW9ycQklcjEwLCVyYngKKwltb3ZiCSVhbCwlZGwKKwlzaHJxCSQ0LCVyYXgKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOSw1NiglcmJwKQorCW1vdnEJMTQ0KzAtMTI4KCVyc2kpLCVyOQorCXNobGIJJDQsJWRsCisJbW92cQklcmJ4LDU2LTEyOCglcmJwKQorCW1vdnEJMTQ0KzgtMTI4KCVyc2kpLCVyYngKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsOCglcnNwKQorCW9ycQklcjEwLCVyYXgKKwltb3ZiCSVibCwlZGwKKwlzaHJxCSQ0LCVyYngKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwltb3ZxCSVyOCw2NCglcmJwKQorCW1vdnEJMTYwKzAtMTI4KCVyc2kpLCVyOAorCXNobGIJJDQsJWRsCisJbW92cQklcmF4LDY0LTEyOCglcmJwKQorCW1vdnEJMTYwKzgtMTI4KCVyc2kpLCVyYXgKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsOSglcnNwKQorCW9ycQklcjEwLCVyYngKKwltb3ZiCSVhbCwlZGwKKwlzaHJxCSQ0LCVyYXgKKwltb3ZxCSVyOCwlcjEwCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOSw3MiglcmJwKQorCW1vdnEJMTc2KzAtMTI4KCVyc2kpLCVyOQorCXNobGIJJDQsJWRsCisJbW92cQklcmJ4LDcyLTEyOCglcmJwKQorCW1vdnEJMTc2KzgtMTI4KCVyc2kpLCVyYngKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsMTAoJXJzcCkKKwlvcnEJJXIxMCwlcmF4CisJbW92YgklYmwsJWRsCisJc2hycQkkNCwlcmJ4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJbW92cQklcjgsODAoJXJicCkKKwltb3ZxCTE5MiswLTEyOCglcnNpKSwlcjgKKwlzaGxiCSQ0LCVkbAorCW1vdnEJJXJheCw4MC0xMjgoJXJicCkKKwltb3ZxCTE5Mis4LTEyOCglcnNpKSwlcmF4CisJc2hscQkkNjAsJXIxMAorCW1vdmIJJWRsLDExKCVyc3ApCisJb3JxCSVyMTAsJXJieAorCW1vdmIJJWFsLCVkbAorCXNocnEJJDQsJXJheAorCW1vdnEJJXI4LCVyMTAKKwlzaHJxCSQ0LCVyOAorCW1vdnEJJXI5LDg4KCVyYnApCisJbW92cQkyMDgrMC0xMjgoJXJzaSksJXI5CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYngsODgtMTI4KCVyYnApCisJbW92cQkyMDgrOC0xMjgoJXJzaSksJXJieAorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCwxMiglcnNwKQorCW9ycQklcjEwLCVyYXgKKwltb3ZiCSVibCwlZGwKKwlzaHJxCSQ0LCVyYngKKwltb3ZxCSVyOSwlcjEwCisJc2hycQkkNCwlcjkKKwltb3ZxCSVyOCw5NiglcmJwKQorCW1vdnEJMjI0KzAtMTI4KCVyc2kpLCVyOAorCXNobGIJJDQsJWRsCisJbW92cQklcmF4LDk2LTEyOCglcmJwKQorCW1vdnEJMjI0KzgtMTI4KCVyc2kpLCVyYXgKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsMTMoJXJzcCkKKwlvcnEJJXIxMCwlcmJ4CisJbW92YgklYWwsJWRsCisJc2hycQkkNCwlcmF4CisJbW92cQklcjgsJXIxMAorCXNocnEJJDQsJXI4CisJbW92cQklcjksMTA0KCVyYnApCisJbW92cQkyNDArMC0xMjgoJXJzaSksJXI5CisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYngsMTA0LTEyOCglcmJwKQorCW1vdnEJMjQwKzgtMTI4KCVyc2kpLCVyYngKKwlzaGxxCSQ2MCwlcjEwCisJbW92YgklZGwsMTQoJXJzcCkKKwlvcnEJJXIxMCwlcmF4CisJbW92YgklYmwsJWRsCisJc2hycQkkNCwlcmJ4CisJbW92cQklcjksJXIxMAorCXNocnEJJDQsJXI5CisJbW92cQklcjgsMTEyKCVyYnApCisJc2hsYgkkNCwlZGwKKwltb3ZxCSVyYXgsMTEyLTEyOCglcmJwKQorCXNobHEJJDYwLCVyMTAKKwltb3ZiCSVkbCwxNSglcnNwKQorCW9ycQklcjEwLCVyYngKKwltb3ZxCSVyOSwxMjAoJXJicCkKKwltb3ZxCSVyYngsMTIwLTEyOCglcmJwKQorCWFkZHEJJC0xMjgsJXJzaQorCW1vdnEJOCglcmRpKSwlcjgKKwltb3ZxCTAoJXJkaSksJXI5CisJYWRkcQklcjE0LCVyMTUKKwlsZWFxCUwkcmVtXzhiaXQoJXJpcCksJXIxMQorCWptcAlMJG91dGVyX2xvb3AKKy5wMmFsaWduCTQKK0wkb3V0ZXJfbG9vcDoKKwl4b3JxCSglcjE0KSwlcjkKKwltb3ZxCTgoJXIxNCksJXJkeAorCWxlYXEJMTYoJXIxNCksJXIxNAorCXhvcnEJJXI4LCVyZHgKKwltb3ZxCSVyOSwoJXJkaSkKKwltb3ZxCSVyZHgsOCglcmRpKQorCXNocnEJJDMyLCVyZHgKKwl4b3JxCSVyYXgsJXJheAorCXJvbGwJJDgsJWVkeAorCW1vdmIJJWRsLCVhbAorCW1vdnpibAklZGwsJWVieAorCXNobGIJJDQsJWFsCisJc2hybAkkNCwlZWJ4CisJcm9sbAkkOCwlZWR4CisJbW92cQk4KCVyc2ksJXJheCwxKSwlcjgKKwltb3ZxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJbW92emJsCSVkbCwlZWN4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJieCwxKSwlcjEyCisJc2hybAkkNCwlZWN4CisJeG9ycQklcjgsJXIxMgorCW1vdnEJJXI5LCVyMTAKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEyYiwlcjEyCisJc2hycQkkOCwlcjkKKwl4b3JxCS0xMjgoJXJicCwlcmJ4LDgpLCVyOAorCXNobHEJJDU2LCVyMTAKKwl4b3JxCSglcmJwLCVyYngsOCksJXI5CisJcm9sbAkkOCwlZWR4CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJeG9ycQklcjEwLCVyOAorCW1vdnp3cQkoJXIxMSwlcjEyLDIpLCVyMTIKKwltb3Z6YmwJJWRsLCVlYngKKwlzaGxiCSQ0LCVhbAorCW1vdnpicQkoJXJzcCwlcmN4LDEpLCVyMTMKKwlzaHJsCSQ0LCVlYngKKwlzaGxxCSQ0OCwlcjEyCisJeG9ycQklcjgsJXIxMworCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTIsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxM2IsJXIxMworCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJjeCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmN4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMywyKSwlcjEzCisJbW92emJsCSVkbCwlZWN4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJieCwxKSwlcjEyCisJc2hybAkkNCwlZWN4CisJc2hscQkkNDgsJXIxMworCXhvcnEJJXI4LCVyMTIKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEzLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTJiLCVyMTIKKwltb3ZsCTgoJXJkaSksJWVkeAorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJbW92emJsCSVkbCwlZWJ4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJjeCwxKSwlcjEzCisJc2hybAkkNCwlZWJ4CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEyLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTNiLCVyMTMKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyY3gsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJjeCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCXNocmwJJDQsJWVjeAorCXNobHEJJDQ4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMywlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEyYiwlcjEyCisJc2hycQkkOCwlcjkKKwl4b3JxCS0xMjgoJXJicCwlcmJ4LDgpLCVyOAorCXNobHEJJDU2LCVyMTAKKwl4b3JxCSglcmJwLCVyYngsOCksJXI5CisJcm9sbAkkOCwlZWR4CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJeG9ycQklcjEwLCVyOAorCW1vdnp3cQkoJXIxMSwlcjEyLDIpLCVyMTIKKwltb3Z6YmwJJWRsLCVlYngKKwlzaGxiCSQ0LCVhbAorCW1vdnpicQkoJXJzcCwlcmN4LDEpLCVyMTMKKwlzaHJsCSQ0LCVlYngKKwlzaGxxCSQ0OCwlcjEyCisJeG9ycQklcjgsJXIxMworCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTIsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxM2IsJXIxMworCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJjeCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmN4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMywyKSwlcjEzCisJbW92emJsCSVkbCwlZWN4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJieCwxKSwlcjEyCisJc2hybAkkNCwlZWN4CisJc2hscQkkNDgsJXIxMworCXhvcnEJJXI4LCVyMTIKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEzLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTJiLCVyMTIKKwltb3ZsCTQoJXJkaSksJWVkeAorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJbW92emJsCSVkbCwlZWJ4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJjeCwxKSwlcjEzCisJc2hybAkkNCwlZWJ4CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEyLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTNiLCVyMTMKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyY3gsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJjeCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCXNocmwJJDQsJWVjeAorCXNobHEJJDQ4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMywlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEyYiwlcjEyCisJc2hycQkkOCwlcjkKKwl4b3JxCS0xMjgoJXJicCwlcmJ4LDgpLCVyOAorCXNobHEJJDU2LCVyMTAKKwl4b3JxCSglcmJwLCVyYngsOCksJXI5CisJcm9sbAkkOCwlZWR4CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJeG9ycQklcjEwLCVyOAorCW1vdnp3cQkoJXIxMSwlcjEyLDIpLCVyMTIKKwltb3Z6YmwJJWRsLCVlYngKKwlzaGxiCSQ0LCVhbAorCW1vdnpicQkoJXJzcCwlcmN4LDEpLCVyMTMKKwlzaHJsCSQ0LCVlYngKKwlzaGxxCSQ0OCwlcjEyCisJeG9ycQklcjgsJXIxMworCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTIsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxM2IsJXIxMworCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJjeCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmN4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMywyKSwlcjEzCisJbW92emJsCSVkbCwlZWN4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJieCwxKSwlcjEyCisJc2hybAkkNCwlZWN4CisJc2hscQkkNDgsJXIxMworCXhvcnEJJXI4LCVyMTIKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEzLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTJiLCVyMTIKKwltb3ZsCTAoJXJkaSksJWVkeAorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMiwyKSwlcjEyCisJbW92emJsCSVkbCwlZWJ4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJjeCwxKSwlcjEzCisJc2hybAkkNCwlZWJ4CisJc2hscQkkNDgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwltb3ZxCSVyOSwlcjEwCisJeG9ycQklcjEyLCVyOQorCXNocnEJJDgsJXI4CisJbW92emJxCSVyMTNiLCVyMTMKKwlzaHJxCSQ4LCVyOQorCXhvcnEJLTEyOCglcmJwLCVyY3gsOCksJXI4CisJc2hscQkkNTYsJXIxMAorCXhvcnEJKCVyYnAsJXJjeCw4KSwlcjkKKwlyb2xsCSQ4LCVlZHgKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwltb3ZiCSVkbCwlYWwKKwl4b3JxCSVyMTAsJXI4CisJbW92endxCSglcjExLCVyMTMsMiksJXIxMworCW1vdnpibAklZGwsJWVjeAorCXNobGIJJDQsJWFsCisJbW92emJxCSglcnNwLCVyYngsMSksJXIxMgorCXNocmwJJDQsJWVjeAorCXNobHEJJDQ4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJbW92cQklcjksJXIxMAorCXhvcnEJJXIxMywlcjkKKwlzaHJxCSQ4LCVyOAorCW1vdnpicQklcjEyYiwlcjEyCisJc2hycQkkOCwlcjkKKwl4b3JxCS0xMjgoJXJicCwlcmJ4LDgpLCVyOAorCXNobHEJJDU2LCVyMTAKKwl4b3JxCSglcmJwLCVyYngsOCksJXI5CisJcm9sbAkkOCwlZWR4CisJeG9ycQk4KCVyc2ksJXJheCwxKSwlcjgKKwl4b3JxCSglcnNpLCVyYXgsMSksJXI5CisJbW92YgklZGwsJWFsCisJeG9ycQklcjEwLCVyOAorCW1vdnp3cQkoJXIxMSwlcjEyLDIpLCVyMTIKKwltb3Z6YmwJJWRsLCVlYngKKwlzaGxiCSQ0LCVhbAorCW1vdnpicQkoJXJzcCwlcmN4LDEpLCVyMTMKKwlzaHJsCSQ0LCVlYngKKwlzaGxxCSQ0OCwlcjEyCisJeG9ycQklcjgsJXIxMworCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTIsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxM2IsJXIxMworCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJjeCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmN4LDgpLCVyOQorCXJvbGwJJDgsJWVkeAorCXhvcnEJOCglcnNpLCVyYXgsMSksJXI4CisJeG9ycQkoJXJzaSwlcmF4LDEpLCVyOQorCW1vdmIJJWRsLCVhbAorCXhvcnEJJXIxMCwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMywyKSwlcjEzCisJbW92emJsCSVkbCwlZWN4CisJc2hsYgkkNCwlYWwKKwltb3Z6YnEJKCVyc3AsJXJieCwxKSwlcjEyCisJYW5kbAkkMjQwLCVlY3gKKwlzaGxxCSQ0OCwlcjEzCisJeG9ycQklcjgsJXIxMgorCW1vdnEJJXI5LCVyMTAKKwl4b3JxCSVyMTMsJXI5CisJc2hycQkkOCwlcjgKKwltb3Z6YnEJJXIxMmIsJXIxMgorCW1vdmwJLTQoJXJkaSksJWVkeAorCXNocnEJJDgsJXI5CisJeG9ycQktMTI4KCVyYnAsJXJieCw4KSwlcjgKKwlzaGxxCSQ1NiwlcjEwCisJeG9ycQkoJXJicCwlcmJ4LDgpLCVyOQorCW1vdnp3cQkoJXIxMSwlcjEyLDIpLCVyMTIKKwl4b3JxCTgoJXJzaSwlcmF4LDEpLCVyOAorCXhvcnEJKCVyc2ksJXJheCwxKSwlcjkKKwlzaGxxCSQ0OCwlcjEyCisJeG9ycQklcjEwLCVyOAorCXhvcnEJJXIxMiwlcjkKKwltb3Z6YnEJJXI4YiwlcjEzCisJc2hycQkkNCwlcjgKKwltb3ZxCSVyOSwlcjEwCisJc2hsYgkkNCwlcjEzYgorCXNocnEJJDQsJXI5CisJeG9ycQk4KCVyc2ksJXJjeCwxKSwlcjgKKwltb3Z6d3EJKCVyMTEsJXIxMywyKSwlcjEzCisJc2hscQkkNjAsJXIxMAorCXhvcnEJKCVyc2ksJXJjeCwxKSwlcjkKKwl4b3JxCSVyMTAsJXI4CisJc2hscQkkNDgsJXIxMworCWJzd2FwcQklcjgKKwl4b3JxCSVyMTMsJXI5CisJYnN3YXBxCSVyOQorCWNtcHEJJXIxNSwlcjE0CisJamIJTCRvdXRlcl9sb29wCisJbW92cQklcjgsOCglcmRpKQorCW1vdnEJJXI5LCglcmRpKQorCisJbGVhcQkyODArNDgoJXJzcCksJXJzaQorCisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJicAorCisJbW92cQktOCglcnNpKSwlcmJ4CisKKwlsZWFxCTAoJXJzaSksJXJzcAorCitMJGdoYXNoX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfZ2NtX2luaXRfY2xtdWwKKy5wcml2YXRlX2V4dGVybiBfZ2NtX2luaXRfY2xtdWwKKworLnAyYWxpZ24JNAorX2djbV9pbml0X2NsbXVsOgorTCRfaW5pdF9jbG11bDoKKwltb3ZkcXUJKCVyc2kpLCV4bW0yCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMgorCisKKwlwc2h1ZmQJJDI1NSwleG1tMiwleG1tNAorCW1vdmRxYQkleG1tMiwleG1tMworCXBzbGxxCSQxLCV4bW0yCisJcHhvcgkleG1tNSwleG1tNQorCXBzcmxxCSQ2MywleG1tMworCXBjbXBndGQJJXhtbTQsJXhtbTUKKwlwc2xsZHEJJDgsJXhtbTMKKwlwb3IJJXhtbTMsJXhtbTIKKworCisJcGFuZAlMJDB4MWMyX3BvbHlub21pYWwoJXJpcCksJXhtbTUKKwlweG9yCSV4bW01LCV4bW0yCisKKworCXBzaHVmZAkkNzgsJXhtbTIsJXhtbTYKKwltb3ZkcWEJJXhtbTIsJXhtbTAKKwlweG9yCSV4bW0yLCV4bW02CisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMCwleG1tMworCXB4b3IJJXhtbTAsJXhtbTMKKy5ieXRlCTEwMiwxNSw1OCw2OCwxOTQsMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIwMiwxNworLmJ5dGUJMTAyLDE1LDU4LDY4LDIyMiwwCisJcHhvcgkleG1tMCwleG1tMworCXB4b3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tMywleG1tNAorCXBzcmxkcQkkOCwleG1tMworCXBzbGxkcQkkOCwleG1tNAorCXB4b3IJJXhtbTMsJXhtbTEKKwlweG9yCSV4bW00LCV4bW0wCisKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlwc2xscQkkMSwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTAKKwlwc2xscQkkNTcsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTAKKwlwc3JsZHEJJDgsJXhtbTMKKwlweG9yCSV4bW00LCV4bW0wCisJcHhvcgkleG1tMywleG1tMQorCisKKwltb3ZkcWEJJXhtbTAsJXhtbTQKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTEKKwlweG9yCSV4bW0wLCV4bW00CisJcHNybHEJJDUsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0wCisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0wCisJcHNodWZkCSQ3OCwleG1tMiwleG1tMworCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTQKKwlweG9yCSV4bW0yLCV4bW0zCisJbW92ZHF1CSV4bW0yLDAoJXJkaSkKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHF1CSV4bW0wLDE2KCVyZGkpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI3LDgKKwltb3ZkcXUJJXhtbTQsMzIoJXJkaSkKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIyLDAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisKKworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJJXhtbTAsJXhtbTUKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMworLmJ5dGUJMTAyLDE1LDU4LDY4LDE5NCwwCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjAyLDE3CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjIyLDAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHhvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW0zLCV4bW00CisJcHNybGRxCSQ4LCV4bW0zCisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisKKworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDc4LCV4bW01LCV4bW0zCisJcHNodWZkCSQ3OCwleG1tMCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTMKKwltb3ZkcXUJJXhtbTUsNDgoJXJkaSkKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHF1CSV4bW0wLDY0KCVyZGkpCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI3LDgKKwltb3ZkcXUJJXhtbTQsODAoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKKworLmdsb2JsCV9nY21fZ211bHRfY2xtdWwKKy5wcml2YXRlX2V4dGVybiBfZ2NtX2dtdWx0X2NsbXVsCisKKy5wMmFsaWduCTQKK19nY21fZ211bHRfY2xtdWw6CitMJF9nbXVsdF9jbG11bDoKKwltb3ZkcXUJKCVyZGkpLCV4bW0wCisJbW92ZHFhCUwkYnN3YXBfbWFzayglcmlwKSwleG1tNQorCW1vdmRxdQkoJXJzaSksJXhtbTIKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworCW1vdmRxYQkleG1tMCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk0LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDIsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMjAsMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTMsJXhtbTQKKwlwc3JsZHEJJDgsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCisJbW92ZHFhCSV4bW0wLCV4bW00CisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbHEJJDUsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbHEJJDEsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbHEJJDU3LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ4LCV4bW0wCisJcHNybGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTEKKworCisJbW92ZHFhCSV4bW0wLCV4bW00CisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNAorCXBzcmxxCSQ1LCV4bW0wCisJcHhvcgkleG1tNCwleG1tMAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisJbW92ZHF1CSV4bW0wLCglcmRpKQorCS5ieXRlCTB4ZjMsMHhjMworCisuZ2xvYmwJX2djbV9naGFzaF9jbG11bAorLnByaXZhdGVfZXh0ZXJuIF9nY21fZ2hhc2hfY2xtdWwKKworLnAyYWxpZ24JNQorX2djbV9naGFzaF9jbG11bDoKK0wkX2doYXNoX2NsbXVsOgorCW1vdmRxYQlMJGJzd2FwX21hc2soJXJpcCksJXhtbTEwCisKKwltb3ZkcXUJKCVyZGkpLCV4bW0wCisJbW92ZHF1CSglcnNpKSwleG1tMgorCW1vdmRxdQkzMiglcnNpKSwleG1tNworLmJ5dGUJMTAyLDY1LDE1LDU2LDAsMTk0CisKKwlzdWJxCSQweDEwLCVyY3gKKwlqeglMJG9kZF90YWlsCisKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTYKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmF4CisJbW92bAk0KCVyYXgpLCVlYXgKKwljbXBxCSQweDMwLCVyY3gKKwlqYglMJHNraXA0eAorCisJYW5kbAkkNzEzMDMxNjgsJWVheAorCWNtcGwJJDQxOTQzMDQsJWVheAorCWplCUwkc2tpcDR4CisKKwlzdWJxCSQweDMwLCVyY3gKKwltb3ZxCSQweEEwNDA2MDgwMjBDMEUwMDAsJXJheAorCW1vdmRxdQk0OCglcnNpKSwleG1tMTQKKwltb3ZkcXUJNjQoJXJzaSksJXhtbTE1CisKKworCisKKwltb3ZkcXUJNDgoJXJkeCksJXhtbTMKKwltb3ZkcXUJMzIoJXJkeCksJXhtbTExCisuYnl0ZQkxMDIsNjUsMTUsNTYsMCwyMTgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIxOAorCW1vdmRxYQkleG1tMywleG1tNQorCXBzaHVmZAkkNzgsJXhtbTMsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjE4LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzQsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzEsMAorCisJbW92ZHFhCSV4bW0xMSwleG1tMTMKKwlwc2h1ZmQJJDc4LCV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW0xMSwleG1tMTIKKy5ieXRlCTEwMiw2OCwxNSw1OCw2OCwyMjIsMAorLmJ5dGUJMTAyLDY4LDE1LDU4LDY4LDIzOCwxNworLmJ5dGUJMTAyLDY4LDE1LDU4LDY4LDIzMSwxNgorCXhvcnBzCSV4bW0xMSwleG1tMworCXhvcnBzCSV4bW0xMywleG1tNQorCW1vdnVwcwk4MCglcnNpKSwleG1tNworCXhvcnBzCSV4bW0xMiwleG1tNAorCisJbW92ZHF1CTE2KCVyZHgpLCV4bW0xMQorCW1vdmRxdQkwKCVyZHgpLCV4bW04CisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMTgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDE5NAorCW1vdmRxYQkleG1tMTEsJXhtbTEzCisJcHNodWZkCSQ3OCwleG1tMTEsJXhtbTEyCisJcHhvcgkleG1tOCwleG1tMAorCXB4b3IJJXhtbTExLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDY4LDIyMiwwCisJbW92ZHFhCSV4bW0wLCV4bW0xCisJcHNodWZkCSQ3OCwleG1tMCwleG1tOAorCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiw2OSwxNSw1OCw2OCwyMzgsMTcKKy5ieXRlCTEwMiw2OCwxNSw1OCw2OCwyMzEsMAorCXhvcnBzCSV4bW0xMSwleG1tMworCXhvcnBzCSV4bW0xMywleG1tNQorCisJbGVhcQk2NCglcmR4KSwlcmR4CisJc3VicQkkMHg0MCwlcmN4CisJamMJTCR0YWlsNHgKKworCWptcAlMJG1vZDRfbG9vcAorLnAyYWxpZ24JNQorTCRtb2Q0X2xvb3A6CisuYnl0ZQkxMDIsNjUsMTUsNTgsNjgsMTk5LDAKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwltb3ZkcXUJNDgoJXJkeCksJXhtbTExCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMTgKKy5ieXRlCTEwMiw2NSwxNSw1OCw2OCwyMDcsMTcKKwl4b3JwcwkleG1tMywleG1tMAorCW1vdmRxdQkzMiglcmR4KSwleG1tMworCW1vdmRxYQkleG1tMTEsJXhtbTEzCisuYnl0ZQkxMDIsNjgsMTUsNTgsNjgsMTk5LDE2CisJcHNodWZkCSQ3OCwleG1tMTEsJXhtbTEyCisJeG9ycHMJJXhtbTUsJXhtbTEKKwlweG9yCSV4bW0xMSwleG1tMTIKKy5ieXRlCTEwMiw2NSwxNSw1NiwwLDIxOAorCW1vdnVwcwkzMiglcnNpKSwleG1tNworCXhvcnBzCSV4bW00LCV4bW04CisuYnl0ZQkxMDIsNjgsMTUsNTgsNjgsMjE4LDAKKwlwc2h1ZmQJJDc4LCV4bW0zLCV4bW00CisKKwlweG9yCSV4bW0wLCV4bW04CisJbW92ZHFhCSV4bW0zLCV4bW01CisJcHhvcgkleG1tMSwleG1tOAorCXB4b3IJJXhtbTMsJXhtbTQKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKy5ieXRlCTEwMiw2OCwxNSw1OCw2OCwyMzQsMTcKKwlwc2xsZHEJJDgsJXhtbTgKKwlwc3JsZHEJJDgsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0wCisJbW92ZHFhCUwkN19tYXNrKCVyaXApLCV4bW04CisJcHhvcgkleG1tOSwleG1tMQorLmJ5dGUJMTAyLDc2LDE1LDExMCwyMDAKKworCXBhbmQJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIwMAorCXB4b3IJJXhtbTAsJXhtbTkKKy5ieXRlCTEwMiw2OCwxNSw1OCw2OCwyMzEsMAorCXBzbGxxCSQ1NywleG1tOQorCW1vdmRxYQkleG1tOSwleG1tOAorCXBzbGxkcQkkOCwleG1tOQorLmJ5dGUJMTAyLDE1LDU4LDY4LDIyMiwwCisJcHNybGRxCSQ4LCV4bW04CisJcHhvcgkleG1tOSwleG1tMAorCXB4b3IJJXhtbTgsJXhtbTEKKwltb3ZkcXUJMCglcmR4KSwleG1tOAorCisJbW92ZHFhCSV4bW0wLCV4bW05CisJcHNybHEJJDEsJXhtbTAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzgsMTcKKwl4b3JwcwkleG1tMTEsJXhtbTMKKwltb3ZkcXUJMTYoJXJkeCksJXhtbTExCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwyMTgKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzEsMTYKKwl4b3JwcwkleG1tMTMsJXhtbTUKKwltb3Z1cHMJODAoJXJzaSksJXhtbTcKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDE5NAorCXB4b3IJJXhtbTksJXhtbTEKKwlweG9yCSV4bW0wLCV4bW05CisJcHNybHEJJDUsJXhtbTAKKworCW1vdmRxYQkleG1tMTEsJXhtbTEzCisJcHhvcgkleG1tMTIsJXhtbTQKKwlwc2h1ZmQJJDc4LCV4bW0xMSwleG1tMTIKKwlweG9yCSV4bW05LCV4bW0wCisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTExLCV4bW0xMgorLmJ5dGUJMTAyLDY5LDE1LDU4LDY4LDIyMiwwCisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0xCisuYnl0ZQkxMDIsNjksMTUsNTgsNjgsMjM4LDE3CisJeG9ycHMJJXhtbTExLCV4bW0zCisJcHNodWZkCSQ3OCwleG1tMCwleG1tOAorCXB4b3IJJXhtbTAsJXhtbTgKKworLmJ5dGUJMTAyLDY4LDE1LDU4LDY4LDIzMSwwCisJeG9ycHMJJXhtbTEzLCV4bW01CisKKwlsZWFxCTY0KCVyZHgpLCVyZHgKKwlzdWJxCSQweDQwLCVyY3gKKwlqbmMJTCRtb2Q0X2xvb3AKKworTCR0YWlsNHg6CisuYnl0ZQkxMDIsNjUsMTUsNTgsNjgsMTk5LDAKKy5ieXRlCTEwMiw2NSwxNSw1OCw2OCwyMDcsMTcKKy5ieXRlCTEwMiw2OCwxNSw1OCw2OCwxOTksMTYKKwl4b3JwcwkleG1tMTIsJXhtbTQKKwl4b3JwcwkleG1tMywleG1tMAorCXhvcnBzCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMCwleG1tMQorCXB4b3IJJXhtbTQsJXhtbTgKKworCXB4b3IJJXhtbTEsJXhtbTgKKwlweG9yCSV4bW0wLCV4bW0xCisKKwltb3ZkcWEJJXhtbTgsJXhtbTkKKwlwc3JsZHEJJDgsJXhtbTgKKwlwc2xsZHEJJDgsJXhtbTkKKwlweG9yCSV4bW04LCV4bW0xCisJcHhvcgkleG1tOSwleG1tMAorCisJbW92ZHFhCSV4bW0wLCV4bW00CisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbHEJJDUsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbHEJJDEsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbHEJJDU3LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ4LCV4bW0wCisJcHNybGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTEKKworCisJbW92ZHFhCSV4bW0wLCV4bW00CisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNAorCXBzcmxxCSQ1LCV4bW0wCisJcHhvcgkleG1tNCwleG1tMAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMAorCWFkZHEJJDB4NDAsJXJjeAorCWp6CUwkZG9uZQorCW1vdmRxdQkzMiglcnNpKSwleG1tNworCXN1YnEJJDB4MTAsJXJjeAorCWp6CUwkb2RkX3RhaWwKK0wkc2tpcDR4OgorCisKKworCisKKwltb3ZkcXUJKCVyZHgpLCV4bW04CisJbW92ZHF1CTE2KCVyZHgpLCV4bW0zCisuYnl0ZQkxMDIsNjksMTUsNTYsMCwxOTQKKy5ieXRlCTEwMiw2NSwxNSw1NiwwLDIxOAorCXB4b3IJJXhtbTgsJXhtbTAKKworCW1vdmRxYQkleG1tMywleG1tNQorCXBzaHVmZAkkNzgsJXhtbTMsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW00CisuYnl0ZQkxMDIsMTUsNTgsNjgsMjE4LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzQsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzEsMAorCisJbGVhcQkzMiglcmR4KSwlcmR4CisJbm9wCisJc3VicQkkMHgyMCwlcmN4CisJamJlCUwkZXZlbl90YWlsCisJbm9wCisJam1wCUwkbW9kX2xvb3AKKworLnAyYWxpZ24JNQorTCRtb2RfbG9vcDoKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW00CisJcHhvcgkleG1tMCwleG1tNAorCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk4LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDYsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzEsMTYKKworCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW01LCV4bW0xCisJbW92ZHF1CSglcmR4KSwleG1tOQorCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiw2OSwxNSw1NiwwLDIwMgorCW1vdmRxdQkxNiglcmR4KSwleG1tMworCisJcHhvcgkleG1tMSwleG1tOAorCXB4b3IJJXhtbTksJXhtbTEKKwlweG9yCSV4bW04LCV4bW00CisuYnl0ZQkxMDIsNjUsMTUsNTYsMCwyMTgKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc3JsZHEJJDgsJXhtbTgKKwlwc2xsZHEJJDgsJXhtbTQKKwlweG9yCSV4bW04LCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCisJbW92ZHFhCSV4bW0zLCV4bW01CisKKwltb3ZkcWEJJXhtbTAsJXhtbTkKKwltb3ZkcWEJJXhtbTAsJXhtbTgKKwlwc2xscQkkNSwleG1tMAorCXB4b3IJJXhtbTAsJXhtbTgKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMTgsMAorCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tOCwleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tOAorCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tOAorCXB4b3IJJXhtbTksJXhtbTAKKwlwc2h1ZmQJJDc4LCV4bW01LCV4bW00CisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTUsJXhtbTQKKworCW1vdmRxYQkleG1tMCwleG1tOQorCXBzcmxxCSQxLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTgsNjgsMjM0LDE3CisJcHhvcgkleG1tOSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTkKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTksJXhtbTAKKwlsZWFxCTMyKCVyZHgpLCVyZHgKKwlwc3JscQkkMSwleG1tMAorLmJ5dGUJMTAyLDE1LDU4LDY4LDIzMSwwCisJcHhvcgkleG1tMSwleG1tMAorCisJc3VicQkkMHgyMCwlcmN4CisJamEJTCRtb2RfbG9vcAorCitMJGV2ZW5fdGFpbDoKKwltb3ZkcWEJJXhtbTAsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTgKKwlwc2h1ZmQJJDc4LCV4bW0wLCV4bW00CisJcHhvcgkleG1tMCwleG1tNAorCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk4LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDYsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMzEsMTYKKworCXB4b3IJJXhtbTMsJXhtbTAKKwlweG9yCSV4bW01LCV4bW0xCisJcHhvcgkleG1tMCwleG1tOAorCXB4b3IJJXhtbTEsJXhtbTgKKwlweG9yCSV4bW04LCV4bW00CisJbW92ZHFhCSV4bW00LCV4bW04CisJcHNybGRxCSQ4LCV4bW04CisJcHNsbGRxCSQ4LCV4bW00CisJcHhvcgkleG1tOCwleG1tMQorCXB4b3IJJXhtbTQsJXhtbTAKKworCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxxCSQ1LCV4bW0wCisJcHhvcgkleG1tMCwleG1tMworCXBzbGxxCSQxLCV4bW0wCisJcHhvcgkleG1tMywleG1tMAorCXBzbGxxCSQ1NywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMworCXBzbGxkcQkkOCwleG1tMAorCXBzcmxkcQkkOCwleG1tMworCXB4b3IJJXhtbTQsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0xCisKKworCW1vdmRxYQkleG1tMCwleG1tNAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tNCwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTQKKwlwc3JscQkkNSwleG1tMAorCXB4b3IJJXhtbTQsJXhtbTAKKwlwc3JscQkkMSwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTAKKwl0ZXN0cQklcmN4LCVyY3gKKwlqbnoJTCRkb25lCisKK0wkb2RkX3RhaWw6CisJbW92ZHF1CSglcmR4KSwleG1tOAorLmJ5dGUJMTAyLDY5LDE1LDU2LDAsMTk0CisJcHhvcgkleG1tOCwleG1tMAorCW1vdmRxYQkleG1tMCwleG1tMQorCXBzaHVmZAkkNzgsJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTgsNjgsMTk0LDAKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMDIsMTcKKy5ieXRlCTEwMiwxNSw1OCw2OCwyMjMsMAorCXB4b3IJJXhtbTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTMsJXhtbTQKKwlwc3JsZHEJJDgsJXhtbTMKKwlwc2xsZHEJJDgsJXhtbTQKKwlweG9yCSV4bW0zLCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorCisJbW92ZHFhCSV4bW0wLCV4bW00CisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbHEJJDUsJXhtbTAKKwlweG9yCSV4bW0wLCV4bW0zCisJcHNsbHEJJDEsJXhtbTAKKwlweG9yCSV4bW0zLCV4bW0wCisJcHNsbHEJJDU3LCV4bW0wCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJcHNsbGRxCSQ4LCV4bW0wCisJcHNybGRxCSQ4LCV4bW0zCisJcHhvcgkleG1tNCwleG1tMAorCXB4b3IJJXhtbTMsJXhtbTEKKworCisJbW92ZHFhCSV4bW0wLCV4bW00CisJcHNybHEJJDEsJXhtbTAKKwlweG9yCSV4bW00LCV4bW0xCisJcHhvcgkleG1tMCwleG1tNAorCXBzcmxxCSQ1LCV4bW0wCisJcHhvcgkleG1tNCwleG1tMAorCXBzcmxxCSQxLCV4bW0wCisJcHhvcgkleG1tMSwleG1tMAorTCRkb25lOgorLmJ5dGUJMTAyLDY1LDE1LDU2LDAsMTk0CisJbW92ZHF1CSV4bW0wLCglcmRpKQorCS5ieXRlCTB4ZjMsMHhjMworCisuZ2xvYmwJX2djbV9pbml0X2F2eAorLnByaXZhdGVfZXh0ZXJuIF9nY21faW5pdF9hdngKKworLnAyYWxpZ24JNQorX2djbV9pbml0X2F2eDoKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CSglcnNpKSwleG1tMgorCXZwc2h1ZmQJJDc4LCV4bW0yLCV4bW0yCisKKworCXZwc2h1ZmQJJDI1NSwleG1tMiwleG1tNAorCXZwc3JscQkkNjMsJXhtbTIsJXhtbTMKKwl2cHNsbHEJJDEsJXhtbTIsJXhtbTIKKwl2cHhvcgkleG1tNSwleG1tNSwleG1tNQorCXZwY21wZ3RkCSV4bW00LCV4bW01LCV4bW01CisJdnBzbGxkcQkkOCwleG1tMywleG1tMworCXZwb3IJJXhtbTMsJXhtbTIsJXhtbTIKKworCisJdnBhbmQJTCQweDFjMl9wb2x5bm9taWFsKCVyaXApLCV4bW01LCV4bW01CisJdnB4b3IJJXhtbTUsJXhtbTIsJXhtbTIKKworCXZwdW5wY2tocWRxCSV4bW0yLCV4bW0yLCV4bW02CisJdm1vdmRxYQkleG1tMiwleG1tMAorCXZweG9yCSV4bW0yLCV4bW02LCV4bW02CisJbW92cQkkNCwlcjEwCisJam1wCUwkaW5pdF9zdGFydF9hdngKKy5wMmFsaWduCTUKK0wkaW5pdF9sb29wX2F2eDoKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tNQorCXZtb3ZkcXUJJXhtbTUsLTE2KCVyZGkpCisJdnB1bnBja2hxZHEJJXhtbTAsJXhtbTAsJXhtbTMKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTIsJXhtbTAsJXhtbTEKKwl2cGNsbXVscWRxCSQweDAwLCV4bW0yLCV4bW0wLCV4bW0wCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMywleG1tMworCXZweG9yCSV4bW0wLCV4bW0xLCV4bW00CisJdnB4b3IJJXhtbTQsJXhtbTMsJXhtbTMKKworCXZwc2xsZHEJJDgsJXhtbTMsJXhtbTQKKwl2cHNybGRxCSQ4LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTQsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tMywleG1tMSwleG1tMQorCXZwc2xscQkkNTcsJXhtbTAsJXhtbTMKKwl2cHNsbHEJJDYyLCV4bW0wLCV4bW00CisJdnB4b3IJJXhtbTMsJXhtbTQsJXhtbTQKKwl2cHNsbHEJJDYzLCV4bW0wLCV4bW0zCisJdnB4b3IJJXhtbTMsJXhtbTQsJXhtbTQKKwl2cHNsbGRxCSQ4LCV4bW00LCV4bW0zCisJdnBzcmxkcQkkOCwleG1tNCwleG1tNAorCXZweG9yCSV4bW0zLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTQsJXhtbTEsJXhtbTEKKworCXZwc3JscQkkMSwleG1tMCwleG1tNAorCXZweG9yCSV4bW0wLCV4bW0xLCV4bW0xCisJdnB4b3IJJXhtbTQsJXhtbTAsJXhtbTAKKwl2cHNybHEJJDUsJXhtbTQsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXZwc3JscQkkMSwleG1tMCwleG1tMAorCXZweG9yCSV4bW0xLCV4bW0wLCV4bW0wCitMJGluaXRfc3RhcnRfYXZ4OgorCXZtb3ZkcWEJJXhtbTAsJXhtbTUKKwl2cHVucGNraHFkcQkleG1tMCwleG1tMCwleG1tMworCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwleG1tMiwleG1tMCwleG1tMQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTIsJXhtbTAsJXhtbTAKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0zLCV4bW0zCisJdnB4b3IJJXhtbTAsJXhtbTEsJXhtbTQKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCisJdnBzbGxkcQkkOCwleG1tMywleG1tNAorCXZwc3JsZHEJJDgsJXhtbTMsJXhtbTMKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXZweG9yCSV4bW0zLCV4bW0xLCV4bW0xCisJdnBzbGxxCSQ1NywleG1tMCwleG1tMworCXZwc2xscQkkNjIsJXhtbTAsJXhtbTQKKwl2cHhvcgkleG1tMywleG1tNCwleG1tNAorCXZwc2xscQkkNjMsJXhtbTAsJXhtbTMKKwl2cHhvcgkleG1tMywleG1tNCwleG1tNAorCXZwc2xsZHEJJDgsJXhtbTQsJXhtbTMKKwl2cHNybGRxCSQ4LCV4bW00LCV4bW00CisJdnB4b3IJJXhtbTMsJXhtbTAsJXhtbTAKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCisJdnBzcmxxCSQxLCV4bW0wLCV4bW00CisJdnB4b3IJJXhtbTAsJXhtbTEsJXhtbTEKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXZwc3JscQkkNSwleG1tNCwleG1tNAorCXZweG9yCSV4bW00LCV4bW0wLCV4bW0wCisJdnBzcmxxCSQxLCV4bW0wLCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKwl2cHNodWZkCSQ3OCwleG1tNSwleG1tMworCXZwc2h1ZmQJJDc4LCV4bW0wLCV4bW00CisJdnB4b3IJJXhtbTUsJXhtbTMsJXhtbTMKKwl2bW92ZHF1CSV4bW01LDAoJXJkaSkKKwl2cHhvcgkleG1tMCwleG1tNCwleG1tNAorCXZtb3ZkcXUJJXhtbTAsMTYoJXJkaSkKKwlsZWFxCTQ4KCVyZGkpLCVyZGkKKwlzdWJxCSQxLCVyMTAKKwlqbnoJTCRpbml0X2xvb3BfYXZ4CisKKwl2cGFsaWducgkkOCwleG1tNCwleG1tMywleG1tNQorCXZtb3ZkcXUJJXhtbTUsLTE2KCVyZGkpCisKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCisKKy5nbG9ibAlfZ2NtX2dtdWx0X2F2eAorLnByaXZhdGVfZXh0ZXJuIF9nY21fZ211bHRfYXZ4CisKKy5wMmFsaWduCTUKK19nY21fZ211bHRfYXZ4OgorCWptcAlMJF9nbXVsdF9jbG11bAorCisuZ2xvYmwJX2djbV9naGFzaF9hdngKKy5wcml2YXRlX2V4dGVybiBfZ2NtX2doYXNoX2F2eAorCisucDJhbGlnbgk1CitfZ2NtX2doYXNoX2F2eDoKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CSglcmRpKSwleG1tMTAKKwlsZWFxCUwkMHgxYzJfcG9seW5vbWlhbCglcmlwKSwlcjEwCisJbGVhcQk2NCglcnNpKSwlcnNpCisJdm1vdmRxdQlMJGJzd2FwX21hc2soJXJpcCksJXhtbTEzCisJdnBzaHVmYgkleG1tMTMsJXhtbTEwLCV4bW0xMAorCWNtcHEJJDB4ODAsJXJjeAorCWpiCUwkc2hvcnRfYXZ4CisJc3VicQkkMHg4MCwlcmN4CisKKwl2bW92ZHF1CTExMiglcmR4KSwleG1tMTQKKwl2bW92ZHF1CTAtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE0CisJdm1vdmRxdQkzMi02NCglcnNpKSwleG1tNworCisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZtb3ZkcXUJOTYoJXJkeCksJXhtbTE1CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTQsJXhtbTAKKwl2cHhvcgkleG1tMTQsJXhtbTksJXhtbTkKKwl2cHNodWZiCSV4bW0xMywleG1tMTUsJXhtbTE1CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2bW92ZHF1CTE2LTY0KCVyc2kpLCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZtb3ZkcXUJODAoJXJkeCksJXhtbTE0CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOSwleG1tMgorCXZweG9yCSV4bW0xNSwleG1tOCwleG1tOAorCisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNAorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0zCisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW00CisJdm1vdmRxdQk0OC02NCglcnNpKSwleG1tNgorCXZweG9yCSV4bW0xNCwleG1tOSwleG1tOQorCXZtb3ZkcXUJNjQoJXJkeCksJXhtbTE1CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOCwleG1tNQorCXZtb3ZkcXUJODAtNjQoJXJzaSksJXhtbTcKKworCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNSwleG1tMTUKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE0LCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cHVucGNraHFkcQkleG1tMTUsJXhtbTE1LCV4bW04CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2bW92ZHF1CTY0LTY0KCVyc2kpLCV4bW02CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW05LCV4bW0yCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTQ4KCVyZHgpLCV4bW0xNAorCXZweG9yCSV4bW0zLCV4bW0wLCV4bW0wCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTMKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tNAorCXZtb3ZkcXUJOTYtNjQoJXJzaSksJXhtbTYKKwl2cHhvcgkleG1tNSwleG1tMiwleG1tMgorCXZwdW5wY2tocWRxCSV4bW0xNCwleG1tMTQsJXhtbTkKKwl2cGNsbXVscWRxCSQweDEwLCV4bW03LCV4bW04LCV4bW01CisJdm1vdmRxdQkxMjgtNjQoJXJzaSksJXhtbTcKKwl2cHhvcgkleG1tMTQsJXhtbTksJXhtbTkKKworCXZtb3ZkcXUJMzIoJXJkeCksJXhtbTE1CisJdnB4b3IJJXhtbTAsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNCwleG1tMAorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnBzaHVmYgkleG1tMTMsJXhtbTE1LCV4bW0xNQorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE0LCV4bW0xCisJdm1vdmRxdQkxMTItNjQoJXJzaSksJXhtbTYKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW05LCV4bW0yCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTE2KCVyZHgpLCV4bW0xNAorCXZweG9yCSV4bW0zLCV4bW0wLCV4bW0wCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTMKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tNAorCXZtb3ZkcXUJMTQ0LTY0KCVyc2kpLCV4bW02CisJdnB4b3IJJXhtbTUsJXhtbTIsJXhtbTIKKwl2cHVucGNraHFkcQkleG1tMTQsJXhtbTE0LCV4bW05CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOCwleG1tNQorCXZtb3ZkcXUJMTc2LTY0KCVyc2kpLCV4bW03CisJdnB4b3IJJXhtbTE0LCV4bW05LCV4bW05CisKKwl2bW92ZHF1CSglcmR4KSwleG1tMTUKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE0LCV4bW0wCisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cHNodWZiCSV4bW0xMywleG1tMTUsJXhtbTE1CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2bW92ZHF1CTE2MC02NCglcnNpKSwleG1tNgorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOSwleG1tMgorCisJbGVhcQkxMjgoJXJkeCksJXJkeAorCWNtcHEJJDB4ODAsJXJjeAorCWpiCUwkdGFpbF9hdngKKworCXZweG9yCSV4bW0xMCwleG1tMTUsJXhtbTE1CisJc3VicQkkMHg4MCwlcmN4CisJam1wCUwkb29wOHhfYXZ4CisKKy5wMmFsaWduCTUKK0wkb29wOHhfYXZ4OgorCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2bW92ZHF1CTExMiglcmR4KSwleG1tMTQKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZweG9yCSV4bW0xNSwleG1tOCwleG1tOAorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0xMAorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTQKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xMQorCXZtb3ZkcXUJMC02NCglcnNpKSwleG1tNgorCXZwdW5wY2tocWRxCSV4bW0xNCwleG1tMTQsJXhtbTkKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTcsJXhtbTgsJXhtbTEyCisJdm1vdmRxdQkzMi02NCglcnNpKSwleG1tNworCXZweG9yCSV4bW0xNCwleG1tOSwleG1tOQorCisJdm1vdmRxdQk5NiglcmR4KSwleG1tMTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNCwleG1tMAorCXZweG9yCSV4bW0zLCV4bW0xMCwleG1tMTAKKwl2cHNodWZiCSV4bW0xMywleG1tMTUsJXhtbTE1CisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTQsJXhtbTEKKwl2eG9ycHMJJXhtbTQsJXhtbTExLCV4bW0xMQorCXZtb3ZkcXUJMTYtNjQoJXJzaSksJXhtbTYKKwl2cHVucGNraHFkcQkleG1tMTUsJXhtbTE1LCV4bW04CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOSwleG1tMgorCXZweG9yCSV4bW01LCV4bW0xMiwleG1tMTIKKwl2eG9ycHMJJXhtbTE1LCV4bW04LCV4bW04CisKKwl2bW92ZHF1CTgwKCVyZHgpLCV4bW0xNAorCXZweG9yCSV4bW0xMCwleG1tMTIsJXhtbTEyCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTMKKwl2cHhvcgkleG1tMTEsJXhtbTEyLCV4bW0xMgorCXZwc2xsZHEJJDgsJXhtbTEyLCV4bW05CisJdnB4b3IJJXhtbTAsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tNAorCXZwc3JsZHEJJDgsJXhtbTEyLCV4bW0xMgorCXZweG9yCSV4bW05LCV4bW0xMCwleG1tMTAKKwl2bW92ZHF1CTQ4LTY0KCVyc2kpLCV4bW02CisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNAorCXZ4b3JwcwkleG1tMTIsJXhtbTExLCV4bW0xMQorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTcsJXhtbTgsJXhtbTUKKwl2bW92ZHF1CTgwLTY0KCVyc2kpLCV4bW03CisJdnB4b3IJJXhtbTE0LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKworCXZtb3ZkcXUJNjQoJXJkeCksJXhtbTE1CisJdnBhbGlnbnIJJDgsJXhtbTEwLCV4bW0xMCwleG1tMTIKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNCwleG1tMAorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNSwleG1tMTUKKwl2cHhvcgkleG1tMywleG1tMCwleG1tMAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE0LCV4bW0xCisJdm1vdmRxdQk2NC02NCglcnNpKSwleG1tNgorCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cHhvcgkleG1tNCwleG1tMSwleG1tMQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTcsJXhtbTksJXhtbTIKKwl2eG9ycHMJJXhtbTE1LCV4bW04LCV4bW04CisJdnB4b3IJJXhtbTUsJXhtbTIsJXhtbTIKKworCXZtb3ZkcXUJNDgoJXJkeCksJXhtbTE0CisJdnBjbG11bHFkcQkkMHgxMCwoJXIxMCksJXhtbTEwLCV4bW0xMAorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0zCisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgxMSwleG1tNiwleG1tMTUsJXhtbTQKKwl2bW92ZHF1CTk2LTY0KCVyc2kpLCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTE0LCV4bW0xNCwleG1tOQorCXZweG9yCSV4bW0xLCV4bW00LCV4bW00CisJdnBjbG11bHFkcQkkMHgxMCwleG1tNywleG1tOCwleG1tNQorCXZtb3ZkcXUJMTI4LTY0KCVyc2kpLCV4bW03CisJdnB4b3IJJXhtbTE0LCV4bW05LCV4bW05CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKworCXZtb3ZkcXUJMzIoJXJkeCksJXhtbTE1CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTQsJXhtbTAKKwl2cHNodWZiCSV4bW0xMywleG1tMTUsJXhtbTE1CisJdnB4b3IJJXhtbTMsJXhtbTAsJXhtbTAKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNCwleG1tMQorCXZtb3ZkcXUJMTEyLTY0KCVyc2kpLCV4bW02CisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW00LCV4bW0xLCV4bW0xCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOSwleG1tMgorCXZweG9yCSV4bW0xNSwleG1tOCwleG1tOAorCXZweG9yCSV4bW01LCV4bW0yLCV4bW0yCisJdnhvcnBzCSV4bW0xMiwleG1tMTAsJXhtbTEwCisKKwl2bW92ZHF1CTE2KCVyZHgpLCV4bW0xNAorCXZwYWxpZ25yCSQ4LCV4bW0xMCwleG1tMTAsJXhtbTEyCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTMKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE0CisJdnB4b3IJJXhtbTAsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tNAorCXZtb3ZkcXUJMTQ0LTY0KCVyc2kpLCV4bW02CisJdnBjbG11bHFkcQkkMHgxMCwoJXIxMCksJXhtbTEwLCV4bW0xMAorCXZ4b3JwcwkleG1tMTEsJXhtbTEyLCV4bW0xMgorCXZwdW5wY2tocWRxCSV4bW0xNCwleG1tMTQsJXhtbTkKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTcsJXhtbTgsJXhtbTUKKwl2bW92ZHF1CTE3Ni02NCglcnNpKSwleG1tNworCXZweG9yCSV4bW0xNCwleG1tOSwleG1tOQorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisKKwl2bW92ZHF1CSglcmR4KSwleG1tMTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNCwleG1tMAorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNSwleG1tMTUKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNCwleG1tMQorCXZtb3ZkcXUJMTYwLTY0KCVyc2kpLCV4bW02CisJdnB4b3IJJXhtbTEyLCV4bW0xNSwleG1tMTUKKwl2cGNsbXVscWRxCSQweDEwLCV4bW03LCV4bW05LCV4bW0yCisJdnB4b3IJJXhtbTEwLCV4bW0xNSwleG1tMTUKKworCWxlYXEJMTI4KCVyZHgpLCVyZHgKKwlzdWJxCSQweDgwLCVyY3gKKwlqbmMJTCRvb3A4eF9hdngKKworCWFkZHEJJDB4ODAsJXJjeAorCWptcAlMJHRhaWxfbm9feG9yX2F2eAorCisucDJhbGlnbgk1CitMJHNob3J0X2F2eDoKKwl2bW92ZHF1CS0xNiglcmR4LCVyY3gsMSksJXhtbTE0CisJbGVhcQkoJXJkeCwlcmN4LDEpLCVyZHgKKwl2bW92ZHF1CTAtNjQoJXJzaSksJXhtbTYKKwl2bW92ZHF1CTMyLTY0KCVyc2kpLCV4bW03CisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNQorCisJdm1vdmRxYQkleG1tMCwleG1tMworCXZtb3ZkcWEJJXhtbTEsJXhtbTQKKwl2bW92ZHFhCSV4bW0yLCV4bW01CisJc3VicQkkMHgxMCwlcmN4CisJanoJTCR0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CS0zMiglcmR4KSwleG1tMTQKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xCisJdm1vdmRxdQkxNi02NCglcnNpKSwleG1tNgorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTUKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTcsJXhtbTgsJXhtbTIKKwl2cHNybGRxCSQ4LCV4bW03LCV4bW03CisJc3VicQkkMHgxMCwlcmN4CisJanoJTCR0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CS00OCglcmR4KSwleG1tMTQKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xCisJdm1vdmRxdQk0OC02NCglcnNpKSwleG1tNgorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTUKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTcsJXhtbTgsJXhtbTIKKwl2bW92ZHF1CTgwLTY0KCVyc2kpLCV4bW03CisJc3VicQkkMHgxMCwlcmN4CisJanoJTCR0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CS02NCglcmR4KSwleG1tMTQKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xCisJdm1vdmRxdQk2NC02NCglcnNpKSwleG1tNgorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTUKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTcsJXhtbTgsJXhtbTIKKwl2cHNybGRxCSQ4LCV4bW03LCV4bW03CisJc3VicQkkMHgxMCwlcmN4CisJanoJTCR0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTgsJXhtbTgKKwl2bW92ZHF1CS04MCglcmR4KSwleG1tMTQKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xCisJdm1vdmRxdQk5Ni02NCglcnNpKSwleG1tNgorCXZwc2h1ZmIJJXhtbTEzLCV4bW0xNCwleG1tMTUKKwl2cHhvcgkleG1tMiwleG1tNSwleG1tNQorCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTcsJXhtbTgsJXhtbTIKKwl2bW92ZHF1CTEyOC02NCglcnNpKSwleG1tNworCXN1YnEJJDB4MTAsJXJjeAorCWp6CUwkdGFpbF9hdngKKworCXZwdW5wY2tocWRxCSV4bW0xNSwleG1tMTUsJXhtbTgKKwl2cHhvcgkleG1tMCwleG1tMywleG1tMworCXZwY2xtdWxxZHEJJDB4MDAsJXhtbTYsJXhtbTE1LCV4bW0wCisJdnB4b3IJJXhtbTE1LCV4bW04LCV4bW04CisJdm1vdmRxdQktOTYoJXJkeCksJXhtbTE0CisJdnB4b3IJJXhtbTEsJXhtbTQsJXhtbTQKKwl2cGNsbXVscWRxCSQweDExLCV4bW02LCV4bW0xNSwleG1tMQorCXZtb3ZkcXUJMTEyLTY0KCVyc2kpLCV4bW02CisJdnBzaHVmYgkleG1tMTMsJXhtbTE0LCV4bW0xNQorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisJdnBjbG11bHFkcQkkMHgwMCwleG1tNywleG1tOCwleG1tMgorCXZwc3JsZHEJJDgsJXhtbTcsJXhtbTcKKwlzdWJxCSQweDEwLCVyY3gKKwlqeglMJHRhaWxfYXZ4CisKKwl2cHVucGNraHFkcQkleG1tMTUsJXhtbTE1LCV4bW04CisJdnB4b3IJJXhtbTAsJXhtbTMsJXhtbTMKKwl2cGNsbXVscWRxCSQweDAwLCV4bW02LCV4bW0xNSwleG1tMAorCXZweG9yCSV4bW0xNSwleG1tOCwleG1tOAorCXZtb3ZkcXUJLTExMiglcmR4KSwleG1tMTQKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xCisJdm1vdmRxdQkxNDQtNjQoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMywleG1tMTQsJXhtbTE1CisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW04LCV4bW0yCisJdm1vdnEJMTg0LTY0KCVyc2kpLCV4bW03CisJc3VicQkkMHgxMCwlcmN4CisJam1wCUwkdGFpbF9hdngKKworLnAyYWxpZ24JNQorTCR0YWlsX2F2eDoKKwl2cHhvcgkleG1tMTAsJXhtbTE1LCV4bW0xNQorTCR0YWlsX25vX3hvcl9hdng6CisJdnB1bnBja2hxZHEJJXhtbTE1LCV4bW0xNSwleG1tOAorCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0zCisJdnBjbG11bHFkcQkkMHgwMCwleG1tNiwleG1tMTUsJXhtbTAKKwl2cHhvcgkleG1tMTUsJXhtbTgsJXhtbTgKKwl2cHhvcgkleG1tMSwleG1tNCwleG1tNAorCXZwY2xtdWxxZHEJJDB4MTEsJXhtbTYsJXhtbTE1LCV4bW0xCisJdnB4b3IJJXhtbTIsJXhtbTUsJXhtbTUKKwl2cGNsbXVscWRxCSQweDAwLCV4bW03LCV4bW04LCV4bW0yCisKKwl2bW92ZHF1CSglcjEwKSwleG1tMTIKKworCXZweG9yCSV4bW0wLCV4bW0zLCV4bW0xMAorCXZweG9yCSV4bW0xLCV4bW00LCV4bW0xMQorCXZweG9yCSV4bW0yLCV4bW01LCV4bW01CisKKwl2cHhvcgkleG1tMTAsJXhtbTUsJXhtbTUKKwl2cHhvcgkleG1tMTEsJXhtbTUsJXhtbTUKKwl2cHNsbGRxCSQ4LCV4bW01LCV4bW05CisJdnBzcmxkcQkkOCwleG1tNSwleG1tNQorCXZweG9yCSV4bW05LCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tNSwleG1tMTEsJXhtbTExCisKKwl2cGNsbXVscWRxCSQweDEwLCV4bW0xMiwleG1tMTAsJXhtbTkKKwl2cGFsaWducgkkOCwleG1tMTAsJXhtbTEwLCV4bW0xMAorCXZweG9yCSV4bW05LCV4bW0xMCwleG1tMTAKKworCXZwY2xtdWxxZHEJJDB4MTAsJXhtbTEyLCV4bW0xMCwleG1tOQorCXZwYWxpZ25yCSQ4LCV4bW0xMCwleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTExLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tOSwleG1tMTAsJXhtbTEwCisKKwljbXBxCSQwLCVyY3gKKwlqbmUJTCRzaG9ydF9hdngKKworCXZwc2h1ZmIJJXhtbTEzLCV4bW0xMCwleG1tMTAKKwl2bW92ZHF1CSV4bW0xMCwoJXJkaSkKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCisKKy5wMmFsaWduCTYKK0wkYnN3YXBfbWFzazoKKy5ieXRlCTE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDAKK0wkMHgxYzJfcG9seW5vbWlhbDoKKy5ieXRlCTEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB4YzIKK0wkN19tYXNrOgorLmxvbmcJNywwLDcsMAorTCQ3X21hc2tfcG9seToKKy5sb25nCTcsMCw0NTAsMAorLnAyYWxpZ24JNgorCitMJHJlbV80Yml0OgorLmxvbmcJMCwwLDAsNDcxODU5MjAwLDAsOTQzNzE4NDAwLDAsNjEwMjcxMjMyCisubG9uZwkwLDE4ODc0MzY4MDAsMCwxODIyNDI1MDg4LDAsMTIyMDU0MjQ2NCwwLDE0MjM5NjYyMDgKKy5sb25nCTAsMzc3NDg3MzYwMCwwLDQyNDY3MzI4MDAsMCwzNjQ0ODUwMTc2LDAsMzMxMTQwMzAwOAorLmxvbmcJMCwyNDQxMDg0OTI4LDAsMjM3NjA3MzIxNiwwLDI4NDc5MzI0MTYsMCwzMDUxMzU2MTYwCisKK0wkcmVtXzhiaXQ6CisudmFsdWUJMHgwMDAwLDB4MDFDMiwweDAzODQsMHgwMjQ2LDB4MDcwOCwweDA2Q0EsMHgwNDhDLDB4MDU0RQorLnZhbHVlCTB4MEUxMCwweDBGRDIsMHgwRDk0LDB4MEM1NiwweDA5MTgsMHgwOERBLDB4MEE5QywweDBCNUUKKy52YWx1ZQkweDFDMjAsMHgxREUyLDB4MUZBNCwweDFFNjYsMHgxQjI4LDB4MUFFQSwweDE4QUMsMHgxOTZFCisudmFsdWUJMHgxMjMwLDB4MTNGMiwweDExQjQsMHgxMDc2LDB4MTUzOCwweDE0RkEsMHgxNkJDLDB4MTc3RQorLnZhbHVlCTB4Mzg0MCwweDM5ODIsMHgzQkM0LDB4M0EwNiwweDNGNDgsMHgzRThBLDB4M0NDQywweDNEMEUKKy52YWx1ZQkweDM2NTAsMHgzNzkyLDB4MzVENCwweDM0MTYsMHgzMTU4LDB4MzA5QSwweDMyREMsMHgzMzFFCisudmFsdWUJMHgyNDYwLDB4MjVBMiwweDI3RTQsMHgyNjI2LDB4MjM2OCwweDIyQUEsMHgyMEVDLDB4MjEyRQorLnZhbHVlCTB4MkE3MCwweDJCQjIsMHgyOUY0LDB4MjgzNiwweDJENzgsMHgyQ0JBLDB4MkVGQywweDJGM0UKKy52YWx1ZQkweDcwODAsMHg3MTQyLDB4NzMwNCwweDcyQzYsMHg3Nzg4LDB4NzY0QSwweDc0MEMsMHg3NUNFCisudmFsdWUJMHg3RTkwLDB4N0Y1MiwweDdEMTQsMHg3Q0Q2LDB4Nzk5OCwweDc4NUEsMHg3QTFDLDB4N0JERQorLnZhbHVlCTB4NkNBMCwweDZENjIsMHg2RjI0LDB4NkVFNiwweDZCQTgsMHg2QTZBLDB4NjgyQywweDY5RUUKKy52YWx1ZQkweDYyQjAsMHg2MzcyLDB4NjEzNCwweDYwRjYsMHg2NUI4LDB4NjQ3QSwweDY2M0MsMHg2N0ZFCisudmFsdWUJMHg0OEMwLDB4NDkwMiwweDRCNDQsMHg0QTg2LDB4NEZDOCwweDRFMEEsMHg0QzRDLDB4NEQ4RQorLnZhbHVlCTB4NDZEMCwweDQ3MTIsMHg0NTU0LDB4NDQ5NiwweDQxRDgsMHg0MDFBLDB4NDI1QywweDQzOUUKKy52YWx1ZQkweDU0RTAsMHg1NTIyLDB4NTc2NCwweDU2QTYsMHg1M0U4LDB4NTIyQSwweDUwNkMsMHg1MUFFCisudmFsdWUJMHg1QUYwLDB4NUIzMiwweDU5NzQsMHg1OEI2LDB4NURGOCwweDVDM0EsMHg1RTdDLDB4NUZCRQorLnZhbHVlCTB4RTEwMCwweEUwQzIsMHhFMjg0LDB4RTM0NiwweEU2MDgsMHhFN0NBLDB4RTU4QywweEU0NEUKKy52YWx1ZQkweEVGMTAsMHhFRUQyLDB4RUM5NCwweEVENTYsMHhFODE4LDB4RTlEQSwweEVCOUMsMHhFQTVFCisudmFsdWUJMHhGRDIwLDB4RkNFMiwweEZFQTQsMHhGRjY2LDB4RkEyOCwweEZCRUEsMHhGOUFDLDB4Rjg2RQorLnZhbHVlCTB4RjMzMCwweEYyRjIsMHhGMEI0LDB4RjE3NiwweEY0MzgsMHhGNUZBLDB4RjdCQywweEY2N0UKKy52YWx1ZQkweEQ5NDAsMHhEODgyLDB4REFDNCwweERCMDYsMHhERTQ4LDB4REY4QSwweEREQ0MsMHhEQzBFCisudmFsdWUJMHhENzUwLDB4RDY5MiwweEQ0RDQsMHhENTE2LDB4RDA1OCwweEQxOUEsMHhEM0RDLDB4RDIxRQorLnZhbHVlCTB4QzU2MCwweEM0QTIsMHhDNkU0LDB4QzcyNiwweEMyNjgsMHhDM0FBLDB4QzFFQywweEMwMkUKKy52YWx1ZQkweENCNzAsMHhDQUIyLDB4QzhGNCwweEM5MzYsMHhDQzc4LDB4Q0RCQSwweENGRkMsMHhDRTNFCisudmFsdWUJMHg5MTgwLDB4OTA0MiwweDkyMDQsMHg5M0M2LDB4OTY4OCwweDk3NEEsMHg5NTBDLDB4OTRDRQorLnZhbHVlCTB4OUY5MCwweDlFNTIsMHg5QzE0LDB4OURENiwweDk4OTgsMHg5OTVBLDB4OUIxQywweDlBREUKKy52YWx1ZQkweDhEQTAsMHg4QzYyLDB4OEUyNCwweDhGRTYsMHg4QUE4LDB4OEI2QSwweDg5MkMsMHg4OEVFCisudmFsdWUJMHg4M0IwLDB4ODI3MiwweDgwMzQsMHg4MUY2LDB4ODRCOCwweDg1N0EsMHg4NzNDLDB4ODZGRQorLnZhbHVlCTB4QTlDMCwweEE4MDIsMHhBQTQ0LDB4QUI4NiwweEFFQzgsMHhBRjBBLDB4QUQ0QywweEFDOEUKKy52YWx1ZQkweEE3RDAsMHhBNjEyLDB4QTQ1NCwweEE1OTYsMHhBMEQ4LDB4QTExQSwweEEzNUMsMHhBMjlFCisudmFsdWUJMHhCNUUwLDB4QjQyMiwweEI2NjQsMHhCN0E2LDB4QjJFOCwweEIzMkEsMHhCMTZDLDB4QjBBRQorLnZhbHVlCTB4QkJGMCwweEJBMzIsMHhCODc0LDB4QjlCNiwweEJDRjgsMHhCRDNBLDB4QkY3QywweEJFQkUKKworLmJ5dGUJNzEsNzIsNjUsODMsNzIsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKy5wMmFsaWduCTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL21kNS14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9tZDUteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2YzExNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9tZDUteDg2XzY0LlMKQEAgLTAsMCArMSw2NzEgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisucDJhbGlnbgk0CisKKy5nbG9ibAlfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisucHJpdmF0ZV9leHRlcm4gX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcgorCitfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyOgorCXB1c2hxCSVyYnAKKwlwdXNocQklcmJ4CisJcHVzaHEJJXIxMgorCXB1c2hxCSVyMTQKKwlwdXNocQklcjE1CitMJHByb2xvZ3VlOgorCisKKworCisJbW92cQklcmRpLCVyYnAKKwlzaGxxCSQ2LCVyZHgKKwlsZWFxCSglcnNpLCVyZHgsMSksJXJkaQorCW1vdmwJMCglcmJwKSwlZWF4CisJbW92bAk0KCVyYnApLCVlYngKKwltb3ZsCTgoJXJicCksJWVjeAorCW1vdmwJMTIoJXJicCksJWVkeAorCisKKworCisKKworCisJY21wcQklcmRpLCVyc2kKKwlqZQlMJGVuZAorCisKK0wkbG9vcDoKKwltb3ZsCSVlYXgsJXI4ZAorCW1vdmwJJWVieCwlcjlkCisJbW92bAklZWN4LCVyMTRkCisJbW92bAklZWR4LCVyMTVkCisJbW92bAkwKCVyc2kpLCVyMTBkCisJbW92bAklZWR4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJbGVhbAktNjgwODc2OTM2KCVyYXgsJXIxMCwxKSwlZWF4CisJYW5kbAklZWJ4LCVyMTFkCisJeG9ybAklZWR4LCVyMTFkCisJbW92bAk0KCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWF4CisJcm9sbAkkNywlZWF4CisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYngsJXIxMWQKKwlsZWFsCS0zODk1NjQ1ODYoJXJkeCwlcjEwLDEpLCVlZHgKKwlhbmRsCSVlYXgsJXIxMWQKKwl4b3JsCSVlY3gsJXIxMWQKKwltb3ZsCTgoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMiwlZWR4CisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJXIxMWQKKwlsZWFsCTYwNjEwNTgxOSglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCW1vdmwJMTIoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlY3gKKwlyb2xsCSQxNywlZWN4CisJbW92bAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwl4b3JsCSVlZHgsJXIxMWQKKwlsZWFsCS0xMDQ0NTI1MzMwKCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJbW92bAkxNiglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIyLCVlYngKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCXhvcmwJJWVjeCwlcjExZAorCWxlYWwJLTE3NjQxODg5NyglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCW1vdmwJMjAoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ3LCVlYXgKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVieCwlcjExZAorCWxlYWwJMTIwMDA4MDQyNiglcmR4LCVyMTAsMSksJWVkeAorCWFuZGwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCW1vdmwJMjQoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMiwlZWR4CisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJXIxMWQKKwlsZWFsCS0xNDczMjMxMzQxKCVyY3gsJXIxMCwxKSwlZWN4CisJYW5kbAklZWR4LCVyMTFkCisJeG9ybAklZWJ4LCVyMTFkCisJbW92bAkyOCglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE3LCVlY3gKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCXhvcmwJJWVkeCwlcjExZAorCWxlYWwJLTQ1NzA1OTgzKCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJbW92bAkzMiglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIyLCVlYngKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCXhvcmwJJWVjeCwlcjExZAorCWxlYWwJMTc3MDAzNTQxNiglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCW1vdmwJMzYoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ3LCVlYXgKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCXhvcmwJJWVieCwlcjExZAorCWxlYWwJLTE5NTg0MTQ0MTcoJXJkeCwlcjEwLDEpLCVlZHgKKwlhbmRsCSVlYXgsJXIxMWQKKwl4b3JsCSVlY3gsJXIxMWQKKwltb3ZsCTQwKCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWR4CisJcm9sbAkkMTIsJWVkeAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJWVheCwlZWR4CisJeG9ybAklZWF4LCVyMTFkCisJbGVhbAktNDIwNjMoJXJjeCwlcjEwLDEpLCVlY3gKKwlhbmRsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwltb3ZsCTQ0KCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWN4CisJcm9sbAkkMTcsJWVjeAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJWVkeCwlZWN4CisJeG9ybAklZWR4LCVyMTFkCisJbGVhbAktMTk5MDQwNDE2MiglcmJ4LCVyMTAsMSksJWVieAorCWFuZGwJJWVjeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCW1vdmwJNDgoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlYngKKwlyb2xsCSQyMiwlZWJ4CisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKwl4b3JsCSVlY3gsJXIxMWQKKwlsZWFsCTE4MDQ2MDM2ODIoJXJheCwlcjEwLDEpLCVlYXgKKwlhbmRsCSVlYngsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwltb3ZsCTUyKCVyc2kpLCVyMTBkCisJYWRkbAklcjExZCwlZWF4CisJcm9sbAkkNywlZWF4CisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwl4b3JsCSVlYngsJXIxMWQKKwlsZWFsCS00MDM0MTEwMSglcmR4LCVyMTAsMSksJWVkeAorCWFuZGwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCW1vdmwJNTYoJXJzaSksJXIxMGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMiwlZWR4CisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJXIxMWQKKwlsZWFsCS0xNTAyMDAyMjkwKCVyY3gsJXIxMCwxKSwlZWN4CisJYW5kbAklZWR4LCVyMTFkCisJeG9ybAklZWJ4LCVyMTFkCisJbW92bAk2MCglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE3LCVlY3gKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCXhvcmwJJWVkeCwlcjExZAorCWxlYWwJMTIzNjUzNTMyOSglcmJ4LCVyMTAsMSksJWVieAorCWFuZGwJJWVjeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCW1vdmwJMCglcnNpKSwlcjEwZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIyLCVlYngKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJNCglcnNpKSwlcjEwZAorCW1vdmwJJWVkeCwlcjExZAorCW1vdmwJJWVkeCwlcjEyZAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xNjU3OTY1MTAoJXJheCwlcjEwLDEpLCVlYXgKKwlhbmRsCSVlYngsJXIxMmQKKwlhbmRsCSVlY3gsJXIxMWQKKwltb3ZsCTI0KCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklcjEyZCwlZWF4CisJbW92bAklZWN4LCVyMTJkCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJ4LCVlYXgKKwlub3RsCSVyMTFkCisJbGVhbAktMTA2OTUwMTYzMiglcmR4LCVyMTAsMSksJWVkeAorCWFuZGwJJWVheCwlcjEyZAorCWFuZGwJJWVieCwlcjExZAorCW1vdmwJNDQoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKwltb3ZsCSVlYngsJXIxMmQKKwlyb2xsCSQ5LCVlZHgKKwlhZGRsCSVlYXgsJWVkeAorCW5vdGwJJXIxMWQKKwlsZWFsCTY0MzcxNzcxMyglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjEyZAorCWFuZGwJJWVheCwlcjExZAorCW1vdmwJMCglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJXIxMmQsJWVjeAorCW1vdmwJJWVheCwlcjEyZAorCXJvbGwJJDE0LCVlY3gKKwlhZGRsCSVlZHgsJWVjeAorCW5vdGwJJXIxMWQKKwlsZWFsCS0zNzM4OTczMDIoJXJieCwlcjEwLDEpLCVlYngKKwlhbmRsCSVlY3gsJXIxMmQKKwlhbmRsCSVlZHgsJXIxMWQKKwltb3ZsCTIwKCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklcjEyZCwlZWJ4CisJbW92bAklZWR4LCVyMTJkCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisJbm90bAklcjExZAorCWxlYWwJLTcwMTU1ODY5MSglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjEyZAorCWFuZGwJJWVjeCwlcjExZAorCW1vdmwJNDAoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVyMTJkLCVlYXgKKwltb3ZsCSVlY3gsJXIxMmQKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCW5vdGwJJXIxMWQKKwlsZWFsCTM4MDE2MDgzKCVyZHgsJXIxMCwxKSwlZWR4CisJYW5kbAklZWF4LCVyMTJkCisJYW5kbAklZWJ4LCVyMTFkCisJbW92bAk2MCglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCW1vdmwJJWVieCwlcjEyZAorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisJbm90bAklcjExZAorCWxlYWwJLTY2MDQ3ODMzNSglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjEyZAorCWFuZGwJJWVheCwlcjExZAorCW1vdmwJMTYoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTJkLCVlY3gKKwltb3ZsCSVlYXgsJXIxMmQKKwlyb2xsCSQxNCwlZWN4CisJYWRkbAklZWR4LCVlY3gKKwlub3RsCSVyMTFkCisJbGVhbAktNDA1NTM3ODQ4KCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTJkCisJYW5kbAklZWR4LCVyMTFkCisJbW92bAkzNiglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMmQsJWVieAorCW1vdmwJJWVkeCwlcjEyZAorCXJvbGwJJDIwLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCW5vdGwJJXIxMWQKKwlsZWFsCTU2ODQ0NjQzOCglcmF4LCVyMTAsMSksJWVheAorCWFuZGwJJWVieCwlcjEyZAorCWFuZGwJJWVjeCwlcjExZAorCW1vdmwJNTYoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVyMTJkLCVlYXgKKwltb3ZsCSVlY3gsJXIxMmQKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlYngsJWVheAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xMDE5ODAzNjkwKCVyZHgsJXIxMCwxKSwlZWR4CisJYW5kbAklZWF4LCVyMTJkCisJYW5kbAklZWJ4LCVyMTFkCisJbW92bAkxMiglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCW1vdmwJJWVieCwlcjEyZAorCXJvbGwJJDksJWVkeAorCWFkZGwJJWVheCwlZWR4CisJbm90bAklcjExZAorCWxlYWwJLTE4NzM2Mzk2MSglcmN4LCVyMTAsMSksJWVjeAorCWFuZGwJJWVkeCwlcjEyZAorCWFuZGwJJWVheCwlcjExZAorCW1vdmwJMzIoJXJzaSksJXIxMGQKKwlvcmwJJXIxMWQsJXIxMmQKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTJkLCVlY3gKKwltb3ZsCSVlYXgsJXIxMmQKKwlyb2xsCSQxNCwlZWN4CisJYWRkbAklZWR4LCVlY3gKKwlub3RsCSVyMTFkCisJbGVhbAkxMTYzNTMxNTAxKCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTJkCisJYW5kbAklZWR4LCVyMTFkCisJbW92bAk1MiglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMmQsJWVieAorCW1vdmwJJWVkeCwlcjEyZAorCXJvbGwJJDIwLCVlYngKKwlhZGRsCSVlY3gsJWVieAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xNDQ0NjgxNDY3KCVyYXgsJXIxMCwxKSwlZWF4CisJYW5kbAklZWJ4LCVyMTJkCisJYW5kbAklZWN4LCVyMTFkCisJbW92bAk4KCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklcjEyZCwlZWF4CisJbW92bAklZWN4LCVyMTJkCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWJ4LCVlYXgKKwlub3RsCSVyMTFkCisJbGVhbAktNTE0MDM3ODQoJXJkeCwlcjEwLDEpLCVlZHgKKwlhbmRsCSVlYXgsJXIxMmQKKwlhbmRsCSVlYngsJXIxMWQKKwltb3ZsCTI4KCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWJ4LCVyMTFkCisJYWRkbAklcjEyZCwlZWR4CisJbW92bAklZWJ4LCVyMTJkCisJcm9sbAkkOSwlZWR4CisJYWRkbAklZWF4LCVlZHgKKwlub3RsCSVyMTFkCisJbGVhbAkxNzM1MzI4NDczKCVyY3gsJXIxMCwxKSwlZWN4CisJYW5kbAklZWR4LCVyMTJkCisJYW5kbAklZWF4LCVyMTFkCisJbW92bAk0OCglcnNpKSwlcjEwZAorCW9ybAklcjExZCwlcjEyZAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJXIxMmQsJWVjeAorCW1vdmwJJWVheCwlcjEyZAorCXJvbGwJJDE0LCVlY3gKKwlhZGRsCSVlZHgsJWVjeAorCW5vdGwJJXIxMWQKKwlsZWFsCS0xOTI2NjA3NzM0KCVyYngsJXIxMCwxKSwlZWJ4CisJYW5kbAklZWN4LCVyMTJkCisJYW5kbAklZWR4LCVyMTFkCisJbW92bAkwKCVyc2kpLCVyMTBkCisJb3JsCSVyMTFkLCVyMTJkCisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklcjEyZCwlZWJ4CisJbW92bAklZWR4LCVyMTJkCisJcm9sbAkkMjAsJWVieAorCWFkZGwJJWVjeCwlZWJ4CisJbW92bAkyMCglcnNpKSwlcjEwZAorCW1vdmwJJWVjeCwlcjExZAorCWxlYWwJLTM3ODU1OCglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJMzIoJXJzaSksJXIxMGQKKwl4b3JsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTIwMjI1NzQ0NjMoJXJkeCwlcjEwLDEpLCVlZHgKKwltb3ZsCTQ0KCVyc2kpLCVyMTBkCisJeG9ybAklZWN4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklcjExZCwlZWR4CisJcm9sbAkkMTEsJWVkeAorCW1vdmwJJWVheCwlcjExZAorCWFkZGwJJWVheCwlZWR4CisJbGVhbAkxODM5MDMwNTYyKCVyY3gsJXIxMCwxKSwlZWN4CisJbW92bAk1NiglcnNpKSwlcjEwZAorCXhvcmwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE2LCVlY3gKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCWxlYWwJLTM1MzA5NTU2KCVyYngsJXIxMCwxKSwlZWJ4CisJbW92bAk0KCVyc2kpLCVyMTBkCisJeG9ybAklZWF4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklcjExZCwlZWJ4CisJcm9sbAkkMjMsJWVieAorCW1vdmwJJWVjeCwlcjExZAorCWFkZGwJJWVjeCwlZWJ4CisJbGVhbAktMTUzMDk5MjA2MCglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJMTYoJXJzaSksJXIxMGQKKwl4b3JsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJMTI3Mjg5MzM1MyglcmR4LCVyMTAsMSksJWVkeAorCW1vdmwJMjgoJXJzaSksJXIxMGQKKwl4b3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMSwlZWR4CisJbW92bAklZWF4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwlsZWFsCS0xNTU0OTc2MzIoJXJjeCwlcjEwLDEpLCVlY3gKKwltb3ZsCTQwKCVyc2kpLCVyMTBkCisJeG9ybAklZWJ4LCVyMTFkCisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklcjExZCwlZWN4CisJcm9sbAkkMTYsJWVjeAorCW1vdmwJJWVkeCwlcjExZAorCWFkZGwJJWVkeCwlZWN4CisJbGVhbAktMTA5NDczMDY0MCglcmJ4LCVyMTAsMSksJWVieAorCW1vdmwJNTIoJXJzaSksJXIxMGQKKwl4b3JsCSVlYXgsJXIxMWQKKwl4b3JsCSVlY3gsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYngKKwlyb2xsCSQyMywlZWJ4CisJbW92bAklZWN4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKwlsZWFsCTY4MTI3OTE3NCglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJMCglcnNpKSwlcjEwZAorCXhvcmwJJWVkeCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJXIxMWQsJWVheAorCXJvbGwJJDQsJWVheAorCW1vdmwJJWVieCwlcjExZAorCWFkZGwJJWVieCwlZWF4CisJbGVhbAktMzU4NTM3MjIyKCVyZHgsJXIxMCwxKSwlZWR4CisJbW92bAkxMiglcnNpKSwlcjEwZAorCXhvcmwJJWVjeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJXIxMWQsJWVkeAorCXJvbGwJJDExLCVlZHgKKwltb3ZsCSVlYXgsJXIxMWQKKwlhZGRsCSVlYXgsJWVkeAorCWxlYWwJLTcyMjUyMTk3OSglcmN4LCVyMTAsMSksJWVjeAorCW1vdmwJMjQoJXJzaSksJXIxMGQKKwl4b3JsCSVlYngsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlY3gKKwlyb2xsCSQxNiwlZWN4CisJbW92bAklZWR4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCTc2MDI5MTg5KCVyYngsJXIxMCwxKSwlZWJ4CisJbW92bAkzNiglcnNpKSwlcjEwZAorCXhvcmwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIzLCVlYngKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCWxlYWwJLTY0MDM2NDQ4NyglcmF4LCVyMTAsMSksJWVheAorCW1vdmwJNDgoJXJzaSksJXIxMGQKKwl4b3JsCSVlZHgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYXgKKwlyb2xsCSQ0LCVlYXgKKwltb3ZsCSVlYngsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTQyMTgxNTgzNSglcmR4LCVyMTAsMSksJWVkeAorCW1vdmwJNjAoJXJzaSksJXIxMGQKKwl4b3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlYXgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwlyb2xsCSQxMSwlZWR4CisJbW92bAklZWF4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwlsZWFsCTUzMDc0MjUyMCglcmN4LCVyMTAsMSksJWVjeAorCW1vdmwJOCglcnNpKSwlcjEwZAorCXhvcmwJJWVieCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCXJvbGwJJDE2LCVlY3gKKwltb3ZsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZHgsJWVjeAorCWxlYWwJLTk5NTMzODY1MSglcmJ4LCVyMTAsMSksJWVieAorCW1vdmwJMCglcnNpKSwlcjEwZAorCXhvcmwJJWVheCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVieAorCXJvbGwJJDIzLCVlYngKKwltb3ZsCSVlY3gsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCW1vdmwJMCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlsZWFsCS0xOTg2MzA4NDQoJXJheCwlcjEwLDEpLCVlYXgKKwlvcmwJJWVieCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVheAorCW1vdmwJMjgoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkNiwlZWF4CisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwlsZWFsCTExMjY4OTE0MTUoJXJkeCwlcjEwLDEpLCVlZHgKKwlvcmwJJWVheCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJXIxMWQsJWVkeAorCW1vdmwJNTYoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkMTAsJWVkeAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJWVheCwlZWR4CisJbGVhbAktMTQxNjM1NDkwNSglcmN4LCVyMTAsMSksJWVjeAorCW9ybAklZWR4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklcjExZCwlZWN4CisJbW92bAkyMCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCS01NzQzNDA1NSglcmJ4LCVyMTAsMSksJWVieAorCW9ybAklZWN4LCVyMTFkCisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklcjExZCwlZWJ4CisJbW92bAk0OCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQyMSwlZWJ4CisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKwlsZWFsCTE3MDA0ODU1NzEoJXJheCwlcjEwLDEpLCVlYXgKKwlvcmwJJWVieCwlcjExZAorCXhvcmwJJWVjeCwlcjExZAorCWFkZGwJJXIxMWQsJWVheAorCW1vdmwJMTIoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkNiwlZWF4CisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklZWJ4LCVlYXgKKwlsZWFsCS0xODk0OTg2NjA2KCVyZHgsJXIxMCwxKSwlZWR4CisJb3JsCSVlYXgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwltb3ZsCTQwKCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDEwLCVlZHgKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVlYXgsJWVkeAorCWxlYWwJLTEwNTE1MjMoJXJjeCwlcjEwLDEpLCVlY3gKKwlvcmwJJWVkeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCW1vdmwJNCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCS0yMDU0OTIyNzk5KCVyYngsJXIxMCwxKSwlZWJ4CisJb3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYngKKwltb3ZsCTMyKCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDIxLCVlYngKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCWxlYWwJMTg3MzMxMzM1OSglcmF4LCVyMTAsMSksJWVheAorCW9ybAklZWJ4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklcjExZCwlZWF4CisJbW92bAk2MCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQ2LCVlYXgKKwl4b3JsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTMwNjExNzQ0KCVyZHgsJXIxMCwxKSwlZWR4CisJb3JsCSVlYXgsJXIxMWQKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVyMTFkLCVlZHgKKwltb3ZsCTI0KCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDEwLCVlZHgKKwl4b3JsCSVlYngsJXIxMWQKKwlhZGRsCSVlYXgsJWVkeAorCWxlYWwJLTE1NjAxOTgzODAoJXJjeCwlcjEwLDEpLCVlY3gKKwlvcmwJJWVkeCwlcjExZAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJXIxMWQsJWVjeAorCW1vdmwJNTIoJXJzaSksJXIxMGQKKwltb3ZsCSQweGZmZmZmZmZmLCVyMTFkCisJcm9sbAkkMTUsJWVjeAorCXhvcmwJJWVheCwlcjExZAorCWFkZGwJJWVkeCwlZWN4CisJbGVhbAkxMzA5MTUxNjQ5KCVyYngsJXIxMCwxKSwlZWJ4CisJb3JsCSVlY3gsJXIxMWQKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVyMTFkLCVlYngKKwltb3ZsCTE2KCVyc2kpLCVyMTBkCisJbW92bAkkMHhmZmZmZmZmZiwlcjExZAorCXJvbGwJJDIxLCVlYngKKwl4b3JsCSVlZHgsJXIxMWQKKwlhZGRsCSVlY3gsJWVieAorCWxlYWwJLTE0NTUyMzA3MCglcmF4LCVyMTAsMSksJWVheAorCW9ybAklZWJ4LCVyMTFkCisJeG9ybAklZWN4LCVyMTFkCisJYWRkbAklcjExZCwlZWF4CisJbW92bAk0NCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQ2LCVlYXgKKwl4b3JsCSVlY3gsJXIxMWQKKwlhZGRsCSVlYngsJWVheAorCWxlYWwJLTExMjAyMTAzNzkoJXJkeCwlcjEwLDEpLCVlZHgKKwlvcmwJJWVheCwlcjExZAorCXhvcmwJJWVieCwlcjExZAorCWFkZGwJJXIxMWQsJWVkeAorCW1vdmwJOCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxMCwlZWR4CisJeG9ybAklZWJ4LCVyMTFkCisJYWRkbAklZWF4LCVlZHgKKwlsZWFsCTcxODc4NzI1OSglcmN4LCVyMTAsMSksJWVjeAorCW9ybAklZWR4LCVyMTFkCisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklcjExZCwlZWN4CisJbW92bAkzNiglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQxNSwlZWN4CisJeG9ybAklZWF4LCVyMTFkCisJYWRkbAklZWR4LCVlY3gKKwlsZWFsCS0zNDM0ODU1NTEoJXJieCwlcjEwLDEpLCVlYngKKwlvcmwJJWVjeCwlcjExZAorCXhvcmwJJWVkeCwlcjExZAorCWFkZGwJJXIxMWQsJWVieAorCW1vdmwJMCglcnNpKSwlcjEwZAorCW1vdmwJJDB4ZmZmZmZmZmYsJXIxMWQKKwlyb2xsCSQyMSwlZWJ4CisJeG9ybAklZWR4LCVyMTFkCisJYWRkbAklZWN4LCVlYngKKworCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjlkLCVlYngKKwlhZGRsCSVyMTRkLCVlY3gKKwlhZGRsCSVyMTVkLCVlZHgKKworCisJYWRkcQkkNjQsJXJzaQorCWNtcHEJJXJkaSwlcnNpCisJamIJTCRsb29wCisKKworTCRlbmQ6CisJbW92bAklZWF4LDAoJXJicCkKKwltb3ZsCSVlYngsNCglcmJwKQorCW1vdmwJJWVjeCw4KCVyYnApCisJbW92bAklZWR4LDEyKCVyYnApCisKKwltb3ZxCSglcnNwKSwlcjE1CisJbW92cQk4KCVyc3ApLCVyMTQKKwltb3ZxCTE2KCVyc3ApLCVyMTIKKwltb3ZxCTI0KCVyc3ApLCVyYngKKwltb3ZxCTMyKCVyc3ApLCVyYnAKKwlhZGRxCSQ0MCwlcnNwCitMJGVwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9wMjU2LXg4Nl82NC1hc20uUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9wMjU2LXg4Nl82NC1hc20uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzY1ODkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3AyNTYteDg2XzY0LWFzbS5TCkBAIC0wLDAgKzEsNDQwNSBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKworCisKKy5wMmFsaWduCTYKK0wkcG9seToKKy5xdWFkCTB4ZmZmZmZmZmZmZmZmZmZmZiwgMHgwMDAwMDAwMGZmZmZmZmZmLCAweDAwMDAwMDAwMDAwMDAwMDAsIDB4ZmZmZmZmZmYwMDAwMDAwMQorCitMJE9uZToKKy5sb25nCTEsMSwxLDEsMSwxLDEsMQorTCRUd286CisubG9uZwkyLDIsMiwyLDIsMiwyLDIKK0wkVGhyZWU6CisubG9uZwkzLDMsMywzLDMsMywzLDMKK0wkT05FX21vbnQ6CisucXVhZAkweDAwMDAwMDAwMDAwMDAwMDEsIDB4ZmZmZmZmZmYwMDAwMDAwMCwgMHhmZmZmZmZmZmZmZmZmZmZmLCAweDAwMDAwMDAwZmZmZmZmZmUKKworCitMJG9yZDoKKy5xdWFkCTB4ZjNiOWNhYzJmYzYzMjU1MSwgMHhiY2U2ZmFhZGE3MTc5ZTg0LCAweGZmZmZmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmYwMDAwMDAwMAorTCRvcmRLOgorLnF1YWQJMHhjY2QxYzhhYWVlMDBiYzRmCisKKworCisuZ2xvYmwJX2VjcF9uaXN0ejI1Nl9uZWcKKy5wcml2YXRlX2V4dGVybiBfZWNwX25pc3R6MjU2X25lZworCisucDJhbGlnbgk1CitfZWNwX25pc3R6MjU2X25lZzoKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworTCRuZWdfYm9keToKKworCXhvcnEJJXI4LCVyOAorCXhvcnEJJXI5LCVyOQorCXhvcnEJJXIxMCwlcjEwCisJeG9ycQklcjExLCVyMTEKKwl4b3JxCSVyMTMsJXIxMworCisJc3VicQkwKCVyc2kpLCVyOAorCXNiYnEJOCglcnNpKSwlcjkKKwlzYmJxCTE2KCVyc2kpLCVyMTAKKwltb3ZxCSVyOCwlcmF4CisJc2JicQkyNCglcnNpKSwlcjExCisJbGVhcQlMJHBvbHkoJXJpcCksJXJzaQorCW1vdnEJJXI5LCVyZHgKKwlzYmJxCSQwLCVyMTMKKworCWFkZHEJMCglcnNpKSwlcjgKKwltb3ZxCSVyMTAsJXJjeAorCWFkY3EJOCglcnNpKSwlcjkKKwlhZGNxCTE2KCVyc2kpLCVyMTAKKwltb3ZxCSVyMTEsJXIxMgorCWFkY3EJMjQoJXJzaSksJXIxMQorCXRlc3RxCSVyMTMsJXIxMworCisJY21vdnpxCSVyYXgsJXI4CisJY21vdnpxCSVyZHgsJXI5CisJbW92cQklcjgsMCglcmRpKQorCWNtb3Z6cQklcmN4LCVyMTAKKwltb3ZxCSVyOSw4KCVyZGkpCisJY21vdnpxCSVyMTIsJXIxMQorCW1vdnEJJXIxMCwxNiglcmRpKQorCW1vdnEJJXIxMSwyNCglcmRpKQorCisJbW92cQkwKCVyc3ApLCVyMTMKKworCW1vdnEJOCglcnNwKSwlcjEyCisKKwlsZWFxCTE2KCVyc3ApLCVyc3AKKworTCRuZWdfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKworCisKKworLmdsb2JsCV9lY3BfbmlzdHoyNTZfb3JkX211bF9tb250CisucHJpdmF0ZV9leHRlcm4gX2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQKKworLnAyYWxpZ24JNQorX2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQ6CisKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmN4CisJbW92cQk4KCVyY3gpLCVyY3gKKwlhbmRsCSQweDgwMTAwLCVlY3gKKwljbXBsCSQweDgwMTAwLCVlY3gKKwlqZQlMJGVjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnR4CisJcHVzaHEJJXJicAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCitMJG9yZF9tdWxfYm9keToKKworCW1vdnEJMCglcmR4KSwlcmF4CisJbW92cQklcmR4LCVyYngKKwlsZWFxCUwkb3JkKCVyaXApLCVyMTQKKwltb3ZxCUwkb3JkSyglcmlwKSwlcjE1CisKKworCW1vdnEJJXJheCwlcmN4CisJbXVscQkwKCVyc2kpCisJbW92cQklcmF4LCVyOAorCW1vdnEJJXJjeCwlcmF4CisJbW92cQklcmR4LCVyOQorCisJbXVscQk4KCVyc2kpCisJYWRkcQklcmF4LCVyOQorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJMTYoJXJzaSkKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyOCwlcjEzCisJaW11bHEJJXIxNSwlcjgKKworCW1vdnEJJXJkeCwlcjExCisJbXVscQkyNCglcnNpKQorCWFkZHEJJXJheCwlcjExCisJbW92cQklcjgsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEyCisKKworCW11bHEJMCglcjE0KQorCW1vdnEJJXI4LCVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJJXI4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJc3VicQklcjgsJXIxMAorCXNiYnEJJDAsJXI4CisKKwltdWxxCTgoJXIxNCkKKwlhZGRxCSVyY3gsJXI5CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyOQorCW1vdnEJJXJicCwlcmF4CisJYWRjcQklcmR4LCVyMTAKKwltb3ZxCSVyYnAsJXJkeAorCWFkY3EJJDAsJXI4CisKKwlzaGxxCSQzMiwlcmF4CisJc2hycQkkMzIsJXJkeAorCXN1YnEJJXJheCwlcjExCisJbW92cQk4KCVyYngpLCVyYXgKKwlzYmJxCSVyZHgsJXJicAorCisJYWRkcQklcjgsJXIxMQorCWFkY3EJJXJicCwlcjEyCisJYWRjcQkkMCwlcjEzCisKKworCW1vdnEJJXJheCwlcmN4CisJbXVscQkwKCVyc2kpCisJYWRkcQklcmF4LCVyOQorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJOCglcnNpKQorCWFkZHEJJXJicCwlcjEwCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyY3gsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJwCisKKwltdWxxCTE2KCVyc2kpCisJYWRkcQklcmJwLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyOSwlcmN4CisJaW11bHEJJXIxNSwlcjkKKworCW1vdnEJJXJkeCwlcmJwCisJbXVscQkyNCglcnNpKQorCWFkZHEJJXJicCwlcjEyCisJYWRjcQkkMCwlcmR4CisJeG9ycQklcjgsJXI4CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCSVyOSwlcmF4CisJYWRjcQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyOAorCisKKwltdWxxCTAoJXIxNCkKKwltb3ZxCSVyOSwlcmJwCisJYWRkcQklcmF4LCVyY3gKKwltb3ZxCSVyOSwlcmF4CisJYWRjcQklcmR4LCVyY3gKKworCXN1YnEJJXI5LCVyMTEKKwlzYmJxCSQwLCVyOQorCisJbXVscQk4KCVyMTQpCisJYWRkcQklcmN4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJicCwlcmF4CisJYWRjcQklcmR4LCVyMTEKKwltb3ZxCSVyYnAsJXJkeAorCWFkY3EJJDAsJXI5CisKKwlzaGxxCSQzMiwlcmF4CisJc2hycQkkMzIsJXJkeAorCXN1YnEJJXJheCwlcjEyCisJbW92cQkxNiglcmJ4KSwlcmF4CisJc2JicQklcmR4LCVyYnAKKworCWFkZHEJJXI5LCVyMTIKKwlhZGNxCSVyYnAsJXIxMworCWFkY3EJJDAsJXI4CisKKworCW1vdnEJJXJheCwlcmN4CisJbXVscQkwKCVyc2kpCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyY3gsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJwCisKKwltdWxxCTgoJXJzaSkKKwlhZGRxCSVyYnAsJXIxMQorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmN4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJicAorCisJbXVscQkxNiglcnNpKQorCWFkZHEJJXJicCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCSVyY3gsJXJheAorCWFkY3EJJDAsJXJkeAorCisJbW92cQklcjEwLCVyY3gKKwlpbXVscQklcjE1LCVyMTAKKworCW1vdnEJJXJkeCwlcmJwCisJbXVscQkyNCglcnNpKQorCWFkZHEJJXJicCwlcjEzCisJYWRjcQkkMCwlcmR4CisJeG9ycQklcjksJXI5CisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSVyMTAsJXJheAorCWFkY3EJJXJkeCwlcjgKKwlhZGNxCSQwLCVyOQorCisKKwltdWxxCTAoJXIxNCkKKwltb3ZxCSVyMTAsJXJicAorCWFkZHEJJXJheCwlcmN4CisJbW92cQklcjEwLCVyYXgKKwlhZGNxCSVyZHgsJXJjeAorCisJc3VicQklcjEwLCVyMTIKKwlzYmJxCSQwLCVyMTAKKworCW11bHEJOCglcjE0KQorCWFkZHEJJXJjeCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJXJkeCwlcjEyCisJbW92cQklcmJwLCVyZHgKKwlhZGNxCSQwLCVyMTAKKworCXNobHEJJDMyLCVyYXgKKwlzaHJxCSQzMiwlcmR4CisJc3VicQklcmF4LCVyMTMKKwltb3ZxCTI0KCVyYngpLCVyYXgKKwlzYmJxCSVyZHgsJXJicAorCisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSVyYnAsJXI4CisJYWRjcQkkMCwlcjkKKworCisJbW92cQklcmF4LCVyY3gKKwltdWxxCTAoJXJzaSkKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJOCglcnNpKQorCWFkZHEJJXJicCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCSVyY3gsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmJwCisKKwltdWxxCTE2KCVyc2kpCisJYWRkcQklcmJwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJJXJjeCwlcmF4CisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyMTEsJXJjeAorCWltdWxxCSVyMTUsJXIxMQorCisJbW92cQklcmR4LCVyYnAKKwltdWxxCTI0KCVyc2kpCisJYWRkcQklcmJwLCVyOAorCWFkY3EJJDAsJXJkeAorCXhvcnEJJXIxMCwlcjEwCisJYWRkcQklcmF4LCVyOAorCW1vdnEJJXIxMSwlcmF4CisJYWRjcQklcmR4LCVyOQorCWFkY3EJJDAsJXIxMAorCisKKwltdWxxCTAoJXIxNCkKKwltb3ZxCSVyMTEsJXJicAorCWFkZHEJJXJheCwlcmN4CisJbW92cQklcjExLCVyYXgKKwlhZGNxCSVyZHgsJXJjeAorCisJc3VicQklcjExLCVyMTMKKwlzYmJxCSQwLCVyMTEKKworCW11bHEJOCglcjE0KQorCWFkZHEJJXJjeCwlcjEyCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTIKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJXJkeCwlcjEzCisJbW92cQklcmJwLCVyZHgKKwlhZGNxCSQwLCVyMTEKKworCXNobHEJJDMyLCVyYXgKKwlzaHJxCSQzMiwlcmR4CisJc3VicQklcmF4LCVyOAorCXNiYnEJJXJkeCwlcmJwCisKKwlhZGRxCSVyMTEsJXI4CisJYWRjcQklcmJwLCVyOQorCWFkY3EJJDAsJXIxMAorCisKKwltb3ZxCSVyMTIsJXJzaQorCXN1YnEJMCglcjE0KSwlcjEyCisJbW92cQklcjEzLCVyMTEKKwlzYmJxCTgoJXIxNCksJXIxMworCW1vdnEJJXI4LCVyY3gKKwlzYmJxCTE2KCVyMTQpLCVyOAorCW1vdnEJJXI5LCVyYnAKKwlzYmJxCTI0KCVyMTQpLCVyOQorCXNiYnEJJDAsJXIxMAorCisJY21vdmNxCSVyc2ksJXIxMgorCWNtb3ZjcQklcjExLCVyMTMKKwljbW92Y3EJJXJjeCwlcjgKKwljbW92Y3EJJXJicCwlcjkKKworCW1vdnEJJXIxMiwwKCVyZGkpCisJbW92cQklcjEzLDgoJXJkaSkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwltb3ZxCTAoJXJzcCksJXIxNQorCisJbW92cQk4KCVyc3ApLCVyMTQKKworCW1vdnEJMTYoJXJzcCksJXIxMworCisJbW92cQkyNCglcnNwKSwlcjEyCisKKwltb3ZxCTMyKCVyc3ApLCVyYngKKworCW1vdnEJNDAoJXJzcCksJXJicAorCisJbGVhcQk0OCglcnNwKSwlcnNwCisKK0wkb3JkX211bF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworCisKKworCisKKy5nbG9ibAlfZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udAorLnByaXZhdGVfZXh0ZXJuIF9lY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250CisKKy5wMmFsaWduCTUKK19lY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250OgorCisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXJjeAorCW1vdnEJOCglcmN4KSwlcmN4CisJYW5kbAkkMHg4MDEwMCwlZWN4CisJY21wbAkkMHg4MDEwMCwlZWN4CisJamUJTCRlY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250eAorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworTCRvcmRfc3FyX2JvZHk6CisKKwltb3ZxCTAoJXJzaSksJXI4CisJbW92cQk4KCVyc2kpLCVyYXgKKwltb3ZxCTE2KCVyc2kpLCVyMTQKKwltb3ZxCTI0KCVyc2kpLCVyMTUKKwlsZWFxCUwkb3JkKCVyaXApLCVyc2kKKwltb3ZxCSVyZHgsJXJieAorCWptcAlMJG9vcF9vcmRfc3FyCisKKy5wMmFsaWduCTUKK0wkb29wX29yZF9zcXI6CisKKwltb3ZxCSVyYXgsJXJicAorCW11bHEJJXI4CisJbW92cQklcmF4LCVyOQorLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDUKKwltb3ZxCSVyMTQsJXJheAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyOAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcjE1LCVyYXgKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXI4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyMTUsJXJheAorLmJ5dGUJMTAyLDczLDE1LDExMCwyMjMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMgorCisKKwltdWxxCSVyMTQKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXIxNCwlcmF4CisJbW92cQklcmR4LCVyMTQKKworCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyMTUsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjE1CisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXJkeAorCisJYWRkcQklcjE1LCVyMTIKKwlhZGNxCSVyZHgsJXIxMworCWFkY3EJJDAsJXIxNAorCisKKwl4b3JxCSVyMTUsJXIxNQorCW1vdnEJJXI4LCVyYXgKKwlhZGRxCSVyOSwlcjkKKwlhZGNxCSVyMTAsJXIxMAorCWFkY3EJJXIxMSwlcjExCisJYWRjcQklcjEyLCVyMTIKKwlhZGNxCSVyMTMsJXIxMworCWFkY3EJJXIxNCwlcjE0CisJYWRjcQkkMCwlcjE1CisKKworCW11bHEJJXJheAorCW1vdnEJJXJheCwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjAwCisJbW92cQklcmR4LCVyYnAKKworCW11bHEJJXJheAorCWFkZHEJJXJicCwlcjkKKwlhZGNxCSVyYXgsJXIxMAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJicAorCisJbXVscQklcmF4CisJYWRkcQklcmJwLCVyMTEKKwlhZGNxCSVyYXgsJXIxMgorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTYKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJicAorCisJbW92cQklcjgsJXJjeAorCWltdWxxCTMyKCVyc2kpLCVyOAorCisJbXVscQklcmF4CisJYWRkcQklcmJwLCVyMTMKKwlhZGNxCSVyYXgsJXIxNAorCW1vdnEJMCglcnNpKSwlcmF4CisJYWRjcQklcmR4LCVyMTUKKworCisJbXVscQklcjgKKwltb3ZxCSVyOCwlcmJwCisJYWRkcQklcmF4LCVyY3gKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJXJkeCwlcmN4CisKKwlzdWJxCSVyOCwlcjEwCisJc2JicQkkMCwlcmJwCisKKwltdWxxCSVyOAorCWFkZHEJJXJjeCwlcjkKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXI5CisJbW92cQklcjgsJXJheAorCWFkY3EJJXJkeCwlcjEwCisJbW92cQklcjgsJXJkeAorCWFkY3EJJDAsJXJicAorCisJbW92cQklcjksJXJjeAorCWltdWxxCTMyKCVyc2kpLCVyOQorCisJc2hscQkkMzIsJXJheAorCXNocnEJJDMyLCVyZHgKKwlzdWJxCSVyYXgsJXIxMQorCW1vdnEJMCglcnNpKSwlcmF4CisJc2JicQklcmR4LCVyOAorCisJYWRkcQklcmJwLCVyMTEKKwlhZGNxCSQwLCVyOAorCisKKwltdWxxCSVyOQorCW1vdnEJJXI5LCVyYnAKKwlhZGRxCSVyYXgsJXJjeAorCW1vdnEJOCglcnNpKSwlcmF4CisJYWRjcQklcmR4LCVyY3gKKworCXN1YnEJJXI5LCVyMTEKKwlzYmJxCSQwLCVyYnAKKworCW11bHEJJXI5CisJYWRkcQklcmN4LCVyMTAKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXI5LCVyYXgKKwlhZGNxCSVyZHgsJXIxMQorCW1vdnEJJXI5LCVyZHgKKwlhZGNxCSQwLCVyYnAKKworCW1vdnEJJXIxMCwlcmN4CisJaW11bHEJMzIoJXJzaSksJXIxMAorCisJc2hscQkkMzIsJXJheAorCXNocnEJJDMyLCVyZHgKKwlzdWJxCSVyYXgsJXI4CisJbW92cQkwKCVyc2kpLCVyYXgKKwlzYmJxCSVyZHgsJXI5CisKKwlhZGRxCSVyYnAsJXI4CisJYWRjcQkkMCwlcjkKKworCisJbXVscQklcjEwCisJbW92cQklcjEwLCVyYnAKKwlhZGRxCSVyYXgsJXJjeAorCW1vdnEJOCglcnNpKSwlcmF4CisJYWRjcQklcmR4LCVyY3gKKworCXN1YnEJJXIxMCwlcjgKKwlzYmJxCSQwLCVyYnAKKworCW11bHEJJXIxMAorCWFkZHEJJXJjeCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyMTAsJXJheAorCWFkY3EJJXJkeCwlcjgKKwltb3ZxCSVyMTAsJXJkeAorCWFkY3EJJDAsJXJicAorCisJbW92cQklcjExLCVyY3gKKwlpbXVscQkzMiglcnNpKSwlcjExCisKKwlzaGxxCSQzMiwlcmF4CisJc2hycQkkMzIsJXJkeAorCXN1YnEJJXJheCwlcjkKKwltb3ZxCTAoJXJzaSksJXJheAorCXNiYnEJJXJkeCwlcjEwCisKKwlhZGRxCSVyYnAsJXI5CisJYWRjcQkkMCwlcjEwCisKKworCW11bHEJJXIxMQorCW1vdnEJJXIxMSwlcmJwCisJYWRkcQklcmF4LCVyY3gKKwltb3ZxCTgoJXJzaSksJXJheAorCWFkY3EJJXJkeCwlcmN4CisKKwlzdWJxCSVyMTEsJXI5CisJc2JicQkkMCwlcmJwCisKKwltdWxxCSVyMTEKKwlhZGRxCSVyY3gsJXI4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyOAorCW1vdnEJJXIxMSwlcmF4CisJYWRjcQklcmR4LCVyOQorCW1vdnEJJXIxMSwlcmR4CisJYWRjcQkkMCwlcmJwCisKKwlzaGxxCSQzMiwlcmF4CisJc2hycQkkMzIsJXJkeAorCXN1YnEJJXJheCwlcjEwCisJc2JicQklcmR4LCVyMTEKKworCWFkZHEJJXJicCwlcjEwCisJYWRjcQkkMCwlcjExCisKKworCXhvcnEJJXJkeCwlcmR4CisJYWRkcQklcjEyLCVyOAorCWFkY3EJJXIxMywlcjkKKwltb3ZxCSVyOCwlcjEyCisJYWRjcQklcjE0LCVyMTAKKwlhZGNxCSVyMTUsJXIxMQorCW1vdnEJJXI5LCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCisJc3VicQkwKCVyc2kpLCVyOAorCW1vdnEJJXIxMCwlcjE0CisJc2JicQk4KCVyc2kpLCVyOQorCXNiYnEJMTYoJXJzaSksJXIxMAorCW1vdnEJJXIxMSwlcjE1CisJc2JicQkyNCglcnNpKSwlcjExCisJc2JicQkkMCwlcmR4CisKKwljbW92Y3EJJXIxMiwlcjgKKwljbW92bmNxCSVyOSwlcmF4CisJY21vdm5jcQklcjEwLCVyMTQKKwljbW92bmNxCSVyMTEsJXIxNQorCisJZGVjcQklcmJ4CisJam56CUwkb29wX29yZF9zcXIKKworCW1vdnEJJXI4LDAoJXJkaSkKKwltb3ZxCSVyYXgsOCglcmRpKQorCXB4b3IJJXhtbTEsJXhtbTEKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwlweG9yCSV4bW0yLCV4bW0yCisJbW92cQklcjE1LDI0KCVyZGkpCisJcHhvcgkleG1tMywleG1tMworCisJbW92cQkwKCVyc3ApLCVyMTUKKworCW1vdnEJOCglcnNwKSwlcjE0CisKKwltb3ZxCTE2KCVyc3ApLCVyMTMKKworCW1vdnEJMjQoJXJzcCksJXIxMgorCisJbW92cQkzMiglcnNwKSwlcmJ4CisKKwltb3ZxCTQwKCVyc3ApLCVyYnAKKworCWxlYXEJNDgoJXJzcCksJXJzcAorCitMJG9yZF9zcXJfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKy5wMmFsaWduCTUKK2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnR4OgorCitMJGVjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnR4OgorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworTCRvcmRfbXVseF9ib2R5OgorCisJbW92cQklcmR4LCVyYngKKwltb3ZxCTAoJXJkeCksJXJkeAorCW1vdnEJMCglcnNpKSwlcjkKKwltb3ZxCTgoJXJzaSksJXIxMAorCW1vdnEJMTYoJXJzaSksJXIxMQorCW1vdnEJMjQoJXJzaSksJXIxMgorCWxlYXEJLTEyOCglcnNpKSwlcnNpCisJbGVhcQlMJG9yZC0xMjgoJXJpcCksJXIxNAorCW1vdnEJTCRvcmRLKCVyaXApLCVyMTUKKworCisJbXVseHEJJXI5LCVyOCwlcjkKKwltdWx4cQklcjEwLCVyY3gsJXIxMAorCW11bHhxCSVyMTEsJXJicCwlcjExCisJYWRkcQklcmN4LCVyOQorCW11bHhxCSVyMTIsJXJjeCwlcjEyCisJbW92cQklcjgsJXJkeAorCW11bHhxCSVyMTUsJXJkeCwlcmF4CisJYWRjcQklcmJwLCVyMTAKKwlhZGNxCSVyY3gsJXIxMQorCWFkY3EJJDAsJXIxMgorCisKKwl4b3JxCSVyMTMsJXIxMworCW11bHhxCTArMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI4CisJYWRveHEJJXJicCwlcjkKKworCW11bHhxCTgrMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI5CisJYWRveHEJJXJicCwlcjEwCisKKwltdWx4cQkxNisxMjgoJXIxNCksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEwCisJYWRveHEJJXJicCwlcjExCisKKwltdWx4cQkyNCsxMjgoJXIxNCksJXJjeCwlcmJwCisJbW92cQk4KCVyYngpLCVyZHgKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKwlhZGN4cQklcjgsJXIxMgorCWFkb3hxCSVyOCwlcjEzCisJYWRjcQkkMCwlcjEzCisKKworCW11bHhxCTArMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI5CisJYWRveHEJJXJicCwlcjEwCisKKwltdWx4cQk4KzEyOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTAKKwlhZG94cQklcmJwLCVyMTEKKworCW11bHhxCTE2KzEyOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKworCW11bHhxCTI0KzEyOCglcnNpKSwlcmN4LCVyYnAKKwltb3ZxCSVyOSwlcmR4CisJbXVseHEJJXIxNSwlcmR4LCVyYXgKKwlhZGN4cQklcmN4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKworCWFkY3hxCSVyOCwlcjEzCisJYWRveHEJJXI4LCVyOAorCWFkY3EJJDAsJXI4CisKKworCW11bHhxCTArMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI5CisJYWRveHEJJXJicCwlcjEwCisKKwltdWx4cQk4KzEyOCglcjE0KSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTAKKwlhZG94cQklcmJwLCVyMTEKKworCW11bHhxCTE2KzEyOCglcjE0KSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKworCW11bHhxCTI0KzEyOCglcjE0KSwlcmN4LCVyYnAKKwltb3ZxCTE2KCVyYngpLCVyZHgKKwlhZGN4cQklcmN4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKwlhZGN4cQklcjksJXIxMworCWFkb3hxCSVyOSwlcjgKKwlhZGNxCSQwLCVyOAorCisKKwltdWx4cQkwKzEyOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTAKKwlhZG94cQklcmJwLCVyMTEKKworCW11bHhxCTgrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCisJbXVseHEJMTYrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCisJbXVseHEJMjQrMTI4KCVyc2kpLCVyY3gsJXJicAorCW1vdnEJJXIxMCwlcmR4CisJbXVseHEJJXIxNSwlcmR4LCVyYXgKKwlhZGN4cQklcmN4LCVyMTMKKwlhZG94cQklcmJwLCVyOAorCisJYWRjeHEJJXI5LCVyOAorCWFkb3hxCSVyOSwlcjkKKwlhZGNxCSQwLCVyOQorCisKKwltdWx4cQkwKzEyOCglcjE0KSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTAKKwlhZG94cQklcmJwLCVyMTEKKworCW11bHhxCTgrMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCisJbXVseHEJMTYrMTI4KCVyMTQpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCisJbXVseHEJMjQrMTI4KCVyMTQpLCVyY3gsJXJicAorCW1vdnEJMjQoJXJieCksJXJkeAorCWFkY3hxCSVyY3gsJXIxMworCWFkb3hxCSVyYnAsJXI4CisJYWRjeHEJJXIxMCwlcjgKKwlhZG94cQklcjEwLCVyOQorCWFkY3EJJDAsJXI5CisKKworCW11bHhxCTArMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCisJbXVseHEJOCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEyCisJYWRveHEJJXJicCwlcjEzCisKKwltdWx4cQkxNisxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEzCisJYWRveHEJJXJicCwlcjgKKworCW11bHhxCTI0KzEyOCglcnNpKSwlcmN4LCVyYnAKKwltb3ZxCSVyMTEsJXJkeAorCW11bHhxCSVyMTUsJXJkeCwlcmF4CisJYWRjeHEJJXJjeCwlcjgKKwlhZG94cQklcmJwLCVyOQorCisJYWRjeHEJJXIxMCwlcjkKKwlhZG94cQklcjEwLCVyMTAKKwlhZGNxCSQwLCVyMTAKKworCisJbXVseHEJMCsxMjgoJXIxNCksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQk4KzEyOCglcjE0KSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKworCW11bHhxCTE2KzEyOCglcjE0KSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTMKKwlhZG94cQklcmJwLCVyOAorCisJbXVseHEJMjQrMTI4KCVyMTQpLCVyY3gsJXJicAorCWxlYXEJMTI4KCVyMTQpLCVyMTQKKwltb3ZxCSVyMTIsJXJieAorCWFkY3hxCSVyY3gsJXI4CisJYWRveHEJJXJicCwlcjkKKwltb3ZxCSVyMTMsJXJkeAorCWFkY3hxCSVyMTEsJXI5CisJYWRveHEJJXIxMSwlcjEwCisJYWRjcQkkMCwlcjEwCisKKworCisJbW92cQklcjgsJXJjeAorCXN1YnEJMCglcjE0KSwlcjEyCisJc2JicQk4KCVyMTQpLCVyMTMKKwlzYmJxCTE2KCVyMTQpLCVyOAorCW1vdnEJJXI5LCVyYnAKKwlzYmJxCTI0KCVyMTQpLCVyOQorCXNiYnEJJDAsJXIxMAorCisJY21vdmNxCSVyYngsJXIxMgorCWNtb3ZjcQklcmR4LCVyMTMKKwljbW92Y3EJJXJjeCwlcjgKKwljbW92Y3EJJXJicCwlcjkKKworCW1vdnEJJXIxMiwwKCVyZGkpCisJbW92cQklcjEzLDgoJXJkaSkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwltb3ZxCTAoJXJzcCksJXIxNQorCisJbW92cQk4KCVyc3ApLCVyMTQKKworCW1vdnEJMTYoJXJzcCksJXIxMworCisJbW92cQkyNCglcnNwKSwlcjEyCisKKwltb3ZxCTMyKCVyc3ApLCVyYngKKworCW1vdnEJNDAoJXJzcCksJXJicAorCisJbGVhcQk0OCglcnNwKSwlcnNwCisKK0wkb3JkX211bHhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKy5wMmFsaWduCTUKK2VjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnR4OgorCitMJGVjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnR4OgorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworTCRvcmRfc3FyeF9ib2R5OgorCisJbW92cQklcmR4LCVyYngKKwltb3ZxCTAoJXJzaSksJXJkeAorCW1vdnEJOCglcnNpKSwlcjE0CisJbW92cQkxNiglcnNpKSwlcjE1CisJbW92cQkyNCglcnNpKSwlcjgKKwlsZWFxCUwkb3JkKCVyaXApLCVyc2kKKwlqbXAJTCRvb3Bfb3JkX3NxcngKKworLnAyYWxpZ24JNQorTCRvb3Bfb3JkX3Nxcng6CisJbXVseHEJJXIxNCwlcjksJXIxMAorCW11bHhxCSVyMTUsJXJjeCwlcjExCisJbW92cQklcmR4LCVyYXgKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjA2CisJbXVseHEJJXI4LCVyYnAsJXIxMgorCW1vdnEJJXIxNCwlcmR4CisJYWRkcQklcmN4LCVyMTAKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjE1CisJYWRjcQklcmJwLCVyMTEKKwlhZGNxCSQwLCVyMTIKKwl4b3JxCSVyMTMsJXIxMworCisJbXVseHEJJXIxNSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKworCW11bHhxCSVyOCwlcmN4LCVyYnAKKwltb3ZxCSVyMTUsJXJkeAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCWFkY3EJJDAsJXIxMworCisJbXVseHEJJXI4LCVyY3gsJXIxNAorCW1vdnEJJXJheCwlcmR4CisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIxNgorCXhvcnEJJXIxNSwlcjE1CisJYWRjeHEJJXI5LCVyOQorCWFkb3hxCSVyY3gsJXIxMworCWFkY3hxCSVyMTAsJXIxMAorCWFkb3hxCSVyMTUsJXIxNAorCisKKwltdWx4cQklcmR4LCVyOCwlcmJwCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwMgorCWFkY3hxCSVyMTEsJXIxMQorCWFkb3hxCSVyYnAsJXI5CisJYWRjeHEJJXIxMiwlcjEyCisJbXVseHEJJXJkeCwlcmN4LCVyYXgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjEwCisJYWRjeHEJJXIxMywlcjEzCisJYWRveHEJJXJjeCwlcjEwCisJYWRjeHEJJXIxNCwlcjE0CisJbXVseHEJJXJkeCwlcmN4LCVyYnAKKy5ieXRlCTB4NjcKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjE4CisJYWRveHEJJXJheCwlcjExCisJYWRjeHEJJXIxNSwlcjE1CisJYWRveHEJJXJjeCwlcjEyCisJYWRveHEJJXJicCwlcjEzCisJbXVseHEJJXJkeCwlcmN4LCVyYXgKKwlhZG94cQklcmN4LCVyMTQKKwlhZG94cQklcmF4LCVyMTUKKworCisJbW92cQklcjgsJXJkeAorCW11bHhxCTMyKCVyc2kpLCVyZHgsJXJjeAorCisJeG9ycQklcmF4LCVyYXgKKwltdWx4cQkwKCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI4CisJYWRveHEJJXJicCwlcjkKKwltdWx4cQk4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI5CisJYWRveHEJJXJicCwlcjEwCisJbXVseHEJMTYoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEwCisJYWRveHEJJXJicCwlcjExCisJbXVseHEJMjQoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjgKKwlhZGN4cQklcmF4LCVyOAorCisKKwltb3ZxCSVyOSwlcmR4CisJbXVseHEJMzIoJXJzaSksJXJkeCwlcmN4CisKKwltdWx4cQkwKCVyc2kpLCVyY3gsJXJicAorCWFkb3hxCSVyY3gsJXI5CisJYWRjeHEJJXJicCwlcjEwCisJbXVseHEJOCglcnNpKSwlcmN4LCVyYnAKKwlhZG94cQklcmN4LCVyMTAKKwlhZGN4cQklcmJwLCVyMTEKKwltdWx4cQkxNiglcnNpKSwlcmN4LCVyYnAKKwlhZG94cQklcmN4LCVyMTEKKwlhZGN4cQklcmJwLCVyOAorCW11bHhxCTI0KCVyc2kpLCVyY3gsJXJicAorCWFkb3hxCSVyY3gsJXI4CisJYWRjeHEJJXJicCwlcjkKKwlhZG94cQklcmF4LCVyOQorCisKKwltb3ZxCSVyMTAsJXJkeAorCW11bHhxCTMyKCVyc2kpLCVyZHgsJXJjeAorCisJbXVseHEJMCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTAKKwlhZG94cQklcmJwLCVyMTEKKwltdWx4cQk4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXI4CisJbXVseHEJMTYoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjgKKwlhZG94cQklcmJwLCVyOQorCW11bHhxCTI0KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXI5CisJYWRveHEJJXJicCwlcjEwCisJYWRjeHEJJXJheCwlcjEwCisKKworCW1vdnEJJXIxMSwlcmR4CisJbXVseHEJMzIoJXJzaSksJXJkeCwlcmN4CisKKwltdWx4cQkwKCVyc2kpLCVyY3gsJXJicAorCWFkb3hxCSVyY3gsJXIxMQorCWFkY3hxCSVyYnAsJXI4CisJbXVseHEJOCglcnNpKSwlcmN4LCVyYnAKKwlhZG94cQklcmN4LCVyOAorCWFkY3hxCSVyYnAsJXI5CisJbXVseHEJMTYoJXJzaSksJXJjeCwlcmJwCisJYWRveHEJJXJjeCwlcjkKKwlhZGN4cQklcmJwLCVyMTAKKwltdWx4cQkyNCglcnNpKSwlcmN4LCVyYnAKKwlhZG94cQklcmN4LCVyMTAKKwlhZGN4cQklcmJwLCVyMTEKKwlhZG94cQklcmF4LCVyMTEKKworCisJYWRkcQklcjgsJXIxMgorCWFkY3EJJXIxMywlcjkKKwltb3ZxCSVyMTIsJXJkeAorCWFkY3EJJXIxNCwlcjEwCisJYWRjcQklcjE1LCVyMTEKKwltb3ZxCSVyOSwlcjE0CisJYWRjcQkkMCwlcmF4CisKKworCXN1YnEJMCglcnNpKSwlcjEyCisJbW92cQklcjEwLCVyMTUKKwlzYmJxCTgoJXJzaSksJXI5CisJc2JicQkxNiglcnNpKSwlcjEwCisJbW92cQklcjExLCVyOAorCXNiYnEJMjQoJXJzaSksJXIxMQorCXNiYnEJJDAsJXJheAorCisJY21vdm5jcQklcjEyLCVyZHgKKwljbW92bmNxCSVyOSwlcjE0CisJY21vdm5jcQklcjEwLCVyMTUKKwljbW92bmNxCSVyMTEsJXI4CisKKwlkZWNxCSVyYngKKwlqbnoJTCRvb3Bfb3JkX3NxcngKKworCW1vdnEJJXJkeCwwKCVyZGkpCisJbW92cQklcjE0LDgoJXJkaSkKKwlweG9yCSV4bW0xLCV4bW0xCisJbW92cQklcjE1LDE2KCVyZGkpCisJcHhvcgkleG1tMiwleG1tMgorCW1vdnEJJXI4LDI0KCVyZGkpCisJcHhvcgkleG1tMywleG1tMworCisJbW92cQkwKCVyc3ApLCVyMTUKKworCW1vdnEJOCglcnNwKSwlcjE0CisKKwltb3ZxCTE2KCVyc3ApLCVyMTMKKworCW1vdnEJMjQoJXJzcCksJXIxMgorCisJbW92cQkzMiglcnNwKSwlcmJ4CisKKwltb3ZxCTQwKCVyc3ApLCVyYnAKKworCWxlYXEJNDgoJXJzcCksJXJzcAorCitMJG9yZF9zcXJ4X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKworCisKKworCisKKy5nbG9ibAlfZWNwX25pc3R6MjU2X211bF9tb250CisucHJpdmF0ZV9leHRlcm4gX2VjcF9uaXN0ejI1Nl9tdWxfbW9udAorCisucDJhbGlnbgk1CitfZWNwX25pc3R6MjU2X211bF9tb250OgorCisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXJjeAorCW1vdnEJOCglcmN4KSwlcmN4CisJYW5kbAkkMHg4MDEwMCwlZWN4CitMJG11bF9tb250OgorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworTCRtdWxfYm9keToKKwljbXBsCSQweDgwMTAwLCVlY3gKKwlqZQlMJG11bF9tb250eAorCW1vdnEJJXJkeCwlcmJ4CisJbW92cQkwKCVyZHgpLCVyYXgKKwltb3ZxCTAoJXJzaSksJXI5CisJbW92cQk4KCVyc2kpLCVyMTAKKwltb3ZxCTE2KCVyc2kpLCVyMTEKKwltb3ZxCTI0KCVyc2kpLCVyMTIKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisJam1wCUwkbXVsX21vbnRfZG9uZQorCisucDJhbGlnbgk1CitMJG11bF9tb250eDoKKwltb3ZxCSVyZHgsJXJieAorCW1vdnEJMCglcmR4KSwlcmR4CisJbW92cQkwKCVyc2kpLCVyOQorCW1vdnEJOCglcnNpKSwlcjEwCisJbW92cQkxNiglcnNpKSwlcjExCisJbW92cQkyNCglcnNpKSwlcjEyCisJbGVhcQktMTI4KCVyc2kpLCVyc2kKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CitMJG11bF9tb250X2RvbmU6CisJbW92cQkwKCVyc3ApLCVyMTUKKworCW1vdnEJOCglcnNwKSwlcjE0CisKKwltb3ZxCTE2KCVyc3ApLCVyMTMKKworCW1vdnEJMjQoJXJzcCksJXIxMgorCisJbW92cQkzMiglcnNwKSwlcmJ4CisKKwltb3ZxCTQwKCVyc3ApLCVyYnAKKworCWxlYXEJNDgoJXJzcCksJXJzcAorCitMJG11bF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworLnAyYWxpZ24JNQorX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxOgorCisKKwltb3ZxCSVyYXgsJXJicAorCW11bHEJJXI5CisJbW92cQlMJHBvbHkrOCglcmlwKSwlcjE0CisJbW92cQklcmF4LCVyOAorCW1vdnEJJXJicCwlcmF4CisJbW92cQklcmR4LCVyOQorCisJbXVscQklcjEwCisJbW92cQlMJHBvbHkrMjQoJXJpcCksJXIxNQorCWFkZHEJJXJheCwlcjkKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyMTEKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJicCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXIxMgorCWFkZHEJJXJheCwlcjExCisJbW92cQklcjgsJXJheAorCWFkY3EJJDAsJXJkeAorCXhvcnEJJXIxMywlcjEzCisJbW92cQklcmR4LCVyMTIKKworCisKKworCisKKworCisKKworCW1vdnEJJXI4LCVyYnAKKwlzaGxxCSQzMiwlcjgKKwltdWxxCSVyMTUKKwlzaHJxCSQzMiwlcmJwCisJYWRkcQklcjgsJXI5CisJYWRjcQklcmJwLCVyMTAKKwlhZGNxCSVyYXgsJXIxMQorCW1vdnEJOCglcmJ4KSwlcmF4CisJYWRjcQklcmR4LCVyMTIKKwlhZGNxCSQwLCVyMTMKKwl4b3JxCSVyOCwlcjgKKworCisKKwltb3ZxCSVyYXgsJXJicAorCW11bHEJMCglcnNpKQorCWFkZHEJJXJheCwlcjkKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCTgoJXJzaSkKKwlhZGRxCSVyY3gsJXIxMAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQkxNiglcnNpKQorCWFkZHEJJXJjeCwlcjExCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCTI0KCVyc2kpCisJYWRkcQklcmN4LCVyMTIKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJJXI5LCVyYXgKKwlhZGNxCSVyZHgsJXIxMworCWFkY3EJJDAsJXI4CisKKworCisJbW92cQklcjksJXJicAorCXNobHEJJDMyLCVyOQorCW11bHEJJXIxNQorCXNocnEJJDMyLCVyYnAKKwlhZGRxCSVyOSwlcjEwCisJYWRjcQklcmJwLCVyMTEKKwlhZGNxCSVyYXgsJXIxMgorCW1vdnEJMTYoJXJieCksJXJheAorCWFkY3EJJXJkeCwlcjEzCisJYWRjcQkkMCwlcjgKKwl4b3JxCSVyOSwlcjkKKworCisKKwltb3ZxCSVyYXgsJXJicAorCW11bHEJMCglcnNpKQorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQk4KCVyc2kpCisJYWRkcQklcmN4LCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJicCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyY3gKKworCW11bHEJMTYoJXJzaSkKKwlhZGRxCSVyY3gsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQkyNCglcnNpKQorCWFkZHEJJXJjeCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSVyMTAsJXJheAorCWFkY3EJJXJkeCwlcjgKKwlhZGNxCSQwLCVyOQorCisKKworCW1vdnEJJXIxMCwlcmJwCisJc2hscQkkMzIsJXIxMAorCW11bHEJJXIxNQorCXNocnEJJDMyLCVyYnAKKwlhZGRxCSVyMTAsJXIxMQorCWFkY3EJJXJicCwlcjEyCisJYWRjcQklcmF4LCVyMTMKKwltb3ZxCTI0KCVyYngpLCVyYXgKKwlhZGNxCSVyZHgsJXI4CisJYWRjcQkkMCwlcjkKKwl4b3JxCSVyMTAsJXIxMAorCisKKworCW1vdnEJJXJheCwlcmJwCisJbXVscQkwKCVyc2kpCisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCTgoJXJzaSkKKwlhZGRxCSVyY3gsJXIxMgorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcmJwLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQkxNiglcnNpKQorCWFkZHEJJXJjeCwlcjEzCisJYWRjcQkkMCwlcmR4CisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSVyYnAsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCTI0KCVyc2kpCisJYWRkcQklcmN4LCVyOAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJheCwlcjgKKwltb3ZxCSVyMTEsJXJheAorCWFkY3EJJXJkeCwlcjkKKwlhZGNxCSQwLCVyMTAKKworCisKKwltb3ZxCSVyMTEsJXJicAorCXNobHEJJDMyLCVyMTEKKwltdWxxCSVyMTUKKwlzaHJxCSQzMiwlcmJwCisJYWRkcQklcjExLCVyMTIKKwlhZGNxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwlcmN4CisJYWRjcQklcmF4LCVyOAorCWFkY3EJJXJkeCwlcjkKKwltb3ZxCSVyMTMsJXJicAorCWFkY3EJJDAsJXIxMAorCisKKworCXN1YnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmJ4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyZHgKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjEwCisKKwljbW92Y3EJJXJjeCwlcjEyCisJY21vdmNxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwwKCVyZGkpCisJY21vdmNxCSVyYngsJXI4CisJbW92cQklcjEzLDgoJXJkaSkKKwljbW92Y3EJJXJkeCwlcjkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworCisKKworCisKKy5nbG9ibAlfZWNwX25pc3R6MjU2X3Nxcl9tb250CisucHJpdmF0ZV9leHRlcm4gX2VjcF9uaXN0ejI1Nl9zcXJfbW9udAorCisucDJhbGlnbgk1CitfZWNwX25pc3R6MjU2X3Nxcl9tb250OgorCisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXJjeAorCW1vdnEJOCglcmN4KSwlcmN4CisJYW5kbAkkMHg4MDEwMCwlZWN4CisJcHVzaHEJJXJicAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCitMJHNxcl9ib2R5OgorCWNtcGwJJDB4ODAxMDAsJWVjeAorCWplCUwkc3FyX21vbnR4CisJbW92cQkwKCVyc2kpLCVyYXgKKwltb3ZxCTgoJXJzaSksJXIxNAorCW1vdnEJMTYoJXJzaSksJXIxNQorCW1vdnEJMjQoJXJzaSksJXI4CisKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCWptcAlMJHNxcl9tb250X2RvbmUKKworLnAyYWxpZ24JNQorTCRzcXJfbW9udHg6CisJbW92cQkwKCVyc2kpLCVyZHgKKwltb3ZxCTgoJXJzaSksJXIxNAorCW1vdnEJMTYoJXJzaSksJXIxNQorCW1vdnEJMjQoJXJzaSksJXI4CisJbGVhcQktMTI4KCVyc2kpLCVyc2kKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CitMJHNxcl9tb250X2RvbmU6CisJbW92cQkwKCVyc3ApLCVyMTUKKworCW1vdnEJOCglcnNwKSwlcjE0CisKKwltb3ZxCTE2KCVyc3ApLCVyMTMKKworCW1vdnEJMjQoJXJzcCksJXIxMgorCisJbW92cQkzMiglcnNwKSwlcmJ4CisKKwltb3ZxCTQwKCVyc3ApLCVyYnAKKworCWxlYXEJNDgoJXJzcCksJXJzcAorCitMJHNxcl9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworLnAyYWxpZ24JNQorX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxOgorCW1vdnEJJXJheCwlcjEzCisJbXVscQklcjE0CisJbW92cQklcmF4LCVyOQorCW1vdnEJJXIxNSwlcmF4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXIxMworCWFkZHEJJXJheCwlcjEwCisJbW92cQklcjgsJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyMTMKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXIxNSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTIKKworCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyOCwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyYnAKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcjgsJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXJicCwlcjEyCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCisJbXVscQklcjE1CisJeG9ycQklcjE1LCVyMTUKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJMCglcnNpKSwlcmF4CisJbW92cQklcmR4LCVyMTQKKwlhZGNxCSQwLCVyMTQKKworCWFkZHEJJXI5LCVyOQorCWFkY3EJJXIxMCwlcjEwCisJYWRjcQklcjExLCVyMTEKKwlhZGNxCSVyMTIsJXIxMgorCWFkY3EJJXIxMywlcjEzCisJYWRjcQklcjE0LCVyMTQKKwlhZGNxCSQwLCVyMTUKKworCW11bHEJJXJheAorCW1vdnEJJXJheCwlcjgKKwltb3ZxCTgoJXJzaSksJXJheAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCSVyYXgKKwlhZGRxCSVyY3gsJXI5CisJYWRjcQklcmF4LCVyMTAKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXJjeAorCisJbXVscQklcmF4CisJYWRkcQklcmN4LCVyMTEKKwlhZGNxCSVyYXgsJXIxMgorCW1vdnEJMjQoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmN4CisKKwltdWxxCSVyYXgKKwlhZGRxCSVyY3gsJXIxMworCWFkY3EJJXJheCwlcjE0CisJbW92cQklcjgsJXJheAorCWFkY3EJJXJkeCwlcjE1CisKKwltb3ZxCUwkcG9seSs4KCVyaXApLCVyc2kKKwltb3ZxCUwkcG9seSsyNCglcmlwKSwlcmJwCisKKworCisKKwltb3ZxCSVyOCwlcmN4CisJc2hscQkkMzIsJXI4CisJbXVscQklcmJwCisJc2hycQkkMzIsJXJjeAorCWFkZHEJJXI4LCVyOQorCWFkY3EJJXJjeCwlcjEwCisJYWRjcQklcmF4LCVyMTEKKwltb3ZxCSVyOSwlcmF4CisJYWRjcQkkMCwlcmR4CisKKworCisJbW92cQklcjksJXJjeAorCXNobHEJJDMyLCVyOQorCW1vdnEJJXJkeCwlcjgKKwltdWxxCSVyYnAKKwlzaHJxCSQzMiwlcmN4CisJYWRkcQklcjksJXIxMAorCWFkY3EJJXJjeCwlcjExCisJYWRjcQklcmF4LCVyOAorCW1vdnEJJXIxMCwlcmF4CisJYWRjcQkkMCwlcmR4CisKKworCisJbW92cQklcjEwLCVyY3gKKwlzaGxxCSQzMiwlcjEwCisJbW92cQklcmR4LCVyOQorCW11bHEJJXJicAorCXNocnEJJDMyLCVyY3gKKwlhZGRxCSVyMTAsJXIxMQorCWFkY3EJJXJjeCwlcjgKKwlhZGNxCSVyYXgsJXI5CisJbW92cQklcjExLCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCisKKwltb3ZxCSVyMTEsJXJjeAorCXNobHEJJDMyLCVyMTEKKwltb3ZxCSVyZHgsJXIxMAorCW11bHEJJXJicAorCXNocnEJJDMyLCVyY3gKKwlhZGRxCSVyMTEsJXI4CisJYWRjcQklcmN4LCVyOQorCWFkY3EJJXJheCwlcjEwCisJYWRjcQkkMCwlcmR4CisJeG9ycQklcjExLCVyMTEKKworCisKKwlhZGRxCSVyOCwlcjEyCisJYWRjcQklcjksJXIxMworCW1vdnEJJXIxMiwlcjgKKwlhZGNxCSVyMTAsJXIxNAorCWFkY3EJJXJkeCwlcjE1CisJbW92cQklcjEzLCVyOQorCWFkY3EJJDAsJXIxMQorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXIxNCwlcjEwCisJc2JicQklcnNpLCVyMTMKKwlzYmJxCSQwLCVyMTQKKwltb3ZxCSVyMTUsJXJjeAorCXNiYnEJJXJicCwlcjE1CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXI4LCVyMTIKKwljbW92Y3EJJXI5LCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcjEwLCVyMTQKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZjcQklcmN4LCVyMTUKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTUKK19fZWNwX25pc3R6MjU2X211bF9tb250eDoKKworCisJbXVseHEJJXI5LCVyOCwlcjkKKwltdWx4cQklcjEwLCVyY3gsJXIxMAorCW1vdnEJJDMyLCVyMTQKKwl4b3JxCSVyMTMsJXIxMworCW11bHhxCSVyMTEsJXJicCwlcjExCisJbW92cQlMJHBvbHkrMjQoJXJpcCksJXIxNQorCWFkY3EJJXJjeCwlcjkKKwltdWx4cQklcjEyLCVyY3gsJXIxMgorCW1vdnEJJXI4LCVyZHgKKwlhZGNxCSVyYnAsJXIxMAorCXNobHhxCSVyMTQsJXI4LCVyYnAKKwlhZGNxCSVyY3gsJXIxMQorCXNocnhxCSVyMTQsJXI4LCVyY3gKKwlhZGNxCSQwLCVyMTIKKworCisKKwlhZGRxCSVyYnAsJXI5CisJYWRjcQklcmN4LCVyMTAKKworCW11bHhxCSVyMTUsJXJjeCwlcmJwCisJbW92cQk4KCVyYngpLCVyZHgKKwlhZGNxCSVyY3gsJXIxMQorCWFkY3EJJXJicCwlcjEyCisJYWRjcQkkMCwlcjEzCisJeG9ycQklcjgsJXI4CisKKworCisJbXVseHEJMCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjkKKwlhZG94cQklcmJwLCVyMTAKKworCW11bHhxCTgrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJMTYrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMQorCWFkb3hxCSVyYnAsJXIxMgorCisJbXVseHEJMjQrMTI4KCVyc2kpLCVyY3gsJXJicAorCW1vdnEJJXI5LCVyZHgKKwlhZGN4cQklcmN4LCVyMTIKKwlzaGx4cQklcjE0LCVyOSwlcmN4CisJYWRveHEJJXJicCwlcjEzCisJc2hyeHEJJXIxNCwlcjksJXJicAorCisJYWRjeHEJJXI4LCVyMTMKKwlhZG94cQklcjgsJXI4CisJYWRjcQkkMCwlcjgKKworCisKKwlhZGRxCSVyY3gsJXIxMAorCWFkY3EJJXJicCwlcjExCisKKwltdWx4cQklcjE1LCVyY3gsJXJicAorCW1vdnEJMTYoJXJieCksJXJkeAorCWFkY3EJJXJjeCwlcjEyCisJYWRjcQklcmJwLCVyMTMKKwlhZGNxCSQwLCVyOAorCXhvcnEJJXI5LCVyOQorCisKKworCW11bHhxCTArMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMAorCWFkb3hxCSVyYnAsJXIxMQorCisJbXVseHEJOCsxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQkxNisxMjgoJXJzaSksJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjEyCisJYWRveHEJJXJicCwlcjEzCisKKwltdWx4cQkyNCsxMjgoJXJzaSksJXJjeCwlcmJwCisJbW92cQklcjEwLCVyZHgKKwlhZGN4cQklcmN4LCVyMTMKKwlzaGx4cQklcjE0LCVyMTAsJXJjeAorCWFkb3hxCSVyYnAsJXI4CisJc2hyeHEJJXIxNCwlcjEwLCVyYnAKKworCWFkY3hxCSVyOSwlcjgKKwlhZG94cQklcjksJXI5CisJYWRjcQkkMCwlcjkKKworCisKKwlhZGRxCSVyY3gsJXIxMQorCWFkY3EJJXJicCwlcjEyCisKKwltdWx4cQklcjE1LCVyY3gsJXJicAorCW1vdnEJMjQoJXJieCksJXJkeAorCWFkY3EJJXJjeCwlcjEzCisJYWRjcQklcmJwLCVyOAorCWFkY3EJJDAsJXI5CisJeG9ycQklcjEwLCVyMTAKKworCisKKwltdWx4cQkwKzEyOCglcnNpKSwlcmN4LCVyYnAKKwlhZGN4cQklcmN4LCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKworCW11bHhxCTgrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMgorCWFkb3hxCSVyYnAsJXIxMworCisJbXVseHEJMTYrMTI4KCVyc2kpLCVyY3gsJXJicAorCWFkY3hxCSVyY3gsJXIxMworCWFkb3hxCSVyYnAsJXI4CisKKwltdWx4cQkyNCsxMjgoJXJzaSksJXJjeCwlcmJwCisJbW92cQklcjExLCVyZHgKKwlhZGN4cQklcmN4LCVyOAorCXNobHhxCSVyMTQsJXIxMSwlcmN4CisJYWRveHEJJXJicCwlcjkKKwlzaHJ4cQklcjE0LCVyMTEsJXJicAorCisJYWRjeHEJJXIxMCwlcjkKKwlhZG94cQklcjEwLCVyMTAKKwlhZGNxCSQwLCVyMTAKKworCisKKwlhZGRxCSVyY3gsJXIxMgorCWFkY3EJJXJicCwlcjEzCisKKwltdWx4cQklcjE1LCVyY3gsJXJicAorCW1vdnEJJXIxMiwlcmJ4CisJbW92cQlMJHBvbHkrOCglcmlwKSwlcjE0CisJYWRjcQklcmN4LCVyOAorCW1vdnEJJXIxMywlcmR4CisJYWRjcQklcmJwLCVyOQorCWFkY3EJJDAsJXIxMAorCisKKworCXhvcmwJJWVheCwlZWF4CisJbW92cQklcjgsJXJjeAorCXNiYnEJJC0xLCVyMTIKKwlzYmJxCSVyMTQsJXIxMworCXNiYnEJJDAsJXI4CisJbW92cQklcjksJXJicAorCXNiYnEJJXIxNSwlcjkKKwlzYmJxCSQwLCVyMTAKKworCWNtb3ZjcQklcmJ4LCVyMTIKKwljbW92Y3EJJXJkeCwlcjEzCisJbW92cQklcjEyLDAoJXJkaSkKKwljbW92Y3EJJXJjeCwlcjgKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZjcQklcmJwLCVyOQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4OgorCW11bHhxCSVyMTQsJXI5LCVyMTAKKwltdWx4cQklcjE1LCVyY3gsJXIxMQorCXhvcmwJJWVheCwlZWF4CisJYWRjcQklcmN4LCVyMTAKKwltdWx4cQklcjgsJXJicCwlcjEyCisJbW92cQklcjE0LCVyZHgKKwlhZGNxCSVyYnAsJXIxMQorCWFkY3EJJDAsJXIxMgorCXhvcnEJJXIxMywlcjEzCisKKworCW11bHhxCSVyMTUsJXJjeCwlcmJwCisJYWRjeHEJJXJjeCwlcjExCisJYWRveHEJJXJicCwlcjEyCisKKwltdWx4cQklcjgsJXJjeCwlcmJwCisJbW92cQklcjE1LCVyZHgKKwlhZGN4cQklcmN4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCisJbXVseHEJJXI4LCVyY3gsJXIxNAorCW1vdnEJMCsxMjgoJXJzaSksJXJkeAorCXhvcnEJJXIxNSwlcjE1CisJYWRjeHEJJXI5LCVyOQorCWFkb3hxCSVyY3gsJXIxMworCWFkY3hxCSVyMTAsJXIxMAorCWFkb3hxCSVyMTUsJXIxNAorCisJbXVseHEJJXJkeCwlcjgsJXJicAorCW1vdnEJOCsxMjgoJXJzaSksJXJkeAorCWFkY3hxCSVyMTEsJXIxMQorCWFkb3hxCSVyYnAsJXI5CisJYWRjeHEJJXIxMiwlcjEyCisJbXVseHEJJXJkeCwlcmN4LCVyYXgKKwltb3ZxCTE2KzEyOCglcnNpKSwlcmR4CisJYWRjeHEJJXIxMywlcjEzCisJYWRveHEJJXJjeCwlcjEwCisJYWRjeHEJJXIxNCwlcjE0CisuYnl0ZQkweDY3CisJbXVseHEJJXJkeCwlcmN4LCVyYnAKKwltb3ZxCTI0KzEyOCglcnNpKSwlcmR4CisJYWRveHEJJXJheCwlcjExCisJYWRjeHEJJXIxNSwlcjE1CisJYWRveHEJJXJjeCwlcjEyCisJbW92cQkkMzIsJXJzaQorCWFkb3hxCSVyYnAsJXIxMworLmJ5dGUJMHg2NywweDY3CisJbXVseHEJJXJkeCwlcmN4LCVyYXgKKwltb3ZxCUwkcG9seSsyNCglcmlwKSwlcmR4CisJYWRveHEJJXJjeCwlcjE0CisJc2hseHEJJXJzaSwlcjgsJXJjeAorCWFkb3hxCSVyYXgsJXIxNQorCXNocnhxCSVyc2ksJXI4LCVyYXgKKwltb3ZxCSVyZHgsJXJicAorCisKKwlhZGRxCSVyY3gsJXI5CisJYWRjcQklcmF4LCVyMTAKKworCW11bHhxCSVyOCwlcmN4LCVyOAorCWFkY3EJJXJjeCwlcjExCisJc2hseHEJJXJzaSwlcjksJXJjeAorCWFkY3EJJDAsJXI4CisJc2hyeHEJJXJzaSwlcjksJXJheAorCisKKwlhZGRxCSVyY3gsJXIxMAorCWFkY3EJJXJheCwlcjExCisKKwltdWx4cQklcjksJXJjeCwlcjkKKwlhZGNxCSVyY3gsJXI4CisJc2hseHEJJXJzaSwlcjEwLCVyY3gKKwlhZGNxCSQwLCVyOQorCXNocnhxCSVyc2ksJXIxMCwlcmF4CisKKworCWFkZHEJJXJjeCwlcjExCisJYWRjcQklcmF4LCVyOAorCisJbXVseHEJJXIxMCwlcmN4LCVyMTAKKwlhZGNxCSVyY3gsJXI5CisJc2hseHEJJXJzaSwlcjExLCVyY3gKKwlhZGNxCSQwLCVyMTAKKwlzaHJ4cQklcnNpLCVyMTEsJXJheAorCisKKwlhZGRxCSVyY3gsJXI4CisJYWRjcQklcmF4LCVyOQorCisJbXVseHEJJXIxMSwlcmN4LCVyMTEKKwlhZGNxCSVyY3gsJXIxMAorCWFkY3EJJDAsJXIxMQorCisJeG9ycQklcmR4LCVyZHgKKwlhZGRxCSVyOCwlcjEyCisJbW92cQlMJHBvbHkrOCglcmlwKSwlcnNpCisJYWRjcQklcjksJXIxMworCW1vdnEJJXIxMiwlcjgKKwlhZGNxCSVyMTAsJXIxNAorCWFkY3EJJXIxMSwlcjE1CisJbW92cQklcjEzLCVyOQorCWFkY3EJJDAsJXJkeAorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXIxNCwlcjEwCisJc2JicQklcnNpLCVyMTMKKwlzYmJxCSQwLCVyMTQKKwltb3ZxCSVyMTUsJXIxMQorCXNiYnEJJXJicCwlcjE1CisJc2JicQkkMCwlcmR4CisKKwljbW92Y3EJJXI4LCVyMTIKKwljbW92Y3EJJXI5LCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcjEwLCVyMTQKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZjcQklcjExLCVyMTUKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKworLmdsb2JsCV9lY3BfbmlzdHoyNTZfc2VsZWN0X3c1CisucHJpdmF0ZV9leHRlcm4gX2VjcF9uaXN0ejI1Nl9zZWxlY3RfdzUKKworLnAyYWxpZ24JNQorX2VjcF9uaXN0ejI1Nl9zZWxlY3RfdzU6CisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXJheAorCW1vdnEJOCglcmF4KSwlcmF4CisJdGVzdGwJJDMyLCVlYXgKKwlqbnoJTCRhdngyX3NlbGVjdF93NQorCW1vdmRxYQlMJE9uZSglcmlwKSwleG1tMAorCW1vdmQJJWVkeCwleG1tMQorCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisKKwltb3ZkcWEJJXhtbTAsJXhtbTgKKwlwc2h1ZmQJJDAsJXhtbTEsJXhtbTEKKworCW1vdnEJJDE2LCVyYXgKK0wkc2VsZWN0X2xvb3Bfc3NlX3c1OgorCisJbW92ZHFhCSV4bW04LCV4bW0xNQorCXBhZGRkCSV4bW0wLCV4bW04CisJcGNtcGVxZAkleG1tMSwleG1tMTUKKworCW1vdmRxYQkwKCVyc2kpLCV4bW05CisJbW92ZHFhCTE2KCVyc2kpLCV4bW0xMAorCW1vdmRxYQkzMiglcnNpKSwleG1tMTEKKwltb3ZkcWEJNDgoJXJzaSksJXhtbTEyCisJbW92ZHFhCTY0KCVyc2kpLCV4bW0xMworCW1vdmRxYQk4MCglcnNpKSwleG1tMTQKKwlsZWFxCTk2KCVyc2kpLCVyc2kKKworCXBhbmQJJXhtbTE1LCV4bW05CisJcGFuZAkleG1tMTUsJXhtbTEwCisJcG9yCSV4bW05LCV4bW0yCisJcGFuZAkleG1tMTUsJXhtbTExCisJcG9yCSV4bW0xMCwleG1tMworCXBhbmQJJXhtbTE1LCV4bW0xMgorCXBvcgkleG1tMTEsJXhtbTQKKwlwYW5kCSV4bW0xNSwleG1tMTMKKwlwb3IJJXhtbTEyLCV4bW01CisJcGFuZAkleG1tMTUsJXhtbTE0CisJcG9yCSV4bW0xMywleG1tNgorCXBvcgkleG1tMTQsJXhtbTcKKworCWRlY3EJJXJheAorCWpueglMJHNlbGVjdF9sb29wX3NzZV93NQorCisJbW92ZHF1CSV4bW0yLDAoJXJkaSkKKwltb3ZkcXUJJXhtbTMsMTYoJXJkaSkKKwltb3ZkcXUJJXhtbTQsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTUsNDgoJXJkaSkKKwltb3ZkcXUJJXhtbTYsNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTcsODAoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKK0wkU0VIX2VuZF9lY3BfbmlzdHoyNTZfc2VsZWN0X3c1OgorCisKKworCisuZ2xvYmwJX2VjcF9uaXN0ejI1Nl9zZWxlY3RfdzcKKy5wcml2YXRlX2V4dGVybiBfZWNwX25pc3R6MjU2X3NlbGVjdF93NworCisucDJhbGlnbgk1CitfZWNwX25pc3R6MjU2X3NlbGVjdF93NzoKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmF4CisJbW92cQk4KCVyYXgpLCVyYXgKKwl0ZXN0bAkkMzIsJWVheAorCWpueglMJGF2eDJfc2VsZWN0X3c3CisJbW92ZHFhCUwkT25lKCVyaXApLCV4bW04CisJbW92ZAklZWR4LCV4bW0xCisKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisKKwltb3ZkcWEJJXhtbTgsJXhtbTAKKwlwc2h1ZmQJJDAsJXhtbTEsJXhtbTEKKwltb3ZxCSQ2NCwlcmF4CisKK0wkc2VsZWN0X2xvb3Bfc3NlX3c3OgorCW1vdmRxYQkleG1tOCwleG1tMTUKKwlwYWRkZAkleG1tMCwleG1tOAorCW1vdmRxYQkwKCVyc2kpLCV4bW05CisJbW92ZHFhCTE2KCVyc2kpLCV4bW0xMAorCXBjbXBlcWQJJXhtbTEsJXhtbTE1CisJbW92ZHFhCTMyKCVyc2kpLCV4bW0xMQorCW1vdmRxYQk0OCglcnNpKSwleG1tMTIKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKworCXBhbmQJJXhtbTE1LCV4bW05CisJcGFuZAkleG1tMTUsJXhtbTEwCisJcG9yCSV4bW05LCV4bW0yCisJcGFuZAkleG1tMTUsJXhtbTExCisJcG9yCSV4bW0xMCwleG1tMworCXBhbmQJJXhtbTE1LCV4bW0xMgorCXBvcgkleG1tMTEsJXhtbTQKKwlwcmVmZXRjaHQwCTI1NSglcnNpKQorCXBvcgkleG1tMTIsJXhtbTUKKworCWRlY3EJJXJheAorCWpueglMJHNlbGVjdF9sb29wX3NzZV93NworCisJbW92ZHF1CSV4bW0yLDAoJXJkaSkKKwltb3ZkcXUJJXhtbTMsMTYoJXJkaSkKKwltb3ZkcXUJJXhtbTQsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTUsNDgoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKK0wkU0VIX2VuZF9lY3BfbmlzdHoyNTZfc2VsZWN0X3c3OgorCisKKworCisucDJhbGlnbgk1CitlY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzU6CitMJGF2eDJfc2VsZWN0X3c1OgorCXZ6ZXJvdXBwZXIKKwl2bW92ZHFhCUwkVHdvKCVyaXApLCV5bW0wCisKKwl2cHhvcgkleW1tMiwleW1tMiwleW1tMgorCXZweG9yCSV5bW0zLCV5bW0zLCV5bW0zCisJdnB4b3IJJXltbTQsJXltbTQsJXltbTQKKworCXZtb3ZkcWEJTCRPbmUoJXJpcCksJXltbTUKKwl2bW92ZHFhCUwkVHdvKCVyaXApLCV5bW0xMAorCisJdm1vdmQJJWVkeCwleG1tMQorCXZwZXJtZAkleW1tMSwleW1tMiwleW1tMQorCisJbW92cQkkOCwlcmF4CitMJHNlbGVjdF9sb29wX2F2eDJfdzU6CisKKwl2bW92ZHFhCTAoJXJzaSksJXltbTYKKwl2bW92ZHFhCTMyKCVyc2kpLCV5bW03CisJdm1vdmRxYQk2NCglcnNpKSwleW1tOAorCisJdm1vdmRxYQk5NiglcnNpKSwleW1tMTEKKwl2bW92ZHFhCTEyOCglcnNpKSwleW1tMTIKKwl2bW92ZHFhCTE2MCglcnNpKSwleW1tMTMKKworCXZwY21wZXFkCSV5bW0xLCV5bW01LCV5bW05CisJdnBjbXBlcWQJJXltbTEsJXltbTEwLCV5bW0xNAorCisJdnBhZGRkCSV5bW0wLCV5bW01LCV5bW01CisJdnBhZGRkCSV5bW0wLCV5bW0xMCwleW1tMTAKKwlsZWFxCTE5MiglcnNpKSwlcnNpCisKKwl2cGFuZAkleW1tOSwleW1tNiwleW1tNgorCXZwYW5kCSV5bW05LCV5bW03LCV5bW03CisJdnBhbmQJJXltbTksJXltbTgsJXltbTgKKwl2cGFuZAkleW1tMTQsJXltbTExLCV5bW0xMQorCXZwYW5kCSV5bW0xNCwleW1tMTIsJXltbTEyCisJdnBhbmQJJXltbTE0LCV5bW0xMywleW1tMTMKKworCXZweG9yCSV5bW02LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTcsJXltbTMsJXltbTMKKwl2cHhvcgkleW1tOCwleW1tNCwleW1tNAorCXZweG9yCSV5bW0xMSwleW1tMiwleW1tMgorCXZweG9yCSV5bW0xMiwleW1tMywleW1tMworCXZweG9yCSV5bW0xMywleW1tNCwleW1tNAorCisJZGVjcQklcmF4CisJam56CUwkc2VsZWN0X2xvb3BfYXZ4Ml93NQorCisJdm1vdmRxdQkleW1tMiwwKCVyZGkpCisJdm1vdmRxdQkleW1tMywzMiglcmRpKQorCXZtb3ZkcXUJJXltbTQsNjQoJXJkaSkKKwl2emVyb3VwcGVyCisJLmJ5dGUJMHhmMywweGMzCitMJFNFSF9lbmRfZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3c1OgorCisKKworCisuZ2xvYmwJX2VjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NworLnByaXZhdGVfZXh0ZXJuIF9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzcKKworLnAyYWxpZ24JNQorX2VjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NzoKK0wkYXZ4Ml9zZWxlY3Rfdzc6CisJdnplcm91cHBlcgorCXZtb3ZkcWEJTCRUaHJlZSglcmlwKSwleW1tMAorCisJdnB4b3IJJXltbTIsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tMywleW1tMywleW1tMworCisJdm1vdmRxYQlMJE9uZSglcmlwKSwleW1tNAorCXZtb3ZkcWEJTCRUd28oJXJpcCksJXltbTgKKwl2bW92ZHFhCUwkVGhyZWUoJXJpcCksJXltbTEyCisKKwl2bW92ZAklZWR4LCV4bW0xCisJdnBlcm1kCSV5bW0xLCV5bW0yLCV5bW0xCisKKworCW1vdnEJJDIxLCVyYXgKK0wkc2VsZWN0X2xvb3BfYXZ4Ml93NzoKKworCXZtb3ZkcWEJMCglcnNpKSwleW1tNQorCXZtb3ZkcWEJMzIoJXJzaSksJXltbTYKKworCXZtb3ZkcWEJNjQoJXJzaSksJXltbTkKKwl2bW92ZHFhCTk2KCVyc2kpLCV5bW0xMAorCisJdm1vdmRxYQkxMjgoJXJzaSksJXltbTEzCisJdm1vdmRxYQkxNjAoJXJzaSksJXltbTE0CisKKwl2cGNtcGVxZAkleW1tMSwleW1tNCwleW1tNworCXZwY21wZXFkCSV5bW0xLCV5bW04LCV5bW0xMQorCXZwY21wZXFkCSV5bW0xLCV5bW0xMiwleW1tMTUKKworCXZwYWRkZAkleW1tMCwleW1tNCwleW1tNAorCXZwYWRkZAkleW1tMCwleW1tOCwleW1tOAorCXZwYWRkZAkleW1tMCwleW1tMTIsJXltbTEyCisJbGVhcQkxOTIoJXJzaSksJXJzaQorCisJdnBhbmQJJXltbTcsJXltbTUsJXltbTUKKwl2cGFuZAkleW1tNywleW1tNiwleW1tNgorCXZwYW5kCSV5bW0xMSwleW1tOSwleW1tOQorCXZwYW5kCSV5bW0xMSwleW1tMTAsJXltbTEwCisJdnBhbmQJJXltbTE1LCV5bW0xMywleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTE0LCV5bW0xNAorCisJdnB4b3IJJXltbTUsJXltbTIsJXltbTIKKwl2cHhvcgkleW1tNiwleW1tMywleW1tMworCXZweG9yCSV5bW05LCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTEwLCV5bW0zLCV5bW0zCisJdnB4b3IJJXltbTEzLCV5bW0yLCV5bW0yCisJdnB4b3IJJXltbTE0LCV5bW0zLCV5bW0zCisKKwlkZWNxCSVyYXgKKwlqbnoJTCRzZWxlY3RfbG9vcF9hdngyX3c3CisKKworCXZtb3ZkcWEJMCglcnNpKSwleW1tNQorCXZtb3ZkcWEJMzIoJXJzaSksJXltbTYKKworCXZwY21wZXFkCSV5bW0xLCV5bW00LCV5bW03CisKKwl2cGFuZAkleW1tNywleW1tNSwleW1tNQorCXZwYW5kCSV5bW03LCV5bW02LCV5bW02CisKKwl2cHhvcgkleW1tNSwleW1tMiwleW1tMgorCXZweG9yCSV5bW02LCV5bW0zLCV5bW0zCisKKwl2bW92ZHF1CSV5bW0yLDAoJXJkaSkKKwl2bW92ZHF1CSV5bW0zLDMyKCVyZGkpCisJdnplcm91cHBlcgorCS5ieXRlCTB4ZjMsMHhjMworTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NzoKKworCisucDJhbGlnbgk1CitfX2VjcF9uaXN0ejI1Nl9hZGRfdG9xOgorCXhvcnEJJXIxMSwlcjExCisJYWRkcQkwKCVyYngpLCVyMTIKKwlhZGNxCTgoJXJieCksJXIxMworCW1vdnEJJXIxMiwlcmF4CisJYWRjcQkxNiglcmJ4KSwlcjgKKwlhZGNxCTI0KCVyYngpLCVyOQorCW1vdnEJJXIxMywlcmJwCisJYWRjcQkkMCwlcjExCisKKwlzdWJxCSQtMSwlcjEyCisJbW92cQklcjgsJXJjeAorCXNiYnEJJXIxNCwlcjEzCisJc2JicQkkMCwlcjgKKwltb3ZxCSVyOSwlcjEwCisJc2JicQklcjE1LCVyOQorCXNiYnEJJDAsJXIxMQorCisJY21vdmNxCSVyYXgsJXIxMgorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcmN4LCVyOAorCW1vdnEJJXIxMyw4KCVyZGkpCisJY21vdmNxCSVyMTAsJXI5CisJbW92cQklcjgsMTYoJXJkaSkKKwltb3ZxCSVyOSwyNCglcmRpKQorCisJLmJ5dGUJMHhmMywweGMzCisKKworCisucDJhbGlnbgk1CitfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXE6CisJc3VicQkwKCVyYngpLCVyMTIKKwlzYmJxCTgoJXJieCksJXIxMworCW1vdnEJJXIxMiwlcmF4CisJc2JicQkxNiglcmJ4KSwlcjgKKwlzYmJxCTI0KCVyYngpLCVyOQorCW1vdnEJJXIxMywlcmJwCisJc2JicQklcjExLCVyMTEKKworCWFkZHEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJYWRjcQklcjE0LCVyMTMKKwlhZGNxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlhZGNxCSVyMTUsJXI5CisJdGVzdHEJJXIxMSwlcjExCisKKwljbW92enEJJXJheCwlcjEyCisJY21vdnpxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwwKCVyZGkpCisJY21vdnpxCSVyY3gsJXI4CisJbW92cQklcjEzLDgoJXJkaSkKKwljbW92enEJJXIxMCwlcjkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTUKK19fZWNwX25pc3R6MjU2X3N1YnE6CisJc3VicQklcjEyLCVyYXgKKwlzYmJxCSVyMTMsJXJicAorCW1vdnEJJXJheCwlcjEyCisJc2JicQklcjgsJXJjeAorCXNiYnEJJXI5LCVyMTAKKwltb3ZxCSVyYnAsJXIxMworCXNiYnEJJXIxMSwlcjExCisKKwlhZGRxCSQtMSwlcmF4CisJbW92cQklcmN4LCVyOAorCWFkY3EJJXIxNCwlcmJwCisJYWRjcQkkMCwlcmN4CisJbW92cQklcjEwLCVyOQorCWFkY3EJJXIxNSwlcjEwCisJdGVzdHEJJXIxMSwlcjExCisKKwljbW92bnpxCSVyYXgsJXIxMgorCWNtb3ZuenEJJXJicCwlcjEzCisJY21vdm56cQklcmN4LCVyOAorCWNtb3ZuenEJJXIxMCwlcjkKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJxOgorCXhvcnEJJXIxMSwlcjExCisJYWRkcQklcjEyLCVyMTIKKwlhZGNxCSVyMTMsJXIxMworCW1vdnEJJXIxMiwlcmF4CisJYWRjcQklcjgsJXI4CisJYWRjcQklcjksJXI5CisJbW92cQklcjEzLCVyYnAKKwlhZGNxCSQwLCVyMTEKKworCXN1YnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXJheCwlcjEyCisJY21vdmNxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwwKCVyZGkpCisJY21vdmNxCSVyY3gsJXI4CisJbW92cQklcjEzLDgoJXJkaSkKKwljbW92Y3EJJXIxMCwlcjkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisKKwkuYnl0ZQkweGYzLDB4YzMKKworLmdsb2JsCV9lY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxlCisucHJpdmF0ZV9leHRlcm4gX2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGUKKworLnAyYWxpZ24JNQorX2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGU6CisKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmN4CisJbW92cQk4KCVyY3gpLCVyY3gKKwlhbmRsCSQweDgwMTAwLCVlY3gKKwljbXBsCSQweDgwMTAwLCVlY3gKKwlqZQlMJHBvaW50X2RvdWJsZXgKKwlwdXNocQklcmJwCisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKwlzdWJxCSQxNjArOCwlcnNwCisKK0wkcG9pbnRfZG91YmxlcV9ib2R5OgorCitMJHBvaW50X2RvdWJsZV9zaG9ydGN1dHE6CisJbW92ZHF1CTAoJXJzaSksJXhtbTAKKwltb3ZxCSVyc2ksJXJieAorCW1vdmRxdQkxNiglcnNpKSwleG1tMQorCW1vdnEJMzIrMCglcnNpKSwlcjEyCisJbW92cQkzMis4KCVyc2kpLCVyMTMKKwltb3ZxCTMyKzE2KCVyc2kpLCVyOAorCW1vdnEJMzIrMjQoJXJzaSksJXI5CisJbW92cQlMJHBvbHkrOCglcmlwKSwlcjE0CisJbW92cQlMJHBvbHkrMjQoJXJpcCksJXIxNQorCW1vdmRxYQkleG1tMCw5NiglcnNwKQorCW1vdmRxYQkleG1tMSw5NisxNiglcnNwKQorCWxlYXEJMzIoJXJkaSksJXIxMAorCWxlYXEJNjQoJXJkaSksJXIxMQorLmJ5dGUJMTAyLDcyLDE1LDExMCwxOTkKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjAyCisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIxMQorCisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8ycQorCisJbW92cQk2NCswKCVyc2kpLCVyYXgKKwltb3ZxCTY0KzgoJXJzaSksJXIxNAorCW1vdnEJNjQrMTYoJXJzaSksJXIxNQorCW1vdnEJNjQrMjQoJXJzaSksJXI4CisJbGVhcQk2NC0wKCVyc2kpLCVyc2kKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92cQkwKzAoJXJzcCksJXJheAorCW1vdnEJOCswKCVyc3ApLCVyMTQKKwlsZWFxCTArMCglcnNwKSwlcnNpCisJbW92cQkxNiswKCVyc3ApLCVyMTUKKwltb3ZxCTI0KzAoJXJzcCksJXI4CisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92cQkzMiglcmJ4KSwlcmF4CisJbW92cQk2NCswKCVyYngpLCVyOQorCW1vdnEJNjQrOCglcmJ4KSwlcjEwCisJbW92cQk2NCsxNiglcmJ4KSwlcjExCisJbW92cQk2NCsyNCglcmJ4KSwlcjEyCisJbGVhcQk2NC0wKCVyYngpLCVyc2kKKwlsZWFxCTMyKCVyYngpLCVyYngKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjE1CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8ycQorCisJbW92cQk5NiswKCVyc3ApLCVyMTIKKwltb3ZxCTk2KzgoJXJzcCksJXIxMworCWxlYXEJNjQoJXJzcCksJXJieAorCW1vdnEJOTYrMTYoJXJzcCksJXI4CisJbW92cQk5NisyNCglcnNwKSwlcjkKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X2FkZF90b3EKKworCW1vdnEJOTYrMCglcnNwKSwlcjEyCisJbW92cQk5Nis4KCVyc3ApLCVyMTMKKwlsZWFxCTY0KCVyc3ApLCVyYngKKwltb3ZxCTk2KzE2KCVyc3ApLCVyOAorCW1vdnEJOTYrMjQoJXJzcCksJXI5CisJbGVhcQk2NCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCW1vdnEJMCswKCVyc3ApLCVyYXgKKwltb3ZxCTgrMCglcnNwKSwlcjE0CisJbGVhcQkwKzAoJXJzcCksJXJzaQorCW1vdnEJMTYrMCglcnNwKSwlcjE1CisJbW92cQkyNCswKCVyc3ApLCVyOAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDcKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCXhvcnEJJXI5LCVyOQorCW1vdnEJJXIxMiwlcmF4CisJYWRkcQkkLTEsJXIxMgorCW1vdnEJJXIxMywlcjEwCisJYWRjcQklcnNpLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCWFkY3EJJDAsJXIxNAorCW1vdnEJJXIxNSwlcjgKKwlhZGNxCSVyYnAsJXIxNQorCWFkY3EJJDAsJXI5CisJeG9ycQklcnNpLCVyc2kKKwl0ZXN0cQkkMSwlcmF4CisKKwljbW92enEJJXJheCwlcjEyCisJY21vdnpxCSVyMTAsJXIxMworCWNtb3Z6cQklcmN4LCVyMTQKKwljbW92enEJJXI4LCVyMTUKKwljbW92enEJJXJzaSwlcjkKKworCW1vdnEJJXIxMywlcmF4CisJc2hycQkkMSwlcjEyCisJc2hscQkkNjMsJXJheAorCW1vdnEJJXIxNCwlcjEwCisJc2hycQkkMSwlcjEzCisJb3JxCSVyYXgsJXIxMgorCXNobHEJJDYzLCVyMTAKKwltb3ZxCSVyMTUsJXJjeAorCXNocnEJJDEsJXIxNAorCW9ycQklcjEwLCVyMTMKKwlzaGxxCSQ2MywlcmN4CisJbW92cQklcjEyLDAoJXJkaSkKKwlzaHJxCSQxLCVyMTUKKwltb3ZxCSVyMTMsOCglcmRpKQorCXNobHEJJDYzLCVyOQorCW9ycQklcmN4LCVyMTQKKwlvcnEJJXI5LCVyMTUKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKwltb3ZxCTY0KCVyc3ApLCVyYXgKKwlsZWFxCTY0KCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCTArMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWFxCTEyOCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEKKworCWxlYXEJMzIoJXJzcCksJXJieAorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfYWRkX3RvcQorCisJbW92cQk5NiglcnNwKSwlcmF4CisJbGVhcQk5NiglcnNwKSwlcmJ4CisJbW92cQkwKzAoJXJzcCksJXI5CisJbW92cQk4KzAoJXJzcCksJXIxMAorCWxlYXEJMCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxMQorCW1vdnEJMjQrMCglcnNwKSwlcjEyCisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbGVhcQkxMjgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJxCisKKwltb3ZxCTArMzIoJXJzcCksJXJheAorCW1vdnEJOCszMiglcnNwKSwlcjE0CisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTUKKwltb3ZxCTI0KzMyKCVyc3ApLCVyOAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwxOTkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbGVhcQkxMjgoJXJzcCksJXJieAorCW1vdnEJJXIxNCwlcjgKKwltb3ZxCSVyMTUsJXI5CisJbW92cQklcnNpLCVyMTQKKwltb3ZxCSVyYnAsJXIxNQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwltb3ZxCTArMCglcnNwKSwlcmF4CisJbW92cQkwKzgoJXJzcCksJXJicAorCW1vdnEJMCsxNiglcnNwKSwlcmN4CisJbW92cQkwKzI0KCVyc3ApLCVyMTAKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VicQorCisJbW92cQkzMiglcnNwKSwlcmF4CisJbGVhcQkzMiglcnNwKSwlcmJ4CisJbW92cQklcjEyLCVyMTQKKwl4b3JsCSVlY3gsJWVjeAorCW1vdnEJJXIxMiwwKzAoJXJzcCkKKwltb3ZxCSVyMTMsJXIxMAorCW1vdnEJJXIxMywwKzgoJXJzcCkKKwljbW92enEJJXI4LCVyMTEKKwltb3ZxCSVyOCwwKzE2KCVyc3ApCisJbGVhcQkwLTAoJXJzcCksJXJzaQorCWNtb3Z6cQklcjksJXIxMgorCW1vdnEJJXI5LDArMjQoJXJzcCkKKwltb3ZxCSVyMTQsJXI5CisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwMworLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDcKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbGVhcQkxNjArNTYoJXJzcCksJXJzaQorCisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJieAorCisJbW92cQktOCglcnNpKSwlcmJwCisKKwlsZWFxCSglcnNpKSwlcnNwCisKK0wkcG9pbnRfZG91YmxlcV9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGQKKy5wcml2YXRlX2V4dGVybiBfZWNwX25pc3R6MjU2X3BvaW50X2FkZAorCisucDJhbGlnbgk1CitfZWNwX25pc3R6MjU2X3BvaW50X2FkZDoKKworCWxlYXEJX09QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyY3gKKwltb3ZxCTgoJXJjeCksJXJjeAorCWFuZGwJJDB4ODAxMDAsJWVjeAorCWNtcGwJJDB4ODAxMDAsJWVjeAorCWplCUwkcG9pbnRfYWRkeAorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXN1YnEJJDU3Nis4LCVyc3AKKworTCRwb2ludF9hZGRxX2JvZHk6CisKKwltb3ZkcXUJMCglcnNpKSwleG1tMAorCW1vdmRxdQkxNiglcnNpKSwleG1tMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tMworCW1vdmRxdQk2NCglcnNpKSwleG1tNAorCW1vdmRxdQk4MCglcnNpKSwleG1tNQorCW1vdnEJJXJzaSwlcmJ4CisJbW92cQklcmR4LCVyc2kKKwltb3ZkcWEJJXhtbTAsMzg0KCVyc3ApCisJbW92ZHFhCSV4bW0xLDM4NCsxNiglcnNwKQorCW1vdmRxYQkleG1tMiw0MTYoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNDE2KzE2KCVyc3ApCisJbW92ZHFhCSV4bW00LDQ0OCglcnNwKQorCW1vdmRxYQkleG1tNSw0NDgrMTYoJXJzcCkKKwlwb3IJJXhtbTQsJXhtbTUKKworCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJcHNodWZkCSQweGIxLCV4bW01LCV4bW0zCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJbW92cQk2NCswKCVyc2kpLCVyYXgKKwltb3ZxCTY0KzgoJXJzaSksJXIxNAorCW1vdnEJNjQrMTYoJXJzaSksJXIxNQorCW1vdnEJNjQrMjQoJXJzaSksJXI4CisJbW92ZHFhCSV4bW0wLDQ4MCglcnNwKQorCXBzaHVmZAkkMHgxZSwleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMSw0ODArMTYoJXJzcCkKKwltb3ZkcXUJNjQoJXJzaSksJXhtbTAKKwltb3ZkcXUJODAoJXJzaSksJXhtbTEKKwltb3ZkcWEJJXhtbTIsNTEyKCVyc3ApCisJbW92ZHFhCSV4bW0zLDUxMisxNiglcnNwKQorCXBvcgkleG1tNCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTQKKwlwb3IJJXhtbTAsJXhtbTEKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMTk5CisKKwlsZWFxCTY0LTAoJXJzaSksJXJzaQorCW1vdnEJJXJheCw1NDQrMCglcnNwKQorCW1vdnEJJXIxNCw1NDQrOCglcnNwKQorCW1vdnEJJXIxNSw1NDQrMTYoJXJzcCkKKwltb3ZxCSVyOCw1NDQrMjQoJXJzcCkKKwlsZWFxCTk2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJcGNtcGVxZAkleG1tNCwleG1tNQorCXBzaHVmZAkkMHhiMSwleG1tMSwleG1tNAorCXBvcgkleG1tMSwleG1tNAorCXBzaHVmZAkkMCwleG1tNSwleG1tNQorCXBzaHVmZAkkMHgxZSwleG1tNCwleG1tMworCXBvcgkleG1tMywleG1tNAorCXB4b3IJJXhtbTMsJXhtbTMKKwlwY21wZXFkCSV4bW0zLCV4bW00CisJcHNodWZkCSQwLCV4bW00LCV4bW00CisJbW92cQk2NCswKCVyYngpLCVyYXgKKwltb3ZxCTY0KzgoJXJieCksJXIxNAorCW1vdnEJNjQrMTYoJXJieCksJXIxNQorCW1vdnEJNjQrMjQoJXJieCksJXI4CisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwMworCisJbGVhcQk2NC0wKCVyYngpLCVyc2kKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92cQk1NDQoJXJzcCksJXJheAorCWxlYXEJNTQ0KCVyc3ApLCVyYngKKwltb3ZxCTArOTYoJXJzcCksJXI5CisJbW92cQk4Kzk2KCVyc3ApLCVyMTAKKwlsZWFxCTArOTYoJXJzcCksJXJzaQorCW1vdnEJMTYrOTYoJXJzcCksJXIxMQorCW1vdnEJMjQrOTYoJXJzcCksJXIxMgorCWxlYXEJMjI0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92cQk0NDgoJXJzcCksJXJheAorCWxlYXEJNDQ4KCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCTArMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMjU2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92cQk0MTYoJXJzcCksJXJheAorCWxlYXEJNDE2KCVyc3ApLCVyYngKKwltb3ZxCTArMjI0KCVyc3ApLCVyOQorCW1vdnEJOCsyMjQoJXJzcCksJXIxMAorCWxlYXEJMCsyMjQoJXJzcCksJXJzaQorCW1vdnEJMTYrMjI0KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzIyNCglcnNwKSwlcjEyCisJbGVhcQkyMjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTUxMiglcnNwKSwlcmF4CisJbGVhcQk1MTIoJXJzcCksJXJieAorCW1vdnEJMCsyNTYoJXJzcCksJXI5CisJbW92cQk4KzI1NiglcnNwKSwlcjEwCisJbGVhcQkwKzI1NiglcnNwKSwlcnNpCisJbW92cQkxNisyNTYoJXJzcCksJXIxMQorCW1vdnEJMjQrMjU2KCVyc3ApLCVyMTIKKwlsZWFxCTI1NiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYXEJMjI0KCVyc3ApLCVyYngKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJb3JxCSVyMTMsJXIxMgorCW1vdmRxYQkleG1tNCwleG1tMgorCW9ycQklcjgsJXIxMgorCW9ycQklcjksJXIxMgorCXBvcgkleG1tNSwleG1tMgorLmJ5dGUJMTAyLDczLDE1LDExMCwyMjAKKworCW1vdnEJMzg0KCVyc3ApLCVyYXgKKwlsZWFxCTM4NCglcnNwKSwlcmJ4CisJbW92cQkwKzk2KCVyc3ApLCVyOQorCW1vdnEJOCs5NiglcnNwKSwlcjEwCisJbGVhcQkwKzk2KCVyc3ApLCVyc2kKKwltb3ZxCTE2Kzk2KCVyc3ApLCVyMTEKKwltb3ZxCTI0Kzk2KCVyc3ApLCVyMTIKKwlsZWFxCTE2MCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCW1vdnEJNDgwKCVyc3ApLCVyYXgKKwlsZWFxCTQ4MCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTE5MiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYXEJMTYwKCVyc3ApLCVyYngKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwlvcnEJJXIxMywlcjEyCisJb3JxCSVyOCwlcjEyCisJb3JxCSVyOSwlcjEyCisKKy5ieXRlCTB4M2UKKwlqbnoJTCRhZGRfcHJvY2VlZHEKKy5ieXRlCTEwMiw3MywxNSwxMjYsMjA4CisuYnl0ZQkxMDIsNzMsMTUsMTI2LDIxNworCXRlc3RxCSVyOCwlcjgKKwlqbnoJTCRhZGRfcHJvY2VlZHEKKwl0ZXN0cQklcjksJXI5CisJanoJTCRhZGRfZG91YmxlcQorCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5OQorCXB4b3IJJXhtbTAsJXhtbTAKKwltb3ZkcXUJJXhtbTAsMCglcmRpKQorCW1vdmRxdQkleG1tMCwxNiglcmRpKQorCW1vdmRxdQkleG1tMCwzMiglcmRpKQorCW1vdmRxdQkleG1tMCw0OCglcmRpKQorCW1vdmRxdQkleG1tMCw2NCglcmRpKQorCW1vdmRxdQkleG1tMCw4MCglcmRpKQorCWptcAlMJGFkZF9kb25lcQorCisucDJhbGlnbgk1CitMJGFkZF9kb3VibGVxOgorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDYKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisJYWRkcQkkNDE2LCVyc3AKKwlqbXAJTCRwb2ludF9kb3VibGVfc2hvcnRjdXRxCisKKy5wMmFsaWduCTUKK0wkYWRkX3Byb2NlZWRxOgorCW1vdnEJMCs2NCglcnNwKSwlcmF4CisJbW92cQk4KzY0KCVyc3ApLCVyMTQKKwlsZWFxCTArNjQoJXJzcCksJXJzaQorCW1vdnEJMTYrNjQoJXJzcCksJXIxNQorCW1vdnEJMjQrNjQoJXJzcCksJXI4CisJbGVhcQk5NiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCW1vdnEJNDQ4KCVyc3ApLCVyYXgKKwlsZWFxCTQ0OCglcnNwKSwlcmJ4CisJbW92cQkwKzAoJXJzcCksJXI5CisJbW92cQk4KzAoJXJzcCksJXIxMAorCWxlYXEJMCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxMQorCW1vdnEJMjQrMCglcnNwKSwlcjEyCisJbGVhcQkzNTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTArMCglcnNwKSwlcmF4CisJbW92cQk4KzAoJXJzcCksJXIxNAorCWxlYXEJMCswKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzAoJXJzcCksJXIxNQorCW1vdnEJMjQrMCglcnNwKSwlcjgKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92cQk1NDQoJXJzcCksJXJheAorCWxlYXEJNTQ0KCVyc3ApLCVyYngKKwltb3ZxCTArMzUyKCVyc3ApLCVyOQorCW1vdnEJOCszNTIoJXJzcCksJXIxMAorCWxlYXEJMCszNTIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzUyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzM1MiglcnNwKSwlcjEyCisJbGVhcQkzNTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTAoJXJzcCksJXJheAorCWxlYXEJMCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTEyOCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCW1vdnEJMTYwKCVyc3ApLCVyYXgKKwlsZWFxCTE2MCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTE5MiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCisKKworCXhvcnEJJXIxMSwlcjExCisJYWRkcQklcjEyLCVyMTIKKwlsZWFxCTk2KCVyc3ApLCVyc2kKKwlhZGNxCSVyMTMsJXIxMworCW1vdnEJJXIxMiwlcmF4CisJYWRjcQklcjgsJXI4CisJYWRjcQklcjksJXI5CisJbW92cQklcjEzLCVyYnAKKwlhZGNxCSQwLCVyMTEKKworCXN1YnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXJheCwlcjEyCisJbW92cQkwKCVyc2kpLCVyYXgKKwljbW92Y3EJJXJicCwlcjEzCisJbW92cQk4KCVyc2kpLCVyYnAKKwljbW92Y3EJJXJjeCwlcjgKKwltb3ZxCTE2KCVyc2kpLCVyY3gKKwljbW92Y3EJJXIxMCwlcjkKKwltb3ZxCTI0KCVyc2kpLCVyMTAKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VicQorCisJbGVhcQkxMjgoJXJzcCksJXJieAorCWxlYXEJMjg4KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92cQkxOTIrMCglcnNwKSwlcmF4CisJbW92cQkxOTIrOCglcnNwKSwlcmJwCisJbW92cQkxOTIrMTYoJXJzcCksJXJjeAorCW1vdnEJMTkyKzI0KCVyc3ApLCVyMTAKKwlsZWFxCTMyMCglcnNwKSwlcmRpCisKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YnEKKworCW1vdnEJJXIxMiwwKCVyZGkpCisJbW92cQklcjEzLDgoJXJkaSkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisJbW92cQkxMjgoJXJzcCksJXJheAorCWxlYXEJMTI4KCVyc3ApLCVyYngKKwltb3ZxCTArMjI0KCVyc3ApLCVyOQorCW1vdnEJOCsyMjQoJXJzcCksJXIxMAorCWxlYXEJMCsyMjQoJXJzcCksJXJzaQorCW1vdnEJMTYrMjI0KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzIyNCglcnNwKSwlcjEyCisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3ZxCTMyMCglcnNwKSwlcmF4CisJbGVhcQkzMjAoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJMCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkzMjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWFxCTI1NiglcnNwKSwlcmJ4CisJbGVhcQkzMjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkzNTIoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkzNTIrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTU0NCglcnNwKSwleG1tMgorCXBhbmQJNTQ0KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAk0NDgoJXJzcCksJXhtbTIKKwlwYW5kCTQ0OCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiw2NCglcmRpKQorCW1vdmRxdQkleG1tMyw4MCglcmRpKQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMjg4KCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMjg4KzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAk0ODAoJXJzcCksJXhtbTIKKwlwYW5kCTQ4MCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYW5kbgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhbmQJMzg0KCVyc3ApLCV4bW0yCisJcGFuZAkzODQrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsMCglcmRpKQorCW1vdmRxdQkleG1tMywxNiglcmRpKQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMzIwKCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMzIwKzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAk1MTIoJXJzcCksJXhtbTIKKwlwYW5kCTUxMisxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYW5kbgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhbmQJNDE2KCVyc3ApLCV4bW0yCisJcGFuZAk0MTYrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTMsNDgoJXJkaSkKKworTCRhZGRfZG9uZXE6CisJbGVhcQk1NzYrNTYoJXJzcCksJXJzaQorCisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJieAorCisJbW92cQktOCglcnNpKSwlcmJwCisKKwlsZWFxCSglcnNpKSwlcnNwCisKK0wkcG9pbnRfYWRkcV9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lCisucHJpdmF0ZV9leHRlcm4gX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lCisKKy5wMmFsaWduCTUKK19lY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZToKKworCWxlYXEJX09QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyY3gKKwltb3ZxCTgoJXJjeCksJXJjeAorCWFuZGwJJDB4ODAxMDAsJWVjeAorCWNtcGwJJDB4ODAxMDAsJWVjeAorCWplCUwkcG9pbnRfYWRkX2FmZmluZXgKKwlwdXNocQklcmJwCisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKwlzdWJxCSQ0ODArOCwlcnNwCisKK0wkYWRkX2FmZmluZXFfYm9keToKKworCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJbW92cQklcmR4LCVyYngKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTEKKwltb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTMKKwltb3ZkcXUJNjQoJXJzaSksJXhtbTQKKwltb3ZkcXUJODAoJXJzaSksJXhtbTUKKwltb3ZxCTY0KzAoJXJzaSksJXJheAorCW1vdnEJNjQrOCglcnNpKSwlcjE0CisJbW92cQk2NCsxNiglcnNpKSwlcjE1CisJbW92cQk2NCsyNCglcnNpKSwlcjgKKwltb3ZkcWEJJXhtbTAsMzIwKCVyc3ApCisJbW92ZHFhCSV4bW0xLDMyMCsxNiglcnNwKQorCW1vdmRxYQkleG1tMiwzNTIoJXJzcCkKKwltb3ZkcWEJJXhtbTMsMzUyKzE2KCVyc3ApCisJbW92ZHFhCSV4bW00LDM4NCglcnNwKQorCW1vdmRxYQkleG1tNSwzODQrMTYoJXJzcCkKKwlwb3IJJXhtbTQsJXhtbTUKKworCW1vdmRxdQkwKCVyYngpLCV4bW0wCisJcHNodWZkCSQweGIxLCV4bW01LCV4bW0zCisJbW92ZHF1CTE2KCVyYngpLCV4bW0xCisJbW92ZHF1CTMyKCVyYngpLCV4bW0yCisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHF1CTQ4KCVyYngpLCV4bW0zCisJbW92ZHFhCSV4bW0wLDQxNiglcnNwKQorCXBzaHVmZAkkMHgxZSwleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMSw0MTYrMTYoJXJzcCkKKwlwb3IJJXhtbTAsJXhtbTEKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMTk5CisJbW92ZHFhCSV4bW0yLDQ0OCglcnNwKQorCW1vdmRxYQkleG1tMyw0NDgrMTYoJXJzcCkKKwlwb3IJJXhtbTIsJXhtbTMKKwlwb3IJJXhtbTQsJXhtbTUKKwlweG9yCSV4bW00LCV4bW00CisJcG9yCSV4bW0xLCV4bW0zCisKKwlsZWFxCTY0LTAoJXJzaSksJXJzaQorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwlwY21wZXFkCSV4bW00LCV4bW01CisJcHNodWZkCSQweGIxLCV4bW0zLCV4bW00CisJbW92cQkwKCVyYngpLCVyYXgKKworCW1vdnEJJXIxMiwlcjkKKwlwb3IJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTUsJXhtbTUKKwlwc2h1ZmQJJDB4MWUsJXhtbTQsJXhtbTMKKwltb3ZxCSVyMTMsJXIxMAorCXBvcgkleG1tMywleG1tNAorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3ZxCSVyMTQsJXIxMQorCXBjbXBlcWQJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTQsJXhtbTQKKworCWxlYXEJMzItMCglcnNwKSwlcnNpCisJbW92cQklcjE1LCVyMTIKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWFxCTMyMCglcnNwKSwlcmJ4CisJbGVhcQk2NCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCW1vdnEJMzg0KCVyc3ApLCVyYXgKKwlsZWFxCTM4NCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQkwKzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92cQkzODQoJXJzcCksJXJheAorCWxlYXEJMzg0KCVyc3ApLCVyYngKKwltb3ZxCTArNjQoJXJzcCksJXI5CisJbW92cQk4KzY0KCVyc3ApLCVyMTAKKwlsZWFxCTArNjQoJXJzcCksJXJzaQorCW1vdnEJMTYrNjQoJXJzcCksJXIxMQorCW1vdnEJMjQrNjQoJXJzcCksJXIxMgorCWxlYXEJMjg4KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92cQk0NDgoJXJzcCksJXJheAorCWxlYXEJNDQ4KCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCTArMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWFxCTM1MiglcnNwKSwlcmJ4CisJbGVhcQk5NiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCW1vdnEJMCs2NCglcnNwKSwlcmF4CisJbW92cQk4KzY0KCVyc3ApLCVyMTQKKwlsZWFxCTArNjQoJXJzcCksJXJzaQorCW1vdnEJMTYrNjQoJXJzcCksJXIxNQorCW1vdnEJMjQrNjQoJXJzcCksJXI4CisJbGVhcQkxMjgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwltb3ZxCTArOTYoJXJzcCksJXJheAorCW1vdnEJOCs5NiglcnNwKSwlcjE0CisJbGVhcQkwKzk2KCVyc3ApLCVyc2kKKwltb3ZxCTE2Kzk2KCVyc3ApLCVyMTUKKwltb3ZxCTI0Kzk2KCVyc3ApLCVyOAorCWxlYXEJMTkyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92cQkxMjgoJXJzcCksJXJheAorCWxlYXEJMTI4KCVyc3ApLCVyYngKKwltb3ZxCTArNjQoJXJzcCksJXI5CisJbW92cQk4KzY0KCVyc3ApLCVyMTAKKwlsZWFxCTArNjQoJXJzcCksJXJzaQorCW1vdnEJMTYrNjQoJXJzcCksJXIxMQorCW1vdnEJMjQrNjQoJXJzcCksJXIxMgorCWxlYXEJMTYwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92cQkzMjAoJXJzcCksJXJheAorCWxlYXEJMzIwKCVyc3ApLCVyYngKKwltb3ZxCTArMTI4KCVyc3ApLCVyOQorCW1vdnEJOCsxMjgoJXJzcCksJXIxMAorCWxlYXEJMCsxMjgoJXJzcCksJXJzaQorCW1vdnEJMTYrMTI4KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzEyOCglcnNwKSwlcjEyCisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisKKworCisJeG9ycQklcjExLCVyMTEKKwlhZGRxCSVyMTIsJXIxMgorCWxlYXEJMTkyKCVyc3ApLCVyc2kKKwlhZGNxCSVyMTMsJXIxMworCW1vdnEJJXIxMiwlcmF4CisJYWRjcQklcjgsJXI4CisJYWRjcQklcjksJXI5CisJbW92cQklcjEzLCVyYnAKKwlhZGNxCSQwLCVyMTEKKworCXN1YnEJJC0xLCVyMTIKKwltb3ZxCSVyOCwlcmN4CisJc2JicQklcjE0LCVyMTMKKwlzYmJxCSQwLCVyOAorCW1vdnEJJXI5LCVyMTAKKwlzYmJxCSVyMTUsJXI5CisJc2JicQkkMCwlcjExCisKKwljbW92Y3EJJXJheCwlcjEyCisJbW92cQkwKCVyc2kpLCVyYXgKKwljbW92Y3EJJXJicCwlcjEzCisJbW92cQk4KCVyc2kpLCVyYnAKKwljbW92Y3EJJXJjeCwlcjgKKwltb3ZxCTE2KCVyc2kpLCVyY3gKKwljbW92Y3EJJXIxMCwlcjkKKwltb3ZxCTI0KCVyc2kpLCVyMTAKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VicQorCisJbGVhcQkxNjAoJXJzcCksJXJieAorCWxlYXEJMjI0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92cQkwKzAoJXJzcCksJXJheAorCW1vdnEJMCs4KCVyc3ApLCVyYnAKKwltb3ZxCTArMTYoJXJzcCksJXJjeAorCW1vdnEJMCsyNCglcnNwKSwlcjEwCisJbGVhcQk2NCglcnNwKSwlcmRpCisKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YnEKKworCW1vdnEJJXIxMiwwKCVyZGkpCisJbW92cQklcjEzLDgoJXJkaSkKKwltb3ZxCSVyOCwxNiglcmRpKQorCW1vdnEJJXI5LDI0KCVyZGkpCisJbW92cQkzNTIoJXJzcCksJXJheAorCWxlYXEJMzUyKCVyc3ApLCVyYngKKwltb3ZxCTArMTYwKCVyc3ApLCVyOQorCW1vdnEJOCsxNjAoJXJzcCksJXIxMAorCWxlYXEJMCsxNjAoJXJzcCksJXJzaQorCW1vdnEJMTYrMTYwKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzE2MCglcnNwKSwlcjEyCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCW1vdnEJOTYoJXJzcCksJXJheAorCWxlYXEJOTYoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJMCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQk2NCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYXEJMzIoJXJzcCksJXJieAorCWxlYXEJMjU2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5OQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMjg4KCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMjg4KzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAlMJE9ORV9tb250KCVyaXApLCV4bW0yCisJcGFuZAlMJE9ORV9tb250KzE2KCVyaXApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzODQoJXJzcCksJXhtbTIKKwlwYW5kCTM4NCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiw2NCglcmRpKQorCW1vdmRxdQkleG1tMyw4MCglcmRpKQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMjI0KCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMjI0KzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAk0MTYoJXJzcCksJXhtbTIKKwlwYW5kCTQxNisxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYW5kbgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhbmQJMzIwKCVyc3ApLCV4bW0yCisJcGFuZAkzMjArMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsMCglcmRpKQorCW1vdmRxdQkleG1tMywxNiglcmRpKQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMjU2KCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMjU2KzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAk0NDgoJXJzcCksJXhtbTIKKwlwYW5kCTQ0OCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYW5kbgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhbmQJMzUyKCVyc3ApLCV4bW0yCisJcGFuZAkzNTIrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTMsNDgoJXJkaSkKKworCWxlYXEJNDgwKzU2KCVyc3ApLCVyc2kKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYngKKworCW1vdnEJLTgoJXJzaSksJXJicAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJGFkZF9hZmZpbmVxX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorX19lY3BfbmlzdHoyNTZfYWRkX3RveDoKKwl4b3JxCSVyMTEsJXIxMQorCWFkY3EJMCglcmJ4KSwlcjEyCisJYWRjcQk4KCVyYngpLCVyMTMKKwltb3ZxCSVyMTIsJXJheAorCWFkY3EJMTYoJXJieCksJXI4CisJYWRjcQkyNCglcmJ4KSwlcjkKKwltb3ZxCSVyMTMsJXJicAorCWFkY3EJJDAsJXIxMQorCisJeG9ycQklcjEwLCVyMTAKKwlzYmJxCSQtMSwlcjEyCisJbW92cQklcjgsJXJjeAorCXNiYnEJJXIxNCwlcjEzCisJc2JicQkkMCwlcjgKKwltb3ZxCSVyOSwlcjEwCisJc2JicQklcjE1LCVyOQorCXNiYnEJJDAsJXIxMQorCisJY21vdmNxCSVyYXgsJXIxMgorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCSVyMTIsMCglcmRpKQorCWNtb3ZjcQklcmN4LCVyOAorCW1vdnEJJXIxMyw4KCVyZGkpCisJY21vdmNxCSVyMTAsJXI5CisJbW92cQklcjgsMTYoJXJkaSkKKwltb3ZxCSVyOSwyNCglcmRpKQorCisJLmJ5dGUJMHhmMywweGMzCisKKworCisucDJhbGlnbgk1CitfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXg6CisJeG9ycQklcjExLCVyMTEKKwlzYmJxCTAoJXJieCksJXIxMgorCXNiYnEJOCglcmJ4KSwlcjEzCisJbW92cQklcjEyLCVyYXgKKwlzYmJxCTE2KCVyYngpLCVyOAorCXNiYnEJMjQoJXJieCksJXI5CisJbW92cQklcjEzLCVyYnAKKwlzYmJxCSQwLCVyMTEKKworCXhvcnEJJXIxMCwlcjEwCisJYWRjcQkkLTEsJXIxMgorCW1vdnEJJXI4LCVyY3gKKwlhZGNxCSVyMTQsJXIxMworCWFkY3EJJDAsJXI4CisJbW92cQklcjksJXIxMAorCWFkY3EJJXIxNSwlcjkKKworCWJ0cQkkMCwlcjExCisJY21vdm5jcQklcmF4LCVyMTIKKwljbW92bmNxCSVyYnAsJXIxMworCW1vdnEJJXIxMiwwKCVyZGkpCisJY21vdm5jcQklcmN4LCVyOAorCW1vdnEJJXIxMyw4KCVyZGkpCisJY21vdm5jcQklcjEwLCVyOQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorX19lY3BfbmlzdHoyNTZfc3VieDoKKwl4b3JxCSVyMTEsJXIxMQorCXNiYnEJJXIxMiwlcmF4CisJc2JicQklcjEzLCVyYnAKKwltb3ZxCSVyYXgsJXIxMgorCXNiYnEJJXI4LCVyY3gKKwlzYmJxCSVyOSwlcjEwCisJbW92cQklcmJwLCVyMTMKKwlzYmJxCSQwLCVyMTEKKworCXhvcnEJJXI5LCVyOQorCWFkY3EJJC0xLCVyYXgKKwltb3ZxCSVyY3gsJXI4CisJYWRjcQklcjE0LCVyYnAKKwlhZGNxCSQwLCVyY3gKKwltb3ZxCSVyMTAsJXI5CisJYWRjcQklcjE1LCVyMTAKKworCWJ0cQkkMCwlcjExCisJY21vdmNxCSVyYXgsJXIxMgorCWNtb3ZjcQklcmJwLCVyMTMKKwljbW92Y3EJJXJjeCwlcjgKKwljbW92Y3EJJXIxMCwlcjkKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJ4OgorCXhvcnEJJXIxMSwlcjExCisJYWRjcQklcjEyLCVyMTIKKwlhZGNxCSVyMTMsJXIxMworCW1vdnEJJXIxMiwlcmF4CisJYWRjcQklcjgsJXI4CisJYWRjcQklcjksJXI5CisJbW92cQklcjEzLCVyYnAKKwlhZGNxCSQwLCVyMTEKKworCXhvcnEJJXIxMCwlcjEwCisJc2JicQkkLTEsJXIxMgorCW1vdnEJJXI4LCVyY3gKKwlzYmJxCSVyMTQsJXIxMworCXNiYnEJJDAsJXI4CisJbW92cQklcjksJXIxMAorCXNiYnEJJXIxNSwlcjkKKwlzYmJxCSQwLCVyMTEKKworCWNtb3ZjcQklcmF4LCVyMTIKKwljbW92Y3EJJXJicCwlcjEzCisJbW92cQklcjEyLDAoJXJkaSkKKwljbW92Y3EJJXJjeCwlcjgKKwltb3ZxCSVyMTMsOCglcmRpKQorCWNtb3ZjcQklcjEwLCVyOQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKworCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTUKK2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGV4OgorCitMJHBvaW50X2RvdWJsZXg6CisJcHVzaHEJJXJicAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJc3VicQkkMTYwKzgsJXJzcAorCitMJHBvaW50X2RvdWJsZXhfYm9keToKKworTCRwb2ludF9kb3VibGVfc2hvcnRjdXR4OgorCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJbW92cQklcnNpLCVyYngKKwltb3ZkcXUJMTYoJXJzaSksJXhtbTEKKwltb3ZxCTMyKzAoJXJzaSksJXIxMgorCW1vdnEJMzIrOCglcnNpKSwlcjEzCisJbW92cQkzMisxNiglcnNpKSwlcjgKKwltb3ZxCTMyKzI0KCVyc2kpLCVyOQorCW1vdnEJTCRwb2x5KzgoJXJpcCksJXIxNAorCW1vdnEJTCRwb2x5KzI0KCVyaXApLCVyMTUKKwltb3ZkcWEJJXhtbTAsOTYoJXJzcCkKKwltb3ZkcWEJJXhtbTEsOTYrMTYoJXJzcCkKKwlsZWFxCTMyKCVyZGkpLCVyMTAKKwlsZWFxCTY0KCVyZGkpLCVyMTEKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMTk5CisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIwMgorLmJ5dGUJMTAyLDczLDE1LDExMCwyMTEKKworCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMngKKworCW1vdnEJNjQrMCglcnNpKSwlcmR4CisJbW92cQk2NCs4KCVyc2kpLCVyMTQKKwltb3ZxCTY0KzE2KCVyc2kpLCVyMTUKKwltb3ZxCTY0KzI0KCVyc2kpLCVyOAorCWxlYXEJNjQtMTI4KCVyc2kpLCVyc2kKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eAorCisJbW92cQkwKzAoJXJzcCksJXJkeAorCW1vdnEJOCswKCVyc3ApLCVyMTQKKwlsZWFxCS0xMjgrMCglcnNwKSwlcnNpCisJbW92cQkxNiswKCVyc3ApLCVyMTUKKwltb3ZxCTI0KzAoJXJzcCksJXI4CisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eAorCisJbW92cQkzMiglcmJ4KSwlcmR4CisJbW92cQk2NCswKCVyYngpLCVyOQorCW1vdnEJNjQrOCglcmJ4KSwlcjEwCisJbW92cQk2NCsxNiglcmJ4KSwlcjExCisJbW92cQk2NCsyNCglcmJ4KSwlcjEyCisJbGVhcQk2NC0xMjgoJXJieCksJXJzaQorCWxlYXEJMzIoJXJieCksJXJieAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTUKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJ4CisKKwltb3ZxCTk2KzAoJXJzcCksJXIxMgorCW1vdnEJOTYrOCglcnNwKSwlcjEzCisJbGVhcQk2NCglcnNwKSwlcmJ4CisJbW92cQk5NisxNiglcnNwKSwlcjgKKwltb3ZxCTk2KzI0KCVyc3ApLCVyOQorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfYWRkX3RveAorCisJbW92cQk5NiswKCVyc3ApLCVyMTIKKwltb3ZxCTk2KzgoJXJzcCksJXIxMworCWxlYXEJNjQoJXJzcCksJXJieAorCW1vdnEJOTYrMTYoJXJzcCksJXI4CisJbW92cQk5NisyNCglcnNwKSwlcjkKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJbW92cQkwKzAoJXJzcCksJXJkeAorCW1vdnEJOCswKCVyc3ApLCVyMTQKKwlsZWFxCS0xMjgrMCglcnNwKSwlcnNpCisJbW92cQkxNiswKCVyc3ApLCVyMTUKKwltb3ZxCTI0KzAoJXJzcCksJXI4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwNworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisJeG9ycQklcjksJXI5CisJbW92cQklcjEyLCVyYXgKKwlhZGRxCSQtMSwlcjEyCisJbW92cQklcjEzLCVyMTAKKwlhZGNxCSVyc2ksJXIxMworCW1vdnEJJXIxNCwlcmN4CisJYWRjcQkkMCwlcjE0CisJbW92cQklcjE1LCVyOAorCWFkY3EJJXJicCwlcjE1CisJYWRjcQkkMCwlcjkKKwl4b3JxCSVyc2ksJXJzaQorCXRlc3RxCSQxLCVyYXgKKworCWNtb3Z6cQklcmF4LCVyMTIKKwljbW92enEJJXIxMCwlcjEzCisJY21vdnpxCSVyY3gsJXIxNAorCWNtb3Z6cQklcjgsJXIxNQorCWNtb3Z6cQklcnNpLCVyOQorCisJbW92cQklcjEzLCVyYXgKKwlzaHJxCSQxLCVyMTIKKwlzaGxxCSQ2MywlcmF4CisJbW92cQklcjE0LCVyMTAKKwlzaHJxCSQxLCVyMTMKKwlvcnEJJXJheCwlcjEyCisJc2hscQkkNjMsJXIxMAorCW1vdnEJJXIxNSwlcmN4CisJc2hycQkkMSwlcjE0CisJb3JxCSVyMTAsJXIxMworCXNobHEJJDYzLCVyY3gKKwltb3ZxCSVyMTIsMCglcmRpKQorCXNocnEJJDEsJXIxNQorCW1vdnEJJXIxMyw4KCVyZGkpCisJc2hscQkkNjMsJXI5CisJb3JxCSVyY3gsJXIxNAorCW9ycQklcjksJXIxNQorCW1vdnEJJXIxNCwxNiglcmRpKQorCW1vdnEJJXIxNSwyNCglcmRpKQorCW1vdnEJNjQoJXJzcCksJXJkeAorCWxlYXEJNjQoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYXEJMTI4KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8yeAorCisJbGVhcQkzMiglcnNwKSwlcmJ4CisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9hZGRfdG94CisKKwltb3ZxCTk2KCVyc3ApLCVyZHgKKwlsZWFxCTk2KCVyc3ApLCVyYngKKwltb3ZxCTArMCglcnNwKSwlcjkKKwltb3ZxCTgrMCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzAoJXJzcCksJXJzaQorCW1vdnEJMTYrMCglcnNwKSwlcjExCisJbW92cQkyNCswKCVyc3ApLCVyMTIKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwlsZWFxCTEyOCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMngKKworCW1vdnEJMCszMiglcnNwKSwlcmR4CisJbW92cQk4KzMyKCVyc3ApLCVyMTQKKwlsZWFxCS0xMjgrMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxNQorCW1vdnEJMjQrMzIoJXJzcCksJXI4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5OQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwlsZWFxCTEyOCglcnNwKSwlcmJ4CisJbW92cQklcjE0LCVyOAorCW1vdnEJJXIxNSwlcjkKKwltb3ZxCSVyc2ksJXIxNAorCW1vdnEJJXJicCwlcjE1CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW1vdnEJMCswKCVyc3ApLCVyYXgKKwltb3ZxCTArOCglcnNwKSwlcmJwCisJbW92cQkwKzE2KCVyc3ApLCVyY3gKKwltb3ZxCTArMjQoJXJzcCksJXIxMAorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwltb3ZxCTMyKCVyc3ApLCVyZHgKKwlsZWFxCTMyKCVyc3ApLCVyYngKKwltb3ZxCSVyMTIsJXIxNAorCXhvcmwJJWVjeCwlZWN4CisJbW92cQklcjEyLDArMCglcnNwKQorCW1vdnEJJXIxMywlcjEwCisJbW92cQklcjEzLDArOCglcnNwKQorCWNtb3Z6cQklcjgsJXIxMQorCW1vdnEJJXI4LDArMTYoJXJzcCkKKwlsZWFxCTAtMTI4KCVyc3ApLCVyc2kKKwljbW92enEJJXI5LCVyMTIKKwltb3ZxCSVyOSwwKzI0KCVyc3ApCisJbW92cQklcjE0LCVyOQorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDMKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA3CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCWxlYXEJMTYwKzU2KCVyc3ApLCVyc2kKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYngKKworCW1vdnEJLTgoJXJzaSksJXJicAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJHBvaW50X2RvdWJsZXhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisucDJhbGlnbgk1CitlY3BfbmlzdHoyNTZfcG9pbnRfYWRkeDoKKworTCRwb2ludF9hZGR4OgorCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXN1YnEJJDU3Nis4LCVyc3AKKworTCRwb2ludF9hZGR4X2JvZHk6CisKKwltb3ZkcXUJMCglcnNpKSwleG1tMAorCW1vdmRxdQkxNiglcnNpKSwleG1tMQorCW1vdmRxdQkzMiglcnNpKSwleG1tMgorCW1vdmRxdQk0OCglcnNpKSwleG1tMworCW1vdmRxdQk2NCglcnNpKSwleG1tNAorCW1vdmRxdQk4MCglcnNpKSwleG1tNQorCW1vdnEJJXJzaSwlcmJ4CisJbW92cQklcmR4LCVyc2kKKwltb3ZkcWEJJXhtbTAsMzg0KCVyc3ApCisJbW92ZHFhCSV4bW0xLDM4NCsxNiglcnNwKQorCW1vdmRxYQkleG1tMiw0MTYoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNDE2KzE2KCVyc3ApCisJbW92ZHFhCSV4bW00LDQ0OCglcnNwKQorCW1vdmRxYQkleG1tNSw0NDgrMTYoJXJzcCkKKwlwb3IJJXhtbTQsJXhtbTUKKworCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJcHNodWZkCSQweGIxLCV4bW01LCV4bW0zCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJbW92cQk2NCswKCVyc2kpLCVyZHgKKwltb3ZxCTY0KzgoJXJzaSksJXIxNAorCW1vdnEJNjQrMTYoJXJzaSksJXIxNQorCW1vdnEJNjQrMjQoJXJzaSksJXI4CisJbW92ZHFhCSV4bW0wLDQ4MCglcnNwKQorCXBzaHVmZAkkMHgxZSwleG1tNSwleG1tNAorCW1vdmRxYQkleG1tMSw0ODArMTYoJXJzcCkKKwltb3ZkcXUJNjQoJXJzaSksJXhtbTAKKwltb3ZkcXUJODAoJXJzaSksJXhtbTEKKwltb3ZkcWEJJXhtbTIsNTEyKCVyc3ApCisJbW92ZHFhCSV4bW0zLDUxMisxNiglcnNwKQorCXBvcgkleG1tNCwleG1tNQorCXB4b3IJJXhtbTQsJXhtbTQKKwlwb3IJJXhtbTAsJXhtbTEKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMTk5CisKKwlsZWFxCTY0LTEyOCglcnNpKSwlcnNpCisJbW92cQklcmR4LDU0NCswKCVyc3ApCisJbW92cQklcjE0LDU0NCs4KCVyc3ApCisJbW92cQklcjE1LDU0NCsxNiglcnNwKQorCW1vdnEJJXI4LDU0NCsyNCglcnNwKQorCWxlYXEJOTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwlwY21wZXFkCSV4bW00LCV4bW01CisJcHNodWZkCSQweGIxLCV4bW0xLCV4bW00CisJcG9yCSV4bW0xLCV4bW00CisJcHNodWZkCSQwLCV4bW01LCV4bW01CisJcHNodWZkCSQweDFlLCV4bW00LCV4bW0zCisJcG9yCSV4bW0zLCV4bW00CisJcHhvcgkleG1tMywleG1tMworCXBjbXBlcWQJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTQsJXhtbTQKKwltb3ZxCTY0KzAoJXJieCksJXJkeAorCW1vdnEJNjQrOCglcmJ4KSwlcjE0CisJbW92cQk2NCsxNiglcmJ4KSwlcjE1CisJbW92cQk2NCsyNCglcmJ4KSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjAzCisKKwlsZWFxCTY0LTEyOCglcmJ4KSwlcnNpCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCW1vdnEJNTQ0KCVyc3ApLCVyZHgKKwlsZWFxCTU0NCglcnNwKSwlcmJ4CisJbW92cQkwKzk2KCVyc3ApLCVyOQorCW1vdnEJOCs5NiglcnNwKSwlcjEwCisJbGVhcQktMTI4Kzk2KCVyc3ApLCVyc2kKKwltb3ZxCTE2Kzk2KCVyc3ApLCVyMTEKKwltb3ZxCTI0Kzk2KCVyc3ApLCVyMTIKKwlsZWFxCTIyNCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdnEJNDQ4KCVyc3ApLCVyZHgKKwlsZWFxCTQ0OCglcnNwKSwlcmJ4CisJbW92cQkwKzMyKCVyc3ApLCVyOQorCW1vdnEJOCszMiglcnNwKSwlcjEwCisJbGVhcQktMTI4KzMyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzMyKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzMyKCVyc3ApLCVyMTIKKwlsZWFxCTI1NiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdnEJNDE2KCVyc3ApLCVyZHgKKwlsZWFxCTQxNiglcnNwKSwlcmJ4CisJbW92cQkwKzIyNCglcnNwKSwlcjkKKwltb3ZxCTgrMjI0KCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMjI0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzIyNCglcnNwKSwlcjExCisJbW92cQkyNCsyMjQoJXJzcCksJXIxMgorCWxlYXEJMjI0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQk1MTIoJXJzcCksJXJkeAorCWxlYXEJNTEyKCVyc3ApLCVyYngKKwltb3ZxCTArMjU2KCVyc3ApLCVyOQorCW1vdnEJOCsyNTYoJXJzcCksJXIxMAorCWxlYXEJLTEyOCsyNTYoJXJzcCksJXJzaQorCW1vdnEJMTYrMjU2KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzI1NiglcnNwKSwlcjEyCisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwlsZWFxCTIyNCglcnNwKSwlcmJ4CisJbGVhcQk2NCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW9ycQklcjEzLCVyMTIKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlvcnEJJXI4LCVyMTIKKwlvcnEJJXI5LCVyMTIKKwlwb3IJJXhtbTUsJXhtbTIKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjIwCisKKwltb3ZxCTM4NCglcnNwKSwlcmR4CisJbGVhcQkzODQoJXJzcCksJXJieAorCW1vdnEJMCs5NiglcnNwKSwlcjkKKwltb3ZxCTgrOTYoJXJzcCksJXIxMAorCWxlYXEJLTEyOCs5NiglcnNwKSwlcnNpCisJbW92cQkxNis5NiglcnNwKSwlcjExCisJbW92cQkyNCs5NiglcnNwKSwlcjEyCisJbGVhcQkxNjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTQ4MCglcnNwKSwlcmR4CisJbGVhcQk0ODAoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkxOTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwlsZWFxCTE2MCglcnNwKSwlcmJ4CisJbGVhcQkwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJb3JxCSVyMTMsJXIxMgorCW9ycQklcjgsJXIxMgorCW9ycQklcjksJXIxMgorCisuYnl0ZQkweDNlCisJam56CUwkYWRkX3Byb2NlZWR4CisuYnl0ZQkxMDIsNzMsMTUsMTI2LDIwOAorLmJ5dGUJMTAyLDczLDE1LDEyNiwyMTcKKwl0ZXN0cQklcjgsJXI4CisJam56CUwkYWRkX3Byb2NlZWR4CisJdGVzdHEJJXI5LCVyOQorCWp6CUwkYWRkX2RvdWJsZXgKKworLmJ5dGUJMTAyLDcyLDE1LDEyNiwxOTkKKwlweG9yCSV4bW0wLCV4bW0wCisJbW92ZHF1CSV4bW0wLDAoJXJkaSkKKwltb3ZkcXUJJXhtbTAsMTYoJXJkaSkKKwltb3ZkcXUJJXhtbTAsMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTAsNDgoJXJkaSkKKwltb3ZkcXUJJXhtbTAsNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTAsODAoJXJkaSkKKwlqbXAJTCRhZGRfZG9uZXgKKworLnAyYWxpZ24JNQorTCRhZGRfZG91YmxleDoKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjA2CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5OQorCWFkZHEJJDQxNiwlcnNwCisJam1wCUwkcG9pbnRfZG91YmxlX3Nob3J0Y3V0eAorCisucDJhbGlnbgk1CitMJGFkZF9wcm9jZWVkeDoKKwltb3ZxCTArNjQoJXJzcCksJXJkeAorCW1vdnEJOCs2NCglcnNwKSwlcjE0CisJbGVhcQktMTI4KzY0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzY0KCVyc3ApLCVyMTUKKwltb3ZxCTI0KzY0KCVyc3ApLCVyOAorCWxlYXEJOTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3ZxCTQ0OCglcnNwKSwlcmR4CisJbGVhcQk0NDgoJXJzcCksJXJieAorCW1vdnEJMCswKCVyc3ApLCVyOQorCW1vdnEJOCswKCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMCglcnNwKSwlcnNpCisJbW92cQkxNiswKCVyc3ApLCVyMTEKKwltb3ZxCTI0KzAoJXJzcCksJXIxMgorCWxlYXEJMzUyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQkwKzAoJXJzcCksJXJkeAorCW1vdnEJOCswKCVyc3ApLCVyMTQKKwlsZWFxCS0xMjgrMCglcnNwKSwlcnNpCisJbW92cQkxNiswKCVyc3ApLCVyMTUKKwltb3ZxCTI0KzAoJXJzcCksJXI4CisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCW1vdnEJNTQ0KCVyc3ApLCVyZHgKKwlsZWFxCTU0NCglcnNwKSwlcmJ4CisJbW92cQkwKzM1MiglcnNwKSwlcjkKKwltb3ZxCTgrMzUyKCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMzUyKCVyc3ApLCVyc2kKKwltb3ZxCTE2KzM1MiglcnNwKSwlcjExCisJbW92cQkyNCszNTIoJXJzcCksJXIxMgorCWxlYXEJMzUyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQkwKCVyc3ApLCVyZHgKKwlsZWFxCTAoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkxMjgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTE2MCglcnNwKSwlcmR4CisJbGVhcQkxNjAoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkxOTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKworCisKKwl4b3JxCSVyMTEsJXIxMQorCWFkZHEJJXIxMiwlcjEyCisJbGVhcQk5NiglcnNwKSwlcnNpCisJYWRjcQklcjEzLCVyMTMKKwltb3ZxCSVyMTIsJXJheAorCWFkY3EJJXI4LCVyOAorCWFkY3EJJXI5LCVyOQorCW1vdnEJJXIxMywlcmJwCisJYWRjcQkkMCwlcjExCisKKwlzdWJxCSQtMSwlcjEyCisJbW92cQklcjgsJXJjeAorCXNiYnEJJXIxNCwlcjEzCisJc2JicQkkMCwlcjgKKwltb3ZxCSVyOSwlcjEwCisJc2JicQklcjE1LCVyOQorCXNiYnEJJDAsJXIxMQorCisJY21vdmNxCSVyYXgsJXIxMgorCW1vdnEJMCglcnNpKSwlcmF4CisJY21vdmNxCSVyYnAsJXIxMworCW1vdnEJOCglcnNpKSwlcmJwCisJY21vdmNxCSVyY3gsJXI4CisJbW92cQkxNiglcnNpKSwlcmN4CisJY21vdmNxCSVyMTAsJXI5CisJbW92cQkyNCglcnNpKSwlcjEwCisKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YngKKworCWxlYXEJMTI4KCVyc3ApLCVyYngKKwlsZWFxCTI4OCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW1vdnEJMTkyKzAoJXJzcCksJXJheAorCW1vdnEJMTkyKzgoJXJzcCksJXJicAorCW1vdnEJMTkyKzE2KCVyc3ApLCVyY3gKKwltb3ZxCTE5MisyNCglcnNwKSwlcjEwCisJbGVhcQkzMjAoJXJzcCksJXJkaQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwltb3ZxCSVyMTIsMCglcmRpKQorCW1vdnEJJXIxMyw4KCVyZGkpCisJbW92cQklcjgsMTYoJXJkaSkKKwltb3ZxCSVyOSwyNCglcmRpKQorCW1vdnEJMTI4KCVyc3ApLCVyZHgKKwlsZWFxCTEyOCglcnNwKSwlcmJ4CisJbW92cQkwKzIyNCglcnNwKSwlcjkKKwltb3ZxCTgrMjI0KCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMjI0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzIyNCglcnNwKSwlcjExCisJbW92cQkyNCsyMjQoJXJzcCksJXIxMgorCWxlYXEJMjU2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQkzMjAoJXJzcCksJXJkeAorCWxlYXEJMzIwKCVyc3ApLCVyYngKKwltb3ZxCTArNjQoJXJzcCksJXI5CisJbW92cQk4KzY0KCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrNjQoJXJzcCksJXJzaQorCW1vdnEJMTYrNjQoJXJzcCksJXIxMQorCW1vdnEJMjQrNjQoJXJzcCksJXIxMgorCWxlYXEJMzIwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbGVhcQkyNTYoJXJzcCksJXJieAorCWxlYXEJMzIwKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5OQorCisJbW92ZHFhCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0xCisJcGFuZG4JMzUyKCVyc3ApLCV4bW0wCisJbW92ZHFhCSV4bW01LCV4bW0yCisJcGFuZG4JMzUyKzE2KCVyc3ApLCV4bW0xCisJbW92ZHFhCSV4bW01LCV4bW0zCisJcGFuZAk1NDQoJXJzcCksJXhtbTIKKwlwYW5kCTU0NCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCisJbW92ZHFhCSV4bW00LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0xCisJcGFuZG4JJXhtbTIsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKwlwYW5kbgkleG1tMywleG1tMQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhbmQJNDQ4KCVyc3ApLCV4bW0yCisJcGFuZAk0NDgrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKwltb3ZkcXUJJXhtbTIsNjQoJXJkaSkKKwltb3ZkcXUJJXhtbTMsODAoJXJkaSkKKworCW1vdmRxYQkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMQorCXBhbmRuCTI4OCglcnNwKSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMgorCXBhbmRuCTI4OCsxNiglcnNwKSwleG1tMQorCW1vdmRxYQkleG1tNSwleG1tMworCXBhbmQJNDgwKCVyc3ApLCV4bW0yCisJcGFuZAk0ODArMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMQorCXBhbmRuCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFuZG4JJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYW5kCTM4NCglcnNwKSwleG1tMgorCXBhbmQJMzg0KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisJbW92ZHF1CSV4bW0yLDAoJXJkaSkKKwltb3ZkcXUJJXhtbTMsMTYoJXJkaSkKKworCW1vdmRxYQkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMQorCXBhbmRuCTMyMCglcnNwKSwleG1tMAorCW1vdmRxYQkleG1tNSwleG1tMgorCXBhbmRuCTMyMCsxNiglcnNwKSwleG1tMQorCW1vdmRxYQkleG1tNSwleG1tMworCXBhbmQJNTEyKCVyc3ApLCV4bW0yCisJcGFuZAk1MTIrMTYoJXJzcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMQorCXBhbmRuCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFuZG4JJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYW5kCTQxNiglcnNwKSwleG1tMgorCXBhbmQJNDE2KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisJbW92ZHF1CSV4bW0yLDMyKCVyZGkpCisJbW92ZHF1CSV4bW0zLDQ4KCVyZGkpCisKK0wkYWRkX2RvbmV4OgorCWxlYXEJNTc2KzU2KCVyc3ApLCVyc2kKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYngKKworCW1vdnEJLTgoJXJzaSksJXJicAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJHBvaW50X2FkZHhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisucDJhbGlnbgk1CitlY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZXg6CisKK0wkcG9pbnRfYWRkX2FmZmluZXg6CisJcHVzaHEJJXJicAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJc3VicQkkNDgwKzgsJXJzcAorCitMJGFkZF9hZmZpbmV4X2JvZHk6CisKKwltb3ZkcXUJMCglcnNpKSwleG1tMAorCW1vdnEJJXJkeCwlcmJ4CisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJbW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJbW92ZHF1CTY0KCVyc2kpLCV4bW00CisJbW92ZHF1CTgwKCVyc2kpLCV4bW01CisJbW92cQk2NCswKCVyc2kpLCVyZHgKKwltb3ZxCTY0KzgoJXJzaSksJXIxNAorCW1vdnEJNjQrMTYoJXJzaSksJXIxNQorCW1vdnEJNjQrMjQoJXJzaSksJXI4CisJbW92ZHFhCSV4bW0wLDMyMCglcnNwKQorCW1vdmRxYQkleG1tMSwzMjArMTYoJXJzcCkKKwltb3ZkcWEJJXhtbTIsMzUyKCVyc3ApCisJbW92ZHFhCSV4bW0zLDM1MisxNiglcnNwKQorCW1vdmRxYQkleG1tNCwzODQoJXJzcCkKKwltb3ZkcWEJJXhtbTUsMzg0KzE2KCVyc3ApCisJcG9yCSV4bW00LCV4bW01CisKKwltb3ZkcXUJMCglcmJ4KSwleG1tMAorCXBzaHVmZAkkMHhiMSwleG1tNSwleG1tMworCW1vdmRxdQkxNiglcmJ4KSwleG1tMQorCW1vdmRxdQkzMiglcmJ4KSwleG1tMgorCXBvcgkleG1tMywleG1tNQorCW1vdmRxdQk0OCglcmJ4KSwleG1tMworCW1vdmRxYQkleG1tMCw0MTYoJXJzcCkKKwlwc2h1ZmQJJDB4MWUsJXhtbTUsJXhtbTQKKwltb3ZkcWEJJXhtbTEsNDE2KzE2KCVyc3ApCisJcG9yCSV4bW0wLCV4bW0xCisuYnl0ZQkxMDIsNzIsMTUsMTEwLDE5OQorCW1vdmRxYQkleG1tMiw0NDgoJXJzcCkKKwltb3ZkcWEJJXhtbTMsNDQ4KzE2KCVyc3ApCisJcG9yCSV4bW0yLCV4bW0zCisJcG9yCSV4bW00LCV4bW01CisJcHhvcgkleG1tNCwleG1tNAorCXBvcgkleG1tMSwleG1tMworCisJbGVhcQk2NC0xMjgoJXJzaSksJXJzaQorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwlwY21wZXFkCSV4bW00LCV4bW01CisJcHNodWZkCSQweGIxLCV4bW0zLCV4bW00CisJbW92cQkwKCVyYngpLCVyZHgKKworCW1vdnEJJXIxMiwlcjkKKwlwb3IJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTUsJXhtbTUKKwlwc2h1ZmQJJDB4MWUsJXhtbTQsJXhtbTMKKwltb3ZxCSVyMTMsJXIxMAorCXBvcgkleG1tMywleG1tNAorCXB4b3IJJXhtbTMsJXhtbTMKKwltb3ZxCSVyMTQsJXIxMQorCXBjbXBlcWQJJXhtbTMsJXhtbTQKKwlwc2h1ZmQJJDAsJXhtbTQsJXhtbTQKKworCWxlYXEJMzItMTI4KCVyc3ApLCVyc2kKKwltb3ZxCSVyMTUsJXIxMgorCWxlYXEJMCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYXEJMzIwKCVyc3ApLCVyYngKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJbW92cQkzODQoJXJzcCksJXJkeAorCWxlYXEJMzg0KCVyc3ApLCVyYngKKwltb3ZxCTArMzIoJXJzcCksJXI5CisJbW92cQk4KzMyKCVyc3ApLCVyMTAKKwlsZWFxCS0xMjgrMzIoJXJzcCksJXJzaQorCW1vdnEJMTYrMzIoJXJzcCksJXIxMQorCW1vdnEJMjQrMzIoJXJzcCksJXIxMgorCWxlYXEJMzIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTM4NCglcnNwKSwlcmR4CisJbGVhcQkzODQoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJLTEyOCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkyODgoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTQ0OCglcnNwKSwlcmR4CisJbGVhcQk0NDgoJXJzcCksJXJieAorCW1vdnEJMCszMiglcnNwKSwlcjkKKwltb3ZxCTgrMzIoJXJzcCksJXIxMAorCWxlYXEJLTEyOCszMiglcnNwKSwlcnNpCisJbW92cQkxNiszMiglcnNwKSwlcjExCisJbW92cQkyNCszMiglcnNwKSwlcjEyCisJbGVhcQkzMiglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYXEJMzUyKCVyc3ApLCVyYngKKwlsZWFxCTk2KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJbW92cQkwKzY0KCVyc3ApLCVyZHgKKwltb3ZxCTgrNjQoJXJzcCksJXIxNAorCWxlYXEJLTEyOCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjE1CisJbW92cQkyNCs2NCglcnNwKSwlcjgKKwlsZWFxCTEyOCglcnNwKSwlcmRpCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCW1vdnEJMCs5NiglcnNwKSwlcmR4CisJbW92cQk4Kzk2KCVyc3ApLCVyMTQKKwlsZWFxCS0xMjgrOTYoJXJzcCksJXJzaQorCW1vdnEJMTYrOTYoJXJzcCksJXIxNQorCW1vdnEJMjQrOTYoJXJzcCksJXI4CisJbGVhcQkxOTIoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3ZxCTEyOCglcnNwKSwlcmR4CisJbGVhcQkxMjgoJXJzcCksJXJieAorCW1vdnEJMCs2NCglcnNwKSwlcjkKKwltb3ZxCTgrNjQoJXJzcCksJXIxMAorCWxlYXEJLTEyOCs2NCglcnNwKSwlcnNpCisJbW92cQkxNis2NCglcnNwKSwlcjExCisJbW92cQkyNCs2NCglcnNwKSwlcjEyCisJbGVhcQkxNjAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3ZxCTMyMCglcnNwKSwlcmR4CisJbGVhcQkzMjAoJXJzcCksJXJieAorCW1vdnEJMCsxMjgoJXJzcCksJXI5CisJbW92cQk4KzEyOCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzEyOCglcnNwKSwlcnNpCisJbW92cQkxNisxMjgoJXJzcCksJXIxMQorCW1vdnEJMjQrMTI4KCVyc3ApLCVyMTIKKwlsZWFxCTAoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKworCisKKwl4b3JxCSVyMTEsJXIxMQorCWFkZHEJJXIxMiwlcjEyCisJbGVhcQkxOTIoJXJzcCksJXJzaQorCWFkY3EJJXIxMywlcjEzCisJbW92cQklcjEyLCVyYXgKKwlhZGNxCSVyOCwlcjgKKwlhZGNxCSVyOSwlcjkKKwltb3ZxCSVyMTMsJXJicAorCWFkY3EJJDAsJXIxMQorCisJc3VicQkkLTEsJXIxMgorCW1vdnEJJXI4LCVyY3gKKwlzYmJxCSVyMTQsJXIxMworCXNiYnEJJDAsJXI4CisJbW92cQklcjksJXIxMAorCXNiYnEJJXIxNSwlcjkKKwlzYmJxCSQwLCVyMTEKKworCWNtb3ZjcQklcmF4LCVyMTIKKwltb3ZxCTAoJXJzaSksJXJheAorCWNtb3ZjcQklcmJwLCVyMTMKKwltb3ZxCTgoJXJzaSksJXJicAorCWNtb3ZjcQklcmN4LCVyOAorCW1vdnEJMTYoJXJzaSksJXJjeAorCWNtb3ZjcQklcjEwLCVyOQorCW1vdnEJMjQoJXJzaSksJXIxMAorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwlsZWFxCTE2MCglcnNwKSwlcmJ4CisJbGVhcQkyMjQoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKwltb3ZxCTArMCglcnNwKSwlcmF4CisJbW92cQkwKzgoJXJzcCksJXJicAorCW1vdnEJMCsxNiglcnNwKSwlcmN4CisJbW92cQkwKzI0KCVyc3ApLCVyMTAKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VieAorCisJbW92cQklcjEyLDAoJXJkaSkKKwltb3ZxCSVyMTMsOCglcmRpKQorCW1vdnEJJXI4LDE2KCVyZGkpCisJbW92cQklcjksMjQoJXJkaSkKKwltb3ZxCTM1MiglcnNwKSwlcmR4CisJbGVhcQkzNTIoJXJzcCksJXJieAorCW1vdnEJMCsxNjAoJXJzcCksJXI5CisJbW92cQk4KzE2MCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzE2MCglcnNwKSwlcnNpCisJbW92cQkxNisxNjAoJXJzcCksJXIxMQorCW1vdnEJMjQrMTYwKCVyc3ApLCVyMTIKKwlsZWFxCTMyKCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92cQk5NiglcnNwKSwlcmR4CisJbGVhcQk5NiglcnNwKSwlcmJ4CisJbW92cQkwKzY0KCVyc3ApLCVyOQorCW1vdnEJOCs2NCglcnNwKSwlcjEwCisJbGVhcQktMTI4KzY0KCVyc3ApLCVyc2kKKwltb3ZxCTE2KzY0KCVyc3ApLCVyMTEKKwltb3ZxCTI0KzY0KCVyc3ApLCVyMTIKKwlsZWFxCTY0KCVyc3ApLCVyZGkKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbGVhcQkzMiglcnNwKSwlcmJ4CisJbGVhcQkyNTYoJXJzcCksJXJkaQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk5CisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyODgoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyODgrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCUwkT05FX21vbnQoJXJpcCksJXhtbTIKKwlwYW5kCUwkT05FX21vbnQrMTYoJXJpcCksJXhtbTMKKwlwb3IJJXhtbTAsJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTMKKworCW1vdmRxYQkleG1tNCwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMQorCXBhbmRuCSV4bW0yLCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFuZG4JJXhtbTMsJXhtbTEKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYW5kCTM4NCglcnNwKSwleG1tMgorCXBhbmQJMzg0KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisJbW92ZHF1CSV4bW0yLDY0KCVyZGkpCisJbW92ZHF1CSV4bW0zLDgwKCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyMjQoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyMjQrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTQxNiglcnNwKSwleG1tMgorCXBhbmQJNDE2KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzMjAoJXJzcCksJXhtbTIKKwlwYW5kCTMyMCsxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwwKCVyZGkpCisJbW92ZHF1CSV4bW0zLDE2KCVyZGkpCisKKwltb3ZkcWEJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTEKKwlwYW5kbgkyNTYoJXJzcCksJXhtbTAKKwltb3ZkcWEJJXhtbTUsJXhtbTIKKwlwYW5kbgkyNTYrMTYoJXJzcCksJXhtbTEKKwltb3ZkcWEJJXhtbTUsJXhtbTMKKwlwYW5kCTQ0OCglcnNwKSwleG1tMgorCXBhbmQJNDQ4KzE2KCVyc3ApLCV4bW0zCisJcG9yCSV4bW0wLCV4bW0yCisJcG9yCSV4bW0xLCV4bW0zCisKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKwlwYW5kbgkleG1tMiwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhbmRuCSV4bW0zLCV4bW0xCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFuZAkzNTIoJXJzcCksJXhtbTIKKwlwYW5kCTM1MisxNiglcnNwKSwleG1tMworCXBvcgkleG1tMCwleG1tMgorCXBvcgkleG1tMSwleG1tMworCW1vdmRxdQkleG1tMiwzMiglcmRpKQorCW1vdmRxdQkleG1tMyw0OCglcmRpKQorCisJbGVhcQk0ODArNTYoJXJzcCksJXJzaQorCisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJieAorCisJbW92cQktOCglcnNpKSwlcmJwCisKKwlsZWFxCSglcnNpKSwlcnNwCisKK0wkYWRkX2FmZmluZXhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcmRyYW5kLXg4Nl82NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JkcmFuZC14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMyMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JkcmFuZC14ODZfNjQuUwpAQCAtMCwwICsxLDUyIEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisKKworCisuZ2xvYmwJX0NSWVBUT19yZHJhbmQKKy5wcml2YXRlX2V4dGVybiBfQ1JZUFRPX3JkcmFuZAorCisucDJhbGlnbgk0CitfQ1JZUFRPX3JkcmFuZDoKKworCXhvcnEJJXJheCwlcmF4CisKKworLmJ5dGUJMHg0OCwgMHgwZiwgMHhjNywgMHhmMQorCisJYWRjcQklcmF4LCVyYXgKKwltb3ZxCSVyY3gsMCglcmRpKQorCS5ieXRlCTB4ZjMsMHhjMworCisKKworCisKKworLmdsb2JsCV9DUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYKKy5wcml2YXRlX2V4dGVybiBfQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmCisKKy5wMmFsaWduCTQKK19DUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWY6CisKKwl0ZXN0cQklcnNpLCVyc2kKKwlqeglMJG91dAorCW1vdnEJJDgsJXJkeAorTCRsb29wOgorCisKKy5ieXRlCTB4NDgsIDB4MGYsIDB4YzcsIDB4ZjEKKwlqbmMJTCRlcnIKKwltb3ZxCSVyY3gsMCglcmRpKQorCWFkZHEJJXJkeCwlcmRpCisJc3VicQklcmR4LCVyc2kKKwlqbnoJTCRsb29wCitMJG91dDoKKwltb3ZxCSQxLCVyYXgKKwkuYnl0ZQkweGYzLDB4YzMKK0wkZXJyOgorCXhvcnEJJXJheCwlcmF4CisJLmJ5dGUJMHhmMywweGMzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JzYXotYXZ4Mi5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JzYXotYXZ4Mi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmM5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcnNhei1hdngyLlMKQEAgLTAsMCArMSwxNzQ4IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisuZ2xvYmwJX3JzYXpfMTAyNF9zcXJfYXZ4MgorLnByaXZhdGVfZXh0ZXJuIF9yc2F6XzEwMjRfc3FyX2F2eDIKKworLnAyYWxpZ24JNgorX3JzYXpfMTAyNF9zcXJfYXZ4MjoKKworCWxlYXEJKCVyc3ApLCVyYXgKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXZ6ZXJvdXBwZXIKKwltb3ZxCSVyYXgsJXJicAorCisJbW92cQklcmR4LCVyMTMKKwlzdWJxCSQ4MzIsJXJzcAorCW1vdnEJJXIxMywlcjE1CisJc3VicQkkLTEyOCwlcmRpCisJc3VicQkkLTEyOCwlcnNpCisJc3VicQkkLTEyOCwlcjEzCisKKwlhbmRxCSQ0MDk1LCVyMTUKKwlhZGRxCSQzMjAsJXIxNQorCXNocnEJJDEyLCVyMTUKKwl2cHhvcgkleW1tOSwleW1tOSwleW1tOQorCWp6CUwkc3FyXzEwMjRfbm9fbl9jb3B5CisKKworCisKKworCXN1YnEJJDMyMCwlcnNwCisJdm1vdmRxdQkwLTEyOCglcjEzKSwleW1tMAorCWFuZHEJJC0yMDQ4LCVyc3AKKwl2bW92ZHF1CTMyLTEyOCglcjEzKSwleW1tMQorCXZtb3ZkcXUJNjQtMTI4KCVyMTMpLCV5bW0yCisJdm1vdmRxdQk5Ni0xMjgoJXIxMyksJXltbTMKKwl2bW92ZHF1CTEyOC0xMjgoJXIxMyksJXltbTQKKwl2bW92ZHF1CTE2MC0xMjgoJXIxMyksJXltbTUKKwl2bW92ZHF1CTE5Mi0xMjgoJXIxMyksJXltbTYKKwl2bW92ZHF1CTIyNC0xMjgoJXIxMyksJXltbTcKKwl2bW92ZHF1CTI1Ni0xMjgoJXIxMyksJXltbTgKKwlsZWFxCTgzMisxMjgoJXJzcCksJXIxMworCXZtb3ZkcXUJJXltbTAsMC0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW0xLDMyLTEyOCglcjEzKQorCXZtb3ZkcXUJJXltbTIsNjQtMTI4KCVyMTMpCisJdm1vdmRxdQkleW1tMyw5Ni0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW00LDEyOC0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW01LDE2MC0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW02LDE5Mi0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW03LDIyNC0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW04LDI1Ni0xMjgoJXIxMykKKwl2bW92ZHF1CSV5bW05LDI4OC0xMjgoJXIxMykKKworTCRzcXJfMTAyNF9ub19uX2NvcHk6CisJYW5kcQkkLTEwMjQsJXJzcAorCisJdm1vdmRxdQkzMi0xMjgoJXJzaSksJXltbTEKKwl2bW92ZHF1CTY0LTEyOCglcnNpKSwleW1tMgorCXZtb3ZkcXUJOTYtMTI4KCVyc2kpLCV5bW0zCisJdm1vdmRxdQkxMjgtMTI4KCVyc2kpLCV5bW00CisJdm1vdmRxdQkxNjAtMTI4KCVyc2kpLCV5bW01CisJdm1vdmRxdQkxOTItMTI4KCVyc2kpLCV5bW02CisJdm1vdmRxdQkyMjQtMTI4KCVyc2kpLCV5bW03CisJdm1vdmRxdQkyNTYtMTI4KCVyc2kpLCV5bW04CisKKwlsZWFxCTE5MiglcnNwKSwlcmJ4CisJdm1vdmRxdQlMJGFuZF9tYXNrKCVyaXApLCV5bW0xNQorCWptcAlMJE9PUF9HUkFOREVfU1FSXzEwMjQKKworLnAyYWxpZ24JNQorTCRPT1BfR1JBTkRFX1NRUl8xMDI0OgorCWxlYXEJNTc2KzEyOCglcnNwKSwlcjkKKwlsZWFxCTQ0OCglcnNwKSwlcjEyCisKKworCisKKwl2cGFkZHEJJXltbTEsJXltbTEsJXltbTEKKwl2cGJyb2FkY2FzdHEJMC0xMjgoJXJzaSksJXltbTEwCisJdnBhZGRxCSV5bW0yLCV5bW0yLCV5bW0yCisJdm1vdmRxYQkleW1tMSwwLTEyOCglcjkpCisJdnBhZGRxCSV5bW0zLCV5bW0zLCV5bW0zCisJdm1vdmRxYQkleW1tMiwzMi0xMjgoJXI5KQorCXZwYWRkcQkleW1tNCwleW1tNCwleW1tNAorCXZtb3ZkcWEJJXltbTMsNjQtMTI4KCVyOSkKKwl2cGFkZHEJJXltbTUsJXltbTUsJXltbTUKKwl2bW92ZHFhCSV5bW00LDk2LTEyOCglcjkpCisJdnBhZGRxCSV5bW02LCV5bW02LCV5bW02CisJdm1vdmRxYQkleW1tNSwxMjgtMTI4KCVyOSkKKwl2cGFkZHEJJXltbTcsJXltbTcsJXltbTcKKwl2bW92ZHFhCSV5bW02LDE2MC0xMjgoJXI5KQorCXZwYWRkcQkleW1tOCwleW1tOCwleW1tOAorCXZtb3ZkcWEJJXltbTcsMTkyLTEyOCglcjkpCisJdnB4b3IJJXltbTksJXltbTksJXltbTkKKwl2bW92ZHFhCSV5bW04LDIyNC0xMjgoJXI5KQorCisJdnBtdWx1ZHEJMC0xMjgoJXJzaSksJXltbTEwLCV5bW0wCisJdnBicm9hZGNhc3RxCTMyLTEyOCglcnNpKSwleW1tMTEKKwl2bW92ZHF1CSV5bW05LDI4OC0xOTIoJXJieCkKKwl2cG11bHVkcQkleW1tMTAsJXltbTEsJXltbTEKKwl2bW92ZHF1CSV5bW05LDMyMC00NDgoJXIxMikKKwl2cG11bHVkcQkleW1tMTAsJXltbTIsJXltbTIKKwl2bW92ZHF1CSV5bW05LDM1Mi00NDgoJXIxMikKKwl2cG11bHVkcQkleW1tMTAsJXltbTMsJXltbTMKKwl2bW92ZHF1CSV5bW05LDM4NC00NDgoJXIxMikKKwl2cG11bHVkcQkleW1tMTAsJXltbTQsJXltbTQKKwl2bW92ZHF1CSV5bW05LDQxNi00NDgoJXIxMikKKwl2cG11bHVkcQkleW1tMTAsJXltbTUsJXltbTUKKwl2bW92ZHF1CSV5bW05LDQ0OC00NDgoJXIxMikKKwl2cG11bHVkcQkleW1tMTAsJXltbTYsJXltbTYKKwl2bW92ZHF1CSV5bW05LDQ4MC00NDgoJXIxMikKKwl2cG11bHVkcQkleW1tMTAsJXltbTcsJXltbTcKKwl2bW92ZHF1CSV5bW05LDUxMi00NDgoJXIxMikKKwl2cG11bHVkcQkleW1tMTAsJXltbTgsJXltbTgKKwl2cGJyb2FkY2FzdHEJNjQtMTI4KCVyc2kpLCV5bW0xMAorCXZtb3ZkcXUJJXltbTksNTQ0LTQ0OCglcjEyKQorCisJbW92cQklcnNpLCVyMTUKKwltb3ZsCSQ0LCVyMTRkCisJam1wCUwkc3FyX2VudHJ5XzEwMjQKKy5wMmFsaWduCTUKK0wkT09QX1NRUl8xMDI0OgorCXZwYnJvYWRjYXN0cQkzMi0xMjgoJXIxNSksJXltbTExCisJdnBtdWx1ZHEJMC0xMjgoJXJzaSksJXltbTEwLCV5bW0wCisJdnBhZGRxCTAtMTkyKCVyYngpLCV5bW0wLCV5bW0wCisJdnBtdWx1ZHEJMC0xMjgoJXI5KSwleW1tMTAsJXltbTEKKwl2cGFkZHEJMzItMTkyKCVyYngpLCV5bW0xLCV5bW0xCisJdnBtdWx1ZHEJMzItMTI4KCVyOSksJXltbTEwLCV5bW0yCisJdnBhZGRxCTY0LTE5MiglcmJ4KSwleW1tMiwleW1tMgorCXZwbXVsdWRxCTY0LTEyOCglcjkpLCV5bW0xMCwleW1tMworCXZwYWRkcQk5Ni0xOTIoJXJieCksJXltbTMsJXltbTMKKwl2cG11bHVkcQk5Ni0xMjgoJXI5KSwleW1tMTAsJXltbTQKKwl2cGFkZHEJMTI4LTE5MiglcmJ4KSwleW1tNCwleW1tNAorCXZwbXVsdWRxCTEyOC0xMjgoJXI5KSwleW1tMTAsJXltbTUKKwl2cGFkZHEJMTYwLTE5MiglcmJ4KSwleW1tNSwleW1tNQorCXZwbXVsdWRxCTE2MC0xMjgoJXI5KSwleW1tMTAsJXltbTYKKwl2cGFkZHEJMTkyLTE5MiglcmJ4KSwleW1tNiwleW1tNgorCXZwbXVsdWRxCTE5Mi0xMjgoJXI5KSwleW1tMTAsJXltbTcKKwl2cGFkZHEJMjI0LTE5MiglcmJ4KSwleW1tNywleW1tNworCXZwbXVsdWRxCTIyNC0xMjgoJXI5KSwleW1tMTAsJXltbTgKKwl2cGJyb2FkY2FzdHEJNjQtMTI4KCVyMTUpLCV5bW0xMAorCXZwYWRkcQkyNTYtMTkyKCVyYngpLCV5bW04LCV5bW04CitMJHNxcl9lbnRyeV8xMDI0OgorCXZtb3ZkcXUJJXltbTAsMC0xOTIoJXJieCkKKwl2bW92ZHF1CSV5bW0xLDMyLTE5MiglcmJ4KQorCisJdnBtdWx1ZHEJMzItMTI4KCVyc2kpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJMzItMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTMsJXltbTMKKwl2cG11bHVkcQk2NC0xMjgoJXI5KSwleW1tMTEsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tNCwleW1tNAorCXZwbXVsdWRxCTk2LTEyOCglcjkpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJMTI4LTEyOCglcjkpLCV5bW0xMSwleW1tMTQKKwl2cGFkZHEJJXltbTE0LCV5bW02LCV5bW02CisJdnBtdWx1ZHEJMTYwLTEyOCglcjkpLCV5bW0xMSwleW1tMTMKKwl2cGFkZHEJJXltbTEzLCV5bW03LCV5bW03CisJdnBtdWx1ZHEJMTkyLTEyOCglcjkpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW04LCV5bW04CisJdnBtdWx1ZHEJMjI0LTEyOCglcjkpLCV5bW0xMSwleW1tMAorCXZwYnJvYWRjYXN0cQk5Ni0xMjgoJXIxNSksJXltbTExCisJdnBhZGRxCTI4OC0xOTIoJXJieCksJXltbTAsJXltbTAKKworCXZtb3ZkcXUJJXltbTIsNjQtMTkyKCVyYngpCisJdm1vdmRxdQkleW1tMyw5Ni0xOTIoJXJieCkKKworCXZwbXVsdWRxCTY0LTEyOCglcnNpKSwleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tNCwleW1tNAorCXZwbXVsdWRxCTY0LTEyOCglcjkpLCV5bW0xMCwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW01CisJdnBtdWx1ZHEJOTYtMTI4KCVyOSksJXltbTEwLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTYsJXltbTYKKwl2cG11bHVkcQkxMjgtMTI4KCVyOSksJXltbTEwLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTcsJXltbTcKKwl2cG11bHVkcQkxNjAtMTI4KCVyOSksJXltbTEwLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTgsJXltbTgKKwl2cG11bHVkcQkxOTItMTI4KCVyOSksJXltbTEwLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTAsJXltbTAKKwl2cG11bHVkcQkyMjQtMTI4KCVyOSksJXltbTEwLCV5bW0xCisJdnBicm9hZGNhc3RxCTEyOC0xMjgoJXIxNSksJXltbTEwCisJdnBhZGRxCTMyMC00NDgoJXIxMiksJXltbTEsJXltbTEKKworCXZtb3ZkcXUJJXltbTQsMTI4LTE5MiglcmJ4KQorCXZtb3ZkcXUJJXltbTUsMTYwLTE5MiglcmJ4KQorCisJdnBtdWx1ZHEJOTYtMTI4KCVyc2kpLCV5bW0xMSwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJOTYtMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTcsJXltbTcKKwl2cG11bHVkcQkxMjgtMTI4KCVyOSksJXltbTExLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTgsJXltbTgKKwl2cG11bHVkcQkxNjAtMTI4KCVyOSksJXltbTExLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTAsJXltbTAKKwl2cG11bHVkcQkxOTItMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTEsJXltbTEKKwl2cG11bHVkcQkyMjQtMTI4KCVyOSksJXltbTExLCV5bW0yCisJdnBicm9hZGNhc3RxCTE2MC0xMjgoJXIxNSksJXltbTExCisJdnBhZGRxCTM1Mi00NDgoJXIxMiksJXltbTIsJXltbTIKKworCXZtb3ZkcXUJJXltbTYsMTkyLTE5MiglcmJ4KQorCXZtb3ZkcXUJJXltbTcsMjI0LTE5MiglcmJ4KQorCisJdnBtdWx1ZHEJMTI4LTEyOCglcnNpKSwleW1tMTAsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tOCwleW1tOAorCXZwbXVsdWRxCTEyOC0xMjgoJXI5KSwleW1tMTAsJXltbTE0CisJdnBhZGRxCSV5bW0xNCwleW1tMCwleW1tMAorCXZwbXVsdWRxCTE2MC0xMjgoJXI5KSwleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tMSwleW1tMQorCXZwbXVsdWRxCTE5Mi0xMjgoJXI5KSwleW1tMTAsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tMiwleW1tMgorCXZwbXVsdWRxCTIyNC0xMjgoJXI5KSwleW1tMTAsJXltbTMKKwl2cGJyb2FkY2FzdHEJMTkyLTEyOCglcjE1KSwleW1tMTAKKwl2cGFkZHEJMzg0LTQ0OCglcjEyKSwleW1tMywleW1tMworCisJdm1vdmRxdQkleW1tOCwyNTYtMTkyKCVyYngpCisJdm1vdmRxdQkleW1tMCwyODgtMTkyKCVyYngpCisJbGVhcQk4KCVyYngpLCVyYngKKworCXZwbXVsdWRxCTE2MC0xMjgoJXJzaSksJXltbTExLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTEsJXltbTEKKwl2cG11bHVkcQkxNjAtMTI4KCVyOSksJXltbTExLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTIsJXltbTIKKwl2cG11bHVkcQkxOTItMTI4KCVyOSksJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTQsJXltbTMsJXltbTMKKwl2cG11bHVkcQkyMjQtMTI4KCVyOSksJXltbTExLCV5bW00CisJdnBicm9hZGNhc3RxCTIyNC0xMjgoJXIxNSksJXltbTExCisJdnBhZGRxCTQxNi00NDgoJXIxMiksJXltbTQsJXltbTQKKworCXZtb3ZkcXUJJXltbTEsMzIwLTQ0OCglcjEyKQorCXZtb3ZkcXUJJXltbTIsMzUyLTQ0OCglcjEyKQorCisJdnBtdWx1ZHEJMTkyLTEyOCglcnNpKSwleW1tMTAsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tMywleW1tMworCXZwbXVsdWRxCTE5Mi0xMjgoJXI5KSwleW1tMTAsJXltbTE0CisJdnBicm9hZGNhc3RxCTI1Ni0xMjgoJXIxNSksJXltbTAKKwl2cGFkZHEJJXltbTE0LCV5bW00LCV5bW00CisJdnBtdWx1ZHEJMjI0LTEyOCglcjkpLCV5bW0xMCwleW1tNQorCXZwYnJvYWRjYXN0cQkwKzgtMTI4KCVyMTUpLCV5bW0xMAorCXZwYWRkcQk0NDgtNDQ4KCVyMTIpLCV5bW01LCV5bW01CisKKwl2bW92ZHF1CSV5bW0zLDM4NC00NDgoJXIxMikKKwl2bW92ZHF1CSV5bW00LDQxNi00NDgoJXIxMikKKwlsZWFxCTgoJXIxNSksJXIxNQorCisJdnBtdWx1ZHEJMjI0LTEyOCglcnNpKSwleW1tMTEsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwbXVsdWRxCTIyNC0xMjgoJXI5KSwleW1tMTEsJXltbTYKKwl2cGFkZHEJNDgwLTQ0OCglcjEyKSwleW1tNiwleW1tNgorCisJdnBtdWx1ZHEJMjU2LTEyOCglcnNpKSwleW1tMCwleW1tNworCXZtb3ZkcXUJJXltbTUsNDQ4LTQ0OCglcjEyKQorCXZwYWRkcQk1MTItNDQ4KCVyMTIpLCV5bW03LCV5bW03CisJdm1vdmRxdQkleW1tNiw0ODAtNDQ4KCVyMTIpCisJdm1vdmRxdQkleW1tNyw1MTItNDQ4KCVyMTIpCisJbGVhcQk4KCVyMTIpLCVyMTIKKworCWRlY2wJJXIxNGQKKwlqbnoJTCRPT1BfU1FSXzEwMjQKKworCXZtb3ZkcXUJMjU2KCVyc3ApLCV5bW04CisJdm1vdmRxdQkyODgoJXJzcCksJXltbTEKKwl2bW92ZHF1CTMyMCglcnNwKSwleW1tMgorCWxlYXEJMTkyKCVyc3ApLCVyYngKKworCXZwc3JscQkkMjksJXltbTgsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW04LCV5bW04CisJdnBzcmxxCSQyOSwleW1tMSwleW1tMTEKKwl2cGFuZAkleW1tMTUsJXltbTEsJXltbTEKKworCXZwZXJtcQkkMHg5MywleW1tMTQsJXltbTE0CisJdnB4b3IJJXltbTksJXltbTksJXltbTkKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCisJdnBibGVuZGQJJDMsJXltbTksJXltbTE0LCV5bW0xMAorCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTEsJXltbTE0CisJdnBhZGRxCSV5bW0xMCwleW1tOCwleW1tOAorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tOSwleW1tMTEKKwl2cGFkZHEJJXltbTE0LCV5bW0xLCV5bW0xCisJdnBhZGRxCSV5bW0xMSwleW1tMiwleW1tMgorCXZtb3ZkcXUJJXltbTEsMjg4LTE5MiglcmJ4KQorCXZtb3ZkcXUJJXltbTIsMzIwLTE5MiglcmJ4KQorCisJbW92cQkoJXJzcCksJXJheAorCW1vdnEJOCglcnNwKSwlcjEwCisJbW92cQkxNiglcnNwKSwlcjExCisJbW92cQkyNCglcnNwKSwlcjEyCisJdm1vdmRxdQkzMiglcnNwKSwleW1tMQorCXZtb3ZkcXUJNjQtMTkyKCVyYngpLCV5bW0yCisJdm1vdmRxdQk5Ni0xOTIoJXJieCksJXltbTMKKwl2bW92ZHF1CTEyOC0xOTIoJXJieCksJXltbTQKKwl2bW92ZHF1CTE2MC0xOTIoJXJieCksJXltbTUKKwl2bW92ZHF1CTE5Mi0xOTIoJXJieCksJXltbTYKKwl2bW92ZHF1CTIyNC0xOTIoJXJieCksJXltbTcKKworCW1vdnEJJXJheCwlcjkKKwlpbXVsbAklZWN4LCVlYXgKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKwl2bW92ZAklZWF4LCV4bW0xMgorCisJbW92cQklcmF4LCVyZHgKKwlpbXVscQktMTI4KCVyMTMpLCVyYXgKKwl2cGJyb2FkY2FzdHEJJXhtbTEyLCV5bW0xMgorCWFkZHEJJXJheCwlcjkKKwltb3ZxCSVyZHgsJXJheAorCWltdWxxCTgtMTI4KCVyMTMpLCVyYXgKKwlzaHJxCSQyOSwlcjkKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJMTYtMTI4KCVyMTMpLCVyYXgKKwlhZGRxCSVyOSwlcjEwCisJYWRkcQklcmF4LCVyMTEKKwlpbXVscQkyNC0xMjgoJXIxMyksJXJkeAorCWFkZHEJJXJkeCwlcjEyCisKKwltb3ZxCSVyMTAsJXJheAorCWltdWxsCSVlY3gsJWVheAorCWFuZGwJJDB4MWZmZmZmZmYsJWVheAorCisJbW92bAkkOSwlcjE0ZAorCWptcAlMJE9PUF9SRURVQ0VfMTAyNAorCisucDJhbGlnbgk1CitMJE9PUF9SRURVQ0VfMTAyNDoKKwl2bW92ZAklZWF4LCV4bW0xMworCXZwYnJvYWRjYXN0cQkleG1tMTMsJXltbTEzCisKKwl2cG11bHVkcQkzMi0xMjgoJXIxMyksJXltbTEyLCV5bW0xMAorCW1vdnEJJXJheCwlcmR4CisJaW11bHEJLTEyOCglcjEzKSwlcmF4CisJdnBhZGRxCSV5bW0xMCwleW1tMSwleW1tMQorCWFkZHEJJXJheCwlcjEwCisJdnBtdWx1ZHEJNjQtMTI4KCVyMTMpLCV5bW0xMiwleW1tMTQKKwltb3ZxCSVyZHgsJXJheAorCWltdWxxCTgtMTI4KCVyMTMpLCVyYXgKKwl2cGFkZHEJJXltbTE0LCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJOTYtMTI4KCVyMTMpLCV5bW0xMiwleW1tMTEKKy5ieXRlCTB4NjcKKwlhZGRxCSVyYXgsJXIxMQorLmJ5dGUJMHg2NworCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJMTYtMTI4KCVyMTMpLCVyYXgKKwlzaHJxCSQyOSwlcjEwCisJdnBhZGRxCSV5bW0xMSwleW1tMywleW1tMworCXZwbXVsdWRxCTEyOC0xMjgoJXIxMyksJXltbTEyLCV5bW0xMAorCWFkZHEJJXJheCwlcjEyCisJYWRkcQklcjEwLCVyMTEKKwl2cGFkZHEJJXltbTEwLCV5bW00LCV5bW00CisJdnBtdWx1ZHEJMTYwLTEyOCglcjEzKSwleW1tMTIsJXltbTE0CisJbW92cQklcjExLCVyYXgKKwlpbXVsbAklZWN4LCVlYXgKKwl2cGFkZHEJJXltbTE0LCV5bW01LCV5bW01CisJdnBtdWx1ZHEJMTkyLTEyOCglcjEzKSwleW1tMTIsJXltbTExCisJYW5kbAkkMHgxZmZmZmZmZiwlZWF4CisJdnBhZGRxCSV5bW0xMSwleW1tNiwleW1tNgorCXZwbXVsdWRxCTIyNC0xMjgoJXIxMyksJXltbTEyLCV5bW0xMAorCXZwYWRkcQkleW1tMTAsJXltbTcsJXltbTcKKwl2cG11bHVkcQkyNTYtMTI4KCVyMTMpLCV5bW0xMiwleW1tMTQKKwl2bW92ZAklZWF4LCV4bW0xMgorCisJdnBhZGRxCSV5bW0xNCwleW1tOCwleW1tOAorCisJdnBicm9hZGNhc3RxCSV4bW0xMiwleW1tMTIKKworCXZwbXVsdWRxCTMyLTgtMTI4KCVyMTMpLCV5bW0xMywleW1tMTEKKwl2bW92ZHF1CTk2LTgtMTI4KCVyMTMpLCV5bW0xNAorCW1vdnEJJXJheCwlcmR4CisJaW11bHEJLTEyOCglcjEzKSwlcmF4CisJdnBhZGRxCSV5bW0xMSwleW1tMSwleW1tMQorCXZwbXVsdWRxCTY0LTgtMTI4KCVyMTMpLCV5bW0xMywleW1tMTAKKwl2bW92ZHF1CTEyOC04LTEyOCglcjEzKSwleW1tMTEKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJOC0xMjgoJXIxMyksJXJheAorCXZwYWRkcQkleW1tMTAsJXltbTIsJXltbTIKKwlhZGRxCSVyMTIsJXJheAorCXNocnEJJDI5LCVyMTEKKwl2cG11bHVkcQkleW1tMTMsJXltbTE0LCV5bW0xNAorCXZtb3ZkcXUJMTYwLTgtMTI4KCVyMTMpLCV5bW0xMAorCWFkZHEJJXIxMSwlcmF4CisJdnBhZGRxCSV5bW0xNCwleW1tMywleW1tMworCXZwbXVsdWRxCSV5bW0xMywleW1tMTEsJXltbTExCisJdm1vdmRxdQkxOTItOC0xMjgoJXIxMyksJXltbTE0CisuYnl0ZQkweDY3CisJbW92cQklcmF4LCVyMTIKKwlpbXVsbAklZWN4LCVlYXgKKwl2cGFkZHEJJXltbTExLCV5bW00LCV5bW00CisJdnBtdWx1ZHEJJXltbTEzLCV5bW0xMCwleW1tMTAKKy5ieXRlCTB4YzQsMHg0MSwweDdlLDB4NmYsMHg5ZCwweDU4LDB4MDAsMHgwMCwweDAwCisJYW5kbAkkMHgxZmZmZmZmZiwlZWF4CisJdnBhZGRxCSV5bW0xMCwleW1tNSwleW1tNQorCXZwbXVsdWRxCSV5bW0xMywleW1tMTQsJXltbTE0CisJdm1vdmRxdQkyNTYtOC0xMjgoJXIxMyksJXltbTEwCisJdnBhZGRxCSV5bW0xNCwleW1tNiwleW1tNgorCXZwbXVsdWRxCSV5bW0xMywleW1tMTEsJXltbTExCisJdm1vdmRxdQkyODgtOC0xMjgoJXIxMyksJXltbTkKKwl2bW92ZAklZWF4LCV4bW0wCisJaW11bHEJLTEyOCglcjEzKSwlcmF4CisJdnBhZGRxCSV5bW0xMSwleW1tNywleW1tNworCXZwbXVsdWRxCSV5bW0xMywleW1tMTAsJXltbTEwCisJdm1vdmRxdQkzMi0xNi0xMjgoJXIxMyksJXltbTE0CisJdnBicm9hZGNhc3RxCSV4bW0wLCV5bW0wCisJdnBhZGRxCSV5bW0xMCwleW1tOCwleW1tOAorCXZwbXVsdWRxCSV5bW0xMywleW1tOSwleW1tOQorCXZtb3ZkcXUJNjQtMTYtMTI4KCVyMTMpLCV5bW0xMQorCWFkZHEJJXJheCwlcjEyCisKKwl2bW92ZHF1CTMyLTI0LTEyOCglcjEzKSwleW1tMTMKKwl2cG11bHVkcQkleW1tMTIsJXltbTE0LCV5bW0xNAorCXZtb3ZkcXUJOTYtMTYtMTI4KCVyMTMpLCV5bW0xMAorCXZwYWRkcQkleW1tMTQsJXltbTEsJXltbTEKKwl2cG11bHVkcQkleW1tMCwleW1tMTMsJXltbTEzCisJdnBtdWx1ZHEJJXltbTEyLCV5bW0xMSwleW1tMTEKKy5ieXRlCTB4YzQsMHg0MSwweDdlLDB4NmYsMHhiNSwweGYwLDB4ZmYsMHhmZiwweGZmCisJdnBhZGRxCSV5bW0xLCV5bW0xMywleW1tMTMKKwl2cGFkZHEJJXltbTExLCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJJXltbTEyLCV5bW0xMCwleW1tMTAKKwl2bW92ZHF1CTE2MC0xNi0xMjgoJXIxMyksJXltbTExCisuYnl0ZQkweDY3CisJdm1vdnEJJXhtbTEzLCVyYXgKKwl2bW92ZHF1CSV5bW0xMywoJXJzcCkKKwl2cGFkZHEJJXltbTEwLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJJXltbTEyLCV5bW0xNCwleW1tMTQKKwl2bW92ZHF1CTE5Mi0xNi0xMjgoJXIxMyksJXltbTEwCisJdnBhZGRxCSV5bW0xNCwleW1tNCwleW1tNAorCXZwbXVsdWRxCSV5bW0xMiwleW1tMTEsJXltbTExCisJdm1vdmRxdQkyMjQtMTYtMTI4KCVyMTMpLCV5bW0xNAorCXZwYWRkcQkleW1tMTEsJXltbTUsJXltbTUKKwl2cG11bHVkcQkleW1tMTIsJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJMjU2LTE2LTEyOCglcjEzKSwleW1tMTEKKwl2cGFkZHEJJXltbTEwLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJJXltbTEyLCV5bW0xNCwleW1tMTQKKwlzaHJxCSQyOSwlcjEyCisJdm1vdmRxdQkyODgtMTYtMTI4KCVyMTMpLCV5bW0xMAorCWFkZHEJJXIxMiwlcmF4CisJdnBhZGRxCSV5bW0xNCwleW1tNywleW1tNworCXZwbXVsdWRxCSV5bW0xMiwleW1tMTEsJXltbTExCisKKwltb3ZxCSVyYXgsJXI5CisJaW11bGwJJWVjeCwlZWF4CisJdnBhZGRxCSV5bW0xMSwleW1tOCwleW1tOAorCXZwbXVsdWRxCSV5bW0xMiwleW1tMTAsJXltbTEwCisJYW5kbAkkMHgxZmZmZmZmZiwlZWF4CisJdm1vdmQJJWVheCwleG1tMTIKKwl2bW92ZHF1CTk2LTI0LTEyOCglcjEzKSwleW1tMTEKKy5ieXRlCTB4NjcKKwl2cGFkZHEJJXltbTEwLCV5bW05LCV5bW05CisJdnBicm9hZGNhc3RxCSV4bW0xMiwleW1tMTIKKworCXZwbXVsdWRxCTY0LTI0LTEyOCglcjEzKSwleW1tMCwleW1tMTQKKwl2bW92ZHF1CTEyOC0yNC0xMjgoJXIxMyksJXltbTEwCisJbW92cQklcmF4LCVyZHgKKwlpbXVscQktMTI4KCVyMTMpLCVyYXgKKwltb3ZxCTgoJXJzcCksJXIxMAorCXZwYWRkcQkleW1tMTQsJXltbTIsJXltbTEKKwl2cG11bHVkcQkleW1tMCwleW1tMTEsJXltbTExCisJdm1vdmRxdQkxNjAtMjQtMTI4KCVyMTMpLCV5bW0xNAorCWFkZHEJJXJheCwlcjkKKwltb3ZxCSVyZHgsJXJheAorCWltdWxxCTgtMTI4KCVyMTMpLCVyYXgKKy5ieXRlCTB4NjcKKwlzaHJxCSQyOSwlcjkKKwltb3ZxCTE2KCVyc3ApLCVyMTEKKwl2cGFkZHEJJXltbTExLCV5bW0zLCV5bW0yCisJdnBtdWx1ZHEJJXltbTAsJXltbTEwLCV5bW0xMAorCXZtb3ZkcXUJMTkyLTI0LTEyOCglcjEzKSwleW1tMTEKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJMTYtMTI4KCVyMTMpLCVyYXgKKwl2cGFkZHEJJXltbTEwLCV5bW00LCV5bW0zCisJdnBtdWx1ZHEJJXltbTAsJXltbTE0LCV5bW0xNAorCXZtb3ZkcXUJMjI0LTI0LTEyOCglcjEzKSwleW1tMTAKKwlpbXVscQkyNC0xMjgoJXIxMyksJXJkeAorCWFkZHEJJXJheCwlcjExCisJbGVhcQkoJXI5LCVyMTAsMSksJXJheAorCXZwYWRkcQkleW1tMTQsJXltbTUsJXltbTQKKwl2cG11bHVkcQkleW1tMCwleW1tMTEsJXltbTExCisJdm1vdmRxdQkyNTYtMjQtMTI4KCVyMTMpLCV5bW0xNAorCW1vdnEJJXJheCwlcjEwCisJaW11bGwJJWVjeCwlZWF4CisJdnBtdWx1ZHEJJXltbTAsJXltbTEwLCV5bW0xMAorCXZwYWRkcQkleW1tMTEsJXltbTYsJXltbTUKKwl2bW92ZHF1CTI4OC0yNC0xMjgoJXIxMyksJXltbTExCisJYW5kbAkkMHgxZmZmZmZmZiwlZWF4CisJdnBhZGRxCSV5bW0xMCwleW1tNywleW1tNgorCXZwbXVsdWRxCSV5bW0wLCV5bW0xNCwleW1tMTQKKwlhZGRxCTI0KCVyc3ApLCVyZHgKKwl2cGFkZHEJJXltbTE0LCV5bW04LCV5bW03CisJdnBtdWx1ZHEJJXltbTAsJXltbTExLCV5bW0xMQorCXZwYWRkcQkleW1tMTEsJXltbTksJXltbTgKKwl2bW92cQklcjEyLCV4bW05CisJbW92cQklcmR4LCVyMTIKKworCWRlY2wJJXIxNGQKKwlqbnoJTCRPT1BfUkVEVUNFXzEwMjQKKwlsZWFxCTQ0OCglcnNwKSwlcjEyCisJdnBhZGRxCSV5bW05LCV5bW0xMywleW1tMAorCXZweG9yCSV5bW05LCV5bW05LCV5bW05CisKKwl2cGFkZHEJMjg4LTE5MiglcmJ4KSwleW1tMCwleW1tMAorCXZwYWRkcQkzMjAtNDQ4KCVyMTIpLCV5bW0xLCV5bW0xCisJdnBhZGRxCTM1Mi00NDgoJXIxMiksJXltbTIsJXltbTIKKwl2cGFkZHEJMzg0LTQ0OCglcjEyKSwleW1tMywleW1tMworCXZwYWRkcQk0MTYtNDQ4KCVyMTIpLCV5bW00LCV5bW00CisJdnBhZGRxCTQ0OC00NDgoJXIxMiksJXltbTUsJXltbTUKKwl2cGFkZHEJNDgwLTQ0OCglcjEyKSwleW1tNiwleW1tNgorCXZwYWRkcQk1MTItNDQ4KCVyMTIpLCV5bW03LCV5bW03CisJdnBhZGRxCTU0NC00NDgoJXIxMiksJXltbTgsJXltbTgKKworCXZwc3JscQkkMjksJXltbTAsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW0wLCV5bW0wCisJdnBzcmxxCSQyOSwleW1tMSwleW1tMTEKKwl2cGFuZAkleW1tMTUsJXltbTEsJXltbTEKKwl2cHNybHEJJDI5LCV5bW0yLCV5bW0xMgorCXZwZXJtcQkkMHg5MywleW1tMTQsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW0yLCV5bW0yCisJdnBzcmxxCSQyOSwleW1tMywleW1tMTMKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCXZwYW5kCSV5bW0xNSwleW1tMywleW1tMworCXZwZXJtcQkkMHg5MywleW1tMTIsJXltbTEyCisKKwl2cGJsZW5kZAkkMywleW1tOSwleW1tMTQsJXltbTEwCisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKwl2cGJsZW5kZAkkMywleW1tMTQsJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTAsJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTEsJXltbTEyLCV5bW0xMQorCXZwYWRkcQkleW1tMTQsJXltbTEsJXltbTEKKwl2cGJsZW5kZAkkMywleW1tMTIsJXltbTEzLCV5bW0xMgorCXZwYWRkcQkleW1tMTEsJXltbTIsJXltbTIKKwl2cGJsZW5kZAkkMywleW1tMTMsJXltbTksJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tMywleW1tMworCXZwYWRkcQkleW1tMTMsJXltbTQsJXltbTQKKworCXZwc3JscQkkMjksJXltbTAsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW0wLCV5bW0wCisJdnBzcmxxCSQyOSwleW1tMSwleW1tMTEKKwl2cGFuZAkleW1tMTUsJXltbTEsJXltbTEKKwl2cHNybHEJJDI5LCV5bW0yLCV5bW0xMgorCXZwZXJtcQkkMHg5MywleW1tMTQsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW0yLCV5bW0yCisJdnBzcmxxCSQyOSwleW1tMywleW1tMTMKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCXZwYW5kCSV5bW0xNSwleW1tMywleW1tMworCXZwZXJtcQkkMHg5MywleW1tMTIsJXltbTEyCisKKwl2cGJsZW5kZAkkMywleW1tOSwleW1tMTQsJXltbTEwCisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKwl2cGJsZW5kZAkkMywleW1tMTQsJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTAsJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTEsJXltbTEyLCV5bW0xMQorCXZwYWRkcQkleW1tMTQsJXltbTEsJXltbTEKKwl2bW92ZHF1CSV5bW0wLDAtMTI4KCVyZGkpCisJdnBibGVuZGQJJDMsJXltbTEyLCV5bW0xMywleW1tMTIKKwl2cGFkZHEJJXltbTExLCV5bW0yLCV5bW0yCisJdm1vdmRxdQkleW1tMSwzMi0xMjgoJXJkaSkKKwl2cGJsZW5kZAkkMywleW1tMTMsJXltbTksJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tMywleW1tMworCXZtb3ZkcXUJJXltbTIsNjQtMTI4KCVyZGkpCisJdnBhZGRxCSV5bW0xMywleW1tNCwleW1tNAorCXZtb3ZkcXUJJXltbTMsOTYtMTI4KCVyZGkpCisJdnBzcmxxCSQyOSwleW1tNCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTQsJXltbTQKKwl2cHNybHEJJDI5LCV5bW01LCV5bW0xMQorCXZwYW5kCSV5bW0xNSwleW1tNSwleW1tNQorCXZwc3JscQkkMjksJXltbTYsJXltbTEyCisJdnBlcm1xCSQweDkzLCV5bW0xNCwleW1tMTQKKwl2cGFuZAkleW1tMTUsJXltbTYsJXltbTYKKwl2cHNybHEJJDI5LCV5bW03LCV5bW0xMworCXZwZXJtcQkkMHg5MywleW1tMTEsJXltbTExCisJdnBhbmQJJXltbTE1LCV5bW03LCV5bW03CisJdnBzcmxxCSQyOSwleW1tOCwleW1tMAorCXZwZXJtcQkkMHg5MywleW1tMTIsJXltbTEyCisJdnBhbmQJJXltbTE1LCV5bW04LCV5bW04CisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKworCXZwYmxlbmRkCSQzLCV5bW05LCV5bW0xNCwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTQsJXltbTExLCV5bW0xNAorCXZwYWRkcQkleW1tMTAsJXltbTQsJXltbTQKKwl2cGJsZW5kZAkkMywleW1tMTEsJXltbTEyLCV5bW0xMQorCXZwYWRkcQkleW1tMTQsJXltbTUsJXltbTUKKwl2cGJsZW5kZAkkMywleW1tMTIsJXltbTEzLCV5bW0xMgorCXZwYWRkcQkleW1tMTEsJXltbTYsJXltbTYKKwl2cGJsZW5kZAkkMywleW1tMTMsJXltbTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tNywleW1tNworCXZwYWRkcQkleW1tMTMsJXltbTgsJXltbTgKKworCXZwc3JscQkkMjksJXltbTQsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW00LCV5bW00CisJdnBzcmxxCSQyOSwleW1tNSwleW1tMTEKKwl2cGFuZAkleW1tMTUsJXltbTUsJXltbTUKKwl2cHNybHEJJDI5LCV5bW02LCV5bW0xMgorCXZwZXJtcQkkMHg5MywleW1tMTQsJXltbTE0CisJdnBhbmQJJXltbTE1LCV5bW02LCV5bW02CisJdnBzcmxxCSQyOSwleW1tNywleW1tMTMKKwl2cGVybXEJJDB4OTMsJXltbTExLCV5bW0xMQorCXZwYW5kCSV5bW0xNSwleW1tNywleW1tNworCXZwc3JscQkkMjksJXltbTgsJXltbTAKKwl2cGVybXEJJDB4OTMsJXltbTEyLCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tOCwleW1tOAorCXZwZXJtcQkkMHg5MywleW1tMTMsJXltbTEzCisKKwl2cGJsZW5kZAkkMywleW1tOSwleW1tMTQsJXltbTEwCisJdnBlcm1xCSQweDkzLCV5bW0wLCV5bW0wCisJdnBibGVuZGQJJDMsJXltbTE0LCV5bW0xMSwleW1tMTQKKwl2cGFkZHEJJXltbTEwLCV5bW00LCV5bW00CisJdnBibGVuZGQJJDMsJXltbTExLCV5bW0xMiwleW1tMTEKKwl2cGFkZHEJJXltbTE0LCV5bW01LCV5bW01CisJdm1vdmRxdQkleW1tNCwxMjgtMTI4KCVyZGkpCisJdnBibGVuZGQJJDMsJXltbTEyLCV5bW0xMywleW1tMTIKKwl2cGFkZHEJJXltbTExLCV5bW02LCV5bW02CisJdm1vdmRxdQkleW1tNSwxNjAtMTI4KCVyZGkpCisJdnBibGVuZGQJJDMsJXltbTEzLCV5bW0wLCV5bW0xMworCXZwYWRkcQkleW1tMTIsJXltbTcsJXltbTcKKwl2bW92ZHF1CSV5bW02LDE5Mi0xMjgoJXJkaSkKKwl2cGFkZHEJJXltbTEzLCV5bW04LCV5bW04CisJdm1vdmRxdQkleW1tNywyMjQtMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tOCwyNTYtMTI4KCVyZGkpCisKKwltb3ZxCSVyZGksJXJzaQorCWRlY2wJJXI4ZAorCWpuZQlMJE9PUF9HUkFOREVfU1FSXzEwMjQKKworCXZ6ZXJvYWxsCisJbW92cQklcmJwLCVyYXgKKworCW1vdnEJLTQ4KCVyYXgpLCVyMTUKKworCW1vdnEJLTQwKCVyYXgpLCVyMTQKKworCW1vdnEJLTMyKCVyYXgpLCVyMTMKKworCW1vdnEJLTI0KCVyYXgpLCVyMTIKKworCW1vdnEJLTE2KCVyYXgpLCVyYnAKKworCW1vdnEJLTgoJXJheCksJXJieAorCisJbGVhcQkoJXJheCksJXJzcAorCitMJHNxcl8xMDI0X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfcnNhel8xMDI0X211bF9hdngyCisucHJpdmF0ZV9leHRlcm4gX3JzYXpfMTAyNF9tdWxfYXZ4MgorCisucDJhbGlnbgk2CitfcnNhel8xMDI0X211bF9hdngyOgorCisJbGVhcQkoJXJzcCksJXJheAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisJbW92cQklcmF4LCVyYnAKKworCXZ6ZXJvYWxsCisJbW92cQklcmR4LCVyMTMKKwlzdWJxCSQ2NCwlcnNwCisKKworCisKKworCisuYnl0ZQkweDY3LDB4NjcKKwltb3ZxCSVyc2ksJXIxNQorCWFuZHEJJDQwOTUsJXIxNQorCWFkZHEJJDMyMCwlcjE1CisJc2hycQkkMTIsJXIxNQorCW1vdnEJJXJzaSwlcjE1CisJY21vdm56cQklcjEzLCVyc2kKKwljbW92bnpxCSVyMTUsJXIxMworCisJbW92cQklcmN4LCVyMTUKKwlzdWJxCSQtMTI4LCVyc2kKKwlzdWJxCSQtMTI4LCVyY3gKKwlzdWJxCSQtMTI4LCVyZGkKKworCWFuZHEJJDQwOTUsJXIxNQorCWFkZHEJJDMyMCwlcjE1CisuYnl0ZQkweDY3LDB4NjcKKwlzaHJxCSQxMiwlcjE1CisJanoJTCRtdWxfMTAyNF9ub19uX2NvcHkKKworCisKKworCisJc3VicQkkMzIwLCVyc3AKKwl2bW92ZHF1CTAtMTI4KCVyY3gpLCV5bW0wCisJYW5kcQkkLTUxMiwlcnNwCisJdm1vdmRxdQkzMi0xMjgoJXJjeCksJXltbTEKKwl2bW92ZHF1CTY0LTEyOCglcmN4KSwleW1tMgorCXZtb3ZkcXUJOTYtMTI4KCVyY3gpLCV5bW0zCisJdm1vdmRxdQkxMjgtMTI4KCVyY3gpLCV5bW00CisJdm1vdmRxdQkxNjAtMTI4KCVyY3gpLCV5bW01CisJdm1vdmRxdQkxOTItMTI4KCVyY3gpLCV5bW02CisJdm1vdmRxdQkyMjQtMTI4KCVyY3gpLCV5bW03CisJdm1vdmRxdQkyNTYtMTI4KCVyY3gpLCV5bW04CisJbGVhcQk2NCsxMjgoJXJzcCksJXJjeAorCXZtb3ZkcXUJJXltbTAsMC0xMjgoJXJjeCkKKwl2cHhvcgkleW1tMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJJXltbTEsMzItMTI4KCVyY3gpCisJdnB4b3IJJXltbTEsJXltbTEsJXltbTEKKwl2bW92ZHF1CSV5bW0yLDY0LTEyOCglcmN4KQorCXZweG9yCSV5bW0yLCV5bW0yLCV5bW0yCisJdm1vdmRxdQkleW1tMyw5Ni0xMjgoJXJjeCkKKwl2cHhvcgkleW1tMywleW1tMywleW1tMworCXZtb3ZkcXUJJXltbTQsMTI4LTEyOCglcmN4KQorCXZweG9yCSV5bW00LCV5bW00LCV5bW00CisJdm1vdmRxdQkleW1tNSwxNjAtMTI4KCVyY3gpCisJdnB4b3IJJXltbTUsJXltbTUsJXltbTUKKwl2bW92ZHF1CSV5bW02LDE5Mi0xMjgoJXJjeCkKKwl2cHhvcgkleW1tNiwleW1tNiwleW1tNgorCXZtb3ZkcXUJJXltbTcsMjI0LTEyOCglcmN4KQorCXZweG9yCSV5bW03LCV5bW03LCV5bW03CisJdm1vdmRxdQkleW1tOCwyNTYtMTI4KCVyY3gpCisJdm1vdmRxYQkleW1tMCwleW1tOAorCXZtb3ZkcXUJJXltbTksMjg4LTEyOCglcmN4KQorTCRtdWxfMTAyNF9ub19uX2NvcHk6CisJYW5kcQkkLTY0LCVyc3AKKworCW1vdnEJKCVyMTMpLCVyYngKKwl2cGJyb2FkY2FzdHEJKCVyMTMpLCV5bW0xMAorCXZtb3ZkcXUJJXltbTAsKCVyc3ApCisJeG9ycQklcjksJXI5CisuYnl0ZQkweDY3CisJeG9ycQklcjEwLCVyMTAKKwl4b3JxCSVyMTEsJXIxMQorCXhvcnEJJXIxMiwlcjEyCisKKwl2bW92ZHF1CUwkYW5kX21hc2soJXJpcCksJXltbTE1CisJbW92bAkkOSwlcjE0ZAorCXZtb3ZkcXUJJXltbTksMjg4LTEyOCglcmRpKQorCWptcAlMJG9vcF9tdWxfMTAyNAorCisucDJhbGlnbgk1CitMJG9vcF9tdWxfMTAyNDoKKwl2cHNybHEJJDI5LCV5bW0zLCV5bW05CisJbW92cQklcmJ4LCVyYXgKKwlpbXVscQktMTI4KCVyc2kpLCVyYXgKKwlhZGRxCSVyOSwlcmF4CisJbW92cQklcmJ4LCVyMTAKKwlpbXVscQk4LTEyOCglcnNpKSwlcjEwCisJYWRkcQk4KCVyc3ApLCVyMTAKKworCW1vdnEJJXJheCwlcjkKKwlpbXVsbAklcjhkLCVlYXgKKwlhbmRsCSQweDFmZmZmZmZmLCVlYXgKKworCW1vdnEJJXJieCwlcjExCisJaW11bHEJMTYtMTI4KCVyc2kpLCVyMTEKKwlhZGRxCTE2KCVyc3ApLCVyMTEKKworCW1vdnEJJXJieCwlcjEyCisJaW11bHEJMjQtMTI4KCVyc2kpLCVyMTIKKwlhZGRxCTI0KCVyc3ApLCVyMTIKKwl2cG11bHVkcQkzMi0xMjgoJXJzaSksJXltbTEwLCV5bW0wCisJdm1vdmQJJWVheCwleG1tMTEKKwl2cGFkZHEJJXltbTAsJXltbTEsJXltbTEKKwl2cG11bHVkcQk2NC0xMjgoJXJzaSksJXltbTEwLCV5bW0xMgorCXZwYnJvYWRjYXN0cQkleG1tMTEsJXltbTExCisJdnBhZGRxCSV5bW0xMiwleW1tMiwleW1tMgorCXZwbXVsdWRxCTk2LTEyOCglcnNpKSwleW1tMTAsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW0zLCV5bW0zCisJdnBhZGRxCSV5bW0xMywleW1tMywleW1tMworCXZwbXVsdWRxCTEyOC0xMjgoJXJzaSksJXltbTEwLCV5bW0wCisJdnBhZGRxCSV5bW0wLCV5bW00LCV5bW00CisJdnBtdWx1ZHEJMTYwLTEyOCglcnNpKSwleW1tMTAsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwbXVsdWRxCTE5Mi0xMjgoJXJzaSksJXltbTEwLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTYsJXltbTYKKwl2cG11bHVkcQkyMjQtMTI4KCVyc2kpLCV5bW0xMCwleW1tMAorCXZwZXJtcQkkMHg5MywleW1tOSwleW1tOQorCXZwYWRkcQkleW1tMCwleW1tNywleW1tNworCXZwbXVsdWRxCTI1Ni0xMjgoJXJzaSksJXltbTEwLCV5bW0xMgorCXZwYnJvYWRjYXN0cQk4KCVyMTMpLCV5bW0xMAorCXZwYWRkcQkleW1tMTIsJXltbTgsJXltbTgKKworCW1vdnEJJXJheCwlcmR4CisJaW11bHEJLTEyOCglcmN4KSwlcmF4CisJYWRkcQklcmF4LCVyOQorCW1vdnEJJXJkeCwlcmF4CisJaW11bHEJOC0xMjgoJXJjeCksJXJheAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmR4LCVyYXgKKwlpbXVscQkxNi0xMjgoJXJjeCksJXJheAorCWFkZHEJJXJheCwlcjExCisJc2hycQkkMjksJXI5CisJaW11bHEJMjQtMTI4KCVyY3gpLCVyZHgKKwlhZGRxCSVyZHgsJXIxMgorCWFkZHEJJXI5LCVyMTAKKworCXZwbXVsdWRxCTMyLTEyOCglcmN4KSwleW1tMTEsJXltbTEzCisJdm1vdnEJJXhtbTEwLCVyYngKKwl2cGFkZHEJJXltbTEzLCV5bW0xLCV5bW0xCisJdnBtdWx1ZHEJNjQtMTI4KCVyY3gpLCV5bW0xMSwleW1tMAorCXZwYWRkcQkleW1tMCwleW1tMiwleW1tMgorCXZwbXVsdWRxCTk2LTEyOCglcmN4KSwleW1tMTEsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tMywleW1tMworCXZwbXVsdWRxCTEyOC0xMjgoJXJjeCksJXltbTExLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTQsJXltbTQKKwl2cG11bHVkcQkxNjAtMTI4KCVyY3gpLCV5bW0xMSwleW1tMAorCXZwYWRkcQkleW1tMCwleW1tNSwleW1tNQorCXZwbXVsdWRxCTE5Mi0xMjgoJXJjeCksJXltbTExLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTYsJXltbTYKKwl2cG11bHVkcQkyMjQtMTI4KCVyY3gpLCV5bW0xMSwleW1tMTMKKwl2cGJsZW5kZAkkMywleW1tMTQsJXltbTksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tNywleW1tNworCXZwbXVsdWRxCTI1Ni0xMjgoJXJjeCksJXltbTExLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tMywleW1tMworCXZwYWRkcQkleW1tMCwleW1tOCwleW1tOAorCisJbW92cQklcmJ4LCVyYXgKKwlpbXVscQktMTI4KCVyc2kpLCVyYXgKKwlhZGRxCSVyYXgsJXIxMAorCXZtb3ZkcXUJLTgrMzItMTI4KCVyc2kpLCV5bW0xMgorCW1vdnEJJXJieCwlcmF4CisJaW11bHEJOC0xMjgoJXJzaSksJXJheAorCWFkZHEJJXJheCwlcjExCisJdm1vdmRxdQktOCs2NC0xMjgoJXJzaSksJXltbTEzCisKKwltb3ZxCSVyMTAsJXJheAorCXZwYmxlbmRkCSQweGZjLCV5bW0xNCwleW1tOSwleW1tOQorCWltdWxsCSVyOGQsJWVheAorCXZwYWRkcQkleW1tOSwleW1tNCwleW1tNAorCWFuZGwJJDB4MWZmZmZmZmYsJWVheAorCisJaW11bHEJMTYtMTI4KCVyc2kpLCVyYngKKwlhZGRxCSVyYngsJXIxMgorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTIsJXltbTEyCisJdm1vdmQJJWVheCwleG1tMTEKKwl2bW92ZHF1CS04Kzk2LTEyOCglcnNpKSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTEsJXltbTEKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZwYnJvYWRjYXN0cQkleG1tMTEsJXltbTExCisJdm1vdmRxdQktOCsxMjgtMTI4KCVyc2kpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTIsJXltbTIKKwl2cG11bHVkcQkleW1tMTAsJXltbTAsJXltbTAKKwl2bW92ZHF1CS04KzE2MC0xMjgoJXJzaSksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW0zLCV5bW0zCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CS04KzE5Mi0xMjgoJXJzaSksJXltbTAKKwl2cGFkZHEJJXltbTEyLCV5bW00LCV5bW00CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CS04KzIyNC0xMjgoJXJzaSksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tNSwleW1tNQorCXZwbXVsdWRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTgrMjU2LTEyOCglcnNpKSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTYsJXltbTYKKwl2cG11bHVkcQkleW1tMTAsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTgrMjg4LTEyOCglcnNpKSwleW1tOQorCXZwYWRkcQkleW1tMTIsJXltbTcsJXltbTcKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZwYWRkcQkleW1tMTMsJXltbTgsJXltbTgKKwl2cG11bHVkcQkleW1tMTAsJXltbTksJXltbTkKKwl2cGJyb2FkY2FzdHEJMTYoJXIxMyksJXltbTEwCisKKwltb3ZxCSVyYXgsJXJkeAorCWltdWxxCS0xMjgoJXJjeCksJXJheAorCWFkZHEJJXJheCwlcjEwCisJdm1vdmRxdQktOCszMi0xMjgoJXJjeCksJXltbTAKKwltb3ZxCSVyZHgsJXJheAorCWltdWxxCTgtMTI4KCVyY3gpLCVyYXgKKwlhZGRxCSVyYXgsJXIxMQorCXZtb3ZkcXUJLTgrNjQtMTI4KCVyY3gpLCV5bW0xMgorCXNocnEJJDI5LCVyMTAKKwlpbXVscQkxNi0xMjgoJXJjeCksJXJkeAorCWFkZHEJJXJkeCwlcjEyCisJYWRkcQklcjEwLCVyMTEKKworCXZwbXVsdWRxCSV5bW0xMSwleW1tMCwleW1tMAorCXZtb3ZxCSV4bW0xMCwlcmJ4CisJdm1vdmRxdQktOCs5Ni0xMjgoJXJjeCksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW0xLCV5bW0xCisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CS04KzEyOC0xMjgoJXJjeCksJXltbTAKKwl2cGFkZHEJJXltbTEyLCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CS04KzE2MC0xMjgoJXJjeCksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tMywleW1tMworCXZwbXVsdWRxCSV5bW0xMSwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTgrMTkyLTEyOCglcmN4KSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTQsJXltbTQKKwl2cG11bHVkcQkleW1tMTEsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTgrMjI0LTEyOCglcmN4KSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTUsJXltbTUKKwl2cG11bHVkcQkleW1tMTEsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTgrMjU2LTEyOCglcmN4KSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktOCsyODgtMTI4KCVyY3gpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tNywleW1tNworCXZwbXVsdWRxCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdnBhZGRxCSV5bW0xMiwleW1tOCwleW1tOAorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTMsJXltbTEzCisJdnBhZGRxCSV5bW0xMywleW1tOSwleW1tOQorCisJdm1vdmRxdQktMTYrMzItMTI4KCVyc2kpLCV5bW0wCisJbW92cQklcmJ4LCVyYXgKKwlpbXVscQktMTI4KCVyc2kpLCVyYXgKKwlhZGRxCSVyMTEsJXJheAorCisJdm1vdmRxdQktMTYrNjQtMTI4KCVyc2kpLCV5bW0xMgorCW1vdnEJJXJheCwlcjExCisJaW11bGwJJXI4ZCwlZWF4CisJYW5kbAkkMHgxZmZmZmZmZiwlZWF4CisKKwlpbXVscQk4LTEyOCglcnNpKSwlcmJ4CisJYWRkcQklcmJ4LCVyMTIKKwl2cG11bHVkcQkleW1tMTAsJXltbTAsJXltbTAKKwl2bW92ZAklZWF4LCV4bW0xMQorCXZtb3ZkcXUJLTE2Kzk2LTEyOCglcnNpKSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTEsJXltbTEKKwl2cG11bHVkcQkleW1tMTAsJXltbTEyLCV5bW0xMgorCXZwYnJvYWRjYXN0cQkleG1tMTEsJXltbTExCisJdm1vdmRxdQktMTYrMTI4LTEyOCglcnNpKSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTIsJXltbTIKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTE2KzE2MC0xMjgoJXJzaSksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tMywleW1tMworCXZwbXVsdWRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTE2KzE5Mi0xMjgoJXJzaSksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW00LCV5bW00CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CS0xNisyMjQtMTI4KCVyc2kpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktMTYrMjU2LTEyOCglcnNpKSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktMTYrMjg4LTEyOCglcnNpKSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTcsJXltbTcKKwl2cG11bHVkcQkleW1tMTAsJXltbTEyLCV5bW0xMgorCXZwYWRkcQkleW1tMTIsJXltbTgsJXltbTgKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZwYnJvYWRjYXN0cQkyNCglcjEzKSwleW1tMTAKKwl2cGFkZHEJJXltbTEzLCV5bW05LCV5bW05CisKKwl2bW92ZHF1CS0xNiszMi0xMjgoJXJjeCksJXltbTAKKwltb3ZxCSVyYXgsJXJkeAorCWltdWxxCS0xMjgoJXJjeCksJXJheAorCWFkZHEJJXJheCwlcjExCisJdm1vdmRxdQktMTYrNjQtMTI4KCVyY3gpLCV5bW0xMgorCWltdWxxCTgtMTI4KCVyY3gpLCVyZHgKKwlhZGRxCSVyZHgsJXIxMgorCXNocnEJJDI5LCVyMTEKKworCXZwbXVsdWRxCSV5bW0xMSwleW1tMCwleW1tMAorCXZtb3ZxCSV4bW0xMCwlcmJ4CisJdm1vdmRxdQktMTYrOTYtMTI4KCVyY3gpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tMSwleW1tMQorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdm1vdmRxdQktMTYrMTI4LTEyOCglcmN4KSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTIsJXltbTIKKwl2cG11bHVkcQkleW1tMTEsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTE2KzE2MC0xMjgoJXJjeCksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tMywleW1tMworCXZwbXVsdWRxCSV5bW0xMSwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTE2KzE5Mi0xMjgoJXJjeCksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW00LCV5bW00CisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMiwleW1tMTIKKwl2bW92ZHF1CS0xNisyMjQtMTI4KCVyY3gpLCV5bW0wCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktMTYrMjU2LTEyOCglcmN4KSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW02LCV5bW02CisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktMTYrMjg4LTEyOCglcmN4KSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTcsJXltbTcKKwl2cG11bHVkcQkleW1tMTEsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTI0KzMyLTEyOCglcnNpKSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTgsJXltbTgKKwl2cG11bHVkcQkleW1tMTEsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTI0KzY0LTEyOCglcnNpKSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW05LCV5bW05CisKKwlhZGRxCSVyMTEsJXIxMgorCWltdWxxCS0xMjgoJXJzaSksJXJieAorCWFkZHEJJXJieCwlcjEyCisKKwltb3ZxCSVyMTIsJXJheAorCWltdWxsCSVyOGQsJWVheAorCWFuZGwJJDB4MWZmZmZmZmYsJWVheAorCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0wLCV5bW0wCisJdm1vdmQJJWVheCwleG1tMTEKKwl2bW92ZHF1CS0yNCs5Ni0xMjgoJXJzaSksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW0xLCV5bW0xCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMiwleW1tMTIKKwl2cGJyb2FkY2FzdHEJJXhtbTExLCV5bW0xMQorCXZtb3ZkcXUJLTI0KzEyOC0xMjgoJXJzaSksJXltbTAKKwl2cGFkZHEJJXltbTEyLCV5bW0yLCV5bW0yCisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CS0yNCsxNjAtMTI4KCVyc2kpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTMsJXltbTMKKwl2cG11bHVkcQkleW1tMTAsJXltbTAsJXltbTAKKwl2bW92ZHF1CS0yNCsxOTItMTI4KCVyc2kpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tNCwleW1tNAorCXZwbXVsdWRxCSV5bW0xMCwleW1tMTIsJXltbTEyCisJdm1vdmRxdQktMjQrMjI0LTEyOCglcnNpKSwleW1tMAorCXZwYWRkcQkleW1tMTIsJXltbTUsJXltbTUKKwl2cG11bHVkcQkleW1tMTAsJXltbTEzLCV5bW0xMworCXZtb3ZkcXUJLTI0KzI1Ni0xMjgoJXJzaSksJXltbTEyCisJdnBhZGRxCSV5bW0xMywleW1tNiwleW1tNgorCXZwbXVsdWRxCSV5bW0xMCwleW1tMCwleW1tMAorCXZtb3ZkcXUJLTI0KzI4OC0xMjgoJXJzaSksJXltbTEzCisJdnBhZGRxCSV5bW0wLCV5bW03LCV5bW03CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMiwleW1tMTIKKwl2cGFkZHEJJXltbTEyLCV5bW04LCV5bW04CisJdnBtdWx1ZHEJJXltbTEwLCV5bW0xMywleW1tMTMKKwl2cGJyb2FkY2FzdHEJMzIoJXIxMyksJXltbTEwCisJdnBhZGRxCSV5bW0xMywleW1tOSwleW1tOQorCWFkZHEJJDMyLCVyMTMKKworCXZtb3ZkcXUJLTI0KzMyLTEyOCglcmN4KSwleW1tMAorCWltdWxxCS0xMjgoJXJjeCksJXJheAorCWFkZHEJJXJheCwlcjEyCisJc2hycQkkMjksJXIxMgorCisJdm1vdmRxdQktMjQrNjQtMTI4KCVyY3gpLCV5bW0xMgorCXZwbXVsdWRxCSV5bW0xMSwleW1tMCwleW1tMAorCXZtb3ZxCSV4bW0xMCwlcmJ4CisJdm1vdmRxdQktMjQrOTYtMTI4KCVyY3gpLCV5bW0xMworCXZwYWRkcQkleW1tMCwleW1tMSwleW1tMAorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTIsJXltbTEyCisJdm1vdmRxdQkleW1tMCwoJXJzcCkKKwl2cGFkZHEJJXltbTEyLCV5bW0yLCV5bW0xCisJdm1vdmRxdQktMjQrMTI4LTEyOCglcmN4KSwleW1tMAorCXZwbXVsdWRxCSV5bW0xMSwleW1tMTMsJXltbTEzCisJdm1vdmRxdQktMjQrMTYwLTEyOCglcmN4KSwleW1tMTIKKwl2cGFkZHEJJXltbTEzLCV5bW0zLCV5bW0yCisJdnBtdWx1ZHEJJXltbTExLCV5bW0wLCV5bW0wCisJdm1vdmRxdQktMjQrMTkyLTEyOCglcmN4KSwleW1tMTMKKwl2cGFkZHEJJXltbTAsJXltbTQsJXltbTMKKwl2cG11bHVkcQkleW1tMTEsJXltbTEyLCV5bW0xMgorCXZtb3ZkcXUJLTI0KzIyNC0xMjgoJXJjeCksJXltbTAKKwl2cGFkZHEJJXltbTEyLCV5bW01LCV5bW00CisJdnBtdWx1ZHEJJXltbTExLCV5bW0xMywleW1tMTMKKwl2bW92ZHF1CS0yNCsyNTYtMTI4KCVyY3gpLCV5bW0xMgorCXZwYWRkcQkleW1tMTMsJXltbTYsJXltbTUKKwl2cG11bHVkcQkleW1tMTEsJXltbTAsJXltbTAKKwl2bW92ZHF1CS0yNCsyODgtMTI4KCVyY3gpLCV5bW0xMworCW1vdnEJJXIxMiwlcjkKKwl2cGFkZHEJJXltbTAsJXltbTcsJXltbTYKKwl2cG11bHVkcQkleW1tMTEsJXltbTEyLCV5bW0xMgorCWFkZHEJKCVyc3ApLCVyOQorCXZwYWRkcQkleW1tMTIsJXltbTgsJXltbTcKKwl2cG11bHVkcQkleW1tMTEsJXltbTEzLCV5bW0xMworCXZtb3ZxCSVyMTIsJXhtbTEyCisJdnBhZGRxCSV5bW0xMywleW1tOSwleW1tOAorCisJZGVjbAklcjE0ZAorCWpueglMJG9vcF9tdWxfMTAyNAorCXZwYWRkcQkoJXJzcCksJXltbTEyLCV5bW0wCisKKwl2cHNybHEJJDI5LCV5bW0wLCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tMCwleW1tMAorCXZwc3JscQkkMjksJXltbTEsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW0xLCV5bW0xCisJdnBzcmxxCSQyOSwleW1tMiwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTEyLCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tMiwleW1tMgorCXZwc3JscQkkMjksJXltbTMsJXltbTExCisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTMsJXltbTMKKworCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTIsJXltbTkKKwl2cGVybXEJJDB4OTMsJXltbTEwLCV5bW0xMAorCXZwYmxlbmRkCSQzLCV5bW0xMiwleW1tMTMsJXltbTEyCisJdnBlcm1xCSQweDkzLCV5bW0xMSwleW1tMTEKKwl2cGFkZHEJJXltbTksJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTMsJXltbTEwLCV5bW0xMworCXZwYWRkcQkleW1tMTIsJXltbTEsJXltbTEKKwl2cGJsZW5kZAkkMywleW1tMTAsJXltbTExLCV5bW0xMAorCXZwYWRkcQkleW1tMTMsJXltbTIsJXltbTIKKwl2cGJsZW5kZAkkMywleW1tMTEsJXltbTE0LCV5bW0xMQorCXZwYWRkcQkleW1tMTAsJXltbTMsJXltbTMKKwl2cGFkZHEJJXltbTExLCV5bW00LCV5bW00CisKKwl2cHNybHEJJDI5LCV5bW0wLCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tMCwleW1tMAorCXZwc3JscQkkMjksJXltbTEsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW0xLCV5bW0xCisJdnBzcmxxCSQyOSwleW1tMiwleW1tMTAKKwl2cGVybXEJJDB4OTMsJXltbTEyLCV5bW0xMgorCXZwYW5kCSV5bW0xNSwleW1tMiwleW1tMgorCXZwc3JscQkkMjksJXltbTMsJXltbTExCisJdnBlcm1xCSQweDkzLCV5bW0xMywleW1tMTMKKwl2cGFuZAkleW1tMTUsJXltbTMsJXltbTMKKwl2cGVybXEJJDB4OTMsJXltbTEwLCV5bW0xMAorCisJdnBibGVuZGQJJDMsJXltbTE0LCV5bW0xMiwleW1tOQorCXZwZXJtcQkkMHg5MywleW1tMTEsJXltbTExCisJdnBibGVuZGQJJDMsJXltbTEyLCV5bW0xMywleW1tMTIKKwl2cGFkZHEJJXltbTksJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTMsJXltbTEwLCV5bW0xMworCXZwYWRkcQkleW1tMTIsJXltbTEsJXltbTEKKwl2cGJsZW5kZAkkMywleW1tMTAsJXltbTExLCV5bW0xMAorCXZwYWRkcQkleW1tMTMsJXltbTIsJXltbTIKKwl2cGJsZW5kZAkkMywleW1tMTEsJXltbTE0LCV5bW0xMQorCXZwYWRkcQkleW1tMTAsJXltbTMsJXltbTMKKwl2cGFkZHEJJXltbTExLCV5bW00LCV5bW00CisKKwl2bW92ZHF1CSV5bW0wLDAtMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tMSwzMi0xMjgoJXJkaSkKKwl2bW92ZHF1CSV5bW0yLDY0LTEyOCglcmRpKQorCXZtb3ZkcXUJJXltbTMsOTYtMTI4KCVyZGkpCisJdnBzcmxxCSQyOSwleW1tNCwleW1tMTIKKwl2cGFuZAkleW1tMTUsJXltbTQsJXltbTQKKwl2cHNybHEJJDI5LCV5bW01LCV5bW0xMworCXZwYW5kCSV5bW0xNSwleW1tNSwleW1tNQorCXZwc3JscQkkMjksJXltbTYsJXltbTEwCisJdnBlcm1xCSQweDkzLCV5bW0xMiwleW1tMTIKKwl2cGFuZAkleW1tMTUsJXltbTYsJXltbTYKKwl2cHNybHEJJDI5LCV5bW03LCV5bW0xMQorCXZwZXJtcQkkMHg5MywleW1tMTMsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW03LCV5bW03CisJdnBzcmxxCSQyOSwleW1tOCwleW1tMAorCXZwZXJtcQkkMHg5MywleW1tMTAsJXltbTEwCisJdnBhbmQJJXltbTE1LCV5bW04LCV5bW04CisJdnBlcm1xCSQweDkzLCV5bW0xMSwleW1tMTEKKworCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTIsJXltbTkKKwl2cGVybXEJJDB4OTMsJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTIsJXltbTEzLCV5bW0xMgorCXZwYWRkcQkleW1tOSwleW1tNCwleW1tNAorCXZwYmxlbmRkCSQzLCV5bW0xMywleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwYmxlbmRkCSQzLCV5bW0xMCwleW1tMTEsJXltbTEwCisJdnBhZGRxCSV5bW0xMywleW1tNiwleW1tNgorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tMCwleW1tMTEKKwl2cGFkZHEJJXltbTEwLCV5bW03LCV5bW03CisJdnBhZGRxCSV5bW0xMSwleW1tOCwleW1tOAorCisJdnBzcmxxCSQyOSwleW1tNCwleW1tMTIKKwl2cGFuZAkleW1tMTUsJXltbTQsJXltbTQKKwl2cHNybHEJJDI5LCV5bW01LCV5bW0xMworCXZwYW5kCSV5bW0xNSwleW1tNSwleW1tNQorCXZwc3JscQkkMjksJXltbTYsJXltbTEwCisJdnBlcm1xCSQweDkzLCV5bW0xMiwleW1tMTIKKwl2cGFuZAkleW1tMTUsJXltbTYsJXltbTYKKwl2cHNybHEJJDI5LCV5bW03LCV5bW0xMQorCXZwZXJtcQkkMHg5MywleW1tMTMsJXltbTEzCisJdnBhbmQJJXltbTE1LCV5bW03LCV5bW03CisJdnBzcmxxCSQyOSwleW1tOCwleW1tMAorCXZwZXJtcQkkMHg5MywleW1tMTAsJXltbTEwCisJdnBhbmQJJXltbTE1LCV5bW04LCV5bW04CisJdnBlcm1xCSQweDkzLCV5bW0xMSwleW1tMTEKKworCXZwYmxlbmRkCSQzLCV5bW0xNCwleW1tMTIsJXltbTkKKwl2cGVybXEJJDB4OTMsJXltbTAsJXltbTAKKwl2cGJsZW5kZAkkMywleW1tMTIsJXltbTEzLCV5bW0xMgorCXZwYWRkcQkleW1tOSwleW1tNCwleW1tNAorCXZwYmxlbmRkCSQzLCV5bW0xMywleW1tMTAsJXltbTEzCisJdnBhZGRxCSV5bW0xMiwleW1tNSwleW1tNQorCXZwYmxlbmRkCSQzLCV5bW0xMCwleW1tMTEsJXltbTEwCisJdnBhZGRxCSV5bW0xMywleW1tNiwleW1tNgorCXZwYmxlbmRkCSQzLCV5bW0xMSwleW1tMCwleW1tMTEKKwl2cGFkZHEJJXltbTEwLCV5bW03LCV5bW03CisJdnBhZGRxCSV5bW0xMSwleW1tOCwleW1tOAorCisJdm1vdmRxdQkleW1tNCwxMjgtMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tNSwxNjAtMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tNiwxOTItMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tNywyMjQtMTI4KCVyZGkpCisJdm1vdmRxdQkleW1tOCwyNTYtMTI4KCVyZGkpCisJdnplcm91cHBlcgorCisJbW92cQklcmJwLCVyYXgKKworCW1vdnEJLTQ4KCVyYXgpLCVyMTUKKworCW1vdnEJLTQwKCVyYXgpLCVyMTQKKworCW1vdnEJLTMyKCVyYXgpLCVyMTMKKworCW1vdnEJLTI0KCVyYXgpLCVyMTIKKworCW1vdnEJLTE2KCVyYXgpLCVyYnAKKworCW1vdnEJLTgoJXJheCksJXJieAorCisJbGVhcQkoJXJheCksJXJzcAorCitMJG11bF8xMDI0X2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfcnNhel8xMDI0X3JlZDJub3JtX2F2eDIKKy5wcml2YXRlX2V4dGVybiBfcnNhel8xMDI0X3JlZDJub3JtX2F2eDIKKworLnAyYWxpZ24JNQorX3JzYXpfMTAyNF9yZWQybm9ybV9hdngyOgorCXN1YnEJJC0xMjgsJXJzaQorCXhvcnEJJXJheCwlcmF4CisJbW92cQktMTI4KCVyc2kpLCVyOAorCW1vdnEJLTEyMCglcnNpKSwlcjkKKwltb3ZxCS0xMTIoJXJzaSksJXIxMAorCXNobHEJJDAsJXI4CisJc2hscQkkMjksJXI5CisJbW92cQklcjEwLCVyMTEKKwlzaGxxCSQ1OCwlcjEwCisJc2hycQkkNiwlcjExCisJYWRkcQklcjgsJXJheAorCWFkZHEJJXI5LCVyYXgKKwlhZGRxCSVyMTAsJXJheAorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXJheCwwKCVyZGkpCisJbW92cQklcjExLCVyYXgKKwltb3ZxCS0xMDQoJXJzaSksJXI4CisJbW92cQktOTYoJXJzaSksJXI5CisJc2hscQkkMjMsJXI4CisJbW92cQklcjksJXIxMAorCXNobHEJJDUyLCVyOQorCXNocnEJJDEyLCVyMTAKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjksJXJheAorCWFkY3EJJDAsJXIxMAorCW1vdnEJJXJheCw4KCVyZGkpCisJbW92cQklcjEwLCVyYXgKKwltb3ZxCS04OCglcnNpKSwlcjExCisJbW92cQktODAoJXJzaSksJXI4CisJc2hscQkkMTcsJXIxMQorCW1vdnEJJXI4LCVyOQorCXNobHEJJDQ2LCVyOAorCXNocnEJJDE4LCVyOQorCWFkZHEJJXIxMSwlcmF4CisJYWRkcQklcjgsJXJheAorCWFkY3EJJDAsJXI5CisJbW92cQklcmF4LDE2KCVyZGkpCisJbW92cQklcjksJXJheAorCW1vdnEJLTcyKCVyc2kpLCVyMTAKKwltb3ZxCS02NCglcnNpKSwlcjExCisJc2hscQkkMTEsJXIxMAorCW1vdnEJJXIxMSwlcjgKKwlzaGxxCSQ0MCwlcjExCisJc2hycQkkMjQsJXI4CisJYWRkcQklcjEwLCVyYXgKKwlhZGRxCSVyMTEsJXJheAorCWFkY3EJJDAsJXI4CisJbW92cQklcmF4LDI0KCVyZGkpCisJbW92cQklcjgsJXJheAorCW1vdnEJLTU2KCVyc2kpLCVyOQorCW1vdnEJLTQ4KCVyc2kpLCVyMTAKKwltb3ZxCS00MCglcnNpKSwlcjExCisJc2hscQkkNSwlcjkKKwlzaGxxCSQzNCwlcjEwCisJbW92cQklcjExLCVyOAorCXNobHEJJDYzLCVyMTEKKwlzaHJxCSQxLCVyOAorCWFkZHEJJXI5LCVyYXgKKwlhZGRxCSVyMTAsJXJheAorCWFkZHEJJXIxMSwlcmF4CisJYWRjcQkkMCwlcjgKKwltb3ZxCSVyYXgsMzIoJXJkaSkKKwltb3ZxCSVyOCwlcmF4CisJbW92cQktMzIoJXJzaSksJXI5CisJbW92cQktMjQoJXJzaSksJXIxMAorCXNobHEJJDI4LCVyOQorCW1vdnEJJXIxMCwlcjExCisJc2hscQkkNTcsJXIxMAorCXNocnEJJDcsJXIxMQorCWFkZHEJJXI5LCVyYXgKKwlhZGRxCSVyMTAsJXJheAorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXJheCw0MCglcmRpKQorCW1vdnEJJXIxMSwlcmF4CisJbW92cQktMTYoJXJzaSksJXI4CisJbW92cQktOCglcnNpKSwlcjkKKwlzaGxxCSQyMiwlcjgKKwltb3ZxCSVyOSwlcjEwCisJc2hscQkkNTEsJXI5CisJc2hycQkkMTMsJXIxMAorCWFkZHEJJXI4LCVyYXgKKwlhZGRxCSVyOSwlcmF4CisJYWRjcQkkMCwlcjEwCisJbW92cQklcmF4LDQ4KCVyZGkpCisJbW92cQklcjEwLCVyYXgKKwltb3ZxCTAoJXJzaSksJXIxMQorCW1vdnEJOCglcnNpKSwlcjgKKwlzaGxxCSQxNiwlcjExCisJbW92cQklcjgsJXI5CisJc2hscQkkNDUsJXI4CisJc2hycQkkMTksJXI5CisJYWRkcQklcjExLCVyYXgKKwlhZGRxCSVyOCwlcmF4CisJYWRjcQkkMCwlcjkKKwltb3ZxCSVyYXgsNTYoJXJkaSkKKwltb3ZxCSVyOSwlcmF4CisJbW92cQkxNiglcnNpKSwlcjEwCisJbW92cQkyNCglcnNpKSwlcjExCisJc2hscQkkMTAsJXIxMAorCW1vdnEJJXIxMSwlcjgKKwlzaGxxCSQzOSwlcjExCisJc2hycQkkMjUsJXI4CisJYWRkcQklcjEwLCVyYXgKKwlhZGRxCSVyMTEsJXJheAorCWFkY3EJJDAsJXI4CisJbW92cQklcmF4LDY0KCVyZGkpCisJbW92cQklcjgsJXJheAorCW1vdnEJMzIoJXJzaSksJXI5CisJbW92cQk0MCglcnNpKSwlcjEwCisJbW92cQk0OCglcnNpKSwlcjExCisJc2hscQkkNCwlcjkKKwlzaGxxCSQzMywlcjEwCisJbW92cQklcjExLCVyOAorCXNobHEJJDYyLCVyMTEKKwlzaHJxCSQyLCVyOAorCWFkZHEJJXI5LCVyYXgKKwlhZGRxCSVyMTAsJXJheAorCWFkZHEJJXIxMSwlcmF4CisJYWRjcQkkMCwlcjgKKwltb3ZxCSVyYXgsNzIoJXJkaSkKKwltb3ZxCSVyOCwlcmF4CisJbW92cQk1NiglcnNpKSwlcjkKKwltb3ZxCTY0KCVyc2kpLCVyMTAKKwlzaGxxCSQyNywlcjkKKwltb3ZxCSVyMTAsJXIxMQorCXNobHEJJDU2LCVyMTAKKwlzaHJxCSQ4LCVyMTEKKwlhZGRxCSVyOSwlcmF4CisJYWRkcQklcjEwLCVyYXgKKwlhZGNxCSQwLCVyMTEKKwltb3ZxCSVyYXgsODAoJXJkaSkKKwltb3ZxCSVyMTEsJXJheAorCW1vdnEJNzIoJXJzaSksJXI4CisJbW92cQk4MCglcnNpKSwlcjkKKwlzaGxxCSQyMSwlcjgKKwltb3ZxCSVyOSwlcjEwCisJc2hscQkkNTAsJXI5CisJc2hycQkkMTQsJXIxMAorCWFkZHEJJXI4LCVyYXgKKwlhZGRxCSVyOSwlcmF4CisJYWRjcQkkMCwlcjEwCisJbW92cQklcmF4LDg4KCVyZGkpCisJbW92cQklcjEwLCVyYXgKKwltb3ZxCTg4KCVyc2kpLCVyMTEKKwltb3ZxCTk2KCVyc2kpLCVyOAorCXNobHEJJDE1LCVyMTEKKwltb3ZxCSVyOCwlcjkKKwlzaGxxCSQ0NCwlcjgKKwlzaHJxCSQyMCwlcjkKKwlhZGRxCSVyMTEsJXJheAorCWFkZHEJJXI4LCVyYXgKKwlhZGNxCSQwLCVyOQorCW1vdnEJJXJheCw5NiglcmRpKQorCW1vdnEJJXI5LCVyYXgKKwltb3ZxCTEwNCglcnNpKSwlcjEwCisJbW92cQkxMTIoJXJzaSksJXIxMQorCXNobHEJJDksJXIxMAorCW1vdnEJJXIxMSwlcjgKKwlzaGxxCSQzOCwlcjExCisJc2hycQkkMjYsJXI4CisJYWRkcQklcjEwLCVyYXgKKwlhZGRxCSVyMTEsJXJheAorCWFkY3EJJDAsJXI4CisJbW92cQklcmF4LDEwNCglcmRpKQorCW1vdnEJJXI4LCVyYXgKKwltb3ZxCTEyMCglcnNpKSwlcjkKKwltb3ZxCTEyOCglcnNpKSwlcjEwCisJbW92cQkxMzYoJXJzaSksJXIxMQorCXNobHEJJDMsJXI5CisJc2hscQkkMzIsJXIxMAorCW1vdnEJJXIxMSwlcjgKKwlzaGxxCSQ2MSwlcjExCisJc2hycQkkMywlcjgKKwlhZGRxCSVyOSwlcmF4CisJYWRkcQklcjEwLCVyYXgKKwlhZGRxCSVyMTEsJXJheAorCWFkY3EJJDAsJXI4CisJbW92cQklcmF4LDExMiglcmRpKQorCW1vdnEJJXI4LCVyYXgKKwltb3ZxCTE0NCglcnNpKSwlcjkKKwltb3ZxCTE1MiglcnNpKSwlcjEwCisJc2hscQkkMjYsJXI5CisJbW92cQklcjEwLCVyMTEKKwlzaGxxCSQ1NSwlcjEwCisJc2hycQkkOSwlcjExCisJYWRkcQklcjksJXJheAorCWFkZHEJJXIxMCwlcmF4CisJYWRjcQkkMCwlcjExCisJbW92cQklcmF4LDEyMCglcmRpKQorCW1vdnEJJXIxMSwlcmF4CisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9yc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MgorLnByaXZhdGVfZXh0ZXJuIF9yc2F6XzEwMjRfbm9ybTJyZWRfYXZ4MgorCisucDJhbGlnbgk1CitfcnNhel8xMDI0X25vcm0ycmVkX2F2eDI6CisJc3VicQkkLTEyOCwlcmRpCisJbW92cQkoJXJzaSksJXI4CisJbW92bAkkMHgxZmZmZmZmZiwlZWF4CisJbW92cQk4KCVyc2kpLCVyOQorCW1vdnEJJXI4LCVyMTEKKwlzaHJxCSQwLCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSwtMTI4KCVyZGkpCisJbW92cQklcjgsJXIxMAorCXNocnEJJDI5LCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCwtMTIwKCVyZGkpCisJc2hyZHEJJDU4LCVyOSwlcjgKKwlhbmRxCSVyYXgsJXI4CisJbW92cQklcjgsLTExMiglcmRpKQorCW1vdnEJMTYoJXJzaSksJXIxMAorCW1vdnEJJXI5LCVyOAorCXNocnEJJDIzLCVyOAorCWFuZHEJJXJheCwlcjgKKwltb3ZxCSVyOCwtMTA0KCVyZGkpCisJc2hyZHEJJDUyLCVyMTAsJXI5CisJYW5kcQklcmF4LCVyOQorCW1vdnEJJXI5LC05NiglcmRpKQorCW1vdnEJMjQoJXJzaSksJXIxMQorCW1vdnEJJXIxMCwlcjkKKwlzaHJxCSQxNywlcjkKKwlhbmRxCSVyYXgsJXI5CisJbW92cQklcjksLTg4KCVyZGkpCisJc2hyZHEJJDQ2LCVyMTEsJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLC04MCglcmRpKQorCW1vdnEJMzIoJXJzaSksJXI4CisJbW92cQklcjExLCVyMTAKKwlzaHJxCSQxMSwlcjEwCisJYW5kcQklcmF4LCVyMTAKKwltb3ZxCSVyMTAsLTcyKCVyZGkpCisJc2hyZHEJJDQwLCVyOCwlcjExCisJYW5kcQklcmF4LCVyMTEKKwltb3ZxCSVyMTEsLTY0KCVyZGkpCisJbW92cQk0MCglcnNpKSwlcjkKKwltb3ZxCSVyOCwlcjExCisJc2hycQkkNSwlcjExCisJYW5kcQklcmF4LCVyMTEKKwltb3ZxCSVyMTEsLTU2KCVyZGkpCisJbW92cQklcjgsJXIxMAorCXNocnEJJDM0LCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCwtNDgoJXJkaSkKKwlzaHJkcQkkNjMsJXI5LCVyOAorCWFuZHEJJXJheCwlcjgKKwltb3ZxCSVyOCwtNDAoJXJkaSkKKwltb3ZxCTQ4KCVyc2kpLCVyMTAKKwltb3ZxCSVyOSwlcjgKKwlzaHJxCSQyOCwlcjgKKwlhbmRxCSVyYXgsJXI4CisJbW92cQklcjgsLTMyKCVyZGkpCisJc2hyZHEJJDU3LCVyMTAsJXI5CisJYW5kcQklcmF4LCVyOQorCW1vdnEJJXI5LC0yNCglcmRpKQorCW1vdnEJNTYoJXJzaSksJXIxMQorCW1vdnEJJXIxMCwlcjkKKwlzaHJxCSQyMiwlcjkKKwlhbmRxCSVyYXgsJXI5CisJbW92cQklcjksLTE2KCVyZGkpCisJc2hyZHEJJDUxLCVyMTEsJXIxMAorCWFuZHEJJXJheCwlcjEwCisJbW92cQklcjEwLC04KCVyZGkpCisJbW92cQk2NCglcnNpKSwlcjgKKwltb3ZxCSVyMTEsJXIxMAorCXNocnEJJDE2LCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCwwKCVyZGkpCisJc2hyZHEJJDQ1LCVyOCwlcjExCisJYW5kcQklcmF4LCVyMTEKKwltb3ZxCSVyMTEsOCglcmRpKQorCW1vdnEJNzIoJXJzaSksJXI5CisJbW92cQklcjgsJXIxMQorCXNocnEJJDEwLCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSwxNiglcmRpKQorCXNocmRxCSQzOSwlcjksJXI4CisJYW5kcQklcmF4LCVyOAorCW1vdnEJJXI4LDI0KCVyZGkpCisJbW92cQk4MCglcnNpKSwlcjEwCisJbW92cQklcjksJXI4CisJc2hycQkkNCwlcjgKKwlhbmRxCSVyYXgsJXI4CisJbW92cQklcjgsMzIoJXJkaSkKKwltb3ZxCSVyOSwlcjExCisJc2hycQkkMzMsJXIxMQorCWFuZHEJJXJheCwlcjExCisJbW92cQklcjExLDQwKCVyZGkpCisJc2hyZHEJJDYyLCVyMTAsJXI5CisJYW5kcQklcmF4LCVyOQorCW1vdnEJJXI5LDQ4KCVyZGkpCisJbW92cQk4OCglcnNpKSwlcjExCisJbW92cQklcjEwLCVyOQorCXNocnEJJDI3LCVyOQorCWFuZHEJJXJheCwlcjkKKwltb3ZxCSVyOSw1NiglcmRpKQorCXNocmRxCSQ1NiwlcjExLCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCw2NCglcmRpKQorCW1vdnEJOTYoJXJzaSksJXI4CisJbW92cQklcjExLCVyMTAKKwlzaHJxCSQyMSwlcjEwCisJYW5kcQklcmF4LCVyMTAKKwltb3ZxCSVyMTAsNzIoJXJkaSkKKwlzaHJkcQkkNTAsJXI4LCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSw4MCglcmRpKQorCW1vdnEJMTA0KCVyc2kpLCVyOQorCW1vdnEJJXI4LCVyMTEKKwlzaHJxCSQxNSwlcjExCisJYW5kcQklcmF4LCVyMTEKKwltb3ZxCSVyMTEsODgoJXJkaSkKKwlzaHJkcQkkNDQsJXI5LCVyOAorCWFuZHEJJXJheCwlcjgKKwltb3ZxCSVyOCw5NiglcmRpKQorCW1vdnEJMTEyKCVyc2kpLCVyMTAKKwltb3ZxCSVyOSwlcjgKKwlzaHJxCSQ5LCVyOAorCWFuZHEJJXJheCwlcjgKKwltb3ZxCSVyOCwxMDQoJXJkaSkKKwlzaHJkcQkkMzgsJXIxMCwlcjkKKwlhbmRxCSVyYXgsJXI5CisJbW92cQklcjksMTEyKCVyZGkpCisJbW92cQkxMjAoJXJzaSksJXIxMQorCW1vdnEJJXIxMCwlcjkKKwlzaHJxCSQzLCVyOQorCWFuZHEJJXJheCwlcjkKKwltb3ZxCSVyOSwxMjAoJXJkaSkKKwltb3ZxCSVyMTAsJXI4CisJc2hycQkkMzIsJXI4CisJYW5kcQklcmF4LCVyOAorCW1vdnEJJXI4LDEyOCglcmRpKQorCXNocmRxCSQ2MSwlcjExLCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCwxMzYoJXJkaSkKKwl4b3JxCSVyOCwlcjgKKwltb3ZxCSVyMTEsJXIxMAorCXNocnEJJDI2LCVyMTAKKwlhbmRxCSVyYXgsJXIxMAorCW1vdnEJJXIxMCwxNDQoJXJkaSkKKwlzaHJkcQkkNTUsJXI4LCVyMTEKKwlhbmRxCSVyYXgsJXIxMQorCW1vdnEJJXIxMSwxNTIoJXJkaSkKKwltb3ZxCSVyOCwxNjAoJXJkaSkKKwltb3ZxCSVyOCwxNjgoJXJkaSkKKwltb3ZxCSVyOCwxNzYoJXJkaSkKKwltb3ZxCSVyOCwxODQoJXJkaSkKKwkuYnl0ZQkweGYzLDB4YzMKKworLmdsb2JsCV9yc2F6XzEwMjRfc2NhdHRlcjVfYXZ4MgorLnByaXZhdGVfZXh0ZXJuIF9yc2F6XzEwMjRfc2NhdHRlcjVfYXZ4MgorCisucDJhbGlnbgk1CitfcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDI6CisJdnplcm91cHBlcgorCXZtb3ZkcXUJTCRzY2F0dGVyX3Blcm1kKCVyaXApLCV5bW01CisJc2hsbAkkNCwlZWR4CisJbGVhcQkoJXJkaSwlcmR4LDEpLCVyZGkKKwltb3ZsCSQ5LCVlYXgKKwlqbXAJTCRvb3Bfc2NhdHRlcl8xMDI0CisKKy5wMmFsaWduCTUKK0wkb29wX3NjYXR0ZXJfMTAyNDoKKwl2bW92ZHF1CSglcnNpKSwleW1tMAorCWxlYXEJMzIoJXJzaSksJXJzaQorCXZwZXJtZAkleW1tMCwleW1tNSwleW1tMAorCXZtb3ZkcXUJJXhtbTAsKCVyZGkpCisJbGVhcQk1MTIoJXJkaSksJXJkaQorCWRlY2wJJWVheAorCWpueglMJG9vcF9zY2F0dGVyXzEwMjQKKworCXZ6ZXJvdXBwZXIKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuZ2xvYmwJX3JzYXpfMTAyNF9nYXRoZXI1X2F2eDIKKy5wcml2YXRlX2V4dGVybiBfcnNhel8xMDI0X2dhdGhlcjVfYXZ4MgorCisucDJhbGlnbgk1CitfcnNhel8xMDI0X2dhdGhlcjVfYXZ4MjoKKworCXZ6ZXJvdXBwZXIKKwltb3ZxCSVyc3AsJXIxMQorCisJbGVhcQktMjU2KCVyc3ApLCVyc3AKKwlhbmRxCSQtMzIsJXJzcAorCWxlYXEJTCRpbmMoJXJpcCksJXIxMAorCWxlYXEJLTEyOCglcnNwKSwlcmF4CisKKwl2bW92ZAklZWR4LCV4bW00CisJdm1vdmRxYQkoJXIxMCksJXltbTAKKwl2bW92ZHFhCTMyKCVyMTApLCV5bW0xCisJdm1vdmRxYQk2NCglcjEwKSwleW1tNQorCXZwYnJvYWRjYXN0ZAkleG1tNCwleW1tNAorCisJdnBhZGRkCSV5bW01LCV5bW0wLCV5bW0yCisJdnBjbXBlcWQJJXltbTQsJXltbTAsJXltbTAKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTMKKwl2cGNtcGVxZAkleW1tNCwleW1tMSwleW1tMQorCXZtb3ZkcWEJJXltbTAsMCsxMjgoJXJheCkKKwl2cGFkZGQJJXltbTUsJXltbTIsJXltbTAKKwl2cGNtcGVxZAkleW1tNCwleW1tMiwleW1tMgorCXZtb3ZkcWEJJXltbTEsMzIrMTI4KCVyYXgpCisJdnBhZGRkCSV5bW01LCV5bW0zLCV5bW0xCisJdnBjbXBlcWQJJXltbTQsJXltbTMsJXltbTMKKwl2bW92ZHFhCSV5bW0yLDY0KzEyOCglcmF4KQorCXZwYWRkZAkleW1tNSwleW1tMCwleW1tMgorCXZwY21wZXFkCSV5bW00LCV5bW0wLCV5bW0wCisJdm1vdmRxYQkleW1tMyw5NisxMjgoJXJheCkKKwl2cGFkZGQJJXltbTUsJXltbTEsJXltbTMKKwl2cGNtcGVxZAkleW1tNCwleW1tMSwleW1tMQorCXZtb3ZkcWEJJXltbTAsMTI4KzEyOCglcmF4KQorCXZwYWRkZAkleW1tNSwleW1tMiwleW1tOAorCXZwY21wZXFkCSV5bW00LCV5bW0yLCV5bW0yCisJdm1vdmRxYQkleW1tMSwxNjArMTI4KCVyYXgpCisJdnBhZGRkCSV5bW01LCV5bW0zLCV5bW05CisJdnBjbXBlcWQJJXltbTQsJXltbTMsJXltbTMKKwl2bW92ZHFhCSV5bW0yLDE5MisxMjgoJXJheCkKKwl2cGFkZGQJJXltbTUsJXltbTgsJXltbTEwCisJdnBjbXBlcWQJJXltbTQsJXltbTgsJXltbTgKKwl2bW92ZHFhCSV5bW0zLDIyNCsxMjgoJXJheCkKKwl2cGFkZGQJJXltbTUsJXltbTksJXltbTExCisJdnBjbXBlcWQJJXltbTQsJXltbTksJXltbTkKKwl2cGFkZGQJJXltbTUsJXltbTEwLCV5bW0xMgorCXZwY21wZXFkCSV5bW00LCV5bW0xMCwleW1tMTAKKwl2cGFkZGQJJXltbTUsJXltbTExLCV5bW0xMworCXZwY21wZXFkCSV5bW00LCV5bW0xMSwleW1tMTEKKwl2cGFkZGQJJXltbTUsJXltbTEyLCV5bW0xNAorCXZwY21wZXFkCSV5bW00LCV5bW0xMiwleW1tMTIKKwl2cGFkZGQJJXltbTUsJXltbTEzLCV5bW0xNQorCXZwY21wZXFkCSV5bW00LCV5bW0xMywleW1tMTMKKwl2cGNtcGVxZAkleW1tNCwleW1tMTQsJXltbTE0CisJdnBjbXBlcWQJJXltbTQsJXltbTE1LCV5bW0xNQorCisJdm1vdmRxYQktMzIoJXIxMCksJXltbTcKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJbW92bAkkOSwlZWR4CisKK0wkb29wX2dhdGhlcl8xMDI0OgorCXZtb3ZkcWEJMC0xMjgoJXJzaSksJXltbTAKKwl2bW92ZHFhCTMyLTEyOCglcnNpKSwleW1tMQorCXZtb3ZkcWEJNjQtMTI4KCVyc2kpLCV5bW0yCisJdm1vdmRxYQk5Ni0xMjgoJXJzaSksJXltbTMKKwl2cGFuZAkwKzEyOCglcmF4KSwleW1tMCwleW1tMAorCXZwYW5kCTMyKzEyOCglcmF4KSwleW1tMSwleW1tMQorCXZwYW5kCTY0KzEyOCglcmF4KSwleW1tMiwleW1tMgorCXZwb3IJJXltbTAsJXltbTEsJXltbTQKKwl2cGFuZAk5NisxMjgoJXJheCksJXltbTMsJXltbTMKKwl2bW92ZHFhCTEyOC0xMjgoJXJzaSksJXltbTAKKwl2bW92ZHFhCTE2MC0xMjgoJXJzaSksJXltbTEKKwl2cG9yCSV5bW0yLCV5bW0zLCV5bW01CisJdm1vdmRxYQkxOTItMTI4KCVyc2kpLCV5bW0yCisJdm1vdmRxYQkyMjQtMTI4KCVyc2kpLCV5bW0zCisJdnBhbmQJMTI4KzEyOCglcmF4KSwleW1tMCwleW1tMAorCXZwYW5kCTE2MCsxMjgoJXJheCksJXltbTEsJXltbTEKKwl2cGFuZAkxOTIrMTI4KCVyYXgpLCV5bW0yLCV5bW0yCisJdnBvcgkleW1tMCwleW1tNCwleW1tNAorCXZwYW5kCTIyNCsxMjgoJXJheCksJXltbTMsJXltbTMKKwl2cGFuZAkyNTYtMTI4KCVyc2kpLCV5bW04LCV5bW0wCisJdnBvcgkleW1tMSwleW1tNSwleW1tNQorCXZwYW5kCTI4OC0xMjgoJXJzaSksJXltbTksJXltbTEKKwl2cG9yCSV5bW0yLCV5bW00LCV5bW00CisJdnBhbmQJMzIwLTEyOCglcnNpKSwleW1tMTAsJXltbTIKKwl2cG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbmQJMzUyLTEyOCglcnNpKSwleW1tMTEsJXltbTMKKwl2cG9yCSV5bW0wLCV5bW00LCV5bW00CisJdnBhbmQJMzg0LTEyOCglcnNpKSwleW1tMTIsJXltbTAKKwl2cG9yCSV5bW0xLCV5bW01LCV5bW01CisJdnBhbmQJNDE2LTEyOCglcnNpKSwleW1tMTMsJXltbTEKKwl2cG9yCSV5bW0yLCV5bW00LCV5bW00CisJdnBhbmQJNDQ4LTEyOCglcnNpKSwleW1tMTQsJXltbTIKKwl2cG9yCSV5bW0zLCV5bW01LCV5bW01CisJdnBhbmQJNDgwLTEyOCglcnNpKSwleW1tMTUsJXltbTMKKwlsZWFxCTUxMiglcnNpKSwlcnNpCisJdnBvcgkleW1tMCwleW1tNCwleW1tNAorCXZwb3IJJXltbTEsJXltbTUsJXltbTUKKwl2cG9yCSV5bW0yLCV5bW00LCV5bW00CisJdnBvcgkleW1tMywleW1tNSwleW1tNQorCisJdnBvcgkleW1tNSwleW1tNCwleW1tNAorCXZleHRyYWN0aTEyOAkkMSwleW1tNCwleG1tNQorCXZwb3IJJXhtbTQsJXhtbTUsJXhtbTUKKwl2cGVybWQJJXltbTUsJXltbTcsJXltbTUKKwl2bW92ZHF1CSV5bW01LCglcmRpKQorCWxlYXEJMzIoJXJkaSksJXJkaQorCWRlY2wJJWVkeAorCWpueglMJG9vcF9nYXRoZXJfMTAyNAorCisJdnB4b3IJJXltbTAsJXltbTAsJXltbTAKKwl2bW92ZHF1CSV5bW0wLCglcmRpKQorCXZ6ZXJvdXBwZXIKKwlsZWFxCSglcjExKSwlcnNwCisKKwkuYnl0ZQkweGYzLDB4YzMKKworTCRTRUhfZW5kX3JzYXpfMTAyNF9nYXRoZXI1OgorCisKKy5nbG9ibAlfcnNhel9hdngyX2VsaWdpYmxlCisucHJpdmF0ZV9leHRlcm4gX3JzYXpfYXZ4Ml9lbGlnaWJsZQorCisucDJhbGlnbgk1CitfcnNhel9hdngyX2VsaWdpYmxlOgorCWxlYXEJX09QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyYXgKKwltb3ZsCTgoJXJheCksJWVheAorCW1vdmwJJDUyNDU0NCwlZWN4CisJbW92bAkkMCwlZWR4CisJYW5kbAklZWF4LCVlY3gKKwljbXBsCSQ1MjQ1NDQsJWVjeAorCWNtb3ZlbAklZWR4LCVlYXgKKwlhbmRsCSQzMiwlZWF4CisJc2hybAkkNSwlZWF4CisJLmJ5dGUJMHhmMywweGMzCisKKworLnAyYWxpZ24JNgorTCRhbmRfbWFzazoKKy5xdWFkCTB4MWZmZmZmZmYsMHgxZmZmZmZmZiwweDFmZmZmZmZmLDB4MWZmZmZmZmYKK0wkc2NhdHRlcl9wZXJtZDoKKy5sb25nCTAsMiw0LDYsNyw3LDcsNworTCRnYXRoZXJfcGVybWQ6CisubG9uZwkwLDcsMSw3LDIsNywzLDcKK0wkaW5jOgorLmxvbmcJMCwwLDAsMCwgMSwxLDEsMQorLmxvbmcJMiwyLDIsMiwgMywzLDMsMworLmxvbmcJNCw0LDQsNCwgNCw0LDQsNAorLnAyYWxpZ24JNgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLXg4Nl82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS14ODZfNjQuUwpAQCAtMCwwICsxLDM1ODcgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisKKworLmdsb2JsCV9zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy5wcml2YXRlX2V4dGVybiBfc2hhMV9ibG9ja19kYXRhX29yZGVyCisKKy5wMmFsaWduCTQKK19zaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjEwCisJbW92bAkwKCVyMTApLCVyOWQKKwltb3ZsCTQoJXIxMCksJXI4ZAorCW1vdmwJOCglcjEwKSwlcjEwZAorCXRlc3RsCSQ1MTIsJXI4ZAorCWp6CUwkaWFsdQorCWFuZGwJJDI2ODQzNTQ1NiwlcjhkCisJYW5kbAkkMTA3Mzc0MTgyNCwlcjlkCisJb3JsCSVyOWQsJXI4ZAorCWNtcGwJJDEzNDIxNzcyODAsJXI4ZAorCWplCV9hdnhfc2hvcnRjdXQKKwlqbXAJX3Nzc2UzX3Nob3J0Y3V0CisKKy5wMmFsaWduCTQKK0wkaWFsdToKKwltb3ZxCSVyc3AsJXJheAorCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJbW92cQklcmRpLCVyOAorCXN1YnEJJDcyLCVyc3AKKwltb3ZxCSVyc2ksJXI5CisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZHgsJXIxMAorCW1vdnEJJXJheCw2NCglcnNwKQorCitMJHByb2xvZ3VlOgorCisJbW92bAkwKCVyOCksJWVzaQorCW1vdmwJNCglcjgpLCVlZGkKKwltb3ZsCTgoJXI4KSwlcjExZAorCW1vdmwJMTIoJXI4KSwlcjEyZAorCW1vdmwJMTYoJXI4KSwlcjEzZAorCWptcAlMJGxvb3AKKworLnAyYWxpZ24JNAorTCRsb29wOgorCW1vdmwJMCglcjkpLCVlZHgKKwlic3dhcGwJJWVkeAorCW1vdmwJNCglcjkpLCVlYnAKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVlZHgsMCglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJYnN3YXBsCSVlYnAKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVlZGksJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmR4LCVyMTMsMSksJXIxM2QKKwlhZGRsCSVlY3gsJXIxM2QKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJbW92bAk4KCVyOSksJXIxNGQKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVlYnAsNCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCWJzd2FwbAklcjE0ZAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklZXNpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJicCwlcjEyLDEpLCVyMTJkCisJYWRkbAklZWN4LCVyMTJkCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVheCwlcjEyZAorCW1vdmwJMTIoJXI5KSwlZWR4CisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVyMTRkLDgoJXJzcCkKKwltb3ZsCSVyMTJkLCVlY3gKKwlic3dhcGwJJWVkeAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklcjEzZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyMTQsJXIxMSwxKSwlcjExZAorCWFkZGwJJWVjeCwlcjExZAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYXgsJXIxMWQKKwltb3ZsCTE2KCVyOSksJWVicAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWR4LDEyKCVyc3ApCisJbW92bAklcjExZCwlZWN4CisJYnN3YXBsCSVlYnAKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVyMTJkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJkeCwlcmRpLDEpLCVlZGkKKwlhZGRsCSVlY3gsJWVkaQorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYXgsJWVkaQorCW1vdmwJMjAoJXI5KSwlcjE0ZAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJWVicCwxNiglcnNwKQorCW1vdmwJJWVkaSwlZWN4CisJYnN3YXBsCSVyMTRkCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklcjExZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyYnAsJXJzaSwxKSwlZXNpCisJYWRkbAklZWN4LCVlc2kKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVheCwlZXNpCisJbW92bAkyNCglcjkpLCVlZHgKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVyMTRkLDIwKCVyc3ApCisJbW92bAklZXNpLCVlY3gKKwlic3dhcGwJJWVkeAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJWVkaSwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyMTQsJXIxMywxKSwlcjEzZAorCWFkZGwJJWVjeCwlcjEzZAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDMwLCVlZGkKKwlhZGRsCSVlYXgsJXIxM2QKKwltb3ZsCTI4KCVyOSksJWVicAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJWVkeCwyNCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCWJzd2FwbAklZWJwCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVlc2ksJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmR4LCVyMTIsMSksJXIxMmQKKwlhZGRsCSVlY3gsJXIxMmQKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJbW92bAkzMiglcjkpLCVyMTRkCisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVlYnAsMjgoJXJzcCkKKwltb3ZsCSVyMTJkLCVlY3gKKwlic3dhcGwJJXIxNGQKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJXIxM2QsJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmJwLCVyMTEsMSksJXIxMWQKKwlhZGRsCSVlY3gsJXIxMWQKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJbW92bAkzNiglcjkpLCVlZHgKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJXIxNGQsMzIoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwlic3dhcGwJJWVkeAorCXhvcmwJJXIxM2QsJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJXIxMmQsJWVheAorCWxlYWwJMTUxODUwMDI0OSglcjE0LCVyZGksMSksJWVkaQorCWFkZGwJJWVjeCwlZWRpCisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJbW92bAk0MCglcjkpLCVlYnAKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVlZHgsMzYoJXJzcCkKKwltb3ZsCSVlZGksJWVjeAorCWJzd2FwbAklZWJwCisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJYW5kbAklcjExZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyZHgsJXJzaSwxKSwlZXNpCisJYWRkbAklZWN4LCVlc2kKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVheCwlZXNpCisJbW92bAk0NCglcjkpLCVyMTRkCisJbW92bAklcjEyZCwlZWF4CisJbW92bAklZWJwLDQwKCVyc3ApCisJbW92bAklZXNpLCVlY3gKKwlic3dhcGwJJXIxNGQKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVlZGksJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmJwLCVyMTMsMSksJXIxM2QKKwlhZGRsCSVlY3gsJXIxM2QKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJbW92bAk0OCglcjkpLCVlZHgKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVyMTRkLDQ0KCVyc3ApCisJbW92bAklcjEzZCwlZWN4CisJYnN3YXBsCSVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJWVzaSwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyMTQsJXIxMiwxKSwlcjEyZAorCWFkZGwJJWVjeCwlcjEyZAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYXgsJXIxMmQKKwltb3ZsCTUyKCVyOSksJWVicAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWR4LDQ4KCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJYnN3YXBsCSVlYnAKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDUsJWVjeAorCWFuZGwJJXIxM2QsJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmR4LCVyMTEsMSksJXIxMWQKKwlhZGRsCSVlY3gsJXIxMWQKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJbW92bAk1NiglcjkpLCVyMTRkCisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlYnAsNTIoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwlic3dhcGwJJXIxNGQKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVyMTJkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJicCwlcmRpLDEpLCVlZGkKKwlhZGRsCSVlY3gsJWVkaQorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYXgsJWVkaQorCW1vdmwJNjAoJXI5KSwlZWR4CisJbW92bAklcjEzZCwlZWF4CisJbW92bAklcjE0ZCw1NiglcnNwKQorCW1vdmwJJWVkaSwlZWN4CisJYnN3YXBsCSVlZHgKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwlhbmRsCSVyMTFkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXIxNCwlcnNpLDEpLCVlc2kKKwlhZGRsCSVlY3gsJWVzaQorCXhvcmwJJXIxM2QsJWVheAorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwl4b3JsCTAoJXJzcCksJWVicAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJWVkeCw2MCglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAk4KCVyc3ApLCVlYnAKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTMyKCVyc3ApLCVlYnAKKwlhbmRsCSVlZGksJWVheAorCWxlYWwJMTUxODUwMDI0OSglcmR4LCVyMTMsMSksJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJeG9ybAklcjEyZCwlZWF4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMSwlZWJwCisJYWRkbAklZWF4LCVyMTNkCisJeG9ybAk0KCVyc3ApLCVyMTRkCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWJwLDAoJXJzcCkKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTEyKCVyc3ApLCVyMTRkCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTM2KCVyc3ApLCVyMTRkCisJYW5kbAklZXNpLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJicCwlcjEyLDEpLCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCXhvcmwJJXIxMWQsJWVheAorCWFkZGwJJWVjeCwlcjEyZAorCXJvbGwJJDEsJXIxNGQKKwlhZGRsCSVlYXgsJXIxMmQKKwl4b3JsCTgoJXJzcCksJWVkeAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklcjE0ZCw0KCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAkxNiglcnNwKSwlZWR4CisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTQwKCVyc3ApLCVlZHgKKwlhbmRsCSVyMTNkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXIxNCwlcjExLDEpLCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDEsJWVkeAorCWFkZGwJJWVheCwlcjExZAorCXhvcmwJMTIoJXJzcCksJWVicAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWR4LDgoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTIwKCVyc3ApLCVlYnAKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTQ0KCVyc3ApLCVlYnAKKwlhbmRsCSVyMTJkLCVlYXgKKwlsZWFsCTE1MTg1MDAyNDkoJXJkeCwlcmRpLDEpLCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCXhvcmwJJWVzaSwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQxLCVlYnAKKwlhZGRsCSVlYXgsJWVkaQorCXhvcmwJMTYoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVlYnAsMTIoJXJzcCkKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJMjQoJXJzcCksJXIxNGQKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTQ4KCVyc3ApLCVyMTRkCisJYW5kbAklcjExZCwlZWF4CisJbGVhbAkxNTE4NTAwMjQ5KCVyYnAsJXJzaSwxKSwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwl4b3JsCSVyMTNkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDEsJXIxNGQKKwlhZGRsCSVlYXgsJWVzaQorCXhvcmwJMjAoJXJzcCksJWVkeAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklcjE0ZCwxNiglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAkyOCglcnNwKSwlZWR4CisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk1MiglcnNwKSwlZWR4CisJbGVhbAkxODU5Nzc1MzkzKCVyMTQsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVheAorCWFkZGwJJWVjeCwlcjEzZAorCXJvbGwJJDMwLCVlZGkKKwlhZGRsCSVlYXgsJXIxM2QKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTI0KCVyc3ApLCVlYnAKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVkeCwyMCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJMzIoJXJzcCksJWVicAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNTYoJXJzcCksJWVicAorCWxlYWwJMTg1OTc3NTM5MyglcmR4LCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJJWVjeCwlcjEyZAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYXgsJXIxMmQKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTI4KCVyc3ApLCVyMTRkCisJbW92bAklcjEzZCwlZWF4CisJbW92bAklZWJwLDI0KCVyc3ApCisJbW92bAklcjEyZCwlZWN4CisJeG9ybAkzNiglcnNwKSwlcjE0ZAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk2MCglcnNwKSwlcjE0ZAorCWxlYWwJMTg1OTc3NTM5MyglcmJwLCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJMzIoJXJzcCksJWVkeAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJXIxNGQsMjgoJXJzcCkKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTQwKCVyc3ApLCVlZHgKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMCglcnNwKSwlZWR4CisJbGVhbAkxODU5Nzc1MzkzKCVyMTQsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlZWR4CisJeG9ybAkzNiglcnNwKSwlZWJwCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWR4LDMyKCVyc3ApCisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTQ0KCVyc3ApLCVlYnAKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTQoJXJzcCksJWVicAorCWxlYWwJMTg1OTc3NTM5MyglcmR4LCVyc2ksMSksJWVzaQorCXhvcmwJJXIxMmQsJWVheAorCWFkZGwJJWVjeCwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYXgsJWVzaQorCXJvbGwJJDEsJWVicAorCXhvcmwJNDAoJXJzcCksJXIxNGQKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJWVicCwzNiglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAk0OCglcnNwKSwlcjE0ZAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJOCglcnNwKSwlcjE0ZAorCWxlYWwJMTg1OTc3NTM5MyglcmJwLCVyMTMsMSksJXIxM2QKKwl4b3JsCSVyMTFkLCVlYXgKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJNDQoJXJzcCksJWVkeAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklcjE0ZCw0MCglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJNTIoJXJzcCksJWVkeAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMTIoJXJzcCksJWVkeAorCWxlYWwJMTg1OTc3NTM5MyglcjE0LCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJJWVjeCwlcjEyZAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYXgsJXIxMmQKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTQ4KCVyc3ApLCVlYnAKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVlZHgsNDQoJXJzcCkKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTU2KCVyc3ApLCVlYnAKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMTYoJXJzcCksJWVicAorCWxlYWwJMTg1OTc3NTM5MyglcmR4LCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWJwCisJeG9ybAk1MiglcnNwKSwlcjE0ZAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJWVicCw0OCglcnNwKQorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJNjAoJXJzcCksJXIxNGQKKwl4b3JsCSVlc2ksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMjAoJXJzcCksJXIxNGQKKwlsZWFsCTE4NTk3NzUzOTMoJXJicCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYXgKKwlhZGRsCSVlY3gsJWVkaQorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWF4LCVlZGkKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAk1NiglcnNwKSwlZWR4CisJbW92bAklcjExZCwlZWF4CisJbW92bAklcjE0ZCw1MiglcnNwKQorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAkwKCVyc3ApLCVlZHgKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTI0KCVyc3ApLCVlZHgKKwlsZWFsCTE4NTk3NzUzOTMoJXIxNCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTYwKCVyc3ApLCVlYnAKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJWVkeCw1NiglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAk0KCVyc3ApLCVlYnAKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTI4KCVyc3ApLCVlYnAKKwlsZWFsCTE4NTk3NzUzOTMoJXJkeCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWF4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJWVicAorCXhvcmwJMCglcnNwKSwlcjE0ZAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWJwLDYwKCVyc3ApCisJbW92bAklcjEzZCwlZWN4CisJeG9ybAk4KCVyc3ApLCVyMTRkCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkzMiglcnNwKSwlcjE0ZAorCWxlYWwJMTg1OTc3NTM5MyglcmJwLCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJJWVjeCwlcjEyZAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYXgsJXIxMmQKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAk0KCVyc3ApLCVlZHgKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVyMTRkLDAoJXJzcCkKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTEyKCVyc3ApLCVlZHgKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMzYoJXJzcCksJWVkeAorCWxlYWwJMTg1OTc3NTM5MyglcjE0LCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVheAorCWFkZGwJJWVjeCwlcjExZAorCXJvbGwJJDMwLCVyMTNkCisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWR4CisJeG9ybAk4KCVyc3ApLCVlYnAKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVlZHgsNCglcnNwKQorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJMTYoJXJzcCksJWVicAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0MCglcnNwKSwlZWJwCisJbGVhbAkxODU5Nzc1MzkzKCVyZHgsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlZWJwCisJeG9ybAkxMiglcnNwKSwlcjE0ZAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJWVicCw4KCVyc3ApCisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTIwKCVyc3ApLCVyMTRkCisJeG9ybAklcjEzZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0NCglcnNwKSwlcjE0ZAorCWxlYWwJMTg1OTc3NTM5MyglcmJwLCVyc2ksMSksJWVzaQorCXhvcmwJJXIxMmQsJWVheAorCWFkZGwJJWVjeCwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYXgsJWVzaQorCXJvbGwJJDEsJXIxNGQKKwl4b3JsCTE2KCVyc3ApLCVlZHgKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJXIxNGQsMTIoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJMjQoJXJzcCksJWVkeAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNDgoJXJzcCksJWVkeAorCWxlYWwJMTg1OTc3NTM5MyglcjE0LCVyMTMsMSksJXIxM2QKKwl4b3JsCSVyMTFkLCVlYXgKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlZWR4CisJeG9ybAkyMCglcnNwKSwlZWJwCisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlZHgsMTYoJXJzcCkKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTI4KCVyc3ApLCVlYnAKKwl4b3JsCSVyMTFkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTUyKCVyc3ApLCVlYnAKKwlsZWFsCTE4NTk3NzUzOTMoJXJkeCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlZWJwCisJeG9ybAkyNCglcnNwKSwlcjE0ZAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJWVicCwyMCglcnNwKQorCW1vdmwJJXIxMmQsJWVjeAorCXhvcmwJMzIoJXJzcCksJXIxNGQKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNTYoJXJzcCksJXIxNGQKKwlsZWFsCTE4NTk3NzUzOTMoJXJicCwlcjExLDEpLCVyMTFkCisJeG9ybAklZXNpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMWQKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVheCwlcjExZAorCXJvbGwJJDEsJXIxNGQKKwl4b3JsCTI4KCVyc3ApLCVlZHgKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVyMTRkLDI0KCVyc3ApCisJbW92bAklcjExZCwlZWN4CisJeG9ybAkzNiglcnNwKSwlZWR4CisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTYwKCVyc3ApLCVlZHgKKwlsZWFsCTE4NTk3NzUzOTMoJXIxNCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYXgKKwlhZGRsCSVlY3gsJWVkaQorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWF4LCVlZGkKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTMyKCVyc3ApLCVlYnAKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVlZHgsMjgoJXJzcCkKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJNDAoJXJzcCksJWVicAorCXhvcmwJJXIxM2QsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMCglcnNwKSwlZWJwCisJbGVhbAkxODU5Nzc1MzkzKCVyZHgsJXJzaSwxKSwlZXNpCisJeG9ybAklcjEyZCwlZWF4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVheCwlZXNpCisJcm9sbAkkMSwlZWJwCisJeG9ybAkzNiglcnNwKSwlcjE0ZAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJWVicCwzMiglcnNwKQorCW1vdmwJJXIxMmQsJWVieAorCXhvcmwJNDQoJXJzcCksJXIxNGQKKwlhbmRsCSVyMTFkLCVlYXgKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJNCglcnNwKSwlcjE0ZAorCWxlYWwJLTE4OTQwMDc1ODgoJXJicCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlcjE0ZAorCWFuZGwJJWVkaSwlZWJ4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVieCwlcjEzZAorCXhvcmwJNDAoJXJzcCksJWVkeAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJXIxNGQsMzYoJXJzcCkKKwltb3ZsCSVyMTFkLCVlYngKKwl4b3JsCTQ4KCVyc3ApLCVlZHgKKwlhbmRsCSVlZGksJWVheAorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJOCglcnNwKSwlZWR4CisJbGVhbAktMTg5NDAwNzU4OCglcjE0LCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjEyZAorCXJvbGwJJDEsJWVkeAorCWFuZGwJJWVzaSwlZWJ4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVieCwlcjEyZAorCXhvcmwJNDQoJXJzcCksJWVicAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWR4LDQwKCVyc3ApCisJbW92bAklZWRpLCVlYngKKwl4b3JsCTUyKCVyc3ApLCVlYnAKKwlhbmRsCSVlc2ksJWVheAorCW1vdmwJJXIxMmQsJWVjeAorCXhvcmwJMTIoJXJzcCksJWVicAorCWxlYWwJLTE4OTQwMDc1ODgoJXJkeCwlcjExLDEpLCVyMTFkCisJeG9ybAklZXNpLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJXIxMWQKKwlyb2xsCSQxLCVlYnAKKwlhbmRsCSVyMTNkLCVlYngKKwlhZGRsCSVlY3gsJXIxMWQKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVieCwlcjExZAorCXhvcmwJNDgoJXJzcCksJXIxNGQKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVicCw0NCglcnNwKQorCW1vdmwJJWVzaSwlZWJ4CisJeG9ybAk1NiglcnNwKSwlcjE0ZAorCWFuZGwJJXIxM2QsJWVheAorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJMTYoJXJzcCksJXIxNGQKKwlsZWFsCS0xODk0MDA3NTg4KCVyYnAsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVlZGkKKwlyb2xsCSQxLCVyMTRkCisJYW5kbAklcjEyZCwlZWJ4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVieCwlZWRpCisJeG9ybAk1MiglcnNwKSwlZWR4CisJbW92bAklcjEzZCwlZWF4CisJbW92bAklcjE0ZCw0OCglcnNwKQorCW1vdmwJJXIxM2QsJWVieAorCXhvcmwJNjAoJXJzcCksJWVkeAorCWFuZGwJJXIxMmQsJWVheAorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAkyMCglcnNwKSwlZWR4CisJbGVhbAktMTg5NDAwNzU4OCglcjE0LCVyc2ksMSksJWVzaQorCXhvcmwJJXIxMmQsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlZXNpCisJcm9sbAkkMSwlZWR4CisJYW5kbAklcjExZCwlZWJ4CisJYWRkbAklZWN4LCVlc2kKKwlyb2xsCSQzMCwlcjExZAorCWFkZGwJJWVieCwlZXNpCisJeG9ybAk1NiglcnNwKSwlZWJwCisJbW92bAklcjEyZCwlZWF4CisJbW92bAklZWR4LDUyKCVyc3ApCisJbW92bAklcjEyZCwlZWJ4CisJeG9ybAkwKCVyc3ApLCVlYnAKKwlhbmRsCSVyMTFkLCVlYXgKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJMjQoJXJzcCksJWVicAorCWxlYWwJLTE4OTQwMDc1ODgoJXJkeCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlZWJwCisJYW5kbAklZWRpLCVlYngKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWJ4LCVyMTNkCisJeG9ybAk2MCglcnNwKSwlcjE0ZAorCW1vdmwJJXIxMWQsJWVheAorCW1vdmwJJWVicCw1NiglcnNwKQorCW1vdmwJJXIxMWQsJWVieAorCXhvcmwJNCglcnNwKSwlcjE0ZAorCWFuZGwJJWVkaSwlZWF4CisJbW92bAklcjEzZCwlZWN4CisJeG9ybAkyOCglcnNwKSwlcjE0ZAorCWxlYWwJLTE4OTQwMDc1ODgoJXJicCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJXIxMmQKKwlyb2xsCSQxLCVyMTRkCisJYW5kbAklZXNpLCVlYngKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWJ4LCVyMTJkCisJeG9ybAkwKCVyc3ApLCVlZHgKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJXIxNGQsNjAoJXJzcCkKKwltb3ZsCSVlZGksJWVieAorCXhvcmwJOCglcnNwKSwlZWR4CisJYW5kbAklZXNpLCVlYXgKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTMyKCVyc3ApLCVlZHgKKwlsZWFsCS0xODk0MDA3NTg4KCVyMTQsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWR4CisJYW5kbAklcjEzZCwlZWJ4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYngsJXIxMWQKKwl4b3JsCTQoJXJzcCksJWVicAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWR4LDAoJXJzcCkKKwltb3ZsCSVlc2ksJWVieAorCXhvcmwJMTIoJXJzcCksJWVicAorCWFuZGwJJXIxM2QsJWVheAorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJMzYoJXJzcCksJWVicAorCWxlYWwJLTE4OTQwMDc1ODgoJXJkeCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJWVkaQorCXJvbGwJJDEsJWVicAorCWFuZGwJJXIxMmQsJWVieAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYngsJWVkaQorCXhvcmwJOCglcnNwKSwlcjE0ZAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJWVicCw0KCVyc3ApCisJbW92bAklcjEzZCwlZWJ4CisJeG9ybAkxNiglcnNwKSwlcjE0ZAorCWFuZGwJJXIxMmQsJWVheAorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAk0MCglcnNwKSwlcjE0ZAorCWxlYWwJLTE4OTQwMDc1ODgoJXJicCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJWVzaQorCXJvbGwJJDEsJXIxNGQKKwlhbmRsCSVyMTFkLCVlYngKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWJ4LCVlc2kKKwl4b3JsCTEyKCVyc3ApLCVlZHgKKwltb3ZsCSVyMTJkLCVlYXgKKwltb3ZsCSVyMTRkLDgoJXJzcCkKKwltb3ZsCSVyMTJkLCVlYngKKwl4b3JsCTIwKCVyc3ApLCVlZHgKKwlhbmRsCSVyMTFkLCVlYXgKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJNDQoJXJzcCksJWVkeAorCWxlYWwJLTE4OTQwMDc1ODgoJXIxNCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlZWR4CisJYW5kbAklZWRpLCVlYngKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWJ4LCVyMTNkCisJeG9ybAkxNiglcnNwKSwlZWJwCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWR4LDEyKCVyc3ApCisJbW92bAklcjExZCwlZWJ4CisJeG9ybAkyNCglcnNwKSwlZWJwCisJYW5kbAklZWRpLCVlYXgKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTQ4KCVyc3ApLCVlYnAKKwlsZWFsCS0xODk0MDA3NTg4KCVyZHgsJXIxMiwxKSwlcjEyZAorCXhvcmwJJWVkaSwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlZWJwCisJYW5kbAklZXNpLCVlYngKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWJ4LCVyMTJkCisJeG9ybAkyMCglcnNwKSwlcjE0ZAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWJwLDE2KCVyc3ApCisJbW92bAklZWRpLCVlYngKKwl4b3JsCTI4KCVyc3ApLCVyMTRkCisJYW5kbAklZXNpLCVlYXgKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTUyKCVyc3ApLCVyMTRkCisJbGVhbAktMTg5NDAwNzU4OCglcmJwLCVyMTEsMSksJXIxMWQKKwl4b3JsCSVlc2ksJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlcjExZAorCXJvbGwJJDEsJXIxNGQKKwlhbmRsCSVyMTNkLCVlYngKKwlhZGRsCSVlY3gsJXIxMWQKKwlyb2xsCSQzMCwlcjEzZAorCWFkZGwJJWVieCwlcjExZAorCXhvcmwJMjQoJXJzcCksJWVkeAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklcjE0ZCwyMCglcnNwKQorCW1vdmwJJWVzaSwlZWJ4CisJeG9ybAkzMiglcnNwKSwlZWR4CisJYW5kbAklcjEzZCwlZWF4CisJbW92bAklcjExZCwlZWN4CisJeG9ybAk1NiglcnNwKSwlZWR4CisJbGVhbAktMTg5NDAwNzU4OCglcjE0LCVyZGksMSksJWVkaQorCXhvcmwJJXIxM2QsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlZWR4CisJYW5kbAklcjEyZCwlZWJ4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVieCwlZWRpCisJeG9ybAkyOCglcnNwKSwlZWJwCisJbW92bAklcjEzZCwlZWF4CisJbW92bAklZWR4LDI0KCVyc3ApCisJbW92bAklcjEzZCwlZWJ4CisJeG9ybAkzNiglcnNwKSwlZWJwCisJYW5kbAklcjEyZCwlZWF4CisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTYwKCVyc3ApLCVlYnAKKwlsZWFsCS0xODk0MDA3NTg4KCVyZHgsJXJzaSwxKSwlZXNpCisJeG9ybAklcjEyZCwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVlYnAKKwlhbmRsCSVyMTFkLCVlYngKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWJ4LCVlc2kKKwl4b3JsCTMyKCVyc3ApLCVyMTRkCisJbW92bAklcjEyZCwlZWF4CisJbW92bAklZWJwLDI4KCVyc3ApCisJbW92bAklcjEyZCwlZWJ4CisJeG9ybAk0MCglcnNwKSwlcjE0ZAorCWFuZGwJJXIxMWQsJWVheAorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAkwKCVyc3ApLCVyMTRkCisJbGVhbAktMTg5NDAwNzU4OCglcmJwLCVyMTMsMSksJXIxM2QKKwl4b3JsCSVyMTFkLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJXIxM2QKKwlyb2xsCSQxLCVyMTRkCisJYW5kbAklZWRpLCVlYngKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWJ4LCVyMTNkCisJeG9ybAkzNiglcnNwKSwlZWR4CisJbW92bAklcjExZCwlZWF4CisJbW92bAklcjE0ZCwzMiglcnNwKQorCW1vdmwJJXIxMWQsJWVieAorCXhvcmwJNDQoJXJzcCksJWVkeAorCWFuZGwJJWVkaSwlZWF4CisJbW92bAklcjEzZCwlZWN4CisJeG9ybAk0KCVyc3ApLCVlZHgKKwlsZWFsCS0xODk0MDA3NTg4KCVyMTQsJXIxMiwxKSwlcjEyZAorCXhvcmwJJWVkaSwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlZWR4CisJYW5kbAklZXNpLCVlYngKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWJ4LCVyMTJkCisJeG9ybAk0MCglcnNwKSwlZWJwCisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVlZHgsMzYoJXJzcCkKKwltb3ZsCSVlZGksJWVieAorCXhvcmwJNDgoJXJzcCksJWVicAorCWFuZGwJJWVzaSwlZWF4CisJbW92bAklcjEyZCwlZWN4CisJeG9ybAk4KCVyc3ApLCVlYnAKKwlsZWFsCS0xODk0MDA3NTg4KCVyZHgsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWJ4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWF4LCVyMTFkCisJcm9sbAkkMSwlZWJwCisJYW5kbAklcjEzZCwlZWJ4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYngsJXIxMWQKKwl4b3JsCTQ0KCVyc3ApLCVyMTRkCisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlYnAsNDAoJXJzcCkKKwltb3ZsCSVlc2ksJWVieAorCXhvcmwJNTIoJXJzcCksJXIxNGQKKwlhbmRsCSVyMTNkLCVlYXgKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTEyKCVyc3ApLCVyMTRkCisJbGVhbAktMTg5NDAwNzU4OCglcmJwLCVyZGksMSksJWVkaQorCXhvcmwJJXIxM2QsJWVieAorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlcjE0ZAorCWFuZGwJJXIxMmQsJWVieAorCWFkZGwJJWVjeCwlZWRpCisJcm9sbAkkMzAsJXIxMmQKKwlhZGRsCSVlYngsJWVkaQorCXhvcmwJNDgoJXJzcCksJWVkeAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJXIxNGQsNDQoJXJzcCkKKwltb3ZsCSVyMTNkLCVlYngKKwl4b3JsCTU2KCVyc3ApLCVlZHgKKwlhbmRsCSVyMTJkLCVlYXgKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJMTYoJXJzcCksJWVkeAorCWxlYWwJLTE4OTQwMDc1ODgoJXIxNCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYngKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlYXgsJWVzaQorCXJvbGwJJDEsJWVkeAorCWFuZGwJJXIxMWQsJWVieAorCWFkZGwJJWVjeCwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYngsJWVzaQorCXhvcmwJNTIoJXJzcCksJWVicAorCW1vdmwJJWVkaSwlZWF4CisJbW92bAklZWR4LDQ4KCVyc3ApCisJbW92bAklZXNpLCVlY3gKKwl4b3JsCTYwKCVyc3ApLCVlYnAKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTIwKCVyc3ApLCVlYnAKKwlsZWFsCS04OTk0OTc1MTQoJXJkeCwlcjEzLDEpLCVyMTNkCisJeG9ybAklcjExZCwlZWF4CisJYWRkbAklZWN4LCVyMTNkCisJcm9sbAkkMzAsJWVkaQorCWFkZGwJJWVheCwlcjEzZAorCXJvbGwJJDEsJWVicAorCXhvcmwJNTYoJXJzcCksJXIxNGQKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVicCw1MiglcnNwKQorCW1vdmwJJXIxM2QsJWVjeAorCXhvcmwJMCglcnNwKSwlcjE0ZAorCXhvcmwJJXIxMWQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMjQoJXJzcCksJXIxNGQKKwlsZWFsCS04OTk0OTc1MTQoJXJicCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlcjE0ZAorCXhvcmwJNjAoJXJzcCksJWVkeAorCW1vdmwJJXIxM2QsJWVheAorCW1vdmwJJXIxNGQsNTYoJXJzcCkKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTQoJXJzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkyOCglcnNwKSwlZWR4CisJbGVhbAktODk5NDk3NTE0KCVyMTQsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWF4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYXgsJXIxMWQKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTAoJXJzcCksJWVicAorCW1vdmwJJXIxMmQsJWVheAorCW1vdmwJJWVkeCw2MCglcnNwKQorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJOCglcnNwKSwlZWJwCisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTMyKCVyc3ApLCVlYnAKKwlsZWFsCS04OTk0OTc1MTQoJXJkeCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYXgKKwlhZGRsCSVlY3gsJWVkaQorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWF4LCVlZGkKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTQoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVlYnAsMCglcnNwKQorCW1vdmwJJWVkaSwlZWN4CisJeG9ybAkxMiglcnNwKSwlcjE0ZAorCXhvcmwJJXIxM2QsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMzYoJXJzcCksJXIxNGQKKwlsZWFsCS04OTk0OTc1MTQoJXJicCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAk4KCVyc3ApLCVlZHgKKwltb3ZsCSVlZGksJWVheAorCW1vdmwJJXIxNGQsNCglcnNwKQorCW1vdmwJJWVzaSwlZWN4CisJeG9ybAkxNiglcnNwKSwlZWR4CisJeG9ybAklcjEyZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0MCglcnNwKSwlZWR4CisJbGVhbAktODk5NDk3NTE0KCVyMTQsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVheAorCWFkZGwJJWVjeCwlcjEzZAorCXJvbGwJJDMwLCVlZGkKKwlhZGRsCSVlYXgsJXIxM2QKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTEyKCVyc3ApLCVlYnAKKwltb3ZsCSVlc2ksJWVheAorCW1vdmwJJWVkeCw4KCVyc3ApCisJbW92bAklcjEzZCwlZWN4CisJeG9ybAkyMCglcnNwKSwlZWJwCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk0NCglcnNwKSwlZWJwCisJbGVhbAktODk5NDk3NTE0KCVyZHgsJXIxMiwxKSwlcjEyZAorCXhvcmwJJWVkaSwlZWF4CisJYWRkbAklZWN4LCVyMTJkCisJcm9sbAkkMzAsJWVzaQorCWFkZGwJJWVheCwlcjEyZAorCXJvbGwJJDEsJWVicAorCXhvcmwJMTYoJXJzcCksJXIxNGQKKwltb3ZsCSVyMTNkLCVlYXgKKwltb3ZsCSVlYnAsMTIoJXJzcCkKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTI0KCVyc3ApLCVyMTRkCisJeG9ybAklZWRpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTQ4KCVyc3ApLCVyMTRkCisJbGVhbAktODk5NDk3NTE0KCVyYnAsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWF4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYXgsJXIxMWQKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAkyMCglcnNwKSwlZWR4CisJbW92bAklcjEyZCwlZWF4CisJbW92bAklcjE0ZCwxNiglcnNwKQorCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJMjgoJXJzcCksJWVkeAorCXhvcmwJJWVzaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAk1MiglcnNwKSwlZWR4CisJbGVhbAktODk5NDk3NTE0KCVyMTQsJXJkaSwxKSwlZWRpCisJeG9ybAklcjEzZCwlZWF4CisJYWRkbAklZWN4LCVlZGkKKwlyb2xsCSQzMCwlcjEyZAorCWFkZGwJJWVheCwlZWRpCisJcm9sbAkkMSwlZWR4CisJeG9ybAkyNCglcnNwKSwlZWJwCisJbW92bAklcjExZCwlZWF4CisJbW92bAklZWR4LDIwKCVyc3ApCisJbW92bAklZWRpLCVlY3gKKwl4b3JsCTMyKCVyc3ApLCVlYnAKKwl4b3JsCSVyMTNkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTU2KCVyc3ApLCVlYnAKKwlsZWFsCS04OTk0OTc1MTQoJXJkeCwlcnNpLDEpLCVlc2kKKwl4b3JsCSVyMTJkLCVlYXgKKwlhZGRsCSVlY3gsJWVzaQorCXJvbGwJJDMwLCVyMTFkCisJYWRkbAklZWF4LCVlc2kKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTI4KCVyc3ApLCVyMTRkCisJbW92bAklZWRpLCVlYXgKKwltb3ZsCSVlYnAsMjQoJXJzcCkKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJMzYoJXJzcCksJXIxNGQKKwl4b3JsCSVyMTJkLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTYwKCVyc3ApLCVyMTRkCisJbGVhbAktODk5NDk3NTE0KCVyYnAsJXIxMywxKSwlcjEzZAorCXhvcmwJJXIxMWQsJWVheAorCWFkZGwJJWVjeCwlcjEzZAorCXJvbGwJJDMwLCVlZGkKKwlhZGRsCSVlYXgsJXIxM2QKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAkzMiglcnNwKSwlZWR4CisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVyMTRkLDI4KCVyc3ApCisJbW92bAklcjEzZCwlZWN4CisJeG9ybAk0MCglcnNwKSwlZWR4CisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkwKCVyc3ApLCVlZHgKKwlsZWFsCS04OTk0OTc1MTQoJXIxNCwlcjEyLDEpLCVyMTJkCisJeG9ybAklZWRpLCVlYXgKKwlhZGRsCSVlY3gsJXIxMmQKKwlyb2xsCSQzMCwlZXNpCisJYWRkbAklZWF4LCVyMTJkCisJcm9sbAkkMSwlZWR4CisJeG9ybAkzNiglcnNwKSwlZWJwCisJbW92bAklcjEzZCwlZWF4CisKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTQ0KCVyc3ApLCVlYnAKKwl4b3JsCSVlZGksJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJNCglcnNwKSwlZWJwCisJbGVhbAktODk5NDk3NTE0KCVyZHgsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWF4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYXgsJXIxMWQKKwlyb2xsCSQxLCVlYnAKKwl4b3JsCTQwKCVyc3ApLCVyMTRkCisJbW92bAklcjEyZCwlZWF4CisKKwltb3ZsCSVyMTFkLCVlY3gKKwl4b3JsCTQ4KCVyc3ApLCVyMTRkCisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTgoJXJzcCksJXIxNGQKKwlsZWFsCS04OTk0OTc1MTQoJXJicCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYXgKKwlhZGRsCSVlY3gsJWVkaQorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWF4LCVlZGkKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAk0NCglcnNwKSwlZWR4CisJbW92bAklcjExZCwlZWF4CisKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJNTIoJXJzcCksJWVkeAorCXhvcmwJJXIxM2QsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMTIoJXJzcCksJWVkeAorCWxlYWwJLTg5OTQ5NzUxNCglcjE0LCVyc2ksMSksJWVzaQorCXhvcmwJJXIxMmQsJWVheAorCWFkZGwJJWVjeCwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYXgsJWVzaQorCXJvbGwJJDEsJWVkeAorCXhvcmwJNDgoJXJzcCksJWVicAorCW1vdmwJJWVkaSwlZWF4CisKKwltb3ZsCSVlc2ksJWVjeAorCXhvcmwJNTYoJXJzcCksJWVicAorCXhvcmwJJXIxMmQsJWVheAorCXJvbGwJJDUsJWVjeAorCXhvcmwJMTYoJXJzcCksJWVicAorCWxlYWwJLTg5OTQ5NzUxNCglcmR4LCVyMTMsMSksJXIxM2QKKwl4b3JsCSVyMTFkLCVlYXgKKwlhZGRsCSVlY3gsJXIxM2QKKwlyb2xsCSQzMCwlZWRpCisJYWRkbAklZWF4LCVyMTNkCisJcm9sbAkkMSwlZWJwCisJeG9ybAk1MiglcnNwKSwlcjE0ZAorCW1vdmwJJWVzaSwlZWF4CisKKwltb3ZsCSVyMTNkLCVlY3gKKwl4b3JsCTYwKCVyc3ApLCVyMTRkCisJeG9ybAklcjExZCwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkyMCglcnNwKSwlcjE0ZAorCWxlYWwJLTg5OTQ5NzUxNCglcmJwLCVyMTIsMSksJXIxMmQKKwl4b3JsCSVlZGksJWVheAorCWFkZGwJJWVjeCwlcjEyZAorCXJvbGwJJDMwLCVlc2kKKwlhZGRsCSVlYXgsJXIxMmQKKwlyb2xsCSQxLCVyMTRkCisJeG9ybAk1NiglcnNwKSwlZWR4CisJbW92bAklcjEzZCwlZWF4CisKKwltb3ZsCSVyMTJkLCVlY3gKKwl4b3JsCTAoJXJzcCksJWVkeAorCXhvcmwJJWVkaSwlZWF4CisJcm9sbAkkNSwlZWN4CisJeG9ybAkyNCglcnNwKSwlZWR4CisJbGVhbAktODk5NDk3NTE0KCVyMTQsJXIxMSwxKSwlcjExZAorCXhvcmwJJWVzaSwlZWF4CisJYWRkbAklZWN4LCVyMTFkCisJcm9sbAkkMzAsJXIxM2QKKwlhZGRsCSVlYXgsJXIxMWQKKwlyb2xsCSQxLCVlZHgKKwl4b3JsCTYwKCVyc3ApLCVlYnAKKwltb3ZsCSVyMTJkLCVlYXgKKworCW1vdmwJJXIxMWQsJWVjeAorCXhvcmwJNCglcnNwKSwlZWJwCisJeG9ybAklZXNpLCVlYXgKKwlyb2xsCSQ1LCVlY3gKKwl4b3JsCTI4KCVyc3ApLCVlYnAKKwlsZWFsCS04OTk0OTc1MTQoJXJkeCwlcmRpLDEpLCVlZGkKKwl4b3JsCSVyMTNkLCVlYXgKKwlhZGRsCSVlY3gsJWVkaQorCXJvbGwJJDMwLCVyMTJkCisJYWRkbAklZWF4LCVlZGkKKwlyb2xsCSQxLCVlYnAKKwltb3ZsCSVyMTFkLCVlYXgKKwltb3ZsCSVlZGksJWVjeAorCXhvcmwJJXIxM2QsJWVheAorCWxlYWwJLTg5OTQ5NzUxNCglcmJwLCVyc2ksMSksJWVzaQorCXJvbGwJJDUsJWVjeAorCXhvcmwJJXIxMmQsJWVheAorCWFkZGwJJWVjeCwlZXNpCisJcm9sbAkkMzAsJXIxMWQKKwlhZGRsCSVlYXgsJWVzaQorCWFkZGwJMCglcjgpLCVlc2kKKwlhZGRsCTQoJXI4KSwlZWRpCisJYWRkbAk4KCVyOCksJXIxMWQKKwlhZGRsCTEyKCVyOCksJXIxMmQKKwlhZGRsCTE2KCVyOCksJXIxM2QKKwltb3ZsCSVlc2ksMCglcjgpCisJbW92bAklZWRpLDQoJXI4KQorCW1vdmwJJXIxMWQsOCglcjgpCisJbW92bAklcjEyZCwxMiglcjgpCisJbW92bAklcjEzZCwxNiglcjgpCisKKwlzdWJxCSQxLCVyMTAKKwlsZWFxCTY0KCVyOSksJXI5CisJam56CUwkbG9vcAorCisJbW92cQk2NCglcnNwKSwlcnNpCisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRlcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTQKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMzoKK19zc3NlM19zaG9ydGN1dDoKKworCW1vdnEJJXJzcCwlcjExCisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlsZWFxCS02NCglcnNwKSwlcnNwCisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZGksJXI4CisJbW92cQklcnNpLCVyOQorCW1vdnEJJXJkeCwlcjEwCisKKwlzaGxxCSQ2LCVyMTAKKwlhZGRxCSVyOSwlcjEwCisJbGVhcQlLX1hYX1hYKzY0KCVyaXApLCVyMTQKKworCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92bAklZWJ4LCVlc2kKKwltb3ZsCTE2KCVyOCksJWVicAorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlZGkKKwlhbmRsCSVlZGksJWVzaQorCisJbW92ZHFhCTY0KCVyMTQpLCV4bW02CisJbW92ZHFhCS02NCglcjE0KSwleG1tOQorCW1vdmRxdQkwKCVyOSksJXhtbTAKKwltb3ZkcXUJMTYoJXI5KSwleG1tMQorCW1vdmRxdQkzMiglcjkpLCV4bW0yCisJbW92ZHF1CTQ4KCVyOSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDE5OAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA2CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTQKKwlhZGRxCSQ2NCwlcjkKKwlwYWRkZAkleG1tOSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJJXhtbTksJXhtbTEKKwlwYWRkZAkleG1tOSwleG1tMgorCW1vdmRxYQkleG1tMCwwKCVyc3ApCisJcHN1YmQJJXhtbTksJXhtbTAKKwltb3ZkcWEJJXhtbTEsMTYoJXJzcCkKKwlwc3ViZAkleG1tOSwleG1tMQorCW1vdmRxYQkleG1tMiwzMiglcnNwKQorCXBzdWJkCSV4bW05LCV4bW0yCisJam1wCUwkb29wX3Nzc2UzCisucDJhbGlnbgk0CitMJG9vcF9zc3NlMzoKKwlyb3JsCSQyLCVlYngKKwlwc2h1ZmQJJDIzOCwleG1tMCwleG1tNAorCXhvcmwJJWVkeCwlZXNpCisJbW92ZHFhCSV4bW0zLCV4bW04CisJcGFkZGQJJXhtbTMsJXhtbTkKKwltb3ZsCSVlYXgsJWVkaQorCWFkZGwJMCglcnNwKSwlZWJwCisJcHVucGNrbHFkcQkleG1tMSwleG1tNAorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwlwc3JsZHEJJDQsJXhtbTgKKwlhbmRsCSVlYngsJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJcHhvcgkleG1tMCwleG1tNAorCWFkZGwJJWVheCwlZWJwCisJcm9ybAkkNywlZWF4CisJcHhvcgkleG1tMiwleG1tOAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlhZGRsCTQoJXJzcCksJWVkeAorCXB4b3IJJXhtbTgsJXhtbTQKKwl4b3JsCSVlYngsJWVheAorCXJvbGwJJDUsJWVicAorCW1vdmRxYQkleG1tOSw0OCglcnNwKQorCWFkZGwJJWVkaSwlZWR4CisJYW5kbAklZWF4LCVlc2kKKwltb3ZkcWEJJXhtbTQsJXhtbTEwCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXJvcmwJJDcsJWVicAorCW1vdmRxYQkleG1tNCwleG1tOAorCXhvcmwJJWVieCwlZXNpCisJcHNsbGRxCSQxMiwleG1tMTAKKwlwYWRkZAkleG1tNCwleG1tNAorCW1vdmwJJWVkeCwlZWRpCisJYWRkbAk4KCVyc3ApLCVlY3gKKwlwc3JsZAkkMzEsJXhtbTgKKwl4b3JsCSVlYXgsJWVicAorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJbW92ZHFhCSV4bW0xMCwleG1tOQorCWFuZGwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlwc3JsZAkkMzAsJXhtbTEwCisJYWRkbAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlZHgKKwlwb3IJJXhtbTgsJXhtbTQKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJYWRkbAkxMiglcnNwKSwlZWJ4CisJcHNsbGQJJDIsJXhtbTkKKwlweG9yCSV4bW0xMCwleG1tNAorCXhvcmwJJWVicCwlZWR4CisJbW92ZHFhCS02NCglcjE0KSwleG1tMTAKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCWFuZGwJJWVkeCwlZXNpCisJcHhvcgkleG1tOSwleG1tNAorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlY3gKKwlwc2h1ZmQJJDIzOCwleG1tMSwleG1tNQorCXhvcmwJJWVicCwlZXNpCisJbW92ZHFhCSV4bW00LCV4bW05CisJcGFkZGQJJXhtbTQsJXhtbTEwCisJbW92bAklZWJ4LCVlZGkKKwlhZGRsCTE2KCVyc3ApLCVlYXgKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW01CisJeG9ybAklZWR4LCVlY3gKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXBzcmxkcQkkNCwleG1tOQorCWFuZGwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwlweG9yCSV4bW0xLCV4bW01CisJYWRkbAklZWJ4LCVlYXgKKwlyb3JsCSQ3LCVlYngKKwlweG9yCSV4bW0zLCV4bW05CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCWFkZGwJMjAoJXJzcCksJWVicAorCXB4b3IJJXhtbTksJXhtbTUKKwl4b3JsCSVlY3gsJWVieAorCXJvbGwJJDUsJWVheAorCW1vdmRxYQkleG1tMTAsMCglcnNwKQorCWFkZGwJJWVkaSwlZWJwCisJYW5kbAklZWJ4LCVlc2kKKwltb3ZkcWEJJXhtbTUsJXhtbTgKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJcm9ybAkkNywlZWF4CisJbW92ZHFhCSV4bW01LCV4bW05CisJeG9ybAklZWN4LCVlc2kKKwlwc2xsZHEJJDEyLCV4bW04CisJcGFkZGQJJXhtbTUsJXhtbTUKKwltb3ZsCSVlYnAsJWVkaQorCWFkZGwJMjQoJXJzcCksJWVkeAorCXBzcmxkCSQzMSwleG1tOQorCXhvcmwJJWVieCwlZWF4CisJcm9sbAkkNSwlZWJwCisJYWRkbAklZXNpLCVlZHgKKwltb3ZkcWEJJXhtbTgsJXhtbTEwCisJYW5kbAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCXBzcmxkCSQzMCwleG1tOAorCWFkZGwJJWVicCwlZWR4CisJcm9ybAkkNywlZWJwCisJcG9yCSV4bW05LCV4bW01CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCWFkZGwJMjgoJXJzcCksJWVjeAorCXBzbGxkCSQyLCV4bW0xMAorCXB4b3IJJXhtbTgsJXhtbTUKKwl4b3JsCSVlYXgsJWVicAorCW1vdmRxYQktMzIoJXIxNCksJXhtbTgKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCWFuZGwJJWVicCwlZXNpCisJcHhvcgkleG1tMTAsJXhtbTUKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJcm9ybAkkNywlZWR4CisJcHNodWZkCSQyMzgsJXhtbTIsJXhtbTYKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmRxYQkleG1tNSwleG1tMTAKKwlwYWRkZAkleG1tNSwleG1tOAorCW1vdmwJJWVjeCwlZWRpCisJYWRkbAkzMiglcnNwKSwlZWJ4CisJcHVucGNrbHFkcQkleG1tMywleG1tNgorCXhvcmwJJWVicCwlZWR4CisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwlwc3JsZHEJJDQsJXhtbTEwCisJYW5kbAklZWR4LCVlZGkKKwl4b3JsCSVlYnAsJWVkeAorCXB4b3IJJXhtbTIsJXhtbTYKKwlhZGRsCSVlY3gsJWVieAorCXJvcmwJJDcsJWVjeAorCXB4b3IJJXhtbTQsJXhtbTEwCisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCWFkZGwJMzYoJXJzcCksJWVheAorCXB4b3IJJXhtbTEwLCV4bW02CisJeG9ybAklZWR4LCVlY3gKKwlyb2xsCSQ1LCVlYngKKwltb3ZkcWEJJXhtbTgsMTYoJXJzcCkKKwlhZGRsCSVlZGksJWVheAorCWFuZGwJJWVjeCwlZXNpCisJbW92ZHFhCSV4bW02LCV4bW05CisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXJvcmwJJDcsJWVieAorCW1vdmRxYQkleG1tNiwleG1tMTAKKwl4b3JsCSVlZHgsJWVzaQorCXBzbGxkcQkkMTIsJXhtbTkKKwlwYWRkZAkleG1tNiwleG1tNgorCW1vdmwJJWVheCwlZWRpCisJYWRkbAk0MCglcnNwKSwlZWJwCisJcHNybGQJJDMxLCV4bW0xMAorCXhvcmwJJWVjeCwlZWJ4CisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwltb3ZkcWEJJXhtbTksJXhtbTgKKwlhbmRsCSVlYngsJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJcHNybGQJJDMwLCV4bW05CisJYWRkbAklZWF4LCVlYnAKKwlyb3JsCSQ3LCVlYXgKKwlwb3IJJXhtbTEwLCV4bW02CisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCWFkZGwJNDQoJXJzcCksJWVkeAorCXBzbGxkCSQyLCV4bW04CisJcHhvcgkleG1tOSwleG1tNgorCXhvcmwJJWVieCwlZWF4CisJbW92ZHFhCS0zMiglcjE0KSwleG1tOQorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJYW5kbAklZWF4LCVlc2kKKwlweG9yCSV4bW04LCV4bW02CisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXJvcmwJJDcsJWVicAorCXBzaHVmZAkkMjM4LCV4bW0zLCV4bW03CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZkcWEJJXhtbTYsJXhtbTgKKwlwYWRkZAkleG1tNiwleG1tOQorCW1vdmwJJWVkeCwlZWRpCisJYWRkbAk0OCglcnNwKSwlZWN4CisJcHVucGNrbHFkcQkleG1tNCwleG1tNworCXhvcmwJJWVheCwlZWJwCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwlwc3JsZHEJJDQsJXhtbTgKKwlhbmRsCSVlYnAsJWVkaQorCXhvcmwJJWVheCwlZWJwCisJcHhvcgkleG1tMywleG1tNworCWFkZGwJJWVkeCwlZWN4CisJcm9ybAkkNywlZWR4CisJcHhvcgkleG1tNSwleG1tOAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlhZGRsCTUyKCVyc3ApLCVlYngKKwlweG9yCSV4bW04LCV4bW03CisJeG9ybAklZWJwLCVlZHgKKwlyb2xsCSQ1LCVlY3gKKwltb3ZkcWEJJXhtbTksMzIoJXJzcCkKKwlhZGRsCSVlZGksJWVieAorCWFuZGwJJWVkeCwlZXNpCisJbW92ZHFhCSV4bW03LCV4bW0xMAorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlY3gKKwltb3ZkcWEJJXhtbTcsJXhtbTgKKwl4b3JsCSVlYnAsJWVzaQorCXBzbGxkcQkkMTIsJXhtbTEwCisJcGFkZGQJJXhtbTcsJXhtbTcKKwltb3ZsCSVlYngsJWVkaQorCWFkZGwJNTYoJXJzcCksJWVheAorCXBzcmxkCSQzMSwleG1tOAorCXhvcmwJJWVkeCwlZWN4CisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwltb3ZkcWEJJXhtbTEwLCV4bW05CisJYW5kbAklZWN4LCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCXBzcmxkCSQzMCwleG1tMTAKKwlhZGRsCSVlYngsJWVheAorCXJvcmwJJDcsJWVieAorCXBvcgkleG1tOCwleG1tNworCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlhZGRsCTYwKCVyc3ApLCVlYnAKKwlwc2xsZAkkMiwleG1tOQorCXB4b3IJJXhtbTEwLCV4bW03CisJeG9ybAklZWN4LCVlYngKKwltb3ZkcWEJLTMyKCVyMTQpLCV4bW0xMAorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJYW5kbAklZWJ4LCVlc2kKKwlweG9yCSV4bW05LCV4bW03CisJcHNodWZkCSQyMzgsJXhtbTYsJXhtbTkKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJcm9ybAkkNywlZWF4CisJcHhvcgkleG1tNCwleG1tMAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWJwLCVlZGkKKwlhZGRsCTAoJXJzcCksJWVkeAorCXB1bnBja2xxZHEJJXhtbTcsJXhtbTkKKwl4b3JsCSVlYngsJWVheAorCXJvbGwJJDUsJWVicAorCXB4b3IJJXhtbTEsJXhtbTAKKwlhZGRsCSVlc2ksJWVkeAorCWFuZGwJJWVheCwlZWRpCisJbW92ZHFhCSV4bW0xMCwleG1tOAorCXhvcmwJJWVieCwlZWF4CisJcGFkZGQJJXhtbTcsJXhtbTEwCisJYWRkbAklZWJwLCVlZHgKKwlweG9yCSV4bW05LCV4bW0wCisJcm9ybAkkNywlZWJwCisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCWFkZGwJNCglcnNwKSwlZWN4CisJbW92ZHFhCSV4bW0wLCV4bW05CisJeG9ybAklZWF4LCVlYnAKKwlyb2xsCSQ1LCVlZHgKKwltb3ZkcWEJJXhtbTEwLDQ4KCVyc3ApCisJYWRkbAklZWRpLCVlY3gKKwlhbmRsCSVlYnAsJWVzaQorCXhvcmwJJWVheCwlZWJwCisJcHNsbGQJJDIsJXhtbTAKKwlhZGRsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVkeAorCXBzcmxkCSQzMCwleG1tOQorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlhZGRsCTgoJXJzcCksJWVieAorCXBvcgkleG1tOSwleG1tMAorCXhvcmwJJWVicCwlZWR4CisJcm9sbAkkNSwlZWN4CisJcHNodWZkCSQyMzgsJXhtbTcsJXhtbTEwCisJYWRkbAklZXNpLCVlYngKKwlhbmRsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTEyKCVyc3ApLCVlYXgKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCXJvcmwJJDcsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJcHhvcgkleG1tNSwleG1tMQorCWFkZGwJMTYoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJcHVucGNrbHFkcQkleG1tMCwleG1tMTAKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDUsJWVheAorCXB4b3IJJXhtbTIsJXhtbTEKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92ZHFhCSV4bW04LCV4bW05CisJcm9ybAkkNywlZWJ4CisJcGFkZGQJJXhtbTAsJXhtbTgKKwlhZGRsCSVlYXgsJWVicAorCXB4b3IJJXhtbTEwLCV4bW0xCisJYWRkbAkyMCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXJvbGwJJDUsJWVicAorCW1vdmRxYQkleG1tMSwleG1tMTAKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92ZHFhCSV4bW04LDAoJXJzcCkKKwlyb3JsCSQ3LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMjQoJXJzcCksJWVjeAorCXBzbGxkCSQyLCV4bW0xCisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXBzcmxkCSQzMCwleG1tMTAKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJcm9ybAkkNywlZWJwCisJcG9yCSV4bW0xMCwleG1tMQorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAkyOCglcnNwKSwlZWJ4CisJcHNodWZkCSQyMzgsJXhtbTAsJXhtbTgKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJcHhvcgkleG1tNiwleG1tMgorCWFkZGwJMzIoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJcHVucGNrbHFkcQkleG1tMSwleG1tOAorCW1vdmwJJWVieCwlZWRpCisJcm9sbAkkNSwlZWJ4CisJcHhvcgkleG1tMywleG1tMgorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZkcWEJMCglcjE0KSwleG1tMTAKKwlyb3JsCSQ3LCVlY3gKKwlwYWRkZAkleG1tMSwleG1tOQorCWFkZGwJJWVieCwlZWF4CisJcHhvcgkleG1tOCwleG1tMgorCWFkZGwJMzYoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwltb3ZkcWEJJXhtbTIsJXhtbTgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJbW92ZHFhCSV4bW05LDE2KCVyc3ApCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTQwKCVyc3ApLCVlZHgKKwlwc2xsZAkkMiwleG1tMgorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWJwLCVlZGkKKwlwc3JsZAkkMzAsJXhtbTgKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJcm9ybAkkNywlZWF4CisJcG9yCSV4bW04LCV4bW0yCisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTQ0KCVyc3ApLCVlY3gKKwlwc2h1ZmQJJDIzOCwleG1tMSwleG1tOQorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJcm9ybAkkNywlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlweG9yCSV4bW03LCV4bW0zCisJYWRkbAk0OCglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwlwdW5wY2tscWRxCSV4bW0yLCV4bW05CisJbW92bAklZWN4LCVlZGkKKwlyb2xsCSQ1LCVlY3gKKwlweG9yCSV4bW00LCV4bW0zCisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmRxYQkleG1tMTAsJXhtbTgKKwlyb3JsCSQ3LCVlZHgKKwlwYWRkZAkleG1tMiwleG1tMTAKKwlhZGRsCSVlY3gsJWVieAorCXB4b3IJJXhtbTksJXhtbTMKKwlhZGRsCTUyKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWJ4CisJbW92ZHFhCSV4bW0zLCV4bW05CisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmRxYQkleG1tMTAsMzIoJXJzcCkKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNTYoJXJzcCksJWVicAorCXBzbGxkCSQyLCV4bW0zCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXBzcmxkCSQzMCwleG1tOQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ3LCVlYngKKwlwb3IJJXhtbTksJXhtbTMKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJNjAoJXJzcCksJWVkeAorCXBzaHVmZAkkMjM4LCV4bW0yLCV4bW0xMAorCXhvcmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlweG9yCSV4bW0wLCV4bW00CisJYWRkbAkwKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXB1bnBja2xxZHEJJXhtbTMsJXhtbTEwCisJbW92bAklZWR4LCVlZGkKKwlyb2xsCSQ1LCVlZHgKKwlweG9yCSV4bW01LCV4bW00CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmRxYQkleG1tOCwleG1tOQorCXJvcmwJJDcsJWVicAorCXBhZGRkCSV4bW0zLCV4bW04CisJYWRkbAklZWR4LCVlY3gKKwlweG9yCSV4bW0xMCwleG1tNAorCWFkZGwJNCglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCXJvbGwJJDUsJWVjeAorCW1vdmRxYQkleG1tNCwleG1tMTAKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJbW92ZHFhCSV4bW04LDQ4KCVyc3ApCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTgoJXJzcCksJWVheAorCXBzbGxkCSQyLCV4bW00CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXBzcmxkCSQzMCwleG1tMTAKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJcm9ybAkkNywlZWN4CisJcG9yCSV4bW0xMCwleG1tNAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkxMiglcnNwKSwlZWJwCisJcHNodWZkCSQyMzgsJXhtbTMsJXhtbTgKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWJwCisJcHhvcgkleG1tMSwleG1tNQorCWFkZGwJMTYoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcHVucGNrbHFkcQkleG1tNCwleG1tOAorCW1vdmwJJWVicCwlZWRpCisJcm9sbAkkNSwlZWJwCisJcHhvcgkleG1tNiwleG1tNQorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZkcWEJJXhtbTksJXhtbTEwCisJcm9ybAkkNywlZWF4CisJcGFkZGQJJXhtbTQsJXhtbTkKKwlhZGRsCSVlYnAsJWVkeAorCXB4b3IJJXhtbTgsJXhtbTUKKwlhZGRsCTIwKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJcm9sbAkkNSwlZWR4CisJbW92ZHFhCSV4bW01LCV4bW04CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmRxYQkleG1tOSwwKCVyc3ApCisJcm9ybAkkNywlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTI0KCVyc3ApLCVlYngKKwlwc2xsZAkkMiwleG1tNQorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlwc3JsZAkkMzAsJXhtbTgKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJcm9ybAkkNywlZWR4CisJcG9yCSV4bW04LCV4bW01CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTI4KCVyc3ApLCVlYXgKKwlwc2h1ZmQJJDIzOCwleG1tNCwleG1tOQorCXJvcmwJJDcsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJeG9ybAklZWR4LCVlZGkKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXB4b3IJJXhtbTIsJXhtbTYKKwlhZGRsCTMyKCVyc3ApLCVlYnAKKwlhbmRsCSVlY3gsJWVzaQorCXhvcmwJJWVkeCwlZWN4CisJcm9ybAkkNywlZWJ4CisJcHVucGNrbHFkcQkleG1tNSwleG1tOQorCW1vdmwJJWVheCwlZWRpCisJeG9ybAklZWN4LCVlc2kKKwlweG9yCSV4bW03LCV4bW02CisJcm9sbAkkNSwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwltb3ZkcWEJJXhtbTEwLCV4bW04CisJeG9ybAklZWJ4LCVlZGkKKwlwYWRkZAkleG1tNSwleG1tMTAKKwl4b3JsCSVlY3gsJWVieAorCXB4b3IJJXhtbTksJXhtbTYKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJMzYoJXJzcCksJWVkeAorCWFuZGwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlYXgKKwltb3ZkcWEJJXhtbTYsJXhtbTkKKwltb3ZsCSVlYnAsJWVzaQorCXhvcmwJJWVieCwlZWRpCisJbW92ZHFhCSV4bW0xMCwxNiglcnNwKQorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwlwc2xsZAkkMiwleG1tNgorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlwc3JsZAkkMzAsJXhtbTkKKwlhZGRsCTQwKCVyc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJcG9yCSV4bW05LCV4bW02CisJcm9ybAkkNywlZWJwCisJbW92bAklZWR4LCVlZGkKKwl4b3JsCSVlYXgsJWVzaQorCXJvbGwJJDUsJWVkeAorCXBzaHVmZAkkMjM4LCV4bW01LCV4bW0xMAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWJwLCVlZGkKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk0NCglcnNwKSwlZWJ4CisJYW5kbAklZWJwLCVlZGkKKwl4b3JsCSVlYXgsJWVicAorCXJvcmwJJDcsJWVkeAorCW1vdmwJJWVjeCwlZXNpCisJeG9ybAklZWJwLCVlZGkKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVkeCwlZXNpCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXB4b3IJJXhtbTMsJXhtbTcKKwlhZGRsCTQ4KCVyc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVzaQorCXhvcmwJJWVicCwlZWR4CisJcm9ybAkkNywlZWN4CisJcHVucGNrbHFkcQkleG1tNiwleG1tMTAKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJWVkeCwlZXNpCisJcHhvcgkleG1tMCwleG1tNworCXJvbGwJJDUsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJbW92ZHFhCTMyKCVyMTQpLCV4bW05CisJeG9ybAklZWN4LCVlZGkKKwlwYWRkZAkleG1tNiwleG1tOAorCXhvcmwJJWVkeCwlZWN4CisJcHhvcgkleG1tMTAsJXhtbTcKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJNTIoJXJzcCksJWVicAorCWFuZGwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwlyb3JsCSQ3LCVlYngKKwltb3ZkcWEJJXhtbTcsJXhtbTEwCisJbW92bAklZWF4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmRxYQkleG1tOCwzMiglcnNwKQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWJ4LCVlc2kKKwlwc2xsZAkkMiwleG1tNworCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlwc3JsZAkkMzAsJXhtbTEwCisJYWRkbAk1NiglcnNwKSwlZWR4CisJYW5kbAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCXBvcgkleG1tMTAsJXhtbTcKKwlyb3JsCSQ3LCVlYXgKKwltb3ZsCSVlYnAsJWVkaQorCXhvcmwJJWVieCwlZXNpCisJcm9sbAkkNSwlZWJwCisJcHNodWZkCSQyMzgsJXhtbTYsJXhtbTgKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVheCwlZWRpCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJNjAoJXJzcCksJWVjeAorCWFuZGwJJWVheCwlZWRpCisJeG9ybAklZWJ4LCVlYXgKKwlyb3JsCSQ3LCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYnAsJWVzaQorCXhvcmwJJWVheCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlweG9yCSV4bW00LCV4bW0wCisJYWRkbAkwKCVyc3ApLCVlYngKKwlhbmRsCSVlYnAsJWVzaQorCXhvcmwJJWVheCwlZWJwCisJcm9ybAkkNywlZWR4CisJcHVucGNrbHFkcQkleG1tNywleG1tOAorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZWJwLCVlc2kKKwlweG9yCSV4bW0xLCV4bW0wCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwltb3ZkcWEJJXhtbTksJXhtbTEwCisJeG9ybAklZWR4LCVlZGkKKwlwYWRkZAkleG1tNywleG1tOQorCXhvcmwJJWVicCwlZWR4CisJcHhvcgkleG1tOCwleG1tMAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0KCVyc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJcm9ybAkkNywlZWN4CisJbW92ZHFhCSV4bW0wLCV4bW04CisJbW92bAklZWJ4LCVlc2kKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmRxYQkleG1tOSw0OCglcnNwKQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWN4LCVlc2kKKwlwc2xsZAkkMiwleG1tMAorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlwc3JsZAkkMzAsJXhtbTgKKwlhZGRsCTgoJXJzcCksJWVicAorCWFuZGwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlwb3IJJXhtbTgsJXhtbTAKKwlyb3JsCSQ3LCVlYngKKwltb3ZsCSVlYXgsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJcm9sbAkkNSwlZWF4CisJcHNodWZkCSQyMzgsJXhtbTcsJXhtbTkKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJMTIoJXJzcCksJWVkeAorCWFuZGwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlyb3JsCSQ3LCVlYXgKKwltb3ZsCSVlYnAsJWVzaQorCXhvcmwJJWVieCwlZWRpCisJcm9sbAkkNSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlweG9yCSV4bW01LCV4bW0xCisJYWRkbAkxNiglcnNwKSwlZWN4CisJYW5kbAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCXJvcmwJJDcsJWVicAorCXB1bnBja2xxZHEJJXhtbTAsJXhtbTkKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVheCwlZXNpCisJcHhvcgkleG1tMiwleG1tMQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJbW92ZHFhCSV4bW0xMCwleG1tOAorCXhvcmwJJWVicCwlZWRpCisJcGFkZGQJJXhtbTAsJXhtbTEwCisJeG9ybAklZWF4LCVlYnAKKwlweG9yCSV4bW05LCV4bW0xCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTIwKCVyc3ApLCVlYngKKwlhbmRsCSVlYnAsJWVkaQorCXhvcmwJJWVheCwlZWJwCisJcm9ybAkkNywlZWR4CisJbW92ZHFhCSV4bW0xLCV4bW05CisJbW92bAklZWN4LCVlc2kKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmRxYQkleG1tMTAsMCglcnNwKQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwlwc2xsZAkkMiwleG1tMQorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlwc3JsZAkkMzAsJXhtbTkKKwlhZGRsCTI0KCVyc3ApLCVlYXgKKwlhbmRsCSVlZHgsJWVzaQorCXhvcmwJJWVicCwlZWR4CisJcG9yCSV4bW05LCV4bW0xCisJcm9ybAkkNywlZWN4CisJbW92bAklZWJ4LCVlZGkKKwl4b3JsCSVlZHgsJWVzaQorCXJvbGwJJDUsJWVieAorCXBzaHVmZAkkMjM4LCV4bW0wLCV4bW0xMAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWN4LCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkyOCglcnNwKSwlZWJwCisJYW5kbAklZWN4LCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCXJvcmwJJDcsJWVieAorCW1vdmwJJWVheCwlZXNpCisJeG9ybAklZWN4LCVlZGkKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXB4b3IJJXhtbTYsJXhtbTIKKwlhZGRsCTMyKCVyc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJcm9ybAkkNywlZWF4CisJcHVucGNrbHFkcQkleG1tMSwleG1tMTAKKwltb3ZsCSVlYnAsJWVkaQorCXhvcmwJJWVieCwlZXNpCisJcHhvcgkleG1tMywleG1tMgorCXJvbGwJJDUsJWVicAorCWFkZGwJJWVzaSwlZWR4CisJbW92ZHFhCSV4bW04LCV4bW05CisJeG9ybAklZWF4LCVlZGkKKwlwYWRkZAkleG1tMSwleG1tOAorCXhvcmwJJWVieCwlZWF4CisJcHhvcgkleG1tMTAsJXhtbTIKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMzYoJXJzcCksJWVjeAorCWFuZGwJJWVheCwlZWRpCisJeG9ybAklZWJ4LCVlYXgKKwlyb3JsCSQ3LCVlYnAKKwltb3ZkcWEJJXhtbTIsJXhtbTEwCisJbW92bAklZWR4LCVlc2kKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmRxYQkleG1tOCwxNiglcnNwKQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVkaSwlZWN4CisJeG9ybAklZWJwLCVlc2kKKwlwc2xsZAkkMiwleG1tMgorCXhvcmwJJWVheCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwlwc3JsZAkkMzAsJXhtbTEwCisJYWRkbAk0MCglcnNwKSwlZWJ4CisJYW5kbAklZWJwLCVlc2kKKwl4b3JsCSVlYXgsJWVicAorCXBvcgkleG1tMTAsJXhtbTIKKwlyb3JsCSQ3LCVlZHgKKwltb3ZsCSVlY3gsJWVkaQorCXhvcmwJJWVicCwlZXNpCisJcm9sbAkkNSwlZWN4CisJcHNodWZkCSQyMzgsJXhtbTEsJXhtbTgKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVkeCwlZWRpCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDQoJXJzcCksJWVheAorCWFuZGwJJWVkeCwlZWRpCisJeG9ybAklZWJwLCVlZHgKKwlyb3JsCSQ3LCVlY3gKKwltb3ZsCSVlYngsJWVzaQorCXhvcmwJJWVkeCwlZWRpCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZWRpLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCWFkZGwJJWVieCwlZWF4CisJcHhvcgkleG1tNywleG1tMworCWFkZGwJNDgoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJcHVucGNrbHFkcQkleG1tMiwleG1tOAorCW1vdmwJJWVheCwlZWRpCisJcm9sbAkkNSwlZWF4CisJcHhvcgkleG1tNCwleG1tMworCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZkcWEJJXhtbTksJXhtbTEwCisJcm9ybAkkNywlZWJ4CisJcGFkZGQJJXhtbTIsJXhtbTkKKwlhZGRsCSVlYXgsJWVicAorCXB4b3IJJXhtbTgsJXhtbTMKKwlhZGRsCTUyKCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJcm9sbAkkNSwlZWJwCisJbW92ZHFhCSV4bW0zLCV4bW04CisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCW1vdmRxYQkleG1tOSwzMiglcnNwKQorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAk1NiglcnNwKSwlZWN4CisJcHNsbGQJJDIsJXhtbTMKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWRpCisJcHNybGQJJDMwLCV4bW04CisJcm9sbAkkNSwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXJvcmwJJDcsJWVicAorCXBvcgkleG1tOCwleG1tMworCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk2MCglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXJvbGwJJDUsJWVieAorCXBhZGRkCSV4bW0zLCV4bW0xMAorCWFkZGwJJWVzaSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZkcWEJJXhtbTEwLDQ4KCVyc3ApCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTgoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWJwLCVlZGkKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTEyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJY21wcQklcjEwLCVyOQorCWplCUwkZG9uZV9zc3NlMworCW1vdmRxYQk2NCglcjE0KSwleG1tNgorCW1vdmRxYQktNjQoJXIxNCksJXhtbTkKKwltb3ZkcXUJMCglcjkpLCV4bW0wCisJbW92ZHF1CTE2KCVyOSksJXhtbTEKKwltb3ZkcXUJMzIoJXI5KSwleG1tMgorCW1vdmRxdQk0OCglcjkpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTgKKwlhZGRxCSQ2NCwlcjkKKwlhZGRsCTE2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDYKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlc2ksJWVieAorCXhvcmwJJWVicCwlZWRpCisJcm9ybAkkNywlZWR4CisJcGFkZGQJJXhtbTksJXhtbTAKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJMjAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwltb3ZkcWEJJXhtbTAsMCglcnNwKQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlyb3JsCSQ3LCVlY3gKKwlwc3ViZAkleG1tOSwleG1tMAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkyNCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJMjgoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlZGksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTMyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCW1vdmwJJWVkeCwlZWRpCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTQKKwlyb2xsCSQ1LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJcm9ybAkkNywlZWJwCisJcGFkZGQJJXhtbTksJXhtbTEKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJMzYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwltb3ZkcWEJJXhtbTEsMTYoJXJzcCkKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJcm9ybAkkNywlZWR4CisJcHN1YmQJJXhtbTksJXhtbTEKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNDAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJbW92bAklZWJ4LCVlZGkKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQ0KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCW1vdmwJJWVheCwlZXNpCisJcm9sbAkkNSwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCXJvcmwJJDcsJWVieAorCWFkZGwJJWVheCwlZWJwCisJYWRkbAk0OCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorLmJ5dGUJMTAyLDE1LDU2LDAsMjIyCisJcm9sbAkkNSwlZWJwCisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCXJvcmwJJDcsJWVheAorCXBhZGRkCSV4bW05LCV4bW0yCisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJbW92ZHFhCSV4bW0yLDMyKCVyc3ApCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVicAorCXBzdWJkCSV4bW05LCV4bW0yCisJYWRkbAklZWR4LCVlY3gKKwlhZGRsCTU2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk2MCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJcm9ybAkkNywlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTAoJXI4KSwlZWF4CisJYWRkbAk0KCVyOCksJWVzaQorCWFkZGwJOCglcjgpLCVlY3gKKwlhZGRsCTEyKCVyOCksJWVkeAorCW1vdmwJJWVheCwwKCVyOCkKKwlhZGRsCTE2KCVyOCksJWVicAorCW1vdmwJJWVzaSw0KCVyOCkKKwltb3ZsCSVlc2ksJWVieAorCW1vdmwJJWVjeCw4KCVyOCkKKwltb3ZsCSVlY3gsJWVkaQorCW1vdmwJJWVkeCwxMiglcjgpCisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYnAsMTYoJXI4KQorCWFuZGwJJWVkaSwlZXNpCisJam1wCUwkb29wX3Nzc2UzCisKKy5wMmFsaWduCTQKK0wkZG9uZV9zc3NlMzoKKwlhZGRsCTE2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJcm9sbAkkNSwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCXJvcmwJJDcsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyMCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXJvbGwJJDUsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlyb3JsCSQ3LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMjQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlyb2xsCSQ1LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNywlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTI4KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJcm9sbAkkNSwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXJvcmwJJDcsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAkzMiglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXJvbGwJJDUsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ3LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJMzYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlyb2xsCSQ1LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJcm9ybAkkNywlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJcm9sbAkkNSwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCXJvcmwJJDcsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk0NCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXJvbGwJJDUsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlyb3JsCSQ3LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJNDgoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWJwLCVlZGkKKwlyb2xsCSQ1LCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJcm9ybAkkNywlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJcm9sbAkkNSwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXJvcmwJJDcsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk1NiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXJvbGwJJDUsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwlyb3JsCSQ3LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNjAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlyb2xsCSQ1LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXJvcmwJJDcsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkwKCVyOCksJWVheAorCWFkZGwJNCglcjgpLCVlc2kKKwlhZGRsCTgoJXI4KSwlZWN4CisJbW92bAklZWF4LDAoJXI4KQorCWFkZGwJMTIoJXI4KSwlZWR4CisJbW92bAklZXNpLDQoJXI4KQorCWFkZGwJMTYoJXI4KSwlZWJwCisJbW92bAklZWN4LDgoJXI4KQorCW1vdmwJJWVkeCwxMiglcjgpCisJbW92bAklZWJwLDE2KCVyOCkKKwltb3ZxCS00MCglcjExKSwlcjE0CisKKwltb3ZxCS0zMiglcjExKSwlcjEzCisKKwltb3ZxCS0yNCglcjExKSwlcjEyCisKKwltb3ZxCS0xNiglcjExKSwlcmJwCisKKwltb3ZxCS04KCVyMTEpLCVyYngKKworCWxlYXEJKCVyMTEpLCVyc3AKKworTCRlcGlsb2d1ZV9zc3NlMzoKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTQKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdng6CitfYXZ4X3Nob3J0Y3V0OgorCisJbW92cQklcnNwLCVyMTEKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCWxlYXEJLTY0KCVyc3ApLCVyc3AKKwl2emVyb3VwcGVyCisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZGksJXI4CisJbW92cQklcnNpLCVyOQorCW1vdnEJJXJkeCwlcjEwCisKKwlzaGxxCSQ2LCVyMTAKKwlhZGRxCSVyOSwlcjEwCisJbGVhcQlLX1hYX1hYKzY0KCVyaXApLCVyMTQKKworCW1vdmwJMCglcjgpLCVlYXgKKwltb3ZsCTQoJXI4KSwlZWJ4CisJbW92bAk4KCVyOCksJWVjeAorCW1vdmwJMTIoJXI4KSwlZWR4CisJbW92bAklZWJ4LCVlc2kKKwltb3ZsCTE2KCVyOCksJWVicAorCW1vdmwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlZGkKKwlhbmRsCSVlZGksJWVzaQorCisJdm1vdmRxYQk2NCglcjE0KSwleG1tNgorCXZtb3ZkcWEJLTY0KCVyMTQpLCV4bW0xMQorCXZtb3ZkcXUJMCglcjkpLCV4bW0wCisJdm1vdmRxdQkxNiglcjkpLCV4bW0xCisJdm1vdmRxdQkzMiglcjkpLCV4bW0yCisJdm1vdmRxdQk0OCglcjkpLCV4bW0zCisJdnBzaHVmYgkleG1tNiwleG1tMCwleG1tMAorCWFkZHEJJDY0LCVyOQorCXZwc2h1ZmIJJXhtbTYsJXhtbTEsJXhtbTEKKwl2cHNodWZiCSV4bW02LCV4bW0yLCV4bW0yCisJdnBzaHVmYgkleG1tNiwleG1tMywleG1tMworCXZwYWRkZAkleG1tMTEsJXhtbTAsJXhtbTQKKwl2cGFkZGQJJXhtbTExLCV4bW0xLCV4bW01CisJdnBhZGRkCSV4bW0xMSwleG1tMiwleG1tNgorCXZtb3ZkcWEJJXhtbTQsMCglcnNwKQorCXZtb3ZkcWEJJXhtbTUsMTYoJXJzcCkKKwl2bW92ZHFhCSV4bW02LDMyKCVyc3ApCisJam1wCUwkb29wX2F2eAorLnAyYWxpZ24JNAorTCRvb3BfYXZ4OgorCXNocmRsCSQyLCVlYngsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTEsJXhtbTQKKwltb3ZsCSVlYXgsJWVkaQorCWFkZGwJMCglcnNwKSwlZWJwCisJdnBhZGRkCSV4bW0zLCV4bW0xMSwleG1tOQorCXhvcmwJJWVjeCwlZWJ4CisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnBzcmxkcQkkNCwleG1tMywleG1tOAorCWFkZGwJJWVzaSwlZWJwCisJYW5kbAklZWJ4LCVlZGkKKwl2cHhvcgkleG1tMCwleG1tNCwleG1tNAorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cHhvcgkleG1tMiwleG1tOCwleG1tOAorCXNocmRsCSQ3LCVlYXgsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlhZGRsCTQoJXJzcCksJWVkeAorCXZweG9yCSV4bW04LCV4bW00LCV4bW00CisJeG9ybAklZWJ4LCVlYXgKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwl2bW92ZHFhCSV4bW05LDQ4KCVyc3ApCisJYWRkbAklZWRpLCVlZHgKKwlhbmRsCSVlYXgsJWVzaQorCXZwc3JsZAkkMzEsJXhtbTQsJXhtbTgKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJc2hyZGwJJDcsJWVicCwlZWJwCisJeG9ybAklZWJ4LCVlc2kKKwl2cHNsbGRxCSQxMiwleG1tNCwleG1tMTAKKwl2cGFkZGQJJXhtbTQsJXhtbTQsJXhtbTQKKwltb3ZsCSVlZHgsJWVkaQorCWFkZGwJOCglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cHNybGQJJDMwLCV4bW0xMCwleG1tOQorCXZwb3IJJXhtbTgsJXhtbTQsJXhtbTQKKwlhZGRsCSVlc2ksJWVjeAorCWFuZGwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXZwc2xsZAkkMiwleG1tMTAsJXhtbTEwCisJdnB4b3IJJXhtbTksJXhtbTQsJXhtbTQKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJYWRkbAkxMiglcnNwKSwlZWJ4CisJdnB4b3IJJXhtbTEwLCV4bW00LCV4bW00CisJeG9ybAklZWJwLCVlZHgKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCWFuZGwJJWVkeCwlZXNpCisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCXhvcmwJJWVicCwlZXNpCisJdnBhbGlnbnIJJDgsJXhtbTEsJXhtbTIsJXhtbTUKKwltb3ZsCSVlYngsJWVkaQorCWFkZGwJMTYoJXJzcCksJWVheAorCXZwYWRkZAkleG1tNCwleG1tMTEsJXhtbTkKKwl4b3JsCSVlZHgsJWVjeAorCXNobGRsCSQ1LCVlYngsJWVieAorCXZwc3JsZHEJJDQsJXhtbTQsJXhtbTgKKwlhZGRsCSVlc2ksJWVheAorCWFuZGwJJWVjeCwlZWRpCisJdnB4b3IJJXhtbTEsJXhtbTUsJXhtbTUKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnB4b3IJJXhtbTMsJXhtbTgsJXhtbTgKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwl4b3JsCSVlZHgsJWVkaQorCW1vdmwJJWVheCwlZXNpCisJYWRkbAkyMCglcnNwKSwlZWJwCisJdnB4b3IJJXhtbTgsJXhtbTUsJXhtbTUKKwl4b3JsCSVlY3gsJWVieAorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZtb3ZkcWEJJXhtbTksMCglcnNwKQorCWFkZGwJJWVkaSwlZWJwCisJYW5kbAklZWJ4LCVlc2kKKwl2cHNybGQJJDMxLCV4bW01LCV4bW04CisJeG9ybAklZWN4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXNocmRsCSQ3LCVlYXgsJWVheAorCXhvcmwJJWVjeCwlZXNpCisJdnBzbGxkcQkkMTIsJXhtbTUsJXhtbTEwCisJdnBhZGRkCSV4bW01LCV4bW01LCV4bW01CisJbW92bAklZWJwLCVlZGkKKwlhZGRsCTI0KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVheAorCXNobGRsCSQ1LCVlYnAsJWVicAorCXZwc3JsZAkkMzAsJXhtbTEwLCV4bW05CisJdnBvcgkleG1tOCwleG1tNSwleG1tNQorCWFkZGwJJWVzaSwlZWR4CisJYW5kbAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdnBzbGxkCSQyLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tOSwleG1tNSwleG1tNQorCXNocmRsCSQ3LCVlYnAsJWVicAorCXhvcmwJJWVieCwlZWRpCisJbW92bAklZWR4LCVlc2kKKwlhZGRsCTI4KCVyc3ApLCVlY3gKKwl2cHhvcgkleG1tMTAsJXhtbTUsJXhtbTUKKwl4b3JsCSVlYXgsJWVicAorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZtb3ZkcWEJLTMyKCVyMTQpLCV4bW0xMQorCWFkZGwJJWVkaSwlZWN4CisJYW5kbAklZWJwLCVlc2kKKwl4b3JsCSVlYXgsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVkeCwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwl2cGFsaWducgkkOCwleG1tMiwleG1tMywleG1tNgorCW1vdmwJJWVjeCwlZWRpCisJYWRkbAkzMiglcnNwKSwlZWJ4CisJdnBhZGRkCSV4bW01LCV4bW0xMSwleG1tOQorCXhvcmwJJWVicCwlZWR4CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdnBzcmxkcQkkNCwleG1tNSwleG1tOAorCWFkZGwJJWVzaSwlZWJ4CisJYW5kbAklZWR4LCVlZGkKKwl2cHhvcgkleG1tMiwleG1tNiwleG1tNgorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHhvcgkleG1tNCwleG1tOCwleG1tOAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlhZGRsCTM2KCVyc3ApLCVlYXgKKwl2cHhvcgkleG1tOCwleG1tNiwleG1tNgorCXhvcmwJJWVkeCwlZWN4CisJc2hsZGwJJDUsJWVieCwlZWJ4CisJdm1vdmRxYQkleG1tOSwxNiglcnNwKQorCWFkZGwJJWVkaSwlZWF4CisJYW5kbAklZWN4LCVlc2kKKwl2cHNybGQJJDMxLCV4bW02LCV4bW04CisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlYngsJWVieAorCXhvcmwJJWVkeCwlZXNpCisJdnBzbGxkcQkkMTIsJXhtbTYsJXhtbTEwCisJdnBhZGRkCSV4bW02LCV4bW02LCV4bW02CisJbW92bAklZWF4LCVlZGkKKwlhZGRsCTQwKCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVieAorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZwc3JsZAkkMzAsJXhtbTEwLCV4bW05CisJdnBvcgkleG1tOCwleG1tNiwleG1tNgorCWFkZGwJJWVzaSwlZWJwCisJYW5kbAklZWJ4LCVlZGkKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJdnBzbGxkCSQyLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tOSwleG1tNiwleG1tNgorCXNocmRsCSQ3LCVlYXgsJWVheAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWJwLCVlc2kKKwlhZGRsCTQ0KCVyc3ApLCVlZHgKKwl2cHhvcgkleG1tMTAsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYngsJWVheAorCXNobGRsCSQ1LCVlYnAsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJYW5kbAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJc2hyZGwJJDcsJWVicCwlZWJwCisJeG9ybAklZWJ4LCVlc2kKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tNworCW1vdmwJJWVkeCwlZWRpCisJYWRkbAk0OCglcnNwKSwlZWN4CisJdnBhZGRkCSV4bW02LCV4bW0xMSwleG1tOQorCXhvcmwJJWVheCwlZWJwCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJdnBzcmxkcQkkNCwleG1tNiwleG1tOAorCWFkZGwJJWVzaSwlZWN4CisJYW5kbAklZWJwLCVlZGkKKwl2cHhvcgkleG1tMywleG1tNywleG1tNworCXhvcmwJJWVheCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwl2cHhvcgkleG1tNSwleG1tOCwleG1tOAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXhvcmwJJWVheCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlhZGRsCTUyKCVyc3ApLCVlYngKKwl2cHhvcgkleG1tOCwleG1tNywleG1tNworCXhvcmwJJWVicCwlZWR4CisJc2hsZGwJJDUsJWVjeCwlZWN4CisJdm1vdmRxYQkleG1tOSwzMiglcnNwKQorCWFkZGwJJWVkaSwlZWJ4CisJYW5kbAklZWR4LCVlc2kKKwl2cHNybGQJJDMxLCV4bW03LCV4bW04CisJeG9ybAklZWJwLCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCXhvcmwJJWVicCwlZXNpCisJdnBzbGxkcQkkMTIsJXhtbTcsJXhtbTEwCisJdnBhZGRkCSV4bW03LCV4bW03LCV4bW03CisJbW92bAklZWJ4LCVlZGkKKwlhZGRsCTU2KCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVjeAorCXNobGRsCSQ1LCVlYngsJWVieAorCXZwc3JsZAkkMzAsJXhtbTEwLCV4bW05CisJdnBvcgkleG1tOCwleG1tNywleG1tNworCWFkZGwJJWVzaSwlZWF4CisJYW5kbAklZWN4LCVlZGkKKwl4b3JsCSVlZHgsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBzbGxkCSQyLCV4bW0xMCwleG1tMTAKKwl2cHhvcgkleG1tOSwleG1tNywleG1tNworCXNocmRsCSQ3LCVlYngsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlhZGRsCTYwKCVyc3ApLCVlYnAKKwl2cHhvcgkleG1tMTAsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJWVieAorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJYW5kbAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJdnBhbGlnbnIJJDgsJXhtbTYsJXhtbTcsJXhtbTgKKwl2cHhvcgkleG1tNCwleG1tMCwleG1tMAorCXNocmRsCSQ3LCVlYXgsJWVheAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWJwLCVlZGkKKwlhZGRsCTAoJXJzcCksJWVkeAorCXZweG9yCSV4bW0xLCV4bW0wLCV4bW0wCisJeG9ybAklZWJ4LCVlYXgKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwl2cGFkZGQJJXhtbTcsJXhtbTExLCV4bW05CisJYWRkbAklZXNpLCVlZHgKKwlhbmRsCSVlYXgsJWVkaQorCXZweG9yCSV4bW04LCV4bW0wLCV4bW0wCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXNocmRsCSQ3LCVlYnAsJWVicAorCXhvcmwJJWVieCwlZWRpCisJdnBzcmxkCSQzMCwleG1tMCwleG1tOAorCXZtb3ZkcWEJJXhtbTksNDgoJXJzcCkKKwltb3ZsCSVlZHgsJWVzaQorCWFkZGwJNCglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlYnAKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cHNsbGQJJDIsJXhtbTAsJXhtbTAKKwlhZGRsCSVlZGksJWVjeAorCWFuZGwJJWVicCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXNocmRsCSQ3LCVlZHgsJWVkeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlhZGRsCTgoJXJzcCksJWVieAorCXZwb3IJJXhtbTgsJXhtbTAsJXhtbTAKKwl4b3JsCSVlYnAsJWVkeAorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJYW5kbAklZWR4LCVlZGkKKwl4b3JsCSVlYnAsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkxMiglcnNwKSwlZWF4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZwYWxpZ25yCSQ4LCV4bW03LCV4bW0wLCV4bW04CisJdnB4b3IJJXhtbTUsJXhtbTEsJXhtbTEKKwlhZGRsCTE2KCVyc3ApLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCW1vdmwJJWVheCwlZWRpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJdnB4b3IJJXhtbTIsJXhtbTEsJXhtbTEKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJdnBhZGRkCSV4bW0wLCV4bW0xMSwleG1tOQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWJwCisJdnB4b3IJJXhtbTgsJXhtbTEsJXhtbTEKKwlhZGRsCTIwKCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJdnBzcmxkCSQzMCwleG1tMSwleG1tOAorCXZtb3ZkcWEJJXhtbTksMCglcnNwKQorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXZwc2xsZAkkMiwleG1tMSwleG1tMQorCWFkZGwJMjQoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVheCwlZWRpCisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwl2cG9yCSV4bW04LCV4bW0xLCV4bW0xCisJYWRkbAkyOCglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW04CisJdnB4b3IJJXhtbTYsJXhtbTIsJXhtbTIKKwlhZGRsCTMyKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJdnB4b3IJJXhtbTMsJXhtbTIsJXhtbTIKKwlhZGRsCSVlc2ksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJdnBhZGRkCSV4bW0xLCV4bW0xMSwleG1tOQorCXZtb3ZkcWEJMCglcjE0KSwleG1tMTEKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZweG9yCSV4bW04LCV4bW0yLCV4bW0yCisJYWRkbAkzNiglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZwc3JsZAkkMzAsJXhtbTIsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDE2KCVyc3ApCisJYWRkbAklZWRpLCVlYnAKKwl4b3JsCSVlY3gsJWVzaQorCXNocmRsCSQ3LCVlYngsJWVieAorCWFkZGwJJWVheCwlZWJwCisJdnBzbGxkCSQyLCV4bW0yLCV4bW0yCisJYWRkbAk0MCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXZwb3IJJXhtbTgsJXhtbTIsJXhtbTIKKwlhZGRsCTQ0KCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXNocmRsCSQ3LCVlYnAsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJdnBhbGlnbnIJJDgsJXhtbTEsJXhtbTIsJXhtbTgKKwl2cHhvcgkleG1tNywleG1tMywleG1tMworCWFkZGwJNDgoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZXNpCisJbW92bAklZWN4LCVlZGkKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwl2cHhvcgkleG1tNCwleG1tMywleG1tMworCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwl2cGFkZGQJJXhtbTIsJXhtbTExLCV4bW05CisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cHhvcgkleG1tOCwleG1tMywleG1tMworCWFkZGwJNTIoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwl2cHNybGQJJDMwLCV4bW0zLCV4bW04CisJdm1vdmRxYQkleG1tOSwzMiglcnNwKQorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZwc2xsZAkkMiwleG1tMywleG1tMworCWFkZGwJNTYoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cG9yCSV4bW04LCV4bW0zLCV4bW0zCisJYWRkbAk2MCglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXZwYWxpZ25yCSQ4LCV4bW0yLCV4bW0zLCV4bW04CisJdnB4b3IJJXhtbTAsJXhtbTQsJXhtbTQKKwlhZGRsCTAoJXJzcCksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJbW92bAklZWR4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cHhvcgkleG1tNSwleG1tNCwleG1tNAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwl2cGFkZGQJJXhtbTMsJXhtbTExLCV4bW05CisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwl2cHhvcgkleG1tOCwleG1tNCwleG1tNAorCWFkZGwJNCglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwltb3ZsCSVlY3gsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCXZwc3JsZAkkMzAsJXhtbTQsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDQ4KCVyc3ApCisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBzbGxkCSQyLCV4bW00LCV4bW00CisJYWRkbAk4KCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnBvcgkleG1tOCwleG1tNCwleG1tNAorCWFkZGwJMTIoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tOAorCXZweG9yCSV4bW0xLCV4bW01LCV4bW01CisJYWRkbAkxNiglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlc2kKKwltb3ZsCSVlYnAsJWVkaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCXZweG9yCSV4bW02LCV4bW01LCV4bW01CisJYWRkbAklZXNpLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCXZwYWRkZAkleG1tNCwleG1tMTEsJXhtbTkKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXZweG9yCSV4bW04LCV4bW01LCV4bW01CisJYWRkbAkyMCglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCXZwc3JsZAkkMzAsJXhtbTUsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDAoJXJzcCkKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVheCwlZXNpCisJc2hyZGwJJDcsJWVicCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwl2cHNsbGQJJDIsJXhtbTUsJXhtbTUKKwlhZGRsCTI0KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdnBvcgkleG1tOCwleG1tNSwleG1tNQorCWFkZGwJMjgoJXJzcCksJWVheAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJeG9ybAklZWR4LCVlZGkKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCXZwYWxpZ25yCSQ4LCV4bW00LCV4bW01LCV4bW04CisJdnB4b3IJJXhtbTIsJXhtbTYsJXhtbTYKKwlhZGRsCTMyKCVyc3ApLCVlYnAKKwlhbmRsCSVlY3gsJWVzaQorCXhvcmwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwltb3ZsCSVlYXgsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJdnBhZGRkCSV4bW01LCV4bW0xMSwleG1tOQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVzaSwlZWJwCisJdnB4b3IJJXhtbTgsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYngsJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTM2KCVyc3ApLCVlZHgKKwl2cHNybGQJJDMwLCV4bW02LCV4bW04CisJdm1vdmRxYQkleG1tOSwxNiglcnNwKQorCWFuZGwJJWVieCwlZWRpCisJeG9ybAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwltb3ZsCSVlYnAsJWVzaQorCXZwc2xsZAkkMiwleG1tNiwleG1tNgorCXhvcmwJJWVieCwlZWRpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYXgsJWVzaQorCXhvcmwJJWVieCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTQwKCVyc3ApLCVlY3gKKwlhbmRsCSVlYXgsJWVzaQorCXZwb3IJJXhtbTgsJXhtbTYsJXhtbTYKKwl4b3JsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlYnAsJWVicAorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZWF4LCVlc2kKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlc2ksJWVjeAorCXhvcmwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNDQoJXJzcCksJWVieAorCWFuZGwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwltb3ZsCSVlY3gsJWVzaQorCXhvcmwJJWVicCwlZWRpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlZHgsJWVzaQorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwl2cGFsaWducgkkOCwleG1tNSwleG1tNiwleG1tOAorCXZweG9yCSV4bW0zLCV4bW03LCV4bW03CisJYWRkbAk0OCglcnNwKSwlZWF4CisJYW5kbAklZWR4LCVlc2kKKwl4b3JsCSVlYnAsJWVkeAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCXZweG9yCSV4bW0wLCV4bW03LCV4bW03CisJbW92bAklZWJ4LCVlZGkKKwl4b3JsCSVlZHgsJWVzaQorCXZwYWRkZAkleG1tNiwleG1tMTEsJXhtbTkKKwl2bW92ZHFhCTMyKCVyMTQpLCV4bW0xMQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJdnB4b3IJJXhtbTgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJWVkaQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTUyKCVyc3ApLCVlYnAKKwl2cHNybGQJJDMwLCV4bW03LCV4bW04CisJdm1vdmRxYQkleG1tOSwzMiglcnNwKQorCWFuZGwJJWVjeCwlZWRpCisJeG9ybAklZWR4LCVlY3gKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwltb3ZsCSVlYXgsJWVzaQorCXZwc2xsZAkkMiwleG1tNywleG1tNworCXhvcmwJJWVjeCwlZWRpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZWRpLCVlYnAKKwl4b3JsCSVlYngsJWVzaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTU2KCVyc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVzaQorCXZwb3IJJXhtbTgsJXhtbTcsJXhtbTcKKwl4b3JsCSVlY3gsJWVieAorCXNocmRsCSQ3LCVlYXgsJWVheAorCW1vdmwJJWVicCwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVheCwlZWRpCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJNjAoJXJzcCksJWVjeAorCWFuZGwJJWVheCwlZWRpCisJeG9ybAklZWJ4LCVlYXgKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwltb3ZsCSVlZHgsJWVzaQorCXhvcmwJJWVheCwlZWRpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYnAsJWVzaQorCXhvcmwJJWVheCwlZWJwCisJYWRkbAklZWR4LCVlY3gKKwl2cGFsaWducgkkOCwleG1tNiwleG1tNywleG1tOAorCXZweG9yCSV4bW00LCV4bW0wLCV4bW0wCisJYWRkbAkwKCVyc3ApLCVlYngKKwlhbmRsCSVlYnAsJWVzaQorCXhvcmwJJWVheCwlZWJwCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJdnB4b3IJJXhtbTEsJXhtbTAsJXhtbTAKKwltb3ZsCSVlY3gsJWVkaQorCXhvcmwJJWVicCwlZXNpCisJdnBhZGRkCSV4bW03LCV4bW0xMSwleG1tOQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJdnB4b3IJJXhtbTgsJXhtbTAsJXhtbTAKKwl4b3JsCSVlZHgsJWVkaQorCXhvcmwJJWVicCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQoJXJzcCksJWVheAorCXZwc3JsZAkkMzAsJXhtbTAsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDQ4KCVyc3ApCisJYW5kbAklZWR4LCVlZGkKKwl4b3JsCSVlYnAsJWVkeAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJdnBzbGxkCSQyLCV4bW0wLCV4bW0wCisJeG9ybAklZWR4LCVlZGkKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVjeCwlZXNpCisJeG9ybAklZWR4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJOCglcnNwKSwlZWJwCisJYW5kbAklZWN4LCVlc2kKKwl2cG9yCSV4bW04LCV4bW0wLCV4bW0wCisJeG9ybAklZWR4LCVlY3gKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwltb3ZsCSVlYXgsJWVkaQorCXhvcmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVheCwlZWF4CisJYWRkbAklZXNpLCVlYnAKKwl4b3JsCSVlYngsJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTEyKCVyc3ApLCVlZHgKKwlhbmRsCSVlYngsJWVkaQorCXhvcmwJJWVjeCwlZWJ4CisJc2hyZGwJJDcsJWVheCwlZWF4CisJbW92bAklZWJwLCVlc2kKKwl4b3JsCSVlYngsJWVkaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCWFkZGwJJWVkaSwlZWR4CisJeG9ybAklZWF4LCVlc2kKKwl4b3JsCSVlYngsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdnBhbGlnbnIJJDgsJXhtbTcsJXhtbTAsJXhtbTgKKwl2cHhvcgkleG1tNSwleG1tMSwleG1tMQorCWFkZGwJMTYoJXJzcCksJWVjeAorCWFuZGwJJWVheCwlZXNpCisJeG9ybAklZWJ4LCVlYXgKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwl2cHhvcgkleG1tMiwleG1tMSwleG1tMQorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZWF4LCVlc2kKKwl2cGFkZGQJJXhtbTAsJXhtbTExLCV4bW05CisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZXNpLCVlY3gKKwl2cHhvcgkleG1tOCwleG1tMSwleG1tMQorCXhvcmwJJWVicCwlZWRpCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJMjAoJXJzcCksJWVieAorCXZwc3JsZAkkMzAsJXhtbTEsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDAoJXJzcCkKKwlhbmRsCSVlYnAsJWVkaQorCXhvcmwJJWVheCwlZWJwCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJbW92bAklZWN4LCVlc2kKKwl2cHNsbGQJJDIsJXhtbTEsJXhtbTEKKwl4b3JsCSVlYnAsJWVkaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVkaSwlZWJ4CisJeG9ybAklZWR4LCVlc2kKKwl4b3JsCSVlYnAsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyNCglcnNwKSwlZWF4CisJYW5kbAklZWR4LCVlc2kKKwl2cG9yCSV4bW04LCV4bW0xLCV4bW0xCisJeG9ybAklZWJwLCVlZHgKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlY3gsJWVkaQorCXhvcmwJJWVkeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTI4KCVyc3ApLCVlYnAKKwlhbmRsCSVlY3gsJWVkaQorCXhvcmwJJWVkeCwlZWN4CisJc2hyZGwJJDcsJWVieCwlZWJ4CisJbW92bAklZWF4LCVlc2kKKwl4b3JsCSVlY3gsJWVkaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWJ4LCVlc2kKKwl4b3JsCSVlY3gsJWVieAorCWFkZGwJJWVheCwlZWJwCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTEsJXhtbTgKKwl2cHhvcgkleG1tNiwleG1tMiwleG1tMgorCWFkZGwJMzIoJXJzcCksJWVkeAorCWFuZGwJJWVieCwlZXNpCisJeG9ybAklZWN4LCVlYngKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwl2cHhvcgkleG1tMywleG1tMiwleG1tMgorCW1vdmwJJWVicCwlZWRpCisJeG9ybAklZWJ4LCVlc2kKKwl2cGFkZGQJJXhtbTEsJXhtbTExLCV4bW05CisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZXNpLCVlZHgKKwl2cHhvcgkleG1tOCwleG1tMiwleG1tMgorCXhvcmwJJWVheCwlZWRpCisJeG9ybAklZWJ4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCWFkZGwJMzYoJXJzcCksJWVjeAorCXZwc3JsZAkkMzAsJXhtbTIsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDE2KCVyc3ApCisJYW5kbAklZWF4LCVlZGkKKwl4b3JsCSVlYngsJWVheAorCXNocmRsCSQ3LCVlYnAsJWVicAorCW1vdmwJJWVkeCwlZXNpCisJdnBzbGxkCSQyLCV4bW0yLCV4bW0yCisJeG9ybAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwlhZGRsCSVlZGksJWVjeAorCXhvcmwJJWVicCwlZXNpCisJeG9ybAklZWF4LCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJNDAoJXJzcCksJWVieAorCWFuZGwJJWVicCwlZXNpCisJdnBvcgkleG1tOCwleG1tMiwleG1tMgorCXhvcmwJJWVheCwlZWJwCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJbW92bAklZWN4LCVlZGkKKwl4b3JsCSVlYnAsJWVzaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwl4b3JsCSVlYnAsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAk0NCglcnNwKSwlZWF4CisJYW5kbAklZWR4LCVlZGkKKwl4b3JsCSVlYnAsJWVkeAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCW1vdmwJJWVieCwlZXNpCisJeG9ybAklZWR4LCVlZGkKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXhvcmwJJWVkeCwlZXNpCisJYWRkbAklZWJ4LCVlYXgKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tOAorCXZweG9yCSV4bW03LCV4bW0zLCV4bW0zCisJYWRkbAk0OCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwltb3ZsCSVlYXgsJWVkaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCXZweG9yCSV4bW00LCV4bW0zLCV4bW0zCisJYWRkbAklZXNpLCVlYnAKKwl4b3JsCSVlY3gsJWVkaQorCXZwYWRkZAkleG1tMiwleG1tMTEsJXhtbTkKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCXZweG9yCSV4bW04LCV4bW0zLCV4bW0zCisJYWRkbAk1MiglcnNwKSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwltb3ZsCSVlYnAsJWVzaQorCXNobGRsCSQ1LCVlYnAsJWVicAorCXZwc3JsZAkkMzAsJXhtbTMsJXhtbTgKKwl2bW92ZHFhCSV4bW05LDMyKCVyc3ApCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJdnBzbGxkCSQyLCV4bW0zLCV4bW0zCisJYWRkbAk1NiglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCXZwb3IJJXhtbTgsJXhtbTMsJXhtbTMKKwlhZGRsCTYwKCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCW1vdmwJJWVjeCwlZXNpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZWRpLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkwKCVyc3ApLCVlYXgKKwl2cGFkZGQJJXhtbTMsJXhtbTExLCV4bW05CisJeG9ybAklZWR4LCVlc2kKKwltb3ZsCSVlYngsJWVkaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVzaSwlZWF4CisJdm1vdmRxYQkleG1tOSw0OCglcnNwKQorCXhvcmwJJWVkeCwlZWRpCisJc2hyZGwJJDcsJWVjeCwlZWN4CisJYWRkbAklZWJ4LCVlYXgKKwlhZGRsCTQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlZGksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTgoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWJwLCVlZGkKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTEyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXNocmRsCSQ3LCVlYnAsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJY21wcQklcjEwLCVyOQorCWplCUwkZG9uZV9hdngKKwl2bW92ZHFhCTY0KCVyMTQpLCV4bW02CisJdm1vdmRxYQktNjQoJXIxNCksJXhtbTExCisJdm1vdmRxdQkwKCVyOSksJXhtbTAKKwl2bW92ZHF1CTE2KCVyOSksJXhtbTEKKwl2bW92ZHF1CTMyKCVyOSksJXhtbTIKKwl2bW92ZHF1CTQ4KCVyOSksJXhtbTMKKwl2cHNodWZiCSV4bW02LCV4bW0wLCV4bW0wCisJYWRkcQkkNjQsJXI5CisJYWRkbAkxNiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwl2cHNodWZiCSV4bW02LCV4bW0xLCV4bW0xCisJbW92bAklZWN4LCVlZGkKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwl2cGFkZGQJJXhtbTExLCV4bW0wLCV4bW00CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJdm1vdmRxYQkleG1tNCwwKCVyc3ApCisJYWRkbAkyMCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMjQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTI4KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAkzMiglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwl2cHNodWZiCSV4bW02LCV4bW0yLCV4bW0yCisJbW92bAklZWR4LCVlZGkKKwlzaGxkbAkkNSwlZWR4LCVlZHgKKwl2cGFkZGQJJXhtbTExLCV4bW0xLCV4bW01CisJYWRkbAklZXNpLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCXNocmRsCSQ3LCVlYnAsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJdm1vdmRxYQkleG1tNSwxNiglcnNwKQorCWFkZGwJMzYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk0NCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJNDgoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJdnBzaHVmYgkleG1tNiwleG1tMywleG1tMworCW1vdmwJJWVicCwlZWRpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJdnBhZGRkCSV4bW0xMSwleG1tMiwleG1tNgorCWFkZGwJJWVzaSwlZWR4CisJeG9ybAklZWJ4LCVlZGkKKwlzaHJkbAkkNywlZWF4LCVlYXgKKwlhZGRsCSVlYnAsJWVkeAorCXZtb3ZkcWEJJXhtbTYsMzIoJXJzcCkKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXNocmRsCSQ3LCVlYnAsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk1NiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNjAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAkwKCVyOCksJWVheAorCWFkZGwJNCglcjgpLCVlc2kKKwlhZGRsCTgoJXI4KSwlZWN4CisJYWRkbAkxMiglcjgpLCVlZHgKKwltb3ZsCSVlYXgsMCglcjgpCisJYWRkbAkxNiglcjgpLCVlYnAKKwltb3ZsCSVlc2ksNCglcjgpCisJbW92bAklZXNpLCVlYngKKwltb3ZsCSVlY3gsOCglcjgpCisJbW92bAklZWN4LCVlZGkKKwltb3ZsCSVlZHgsMTIoJXI4KQorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJwLDE2KCVyOCkKKwlhbmRsCSVlZGksJWVzaQorCWptcAlMJG9vcF9hdngKKworLnAyYWxpZ24JNAorTCRkb25lX2F2eDoKKwlhZGRsCTE2KCVyc3ApLCVlYngKKwl4b3JsCSVlYnAsJWVzaQorCW1vdmwJJWVjeCwlZWRpCisJc2hsZGwJJDUsJWVjeCwlZWN4CisJYWRkbAklZXNpLCVlYngKKwl4b3JsCSVlYnAsJWVkaQorCXNocmRsCSQ3LCVlZHgsJWVkeAorCWFkZGwJJWVjeCwlZWJ4CisJYWRkbAkyMCglcnNwKSwlZWF4CisJeG9ybAklZWR4LCVlZGkKKwltb3ZsCSVlYngsJWVzaQorCXNobGRsCSQ1LCVlYngsJWVieAorCWFkZGwJJWVkaSwlZWF4CisJeG9ybAklZWR4LCVlc2kKKwlzaHJkbAkkNywlZWN4LCVlY3gKKwlhZGRsCSVlYngsJWVheAorCWFkZGwJMjQoJXJzcCksJWVicAorCXhvcmwJJWVjeCwlZXNpCisJbW92bAklZWF4LCVlZGkKKwlzaGxkbAkkNSwlZWF4LCVlYXgKKwlhZGRsCSVlc2ksJWVicAorCXhvcmwJJWVjeCwlZWRpCisJc2hyZGwJJDcsJWVieCwlZWJ4CisJYWRkbAklZWF4LCVlYnAKKwlhZGRsCTI4KCVyc3ApLCVlZHgKKwl4b3JsCSVlYngsJWVkaQorCW1vdmwJJWVicCwlZXNpCisJc2hsZGwJJDUsJWVicCwlZWJwCisJYWRkbAklZWRpLCVlZHgKKwl4b3JsCSVlYngsJWVzaQorCXNocmRsCSQ3LCVlYXgsJWVheAorCWFkZGwJJWVicCwlZWR4CisJYWRkbAkzMiglcnNwKSwlZWN4CisJeG9ybAklZWF4LCVlc2kKKwltb3ZsCSVlZHgsJWVkaQorCXNobGRsCSQ1LCVlZHgsJWVkeAorCWFkZGwJJWVzaSwlZWN4CisJeG9ybAklZWF4LCVlZGkKKwlzaHJkbAkkNywlZWJwLCVlYnAKKwlhZGRsCSVlZHgsJWVjeAorCWFkZGwJMzYoJXJzcCksJWVieAorCXhvcmwJJWVicCwlZWRpCisJbW92bAklZWN4LCVlc2kKKwlzaGxkbAkkNSwlZWN4LCVlY3gKKwlhZGRsCSVlZGksJWVieAorCXhvcmwJJWVicCwlZXNpCisJc2hyZGwJJDcsJWVkeCwlZWR4CisJYWRkbAklZWN4LCVlYngKKwlhZGRsCTQwKCVyc3ApLCVlYXgKKwl4b3JsCSVlZHgsJWVzaQorCW1vdmwJJWVieCwlZWRpCisJc2hsZGwJJDUsJWVieCwlZWJ4CisJYWRkbAklZXNpLCVlYXgKKwl4b3JsCSVlZHgsJWVkaQorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJYWRkbAk0NCglcnNwKSwlZWJwCisJeG9ybAklZWN4LCVlZGkKKwltb3ZsCSVlYXgsJWVzaQorCXNobGRsCSQ1LCVlYXgsJWVheAorCWFkZGwJJWVkaSwlZWJwCisJeG9ybAklZWN4LCVlc2kKKwlzaHJkbAkkNywlZWJ4LCVlYngKKwlhZGRsCSVlYXgsJWVicAorCWFkZGwJNDgoJXJzcCksJWVkeAorCXhvcmwJJWVieCwlZXNpCisJbW92bAklZWJwLCVlZGkKKwlzaGxkbAkkNSwlZWJwLCVlYnAKKwlhZGRsCSVlc2ksJWVkeAorCXhvcmwJJWVieCwlZWRpCisJc2hyZGwJJDcsJWVheCwlZWF4CisJYWRkbAklZWJwLCVlZHgKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwl4b3JsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisJc2hsZGwJJDUsJWVkeCwlZWR4CisJYWRkbAklZWRpLCVlY3gKKwl4b3JsCSVlYXgsJWVzaQorCXNocmRsCSQ3LCVlYnAsJWVicAorCWFkZGwJJWVkeCwlZWN4CisJYWRkbAk1NiglcnNwKSwlZWJ4CisJeG9ybAklZWJwLCVlc2kKKwltb3ZsCSVlY3gsJWVkaQorCXNobGRsCSQ1LCVlY3gsJWVjeAorCWFkZGwJJWVzaSwlZWJ4CisJeG9ybAklZWJwLCVlZGkKKwlzaHJkbAkkNywlZWR4LCVlZHgKKwlhZGRsCSVlY3gsJWVieAorCWFkZGwJNjAoJXJzcCksJWVheAorCXhvcmwJJWVkeCwlZWRpCisJbW92bAklZWJ4LCVlc2kKKwlzaGxkbAkkNSwlZWJ4LCVlYngKKwlhZGRsCSVlZGksJWVheAorCXNocmRsCSQ3LCVlY3gsJWVjeAorCWFkZGwJJWVieCwlZWF4CisJdnplcm91cHBlcgorCisJYWRkbAkwKCVyOCksJWVheAorCWFkZGwJNCglcjgpLCVlc2kKKwlhZGRsCTgoJXI4KSwlZWN4CisJbW92bAklZWF4LDAoJXI4KQorCWFkZGwJMTIoJXI4KSwlZWR4CisJbW92bAklZXNpLDQoJXI4KQorCWFkZGwJMTYoJXI4KSwlZWJwCisJbW92bAklZWN4LDgoJXI4KQorCW1vdmwJJWVkeCwxMiglcjgpCisJbW92bAklZWJwLDE2KCVyOCkKKwltb3ZxCS00MCglcjExKSwlcjE0CisKKwltb3ZxCS0zMiglcjExKSwlcjEzCisKKwltb3ZxCS0yNCglcjExKSwlcjEyCisKKwltb3ZxCS0xNiglcjExKSwlcmJwCisKKwltb3ZxCS04KCVyMTEpLCVyYngKKworCWxlYXEJKCVyMTEpLCVyc3AKKworTCRlcGlsb2d1ZV9hdng6CisJLmJ5dGUJMHhmMywweGMzCisKKworLnAyYWxpZ24JNgorS19YWF9YWDoKKy5sb25nCTB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkKKy5sb25nCTB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkKKy5sb25nCTB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEKKy5sb25nCTB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEKKy5sb25nCTB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMKKy5sb25nCTB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMKKy5sb25nCTB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYKKy5sb25nCTB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5ieXRlCTB4ZiwweGUsMHhkLDB4YywweGIsMHhhLDB4OSwweDgsMHg3LDB4NiwweDUsMHg0LDB4MywweDIsMHgxLDB4MAorLmJ5dGUJODMsNzIsNjUsNDksMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorLnAyYWxpZ24JNgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LXg4Nl82NC5TIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFmNzZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni14ODZfNjQuUwpAQCAtMCwwICsxLDM5NTkgQEAKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorLnRleHQJCisKKworLmdsb2JsCV9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLnByaXZhdGVfZXh0ZXJuIF9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorCisucDJhbGlnbgk0Citfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CisKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjExCisJbW92bAkwKCVyMTEpLCVyOWQKKwltb3ZsCTQoJXIxMSksJXIxMGQKKwltb3ZsCTgoJXIxMSksJXIxMWQKKwlhbmRsCSQxMDczNzQxODI0LCVyOWQKKwlhbmRsCSQyNjg0MzU5NjgsJXIxMGQKKwlvcmwJJXI5ZCwlcjEwZAorCWNtcGwJJDEzNDIxNzc3OTIsJXIxMGQKKwlqZQlMJGF2eF9zaG9ydGN1dAorCXRlc3RsCSQ1MTIsJXIxMGQKKwlqbnoJTCRzc3NlM19zaG9ydGN1dAorCW1vdnEJJXJzcCwlcmF4CisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKwlzaGxxCSQ0LCVyZHgKKwlzdWJxCSQ2NCszMiwlcnNwCisJbGVhcQkoJXJzaSwlcmR4LDQpLCVyZHgKKwlhbmRxCSQtNjQsJXJzcAorCW1vdnEJJXJkaSw2NCswKCVyc3ApCisJbW92cQklcnNpLDY0KzgoJXJzcCkKKwltb3ZxCSVyZHgsNjQrMTYoJXJzcCkKKwltb3ZxCSVyYXgsODgoJXJzcCkKKworTCRwcm9sb2d1ZToKKworCW1vdmwJMCglcmRpKSwlZWF4CisJbW92bAk0KCVyZGkpLCVlYngKKwltb3ZsCTgoJXJkaSksJWVjeAorCW1vdmwJMTIoJXJkaSksJWVkeAorCW1vdmwJMTYoJXJkaSksJXI4ZAorCW1vdmwJMjAoJXJkaSksJXI5ZAorCW1vdmwJMjQoJXJkaSksJXIxMGQKKwltb3ZsCTI4KCVyZGkpLCVyMTFkCisJam1wCUwkbG9vcAorCisucDJhbGlnbgk0CitMJGxvb3A6CisJbW92bAklZWJ4LCVlZGkKKwlsZWFxCUsyNTYoJXJpcCksJXJicAorCXhvcmwJJWVjeCwlZWRpCisJbW92bAkwKCVyc2kpLCVyMTJkCisJbW92bAklcjhkLCVyMTNkCisJbW92bAklZWF4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyOWQsJXIxNWQKKworCXhvcmwJJXI4ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTVkCisKKwltb3ZsCSVyMTJkLDAoJXJzcCkKKwl4b3JsCSVlYXgsJXIxNGQKKwlhbmRsCSVyOGQsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVyMTFkLCVyMTJkCisJeG9ybAklcjEwZCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyOGQsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVlYXgsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVheCwlcjE0ZAorCisJeG9ybAklZWJ4LCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVieCwlcjExZAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCWFkZGwJJXIxMmQsJXIxMWQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjExZAorCW1vdmwJNCglcnNpKSwlcjEyZAorCW1vdmwJJWVkeCwlcjEzZAorCW1vdmwJJXIxMWQsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXI4ZCwlZWRpCisKKwl4b3JsCSVlZHgsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVlZGkKKworCW1vdmwJJXIxMmQsNCglcnNwKQorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyOWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJXIxMWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjExZCwlcjE0ZAorCisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWF4LCVyMTBkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjEwZAorCWFkZGwJJXIxMmQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjEwZAorCW1vdmwJOCglcnNpKSwlcjEyZAorCW1vdmwJJWVjeCwlcjEzZAorCW1vdmwJJXIxMGQsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVkeCwlcjE1ZAorCisJeG9ybAklZWN4LCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjE1ZAorCisJbW92bAklcjEyZCw4KCVyc3ApCisJeG9ybAklcjEwZCwlcjE0ZAorCWFuZGwJJWVjeCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXI5ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVyMTBkLCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTRkCisKKwl4b3JsCSVyMTFkLCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXIxMWQsJXI5ZAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlcjlkCisJYWRkbAklcjEyZCwlZWJ4CisJYWRkbAklcjEyZCwlcjlkCisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJXI5ZAorCW1vdmwJMTIoJXJzaSksJXIxMmQKKwltb3ZsCSVlYngsJXIxM2QKKwltb3ZsCSVyOWQsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVjeCwlZWRpCisKKwl4b3JsCSVlYngsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWR4LCVlZGkKKworCW1vdmwJJXIxMmQsMTIoJXJzcCkKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXI4ZCwlcjEyZAorCXhvcmwJJWVkeCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklcjlkLCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXI5ZCwlcjE0ZAorCisJeG9ybAklcjEwZCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXIxMGQsJXI4ZAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJXI4ZAorCWFkZGwJJXIxMmQsJWVheAorCWFkZGwJJXIxMmQsJXI4ZAorCisJbGVhcQkyMCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjhkCisJbW92bAkxNiglcnNpKSwlcjEyZAorCW1vdmwJJWVheCwlcjEzZAorCW1vdmwJJXI4ZCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWJ4LCVyMTVkCisKKwl4b3JsCSVlYXgsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWN4LCVyMTVkCisKKwltb3ZsCSVyMTJkLDE2KCVyc3ApCisJeG9ybAklcjhkLCVyMTRkCisJYW5kbAklZWF4LCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWR4LCVyMTJkCisJeG9ybAklZWN4LCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJXI4ZCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjhkLCVyMTRkCisKKwl4b3JsCSVyOWQsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjlkLCVlZHgKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJXIxMmQsJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlZWR4CisJbW92bAkyMCglcnNpKSwlcjEyZAorCW1vdmwJJXIxMWQsJXIxM2QKKwltb3ZsCSVlZHgsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVheCwlZWRpCisKKwl4b3JsCSVyMTFkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVieCwlZWRpCisKKwltb3ZsCSVyMTJkLDIwKCVyc3ApCisJeG9ybAklZWR4LCVyMTRkCisJYW5kbAklcjExZCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWN4LCVyMTJkCisJeG9ybAklZWJ4LCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklZWR4LCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVkeCwlcjE0ZAorCisJeG9ybAklcjhkLCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjhkLCVlY3gKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVlY3gKKwlhZGRsCSVyMTJkLCVyMTBkCisJYWRkbAklcjEyZCwlZWN4CisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJWVjeAorCW1vdmwJMjQoJXJzaSksJXIxMmQKKwltb3ZsCSVyMTBkLCVyMTNkCisJbW92bAklZWN4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTFkLCVyMTVkCisKKwl4b3JsCSVyMTBkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVheCwlcjE1ZAorCisJbW92bAklcjEyZCwyNCglcnNwKQorCXhvcmwJJWVjeCwlcjE0ZAorCWFuZGwJJXIxMGQsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlYngsJXIxMmQKKwl4b3JsCSVlYXgsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJWVjeCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWN4LCVyMTRkCisKKwl4b3JsCSVlZHgsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWR4LCVlYngKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJWVieAorCWFkZGwJJXIxMmQsJXI5ZAorCWFkZGwJJXIxMmQsJWVieAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVlYngKKwltb3ZsCTI4KCVyc2kpLCVyMTJkCisJbW92bAklcjlkLCVyMTNkCisJbW92bAklZWJ4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTBkLCVlZGkKKworCXhvcmwJJXI5ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTFkLCVlZGkKKworCW1vdmwJJXIxMmQsMjgoJXJzcCkKKwl4b3JsCSVlYngsJXIxNGQKKwlhbmRsCSVyOWQsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVheCwlcjEyZAorCXhvcmwJJXIxMWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJWVieCwlZWRpCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlYngsJXIxNGQKKworCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVjeCwlZWF4CisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlZWF4CisJYWRkbAklcjEyZCwlcjhkCisJYWRkbAklcjEyZCwlZWF4CisKKwlsZWFxCTIwKCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVlYXgKKwltb3ZsCTMyKCVyc2kpLCVyMTJkCisJbW92bAklcjhkLCVyMTNkCisJbW92bAklZWF4LCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyOWQsJXIxNWQKKworCXhvcmwJJXI4ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTVkCisKKwltb3ZsCSVyMTJkLDMyKCVyc3ApCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklZWF4LCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlYXgsJXIxNGQKKworCXhvcmwJJWVieCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlYngsJXIxMWQKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKwlhZGRsCSVyMTJkLCVyMTFkCisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJXIxMWQKKwltb3ZsCTM2KCVyc2kpLCVyMTJkCisJbW92bAklZWR4LCVyMTNkCisJbW92bAklcjExZCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjhkLCVlZGkKKworCXhvcmwJJWVkeCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOWQsJWVkaQorCisJbW92bAklcjEyZCwzNiglcnNwKQorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyOWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJXIxMWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjExZCwlcjE0ZAorCisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWF4LCVyMTBkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjEwZAorCWFkZGwJJXIxMmQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjEwZAorCW1vdmwJNDAoJXJzaSksJXIxMmQKKwltb3ZsCSVlY3gsJXIxM2QKKwltb3ZsCSVyMTBkLCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlZHgsJXIxNWQKKworCXhvcmwJJWVjeCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOGQsJXIxNWQKKworCW1vdmwJJXIxMmQsNDAoJXJzcCkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYW5kbAklZWN4LCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjlkLCVyMTJkCisJeG9ybAklcjhkLCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJXIxMGQsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXIxMGQsJXIxNGQKKworCXhvcmwJJXIxMWQsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjExZCwlcjlkCisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVyOWQKKwlhZGRsCSVyMTJkLCVlYngKKwlhZGRsCSVyMTJkLCVyOWQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlcjlkCisJbW92bAk0NCglcnNpKSwlcjEyZAorCW1vdmwJJWVieCwlcjEzZAorCW1vdmwJJXI5ZCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWN4LCVlZGkKKworCXhvcmwJJWVieCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlZHgsJWVkaQorCisJbW92bAklcjEyZCw0NCglcnNwKQorCXhvcmwJJXI5ZCwlcjE0ZAorCWFuZGwJJWVieCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjhkLCVyMTJkCisJeG9ybAklZWR4LCVlZGkKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVyOWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjlkLCVyMTRkCisKKwl4b3JsCSVyMTBkLCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjEwZCwlcjhkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjhkCisJYWRkbAklcjEyZCwlZWF4CisJYWRkbAklcjEyZCwlcjhkCisKKwlsZWFxCTIwKCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVyOGQKKwltb3ZsCTQ4KCVyc2kpLCVyMTJkCisJbW92bAklZWF4LCVyMTNkCisJbW92bAklcjhkLCVyMTRkCisJYnN3YXBsCSVyMTJkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlYngsJXIxNWQKKworCXhvcmwJJWVheCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlY3gsJXIxNWQKKworCW1vdmwJJXIxMmQsNDgoJXJzcCkKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlY3gsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklcjhkLCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyOGQsJXIxNGQKKworCXhvcmwJJXI5ZCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyOWQsJWVkeAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklcjEyZCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwlhZGRsCSVyMTRkLCVlZHgKKwltb3ZsCTUyKCVyc2kpLCVyMTJkCisJbW92bAklcjExZCwlcjEzZAorCW1vdmwJJWVkeCwlcjE0ZAorCWJzd2FwbAklcjEyZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWF4LCVlZGkKKworCXhvcmwJJXIxMWQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWJ4LCVlZGkKKworCW1vdmwJJXIxMmQsNTIoJXJzcCkKKwl4b3JsCSVlZHgsJXIxNGQKKwlhbmRsCSVyMTFkLCVlZGkKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlYngsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVlZHgsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWR4LCVyMTRkCisKKwl4b3JsCSVyOGQsJWVkaQorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyOGQsJWVjeAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKwlhZGRsCSVyMTJkLCVlY3gKKworCWxlYXEJNCglcmJwKSwlcmJwCisJYWRkbAklcjE0ZCwlZWN4CisJbW92bAk1NiglcnNpKSwlcjEyZAorCW1vdmwJJXIxMGQsJXIxM2QKKwltb3ZsCSVlY3gsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxMWQsJXIxNWQKKworCXhvcmwJJXIxMGQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWF4LCVyMTVkCisKKwltb3ZsCSVyMTJkLDU2KCVyc3ApCisJeG9ybAklZWN4LCVyMTRkCisJYW5kbAklcjEwZCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVieCwlcjEyZAorCXhvcmwJJWVheCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklZWN4LCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlY3gsJXIxNGQKKworCXhvcmwJJWVkeCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlZHgsJWVieAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAklcjEyZCwlcjlkCisJYWRkbAklcjEyZCwlZWJ4CisKKwlsZWFxCTQoJXJicCksJXJicAorCWFkZGwJJXIxNGQsJWVieAorCW1vdmwJNjAoJXJzaSksJXIxMmQKKwltb3ZsCSVyOWQsJXIxM2QKKwltb3ZsCSVlYngsJXIxNGQKKwlic3dhcGwJJXIxMmQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxMGQsJWVkaQorCisJeG9ybAklcjlkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJWVkaQorCisJbW92bAklcjEyZCw2MCglcnNwKQorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWF4LCVyMTJkCisJeG9ybAklcjExZCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklZWJ4LCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVieCwlcjE0ZAorCisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWN4LCVlYXgKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVlYXgKKwlhZGRsCSVyMTJkLCVyOGQKKwlhZGRsCSVyMTJkLCVlYXgKKworCWxlYXEJMjAoJXJicCksJXJicAorCWptcAlMJHJvdW5kc18xNl94eAorLnAyYWxpZ24JNAorTCRyb3VuZHNfMTZfeHg6CisJbW92bAk0KCVyc3ApLCVyMTNkCisJbW92bAk1NiglcnNwKSwlcjE1ZAorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlZWF4CisJbW92bAklcjE1ZCwlcjE0ZAorCXJvcmwJJDIsJXIxNWQKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJXIxNWQKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlcjE1ZAorCWFkZGwJMzYoJXJzcCksJXIxMmQKKworCWFkZGwJMCglcnNwKSwlcjEyZAorCW1vdmwJJXI4ZCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKwltb3ZsCSVlYXgsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXI5ZCwlcjE1ZAorCisJeG9ybAklcjhkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMGQsJXIxNWQKKworCW1vdmwJJXIxMmQsMCglcnNwKQorCXhvcmwJJWVheCwlcjE0ZAorCWFuZGwJJXI4ZCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJWVheCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWF4LCVyMTRkCisKKwl4b3JsCSVlYngsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWJ4LCVyMTFkCisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVyMTFkCisJYWRkbAklcjEyZCwlZWR4CisJYWRkbAklcjEyZCwlcjExZAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTgoJXJzcCksJXIxM2QKKwltb3ZsCTYwKCVyc3ApLCVlZGkKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJXIxMWQKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJNDAoJXJzcCksJXIxMmQKKworCWFkZGwJNCglcnNwKSwlcjEyZAorCW1vdmwJJWVkeCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCW1vdmwJJXIxMWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXI4ZCwlZWRpCisKKwl4b3JsCSVlZHgsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVlZGkKKworCW1vdmwJJXIxMmQsNCglcnNwKQorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyOWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJXIxMWQsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjExZCwlcjE0ZAorCisJeG9ybAklZWF4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWF4LCVyMTBkCisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlcjEwZAorCWFkZGwJJXIxMmQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJbW92bAkxMiglcnNwKSwlcjEzZAorCW1vdmwJMCglcnNwKSwlcjE1ZAorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlcjEwZAorCW1vdmwJJXIxNWQsJXIxNGQKKwlyb3JsCSQyLCVyMTVkCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVyMTVkCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVyMTVkCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlhZGRsCTQ0KCVyc3ApLCVyMTJkCisKKwlhZGRsCTgoJXJzcCksJXIxMmQKKwltb3ZsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisJbW92bAklcjEwZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWR4LCVyMTVkCisKKwl4b3JsCSVlY3gsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjhkLCVyMTVkCisKKwltb3ZsCSVyMTJkLDgoJXJzcCkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYW5kbAklZWN4LCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjlkLCVyMTJkCisJeG9ybAklcjhkLCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJXIxMGQsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXIxMGQsJXIxNGQKKworCXhvcmwJJXIxMWQsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjExZCwlcjlkCisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVyOWQKKwlhZGRsCSVyMTJkLCVlYngKKwlhZGRsCSVyMTJkLCVyOWQKKworCWxlYXEJNCglcmJwKSwlcmJwCisJbW92bAkxNiglcnNwKSwlcjEzZAorCW1vdmwJNCglcnNwKSwlZWRpCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVyOWQKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJNDgoJXJzcCksJXIxMmQKKworCWFkZGwJMTIoJXJzcCksJXIxMmQKKwltb3ZsCSVlYngsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKwltb3ZsCSVyOWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVjeCwlZWRpCisKKwl4b3JsCSVlYngsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWR4LCVlZGkKKworCW1vdmwJJXIxMmQsMTIoJXJzcCkKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXI4ZCwlcjEyZAorCXhvcmwJJWVkeCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklcjlkLCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXI5ZCwlcjE0ZAorCisJeG9ybAklcjEwZCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXIxMGQsJXI4ZAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJXI4ZAorCWFkZGwJJXIxMmQsJWVheAorCWFkZGwJJXIxMmQsJXI4ZAorCisJbGVhcQkyMCglcmJwKSwlcmJwCisJbW92bAkyMCglcnNwKSwlcjEzZAorCW1vdmwJOCglcnNwKSwlcjE1ZAorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlcjhkCisJbW92bAklcjE1ZCwlcjE0ZAorCXJvcmwJJDIsJXIxNWQKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJXIxNWQKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlcjE1ZAorCWFkZGwJNTIoJXJzcCksJXIxMmQKKworCWFkZGwJMTYoJXJzcCksJXIxMmQKKwltb3ZsCSVlYXgsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisJbW92bAklcjhkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlYngsJXIxNWQKKworCXhvcmwJJWVheCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlY3gsJXIxNWQKKworCW1vdmwJJXIxMmQsMTYoJXJzcCkKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlY3gsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklcjhkLCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyOGQsJXIxNGQKKworCXhvcmwJJXI5ZCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyOWQsJWVkeAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlZWR4CisJYWRkbAklcjEyZCwlcjExZAorCWFkZGwJJXIxMmQsJWVkeAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTI0KCVyc3ApLCVyMTNkCisJbW92bAkxMiglcnNwKSwlZWRpCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVlZHgKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJNTYoJXJzcCksJXIxMmQKKworCWFkZGwJMjAoJXJzcCksJXIxMmQKKwltb3ZsCSVyMTFkLCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisJbW92bAklZWR4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVlYXgsJWVkaQorCisJeG9ybAklcjExZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYngsJWVkaQorCisJbW92bAklcjEyZCwyMCglcnNwKQorCXhvcmwJJWVkeCwlcjE0ZAorCWFuZGwJJXIxMWQsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVjeCwlcjEyZAorCXhvcmwJJWVieCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJWVkeCwlZWRpCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlZHgsJXIxNGQKKworCXhvcmwJJXI4ZCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXI4ZCwlZWN4CisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlZWN4CisJYWRkbAklcjEyZCwlcjEwZAorCWFkZGwJJXIxMmQsJWVjeAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTI4KCVyc3ApLCVyMTNkCisJbW92bAkxNiglcnNwKSwlcjE1ZAorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlZWN4CisJbW92bAklcjE1ZCwlcjE0ZAorCXJvcmwJJDIsJXIxNWQKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJXIxNWQKKwl4b3JsCSVyMTNkLCVyMTJkCisJeG9ybAklcjE0ZCwlcjE1ZAorCWFkZGwJNjAoJXJzcCksJXIxMmQKKworCWFkZGwJMjQoJXJzcCksJXIxMmQKKwltb3ZsCSVyMTBkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCW1vdmwJJWVjeCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjExZCwlcjE1ZAorCisJeG9ybAklcjEwZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYXgsJXIxNWQKKworCW1vdmwJJXIxMmQsMjQoJXJzcCkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWJ4LCVyMTJkCisJeG9ybAklZWF4LCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCSVyMTVkLCVyMTJkCisKKwltb3ZsCSVlY3gsJXIxNWQKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVjeCwlcjE0ZAorCisJeG9ybAklZWR4LCVyMTVkCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVkeCwlZWJ4CisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVlYngKKwlhZGRsCSVyMTJkLCVyOWQKKwlhZGRsCSVyMTJkLCVlYngKKworCWxlYXEJNCglcmJwKSwlcmJwCisJbW92bAkzMiglcnNwKSwlcjEzZAorCW1vdmwJMjAoJXJzcCksJWVkaQorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlZWJ4CisJbW92bAklZWRpLCVyMTRkCisJcm9ybAkkMiwlZWRpCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVlZGkKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJWVkaQorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVlZGkKKwlhZGRsCTAoJXJzcCksJXIxMmQKKworCWFkZGwJMjgoJXJzcCksJXIxMmQKKwltb3ZsCSVyOWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKwltb3ZsCSVlYngsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxMGQsJWVkaQorCisJeG9ybAklcjlkLCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJWVkaQorCisJbW92bAklcjEyZCwyOCglcnNwKQorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWF4LCVyMTJkCisJeG9ybAklcjExZCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklZWJ4LCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJWVieCwlcjE0ZAorCisJeG9ybAklZWN4LCVlZGkKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWN4LCVlYXgKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVlYXgKKwlhZGRsCSVyMTJkLCVyOGQKKwlhZGRsCSVyMTJkLCVlYXgKKworCWxlYXEJMjAoJXJicCksJXJicAorCW1vdmwJMzYoJXJzcCksJXIxM2QKKwltb3ZsCTI0KCVyc3ApLCVyMTVkCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVlYXgKKwltb3ZsCSVyMTVkLCVyMTRkCisJcm9ybAkkMiwlcjE1ZAorCisJeG9ybAklcjEyZCwlcjEzZAorCXNocmwJJDMsJXIxMmQKKwlyb3JsCSQ3LCVyMTNkCisJeG9ybAklcjE0ZCwlcjE1ZAorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlcjE1ZAorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVyMTVkCisJYWRkbAk0KCVyc3ApLCVyMTJkCisKKwlhZGRsCTMyKCVyc3ApLCVyMTJkCisJbW92bAklcjhkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCW1vdmwJJWVheCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjlkLCVyMTVkCisKKwl4b3JsCSVyOGQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjEwZCwlcjE1ZAorCisJbW92bAklcjEyZCwzMiglcnNwKQorCXhvcmwJJWVheCwlcjE0ZAorCWFuZGwJJXI4ZCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJWVheCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWF4LCVyMTRkCisKKwl4b3JsCSVlYngsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklZWJ4LCVyMTFkCisKKwlhbmRsCSVyMTVkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklZWRpLCVyMTFkCisJYWRkbAklcjEyZCwlZWR4CisJYWRkbAklcjEyZCwlcjExZAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTQwKCVyc3ApLCVyMTNkCisJbW92bAkyOCglcnNwKSwlZWRpCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVyMTFkCisJbW92bAklZWRpLCVyMTRkCisJcm9ybAkkMiwlZWRpCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVlZGkKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJWVkaQorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVlZGkKKwlhZGRsCTgoJXJzcCksJXIxMmQKKworCWFkZGwJMzYoJXJzcCksJXIxMmQKKwltb3ZsCSVlZHgsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKwltb3ZsCSVyMTFkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyOGQsJWVkaQorCisJeG9ybAklZWR4LCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI5ZCwlZWRpCisKKwltb3ZsCSVyMTJkLDM2KCVyc3ApCisJeG9ybAklcjExZCwlcjE0ZAorCWFuZGwJJWVkeCwlZWRpCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklcjEwZCwlcjEyZAorCXhvcmwJJXI5ZCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVkeCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklcjExZCwlZWRpCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTRkCisKKwl4b3JsCSVlYXgsJWVkaQorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlYXgsJXIxMGQKKworCWFuZGwJJWVkaSwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVyMTVkLCVyMTBkCisJYWRkbAklcjEyZCwlZWN4CisJYWRkbAklcjEyZCwlcjEwZAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTQ0KCVyc3ApLCVyMTNkCisJbW92bAkzMiglcnNwKSwlcjE1ZAorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlcjEwZAorCW1vdmwJJXIxNWQsJXIxNGQKKwlyb3JsCSQyLCVyMTVkCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVyMTVkCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVyMTVkCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlhZGRsCTEyKCVyc3ApLCVyMTJkCisKKwlhZGRsCTQwKCVyc3ApLCVyMTJkCisJbW92bAklZWN4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCW1vdmwJJXIxMGQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVkeCwlcjE1ZAorCisJeG9ybAklZWN4LCVyMTNkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjE1ZAorCisJbW92bAklcjEyZCw0MCglcnNwKQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhbmRsCSVlY3gsJXIxNWQKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVyOWQsJXIxMmQKKwl4b3JsCSVyOGQsJXIxNWQKKworCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklcjEwZCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjEwZCwlcjE0ZAorCisJeG9ybAklcjExZCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyMTFkLCVyOWQKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJXI5ZAorCWFkZGwJJXIxMmQsJWVieAorCWFkZGwJJXIxMmQsJXI5ZAorCisJbGVhcQk0KCVyYnApLCVyYnAKKwltb3ZsCTQ4KCVyc3ApLCVyMTNkCisJbW92bAkzNiglcnNwKSwlZWRpCisKKwltb3ZsCSVyMTNkLCVyMTJkCisJcm9ybAkkMTEsJXIxM2QKKwlhZGRsCSVyMTRkLCVyOWQKKwltb3ZsCSVlZGksJXIxNGQKKwlyb3JsCSQyLCVlZGkKKworCXhvcmwJJXIxMmQsJXIxM2QKKwlzaHJsCSQzLCVyMTJkCisJcm9ybAkkNywlcjEzZAorCXhvcmwJJXIxNGQsJWVkaQorCXNocmwJJDEwLCVyMTRkCisKKwlyb3JsCSQxNywlZWRpCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJWVkaQorCWFkZGwJMTYoJXJzcCksJXIxMmQKKworCWFkZGwJNDQoJXJzcCksJXIxMmQKKwltb3ZsCSVlYngsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKwltb3ZsCSVyOWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJWVjeCwlZWRpCisKKwl4b3JsCSVlYngsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWR4LCVlZGkKKworCW1vdmwJJXIxMmQsNDQoJXJzcCkKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJXI4ZCwlcjEyZAorCXhvcmwJJWVkeCwlZWRpCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCisJbW92bAklcjlkLCVlZGkKKwlhZGRsCSglcmJwKSwlcjEyZAorCXhvcmwJJXI5ZCwlcjE0ZAorCisJeG9ybAklcjEwZCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJXIxMGQsJXI4ZAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJXI4ZAorCWFkZGwJJXIxMmQsJWVheAorCWFkZGwJJXIxMmQsJXI4ZAorCisJbGVhcQkyMCglcmJwKSwlcmJwCisJbW92bAk1MiglcnNwKSwlcjEzZAorCW1vdmwJNDAoJXJzcCksJXIxNWQKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJXI4ZAorCW1vdmwJJXIxNWQsJXIxNGQKKwlyb3JsCSQyLCVyMTVkCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVyMTVkCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVyMTVkCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlhZGRsCTIwKCVyc3ApLCVyMTJkCisKKwlhZGRsCTQ4KCVyc3ApLCVyMTJkCisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCW1vdmwJJXI4ZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWJ4LCVyMTVkCisKKwl4b3JsCSVlYXgsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWN4LCVyMTVkCisKKwltb3ZsCSVyMTJkLDQ4KCVyc3ApCisJeG9ybAklcjhkLCVyMTRkCisJYW5kbAklZWF4LCVyMTVkCisKKwlyb3JsCSQ1LCVyMTNkCisJYWRkbAklZWR4LCVyMTJkCisJeG9ybAklZWN4LCVyMTVkCisKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKworCW1vdmwJJXI4ZCwlcjE1ZAorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklcjhkLCVyMTRkCisKKwl4b3JsCSVyOWQsJXIxNWQKKwlyb3JsCSQ2LCVyMTNkCisJbW92bAklcjlkLCVlZHgKKworCWFuZGwJJXIxNWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTJkCisKKwl4b3JsCSVlZGksJWVkeAorCWFkZGwJJXIxMmQsJXIxMWQKKwlhZGRsCSVyMTJkLCVlZHgKKworCWxlYXEJNCglcmJwKSwlcmJwCisJbW92bAk1NiglcnNwKSwlcjEzZAorCW1vdmwJNDQoJXJzcCksJWVkaQorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlZWR4CisJbW92bAklZWRpLCVyMTRkCisJcm9ybAkkMiwlZWRpCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVlZGkKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJWVkaQorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVlZGkKKwlhZGRsCTI0KCVyc3ApLCVyMTJkCisKKwlhZGRsCTUyKCVyc3ApLCVyMTJkCisJbW92bAklcjExZCwlcjEzZAorCWFkZGwJJWVkaSwlcjEyZAorCW1vdmwJJWVkeCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklZWF4LCVlZGkKKworCXhvcmwJJXIxMWQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWJ4LCVlZGkKKworCW1vdmwJJXIxMmQsNTIoJXJzcCkKKwl4b3JsCSVlZHgsJXIxNGQKKwlhbmRsCSVyMTFkLCVlZGkKKworCXJvcmwJJDUsJXIxM2QKKwlhZGRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlYngsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisKKwltb3ZsCSVlZHgsJWVkaQorCWFkZGwJKCVyYnApLCVyMTJkCisJeG9ybAklZWR4LCVyMTRkCisKKwl4b3JsCSVyOGQsJWVkaQorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVyOGQsJWVjeAorCisJYW5kbAklZWRpLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJXIxNWQsJWVjeAorCWFkZGwJJXIxMmQsJXIxMGQKKwlhZGRsCSVyMTJkLCVlY3gKKworCWxlYXEJNCglcmJwKSwlcmJwCisJbW92bAk2MCglcnNwKSwlcjEzZAorCW1vdmwJNDgoJXJzcCksJXIxNWQKKworCW1vdmwJJXIxM2QsJXIxMmQKKwlyb3JsCSQxMSwlcjEzZAorCWFkZGwJJXIxNGQsJWVjeAorCW1vdmwJJXIxNWQsJXIxNGQKKwlyb3JsCSQyLCVyMTVkCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVyMTVkCisJc2hybAkkMTAsJXIxNGQKKworCXJvcmwJJDE3LCVyMTVkCisJeG9ybAklcjEzZCwlcjEyZAorCXhvcmwJJXIxNGQsJXIxNWQKKwlhZGRsCTI4KCVyc3ApLCVyMTJkCisKKwlhZGRsCTU2KCVyc3ApLCVyMTJkCisJbW92bAklcjEwZCwlcjEzZAorCWFkZGwJJXIxNWQsJXIxMmQKKwltb3ZsCSVlY3gsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxMWQsJXIxNWQKKworCXhvcmwJJXIxMGQsJXIxM2QKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWF4LCVyMTVkCisKKwltb3ZsCSVyMTJkLDU2KCVyc3ApCisJeG9ybAklZWN4LCVyMTRkCisJYW5kbAklcjEwZCwlcjE1ZAorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVieCwlcjEyZAorCXhvcmwJJWVheCwlcjE1ZAorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAklcjE1ZCwlcjEyZAorCisJbW92bAklZWN4LCVyMTVkCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlY3gsJXIxNGQKKworCXhvcmwJJWVkeCwlcjE1ZAorCXJvcmwJJDYsJXIxM2QKKwltb3ZsCSVlZHgsJWVieAorCisJYW5kbAklcjE1ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMmQKKworCXhvcmwJJWVkaSwlZWJ4CisJYWRkbAklcjEyZCwlcjlkCisJYWRkbAklcjEyZCwlZWJ4CisKKwlsZWFxCTQoJXJicCksJXJicAorCW1vdmwJMCglcnNwKSwlcjEzZAorCW1vdmwJNTIoJXJzcCksJWVkaQorCisJbW92bAklcjEzZCwlcjEyZAorCXJvcmwJJDExLCVyMTNkCisJYWRkbAklcjE0ZCwlZWJ4CisJbW92bAklZWRpLCVyMTRkCisJcm9ybAkkMiwlZWRpCisKKwl4b3JsCSVyMTJkLCVyMTNkCisJc2hybAkkMywlcjEyZAorCXJvcmwJJDcsJXIxM2QKKwl4b3JsCSVyMTRkLCVlZGkKKwlzaHJsCSQxMCwlcjE0ZAorCisJcm9ybAkkMTcsJWVkaQorCXhvcmwJJXIxM2QsJXIxMmQKKwl4b3JsCSVyMTRkLCVlZGkKKwlhZGRsCTMyKCVyc3ApLCVyMTJkCisKKwlhZGRsCTYwKCVyc3ApLCVyMTJkCisJbW92bAklcjlkLCVyMTNkCisJYWRkbAklZWRpLCVyMTJkCisJbW92bAklZWJ4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTBkLCVlZGkKKworCXhvcmwJJXI5ZCwlcjEzZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTFkLCVlZGkKKworCW1vdmwJJXIxMmQsNjAoJXJzcCkKKwl4b3JsCSVlYngsJXIxNGQKKwlhbmRsCSVyOWQsJWVkaQorCisJcm9ybAkkNSwlcjEzZAorCWFkZGwJJWVheCwlcjEyZAorCXhvcmwJJXIxMWQsJWVkaQorCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwlhZGRsCSVlZGksJXIxMmQKKworCW1vdmwJJWVieCwlZWRpCisJYWRkbAkoJXJicCksJXIxMmQKKwl4b3JsCSVlYngsJXIxNGQKKworCXhvcmwJJWVjeCwlZWRpCisJcm9ybAkkNiwlcjEzZAorCW1vdmwJJWVjeCwlZWF4CisKKwlhbmRsCSVlZGksJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEzZCwlcjEyZAorCisJeG9ybAklcjE1ZCwlZWF4CisJYWRkbAklcjEyZCwlcjhkCisJYWRkbAklcjEyZCwlZWF4CisKKwlsZWFxCTIwKCVyYnApLCVyYnAKKwljbXBiCSQwLDMoJXJicCkKKwlqbnoJTCRyb3VuZHNfMTZfeHgKKworCW1vdnEJNjQrMCglcnNwKSwlcmRpCisJYWRkbAklcjE0ZCwlZWF4CisJbGVhcQk2NCglcnNpKSwlcnNpCisKKwlhZGRsCTAoJXJkaSksJWVheAorCWFkZGwJNCglcmRpKSwlZWJ4CisJYWRkbAk4KCVyZGkpLCVlY3gKKwlhZGRsCTEyKCVyZGkpLCVlZHgKKwlhZGRsCTE2KCVyZGkpLCVyOGQKKwlhZGRsCTIwKCVyZGkpLCVyOWQKKwlhZGRsCTI0KCVyZGkpLCVyMTBkCisJYWRkbAkyOCglcmRpKSwlcjExZAorCisJY21wcQk2NCsxNiglcnNwKSwlcnNpCisKKwltb3ZsCSVlYXgsMCglcmRpKQorCW1vdmwJJWVieCw0KCVyZGkpCisJbW92bAklZWN4LDgoJXJkaSkKKwltb3ZsCSVlZHgsMTIoJXJkaSkKKwltb3ZsCSVyOGQsMTYoJXJkaSkKKwltb3ZsCSVyOWQsMjAoJXJkaSkKKwltb3ZsCSVyMTBkLDI0KCVyZGkpCisJbW92bAklcjExZCwyOCglcmRpKQorCWpiCUwkbG9vcAorCisJbW92cQk4OCglcnNwKSwlcnNpCisKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRlcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk2CisKK0syNTY6CisubG9uZwkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisubG9uZwkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisubG9uZwkweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1CisubG9uZwkweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1CisubG9uZwkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzCisubG9uZwkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzCisubG9uZwkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisubG9uZwkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisubG9uZwkweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjCisubG9uZwkweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjCisubG9uZwkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhCisubG9uZwkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhCisubG9uZwkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisubG9uZwkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisubG9uZwkweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3CisubG9uZwkweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3CisubG9uZwkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzCisubG9uZwkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzCisubG9uZwkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisubG9uZwkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisubG9uZwkweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzCisubG9uZwkweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzCisubG9uZwkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwCisubG9uZwkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwCisubG9uZwkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisubG9uZwkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisubG9uZwkweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzCisubG9uZwkweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzCisubG9uZwkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4CisubG9uZwkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4CisubG9uZwkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisubG9uZwkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5sb25nCTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKy5sb25nCTB4MDMwMjAxMDAsMHgwYjBhMDkwOCwweGZmZmZmZmZmLDB4ZmZmZmZmZmYKKy5sb25nCTB4MDMwMjAxMDAsMHgwYjBhMDkwOCwweGZmZmZmZmZmLDB4ZmZmZmZmZmYKKy5sb25nCTB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweDAzMDIwMTAwLDB4MGIwYTA5MDgKKy5sb25nCTB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweDAzMDIwMTAwLDB4MGIwYTA5MDgKKy5ieXRlCTgzLDcyLDY1LDUwLDUzLDU0LDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcsMTEwLDExNSwxMDIsMTExLDExNCwxMDksMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKworLnAyYWxpZ24JNgorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTM6CisKK0wkc3NzZTNfc2hvcnRjdXQ6CisJbW92cQklcnNwLCVyYXgKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXNobHEJJDQsJXJkeAorCXN1YnEJJDk2LCVyc3AKKwlsZWFxCSglcnNpLCVyZHgsNCksJXJkeAorCWFuZHEJJC02NCwlcnNwCisJbW92cQklcmRpLDY0KzAoJXJzcCkKKwltb3ZxCSVyc2ksNjQrOCglcnNwKQorCW1vdnEJJXJkeCw2NCsxNiglcnNwKQorCW1vdnEJJXJheCw4OCglcnNwKQorCitMJHByb2xvZ3VlX3Nzc2UzOgorCisJbW92bAkwKCVyZGkpLCVlYXgKKwltb3ZsCTQoJXJkaSksJWVieAorCW1vdmwJOCglcmRpKSwlZWN4CisJbW92bAkxMiglcmRpKSwlZWR4CisJbW92bAkxNiglcmRpKSwlcjhkCisJbW92bAkyMCglcmRpKSwlcjlkCisJbW92bAkyNCglcmRpKSwlcjEwZAorCW1vdmwJMjgoJXJkaSksJXIxMWQKKworCisJam1wCUwkbG9vcF9zc3NlMworLnAyYWxpZ24JNAorTCRsb29wX3Nzc2UzOgorCW1vdmRxYQlLMjU2KzUxMiglcmlwKSwleG1tNworCW1vdmRxdQkwKCVyc2kpLCV4bW0wCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0xCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTkKKwltb3ZkcXUJNDgoJXJzaSksJXhtbTMKKwlsZWFxCUsyNTYoJXJpcCksJXJicAorLmJ5dGUJMTAyLDE1LDU2LDAsMjA3CisJbW92ZHFhCTAoJXJicCksJXhtbTQKKwltb3ZkcWEJMzIoJXJicCksJXhtbTUKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNQorCXBhZGRkCSV4bW0wLCV4bW00CisJbW92ZHFhCTY0KCVyYnApLCV4bW02CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjMKKwltb3ZkcWEJOTYoJXJicCksJXhtbTcKKwlwYWRkZAkleG1tMSwleG1tNQorCXBhZGRkCSV4bW0yLCV4bW02CisJcGFkZGQJJXhtbTMsJXhtbTcKKwltb3ZkcWEJJXhtbTQsMCglcnNwKQorCW1vdmwJJWVheCwlcjE0ZAorCW1vdmRxYQkleG1tNSwxNiglcnNwKQorCW1vdmwJJWVieCwlZWRpCisJbW92ZHFhCSV4bW02LDMyKCVyc3ApCisJeG9ybAklZWN4LCVlZGkKKwltb3ZkcWEJJXhtbTcsNDgoJXJzcCkKKwltb3ZsCSVyOGQsJXIxM2QKKwlqbXAJTCRzc3NlM18wMF80NworCisucDJhbGlnbgk0CitMJHNzc2UzXzAwXzQ3OgorCXN1YnEJJC0xMjgsJXJicAorCXJvcmwJJDE0LCVyMTNkCisJbW92ZHFhCSV4bW0xLCV4bW00CisJbW92bAklcjE0ZCwlZWF4CisJbW92bAklcjlkLCVyMTJkCisJbW92ZHFhCSV4bW0zLCV4bW03CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklZWF4LCVyMTRkCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI0LDQKKwlhbmRsCSVyOGQsJXIxMmQKKwl4b3JsCSVyOGQsJXIxM2QKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTAsNAorCWFkZGwJMCglcnNwKSwlcjExZAorCW1vdmwJJWVheCwlcjE1ZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCW1vdmRxYQkleG1tNCwleG1tNQorCXhvcmwJJWVieCwlcjE1ZAorCWFkZGwJJXIxMmQsJXIxMWQKKwltb3ZkcWEJJXhtbTQsJXhtbTYKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJcHNybGQJJDMsJXhtbTQKKwl4b3JsCSVlYXgsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTFkCisJeG9ybAklZWJ4LCVlZGkKKwlwYWRkZAkleG1tNywleG1tMAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlwc3JsZAkkNywleG1tNgorCWFkZGwJJWVkaSwlcjExZAorCW1vdmwJJWVkeCwlcjEzZAorCXBzaHVmZAkkMjUwLCV4bW0zLCV4bW03CisJYWRkbAklcjExZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJcHNsbGQJJDE0LCV4bW01CisJbW92bAklcjE0ZCwlcjExZAorCW1vdmwJJXI4ZCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWR4LCVyMTNkCisJeG9ybAklcjlkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXBzcmxkCSQxMSwleG1tNgorCXhvcmwJJXIxMWQsJXIxNGQKKwlweG9yCSV4bW01LCV4bW00CisJYW5kbAklZWR4LCVyMTJkCisJeG9ybAklZWR4LCVyMTNkCisJcHNsbGQJJDExLCV4bW01CisJYWRkbAk0KCVyc3ApLCVyMTBkCisJbW92bAklcjExZCwlZWRpCisJcHhvcgkleG1tNiwleG1tNAorCXhvcmwJJXI5ZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVyMTJkLCVyMTBkCisJcHhvcgkleG1tNSwleG1tNAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyMTFkLCVyMTRkCisJcHNybGQJJDEwLCV4bW03CisJYWRkbAklcjEzZCwlcjEwZAorCXhvcmwJJWVheCwlcjE1ZAorCXBhZGRkCSV4bW00LCV4bW0wCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxMGQsJWVjeAorCXBzcmxxCSQxNywleG1tNgorCWFkZGwJJXIxNWQsJXIxMGQKKwltb3ZsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTBkLCVyMTRkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlcjEwZAorCW1vdmwJJWVkeCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwlwc3JscQkkMiwleG1tNgorCXhvcmwJJWVjeCwlcjEzZAorCXhvcmwJJXI4ZCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTcKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjEwZCwlcjE0ZAorCWFuZGwJJWVjeCwlcjEyZAorCXBzaHVmZAkkMTI4LCV4bW03LCV4bW03CisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAk4KCVyc3ApLCVyOWQKKwltb3ZsCSVyMTBkLCVyMTVkCisJcHNybGRxCSQ4LCV4bW03CisJeG9ybAklcjhkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTVkCisJYWRkbAklcjEyZCwlcjlkCisJcm9ybAkkNiwlcjEzZAorCXBhZGRkCSV4bW03LCV4bW0wCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjEwZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI5ZAorCXBzaHVmZAkkODAsJXhtbTAsJXhtbTcKKwl4b3JsCSVyMTFkLCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjlkLCVlYngKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlhZGRsCSVlZGksJXI5ZAorCW1vdmwJJWVieCwlcjEzZAorCXBzcmxkCSQxMCwleG1tNworCWFkZGwJJXI5ZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJcHNybHEJJDE3LCV4bW02CisJbW92bAklcjE0ZCwlcjlkCisJbW92bAklZWN4LCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYngsJXIxM2QKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjlkLCVyMTRkCisJcHNybHEJJDIsJXhtbTYKKwlhbmRsCSVlYngsJXIxMmQKKwl4b3JsCSVlYngsJXIxM2QKKwlhZGRsCTEyKCVyc3ApLCVyOGQKKwlweG9yCSV4bW02LCV4bW03CisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXBzaHVmZAkkOCwleG1tNywleG1tNworCXhvcmwJJXIxMGQsJWVkaQorCWFkZGwJJXIxMmQsJXI4ZAorCW1vdmRxYQkwKCVyYnApLCV4bW02CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXBzbGxkcQkkOCwleG1tNworCXhvcmwJJXI5ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI4ZAorCXhvcmwJJXIxMGQsJXIxNWQKKwlwYWRkZAkleG1tNywleG1tMAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyOGQsJWVheAorCWFkZGwJJXIxNWQsJXI4ZAorCXBhZGRkCSV4bW0wLCV4bW02CisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjhkLCVyMTRkCisJbW92ZHFhCSV4bW02LDAoJXJzcCkKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmRxYQkleG1tMiwleG1tNAorCW1vdmwJJXIxNGQsJXI4ZAorCW1vdmwJJWVieCwlcjEyZAorCW1vdmRxYQkleG1tMCwleG1tNworCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYXgsJXIxM2QKKwl4b3JsCSVlY3gsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjhkLCVyMTRkCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI1LDQKKwlhbmRsCSVlYXgsJXIxMmQKKwl4b3JsCSVlYXgsJXIxM2QKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNTEsNAorCWFkZGwJMTYoJXJzcCksJWVkeAorCW1vdmwJJXI4ZCwlcjE1ZAorCXhvcmwJJWVjeCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJbW92ZHFhCSV4bW00LCV4bW01CisJeG9ybAklcjlkLCVyMTVkCisJYWRkbAklcjEyZCwlZWR4CisJbW92ZHFhCSV4bW00LCV4bW02CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXBzcmxkCSQzLCV4bW00CisJeG9ybAklcjhkLCVyMTRkCisJYWRkbAklcjEzZCwlZWR4CisJeG9ybAklcjlkLCVlZGkKKwlwYWRkZAkleG1tNywleG1tMQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlZHgsJXIxMWQKKwlwc3JsZAkkNywleG1tNgorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklcjExZCwlcjEzZAorCXBzaHVmZAkkMjUwLCV4bW0wLCV4bW03CisJYWRkbAklZWR4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwlwc2xsZAkkMTQsJXhtbTUKKwltb3ZsCSVyMTRkLCVlZHgKKwltb3ZsCSVlYXgsJXIxMmQKKwlweG9yCSV4bW02LCV4bW00CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxM2QKKwl4b3JsCSVlYngsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJcHNybGQJJDExLCV4bW02CisJeG9ybAklZWR4LCVyMTRkCisJcHhvcgkleG1tNSwleG1tNAorCWFuZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTNkCisJcHNsbGQJJDExLCV4bW01CisJYWRkbAkyMCglcnNwKSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwlweG9yCSV4bW02LCV4bW00CisJeG9ybAklZWJ4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwl4b3JsCSVyOGQsJWVkaQorCWFkZGwJJXIxMmQsJWVjeAorCXB4b3IJJXhtbTUsJXhtbTQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWR4LCVyMTRkCisJcHNybGQJJDEwLCV4bW03CisJYWRkbAklcjEzZCwlZWN4CisJeG9ybAklcjhkLCVyMTVkCisJcGFkZGQJJXhtbTQsJXhtbTEKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWN4LCVyMTBkCisJcHNybHEJJDE3LCV4bW02CisJYWRkbAklcjE1ZCwlZWN4CisJbW92bAklcjEwZCwlcjEzZAorCWFkZGwJJWVjeCwlcjE0ZAorCXB4b3IJJXhtbTYsJXhtbTcKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVjeAorCW1vdmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJcHNybHEJJDIsJXhtbTYKKwl4b3JsCSVyMTBkLCVyMTNkCisJeG9ybAklZWF4LCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTJkCisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAkyNCglcnNwKSwlZWJ4CisJbW92bAklZWN4LCVyMTVkCisJcHNybGRxCSQ4LCV4bW03CisJeG9ybAklZWF4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxNWQKKwlhZGRsCSVyMTJkLCVlYngKKwlyb3JsCSQ2LCVyMTNkCisJcGFkZGQJJXhtbTcsJXhtbTEKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYngKKwlwc2h1ZmQJJDgwLCV4bW0xLCV4bW03CisJeG9ybAklZWR4LCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWJ4LCVyOWQKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJXI5ZCwlcjEzZAorCXBzcmxkCSQxMCwleG1tNworCWFkZGwJJWVieCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJcHNybHEJJDE3LCV4bW02CisJbW92bAklcjE0ZCwlZWJ4CisJbW92bAklcjEwZCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTcKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJeG9ybAklcjExZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlYngsJXIxNGQKKwlwc3JscQkkMiwleG1tNgorCWFuZGwJJXI5ZCwlcjEyZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJMjgoJXJzcCksJWVheAorCXB4b3IJJXhtbTYsJXhtbTcKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXBzaHVmZAkkOCwleG1tNywleG1tNworCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklcjEyZCwlZWF4CisJbW92ZHFhCTMyKCVyYnApLCV4bW02CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXBzbGxkcQkkOCwleG1tNworCXhvcmwJJWVieCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVheAorCXhvcmwJJWVjeCwlcjE1ZAorCXBhZGRkCSV4bW03LCV4bW0xCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVheCwlcjhkCisJYWRkbAklcjE1ZCwlZWF4CisJcGFkZGQJJXhtbTEsJXhtbTYKKwltb3ZsCSVyOGQsJXIxM2QKKwlhZGRsCSVlYXgsJXIxNGQKKwltb3ZkcWEJJXhtbTYsMTYoJXJzcCkKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmRxYQkleG1tMywleG1tNAorCW1vdmwJJXIxNGQsJWVheAorCW1vdmwJJXI5ZCwlcjEyZAorCW1vdmRxYQkleG1tMSwleG1tNworCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOGQsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVheCwlcjE0ZAorLmJ5dGUJMTAyLDE1LDU4LDE1LDIyNiw0CisJYW5kbAklcjhkLCVyMTJkCisJeG9ybAklcjhkLCVyMTNkCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjQ4LDQKKwlhZGRsCTMyKCVyc3ApLCVyMTFkCisJbW92bAklZWF4LCVyMTVkCisJeG9ybAklcjEwZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJbW92ZHFhCSV4bW00LCV4bW01CisJeG9ybAklZWJ4LCVyMTVkCisJYWRkbAklcjEyZCwlcjExZAorCW1vdmRxYQkleG1tNCwleG1tNgorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwlwc3JsZAkkMywleG1tNAorCXhvcmwJJWVheCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMWQKKwl4b3JsCSVlYngsJWVkaQorCXBhZGRkCSV4bW03LCV4bW0yCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCXBzcmxkCSQ3LCV4bW02CisJYWRkbAklZWRpLCVyMTFkCisJbW92bAklZWR4LCVyMTNkCisJcHNodWZkCSQyNTAsJXhtbTEsJXhtbTcKKwlhZGRsCSVyMTFkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwlwc2xsZAkkMTQsJXhtbTUKKwltb3ZsCSVyMTRkLCVyMTFkCisJbW92bAklcjhkLCVyMTJkCisJcHhvcgkleG1tNiwleG1tNAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwl4b3JsCSVyOWQsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJcHNybGQJJDExLCV4bW02CisJeG9ybAklcjExZCwlcjE0ZAorCXB4b3IJJXhtbTUsJXhtbTQKKwlhbmRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlZHgsJXIxM2QKKwlwc2xsZAkkMTEsJXhtbTUKKwlhZGRsCTM2KCVyc3ApLCVyMTBkCisJbW92bAklcjExZCwlZWRpCisJcHhvcgkleG1tNiwleG1tNAorCXhvcmwJJXI5ZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJbW92ZHFhCSV4bW03LCV4bW02CisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVyMTJkLCVyMTBkCisJcHhvcgkleG1tNSwleG1tNAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyMTFkLCVyMTRkCisJcHNybGQJJDEwLCV4bW03CisJYWRkbAklcjEzZCwlcjEwZAorCXhvcmwJJWVheCwlcjE1ZAorCXBhZGRkCSV4bW00LCV4bW0yCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxMGQsJWVjeAorCXBzcmxxCSQxNywleG1tNgorCWFkZGwJJXIxNWQsJXIxMGQKKwltb3ZsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTBkLCVyMTRkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlcjEwZAorCW1vdmwJJWVkeCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwlwc3JscQkkMiwleG1tNgorCXhvcmwJJWVjeCwlcjEzZAorCXhvcmwJJXI4ZCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTcKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjEwZCwlcjE0ZAorCWFuZGwJJWVjeCwlcjEyZAorCXBzaHVmZAkkMTI4LCV4bW03LCV4bW03CisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAk0MCglcnNwKSwlcjlkCisJbW92bAklcjEwZCwlcjE1ZAorCXBzcmxkcQkkOCwleG1tNworCXhvcmwJJXI4ZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjExZCwlcjE1ZAorCWFkZGwJJXIxMmQsJXI5ZAorCXJvcmwJJDYsJXIxM2QKKwlwYWRkZAkleG1tNywleG1tMgorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOWQKKwlwc2h1ZmQJJDgwLCV4bW0yLCV4bW03CisJeG9ybAklcjExZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXI5ZCwlZWJ4CisJbW92ZHFhCSV4bW03LCV4bW02CisJYWRkbAklZWRpLCVyOWQKKwltb3ZsCSVlYngsJXIxM2QKKwlwc3JsZAkkMTAsJXhtbTcKKwlhZGRsCSVyOWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCXBzcmxxCSQxNywleG1tNgorCW1vdmwJJXIxNGQsJXI5ZAorCW1vdmwJJWVjeCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTcKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJeG9ybAklZWR4LCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXI5ZCwlcjE0ZAorCXBzcmxxCSQyLCV4bW02CisJYW5kbAklZWJ4LCVyMTJkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAk0NCglcnNwKSwlcjhkCisJcHhvcgkleG1tNiwleG1tNworCW1vdmwJJXI5ZCwlZWRpCisJeG9ybAklZWR4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwlwc2h1ZmQJJDgsJXhtbTcsJXhtbTcKKwl4b3JsCSVyMTBkLCVlZGkKKwlhZGRsCSVyMTJkLCVyOGQKKwltb3ZkcWEJNjQoJXJicCksJXhtbTYKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJcHNsbGRxCSQ4LCV4bW03CisJeG9ybAklcjlkLCVyMTRkCisJYWRkbAklcjEzZCwlcjhkCisJeG9ybAklcjEwZCwlcjE1ZAorCXBhZGRkCSV4bW03LCV4bW0yCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJcGFkZGQJJXhtbTIsJXhtbTYKKwltb3ZsCSVlYXgsJXIxM2QKKwlhZGRsCSVyOGQsJXIxNGQKKwltb3ZkcWEJJXhtbTYsMzIoJXJzcCkKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmRxYQkleG1tMCwleG1tNAorCW1vdmwJJXIxNGQsJXI4ZAorCW1vdmwJJWVieCwlcjEyZAorCW1vdmRxYQkleG1tMiwleG1tNworCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYXgsJXIxM2QKKwl4b3JsCSVlY3gsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjhkLCVyMTRkCisuYnl0ZQkxMDIsMTUsNTgsMTUsMjI3LDQKKwlhbmRsCSVlYXgsJXIxMmQKKwl4b3JsCSVlYXgsJXIxM2QKKy5ieXRlCTEwMiwxNSw1OCwxNSwyNDksNAorCWFkZGwJNDgoJXJzcCksJWVkeAorCW1vdmwJJXI4ZCwlcjE1ZAorCXhvcmwJJWVjeCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJbW92ZHFhCSV4bW00LCV4bW01CisJeG9ybAklcjlkLCVyMTVkCisJYWRkbAklcjEyZCwlZWR4CisJbW92ZHFhCSV4bW00LCV4bW02CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXBzcmxkCSQzLCV4bW00CisJeG9ybAklcjhkLCVyMTRkCisJYWRkbAklcjEzZCwlZWR4CisJeG9ybAklcjlkLCVlZGkKKwlwYWRkZAkleG1tNywleG1tMworCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlZHgsJXIxMWQKKwlwc3JsZAkkNywleG1tNgorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklcjExZCwlcjEzZAorCXBzaHVmZAkkMjUwLCV4bW0yLCV4bW03CisJYWRkbAklZWR4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwlwc2xsZAkkMTQsJXhtbTUKKwltb3ZsCSVyMTRkLCVlZHgKKwltb3ZsCSVlYXgsJXIxMmQKKwlweG9yCSV4bW02LCV4bW00CisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxM2QKKwl4b3JsCSVlYngsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJcHNybGQJJDExLCV4bW02CisJeG9ybAklZWR4LCVyMTRkCisJcHhvcgkleG1tNSwleG1tNAorCWFuZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTNkCisJcHNsbGQJJDExLCV4bW01CisJYWRkbAk1MiglcnNwKSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwlweG9yCSV4bW02LCV4bW00CisJeG9ybAklZWJ4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwl4b3JsCSVyOGQsJWVkaQorCWFkZGwJJXIxMmQsJWVjeAorCXB4b3IJJXhtbTUsJXhtbTQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWR4LCVyMTRkCisJcHNybGQJJDEwLCV4bW03CisJYWRkbAklcjEzZCwlZWN4CisJeG9ybAklcjhkLCVyMTVkCisJcGFkZGQJJXhtbTQsJXhtbTMKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWN4LCVyMTBkCisJcHNybHEJJDE3LCV4bW02CisJYWRkbAklcjE1ZCwlZWN4CisJbW92bAklcjEwZCwlcjEzZAorCWFkZGwJJWVjeCwlcjE0ZAorCXB4b3IJJXhtbTYsJXhtbTcKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVjeAorCW1vdmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJcHNybHEJJDIsJXhtbTYKKwl4b3JsCSVyMTBkLCVyMTNkCisJeG9ybAklZWF4LCVyMTJkCisJcHhvcgkleG1tNiwleG1tNworCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTJkCisJcHNodWZkCSQxMjgsJXhtbTcsJXhtbTcKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAk1NiglcnNwKSwlZWJ4CisJbW92bAklZWN4LCVyMTVkCisJcHNybGRxCSQ4LCV4bW03CisJeG9ybAklZWF4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlZHgsJXIxNWQKKwlhZGRsCSVyMTJkLCVlYngKKwlyb3JsCSQ2LCVyMTNkCisJcGFkZGQJJXhtbTcsJXhtbTMKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYngKKwlwc2h1ZmQJJDgwLCV4bW0zLCV4bW03CisJeG9ybAklZWR4LCVlZGkKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWJ4LCVyOWQKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJXI5ZCwlcjEzZAorCXBzcmxkCSQxMCwleG1tNworCWFkZGwJJWVieCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJcHNybHEJJDE3LCV4bW02CisJbW92bAklcjE0ZCwlZWJ4CisJbW92bAklcjEwZCwlcjEyZAorCXB4b3IJJXhtbTYsJXhtbTcKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJeG9ybAklcjExZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlYngsJXIxNGQKKwlwc3JscQkkMiwleG1tNgorCWFuZGwJJXI5ZCwlcjEyZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJNjAoJXJzcCksJWVheAorCXB4b3IJJXhtbTYsJXhtbTcKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXBzaHVmZAkkOCwleG1tNywleG1tNworCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklcjEyZCwlZWF4CisJbW92ZHFhCTk2KCVyYnApLCV4bW02CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXBzbGxkcQkkOCwleG1tNworCXhvcmwJJWVieCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVheAorCXhvcmwJJWVjeCwlcjE1ZAorCXBhZGRkCSV4bW03LCV4bW0zCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVheCwlcjhkCisJYWRkbAklcjE1ZCwlZWF4CisJcGFkZGQJJXhtbTMsJXhtbTYKKwltb3ZsCSVyOGQsJXIxM2QKKwlhZGRsCSVlYXgsJXIxNGQKKwltb3ZkcWEJJXhtbTYsNDgoJXJzcCkKKwljbXBiCSQwLDEzMSglcmJwKQorCWpuZQlMJHNzc2UzXzAwXzQ3CisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYXgKKwltb3ZsCSVyOWQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJeG9ybAklcjEwZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlYXgsJXIxNGQKKwlhbmRsCSVyOGQsJXIxMmQKKwl4b3JsCSVyOGQsJXIxM2QKKwlhZGRsCTAoJXJzcCksJXIxMWQKKwltb3ZsCSVlYXgsJXIxNWQKKwl4b3JsCSVyMTBkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlYngsJXIxNWQKKwlhZGRsCSVyMTJkLCVyMTFkCisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVheCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMWQKKwl4b3JsCSVlYngsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlhZGRsCSVlZGksJXIxMWQKKwltb3ZsCSVlZHgsJXIxM2QKKwlhZGRsCSVyMTFkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTFkCisJbW92bAklcjhkLCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVkeCwlcjEzZAorCXhvcmwJJXI5ZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTRkCisJYW5kbAklZWR4LCVyMTJkCisJeG9ybAklZWR4LCVyMTNkCisJYWRkbAk0KCVyc3ApLCVyMTBkCisJbW92bAklcjExZCwlZWRpCisJeG9ybAklcjlkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJXIxMmQsJXIxMGQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjExZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMGQKKwl4b3JsCSVlYXgsJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklcjEwZCwlZWN4CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxMGQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJXIxMGQKKwltb3ZsCSVlZHgsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWN4LCVyMTNkCisJeG9ybAklcjhkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXIxMGQsJXIxNGQKKwlhbmRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTgoJXJzcCksJXI5ZAorCW1vdmwJJXIxMGQsJXIxNWQKKwl4b3JsCSVyOGQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVyOWQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjEwZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI5ZAorCXhvcmwJJXIxMWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyOWQsJWVieAorCWFkZGwJJWVkaSwlcjlkCisJbW92bAklZWJ4LCVyMTNkCisJYWRkbAklcjlkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOWQKKwltb3ZsCSVlY3gsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJeG9ybAklZWR4LCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFuZGwJJWVieCwlcjEyZAorCXhvcmwJJWVieCwlcjEzZAorCWFkZGwJMTIoJXJzcCksJXI4ZAorCW1vdmwJJXI5ZCwlZWRpCisJeG9ybAklZWR4LCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVyMTBkLCVlZGkKKwlhZGRsCSVyMTJkLCVyOGQKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjlkLCVyMTRkCisJYWRkbAklcjEzZCwlcjhkCisJeG9ybAklcjEwZCwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyOGQsJWVheAorCWFkZGwJJXIxNWQsJXI4ZAorCW1vdmwJJWVheCwlcjEzZAorCWFkZGwJJXI4ZCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlcjhkCisJbW92bAklZWJ4LCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCXhvcmwJJWVjeCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxMmQKKwl4b3JsCSVlYXgsJXIxM2QKKwlhZGRsCTE2KCVyc3ApLCVlZHgKKwltb3ZsCSVyOGQsJXIxNWQKKwl4b3JsCSVlY3gsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI5ZCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVkeAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVyOGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVlZHgKKwl4b3JsCSVyOWQsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZGksJWVkeAorCW1vdmwJJXIxMWQsJXIxM2QKKwlhZGRsCSVlZHgsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVkeAorCW1vdmwJJWVheCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTNkCisJeG9ybAklZWJ4LCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVkeCwlcjE0ZAorCWFuZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTNkCisJYWRkbAkyMCglcnNwKSwlZWN4CisJbW92bAklZWR4LCVlZGkKKwl4b3JsCSVlYngsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXI4ZCwlZWRpCisJYWRkbAklcjEyZCwlZWN4CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVkeCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVjeAorCXhvcmwJJXI4ZCwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlY3gsJXIxMGQKKwlhZGRsCSVyMTVkLCVlY3gKKwltb3ZsCSVyMTBkLCVyMTNkCisJYWRkbAklZWN4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVlY3gKKwltb3ZsCSVyMTFkLCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMGQsJXIxM2QKKwl4b3JsCSVlYXgsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklZWN4LCVyMTRkCisJYW5kbAklcjEwZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCTI0KCVyc3ApLCVlYngKKwltb3ZsCSVlY3gsJXIxNWQKKwl4b3JsCSVlYXgsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVkeCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVieAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYngKKwl4b3JsCSVlZHgsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlYngsJXI5ZAorCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklcjlkLCVyMTNkCisJYWRkbAklZWJ4LCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYngKKwltb3ZsCSVyMTBkLCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCXhvcmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklZWJ4LCVyMTRkCisJYW5kbAklcjlkLCVyMTJkCisJeG9ybAklcjlkLCVyMTNkCisJYWRkbAkyOCglcnNwKSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwl4b3JsCSVyMTFkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJXIxMmQsJWVheAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlYngsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYXgKKwl4b3JsCSVlY3gsJXIxNWQKKwlyb3JsCSQyLCVyMTRkCisJYWRkbAklZWF4LCVyOGQKKwlhZGRsCSVyMTVkLCVlYXgKKwltb3ZsCSVyOGQsJXIxM2QKKwlhZGRsCSVlYXgsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVheAorCW1vdmwJJXI5ZCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVyOGQsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJWVheCwlcjE0ZAorCWFuZGwJJXI4ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjEzZAorCWFkZGwJMzIoJXJzcCksJXIxMWQKKwltb3ZsCSVlYXgsJXIxNWQKKwl4b3JsCSVyMTBkLCVyMTJkCisJcm9ybAkkMTEsJXIxNGQKKwl4b3JsCSVlYngsJXIxNWQKKwlhZGRsCSVyMTJkLCVyMTFkCisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVheCwlcjE0ZAorCWFkZGwJJXIxM2QsJXIxMWQKKwl4b3JsCSVlYngsJWVkaQorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlhZGRsCSVlZGksJXIxMWQKKwltb3ZsCSVlZHgsJXIxM2QKKwlhZGRsCSVyMTFkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTFkCisJbW92bAklcjhkLCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVkeCwlcjEzZAorCXhvcmwJJXI5ZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTRkCisJYW5kbAklZWR4LCVyMTJkCisJeG9ybAklZWR4LCVyMTNkCisJYWRkbAkzNiglcnNwKSwlcjEwZAorCW1vdmwJJXIxMWQsJWVkaQorCXhvcmwJJXI5ZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVyMTJkLCVyMTBkCisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTBkCisJeG9ybAklZWF4LCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXIxMGQsJWVjeAorCWFkZGwJJXIxNWQsJXIxMGQKKwltb3ZsCSVlY3gsJXIxM2QKKwlhZGRsCSVyMTBkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTBkCisJbW92bAklZWR4LCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJWVjeCwlcjEzZAorCXhvcmwJJXI4ZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTRkCisJYW5kbAklZWN4LCVyMTJkCisJeG9ybAklZWN4LCVyMTNkCisJYWRkbAk0MCglcnNwKSwlcjlkCisJbW92bAklcjEwZCwlcjE1ZAorCXhvcmwJJXI4ZCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjExZCwlcjE1ZAorCWFkZGwJJXIxMmQsJXI5ZAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVyMTBkLCVyMTRkCisJYWRkbAklcjEzZCwlcjlkCisJeG9ybAklcjExZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXI5ZCwlZWJ4CisJYWRkbAklZWRpLCVyOWQKKwltb3ZsCSVlYngsJXIxM2QKKwlhZGRsCSVyOWQsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJXI5ZAorCW1vdmwJJWVjeCwlcjEyZAorCXJvcmwJJDksJXIxNGQKKwl4b3JsCSVlYngsJXIxM2QKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklcjlkLCVyMTRkCisJYW5kbAklZWJ4LCVyMTJkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAk0NCglcnNwKSwlcjhkCisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJXIxMGQsJWVkaQorCWFkZGwJJXIxMmQsJXI4ZAorCXJvcmwJJDYsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyOWQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOGQKKwl4b3JsCSVyMTBkLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjhkLCVyMTRkCisJcm9ybAkkMTQsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOGQKKwltb3ZsCSVlYngsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJeG9ybAklZWN4LCVyMTJkCisJcm9ybAkkNSwlcjEzZAorCXhvcmwJJXI4ZCwlcjE0ZAorCWFuZGwJJWVheCwlcjEyZAorCXhvcmwJJWVheCwlcjEzZAorCWFkZGwJNDgoJXJzcCksJWVkeAorCW1vdmwJJXI4ZCwlcjE1ZAorCXhvcmwJJWVjeCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjlkLCVyMTVkCisJYWRkbAklcjEyZCwlZWR4CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXI4ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVkeAorCXhvcmwJJXI5ZCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVkeCwlcjExZAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklcjExZCwlcjEzZAorCWFkZGwJJWVkeCwlcjE0ZAorCXJvcmwJJDE0LCVyMTNkCisJbW92bAklcjE0ZCwlZWR4CisJbW92bAklZWF4LCVyMTJkCisJcm9ybAkkOSwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxM2QKKwl4b3JsCSVlYngsJXIxMmQKKwlyb3JsCSQ1LCVyMTNkCisJeG9ybAklZWR4LCVyMTRkCisJYW5kbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlhZGRsCTUyKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklcjhkLCVlZGkKKwlhZGRsCSVyMTJkLCVlY3gKKwlyb3JsCSQ2LCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWR4LCVyMTRkCisJYWRkbAklcjEzZCwlZWN4CisJeG9ybAklcjhkLCVyMTVkCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVjeCwlcjEwZAorCWFkZGwJJXIxNWQsJWVjeAorCW1vdmwJJXIxMGQsJXIxM2QKKwlhZGRsCSVlY3gsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVjeAorCW1vdmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjEwZCwlcjEzZAorCXhvcmwJJWVheCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTJkCisJeG9ybAklcjEwZCwlcjEzZAorCWFkZGwJNTYoJXJzcCksJWVieAorCW1vdmwJJWVjeCwlcjE1ZAorCXhvcmwJJWVheCwlcjEyZAorCXJvcmwJJDExLCVyMTRkCisJeG9ybAklZWR4LCVyMTVkCisJYWRkbAklcjEyZCwlZWJ4CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJWVjeCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVieAorCXhvcmwJJWVkeCwlZWRpCisJcm9ybAkkMiwlcjE0ZAorCWFkZGwJJWVieCwlcjlkCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVyOWQsJXIxM2QKKwlhZGRsCSVlYngsJXIxNGQKKwlyb3JsCSQxNCwlcjEzZAorCW1vdmwJJXIxNGQsJWVieAorCW1vdmwJJXIxMGQsJXIxMmQKKwlyb3JsCSQ5LCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJeG9ybAklcjExZCwlcjEyZAorCXJvcmwJJDUsJXIxM2QKKwl4b3JsCSVlYngsJXIxNGQKKwlhbmRsCSVyOWQsJXIxMmQKKwl4b3JsCSVyOWQsJXIxM2QKKwlhZGRsCTYwKCVyc3ApLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJXIxMWQsJXIxMmQKKwlyb3JsCSQxMSwlcjE0ZAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklcjEyZCwlZWF4CisJcm9ybAkkNiwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVieCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVheAorCXhvcmwJJWVjeCwlcjE1ZAorCXJvcmwJJDIsJXIxNGQKKwlhZGRsCSVlYXgsJXI4ZAorCWFkZGwJJXIxNWQsJWVheAorCW1vdmwJJXI4ZCwlcjEzZAorCWFkZGwJJWVheCwlcjE0ZAorCW1vdnEJNjQrMCglcnNwKSwlcmRpCisJbW92bAklcjE0ZCwlZWF4CisKKwlhZGRsCTAoJXJkaSksJWVheAorCWxlYXEJNjQoJXJzaSksJXJzaQorCWFkZGwJNCglcmRpKSwlZWJ4CisJYWRkbAk4KCVyZGkpLCVlY3gKKwlhZGRsCTEyKCVyZGkpLCVlZHgKKwlhZGRsCTE2KCVyZGkpLCVyOGQKKwlhZGRsCTIwKCVyZGkpLCVyOWQKKwlhZGRsCTI0KCVyZGkpLCVyMTBkCisJYWRkbAkyOCglcmRpKSwlcjExZAorCisJY21wcQk2NCsxNiglcnNwKSwlcnNpCisKKwltb3ZsCSVlYXgsMCglcmRpKQorCW1vdmwJJWVieCw0KCVyZGkpCisJbW92bAklZWN4LDgoJXJkaSkKKwltb3ZsCSVlZHgsMTIoJXJkaSkKKwltb3ZsCSVyOGQsMTYoJXJkaSkKKwltb3ZsCSVyOWQsMjAoJXJkaSkKKwltb3ZsCSVyMTBkLDI0KCVyZGkpCisJbW92bAklcjExZCwyOCglcmRpKQorCWpiCUwkbG9vcF9zc3NlMworCisJbW92cQk4OCglcnNwKSwlcnNpCisKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRlcGlsb2d1ZV9zc3NlMzoKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTYKK3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eDoKKworTCRhdnhfc2hvcnRjdXQ6CisJbW92cQklcnNwLCVyYXgKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXNobHEJJDQsJXJkeAorCXN1YnEJJDk2LCVyc3AKKwlsZWFxCSglcnNpLCVyZHgsNCksJXJkeAorCWFuZHEJJC02NCwlcnNwCisJbW92cQklcmRpLDY0KzAoJXJzcCkKKwltb3ZxCSVyc2ksNjQrOCglcnNwKQorCW1vdnEJJXJkeCw2NCsxNiglcnNwKQorCW1vdnEJJXJheCw4OCglcnNwKQorCitMJHByb2xvZ3VlX2F2eDoKKworCXZ6ZXJvdXBwZXIKKwltb3ZsCTAoJXJkaSksJWVheAorCW1vdmwJNCglcmRpKSwlZWJ4CisJbW92bAk4KCVyZGkpLCVlY3gKKwltb3ZsCTEyKCVyZGkpLCVlZHgKKwltb3ZsCTE2KCVyZGkpLCVyOGQKKwltb3ZsCTIwKCVyZGkpLCVyOWQKKwltb3ZsCTI0KCVyZGkpLCVyMTBkCisJbW92bAkyOCglcmRpKSwlcjExZAorCXZtb3ZkcWEJSzI1Nis1MTIrMzIoJXJpcCksJXhtbTgKKwl2bW92ZHFhCUsyNTYrNTEyKzY0KCVyaXApLCV4bW05CisJam1wCUwkbG9vcF9hdngKKy5wMmFsaWduCTQKK0wkbG9vcF9hdng6CisJdm1vdmRxYQlLMjU2KzUxMiglcmlwKSwleG1tNworCXZtb3ZkcXUJMCglcnNpKSwleG1tMAorCXZtb3ZkcXUJMTYoJXJzaSksJXhtbTEKKwl2bW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJdm1vdmRxdQk0OCglcnNpKSwleG1tMworCXZwc2h1ZmIJJXhtbTcsJXhtbTAsJXhtbTAKKwlsZWFxCUsyNTYoJXJpcCksJXJicAorCXZwc2h1ZmIJJXhtbTcsJXhtbTEsJXhtbTEKKwl2cHNodWZiCSV4bW03LCV4bW0yLCV4bW0yCisJdnBhZGRkCTAoJXJicCksJXhtbTAsJXhtbTQKKwl2cHNodWZiCSV4bW03LCV4bW0zLCV4bW0zCisJdnBhZGRkCTMyKCVyYnApLCV4bW0xLCV4bW01CisJdnBhZGRkCTY0KCVyYnApLCV4bW0yLCV4bW02CisJdnBhZGRkCTk2KCVyYnApLCV4bW0zLCV4bW03CisJdm1vdmRxYQkleG1tNCwwKCVyc3ApCisJbW92bAklZWF4LCVyMTRkCisJdm1vdmRxYQkleG1tNSwxNiglcnNwKQorCW1vdmwJJWVieCwlZWRpCisJdm1vdmRxYQkleG1tNiwzMiglcnNwKQorCXhvcmwJJWVjeCwlZWRpCisJdm1vdmRxYQkleG1tNyw0OCglcnNwKQorCW1vdmwJJXI4ZCwlcjEzZAorCWptcAlMJGF2eF8wMF80NworCisucDJhbGlnbgk0CitMJGF2eF8wMF80NzoKKwlzdWJxCSQtMTI4LCVyYnAKKwl2cGFsaWducgkkNCwleG1tMCwleG1tMSwleG1tNAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVheAorCW1vdmwJJXI5ZCwlcjEyZAorCXZwYWxpZ25yCSQ0LCV4bW0yLCV4bW0zLCV4bW03CisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyOGQsJXIxM2QKKwl4b3JsCSVyMTBkLCVyMTJkCisJdnBzcmxkCSQ3LCV4bW00LCV4bW02CisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVlYXgsJXIxNGQKKwlhbmRsCSVyOGQsJXIxMmQKKwl2cGFkZGQJJXhtbTcsJXhtbTAsJXhtbTAKKwl4b3JsCSVyOGQsJXIxM2QKKwlhZGRsCTAoJXJzcCksJXIxMWQKKwltb3ZsCSVlYXgsJXIxNWQKKwl2cHNybGQJJDMsJXhtbTQsJXhtbTcKKwl4b3JsCSVyMTBkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWJ4LCVyMTVkCisJdnBzbGxkCSQxNCwleG1tNCwleG1tNQorCWFkZGwJJXIxMmQsJXIxMWQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXZweG9yCSV4bW02LCV4bW03LCV4bW00CisJeG9ybAklZWF4LCVyMTRkCisJYWRkbAklcjEzZCwlcjExZAorCXhvcmwJJWVieCwlZWRpCisJdnBzaHVmZAkkMjUwLCV4bW0zLCV4bW03CisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyMTFkLCVlZHgKKwlhZGRsCSVlZGksJXIxMWQKKwl2cHNybGQJJDExLCV4bW02LCV4bW02CisJbW92bAklZWR4LCVyMTNkCisJYWRkbAklcjExZCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJbW92bAklcjE0ZCwlcjExZAorCW1vdmwJJXI4ZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJdnBzbGxkCSQxMSwleG1tNSwleG1tNQorCXhvcmwJJWVkeCwlcjEzZAorCXhvcmwJJXI5ZCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJdnB4b3IJJXhtbTYsJXhtbTQsJXhtbTQKKwl4b3JsCSVyMTFkLCVyMTRkCisJYW5kbAklZWR4LCVyMTJkCisJeG9ybAklZWR4LCVyMTNkCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCWFkZGwJNCglcnNwKSwlcjEwZAorCW1vdmwJJXIxMWQsJWVkaQorCXhvcmwJJXI5ZCwlcjEyZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVyMTJkLCVyMTBkCisJdnBzcmxxCSQxNywleG1tNywleG1tNworCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjExZCwlcjE0ZAorCXZwYWRkZAkleG1tNCwleG1tMCwleG1tMAorCWFkZGwJJXIxM2QsJXIxMGQKKwl4b3JsCSVlYXgsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAklcjEwZCwlZWN4CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCXZwc3JscQkkMiwleG1tNywleG1tNworCWFkZGwJJXIxMGQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTBkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwltb3ZsCSVlZHgsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVjeCwlcjEzZAorCXZwc2h1ZmIJJXhtbTgsJXhtbTYsJXhtbTYKKwl4b3JsCSVyOGQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxNGQKKwl2cGFkZGQJJXhtbTYsJXhtbTAsJXhtbTAKKwlhbmRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTgoJXJzcCksJXI5ZAorCXZwc2h1ZmQJJDgwLCV4bW0wLCV4bW03CisJbW92bAklcjEwZCwlcjE1ZAorCXhvcmwJJXI4ZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwl4b3JsCSVyMTFkLCVyMTVkCisJYWRkbAklcjEyZCwlcjlkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwl2cHNybHEJJDE3LCV4bW03LCV4bW03CisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjEwZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI5ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJeG9ybAklcjExZCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyOWQsJWVieAorCXZwc3JscQkkMiwleG1tNywleG1tNworCWFkZGwJJWVkaSwlcjlkCisJbW92bAklZWJ4LCVyMTNkCisJYWRkbAklcjlkLCVyMTRkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOWQKKwltb3ZsCSVlY3gsJXIxMmQKKwl2cHNodWZiCSV4bW05LCV4bW02LCV4bW02CisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlYngsJXIxM2QKKwl4b3JsCSVlZHgsJXIxMmQKKwl2cGFkZGQJJXhtbTYsJXhtbTAsJXhtbTAKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFuZGwJJWVieCwlcjEyZAorCXZwYWRkZAkwKCVyYnApLCV4bW0wLCV4bW02CisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAkxMiglcnNwKSwlcjhkCisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVlZGkKKwlhZGRsCSVyMTJkLCVyOGQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI4ZAorCXhvcmwJJXIxMGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjhkLCVyMTRkCisJdm1vdmRxYQkleG1tNiwwKCVyc3ApCisJdnBhbGlnbnIJJDQsJXhtbTEsJXhtbTIsJXhtbTQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOGQKKwltb3ZsCSVlYngsJXIxMmQKKwl2cGFsaWducgkkNCwleG1tMywleG1tMCwleG1tNworCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJeG9ybAklZWN4LCVyMTJkCisJdnBzcmxkCSQ3LCV4bW00LCV4bW02CisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxMmQKKwl2cGFkZGQJJXhtbTcsJXhtbTEsJXhtbTEKKwl4b3JsCSVlYXgsJXIxM2QKKwlhZGRsCTE2KCVyc3ApLCVlZHgKKwltb3ZsCSVyOGQsJXIxNWQKKwl2cHNybGQJJDMsJXhtbTQsJXhtbTcKKwl4b3JsCSVlY3gsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyOWQsJXIxNWQKKwl2cHNsbGQJJDE0LCV4bW00LCV4bW01CisJYWRkbAklcjEyZCwlZWR4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl2cHhvcgkleG1tNiwleG1tNywleG1tNAorCXhvcmwJJXI4ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVkeAorCXhvcmwJJXI5ZCwlZWRpCisJdnBzaHVmZAkkMjUwLCV4bW0wLCV4bW03CisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZGksJWVkeAorCXZwc3JsZAkkMTEsJXhtbTYsJXhtbTYKKwltb3ZsCSVyMTFkLCVyMTNkCisJYWRkbAklZWR4LCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwltb3ZsCSVyMTRkLCVlZHgKKwltb3ZsCSVlYXgsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXZwc2xsZAkkMTEsJXhtbTUsJXhtbTUKKwl4b3JsCSVyMTFkLCVyMTNkCisJeG9ybAklZWJ4LCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJWVkeCwlcjE0ZAorCWFuZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTNkCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCWFkZGwJMjAoJXJzcCksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZWJ4LCVyMTJkCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyOGQsJWVkaQorCWFkZGwJJXIxMmQsJWVjeAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTcKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVkeCwlcjE0ZAorCXZwYWRkZAkleG1tNCwleG1tMSwleG1tMQorCWFkZGwJJXIxM2QsJWVjeAorCXhvcmwJJXI4ZCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlhZGRsCSVlY3gsJXIxMGQKKwlhZGRsCSVyMTVkLCVlY3gKKwltb3ZsCSVyMTBkLCVyMTNkCisJdnBzcmxxCSQyLCV4bW03LCV4bW03CisJYWRkbAklZWN4LCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWN4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwltb3ZsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJdnBzaHVmYgkleG1tOCwleG1tNiwleG1tNgorCXhvcmwJJWVheCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWN4LCVyMTRkCisJdnBhZGRkCSV4bW02LCV4bW0xLCV4bW0xCisJYW5kbAklcjEwZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCTI0KCVyc3ApLCVlYngKKwl2cHNodWZkCSQ4MCwleG1tMSwleG1tNworCW1vdmwJJWVjeCwlcjE1ZAorCXhvcmwJJWVheCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwl4b3JsCSVlZHgsJXIxNWQKKwlhZGRsCSVyMTJkLCVlYngKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTcKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYngKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXhvcmwJJWVkeCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlYngsJXI5ZAorCXZwc3JscQkkMiwleG1tNywleG1tNworCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklcjlkLCVyMTNkCisJYWRkbAklZWJ4LCVyMTRkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYngKKwltb3ZsCSVyMTBkLCVyMTJkCisJdnBzaHVmYgkleG1tOSwleG1tNiwleG1tNgorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJeG9ybAklcjExZCwlcjEyZAorCXZwYWRkZAkleG1tNiwleG1tMSwleG1tMQorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWJ4LCVyMTRkCisJYW5kbAklcjlkLCVyMTJkCisJdnBhZGRkCTMyKCVyYnApLCV4bW0xLCV4bW02CisJeG9ybAklcjlkLCVyMTNkCisJYWRkbAkyOCglcnNwKSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwl4b3JsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVyMTJkLCVlYXgKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVieCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVheAorCXhvcmwJJWVjeCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWF4LCVyOGQKKwlhZGRsCSVyMTVkLCVlYXgKKwltb3ZsCSVyOGQsJXIxM2QKKwlhZGRsCSVlYXgsJXIxNGQKKwl2bW92ZHFhCSV4bW02LDE2KCVyc3ApCisJdnBhbGlnbnIJJDQsJXhtbTIsJXhtbTMsJXhtbTQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYXgKKwltb3ZsCSVyOWQsJXIxMmQKKwl2cGFsaWducgkkNCwleG1tMCwleG1tMSwleG1tNworCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJeG9ybAklcjEwZCwlcjEyZAorCXZwc3JsZAkkNywleG1tNCwleG1tNgorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTJkCisJdnBhZGRkCSV4bW03LCV4bW0yLCV4bW0yCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAkzMiglcnNwKSwlcjExZAorCW1vdmwJJWVheCwlcjE1ZAorCXZwc3JsZAkkMywleG1tNCwleG1tNworCXhvcmwJJXIxMGQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVlYngsJXIxNWQKKwl2cHNsbGQJJDE0LCV4bW00LCV4bW01CisJYWRkbAklcjEyZCwlcjExZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJdnB4b3IJJXhtbTYsJXhtbTcsJXhtbTQKKwl4b3JsCSVlYXgsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTFkCisJeG9ybAklZWJ4LCVlZGkKKwl2cHNodWZkCSQyNTAsJXhtbTEsJXhtbTcKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCWFkZGwJJWVkaSwlcjExZAorCXZwc3JsZAkkMTEsJXhtbTYsJXhtbTYKKwltb3ZsCSVlZHgsJXIxM2QKKwlhZGRsCSVyMTFkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwltb3ZsCSVyMTRkLCVyMTFkCisJbW92bAklcjhkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl2cHNsbGQJJDExLCV4bW01LCV4bW01CisJeG9ybAklZWR4LCVyMTNkCisJeG9ybAklcjlkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlZHgsJXIxM2QKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJYWRkbAkzNiglcnNwKSwlcjEwZAorCW1vdmwJJXIxMWQsJWVkaQorCXhvcmwJJXI5ZCwlcjEyZAorCXZweG9yCSV4bW01LCV4bW00LCV4bW00CisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVyMTJkLCVyMTBkCisJdnBzcmxxCSQxNywleG1tNywleG1tNworCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjExZCwlcjE0ZAorCXZwYWRkZAkleG1tNCwleG1tMiwleG1tMgorCWFkZGwJJXIxM2QsJXIxMGQKKwl4b3JsCSVlYXgsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJYWRkbAklcjEwZCwlZWN4CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCXZwc3JscQkkMiwleG1tNywleG1tNworCWFkZGwJJXIxMGQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTBkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwltb3ZsCSVlZHgsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVjeCwlcjEzZAorCXZwc2h1ZmIJJXhtbTgsJXhtbTYsJXhtbTYKKwl4b3JsCSVyOGQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxNGQKKwl2cGFkZGQJJXhtbTYsJXhtbTIsJXhtbTIKKwlhbmRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTQwKCVyc3ApLCVyOWQKKwl2cHNodWZkCSQ4MCwleG1tMiwleG1tNworCW1vdmwJJXIxMGQsJXIxNWQKKwl4b3JsCSVyOGQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl2cHNybGQJJDEwLCV4bW03LCV4bW02CisJeG9ybAklcjExZCwlcjE1ZAorCWFkZGwJJXIxMmQsJXI5ZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJdnBzcmxxCSQxNywleG1tNywleG1tNworCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOWQKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXhvcmwJJXIxMWQsJWVkaQorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjlkLCVlYngKKwl2cHNybHEJJDIsJXhtbTcsJXhtbTcKKwlhZGRsCSVlZGksJXI5ZAorCW1vdmwJJWVieCwlcjEzZAorCWFkZGwJJXI5ZCwlcjE0ZAorCXZweG9yCSV4bW03LCV4bW02LCV4bW02CisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjlkCisJbW92bAklZWN4LCVyMTJkCisJdnBzaHVmYgkleG1tOSwleG1tNiwleG1tNgorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJeG9ybAklZWR4LCVyMTJkCisJdnBhZGRkCSV4bW02LCV4bW0yLCV4bW0yCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJXIxMmQKKwl2cGFkZGQJNjQoJXJicCksJXhtbTIsJXhtbTYKKwl4b3JsCSVlYngsJXIxM2QKKwlhZGRsCTQ0KCVyc3ApLCVyOGQKKwltb3ZsCSVyOWQsJWVkaQorCXhvcmwJJWVkeCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXIxMGQsJWVkaQorCWFkZGwJJXIxMmQsJXI4ZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjlkLCVyMTRkCisJYWRkbAklcjEzZCwlcjhkCisJeG9ybAklcjEwZCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjhkLCVlYXgKKwlhZGRsCSVyMTVkLCVyOGQKKwltb3ZsCSVlYXgsJXIxM2QKKwlhZGRsCSVyOGQsJXIxNGQKKwl2bW92ZHFhCSV4bW02LDMyKCVyc3ApCisJdnBhbGlnbnIJJDQsJXhtbTMsJXhtbTAsJXhtbTQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOGQKKwltb3ZsCSVlYngsJXIxMmQKKwl2cGFsaWducgkkNCwleG1tMSwleG1tMiwleG1tNworCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWF4LCVyMTNkCisJeG9ybAklZWN4LCVyMTJkCisJdnBzcmxkCSQ3LCV4bW00LCV4bW02CisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyOGQsJXIxNGQKKwlhbmRsCSVlYXgsJXIxMmQKKwl2cGFkZGQJJXhtbTcsJXhtbTMsJXhtbTMKKwl4b3JsCSVlYXgsJXIxM2QKKwlhZGRsCTQ4KCVyc3ApLCVlZHgKKwltb3ZsCSVyOGQsJXIxNWQKKwl2cHNybGQJJDMsJXhtbTQsJXhtbTcKKwl4b3JsCSVlY3gsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyOWQsJXIxNWQKKwl2cHNsbGQJJDE0LCV4bW00LCV4bW01CisJYWRkbAklcjEyZCwlZWR4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl2cHhvcgkleG1tNiwleG1tNywleG1tNAorCXhvcmwJJXI4ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVkeAorCXhvcmwJJXI5ZCwlZWRpCisJdnBzaHVmZAkkMjUwLCV4bW0yLCV4bW03CisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlZHgsJXIxMWQKKwlhZGRsCSVlZGksJWVkeAorCXZwc3JsZAkkMTEsJXhtbTYsJXhtbTYKKwltb3ZsCSVyMTFkLCVyMTNkCisJYWRkbAklZWR4LCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwltb3ZsCSVyMTRkLCVlZHgKKwltb3ZsCSVlYXgsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXZwc2xsZAkkMTEsJXhtbTUsJXhtbTUKKwl4b3JsCSVyMTFkLCVyMTNkCisJeG9ybAklZWJ4LCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl2cHhvcgkleG1tNiwleG1tNCwleG1tNAorCXhvcmwJJWVkeCwlcjE0ZAorCWFuZGwJJXIxMWQsJXIxMmQKKwl4b3JsCSVyMTFkLCVyMTNkCisJdnBzcmxkCSQxMCwleG1tNywleG1tNgorCWFkZGwJNTIoJXJzcCksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZWJ4LCVyMTJkCisJdnB4b3IJJXhtbTUsJXhtbTQsJXhtbTQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyOGQsJWVkaQorCWFkZGwJJXIxMmQsJWVjeAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTcKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVkeCwlcjE0ZAorCXZwYWRkZAkleG1tNCwleG1tMywleG1tMworCWFkZGwJJXIxM2QsJWVjeAorCXhvcmwJJXI4ZCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlhZGRsCSVlY3gsJXIxMGQKKwlhZGRsCSVyMTVkLCVlY3gKKwltb3ZsCSVyMTBkLCVyMTNkCisJdnBzcmxxCSQyLCV4bW03LCV4bW03CisJYWRkbAklZWN4LCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWN4CisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwltb3ZsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJdnBzaHVmYgkleG1tOCwleG1tNiwleG1tNgorCXhvcmwJJWVheCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWN4LCVyMTRkCisJdnBhZGRkCSV4bW02LCV4bW0zLCV4bW0zCisJYW5kbAklcjEwZCwlcjEyZAorCXhvcmwJJXIxMGQsJXIxM2QKKwlhZGRsCTU2KCVyc3ApLCVlYngKKwl2cHNodWZkCSQ4MCwleG1tMywleG1tNworCW1vdmwJJWVjeCwlcjE1ZAorCXhvcmwJJWVheCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXZwc3JsZAkkMTAsJXhtbTcsJXhtbTYKKwl4b3JsCSVlZHgsJXIxNWQKKwlhZGRsCSVyMTJkLCVlYngKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCXZwc3JscQkkMTcsJXhtbTcsJXhtbTcKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYngKKwl2cHhvcgkleG1tNywleG1tNiwleG1tNgorCXhvcmwJJWVkeCwlZWRpCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlYngsJXI5ZAorCXZwc3JscQkkMiwleG1tNywleG1tNworCWFkZGwJJWVkaSwlZWJ4CisJbW92bAklcjlkLCVyMTNkCisJYWRkbAklZWJ4LCVyMTRkCisJdnB4b3IJJXhtbTcsJXhtbTYsJXhtbTYKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYngKKwltb3ZsCSVyMTBkLCVyMTJkCisJdnBzaHVmYgkleG1tOSwleG1tNiwleG1tNgorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjlkLCVyMTNkCisJeG9ybAklcjExZCwlcjEyZAorCXZwYWRkZAkleG1tNiwleG1tMywleG1tMworCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWJ4LCVyMTRkCisJYW5kbAklcjlkLCVyMTJkCisJdnBhZGRkCTk2KCVyYnApLCV4bW0zLCV4bW02CisJeG9ybAklcjlkLCVyMTNkCisJYWRkbAk2MCglcnNwKSwlZWF4CisJbW92bAklZWJ4LCVlZGkKKwl4b3JsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWN4LCVlZGkKKwlhZGRsCSVyMTJkLCVlYXgKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVieCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVheAorCXhvcmwJJWVjeCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWF4LCVyOGQKKwlhZGRsCSVyMTVkLCVlYXgKKwltb3ZsCSVyOGQsJXIxM2QKKwlhZGRsCSVlYXgsJXIxNGQKKwl2bW92ZHFhCSV4bW02LDQ4KCVyc3ApCisJY21wYgkkMCwxMzEoJXJicCkKKwlqbmUJTCRhdnhfMDBfNDcKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYXgKKwltb3ZsCSVyOWQsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI4ZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVheCwlcjE0ZAorCWFuZGwJJXI4ZCwlcjEyZAorCXhvcmwJJXI4ZCwlcjEzZAorCWFkZGwJMCglcnNwKSwlcjExZAorCW1vdmwJJWVheCwlcjE1ZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVlYngsJXIxNWQKKwlhZGRsCSVyMTJkLCVyMTFkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlYXgsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTFkCisJeG9ybAklZWJ4LCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCWFkZGwJJWVkaSwlcjExZAorCW1vdmwJJWVkeCwlcjEzZAorCWFkZGwJJXIxMWQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTFkCisJbW92bAklcjhkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwl4b3JsCSVyOWQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCTQoJXJzcCksJXIxMGQKKwltb3ZsCSVyMTFkLCVlZGkKKwl4b3JsCSVyOWQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVlYXgsJWVkaQorCWFkZGwJJXIxMmQsJXIxMGQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTBkCisJeG9ybAklZWF4LCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVyMTBkLCVlY3gKKwlhZGRsCSVyMTVkLCVyMTBkCisJbW92bAklZWN4LCVyMTNkCisJYWRkbAklcjEwZCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJXIxMGQKKwltb3ZsCSVlZHgsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVjeCwlcjEzZAorCXhvcmwJJXI4ZCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklcjEwZCwlcjE0ZAorCWFuZGwJJWVjeCwlcjEyZAorCXhvcmwJJWVjeCwlcjEzZAorCWFkZGwJOCglcnNwKSwlcjlkCisJbW92bAklcjEwZCwlcjE1ZAorCXhvcmwJJXI4ZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXIxMWQsJXIxNWQKKwlhZGRsCSVyMTJkLCVyOWQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJXIxNWQsJWVkaQorCXhvcmwJJXIxMGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVyOWQKKwl4b3JsCSVyMTFkLCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXI5ZCwlZWJ4CisJYWRkbAklZWRpLCVyOWQKKwltb3ZsCSVlYngsJXIxM2QKKwlhZGRsCSVyOWQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOWQKKwltb3ZsCSVlY3gsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVieCwlcjEzZAorCXhvcmwJJWVkeCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklcjlkLCVyMTRkCisJYW5kbAklZWJ4LCVyMTJkCisJeG9ybAklZWJ4LCVyMTNkCisJYWRkbAkxMiglcnNwKSwlcjhkCisJbW92bAklcjlkLCVlZGkKKwl4b3JsCSVlZHgsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVlZGkKKwlhZGRsCSVyMTJkLCVyOGQKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJXI5ZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI4ZAorCXhvcmwJJXIxMGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXI4ZCwlZWF4CisJYWRkbAklcjE1ZCwlcjhkCisJbW92bAklZWF4LCVyMTNkCisJYWRkbAklcjhkLCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlcjhkCisJbW92bAklZWJ4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlYXgsJXIxM2QKKwl4b3JsCSVlY3gsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXI4ZCwlcjE0ZAorCWFuZGwJJWVheCwlcjEyZAorCXhvcmwJJWVheCwlcjEzZAorCWFkZGwJMTYoJXJzcCksJWVkeAorCW1vdmwJJXI4ZCwlcjE1ZAorCXhvcmwJJWVjeCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI5ZCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVkeAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjhkLCVyMTRkCisJYWRkbAklcjEzZCwlZWR4CisJeG9ybAklcjlkLCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVkeCwlcjExZAorCWFkZGwJJWVkaSwlZWR4CisJbW92bAklcjExZCwlcjEzZAorCWFkZGwJJWVkeCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVkeAorCW1vdmwJJWVheCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjExZCwlcjEzZAorCXhvcmwJJWVieCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWR4LCVyMTRkCisJYW5kbAklcjExZCwlcjEyZAorCXhvcmwJJXIxMWQsJXIxM2QKKwlhZGRsCTIwKCVyc3ApLCVlY3gKKwltb3ZsCSVlZHgsJWVkaQorCXhvcmwJJWVieCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI4ZCwlZWRpCisJYWRkbAklcjEyZCwlZWN4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlZHgsJXIxNGQKKwlhZGRsCSVyMTNkLCVlY3gKKwl4b3JsCSVyOGQsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVjeCwlcjEwZAorCWFkZGwJJXIxNWQsJWVjeAorCW1vdmwJJXIxMGQsJXIxM2QKKwlhZGRsCSVlY3gsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlY3gKKwltb3ZsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTBkLCVyMTNkCisJeG9ybAklZWF4LCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVlY3gsJXIxNGQKKwlhbmRsCSVyMTBkLCVyMTJkCisJeG9ybAklcjEwZCwlcjEzZAorCWFkZGwJMjQoJXJzcCksJWVieAorCW1vdmwJJWVjeCwlcjE1ZAorCXhvcmwJJWVheCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVkeCwlcjE1ZAorCWFkZGwJJXIxMmQsJWVieAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklZWN4LCVyMTRkCisJYWRkbAklcjEzZCwlZWJ4CisJeG9ybAklZWR4LCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVieCwlcjlkCisJYWRkbAklZWRpLCVlYngKKwltb3ZsCSVyOWQsJXIxM2QKKwlhZGRsCSVlYngsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVlYngKKwltb3ZsCSVyMTBkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyOWQsJXIxM2QKKwl4b3JsCSVyMTFkLCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVlYngsJXIxNGQKKwlhbmRsCSVyOWQsJXIxMmQKKwl4b3JsCSVyOWQsJXIxM2QKKwlhZGRsCTI4KCVyc3ApLCVlYXgKKwltb3ZsCSVlYngsJWVkaQorCXhvcmwJJXIxMWQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVlY3gsJWVkaQorCWFkZGwJJXIxMmQsJWVheAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklZWJ4LCVyMTRkCisJYWRkbAklcjEzZCwlZWF4CisJeG9ybAklZWN4LCVyMTVkCisJc2hyZGwJJDIsJXIxNGQsJXIxNGQKKwlhZGRsCSVlYXgsJXI4ZAorCWFkZGwJJXIxNWQsJWVheAorCW1vdmwJJXI4ZCwlcjEzZAorCWFkZGwJJWVheCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVheAorCW1vdmwJJXI5ZCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklcjhkLCVyMTNkCisJeG9ybAklcjEwZCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklZWF4LCVyMTRkCisJYW5kbAklcjhkLCVyMTJkCisJeG9ybAklcjhkLCVyMTNkCisJYWRkbAkzMiglcnNwKSwlcjExZAorCW1vdmwJJWVheCwlcjE1ZAorCXhvcmwJJXIxMGQsJXIxMmQKKwlzaHJkbAkkMTEsJXIxNGQsJXIxNGQKKwl4b3JsCSVlYngsJXIxNWQKKwlhZGRsCSVyMTJkLCVyMTFkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlYXgsJXIxNGQKKwlhZGRsCSVyMTNkLCVyMTFkCisJeG9ybAklZWJ4LCVlZGkKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJXIxMWQsJWVkeAorCWFkZGwJJWVkaSwlcjExZAorCW1vdmwJJWVkeCwlcjEzZAorCWFkZGwJJXIxMWQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTFkCisJbW92bAklcjhkLCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlZHgsJXIxM2QKKwl4b3JsCSVyOWQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXIxMWQsJXIxNGQKKwlhbmRsCSVlZHgsJXIxMmQKKwl4b3JsCSVlZHgsJXIxM2QKKwlhZGRsCTM2KCVyc3ApLCVyMTBkCisJbW92bAklcjExZCwlZWRpCisJeG9ybAklcjlkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWF4LCVlZGkKKwlhZGRsCSVyMTJkLCVyMTBkCisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVyMTFkLCVyMTRkCisJYWRkbAklcjEzZCwlcjEwZAorCXhvcmwJJWVheCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjEwZCwlZWN4CisJYWRkbAklcjE1ZCwlcjEwZAorCW1vdmwJJWVjeCwlcjEzZAorCWFkZGwJJXIxMGQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyMTBkCisJbW92bAklZWR4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVlY3gsJXIxM2QKKwl4b3JsCSVyOGQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJXIxMGQsJXIxNGQKKwlhbmRsCSVlY3gsJXIxMmQKKwl4b3JsCSVlY3gsJXIxM2QKKwlhZGRsCTQwKCVyc3ApLCVyOWQKKwltb3ZsCSVyMTBkLCVyMTVkCisJeG9ybAklcjhkLCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjExZCwlcjE1ZAorCWFkZGwJJXIxMmQsJXI5ZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklcjE1ZCwlZWRpCisJeG9ybAklcjEwZCwlcjE0ZAorCWFkZGwJJXIxM2QsJXI5ZAorCXhvcmwJJXIxMWQsJWVkaQorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjlkLCVlYngKKwlhZGRsCSVlZGksJXI5ZAorCW1vdmwJJWVieCwlcjEzZAorCWFkZGwJJXI5ZCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJXI5ZAorCW1vdmwJJWVjeCwlcjEyZAorCXNocmRsCSQ5LCVyMTRkLCVyMTRkCisJeG9ybAklZWJ4LCVyMTNkCisJeG9ybAklZWR4LCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVyOWQsJXIxNGQKKwlhbmRsCSVlYngsJXIxMmQKKwl4b3JsCSVlYngsJXIxM2QKKwlhZGRsCTQ0KCVyc3ApLCVyOGQKKwltb3ZsCSVyOWQsJWVkaQorCXhvcmwJJWVkeCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXIxMGQsJWVkaQorCWFkZGwJJXIxMmQsJXI4ZAorCXNocmRsCSQ2LCVyMTNkLCVyMTNkCisJYW5kbAklZWRpLCVyMTVkCisJeG9ybAklcjlkLCVyMTRkCisJYWRkbAklcjEzZCwlcjhkCisJeG9ybAklcjEwZCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklcjhkLCVlYXgKKwlhZGRsCSVyMTVkLCVyOGQKKwltb3ZsCSVlYXgsJXIxM2QKKwlhZGRsCSVyOGQsJXIxNGQKKwlzaHJkbAkkMTQsJXIxM2QsJXIxM2QKKwltb3ZsCSVyMTRkLCVyOGQKKwltb3ZsCSVlYngsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVheCwlcjEzZAorCXhvcmwJJWVjeCwlcjEyZAorCXNocmRsCSQ1LCVyMTNkLCVyMTNkCisJeG9ybAklcjhkLCVyMTRkCisJYW5kbAklZWF4LCVyMTJkCisJeG9ybAklZWF4LCVyMTNkCisJYWRkbAk0OCglcnNwKSwlZWR4CisJbW92bAklcjhkLCVyMTVkCisJeG9ybAklZWN4LCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjlkLCVyMTVkCisJYWRkbAklcjEyZCwlZWR4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVyOGQsJXIxNGQKKwlhZGRsCSVyMTNkLCVlZHgKKwl4b3JsCSVyOWQsJWVkaQorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWR4LCVyMTFkCisJYWRkbAklZWRpLCVlZHgKKwltb3ZsCSVyMTFkLCVyMTNkCisJYWRkbAklZWR4LCVyMTRkCisJc2hyZGwJJDE0LCVyMTNkLCVyMTNkCisJbW92bAklcjE0ZCwlZWR4CisJbW92bAklZWF4LCVyMTJkCisJc2hyZGwJJDksJXIxNGQsJXIxNGQKKwl4b3JsCSVyMTFkLCVyMTNkCisJeG9ybAklZWJ4LCVyMTJkCisJc2hyZGwJJDUsJXIxM2QsJXIxM2QKKwl4b3JsCSVlZHgsJXIxNGQKKwlhbmRsCSVyMTFkLCVyMTJkCisJeG9ybAklcjExZCwlcjEzZAorCWFkZGwJNTIoJXJzcCksJWVjeAorCW1vdmwJJWVkeCwlZWRpCisJeG9ybAklZWJ4LCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklcjhkLCVlZGkKKwlhZGRsCSVyMTJkLCVlY3gKKwlzaHJkbAkkNiwlcjEzZCwlcjEzZAorCWFuZGwJJWVkaSwlcjE1ZAorCXhvcmwJJWVkeCwlcjE0ZAorCWFkZGwJJXIxM2QsJWVjeAorCXhvcmwJJXI4ZCwlcjE1ZAorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWN4LCVyMTBkCisJYWRkbAklcjE1ZCwlZWN4CisJbW92bAklcjEwZCwlcjEzZAorCWFkZGwJJWVjeCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVjeAorCW1vdmwJJXIxMWQsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXIxMGQsJXIxM2QKKwl4b3JsCSVlYXgsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVjeCwlcjE0ZAorCWFuZGwJJXIxMGQsJXIxMmQKKwl4b3JsCSVyMTBkLCVyMTNkCisJYWRkbAk1NiglcnNwKSwlZWJ4CisJbW92bAklZWN4LCVyMTVkCisJeG9ybAklZWF4LCVyMTJkCisJc2hyZGwJJDExLCVyMTRkLCVyMTRkCisJeG9ybAklZWR4LCVyMTVkCisJYWRkbAklcjEyZCwlZWJ4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVyMTVkLCVlZGkKKwl4b3JsCSVlY3gsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYngKKwl4b3JsCSVlZHgsJWVkaQorCXNocmRsCSQyLCVyMTRkLCVyMTRkCisJYWRkbAklZWJ4LCVyOWQKKwlhZGRsCSVlZGksJWVieAorCW1vdmwJJXI5ZCwlcjEzZAorCWFkZGwJJWVieCwlcjE0ZAorCXNocmRsCSQxNCwlcjEzZCwlcjEzZAorCW1vdmwJJXIxNGQsJWVieAorCW1vdmwJJXIxMGQsJXIxMmQKKwlzaHJkbAkkOSwlcjE0ZCwlcjE0ZAorCXhvcmwJJXI5ZCwlcjEzZAorCXhvcmwJJXIxMWQsJXIxMmQKKwlzaHJkbAkkNSwlcjEzZCwlcjEzZAorCXhvcmwJJWVieCwlcjE0ZAorCWFuZGwJJXI5ZCwlcjEyZAorCXhvcmwJJXI5ZCwlcjEzZAorCWFkZGwJNjAoJXJzcCksJWVheAorCW1vdmwJJWVieCwlZWRpCisJeG9ybAklcjExZCwlcjEyZAorCXNocmRsCSQxMSwlcjE0ZCwlcjE0ZAorCXhvcmwJJWVjeCwlZWRpCisJYWRkbAklcjEyZCwlZWF4CisJc2hyZGwJJDYsJXIxM2QsJXIxM2QKKwlhbmRsCSVlZGksJXIxNWQKKwl4b3JsCSVlYngsJXIxNGQKKwlhZGRsCSVyMTNkLCVlYXgKKwl4b3JsCSVlY3gsJXIxNWQKKwlzaHJkbAkkMiwlcjE0ZCwlcjE0ZAorCWFkZGwJJWVheCwlcjhkCisJYWRkbAklcjE1ZCwlZWF4CisJbW92bAklcjhkLCVyMTNkCisJYWRkbAklZWF4LCVyMTRkCisJbW92cQk2NCswKCVyc3ApLCVyZGkKKwltb3ZsCSVyMTRkLCVlYXgKKworCWFkZGwJMCglcmRpKSwlZWF4CisJbGVhcQk2NCglcnNpKSwlcnNpCisJYWRkbAk0KCVyZGkpLCVlYngKKwlhZGRsCTgoJXJkaSksJWVjeAorCWFkZGwJMTIoJXJkaSksJWVkeAorCWFkZGwJMTYoJXJkaSksJXI4ZAorCWFkZGwJMjAoJXJkaSksJXI5ZAorCWFkZGwJMjQoJXJkaSksJXIxMGQKKwlhZGRsCTI4KCVyZGkpLCVyMTFkCisKKwljbXBxCTY0KzE2KCVyc3ApLCVyc2kKKworCW1vdmwJJWVheCwwKCVyZGkpCisJbW92bAklZWJ4LDQoJXJkaSkKKwltb3ZsCSVlY3gsOCglcmRpKQorCW1vdmwJJWVkeCwxMiglcmRpKQorCW1vdmwJJXI4ZCwxNiglcmRpKQorCW1vdmwJJXI5ZCwyMCglcmRpKQorCW1vdmwJJXIxMGQsMjQoJXJkaSkKKwltb3ZsCSVyMTFkLDI4KCVyZGkpCisJamIJTCRsb29wX2F2eAorCisJbW92cQk4OCglcnNwKSwlcnNpCisKKwl2emVyb3VwcGVyCisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJicAorCisJbW92cQktOCglcnNpKSwlcmJ4CisKKwlsZWFxCSglcnNpKSwlcnNwCisKK0wkZXBpbG9ndWVfYXZ4OgorCS5ieXRlCTB4ZjMsMHhjMworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi14ODZfNjQuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTIteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4Zjk3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTIteDg2XzY0LlMKQEAgLTAsMCArMSw0MDgxIEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisKKy5nbG9ibAlfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKy5wcml2YXRlX2V4dGVybiBfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKworLnAyYWxpZ24JNAorX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorCisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXIxMQorCW1vdmwJMCglcjExKSwlcjlkCisJbW92bAk0KCVyMTEpLCVyMTBkCisJbW92bAk4KCVyMTEpLCVyMTFkCisJdGVzdGwJJDIwNDgsJXIxMGQKKwlqbnoJTCR4b3Bfc2hvcnRjdXQKKwlhbmRsCSQxMDczNzQxODI0LCVyOWQKKwlhbmRsCSQyNjg0MzU5NjgsJXIxMGQKKwlvcmwJJXI5ZCwlcjEwZAorCWNtcGwJJDEzNDIxNzc3OTIsJXIxMGQKKwlqZQlMJGF2eF9zaG9ydGN1dAorCW1vdnEJJXJzcCwlcmF4CisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKwlzaGxxCSQ0LCVyZHgKKwlzdWJxCSQxMjgrMzIsJXJzcAorCWxlYXEJKCVyc2ksJXJkeCw4KSwlcmR4CisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZGksMTI4KzAoJXJzcCkKKwltb3ZxCSVyc2ksMTI4KzgoJXJzcCkKKwltb3ZxCSVyZHgsMTI4KzE2KCVyc3ApCisJbW92cQklcmF4LDE1MiglcnNwKQorCitMJHByb2xvZ3VlOgorCisJbW92cQkwKCVyZGkpLCVyYXgKKwltb3ZxCTgoJXJkaSksJXJieAorCW1vdnEJMTYoJXJkaSksJXJjeAorCW1vdnEJMjQoJXJkaSksJXJkeAorCW1vdnEJMzIoJXJkaSksJXI4CisJbW92cQk0MCglcmRpKSwlcjkKKwltb3ZxCTQ4KCVyZGkpLCVyMTAKKwltb3ZxCTU2KCVyZGkpLCVyMTEKKwlqbXAJTCRsb29wCisKKy5wMmFsaWduCTQKK0wkbG9vcDoKKwltb3ZxCSVyYngsJXJkaQorCWxlYXEJSzUxMiglcmlwKSwlcmJwCisJeG9ycQklcmN4LCVyZGkKKwltb3ZxCTAoJXJzaSksJXIxMgorCW1vdnEJJXI4LCVyMTMKKwltb3ZxCSVyYXgsJXIxNAorCWJzd2FwcQklcjEyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXI5LCVyMTUKKworCXhvcnEJJXI4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTAsJXIxNQorCisJbW92cQklcjEyLDAoJXJzcCkKKwl4b3JxCSVyYXgsJXIxNAorCWFuZHEJJXI4LCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXIxMSwlcjEyCisJeG9ycQklcjEwLCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXI4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcmF4LCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcmF4LCVyMTQKKworCXhvcnEJJXJieCwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJieCwlcjExCisKKwlhbmRxCSVyMTUsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcmRpLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCWFkZHEJJXIxMiwlcjExCisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjExCisJbW92cQk4KCVyc2kpLCVyMTIKKwltb3ZxCSVyZHgsJXIxMworCW1vdnEJJXIxMSwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjgsJXJkaQorCisJeG9ycQklcmR4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcmRpCisKKwltb3ZxCSVyMTIsOCglcnNwKQorCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXIxMCwlcjEyCisJeG9ycQklcjksJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcjExLCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjExLCVyMTQKKworCXhvcnEJJXJheCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJheCwlcjEwCisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCWFkZHEJJXIxMiwlcjEwCisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXIxMAorCW1vdnEJMTYoJXJzaSksJXIxMgorCW1vdnEJJXJjeCwlcjEzCisJbW92cQklcjEwLCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyZHgsJXIxNQorCisJeG9ycQklcmN4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjE1CisKKwltb3ZxCSVyMTIsMTYoJXJzcCkKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOSwlcjEyCisJeG9ycQklcjgsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcjEwLCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjEwLCVyMTQKKworCXhvcnEJJXIxMSwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMSwlcjkKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXI5CisJYWRkcQklcjEyLCVyYngKKwlhZGRxCSVyMTIsJXI5CisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjkKKwltb3ZxCTI0KCVyc2kpLCVyMTIKKwltb3ZxCSVyYngsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyY3gsJXJkaQorCisJeG9ycQklcmJ4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXJkaQorCisJbW92cQklcjEyLDI0KCVyc3ApCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOCwlcjEyCisJeG9ycQklcmR4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXI5LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjksJXIxNAorCisJeG9ycQklcjEwLCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjEwLCVyOAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjgKKwlhZGRxCSVyMTIsJXJheAorCWFkZHEJJXIxMiwlcjgKKworCWxlYXEJMjQoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjgKKwltb3ZxCTMyKCVyc2kpLCVyMTIKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXI4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYngsJXIxNQorCisJeG9ycQklcmF4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyY3gsJXIxNQorCisJbW92cQklcjEyLDMyKCVyc3ApCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyZHgsJXIxMgorCXhvcnEJJXJjeCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyOCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI4LCVyMTQKKworCXhvcnEJJXI5LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjksJXJkeAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmR4CisJYWRkcQklcjEyLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJkeAorCW1vdnEJNDAoJXJzaSksJXIxMgorCW1vdnEJJXIxMSwlcjEzCisJbW92cQklcmR4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYXgsJXJkaQorCisJeG9ycQklcjExLCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyYngsJXJkaQorCisJbW92cQklcjEyLDQwKCVyc3ApCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcmN4LCVyMTIKKwl4b3JxCSVyYngsJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjExLCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcmR4LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcmR4LCVyMTQKKworCXhvcnEJJXI4LCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjgsJXJjeAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmN4CisJYWRkcQklcjEyLCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCisJbGVhcQkyNCglcmJwKSwlcmJwCisJYWRkcQklcjE0LCVyY3gKKwltb3ZxCTQ4KCVyc2kpLCVyMTIKKwltb3ZxCSVyMTAsJXIxMworCW1vdnEJJXJjeCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjExLCVyMTUKKworCXhvcnEJJXIxMCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTUKKworCW1vdnEJJXIxMiw0OCglcnNwKQorCXhvcnEJJXJjeCwlcjE0CisJYW5kcQklcjEwLCVyMTUKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJieCwlcjEyCisJeG9ycQklcmF4LCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXJjeCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJjeCwlcjE0CisKKwl4b3JxCSVyZHgsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyZHgsJXJieAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmJ4CisJYWRkcQklcjEyLCVyOQorCWFkZHEJJXIxMiwlcmJ4CisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcmJ4CisJbW92cQk1NiglcnNpKSwlcjEyCisJbW92cQklcjksJXIxMworCW1vdnEJJXJieCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjEwLCVyZGkKKworCXhvcnEJJXI5LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTEsJXJkaQorCisJbW92cQklcjEyLDU2KCVyc3ApCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYXgsJXIxMgorCXhvcnEJJXIxMSwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXJieCwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJieCwlcjE0CisKKwl4b3JxCSVyY3gsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyY3gsJXJheAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmF4CisJYWRkcQklcjEyLCVyOAorCWFkZHEJJXIxMiwlcmF4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJheAorCW1vdnEJNjQoJXJzaSksJXIxMgorCW1vdnEJJXI4LCVyMTMKKwltb3ZxCSVyYXgsJXIxNAorCWJzd2FwcQklcjEyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXI5LCVyMTUKKworCXhvcnEJJXI4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyMTAsJXIxNQorCisJbW92cQklcjEyLDY0KCVyc3ApCisJeG9ycQklcmF4LCVyMTQKKwlhbmRxCSVyOCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXJheCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJheCwlcjE0CisKKwl4b3JxCSVyYngsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyYngsJXIxMQorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcjExCisJYWRkcQklcjEyLCVyZHgKKwlhZGRxCSVyMTIsJXIxMQorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXIxMQorCW1vdnEJNzIoJXJzaSksJXIxMgorCW1vdnEJJXJkeCwlcjEzCisJbW92cQklcjExLCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyOCwlcmRpCisKKwl4b3JxCSVyZHgsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXI5LCVyZGkKKworCW1vdnEJJXIxMiw3MiglcnNwKQorCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXIxMCwlcjEyCisJeG9ycQklcjksJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcjExLCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjExLCVyMTQKKworCXhvcnEJJXJheCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJheCwlcjEwCisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyMTAKKwlhZGRxCSVyMTIsJXJjeAorCWFkZHEJJXIxMiwlcjEwCisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXIxMAorCW1vdnEJODAoJXJzaSksJXIxMgorCW1vdnEJJXJjeCwlcjEzCisJbW92cQklcjEwLCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyZHgsJXIxNQorCisJeG9ycQklcmN4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjE1CisKKwltb3ZxCSVyMTIsODAoJXJzcCkKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOSwlcjEyCisJeG9ycQklcjgsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcjEwLCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjEwLCVyMTQKKworCXhvcnEJJXIxMSwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMSwlcjkKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXI5CisJYWRkcQklcjEyLCVyYngKKwlhZGRxCSVyMTIsJXI5CisKKwlsZWFxCTgoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjkKKwltb3ZxCTg4KCVyc2kpLCVyMTIKKwltb3ZxCSVyYngsJXIxMworCW1vdnEJJXI5LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyY3gsJXJkaQorCisJeG9ycQklcmJ4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXJkaQorCisJbW92cQklcjEyLDg4KCVyc3ApCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOCwlcjEyCisJeG9ycQklcmR4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXI5LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjksJXIxNAorCisJeG9ycQklcjEwLCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjEwLCVyOAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjgKKwlhZGRxCSVyMTIsJXJheAorCWFkZHEJJXIxMiwlcjgKKworCWxlYXEJMjQoJXJicCksJXJicAorCWFkZHEJJXIxNCwlcjgKKwltb3ZxCTk2KCVyc2kpLCVyMTIKKwltb3ZxCSVyYXgsJXIxMworCW1vdnEJJXI4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYngsJXIxNQorCisJeG9ycQklcmF4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyY3gsJXIxNQorCisJbW92cQklcjEyLDk2KCVyc3ApCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyZHgsJXIxMgorCXhvcnEJJXJjeCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyOCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI4LCVyMTQKKworCXhvcnEJJXI5LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjksJXJkeAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmR4CisJYWRkcQklcjEyLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJkeAorCW1vdnEJMTA0KCVyc2kpLCVyMTIKKwltb3ZxCSVyMTEsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcmF4LCVyZGkKKworCXhvcnEJJXIxMSwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmJ4LCVyZGkKKworCW1vdnEJJXIxMiwxMDQoJXJzcCkKKwl4b3JxCSVyZHgsJXIxNAorCWFuZHEJJXIxMSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyY3gsJXIxMgorCXhvcnEJJXJieCwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTEsJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyZHgsJXJkaQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyZHgsJXIxNAorCisJeG9ycQklcjgsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyOCwlcmN4CisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyY3gKKwlhZGRxCSVyMTIsJXIxMAorCWFkZHEJJXIxMiwlcmN4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJjeAorCW1vdnEJMTEyKCVyc2kpLCVyMTIKKwltb3ZxCSVyMTAsJXIxMworCW1vdnEJJXJjeCwlcjE0CisJYnN3YXBxCSVyMTIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjExLCVyMTUKKworCXhvcnEJJXIxMCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTUKKworCW1vdnEJJXIxMiwxMTIoJXJzcCkKKwl4b3JxCSVyY3gsJXIxNAorCWFuZHEJJXIxMCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYngsJXIxMgorCXhvcnEJJXJheCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyY3gsJXIxNQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyY3gsJXIxNAorCisJeG9ycQklcmR4LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmR4LCVyYngKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXJieAorCWFkZHEJJXIxMiwlcjkKKwlhZGRxCSVyMTIsJXJieAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwlhZGRxCSVyMTQsJXJieAorCW1vdnEJMTIwKCVyc2kpLCVyMTIKKwltb3ZxCSVyOSwlcjEzCisJbW92cQklcmJ4LCVyMTQKKwlic3dhcHEJJXIxMgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTAsJXJkaQorCisJeG9ycQklcjksJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMSwlcmRpCisKKwltb3ZxCSVyMTIsMTIwKCVyc3ApCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYXgsJXIxMgorCXhvcnEJJXIxMSwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXJieCwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJieCwlcjE0CisKKwl4b3JxCSVyY3gsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyY3gsJXJheAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcmF4CisJYWRkcQklcjEyLCVyOAorCWFkZHEJJXIxMiwlcmF4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwlqbXAJTCRyb3VuZHNfMTZfeHgKKy5wMmFsaWduCTQKK0wkcm91bmRzXzE2X3h4OgorCW1vdnEJOCglcnNwKSwlcjEzCisJbW92cQkxMTIoJXJzcCksJXIxNQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXJheAorCW1vdnEJJXIxNSwlcjE0CisJcm9ycQkkNDIsJXIxNQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXIxNQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXIxNQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyMTUKKwlhZGRxCTcyKCVyc3ApLCVyMTIKKworCWFkZHEJMCglcnNwKSwlcjEyCisJbW92cQklcjgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisJbW92cQklcmF4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjksJXIxNQorCisJeG9ycQklcjgsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMCwlcjE1CisKKwltb3ZxCSVyMTIsMCglcnNwKQorCXhvcnEJJXJheCwlcjE0CisJYW5kcQklcjgsJXIxNQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcjExLCVyMTIKKwl4b3JxCSVyMTAsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyYXgsJXIxNQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyYXgsJXIxNAorCisJeG9ycQklcmJ4LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmJ4LCVyMTEKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXIxMQorCWFkZHEJJXIxMiwlcmR4CisJYWRkcQklcjEyLCVyMTEKKworCWxlYXEJOCglcmJwKSwlcmJwCisJbW92cQkxNiglcnNwKSwlcjEzCisJbW92cQkxMjAoJXJzcCksJXJkaQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXIxMQorCW1vdnEJJXJkaSwlcjE0CisJcm9ycQkkNDIsJXJkaQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXJkaQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXJkaQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyZGkKKwlhZGRxCTgwKCVyc3ApLCVyMTIKKworCWFkZHEJOCglcnNwKSwlcjEyCisJbW92cQklcmR4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXIxMSwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXI4LCVyZGkKKworCXhvcnEJJXJkeCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjksJXJkaQorCisJbW92cQklcjEyLDgoJXJzcCkKKwl4b3JxCSVyMTEsJXIxNAorCWFuZHEJJXJkeCwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyMTAsJXIxMgorCXhvcnEJJXI5LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJkeCwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXIxMSwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXIxMSwlcjE0CisKKwl4b3JxCSVyYXgsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyYXgsJXIxMAorCisJYW5kcQklcmRpLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXIxNSwlcjEwCisJYWRkcQklcjEyLCVyY3gKKwlhZGRxCSVyMTIsJXIxMAorCisJbGVhcQkyNCglcmJwKSwlcmJwCisJbW92cQkyNCglcnNwKSwlcjEzCisJbW92cQkwKCVyc3ApLCVyMTUKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyMTAKKwltb3ZxCSVyMTUsJXIxNAorCXJvcnEJJDQyLCVyMTUKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyMTUKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyMTUKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcjE1CisJYWRkcQk4OCglcnNwKSwlcjEyCisKKwlhZGRxCTE2KCVyc3ApLCVyMTIKKwltb3ZxCSVyY3gsJXIxMworCWFkZHEJJXIxNSwlcjEyCisJbW92cQklcjEwLCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcmR4LCVyMTUKKworCXhvcnEJJXJjeCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjgsJXIxNQorCisJbW92cQklcjEyLDE2KCVyc3ApCisJeG9ycQklcjEwLCVyMTQKKwlhbmRxCSVyY3gsJXIxNQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcjksJXIxMgorCXhvcnEJJXI4LCVyMTUKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJjeCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKworCW1vdnEJJXIxMCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXIxMCwlcjE0CisKKwl4b3JxCSVyMTEsJXIxNQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyMTEsJXI5CisKKwlhbmRxCSVyMTUsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcmRpLCVyOQorCWFkZHEJJXIxMiwlcmJ4CisJYWRkcQklcjEyLCVyOQorCisJbGVhcQk4KCVyYnApLCVyYnAKKwltb3ZxCTMyKCVyc3ApLCVyMTMKKwltb3ZxCTgoJXJzcCksJXJkaQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXI5CisJbW92cQklcmRpLCVyMTQKKwlyb3JxCSQ0MiwlcmRpCisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcmRpCisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcmRpCisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXJkaQorCWFkZHEJOTYoJXJzcCksJXIxMgorCisJYWRkcQkyNCglcnNwKSwlcjEyCisJbW92cQklcmJ4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXI5LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcmN4LCVyZGkKKworCXhvcnEJJXJieCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmR4LCVyZGkKKworCW1vdnEJJXIxMiwyNCglcnNwKQorCXhvcnEJJXI5LCVyMTQKKwlhbmRxCSVyYngsJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcjgsJXIxMgorCXhvcnEJJXJkeCwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYngsJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyOSwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI5LCVyMTQKKworCXhvcnEJJXIxMCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMCwlcjgKKworCWFuZHEJJXJkaSwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyMTUsJXI4CisJYWRkcQklcjEyLCVyYXgKKwlhZGRxCSVyMTIsJXI4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwltb3ZxCTQwKCVyc3ApLCVyMTMKKwltb3ZxCTE2KCVyc3ApLCVyMTUKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyOAorCW1vdnEJJXIxNSwlcjE0CisJcm9ycQkkNDIsJXIxNQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXIxNQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXIxNQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyMTUKKwlhZGRxCTEwNCglcnNwKSwlcjEyCisKKwlhZGRxCTMyKCVyc3ApLCVyMTIKKwltb3ZxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisJbW92cQklcjgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYngsJXIxNQorCisJeG9ycQklcmF4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyY3gsJXIxNQorCisJbW92cQklcjEyLDMyKCVyc3ApCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyZHgsJXIxMgorCXhvcnEJJXJjeCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyOCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI4LCVyMTQKKworCXhvcnEJJXI5LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjksJXJkeAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmR4CisJYWRkcQklcjEyLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwltb3ZxCTQ4KCVyc3ApLCVyMTMKKwltb3ZxCTI0KCVyc3ApLCVyZGkKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyZHgKKwltb3ZxCSVyZGksJXIxNAorCXJvcnEJJDQyLCVyZGkKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyZGkKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyZGkKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcmRpCisJYWRkcQkxMTIoJXJzcCksJXIxMgorCisJYWRkcQk0MCglcnNwKSwlcjEyCisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXJkeCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXJheCwlcmRpCisKKwl4b3JxCSVyMTEsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJieCwlcmRpCisKKwltb3ZxCSVyMTIsNDAoJXJzcCkKKwl4b3JxCSVyZHgsJXIxNAorCWFuZHEJJXIxMSwlcmRpCisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyY3gsJXIxMgorCXhvcnEJJXJieCwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTEsJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyZHgsJXJkaQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyZHgsJXIxNAorCisJeG9ycQklcjgsJXJkaQorCXJvcnEJJDE0LCVyMTMKKwltb3ZxCSVyOCwlcmN4CisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyY3gKKwlhZGRxCSVyMTIsJXIxMAorCWFkZHEJJXIxMiwlcmN4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwltb3ZxCTU2KCVyc3ApLCVyMTMKKwltb3ZxCTMyKCVyc3ApLCVyMTUKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyY3gKKwltb3ZxCSVyMTUsJXIxNAorCXJvcnEJJDQyLCVyMTUKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyMTUKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyMTUKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcjE1CisJYWRkcQkxMjAoJXJzcCksJXIxMgorCisJYWRkcQk0OCglcnNwKSwlcjEyCisJbW92cQklcjEwLCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCW1vdnEJJXJjeCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxMSwlcjE1CisKKwl4b3JxCSVyMTAsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJheCwlcjE1CisKKwltb3ZxCSVyMTIsNDgoJXJzcCkKKwl4b3JxCSVyY3gsJXIxNAorCWFuZHEJJXIxMCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyYngsJXIxMgorCXhvcnEJJXJheCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyY3gsJXIxNQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyY3gsJXIxNAorCisJeG9ycQklcmR4LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmR4LCVyYngKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXJieAorCWFkZHEJJXIxMiwlcjkKKwlhZGRxCSVyMTIsJXJieAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwltb3ZxCTY0KCVyc3ApLCVyMTMKKwltb3ZxCTQwKCVyc3ApLCVyZGkKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyYngKKwltb3ZxCSVyZGksJXIxNAorCXJvcnEJJDQyLCVyZGkKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyZGkKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyZGkKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcmRpCisJYWRkcQkwKCVyc3ApLCVyMTIKKworCWFkZHEJNTYoJXJzcCksJXIxMgorCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXJieCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxMCwlcmRpCisKKwl4b3JxCSVyOSwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjExLCVyZGkKKworCW1vdnEJJXIxMiw1NiglcnNwKQorCXhvcnEJJXJieCwlcjE0CisJYW5kcQklcjksJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcmF4LCVyMTIKKwl4b3JxCSVyMTEsJXJkaQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjksJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyYngsJXJkaQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyYngsJXIxNAorCisJeG9ycQklcmN4LCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmN4LCVyYXgKKworCWFuZHEJJXJkaSwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyMTUsJXJheAorCWFkZHEJJXIxMiwlcjgKKwlhZGRxCSVyMTIsJXJheAorCisJbGVhcQkyNCglcmJwKSwlcmJwCisJbW92cQk3MiglcnNwKSwlcjEzCisJbW92cQk0OCglcnNwKSwlcjE1CisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcmF4CisJbW92cQklcjE1LCVyMTQKKwlyb3JxCSQ0MiwlcjE1CisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcjE1CisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcjE1CisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXIxNQorCWFkZHEJOCglcnNwKSwlcjEyCisKKwlhZGRxCTY0KCVyc3ApLCVyMTIKKwltb3ZxCSVyOCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKwltb3ZxCSVyYXgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyOSwlcjE1CisKKwl4b3JxCSVyOCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjEwLCVyMTUKKworCW1vdnEJJXIxMiw2NCglcnNwKQorCXhvcnEJJXJheCwlcjE0CisJYW5kcQklcjgsJXIxNQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcjExLCVyMTIKKwl4b3JxCSVyMTAsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyYXgsJXIxNQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyYXgsJXIxNAorCisJeG9ycQklcmJ4LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmJ4LCVyMTEKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXIxMQorCWFkZHEJJXIxMiwlcmR4CisJYWRkcQklcjEyLCVyMTEKKworCWxlYXEJOCglcmJwKSwlcmJwCisJbW92cQk4MCglcnNwKSwlcjEzCisJbW92cQk1NiglcnNwKSwlcmRpCisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcjExCisJbW92cQklcmRpLCVyMTQKKwlyb3JxCSQ0MiwlcmRpCisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcmRpCisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcmRpCisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXJkaQorCWFkZHEJMTYoJXJzcCksJXIxMgorCisJYWRkcQk3MiglcnNwKSwlcjEyCisJbW92cQklcmR4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXIxMSwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXI4LCVyZGkKKworCXhvcnEJJXJkeCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjksJXJkaQorCisJbW92cQklcjEyLDcyKCVyc3ApCisJeG9ycQklcjExLCVyMTQKKwlhbmRxCSVyZHgsJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcjEwLCVyMTIKKwl4b3JxCSVyOSwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyZHgsJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyMTEsJXJkaQorCWFkZHEJKCVyYnApLCVyMTIKKwl4b3JxCSVyMTEsJXIxNAorCisJeG9ycQklcmF4LCVyZGkKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcmF4LCVyMTAKKworCWFuZHEJJXJkaSwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyMTUsJXIxMAorCWFkZHEJJXIxMiwlcmN4CisJYWRkcQklcjEyLCVyMTAKKworCWxlYXEJMjQoJXJicCksJXJicAorCW1vdnEJODgoJXJzcCksJXIxMworCW1vdnEJNjQoJXJzcCksJXIxNQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXIxMAorCW1vdnEJJXIxNSwlcjE0CisJcm9ycQkkNDIsJXIxNQorCisJeG9ycQklcjEyLCVyMTMKKwlzaHJxCSQ3LCVyMTIKKwlyb3JxCSQxLCVyMTMKKwl4b3JxCSVyMTQsJXIxNQorCXNocnEJJDYsJXIxNAorCisJcm9ycQkkMTksJXIxNQorCXhvcnEJJXIxMywlcjEyCisJeG9ycQklcjE0LCVyMTUKKwlhZGRxCTI0KCVyc3ApLCVyMTIKKworCWFkZHEJODAoJXJzcCksJXIxMgorCW1vdnEJJXJjeCwlcjEzCisJYWRkcQklcjE1LCVyMTIKKwltb3ZxCSVyMTAsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyZHgsJXIxNQorCisJeG9ycQklcmN4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjE1CisKKwltb3ZxCSVyMTIsODAoJXJzcCkKKwl4b3JxCSVyMTAsJXIxNAorCWFuZHEJJXJjeCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyOSwlcjEyCisJeG9ycQklcjgsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcjEwLCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcjEwLCVyMTQKKworCXhvcnEJJXIxMSwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMSwlcjkKKworCWFuZHEJJXIxNSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyZGksJXI5CisJYWRkcQklcjEyLCVyYngKKwlhZGRxCSVyMTIsJXI5CisKKwlsZWFxCTgoJXJicCksJXJicAorCW1vdnEJOTYoJXJzcCksJXIxMworCW1vdnEJNzIoJXJzcCksJXJkaQorCisJbW92cQklcjEzLCVyMTIKKwlyb3JxCSQ3LCVyMTMKKwlhZGRxCSVyMTQsJXI5CisJbW92cQklcmRpLCVyMTQKKwlyb3JxCSQ0MiwlcmRpCisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcmRpCisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcmRpCisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXJkaQorCWFkZHEJMzIoJXJzcCksJXIxMgorCisJYWRkcQk4OCglcnNwKSwlcjEyCisJbW92cQklcmJ4LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXI5LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcmN4LCVyZGkKKworCXhvcnEJJXJieCwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmR4LCVyZGkKKworCW1vdnEJJXIxMiw4OCglcnNwKQorCXhvcnEJJXI5LCVyMTQKKwlhbmRxCSVyYngsJXJkaQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcjgsJXIxMgorCXhvcnEJJXJkeCwlcmRpCisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYngsJXIxMworCWFkZHEJJXJkaSwlcjEyCisKKwltb3ZxCSVyOSwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI5LCVyMTQKKworCXhvcnEJJXIxMCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXIxMCwlcjgKKworCWFuZHEJJXJkaSwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyMTUsJXI4CisJYWRkcQklcjEyLCVyYXgKKwlhZGRxCSVyMTIsJXI4CisKKwlsZWFxCTI0KCVyYnApLCVyYnAKKwltb3ZxCTEwNCglcnNwKSwlcjEzCisJbW92cQk4MCglcnNwKSwlcjE1CisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcjgKKwltb3ZxCSVyMTUsJXIxNAorCXJvcnEJJDQyLCVyMTUKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyMTUKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyMTUKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcjE1CisJYWRkcQk0MCglcnNwKSwlcjEyCisKKwlhZGRxCTk2KCVyc3ApLCVyMTIKKwltb3ZxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisJbW92cQklcjgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYngsJXIxNQorCisJeG9ycQklcmF4LCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyY3gsJXIxNQorCisJbW92cQklcjEyLDk2KCVyc3ApCisJeG9ycQklcjgsJXIxNAorCWFuZHEJJXJheCwlcjE1CisKKwlyb3JxCSQ0LCVyMTMKKwlhZGRxCSVyZHgsJXIxMgorCXhvcnEJJXJjeCwlcjE1CisKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJJXIxNSwlcjEyCisKKwltb3ZxCSVyOCwlcjE1CisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXI4LCVyMTQKKworCXhvcnEJJXI5LCVyMTUKKwlyb3JxCSQxNCwlcjEzCisJbW92cQklcjksJXJkeAorCisJYW5kcQklcjE1LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjEzLCVyMTIKKworCXhvcnEJJXJkaSwlcmR4CisJYWRkcQklcjEyLCVyMTEKKwlhZGRxCSVyMTIsJXJkeAorCisJbGVhcQk4KCVyYnApLCVyYnAKKwltb3ZxCTExMiglcnNwKSwlcjEzCisJbW92cQk4OCglcnNwKSwlcmRpCisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcmR4CisJbW92cQklcmRpLCVyMTQKKwlyb3JxCSQ0MiwlcmRpCisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcmRpCisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcmRpCisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXJkaQorCWFkZHEJNDgoJXJzcCksJXIxMgorCisJYWRkcQkxMDQoJXJzcCksJXIxMgorCW1vdnEJJXIxMSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKwltb3ZxCSVyZHgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyYXgsJXJkaQorCisJeG9ycQklcjExLCVyMTMKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyYngsJXJkaQorCisJbW92cQklcjEyLDEwNCglcnNwKQorCXhvcnEJJXJkeCwlcjE0CisJYW5kcQklcjExLCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJjeCwlcjEyCisJeG9ycQklcmJ4LCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJYWRkcQklcmRpLCVyMTIKKworCW1vdnEJJXJkeCwlcmRpCisJYWRkcQkoJXJicCksJXIxMgorCXhvcnEJJXJkeCwlcjE0CisKKwl4b3JxCSVyOCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXI4LCVyY3gKKworCWFuZHEJJXJkaSwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMywlcjEyCisKKwl4b3JxCSVyMTUsJXJjeAorCWFkZHEJJXIxMiwlcjEwCisJYWRkcQklcjEyLCVyY3gKKworCWxlYXEJMjQoJXJicCksJXJicAorCW1vdnEJMTIwKCVyc3ApLCVyMTMKKwltb3ZxCTk2KCVyc3ApLCVyMTUKKworCW1vdnEJJXIxMywlcjEyCisJcm9ycQkkNywlcjEzCisJYWRkcQklcjE0LCVyY3gKKwltb3ZxCSVyMTUsJXIxNAorCXJvcnEJJDQyLCVyMTUKKworCXhvcnEJJXIxMiwlcjEzCisJc2hycQkkNywlcjEyCisJcm9ycQkkMSwlcjEzCisJeG9ycQklcjE0LCVyMTUKKwlzaHJxCSQ2LCVyMTQKKworCXJvcnEJJDE5LCVyMTUKKwl4b3JxCSVyMTMsJXIxMgorCXhvcnEJJXIxNCwlcjE1CisJYWRkcQk1NiglcnNwKSwlcjEyCisKKwlhZGRxCTExMiglcnNwKSwlcjEyCisJbW92cQklcjEwLCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCW1vdnEJJXJjeCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxMSwlcjE1CisKKwl4b3JxCSVyMTAsJXIxMworCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJheCwlcjE1CisKKwltb3ZxCSVyMTIsMTEyKCVyc3ApCisJeG9ycQklcmN4LCVyMTQKKwlhbmRxCSVyMTAsJXIxNQorCisJcm9ycQkkNCwlcjEzCisJYWRkcQklcmJ4LCVyMTIKKwl4b3JxCSVyYXgsJXIxNQorCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjEwLCVyMTMKKwlhZGRxCSVyMTUsJXIxMgorCisJbW92cQklcmN4LCVyMTUKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcmN4LCVyMTQKKworCXhvcnEJJXJkeCwlcjE1CisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJkeCwlcmJ4CisKKwlhbmRxCSVyMTUsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcmRpLCVyYngKKwlhZGRxCSVyMTIsJXI5CisJYWRkcQklcjEyLCVyYngKKworCWxlYXEJOCglcmJwKSwlcmJwCisJbW92cQkwKCVyc3ApLCVyMTMKKwltb3ZxCTEwNCglcnNwKSwlcmRpCisKKwltb3ZxCSVyMTMsJXIxMgorCXJvcnEJJDcsJXIxMworCWFkZHEJJXIxNCwlcmJ4CisJbW92cQklcmRpLCVyMTQKKwlyb3JxCSQ0MiwlcmRpCisKKwl4b3JxCSVyMTIsJXIxMworCXNocnEJJDcsJXIxMgorCXJvcnEJJDEsJXIxMworCXhvcnEJJXIxNCwlcmRpCisJc2hycQkkNiwlcjE0CisKKwlyb3JxCSQxOSwlcmRpCisJeG9ycQklcjEzLCVyMTIKKwl4b3JxCSVyMTQsJXJkaQorCWFkZHEJNjQoJXJzcCksJXIxMgorCisJYWRkcQkxMjAoJXJzcCksJXIxMgorCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCW1vdnEJJXJieCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxMCwlcmRpCisKKwl4b3JxCSVyOSwlcjEzCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjExLCVyZGkKKworCW1vdnEJJXIxMiwxMjAoJXJzcCkKKwl4b3JxCSVyYngsJXIxNAorCWFuZHEJJXI5LCVyZGkKKworCXJvcnEJJDQsJXIxMworCWFkZHEJJXJheCwlcjEyCisJeG9ycQklcjExLCVyZGkKKworCXJvcnEJJDYsJXIxNAorCXhvcnEJJXI5LCVyMTMKKwlhZGRxCSVyZGksJXIxMgorCisJbW92cQklcmJ4LCVyZGkKKwlhZGRxCSglcmJwKSwlcjEyCisJeG9ycQklcmJ4LCVyMTQKKworCXhvcnEJJXJjeCwlcmRpCisJcm9ycQkkMTQsJXIxMworCW1vdnEJJXJjeCwlcmF4CisKKwlhbmRxCSVyZGksJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMgorCisJeG9ycQklcjE1LCVyYXgKKwlhZGRxCSVyMTIsJXI4CisJYWRkcQklcjEyLCVyYXgKKworCWxlYXEJMjQoJXJicCksJXJicAorCWNtcGIJJDAsNyglcmJwKQorCWpueglMJHJvdW5kc18xNl94eAorCisJbW92cQkxMjgrMCglcnNwKSwlcmRpCisJYWRkcQklcjE0LCVyYXgKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisKKwlhZGRxCTAoJXJkaSksJXJheAorCWFkZHEJOCglcmRpKSwlcmJ4CisJYWRkcQkxNiglcmRpKSwlcmN4CisJYWRkcQkyNCglcmRpKSwlcmR4CisJYWRkcQkzMiglcmRpKSwlcjgKKwlhZGRxCTQwKCVyZGkpLCVyOQorCWFkZHEJNDgoJXJkaSksJXIxMAorCWFkZHEJNTYoJXJkaSksJXIxMQorCisJY21wcQkxMjgrMTYoJXJzcCksJXJzaQorCisJbW92cQklcmF4LDAoJXJkaSkKKwltb3ZxCSVyYngsOCglcmRpKQorCW1vdnEJJXJjeCwxNiglcmRpKQorCW1vdnEJJXJkeCwyNCglcmRpKQorCW1vdnEJJXI4LDMyKCVyZGkpCisJbW92cQklcjksNDAoJXJkaSkKKwltb3ZxCSVyMTAsNDgoJXJkaSkKKwltb3ZxCSVyMTEsNTYoJXJkaSkKKwlqYglMJGxvb3AKKworCW1vdnEJMTUyKCVyc3ApLCVyc2kKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYnAKKworCW1vdnEJLTgoJXJzaSksJXJieAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJGVwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5wMmFsaWduCTYKKworSzUxMjoKKy5xdWFkCTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKy5xdWFkCTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKy5xdWFkCTB4YjVjMGZiY2ZlYzRkM2IyZiwweGU5YjVkYmE1ODE4OWRiYmMKKy5xdWFkCTB4YjVjMGZiY2ZlYzRkM2IyZiwweGU5YjVkYmE1ODE4OWRiYmMKKy5xdWFkCTB4Mzk1NmMyNWJmMzQ4YjUzOCwweDU5ZjExMWYxYjYwNWQwMTkKKy5xdWFkCTB4Mzk1NmMyNWJmMzQ4YjUzOCwweDU5ZjExMWYxYjYwNWQwMTkKKy5xdWFkCTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKy5xdWFkCTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKy5xdWFkCTB4ZDgwN2FhOThhMzAzMDI0MiwweDEyODM1YjAxNDU3MDZmYmUKKy5xdWFkCTB4ZDgwN2FhOThhMzAzMDI0MiwweDEyODM1YjAxNDU3MDZmYmUKKy5xdWFkCTB4MjQzMTg1YmU0ZWU0YjI4YywweDU1MGM3ZGMzZDVmZmI0ZTIKKy5xdWFkCTB4MjQzMTg1YmU0ZWU0YjI4YywweDU1MGM3ZGMzZDVmZmI0ZTIKKy5xdWFkCTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKy5xdWFkCTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKy5xdWFkCTB4OWJkYzA2YTcyNWM3MTIzNSwweGMxOWJmMTc0Y2Y2OTI2OTQKKy5xdWFkCTB4OWJkYzA2YTcyNWM3MTIzNSwweGMxOWJmMTc0Y2Y2OTI2OTQKKy5xdWFkCTB4ZTQ5YjY5YzE5ZWYxNGFkMiwweGVmYmU0Nzg2Mzg0ZjI1ZTMKKy5xdWFkCTB4ZTQ5YjY5YzE5ZWYxNGFkMiwweGVmYmU0Nzg2Mzg0ZjI1ZTMKKy5xdWFkCTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKy5xdWFkCTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKy5xdWFkCTB4MmRlOTJjNmY1OTJiMDI3NSwweDRhNzQ4NGFhNmVhNmU0ODMKKy5xdWFkCTB4MmRlOTJjNmY1OTJiMDI3NSwweDRhNzQ4NGFhNmVhNmU0ODMKKy5xdWFkCTB4NWNiMGE5ZGNiZDQxZmJkNCwweDc2Zjk4OGRhODMxMTUzYjUKKy5xdWFkCTB4NWNiMGE5ZGNiZDQxZmJkNCwweDc2Zjk4OGRhODMxMTUzYjUKKy5xdWFkCTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKy5xdWFkCTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKy5xdWFkCTB4YjAwMzI3Yzg5OGZiMjEzZiwweGJmNTk3ZmM3YmVlZjBlZTQKKy5xdWFkCTB4YjAwMzI3Yzg5OGZiMjEzZiwweGJmNTk3ZmM3YmVlZjBlZTQKKy5xdWFkCTB4YzZlMDBiZjMzZGE4OGZjMiwweGQ1YTc5MTQ3OTMwYWE3MjUKKy5xdWFkCTB4YzZlMDBiZjMzZGE4OGZjMiwweGQ1YTc5MTQ3OTMwYWE3MjUKKy5xdWFkCTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKy5xdWFkCTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKy5xdWFkCTB4MjdiNzBhODU0NmQyMmZmYywweDJlMWIyMTM4NWMyNmM5MjYKKy5xdWFkCTB4MjdiNzBhODU0NmQyMmZmYywweDJlMWIyMTM4NWMyNmM5MjYKKy5xdWFkCTB4NGQyYzZkZmM1YWM0MmFlZCwweDUzMzgwZDEzOWQ5NWIzZGYKKy5xdWFkCTB4NGQyYzZkZmM1YWM0MmFlZCwweDUzMzgwZDEzOWQ5NWIzZGYKKy5xdWFkCTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKy5xdWFkCTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKy5xdWFkCTB4ODFjMmM5MmU0N2VkYWVlNiwweDkyNzIyYzg1MTQ4MjM1M2IKKy5xdWFkCTB4ODFjMmM5MmU0N2VkYWVlNiwweDkyNzIyYzg1MTQ4MjM1M2IKKy5xdWFkCTB4YTJiZmU4YTE0Y2YxMDM2NCwweGE4MWE2NjRiYmM0MjMwMDEKKy5xdWFkCTB4YTJiZmU4YTE0Y2YxMDM2NCwweGE4MWE2NjRiYmM0MjMwMDEKKy5xdWFkCTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKy5xdWFkCTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKy5xdWFkCTB4ZDE5MmU4MTlkNmVmNTIxOCwweGQ2OTkwNjI0NTU2NWE5MTAKKy5xdWFkCTB4ZDE5MmU4MTlkNmVmNTIxOCwweGQ2OTkwNjI0NTU2NWE5MTAKKy5xdWFkCTB4ZjQwZTM1ODU1NzcxMjAyYSwweDEwNmFhMDcwMzJiYmQxYjgKKy5xdWFkCTB4ZjQwZTM1ODU1NzcxMjAyYSwweDEwNmFhMDcwMzJiYmQxYjgKKy5xdWFkCTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKy5xdWFkCTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKy5xdWFkCTB4Mjc0ODc3NGNkZjhlZWI5OSwweDM0YjBiY2I1ZTE5YjQ4YTgKKy5xdWFkCTB4Mjc0ODc3NGNkZjhlZWI5OSwweDM0YjBiY2I1ZTE5YjQ4YTgKKy5xdWFkCTB4MzkxYzBjYjNjNWM5NWE2MywweDRlZDhhYTRhZTM0MThhY2IKKy5xdWFkCTB4MzkxYzBjYjNjNWM5NWE2MywweDRlZDhhYTRhZTM0MThhY2IKKy5xdWFkCTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKy5xdWFkCTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKy5xdWFkCTB4NzQ4ZjgyZWU1ZGVmYjJmYywweDc4YTU2MzZmNDMxNzJmNjAKKy5xdWFkCTB4NzQ4ZjgyZWU1ZGVmYjJmYywweDc4YTU2MzZmNDMxNzJmNjAKKy5xdWFkCTB4ODRjODc4MTRhMWYwYWI3MiwweDhjYzcwMjA4MWE2NDM5ZWMKKy5xdWFkCTB4ODRjODc4MTRhMWYwYWI3MiwweDhjYzcwMjA4MWE2NDM5ZWMKKy5xdWFkCTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKy5xdWFkCTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKy5xdWFkCTB4YmVmOWEzZjdiMmM2NzkxNSwweGM2NzE3OGYyZTM3MjUzMmIKKy5xdWFkCTB4YmVmOWEzZjdiMmM2NzkxNSwweGM2NzE3OGYyZTM3MjUzMmIKKy5xdWFkCTB4Y2EyNzNlY2VlYTI2NjE5YywweGQxODZiOGM3MjFjMGMyMDcKKy5xdWFkCTB4Y2EyNzNlY2VlYTI2NjE5YywweGQxODZiOGM3MjFjMGMyMDcKKy5xdWFkCTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKy5xdWFkCTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKy5xdWFkCTB4MDZmMDY3YWE3MjE3NmZiYSwweDBhNjM3ZGM1YTJjODk4YTYKKy5xdWFkCTB4MDZmMDY3YWE3MjE3NmZiYSwweDBhNjM3ZGM1YTJjODk4YTYKKy5xdWFkCTB4MTEzZjk4MDRiZWY5MGRhZSwweDFiNzEwYjM1MTMxYzQ3MWIKKy5xdWFkCTB4MTEzZjk4MDRiZWY5MGRhZSwweDFiNzEwYjM1MTMxYzQ3MWIKKy5xdWFkCTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKy5xdWFkCTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKy5xdWFkCTB4M2M5ZWJlMGExNWM5YmViYywweDQzMWQ2N2M0OWMxMDBkNGMKKy5xdWFkCTB4M2M5ZWJlMGExNWM5YmViYywweDQzMWQ2N2M0OWMxMDBkNGMKKy5xdWFkCTB4NGNjNWQ0YmVjYjNlNDJiNiwweDU5N2YyOTljZmM2NTdlMmEKKy5xdWFkCTB4NGNjNWQ0YmVjYjNlNDJiNiwweDU5N2YyOTljZmM2NTdlMmEKKy5xdWFkCTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKKy5xdWFkCTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKKworLnF1YWQJMHgwMDAxMDIwMzA0MDUwNjA3LDB4MDgwOTBhMGIwYzBkMGUwZgorLnF1YWQJMHgwMDAxMDIwMzA0MDUwNjA3LDB4MDgwOTBhMGIwYzBkMGUwZgorLmJ5dGUJODMsNzIsNjUsNTMsNDksNTAsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorCisucDJhbGlnbgk2CitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl94b3A6CisKK0wkeG9wX3Nob3J0Y3V0OgorCW1vdnEJJXJzcCwlcmF4CisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKwlzaGxxCSQ0LCVyZHgKKwlzdWJxCSQxNjAsJXJzcAorCWxlYXEJKCVyc2ksJXJkeCw4KSwlcmR4CisJYW5kcQkkLTY0LCVyc3AKKwltb3ZxCSVyZGksMTI4KzAoJXJzcCkKKwltb3ZxCSVyc2ksMTI4KzgoJXJzcCkKKwltb3ZxCSVyZHgsMTI4KzE2KCVyc3ApCisJbW92cQklcmF4LDE1MiglcnNwKQorCitMJHByb2xvZ3VlX3hvcDoKKworCXZ6ZXJvdXBwZXIKKwltb3ZxCTAoJXJkaSksJXJheAorCW1vdnEJOCglcmRpKSwlcmJ4CisJbW92cQkxNiglcmRpKSwlcmN4CisJbW92cQkyNCglcmRpKSwlcmR4CisJbW92cQkzMiglcmRpKSwlcjgKKwltb3ZxCTQwKCVyZGkpLCVyOQorCW1vdnEJNDgoJXJkaSksJXIxMAorCW1vdnEJNTYoJXJkaSksJXIxMQorCWptcAlMJGxvb3BfeG9wCisucDJhbGlnbgk0CitMJGxvb3BfeG9wOgorCXZtb3ZkcWEJSzUxMisxMjgwKCVyaXApLCV4bW0xMQorCXZtb3ZkcXUJMCglcnNpKSwleG1tMAorCWxlYXEJSzUxMisxMjgoJXJpcCksJXJicAorCXZtb3ZkcXUJMTYoJXJzaSksJXhtbTEKKwl2bW92ZHF1CTMyKCVyc2kpLCV4bW0yCisJdnBzaHVmYgkleG1tMTEsJXhtbTAsJXhtbTAKKwl2bW92ZHF1CTQ4KCVyc2kpLCV4bW0zCisJdnBzaHVmYgkleG1tMTEsJXhtbTEsJXhtbTEKKwl2bW92ZHF1CTY0KCVyc2kpLCV4bW00CisJdnBzaHVmYgkleG1tMTEsJXhtbTIsJXhtbTIKKwl2bW92ZHF1CTgwKCVyc2kpLCV4bW01CisJdnBzaHVmYgkleG1tMTEsJXhtbTMsJXhtbTMKKwl2bW92ZHF1CTk2KCVyc2kpLCV4bW02CisJdnBzaHVmYgkleG1tMTEsJXhtbTQsJXhtbTQKKwl2bW92ZHF1CTExMiglcnNpKSwleG1tNworCXZwc2h1ZmIJJXhtbTExLCV4bW01LCV4bW01CisJdnBhZGRxCS0xMjgoJXJicCksJXhtbTAsJXhtbTgKKwl2cHNodWZiCSV4bW0xMSwleG1tNiwleG1tNgorCXZwYWRkcQktOTYoJXJicCksJXhtbTEsJXhtbTkKKwl2cHNodWZiCSV4bW0xMSwleG1tNywleG1tNworCXZwYWRkcQktNjQoJXJicCksJXhtbTIsJXhtbTEwCisJdnBhZGRxCS0zMiglcmJwKSwleG1tMywleG1tMTEKKwl2bW92ZHFhCSV4bW04LDAoJXJzcCkKKwl2cGFkZHEJMCglcmJwKSwleG1tNCwleG1tOAorCXZtb3ZkcWEJJXhtbTksMTYoJXJzcCkKKwl2cGFkZHEJMzIoJXJicCksJXhtbTUsJXhtbTkKKwl2bW92ZHFhCSV4bW0xMCwzMiglcnNwKQorCXZwYWRkcQk2NCglcmJwKSwleG1tNiwleG1tMTAKKwl2bW92ZHFhCSV4bW0xMSw0OCglcnNwKQorCXZwYWRkcQk5NiglcmJwKSwleG1tNywleG1tMTEKKwl2bW92ZHFhCSV4bW04LDY0KCVyc3ApCisJbW92cQklcmF4LCVyMTQKKwl2bW92ZHFhCSV4bW05LDgwKCVyc3ApCisJbW92cQklcmJ4LCVyZGkKKwl2bW92ZHFhCSV4bW0xMCw5NiglcnNwKQorCXhvcnEJJXJjeCwlcmRpCisJdm1vdmRxYQkleG1tMTEsMTEyKCVyc3ApCisJbW92cQklcjgsJXIxMworCWptcAlMJHhvcF8wMF80NworCisucDJhbGlnbgk0CitMJHhvcF8wMF80NzoKKwlhZGRxCSQyNTYsJXJicAorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW04CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmF4CisJdnBhbGlnbnIJJDgsJXhtbTQsJXhtbTUsJXhtbTExCisJbW92cQklcjksJXIxMgorCXJvcnEJJDUsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAwLDU2CisJeG9ycQklcjgsJXIxMworCXhvcnEJJXIxMCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmF4LCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW0wLCV4bW0wCisJYW5kcQklcjgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwlhZGRxCTAoJXJzcCksJXIxMQorCW1vdnEJJXJheCwlcjE1CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcnEJJXIxMCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwl4b3JxCSVyYngsJXIxNQorCWFkZHEJJXIxMiwlcjExCisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjIzLDMKKwl4b3JxCSVyYXgsJXIxNAorCWFkZHEJJXIxMywlcjExCisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmJ4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJdnBzcmxxCSQ2LCV4bW03LCV4bW0xMAorCWFkZHEJJXIxMSwlcmR4CisJYWRkcQklcmRpLCVyMTEKKwl2cGFkZHEJJXhtbTgsJXhtbTAsJXhtbTAKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXIxMSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDMsNDIKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyMTEKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCW1vdnEJJXI4LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyZHgsJXIxMworCXhvcnEJJXI5LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjExLCVyMTQKKwlhbmRxCSVyZHgsJXIxMgorCXhvcnEJJXJkeCwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tMCwleG1tMAorCWFkZHEJOCglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnBhZGRxCS0xMjgoJXJicCksJXhtbTAsJXhtbTEwCisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDAoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCXZwYWxpZ25yCSQ4LCV4bW01LCV4bW02LCV4bW0xMQorCW1vdnEJJXJkeCwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyY3gsJXIxMworCXhvcnEJJXI4LCVyMTIKKwl2cHNybHEJJDcsJXhtbTgsJXhtbTgKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyMTAsJXIxNAorCXZwYWRkcQkleG1tMTEsJXhtbTEsJXhtbTEKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJYWRkcQkxNiglcnNwKSwlcjkKKwltb3ZxCSVyMTAsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyOCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwl4b3JxCSVyMTEsJXIxNQorCWFkZHEJJXIxMiwlcjkKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKy5ieXRlCTE0MywxMDQsMTIwLDE5NSwyMTYsMworCXhvcnEJJXIxMCwlcjE0CisJYWRkcQklcjEzLCVyOQorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXIxMSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tMCwleG1tMTAKKwlhZGRxCSVyOSwlcmJ4CisJYWRkcQklcmRpLCVyOQorCXZwYWRkcQkleG1tOCwleG1tMSwleG1tMQorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcjkKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCW1vdnEJJXJjeCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmJ4LCVyMTMKKwl4b3JxCSVyZHgsJXIxMgorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyOSwlcjE0CisJYW5kcQklcmJ4LCVyMTIKKwl4b3JxCSVyYngsJXIxMworCXZwYWRkcQkleG1tMTEsJXhtbTEsJXhtbTEKKwlhZGRxCTI0KCVyc3ApLCVyOAorCW1vdnEJJXI5LCVyZGkKKwl4b3JxCSVyZHgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZwYWRkcQktOTYoJXJicCksJXhtbTEsJXhtbTEwCisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjksJXIxNAorCWFkZHEJJXIxMywlcjgKKwl4b3JxCSVyMTAsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjE1LCVyOAorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDE2KCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTIsJXhtbTMsJXhtbTgKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCXZwYWxpZ25yCSQ4LCV4bW02LCV4bW03LCV4bW0xMQorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyYXgsJXIxMworCXhvcnEJJXJjeCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjgsJXIxNAorCXZwYWRkcQkleG1tMTEsJXhtbTIsJXhtbTIKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQkzMiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjE3LDMKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyOSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tMSwleG1tMTAKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJdnBhZGRxCSV4bW04LCV4bW0yLCV4bW0yCisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmR4CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyYXgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMSwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tMiwleG1tMgorCWFkZHEJNDAoJXJzcCksJXJjeAorCW1vdnEJJXJkeCwlcmRpCisJeG9ycQklcmJ4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cGFkZHEJLTY0KCVyYnApLCV4bW0yLCV4bW0xMAorCXhvcnEJJXI4LCVyZGkKKwlhZGRxCSVyMTIsJXJjeAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl4b3JxCSVyOCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJdm1vdmRxYQkleG1tMTAsMzIoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tMywleG1tNCwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCXZwYWxpZ25yCSQ4LCV4bW03LCV4bW0wLCV4bW0xMQorCW1vdnEJJXIxMSwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyMTAsJXIxMworCXhvcnEJJXJheCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmN4LCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW0zLCV4bW0zCisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJNDgoJXJzcCksJXJieAorCW1vdnEJJXJjeCwlcjE1CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcnEJJXJheCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwl4b3JxCSVyZHgsJXIxNQorCWFkZHEJJXIxMiwlcmJ4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjE4LDMKKwl4b3JxCSVyY3gsJXIxNAorCWFkZHEJJXIxMywlcmJ4CisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmR4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJdnBzcmxxCSQ2LCV4bW0yLCV4bW0xMAorCWFkZHEJJXJieCwlcjkKKwlhZGRxCSVyZGksJXJieAorCXZwYWRkcQkleG1tOCwleG1tMywleG1tMworCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyYngsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmJ4CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyMTAsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXI5LCVyMTMKKwl4b3JxCSVyMTEsJXIxMgorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyYngsJXIxNAorCWFuZHEJJXI5LCVyMTIKKwl4b3JxCSVyOSwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tMywleG1tMworCWFkZHEJNTYoJXJzcCksJXJheAorCW1vdnEJJXJieCwlcmRpCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cGFkZHEJLTMyKCVyYnApLCV4bW0zLCV4bW0xMAorCXhvcnEJJXJjeCwlcmRpCisJYWRkcQklcjEyLCVyYXgKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyYngsJXIxNAorCWFkZHEJJXIxMywlcmF4CisJeG9ycQklcmN4LCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcmF4LCVyOAorCWFkZHEJJXIxNSwlcmF4CisJbW92cQklcjgsJXIxMworCWFkZHEJJXJheCwlcjE0CisJdm1vdmRxYQkleG1tMTAsNDgoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNCwleG1tNSwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW0xMQorCW1vdnEJJXI5LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMCw1NgorCXhvcnEJJXI4LCVyMTMKKwl4b3JxCSVyMTAsJXIxMgorCXZwc3JscQkkNywleG1tOCwleG1tOAorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJheCwlcjE0CisJdnBhZGRxCSV4bW0xMSwleG1tNCwleG1tNAorCWFuZHEJJXI4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQk2NCglcnNwKSwlcjExCisJbW92cQklcmF4LCVyMTUKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwOSw3CisJeG9ycQklcjEwLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCXhvcnEJJXJieCwlcjE1CisJYWRkcQklcjEyLCVyMTEKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKy5ieXRlCTE0MywxMDQsMTIwLDE5NSwyMTksMworCXhvcnEJJXJheCwlcjE0CisJYWRkcQklcjEzLCVyMTEKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyYngsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwl2cHNybHEJJDYsJXhtbTMsJXhtbTEwCisJYWRkcQklcjExLCVyZHgKKwlhZGRxCSVyZGksJXIxMQorCXZwYWRkcQkleG1tOCwleG1tNCwleG1tNAorCW1vdnEJJXJkeCwlcjEzCisJYWRkcQklcjExLCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJbW92cQklcjgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJkeCwlcjEzCisJeG9ycQklcjksJXIxMgorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyMTEsJXIxNAorCWFuZHEJJXJkeCwlcjEyCisJeG9ycQklcmR4LCVyMTMKKwl2cGFkZHEJJXhtbTExLCV4bW00LCV4bW00CisJYWRkcQk3MiglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnBhZGRxCTAoJXJicCksJXhtbTQsJXhtbTEwCisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDY0KCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTUsJXhtbTYsJXhtbTgKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyMTAKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tMTEKKwltb3ZxCSVyZHgsJXIxMgorCXJvcnEJJDUsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAwLDU2CisJeG9ycQklcmN4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjEwLCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW01LCV4bW01CisJYW5kcQklcmN4LCVyMTIKKwl4b3JxCSVyY3gsJXIxMworCWFkZHEJODAoJXJzcCksJXI5CisJbW92cQklcjEwLCVyMTUKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwOSw3CisJeG9ycQklcjgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcjExLCVyMTUKKwlhZGRxCSVyMTIsJXI5CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjIwLDMKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyMTEsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwl2cHNybHEJJDYsJXhtbTQsJXhtbTEwCisJYWRkcQklcjksJXJieAorCWFkZHEJJXJkaSwlcjkKKwl2cGFkZHEJJXhtbTgsJXhtbTUsJXhtbTUKKwltb3ZxCSVyYngsJXIxMworCWFkZHEJJXI5LCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXI5CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyY3gsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJieCwlcjEzCisJeG9ycQklcmR4LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcjEyCisJeG9ycQklcmJ4LCVyMTMKKwl2cGFkZHEJJXhtbTExLCV4bW01LCV4bW01CisJYWRkcQk4OCglcnNwKSwlcjgKKwltb3ZxCSVyOSwlcmRpCisJeG9ycQklcmR4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl2cGFkZHEJMzIoJXJicCksJXhtbTUsJXhtbTEwCisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcjksJXIxNAorCWFkZHEJJXIxMywlcjgKKwl4b3JxCSVyMTAsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOCwlcmF4CisJYWRkcQklcjE1LCVyOAorCW1vdnEJJXJheCwlcjEzCisJYWRkcQklcjgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDgwKCVyc3ApCisJdnBhbGlnbnIJJDgsJXhtbTYsJXhtbTcsJXhtbTgKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCXZwYWxpZ25yCSQ4LCV4bW0yLCV4bW0zLCV4bW0xMQorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyYXgsJXIxMworCXhvcnEJJXJjeCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjgsJXIxNAorCXZwYWRkcQkleG1tMTEsJXhtbTYsJXhtbTYKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQk5NiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisuYnl0ZQkxNDMsMTA0LDEyMCwxOTUsMjIxLDMKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyOSwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tNSwleG1tMTAKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJdnBhZGRxCSV4bW04LCV4bW02LCV4bW02CisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmR4CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwltb3ZxCSVyYXgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmR4LCVyMTQKKwlhbmRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMSwlcjEzCisJdnBhZGRxCSV4bW0xMSwleG1tNiwleG1tNgorCWFkZHEJMTA0KCVyc3ApLCVyY3gKKwltb3ZxCSVyZHgsJXJkaQorCXhvcnEJJXJieCwlcjEyCisJcm9ycQkkNiwlcjE0CisJdnBhZGRxCTY0KCVyYnApLCV4bW02LCV4bW0xMAorCXhvcnEJJXI4LCVyZGkKKwlhZGRxCSVyMTIsJXJjeAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl4b3JxCSVyOCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJdm1vdmRxYQkleG1tMTAsOTYoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNywleG1tMCwleG1tOAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCXZwYWxpZ25yCSQ4LCV4bW0zLCV4bW00LCV4bW0xMQorCW1vdnEJJXIxMSwlcjEyCisJcm9ycQkkNSwlcjE0CisuYnl0ZQkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3JxCSVyMTAsJXIxMworCXhvcnEJJXJheCwlcjEyCisJdnBzcmxxCSQ3LCV4bW04LCV4bW04CisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmN4LCVyMTQKKwl2cGFkZHEJJXhtbTExLCV4bW03LCV4bW03CisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJMTEyKCVyc3ApLCVyYngKKwltb3ZxCSVyY3gsJXIxNQorLmJ5dGUJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3JxCSVyYXgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJeG9ycQklcmR4LCVyMTUKKwlhZGRxCSVyMTIsJXJieAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorLmJ5dGUJMTQzLDEwNCwxMjAsMTk1LDIyMiwzCisJeG9ycQklcmN4LCVyMTQKKwlhZGRxCSVyMTMsJXJieAorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXJkeCwlcmRpCisJcm9ycQkkMjgsJXIxNAorCXZwc3JscQkkNiwleG1tNiwleG1tMTAKKwlhZGRxCSVyYngsJXI5CisJYWRkcQklcmRpLCVyYngKKwl2cGFkZHEJJXhtbTgsJXhtbTcsJXhtbTcKKwltb3ZxCSVyOSwlcjEzCisJYWRkcQklcmJ4LCVyMTQKKy5ieXRlCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJieAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJbW92cQklcjEwLCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJeG9ycQklcjExLCVyMTIKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcjEyCisJeG9ycQklcjksJXIxMworCXZwYWRkcQkleG1tMTEsJXhtbTcsJXhtbTcKKwlhZGRxCTEyMCglcnNwKSwlcmF4CisJbW92cQklcmJ4LCVyZGkKKwl4b3JxCSVyMTEsJXIxMgorCXJvcnEJJDYsJXIxNAorCXZwYWRkcQk5NiglcmJwKSwleG1tNywleG1tMTAKKwl4b3JxCSVyY3gsJXJkaQorCWFkZHEJJXIxMiwlcmF4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXhvcnEJJXJjeCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJheCwlcjgKKwlhZGRxCSVyMTUsJXJheAorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyYXgsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDExMiglcnNwKQorCWNtcGIJJDAsMTM1KCVyYnApCisJam5lCUwkeG9wXzAwXzQ3CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmF4CisJbW92cQklcjksJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXI4LCVyMTMKKwl4b3JxCSVyMTAsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJheCwlcjE0CisJYW5kcQklcjgsJXIxMgorCXhvcnEJJXI4LCVyMTMKKwlhZGRxCTAoJXJzcCksJXIxMQorCW1vdnEJJXJheCwlcjE1CisJeG9ycQklcjEwLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyYngsJXIxNQorCWFkZHEJJXIxMiwlcjExCisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcmF4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMQorCXhvcnEJJXJieCwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXIxMSwlcmR4CisJYWRkcQklcmRpLCVyMTEKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXIxMSwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjgsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXJkeCwlcjEzCisJeG9ycQklcjksJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyMTIKKwl4b3JxCSVyZHgsJXIxMworCWFkZHEJOCglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCW1vdnEJJXJkeCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjEwLCVyMTQKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJYWRkcQkxNiglcnNwKSwlcjkKKwltb3ZxCSVyMTAsJXIxNQorCXhvcnEJJXI4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTEsJXIxNQorCWFkZHEJJXIxMiwlcjkKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl4b3JxCSVyMTEsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOSwlcmJ4CisJYWRkcQklcmRpLCVyOQorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXI5CisJbW92cQklcmN4LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyYngsJXIxMworCXhvcnEJJXJkeCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcjEyCisJeG9ycQklcmJ4LCVyMTMKKwlhZGRxCTI0KCVyc3ApLCVyOAorCW1vdnEJJXI5LCVyZGkKKwl4b3JxCSVyZHgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMCwlcmRpCisJYWRkcQklcjEyLCVyOAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXI5LCVyMTQKKwlhZGRxCSVyMTMsJXI4CisJeG9ycQklcjEwLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjgsJXJheAorCWFkZHEJJXIxNSwlcjgKKwltb3ZxCSVyYXgsJXIxMworCWFkZHEJJXI4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTMKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXI4LCVyMTQKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQkzMiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorCXhvcnEJJXJjeCwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcjgsJXIxNAorCWFkZHEJJXIxMywlcmR4CisJeG9ycQklcjksJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJkeAorCW1vdnEJJXJheCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjExLCVyMTMKKwl4b3JxCSVyYngsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJkeCwlcjE0CisJYW5kcQklcjExLCVyMTIKKwl4b3JxCSVyMTEsJXIxMworCWFkZHEJNDAoJXJzcCksJXJjeAorCW1vdnEJJXJkeCwlcmRpCisJeG9ycQklcmJ4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyOCwlcmRpCisJYWRkcQklcjEyLCVyY3gKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyZHgsJXIxNAorCWFkZHEJJXIxMywlcmN4CisJeG9ycQklcjgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyY3gsJXIxMAorCWFkZHEJJXIxNSwlcmN4CisJbW92cQklcjEwLCVyMTMKKwlhZGRxCSVyY3gsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCW1vdnEJJXIxMSwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjEwLCVyMTMKKwl4b3JxCSVyYXgsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJjeCwlcjE0CisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCWFkZHEJNDgoJXJzcCksJXJieAorCW1vdnEJJXJjeCwlcjE1CisJeG9ycQklcmF4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyZHgsJXIxNQorCWFkZHEJJXIxMiwlcmJ4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcmN4LCVyMTQKKwlhZGRxCSVyMTMsJXJieAorCXhvcnEJJXJkeCwlcmRpCisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJieCwlcjkKKwlhZGRxCSVyZGksJXJieAorCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyYngsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJieAorCW1vdnEJJXIxMCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjksJXIxMworCXhvcnEJJXIxMSwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcjEyCisJeG9ycQklcjksJXIxMworCWFkZHEJNTYoJXJzcCksJXJheAorCW1vdnEJJXJieCwlcmRpCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyY3gsJXJkaQorCWFkZHEJJXIxMiwlcmF4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXhvcnEJJXJjeCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJheCwlcjgKKwlhZGRxCSVyMTUsJXJheAorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyYXgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCW1vdnEJJXI5LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOCwlcjEzCisJeG9ycQklcjEwLCVyMTIKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyYXgsJXIxNAorCWFuZHEJJXI4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQk2NCglcnNwKSwlcjExCisJbW92cQklcmF4LCVyMTUKKwl4b3JxCSVyMTAsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJieCwlcjE1CisJYWRkcQklcjEyLCVyMTEKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyYXgsJXIxNAorCWFkZHEJJXIxMywlcjExCisJeG9ycQklcmJ4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjExLCVyZHgKKwlhZGRxCSVyZGksJXIxMQorCW1vdnEJJXJkeCwlcjEzCisJYWRkcQklcjExLCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyMTEKKwltb3ZxCSVyOCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmR4LCVyMTMKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjExLCVyMTQKKwlhbmRxCSVyZHgsJXIxMgorCXhvcnEJJXJkeCwlcjEzCisJYWRkcQk3MiglcnNwKSwlcjEwCisJbW92cQklcjExLCVyZGkKKwl4b3JxCSVyOSwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcmF4LCVyZGkKKwlhZGRxCSVyMTIsJXIxMAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl4b3JxCSVyYXgsJXIxNQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCW1vdnEJJXJkeCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmN4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjEwLCVyMTQKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJYWRkcQk4MCglcnNwKSwlcjkKKwltb3ZxCSVyMTAsJXIxNQorCXhvcnEJJXI4LCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyMTEsJXIxNQorCWFkZHEJJXIxMiwlcjkKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl4b3JxCSVyMTEsJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyOSwlcmJ4CisJYWRkcQklcmRpLCVyOQorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXI5CisJbW92cQklcmN4LCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyYngsJXIxMworCXhvcnEJJXJkeCwlcjEyCisJcm9ycQkkNCwlcjEzCisJeG9ycQklcjksJXIxNAorCWFuZHEJJXJieCwlcjEyCisJeG9ycQklcmJ4LCVyMTMKKwlhZGRxCTg4KCVyc3ApLCVyOAorCW1vdnEJJXI5LCVyZGkKKwl4b3JxCSVyZHgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXIxMCwlcmRpCisJYWRkcQklcjEyLCVyOAorCXJvcnEJJDE0LCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXI5LCVyMTQKKwlhZGRxCSVyMTMsJXI4CisJeG9ycQklcjEwLCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcjgsJXJheAorCWFkZHEJJXIxNSwlcjgKKwltb3ZxCSVyYXgsJXIxMworCWFkZHEJJXI4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyOAorCW1vdnEJJXJieCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcmF4LCVyMTMKKwl4b3JxCSVyY3gsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXI4LCVyMTQKKwlhbmRxCSVyYXgsJXIxMgorCXhvcnEJJXJheCwlcjEzCisJYWRkcQk5NiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorCXhvcnEJJXJjeCwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcjgsJXIxNAorCWFkZHEJJXIxMywlcmR4CisJeG9ycQklcjksJXJkaQorCXJvcnEJJDI4LCVyMTQKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJbW92cQklcjExLCVyMTMKKwlhZGRxCSVyZHgsJXIxNAorCXJvcnEJJDIzLCVyMTMKKwltb3ZxCSVyMTQsJXJkeAorCW1vdnEJJXJheCwlcjEyCisJcm9ycQkkNSwlcjE0CisJeG9ycQklcjExLCVyMTMKKwl4b3JxCSVyYngsJXIxMgorCXJvcnEJJDQsJXIxMworCXhvcnEJJXJkeCwlcjE0CisJYW5kcQklcjExLCVyMTIKKwl4b3JxCSVyMTEsJXIxMworCWFkZHEJMTA0KCVyc3ApLCVyY3gKKwltb3ZxCSVyZHgsJXJkaQorCXhvcnEJJXJieCwlcjEyCisJcm9ycQkkNiwlcjE0CisJeG9ycQklcjgsJXJkaQorCWFkZHEJJXIxMiwlcmN4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmR4LCVyMTQKKwlhZGRxCSVyMTMsJXJjeAorCXhvcnEJJXI4LCVyMTUKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcmN4LCVyMTAKKwlhZGRxCSVyMTUsJXJjeAorCW1vdnEJJXIxMCwlcjEzCisJYWRkcQklcmN4LCVyMTQKKwlyb3JxCSQyMywlcjEzCisJbW92cQklcjE0LCVyY3gKKwltb3ZxCSVyMTEsJXIxMgorCXJvcnEJJDUsJXIxNAorCXhvcnEJJXIxMCwlcjEzCisJeG9ycQklcmF4LCVyMTIKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyY3gsJXIxNAorCWFuZHEJJXIxMCwlcjEyCisJeG9ycQklcjEwLCVyMTMKKwlhZGRxCTExMiglcnNwKSwlcmJ4CisJbW92cQklcmN4LCVyMTUKKwl4b3JxCSVyYXgsJXIxMgorCXJvcnEJJDYsJXIxNAorCXhvcnEJJXJkeCwlcjE1CisJYWRkcQklcjEyLCVyYngKKwlyb3JxCSQxNCwlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl4b3JxCSVyY3gsJXIxNAorCWFkZHEJJXIxMywlcmJ4CisJeG9ycQklcmR4LCVyZGkKKwlyb3JxCSQyOCwlcjE0CisJYWRkcQklcmJ4LCVyOQorCWFkZHEJJXJkaSwlcmJ4CisJbW92cQklcjksJXIxMworCWFkZHEJJXJieCwlcjE0CisJcm9ycQkkMjMsJXIxMworCW1vdnEJJXIxNCwlcmJ4CisJbW92cQklcjEwLCVyMTIKKwlyb3JxCSQ1LCVyMTQKKwl4b3JxCSVyOSwlcjEzCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ0LCVyMTMKKwl4b3JxCSVyYngsJXIxNAorCWFuZHEJJXI5LCVyMTIKKwl4b3JxCSVyOSwlcjEzCisJYWRkcQkxMjAoJXJzcCksJXJheAorCW1vdnEJJXJieCwlcmRpCisJeG9ycQklcjExLCVyMTIKKwlyb3JxCSQ2LCVyMTQKKwl4b3JxCSVyY3gsJXJkaQorCWFkZHEJJXIxMiwlcmF4CisJcm9ycQkkMTQsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXhvcnEJJXJjeCwlcjE1CisJcm9ycQkkMjgsJXIxNAorCWFkZHEJJXJheCwlcjgKKwlhZGRxCSVyMTUsJXJheAorCW1vdnEJJXI4LCVyMTMKKwlhZGRxCSVyYXgsJXIxNAorCW1vdnEJMTI4KzAoJXJzcCksJXJkaQorCW1vdnEJJXIxNCwlcmF4CisKKwlhZGRxCTAoJXJkaSksJXJheAorCWxlYXEJMTI4KCVyc2kpLCVyc2kKKwlhZGRxCTgoJXJkaSksJXJieAorCWFkZHEJMTYoJXJkaSksJXJjeAorCWFkZHEJMjQoJXJkaSksJXJkeAorCWFkZHEJMzIoJXJkaSksJXI4CisJYWRkcQk0MCglcmRpKSwlcjkKKwlhZGRxCTQ4KCVyZGkpLCVyMTAKKwlhZGRxCTU2KCVyZGkpLCVyMTEKKworCWNtcHEJMTI4KzE2KCVyc3ApLCVyc2kKKworCW1vdnEJJXJheCwwKCVyZGkpCisJbW92cQklcmJ4LDgoJXJkaSkKKwltb3ZxCSVyY3gsMTYoJXJkaSkKKwltb3ZxCSVyZHgsMjQoJXJkaSkKKwltb3ZxCSVyOCwzMiglcmRpKQorCW1vdnEJJXI5LDQwKCVyZGkpCisJbW92cQklcjEwLDQ4KCVyZGkpCisJbW92cQklcjExLDU2KCVyZGkpCisJamIJTCRsb29wX3hvcAorCisJbW92cQkxNTIoJXJzcCksJXJzaQorCisJdnplcm91cHBlcgorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYnAKKworCW1vdnEJLTgoJXJzaSksJXJieAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJGVwaWxvZ3VlX3hvcDoKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTYKK3NoYTUxMl9ibG9ja19kYXRhX29yZGVyX2F2eDoKKworTCRhdnhfc2hvcnRjdXQ6CisJbW92cQklcnNwLCVyYXgKKworCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCXNobHEJJDQsJXJkeAorCXN1YnEJJDE2MCwlcnNwCisJbGVhcQkoJXJzaSwlcmR4LDgpLCVyZHgKKwlhbmRxCSQtNjQsJXJzcAorCW1vdnEJJXJkaSwxMjgrMCglcnNwKQorCW1vdnEJJXJzaSwxMjgrOCglcnNwKQorCW1vdnEJJXJkeCwxMjgrMTYoJXJzcCkKKwltb3ZxCSVyYXgsMTUyKCVyc3ApCisKK0wkcHJvbG9ndWVfYXZ4OgorCisJdnplcm91cHBlcgorCW1vdnEJMCglcmRpKSwlcmF4CisJbW92cQk4KCVyZGkpLCVyYngKKwltb3ZxCTE2KCVyZGkpLCVyY3gKKwltb3ZxCTI0KCVyZGkpLCVyZHgKKwltb3ZxCTMyKCVyZGkpLCVyOAorCW1vdnEJNDAoJXJkaSksJXI5CisJbW92cQk0OCglcmRpKSwlcjEwCisJbW92cQk1NiglcmRpKSwlcjExCisJam1wCUwkbG9vcF9hdngKKy5wMmFsaWduCTQKK0wkbG9vcF9hdng6CisJdm1vdmRxYQlLNTEyKzEyODAoJXJpcCksJXhtbTExCisJdm1vdmRxdQkwKCVyc2kpLCV4bW0wCisJbGVhcQlLNTEyKzEyOCglcmlwKSwlcmJwCisJdm1vdmRxdQkxNiglcnNpKSwleG1tMQorCXZtb3ZkcXUJMzIoJXJzaSksJXhtbTIKKwl2cHNodWZiCSV4bW0xMSwleG1tMCwleG1tMAorCXZtb3ZkcXUJNDgoJXJzaSksJXhtbTMKKwl2cHNodWZiCSV4bW0xMSwleG1tMSwleG1tMQorCXZtb3ZkcXUJNjQoJXJzaSksJXhtbTQKKwl2cHNodWZiCSV4bW0xMSwleG1tMiwleG1tMgorCXZtb3ZkcXUJODAoJXJzaSksJXhtbTUKKwl2cHNodWZiCSV4bW0xMSwleG1tMywleG1tMworCXZtb3ZkcXUJOTYoJXJzaSksJXhtbTYKKwl2cHNodWZiCSV4bW0xMSwleG1tNCwleG1tNAorCXZtb3ZkcXUJMTEyKCVyc2kpLCV4bW03CisJdnBzaHVmYgkleG1tMTEsJXhtbTUsJXhtbTUKKwl2cGFkZHEJLTEyOCglcmJwKSwleG1tMCwleG1tOAorCXZwc2h1ZmIJJXhtbTExLCV4bW02LCV4bW02CisJdnBhZGRxCS05NiglcmJwKSwleG1tMSwleG1tOQorCXZwc2h1ZmIJJXhtbTExLCV4bW03LCV4bW03CisJdnBhZGRxCS02NCglcmJwKSwleG1tMiwleG1tMTAKKwl2cGFkZHEJLTMyKCVyYnApLCV4bW0zLCV4bW0xMQorCXZtb3ZkcWEJJXhtbTgsMCglcnNwKQorCXZwYWRkcQkwKCVyYnApLCV4bW00LCV4bW04CisJdm1vdmRxYQkleG1tOSwxNiglcnNwKQorCXZwYWRkcQkzMiglcmJwKSwleG1tNSwleG1tOQorCXZtb3ZkcWEJJXhtbTEwLDMyKCVyc3ApCisJdnBhZGRxCTY0KCVyYnApLCV4bW02LCV4bW0xMAorCXZtb3ZkcWEJJXhtbTExLDQ4KCVyc3ApCisJdnBhZGRxCTk2KCVyYnApLCV4bW03LCV4bW0xMQorCXZtb3ZkcWEJJXhtbTgsNjQoJXJzcCkKKwltb3ZxCSVyYXgsJXIxNAorCXZtb3ZkcWEJJXhtbTksODAoJXJzcCkKKwltb3ZxCSVyYngsJXJkaQorCXZtb3ZkcWEJJXhtbTEwLDk2KCVyc3ApCisJeG9ycQklcmN4LCVyZGkKKwl2bW92ZHFhCSV4bW0xMSwxMTIoJXJzcCkKKwltb3ZxCSVyOCwlcjEzCisJam1wCUwkYXZ4XzAwXzQ3CisKKy5wMmFsaWduCTQKK0wkYXZ4XzAwXzQ3OgorCWFkZHEJJDI1NiwlcmJwCisJdnBhbGlnbnIJJDgsJXhtbTAsJXhtbTEsJXhtbTgKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyYXgKKwl2cGFsaWducgkkOCwleG1tNCwleG1tNSwleG1tMTEKKwltb3ZxCSVyOSwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxLCV4bW04LCV4bW0xMAorCXhvcnEJJXI4LCVyMTMKKwl4b3JxCSVyMTAsJXIxMgorCXZwYWRkcQkleG1tMTEsJXhtbTAsJXhtbTAKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyYXgsJXIxNAorCXZwc3JscQkkNywleG1tOCwleG1tMTEKKwlhbmRxCSVyOCwlcjEyCisJeG9ycQklcjgsJXIxMworCXZwc2xscQkkNTYsJXhtbTgsJXhtbTkKKwlhZGRxCTAoJXJzcCksJXIxMQorCW1vdnEJJXJheCwlcjE1CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tOAorCXhvcnEJJXIxMCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnBzcmxxCSQ3LCV4bW0xMCwleG1tMTAKKwl4b3JxCSVyYngsJXIxNQorCWFkZHEJJXIxMiwlcjExCisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyYXgsJXIxNAorCWFkZHEJJXIxMywlcjExCisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmJ4LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJdnBzcmxxCSQ2LCV4bW03LCV4bW0xMQorCWFkZHEJJXIxMSwlcmR4CisJYWRkcQklcmRpLCVyMTEKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCW1vdnEJJXJkeCwlcjEzCisJYWRkcQklcjExLCVyMTQKKwl2cHNsbHEJJDMsJXhtbTcsJXhtbTEwCisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjExCisJdnBhZGRxCSV4bW04LCV4bW0wLCV4bW0wCisJbW92cQklcjgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMTksJXhtbTcsJXhtbTkKKwl4b3JxCSVyZHgsJXIxMworCXhvcnEJJXI5LCVyMTIKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXIxMSwlcjE0CisJdnBzbGxxCSQ0MiwleG1tMTAsJXhtbTEwCisJYW5kcQklcmR4LCVyMTIKKwl4b3JxCSVyZHgsJXIxMworCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlhZGRxCTgoJXJzcCksJXIxMAorCW1vdnEJJXIxMSwlcmRpCisJdnBzcmxxCSQ0MiwleG1tOSwleG1tOQorCXhvcnEJJXI5LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXhvcnEJJXJheCwlcmRpCisJYWRkcQklcjEyLCVyMTAKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJdnBhZGRxCSV4bW0xMSwleG1tMCwleG1tMAorCXhvcnEJJXIxMSwlcjE0CisJYWRkcQklcjEzLCVyMTAKKwl2cGFkZHEJLTEyOCglcmJwKSwleG1tMCwleG1tMTAKKwl4b3JxCSVyYXgsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyMTAsJXJjeAorCWFkZHEJJXIxNSwlcjEwCisJbW92cQklcmN4LCVyMTMKKwlhZGRxCSVyMTAsJXIxNAorCXZtb3ZkcWEJJXhtbTEwLDAoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tMSwleG1tMiwleG1tOAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMAorCXZwYWxpZ25yCSQ4LCV4bW01LCV4bW02LCV4bW0xMQorCW1vdnEJJXJkeCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxLCV4bW04LCV4bW0xMAorCXhvcnEJJXJjeCwlcjEzCisJeG9ycQklcjgsJXIxMgorCXZwYWRkcQkleG1tMTEsJXhtbTEsJXhtbTEKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTAsJXIxNAorCXZwc3JscQkkNywleG1tOCwleG1tMTEKKwlhbmRxCSVyY3gsJXIxMgorCXhvcnEJJXJjeCwlcjEzCisJdnBzbGxxCSQ1NiwleG1tOCwleG1tOQorCWFkZHEJMTYoJXJzcCksJXI5CisJbW92cQklcjEwLCVyMTUKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW04CisJeG9ycQklcjgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZwc3JscQkkNywleG1tMTAsJXhtbTEwCisJeG9ycQklcjExLCVyMTUKKwlhZGRxCSVyMTIsJXI5CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyMTAsJXIxNAorCWFkZHEJJXIxMywlcjkKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyMTEsJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwl2cHNybHEJJDYsJXhtbTAsJXhtbTExCisJYWRkcQklcjksJXJieAorCWFkZHEJJXJkaSwlcjkKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCW1vdnEJJXJieCwlcjEzCisJYWRkcQklcjksJXIxNAorCXZwc2xscQkkMywleG1tMCwleG1tMTAKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyOQorCXZwYWRkcQkleG1tOCwleG1tMSwleG1tMQorCW1vdnEJJXJjeCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxOSwleG1tMCwleG1tOQorCXhvcnEJJXJieCwlcjEzCisJeG9ycQklcmR4LCVyMTIKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXI5LCVyMTQKKwl2cHNsbHEJJDQyLCV4bW0xMCwleG1tMTAKKwlhbmRxCSVyYngsJXIxMgorCXhvcnEJJXJieCwlcjEzCisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCWFkZHEJMjQoJXJzcCksJXI4CisJbW92cQklcjksJXJkaQorCXZwc3JscQkkNDIsJXhtbTksJXhtbTkKKwl4b3JxCSVyZHgsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJeG9ycQklcjEwLCVyZGkKKwlhZGRxCSVyMTIsJXI4CisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXZwYWRkcQkleG1tMTEsJXhtbTEsJXhtbTEKKwl4b3JxCSVyOSwlcjE0CisJYWRkcQklcjEzLCVyOAorCXZwYWRkcQktOTYoJXJicCksJXhtbTEsJXhtbTEwCisJeG9ycQklcjEwLCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjgsJXJheAorCWFkZHEJJXIxNSwlcjgKKwltb3ZxCSVyYXgsJXIxMworCWFkZHEJJXI4LCVyMTQKKwl2bW92ZHFhCSV4bW0xMCwxNiglcnNwKQorCXZwYWxpZ25yCSQ4LCV4bW0yLCV4bW0zLCV4bW04CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjgKKwl2cGFsaWducgkkOCwleG1tNiwleG1tNywleG1tMTEKKwltb3ZxCSVyYngsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMSwleG1tOCwleG1tMTAKKwl4b3JxCSVyYXgsJXIxMworCXhvcnEJJXJjeCwlcjEyCisJdnBhZGRxCSV4bW0xMSwleG1tMiwleG1tMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXI4LCVyMTQKKwl2cHNybHEJJDcsJXhtbTgsJXhtbTExCisJYW5kcQklcmF4LCVyMTIKKwl4b3JxCSVyYXgsJXIxMworCXZwc2xscQkkNTYsJXhtbTgsJXhtbTkKKwlhZGRxCTMyKCVyc3ApLCVyZHgKKwltb3ZxCSVyOCwlcjE1CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tOAorCXhvcnEJJXJjeCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnBzcmxxCSQ3LCV4bW0xMCwleG1tMTAKKwl4b3JxCSVyOSwlcjE1CisJYWRkcQklcjEyLCVyZHgKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXZwc2xscQkkNywleG1tOSwleG1tOQorCXhvcnEJJXI4LCVyMTQKKwlhZGRxCSVyMTMsJXJkeAorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXI5LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJdnBzcmxxCSQ2LCV4bW0xLCV4bW0xMQorCWFkZHEJJXJkeCwlcjExCisJYWRkcQklcmRpLCVyZHgKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCW1vdnEJJXIxMSwlcjEzCisJYWRkcQklcmR4LCVyMTQKKwl2cHNsbHEJJDMsJXhtbTEsJXhtbTEwCisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmR4CisJdnBhZGRxCSV4bW04LCV4bW0yLCV4bW0yCisJbW92cQklcmF4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDE5LCV4bW0xLCV4bW05CisJeG9ycQklcjExLCVyMTMKKwl4b3JxCSVyYngsJXIxMgorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmR4LCVyMTQKKwl2cHNsbHEJJDQyLCV4bW0xMCwleG1tMTAKKwlhbmRxCSVyMTEsJXIxMgorCXhvcnEJJXIxMSwlcjEzCisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCWFkZHEJNDAoJXJzcCksJXJjeAorCW1vdnEJJXJkeCwlcmRpCisJdnBzcmxxCSQ0MiwleG1tOSwleG1tOQorCXhvcnEJJXJieCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwl4b3JxCSVyOCwlcmRpCisJYWRkcQklcjEyLCVyY3gKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJdnBhZGRxCSV4bW0xMSwleG1tMiwleG1tMgorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl2cGFkZHEJLTY0KCVyYnApLCV4bW0yLCV4bW0xMAorCXhvcnEJJXI4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmN4LCVyMTAKKwlhZGRxCSVyMTUsJXJjeAorCW1vdnEJJXIxMCwlcjEzCisJYWRkcQklcmN4LCVyMTQKKwl2bW92ZHFhCSV4bW0xMCwzMiglcnNwKQorCXZwYWxpZ25yCSQ4LCV4bW0zLCV4bW00LCV4bW04CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmN4CisJdnBhbGlnbnIJJDgsJXhtbTcsJXhtbTAsJXhtbTExCisJbW92cQklcjExLCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDEsJXhtbTgsJXhtbTEwCisJeG9ycQklcjEwLCVyMTMKKwl4b3JxCSVyYXgsJXIxMgorCXZwYWRkcQkleG1tMTEsJXhtbTMsJXhtbTMKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyY3gsJXIxNAorCXZwc3JscQkkNywleG1tOCwleG1tMTEKKwlhbmRxCSVyMTAsJXIxMgorCXhvcnEJJXIxMCwlcjEzCisJdnBzbGxxCSQ1NiwleG1tOCwleG1tOQorCWFkZHEJNDgoJXJzcCksJXJieAorCW1vdnEJJXJjeCwlcjE1CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tOAorCXhvcnEJJXJheCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnBzcmxxCSQ3LCV4bW0xMCwleG1tMTAKKwl4b3JxCSVyZHgsJXIxNQorCWFkZHEJJXIxMiwlcmJ4CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyY3gsJXIxNAorCWFkZHEJJXIxMywlcmJ4CisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmR4LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJdnBzcmxxCSQ2LCV4bW0yLCV4bW0xMQorCWFkZHEJJXJieCwlcjkKKwlhZGRxCSVyZGksJXJieAorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJbW92cQklcjksJXIxMworCWFkZHEJJXJieCwlcjE0CisJdnBzbGxxCSQzLCV4bW0yLCV4bW0xMAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJieAorCXZwYWRkcQkleG1tOCwleG1tMywleG1tMworCW1vdnEJJXIxMCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxOSwleG1tMiwleG1tOQorCXhvcnEJJXI5LCVyMTMKKwl4b3JxCSVyMTEsJXIxMgorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmJ4LCVyMTQKKwl2cHNsbHEJJDQyLCV4bW0xMCwleG1tMTAKKwlhbmRxCSVyOSwlcjEyCisJeG9ycQklcjksJXIxMworCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlhZGRxCTU2KCVyc3ApLCVyYXgKKwltb3ZxCSVyYngsJXJkaQorCXZwc3JscQkkNDIsJXhtbTksJXhtbTkKKwl4b3JxCSVyMTEsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJeG9ycQklcmN4LCVyZGkKKwlhZGRxCSVyMTIsJXJheAorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl2cGFkZHEJJXhtbTExLCV4bW0zLCV4bW0zCisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXZwYWRkcQktMzIoJXJicCksJXhtbTMsJXhtbTEwCisJeG9ycQklcmN4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmF4LCVyOAorCWFkZHEJJXIxNSwlcmF4CisJbW92cQklcjgsJXIxMworCWFkZHEJJXJheCwlcjE0CisJdm1vdmRxYQkleG1tMTAsNDgoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNCwleG1tNSwleG1tOAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCXZwYWxpZ25yCSQ4LCV4bW0wLCV4bW0xLCV4bW0xMQorCW1vdnEJJXI5LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDEsJXhtbTgsJXhtbTEwCisJeG9ycQklcjgsJXIxMworCXhvcnEJJXIxMCwlcjEyCisJdnBhZGRxCSV4bW0xMSwleG1tNCwleG1tNAorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJheCwlcjE0CisJdnBzcmxxCSQ3LCV4bW04LCV4bW0xMQorCWFuZHEJJXI4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJdnBzbGxxCSQ1NiwleG1tOCwleG1tOQorCWFkZHEJNjQoJXJzcCksJXIxMQorCW1vdnEJJXJheCwlcjE1CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tOAorCXhvcnEJJXIxMCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnBzcmxxCSQ3LCV4bW0xMCwleG1tMTAKKwl4b3JxCSVyYngsJXIxNQorCWFkZHEJJXIxMiwlcjExCisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyYXgsJXIxNAorCWFkZHEJJXIxMywlcjExCisJdnB4b3IJJXhtbTEwLCV4bW04LCV4bW04CisJeG9ycQklcmJ4LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJdnBzcmxxCSQ2LCV4bW0zLCV4bW0xMQorCWFkZHEJJXIxMSwlcmR4CisJYWRkcQklcmRpLCVyMTEKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCW1vdnEJJXJkeCwlcjEzCisJYWRkcQklcjExLCVyMTQKKwl2cHNsbHEJJDMsJXhtbTMsJXhtbTEwCisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjExCisJdnBhZGRxCSV4bW04LCV4bW00LCV4bW00CisJbW92cQklcjgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXZwc3JscQkkMTksJXhtbTMsJXhtbTkKKwl4b3JxCSVyZHgsJXIxMworCXhvcnEJJXI5LCVyMTIKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXIxMSwlcjE0CisJdnBzbGxxCSQ0MiwleG1tMTAsJXhtbTEwCisJYW5kcQklcmR4LCVyMTIKKwl4b3JxCSVyZHgsJXIxMworCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlhZGRxCTcyKCVyc3ApLCVyMTAKKwltb3ZxCSVyMTEsJXJkaQorCXZwc3JscQkkNDIsJXhtbTksJXhtbTkKKwl4b3JxCSVyOSwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwl4b3JxCSVyYXgsJXJkaQorCWFkZHEJJXIxMiwlcjEwCisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXZwYWRkcQkleG1tMTEsJXhtbTQsJXhtbTQKKwl4b3JxCSVyMTEsJXIxNAorCWFkZHEJJXIxMywlcjEwCisJdnBhZGRxCTAoJXJicCksJXhtbTQsJXhtbTEwCisJeG9ycQklcmF4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjEwLCVyY3gKKwlhZGRxCSVyMTUsJXIxMAorCW1vdnEJJXJjeCwlcjEzCisJYWRkcQklcjEwLCVyMTQKKwl2bW92ZHFhCSV4bW0xMCw2NCglcnNwKQorCXZwYWxpZ25yCSQ4LCV4bW01LCV4bW02LCV4bW04CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjEwCisJdnBhbGlnbnIJJDgsJXhtbTEsJXhtbTIsJXhtbTExCisJbW92cQklcmR4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDEsJXhtbTgsJXhtbTEwCisJeG9ycQklcmN4LCVyMTMKKwl4b3JxCSVyOCwlcjEyCisJdnBhZGRxCSV4bW0xMSwleG1tNSwleG1tNQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXIxMCwlcjE0CisJdnBzcmxxCSQ3LCV4bW04LCV4bW0xMQorCWFuZHEJJXJjeCwlcjEyCisJeG9ycQklcmN4LCVyMTMKKwl2cHNsbHEJJDU2LCV4bW04LCV4bW05CisJYWRkcQk4MCglcnNwKSwlcjkKKwltb3ZxCSVyMTAsJXIxNQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTgKKwl4b3JxCSVyOCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnBzcmxxCSQ3LCV4bW0xMCwleG1tMTAKKwl4b3JxCSVyMTEsJXIxNQorCWFkZHEJJXIxMiwlcjkKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXZwc2xscQkkNywleG1tOSwleG1tOQorCXhvcnEJJXIxMCwlcjE0CisJYWRkcQklcjEzLCVyOQorCXZweG9yCSV4bW0xMCwleG1tOCwleG1tOAorCXhvcnEJJXIxMSwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCXZwc3JscQkkNiwleG1tNCwleG1tMTEKKwlhZGRxCSVyOSwlcmJ4CisJYWRkcQklcmRpLCVyOQorCXZweG9yCSV4bW05LCV4bW04LCV4bW04CisJbW92cQklcmJ4LCVyMTMKKwlhZGRxCSVyOSwlcjE0CisJdnBzbGxxCSQzLCV4bW00LCV4bW0xMAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXI5CisJdnBhZGRxCSV4bW04LCV4bW01LCV4bW01CisJbW92cQklcmN4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDE5LCV4bW00LCV4bW05CisJeG9ycQklcmJ4LCVyMTMKKwl4b3JxCSVyZHgsJXIxMgorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcjksJXIxNAorCXZwc2xscQkkNDIsJXhtbTEwLCV4bW0xMAorCWFuZHEJJXJieCwlcjEyCisJeG9ycQklcmJ4LCVyMTMKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJYWRkcQk4OCglcnNwKSwlcjgKKwltb3ZxCSVyOSwlcmRpCisJdnBzcmxxCSQ0MiwleG1tOSwleG1tOQorCXhvcnEJJXJkeCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwl4b3JxCSVyMTAsJXJkaQorCWFkZHEJJXIxMiwlcjgKKwl2cHhvcgkleG1tOSwleG1tMTEsJXhtbTExCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJdnBhZGRxCSV4bW0xMSwleG1tNSwleG1tNQorCXhvcnEJJXI5LCVyMTQKKwlhZGRxCSVyMTMsJXI4CisJdnBhZGRxCTMyKCVyYnApLCV4bW01LCV4bW0xMAorCXhvcnEJJXIxMCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXI4LCVyYXgKKwlhZGRxCSVyMTUsJXI4CisJbW92cQklcmF4LCVyMTMKKwlhZGRxCSVyOCwlcjE0CisJdm1vdmRxYQkleG1tMTAsODAoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNiwleG1tNywleG1tOAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXI4CisJdnBhbGlnbnIJJDgsJXhtbTIsJXhtbTMsJXhtbTExCisJbW92cQklcmJ4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDEsJXhtbTgsJXhtbTEwCisJeG9ycQklcmF4LCVyMTMKKwl4b3JxCSVyY3gsJXIxMgorCXZwYWRkcQkleG1tMTEsJXhtbTYsJXhtbTYKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyOCwlcjE0CisJdnBzcmxxCSQ3LCV4bW04LCV4bW0xMQorCWFuZHEJJXJheCwlcjEyCisJeG9ycQklcmF4LCVyMTMKKwl2cHNsbHEJJDU2LCV4bW04LCV4bW05CisJYWRkcQk5NiglcnNwKSwlcmR4CisJbW92cQklcjgsJXIxNQorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTgKKwl4b3JxCSVyY3gsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZwc3JscQkkNywleG1tMTAsJXhtbTEwCisJeG9ycQklcjksJXIxNQorCWFkZHEJJXIxMiwlcmR4CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcjE1LCVyZGkKKwl2cHNsbHEJJDcsJXhtbTksJXhtbTkKKwl4b3JxCSVyOCwlcjE0CisJYWRkcQklcjEzLCVyZHgKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyOSwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCXZwc3JscQkkNiwleG1tNSwleG1tMTEKKwlhZGRxCSVyZHgsJXIxMQorCWFkZHEJJXJkaSwlcmR4CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwltb3ZxCSVyMTEsJXIxMworCWFkZHEJJXJkeCwlcjE0CisJdnBzbGxxCSQzLCV4bW01LCV4bW0xMAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJkeAorCXZwYWRkcQkleG1tOCwleG1tNiwleG1tNgorCW1vdnEJJXJheCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxOSwleG1tNSwleG1tOQorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJkeCwlcjE0CisJdnBzbGxxCSQ0MiwleG1tMTAsJXhtbTEwCisJYW5kcQklcjExLCVyMTIKKwl4b3JxCSVyMTEsJXIxMworCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlhZGRxCTEwNCglcnNwKSwlcmN4CisJbW92cQklcmR4LCVyZGkKKwl2cHNybHEJJDQyLCV4bW05LCV4bW05CisJeG9ycQklcmJ4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW0xMQorCXhvcnEJJXI4LCVyZGkKKwlhZGRxCSVyMTIsJXJjeAorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl2cGFkZHEJJXhtbTExLCV4bW02LCV4bW02CisJeG9ycQklcmR4LCVyMTQKKwlhZGRxCSVyMTMsJXJjeAorCXZwYWRkcQk2NCglcmJwKSwleG1tNiwleG1tMTAKKwl4b3JxCSVyOCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJdm1vdmRxYQkleG1tMTAsOTYoJXJzcCkKKwl2cGFsaWducgkkOCwleG1tNywleG1tMCwleG1tOAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJjeAorCXZwYWxpZ25yCSQ4LCV4bW0zLCV4bW00LCV4bW0xMQorCW1vdnEJJXIxMSwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJdnBzcmxxCSQxLCV4bW04LCV4bW0xMAorCXhvcnEJJXIxMCwlcjEzCisJeG9ycQklcmF4LCVyMTIKKwl2cGFkZHEJJXhtbTExLCV4bW03LCV4bW03CisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmN4LCVyMTQKKwl2cHNybHEJJDcsJXhtbTgsJXhtbTExCisJYW5kcQklcjEwLCVyMTIKKwl4b3JxCSVyMTAsJXIxMworCXZwc2xscQkkNTYsJXhtbTgsJXhtbTkKKwlhZGRxCTExMiglcnNwKSwlcmJ4CisJbW92cQklcmN4LCVyMTUKKwl2cHhvcgkleG1tMTAsJXhtbTExLCV4bW04CisJeG9ycQklcmF4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl2cHNybHEJJDcsJXhtbTEwLCV4bW0xMAorCXhvcnEJJXJkeCwlcjE1CisJYWRkcQklcjEyLCVyYngKKwl2cHhvcgkleG1tOSwleG1tOCwleG1tOAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXZwc2xscQkkNywleG1tOSwleG1tOQorCXhvcnEJJXJjeCwlcjE0CisJYWRkcQklcjEzLCVyYngKKwl2cHhvcgkleG1tMTAsJXhtbTgsJXhtbTgKKwl4b3JxCSVyZHgsJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwl2cHNybHEJJDYsJXhtbTYsJXhtbTExCisJYWRkcQklcmJ4LCVyOQorCWFkZHEJJXJkaSwlcmJ4CisJdnB4b3IJJXhtbTksJXhtbTgsJXhtbTgKKwltb3ZxCSVyOSwlcjEzCisJYWRkcQklcmJ4LCVyMTQKKwl2cHNsbHEJJDMsJXhtbTYsJXhtbTEwCisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmJ4CisJdnBhZGRxCSV4bW04LCV4bW03LCV4bW03CisJbW92cQklcjEwLCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl2cHNybHEJJDE5LCV4bW02LCV4bW05CisJeG9ycQklcjksJXIxMworCXhvcnEJJXIxMSwlcjEyCisJdnB4b3IJJXhtbTEwLCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyYngsJXIxNAorCXZwc2xscQkkNDIsJXhtbTEwLCV4bW0xMAorCWFuZHEJJXI5LCVyMTIKKwl4b3JxCSVyOSwlcjEzCisJdnB4b3IJJXhtbTksJXhtbTExLCV4bW0xMQorCWFkZHEJMTIwKCVyc3ApLCVyYXgKKwltb3ZxCSVyYngsJXJkaQorCXZwc3JscQkkNDIsJXhtbTksJXhtbTkKKwl4b3JxCSVyMTEsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXZweG9yCSV4bW0xMCwleG1tMTEsJXhtbTExCisJeG9ycQklcmN4LCVyZGkKKwlhZGRxCSVyMTIsJXJheAorCXZweG9yCSV4bW05LCV4bW0xMSwleG1tMTEKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl2cGFkZHEJJXhtbTExLCV4bW03LCV4bW03CisJeG9ycQklcmJ4LCVyMTQKKwlhZGRxCSVyMTMsJXJheAorCXZwYWRkcQk5NiglcmJwKSwleG1tNywleG1tMTAKKwl4b3JxCSVyY3gsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyYXgsJXI4CisJYWRkcQklcjE1LCVyYXgKKwltb3ZxCSVyOCwlcjEzCisJYWRkcQklcmF4LCVyMTQKKwl2bW92ZHFhCSV4bW0xMCwxMTIoJXJzcCkKKwljbXBiCSQwLDEzNSglcmJwKQorCWpuZQlMJGF2eF8wMF80NworCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJheAorCW1vdnEJJXI5LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyOCwlcjEzCisJeG9ycQklcjEwLCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyYXgsJXIxNAorCWFuZHEJJXI4LCVyMTIKKwl4b3JxCSVyOCwlcjEzCisJYWRkcQkwKCVyc3ApLCVyMTEKKwltb3ZxCSVyYXgsJXIxNQorCXhvcnEJJXIxMCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcmJ4LCVyMTUKKwlhZGRxCSVyMTIsJXIxMQorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXJheCwlcjE0CisJYWRkcQklcjEzLCVyMTEKKwl4b3JxCSVyYngsJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyMTEsJXJkeAorCWFkZHEJJXJkaSwlcjExCisJbW92cQklcmR4LCVyMTMKKwlhZGRxCSVyMTEsJXIxNAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXIxMQorCW1vdnEJJXI4LCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyZHgsJXIxMworCXhvcnEJJXI5LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyMTEsJXIxNAorCWFuZHEJJXJkeCwlcjEyCisJeG9ycQklcmR4LCVyMTMKKwlhZGRxCTgoJXJzcCksJXIxMAorCW1vdnEJJXIxMSwlcmRpCisJeG9ycQklcjksJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXJheCwlcmRpCisJYWRkcQklcjEyLCVyMTAKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyMTEsJXIxNAorCWFkZHEJJXIxMywlcjEwCisJeG9ycQklcmF4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjEwLCVyY3gKKwlhZGRxCSVyMTUsJXIxMAorCW1vdnEJJXJjeCwlcjEzCisJYWRkcQklcjEwLCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyMTAKKwltb3ZxCSVyZHgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXJjeCwlcjEzCisJeG9ycQklcjgsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXIxMCwlcjE0CisJYW5kcQklcmN4LCVyMTIKKwl4b3JxCSVyY3gsJXIxMworCWFkZHEJMTYoJXJzcCksJXI5CisJbW92cQklcjEwLCVyMTUKKwl4b3JxCSVyOCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcjExLCVyMTUKKwlhZGRxCSVyMTIsJXI5CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcjEwLCVyMTQKKwlhZGRxCSVyMTMsJXI5CisJeG9ycQklcjExLCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjksJXJieAorCWFkZHEJJXJkaSwlcjkKKwltb3ZxCSVyYngsJXIxMworCWFkZHEJJXI5LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyOQorCW1vdnEJJXJjeCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJeG9ycQklcmJ4LCVyMTMKKwl4b3JxCSVyZHgsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXI5LCVyMTQKKwlhbmRxCSVyYngsJXIxMgorCXhvcnEJJXJieCwlcjEzCisJYWRkcQkyNCglcnNwKSwlcjgKKwltb3ZxCSVyOSwlcmRpCisJeG9ycQklcmR4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyMTAsJXJkaQorCWFkZHEJJXIxMiwlcjgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyOSwlcjE0CisJYWRkcQklcjEzLCVyOAorCXhvcnEJJXIxMCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXI4LCVyYXgKKwlhZGRxCSVyMTUsJXI4CisJbW92cQklcmF4LCVyMTMKKwlhZGRxCSVyOCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjgKKwltb3ZxCSVyYngsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXJheCwlcjEzCisJeG9ycQklcmN4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyOCwlcjE0CisJYW5kcQklcmF4LCVyMTIKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJMzIoJXJzcCksJXJkeAorCW1vdnEJJXI4LCVyMTUKKwl4b3JxCSVyY3gsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXI5LCVyMTUKKwlhZGRxCSVyMTIsJXJkeAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXI4LCVyMTQKKwlhZGRxCSVyMTMsJXJkeAorCXhvcnEJJXI5LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmR4LCVyMTEKKwlhZGRxCSVyZGksJXJkeAorCW1vdnEJJXIxMSwlcjEzCisJYWRkcQklcmR4LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyZHgKKwltb3ZxCSVyYXgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyZHgsJXIxNAorCWFuZHEJJXIxMSwlcjEyCisJeG9ycQklcjExLCVyMTMKKwlhZGRxCTQwKCVyc3ApLCVyY3gKKwltb3ZxCSVyZHgsJXJkaQorCXhvcnEJJXJieCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcjgsJXJkaQorCWFkZHEJJXIxMiwlcmN4CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXJkaSwlcjE1CisJeG9ycQklcmR4LCVyMTQKKwlhZGRxCSVyMTMsJXJjeAorCXhvcnEJJXI4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmN4LCVyMTAKKwlhZGRxCSVyMTUsJXJjeAorCW1vdnEJJXIxMCwlcjEzCisJYWRkcQklcmN4LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyY3gKKwltb3ZxCSVyMTEsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXIxMCwlcjEzCisJeG9ycQklcmF4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyY3gsJXIxNAorCWFuZHEJJXIxMCwlcjEyCisJeG9ycQklcjEwLCVyMTMKKwlhZGRxCTQ4KCVyc3ApLCVyYngKKwltb3ZxCSVyY3gsJXIxNQorCXhvcnEJJXJheCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcmR4LCVyMTUKKwlhZGRxCSVyMTIsJXJieAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXJjeCwlcjE0CisJYWRkcQklcjEzLCVyYngKKwl4b3JxCSVyZHgsJXJkaQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyYngsJXI5CisJYWRkcQklcmRpLCVyYngKKwltb3ZxCSVyOSwlcjEzCisJYWRkcQklcmJ4LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyYngKKwltb3ZxCSVyMTAsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXI5LCVyMTMKKwl4b3JxCSVyMTEsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXJieCwlcjE0CisJYW5kcQklcjksJXIxMgorCXhvcnEJJXI5LCVyMTMKKwlhZGRxCTU2KCVyc3ApLCVyYXgKKwltb3ZxCSVyYngsJXJkaQorCXhvcnEJJXIxMSwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcmN4LCVyZGkKKwlhZGRxCSVyMTIsJXJheAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJieCwlcjE0CisJYWRkcQklcjEzLCVyYXgKKwl4b3JxCSVyY3gsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyYXgsJXI4CisJYWRkcQklcjE1LCVyYXgKKwltb3ZxCSVyOCwlcjEzCisJYWRkcQklcmF4LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyYXgKKwltb3ZxCSVyOSwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJeG9ycQklcjgsJXIxMworCXhvcnEJJXIxMCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmF4LCVyMTQKKwlhbmRxCSVyOCwlcjEyCisJeG9ycQklcjgsJXIxMworCWFkZHEJNjQoJXJzcCksJXIxMQorCW1vdnEJJXJheCwlcjE1CisJeG9ycQklcjEwLCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyYngsJXIxNQorCWFkZHEJJXIxMiwlcjExCisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcmF4LCVyMTQKKwlhZGRxCSVyMTMsJXIxMQorCXhvcnEJJXJieCwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXIxMSwlcmR4CisJYWRkcQklcmRpLCVyMTEKKwltb3ZxCSVyZHgsJXIxMworCWFkZHEJJXIxMSwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjExCisJbW92cQklcjgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXJkeCwlcjEzCisJeG9ycQklcjksJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXIxMSwlcjE0CisJYW5kcQklcmR4LCVyMTIKKwl4b3JxCSVyZHgsJXIxMworCWFkZHEJNzIoJXJzcCksJXIxMAorCW1vdnEJJXIxMSwlcmRpCisJeG9ycQklcjksJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXJheCwlcmRpCisJYWRkcQklcjEyLCVyMTAKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyMTEsJXIxNAorCWFkZHEJJXIxMywlcjEwCisJeG9ycQklcmF4LCVyMTUKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjEwLCVyY3gKKwlhZGRxCSVyMTUsJXIxMAorCW1vdnEJJXJjeCwlcjEzCisJYWRkcQklcjEwLCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyMTAKKwltb3ZxCSVyZHgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXJjeCwlcjEzCisJeG9ycQklcjgsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXIxMCwlcjE0CisJYW5kcQklcmN4LCVyMTIKKwl4b3JxCSVyY3gsJXIxMworCWFkZHEJODAoJXJzcCksJXI5CisJbW92cQklcjEwLCVyMTUKKwl4b3JxCSVyOCwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcjExLCVyMTUKKwlhZGRxCSVyMTIsJXI5CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcjEwLCVyMTQKKwlhZGRxCSVyMTMsJXI5CisJeG9ycQklcjExLCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcjksJXJieAorCWFkZHEJJXJkaSwlcjkKKwltb3ZxCSVyYngsJXIxMworCWFkZHEJJXI5LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyOQorCW1vdnEJJXJjeCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJeG9ycQklcmJ4LCVyMTMKKwl4b3JxCSVyZHgsJXIxMgorCXNocmRxCSQ0LCVyMTMsJXIxMworCXhvcnEJJXI5LCVyMTQKKwlhbmRxCSVyYngsJXIxMgorCXhvcnEJJXJieCwlcjEzCisJYWRkcQk4OCglcnNwKSwlcjgKKwltb3ZxCSVyOSwlcmRpCisJeG9ycQklcmR4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyMTAsJXJkaQorCWFkZHEJJXIxMiwlcjgKKwlzaHJkcQkkMTQsJXIxMywlcjEzCisJYW5kcQklcmRpLCVyMTUKKwl4b3JxCSVyOSwlcjE0CisJYWRkcQklcjEzLCVyOAorCXhvcnEJJXIxMCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXI4LCVyYXgKKwlhZGRxCSVyMTUsJXI4CisJbW92cQklcmF4LCVyMTMKKwlhZGRxCSVyOCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcjgKKwltb3ZxCSVyYngsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXJheCwlcjEzCisJeG9ycQklcmN4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyOCwlcjE0CisJYW5kcQklcmF4LCVyMTIKKwl4b3JxCSVyYXgsJXIxMworCWFkZHEJOTYoJXJzcCksJXJkeAorCW1vdnEJJXI4LCVyMTUKKwl4b3JxCSVyY3gsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXI5LCVyMTUKKwlhZGRxCSVyMTIsJXJkeAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyMTUsJXJkaQorCXhvcnEJJXI4LCVyMTQKKwlhZGRxCSVyMTMsJXJkeAorCXhvcnEJJXI5LCVyZGkKKwlzaHJkcQkkMjgsJXIxNCwlcjE0CisJYWRkcQklcmR4LCVyMTEKKwlhZGRxCSVyZGksJXJkeAorCW1vdnEJJXIxMSwlcjEzCisJYWRkcQklcmR4LCVyMTQKKwlzaHJkcQkkMjMsJXIxMywlcjEzCisJbW92cQklcjE0LCVyZHgKKwltb3ZxCSVyYXgsJXIxMgorCXNocmRxCSQ1LCVyMTQsJXIxNAorCXhvcnEJJXIxMSwlcjEzCisJeG9ycQklcmJ4LCVyMTIKKwlzaHJkcQkkNCwlcjEzLCVyMTMKKwl4b3JxCSVyZHgsJXIxNAorCWFuZHEJJXIxMSwlcjEyCisJeG9ycQklcjExLCVyMTMKKwlhZGRxCTEwNCglcnNwKSwlcmN4CisJbW92cQklcmR4LCVyZGkKKwl4b3JxCSVyYngsJXIxMgorCXNocmRxCSQ2LCVyMTQsJXIxNAorCXhvcnEJJXI4LCVyZGkKKwlhZGRxCSVyMTIsJXJjeAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJkeCwlcjE0CisJYWRkcQklcjEzLCVyY3gKKwl4b3JxCSVyOCwlcjE1CisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJjeCwlcjEwCisJYWRkcQklcjE1LCVyY3gKKwltb3ZxCSVyMTAsJXIxMworCWFkZHEJJXJjeCwlcjE0CisJc2hyZHEJJDIzLCVyMTMsJXIxMworCW1vdnEJJXIxNCwlcmN4CisJbW92cQklcjExLCVyMTIKKwlzaHJkcQkkNSwlcjE0LCVyMTQKKwl4b3JxCSVyMTAsJXIxMworCXhvcnEJJXJheCwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmN4LCVyMTQKKwlhbmRxCSVyMTAsJXIxMgorCXhvcnEJJXIxMCwlcjEzCisJYWRkcQkxMTIoJXJzcCksJXJieAorCW1vdnEJJXJjeCwlcjE1CisJeG9ycQklcmF4LCVyMTIKKwlzaHJkcQkkNiwlcjE0LCVyMTQKKwl4b3JxCSVyZHgsJXIxNQorCWFkZHEJJXIxMiwlcmJ4CisJc2hyZHEJJDE0LCVyMTMsJXIxMworCWFuZHEJJXIxNSwlcmRpCisJeG9ycQklcmN4LCVyMTQKKwlhZGRxCSVyMTMsJXJieAorCXhvcnEJJXJkeCwlcmRpCisJc2hyZHEJJDI4LCVyMTQsJXIxNAorCWFkZHEJJXJieCwlcjkKKwlhZGRxCSVyZGksJXJieAorCW1vdnEJJXI5LCVyMTMKKwlhZGRxCSVyYngsJXIxNAorCXNocmRxCSQyMywlcjEzLCVyMTMKKwltb3ZxCSVyMTQsJXJieAorCW1vdnEJJXIxMCwlcjEyCisJc2hyZHEJJDUsJXIxNCwlcjE0CisJeG9ycQklcjksJXIxMworCXhvcnEJJXIxMSwlcjEyCisJc2hyZHEJJDQsJXIxMywlcjEzCisJeG9ycQklcmJ4LCVyMTQKKwlhbmRxCSVyOSwlcjEyCisJeG9ycQklcjksJXIxMworCWFkZHEJMTIwKCVyc3ApLCVyYXgKKwltb3ZxCSVyYngsJXJkaQorCXhvcnEJJXIxMSwlcjEyCisJc2hyZHEJJDYsJXIxNCwlcjE0CisJeG9ycQklcmN4LCVyZGkKKwlhZGRxCSVyMTIsJXJheAorCXNocmRxCSQxNCwlcjEzLCVyMTMKKwlhbmRxCSVyZGksJXIxNQorCXhvcnEJJXJieCwlcjE0CisJYWRkcQklcjEzLCVyYXgKKwl4b3JxCSVyY3gsJXIxNQorCXNocmRxCSQyOCwlcjE0LCVyMTQKKwlhZGRxCSVyYXgsJXI4CisJYWRkcQklcjE1LCVyYXgKKwltb3ZxCSVyOCwlcjEzCisJYWRkcQklcmF4LCVyMTQKKwltb3ZxCTEyOCswKCVyc3ApLCVyZGkKKwltb3ZxCSVyMTQsJXJheAorCisJYWRkcQkwKCVyZGkpLCVyYXgKKwlsZWFxCTEyOCglcnNpKSwlcnNpCisJYWRkcQk4KCVyZGkpLCVyYngKKwlhZGRxCTE2KCVyZGkpLCVyY3gKKwlhZGRxCTI0KCVyZGkpLCVyZHgKKwlhZGRxCTMyKCVyZGkpLCVyOAorCWFkZHEJNDAoJXJkaSksJXI5CisJYWRkcQk0OCglcmRpKSwlcjEwCisJYWRkcQk1NiglcmRpKSwlcjExCisKKwljbXBxCTEyOCsxNiglcnNwKSwlcnNpCisKKwltb3ZxCSVyYXgsMCglcmRpKQorCW1vdnEJJXJieCw4KCVyZGkpCisJbW92cQklcmN4LDE2KCVyZGkpCisJbW92cQklcmR4LDI0KCVyZGkpCisJbW92cQklcjgsMzIoJXJkaSkKKwltb3ZxCSVyOSw0MCglcmRpKQorCW1vdnEJJXIxMCw0OCglcmRpKQorCW1vdnEJJXIxMSw1NiglcmRpKQorCWpiCUwkbG9vcF9hdngKKworCW1vdnEJMTUyKCVyc3ApLCVyc2kKKworCXZ6ZXJvdXBwZXIKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRlcGlsb2d1ZV9hdng6CisJLmJ5dGUJMHhmMywweGMzCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvdnBhZXMteDg2XzY0LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvdnBhZXMteDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3ZGY2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS92cGFlcy14ODZfNjQuUwpAQCAtMCwwICsxLDgzNCBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisucDJhbGlnbgk0CitfdnBhZXNfZW5jcnlwdF9jb3JlOgorCW1vdnEJJXJkeCwlcjkKKwltb3ZxCSQxNiwlcjExCisJbW92bAkyNDAoJXJkeCksJWVheAorCW1vdmRxYQkleG1tOSwleG1tMQorCW1vdmRxYQlMJGtfaXB0KCVyaXApLCV4bW0yCisJcGFuZG4JJXhtbTAsJXhtbTEKKwltb3ZkcXUJKCVyOSksJXhtbTUKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQlMJGtfaXB0KzE2KCVyaXApLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlweG9yCSV4bW01LCV4bW0yCisJYWRkcQkkMTYsJXI5CisJcHhvcgkleG1tMiwleG1tMAorCWxlYXEJTCRrX21jX2JhY2t3YXJkKCVyaXApLCVyMTAKKwlqbXAJTCRlbmNfZW50cnkKKworLnAyYWxpZ24JNAorTCRlbmNfbG9vcDoKKworCW1vdmRxYQkleG1tMTMsJXhtbTQKKwltb3ZkcWEJJXhtbTEyLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NQorCXB4b3IJJXhtbTUsJXhtbTQKKwltb3ZkcWEJJXhtbTE1LCV4bW01CisJcHhvcgkleG1tNCwleG1tMAorCW1vdmRxYQktNjQoJXIxMSwlcjEwLDEpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzQKKwltb3ZkcWEJKCVyMTEsJXIxMCwxKSwleG1tNAorCW1vdmRxYQkleG1tMTQsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMQorCW1vdmRxYQkleG1tMCwleG1tMworCXB4b3IJJXhtbTUsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDE5MworCWFkZHEJJDE2LCVyOQorCXB4b3IJJXhtbTIsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMAorCWFkZHEJJDE2LCVyMTEKKwlweG9yCSV4bW0wLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlhbmRxCSQweDMwLCVyMTEKKwlzdWJxCSQxLCVyYXgKKwlweG9yCSV4bW0zLCV4bW0wCisKK0wkZW5jX2VudHJ5OgorCisJbW92ZHFhCSV4bW05LCV4bW0xCisJbW92ZHFhCSV4bW0xMSwleG1tNQorCXBhbmRuCSV4bW0wLCV4bW0xCisJcHNybGQJJDQsJXhtbTEKKwlwYW5kCSV4bW05LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMzIKKwltb3ZkcWEJJXhtbTEwLCV4bW0zCisJcHhvcgkleG1tMSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJbW92ZHFhCSV4bW0xMCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNAorCW1vdmRxYQkleG1tMTAsJXhtbTIKKwlweG9yCSV4bW01LCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwltb3ZkcWEJJXhtbTEwLCV4bW0zCisJcHhvcgkleG1tMCwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJbW92ZHF1CSglcjkpLCV4bW01CisJcHhvcgkleG1tMSwleG1tMworCWpueglMJGVuY19sb29wCisKKworCW1vdmRxYQktOTYoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTgwKCVyMTApLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKwlweG9yCSV4bW01LCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTUKKwltb3ZkcWEJNjQoJXIxMSwlcjEwLDEpLCV4bW0xCisJcHhvcgkleG1tNCwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKworCisKKworLnAyYWxpZ24JNAorX3ZwYWVzX2RlY3J5cHRfY29yZToKKwltb3ZxCSVyZHgsJXI5CisJbW92bAkyNDAoJXJkeCksJWVheAorCW1vdmRxYQkleG1tOSwleG1tMQorCW1vdmRxYQlMJGtfZGlwdCglcmlwKSwleG1tMgorCXBhbmRuCSV4bW0wLCV4bW0xCisJbW92cQklcmF4LCVyMTEKKwlwc3JsZAkkNCwleG1tMQorCW1vdmRxdQkoJXI5KSwleG1tNQorCXNobHEJJDQsJXIxMQorCXBhbmQJJXhtbTksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQlMJGtfZGlwdCsxNiglcmlwKSwleG1tMAorCXhvcnEJJDB4MzAsJXIxMQorCWxlYXEJTCRrX2RzYmQoJXJpcCksJXIxMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJYW5kcQkkMHgzMCwlcjExCisJcHhvcgkleG1tNSwleG1tMgorCW1vdmRxYQlMJGtfbWNfZm9yd2FyZCs0OCglcmlwKSwleG1tNQorCXB4b3IJJXhtbTIsJXhtbTAKKwlhZGRxCSQxNiwlcjkKKwlhZGRxCSVyMTAsJXIxMQorCWptcAlMJGRlY19lbnRyeQorCisucDJhbGlnbgk0CitMJGRlY19sb29wOgorCisKKworCW1vdmRxYQktMzIoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTE2KCVyMTApLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMworCXB4b3IJJXhtbTQsJXhtbTAKKwltb3ZkcWEJMCglcjEwKSwleG1tNAorCXB4b3IJJXhtbTEsJXhtbTAKKwltb3ZkcWEJMTYoJXIxMCksJXhtbTEKKworLmJ5dGUJMTAyLDE1LDU2LDAsMjI2CisuYnl0ZQkxMDIsMTUsNTYsMCwxOTcKKy5ieXRlCTEwMiwxNSw1NiwwLDIwMworCXB4b3IJJXhtbTQsJXhtbTAKKwltb3ZkcWEJMzIoJXIxMCksJXhtbTQKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCTQ4KCVyMTApLCV4bW0xCisKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorLmJ5dGUJMTAyLDE1LDU2LDAsMTk3CisuYnl0ZQkxMDIsMTUsNTYsMCwyMDMKKwlweG9yCSV4bW00LCV4bW0wCisJbW92ZHFhCTY0KCVyMTApLCV4bW00CisJcHhvcgkleG1tMSwleG1tMAorCW1vdmRxYQk4MCglcjEwKSwleG1tMQorCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NworLmJ5dGUJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgkleG1tNCwleG1tMAorCWFkZHEJJDE2LCVyOQorLmJ5dGUJMTAyLDE1LDU4LDE1LDIzNywxMgorCXB4b3IJJXhtbTEsJXhtbTAKKwlzdWJxCSQxLCVyYXgKKworTCRkZWNfZW50cnk6CisKKwltb3ZkcWEJJXhtbTksJXhtbTEKKwlwYW5kbgkleG1tMCwleG1tMQorCW1vdmRxYQkleG1tMTEsJXhtbTIKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTksJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQkleG1tMTAsJXhtbTMKKwlweG9yCSV4bW0xLCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcWEJJXhtbTEwLCV4bW00CisJcHhvcgkleG1tMiwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjI0CisJcHhvcgkleG1tMiwleG1tNAorCW1vdmRxYQkleG1tMTAsJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMQorCW1vdmRxYQkleG1tMTAsJXhtbTMKKwlweG9yCSV4bW0wLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjAKKwltb3ZkcXUJKCVyOSksJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0zCisJam56CUwkZGVjX2xvb3AKKworCisJbW92ZHFhCTk2KCVyMTApLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjYKKwlweG9yCSV4bW0wLCV4bW00CisJbW92ZHFhCTExMiglcjEwKSwleG1tMAorCW1vdmRxYQktMzUyKCVyMTEpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTUKKwlweG9yCSV4bW00LCV4bW0wCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTQKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworCisKKworCisucDJhbGlnbgk0CitfdnBhZXNfc2NoZWR1bGVfY29yZToKKworCisKKworCisJY2FsbAlfdnBhZXNfcHJlaGVhdAorCW1vdmRxYQlMJGtfcmNvbiglcmlwKSwleG1tOAorCW1vdmRxdQkoJXJkaSksJXhtbTAKKworCisJbW92ZHFhCSV4bW0wLCV4bW0zCisJbGVhcQlMJGtfaXB0KCVyaXApLCVyMTEKKwljYWxsCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcWEJJXhtbTAsJXhtbTcKKworCWxlYXEJTCRrX3NyKCVyaXApLCVyMTAKKwl0ZXN0cQklcmN4LCVyY3gKKwlqbnoJTCRzY2hlZHVsZV9hbV9kZWNyeXB0aW5nCisKKworCW1vdmRxdQkleG1tMCwoJXJkeCkKKwlqbXAJTCRzY2hlZHVsZV9nbworCitMJHNjaGVkdWxlX2FtX2RlY3J5cHRpbmc6CisKKwltb3ZkcWEJKCVyOCwlcjEwLDEpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcXUJJXhtbTMsKCVyZHgpCisJeG9ycQkkMHgzMCwlcjgKKworTCRzY2hlZHVsZV9nbzoKKwljbXBsCSQxOTIsJWVzaQorCWphCUwkc2NoZWR1bGVfMjU2CisJamUJTCRzY2hlZHVsZV8xOTIKKworCisKKworCisKKworCisKKworTCRzY2hlZHVsZV8xMjg6CisJbW92bAkkMTAsJWVzaQorCitMJG9vcF9zY2hlZHVsZV8xMjg6CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWNxCSVyc2kKKwlqeglMJHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJam1wCUwkb29wX3NjaGVkdWxlXzEyOAorCisKKworCisKKworCisKKworCisKKworCisKKworCisucDJhbGlnbgk0CitMJHNjaGVkdWxlXzE5MjoKKwltb3ZkcXUJOCglcmRpKSwleG1tMAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmRxYQkleG1tMCwleG1tNgorCXB4b3IJJXhtbTQsJXhtbTQKKwltb3ZobHBzCSV4bW00LCV4bW02CisJbW92bAkkNCwlZXNpCisKK0wkb29wX3NjaGVkdWxlXzE5MjoKKwljYWxsCV92cGFlc19zY2hlZHVsZV9yb3VuZAorLmJ5dGUJMTAyLDE1LDU4LDE1LDE5OCw4CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWNxCSVyc2kKKwlqeglMJHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyCisJam1wCUwkb29wX3NjaGVkdWxlXzE5MgorCisKKworCisKKworCisKKworCisKKy5wMmFsaWduCTQKK0wkc2NoZWR1bGVfMjU2OgorCW1vdmRxdQkxNiglcmRpKSwleG1tMAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmwJJDcsJWVzaQorCitMJG9vcF9zY2hlZHVsZV8yNTY6CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJbW92ZHFhCSV4bW0wLCV4bW02CisKKworCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJZGVjcQklcnNpCisJanoJTCRzY2hlZHVsZV9tYW5nbGVfbGFzdAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCisKKwlwc2h1ZmQJJDB4RkYsJXhtbTAsJXhtbTAKKwltb3ZkcWEJJXhtbTcsJXhtbTUKKwltb3ZkcWEJJXhtbTYsJXhtbTcKKwljYWxsCV92cGFlc19zY2hlZHVsZV9sb3dfcm91bmQKKwltb3ZkcWEJJXhtbTUsJXhtbTcKKworCWptcAlMJG9vcF9zY2hlZHVsZV8yNTYKKworCisKKworCisKKworCisKKworCisKKy5wMmFsaWduCTQKK0wkc2NoZWR1bGVfbWFuZ2xlX2xhc3Q6CisKKwlsZWFxCUwka19kZXNrZXcoJXJpcCksJXIxMQorCXRlc3RxCSVyY3gsJXJjeAorCWpueglMJHNjaGVkdWxlX21hbmdsZV9sYXN0X2RlYworCisKKwltb3ZkcWEJKCVyOCwlcjEwLDEpLCV4bW0xCisuYnl0ZQkxMDIsMTUsNTYsMCwxOTMKKwlsZWFxCUwka19vcHQoJXJpcCksJXIxMQorCWFkZHEJJDMyLCVyZHgKKworTCRzY2hlZHVsZV9tYW5nbGVfbGFzdF9kZWM6CisJYWRkcQkkLTE2LCVyZHgKKwlweG9yCUwka19zNjMoJXJpcCksJXhtbTAKKwljYWxsCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcXUJJXhtbTAsKCVyZHgpCisKKworCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXB4b3IJJXhtbTYsJXhtbTYKKwlweG9yCSV4bW03LCV4bW03CisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworLnAyYWxpZ24JNAorX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcjoKKwlwc2h1ZmQJJDB4ODAsJXhtbTYsJXhtbTEKKwlwc2h1ZmQJJDB4RkUsJXhtbTcsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW02CisJcHhvcgkleG1tMSwleG1tMQorCXB4b3IJJXhtbTAsJXhtbTYKKwltb3ZkcWEJJXhtbTYsJXhtbTAKKwltb3ZobHBzCSV4bW0xLCV4bW02CisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisucDJhbGlnbgk0CitfdnBhZXNfc2NoZWR1bGVfcm91bmQ6CisKKwlweG9yCSV4bW0xLCV4bW0xCisuYnl0ZQkxMDIsNjUsMTUsNTgsMTUsMjAwLDE1CisuYnl0ZQkxMDIsNjksMTUsNTgsMTUsMTkyLDE1CisJcHhvcgkleG1tMSwleG1tNworCisKKwlwc2h1ZmQJJDB4RkYsJXhtbTAsJXhtbTAKKy5ieXRlCTEwMiwxNSw1OCwxNSwxOTIsMQorCisKKworCitfdnBhZXNfc2NoZWR1bGVfbG93X3JvdW5kOgorCisJbW92ZHFhCSV4bW03LCV4bW0xCisJcHNsbGRxCSQ0LCV4bW03CisJcHhvcgkleG1tMSwleG1tNworCW1vdmRxYQkleG1tNywleG1tMQorCXBzbGxkcQkkOCwleG1tNworCXB4b3IJJXhtbTEsJXhtbTcKKwlweG9yCUwka19zNjMoJXJpcCksJXhtbTcKKworCisJbW92ZHFhCSV4bW05LCV4bW0xCisJcGFuZG4JJXhtbTAsJXhtbTEKKwlwc3JsZAkkNCwleG1tMQorCXBhbmQJJXhtbTksJXhtbTAKKwltb3ZkcWEJJXhtbTExLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMDgKKwlweG9yCSV4bW0xLCV4bW0wCisJbW92ZHFhCSV4bW0xMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgkleG1tMiwleG1tMworCW1vdmRxYQkleG1tMTAsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNAorCXB4b3IJJXhtbTIsJXhtbTQKKwltb3ZkcWEJJXhtbTEwLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTEKKwlweG9yCSV4bW0wLCV4bW0yCisJbW92ZHFhCSV4bW0xMCwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIwCisJcHhvcgkleG1tMSwleG1tMworCW1vdmRxYQkleG1tMTMsJXhtbTQKKy5ieXRlCTEwMiwxNSw1NiwwLDIyNgorCW1vdmRxYQkleG1tMTIsJXhtbTAKKy5ieXRlCTEwMiwxNSw1NiwwLDE5NQorCXB4b3IJJXhtbTQsJXhtbTAKKworCisJcHhvcgkleG1tNywleG1tMAorCW1vdmRxYQkleG1tMCwleG1tNworCS5ieXRlCTB4ZjMsMHhjMworCisKKworCisKKworCisKKworCisKKworLnAyYWxpZ24JNAorX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybToKKwltb3ZkcWEJJXhtbTksJXhtbTEKKwlwYW5kbgkleG1tMCwleG1tMQorCXBzcmxkCSQ0LCV4bW0xCisJcGFuZAkleG1tOSwleG1tMAorCW1vdmRxYQkoJXIxMSksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQkxNiglcjExKSwleG1tMAorLmJ5dGUJMTAyLDE1LDU2LDAsMTkzCisJcHhvcgkleG1tMiwleG1tMAorCS5ieXRlCTB4ZjMsMHhjMworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKy5wMmFsaWduCTQKK192cGFlc19zY2hlZHVsZV9tYW5nbGU6CisJbW92ZHFhCSV4bW0wLCV4bW00CisJbW92ZHFhCUwka19tY19mb3J3YXJkKCVyaXApLCV4bW01CisJdGVzdHEJJXJjeCwlcmN4CisJam56CUwkc2NoZWR1bGVfbWFuZ2xlX2RlYworCisKKwlhZGRxCSQxNiwlcmR4CisJcHhvcglMJGtfczYzKCVyaXApLCV4bW00CisuYnl0ZQkxMDIsMTUsNTYsMCwyMjkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyOQorCXB4b3IJJXhtbTQsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyOQorCXB4b3IJJXhtbTQsJXhtbTMKKworCWptcAlMJHNjaGVkdWxlX21hbmdsZV9ib3RoCisucDJhbGlnbgk0CitMJHNjaGVkdWxlX21hbmdsZV9kZWM6CisKKwlsZWFxCUwka19ka3NkKCVyaXApLCVyMTEKKwltb3ZkcWEJJXhtbTksJXhtbTEKKwlwYW5kbgkleG1tNCwleG1tMQorCXBzcmxkCSQ0LCV4bW0xCisJcGFuZAkleG1tOSwleG1tNAorCisJbW92ZHFhCTAoJXIxMSksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMgorCW1vdmRxYQkxNiglcjExKSwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgkleG1tMiwleG1tMworLmJ5dGUJMTAyLDE1LDU2LDAsMjIxCisKKwltb3ZkcWEJMzIoJXIxMSksJXhtbTIKKy5ieXRlCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJJXhtbTMsJXhtbTIKKwltb3ZkcWEJNDgoJXIxMSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJJXhtbTIsJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIyMQorCisJbW92ZHFhCTY0KCVyMTEpLCV4bW0yCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTIKKwlweG9yCSV4bW0zLCV4bW0yCisJbW92ZHFhCTgwKCVyMTEpLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCSV4bW0yLCV4bW0zCisuYnl0ZQkxMDIsMTUsNTYsMCwyMjEKKworCW1vdmRxYQk5NiglcjExKSwleG1tMgorLmJ5dGUJMTAyLDE1LDU2LDAsMjEyCisJcHhvcgkleG1tMywleG1tMgorCW1vdmRxYQkxMTIoJXIxMSksJXhtbTMKKy5ieXRlCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJJXhtbTIsJXhtbTMKKworCWFkZHEJJC0xNiwlcmR4CisKK0wkc2NoZWR1bGVfbWFuZ2xlX2JvdGg6CisJbW92ZHFhCSglcjgsJXIxMCwxKSwleG1tMQorLmJ5dGUJMTAyLDE1LDU2LDAsMjE3CisJYWRkcQkkLTE2LCVyOAorCWFuZHEJJDB4MzAsJXI4CisJbW92ZHF1CSV4bW0zLCglcmR4KQorCS5ieXRlCTB4ZjMsMHhjMworCisKKworCisKKy5nbG9ibAlfdnBhZXNfc2V0X2VuY3J5cHRfa2V5CisucHJpdmF0ZV9leHRlcm4gX3ZwYWVzX3NldF9lbmNyeXB0X2tleQorCisucDJhbGlnbgk0CitfdnBhZXNfc2V0X2VuY3J5cHRfa2V5OgorCW1vdmwJJWVzaSwlZWF4CisJc2hybAkkNSwlZWF4CisJYWRkbAkkNSwlZWF4CisJbW92bAklZWF4LDI0MCglcmR4KQorCisJbW92bAkkMCwlZWN4CisJbW92bAkkMHgzMCwlcjhkCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfY29yZQorCXhvcmwJJWVheCwlZWF4CisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV92cGFlc19zZXRfZGVjcnlwdF9rZXkKKy5wcml2YXRlX2V4dGVybiBfdnBhZXNfc2V0X2RlY3J5cHRfa2V5CisKKy5wMmFsaWduCTQKK192cGFlc19zZXRfZGVjcnlwdF9rZXk6CisJbW92bAklZXNpLCVlYXgKKwlzaHJsCSQ1LCVlYXgKKwlhZGRsCSQ1LCVlYXgKKwltb3ZsCSVlYXgsMjQwKCVyZHgpCisJc2hsbAkkNCwlZWF4CisJbGVhcQkxNiglcmR4LCVyYXgsMSksJXJkeAorCisJbW92bAkkMSwlZWN4CisJbW92bAklZXNpLCVyOGQKKwlzaHJsCSQxLCVyOGQKKwlhbmRsCSQzMiwlcjhkCisJeG9ybAkkMzIsJXI4ZAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX2NvcmUKKwl4b3JsCSVlYXgsJWVheAorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfdnBhZXNfZW5jcnlwdAorLnByaXZhdGVfZXh0ZXJuIF92cGFlc19lbmNyeXB0CisKKy5wMmFsaWduCTQKK192cGFlc19lbmNyeXB0OgorCW1vdmRxdQkoJXJkaSksJXhtbTAKKwljYWxsCV92cGFlc19wcmVoZWF0CisJY2FsbAlfdnBhZXNfZW5jcnlwdF9jb3JlCisJbW92ZHF1CSV4bW0wLCglcnNpKQorCS5ieXRlCTB4ZjMsMHhjMworCisKKy5nbG9ibAlfdnBhZXNfZGVjcnlwdAorLnByaXZhdGVfZXh0ZXJuIF92cGFlc19kZWNyeXB0CisKKy5wMmFsaWduCTQKK192cGFlc19kZWNyeXB0OgorCW1vdmRxdQkoJXJkaSksJXhtbTAKKwljYWxsCV92cGFlc19wcmVoZWF0CisJY2FsbAlfdnBhZXNfZGVjcnlwdF9jb3JlCisJbW92ZHF1CSV4bW0wLCglcnNpKQorCS5ieXRlCTB4ZjMsMHhjMworCisuZ2xvYmwJX3ZwYWVzX2NiY19lbmNyeXB0CisucHJpdmF0ZV9leHRlcm4gX3ZwYWVzX2NiY19lbmNyeXB0CisKKy5wMmFsaWduCTQKK192cGFlc19jYmNfZW5jcnlwdDoKKwl4Y2hncQklcmN4LCVyZHgKKwlzdWJxCSQxNiwlcmN4CisJamMJTCRjYmNfYWJvcnQKKwltb3ZkcXUJKCVyOCksJXhtbTYKKwlzdWJxCSVyZGksJXJzaQorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKwljbXBsCSQwLCVyOWQKKwlqZQlMJGNiY19kZWNfbG9vcAorCWptcAlMJGNiY19lbmNfbG9vcAorLnAyYWxpZ24JNAorTCRjYmNfZW5jX2xvb3A6CisJbW92ZHF1CSglcmRpKSwleG1tMAorCXB4b3IJJXhtbTYsJXhtbTAKKwljYWxsCV92cGFlc19lbmNyeXB0X2NvcmUKKwltb3ZkcWEJJXhtbTAsJXhtbTYKKwltb3ZkcXUJJXhtbTAsKCVyc2ksJXJkaSwxKQorCWxlYXEJMTYoJXJkaSksJXJkaQorCXN1YnEJJDE2LCVyY3gKKwlqbmMJTCRjYmNfZW5jX2xvb3AKKwlqbXAJTCRjYmNfZG9uZQorLnAyYWxpZ24JNAorTCRjYmNfZGVjX2xvb3A6CisJbW92ZHF1CSglcmRpKSwleG1tMAorCW1vdmRxYQkleG1tMCwleG1tNworCWNhbGwJX3ZwYWVzX2RlY3J5cHRfY29yZQorCXB4b3IJJXhtbTYsJXhtbTAKKwltb3ZkcWEJJXhtbTcsJXhtbTYKKwltb3ZkcXUJJXhtbTAsKCVyc2ksJXJkaSwxKQorCWxlYXEJMTYoJXJkaSksJXJkaQorCXN1YnEJJDE2LCVyY3gKKwlqbmMJTCRjYmNfZGVjX2xvb3AKK0wkY2JjX2RvbmU6CisJbW92ZHF1CSV4bW02LCglcjgpCitMJGNiY19hYm9ydDoKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworCisKKworCisucDJhbGlnbgk0CitfdnBhZXNfcHJlaGVhdDoKKwlsZWFxCUwka19zMEYoJXJpcCksJXIxMAorCW1vdmRxYQktMzIoJXIxMCksJXhtbTEwCisJbW92ZHFhCS0xNiglcjEwKSwleG1tMTEKKwltb3ZkcWEJMCglcjEwKSwleG1tOQorCW1vdmRxYQk0OCglcjEwKSwleG1tMTMKKwltb3ZkcWEJNjQoJXIxMCksJXhtbTEyCisJbW92ZHFhCTgwKCVyMTApLCV4bW0xNQorCW1vdmRxYQk5NiglcjEwKSwleG1tMTQKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworCisKKworLnAyYWxpZ24JNgorX3ZwYWVzX2NvbnN0czoKK0wka19pbnY6CisucXVhZAkweDBFMDUwNjBGMEQwODAxODAsIDB4MDQwNzAzMDkwQTBCMEMwMgorLnF1YWQJMHgwMTA0MEEwNjBGMEIwNzgwLCAweDAzMEQwRTBDMDIwNTA4MDkKKworTCRrX3MwRjoKKy5xdWFkCTB4MEYwRjBGMEYwRjBGMEYwRiwgMHgwRjBGMEYwRjBGMEYwRjBGCisKK0wka19pcHQ6CisucXVhZAkweEMyQjJFODk4NUEyQTcwMDAsIDB4Q0FCQUUwOTA1MjIyNzgwOAorLnF1YWQJMHg0QzAxMzA3RDMxN0M0RDAwLCAweENEODBCMUZDQjBGRENDODEKKworTCRrX3NiMToKKy5xdWFkCTB4QjE5QkUxOEZDQjUwM0UwMCwgMHhBNURGN0E2RTE0MkFGNTQ0CisucXVhZAkweDM2MThENDE1RkFFMjIzMDAsIDB4M0JGN0NDQzEwRDJFRDlFRgorTCRrX3NiMjoKKy5xdWFkCTB4RTI3QTkzQzYwQjcxMjQwMCwgMHg1RUI3RTk1NUJDOTgyRkNECisucXVhZAkweDY5RUI4ODQwMEFFMTI5MDAsIDB4QzJBMTYzQzhBQjgyMjM0QQorTCRrX3NibzoKKy5xdWFkCTB4RDBEMjZEMTc2RkJEQzcwMCwgMHgxNUFBQkY3QUM1MDJBODc4CisucXVhZAkweENGRTQ3NEE1NUZCQjZBMDAsIDB4OEUxRTkwRDE0MTJCMzVGQQorCitMJGtfbWNfZm9yd2FyZDoKKy5xdWFkCTB4MDQwNzA2MDUwMDAzMDIwMSwgMHgwQzBGMEUwRDA4MEIwQTA5CisucXVhZAkweDA4MEIwQTA5MDQwNzA2MDUsIDB4MDAwMzAyMDEwQzBGMEUwRAorLnF1YWQJMHgwQzBGMEUwRDA4MEIwQTA5LCAweDA0MDcwNjA1MDAwMzAyMDEKKy5xdWFkCTB4MDAwMzAyMDEwQzBGMEUwRCwgMHgwODBCMEEwOTA0MDcwNjA1CisKK0wka19tY19iYWNrd2FyZDoKKy5xdWFkCTB4MDYwNTA0MDcwMjAxMDAwMywgMHgwRTBEMEMwRjBBMDkwODBCCisucXVhZAkweDAyMDEwMDAzMEUwRDBDMEYsIDB4MEEwOTA4MEIwNjA1MDQwNworLnF1YWQJMHgwRTBEMEMwRjBBMDkwODBCLCAweDA2MDUwNDA3MDIwMTAwMDMKKy5xdWFkCTB4MEEwOTA4MEIwNjA1MDQwNywgMHgwMjAxMDAwMzBFMEQwQzBGCisKK0wka19zcjoKKy5xdWFkCTB4MDcwNjA1MDQwMzAyMDEwMCwgMHgwRjBFMEQwQzBCMEEwOTA4CisucXVhZAkweDAzMEUwOTA0MEYwQTA1MDAsIDB4MEIwNjAxMEMwNzAyMEQwOAorLnF1YWQJMHgwRjA2MEQwNDBCMDIwOTAwLCAweDA3MEUwNTBDMDMwQTAxMDgKKy5xdWFkCTB4MEIwRTAxMDQwNzBBMEQwMCwgMHgwMzA2MDkwQzBGMDIwNTA4CisKK0wka19yY29uOgorLnF1YWQJMHgxRjgzOTFCOUFGOURFRUI2LCAweDcwMkE5ODA4NEQ3QzdEODEKKworTCRrX3M2MzoKKy5xdWFkCTB4NUI1QjVCNUI1QjVCNUI1QiwgMHg1QjVCNUI1QjVCNUI1QjVCCisKK0wka19vcHQ6CisucXVhZAkweEZGOUY0OTI5RDZCNjYwMDAsIDB4Rjc5NzQxMjFERUJFNjgwOAorLnF1YWQJMHgwMUVEQkQ1MTUwQkNFQzAwLCAweEUxMEQ1REIxQjA1QzBDRTAKKworTCRrX2Rlc2tldzoKKy5xdWFkCTB4MDdFNEEzNDA0N0E0RTMwMCwgMHgxREZFQjk1QTVEQkVGOTFBCisucXVhZAkweDVGMzZCNURDODNFQTY5MDAsIDB4Mjg0MUMyQUJGNDlEMUU3NworCisKKworCisKK0wka19ka3NkOgorLnF1YWQJMHhGRUI5MUE1REEzRTQ0NzAwLCAweDA3NDBFM0E0NUExREJFRjkKKy5xdWFkCTB4NDFDMjc3RjRCNTM2ODMwMCwgMHg1RkRDNjlFQUFCMjg5RDFFCitMJGtfZGtzYjoKKy5xdWFkCTB4OUE0RkNBMUY4NTUwRDUwMCwgMHgwM0Q2NTM4NjFDQzk0Qzk5CisucXVhZAkweDExNUJFREE3QjZGQzRBMDAsIDB4RDk5MzI1NkY3RTM0ODJDOAorTCRrX2Rrc2U6CisucXVhZAkweEQ1MDMxQ0NBMUZDOUQ2MDAsIDB4NTM4NTlBNEM5OTRGNTA4NgorLnF1YWQJMHhBMjMxOTYwNTRGREM3QkU4LCAweENENUVGOTZBMjBCMzE0ODcKK0wka19ka3M5OgorLnF1YWQJMHhCNjExNkZDODdFRDlBNzAwLCAweDRBRUQ5MzM0ODIyNTVCRkMKKy5xdWFkCTB4NDU3NjUxNjIyNzE0MzMwMCwgMHg4QkI4OUZBQ0U5REFGRENFCisKKworCisKKworTCRrX2RpcHQ6CisucXVhZAkweDBGNTA1QjA0MEI1NDVGMDAsIDB4MTU0QTQxMUUxMTRFNDUxQQorLnF1YWQJMHg4NkUzODNFNjYwMDU2NTAwLCAweDEyNzcxNzcyRjQ5MUYxOTQKKworTCRrX2RzYjk6CisucXVhZAkweDg1MUMwMzUzOUE4NkQ2MDAsIDB4Q0FENTFGNTA0Rjk5NENDOQorLnF1YWQJMHhDMDNCMTc4OUVDRDc0OTAwLCAweDcyNUUyQzlFQjJGQkE1NjUKK0wka19kc2JkOgorLnF1YWQJMHg3RDU3Q0NERkU2QjFBMjAwLCAweEY1NkU5QjEzODgyQTQ0MzkKKy5xdWFkCTB4M0NFMkZBRjcyNEM2Q0IwMCwgMHgyOTMxMTgwRDE1REVFRkQzCitMJGtfZHNiYjoKKy5xdWFkCTB4RDAyMjY0OTI5NkI0NDIwMCwgMHg2MDI2NDZGNkIwRjJENDA0CisucXVhZAkweEMxOTQ5OEE2Q0Q1OTY3MDAsIDB4RjNGRjBDM0UzMjU1QUE2QgorTCRrX2RzYmU6CisucXVhZAkweDQ2RjI5Mjk2MjZENEQwMDAsIDB4MjI0MjYwMDQ2NEI0RjZCMAorLnF1YWQJMHgwQzU1QTZDREZGQUFDMTAwLCAweDk0NjdGMzZCOTg1OTNFMzIKK0wka19kc2JvOgorLnF1YWQJMHgxMzg3RUE1MzdFRjk0MDAwLCAweEM3QUE2REI5RDQ5NDNFMkQKKy5xdWFkCTB4MTJENzU2MEY5MzQ0MUQwMCwgMHhDQTRCODE1OUQ4QzU4RTlDCisuYnl0ZQk4NiwxMDEsOTksMTE2LDExMSwxMTQsMzIsODAsMTAxLDExNCwxMDksMTE3LDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsNjUsNjksODMsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ3LDgzLDgzLDgzLDY5LDUxLDQ0LDMyLDc3LDEwNSwxMDcsMTAxLDMyLDcyLDk3LDEwOSw5OCwxMTcsMTE0LDEwMywzMiw0MCw4MywxMTYsOTcsMTEwLDEwMiwxMTEsMTE0LDEwMCwzMiw4NSwxMTAsMTA1LDExOCwxMDEsMTE0LDExNSwxMDUsMTE2LDEyMSw0MSwwCisucDJhbGlnbgk2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3g4Nl82NC1tb250LlMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL21hYy14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY2ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3g4Nl82NC1tb250LlMKQEAgLTAsMCArMSwxMjQ0IEBACisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKy50ZXh0CQorCisKKworLmdsb2JsCV9ibl9tdWxfbW9udAorLnByaXZhdGVfZXh0ZXJuIF9ibl9tdWxfbW9udAorCisucDJhbGlnbgk0CitfYm5fbXVsX21vbnQ6CisKKwltb3ZsCSVyOWQsJXI5ZAorCW1vdnEJJXJzcCwlcmF4CisKKwl0ZXN0bAkkMywlcjlkCisJam56CUwkbXVsX2VudGVyCisJY21wbAkkOCwlcjlkCisJamIJTCRtdWxfZW50ZXIKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjExCisJbW92bAk4KCVyMTEpLCVyMTFkCisJY21wcQklcnNpLCVyZHgKKwlqbmUJTCRtdWw0eF9lbnRlcgorCXRlc3RsCSQ3LCVyOWQKKwlqeglMJHNxcjh4X2VudGVyCisJam1wCUwkbXVsNHhfZW50ZXIKKworLnAyYWxpZ24JNAorTCRtdWxfZW50ZXI6CisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCisKKwluZWdxCSVyOQorCW1vdnEJJXJzcCwlcjExCisJbGVhcQktMTYoJXJzcCwlcjksOCksJXIxMAorCW5lZ3EJJXI5CisJYW5kcQkkLTEwMjQsJXIxMAorCisKKworCisKKworCisKKworCXN1YnEJJXIxMCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTAsJXIxMSwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMQorCWNtcHEJJXIxMCwlcnNwCisJamEJTCRtdWxfcGFnZV93YWxrCisJam1wCUwkbXVsX3BhZ2Vfd2Fsa19kb25lCisKKy5wMmFsaWduCTQKK0wkbXVsX3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjExCisJY21wcQklcjEwLCVyc3AKKwlqYQlMJG11bF9wYWdlX3dhbGsKK0wkbXVsX3BhZ2Vfd2Fsa19kb25lOgorCisJbW92cQklcmF4LDgoJXJzcCwlcjksOCkKKworTCRtdWxfYm9keToKKwltb3ZxCSVyZHgsJXIxMgorCW1vdnEJKCVyOCksJXI4CisJbW92cQkoJXIxMiksJXJieAorCW1vdnEJKCVyc2kpLCVyYXgKKworCXhvcnEJJXIxNCwlcjE0CisJeG9ycQklcjE1LCVyMTUKKworCW1vdnEJJXI4LCVyYnAKKwltdWxxCSVyYngKKwltb3ZxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gpLCVyYXgKKworCWltdWxxCSVyMTAsJXJicAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJOCglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTMKKworCWxlYXEJMSglcjE1KSwlcjE1CisJam1wCUwkMXN0X2VudGVyCisKKy5wMmFsaWduCTQKK0wkMXN0OgorCWFkZHEJJXJheCwlcjEzCisJbW92cQkoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCW1vdnEJJXIxMCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCitMJDFzdF9lbnRlcjoKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbGVhcQkxKCVyMTUpLCVyMTUKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJY21wcQklcjksJXIxNQorCWpuZQlMJDFzdAorCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisJbW92cQklcjEwLCVyMTEKKworCXhvcnEJJXJkeCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjksOCkKKwltb3ZxCSVyZHgsKCVyc3AsJXI5LDgpCisKKwlsZWFxCTEoJXIxNCksJXIxNAorCWptcAlMJG91dGVyCisucDJhbGlnbgk0CitMJG91dGVyOgorCW1vdnEJKCVyMTIsJXIxNCw4KSwlcmJ4CisJeG9ycQklcjE1LCVyMTUKKwltb3ZxCSVyOCwlcmJwCisJbW92cQkoJXJzcCksJXIxMAorCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQkoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCisJaW11bHEJJXIxMCwlcmJwCisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJbW92cQk4KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCTgoJXJzcCksJXIxMAorCW1vdnEJJXJkeCwlcjEzCisKKwlsZWFxCTEoJXIxNSksJXIxNQorCWptcAlMJGlubmVyX2VudGVyCisKKy5wMmFsaWduCTQKK0wkaW5uZXI6CisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJbW92cQkoJXJzcCwlcjE1LDgpLCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisKK0wkaW5uZXJfZW50ZXI6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEwCisJbW92cQklcmR4LCVyMTEKKwlhZGNxCSQwLCVyMTEKKwlsZWFxCTEoJXIxNSksJXIxNQorCisJbXVscQklcmJwCisJY21wcQklcjksJXIxNQorCWpuZQlMJGlubmVyCisKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJKCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCW1vdnEJKCVyc3AsJXIxNSw4KSwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisJeG9ycQklcmR4LCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC04KCVyc3AsJXI5LDgpCisJbW92cQklcmR4LCglcnNwLCVyOSw4KQorCisJbGVhcQkxKCVyMTQpLCVyMTQKKwljbXBxCSVyOSwlcjE0CisJamIJTCRvdXRlcgorCisJeG9ycQklcjE0LCVyMTQKKwltb3ZxCSglcnNwKSwlcmF4CisJbW92cQklcjksJXIxNQorCisucDJhbGlnbgk0CitMJHN1YjoJc2JicQkoJXJjeCwlcjE0LDgpLCVyYXgKKwltb3ZxCSVyYXgsKCVyZGksJXIxNCw4KQorCW1vdnEJOCglcnNwLCVyMTQsOCksJXJheAorCWxlYXEJMSglcjE0KSwlcjE0CisJZGVjcQklcjE1CisJam56CUwkc3ViCisKKwlzYmJxCSQwLCVyYXgKKwltb3ZxCSQtMSwlcmJ4CisJeG9ycQklcmF4LCVyYngKKwl4b3JxCSVyMTQsJXIxNAorCW1vdnEJJXI5LCVyMTUKKworTCRjb3B5OgorCW1vdnEJKCVyZGksJXIxNCw4KSwlcmN4CisJbW92cQkoJXJzcCwlcjE0LDgpLCVyZHgKKwlhbmRxCSVyYngsJXJjeAorCWFuZHEJJXJheCwlcmR4CisJbW92cQklcjksKCVyc3AsJXIxNCw4KQorCW9ycQklcmN4LCVyZHgKKwltb3ZxCSVyZHgsKCVyZGksJXIxNCw4KQorCWxlYXEJMSglcjE0KSwlcjE0CisJc3VicQkkMSwlcjE1CisJam56CUwkY29weQorCisJbW92cQk4KCVyc3AsJXI5LDgpLCVyc2kKKworCW1vdnEJJDEsJXJheAorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYnAKKworCW1vdnEJLTgoJXJzaSksJXJieAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJG11bF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTQKK2JuX211bDR4X21vbnQ6CisKKwltb3ZsCSVyOWQsJXI5ZAorCW1vdnEJJXJzcCwlcmF4CisKK0wkbXVsNHhfZW50ZXI6CisJYW5kbAkkMHg4MDEwMCwlcjExZAorCWNtcGwJJDB4ODAxMDAsJXIxMWQKKwlqZQlMJG11bHg0eF9lbnRlcgorCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworCisJbmVncQklcjkKKwltb3ZxCSVyc3AsJXIxMQorCWxlYXEJLTMyKCVyc3AsJXI5LDgpLCVyMTAKKwluZWdxCSVyOQorCWFuZHEJJC0xMDI0LCVyMTAKKworCXN1YnEJJXIxMCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTAsJXIxMSwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMQorCWNtcHEJJXIxMCwlcnNwCisJamEJTCRtdWw0eF9wYWdlX3dhbGsKKwlqbXAJTCRtdWw0eF9wYWdlX3dhbGtfZG9uZQorCitMJG11bDR4X3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjExCisJY21wcQklcjEwLCVyc3AKKwlqYQlMJG11bDR4X3BhZ2Vfd2FsaworTCRtdWw0eF9wYWdlX3dhbGtfZG9uZToKKworCW1vdnEJJXJheCw4KCVyc3AsJXI5LDgpCisKK0wkbXVsNHhfYm9keToKKwltb3ZxCSVyZGksMTYoJXJzcCwlcjksOCkKKwltb3ZxCSVyZHgsJXIxMgorCW1vdnEJKCVyOCksJXI4CisJbW92cQkoJXIxMiksJXJieAorCW1vdnEJKCVyc2kpLCVyYXgKKworCXhvcnEJJXIxNCwlcjE0CisJeG9ycQklcjE1LCVyMTUKKworCW1vdnEJJXI4LCVyYnAKKwltdWxxCSVyYngKKwltb3ZxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gpLCVyYXgKKworCWltdWxxCSVyMTAsJXJicAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJOCglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQk4KCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCTE2KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWxlYXEJNCglcjE1KSwlcjE1CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLCglcnNwKQorCW1vdnEJJXJkeCwlcjEzCisJam1wCUwkMXN0NHgKKy5wMmFsaWduCTQKK0wkMXN0NHg6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJLTgoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtMjQoJXJzcCwlcjE1LDgpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQktOCglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJKCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQk4KCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjE1LDgpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQk4KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbGVhcQk0KCVyMTUpLCVyMTUKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCS0xNiglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0zMiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCWNtcHEJJXI5LCVyMTUKKwlqYglMJDFzdDR4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJLTE2KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCS04KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisJeG9ycQklcmRpLCVyZGkKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkaQorCW1vdnEJJXIxMywtOCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZGksKCVyc3AsJXIxNSw4KQorCisJbGVhcQkxKCVyMTQpLCVyMTQKKy5wMmFsaWduCTIKK0wkb3V0ZXI0eDoKKwltb3ZxCSglcjEyLCVyMTQsOCksJXJieAorCXhvcnEJJXIxNSwlcjE1CisJbW92cQkoJXJzcCksJXIxMAorCW1vdnEJJXI4LCVyYnAKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCWltdWxxCSVyMTAsJXJicAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJOCglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQk4KCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCTgoJXJzcCksJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJMTYoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJbGVhcQk0KCVyMTUpLCVyMTUKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksKCVyc3ApCisJbW92cQklcmR4LCVyMTMKKwlqbXAJTCRpbm5lcjR4CisucDJhbGlnbgk0CitMJGlubmVyNHg6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJLTE2KCVyc3AsJXIxNSw4KSwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCS04KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQktOCglcnNwLCVyMTUsOCksJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJKCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQkoJXJzcCwlcjE1LDgpLCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCTgoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtOCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCTgoJXJjeCwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCTgoJXJzcCwlcjE1LDgpLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwlsZWFxCTQoJXIxNSksJXIxNQorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJLTE2KCVyc2ksJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTMyKCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisJY21wcQklcjksJXIxNQorCWpiCUwkaW5uZXI0eAorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJLTE2KCVyc3AsJXIxNSw4KSwlcjEwCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0yNCglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCS04KCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQktOCglcnNwLCVyMTUsOCksJXIxMQorCWFkY3EJJDAsJXJkeAorCWxlYXEJMSglcjE0KSwlcjE0CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCisJeG9ycQklcmRpLCVyZGkKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkaQorCWFkZHEJKCVyc3AsJXI5LDgpLCVyMTMKKwlhZGNxCSQwLCVyZGkKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjE1LDgpCisJbW92cQklcmRpLCglcnNwLCVyMTUsOCkKKworCWNtcHEJJXI5LCVyMTQKKwlqYglMJG91dGVyNHgKKwltb3ZxCTE2KCVyc3AsJXI5LDgpLCVyZGkKKwlsZWFxCS00KCVyOSksJXIxNQorCW1vdnEJMCglcnNwKSwlcmF4CisJbW92cQk4KCVyc3ApLCVyZHgKKwlzaHJxCSQyLCVyMTUKKwlsZWFxCSglcnNwKSwlcnNpCisJeG9ycQklcjE0LCVyMTQKKworCXN1YnEJMCglcmN4KSwlcmF4CisJbW92cQkxNiglcnNpKSwlcmJ4CisJbW92cQkyNCglcnNpKSwlcmJwCisJc2JicQk4KCVyY3gpLCVyZHgKKworTCRzdWI0eDoKKwltb3ZxCSVyYXgsMCglcmRpLCVyMTQsOCkKKwltb3ZxCSVyZHgsOCglcmRpLCVyMTQsOCkKKwlzYmJxCTE2KCVyY3gsJXIxNCw4KSwlcmJ4CisJbW92cQkzMiglcnNpLCVyMTQsOCksJXJheAorCW1vdnEJNDAoJXJzaSwlcjE0LDgpLCVyZHgKKwlzYmJxCTI0KCVyY3gsJXIxNCw4KSwlcmJwCisJbW92cQklcmJ4LDE2KCVyZGksJXIxNCw4KQorCW1vdnEJJXJicCwyNCglcmRpLCVyMTQsOCkKKwlzYmJxCTMyKCVyY3gsJXIxNCw4KSwlcmF4CisJbW92cQk0OCglcnNpLCVyMTQsOCksJXJieAorCW1vdnEJNTYoJXJzaSwlcjE0LDgpLCVyYnAKKwlzYmJxCTQwKCVyY3gsJXIxNCw4KSwlcmR4CisJbGVhcQk0KCVyMTQpLCVyMTQKKwlkZWNxCSVyMTUKKwlqbnoJTCRzdWI0eAorCisJbW92cQklcmF4LDAoJXJkaSwlcjE0LDgpCisJbW92cQkzMiglcnNpLCVyMTQsOCksJXJheAorCXNiYnEJMTYoJXJjeCwlcjE0LDgpLCVyYngKKwltb3ZxCSVyZHgsOCglcmRpLCVyMTQsOCkKKwlzYmJxCTI0KCVyY3gsJXIxNCw4KSwlcmJwCisJbW92cQklcmJ4LDE2KCVyZGksJXIxNCw4KQorCisJc2JicQkkMCwlcmF4CisJbW92cQklcmJwLDI0KCVyZGksJXIxNCw4KQorCXB4b3IJJXhtbTAsJXhtbTAKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjI0CisJcGNtcGVxZAkleG1tNSwleG1tNQorCXBzaHVmZAkkMCwleG1tNCwleG1tNAorCW1vdnEJJXI5LCVyMTUKKwlweG9yCSV4bW00LCV4bW01CisJc2hycQkkMiwlcjE1CisJeG9ybAklZWF4LCVlYXgKKworCWptcAlMJGNvcHk0eAorLnAyYWxpZ24JNAorTCRjb3B5NHg6CisJbW92ZHFhCSglcnNwLCVyYXgsMSksJXhtbTEKKwltb3ZkcXUJKCVyZGksJXJheCwxKSwleG1tMgorCXBhbmQJJXhtbTQsJXhtbTEKKwlwYW5kCSV4bW01LCV4bW0yCisJbW92ZHFhCTE2KCVyc3AsJXJheCwxKSwleG1tMworCW1vdmRxYQkleG1tMCwoJXJzcCwlcmF4LDEpCisJcG9yCSV4bW0yLCV4bW0xCisJbW92ZHF1CTE2KCVyZGksJXJheCwxKSwleG1tMgorCW1vdmRxdQkleG1tMSwoJXJkaSwlcmF4LDEpCisJcGFuZAkleG1tNCwleG1tMworCXBhbmQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTAsMTYoJXJzcCwlcmF4LDEpCisJcG9yCSV4bW0yLCV4bW0zCisJbW92ZHF1CSV4bW0zLDE2KCVyZGksJXJheCwxKQorCWxlYXEJMzIoJXJheCksJXJheAorCWRlY3EJJXIxNQorCWpueglMJGNvcHk0eAorCW1vdnEJOCglcnNwLCVyOSw4KSwlcnNpCisKKwltb3ZxCSQxLCVyYXgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRtdWw0eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworCisKKy5wMmFsaWduCTUKK2JuX3Nxcjh4X21vbnQ6CisKKwltb3ZxCSVyc3AsJXJheAorCitMJHNxcjh4X2VudGVyOgorCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworTCRzcXI4eF9wcm9sb2d1ZToKKworCW1vdmwJJXI5ZCwlcjEwZAorCXNobGwJJDMsJXI5ZAorCXNobHEJJDMrMiwlcjEwCisJbmVncQklcjkKKworCisKKworCisKKwlsZWFxCS02NCglcnNwLCVyOSwyKSwlcjExCisJbW92cQklcnNwLCVyYnAKKwltb3ZxCSglcjgpLCVyOAorCXN1YnEJJXJzaSwlcjExCisJYW5kcQkkNDA5NSwlcjExCisJY21wcQklcjExLCVyMTAKKwlqYglMJHNxcjh4X3NwX2FsdAorCXN1YnEJJXIxMSwlcmJwCisJbGVhcQktNjQoJXJicCwlcjksMiksJXJicAorCWptcAlMJHNxcjh4X3NwX2RvbmUKKworLnAyYWxpZ24JNQorTCRzcXI4eF9zcF9hbHQ6CisJbGVhcQk0MDk2LTY0KCwlcjksMiksJXIxMAorCWxlYXEJLTY0KCVyYnAsJXI5LDIpLCVyYnAKKwlzdWJxCSVyMTAsJXIxMQorCW1vdnEJJDAsJXIxMAorCWNtb3ZjcQklcjEwLCVyMTEKKwlzdWJxCSVyMTEsJXJicAorTCRzcXI4eF9zcF9kb25lOgorCWFuZHEJJC02NCwlcmJwCisJbW92cQklcnNwLCVyMTEKKwlzdWJxCSVyYnAsJXIxMQorCWFuZHEJJC00MDk2LCVyMTEKKwlsZWFxCSglcjExLCVyYnAsMSksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCUwkc3FyOHhfcGFnZV93YWxrCisJam1wCUwkc3FyOHhfcGFnZV93YWxrX2RvbmUKKworLnAyYWxpZ24JNAorTCRzcXI4eF9wYWdlX3dhbGs6CisJbGVhcQktNDA5NiglcnNwKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMAorCWNtcHEJJXJicCwlcnNwCisJamEJTCRzcXI4eF9wYWdlX3dhbGsKK0wkc3FyOHhfcGFnZV93YWxrX2RvbmU6CisKKwltb3ZxCSVyOSwlcjEwCisJbmVncQklcjkKKworCW1vdnEJJXI4LDMyKCVyc3ApCisJbW92cQklcmF4LDQwKCVyc3ApCisKK0wkc3FyOHhfYm9keToKKworLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDkKKwlweG9yCSV4bW0wLCV4bW0wCisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwNworLmJ5dGUJMTAyLDczLDE1LDExMCwyMTgKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcmF4CisJbW92bAk4KCVyYXgpLCVlYXgKKwlhbmRsCSQweDgwMTAwLCVlYXgKKwljbXBsCSQweDgwMTAwLCVlYXgKKwlqbmUJTCRzcXI4eF9ub3gKKworCWNhbGwJX2JuX3Nxcng4eF9pbnRlcm5hbAorCisKKworCisJbGVhcQkoJXI4LCVyY3gsMSksJXJieAorCW1vdnEJJXJjeCwlcjkKKwltb3ZxCSVyY3gsJXJkeAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDcKKwlzYXJxCSQzKzIsJXJjeAorCWptcAlMJHNxcjh4X3N1YgorCisucDJhbGlnbgk1CitMJHNxcjh4X25veDoKKwljYWxsCV9ibl9zcXI4eF9pbnRlcm5hbAorCisKKworCisJbGVhcQkoJXJkaSwlcjksMSksJXJieAorCW1vdnEJJXI5LCVyY3gKKwltb3ZxCSVyOSwlcmR4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwNworCXNhcnEJJDMrMiwlcmN4CisJam1wCUwkc3FyOHhfc3ViCisKKy5wMmFsaWduCTUKK0wkc3FyOHhfc3ViOgorCW1vdnEJMCglcmJ4KSwlcjEyCisJbW92cQk4KCVyYngpLCVyMTMKKwltb3ZxCTE2KCVyYngpLCVyMTQKKwltb3ZxCTI0KCVyYngpLCVyMTUKKwlsZWFxCTMyKCVyYngpLCVyYngKKwlzYmJxCTAoJXJicCksJXIxMgorCXNiYnEJOCglcmJwKSwlcjEzCisJc2JicQkxNiglcmJwKSwlcjE0CisJc2JicQkyNCglcmJwKSwlcjE1CisJbGVhcQkzMiglcmJwKSwlcmJwCisJbW92cQklcjEyLDAoJXJkaSkKKwltb3ZxCSVyMTMsOCglcmRpKQorCW1vdnEJJXIxNCwxNiglcmRpKQorCW1vdnEJJXIxNSwyNCglcmRpKQorCWxlYXEJMzIoJXJkaSksJXJkaQorCWluY3EJJXJjeAorCWpueglMJHNxcjh4X3N1YgorCisJc2JicQkkMCwlcmF4CisJbGVhcQkoJXJieCwlcjksMSksJXJieAorCWxlYXEJKCVyZGksJXI5LDEpLCVyZGkKKworLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDAKKwlweG9yCSV4bW0wLCV4bW0wCisJcHNodWZkCSQwLCV4bW0xLCV4bW0xCisJbW92cQk0MCglcnNwKSwlcnNpCisKKwlqbXAJTCRzcXI4eF9jb25kX2NvcHkKKworLnAyYWxpZ24JNQorTCRzcXI4eF9jb25kX2NvcHk6CisJbW92ZHFhCTAoJXJieCksJXhtbTIKKwltb3ZkcWEJMTYoJXJieCksJXhtbTMKKwlsZWFxCTMyKCVyYngpLCVyYngKKwltb3ZkcXUJMCglcmRpKSwleG1tNAorCW1vdmRxdQkxNiglcmRpKSwleG1tNQorCWxlYXEJMzIoJXJkaSksJXJkaQorCW1vdmRxYQkleG1tMCwtMzIoJXJieCkKKwltb3ZkcWEJJXhtbTAsLTE2KCVyYngpCisJbW92ZHFhCSV4bW0wLC0zMiglcmJ4LCVyZHgsMSkKKwltb3ZkcWEJJXhtbTAsLTE2KCVyYngsJXJkeCwxKQorCXBjbXBlcWQJJXhtbTEsJXhtbTAKKwlwYW5kCSV4bW0xLCV4bW0yCisJcGFuZAkleG1tMSwleG1tMworCXBhbmQJJXhtbTAsJXhtbTQKKwlwYW5kCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMCwleG1tMAorCXBvcgkleG1tMiwleG1tNAorCXBvcgkleG1tMywleG1tNQorCW1vdmRxdQkleG1tNCwtMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTUsLTE2KCVyZGkpCisJYWRkcQkkMzIsJXI5CisJam56CUwkc3FyOHhfY29uZF9jb3B5CisKKwltb3ZxCSQxLCVyYXgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRzcXI4eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTUKK2JuX211bHg0eF9tb250OgorCisJbW92cQklcnNwLCVyYXgKKworTCRtdWx4NHhfZW50ZXI6CisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCitMJG11bHg0eF9wcm9sb2d1ZToKKworCXNobGwJJDMsJXI5ZAorCXhvcnEJJXIxMCwlcjEwCisJc3VicQklcjksJXIxMAorCW1vdnEJKCVyOCksJXI4CisJbGVhcQktNzIoJXJzcCwlcjEwLDEpLCVyYnAKKwlhbmRxCSQtMTI4LCVyYnAKKwltb3ZxCSVyc3AsJXIxMQorCXN1YnEJJXJicCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTEsJXJicCwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMAorCWNtcHEJJXJicCwlcnNwCisJamEJTCRtdWx4NHhfcGFnZV93YWxrCisJam1wCUwkbXVseDR4X3BhZ2Vfd2Fsa19kb25lCisKKy5wMmFsaWduCTQKK0wkbXVseDR4X3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQlMJG11bHg0eF9wYWdlX3dhbGsKK0wkbXVseDR4X3BhZ2Vfd2Fsa19kb25lOgorCisJbGVhcQkoJXJkeCwlcjksMSksJXIxMAorCisKKworCisKKworCisKKworCisKKworCW1vdnEJJXI5LDAoJXJzcCkKKwlzaHJxCSQ1LCVyOQorCW1vdnEJJXIxMCwxNiglcnNwKQorCXN1YnEJJDEsJXI5CisJbW92cQklcjgsMjQoJXJzcCkKKwltb3ZxCSVyZGksMzIoJXJzcCkKKwltb3ZxCSVyYXgsNDAoJXJzcCkKKworCW1vdnEJJXI5LDQ4KCVyc3ApCisJam1wCUwkbXVseDR4X2JvZHkKKworLnAyYWxpZ24JNQorTCRtdWx4NHhfYm9keToKKwlsZWFxCTgoJXJkeCksJXJkaQorCW1vdnEJKCVyZHgpLCVyZHgKKwlsZWFxCTY0KzMyKCVyc3ApLCVyYngKKwltb3ZxCSVyZHgsJXI5CisKKwltdWx4cQkwKCVyc2kpLCVyOCwlcmF4CisJbXVseHEJOCglcnNpKSwlcjExLCVyMTQKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJkaSw4KCVyc3ApCisJbXVseHEJMTYoJXJzaSksJXIxMiwlcjEzCisJYWRjcQklcjE0LCVyMTIKKwlhZGNxCSQwLCVyMTMKKworCW1vdnEJJXI4LCVyZGkKKwlpbXVscQkyNCglcnNwKSwlcjgKKwl4b3JxCSVyYnAsJXJicAorCisJbXVseHEJMjQoJXJzaSksJXJheCwlcjE0CisJbW92cQklcjgsJXJkeAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWFkY3hxCSVyYXgsJXIxMworCWFkY3hxCSVyYnAsJXIxNAorCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTAKKwlhZGN4cQklcmF4LCVyZGkKKwlhZG94cQklcjExLCVyMTAKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxMQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTIsJXIxMQorLmJ5dGUJMHhjNCwweDYyLDB4ZmIsMHhmNiwweGExLDB4MTAsMHgwMCwweDAwLDB4MDAKKwltb3ZxCTQ4KCVyc3ApLCVyZGkKKwltb3ZxCSVyMTAsLTMyKCVyYngpCisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxMywlcjEyCisJbXVseHEJMjQoJXJjeCksJXJheCwlcjE1CisJbW92cQklcjksJXJkeAorCW1vdnEJJXIxMSwtMjQoJXJieCkKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcmJwLCVyMTUKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCSVyMTIsLTE2KCVyYngpCisKKwlqbXAJTCRtdWx4NHhfMXN0CisKKy5wMmFsaWduCTUKK0wkbXVseDR4XzFzdDoKKwlhZGN4cQklcmJwLCVyMTUKKwltdWx4cQkwKCVyc2kpLCVyMTAsJXJheAorCWFkY3hxCSVyMTQsJXIxMAorCW11bHhxCTgoJXJzaSksJXIxMSwlcjE0CisJYWRjeHEJJXJheCwlcjExCisJbXVseHEJMTYoJXJzaSksJXIxMiwlcmF4CisJYWRjeHEJJXIxNCwlcjEyCisJbXVseHEJMjQoJXJzaSksJXIxMywlcjE0CisuYnl0ZQkweDY3LDB4NjcKKwltb3ZxCSVyOCwlcmR4CisJYWRjeHEJJXJheCwlcjEzCisJYWRjeHEJJXJicCwlcjE0CisJbGVhcQkzMiglcnNpKSwlcnNpCisJbGVhcQkzMiglcmJ4KSwlcmJ4CisKKwlhZG94cQklcjE1LCVyMTAKKwltdWx4cQkwKCVyY3gpLCVyYXgsJXIxNQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTUsJXIxMQorCW11bHhxCTgoJXJjeCksJXJheCwlcjE1CisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxNSwlcjEyCisJbXVseHEJMTYoJXJjeCksJXJheCwlcjE1CisJbW92cQklcjEwLC00MCglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMgorCW1vdnEJJXIxMSwtMzIoJXJieCkKKwlhZG94cQklcjE1LCVyMTMKKwltdWx4cQkyNCglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyOSwlcmR4CisJbW92cQklcjEyLC0yNCglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMworCWFkb3hxCSVyYnAsJXIxNQorCWxlYXEJMzIoJXJjeCksJXJjeAorCW1vdnEJJXIxMywtMTYoJXJieCkKKworCWRlY3EJJXJkaQorCWpueglMJG11bHg0eF8xc3QKKworCW1vdnEJMCglcnNwKSwlcmF4CisJbW92cQk4KCVyc3ApLCVyZGkKKwlhZGNxCSVyYnAsJXIxNQorCWFkZHEJJXIxNSwlcjE0CisJc2JicQklcjE1LCVyMTUKKwltb3ZxCSVyMTQsLTgoJXJieCkKKwlqbXAJTCRtdWx4NHhfb3V0ZXIKKworLnAyYWxpZ24JNQorTCRtdWx4NHhfb3V0ZXI6CisJbW92cQkoJXJkaSksJXJkeAorCWxlYXEJOCglcmRpKSwlcmRpCisJc3VicQklcmF4LCVyc2kKKwltb3ZxCSVyMTUsKCVyYngpCisJbGVhcQk2NCszMiglcnNwKSwlcmJ4CisJc3VicQklcmF4LCVyY3gKKworCW11bHhxCTAoJXJzaSksJXI4LCVyMTEKKwl4b3JsCSVlYnAsJWVicAorCW1vdnEJJXJkeCwlcjkKKwltdWx4cQk4KCVyc2kpLCVyMTQsJXIxMgorCWFkb3hxCS0zMiglcmJ4KSwlcjgKKwlhZGN4cQklcjE0LCVyMTEKKwltdWx4cQkxNiglcnNpKSwlcjE1LCVyMTMKKwlhZG94cQktMjQoJXJieCksJXIxMQorCWFkY3hxCSVyMTUsJXIxMgorCWFkb3hxCS0xNiglcmJ4KSwlcjEyCisJYWRjeHEJJXJicCwlcjEzCisJYWRveHEJJXJicCwlcjEzCisKKwltb3ZxCSVyZGksOCglcnNwKQorCW1vdnEJJXI4LCVyMTUKKwlpbXVscQkyNCglcnNwKSwlcjgKKwl4b3JsCSVlYnAsJWVicAorCisJbXVseHEJMjQoJXJzaSksJXJheCwlcjE0CisJbW92cQklcjgsJXJkeAorCWFkY3hxCSVyYXgsJXIxMworCWFkb3hxCS04KCVyYngpLCVyMTMKKwlhZGN4cQklcmJwLCVyMTQKKwlsZWFxCTMyKCVyc2kpLCVyc2kKKwlhZG94cQklcmJwLCVyMTQKKworCW11bHhxCTAoJXJjeCksJXJheCwlcjEwCisJYWRjeHEJJXJheCwlcjE1CisJYWRveHEJJXIxMSwlcjEwCisJbXVseHEJOCglcmN4KSwlcmF4LCVyMTEKKwlhZGN4cQklcmF4LCVyMTAKKwlhZG94cQklcjEyLCVyMTEKKwltdWx4cQkxNiglcmN4KSwlcmF4LCVyMTIKKwltb3ZxCSVyMTAsLTMyKCVyYngpCisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxMywlcjEyCisJbXVseHEJMjQoJXJjeCksJXJheCwlcjE1CisJbW92cQklcjksJXJkeAorCW1vdnEJJXIxMSwtMjQoJXJieCkKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcmJwLCVyMTUKKwltb3ZxCTQ4KCVyc3ApLCVyZGkKKwltb3ZxCSVyMTIsLTE2KCVyYngpCisKKwlqbXAJTCRtdWx4NHhfaW5uZXIKKworLnAyYWxpZ24JNQorTCRtdWx4NHhfaW5uZXI6CisJbXVseHEJMCglcnNpKSwlcjEwLCVyYXgKKwlhZGN4cQklcmJwLCVyMTUKKwlhZG94cQklcjE0LCVyMTAKKwltdWx4cQk4KCVyc2kpLCVyMTEsJXIxNAorCWFkY3hxCTAoJXJieCksJXIxMAorCWFkb3hxCSVyYXgsJXIxMQorCW11bHhxCTE2KCVyc2kpLCVyMTIsJXJheAorCWFkY3hxCTgoJXJieCksJXIxMQorCWFkb3hxCSVyMTQsJXIxMgorCW11bHhxCTI0KCVyc2kpLCVyMTMsJXIxNAorCW1vdnEJJXI4LCVyZHgKKwlhZGN4cQkxNiglcmJ4KSwlcjEyCisJYWRveHEJJXJheCwlcjEzCisJYWRjeHEJMjQoJXJieCksJXIxMworCWFkb3hxCSVyYnAsJXIxNAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWxlYXEJMzIoJXJieCksJXJieAorCWFkY3hxCSVyYnAsJXIxNAorCisJYWRveHEJJXIxNSwlcjEwCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTUKKwlhZGN4cQklcmF4LCVyMTAKKwlhZG94cQklcjE1LCVyMTEKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxNQorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTUsJXIxMgorCW11bHhxCTE2KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXIxMCwtNDAoJXJieCkKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcjE1LCVyMTMKKwltdWx4cQkyNCglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyOSwlcmR4CisJbW92cQklcjExLC0zMiglcmJ4KQorCW1vdnEJJXIxMiwtMjQoJXJieCkKKwlhZGN4cQklcmF4LCVyMTMKKwlhZG94cQklcmJwLCVyMTUKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCSVyMTMsLTE2KCVyYngpCisKKwlkZWNxCSVyZGkKKwlqbnoJTCRtdWx4NHhfaW5uZXIKKworCW1vdnEJMCglcnNwKSwlcmF4CisJbW92cQk4KCVyc3ApLCVyZGkKKwlhZGNxCSVyYnAsJXIxNQorCXN1YnEJMCglcmJ4KSwlcmJwCisJYWRjcQklcjE1LCVyMTQKKwlzYmJxCSVyMTUsJXIxNQorCW1vdnEJJXIxNCwtOCglcmJ4KQorCisJY21wcQkxNiglcnNwKSwlcmRpCisJam5lCUwkbXVseDR4X291dGVyCisKKwlsZWFxCTY0KCVyc3ApLCVyYngKKwlzdWJxCSVyYXgsJXJjeAorCW5lZ3EJJXIxNQorCW1vdnEJJXJheCwlcmR4CisJc2hycQkkMysyLCVyYXgKKwltb3ZxCTMyKCVyc3ApLCVyZGkKKwlqbXAJTCRtdWx4NHhfc3ViCisKKy5wMmFsaWduCTUKK0wkbXVseDR4X3N1YjoKKwltb3ZxCTAoJXJieCksJXIxMQorCW1vdnEJOCglcmJ4KSwlcjEyCisJbW92cQkxNiglcmJ4KSwlcjEzCisJbW92cQkyNCglcmJ4KSwlcjE0CisJbGVhcQkzMiglcmJ4KSwlcmJ4CisJc2JicQkwKCVyY3gpLCVyMTEKKwlzYmJxCTgoJXJjeCksJXIxMgorCXNiYnEJMTYoJXJjeCksJXIxMworCXNiYnEJMjQoJXJjeCksJXIxNAorCWxlYXEJMzIoJXJjeCksJXJjeAorCW1vdnEJJXIxMSwwKCVyZGkpCisJbW92cQklcjEyLDgoJXJkaSkKKwltb3ZxCSVyMTMsMTYoJXJkaSkKKwltb3ZxCSVyMTQsMjQoJXJkaSkKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwlkZWNxCSVyYXgKKwlqbnoJTCRtdWx4NHhfc3ViCisKKwlzYmJxCSQwLCVyMTUKKwlsZWFxCTY0KCVyc3ApLCVyYngKKwlzdWJxCSVyZHgsJXJkaQorCisuYnl0ZQkxMDIsNzMsMTUsMTEwLDIwNworCXB4b3IJJXhtbTAsJXhtbTAKKwlwc2h1ZmQJJDAsJXhtbTEsJXhtbTEKKwltb3ZxCTQwKCVyc3ApLCVyc2kKKworCWptcAlMJG11bHg0eF9jb25kX2NvcHkKKworLnAyYWxpZ24JNQorTCRtdWx4NHhfY29uZF9jb3B5OgorCW1vdmRxYQkwKCVyYngpLCV4bW0yCisJbW92ZHFhCTE2KCVyYngpLCV4bW0zCisJbGVhcQkzMiglcmJ4KSwlcmJ4CisJbW92ZHF1CTAoJXJkaSksJXhtbTQKKwltb3ZkcXUJMTYoJXJkaSksJXhtbTUKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKwltb3ZkcWEJJXhtbTAsLTMyKCVyYngpCisJbW92ZHFhCSV4bW0wLC0xNiglcmJ4KQorCXBjbXBlcWQJJXhtbTEsJXhtbTAKKwlwYW5kCSV4bW0xLCV4bW0yCisJcGFuZAkleG1tMSwleG1tMworCXBhbmQJJXhtbTAsJXhtbTQKKwlwYW5kCSV4bW0wLCV4bW01CisJcHhvcgkleG1tMCwleG1tMAorCXBvcgkleG1tMiwleG1tNAorCXBvcgkleG1tMywleG1tNQorCW1vdmRxdQkleG1tNCwtMzIoJXJkaSkKKwltb3ZkcXUJJXhtbTUsLTE2KCVyZGkpCisJc3VicQkkMzIsJXJkeAorCWpueglMJG11bHg0eF9jb25kX2NvcHkKKworCW1vdnEJJXJkeCwoJXJieCkKKworCW1vdnEJJDEsJXJheAorCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYnAKKworCW1vdnEJLTgoJXJzaSksJXJieAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJG11bHg0eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisuYnl0ZQk3NywxMTEsMTEwLDExNiwxMDMsMTExLDEwOSwxMDEsMTE0LDEyMSwzMiw3NywxMTcsMTA4LDExNiwxMDUsMTEyLDEwOCwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NCw1Miw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCisucDJhbGlnbgk0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS94ODZfNjQtbW9udDUuUyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvbWFjLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS94ODZfNjQtbW9udDUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM4ODhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9tYWMteDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3g4Nl82NC1tb250NS5TCkBAIC0wLDAgKzEsMzc1NSBAQAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisudGV4dAkKKworCisKKy5nbG9ibAlfYm5fbXVsX21vbnRfZ2F0aGVyNQorLnByaXZhdGVfZXh0ZXJuIF9ibl9tdWxfbW9udF9nYXRoZXI1CisKKy5wMmFsaWduCTYKK19ibl9tdWxfbW9udF9nYXRoZXI1OgorCisJbW92bAklcjlkLCVyOWQKKwltb3ZxCSVyc3AsJXJheAorCisJdGVzdGwJJDcsJXI5ZAorCWpueglMJG11bF9lbnRlcgorCWxlYXEJX09QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyMTEKKwltb3ZsCTgoJXIxMSksJXIxMWQKKwlqbXAJTCRtdWw0eF9lbnRlcgorCisucDJhbGlnbgk0CitMJG11bF9lbnRlcjoKKwltb3ZkCTgoJXJzcCksJXhtbTUKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKKworCW5lZ3EJJXI5CisJbW92cQklcnNwLCVyMTEKKwlsZWFxCS0yODAoJXJzcCwlcjksOCksJXIxMAorCW5lZ3EJJXI5CisJYW5kcQkkLTEwMjQsJXIxMAorCisKKworCisKKworCisKKworCXN1YnEJJXIxMCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTAsJXIxMSwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMQorCWNtcHEJJXIxMCwlcnNwCisJamEJTCRtdWxfcGFnZV93YWxrCisJam1wCUwkbXVsX3BhZ2Vfd2Fsa19kb25lCisKK0wkbXVsX3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjExCisJY21wcQklcjEwLCVyc3AKKwlqYQlMJG11bF9wYWdlX3dhbGsKK0wkbXVsX3BhZ2Vfd2Fsa19kb25lOgorCisJbGVhcQlMJGluYyglcmlwKSwlcjEwCisJbW92cQklcmF4LDgoJXJzcCwlcjksOCkKKworTCRtdWxfYm9keToKKworCWxlYXEJMTI4KCVyZHgpLCVyMTIKKwltb3ZkcWEJMCglcjEwKSwleG1tMAorCW1vdmRxYQkxNiglcjEwKSwleG1tMQorCWxlYXEJMjQtMTEyKCVyc3AsJXI5LDgpLCVyMTAKKwlhbmRxCSQtMTYsJXIxMAorCisJcHNodWZkCSQwLCV4bW01LCV4bW01CisJbW92ZHFhCSV4bW0xLCV4bW00CisJbW92ZHFhCSV4bW0xLCV4bW0yCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisuYnl0ZQkweDY3CisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDExMiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDEyOCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDE0NCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMgorCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLDE2MCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwxNzYoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwxOTIoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwyMDgoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKworCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMywyMjQoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsMjQwKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMjU2KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMjcyKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0yCisKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTMsMjg4KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDMwNCglcjEwKQorCisJcGFkZGQJJXhtbTIsJXhtbTMKKy5ieXRlCTB4NjcKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDMyMCglcjEwKQorCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwzMzYoJXIxMCkKKwlwYW5kCTY0KCVyMTIpLCV4bW0wCisKKwlwYW5kCTgwKCVyMTIpLCV4bW0xCisJcGFuZAk5NiglcjEyKSwleG1tMgorCW1vdmRxYQkleG1tMywzNTIoJXIxMCkKKwlwYW5kCTExMiglcjEyKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCW1vdmRxYQktMTI4KCVyMTIpLCV4bW00CisJbW92ZHFhCS0xMTIoJXIxMiksJXhtbTUKKwltb3ZkcWEJLTk2KCVyMTIpLCV4bW0yCisJcGFuZAkxMTIoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTgwKCVyMTIpLCV4bW0zCisJcGFuZAkxMjgoJXIxMCksJXhtbTUKKwlwb3IJJXhtbTQsJXhtbTAKKwlwYW5kCTE0NCglcjEwKSwleG1tMgorCXBvcgkleG1tNSwleG1tMQorCXBhbmQJMTYwKCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCS02NCglcjEyKSwleG1tNAorCW1vdmRxYQktNDgoJXIxMiksJXhtbTUKKwltb3ZkcWEJLTMyKCVyMTIpLCV4bW0yCisJcGFuZAkxNzYoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTE2KCVyMTIpLCV4bW0zCisJcGFuZAkxOTIoJXIxMCksJXhtbTUKKwlwb3IJJXhtbTQsJXhtbTAKKwlwYW5kCTIwOCglcjEwKSwleG1tMgorCXBvcgkleG1tNSwleG1tMQorCXBhbmQJMjI0KCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCTAoJXIxMiksJXhtbTQKKwltb3ZkcWEJMTYoJXIxMiksJXhtbTUKKwltb3ZkcWEJMzIoJXIxMiksJXhtbTIKKwlwYW5kCTI0MCglcjEwKSwleG1tNAorCW1vdmRxYQk0OCglcjEyKSwleG1tMworCXBhbmQJMjU2KCVyMTApLCV4bW01CisJcG9yCSV4bW00LCV4bW0wCisJcGFuZAkyNzIoJXIxMCksJXhtbTIKKwlwb3IJJXhtbTUsJXhtbTEKKwlwYW5kCTI4OCglcjEwKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCXBvcgkleG1tMSwleG1tMAorCXBzaHVmZAkkMHg0ZSwleG1tMCwleG1tMQorCXBvcgkleG1tMSwleG1tMAorCWxlYXEJMjU2KCVyMTIpLCVyMTIKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMTk1CisKKwltb3ZxCSglcjgpLCVyOAorCW1vdnEJKCVyc2kpLCVyYXgKKworCXhvcnEJJXIxNCwlcjE0CisJeG9ycQklcjE1LCVyMTUKKworCW1vdnEJJXI4LCVyYnAKKwltdWxxCSVyYngKKwltb3ZxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gpLCVyYXgKKworCWltdWxxCSVyMTAsJXJicAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJOCglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTMKKworCWxlYXEJMSglcjE1KSwlcjE1CisJam1wCUwkMXN0X2VudGVyCisKKy5wMmFsaWduCTQKK0wkMXN0OgorCWFkZHEJJXJheCwlcjEzCisJbW92cQkoJXJzaSwlcjE1LDgpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCW1vdnEJJXIxMCwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyMTUsOCkKKwltb3ZxCSVyZHgsJXIxMworCitMJDFzdF9lbnRlcjoKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJKCVyY3gsJXIxNSw4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbGVhcQkxKCVyMTUpLCVyMTUKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJY21wcQklcjksJXIxNQorCWpuZQlMJDFzdAorCisKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC0xNiglcnNwLCVyOSw4KQorCW1vdnEJJXJkeCwlcjEzCisJbW92cQklcjEwLCVyMTEKKworCXhvcnEJJXJkeCwlcmR4CisJYWRkcQklcjExLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTgoJXJzcCwlcjksOCkKKwltb3ZxCSVyZHgsKCVyc3AsJXI5LDgpCisKKwlsZWFxCTEoJXIxNCksJXIxNAorCWptcAlMJG91dGVyCisucDJhbGlnbgk0CitMJG91dGVyOgorCWxlYXEJMjQrMTI4KCVyc3AsJXI5LDgpLCVyZHgKKwlhbmRxCSQtMTYsJXJkeAorCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJbW92ZHFhCS0xMjgoJXIxMiksJXhtbTAKKwltb3ZkcWEJLTExMiglcjEyKSwleG1tMQorCW1vdmRxYQktOTYoJXIxMiksJXhtbTIKKwltb3ZkcWEJLTgwKCVyMTIpLCV4bW0zCisJcGFuZAktMTI4KCVyZHgpLCV4bW0wCisJcGFuZAktMTEyKCVyZHgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAktOTYoJXJkeCksJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTUKKwlwYW5kCS04MCglcmR4KSwleG1tMworCXBvcgkleG1tMiwleG1tNAorCXBvcgkleG1tMywleG1tNQorCW1vdmRxYQktNjQoJXIxMiksJXhtbTAKKwltb3ZkcWEJLTQ4KCVyMTIpLCV4bW0xCisJbW92ZHFhCS0zMiglcjEyKSwleG1tMgorCW1vdmRxYQktMTYoJXIxMiksJXhtbTMKKwlwYW5kCS02NCglcmR4KSwleG1tMAorCXBhbmQJLTQ4KCVyZHgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAktMzIoJXJkeCksJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTUKKwlwYW5kCS0xNiglcmR4KSwleG1tMworCXBvcgkleG1tMiwleG1tNAorCXBvcgkleG1tMywleG1tNQorCW1vdmRxYQkwKCVyMTIpLCV4bW0wCisJbW92ZHFhCTE2KCVyMTIpLCV4bW0xCisJbW92ZHFhCTMyKCVyMTIpLCV4bW0yCisJbW92ZHFhCTQ4KCVyMTIpLCV4bW0zCisJcGFuZAkwKCVyZHgpLCV4bW0wCisJcGFuZAkxNiglcmR4KSwleG1tMQorCXBvcgkleG1tMCwleG1tNAorCXBhbmQJMzIoJXJkeCksJXhtbTIKKwlwb3IJJXhtbTEsJXhtbTUKKwlwYW5kCTQ4KCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTY0KCVyMTIpLCV4bW0wCisJbW92ZHFhCTgwKCVyMTIpLCV4bW0xCisJbW92ZHFhCTk2KCVyMTIpLCV4bW0yCisJbW92ZHFhCTExMiglcjEyKSwleG1tMworCXBhbmQJNjQoJXJkeCksJXhtbTAKKwlwYW5kCTgwKCVyZHgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAk5NiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJMTEyKCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJcG9yCSV4bW01LCV4bW00CisJcHNodWZkCSQweDRlLCV4bW00LCV4bW0wCisJcG9yCSV4bW00LCV4bW0wCisJbGVhcQkyNTYoJXIxMiksJXIxMgorCisJbW92cQkoJXJzaSksJXJheAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwxOTUKKworCXhvcnEJJXIxNSwlcjE1CisJbW92cQklcjgsJXJicAorCW1vdnEJKCVyc3ApLCVyMTAKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQkoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCisJaW11bHEJJXIxMCwlcmJwCisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEwCisJbW92cQk4KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCTgoJXJzcCksJXIxMAorCW1vdnEJJXJkeCwlcjEzCisKKwlsZWFxCTEoJXIxNSksJXIxNQorCWptcAlMJGlubmVyX2VudGVyCisKKy5wMmFsaWduCTQKK0wkaW5uZXI6CisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCSglcnNpLCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJbW92cQkoJXJzcCwlcjE1LDgpLCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTE2KCVyc3AsJXIxNSw4KQorCW1vdnEJJXJkeCwlcjEzCisKK0wkaW5uZXJfZW50ZXI6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSglcmN4LCVyMTUsOCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEwCisJbW92cQklcmR4LCVyMTEKKwlhZGNxCSQwLCVyMTEKKwlsZWFxCTEoJXIxNSksJXIxNQorCisJbXVscQklcmJwCisJY21wcQklcjksJXIxNQorCWpuZQlMJGlubmVyCisKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJbW92cQkoJXJzcCwlcjksOCksJXIxMAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtMTYoJXJzcCwlcjksOCkKKwltb3ZxCSVyZHgsJXIxMworCisJeG9ycQklcmR4LCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC04KCVyc3AsJXI5LDgpCisJbW92cQklcmR4LCglcnNwLCVyOSw4KQorCisJbGVhcQkxKCVyMTQpLCVyMTQKKwljbXBxCSVyOSwlcjE0CisJamIJTCRvdXRlcgorCisJeG9ycQklcjE0LCVyMTQKKwltb3ZxCSglcnNwKSwlcmF4CisJbGVhcQkoJXJzcCksJXJzaQorCW1vdnEJJXI5LCVyMTUKKwlqbXAJTCRzdWIKKy5wMmFsaWduCTQKK0wkc3ViOglzYmJxCSglcmN4LCVyMTQsOCksJXJheAorCW1vdnEJJXJheCwoJXJkaSwlcjE0LDgpCisJbW92cQk4KCVyc2ksJXIxNCw4KSwlcmF4CisJbGVhcQkxKCVyMTQpLCVyMTQKKwlkZWNxCSVyMTUKKwlqbnoJTCRzdWIKKworCXNiYnEJJDAsJXJheAorCW1vdnEJJC0xLCVyYngKKwl4b3JxCSVyYXgsJXJieAorCXhvcnEJJXIxNCwlcjE0CisJbW92cQklcjksJXIxNQorCitMJGNvcHk6CisJbW92cQkoJXJkaSwlcjE0LDgpLCVyY3gKKwltb3ZxCSglcnNwLCVyMTQsOCksJXJkeAorCWFuZHEJJXJieCwlcmN4CisJYW5kcQklcmF4LCVyZHgKKwltb3ZxCSVyMTQsKCVyc3AsJXIxNCw4KQorCW9ycQklcmN4LCVyZHgKKwltb3ZxCSVyZHgsKCVyZGksJXIxNCw4KQorCWxlYXEJMSglcjE0KSwlcjE0CisJc3VicQkkMSwlcjE1CisJam56CUwkY29weQorCisJbW92cQk4KCVyc3AsJXI5LDgpLCVyc2kKKworCW1vdnEJJDEsJXJheAorCisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJicAorCisJbW92cQktOCglcnNpKSwlcmJ4CisKKwlsZWFxCSglcnNpKSwlcnNwCisKK0wkbXVsX2VwaWxvZ3VlOgorCS5ieXRlCTB4ZjMsMHhjMworCisKKworLnAyYWxpZ24JNQorYm5fbXVsNHhfbW9udF9nYXRoZXI1OgorCisuYnl0ZQkweDY3CisJbW92cQklcnNwLCVyYXgKKworTCRtdWw0eF9lbnRlcjoKKwlhbmRsCSQweDgwMTA4LCVyMTFkCisJY21wbAkkMHg4MDEwOCwlcjExZAorCWplCUwkbXVseDR4X2VudGVyCisJcHVzaHEJJXJieAorCisJcHVzaHEJJXJicAorCisJcHVzaHEJJXIxMgorCisJcHVzaHEJJXIxMworCisJcHVzaHEJJXIxNAorCisJcHVzaHEJJXIxNQorCitMJG11bDR4X3Byb2xvZ3VlOgorCisuYnl0ZQkweDY3CisJc2hsbAkkMywlcjlkCisJbGVhcQkoJXI5LCVyOSwyKSwlcjEwCisJbmVncQklcjkKKworCisKKworCisKKworCisKKworCWxlYXEJLTMyMCglcnNwLCVyOSwyKSwlcjExCisJbW92cQklcnNwLCVyYnAKKwlzdWJxCSVyZGksJXIxMQorCWFuZHEJJDQwOTUsJXIxMQorCWNtcHEJJXIxMSwlcjEwCisJamIJTCRtdWw0eHNwX2FsdAorCXN1YnEJJXIxMSwlcmJwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlqbXAJTCRtdWw0eHNwX2RvbmUKKworLnAyYWxpZ24JNQorTCRtdWw0eHNwX2FsdDoKKwlsZWFxCTQwOTYtMzIwKCwlcjksMiksJXIxMAorCWxlYXEJLTMyMCglcmJwLCVyOSwyKSwlcmJwCisJc3VicQklcjEwLCVyMTEKKwltb3ZxCSQwLCVyMTAKKwljbW92Y3EJJXIxMCwlcjExCisJc3VicQklcjExLCVyYnAKK0wkbXVsNHhzcF9kb25lOgorCWFuZHEJJC02NCwlcmJwCisJbW92cQklcnNwLCVyMTEKKwlzdWJxCSVyYnAsJXIxMQorCWFuZHEJJC00MDk2LCVyMTEKKwlsZWFxCSglcjExLCVyYnAsMSksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCUwkbXVsNHhfcGFnZV93YWxrCisJam1wCUwkbXVsNHhfcGFnZV93YWxrX2RvbmUKKworTCRtdWw0eF9wYWdlX3dhbGs6CisJbGVhcQktNDA5NiglcnNwKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMAorCWNtcHEJJXJicCwlcnNwCisJamEJTCRtdWw0eF9wYWdlX3dhbGsKK0wkbXVsNHhfcGFnZV93YWxrX2RvbmU6CisKKwluZWdxCSVyOQorCisJbW92cQklcmF4LDQwKCVyc3ApCisKK0wkbXVsNHhfYm9keToKKworCWNhbGwJbXVsNHhfaW50ZXJuYWwKKworCW1vdnEJNDAoJXJzcCksJXJzaQorCisJbW92cQkkMSwlcmF4CisKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRtdWw0eF9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKworLnAyYWxpZ24JNQorbXVsNHhfaW50ZXJuYWw6CisJc2hscQkkNSwlcjkKKwltb3ZkCTgoJXJheCksJXhtbTUKKwlsZWFxCUwkaW5jKCVyaXApLCVyYXgKKwlsZWFxCTEyOCglcmR4LCVyOSwxKSwlcjEzCisJc2hycQkkNSwlcjkKKwltb3ZkcWEJMCglcmF4KSwleG1tMAorCW1vdmRxYQkxNiglcmF4KSwleG1tMQorCWxlYXEJODgtMTEyKCVyc3AsJXI5LDEpLCVyMTAKKwlsZWFxCTEyOCglcmR4KSwlcjEyCisKKwlwc2h1ZmQJJDAsJXhtbTUsJXhtbTUKKwltb3ZkcWEJJXhtbTEsJXhtbTQKKy5ieXRlCTB4NjcsMHg2NworCW1vdmRxYQkleG1tMSwleG1tMgorCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorLmJ5dGUJMHg2NworCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwxMTIoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwxMjgoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwxNDQoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKworCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMywxNjAoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsMTc2KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMTkyKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMjA4KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0yCisKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTMsMjI0KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDI0MCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDI1NiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDI3MiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMgorCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLDI4OCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwzMDQoJXIxMCkKKworCXBhZGRkCSV4bW0yLCV4bW0zCisuYnl0ZQkweDY3CisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwzMjAoJXIxMCkKKworCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMzM2KCVyMTApCisJcGFuZAk2NCglcjEyKSwleG1tMAorCisJcGFuZAk4MCglcjEyKSwleG1tMQorCXBhbmQJOTYoJXIxMiksJXhtbTIKKwltb3ZkcWEJJXhtbTMsMzUyKCVyMTApCisJcGFuZAkxMTIoJXIxMiksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTAKKwlwb3IJJXhtbTMsJXhtbTEKKwltb3ZkcWEJLTEyOCglcjEyKSwleG1tNAorCW1vdmRxYQktMTEyKCVyMTIpLCV4bW01CisJbW92ZHFhCS05NiglcjEyKSwleG1tMgorCXBhbmQJMTEyKCVyMTApLCV4bW00CisJbW92ZHFhCS04MCglcjEyKSwleG1tMworCXBhbmQJMTI4KCVyMTApLCV4bW01CisJcG9yCSV4bW00LCV4bW0wCisJcGFuZAkxNDQoJXIxMCksJXhtbTIKKwlwb3IJJXhtbTUsJXhtbTEKKwlwYW5kCTE2MCglcjEwKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCW1vdmRxYQktNjQoJXIxMiksJXhtbTQKKwltb3ZkcWEJLTQ4KCVyMTIpLCV4bW01CisJbW92ZHFhCS0zMiglcjEyKSwleG1tMgorCXBhbmQJMTc2KCVyMTApLCV4bW00CisJbW92ZHFhCS0xNiglcjEyKSwleG1tMworCXBhbmQJMTkyKCVyMTApLCV4bW01CisJcG9yCSV4bW00LCV4bW0wCisJcGFuZAkyMDgoJXIxMCksJXhtbTIKKwlwb3IJJXhtbTUsJXhtbTEKKwlwYW5kCTIyNCglcjEwKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCW1vdmRxYQkwKCVyMTIpLCV4bW00CisJbW92ZHFhCTE2KCVyMTIpLCV4bW01CisJbW92ZHFhCTMyKCVyMTIpLCV4bW0yCisJcGFuZAkyNDAoJXIxMCksJXhtbTQKKwltb3ZkcWEJNDgoJXIxMiksJXhtbTMKKwlwYW5kCTI1NiglcjEwKSwleG1tNQorCXBvcgkleG1tNCwleG1tMAorCXBhbmQJMjcyKCVyMTApLCV4bW0yCisJcG9yCSV4bW01LCV4bW0xCisJcGFuZAkyODgoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTAKKwlwb3IJJXhtbTMsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDB4NGUsJXhtbTAsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTAKKwlsZWFxCTI1NiglcjEyKSwlcjEyCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5NQorCisJbW92cQklcjEzLDE2KzgoJXJzcCkKKwltb3ZxCSVyZGksNTYrOCglcnNwKQorCisJbW92cQkoJXI4KSwlcjgKKwltb3ZxCSglcnNpKSwlcmF4CisJbGVhcQkoJXJzaSwlcjksMSksJXJzaQorCW5lZ3EJJXI5CisKKwltb3ZxCSVyOCwlcmJwCisJbXVscQklcmJ4CisJbW92cQklcmF4LCVyMTAKKwltb3ZxCSglcmN4KSwlcmF4CisKKwlpbXVscQklcjEwLCVyYnAKKwlsZWFxCTY0KzgoJXJzcCksJXIxNAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJOCglcnNpLCVyOSwxKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQk4KCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCTE2KCVyc2ksJXI5LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWxlYXEJMzIoJXI5KSwlcjE1CisJbGVhcQkzMiglcmN4KSwlcmN4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLCglcjE0KQorCW1vdnEJJXJkeCwlcjEzCisJam1wCUwkMXN0NHgKKworLnAyYWxpZ24JNQorTCQxc3Q0eDoKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJLTE2KCVyY3gpLCVyYXgKKwlsZWFxCTMyKCVyMTQpLCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCS04KCVyc2ksJXIxNSwxKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTI0KCVyMTQpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQktOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSwlcjE1LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkaSwtMTYoJXIxNCkKKwltb3ZxCSVyZHgsJXIxMworCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTAoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJOCglcnNpLCVyMTUsMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC04KCVyMTQpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQk4KCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCTE2KCVyc2ksJXIxNSwxKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjExLCVyZGkKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksKCVyMTQpCisJbW92cQklcmR4LCVyMTMKKworCWFkZHEJJDMyLCVyMTUKKwlqbnoJTCQxc3Q0eAorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCS0xNiglcmN4KSwlcmF4CisJbGVhcQkzMiglcjE0KSwlcjE0CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTEKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcjEzCisJbW92cQktOCglcnNpKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTMsLTI0KCVyMTQpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQktOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSwlcjksMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmRpLC0xNiglcjE0KQorCW1vdnEJJXJkeCwlcjEzCisKKwlsZWFxCSglcmN4LCVyOSwxKSwlcmN4CisKKwl4b3JxCSVyZGksJXJkaQorCWFkZHEJJXIxMCwlcjEzCisJYWRjcQkkMCwlcmRpCisJbW92cQklcjEzLC04KCVyMTQpCisKKwlqbXAJTCRvdXRlcjR4CisKKy5wMmFsaWduCTUKK0wkb3V0ZXI0eDoKKwlsZWFxCTE2KzEyOCglcjE0KSwlcmR4CisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwltb3ZkcWEJLTEyOCglcjEyKSwleG1tMAorCW1vdmRxYQktMTEyKCVyMTIpLCV4bW0xCisJbW92ZHFhCS05NiglcjEyKSwleG1tMgorCW1vdmRxYQktODAoJXIxMiksJXhtbTMKKwlwYW5kCS0xMjgoJXJkeCksJXhtbTAKKwlwYW5kCS0xMTIoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS05NiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTgwKCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCS02NCglcjEyKSwleG1tMAorCW1vdmRxYQktNDgoJXIxMiksJXhtbTEKKwltb3ZkcWEJLTMyKCVyMTIpLCV4bW0yCisJbW92ZHFhCS0xNiglcjEyKSwleG1tMworCXBhbmQJLTY0KCVyZHgpLCV4bW0wCisJcGFuZAktNDgoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS0zMiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTE2KCVyZHgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTAoJXIxMiksJXhtbTAKKwltb3ZkcWEJMTYoJXIxMiksJXhtbTEKKwltb3ZkcWEJMzIoJXIxMiksJXhtbTIKKwltb3ZkcWEJNDgoJXIxMiksJXhtbTMKKwlwYW5kCTAoJXJkeCksJXhtbTAKKwlwYW5kCTE2KCVyZHgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAkzMiglcmR4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDgoJXJkeCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJNjQoJXIxMiksJXhtbTAKKwltb3ZkcWEJODAoJXIxMiksJXhtbTEKKwltb3ZkcWEJOTYoJXIxMiksJXhtbTIKKwltb3ZkcWEJMTEyKCVyMTIpLCV4bW0zCisJcGFuZAk2NCglcmR4KSwleG1tMAorCXBhbmQJODAoJXJkeCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTk2KCVyZHgpLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkxMTIoJXJkeCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwlwb3IJJXhtbTUsJXhtbTQKKwlwc2h1ZmQJJDB4NGUsJXhtbTQsJXhtbTAKKwlwb3IJJXhtbTQsJXhtbTAKKwlsZWFxCTI1NiglcjEyKSwlcjEyCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5NQorCisJbW92cQkoJXIxNCwlcjksMSksJXIxMAorCW1vdnEJJXI4LCVyYnAKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJKCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKworCWltdWxxCSVyMTAsJXJicAorCW1vdnEJJXJkeCwlcjExCisJbW92cQklcmRpLCglcjE0KQorCisJbGVhcQkoJXIxNCwlcjksMSksJXIxNAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTgoJXJzaSwlcjksMSksJXJheAorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcmRpCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQk4KCVyMTQpLCVyMTEKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMAorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyZGkKKwltb3ZxCTE2KCVyc2ksJXI5LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWxlYXEJMzIoJXI5KSwlcjE1CisJbGVhcQkzMiglcmN4KSwlcmN4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTMKKwlqbXAJTCRpbm5lcjR4CisKKy5wMmFsaWduCTUKK0wkaW5uZXI0eDoKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJLTE2KCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCTE2KCVyMTQpLCVyMTAKKwlsZWFxCTMyKCVyMTQpLCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCS04KCVyc2ksJXIxNSwxKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZGksLTMyKCVyMTQpCisJbW92cQklcmR4LCVyZGkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQktOCglcmN4KSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQktOCglcjE0KSwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkoJXJzaSwlcjE1LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtMjQoJXIxNCkKKwltb3ZxCSVyZHgsJXIxMworCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCTAoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJKCVyMTQpLCVyMTAKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCTgoJXJzaSwlcjE1LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkaSwtMTYoJXIxNCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCTgoJXJjeCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJOCglcjE0KSwlcjExCisJYWRjcQkkMCwlcmR4CisJbW92cQklcmR4LCVyMTAKKworCW11bHEJJXJicAorCWFkZHEJJXJheCwlcmRpCisJbW92cQkxNiglcnNpLCVyMTUsMSksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcmRpCisJbGVhcQkzMiglcmN4KSwlcmN4CisJYWRjcQkkMCwlcmR4CisJbW92cQklcjEzLC04KCVyMTQpCisJbW92cQklcmR4LCVyMTMKKworCWFkZHEJJDMyLCVyMTUKKwlqbnoJTCRpbm5lcjR4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJLTE2KCVyY3gpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCTE2KCVyMTQpLCVyMTAKKwlsZWFxCTMyKCVyMTQpLCVyMTQKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyZHgsJXIxMQorCisJbXVscQklcmJwCisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCS04KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTAsJXIxMworCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkaSwtMzIoJXIxNCkKKwltb3ZxCSVyZHgsJXJkaQorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYnAsJXJheAorCW1vdnEJLTgoJXJjeCksJXJicAorCWFkY3EJJDAsJXJkeAorCWFkZHEJLTgoJXIxNCksJXIxMQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXJkeCwlcjEwCisKKwltdWxxCSVyYnAKKwlhZGRxCSVyYXgsJXJkaQorCW1vdnEJKCVyc2ksJXI5LDEpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXJkaQorCWFkY3EJJDAsJXJkeAorCW1vdnEJJXIxMywtMjQoJXIxNCkKKwltb3ZxCSVyZHgsJXIxMworCisJbW92cQklcmRpLC0xNiglcjE0KQorCWxlYXEJKCVyY3gsJXI5LDEpLCVyY3gKKworCXhvcnEJJXJkaSwlcmRpCisJYWRkcQklcjEwLCVyMTMKKwlhZGNxCSQwLCVyZGkKKwlhZGRxCSglcjE0KSwlcjEzCisJYWRjcQkkMCwlcmRpCisJbW92cQklcjEzLC04KCVyMTQpCisKKwljbXBxCTE2KzgoJXJzcCksJXIxMgorCWpiCUwkb3V0ZXI0eAorCXhvcnEJJXJheCwlcmF4CisJc3VicQklcjEzLCVyYnAKKwlhZGNxCSVyMTUsJXIxNQorCW9ycQklcjE1LCVyZGkKKwlzdWJxCSVyZGksJXJheAorCWxlYXEJKCVyMTQsJXI5LDEpLCVyYngKKwltb3ZxCSglcmN4KSwlcjEyCisJbGVhcQkoJXJjeCksJXJicAorCW1vdnEJJXI5LCVyY3gKKwlzYXJxCSQzKzIsJXJjeAorCW1vdnEJNTYrOCglcnNwKSwlcmRpCisJZGVjcQklcjEyCisJeG9ycQklcjEwLCVyMTAKKwltb3ZxCTgoJXJicCksJXIxMworCW1vdnEJMTYoJXJicCksJXIxNAorCW1vdnEJMjQoJXJicCksJXIxNQorCWptcAlMJHNxcjR4X3N1Yl9lbnRyeQorCisuZ2xvYmwJX2JuX3Bvd2VyNQorLnByaXZhdGVfZXh0ZXJuIF9ibl9wb3dlcjUKKworLnAyYWxpZ24JNQorX2JuX3Bvd2VyNToKKworCW1vdnEJJXJzcCwlcmF4CisKKwlsZWFxCV9PUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjExCisJbW92bAk4KCVyMTEpLCVyMTFkCisJYW5kbAkkMHg4MDEwOCwlcjExZAorCWNtcGwJJDB4ODAxMDgsJXIxMWQKKwlqZQlMJHBvd2VyeDVfZW50ZXIKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKK0wkcG93ZXI1X3Byb2xvZ3VlOgorCisJc2hsbAkkMywlcjlkCisJbGVhbAkoJXI5LCVyOSwyKSwlcjEwZAorCW5lZ3EJJXI5CisJbW92cQkoJXI4KSwlcjgKKworCisKKworCisKKworCisJbGVhcQktMzIwKCVyc3AsJXI5LDIpLCVyMTEKKwltb3ZxCSVyc3AsJXJicAorCXN1YnEJJXJkaSwlcjExCisJYW5kcQkkNDA5NSwlcjExCisJY21wcQklcjExLCVyMTAKKwlqYglMJHB3cl9zcF9hbHQKKwlzdWJxCSVyMTEsJXJicAorCWxlYXEJLTMyMCglcmJwLCVyOSwyKSwlcmJwCisJam1wCUwkcHdyX3NwX2RvbmUKKworLnAyYWxpZ24JNQorTCRwd3Jfc3BfYWx0OgorCWxlYXEJNDA5Ni0zMjAoLCVyOSwyKSwlcjEwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlzdWJxCSVyMTAsJXIxMQorCW1vdnEJJDAsJXIxMAorCWNtb3ZjcQklcjEwLCVyMTEKKwlzdWJxCSVyMTEsJXJicAorTCRwd3Jfc3BfZG9uZToKKwlhbmRxCSQtNjQsJXJicAorCW1vdnEJJXJzcCwlcjExCisJc3VicQklcmJwLCVyMTEKKwlhbmRxCSQtNDA5NiwlcjExCisJbGVhcQkoJXIxMSwlcmJwLDEpLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQlMJHB3cl9wYWdlX3dhbGsKKwlqbXAJTCRwd3JfcGFnZV93YWxrX2RvbmUKKworTCRwd3JfcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCUwkcHdyX3BhZ2Vfd2FsaworTCRwd3JfcGFnZV93YWxrX2RvbmU6CisKKwltb3ZxCSVyOSwlcjEwCisJbmVncQklcjkKKworCisKKworCisKKworCisKKworCW1vdnEJJXI4LDMyKCVyc3ApCisJbW92cQklcmF4LDQwKCVyc3ApCisKK0wkcG93ZXI1X2JvZHk6CisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwNworLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDkKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjE4CisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIyNgorCisJY2FsbAlfX2JuX3Nxcjh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3Q0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9wb3N0NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyOHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdDR4X2ludGVybmFsCisJY2FsbAlfX2JuX3Nxcjh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3Q0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9wb3N0NHhfaW50ZXJuYWwKKworLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDkKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjI2CisJbW92cQklcnNpLCVyZGkKKwltb3ZxCTQwKCVyc3ApLCVyYXgKKwlsZWFxCTMyKCVyc3ApLCVyOAorCisJY2FsbAltdWw0eF9pbnRlcm5hbAorCisJbW92cQk0MCglcnNwKSwlcnNpCisKKwltb3ZxCSQxLCVyYXgKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRwb3dlcjVfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisuZ2xvYmwJX2JuX3Nxcjh4X2ludGVybmFsCisucHJpdmF0ZV9leHRlcm4gX2JuX3Nxcjh4X2ludGVybmFsCisucHJpdmF0ZV9leHRlcm4JX2JuX3Nxcjh4X2ludGVybmFsCisKKy5wMmFsaWduCTUKK19ibl9zcXI4eF9pbnRlcm5hbDoKK19fYm5fc3FyOHhfaW50ZXJuYWw6CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwlsZWFxCTMyKCVyMTApLCVyYnAKKwlsZWFxCSglcnNpLCVyOSwxKSwlcnNpCisKKwltb3ZxCSVyOSwlcmN4CisKKworCW1vdnEJLTMyKCVyc2ksJXJicCwxKSwlcjE0CisJbGVhcQk0OCs4KCVyc3AsJXI5LDIpLCVyZGkKKwltb3ZxCS0yNCglcnNpLCVyYnAsMSksJXJheAorCWxlYXEJLTMyKCVyZGksJXJicCwxKSwlcmRpCisJbW92cQktMTYoJXJzaSwlcmJwLDEpLCVyYngKKwltb3ZxCSVyYXgsJXIxNQorCisJbXVscQklcjE0CisJbW92cQklcmF4LCVyMTAKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXJkeCwlcjExCisJbW92cQklcjEwLC0yNCglcmRpLCVyYnAsMSkKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmJ4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTEsLTE2KCVyZGksJXJicCwxKQorCW1vdnEJJXJkeCwlcjEwCisKKworCW1vdnEJLTgoJXJzaSwlcmJwLDEpLCVyYngKKwltdWxxCSVyMTUKKwltb3ZxCSVyYXgsJXIxMgorCW1vdnEJJXJieCwlcmF4CisJbW92cQklcmR4LCVyMTMKKworCWxlYXEJKCVyYnApLCVyY3gKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJieCwlcmF4CisJbW92cQklcmR4LCVyMTEKKwlhZGNxCSQwLCVyMTEKKwlhZGRxCSVyMTIsJXIxMAorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXIxMCwtOCglcmRpLCVyY3gsMSkKKwlqbXAJTCRzcXI0eF8xc3QKKworLnAyYWxpZ24JNQorTCRzcXI0eF8xc3Q6CisJbW92cQkoJXJzaSwlcmN4LDEpLCVyYngKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJJXJieCwlcmF4CisJbW92cQklcmR4LCVyMTIKKwlhZGNxCSQwLCVyMTIKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjExCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCTgoJXJzaSwlcmN4LDEpLCVyYngKKwltb3ZxCSVyZHgsJXIxMAorCWFkY3EJJDAsJXIxMAorCWFkZHEJJXIxMywlcjExCisJYWRjcQkkMCwlcjEwCisKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyMTEsKCVyZGksJXJjeCwxKQorCW1vdnEJJXJkeCwlcjEzCisJYWRjcQkkMCwlcjEzCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJieCwlcmF4CisJbW92cQkxNiglcnNpLCVyY3gsMSksJXJieAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisJYWRkcQklcjEyLCVyMTAKKwlhZGNxCSQwLCVyMTEKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEzCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyMTAsOCglcmRpLCVyY3gsMSkKKwltb3ZxCSVyZHgsJXIxMgorCWFkY3EJJDAsJXIxMgorCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJMjQoJXJzaSwlcmN4LDEpLCVyYngKKwltb3ZxCSVyZHgsJXIxMAorCWFkY3EJJDAsJXIxMAorCWFkZHEJJXIxMywlcjExCisJYWRjcQkkMCwlcjEwCisKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyMTEsMTYoJXJkaSwlcmN4LDEpCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyZHgsJXIxMQorCWFkY3EJJDAsJXIxMQorCWFkZHEJJXIxMiwlcjEwCisJYWRjcQkkMCwlcjExCisJbW92cQklcjEwLC04KCVyZGksJXJjeCwxKQorCisJY21wcQkkMCwlcmN4CisJam5lCUwkc3FyNHhfMXN0CisKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCWxlYXEJMTYoJXJicCksJXJicAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEzCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyMTMsKCVyZGkpCisJbW92cQklcmR4LCVyMTIKKwltb3ZxCSVyZHgsOCglcmRpKQorCWptcAlMJHNxcjR4X291dGVyCisKKy5wMmFsaWduCTUKK0wkc3FyNHhfb3V0ZXI6CisJbW92cQktMzIoJXJzaSwlcmJwLDEpLCVyMTQKKwlsZWFxCTQ4KzgoJXJzcCwlcjksMiksJXJkaQorCW1vdnEJLTI0KCVyc2ksJXJicCwxKSwlcmF4CisJbGVhcQktMzIoJXJkaSwlcmJwLDEpLCVyZGkKKwltb3ZxCS0xNiglcnNpLCVyYnAsMSksJXJieAorCW1vdnEJJXJheCwlcjE1CisKKwltdWxxCSVyMTQKKwltb3ZxCS0yNCglcmRpLCVyYnAsMSksJXIxMAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJ4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyMTAsLTI0KCVyZGksJXJicCwxKQorCW1vdnEJJXJkeCwlcjExCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJieCwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQktMTYoJXJkaSwlcmJwLDEpLCVyMTEKKwltb3ZxCSVyZHgsJXIxMAorCWFkY3EJJDAsJXIxMAorCW1vdnEJJXIxMSwtMTYoJXJkaSwlcmJwLDEpCisKKwl4b3JxCSVyMTIsJXIxMgorCisJbW92cQktOCglcnNpLCVyYnAsMSksJXJieAorCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcmJ4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCS04KCVyZGksJXJicCwxKSwlcjEyCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJ4LCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTIsJXIxMAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisJbW92cQklcjEwLC04KCVyZGksJXJicCwxKQorCisJbGVhcQkoJXJicCksJXJjeAorCWptcAlMJHNxcjR4X2lubmVyCisKKy5wMmFsaWduCTUKK0wkc3FyNHhfaW5uZXI6CisJbW92cQkoJXJzaSwlcmN4LDEpLCVyYngKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJJXJieCwlcmF4CisJbW92cQklcmR4LCVyMTIKKwlhZGNxCSQwLCVyMTIKKwlhZGRxCSglcmRpLCVyY3gsMSksJXIxMworCWFkY3EJJDAsJXIxMgorCisuYnl0ZQkweDY3CisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTEKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJOCglcnNpLCVyY3gsMSksJXJieAorCW1vdnEJJXJkeCwlcjEwCisJYWRjcQkkMCwlcjEwCisJYWRkcQklcjEzLCVyMTEKKwlhZGNxCSQwLCVyMTAKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcjExLCglcmRpLCVyY3gsMSkKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXJkeCwlcjEzCisJYWRjcQkkMCwlcjEzCisJYWRkcQk4KCVyZGksJXJjeCwxKSwlcjEyCisJbGVhcQkxNiglcmN4KSwlcmN4CisJYWRjcQkkMCwlcjEzCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMAorCW1vdnEJJXJieCwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEyLCVyMTAKKwltb3ZxCSVyZHgsJXIxMQorCWFkY3EJJDAsJXIxMQorCW1vdnEJJXIxMCwtOCglcmRpLCVyY3gsMSkKKworCWNtcHEJJDAsJXJjeAorCWpuZQlMJHNxcjR4X2lubmVyCisKKy5ieXRlCTB4NjcKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEzCisJYWRjcQkkMCwlcmR4CisKKwltb3ZxCSVyMTMsKCVyZGkpCisJbW92cQklcmR4LCVyMTIKKwltb3ZxCSVyZHgsOCglcmRpKQorCisJYWRkcQkkMTYsJXJicAorCWpueglMJHNxcjR4X291dGVyCisKKworCW1vdnEJLTMyKCVyc2kpLCVyMTQKKwlsZWFxCTQ4KzgoJXJzcCwlcjksMiksJXJkaQorCW1vdnEJLTI0KCVyc2kpLCVyYXgKKwlsZWFxCS0zMiglcmRpLCVyYnAsMSksJXJkaQorCW1vdnEJLTE2KCVyc2kpLCVyYngKKwltb3ZxCSVyYXgsJXIxNQorCisJbXVscQklcjE0CisJYWRkcQklcmF4LCVyMTAKKwltb3ZxCSVyYngsJXJheAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisKKwltdWxxCSVyMTQKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJJXJieCwlcmF4CisJbW92cQklcjEwLC0yNCglcmRpKQorCW1vdnEJJXJkeCwlcjEwCisJYWRjcQkkMCwlcjEwCisJYWRkcQklcjEzLCVyMTEKKwltb3ZxCS04KCVyc2kpLCVyYngKKwlhZGNxCSQwLCVyMTAKKworCW11bHEJJXIxNQorCWFkZHEJJXJheCwlcjEyCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyMTEsLTE2KCVyZGkpCisJbW92cQklcmR4LCVyMTMKKwlhZGNxCSQwLCVyMTMKKworCW11bHEJJXIxNAorCWFkZHEJJXJheCwlcjEwCisJbW92cQklcmJ4LCVyYXgKKwltb3ZxCSVyZHgsJXIxMQorCWFkY3EJJDAsJXIxMQorCWFkZHEJJXIxMiwlcjEwCisJYWRjcQkkMCwlcjExCisJbW92cQklcjEwLC04KCVyZGkpCisKKwltdWxxCSVyMTUKKwlhZGRxCSVyYXgsJXIxMworCW1vdnEJLTE2KCVyc2kpLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTEsJXIxMworCWFkY3EJJDAsJXJkeAorCisJbW92cQklcjEzLCglcmRpKQorCW1vdnEJJXJkeCwlcjEyCisJbW92cQklcmR4LDgoJXJkaSkKKworCW11bHEJJXJieAorCWFkZHEJJDE2LCVyYnAKKwl4b3JxCSVyMTQsJXIxNAorCXN1YnEJJXI5LCVyYnAKKwl4b3JxCSVyMTUsJXIxNQorCisJYWRkcQklcjEyLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwltb3ZxCSVyYXgsOCglcmRpKQorCW1vdnEJJXJkeCwxNiglcmRpKQorCW1vdnEJJXIxNSwyNCglcmRpKQorCisJbW92cQktMTYoJXJzaSwlcmJwLDEpLCVyYXgKKwlsZWFxCTQ4KzgoJXJzcCksJXJkaQorCXhvcnEJJXIxMCwlcjEwCisJbW92cQk4KCVyZGkpLCVyMTEKKworCWxlYXEJKCVyMTQsJXIxMCwyKSwlcjEyCisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjEzCisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyMTMKKwltb3ZxCTE2KCVyZGkpLCVyMTAKKwltb3ZxCSVyMTEsJXIxNAorCW11bHEJJXJheAorCW5lZ3EJJXIxNQorCW1vdnEJMjQoJXJkaSksJXIxMQorCWFkY3EJJXJheCwlcjEyCisJbW92cQktOCglcnNpLCVyYnAsMSksJXJheAorCW1vdnEJJXIxMiwoJXJkaSkKKwlhZGNxCSVyZHgsJXIxMworCisJbGVhcQkoJXIxNCwlcjEwLDIpLCVyYngKKwltb3ZxCSVyMTMsOCglcmRpKQorCXNiYnEJJXIxNSwlcjE1CisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjgKKwlzaHJxCSQ2MywlcjExCisJb3JxCSVyMTAsJXI4CisJbW92cQkzMiglcmRpKSwlcjEwCisJbW92cQklcjExLCVyMTQKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwltb3ZxCTQwKCVyZGkpLCVyMTEKKwlhZGNxCSVyYXgsJXJieAorCW1vdnEJMCglcnNpLCVyYnAsMSksJXJheAorCW1vdnEJJXJieCwxNiglcmRpKQorCWFkY3EJJXJkeCwlcjgKKwlsZWFxCTE2KCVyYnApLCVyYnAKKwltb3ZxCSVyOCwyNCglcmRpKQorCXNiYnEJJXIxNSwlcjE1CisJbGVhcQk2NCglcmRpKSwlcmRpCisJam1wCUwkc3FyNHhfc2hpZnRfbl9hZGQKKworLnAyYWxpZ24JNQorTCRzcXI0eF9zaGlmdF9uX2FkZDoKKwlsZWFxCSglcjE0LCVyMTAsMiksJXIxMgorCXNocnEJJDYzLCVyMTAKKwlsZWFxCSglcmN4LCVyMTEsMiksJXIxMworCXNocnEJJDYzLCVyMTEKKwlvcnEJJXIxMCwlcjEzCisJbW92cQktMTYoJXJkaSksJXIxMAorCW1vdnEJJXIxMSwlcjE0CisJbXVscQklcmF4CisJbmVncQklcjE1CisJbW92cQktOCglcmRpKSwlcjExCisJYWRjcQklcmF4LCVyMTIKKwltb3ZxCS04KCVyc2ksJXJicCwxKSwlcmF4CisJbW92cQklcjEyLC0zMiglcmRpKQorCWFkY3EJJXJkeCwlcjEzCisKKwlsZWFxCSglcjE0LCVyMTAsMiksJXJieAorCW1vdnEJJXIxMywtMjQoJXJkaSkKKwlzYmJxCSVyMTUsJXIxNQorCXNocnEJJDYzLCVyMTAKKwlsZWFxCSglcmN4LCVyMTEsMiksJXI4CisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyOAorCW1vdnEJMCglcmRpKSwlcjEwCisJbW92cQklcjExLCVyMTQKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwltb3ZxCTgoJXJkaSksJXIxMQorCWFkY3EJJXJheCwlcmJ4CisJbW92cQkwKCVyc2ksJXJicCwxKSwlcmF4CisJbW92cQklcmJ4LC0xNiglcmRpKQorCWFkY3EJJXJkeCwlcjgKKworCWxlYXEJKCVyMTQsJXIxMCwyKSwlcjEyCisJbW92cQklcjgsLTgoJXJkaSkKKwlzYmJxCSVyMTUsJXIxNQorCXNocnEJJDYzLCVyMTAKKwlsZWFxCSglcmN4LCVyMTEsMiksJXIxMworCXNocnEJJDYzLCVyMTEKKwlvcnEJJXIxMCwlcjEzCisJbW92cQkxNiglcmRpKSwlcjEwCisJbW92cQklcjExLCVyMTQKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwltb3ZxCTI0KCVyZGkpLCVyMTEKKwlhZGNxCSVyYXgsJXIxMgorCW1vdnEJOCglcnNpLCVyYnAsMSksJXJheAorCW1vdnEJJXIxMiwwKCVyZGkpCisJYWRjcQklcmR4LCVyMTMKKworCWxlYXEJKCVyMTQsJXIxMCwyKSwlcmJ4CisJbW92cQklcjEzLDgoJXJkaSkKKwlzYmJxCSVyMTUsJXIxNQorCXNocnEJJDYzLCVyMTAKKwlsZWFxCSglcmN4LCVyMTEsMiksJXI4CisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyOAorCW1vdnEJMzIoJXJkaSksJXIxMAorCW1vdnEJJXIxMSwlcjE0CisJbXVscQklcmF4CisJbmVncQklcjE1CisJbW92cQk0MCglcmRpKSwlcjExCisJYWRjcQklcmF4LCVyYngKKwltb3ZxCTE2KCVyc2ksJXJicCwxKSwlcmF4CisJbW92cQklcmJ4LDE2KCVyZGkpCisJYWRjcQklcmR4LCVyOAorCW1vdnEJJXI4LDI0KCVyZGkpCisJc2JicQklcjE1LCVyMTUKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKwlhZGRxCSQzMiwlcmJwCisJam56CUwkc3FyNHhfc2hpZnRfbl9hZGQKKworCWxlYXEJKCVyMTQsJXIxMCwyKSwlcjEyCisuYnl0ZQkweDY3CisJc2hycQkkNjMsJXIxMAorCWxlYXEJKCVyY3gsJXIxMSwyKSwlcjEzCisJc2hycQkkNjMsJXIxMQorCW9ycQklcjEwLCVyMTMKKwltb3ZxCS0xNiglcmRpKSwlcjEwCisJbW92cQklcjExLCVyMTQKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwltb3ZxCS04KCVyZGkpLCVyMTEKKwlhZGNxCSVyYXgsJXIxMgorCW1vdnEJLTgoJXJzaSksJXJheAorCW1vdnEJJXIxMiwtMzIoJXJkaSkKKwlhZGNxCSVyZHgsJXIxMworCisJbGVhcQkoJXIxNCwlcjEwLDIpLCVyYngKKwltb3ZxCSVyMTMsLTI0KCVyZGkpCisJc2JicQklcjE1LCVyMTUKKwlzaHJxCSQ2MywlcjEwCisJbGVhcQkoJXJjeCwlcjExLDIpLCVyOAorCXNocnEJJDYzLCVyMTEKKwlvcnEJJXIxMCwlcjgKKwltdWxxCSVyYXgKKwluZWdxCSVyMTUKKwlhZGNxCSVyYXgsJXJieAorCWFkY3EJJXJkeCwlcjgKKwltb3ZxCSVyYngsLTE2KCVyZGkpCisJbW92cQklcjgsLTgoJXJkaSkKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjEzCitfX2JuX3Nxcjh4X3JlZHVjdGlvbjoKKwl4b3JxCSVyYXgsJXJheAorCWxlYXEJKCVyOSwlcmJwLDEpLCVyY3gKKwlsZWFxCTQ4KzgoJXJzcCwlcjksMiksJXJkeAorCW1vdnEJJXJjeCwwKzgoJXJzcCkKKwlsZWFxCTQ4KzgoJXJzcCwlcjksMSksJXJkaQorCW1vdnEJJXJkeCw4KzgoJXJzcCkKKwluZWdxCSVyOQorCWptcAlMJDh4X3JlZHVjdGlvbl9sb29wCisKKy5wMmFsaWduCTUKK0wkOHhfcmVkdWN0aW9uX2xvb3A6CisJbGVhcQkoJXJkaSwlcjksMSksJXJkaQorLmJ5dGUJMHg2NgorCW1vdnEJMCglcmRpKSwlcmJ4CisJbW92cQk4KCVyZGkpLCVyOQorCW1vdnEJMTYoJXJkaSksJXIxMAorCW1vdnEJMjQoJXJkaSksJXIxMQorCW1vdnEJMzIoJXJkaSksJXIxMgorCW1vdnEJNDAoJXJkaSksJXIxMworCW1vdnEJNDgoJXJkaSksJXIxNAorCW1vdnEJNTYoJXJkaSksJXIxNQorCW1vdnEJJXJheCwoJXJkeCkKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKworLmJ5dGUJMHg2NworCW1vdnEJJXJieCwlcjgKKwlpbXVscQkzMis4KCVyc3ApLCVyYngKKwltb3ZxCTAoJXJicCksJXJheAorCW1vdmwJJDgsJWVjeAorCWptcAlMJDh4X3JlZHVjZQorCisucDJhbGlnbgk1CitMJDh4X3JlZHVjZToKKwltdWxxCSVyYngKKwltb3ZxCTgoJXJicCksJXJheAorCW5lZ3EJJXI4CisJbW92cQklcmR4LCVyOAorCWFkY3EJJDAsJXI4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXI5CisJbW92cQkxNiglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjksJXI4CisJbW92cQklcmJ4LDQ4LTgrOCglcnNwLCVyY3gsOCkKKwltb3ZxCSVyZHgsJXI5CisJYWRjcQkkMCwlcjkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQkyNCglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyOQorCW1vdnEJMzIrOCglcnNwKSwlcnNpCisJbW92cQklcmR4LCVyMTAKKwlhZGNxCSQwLCVyMTAKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjExCisJbW92cQkzMiglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJaW11bHEJJXI4LCVyc2kKKwlhZGRxCSVyMTEsJXIxMAorCW1vdnEJJXJkeCwlcjExCisJYWRjcQkkMCwlcjExCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMgorCW1vdnEJNDAoJXJicCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMiwlcjExCisJbW92cQklcmR4LCVyMTIKKwlhZGNxCSQwLCVyMTIKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEzCisJbW92cQk0OCglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEzLCVyMTIKKwltb3ZxCSVyZHgsJXIxMworCWFkY3EJJDAsJXIxMworCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTQKKwltb3ZxCTU2KCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTQsJXIxMworCW1vdnEJJXJkeCwlcjE0CisJYWRjcQkkMCwlcjE0CisKKwltdWxxCSVyYngKKwltb3ZxCSVyc2ksJXJieAorCWFkZHEJJXJheCwlcjE1CisJbW92cQkwKCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTUsJXIxNAorCW1vdnEJJXJkeCwlcjE1CisJYWRjcQkkMCwlcjE1CisKKwlkZWNsCSVlY3gKKwlqbnoJTCQ4eF9yZWR1Y2UKKworCWxlYXEJNjQoJXJicCksJXJicAorCXhvcnEJJXJheCwlcmF4CisJbW92cQk4KzgoJXJzcCksJXJkeAorCWNtcHEJMCs4KCVyc3ApLCVyYnAKKwlqYWUJTCQ4eF9ub190YWlsCisKKy5ieXRlCTB4NjYKKwlhZGRxCTAoJXJkaSksJXI4CisJYWRjcQk4KCVyZGkpLCVyOQorCWFkY3EJMTYoJXJkaSksJXIxMAorCWFkY3EJMjQoJXJkaSksJXIxMQorCWFkY3EJMzIoJXJkaSksJXIxMgorCWFkY3EJNDAoJXJkaSksJXIxMworCWFkY3EJNDgoJXJkaSksJXIxNAorCWFkY3EJNTYoJXJkaSksJXIxNQorCXNiYnEJJXJzaSwlcnNpCisKKwltb3ZxCTQ4KzU2KzgoJXJzcCksJXJieAorCW1vdmwJJDgsJWVjeAorCW1vdnEJMCglcmJwKSwlcmF4CisJam1wCUwkOHhfdGFpbAorCisucDJhbGlnbgk1CitMJDh4X3RhaWw6CisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyOAorCW1vdnEJOCglcmJwKSwlcmF4CisJbW92cQklcjgsKCVyZGkpCisJbW92cQklcmR4LCVyOAorCWFkY3EJJDAsJXI4CisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXI5CisJbW92cQkxNiglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjksJXI4CisJbGVhcQk4KCVyZGkpLCVyZGkKKwltb3ZxCSVyZHgsJXI5CisJYWRjcQkkMCwlcjkKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEwCisJbW92cQkyNCglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEwLCVyOQorCW1vdnEJJXJkeCwlcjEwCisJYWRjcQkkMCwlcjEwCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxMQorCW1vdnEJMzIoJXJicCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxMSwlcjEwCisJbW92cQklcmR4LCVyMTEKKwlhZGNxCSQwLCVyMTEKKworCW11bHEJJXJieAorCWFkZHEJJXJheCwlcjEyCisJbW92cQk0MCglcmJwKSwlcmF4CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjEyLCVyMTEKKwltb3ZxCSVyZHgsJXIxMgorCWFkY3EJJDAsJXIxMgorCisJbXVscQklcmJ4CisJYWRkcQklcmF4LCVyMTMKKwltb3ZxCTQ4KCVyYnApLCVyYXgKKwlhZGNxCSQwLCVyZHgKKwlhZGRxCSVyMTMsJXIxMgorCW1vdnEJJXJkeCwlcjEzCisJYWRjcQkkMCwlcjEzCisKKwltdWxxCSVyYngKKwlhZGRxCSVyYXgsJXIxNAorCW1vdnEJNTYoJXJicCksJXJheAorCWFkY3EJJDAsJXJkeAorCWFkZHEJJXIxNCwlcjEzCisJbW92cQklcmR4LCVyMTQKKwlhZGNxCSQwLCVyMTQKKworCW11bHEJJXJieAorCW1vdnEJNDgtMTYrOCglcnNwLCVyY3gsOCksJXJieAorCWFkZHEJJXJheCwlcjE1CisJYWRjcQkkMCwlcmR4CisJYWRkcQklcjE1LCVyMTQKKwltb3ZxCTAoJXJicCksJXJheAorCW1vdnEJJXJkeCwlcjE1CisJYWRjcQkkMCwlcjE1CisKKwlkZWNsCSVlY3gKKwlqbnoJTCQ4eF90YWlsCisKKwlsZWFxCTY0KCVyYnApLCVyYnAKKwltb3ZxCTgrOCglcnNwKSwlcmR4CisJY21wcQkwKzgoJXJzcCksJXJicAorCWphZQlMJDh4X3RhaWxfZG9uZQorCisJbW92cQk0OCs1Nis4KCVyc3ApLCVyYngKKwluZWdxCSVyc2kKKwltb3ZxCTAoJXJicCksJXJheAorCWFkY3EJMCglcmRpKSwlcjgKKwlhZGNxCTgoJXJkaSksJXI5CisJYWRjcQkxNiglcmRpKSwlcjEwCisJYWRjcQkyNCglcmRpKSwlcjExCisJYWRjcQkzMiglcmRpKSwlcjEyCisJYWRjcQk0MCglcmRpKSwlcjEzCisJYWRjcQk0OCglcmRpKSwlcjE0CisJYWRjcQk1NiglcmRpKSwlcjE1CisJc2JicQklcnNpLCVyc2kKKworCW1vdmwJJDgsJWVjeAorCWptcAlMJDh4X3RhaWwKKworLnAyYWxpZ24JNQorTCQ4eF90YWlsX2RvbmU6CisJeG9ycQklcmF4LCVyYXgKKwlhZGRxCSglcmR4KSwlcjgKKwlhZGNxCSQwLCVyOQorCWFkY3EJJDAsJXIxMAorCWFkY3EJJDAsJXIxMQorCWFkY3EJJDAsJXIxMgorCWFkY3EJJDAsJXIxMworCWFkY3EJJDAsJXIxNAorCWFkY3EJJDAsJXIxNQorCWFkY3EJJDAsJXJheAorCisJbmVncQklcnNpCitMJDh4X25vX3RhaWw6CisJYWRjcQkwKCVyZGkpLCVyOAorCWFkY3EJOCglcmRpKSwlcjkKKwlhZGNxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTI0KCVyZGkpLCVyMTEKKwlhZGNxCTMyKCVyZGkpLCVyMTIKKwlhZGNxCTQwKCVyZGkpLCVyMTMKKwlhZGNxCTQ4KCVyZGkpLCVyMTQKKwlhZGNxCTU2KCVyZGkpLCVyMTUKKwlhZGNxCSQwLCVyYXgKKwltb3ZxCS04KCVyYnApLCVyY3gKKwl4b3JxCSVyc2ksJXJzaQorCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIxMworCisJbW92cQklcjgsMCglcmRpKQorCW1vdnEJJXI5LDgoJXJkaSkKKy5ieXRlCTEwMiw3MywxNSwxMjYsMjE3CisJbW92cQklcjEwLDE2KCVyZGkpCisJbW92cQklcjExLDI0KCVyZGkpCisJbW92cQklcjEyLDMyKCVyZGkpCisJbW92cQklcjEzLDQwKCVyZGkpCisJbW92cQklcjE0LDQ4KCVyZGkpCisJbW92cQklcjE1LDU2KCVyZGkpCisJbGVhcQk2NCglcmRpKSwlcmRpCisKKwljbXBxCSVyZHgsJXJkaQorCWpiCUwkOHhfcmVkdWN0aW9uX2xvb3AKKwkuYnl0ZQkweGYzLDB4YzMKKworCisucDJhbGlnbgk1CitfX2JuX3Bvc3Q0eF9pbnRlcm5hbDoKKwltb3ZxCTAoJXJicCksJXIxMgorCWxlYXEJKCVyZGksJXI5LDEpLCVyYngKKwltb3ZxCSVyOSwlcmN4CisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwNworCW5lZ3EJJXJheAorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDYKKwlzYXJxCSQzKzIsJXJjeAorCWRlY3EJJXIxMgorCXhvcnEJJXIxMCwlcjEwCisJbW92cQk4KCVyYnApLCVyMTMKKwltb3ZxCTE2KCVyYnApLCVyMTQKKwltb3ZxCTI0KCVyYnApLCVyMTUKKwlqbXAJTCRzcXI0eF9zdWJfZW50cnkKKworLnAyYWxpZ24JNAorTCRzcXI0eF9zdWI6CisJbW92cQkwKCVyYnApLCVyMTIKKwltb3ZxCTgoJXJicCksJXIxMworCW1vdnEJMTYoJXJicCksJXIxNAorCW1vdnEJMjQoJXJicCksJXIxNQorTCRzcXI0eF9zdWJfZW50cnk6CisJbGVhcQkzMiglcmJwKSwlcmJwCisJbm90cQklcjEyCisJbm90cQklcjEzCisJbm90cQklcjE0CisJbm90cQklcjE1CisJYW5kcQklcmF4LCVyMTIKKwlhbmRxCSVyYXgsJXIxMworCWFuZHEJJXJheCwlcjE0CisJYW5kcQklcmF4LCVyMTUKKworCW5lZ3EJJXIxMAorCWFkY3EJMCglcmJ4KSwlcjEyCisJYWRjcQk4KCVyYngpLCVyMTMKKwlhZGNxCTE2KCVyYngpLCVyMTQKKwlhZGNxCTI0KCVyYngpLCVyMTUKKwltb3ZxCSVyMTIsMCglcmRpKQorCWxlYXEJMzIoJXJieCksJXJieAorCW1vdnEJJXIxMyw4KCVyZGkpCisJc2JicQklcjEwLCVyMTAKKwltb3ZxCSVyMTQsMTYoJXJkaSkKKwltb3ZxCSVyMTUsMjQoJXJkaSkKKwlsZWFxCTMyKCVyZGkpLCVyZGkKKworCWluY3EJJXJjeAorCWpueglMJHNxcjR4X3N1YgorCisJbW92cQklcjksJXIxMAorCW5lZ3EJJXI5CisJLmJ5dGUJMHhmMywweGMzCisKKy5nbG9ibAlfYm5fZnJvbV9tb250Z29tZXJ5CisucHJpdmF0ZV9leHRlcm4gX2JuX2Zyb21fbW9udGdvbWVyeQorCisucDJhbGlnbgk1CitfYm5fZnJvbV9tb250Z29tZXJ5OgorCXRlc3RsCSQ3LCVyOWQKKwlqeglibl9mcm9tX21vbnQ4eAorCXhvcmwJJWVheCwlZWF4CisJLmJ5dGUJMHhmMywweGMzCisKKworCisucDJhbGlnbgk1Citibl9mcm9tX21vbnQ4eDoKKworLmJ5dGUJMHg2NworCW1vdnEJJXJzcCwlcmF4CisKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKK0wkZnJvbV9wcm9sb2d1ZToKKworCXNobGwJJDMsJXI5ZAorCWxlYXEJKCVyOSwlcjksMiksJXIxMAorCW5lZ3EJJXI5CisJbW92cQkoJXI4KSwlcjgKKworCisKKworCisKKworCisJbGVhcQktMzIwKCVyc3AsJXI5LDIpLCVyMTEKKwltb3ZxCSVyc3AsJXJicAorCXN1YnEJJXJkaSwlcjExCisJYW5kcQkkNDA5NSwlcjExCisJY21wcQklcjExLCVyMTAKKwlqYglMJGZyb21fc3BfYWx0CisJc3VicQklcjExLCVyYnAKKwlsZWFxCS0zMjAoJXJicCwlcjksMiksJXJicAorCWptcAlMJGZyb21fc3BfZG9uZQorCisucDJhbGlnbgk1CitMJGZyb21fc3BfYWx0OgorCWxlYXEJNDA5Ni0zMjAoLCVyOSwyKSwlcjEwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlzdWJxCSVyMTAsJXIxMQorCW1vdnEJJDAsJXIxMAorCWNtb3ZjcQklcjEwLCVyMTEKKwlzdWJxCSVyMTEsJXJicAorTCRmcm9tX3NwX2RvbmU6CisJYW5kcQkkLTY0LCVyYnAKKwltb3ZxCSVyc3AsJXIxMQorCXN1YnEJJXJicCwlcjExCisJYW5kcQkkLTQwOTYsJXIxMQorCWxlYXEJKCVyMTEsJXJicCwxKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMAorCWNtcHEJJXJicCwlcnNwCisJamEJTCRmcm9tX3BhZ2Vfd2FsaworCWptcAlMJGZyb21fcGFnZV93YWxrX2RvbmUKKworTCRmcm9tX3BhZ2Vfd2FsazoKKwlsZWFxCS00MDk2KCVyc3ApLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQlMJGZyb21fcGFnZV93YWxrCitMJGZyb21fcGFnZV93YWxrX2RvbmU6CisKKwltb3ZxCSVyOSwlcjEwCisJbmVncQklcjkKKworCisKKworCisKKworCisKKworCW1vdnEJJXI4LDMyKCVyc3ApCisJbW92cQklcmF4LDQwKCVyc3ApCisKK0wkZnJvbV9ib2R5OgorCW1vdnEJJXI5LCVyMTEKKwlsZWFxCTQ4KCVyc3ApLCVyYXgKKwlweG9yCSV4bW0wLCV4bW0wCisJam1wCUwkbXVsX2J5XzEKKworLnAyYWxpZ24JNQorTCRtdWxfYnlfMToKKwltb3ZkcXUJKCVyc2kpLCV4bW0xCisJbW92ZHF1CTE2KCVyc2kpLCV4bW0yCisJbW92ZHF1CTMyKCVyc2kpLCV4bW0zCisJbW92ZHFhCSV4bW0wLCglcmF4LCVyOSwxKQorCW1vdmRxdQk0OCglcnNpKSwleG1tNAorCW1vdmRxYQkleG1tMCwxNiglcmF4LCVyOSwxKQorLmJ5dGUJMHg0OCwweDhkLDB4YjYsMHg0MCwweDAwLDB4MDAsMHgwMAorCW1vdmRxYQkleG1tMSwoJXJheCkKKwltb3ZkcWEJJXhtbTAsMzIoJXJheCwlcjksMSkKKwltb3ZkcWEJJXhtbTIsMTYoJXJheCkKKwltb3ZkcWEJJXhtbTAsNDgoJXJheCwlcjksMSkKKwltb3ZkcWEJJXhtbTMsMzIoJXJheCkKKwltb3ZkcWEJJXhtbTQsNDgoJXJheCkKKwlsZWFxCTY0KCVyYXgpLCVyYXgKKwlzdWJxCSQ2NCwlcjExCisJam56CUwkbXVsX2J5XzEKKworLmJ5dGUJMTAyLDcyLDE1LDExMCwyMDcKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjA5CisuYnl0ZQkweDY3CisJbW92cQklcmN4LCVyYnAKKy5ieXRlCTEwMiw3MywxNSwxMTAsMjE4CisJbGVhcQlfT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXIxMQorCW1vdmwJOCglcjExKSwlcjExZAorCWFuZGwJJDB4ODAxMDgsJXIxMWQKKwljbXBsCSQweDgwMTA4LCVyMTFkCisJam5lCUwkZnJvbV9tb250X25veAorCisJbGVhcQkoJXJheCwlcjksMSksJXJkaQorCWNhbGwJX19ibl9zcXJ4OHhfcmVkdWN0aW9uCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKworCXB4b3IJJXhtbTAsJXhtbTAKKwlsZWFxCTQ4KCVyc3ApLCVyYXgKKwlqbXAJTCRmcm9tX21vbnRfemVybworCisucDJhbGlnbgk1CitMJGZyb21fbW9udF9ub3g6CisJY2FsbAlfX2JuX3Nxcjh4X3JlZHVjdGlvbgorCWNhbGwJX19ibl9wb3N0NHhfaW50ZXJuYWwKKworCXB4b3IJJXhtbTAsJXhtbTAKKwlsZWFxCTQ4KCVyc3ApLCVyYXgKKwlqbXAJTCRmcm9tX21vbnRfemVybworCisucDJhbGlnbgk1CitMJGZyb21fbW9udF96ZXJvOgorCW1vdnEJNDAoJXJzcCksJXJzaQorCisJbW92ZHFhCSV4bW0wLDAoJXJheCkKKwltb3ZkcWEJJXhtbTAsMTYoJXJheCkKKwltb3ZkcWEJJXhtbTAsMzIoJXJheCkKKwltb3ZkcWEJJXhtbTAsNDgoJXJheCkKKwlsZWFxCTY0KCVyYXgpLCVyYXgKKwlzdWJxCSQzMiwlcjkKKwlqbnoJTCRmcm9tX21vbnRfemVybworCisJbW92cQkkMSwlcmF4CisJbW92cQktNDgoJXJzaSksJXIxNQorCisJbW92cQktNDAoJXJzaSksJXIxNAorCisJbW92cQktMzIoJXJzaSksJXIxMworCisJbW92cQktMjQoJXJzaSksJXIxMgorCisJbW92cQktMTYoJXJzaSksJXJicAorCisJbW92cQktOCglcnNpKSwlcmJ4CisKKwlsZWFxCSglcnNpKSwlcnNwCisKK0wkZnJvbV9lcGlsb2d1ZToKKwkuYnl0ZQkweGYzLDB4YzMKKworCisKKy5wMmFsaWduCTUKK2JuX211bHg0eF9tb250X2dhdGhlcjU6CisKKwltb3ZxCSVyc3AsJXJheAorCitMJG11bHg0eF9lbnRlcjoKKwlwdXNocQklcmJ4CisKKwlwdXNocQklcmJwCisKKwlwdXNocQklcjEyCisKKwlwdXNocQklcjEzCisKKwlwdXNocQklcjE0CisKKwlwdXNocQklcjE1CisKK0wkbXVseDR4X3Byb2xvZ3VlOgorCisJc2hsbAkkMywlcjlkCisJbGVhcQkoJXI5LCVyOSwyKSwlcjEwCisJbmVncQklcjkKKwltb3ZxCSglcjgpLCVyOAorCisKKworCisKKworCisKKworCisJbGVhcQktMzIwKCVyc3AsJXI5LDIpLCVyMTEKKwltb3ZxCSVyc3AsJXJicAorCXN1YnEJJXJkaSwlcjExCisJYW5kcQkkNDA5NSwlcjExCisJY21wcQklcjExLCVyMTAKKwlqYglMJG11bHg0eHNwX2FsdAorCXN1YnEJJXIxMSwlcmJwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlqbXAJTCRtdWx4NHhzcF9kb25lCisKK0wkbXVseDR4c3BfYWx0OgorCWxlYXEJNDA5Ni0zMjAoLCVyOSwyKSwlcjEwCisJbGVhcQktMzIwKCVyYnAsJXI5LDIpLCVyYnAKKwlzdWJxCSVyMTAsJXIxMQorCW1vdnEJJDAsJXIxMAorCWNtb3ZjcQklcjEwLCVyMTEKKwlzdWJxCSVyMTEsJXJicAorTCRtdWx4NHhzcF9kb25lOgorCWFuZHEJJC02NCwlcmJwCisJbW92cQklcnNwLCVyMTEKKwlzdWJxCSVyYnAsJXIxMQorCWFuZHEJJC00MDk2LCVyMTEKKwlsZWFxCSglcjExLCVyYnAsMSksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCUwkbXVseDR4X3BhZ2Vfd2FsaworCWptcAlMJG11bHg0eF9wYWdlX3dhbGtfZG9uZQorCitMJG11bHg0eF9wYWdlX3dhbGs6CisJbGVhcQktNDA5NiglcnNwKSwlcnNwCisJbW92cQkoJXJzcCksJXIxMAorCWNtcHEJJXJicCwlcnNwCisJamEJTCRtdWx4NHhfcGFnZV93YWxrCitMJG11bHg0eF9wYWdlX3dhbGtfZG9uZToKKworCisKKworCisKKworCisKKworCisKKworCW1vdnEJJXI4LDMyKCVyc3ApCisJbW92cQklcmF4LDQwKCVyc3ApCisKK0wkbXVseDR4X2JvZHk6CisJY2FsbAltdWx4NHhfaW50ZXJuYWwKKworCW1vdnEJNDAoJXJzcCksJXJzaQorCisJbW92cQkkMSwlcmF4CisKKwltb3ZxCS00OCglcnNpKSwlcjE1CisKKwltb3ZxCS00MCglcnNpKSwlcjE0CisKKwltb3ZxCS0zMiglcnNpKSwlcjEzCisKKwltb3ZxCS0yNCglcnNpKSwlcjEyCisKKwltb3ZxCS0xNiglcnNpKSwlcmJwCisKKwltb3ZxCS04KCVyc2kpLCVyYngKKworCWxlYXEJKCVyc2kpLCVyc3AKKworTCRtdWx4NHhfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisKKy5wMmFsaWduCTUKK211bHg0eF9pbnRlcm5hbDoKKwltb3ZxCSVyOSw4KCVyc3ApCisJbW92cQklcjksJXIxMAorCW5lZ3EJJXI5CisJc2hscQkkNSwlcjkKKwluZWdxCSVyMTAKKwlsZWFxCTEyOCglcmR4LCVyOSwxKSwlcjEzCisJc2hycQkkNSs1LCVyOQorCW1vdmQJOCglcmF4KSwleG1tNQorCXN1YnEJJDEsJXI5CisJbGVhcQlMJGluYyglcmlwKSwlcmF4CisJbW92cQklcjEzLDE2KzgoJXJzcCkKKwltb3ZxCSVyOSwyNCs4KCVyc3ApCisJbW92cQklcmRpLDU2KzgoJXJzcCkKKwltb3ZkcWEJMCglcmF4KSwleG1tMAorCW1vdmRxYQkxNiglcmF4KSwleG1tMQorCWxlYXEJODgtMTEyKCVyc3AsJXIxMCwxKSwlcjEwCisJbGVhcQkxMjgoJXJkeCksJXJkaQorCisJcHNodWZkCSQwLCV4bW01LCV4bW01CisJbW92ZHFhCSV4bW0xLCV4bW00CisuYnl0ZQkweDY3CisJbW92ZHFhCSV4bW0xLCV4bW0yCisuYnl0ZQkweDY3CisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW00LCV4bW0zCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDExMiglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDEyOCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLDE0NCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMgorCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLDE2MCglcjEwKQorCW1vdmRxYQkleG1tNCwleG1tMworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwxNzYoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwxOTIoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwyMDgoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTIKKworCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMywyMjQoJXIxMCkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKwlwYWRkZAkleG1tMSwleG1tMgorCXBjbXBlcWQJJXhtbTUsJXhtbTEKKwltb3ZkcWEJJXhtbTAsMjQwKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMjU2KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsMjcyKCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0yCisKKwlwYWRkZAkleG1tMCwleG1tMQorCXBjbXBlcWQJJXhtbTUsJXhtbTAKKwltb3ZkcWEJJXhtbTMsMjg4KCVyMTApCisJbW92ZHFhCSV4bW00LCV4bW0zCisuYnl0ZQkweDY3CisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDMwNCglcjEwKQorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLDMyMCglcjEwKQorCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwzMzYoJXIxMCkKKworCXBhbmQJNjQoJXJkaSksJXhtbTAKKwlwYW5kCTgwKCVyZGkpLCV4bW0xCisJcGFuZAk5NiglcmRpKSwleG1tMgorCW1vdmRxYQkleG1tMywzNTIoJXIxMCkKKwlwYW5kCTExMiglcmRpKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCW1vdmRxYQktMTI4KCVyZGkpLCV4bW00CisJbW92ZHFhCS0xMTIoJXJkaSksJXhtbTUKKwltb3ZkcWEJLTk2KCVyZGkpLCV4bW0yCisJcGFuZAkxMTIoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTgwKCVyZGkpLCV4bW0zCisJcGFuZAkxMjgoJXIxMCksJXhtbTUKKwlwb3IJJXhtbTQsJXhtbTAKKwlwYW5kCTE0NCglcjEwKSwleG1tMgorCXBvcgkleG1tNSwleG1tMQorCXBhbmQJMTYwKCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCS02NCglcmRpKSwleG1tNAorCW1vdmRxYQktNDgoJXJkaSksJXhtbTUKKwltb3ZkcWEJLTMyKCVyZGkpLCV4bW0yCisJcGFuZAkxNzYoJXIxMCksJXhtbTQKKwltb3ZkcWEJLTE2KCVyZGkpLCV4bW0zCisJcGFuZAkxOTIoJXIxMCksJXhtbTUKKwlwb3IJJXhtbTQsJXhtbTAKKwlwYW5kCTIwOCglcjEwKSwleG1tMgorCXBvcgkleG1tNSwleG1tMQorCXBhbmQJMjI0KCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW0wCisJcG9yCSV4bW0zLCV4bW0xCisJbW92ZHFhCTAoJXJkaSksJXhtbTQKKwltb3ZkcWEJMTYoJXJkaSksJXhtbTUKKwltb3ZkcWEJMzIoJXJkaSksJXhtbTIKKwlwYW5kCTI0MCglcjEwKSwleG1tNAorCW1vdmRxYQk0OCglcmRpKSwleG1tMworCXBhbmQJMjU2KCVyMTApLCV4bW01CisJcG9yCSV4bW00LCV4bW0wCisJcGFuZAkyNzIoJXIxMCksJXhtbTIKKwlwb3IJJXhtbTUsJXhtbTEKKwlwYW5kCTI4OCglcjEwKSwleG1tMworCXBvcgkleG1tMiwleG1tMAorCXBvcgkleG1tMywleG1tMQorCXB4b3IJJXhtbTEsJXhtbTAKKwlwc2h1ZmQJJDB4NGUsJXhtbTAsJXhtbTEKKwlwb3IJJXhtbTEsJXhtbTAKKwlsZWFxCTI1NiglcmRpKSwlcmRpCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDE5NAorCWxlYXEJNjQrMzIrOCglcnNwKSwlcmJ4CisKKwltb3ZxCSVyZHgsJXI5CisJbXVseHEJMCglcnNpKSwlcjgsJXJheAorCW11bHhxCTgoJXJzaSksJXIxMSwlcjEyCisJYWRkcQklcmF4LCVyMTEKKwltdWx4cQkxNiglcnNpKSwlcmF4LCVyMTMKKwlhZGNxCSVyYXgsJXIxMgorCWFkY3EJJDAsJXIxMworCW11bHhxCTI0KCVyc2kpLCVyYXgsJXIxNAorCisJbW92cQklcjgsJXIxNQorCWltdWxxCTMyKzgoJXJzcCksJXI4CisJeG9ycQklcmJwLCVyYnAKKwltb3ZxCSVyOCwlcmR4CisKKwltb3ZxCSVyZGksOCs4KCVyc3ApCisKKwlsZWFxCTMyKCVyc2kpLCVyc2kKKwlhZGN4cQklcmF4LCVyMTMKKwlhZGN4cQklcmJwLCVyMTQKKworCW11bHhxCTAoJXJjeCksJXJheCwlcjEwCisJYWRjeHEJJXJheCwlcjE1CisJYWRveHEJJXIxMSwlcjEwCisJbXVseHEJOCglcmN4KSwlcmF4LCVyMTEKKwlhZGN4cQklcmF4LCVyMTAKKwlhZG94cQklcjEyLCVyMTEKKwltdWx4cQkxNiglcmN4KSwlcmF4LCVyMTIKKwltb3ZxCTI0KzgoJXJzcCksJXJkaQorCW1vdnEJJXIxMCwtMzIoJXJieCkKKwlhZGN4cQklcmF4LCVyMTEKKwlhZG94cQklcjEzLCVyMTIKKwltdWx4cQkyNCglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyOSwlcmR4CisJbW92cQklcjExLC0yNCglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMgorCWFkb3hxCSVyYnAsJXIxNQorCWxlYXEJMzIoJXJjeCksJXJjeAorCW1vdnEJJXIxMiwtMTYoJXJieCkKKwlqbXAJTCRtdWx4NHhfMXN0CisKKy5wMmFsaWduCTUKK0wkbXVseDR4XzFzdDoKKwlhZGN4cQklcmJwLCVyMTUKKwltdWx4cQkwKCVyc2kpLCVyMTAsJXJheAorCWFkY3hxCSVyMTQsJXIxMAorCW11bHhxCTgoJXJzaSksJXIxMSwlcjE0CisJYWRjeHEJJXJheCwlcjExCisJbXVseHEJMTYoJXJzaSksJXIxMiwlcmF4CisJYWRjeHEJJXIxNCwlcjEyCisJbXVseHEJMjQoJXJzaSksJXIxMywlcjE0CisuYnl0ZQkweDY3LDB4NjcKKwltb3ZxCSVyOCwlcmR4CisJYWRjeHEJJXJheCwlcjEzCisJYWRjeHEJJXJicCwlcjE0CisJbGVhcQkzMiglcnNpKSwlcnNpCisJbGVhcQkzMiglcmJ4KSwlcmJ4CisKKwlhZG94cQklcjE1LCVyMTAKKwltdWx4cQkwKCVyY3gpLCVyYXgsJXIxNQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTUsJXIxMQorCW11bHhxCTgoJXJjeCksJXJheCwlcjE1CisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxNSwlcjEyCisJbXVseHEJMTYoJXJjeCksJXJheCwlcjE1CisJbW92cQklcjEwLC00MCglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMgorCW1vdnEJJXIxMSwtMzIoJXJieCkKKwlhZG94cQklcjE1LCVyMTMKKwltdWx4cQkyNCglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyOSwlcmR4CisJbW92cQklcjEyLC0yNCglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMworCWFkb3hxCSVyYnAsJXIxNQorCWxlYXEJMzIoJXJjeCksJXJjeAorCW1vdnEJJXIxMywtMTYoJXJieCkKKworCWRlY3EJJXJkaQorCWpueglMJG11bHg0eF8xc3QKKworCW1vdnEJOCglcnNwKSwlcmF4CisJYWRjcQklcmJwLCVyMTUKKwlsZWFxCSglcnNpLCVyYXgsMSksJXJzaQorCWFkZHEJJXIxNSwlcjE0CisJbW92cQk4KzgoJXJzcCksJXJkaQorCWFkY3EJJXJicCwlcmJwCisJbW92cQklcjE0LC04KCVyYngpCisJam1wCUwkbXVseDR4X291dGVyCisKKy5wMmFsaWduCTUKK0wkbXVseDR4X291dGVyOgorCWxlYXEJMTYtMjU2KCVyYngpLCVyMTAKKwlweG9yCSV4bW00LCV4bW00CisuYnl0ZQkweDY3LDB4NjcKKwlweG9yCSV4bW01LCV4bW01CisJbW92ZHFhCS0xMjgoJXJkaSksJXhtbTAKKwltb3ZkcWEJLTExMiglcmRpKSwleG1tMQorCW1vdmRxYQktOTYoJXJkaSksJXhtbTIKKwlwYW5kCTI1NiglcjEwKSwleG1tMAorCW1vdmRxYQktODAoJXJkaSksJXhtbTMKKwlwYW5kCTI3MiglcjEwKSwleG1tMQorCXBvcgkleG1tMCwleG1tNAorCXBhbmQJMjg4KCVyMTApLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkzMDQoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJLTY0KCVyZGkpLCV4bW0wCisJbW92ZHFhCS00OCglcmRpKSwleG1tMQorCW1vdmRxYQktMzIoJXJkaSksJXhtbTIKKwlwYW5kCTMyMCglcjEwKSwleG1tMAorCW1vdmRxYQktMTYoJXJkaSksJXhtbTMKKwlwYW5kCTMzNiglcjEwKSwleG1tMQorCXBvcgkleG1tMCwleG1tNAorCXBhbmQJMzUyKCVyMTApLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkzNjgoJXIxMCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJMCglcmRpKSwleG1tMAorCW1vdmRxYQkxNiglcmRpKSwleG1tMQorCW1vdmRxYQkzMiglcmRpKSwleG1tMgorCXBhbmQJMzg0KCVyMTApLCV4bW0wCisJbW92ZHFhCTQ4KCVyZGkpLCV4bW0zCisJcGFuZAk0MDAoJXIxMCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTQxNiglcjEwKSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDMyKCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTY0KCVyZGkpLCV4bW0wCisJbW92ZHFhCTgwKCVyZGkpLCV4bW0xCisJbW92ZHFhCTk2KCVyZGkpLCV4bW0yCisJcGFuZAk0NDgoJXIxMCksJXhtbTAKKwltb3ZkcWEJMTEyKCVyZGkpLCV4bW0zCisJcGFuZAk0NjQoJXIxMCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTQ4MCglcjEwKSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDk2KCVyMTApLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJcG9yCSV4bW01LCV4bW00CisJcHNodWZkCSQweDRlLCV4bW00LCV4bW0wCisJcG9yCSV4bW00LCV4bW0wCisJbGVhcQkyNTYoJXJkaSksJXJkaQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwxOTQKKworCW1vdnEJJXJicCwoJXJieCkKKwlsZWFxCTMyKCVyYngsJXJheCwxKSwlcmJ4CisJbXVseHEJMCglcnNpKSwlcjgsJXIxMQorCXhvcnEJJXJicCwlcmJwCisJbW92cQklcmR4LCVyOQorCW11bHhxCTgoJXJzaSksJXIxNCwlcjEyCisJYWRveHEJLTMyKCVyYngpLCVyOAorCWFkY3hxCSVyMTQsJXIxMQorCW11bHhxCTE2KCVyc2kpLCVyMTUsJXIxMworCWFkb3hxCS0yNCglcmJ4KSwlcjExCisJYWRjeHEJJXIxNSwlcjEyCisJbXVseHEJMjQoJXJzaSksJXJkeCwlcjE0CisJYWRveHEJLTE2KCVyYngpLCVyMTIKKwlhZGN4cQklcmR4LCVyMTMKKwlsZWFxCSglcmN4LCVyYXgsMSksJXJjeAorCWxlYXEJMzIoJXJzaSksJXJzaQorCWFkb3hxCS04KCVyYngpLCVyMTMKKwlhZGN4cQklcmJwLCVyMTQKKwlhZG94cQklcmJwLCVyMTQKKworCW1vdnEJJXI4LCVyMTUKKwlpbXVscQkzMis4KCVyc3ApLCVyOAorCisJbW92cQklcjgsJXJkeAorCXhvcnEJJXJicCwlcmJwCisJbW92cQklcmRpLDgrOCglcnNwKQorCisJbXVseHEJMCglcmN4KSwlcmF4LCVyMTAKKwlhZGN4cQklcmF4LCVyMTUKKwlhZG94cQklcjExLCVyMTAKKwltdWx4cQk4KCVyY3gpLCVyYXgsJXIxMQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTIsJXIxMQorCW11bHhxCTE2KCVyY3gpLCVyYXgsJXIxMgorCWFkY3hxCSVyYXgsJXIxMQorCWFkb3hxCSVyMTMsJXIxMgorCW11bHhxCTI0KCVyY3gpLCVyYXgsJXIxNQorCW1vdnEJJXI5LCVyZHgKKwltb3ZxCTI0KzgoJXJzcCksJXJkaQorCW1vdnEJJXIxMCwtMzIoJXJieCkKKwlhZGN4cQklcmF4LCVyMTIKKwltb3ZxCSVyMTEsLTI0KCVyYngpCisJYWRveHEJJXJicCwlcjE1CisJbW92cQklcjEyLC0xNiglcmJ4KQorCWxlYXEJMzIoJXJjeCksJXJjeAorCWptcAlMJG11bHg0eF9pbm5lcgorCisucDJhbGlnbgk1CitMJG11bHg0eF9pbm5lcjoKKwltdWx4cQkwKCVyc2kpLCVyMTAsJXJheAorCWFkY3hxCSVyYnAsJXIxNQorCWFkb3hxCSVyMTQsJXIxMAorCW11bHhxCTgoJXJzaSksJXIxMSwlcjE0CisJYWRjeHEJMCglcmJ4KSwlcjEwCisJYWRveHEJJXJheCwlcjExCisJbXVseHEJMTYoJXJzaSksJXIxMiwlcmF4CisJYWRjeHEJOCglcmJ4KSwlcjExCisJYWRveHEJJXIxNCwlcjEyCisJbXVseHEJMjQoJXJzaSksJXIxMywlcjE0CisJbW92cQklcjgsJXJkeAorCWFkY3hxCTE2KCVyYngpLCVyMTIKKwlhZG94cQklcmF4LCVyMTMKKwlhZGN4cQkyNCglcmJ4KSwlcjEzCisJYWRveHEJJXJicCwlcjE0CisJbGVhcQkzMiglcnNpKSwlcnNpCisJbGVhcQkzMiglcmJ4KSwlcmJ4CisJYWRjeHEJJXJicCwlcjE0CisKKwlhZG94cQklcjE1LCVyMTAKKwltdWx4cQkwKCVyY3gpLCVyYXgsJXIxNQorCWFkY3hxCSVyYXgsJXIxMAorCWFkb3hxCSVyMTUsJXIxMQorCW11bHhxCTgoJXJjeCksJXJheCwlcjE1CisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxNSwlcjEyCisJbXVseHEJMTYoJXJjeCksJXJheCwlcjE1CisJbW92cQklcjEwLC00MCglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMgorCWFkb3hxCSVyMTUsJXIxMworCW1vdnEJJXIxMSwtMzIoJXJieCkKKwltdWx4cQkyNCglcmN4KSwlcmF4LCVyMTUKKwltb3ZxCSVyOSwlcmR4CisJbGVhcQkzMiglcmN4KSwlcmN4CisJbW92cQklcjEyLC0yNCglcmJ4KQorCWFkY3hxCSVyYXgsJXIxMworCWFkb3hxCSVyYnAsJXIxNQorCW1vdnEJJXIxMywtMTYoJXJieCkKKworCWRlY3EJJXJkaQorCWpueglMJG11bHg0eF9pbm5lcgorCisJbW92cQkwKzgoJXJzcCksJXJheAorCWFkY3EJJXJicCwlcjE1CisJc3VicQkwKCVyYngpLCVyZGkKKwltb3ZxCTgrOCglcnNwKSwlcmRpCisJbW92cQkxNis4KCVyc3ApLCVyMTAKKwlhZGNxCSVyMTUsJXIxNAorCWxlYXEJKCVyc2ksJXJheCwxKSwlcnNpCisJYWRjcQklcmJwLCVyYnAKKwltb3ZxCSVyMTQsLTgoJXJieCkKKworCWNtcHEJJXIxMCwlcmRpCisJamIJTCRtdWx4NHhfb3V0ZXIKKworCW1vdnEJLTgoJXJjeCksJXIxMAorCW1vdnEJJXJicCwlcjgKKwltb3ZxCSglcmN4LCVyYXgsMSksJXIxMgorCWxlYXEJKCVyY3gsJXJheCwxKSwlcmJwCisJbW92cQklcmF4LCVyY3gKKwlsZWFxCSglcmJ4LCVyYXgsMSksJXJkaQorCXhvcmwJJWVheCwlZWF4CisJeG9ycQklcjE1LCVyMTUKKwlzdWJxCSVyMTQsJXIxMAorCWFkY3EJJXIxNSwlcjE1CisJb3JxCSVyMTUsJXI4CisJc2FycQkkMysyLCVyY3gKKwlzdWJxCSVyOCwlcmF4CisJbW92cQk1Nis4KCVyc3ApLCVyZHgKKwlkZWNxCSVyMTIKKwltb3ZxCTgoJXJicCksJXIxMworCXhvcnEJJXI4LCVyOAorCW1vdnEJMTYoJXJicCksJXIxNAorCW1vdnEJMjQoJXJicCksJXIxNQorCWptcAlMJHNxcng0eF9zdWJfZW50cnkKKworCisucDJhbGlnbgk1Citibl9wb3dlcng1OgorCisJbW92cQklcnNwLCVyYXgKKworTCRwb3dlcng1X2VudGVyOgorCXB1c2hxCSVyYngKKworCXB1c2hxCSVyYnAKKworCXB1c2hxCSVyMTIKKworCXB1c2hxCSVyMTMKKworCXB1c2hxCSVyMTQKKworCXB1c2hxCSVyMTUKKworTCRwb3dlcng1X3Byb2xvZ3VlOgorCisJc2hsbAkkMywlcjlkCisJbGVhcQkoJXI5LCVyOSwyKSwlcjEwCisJbmVncQklcjkKKwltb3ZxCSglcjgpLCVyOAorCisKKworCisKKworCisKKwlsZWFxCS0zMjAoJXJzcCwlcjksMiksJXIxMQorCW1vdnEJJXJzcCwlcmJwCisJc3VicQklcmRpLCVyMTEKKwlhbmRxCSQ0MDk1LCVyMTEKKwljbXBxCSVyMTEsJXIxMAorCWpiCUwkcHdyeF9zcF9hbHQKKwlzdWJxCSVyMTEsJXJicAorCWxlYXEJLTMyMCglcmJwLCVyOSwyKSwlcmJwCisJam1wCUwkcHdyeF9zcF9kb25lCisKKy5wMmFsaWduCTUKK0wkcHdyeF9zcF9hbHQ6CisJbGVhcQk0MDk2LTMyMCgsJXI5LDIpLCVyMTAKKwlsZWFxCS0zMjAoJXJicCwlcjksMiksJXJicAorCXN1YnEJJXIxMCwlcjExCisJbW92cQkkMCwlcjEwCisJY21vdmNxCSVyMTAsJXIxMQorCXN1YnEJJXIxMSwlcmJwCitMJHB3cnhfc3BfZG9uZToKKwlhbmRxCSQtNjQsJXJicAorCW1vdnEJJXJzcCwlcjExCisJc3VicQklcmJwLCVyMTEKKwlhbmRxCSQtNDA5NiwlcjExCisJbGVhcQkoJXIxMSwlcmJwLDEpLCVyc3AKKwltb3ZxCSglcnNwKSwlcjEwCisJY21wcQklcmJwLCVyc3AKKwlqYQlMJHB3cnhfcGFnZV93YWxrCisJam1wCUwkcHdyeF9wYWdlX3dhbGtfZG9uZQorCitMJHB3cnhfcGFnZV93YWxrOgorCWxlYXEJLTQwOTYoJXJzcCksJXJzcAorCW1vdnEJKCVyc3ApLCVyMTAKKwljbXBxCSVyYnAsJXJzcAorCWphCUwkcHdyeF9wYWdlX3dhbGsKK0wkcHdyeF9wYWdlX3dhbGtfZG9uZToKKworCW1vdnEJJXI5LCVyMTAKKwluZWdxCSVyOQorCisKKworCisKKworCisKKworCisKKworCXB4b3IJJXhtbTAsJXhtbTAKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjA3CisuYnl0ZQkxMDIsNzIsMTUsMTEwLDIwOQorLmJ5dGUJMTAyLDczLDE1LDExMCwyMTgKKy5ieXRlCTEwMiw3MiwxNSwxMTAsMjI2CisJbW92cQklcjgsMzIoJXJzcCkKKwltb3ZxCSVyYXgsNDAoJXJzcCkKKworTCRwb3dlcng1X2JvZHk6CisKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKworCW1vdnEJJXIxMCwlcjkKKwltb3ZxCSVyc2ksJXJkaQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMDkKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjI2CisJbW92cQk0MCglcnNwKSwlcmF4CisKKwljYWxsCW11bHg0eF9pbnRlcm5hbAorCisJbW92cQk0MCglcnNwKSwlcnNpCisKKwltb3ZxCSQxLCVyYXgKKworCW1vdnEJLTQ4KCVyc2kpLCVyMTUKKworCW1vdnEJLTQwKCVyc2kpLCVyMTQKKworCW1vdnEJLTMyKCVyc2kpLCVyMTMKKworCW1vdnEJLTI0KCVyc2kpLCVyMTIKKworCW1vdnEJLTE2KCVyc2kpLCVyYnAKKworCW1vdnEJLTgoJXJzaSksJXJieAorCisJbGVhcQkoJXJzaSksJXJzcAorCitMJHBvd2VyeDVfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworCisuZ2xvYmwJX2JuX3Nxcng4eF9pbnRlcm5hbAorLnByaXZhdGVfZXh0ZXJuIF9ibl9zcXJ4OHhfaW50ZXJuYWwKKy5wcml2YXRlX2V4dGVybglfYm5fc3FyeDh4X2ludGVybmFsCisKKy5wMmFsaWduCTUKK19ibl9zcXJ4OHhfaW50ZXJuYWw6CitfX2JuX3Nxcng4eF9pbnRlcm5hbDoKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCWxlYXEJNDgrOCglcnNwKSwlcmRpCisJbGVhcQkoJXJzaSwlcjksMSksJXJicAorCW1vdnEJJXI5LDArOCglcnNwKQorCW1vdnEJJXJicCw4KzgoJXJzcCkKKwlqbXAJTCRzcXI4eF96ZXJvX3N0YXJ0CisKKy5wMmFsaWduCTUKKy5ieXRlCTB4NjYsMHg2NiwweDY2LDB4MmUsMHgwZiwweDFmLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCitMJHNxcng4eF96ZXJvOgorLmJ5dGUJMHgzZQorCW1vdmRxYQkleG1tMCwwKCVyZGkpCisJbW92ZHFhCSV4bW0wLDE2KCVyZGkpCisJbW92ZHFhCSV4bW0wLDMyKCVyZGkpCisJbW92ZHFhCSV4bW0wLDQ4KCVyZGkpCitMJHNxcjh4X3plcm9fc3RhcnQ6CisJbW92ZHFhCSV4bW0wLDY0KCVyZGkpCisJbW92ZHFhCSV4bW0wLDgwKCVyZGkpCisJbW92ZHFhCSV4bW0wLDk2KCVyZGkpCisJbW92ZHFhCSV4bW0wLDExMiglcmRpKQorCWxlYXEJMTI4KCVyZGkpLCVyZGkKKwlzdWJxCSQ2NCwlcjkKKwlqbnoJTCRzcXJ4OHhfemVybworCisJbW92cQkwKCVyc2kpLCVyZHgKKworCXhvcnEJJXIxMCwlcjEwCisJeG9ycQklcjExLCVyMTEKKwl4b3JxCSVyMTIsJXIxMgorCXhvcnEJJXIxMywlcjEzCisJeG9ycQklcjE0LCVyMTQKKwl4b3JxCSVyMTUsJXIxNQorCWxlYXEJNDgrOCglcnNwKSwlcmRpCisJeG9ycQklcmJwLCVyYnAKKwlqbXAJTCRzcXJ4OHhfb3V0ZXJfbG9vcAorCisucDJhbGlnbgk1CitMJHNxcng4eF9vdXRlcl9sb29wOgorCW11bHhxCTgoJXJzaSksJXI4LCVyYXgKKwlhZGN4cQklcjksJXI4CisJYWRveHEJJXJheCwlcjEwCisJbXVseHEJMTYoJXJzaSksJXI5LCVyYXgKKwlhZGN4cQklcjEwLCVyOQorCWFkb3hxCSVyYXgsJXIxMQorLmJ5dGUJMHhjNCwweGUyLDB4YWIsMHhmNiwweDg2LDB4MTgsMHgwMCwweDAwLDB4MDAKKwlhZGN4cQklcjExLCVyMTAKKwlhZG94cQklcmF4LCVyMTIKKy5ieXRlCTB4YzQsMHhlMiwweGEzLDB4ZjYsMHg4NiwweDIwLDB4MDAsMHgwMCwweDAwCisJYWRjeHEJJXIxMiwlcjExCisJYWRveHEJJXJheCwlcjEzCisJbXVseHEJNDAoJXJzaSksJXIxMiwlcmF4CisJYWRjeHEJJXIxMywlcjEyCisJYWRveHEJJXJheCwlcjE0CisJbXVseHEJNDgoJXJzaSksJXIxMywlcmF4CisJYWRjeHEJJXIxNCwlcjEzCisJYWRveHEJJXIxNSwlcmF4CisJbXVseHEJNTYoJXJzaSksJXIxNCwlcjE1CisJbW92cQk4KCVyc2kpLCVyZHgKKwlhZGN4cQklcmF4LCVyMTQKKwlhZG94cQklcmJwLCVyMTUKKwlhZGNxCTY0KCVyZGkpLCVyMTUKKwltb3ZxCSVyOCw4KCVyZGkpCisJbW92cQklcjksMTYoJXJkaSkKKwlzYmJxCSVyY3gsJXJjeAorCXhvcnEJJXJicCwlcmJwCisKKworCW11bHhxCTE2KCVyc2kpLCVyOCwlcmJ4CisJbXVseHEJMjQoJXJzaSksJXI5LCVyYXgKKwlhZGN4cQklcjEwLCVyOAorCWFkb3hxCSVyYngsJXI5CisJbXVseHEJMzIoJXJzaSksJXIxMCwlcmJ4CisJYWRjeHEJJXIxMSwlcjkKKwlhZG94cQklcmF4LCVyMTAKKy5ieXRlCTB4YzQsMHhlMiwweGEzLDB4ZjYsMHg4NiwweDI4LDB4MDAsMHgwMCwweDAwCisJYWRjeHEJJXIxMiwlcjEwCisJYWRveHEJJXJieCwlcjExCisuYnl0ZQkweGM0LDB4ZTIsMHg5YiwweGY2LDB4OWUsMHgzMCwweDAwLDB4MDAsMHgwMAorCWFkY3hxCSVyMTMsJXIxMQorCWFkb3hxCSVyMTQsJXIxMgorLmJ5dGUJMHhjNCwweDYyLDB4OTMsMHhmNiwweGI2LDB4MzgsMHgwMCwweDAwLDB4MDAKKwltb3ZxCTE2KCVyc2kpLCVyZHgKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcmJ4LCVyMTMKKwlhZGN4cQklcjE1LCVyMTMKKwlhZG94cQklcmJwLCVyMTQKKwlhZGN4cQklcmJwLCVyMTQKKworCW1vdnEJJXI4LDI0KCVyZGkpCisJbW92cQklcjksMzIoJXJkaSkKKworCW11bHhxCTI0KCVyc2kpLCVyOCwlcmJ4CisJbXVseHEJMzIoJXJzaSksJXI5LCVyYXgKKwlhZGN4cQklcjEwLCVyOAorCWFkb3hxCSVyYngsJXI5CisJbXVseHEJNDAoJXJzaSksJXIxMCwlcmJ4CisJYWRjeHEJJXIxMSwlcjkKKwlhZG94cQklcmF4LCVyMTAKKy5ieXRlCTB4YzQsMHhlMiwweGEzLDB4ZjYsMHg4NiwweDMwLDB4MDAsMHgwMCwweDAwCisJYWRjeHEJJXIxMiwlcjEwCisJYWRveHEJJXIxMywlcjExCisuYnl0ZQkweGM0LDB4NjIsMHg5YiwweGY2LDB4YWUsMHgzOCwweDAwLDB4MDAsMHgwMAorLmJ5dGUJMHgzZQorCW1vdnEJMjQoJXJzaSksJXJkeAorCWFkY3hxCSVyYngsJXIxMQorCWFkb3hxCSVyYXgsJXIxMgorCWFkY3hxCSVyMTQsJXIxMgorCW1vdnEJJXI4LDQwKCVyZGkpCisJbW92cQklcjksNDgoJXJkaSkKKwltdWx4cQkzMiglcnNpKSwlcjgsJXJheAorCWFkb3hxCSVyYnAsJXIxMworCWFkY3hxCSVyYnAsJXIxMworCisJbXVseHEJNDAoJXJzaSksJXI5LCVyYngKKwlhZGN4cQklcjEwLCVyOAorCWFkb3hxCSVyYXgsJXI5CisJbXVseHEJNDgoJXJzaSksJXIxMCwlcmF4CisJYWRjeHEJJXIxMSwlcjkKKwlhZG94cQklcjEyLCVyMTAKKwltdWx4cQk1NiglcnNpKSwlcjExLCVyMTIKKwltb3ZxCTMyKCVyc2kpLCVyZHgKKwltb3ZxCTQwKCVyc2kpLCVyMTQKKwlhZGN4cQklcmJ4LCVyMTAKKwlhZG94cQklcmF4LCVyMTEKKwltb3ZxCTQ4KCVyc2kpLCVyMTUKKwlhZGN4cQklcjEzLCVyMTEKKwlhZG94cQklcmJwLCVyMTIKKwlhZGN4cQklcmJwLCVyMTIKKworCW1vdnEJJXI4LDU2KCVyZGkpCisJbW92cQklcjksNjQoJXJkaSkKKworCW11bHhxCSVyMTQsJXI5LCVyYXgKKwltb3ZxCTU2KCVyc2kpLCVyOAorCWFkY3hxCSVyMTAsJXI5CisJbXVseHEJJXIxNSwlcjEwLCVyYngKKwlhZG94cQklcmF4LCVyMTAKKwlhZGN4cQklcjExLCVyMTAKKwltdWx4cQklcjgsJXIxMSwlcmF4CisJbW92cQklcjE0LCVyZHgKKwlhZG94cQklcmJ4LCVyMTEKKwlhZGN4cQklcjEyLCVyMTEKKworCWFkY3hxCSVyYnAsJXJheAorCisJbXVseHEJJXIxNSwlcjE0LCVyYngKKwltdWx4cQklcjgsJXIxMiwlcjEzCisJbW92cQklcjE1LCVyZHgKKwlsZWFxCTY0KCVyc2kpLCVyc2kKKwlhZGN4cQklcjE0LCVyMTEKKwlhZG94cQklcmJ4LCVyMTIKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcmJwLCVyMTMKKworLmJ5dGUJMHg2NywweDY3CisJbXVseHEJJXI4LCVyOCwlcjE0CisJYWRjeHEJJXI4LCVyMTMKKwlhZGN4cQklcmJwLCVyMTQKKworCWNtcHEJOCs4KCVyc3ApLCVyc2kKKwlqZQlMJHNxcng4eF9vdXRlcl9icmVhaworCisJbmVncQklcmN4CisJbW92cQkkLTgsJXJjeAorCW1vdnEJJXJicCwlcjE1CisJbW92cQk2NCglcmRpKSwlcjgKKwlhZGN4cQk3MiglcmRpKSwlcjkKKwlhZGN4cQk4MCglcmRpKSwlcjEwCisJYWRjeHEJODgoJXJkaSksJXIxMQorCWFkY3EJOTYoJXJkaSksJXIxMgorCWFkY3EJMTA0KCVyZGkpLCVyMTMKKwlhZGNxCTExMiglcmRpKSwlcjE0CisJYWRjcQkxMjAoJXJkaSksJXIxNQorCWxlYXEJKCVyc2kpLCVyYnAKKwlsZWFxCTEyOCglcmRpKSwlcmRpCisJc2JicQklcmF4LCVyYXgKKworCW1vdnEJLTY0KCVyc2kpLCVyZHgKKwltb3ZxCSVyYXgsMTYrOCglcnNwKQorCW1vdnEJJXJkaSwyNCs4KCVyc3ApCisKKworCXhvcmwJJWVheCwlZWF4CisJam1wCUwkc3FyeDh4X2xvb3AKKworLnAyYWxpZ24JNQorTCRzcXJ4OHhfbG9vcDoKKwltb3ZxCSVyOCwlcmJ4CisJbXVseHEJMCglcmJwKSwlcmF4LCVyOAorCWFkY3hxCSVyYXgsJXJieAorCWFkb3hxCSVyOSwlcjgKKworCW11bHhxCTgoJXJicCksJXJheCwlcjkKKwlhZGN4cQklcmF4LCVyOAorCWFkb3hxCSVyMTAsJXI5CisKKwltdWx4cQkxNiglcmJwKSwlcmF4LCVyMTAKKwlhZGN4cQklcmF4LCVyOQorCWFkb3hxCSVyMTEsJXIxMAorCisJbXVseHEJMjQoJXJicCksJXJheCwlcjExCisJYWRjeHEJJXJheCwlcjEwCisJYWRveHEJJXIxMiwlcjExCisKKy5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhhNSwweDIwLDB4MDAsMHgwMCwweDAwCisJYWRjeHEJJXJheCwlcjExCisJYWRveHEJJXIxMywlcjEyCisKKwltdWx4cQk0MCglcmJwKSwlcmF4LCVyMTMKKwlhZGN4cQklcmF4LCVyMTIKKwlhZG94cQklcjE0LCVyMTMKKworCW11bHhxCTQ4KCVyYnApLCVyYXgsJXIxNAorCW1vdnEJJXJieCwoJXJkaSwlcmN4LDgpCisJbW92bAkkMCwlZWJ4CisJYWRjeHEJJXJheCwlcjEzCisJYWRveHEJJXIxNSwlcjE0CisKKy5ieXRlCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhiZCwweDM4LDB4MDAsMHgwMCwweDAwCisJbW92cQk4KCVyc2ksJXJjeCw4KSwlcmR4CisJYWRjeHEJJXJheCwlcjE0CisJYWRveHEJJXJieCwlcjE1CisJYWRjeHEJJXJieCwlcjE1CisKKy5ieXRlCTB4NjcKKwlpbmNxCSVyY3gKKwlqbnoJTCRzcXJ4OHhfbG9vcAorCisJbGVhcQk2NCglcmJwKSwlcmJwCisJbW92cQkkLTgsJXJjeAorCWNtcHEJOCs4KCVyc3ApLCVyYnAKKwlqZQlMJHNxcng4eF9icmVhaworCisJc3VicQkxNis4KCVyc3ApLCVyYngKKy5ieXRlCTB4NjYKKwltb3ZxCS02NCglcnNpKSwlcmR4CisJYWRjeHEJMCglcmRpKSwlcjgKKwlhZGN4cQk4KCVyZGkpLCVyOQorCWFkY3EJMTYoJXJkaSksJXIxMAorCWFkY3EJMjQoJXJkaSksJXIxMQorCWFkY3EJMzIoJXJkaSksJXIxMgorCWFkY3EJNDAoJXJkaSksJXIxMworCWFkY3EJNDgoJXJkaSksJXIxNAorCWFkY3EJNTYoJXJkaSksJXIxNQorCWxlYXEJNjQoJXJkaSksJXJkaQorLmJ5dGUJMHg2NworCXNiYnEJJXJheCwlcmF4CisJeG9ybAklZWJ4LCVlYngKKwltb3ZxCSVyYXgsMTYrOCglcnNwKQorCWptcAlMJHNxcng4eF9sb29wCisKKy5wMmFsaWduCTUKK0wkc3FyeDh4X2JyZWFrOgorCXhvcnEJJXJicCwlcmJwCisJc3VicQkxNis4KCVyc3ApLCVyYngKKwlhZGN4cQklcmJwLCVyOAorCW1vdnEJMjQrOCglcnNwKSwlcmN4CisJYWRjeHEJJXJicCwlcjkKKwltb3ZxCTAoJXJzaSksJXJkeAorCWFkY3EJJDAsJXIxMAorCW1vdnEJJXI4LDAoJXJkaSkKKwlhZGNxCSQwLCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGNxCSQwLCVyMTMKKwlhZGNxCSQwLCVyMTQKKwlhZGNxCSQwLCVyMTUKKwljbXBxCSVyY3gsJXJkaQorCWplCUwkc3FyeDh4X291dGVyX2xvb3AKKworCW1vdnEJJXI5LDgoJXJkaSkKKwltb3ZxCTgoJXJjeCksJXI5CisJbW92cQklcjEwLDE2KCVyZGkpCisJbW92cQkxNiglcmN4KSwlcjEwCisJbW92cQklcjExLDI0KCVyZGkpCisJbW92cQkyNCglcmN4KSwlcjExCisJbW92cQklcjEyLDMyKCVyZGkpCisJbW92cQkzMiglcmN4KSwlcjEyCisJbW92cQklcjEzLDQwKCVyZGkpCisJbW92cQk0MCglcmN4KSwlcjEzCisJbW92cQklcjE0LDQ4KCVyZGkpCisJbW92cQk0OCglcmN4KSwlcjE0CisJbW92cQklcjE1LDU2KCVyZGkpCisJbW92cQk1NiglcmN4KSwlcjE1CisJbW92cQklcmN4LCVyZGkKKwlqbXAJTCRzcXJ4OHhfb3V0ZXJfbG9vcAorCisucDJhbGlnbgk1CitMJHNxcng4eF9vdXRlcl9icmVhazoKKwltb3ZxCSVyOSw3MiglcmRpKQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTcKKwltb3ZxCSVyMTAsODAoJXJkaSkKKwltb3ZxCSVyMTEsODgoJXJkaSkKKwltb3ZxCSVyMTIsOTYoJXJkaSkKKwltb3ZxCSVyMTMsMTA0KCVyZGkpCisJbW92cQklcjE0LDExMiglcmRpKQorCWxlYXEJNDgrOCglcnNwKSwlcmRpCisJbW92cQkoJXJzaSwlcmN4LDEpLCVyZHgKKworCW1vdnEJOCglcmRpKSwlcjExCisJeG9ycQklcjEwLCVyMTAKKwltb3ZxCTArOCglcnNwKSwlcjkKKwlhZG94cQklcjExLCVyMTEKKwltb3ZxCTE2KCVyZGkpLCVyMTIKKwltb3ZxCTI0KCVyZGkpLCVyMTMKKworCisucDJhbGlnbgk1CitMJHNxcng0eF9zaGlmdF9uX2FkZDoKKwltdWx4cQklcmR4LCVyYXgsJXJieAorCWFkb3hxCSVyMTIsJXIxMgorCWFkY3hxCSVyMTAsJXJheAorLmJ5dGUJMHg0OCwweDhiLDB4OTQsMHgwZSwweDA4LDB4MDAsMHgwMCwweDAwCisuYnl0ZQkweDRjLDB4OGIsMHg5NywweDIwLDB4MDAsMHgwMCwweDAwCisJYWRveHEJJXIxMywlcjEzCisJYWRjeHEJJXIxMSwlcmJ4CisJbW92cQk0MCglcmRpKSwlcjExCisJbW92cQklcmF4LDAoJXJkaSkKKwltb3ZxCSVyYngsOCglcmRpKQorCisJbXVseHEJJXJkeCwlcmF4LCVyYngKKwlhZG94cQklcjEwLCVyMTAKKwlhZGN4cQklcjEyLCVyYXgKKwltb3ZxCTE2KCVyc2ksJXJjeCwxKSwlcmR4CisJbW92cQk0OCglcmRpKSwlcjEyCisJYWRveHEJJXIxMSwlcjExCisJYWRjeHEJJXIxMywlcmJ4CisJbW92cQk1NiglcmRpKSwlcjEzCisJbW92cQklcmF4LDE2KCVyZGkpCisJbW92cQklcmJ4LDI0KCVyZGkpCisKKwltdWx4cQklcmR4LCVyYXgsJXJieAorCWFkb3hxCSVyMTIsJXIxMgorCWFkY3hxCSVyMTAsJXJheAorCW1vdnEJMjQoJXJzaSwlcmN4LDEpLCVyZHgKKwlsZWFxCTMyKCVyY3gpLCVyY3gKKwltb3ZxCTY0KCVyZGkpLCVyMTAKKwlhZG94cQklcjEzLCVyMTMKKwlhZGN4cQklcjExLCVyYngKKwltb3ZxCTcyKCVyZGkpLCVyMTEKKwltb3ZxCSVyYXgsMzIoJXJkaSkKKwltb3ZxCSVyYngsNDAoJXJkaSkKKworCW11bHhxCSVyZHgsJXJheCwlcmJ4CisJYWRveHEJJXIxMCwlcjEwCisJYWRjeHEJJXIxMiwlcmF4CisJanJjeHoJTCRzcXJ4NHhfc2hpZnRfbl9hZGRfYnJlYWsKKy5ieXRlCTB4NDgsMHg4YiwweDk0LDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMAorCWFkb3hxCSVyMTEsJXIxMQorCWFkY3hxCSVyMTMsJXJieAorCW1vdnEJODAoJXJkaSksJXIxMgorCW1vdnEJODgoJXJkaSksJXIxMworCW1vdnEJJXJheCw0OCglcmRpKQorCW1vdnEJJXJieCw1NiglcmRpKQorCWxlYXEJNjQoJXJkaSksJXJkaQorCW5vcAorCWptcAlMJHNxcng0eF9zaGlmdF9uX2FkZAorCisucDJhbGlnbgk1CitMJHNxcng0eF9zaGlmdF9uX2FkZF9icmVhazoKKwlhZGN4cQklcjEzLCVyYngKKwltb3ZxCSVyYXgsNDgoJXJkaSkKKwltb3ZxCSVyYngsNTYoJXJkaSkKKwlsZWFxCTY0KCVyZGkpLCVyZGkKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjEzCitfX2JuX3Nxcng4eF9yZWR1Y3Rpb246CisJeG9ybAklZWF4LCVlYXgKKwltb3ZxCTMyKzgoJXJzcCksJXJieAorCW1vdnEJNDgrOCglcnNwKSwlcmR4CisJbGVhcQktNjQoJXJicCwlcjksMSksJXJjeAorCisJbW92cQklcmN4LDArOCglcnNwKQorCW1vdnEJJXJkaSw4KzgoJXJzcCkKKworCWxlYXEJNDgrOCglcnNwKSwlcmRpCisJam1wCUwkc3FyeDh4X3JlZHVjdGlvbl9sb29wCisKKy5wMmFsaWduCTUKK0wkc3FyeDh4X3JlZHVjdGlvbl9sb29wOgorCW1vdnEJOCglcmRpKSwlcjkKKwltb3ZxCTE2KCVyZGkpLCVyMTAKKwltb3ZxCTI0KCVyZGkpLCVyMTEKKwltb3ZxCTMyKCVyZGkpLCVyMTIKKwltb3ZxCSVyZHgsJXI4CisJaW11bHEJJXJieCwlcmR4CisJbW92cQk0MCglcmRpKSwlcjEzCisJbW92cQk0OCglcmRpKSwlcjE0CisJbW92cQk1NiglcmRpKSwlcjE1CisJbW92cQklcmF4LDI0KzgoJXJzcCkKKworCWxlYXEJNjQoJXJkaSksJXJkaQorCXhvcnEJJXJzaSwlcnNpCisJbW92cQkkLTgsJXJjeAorCWptcAlMJHNxcng4eF9yZWR1Y2UKKworLnAyYWxpZ24JNQorTCRzcXJ4OHhfcmVkdWNlOgorCW1vdnEJJXI4LCVyYngKKwltdWx4cQkwKCVyYnApLCVyYXgsJXI4CisJYWRjeHEJJXJieCwlcmF4CisJYWRveHEJJXI5LCVyOAorCisJbXVseHEJOCglcmJwKSwlcmJ4LCVyOQorCWFkY3hxCSVyYngsJXI4CisJYWRveHEJJXIxMCwlcjkKKworCW11bHhxCTE2KCVyYnApLCVyYngsJXIxMAorCWFkY3hxCSVyYngsJXI5CisJYWRveHEJJXIxMSwlcjEwCisKKwltdWx4cQkyNCglcmJwKSwlcmJ4LCVyMTEKKwlhZGN4cQklcmJ4LCVyMTAKKwlhZG94cQklcjEyLCVyMTEKKworLmJ5dGUJMHhjNCwweDYyLDB4ZTMsMHhmNiwweGE1LDB4MjAsMHgwMCwweDAwLDB4MDAKKwltb3ZxCSVyZHgsJXJheAorCW1vdnEJJXI4LCVyZHgKKwlhZGN4cQklcmJ4LCVyMTEKKwlhZG94cQklcjEzLCVyMTIKKworCW11bHhxCTMyKzgoJXJzcCksJXJieCwlcmR4CisJbW92cQklcmF4LCVyZHgKKwltb3ZxCSVyYXgsNjQrNDgrOCglcnNwLCVyY3gsOCkKKworCW11bHhxCTQwKCVyYnApLCVyYXgsJXIxMworCWFkY3hxCSVyYXgsJXIxMgorCWFkb3hxCSVyMTQsJXIxMworCisJbXVseHEJNDgoJXJicCksJXJheCwlcjE0CisJYWRjeHEJJXJheCwlcjEzCisJYWRveHEJJXIxNSwlcjE0CisKKwltdWx4cQk1NiglcmJwKSwlcmF4LCVyMTUKKwltb3ZxCSVyYngsJXJkeAorCWFkY3hxCSVyYXgsJXIxNAorCWFkb3hxCSVyc2ksJXIxNQorCWFkY3hxCSVyc2ksJXIxNQorCisuYnl0ZQkweDY3LDB4NjcsMHg2NworCWluY3EJJXJjeAorCWpueglMJHNxcng4eF9yZWR1Y2UKKworCW1vdnEJJXJzaSwlcmF4CisJY21wcQkwKzgoJXJzcCksJXJicAorCWphZQlMJHNxcng4eF9ub190YWlsCisKKwltb3ZxCTQ4KzgoJXJzcCksJXJkeAorCWFkZHEJMCglcmRpKSwlcjgKKwlsZWFxCTY0KCVyYnApLCVyYnAKKwltb3ZxCSQtOCwlcmN4CisJYWRjeHEJOCglcmRpKSwlcjkKKwlhZGN4cQkxNiglcmRpKSwlcjEwCisJYWRjcQkyNCglcmRpKSwlcjExCisJYWRjcQkzMiglcmRpKSwlcjEyCisJYWRjcQk0MCglcmRpKSwlcjEzCisJYWRjcQk0OCglcmRpKSwlcjE0CisJYWRjcQk1NiglcmRpKSwlcjE1CisJbGVhcQk2NCglcmRpKSwlcmRpCisJc2JicQklcmF4LCVyYXgKKworCXhvcnEJJXJzaSwlcnNpCisJbW92cQklcmF4LDE2KzgoJXJzcCkKKwlqbXAJTCRzcXJ4OHhfdGFpbAorCisucDJhbGlnbgk1CitMJHNxcng4eF90YWlsOgorCW1vdnEJJXI4LCVyYngKKwltdWx4cQkwKCVyYnApLCVyYXgsJXI4CisJYWRjeHEJJXJheCwlcmJ4CisJYWRveHEJJXI5LCVyOAorCisJbXVseHEJOCglcmJwKSwlcmF4LCVyOQorCWFkY3hxCSVyYXgsJXI4CisJYWRveHEJJXIxMCwlcjkKKworCW11bHhxCTE2KCVyYnApLCVyYXgsJXIxMAorCWFkY3hxCSVyYXgsJXI5CisJYWRveHEJJXIxMSwlcjEwCisKKwltdWx4cQkyNCglcmJwKSwlcmF4LCVyMTEKKwlhZGN4cQklcmF4LCVyMTAKKwlhZG94cQklcjEyLCVyMTEKKworLmJ5dGUJMHhjNCwweDYyLDB4ZmIsMHhmNiwweGE1LDB4MjAsMHgwMCwweDAwLDB4MDAKKwlhZGN4cQklcmF4LCVyMTEKKwlhZG94cQklcjEzLCVyMTIKKworCW11bHhxCTQwKCVyYnApLCVyYXgsJXIxMworCWFkY3hxCSVyYXgsJXIxMgorCWFkb3hxCSVyMTQsJXIxMworCisJbXVseHEJNDgoJXJicCksJXJheCwlcjE0CisJYWRjeHEJJXJheCwlcjEzCisJYWRveHEJJXIxNSwlcjE0CisKKwltdWx4cQk1NiglcmJwKSwlcmF4LCVyMTUKKwltb3ZxCTcyKzQ4KzgoJXJzcCwlcmN4LDgpLCVyZHgKKwlhZGN4cQklcmF4LCVyMTQKKwlhZG94cQklcnNpLCVyMTUKKwltb3ZxCSVyYngsKCVyZGksJXJjeCw4KQorCW1vdnEJJXI4LCVyYngKKwlhZGN4cQklcnNpLCVyMTUKKworCWluY3EJJXJjeAorCWpueglMJHNxcng4eF90YWlsCisKKwljbXBxCTArOCglcnNwKSwlcmJwCisJamFlCUwkc3FyeDh4X3RhaWxfZG9uZQorCisJc3VicQkxNis4KCVyc3ApLCVyc2kKKwltb3ZxCTQ4KzgoJXJzcCksJXJkeAorCWxlYXEJNjQoJXJicCksJXJicAorCWFkY3EJMCglcmRpKSwlcjgKKwlhZGNxCTgoJXJkaSksJXI5CisJYWRjcQkxNiglcmRpKSwlcjEwCisJYWRjcQkyNCglcmRpKSwlcjExCisJYWRjcQkzMiglcmRpKSwlcjEyCisJYWRjcQk0MCglcmRpKSwlcjEzCisJYWRjcQk0OCglcmRpKSwlcjE0CisJYWRjcQk1NiglcmRpKSwlcjE1CisJbGVhcQk2NCglcmRpKSwlcmRpCisJc2JicQklcmF4LCVyYXgKKwlzdWJxCSQ4LCVyY3gKKworCXhvcnEJJXJzaSwlcnNpCisJbW92cQklcmF4LDE2KzgoJXJzcCkKKwlqbXAJTCRzcXJ4OHhfdGFpbAorCisucDJhbGlnbgk1CitMJHNxcng4eF90YWlsX2RvbmU6CisJeG9ycQklcmF4LCVyYXgKKwlhZGRxCTI0KzgoJXJzcCksJXI4CisJYWRjcQkkMCwlcjkKKwlhZGNxCSQwLCVyMTAKKwlhZGNxCSQwLCVyMTEKKwlhZGNxCSQwLCVyMTIKKwlhZGNxCSQwLCVyMTMKKwlhZGNxCSQwLCVyMTQKKwlhZGNxCSQwLCVyMTUKKwlhZGNxCSQwLCVyYXgKKworCXN1YnEJMTYrOCglcnNwKSwlcnNpCitMJHNxcng4eF9ub190YWlsOgorCWFkY3EJMCglcmRpKSwlcjgKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjE3CisJYWRjcQk4KCVyZGkpLCVyOQorCW1vdnEJNTYoJXJicCksJXJzaQorLmJ5dGUJMTAyLDcyLDE1LDEyNiwyMTMKKwlhZGNxCTE2KCVyZGkpLCVyMTAKKwlhZGNxCTI0KCVyZGkpLCVyMTEKKwlhZGNxCTMyKCVyZGkpLCVyMTIKKwlhZGNxCTQwKCVyZGkpLCVyMTMKKwlhZGNxCTQ4KCVyZGkpLCVyMTQKKwlhZGNxCTU2KCVyZGkpLCVyMTUKKwlhZGNxCSQwLCVyYXgKKworCW1vdnEJMzIrOCglcnNwKSwlcmJ4CisJbW92cQk2NCglcmRpLCVyY3gsMSksJXJkeAorCisJbW92cQklcjgsMCglcmRpKQorCWxlYXEJNjQoJXJkaSksJXI4CisJbW92cQklcjksOCglcmRpKQorCW1vdnEJJXIxMCwxNiglcmRpKQorCW1vdnEJJXIxMSwyNCglcmRpKQorCW1vdnEJJXIxMiwzMiglcmRpKQorCW1vdnEJJXIxMyw0MCglcmRpKQorCW1vdnEJJXIxNCw0OCglcmRpKQorCW1vdnEJJXIxNSw1NiglcmRpKQorCisJbGVhcQk2NCglcmRpLCVyY3gsMSksJXJkaQorCWNtcHEJOCs4KCVyc3ApLCVyOAorCWpiCUwkc3FyeDh4X3JlZHVjdGlvbl9sb29wCisJLmJ5dGUJMHhmMywweGMzCisKKy5wMmFsaWduCTUKK19fYm5fcG9zdHg0eF9pbnRlcm5hbDoKKwltb3ZxCTAoJXJicCksJXIxMgorCW1vdnEJJXJjeCwlcjEwCisJbW92cQklcmN4LCVyOQorCW5lZ3EJJXJheAorCXNhcnEJJDMrMiwlcmN4CisKKy5ieXRlCTEwMiw3MiwxNSwxMjYsMjAyCisuYnl0ZQkxMDIsNzIsMTUsMTI2LDIwNgorCWRlY3EJJXIxMgorCW1vdnEJOCglcmJwKSwlcjEzCisJeG9ycQklcjgsJXI4CisJbW92cQkxNiglcmJwKSwlcjE0CisJbW92cQkyNCglcmJwKSwlcjE1CisJam1wCUwkc3FyeDR4X3N1Yl9lbnRyeQorCisucDJhbGlnbgk0CitMJHNxcng0eF9zdWI6CisJbW92cQkwKCVyYnApLCVyMTIKKwltb3ZxCTgoJXJicCksJXIxMworCW1vdnEJMTYoJXJicCksJXIxNAorCW1vdnEJMjQoJXJicCksJXIxNQorTCRzcXJ4NHhfc3ViX2VudHJ5OgorCWFuZG5xCSVyYXgsJXIxMiwlcjEyCisJbGVhcQkzMiglcmJwKSwlcmJwCisJYW5kbnEJJXJheCwlcjEzLCVyMTMKKwlhbmRucQklcmF4LCVyMTQsJXIxNAorCWFuZG5xCSVyYXgsJXIxNSwlcjE1CisKKwluZWdxCSVyOAorCWFkY3EJMCglcmRpKSwlcjEyCisJYWRjcQk4KCVyZGkpLCVyMTMKKwlhZGNxCTE2KCVyZGkpLCVyMTQKKwlhZGNxCTI0KCVyZGkpLCVyMTUKKwltb3ZxCSVyMTIsMCglcmR4KQorCWxlYXEJMzIoJXJkaSksJXJkaQorCW1vdnEJJXIxMyw4KCVyZHgpCisJc2JicQklcjgsJXI4CisJbW92cQklcjE0LDE2KCVyZHgpCisJbW92cQklcjE1LDI0KCVyZHgpCisJbGVhcQkzMiglcmR4KSwlcmR4CisKKwlpbmNxCSVyY3gKKwlqbnoJTCRzcXJ4NHhfc3ViCisKKwluZWdxCSVyOQorCisJLmJ5dGUJMHhmMywweGMzCisKKy5nbG9ibAlfYm5fc2NhdHRlcjUKKy5wcml2YXRlX2V4dGVybiBfYm5fc2NhdHRlcjUKKworLnAyYWxpZ24JNAorX2JuX3NjYXR0ZXI1OgorCWNtcGwJJDAsJWVzaQorCWp6CUwkc2NhdHRlcl9lcGlsb2d1ZQorCWxlYXEJKCVyZHgsJXJjeCw4KSwlcmR4CitMJHNjYXR0ZXI6CisJbW92cQkoJXJkaSksJXJheAorCWxlYXEJOCglcmRpKSwlcmRpCisJbW92cQklcmF4LCglcmR4KQorCWxlYXEJMjU2KCVyZHgpLCVyZHgKKwlzdWJsCSQxLCVlc2kKKwlqbnoJTCRzY2F0dGVyCitMJHNjYXR0ZXJfZXBpbG9ndWU6CisJLmJ5dGUJMHhmMywweGMzCisKKworLmdsb2JsCV9ibl9nYXRoZXI1CisucHJpdmF0ZV9leHRlcm4gX2JuX2dhdGhlcjUKKworLnAyYWxpZ24JNQorX2JuX2dhdGhlcjU6CitMJFNFSF9iZWdpbl9ibl9nYXRoZXI1OgorCisuYnl0ZQkweDRjLDB4OGQsMHgxNCwweDI0CisuYnl0ZQkweDQ4LDB4ODEsMHhlYywweDA4LDB4MDEsMHgwMCwweDAwCisJbGVhcQlMJGluYyglcmlwKSwlcmF4CisJYW5kcQkkLTE2LCVyc3AKKworCW1vdmQJJWVjeCwleG1tNQorCW1vdmRxYQkwKCVyYXgpLCV4bW0wCisJbW92ZHFhCTE2KCVyYXgpLCV4bW0xCisJbGVhcQkxMjgoJXJkeCksJXIxMQorCWxlYXEJMTI4KCVyc3ApLCVyYXgKKworCXBzaHVmZAkkMCwleG1tNSwleG1tNQorCW1vdmRxYQkleG1tMSwleG1tNAorCW1vdmRxYQkleG1tMSwleG1tMgorCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tNCwleG1tMworCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLC0xMjgoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTAKKworCXBhZGRkCSV4bW0yLCV4bW0zCisJcGNtcGVxZAkleG1tNSwleG1tMgorCW1vdmRxYQkleG1tMSwtMTEyKCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0xCisKKwlwYWRkZAkleG1tMywleG1tMAorCXBjbXBlcWQJJXhtbTUsJXhtbTMKKwltb3ZkcWEJJXhtbTIsLTk2KCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0yCisJcGFkZGQJJXhtbTAsJXhtbTEKKwlwY21wZXFkCSV4bW01LCV4bW0wCisJbW92ZHFhCSV4bW0zLC04MCglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMworCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLC02NCglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMAorCisJcGFkZGQJJXhtbTIsJXhtbTMKKwlwY21wZXFkCSV4bW01LCV4bW0yCisJbW92ZHFhCSV4bW0xLC00OCglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMQorCisJcGFkZGQJJXhtbTMsJXhtbTAKKwlwY21wZXFkCSV4bW01LCV4bW0zCisJbW92ZHFhCSV4bW0yLC0zMiglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMywtMTYoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTMKKworCXBhZGRkCSV4bW0xLCV4bW0yCisJcGNtcGVxZAkleG1tNSwleG1tMQorCW1vdmRxYQkleG1tMCwwKCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsMTYoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiwzMiglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMgorCXBhZGRkCSV4bW0wLCV4bW0xCisJcGNtcGVxZAkleG1tNSwleG1tMAorCW1vdmRxYQkleG1tMyw0OCglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMworCisJcGFkZGQJJXhtbTEsJXhtbTIKKwlwY21wZXFkCSV4bW01LCV4bW0xCisJbW92ZHFhCSV4bW0wLDY0KCVyYXgpCisJbW92ZHFhCSV4bW00LCV4bW0wCisKKwlwYWRkZAkleG1tMiwleG1tMworCXBjbXBlcWQJJXhtbTUsJXhtbTIKKwltb3ZkcWEJJXhtbTEsODAoJXJheCkKKwltb3ZkcWEJJXhtbTQsJXhtbTEKKworCXBhZGRkCSV4bW0zLCV4bW0wCisJcGNtcGVxZAkleG1tNSwleG1tMworCW1vdmRxYQkleG1tMiw5NiglcmF4KQorCW1vdmRxYQkleG1tNCwleG1tMgorCW1vdmRxYQkleG1tMywxMTIoJXJheCkKKwlqbXAJTCRnYXRoZXIKKworLnAyYWxpZ24JNQorTCRnYXRoZXI6CisJcHhvcgkleG1tNCwleG1tNAorCXB4b3IJJXhtbTUsJXhtbTUKKwltb3ZkcWEJLTEyOCglcjExKSwleG1tMAorCW1vdmRxYQktMTEyKCVyMTEpLCV4bW0xCisJbW92ZHFhCS05NiglcjExKSwleG1tMgorCXBhbmQJLTEyOCglcmF4KSwleG1tMAorCW1vdmRxYQktODAoJXIxMSksJXhtbTMKKwlwYW5kCS0xMTIoJXJheCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS05NiglcmF4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTgwKCVyYXgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCS02NCglcjExKSwleG1tMAorCW1vdmRxYQktNDgoJXIxMSksJXhtbTEKKwltb3ZkcWEJLTMyKCVyMTEpLCV4bW0yCisJcGFuZAktNjQoJXJheCksJXhtbTAKKwltb3ZkcWEJLTE2KCVyMTEpLCV4bW0zCisJcGFuZAktNDgoJXJheCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCS0zMiglcmF4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJLTE2KCVyYXgpLCV4bW0zCisJcG9yCSV4bW0yLCV4bW00CisJcG9yCSV4bW0zLCV4bW01CisJbW92ZHFhCTAoJXIxMSksJXhtbTAKKwltb3ZkcWEJMTYoJXIxMSksJXhtbTEKKwltb3ZkcWEJMzIoJXIxMSksJXhtbTIKKwlwYW5kCTAoJXJheCksJXhtbTAKKwltb3ZkcWEJNDgoJXIxMSksJXhtbTMKKwlwYW5kCTE2KCVyYXgpLCV4bW0xCisJcG9yCSV4bW0wLCV4bW00CisJcGFuZAkzMiglcmF4KSwleG1tMgorCXBvcgkleG1tMSwleG1tNQorCXBhbmQJNDgoJXJheCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwltb3ZkcWEJNjQoJXIxMSksJXhtbTAKKwltb3ZkcWEJODAoJXIxMSksJXhtbTEKKwltb3ZkcWEJOTYoJXIxMSksJXhtbTIKKwlwYW5kCTY0KCVyYXgpLCV4bW0wCisJbW92ZHFhCTExMiglcjExKSwleG1tMworCXBhbmQJODAoJXJheCksJXhtbTEKKwlwb3IJJXhtbTAsJXhtbTQKKwlwYW5kCTk2KCVyYXgpLCV4bW0yCisJcG9yCSV4bW0xLCV4bW01CisJcGFuZAkxMTIoJXJheCksJXhtbTMKKwlwb3IJJXhtbTIsJXhtbTQKKwlwb3IJJXhtbTMsJXhtbTUKKwlwb3IJJXhtbTUsJXhtbTQKKwlsZWFxCTI1NiglcjExKSwlcjExCisJcHNodWZkCSQweDRlLCV4bW00LCV4bW0wCisJcG9yCSV4bW00LCV4bW0wCisJbW92cQkleG1tMCwoJXJkaSkKKwlsZWFxCTgoJXJkaSksJXJkaQorCXN1YmwJJDEsJWVzaQorCWpueglMJGdhdGhlcgorCisJbGVhcQkoJXIxMCksJXJzcAorCS5ieXRlCTB4ZjMsMHhjMworTCRTRUhfZW5kX2JuX2dhdGhlcjU6CisKKy5wMmFsaWduCTYKK0wkaW5jOgorLmxvbmcJMCwwLCAxLDEKKy5sb25nCTIsMiwgMiwyCisuYnl0ZQk3NywxMTEsMTEwLDExNiwxMDMsMTExLDEwOSwxMDEsMTE0LDEyMSwzMiw3NywxMTcsMTA4LDExNiwxMDUsMTEyLDEwOCwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTUsOTksOTcsMTE2LDExNiwxMDEsMTE0LDQ3LDEwMyw5NywxMTYsMTA0LDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY29uZmlnL2FuZHJvaWQvb3BlbnNzbC9vcGVuc3NsY29uZi5oIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY29uZmlnL2FuZHJvaWQvb3BlbnNzbC9vcGVuc3NsY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGU1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jb25maWcvYW5kcm9pZC9vcGVuc3NsL29wZW5zc2xjb25mLmgKQEAgLTAsMCArMSwyOTkgQEAKKy8qIG9wZW5zc2xjb25mLmggKi8KKy8qIFdBUk5JTkc6IEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gb3BlbnNzbGNvbmYuaC5pbiBieSBDb25maWd1cmUuICovCisKKy8qIE9wZW5TU0wgd2FzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6ICovCisjaWZuZGVmIE9QRU5TU0xfRE9JTkdfTUFLRURFUEVORAorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorIyBkZWZpbmUgT1BFTlNTTF9OT19DQU1FTExJQQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVAorIyBkZWZpbmUgT1BFTlNTTF9OT19DQVNUCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ01TCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ19OSVNUUF82NF9HQ0NfMTI4CisjIGRlZmluZSBPUEVOU1NMX05PX0VDX05JU1RQXzY0X0dDQ18xMjgKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0dNUAorIyBkZWZpbmUgT1BFTlNTTF9OT19HTVAKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKyMgZGVmaW5lIE9QRU5TU0xfTk9fSURFQQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSlBBS0UKKyMgZGVmaW5lIE9QRU5TU0xfTk9fSlBBS0UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fS1JCNQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQyCisjIGRlZmluZSBPUEVOU1NMX05PX01EMgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTURDMgorIyBkZWZpbmUgT1BFTlNTTF9OT19NREMyCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fUkM1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisjIGRlZmluZSBPUEVOU1NMX05PX1JGQzM3NzkKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NDVFAKKyMgZGVmaW5lIE9QRU5TU0xfTk9fU0NUUAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorIyBkZWZpbmUgT1BFTlNTTF9OT19TRUVECisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEwCisjIGRlZmluZSBPUEVOU1NMX05PX1NIQTAKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NUT1JFCisjIGRlZmluZSBPUEVOU1NMX05PX1NUT1JFCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19XSElSTFBPT0wKKyMgZGVmaW5lIE9QRU5TU0xfTk9fV0hJUkxQT09MCisjZW5kaWYKKworI2VuZGlmIC8qIE9QRU5TU0xfRE9JTkdfTUFLRURFUEVORCAqLworCisjaWYgZGVmaW5lZChfX2FybV9fKQorCisjIGRlZmluZSBPUEVOU1NMX0JOX0FTTV9HRjJtCisjIGRlZmluZSBPUEVOU1NMX0JOX0FTTV9NT05UCisjIGRlZmluZSBHSEFTSF9BU00KKyMgZGVmaW5lIEFFU19BU00KKyMgZGVmaW5lIFNIQTFfQVNNCisjIGRlZmluZSBTSEEyNTZfQVNNCisjIGRlZmluZSBTSEE1MTJfQVNNCisKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisKKyMgZGVmaW5lIE9QRU5TU0xfQk5fQVNNX0dGMm0KKyMgZGVmaW5lIE9QRU5TU0xfQk5fQVNNX01PTlQKKyMgZGVmaW5lIE9QRU5TU0xfQk5fQVNNX1BBUlRfV09SRFMKKyMgZGVmaW5lIEFFU19BU00gCisjIGRlZmluZSBHSEFTSF9BU00KKyMgZGVmaW5lIFNIQTFfQVNNCisjIGRlZmluZSBTSEEyNTZfQVNNCisjIGRlZmluZSBTSEE1MTJfQVNNCisjIGRlZmluZSBNRDVfQVNNCisjIGRlZmluZSBERVNfUFRSIAorIyBkZWZpbmUgREVTX1JJU0MxCisjIGRlZmluZSBERVNfVU5ST0xMCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisKKyMgZGVmaW5lIE9QRU5TU0xfQk5fQVNNX01PTlQKKyMgZGVmaW5lIEFFU19BU00KKyMgZGVmaW5lIFNIQTFfQVNNCisjIGRlZmluZSBTSEEyNTZfQVNNCisKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfVEhSRUFEUworIyBkZWZpbmUgT1BFTlNTTF9USFJFQURTCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EWU5BTUlDX0VOR0lORQorIyBkZWZpbmUgT1BFTlNTTF9OT19EWU5BTUlDX0VOR0lORQorI2VuZGlmCisKKy8qIFRoZSBPUEVOU1NMX05PXyogbWFjcm9zIGFyZSBhbHNvIGRlZmluZWQgYXMgTk9fKiBpZiB0aGUgYXBwbGljYXRpb24KKyAgIGFza3MgZm9yIGl0LiAgVGhpcyBpcyBhIHRyYW5zaWVudCBmZWF0dXJlIHRoYXQgaXMgcHJvdmlkZWQgZm9yIHRob3NlCisgICB3aG8gaGF2ZW4ndCBoYWQgdGhlIHRpbWUgdG8gZG8gdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgaW4gdGhlaXIKKyAgIGFwcGxpY2F0aW9ucy4gICovCisjaWZkZWYgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUworIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fQ0FTVCkgJiYgIWRlZmluZWQoTk9fQ0FTVCkKKyMgIGRlZmluZSBOT19DQVNUCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19HTVApICYmICFkZWZpbmVkKE5PX0dNUCkKKyMgIGRlZmluZSBOT19HTVAKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0lERUEpICYmICFkZWZpbmVkKE5PX0lERUEpCisjICBkZWZpbmUgTk9fSURFQQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fSlBBS0UpICYmICFkZWZpbmVkKE5PX0pQQUtFKQorIyAgZGVmaW5lIE5PX0pQQUtFCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19LUkI1KSAmJiAhZGVmaW5lZChOT19LUkI1KQorIyAgZGVmaW5lIE5PX0tSQjUKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX01EMikgJiYgIWRlZmluZWQoTk9fTUQyKQorIyAgZGVmaW5lIE5PX01EMgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fUkM1KSAmJiAhZGVmaW5lZChOT19SQzUpCisjICBkZWZpbmUgTk9fUkM1CisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19SRkMzNzc5KSAmJiAhZGVmaW5lZChOT19SRkMzNzc5KQorIyAgZGVmaW5lIE5PX1JGQzM3NzkKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1NFRUQpICYmICFkZWZpbmVkKE5PX1NFRUQpCisjICBkZWZpbmUgTk9fU0VFRAorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fU0hBMCkgJiYgIWRlZmluZWQoTk9fU0hBMCkKKyMgIGRlZmluZSBOT19TSEEwCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19TVE9SRSkgJiYgIWRlZmluZWQoTk9fU1RPUkUpCisjICBkZWZpbmUgTk9fU1RPUkUKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1dIUkxQT09MKSAmJiAhZGVmaW5lZChOT19XSFJMUE9PTCkKKyMgIGRlZmluZSBOT19XSFJMUE9PTAorIyBlbmRpZgorI2VuZGlmCisKKy8qIGNyeXB0by9vcGVuc3NsY29uZi5oLmluICovCisKKy8qIEdlbmVyYXRlIDgwMzg2IGNvZGU/ICovCisjdW5kZWYgSTM4Nl9PTkxZCisKKyNpZiAhKGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKF9fVk1TKSkgLyogVk1TIHVzZXMgbG9naWNhbCBuYW1lcyBpbnN0ZWFkICovCisjaWYgZGVmaW5lZChIRUFERVJfQ1JZUFRMSUJfSCkgJiYgIWRlZmluZWQoT1BFTlNTTERJUikKKyNkZWZpbmUgRU5HSU5FU0RJUiAiL3Vzci9sb2NhbC9zc2wvbGliL2VuZ2luZXMiCisjZGVmaW5lIE9QRU5TU0xESVIgIi91c3IvbG9jYWwvc3NsIgorI2VuZGlmCisjZW5kaWYKKworI3VuZGVmIE9QRU5TU0xfVU5JU1RECisjZGVmaW5lIE9QRU5TU0xfVU5JU1REIDx1bmlzdGQuaD4KKworI3VuZGVmIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTgorCisjaWYgZGVmaW5lZChIRUFERVJfSURFQV9IKSAmJiAhZGVmaW5lZChJREVBX0lOVCkKKyNkZWZpbmUgSURFQV9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX01EMl9IKSAmJiAhZGVmaW5lZChNRDJfSU5UKQorI2RlZmluZSBNRDJfSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9SQzJfSCkgJiYgIWRlZmluZWQoUkMyX0lOVCkKKy8qIEkgbmVlZCB0byBwdXQgaW4gYSBtb2QgZm9yIHRoZSBhbHBoYSAtIGVheSAqLworI2RlZmluZSBSQzJfSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9SQzRfSCkKKyNpZiAhZGVmaW5lZChSQzRfSU5UKQorLyogdXNpbmcgaW50IHR5cGVzIG1ha2UgdGhlIHN0cnVjdHVyZSBsYXJnZXIgYnV0IG1ha2UgdGhlIGNvZGUgZmFzdGVyCisgKiBvbiBtb3N0IGJveGVzIEkgaGF2ZSB0ZXN0ZWQgLSB1cCB0byAlMjAgZmFzdGVyLiAqLworLyoKKyAqIEkgZG9uJ3Qga25vdyB3aGF0IGRvZXMgIm1vc3QiIG1lYW4sIGJ1dCBkZWNsYXJpbmcgImludCIgaXMgYSBtdXN0IG9uOgorICogLSBJbnRlbCBQNiBiZWNhdXNlIHBhcnRpYWwgcmVnaXN0ZXIgc3RhbGxzIGFyZSB2ZXJ5IGV4cGVuc2l2ZTsKKyAqIC0gZWxkZXIgQWxwaGEgYmVjYXVzZSBpdCBsYWNrcyBieXRlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zOworICovCisjZGVmaW5lIFJDNF9JTlQgdW5zaWduZWQgY2hhcgorI2VuZGlmCisjaWYgIWRlZmluZWQoUkM0X0NIVU5LKQorLyoKKyAqIFRoaXMgZW5hYmxlcyBjb2RlIGhhbmRsaW5nIGRhdGEgYWxpZ25lZCBhdCBuYXR1cmFsIENQVSB3b3JkCisgKiBib3VuZGFyeS4gU2VlIGNyeXB0by9yYzQvcmM0X2VuYy5jIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgKi8KKyNkZWZpbmUgUkM0X0NIVU5LIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChIRUFERVJfTkVXX0RFU19IKSB8fCBkZWZpbmVkKEhFQURFUl9ERVNfSCkpICYmICFkZWZpbmVkKERFU19MT05HKQorLyogSWYgdGhpcyBpcyBzZXQgdG8gJ3Vuc2lnbmVkIGludCcgb24gYSBERUMgQWxwaGEsIHRoaXMgZ2l2ZXMgYWJvdXQgYQorICogJTIwIHNwZWVkIHVwIChsb25ncyBhcmUgOCBieXRlcywgaW50J3MgYXJlIDQpLiAqLworI2lmbmRlZiBERVNfTE9ORworI2RlZmluZSBERVNfTE9ORyB1bnNpZ25lZCBpbnQKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9CTl9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0JOX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfQk5fSAorI2RlZmluZSBCTl9MTE9ORworCisvKiBTaG91bGQgd2UgZGVmaW5lIEJOX0RJVjJXIGhlcmU/ICovCisKKy8qIE9ubHkgb25lIGZvciB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBkZWZpbmVkICovCisjdW5kZWYgU0lYVFlfRk9VUl9CSVRfTE9ORworI3VuZGVmIFNJWFRZX0ZPVVJfQklUCisjZGVmaW5lIFRISVJUWV9UV09fQklUCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDNF9MT0NMX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfUkM0X0xPQ0xfSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9SQzRfTE9DTF9ICisvKiBpZiB0aGlzIGlzIGRlZmluZWQgZGF0YVtpXSBpcyB1c2VkIGluc3RlYWQgb2YgKmRhdGEsIHRoaXMgaXMgYSAlMjAKKyAqIHNwZWVkdXAgb24geDg2ICovCisjdW5kZWYgUkM0X0lOREVYCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX0JGX0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9CRl9MT0NMX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfQkZfTE9DTF9ICisjZGVmaW5lIEJGX1BUUgorI2VuZGlmIC8qIEhFQURFUl9CRl9MT0NMX0ggKi8KKworI2lmIGRlZmluZWQoSEVBREVSX0RFU19MT0NMX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfREVTX0xPQ0xfSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9ERVNfTE9DTF9ICisjaWZuZGVmIERFU19ERUZBVUxUX09QVElPTlMKKy8qIHRoZSBmb2xsb3dpbmcgaXMgdHdlYWtlZCBmcm9tIGEgY29uZmlnIHNjcmlwdCwgdGhhdCBpcyB3aHkgaXQgaXMgYQorICogcHJvdGVjdGVkIHVuZGVmL2RlZmluZSAqLworI2lmbmRlZiBERVNfUFRSCisjdW5kZWYgREVTX1BUUgorI2VuZGlmCisKKy8qIFRoaXMgaGVscHMgQyBjb21waWxlciBnZW5lcmF0ZSB0aGUgY29ycmVjdCBjb2RlIGZvciBtdWx0aXBsZSBmdW5jdGlvbmFsCisgKiB1bml0cy4gIEl0IHJlZHVjZXMgcmVnaXN0ZXIgZGVwZW5kYW5jaWVzIGF0IHRoZSBleHBlbnNlIG9mIDIgbW9yZQorICogcmVnaXN0ZXJzICovCisjaWZuZGVmIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMQorI2VuZGlmCisKKyNpZm5kZWYgREVTX1JJU0MyCisjdW5kZWYgREVTX1JJU0MyCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVTX1JJU0MxKSAmJiBkZWZpbmVkKERFU19SSVNDMikKK1lPVSBTSE9VTEQgTk9UIEhBVkUgQk9USCBERVNfUklTQzEgQU5EIERFU19SSVNDMiBERUZJTkVEISEhISEKKyNlbmRpZgorCisvKiBVbnJvbGwgdGhlIGlubmVyIGxvb3AsIHRoaXMgc29tZXRpbWVzIGhlbHBzLCBzb21ldGltZXMgaGluZGVycy4KKyAqIFZlcnkgbXVjeSBDUFUgZGVwZW5kYW50ICovCisjaWZuZGVmIERFU19VTlJPTEwKKyNkZWZpbmUgREVTX1VOUk9MTAorI2VuZGlmCisKKy8qIFRoZXNlIGRlZmF1bHQgdmFsdWVzIHdlcmUgc3VwcGxpZWQgYnkKKyAqIFBldGVyIEd1dG1hbiA8cGd1dDAwMUBjcy5hdWNrbGFuZC5hYy5uej4KKyAqIFRoZXkgYXJlIG9ubHkgdXNlZCBpZiBub3RoaW5nIGVsc2UgaGFzIGJlZW4gZGVmaW5lZCAqLworI2lmICFkZWZpbmVkKERFU19QVFIpICYmICFkZWZpbmVkKERFU19SSVNDMSkgJiYgIWRlZmluZWQoREVTX1JJU0MyKSAmJiAhZGVmaW5lZChERVNfVU5ST0xMKQorLyogU3BlY2lhbCBkZWZpbmVzIHdoaWNoIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2RlIGlzIGJ1aWx0IGRlcGVuZGluZyBvbiB0aGUKKyAgIENQVSBhbmQgT1MuICBGb3IgU0dJIG1hY2hpbmVzIHlvdSBjYW4gdXNlIF9NSVBTX1NaTE9ORyAoMzIgb3IgNjQpIHRvIGZpbmQKKyAgIGV2ZW4gbmV3ZXIgTUlQUyBDUFUncywgYnV0IGF0IHRoZSBtb21lbnQgb25lIHNpemUgZml0cyBhbGwgZm9yCisgICBvcHRpbWl6YXRpb24gb3B0aW9ucy4gIE9sZGVyIFNwYXJjJ3Mgd29yayBiZXR0ZXIgd2l0aCBvbmx5IFVOUk9MTCwgYnV0CisgICB0aGVyZSdzIG5vIHdheSB0byB0ZWxsIGF0IGNvbXBpbGUgdGltZSB3aGF0IGl0IGlzIHlvdSdyZSBydW5uaW5nIG9uICovCisgCisjaWYgZGVmaW5lZCggc3VuICkJCS8qIE5ld2VyIFNwYXJjJ3MgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MxCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX191bHRyaXggKQkvKiBPbGRlciBNSVBTICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMgorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoIF9fb3NmMV9fICkJLyogQWxwaGEgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MyCisjZWxpZiBkZWZpbmVkICggX0FJWCApCQkvKiBSUzYwMDAgKi8KKyAgLyogVW5rbm93biAqLworI2VsaWYgZGVmaW5lZCggX19ocHV4ICkJCS8qIEhQLVBBICovCisgIC8qIFVua25vd24gKi8KKyNlbGlmIGRlZmluZWQoIF9fYXV4ICkJCS8qIDY4SyAqLworICAvKiBVbmtub3duICovCisjZWxpZiBkZWZpbmVkKCBfX2RndXggKQkJLyogODhLIChidXQgUDYgaW4gbGF0ZXN0IGJveGVzKSAqLworIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoIF9fc2dpICkJCS8qIE5ld2VyIE1JUFMgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MyCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQkvKiB4ODYgYm94ZXMsIHNob3VsZCBiZSBnY2MgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MxCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VuZGlmIC8qIFN5c3RlbXMtc3BlY2lmaWMgc3BlZWQgZGVmaW5lcyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBERVNfREVGQVVMVF9PUFRJT05TICovCisjZW5kaWYgLyogSEVBREVSX0RFU19MT0NMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NvbmZpZy9rOC9vcGVuc3NsL29wZW5zc2xjb25mLmggYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jb25maWcvazgvb3BlbnNzbC9vcGVuc3NsY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jb25maWcvazgvb3BlbnNzbC9vcGVuc3NsY29uZi5oCkBAIC0wLDAgKzEsMjkxIEBACisvKiBvcGVuc3NsY29uZi5oICovCisvKiBXQVJOSU5HOiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIG9wZW5zc2xjb25mLmguaW4gYnkgQ29uZmlndXJlLiAqLworCisvKiBPcGVuU1NMIHdhcyBjb25maWd1cmVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOiAqLworI2lmbmRlZiBPUEVOU1NMX0RPSU5HX01BS0VERVBFTkQKKworCisjaWZuZGVmIE9QRU5TU0xfTk9fQVNNCisjIGRlZmluZSBPUEVOU1NMX05PX0FTTQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ0FTVAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FQSUVORworIyBkZWZpbmUgT1BFTlNTTF9OT19DQVBJRU5HCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ01TCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ19OSVNUUF82NF9HQ0NfMTI4CisjIGRlZmluZSBPUEVOU1NMX05PX0VDX05JU1RQXzY0X0dDQ18xMjgKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0ZJUFMKKyMgZGVmaW5lIE9QRU5TU0xfTk9fRklQUworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fR01QCisjIGRlZmluZSBPUEVOU1NMX05PX0dNUAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorIyBkZWZpbmUgT1BFTlNTTF9OT19JREVBCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorIyBkZWZpbmUgT1BFTlNTTF9OT19KUEFLRQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorIyBkZWZpbmUgT1BFTlNTTF9OT19LUkI1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisjIGRlZmluZSBPUEVOU1NMX05PX01EQzIKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNQorIyBkZWZpbmUgT1BFTlNTTF9OT19SQzUKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JGQzM3NzkKKyMgZGVmaW5lIE9QRU5TU0xfTk9fUkZDMzc3OQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0NUUAorIyBkZWZpbmUgT1BFTlNTTF9OT19TQ1RQCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisjIGRlZmluZSBPUEVOU1NMX05PX1NFRUQKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTAKKyMgZGVmaW5lIE9QRU5TU0xfTk9fU0hBMAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fV0hJUkxQT09MCisjIGRlZmluZSBPUEVOU1NMX05PX1dISVJMUE9PTAorI2VuZGlmCisKKyNlbmRpZiAvKiBPUEVOU1NMX0RPSU5HX01BS0VERVBFTkQgKi8KKworI2lmbmRlZiBPUEVOU1NMX1RIUkVBRFMKKyMgZGVmaW5lIE9QRU5TU0xfVEhSRUFEUworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFlOQU1JQ19FTkdJTkUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fRFlOQU1JQ19FTkdJTkUKKyNlbmRpZgorCisvKiBUaGUgT1BFTlNTTF9OT18qIG1hY3JvcyBhcmUgYWxzbyBkZWZpbmVkIGFzIE5PXyogaWYgdGhlIGFwcGxpY2F0aW9uCisgICBhc2tzIGZvciBpdC4gIFRoaXMgaXMgYSB0cmFuc2llbnQgZmVhdHVyZSB0aGF0IGlzIHByb3ZpZGVkIGZvciB0aG9zZQorICAgd2hvIGhhdmVuJ3QgaGFkIHRoZSB0aW1lIHRvIGRvIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGluIHRoZWlyCisgICBhcHBsaWNhdGlvbnMuICAqLworI2lmZGVmIE9QRU5TU0xfQUxHT1JJVEhNX0RFRklORVMKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0NBTUVMTElBKSAmJiAhZGVmaW5lZChOT19DQU1FTExJQSkKKyMgIGRlZmluZSBOT19DQU1FTExJQQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fQ0FQSUVORykgJiYgIWRlZmluZWQoTk9fQ0FQSUVORykKKyMgIGRlZmluZSBOT19DQVBJRU5HCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19DTVMpICYmICFkZWZpbmVkKE5PX0NNUykKKyMgIGRlZmluZSBOT19DTVMKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0ZJUFMpICYmICFkZWZpbmVkKE5PX0ZJUFMpCisjICBkZWZpbmUgTk9fRklQUworIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fR01QKSAmJiAhZGVmaW5lZChOT19HTVApCisjICBkZWZpbmUgTk9fR01QCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19JREVBKSAmJiAhZGVmaW5lZChOT19JREVBKQorIyAgZGVmaW5lIE5PX0lERUEKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0pQQUtFKSAmJiAhZGVmaW5lZChOT19KUEFLRSkKKyMgIGRlZmluZSBOT19KUEFLRQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fS1JCNSkgJiYgIWRlZmluZWQoTk9fS1JCNSkKKyMgIGRlZmluZSBOT19LUkI1CisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19NREMyKSAmJiAhZGVmaW5lZChOT19NREMyKQorIyAgZGVmaW5lIE5PX01EQzIKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1JDNSkgJiYgIWRlZmluZWQoTk9fUkM1KQorIyAgZGVmaW5lIE5PX1JDNQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fUkZDMzc3OSkgJiYgIWRlZmluZWQoTk9fUkZDMzc3OSkKKyMgIGRlZmluZSBOT19SRkMzNzc5CisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19TRUVEKSAmJiAhZGVmaW5lZChOT19TRUVEKQorIyAgZGVmaW5lIE5PX1NFRUQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBjcnlwdG8vb3BlbnNzbGNvbmYuaC5pbiAqLworCisjaWZkZWYgT1BFTlNTTF9ET0lOR19NQUtFREVQRU5ECisKKy8qIEluY2x1ZGUgYW55IHN5bWJvbHMgaGVyZSB0aGF0IGhhdmUgdG8gYmUgZXhwbGljaXRseSBzZXQgdG8gZW5hYmxlIGEgZmVhdHVyZQorICogdGhhdCBzaG91bGQgYmUgdmlzaWJsZSB0byBtYWtlZGVwZW5kLgorICoKKyAqIFtPdXIgIm1ha2UgZGVwZW5kIiBkb2Vzbid0IGFjdHVhbGx5IGxvb2sgYXQgdGhpcywgd2UgdXNlIGFjdHVhbCBidWlsZCBzZXR0aW5ncworICogaW5zdGVhZDsgd2Ugd2FudCB0byBtYWtlIGl0IGVhc3kgdG8gcmVtb3ZlIHN1YmRpcmVjdG9yaWVzIHdpdGggZGlzYWJsZWQgYWxnb3JpdGhtcy5dCisgKi8KKworI2lmbmRlZiBPUEVOU1NMX0ZJUFMKKyNkZWZpbmUgT1BFTlNTTF9GSVBTCisjZW5kaWYKKworI2VuZGlmCisKKy8qIEdlbmVyYXRlIDgwMzg2IGNvZGU/ICovCisjdW5kZWYgSTM4Nl9PTkxZCisKKyNpZiAhKGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKF9fVk1TKSkgLyogVk1TIHVzZXMgbG9naWNhbCBuYW1lcyBpbnN0ZWFkICovCisjaWYgZGVmaW5lZChIRUFERVJfQ1JZUFRMSUJfSCkgJiYgIWRlZmluZWQoT1BFTlNTTERJUikKKyNkZWZpbmUgRU5HSU5FU0RJUiAiL3Vzci9sb2NhbC9zc2wvbGliL2VuZ2luZXMiCisjZGVmaW5lIE9QRU5TU0xESVIgIi91c3IvbG9jYWwvc3NsIgorI2VuZGlmCisjZW5kaWYKKworI3VuZGVmIE9QRU5TU0xfVU5JU1RECisjZGVmaW5lIE9QRU5TU0xfVU5JU1REIDx1bmlzdGQuaD4KKyNpZiAhZGVmaW5lZChTV0lHKQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyN1bmRlZiBPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04KKworI2lmIGRlZmluZWQoSEVBREVSX0lERUFfSCkgJiYgIWRlZmluZWQoSURFQV9JTlQpCisjZGVmaW5lIElERUFfSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9NRDJfSCkgJiYgIWRlZmluZWQoTUQyX0lOVCkKKyNkZWZpbmUgTUQyX0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfUkMyX0gpICYmICFkZWZpbmVkKFJDMl9JTlQpCisvKiBJIG5lZWQgdG8gcHV0IGluIGEgbW9kIGZvciB0aGUgYWxwaGEgLSBlYXkgKi8KKyNkZWZpbmUgUkMyX0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfUkM0X0gpCisjaWYgIWRlZmluZWQoUkM0X0lOVCkKKy8qIHVzaW5nIGludCB0eXBlcyBtYWtlIHRoZSBzdHJ1Y3R1cmUgbGFyZ2VyIGJ1dCBtYWtlIHRoZSBjb2RlIGZhc3RlcgorICogb24gbW9zdCBib3hlcyBJIGhhdmUgdGVzdGVkIC0gdXAgdG8gJTIwIGZhc3Rlci4gKi8KKy8qCisgKiBJIGRvbid0IGtub3cgd2hhdCBkb2VzICJtb3N0IiBtZWFuLCBidXQgZGVjbGFyaW5nICJpbnQiIGlzIGEgbXVzdCBvbjoKKyAqIC0gSW50ZWwgUDYgYmVjYXVzZSBwYXJ0aWFsIHJlZ2lzdGVyIHN0YWxscyBhcmUgdmVyeSBleHBlbnNpdmU7CisgKiAtIGVsZGVyIEFscGhhIGJlY2F1c2UgaXQgbGFja3MgYnl0ZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uczsKKyAqLworI2RlZmluZSBSQzRfSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisjaWYgIWRlZmluZWQoUkM0X0NIVU5LKQorLyoKKyAqIFRoaXMgZW5hYmxlcyBjb2RlIGhhbmRsaW5nIGRhdGEgYWxpZ25lZCBhdCBuYXR1cmFsIENQVSB3b3JkCisgKiBib3VuZGFyeS4gU2VlIGNyeXB0by9yYzQvcmM0X2VuYy5jIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgKi8KKyNkZWZpbmUgUkM0X0NIVU5LIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChIRUFERVJfTkVXX0RFU19IKSB8fCBkZWZpbmVkKEhFQURFUl9ERVNfSCkpICYmICFkZWZpbmVkKERFU19MT05HKQorLyogSWYgdGhpcyBpcyBzZXQgdG8gJ3Vuc2lnbmVkIGludCcgb24gYSBERUMgQWxwaGEsIHRoaXMgZ2l2ZXMgYWJvdXQgYQorICogJTIwIHNwZWVkIHVwIChsb25ncyBhcmUgOCBieXRlcywgaW50J3MgYXJlIDQpLiAqLworI2lmbmRlZiBERVNfTE9ORworI2RlZmluZSBERVNfTE9ORyB1bnNpZ25lZCBpbnQKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9CTl9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0JOX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfQk5fSAorI3VuZGVmIEJOX0xMT05HCisKKy8qIFNob3VsZCB3ZSBkZWZpbmUgQk5fRElWMlcgaGVyZT8gKi8KKworLyogT25seSBvbmUgZm9yIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGRlZmluZWQgKi8KKy8qIFRoZSBwcmltZSBudW1iZXIgZ2VuZXJhdGlvbiBzdHVmZiBtYXkgbm90IHdvcmsgd2hlbgorICogRUlHSFRfQklUIGJ1dCBJIGRvbid0IGNhcmUgc2luY2UgSSd2ZSBvbmx5IHVzZWQgdGhpcyBtb2RlCisgKiBmb3IgZGVidWdpbmcgdGhlIGJpZ251bSBsaWJyYXJpZXMgKi8KKyNkZWZpbmUgU0lYVFlfRk9VUl9CSVRfTE9ORworI3VuZGVmIFNJWFRZX0ZPVVJfQklUCisjdW5kZWYgVEhJUlRZX1RXT19CSVQKKyN1bmRlZiBTSVhURUVOX0JJVAorI3VuZGVmIEVJR0hUX0JJVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9SQzRfTE9DTF9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX1JDNF9MT0NMX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfUkM0X0xPQ0xfSAorLyogaWYgdGhpcyBpcyBkZWZpbmVkIGRhdGFbaV0gaXMgdXNlZCBpbnN0ZWFkIG9mICpkYXRhLCB0aGlzIGlzIGEgJTIwCisgKiBzcGVlZHVwIG9uIHg4NiAqLworI3VuZGVmIFJDNF9JTkRFWAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9CRl9MT0NMX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfQkZfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX0JGX0xPQ0xfSAorI3VuZGVmIEJGX1BUUgorI2VuZGlmIC8qIEhFQURFUl9CRl9MT0NMX0ggKi8KKworI2lmIGRlZmluZWQoSEVBREVSX0RFU19MT0NMX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfREVTX0xPQ0xfSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9ERVNfTE9DTF9ICisjaWZuZGVmIERFU19ERUZBVUxUX09QVElPTlMKKy8qIHRoZSBmb2xsb3dpbmcgaXMgdHdlYWtlZCBmcm9tIGEgY29uZmlnIHNjcmlwdCwgdGhhdCBpcyB3aHkgaXQgaXMgYQorICogcHJvdGVjdGVkIHVuZGVmL2RlZmluZSAqLworI2lmbmRlZiBERVNfUFRSCisjdW5kZWYgREVTX1BUUgorI2VuZGlmCisKKy8qIFRoaXMgaGVscHMgQyBjb21waWxlciBnZW5lcmF0ZSB0aGUgY29ycmVjdCBjb2RlIGZvciBtdWx0aXBsZSBmdW5jdGlvbmFsCisgKiB1bml0cy4gIEl0IHJlZHVjZXMgcmVnaXN0ZXIgZGVwZW5kYW5jaWVzIGF0IHRoZSBleHBlbnNlIG9mIDIgbW9yZQorICogcmVnaXN0ZXJzICovCisjaWZuZGVmIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMQorI2VuZGlmCisKKyNpZm5kZWYgREVTX1JJU0MyCisjdW5kZWYgREVTX1JJU0MyCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVTX1JJU0MxKSAmJiBkZWZpbmVkKERFU19SSVNDMikKK1lPVSBTSE9VTEQgTk9UIEhBVkUgQk9USCBERVNfUklTQzEgQU5EIERFU19SSVNDMiBERUZJTkVEISEhISEKKyNlbmRpZgorCisvKiBVbnJvbGwgdGhlIGlubmVyIGxvb3AsIHRoaXMgc29tZXRpbWVzIGhlbHBzLCBzb21ldGltZXMgaGluZGVycy4KKyAqIFZlcnkgbXVjeSBDUFUgZGVwZW5kYW50ICovCisjaWZuZGVmIERFU19VTlJPTEwKKyNkZWZpbmUgREVTX1VOUk9MTAorI2VuZGlmCisKKy8qIFRoZXNlIGRlZmF1bHQgdmFsdWVzIHdlcmUgc3VwcGxpZWQgYnkKKyAqIFBldGVyIEd1dG1hbiA8cGd1dDAwMUBjcy5hdWNrbGFuZC5hYy5uej4KKyAqIFRoZXkgYXJlIG9ubHkgdXNlZCBpZiBub3RoaW5nIGVsc2UgaGFzIGJlZW4gZGVmaW5lZCAqLworI2lmICFkZWZpbmVkKERFU19QVFIpICYmICFkZWZpbmVkKERFU19SSVNDMSkgJiYgIWRlZmluZWQoREVTX1JJU0MyKSAmJiAhZGVmaW5lZChERVNfVU5ST0xMKQorLyogU3BlY2lhbCBkZWZpbmVzIHdoaWNoIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2RlIGlzIGJ1aWx0IGRlcGVuZGluZyBvbiB0aGUKKyAgIENQVSBhbmQgT1MuICBGb3IgU0dJIG1hY2hpbmVzIHlvdSBjYW4gdXNlIF9NSVBTX1NaTE9ORyAoMzIgb3IgNjQpIHRvIGZpbmQKKyAgIGV2ZW4gbmV3ZXIgTUlQUyBDUFUncywgYnV0IGF0IHRoZSBtb21lbnQgb25lIHNpemUgZml0cyBhbGwgZm9yCisgICBvcHRpbWl6YXRpb24gb3B0aW9ucy4gIE9sZGVyIFNwYXJjJ3Mgd29yayBiZXR0ZXIgd2l0aCBvbmx5IFVOUk9MTCwgYnV0CisgICB0aGVyZSdzIG5vIHdheSB0byB0ZWxsIGF0IGNvbXBpbGUgdGltZSB3aGF0IGl0IGlzIHlvdSdyZSBydW5uaW5nIG9uICovCisgCisjaWYgZGVmaW5lZCggc3VuICkJCS8qIE5ld2VyIFNwYXJjJ3MgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MxCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX191bHRyaXggKQkvKiBPbGRlciBNSVBTICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMgorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoIF9fb3NmMV9fICkJLyogQWxwaGEgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MyCisjZWxpZiBkZWZpbmVkICggX0FJWCApCQkvKiBSUzYwMDAgKi8KKyAgLyogVW5rbm93biAqLworI2VsaWYgZGVmaW5lZCggX19ocHV4ICkJCS8qIEhQLVBBICovCisgIC8qIFVua25vd24gKi8KKyNlbGlmIGRlZmluZWQoIF9fYXV4ICkJCS8qIDY4SyAqLworICAvKiBVbmtub3duICovCisjZWxpZiBkZWZpbmVkKCBfX2RndXggKQkJLyogODhLIChidXQgUDYgaW4gbGF0ZXN0IGJveGVzKSAqLworIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoIF9fc2dpICkJCS8qIE5ld2VyIE1JUFMgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MyCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQkvKiB4ODYgYm94ZXMsIHNob3VsZCBiZSBnY2MgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MxCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VuZGlmIC8qIFN5c3RlbXMtc3BlY2lmaWMgc3BlZWQgZGVmaW5lcyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBERVNfREVGQVVMVF9PUFRJT05TICovCisjZW5kaWYgLyogSEVBREVSX0RFU19MT0NMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NvbmZpZy9sYnNoZWxsL29wZW5zc2wvb3BlbnNzbGNvbmYuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NvbmZpZy9sYnNoZWxsL29wZW5zc2wvb3BlbnNzbGNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2RkYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY29uZmlnL2xic2hlbGwvb3BlbnNzbC9vcGVuc3NsY29uZi5oCkBAIC0wLDAgKzEsMzY2IEBACisvKiBvcGVuc3NsY29uZi5oICovCisvKiBXQVJOSU5HOiBFZGl0ZWQgYnkgaGFuZCwgYmFzZWQgb24gcGlpaSBjb25maWcuIE1lYW50IGZvciBhbGwgbGJzaGVsbCBwbGF0Zm9ybXMuIGlmZGVmIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBvcHRpb25zLiAqLworI2RlZmluZSBPUEVOU1NMX1NZU19TSEVMTAorCisjaWZuZGVmIE9QRU5TU0xfTk9fUE9TSVhfSU8KKyMgZGVmaW5lIE9QRU5TU0xfTk9fUE9TSVhfSU8KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisjIGRlZmluZSBPUEVOU1NMX05PX0ZQX0FQSQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU08KKyMgZGVmaW5lIE9QRU5TU0xfTk9fRFNPCisjZW5kaWYKKworLyogT3BlblNTTCB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogKi8KKyNpZm5kZWYgT1BFTlNTTF9ET0lOR19NQUtFREVQRU5ECisKKworI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisjIGRlZmluZSBPUEVOU1NMX05PX0NBTUVMTElBCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVNUCisjIGRlZmluZSBPUEVOU1NMX05PX0NBU1QKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBUElFTkcKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ0FQSUVORworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ01TCisjIGRlZmluZSBPUEVOU1NMX05PX0NNUworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNfTklTVFBfNjRfR0NDXzEyOAorIyBkZWZpbmUgT1BFTlNTTF9OT19FQ19OSVNUUF82NF9HQ0NfMTI4CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19GSVBTCisjIGRlZmluZSBPUEVOU1NMX05PX0ZJUFMKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0dNUAorIyBkZWZpbmUgT1BFTlNTTF9OT19HTVAKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKyMgZGVmaW5lIE9QRU5TU0xfTk9fSURFQQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSlBBS0UKKyMgZGVmaW5lIE9QRU5TU0xfTk9fSlBBS0UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fS1JCNQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTURDMgorIyBkZWZpbmUgT1BFTlNTTF9OT19NREMyCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fUkM1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisjIGRlZmluZSBPUEVOU1NMX05PX1JGQzM3NzkKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NDVFAKKyMgZGVmaW5lIE9QRU5TU0xfTk9fU0NUUAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorIyBkZWZpbmUgT1BFTlNTTF9OT19TRUVECisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEwCisjIGRlZmluZSBPUEVOU1NMX05PX1NIQTAKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1dISVJMUE9PTAorIyBkZWZpbmUgT1BFTlNTTF9OT19XSElSTFBPT0wKKyNlbmRpZgorCisjZW5kaWYgLyogT1BFTlNTTF9ET0lOR19NQUtFREVQRU5EICovCisKKyNpZm5kZWYgT1BFTlNTTF9USFJFQURTCisjIGRlZmluZSBPUEVOU1NMX1RIUkVBRFMKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FCisjIGRlZmluZSBPUEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FCisjZW5kaWYKKworLyogVGhlIE9QRU5TU0xfTk9fKiBtYWNyb3MgYXJlIGFsc28gZGVmaW5lZCBhcyBOT18qIGlmIHRoZSBhcHBsaWNhdGlvbgorICAgYXNrcyBmb3IgaXQuICBUaGlzIGlzIGEgdHJhbnNpZW50IGZlYXR1cmUgdGhhdCBpcyBwcm92aWRlZCBmb3IgdGhvc2UKKyAgIHdobyBoYXZlbid0IGhhZCB0aGUgdGltZSB0byBkbyB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBpbiB0aGVpcgorICAgYXBwbGljYXRpb25zLiAgKi8KKyNpZmRlZiBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19DQU1FTExJQSkgJiYgIWRlZmluZWQoTk9fQ0FNRUxMSUEpCisjICBkZWZpbmUgTk9fQ0FNRUxMSUEKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0NBUElFTkcpICYmICFkZWZpbmVkKE5PX0NBUElFTkcpCisjICBkZWZpbmUgTk9fQ0FQSUVORworIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fQ01TKSAmJiAhZGVmaW5lZChOT19DTVMpCisjICBkZWZpbmUgTk9fQ01TCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19GSVBTKSAmJiAhZGVmaW5lZChOT19GSVBTKQorIyAgZGVmaW5lIE5PX0ZJUFMKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0dNUCkgJiYgIWRlZmluZWQoTk9fR01QKQorIyAgZGVmaW5lIE5PX0dNUAorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fSURFQSkgJiYgIWRlZmluZWQoTk9fSURFQSkKKyMgIGRlZmluZSBOT19JREVBCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19KUEFLRSkgJiYgIWRlZmluZWQoTk9fSlBBS0UpCisjICBkZWZpbmUgTk9fSlBBS0UKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0tSQjUpICYmICFkZWZpbmVkKE5PX0tSQjUpCisjICBkZWZpbmUgTk9fS1JCNQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fTURDMikgJiYgIWRlZmluZWQoTk9fTURDMikKKyMgIGRlZmluZSBOT19NREMyCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19SQzUpICYmICFkZWZpbmVkKE5PX1JDNSkKKyMgIGRlZmluZSBOT19SQzUKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1JGQzM3NzkpICYmICFkZWZpbmVkKE5PX1JGQzM3NzkpCisjICBkZWZpbmUgTk9fUkZDMzc3OQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fU0VFRCkgJiYgIWRlZmluZWQoTk9fU0VFRCkKKyMgIGRlZmluZSBOT19TRUVECisjIGVuZGlmCisjZW5kaWYKKworLyogY3J5cHRvL29wZW5zc2xjb25mLmguaW4gKi8KKworI2lmZGVmIE9QRU5TU0xfRE9JTkdfTUFLRURFUEVORAorCisvKiBJbmNsdWRlIGFueSBzeW1ib2xzIGhlcmUgdGhhdCBoYXZlIHRvIGJlIGV4cGxpY2l0bHkgc2V0IHRvIGVuYWJsZSBhIGZlYXR1cmUKKyAqIHRoYXQgc2hvdWxkIGJlIHZpc2libGUgdG8gbWFrZWRlcGVuZC4KKyAqCisgKiBbT3VyICJtYWtlIGRlcGVuZCIgZG9lc24ndCBhY3R1YWxseSBsb29rIGF0IHRoaXMsIHdlIHVzZSBhY3R1YWwgYnVpbGQgc2V0dGluZ3MKKyAqIGluc3RlYWQ7IHdlIHdhbnQgdG8gbWFrZSBpdCBlYXN5IHRvIHJlbW92ZSBzdWJkaXJlY3RvcmllcyB3aXRoIGRpc2FibGVkIGFsZ29yaXRobXMuXQorICovCisKKyNpZm5kZWYgT1BFTlNTTF9GSVBTCisjZGVmaW5lIE9QRU5TU0xfRklQUworI2VuZGlmCisKKyNlbmRpZgorCisvKiBHZW5lcmF0ZSA4MDM4NiBjb2RlPyAqLworI3VuZGVmIEkzODZfT05MWQorCisjaWYgIShkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChfX1ZNUykpIC8qIFZNUyB1c2VzIGxvZ2ljYWwgbmFtZXMgaW5zdGVhZCAqLworI2lmIGRlZmluZWQoSEVBREVSX0NSWVBUTElCX0gpICYmICFkZWZpbmVkKE9QRU5TU0xESVIpCisjZGVmaW5lIEVOR0lORVNESVIgIi91c3IvbG9jYWwvc3NsL2xpYi9lbmdpbmVzIgorI2RlZmluZSBPUEVOU1NMRElSICIvdXNyL2xvY2FsL3NzbCIKKyNlbmRpZgorI2VuZGlmCisKKyN1bmRlZiBPUEVOU1NMX1VOSVNURAorI2RlZmluZSBPUEVOU1NMX1VOSVNURCA8dW5pc3RkLmg+CisjaWYgIWRlZmluZWQoU1dJRykKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjdW5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKyNpZiBkZWZpbmVkKEhFQURFUl9JREVBX0gpICYmICFkZWZpbmVkKElERUFfSU5UKQorI2RlZmluZSBJREVBX0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfTUQyX0gpICYmICFkZWZpbmVkKE1EMl9JTlQpCisjZGVmaW5lIE1EMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDMl9IKSAmJiAhZGVmaW5lZChSQzJfSU5UKQorLyogSSBuZWVkIHRvIHB1dCBpbiBhIG1vZCBmb3IgdGhlIGFscGhhIC0gZWF5ICovCisjZGVmaW5lIFJDMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDNF9IKQorI2lmICFkZWZpbmVkKFJDNF9JTlQpCisvKiB1c2luZyBpbnQgdHlwZXMgbWFrZSB0aGUgc3RydWN0dXJlIGxhcmdlciBidXQgbWFrZSB0aGUgY29kZSBmYXN0ZXIKKyAqIG9uIG1vc3QgYm94ZXMgSSBoYXZlIHRlc3RlZCAtIHVwIHRvICUyMCBmYXN0ZXIuICovCisvKgorICogSSBkb24ndCBrbm93IHdoYXQgZG9lcyAibW9zdCIgbWVhbiwgYnV0IGRlY2xhcmluZyAiaW50IiBpcyBhIG11c3Qgb246CisgKiAtIEludGVsIFA2IGJlY2F1c2UgcGFydGlhbCByZWdpc3RlciBzdGFsbHMgYXJlIHZlcnkgZXhwZW5zaXZlOworICogLSBlbGRlciBBbHBoYSBiZWNhdXNlIGl0IGxhY2tzIGJ5dGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnM7CisgKi8KKyNkZWZpbmUgUkM0X0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorI2lmICFkZWZpbmVkKFJDNF9DSFVOSykKKy8qCisgKiBUaGlzIGVuYWJsZXMgY29kZSBoYW5kbGluZyBkYXRhIGFsaWduZWQgYXQgbmF0dXJhbCBDUFUgd29yZAorICogYm91bmRhcnkuIFNlZSBjcnlwdG8vcmM0L3JjNF9lbmMuYyBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCisjZGVmaW5lIFJDNF9DSFVOSyB1bnNpZ25lZCBsb25nCisjZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoSEVBREVSX05FV19ERVNfSCkgfHwgZGVmaW5lZChIRUFERVJfREVTX0gpKSAmJiAhZGVmaW5lZChERVNfTE9ORykKKy8qIElmIHRoaXMgaXMgc2V0IHRvICd1bnNpZ25lZCBpbnQnIG9uIGEgREVDIEFscGhhLCB0aGlzIGdpdmVzIGFib3V0IGEKKyAqICUyMCBzcGVlZCB1cCAobG9uZ3MgYXJlIDggYnl0ZXMsIGludCdzIGFyZSA0KS4gKi8KKyNpZm5kZWYgREVTX0xPTkcKKyNkZWZpbmUgREVTX0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfQk5fSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9CTl9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX0JOX0gKKyNkZWZpbmUgQk5fTExPTkcKKworLyogU2hvdWxkIHdlIGRlZmluZSBCTl9ESVYyVyBoZXJlPyAqLworCisvKiBPbmx5IG9uZSBmb3IgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZGVmaW5lZCAqLworLyogVGhlIHByaW1lIG51bWJlciBnZW5lcmF0aW9uIHN0dWZmIG1heSBub3Qgd29yayB3aGVuCisgKiBFSUdIVF9CSVQgYnV0IEkgZG9uJ3QgY2FyZSBzaW5jZSBJJ3ZlIG9ubHkgdXNlZCB0aGlzIG1vZGUKKyAqIGZvciBkZWJ1Z2luZyB0aGUgYmlnbnVtIGxpYnJhcmllcyAqLworI3VuZGVmIFNJWFRZX0ZPVVJfQklUX0xPTkcKKyN1bmRlZiBTSVhUWV9GT1VSX0JJVAorI3VuZGVmIFRISVJUWV9UV09fQklUCisjdW5kZWYgU0lYVEVFTl9CSVQKKyN1bmRlZiBFSUdIVF9CSVQKKworI2lmIGRlZmluZWQoX194ODZfNjRfXykKKyN1bmRlZiBCTl9MTE9ORworI2RlZmluZSBTSVhUWV9GT1VSX0JJVF9MT05HCisjZWxzZQorI2RlZmluZSBUSElSVFlfVFdPX0JJVAorI2VuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfUkM0X0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9SQzRfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX1JDNF9MT0NMX0gKKy8qIGlmIHRoaXMgaXMgZGVmaW5lZCBkYXRhW2ldIGlzIHVzZWQgaW5zdGVhZCBvZiAqZGF0YSwgdGhpcyBpcyBhICUyMAorICogc3BlZWR1cCBvbiB4ODYgKi8KKyNkZWZpbmUgUkM0X0lOREVYCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX0JGX0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9CRl9MT0NMX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfQkZfTE9DTF9ICisjdW5kZWYgQkZfUFRSCisjZW5kaWYgLyogSEVBREVSX0JGX0xPQ0xfSCAqLworCisjaWYgZGVmaW5lZChIRUFERVJfREVTX0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9ERVNfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX0RFU19MT0NMX0gKKyNpZm5kZWYgREVTX0RFRkFVTFRfT1BUSU9OUworLyogdGhlIGZvbGxvd2luZyBpcyB0d2Vha2VkIGZyb20gYSBjb25maWcgc2NyaXB0LCB0aGF0IGlzIHdoeSBpdCBpcyBhCisgKiBwcm90ZWN0ZWQgdW5kZWYvZGVmaW5lICovCisjaWZuZGVmIERFU19QVFIKKyNkZWZpbmUgREVTX1BUUgorI2VuZGlmCisKKy8qIFRoaXMgaGVscHMgQyBjb21waWxlciBnZW5lcmF0ZSB0aGUgY29ycmVjdCBjb2RlIGZvciBtdWx0aXBsZSBmdW5jdGlvbmFsCisgKiB1bml0cy4gIEl0IHJlZHVjZXMgcmVnaXN0ZXIgZGVwZW5kYW5jaWVzIGF0IHRoZSBleHBlbnNlIG9mIDIgbW9yZQorICogcmVnaXN0ZXJzICovCisjaWZuZGVmIERFU19SSVNDMQorI2RlZmluZSBERVNfUklTQzEKKyNlbmRpZgorCisjaWZuZGVmIERFU19SSVNDMgorI3VuZGVmIERFU19SSVNDMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFU19SSVNDMSkgJiYgZGVmaW5lZChERVNfUklTQzIpCitZT1UgU0hPVUxEIE5PVCBIQVZFIEJPVEggREVTX1JJU0MxIEFORCBERVNfUklTQzIgREVGSU5FRCEhISEhCisjZW5kaWYKKworLyogVW5yb2xsIHRoZSBpbm5lciBsb29wLCB0aGlzIHNvbWV0aW1lcyBoZWxwcywgc29tZXRpbWVzIGhpbmRlcnMuCisgKiBWZXJ5IG11Y3kgQ1BVIGRlcGVuZGFudCAqLworI2lmbmRlZiBERVNfVU5ST0xMCisjZGVmaW5lIERFU19VTlJPTEwKKyNlbmRpZgorCisvKiBUaGVzZSBkZWZhdWx0IHZhbHVlcyB3ZXJlIHN1cHBsaWVkIGJ5CisgKiBQZXRlciBHdXRtYW4gPHBndXQwMDFAY3MuYXVja2xhbmQuYWMubno+CisgKiBUaGV5IGFyZSBvbmx5IHVzZWQgaWYgbm90aGluZyBlbHNlIGhhcyBiZWVuIGRlZmluZWQgKi8KKyNpZiAhZGVmaW5lZChERVNfUFRSKSAmJiAhZGVmaW5lZChERVNfUklTQzEpICYmICFkZWZpbmVkKERFU19SSVNDMikgJiYgIWRlZmluZWQoREVTX1VOUk9MTCkKKy8qIFNwZWNpYWwgZGVmaW5lcyB3aGljaCBjaGFuZ2UgdGhlIHdheSB0aGUgY29kZSBpcyBidWlsdCBkZXBlbmRpbmcgb24gdGhlCisgICBDUFUgYW5kIE9TLiAgRm9yIFNHSSBtYWNoaW5lcyB5b3UgY2FuIHVzZSBfTUlQU19TWkxPTkcgKDMyIG9yIDY0KSB0byBmaW5kCisgICBldmVuIG5ld2VyIE1JUFMgQ1BVJ3MsIGJ1dCBhdCB0aGUgbW9tZW50IG9uZSBzaXplIGZpdHMgYWxsIGZvcgorICAgb3B0aW1pemF0aW9uIG9wdGlvbnMuICBPbGRlciBTcGFyYydzIHdvcmsgYmV0dGVyIHdpdGggb25seSBVTlJPTEwsIGJ1dAorICAgdGhlcmUncyBubyB3YXkgdG8gdGVsbCBhdCBjb21waWxlIHRpbWUgd2hhdCBpdCBpcyB5b3UncmUgcnVubmluZyBvbiAqLworIAorI2lmIGRlZmluZWQoIHN1biApCQkvKiBOZXdlciBTcGFyYydzICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMQorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoIF9fdWx0cml4ICkJLyogT2xkZXIgTUlQUyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKCBfX29zZjFfXyApCS8qIEFscGhhICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMgorI2VsaWYgZGVmaW5lZCAoIF9BSVggKQkJLyogUlM2MDAwICovCisgIC8qIFVua25vd24gKi8KKyNlbGlmIGRlZmluZWQoIF9faHB1eCApCQkvKiBIUC1QQSAqLworICAvKiBVbmtub3duICovCisjZWxpZiBkZWZpbmVkKCBfX2F1eCApCQkvKiA2OEsgKi8KKyAgLyogVW5rbm93biAqLworI2VsaWYgZGVmaW5lZCggX19kZ3V4ICkJCS8qIDg4SyAoYnV0IFA2IGluIGxhdGVzdCBib3hlcykgKi8KKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKCBfX3NnaSApCQkvKiBOZXdlciBNSVBTICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMgorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykJLyogeDg2IGJveGVzLCBzaG91bGQgYmUgZ2NjICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMQorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbmRpZiAvKiBTeXN0ZW1zLXNwZWNpZmljIHNwZWVkIGRlZmluZXMgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogREVTX0RFRkFVTFRfT1BUSU9OUyAqLworI2VuZGlmIC8qIEhFQURFUl9ERVNfTE9DTF9IICovCisKKworI2lmbmRlZiBPUEVOU1NMX09QRU5TU0xfQ09ORklHX0xCU0hFTExfT1BFTlNTTF9PUEVOU1NMQ09ORl9ICisjZGVmaW5lIE9QRU5TU0xfT1BFTlNTTF9DT05GSUdfTEJTSEVMTF9PUEVOU1NMX09QRU5TU0xDT05GX0gKKworLy8gVHlwZXMgdGhhdCBuZWVkIHRvIGJlIHBvcnRlZC4KKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3RtIHN0cnVjdCB0bQorI2RlZmluZSBPUEVOU1NMX3BvcnRfdGltZV90IHRpbWVfdAorI2RlZmluZSBPUEVOU1NMX3BvcnRfdGltZXZhbCBzdHJ1Y3QgdGltZXZhbAorCisvLyBEZWZpbml0aW9ucyBmb3Igc3lzdGVtIGNhbGxzIHRoYXQgbWF5IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbi4KKyNkZWZpbmUgT1BFTlNTTF9wb3J0X2Fib3J0IGFib3J0CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9hc3NlcnQgYXNzZXJ0CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9hdG9pIGF0b2kKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X2ZyZWUgZnJlZQorLy8gZ2V0ZW52IGlzIG5vdCBzdXBwb3J0ZWQgYnkgQ29iYWx0LgorI2RlZmluZSBPUEVOU1NMX3BvcnRfZ2V0ZW52KHgpIE5VTEwKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X2lzYWxudW0gaXNhbG51bQorI2RlZmluZSBPUEVOU1NMX3BvcnRfaXNkaWdpdCBpc2RpZ2l0CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9pc3NwYWNlIGlzc3BhY2UKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X2lzdXBwZXIgaXN1cHBlcgorI2RlZmluZSBPUEVOU1NMX3BvcnRfaXN4ZGlnaXQgaXN4ZGlnaXQKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X21hbGxvYyBtYWxsb2MKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X21lbWNociBtZW1jaHIKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X21lbWNtcCBtZW1jbXAKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X21lbWNweSBtZW1jcHkKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X21lbW1vdmUgbWVtbW92ZQorI2RlZmluZSBPUEVOU1NMX3BvcnRfbWVtc2V0IG1lbXNldAorI2RlZmluZSBPUEVOU1NMX3BvcnRfcHJpbnRmIHByaW50ZgorI2RlZmluZSBPUEVOU1NMX3BvcnRfcHJpbnRmZXJyIHByaW50ZgorI2RlZmluZSBPUEVOU1NMX3BvcnRfcXNvcnQgcXNvcnQKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3JlYWxsb2MgcmVhbGxvYworI2RlZmluZSBPUEVOU1NMX3BvcnRfc3NjYW5mIHNzY2FuZgorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RyY2FzZWNtcCBzdHJjYXNlY21wCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJjYXQgc3RyY2F0CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJjaHIgc3RyY2hyCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJjbXAgc3RyY21wCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJjcHkgc3RyY3B5CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJkdXAgc3RyZHVwCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJlcnJvciBzdHJlcnJvcgorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RybGVuIHN0cmxlbgorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RybmNhc2VjbXAgc3RybmNhc2VjbXAKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3N0cm5jbXAgc3RybmNtcAorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RybmNweSBzdHJuY3B5CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJyY2hyIHN0cnJjaHIKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3N0cnRvdWwgc3RydG91bAorI2RlZmluZSBPUEVOU1NMX3BvcnRfdGltZSB0aW1lCisjZGVmaW5lIE9QRU5TU0xfcG9ydF90b2xvd2VyIHRvbG93ZXIKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3RvdXBwZXIgdG91cHBlcgorCisvLyBPUEVOU1NMIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGRlZmluZWQgZ2xvYmFsbHkuCisjZGVmaW5lIE9QRU5TU0xfc3RyY21wIE9QRU5TU0xfcG9ydF9zdHJjbXAKKworLy8gVmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBwb3J0ZWQuCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9lcnJubyBlcnJubworCisjZW5kaWYgIC8vIE9QRU5TU0xfT1BFTlNTTF9DT05GSUdfTEJTSEVMTF9PUEVOU1NMX09QRU5TU0xDT05GX0gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NvbmZpZy9waWlpL29wZW5zc2wvb3BlbnNzbGNvbmYuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NvbmZpZy9waWlpL29wZW5zc2wvb3BlbnNzbGNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ5M2JmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY29uZmlnL3BpaWkvb3BlbnNzbC9vcGVuc3NsY29uZi5oCkBAIC0wLDAgKzEsMzAyIEBACisvKiBvcGVuc3NsY29uZi5oICovCisvKiBXQVJOSU5HOiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIG9wZW5zc2xjb25mLmguaW4gYnkgQ29uZmlndXJlLiAqLworCisvKiBPcGVuU1NMIHdhcyBjb25maWd1cmVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOiAqLworI2lmbmRlZiBPUEVOU1NMX0RPSU5HX01BS0VERVBFTkQKKworCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ0FTVAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FQSUVORworIyBkZWZpbmUgT1BFTlNTTF9OT19DQVBJRU5HCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ01TCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ19OSVNUUF82NF9HQ0NfMTI4CisjIGRlZmluZSBPUEVOU1NMX05PX0VDX05JU1RQXzY0X0dDQ18xMjgKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0ZJUFMKKyMgZGVmaW5lIE9QRU5TU0xfTk9fRklQUworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fR01QCisjIGRlZmluZSBPUEVOU1NMX05PX0dNUAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorIyBkZWZpbmUgT1BFTlNTTF9OT19JREVBCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorIyBkZWZpbmUgT1BFTlNTTF9OT19KUEFLRQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorIyBkZWZpbmUgT1BFTlNTTF9OT19LUkI1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisjIGRlZmluZSBPUEVOU1NMX05PX01EQzIKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNQorIyBkZWZpbmUgT1BFTlNTTF9OT19SQzUKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JGQzM3NzkKKyMgZGVmaW5lIE9QRU5TU0xfTk9fUkZDMzc3OQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0NUUAorIyBkZWZpbmUgT1BFTlNTTF9OT19TQ1RQCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisjIGRlZmluZSBPUEVOU1NMX05PX1NFRUQKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTAKKyMgZGVmaW5lIE9QRU5TU0xfTk9fU0hBMAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fV0hJUkxQT09MCisjIGRlZmluZSBPUEVOU1NMX05PX1dISVJMUE9PTAorI2VuZGlmCisKKyNlbmRpZiAvKiBPUEVOU1NMX0RPSU5HX01BS0VERVBFTkQgKi8KKworI2lmbmRlZiBPUEVOU1NMX1RIUkVBRFMKKyMgZGVmaW5lIE9QRU5TU0xfVEhSRUFEUworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFlOQU1JQ19FTkdJTkUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fRFlOQU1JQ19FTkdJTkUKKyNlbmRpZgorCisvKiBVc2UgeDg2IGFzc2VtYmxlciBmdW5jdGlvbnMgLSB0YWtlbiBmcm9tIEFuZHJvaWQveDg2IGNvbmZpZyAqLworIyBkZWZpbmUgT1BFTlNTTF9CTl9BU01fR0YybQorIyBkZWZpbmUgT1BFTlNTTF9CTl9BU01fTU9OVAorIyBkZWZpbmUgT1BFTlNTTF9CTl9BU01fUEFSVF9XT1JEUworIyBkZWZpbmUgQUVTX0FTTQorIyBkZWZpbmUgR0hBU0hfQVNNCisjIGRlZmluZSBTSEExX0FTTQorIyBkZWZpbmUgU0hBMjU2X0FTTQorIyBkZWZpbmUgU0hBNTEyX0FTTQorIyBkZWZpbmUgTUQ1X0FTTQorIyBkZWZpbmUgREVTX1BUUgorIyBkZWZpbmUgREVTX1JJU0MxCisjIGRlZmluZSBERVNfVU5ST0xMCisKKy8qIFRoZSBPUEVOU1NMX05PXyogbWFjcm9zIGFyZSBhbHNvIGRlZmluZWQgYXMgTk9fKiBpZiB0aGUgYXBwbGljYXRpb24KKyAgIGFza3MgZm9yIGl0LiAgVGhpcyBpcyBhIHRyYW5zaWVudCBmZWF0dXJlIHRoYXQgaXMgcHJvdmlkZWQgZm9yIHRob3NlCisgICB3aG8gaGF2ZW4ndCBoYWQgdGhlIHRpbWUgdG8gZG8gdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgaW4gdGhlaXIKKyAgIGFwcGxpY2F0aW9ucy4gICovCisjaWZkZWYgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUworIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fQ0FNRUxMSUEpICYmICFkZWZpbmVkKE5PX0NBTUVMTElBKQorIyAgZGVmaW5lIE5PX0NBTUVMTElBCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19DQVBJRU5HKSAmJiAhZGVmaW5lZChOT19DQVBJRU5HKQorIyAgZGVmaW5lIE5PX0NBUElFTkcKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0NNUykgJiYgIWRlZmluZWQoTk9fQ01TKQorIyAgZGVmaW5lIE5PX0NNUworIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fRklQUykgJiYgIWRlZmluZWQoTk9fRklQUykKKyMgIGRlZmluZSBOT19GSVBTCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19HTVApICYmICFkZWZpbmVkKE5PX0dNUCkKKyMgIGRlZmluZSBOT19HTVAKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0lERUEpICYmICFkZWZpbmVkKE5PX0lERUEpCisjICBkZWZpbmUgTk9fSURFQQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fSlBBS0UpICYmICFkZWZpbmVkKE5PX0pQQUtFKQorIyAgZGVmaW5lIE5PX0pQQUtFCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19LUkI1KSAmJiAhZGVmaW5lZChOT19LUkI1KQorIyAgZGVmaW5lIE5PX0tSQjUKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX01EQzIpICYmICFkZWZpbmVkKE5PX01EQzIpCisjICBkZWZpbmUgTk9fTURDMgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fUkM1KSAmJiAhZGVmaW5lZChOT19SQzUpCisjICBkZWZpbmUgTk9fUkM1CisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19SRkMzNzc5KSAmJiAhZGVmaW5lZChOT19SRkMzNzc5KQorIyAgZGVmaW5lIE5PX1JGQzM3NzkKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1NFRUQpICYmICFkZWZpbmVkKE5PX1NFRUQpCisjICBkZWZpbmUgTk9fU0VFRAorIyBlbmRpZgorI2VuZGlmCisKKy8qIGNyeXB0by9vcGVuc3NsY29uZi5oLmluICovCisKKyNpZmRlZiBPUEVOU1NMX0RPSU5HX01BS0VERVBFTkQKKworLyogSW5jbHVkZSBhbnkgc3ltYm9scyBoZXJlIHRoYXQgaGF2ZSB0byBiZSBleHBsaWNpdGx5IHNldCB0byBlbmFibGUgYSBmZWF0dXJlCisgKiB0aGF0IHNob3VsZCBiZSB2aXNpYmxlIHRvIG1ha2VkZXBlbmQuCisgKgorICogW091ciAibWFrZSBkZXBlbmQiIGRvZXNuJ3QgYWN0dWFsbHkgbG9vayBhdCB0aGlzLCB3ZSB1c2UgYWN0dWFsIGJ1aWxkIHNldHRpbmdzCisgKiBpbnN0ZWFkOyB3ZSB3YW50IHRvIG1ha2UgaXQgZWFzeSB0byByZW1vdmUgc3ViZGlyZWN0b3JpZXMgd2l0aCBkaXNhYmxlZCBhbGdvcml0aG1zLl0KKyAqLworCisjaWZuZGVmIE9QRU5TU0xfRklQUworI2RlZmluZSBPUEVOU1NMX0ZJUFMKKyNlbmRpZgorCisjZW5kaWYKKworLyogR2VuZXJhdGUgODAzODYgY29kZT8gKi8KKyN1bmRlZiBJMzg2X09OTFkKKworI2lmICEoZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoX19WTVMpKSAvKiBWTVMgdXNlcyBsb2dpY2FsIG5hbWVzIGluc3RlYWQgKi8KKyNpZiBkZWZpbmVkKEhFQURFUl9DUllQVExJQl9IKSAmJiAhZGVmaW5lZChPUEVOU1NMRElSKQorI2RlZmluZSBFTkdJTkVTRElSICIvdXNyL2xvY2FsL3NzbC9saWIvZW5naW5lcyIKKyNkZWZpbmUgT1BFTlNTTERJUiAiL3Vzci9sb2NhbC9zc2wiCisjZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgT1BFTlNTTF9VTklTVEQKKyNkZWZpbmUgT1BFTlNTTF9VTklTVEQgPHVuaXN0ZC5oPgorI2lmICFkZWZpbmVkKFNXSUcpCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI3VuZGVmIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTgorCisjaWYgZGVmaW5lZChIRUFERVJfSURFQV9IKSAmJiAhZGVmaW5lZChJREVBX0lOVCkKKyNkZWZpbmUgSURFQV9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX01EMl9IKSAmJiAhZGVmaW5lZChNRDJfSU5UKQorI2RlZmluZSBNRDJfSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9SQzJfSCkgJiYgIWRlZmluZWQoUkMyX0lOVCkKKy8qIEkgbmVlZCB0byBwdXQgaW4gYSBtb2QgZm9yIHRoZSBhbHBoYSAtIGVheSAqLworI2RlZmluZSBSQzJfSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9SQzRfSCkKKyNpZiAhZGVmaW5lZChSQzRfSU5UKQorLyogdXNpbmcgaW50IHR5cGVzIG1ha2UgdGhlIHN0cnVjdHVyZSBsYXJnZXIgYnV0IG1ha2UgdGhlIGNvZGUgZmFzdGVyCisgKiBvbiBtb3N0IGJveGVzIEkgaGF2ZSB0ZXN0ZWQgLSB1cCB0byAlMjAgZmFzdGVyLiAqLworLyoKKyAqIEkgZG9uJ3Qga25vdyB3aGF0IGRvZXMgIm1vc3QiIG1lYW4sIGJ1dCBkZWNsYXJpbmcgImludCIgaXMgYSBtdXN0IG9uOgorICogLSBJbnRlbCBQNiBiZWNhdXNlIHBhcnRpYWwgcmVnaXN0ZXIgc3RhbGxzIGFyZSB2ZXJ5IGV4cGVuc2l2ZTsKKyAqIC0gZWxkZXIgQWxwaGEgYmVjYXVzZSBpdCBsYWNrcyBieXRlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zOworICovCisjZGVmaW5lIFJDNF9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKyNpZiAhZGVmaW5lZChSQzRfQ0hVTkspCisvKgorICogVGhpcyBlbmFibGVzIGNvZGUgaGFuZGxpbmcgZGF0YSBhbGlnbmVkIGF0IG5hdHVyYWwgQ1BVIHdvcmQKKyAqIGJvdW5kYXJ5LiBTZWUgY3J5cHRvL3JjNC9yYzRfZW5jLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAqLworI3VuZGVmIFJDNF9DSFVOSworI2VuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkKEhFQURFUl9ORVdfREVTX0gpIHx8IGRlZmluZWQoSEVBREVSX0RFU19IKSkgJiYgIWRlZmluZWQoREVTX0xPTkcpCisvKiBJZiB0aGlzIGlzIHNldCB0byAndW5zaWduZWQgaW50JyBvbiBhIERFQyBBbHBoYSwgdGhpcyBnaXZlcyBhYm91dCBhCisgKiAlMjAgc3BlZWQgdXAgKGxvbmdzIGFyZSA4IGJ5dGVzLCBpbnQncyBhcmUgNCkuICovCisjaWZuZGVmIERFU19MT05HCisjZGVmaW5lIERFU19MT05HIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9CTl9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0JOX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfQk5fSAorI2RlZmluZSBCTl9MTE9ORworCisvKiBTaG91bGQgd2UgZGVmaW5lIEJOX0RJVjJXIGhlcmU/ICovCisKKy8qIE9ubHkgb25lIGZvciB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBkZWZpbmVkICovCisvKiBUaGUgcHJpbWUgbnVtYmVyIGdlbmVyYXRpb24gc3R1ZmYgbWF5IG5vdCB3b3JrIHdoZW4KKyAqIEVJR0hUX0JJVCBidXQgSSBkb24ndCBjYXJlIHNpbmNlIEkndmUgb25seSB1c2VkIHRoaXMgbW9kZQorICogZm9yIGRlYnVnaW5nIHRoZSBiaWdudW0gbGlicmFyaWVzICovCisjdW5kZWYgU0lYVFlfRk9VUl9CSVRfTE9ORworI3VuZGVmIFNJWFRZX0ZPVVJfQklUCisjZGVmaW5lIFRISVJUWV9UV09fQklUCisjdW5kZWYgU0lYVEVFTl9CSVQKKyN1bmRlZiBFSUdIVF9CSVQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfUkM0X0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9SQzRfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX1JDNF9MT0NMX0gKKy8qIGlmIHRoaXMgaXMgZGVmaW5lZCBkYXRhW2ldIGlzIHVzZWQgaW5zdGVhZCBvZiAqZGF0YSwgdGhpcyBpcyBhICUyMAorICogc3BlZWR1cCBvbiB4ODYgKi8KKyNkZWZpbmUgUkM0X0lOREVYCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX0JGX0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9CRl9MT0NMX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfQkZfTE9DTF9ICisjdW5kZWYgQkZfUFRSCisjZW5kaWYgLyogSEVBREVSX0JGX0xPQ0xfSCAqLworCisjaWYgZGVmaW5lZChIRUFERVJfREVTX0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9ERVNfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX0RFU19MT0NMX0gKKyNpZm5kZWYgREVTX0RFRkFVTFRfT1BUSU9OUworLyogdGhlIGZvbGxvd2luZyBpcyB0d2Vha2VkIGZyb20gYSBjb25maWcgc2NyaXB0LCB0aGF0IGlzIHdoeSBpdCBpcyBhCisgKiBwcm90ZWN0ZWQgdW5kZWYvZGVmaW5lICovCisjaWZuZGVmIERFU19QVFIKKyNkZWZpbmUgREVTX1BUUgorI2VuZGlmCisKKy8qIFRoaXMgaGVscHMgQyBjb21waWxlciBnZW5lcmF0ZSB0aGUgY29ycmVjdCBjb2RlIGZvciBtdWx0aXBsZSBmdW5jdGlvbmFsCisgKiB1bml0cy4gIEl0IHJlZHVjZXMgcmVnaXN0ZXIgZGVwZW5kYW5jaWVzIGF0IHRoZSBleHBlbnNlIG9mIDIgbW9yZQorICogcmVnaXN0ZXJzICovCisjaWZuZGVmIERFU19SSVNDMQorI2RlZmluZSBERVNfUklTQzEKKyNlbmRpZgorCisjaWZuZGVmIERFU19SSVNDMgorI3VuZGVmIERFU19SSVNDMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFU19SSVNDMSkgJiYgZGVmaW5lZChERVNfUklTQzIpCitZT1UgU0hPVUxEIE5PVCBIQVZFIEJPVEggREVTX1JJU0MxIEFORCBERVNfUklTQzIgREVGSU5FRCEhISEhCisjZW5kaWYKKworLyogVW5yb2xsIHRoZSBpbm5lciBsb29wLCB0aGlzIHNvbWV0aW1lcyBoZWxwcywgc29tZXRpbWVzIGhpbmRlcnMuCisgKiBWZXJ5IG11Y3kgQ1BVIGRlcGVuZGFudCAqLworI2lmbmRlZiBERVNfVU5ST0xMCisjZGVmaW5lIERFU19VTlJPTEwKKyNlbmRpZgorCisvKiBUaGVzZSBkZWZhdWx0IHZhbHVlcyB3ZXJlIHN1cHBsaWVkIGJ5CisgKiBQZXRlciBHdXRtYW4gPHBndXQwMDFAY3MuYXVja2xhbmQuYWMubno+CisgKiBUaGV5IGFyZSBvbmx5IHVzZWQgaWYgbm90aGluZyBlbHNlIGhhcyBiZWVuIGRlZmluZWQgKi8KKyNpZiAhZGVmaW5lZChERVNfUFRSKSAmJiAhZGVmaW5lZChERVNfUklTQzEpICYmICFkZWZpbmVkKERFU19SSVNDMikgJiYgIWRlZmluZWQoREVTX1VOUk9MTCkKKy8qIFNwZWNpYWwgZGVmaW5lcyB3aGljaCBjaGFuZ2UgdGhlIHdheSB0aGUgY29kZSBpcyBidWlsdCBkZXBlbmRpbmcgb24gdGhlCisgICBDUFUgYW5kIE9TLiAgRm9yIFNHSSBtYWNoaW5lcyB5b3UgY2FuIHVzZSBfTUlQU19TWkxPTkcgKDMyIG9yIDY0KSB0byBmaW5kCisgICBldmVuIG5ld2VyIE1JUFMgQ1BVJ3MsIGJ1dCBhdCB0aGUgbW9tZW50IG9uZSBzaXplIGZpdHMgYWxsIGZvcgorICAgb3B0aW1pemF0aW9uIG9wdGlvbnMuICBPbGRlciBTcGFyYydzIHdvcmsgYmV0dGVyIHdpdGggb25seSBVTlJPTEwsIGJ1dAorICAgdGhlcmUncyBubyB3YXkgdG8gdGVsbCBhdCBjb21waWxlIHRpbWUgd2hhdCBpdCBpcyB5b3UncmUgcnVubmluZyBvbiAqLworIAorI2lmIGRlZmluZWQoIHN1biApCQkvKiBOZXdlciBTcGFyYydzICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMQorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoIF9fdWx0cml4ICkJLyogT2xkZXIgTUlQUyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKCBfX29zZjFfXyApCS8qIEFscGhhICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMgorI2VsaWYgZGVmaW5lZCAoIF9BSVggKQkJLyogUlM2MDAwICovCisgIC8qIFVua25vd24gKi8KKyNlbGlmIGRlZmluZWQoIF9faHB1eCApCQkvKiBIUC1QQSAqLworICAvKiBVbmtub3duICovCisjZWxpZiBkZWZpbmVkKCBfX2F1eCApCQkvKiA2OEsgKi8KKyAgLyogVW5rbm93biAqLworI2VsaWYgZGVmaW5lZCggX19kZ3V4ICkJCS8qIDg4SyAoYnV0IFA2IGluIGxhdGVzdCBib3hlcykgKi8KKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKCBfX3NnaSApCQkvKiBOZXdlciBNSVBTICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMgorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbGlmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykJLyogeDg2IGJveGVzLCBzaG91bGQgYmUgZ2NjICovCisjICBkZWZpbmUgREVTX1BUUgorIyAgZGVmaW5lIERFU19SSVNDMQorIyAgZGVmaW5lIERFU19VTlJPTEwKKyNlbmRpZiAvKiBTeXN0ZW1zLXNwZWNpZmljIHNwZWVkIGRlZmluZXMgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogREVTX0RFRkFVTFRfT1BUSU9OUyAqLworI2VuZGlmIC8qIEhFQURFUl9ERVNfTE9DTF9IICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jb25maWcvc3RhcmJvYXJkL2Vfb3MuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NvbmZpZy9zdGFyYm9hcmQvZV9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjcyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jb25maWcvc3RhcmJvYXJkL2Vfb3MuaApAQCAtMCwwICsxLDc4OCBAQAorLyogZV9vcy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20KKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX0VfT1NfSAorIyBkZWZpbmUgSEVBREVSX0VfT1NfSAorCisjIGluY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworIyBpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisvKgorICogPG9wZW5zc2wvZV9vczIuaD4gY29udGFpbnMgd2hhdCB3ZSBjYW4ganVzdGlmeSB0byBtYWtlIHZpc2libGUgdG8gdGhlCisgKiBvdXRzaWRlOyB0aGlzIGZpbGUgZV9vcy5oIGlzIG5vdCBwYXJ0IG9mIHRoZSBleHBvcnRlZCBpbnRlcmZhY2UuCisgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVXNlZCB0byBjaGVja2luZyByZWZlcmVuY2UgY291bnRzLCBtb3N0IHdoaWxlIGRvaW5nIHBlcmw1IHN0dWZmIDotKSAqLworIyBpZmRlZiBSRUZfUFJJTlQKKyMgIHVuZGVmIFJFRl9QUklOVAorIyAgZGVmaW5lIFJFRl9QUklOVChhLGIpICBmcHJpbnRmKHN0ZGVyciwiJTA4WDolNGQ6JXNcbiIsKGludCliLGItPnJlZmVyZW5jZXMsYSkKKyMgZW5kaWYKKworIyBpZm5kZWYgREVWUkFORE9NCisvKgorICogc2V0IHRoaXMgdG8gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiAncmFuZG9tJyBkZXZpY2UgZmlsZXMgdG8gdHJ5IG91dC4gTXkKKyAqIGRlZmF1bHQsIHdlIHdpbGwgdHJ5IHRvIHJlYWQgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIGZpbGVzCisgKi8KKyMgIGRlZmluZSBERVZSQU5ET00gIi9kZXYvdXJhbmRvbSIsIi9kZXYvcmFuZG9tIiwiL2Rldi9zcmFuZG9tIgorIyBlbmRpZgorIyBpZm5kZWYgREVWUkFORE9NX0VHRAorLyoKKyAqIHNldCB0aGlzIHRvIGEgY29tbWEtc2VwZXJhdGVkIGxpc3Qgb2YgJ2VnZCcgc29ja2V0cyB0byB0cnkgb3V0LiBUaGVzZQorICogc29ja2V0cyB3aWxsIGJlIHRyaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQgaW4gY2FzZSBhY2Nlc3NpbmcgdGhlIGRldmljZQorICogZmlsZXMgbGlzdGVkIGluIERFVlJBTkRPTSBkaWQgbm90IHJldHVybiBlbm91Z2ggZW50cm9weS4KKyAqLworIyAgZGVmaW5lIERFVlJBTkRPTV9FR0QgIi92YXIvcnVuL2VnZC1wb29sIiwiL2Rldi9lZ2QtcG9vbCIsIi9ldGMvZWdkLXBvb2wiLCIvZXRjL2VudHJvcHkiCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WWFdPUktTKQorIyAgZGVmaW5lIE5PX1NZU19QQVJBTV9ICisjICBkZWZpbmUgTk9fQ0hNT0QKKyMgIGRlZmluZSBOT19TWVNMT0cKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01BQ0lOVE9TSF9DTEFTU0lDKQorIyAgaWYgbWFjaW50b3NoPT0xCisjICAgaWZuZGVmIE1BQ19PU19HVVNJX1NPVVJDRQorIyAgICBkZWZpbmUgTUFDX09TX3ByZV9YCisjICAgIGRlZmluZSBOT19TWVNfVFlQRVNfSAorIyAgIGVuZGlmCisjICAgZGVmaW5lIE5PX1NZU19QQVJBTV9ICisjICAgZGVmaW5lIE5PX0NITU9ECisjICAgZGVmaW5lIE5PX1NZU0xPRworIyAgIHVuZGVmICBERVZSQU5ET00KKyMgICBkZWZpbmUgR0VUUElEX0lTX01FQU5JTkdMRVNTCisjICBlbmRpZgorIyBlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUaGUgTWljcm9zb2Z0IHNlY3Rpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgYmVjYXVzZSBvZiB0aGUgc21hbGwgc3RhY2sgaW4gc29tZSBNaWNyb3NvZnQKKyAqIG9wZXJhdGluZyBzeXN0ZW1zCisgKi8KKyMgaWYgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX1dJTjMyKQorIyAgZGVmaW5lIE1TX1NUQVRJQyAgICAgc3RhdGljCisjIGVsc2UKKyMgIGRlZmluZSBNU19TVEFUSUMKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSAmJiAhZGVmaW5lZChXSU4zMikKKyMgIGRlZmluZSBXSU4zMgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgV0lORE9XUworIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworIyBlbmRpZgorCisjIGlmIGRlZmluZWQoTVNET1MpICYmICFkZWZpbmVkKEdFVFBJRF9JU19NRUFOSU5HTEVTUykKKyMgIGRlZmluZSBHRVRQSURfSVNfTUVBTklOR0xFU1MKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyMgIGRlZmluZSBnZXRfbGFzdF9zeXNfZXJyb3IoKSAgICBTYlN5c3RlbUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgY2xlYXJfc3lzX2Vycm9yKCkgICAgICAgU2JTeXN0ZW1DbGVhckxhc3RFcnJvcigpCisjIGVsaWYgZGVmaW5lZChXSU4zMikKKyMgIGRlZmluZSBnZXRfbGFzdF9zeXNfZXJyb3IoKSAgICBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIGNsZWFyX3N5c19lcnJvcigpICAgICAgIFNldExhc3RFcnJvcigwKQorIyAgaWYgIWRlZmluZWQoV0lOTlQpCisjICAgZGVmaW5lIFdJTl9DT05TT0xFX0JVRworIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIGdldF9sYXN0X3N5c19lcnJvcigpICAgIGVycm5vCisjICBkZWZpbmUgY2xlYXJfc3lzX2Vycm9yKCkgICAgICAgZXJybm89MAorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorLyogRG8gbm90IGRlZmluZSBzb2NrZXQgbWFjcm9zLCBhcyB0aGV5IHNob3VsZCBub3QgYmUgdXNlZC4gKi8KKyMgZWxpZiBkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgV1NBR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBjbGVhcl9zb2NrZXRfZXJyb3IoKSAgICBXU0FTZXRMYXN0RXJyb3IoMCkKKyMgIGRlZmluZSByZWFkc29ja2V0KHMsYixuKSAgICAgICByZWN2KChzKSwoYiksKG4pLDApCisjICBkZWZpbmUgd3JpdGVzb2NrZXQocyxiLG4pICAgICAgc2VuZCgocyksKGIpLChuKSwwKQorIyBlbGlmIGRlZmluZWQoX19ESkdQUF9fKQorIyAgZGVmaW5lIFdBVFQzMgorIyAgZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpIGVycm5vCisjICBkZWZpbmUgY2xlYXJfc29ja2V0X2Vycm9yKCkgICAgZXJybm89MAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KHMpICAgICAgICAgIGNsb3NlX3MocykKKyMgIGRlZmluZSByZWFkc29ja2V0KHMsYixuKSAgICAgICByZWFkX3MocyxiLG4pCisjICBkZWZpbmUgd3JpdGVzb2NrZXQocyxiLG4pICAgICAgc2VuZChzLGIsbiwwKQorIyBlbGlmIGRlZmluZWQoTUFDX09TX3ByZV9YKQorIyAgZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpIGVycm5vCisjICBkZWZpbmUgY2xlYXJfc29ja2V0X2Vycm9yKCkgICAgZXJybm89MAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KHMpICAgICAgICAgIE1hY1NvY2tldF9jbG9zZShzKQorIyAgZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pICAgICAgIE1hY1NvY2tldF9yZWN2KChzKSwoYiksKG4pLHRydWUpCisjICBkZWZpbmUgd3JpdGVzb2NrZXQocyxiLG4pICAgICAgTWFjU29ja2V0X3NlbmQoKHMpLChiKSwobikpCisjIGVsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpCisjICBkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgZXJybm8KKyMgIGRlZmluZSBjbGVhcl9zb2NrZXRfZXJyb3IoKSAgICBlcnJubz0wCisjICBkZWZpbmUgaW9jdGxzb2NrZXQoYSxiLGMpICAgICAgaW9jdGwoYSxiLGMpCisjICBkZWZpbmUgY2xvc2Vzb2NrZXQocykgICAgICAgICAgY2xvc2UocykKKyMgIGRlZmluZSByZWFkc29ja2V0KHMsYixuKSAgICAgICByZWN2KChzKSwoYiksKG4pLDApCisjICBkZWZpbmUgd3JpdGVzb2NrZXQocyxiLG4pICAgICAgc2VuZCgocyksKGIpLChuKSwwKQorIyBlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVlhXT1JLUykKKyMgIGRlZmluZSBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSBlcnJubworIyAgZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpICAgIGVycm5vPTAKKyMgIGRlZmluZSBpb2N0bHNvY2tldChhLGIsYykgICAgICAgICAgaW9jdGwoKGEpLChiKSwoaW50KShjKSkKKyMgIGRlZmluZSBjbG9zZXNvY2tldChzKSAgICAgICAgICAgICAgY2xvc2UocykKKyMgIGRlZmluZSByZWFkc29ja2V0KHMsYixuKSAgICAgICAgICAgcmVhZCgocyksKGIpLChuKSkKKyMgIGRlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICAgICAgd3JpdGUoKHMpLChjaGFyICopKGIpLChuKSkKKyMgZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisjICBkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgZXJybm8KKyMgIGRlZmluZSBjbGVhcl9zb2NrZXRfZXJyb3IoKSAgICBlcnJubz0wCisjICBkZWZpbmUgRklPTkJJTyBTT19OT05CTE9DSworIyAgZGVmaW5lIGlvY3Rsc29ja2V0KGEsYixjKSAgICAgICAgICAgICAgICBzZXRzb2Nrb3B0KChhKSxTT0xfU09DS0VULChiKSwoYyksc2l6ZW9mKCooYykpKQorIyAgZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pICAgICAgIHJlY3YoKHMpLChiKSwobiksMCkKKyMgIGRlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICBzZW5kKChzKSwoYiksKG4pLDApCisjIGVsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQorIyAgaWYgZGVmaW5lZChORVRXQVJFX0JTRFNPQ0spCisjICAgZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpIGVycm5vCisjICAgZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpICAgIGVycm5vPTAKKyMgICBkZWZpbmUgY2xvc2Vzb2NrZXQocykgICAgICAgICAgY2xvc2UocykKKyMgICBkZWZpbmUgaW9jdGxzb2NrZXQoYSxiLGMpICAgICAgaW9jdGwoYSxiLGMpCisjICAgaWYgZGVmaW5lZChORVRXQVJFX0xJQkMpCisjICAgIGRlZmluZSByZWFkc29ja2V0KHMsYixuKSAgICAgICByZWN2KChzKSwoYiksKG4pLDApCisjICAgIGRlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICBzZW5kKChzKSwoYiksKG4pLDApCisjICAgZWxzZQorIyAgICBkZWZpbmUgcmVhZHNvY2tldChzLGIsbikgICAgICAgcmVjdigocyksKGNoYXIqKShiKSwobiksMCkKKyMgICAgZGVmaW5lIHdyaXRlc29ja2V0KHMsYixuKSAgICAgIHNlbmQoKHMpLChjaGFyKikoYiksKG4pLDApCisjICAgZW5kaWYKKyMgIGVsc2UKKyMgICBkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgV1NBR2V0TGFzdEVycm9yKCkKKyMgICBkZWZpbmUgY2xlYXJfc29ja2V0X2Vycm9yKCkgICAgV1NBU2V0TGFzdEVycm9yKDApCisjICAgZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pICAgICAgICAgICAgICAgcmVjdigocyksKGIpLChuKSwwKQorIyAgIGRlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICAgICAgICAgIHNlbmQoKHMpLChiKSwobiksMCkKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSBlcnJubworIyAgZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpICAgIGVycm5vPTAKKyMgIGRlZmluZSBpb2N0bHNvY2tldChhLGIsYykgICAgICBpb2N0bChhLGIsYykKKyMgIGRlZmluZSBjbG9zZXNvY2tldChzKSAgICAgICAgICBjbG9zZShzKQorIyAgZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pICAgICAgIHJlYWQoKHMpLChiKSwobikpCisjICBkZWZpbmUgd3JpdGVzb2NrZXQocyxiLG4pICAgICAgd3JpdGUoKHMpLChiKSwobikpCisjIGVuZGlmCisKKyMgaWZkZWYgV0lOMTYgICAgICAgICAgICAgICAgICAgLyogbmV2ZXIgdGhlIGNhc2UgKi8KKyMgIGRlZmluZSBNU19DQUxMQkFDSyAgIF9mYXIgX2xvYWRkcworIyAgZGVmaW5lIE1TX0ZBUiAgICAgICAgX2ZhcgorIyBlbHNlCisjICBkZWZpbmUgTVNfQ0FMTEJBQ0sKKyMgIGRlZmluZSBNU19GQVIKKyMgZW5kaWYKKworIyBpZmRlZiBPUEVOU1NMX05PX1NURElPCisjICB1bmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorIyAgZGVmaW5lIE9QRU5TU0xfTk9fRlBfQVBJCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjICBpZm5kZWYgTk9fU1lTX1BBUkFNX0gKKyMgICBkZWZpbmUgTk9fU1lTX1BBUkFNX0gKKyMgIGVuZGlmCisjICBkZWZpbmUgT1BFTlNTTF9DT05GICAgICAgICAib3BlbnNzbC5jbmYiCisjICBkZWZpbmUgTElTVF9TRVBBUkFUT1JfQ0hBUiBTQl9QQVRIX1NFUF9DSEFSCisjIGVsaWYgKGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChNU0RPUykpCisKKyMgIGlmZGVmIF9fREpHUFBfXworIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjICAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgIGluY2x1ZGUgPHRjcC5oPgorIyAgIGluY2x1ZGUgPG5ldGRiLmg+CisjICAgZGVmaW5lIF9zZXRtb2RlIHNldG1vZGUKKyMgICBkZWZpbmUgX09fVEVYVCBPX1RFWFQKKyMgICBkZWZpbmUgX09fQklOQVJZIE9fQklOQVJZCisjICAgdW5kZWYgREVWUkFORE9NCisjICAgZGVmaW5lIERFVlJBTkRPTSAiL2Rldi91cmFuZG9tXHgyNCIKKyMgIGVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgLyogX19ESkdQUF9fICovCisKKyMgIGlmbmRlZiBTX0lGRElSCisjICAgZGVmaW5lIFNfSUZESVIgICAgIF9TX0lGRElSCisjICBlbmRpZgorCisjICBpZm5kZWYgU19JRk1UCisjICAgZGVmaW5lIFNfSUZNVCAgICAgIF9TX0lGTVQKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKFdJTk5UKSAmJiAhZGVmaW5lZChfX0RKR1BQX18pCisjICAgZGVmaW5lIE5PX1NZU0xPRworIyAgZW5kaWYKKyMgIGRlZmluZSBOT19ESVJFTlQKKworIyAgaWZkZWYgV0lORE9XUworIyAgIGlmICFkZWZpbmVkKF9XSU4zMl9XQ0UpICYmICFkZWZpbmVkKF9XSU4zMl9XSU5OVCkKKyAgICAgICAvKgorICAgICAgICAqIERlZmluaW5nIF9XSU4zMl9XSU5OVCBoZXJlIGluIGVfb3MuaCBpbXBsaWVzIGNlcnRhaW4gImRpc2NpcGxpbmUuIgorICAgICAgICAqIE1vc3Qgbm90YWJseSB3ZSBvdWdodCB0byBjaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIGVhY2ggc3BlY2lmaWMKKyAgICAgICAgKiByb3V0aW5lIHdpdGggR2V0UHJvY0FkZHJlc3MoKSBhbmQvb3IgZ3VhcmQgTlQtc3BlY2lmaWMgY2FsbHMgd2l0aAorICAgICAgICAqIEdldFZlcnNpb24oKSA8IDB4ODAwMDAwMDAuIE9uZSBjYW4gYXJndWUgdGhhdCBpbiBsYXR0ZXIgIm9yIiBjYXNlCisgICAgICAgICogd2Ugb3VnaHQgdG8gL0RFTEFZTE9BRCBzb21lIC5ETExzIGluIG9yZGVyIHRvIHByb3RlY3Qgb3Vyc2VsdmVzCisgICAgICAgICogYWdhaW5zdCBydW4tdGltZSBsaW5rIGVycm9ycy4gVGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgbmVjZXNzYXJ5LAorICAgICAgICAqIGJlY2F1c2UgaXQgdHVybmVkIG91dCB0aGF0IGFscmVhZHkgV2luZG93cyA5NSwgZmlyc3Qgbm9uLU5UIFdpbjMyCisgICAgICAgICogaW1wbGVtZW50YXRpb24sIGlzIGVxdWlwcGVkIHdpdGggYXQgbGVhc3QgTlQgMy41MSBzdHVicywgZHVtbXkKKyAgICAgICAgKiByb3V0aW5lcyB3aXRoIHNhbWUgbmFtZSwgYnV0IHdoaWNoIGRvIG5vdGhpbmcuIE1lYW5pbmcgdGhhdCBpdCdzCisgICAgICAgICogYXBwYXJlbnRseSBzdWZmaWNpZW50IHRvIGd1YXJkICJ2YW5pbGxhIiBOVCBjYWxscyB3aXRoIEdldFZlcnNpb24KKyAgICAgICAgKiBhbG9uZSwgd2hpbGUgTlQgNC4wIGFuZCBhYm92ZSBpbnRlcmZhY2VzIG91Z2h0IHRvIGJlIGxpbmtlZCB3aXRoCisgICAgICAgICogR2V0UHJvY0FkZHJlc3MgYXQgcnVuLXRpbWUuCisgICAgICAgICovCisjICAgIGRlZmluZSBfV0lOMzJfV0lOTlQgMHgwNDAwCisjICAgZW5kaWYKKyMgICBpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NPQ0spICYmIGRlZmluZWQoX1dJTjMyX1dJTk5UKQorICAgICAgIC8qCisgICAgICAgICogSnVzdCBsaWtlIGRlZmluaW5nIF9XSU4zMl9XSU5OVCBpbmNsdWRpbmcgd2luc29jazIuaCBpbXBsaWVzCisgICAgICAgICogY2VydGFpbiAiZGlzY2lwbGluZSIgZm9yIG1haW50YWluaW5nIFticm9hZF0gYmluYXJ5IGNvbXBhdGliaWxpdHkuCisgICAgICAgICogQXMgbG9uZyBhcyBzdHJ1Y3R1cmVzIGFyZSBpbnZhcmlhbnQgYW1vbmcgV2luc29jayB2ZXJzaW9ucywKKyAgICAgICAgKiBpdCdzIHN1ZmZpY2llbnQgdG8gY2hlY2sgZm9yIHNwZWNpZmljIFdpbnNvY2syIEFQSSBhdmFpbGFiaWxpdHkKKyAgICAgICAgKiBhdCBydW4tdGltZSBbRFNPX2dsb2JhbF9sb29rdXAgaXMgcmVjb21tZW5kZWRdLi4uCisgICAgICAgICovCisjICAgIGluY2x1ZGUgPHdpbnNvY2syLmg+CisjICAgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CisgICAgICAgLyogeWVzLCB0aGV5IGhhdmUgdG8gYmUgI2luY2x1ZGVkIHByaW9yIHRvIDx3aW5kb3dzLmg+ICovCisjICAgZW5kaWYKKyMgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjICAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgICBpbmNsdWRlIDxlcnJuby5oPgorIyAgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgIGlmZGVmIF9XSU42NAorIyAgICBkZWZpbmUgc3RybGVuKHMpIF9zdHJsZW4zMShzKQorLyogY3V0IHN0cmluZ3MgdG8gMkdCICovCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50IF9zdHJsZW4zMShjb25zdCBjaGFyICpzdHIpCit7CisgICAgdW5zaWduZWQgaW50IGxlbiA9IDA7CisgICAgd2hpbGUgKCpzdHIgJiYgbGVuIDwgMHg4MDAwMDAwMFUpCisgICAgICAgIHN0cisrLCBsZW4rKzsKKyAgICByZXR1cm4gbGVuICYgMHg3RkZGRkZGRjsKK30KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSPD0xMjAwICYmIGRlZmluZWQoX01UKSAmJiBkZWZpbmVkKGlzc3BhY2UpCisgICAgICAgLyogY29tcGVuc2F0ZSBmb3IgYnVnIGluIFZDNiBjdHlwZS5oICovCisjICAgIHVuZGVmIGlzc3BhY2UKKyMgICAgdW5kZWYgaXNkaWdpdAorIyAgICB1bmRlZiBpc2FsbnVtCisjICAgIHVuZGVmIGlzdXBwZXIKKyMgICAgdW5kZWYgaXN4ZGlnaXQKKyMgICBlbmRpZgorIyAgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9ETEwpICYmIGRlZmluZWQoc3RkaW4pCisjICAgIGlmIF9NU0NfVkVSPj0xMzAwICYmIF9NU0NfVkVSPDE2MDAKKyMgICAgIHVuZGVmIHN0ZGluCisjICAgICB1bmRlZiBzdGRvdXQKKyMgICAgIHVuZGVmIHN0ZGVycgorRklMRSAqX19pb2JfZnVuYygpOworIyAgICAgZGVmaW5lIHN0ZGluICAoJl9faW9iX2Z1bmMoKVswXSkKKyMgICAgIGRlZmluZSBzdGRvdXQgKCZfX2lvYl9mdW5jKClbMV0pCisjICAgICBkZWZpbmUgc3RkZXJyICgmX19pb2JfZnVuYygpWzJdKQorIyAgICBlbGlmIF9NU0NfVkVSPDEzMDAgJiYgZGVmaW5lZChJX0NBTl9MSVZFX1dJVEhfTE5LNDA0OSkKKyMgICAgIHVuZGVmIHN0ZGluCisjICAgICB1bmRlZiBzdGRvdXQKKyMgICAgIHVuZGVmIHN0ZGVycgorICAgICAgICAgLyoKKyAgICAgICAgICAqIHByZS0xMzAwIGhhcyBfX3BfX2lvYigpLCBidXQgaXQncyBhdmFpbGFibGUgb25seSBpbiBtc3ZjcnQubGliLAorICAgICAgICAgICogb3IgaW4gb3RoZXIgd29yZHMgd2l0aCAvTUQuIERlY2xhcmluZyBpbXBsaWNpdCBpbXBvcnQsIGkuZS4gd2l0aAorICAgICAgICAgICogX2ltcF8gcHJlZml4LCB3b3JrcyBjb3JyZWN0bHkgd2l0aCBhbGwgY29tcGlsZXIgb3B0aW9ucywgYnV0CisgICAgICAgICAgKiB3aXRob3V0IC9NRCByZXN1bHRzIGluIExJTksgd2FybmluZyBMTks0MDQ5OiAnbG9jYWxseSBkZWZpbmVkCisgICAgICAgICAgKiBzeW1ib2wgIl9faW9iIiBpbXBvcnRlZCcuCisgICAgICAgICAgKi8KK2V4dGVybiBGSUxFICpfaW1wX19faW9iOworIyAgICAgZGVmaW5lIHN0ZGluICAoJl9pbXBfX19pb2JbMF0pCisjICAgICBkZWZpbmUgc3Rkb3V0ICgmX2ltcF9fX2lvYlsxXSkKKyMgICAgIGRlZmluZSBzdGRlcnIgKCZfaW1wX19faW9iWzJdKQorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisKKyMgIGlmZGVmIE9QRU5TU0xfU1lTX1dJTkNFCisjICAgZGVmaW5lIE9QRU5TU0xfTk9fUE9TSVhfSU8KKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICBkZWZpbmUgX3NldG1vZGUgc2V0bW9kZQorIyAgIGRlZmluZSBfT19URVhUIE9fVEVYVAorIyAgIGRlZmluZSBfT19CSU5BUlkgT19CSU5BUlkKKyMgICBkZWZpbmUgX2ludDY0IF9faW50NjQKKyMgICBkZWZpbmUgX2tiaGl0IGtiaGl0CisjICBlbmRpZgorCisjICBkZWZpbmUgRVhJVChuKSBleGl0KG4pCisjICBkZWZpbmUgTElTVF9TRVBBUkFUT1JfQ0hBUiAnOycKKyMgIGlmbmRlZiBYX09LCisjICAgZGVmaW5lIFhfT0sgICAgICAgIDAKKyMgIGVuZGlmCisjICBpZm5kZWYgV19PSworIyAgIGRlZmluZSBXX09LICAgICAgICAyCisjICBlbmRpZgorIyAgaWZuZGVmIFJfT0sKKyMgICBkZWZpbmUgUl9PSyAgICAgICAgNAorIyAgZW5kaWYKKyMgIGRlZmluZSBPUEVOU1NMX0NPTkYgICJvcGVuc3NsLmNuZiIKKyMgIGRlZmluZSBTU0xFQVlfQ09ORiAgIE9QRU5TU0xfQ09ORgorIyAgZGVmaW5lIE5VTF9ERVYgICAgICAgIm51bCIKKyMgIGRlZmluZSBSRklMRSAgICAgICAgICIucm5kIgorIyAgaWZkZWYgT1BFTlNTTF9TWVNfV0lOQ0UKKyMgICBkZWZpbmUgREVGQVVMVF9IT01FICAiIgorIyAgZWxzZQorIyAgIGRlZmluZSBERUZBVUxUX0hPTUUgICJDOiIKKyMgIGVuZGlmCisKKy8qIEF2b2lkIFZpc3VhbCBTdHVkaW8gMTMgR2V0VmVyc2lvbiBkZXByZWNhdGVkIHByb2JsZW1zICovCisjICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUj49MTgwMAorIyAgIGRlZmluZSBjaGVja193aW5udCgpICgxKQorIyAgIGRlZmluZSBjaGVja193aW5fbWlucGxhdCh4KSAoMSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgY2hlY2tfd2lubnQoKSAoR2V0VmVyc2lvbigpIDwgMHg4MDAwMDAwMCkKKyMgICBkZWZpbmUgY2hlY2tfd2luX21pbnBsYXQoeCkgKExPQllURShMT1dPUkQoR2V0VmVyc2lvbigpKSkgPj0gKHgpKQorIyAgZW5kaWYKKworIyBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbm9uLW1pY3Jvc29mdCB3b3JsZCAqLworCisjICBpZmRlZiBPUEVOU1NMX1NZU19WTVMKKyMgICBkZWZpbmUgVk1TIDEKKyAgLyoKKyAgICogc29tZSBwcm9ncmFtcyBkb24ndCBpbmNsdWRlIHN0ZGxpYiwgc28gZXhpdCgpIGFuZCBvdGhlcnMgZ2l2ZSBpbXBsaWNpdAorICAgKiBmdW5jdGlvbiB3YXJuaW5ncworICAgKi8KKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgICBpZiBkZWZpbmVkKF9fREVDQykKKyMgICAgaW5jbHVkZSA8dW5pc3RkLmg+CisjICAgZWxzZQorIyAgICBpbmNsdWRlIDx1bml4bGliLmg+CisjICAgZW5kaWYKKyMgICBkZWZpbmUgT1BFTlNTTF9DT05GICAgICAgICAib3BlbnNzbC5jbmYiCisjICAgZGVmaW5lIFNTTEVBWV9DT05GICAgICAgICAgT1BFTlNTTF9DT05GCisjICAgZGVmaW5lIFJGSUxFICAgICAgICAgICAgICAgIi5ybmQiCisjICAgZGVmaW5lIExJU1RfU0VQQVJBVE9SX0NIQVIgJywnCisjICAgZGVmaW5lIE5VTF9ERVYgICAgICAgICAgICAgIk5MQTA6IgorICAvKiBXZSBkb24ndCBoYXZlIGFueSB3ZWxsLWRlZmluZWQgcmFuZG9tIGRldmljZXMgb24gVk1TLCB5ZXQuLi4gKi8KKyMgICB1bmRlZiBERVZSQU5ET00KKyAgLyotCisgICAgIFdlIG5lZWQgdG8gZG8gdGhpcyBzaW5jZSBWTVMgaGFzIHRoZSBmb2xsb3dpbmcgY29kaW5nIG9uIHN0YXR1cyBjb2RlczoKKworICAgICBCaXRzIDAtMjogc3RhdHVzIHR5cGU6IDAgPSB3YXJuaW5nLCAxID0gc3VjY2VzcywgMiA9IGVycm9yLCAzID0gaW5mbyAuLi4KKyAgICAgICAgICAgICAgIFRoZSBpbXBvcnRhbnQgdGhpbmcgdG8ga25vdyBpcyB0aGF0IG9kZCBudW1iZXJzIGFyZSBjb25zaWRlcmVkCisgICAgICAgICAgICAgICBnb29kLCB3aGlsZSBldmVuIG9uZXMgYXJlIGNvbnNpZGVyZWQgZXJyb3JzLgorICAgICBCaXRzIDMtMTU6IGFjdHVhbCBzdGF0dXMgbnVtYmVyCisgICAgIEJpdHMgMTYtMjc6IGZhY2lsaXR5IG51bWJlci4gIDAgaXMgY29uc2lkZXJlZCAidW5rbm93biIKKyAgICAgQml0cyAyOC0zMTogY29udHJvbCBiaXRzLiAgSWYgYml0IDI4IGlzIHNldCwgdGhlIHNoZWxsIHdvbid0IHRyeSB0bworICAgICAgICAgICAgICAgICBvdXRwdXQgdGhlIG1lc3NhZ2UgKHdoaWNoLCBmb3IgcmFuZG9tIGNvZGVzLCBqdXN0IGxvb2tzIHVnbHkpCisKKyAgICAgU28sIHdoYXQgd2UgZG8gaGVyZSBpcyB0byBjaGFuZ2UgMCB0byAxIHRvIGdldCB0aGUgZGVmYXVsdCBzdWNjZXNzIHN0YXR1cywKKyAgICAgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBzaGlmdGVkIHVwIHRvIGZpdCBpbnRvIHRoZSBzdGF0dXMgbnVtYmVyIGZpZWxkLCBhbmQKKyAgICAgdGhlIHN0YXR1cyBpcyB0YWdnZWQgYXMgYW4gZXJyb3IsIHdoaWNoIEkgYmVsaWV2ZSBpcyB3aGF0IGlzIHdhbnRlZCBoZXJlLgorICAgICAtLSBSaWNoYXJkIExldml0dGUKKyAgKi8KKyMgICBkZWZpbmUgRVhJVChuKSAgICAgICAgICAgICBkbyB7IGludCBfX1ZNU19FWElUID0gbjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX1ZNU19FWElUID09IDApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVk1TX0VYSVQgPSAxOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1ZNU19FWElUID0gKG4gPDwgMykgfCAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19WTVNfRVhJVCB8PSAweDEwMDAwMDAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChfX1ZNU19FWElUKTsgfSB3aGlsZSgwKQorIyAgIGRlZmluZSBOT19TWVNfUEFSQU1fSAorCisjICBlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgIGRlZmluZSBOT19TWVNfVFlQRVNfSAorIyAgIHVuZGVmICBERVZSQU5ET00KKyMgICBpZmRlZiBORVRXQVJFX0NMSUIKKyMgICAgZGVmaW5lIGdldHBpZCBHZXRUaHJlYWRJRAorZXh0ZXJuIGludCBHZXRUaHJlYWRJRCh2b2lkKTsKKy8qICMgICAgICBpbmNsdWRlIDxjb25pby5oPiAqLworZXh0ZXJuIGludCBrYmhpdCh2b2lkKTsKKyMgICBlbHNlCisjICAgIGluY2x1ZGUgPHNjcmVlbi5oPgorIyAgIGVuZGlmCisjICAgZGVmaW5lIE5PX1NZU0xPRworIyAgIGRlZmluZSBfc2V0bW9kZSBzZXRtb2RlCisjICAgZGVmaW5lIF9rYmhpdCBrYmhpdAorIyAgIGRlZmluZSBfT19URVhUIE9fVEVYVAorIyAgIGRlZmluZSBfT19CSU5BUlkgT19CSU5BUlkKKyMgICBkZWZpbmUgT1BFTlNTTF9DT05GICAgIm9wZW5zc2wuY25mIgorIyAgIGRlZmluZSBTU0xFQVlfQ09ORiAgICBPUEVOU1NMX0NPTkYKKyMgICBkZWZpbmUgUkZJTEUgICAgIi5ybmQiCisjICAgZGVmaW5lIExJU1RfU0VQQVJBVE9SX0NIQVIgJzsnCisjICAgZGVmaW5lIEVYSVQobikgIHsgaWYgKG4pIHByaW50ZigiRVJST1I6ICVkXG4iLCAoaW50KW4pOyBleGl0KG4pOyB9CisKKyMgIGVsc2UKKyAgICAgLyogIWRlZmluZWQgVk1TICovCisjICAgaWZkZWYgT1BFTlNTTF9TWVNfTVBFCisjICAgIGRlZmluZSBOT19TWVNfUEFSQU1fSAorIyAgIGVuZGlmCisjICAgaWZkZWYgT1BFTlNTTF9VTklTVEQKKyMgICAgaW5jbHVkZSBPUEVOU1NMX1VOSVNURAorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8dW5pc3RkLmg+CisjICAgZW5kaWYKKyMgICBpZm5kZWYgTk9fU1lTX1RZUEVTX0gKKyMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICAgZW5kaWYKKyMgICBpZiBkZWZpbmVkKE5lWFQpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTkVXUzQpCisjICAgIGRlZmluZSBwaWRfdCBpbnQgICAgICAgICAgIC8qIHBpZF90IGlzIG1pc3Npbmcgb24gTkVYVFNURVAvT1BFTlNURVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKHVubGVzcyB3aGVuIGNvbXBpbGluZyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC1EX1BPU0lYX1NPVVJDRSwgd2hpY2ggZG9lc24ndCB3b3JrIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1cykgKi8KKyMgICBlbmRpZgorIyAgIGlmZGVmIE9QRU5TU0xfU1lTX05FV1M0ICAgICAvKiBzZXR2YnVmIGlzIG1pc3Npbmcgb24gbWlwcy1zb255LWJzZCAqLworIyAgICBkZWZpbmUgc2V0dmJ1ZihhLCBiLCBjLCBkKSBzZXRidWZmZXIoKGEpLCAoYiksIChkKSkKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBjbG9ja190OworIyAgIGVuZGlmCisjICAgaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzJfQ1lHV0lOCisjICAgIGluY2x1ZGUgPGlvLmg+CisjICAgIGluY2x1ZGUgPGZjbnRsLmg+CisjICAgZW5kaWYKKworIyAgIGRlZmluZSBPUEVOU1NMX0NPTkYgICAgICAgICJvcGVuc3NsLmNuZiIKKyMgICBkZWZpbmUgU1NMRUFZX0NPTkYgICAgICAgICBPUEVOU1NMX0NPTkYKKyMgICBkZWZpbmUgUkZJTEUgICAgICAgICAgICAgICAiLnJuZCIKKyMgICBkZWZpbmUgTElTVF9TRVBBUkFUT1JfQ0hBUiAnOicKKyMgICBkZWZpbmUgTlVMX0RFViAgICAgICAgICAgICAiL2Rldi9udWxsIgorIyAgIGRlZmluZSBFWElUKG4pICAgICAgICAgICAgIGV4aXQobikKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBTU0xlYXlfZ2V0cGlkKCkgICAgICAgZ2V0cGlkKCkKKworIyBlbmRpZgorCisvKioqKioqKioqKioqKi8KKworIyBpZmRlZiBVU0VfU09DS0VUUworIyAgaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisvKiBObyBpbmNsdWRlcyBoZXJlIGZvciBTdGFyYm9hcmQgKi8KKyMgIGVsaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKE1TRE9TKQorICAgICAgLyogd2luZG93cyB3b3JsZCAqLworCisjICAgaWZkZWYgT1BFTlNTTF9OT19TT0NLCisjICAgIGRlZmluZSBTU0xlYXlfV3JpdGUoYSxiLGMpICAgICAgICgtMSkKKyMgICAgZGVmaW5lIFNTTGVheV9SZWFkKGEsYixjKSAgICAgICAgKC0xKQorIyAgICBkZWZpbmUgU0hVVERPV04oZmQpICAgICAgICAgICAgICBjbG9zZShmZCkKKyMgICAgZGVmaW5lIFNIVVRET1dOMihmZCkgICAgICAgICAgICAgY2xvc2UoZmQpCisjICAgZWxpZiAhZGVmaW5lZChfX0RKR1BQX18pCisjICAgIGlmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgX1dJTjMyX1dDRTw0MTAKKyMgICAgIGRlZmluZSBnZXRzZXJ2YnluYW1lIF9tYXNrZWRfZGVjbGFyYXRpb25fZ2V0c2VydmJ5bmFtZQorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChJUFBST1RPX0lQKQorICAgICAgICAgLyogd2luc29ja1syXS5oIHdhcyBpbmNsdWRlZCBhbHJlYWR5PyAqLworIyAgICAgaW5jbHVkZSA8d2luc29jay5oPgorIyAgICBlbmRpZgorIyAgICBpZmRlZiBnZXRzZXJ2YnluYW1lCisjICAgICB1bmRlZiBnZXRzZXJ2YnluYW1lCisgICAgICAgICAvKiB0aGlzIGlzIHVzZWQgdG8gYmUgd2NlY29tcGF0L2luY2x1ZGUvd2luc29ja19leHRyYXMuaCAqLworc3RydWN0IHNlcnZlbnQgKlBBU0NBTCBnZXRzZXJ2YnluYW1lKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyMgICAgZW5kaWYKKworIyAgICBpZmRlZiBfV0lONjQKKy8qCisgKiBFdmVuIHRob3VnaCBzaXplb2YoU09DS0VUKSBpcyA4LCBpdCdzIHNhZmUgdG8gY2FzdCBpdCB0byBpbnQsIGJlY2F1c2UKKyAqIHRoZSB2YWx1ZSBjb25zdGl0dXRlcyBhbiBpbmRleCBpbiBwZXItcHJvY2VzcyB0YWJsZSBvZiBsaW1pdGVkIHNpemUKKyAqIGFuZCBub3QgYSByZWFsIHBvaW50ZXIuCisgKi8KKyMgICAgIGRlZmluZSBzb2NrZXQoZCx0LHApICAgKChpbnQpc29ja2V0KGQsdCxwKSkKKyMgICAgIGRlZmluZSBhY2NlcHQocyxmLGwpICAgKChpbnQpYWNjZXB0KHMsZixsKSkKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIFNTTGVheV9Xcml0ZShhLGIsYykgICAgICAgc2VuZCgoYSksKGIpLChjKSwwKQorIyAgICBkZWZpbmUgU1NMZWF5X1JlYWQoYSxiLGMpICAgICAgICByZWN2KChhKSwoYiksKGMpLDApCisjICAgIGRlZmluZSBTSFVURE9XTihmZCkgICAgICAgICAgICAgIHsgc2h1dGRvd24oKGZkKSwwKTsgY2xvc2Vzb2NrZXQoZmQpOyB9CisjICAgIGRlZmluZSBTSFVURE9XTjIoZmQpICAgICAgICAgICAgIHsgc2h1dGRvd24oKGZkKSwyKTsgY2xvc2Vzb2NrZXQoZmQpOyB9CisjICAgZWxzZQorIyAgICBkZWZpbmUgU1NMZWF5X1dyaXRlKGEsYixjKSAgICAgICB3cml0ZV9zKGEsYixjLDApCisjICAgIGRlZmluZSBTU0xlYXlfUmVhZChhLGIsYykgICAgICAgIHJlYWRfcyhhLGIsYykKKyMgICAgZGVmaW5lIFNIVVRET1dOKGZkKSAgICAgICAgICAgICAgY2xvc2VfcyhmZCkKKyMgICAgZGVmaW5lIFNIVVRET1dOMihmZCkgICAgICAgICAgICAgY2xvc2VfcyhmZCkKKyMgICBlbmRpZgorCisjICBlbGlmIGRlZmluZWQoTUFDX09TX3ByZV9YKQorCisjICAgaW5jbHVkZSAiTWFjU29ja2V0LmgiCisjICAgZGVmaW5lIFNTTGVheV9Xcml0ZShhLGIsYykgICAgICAgICBNYWNTb2NrZXRfc2VuZCgoYSksKGIpLChjKSkKKyMgICBkZWZpbmUgU1NMZWF5X1JlYWQoYSxiLGMpICAgICAgICAgIE1hY1NvY2tldF9yZWN2KChhKSwoYiksKGMpLHRydWUpCisjICAgZGVmaW5lIFNIVVRET1dOKGZkKSAgICAgICAgICAgICAgICBNYWNTb2NrZXRfY2xvc2UoZmQpCisjICAgZGVmaW5lIFNIVVRET1dOMihmZCkgICAgICAgICAgICAgICBNYWNTb2NrZXRfY2xvc2UoZmQpCisKKyMgIGVsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQorICAgICAgICAgLyoKKyAgICAgICAgICAqIE5ldFdhcmUgdXNlcyB0aGUgV2luU29jazIgaW50ZXJmYWNlcyBieSBkZWZhdWx0LCBidXQgY2FuIGJlCisgICAgICAgICAgKiBjb25maWd1cmVkIGZvciBCU0QKKyAgICAgICAgICAqLworIyAgIGlmIGRlZmluZWQoTkVUV0FSRV9CU0RTT0NLKQorIyAgICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgICAgaWYgZGVmaW5lZChORVRXQVJFX0NMSUIpCisjICAgICBpbmNsdWRlIDxzeXMvYnNkc2t0Lmg+CisjICAgIGVsc2UKKyMgICAgIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIElOVkFMSURfU09DS0VUIChpbnQpKH4wKQorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8bm92c29jazIuaD4KKyMgICBlbmRpZgorIyAgIGRlZmluZSBTU0xlYXlfV3JpdGUoYSxiLGMpICAgc2VuZCgoYSksKGIpLChjKSwwKQorIyAgIGRlZmluZSBTU0xlYXlfUmVhZChhLGIsYykgcmVjdigoYSksKGIpLChjKSwwKQorIyAgIGRlZmluZSBTSFVURE9XTihmZCkgICAgeyBzaHV0ZG93bigoZmQpLDApOyBjbG9zZXNvY2tldChmZCk7IH0KKyMgICBkZWZpbmUgU0hVVERPV04yKGZkKSAgICAgIHsgc2h1dGRvd24oKGZkKSwyKTsgY2xvc2Vzb2NrZXQoZmQpOyB9CisKKyMgIGVsc2UKKworIyAgIGlmbmRlZiBOT19TWVNfUEFSQU1fSAorIyAgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBlbmRpZgorIyAgIGlmZGVmIE9QRU5TU0xfU1lTX1ZYV09SS1MKKyMgICAgaW5jbHVkZSA8dGltZS5oPgorIyAgIGVsaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTVBFKQorIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPiAgICAgICAvKiBOZWVkZWQgdW5kZXIgbGludXggZm9yIEZEX1hYWCAqLworIyAgIGVuZGlmCisKKyMgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgIGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TX05PREVDQykKKyMgICAgaW5jbHVkZSA8c29ja2V0Lmg+CisjICAgIGluY2x1ZGUgPGluLmg+CisjICAgIGluY2x1ZGUgPGluZXQuaD4KKyMgICBlbHNlCisjICAgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgICAgaWZkZWYgRklMSU9fSAorIyAgICAgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+ICAgICAvKiBBZGRlZCBmb3IgRklPTkJJTyB1bmRlciB1bml4d2FyZSAqLworIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjICAgIGlmICFkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisjICAgICBpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChOZVhUKSB8fCBkZWZpbmVkKF9ORVhUX1NPVVJDRSkKKyMgICAgaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgIGVuZGlmCisKKyMgICBpZmRlZiBPUEVOU1NMX1NZU19BSVgKKyMgICAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorIyAgIGVuZGlmCisKKyMgICBpZmRlZiBfX1FOWF9fCisjICAgIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChfX3N1bikgfHwgZGVmaW5lZChzdW4pCisjICAgIGluY2x1ZGUgPHN5cy9maWxpby5oPgorIyAgIGVsc2UKKyMgICAgaWZuZGVmIFZNUworIyAgICAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjICAgIGVsc2UKKyAgICAgICAgIC8qIGlvY3RsIGlzIG9ubHkgaW4gVk1TID4gNy4wIGFuZCB3aGVuIHNvY2tldHNociBpcyBub3QgdXNlZCAqLworIyAgICAgaWYgIWRlZmluZWQoVENQSVBfVFlQRV9TT0NLRVRTSFIpICYmIGRlZmluZWQoX19WTVNfVkVSKSAmJiAoX19WTVNfVkVSID4gNzAwMDAwMDApCisjICAgICAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgIGVuZGlmCisKKyMgICBpZmRlZiBWTVMKKyMgICAgaW5jbHVkZSA8dW5peGlvLmg+CisjICAgIGlmIGRlZmluZWQoVENQSVBfVFlQRV9TT0NLRVRTSFIpCisjICAgICBpbmNsdWRlIDxzb2NrZXRzaHIuaD4KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorCisjICAgZGVmaW5lIFNTTGVheV9SZWFkKGEsYixjKSAgICAgcmVhZCgoYSksKGIpLChjKSkKKyMgICBkZWZpbmUgU1NMZWF5X1dyaXRlKGEsYixjKSAgICB3cml0ZSgoYSksKGIpLChjKSkKKyMgICBkZWZpbmUgU0hVVERPV04oZmQpICAgIHsgc2h1dGRvd24oKGZkKSwwKTsgY2xvc2Vzb2NrZXQoKGZkKSk7IH0KKyMgICBkZWZpbmUgU0hVVERPV04yKGZkKSAgIHsgc2h1dGRvd24oKGZkKSwyKTsgY2xvc2Vzb2NrZXQoKGZkKSk7IH0KKyMgICBpZm5kZWYgSU5WQUxJRF9TT0NLRVQKKyMgICAgZGVmaW5lIElOVkFMSURfU09DS0VUICAgICAgKC0xKQorIyAgIGVuZGlmICAgICAgICAgICAgICAgICAgICAgICAvKiBJTlZBTElEX1NPQ0tFVCAqLworIyAgZW5kaWYKKworLyoKKyAqIFNvbWUgSVB2NiBpbXBsZW1lbnRhdGlvbnMgYXJlIGJyb2tlbiwgZGlzYWJsZSB0aGVtIGluIGtub3duIGJhZCB2ZXJzaW9ucy4KKyAqLworIyAgaWYgIWRlZmluZWQoT1BFTlNTTF9VU0VfSVBWNikKKyMgICBpZiBkZWZpbmVkKEFGX0lORVQ2KSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TX0JPTkUpICYmICFkZWZpbmVkKE5FVFdBUkVfQ0xJQikKKyMgICAgZGVmaW5lIE9QRU5TU0xfVVNFX0lQVjYgMQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIE9QRU5TU0xfVVNFX0lQVjYgMAorIyAgIGVuZGlmCisjICBlbmRpZgorCisjIGVuZGlmCisKKyMgaWYgKGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoc3VuKSkgJiYgIWRlZmluZWQoX19zdnI0X18pICYmICFkZWZpbmVkKF9fU1ZSNCkKKyAgLyogaW5jbHVkZSBoZWFkZXJzIGZpcnN0LCBzbyBvdXIgZGVmaW5lcyBkb24ndCBicmVhayBpdCAqLworIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyAgLyogYmNvcHkgY2FuIGhhbmRsZSBvdmVybGFwcGluZyBtb3ZlcyBhY2NvcmRpbmcgdG8gU3VuT1MgNC4xLjQgbWFucGFnZSAqLworIyAgZGVmaW5lIG1lbW1vdmUoczEsczIsbikgYmNvcHkoKHMyKSwoczEpLChuKSkKKyMgIGRlZmluZSBzdHJ0b3VsKHMsZSxiKSAoKHVuc2lnbmVkIGxvbmcgaW50KXN0cnRvbCgocyksKGUpLChiKSkpCitleHRlcm4gY2hhciAqc3lzX2Vycmxpc3RbXTsKK2V4dGVybiBpbnQgc3lzX25lcnI7CisjICBkZWZpbmUgc3RyZXJyb3IoZXJybnVtKSBcCisgICAgICAgICgoKGVycm51bSk8MCB8fCAoZXJybnVtKT49c3lzX25lcnIpID8gTlVMTCA6IHN5c19lcnJsaXN0W2Vycm51bV0pCisgIC8qIEJlaW5nIHNpZ25lZCBTdW5PUyA0LnggbWVtY3B5IGJyZWFrcyBBU04xX09CSkVDVCB0YWJsZSBsb29rdXAgKi8KKyMgIGluY2x1ZGUgImNyeXB0by9vX3N0ci5oIgorIyAgZGVmaW5lIG1lbWNtcCBPUEVOU1NMX21lbWNtcAorIyBlbmRpZgorCisjIGlmbmRlZiBPUEVOU1NMX0VYSVQKKyMgIGlmIGRlZmluZWQoTU9OT0xJVEgpICYmICFkZWZpbmVkKE9QRU5TU0xfQykKKyMgICBkZWZpbmUgT1BFTlNTTF9FWElUKG4pIHJldHVybihuKQorIyAgZWxzZQorIyAgIGRlZmluZSBPUEVOU1NMX0VYSVQobikgZG8geyBFWElUKG4pOyByZXR1cm4obik7IH0gd2hpbGUoMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBkZWZpbmUgREdfR0NDX0JVRyAgICAgICAgICAgICAvKiBnY2MgPCAyLjYuMyBvbiBER1VYICovCisKKyMgaWZkZWYgc2dpCisjICBkZWZpbmUgSVJJWF9DQ19CVUcgICAgICAgICAgIC8qIGFsbCB2ZXJzaW9uIG9mIElSSVggSSd2ZSB0ZXN0ZWQgKDQuKiA1LiopICovCisjIGVuZGlmCisjIGlmZGVmIE9QRU5TU0xfU1lTX1NOSQorIyAgZGVmaW5lIElSSVhfQ0NfQlVHICAgICAgICAgICAvKiBDRFMrKyB1cCB0byBWMi4wQnNvbWV0aGluZyBzdWZmZXJlZCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBzYW1lIGJ1Zy4gKi8KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpCisjICBkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAorIyAgZGVmaW5lIHN0cm5jYXNlY21wIF9zdHJuaWNtcAorIyBlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorLyogVk1TIGJlbG93IHZlcnNpb24gNy4wIGRvZXNuJ3QgaGF2ZSBzdHJjYXNlY21wKCkgKi8KKyMgIGluY2x1ZGUgIm9fc3RyLmgiCisjICBkZWZpbmUgc3RyY2FzZWNtcCBPUEVOU1NMX3N0cmNhc2VjbXAKKyMgIGRlZmluZSBzdHJuY2FzZWNtcCBPUEVOU1NMX3N0cm5jYXNlY21wCisjICBkZWZpbmUgT1BFTlNTTF9JTVBMRU1FTlRTX3N0cm5jYXNlY21wCisjIGVsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19PUzIpICYmIGRlZmluZWQoX19FTVhfXykKKyMgIGRlZmluZSBzdHJjYXNlY21wIHN0cmljbXAKKyMgIGRlZmluZSBzdHJuY2FzZWNtcCBzdHJuaWNtcAorIyBlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgaWYgZGVmaW5lZChORVRXQVJFX0NMSUIpCisjICAgZGVmaW5lIHN0cmNhc2VjbXAgc3RyaWNtcAorIyAgIGRlZmluZSBzdHJuY2FzZWNtcCBzdHJuaWNtcAorIyAgZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRXQVJFX0NMSUIgKi8KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX09TMikgJiYgZGVmaW5lZChfX0VNWF9fKQorIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisjICBkZWZpbmUgTk9fU1lTTE9HCisjIGVuZGlmCisKKy8qIHZ4d29ya3MgKi8KKyMgaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WWFdPUktTKQorIyAgaW5jbHVkZSA8aW9MaWIuaD4KKyMgIGluY2x1ZGUgPHRpY2tMaWIuaD4KKyMgIGluY2x1ZGUgPHN5c0xpYi5oPgorCisjICBkZWZpbmUgVFRZX1NUUlVDVCBpbnQKKworIyAgZGVmaW5lIHNsZWVwKGEpIHRhc2tEZWxheSgoYSkgKiBzeXNDbGtSYXRlR2V0KCkpCisKKyMgIGluY2x1ZGUgPHZ4V29ya3MuaD4KKyMgIGluY2x1ZGUgPHNvY2tMaWIuaD4KKyMgIGluY2x1ZGUgPHRhc2tMaWIuaD4KKworIyAgZGVmaW5lIGdldHBpZCB0YXNrSWRTZWxmCisKKy8qCisgKiBOT1RFOiB0aGVzZSBhcmUgaW1wbGVtZW50ZWQgYnkgaGVscGVycyBpbiBkYXRhYmFzZSBhcHAhIGlmIHRoZSBkYXRhYmFzZSBpcworICogbm90IGxpbmtlZCwgd2UgbmVlZCB0byBpbXBsZW1lbnQgdGhlbSBlbHN3aGVyZQorICovCitzdHJ1Y3QgaG9zdGVudCAqZ2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKK3N0cnVjdCBob3N0ZW50ICpnZXRob3N0YnlhZGRyKGNvbnN0IGNoYXIgKmFkZHIsIGludCBsZW5ndGgsIGludCB0eXBlKTsKK3N0cnVjdCBzZXJ2ZW50ICpnZXRzZXJ2YnluYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByb3RvKTsKKworIyBlbmRpZgorLyogZW5kIHZ4d29ya3MgKi8KKworLyogYmVvcyAqLworIyBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisjICBkZWZpbmUgU09fRVJST1IgMAorIyAgZGVmaW5lIE5PX1NZU19VTgorIyAgZGVmaW5lIElQUFJPVE9fSVAgMAorIyAgaW5jbHVkZSA8T1MuaD4KKyMgZW5kaWYKKworIyBpZiAhZGVmaW5lZChpbmxpbmUpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fPj0xOTk5MDFMCisgICAvKiBkbyBub3RoaW5nLCBpbmxpbmUgd29ya3MgKi8KKyMgIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18+PTIKKyMgICBkZWZpbmUgaW5saW5lIF9faW5saW5lX18KKyMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgLyoKKyAgICogVmlzdWFsIFN0dWRpbzogaW5saW5lIGlzIGF2YWlsYWJsZSBpbiBDKysgb25seSwgaG93ZXZlcgorICAgKiBfX2lubGluZSBpcyBhdmFpbGFibGUgZm9yIEMsIHNlZQorICAgKiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvejh5MXl5ODguYXNweAorICAgKi8KKyMgICBkZWZpbmUgaW5saW5lIF9faW5saW5lCisjICBlbHNlCisjICAgZGVmaW5lIGlubGluZQorIyAgZW5kaWYKKyMgZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY29uZmlnL3N0YXJib2FyZC9vcGVuc3NsL29wZW5zc2xjb25mLmggYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jb25maWcvc3RhcmJvYXJkL29wZW5zc2wvb3BlbnNzbGNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI4NmYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY29uZmlnL3N0YXJib2FyZC9vcGVuc3NsL29wZW5zc2xjb25mLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qIG9wZW5zc2xjb25mLmggKi8KKy8qIFdBUk5JTkc6IEVkaXRlZCBoZWF2aWx5IGJ5IGhhbmQsIGJhc2VkIG9uIGxic2hlbGwgY29uZmlnLiBNZWFudCBmb3IgYWxsCisgKiBzdGFyYm9hcmQgcGxhdGZvcm1zLiAqLworCisjaW5jbHVkZSAic3RhcmJvYXJkL2NoYXJhY3Rlci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9lenRpbWUvZXp0aW1lLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKKworI2lmbmRlZiBPUEVOU1NMX1NZU19TVEFSQk9BUkQKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX1NUQVJCT0FSRAorI2VuZGlmCisKKy8qIE5PVEU6IFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcyBvbiBwdXJwb3NlLiBTb21lIHNvdXJjZSBmaWxlcworICogZGVmaW5lIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nIGl0IHRvIGNhdXNlIGRpZmZlcmVudCBiZWhhdmlvci4gKi8KKworI3VuZGVmIExfRU5ESUFOCisjdW5kZWYgQl9FTkRJQU4KKyNpZiBTQl9JUyhCSUdfRU5ESUFOKQorIyBkZWZpbmUgQl9FTkRJQU4KKyNlbHNlICAvLyBTQl9JUyhCSUdfRU5ESUFOKQorIyBkZWZpbmUgTF9FTkRJQU4KKyNlbmRpZiAgLy8gU0JfSVMoQklHX0VORElBTikKKworI2lmbmRlZiBOT19TWVNfVFlQRVNfSAorIyBkZWZpbmUgTk9fU1lTX1RZUEVTX0gKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUE9TSVhfSU8KKyMgZGVmaW5lIE9QRU5TU0xfTk9fUE9TSVhfSU8KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisjIGRlZmluZSBPUEVOU1NMX05PX0ZQX0FQSQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU08KKyMgZGVmaW5lIE9QRU5TU0xfTk9fRFNPCisjZW5kaWYKKworLyogT3BlblNTTCB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorIyBkZWZpbmUgT1BFTlNTTF9OT19DQU1FTExJQQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVAorIyBkZWZpbmUgT1BFTlNTTF9OT19DQVNUCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVBJRU5HCisjIGRlZmluZSBPUEVOU1NMX05PX0NBUElFTkcKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NNUworIyBkZWZpbmUgT1BFTlNTTF9OT19DTVMKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDX05JU1RQXzY0X0dDQ18xMjgKKyMgZGVmaW5lIE9QRU5TU0xfTk9fRUNfTklTVFBfNjRfR0NDXzEyOAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRklQUworIyBkZWZpbmUgT1BFTlNTTF9OT19GSVBTCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19HTVAKKyMgZGVmaW5lIE9QRU5TU0xfTk9fR01QCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisjIGRlZmluZSBPUEVOU1NMX05PX0lERUEKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0pQQUtFCisjIGRlZmluZSBPUEVOU1NMX05PX0pQQUtFCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisjIGRlZmluZSBPUEVOU1NMX05PX0tSQjUKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01EQzIKKyMgZGVmaW5lIE9QRU5TU0xfTk9fTURDMgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisjIGRlZmluZSBPUEVOU1NMX05PX1JDNQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkZDMzc3OQorIyBkZWZpbmUgT1BFTlNTTF9OT19SRkMzNzc5CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TQ1RQCisjIGRlZmluZSBPUEVOU1NMX05PX1NDVFAKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKyMgZGVmaW5lIE9QRU5TU0xfTk9fU0VFRAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBMAorIyBkZWZpbmUgT1BFTlNTTF9OT19TSEEwCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19XSElSTFBPT0wKKyMgZGVmaW5lIE9QRU5TU0xfTk9fV0hJUkxQT09MCisjZW5kaWYKKy8vIFdlIHNldCBPUEVOU1NMX05PX1RIUkVBRFMgaW4gYm9yaW5nc3NsLmd5cC4gU2V0IE9QRU5TU0xfVEhSRUFEUyBoZXJlIG1ha2VzIG5vCisvLyBzZW5zZS4KKy8vICNpZm5kZWYgT1BFTlNTTF9USFJFQURTCisvLyAjIGRlZmluZSBPUEVOU1NMX1RIUkVBRFMKKy8vICNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRFlOQU1JQ19FTkdJTkUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fRFlOQU1JQ19FTkdJTkUKKyNlbmRpZgorCisvKiBUaGUgT1BFTlNTTF9OT18qIG1hY3JvcyBhcmUgYWxzbyBkZWZpbmVkIGFzIE5PXyogaWYgdGhlIGFwcGxpY2F0aW9uCisgICBhc2tzIGZvciBpdC4gIFRoaXMgaXMgYSB0cmFuc2llbnQgZmVhdHVyZSB0aGF0IGlzIHByb3ZpZGVkIGZvciB0aG9zZQorICAgd2hvIGhhdmVuJ3QgaGFkIHRoZSB0aW1lIHRvIGRvIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGluIHRoZWlyCisgICBhcHBsaWNhdGlvbnMuICAqLworLyogTk9URTogVGhpcyBpcyBhY3R1YWxseSB1c2VkIGluIGV2cC5oISAqLworI2lmZGVmIE9QRU5TU0xfQUxHT1JJVEhNX0RFRklORVMKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0NBTUVMTElBKSAmJiAhZGVmaW5lZChOT19DQU1FTExJQSkKKyMgIGRlZmluZSBOT19DQU1FTExJQQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fQ0FQSUVORykgJiYgIWRlZmluZWQoTk9fQ0FQSUVORykKKyMgIGRlZmluZSBOT19DQVBJRU5HCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19DTVMpICYmICFkZWZpbmVkKE5PX0NNUykKKyMgIGRlZmluZSBOT19DTVMKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0ZJUFMpICYmICFkZWZpbmVkKE5PX0ZJUFMpCisjICBkZWZpbmUgTk9fRklQUworIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fR01QKSAmJiAhZGVmaW5lZChOT19HTVApCisjICBkZWZpbmUgTk9fR01QCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19JREVBKSAmJiAhZGVmaW5lZChOT19JREVBKQorIyAgZGVmaW5lIE5PX0lERUEKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0pQQUtFKSAmJiAhZGVmaW5lZChOT19KUEFLRSkKKyMgIGRlZmluZSBOT19KUEFLRQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fS1JCNSkgJiYgIWRlZmluZWQoTk9fS1JCNSkKKyMgIGRlZmluZSBOT19LUkI1CisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19NREMyKSAmJiAhZGVmaW5lZChOT19NREMyKQorIyAgZGVmaW5lIE5PX01EQzIKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1JDNSkgJiYgIWRlZmluZWQoTk9fUkM1KQorIyAgZGVmaW5lIE5PX1JDNQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fUkZDMzc3OSkgJiYgIWRlZmluZWQoTk9fUkZDMzc3OSkKKyMgIGRlZmluZSBOT19SRkMzNzc5CisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19TRUVEKSAmJiAhZGVmaW5lZChOT19TRUVEKQorIyAgZGVmaW5lIE5PX1NFRUQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBjcnlwdG8vb3BlbnNzbGNvbmYuaC5pbiAqLworCisjdW5kZWYgSTM4Nl9PTkxZCisKKyNpZiBkZWZpbmVkKEhFQURFUl9DUllQVExJQl9IKSAmJiAhZGVmaW5lZChPUEVOU1NMRElSKQorIyBkZWZpbmUgRU5HSU5FU0RJUiAiL3Vzci9sb2NhbC9zc2wvbGliL2VuZ2luZXMiCisjIGRlZmluZSBPUEVOU1NMRElSICIvdXNyL2xvY2FsL3NzbCIKKyNlbmRpZgorCisvLyBXZSBzaG91bGQgY2F1c2UgYSBjb21waWxlIGVycm9yIGlmIHdlIHRyeSB0byBpbmNsdWRlIFVOSVNURAorI3VuZGVmIE9QRU5TU0xfVU5JU1RECisKKyN1bmRlZiBPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04KKworI2lmIChkZWZpbmVkKEhFQURFUl9ORVdfREVTX0gpIHx8IGRlZmluZWQoSEVBREVSX0RFU19IKSkgJiYgIWRlZmluZWQoREVTX0xPTkcpCisvKiBJZiB0aGlzIGlzIHNldCB0byAndW5zaWduZWQgaW50JyBvbiBhIERFQyBBbHBoYSwgdGhpcyBnaXZlcyBhYm91dCBhCisgKiAlMjAgc3BlZWQgdXAgKGxvbmdzIGFyZSA4IGJ5dGVzLCBpbnQncyBhcmUgNCkuICovCisjIGlmbmRlZiBERVNfTE9ORworIyAgZGVmaW5lIERFU19MT05HIHVuc2lnbmVkIGludAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9CTl9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0JOX0gpCisjIGRlZmluZSBDT05GSUdfSEVBREVSX0JOX0gKKyMgdW5kZWYgQk5fTExPTkcKKy8qIE9ubHkgb25lIGZvciB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBkZWZpbmVkICovCisvKiBUaGUgcHJpbWUgbnVtYmVyIGdlbmVyYXRpb24gc3R1ZmYgbWF5IG5vdCB3b3JrIHdoZW4KKyAqIEVJR0hUX0JJVCBidXQgSSBkb24ndCBjYXJlIHNpbmNlIEkndmUgb25seSB1c2VkIHRoaXMgbW9kZQorICogZm9yIGRlYnVnaW5nIHRoZSBiaWdudW0gbGlicmFyaWVzICovCisjIHVuZGVmIFNJWFRZX0ZPVVJfQklUX0xPTkcKKyMgdW5kZWYgU0lYVFlfRk9VUl9CSVQKKyMgdW5kZWYgVEhJUlRZX1RXT19CSVQKKyMgdW5kZWYgU0lYVEVFTl9CSVQKKyMgdW5kZWYgRUlHSFRfQklUCisjIGlmIFNCX0lTKDY0X0JJVCkKKyMgIGlmIFNCX0hBUyg2NF9CSVRfTE9ORykKKyMgICBkZWZpbmUgU0lYVFlfRk9VUl9CSVRfTE9ORworIyAgZWxzZSAgLy8gU0JfSEFTKDY0X0JJVF9MT05HKQorIyAgIGRlZmluZSBTSVhUWV9GT1VSX0JJVAorIyAgZW5kaWYgIC8vIFNCX0hBUyg2NF9CSVRfTE9ORykKKyMgZWxzZSAgLy8gU0JfSVMoNjRfQklUKQorIyAgZGVmaW5lIEJOX0xMT05HCisjICBkZWZpbmUgVEhJUlRZX1RXT19CSVQKKyMgZW5kaWYgIC8vIFNCX0lTKDY0X0JJVCkKKyNlbmRpZiAvLyBkZWZpbmVkKEhFQURFUl9CTl9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0JOX0gpCisKKyNpZiBkZWZpbmVkKEhFQURFUl9ERVNfTE9DTF9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0RFU19MT0NMX0gpCisjIGRlZmluZSBDT05GSUdfSEVBREVSX0RFU19MT0NMX0gKKyMgaWZuZGVmIERFU19ERUZBVUxUX09QVElPTlMKKy8qIHRoZSBmb2xsb3dpbmcgaXMgdHdlYWtlZCBmcm9tIGEgY29uZmlnIHNjcmlwdCwgdGhhdCBpcyB3aHkgaXQgaXMgYQorICogcHJvdGVjdGVkIHVuZGVmL2RlZmluZSAqLworIyAgaWZuZGVmIERFU19QVFIKKyMgICBkZWZpbmUgREVTX1BUUgorIyAgZW5kaWYKKy8qIFRoaXMgaGVscHMgQyBjb21waWxlciBnZW5lcmF0ZSB0aGUgY29ycmVjdCBjb2RlIGZvciBtdWx0aXBsZSBmdW5jdGlvbmFsCisgKiB1bml0cy4gIEl0IHJlZHVjZXMgcmVnaXN0ZXIgZGVwZW5kYW5jaWVzIGF0IHRoZSBleHBlbnNlIG9mIDIgbW9yZQorICogcmVnaXN0ZXJzICovCisjICBpZm5kZWYgREVTX1JJU0MxCisjICAgZGVmaW5lIERFU19SSVNDMQorIyAgZW5kaWYKKyMgIGlmZGVmIERFU19SSVNDMgorIyAgIHVuZGVmIERFU19SSVNDMgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoREVTX1JJU0MxKSAmJiBkZWZpbmVkKERFU19SSVNDMikKKyMgICBlcnJvciBZT1UgU0hPVUxEIE5PVCBIQVZFIEJPVEggREVTX1JJU0MxIEFORCBERVNfUklTQzIgREVGSU5FRCEhISEhCisjICBlbmRpZgorCisvKiBVbnJvbGwgdGhlIGlubmVyIGxvb3AsIHRoaXMgc29tZXRpbWVzIGhlbHBzLCBzb21ldGltZXMgaGluZGVycy4KKyAqIFZlcnkgbXVjeSBDUFUgZGVwZW5kYW50ICovCisjICBpZm5kZWYgREVTX1VOUk9MTAorIyAgIGRlZmluZSBERVNfVU5ST0xMCisjICBlbmRpZgorIyBlbmRpZiAvKiBERVNfREVGQVVMVF9PUFRJT05TICovCisjZW5kaWYgLyogSEVBREVSX0RFU19MT0NMX0ggKi8KKworI2lmbmRlZiBPUEVOU1NMX09QRU5TU0xfQ09ORklHX1NUQVJCT0FSRF9PUEVOU1NMX09QRU5TU0xDT05GX0gKKyNkZWZpbmUgT1BFTlNTTF9PUEVOU1NMX0NPTkZJR19TVEFSQk9BUkRfT1BFTlNTTF9PUEVOU1NMQ09ORl9ICisKKy8vIFR5cGVzIHRoYXQgbmVlZCB0byBiZSBwb3J0ZWQuCisKKy8vIFVzZSBFelRpbWUgc2ltdWxhdGVkIFBPU0lYIHR5cGVzLgorI2RlZmluZSBPUEVOU1NMX3BvcnRfdG0gRXpUaW1lRXhwbG9kZWQKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3RpbWVfdCBFelRpbWVUCisjZGVmaW5lIE9QRU5TU0xfcG9ydF90aW1ldmFsIEV6VGltZVZhbHVlCisKKy8vIERlZmluaXRpb25zIGZvciBzeXN0ZW0gY2FsbHMgdGhhdCBtYXkgbmVlZCB0byBiZSBvdmVycmlkZGVuLgorI2RlZmluZSBPUEVOU1NMX3BvcnRfYWJvcnQgU2JTeXN0ZW1CcmVha0ludG9EZWJ1Z2dlcgorI2RlZmluZSBPUEVOU1NMX3BvcnRfYXNzZXJ0KHgpIFNCX0RDSEVDSyh4KQorI2RlZmluZSBPUEVOU1NMX3BvcnRfYXRvaSBTYlN0cmluZ0FUb0kKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X2ZyZWUgU2JNZW1vcnlEZWFsbG9jYXRlCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9nZXRlbnYoeCkgTlVMTAorI2RlZmluZSBPUEVOU1NMX3BvcnRfaXNhbG51bSBTYkNoYXJhY3RlcklzQWxwaGFudW1lcmljCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9pc2RpZ2l0IFNiQ2hhcmFjdGVySXNEaWdpdAorI2RlZmluZSBPUEVOU1NMX3BvcnRfaXNzcGFjZSBTYkNoYXJhY3RlcklzU3BhY2UKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X2lzdXBwZXIgU2JDaGFyYWN0ZXJJc1VwcGVyCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9pc3hkaWdpdCBTYkNoYXJhY3RlcklzSGV4RGlnaXQKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X21hbGxvYyBTYk1lbW9yeUFsbG9jYXRlCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9tZW1jaHIgKHVuc2lnbmVkIGNoYXIgKilTYk1lbW9yeUZpbmRCeXRlCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9tZW1jbXAgU2JNZW1vcnlDb21wYXJlCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9tZW1jcHkgU2JNZW1vcnlDb3B5CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9tZW1tb3ZlIFNiTWVtb3J5TW92ZQorI2RlZmluZSBPUEVOU1NMX3BvcnRfbWVtc2V0IFNiTWVtb3J5U2V0CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9wcmludGYgU2JMb2dGb3JtYXRGCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9wcmludGZlcnIgU2JMb2dGb3JtYXRGCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9xc29ydCBTYlN5c3RlbVNvcnQKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3JlYWxsb2MgU2JNZW1vcnlSZWFsbG9jYXRlCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zc2NhbmYgU2JTdHJpbmdTY2FuRgorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RyY2FzZWNtcCBTYlN0cmluZ0NvbXBhcmVOb0Nhc2UKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3N0cmNhdChkLCBzKSBTYlN0cmluZ0NvbmNhdCgoZCksIChzKSwgSU5UX01BWCkKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3N0cmNociAoY2hhciAqKVNiU3RyaW5nRmluZENoYXJhY3RlcgorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RyY21wIFNiU3RyaW5nQ29tcGFyZUFsbAorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RyY3B5KGQsIHMpIFNiU3RyaW5nQ29weSgoZCksIChzKSwgSU5UX01BWCkKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3N0cmR1cCBTYlN0cmluZ0R1cGxpY2F0ZQorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RyZXJyb3IoeCkgIiIKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3N0cmxlbiBTYlN0cmluZ0dldExlbmd0aAorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RybmNhc2VjbXAgU2JTdHJpbmdDb21wYXJlTm9DYXNlTgorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RybmNtcCBTYlN0cmluZ0NvbXBhcmUKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3N0cm5jcHkgU2JTdHJpbmdDb3B5CisjZGVmaW5lIE9QRU5TU0xfcG9ydF9zdHJyY2hyIChjaGFyICopU2JTdHJpbmdGaW5kTGFzdENoYXJhY3RlcgorI2RlZmluZSBPUEVOU1NMX3BvcnRfc3RydG91bCBTYlN0cmluZ1BhcnNlVW5zaWduZWRJbnRlZ2VyCisjZGVmaW5lIE9QRU5TU0xfcG9ydF90aW1lIEV6VGltZVRHZXROb3cKKyNkZWZpbmUgT1BFTlNTTF9wb3J0X3RvbG93ZXIgU2JDaGFyYWN0ZXJUb0xvd2VyCisjZGVmaW5lIE9QRU5TU0xfcG9ydF90b3VwcGVyIFNiQ2hhcmFjdGVyVG9VcHBlcgorCisvLyBPUEVOU1NMIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGRlZmluZWQgZ2xvYmFsbHkuCisjZGVmaW5lIE9QRU5TU0xfc3RyY21wIE9QRU5TU0xfcG9ydF9zdHJjbXAKKworLy8gVmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBwb3J0ZWQuCisjZGVmaW5lIE9QRU5TU0xfcG9ydF9lcnJubyBTYlN5c3RlbUdldExhc3RFcnJvcigpCisKKyNlbmRpZiAgLy8gT1BFTlNTTF9PUEVOU1NMX0NPTkZJR19TVEFSQk9BUkRfT1BFTlNTTF9PUEVOU1NMQ09ORl9ICmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYXNuMS90aW1lX3N1cHBvcnQuYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9hc24xL3RpbWVfc3VwcG9ydC5jCmluZGV4IDNlZmQ0M2UuLjAyYzViMjIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9hc24xL3RpbWVfc3VwcG9ydC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9hc24xL3RpbWVfc3VwcG9ydC5jCkBAIC01NSw5ICs1NSwxMyBAQAogICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQogICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCiAKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpZiAhU0JfSEFTX1FVSVJLKE5PX0dNVElNRV9SKQogI2lmICFkZWZpbmVkKF9QT1NJWF9DX1NPVVJDRSkKICNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDIwMTQxMEwgIC8qIGZvciBnbXRpbWVfciAqLwogI2VuZGlmCisjZW5kaWYgIC8vICFTQl9IQVNfUVVJUksoTk9fR01USU1FX1IpCiAKICNpbmNsdWRlICJhc24xX2xvY2wuaCIKIApAQCAtNzMsOCArNzcsMTMgQEAKICAgfQogICByZXR1cm4gcmVzdWx0OwogI2Vsc2UKKyNpZiBTQl9IQVNfUVVJUksoTk9fR01USU1FX1IpCisgIHJlc3VsdCA9IGdtdGltZSh0aW1lKTsKKyAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlIC8vIFNCX0hBU19RVUlSSyhOT19HTVRJTUVfUikKICAgcmV0dXJuIGdtdGltZV9yKHRpbWUsIHJlc3VsdCk7CiAjZW5kaWYKKyNlbmRpZiAgLy8gU0JfSEFTX1FVSVJLKE5PX0dNVElNRV9SKQogfQogCiAvKiBDb252ZXJ0IGRhdGUgdG8gYW5kIGZyb20ganVsaWFuIGRheSBVc2VzIEZsaWVnZWwgJiBWYW4gRmxhbmRlcm4gYWxnb3JpdGhtICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYmFzZTY0L2Jhc2U2NC5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2Jhc2U2NC9iYXNlNjQuYwppbmRleCBiNzAxYjBkLi5iMzcxNjVjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYmFzZTY0L2Jhc2U2NC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9iYXNlNjQvYmFzZTY0LmMKQEAgLTU0LDEyICs1NCwxNSBAQAogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQogICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvYmFzZTY0Lmg+Ci0KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotCisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkNCisNCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvdHlwZV9jaGVjay5oPgogCiAjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9iaW8vZmlsZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2Jpby9maWxlLmMKaW5kZXggNmEwYjlhOS4uYTVjMzRkMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2Jpby9maWxlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2Jpby9maWxlLmMKQEAgLTEsMyArMSw0IEBACisvKiBjcnlwdG8vYmlvL2Jzc19maWxlLmMgKi8KIC8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC01MiwxOTUgKzUzLDQ2NCBAQAogICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKICAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQotICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyotCisgKiAwMy1EZWMtMTk5NyAgcmRlbm55QGRjMy5jb20gIEZpeCBidWcgcHJldmVudGluZyB1c2Ugb2Ygc3RkaW4vc3Rkb3V0CisgKiAgICAgICAgICAgICAgd2l0aCBiaW5hcnkgZGF0YSAoZS5nLiBhc24xcGFyc2UgLWluZm9ybSBERVIgPCB4eHgpIHVuZGVyCisgKiAgICAgICAgICAgICAgV2luZG93cworICovCisKKyNpZm5kZWYgSEVBREVSX0JTU19GSUxFX0MKKyNkZWZpbmUgSEVBREVSX0JTU19GSUxFX0MKIAogI2lmIGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX3N1bikgfHwgZGVmaW5lZChfX2hwdXgpCi0vLyBGb2xsb3dpbmcgZGVmaW5pdGlvbiBhbGlhc2VzIGZvcGVuIHRvIGZvcGVuNjQgb24gYWJvdmUgbWVudGlvbmVkCi0vLyBwbGF0Zm9ybXMuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gb3BlbiBhbmQgc2VxdWVudGlhbGx5IGFjY2VzcwotLy8gZmlsZXMgbGFyZ2VyIHRoYW4gMkdCIGZyb20gMzItYml0IGFwcGxpY2F0aW9uLiBJdCBkb2VzIG5vdCBhbGxvdyB0bwotLy8gdHJhdmVyc2UgdGhlbSBiZXlvbmQgMkdCIHdpdGggZnNlZWsvZnRlbGwsIGJ1dCBvbiB0aGUgb3RoZXIgaGFuZCAqbm8qCi0vLyAzMi1iaXQgcGxhdGZvcm0gcGVybWl0cyB0aGF0LCBub3Qgd2l0aCBmc2Vlay9mdGVsbC4gTm90IHRvIG1lbnRpb24KLS8vIHRoYXQgYnJlYWtpbmcgMkdCIGxpbWl0IGZvciBzZWVraW5nIHdvdWxkIHJlcXVpcmUgc3VyZ2VyeSB0byAqb3VyKgotLy8gQVBJLiBCdXQgc2VxdWVudGlhbCBhY2Nlc3Mgc3VmZmljZXMgZm9yIHByYWN0aWNhbCBjYXNlcyB3aGVuIHlvdQotLy8gY2FuIHJ1biBpbnRvIGxhcmdlIGZpbGVzLCBzdWNoIGFzIGZpbmdlcnByaW50aW5nLCBzbyB3ZSBjYW4gbGV0IEFQSQotLy8gYWxvbmUuIEZvciByZWZlcmVuY2UsIHRoZSBsaXN0IG9mIDMyLWJpdCBwbGF0Zm9ybXMgd2hpY2ggYWxsb3cgZm9yCi0vLyBzZXF1ZW50aWFsIGFjY2VzcyBvZiBsYXJnZSBmaWxlcyB3aXRob3V0IGV4dHJhICJtYWdpYyIgY29tcHJpc2UgKkJTRCwKLS8vIERhcndpbiwgSVJJWC4uLgorLyoKKyAqIEZvbGxvd2luZyBkZWZpbml0aW9uIGFsaWFzZXMgZm9wZW4gdG8gZm9wZW42NCBvbiBhYm92ZSBtZW50aW9uZWQKKyAqIHBsYXRmb3Jtcy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBvcGVuIGFuZCBzZXF1ZW50aWFsbHkgYWNjZXNzIGZpbGVzCisgKiBsYXJnZXIgdGhhbiAyR0IgZnJvbSAzMi1iaXQgYXBwbGljYXRpb24uIEl0IGRvZXMgbm90IGFsbG93IHRvIHRyYXZlcnNlCisgKiB0aGVtIGJleW9uZCAyR0Igd2l0aCBmc2Vlay9mdGVsbCwgYnV0IG9uIHRoZSBvdGhlciBoYW5kICpubyogMzItYml0CisgKiBwbGF0Zm9ybSBwZXJtaXRzIHRoYXQsIG5vdCB3aXRoIGZzZWVrL2Z0ZWxsLiBOb3QgdG8gbWVudGlvbiB0aGF0IGJyZWFraW5nCisgKiAyR0IgbGltaXQgZm9yIHNlZWtpbmcgd291bGQgcmVxdWlyZSBzdXJnZXJ5IHRvICpvdXIqIEFQSS4gQnV0IHNlcXVlbnRpYWwKKyAqIGFjY2VzcyBzdWZmaWNlcyBmb3IgcHJhY3RpY2FsIGNhc2VzIHdoZW4geW91IGNhbiBydW4gaW50byBsYXJnZSBmaWxlcywKKyAqIHN1Y2ggYXMgZmluZ2VycHJpbnRpbmcsIHNvIHdlIGNhbiBsZXQgQVBJIGFsb25lLiBGb3IgcmVmZXJlbmNlLCB0aGUgbGlzdAorICogb2YgMzItYml0IHBsYXRmb3JtcyB3aGljaCBhbGxvdyBmb3Igc2VxdWVudGlhbCBhY2Nlc3Mgb2YgbGFyZ2UgZmlsZXMKKyAqIHdpdGhvdXQgZXh0cmEgIm1hZ2ljIiBjb21wcmlzZSAqQlNELCBEYXJ3aW4sIElSSVguLi4KKyAqLwogI2lmbmRlZiBfRklMRV9PRkZTRVRfQklUUwogI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAogI2VuZGlmCiAjZW5kaWYKIAotI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaWYgIWRlZmluZWQoTVNfQ0FMTEJBQ0spCisjZGVmaW5lIE1TX0NBTExCQUNLCisjZW5kaWYKIAotI2lmICFkZWZpbmVkKE9QRU5TU0xfVFJVU1RZKQorI2lmICFkZWZpbmVkKEJJT19GTEFHU19VUExJTkspCisjZGVmaW5lIEJJT19GTEFHU19VUExJTksgMAorI2VuZGlmCiAKKworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KIAotI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKLSNpbmNsdWRlICIuLi9pbnRlcm5hbC5oIgotCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAmJiBkZWZpbmVkKE5FVFdBUkVfQ0xJQikKKyNpbmNsdWRlIDxud2ZpbGVpby5oPgorI2VuZGlmCiAKICNkZWZpbmUgQklPX0ZQX1JFQUQgMHgwMgogI2RlZmluZSBCSU9fRlBfV1JJVEUgMHgwNAogI2RlZmluZSBCSU9fRlBfQVBQRU5EIDB4MDgKIAotQklPICpCSU9fbmV3X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsKLSAgQklPICpyZXQ7Ci0gIEZJTEUgKmZpbGU7CisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TVERJTykKIAorc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX3dyaXRlKEJJTyAqaCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKTsKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZmlsZV9yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfZ2V0cyhCSU8gKmgsIGNoYXIgKnN0ciwgaW50IHNpemUpOworc3RhdGljIGxvbmcgTVNfQ0FMTEJBQ0sgZmlsZV9jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZmlsZV9uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZmlsZV9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX2ZpbGVwID0geworICAgIEJJT19UWVBFX0ZJTEUsCisgICAgIkZJTEUgcG9pbnRlciIsCisgICAgZmlsZV93cml0ZSwKKyAgICBmaWxlX3JlYWQsCisgICAgZmlsZV9wdXRzLAorICAgIGZpbGVfZ2V0cywKKyAgICBmaWxlX2N0cmwsCisgICAgZmlsZV9uZXcsCisgICAgZmlsZV9mcmVlLAorICAgIE5VTEwsCit9OworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorc3RhdGljIEZJTEUgKmZpbGVfZm9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsKKyAgRklMRSAqZmlsZSA9IE5VTEw7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChDUF9VVEY4KQorICBpbnQgc3osIGxlbl8wID0gKGludClPUEVOU1NMX3BvcnRfc3RybGVuKGZpbGVuYW1lKSArIDE7CisgIERXT1JEIGZsYWdzOworCisgIC8qCisgICAqIEJhc2ljYWxseSB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgdG8gY292ZXI6IGEpIGZpbGVuYW1lIGlzCisgICAqIHB1cmUgQVNDSUkgc3RyaW5nOyBiKSBhY3R1YWwgVVRGLTggZW5jb2RlZCBzdHJpbmcgYW5kCisgICAqIGMpIGxvY2FsZS1pemVkIHN0cmluZywgaS5lLiBvbmUgY29udGFpbmluZyA4LWJpdAorICAgKiBjaGFyYWN0ZXJzIHRoYXQgYXJlIG1lYW5pbmdmdWwgaW4gY3VycmVudCBzeXN0ZW0gbG9jYWxlLgorICAgKiBJZiBmaWxlbmFtZSBpcyBwdXJlIEFTQ0lJIG9yIHJlYWwgVVRGLTggZW5jb2RlZCBzdHJpbmcsCisgICAqIE11bHRpQnl0ZVRvV2lkZUNoYXIgc3VjY2VlZHMgYW5kIF93Zm9wZW4gd29ya3MuIElmCisgICAqIGZpbGVuYW1lIGlzIGxvY2FsZS1pemVkIHN0cmluZywgY2hhbmNlcyBhcmUgdGhhdAorICAgKiBNdWx0aUJ5dGVUb1dpZGVDaGFyIGZhaWxzIHJlcG9ydGluZworICAgKiBFUlJPUl9OT19VTklDT0RFX1RSQU5TTEFUSU9OLCBpbiB3aGljaCBjYXNlIHdlIGZhbGwKKyAgICogYmFjayB0byBmb3Blbi4uLgorICAgKi8KKyAgaWYgKChzeiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgKGZsYWdzID0gTUJfRVJSX0lOVkFMSURfQ0hBUlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGVuXzAsIE5VTEwsIDApKSA+IDAgfHwKKyAgICAgIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX0ZMQUdTICYmCisgICAgICAgKHN6ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAoZmxhZ3MgPSAwKSwgZmlsZW5hbWUsIGxlbl8wLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpID4gMCkpIHsKKyAgICBXQ0hBUiB3bW9kZVs4XTsKKyAgICBXQ0hBUiAqd2ZpbGVuYW1lID0gX2FsbG9jYShzeiAqIHNpemVvZihXQ0hBUikpOworCisgICAgaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgZmxhZ3MsIGZpbGVuYW1lLCBsZW5fMCwgd2ZpbGVuYW1lLCBzeikgJiYKKyAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBtb2RlLCBPUEVOU1NMX3BvcnRfc3RybGVuKG1vZGUpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bW9kZSwgc2l6ZW9mKHdtb2RlKSAvIHNpemVvZih3bW9kZVswXSkpICYmCisgICAgICAgIChmaWxlID0gX3dmb3Blbih3ZmlsZW5hbWUsIHdtb2RlKSkgPT0gTlVMTCAmJgorICAgICAgICAoT1BFTlNTTF9lcnJubyA9PSBFTk9FTlQgfHwgT1BFTlNTTF9lcnJubyA9PSBFQkFERikpIHsKKyAgICAgIC8qCisgICAgICAgKiBVVEYtOCBkZWNvZGUgc3VjY2VlZGVkLCBidXQgbm8gZmlsZSwgZmlsZW5hbWUKKyAgICAgICAqIGNvdWxkIHN0aWxsIGhhdmUgYmVlbiBsb2NhbGUtaXplZC4uLgorICAgICAgICovCisgICAgICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsIG1vZGUpOworICAgIH0KKyAgfSBlbHNlIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9OT19VTklDT0RFX1RSQU5TTEFUSU9OKSB7CisgICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKKyAgfQorI2Vsc2UKICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX1NZU1RFTV9FUlJPUigpOworI2VuZGlmCisgIHJldHVybiAoZmlsZSk7Cit9CiAKLSAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNSwgImZvcGVuKCciLCBmaWxlbmFtZSwgIicsJyIsIG1vZGUsICInKSIpOwotICAgIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisKK0JJTyAqQklPX25ld19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKSB7CisgIEJJTyAqcmV0ID0gTlVMTDsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgU2JGaWxlIHNiX2ZpbGUgPSBrU2JGaWxlSW52YWxpZDsKKyAgU2JGaWxlRXJyb3IgZXJyb3IgPSBrU2JGaWxlT2s7CisgIHNiX2ZpbGUgPSBTYkZpbGVPcGVuKGZpbGVuYW1lLCBTYkZpbGVNb2RlU3RyaW5nVG9GbGFncyhtb2RlKSwgTlVMTCwgJmVycm9yKTsKKyAgaWYgKCFTYkZpbGVJc1ZhbGlkKHNiX2ZpbGUpKSB7CisgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKCk7CisgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDUsICJTYkZpbGVPcGVuKCciLCBmaWxlbmFtZSwgIicsJyIsIG1vZGUsICInKSIpOworICAgIGlmIChlcnJvciA9PSBrU2JGaWxlRXJyb3JOb3RGb3VuZCkgewogICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9OT19TVUNIX0ZJTEUpOwogICAgIH0gZWxzZSB7CiAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1NZU19MSUIpOwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQogCisgICAgcmV0dXJuIChOVUxMKTsKKyAgfQogICByZXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CiAgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIFNiRmlsZUNsb3NlKHNiX2ZpbGUpOworICAgIHJldHVybiAoTlVMTCk7CisgIH0KKworICBCSU9fY2xlYXJfZmxhZ3MocmV0LCBCSU9fRkxBR1NfVVBMSU5LKTsKKyAgQklPX3NldF9mcChyZXQsIHNiX2ZpbGUsIEJJT19DTE9TRSk7CisjZWxzZSAgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICBGSUxFICpmaWxlID0gZmlsZV9mb3BlbihmaWxlbmFtZSwgbW9kZSk7CisKKyAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgIFNZU2VycihTWVNfRl9GT1BFTiwgZ2V0X2xhc3Rfc3lzX2Vycm9yKCkpOworICAgIEVSUl9hZGRfZXJyb3JfZGF0YSg1LCAiZm9wZW4oJyIsIGZpbGVuYW1lLCAiJywnIiwgbW9kZSwgIicpIik7CisgICAgaWYgKE9QRU5TU0xfZXJybm8gPT0gRU5PRU5UKQorICAgICAgQklPZXJyKEJJT19GX0JJT19ORVdfRklMRSwgQklPX1JfTk9fU1VDSF9GSUxFKTsKKyAgICBlbHNlCisgICAgICBCSU9lcnIoQklPX0ZfQklPX05FV19GSUxFLCBFUlJfUl9TWVNfTElCKTsKKyAgICByZXR1cm4gKE5VTEwpOworICB9CisgIGlmICgocmV0ID0gQklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKSB7CiAgICAgZmNsb3NlKGZpbGUpOwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoTlVMTCk7CiAgIH0KIAorICBCSU9fY2xlYXJfZmxhZ3MocmV0LCBCSU9fRkxBR1NfVVBMSU5LKTsgLyogd2UgZGlkIGZvcGVuIC0+IHdlIGRpc2VuZ2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVVBMSU5LICovCiAgIEJJT19zZXRfZnAocmV0LCBmaWxlLCBCSU9fQ0xPU0UpOwotICByZXR1cm4gcmV0OworI2VuZGlmICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgcmV0dXJuIChyZXQpOwogfQogCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19GUF9BUEkpCiBCSU8gKkJJT19uZXdfZnAoRklMRSAqc3RyZWFtLCBpbnQgY2xvc2VfZmxhZykgewotICBCSU8gKnJldCA9IEJJT19uZXcoQklPX3NfZmlsZSgpKTsKKyAgQklPICpyZXQ7CiAKLSAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KKyAgaWYgKChyZXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisgICAgcmV0dXJuIChOVUxMKTsKIAorICBCSU9fc2V0X2ZsYWdzKHJldCwgQklPX0ZMQUdTX1VQTElOSyk7IC8qIHJlZHVuZGFudCwgbGVmdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkb2N1bWVudGF0aW9uIHB1cG9zZXMgKi8KICAgQklPX3NldF9mcChyZXQsIHN0cmVhbSwgY2xvc2VfZmxhZyk7Ci0gIHJldHVybiByZXQ7CisgIHJldHVybiAocmV0KTsKK30KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9OT19GUF9BUEkpCisKK2NvbnN0IEJJT19NRVRIT0QgKkJJT19zX2ZpbGUodm9pZCkgeyByZXR1cm4gKCZtZXRob2RzX2ZpbGVwKTsgfQorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfbmV3KEJJTyAqYmkpIHsKKyAgYmktPmluaXQgPSAwOworICBiaS0+bnVtID0gMDsKKyAgYmktPnB0ciA9IE5VTEw7CisgIGJpLT5mbGFncyA9IEJJT19GTEFHU19VUExJTks7IC8qIGRlZmF1bHQgdG8gVVBMSU5LICovCisgIHJldHVybiAoMSk7CiB9CiAKLXN0YXRpYyBpbnQgZmlsZV9uZXcoQklPICpiaW8pIHsgcmV0dXJuIDE7IH0KLQotc3RhdGljIGludCBmaWxlX2ZyZWUoQklPICpiaW8pIHsKLSAgaWYgKGJpbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7CitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfZnJlZShCSU8gKmEpIHsKKyAgaWYgKGEgPT0gTlVMTCkKKyAgICByZXR1cm4gKDApOworICBpZiAoYS0+c2h1dGRvd24pIHsKKyAgICBpZiAoKGEtPmluaXQpICYmIChhLT5wdHIgIT0gTlVMTCkpIHsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICAgIFNiRmlsZUNsb3NlKChTYkZpbGUpYS0+cHRyKTsKKyNlbHNlICAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgICAgICBpZiAoYS0+ZmxhZ3MgJiBCSU9fRkxBR1NfVVBMSU5LKQorICAgICAgICBVUF9mY2xvc2UoYS0+cHRyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmNsb3NlKGEtPnB0cik7CisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICAgICAgYS0+cHRyID0gTlVMTDsKKyAgICAgIGEtPmZsYWdzID0gQklPX0ZMQUdTX1VQTElOSzsKKyAgICB9CisgICAgYS0+aW5pdCA9IDA7CiAgIH0KLQotICBpZiAoIWJpby0+c2h1dGRvd24pIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmIChiaW8tPmluaXQgJiYgYmlvLT5wdHIgIT0gTlVMTCkgewotICAgIGZjbG9zZShiaW8tPnB0cik7Ci0gICAgYmlvLT5wdHIgPSBOVUxMOwotICB9Ci0gIGJpby0+aW5pdCA9IDA7Ci0KLSAgcmV0dXJuIDE7CisgIHJldHVybiAoMSk7CiB9CiAKLXN0YXRpYyBpbnQgZmlsZV9yZWFkKEJJTyAqYiwgY2hhciAqb3V0LCBpbnQgb3V0bCkgewotICBpZiAoIWItPmluaXQpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHNpemVfdCByZXQgPSBmcmVhZChvdXQsIDEsIG91dGwsIChGSUxFICopYi0+cHRyKTsKLSAgaWYgKHJldCA9PSAwICYmIGZlcnJvcigoRklMRSAqKWItPnB0cikpIHsKLSAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IoKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEVSUl9SX1NZU19MSUIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8vIGZyZWFkIHJlYWRzIGF0IG1vc3QgfG91dGx8IGJ5dGVzLCBzbyB8cmV0fCBmaXRzIGluIGFuIGludC4KLSAgcmV0dXJuIChpbnQpcmV0OwotfQotCi1zdGF0aWMgaW50IGZpbGVfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkgeworc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKSB7CiAgIGludCByZXQgPSAwOwogCi0gIGlmICghYi0+aW5pdCkgewotICAgIHJldHVybiAwOwotICB9CisgIGlmIChiLT5pbml0ICYmIChvdXQgIT0gTlVMTCkpIHsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICByZXQgPSBTYkZpbGVSZWFkKChTYkZpbGUpYi0+cHRyLCBvdXQsIG91dGwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IoKTsKIAotICByZXQgPSBmd3JpdGUoaW4sIGlubCwgMSwgKEZJTEUgKiliLT5wdHIpOwotICBpZiAocmV0ID4gMCkgewotICAgIHJldCA9IGlubDsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgRVJSX1JfU1lTX0xJQik7CisgICAgfQorI2Vsc2UgICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICBpZiAoYi0+ZmxhZ3MgJiBCSU9fRkxBR1NfVVBMSU5LKQorICAgICAgcmV0ID0gVVBfZnJlYWQob3V0LCAxLCAoaW50KW91dGwsIGItPnB0cik7CisgICAgZWxzZQorICAgICAgcmV0ID0gZnJlYWQob3V0LCAxLCAoaW50KW91dGwsIChGSUxFICopYi0+cHRyKTsKKyAgICBpZiAocmV0ID09IDAgJiYgKGItPmZsYWdzICYgQklPX0ZMQUdTX1VQTElOSykgPyBVUF9mZXJyb3IoKEZJTEUgKiliLT5wdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmVycm9yKChGSUxFICopYi0+cHRyKSkgeworICAgICAgU1lTZXJyKFNZU19GX0ZSRUFELCBnZXRfbGFzdF9zeXNfZXJyb3IoKSk7CisgICAgICBCSU9lcnIoQklPX0ZfRklMRV9SRUFELCBFUlJfUl9TWVNfTElCKTsKKyAgICAgIHJldCA9IC0xOworICAgIH0KKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAgIH0KLSAgcmV0dXJuIHJldDsKKyAgcmV0dXJuIChyZXQpOwogfQogCi1zdGF0aWMgbG9uZyBmaWxlX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKSB7CitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkgeworICBpbnQgcmV0ID0gMDsKKworICBpZiAoYi0+aW5pdCAmJiAoaW4gIT0gTlVMTCkpIHsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICByZXQgPSBTYkZpbGVXcml0ZSgoU2JGaWxlKWItPnB0ciwgaW4sIGlubCk7CisjZWxzZSAgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICAgIGlmIChiLT5mbGFncyAmIEJJT19GTEFHU19VUExJTkspCisgICAgICByZXQgPSBVUF9md3JpdGUoaW4sIChpbnQpaW5sLCAxLCBiLT5wdHIpOworICAgIGVsc2UKKyAgICAgIHJldCA9IGZ3cml0ZShpbiwgKGludClpbmwsIDEsIChGSUxFICopYi0+cHRyKTsKKyAgICBpZiAocmV0KQorICAgICAgcmV0ID0gaW5sOworICAgICAgLyogcmV0PWZ3cml0ZShpbiwxLChpbnQpaW5sLChGSUxFICopYi0+cHRyKTsgKi8KKyAgICAgIC8qCisgICAgICAgKiBhY2NvcmRpbmcgdG8gVGltIEh1ZHNvbiA8dGpoQGNyeXB0c29mdC5jb20+LCB0aGUgY29tbWVudGVkIG91dAorICAgICAgICogdmVyc2lvbiBhYm92ZSBjYW4gY2F1c2UgJ2lubCcgd3JpdGUgY2FsbHMgdW5kZXIgc29tZSBzdHVwaWQgc3RkaW8KKyAgICAgICAqIGltcGxlbWVudGF0aW9ucyAoVk1TKQorICAgICAgICovCisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICB9CisgIHJldHVybiAocmV0KTsKK30KKworc3RhdGljIGxvbmcgTVNfQ0FMTEJBQ0sgZmlsZV9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikgewogICBsb25nIHJldCA9IDE7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgIFNiRmlsZSBmcCA9IChTYkZpbGUpYi0+cHRyOworICBTYkZpbGUgKmZwcDsKKyNlbHNlICAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAgIEZJTEUgKmZwID0gKEZJTEUgKiliLT5wdHI7CiAgIEZJTEUgKipmcHA7CisjZW5kaWYgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogICBjaGFyIHBbNF07CiAKICAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIEJJT19DVFJMX1JFU0VUOgotICAgICAgbnVtID0gMDsKLSAgICAgIE9QRU5TU0xfRkFMTFRIUk9VR0g7CiAgICAgY2FzZSBCSU9fQ19GSUxFX1NFRUs6Ci0gICAgICByZXQgPSAobG9uZylmc2VlayhmcCwgbnVtLCAwKTsKKyAgICBjYXNlIEJJT19DVFJMX1JFU0VUOgorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICAgICAgcmV0ID0gKGxvbmcpU2JGaWxlU2VlaygoU2JGaWxlKWItPnB0ciwgbnVtLCBrU2JGaWxlRnJvbUJlZ2luKTsKKyNlbHNlICAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgICAgICBpZiAoYi0+ZmxhZ3MgJiBCSU9fRkxBR1NfVVBMSU5LKQorICAgICAgICByZXQgPSAobG9uZylVUF9mc2VlayhiLT5wdHIsIG51bSwgMCk7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IChsb25nKWZzZWVrKGZwLCBudW0sIDApOworI2VuZGlmICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQklPX0NUUkxfRU9GOgotICAgICAgcmV0ID0gKGxvbmcpZmVvZihmcCk7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgICAgICByZXQgPSAoU2JGaWxlU2VlaygoU2JGaWxlKWItPnB0ciwgMCwga1NiRmlsZUZyb21DdXJyZW50KSA+PQorICAgICAgICAgICAgICAgICAgICAgU2JGaWxlU2VlaygoU2JGaWxlKWItPnB0ciwgMCwga1NiRmlsZUZyb21FbmQpCisgICAgICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgICAgICA6IDApOworI2Vsc2UgICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICAgIGlmIChiLT5mbGFncyAmIEJJT19GTEFHU19VUExJTkspCisgICAgICAgIHJldCA9IChsb25nKVVQX2Zlb2YoZnApOworICAgICAgZWxzZQorICAgICAgICByZXQgPSAobG9uZylmZW9mKGZwKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAgICAgICBicmVhazsKICAgICBjYXNlIEJJT19DX0ZJTEVfVEVMTDoKICAgICBjYXNlIEJJT19DVFJMX0lORk86Ci0gICAgICByZXQgPSBmdGVsbChmcCk7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgICAgICByZXQgPSBTYkZpbGVTZWVrKChTYkZpbGUpYi0+cHRyLCAwLCBrU2JGaWxlRnJvbUN1cnJlbnQpOworI2Vsc2UgICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICAgIGlmIChiLT5mbGFncyAmIEJJT19GTEFHU19VUExJTkspCisgICAgICAgIHJldCA9IFVQX2Z0ZWxsKGItPnB0cik7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IGZ0ZWxsKGZwKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAgICAgICBicmVhazsKICAgICBjYXNlIEJJT19DX1NFVF9GSUxFX1BUUjoKICAgICAgIGZpbGVfZnJlZShiKTsKICAgICAgIGItPnNodXRkb3duID0gKGludCludW0gJiBCSU9fQ0xPU0U7CiAgICAgICBiLT5wdHIgPSBwdHI7CiAgICAgICBiLT5pbml0ID0gMTsKKyNpZiBCSU9fRkxBR1NfVVBMSU5LICE9IDAKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkKF9fTVNWQ1JUX18pICYmICFkZWZpbmVkKF9JT0JfRU5UUklFUykKKyNkZWZpbmUgX0lPQl9FTlRSSUVTIDIwCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9JT0JfRU5UUklFUykKKyAgICAgIC8qIFNhZmV0eSBuZXQgdG8gY2F0Y2ggcHVyZWx5IGludGVybmFsIEJJT19zZXRfZnAgY2FsbHMgKi8KKyAgICAgIGlmICgoc2l6ZV90KXB0ciA+PSAoc2l6ZV90KXN0ZGluICYmCisgICAgICAgICAgKHNpemVfdClwdHIgPCAoc2l6ZV90KShzdGRpbiArIF9JT0JfRU5UUklFUykpCisgICAgICAgIEJJT19jbGVhcl9mbGFncyhiLCBCSU9fRkxBR1NfVVBMSU5LKTsKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgVVBfZnNldG1vZAorICAgICAgaWYgKGItPmZsYWdzICYgQklPX0ZMQUdTX1VQTElOSykKKyAgICAgICAgVVBfZnNldG1vZChiLT5wdHIsIChjaGFyKSgobnVtICYgQklPX0ZQX1RFWFQpID8gJ3QnIDogJ2InKSk7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpCisgICAgICAgIGludCBmZCA9IF9maWxlbm8oKEZJTEUgKilwdHIpOworICAgICAgICBpZiAobnVtICYgQklPX0ZQX1RFWFQpCisgICAgICAgICAgX3NldG1vZGUoZmQsIF9PX1RFWFQpOworICAgICAgICBlbHNlCisgICAgICAgICAgX3NldG1vZGUoZmQsIF9PX0JJTkFSWSk7CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpICYmIGRlZmluZWQoTkVUV0FSRV9DTElCKQorICAgICAgICBpbnQgZmQgPSBmaWxlbm8oKEZJTEUgKilwdHIpOworICAgICAgICAvKiBVbmRlciBDTGliIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBpbiBmaWxlIG1vZGVzICovCisgICAgICAgIGlmIChudW0gJiBCSU9fRlBfVEVYVCkKKyAgICAgICAgICBzZXRtb2RlKGZkLCBPX1RFWFQpOworICAgICAgICBlbHNlCisgICAgICAgICAgc2V0bW9kZShmZCwgT19CSU5BUlkpOworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykKKyAgICAgICAgaW50IGZkID0gZmlsZW5vKChGSUxFICopcHRyKTsKKyAgICAgICAgLyogU2V0IGNvcnJlY3QgdGV4dC9iaW5hcnkgbW9kZSAqLworICAgICAgICBpZiAobnVtICYgQklPX0ZQX1RFWFQpCisgICAgICAgICAgX3NldG1vZGUoZmQsIF9PX1RFWFQpOworICAgICAgICAvKiBEYW5nZXJvdXMgdG8gc2V0IHN0ZGluL3N0ZG91dCB0byByYXcgKHVubGVzcyByZWRpcmVjdGVkKSAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoZmQgPT0gU1RESU5fRklMRU5PIHx8IGZkID09IFNURE9VVF9GSUxFTk8pIHsKKyAgICAgICAgICAgIGlmIChpc2F0dHkoZmQpIDw9IDApCisgICAgICAgICAgICAgIF9zZXRtb2RlKGZkLCBfT19CSU5BUlkpOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX3NldG1vZGUoZmQsIF9PX0JJTkFSWSk7CisgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfT1MyKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyX0NZR1dJTikKKyAgICAgICAgaW50IGZkID0gZmlsZW5vKChGSUxFICopcHRyKTsKKyAgICAgICAgaWYgKG51bSAmIEJJT19GUF9URVhUKQorICAgICAgICAgIHNldG1vZGUoZmQsIE9fVEVYVCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzZXRtb2RlKGZkLCBPX0JJTkFSWSk7CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICAgICAgLyogRG8gbm90aGluZy4gKi8KKyNlbmRpZgorICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgY2FzZSBCSU9fQ19TRVRfRklMRU5BTUU6CiAgICAgICBmaWxlX2ZyZWUoYik7CiAgICAgICBiLT5zaHV0ZG93biA9IChpbnQpbnVtICYgQklPX0NMT1NFOwogICAgICAgaWYgKG51bSAmIEJJT19GUF9BUFBFTkQpIHsKLSAgICAgICAgaWYgKG51bSAmIEJJT19GUF9SRUFEKSB7Ci0gICAgICAgICAgQlVGX3N0cmxjcHkocCwgImErIiwgc2l6ZW9mKHApKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBCVUZfc3RybGNweShwLCAiYSIsIHNpemVvZihwKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoKG51bSAmIEJJT19GUF9SRUFEKSAmJiAobnVtICYgQklPX0ZQX1dSSVRFKSkgewotICAgICAgICBCVUZfc3RybGNweShwLCAicisiLCBzaXplb2YocCkpOwotICAgICAgfSBlbHNlIGlmIChudW0gJiBCSU9fRlBfV1JJVEUpIHsKLSAgICAgICAgQlVGX3N0cmxjcHkocCwgInciLCBzaXplb2YocCkpOwotICAgICAgfSBlbHNlIGlmIChudW0gJiBCSU9fRlBfUkVBRCkgewotICAgICAgICBCVUZfc3RybGNweShwLCAiciIsIHNpemVvZihwKSk7Ci0gICAgICB9IGVsc2UgeworICAgICAgICBpZiAobnVtICYgQklPX0ZQX1JFQUQpCisgICAgICAgICAgQlVGX3N0cmxjcHkocCwgImErIiwgc2l6ZW9mIHApOworICAgICAgICBlbHNlCisgICAgICAgICAgQlVGX3N0cmxjcHkocCwgImEiLCBzaXplb2YgcCk7CisgICAgICB9IGVsc2UgaWYgKChudW0gJiBCSU9fRlBfUkVBRCkgJiYgKG51bSAmIEJJT19GUF9XUklURSkpCisgICAgICAgIEJVRl9zdHJsY3B5KHAsICJyKyIsIHNpemVvZiBwKTsKKyAgICAgIGVsc2UgaWYgKG51bSAmIEJJT19GUF9XUklURSkKKyAgICAgICAgQlVGX3N0cmxjcHkocCwgInciLCBzaXplb2YgcCk7CisgICAgICBlbHNlIGlmIChudW0gJiBCSU9fRlBfUkVBRCkKKyAgICAgICAgQlVGX3N0cmxjcHkocCwgInIiLCBzaXplb2YgcCk7CisgICAgICBlbHNlIHsKICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9CQURfRk9QRU5fTU9ERSk7CiAgICAgICAgIHJldCA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgXAorICAgIGRlZmluZWQoT1BFTlNTTF9TWVNfT1MyKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyX0NZR1dJTikKKyAgICAgIGlmICghKG51bSAmIEJJT19GUF9URVhUKSkKKyAgICAgICAgT1BFTlNTTF9wb3J0X3N0cmNhdChwLCAiYiIpOworICAgICAgZWxzZQorICAgICAgICBPUEVOU1NMX3BvcnRfc3RyY2F0KHAsICJ0Iik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisgICAgICBpZiAoIShudW0gJiBCSU9fRlBfVEVYVCkpCisgICAgICAgIE9QRU5TU0xfcG9ydF9zdHJjYXQocCwgImIiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT1BFTlNTTF9wb3J0X3N0cmNhdChwLCAidCIpOworI2VuZGlmCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgICAgICB7CisgICAgICAgIFNiRmlsZUVycm9yIGVycm9yID0ga1NiRmlsZU9rOworICAgICAgICBmcCA9IFNiRmlsZU9wZW4oKGNvbnN0IGNoYXIgKilwdHIsIFNiRmlsZU1vZGVTdHJpbmdUb0ZsYWdzKHApLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgICAgaWYgKCFTYkZpbGVJc1ZhbGlkKGZwKSkgeworICAgICAgICAgIE9QRU5TU0xfUFVUX1NZU1RFTV9FUlJPUigpOworICAgICAgICAgIEVSUl9hZGRfZXJyb3JfZGF0YSg1LCAiU2JGaWxlT3BlbignIiwgcHRyLCAiJywnIiwgcCwgIicpIik7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9TWVNfTElCKTsKKyAgICAgICAgICByZXQgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGItPnB0ciA9IGZwOworICAgICAgICBiLT5pbml0ID0gMTsKKyAgICAgICAgQklPX2NsZWFyX2ZsYWdzKGIsIEJJT19GTEFHU19VUExJTkspOyAvKiBkaXNlbmdhZ2UgVVBMSU5LICovCisgICAgICB9CisjZWxzZSAgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogICAgICAgZnAgPSBmb3BlbihwdHIsIHApOwogICAgICAgaWYgKGZwID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKCk7CisgICAgICAgIFNZU2VycihTWVNfRl9GT1BFTiwgZ2V0X2xhc3Rfc3lzX2Vycm9yKCkpOwogICAgICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNSwgImZvcGVuKCciLCBwdHIsICInLCciLCBwLCAiJykiKTsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9TWVNfTElCKTsKKyAgICAgICAgQklPZXJyKEJJT19GX0ZJTEVfQ1RSTCwgRVJSX1JfU1lTX0xJQik7CiAgICAgICAgIHJldCA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgYi0+cHRyID0gZnA7CiAgICAgICBiLT5pbml0ID0gMTsKKyAgICAgIEJJT19jbGVhcl9mbGFncyhiLCBCSU9fRkxBR1NfVVBMSU5LKTsgLyogd2UgZGlkIGZvcGVuIC0+IHdlIGRpc2VuZ2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBVUExJTksgKi8KKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAgICAgICBicmVhazsKICAgICBjYXNlIEJJT19DX0dFVF9GSUxFX1BUUjoKLSAgICAgIC8vIHRoZSBwdHIgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IGEgRklMRSAqKiBpbiB0aGlzIGNhc2UuCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgICAgICAvKiB0aGUgcHRyIHBhcmFtZXRlciBpcyBhY3R1YWxseSBhIFNiRmlsZSAqIGluIHRoaXMgY2FzZS4gKi8KKyAgICAgIGlmIChwdHIgIT0gTlVMTCkgeworICAgICAgICBmcHAgPSAoU2JGaWxlICopcHRyOworICAgICAgICAqZnBwID0gKFNiRmlsZSliLT5wdHI7CisgICAgICB9CisjZWxzZSAgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICAgICAgLyogdGhlIHB0ciBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYSBGSUxFICoqIGluIHRoaXMgY2FzZS4gKi8KICAgICAgIGlmIChwdHIgIT0gTlVMTCkgewogICAgICAgICBmcHAgPSAoRklMRSAqKilwdHI7CiAgICAgICAgICpmcHAgPSAoRklMRSAqKWItPnB0cjsKICAgICAgIH0KKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAgICAgICBicmVhazsKICAgICBjYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKICAgICAgIHJldCA9IChsb25nKWItPnNodXRkb3duOwpAQCAtMjQ5LDcxICs1MTksODMgQEAKICAgICAgIGItPnNodXRkb3duID0gKGludCludW07CiAgICAgICBicmVhazsKICAgICBjYXNlIEJJT19DVFJMX0ZMVVNIOgotICAgICAgcmV0ID0gMCA9PSBmZmx1c2goKEZJTEUgKiliLT5wdHIpOworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICAgICAgU2JGaWxlRmx1c2goKFNiRmlsZSliLT5wdHIpOworI2Vsc2UgICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgICAgIGlmIChiLT5mbGFncyAmIEJJT19GTEFHU19VUExJTkspCisgICAgICAgIFVQX2ZmbHVzaChiLT5wdHIpOworICAgICAgZWxzZQorICAgICAgICBmZmx1c2goKEZJTEUgKiliLT5wdHIpOworI2VuZGlmICAvLyBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICAgICAgIGJyZWFrOworICAgIGNhc2UgQklPX0NUUkxfRFVQOgorICAgICAgcmV0ID0gMTsKKyAgICAgIGJyZWFrOworCiAgICAgY2FzZSBCSU9fQ1RSTF9XUEVORElORzoKICAgICBjYXNlIEJJT19DVFJMX1BFTkRJTkc6CisgICAgY2FzZSBCSU9fQ1RSTF9QVVNIOgorICAgIGNhc2UgQklPX0NUUkxfUE9QOgogICAgIGRlZmF1bHQ6CiAgICAgICByZXQgPSAwOwogICAgICAgYnJlYWs7CiAgIH0KLSAgcmV0dXJuIHJldDsKKyAgcmV0dXJuIChyZXQpOwogfQogCi1zdGF0aWMgaW50IGZpbGVfZ2V0cyhCSU8gKmJwLCBjaGFyICpidWYsIGludCBzaXplKSB7CitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfZ2V0cyhCSU8gKmJwLCBjaGFyICpidWYsIGludCBzaXplKSB7CiAgIGludCByZXQgPSAwOwogCi0gIGlmIChzaXplID09IDApIHsKLSAgICByZXR1cm4gMDsKKyAgYnVmWzBdID0gJ1wwJzsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyAgcmV0ID0gLTE7CisgIFNiRmlsZUluZm8gaW5mbzsKKyAgU2JGaWxlR2V0SW5mbygoU2JGaWxlKWJwLT5wdHIsICZpbmZvKTsKKyAgaW50NjRfdCBjdXJyZW50ID0gU2JGaWxlU2VlaygoU2JGaWxlKWJwLT5wdHIsIGtTYkZpbGVGcm9tQ3VycmVudCwgMCk7CisgIGludDY0X3QgcmVtYWluaW5nID0gaW5mby5zaXplIC0gY3VycmVudDsKKyAgaW50NjRfdCBtYXggPSAoc2l6ZSA+IHJlbWFpbmluZyA/IHJlbWFpbmluZyA6IHNpemUgLSAxKTsKKyAgaW50IGluZGV4ID0gMDsKKyAgZm9yICg7IGluZGV4IDwgbWF4OyArK2luZGV4KSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBjb3VudCA9IFNiRmlsZVJlYWQoKFNiRmlsZSlicC0+cHRyLCBidWYgKyBpbmRleCwgMSk7CisgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICByZXR1cm4gKHJldCk7CisgICAgfQorICAgIGlmIChidWZbaW5kZXhdID09ICdcbicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KICAgfQotCi0gIGlmICghZmdldHMoYnVmLCBzaXplLCAoRklMRSAqKWJwLT5wdHIpKSB7Ci0gICAgYnVmWzBdID0gMDsKLSAgICBnb3RvIGVycjsKKyAgYnVmW2luZGV4XSA9ICdcMCc7CisgIHJldCA9IDA7CisjZWxzZSAgIC8vIGRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICBpZiAoYnAtPmZsYWdzICYgQklPX0ZMQUdTX1VQTElOSykgeworICAgIGlmICghVVBfZmdldHMoYnVmLCBzaXplLCBicC0+cHRyKSkKKyAgICAgIGdvdG8gZXJyOworICB9IGVsc2UgeworICAgIGlmICghZmdldHMoYnVmLCBzaXplLCAoRklMRSAqKWJwLT5wdHIpKQorICAgICAgZ290byBlcnI7CiAgIH0KLSAgcmV0ID0gc3RybGVuKGJ1Zik7Ci0KKyNlbmRpZiAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisgIGlmIChidWZbMF0gIT0gJ1wwJykKKyAgICByZXQgPSBPUEVOU1NMX3BvcnRfc3RybGVuKGJ1Zik7CiBlcnI6Ci0gIHJldHVybiByZXQ7CisgIHJldHVybiAocmV0KTsKIH0KIAotc3RhdGljIGNvbnN0IEJJT19NRVRIT0QgbWV0aG9kc19maWxlcCA9IHsKLSAgICBCSU9fVFlQRV9GSUxFLCAgICJGSUxFIHBvaW50ZXIiLAotICAgIGZpbGVfd3JpdGUsICAgICAgZmlsZV9yZWFkLAotICAgIE5VTEwgLyogcHV0cyAqLywgZmlsZV9nZXRzLAotICAgIGZpbGVfY3RybCwgICAgICAgZmlsZV9uZXcsCi0gICAgZmlsZV9mcmVlLCAgICAgICBOVUxMIC8qIGNhbGxiYWNrX2N0cmwgKi8sCi19Oworc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKSB7CisgIGludCBuLCByZXQ7CiAKLWNvbnN0IEJJT19NRVRIT0QgKkJJT19zX2ZpbGUodm9pZCkgeyByZXR1cm4gJm1ldGhvZHNfZmlsZXA7IH0KLQotCi1pbnQgQklPX2dldF9mcChCSU8gKmJpbywgRklMRSAqKm91dF9maWxlKSB7Ci0gIHJldHVybiBCSU9fY3RybChiaW8sIEJJT19DX0dFVF9GSUxFX1BUUiwgMCwgKGNoYXIqKSBvdXRfZmlsZSk7CisgIG4gPSBPUEVOU1NMX3BvcnRfc3RybGVuKHN0cik7CisgIHJldCA9IGZpbGVfd3JpdGUoYnAsIHN0ciwgbik7CisgIHJldHVybiAocmV0KTsKIH0KIAotaW50IEJJT19zZXRfZnAoQklPICpiaW8sIEZJTEUgKmZpbGUsIGludCBjbG9zZV9mbGFnKSB7Ci0gIHJldHVybiBCSU9fY3RybChiaW8sIEJJT19DX1NFVF9GSUxFX1BUUiwgY2xvc2VfZmxhZywgKGNoYXIgKikgZmlsZSk7Ci19CisjZW5kaWYgLyogT1BFTlNTTF9OT19TVERJTyAqLwogCi1pbnQgQklPX3JlYWRfZmlsZW5hbWUoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7Ci0gIHJldHVybiBCSU9fY3RybChiaW8sIEJJT19DX1NFVF9GSUxFTkFNRSwgQklPX0NMT1NFIHwgQklPX0ZQX1JFQUQsCi0gICAgICAgICAgICAgICAgICAoY2hhciAqKWZpbGVuYW1lKTsKLX0KLQotaW50IEJJT193cml0ZV9maWxlbmFtZShCSU8gKmJpbywgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKLSAgcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfU0VUX0ZJTEVOQU1FLCBCSU9fQ0xPU0UgfCBCSU9fRlBfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAoY2hhciAqKWZpbGVuYW1lKTsKLX0KLQotaW50IEJJT19hcHBlbmRfZmlsZW5hbWUoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7Ci0gIHJldHVybiBCSU9fY3RybChiaW8sIEJJT19DX1NFVF9GSUxFTkFNRSwgQklPX0NMT1NFIHwgQklPX0ZQX0FQUEVORCwKLSAgICAgICAgICAgICAgICAgIChjaGFyICopZmlsZW5hbWUpOwotfQotCi1pbnQgQklPX3J3X2ZpbGVuYW1lKEJJTyAqYmlvLCBjb25zdCBjaGFyICpmaWxlbmFtZSkgewotICByZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ19TRVRfRklMRU5BTUUsCi0gICAgICAgICAgICAgICAgICBCSU9fQ0xPU0UgfCBCSU9fRlBfUkVBRCB8IEJJT19GUF9XUklURSwgKGNoYXIgKilmaWxlbmFtZSk7Ci19Ci0KLSNlbmRpZiAgLy8gT1BFTlNTTF9UUlVTVFkKKyNlbmRpZiAvKiBIRUFERVJfQlNTX0ZJTEVfQyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2Jpby9oZXhkdW1wLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYmlvL2hleGR1bXAuYwppbmRleCA2ZDkyOGJjLi42NmNmZDJlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYmlvL2hleGR1bXAuYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYmlvL2hleGR1bXAuYwpAQCAtNTQsMTAgKzU0LDEzIEBACiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KLQorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CiAKICNpbmNsdWRlICIuLi9pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYmlvL3NvY2tldF9oZWxwZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9iaW8vc29ja2V0X2hlbHBlci5jCmluZGV4IGQ0MjA5ZDAuLjdhM2IzMWIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9iaW8vc29ja2V0X2hlbHBlci5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9iaW8vc29ja2V0X2hlbHBlci5jCkBAIC0xMiwyMCArMTIsMjkgQEAKICAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCiAKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjdW5kZWYgX1BPU0lYX0NfU09VUkNFCiAjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KIAogI2lmICFkZWZpbmVkKE9QRU5TU0xfVFJVU1RZKQogCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQogI2lmICFkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2Vsc2UKIE9QRU5TU0xfTVNWQ19QUkFHTUEod2FybmluZyhwdXNoLCAzKSkKQEAgLTM3LDEyICs0NiwxNSBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKIAotCisvLyB8Z2V0YWRkcmluZm98IGlzIHBsYXRmb3JtIHJlbGV0ZWQsIGl0J3Mgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLgorLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaWYgd2UgdXNlIEJJT19uZXdfY29ubmVjdC4gQXMgd2UgZG9uJ3QgdXNlIAorLy8gQklPX25ld19jb25uZWN0LCB1c2UgZW1wdHkgaW1wbGVtdGF0aW9uIHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzLgogaW50IGJpb19pcF9hbmRfcG9ydF90b19zb2NrZXRfYW5kX2FkZHIoaW50ICpvdXRfc29jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpvdXRfYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCAqb3V0X2FkZHJfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwb3J0X3N0cikgeworI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICAgc3RydWN0IGFkZHJpbmZvIGhpbnQsICpyZXN1bHQsICpjdXI7CiAgIGludCByZXQ7CiAKQEAgLTgyLDYgKzk0LDEwIEBACiBvdXQ6CiAgIGZyZWVhZGRyaW5mbyhyZXN1bHQpOwogICByZXR1cm4gcmV0OworI2Vsc2UgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorICBTQl9OT1RSRUFDSEVEKCk7CisgIHJldHVybiAwOworI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiB9CiAKIGludCBiaW9fc29ja2V0X25iaW8oaW50IHNvY2ssIGludCBvbikgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2J1Zi9idWYuYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9idWYvYnVmLmMKaW5kZXggMTQ2YjFlMC4uMzZmMzI3MSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2J1Zi9idWYuYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vYnVmL2J1Zi5jCkBAIC01NCwxMiArNTQsMTQgQEAKICAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKICAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogCi0jaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KIAogI2luY2x1ZGUgIi4uL2ludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2Jlci5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvYmVyLmMKaW5kZXggNzQzNzIzOS4uNTRiN2UzYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvYmVyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvYmVyLmMKQEAgLTEyLDEwICsxMiwxNCBAQAogICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY2hhY2hhL2NoYWNoYS5jCmluZGV4IGVhYzUxYTUuLmQwMGU3NjEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2NoYWNoYS9jaGFjaGEuYwpAQCAtMTQsMTEgKzE0LDEzIEBACiAKIC8vIEFkYXB0ZWQgZnJvbSB0aGUgcHVibGljIGRvbWFpbiwgZXN0cmVhbSBjb2RlIGJ5IEQuIEJlcm5zdGVpbi4KIAotI2luY2x1ZGUgPG9wZW5zc2wvY2hhY2hhLmg+Ci0KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotCisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY2hhY2hhLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KIAogI2luY2x1ZGUgIi4uL2ludGVybmFsLmgiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY2lwaGVyX2V4dHJhL2VfbnVsbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2NpcGhlcl9leHRyYS9lX251bGwuYwppbmRleCBmNWZlOGZiLi41YjdjNTdlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY2lwaGVyX2V4dHJhL2VfbnVsbC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jaXBoZXJfZXh0cmEvZV9udWxsLmMKQEAgLTU0LDkgKzU0LDEzIEBACiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9jaXBoZXIuaD4KLQorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKw0KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY2lwaGVyLmg+CiAKICNpbmNsdWRlIDxvcGVuc3NsL25pZC5oPgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY2lwaGVyX2V4dHJhL3Rsc19jYmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jaXBoZXJfZXh0cmEvdGxzX2NiYy5jCmluZGV4IGEyNDYwMmIuLjc4MTA4MTcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jaXBoZXJfZXh0cmEvdGxzX2NiYy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jaXBoZXJfZXh0cmEvdGxzX2NiYy5jCkBAIC01MCw5ICs1MCwxMiBAQAogICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQogICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCiAKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotCisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9uaWQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2NwdS1hYXJjaDY0LWxpbnV4LmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY3B1LWFhcmNoNjQtbGludXguYwppbmRleCAwMTg0ZGQ0Li5mOWZhNmM1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY3B1LWFhcmNoNjQtbGludXguYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY3B1LWFhcmNoNjQtbGludXguYwpAQCAtMTQsOCArMTQsNyBAQAogCiAjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KIAotI2lmIGRlZmluZWQoT1BFTlNTTF9BQVJDSDY0KSAmJiBkZWZpbmVkKE9QRU5TU0xfTElOVVgpICYmIFwKLSAgICAhZGVmaW5lZChPUEVOU1NMX1NUQVRJQ19BUk1DQVApCisjaWYgZGVmaW5lZChPUEVOU1NMX0FBUkNINjQpICYmICFkZWZpbmVkKE9QRU5TU0xfU1RBVElDX0FSTUNBUCkKIAogI2luY2x1ZGUgPHN5cy9hdXh2Lmg+CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jcHUtYXJtLWxpbnV4LmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY3B1LWFybS1saW51eC5jCmluZGV4IDgzOWI2MzIuLjBmNDE2ZjggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jcHUtYXJtLWxpbnV4LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2NwdS1hcm0tbGludXguYwpAQCAtMTIsNiArMTIsOCBAQAogICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KIAorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvY3B1Lmg+CiAKICNpZiBkZWZpbmVkKE9QRU5TU0xfQVJNKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NUQVRJQ19BUk1DQVApCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY3B1LWludGVsLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vY3B1LWludGVsLmMKaW5kZXggNzAxZWJlZC4uOTlmOGI4YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2NwdS1pbnRlbC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9jcHUtaW50ZWwuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAgIE9QRU5TU0xfaWEzMmNhcF9QWzNdID0gZXh0ZW5kZWRfZmVhdHVyZXNbMV07CiAKICAgY29uc3QgY2hhciAqZW52MSwgKmVudjI7Ci0gIGVudjEgPSBnZXRlbnYoIk9QRU5TU0xfaWEzMmNhcCIpOworICBlbnYxID0gT1BFTlNTTF9wb3J0X2dldGVudigiT1BFTlNTTF9pYTMyY2FwIik7CiAgIGlmIChlbnYxID09IE5VTEwpIHsKICAgICByZXR1cm47CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9kaWdlc3RfZXh0cmEvZGlnZXN0X2V4dHJhLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZGlnZXN0X2V4dHJhL2RpZ2VzdF9leHRyYS5jCmluZGV4IDRiNGJiMzguLjQzZDA5Y2YgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9kaWdlc3RfZXh0cmEvZGlnZXN0X2V4dHJhLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2RpZ2VzdF9leHRyYS9kaWdlc3RfZXh0cmEuYwpAQCAtNTQsMTAgKzU0LDEyIEBACiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KLQorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KICNpbmNsdWRlIDxvcGVuc3NsL25pZC5oPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2V2cC9ldnBfYXNuMS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2V2cC9ldnBfYXNuMS5jCmluZGV4IDgxYzdhNzEuLjdiNWQ0ZWEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9ldnAvZXZwX2FzbjEuYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZXZwL2V2cF9hc24xLmMKQEAgLTUzLDExICs1MywxMiBAQAogICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZWNfa2V5Lmg+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZXZwL3Bia2RmLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZXZwL3Bia2RmLmMKaW5kZXggZjIzYTc0Yi4uOWI0YTVmNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2V2cC9wYmtkZi5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9ldnAvcGJrZGYuYwpAQCAtNTMsMTAgKzUzLDEyIEBACiAgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCiAgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPHN0cmluZy5oPgotCisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CiAKICNpbmNsdWRlICIuLi9pbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2ZpcHNtb2R1bGUvbW9kZXMvaW50ZXJuYWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9maXBzbW9kdWxlL21vZGVzL2ludGVybmFsLmgKaW5kZXggMzM4YmYxMy4uNWI0OTVkMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2ZpcHNtb2R1bGUvbW9kZXMvaW50ZXJuYWwuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZmlwc21vZHVsZS9tb2Rlcy9pbnRlcm5hbC5oCkBAIC00OSw3ICs0OSwxMyBAQAogI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9NT0RFU19JTlRFUk5BTF9ICiAjZGVmaW5lIE9QRU5TU0xfSEVBREVSX01PREVTX0lOVEVSTkFMX0gKIAorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2ZpcHNtb2R1bGUvcmFuZC9yYW5kLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZmlwc21vZHVsZS9yYW5kL3JhbmQuYwppbmRleCAwMmU2M2JjLi4yZTVjYzZiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZmlwc21vZHVsZS9yYW5kL3JhbmQuYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vZmlwc21vZHVsZS9yYW5kL3JhbmQuYwpAQCAtNTQsNyArNTQsMTcgQEAKIC8vIGNvbnRpbnVvdXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGVzdCBpbiBGSVBTIDE0MC0yLCBzZWN0aW9uIDQuOS4yLgogI2RlZmluZSBDUk5HVF9CTE9DS19TSVpFIDE2CiAKLSNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorCitzdGF0aWMgaW50IGh3cmFuZCh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pIHsKKyAgaWYgKGxlbiAmJiBidWYpIHsKKyAgICBTYlN5c3RlbUdldFJhbmRvbURhdGEoYnVmLCBsZW4pOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAogICAgICFkZWZpbmVkKEJPUklOR1NTTF9VTlNBRkVfREVURVJNSU5JU1RJQ19NT0RFKQogCiAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gYXNtL3JkcmFuZC14ODZfNjQucGwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9maXBzbW9kdWxlL3JhbmQvdXJhbmRvbS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2ZpcHNtb2R1bGUvcmFuZC91cmFuZG9tLmMKaW5kZXggZTZkNzc5Yy4uMGVkODcwYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2ZpcHNtb2R1bGUvcmFuZC91cmFuZG9tLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2ZpcHNtb2R1bGUvcmFuZC91cmFuZG9tLmMKQEAgLTE5LDcgKzE5LDggQEAKICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KIAogI2lmICFkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykgJiYgIWRlZmluZWQoT1BFTlNTTF9GVUNIU0lBKSAmJiBcCi0gICAgIWRlZmluZWQoQk9SSU5HU1NMX1VOU0FGRV9ERVRFUk1JTklTVElDX01PREUpICYmICFkZWZpbmVkKE9QRU5TU0xfVFJVU1RZKQorICAgICFkZWZpbmVkKEJPUklOR1NTTF9VTlNBRkVfREVURVJNSU5JU1RJQ19NT0RFKSAmJiAgICAgICAgICBcCisgICAgIWRlZmluZWQoT1BFTlNTTF9UUlVTVFkpICYmICFkZWZpbmVkKFNUQVJCT0FSRCkKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC0yOTYsNSArMjk3LDYgQEAKICNlbmRpZgogfQogCi0jZW5kaWYgLyogIU9QRU5TU0xfV0lORE9XUyAmJiAhZGVmaW5lZChPUEVOU1NMX0ZVQ0hTSUEpICYmIFwKLSAgICAgICAgICAhQk9SSU5HU1NMX1VOU0FGRV9ERVRFUk1JTklTVElDX01PREUgJiYgIU9QRU5TU0xfVFJVU1RZICovCisjZW5kaWYgLyogIU9QRU5TU0xfV0lORE9XUyAmJiAhZGVmaW5lZChPUEVOU1NMX0ZVQ0hTSUEpICYmICAgICAgICAgICBcCisgICAgICAgICAgIUJPUklOR1NTTF9VTlNBRkVfREVURVJNSU5JU1RJQ19NT0RFICYmICFPUEVOU1NMX1RSVVNUWSAmJiBcCisgICAgICAgICAgIWRlZmluZWQoU1RBUkJPQVJEKSAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2hrZGYvaGtkZi5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL2hrZGYvaGtkZi5jCmluZGV4IDIzYjYwYWYuLjk4ZDBlZGUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9oa2RmL2hrZGYuYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vaGtkZi9oa2RmLmMKQEAgLTEyLDExICsxMiwxMyBAQAogICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvaGtkZi5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLQorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2hrZGYuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vaW50ZXJuYWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9pbnRlcm5hbC5oCmluZGV4IGM0ZTJlNTEuLjY0M2MzODkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9pbnRlcm5hbC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9pbnRlcm5hbC5oCkBAIC00MzcsNiArNDM3LDExIEBACiBzdHJ1Y3QgQ1JZUFRPX1NUQVRJQ19NVVRFWCB7CiAgIHB0aHJlYWRfcndsb2NrX3QgbG9jazsKIH07CisKKyNpZiAhZGVmaW5lZChQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUikKKyNkZWZpbmUgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIge3t7MSwgMH19fQorI2VuZGlmCisKICNkZWZpbmUgQ1JZUFRPX1NUQVRJQ19NVVRFWF9JTklUIHsgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIgfQogI2Vsc2UKICNlcnJvciAiVW5rbm93biB0aHJlYWRpbmcgbGlicmFyeSIKQEAgLTY0Miw4MyArNjQ3LDYgQEAKICNlbmRpZgogCiAKLS8vIExhbmd1YWdlIGJ1ZyB3b3JrYXJvdW5kcy4KLS8vCi0vLyBNb3N0IEMgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMgYXJlIHVuZGVmaW5lZCBpZiBwYXNzZWQgTlVMTCwgZXZlbiB3aGVuIHRoZQotLy8gY29ycmVzcG9uZGluZyBsZW5ndGggaXMgemVyby4gVGhpcyBnaXZlcyB0aGVtIChhbmQsIGluIHR1cm4sIGFsbCBmdW5jdGlvbnMKLS8vIHdoaWNoIGNhbGwgdGhlbSkgc3VycHJpc2luZyBiZWhhdmlvciBvbiBlbXB0eSBhcnJheXMuIFNvbWUgY29tcGlsZXJzIHdpbGwKLS8vIG1pc2NvbXBpbGUgY29kZSBkdWUgdG8gdGhpcyBydWxlLiBTZWUgYWxzbwotLy8gaHR0cHM6Ly93d3cuaW1wZXJpYWx2aW9sZXQub3JnLzIwMTYvMDYvMjYvbm9ubnVsbC5odG1sCi0vLwotLy8gVGhlc2Ugd3JhcHBlciBmdW5jdGlvbnMgYmVoYXZlIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIEMgc3RhbmRhcmQKLS8vIGZ1bmN0aW9ucywgYnV0IGJlaGF2ZSBhcyBleHBlY3RlZCB3aGVuIHBhc3NlZCBOVUxMIGlmIHRoZSBsZW5ndGggaXMgemVyby4KLS8vCi0vLyBOb3RlIHxPUEVOU1NMX21lbWNtcHwgaXMgYSBkaWZmZXJlbnQgZnVuY3Rpb24gZnJvbSB8Q1JZUFRPX21lbWNtcHwuCi0KLS8vIEMrKyBkZWZpbmVzIHxtZW1jaHJ8IGFzIGEgY29uc3QtY29ycmVjdCBvdmVybG9hZC4KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICJDKysiIHsKLQotc3RhdGljIGlubGluZSBjb25zdCB2b2lkICpPUEVOU1NMX21lbWNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pIHsKLSAgaWYgKG4gPT0gMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIG1lbWNocihzLCBjLCBuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpPUEVOU1NMX21lbWNocih2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pIHsKLSAgaWYgKG4gPT0gMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIG1lbWNocihzLCBjLCBuKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDKysiCi0jZWxzZSAgLy8gX19jcGx1c3BsdXMKLQotc3RhdGljIGlubGluZSB2b2lkICpPUEVOU1NMX21lbWNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pIHsKLSAgaWYgKG4gPT0gMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIG1lbWNocihzLCBjLCBuKTsKLX0KLQotI2VuZGlmICAvLyBfX2NwbHVzcGx1cwotCi1zdGF0aWMgaW5saW5lIGludCBPUEVOU1NMX21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKSB7Ci0gIGlmIChuID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBtZW1jbXAoczEsIHMyLCBuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpPUEVOU1NMX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pIHsKLSAgaWYgKG4gPT0gMCkgewotICAgIHJldHVybiBkc3Q7Ci0gIH0KLQotICByZXR1cm4gbWVtY3B5KGRzdCwgc3JjLCBuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpPUEVOU1NMX21lbW1vdmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKSB7Ci0gIGlmIChuID09IDApIHsKLSAgICByZXR1cm4gZHN0OwotICB9Ci0KLSAgcmV0dXJuIG1lbW1vdmUoZHN0LCBzcmMsIG4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKk9QRU5TU0xfbWVtc2V0KHZvaWQgKmRzdCwgaW50IGMsIHNpemVfdCBuKSB7Ci0gIGlmIChuID09IDApIHsKLSAgICByZXR1cm4gZHN0OwotICB9Ci0KLSAgcmV0dXJuIG1lbXNldChkc3QsIGMsIG4pOwotfQogCiAjaWYgZGVmaW5lZChCT1JJTkdTU0xfRklQUykKIC8vIEJPUklOR1NTTF9GSVBTX2Fib3J0IGlzIGNhbGxlZCB3aGVuIGEgRklQUyBwb3dlci1vbiBvciBjb250aW51b3VzIHRlc3QKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9tZW1fc3RhcmJvYXJkLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vbWVtX3N0YXJib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YzJmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vbWVtX3N0YXJib2FyZC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTggKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbHNlCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisKKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCitPUEVOU1NMX01TVkNfUFJBR01BKHdhcm5pbmcocHVzaCwgMykpCisjaW5jbHVkZSA8d2luZG93cy5oPgorT1BFTlNTTF9NU1ZDX1BSQUdNQSh3YXJuaW5nKHBvcCkpCisjZW5kaWYKKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgT1BFTlNTTF9NQUxMT0NfUFJFRklYIDgKKwordm9pZCAqT1BFTlNTTF9tYWxsb2Moc2l6ZV90IHNpemUpIHsKKworICB2b2lkICpwdHIgPSBTYk1lbW9yeUFsbG9jYXRlKHNpemUgKyBPUEVOU1NMX01BTExPQ19QUkVGSVgpOworICBpZiAocHRyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgICooc2l6ZV90ICopcHRyID0gc2l6ZTsKKworICByZXR1cm4gKCh1aW50OF90ICopcHRyKSArIE9QRU5TU0xfTUFMTE9DX1BSRUZJWDsKK30KKwordm9pZCBPUEVOU1NMX2ZyZWUodm9pZCAqb3JpZ19wdHIpIHsKKyAgaWYgKG9yaWdfcHRyID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2b2lkICpwdHIgPSAoKHVpbnQ4X3QgKilvcmlnX3B0cikgLSBPUEVOU1NMX01BTExPQ19QUkVGSVg7CisKKyAgc2l6ZV90IHNpemUgPSAqKHNpemVfdCAqKXB0cjsKKyAgT1BFTlNTTF9jbGVhbnNlKHB0ciwgc2l6ZSArIE9QRU5TU0xfTUFMTE9DX1BSRUZJWCk7CisgIFNiTWVtb3J5RGVhbGxvY2F0ZShwdHIpOworfQorCit2b2lkICpPUEVOU1NMX3JlYWxsb2Modm9pZCAqb3JpZ19wdHIsIHNpemVfdCBuZXdfc2l6ZSkgeworICBpZiAob3JpZ19wdHIgPT0gTlVMTCkgeworICAgIHJldHVybiBPUEVOU1NMX21hbGxvYyhuZXdfc2l6ZSk7CisgIH0KKworICB2b2lkICpwdHIgPSAoKHVpbnQ4X3QgKilvcmlnX3B0cikgLSBPUEVOU1NMX01BTExPQ19QUkVGSVg7CisgIHNpemVfdCBvbGRfc2l6ZSA9ICooc2l6ZV90ICopcHRyOworCisgIHZvaWQgKnJldCA9IE9QRU5TU0xfbWFsbG9jKG5ld19zaXplKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzaXplX3QgdG9fY29weSA9IG5ld19zaXplOworICBpZiAob2xkX3NpemUgPCB0b19jb3B5KSB7CisgICAgdG9fY29weSA9IG9sZF9zaXplOworICB9CisKKyAgU2JNZW1vcnlDb3B5KHJldCwgb3JpZ19wdHIsIHRvX2NvcHkpOworICBPUEVOU1NMX2ZyZWUob3JpZ19wdHIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgT1BFTlNTTF9jbGVhbnNlKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikgeworI2lmIGRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKQorICBTZWN1cmVaZXJvTWVtb3J5KHB0ciwgbGVuKTsKKyNlbHNlCisgIE9QRU5TU0xfbWVtc2V0KHB0ciwgMCwgbGVuKTsKKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorICAvKiBBcyBiZXN0IGFzIHdlIGNhbiB0ZWxsLCB0aGlzIGlzIHN1ZmZpY2llbnQgdG8gYnJlYWsgYW55IG9wdGltaXNhdGlvbnMgdGhhdAorICAgICBtaWdodCB0cnkgdG8gZWxpbWluYXRlICJzdXBlcmZsdW91cyIgbWVtc2V0cy4gSWYgdGhlcmUncyBhbiBlYXN5IHdheSB0bworICAgICBkZXRlY3QgbWVtc2V0X3MsIGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgdGhhdC4gKi8KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oIiIgOiA6ICJyIihwdHIpIDogIm1lbW9yeSIpOworI2VuZGlmCisjZW5kaWYgIC8vICFPUEVOU1NMX05PX0FTTQorfQorCitpbnQgQ1JZUFRPX21lbWNtcChjb25zdCB2b2lkICppbl9hLCBjb25zdCB2b2lkICppbl9iLCBzaXplX3QgbGVuKSB7CisgIGNvbnN0IHVpbnQ4X3QgKmEgPSBpbl9hOworICBjb25zdCB1aW50OF90ICpiID0gaW5fYjsKKyAgdWludDhfdCB4ID0gMDsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgeCB8PSBhW2ldIF4gYltpXTsKKyAgfQorCisgIHJldHVybiB4OworfQorCitjb25zdCB2b2lkICpPUEVOU1NMX21lbWNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pIHsKKyAgaWYgKG4gPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIFNiTWVtb3J5RmluZEJ5dGUocywgYywgbik7Cit9CisKK2ludCBPUEVOU1NMX21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKSB7CisgIGlmIChuID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBTYk1lbW9yeUNvbXBhcmUoczEsIHMyLCBuKTsKK30KKwordm9pZCAqT1BFTlNTTF9tZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKSB7CisgIGlmIChuID09IDApIHsKKyAgICByZXR1cm4gZHN0OworICB9CisKKyAgcmV0dXJuIFNiTWVtb3J5Q29weShkc3QsIHNyYywgbik7Cit9CisKK3ZvaWQgKk9QRU5TU0xfbWVtbW92ZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pIHsKKyAgaWYgKG4gPT0gMCkgeworICAgIHJldHVybiBkc3Q7CisgIH0KKworICByZXR1cm4gU2JNZW1vcnlNb3ZlKGRzdCwgc3JjLCBuKTsKK30KKwordm9pZCAqT1BFTlNTTF9tZW1zZXQodm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IG4pIHsKKyAgaWYgKG4gPT0gMCkgeworICAgIHJldHVybiBkc3Q7CisgIH0KKworICByZXR1cm4gU2JNZW1vcnlTZXQoZHN0LCBjLCBuKTsKK30KKwordWludDMyX3QgT1BFTlNTTF9oYXNoMzIoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgbGVuKSB7CisgIC8vIFRoZXNlIGFyZSB0aGUgRk5WLTFhIHBhcmFtZXRlcnMgZm9yIDMyIGJpdHMuCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUHJpbWUgPSAxNjc3NzYxOXU7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrT2Zmc2V0QmFzaXMgPSAyMTY2MTM2MjYxdTsKKworICBjb25zdCB1aW50OF90ICppbiA9IHB0cjsKKyAgdWludDMyX3QgaCA9IGtPZmZzZXRCYXNpczsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgaCBePSBpbltpXTsKKyAgICBoICo9IGtQcmltZTsKKyAgfQorCisgIHJldHVybiBoOworfQorCitzaXplX3QgT1BFTlNTTF9zdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGlmIChzW2ldID09IDApIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorCisgIHJldHVybiBsZW47Cit9CisKK2NoYXIgKk9QRU5TU0xfc3RyZHVwKGNvbnN0IGNoYXIgKnMpIHsKKyAgY29uc3Qgc2l6ZV90IGxlbiA9IFNiU3RyaW5nR2V0TGVuZ3RoKHMpICsgMTsKKyAgY2hhciAqcmV0ID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgT1BFTlNTTF9tZW1jcHkocmV0LCBzLCBsZW4pOworICByZXR1cm4gcmV0OworfQorCitpbnQgT1BFTlNTTF90b2xvd2VyKGludCBjKSB7CisgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgIHJldHVybiBjICsgKCdhJyAtICdBJyk7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK2ludCBPUEVOU1NMX3N0cmNhc2VjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikgeworICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgIGNvbnN0IGludCBhYSA9IE9QRU5TU0xfdG9sb3dlcihhW2ldKTsKKyAgICBjb25zdCBpbnQgYmIgPSBPUEVOU1NMX3RvbG93ZXIoYltpXSk7CisKKyAgICBpZiAoYWEgPCBiYikgeworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYWEgPiBiYikgeworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChhYSA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KK30KKworaW50IE9QRU5TU0xfc3RybmNhc2VjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYiwgc2l6ZV90IG4pIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBpbnQgYWEgPSBPUEVOU1NMX3RvbG93ZXIoYVtpXSk7CisgICAgY29uc3QgaW50IGJiID0gT1BFTlNTTF90b2xvd2VyKGJbaV0pOworCisgICAgaWYgKGFhIDwgYmIpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGFhID4gYmIpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAoYWEgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBCSU9fc25wcmludGYoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICBpbnQgcmV0ID0gQklPX3ZzbnByaW50ZihidWYsIG4sIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IEJJT192c25wcmludGYoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpIHsKKyAgcmV0dXJuIFNiU3RyaW5nRm9ybWF0KGJ1ZiwgbiwgZm9ybWF0LCBhcmdzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX2FsbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fYWxsLmMKaW5kZXggNmI0MDg4My4uYTM2NDQ5YSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fYWxsLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fYWxsLmMKQEAgLTEwNiw3ICsxMDYsMTEgQEAKICAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KICAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLwogCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CiAKICNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX2xpYi5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fbGliLmMKaW5kZXggNTE4MGU1NS4uMTNjOWZiNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fbGliLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fbGliLmMKQEAgLTU1LDEwICs1NSwxMyBAQAogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQogICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+DQorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkNCisjaW5jbHVkZSA8YXNzZXJ0Lmg+DQorI2luY2x1ZGUgPGN0eXBlcy5oPg0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkNCiAKICNpbmNsdWRlIDxvcGVuc3NsL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV9vdGguYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX290aC5jCmluZGV4IDg1MzBjNTYuLjVhNDhmOTUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX290aC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX290aC5jCkBAIC01NSwxMCArNTUsMTMgQEAKICAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKICAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CiAKKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fcGs4LmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV9wazguYwppbmRleCAxNTM4NWVjLi5iN2NkZTc0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV9wazguYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV9wazguYwpAQCAtNTQsOCArNTQsMTMgQEAKICAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKICAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgogCisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX3BrZXkuYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX3BrZXkuYwppbmRleCA5ZmJhZWVmLi5iMTNiYmY5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV9wa2V5LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1fcGtleS5jCkBAIC01NCwxMSArNTQsMTQgQEAKICAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKICAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CiAKKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CkBAIC04Miw3ICs4NSw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHAgPSBkYXRhOwogCi0gICAgaWYgKHN0cmNtcChubSwgUEVNX1NUUklOR19QS0NTOElORikgPT0gMCkgeworICAgIGlmIChPUEVOU1NMX3BvcnRfc3RyY21wKG5tLCBQRU1fU1RSSU5HX1BLQ1M4SU5GKSA9PSAwKSB7CiAgICAgICAgIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mOwogICAgICAgICBwOGluZiA9IGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKE5VTEwsICZwLCBsZW4pOwogICAgICAgICBpZiAoIXA4aW5mKQpAQCAtOTQsNyArOTcsNyBAQAogICAgICAgICAgICAgKnggPSByZXQ7CiAgICAgICAgIH0KICAgICAgICAgUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChubSwgUEVNX1NUUklOR19QS0NTOCkgPT0gMCkgeworICAgIH0gZWxzZSBpZiAoT1BFTlNTTF9wb3J0X3N0cmNtcChubSwgUEVNX1NUUklOR19QS0NTOCkgPT0gMCkgewogICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZjsKICAgICAgICAgWDUwOV9TSUcgKnA4OwogICAgICAgICBpbnQga2xlbjsKQEAgLTEyNCwxNCArMTI3LDE0IEBACiAgICAgICAgICAgICAqeCA9IHJldDsKICAgICAgICAgfQogICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDhpbmYpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5tLCBQRU1fU1RSSU5HX1JTQSkgPT0gMCkgeworICAgIH0gZWxzZSBpZiAoT1BFTlNTTF9wb3J0X3N0cmNtcChubSwgUEVNX1NUUklOR19SU0EpID09IDApIHsKICAgICAgICAgLyogVE9ETyhkYXZpZGJlbik6IGQyaV9Qcml2YXRlS2V5IHBhcnNlcyBQS0NTIzggYWxvbmcgd2l0aCB0aGUKICAgICAgICAgICogc3RhbmRhbG9uZSBmb3JtYXQuIFRoaXMgYW5kIHRoZSBjYXNlcyBiZWxvdyBwcm9iYWJseSBzaG91bGQgbm90CiAgICAgICAgICAqIGFjY2VwdCBQS0NTIzguICovCiAgICAgICAgIHJldCA9IGQyaV9Qcml2YXRlS2V5KEVWUF9QS0VZX1JTQSwgeCwgJnAsIGxlbik7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobm0sIFBFTV9TVFJJTkdfRUMpID09IDApIHsKKyAgICB9IGVsc2UgaWYgKE9QRU5TU0xfcG9ydF9zdHJjbXAobm0sIFBFTV9TVFJJTkdfRUMpID09IDApIHsKICAgICAgICAgcmV0ID0gZDJpX1ByaXZhdGVLZXkoRVZQX1BLRVlfRUMsIHgsICZwLCBsZW4pOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5tLCBQRU1fU1RSSU5HX0RTQSkgPT0gMCkgeworICAgIH0gZWxzZSBpZiAoT1BFTlNTTF9wb3J0X3N0cmNtcChubSwgUEVNX1NUUklOR19EU0EpID09IDApIHsKICAgICAgICAgcmV0ID0gZDJpX1ByaXZhdGVLZXkoRVZQX1BLRVlfRFNBLCB4LCAmcCwgbGVuKTsKICAgICB9CiAgcDhlcnI6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV94NTA5LmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV94NTA5LmMKaW5kZXggOTdmODE0ZC4uMDg2OGY2OSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1feDUwOS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX3g1MDkuYwpAQCAtNTUsNyArNTUsMTEgQEAKICAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KICAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLwogCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9iYXNlLmg+CiAKICNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV94YXV4LmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGVtL3BlbV94YXV4LmMKaW5kZXggYjBjY2VjYS4uZDU0NGJiZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BlbS9wZW1feGF1eC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wZW0vcGVtX3hhdXguYwpAQCAtNTUsNyArNTUsMTAgQEAKICAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KICAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLwogCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAKICNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGtjczcvcGtjczdfeDUwOS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BrY3M3L3BrY3M3X3g1MDkuYwppbmRleCBhMmE2YjQ2Li5jYWVjYzcxIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGtjczcvcGtjczdfeDUwOS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wa2NzNy9wa2NzN194NTA5LmMKQEAgLTEyLDExICsxMiwxNCBAQAogICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvcGtjczcuaD4KLQorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczcuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGtjczgvcGtjczhfeDUwOS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BrY3M4L3BrY3M4X3g1MDkuYwppbmRleCBkYzc0ZDk2Li40NTI3YWFiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcGtjczgvcGtjczhfeDUwOS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wa2NzOC9wa2NzOF94NTA5LmMKQEAgLTgyMSw3ICs4MjEsNyBAQAogICBCVUZfTUVNX2ZyZWUoYnVmKTsKICAgcmV0dXJuIHJldDsKIH0KLQorI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQogUEtDUzEyKiBkMmlfUEtDUzEyX2ZwKEZJTEUgKmZwLCBQS0NTMTIgKipvdXRfcDEyKSB7CiAgIEJJTyAqYmlvOwogICBQS0NTMTIgKnJldDsKQEAgLTgzNSw2ICs4MzUsNyBAQAogICBCSU9fZnJlZShiaW8pOwogICByZXR1cm4gcmV0OwogfQorI2VuZGlmICAvLyBPUEVOU1NMX05PX0ZQX0FQSQogCiBpbnQgaTJkX1BLQ1MxMihjb25zdCBQS0NTMTIgKnAxMiwgdWludDhfdCAqKm91dCkgewogICBpZiAocDEyLT5iZXJfbGVuID4gSU5UX01BWCkgewpAQCAtODc0LDYgKzg3NSw3IEBACiAgIHJldHVybiAxOwogfQogCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCiBpbnQgaTJkX1BLQ1MxMl9mcChGSUxFICpmcCwgY29uc3QgUEtDUzEyICpwMTIpIHsKICAgQklPICpiaW8gPSBCSU9fbmV3X2ZwKGZwLCAwIC8qIGRvbid0IHRha2Ugb3duZXJzaGlwICovKTsKICAgaWYgKGJpbyA9PSBOVUxMKSB7CkBAIC04ODQsNiArODg2LDcgQEAKICAgQklPX2ZyZWUoYmlvKTsKICAgcmV0dXJuIHJldDsKIH0KKyNlbmRpZiAgLy8gT1BFTlNTTF9OT19GUF9BUEkKIAogaW50IFBLQ1MxMl9wYXJzZShjb25zdCBQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzc3dvcmQsIEVWUF9QS0VZICoqb3V0X3BrZXksCiAgICAgICAgICAgICAgICAgIFg1MDkgKipvdXRfY2VydCwgU1RBQ0tfT0YoWDUwOSkgKipvdXRfY2FfY2VydHMpIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wb2x5MTMwNS9wb2x5MTMwNS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1LmMKaW5kZXggYzNlOTI3Mi4uY2QwODAwZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1LmMKQEAgLTE2LDEwICsxNiwxMiBAQAogLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9vZHliZXJyeS9wb2x5MTMwNS1kb25uYSkgYW5kIHJlbGVhc2VkIGFzIHB1YmxpYwogLy8gZG9tYWluLgogCi0jaW5jbHVkZSA8b3BlbnNzbC9wb2x5MTMwNS5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdHJpbmcuaD4KLQorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BvbHkxMzA1Lmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcG9seTEzMDUvcG9seTEzMDVfYXJtLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcG9seTEzMDUvcG9seTEzMDVfYXJtLmMKaW5kZXggNGFmZjcxMy4uOTZmMTdkMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X2FybS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV9hcm0uYwpAQCAtMTYsNiArMTYsNyBAQAogLy8gU1VQRVJDT1AgYnkgRC4gSi4gQmVybnN0ZWluIGFuZCBQZXRlciBTY2h3YWJlLgogCiAjaW5jbHVkZSA8b3BlbnNzbC9wb2x5MTMwNS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3ZlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3ZlYy5jCmluZGV4IDQ4MGQ5ZTUuLjRkNTE1ZDMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV92ZWMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcG9seTEzMDUvcG9seTEzMDVfdmVjLmMKQEAgLTE5LDEwICsxOSwxMCBAQAogLy8gYmxvY2sgc2l6ZQogCiAjaW5jbHVkZSA8b3BlbnNzbC9wb2x5MTMwNS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKICNpbmNsdWRlICIuLi9pbnRlcm5hbC5oIgogCi0KICNpZiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpICYmIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpCiAKICNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wb29sL3Bvb2wuYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9wb29sL3Bvb2wuYwppbmRleCAxNWM3NDg0Li5mNGMzMWRlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcG9vbC9wb29sLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3Bvb2wvcG9vbC5jCkBAIC0xMiwxMSArMTIsMTQgQEAKICAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3Bvb2wuaD4KIAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLQorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9wb29sLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9idWYuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3JhbmRfZXh0cmEvZGV0ZXJtaW5pc3RpYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3JhbmRfZXh0cmEvZGV0ZXJtaW5pc3RpYy5jCmluZGV4IDE3ZmE3MWUuLjYyMzdiNWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9yYW5kX2V4dHJhL2RldGVybWluaXN0aWMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8vcmFuZF9leHRyYS9kZXRlcm1pbmlzdGljLmMKQEAgLTE2LDggKzE2LDExIEBACiAKICNpZiBkZWZpbmVkKEJPUklOR1NTTF9VTlNBRkVfREVURVJNSU5JU1RJQ19NT0RFKQogCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdHJpbmcuaD4KLQorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2NoYWNoYS5oPgogCiAjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9yYW5kX2V4dHJhL3N0YXJib2FyZC5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3JhbmRfZXh0cmEvc3RhcmJvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmYWY3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by9yYW5kX2V4dHJhL3N0YXJib2FyZC5jCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpICYmICFkZWZpbmVkKEJPUklOR1NTTF9VTlNBRkVfREVURVJNSU5JU1RJQ19NT0RFKQorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorI2luY2x1ZGUgPG9wZW5zc2wvY2hhY2hhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KKworI2luY2x1ZGUgIi4uL2ZpcHNtb2R1bGUvcmFuZC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL2ludGVybmFsLmgiCisKK3ZvaWQgQ1JZUFRPX3N5c3JhbmQodWludDhfdCAqb3V0LCBzaXplX3QgcmVxdWVzdGVkKSB7CisgIFNiU3lzdGVtR2V0UmFuZG9tRGF0YShvdXQsIHJlcXVlc3RlZCk7Cit9CisKKyNlbmRpZiAgLy8gQk9SSU5HU1NMX1VOU0FGRV9ERVRFUk1JTklTVElDX01PREUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L2J5X2Rpci5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkvYnlfZGlyLmMKaW5kZXggOWEwZTJlYi4uN2I2Y2IzMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkvYnlfZGlyLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkvYnlfZGlyLmMKQEAgLTU1LDkgKzU1LDIwIEBACiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwogCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKworI2luY2x1ZGUgImVfb3MuaCIKKworI2lmbmRlZiBOT19TWVNfVFlQRVNfSAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUE9TSVhfSU8KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CkBAIC0xMjUsNyArMTM2LDExIEBACiAgICAgc3dpdGNoIChjbWQpIHsKICAgICBjYXNlIFg1MDlfTF9BRERfRElSOgogICAgICAgICBpZiAoYXJnbCA9PSBYNTA5X0ZJTEVUWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgIGRpciA9IChjaGFyICopZ2V0ZW52KFg1MDlfZ2V0X2RlZmF1bHRfY2VydF9kaXJfZW52KCkpOworI2lmIGRlZmluZWQoQ09CQUxUKQorICAgICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRvIHVzZSB0aGUgZGVmYXVsdCBjZXJ0cyBkaXIuCisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTE9BRElOR19DRVJUX0RJUik7CisjZWxzZQorICAgICAgICAgICAgZGlyID0gKGNoYXIgKilPUEVOU1NMX3BvcnRfZ2V0ZW52KFg1MDlfZ2V0X2RlZmF1bHRfY2VydF9kaXJfZW52KCkpOwogICAgICAgICAgICAgaWYgKGRpcikKICAgICAgICAgICAgICAgICByZXQgPSBhZGRfY2VydF9kaXIobGQsIGRpciwgWDUwOV9GSUxFVFlQRV9QRU0pOwogICAgICAgICAgICAgZWxzZQpAQCAtMTM0LDYgKzE0OSw3IEBACiAgICAgICAgICAgICBpZiAoIXJldCkgewogICAgICAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9MT0FESU5HX0NFUlRfRElSKTsKICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIHJldCA9IGFkZF9jZXJ0X2RpcihsZCwgYXJncCwgKGludClhcmdsKTsKICAgICAgICAgYnJlYWs7CkBAIC0yMDQsNyArMjIwLDcgQEAKICAgICBzID0gZGlyOwogICAgIHAgPSBzOwogICAgIGRvIHsKLSAgICAgICAgaWYgKCgqcCA9PSAnOicpIHx8ICgqcCA9PSAnXDAnKSkgeworICAgICAgaWYgKCgqcCA9PSBMSVNUX1NFUEFSQVRPUl9DSEFSKSB8fCAoKnAgPT0gJ1wwJykpIHsKICAgICAgICAgICAgIEJZX0RJUl9FTlRSWSAqZW50OwogICAgICAgICAgICAgc3MgPSBzOwogICAgICAgICAgICAgcyA9IHAgKyAxOwpAQCAtMjEzLDggKzIyOSw4IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2tfQllfRElSX0VOVFJZX251bShjdHgtPmRpcnMpOyBqKyspIHsKICAgICAgICAgICAgICAgICBlbnQgPSBza19CWV9ESVJfRU5UUllfdmFsdWUoY3R4LT5kaXJzLCBqKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGVudC0+ZGlyKSA9PSBsZW4gJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNtcChlbnQtPmRpciwgc3MsIGxlbikgPT0gMCkKKyAgICAgICAgICAgICAgICBpZiAoT1BFTlNTTF9wb3J0X3N0cmxlbihlbnQtPmRpcikgPT0gbGVuICYmCisgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9zdHJuY21wKGVudC0+ZGlyLCBzcywgbGVuKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChqIDwgc2tfQllfRElSX0VOVFJZX251bShjdHgtPmRpcnMpKQpAQCAtMzEyLDcgKzMyOCw3IEBACiAgICAgICAgICAgICBzaXplX3QgaWR4OwogICAgICAgICAgICAgQllfRElSX0hBU0ggaHRtcCwgKmhlbnQ7CiAgICAgICAgICAgICBlbnQgPSBza19CWV9ESVJfRU5UUllfdmFsdWUoY3R4LT5kaXJzLCBpKTsKLSAgICAgICAgICAgIGogPSBzdHJsZW4oZW50LT5kaXIpICsgMSArIDggKyA2ICsgMSArIDE7CisgICAgICAgICAgICBqID0gT1BFTlNTTF9wb3J0X3N0cmxlbihlbnQtPmRpcikgKyAxICsgOCArIDYgKyAxICsgMTsKICAgICAgICAgICAgIGlmICghQlVGX01FTV9ncm93KGIsIGopKSB7CiAgICAgICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOwpAQCAtMzM1LDcgKzM1MSw3IEBACiAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgY2hhciBjID0gJy8nOwogI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUwotICAgICAgICAgICAgICAgIGMgPSBlbnQtPmRpcltzdHJsZW4oZW50LT5kaXIpIC0gMV07CisgICAgICAgICAgICAgICAgYyA9IGVudC0+ZGlyW09QRU5TU0xfcG9ydF9zdHJsZW4oZW50LT5kaXIpIC0gMV07CiAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJzonICYmIGMgIT0gJz4nICYmIGMgIT0gJ10nKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIElmIG5vIHNlcGFyYXRvciBpcyBwcmVzZW50LCB3ZSBhc3N1bWUgdGhlIGRpcmVjdG9yeQpAQCAtMzYyLDEzICszNzgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RmaXgsIGspOwogICAgICAgICAgICAgICAgIH0KICNpZm5kZWYgT1BFTlNTTF9OT19QT1NJWF9JTwotIyBpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoc3RhdCkKLSMgIGRlZmluZSBzdGF0IF9zdGF0Ci0jIGVuZGlmCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fTEJfWEIxX18pICYmICFkZWZpbmVkKF9fTEJfWEIzNjBfXykKKyNkZWZpbmUgc3RhdCBfc3RhdAorI2VuZGlmCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQoYi0+ZGF0YSwgJnN0KSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgICAgICAgICAvKiBmb3VuZCBvbmUuICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS9ieV9maWxlLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS9ieV9maWxlLmMKaW5kZXggNTU1Y2I4NS4uNGFhN2NmZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkvYnlfZmlsZS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L2J5X2ZpbGUuYwpAQCAtNTUsNyArNTUsMTAgQEAKICAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKICAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCiAKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAKICNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CkBAIC05Myw3ICs5Niw3IEBACiAgICAgc3dpdGNoIChjbWQpIHsKICAgICBjYXNlIFg1MDlfTF9GSUxFX0xPQUQ6CiAgICAgICAgIGlmIChhcmdsID09IFg1MDlfRklMRVRZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgZmlsZSA9IGdldGVudihYNTA5X2dldF9kZWZhdWx0X2NlcnRfZmlsZV9lbnYoKSk7CisgICAgICAgICAgICBmaWxlID0gT1BFTlNTTF9wb3J0X2dldGVudihYNTA5X2dldF9kZWZhdWx0X2NlcnRfZmlsZV9lbnYoKSk7CiAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICBvayA9IChYNTA5X2xvYWRfY2VydF9jcmxfZmlsZShjdHgsIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pICE9IDApOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkveDUwOV9vYmouYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L3g1MDlfb2JqLmMKaW5kZXggNjViMWJmYi4uOGFjZDkxNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkveDUwOV9vYmouYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94NTA5X29iai5jCkBAIC01NSw3ICs1NSwxMCBAQAogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQogICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KIAorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKIAogI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KQEAgLTk5LDcgKzEwMiw3IEBACiAgICAgaWYgKGEgPT0gTlVMTCkgewogICAgICAgICBpZiAoYikgewogICAgICAgICAgICAgYnVmID0gYi0+ZGF0YTsKLSAgICAgICAgICAgIE9QRU5TU0xfZnJlZShiKTsKKyAgICAgICAgICBPUEVOU1NMX2ZyZWUoYik7CiAgICAgICAgIH0KICAgICAgICAgQlVGX3N0cmxjcHkoYnVmLCAiTk8gWDUwOV9OQU1FIiwgbGVuKTsKICAgICAgICAgcmV0dXJuIGJ1ZjsKQEAgLTE4NCw3ICsxODcsNyBAQAogICAgIH0KICAgICBpZiAoYiAhPSBOVUxMKSB7CiAgICAgICAgIHAgPSBiLT5kYXRhOwotICAgICAgICBPUEVOU1NMX2ZyZWUoYik7CisgICAgICBPUEVOU1NMX2ZyZWUoYik7CiAgICAgfSBlbHNlCiAgICAgICAgIHAgPSBidWY7CiAgICAgaWYgKGkgPT0gMCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L3g1MDlfdmZ5LmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94NTA5X3ZmeS5jCmluZGV4IDVhZjNmYjMuLjVkMDE2ODAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L3g1MDlfdmZ5LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkveDUwOV92ZnkuYwpAQCAtNjgsOCArNjgsOCBAQAogI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CiAKLSNpbmNsdWRlICJ2cG1faW50LmgiCiAjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2cG1faW50LmgiCiAKIHN0YXRpYyBDUllQVE9fRVhfREFUQV9DTEFTUyBnX2V4X2RhdGFfY2xhc3MgPQogICAgIENSWVBUT19FWF9EQVRBX0NMQVNTX0lOSVRfV0lUSF9BUFBfREFUQTsKQEAgLTc4LDQzICs3OCw0NCBAQAogCiAvKiBObyB1bmhhbmRsZWQgY3JpdGljYWwgZXh0ZW5zaW9ucyAqLwogCi0jZGVmaW5lIENSTF9TQ09SRV9OT0NSSVRJQ0FMICAgIDB4MTAwCisjZGVmaW5lIENSTF9TQ09SRV9OT0NSSVRJQ0FMIDB4MTAwCiAKIC8qIGNlcnRpZmljYXRlIGlzIHdpdGhpbiBDUkwgc2NvcGUgKi8KIAotI2RlZmluZSBDUkxfU0NPUkVfU0NPUEUgICAgICAgICAweDA4MAorI2RlZmluZSBDUkxfU0NPUkVfU0NPUEUgMHgwODAKIAogLyogQ1JMIHRpbWVzIHZhbGlkICovCiAKLSNkZWZpbmUgQ1JMX1NDT1JFX1RJTUUgICAgICAgICAgMHgwNDAKKyNkZWZpbmUgQ1JMX1NDT1JFX1RJTUUgMHgwNDAKIAogLyogSXNzdWVyIG5hbWUgbWF0Y2hlcyBjZXJ0aWZpY2F0ZSAqLwogCi0jZGVmaW5lIENSTF9TQ09SRV9JU1NVRVJfTkFNRSAgIDB4MDIwCisjZGVmaW5lIENSTF9TQ09SRV9JU1NVRVJfTkFNRSAweDAyMAogCiAvKiBJZiB0aGlzIHNjb3JlIG9yIGFib3ZlIENSTCBpcyBwcm9iYWJseSB2YWxpZCAqLwogCi0jZGVmaW5lIENSTF9TQ09SRV9WQUxJRCAoQ1JMX1NDT1JFX05PQ1JJVElDQUx8Q1JMX1NDT1JFX1RJTUV8Q1JMX1NDT1JFX1NDT1BFKQorI2RlZmluZSBDUkxfU0NPUkVfVkFMSUQgXAorICAoQ1JMX1NDT1JFX05PQ1JJVElDQUwgfCBDUkxfU0NPUkVfVElNRSB8IENSTF9TQ09SRV9TQ09QRSkKIAogLyogQ1JMIGlzc3VlciBpcyBjZXJ0aWZpY2F0ZSBpc3N1ZXIgKi8KIAotI2RlZmluZSBDUkxfU0NPUkVfSVNTVUVSX0NFUlQgICAweDAxOAorI2RlZmluZSBDUkxfU0NPUkVfSVNTVUVSX0NFUlQgMHgwMTgKIAogLyogQ1JMIGlzc3VlciBpcyBvbiBjZXJ0aWZpY2F0ZSBwYXRoICovCiAKLSNkZWZpbmUgQ1JMX1NDT1JFX1NBTUVfUEFUSCAgICAgMHgwMDgKKyNkZWZpbmUgQ1JMX1NDT1JFX1NBTUVfUEFUSCAweDAwOAogCiAvKiBDUkwgaXNzdWVyIG1hdGNoZXMgQ1JMIEFLSUQgKi8KIAotI2RlZmluZSBDUkxfU0NPUkVfQUtJRCAgICAgICAgICAweDAwNAorI2RlZmluZSBDUkxfU0NPUkVfQUtJRCAweDAwNAogCiAvKiBIYXZlIGEgZGVsdGEgQ1JMIHdpdGggdmFsaWQgdGltZXMgKi8KIAotI2RlZmluZSBDUkxfU0NPUkVfVElNRV9ERUxUQSAgICAweDAwMgorI2RlZmluZSBDUkxfU0NPUkVfVElNRV9ERUxUQSAweDAwMgogCiBzdGF0aWMgaW50IG51bGxfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqZSk7CiBzdGF0aWMgaW50IGNoZWNrX2lzc3VlZChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4LCBYNTA5ICppc3N1ZXIpOwotc3RhdGljIFg1MDkgKmZpbmRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICpzaywgWDUwOSAqeCk7CitzdGF0aWMgWDUwOSAqZmluZF9pc3N1ZXIoWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKiBzaywgWDUwOSAqeCk7CiBzdGF0aWMgaW50IGNoZWNrX2NoYWluX2V4dGVuc2lvbnMoWDUwOV9TVE9SRV9DVFggKmN0eCk7CiBzdGF0aWMgaW50IGNoZWNrX25hbWVfY29uc3RyYWludHMoWDUwOV9TVE9SRV9DVFggKmN0eCk7CiBzdGF0aWMgaW50IGNoZWNrX2lkKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwpAQCAtMTI1LDQ1MSArMTI2LDQzNiBAQAogCiBzdGF0aWMgaW50IGdldF9jcmxfc2NvcmUoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqKnBpc3N1ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwcmVhc29ucywgWDUwOV9DUkwgKmNybCwgWDUwOSAqeCk7Ci1zdGF0aWMgaW50IGdldF9jcmxfZGVsdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X0NSTCAqKnBjcmwsIFg1MDlfQ1JMICoqcGRjcmwsIFg1MDkgKngpOwotc3RhdGljIHZvaWQgZ2V0X2RlbHRhX3NrKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICoqZGNybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBjcmxfc2NvcmUsIFg1MDlfQ1JMICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDlfQ1JMKSAqY3Jscyk7CitzdGF0aWMgaW50IGdldF9jcmxfZGVsdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKipwY3JsLCBYNTA5X0NSTCAqKnBkY3JsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDkgKngpOworc3RhdGljIHZvaWQgZ2V0X2RlbHRhX3NrKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICoqZGNybCwgaW50ICpwY3JsX3Njb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQ1JMICpiYXNlLCBTVEFDS19PRihYNTA5X0NSTCkgKiBjcmxzKTsKIHN0YXRpYyB2b2lkIGNybF9ha2lkX2NoZWNrKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwsIFg1MDkgKipwaXNzdWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwY3JsX3Njb3JlKTsKIHN0YXRpYyBpbnQgY3JsX2NybGRwX2NoZWNrKFg1MDkgKngsIFg1MDlfQ1JMICpjcmwsIGludCBjcmxfc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnByZWFzb25zKTsKIHN0YXRpYyBpbnQgY2hlY2tfY3JsX3BhdGgoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCk7Ci1zdGF0aWMgaW50IGNoZWNrX2NybF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfT0YoWDUwOSkgKmNlcnRfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDkpICpjcmxfcGF0aCk7CitzdGF0aWMgaW50IGNoZWNrX2NybF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqIGNlcnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDkpICogY3JsX3BhdGgpOwogCiBzdGF0aWMgaW50IGludGVybmFsX3ZlcmlmeShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKIAotc3RhdGljIGludCBudWxsX2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmUpCi17Ci0gICAgcmV0dXJuIG9rOwotfQorc3RhdGljIGludCBudWxsX2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmUpIHsgcmV0dXJuIG9rOyB9CiAKIC8qIFJldHVybiAxIGlzIGEgY2VydGlmaWNhdGUgaXMgc2VsZiBzaWduZWQgKi8KLXN0YXRpYyBpbnQgY2VydF9zZWxmX3NpZ25lZChYNTA5ICp4KQotewotICAgIFg1MDlfY2hlY2tfcHVycG9zZSh4LCAtMSwgMCk7Ci0gICAgaWYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NTKQotICAgICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOworc3RhdGljIGludCBjZXJ0X3NlbGZfc2lnbmVkKFg1MDkgKngpIHsKKyAgWDUwOV9jaGVja19wdXJwb3NlKHgsIC0xLCAwKTsKKyAgaWYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NTKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEdpdmVuIGEgY2VydGlmaWNhdGUgdHJ5IGFuZCBmaW5kIGFuIGV4YWN0IG1hdGNoIGluIHRoZSBzdG9yZSAqLwogCi1zdGF0aWMgWDUwOSAqbG9va3VwX2NlcnRfbWF0Y2goWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCkKLXsKLSAgICBTVEFDS19PRihYNTA5KSAqY2VydHM7Ci0gICAgWDUwOSAqeHRtcCA9IE5VTEw7Ci0gICAgc2l6ZV90IGk7Ci0gICAgLyogTG9va3VwIGFsbCBjZXJ0cyB3aXRoIG1hdGNoaW5nIHN1YmplY3QgbmFtZSAqLwotICAgIGNlcnRzID0gY3R4LT5sb29rdXBfY2VydHMoY3R4LCBYNTA5X2dldF9zdWJqZWN0X25hbWUoeCkpOwotICAgIGlmIChjZXJ0cyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAvKiBMb29rIGZvciBleGFjdCBtYXRjaCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShjZXJ0cyk7IGkrKykgewotICAgICAgICB4dG1wID0gc2tfWDUwOV92YWx1ZShjZXJ0cywgaSk7Ci0gICAgICAgIGlmICghWDUwOV9jbXAoeHRtcCwgeCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPCBza19YNTA5X251bShjZXJ0cykpCi0gICAgICAgIFg1MDlfdXBfcmVmKHh0bXApOwotICAgIGVsc2UKLSAgICAgICAgeHRtcCA9IE5VTEw7Ci0gICAgc2tfWDUwOV9wb3BfZnJlZShjZXJ0cywgWDUwOV9mcmVlKTsKLSAgICByZXR1cm4geHRtcDsKK3N0YXRpYyBYNTA5ICpsb29rdXBfY2VydF9tYXRjaChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KSB7CisgIFNUQUNLX09GKFg1MDkpICogY2VydHM7CisgIFg1MDkgKnh0bXAgPSBOVUxMOworICBzaXplX3QgaTsKKyAgLyogTG9va3VwIGFsbCBjZXJ0cyB3aXRoIG1hdGNoaW5nIHN1YmplY3QgbmFtZSAqLworICBjZXJ0cyA9IGN0eC0+bG9va3VwX2NlcnRzKGN0eCwgWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpKTsKKyAgaWYgKGNlcnRzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIC8qIExvb2sgZm9yIGV4YWN0IG1hdGNoICovCisgIGZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShjZXJ0cyk7IGkrKykgeworICAgIHh0bXAgPSBza19YNTA5X3ZhbHVlKGNlcnRzLCBpKTsKKyAgICBpZiAoIVg1MDlfY21wKHh0bXAsIHgpKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGkgPCBza19YNTA5X251bShjZXJ0cykpCisgICAgWDUwOV91cF9yZWYoeHRtcCk7CisgIGVsc2UKKyAgICB4dG1wID0gTlVMTDsKKyAgc2tfWDUwOV9wb3BfZnJlZShjZXJ0cywgWDUwOV9mcmVlKTsKKyAgcmV0dXJuIHh0bXA7CiB9CiAKLWludCBYNTA5X3ZlcmlmeV9jZXJ0KFg1MDlfU1RPUkVfQ1RYICpjdHgpCi17Ci0gICAgWDUwOSAqeCwgKnh0bXAsICp4dG1wMiwgKmNoYWluX3NzID0gTlVMTDsKLSAgICBpbnQgYmFkX2NoYWluID0gMDsKLSAgICBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0gPSBjdHgtPnBhcmFtOwotICAgIGludCBkZXB0aCwgaSwgb2sgPSAwOwotICAgIGludCBudW0sIGosIHJldHJ5LCB0cnVzdDsKLSAgICBpbnQgKCpjYikgKGludCB4b2ssIFg1MDlfU1RPUkVfQ1RYICp4Y3R4KTsKLSAgICBTVEFDS19PRihYNTA5KSAqc2t0bXAgPSBOVUxMOwotICAgIGlmIChjdHgtPmNlcnQgPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTk9fQ0VSVF9TRVRfRk9SX1VTX1RPX1ZFUklGWSk7Ci0gICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfQ0FMTDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoY3R4LT5jaGFpbiAhPSBOVUxMKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoaXMgWDUwOV9TVE9SRV9DVFggaGFzIGFscmVhZHkgYmVlbiB1c2VkIHRvIHZlcmlmeSBhIGNlcnQuIFdlCi0gICAgICAgICAqIGNhbm5vdCBkbyBhbm90aGVyIG9uZS4KLSAgICAgICAgICovCi0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7Ci0gICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfQ0FMTDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGNiID0gY3R4LT52ZXJpZnlfY2I7Ci0KK2ludCBYNTA5X3ZlcmlmeV9jZXJ0KFg1MDlfU1RPUkVfQ1RYICpjdHgpIHsKKyAgWDUwOSAqeCwgKnh0bXAsICp4dG1wMiwgKmNoYWluX3NzID0gTlVMTDsKKyAgaW50IGJhZF9jaGFpbiA9IDA7CisgIFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSA9IGN0eC0+cGFyYW07CisgIGludCBkZXB0aCwgaSwgb2sgPSAwOworICBpbnQgbnVtLCBqLCByZXRyeSwgdHJ1c3Q7CisgIGludCAoKmNiKShpbnQgeG9rLCBYNTA5X1NUT1JFX0NUWCAqeGN0eCk7CisgIFNUQUNLX09GKFg1MDkpICpza3RtcCA9IE5VTEw7CisgIGlmIChjdHgtPmNlcnQgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9OT19DRVJUX1NFVF9GT1JfVVNfVE9fVkVSSUZZKTsKKyAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX0NBTEw7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChjdHgtPmNoYWluICE9IE5VTEwpIHsKICAgICAvKgotICAgICAqIGZpcnN0IHdlIG1ha2Ugc3VyZSB0aGUgY2hhaW4gd2UgYXJlIGdvaW5nIHRvIGJ1aWxkIGlzIHByZXNlbnQgYW5kIHRoYXQKLSAgICAgKiB0aGUgZmlyc3QgZW50cnkgaXMgaW4gcGxhY2UKKyAgICAgKiBUaGlzIFg1MDlfU1RPUkVfQ1RYIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB0byB2ZXJpZnkgYSBjZXJ0LiBXZQorICAgICAqIGNhbm5vdCBkbyBhbm90aGVyIG9uZS4KICAgICAgKi8KLSAgICBjdHgtPmNoYWluID0gc2tfWDUwOV9uZXdfbnVsbCgpOwotICAgIGlmIChjdHgtPmNoYWluID09IE5VTEwgfHwgIXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLCBjdHgtPmNlcnQpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX0NBTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgY2IgPSBjdHgtPnZlcmlmeV9jYjsKKworICAvKgorICAgKiBmaXJzdCB3ZSBtYWtlIHN1cmUgdGhlIGNoYWluIHdlIGFyZSBnb2luZyB0byBidWlsZCBpcyBwcmVzZW50IGFuZCB0aGF0CisgICAqIHRoZSBmaXJzdCBlbnRyeSBpcyBpbiBwbGFjZQorICAgKi8KKyAgY3R4LT5jaGFpbiA9IHNrX1g1MDlfbmV3X251bGwoKTsKKyAgaWYgKGN0eC0+Y2hhaW4gPT0gTlVMTCB8fCAhc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4sIGN0eC0+Y2VydCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfT1VUX09GX01FTTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBYNTA5X3VwX3JlZihjdHgtPmNlcnQpOworICBjdHgtPmxhc3RfdW50cnVzdGVkID0gMTsKKworICAvKiBXZSB1c2UgYSB0ZW1wb3JhcnkgU1RBQ0sgc28gd2UgY2FuIGNob3AgYW5kIGhhY2sgYXQgaXQuCisgICAqIHNrdG1wID0gY3R4LT51bnRydXN0ZWQgKysgY3R4LT5jdHgtPmFkZGl0aW9uYWxfdW50cnVzdGVkICovCisgIGlmIChjdHgtPnVudHJ1c3RlZCAhPSBOVUxMICYmIChza3RtcCA9IHNrX1g1MDlfZHVwKGN0eC0+dW50cnVzdGVkKSkgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKGN0eC0+Y3R4LT5hZGRpdGlvbmFsX3VudHJ1c3RlZCAhPSBOVUxMKSB7CisgICAgaWYgKHNrdG1wID09IE5VTEwpIHsKKyAgICAgIHNrdG1wID0gc2tfWDUwOV9uZXdfbnVsbCgpOworICAgICAgaWYgKHNrdG1wID09IE5VTEwpIHsKICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOwogICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KICAgICB9Ci0gICAgWDUwOV91cF9yZWYoY3R4LT5jZXJ0KTsKLSAgICBjdHgtPmxhc3RfdW50cnVzdGVkID0gMTsKIAotICAgIC8qIFdlIHVzZSBhIHRlbXBvcmFyeSBTVEFDSyBzbyB3ZSBjYW4gY2hvcCBhbmQgaGFjayBhdCBpdC4KLSAgICAgKiBza3RtcCA9IGN0eC0+dW50cnVzdGVkICsrIGN0eC0+Y3R4LT5hZGRpdGlvbmFsX3VudHJ1c3RlZCAqLwotICAgIGlmIChjdHgtPnVudHJ1c3RlZCAhPSBOVUxMCi0gICAgICAgICYmIChza3RtcCA9IHNrX1g1MDlfZHVwKGN0eC0+dW50cnVzdGVkKSkgPT0gTlVMTCkgeworICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgc2tfWDUwOV9udW0oY3R4LT5jdHgtPmFkZGl0aW9uYWxfdW50cnVzdGVkKTsgaysrKSB7CisgICAgICBpZiAoIXNrX1g1MDlfcHVzaChza3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrX1g1MDlfdmFsdWUoY3R4LT5jdHgtPmFkZGl0aW9uYWxfdW50cnVzdGVkLCBrKSkpIHsKICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOwogICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KICAgICB9CisgIH0KIAotICAgIGlmIChjdHgtPmN0eC0+YWRkaXRpb25hbF91bnRydXN0ZWQgIT0gTlVMTCkgewotICAgICAgICBpZiAoc2t0bXAgPT0gTlVMTCkgewotICAgICAgICAgICAgc2t0bXAgPSBza19YNTA5X25ld19udWxsKCk7Ci0gICAgICAgICAgICBpZiAoc2t0bXAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIG51bSA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOworICB4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBudW0gLSAxKTsKKyAgZGVwdGggPSBwYXJhbS0+ZGVwdGg7CiAKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBza19YNTA5X251bShjdHgtPmN0eC0+YWRkaXRpb25hbF91bnRydXN0ZWQpOwotICAgICAgICAgICAgIGsrKykgewotICAgICAgICAgICAgaWYgKCFza19YNTA5X3B1c2goc2t0bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza19YNTA5X3ZhbHVlKGN0eC0+Y3R4LT5hZGRpdGlvbmFsX3VudHJ1c3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGspKSkgewotICAgICAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICBmb3IgKDs7KSB7CisgICAgLyogSWYgd2UgaGF2ZSBlbm91Z2gsIHdlIGJyZWFrICovCisgICAgaWYgKGRlcHRoIDwgbnVtKQorICAgICAgYnJlYWs7IC8qIEZJWE1FOiBJZiB0aGlzIGhhcHBlbnMsIHdlIHNob3VsZCB0YWtlCisgICAgICAgICAgICAgICogbm90ZSBvZiBpdCBhbmQsIGlmIGFwcHJvcHJpYXRlLCB1c2UgdGhlCisgICAgICAgICAgICAgICogWDUwOV9WX0VSUl9DRVJUX0NIQUlOX1RPT19MT05HIGVycm9yIGNvZGUKKyAgICAgICAgICAgICAgKiBsYXRlci4gKi8KIAotICAgIG51bSA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOwotICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIG51bSAtIDEpOwotICAgIGRlcHRoID0gcGFyYW0tPmRlcHRoOwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBJZiB3ZSBoYXZlIGVub3VnaCwgd2UgYnJlYWsgKi8KLSAgICAgICAgaWYgKGRlcHRoIDwgbnVtKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBGSVhNRTogSWYgdGhpcyBoYXBwZW5zLCB3ZSBzaG91bGQgdGFrZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3RlIG9mIGl0IGFuZCwgaWYgYXBwcm9wcmlhdGUsIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWDUwOV9WX0VSUl9DRVJUX0NIQUlOX1RPT19MT05HIGVycm9yIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGF0ZXIuICovCi0KLSAgICAgICAgLyogSWYgd2UgYXJlIHNlbGYgc2lnbmVkLCB3ZSBicmVhayAqLwotICAgICAgICBpZiAoY2VydF9zZWxmX3NpZ25lZCh4KSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKgotICAgICAgICAgKiBJZiBhc2tlZCBzZWUgaWYgd2UgY2FuIGZpbmQgaXNzdWVyIGluIHRydXN0ZWQgc3RvcmUgZmlyc3QKLSAgICAgICAgICovCi0gICAgICAgIGlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1RSVVNURURfRklSU1QpIHsKLSAgICAgICAgICAgIG9rID0gY3R4LT5nZXRfaXNzdWVyKCZ4dG1wLCBjdHgsIHgpOwotICAgICAgICAgICAgaWYgKG9rIDwgMCkgewotICAgICAgICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX1NUT1JFX0xPT0tVUDsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJZiBzdWNjZXNzZnVsIGZvciBub3cgZnJlZSB1cCBjZXJ0IHNvIGl0IHdpbGwgYmUgcGlja2VkIHVwCi0gICAgICAgICAgICAgKiBhZ2FpbiBsYXRlci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKG9rID4gMCkgewotICAgICAgICAgICAgICAgIFg1MDlfZnJlZSh4dG1wKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHdlIHdlcmUgcGFzc2VkIGEgY2VydCBjaGFpbiwgdXNlIGl0IGZpcnN0ICovCi0gICAgICAgIGlmIChza3RtcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB4dG1wID0gZmluZF9pc3N1ZXIoY3R4LCBza3RtcCwgeCk7Ci0gICAgICAgICAgICBpZiAoeHRtcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFza19YNTA5X3B1c2goY3R4LT5jaGFpbiwgeHRtcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOwotICAgICAgICAgICAgICAgICAgICBvayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYNTA5X3VwX3JlZih4dG1wKTsKLSAgICAgICAgICAgICAgICAodm9pZClza19YNTA5X2RlbGV0ZV9wdHIoc2t0bXAsIHh0bXApOwotICAgICAgICAgICAgICAgIGN0eC0+bGFzdF91bnRydXN0ZWQrKzsKLSAgICAgICAgICAgICAgICB4ID0geHRtcDsKLSAgICAgICAgICAgICAgICBudW0rKzsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIHJlcGFyc2UgdGhlIGZ1bGwgY2hhaW4gZm9yIHRoZSBuZXh0IG9uZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgLyogSWYgd2UgYXJlIHNlbGYgc2lnbmVkLCB3ZSBicmVhayAqLworICAgIGlmIChjZXJ0X3NlbGZfc2lnbmVkKHgpKQorICAgICAgYnJlYWs7CisgICAgLyoKKyAgICAgKiBJZiBhc2tlZCBzZWUgaWYgd2UgY2FuIGZpbmQgaXNzdWVyIGluIHRydXN0ZWQgc3RvcmUgZmlyc3QKKyAgICAgKi8KKyAgICBpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19UUlVTVEVEX0ZJUlNUKSB7CisgICAgICBvayA9IGN0eC0+Z2V0X2lzc3VlcigmeHRtcCwgY3R4LCB4KTsKKyAgICAgIGlmIChvayA8IDApIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfU1RPUkVfTE9PS1VQOworICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KKyAgICAgIC8qCisgICAgICAgKiBJZiBzdWNjZXNzZnVsIGZvciBub3cgZnJlZSB1cCBjZXJ0IHNvIGl0IHdpbGwgYmUgcGlja2VkIHVwCisgICAgICAgKiBhZ2FpbiBsYXRlci4KKyAgICAgICAqLworICAgICAgaWYgKG9rID4gMCkgeworICAgICAgICBYNTA5X2ZyZWUoeHRtcCk7CiAgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KIAotICAgIC8qIFJlbWVtYmVyIGhvdyBtYW55IHVudHJ1c3RlZCBjZXJ0cyB3ZSBoYXZlICovCi0gICAgaiA9IG51bTsKLSAgICAvKgotICAgICAqIGF0IHRoaXMgcG9pbnQsIGNoYWluIHNob3VsZCBjb250YWluIGEgbGlzdCBvZiB1bnRydXN0ZWQgY2VydGlmaWNhdGVzLgotICAgICAqIFdlIG5vdyBuZWVkIHRvIGFkZCBhdCBsZWFzdCBvbmUgdHJ1c3RlZCBvbmUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2Ugd2UKLSAgICAgKiBjb21wbGFpbi4KLSAgICAgKi8KLQotICAgIGRvIHsKKyAgICAvKiBJZiB3ZSB3ZXJlIHBhc3NlZCBhIGNlcnQgY2hhaW4sIHVzZSBpdCBmaXJzdCAqLworICAgIGlmIChza3RtcCAhPSBOVUxMKSB7CisgICAgICB4dG1wID0gZmluZF9pc3N1ZXIoY3R4LCBza3RtcCwgeCk7CisgICAgICBpZiAoeHRtcCAhPSBOVUxMKSB7CisgICAgICAgIGlmICghc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4sIHh0bXApKSB7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX09VVF9PRl9NRU07CisgICAgICAgICAgb2sgPSAwOworICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIFg1MDlfdXBfcmVmKHh0bXApOworICAgICAgICAodm9pZClza19YNTA5X2RlbGV0ZV9wdHIoc2t0bXAsIHh0bXApOworICAgICAgICBjdHgtPmxhc3RfdW50cnVzdGVkKys7CisgICAgICAgIHggPSB4dG1wOworICAgICAgICBudW0rKzsKICAgICAgICAgLyoKLSAgICAgICAgICogRXhhbWluZSBsYXN0IGNlcnRpZmljYXRlIGluIGNoYWluIGFuZCBzZWUgaWYgaXQgaXMgc2VsZiBzaWduZWQuCisgICAgICAgICAqIHJlcGFyc2UgdGhlIGZ1bGwgY2hhaW4gZm9yIHRoZSBuZXh0IG9uZQogICAgICAgICAgKi8KLSAgICAgICAgaSA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOwotICAgICAgICB4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpIC0gMSk7Ci0gICAgICAgIGlmIChjZXJ0X3NlbGZfc2lnbmVkKHgpKSB7Ci0gICAgICAgICAgICAvKiB3ZSBoYXZlIGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgKi8KLSAgICAgICAgICAgIGlmIChza19YNTA5X251bShjdHgtPmNoYWluKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBXZSBoYXZlIGEgc2luZ2xlIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlOiBzZWUgaWYgd2UgY2FuCi0gICAgICAgICAgICAgICAgICogZmluZCBpdCBpbiB0aGUgc3RvcmUuIFdlIG11c3QgaGF2ZSBhbiBleGFjdCBtYXRjaCB0byBhdm9pZAotICAgICAgICAgICAgICAgICAqIHBvc3NpYmxlIGltcGVyc29uYXRpb24uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgb2sgPSBjdHgtPmdldF9pc3N1ZXIoJnh0bXAsIGN0eCwgeCk7Ci0gICAgICAgICAgICAgICAgaWYgKChvayA8PSAwKSB8fCBYNTA5X2NtcCh4LCB4dG1wKSkgewotICAgICAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGkgLSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAob2sgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfZnJlZSh4dG1wKTsKLSAgICAgICAgICAgICAgICAgICAgYmFkX2NoYWluID0gMTsKLSAgICAgICAgICAgICAgICAgICAgb2sgPSBjYigwLCBjdHgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogV2UgaGF2ZSBhIG1hdGNoOiByZXBsYWNlIGNlcnRpZmljYXRlIHdpdGggc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICogdmVyc2lvbiBzbyB3ZSBnZXQgYW55IHRydXN0IHNldHRpbmdzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgWDUwOV9mcmVlKHgpOwotICAgICAgICAgICAgICAgICAgICB4ID0geHRtcDsKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpc2tfWDUwOV9zZXQoY3R4LT5jaGFpbiwgaSAtIDEsIHgpOwotICAgICAgICAgICAgICAgICAgICBjdHgtPmxhc3RfdW50cnVzdGVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogZXh0cmFjdCBhbmQgc2F2ZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBmb3IgbGF0ZXIgdXNlCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgY2hhaW5fc3MgPSBza19YNTA5X3BvcChjdHgtPmNoYWluKTsKLSAgICAgICAgICAgICAgICBjdHgtPmxhc3RfdW50cnVzdGVkLS07Ci0gICAgICAgICAgICAgICAgbnVtLS07Ci0gICAgICAgICAgICAgICAgai0tOwotICAgICAgICAgICAgICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIG51bSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFdlIG5vdyBsb29rdXAgY2VydHMgZnJvbSB0aGUgY2VydGlmaWNhdGUgc3RvcmUgKi8KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBlbm91Z2gsIHdlIGJyZWFrICovCi0gICAgICAgICAgICBpZiAoZGVwdGggPCBudW0pCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBhcmUgc2VsZiBzaWduZWQsIHdlIGJyZWFrICovCi0gICAgICAgICAgICBpZiAoY2VydF9zZWxmX3NpZ25lZCh4KSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG9rID0gY3R4LT5nZXRfaXNzdWVyKCZ4dG1wLCBjdHgsIHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KIAotICAgICAgICAgICAgaWYgKG9rIDwgMCkgewotICAgICAgICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX1NUT1JFX0xPT0tVUDsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvayA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgeCA9IHh0bXA7Ci0gICAgICAgICAgICBpZiAoIXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLCB4KSkgewotICAgICAgICAgICAgICAgIFg1MDlfZnJlZSh4dG1wKTsKLSAgICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfT1VUX09GX01FTTsKLSAgICAgICAgICAgICAgICBvayA9IDA7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW0rKzsKLSAgICAgICAgfQorICAvKiBSZW1lbWJlciBob3cgbWFueSB1bnRydXN0ZWQgY2VydHMgd2UgaGF2ZSAqLworICBqID0gbnVtOworICAvKgorICAgKiBhdCB0aGlzIHBvaW50LCBjaGFpbiBzaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgdW50cnVzdGVkIGNlcnRpZmljYXRlcy4KKyAgICogV2Ugbm93IG5lZWQgdG8gYWRkIGF0IGxlYXN0IG9uZSB0cnVzdGVkIG9uZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSB3ZQorICAgKiBjb21wbGFpbi4KKyAgICovCiAKLSAgICAgICAgLyogd2Ugbm93IGhhdmUgb3VyIGNoYWluLCBsZXRzIGNoZWNrIGl0Li4uICovCi0gICAgICAgIHRydXN0ID0gY2hlY2tfdHJ1c3QoY3R4KTsKLQotICAgICAgICAvKiBJZiBleHBsaWNpdGx5IHJlamVjdGVkIGVycm9yICovCi0gICAgICAgIGlmICh0cnVzdCA9PSBYNTA5X1RSVVNUX1JFSkVDVEVEKSB7Ci0gICAgICAgICAgICBvayA9IDA7CisgIGRvIHsKKyAgICAvKgorICAgICAqIEV4YW1pbmUgbGFzdCBjZXJ0aWZpY2F0ZSBpbiBjaGFpbiBhbmQgc2VlIGlmIGl0IGlzIHNlbGYgc2lnbmVkLgorICAgICAqLworICAgIGkgPSBza19YNTA5X251bShjdHgtPmNoYWluKTsKKyAgICB4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpIC0gMSk7CisgICAgaWYgKGNlcnRfc2VsZl9zaWduZWQoeCkpIHsKKyAgICAgIC8qIHdlIGhhdmUgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSAqLworICAgICAgaWYgKHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pID09IDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgaGF2ZSBhIHNpbmdsZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZTogc2VlIGlmIHdlIGNhbgorICAgICAgICAgKiBmaW5kIGl0IGluIHRoZSBzdG9yZS4gV2UgbXVzdCBoYXZlIGFuIGV4YWN0IG1hdGNoIHRvIGF2b2lkCisgICAgICAgICAqIHBvc3NpYmxlIGltcGVyc29uYXRpb24uCisgICAgICAgICAqLworICAgICAgICBvayA9IGN0eC0+Z2V0X2lzc3VlcigmeHRtcCwgY3R4LCB4KTsKKyAgICAgICAgaWYgKChvayA8PSAwKSB8fCBYNTA5X2NtcCh4LCB4dG1wKSkgeworICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVDsKKyAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CisgICAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGkgLSAxOworICAgICAgICAgIGlmIChvayA9PSAxKQorICAgICAgICAgICAgWDUwOV9mcmVlKHh0bXApOworICAgICAgICAgIGJhZF9jaGFpbiA9IDE7CisgICAgICAgICAgb2sgPSBjYigwLCBjdHgpOworICAgICAgICAgIGlmICghb2spCiAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBJZiBpdCdzIG5vdCBleHBsaWNpdGx5IHRydXN0ZWQgdGhlbiBjaGVjayBpZiB0aGVyZSBpcyBhbiBhbHRlcm5hdGl2ZQotICAgICAgICAgKiBjaGFpbiB0aGF0IGNvdWxkIGJlIHVzZWQuIFdlIG9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlbid0IGFscmVhZHkKLSAgICAgICAgICogY2hlY2tlZCB2aWEgVFJVU1RFRF9GSVJTVCBhbmQgdGhlIHVzZXIgaGFzbid0IHN3aXRjaGVkIG9mZiBhbHRlcm5hdGUKLSAgICAgICAgICogY2hhaW4gY2hlY2tpbmcKLSAgICAgICAgICovCi0gICAgICAgIHJldHJ5ID0gMDsKLSAgICAgICAgaWYgKHRydXN0ICE9IFg1MDlfVFJVU1RfVFJVU1RFRAotICAgICAgICAgICAgJiYgIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1RSVVNURURfRklSU1QpCi0gICAgICAgICAgICAmJiAhKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfTk9fQUxUX0NIQUlOUykpIHsKLSAgICAgICAgICAgIHdoaWxlIChqLS0gPiAxKSB7Ci0gICAgICAgICAgICAgICAgeHRtcDIgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGogLSAxKTsKLSAgICAgICAgICAgICAgICBvayA9IGN0eC0+Z2V0X2lzc3VlcigmeHRtcCwgY3R4LCB4dG1wMik7Ci0gICAgICAgICAgICAgICAgaWYgKG9rIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgd2UgZm91bmQgYW4gYWx0ZXJuYXRlIGNoYWluICovCi0gICAgICAgICAgICAgICAgaWYgKG9rID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBGcmVlIHVwIHRoZSBmb3VuZCBjZXJ0IHdlJ2xsIGFkZCBpdCBhZ2FpbiBsYXRlcgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgWDUwOV9mcmVlKHh0bXApOwotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIER1bXAgYWxsIHRoZSBjZXJ0cyBhYm92ZSB0aGlzIHBvaW50IC0gd2UndmUgZm91bmQgYW4KLSAgICAgICAgICAgICAgICAgICAgICogYWx0ZXJuYXRlIGNoYWluCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobnVtID4gaikgewotICAgICAgICAgICAgICAgICAgICAgICAgeHRtcCA9IHNrX1g1MDlfcG9wKGN0eC0+Y2hhaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9mcmVlKHh0bXApOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY3R4LT5sYXN0X3VudHJ1c3RlZCA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOwotICAgICAgICAgICAgICAgICAgICByZXRyeSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHJldHJ5KTsKLQotICAgIC8qCi0gICAgICogSWYgbm90IGV4cGxpY2l0bHkgdHJ1c3RlZCB0aGVuIGluZGljYXRlIGVycm9yIHVubGVzcyBpdCdzIGEgc2luZ2xlCi0gICAgICogc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgaW4gd2hpY2ggY2FzZSB3ZSd2ZSBpbmRpY2F0ZWQgYW4gZXJyb3IgYWxyZWFkeQotICAgICAqIGFuZCBzZXQgYmFkX2NoYWluID09IDEKLSAgICAgKi8KLSAgICBpZiAodHJ1c3QgIT0gWDUwOV9UUlVTVF9UUlVTVEVEICYmICFiYWRfY2hhaW4pIHsKLSAgICAgICAgaWYgKChjaGFpbl9zcyA9PSBOVUxMKSB8fCAhY3R4LT5jaGVja19pc3N1ZWQoY3R4LCB4LCBjaGFpbl9zcykpIHsKLSAgICAgICAgICAgIGlmIChjdHgtPmxhc3RfdW50cnVzdGVkID49IG51bSkKLSAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVDsKLSAgICAgICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4sIGNoYWluX3NzKTsKLSAgICAgICAgICAgIG51bSsrOwotICAgICAgICAgICAgY3R4LT5sYXN0X3VudHJ1c3RlZCA9IG51bTsKLSAgICAgICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0gY2hhaW5fc3M7Ci0gICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOOwotICAgICAgICAgICAgY2hhaW5fc3MgPSBOVUxMOworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UgaGF2ZSBhIG1hdGNoOiByZXBsYWNlIGNlcnRpZmljYXRlIHdpdGggc3RvcmUKKyAgICAgICAgICAgKiB2ZXJzaW9uIHNvIHdlIGdldCBhbnkgdHJ1c3Qgc2V0dGluZ3MuCisgICAgICAgICAgICovCisgICAgICAgICAgWDUwOV9mcmVlKHgpOworICAgICAgICAgIHggPSB4dG1wOworICAgICAgICAgICh2b2lkKXNrX1g1MDlfc2V0KGN0eC0+Y2hhaW4sIGkgLSAxLCB4KTsKKyAgICAgICAgICBjdHgtPmxhc3RfdW50cnVzdGVkID0gMDsKICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZXh0cmFjdCBhbmQgc2F2ZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBmb3IgbGF0ZXIgdXNlCisgICAgICAgICAqLworICAgICAgICBjaGFpbl9zcyA9IHNrX1g1MDlfcG9wKGN0eC0+Y2hhaW4pOworICAgICAgICBjdHgtPmxhc3RfdW50cnVzdGVkLS07CisgICAgICAgIG51bS0tOworICAgICAgICBqLS07CisgICAgICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIG51bSAtIDEpOworICAgICAgfQorICAgIH0KKyAgICAvKiBXZSBub3cgbG9va3VwIGNlcnRzIGZyb20gdGhlIGNlcnRpZmljYXRlIHN0b3JlICovCisgICAgZm9yICg7OykgeworICAgICAgLyogSWYgd2UgaGF2ZSBlbm91Z2gsIHdlIGJyZWFrICovCisgICAgICBpZiAoZGVwdGggPCBudW0pCisgICAgICAgIGJyZWFrOworICAgICAgLyogSWYgd2UgYXJlIHNlbGYgc2lnbmVkLCB3ZSBicmVhayAqLworICAgICAgaWYgKGNlcnRfc2VsZl9zaWduZWQoeCkpCisgICAgICAgIGJyZWFrOworICAgICAgb2sgPSBjdHgtPmdldF9pc3N1ZXIoJnh0bXAsIGN0eCwgeCk7CiAKLSAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IG51bSAtIDE7Ci0gICAgICAgIGJhZF9jaGFpbiA9IDE7Ci0gICAgICAgIG9rID0gY2IoMCwgY3R4KTsKLSAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgaWYgKG9rIDwgMCkgeworICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9TVE9SRV9MT09LVVA7CisgICAgICAgIGdvdG8gZW5kOworICAgICAgfQorICAgICAgaWYgKG9rID09IDApCisgICAgICAgIGJyZWFrOworICAgICAgeCA9IHh0bXA7CisgICAgICBpZiAoIXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLCB4KSkgeworICAgICAgICBYNTA5X2ZyZWUoeHRtcCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfT1VUX09GX01FTTsKKyAgICAgICAgb2sgPSAwOworICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KKyAgICAgIG51bSsrOwogICAgIH0KIAotICAgIC8qIFdlIGhhdmUgdGhlIGNoYWluIGNvbXBsZXRlOiBub3cgd2UgbmVlZCB0byBjaGVjayBpdHMgcHVycG9zZSAqLwotICAgIG9rID0gY2hlY2tfY2hhaW5fZXh0ZW5zaW9ucyhjdHgpOworICAgIC8qIHdlIG5vdyBoYXZlIG91ciBjaGFpbiwgbGV0cyBjaGVjayBpdC4uLiAqLworICAgIHRydXN0ID0gY2hlY2tfdHJ1c3QoY3R4KTsKIAotICAgIGlmICghb2spCi0gICAgICAgIGdvdG8gZW5kOwotCi0gICAgb2sgPSBjaGVja19pZChjdHgpOwotCi0gICAgaWYgKCFvaykKLSAgICAgICAgZ290byBlbmQ7Ci0KKyAgICAvKiBJZiBleHBsaWNpdGx5IHJlamVjdGVkIGVycm9yICovCisgICAgaWYgKHRydXN0ID09IFg1MDlfVFJVU1RfUkVKRUNURUQpIHsKKyAgICAgIG9rID0gMDsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KICAgICAvKgotICAgICAqIENoZWNrIHJldm9jYXRpb24gc3RhdHVzOiB3ZSBkbyB0aGlzIGFmdGVyIGNvcHlpbmcgcGFyYW1ldGVycyBiZWNhdXNlCi0gICAgICogdGhleSBtYXkgYmUgbmVlZGVkIGZvciBDUkwgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4KKyAgICAgKiBJZiBpdCdzIG5vdCBleHBsaWNpdGx5IHRydXN0ZWQgdGhlbiBjaGVjayBpZiB0aGVyZSBpcyBhbiBhbHRlcm5hdGl2ZQorICAgICAqIGNoYWluIHRoYXQgY291bGQgYmUgdXNlZC4gV2Ugb25seSBkbyB0aGlzIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeQorICAgICAqIGNoZWNrZWQgdmlhIFRSVVNURURfRklSU1QgYW5kIHRoZSB1c2VyIGhhc24ndCBzd2l0Y2hlZCBvZmYgYWx0ZXJuYXRlCisgICAgICogY2hhaW4gY2hlY2tpbmcKICAgICAgKi8KKyAgICByZXRyeSA9IDA7CisgICAgaWYgKHRydXN0ICE9IFg1MDlfVFJVU1RfVFJVU1RFRCAmJgorICAgICAgICAhKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfVFJVU1RFRF9GSVJTVCkgJiYKKyAgICAgICAgIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX05PX0FMVF9DSEFJTlMpKSB7CisgICAgICB3aGlsZSAoai0tID4gMSkgeworICAgICAgICB4dG1wMiA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgaiAtIDEpOworICAgICAgICBvayA9IGN0eC0+Z2V0X2lzc3VlcigmeHRtcCwgY3R4LCB4dG1wMik7CisgICAgICAgIGlmIChvayA8IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIC8qIENoZWNrIGlmIHdlIGZvdW5kIGFuIGFsdGVybmF0ZSBjaGFpbiAqLworICAgICAgICBpZiAob2sgPiAwKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBGcmVlIHVwIHRoZSBmb3VuZCBjZXJ0IHdlJ2xsIGFkZCBpdCBhZ2FpbiBsYXRlcgorICAgICAgICAgICAqLworICAgICAgICAgIFg1MDlfZnJlZSh4dG1wKTsKIAotICAgIG9rID0gY3R4LT5jaGVja19yZXZvY2F0aW9uKGN0eCk7Ci0gICAgaWYgKCFvaykKLSAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBEdW1wIGFsbCB0aGUgY2VydHMgYWJvdmUgdGhpcyBwb2ludCAtIHdlJ3ZlIGZvdW5kIGFuCisgICAgICAgICAgICogYWx0ZXJuYXRlIGNoYWluCisgICAgICAgICAgICovCisgICAgICAgICAgd2hpbGUgKG51bSA+IGopIHsKKyAgICAgICAgICAgIHh0bXAgPSBza19YNTA5X3BvcChjdHgtPmNoYWluKTsKKyAgICAgICAgICAgIFg1MDlfZnJlZSh4dG1wKTsKKyAgICAgICAgICAgIG51bS0tOworICAgICAgICAgIH0KKyAgICAgICAgICBjdHgtPmxhc3RfdW50cnVzdGVkID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbik7CisgICAgICAgICAgcmV0cnkgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChyZXRyeSk7CiAKLSAgICBpbnQgZXJyID0gWDUwOV9jaGFpbl9jaGVja19zdWl0ZWIoJmN0eC0+ZXJyb3JfZGVwdGgsIE5VTEwsIGN0eC0+Y2hhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPmZsYWdzKTsKLSAgICBpZiAoZXJyICE9IFg1MDlfVl9PSykgewotICAgICAgICBjdHgtPmVycm9yID0gZXJyOwotICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY3R4LT5lcnJvcl9kZXB0aCk7Ci0gICAgICAgIG9rID0gY2IoMCwgY3R4KTsKLSAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgIGdvdG8gZW5kOworICAvKgorICAgKiBJZiBub3QgZXhwbGljaXRseSB0cnVzdGVkIHRoZW4gaW5kaWNhdGUgZXJyb3IgdW5sZXNzIGl0J3MgYSBzaW5nbGUKKyAgICogc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgaW4gd2hpY2ggY2FzZSB3ZSd2ZSBpbmRpY2F0ZWQgYW4gZXJyb3IgYWxyZWFkeQorICAgKiBhbmQgc2V0IGJhZF9jaGFpbiA9PSAxCisgICAqLworICBpZiAodHJ1c3QgIT0gWDUwOV9UUlVTVF9UUlVTVEVEICYmICFiYWRfY2hhaW4pIHsKKyAgICBpZiAoKGNoYWluX3NzID09IE5VTEwpIHx8ICFjdHgtPmNoZWNrX2lzc3VlZChjdHgsIHgsIGNoYWluX3NzKSkgeworICAgICAgaWYgKGN0eC0+bGFzdF91bnRydXN0ZWQgPj0gbnVtKQorICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFk7CisgICAgICBlbHNlCisgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQ7CisgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CisgICAgfSBlbHNlIHsKKyAgICAgIHNrX1g1MDlfcHVzaChjdHgtPmNoYWluLCBjaGFpbl9zcyk7CisgICAgICBudW0rKzsKKyAgICAgIGN0eC0+bGFzdF91bnRydXN0ZWQgPSBudW07CisgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IGNoYWluX3NzOworICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfU0VMRl9TSUdORURfQ0VSVF9JTl9DSEFJTjsKKyAgICAgIGNoYWluX3NzID0gTlVMTDsKICAgICB9CiAKLSAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGEgY2hhaW4gYW5kIG5lZWQgdG8gdmVyaWZ5IGl0ICovCi0gICAgaWYgKGN0eC0+dmVyaWZ5ICE9IE5VTEwpCi0gICAgICAgIG9rID0gY3R4LT52ZXJpZnkoY3R4KTsKLSAgICBlbHNlCi0gICAgICAgIG9rID0gaW50ZXJuYWxfdmVyaWZ5KGN0eCk7CisgICAgY3R4LT5lcnJvcl9kZXB0aCA9IG51bSAtIDE7CisgICAgYmFkX2NoYWluID0gMTsKKyAgICBvayA9IGNiKDAsIGN0eCk7CiAgICAgaWYgKCFvaykKLSAgICAgICAgZ290byBlbmQ7CisgICAgICBnb3RvIGVuZDsKKyAgfQogCi0gICAgLyogQ2hlY2sgbmFtZSBjb25zdHJhaW50cyAqLworICAvKiBXZSBoYXZlIHRoZSBjaGFpbiBjb21wbGV0ZTogbm93IHdlIG5lZWQgdG8gY2hlY2sgaXRzIHB1cnBvc2UgKi8KKyAgb2sgPSBjaGVja19jaGFpbl9leHRlbnNpb25zKGN0eCk7CiAKLSAgICBvayA9IGNoZWNrX25hbWVfY29uc3RyYWludHMoY3R4KTsKKyAgaWYgKCFvaykKKyAgICBnb3RvIGVuZDsKKworICBvayA9IGNoZWNrX2lkKGN0eCk7CisKKyAgaWYgKCFvaykKKyAgICBnb3RvIGVuZDsKKworICAvKgorICAgKiBDaGVjayByZXZvY2F0aW9uIHN0YXR1czogd2UgZG8gdGhpcyBhZnRlciBjb3B5aW5nIHBhcmFtZXRlcnMgYmVjYXVzZQorICAgKiB0aGV5IG1heSBiZSBuZWVkZWQgZm9yIENSTCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLgorICAgKi8KKworICBvayA9IGN0eC0+Y2hlY2tfcmV2b2NhdGlvbihjdHgpOworICBpZiAoIW9rKQorICAgIGdvdG8gZW5kOworCisgIGludCBlcnIgPSBYNTA5X2NoYWluX2NoZWNrX3N1aXRlYigmY3R4LT5lcnJvcl9kZXB0aCwgTlVMTCwgY3R4LT5jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPmZsYWdzKTsKKyAgaWYgKGVyciAhPSBYNTA5X1ZfT0spIHsKKyAgICBjdHgtPmVycm9yID0gZXJyOworICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBjdHgtPmVycm9yX2RlcHRoKTsKKyAgICBvayA9IGNiKDAsIGN0eCk7CiAgICAgaWYgKCFvaykKLSAgICAgICAgZ290byBlbmQ7CisgICAgICBnb3RvIGVuZDsKKyAgfQogCi0gICAgLyogSWYgd2UgZ2V0IHRoaXMgZmFyIGV2YWx1YXRlIHBvbGljaWVzICovCi0gICAgaWYgKCFiYWRfY2hhaW4gJiYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfUE9MSUNZX0NIRUNLKSkKLSAgICAgICAgb2sgPSBjdHgtPmNoZWNrX3BvbGljeShjdHgpOworICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGEgY2hhaW4gYW5kIG5lZWQgdG8gdmVyaWZ5IGl0ICovCisgIGlmIChjdHgtPnZlcmlmeSAhPSBOVUxMKQorICAgIG9rID0gY3R4LT52ZXJpZnkoY3R4KTsKKyAgZWxzZQorICAgIG9rID0gaW50ZXJuYWxfdmVyaWZ5KGN0eCk7CisgIGlmICghb2spCisgICAgZ290byBlbmQ7CiAKLSBlbmQ6Ci0gICAgaWYgKHNrdG1wICE9IE5VTEwpCi0gICAgICAgIHNrX1g1MDlfZnJlZShza3RtcCk7Ci0gICAgaWYgKGNoYWluX3NzICE9IE5VTEwpCi0gICAgICAgIFg1MDlfZnJlZShjaGFpbl9zcyk7CisgIC8qIENoZWNrIG5hbWUgY29uc3RyYWludHMgKi8KIAotICAgIC8qIFNhZmV0eSBuZXQsIGVycm9yIHJldHVybnMgbXVzdCBzZXQgY3R4LT5lcnJvciAqLwotICAgIGlmIChvayA8PSAwICYmIGN0eC0+ZXJyb3IgPT0gWDUwOV9WX09LKQotICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTlNQRUNJRklFRDsKLSAgICByZXR1cm4gb2s7CisgIG9rID0gY2hlY2tfbmFtZV9jb25zdHJhaW50cyhjdHgpOworICBpZiAoIW9rKQorICAgIGdvdG8gZW5kOworCisgIC8qIElmIHdlIGdldCB0aGlzIGZhciBldmFsdWF0ZSBwb2xpY2llcyAqLworICBpZiAoIWJhZF9jaGFpbiAmJiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19QT0xJQ1lfQ0hFQ0spKQorICAgIG9rID0gY3R4LT5jaGVja19wb2xpY3koY3R4KTsKKworZW5kOgorICBpZiAoc2t0bXAgIT0gTlVMTCkKKyAgICBza19YNTA5X2ZyZWUoc2t0bXApOworICBpZiAoY2hhaW5fc3MgIT0gTlVMTCkKKyAgICBYNTA5X2ZyZWUoY2hhaW5fc3MpOworCisgIC8qIFNhZmV0eSBuZXQsIGVycm9yIHJldHVybnMgbXVzdCBzZXQgY3R4LT5lcnJvciAqLworICBpZiAob2sgPD0gMCAmJiBjdHgtPmVycm9yID09IFg1MDlfVl9PSykKKyAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTlNQRUNJRklFRDsKKyAgcmV0dXJuIG9rOwogfQogCiAvKgogICogR2l2ZW4gYSBTVEFDS19PRihYNTA5KSBmaW5kIHRoZSBpc3N1ZXIgb2YgY2VydCAoaWYgYW55KQogICovCiAKLXN0YXRpYyBYNTA5ICpmaW5kX2lzc3VlcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2ssIFg1MDkgKngpCi17Ci0gICAgc2l6ZV90IGk7Ci0gICAgWDUwOSAqaXNzdWVyOwotICAgIGZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShzayk7IGkrKykgewotICAgICAgICBpc3N1ZXIgPSBza19YNTA5X3ZhbHVlKHNrLCBpKTsKLSAgICAgICAgaWYgKGN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCwgaXNzdWVyKSkKLSAgICAgICAgICAgIHJldHVybiBpc3N1ZXI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOworc3RhdGljIFg1MDkgKmZpbmRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICogc2ssIFg1MDkgKngpIHsKKyAgc2l6ZV90IGk7CisgIFg1MDkgKmlzc3VlcjsKKyAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKHNrKTsgaSsrKSB7CisgICAgaXNzdWVyID0gc2tfWDUwOV92YWx1ZShzaywgaSk7CisgICAgaWYgKGN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCwgaXNzdWVyKSkKKyAgICAgIHJldHVybiBpc3N1ZXI7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEdpdmVuIGEgcG9zc2libGUgY2VydGlmaWNhdGUgYW5kIGlzc3VlciBjaGVjayB0aGVtICovCiAKLXN0YXRpYyBpbnQgY2hlY2tfaXNzdWVkKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngsIFg1MDkgKmlzc3VlcikKLXsKLSAgICBpbnQgcmV0OwotICAgIHJldCA9IFg1MDlfY2hlY2tfaXNzdWVkKGlzc3VlciwgeCk7Ci0gICAgaWYgKHJldCA9PSBYNTA5X1ZfT0spCi0gICAgICAgIHJldHVybiAxOwotICAgIC8qIElmIHdlIGhhdmVuJ3QgYXNrZWQgZm9yIGlzc3VlciBlcnJvcnMgZG9uJ3Qgc2V0IGN0eCAqLwotICAgIGlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfQ0JfSVNTVUVSX0NIRUNLKSkKLSAgICAgICAgcmV0dXJuIDA7CitzdGF0aWMgaW50IGNoZWNrX2lzc3VlZChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4LCBYNTA5ICppc3N1ZXIpIHsKKyAgaW50IHJldDsKKyAgcmV0ID0gWDUwOV9jaGVja19pc3N1ZWQoaXNzdWVyLCB4KTsKKyAgaWYgKHJldCA9PSBYNTA5X1ZfT0spCisgICAgcmV0dXJuIDE7CisgIC8qIElmIHdlIGhhdmVuJ3QgYXNrZWQgZm9yIGlzc3VlciBlcnJvcnMgZG9uJ3Qgc2V0IGN0eCAqLworICBpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0NCX0lTU1VFUl9DSEVDSykpCisgICAgcmV0dXJuIDA7CiAKLSAgICBjdHgtPmVycm9yID0gcmV0OwotICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKLSAgICBjdHgtPmN1cnJlbnRfaXNzdWVyID0gaXNzdWVyOwotICAgIHJldHVybiBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworICBjdHgtPmVycm9yID0gcmV0OworICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CisgIGN0eC0+Y3VycmVudF9pc3N1ZXIgPSBpc3N1ZXI7CisgIHJldHVybiBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOwogfQogCiAvKiBBbHRlcm5hdGl2ZSBsb29rdXAgbWV0aG9kOiBsb29rIGZyb20gYSBTVEFDSyBzdG9yZWQgaW4gb3RoZXJfY3R4ICovCiAKLXN0YXRpYyBpbnQgZ2V0X2lzc3Vlcl9zayhYNTA5ICoqaXNzdWVyLCBYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KQotewotICAgICppc3N1ZXIgPSBmaW5kX2lzc3VlcihjdHgsIGN0eC0+b3RoZXJfY3R4LCB4KTsKLSAgICBpZiAoKmlzc3VlcikgewotICAgICAgICBYNTA5X3VwX3JlZigqaXNzdWVyKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiAwOworc3RhdGljIGludCBnZXRfaXNzdWVyX3NrKFg1MDkgKippc3N1ZXIsIFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpIHsKKyAgKmlzc3VlciA9IGZpbmRfaXNzdWVyKGN0eCwgY3R4LT5vdGhlcl9jdHgsIHgpOworICBpZiAoKmlzc3VlcikgeworICAgIFg1MDlfdXBfcmVmKCppc3N1ZXIpOworICAgIHJldHVybiAxOworICB9IGVsc2UKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTU3Nyw0ODcgKzU2Myw0NzQgQEAKICAqIHB1cnBvc2UKICAqLwogCi1zdGF0aWMgaW50IGNoZWNrX2NoYWluX2V4dGVuc2lvbnMoWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICBpbnQgaSwgb2sgPSAwLCBwbGVuID0gMDsKLSAgICBYNTA5ICp4OwotICAgIGludCAoKmNiKSAoaW50IHhvaywgWDUwOV9TVE9SRV9DVFggKnhjdHgpOwotICAgIGludCBwcm94eV9wYXRoX2xlbmd0aCA9IDA7Ci0gICAgaW50IHB1cnBvc2U7Ci0gICAgaW50IGFsbG93X3Byb3h5X2NlcnRzOwotICAgIGNiID0gY3R4LT52ZXJpZnlfY2I7CitzdGF0aWMgaW50IGNoZWNrX2NoYWluX2V4dGVuc2lvbnMoWDUwOV9TVE9SRV9DVFggKmN0eCkgeworICBpbnQgaSwgb2sgPSAwLCBwbGVuID0gMDsKKyAgWDUwOSAqeDsKKyAgaW50ICgqY2IpKGludCB4b2ssIFg1MDlfU1RPUkVfQ1RYICp4Y3R4KTsKKyAgaW50IHByb3h5X3BhdGhfbGVuZ3RoID0gMDsKKyAgaW50IHB1cnBvc2U7CisgIGludCBhbGxvd19wcm94eV9jZXJ0czsKKyAgY2IgPSBjdHgtPnZlcmlmeV9jYjsKIAotICAgIGVudW0gewotICAgICAgICAvLyBjYV9vcl9sZWFmIGFsbG93cyBlaXRoZXIgdHlwZSBvZiBjZXJ0aWZpY2F0ZSBzbyB0aGF0IGRpcmVjdCB1c2Ugb2YKLSAgICAgICAgLy8gc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIHdvcmtzLgotICAgICAgICBjYV9vcl9sZWFmLAotICAgICAgICBtdXN0X2JlX2NhLAotICAgICAgICBtdXN0X25vdF9iZV9jYSwKLSAgICB9IGNhX3JlcXVpcmVtZW50OworICBlbnVtIHsKKyAgICAvLyBjYV9vcl9sZWFmIGFsbG93cyBlaXRoZXIgdHlwZSBvZiBjZXJ0aWZpY2F0ZSBzbyB0aGF0IGRpcmVjdCB1c2Ugb2YKKyAgICAvLyBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgd29ya3MuCisgICAgY2Ffb3JfbGVhZiwKKyAgICBtdXN0X2JlX2NhLAorICAgIG11c3Rfbm90X2JlX2NhLAorICB9IGNhX3JlcXVpcmVtZW50OwogCi0gICAgLyogQ1JMIHBhdGggdmFsaWRhdGlvbiAqLwotICAgIGlmIChjdHgtPnBhcmVudCkgewotICAgICAgICBhbGxvd19wcm94eV9jZXJ0cyA9IDA7Ci0gICAgICAgIHB1cnBvc2UgPSBYNTA5X1BVUlBPU0VfQ1JMX1NJR047Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxsb3dfcHJveHlfY2VydHMgPQotICAgICAgICAgICAgISAhKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfQUxMT1dfUFJPWFlfQ0VSVFMpOwotICAgICAgICBwdXJwb3NlID0gY3R4LT5wYXJhbS0+cHVycG9zZTsKKyAgLyogQ1JMIHBhdGggdmFsaWRhdGlvbiAqLworICBpZiAoY3R4LT5wYXJlbnQpIHsKKyAgICBhbGxvd19wcm94eV9jZXJ0cyA9IDA7CisgICAgcHVycG9zZSA9IFg1MDlfUFVSUE9TRV9DUkxfU0lHTjsKKyAgfSBlbHNlIHsKKyAgICBhbGxvd19wcm94eV9jZXJ0cyA9ICEhKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfQUxMT1dfUFJPWFlfQ0VSVFMpOworICAgIHB1cnBvc2UgPSBjdHgtPnBhcmFtLT5wdXJwb3NlOworICB9CisKKyAgY2FfcmVxdWlyZW1lbnQgPSBjYV9vcl9sZWFmOworCisgIC8qIENoZWNrIGFsbCB1bnRydXN0ZWQgY2VydGlmaWNhdGVzICovCisgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmxhc3RfdW50cnVzdGVkOyBpKyspIHsKKyAgICBpbnQgcmV0OworICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGkpOworICAgIGlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfSUdOT1JFX0NSSVRJQ0FMKSAmJgorICAgICAgICAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ1JJVElDQUwpKSB7CisgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OOworICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CisgICAgICBvayA9IGNiKDAsIGN0eCk7CisgICAgICBpZiAoIW9rKQorICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKCFhbGxvd19wcm94eV9jZXJ0cyAmJiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfUFJPWFkpKSB7CisgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9QUk9YWV9DRVJUSUZJQ0FURVNfTk9UX0FMTE9XRUQ7CisgICAgICBjdHgtPmVycm9yX2RlcHRoID0gaTsKKyAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKyAgICAgIG9rID0gY2IoMCwgY3R4KTsKKyAgICAgIGlmICghb2spCisgICAgICAgIGdvdG8gZW5kOwogICAgIH0KIAotICAgIGNhX3JlcXVpcmVtZW50ID0gY2Ffb3JfbGVhZjsKLQotICAgIC8qIENoZWNrIGFsbCB1bnRydXN0ZWQgY2VydGlmaWNhdGVzICovCi0gICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bGFzdF91bnRydXN0ZWQ7IGkrKykgewotICAgICAgICBpbnQgcmV0OwotICAgICAgICB4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpKTsKLSAgICAgICAgaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19JR05PUkVfQ1JJVElDQUwpCi0gICAgICAgICAgICAmJiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ1JJVElDQUwpKSB7Ci0gICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OOwotICAgICAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7Ci0gICAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgICAgICBvayA9IGNiKDAsIGN0eCk7Ci0gICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYWxsb3dfcHJveHlfY2VydHMgJiYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1BST1hZKSkgewotICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfUFJPWFlfQ0VSVElGSUNBVEVTX05PVF9BTExPV0VEOwotICAgICAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7Ci0gICAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgICAgICBvayA9IGNiKDAsIGN0eCk7Ci0gICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChjYV9yZXF1aXJlbWVudCkgewotICAgICAgICBjYXNlIGNhX29yX2xlYWY6Ci0gICAgICAgICAgICByZXQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbXVzdF9ub3RfYmVfY2E6Ci0gICAgICAgICAgICBpZiAoWDUwOV9jaGVja19jYSh4KSkgewotICAgICAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9OT05fQ0E7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbXVzdF9iZV9jYToKLSAgICAgICAgICAgIGlmICghWDUwOV9jaGVja19jYSh4KSkgewotICAgICAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9DQTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGltcG9zc2libGUuCi0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICBjdHgtPmVycm9yX2RlcHRoID0gaTsKLSAgICAgICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKLSAgICAgICAgICAgIG9rID0gY2IoMCwgY3R4KTsKLSAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN0eC0+cGFyYW0tPnB1cnBvc2UgPiAwKSB7Ci0gICAgICAgICAgICByZXQgPSBYNTA5X2NoZWNrX3B1cnBvc2UoeCwgcHVycG9zZSwgY2FfcmVxdWlyZW1lbnQgPT0gbXVzdF9iZV9jYSk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfUFVSUE9TRTsKLSAgICAgICAgICAgICAgICBjdHgtPmVycm9yX2RlcHRoID0gaTsKLSAgICAgICAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgICAgICAgICAgb2sgPSBjYigwLCBjdHgpOwotICAgICAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIENoZWNrIHBhdGhsZW4gaWYgbm90IHNlbGYgaXNzdWVkICovCi0gICAgICAgIGlmICgoaSA+IDEpICYmICEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0kpCi0gICAgICAgICAgICAmJiAoeC0+ZXhfcGF0aGxlbiAhPSAtMSkKLSAgICAgICAgICAgICYmIChwbGVuID4gKHgtPmV4X3BhdGhsZW4gKyBwcm94eV9wYXRoX2xlbmd0aCArIDEpKSkgewotICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfUEFUSF9MRU5HVEhfRVhDRUVERUQ7Ci0gICAgICAgICAgICBjdHgtPmVycm9yX2RlcHRoID0gaTsKLSAgICAgICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKLSAgICAgICAgICAgIG9rID0gY2IoMCwgY3R4KTsKLSAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogSW5jcmVtZW50IHBhdGggbGVuZ3RoIGlmIG5vdCBzZWxmIGlzc3VlZCAqLwotICAgICAgICBpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCi0gICAgICAgICAgICBwbGVuKys7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoaXMgY2VydGlmaWNhdGUgaXMgYSBwcm94eSBjZXJ0aWZpY2F0ZSwgdGhlIG5leHQgY2VydGlmaWNhdGUKLSAgICAgICAgICogbXVzdCBiZSBhbm90aGVyIHByb3h5IGNlcnRpZmljYXRlIG9yIGEgRUUgY2VydGlmaWNhdGUuICBJZiBub3QsCi0gICAgICAgICAqIHRoZSBuZXh0IGNlcnRpZmljYXRlIG11c3QgYmUgYSBDQSBjZXJ0aWZpY2F0ZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh4LT5leF9mbGFncyAmIEVYRkxBR19QUk9YWSkgewotICAgICAgICAgICAgaWYgKHgtPmV4X3BjcGF0aGxlbiAhPSAtMSAmJiBpID4geC0+ZXhfcGNwYXRobGVuKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfUFJPWFlfUEFUSF9MRU5HVEhfRVhDRUVERUQ7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7Ci0gICAgICAgICAgICAgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4OwotICAgICAgICAgICAgICAgIG9rID0gY2IoMCwgY3R4KTsKLSAgICAgICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3h5X3BhdGhfbGVuZ3RoKys7Ci0gICAgICAgICAgICBjYV9yZXF1aXJlbWVudCA9IG11c3Rfbm90X2JlX2NhOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FfcmVxdWlyZW1lbnQgPSBtdXN0X2JlX2NhOwotICAgICAgICB9Ci0gICAgfQotICAgIG9rID0gMTsKLSBlbmQ6Ci0gICAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX25hbWVfY29uc3RyYWludHMoWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICBYNTA5ICp4OwotICAgIGludCBpLCBqLCBydjsKLSAgICAvKiBDaGVjayBuYW1lIGNvbnN0cmFpbnRzIGZvciBhbGwgY2VydGlmaWNhdGVzICovCi0gICAgZm9yIChpID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICB4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpKTsKLSAgICAgICAgLyogSWdub3JlIHNlbGYgaXNzdWVkIGNlcnRzIHVubGVzcyBsYXN0IGluIGNoYWluICovCi0gICAgICAgIGlmIChpICYmICh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2sgYWdhaW5zdCBjb25zdHJhaW50cyBmb3IgYWxsIGNlcnRpZmljYXRlcyBoaWdoZXIgaW4gY2hhaW4KLSAgICAgICAgICogaW5jbHVkaW5nIHRydXN0IGFuY2hvci4gVHJ1c3QgYW5jaG9yIG5vdCBzdHJpY3RseSBzcGVha2luZyBuZWVkZWQKLSAgICAgICAgICogYnV0IGlmIGl0IGluY2x1ZGVzIGNvbnN0cmFpbnRzIGl0IGlzIHRvIGJlIGFzc3VtZWQgaXQgZXhwZWN0cyB0aGVtCi0gICAgICAgICAqIHRvIGJlIG9iZXllZC4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaiA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pIC0gMTsgaiA+IGk7IGotLSkgewotICAgICAgICAgICAgTkFNRV9DT05TVFJBSU5UUyAqbmMgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGopLT5uYzsKLSAgICAgICAgICAgIGlmIChuYykgewotICAgICAgICAgICAgICAgIHJ2ID0gTkFNRV9DT05TVFJBSU5UU19jaGVjayh4LCBuYyk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChydikgewotICAgICAgICAgICAgICAgIGNhc2UgWDUwOV9WX09LOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBjYXNlIFg1MDlfVl9FUlJfT1VUX09GX01FTToKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IHJ2OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gcnY7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+ZXJyb3JfZGVwdGggPSBpOwotICAgICAgICAgICAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfaWRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGVycmNvZGUpCi17Ci0gICAgY3R4LT5lcnJvciA9IGVycmNvZGU7Ci0gICAgY3R4LT5jdXJyZW50X2NlcnQgPSBjdHgtPmNlcnQ7Ci0gICAgY3R4LT5lcnJvcl9kZXB0aCA9IDA7Ci0gICAgcmV0dXJuIGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfaG9zdHMoWDUwOSAqeCwgWDUwOV9WRVJJRllfUEFSQU1fSUQgKmlkKQotewotICAgIHNpemVfdCBpOwotICAgIHNpemVfdCBuID0gc2tfT1BFTlNTTF9TVFJJTkdfbnVtKGlkLT5ob3N0cyk7Ci0gICAgY2hhciAqbmFtZTsKLQotICAgIGlmIChpZC0+cGVlcm5hbWUgIT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX2ZyZWUoaWQtPnBlZXJuYW1lKTsKLSAgICAgICAgaWQtPnBlZXJuYW1lID0gTlVMTDsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBuYW1lID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoaWQtPmhvc3RzLCBpKTsKLSAgICAgICAgaWYgKFg1MDlfY2hlY2tfaG9zdCh4LCBuYW1lLCBzdHJsZW4obmFtZSksIGlkLT5ob3N0ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkLT5wZWVybmFtZSkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiBuID09IDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfaWQoWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICBYNTA5X1ZFUklGWV9QQVJBTSAqdnBtID0gY3R4LT5wYXJhbTsKLSAgICBYNTA5X1ZFUklGWV9QQVJBTV9JRCAqaWQgPSB2cG0tPmlkOwotICAgIFg1MDkgKnggPSBjdHgtPmNlcnQ7Ci0gICAgaWYgKGlkLT5wb2lzb24pIHsKLSAgICAgICAgaWYgKCFjaGVja19pZF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfSU5WQUxJRF9DQUxMKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoaWQtPmhvc3RzICYmIGNoZWNrX2hvc3RzKHgsIGlkKSA8PSAwKSB7Ci0gICAgICAgIGlmICghY2hlY2tfaWRfZXJyb3IoY3R4LCBYNTA5X1ZfRVJSX0hPU1ROQU1FX01JU01BVENIKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoaWQtPmVtYWlsICYmIFg1MDlfY2hlY2tfZW1haWwoeCwgaWQtPmVtYWlsLCBpZC0+ZW1haWxsZW4sIDApIDw9IDApIHsKLSAgICAgICAgaWYgKCFjaGVja19pZF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfRU1BSUxfTUlTTUFUQ0gpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChpZC0+aXAgJiYgWDUwOV9jaGVja19pcCh4LCBpZC0+aXAsIGlkLT5pcGxlbiwgMCkgPD0gMCkgewotICAgICAgICBpZiAoIWNoZWNrX2lkX2Vycm9yKGN0eCwgWDUwOV9WX0VSUl9JUF9BRERSRVNTX01JU01BVENIKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBjaGVja190cnVzdChYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHNpemVfdCBpOwotICAgIGludCBvazsKLSAgICBYNTA5ICp4ID0gTlVMTDsKLSAgICBpbnQgKCpjYikgKGludCB4b2ssIFg1MDlfU1RPUkVfQ1RYICp4Y3R4KTsKLSAgICBjYiA9IGN0eC0+dmVyaWZ5X2NiOwotICAgIC8qIENoZWNrIGFsbCB0cnVzdGVkIGNlcnRpZmljYXRlcyBpbiBjaGFpbiAqLwotICAgIGZvciAoaSA9IGN0eC0+bGFzdF91bnRydXN0ZWQ7IGkgPCBza19YNTA5X251bShjdHgtPmNoYWluKTsgaSsrKSB7Ci0gICAgICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGkpOwotICAgICAgICBvayA9IFg1MDlfY2hlY2tfdHJ1c3QoeCwgY3R4LT5wYXJhbS0+dHJ1c3QsIDApOwotICAgICAgICAvKiBJZiBleHBsaWNpdGx5IHRydXN0ZWQgcmV0dXJuIHRydXN0ZWQgKi8KLSAgICAgICAgaWYgKG9rID09IFg1MDlfVFJVU1RfVFJVU1RFRCkKLSAgICAgICAgICAgIHJldHVybiBYNTA5X1RSVVNUX1RSVVNURUQ7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIGV4cGxpY2l0bHkgcmVqZWN0ZWQgbm90aWZ5IGNhbGxiYWNrIGFuZCByZWplY3QgaWYgbm90Ci0gICAgICAgICAqIG92ZXJyaWRkZW4uCi0gICAgICAgICAqLwotICAgICAgICBpZiAob2sgPT0gWDUwOV9UUlVTVF9SRUpFQ1RFRCkgewotICAgICAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7Ci0gICAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9DRVJUX1JFSkVDVEVEOwotICAgICAgICAgICAgb2sgPSBjYigwLCBjdHgpOwotICAgICAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgICAgICByZXR1cm4gWDUwOV9UUlVTVF9SRUpFQ1RFRDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKgotICAgICAqIElmIHdlIGFjY2VwdCBwYXJ0aWFsIGNoYWlucyBhbmQgaGF2ZSBhdCBsZWFzdCBvbmUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZQotICAgICAqIHJldHVybiBzdWNjZXNzLgotICAgICAqLwotICAgIGlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1BBUlRJQUxfQ0hBSU4pIHsKLSAgICAgICAgWDUwOSAqbXg7Ci0gICAgICAgIGlmIChjdHgtPmxhc3RfdW50cnVzdGVkIDwgKGludClza19YNTA5X251bShjdHgtPmNoYWluKSkKLSAgICAgICAgICAgIHJldHVybiBYNTA5X1RSVVNUX1RSVVNURUQ7Ci0gICAgICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIDApOwotICAgICAgICBteCA9IGxvb2t1cF9jZXJ0X21hdGNoKGN0eCwgeCk7Ci0gICAgICAgIGlmIChteCkgewotICAgICAgICAgICAgKHZvaWQpc2tfWDUwOV9zZXQoY3R4LT5jaGFpbiwgMCwgbXgpOwotICAgICAgICAgICAgWDUwOV9mcmVlKHgpOwotICAgICAgICAgICAgY3R4LT5sYXN0X3VudHJ1c3RlZCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gWDUwOV9UUlVTVF9UUlVTVEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiBubyB0cnVzdGVkIGNlcnRzIGluIGNoYWluIGF0IGFsbCByZXR1cm4gdW50cnVzdGVkIGFuZCBhbGxvdwotICAgICAqIHN0YW5kYXJkIChubyBpc3N1ZXIgY2VydCkgZXRjIGVycm9ycyB0byBiZSBpbmRpY2F0ZWQuCi0gICAgICovCi0gICAgcmV0dXJuIFg1MDlfVFJVU1RfVU5UUlVTVEVEOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX3Jldm9jYXRpb24oWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICBpbnQgaSwgbGFzdCwgb2s7Ci0gICAgaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0spKQotICAgICAgICByZXR1cm4gMTsKLSAgICBpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0tfQUxMKQotICAgICAgICBsYXN0ID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOwotICAgIGVsc2UgewotICAgICAgICAvKiBJZiBjaGVja2luZyBDUkwgcGF0aHMgdGhpcyBpc24ndCB0aGUgRUUgY2VydGlmaWNhdGUgKi8KLSAgICAgICAgaWYgKGN0eC0+cGFyZW50KQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGxhc3QgPSAwOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgewotICAgICAgICBjdHgtPmVycm9yX2RlcHRoID0gaTsKLSAgICAgICAgb2sgPSBjaGVja19jZXJ0KGN0eCk7Ci0gICAgICAgIGlmICghb2spCi0gICAgICAgICAgICByZXR1cm4gb2s7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICBYNTA5X0NSTCAqY3JsID0gTlVMTCwgKmRjcmwgPSBOVUxMOwotICAgIFg1MDkgKng7Ci0gICAgaW50IG9rID0gMCwgY251bTsKLSAgICB1bnNpZ25lZCBpbnQgbGFzdF9yZWFzb25zOwotICAgIGNudW0gPSBjdHgtPmVycm9yX2RlcHRoOwotICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGNudW0pOwotICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKLSAgICBjdHgtPmN1cnJlbnRfaXNzdWVyID0gTlVMTDsKLSAgICBjdHgtPmN1cnJlbnRfY3JsX3Njb3JlID0gMDsKLSAgICBjdHgtPmN1cnJlbnRfcmVhc29ucyA9IDA7Ci0gICAgd2hpbGUgKGN0eC0+Y3VycmVudF9yZWFzb25zICE9IENSTERQX0FMTF9SRUFTT05TKSB7Ci0gICAgICAgIGxhc3RfcmVhc29ucyA9IGN0eC0+Y3VycmVudF9yZWFzb25zOwotICAgICAgICAvKiBUcnkgdG8gcmV0cmlldmUgcmVsZXZhbnQgQ1JMICovCi0gICAgICAgIGlmIChjdHgtPmdldF9jcmwpCi0gICAgICAgICAgICBvayA9IGN0eC0+Z2V0X2NybChjdHgsICZjcmwsIHgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvayA9IGdldF9jcmxfZGVsdGEoY3R4LCAmY3JsLCAmZGNybCwgeCk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIGVycm9yIGxvb2tpbmcgdXAgQ1JMLCBub3RoaW5nIHdlIGNhbiBkbyBleGNlcHQgbm90aWZ5IGNhbGxiYWNrCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIW9rKSB7Ci0gICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTDsKLSAgICAgICAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKLSAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGN0eC0+Y3VycmVudF9jcmwgPSBjcmw7Ci0gICAgICAgIG9rID0gY3R4LT5jaGVja19jcmwoY3R4LCBjcmwpOwotICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgZ290byBlcnI7Ci0KLSAgICAgICAgaWYgKGRjcmwpIHsKLSAgICAgICAgICAgIG9rID0gY3R4LT5jaGVja19jcmwoY3R4LCBkY3JsKTsKLSAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICBvayA9IGN0eC0+Y2VydF9jcmwoY3R4LCBkY3JsLCB4KTsKLSAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgc3dpdGNoIChjYV9yZXF1aXJlbWVudCkgeworICAgICAgY2FzZSBjYV9vcl9sZWFmOgorICAgICAgICByZXQgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbXVzdF9ub3RfYmVfY2E6CisgICAgICAgIGlmIChYNTA5X2NoZWNrX2NhKHgpKSB7CisgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX05PTl9DQTsKICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBvayA9IDE7Ci0KLSAgICAgICAgLyogRG9uJ3QgbG9vayBpbiBmdWxsIENSTCBpZiBkZWx0YSByZWFzb24gaXMgcmVtb3ZlZnJvbUNSTCAqLwotICAgICAgICBpZiAob2sgIT0gMikgewotICAgICAgICAgICAgb2sgPSBjdHgtPmNlcnRfY3JsKGN0eCwgY3JsLCB4KTsKLSAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBYNTA5X0NSTF9mcmVlKGNybCk7Ci0gICAgICAgIFg1MDlfQ1JMX2ZyZWUoZGNybCk7Ci0gICAgICAgIGNybCA9IE5VTEw7Ci0gICAgICAgIGRjcmwgPSBOVUxMOwotICAgICAgICAvKgotICAgICAgICAgKiBJZiByZWFzb25zIG5vdCB1cGRhdGVkIHdlIHdvbnQgZ2V0IGFueXdoZXJlIGJ5IGFub3RoZXIgaXRlcmF0aW9uLAotICAgICAgICAgKiBzbyBleGl0IGxvb3AuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobGFzdF9yZWFzb25zID09IGN0eC0+Y3VycmVudF9yZWFzb25zKSB7Ci0gICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTDsKLSAgICAgICAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKLSAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9CisgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG11c3RfYmVfY2E6CisgICAgICAgIGlmICghWDUwOV9jaGVja19jYSh4KSkgeworICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9DQTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBpbXBvc3NpYmxlLgorICAgICAgICByZXQgPSAwOwogICAgIH0KLSBlcnI6CisKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgIGN0eC0+ZXJyb3JfZGVwdGggPSBpOworICAgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4OworICAgICAgb2sgPSBjYigwLCBjdHgpOworICAgICAgaWYgKCFvaykKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmIChjdHgtPnBhcmFtLT5wdXJwb3NlID4gMCkgeworICAgICAgcmV0ID0gWDUwOV9jaGVja19wdXJwb3NlKHgsIHB1cnBvc2UsIGNhX3JlcXVpcmVtZW50ID09IG11c3RfYmVfY2EpOworICAgICAgaWYgKHJldCAhPSAxKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfUFVSUE9TRTsKKyAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisgICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKyAgICAgICAgb2sgPSBjYigwLCBjdHgpOworICAgICAgICBpZiAoIW9rKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayBwYXRobGVuIGlmIG5vdCBzZWxmIGlzc3VlZCAqLworICAgIGlmICgoaSA+IDEpICYmICEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0kpICYmICh4LT5leF9wYXRobGVuICE9IC0xKSAmJgorICAgICAgICAocGxlbiA+ICh4LT5leF9wYXRobGVuICsgcHJveHlfcGF0aF9sZW5ndGggKyAxKSkpIHsKKyAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX1BBVEhfTEVOR1RIX0VYQ0VFREVEOworICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CisgICAgICBvayA9IGNiKDAsIGN0eCk7CisgICAgICBpZiAoIW9rKQorICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgLyogSW5jcmVtZW50IHBhdGggbGVuZ3RoIGlmIG5vdCBzZWxmIGlzc3VlZCAqLworICAgIGlmICghKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NJKSkKKyAgICAgIHBsZW4rKzsKKyAgICAvKgorICAgICAqIElmIHRoaXMgY2VydGlmaWNhdGUgaXMgYSBwcm94eSBjZXJ0aWZpY2F0ZSwgdGhlIG5leHQgY2VydGlmaWNhdGUKKyAgICAgKiBtdXN0IGJlIGFub3RoZXIgcHJveHkgY2VydGlmaWNhdGUgb3IgYSBFRSBjZXJ0aWZpY2F0ZS4gIElmIG5vdCwKKyAgICAgKiB0aGUgbmV4dCBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGEgQ0EgY2VydGlmaWNhdGUuCisgICAgICovCisgICAgaWYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1BST1hZKSB7CisgICAgICBpZiAoeC0+ZXhfcGNwYXRobGVuICE9IC0xICYmIGkgPiB4LT5leF9wY3BhdGhsZW4pIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfUFJPWFlfUEFUSF9MRU5HVEhfRVhDRUVERUQ7CisgICAgICAgIGN0eC0+ZXJyb3JfZGVwdGggPSBpOworICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CisgICAgICAgIG9rID0gY2IoMCwgY3R4KTsKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KKyAgICAgIHByb3h5X3BhdGhfbGVuZ3RoKys7CisgICAgICBjYV9yZXF1aXJlbWVudCA9IG11c3Rfbm90X2JlX2NhOworICAgIH0gZWxzZSB7CisgICAgICBjYV9yZXF1aXJlbWVudCA9IG11c3RfYmVfY2E7CisgICAgfQorICB9CisgIG9rID0gMTsKK2VuZDoKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IGNoZWNrX25hbWVfY29uc3RyYWludHMoWDUwOV9TVE9SRV9DVFggKmN0eCkgeworICBYNTA5ICp4OworICBpbnQgaSwgaiwgcnY7CisgIC8qIENoZWNrIG5hbWUgY29uc3RyYWludHMgZm9yIGFsbCBjZXJ0aWZpY2F0ZXMgKi8KKyAgZm9yIChpID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOyBpID49IDA7IGktLSkgeworICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGkpOworICAgIC8qIElnbm9yZSBzZWxmIGlzc3VlZCBjZXJ0cyB1bmxlc3MgbGFzdCBpbiBjaGFpbiAqLworICAgIGlmIChpICYmICh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCisgICAgICBjb250aW51ZTsKKyAgICAvKgorICAgICAqIENoZWNrIGFnYWluc3QgY29uc3RyYWludHMgZm9yIGFsbCBjZXJ0aWZpY2F0ZXMgaGlnaGVyIGluIGNoYWluCisgICAgICogaW5jbHVkaW5nIHRydXN0IGFuY2hvci4gVHJ1c3QgYW5jaG9yIG5vdCBzdHJpY3RseSBzcGVha2luZyBuZWVkZWQKKyAgICAgKiBidXQgaWYgaXQgaW5jbHVkZXMgY29uc3RyYWludHMgaXQgaXMgdG8gYmUgYXNzdW1lZCBpdCBleHBlY3RzIHRoZW0KKyAgICAgKiB0byBiZSBvYmV5ZWQuCisgICAgICovCisgICAgZm9yIChqID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOyBqID4gaTsgai0tKSB7CisgICAgICBOQU1FX0NPTlNUUkFJTlRTICpuYyA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgaiktPm5jOworICAgICAgaWYgKG5jKSB7CisgICAgICAgIHJ2ID0gTkFNRV9DT05TVFJBSU5UU19jaGVjayh4LCBuYyk7CisgICAgICAgIHN3aXRjaCAocnYpIHsKKyAgICAgICAgICBjYXNlIFg1MDlfVl9PSzoKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOgorICAgICAgICAgICAgY3R4LT5lcnJvciA9IHJ2OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGN0eC0+ZXJyb3IgPSBydjsKKyAgICAgICAgICAgIGN0eC0+ZXJyb3JfZGVwdGggPSBpOworICAgICAgICAgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4OworICAgICAgICAgICAgaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQorICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX2lkX2Vycm9yKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBlcnJjb2RlKSB7CisgIGN0eC0+ZXJyb3IgPSBlcnJjb2RlOworICBjdHgtPmN1cnJlbnRfY2VydCA9IGN0eC0+Y2VydDsKKyAgY3R4LT5lcnJvcl9kZXB0aCA9IDA7CisgIHJldHVybiBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2hvc3RzKFg1MDkgKngsIFg1MDlfVkVSSUZZX1BBUkFNX0lEICppZCkgeworICBzaXplX3QgaTsKKyAgc2l6ZV90IG4gPSBza19PUEVOU1NMX1NUUklOR19udW0oaWQtPmhvc3RzKTsKKyAgY2hhciAqbmFtZTsKKworICBpZiAoaWQtPnBlZXJuYW1lICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUoaWQtPnBlZXJuYW1lKTsKKyAgICBpZC0+cGVlcm5hbWUgPSBOVUxMOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBuYW1lID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoaWQtPmhvc3RzLCBpKTsKKyAgICBpZiAoWDUwOV9jaGVja19ob3N0KHgsIG5hbWUsIHN0cmxlbihuYW1lKSwgaWQtPmhvc3RmbGFncywgJmlkLT5wZWVybmFtZSkgPgorICAgICAgICAwKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIG4gPT0gMDsKK30KKworc3RhdGljIGludCBjaGVja19pZChYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIFg1MDlfVkVSSUZZX1BBUkFNICp2cG0gPSBjdHgtPnBhcmFtOworICBYNTA5X1ZFUklGWV9QQVJBTV9JRCAqaWQgPSB2cG0tPmlkOworICBYNTA5ICp4ID0gY3R4LT5jZXJ0OworICBpZiAoaWQtPnBvaXNvbikgeworICAgIGlmICghY2hlY2tfaWRfZXJyb3IoY3R4LCBYNTA5X1ZfRVJSX0lOVkFMSURfQ0FMTCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaWQtPmhvc3RzICYmIGNoZWNrX2hvc3RzKHgsIGlkKSA8PSAwKSB7CisgICAgaWYgKCFjaGVja19pZF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfSE9TVE5BTUVfTUlTTUFUQ0gpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGlkLT5lbWFpbCAmJiBYNTA5X2NoZWNrX2VtYWlsKHgsIGlkLT5lbWFpbCwgaWQtPmVtYWlsbGVuLCAwKSA8PSAwKSB7CisgICAgaWYgKCFjaGVja19pZF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfRU1BSUxfTUlTTUFUQ0gpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGlkLT5pcCAmJiBYNTA5X2NoZWNrX2lwKHgsIGlkLT5pcCwgaWQtPmlwbGVuLCAwKSA8PSAwKSB7CisgICAgaWYgKCFjaGVja19pZF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfSVBfQUREUkVTU19NSVNNQVRDSCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGVja190cnVzdChYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIHNpemVfdCBpOworICBpbnQgb2s7CisgIFg1MDkgKnggPSBOVUxMOworICBpbnQgKCpjYikoaW50IHhvaywgWDUwOV9TVE9SRV9DVFggKnhjdHgpOworICBjYiA9IGN0eC0+dmVyaWZ5X2NiOworICAvKiBDaGVjayBhbGwgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgaW4gY2hhaW4gKi8KKyAgZm9yIChpID0gY3R4LT5sYXN0X3VudHJ1c3RlZDsgaSA8IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOyBpKyspIHsKKyAgICB4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpKTsKKyAgICBvayA9IFg1MDlfY2hlY2tfdHJ1c3QoeCwgY3R4LT5wYXJhbS0+dHJ1c3QsIDApOworICAgIC8qIElmIGV4cGxpY2l0bHkgdHJ1c3RlZCByZXR1cm4gdHJ1c3RlZCAqLworICAgIGlmIChvayA9PSBYNTA5X1RSVVNUX1RSVVNURUQpCisgICAgICByZXR1cm4gWDUwOV9UUlVTVF9UUlVTVEVEOworICAgIC8qCisgICAgICogSWYgZXhwbGljaXRseSByZWplY3RlZCBub3RpZnkgY2FsbGJhY2sgYW5kIHJlamVjdCBpZiBub3QKKyAgICAgKiBvdmVycmlkZGVuLgorICAgICAqLworICAgIGlmIChvayA9PSBYNTA5X1RSVVNUX1JFSkVDVEVEKSB7CisgICAgICBjdHgtPmVycm9yX2RlcHRoID0gaTsKKyAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKyAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NFUlRfUkVKRUNURUQ7CisgICAgICBvayA9IGNiKDAsIGN0eCk7CisgICAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gWDUwOV9UUlVTVF9SRUpFQ1RFRDsKKyAgICB9CisgIH0KKyAgLyoKKyAgICogSWYgd2UgYWNjZXB0IHBhcnRpYWwgY2hhaW5zIGFuZCBoYXZlIGF0IGxlYXN0IG9uZSB0cnVzdGVkIGNlcnRpZmljYXRlCisgICAqIHJldHVybiBzdWNjZXNzLgorICAgKi8KKyAgaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfUEFSVElBTF9DSEFJTikgeworICAgIFg1MDkgKm14OworICAgIGlmIChjdHgtPmxhc3RfdW50cnVzdGVkIDwgKGludClza19YNTA5X251bShjdHgtPmNoYWluKSkKKyAgICAgIHJldHVybiBYNTA5X1RSVVNUX1RSVVNURUQ7CisgICAgeCA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgMCk7CisgICAgbXggPSBsb29rdXBfY2VydF9tYXRjaChjdHgsIHgpOworICAgIGlmIChteCkgeworICAgICAgKHZvaWQpc2tfWDUwOV9zZXQoY3R4LT5jaGFpbiwgMCwgbXgpOworICAgICAgWDUwOV9mcmVlKHgpOworICAgICAgY3R4LT5sYXN0X3VudHJ1c3RlZCA9IDA7CisgICAgICByZXR1cm4gWDUwOV9UUlVTVF9UUlVTVEVEOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIElmIG5vIHRydXN0ZWQgY2VydHMgaW4gY2hhaW4gYXQgYWxsIHJldHVybiB1bnRydXN0ZWQgYW5kIGFsbG93CisgICAqIHN0YW5kYXJkIChubyBpc3N1ZXIgY2VydCkgZXRjIGVycm9ycyB0byBiZSBpbmRpY2F0ZWQuCisgICAqLworICByZXR1cm4gWDUwOV9UUlVTVF9VTlRSVVNURUQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcmV2b2NhdGlvbihYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIGludCBpLCBsYXN0LCBvazsKKyAgaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0spKQorICAgIHJldHVybiAxOworICBpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0tfQUxMKQorICAgIGxhc3QgPSBza19YNTA5X251bShjdHgtPmNoYWluKSAtIDE7CisgIGVsc2UgeworICAgIC8qIElmIGNoZWNraW5nIENSTCBwYXRocyB0aGlzIGlzbid0IHRoZSBFRSBjZXJ0aWZpY2F0ZSAqLworICAgIGlmIChjdHgtPnBhcmVudCkKKyAgICAgIHJldHVybiAxOworICAgIGxhc3QgPSAwOworICB9CisgIGZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7CisgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisgICAgb2sgPSBjaGVja19jZXJ0KGN0eCk7CisgICAgaWYgKCFvaykKKyAgICAgIHJldHVybiBvazsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGVja19jZXJ0KFg1MDlfU1RPUkVfQ1RYICpjdHgpIHsKKyAgWDUwOV9DUkwgKmNybCA9IE5VTEwsICpkY3JsID0gTlVMTDsKKyAgWDUwOSAqeDsKKyAgaW50IG9rID0gMCwgY251bTsKKyAgdW5zaWduZWQgaW50IGxhc3RfcmVhc29uczsKKyAgY251bSA9IGN0eC0+ZXJyb3JfZGVwdGg7CisgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGNudW0pOworICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CisgIGN0eC0+Y3VycmVudF9pc3N1ZXIgPSBOVUxMOworICBjdHgtPmN1cnJlbnRfY3JsX3Njb3JlID0gMDsKKyAgY3R4LT5jdXJyZW50X3JlYXNvbnMgPSAwOworICB3aGlsZSAoY3R4LT5jdXJyZW50X3JlYXNvbnMgIT0gQ1JMRFBfQUxMX1JFQVNPTlMpIHsKKyAgICBsYXN0X3JlYXNvbnMgPSBjdHgtPmN1cnJlbnRfcmVhc29uczsKKyAgICAvKiBUcnkgdG8gcmV0cmlldmUgcmVsZXZhbnQgQ1JMICovCisgICAgaWYgKGN0eC0+Z2V0X2NybCkKKyAgICAgIG9rID0gY3R4LT5nZXRfY3JsKGN0eCwgJmNybCwgeCk7CisgICAgZWxzZQorICAgICAgb2sgPSBnZXRfY3JsX2RlbHRhKGN0eCwgJmNybCwgJmRjcmwsIHgpOworICAgIC8qCisgICAgICogSWYgZXJyb3IgbG9va2luZyB1cCBDUkwsIG5vdGhpbmcgd2UgY2FuIGRvIGV4Y2VwdCBub3RpZnkgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBpZiAoIW9rKSB7CisgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTDsKKyAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBjdHgtPmN1cnJlbnRfY3JsID0gY3JsOworICAgIG9rID0gY3R4LT5jaGVja19jcmwoY3R4LCBjcmwpOworICAgIGlmICghb2spCisgICAgICBnb3RvIGVycjsKKworICAgIGlmIChkY3JsKSB7CisgICAgICBvayA9IGN0eC0+Y2hlY2tfY3JsKGN0eCwgZGNybCk7CisgICAgICBpZiAoIW9rKQorICAgICAgICBnb3RvIGVycjsKKyAgICAgIG9rID0gY3R4LT5jZXJ0X2NybChjdHgsIGRjcmwsIHgpOworICAgICAgaWYgKCFvaykKKyAgICAgICAgZ290byBlcnI7CisgICAgfSBlbHNlCisgICAgICBvayA9IDE7CisKKyAgICAvKiBEb24ndCBsb29rIGluIGZ1bGwgQ1JMIGlmIGRlbHRhIHJlYXNvbiBpcyByZW1vdmVmcm9tQ1JMICovCisgICAgaWYgKG9rICE9IDIpIHsKKyAgICAgIG9rID0gY3R4LT5jZXJ0X2NybChjdHgsIGNybCwgeCk7CisgICAgICBpZiAoIW9rKQorICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKICAgICBYNTA5X0NSTF9mcmVlKGNybCk7CiAgICAgWDUwOV9DUkxfZnJlZShkY3JsKTsKKyAgICBjcmwgPSBOVUxMOworICAgIGRjcmwgPSBOVUxMOworICAgIC8qCisgICAgICogSWYgcmVhc29ucyBub3QgdXBkYXRlZCB3ZSB3b250IGdldCBhbnl3aGVyZSBieSBhbm90aGVyIGl0ZXJhdGlvbiwKKyAgICAgKiBzbyBleGl0IGxvb3AuCisgICAgICovCisgICAgaWYgKGxhc3RfcmVhc29ucyA9PSBjdHgtPmN1cnJlbnRfcmVhc29ucykgeworICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkw7CisgICAgICBvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KK2VycjoKKyAgWDUwOV9DUkxfZnJlZShjcmwpOworICBYNTA5X0NSTF9mcmVlKGRjcmwpOwogCi0gICAgY3R4LT5jdXJyZW50X2NybCA9IE5VTEw7Ci0gICAgcmV0dXJuIG9rOwotCisgIGN0eC0+Y3VycmVudF9jcmwgPSBOVUxMOworICByZXR1cm4gb2s7CiB9CiAKIC8qIENoZWNrIENSTCB0aW1lcyBhZ2FpbnN0IHZhbHVlcyBpbiBYNTA5X1NUT1JFX0NUWCAqLwogCi1zdGF0aWMgaW50IGNoZWNrX2NybF90aW1lKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwsIGludCBub3RpZnkpCi17Ci0gICAgdGltZV90ICpwdGltZTsKLSAgICBpbnQgaTsKLSAgICBpZiAobm90aWZ5KQotICAgICAgICBjdHgtPmN1cnJlbnRfY3JsID0gY3JsOwotICAgIGlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1VTRV9DSEVDS19USU1FKQotICAgICAgICBwdGltZSA9ICZjdHgtPnBhcmFtLT5jaGVja190aW1lOwotICAgIGVsc2UKLSAgICAgICAgcHRpbWUgPSBOVUxMOworc3RhdGljIGludCBjaGVja19jcmxfdGltZShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLCBpbnQgbm90aWZ5KSB7CisgIE9QRU5TU0xfcG9ydF90aW1lX3QgKnB0aW1lOworICBpbnQgaTsKKyAgaWYgKG5vdGlmeSkKKyAgICBjdHgtPmN1cnJlbnRfY3JsID0gY3JsOworICBpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19VU0VfQ0hFQ0tfVElNRSkKKyAgICBwdGltZSA9ICZjdHgtPnBhcmFtLT5jaGVja190aW1lOworICBlbHNlCisgICAgcHRpbWUgPSBOVUxMOwogCi0gICAgaSA9IFg1MDlfY21wX3RpbWUoWDUwOV9DUkxfZ2V0X2xhc3RVcGRhdGUoY3JsKSwgcHRpbWUpOworICBpID0gWDUwOV9jbXBfdGltZShYNTA5X0NSTF9nZXRfbGFzdFVwZGF0ZShjcmwpLCBwdGltZSk7CisgIGlmIChpID09IDApIHsKKyAgICBpZiAoIW5vdGlmeSkKKyAgICAgIHJldHVybiAwOworICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9MQVNUX1VQREFURV9GSUVMRDsKKyAgICBpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChpID4gMCkgeworICAgIGlmICghbm90aWZ5KQorICAgICAgcmV0dXJuIDA7CisgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ1JMX05PVF9ZRVRfVkFMSUQ7CisgICAgaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKSkgeworICAgIGkgPSBYNTA5X2NtcF90aW1lKFg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKGNybCksIHB0aW1lKTsKKwogICAgIGlmIChpID09IDApIHsKLSAgICAgICAgaWYgKCFub3RpZnkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX0xBU1RfVVBEQVRFX0ZJRUxEOwotICAgICAgICBpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIGlmICghbm90aWZ5KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9ORVhUX1VQREFURV9GSUVMRDsKKyAgICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotCi0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgIGlmICghbm90aWZ5KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NSTF9OT1RfWUVUX1ZBTElEOwotICAgICAgICBpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBJZ25vcmUgZXhwaXJ5IG9mIGJhc2UgQ1JMIGlzIGRlbHRhIGlzIHZhbGlkICovCisgICAgaWYgKChpIDwgMCkgJiYgIShjdHgtPmN1cnJlbnRfY3JsX3Njb3JlICYgQ1JMX1NDT1JFX1RJTUVfREVMVEEpKSB7CisgICAgICBpZiAoIW5vdGlmeSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9DUkxfSEFTX0VYUElSRUQ7CisgICAgICBpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgfQogCi0gICAgaWYgKFg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKGNybCkpIHsKLSAgICAgICAgaSA9IFg1MDlfY21wX3RpbWUoWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKSwgcHRpbWUpOworICBpZiAobm90aWZ5KQorICAgIGN0eC0+Y3VycmVudF9jcmwgPSBOVUxMOwogCi0gICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgIGlmICghbm90aWZ5KQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX05FWFRfVVBEQVRFX0ZJRUxEOwotICAgICAgICAgICAgaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIElnbm9yZSBleHBpcnkgb2YgYmFzZSBDUkwgaXMgZGVsdGEgaXMgdmFsaWQgKi8KLSAgICAgICAgaWYgKChpIDwgMCkgJiYgIShjdHgtPmN1cnJlbnRfY3JsX3Njb3JlICYgQ1JMX1NDT1JFX1RJTUVfREVMVEEpKSB7Ci0gICAgICAgICAgICBpZiAoIW5vdGlmeSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRDsKLSAgICAgICAgICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChub3RpZnkpCi0gICAgICAgIGN0eC0+Y3VycmVudF9jcmwgPSBOVUxMOwotCi0gICAgcmV0dXJuIDE7CisgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50IGdldF9jcmxfc2soWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKipwY3JsLCBYNTA5X0NSTCAqKnBkY3JsLAogICAgICAgICAgICAgICAgICAgICAgIFg1MDkgKipwaXNzdWVyLCBpbnQgKnBzY29yZSwgdW5zaWduZWQgaW50ICpwcmVhc29ucywKLSAgICAgICAgICAgICAgICAgICAgICBTVEFDS19PRihYNTA5X0NSTCkgKmNybHMpCi17Ci0gICAgaW50IGNybF9zY29yZSwgYmVzdF9zY29yZSA9ICpwc2NvcmU7Ci0gICAgc2l6ZV90IGk7Ci0gICAgdW5zaWduZWQgaW50IHJlYXNvbnMsIGJlc3RfcmVhc29ucyA9IDA7Ci0gICAgWDUwOSAqeCA9IGN0eC0+Y3VycmVudF9jZXJ0OwotICAgIFg1MDlfQ1JMICpjcmwsICpiZXN0X2NybCA9IE5VTEw7Ci0gICAgWDUwOSAqY3JsX2lzc3VlciA9IE5VTEwsICpiZXN0X2NybF9pc3N1ZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX09GKFg1MDlfQ1JMKSAqIGNybHMpIHsKKyAgaW50IGNybF9zY29yZSwgYmVzdF9zY29yZSA9ICpwc2NvcmU7CisgIHNpemVfdCBpOworICB1bnNpZ25lZCBpbnQgcmVhc29ucywgYmVzdF9yZWFzb25zID0gMDsKKyAgWDUwOSAqeCA9IGN0eC0+Y3VycmVudF9jZXJ0OworICBYNTA5X0NSTCAqY3JsLCAqYmVzdF9jcmwgPSBOVUxMOworICBYNTA5ICpjcmxfaXNzdWVyID0gTlVMTCwgKmJlc3RfY3JsX2lzc3VlciA9IE5VTEw7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9DUkxfbnVtKGNybHMpOyBpKyspIHsKLSAgICAgICAgY3JsID0gc2tfWDUwOV9DUkxfdmFsdWUoY3JscywgaSk7Ci0gICAgICAgIHJlYXNvbnMgPSAqcHJlYXNvbnM7Ci0gICAgICAgIGNybF9zY29yZSA9IGdldF9jcmxfc2NvcmUoY3R4LCAmY3JsX2lzc3VlciwgJnJlYXNvbnMsIGNybCwgeCk7Ci0gICAgICAgIGlmIChjcmxfc2NvcmUgPCBiZXN0X3Njb3JlIHx8IGNybF9zY29yZSA9PSAwKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIC8qIElmIGN1cnJlbnQgQ1JMIGlzIGVxdWl2YWxlbnQgdXNlIGl0IGlmIGl0IGlzIG5ld2VyICovCi0gICAgICAgIGlmIChjcmxfc2NvcmUgPT0gYmVzdF9zY29yZSAmJiBiZXN0X2NybCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQgZGF5LCBzZWM7Ci0gICAgICAgICAgICBpZiAoQVNOMV9USU1FX2RpZmYoJmRheSwgJnNlYywgWDUwOV9DUkxfZ2V0X2xhc3RVcGRhdGUoYmVzdF9jcmwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKGNybCkpID09IDApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQVNOMV9USU1FX2RpZmYgbmV2ZXIgcmV0dXJucyBpbmNvbnNpc3RlbnQgc2lnbnMgZm9yIHxkYXl8Ci0gICAgICAgICAgICAgKiBhbmQgfHNlY3wuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChkYXkgPD0gMCAmJiBzZWMgPD0gMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBiZXN0X2NybCA9IGNybDsKLSAgICAgICAgYmVzdF9jcmxfaXNzdWVyID0gY3JsX2lzc3VlcjsKLSAgICAgICAgYmVzdF9zY29yZSA9IGNybF9zY29yZTsKLSAgICAgICAgYmVzdF9yZWFzb25zID0gcmVhc29uczsKKyAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfQ1JMX251bShjcmxzKTsgaSsrKSB7CisgICAgY3JsID0gc2tfWDUwOV9DUkxfdmFsdWUoY3JscywgaSk7CisgICAgcmVhc29ucyA9ICpwcmVhc29uczsKKyAgICBjcmxfc2NvcmUgPSBnZXRfY3JsX3Njb3JlKGN0eCwgJmNybF9pc3N1ZXIsICZyZWFzb25zLCBjcmwsIHgpOworICAgIGlmIChjcmxfc2NvcmUgPCBiZXN0X3Njb3JlIHx8IGNybF9zY29yZSA9PSAwKQorICAgICAgY29udGludWU7CisgICAgLyogSWYgY3VycmVudCBDUkwgaXMgZXF1aXZhbGVudCB1c2UgaXQgaWYgaXQgaXMgbmV3ZXIgKi8KKyAgICBpZiAoY3JsX3Njb3JlID09IGJlc3Rfc2NvcmUgJiYgYmVzdF9jcmwgIT0gTlVMTCkgeworICAgICAgaW50IGRheSwgc2VjOworICAgICAgaWYgKEFTTjFfVElNRV9kaWZmKCZkYXksICZzZWMsIFg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKGJlc3RfY3JsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X0NSTF9nZXRfbGFzdFVwZGF0ZShjcmwpKSA9PSAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8qCisgICAgICAgKiBBU04xX1RJTUVfZGlmZiBuZXZlciByZXR1cm5zIGluY29uc2lzdGVudCBzaWducyBmb3IgfGRheXwKKyAgICAgICAqIGFuZCB8c2VjfC4KKyAgICAgICAqLworICAgICAgaWYgKGRheSA8PSAwICYmIHNlYyA8PSAwKQorICAgICAgICBjb250aW51ZTsKICAgICB9CisgICAgYmVzdF9jcmwgPSBjcmw7CisgICAgYmVzdF9jcmxfaXNzdWVyID0gY3JsX2lzc3VlcjsKKyAgICBiZXN0X3Njb3JlID0gY3JsX3Njb3JlOworICAgIGJlc3RfcmVhc29ucyA9IHJlYXNvbnM7CisgIH0KIAotICAgIGlmIChiZXN0X2NybCkgewotICAgICAgICBpZiAoKnBjcmwpCi0gICAgICAgICAgICBYNTA5X0NSTF9mcmVlKCpwY3JsKTsKLSAgICAgICAgKnBjcmwgPSBiZXN0X2NybDsKLSAgICAgICAgKnBpc3N1ZXIgPSBiZXN0X2NybF9pc3N1ZXI7Ci0gICAgICAgICpwc2NvcmUgPSBiZXN0X3Njb3JlOwotICAgICAgICAqcHJlYXNvbnMgPSBiZXN0X3JlYXNvbnM7Ci0gICAgICAgIFg1MDlfQ1JMX3VwX3JlZihiZXN0X2NybCk7Ci0gICAgICAgIGlmICgqcGRjcmwpIHsKLSAgICAgICAgICAgIFg1MDlfQ1JMX2ZyZWUoKnBkY3JsKTsKLSAgICAgICAgICAgICpwZGNybCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0X2RlbHRhX3NrKGN0eCwgcGRjcmwsIHBzY29yZSwgYmVzdF9jcmwsIGNybHMpOworICBpZiAoYmVzdF9jcmwpIHsKKyAgICBpZiAoKnBjcmwpCisgICAgICBYNTA5X0NSTF9mcmVlKCpwY3JsKTsKKyAgICAqcGNybCA9IGJlc3RfY3JsOworICAgICpwaXNzdWVyID0gYmVzdF9jcmxfaXNzdWVyOworICAgICpwc2NvcmUgPSBiZXN0X3Njb3JlOworICAgICpwcmVhc29ucyA9IGJlc3RfcmVhc29uczsKKyAgICBYNTA5X0NSTF91cF9yZWYoYmVzdF9jcmwpOworICAgIGlmICgqcGRjcmwpIHsKKyAgICAgIFg1MDlfQ1JMX2ZyZWUoKnBkY3JsKTsKKyAgICAgICpwZGNybCA9IE5VTEw7CiAgICAgfQorICAgIGdldF9kZWx0YV9zayhjdHgsIHBkY3JsLCBwc2NvcmUsIGJlc3RfY3JsLCBjcmxzKTsKKyAgfQogCi0gICAgaWYgKGJlc3Rfc2NvcmUgPj0gQ1JMX1NDT1JFX1ZBTElEKQotICAgICAgICByZXR1cm4gMTsKKyAgaWYgKGJlc3Rfc2NvcmUgPj0gQ1JMX1NDT1JFX1ZBTElEKQorICAgIHJldHVybiAxOwogCi0gICAgcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMTA2NSw2NiArMTAzOCw2MyBAQAogICogYm90aCBwcmVzZW50IG9yIGJvdGggYWJzZW50LiBJZiBib3RoIHByZXNlbnQgYWxsIGZpZWxkcyBtdXN0IGJlIGlkZW50aWNhbC4KICAqLwogCi1zdGF0aWMgaW50IGNybF9leHRlbnNpb25fbWF0Y2goWDUwOV9DUkwgKmEsIFg1MDlfQ1JMICpiLCBpbnQgbmlkKQotewotICAgIEFTTjFfT0NURVRfU1RSSU5HICpleHRhLCAqZXh0YjsKLSAgICBpbnQgaTsKLSAgICBpID0gWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoYSwgbmlkLCAtMSk7Ci0gICAgaWYgKGkgPj0gMCkgewotICAgICAgICAvKiBDYW4ndCBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzICovCi0gICAgICAgIGlmIChYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChhLCBuaWQsIGkpICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGV4dGEgPSBYNTA5X0VYVEVOU0lPTl9nZXRfZGF0YShYNTA5X0NSTF9nZXRfZXh0KGEsIGkpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZXh0YSA9IE5VTEw7CitzdGF0aWMgaW50IGNybF9leHRlbnNpb25fbWF0Y2goWDUwOV9DUkwgKmEsIFg1MDlfQ1JMICpiLCBpbnQgbmlkKSB7CisgIEFTTjFfT0NURVRfU1RSSU5HICpleHRhLCAqZXh0YjsKKyAgaW50IGk7CisgIGkgPSBYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChhLCBuaWQsIC0xKTsKKyAgaWYgKGkgPj0gMCkgeworICAgIC8qIENhbid0IGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgKi8KKyAgICBpZiAoWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoYSwgbmlkLCBpKSAhPSAtMSkKKyAgICAgIHJldHVybiAwOworICAgIGV4dGEgPSBYNTA5X0VYVEVOU0lPTl9nZXRfZGF0YShYNTA5X0NSTF9nZXRfZXh0KGEsIGkpKTsKKyAgfSBlbHNlCisgICAgZXh0YSA9IE5VTEw7CiAKLSAgICBpID0gWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoYiwgbmlkLCAtMSk7CisgIGkgPSBYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChiLCBuaWQsIC0xKTsKIAotICAgIGlmIChpID49IDApIHsKKyAgaWYgKGkgPj0gMCkgeworICAgIGlmIChYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChiLCBuaWQsIGkpICE9IC0xKQorICAgICAgcmV0dXJuIDA7CisgICAgZXh0YiA9IFg1MDlfRVhURU5TSU9OX2dldF9kYXRhKFg1MDlfQ1JMX2dldF9leHQoYiwgaSkpOworICB9IGVsc2UKKyAgICBleHRiID0gTlVMTDsKIAotICAgICAgICBpZiAoWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoYiwgbmlkLCBpKSAhPSAtMSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBleHRiID0gWDUwOV9FWFRFTlNJT05fZ2V0X2RhdGEoWDUwOV9DUkxfZ2V0X2V4dChiLCBpKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGV4dGIgPSBOVUxMOwotCi0gICAgaWYgKCFleHRhICYmICFleHRiKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmICghZXh0YSB8fCAhZXh0YikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGV4dGEsIGV4dGIpKQotICAgICAgICByZXR1cm4gMDsKLQorICBpZiAoIWV4dGEgJiYgIWV4dGIpCiAgICAgcmV0dXJuIDE7CisKKyAgaWYgKCFleHRhIHx8ICFleHRiKQorICAgIHJldHVybiAwOworCisgIGlmIChBU04xX09DVEVUX1NUUklOR19jbXAoZXh0YSwgZXh0YikpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7CiB9CiAKIC8qIFNlZSBpZiBhIGJhc2UgYW5kIGRlbHRhIGFyZSBjb21wYXRpYmxlICovCiAKLXN0YXRpYyBpbnQgY2hlY2tfZGVsdGFfYmFzZShYNTA5X0NSTCAqZGVsdGEsIFg1MDlfQ1JMICpiYXNlKQotewotICAgIC8qIERlbHRhIENSTCBtdXN0IGJlIGEgZGVsdGEgKi8KLSAgICBpZiAoIWRlbHRhLT5iYXNlX2NybF9udW1iZXIpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8qIEJhc2UgbXVzdCBoYXZlIGEgQ1JMIG51bWJlciAqLwotICAgIGlmICghYmFzZS0+Y3JsX251bWJlcikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLyogSXNzdWVyIG5hbWVzIG11c3QgbWF0Y2ggKi8KLSAgICBpZiAoWDUwOV9OQU1FX2NtcChYNTA5X0NSTF9nZXRfaXNzdWVyKGJhc2UpLCBYNTA5X0NSTF9nZXRfaXNzdWVyKGRlbHRhKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8qIEFLSUQgYW5kIElEUCBtdXN0IG1hdGNoICovCi0gICAgaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGRlbHRhLCBiYXNlLCBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGRlbHRhLCBiYXNlLCBOSURfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvKiBEZWx0YSBDUkwgYmFzZSBudW1iZXIgbXVzdCBub3QgZXhjZWVkIEZ1bGwgQ1JMIG51bWJlci4gKi8KLSAgICBpZiAoQVNOMV9JTlRFR0VSX2NtcChkZWx0YS0+YmFzZV9jcmxfbnVtYmVyLCBiYXNlLT5jcmxfbnVtYmVyKSA+IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIC8qIERlbHRhIENSTCBudW1iZXIgbXVzdCBleGNlZWQgZnVsbCBDUkwgbnVtYmVyICovCi0gICAgaWYgKEFTTjFfSU5URUdFUl9jbXAoZGVsdGEtPmNybF9udW1iZXIsIGJhc2UtPmNybF9udW1iZXIpID4gMCkKLSAgICAgICAgcmV0dXJuIDE7CitzdGF0aWMgaW50IGNoZWNrX2RlbHRhX2Jhc2UoWDUwOV9DUkwgKmRlbHRhLCBYNTA5X0NSTCAqYmFzZSkgeworICAvKiBEZWx0YSBDUkwgbXVzdCBiZSBhIGRlbHRhICovCisgIGlmICghZGVsdGEtPmJhc2VfY3JsX251bWJlcikKICAgICByZXR1cm4gMDsKKyAgLyogQmFzZSBtdXN0IGhhdmUgYSBDUkwgbnVtYmVyICovCisgIGlmICghYmFzZS0+Y3JsX251bWJlcikKKyAgICByZXR1cm4gMDsKKyAgLyogSXNzdWVyIG5hbWVzIG11c3QgbWF0Y2ggKi8KKyAgaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9DUkxfZ2V0X2lzc3VlcihiYXNlKSwgWDUwOV9DUkxfZ2V0X2lzc3VlcihkZWx0YSkpKQorICAgIHJldHVybiAwOworICAvKiBBS0lEIGFuZCBJRFAgbXVzdCBtYXRjaCAqLworICBpZiAoIWNybF9leHRlbnNpb25fbWF0Y2goZGVsdGEsIGJhc2UsIE5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIpKQorICAgIHJldHVybiAwOworICBpZiAoIWNybF9leHRlbnNpb25fbWF0Y2goZGVsdGEsIGJhc2UsIE5JRF9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludCkpCisgICAgcmV0dXJuIDA7CisgIC8qIERlbHRhIENSTCBiYXNlIG51bWJlciBtdXN0IG5vdCBleGNlZWQgRnVsbCBDUkwgbnVtYmVyLiAqLworICBpZiAoQVNOMV9JTlRFR0VSX2NtcChkZWx0YS0+YmFzZV9jcmxfbnVtYmVyLCBiYXNlLT5jcmxfbnVtYmVyKSA+IDApCisgICAgcmV0dXJuIDA7CisgIC8qIERlbHRhIENSTCBudW1iZXIgbXVzdCBleGNlZWQgZnVsbCBDUkwgbnVtYmVyICovCisgIGlmIChBU04xX0lOVEVHRVJfY21wKGRlbHRhLT5jcmxfbnVtYmVyLCBiYXNlLT5jcmxfbnVtYmVyKSA+IDApCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMTEzMywyNSArMTEwMywyNCBAQAogICovCiAKIHN0YXRpYyB2b2lkIGdldF9kZWx0YV9zayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqKmRjcmwsIGludCAqcHNjb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQ1JMICpiYXNlLCBTVEFDS19PRihYNTA5X0NSTCkgKmNybHMpCi17Ci0gICAgWDUwOV9DUkwgKmRlbHRhOwotICAgIHNpemVfdCBpOwotICAgIGlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfVVNFX0RFTFRBUykpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoISgoY3R4LT5jdXJyZW50X2NlcnQtPmV4X2ZsYWdzIHwgYmFzZS0+ZmxhZ3MpICYgRVhGTEFHX0ZSRVNIRVNUKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAoaSA9IDA7IGkgPCBza19YNTA5X0NSTF9udW0oY3Jscyk7IGkrKykgewotICAgICAgICBkZWx0YSA9IHNrX1g1MDlfQ1JMX3ZhbHVlKGNybHMsIGkpOwotICAgICAgICBpZiAoY2hlY2tfZGVsdGFfYmFzZShkZWx0YSwgYmFzZSkpIHsKLSAgICAgICAgICAgIGlmIChjaGVja19jcmxfdGltZShjdHgsIGRlbHRhLCAwKSkKLSAgICAgICAgICAgICAgICAqcHNjb3JlIHw9IENSTF9TQ09SRV9USU1FX0RFTFRBOwotICAgICAgICAgICAgWDUwOV9DUkxfdXBfcmVmKGRlbHRhKTsKLSAgICAgICAgICAgICpkY3JsID0gZGVsdGE7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X0NSTCAqYmFzZSwgU1RBQ0tfT0YoWDUwOV9DUkwpICogY3JscykgeworICBYNTA5X0NSTCAqZGVsdGE7CisgIHNpemVfdCBpOworICBpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1VTRV9ERUxUQVMpKQorICAgIHJldHVybjsKKyAgaWYgKCEoKGN0eC0+Y3VycmVudF9jZXJ0LT5leF9mbGFncyB8IGJhc2UtPmZsYWdzKSAmIEVYRkxBR19GUkVTSEVTVCkpCisgICAgcmV0dXJuOworICBmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9DUkxfbnVtKGNybHMpOyBpKyspIHsKKyAgICBkZWx0YSA9IHNrX1g1MDlfQ1JMX3ZhbHVlKGNybHMsIGkpOworICAgIGlmIChjaGVja19kZWx0YV9iYXNlKGRlbHRhLCBiYXNlKSkgeworICAgICAgaWYgKGNoZWNrX2NybF90aW1lKGN0eCwgZGVsdGEsIDApKQorICAgICAgICAqcHNjb3JlIHw9IENSTF9TQ09SRV9USU1FX0RFTFRBOworICAgICAgWDUwOV9DUkxfdXBfcmVmKGRlbHRhKTsKKyAgICAgICpkY3JsID0gZGVsdGE7CisgICAgICByZXR1cm47CiAgICAgfQotICAgICpkY3JsID0gTlVMTDsKKyAgfQorICAqZGNybCA9IE5VTEw7CiB9CiAKIC8qCkBAIC0xMTYzLDEyOSArMTEzMiwxMjUgQEAKICAqLwogCiBzdGF0aWMgaW50IGdldF9jcmxfc2NvcmUoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqKnBpc3N1ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwcmVhc29ucywgWDUwOV9DUkwgKmNybCwgWDUwOSAqeCkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnByZWFzb25zLCBYNTA5X0NSTCAqY3JsLCBYNTA5ICp4KSB7CisgIGludCBjcmxfc2NvcmUgPSAwOworICB1bnNpZ25lZCBpbnQgdG1wX3JlYXNvbnMgPSAqcHJlYXNvbnMsIGNybF9yZWFzb25zOwogCi0gICAgaW50IGNybF9zY29yZSA9IDA7Ci0gICAgdW5zaWduZWQgaW50IHRtcF9yZWFzb25zID0gKnByZWFzb25zLCBjcmxfcmVhc29uczsKKyAgLyogRmlyc3Qgc2VlIGlmIHdlIGNhbiByZWplY3QgQ1JMIHN0cmFpZ2h0IGF3YXkgKi8KIAotICAgIC8qIEZpcnN0IHNlZSBpZiB3ZSBjYW4gcmVqZWN0IENSTCBzdHJhaWdodCBhd2F5ICovCisgIC8qIEludmFsaWQgSURQIGNhbm5vdCBiZSBwcm9jZXNzZWQgKi8KKyAgaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX0lOVkFMSUQpCisgICAgcmV0dXJuIDA7CisgIC8qIFJlYXNvbiBjb2RlcyBvciBpbmRpcmVjdCBDUkxzIG5lZWQgZXh0ZW5kZWQgQ1JMIHN1cHBvcnQgKi8KKyAgaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19FWFRFTkRFRF9DUkxfU1VQUE9SVCkpIHsKKyAgICBpZiAoY3JsLT5pZHBfZmxhZ3MgJiAoSURQX0lORElSRUNUIHwgSURQX1JFQVNPTlMpKQorICAgICAgcmV0dXJuIDA7CisgIH0gZWxzZSBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfUkVBU09OUykgeworICAgIC8qIElmIG5vIG5ldyByZWFzb25zIHJlamVjdCAqLworICAgIGlmICghKGNybC0+aWRwX3JlYXNvbnMgJiB+dG1wX3JlYXNvbnMpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogRG9uJ3QgcHJvY2VzcyBkZWx0YXMgYXQgdGhpcyBzdGFnZSAqLworICBlbHNlIGlmIChjcmwtPmJhc2VfY3JsX251bWJlcikKKyAgICByZXR1cm4gMDsKKyAgLyogSWYgaXNzdWVyIG5hbWUgZG9lc24ndCBtYXRjaCBjZXJ0aWZpY2F0ZSBuZWVkIGluZGlyZWN0IENSTCAqLworICBpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9pc3N1ZXJfbmFtZSh4KSwgWDUwOV9DUkxfZ2V0X2lzc3VlcihjcmwpKSkgeworICAgIGlmICghKGNybC0+aWRwX2ZsYWdzICYgSURQX0lORElSRUNUKSkKKyAgICAgIHJldHVybiAwOworICB9IGVsc2UKKyAgICBjcmxfc2NvcmUgfD0gQ1JMX1NDT1JFX0lTU1VFUl9OQU1FOwogCi0gICAgLyogSW52YWxpZCBJRFAgY2Fubm90IGJlIHByb2Nlc3NlZCAqLwotICAgIGlmIChjcmwtPmlkcF9mbGFncyAmIElEUF9JTlZBTElEKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvKiBSZWFzb24gY29kZXMgb3IgaW5kaXJlY3QgQ1JMcyBuZWVkIGV4dGVuZGVkIENSTCBzdXBwb3J0ICovCi0gICAgaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19FWFRFTkRFRF9DUkxfU1VQUE9SVCkpIHsKLSAgICAgICAgaWYgKGNybC0+aWRwX2ZsYWdzICYgKElEUF9JTkRJUkVDVCB8IElEUF9SRUFTT05TKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfUkVBU09OUykgewotICAgICAgICAvKiBJZiBubyBuZXcgcmVhc29ucyByZWplY3QgKi8KLSAgICAgICAgaWYgKCEoY3JsLT5pZHBfcmVhc29ucyAmIH50bXBfcmVhc29ucykpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLyogRG9uJ3QgcHJvY2VzcyBkZWx0YXMgYXQgdGhpcyBzdGFnZSAqLwotICAgIGVsc2UgaWYgKGNybC0+YmFzZV9jcmxfbnVtYmVyKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvKiBJZiBpc3N1ZXIgbmFtZSBkb2Vzbid0IG1hdGNoIGNlcnRpZmljYXRlIG5lZWQgaW5kaXJlY3QgQ1JMICovCi0gICAgaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9nZXRfaXNzdWVyX25hbWUoeCksIFg1MDlfQ1JMX2dldF9pc3N1ZXIoY3JsKSkpIHsKLSAgICAgICAgaWYgKCEoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfSU5ESVJFQ1QpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlCi0gICAgICAgIGNybF9zY29yZSB8PSBDUkxfU0NPUkVfSVNTVUVSX05BTUU7CisgIGlmICghKGNybC0+ZmxhZ3MgJiBFWEZMQUdfQ1JJVElDQUwpKQorICAgIGNybF9zY29yZSB8PSBDUkxfU0NPUkVfTk9DUklUSUNBTDsKIAotICAgIGlmICghKGNybC0+ZmxhZ3MgJiBFWEZMQUdfQ1JJVElDQUwpKQotICAgICAgICBjcmxfc2NvcmUgfD0gQ1JMX1NDT1JFX05PQ1JJVElDQUw7CisgIC8qIENoZWNrIGV4cGlyeSAqLworICBpZiAoY2hlY2tfY3JsX3RpbWUoY3R4LCBjcmwsIDApKQorICAgIGNybF9zY29yZSB8PSBDUkxfU0NPUkVfVElNRTsKIAotICAgIC8qIENoZWNrIGV4cGlyeSAqLwotICAgIGlmIChjaGVja19jcmxfdGltZShjdHgsIGNybCwgMCkpCi0gICAgICAgIGNybF9zY29yZSB8PSBDUkxfU0NPUkVfVElNRTsKKyAgLyogQ2hlY2sgYXV0aG9yaXR5IGtleSBJRCBhbmQgbG9jYXRlIGNlcnRpZmljYXRlIGlzc3VlciAqLworICBjcmxfYWtpZF9jaGVjayhjdHgsIGNybCwgcGlzc3VlciwgJmNybF9zY29yZSk7CiAKLSAgICAvKiBDaGVjayBhdXRob3JpdHkga2V5IElEIGFuZCBsb2NhdGUgY2VydGlmaWNhdGUgaXNzdWVyICovCi0gICAgY3JsX2FraWRfY2hlY2soY3R4LCBjcmwsIHBpc3N1ZXIsICZjcmxfc2NvcmUpOworICAvKiBJZiB3ZSBjYW4ndCBsb2NhdGUgY2VydGlmaWNhdGUgaXNzdWVyIGF0IHRoaXMgcG9pbnQgZm9yZ2V0IGl0ICovCiAKLSAgICAvKiBJZiB3ZSBjYW4ndCBsb2NhdGUgY2VydGlmaWNhdGUgaXNzdWVyIGF0IHRoaXMgcG9pbnQgZm9yZ2V0IGl0ICovCisgIGlmICghKGNybF9zY29yZSAmIENSTF9TQ09SRV9BS0lEKSkKKyAgICByZXR1cm4gMDsKIAotICAgIGlmICghKGNybF9zY29yZSAmIENSTF9TQ09SRV9BS0lEKSkKLSAgICAgICAgcmV0dXJuIDA7CisgIC8qIENoZWNrIGNlcnQgZm9yIG1hdGNoaW5nIENSTCBkaXN0cmlidXRpb24gcG9pbnRzICovCiAKLSAgICAvKiBDaGVjayBjZXJ0IGZvciBtYXRjaGluZyBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyAqLworICBpZiAoY3JsX2NybGRwX2NoZWNrKHgsIGNybCwgY3JsX3Njb3JlLCAmY3JsX3JlYXNvbnMpKSB7CisgICAgLyogSWYgbm8gbmV3IHJlYXNvbnMgcmVqZWN0ICovCisgICAgaWYgKCEoY3JsX3JlYXNvbnMgJiB+dG1wX3JlYXNvbnMpKQorICAgICAgcmV0dXJuIDA7CisgICAgdG1wX3JlYXNvbnMgfD0gY3JsX3JlYXNvbnM7CisgICAgY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9TQ09QRTsKKyAgfQogCi0gICAgaWYgKGNybF9jcmxkcF9jaGVjayh4LCBjcmwsIGNybF9zY29yZSwgJmNybF9yZWFzb25zKSkgewotICAgICAgICAvKiBJZiBubyBuZXcgcmVhc29ucyByZWplY3QgKi8KLSAgICAgICAgaWYgKCEoY3JsX3JlYXNvbnMgJiB+dG1wX3JlYXNvbnMpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRtcF9yZWFzb25zIHw9IGNybF9yZWFzb25zOwotICAgICAgICBjcmxfc2NvcmUgfD0gQ1JMX1NDT1JFX1NDT1BFOwotICAgIH0KKyAgKnByZWFzb25zID0gdG1wX3JlYXNvbnM7CiAKLSAgICAqcHJlYXNvbnMgPSB0bXBfcmVhc29uczsKLQotICAgIHJldHVybiBjcmxfc2NvcmU7Ci0KKyAgcmV0dXJuIGNybF9zY29yZTsKIH0KIAotc3RhdGljIHZvaWQgY3JsX2FraWRfY2hlY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDkgKipwaXNzdWVyLCBpbnQgKnBjcmxfc2NvcmUpCi17Ci0gICAgWDUwOSAqY3JsX2lzc3VlciA9IE5VTEw7Ci0gICAgWDUwOV9OQU1FICpjbm0gPSBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCk7Ci0gICAgaW50IGNpZHggPSBjdHgtPmVycm9yX2RlcHRoOwotICAgIHNpemVfdCBpOworc3RhdGljIHZvaWQgY3JsX2FraWRfY2hlY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCwgWDUwOSAqKnBpc3N1ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBjcmxfc2NvcmUpIHsKKyAgWDUwOSAqY3JsX2lzc3VlciA9IE5VTEw7CisgIFg1MDlfTkFNRSAqY25tID0gWDUwOV9DUkxfZ2V0X2lzc3VlcihjcmwpOworICBpbnQgY2lkeCA9IGN0eC0+ZXJyb3JfZGVwdGg7CisgIHNpemVfdCBpOwogCi0gICAgaWYgKChzaXplX3QpY2lkeCAhPSBza19YNTA5X251bShjdHgtPmNoYWluKSAtIDEpCi0gICAgICAgIGNpZHgrKzsKKyAgaWYgKChzaXplX3QpY2lkeCAhPSBza19YNTA5X251bShjdHgtPmNoYWluKSAtIDEpCisgICAgY2lkeCsrOwogCisgIGNybF9pc3N1ZXIgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGNpZHgpOworCisgIGlmIChYNTA5X2NoZWNrX2FraWQoY3JsX2lzc3VlciwgY3JsLT5ha2lkKSA9PSBYNTA5X1ZfT0spIHsKKyAgICBpZiAoKnBjcmxfc2NvcmUgJiBDUkxfU0NPUkVfSVNTVUVSX05BTUUpIHsKKyAgICAgICpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEIHwgQ1JMX1NDT1JFX0lTU1VFUl9DRVJUOworICAgICAgKnBpc3N1ZXIgPSBjcmxfaXNzdWVyOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGZvciAoY2lkeCsrOyBjaWR4IDwgKGludClza19YNTA5X251bShjdHgtPmNoYWluKTsgY2lkeCsrKSB7CiAgICAgY3JsX2lzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY2lkeCk7Ci0KKyAgICBpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoY3JsX2lzc3VlciksIGNubSkpCisgICAgICBjb250aW51ZTsKICAgICBpZiAoWDUwOV9jaGVja19ha2lkKGNybF9pc3N1ZXIsIGNybC0+YWtpZCkgPT0gWDUwOV9WX09LKSB7Ci0gICAgICAgIGlmICgqcGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSkgewotICAgICAgICAgICAgKnBjcmxfc2NvcmUgfD0gQ1JMX1NDT1JFX0FLSUQgfCBDUkxfU0NPUkVfSVNTVUVSX0NFUlQ7Ci0gICAgICAgICAgICAqcGlzc3VlciA9IGNybF9pc3N1ZXI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEIHwgQ1JMX1NDT1JFX1NBTUVfUEFUSDsKKyAgICAgICpwaXNzdWVyID0gY3JsX2lzc3VlcjsKKyAgICAgIHJldHVybjsKICAgICB9CisgIH0KIAotICAgIGZvciAoY2lkeCsrOyBjaWR4IDwgKGludClza19YNTA5X251bShjdHgtPmNoYWluKTsgY2lkeCsrKSB7Ci0gICAgICAgIGNybF9pc3N1ZXIgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGNpZHgpOwotICAgICAgICBpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoY3JsX2lzc3VlciksIGNubSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKFg1MDlfY2hlY2tfYWtpZChjcmxfaXNzdWVyLCBjcmwtPmFraWQpID09IFg1MDlfVl9PSykgewotICAgICAgICAgICAgKnBjcmxfc2NvcmUgfD0gQ1JMX1NDT1JFX0FLSUQgfCBDUkxfU0NPUkVfU0FNRV9QQVRIOwotICAgICAgICAgICAgKnBpc3N1ZXIgPSBjcmxfaXNzdWVyOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgIC8qIEFueXRoaW5nIGVsc2UgbmVlZHMgZXh0ZW5kZWQgQ1JMIHN1cHBvcnQgKi8KKworICBpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0VYVEVOREVEX0NSTF9TVVBQT1JUKSkKKyAgICByZXR1cm47CisKKyAgLyoKKyAgICogT3RoZXJ3aXNlIHRoZSBDUkwgaXNzdWVyIGlzIG5vdCBvbiB0aGUgcGF0aC4gTG9vayBmb3IgaXQgaW4gdGhlIHNldCBvZgorICAgKiB1bnRydXN0ZWQgY2VydGlmaWNhdGVzLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKGN0eC0+dW50cnVzdGVkKTsgaSsrKSB7CisgICAgY3JsX2lzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT51bnRydXN0ZWQsIGkpOworICAgIGlmIChYNTA5X05BTUVfY21wKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjcmxfaXNzdWVyKSwgY25tKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChYNTA5X2NoZWNrX2FraWQoY3JsX2lzc3VlciwgY3JsLT5ha2lkKSA9PSBYNTA5X1ZfT0spIHsKKyAgICAgICpwaXNzdWVyID0gY3JsX2lzc3VlcjsKKyAgICAgICpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEOworICAgICAgcmV0dXJuOwogICAgIH0KKyAgfQogCi0gICAgLyogQW55dGhpbmcgZWxzZSBuZWVkcyBleHRlbmRlZCBDUkwgc3VwcG9ydCAqLwotCi0gICAgaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19FWFRFTkRFRF9DUkxfU1VQUE9SVCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qCi0gICAgICogT3RoZXJ3aXNlIHRoZSBDUkwgaXNzdWVyIGlzIG5vdCBvbiB0aGUgcGF0aC4gTG9vayBmb3IgaXQgaW4gdGhlIHNldCBvZgotICAgICAqIHVudHJ1c3RlZCBjZXJ0aWZpY2F0ZXMuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKGN0eC0+dW50cnVzdGVkKTsgaSsrKSB7Ci0gICAgICAgIGNybF9pc3N1ZXIgPSBza19YNTA5X3ZhbHVlKGN0eC0+dW50cnVzdGVkLCBpKTsKLSAgICAgICAgaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNybF9pc3N1ZXIpLCBjbm0pKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChYNTA5X2NoZWNrX2FraWQoY3JsX2lzc3VlciwgY3JsLT5ha2lkKSA9PSBYNTA5X1ZfT0spIHsKLSAgICAgICAgICAgICpwaXNzdWVyID0gY3JsX2lzc3VlcjsKLSAgICAgICAgICAgICpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgIGZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShjdHgtPmN0eC0+YWRkaXRpb25hbF91bnRydXN0ZWQpOyBpKyspIHsKKyAgICBjcmxfaXNzdWVyID0gc2tfWDUwOV92YWx1ZShjdHgtPmN0eC0+YWRkaXRpb25hbF91bnRydXN0ZWQsIGkpOworICAgIGlmIChYNTA5X05BTUVfY21wKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjcmxfaXNzdWVyKSwgY25tKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChYNTA5X2NoZWNrX2FraWQoY3JsX2lzc3VlciwgY3JsLT5ha2lkKSA9PSBYNTA5X1ZfT0spIHsKKyAgICAgICpwaXNzdWVyID0gY3JsX2lzc3VlcjsKKyAgICAgICpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEOworICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShjdHgtPmN0eC0+YWRkaXRpb25hbF91bnRydXN0ZWQpOyBpKyspIHsKLSAgICAgICAgY3JsX2lzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jdHgtPmFkZGl0aW9uYWxfdW50cnVzdGVkLCBpKTsKLSAgICAgICAgaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNybF9pc3N1ZXIpLCBjbm0pKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChYNTA5X2NoZWNrX2FraWQoY3JsX2lzc3VlciwgY3JsLT5ha2lkKSA9PSBYNTA5X1ZfT0spIHsKLSAgICAgICAgICAgICpwaXNzdWVyID0gY3JsX2lzc3VlcjsKLSAgICAgICAgICAgICpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQorICB9CiB9CiAKIC8qCkBAIC0xMjk1LDM1ICsxMjYwLDM0IEBACiAgKiBiZSBkdXBsaWNhdGVkIGJ5IHRoZSBwYXJlbnQsIGJ1dCB0aGlzIHdpbGwgcmFyZWx5IGJlIHVzZWQgaW4gcHJhY3RpY2UuCiAgKi8KIAotc3RhdGljIGludCBjaGVja19jcmxfcGF0aChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KQotewotICAgIFg1MDlfU1RPUkVfQ1RYIGNybF9jdHg7Ci0gICAgaW50IHJldDsKLSAgICAvKiBEb24ndCBhbGxvdyByZWN1cnNpdmUgQ1JMIHBhdGggdmFsaWRhdGlvbiAqLwotICAgIGlmIChjdHgtPnBhcmVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZjcmxfY3R4LCBjdHgtPmN0eCwgeCwgY3R4LT51bnRydXN0ZWQpKQotICAgICAgICByZXR1cm4gLTE7CitzdGF0aWMgaW50IGNoZWNrX2NybF9wYXRoKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpIHsKKyAgWDUwOV9TVE9SRV9DVFggY3JsX2N0eDsKKyAgaW50IHJldDsKKyAgLyogRG9uJ3QgYWxsb3cgcmVjdXJzaXZlIENSTCBwYXRoIHZhbGlkYXRpb24gKi8KKyAgaWYgKGN0eC0+cGFyZW50KQorICAgIHJldHVybiAwOworICBpZiAoIVg1MDlfU1RPUkVfQ1RYX2luaXQoJmNybF9jdHgsIGN0eC0+Y3R4LCB4LCBjdHgtPnVudHJ1c3RlZCkpCisgICAgcmV0dXJuIC0xOwogCi0gICAgY3JsX2N0eC5jcmxzID0gY3R4LT5jcmxzOwotICAgIC8qIENvcHkgdmVyaWZ5IHBhcmFtcyBhY3Jvc3MgKi8KLSAgICBYNTA5X1NUT1JFX0NUWF9zZXQwX3BhcmFtKCZjcmxfY3R4LCBjdHgtPnBhcmFtKTsKKyAgY3JsX2N0eC5jcmxzID0gY3R4LT5jcmxzOworICAvKiBDb3B5IHZlcmlmeSBwYXJhbXMgYWNyb3NzICovCisgIFg1MDlfU1RPUkVfQ1RYX3NldDBfcGFyYW0oJmNybF9jdHgsIGN0eC0+cGFyYW0pOwogCi0gICAgY3JsX2N0eC5wYXJlbnQgPSBjdHg7Ci0gICAgY3JsX2N0eC52ZXJpZnlfY2IgPSBjdHgtPnZlcmlmeV9jYjsKKyAgY3JsX2N0eC5wYXJlbnQgPSBjdHg7CisgIGNybF9jdHgudmVyaWZ5X2NiID0gY3R4LT52ZXJpZnlfY2I7CiAKLSAgICAvKiBWZXJpZnkgQ1JMIGlzc3VlciAqLwotICAgIHJldCA9IFg1MDlfdmVyaWZ5X2NlcnQoJmNybF9jdHgpOworICAvKiBWZXJpZnkgQ1JMIGlzc3VlciAqLworICByZXQgPSBYNTA5X3ZlcmlmeV9jZXJ0KCZjcmxfY3R4KTsKIAotICAgIGlmIChyZXQgPD0gMCkKLSAgICAgICAgZ290byBlcnI7CisgIGlmIChyZXQgPD0gMCkKKyAgICBnb3RvIGVycjsKIAotICAgIC8qIENoZWNrIGNoYWluIGlzIGFjY2VwdGFibGUgKi8KKyAgLyogQ2hlY2sgY2hhaW4gaXMgYWNjZXB0YWJsZSAqLwogCi0gICAgcmV0ID0gY2hlY2tfY3JsX2NoYWluKGN0eCwgY3R4LT5jaGFpbiwgY3JsX2N0eC5jaGFpbik7Ci0gZXJyOgotICAgIFg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJmNybF9jdHgpOwotICAgIHJldHVybiByZXQ7CisgIHJldCA9IGNoZWNrX2NybF9jaGFpbihjdHgsIGN0eC0+Y2hhaW4sIGNybF9jdHguY2hhaW4pOworZXJyOgorICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZjcmxfY3R4KTsKKyAgcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTEzMzUsMTYgKzEyOTksMTQgQEAKICAqIFJGQzUyODAgdmVyc2lvbgogICovCiAKLXN0YXRpYyBpbnQgY2hlY2tfY3JsX2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFDS19PRihYNTA5KSAqY2VydF9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfT0YoWDUwOSkgKmNybF9wYXRoKQotewotICAgIFg1MDkgKmNlcnRfdGEsICpjcmxfdGE7Ci0gICAgY2VydF90YSA9IHNrX1g1MDlfdmFsdWUoY2VydF9wYXRoLCBza19YNTA5X251bShjZXJ0X3BhdGgpIC0gMSk7Ci0gICAgY3JsX3RhID0gc2tfWDUwOV92YWx1ZShjcmxfcGF0aCwgc2tfWDUwOV9udW0oY3JsX3BhdGgpIC0gMSk7Ci0gICAgaWYgKCFYNTA5X2NtcChjZXJ0X3RhLCBjcmxfdGEpKQotICAgICAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKK3N0YXRpYyBpbnQgY2hlY2tfY3JsX2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICogY2VydF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfT0YoWDUwOSkgKiBjcmxfcGF0aCkgeworICBYNTA5ICpjZXJ0X3RhLCAqY3JsX3RhOworICBjZXJ0X3RhID0gc2tfWDUwOV92YWx1ZShjZXJ0X3BhdGgsIHNrX1g1MDlfbnVtKGNlcnRfcGF0aCkgLSAxKTsKKyAgY3JsX3RhID0gc2tfWDUwOV92YWx1ZShjcmxfcGF0aCwgc2tfWDUwOV9udW0oY3JsX3BhdGgpIC0gMSk7CisgIGlmICghWDUwOV9jbXAoY2VydF90YSwgY3JsX3RhKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMzU0LDExMCArMTMxNiwxMDYgQEAKICAqIGNvbXBhcmUgdHdvIEdFTkVSQUxfTkFNRVMuIDQuIE9uZSBpcyBOVUxMOiBhdXRvbWF0aWMgbWF0Y2guCiAgKi8KIAotc3RhdGljIGludCBpZHBfY2hlY2tfZHAoRElTVF9QT0lOVF9OQU1FICphLCBESVNUX1BPSU5UX05BTUUgKmIpCi17Ci0gICAgWDUwOV9OQU1FICpubSA9IE5VTEw7Ci0gICAgR0VORVJBTF9OQU1FUyAqZ2VucyA9IE5VTEw7Ci0gICAgR0VORVJBTF9OQU1FICpnZW5hLCAqZ2VuYjsKLSAgICBzaXplX3QgaSwgajsKLSAgICBpZiAoIWEgfHwgIWIpCitzdGF0aWMgaW50IGlkcF9jaGVja19kcChESVNUX1BPSU5UX05BTUUgKmEsIERJU1RfUE9JTlRfTkFNRSAqYikgeworICBYNTA5X05BTUUgKm5tID0gTlVMTDsKKyAgR0VORVJBTF9OQU1FUyAqZ2VucyA9IE5VTEw7CisgIEdFTkVSQUxfTkFNRSAqZ2VuYSwgKmdlbmI7CisgIHNpemVfdCBpLCBqOworICBpZiAoIWEgfHwgIWIpCisgICAgcmV0dXJuIDE7CisgIGlmIChhLT50eXBlID09IDEpIHsKKyAgICBpZiAoIWEtPmRwbmFtZSkKKyAgICAgIHJldHVybiAwOworICAgIC8qIENhc2UgMTogdHdvIFg1MDlfTkFNRSAqLworICAgIGlmIChiLT50eXBlID09IDEpIHsKKyAgICAgIGlmICghYi0+ZHBuYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGlmICghWDUwOV9OQU1FX2NtcChhLT5kcG5hbWUsIGItPmRwbmFtZSkpCiAgICAgICAgIHJldHVybiAxOwotICAgIGlmIChhLT50eXBlID09IDEpIHsKLSAgICAgICAgaWYgKCFhLT5kcG5hbWUpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgLyogQ2FzZSAxOiB0d28gWDUwOV9OQU1FICovCi0gICAgICAgIGlmIChiLT50eXBlID09IDEpIHsKLSAgICAgICAgICAgIGlmICghYi0+ZHBuYW1lKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgaWYgKCFYNTA5X05BTUVfY21wKGEtPmRwbmFtZSwgYi0+ZHBuYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAvKiBDYXNlIDI6IHNldCBuYW1lIGFuZCBHRU5FUkFMX05BTUVTIGFwcHJvcHJpYXRlbHkgKi8KLSAgICAgICAgbm0gPSBhLT5kcG5hbWU7Ci0gICAgICAgIGdlbnMgPSBiLT5uYW1lLmZ1bGxuYW1lOwotICAgIH0gZWxzZSBpZiAoYi0+dHlwZSA9PSAxKSB7Ci0gICAgICAgIGlmICghYi0+ZHBuYW1lKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIC8qIENhc2UgMjogc2V0IG5hbWUgYW5kIEdFTkVSQUxfTkFNRVMgYXBwcm9wcmlhdGVseSAqLwotICAgICAgICBnZW5zID0gYS0+bmFtZS5mdWxsbmFtZTsKLSAgICAgICAgbm0gPSBiLT5kcG5hbWU7Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIGNhc2UgMiB3aXRoIG9uZSBHRU5FUkFMX05BTUVTIGFuZCBvbmUgWDUwOV9OQU1FICovCi0gICAgaWYgKG5tKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGdlbnMpOyBpKyspIHsKLSAgICAgICAgICAgIGdlbmEgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZ2VucywgaSk7Ci0gICAgICAgICAgICBpZiAoZ2VuYS0+dHlwZSAhPSBHRU5fRElSTkFNRSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICghWDUwOV9OQU1FX2NtcChubSwgZ2VuYS0+ZC5kaXJlY3RvcnlOYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQorICAgICAgZWxzZQogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgLyogQ2FzZSAyOiBzZXQgbmFtZSBhbmQgR0VORVJBTF9OQU1FUyBhcHByb3ByaWF0ZWx5ICovCisgICAgbm0gPSBhLT5kcG5hbWU7CisgICAgZ2VucyA9IGItPm5hbWUuZnVsbG5hbWU7CisgIH0gZWxzZSBpZiAoYi0+dHlwZSA9PSAxKSB7CisgICAgaWYgKCFiLT5kcG5hbWUpCisgICAgICByZXR1cm4gMDsKKyAgICAvKiBDYXNlIDI6IHNldCBuYW1lIGFuZCBHRU5FUkFMX05BTUVTIGFwcHJvcHJpYXRlbHkgKi8KKyAgICBnZW5zID0gYS0+bmFtZS5mdWxsbmFtZTsKKyAgICBubSA9IGItPmRwbmFtZTsKKyAgfQogCi0gICAgLyogRWxzZSBjYXNlIDM6IHR3byBHRU5FUkFMX05BTUVTICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9OQU1FX251bShhLT5uYW1lLmZ1bGxuYW1lKTsgaSsrKSB7Ci0gICAgICAgIGdlbmEgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYS0+bmFtZS5mdWxsbmFtZSwgaSk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBza19HRU5FUkFMX05BTUVfbnVtKGItPm5hbWUuZnVsbG5hbWUpOyBqKyspIHsKLSAgICAgICAgICAgIGdlbmIgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYi0+bmFtZS5mdWxsbmFtZSwgaik7Ci0gICAgICAgICAgICBpZiAoIUdFTkVSQUxfTkFNRV9jbXAoZ2VuYSwgZ2VuYikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KKyAgLyogSGFuZGxlIGNhc2UgMiB3aXRoIG9uZSBHRU5FUkFMX05BTUVTIGFuZCBvbmUgWDUwOV9OQU1FICovCisgIGlmIChubSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGdlbnMpOyBpKyspIHsKKyAgICAgIGdlbmEgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZ2VucywgaSk7CisgICAgICBpZiAoZ2VuYS0+dHlwZSAhPSBHRU5fRElSTkFNRSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoIVg1MDlfTkFNRV9jbXAobm0sIGdlbmEtPmQuZGlyZWN0b3J5TmFtZSkpCisgICAgICAgIHJldHVybiAxOwogICAgIH0KLQogICAgIHJldHVybiAwOworICB9CiAKKyAgLyogRWxzZSBjYXNlIDM6IHR3byBHRU5FUkFMX05BTUVTICovCisKKyAgZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oYS0+bmFtZS5mdWxsbmFtZSk7IGkrKykgeworICAgIGdlbmEgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYS0+bmFtZS5mdWxsbmFtZSwgaSk7CisgICAgZm9yIChqID0gMDsgaiA8IHNrX0dFTkVSQUxfTkFNRV9udW0oYi0+bmFtZS5mdWxsbmFtZSk7IGorKykgeworICAgICAgZ2VuYiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShiLT5uYW1lLmZ1bGxuYW1lLCBqKTsKKyAgICAgIGlmICghR0VORVJBTF9OQU1FX2NtcChnZW5hLCBnZW5iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3JsZHBfY2hlY2tfY3JsaXNzdWVyKERJU1RfUE9JTlQgKmRwLCBYNTA5X0NSTCAqY3JsLCBpbnQgY3JsX3Njb3JlKQotewotICAgIHNpemVfdCBpOwotICAgIFg1MDlfTkFNRSAqbm0gPSBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCk7Ci0gICAgLyogSWYgbm8gQ1JMaXNzdWVyIHJldHVybiBpcyBzdWNjZXNzZnVsIGlmZiBkb24ndCBuZWVkIGEgbWF0Y2ggKi8KLSAgICBpZiAoIWRwLT5DUkxpc3N1ZXIpCi0gICAgICAgIHJldHVybiAhICEoY3JsX3Njb3JlICYgQ1JMX1NDT1JFX0lTU1VFUl9OQU1FKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9OQU1FX251bShkcC0+Q1JMaXNzdWVyKTsgaSsrKSB7Ci0gICAgICAgIEdFTkVSQUxfTkFNRSAqZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGRwLT5DUkxpc3N1ZXIsIGkpOwotICAgICAgICBpZiAoZ2VuLT50eXBlICE9IEdFTl9ESVJOQU1FKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmICghWDUwOV9OQU1FX2NtcChnZW4tPmQuZGlyZWN0b3J5TmFtZSwgbm0pKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOworc3RhdGljIGludCBjcmxkcF9jaGVja19jcmxpc3N1ZXIoRElTVF9QT0lOVCAqZHAsIFg1MDlfQ1JMICpjcmwsIGludCBjcmxfc2NvcmUpIHsKKyAgc2l6ZV90IGk7CisgIFg1MDlfTkFNRSAqbm0gPSBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCk7CisgIC8qIElmIG5vIENSTGlzc3VlciByZXR1cm4gaXMgc3VjY2Vzc2Z1bCBpZmYgZG9uJ3QgbmVlZCBhIG1hdGNoICovCisgIGlmICghZHAtPkNSTGlzc3VlcikKKyAgICByZXR1cm4gISEoY3JsX3Njb3JlICYgQ1JMX1NDT1JFX0lTU1VFUl9OQU1FKTsKKyAgZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZHAtPkNSTGlzc3Vlcik7IGkrKykgeworICAgIEdFTkVSQUxfTkFNRSAqZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGRwLT5DUkxpc3N1ZXIsIGkpOworICAgIGlmIChnZW4tPnR5cGUgIT0gR0VOX0RJUk5BTUUpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIVg1MDlfTkFNRV9jbXAoZ2VuLT5kLmRpcmVjdG9yeU5hbWUsIG5tKSkKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOwogfQogCiAvKiBDaGVjayBDUkxEUCBhbmQgSURQICovCiAKIHN0YXRpYyBpbnQgY3JsX2NybGRwX2NoZWNrKFg1MDkgKngsIFg1MDlfQ1JMICpjcmwsIGludCBjcmxfc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnByZWFzb25zKQotewotICAgIHNpemVfdCBpOwotICAgIGlmIChjcmwtPmlkcF9mbGFncyAmIElEUF9PTkxZQVRUUikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX0NBKSB7Ci0gICAgICAgIGlmIChjcmwtPmlkcF9mbGFncyAmIElEUF9PTkxZVVNFUikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjcmwtPmlkcF9mbGFncyAmIElEUF9PTkxZQ0EpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgKnByZWFzb25zID0gY3JsLT5pZHBfcmVhc29uczsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfRElTVF9QT0lOVF9udW0oeC0+Y3JsZHApOyBpKyspIHsKLSAgICAgICAgRElTVF9QT0lOVCAqZHAgPSBza19ESVNUX1BPSU5UX3ZhbHVlKHgtPmNybGRwLCBpKTsKLSAgICAgICAgaWYgKGNybGRwX2NoZWNrX2NybGlzc3VlcihkcCwgY3JsLCBjcmxfc2NvcmUpKSB7Ci0gICAgICAgICAgICBpZiAoIWNybC0+aWRwIHx8IGlkcF9jaGVja19kcChkcC0+ZGlzdHBvaW50LCBjcmwtPmlkcC0+ZGlzdHBvaW50KSkgewotICAgICAgICAgICAgICAgICpwcmVhc29ucyAmPSBkcC0+ZHBfcmVhc29uczsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKCFjcmwtPmlkcCB8fCAhY3JsLT5pZHAtPmRpc3Rwb2ludCkKLSAgICAgICAgJiYgKGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSkpCi0gICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwcmVhc29ucykgeworICBzaXplX3QgaTsKKyAgaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX09OTFlBVFRSKQogICAgIHJldHVybiAwOworICBpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ0EpIHsKKyAgICBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfT05MWVVTRVIpCisgICAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfT05MWUNBKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgKnByZWFzb25zID0gY3JsLT5pZHBfcmVhc29uczsKKyAgZm9yIChpID0gMDsgaSA8IHNrX0RJU1RfUE9JTlRfbnVtKHgtPmNybGRwKTsgaSsrKSB7CisgICAgRElTVF9QT0lOVCAqZHAgPSBza19ESVNUX1BPSU5UX3ZhbHVlKHgtPmNybGRwLCBpKTsKKyAgICBpZiAoY3JsZHBfY2hlY2tfY3JsaXNzdWVyKGRwLCBjcmwsIGNybF9zY29yZSkpIHsKKyAgICAgIGlmICghY3JsLT5pZHAgfHwgaWRwX2NoZWNrX2RwKGRwLT5kaXN0cG9pbnQsIGNybC0+aWRwLT5kaXN0cG9pbnQpKSB7CisgICAgICAgICpwcmVhc29ucyAmPSBkcC0+ZHBfcmVhc29uczsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgoIWNybC0+aWRwIHx8ICFjcmwtPmlkcC0+ZGlzdHBvaW50KSAmJgorICAgICAgKGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMTQ2NSw2ODEgKzE0MjMsNjk2IEBACiAgKiB0byBmaW5kIGEgZGVsdGEgQ1JMIHRvbwogICovCiAKLXN0YXRpYyBpbnQgZ2V0X2NybF9kZWx0YShYNTA5X1NUT1JFX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQ1JMICoqcGNybCwgWDUwOV9DUkwgKipwZGNybCwgWDUwOSAqeCkKLXsKLSAgICBpbnQgb2s7Ci0gICAgWDUwOSAqaXNzdWVyID0gTlVMTDsKLSAgICBpbnQgY3JsX3Njb3JlID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgcmVhc29uczsKLSAgICBYNTA5X0NSTCAqY3JsID0gTlVMTCwgKmRjcmwgPSBOVUxMOwotICAgIFNUQUNLX09GKFg1MDlfQ1JMKSAqc2tjcmw7Ci0gICAgWDUwOV9OQU1FICpubSA9IFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpOwotICAgIHJlYXNvbnMgPSBjdHgtPmN1cnJlbnRfcmVhc29uczsKLSAgICBvayA9IGdldF9jcmxfc2soY3R4LCAmY3JsLCAmZGNybCwKLSAgICAgICAgICAgICAgICAgICAgJmlzc3VlciwgJmNybF9zY29yZSwgJnJlYXNvbnMsIGN0eC0+Y3Jscyk7CitzdGF0aWMgaW50IGdldF9jcmxfZGVsdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKipwY3JsLCBYNTA5X0NSTCAqKnBkY3JsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDkgKngpIHsKKyAgaW50IG9rOworICBYNTA5ICppc3N1ZXIgPSBOVUxMOworICBpbnQgY3JsX3Njb3JlID0gMDsKKyAgdW5zaWduZWQgaW50IHJlYXNvbnM7CisgIFg1MDlfQ1JMICpjcmwgPSBOVUxMLCAqZGNybCA9IE5VTEw7CisgIFNUQUNLX09GKFg1MDlfQ1JMKSAqIHNrY3JsOworICBYNTA5X05BTUUgKm5tID0gWDUwOV9nZXRfaXNzdWVyX25hbWUoeCk7CisgIHJlYXNvbnMgPSBjdHgtPmN1cnJlbnRfcmVhc29uczsKKyAgb2sgPSBnZXRfY3JsX3NrKGN0eCwgJmNybCwgJmRjcmwsICZpc3N1ZXIsICZjcmxfc2NvcmUsICZyZWFzb25zLCBjdHgtPmNybHMpOwogCi0gICAgaWYgKG9rKQotICAgICAgICBnb3RvIGRvbmU7CisgIGlmIChvaykKKyAgICBnb3RvIGRvbmU7CiAKLSAgICAvKiBMb29rdXAgQ1JMcyBmcm9tIHN0b3JlICovCisgIC8qIExvb2t1cCBDUkxzIGZyb20gc3RvcmUgKi8KIAotICAgIHNrY3JsID0gY3R4LT5sb29rdXBfY3JscyhjdHgsIG5tKTsKKyAgc2tjcmwgPSBjdHgtPmxvb2t1cF9jcmxzKGN0eCwgbm0pOwogCi0gICAgLyogSWYgbm8gQ1JMcyBmb3VuZCBhbmQgYSBuZWFyIG1hdGNoIGZyb20gZ2V0X2NybF9zayB1c2UgdGhhdCAqLwotICAgIGlmICghc2tjcmwgJiYgY3JsKQotICAgICAgICBnb3RvIGRvbmU7CisgIC8qIElmIG5vIENSTHMgZm91bmQgYW5kIGEgbmVhciBtYXRjaCBmcm9tIGdldF9jcmxfc2sgdXNlIHRoYXQgKi8KKyAgaWYgKCFza2NybCAmJiBjcmwpCisgICAgZ290byBkb25lOwogCi0gICAgZ2V0X2NybF9zayhjdHgsICZjcmwsICZkY3JsLCAmaXNzdWVyLCAmY3JsX3Njb3JlLCAmcmVhc29ucywgc2tjcmwpOworICBnZXRfY3JsX3NrKGN0eCwgJmNybCwgJmRjcmwsICZpc3N1ZXIsICZjcmxfc2NvcmUsICZyZWFzb25zLCBza2NybCk7CiAKLSAgICBza19YNTA5X0NSTF9wb3BfZnJlZShza2NybCwgWDUwOV9DUkxfZnJlZSk7CisgIHNrX1g1MDlfQ1JMX3BvcF9mcmVlKHNrY3JsLCBYNTA5X0NSTF9mcmVlKTsKIAotIGRvbmU6Citkb25lOgogCi0gICAgLyogSWYgd2UgZ290IGFueSBraW5kIG9mIENSTCB1c2UgaXQgYW5kIHJldHVybiBzdWNjZXNzICovCi0gICAgaWYgKGNybCkgewotICAgICAgICBjdHgtPmN1cnJlbnRfaXNzdWVyID0gaXNzdWVyOwotICAgICAgICBjdHgtPmN1cnJlbnRfY3JsX3Njb3JlID0gY3JsX3Njb3JlOwotICAgICAgICBjdHgtPmN1cnJlbnRfcmVhc29ucyA9IHJlYXNvbnM7Ci0gICAgICAgICpwY3JsID0gY3JsOwotICAgICAgICAqcGRjcmwgPSBkY3JsOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9CisgIC8qIElmIHdlIGdvdCBhbnkga2luZCBvZiBDUkwgdXNlIGl0IGFuZCByZXR1cm4gc3VjY2VzcyAqLworICBpZiAoY3JsKSB7CisgICAgY3R4LT5jdXJyZW50X2lzc3VlciA9IGlzc3VlcjsKKyAgICBjdHgtPmN1cnJlbnRfY3JsX3Njb3JlID0gY3JsX3Njb3JlOworICAgIGN0eC0+Y3VycmVudF9yZWFzb25zID0gcmVhc29uczsKKyAgICAqcGNybCA9IGNybDsKKyAgICAqcGRjcmwgPSBkY3JsOworICAgIHJldHVybiAxOworICB9CiAKLSAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qIENoZWNrIENSTCB2YWxpZGl0eSAqLwotc3RhdGljIGludCBjaGVja19jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCkKLXsKLSAgICBYNTA5ICppc3N1ZXIgPSBOVUxMOwotICAgIEVWUF9QS0VZICppa2V5ID0gTlVMTDsKLSAgICBpbnQgb2sgPSAwLCBjaG51bSwgY251bTsKLSAgICBjbnVtID0gY3R4LT5lcnJvcl9kZXB0aDsKLSAgICBjaG51bSA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pIC0gMTsKLSAgICAvKiBpZiB3ZSBoYXZlIGFuIGFsdGVybmF0aXZlIENSTCBpc3N1ZXIgY2VydCB1c2UgdGhhdCAqLwotICAgIGlmIChjdHgtPmN1cnJlbnRfaXNzdWVyKQotICAgICAgICBpc3N1ZXIgPSBjdHgtPmN1cnJlbnRfaXNzdWVyOworc3RhdGljIGludCBjaGVja19jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCkgeworICBYNTA5ICppc3N1ZXIgPSBOVUxMOworICBFVlBfUEtFWSAqaWtleSA9IE5VTEw7CisgIGludCBvayA9IDAsIGNobnVtLCBjbnVtOworICBjbnVtID0gY3R4LT5lcnJvcl9kZXB0aDsKKyAgY2hudW0gPSBza19YNTA5X251bShjdHgtPmNoYWluKSAtIDE7CisgIC8qIGlmIHdlIGhhdmUgYW4gYWx0ZXJuYXRpdmUgQ1JMIGlzc3VlciBjZXJ0IHVzZSB0aGF0ICovCisgIGlmIChjdHgtPmN1cnJlbnRfaXNzdWVyKQorICAgIGlzc3VlciA9IGN0eC0+Y3VycmVudF9pc3N1ZXI7CiAKKyAgLyoKKyAgICogRWxzZSBmaW5kIENSTCBpc3N1ZXI6IGlmIG5vdCBsYXN0IGNlcnRpZmljYXRlIHRoZW4gaXNzdWVyIGlzIG5leHQKKyAgICogY2VydGlmaWNhdGUgaW4gY2hhaW4uCisgICAqLworICBlbHNlIGlmIChjbnVtIDwgY2hudW0pCisgICAgaXNzdWVyID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBjbnVtICsgMSk7CisgIGVsc2UgeworICAgIGlzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY2hudW0pOworICAgIC8qIElmIG5vdCBzZWxmIHNpZ25lZCwgY2FuJ3QgY2hlY2sgc2lnbmF0dXJlICovCisgICAgaWYgKCFjdHgtPmNoZWNrX2lzc3VlZChjdHgsIGlzc3VlciwgaXNzdWVyKSkgeworICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkxfSVNTVUVSOworICAgICAgb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworICAgICAgaWYgKCFvaykKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKGlzc3VlcikgewogICAgIC8qCi0gICAgICogRWxzZSBmaW5kIENSTCBpc3N1ZXI6IGlmIG5vdCBsYXN0IGNlcnRpZmljYXRlIHRoZW4gaXNzdWVyIGlzIG5leHQKLSAgICAgKiBjZXJ0aWZpY2F0ZSBpbiBjaGFpbi4KKyAgICAgKiBTa2lwIG1vc3QgdGVzdHMgZm9yIGRlbHRhcyBiZWNhdXNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZQogICAgICAqLwotICAgIGVsc2UgaWYgKGNudW0gPCBjaG51bSkKLSAgICAgICAgaXNzdWVyID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBjbnVtICsgMSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY2hudW0pOwotICAgICAgICAvKiBJZiBub3Qgc2VsZiBzaWduZWQsIGNhbid0IGNoZWNrIHNpZ25hdHVyZSAqLwotICAgICAgICBpZiAoIWN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgaXNzdWVyLCBpc3N1ZXIpKSB7Ci0gICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTF9JU1NVRVI7Ci0gICAgICAgICAgICBvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7Ci0gICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgIGlmICghY3JsLT5iYXNlX2NybF9udW1iZXIpIHsKKyAgICAgIC8qIENoZWNrIGZvciBjUkxTaWduIGJpdCBpZiBrZXlVc2FnZSBwcmVzZW50ICovCisgICAgICBpZiAoKGlzc3Vlci0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKSAmJgorICAgICAgICAgICEoaXNzdWVyLT5leF9rdXNhZ2UgJiBLVV9DUkxfU0lHTikpIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fQ1JMX1NJR047CisgICAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgICAgaWYgKCEoY3R4LT5jdXJyZW50X2NybF9zY29yZSAmIENSTF9TQ09SRV9TQ09QRSkpIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfRElGRkVSRU5UX0NSTF9TQ09QRTsKKyAgICAgICAgb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworICAgICAgICBpZiAoIW9rKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorCisgICAgICBpZiAoIShjdHgtPmN1cnJlbnRfY3JsX3Njb3JlICYgQ1JMX1NDT1JFX1NBTUVfUEFUSCkpIHsKKyAgICAgICAgaWYgKGNoZWNrX2NybF9wYXRoKGN0eCwgY3R4LT5jdXJyZW50X2lzc3VlcikgPD0gMCkgeworICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NSTF9QQVRIX1ZBTElEQVRJT05fRVJST1I7CisgICAgICAgICAgb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfSU5WQUxJRCkgeworICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX0VYVEVOU0lPTjsKKyAgICAgICAgb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworICAgICAgICBpZiAoIW9rKQorICAgICAgICAgIGdvdG8gZXJyOworICAgICAgfQogICAgIH0KIAotICAgIGlmIChpc3N1ZXIpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogU2tpcCBtb3N0IHRlc3RzIGZvciBkZWx0YXMgYmVjYXVzZSB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUKLSAgICAgICAgICovCi0gICAgICAgIGlmICghY3JsLT5iYXNlX2NybF9udW1iZXIpIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGZvciBjUkxTaWduIGJpdCBpZiBrZXlVc2FnZSBwcmVzZW50ICovCi0gICAgICAgICAgICBpZiAoKGlzc3Vlci0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKSAmJgotICAgICAgICAgICAgICAgICEoaXNzdWVyLT5leF9rdXNhZ2UgJiBLVV9DUkxfU0lHTikpIHsKLSAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19DUkxfU0lHTjsKLSAgICAgICAgICAgICAgICBvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghKGN0eC0+Y3VycmVudF9jcmxfc2NvcmUgJiBDUkxfU0NPUkVfU0NPUEUpKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfRElGRkVSRU5UX0NSTF9TQ09QRTsKLSAgICAgICAgICAgICAgICBvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghKGN0eC0+Y3VycmVudF9jcmxfc2NvcmUgJiBDUkxfU0NPUkVfU0FNRV9QQVRIKSkgewotICAgICAgICAgICAgICAgIGlmIChjaGVja19jcmxfcGF0aChjdHgsIGN0eC0+Y3VycmVudF9pc3N1ZXIpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ1JMX1BBVEhfVkFMSURBVElPTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfRVhURU5TSU9OOwotICAgICAgICAgICAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKLSAgICAgICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEoY3R4LT5jdXJyZW50X2NybF9zY29yZSAmIENSTF9TQ09SRV9USU1FKSkgewotICAgICAgICAgICAgb2sgPSBjaGVja19jcmxfdGltZShjdHgsIGNybCwgMSk7Ci0gICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQXR0ZW1wdCB0byBnZXQgaXNzdWVyIGNlcnRpZmljYXRlIHB1YmxpYyBrZXkgKi8KLSAgICAgICAgaWtleSA9IFg1MDlfZ2V0X3B1YmtleShpc3N1ZXIpOwotCi0gICAgICAgIGlmICghaWtleSkgewotICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKLSAgICAgICAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKLSAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgcnY7Ci0gICAgICAgICAgICBydiA9IFg1MDlfQ1JMX2NoZWNrX3N1aXRlYihjcmwsIGlrZXksIGN0eC0+cGFyYW0tPmZsYWdzKTsKLSAgICAgICAgICAgIGlmIChydiAhPSBYNTA5X1ZfT0spIHsKLSAgICAgICAgICAgICAgICBjdHgtPmVycm9yID0gcnY7Ci0gICAgICAgICAgICAgICAgb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOwotICAgICAgICAgICAgICAgIGlmICghb2spCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogVmVyaWZ5IENSTCBzaWduYXR1cmUgKi8KLSAgICAgICAgICAgIGlmIChYNTA5X0NSTF92ZXJpZnkoY3JsLCBpa2V5KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ1JMX1NJR05BVFVSRV9GQUlMVVJFOwotICAgICAgICAgICAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKLSAgICAgICAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmICghKGN0eC0+Y3VycmVudF9jcmxfc2NvcmUgJiBDUkxfU0NPUkVfVElNRSkpIHsKKyAgICAgIG9rID0gY2hlY2tfY3JsX3RpbWUoY3R4LCBjcmwsIDEpOworICAgICAgaWYgKCFvaykKKyAgICAgICAgZ290byBlcnI7CiAgICAgfQogCi0gICAgb2sgPSAxOworICAgIC8qIEF0dGVtcHQgdG8gZ2V0IGlzc3VlciBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5ICovCisgICAgaWtleSA9IFg1MDlfZ2V0X3B1YmtleShpc3N1ZXIpOwogCi0gZXJyOgotICAgIEVWUF9QS0VZX2ZyZWUoaWtleSk7Ci0gICAgcmV0dXJuIG9rOworICAgIGlmICghaWtleSkgeworICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKKyAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKyAgICAgIGlmICghb2spCisgICAgICAgIGdvdG8gZXJyOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgcnY7CisgICAgICBydiA9IFg1MDlfQ1JMX2NoZWNrX3N1aXRlYihjcmwsIGlrZXksIGN0eC0+cGFyYW0tPmZsYWdzKTsKKyAgICAgIGlmIChydiAhPSBYNTA5X1ZfT0spIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IHJ2OworICAgICAgICBvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICAvKiBWZXJpZnkgQ1JMIHNpZ25hdHVyZSAqLworICAgICAgaWYgKFg1MDlfQ1JMX3ZlcmlmeShjcmwsIGlrZXkpIDw9IDApIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ1JMX1NJR05BVFVSRV9GQUlMVVJFOworICAgICAgICBvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb2sgPSAxOworCitlcnI6CisgIEVWUF9QS0VZX2ZyZWUoaWtleSk7CisgIHJldHVybiBvazsKIH0KIAogLyogQ2hlY2sgY2VydGlmaWNhdGUgYWdhaW5zdCBDUkwgKi8KLXN0YXRpYyBpbnQgY2VydF9jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCwgWDUwOSAqeCkKLXsKLSAgICBpbnQgb2s7Ci0gICAgWDUwOV9SRVZPS0VEICpyZXY7Ci0gICAgLyoKLSAgICAgKiBUaGUgcnVsZXMgY2hhbmdlZCBmb3IgdGhpcy4uLiBwcmV2aW91c2x5IGlmIGEgQ1JMIGNvbnRhaW5lZCB1bmhhbmRsZWQKLSAgICAgKiBjcml0aWNhbCBleHRlbnNpb25zIGl0IGNvdWxkIHN0aWxsIGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBjZXJ0aWZpY2F0ZQotICAgICAqIHdhcyByZXZva2VkLiBUaGlzIGhhcyBzaW5jZSBiZWVuIGNoYW5nZWQgc2luY2UgY3JpdGljYWwgZXh0ZW5zaW9uIGNhbgotICAgICAqIGNoYW5nZSB0aGUgbWVhbmluZyBvZiBDUkwgZW50cmllcy4KLSAgICAgKi8KLSAgICBpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0lHTk9SRV9DUklUSUNBTCkKLSAgICAgICAgJiYgKGNybC0+ZmxhZ3MgJiBFWEZMQUdfQ1JJVElDQUwpKSB7Ci0gICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX1VOSEFORExFRF9DUklUSUNBTF9DUkxfRVhURU5TSU9OOwotICAgICAgICBvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7Ci0gICAgICAgIGlmICghb2spCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBMb29rIGZvciBzZXJpYWwgbnVtYmVyIG9mIGNlcnRpZmljYXRlIGluIENSTCBJZiBmb3VuZCBtYWtlIHN1cmUgcmVhc29uCi0gICAgICogaXMgbm90IHJlbW92ZUZyb21DUkwuCi0gICAgICovCi0gICAgaWYgKFg1MDlfQ1JMX2dldDBfYnlfY2VydChjcmwsICZyZXYsIHgpKSB7Ci0gICAgICAgIGlmIChyZXYtPnJlYXNvbiA9PSBDUkxfUkVBU09OX1JFTU9WRV9GUk9NX0NSTCkKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQ7Ci0gICAgICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKLSAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KK3N0YXRpYyBpbnQgY2VydF9jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCwgWDUwOSAqeCkgeworICBpbnQgb2s7CisgIFg1MDlfUkVWT0tFRCAqcmV2OworICAvKgorICAgKiBUaGUgcnVsZXMgY2hhbmdlZCBmb3IgdGhpcy4uLiBwcmV2aW91c2x5IGlmIGEgQ1JMIGNvbnRhaW5lZCB1bmhhbmRsZWQKKyAgICogY3JpdGljYWwgZXh0ZW5zaW9ucyBpdCBjb3VsZCBzdGlsbCBiZSB1c2VkIHRvIGluZGljYXRlIGEgY2VydGlmaWNhdGUKKyAgICogd2FzIHJldm9rZWQuIFRoaXMgaGFzIHNpbmNlIGJlZW4gY2hhbmdlZCBzaW5jZSBjcml0aWNhbCBleHRlbnNpb24gY2FuCisgICAqIGNoYW5nZSB0aGUgbWVhbmluZyBvZiBDUkwgZW50cmllcy4KKyAgICovCisgIGlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfSUdOT1JFX0NSSVRJQ0FMKSAmJgorICAgICAgKGNybC0+ZmxhZ3MgJiBFWEZMQUdfQ1JJVElDQUwpKSB7CisgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0NSTF9FWFRFTlNJT047CisgICAgb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworICAgIGlmICghb2spCisgICAgICByZXR1cm4gMDsKKyAgfQorICAvKgorICAgKiBMb29rIGZvciBzZXJpYWwgbnVtYmVyIG9mIGNlcnRpZmljYXRlIGluIENSTCBJZiBmb3VuZCBtYWtlIHN1cmUgcmVhc29uCisgICAqIGlzIG5vdCByZW1vdmVGcm9tQ1JMLgorICAgKi8KKyAgaWYgKFg1MDlfQ1JMX2dldDBfYnlfY2VydChjcmwsICZyZXYsIHgpKSB7CisgICAgaWYgKHJldi0+cmVhc29uID09IENSTF9SRUFTT05fUkVNT1ZFX0ZST01fQ1JMKQorICAgICAgcmV0dXJuIDI7CisgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VEOworICAgIG9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKyAgICBpZiAoIW9rKQorICAgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIHJldHVybiAxOworICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBjaGVja19wb2xpY3koWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICBpbnQgcmV0OwotICAgIGlmIChjdHgtPnBhcmVudCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgcmV0ID0gWDUwOV9wb2xpY3lfY2hlY2soJmN0eC0+dHJlZSwgJmN0eC0+ZXhwbGljaXRfcG9saWN5LCBjdHgtPmNoYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPnBvbGljaWVzLCBjdHgtPnBhcmFtLT5mbGFncyk7Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfT1VUX09GX01FTTsKK3N0YXRpYyBpbnQgY2hlY2tfcG9saWN5KFg1MDlfU1RPUkVfQ1RYICpjdHgpIHsKKyAgaW50IHJldDsKKyAgaWYgKGN0eC0+cGFyZW50KQorICAgIHJldHVybiAxOworICByZXQgPSBYNTA5X3BvbGljeV9jaGVjaygmY3R4LT50cmVlLCAmY3R4LT5leHBsaWNpdF9wb2xpY3ksIGN0eC0+Y2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPnBvbGljaWVzLCBjdHgtPnBhcmFtLT5mbGFncyk7CisgIGlmIChyZXQgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9PVVRfT0ZfTUVNOworICAgIHJldHVybiAwOworICB9CisgIC8qIEludmFsaWQgb3IgaW5jb25zaXN0ZW50IGV4dGVuc2lvbnMgKi8KKyAgaWYgKHJldCA9PSAtMSkgeworICAgIC8qCisgICAgICogTG9jYXRlIGNlcnRpZmljYXRlcyB3aXRoIGJhZCBleHRlbnNpb25zIGFuZCBub3RpZnkgY2FsbGJhY2suCisgICAgICovCisgICAgWDUwOSAqeDsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgc2tfWDUwOV9udW0oY3R4LT5jaGFpbik7IGkrKykgeworICAgICAgeCA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgaSk7CisgICAgICBpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19JTlZBTElEX1BPTElDWSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4OworICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9QT0xJQ1lfRVhURU5TSU9OOworICAgICAgaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgLyogSW52YWxpZCBvciBpbmNvbnNpc3RlbnQgZXh0ZW5zaW9ucyAqLwotICAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTG9jYXRlIGNlcnRpZmljYXRlcyB3aXRoIGJhZCBleHRlbnNpb25zIGFuZCBub3RpZnkgY2FsbGJhY2suCi0gICAgICAgICAqLwotICAgICAgICBYNTA5ICp4OwotICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgZm9yIChpID0gMTsgaSA8IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOyBpKyspIHsKLSAgICAgICAgICAgIHggPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGkpOwotICAgICAgICAgICAgaWYgKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfSU5WQUxJRF9QT0xJQ1kpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4OwotICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9QT0xJQ1lfRVhURU5TSU9OOwotICAgICAgICAgICAgaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAocmV0ID09IC0yKSB7Ci0gICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0gTlVMTDsKLSAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfTk9fRVhQTElDSVRfUE9MSUNZOwotICAgICAgICByZXR1cm4gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19OT1RJRllfUE9MSUNZKSB7Ci0gICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0gTlVMTDsKLSAgICAgICAgLyoKLSAgICAgICAgICogVmVyaWZpY2F0aW9uIGVycm9ycyBuZWVkIHRvIGJlICJzdGlja3kiLCBhIGNhbGxiYWNrIG1heSBoYXZlIGFsbG93ZWQKLSAgICAgICAgICogYW4gU1NMIGhhbmRzaGFrZSB0byBjb250aW51ZSBkZXNwaXRlIGFuIGVycm9yLCBhbmQgd2UgbXVzdCB0aGVuCi0gICAgICAgICAqIHJlbWFpbiBpbiBhbiBlcnJvciBzdGF0ZS4gIFRoZXJlZm9yZSwgd2UgTVVTVCBOT1QgY2xlYXIgZWFybGllcgotICAgICAgICAgKiB2ZXJpZmljYXRpb24gZXJyb3JzIGJ5IHNldHRpbmcgdGhlIGVycm9yIHRvIFg1MDlfVl9PSy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMiwgY3R4KSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQogICAgIHJldHVybiAxOworICB9CisgIGlmIChyZXQgPT0gLTIpIHsKKyAgICBjdHgtPmN1cnJlbnRfY2VydCA9IE5VTEw7CisgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfTk9fRVhQTElDSVRfUE9MSUNZOworICAgIHJldHVybiBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworICB9CisKKyAgaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfTk9USUZZX1BPTElDWSkgeworICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0gTlVMTDsKKyAgICAvKgorICAgICAqIFZlcmlmaWNhdGlvbiBlcnJvcnMgbmVlZCB0byBiZSAic3RpY2t5IiwgYSBjYWxsYmFjayBtYXkgaGF2ZSBhbGxvd2VkCisgICAgICogYW4gU1NMIGhhbmRzaGFrZSB0byBjb250aW51ZSBkZXNwaXRlIGFuIGVycm9yLCBhbmQgd2UgbXVzdCB0aGVuCisgICAgICogcmVtYWluIGluIGFuIGVycm9yIHN0YXRlLiAgVGhlcmVmb3JlLCB3ZSBNVVNUIE5PVCBjbGVhciBlYXJsaWVyCisgICAgICogdmVyaWZpY2F0aW9uIGVycm9ycyBieSBzZXR0aW5nIHRoZSBlcnJvciB0byBYNTA5X1ZfT0suCisgICAgICovCisgICAgaWYgKCFjdHgtPnZlcmlmeV9jYigyLCBjdHgpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBjaGVja19jZXJ0X3RpbWUoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCkKLXsKLSAgICB0aW1lX3QgKnB0aW1lOwotICAgIGludCBpOworc3RhdGljIGludCBjaGVja19jZXJ0X3RpbWUoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCkgeworICBPUEVOU1NMX3BvcnRfdGltZV90ICpwdGltZTsKKyAgaW50IGk7CiAKLSAgICBpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19VU0VfQ0hFQ0tfVElNRSkKLSAgICAgICAgcHRpbWUgPSAmY3R4LT5wYXJhbS0+Y2hlY2tfdGltZTsKLSAgICBlbHNlCi0gICAgICAgIHB0aW1lID0gTlVMTDsKKyAgaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfVVNFX0NIRUNLX1RJTUUpCisgICAgcHRpbWUgPSAmY3R4LT5wYXJhbS0+Y2hlY2tfdGltZTsKKyAgZWxzZQorICAgIHB0aW1lID0gTlVMTDsKIAotICAgIGkgPSBYNTA5X2NtcF90aW1lKFg1MDlfZ2V0X25vdEJlZm9yZSh4KSwgcHRpbWUpOwotICAgIGlmIChpID09IDApIHsKLSAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxEOwotICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgaSA9IFg1MDlfY21wX3RpbWUoWDUwOV9nZXRfbm90QmVmb3JlKHgpLCBwdGltZSk7CisgIGlmIChpID09IDApIHsKKyAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9CRUZPUkVfRklFTEQ7CisgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4OworICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKyAgICAgIHJldHVybiAwOworICB9CiAKLSAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ0VSVF9OT1RfWUVUX1ZBTElEOwotICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgaWYgKGkgPiAwKSB7CisgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ0VSVF9OT1RfWUVUX1ZBTElEOworICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKyAgICBpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisgICAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgaSA9IFg1MDlfY21wX3RpbWUoWDUwOV9nZXRfbm90QWZ0ZXIoeCksIHB0aW1lKTsKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOwotICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7Ci0gICAgICAgIGlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgaSA9IFg1MDlfY21wX3RpbWUoWDUwOV9nZXRfbm90QWZ0ZXIoeCksIHB0aW1lKTsKKyAgaWYgKGkgPT0gMCkgeworICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOworICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKyAgICBpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisgICAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgaWYgKGkgPCAwKSB7Ci0gICAgICAgIGN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQ7Ci0gICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKLSAgICAgICAgaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICBpZiAoaSA8IDApIHsKKyAgICBjdHgtPmVycm9yID0gWDUwOV9WX0VSUl9DRVJUX0hBU19FWFBJUkVEOworICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKyAgICBpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisgICAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgcmV0dXJuIDE7CisgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGludGVybmFsX3ZlcmlmeShYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIGludCBvayA9IDAsIG47Ci0gICAgWDUwOSAqeHMsICp4aTsKLSAgICBFVlBfUEtFWSAqcGtleSA9IE5VTEw7Ci0gICAgaW50ICgqY2IpIChpbnQgeG9rLCBYNTA5X1NUT1JFX0NUWCAqeGN0eCk7CitzdGF0aWMgaW50IGludGVybmFsX3ZlcmlmeShYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIGludCBvayA9IDAsIG47CisgIFg1MDkgKnhzLCAqeGk7CisgIEVWUF9QS0VZICpwa2V5ID0gTlVMTDsKKyAgaW50ICgqY2IpKGludCB4b2ssIFg1MDlfU1RPUkVfQ1RYICp4Y3R4KTsKIAotICAgIGNiID0gY3R4LT52ZXJpZnlfY2I7CisgIGNiID0gY3R4LT52ZXJpZnlfY2I7CiAKLSAgICBuID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbik7Ci0gICAgY3R4LT5lcnJvcl9kZXB0aCA9IG4gLSAxOwotICAgIG4tLTsKLSAgICB4aSA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgbik7CisgIG4gPSBza19YNTA5X251bShjdHgtPmNoYWluKTsKKyAgY3R4LT5lcnJvcl9kZXB0aCA9IG4gLSAxOworICBuLS07CisgIHhpID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBuKTsKIAotICAgIGlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgsIHhpLCB4aSkpCi0gICAgICAgIHhzID0geGk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1BBUlRJQUxfQ0hBSU4pIHsKLSAgICAgICAgICAgIHhzID0geGk7Ci0gICAgICAgICAgICBnb3RvIGNoZWNrX2NlcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRTsKLSAgICAgICAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geGk7Ci0gICAgICAgICAgICBvayA9IGNiKDAsIGN0eCk7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG4tLTsKLSAgICAgICAgICAgIGN0eC0+ZXJyb3JfZGVwdGggPSBuOwotICAgICAgICAgICAgeHMgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIG4pOwotICAgICAgICB9CisgIGlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgsIHhpLCB4aSkpCisgICAgeHMgPSB4aTsKKyAgZWxzZSB7CisgICAgaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfUEFSVElBTF9DSEFJTikgeworICAgICAgeHMgPSB4aTsKKyAgICAgIGdvdG8gY2hlY2tfY2VydDsKICAgICB9CisgICAgaWYgKG4gPD0gMCkgeworICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRTsKKyAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geGk7CisgICAgICBvayA9IGNiKDAsIGN0eCk7CisgICAgICBnb3RvIGVuZDsKKyAgICB9IGVsc2UgeworICAgICAgbi0tOworICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IG47CisgICAgICB4cyA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgbik7CisgICAgfQorICB9CiAKLS8qICAgICAgY3R4LT5lcnJvcj0wOyAgbm90IG5lZWRlZCAqLwotICAgIHdoaWxlIChuID49IDApIHsKLSAgICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IG47CisgIC8qICAgICAgY3R4LT5lcnJvcj0wOyAgbm90IG5lZWRlZCAqLworICB3aGlsZSAobiA+PSAwKSB7CisgICAgY3R4LT5lcnJvcl9kZXB0aCA9IG47CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogU2tpcCBzaWduYXR1cmUgY2hlY2sgZm9yIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcyB1bmxlc3MKLSAgICAgICAgICogZXhwbGljaXRseSBhc2tlZCBmb3IuIEl0IGRvZXNuJ3QgYWRkIGFueSBzZWN1cml0eSBhbmQganVzdCB3YXN0ZXMKLSAgICAgICAgICogdGltZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh4cyAhPSB4aSB8fCAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DSEVDS19TU19TSUdOQVRVUkUpKSB7Ci0gICAgICAgICAgICBpZiAoKHBrZXkgPSBYNTA5X2dldF9wdWJrZXkoeGkpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKLSAgICAgICAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHhpOwotICAgICAgICAgICAgICAgIG9rID0gKCpjYikgKDAsIGN0eCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFg1MDlfdmVyaWZ5KHhzLCBwa2V5KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ0VSVF9TSUdOQVRVUkVfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHhzOwotICAgICAgICAgICAgICAgIG9rID0gKCpjYikgKDAsIGN0eCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFVlBfUEtFWV9mcmVlKHBrZXkpOwotICAgICAgICAgICAgcGtleSA9IE5VTEw7Ci0gICAgICAgIH0KLQotIGNoZWNrX2NlcnQ6Ci0gICAgICAgIG9rID0gY2hlY2tfY2VydF90aW1lKGN0eCwgeHMpOworICAgIC8qCisgICAgICogU2tpcCBzaWduYXR1cmUgY2hlY2sgZm9yIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcyB1bmxlc3MKKyAgICAgKiBleHBsaWNpdGx5IGFza2VkIGZvci4gSXQgZG9lc24ndCBhZGQgYW55IHNlY3VyaXR5IGFuZCBqdXN0IHdhc3RlcworICAgICAqIHRpbWUuCisgICAgICovCisgICAgaWYgKHhzICE9IHhpIHx8IChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0NIRUNLX1NTX1NJR05BVFVSRSkpIHsKKyAgICAgIGlmICgocGtleSA9IFg1MDlfZ2V0X3B1YmtleSh4aSkpID09IE5VTEwpIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKKyAgICAgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4aTsKKyAgICAgICAgb2sgPSAoKmNiKSgwLCBjdHgpOwogICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgZ290byBlbmQ7Ci0KLSAgICAgICAgLyogVGhlIGxhc3QgZXJyb3IgKGlmIGFueSkgaXMgc3RpbGwgaW4gdGhlIGVycm9yIHZhbHVlICovCi0gICAgICAgIGN0eC0+Y3VycmVudF9pc3N1ZXIgPSB4aTsKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0gZWxzZSBpZiAoWDUwOV92ZXJpZnkoeHMsIHBrZXkpIDw9IDApIHsKKyAgICAgICAgY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ0VSVF9TSUdOQVRVUkVfRkFJTFVSRTsKICAgICAgICAgY3R4LT5jdXJyZW50X2NlcnQgPSB4czsKLSAgICAgICAgb2sgPSAoKmNiKSAoMSwgY3R4KTsKLSAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgIGdvdG8gZW5kOwotCi0gICAgICAgIG4tLTsKLSAgICAgICAgaWYgKG4gPj0gMCkgewotICAgICAgICAgICAgeGkgPSB4czsKLSAgICAgICAgICAgIHhzID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBuKTsKKyAgICAgICAgb2sgPSAoKmNiKSgwLCBjdHgpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgRVZQX1BLRVlfZnJlZShwa2V5KTsKKyAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQorICAgICAgfQorICAgICAgRVZQX1BLRVlfZnJlZShwa2V5KTsKKyAgICAgIHBrZXkgPSBOVUxMOwogICAgIH0KLSAgICBvayA9IDE7Ci0gZW5kOgotICAgIHJldHVybiBvazsKKworICBjaGVja19jZXJ0OgorICAgIG9rID0gY2hlY2tfY2VydF90aW1lKGN0eCwgeHMpOworICAgIGlmICghb2spCisgICAgICBnb3RvIGVuZDsKKworICAgIC8qIFRoZSBsYXN0IGVycm9yIChpZiBhbnkpIGlzIHN0aWxsIGluIHRoZSBlcnJvciB2YWx1ZSAqLworICAgIGN0eC0+Y3VycmVudF9pc3N1ZXIgPSB4aTsKKyAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHhzOworICAgIG9rID0gKCpjYikoMSwgY3R4KTsKKyAgICBpZiAoIW9rKQorICAgICAgZ290byBlbmQ7CisKKyAgICBuLS07CisgICAgaWYgKG4gPj0gMCkgeworICAgICAgeGkgPSB4czsKKyAgICAgIHhzID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBuKTsKKyAgICB9CisgIH0KKyAgb2sgPSAxOworZW5kOgorICByZXR1cm4gb2s7CiB9CiAKLWludCBYNTA5X2NtcF9jdXJyZW50X3RpbWUoY29uc3QgQVNOMV9USU1FICpjdG0pCi17Ci0gICAgcmV0dXJuIFg1MDlfY21wX3RpbWUoY3RtLCBOVUxMKTsKK2ludCBYNTA5X2NtcF9jdXJyZW50X3RpbWUoY29uc3QgQVNOMV9USU1FICpjdG0pIHsKKyAgcmV0dXJuIFg1MDlfY21wX3RpbWUoY3RtLCBOVUxMKTsKIH0KIAotaW50IFg1MDlfY21wX3RpbWUoY29uc3QgQVNOMV9USU1FICpjdG0sIHRpbWVfdCAqY21wX3RpbWUpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCB1dGN0aW1lX2xlbmd0aCA9IHNpemVvZigiWVlNTURESEhNTVNTWiIpIC0gMTsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGdlbmVyYWxpemVkdGltZV9sZW5ndGggPSBzaXplb2YoIllZWVlNTURESEhNTVNTWiIpIC0gMTsKLSAgICBBU04xX1RJTUUgKmFzbjFfY21wX3RpbWUgPSBOVUxMOwotICAgIGludCBpLCBkYXksIHNlYywgcmV0ID0gMDsKK2ludCBYNTA5X2NtcF90aW1lKGNvbnN0IEFTTjFfVElNRSAqY3RtLCBPUEVOU1NMX3BvcnRfdGltZV90ICpjbXBfdGltZSkgeworICBjaGFyICpzdHI7CisgIEFTTjFfVElNRSBhdG07CisgIGxvbmcgb2Zmc2V0OworICBjaGFyIGJ1ZmYxWzI0XSwgYnVmZjJbMjRdLCAqcDsKKyAgaW50IGksIGosIHJlbWFpbmluZzsKIAorICBwID0gYnVmZjE7CisgIHJlbWFpbmluZyA9IGN0bS0+bGVuZ3RoOworICBzdHIgPSAoY2hhciAqKWN0bS0+ZGF0YTsKKyAgLyoKKyAgICogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgKGhpc3RvcmljYWwpIGNvZGUgYWxsb3dzIG11Y2ggbW9yZSBzbGFjayBpbiB0aGUKKyAgICogdGltZSBmb3JtYXQgdGhhbiBSRkM1MjgwLiBJbiBSRkM1MjgwLCB0aGUgcmVwcmVzZW50YXRpb24gaXMgZml4ZWQ6CisgICAqIFVUQ1RpbWU6IFlZTU1EREhITU1TU1oKKyAgICogR2VuZXJhbGl6ZWRUaW1lOiBZWVlZTU1EREhITU1TU1oKKyAgICovCisgIGlmIChjdG0tPnR5cGUgPT0gVl9BU04xX1VUQ1RJTUUpIHsKKyAgICAvKiBZWU1NRERISE1NW1NTXVogb3IgWVlNTURESEhNTVtTU10oKy0paGhtbSAqLworICAgIGludCBtaW5fbGVuZ3RoID0gc2l6ZW9mKCJZWU1NRERISE1NWiIpIC0gMTsKKyAgICBpbnQgbWF4X2xlbmd0aCA9IHNpemVvZigiWVlNTURESEhNTVNTK2hobW0iKSAtIDE7CisgICAgaWYgKHJlbWFpbmluZyA8IG1pbl9sZW5ndGggfHwgcmVtYWluaW5nID4gbWF4X2xlbmd0aCkKKyAgICAgIHJldHVybiAwOworICAgIE9QRU5TU0xfcG9ydF9tZW1jcHkocCwgc3RyLCAxMCk7CisgICAgcCArPSAxMDsKKyAgICBzdHIgKz0gMTA7CisgICAgcmVtYWluaW5nIC09IDEwOworICB9IGVsc2UgeworICAgIC8qIFlZWVlNTURESEhNTVtTU1suZmZmXV1aIG9yIFlZWVlNTURESEhNTVtTU1suZltmW2ZdXV1dKCstKWhobW0gKi8KKyAgICBpbnQgbWluX2xlbmd0aCA9IHNpemVvZigiWVlZWU1NRERISE1NWiIpIC0gMTsKKyAgICBpbnQgbWF4X2xlbmd0aCA9IHNpemVvZigiWVlZWU1NRERISE1NU1MuZmZmK2hobW0iKSAtIDE7CisgICAgaWYgKHJlbWFpbmluZyA8IG1pbl9sZW5ndGggfHwgcmVtYWluaW5nID4gbWF4X2xlbmd0aCkKKyAgICAgIHJldHVybiAwOworICAgIE9QRU5TU0xfcG9ydF9tZW1jcHkocCwgc3RyLCAxMik7CisgICAgcCArPSAxMjsKKyAgICBzdHIgKz0gMTI7CisgICAgcmVtYWluaW5nIC09IDEyOworICB9CisKKyAgaWYgKCgqc3RyID09ICdaJykgfHwgKCpzdHIgPT0gJy0nKSB8fCAoKnN0ciA9PSAnKycpKSB7CisgICAgKihwKyspID0gJzAnOworICAgICoocCsrKSA9ICcwJzsKKyAgfSBlbHNlIHsKKyAgICAvKiBTUyAoc2Vjb25kcykgKi8KKyAgICBpZiAocmVtYWluaW5nIDwgMikKKyAgICAgIHJldHVybiAwOworICAgICoocCsrKSA9ICooc3RyKyspOworICAgICoocCsrKSA9ICooc3RyKyspOworICAgIHJlbWFpbmluZyAtPSAyOwogICAgIC8qCi0gICAgICogTm90ZSB0aGF0IEFTTi4xIGFsbG93cyBtdWNoIG1vcmUgc2xhY2sgaW4gdGhlIHRpbWUgZm9ybWF0IHRoYW4gUkZDNTI4MC4KLSAgICAgKiBJbiBSRkM1MjgwLCB0aGUgcmVwcmVzZW50YXRpb24gaXMgZml4ZWQ6Ci0gICAgICogVVRDVGltZTogWVlNTURESEhNTVNTWgotICAgICAqIEdlbmVyYWxpemVkVGltZTogWVlZWU1NRERISE1NU1NaCi0gICAgICoKLSAgICAgKiBXZSBkbyBOT1QgY3VycmVudGx5IGVuZm9yY2UgdGhlIGZvbGxvd2luZyBSRkMgNTI4MCByZXF1aXJlbWVudDoKLSAgICAgKiAiQ0FzIGNvbmZvcm1pbmcgdG8gdGhpcyBwcm9maWxlIE1VU1QgYWx3YXlzIGVuY29kZSBjZXJ0aWZpY2F0ZQotICAgICAqICB2YWxpZGl0eSBkYXRlcyB0aHJvdWdoIHRoZSB5ZWFyIDIwNDkgYXMgVVRDVGltZTsgY2VydGlmaWNhdGUgdmFsaWRpdHkKLSAgICAgKiAgZGF0ZXMgaW4gMjA1MCBvciBsYXRlciBNVVNUIGJlIGVuY29kZWQgYXMgR2VuZXJhbGl6ZWRUaW1lLiIKKyAgICAgKiBTa2lwIGFueSAodXAgdG8gdGhyZWUpIGZyYWN0aW9uYWwgc2Vjb25kcy4uLgorICAgICAqIFRPRE8oZW1pbGlhKTogaW4gUkZDNTI4MCwgZnJhY3Rpb25hbCBzZWNvbmRzIGFyZSBmb3JiaWRkZW4uCisgICAgICogQ2FuIHdlIGp1c3Qga2lsbCB0aGVtIGFsdG9nZXRoZXI/CiAgICAgICovCi0gICAgc3dpdGNoIChjdG0tPnR5cGUpIHsKLSAgICBjYXNlIFZfQVNOMV9VVENUSU1FOgotICAgICAgICBpZiAoY3RtLT5sZW5ndGggIT0gKGludCkodXRjdGltZV9sZW5ndGgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVl9BU04xX0dFTkVSQUxJWkVEVElNRToKLSAgICAgICAgaWYgKGN0bS0+bGVuZ3RoICE9IChpbnQpKGdlbmVyYWxpemVkdGltZV9sZW5ndGgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChyZW1haW5pbmcgJiYgKnN0ciA9PSAnLicpIHsKKyAgICAgIHN0cisrOworICAgICAgcmVtYWluaW5nLS07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiByZW1haW5pbmc7IGkrKywgc3RyKyssIHJlbWFpbmluZy0tKSB7CisgICAgICAgIGlmICgqc3RyIDwgJzAnIHx8ICpzdHIgPiAnOScpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQorICB9CisgICoocCsrKSA9ICdaJzsKKyAgKihwKyspID0gJ1wwJzsKIAotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGUgZm9ybWF0OiB0aGUgQVNOLjEgZnVuY3Rpb25zIHdlIHVzZSBiZWxvdyBhbGxvdyBhIG1vcmUKLSAgICAgKiBmbGV4aWJsZSBmb3JtYXQgdGhhbiB3aGF0J3MgbWFuZGF0ZWQgYnkgUkZDIDUyODAuCi0gICAgICogRGlnaXQgYW5kIGRhdGUgcmFuZ2VzIHdpbGwgYmUgdmVyaWZpZWQgaW4gdGhlIGNvbnZlcnNpb24gbWV0aG9kcy4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY3RtLT5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKCFpc2RpZ2l0KGN0bS0+ZGF0YVtpXSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGN0bS0+ZGF0YVtjdG0tPmxlbmd0aCAtIDFdICE9ICdaJykKLSAgICAgICAgcmV0dXJuIDA7CisgIC8qIFdlIG5vdyBuZWVkIGVpdGhlciBhIHRlcm1pbmF0aW5nICdaJyBvciBhbiBvZmZzZXQuICovCisgIGlmICghcmVtYWluaW5nKQorICAgIHJldHVybiAwOworICBpZiAoKnN0ciA9PSAnWicpIHsKKyAgICBpZiAocmVtYWluaW5nICE9IDEpCisgICAgICByZXR1cm4gMDsKKyAgICBvZmZzZXQgPSAwOworICB9IGVsc2UgeworICAgIC8qICgrLSlISE1NICovCisgICAgaWYgKCgqc3RyICE9ICcrJykgJiYgKCpzdHIgIT0gJy0nKSkKKyAgICAgIHJldHVybiAwOworICAgIC8qIEhpc3RvcmljYWwgYmVoYXZpb3VyOiB0aGUgKCstKWhobW0gb2Zmc2V0IGlzIGZvcmJpZGRlbiBpbiBSRkM1MjgwLiAqLworICAgIGlmIChyZW1haW5pbmcgIT0gNSkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChzdHJbMV0gPCAnMCcgfHwgc3RyWzFdID4gJzknIHx8IHN0clsyXSA8ICcwJyB8fCBzdHJbMl0gPiAnOScgfHwKKyAgICAgICAgc3RyWzNdIDwgJzAnIHx8IHN0clszXSA+ICc5JyB8fCBzdHJbNF0gPCAnMCcgfHwgc3RyWzRdID4gJzknKQorICAgICAgcmV0dXJuIDA7CisgICAgb2Zmc2V0ID0gKChzdHJbMV0gLSAnMCcpICogMTAgKyAoc3RyWzJdIC0gJzAnKSkgKiA2MDsKKyAgICBvZmZzZXQgKz0gKHN0clszXSAtICcwJykgKiAxMCArIChzdHJbNF0gLSAnMCcpOworICAgIGlmICgqc3RyID09ICctJykKKyAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgIH0KKyAgYXRtLnR5cGUgPSBjdG0tPnR5cGU7CisgIGF0bS5mbGFncyA9IDA7CisgIGF0bS5sZW5ndGggPSBzaXplb2YoYnVmZjIpOworICBhdG0uZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopYnVmZjI7CiAKLSAgICAvKgotICAgICAqIFRoZXJlIGlzIEFTTjFfVVRDVElNRV9jbXBfdGltZV90IGJ1dCBubwotICAgICAqIEFTTjFfR0VORVJBTElaRURUSU1FX2NtcF90aW1lX3Qgb3IgQVNOMV9USU1FX2NtcF90aW1lX3QsCi0gICAgICogc28gd2UgZ28gdGhyb3VnaCBBU04uMQotICAgICAqLwotICAgIGFzbjFfY21wX3RpbWUgPSBYNTA5X3RpbWVfYWRqKE5VTEwsIDAsIGNtcF90aW1lKTsKLSAgICBpZiAoYXNuMV9jbXBfdGltZSA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycjsKLSAgICBpZiAoIUFTTjFfVElNRV9kaWZmKCZkYXksICZzZWMsIGN0bSwgYXNuMV9jbXBfdGltZSkpCi0gICAgICAgIGdvdG8gZXJyOworICBpZiAoWDUwOV90aW1lX2FkaigmYXRtLCBvZmZzZXQgKiA2MCwgY21wX3RpbWUpID09IE5VTEwpCisgICAgcmV0dXJuIDA7CiAKLSAgICAvKgotICAgICAqIFg1MDlfY21wX3RpbWUgY29tcGFyaXNvbiBpcyA8PS4KLSAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy4KLSAgICAgKi8KLSAgICByZXQgPSAoZGF5ID49IDAgJiYgc2VjID49IDApID8gLTEgOiAxOworICBpZiAoY3RtLT50eXBlID09IFZfQVNOMV9VVENUSU1FKSB7CisgICAgaSA9IChidWZmMVswXSAtICcwJykgKiAxMCArIChidWZmMVsxXSAtICcwJyk7CisgICAgaWYgKGkgPCA1MCkKKyAgICAgIGkgKz0gMTAwOyAvKiBjZi4gUkZDIDI0NTkgKi8KKyAgICBqID0gKGJ1ZmYyWzBdIC0gJzAnKSAqIDEwICsgKGJ1ZmYyWzFdIC0gJzAnKTsKKyAgICBpZiAoaiA8IDUwKQorICAgICAgaiArPSAxMDA7CiAKLSBlcnI6Ci0gICAgQVNOMV9USU1FX2ZyZWUoYXNuMV9jbXBfdGltZSk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICBpZiAoaSA8IGopCisgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPiBqKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaSA9IE9QRU5TU0xfcG9ydF9zdHJjbXAoYnVmZjEsIGJ1ZmYyKTsKKyAgaWYgKGkgPT0gMCkgLyogd2FpdCBhIHNlY29uZCB0aGVuIHJldHVybiB5b3VuZ2VyIDotKSAqLworICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHJldHVybiBpOwogfQogCi1BU04xX1RJTUUgKlg1MDlfZ210aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgYWRqKQotewotICAgIHJldHVybiBYNTA5X3RpbWVfYWRqKHMsIGFkaiwgTlVMTCk7CitBU04xX1RJTUUgKlg1MDlfZ210aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgYWRqKSB7CisgIHJldHVybiBYNTA5X3RpbWVfYWRqKHMsIGFkaiwgTlVMTCk7CiB9CiAKLUFTTjFfVElNRSAqWDUwOV90aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgb2Zmc2V0X3NlYywgdGltZV90ICppbl90bSkKLXsKLSAgICByZXR1cm4gWDUwOV90aW1lX2Fkal9leChzLCAwLCBvZmZzZXRfc2VjLCBpbl90bSk7CitBU04xX1RJTUUgKlg1MDlfdGltZV9hZGooQVNOMV9USU1FICpzLCBsb25nIG9mZnNldF9zZWMsIE9QRU5TU0xfcG9ydF90aW1lX3QgKmluX3RtKSB7CisgIHJldHVybiBYNTA5X3RpbWVfYWRqX2V4KHMsIDAsIG9mZnNldF9zZWMsIGluX3RtKTsKIH0KIAotQVNOMV9USU1FICpYNTA5X3RpbWVfYWRqX2V4KEFTTjFfVElNRSAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjLCB0aW1lX3QgKmluX3RtKQotewotICAgIHRpbWVfdCB0ID0gMDsKK0FTTjFfVElNRSAqWDUwOV90aW1lX2Fkal9leChBU04xX1RJTUUgKnMsIGludCBvZmZzZXRfZGF5LCBsb25nIG9mZnNldF9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9wb3J0X3RpbWVfdCAqaW5fdG0pIHsKKyAgT1BFTlNTTF9wb3J0X3RpbWVfdCB0ID0gMDsKIAotICAgIGlmIChpbl90bSkKLSAgICAgICAgdCA9ICppbl90bTsKLSAgICBlbHNlCi0gICAgICAgIHRpbWUoJnQpOworICBpZiAoaW5fdG0pCisgICAgdCA9ICppbl90bTsKKyAgZWxzZQorICAgIE9QRU5TU0xfcG9ydF90aW1lKCZ0KTsKIAotICAgIGlmIChzICYmICEocy0+ZmxhZ3MgJiBBU04xX1NUUklOR19GTEFHX01TVFJJTkcpKSB7Ci0gICAgICAgIGlmIChzLT50eXBlID09IFZfQVNOMV9VVENUSU1FKQotICAgICAgICAgICAgcmV0dXJuIEFTTjFfVVRDVElNRV9hZGoocywgdCwgb2Zmc2V0X2RheSwgb2Zmc2V0X3NlYyk7Ci0gICAgICAgIGlmIChzLT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCi0gICAgICAgICAgICByZXR1cm4gQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOwotICAgIH0KLSAgICByZXR1cm4gQVNOMV9USU1FX2FkaihzLCB0LCBvZmZzZXRfZGF5LCBvZmZzZXRfc2VjKTsKKyAgaWYgKHMgJiYgIShzLT5mbGFncyAmIEFTTjFfU1RSSU5HX0ZMQUdfTVNUUklORykpIHsKKyAgICBpZiAocy0+dHlwZSA9PSBWX0FTTjFfVVRDVElNRSkKKyAgICAgIHJldHVybiBBU04xX1VUQ1RJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworICAgIGlmIChzLT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCisgICAgICByZXR1cm4gQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworICB9CisgIHJldHVybiBBU04xX1RJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOwogfQogCiAvKiBNYWtlIGEgZGVsdGEgQ1JMIGFzIHRoZSBkaWZmIGJldHdlZW4gdHdvIGZ1bGwgQ1JMcyAqLwogCi1YNTA5X0NSTCAqWDUwOV9DUkxfZGlmZihYNTA5X0NSTCAqYmFzZSwgWDUwOV9DUkwgKm5ld2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVkgKnNrZXksIGNvbnN0IEVWUF9NRCAqbWQsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLSAgICBYNTA5X0NSTCAqY3JsID0gTlVMTDsKLSAgICBpbnQgaTsKLSAgICBzaXplX3QgajsKLSAgICBTVEFDS19PRihYNTA5X1JFVk9LRUQpICpyZXZzID0gTlVMTDsKLSAgICAvKiBDUkxzIGNhbid0IGJlIGRlbHRhIGFscmVhZHkgKi8KLSAgICBpZiAoYmFzZS0+YmFzZV9jcmxfbnVtYmVyIHx8IG5ld2VyLT5iYXNlX2NybF9udW1iZXIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0NSTF9BTFJFQURZX0RFTFRBKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8qIEJhc2UgYW5kIG5ldyBDUkwgbXVzdCBoYXZlIGEgQ1JMIG51bWJlciAqLwotICAgIGlmICghYmFzZS0+Y3JsX251bWJlciB8fCAhbmV3ZXItPmNybF9udW1iZXIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX05PX0NSTF9OVU1CRVIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLyogSXNzdWVyIG5hbWVzIG11c3QgbWF0Y2ggKi8KLSAgICBpZiAoWDUwOV9OQU1FX2NtcChYNTA5X0NSTF9nZXRfaXNzdWVyKGJhc2UpLCBYNTA5X0NSTF9nZXRfaXNzdWVyKG5ld2VyKSkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0lTU1VFUl9NSVNNQVRDSCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKiBBS0lEIGFuZCBJRFAgbXVzdCBtYXRjaCAqLwotICAgIGlmICghY3JsX2V4dGVuc2lvbl9tYXRjaChiYXNlLCBuZXdlciwgTklEX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcikpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0FLSURfTUlTTUFUQ0gpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGJhc2UsIG5ld2VyLCBOSURfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9JRFBfTUlTTUFUQ0gpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLyogTmV3ZXIgQ1JMIG51bWJlciBtdXN0IGV4Y2VlZCBmdWxsIENSTCBudW1iZXIgKi8KLSAgICBpZiAoQVNOMV9JTlRFR0VSX2NtcChuZXdlci0+Y3JsX251bWJlciwgYmFzZS0+Y3JsX251bWJlcikgPD0gMCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTkVXRVJfQ1JMX05PVF9ORVdFUik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKiBDUkxzIG11c3QgdmVyaWZ5ICovCi0gICAgaWYgKHNrZXkgJiYgKFg1MDlfQ1JMX3ZlcmlmeShiYXNlLCBza2V5KSA8PSAwIHx8Ci0gICAgICAgICAgICAgICAgIFg1MDlfQ1JMX3ZlcmlmeShuZXdlciwgc2tleSkgPD0gMCkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0NSTF9WRVJJRllfRkFJTFVSRSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKiBDcmVhdGUgbmV3IENSTCAqLwotICAgIGNybCA9IFg1MDlfQ1JMX25ldygpOwotICAgIGlmICghY3JsIHx8ICFYNTA5X0NSTF9zZXRfdmVyc2lvbihjcmwsIDEpKQotICAgICAgICBnb3RvIG1lbWVycjsKLSAgICAvKiBTZXQgaXNzdWVyIG5hbWUgKi8KLSAgICBpZiAoIVg1MDlfQ1JMX3NldF9pc3N1ZXJfbmFtZShjcmwsIFg1MDlfQ1JMX2dldF9pc3N1ZXIobmV3ZXIpKSkKLSAgICAgICAgZ290byBtZW1lcnI7Ci0KLSAgICBpZiAoIVg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKGNybCwgWDUwOV9DUkxfZ2V0X2xhc3RVcGRhdGUobmV3ZXIpKSkKLSAgICAgICAgZ290byBtZW1lcnI7Ci0gICAgaWYgKCFYNTA5X0NSTF9zZXRfbmV4dFVwZGF0ZShjcmwsIFg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKG5ld2VyKSkpCi0gICAgICAgIGdvdG8gbWVtZXJyOwotCi0gICAgLyogU2V0IGJhc2UgQ1JMIG51bWJlcjogbXVzdCBiZSBjcml0aWNhbCAqLwotCi0gICAgaWYgKCFYNTA5X0NSTF9hZGQxX2V4dF9pMmQoY3JsLCBOSURfZGVsdGFfY3JsLCBiYXNlLT5jcmxfbnVtYmVyLCAxLCAwKSkKLSAgICAgICAgZ290byBtZW1lcnI7Ci0KLSAgICAvKgotICAgICAqIENvcHkgZXh0ZW5zaW9ucyBhY3Jvc3MgZnJvbSBuZXdlc3QgQ1JMIHRvIGRlbHRhOiB0aGlzIHdpbGwgc2V0IENSTAotICAgICAqIG51bWJlciB0byBjb3JyZWN0IHZhbHVlIHRvby4KLSAgICAgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCBYNTA5X0NSTF9nZXRfZXh0X2NvdW50KG5ld2VyKTsgaSsrKSB7Ci0gICAgICAgIFg1MDlfRVhURU5TSU9OICpleHQ7Ci0gICAgICAgIGV4dCA9IFg1MDlfQ1JMX2dldF9leHQobmV3ZXIsIGkpOwotICAgICAgICBpZiAoIVg1MDlfQ1JMX2FkZF9leHQoY3JsLCBleHQsIC0xKSkKLSAgICAgICAgICAgIGdvdG8gbWVtZXJyOwotICAgIH0KLQotICAgIC8qIEdvIHRocm91Z2ggcmV2b2tlZCBlbnRyaWVzLCBjb3B5aW5nIGFzIG5lZWRlZCAqLwotCi0gICAgcmV2cyA9IFg1MDlfQ1JMX2dldF9SRVZPS0VEKG5ld2VyKTsKLQotICAgIGZvciAoaiA9IDA7IGogPCBza19YNTA5X1JFVk9LRURfbnVtKHJldnMpOyBqKyspIHsKLSAgICAgICAgWDUwOV9SRVZPS0VEICpydm4sICpydnRtcDsKLSAgICAgICAgcnZuID0gc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKHJldnMsIGopOwotICAgICAgICAvKgotICAgICAgICAgKiBBZGQgb25seSBpZiBub3QgYWxzbyBpbiBiYXNlLiBUT0RPOiBuZWVkIHNvbWV0aGluZyBjbGV2ZXJlciBoZXJlCi0gICAgICAgICAqIGZvciBzb21lIG1vcmUgY29tcGxleCBDUkxzIGNvdmVyaW5nIG11bHRpcGxlIENBcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghWDUwOV9DUkxfZ2V0MF9ieV9zZXJpYWwoYmFzZSwgJnJ2dG1wLCBydm4tPnNlcmlhbE51bWJlcikpIHsKLSAgICAgICAgICAgIHJ2dG1wID0gWDUwOV9SRVZPS0VEX2R1cChydm4pOwotICAgICAgICAgICAgaWYgKCFydnRtcCkKLSAgICAgICAgICAgICAgICBnb3RvIG1lbWVycjsKLSAgICAgICAgICAgIGlmICghWDUwOV9DUkxfYWRkMF9yZXZva2VkKGNybCwgcnZ0bXApKSB7Ci0gICAgICAgICAgICAgICAgWDUwOV9SRVZPS0VEX2ZyZWUocnZ0bXApOwotICAgICAgICAgICAgICAgIGdvdG8gbWVtZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFRPRE86IG9wdGlvbmFsbHkgcHJ1bmUgZGVsZXRlZCBlbnRyaWVzICovCi0KLSAgICBpZiAoc2tleSAmJiBtZCAmJiAhWDUwOV9DUkxfc2lnbihjcmwsIHNrZXksIG1kKSkKLSAgICAgICAgZ290byBtZW1lcnI7Ci0KLSAgICByZXR1cm4gY3JsOwotCi0gbWVtZXJyOgotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICBpZiAoY3JsKQotICAgICAgICBYNTA5X0NSTF9mcmVlKGNybCk7CitYNTA5X0NSTCAqWDUwOV9DUkxfZGlmZihYNTA5X0NSTCAqYmFzZSwgWDUwOV9DUkwgKm5ld2VyLCBFVlBfUEtFWSAqc2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9NRCAqbWQsIHVuc2lnbmVkIGludCBmbGFncykgeworICBYNTA5X0NSTCAqY3JsID0gTlVMTDsKKyAgaW50IGk7CisgIHNpemVfdCBqOworICBTVEFDS19PRihYNTA5X1JFVk9LRUQpICpyZXZzID0gTlVMTDsKKyAgLyogQ1JMcyBjYW4ndCBiZSBkZWx0YSBhbHJlYWR5ICovCisgIGlmIChiYXNlLT5iYXNlX2NybF9udW1iZXIgfHwgbmV3ZXItPmJhc2VfY3JsX251bWJlcikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9DUkxfQUxSRUFEWV9ERUxUQSk7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyogQmFzZSBhbmQgbmV3IENSTCBtdXN0IGhhdmUgYSBDUkwgbnVtYmVyICovCisgIGlmICghYmFzZS0+Y3JsX251bWJlciB8fCAhbmV3ZXItPmNybF9udW1iZXIpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTk9fQ1JMX05VTUJFUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyogSXNzdWVyIG5hbWVzIG11c3QgbWF0Y2ggKi8KKyAgaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9DUkxfZ2V0X2lzc3VlcihiYXNlKSwgWDUwOV9DUkxfZ2V0X2lzc3VlcihuZXdlcikpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0lTU1VFUl9NSVNNQVRDSCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyogQUtJRCBhbmQgSURQIG11c3QgbWF0Y2ggKi8KKyAgaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGJhc2UsIG5ld2VyLCBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9BS0lEX01JU01BVENIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIWNybF9leHRlbnNpb25fbWF0Y2goYmFzZSwgbmV3ZXIsIE5JRF9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfSURQX01JU01BVENIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBOZXdlciBDUkwgbnVtYmVyIG11c3QgZXhjZWVkIGZ1bGwgQ1JMIG51bWJlciAqLworICBpZiAoQVNOMV9JTlRFR0VSX2NtcChuZXdlci0+Y3JsX251bWJlciwgYmFzZS0+Y3JsX251bWJlcikgPD0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9ORVdFUl9DUkxfTk9UX05FV0VSKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBDUkxzIG11c3QgdmVyaWZ5ICovCisgIGlmIChza2V5ICYmCisgICAgICAoWDUwOV9DUkxfdmVyaWZ5KGJhc2UsIHNrZXkpIDw9IDAgfHwgWDUwOV9DUkxfdmVyaWZ5KG5ld2VyLCBza2V5KSA8PSAwKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9DUkxfVkVSSUZZX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIENyZWF0ZSBuZXcgQ1JMICovCisgIGNybCA9IFg1MDlfQ1JMX25ldygpOworICBpZiAoIWNybCB8fCAhWDUwOV9DUkxfc2V0X3ZlcnNpb24oY3JsLCAxKSkKKyAgICBnb3RvIG1lbWVycjsKKyAgLyogU2V0IGlzc3VlciBuYW1lICovCisgIGlmICghWDUwOV9DUkxfc2V0X2lzc3Vlcl9uYW1lKGNybCwgWDUwOV9DUkxfZ2V0X2lzc3VlcihuZXdlcikpKQorICAgIGdvdG8gbWVtZXJyOworCisgIGlmICghWDUwOV9DUkxfc2V0X2xhc3RVcGRhdGUoY3JsLCBYNTA5X0NSTF9nZXRfbGFzdFVwZGF0ZShuZXdlcikpKQorICAgIGdvdG8gbWVtZXJyOworICBpZiAoIVg1MDlfQ1JMX3NldF9uZXh0VXBkYXRlKGNybCwgWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUobmV3ZXIpKSkKKyAgICBnb3RvIG1lbWVycjsKKworICAvKiBTZXQgYmFzZSBDUkwgbnVtYmVyOiBtdXN0IGJlIGNyaXRpY2FsICovCisKKyAgaWYgKCFYNTA5X0NSTF9hZGQxX2V4dF9pMmQoY3JsLCBOSURfZGVsdGFfY3JsLCBiYXNlLT5jcmxfbnVtYmVyLCAxLCAwKSkKKyAgICBnb3RvIG1lbWVycjsKKworICAvKgorICAgKiBDb3B5IGV4dGVuc2lvbnMgYWNyb3NzIGZyb20gbmV3ZXN0IENSTCB0byBkZWx0YTogdGhpcyB3aWxsIHNldCBDUkwKKyAgICogbnVtYmVyIHRvIGNvcnJlY3QgdmFsdWUgdG9vLgorICAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgWDUwOV9DUkxfZ2V0X2V4dF9jb3VudChuZXdlcik7IGkrKykgeworICAgIFg1MDlfRVhURU5TSU9OICpleHQ7CisgICAgZXh0ID0gWDUwOV9DUkxfZ2V0X2V4dChuZXdlciwgaSk7CisgICAgaWYgKCFYNTA5X0NSTF9hZGRfZXh0KGNybCwgZXh0LCAtMSkpCisgICAgICBnb3RvIG1lbWVycjsKKyAgfQorCisgIC8qIEdvIHRocm91Z2ggcmV2b2tlZCBlbnRyaWVzLCBjb3B5aW5nIGFzIG5lZWRlZCAqLworCisgIHJldnMgPSBYNTA5X0NSTF9nZXRfUkVWT0tFRChuZXdlcik7CisKKyAgZm9yIChqID0gMDsgaiA8IHNrX1g1MDlfUkVWT0tFRF9udW0ocmV2cyk7IGorKykgeworICAgIFg1MDlfUkVWT0tFRCAqcnZuLCAqcnZ0bXA7CisgICAgcnZuID0gc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKHJldnMsIGopOworICAgIC8qCisgICAgICogQWRkIG9ubHkgaWYgbm90IGFsc28gaW4gYmFzZS4gVE9ETzogbmVlZCBzb21ldGhpbmcgY2xldmVyZXIgaGVyZQorICAgICAqIGZvciBzb21lIG1vcmUgY29tcGxleCBDUkxzIGNvdmVyaW5nIG11bHRpcGxlIENBcy4KKyAgICAgKi8KKyAgICBpZiAoIVg1MDlfQ1JMX2dldDBfYnlfc2VyaWFsKGJhc2UsICZydnRtcCwgcnZuLT5zZXJpYWxOdW1iZXIpKSB7CisgICAgICBydnRtcCA9IFg1MDlfUkVWT0tFRF9kdXAocnZuKTsKKyAgICAgIGlmICghcnZ0bXApCisgICAgICAgIGdvdG8gbWVtZXJyOworICAgICAgaWYgKCFYNTA5X0NSTF9hZGQwX3Jldm9rZWQoY3JsLCBydnRtcCkpIHsKKyAgICAgICAgWDUwOV9SRVZPS0VEX2ZyZWUocnZ0bXApOworICAgICAgICBnb3RvIG1lbWVycjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogVE9ETzogb3B0aW9uYWxseSBwcnVuZSBkZWxldGVkIGVudHJpZXMgKi8KKworICBpZiAoc2tleSAmJiBtZCAmJiAhWDUwOV9DUkxfc2lnbihjcmwsIHNrZXksIG1kKSkKKyAgICBnb3RvIG1lbWVycjsKKworICByZXR1cm4gY3JsOworCittZW1lcnI6CisgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgaWYgKGNybCkKKyAgICBYNTA5X0NSTF9mcmVlKGNybCk7CisgIHJldHVybiBOVUxMOwogfQogCiBpbnQgWDUwOV9TVE9SRV9DVFhfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fRVhfdW51c2VkICogdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX3VudXNlZCAqdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpCi17Ci0gICAgLyoKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzICh1c3VhbGx5KSBjYWxsZWQgb25seSBvbmNlLCBieQotICAgICAqIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHggKHNzbC9zc2xfY2VydC5jKS4KLSAgICAgKi8KLSAgICBpbnQgaW5kZXg7Ci0gICAgaWYgKCFDUllQVE9fZ2V0X2V4X25ld19pbmRleCgmZ19leF9kYXRhX2NsYXNzLCAmaW5kZXgsIGFyZ2wsIGFyZ3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2Z1bmMpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykgeworICAvKgorICAgKiBUaGlzIGZ1bmN0aW9uIGlzICh1c3VhbGx5KSBjYWxsZWQgb25seSBvbmNlLCBieQorICAgKiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4IChzc2wvc3NsX2NlcnQuYykuCisgICAqLworICBpbnQgaW5kZXg7CisgIGlmICghQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoJmdfZXhfZGF0YV9jbGFzcywgJmluZGV4LCBhcmdsLCBhcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZnVuYykpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGluZGV4OwogfQogCi1pbnQgWDUwOV9TVE9SRV9DVFhfc2V0X2V4X2RhdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGlkeCwgdm9pZCAqZGF0YSkKLXsKLSAgICByZXR1cm4gQ1JZUFRPX3NldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsIGlkeCwgZGF0YSk7CitpbnQgWDUwOV9TVE9SRV9DVFhfc2V0X2V4X2RhdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGlkeCwgdm9pZCAqZGF0YSkgeworICByZXR1cm4gQ1JZUFRPX3NldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsIGlkeCwgZGF0YSk7CiB9CiAKLXZvaWQgKlg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBpZHgpCi17Ci0gICAgcmV0dXJuIENSWVBUT19nZXRfZXhfZGF0YSgmY3R4LT5leF9kYXRhLCBpZHgpOwordm9pZCAqWDUwOV9TVE9SRV9DVFhfZ2V0X2V4X2RhdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGlkeCkgeworICByZXR1cm4gQ1JZUFRPX2dldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsIGlkeCk7CiB9CiAKLWludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICByZXR1cm4gY3R4LT5lcnJvcjsKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCkgeyByZXR1cm4gY3R4LT5lcnJvcjsgfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgZXJyKSB7CisgIGN0eC0+ZXJyb3IgPSBlcnI7CiB9CiAKLXZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBlcnIpCi17Ci0gICAgY3R4LT5lcnJvciA9IGVycjsKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCkgeworICByZXR1cm4gY3R4LT5lcnJvcl9kZXB0aDsKIH0KIAotaW50IFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHJldHVybiBjdHgtPmVycm9yX2RlcHRoOworWDUwOSAqWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIHJldHVybiBjdHgtPmN1cnJlbnRfY2VydDsKIH0KIAotWDUwOSAqWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHJldHVybiBjdHgtPmN1cnJlbnRfY2VydDsKK1NUQUNLX09GKFg1MDkpICogWDUwOV9TVE9SRV9DVFhfZ2V0X2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGN0eC0+Y2hhaW47CiB9CiAKLVNUQUNLX09GKFg1MDkpICpYNTA5X1NUT1JFX0NUWF9nZXRfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICByZXR1cm4gY3R4LT5jaGFpbjsKK1NUQUNLX09GKFg1MDkpICogWDUwOV9TVE9SRV9DVFhfZ2V0MV9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIGlmICghY3R4LT5jaGFpbikKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIFg1MDlfY2hhaW5fdXBfcmVmKGN0eC0+Y2hhaW4pOwogfQogCi1TVEFDS19PRihYNTA5KSAqWDUwOV9TVE9SRV9DVFhfZ2V0MV9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIGlmICghY3R4LT5jaGFpbikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFg1MDlfY2hhaW5fdXBfcmVmKGN0eC0+Y2hhaW4pOworWDUwOSAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9jdXJyZW50X2lzc3VlcihYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIHJldHVybiBjdHgtPmN1cnJlbnRfaXNzdWVyOwogfQogCi1YNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXQwX2N1cnJlbnRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgpCi17Ci0gICAgcmV0dXJuIGN0eC0+Y3VycmVudF9pc3N1ZXI7CitYNTA5X0NSTCAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9jdXJyZW50X2NybChYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIHJldHVybiBjdHgtPmN1cnJlbnRfY3JsOwogfQogCi1YNTA5X0NSTCAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9jdXJyZW50X2NybChYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHJldHVybiBjdHgtPmN1cnJlbnRfY3JsOworWDUwOV9TVE9SRV9DVFggKlg1MDlfU1RPUkVfQ1RYX2dldDBfcGFyZW50X2N0eChYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIHJldHVybiBjdHgtPnBhcmVudDsKIH0KIAotWDUwOV9TVE9SRV9DVFggKlg1MDlfU1RPUkVfQ1RYX2dldDBfcGFyZW50X2N0eChYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHJldHVybiBjdHgtPnBhcmVudDsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCkgeyBjdHgtPmNlcnQgPSB4OyB9CisKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICogc2spIHsKKyAgY3R4LT51bnRydXN0ZWQgPSBzazsKIH0KIAotdm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KQotewotICAgIGN0eC0+Y2VydCA9IHg7CitTVEFDS19PRihYNTA5KSAqIFg1MDlfU1RPUkVfQ1RYX2dldDBfdW50cnVzdGVkKFg1MDlfU1RPUkVfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGN0eC0+dW50cnVzdGVkOwogfQogCi12b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2spCi17Ci0gICAgY3R4LT51bnRydXN0ZWQgPSBzazsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0MF9jcmxzKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDlfQ1JMKSAqIHNrKSB7CisgIGN0eC0+Y3JscyA9IHNrOwogfQogCi1TVEFDS19PRihYNTA5KSAqWDUwOV9TVE9SRV9DVFhfZ2V0MF91bnRydXN0ZWQoWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICByZXR1cm4gY3R4LT51bnRydXN0ZWQ7CitpbnQgWDUwOV9TVE9SRV9DVFhfc2V0X3B1cnBvc2UoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IHB1cnBvc2UpIHsKKyAgcmV0dXJuIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdChjdHgsIDAsIHB1cnBvc2UsIDApOwogfQogCi12b2lkIFg1MDlfU1RPUkVfQ1RYX3NldDBfY3JscyhYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5X0NSTCkgKnNrKQotewotICAgIGN0eC0+Y3JscyA9IHNrOwotfQotCi1pbnQgWDUwOV9TVE9SRV9DVFhfc2V0X3B1cnBvc2UoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IHB1cnBvc2UpCi17Ci0gICAgcmV0dXJuIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdChjdHgsIDAsIHB1cnBvc2UsIDApOwotfQotCi1pbnQgWDUwOV9TVE9SRV9DVFhfc2V0X3RydXN0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCB0cnVzdCkKLXsKLSAgICByZXR1cm4gWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KGN0eCwgMCwgMCwgdHJ1c3QpOworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF90cnVzdChYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgdHJ1c3QpIHsKKyAgcmV0dXJuIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdChjdHgsIDAsIDAsIHRydXN0KTsKIH0KIAogLyoKQEAgLTIxNTQsMTc1ICsyMTI3LDE3MCBAQAogICovCiAKIGludCBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGRlZl9wdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHVycG9zZSwgaW50IHRydXN0KQotewotICAgIGludCBpZHg7Ci0gICAgLyogSWYgcHVycG9zZSBub3Qgc2V0IHVzZSBkZWZhdWx0ICovCi0gICAgaWYgKCFwdXJwb3NlKQotICAgICAgICBwdXJwb3NlID0gZGVmX3B1cnBvc2U7Ci0gICAgLyogSWYgd2UgaGF2ZSBhIHB1cnBvc2UgdGhlbiBjaGVjayBpdCBpcyB2YWxpZCAqLwotICAgIGlmIChwdXJwb3NlKSB7Ci0gICAgICAgIFg1MDlfUFVSUE9TRSAqcHRtcDsKLSAgICAgICAgaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChwdXJwb3NlKTsKLSAgICAgICAgaWYgKGlkeCA9PSAtMSkgewotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBwdG1wID0gWDUwOV9QVVJQT1NFX2dldDAoaWR4KTsKLSAgICAgICAgaWYgKHB0bXAtPnRydXN0ID09IFg1MDlfVFJVU1RfREVGQVVMVCkgewotICAgICAgICAgICAgaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChkZWZfcHVycG9zZSk7Ci0gICAgICAgICAgICBpZiAoaWR4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdG1wID0gWDUwOV9QVVJQT1NFX2dldDAoaWR4KTsKLSAgICAgICAgfQotICAgICAgICAvKiBJZiB0cnVzdCBub3Qgc2V0IHRoZW4gZ2V0IGZyb20gcHVycG9zZSBkZWZhdWx0ICovCi0gICAgICAgIGlmICghdHJ1c3QpCi0gICAgICAgICAgICB0cnVzdCA9IHB0bXAtPnRydXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHVycG9zZSwgaW50IHRydXN0KSB7CisgIGludCBpZHg7CisgIC8qIElmIHB1cnBvc2Ugbm90IHNldCB1c2UgZGVmYXVsdCAqLworICBpZiAoIXB1cnBvc2UpCisgICAgcHVycG9zZSA9IGRlZl9wdXJwb3NlOworICAvKiBJZiB3ZSBoYXZlIGEgcHVycG9zZSB0aGVuIGNoZWNrIGl0IGlzIHZhbGlkICovCisgIGlmIChwdXJwb3NlKSB7CisgICAgWDUwOV9QVVJQT1NFICpwdG1wOworICAgIGlkeCA9IFg1MDlfUFVSUE9TRV9nZXRfYnlfaWQocHVycG9zZSk7CisgICAgaWYgKGlkeCA9PSAtMSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgaWYgKHRydXN0KSB7Ci0gICAgICAgIGlkeCA9IFg1MDlfVFJVU1RfZ2V0X2J5X2lkKHRydXN0KTsKLSAgICAgICAgaWYgKGlkeCA9PSAtMSkgewotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fVFJVU1RfSUQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICBwdG1wID0gWDUwOV9QVVJQT1NFX2dldDAoaWR4KTsKKyAgICBpZiAocHRtcC0+dHJ1c3QgPT0gWDUwOV9UUlVTVF9ERUZBVUxUKSB7CisgICAgICBpZHggPSBYNTA5X1BVUlBPU0VfZ2V0X2J5X2lkKGRlZl9wdXJwb3NlKTsKKyAgICAgIGlmIChpZHggPT0gLTEpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGlkeCk7CiAgICAgfQorICAgIC8qIElmIHRydXN0IG5vdCBzZXQgdGhlbiBnZXQgZnJvbSBwdXJwb3NlIGRlZmF1bHQgKi8KKyAgICBpZiAoIXRydXN0KQorICAgICAgdHJ1c3QgPSBwdG1wLT50cnVzdDsKKyAgfQorICBpZiAodHJ1c3QpIHsKKyAgICBpZHggPSBYNTA5X1RSVVNUX2dldF9ieV9pZCh0cnVzdCk7CisgICAgaWYgKGlkeCA9PSAtMSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fVFJVU1RfSUQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CiAKLSAgICBpZiAocHVycG9zZSAmJiAhY3R4LT5wYXJhbS0+cHVycG9zZSkKLSAgICAgICAgY3R4LT5wYXJhbS0+cHVycG9zZSA9IHB1cnBvc2U7Ci0gICAgaWYgKHRydXN0ICYmICFjdHgtPnBhcmFtLT50cnVzdCkKLSAgICAgICAgY3R4LT5wYXJhbS0+dHJ1c3QgPSB0cnVzdDsKLSAgICByZXR1cm4gMTsKKyAgaWYgKHB1cnBvc2UgJiYgIWN0eC0+cGFyYW0tPnB1cnBvc2UpCisgICAgY3R4LT5wYXJhbS0+cHVycG9zZSA9IHB1cnBvc2U7CisgIGlmICh0cnVzdCAmJiAhY3R4LT5wYXJhbS0+dHJ1c3QpCisgICAgY3R4LT5wYXJhbS0+dHJ1c3QgPSB0cnVzdDsKKyAgcmV0dXJuIDE7CiB9CiAKLVg1MDlfU1RPUkVfQ1RYICpYNTA5X1NUT1JFX0NUWF9uZXcodm9pZCkKLXsKLSAgICBYNTA5X1NUT1JFX0NUWCAqY3R4OwotICAgIGN0eCA9IChYNTA5X1NUT1JFX0NUWCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1NUT1JFX0NUWCkpOwotICAgIGlmICghY3R4KSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFg1MDlfU1RPUkVfQ1RYX3plcm8oY3R4KTsKLSAgICByZXR1cm4gY3R4OworWDUwOV9TVE9SRV9DVFggKlg1MDlfU1RPUkVfQ1RYX25ldyh2b2lkKSB7CisgIFg1MDlfU1RPUkVfQ1RYICpjdHg7CisgIGN0eCA9IChYNTA5X1NUT1JFX0NUWCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1NUT1JFX0NUWCkpOworICBpZiAoIWN0eCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBYNTA5X1NUT1JFX0NUWF96ZXJvKGN0eCk7CisgIHJldHVybiBjdHg7CiB9CiAKLXZvaWQgWDUwOV9TVE9SRV9DVFhfemVybyhYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIE9QRU5TU0xfbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKFg1MDlfU1RPUkVfQ1RYKSk7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3plcm8oWDUwOV9TVE9SRV9DVFggKmN0eCkgeworICBPUEVOU1NMX21lbXNldChjdHgsIDAsIHNpemVvZihYNTA5X1NUT1JFX0NUWCkpOwogfQogCi12b2lkIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoWDUwOV9TVE9SRV9DVFggKmN0eCkKLXsKLSAgICBpZiAoY3R4ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKGN0eCk7Ci0gICAgT1BFTlNTTF9mcmVlKGN0eCk7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoWDUwOV9TVE9SRV9DVFggKmN0eCkgeworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgWDUwOV9TVE9SRV9DVFhfY2xlYW51cChjdHgpOworICBPUEVOU1NMX2ZyZWUoY3R4KTsKIH0KIAogaW50IFg1MDlfU1RPUkVfQ1RYX2luaXQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9TVE9SRSAqc3RvcmUsIFg1MDkgKng1MDksCi0gICAgICAgICAgICAgICAgICAgICAgICBTVEFDS19PRihYNTA5KSAqY2hhaW4pCi17Ci0gICAgaW50IHJldCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBTVEFDS19PRihYNTA5KSAqIGNoYWluKSB7CisgIGludCByZXQgPSAxOwogCi0gICAgWDUwOV9TVE9SRV9DVFhfemVybyhjdHgpOwotICAgIGN0eC0+Y3R4ID0gc3RvcmU7Ci0gICAgY3R4LT5jZXJ0ID0geDUwOTsKLSAgICBjdHgtPnVudHJ1c3RlZCA9IGNoYWluOworICBYNTA5X1NUT1JFX0NUWF96ZXJvKGN0eCk7CisgIGN0eC0+Y3R4ID0gc3RvcmU7CisgIGN0eC0+Y2VydCA9IHg1MDk7CisgIGN0eC0+dW50cnVzdGVkID0gY2hhaW47CiAKLSAgICBDUllQVE9fbmV3X2V4X2RhdGEoJmN0eC0+ZXhfZGF0YSk7CisgIENSWVBUT19uZXdfZXhfZGF0YSgmY3R4LT5leF9kYXRhKTsKIAotICAgIGN0eC0+cGFyYW0gPSBYNTA5X1ZFUklGWV9QQVJBTV9uZXcoKTsKLSAgICBpZiAoIWN0eC0+cGFyYW0pCi0gICAgICAgIGdvdG8gZXJyOworICBjdHgtPnBhcmFtID0gWDUwOV9WRVJJRllfUEFSQU1fbmV3KCk7CisgIGlmICghY3R4LT5wYXJhbSkKKyAgICBnb3RvIGVycjsKIAotICAgIC8qCi0gICAgICogSW5oZXJpdCBjYWxsYmFja3MgYW5kIGZsYWdzIGZyb20gWDUwOV9TVE9SRSBpZiBub3Qgc2V0IHVzZSBkZWZhdWx0cy4KLSAgICAgKi8KKyAgLyoKKyAgICogSW5oZXJpdCBjYWxsYmFja3MgYW5kIGZsYWdzIGZyb20gWDUwOV9TVE9SRSBpZiBub3Qgc2V0IHVzZSBkZWZhdWx0cy4KKyAgICovCiAKLSAgICBpZiAoc3RvcmUpCi0gICAgICAgIHJldCA9IFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoY3R4LT5wYXJhbSwgc3RvcmUtPnBhcmFtKTsKLSAgICBlbHNlCi0gICAgICAgIGN0eC0+cGFyYW0tPmluaF9mbGFncyB8PSBYNTA5X1ZQX0ZMQUdfREVGQVVMVCB8IFg1MDlfVlBfRkxBR19PTkNFOworICBpZiAoc3RvcmUpCisgICAgcmV0ID0gWDUwOV9WRVJJRllfUEFSQU1faW5oZXJpdChjdHgtPnBhcmFtLCBzdG9yZS0+cGFyYW0pOworICBlbHNlCisgICAgY3R4LT5wYXJhbS0+aW5oX2ZsYWdzIHw9IFg1MDlfVlBfRkxBR19ERUZBVUxUIHwgWDUwOV9WUF9GTEFHX09OQ0U7CiAKLSAgICBpZiAoc3RvcmUpIHsKLSAgICAgICAgY3R4LT52ZXJpZnlfY2IgPSBzdG9yZS0+dmVyaWZ5X2NiOwotICAgICAgICBjdHgtPmNsZWFudXAgPSBzdG9yZS0+Y2xlYW51cDsKLSAgICB9IGVsc2UKLSAgICAgICAgY3R4LT5jbGVhbnVwID0gMDsKKyAgaWYgKHN0b3JlKSB7CisgICAgY3R4LT52ZXJpZnlfY2IgPSBzdG9yZS0+dmVyaWZ5X2NiOworICAgIGN0eC0+Y2xlYW51cCA9IHN0b3JlLT5jbGVhbnVwOworICB9IGVsc2UKKyAgICBjdHgtPmNsZWFudXAgPSAwOwogCi0gICAgaWYgKHJldCkKLSAgICAgICAgcmV0ID0gWDUwOV9WRVJJRllfUEFSQU1faW5oZXJpdChjdHgtPnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfVkVSSUZZX1BBUkFNX2xvb2t1cCgiZGVmYXVsdCIpKTsKKyAgaWYgKHJldCkKKyAgICByZXQgPSBYNTA5X1ZFUklGWV9QQVJBTV9pbmhlcml0KGN0eC0+cGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X1ZFUklGWV9QQVJBTV9sb29rdXAoImRlZmF1bHQiKSk7CiAKLSAgICBpZiAocmV0ID09IDApCi0gICAgICAgIGdvdG8gZXJyOworICBpZiAocmV0ID09IDApCisgICAgZ290byBlcnI7CiAKLSAgICBpZiAoc3RvcmUgJiYgc3RvcmUtPmNoZWNrX2lzc3VlZCkKLSAgICAgICAgY3R4LT5jaGVja19pc3N1ZWQgPSBzdG9yZS0+Y2hlY2tfaXNzdWVkOwotICAgIGVsc2UKLSAgICAgICAgY3R4LT5jaGVja19pc3N1ZWQgPSBjaGVja19pc3N1ZWQ7CisgIGlmIChzdG9yZSAmJiBzdG9yZS0+Y2hlY2tfaXNzdWVkKQorICAgIGN0eC0+Y2hlY2tfaXNzdWVkID0gc3RvcmUtPmNoZWNrX2lzc3VlZDsKKyAgZWxzZQorICAgIGN0eC0+Y2hlY2tfaXNzdWVkID0gY2hlY2tfaXNzdWVkOwogCi0gICAgaWYgKHN0b3JlICYmIHN0b3JlLT5nZXRfaXNzdWVyKQotICAgICAgICBjdHgtPmdldF9pc3N1ZXIgPSBzdG9yZS0+Z2V0X2lzc3VlcjsKLSAgICBlbHNlCi0gICAgICAgIGN0eC0+Z2V0X2lzc3VlciA9IFg1MDlfU1RPUkVfQ1RYX2dldDFfaXNzdWVyOworICBpZiAoc3RvcmUgJiYgc3RvcmUtPmdldF9pc3N1ZXIpCisgICAgY3R4LT5nZXRfaXNzdWVyID0gc3RvcmUtPmdldF9pc3N1ZXI7CisgIGVsc2UKKyAgICBjdHgtPmdldF9pc3N1ZXIgPSBYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlcjsKIAotICAgIGlmIChzdG9yZSAmJiBzdG9yZS0+dmVyaWZ5X2NiKQotICAgICAgICBjdHgtPnZlcmlmeV9jYiA9IHN0b3JlLT52ZXJpZnlfY2I7Ci0gICAgZWxzZQotICAgICAgICBjdHgtPnZlcmlmeV9jYiA9IG51bGxfY2FsbGJhY2s7CisgIGlmIChzdG9yZSAmJiBzdG9yZS0+dmVyaWZ5X2NiKQorICAgIGN0eC0+dmVyaWZ5X2NiID0gc3RvcmUtPnZlcmlmeV9jYjsKKyAgZWxzZQorICAgIGN0eC0+dmVyaWZ5X2NiID0gbnVsbF9jYWxsYmFjazsKIAotICAgIGlmIChzdG9yZSAmJiBzdG9yZS0+dmVyaWZ5KQotICAgICAgICBjdHgtPnZlcmlmeSA9IHN0b3JlLT52ZXJpZnk7Ci0gICAgZWxzZQotICAgICAgICBjdHgtPnZlcmlmeSA9IGludGVybmFsX3ZlcmlmeTsKKyAgaWYgKHN0b3JlICYmIHN0b3JlLT52ZXJpZnkpCisgICAgY3R4LT52ZXJpZnkgPSBzdG9yZS0+dmVyaWZ5OworICBlbHNlCisgICAgY3R4LT52ZXJpZnkgPSBpbnRlcm5hbF92ZXJpZnk7CiAKLSAgICBpZiAoc3RvcmUgJiYgc3RvcmUtPmNoZWNrX3Jldm9jYXRpb24pCi0gICAgICAgIGN0eC0+Y2hlY2tfcmV2b2NhdGlvbiA9IHN0b3JlLT5jaGVja19yZXZvY2F0aW9uOwotICAgIGVsc2UKLSAgICAgICAgY3R4LT5jaGVja19yZXZvY2F0aW9uID0gY2hlY2tfcmV2b2NhdGlvbjsKKyAgaWYgKHN0b3JlICYmIHN0b3JlLT5jaGVja19yZXZvY2F0aW9uKQorICAgIGN0eC0+Y2hlY2tfcmV2b2NhdGlvbiA9IHN0b3JlLT5jaGVja19yZXZvY2F0aW9uOworICBlbHNlCisgICAgY3R4LT5jaGVja19yZXZvY2F0aW9uID0gY2hlY2tfcmV2b2NhdGlvbjsKIAotICAgIGlmIChzdG9yZSAmJiBzdG9yZS0+Z2V0X2NybCkKLSAgICAgICAgY3R4LT5nZXRfY3JsID0gc3RvcmUtPmdldF9jcmw7Ci0gICAgZWxzZQotICAgICAgICBjdHgtPmdldF9jcmwgPSBOVUxMOworICBpZiAoc3RvcmUgJiYgc3RvcmUtPmdldF9jcmwpCisgICAgY3R4LT5nZXRfY3JsID0gc3RvcmUtPmdldF9jcmw7CisgIGVsc2UKKyAgICBjdHgtPmdldF9jcmwgPSBOVUxMOwogCi0gICAgaWYgKHN0b3JlICYmIHN0b3JlLT5jaGVja19jcmwpCi0gICAgICAgIGN0eC0+Y2hlY2tfY3JsID0gc3RvcmUtPmNoZWNrX2NybDsKLSAgICBlbHNlCi0gICAgICAgIGN0eC0+Y2hlY2tfY3JsID0gY2hlY2tfY3JsOworICBpZiAoc3RvcmUgJiYgc3RvcmUtPmNoZWNrX2NybCkKKyAgICBjdHgtPmNoZWNrX2NybCA9IHN0b3JlLT5jaGVja19jcmw7CisgIGVsc2UKKyAgICBjdHgtPmNoZWNrX2NybCA9IGNoZWNrX2NybDsKIAotICAgIGlmIChzdG9yZSAmJiBzdG9yZS0+Y2VydF9jcmwpCi0gICAgICAgIGN0eC0+Y2VydF9jcmwgPSBzdG9yZS0+Y2VydF9jcmw7Ci0gICAgZWxzZQotICAgICAgICBjdHgtPmNlcnRfY3JsID0gY2VydF9jcmw7CisgIGlmIChzdG9yZSAmJiBzdG9yZS0+Y2VydF9jcmwpCisgICAgY3R4LT5jZXJ0X2NybCA9IHN0b3JlLT5jZXJ0X2NybDsKKyAgZWxzZQorICAgIGN0eC0+Y2VydF9jcmwgPSBjZXJ0X2NybDsKIAotICAgIGlmIChzdG9yZSAmJiBzdG9yZS0+bG9va3VwX2NlcnRzKQotICAgICAgICBjdHgtPmxvb2t1cF9jZXJ0cyA9IHN0b3JlLT5sb29rdXBfY2VydHM7Ci0gICAgZWxzZQotICAgICAgICBjdHgtPmxvb2t1cF9jZXJ0cyA9IFg1MDlfU1RPUkVfZ2V0MV9jZXJ0czsKKyAgaWYgKHN0b3JlICYmIHN0b3JlLT5sb29rdXBfY2VydHMpCisgICAgY3R4LT5sb29rdXBfY2VydHMgPSBzdG9yZS0+bG9va3VwX2NlcnRzOworICBlbHNlCisgICAgY3R4LT5sb29rdXBfY2VydHMgPSBYNTA5X1NUT1JFX2dldDFfY2VydHM7CiAKLSAgICBpZiAoc3RvcmUgJiYgc3RvcmUtPmxvb2t1cF9jcmxzKQotICAgICAgICBjdHgtPmxvb2t1cF9jcmxzID0gc3RvcmUtPmxvb2t1cF9jcmxzOwotICAgIGVsc2UKLSAgICAgICAgY3R4LT5sb29rdXBfY3JscyA9IFg1MDlfU1RPUkVfZ2V0MV9jcmxzOworICBpZiAoc3RvcmUgJiYgc3RvcmUtPmxvb2t1cF9jcmxzKQorICAgIGN0eC0+bG9va3VwX2NybHMgPSBzdG9yZS0+bG9va3VwX2NybHM7CisgIGVsc2UKKyAgICBjdHgtPmxvb2t1cF9jcmxzID0gWDUwOV9TVE9SRV9nZXQxX2NybHM7CiAKLSAgICBjdHgtPmNoZWNrX3BvbGljeSA9IGNoZWNrX3BvbGljeTsKKyAgY3R4LT5jaGVja19wb2xpY3kgPSBjaGVja19wb2xpY3k7CiAKLSAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDE7CiAKLSBlcnI6Ci0gICAgQ1JZUFRPX2ZyZWVfZXhfZGF0YSgmZ19leF9kYXRhX2NsYXNzLCBjdHgsICZjdHgtPmV4X2RhdGEpOwotICAgIGlmIChjdHgtPnBhcmFtICE9IE5VTEwpIHsKLSAgICAgICAgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShjdHgtPnBhcmFtKTsKLSAgICB9CitlcnI6CisgIENSWVBUT19mcmVlX2V4X2RhdGEoJmdfZXhfZGF0YV9jbGFzcywgY3R4LCAmY3R4LT5leF9kYXRhKTsKKyAgaWYgKGN0eC0+cGFyYW0gIT0gTlVMTCkgeworICAgIFg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoY3R4LT5wYXJhbSk7CisgIH0KIAotICAgIE9QRU5TU0xfbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKFg1MDlfU1RPUkVfQ1RYKSk7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwotICAgIHJldHVybiAwOworICBPUEVOU1NMX21lbXNldChjdHgsIDAsIHNpemVvZihYNTA5X1NUT1JFX0NUWCkpOworICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMjMzMCw5MyArMjI5OCw3OSBAQAogICogYXZvaWRzIFg1MDlfU1RPUkUgbmFzdGluZXNzIHdoZXJlIGl0IGlzbid0IG5lZWRlZC4KICAqLwogCi12b2lkIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKnNrKQotewotICAgIGN0eC0+b3RoZXJfY3R4ID0gc2s7Ci0gICAgY3R4LT5nZXRfaXNzdWVyID0gZ2V0X2lzc3Vlcl9zazsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfdHJ1c3RlZF9zdGFjayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqIHNrKSB7CisgIGN0eC0+b3RoZXJfY3R4ID0gc2s7CisgIGN0eC0+Z2V0X2lzc3VlciA9IGdldF9pc3N1ZXJfc2s7CiB9CiAKLXZvaWQgWDUwOV9TVE9SRV9DVFhfY2xlYW51cChYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIC8qIFdlIG5lZWQgdG8gYmUgaWRlbXBvdGVudCBiZWNhdXNlLCB1bmZvcnR1bmF0ZWx5LCB8WDUwOV9TVE9SRV9DVFhfZnJlZXwKLSAgICAgKiBhbHNvIGNhbGxzIHRoaXMgZnVuY3Rpb24uICovCi0gICAgaWYgKGN0eC0+Y2xlYW51cCAhPSBOVUxMKSB7Ci0gICAgICAgIGN0eC0+Y2xlYW51cChjdHgpOwotICAgICAgICBjdHgtPmNsZWFudXAgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoY3R4LT5wYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChjdHgtPnBhcmVudCA9PSBOVUxMKQotICAgICAgICAgICAgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShjdHgtPnBhcmFtKTsKLSAgICAgICAgY3R4LT5wYXJhbSA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChjdHgtPnRyZWUgIT0gTlVMTCkgewotICAgICAgICBYNTA5X3BvbGljeV90cmVlX2ZyZWUoY3R4LT50cmVlKTsKLSAgICAgICAgY3R4LT50cmVlID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGN0eC0+Y2hhaW4gIT0gTlVMTCkgewotICAgICAgICBza19YNTA5X3BvcF9mcmVlKGN0eC0+Y2hhaW4sIFg1MDlfZnJlZSk7Ci0gICAgICAgIGN0eC0+Y2hhaW4gPSBOVUxMOwotICAgIH0KLSAgICBDUllQVE9fZnJlZV9leF9kYXRhKCZnX2V4X2RhdGFfY2xhc3MsIGN0eCwgJihjdHgtPmV4X2RhdGEpKTsKLSAgICBPUEVOU1NMX21lbXNldCgmY3R4LT5leF9kYXRhLCAwLCBzaXplb2YoQ1JZUFRPX0VYX0RBVEEpKTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfY2xlYW51cChYNTA5X1NUT1JFX0NUWCAqY3R4KSB7CisgIC8qIFdlIG5lZWQgdG8gYmUgaWRlbXBvdGVudCBiZWNhdXNlLCB1bmZvcnR1bmF0ZWx5LCB8WDUwOV9TVE9SRV9DVFhfZnJlZXwKKyAgICogYWxzbyBjYWxscyB0aGlzIGZ1bmN0aW9uLiAqLworICBpZiAoY3R4LT5jbGVhbnVwICE9IE5VTEwpIHsKKyAgICBjdHgtPmNsZWFudXAoY3R4KTsKKyAgICBjdHgtPmNsZWFudXAgPSBOVUxMOworICB9CisgIGlmIChjdHgtPnBhcmFtICE9IE5VTEwpIHsKKyAgICBpZiAoY3R4LT5wYXJlbnQgPT0gTlVMTCkKKyAgICAgIFg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoY3R4LT5wYXJhbSk7CisgICAgY3R4LT5wYXJhbSA9IE5VTEw7CisgIH0KKyAgaWYgKGN0eC0+dHJlZSAhPSBOVUxMKSB7CisgICAgWDUwOV9wb2xpY3lfdHJlZV9mcmVlKGN0eC0+dHJlZSk7CisgICAgY3R4LT50cmVlID0gTlVMTDsKKyAgfQorICBpZiAoY3R4LT5jaGFpbiAhPSBOVUxMKSB7CisgICAgc2tfWDUwOV9wb3BfZnJlZShjdHgtPmNoYWluLCBYNTA5X2ZyZWUpOworICAgIGN0eC0+Y2hhaW4gPSBOVUxMOworICB9CisgIENSWVBUT19mcmVlX2V4X2RhdGEoJmdfZXhfZGF0YV9jbGFzcywgY3R4LCAmKGN0eC0+ZXhfZGF0YSkpOworICBPUEVOU1NMX21lbXNldCgmY3R4LT5leF9kYXRhLCAwLCBzaXplb2YoQ1JZUFRPX0VYX0RBVEEpKTsKIH0KIAotdm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGRlcHRoKQotewotICAgIFg1MDlfVkVSSUZZX1BBUkFNX3NldF9kZXB0aChjdHgtPnBhcmFtLCBkZXB0aCk7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9kZXB0aChYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgZGVwdGgpIHsKKyAgWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKGN0eC0+cGFyYW0sIGRlcHRoKTsKIH0KIAotdm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgICBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZmxhZ3MoY3R4LT5wYXJhbSwgZmxhZ3MpOwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncykgeworICBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZmxhZ3MoY3R4LT5wYXJhbSwgZmxhZ3MpOwogfQogCiB2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF90aW1lKFg1MDlfU1RPUkVfQ1RYICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCB0KQotewotICAgIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKGN0eC0+cGFyYW0sIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX3BvcnRfdGltZV90IHQpIHsKKyAgWDUwOV9WRVJJRllfUEFSQU1fc2V0X3RpbWUoY3R4LT5wYXJhbSwgdCk7CiB9CiAKLVg1MDkgKlg1MDlfU1RPUkVfQ1RYX2dldDBfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHJldHVybiBjdHgtPmNlcnQ7Ci19CitYNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXQwX2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCkgeyByZXR1cm4gY3R4LT5jZXJ0OyB9CiAKIHZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X3ZlcmlmeV9jYihYNTA5X1NUT1JFX0NUWCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKnZlcmlmeV9jYikgKGludCwgWDUwOV9TVE9SRV9DVFggKikpCi17Ci0gICAgY3R4LT52ZXJpZnlfY2IgPSB2ZXJpZnlfY2I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqdmVyaWZ5X2NiKShpbnQsIFg1MDlfU1RPUkVfQ1RYICopKSB7CisgIGN0eC0+dmVyaWZ5X2NiID0gdmVyaWZ5X2NiOwogfQogCi1YNTA5X1BPTElDWV9UUkVFICpYNTA5X1NUT1JFX0NUWF9nZXQwX3BvbGljeV90cmVlKFg1MDlfU1RPUkVfQ1RYICpjdHgpCi17Ci0gICAgcmV0dXJuIGN0eC0+dHJlZTsKK1g1MDlfUE9MSUNZX1RSRUUgKlg1MDlfU1RPUkVfQ1RYX2dldDBfcG9saWN5X3RyZWUoWDUwOV9TVE9SRV9DVFggKmN0eCkgeworICByZXR1cm4gY3R4LT50cmVlOwogfQogCi1pbnQgWDUwOV9TVE9SRV9DVFhfZ2V0X2V4cGxpY2l0X3BvbGljeShYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHJldHVybiBjdHgtPmV4cGxpY2l0X3BvbGljeTsKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXhwbGljaXRfcG9saWN5KFg1MDlfU1RPUkVfQ1RYICpjdHgpIHsKKyAgcmV0dXJuIGN0eC0+ZXhwbGljaXRfcG9saWN5OwogfQogCi1pbnQgWDUwOV9TVE9SRV9DVFhfc2V0X2RlZmF1bHQoWDUwOV9TVE9SRV9DVFggKmN0eCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07Ci0gICAgcGFyYW0gPSBYNTA5X1ZFUklGWV9QQVJBTV9sb29rdXAobmFtZSk7Ci0gICAgaWYgKCFwYXJhbSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoY3R4LT5wYXJhbSwgcGFyYW0pOworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9kZWZhdWx0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtOworICBwYXJhbSA9IFg1MDlfVkVSSUZZX1BBUkFNX2xvb2t1cChuYW1lKTsKKyAgaWYgKCFwYXJhbSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoY3R4LT5wYXJhbSwgcGFyYW0pOwogfQogCi1YNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJhbShYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIHJldHVybiBjdHgtPnBhcmFtOworWDUwOV9WRVJJRllfUEFSQU0gKlg1MDlfU1RPUkVfQ1RYX2dldDBfcGFyYW0oWDUwOV9TVE9SRV9DVFggKmN0eCkgeworICByZXR1cm4gY3R4LT5wYXJhbTsKIH0KIAotdm9pZCBYNTA5X1NUT1JFX0NUWF9zZXQwX3BhcmFtKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSkKLXsKLSAgICBpZiAoY3R4LT5wYXJhbSkKLSAgICAgICAgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShjdHgtPnBhcmFtKTsKLSAgICBjdHgtPnBhcmFtID0gcGFyYW07Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldDBfcGFyYW0oWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKSB7CisgIGlmIChjdHgtPnBhcmFtKQorICAgIFg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoY3R4LT5wYXJhbSk7CisgIGN0eC0+cGFyYW0gPSBwYXJhbTsKIH0KIAogSU1QTEVNRU5UX0FTTjFfU0VUX09GKFg1MDkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94NTA5X3ZwbS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkveDUwOV92cG0uYwppbmRleCA4NGVjODM4Li4wZGE4NjM1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94NTA5X3ZwbS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L3g1MDlfdnBtLmMKQEAgLTQwMyw3ICs0MDMsNyBAQAogICAgIHBhcmFtLT5kZXB0aCA9IGRlcHRoOwogfQogCi12b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgdGltZV90IHQpCit2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgT1BFTlNTTF9wb3J0X3RpbWVfdCB0KQogewogICAgIHBhcmFtLT5jaGVja190aW1lID0gdDsKICAgICBwYXJhbS0+ZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfVVNFX0NIRUNLX1RJTUU7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94NTA5bmFtZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkveDUwOW5hbWUuYwppbmRleCBmYTYyMWYyLi5kNjY4M2Y2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94NTA5bmFtZS5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L3g1MDluYW1lLmMKQEAgLTU0LDggKzU0LDExIEBACiAgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCiAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXSAqLwogCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxzdHJpbmcuaD4KLQorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvY3J5cHRvL3g1MDkveF9hbGwuYwppbmRleCAyYTkzYjg3Li5hOWQ2YWFlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5L3hfYWxsLmMKQEAgLTQ1MywxOSArNDUzLDcgQEAKIHsKICAgICByZXR1cm4gQVNOMV9kMmlfZnBfb2YoRVZQX1BLRVksIEVWUF9QS0VZX25ldywgZDJpX1BVQktFWSwgZnAsIGEpOwogfQotCi1QS0NTOF9QUklWX0tFWV9JTkZPICpkMmlfUEtDUzhfUFJJVl9LRVlfSU5GT19iaW8oQklPICpicCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9QUklWX0tFWV9JTkZPICoqcDhpbmYpCi17Ci0gICAgcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihQS0NTOF9QUklWX0tFWV9JTkZPLCBQS0NTOF9QUklWX0tFWV9JTkZPX25ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPLCBicCwgcDhpbmYpOwotfQotCi1pbnQgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKEJJTyAqYnAsIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKQotewotICAgIHJldHVybiBBU04xX2kyZF9iaW9fb2YoUEtDUzhfUFJJVl9LRVlfSU5GTywgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk8sIGJwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcDhpbmYpOwotfQorI2VuZGlmCiAKIGludCBpMmRfUEtDUzhQcml2YXRlS2V5SW5mb19iaW8oQklPICpicCwgRVZQX1BLRVkgKmtleSkKIHsKQEAgLTQ3OCw3ICs0NjYsMTggQEAKICAgICBQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDhpbmYpOwogICAgIHJldHVybiByZXQ7CiB9Ci0jZW5kaWYKKworaW50IGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPX2JpbyhCSU8gKmJwLCBQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZikKK3sKKyAgICByZXR1cm4gQVNOMV9pMmRfYmlvX29mKFBLQ1M4X1BSSVZfS0VZX0lORk8sIGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPLCBicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4aW5mKTsKK30KKworUEtDUzhfUFJJVl9LRVlfSU5GTyAqZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKEJJTyAqYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUFJJVl9LRVlfSU5GTyAqKnA4aW5mKSB7CisgIHJldHVybiBBU04xX2QyaV9iaW9fb2YoUEtDUzhfUFJJVl9LRVlfSU5GTywgUEtDUzhfUFJJVl9LRVlfSU5GT19uZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8sIGJwLCBwOGluZik7Cit9CiAKIGludCBpMmRfUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRVZQX1BLRVkgKnBrZXkpCiB7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9jcnlwdG8veDUwOXYzL2V4dF9kYXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5djMvZXh0X2RhdC5oCmluZGV4IGE2Y2E0NWIuLjFkNDdlYTYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5djMvZXh0X2RhdC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2NyeXB0by94NTA5djMvZXh0X2RhdC5oCkBAIC04Miw4ICs4MiwxMCBAQAogICogb2YgdGhlIGV4dF9uaWQgdmFsdWVzLgogICovCiAKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApCiAvKiBUT0RPKGZvcmspOiBPQ1NQIHN1cHBvcnQgKi8KICNkZWZpbmUgT1BFTlNTTF9OT19PQ1NQCisjZW5kaWYKIAogc3RhdGljIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICpjb25zdCBzdGFuZGFyZF9leHRzW10gPSB7CiAgICAgJnYzX25zY2VydCwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2Vycl9kYXRhLmMgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9lcnJfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZGM3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9lcnJfZGF0YS5jCkBAIC0wLDAgKzEsMTM0MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisgLyogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgZXJyX2RhdGFfZ2VuZXJhdGUuZ28uICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdHlwZV9jaGVjay5oPgorCisKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9OT05FID09IDEsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMSk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfU1lTID09IDIsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMik7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfQk4gPT0gMywgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8zKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9SU0EgPT0gNCwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF80KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9ESCA9PSA1LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzUpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0VWUCA9PSA2LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzYpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0JVRiA9PSA3LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzcpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX09CSiA9PSA4LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzgpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1BFTSA9PSA5LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzkpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0RTQSA9PSAxMCwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xMCk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfWDUwOSA9PSAxMSwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xMSk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfQVNOMSA9PSAxMiwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xMik7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfQ09ORiA9PSAxMywgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xMyk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfQ1JZUFRPID09IDE0LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzE0KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9FQyA9PSAxNSwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xNSk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfU1NMID09IDE2LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzE2KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9CSU8gPT0gMTcsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMTcpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1BLQ1M3ID09IDE4LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzE4KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9QS0NTOCA9PSAxOSwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8xOSk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfWDUwOVYzID09IDIwLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzIwKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9SQU5EID09IDIxLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzIxKTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9FTkdJTkUgPT0gMjIsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMjIpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX09DU1AgPT0gMjMsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMjMpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1VJID09IDI0LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzI0KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9DT01QID09IDI1LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzI1KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9FQ0RTQSA9PSAyNiwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8yNik7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfRUNESCA9PSAyNywgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8yNyk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfSE1BQyA9PSAyOCwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF8yOCk7CitPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9MSUJfRElHRVNUID09IDI5LCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXzI5KTsKK09QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX0xJQl9DSVBIRVIgPT0gMzAsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzApOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX0hLREYgPT0gMzEsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzEpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCX1VTRVIgPT0gMzIsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfMzIpOworT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTlVNX0xJQlMgPT0gMzMsIGxpYnJhcnlfdmFsdWVzX2NoYW5nZWRfbnVtKTsKKworY29uc3QgdWludDMyX3Qga09wZW5TU0xSZWFzb25WYWx1ZXNbXSA9IHsKKyAgICAweGMzMjA4MzgsCisgICAgMHhjMzI4ODUyLAorICAgIDB4YzMzMDg2MSwKKyAgICAweGMzMzg4NzEsCisgICAgMHhjMzQwODgwLAorICAgIDB4YzM0ODg5OSwKKyAgICAweGMzNTA4YTUsCisgICAgMHhjMzU4OGMyLAorICAgIDB4YzM2MDhlMiwKKyAgICAweGMzNjg4ZjAsCisgICAgMHhjMzcwOTAwLAorICAgIDB4YzM3ODkwZCwKKyAgICAweGMzODA5MWQsCisgICAgMHhjMzg4OTI4LAorICAgIDB4YzM5MDkzZSwKKyAgICAweGMzOTg5NGQsCisgICAgMHhjM2EwOTYxLAorICAgIDB4YzNhODg0NSwKKyAgICAweGMzYjAwZWEsCisgICAgMHhjM2I4OGQ0LAorICAgIDB4MTAzMjA4NDUsCisgICAgMHgxMDMyOTUxMywKKyAgICAweDEwMzMxNTFmLAorICAgIDB4MTAzMzk1MzgsCisgICAgMHgxMDM0MTU0YiwKKyAgICAweDEwMzQ4ZWVkLAorICAgIDB4MTAzNTBjNWUsCisgICAgMHgxMDM1OTU1ZSwKKyAgICAweDEwMzYxNTczLAorICAgIDB4MTAzNjk1ODYsCisgICAgMHgxMDM3MTVhNSwKKyAgICAweDEwMzc5NWJlLAorICAgIDB4MTAzODE1ZDMsCisgICAgMHgxMDM4OTVmMSwKKyAgICAweDEwMzkxNjAwLAorICAgIDB4MTAzOTk2MWMsCisgICAgMHgxMDNhMTYzNywKKyAgICAweDEwM2E5NjQ2LAorICAgIDB4MTAzYjE2NjIsCisgICAgMHgxMDNiOTY3ZCwKKyAgICAweDEwM2MxNjk0LAorICAgIDB4MTAzYzgwZWEsCisgICAgMHgxMDNkMTZhNSwKKyAgICAweDEwM2Q5NmI5LAorICAgIDB4MTAzZTE2ZDgsCisgICAgMHgxMDNlOTZlNywKKyAgICAweDEwM2YxNmZlLAorICAgIDB4MTAzZjk3MTEsCisgICAgMHgxMDQwMGMyMiwKKyAgICAweDEwNDA5NzI0LAorICAgIDB4MTA0MTE3NDIsCisgICAgMHgxMDQxOTc1NSwKKyAgICAweDEwNDIxNzZmLAorICAgIDB4MTA0Mjk3N2YsCisgICAgMHgxMDQzMTc5MywKKyAgICAweDEwNDM5N2E5LAorICAgIDB4MTA0NDE3YzEsCisgICAgMHgxMDQ0OTdkNiwKKyAgICAweDEwNDUxN2VhLAorICAgIDB4MTA0NTk3ZmMsCisgICAgMHgxMDQ2MDVmYiwKKyAgICAweDEwNDY4OTRkLAorICAgIDB4MTA0NzE4MTEsCisgICAgMHgxMDQ3OTgyOCwKKyAgICAweDEwNDgxODNkLAorICAgIDB4MTA0ODk4NGIsCisgICAgMHgxMDQ5MGU0ZiwKKyAgICAweDE0MzIwYzA1LAorICAgIDB4MTQzMjhjMTMsCisgICAgMHgxNDMzMGMyMiwKKyAgICAweDE0MzM4YzM0LAorICAgIDB4MTQzNDAwYWMsCisgICAgMHgxNDM0ODBlYSwKKyAgICAweDE4MzIwMDgzLAorICAgIDB4MTgzMjhmNDMsCisgICAgMHgxODMzMDBhYywKKyAgICAweDE4MzM4ZjU5LAorICAgIDB4MTgzNDBmNmQsCisgICAgMHgxODM0ODBlYSwKKyAgICAweDE4MzUwZjgyLAorICAgIDB4MTgzNThmOWEsCisgICAgMHgxODM2MGZhZiwKKyAgICAweDE4MzY4ZmMzLAorICAgIDB4MTgzNzBmZTcsCisgICAgMHgxODM3OGZmZCwKKyAgICAweDE4MzgxMDExLAorICAgIDB4MTgzODkwMjEsCisgICAgMHgxODM5MGE3MywKKyAgICAweDE4Mzk5MDMxLAorICAgIDB4MTgzYTEwNTksCisgICAgMHgxODNhOTA3ZiwKKyAgICAweDE4M2IwYzZhLAorICAgIDB4MTgzYjkwYjQsCisgICAgMHgxODNjMTBjNiwKKyAgICAweDE4M2M5MGQxLAorICAgIDB4MTgzZDEwZTEsCisgICAgMHgxODNkOTBmMiwKKyAgICAweDE4M2UxMTAzLAorICAgIDB4MTgzZTkxMTUsCisgICAgMHgxODNmMTEzZSwKKyAgICAweDE4M2Y5MTU3LAorICAgIDB4MTg0MDExNmYsCisgICAgMHgxODQwODZkMywKKyAgICAweDE4NDExMGEyLAorICAgIDB4MTg0MTkwNmQsCisgICAgMHgxODQyMTA4YywKKyAgICAweDE4NDI5MDQ2LAorICAgIDB4MjAzMjExOTYsCisgICAgMHgyNDMyMTFhMiwKKyAgICAweDI0MzI4OTkzLAorICAgIDB4MjQzMzExYjQsCisgICAgMHgyNDMzOTFjMSwKKyAgICAweDI0MzQxMWNlLAorICAgIDB4MjQzNDkxZTAsCisgICAgMHgyNDM1MTFlZiwKKyAgICAweDI0MzU5MjBjLAorICAgIDB4MjQzNjEyMTksCisgICAgMHgyNDM2OTIyNywKKyAgICAweDI0MzcxMjM1LAorICAgIDB4MjQzNzkyNDMsCisgICAgMHgyNDM4MTI0YywKKyAgICAweDI0Mzg5MjU5LAorICAgIDB4MjQzOTEyNmMsCisgICAgMHgyODMyMGM1MiwKKyAgICAweDI4MzI4YzZhLAorICAgIDB4MjgzMzBjMjIsCisgICAgMHgyODMzOGM3ZCwKKyAgICAweDI4MzQwYzVlLAorICAgIDB4MjgzNDgwYWMsCisgICAgMHgyODM1MDBlYSwKKyAgICAweDJjMzIyYzMwLAorICAgIDB4MmMzMjkyODMsCisgICAgMHgyYzMzMmMzZSwKKyAgICAweDJjMzNhYzUwLAorICAgIDB4MmMzNDJjNjQsCisgICAgMHgyYzM0YWM3NiwKKyAgICAweDJjMzUyYzkxLAorICAgIDB4MmMzNWFjYTMsCisgICAgMHgyYzM2MmNiNiwKKyAgICAweDJjMzY4MzJkLAorICAgIDB4MmMzNzJjYzMsCisgICAgMHgyYzM3YWNkNSwKKyAgICAweDJjMzgyY2ZhLAorICAgIDB4MmMzOGFkMTEsCisgICAgMHgyYzM5MmQxZiwKKyAgICAweDJjMzlhZDJmLAorICAgIDB4MmMzYTJkNDEsCisgICAgMHgyYzNhYWQ1NSwKKyAgICAweDJjM2IyZDY2LAorICAgIDB4MmMzYmFkODUsCisgICAgMHgyYzNjMTI5NSwKKyAgICAweDJjM2M5MmFiLAorICAgIDB4MmMzZDJkOTksCisgICAgMHgyYzNkOTJjNCwKKyAgICAweDJjM2UyZGI2LAorICAgIDB4MmMzZWFkYzQsCisgICAgMHgyYzNmMmRkYywKKyAgICAweDJjM2ZhZGY0LAorICAgIDB4MmM0MDJlMDEsCisgICAgMHgyYzQwOTE5NiwKKyAgICAweDJjNDEyZTEyLAorICAgIDB4MmM0MWFlMjUsCisgICAgMHgyYzQyMTE2ZiwKKyAgICAweDJjNDJhZTM2LAorICAgIDB4MmM0MzA3MjAsCisgICAgMHgyYzQzYWQ3NywKKyAgICAweDJjNDQyY2U4LAorICAgIDB4MzAzMjAwMDAsCisgICAgMHgzMDMyODAxNSwKKyAgICAweDMwMzMwMDFmLAorICAgIDB4MzAzMzgwMzgsCisgICAgMHgzMDM0MDA0YSwKKyAgICAweDMwMzQ4MDY0LAorICAgIDB4MzAzNTAwNmIsCisgICAgMHgzMDM1ODA4MywKKyAgICAweDMwMzYwMDk0LAorICAgIDB4MzAzNjgwYWMsCisgICAgMHgzMDM3MDBiOSwKKyAgICAweDMwMzc4MGM4LAorICAgIDB4MzAzODAwZWEsCisgICAgMHgzMDM4ODBmNywKKyAgICAweDMwMzkwMTBhLAorICAgIDB4MzAzOTgxMjUsCisgICAgMHgzMDNhMDEzYSwKKyAgICAweDMwM2E4MTRlLAorICAgIDB4MzAzYjAxNjIsCisgICAgMHgzMDNiODE3MywKKyAgICAweDMwM2MwMThjLAorICAgIDB4MzAzYzgxYTksCisgICAgMHgzMDNkMDFiNywKKyAgICAweDMwM2Q4MWNiLAorICAgIDB4MzAzZTAxZGIsCisgICAgMHgzMDNlODFmNCwKKyAgICAweDMwM2YwMjA0LAorICAgIDB4MzAzZjgyMTcsCisgICAgMHgzMDQwMDIyNiwKKyAgICAweDMwNDA4MjMyLAorICAgIDB4MzA0MTAyNDcsCisgICAgMHgzMDQxODI1NywKKyAgICAweDMwNDIwMjZlLAorICAgIDB4MzA0MjgyN2IsCisgICAgMHgzMDQzMDI4ZSwKKyAgICAweDMwNDM4MjlkLAorICAgIDB4MzA0NDAyYjIsCisgICAgMHgzMDQ0ODJkMywKKyAgICAweDMwNDUwMmU2LAorICAgIDB4MzA0NTgyZjksCisgICAgMHgzMDQ2MDMxMiwKKyAgICAweDMwNDY4MzJkLAorICAgIDB4MzA0NzAzNGEsCisgICAgMHgzMDQ3ODM2MywKKyAgICAweDMwNDgwMzcxLAorICAgIDB4MzA0ODgzODIsCisgICAgMHgzMDQ5MDM5MSwKKyAgICAweDMwNDk4M2E5LAorICAgIDB4MzA0YTAzYmIsCisgICAgMHgzMDRhODNjZiwKKyAgICAweDMwNGIwM2VlLAorICAgIDB4MzA0Yjg0MDEsCisgICAgMHgzMDRjMDQwYywKKyAgICAweDMwNGM4NDFkLAorICAgIDB4MzA0ZDA0MjksCisgICAgMHgzMDRkODQzZiwKKyAgICAweDMwNGUwNDRkLAorICAgIDB4MzA0ZTg0NjMsCisgICAgMHgzMDRmMDQ3NSwKKyAgICAweDMwNGY4NDg3LAorICAgIDB4MzA1MDA0OWEsCisgICAgMHgzMDUwODRhZCwKKyAgICAweDMwNTEwNGJlLAorICAgIDB4MzA1MTg0Y2UsCisgICAgMHgzMDUyMDRlNiwKKyAgICAweDMwNTI4NGZiLAorICAgIDB4MzA1MzA1MTMsCisgICAgMHgzMDUzODUyNywKKyAgICAweDMwNTQwNTNmLAorICAgIDB4MzA1NDg1NTgsCisgICAgMHgzMDU1MDU3MSwKKyAgICAweDMwNTU4NThlLAorICAgIDB4MzA1NjA1OTksCisgICAgMHgzMDU2ODViMSwKKyAgICAweDMwNTcwNWMxLAorICAgIDB4MzA1Nzg1ZDIsCisgICAgMHgzMDU4MDVlNSwKKyAgICAweDMwNTg4NWZiLAorICAgIDB4MzA1OTA2MDQsCisgICAgMHgzMDU5ODYxOSwKKyAgICAweDMwNWEwNjJjLAorICAgIDB4MzA1YTg2M2IsCisgICAgMHgzMDViMDY1YiwKKyAgICAweDMwNWI4NjZhLAorICAgIDB4MzA1YzA2OGIsCisgICAgMHgzMDVjODZhNywKKyAgICAweDMwNWQwNmIzLAorICAgIDB4MzA1ZDg2ZDMsCisgICAgMHgzMDVlMDZlZiwKKyAgICAweDMwNWU4NzAwLAorICAgIDB4MzA1ZjA3MTYsCisgICAgMHgzMDVmODcyMCwKKyAgICAweDM0MzIwYjYzLAorICAgIDB4MzQzMjhiNzcsCisgICAgMHgzNDMzMGI5NCwKKyAgICAweDM0MzM4YmE3LAorICAgIDB4MzQzNDBiYjYsCisgICAgMHgzNDM0OGJlZiwKKyAgICAweDM0MzUwYmQzLAorICAgIDB4M2MzMjAwODMsCisgICAgMHgzYzMyOGNhNywKKyAgICAweDNjMzMwY2MwLAorICAgIDB4M2MzMzhjZGIsCisgICAgMHgzYzM0MGNmOCwKKyAgICAweDNjMzQ4ZDIyLAorICAgIDB4M2MzNTBkM2QsCisgICAgMHgzYzM1OGQ2MywKKyAgICAweDNjMzYwZDdjLAorICAgIDB4M2MzNjhkOTQsCisgICAgMHgzYzM3MGRhNSwKKyAgICAweDNjMzc4ZGIzLAorICAgIDB4M2MzODBkYzAsCisgICAgMHgzYzM4OGRkNCwKKyAgICAweDNjMzkwYzZhLAorICAgIDB4M2MzOThkZTgsCisgICAgMHgzYzNhMGRmYywKKyAgICAweDNjM2E4OTBkLAorICAgIDB4M2MzYjBlMGMsCisgICAgMHgzYzNiOGUyNywKKyAgICAweDNjM2MwZTM5LAorICAgIDB4M2MzYzhlNmMsCisgICAgMHgzYzNkMGU3NiwKKyAgICAweDNjM2Q4ZThhLAorICAgIDB4M2MzZTBlOTgsCisgICAgMHgzYzNlOGViZCwKKyAgICAweDNjM2YwYzkzLAorICAgIDB4M2MzZjhlYTYsCisgICAgMHgzYzQwMDBhYywKKyAgICAweDNjNDA4MGVhLAorICAgIDB4M2M0MTBkMTMsCisgICAgMHgzYzQxOGQ1MiwKKyAgICAweDNjNDIwZTRmLAorICAgIDB4NDAzMjE4YTQsCisgICAgMHg0MDMyOThiYSwKKyAgICAweDQwMzMxOGU4LAorICAgIDB4NDAzMzk4ZjIsCisgICAgMHg0MDM0MTkwOSwKKyAgICAweDQwMzQ5OTI3LAorICAgIDB4NDAzNTE5MzcsCisgICAgMHg0MDM1OTk0OSwKKyAgICAweDQwMzYxOTU2LAorICAgIDB4NDAzNjk5NjIsCisgICAgMHg0MDM3MTk3NywKKyAgICAweDQwMzc5OTg5LAorICAgIDB4NDAzODE5OTQsCisgICAgMHg0MDM4OTlhNiwKKyAgICAweDQwMzkwZWVkLAorICAgIDB4NDAzOTk5YjYsCisgICAgMHg0MDNhMTljOSwKKyAgICAweDQwM2E5OWVhLAorICAgIDB4NDAzYjE5ZmIsCisgICAgMHg0MDNiOWEwYiwKKyAgICAweDQwM2MwMDY0LAorICAgIDB4NDAzYzgwODMsCisgICAgMHg0MDNkMWE4ZiwKKyAgICAweDQwM2Q5YWE1LAorICAgIDB4NDAzZTFhYjQsCisgICAgMHg0MDNlOWFlYywKKyAgICAweDQwM2YxYjA2LAorICAgIDB4NDAzZjliMTQsCisgICAgMHg0MDQwMWIyOSwKKyAgICAweDQwNDA5YjNkLAorICAgIDB4NDA0MTFiNWEsCisgICAgMHg0MDQxOWI3NSwKKyAgICAweDQwNDIxYjhlLAorICAgIDB4NDA0MjliYTEsCisgICAgMHg0MDQzMWJiNSwKKyAgICAweDQwNDM5YmNkLAorICAgIDB4NDA0NDFiZTQsCisgICAgMHg0MDQ0ODBhYywKKyAgICAweDQwNDUxYmY5LAorICAgIDB4NDA0NTljMGIsCisgICAgMHg0MDQ2MWMyZiwKKyAgICAweDQwNDY5YzRmLAorICAgIDB4NDA0NzFjNWQsCisgICAgMHg0MDQ3OWM4NCwKKyAgICAweDQwNDgxY2MxLAorICAgIDB4NDA0ODljZGEsCisgICAgMHg0MDQ5MWNmMSwKKyAgICAweDQwNDk5ZDBiLAorICAgIDB4NDA0YTFkMjIsCisgICAgMHg0MDRhOWQ0MCwKKyAgICAweDQwNGIxZDU4LAorICAgIDB4NDA0YjlkNmYsCisgICAgMHg0MDRjMWQ4NSwKKyAgICAweDQwNGM5ZDk3LAorICAgIDB4NDA0ZDFkYjgsCisgICAgMHg0MDRkOWRkYSwKKyAgICAweDQwNGUxZGVlLAorICAgIDB4NDA0ZTlkZmIsCisgICAgMHg0MDRmMWUyOCwKKyAgICAweDQwNGY5ZTUxLAorICAgIDB4NDA1MDFlOGMsCisgICAgMHg0MDUwOWVhMCwKKyAgICAweDQwNTExZWJiLAorICAgIDB4NDA1MjFlY2IsCisgICAgMHg0MDUyOWVlZiwKKyAgICAweDQwNTMxZjA3LAorICAgIDB4NDA1MzlmMWEsCisgICAgMHg0MDU0MWYyZiwKKyAgICAweDQwNTQ5ZjUyLAorICAgIDB4NDA1NTFmNjAsCisgICAgMHg0MDU1OWY3ZCwKKyAgICAweDQwNTYxZjhhLAorICAgIDB4NDA1NjlmYTMsCisgICAgMHg0MDU3MWZiYiwKKyAgICAweDQwNTc5ZmNlLAorICAgIDB4NDA1ODFmZTMsCisgICAgMHg0MDU4YTAwYSwKKyAgICAweDQwNTkyMDM5LAorICAgIDB4NDA1OWEwNjYsCisgICAgMHg0MDVhMjA3YSwKKyAgICAweDQwNWFhMDhhLAorICAgIDB4NDA1YjIwYTIsCisgICAgMHg0MDViYTBiMywKKyAgICAweDQwNWMyMGM2LAorICAgIDB4NDA1Y2ExMDUsCisgICAgMHg0MDVkMjExMiwKKyAgICAweDQwNWRhMTI5LAorICAgIDB4NDA1ZTIxNjcsCisgICAgMHg0MDVlOGFiMSwKKyAgICAweDQwNWYyMTg4LAorICAgIDB4NDA1ZmExOTUsCisgICAgMHg0MDYwMjFhMywKKyAgICAweDQwNjBhMWM1LAorICAgIDB4NDA2MTIyMDksCisgICAgMHg0MDYxYTI0MSwKKyAgICAweDQwNjIyMjU4LAorICAgIDB4NDA2MmEyNjksCisgICAgMHg0MDYzMjI3YSwKKyAgICAweDQwNjNhMjhmLAorICAgIDB4NDA2NDIyYTYsCisgICAgMHg0MDY0YTJkMiwKKyAgICAweDQwNjUyMmVkLAorICAgIDB4NDA2NWEzMDQsCisgICAgMHg0MDY2MjMxYywKKyAgICAweDQwNjZhMzQ2LAorICAgIDB4NDA2NzIzNzEsCisgICAgMHg0MDY3YTM5MiwKKyAgICAweDQwNjgyM2I5LAorICAgIDB4NDA2OGEzZGEsCisgICAgMHg0MDY5MjQwYywKKyAgICAweDQwNjlhNDNhLAorICAgIDB4NDA2YTI0NWIsCisgICAgMHg0MDZhYTQ3YiwKKyAgICAweDQwNmIyNjAzLAorICAgIDB4NDA2YmE2MjYsCisgICAgMHg0MDZjMjYzYywKKyAgICAweDQwNmNhOGI3LAorICAgIDB4NDA2ZDI4ZTYsCisgICAgMHg0MDZkYTkwZSwKKyAgICAweDQwNmUyOTNjLAorICAgIDB4NDA2ZWE5ODksCisgICAgMHg0MDZmMjlhOCwKKyAgICAweDQwNmZhOWUwLAorICAgIDB4NDA3MDI5ZjMsCisgICAgMHg0MDcwYWExMCwKKyAgICAweDQwNzEwODAwLAorICAgIDB4NDA3MWFhMjIsCisgICAgMHg0MDcyMmEzNSwKKyAgICAweDQwNzJhYTRlLAorICAgIDB4NDA3MzJhNjYsCisgICAgMHg0MDczOTQ4MiwKKyAgICAweDQwNzQyYTdhLAorICAgIDB4NDA3NGFhOTQsCisgICAgMHg0MDc1MmFhNSwKKyAgICAweDQwNzVhYWI5LAorICAgIDB4NDA3NjJhYzcsCisgICAgMHg0MDc2OTI1OSwKKyAgICAweDQwNzcyYWVjLAorICAgIDB4NDA3N2FiMGUsCisgICAgMHg0MDc4MmIyOSwKKyAgICAweDQwNzhhYjYyLAorICAgIDB4NDA3OTJiNzksCisgICAgMHg0MDc5YWI4ZiwKKyAgICAweDQwN2EyYjliLAorICAgIDB4NDA3YWFiYWUsCisgICAgMHg0MDdiMmJjMywKKyAgICAweDQwN2JhYmQ1LAorICAgIDB4NDA3YzJjMDYsCisgICAgMHg0MDdjYWMwZiwKKyAgICAweDQwN2QyM2Y1LAorICAgIDB4NDA3ZDllNjEsCisgICAgMHg0MDdlMmIzZSwKKyAgICAweDQwN2VhMDFhLAorICAgIDB4NDA3ZjFjNzEsCisgICAgMHg0MDdmOWEzMSwKKyAgICAweDQwODAxZTM4LAorICAgIDB4NDA4MDljOTksCisgICAgMHg0MDgxMWVkZCwKKyAgICAweDQwODE5ZTEyLAorICAgIDB4NDA4MjI5MjcsCisgICAgMHg0MDgyOWExNywKKyAgICAweDQwODMxZmY1LAorICAgIDB4NDA4M2EyYjcsCisgICAgMHg0MDg0MWNhZCwKKyAgICAweDQwODRhMDUyLAorICAgIDB4NDA4NTIwZDcsCisgICAgMHg0MDg1YTFlZCwKKyAgICAweDQwODYyMTQ5LAorICAgIDB4NDA4NjllN2IsCisgICAgMHg0MDg3Mjk2ZCwKKyAgICAweDQwODdhMjFlLAorICAgIDB4NDA4ODFhNzgsCisgICAgMHg0MDg4YTNhNSwKKyAgICAweDQwODkxYWM3LAorICAgIDB4NDA4OTlhNTQsCisgICAgMHg0MDhhMjY1YywKKyAgICAweDQwOGE5ODYyLAorICAgIDB4NDA4YjJiZWEsCisgICAgMHg0MDhiYTliZCwKKyAgICAweDQwOGMyMGU3LAorICAgIDB4NDA4Yzk4N2UsCisgICAgMHg0MWY0MjUyZSwKKyAgICAweDQxZjkyNWMwLAorICAgIDB4NDFmZTI0YjMsCisgICAgMHg0MWZlYTZhOCwKKyAgICAweDQxZmYyNzk5LAorICAgIDB4NDIwMzI1NDcsCisgICAgMHg0MjA4MjU2OSwKKyAgICAweDQyMDhhNWE1LAorICAgIDB4NDIwOTI0OTcsCisgICAgMHg0MjA5YTVkZiwKKyAgICAweDQyMGEyNGVlLAorICAgIDB4NDIwYWE0Y2UsCisgICAgMHg0MjBiMjUwZSwKKyAgICAweDQyMGJhNTg3LAorICAgIDB4NDIwYzI3YjUsCisgICAgMHg0MjBjYTY3NSwKKyAgICAweDQyMGQyNjhmLAorICAgIDB4NDIwZGE2YzYsCisgICAgMHg0MjEyMjZlMCwKKyAgICAweDQyMTcyNzdjLAorICAgIDB4NDIxN2E3MjIsCisgICAgMHg0MjFjMjc0NCwKKyAgICAweDQyMWYyNmZmLAorICAgIDB4NDIyMTI3Y2MsCisgICAgMHg0MjI2Mjc1ZiwKKyAgICAweDQyMmIyODliLAorICAgIDB4NDIyYmE4NDksCisgICAgMHg0MjJjMjg4MywKKyAgICAweDQyMmNhODA4LAorICAgIDB4NDIyZDI3ZTcsCisgICAgMHg0MjJkYTg2OCwKKyAgICAweDQyMmUyODJlLAorICAgIDB4NDIyZWE5NTQsCisgICAgMHg0NDMyMDcyYiwKKyAgICAweDQ0MzI4NzNhLAorICAgIDB4NDQzMzA3NDYsCisgICAgMHg0NDMzODc1NCwKKyAgICAweDQ0MzQwNzY3LAorICAgIDB4NDQzNDg3NzgsCisgICAgMHg0NDM1MDc3ZiwKKyAgICAweDQ0MzU4Nzg5LAorICAgIDB4NDQzNjA3OWMsCisgICAgMHg0NDM2ODdiMiwKKyAgICAweDQ0MzcwN2M0LAorICAgIDB4NDQzNzg3ZDEsCisgICAgMHg0NDM4MDdlMCwKKyAgICAweDQ0Mzg4N2U4LAorICAgIDB4NDQzOTA4MDAsCisgICAgMHg0NDM5ODgwZSwKKyAgICAweDQ0M2EwODIxLAorICAgIDB4NDgzMjEyODMsCisgICAgMHg0ODMyOTI5NSwKKyAgICAweDQ4MzMxMmFiLAorICAgIDB4NDgzMzkyYzQsCisgICAgMHg0YzMyMTJlOSwKKyAgICAweDRjMzI5MmY5LAorICAgIDB4NGMzMzEzMGMsCisgICAgMHg0YzMzOTMyYywKKyAgICAweDRjMzQwMGFjLAorICAgIDB4NGMzNDgwZWEsCisgICAgMHg0YzM1MTMzOCwKKyAgICAweDRjMzU5MzQ2LAorICAgIDB4NGMzNjEzNjIsCisgICAgMHg0YzM2OTM3NSwKKyAgICAweDRjMzcxMzg0LAorICAgIDB4NGMzNzkzOTIsCisgICAgMHg0YzM4MTNhNywKKyAgICAweDRjMzg5M2IzLAorICAgIDB4NGMzOTEzZDMsCisgICAgMHg0YzM5OTNmZCwKKyAgICAweDRjM2ExNDE2LAorICAgIDB4NGMzYTk0MmYsCisgICAgMHg0YzNiMDVmYiwKKyAgICAweDRjM2I5NDQ4LAorICAgIDB4NGMzYzE0NWEsCisgICAgMHg0YzNjOTQ2OSwKKyAgICAweDRjM2QxNDgyLAorICAgIDB4NGMzZDhjNDUsCisgICAgMHg0YzNlMTRkYiwKKyAgICAweDRjM2U5NDkxLAorICAgIDB4NGMzZjE0ZmQsCisgICAgMHg0YzNmOTI1OSwKKyAgICAweDRjNDAxNGE3LAorICAgIDB4NGM0MDkyZDUsCisgICAgMHg0YzQxMTRjYiwKKyAgICAweDUwMzIyZTQ4LAorICAgIDB4NTAzMmFlNTcsCisgICAgMHg1MDMzMmU2MiwKKyAgICAweDUwMzNhZTcyLAorICAgIDB4NTAzNDJlOGIsCisgICAgMHg1MDM0YWVhNSwKKyAgICAweDUwMzUyZWIzLAorICAgIDB4NTAzNWFlYzksCisgICAgMHg1MDM2MmVkYiwKKyAgICAweDUwMzZhZWYxLAorICAgIDB4NTAzNzJmMGEsCisgICAgMHg1MDM3YWYxZCwKKyAgICAweDUwMzgyZjM1LAorICAgIDB4NTAzOGFmNDYsCisgICAgMHg1MDM5MmY1YiwKKyAgICAweDUwMzlhZjZmLAorICAgIDB4NTAzYTJmOGYsCisgICAgMHg1MDNhYWZhNSwKKyAgICAweDUwM2IyZmJkLAorICAgIDB4NTAzYmFmY2YsCisgICAgMHg1MDNjMmZlYiwKKyAgICAweDUwM2NiMDAyLAorICAgIDB4NTAzZDMwMWIsCisgICAgMHg1MDNkYjAzMSwKKyAgICAweDUwM2UzMDNlLAorICAgIDB4NTAzZWIwNTQsCisgICAgMHg1MDNmMzA2NiwKKyAgICAweDUwM2Y4MzgyLAorICAgIDB4NTA0MDMwNzksCisgICAgMHg1MDQwYjA4OSwKKyAgICAweDUwNDEzMGEzLAorICAgIDB4NTA0MWIwYjIsCisgICAgMHg1MDQyMzBjYywKKyAgICAweDUwNDJiMGU5LAorICAgIDB4NTA0MzMwZjksCisgICAgMHg1MDQzYjEwOSwKKyAgICAweDUwNDQzMTE4LAorICAgIDB4NTA0NDg0M2YsCisgICAgMHg1MDQ1MzEyYywKKyAgICAweDUwNDViMTRhLAorICAgIDB4NTA0NjMxNWQsCisgICAgMHg1MDQ2YjE3MywKKyAgICAweDUwNDczMTg1LAorICAgIDB4NTA0N2IxOWEsCisgICAgMHg1MDQ4MzFjMCwKKyAgICAweDUwNDhiMWNlLAorICAgIDB4NTA0OTMxZTEsCisgICAgMHg1MDQ5YjFmNiwKKyAgICAweDUwNGEzMjBjLAorICAgIDB4NTA0YWIyMWMsCisgICAgMHg1MDRiMzIzYywKKyAgICAweDUwNGJiMjRmLAorICAgIDB4NTA0YzMyNzIsCisgICAgMHg1MDRjYjJhMCwKKyAgICAweDUwNGQzMmIyLAorICAgIDB4NTA0ZGIyY2YsCisgICAgMHg1MDRlMzJlYSwKKyAgICAweDUwNGViMzA2LAorICAgIDB4NTA0ZjMzMTgsCisgICAgMHg1MDRmYjMyZiwKKyAgICAweDUwNTAzMzNlLAorICAgIDB4NTA1MDg2ZWYsCisgICAgMHg1MDUxMzM1MSwKKyAgICAweDU4MzIwZjJiLAorICAgIDB4NjgzMjBlZWQsCisgICAgMHg2ODMyOGM2YSwKKyAgICAweDY4MzMwYzdkLAorICAgIDB4NjgzMzhlZmIsCisgICAgMHg2ODM0MGYwYiwKKyAgICAweDY4MzQ4MGVhLAorICAgIDB4NmMzMjBlYzksCisgICAgMHg2YzMyOGMzNCwKKyAgICAweDZjMzMwZWQ0LAorICAgIDB4NzQzMjBhMTksCisgICAgMHg3NDMyODBhYywKKyAgICAweDc0MzMwYzQ1LAorICAgIDB4NzgzMjA5N2UsCisgICAgMHg3ODMyODk5MywKKyAgICAweDc4MzMwOTlmLAorICAgIDB4NzgzMzgwODMsCisgICAgMHg3ODM0MDlhZSwKKyAgICAweDc4MzQ4OWMzLAorICAgIDB4NzgzNTA5ZTIsCisgICAgMHg3ODM1OGEwNCwKKyAgICAweDc4MzYwYTE5LAorICAgIDB4NzgzNjhhMmYsCisgICAgMHg3ODM3MGEzZiwKKyAgICAweDc4Mzc4YTYwLAorICAgIDB4NzgzODBhNzMsCisgICAgMHg3ODM4OGE4NSwKKyAgICAweDc4MzkwYTkyLAorICAgIDB4NzgzOThhYjEsCisgICAgMHg3ODNhMGFjNiwKKyAgICAweDc4M2E4YWQ0LAorICAgIDB4NzgzYjBhZGUsCisgICAgMHg3ODNiOGFmMiwKKyAgICAweDc4M2MwYjA5LAorICAgIDB4NzgzYzhiMWUsCisgICAgMHg3ODNkMGIzNSwKKyAgICAweDc4M2Q4YjRhLAorICAgIDB4NzgzZTBhYTAsCisgICAgMHg3ODNlOGE1MiwKKyAgICAweDdjMzIxMTg1LAorfTsKKworY29uc3Qgc2l6ZV90IGtPcGVuU1NMUmVhc29uVmFsdWVzTGVuID0gc2l6ZW9mKGtPcGVuU1NMUmVhc29uVmFsdWVzKSAvIHNpemVvZihrT3BlblNTTFJlYXNvblZhbHVlc1swXSk7CisKK2NvbnN0IGNoYXIga09wZW5TU0xSZWFzb25TdHJpbmdEYXRhW10gPQorICAgICJBU04xX0xFTkdUSF9NSVNNQVRDSFwwIgorICAgICJBVVhfRVJST1JcMCIKKyAgICAiQkFEX0dFVF9BU04xX09CSkVDVF9DQUxMXDAiCisgICAgIkJBRF9PQkpFQ1RfSEVBREVSXDAiCisgICAgIkJNUFNUUklOR19JU19XUk9OR19MRU5HVEhcMCIKKyAgICAiQk5fTElCXDAiCisgICAgIkJPT0xFQU5fSVNfV1JPTkdfTEVOR1RIXDAiCisgICAgIkJVRkZFUl9UT09fU01BTExcMCIKKyAgICAiQ09OVEVYVF9OT1RfSU5JVElBTElTRURcMCIKKyAgICAiREVDT0RFX0VSUk9SXDAiCisgICAgIkRFUFRIX0VYQ0VFREVEXDAiCisgICAgIkRJR0VTVF9BTkRfS0VZX1RZUEVfTk9UX1NVUFBPUlRFRFwwIgorICAgICJFTkNPREVfRVJST1JcMCIKKyAgICAiRVJST1JfR0VUVElOR19USU1FXDAiCisgICAgIkVYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFXDAiCisgICAgIkVYUEVDVElOR19BTl9JTlRFR0VSXDAiCisgICAgIkVYUEVDVElOR19BTl9PQkpFQ1RcMCIKKyAgICAiRVhQRUNUSU5HX0FfQk9PTEVBTlwwIgorICAgICJFWFBFQ1RJTkdfQV9USU1FXDAiCisgICAgIkVYUExJQ0lUX0xFTkdUSF9NSVNNQVRDSFwwIgorICAgICJFWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVEXDAiCisgICAgIkZJRUxEX01JU1NJTkdcMCIKKyAgICAiRklSU1RfTlVNX1RPT19MQVJHRVwwIgorICAgICJIRUFERVJfVE9PX0xPTkdcMCIKKyAgICAiSUxMRUdBTF9CSVRTVFJJTkdfRk9STUFUXDAiCisgICAgIklMTEVHQUxfQk9PTEVBTlwwIgorICAgICJJTExFR0FMX0NIQVJBQ1RFUlNcMCIKKyAgICAiSUxMRUdBTF9GT1JNQVRcMCIKKyAgICAiSUxMRUdBTF9IRVhcMCIKKyAgICAiSUxMRUdBTF9JTVBMSUNJVF9UQUdcMCIKKyAgICAiSUxMRUdBTF9JTlRFR0VSXDAiCisgICAgIklMTEVHQUxfTkVTVEVEX1RBR0dJTkdcMCIKKyAgICAiSUxMRUdBTF9OVUxMXDAiCisgICAgIklMTEVHQUxfTlVMTF9WQUxVRVwwIgorICAgICJJTExFR0FMX09CSkVDVFwwIgorICAgICJJTExFR0FMX09QVElPTkFMX0FOWVwwIgorICAgICJJTExFR0FMX09QVElPTlNfT05fSVRFTV9URU1QTEFURVwwIgorICAgICJJTExFR0FMX1RBR0dFRF9BTllcMCIKKyAgICAiSUxMRUdBTF9USU1FX1ZBTFVFXDAiCisgICAgIklOVEVHRVJfTk9UX0FTQ0lJX0ZPUk1BVFwwIgorICAgICJJTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9OR1wwIgorICAgICJJTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUXDAiCisgICAgIklOVkFMSURfQk1QU1RSSU5HX0xFTkdUSFwwIgorICAgICJJTlZBTElEX0RJR0lUXDAiCisgICAgIklOVkFMSURfTU9ESUZJRVJcMCIKKyAgICAiSU5WQUxJRF9OVU1CRVJcMCIKKyAgICAiSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkdcMCIKKyAgICAiSU5WQUxJRF9TRVBBUkFUT1JcMCIKKyAgICAiSU5WQUxJRF9USU1FX0ZPUk1BVFwwIgorICAgICJJTlZBTElEX1VOSVZFUlNBTFNUUklOR19MRU5HVEhcMCIKKyAgICAiSU5WQUxJRF9VVEY4U1RSSU5HXDAiCisgICAgIkxJU1RfRVJST1JcMCIKKyAgICAiTUlTU0lOR19BU04xX0VPU1wwIgorICAgICJNSVNTSU5HX0VPQ1wwIgorICAgICJNSVNTSU5HX1NFQ09ORF9OVU1CRVJcMCIKKyAgICAiTUlTU0lOR19WQUxVRVwwIgorICAgICJNU1RSSU5HX05PVF9VTklWRVJTQUxcMCIKKyAgICAiTVNUUklOR19XUk9OR19UQUdcMCIKKyAgICAiTkVTVEVEX0FTTjFfRVJST1JcMCIKKyAgICAiTkVTVEVEX0FTTjFfU1RSSU5HXDAiCisgICAgIk5PTl9IRVhfQ0hBUkFDVEVSU1wwIgorICAgICJOT1RfQVNDSUlfRk9STUFUXDAiCisgICAgIk5PVF9FTk9VR0hfREFUQVwwIgorICAgICJOT19NQVRDSElOR19DSE9JQ0VfVFlQRVwwIgorICAgICJOVUxMX0lTX1dST05HX0xFTkdUSFwwIgorICAgICJPQkpFQ1RfTk9UX0FTQ0lJX0ZPUk1BVFwwIgorICAgICJPRERfTlVNQkVSX09GX0NIQVJTXDAiCisgICAgIlNFQ09ORF9OVU1CRVJfVE9PX0xBUkdFXDAiCisgICAgIlNFUVVFTkNFX0xFTkdUSF9NSVNNQVRDSFwwIgorICAgICJTRVFVRU5DRV9OT1RfQ09OU1RSVUNURURcMCIKKyAgICAiU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJR1wwIgorICAgICJTSE9SVF9MSU5FXDAiCisgICAgIlNUUkVBTUlOR19OT1RfU1VQUE9SVEVEXDAiCisgICAgIlNUUklOR19UT09fTE9OR1wwIgorICAgICJTVFJJTkdfVE9PX1NIT1JUXDAiCisgICAgIlRBR19WQUxVRV9UT09fSElHSFwwIgorICAgICJUSU1FX05PVF9BU0NJSV9GT1JNQVRcMCIKKyAgICAiVE9PX0xPTkdcMCIKKyAgICAiVFlQRV9OT1RfQ09OU1RSVUNURURcMCIKKyAgICAiVFlQRV9OT1RfUFJJTUlUSVZFXDAiCisgICAgIlVORVhQRUNURURfRU9DXDAiCisgICAgIlVOSVZFUlNBTFNUUklOR19JU19XUk9OR19MRU5HVEhcMCIKKyAgICAiVU5LTk9XTl9GT1JNQVRcMCIKKyAgICAiVU5LTk9XTl9NRVNTQUdFX0RJR0VTVF9BTEdPUklUSE1cMCIKKyAgICAiVU5LTk9XTl9TSUdOQVRVUkVfQUxHT1JJVEhNXDAiCisgICAgIlVOS05PV05fVEFHXDAiCisgICAgIlVOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEVcMCIKKyAgICAiVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFXDAiCisgICAgIlVOU1VQUE9SVEVEX1RZUEVcMCIKKyAgICAiV1JPTkdfUFVCTElDX0tFWV9UWVBFXDAiCisgICAgIldST05HX1RBR1wwIgorICAgICJXUk9OR19UWVBFXDAiCisgICAgIkJBRF9GT1BFTl9NT0RFXDAiCisgICAgIkJST0tFTl9QSVBFXDAiCisgICAgIkNPTk5FQ1RfRVJST1JcMCIKKyAgICAiRVJST1JfU0VUVElOR19OQklPXDAiCisgICAgIklOVkFMSURfQVJHVU1FTlRcMCIKKyAgICAiSU5fVVNFXDAiCisgICAgIktFRVBBTElWRVwwIgorICAgICJOQklPX0NPTk5FQ1RfRVJST1JcMCIKKyAgICAiTk9fSE9TVE5BTUVfU1BFQ0lGSUVEXDAiCisgICAgIk5PX1BPUlRfU1BFQ0lGSUVEXDAiCisgICAgIk5PX1NVQ0hfRklMRVwwIgorICAgICJOVUxMX1BBUkFNRVRFUlwwIgorICAgICJTWVNfTElCXDAiCisgICAgIlVOQUJMRV9UT19DUkVBVEVfU09DS0VUXDAiCisgICAgIlVOSU5JVElBTElaRURcMCIKKyAgICAiVU5TVVBQT1JURURfTUVUSE9EXDAiCisgICAgIldSSVRFX1RPX1JFQURfT05MWV9CSU9cMCIKKyAgICAiQVJHMl9MVF9BUkczXDAiCisgICAgIkJBRF9FTkNPRElOR1wwIgorICAgICJCQURfUkVDSVBST0NBTFwwIgorICAgICJCSUdOVU1fVE9PX0xPTkdcMCIKKyAgICAiQklUU19UT09fU01BTExcMCIKKyAgICAiQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTXDAiCisgICAgIkRJVl9CWV9aRVJPXDAiCisgICAgIkVYUEFORF9PTl9TVEFUSUNfQklHTlVNX0RBVEFcMCIKKyAgICAiSU5QVVRfTk9UX1JFRFVDRURcMCIKKyAgICAiSU5WQUxJRF9JTlBVVFwwIgorICAgICJJTlZBTElEX1JBTkdFXDAiCisgICAgIk5FR0FUSVZFX05VTUJFUlwwIgorICAgICJOT1RfQV9TUVVBUkVcMCIKKyAgICAiTk9UX0lOSVRJQUxJWkVEXDAiCisgICAgIk5PX0lOVkVSU0VcMCIKKyAgICAiUFJJVkFURV9LRVlfVE9PX0xBUkdFXDAiCisgICAgIlBfSVNfTk9UX1BSSU1FXDAiCisgICAgIlRPT19NQU5ZX0lURVJBVElPTlNcMCIKKyAgICAiVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFU1wwIgorICAgICJBRVNfS0VZX1NFVFVQX0ZBSUxFRFwwIgorICAgICJCQURfREVDUllQVFwwIgorICAgICJCQURfS0VZX0xFTkdUSFwwIgorICAgICJDVFJMX05PVF9JTVBMRU1FTlRFRFwwIgorICAgICJDVFJMX09QRVJBVElPTl9OT1RfSU1QTEVNRU5URURcMCIKKyAgICAiREFUQV9OT1RfTVVMVElQTEVfT0ZfQkxPQ0tfTEVOR1RIXDAiCisgICAgIklOSVRJQUxJWkFUSU9OX0VSUk9SXDAiCisgICAgIklOUFVUX05PVF9JTklUSUFMSVpFRFwwIgorICAgICJJTlZBTElEX0FEX1NJWkVcMCIKKyAgICAiSU5WQUxJRF9LRVlfTEVOR1RIXDAiCisgICAgIklOVkFMSURfTk9OQ0VcMCIKKyAgICAiSU5WQUxJRF9OT05DRV9TSVpFXDAiCisgICAgIklOVkFMSURfT1BFUkFUSU9OXDAiCisgICAgIklWX1RPT19MQVJHRVwwIgorICAgICJOT19DSVBIRVJfU0VUXDAiCisgICAgIk5PX0RJUkVDVElPTl9TRVRcMCIKKyAgICAiT1VUUFVUX0FMSUFTRVNfSU5QVVRcMCIKKyAgICAiVEFHX1RPT19MQVJHRVwwIgorICAgICJUT09fTEFSR0VcMCIKKyAgICAiVU5TVVBQT1JURURfQURfU0laRVwwIgorICAgICJVTlNVUFBPUlRFRF9JTlBVVF9TSVpFXDAiCisgICAgIlVOU1VQUE9SVEVEX0tFWV9TSVpFXDAiCisgICAgIlVOU1VQUE9SVEVEX05PTkNFX1NJWkVcMCIKKyAgICAiVU5TVVBQT1JURURfVEFHX1NJWkVcMCIKKyAgICAiV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RIXDAiCisgICAgIkxJU1RfQ0FOTk9UX0JFX05VTExcMCIKKyAgICAiTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVFwwIgorICAgICJNSVNTSU5HX0VRVUFMX1NJR05cMCIKKyAgICAiTk9fQ0xPU0VfQlJBQ0VcMCIKKyAgICAiVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTlwwIgorICAgICJWQVJJQUJMRV9FWFBBTlNJT05fVE9PX0xPTkdcMCIKKyAgICAiVkFSSUFCTEVfSEFTX05PX1ZBTFVFXDAiCisgICAgIkJBRF9HRU5FUkFUT1JcMCIKKyAgICAiSU5WQUxJRF9QVUJLRVlcMCIKKyAgICAiTU9EVUxVU19UT09fTEFSR0VcMCIKKyAgICAiTk9fUFJJVkFURV9WQUxVRVwwIgorICAgICJVTktOT1dOX0hBU0hcMCIKKyAgICAiQkFEX1FfVkFMVUVcMCIKKyAgICAiQkFEX1ZFUlNJT05cMCIKKyAgICAiTUlTU0lOR19QQVJBTUVURVJTXDAiCisgICAgIk5FRURfTkVXX1NFVFVQX1ZBTFVFU1wwIgorICAgICJCSUdOVU1fT1VUX09GX1JBTkdFXDAiCisgICAgIkNPT1JESU5BVEVTX09VVF9PRl9SQU5HRVwwIgorICAgICJEMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRVwwIgorICAgICJFQ19HUk9VUF9ORVdfQllfTkFNRV9GQUlMVVJFXDAiCisgICAgIkdST1VQMlBLUEFSQU1FVEVSU19GQUlMVVJFXDAiCisgICAgIkdST1VQX01JU01BVENIXDAiCisgICAgIkkyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFXDAiCisgICAgIklOQ09NUEFUSUJMRV9PQkpFQ1RTXDAiCisgICAgIklOVkFMSURfQ09GQUNUT1JcMCIKKyAgICAiSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UXDAiCisgICAgIklOVkFMSURfQ09NUFJFU1NJT05fQklUXDAiCisgICAgIklOVkFMSURfRU5DT0RJTkdcMCIKKyAgICAiSU5WQUxJRF9GSUVMRFwwIgorICAgICJJTlZBTElEX0ZPUk1cMCIKKyAgICAiSU5WQUxJRF9HUk9VUF9PUkRFUlwwIgorICAgICJJTlZBTElEX1BSSVZBVEVfS0VZXDAiCisgICAgIk1JU1NJTkdfUFJJVkFURV9LRVlcMCIKKyAgICAiTk9OX05BTUVEX0NVUlZFXDAiCisgICAgIlBLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFXDAiCisgICAgIlBPSU5UX0FUX0lORklOSVRZXDAiCisgICAgIlBPSU5UX0lTX05PVF9PTl9DVVJWRVwwIgorICAgICJQVUJMSUNfS0VZX1ZBTElEQVRJT05fRkFJTEVEXDAiCisgICAgIlNMT1RfRlVMTFwwIgorICAgICJVTkRFRklORURfR0VORVJBVE9SXDAiCisgICAgIlVOS05PV05fR1JPVVBcMCIKKyAgICAiVU5LTk9XTl9PUkRFUlwwIgorICAgICJXUk9OR19DVVJWRV9QQVJBTUVURVJTXDAiCisgICAgIldST05HX09SREVSXDAiCisgICAgIktERl9GQUlMRURcMCIKKyAgICAiUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFXDAiCisgICAgIkJBRF9TSUdOQVRVUkVcMCIKKyAgICAiTk9UX0lNUExFTUVOVEVEXDAiCisgICAgIlJBTkRPTV9OVU1CRVJfR0VORVJBVElPTl9GQUlMRURcMCIKKyAgICAiT1BFUkFUSU9OX05PVF9TVVBQT1JURURcMCIKKyAgICAiQ09NTUFORF9OT1RfU1VQUE9SVEVEXDAiCisgICAgIkRJRkZFUkVOVF9LRVlfVFlQRVNcMCIKKyAgICAiRElGRkVSRU5UX1BBUkFNRVRFUlNcMCIKKyAgICAiRVhQRUNUSU5HX0FOX0VDX0tFWV9LRVlcMCIKKyAgICAiRVhQRUNUSU5HX0FOX1JTQV9LRVlcMCIKKyAgICAiRVhQRUNUSU5HX0FfRFNBX0tFWVwwIgorICAgICJJTExFR0FMX09SX1VOU1VQUE9SVEVEX1BBRERJTkdfTU9ERVwwIgorICAgICJJTlZBTElEX0RJR0VTVF9MRU5HVEhcMCIKKyAgICAiSU5WQUxJRF9ESUdFU1RfVFlQRVwwIgorICAgICJJTlZBTElEX0tFWUJJVFNcMCIKKyAgICAiSU5WQUxJRF9NR0YxX01EXDAiCisgICAgIklOVkFMSURfUEFERElOR19NT0RFXDAiCisgICAgIklOVkFMSURfUEFSQU1FVEVSU1wwIgorICAgICJJTlZBTElEX1BTU19TQUxUTEVOXDAiCisgICAgIklOVkFMSURfU0lHTkFUVVJFXDAiCisgICAgIktFWVNfTk9UX1NFVFwwIgorICAgICJNRU1PUllfTElNSVRfRVhDRUVERURcMCIKKyAgICAiTk9UX0FfUFJJVkFURV9LRVlcMCIKKyAgICAiTk9fREVGQVVMVF9ESUdFU1RcMCIKKyAgICAiTk9fS0VZX1NFVFwwIgorICAgICJOT19NREMyX1NVUFBPUlRcMCIKKyAgICAiTk9fTklEX0ZPUl9DVVJWRVwwIgorICAgICJOT19PUEVSQVRJT05fU0VUXDAiCisgICAgIk5PX1BBUkFNRVRFUlNfU0VUXDAiCisgICAgIk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEVcMCIKKyAgICAiT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEXDAiCisgICAgIlVOS05PV05fUFVCTElDX0tFWV9UWVBFXDAiCisgICAgIlVOU1VQUE9SVEVEX0FMR09SSVRITVwwIgorICAgICJPVVRQVVRfVE9PX0xBUkdFXDAiCisgICAgIlVOS05PV05fTklEXDAiCisgICAgIkJBRF9CQVNFNjRfREVDT0RFXDAiCisgICAgIkJBRF9FTkRfTElORVwwIgorICAgICJCQURfSVZfQ0hBUlNcMCIKKyAgICAiQkFEX1BBU1NXT1JEX1JFQURcMCIKKyAgICAiQ0lQSEVSX0lTX05VTExcMCIKKyAgICAiRVJST1JfQ09OVkVSVElOR19QUklWQVRFX0tFWVwwIgorICAgICJOT1RfREVLX0lORk9cMCIKKyAgICAiTk9UX0VOQ1JZUFRFRFwwIgorICAgICJOT1RfUFJPQ19UWVBFXDAiCisgICAgIk5PX1NUQVJUX0xJTkVcMCIKKyAgICAiUkVBRF9LRVlcMCIKKyAgICAiU0hPUlRfSEVBREVSXDAiCisgICAgIlVOU1VQUE9SVEVEX0NJUEhFUlwwIgorICAgICJVTlNVUFBPUlRFRF9FTkNSWVBUSU9OXDAiCisgICAgIkJBRF9QS0NTN19WRVJTSU9OXDAiCisgICAgIk5PVF9QS0NTN19TSUdORURfREFUQVwwIgorICAgICJOT19DRVJUSUZJQ0FURVNfSU5DTFVERURcMCIKKyAgICAiTk9fQ1JMU19JTkNMVURFRFwwIgorICAgICJCQURfSVRFUkFUSU9OX0NPVU5UXDAiCisgICAgIkJBRF9QS0NTMTJfREFUQVwwIgorICAgICJCQURfUEtDUzEyX1ZFUlNJT05cMCIKKyAgICAiQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUlwwIgorICAgICJDUllQVF9FUlJPUlwwIgorICAgICJFTkNSWVBUX0VSUk9SXDAiCisgICAgIkVSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNU1wwIgorICAgICJJTkNPUlJFQ1RfUEFTU1dPUkRcMCIKKyAgICAiS0VZR0VOX0ZBSUxVUkVcMCIKKyAgICAiS0VZX0dFTl9FUlJPUlwwIgorICAgICJNRVRIT0RfTk9UX1NVUFBPUlRFRFwwIgorICAgICJNSVNTSU5HX01BQ1wwIgorICAgICJNVUxUSVBMRV9QUklWQVRFX0tFWVNfSU5fUEtDUzEyXDAiCisgICAgIlBLQ1MxMl9QVUJMSUNfS0VZX0lOVEVHUklUWV9OT1RfU1VQUE9SVEVEXDAiCisgICAgIlBLQ1MxMl9UT09fREVFUExZX05FU1RFRFwwIgorICAgICJQUklWQVRFX0tFWV9ERUNPREVfRVJST1JcMCIKKyAgICAiUFJJVkFURV9LRVlfRU5DT0RFX0VSUk9SXDAiCisgICAgIlVOS05PV05fQUxHT1JJVEhNXDAiCisgICAgIlVOS05PV05fQ0lQSEVSXDAiCisgICAgIlVOS05PV05fQ0lQSEVSX0FMR09SSVRITVwwIgorICAgICJVTktOT1dOX0RJR0VTVFwwIgorICAgICJVTlNVUFBPUlRFRF9LRVlMRU5HVEhcMCIKKyAgICAiVU5TVVBQT1JURURfS0VZX0RFUklWQVRJT05fRlVOQ1RJT05cMCIKKyAgICAiVU5TVVBQT1JURURfUFJGXDAiCisgICAgIlVOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITVwwIgorICAgICJVTlNVUFBPUlRFRF9TQUxUX1RZUEVcMCIKKyAgICAiQkFEX0VfVkFMVUVcMCIKKyAgICAiQkFEX0ZJWEVEX0hFQURFUl9ERUNSWVBUXDAiCisgICAgIkJBRF9QQURfQllURV9DT1VOVFwwIgorICAgICJCQURfUlNBX1BBUkFNRVRFUlNcMCIKKyAgICAiQkxPQ0tfVFlQRV9JU19OT1RfMDFcMCIKKyAgICAiQk5fTk9UX0lOSVRJQUxJWkVEXDAiCisgICAgIkNBTk5PVF9SRUNPVkVSX01VTFRJX1BSSU1FX0tFWVwwIgorICAgICJDUlRfUEFSQU1TX0FMUkVBRFlfR0lWRU5cMCIKKyAgICAiQ1JUX1ZBTFVFU19JTkNPUlJFQ1RcMCIKKyAgICAiREFUQV9MRU5fTk9UX0VRVUFMX1RPX01PRF9MRU5cMCIKKyAgICAiREFUQV9UT09fTEFSR0VcMCIKKyAgICAiREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFXDAiCisgICAgIkRBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTXDAiCisgICAgIkRBVEFfVE9PX1NNQUxMXDAiCisgICAgIkRBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRVwwIgorICAgICJESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWVwwIgorICAgICJEX0VfTk9UX0NPTkdSVUVOVF9UT18xXDAiCisgICAgIkVNUFRZX1BVQkxJQ19LRVlcMCIKKyAgICAiRklSU1RfT0NURVRfSU5WQUxJRFwwIgorICAgICJJTkNPTlNJU1RFTlRfU0VUX09GX0NSVF9WQUxVRVNcMCIKKyAgICAiSU5URVJOQUxfRVJST1JcMCIKKyAgICAiSU5WQUxJRF9NRVNTQUdFX0xFTkdUSFwwIgorICAgICJLRVlfU0laRV9UT09fU01BTExcMCIKKyAgICAiTEFTVF9PQ1RFVF9JTlZBTElEXDAiCisgICAgIk1VU1RfSEFWRV9BVF9MRUFTVF9UV09fUFJJTUVTXDAiCisgICAgIk5PX1BVQkxJQ19FWFBPTkVOVFwwIgorICAgICJOVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HXDAiCisgICAgIk5fTk9UX0VRVUFMX1BfUVwwIgorICAgICJPQUVQX0RFQ09ESU5HX0VSUk9SXDAiCisgICAgIk9OTFlfT05FX09GX1BfUV9HSVZFTlwwIgorICAgICJPVVRQVVRfQlVGRkVSX1RPT19TTUFMTFwwIgorICAgICJQQURESU5HX0NIRUNLX0ZBSUxFRFwwIgorICAgICJQS0NTX0RFQ09ESU5HX0VSUk9SXDAiCisgICAgIlNMRU5fQ0hFQ0tfRkFJTEVEXDAiCisgICAgIlNMRU5fUkVDT1ZFUllfRkFJTEVEXDAiCisgICAgIlVOS05PV05fQUxHT1JJVEhNX1RZUEVcMCIKKyAgICAiVU5LTk9XTl9QQURESU5HX1RZUEVcMCIKKyAgICAiVkFMVUVfTUlTU0lOR1wwIgorICAgICJXUk9OR19TSUdOQVRVUkVfTEVOR1RIXDAiCisgICAgIkFMUE5fTUlTTUFUQ0hfT05fRUFSTFlfREFUQVwwIgorICAgICJBUFBMSUNBVElPTl9EQVRBX0lOU1RFQURfT0ZfSEFORFNIQUtFXDAiCisgICAgIkFQUF9EQVRBX0lOX0hBTkRTSEFLRVwwIgorICAgICJBVFRFTVBUX1RPX1JFVVNFX1NFU1NJT05fSU5fRElGRkVSRU5UX0NPTlRFWFRcMCIKKyAgICAiQkFEX0FMRVJUXDAiCisgICAgIkJBRF9DSEFOR0VfQ0lQSEVSX1NQRUNcMCIKKyAgICAiQkFEX0RBVEFfUkVUVVJORURfQllfQ0FMTEJBQ0tcMCIKKyAgICAiQkFEX0RIX1BfTEVOR1RIXDAiCisgICAgIkJBRF9ESUdFU1RfTEVOR1RIXDAiCisgICAgIkJBRF9FQ0NfQ0VSVFwwIgorICAgICJCQURfRUNQT0lOVFwwIgorICAgICJCQURfSEFORFNIQUtFX1JFQ09SRFwwIgorICAgICJCQURfSEVMTE9fUkVRVUVTVFwwIgorICAgICJCQURfTEVOR1RIXDAiCisgICAgIkJBRF9QQUNLRVRfTEVOR1RIXDAiCisgICAgIkJBRF9SU0FfRU5DUllQVFwwIgorICAgICJCQURfU1JUUF9NS0lfVkFMVUVcMCIKKyAgICAiQkFEX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1RcMCIKKyAgICAiQkFEX1NTTF9GSUxFVFlQRVwwIgorICAgICJCQURfV1JJVEVfUkVUUllcMCIKKyAgICAiQklPX05PVF9TRVRcMCIKKyAgICAiQkxPQ0tfQ0lQSEVSX1BBRF9JU19XUk9OR1wwIgorICAgICJCVUZGRVJFRF9NRVNTQUdFU19PTl9DSVBIRVJfQ0hBTkdFXDAiCisgICAgIkNBTk5PVF9IQVZFX0JPVEhfUFJJVktFWV9BTkRfTUVUSE9EXDAiCisgICAgIkNBTk5PVF9QQVJTRV9MRUFGX0NFUlRcMCIKKyAgICAiQ0FfRE5fTEVOR1RIX01JU01BVENIXDAiCisgICAgIkNBX0ROX1RPT19MT05HXDAiCisgICAgIkNDU19SRUNFSVZFRF9FQVJMWVwwIgorICAgICJDRVJUSUZJQ0FURV9BTkRfUFJJVkFURV9LRVlfTUlTTUFUQ0hcMCIKKyAgICAiQ0VSVElGSUNBVEVfVkVSSUZZX0ZBSUxFRFwwIgorICAgICJDRVJUX0NCX0VSUk9SXDAiCisgICAgIkNFUlRfTEVOR1RIX01JU01BVENIXDAiCisgICAgIkNIQU5ORUxfSURfTk9UX1AyNTZcMCIKKyAgICAiQ0hBTk5FTF9JRF9TSUdOQVRVUkVfSU5WQUxJRFwwIgorICAgICJDSVBIRVJfT1JfSEFTSF9VTkFWQUlMQUJMRVwwIgorICAgICJDTElFTlRIRUxMT19QQVJTRV9GQUlMRURcMCIKKyAgICAiQ0xJRU5USEVMTE9fVExTRVhUXDAiCisgICAgIkNPTk5FQ1RJT05fUkVKRUNURURcMCIKKyAgICAiQ09OTkVDVElPTl9UWVBFX05PVF9TRVRcMCIKKyAgICAiQ1VTVE9NX0VYVEVOU0lPTl9FUlJPUlwwIgorICAgICJEQVRBX0xFTkdUSF9UT09fTE9OR1wwIgorICAgICJERUNSWVBUSU9OX0ZBSUxFRFwwIgorICAgICJERUNSWVBUSU9OX0ZBSUxFRF9PUl9CQURfUkVDT1JEX01BQ1wwIgorICAgICJESF9QVUJMSUNfVkFMVUVfTEVOR1RIX0lTX1dST05HXDAiCisgICAgIkRIX1BfVE9PX0xPTkdcMCIKKyAgICAiRElHRVNUX0NIRUNLX0ZBSUxFRFwwIgorICAgICJET1dOR1JBREVfREVURUNURURcMCIKKyAgICAiRFRMU19NRVNTQUdFX1RPT19CSUdcMCIKKyAgICAiRFVQTElDQVRFX0VYVEVOU0lPTlwwIgorICAgICJEVVBMSUNBVEVfS0VZX1NIQVJFXDAiCisgICAgIkVDQ19DRVJUX05PVF9GT1JfU0lHTklOR1wwIgorICAgICJFTVNfU1RBVEVfSU5DT05TSVNURU5UXDAiCisgICAgIkVOQ1JZUFRFRF9MRU5HVEhfVE9PX0xPTkdcMCIKKyAgICAiRVJST1JfQURESU5HX0VYVEVOU0lPTlwwIgorICAgICJFUlJPUl9JTl9SRUNFSVZFRF9DSVBIRVJfTElTVFwwIgorICAgICJFUlJPUl9QQVJTSU5HX0VYVEVOU0lPTlwwIgorICAgICJFWENFU1NJVkVfTUVTU0FHRV9TSVpFXDAiCisgICAgIkVYVFJBX0RBVEFfSU5fTUVTU0FHRVwwIgorICAgICJGUkFHTUVOVF9NSVNNQVRDSFwwIgorICAgICJHT1RfTkVYVF9QUk9UT19XSVRIT1VUX0VYVEVOU0lPTlwwIgorICAgICJIQU5EU0hBS0VfRkFJTFVSRV9PTl9DTElFTlRfSEVMTE9cMCIKKyAgICAiSFRUUFNfUFJPWFlfUkVRVUVTVFwwIgorICAgICJIVFRQX1JFUVVFU1RcMCIKKyAgICAiSU5BUFBST1BSSUFURV9GQUxMQkFDS1wwIgorICAgICJJTlZBTElEX0FMUE5fUFJPVE9DT0xcMCIKKyAgICAiSU5WQUxJRF9DT01NQU5EXDAiCisgICAgIklOVkFMSURfQ09NUFJFU1NJT05fTElTVFwwIgorICAgICJJTlZBTElEX01FU1NBR0VcMCIKKyAgICAiSU5WQUxJRF9PVVRFUl9SRUNPUkRfVFlQRVwwIgorICAgICJJTlZBTElEX1NDVF9MSVNUXDAiCisgICAgIklOVkFMSURfU1NMX1NFU1NJT05cMCIKKyAgICAiSU5WQUxJRF9USUNLRVRfS0VZU19MRU5HVEhcMCIKKyAgICAiTEVOR1RIX01JU01BVENIXDAiCisgICAgIk1JU1NJTkdfRVhURU5TSU9OXDAiCisgICAgIk1JU1NJTkdfS0VZX1NIQVJFXDAiCisgICAgIk1JU1NJTkdfUlNBX0NFUlRJRklDQVRFXDAiCisgICAgIk1JU1NJTkdfVE1QX0RIX0tFWVwwIgorICAgICJNSVNTSU5HX1RNUF9FQ0RIX0tFWVwwIgorICAgICJNSVhFRF9TUEVDSUFMX09QRVJBVE9SX1dJVEhfR1JPVVBTXDAiCisgICAgIk1UVV9UT09fU01BTExcMCIKKyAgICAiTkVHT1RJQVRFRF9CT1RIX05QTl9BTkRfQUxQTlwwIgorICAgICJORVNURURfR1JPVVBcMCIKKyAgICAiTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVEXDAiCisgICAgIk5PX0NFUlRJRklDQVRFX0FTU0lHTkVEXDAiCisgICAgIk5PX0NFUlRJRklDQVRFX1NFVFwwIgorICAgICJOT19DSVBIRVJTX0FWQUlMQUJMRVwwIgorICAgICJOT19DSVBIRVJTX1BBU1NFRFwwIgorICAgICJOT19DSVBIRVJTX1NQRUNJRklFRFwwIgorICAgICJOT19DSVBIRVJfTUFUQ0hcMCIKKyAgICAiTk9fQ09NTU9OX1NJR05BVFVSRV9BTEdPUklUSE1TXDAiCisgICAgIk5PX0NPTVBSRVNTSU9OX1NQRUNJRklFRFwwIgorICAgICJOT19HUk9VUFNfU1BFQ0lGSUVEXDAiCisgICAgIk5PX01FVEhPRF9TUEVDSUZJRURcMCIKKyAgICAiTk9fUDI1Nl9TVVBQT1JUXDAiCisgICAgIk5PX1BSSVZBVEVfS0VZX0FTU0lHTkVEXDAiCisgICAgIk5PX1JFTkVHT1RJQVRJT05cMCIKKyAgICAiTk9fUkVRVUlSRURfRElHRVNUXDAiCisgICAgIk5PX1NIQVJFRF9DSVBIRVJcMCIKKyAgICAiTk9fU0hBUkVEX0dST1VQXDAiCisgICAgIk5PX1NVUFBPUlRFRF9WRVJTSU9OU19FTkFCTEVEXDAiCisgICAgIk5VTExfU1NMX0NUWFwwIgorICAgICJOVUxMX1NTTF9NRVRIT0RfUEFTU0VEXDAiCisgICAgIk9MRF9TRVNTSU9OX0NJUEhFUl9OT1RfUkVUVVJORURcMCIKKyAgICAiT0xEX1NFU1NJT05fUFJGX0hBU0hfTUlTTUFUQ0hcMCIKKyAgICAiT0xEX1NFU1NJT05fVkVSU0lPTl9OT1RfUkVUVVJORURcMCIKKyAgICAiUEFSU0VfVExTRVhUXDAiCisgICAgIlBBVEhfVE9PX0xPTkdcMCIKKyAgICAiUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFXDAiCisgICAgIlBFRVJfRVJST1JfVU5TVVBQT1JURURfQ0VSVElGSUNBVEVfVFlQRVwwIgorICAgICJQUkVfU0hBUkVEX0tFWV9NVVNUX0JFX0xBU1RcMCIKKyAgICAiUFJPVE9DT0xfSVNfU0hVVERPV05cMCIKKyAgICAiUFNLX0lERU5USVRZX0JJTkRFUl9DT1VOVF9NSVNNQVRDSFwwIgorICAgICJQU0tfSURFTlRJVFlfTk9UX0ZPVU5EXDAiCisgICAgIlBTS19OT19DTElFTlRfQ0JcMCIKKyAgICAiUFNLX05PX1NFUlZFUl9DQlwwIgorICAgICJSRUFEX1RJTUVPVVRfRVhQSVJFRFwwIgorICAgICJSRUNPUkRfTEVOR1RIX01JU01BVENIXDAiCisgICAgIlJFQ09SRF9UT09fTEFSR0VcMCIKKyAgICAiUkVORUdPVElBVElPTl9FTVNfTUlTTUFUQ0hcMCIKKyAgICAiUkVORUdPVElBVElPTl9FTkNPRElOR19FUlJcMCIKKyAgICAiUkVORUdPVElBVElPTl9NSVNNQVRDSFwwIgorICAgICJSRVFVSVJFRF9DSVBIRVJfTUlTU0lOR1wwIgorICAgICJSRVNVTUVEX0VNU19TRVNTSU9OX1dJVEhPVVRfRU1TX0VYVEVOU0lPTlwwIgorICAgICJSRVNVTUVEX05PTl9FTVNfU0VTU0lPTl9XSVRIX0VNU19FWFRFTlNJT05cMCIKKyAgICAiU0NTVl9SRUNFSVZFRF9XSEVOX1JFTkVHT1RJQVRJTkdcMCIKKyAgICAiU0VSVkVSSEVMTE9fVExTRVhUXDAiCisgICAgIlNFUlZFUl9DRVJUX0NIQU5HRURcMCIKKyAgICAiU0VTU0lPTl9JRF9DT05URVhUX1VOSU5JVElBTElaRURcMCIKKyAgICAiU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURURcMCIKKyAgICAiU0hVVERPV05fV0hJTEVfSU5fSU5JVFwwIgorICAgICJTSUdOQVRVUkVfQUxHT1JJVEhNU19FWFRFTlNJT05fU0VOVF9CWV9TRVJWRVJcMCIKKyAgICAiU1JUUF9DT1VMRF9OT1RfQUxMT0NBVEVfUFJPRklMRVNcMCIKKyAgICAiU1JUUF9VTktOT1dOX1BST1RFQ1RJT05fUFJPRklMRVwwIgorICAgICJTU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUVcMCIKKyAgICAiU1NMVjNfQUxFUlRfQkFEX0NFUlRJRklDQVRFXDAiCisgICAgIlNTTFYzX0FMRVJUX0JBRF9SRUNPUkRfTUFDXDAiCisgICAgIlNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX0VYUElSRURcMCIKKyAgICAiU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfUkVWT0tFRFwwIgorICAgICJTU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9VTktOT1dOXDAiCisgICAgIlNTTFYzX0FMRVJUX0NMT1NFX05PVElGWVwwIgorICAgICJTU0xWM19BTEVSVF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkVcMCIKKyAgICAiU1NMVjNfQUxFUlRfSEFORFNIQUtFX0ZBSUxVUkVcMCIKKyAgICAiU1NMVjNfQUxFUlRfSUxMRUdBTF9QQVJBTUVURVJcMCIKKyAgICAiU1NMVjNfQUxFUlRfTk9fQ0VSVElGSUNBVEVcMCIKKyAgICAiU1NMVjNfQUxFUlRfVU5FWFBFQ1RFRF9NRVNTQUdFXDAiCisgICAgIlNTTFYzX0FMRVJUX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFXDAiCisgICAgIlNTTF9DVFhfSEFTX05PX0RFRkFVTFRfU1NMX1ZFUlNJT05cMCIKKyAgICAiU1NMX0hBTkRTSEFLRV9GQUlMVVJFXDAiCisgICAgIlNTTF9TRVNTSU9OX0lEX0NPTlRFWFRfVE9PX0xPTkdcMCIKKyAgICAiVElDS0VUX0VOQ1JZUFRJT05fRkFJTEVEXDAiCisgICAgIlRMU1YxX0FMRVJUX0FDQ0VTU19ERU5JRURcMCIKKyAgICAiVExTVjFfQUxFUlRfREVDT0RFX0VSUk9SXDAiCisgICAgIlRMU1YxX0FMRVJUX0RFQ1JZUFRJT05fRkFJTEVEXDAiCisgICAgIlRMU1YxX0FMRVJUX0RFQ1JZUFRfRVJST1JcMCIKKyAgICAiVExTVjFfQUxFUlRfRVhQT1JUX1JFU1RSSUNUSU9OXDAiCisgICAgIlRMU1YxX0FMRVJUX0lOQVBQUk9QUklBVEVfRkFMTEJBQ0tcMCIKKyAgICAiVExTVjFfQUxFUlRfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZXDAiCisgICAgIlRMU1YxX0FMRVJUX0lOVEVSTkFMX0VSUk9SXDAiCisgICAgIlRMU1YxX0FMRVJUX05PX1JFTkVHT1RJQVRJT05cMCIKKyAgICAiVExTVjFfQUxFUlRfUFJPVE9DT0xfVkVSU0lPTlwwIgorICAgICJUTFNWMV9BTEVSVF9SRUNPUkRfT1ZFUkZMT1dcMCIKKyAgICAiVExTVjFfQUxFUlRfVU5LTk9XTl9DQVwwIgorICAgICJUTFNWMV9BTEVSVF9VU0VSX0NBTkNFTExFRFwwIgorICAgICJUTFNWMV9CQURfQ0VSVElGSUNBVEVfSEFTSF9WQUxVRVwwIgorICAgICJUTFNWMV9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFXDAiCisgICAgIlRMU1YxX0NFUlRJRklDQVRFX1JFUVVJUkVEXDAiCisgICAgIlRMU1YxX0NFUlRJRklDQVRFX1VOT0JUQUlOQUJMRVwwIgorICAgICJUTFNWMV9VTktOT1dOX1BTS19JREVOVElUWVwwIgorICAgICJUTFNWMV9VTlJFQ09HTklaRURfTkFNRVwwIgorICAgICJUTFNWMV9VTlNVUFBPUlRFRF9FWFRFTlNJT05cMCIKKyAgICAiVExTX1BFRVJfRElEX05PVF9SRVNQT05EX1dJVEhfQ0VSVElGSUNBVEVfTElTVFwwIgorICAgICJUTFNfUlNBX0VOQ1JZUFRFRF9WQUxVRV9MRU5HVEhfSVNfV1JPTkdcMCIKKyAgICAiVE9PX01BTllfRU1QVFlfRlJBR01FTlRTXDAiCisgICAgIlRPT19NQU5ZX0tFWV9VUERBVEVTXDAiCisgICAgIlRPT19NQU5ZX1dBUk5JTkdfQUxFUlRTXDAiCisgICAgIlRPT19NVUNIX1JFQURfRUFSTFlfREFUQVwwIgorICAgICJUT09fTVVDSF9TS0lQUEVEX0VBUkxZX0RBVEFcMCIKKyAgICAiVU5BQkxFX1RPX0ZJTkRfRUNESF9QQVJBTUVURVJTXDAiCisgICAgIlVORVhQRUNURURfRVhURU5TSU9OXDAiCisgICAgIlVORVhQRUNURURfRVhURU5TSU9OX09OX0VBUkxZX0RBVEFcMCIKKyAgICAiVU5FWFBFQ1RFRF9NRVNTQUdFXDAiCisgICAgIlVORVhQRUNURURfT1BFUkFUT1JfSU5fR1JPVVBcMCIKKyAgICAiVU5FWFBFQ1RFRF9SRUNPUkRcMCIKKyAgICAiVU5LTk9XTl9BTEVSVF9UWVBFXDAiCisgICAgIlVOS05PV05fQ0VSVElGSUNBVEVfVFlQRVwwIgorICAgICJVTktOT1dOX0NJUEhFUl9SRVRVUk5FRFwwIgorICAgICJVTktOT1dOX0NJUEhFUl9UWVBFXDAiCisgICAgIlVOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEVcMCIKKyAgICAiVU5LTk9XTl9QUk9UT0NPTFwwIgorICAgICJVTktOT1dOX1NTTF9WRVJTSU9OXDAiCisgICAgIlVOS05PV05fU1RBVEVcMCIKKyAgICAiVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OX0RJU0FCTEVEXDAiCisgICAgIlVOU1VQUE9SVEVEX0NPTVBSRVNTSU9OX0FMR09SSVRITVwwIgorICAgICJVTlNVUFBPUlRFRF9FTExJUFRJQ19DVVJWRVwwIgorICAgICJVTlNVUFBPUlRFRF9QUk9UT0NPTFwwIgorICAgICJVTlNVUFBPUlRFRF9QUk9UT0NPTF9GT1JfQ1VTVE9NX0tFWVwwIgorICAgICJXUk9OR19DRVJUSUZJQ0FURV9UWVBFXDAiCisgICAgIldST05HX0NJUEhFUl9SRVRVUk5FRFwwIgorICAgICJXUk9OR19DVVJWRVwwIgorICAgICJXUk9OR19NRVNTQUdFX1RZUEVcMCIKKyAgICAiV1JPTkdfU0lHTkFUVVJFX1RZUEVcMCIKKyAgICAiV1JPTkdfU1NMX1ZFUlNJT05cMCIKKyAgICAiV1JPTkdfVkVSU0lPTl9OVU1CRVJcMCIKKyAgICAiV1JPTkdfVkVSU0lPTl9PTl9FQVJMWV9EQVRBXDAiCisgICAgIlg1MDlfTElCXDAiCisgICAgIlg1MDlfVkVSSUZJQ0FUSU9OX1NFVFVQX1BST0JMRU1TXDAiCisgICAgIkFLSURfTUlTTUFUQ0hcMCIKKyAgICAiQkFEX1g1MDlfRklMRVRZUEVcMCIKKyAgICAiQkFTRTY0X0RFQ09ERV9FUlJPUlwwIgorICAgICJDQU5UX0NIRUNLX0RIX0tFWVwwIgorICAgICJDRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRVwwIgorICAgICJDUkxfQUxSRUFEWV9ERUxUQVwwIgorICAgICJDUkxfVkVSSUZZX0ZBSUxVUkVcMCIKKyAgICAiSURQX01JU01BVENIXDAiCisgICAgIklOVkFMSURfRElSRUNUT1JZXDAiCisgICAgIklOVkFMSURfRklFTERfTkFNRVwwIgorICAgICJJTlZBTElEX1BBUkFNRVRFUlwwIgorICAgICJJTlZBTElEX1BTU19QQVJBTUVURVJTXDAiCisgICAgIklOVkFMSURfVFJVU1RcMCIKKyAgICAiSVNTVUVSX01JU01BVENIXDAiCisgICAgIktFWV9UWVBFX01JU01BVENIXDAiCisgICAgIktFWV9WQUxVRVNfTUlTTUFUQ0hcMCIKKyAgICAiTE9BRElOR19DRVJUX0RJUlwwIgorICAgICJMT0FESU5HX0RFRkFVTFRTXDAiCisgICAgIk5BTUVfVE9PX0xPTkdcMCIKKyAgICAiTkVXRVJfQ1JMX05PVF9ORVdFUlwwIgorICAgICJOT19DRVJUX1NFVF9GT1JfVVNfVE9fVkVSSUZZXDAiCisgICAgIk5PX0NSTF9OVU1CRVJcMCIKKyAgICAiUFVCTElDX0tFWV9ERUNPREVfRVJST1JcMCIKKyAgICAiUFVCTElDX0tFWV9FTkNPREVfRVJST1JcMCIKKyAgICAiU0hPVUxEX1JFVFJZXDAiCisgICAgIlVOS05PV05fS0VZX1RZUEVcMCIKKyAgICAiVU5LTk9XTl9QVVJQT1NFX0lEXDAiCisgICAgIlVOS05PV05fVFJVU1RfSURcMCIKKyAgICAiV1JPTkdfTE9PS1VQX1RZUEVcMCIKKyAgICAiQkFEX0lQX0FERFJFU1NcMCIKKyAgICAiQkFEX09CSkVDVFwwIgorICAgICJCTl9ERUMyQk5fRVJST1JcMCIKKyAgICAiQk5fVE9fQVNOMV9JTlRFR0VSX0VSUk9SXDAiCisgICAgIkNBTk5PVF9GSU5EX0ZSRUVfRlVOQ1RJT05cMCIKKyAgICAiRElSTkFNRV9FUlJPUlwwIgorICAgICJESVNUUE9JTlRfQUxSRUFEWV9TRVRcMCIKKyAgICAiRFVQTElDQVRFX1pPTkVfSURcMCIKKyAgICAiRVJST1JfQ09OVkVSVElOR19aT05FXDAiCisgICAgIkVSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTlwwIgorICAgICJFUlJPUl9JTl9FWFRFTlNJT05cMCIKKyAgICAiRVhQRUNURURfQV9TRUNUSU9OX05BTUVcMCIKKyAgICAiRVhURU5TSU9OX0VYSVNUU1wwIgorICAgICJFWFRFTlNJT05fTkFNRV9FUlJPUlwwIgorICAgICJFWFRFTlNJT05fTk9UX0ZPVU5EXDAiCisgICAgIkVYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURURcMCIKKyAgICAiRVhURU5TSU9OX1ZBTFVFX0VSUk9SXDAiCisgICAgIklMTEVHQUxfRU1QVFlfRVhURU5TSU9OXDAiCisgICAgIklMTEVHQUxfSEVYX0RJR0lUXDAiCisgICAgIklOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBR1wwIgorICAgICJJTlZBTElEX0JPT0xFQU5fU1RSSU5HXDAiCisgICAgIklOVkFMSURfRVhURU5TSU9OX1NUUklOR1wwIgorICAgICJJTlZBTElEX01VTFRJUExFX1JETlNcMCIKKyAgICAiSU5WQUxJRF9OQU1FXDAiCisgICAgIklOVkFMSURfTlVMTF9BUkdVTUVOVFwwIgorICAgICJJTlZBTElEX05VTExfTkFNRVwwIgorICAgICJJTlZBTElEX05VTExfVkFMVUVcMCIKKyAgICAiSU5WQUxJRF9OVU1CRVJTXDAiCisgICAgIklOVkFMSURfT0JKRUNUX0lERU5USUZJRVJcMCIKKyAgICAiSU5WQUxJRF9PUFRJT05cMCIKKyAgICAiSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUlwwIgorICAgICJJTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HXDAiCisgICAgIklOVkFMSURfUFVSUE9TRVwwIgorICAgICJJTlZBTElEX1NFQ1RJT05cMCIKKyAgICAiSU5WQUxJRF9TWU5UQVhcMCIKKyAgICAiSVNTVUVSX0RFQ09ERV9FUlJPUlwwIgorICAgICJORUVEX09SR0FOSVpBVElPTl9BTkRfTlVNQkVSU1wwIgorICAgICJOT19DT05GSUdfREFUQUJBU0VcMCIKKyAgICAiTk9fSVNTVUVSX0NFUlRJRklDQVRFXDAiCisgICAgIk5PX0lTU1VFUl9ERVRBSUxTXDAiCisgICAgIk5PX1BPTElDWV9JREVOVElGSUVSXDAiCisgICAgIk5PX1BST1hZX0NFUlRfUE9MSUNZX0xBTkdVQUdFX0RFRklORURcMCIKKyAgICAiTk9fUFVCTElDX0tFWVwwIgorICAgICJOT19TVUJKRUNUX0RFVEFJTFNcMCIKKyAgICAiT0REX05VTUJFUl9PRl9ESUdJVFNcMCIKKyAgICAiT1BFUkFUSU9OX05PVF9ERUZJTkVEXDAiCisgICAgIk9USEVSTkFNRV9FUlJPUlwwIgorICAgICJQT0xJQ1lfTEFOR1VBR0VfQUxSRUFEWV9ERUZJTkVEXDAiCisgICAgIlBPTElDWV9QQVRIX0xFTkdUSFwwIgorICAgICJQT0xJQ1lfUEFUSF9MRU5HVEhfQUxSRUFEWV9ERUZJTkVEXDAiCisgICAgIlBPTElDWV9XSEVOX1BST1hZX0xBTkdVQUdFX1JFUVVJUkVTX05PX1BPTElDWVwwIgorICAgICJTRUNUSU9OX05PVF9GT1VORFwwIgorICAgICJVTkFCTEVfVE9fR0VUX0lTU1VFUl9ERVRBSUxTXDAiCisgICAgIlVOQUJMRV9UT19HRVRfSVNTVUVSX0tFWUlEXDAiCisgICAgIlVOS05PV05fQklUX1NUUklOR19BUkdVTUVOVFwwIgorICAgICJVTktOT1dOX0VYVEVOU0lPTlwwIgorICAgICJVTktOT1dOX0VYVEVOU0lPTl9OQU1FXDAiCisgICAgIlVOS05PV05fT1BUSU9OXDAiCisgICAgIlVOU1VQUE9SVEVEX09QVElPTlwwIgorICAgICJVU0VSX1RPT19MT05HXDAiCisgICAgIiI7CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9iaW8uaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAppbmRleCBhZGI2NDFiLi4yOTk0ZWY3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvYmlvLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL2Jpby5oCkBAIC00NzMsMTYgKzQ3MywyOSBAQAogLy8gb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuCiBPUEVOU1NMX0VYUE9SVCBpbnQgQklPX2dldF9mcChCSU8gKmJpbywgRklMRSAqKm91dF9maWxlKTsKIAorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKwogLy8gQklPX3NldF9mcCBzZXRzIHRoZSB8RklMRXwgZm9yIHxiaW98LiBJZiB8Y2xvc2VfZmxhZ3wgaXMgfEJJT19DTE9TRXwgdGhlbgogLy8gfGZjbG9zZXwgd2lsbCBiZSBjYWxsZWQgb24gfGZpbGV8IHdoZW4gfGJpb3wgaXMgY2xvc2VkLiBJdCByZXR1cm5zIG9uZSBvbgogLy8gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuCiBPUEVOU1NMX0VYUE9SVCBpbnQgQklPX3NldF9mcChCSU8gKmJpbywgRklMRSAqZmlsZSwgaW50IGNsb3NlX2ZsYWcpOwotCiAvLyBCSU9fcmVhZF9maWxlbmFtZSBvcGVucyB8ZmlsZW5hbWV8IGZvciByZWFkaW5nIGFuZCBzZXRzIHRoZSByZXN1bHQgYXMgdGhlCiAvLyB8RklMRXwgZm9yIHxiaW98LiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG90aGVyd2lzZS4gVGhlIHxGSUxFfAogLy8gd2lsbCBiZSBjbG9zZWQgd2hlbiB8YmlvfCBpcyBmcmVlZC4KIE9QRU5TU0xfRVhQT1JUIGludCBCSU9fcmVhZF9maWxlbmFtZShCSU8gKmJpbywgY29uc3QgY2hhciAqZmlsZW5hbWUpOwogCisjZWxzZSAgLy8gZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCisKKyNkZWZpbmUgQklPX0ZQX1JFQUQgMHgwMgorI2RlZmluZSBCSU9fRlBfV1JJVEUgMHgwNAorI2RlZmluZSBCSU9fRlBfQVBQRU5EIDB4MDgKKworI2RlZmluZSBCSU9fc2V0X2ZwKGIsIGZwLCBjKSBCSU9fY3RybChiLCBCSU9fQ19TRVRfRklMRV9QVFIsIGMsIChjaGFyICopZnApCisjZGVmaW5lIEJJT19yZWFkX2ZpbGVuYW1lKGIsIG5hbWUpIFwKKyAgQklPX2N0cmwoYiwgQklPX0NfU0VUX0ZJTEVOQU1FLCBCSU9fQ0xPU0UgfCBCSU9fRlBfUkVBRCwgKGNoYXIgKiluYW1lKQorCisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKwogLy8gQklPX3dyaXRlX2ZpbGVuYW1lIG9wZW5zIHxmaWxlbmFtZXwgZm9yIHdyaXRpbmcgYW5kIHNldHMgdGhlIHJlc3VsdCBhcyB0aGUKIC8vIHxGSUxFfCBmb3IgfGJpb3wuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiBUaGUgfEZJTEV8CiAvLyB3aWxsIGJlIGNsb3NlZCB3aGVuIHxiaW98IGlzIGZyZWVkLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL2NvbmYuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9jb25mLmgKaW5kZXggNGZmY2UzNy4uN2ZhMWQyNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL2NvbmYuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvY29uZi5oCkBAIC01OSw2ICs1OSw3IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KICNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvbWVtLmggYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvbWVtLmgKaW5kZXggN2Q3MDg3ZS4uMmM2Y2ZkMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL21lbS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9tZW0uaApAQCAtOTgsNiArOTgsMTIgQEAKIC8vIG5vbi16ZXJvLgogT1BFTlNTTF9FWFBPUlQgaW50IENSWVBUT19tZW1jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgc2l6ZV90IGxlbik7CiAKK09QRU5TU0xfRVhQT1JUIGNvbnN0IHZvaWQgKk9QRU5TU0xfbWVtY2hyKGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CitPUEVOU1NMX0VYUE9SVCBpbnQgT1BFTlNTTF9tZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CitPUEVOU1NMX0VYUE9SVCB2b2lkICpPUEVOU1NMX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pOworT1BFTlNTTF9FWFBPUlQgdm9pZCAqT1BFTlNTTF9tZW1tb3ZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7CitPUEVOU1NMX0VYUE9SVCB2b2lkICpPUEVOU1NMX21lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3Qgbik7CisKIC8vIE9QRU5TU0xfaGFzaDMyIGltcGxlbWVudHMgdGhlIDMyIGJpdCwgRk5WLTFhIGhhc2guCiBPUEVOU1NMX0VYUE9SVCB1aW50MzJfdCBPUEVOU1NMX2hhc2gzMihjb25zdCB2b2lkICpwdHIsIHNpemVfdCBsZW4pOwogCkBAIC0xMjksNyArMTM1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKICAgICBPUEVOU1NMX1BSSU5URl9GT1JNQVRfRlVOQygzLCAwKTsKIAotCiAvLyBEZXByZWNhdGVkIGZ1bmN0aW9ucy4KIAogI2RlZmluZSBDUllQVE9fbWFsbG9jIE9QRU5TU0xfbWFsbG9jCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZmZmQ4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLwotCi0vKiBUaGlzIGhlYWRlciBpcyBwcm92aWRlZCBpbiBvcmRlciB0byBtYWtlIGNvbXBpbGluZyBhZ2FpbnN0IGNvZGUgdGhhdCBleHBlY3RzCi0gICBPcGVuU1NMIGVhc2llci4gKi8KLQotI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9PUEVOU1NMQ09ORl9ICi0jZGVmaW5lIE9QRU5TU0xfSEVBREVSX09QRU5TU0xDT05GX0gKLQotCi0jZGVmaW5lIE9QRU5TU0xfTk9fQVNZTkMKLSNkZWZpbmUgT1BFTlNTTF9OT19CRgotI2RlZmluZSBPUEVOU1NMX05PX0JMQUtFMgotI2RlZmluZSBPUEVOU1NMX05PX0JVRl9GUkVFTElTVFMKLSNkZWZpbmUgT1BFTlNTTF9OT19DQU1FTExJQQotI2RlZmluZSBPUEVOU1NMX05PX0NBUElFTkcKLSNkZWZpbmUgT1BFTlNTTF9OT19DQVNUCi0jZGVmaW5lIE9QRU5TU0xfTk9fQ01TCi0jZGVmaW5lIE9QRU5TU0xfTk9fQ09NUAotI2RlZmluZSBPUEVOU1NMX05PX0NUCi0jZGVmaW5lIE9QRU5TU0xfTk9fREFORQotI2RlZmluZSBPUEVOU1NMX05PX0RFUFJFQ0FURUQKLSNkZWZpbmUgT1BFTlNTTF9OT19ER1JBTQotI2RlZmluZSBPUEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FCi0jZGVmaW5lIE9QRU5TU0xfTk9fRUNfTklTVFBfNjRfR0NDXzEyOAotI2RlZmluZSBPUEVOU1NMX05PX0VDMk0KLSNkZWZpbmUgT1BFTlNTTF9OT19FR0QKLSNkZWZpbmUgT1BFTlNTTF9OT19FTkdJTkUKLSNkZWZpbmUgT1BFTlNTTF9OT19HTVAKLSNkZWZpbmUgT1BFTlNTTF9OT19HT1NUCi0jZGVmaW5lIE9QRU5TU0xfTk9fSEVBUlRCRUFUUwotI2RlZmluZSBPUEVOU1NMX05PX0hXCi0jZGVmaW5lIE9QRU5TU0xfTk9fSURFQQotI2RlZmluZSBPUEVOU1NMX05PX0pQQUtFCi0jZGVmaW5lIE9QRU5TU0xfTk9fS1JCNQotI2RlZmluZSBPUEVOU1NMX05PX01EMgotI2RlZmluZSBPUEVOU1NMX05PX01EQzIKLSNkZWZpbmUgT1BFTlNTTF9OT19PQ0IKLSNkZWZpbmUgT1BFTlNTTF9OT19PQ1NQCi0jZGVmaW5lIE9QRU5TU0xfTk9fUkMyCi0jZGVmaW5lIE9QRU5TU0xfTk9fUkM1Ci0jZGVmaW5lIE9QRU5TU0xfTk9fUkZDMzc3OQotI2RlZmluZSBPUEVOU1NMX05PX1JJUEVNRAotI2RlZmluZSBPUEVOU1NMX05PX1JNRDE2MAotI2RlZmluZSBPUEVOU1NMX05PX1NDVFAKLSNkZWZpbmUgT1BFTlNTTF9OT19TRUVECi0jZGVmaW5lIE9QRU5TU0xfTk9fU1JQCi0jZGVmaW5lIE9QRU5TU0xfTk9fU1NMMgotI2RlZmluZSBPUEVOU1NMX05PX1NTTDMKLSNkZWZpbmUgT1BFTlNTTF9OT19TU0wzX01FVEhPRAotI2RlZmluZSBPUEVOU1NMX05PX1NUQVRJQ19FTkdJTkUKLSNkZWZpbmUgT1BFTlNTTF9OT19TVE9SRQotI2RlZmluZSBPUEVOU1NMX05PX1dISVJMUE9PTAotCi0KLSNlbmRpZiAgLy8gT1BFTlNTTF9IRUFERVJfT1BFTlNTTENPTkZfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL3BlbS5oIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL3BlbS5oCmluZGV4IGE0M2NhMGQuLjZiN2E2NzggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvcGVtLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogI2RlZmluZSBQRU1fVFlQRV9FTkNSWVBURUQgICAgICAxMAogI2RlZmluZSBQRU1fVFlQRV9NSUNfT05MWSAgICAgICAyMAogI2RlZmluZSBQRU1fVFlQRV9NSUNfQ0xFQVIgICAgICAzMAotI2RlZmluZSBQRU1fVFlQRV9DTEVBUgkJNDAKKyNkZWZpbmUgUEVNX1RZUEVfQ0xFQVIgICAgICAgICAgNDAKIAogLyogVGhlc2UgbWFjcm9zIG1ha2UgdGhlIFBFTV9yZWFkL1BFTV93cml0ZSBmdW5jdGlvbnMgZWFzaWVyIHRvIG1haW50YWluIGFuZAogICogd3JpdGUuIE5vdyB0aGV5IGFyZSBhbGwgaW1wbGVtZW50ZWQgd2l0aCBlaXRoZXI6CkBAIC0xMjcsNyArMTI3LDcgQEAKIE9QRU5TU0xfRVhQT1JUIHR5cGUgKlBFTV9yZWFkXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpXAogeyBcCiByZXR1cm4gKHR5cGUgKilQRU1fQVNOMV9yZWFkKChkMmlfb2Zfdm9pZCAqKWQyaV8jI2FzbjEsIHN0cixmcCwodm9pZCAqKil4LGNiLHUpOyBcCi19IAorfQogCiAjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCiBPUEVOU1NMX0VYUE9SVCBpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqeCkgXApAQCAtMjI5LDYgKzIyOSw3IEBACiAKICNkZWZpbmUgREVDTEFSRV9QRU1fcmVhZF9mcChuYW1lLCB0eXBlKSAvKiovCiAjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2ZwKG5hbWUsIHR5cGUpIC8qKi8KKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfZnBfY29uc3QobmFtZSwgdHlwZSkgLyoqLwogI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9jYl9mcChuYW1lLCB0eXBlKSAvKiovCiAKICNlbHNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsLmggYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wvc3NsLmgKaW5kZXggYzJhZmExNS4uZTcxNWYwZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL3NzbC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC9zc2wuaApAQCAtMTU0Nyw2ICsxNTQ3LDkyIEBACiAgICAgY29uc3QgdWludDhfdCAqY29udGV4dCwgc2l6ZV90IGNvbnRleHRfbGVuLCBpbnQgdXNlX2NvbnRleHQpOwogCiAKKy8vIEN1c3RvbSBleHRlbnNpb25zLgorLy8KKy8vIFRoZSBjdXN0b20gZXh0ZW5zaW9uIGZ1bmN0aW9ucyBhbGxvdyBUTFMgZXh0ZW5zaW9ucyB0byBiZSBhZGRlZCB0bworLy8gQ2xpZW50SGVsbG8gYW5kIFNlcnZlckhlbGxvIG1lc3NhZ2VzLgorCisvLyBTU0xfY3VzdG9tX2V4dF9hZGRfY2IgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZQorLy8gQ2xpZW50SGVsbG8gKGZvciBjbGllbnRzKSBvciBTZXJ2ZXJIZWxsbyAoZm9yIHNlcnZlcnMpIGlzIGNvbnN0cnVjdGVkLiBJbgorLy8gdGhlIGNhc2Ugb2YgYSBzZXJ2ZXIsIHRoaXMgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGNhbGxlZCBmb3IgYSBnaXZlbgorLy8gZXh0ZW5zaW9uIGlmIHRoZSBDbGllbnRIZWxsbyBjb250YWluZWQgdGhhdCBleHRlbnNpb24g4oCTIGl0J3Mgbm90IHBvc3NpYmxlIHRvCisvLyBpbmplY3QgZXh0ZW5zaW9ucyBpbnRvIGEgU2VydmVySGVsbG8gdGhhdCB0aGUgY2xpZW50IGRpZG4ndCByZXF1ZXN0LgorLy8KKy8vIFdoZW4gY2FsbGVkLCB8ZXh0ZW5zaW9uX3ZhbHVlfCB3aWxsIGNvbnRhaW4gdGhlIGV4dGVuc2lvbiBudW1iZXIgdGhhdCBpcworLy8gYmVpbmcgY29uc2lkZXJlZCBmb3IgYWRkaXRpb24gKHNvIHRoYXQgYSBzaW5nbGUgY2FsbGJhY2sgY2FuIGhhbmRsZSBtdWx0aXBsZQorLy8gZXh0ZW5zaW9ucykuIElmIHRoZSBjYWxsYmFjayB3aXNoZXMgdG8gaW5jbHVkZSB0aGUgZXh0ZW5zaW9uLCBpdCBtdXN0IHNldAorLy8gfCpvdXR8IHRvIHBvaW50IHRvIHwqb3V0X2xlbnwgYnl0ZXMgb2YgZXh0ZW5zaW9uIGNvbnRlbnRzIGFuZCByZXR1cm4gb25lLiBJbgorLy8gdGhpcyBjYXNlLCB0aGUgY29ycmVzcG9uZGluZyB8U1NMX2N1c3RvbV9leHRfZnJlZV9jYnwgY2FsbGJhY2sgd2lsbCBsYXRlciBiZQorLy8gY2FsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHwqb3V0fCBvbmNlIHRoYXQgZGF0YSBoYXMgYmVlbiBjb3BpZWQuCisvLworLy8gSWYgdGhlIGNhbGxiYWNrIGRvZXMgbm90IHdpc2ggdG8gYWRkIGFuIGV4dGVuc2lvbiBpdCBtdXN0IHJldHVybiB6ZXJvLgorLy8KKy8vIEFsdGVybmF0aXZlbHksIHRoZSBjYWxsYmFjayBjYW4gYWJvcnQgdGhlIGNvbm5lY3Rpb24gYnkgc2V0dGluZworLy8gfCpvdXRfYWxlcnRfdmFsdWV8IHRvIGEgVExTIGFsZXJ0IG51bWJlciBhbmQgcmV0dXJuaW5nIC0xLgordHlwZWRlZiBpbnQgKCpTU0xfY3VzdG9tX2V4dF9hZGRfY2IpKFNTTCAqc3NsLCB1bnNpZ25lZCBleHRlbnNpb25fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKm91dCwgc2l6ZV90ICpvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2FsZXJ0X3ZhbHVlLCB2b2lkICphZGRfYXJnKTsKKworLy8gU1NMX2N1c3RvbV9leHRfZnJlZV9jYiBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGJ5IE9wZW5TU0wgaWZmCisvLyBhbiB8U1NMX2N1c3RvbV9leHRfYWRkX2NifCBjYWxsYmFjayBwcmV2aW91c2x5IHJldHVybmVkIG9uZS4gSW4gdGhhdCBjYXNlLAorLy8gdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYW5kIHBhc3NlZCB0aGUgfG91dHwgcG9pbnRlciB0aGF0IHdhcyByZXR1cm5lZCBieQorLy8gdGhlIGFkZCBjYWxsYmFjay4gVGhpcyBpcyB0byBmcmVlIGFueSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBjcmVhdGVkIGJ5CisvLyB0aGUgYWRkIGNhbGxiYWNrLgordHlwZWRlZiB2b2lkICgqU1NMX2N1c3RvbV9leHRfZnJlZV9jYikoU1NMICpzc2wsIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm91dCwgdm9pZCAqYWRkX2FyZyk7CisKKy8vIFNTTF9jdXN0b21fZXh0X3BhcnNlX2NiIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgYnkgT3BlblNTTCB0bworLy8gcGFyc2UgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIHBlZXI6IHRoYXQgaXMgZnJvbSB0aGUgU2VydmVySGVsbG8gZm9yIGEgY2xpZW50CisvLyBhbmQgZnJvbSB0aGUgQ2xpZW50SGVsbG8gZm9yIGEgc2VydmVyLgorLy8KKy8vIFdoZW4gY2FsbGVkLCB8ZXh0ZW5zaW9uX3ZhbHVlfCB3aWxsIGNvbnRhaW4gdGhlIGV4dGVuc2lvbiBudW1iZXIgYW5kIHRoZQorLy8gY29udGVudHMgb2YgdGhlIGV4dGVuc2lvbiBhcmUgfGNvbnRlbnRzX2xlbnwgYnl0ZXMgYXQgfGNvbnRlbnRzfC4KKy8vCisvLyBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gb25lIHRvIGNvbnRpbnVlIHRoZSBoYW5kc2hha2UuIE90aGVyd2lzZSwgaWYgaXQKKy8vIHJldHVybnMgemVybywgYSBmYXRhbCBhbGVydCB3aXRoIHZhbHVlIHwqb3V0X2FsZXJ0X3ZhbHVlfCBpcyBzZW50IGFuZCB0aGUKKy8vIGhhbmRzaGFrZSBpcyBhYm9ydGVkLgordHlwZWRlZiBpbnQgKCpTU0xfY3VzdG9tX2V4dF9wYXJzZV9jYikoU1NMICpzc2wsIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnRlbnRzX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2FsZXJ0X3ZhbHVlLCB2b2lkICpwYXJzZV9hcmcpOworCisvLyBTU0xfZXh0ZW5zaW9uX3N1cHBvcnRlZCByZXR1cm5zIG9uZSBpZmYgT3BlblNTTCBpbnRlcm5hbGx5IGhhbmRsZXMKKy8vIGV4dGVuc2lvbnMgb2YgdHlwZSB8ZXh0ZW5zaW9uX3ZhbHVlfC4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCByZWdpc3RlcmluZworLy8gY3VzdG9tIGV4dGVuc2lvbiBoYW5kbGVycyBmb3IgZXh0ZW5zaW9ucyB0aGF0IGEgZnV0dXJlIHZlcnNpb24gb2YgT3BlblNTTAorLy8gbWF5IGhhbmRsZSBpbnRlcm5hbGx5LgorT1BFTlNTTF9FWFBPUlQgaW50IFNTTF9leHRlbnNpb25fc3VwcG9ydGVkKHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSk7CisKKy8vIFNTTF9DVFhfYWRkX2NsaWVudF9jdXN0b21fZXh0IHJlZ2lzdGVycyBjYWxsYmFjayBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nCisvLyBjdXN0b20gVExTIGV4dGVuc2lvbnMgZm9yIGNsaWVudCBjb25uZWN0aW9ucy4KKy8vCisvLyBJZiB8YWRkX2NifCBpcyBOVUxMIHRoZW4gYW4gZW1wdHkgZXh0ZW5zaW9uIHdpbGwgYmUgYWRkZWQgaW4gZWFjaAorLy8gQ2xpZW50SGVsbG8uIE90aGVyd2lzZSwgc2VlIHRoZSBjb21tZW50IGZvciB8U1NMX2N1c3RvbV9leHRfYWRkX2NifCBhYm91dAorLy8gdGhpcyBjYWxsYmFjay4KKy8vCisvLyBUaGUgfGZyZWVfY2J8IG1heSBiZSBOVUxMIGlmIHxhZGRfY2J8IGRvZXNuJ3QgZHluYW1pY2FsbHkgYWxsb2NhdGUgZGF0YSB0aGF0CisvLyBuZWVkcyB0byBiZSBmcmVlZC4KKy8vCisvLyBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gZXJyb3IuIEl0J3MgYWx3YXlzIGFuIGVycm9yIHRvIHJlZ2lzdGVyCisvLyBjYWxsYmFja3MgZm9yIHRoZSBzYW1lIGV4dGVuc2lvbiB0d2ljZSwgb3IgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIGZvciBhbgorLy8gZXh0ZW5zaW9uIHRoYXQgT3BlblNTTCBoYW5kbGVzIGludGVybmFsbHkuIFNlZSB8U1NMX2V4dGVuc2lvbl9zdXBwb3J0ZWR8IHRvCisvLyBkaXNjb3ZlciwgYXQgcnVudGltZSwgd2hpY2ggZXh0ZW5zaW9ucyBPcGVuU1NMIGhhbmRsZXMgaW50ZXJuYWxseS4KK09QRU5TU0xfRVhQT1JUIGludCBTU0xfQ1RYX2FkZF9jbGllbnRfY3VzdG9tX2V4dCgKKyAgICBTU0xfQ1RYICpjdHgsIHVuc2lnbmVkIGV4dGVuc2lvbl92YWx1ZSwgU1NMX2N1c3RvbV9leHRfYWRkX2NiIGFkZF9jYiwKKyAgICBTU0xfY3VzdG9tX2V4dF9mcmVlX2NiIGZyZWVfY2IsIHZvaWQgKmFkZF9hcmcsCisgICAgU1NMX2N1c3RvbV9leHRfcGFyc2VfY2IgcGFyc2VfY2IsIHZvaWQgKnBhcnNlX2FyZyk7CisKKy8vIFNTTF9DVFhfYWRkX3NlcnZlcl9jdXN0b21fZXh0IGlzIHRoZSBzYW1lIGFzCisvLyB8U1NMX0NUWF9hZGRfY2xpZW50X2N1c3RvbV9leHR8LCBidXQgZm9yIHNlcnZlciBjb25uZWN0aW9ucy4KKy8vCisvLyBVbmxpa2Ugb24gdGhlIGNsaWVudCBzaWRlLCBpZiB8YWRkX2NifCBpcyBOVUxMIG5vIGV4dGVuc2lvbiB3aWxsIGJlIGFkZGVkLgorLy8gVGhlIHxhZGRfY2J8LCBpZiBhbnksIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIENsaWVudEhlbGxvIGNvbnRhaW5lZCBhCisvLyBtYXRjaGluZyBleHRlbnNpb24uCitPUEVOU1NMX0VYUE9SVCBpbnQgU1NMX0NUWF9hZGRfc2VydmVyX2N1c3RvbV9leHQoCisgICAgU1NMX0NUWCAqY3R4LCB1bnNpZ25lZCBleHRlbnNpb25fdmFsdWUsIFNTTF9jdXN0b21fZXh0X2FkZF9jYiBhZGRfY2IsCisgICAgU1NMX2N1c3RvbV9leHRfZnJlZV9jYiBmcmVlX2NiLCB2b2lkICphZGRfYXJnLAorICAgIFNTTF9jdXN0b21fZXh0X3BhcnNlX2NiIHBhcnNlX2NiLCB2b2lkICpwYXJzZV9hcmcpOworCisKIC8vIFNlc3Npb25zLgogLy8KIC8vIEFuIHxTU0xfU0VTU0lPTnwgcmVwcmVzZW50cyBhbiBTU0wgc2Vzc2lvbiB0aGF0IG1heSBiZSByZXN1bWVkIGluIGFuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOS5oIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAppbmRleCBlZWFiNWVjLi5kNTc1MTZhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKQEAgLTY5NywxMCArNjk3LDEzIEBACiBPUEVOU1NMX0VYUE9SVCBpbnQgWDUwOV9OQU1FX2dldDBfZGVyKFg1MDlfTkFNRSAqbm0sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBkZXJsZW4pOwogCi1PUEVOU1NMX0VYUE9SVCBpbnQJCVg1MDlfY21wX3RpbWUoY29uc3QgQVNOMV9USU1FICpzLCB0aW1lX3QgKnQpOworT1BFTlNTTF9FWFBPUlQgaW50IFg1MDlfY21wX3RpbWUoY29uc3QgQVNOMV9USU1FICpzLCBPUEVOU1NMX3BvcnRfdGltZV90ICp0KTsKIE9QRU5TU0xfRVhQT1JUIGludAkJWDUwOV9jbXBfY3VycmVudF90aW1lKGNvbnN0IEFTTjFfVElNRSAqcyk7Ci1PUEVOU1NMX0VYUE9SVCBBU04xX1RJTUUgKglYNTA5X3RpbWVfYWRqKEFTTjFfVElNRSAqcywgbG9uZyBhZGosIHRpbWVfdCAqdCk7Ci1PUEVOU1NMX0VYUE9SVCBBU04xX1RJTUUgKglYNTA5X3RpbWVfYWRqX2V4KEFTTjFfVElNRSAqcywgaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYywgdGltZV90ICp0KTsKK09QRU5TU0xfRVhQT1JUIEFTTjFfVElNRSAqWDUwOV90aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgYWRqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF90aW1lX3QgKnQpOworT1BFTlNTTF9FWFBPUlQgQVNOMV9USU1FICpYNTA5X3RpbWVfYWRqX2V4KEFTTjFfVElNRSAqcywgaW50IG9mZnNldF9kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBvZmZzZXRfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF90aW1lX3QgKnQpOwogT1BFTlNTTF9FWFBPUlQgQVNOMV9USU1FICoJWDUwOV9nbXRpbWVfYWRqKEFTTjFfVElNRSAqcywgbG9uZyBhZGopOwogCiBPUEVOU1NMX0VYUE9SVCBjb25zdCBjaGFyICoJWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2FyZWEodm9pZCApOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaAppbmRleCA4NmFhNTQ2Li45Y2M0OTQyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaApAQCAtMTQ2LDkgKzE0Niw5IEBACiBzdHJ1Y3QgWDUwOV9WRVJJRllfUEFSQU1fc3QKIAl7CiAJY2hhciAqbmFtZTsKLQl0aW1lX3QgY2hlY2tfdGltZTsJLyogVGltZSB0byB1c2UgKi8KLQl1bnNpZ25lZCBsb25nIGluaF9mbGFnczsgLyogSW5oZXJpdGFuY2UgZmxhZ3MgKi8KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIHZlcmlmeSBmbGFncyAqLworICAgICAgICBPUEVOU1NMX3BvcnRfdGltZV90IGNoZWNrX3RpbWU7IC8qIFRpbWUgdG8gdXNlICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5oX2ZsYWdzOyAgICAgICAgLyogSW5oZXJpdGFuY2UgZmxhZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsJLyogVmFyaW91cyB2ZXJpZnkgZmxhZ3MgKi8KIAlpbnQgcHVycG9zZTsJCS8qIHB1cnBvc2UgdG8gY2hlY2sgdW50cnVzdGVkIGNlcnRpZmljYXRlcyAqLwogCWludCB0cnVzdDsJCS8qIHRydXN0IHNldHRpbmcgdG8gY2hlY2sgKi8KIAlpbnQgZGVwdGg7CQkvKiBWZXJpZnkgZGVwdGggKi8KQEAgLTU4Nyw4ICs1ODcsOSBAQAogT1BFTlNTTF9FWFBPUlQgaW50IFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdChYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgZGVmX3B1cnBvc2UsCiAJCQkJaW50IHB1cnBvc2UsIGludCB0cnVzdCk7CiBPUEVOU1NMX0VYUE9SVCB2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9mbGFncyhYNTA5X1NUT1JFX0NUWCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLU9QRU5TU0xfRVhQT1JUIHZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X3RpbWUoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJCQkJCQkJdGltZV90IHQpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfdGltZShYNTA5X1NUT1JFX0NUWCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX3BvcnRfdGltZV90IHQpOwogT1BFTlNTTF9FWFBPUlQgdm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKFg1MDlfU1RPUkVfQ1RYICpjdHgsCiAJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpOwogICAKQEAgLTYxNSw3ICs2MTYsOCBAQAogT1BFTlNTTF9FWFBPUlQgaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF9wdXJwb3NlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IHB1cnBvc2UpOwogT1BFTlNTTF9FWFBPUlQgaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCB0cnVzdCk7CiBPUEVOU1NMX0VYUE9SVCB2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF9kZXB0aChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCBkZXB0aCk7Ci1PUEVOU1NMX0VYUE9SVCB2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgdGltZV90IHQpOworT1BFTlNTTF9FWFBPUlQgdm9pZCBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfdGltZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF90aW1lX3QgdCk7CiBPUEVOU1NMX0VYUE9SVCBpbnQgWDUwOV9WRVJJRllfUEFSQU1fYWRkMF9wb2xpY3koWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLAogCQkJCQkJQVNOMV9PQkpFQ1QgKnBvbGljeSk7CiBPUEVOU1NMX0VYUE9SVCBpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0MV9wb2xpY2llcyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvc3NsL2hhbmRzaGFrZV9jbGllbnQuY2MgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9zc2wvaGFuZHNoYWtlX2NsaWVudC5jYwppbmRleCA5ZjllNDgzLi5lMmQ5ODkxIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9zc2wvaGFuZHNoYWtlX2NsaWVudC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9zc2wvaGFuZHNoYWtlX2NsaWVudC5jYwpAQCAtMTQ3LDE0ICsxNDcsMTUgQEAKICAqIE9USEVSV0lTRS4KICAqLwogCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KIAotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVhZC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgpAQCAtMTY3LDYgKzE2OCw4IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICIuLi9jcnlwdG8vaW50ZXJuYWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9zc2wvc3NsX2J1ZmZlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfYnVmZmVyLmNjCmluZGV4IDcyNjQ3YTQuLmI0ZDhhYzUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfYnVmZmVyLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfYnVmZmVyLmNjCkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgICAgICAgICJTU0wzX0FMSUdOX1BBWUxPQUQgbXVzdCBiZSBhIHBvd2VyIG9mIDIiKTsKIAogdm9pZCBTU0xCdWZmZXI6OkNsZWFyKCkgewotICBmcmVlKGJ1Zl8pOyAgLy8gQWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCisgIFNiTWVtb3J5RGVhbGxvY2F0ZShidWZfKTsgIC8vIEFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgogICBidWZfID0gbnVsbHB0cjsKICAgb2Zmc2V0XyA9IDA7CiAgIHNpemVfID0gMDsKQEAgLTU5LDcgKzU5LDEwIEBACiAgIC8vIFNpbmNlIHRoaXMgYnVmZmVyIGdldHMgYWxsb2NhdGVkIHF1aXRlIGZyZXF1ZW50bHkgYW5kIGRvZXNuJ3QgY29udGFpbiBhbnkKICAgLy8gc2Vuc2l0aXZlIGRhdGEsIHdlIGFsbG9jYXRlIHdpdGggbWFsbG9jIHJhdGhlciB0aGFuIHxPUEVOU1NMX21hbGxvY3wgYW5kCiAgIC8vIGF2b2lkIHplcm9pbmcgb24gZnJlZS4KLSAgdWludDhfdCAqbmV3X2J1ZiA9ICh1aW50OF90ICopbWFsbG9jKG5ld19jYXAgKyBTU0wzX0FMSUdOX1BBWUxPQUQgLSAxKTsKKyAgLy8KKyAgLy8gV2UgbmVlZCB0byB1c2UgU2JNZW1vcnlBbGxvY2F0ZSBpbiBzdGFyYm9hcmQuCisgIHVpbnQ4X3QgKm5ld19idWYgPQorICAgICAgKHVpbnQ4X3QgKilTYk1lbW9yeUFsbG9jYXRlKG5ld19jYXAgKyBTU0wzX0FMSUdOX1BBWUxPQUQgLSAxKTsKICAgaWYgKG5ld19idWYgPT0gTlVMTCkgewogICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNTTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTcxLDcgKzc0LDcgQEAKIAogICBpZiAoYnVmXyAhPSBOVUxMKSB7CiAgICAgT1BFTlNTTF9tZW1jcHkobmV3X2J1ZiArIG5ld19vZmZzZXQsIGJ1Zl8gKyBvZmZzZXRfLCBzaXplXyk7Ci0gICAgZnJlZShidWZfKTsgIC8vIEFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgorICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShidWZfKTsgIC8vIEFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgogICB9CiAKICAgYnVmXyA9IG5ld19idWY7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9zc2wvc3NsX2NpcGhlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfY2lwaGVyLmNjCmluZGV4IDU4OTk1MDAuLjgzZjllMmIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfY2lwaGVyLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfY2lwaGVyLmNjCkBAIC0xMzgsMTEgKzEzOCwxNCBAQAogICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCiAgKiBPVEhFUldJU0UuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQorI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgogCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2J1Zi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfeDUwOS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfeDUwOS5jYwppbmRleCBlZjA5NTg5Li5iOTk4MGU3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9zc2wvc3NsX3g1MDkuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvc3NsL3NzbF94NTA5LmNjCkBAIC0xMzgsMTAgKzEzOCwxMyBAQAogICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCiAgKiBPVEhFUldJU0UuICovCiAKLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZiAgLy8gIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQ0KKyNpbmNsdWRlIDxvcGVuc3NsL2Jhc2UuaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC90bHNfbWV0aG9kLmNjIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvc3NsL3Rsc19tZXRob2QuY2MKaW5kZXggMmFmNTE3MS4uY2FlYTdjNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvc3NsL3Rsc19tZXRob2QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvc3NsL3Rsc19tZXRob2QuY2MKQEAgLTU0LDExICs1NCwxMyBAQAogICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQogICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KIAotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1RBUkJPQVJEKQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmICAvLyAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiAKKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYnVmLmg+CiAKICNpbmNsdWRlICIuLi9jcnlwdG8vaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODYuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9jaGFjaGEvY2hhY2hhLXg4Ni5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhMzFhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODYuYXNtCkBAIC0wLDAgKzEsOTc3IEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorZ2xvYmFsCV9DaGFDaGEyMF9jdHIzMgorYWxpZ24JMTYKK19DaGFDaGEyMF9jdHIzMjoKK0wkX0NoYUNoYTIwX2N0cjMyX2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJeG9yCWVheCxlYXgKKwljbXAJZWF4LERXT1JEIFsyOCtlc3BdCisJamUJTkVBUiBMJDAwMG5vX2RhdGEKKwljYWxsCUwkcGljX3BvaW50CitMJHBpY19wb2ludDoKKwlwb3AJZWF4CisJbGVhCWVicCxbX09QRU5TU0xfaWEzMmNhcF9QXQorCXRlc3QJRFdPUkQgW2VicF0sMTY3NzcyMTYKKwlqeglORUFSIEwkMDAxeDg2CisJdGVzdAlEV09SRCBbNCtlYnBdLDUxMgorCWp6CU5FQVIgTCQwMDF4ODYKKwlqbXAJTkVBUiBMJHNzc2UzX3Nob3J0Y3V0CitMJDAwMXg4NjoKKwltb3YJZXNpLERXT1JEIFszMitlc3BdCisJbW92CWVkaSxEV09SRCBbMzYrZXNwXQorCXN1Ygllc3AsMTMyCisJbW92CWVheCxEV09SRCBbZXNpXQorCW1vdgllYngsRFdPUkQgWzQrZXNpXQorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VzaV0KKwltb3YJRFdPUkQgWzgwK2VzcF0sZWF4CisJbW92CURXT1JEIFs4NCtlc3BdLGVieAorCW1vdglEV09SRCBbODgrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzkyK2VzcF0sZWR4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCW1vdgllYngsRFdPUkQgWzIwK2VzaV0KKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CWVkeCxEV09SRCBbMjgrZXNpXQorCW1vdglEV09SRCBbOTYrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzEwMCtlc3BdLGVieAorCW1vdglEV09SRCBbMTA0K2VzcF0sZWN4CisJbW92CURXT1JEIFsxMDgrZXNwXSxlZHgKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVieCxEV09SRCBbNCtlZGldCisJbW92CWVjeCxEV09SRCBbOCtlZGldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCXN1YgllYXgsMQorCW1vdglEV09SRCBbMTEyK2VzcF0sZWF4CisJbW92CURXT1JEIFsxMTYrZXNwXSxlYngKKwltb3YJRFdPUkQgWzEyMCtlc3BdLGVjeAorCW1vdglEV09SRCBbMTI0K2VzcF0sZWR4CisJam1wCU5FQVIgTCQwMDJlbnRyeQorYWxpZ24JMTYKK0wkMDAzb3V0ZXJfbG9vcDoKKwltb3YJRFdPUkQgWzE1Nitlc3BdLGVieAorCW1vdglEV09SRCBbMTUyK2VzcF0sZWF4CisJbW92CURXT1JEIFsxNjArZXNwXSxlY3gKK0wkMDAyZW50cnk6CisJbW92CWVheCwxNjM0NzYwODA1CisJbW92CURXT1JEIFs0K2VzcF0sODU3NzYwODc4CisJbW92CURXT1JEIFs4K2VzcF0sMjAzNjQ3NzIzNAorCW1vdglEV09SRCBbMTIrZXNwXSwxNzk3Mjg1MjM2CisJbW92CWVieCxEV09SRCBbODQrZXNwXQorCW1vdgllYnAsRFdPUkQgWzg4K2VzcF0KKwltb3YJZWN4LERXT1JEIFsxMDQrZXNwXQorCW1vdgllc2ksRFdPUkQgWzEwOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMTE2K2VzcF0KKwltb3YJZWRpLERXT1JEIFsxMjArZXNwXQorCW1vdglEV09SRCBbMjArZXNwXSxlYngKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWJwCisJbW92CURXT1JEIFs0MCtlc3BdLGVjeAorCW1vdglEV09SRCBbNDQrZXNwXSxlc2kKKwltb3YJRFdPUkQgWzUyK2VzcF0sZWR4CisJbW92CURXT1JEIFs1Nitlc3BdLGVkaQorCW1vdgllYngsRFdPUkQgWzkyK2VzcF0KKwltb3YJZWRpLERXT1JEIFsxMjQrZXNwXQorCW1vdgllZHgsRFdPUkQgWzExMitlc3BdCisJbW92CWVicCxEV09SRCBbODArZXNwXQorCW1vdgllY3gsRFdPUkQgWzk2K2VzcF0KKwltb3YJZXNpLERXT1JEIFsxMDArZXNwXQorCWFkZAllZHgsMQorCW1vdglEV09SRCBbMjgrZXNwXSxlYngKKwltb3YJRFdPUkQgWzYwK2VzcF0sZWRpCisJbW92CURXT1JEIFsxMTIrZXNwXSxlZHgKKwltb3YJZWJ4LDEwCisJam1wCU5FQVIgTCQwMDRsb29wCithbGlnbgkxNgorTCQwMDRsb29wOgorCWFkZAllYXgsZWJwCisJbW92CURXT1JEIFsxMjgrZXNwXSxlYngKKwltb3YJZWJ4LGVicAorCXhvcgllZHgsZWF4CisJcm9sCWVkeCwxNgorCWFkZAllY3gsZWR4CisJeG9yCWVieCxlY3gKKwltb3YJZWRpLERXT1JEIFs1Mitlc3BdCisJcm9sCWVieCwxMgorCW1vdgllYnAsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWF4LGVieAorCXhvcgllZHgsZWF4CisJbW92CURXT1JEIFtlc3BdLGVheAorCXJvbAllZHgsOAorCW1vdgllYXgsRFdPUkQgWzQrZXNwXQorCWFkZAllY3gsZWR4CisJbW92CURXT1JEIFs0OCtlc3BdLGVkeAorCXhvcgllYngsZWN4CisJYWRkCWVheCxlYnAKKwlyb2wJZWJ4LDcKKwl4b3IJZWRpLGVheAorCW1vdglEV09SRCBbMzIrZXNwXSxlY3gKKwlyb2wJZWRpLDE2CisJbW92CURXT1JEIFsxNitlc3BdLGVieAorCWFkZAllc2ksZWRpCisJbW92CWVjeCxEV09SRCBbNDArZXNwXQorCXhvcgllYnAsZXNpCisJbW92CWVkeCxEV09SRCBbNTYrZXNwXQorCXJvbAllYnAsMTIKKwltb3YJZWJ4LERXT1JEIFsyNCtlc3BdCisJYWRkCWVheCxlYnAKKwl4b3IJZWRpLGVheAorCW1vdglEV09SRCBbNCtlc3BdLGVheAorCXJvbAllZGksOAorCW1vdgllYXgsRFdPUkQgWzgrZXNwXQorCWFkZAllc2ksZWRpCisJbW92CURXT1JEIFs1Mitlc3BdLGVkaQorCXhvcgllYnAsZXNpCisJYWRkCWVheCxlYngKKwlyb2wJZWJwLDcKKwl4b3IJZWR4LGVheAorCW1vdglEV09SRCBbMzYrZXNwXSxlc2kKKwlyb2wJZWR4LDE2CisJbW92CURXT1JEIFsyMCtlc3BdLGVicAorCWFkZAllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbNDQrZXNwXQorCXhvcgllYngsZWN4CisJbW92CWVkaSxEV09SRCBbNjArZXNwXQorCXJvbAllYngsMTIKKwltb3YJZWJwLERXT1JEIFsyOCtlc3BdCisJYWRkCWVheCxlYngKKwl4b3IJZWR4LGVheAorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXJvbAllZHgsOAorCW1vdgllYXgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWN4LGVkeAorCW1vdglEV09SRCBbNTYrZXNwXSxlZHgKKwl4b3IJZWJ4LGVjeAorCWFkZAllYXgsZWJwCisJcm9sCWVieCw3CisJeG9yCWVkaSxlYXgKKwlyb2wJZWRpLDE2CisJbW92CURXT1JEIFsyNCtlc3BdLGVieAorCWFkZAllc2ksZWRpCisJeG9yCWVicCxlc2kKKwlyb2wJZWJwLDEyCisJbW92CWVieCxEV09SRCBbMjArZXNwXQorCWFkZAllYXgsZWJwCisJeG9yCWVkaSxlYXgKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWF4CisJcm9sCWVkaSw4CisJbW92CWVheCxEV09SRCBbZXNwXQorCWFkZAllc2ksZWRpCisJbW92CWVkeCxlZGkKKwl4b3IJZWJwLGVzaQorCWFkZAllYXgsZWJ4CisJcm9sCWVicCw3CisJeG9yCWVkeCxlYXgKKwlyb2wJZWR4LDE2CisJbW92CURXT1JEIFsyOCtlc3BdLGVicAorCWFkZAllY3gsZWR4CisJeG9yCWVieCxlY3gKKwltb3YJZWRpLERXT1JEIFs0OCtlc3BdCisJcm9sCWVieCwxMgorCW1vdgllYnAsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVieAorCXhvcgllZHgsZWF4CisJbW92CURXT1JEIFtlc3BdLGVheAorCXJvbAllZHgsOAorCW1vdgllYXgsRFdPUkQgWzQrZXNwXQorCWFkZAllY3gsZWR4CisJbW92CURXT1JEIFs2MCtlc3BdLGVkeAorCXhvcgllYngsZWN4CisJYWRkCWVheCxlYnAKKwlyb2wJZWJ4LDcKKwl4b3IJZWRpLGVheAorCW1vdglEV09SRCBbNDArZXNwXSxlY3gKKwlyb2wJZWRpLDE2CisJbW92CURXT1JEIFsyMCtlc3BdLGVieAorCWFkZAllc2ksZWRpCisJbW92CWVjeCxEV09SRCBbMzIrZXNwXQorCXhvcgllYnAsZXNpCisJbW92CWVkeCxEV09SRCBbNTIrZXNwXQorCXJvbAllYnAsMTIKKwltb3YJZWJ4LERXT1JEIFsyOCtlc3BdCisJYWRkCWVheCxlYnAKKwl4b3IJZWRpLGVheAorCW1vdglEV09SRCBbNCtlc3BdLGVheAorCXJvbAllZGksOAorCW1vdgllYXgsRFdPUkQgWzgrZXNwXQorCWFkZAllc2ksZWRpCisJbW92CURXT1JEIFs0OCtlc3BdLGVkaQorCXhvcgllYnAsZXNpCisJYWRkCWVheCxlYngKKwlyb2wJZWJwLDcKKwl4b3IJZWR4LGVheAorCW1vdglEV09SRCBbNDQrZXNwXSxlc2kKKwlyb2wJZWR4LDE2CisJbW92CURXT1JEIFsyNCtlc3BdLGVicAorCWFkZAllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbMzYrZXNwXQorCXhvcgllYngsZWN4CisJbW92CWVkaSxEV09SRCBbNTYrZXNwXQorCXJvbAllYngsMTIKKwltb3YJZWJwLERXT1JEIFsxNitlc3BdCisJYWRkCWVheCxlYngKKwl4b3IJZWR4LGVheAorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXJvbAllZHgsOAorCW1vdgllYXgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWN4LGVkeAorCW1vdglEV09SRCBbNTIrZXNwXSxlZHgKKwl4b3IJZWJ4LGVjeAorCWFkZAllYXgsZWJwCisJcm9sCWVieCw3CisJeG9yCWVkaSxlYXgKKwlyb2wJZWRpLDE2CisJbW92CURXT1JEIFsyOCtlc3BdLGVieAorCWFkZAllc2ksZWRpCisJeG9yCWVicCxlc2kKKwltb3YJZWR4LERXT1JEIFs0OCtlc3BdCisJcm9sCWVicCwxMgorCW1vdgllYngsRFdPUkQgWzEyOCtlc3BdCisJYWRkCWVheCxlYnAKKwl4b3IJZWRpLGVheAorCW1vdglEV09SRCBbMTIrZXNwXSxlYXgKKwlyb2wJZWRpLDgKKwltb3YJZWF4LERXT1JEIFtlc3BdCisJYWRkCWVzaSxlZGkKKwltb3YJRFdPUkQgWzU2K2VzcF0sZWRpCisJeG9yCWVicCxlc2kKKwlyb2wJZWJwLDcKKwlkZWMJZWJ4CisJam56CU5FQVIgTCQwMDRsb29wCisJbW92CWVieCxEV09SRCBbMTYwK2VzcF0KKwlhZGQJZWF4LDE2MzQ3NjA4MDUKKwlhZGQJZWJwLERXT1JEIFs4MCtlc3BdCisJYWRkCWVjeCxEV09SRCBbOTYrZXNwXQorCWFkZAllc2ksRFdPUkQgWzEwMCtlc3BdCisJY21wCWVieCw2NAorCWpiCU5FQVIgTCQwMDV0YWlsCisJbW92CWVieCxEV09SRCBbMTU2K2VzcF0KKwlhZGQJZWR4LERXT1JEIFsxMTIrZXNwXQorCWFkZAllZGksRFdPUkQgWzEyMCtlc3BdCisJeG9yCWVheCxEV09SRCBbZWJ4XQorCXhvcgllYnAsRFdPUkQgWzE2K2VieF0KKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJbW92CWVheCxEV09SRCBbMTUyK2VzcF0KKwl4b3IJZWN4LERXT1JEIFszMitlYnhdCisJeG9yCWVzaSxEV09SRCBbMzYrZWJ4XQorCXhvcgllZHgsRFdPUkQgWzQ4K2VieF0KKwl4b3IJZWRpLERXT1JEIFs1NitlYnhdCisJbW92CURXT1JEIFsxNitlYXhdLGVicAorCW1vdglEV09SRCBbMzIrZWF4XSxlY3gKKwltb3YJRFdPUkQgWzM2K2VheF0sZXNpCisJbW92CURXT1JEIFs0OCtlYXhdLGVkeAorCW1vdglEV09SRCBbNTYrZWF4XSxlZGkKKwltb3YJZWJwLERXT1JEIFs0K2VzcF0KKwltb3YJZWN4LERXT1JEIFs4K2VzcF0KKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJbW92CWVkeCxEV09SRCBbMjArZXNwXQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWJwLDg1Nzc2MDg3OAorCWFkZAllY3gsMjAzNjQ3NzIzNAorCWFkZAllc2ksMTc5NzI4NTIzNgorCWFkZAllZHgsRFdPUkQgWzg0K2VzcF0KKwlhZGQJZWRpLERXT1JEIFs4OCtlc3BdCisJeG9yCWVicCxEV09SRCBbNCtlYnhdCisJeG9yCWVjeCxEV09SRCBbOCtlYnhdCisJeG9yCWVzaSxEV09SRCBbMTIrZWJ4XQorCXhvcgllZHgsRFdPUkQgWzIwK2VieF0KKwl4b3IJZWRpLERXT1JEIFsyNCtlYnhdCisJbW92CURXT1JEIFs0K2VheF0sZWJwCisJbW92CURXT1JEIFs4K2VheF0sZWN4CisJbW92CURXT1JEIFsxMitlYXhdLGVzaQorCW1vdglEV09SRCBbMjArZWF4XSxlZHgKKwltb3YJRFdPUkQgWzI0K2VheF0sZWRpCisJbW92CWVicCxEV09SRCBbMjgrZXNwXQorCW1vdgllY3gsRFdPUkQgWzQwK2VzcF0KKwltb3YJZXNpLERXT1JEIFs0NCtlc3BdCisJbW92CWVkeCxEV09SRCBbNTIrZXNwXQorCW1vdgllZGksRFdPUkQgWzYwK2VzcF0KKwlhZGQJZWJwLERXT1JEIFs5Mitlc3BdCisJYWRkCWVjeCxEV09SRCBbMTA0K2VzcF0KKwlhZGQJZXNpLERXT1JEIFsxMDgrZXNwXQorCWFkZAllZHgsRFdPUkQgWzExNitlc3BdCisJYWRkCWVkaSxEV09SRCBbMTI0K2VzcF0KKwl4b3IJZWJwLERXT1JEIFsyOCtlYnhdCisJeG9yCWVjeCxEV09SRCBbNDArZWJ4XQorCXhvcgllc2ksRFdPUkQgWzQ0K2VieF0KKwl4b3IJZWR4LERXT1JEIFs1MitlYnhdCisJeG9yCWVkaSxEV09SRCBbNjArZWJ4XQorCWxlYQllYngsWzY0K2VieF0KKwltb3YJRFdPUkQgWzI4K2VheF0sZWJwCisJbW92CWVicCxEV09SRCBbZXNwXQorCW1vdglEV09SRCBbNDArZWF4XSxlY3gKKwltb3YJZWN4LERXT1JEIFsxNjArZXNwXQorCW1vdglEV09SRCBbNDQrZWF4XSxlc2kKKwltb3YJRFdPUkQgWzUyK2VheF0sZWR4CisJbW92CURXT1JEIFs2MCtlYXhdLGVkaQorCW1vdglEV09SRCBbZWF4XSxlYnAKKwlsZWEJZWF4LFs2NCtlYXhdCisJc3ViCWVjeCw2NAorCWpueglORUFSIEwkMDAzb3V0ZXJfbG9vcAorCWptcAlORUFSIEwkMDA2ZG9uZQorTCQwMDV0YWlsOgorCWFkZAllZHgsRFdPUkQgWzExMitlc3BdCisJYWRkCWVkaSxEV09SRCBbMTIwK2VzcF0KKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJbW92CURXT1JEIFsxNitlc3BdLGVicAorCW1vdglEV09SRCBbMzIrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzM2K2VzcF0sZXNpCisJbW92CURXT1JEIFs0OCtlc3BdLGVkeAorCW1vdglEV09SRCBbNTYrZXNwXSxlZGkKKwltb3YJZWJwLERXT1JEIFs0K2VzcF0KKwltb3YJZWN4LERXT1JEIFs4K2VzcF0KKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJbW92CWVkeCxEV09SRCBbMjArZXNwXQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWJwLDg1Nzc2MDg3OAorCWFkZAllY3gsMjAzNjQ3NzIzNAorCWFkZAllc2ksMTc5NzI4NTIzNgorCWFkZAllZHgsRFdPUkQgWzg0K2VzcF0KKwlhZGQJZWRpLERXT1JEIFs4OCtlc3BdCisJbW92CURXT1JEIFs0K2VzcF0sZWJwCisJbW92CURXT1JEIFs4K2VzcF0sZWN4CisJbW92CURXT1JEIFsxMitlc3BdLGVzaQorCW1vdglEV09SRCBbMjArZXNwXSxlZHgKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWRpCisJbW92CWVicCxEV09SRCBbMjgrZXNwXQorCW1vdgllY3gsRFdPUkQgWzQwK2VzcF0KKwltb3YJZXNpLERXT1JEIFs0NCtlc3BdCisJbW92CWVkeCxEV09SRCBbNTIrZXNwXQorCW1vdgllZGksRFdPUkQgWzYwK2VzcF0KKwlhZGQJZWJwLERXT1JEIFs5Mitlc3BdCisJYWRkCWVjeCxEV09SRCBbMTA0K2VzcF0KKwlhZGQJZXNpLERXT1JEIFsxMDgrZXNwXQorCWFkZAllZHgsRFdPUkQgWzExNitlc3BdCisJYWRkCWVkaSxEV09SRCBbMTI0K2VzcF0KKwltb3YJRFdPUkQgWzI4K2VzcF0sZWJwCisJbW92CWVicCxEV09SRCBbMTU2K2VzcF0KKwltb3YJRFdPUkQgWzQwK2VzcF0sZWN4CisJbW92CWVjeCxEV09SRCBbMTUyK2VzcF0KKwltb3YJRFdPUkQgWzQ0K2VzcF0sZXNpCisJeG9yCWVzaSxlc2kKKwltb3YJRFdPUkQgWzUyK2VzcF0sZWR4CisJbW92CURXT1JEIFs2MCtlc3BdLGVkaQorCXhvcgllYXgsZWF4CisJeG9yCWVkeCxlZHgKK0wkMDA3dGFpbF9sb29wOgorCW1vdglhbCxCWVRFIFtlYnAqMStlc2ldCisJbW92CWRsLEJZVEUgW2VzaSoxK2VzcF0KKwlsZWEJZXNpLFsxK2VzaV0KKwl4b3IJYWwsZGwKKwltb3YJQllURSBbZXNpKjErZWN4LTFdLGFsCisJZGVjCWVieAorCWpueglORUFSIEwkMDA3dGFpbF9sb29wCitMJDAwNmRvbmU6CisJYWRkCWVzcCwxMzIKK0wkMDAwbm9fZGF0YToKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CitnbG9iYWwJX0NoYUNoYTIwX3Nzc2UzCithbGlnbgkxNgorX0NoYUNoYTIwX3Nzc2UzOgorTCRfQ2hhQ2hhMjBfc3NzZTNfYmVnaW46CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKK0wkc3NzZTNfc2hvcnRjdXQ6CisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwltb3YJZWN4LERXT1JEIFsyOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMzIrZXNwXQorCW1vdgllYngsRFdPUkQgWzM2K2VzcF0KKwltb3YJZWJwLGVzcAorCXN1Ygllc3AsNTI0CisJYW5kCWVzcCwtNjQKKwltb3YJRFdPUkQgWzUxMitlc3BdLGVicAorCWxlYQllYXgsWyhMJHNzc2UzX2RhdGEtTCRwaWNfcG9pbnQpK2VheF0KKwltb3ZkcXUJeG1tMyxbZWJ4XQorCWNtcAllY3gsMjU2CisJamIJTkVBUiBMJDAwODF4CisJbW92CURXT1JEIFs1MTYrZXNwXSxlZHgKKwltb3YJRFdPUkQgWzUyMCtlc3BdLGVieAorCXN1YgllY3gsMjU2CisJbGVhCWVicCxbMzg0K2VzcF0KKwltb3ZkcXUJeG1tNyxbZWR4XQorCXBzaHVmZAl4bW0wLHhtbTMsMAorCXBzaHVmZAl4bW0xLHhtbTMsODUKKwlwc2h1ZmQJeG1tMix4bW0zLDE3MAorCXBzaHVmZAl4bW0zLHhtbTMsMjU1CisJcGFkZGQJeG1tMCxbNDgrZWF4XQorCXBzaHVmZAl4bW00LHhtbTcsMAorCXBzaHVmZAl4bW01LHhtbTcsODUKKwlwc3ViZAl4bW0wLFs2NCtlYXhdCisJcHNodWZkCXhtbTYseG1tNywxNzAKKwlwc2h1ZmQJeG1tNyx4bW03LDI1NQorCW1vdmRxYQlbNjQrZWJwXSx4bW0wCisJbW92ZHFhCVs4MCtlYnBdLHhtbTEKKwltb3ZkcWEJWzk2K2VicF0seG1tMgorCW1vdmRxYQlbMTEyK2VicF0seG1tMworCW1vdmRxdQl4bW0zLFsxNitlZHhdCisJbW92ZHFhCVtlYnAtNjRdLHhtbTQKKwltb3ZkcWEJW2VicC00OF0seG1tNQorCW1vdmRxYQlbZWJwLTMyXSx4bW02CisJbW92ZHFhCVtlYnAtMTZdLHhtbTcKKwltb3ZkcWEJeG1tNyxbMzIrZWF4XQorCWxlYQllYngsWzEyOCtlc3BdCisJcHNodWZkCXhtbTAseG1tMywwCisJcHNodWZkCXhtbTEseG1tMyw4NQorCXBzaHVmZAl4bW0yLHhtbTMsMTcwCisJcHNodWZkCXhtbTMseG1tMywyNTUKKwlwc2h1ZmQJeG1tNCx4bW03LDAKKwlwc2h1ZmQJeG1tNSx4bW03LDg1CisJcHNodWZkCXhtbTYseG1tNywxNzAKKwlwc2h1ZmQJeG1tNyx4bW03LDI1NQorCW1vdmRxYQlbZWJwXSx4bW0wCisJbW92ZHFhCVsxNitlYnBdLHhtbTEKKwltb3ZkcWEJWzMyK2VicF0seG1tMgorCW1vdmRxYQlbNDgrZWJwXSx4bW0zCisJbW92ZHFhCVtlYnAtMTI4XSx4bW00CisJbW92ZHFhCVtlYnAtMTEyXSx4bW01CisJbW92ZHFhCVtlYnAtOTZdLHhtbTYKKwltb3ZkcWEJW2VicC04MF0seG1tNworCWxlYQllc2ksWzEyOCtlc2ldCisJbGVhCWVkaSxbMTI4K2VkaV0KKwlqbXAJTkVBUiBMJDAwOW91dGVyX2xvb3AKK2FsaWduCTE2CitMJDAwOW91dGVyX2xvb3A6CisJbW92ZHFhCXhtbTEsW2VicC0xMTJdCisJbW92ZHFhCXhtbTIsW2VicC05Nl0KKwltb3ZkcWEJeG1tMyxbZWJwLTgwXQorCW1vdmRxYQl4bW01LFtlYnAtNDhdCisJbW92ZHFhCXhtbTYsW2VicC0zMl0KKwltb3ZkcWEJeG1tNyxbZWJwLTE2XQorCW1vdmRxYQlbZWJ4LTExMl0seG1tMQorCW1vdmRxYQlbZWJ4LTk2XSx4bW0yCisJbW92ZHFhCVtlYngtODBdLHhtbTMKKwltb3ZkcWEJW2VieC00OF0seG1tNQorCW1vdmRxYQlbZWJ4LTMyXSx4bW02CisJbW92ZHFhCVtlYngtMTZdLHhtbTcKKwltb3ZkcWEJeG1tMixbMzIrZWJwXQorCW1vdmRxYQl4bW0zLFs0OCtlYnBdCisJbW92ZHFhCXhtbTQsWzY0K2VicF0KKwltb3ZkcWEJeG1tNSxbODArZWJwXQorCW1vdmRxYQl4bW02LFs5NitlYnBdCisJbW92ZHFhCXhtbTcsWzExMitlYnBdCisJcGFkZGQJeG1tNCxbNjQrZWF4XQorCW1vdmRxYQlbMzIrZWJ4XSx4bW0yCisJbW92ZHFhCVs0OCtlYnhdLHhtbTMKKwltb3ZkcWEJWzY0K2VieF0seG1tNAorCW1vdmRxYQlbODArZWJ4XSx4bW01CisJbW92ZHFhCVs5NitlYnhdLHhtbTYKKwltb3ZkcWEJWzExMitlYnhdLHhtbTcKKwltb3ZkcWEJWzY0K2VicF0seG1tNAorCW1vdmRxYQl4bW0wLFtlYnAtMTI4XQorCW1vdmRxYQl4bW02LHhtbTQKKwltb3ZkcWEJeG1tMyxbZWJwLTY0XQorCW1vdmRxYQl4bW00LFtlYnBdCisJbW92ZHFhCXhtbTUsWzE2K2VicF0KKwltb3YJZWR4LDEwCisJbm9wCithbGlnbgkxNgorTCQwMTBsb29wOgorCXBhZGRkCXhtbTAseG1tMworCW1vdmRxYQl4bW0yLHhtbTMKKwlweG9yCXhtbTYseG1tMAorCXBzaHVmYgl4bW02LFtlYXhdCisJcGFkZGQJeG1tNCx4bW02CisJcHhvcgl4bW0yLHhtbTQKKwltb3ZkcWEJeG1tMyxbZWJ4LTQ4XQorCW1vdmRxYQl4bW0xLHhtbTIKKwlwc2xsZAl4bW0yLDEyCisJcHNybGQJeG1tMSwyMAorCXBvcgl4bW0yLHhtbTEKKwltb3ZkcWEJeG1tMSxbZWJ4LTExMl0KKwlwYWRkZAl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tNyxbODArZWJ4XQorCXB4b3IJeG1tNix4bW0wCisJbW92ZHFhCVtlYngtMTI4XSx4bW0wCisJcHNodWZiCXhtbTYsWzE2K2VheF0KKwlwYWRkZAl4bW00LHhtbTYKKwltb3ZkcWEJWzY0K2VieF0seG1tNgorCXB4b3IJeG1tMix4bW00CisJcGFkZGQJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTAseG1tMgorCXBzbGxkCXhtbTIsNworCXBzcmxkCXhtbTAsMjUKKwlweG9yCXhtbTcseG1tMQorCXBvcgl4bW0yLHhtbTAKKwltb3ZkcWEJW2VieF0seG1tNAorCXBzaHVmYgl4bW03LFtlYXhdCisJbW92ZHFhCVtlYngtNjRdLHhtbTIKKwlwYWRkZAl4bW01LHhtbTcKKwltb3ZkcWEJeG1tNCxbMzIrZWJ4XQorCXB4b3IJeG1tMyx4bW01CisJbW92ZHFhCXhtbTIsW2VieC0zMl0KKwltb3ZkcWEJeG1tMCx4bW0zCisJcHNsbGQJeG1tMywxMgorCXBzcmxkCXhtbTAsMjAKKwlwb3IJeG1tMyx4bW0wCisJbW92ZHFhCXhtbTAsW2VieC05Nl0KKwlwYWRkZAl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tNixbOTYrZWJ4XQorCXB4b3IJeG1tNyx4bW0xCisJbW92ZHFhCVtlYngtMTEyXSx4bW0xCisJcHNodWZiCXhtbTcsWzE2K2VheF0KKwlwYWRkZAl4bW01LHhtbTcKKwltb3ZkcWEJWzgwK2VieF0seG1tNworCXB4b3IJeG1tMyx4bW01CisJcGFkZGQJeG1tMCx4bW0yCisJbW92ZHFhCXhtbTEseG1tMworCXBzbGxkCXhtbTMsNworCXBzcmxkCXhtbTEsMjUKKwlweG9yCXhtbTYseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcWEJWzE2K2VieF0seG1tNQorCXBzaHVmYgl4bW02LFtlYXhdCisJbW92ZHFhCVtlYngtNDhdLHhtbTMKKwlwYWRkZAl4bW00LHhtbTYKKwltb3ZkcWEJeG1tNSxbNDgrZWJ4XQorCXB4b3IJeG1tMix4bW00CisJbW92ZHFhCXhtbTMsW2VieC0xNl0KKwltb3ZkcWEJeG1tMSx4bW0yCisJcHNsbGQJeG1tMiwxMgorCXBzcmxkCXhtbTEsMjAKKwlwb3IJeG1tMix4bW0xCisJbW92ZHFhCXhtbTEsW2VieC04MF0KKwlwYWRkZAl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tNyxbMTEyK2VieF0KKwlweG9yCXhtbTYseG1tMAorCW1vdmRxYQlbZWJ4LTk2XSx4bW0wCisJcHNodWZiCXhtbTYsWzE2K2VheF0KKwlwYWRkZAl4bW00LHhtbTYKKwltb3ZkcWEJWzk2K2VieF0seG1tNgorCXB4b3IJeG1tMix4bW00CisJcGFkZGQJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTAseG1tMgorCXBzbGxkCXhtbTIsNworCXBzcmxkCXhtbTAsMjUKKwlweG9yCXhtbTcseG1tMQorCXBvcgl4bW0yLHhtbTAKKwlwc2h1ZmIJeG1tNyxbZWF4XQorCW1vdmRxYQlbZWJ4LTMyXSx4bW0yCisJcGFkZGQJeG1tNSx4bW03CisJcHhvcgl4bW0zLHhtbTUKKwltb3ZkcWEJeG1tMixbZWJ4LTQ4XQorCW1vdmRxYQl4bW0wLHhtbTMKKwlwc2xsZAl4bW0zLDEyCisJcHNybGQJeG1tMCwyMAorCXBvcgl4bW0zLHhtbTAKKwltb3ZkcWEJeG1tMCxbZWJ4LTEyOF0KKwlwYWRkZAl4bW0xLHhtbTMKKwlweG9yCXhtbTcseG1tMQorCW1vdmRxYQlbZWJ4LTgwXSx4bW0xCisJcHNodWZiCXhtbTcsWzE2K2VheF0KKwlwYWRkZAl4bW01LHhtbTcKKwltb3ZkcWEJeG1tNix4bW03CisJcHhvcgl4bW0zLHhtbTUKKwlwYWRkZAl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMSx4bW0zCisJcHNsbGQJeG1tMyw3CisJcHNybGQJeG1tMSwyNQorCXB4b3IJeG1tNix4bW0wCisJcG9yCXhtbTMseG1tMQorCXBzaHVmYgl4bW02LFtlYXhdCisJbW92ZHFhCVtlYngtMTZdLHhtbTMKKwlwYWRkZAl4bW00LHhtbTYKKwlweG9yCXhtbTIseG1tNAorCW1vdmRxYQl4bW0zLFtlYngtMzJdCisJbW92ZHFhCXhtbTEseG1tMgorCXBzbGxkCXhtbTIsMTIKKwlwc3JsZAl4bW0xLDIwCisJcG9yCXhtbTIseG1tMQorCW1vdmRxYQl4bW0xLFtlYngtMTEyXQorCXBhZGRkCXhtbTAseG1tMgorCW1vdmRxYQl4bW03LFs2NCtlYnhdCisJcHhvcgl4bW02LHhtbTAKKwltb3ZkcWEJW2VieC0xMjhdLHhtbTAKKwlwc2h1ZmIJeG1tNixbMTYrZWF4XQorCXBhZGRkCXhtbTQseG1tNgorCW1vdmRxYQlbMTEyK2VieF0seG1tNgorCXB4b3IJeG1tMix4bW00CisJcGFkZGQJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTAseG1tMgorCXBzbGxkCXhtbTIsNworCXBzcmxkCXhtbTAsMjUKKwlweG9yCXhtbTcseG1tMQorCXBvcgl4bW0yLHhtbTAKKwltb3ZkcWEJWzMyK2VieF0seG1tNAorCXBzaHVmYgl4bW03LFtlYXhdCisJbW92ZHFhCVtlYngtNDhdLHhtbTIKKwlwYWRkZAl4bW01LHhtbTcKKwltb3ZkcWEJeG1tNCxbZWJ4XQorCXB4b3IJeG1tMyx4bW01CisJbW92ZHFhCXhtbTIsW2VieC0xNl0KKwltb3ZkcWEJeG1tMCx4bW0zCisJcHNsbGQJeG1tMywxMgorCXBzcmxkCXhtbTAsMjAKKwlwb3IJeG1tMyx4bW0wCisJbW92ZHFhCXhtbTAsW2VieC05Nl0KKwlwYWRkZAl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tNixbODArZWJ4XQorCXB4b3IJeG1tNyx4bW0xCisJbW92ZHFhCVtlYngtMTEyXSx4bW0xCisJcHNodWZiCXhtbTcsWzE2K2VheF0KKwlwYWRkZAl4bW01LHhtbTcKKwltb3ZkcWEJWzY0K2VieF0seG1tNworCXB4b3IJeG1tMyx4bW01CisJcGFkZGQJeG1tMCx4bW0yCisJbW92ZHFhCXhtbTEseG1tMworCXBzbGxkCXhtbTMsNworCXBzcmxkCXhtbTEsMjUKKwlweG9yCXhtbTYseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcWEJWzQ4K2VieF0seG1tNQorCXBzaHVmYgl4bW02LFtlYXhdCisJbW92ZHFhCVtlYngtMzJdLHhtbTMKKwlwYWRkZAl4bW00LHhtbTYKKwltb3ZkcWEJeG1tNSxbMTYrZWJ4XQorCXB4b3IJeG1tMix4bW00CisJbW92ZHFhCXhtbTMsW2VieC02NF0KKwltb3ZkcWEJeG1tMSx4bW0yCisJcHNsbGQJeG1tMiwxMgorCXBzcmxkCXhtbTEsMjAKKwlwb3IJeG1tMix4bW0xCisJbW92ZHFhCXhtbTEsW2VieC04MF0KKwlwYWRkZAl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tNyxbOTYrZWJ4XQorCXB4b3IJeG1tNix4bW0wCisJbW92ZHFhCVtlYngtOTZdLHhtbTAKKwlwc2h1ZmIJeG1tNixbMTYrZWF4XQorCXBhZGRkCXhtbTQseG1tNgorCW1vdmRxYQlbODArZWJ4XSx4bW02CisJcHhvcgl4bW0yLHhtbTQKKwlwYWRkZAl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tMCx4bW0yCisJcHNsbGQJeG1tMiw3CisJcHNybGQJeG1tMCwyNQorCXB4b3IJeG1tNyx4bW0xCisJcG9yCXhtbTIseG1tMAorCXBzaHVmYgl4bW03LFtlYXhdCisJbW92ZHFhCVtlYngtMTZdLHhtbTIKKwlwYWRkZAl4bW01LHhtbTcKKwlweG9yCXhtbTMseG1tNQorCW1vdmRxYQl4bW0wLHhtbTMKKwlwc2xsZAl4bW0zLDEyCisJcHNybGQJeG1tMCwyMAorCXBvcgl4bW0zLHhtbTAKKwltb3ZkcWEJeG1tMCxbZWJ4LTEyOF0KKwlwYWRkZAl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tNixbNjQrZWJ4XQorCXB4b3IJeG1tNyx4bW0xCisJbW92ZHFhCVtlYngtODBdLHhtbTEKKwlwc2h1ZmIJeG1tNyxbMTYrZWF4XQorCXBhZGRkCXhtbTUseG1tNworCW1vdmRxYQlbOTYrZWJ4XSx4bW03CisJcHhvcgl4bW0zLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW0zCisJcHNsbGQJeG1tMyw3CisJcHNybGQJeG1tMSwyNQorCXBvcgl4bW0zLHhtbTEKKwlkZWMJZWR4CisJam56CU5FQVIgTCQwMTBsb29wCisJbW92ZHFhCVtlYngtNjRdLHhtbTMKKwltb3ZkcWEJW2VieF0seG1tNAorCW1vdmRxYQlbMTYrZWJ4XSx4bW01CisJbW92ZHFhCVs2NCtlYnhdLHhtbTYKKwltb3ZkcWEJWzk2K2VieF0seG1tNworCW1vdmRxYQl4bW0xLFtlYngtMTEyXQorCW1vdmRxYQl4bW0yLFtlYngtOTZdCisJbW92ZHFhCXhtbTMsW2VieC04MF0KKwlwYWRkZAl4bW0wLFtlYnAtMTI4XQorCXBhZGRkCXhtbTEsW2VicC0xMTJdCisJcGFkZGQJeG1tMixbZWJwLTk2XQorCXBhZGRkCXhtbTMsW2VicC04MF0KKwltb3ZkcWEJeG1tNix4bW0wCisJcHVucGNrbGRxCXhtbTAseG1tMQorCW1vdmRxYQl4bW03LHhtbTIKKwlwdW5wY2tsZHEJeG1tMix4bW0zCisJcHVucGNraGRxCXhtbTYseG1tMQorCXB1bnBja2hkcQl4bW03LHhtbTMKKwltb3ZkcWEJeG1tMSx4bW0wCisJcHVucGNrbHFkcQl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMyx4bW02CisJcHVucGNrbHFkcQl4bW02LHhtbTcKKwlwdW5wY2tocWRxCXhtbTEseG1tMgorCXB1bnBja2hxZHEJeG1tMyx4bW03CisJbW92ZHF1CXhtbTQsW2VzaS0xMjhdCisJbW92ZHF1CXhtbTUsW2VzaS02NF0KKwltb3ZkcXUJeG1tMixbZXNpXQorCW1vdmRxdQl4bW03LFs2NCtlc2ldCisJbGVhCWVzaSxbMTYrZXNpXQorCXB4b3IJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTAsW2VieC02NF0KKwlweG9yCXhtbTUseG1tMQorCW1vdmRxYQl4bW0xLFtlYngtNDhdCisJcHhvcgl4bW02LHhtbTIKKwltb3ZkcWEJeG1tMixbZWJ4LTMyXQorCXB4b3IJeG1tNyx4bW0zCisJbW92ZHFhCXhtbTMsW2VieC0xNl0KKwltb3ZkcXUJW2VkaS0xMjhdLHhtbTQKKwltb3ZkcXUJW2VkaS02NF0seG1tNQorCW1vdmRxdQlbZWRpXSx4bW02CisJbW92ZHF1CVs2NCtlZGldLHhtbTcKKwlsZWEJZWRpLFsxNitlZGldCisJcGFkZGQJeG1tMCxbZWJwLTY0XQorCXBhZGRkCXhtbTEsW2VicC00OF0KKwlwYWRkZAl4bW0yLFtlYnAtMzJdCisJcGFkZGQJeG1tMyxbZWJwLTE2XQorCW1vdmRxYQl4bW02LHhtbTAKKwlwdW5wY2tsZHEJeG1tMCx4bW0xCisJbW92ZHFhCXhtbTcseG1tMgorCXB1bnBja2xkcQl4bW0yLHhtbTMKKwlwdW5wY2toZHEJeG1tNix4bW0xCisJcHVucGNraGRxCXhtbTcseG1tMworCW1vdmRxYQl4bW0xLHhtbTAKKwlwdW5wY2tscWRxCXhtbTAseG1tMgorCW1vdmRxYQl4bW0zLHhtbTYKKwlwdW5wY2tscWRxCXhtbTYseG1tNworCXB1bnBja2hxZHEJeG1tMSx4bW0yCisJcHVucGNraHFkcQl4bW0zLHhtbTcKKwltb3ZkcXUJeG1tNCxbZXNpLTEyOF0KKwltb3ZkcXUJeG1tNSxbZXNpLTY0XQorCW1vdmRxdQl4bW0yLFtlc2ldCisJbW92ZHF1CXhtbTcsWzY0K2VzaV0KKwlsZWEJZXNpLFsxNitlc2ldCisJcHhvcgl4bW00LHhtbTAKKwltb3ZkcWEJeG1tMCxbZWJ4XQorCXB4b3IJeG1tNSx4bW0xCisJbW92ZHFhCXhtbTEsWzE2K2VieF0KKwlweG9yCXhtbTYseG1tMgorCW1vdmRxYQl4bW0yLFszMitlYnhdCisJcHhvcgl4bW03LHhtbTMKKwltb3ZkcWEJeG1tMyxbNDgrZWJ4XQorCW1vdmRxdQlbZWRpLTEyOF0seG1tNAorCW1vdmRxdQlbZWRpLTY0XSx4bW01CisJbW92ZHF1CVtlZGldLHhtbTYKKwltb3ZkcXUJWzY0K2VkaV0seG1tNworCWxlYQllZGksWzE2K2VkaV0KKwlwYWRkZAl4bW0wLFtlYnBdCisJcGFkZGQJeG1tMSxbMTYrZWJwXQorCXBhZGRkCXhtbTIsWzMyK2VicF0KKwlwYWRkZAl4bW0zLFs0OCtlYnBdCisJbW92ZHFhCXhtbTYseG1tMAorCXB1bnBja2xkcQl4bW0wLHhtbTEKKwltb3ZkcWEJeG1tNyx4bW0yCisJcHVucGNrbGRxCXhtbTIseG1tMworCXB1bnBja2hkcQl4bW02LHhtbTEKKwlwdW5wY2toZHEJeG1tNyx4bW0zCisJbW92ZHFhCXhtbTEseG1tMAorCXB1bnBja2xxZHEJeG1tMCx4bW0yCisJbW92ZHFhCXhtbTMseG1tNgorCXB1bnBja2xxZHEJeG1tNix4bW03CisJcHVucGNraHFkcQl4bW0xLHhtbTIKKwlwdW5wY2tocWRxCXhtbTMseG1tNworCW1vdmRxdQl4bW00LFtlc2ktMTI4XQorCW1vdmRxdQl4bW01LFtlc2ktNjRdCisJbW92ZHF1CXhtbTIsW2VzaV0KKwltb3ZkcXUJeG1tNyxbNjQrZXNpXQorCWxlYQllc2ksWzE2K2VzaV0KKwlweG9yCXhtbTQseG1tMAorCW1vdmRxYQl4bW0wLFs2NCtlYnhdCisJcHhvcgl4bW01LHhtbTEKKwltb3ZkcWEJeG1tMSxbODArZWJ4XQorCXB4b3IJeG1tNix4bW0yCisJbW92ZHFhCXhtbTIsWzk2K2VieF0KKwlweG9yCXhtbTcseG1tMworCW1vdmRxYQl4bW0zLFsxMTIrZWJ4XQorCW1vdmRxdQlbZWRpLTEyOF0seG1tNAorCW1vdmRxdQlbZWRpLTY0XSx4bW01CisJbW92ZHF1CVtlZGldLHhtbTYKKwltb3ZkcXUJWzY0K2VkaV0seG1tNworCWxlYQllZGksWzE2K2VkaV0KKwlwYWRkZAl4bW0wLFs2NCtlYnBdCisJcGFkZGQJeG1tMSxbODArZWJwXQorCXBhZGRkCXhtbTIsWzk2K2VicF0KKwlwYWRkZAl4bW0zLFsxMTIrZWJwXQorCW1vdmRxYQl4bW02LHhtbTAKKwlwdW5wY2tsZHEJeG1tMCx4bW0xCisJbW92ZHFhCXhtbTcseG1tMgorCXB1bnBja2xkcQl4bW0yLHhtbTMKKwlwdW5wY2toZHEJeG1tNix4bW0xCisJcHVucGNraGRxCXhtbTcseG1tMworCW1vdmRxYQl4bW0xLHhtbTAKKwlwdW5wY2tscWRxCXhtbTAseG1tMgorCW1vdmRxYQl4bW0zLHhtbTYKKwlwdW5wY2tscWRxCXhtbTYseG1tNworCXB1bnBja2hxZHEJeG1tMSx4bW0yCisJcHVucGNraHFkcQl4bW0zLHhtbTcKKwltb3ZkcXUJeG1tNCxbZXNpLTEyOF0KKwltb3ZkcXUJeG1tNSxbZXNpLTY0XQorCW1vdmRxdQl4bW0yLFtlc2ldCisJbW92ZHF1CXhtbTcsWzY0K2VzaV0KKwlsZWEJZXNpLFsyMDgrZXNpXQorCXB4b3IJeG1tNCx4bW0wCisJcHhvcgl4bW01LHhtbTEKKwlweG9yCXhtbTYseG1tMgorCXB4b3IJeG1tNyx4bW0zCisJbW92ZHF1CVtlZGktMTI4XSx4bW00CisJbW92ZHF1CVtlZGktNjRdLHhtbTUKKwltb3ZkcXUJW2VkaV0seG1tNgorCW1vdmRxdQlbNjQrZWRpXSx4bW03CisJbGVhCWVkaSxbMjA4K2VkaV0KKwlzdWIJZWN4LDI1NgorCWpuYwlORUFSIEwkMDA5b3V0ZXJfbG9vcAorCWFkZAllY3gsMjU2CisJanoJTkVBUiBMJDAxMWRvbmUKKwltb3YJZWJ4LERXT1JEIFs1MjArZXNwXQorCWxlYQllc2ksW2VzaS0xMjhdCisJbW92CWVkeCxEV09SRCBbNTE2K2VzcF0KKwlsZWEJZWRpLFtlZGktMTI4XQorCW1vdmQJeG1tMixEV09SRCBbNjQrZWJwXQorCW1vdmRxdQl4bW0zLFtlYnhdCisJcGFkZGQJeG1tMixbOTYrZWF4XQorCXBhbmQJeG1tMyxbMTEyK2VheF0KKwlwb3IJeG1tMyx4bW0yCitMJDAwODF4OgorCW1vdmRxYQl4bW0wLFszMitlYXhdCisJbW92ZHF1CXhtbTEsW2VkeF0KKwltb3ZkcXUJeG1tMixbMTYrZWR4XQorCW1vdmRxYQl4bW02LFtlYXhdCisJbW92ZHFhCXhtbTcsWzE2K2VheF0KKwltb3YJRFdPUkQgWzQ4K2VzcF0sZWJwCisJbW92ZHFhCVtlc3BdLHhtbTAKKwltb3ZkcWEJWzE2K2VzcF0seG1tMQorCW1vdmRxYQlbMzIrZXNwXSx4bW0yCisJbW92ZHFhCVs0OCtlc3BdLHhtbTMKKwltb3YJZWR4LDEwCisJam1wCU5FQVIgTCQwMTJsb29wMXgKK2FsaWduCTE2CitMJDAxM291dGVyMXg6CisJbW92ZHFhCXhtbTMsWzgwK2VheF0KKwltb3ZkcWEJeG1tMCxbZXNwXQorCW1vdmRxYQl4bW0xLFsxNitlc3BdCisJbW92ZHFhCXhtbTIsWzMyK2VzcF0KKwlwYWRkZAl4bW0zLFs0OCtlc3BdCisJbW92CWVkeCwxMAorCW1vdmRxYQlbNDgrZXNwXSx4bW0zCisJam1wCU5FQVIgTCQwMTJsb29wMXgKK2FsaWduCTE2CitMJDAxMmxvb3AxeDoKKwlwYWRkZAl4bW0wLHhtbTEKKwlweG9yCXhtbTMseG1tMAorZGIJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJeG1tMix4bW0zCisJcHhvcgl4bW0xLHhtbTIKKwltb3ZkcWEJeG1tNCx4bW0xCisJcHNybGQJeG1tMSwyMAorCXBzbGxkCXhtbTQsMTIKKwlwb3IJeG1tMSx4bW00CisJcGFkZGQJeG1tMCx4bW0xCisJcHhvcgl4bW0zLHhtbTAKK2RiCTEwMiwxNSw1NiwwLDIyMworCXBhZGRkCXhtbTIseG1tMworCXB4b3IJeG1tMSx4bW0yCisJbW92ZHFhCXhtbTQseG1tMQorCXBzcmxkCXhtbTEsMjUKKwlwc2xsZAl4bW00LDcKKwlwb3IJeG1tMSx4bW00CisJcHNodWZkCXhtbTIseG1tMiw3OAorCXBzaHVmZAl4bW0xLHhtbTEsNTcKKwlwc2h1ZmQJeG1tMyx4bW0zLDE0NworCW5vcAorCXBhZGRkCXhtbTAseG1tMQorCXB4b3IJeG1tMyx4bW0wCitkYgkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAl4bW0yLHhtbTMKKwlweG9yCXhtbTEseG1tMgorCW1vdmRxYQl4bW00LHhtbTEKKwlwc3JsZAl4bW0xLDIwCisJcHNsbGQJeG1tNCwxMgorCXBvcgl4bW0xLHhtbTQKKwlwYWRkZAl4bW0wLHhtbTEKKwlweG9yCXhtbTMseG1tMAorZGIJMTAyLDE1LDU2LDAsMjIzCisJcGFkZGQJeG1tMix4bW0zCisJcHhvcgl4bW0xLHhtbTIKKwltb3ZkcWEJeG1tNCx4bW0xCisJcHNybGQJeG1tMSwyNQorCXBzbGxkCXhtbTQsNworCXBvcgl4bW0xLHhtbTQKKwlwc2h1ZmQJeG1tMix4bW0yLDc4CisJcHNodWZkCXhtbTEseG1tMSwxNDcKKwlwc2h1ZmQJeG1tMyx4bW0zLDU3CisJZGVjCWVkeAorCWpueglORUFSIEwkMDEybG9vcDF4CisJcGFkZGQJeG1tMCxbZXNwXQorCXBhZGRkCXhtbTEsWzE2K2VzcF0KKwlwYWRkZAl4bW0yLFszMitlc3BdCisJcGFkZGQJeG1tMyxbNDgrZXNwXQorCWNtcAllY3gsNjQKKwlqYglORUFSIEwkMDE0dGFpbAorCW1vdmRxdQl4bW00LFtlc2ldCisJbW92ZHF1CXhtbTUsWzE2K2VzaV0KKwlweG9yCXhtbTAseG1tNAorCW1vdmRxdQl4bW00LFszMitlc2ldCisJcHhvcgl4bW0xLHhtbTUKKwltb3ZkcXUJeG1tNSxbNDgrZXNpXQorCXB4b3IJeG1tMix4bW00CisJcHhvcgl4bW0zLHhtbTUKKwlsZWEJZXNpLFs2NCtlc2ldCisJbW92ZHF1CVtlZGldLHhtbTAKKwltb3ZkcXUJWzE2K2VkaV0seG1tMQorCW1vdmRxdQlbMzIrZWRpXSx4bW0yCisJbW92ZHF1CVs0OCtlZGldLHhtbTMKKwlsZWEJZWRpLFs2NCtlZGldCisJc3ViCWVjeCw2NAorCWpueglORUFSIEwkMDEzb3V0ZXIxeAorCWptcAlORUFSIEwkMDExZG9uZQorTCQwMTR0YWlsOgorCW1vdmRxYQlbZXNwXSx4bW0wCisJbW92ZHFhCVsxNitlc3BdLHhtbTEKKwltb3ZkcWEJWzMyK2VzcF0seG1tMgorCW1vdmRxYQlbNDgrZXNwXSx4bW0zCisJeG9yCWVheCxlYXgKKwl4b3IJZWR4LGVkeAorCXhvcgllYnAsZWJwCitMJDAxNXRhaWxfbG9vcDoKKwltb3YJYWwsQllURSBbZWJwKjErZXNwXQorCW1vdglkbCxCWVRFIFtlYnAqMStlc2ldCisJbGVhCWVicCxbMStlYnBdCisJeG9yCWFsLGRsCisJbW92CUJZVEUgW2VicCoxK2VkaS0xXSxhbAorCWRlYwllY3gKKwlqbnoJTkVBUiBMJDAxNXRhaWxfbG9vcAorTCQwMTFkb25lOgorCW1vdgllc3AsRFdPUkQgWzUxMitlc3BdCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JNjQKK0wkc3NzZTNfZGF0YToKK2RiCTIsMywwLDEsNiw3LDQsNSwxMCwxMSw4LDksMTQsMTUsMTIsMTMKK2RiCTMsMCwxLDIsNyw0LDUsNiwxMSw4LDksMTAsMTUsMTIsMTMsMTQKK2RkCTE2MzQ3NjA4MDUsODU3NzYwODc4LDIwMzY0NzcyMzQsMTc5NzI4NTIzNgorZGQJMCwxLDIsMworZGQJNCw0LDQsNAorZGQJMSwwLDAsMAorZGQJNCwwLDAsMAorZGQJMCwtMSwtMSwtMQorYWxpZ24JNjQKK2RiCTY3LDEwNCw5Nyw2NywxMDQsOTcsNTAsNDgsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0CitkYgk0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIKK2RiCTYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExCitkYgkxMTQsMTAzLDYyLDAKK3NlZ21lbnQJLmJzcworY29tbW9uCV9PUEVOU1NMX2lhMzJjYXBfUCAxNgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2Flcy01ODYuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2Flcy01ODYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzFmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzLTU4Ni5hc20KQEAgLTAsMCArMSwzMjE5IEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorYWxpZ24JMTYKK19feDg2X0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJbW92CURXT1JEIFsyMCtlc3BdLGVkaQorCXhvcgllYXgsRFdPUkQgW2VkaV0KKwl4b3IJZWJ4LERXT1JEIFs0K2VkaV0KKwl4b3IJZWN4LERXT1JEIFs4K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsxMitlZGldCisJbW92CWVzaSxEV09SRCBbMjQwK2VkaV0KKwlsZWEJZXNpLFtlc2kqMStlc2ktMl0KKwlsZWEJZXNpLFtlc2kqOCtlZGldCisJbW92CURXT1JEIFsyNCtlc3BdLGVzaQorCW1vdgllZGksRFdPUkQgW2VicC0xMjhdCisJbW92CWVzaSxEV09SRCBbZWJwLTk2XQorCW1vdgllZGksRFdPUkQgW2VicC02NF0KKwltb3YJZXNpLERXT1JEIFtlYnAtMzJdCisJbW92CWVkaSxEV09SRCBbZWJwXQorCW1vdgllc2ksRFdPUkQgWzMyK2VicF0KKwltb3YJZWRpLERXT1JEIFs2NCtlYnBdCisJbW92CWVzaSxEV09SRCBbOTYrZWJwXQorYWxpZ24JMTYKK0wkMDAwbG9vcDoKKwltb3YJZXNpLGVheAorCWFuZAllc2ksMjU1CisJbW92engJZXNpLEJZVEUgW2VzaSoxK2VicC0xMjhdCisJbW92engJZWRpLGJoCisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSw4CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVjeAorCXNocgllZGksMTYKKwlhbmQJZWRpLDI1NQorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMTYKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWR4CisJc2hyCWVkaSwyNAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMjQKKwl4b3IJZXNpLGVkaQorCW1vdglEV09SRCBbNCtlc3BdLGVzaQorCW1vdgllc2ksZWJ4CisJYW5kCWVzaSwyNTUKKwlzaHIJZWJ4LDE2CisJbW92engJZXNpLEJZVEUgW2VzaSoxK2VicC0xMjhdCisJbW92engJZWRpLGNoCisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSw4CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVkeAorCXNocgllZGksMTYKKwlhbmQJZWRpLDI1NQorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMTYKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWF4CisJc2hyCWVkaSwyNAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMjQKKwl4b3IJZXNpLGVkaQorCW1vdglEV09SRCBbOCtlc3BdLGVzaQorCW1vdgllc2ksZWN4CisJYW5kCWVzaSwyNTUKKwlzaHIJZWN4LDI0CisJbW92engJZXNpLEJZVEUgW2VzaSoxK2VicC0xMjhdCisJbW92engJZWRpLGRoCisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSw4CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVheAorCXNocgllZGksMTYKKwlhbmQJZWR4LDI1NQorCWFuZAllZGksMjU1CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwxNgorCXhvcgllc2ksZWRpCisJbW92engJZWRpLGJoCisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwyNAorCXhvcgllc2ksZWRpCisJYW5kCWVkeCwyNTUKKwltb3Z6eAllZHgsQllURSBbZWR4KjErZWJwLTEyOF0KKwltb3Z6eAllYXgsYWgKKwltb3Z6eAllYXgsQllURSBbZWF4KjErZWJwLTEyOF0KKwlzaGwJZWF4LDgKKwl4b3IJZWR4LGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNwXQorCWFuZAllYngsMjU1CisJbW92engJZWJ4LEJZVEUgW2VieCoxK2VicC0xMjhdCisJc2hsCWVieCwxNgorCXhvcgllZHgsZWJ4CisJbW92CWVieCxEV09SRCBbOCtlc3BdCisJbW92engJZWN4LEJZVEUgW2VjeCoxK2VicC0xMjhdCisJc2hsCWVjeCwyNAorCXhvcgllZHgsZWN4CisJbW92CWVjeCxlc2kKKwltb3YJZWJwLDIxNTU5MDUxNTIKKwlhbmQJZWJwLGVjeAorCWxlYQllZGksW2VjeCoxK2VjeF0KKwltb3YJZXNpLGVicAorCXNocgllYnAsNworCWFuZAllZGksNDI3ODEyNDI4NgorCXN1Ygllc2ksZWJwCisJbW92CWVicCxlY3gKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXJvcgllYnAsMTYKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWN4CisJeG9yCWVjeCxlc2kKKwlyb3IJZWRpLDI0CisJeG9yCWVzaSxlYnAKKwlyb2wJZWN4LDI0CisJeG9yCWVzaSxlZGkKKwltb3YJZWJwLDIxNTU5MDUxNTIKKwl4b3IJZWN4LGVzaQorCWFuZAllYnAsZWR4CisJbGVhCWVkaSxbZWR4KjErZWR4XQorCW1vdgllc2ksZWJwCisJc2hyCWVicCw3CisJYW5kCWVkaSw0Mjc4MTI0Mjg2CisJc3ViCWVzaSxlYnAKKwltb3YJZWJwLGVkeAorCWFuZAllc2ksNDU0NzYxMjQzCisJcm9yCWVicCwxNgorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlZHgKKwl4b3IJZWR4LGVzaQorCXJvcgllZGksMjQKKwl4b3IJZXNpLGVicAorCXJvbAllZHgsMjQKKwl4b3IJZXNpLGVkaQorCW1vdgllYnAsMjE1NTkwNTE1MgorCXhvcgllZHgsZXNpCisJYW5kCWVicCxlYXgKKwlsZWEJZWRpLFtlYXgqMStlYXhdCisJbW92CWVzaSxlYnAKKwlzaHIJZWJwLDcKKwlhbmQJZWRpLDQyNzgxMjQyODYKKwlzdWIJZXNpLGVicAorCW1vdgllYnAsZWF4CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwlyb3IJZWJwLDE2CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVheAorCXhvcgllYXgsZXNpCisJcm9yCWVkaSwyNAorCXhvcgllc2ksZWJwCisJcm9sCWVheCwyNAorCXhvcgllc2ksZWRpCisJbW92CWVicCwyMTU1OTA1MTUyCisJeG9yCWVheCxlc2kKKwlhbmQJZWJwLGVieAorCWxlYQllZGksW2VieCoxK2VieF0KKwltb3YJZXNpLGVicAorCXNocgllYnAsNworCWFuZAllZGksNDI3ODEyNDI4NgorCXN1Ygllc2ksZWJwCisJbW92CWVicCxlYngKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXJvcgllYnAsMTYKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWJ4CisJeG9yCWVieCxlc2kKKwlyb3IJZWRpLDI0CisJeG9yCWVzaSxlYnAKKwlyb2wJZWJ4LDI0CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVzaQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwltb3YJZWJwLERXT1JEIFsyOCtlc3BdCisJYWRkCWVkaSwxNgorCXhvcgllYXgsRFdPUkQgW2VkaV0KKwl4b3IJZWJ4LERXT1JEIFs0K2VkaV0KKwl4b3IJZWN4LERXT1JEIFs4K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsxMitlZGldCisJY21wCWVkaSxEV09SRCBbMjQrZXNwXQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwlqYglORUFSIEwkMDAwbG9vcAorCW1vdgllc2ksZWF4CisJYW5kCWVzaSwyNTUKKwltb3Z6eAllc2ksQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYmgKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDgKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWN4CisJc2hyCWVkaSwxNgorCWFuZAllZGksMjU1CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwxNgorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlZHgKKwlzaHIJZWRpLDI0CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwyNAorCXhvcgllc2ksZWRpCisJbW92CURXT1JEIFs0K2VzcF0sZXNpCisJbW92CWVzaSxlYngKKwlhbmQJZXNpLDI1NQorCXNocgllYngsMTYKKwltb3Z6eAllc2ksQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksY2gKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDgKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWR4CisJc2hyCWVkaSwxNgorCWFuZAllZGksMjU1CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwxNgorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlYXgKKwlzaHIJZWRpLDI0CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwyNAorCXhvcgllc2ksZWRpCisJbW92CURXT1JEIFs4K2VzcF0sZXNpCisJbW92CWVzaSxlY3gKKwlhbmQJZXNpLDI1NQorCXNocgllY3gsMjQKKwltb3Z6eAllc2ksQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksZGgKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDgKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWF4CisJc2hyCWVkaSwxNgorCWFuZAllZHgsMjU1CisJYW5kCWVkaSwyNTUKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDE2CisJeG9yCWVzaSxlZGkKKwltb3Z6eAllZGksYmgKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDI0CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJYW5kCWVkeCwyNTUKKwltb3Z6eAllZHgsQllURSBbZWR4KjErZWJwLTEyOF0KKwltb3Z6eAllYXgsYWgKKwltb3Z6eAllYXgsQllURSBbZWF4KjErZWJwLTEyOF0KKwlzaGwJZWF4LDgKKwl4b3IJZWR4LGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNwXQorCWFuZAllYngsMjU1CisJbW92engJZWJ4LEJZVEUgW2VieCoxK2VicC0xMjhdCisJc2hsCWVieCwxNgorCXhvcgllZHgsZWJ4CisJbW92CWVieCxEV09SRCBbOCtlc3BdCisJbW92engJZWN4LEJZVEUgW2VjeCoxK2VicC0xMjhdCisJc2hsCWVjeCwyNAorCXhvcgllZHgsZWN4CisJbW92CWVjeCxlc2kKKwl4b3IJZWF4LERXT1JEIFsxNitlZGldCisJeG9yCWVieCxEV09SRCBbMjArZWRpXQorCXhvcgllY3gsRFdPUkQgWzI0K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsyOCtlZGldCisJcmV0CithbGlnbgkxNgorX19zc2VfQUVTX2VuY3J5cHRfY29tcGFjdDoKKwlweG9yCW1tMCxbZWRpXQorCXB4b3IJbW00LFs4K2VkaV0KKwltb3YJZXNpLERXT1JEIFsyNDArZWRpXQorCWxlYQllc2ksW2VzaSoxK2VzaS0yXQorCWxlYQllc2ksW2VzaSo4K2VkaV0KKwltb3YJRFdPUkQgWzI0K2VzcF0sZXNpCisJbW92CWVheCw0NTQ3NjEyNDMKKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWF4CisJbW92CWVheCxEV09SRCBbZWJwLTEyOF0KKwltb3YJZWJ4LERXT1JEIFtlYnAtOTZdCisJbW92CWVjeCxEV09SRCBbZWJwLTY0XQorCW1vdgllZHgsRFdPUkQgW2VicC0zMl0KKwltb3YJZWF4LERXT1JEIFtlYnBdCisJbW92CWVieCxEV09SRCBbMzIrZWJwXQorCW1vdgllY3gsRFdPUkQgWzY0K2VicF0KKwltb3YJZWR4LERXT1JEIFs5NitlYnBdCithbGlnbgkxNgorTCQwMDFsb29wOgorCXBzaHVmdwltbTEsbW0wLDgKKwlwc2h1ZncJbW01LG1tNCwxMworCW1vdmQJZWF4LG1tMQorCW1vdmQJZWJ4LG1tNQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwltb3Z6eAllc2ksYWwKKwltb3Z6eAllZHgsYWgKKwlwc2h1ZncJbW0yLG1tMCwxMworCW1vdnp4CWVjeCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxibAorCW1vdnp4CWVkeCxCWVRFIFtlZHgqMStlYnAtMTI4XQorCXNocgllYXgsMTYKKwlzaGwJZWR4LDgKKwltb3Z6eAllc2ksQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYmgKKwlzaGwJZXNpLDE2CisJcHNodWZ3CW1tNixtbTQsOAorCW9yCWVjeCxlc2kKKwltb3Z6eAllc2ksQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYWgKKwlzaGwJZXNpLDI0CisJc2hyCWVieCwxNgorCW9yCWVkeCxlc2kKKwltb3Z6eAllc2ksQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYmgKKwlzaGwJZXNpLDgKKwlvcgllY3gsZXNpCisJbW92engJZXNpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJbW92engJZWRpLGFsCisJc2hsCWVzaSwyNAorCW9yCWVjeCxlc2kKKwltb3Z6eAllc2ksQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYmwKKwltb3ZkCWVheCxtbTIKKwltb3ZkCW1tMCxlY3gKKwltb3Z6eAllY3gsQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYWgKKwlzaGwJZWN4LDE2CisJbW92ZAllYngsbW02CisJb3IJZWN4LGVzaQorCW1vdnp4CWVzaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxiaAorCXNobAllc2ksMjQKKwlvcgllY3gsZXNpCisJbW92engJZXNpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJbW92engJZWRpLGJsCisJc2hsCWVzaSw4CisJc2hyCWVieCwxNgorCW9yCWVjeCxlc2kKKwltb3Z6eAllc2ksQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYWwKKwlzaHIJZWF4LDE2CisJbW92ZAltbTEsZWN4CisJbW92engJZWN4LEJZVEUgW2VkaSoxK2VicC0xMjhdCisJbW92engJZWRpLGFoCisJc2hsCWVjeCwxNgorCWFuZAllYXgsMjU1CisJb3IJZWN4LGVzaQorCXB1bnBja2xkcQltbTAsbW0xCisJbW92engJZXNpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJbW92engJZWRpLGJoCisJc2hsCWVzaSwyNAorCWFuZAllYngsMjU1CisJbW92engJZWF4LEJZVEUgW2VheCoxK2VicC0xMjhdCisJb3IJZWN4LGVzaQorCXNobAllYXgsMTYKKwltb3Z6eAllc2ksQllURSBbZWRpKjErZWJwLTEyOF0KKwlvcgllZHgsZWF4CisJc2hsCWVzaSw4CisJbW92engJZWJ4LEJZVEUgW2VieCoxK2VicC0xMjhdCisJb3IJZWN4LGVzaQorCW9yCWVkeCxlYngKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJbW92ZAltbTQsZWN4CisJbW92ZAltbTUsZWR4CisJcHVucGNrbGRxCW1tNCxtbTUKKwlhZGQJZWRpLDE2CisJY21wCWVkaSxEV09SRCBbMjQrZXNwXQorCWphCU5FQVIgTCQwMDJvdXQKKwltb3ZxCW1tMixbOCtlc3BdCisJcHhvcgltbTMsbW0zCisJcHhvcgltbTcsbW03CisJbW92cQltbTEsbW0wCisJbW92cQltbTUsbW00CisJcGNtcGd0YgltbTMsbW0wCisJcGNtcGd0YgltbTcsbW00CisJcGFuZAltbTMsbW0yCisJcGFuZAltbTcsbW0yCisJcHNodWZ3CW1tMixtbTAsMTc3CisJcHNodWZ3CW1tNixtbTQsMTc3CisJcGFkZGIJbW0wLG1tMAorCXBhZGRiCW1tNCxtbTQKKwlweG9yCW1tMCxtbTMKKwlweG9yCW1tNCxtbTcKKwlwc2h1ZncJbW0zLG1tMiwxNzcKKwlwc2h1ZncJbW03LG1tNiwxNzcKKwlweG9yCW1tMSxtbTAKKwlweG9yCW1tNSxtbTQKKwlweG9yCW1tMCxtbTIKKwlweG9yCW1tNCxtbTYKKwltb3ZxCW1tMixtbTMKKwltb3ZxCW1tNixtbTcKKwlwc2xsZAltbTMsOAorCXBzbGxkCW1tNyw4CisJcHNybGQJbW0yLDI0CisJcHNybGQJbW02LDI0CisJcHhvcgltbTAsbW0zCisJcHhvcgltbTQsbW03CisJcHhvcgltbTAsbW0yCisJcHhvcgltbTQsbW02CisJbW92cQltbTMsbW0xCisJbW92cQltbTcsbW01CisJbW92cQltbTIsW2VkaV0KKwltb3ZxCW1tNixbOCtlZGldCisJcHNybGQJbW0xLDgKKwlwc3JsZAltbTUsOAorCW1vdgllYXgsRFdPUkQgW2VicC0xMjhdCisJcHNsbGQJbW0zLDI0CisJcHNsbGQJbW03LDI0CisJbW92CWVieCxEV09SRCBbZWJwLTY0XQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW00LG1tNQorCW1vdgllY3gsRFdPUkQgW2VicF0KKwlweG9yCW1tMCxtbTMKKwlweG9yCW1tNCxtbTcKKwltb3YJZWR4LERXT1JEIFs2NCtlYnBdCisJcHhvcgltbTAsbW0yCisJcHhvcgltbTQsbW02CisJam1wCU5FQVIgTCQwMDFsb29wCithbGlnbgkxNgorTCQwMDJvdXQ6CisJcHhvcgltbTAsW2VkaV0KKwlweG9yCW1tNCxbOCtlZGldCisJcmV0CithbGlnbgkxNgorX194ODZfQUVTX2VuY3J5cHQ6CisJbW92CURXT1JEIFsyMCtlc3BdLGVkaQorCXhvcgllYXgsRFdPUkQgW2VkaV0KKwl4b3IJZWJ4LERXT1JEIFs0K2VkaV0KKwl4b3IJZWN4LERXT1JEIFs4K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsxMitlZGldCisJbW92CWVzaSxEV09SRCBbMjQwK2VkaV0KKwlsZWEJZXNpLFtlc2kqMStlc2ktMl0KKwlsZWEJZXNpLFtlc2kqOCtlZGldCisJbW92CURXT1JEIFsyNCtlc3BdLGVzaQorYWxpZ24JMTYKK0wkMDAzbG9vcDoKKwltb3YJZXNpLGVheAorCWFuZAllc2ksMjU1CisJbW92CWVzaSxEV09SRCBbZXNpKjgrZWJwXQorCW1vdnp4CWVkaSxiaAorCXhvcgllc2ksRFdPUkQgWzMrZWRpKjgrZWJwXQorCW1vdgllZGksZWN4CisJc2hyCWVkaSwxNgorCWFuZAllZGksMjU1CisJeG9yCWVzaSxEV09SRCBbMitlZGkqOCtlYnBdCisJbW92CWVkaSxlZHgKKwlzaHIJZWRpLDI0CisJeG9yCWVzaSxEV09SRCBbMStlZGkqOCtlYnBdCisJbW92CURXT1JEIFs0K2VzcF0sZXNpCisJbW92CWVzaSxlYngKKwlhbmQJZXNpLDI1NQorCXNocgllYngsMTYKKwltb3YJZXNpLERXT1JEIFtlc2kqOCtlYnBdCisJbW92engJZWRpLGNoCisJeG9yCWVzaSxEV09SRCBbMytlZGkqOCtlYnBdCisJbW92CWVkaSxlZHgKKwlzaHIJZWRpLDE2CisJYW5kCWVkaSwyNTUKKwl4b3IJZXNpLERXT1JEIFsyK2VkaSo4K2VicF0KKwltb3YJZWRpLGVheAorCXNocgllZGksMjQKKwl4b3IJZXNpLERXT1JEIFsxK2VkaSo4K2VicF0KKwltb3YJRFdPUkQgWzgrZXNwXSxlc2kKKwltb3YJZXNpLGVjeAorCWFuZAllc2ksMjU1CisJc2hyCWVjeCwyNAorCW1vdgllc2ksRFdPUkQgW2VzaSo4K2VicF0KKwltb3Z6eAllZGksZGgKKwl4b3IJZXNpLERXT1JEIFszK2VkaSo4K2VicF0KKwltb3YJZWRpLGVheAorCXNocgllZGksMTYKKwlhbmQJZWR4LDI1NQorCWFuZAllZGksMjU1CisJeG9yCWVzaSxEV09SRCBbMitlZGkqOCtlYnBdCisJbW92engJZWRpLGJoCisJeG9yCWVzaSxEV09SRCBbMStlZGkqOCtlYnBdCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllZHgsRFdPUkQgW2VkeCo4K2VicF0KKwltb3Z6eAllYXgsYWgKKwl4b3IJZWR4LERXT1JEIFszK2VheCo4K2VicF0KKwltb3YJZWF4LERXT1JEIFs0K2VzcF0KKwlhbmQJZWJ4LDI1NQorCXhvcgllZHgsRFdPUkQgWzIrZWJ4KjgrZWJwXQorCW1vdgllYngsRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsRFdPUkQgWzErZWN4KjgrZWJwXQorCW1vdgllY3gsZXNpCisJYWRkCWVkaSwxNgorCXhvcgllYXgsRFdPUkQgW2VkaV0KKwl4b3IJZWJ4LERXT1JEIFs0K2VkaV0KKwl4b3IJZWN4LERXT1JEIFs4K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsxMitlZGldCisJY21wCWVkaSxEV09SRCBbMjQrZXNwXQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwlqYglORUFSIEwkMDAzbG9vcAorCW1vdgllc2ksZWF4CisJYW5kCWVzaSwyNTUKKwltb3YJZXNpLERXT1JEIFsyK2VzaSo4K2VicF0KKwlhbmQJZXNpLDI1NQorCW1vdnp4CWVkaSxiaAorCW1vdgllZGksRFdPUkQgW2VkaSo4K2VicF0KKwlhbmQJZWRpLDY1MjgwCisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVjeAorCXNocgllZGksMTYKKwlhbmQJZWRpLDI1NQorCW1vdgllZGksRFdPUkQgW2VkaSo4K2VicF0KKwlhbmQJZWRpLDE2NzExNjgwCisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVkeAorCXNocgllZGksMjQKKwltb3YJZWRpLERXT1JEIFsyK2VkaSo4K2VicF0KKwlhbmQJZWRpLDQyNzgxOTAwODAKKwl4b3IJZXNpLGVkaQorCW1vdglEV09SRCBbNCtlc3BdLGVzaQorCW1vdgllc2ksZWJ4CisJYW5kCWVzaSwyNTUKKwlzaHIJZWJ4LDE2CisJbW92CWVzaSxEV09SRCBbMitlc2kqOCtlYnBdCisJYW5kCWVzaSwyNTUKKwltb3Z6eAllZGksY2gKKwltb3YJZWRpLERXT1JEIFtlZGkqOCtlYnBdCisJYW5kCWVkaSw2NTI4MAorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlZHgKKwlzaHIJZWRpLDE2CisJYW5kCWVkaSwyNTUKKwltb3YJZWRpLERXT1JEIFtlZGkqOCtlYnBdCisJYW5kCWVkaSwxNjcxMTY4MAorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlYXgKKwlzaHIJZWRpLDI0CisJbW92CWVkaSxEV09SRCBbMitlZGkqOCtlYnBdCisJYW5kCWVkaSw0Mjc4MTkwMDgwCisJeG9yCWVzaSxlZGkKKwltb3YJRFdPUkQgWzgrZXNwXSxlc2kKKwltb3YJZXNpLGVjeAorCWFuZAllc2ksMjU1CisJc2hyCWVjeCwyNAorCW1vdgllc2ksRFdPUkQgWzIrZXNpKjgrZWJwXQorCWFuZAllc2ksMjU1CisJbW92engJZWRpLGRoCisJbW92CWVkaSxEV09SRCBbZWRpKjgrZWJwXQorCWFuZAllZGksNjUyODAKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWF4CisJc2hyCWVkaSwxNgorCWFuZAllZHgsMjU1CisJYW5kCWVkaSwyNTUKKwltb3YJZWRpLERXT1JEIFtlZGkqOCtlYnBdCisJYW5kCWVkaSwxNjcxMTY4MAorCXhvcgllc2ksZWRpCisJbW92engJZWRpLGJoCisJbW92CWVkaSxEV09SRCBbMitlZGkqOCtlYnBdCisJYW5kCWVkaSw0Mjc4MTkwMDgwCisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJYW5kCWVkeCwyNTUKKwltb3YJZWR4LERXT1JEIFsyK2VkeCo4K2VicF0KKwlhbmQJZWR4LDI1NQorCW1vdnp4CWVheCxhaAorCW1vdgllYXgsRFdPUkQgW2VheCo4K2VicF0KKwlhbmQJZWF4LDY1MjgwCisJeG9yCWVkeCxlYXgKKwltb3YJZWF4LERXT1JEIFs0K2VzcF0KKwlhbmQJZWJ4LDI1NQorCW1vdgllYngsRFdPUkQgW2VieCo4K2VicF0KKwlhbmQJZWJ4LDE2NzExNjgwCisJeG9yCWVkeCxlYngKKwltb3YJZWJ4LERXT1JEIFs4K2VzcF0KKwltb3YJZWN4LERXT1JEIFsyK2VjeCo4K2VicF0KKwlhbmQJZWN4LDQyNzgxOTAwODAKKwl4b3IJZWR4LGVjeAorCW1vdgllY3gsZXNpCisJYWRkCWVkaSwxNgorCXhvcgllYXgsRFdPUkQgW2VkaV0KKwl4b3IJZWJ4LERXT1JEIFs0K2VkaV0KKwl4b3IJZWN4LERXT1JEIFs4K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsxMitlZGldCisJcmV0CithbGlnbgk2NAorTCRBRVNfVGU6CitkZAkyNzc0NzU0MjQ2LDI3NzQ3NTQyNDYKK2RkCTIyMjI3NTA5NjgsMjIyMjc1MDk2OAorZGQJMjU3NDc0MzUzNCwyNTc0NzQzNTM0CitkZAkyMzczNjgwMTE4LDIzNzM2ODAxMTgKK2RkCTIzNDAyNTcyNywyMzQwMjU3MjcKK2RkCTMxNzc5MzM3ODIsMzE3NzkzMzc4MgorZGQJMjk3Njg3MDM2NiwyOTc2ODcwMzY2CitkZAkxNDIyMjQ3MzEzLDE0MjIyNDczMTMKK2RkCTEzNDUzMzUzOTIsMTM0NTMzNTM5MgorZGQJNTAzOTc0NDIsNTAzOTc0NDIKK2RkCTI4NDIxMjYyODYsMjg0MjEyNjI4NgorZGQJMjA5OTk4MTE0MiwyMDk5OTgxMTQyCitkZAk0MzYxNDE3OTksNDM2MTQxNzk5CitkZAkxNjU4MzEyNjI5LDE2NTgzMTI2MjkKK2RkCTM4NzAwMTAxODksMzg3MDAxMDE4OQorZGQJMjU5MTQ1NDk1NiwyNTkxNDU0OTU2CitkZAkxMTcwOTE4MDMxLDExNzA5MTgwMzEKK2RkCTI2NDI1NzU5MDMsMjY0MjU3NTkwMworZGQJMTA4Njk2NjE1MywxMDg2OTY2MTUzCitkZAkyMjczMTQ4NDEwLDIyNzMxNDg0MTAKK2RkCTM2ODc2OTc3NSwzNjg3Njk3NzUKK2RkCTM5NDg1MDE0MjYsMzk0ODUwMTQyNgorZGQJMzM3Njg5MTc5MCwzMzc2ODkxNzkwCitkZAkyMDAzMzk3MDcsMjAwMzM5NzA3CitkZAkzOTcwODA1MDU3LDM5NzA4MDUwNTcKK2RkCTE3NDIwMDEzMzEsMTc0MjAwMTMzMQorZGQJNDI1NTI5NDA0Nyw0MjU1Mjk0MDQ3CitkZAkzOTM3MzgyMjEzLDM5MzczODIyMTMKK2RkCTMyMTQ3MTE4NDMsMzIxNDcxMTg0MworZGQJNDE1NDc2MjMyMyw0MTU0NzYyMzIzCitkZAkyNTI0MDgyOTE2LDI1MjQwODI5MTYKK2RkCTE1MzkzNTg4NzUsMTUzOTM1ODg3NQorZGQJMzI2NjgxOTk1NywzMjY2ODE5OTU3CitkZAk0ODY0MDc2NDksNDg2NDA3NjQ5CitkZAkyOTI4OTA3MDY5LDI5Mjg5MDcwNjkKK2RkCTE3ODA4ODUwNjgsMTc4MDg4NTA2OAorZGQJMTUxMzUwMjMxNiwxNTEzNTAyMzE2CitkZAkxMDk0NjY0MDYyLDEwOTQ2NjQwNjIKK2RkCTQ5ODA1MzAxLDQ5ODA1MzAxCitkZAkxMzM4ODIxNzYzLDEzMzg4MjE3NjMKK2RkCTE1NDY5MjUxNjAsMTU0NjkyNTE2MAorZGQJNDEwNDQ5NjQ2NSw0MTA0NDk2NDY1CitkZAk4ODc0ODE4MDksODg3NDgxODA5CitkZAkxNTAwNzM4NDksMTUwMDczODQ5CitkZAkyNDczNjg1NDc0LDI0NzM2ODU0NzQKK2RkCTE5NDM1OTEwODMsMTk0MzU5MTA4MworZGQJMTM5NTczMjgzNCwxMzk1NzMyODM0CitkZAkxMDU4MzQ2MjgyLDEwNTgzNDYyODIKK2RkCTIwMTU4OTc2OCwyMDE1ODk3NjgKK2RkCTEzODg4MjQ0NjksMTM4ODgyNDQ2OQorZGQJMTY5NjgwMTYwNiwxNjk2ODAxNjA2CitkZAkxNTg5ODg3OTAxLDE1ODk4ODc5MDEKK2RkCTY3MjY2NzY5Niw2NzI2Njc2OTYKK2RkCTI3MTEwMDA2MzEsMjcxMTAwMDYzMQorZGQJMjUxOTg3MjEwLDI1MTk4NzIxMAorZGQJMzA0NjgwODExMSwzMDQ2ODA4MTExCitkZAkxNTE0NTU1MDIsMTUxNDU1NTAyCitkZAk5MDcxNTM5NTYsOTA3MTUzOTU2CitkZAkyNjA4ODg5ODgzLDI2MDg4ODk4ODMKK2RkCTEwMzgyNzkzOTEsMTAzODI3OTM5MQorZGQJNjUyOTk1NTMzLDY1Mjk5NTUzMworZGQJMTc2NDE3MzY0NiwxNzY0MTczNjQ2CitkZAkzNDUxMDQwMzgzLDM0NTEwNDAzODMKK2RkCTI2NzUyNzUyNDIsMjY3NTI3NTI0MgorZGQJNDUzNTc2OTc4LDQ1MzU3Njk3OAorZGQJMjY1OTQxODkwOSwyNjU5NDE4OTA5CitkZAkxOTQ5MDUxOTkyLDE5NDkwNTE5OTIKK2RkCTc3MzQ2MjU4MCw3NzM0NjI1ODAKK2RkCTc1Njc1MTE1OCw3NTY3NTExNTgKK2RkCTI5OTM1ODE3ODgsMjk5MzU4MTc4OAorZGQJMzk5ODg5ODg2OCwzOTk4ODk4ODY4CitkZAk0MjIxNjA4MDI3LDQyMjE2MDgwMjcKK2RkCTQxMzI1OTAyNDQsNDEzMjU5MDI0NAorZGQJMTI5NTcyNzQ3OCwxMjk1NzI3NDc4CitkZAkxNjQxNDY5NjIzLDE2NDE0Njk2MjMKK2RkCTM0Njc4ODMzODksMzQ2Nzg4MzM4OQorZGQJMjA2NjI5NTEyMiwyMDY2Mjk1MTIyCitkZAkxMDU1MTIyMzk3LDEwNTUxMjIzOTcKK2RkCTE4OTg5MTc3MjYsMTg5ODkxNzcyNgorZGQJMjU0MjA0NDE3OSwyNTQyMDQ0MTc5CitkZAk0MTE1ODc4ODIyLDQxMTU4Nzg4MjIKK2RkCTE3NTg1ODExNzcsMTc1ODU4MTE3NworZGQJMCwwCitkZAk3NTM3OTA0MDEsNzUzNzkwNDAxCitkZAkxNjEyNzE4MTQ0LDE2MTI3MTgxNDQKK2RkCTUzNjY3MzUwNyw1MzY2NzM1MDcKK2RkCTMzNjcwODg1MDUsMzM2NzA4ODUwNQorZGQJMzk4MjE4NzQ0NiwzOTgyMTg3NDQ2CitkZAkzMTk0NjQ1MjA0LDMxOTQ2NDUyMDQKK2RkCTExODc3NjEwMzcsMTE4Nzc2MTAzNworZGQJMzY1MzE1NjQ1NSwzNjUzMTU2NDU1CitkZAkxMjYyMDQxNDU4LDEyNjIwNDE0NTgKK2RkCTM3Mjk0MTA3MDgsMzcyOTQxMDcwOAorZGQJMzU2MTc3MDEzNiwzNTYxNzcwMTM2CitkZAkzODk4MTAzOTg0LDM4OTgxMDM5ODQKK2RkCTEyNTUxMzMwNjEsMTI1NTEzMzA2MQorZGQJMTgwODg0NzAzNSwxODA4ODQ3MDM1CitkZAk3MjAzNjc1NTcsNzIwMzY3NTU3CitkZAkzODUzMTY3MTgzLDM4NTMxNjcxODMKK2RkCTM4NTYxMjc4MSwzODU2MTI3ODEKK2RkCTMzMDk1MTk3NTAsMzMwOTUxOTc1MAorZGQJMzYxMjE2NzU3OCwzNjEyMTY3NTc4CitkZAkxNDI5NDE4ODU0LDE0Mjk0MTg4NTQKK2RkCTI0OTE3NzgzMjEsMjQ5MTc3ODMyMQorZGQJMzQ3NzQyMzQ5OCwzNDc3NDIzNDk4CitkZAkyODQ4MTc4OTcsMjg0ODE3ODk3CitkZAkxMDA3OTQ4ODQsMTAwNzk0ODg0CitkZAkyMTcyNjE2NzAyLDIxNzI2MTY3MDIKK2RkCTQwMzE3OTUzNjAsNDAzMTc5NTM2MAorZGQJMTE0NDc5ODMyOCwxMTQ0Nzk4MzI4CitkZAkzMTMxMDIzMTQxLDMxMzEwMjMxNDEKK2RkCTM4MTk0ODExNjMsMzgxOTQ4MTE2MworZGQJNDA4MjE5MjgwMiw0MDgyMTkyODAyCitkZAk0MjcyMTM3MDUzLDQyNzIxMzcwNTMKK2RkCTMyMjU0MzYyODgsMzIyNTQzNjI4OAorZGQJMjMyNDY2NDA2OSwyMzI0NjY0MDY5CitkZAkyOTEyMDY0MDYzLDI5MTIwNjQwNjMKK2RkCTMxNjQ0NDU5ODUsMzE2NDQ0NTk4NQorZGQJMTIxMTY0NDAxNiwxMjExNjQ0MDE2CitkZAk4MzIyODE0NSw4MzIyODE0NQorZGQJMzc1MzY4ODE2MywzNzUzNjg4MTYzCitkZAkzMjQ5OTc2OTUxLDMyNDk5NzY5NTEKK2RkCTE5NzcyNzcxMDMsMTk3NzI3NzEwMworZGQJMTY2MzExNTU4NiwxNjYzMTE1NTg2CitkZAk4MDYzNTkwNzIsODA2MzU5MDcyCitkZAk0NTI5ODQ4MDUsNDUyOTg0ODA1CitkZAkyNTA4Njg3MzMsMjUwODY4NzMzCitkZAkxODQyNTMzMDU1LDE4NDI1MzMwNTUKK2RkCTEyODg1NTU5MDUsMTI4ODU1NTkwNQorZGQJMzM2MzMzODQ4LDMzNjMzMzg0OAorZGQJODkwNDQyNTM0LDg5MDQ0MjUzNAorZGQJODA0MDU2MjU5LDgwNDA1NjI1OQorZGQJMzc4MTEyNDAzMCwzNzgxMTI0MDMwCitkZAkyNzI3ODQzNjM3LDI3Mjc4NDM2MzcKK2RkCTM0MjcwMjYwNTYsMzQyNzAyNjA1NgorZGQJOTU3ODE0NTc0LDk1NzgxNDU3NAorZGQJMTQ3MjUxMzE3MSwxNDcyNTEzMTcxCitkZAk0MDcxMDczNjIxLDQwNzEwNzM2MjEKK2RkCTIxODkzMjgxMjQsMjE4OTMyODEyNAorZGQJMTE5NTE5NTc3MCwxMTk1MTk1NzcwCitkZAkyODkyMjYwNTUyLDI4OTIyNjA1NTIKK2RkCTM4ODE2NTU3MzgsMzg4MTY1NTczOAorZGQJNzIzMDY1MTM4LDcyMzA2NTEzOAorZGQJMjUwNzM3MTQ5NCwyNTA3MzcxNDk0CitkZAkyNjkwNjcwNzg0LDI2OTA2NzA3ODQKK2RkCTI1NTg2MjQwMjUsMjU1ODYyNDAyNQorZGQJMzUxMTYzNTg3MCwzNTExNjM1ODcwCitkZAkyMTQ1MTgwODM1LDIxNDUxODA4MzUKK2RkCTE3MTM1MTMwMjgsMTcxMzUxMzAyOAorZGQJMjExNjY5MjU2NCwyMTE2NjkyNTY0CitkZAkyODc4Mzc4MDQzLDI4NzgzNzgwNDMKK2RkCTIyMDY3NjMwMTksMjIwNjc2MzAxOQorZGQJMzM5MzYwMzIxMiwzMzkzNjAzMjEyCitkZAk3MDM1MjQ1NTEsNzAzNTI0NTUxCitkZAkzNTUyMDk4NDExLDM1NTIwOTg0MTEKK2RkCTEwMDc5NDg4NDAsMTAwNzk0ODg0MAorZGQJMjA0NDY0OTEyNywyMDQ0NjQ5MTI3CitkZAkzNzk3ODM1NDUyLDM3OTc4MzU0NTIKK2RkCTQ4NzI2Mjk5OCw0ODcyNjI5OTgKK2RkCTE5OTQxMjAxMDksMTk5NDEyMDEwOQorZGQJMTAwNDU5MzM3MSwxMDA0NTkzMzcxCitkZAkxNDQ2MTMwMjc2LDE0NDYxMzAyNzYKK2RkCTEzMTI0Mzg5MDAsMTMxMjQzODkwMAorZGQJNTAzOTc0NDIwLDUwMzk3NDQyMAorZGQJMzY3OTAxMzI2NiwzNjc5MDEzMjY2CitkZAkxNjgxNjY5MjQsMTY4MTY2OTI0CitkZAkxODE0MzA3OTEyLDE4MTQzMDc5MTIKK2RkCTM4MzEyNTgyOTYsMzgzMTI1ODI5NgorZGQJMTU3MzA0NDg5NSwxNTczMDQ0ODk1CitkZAkxODU5Mzc2MDYxLDE4NTkzNzYwNjEKK2RkCTQwMjEwNzA5MTUsNDAyMTA3MDkxNQorZGQJMjc5MTQ2NTY2OCwyNzkxNDY1NjY4CitkZAkyODI4MTEyMTg1LDI4MjgxMTIxODUKK2RkCTI3NjEyNjY0ODEsMjc2MTI2NjQ4MQorZGQJOTM3NzQ3NjY3LDkzNzc0NzY2NworZGQJMjMzOTk5NDA5OCwyMzM5OTk0MDk4CitkZAk4NTQwNTg5NjUsODU0MDU4OTY1CitkZAkxMTM3MjMyMDExLDExMzcyMzIwMTEKK2RkCTE0OTY3OTA4OTQsMTQ5Njc5MDg5NAorZGQJMzA3NzQwMjA3NCwzMDc3NDAyMDc0CitkZAkyMzU4MDg2OTEzLDIzNTgwODY5MTMKK2RkCTE2OTE3MzU0NzMsMTY5MTczNTQ3MworZGQJMzUyODM0NzI5MiwzNTI4MzQ3MjkyCitkZAkzNzY5MjE1MzA1LDM3NjkyMTUzMDUKK2RkCTMwMjcwMDQ2MzIsMzAyNzAwNDYzMgorZGQJNDE5OTk2MjI4NCw0MTk5OTYyMjg0CitkZAkxMzM0OTQwMDMsMTMzNDk0MDAzCitkZAk2MzYxNTI1MjcsNjM2MTUyNTI3CitkZAkyOTQyNjU3OTk0LDI5NDI2NTc5OTQKK2RkCTIzOTAzOTE1NDAsMjM5MDM5MTU0MAorZGQJMzkyMDUzOTIwNywzOTIwNTM5MjA3CitkZAk0MDMxNzk1MzYsNDAzMTc5NTM2CitkZAkzNTg1Nzg0NDMxLDM1ODU3ODQ0MzEKK2RkCTIyODk1OTY2NTYsMjI4OTU5NjY1NgorZGQJMTg2NDcwNTM1NCwxODY0NzA1MzU0CitkZAkxOTE1NjI5MTQ4LDE5MTU2MjkxNDgKK2RkCTYwNTgyMjAwOCw2MDU4MjIwMDgKK2RkCTQwNTQyMzA2MTUsNDA1NDIzMDYxNQorZGQJMzM1MDUwODY1OSwzMzUwNTA4NjU5CitkZAkxMzcxOTgxNDYzLDEzNzE5ODE0NjMKK2RkCTYwMjQ2NjUwNyw2MDI0NjY1MDcKK2RkCTIwOTQ5MTQ5NzcsMjA5NDkxNDk3NworZGQJMjYyNDg3NzgwMCwyNjI0ODc3ODAwCitkZAk1NTU2ODc3NDIsNTU1Njg3NzQyCitkZAkzNzEyNjk5Mjg2LDM3MTI2OTkyODYKK2RkCTM3MDM0MjIzMDUsMzcwMzQyMjMwNQorZGQJMjI1NzI5MjA0NSwyMjU3MjkyMDQ1CitkZAkyMjQwNDQ5MDM5LDIyNDA0NDkwMzkKK2RkCTI0MjMyODgwMzIsMjQyMzI4ODAzMgorZGQJMTExMTM3NTQ4NCwxMTExMzc1NDg0CitkZAkzMzAwMjQyODAxLDMzMDAyNDI4MDEKK2RkCTI4NTg4Mzc3MDgsMjg1ODgzNzcwOAorZGQJMzYyODYxNTgyNCwzNjI4NjE1ODI0CitkZAk4NDA4MzQ2Miw4NDA4MzQ2MgorZGQJMzI5NjIyOTUsMzI5NjIyOTUKK2RkCTMwMjkxMTAwNCwzMDI5MTEwMDQKK2RkCTI3NDEwNjgyMjYsMjc0MTA2ODIyNgorZGQJMTU5NzMyMjYwMiwxNTk3MzIyNjAyCitkZAk0MTgzMjUwODYyLDQxODMyNTA4NjIKK2RkCTM1MDE4MzI1NTMsMzUwMTgzMjU1MworZGQJMjQ0MTUxMjQ3MSwyNDQxNTEyNDcxCitkZAkxNDg5MDkzMDE3LDE0ODkwOTMwMTcKK2RkCTY1NjIxOTQ1MCw2NTYyMTk0NTAKK2RkCTMxMTQxODAxMzUsMzExNDE4MDEzNQorZGQJOTU0MzI3NTEzLDk1NDMyNzUxMworZGQJMzM1MDgzNzU1LDMzNTA4Mzc1NQorZGQJMzAxMzEyMjA5MSwzMDEzMTIyMDkxCitkZAk4NTY3NTY1MTQsODU2NzU2NTE0CitkZAkzMTQ0MjQ3NzYyLDMxNDQyNDc3NjIKK2RkCTE4OTMzMjUyMjUsMTg5MzMyNTIyNQorZGQJMjMwNzgyMTA2MywyMzA3ODIxMDYzCitkZAkyODExNTMyMzM5LDI4MTE1MzIzMzkKK2RkCTMwNjM2NTExMTcsMzA2MzY1MTExNworZGQJNTcyMzk5MTY0LDU3MjM5OTE2NAorZGQJMjQ1ODM1NTQ3NywyNDU4MzU1NDc3CitkZAk1NTIyMDA2NDksNTUyMjAwNjQ5CitkZAkxMjM4MjkwMDU1LDEyMzgyOTAwNTUKK2RkCTQyODM3ODI1NzAsNDI4Mzc4MjU3MAorZGQJMjAxNTg5NzY4MCwyMDE1ODk3NjgwCitkZAkyMDYxNDkyMTMzLDIwNjE0OTIxMzMKK2RkCTI0MDgzNTI3NzEsMjQwODM1Mjc3MQorZGQJNDE3MTM0MjE2OSw0MTcxMzQyMTY5CitkZAkyMTU2NDk3MTYxLDIxNTY0OTcxNjEKK2RkCTM4NjczMTI5MCwzODY3MzEyOTAKK2RkCTM2Njk5OTk0NjEsMzY2OTk5OTQ2MQorZGQJODM3MjE1OTU5LDgzNzIxNTk1OQorZGQJMzMyNjIzMTE3MiwzMzI2MjMxMTcyCitkZAkzMDkzODUwMzIwLDMwOTM4NTAzMjAKK2RkCTMyNzU4MzM3MzAsMzI3NTgzMzczMAorZGQJMjk2Mjg1NjIzMywyOTYyODU2MjMzCitkZAkxOTk5NDQ5NDM0LDE5OTk0NDk0MzQKK2RkCTI4NjE5OTU4MiwyODYxOTk1ODIKK2RkCTM0MTczNTQzNjMsMzQxNzM1NDM2MworZGQJNDIzMzM4NTEyOCw0MjMzMzg1MTI4CitkZAkzNjAyNjI3NDM3LDM2MDI2Mjc0MzcKK2RkCTk3NDUyNTk5Niw5NzQ1MjU5OTYKK2RiCTk5LDEyNCwxMTksMTIzLDI0MiwxMDcsMTExLDE5NworZGIJNDgsMSwxMDMsNDMsMjU0LDIxNSwxNzEsMTE4CitkYgkyMDIsMTMwLDIwMSwxMjUsMjUwLDg5LDcxLDI0MAorZGIJMTczLDIxMiwxNjIsMTc1LDE1NiwxNjQsMTE0LDE5MgorZGIJMTgzLDI1MywxNDcsMzgsNTQsNjMsMjQ3LDIwNAorZGIJNTIsMTY1LDIyOSwyNDEsMTEzLDIxNiw0OSwyMQorZGIJNCwxOTksMzUsMTk1LDI0LDE1MCw1LDE1NAorZGIJNywxOCwxMjgsMjI2LDIzNSwzOSwxNzgsMTE3CitkYgk5LDEzMSw0NCwyNiwyNywxMTAsOTAsMTYwCitkYgk4Miw1OSwyMTQsMTc5LDQxLDIyNyw0NywxMzIKK2RiCTgzLDIwOSwwLDIzNywzMiwyNTIsMTc3LDkxCitkYgkxMDYsMjAzLDE5MCw1Nyw3NCw3Niw4OCwyMDcKK2RiCTIwOCwyMzksMTcwLDI1MSw2Nyw3Nyw1MSwxMzMKK2RiCTY5LDI0OSwyLDEyNyw4MCw2MCwxNTksMTY4CitkYgk4MSwxNjMsNjQsMTQzLDE0NiwxNTcsNTYsMjQ1CitkYgkxODgsMTgyLDIxOCwzMywxNiwyNTUsMjQzLDIxMAorZGIJMjA1LDEyLDE5LDIzNiw5NSwxNTEsNjgsMjMKK2RiCTE5NiwxNjcsMTI2LDYxLDEwMCw5MywyNSwxMTUKK2RiCTk2LDEyOSw3OSwyMjAsMzQsNDIsMTQ0LDEzNgorZGIJNzAsMjM4LDE4NCwyMCwyMjIsOTQsMTEsMjE5CitkYgkyMjQsNTAsNTgsMTAsNzMsNiwzNiw5MgorZGIJMTk0LDIxMSwxNzIsOTgsMTQ1LDE0OSwyMjgsMTIxCitkYgkyMzEsMjAwLDU1LDEwOSwxNDEsMjEzLDc4LDE2OQorZGIJMTA4LDg2LDI0NCwyMzQsMTAxLDEyMiwxNzQsOAorZGIJMTg2LDEyMCwzNyw0NiwyOCwxNjYsMTgwLDE5OAorZGIJMjMyLDIyMSwxMTYsMzEsNzUsMTg5LDEzOSwxMzgKK2RiCTExMiw2MiwxODEsMTAyLDcyLDMsMjQ2LDE0CitkYgk5Nyw1Myw4NywxODUsMTM0LDE5MywyOSwxNTgKK2RiCTIyNSwyNDgsMTUyLDE3LDEwNSwyMTcsMTQyLDE0OAorZGIJMTU1LDMwLDEzNSwyMzMsMjA2LDg1LDQwLDIyMworZGIJMTQwLDE2MSwxMzcsMTMsMTkxLDIzMCw2NiwxMDQKK2RiCTY1LDE1Myw0NSwxNSwxNzYsODQsMTg3LDIyCitkYgk5OSwxMjQsMTE5LDEyMywyNDIsMTA3LDExMSwxOTcKK2RiCTQ4LDEsMTAzLDQzLDI1NCwyMTUsMTcxLDExOAorZGIJMjAyLDEzMCwyMDEsMTI1LDI1MCw4OSw3MSwyNDAKK2RiCTE3MywyMTIsMTYyLDE3NSwxNTYsMTY0LDExNCwxOTIKK2RiCTE4MywyNTMsMTQ3LDM4LDU0LDYzLDI0NywyMDQKK2RiCTUyLDE2NSwyMjksMjQxLDExMywyMTYsNDksMjEKK2RiCTQsMTk5LDM1LDE5NSwyNCwxNTAsNSwxNTQKK2RiCTcsMTgsMTI4LDIyNiwyMzUsMzksMTc4LDExNworZGIJOSwxMzEsNDQsMjYsMjcsMTEwLDkwLDE2MAorZGIJODIsNTksMjE0LDE3OSw0MSwyMjcsNDcsMTMyCitkYgk4MywyMDksMCwyMzcsMzIsMjUyLDE3Nyw5MQorZGIJMTA2LDIwMywxOTAsNTcsNzQsNzYsODgsMjA3CitkYgkyMDgsMjM5LDE3MCwyNTEsNjcsNzcsNTEsMTMzCitkYgk2OSwyNDksMiwxMjcsODAsNjAsMTU5LDE2OAorZGIJODEsMTYzLDY0LDE0MywxNDYsMTU3LDU2LDI0NQorZGIJMTg4LDE4MiwyMTgsMzMsMTYsMjU1LDI0MywyMTAKK2RiCTIwNSwxMiwxOSwyMzYsOTUsMTUxLDY4LDIzCitkYgkxOTYsMTY3LDEyNiw2MSwxMDAsOTMsMjUsMTE1CitkYgk5NiwxMjksNzksMjIwLDM0LDQyLDE0NCwxMzYKK2RiCTcwLDIzOCwxODQsMjAsMjIyLDk0LDExLDIxOQorZGIJMjI0LDUwLDU4LDEwLDczLDYsMzYsOTIKK2RiCTE5NCwyMTEsMTcyLDk4LDE0NSwxNDksMjI4LDEyMQorZGIJMjMxLDIwMCw1NSwxMDksMTQxLDIxMyw3OCwxNjkKK2RiCTEwOCw4NiwyNDQsMjM0LDEwMSwxMjIsMTc0LDgKK2RiCTE4NiwxMjAsMzcsNDYsMjgsMTY2LDE4MCwxOTgKK2RiCTIzMiwyMjEsMTE2LDMxLDc1LDE4OSwxMzksMTM4CitkYgkxMTIsNjIsMTgxLDEwMiw3MiwzLDI0NiwxNAorZGIJOTcsNTMsODcsMTg1LDEzNCwxOTMsMjksMTU4CitkYgkyMjUsMjQ4LDE1MiwxNywxMDUsMjE3LDE0MiwxNDgKK2RiCTE1NSwzMCwxMzUsMjMzLDIwNiw4NSw0MCwyMjMKK2RiCTE0MCwxNjEsMTM3LDEzLDE5MSwyMzAsNjYsMTA0CitkYgk2NSwxNTMsNDUsMTUsMTc2LDg0LDE4NywyMgorZGIJOTksMTI0LDExOSwxMjMsMjQyLDEwNywxMTEsMTk3CitkYgk0OCwxLDEwMyw0MywyNTQsMjE1LDE3MSwxMTgKK2RiCTIwMiwxMzAsMjAxLDEyNSwyNTAsODksNzEsMjQwCitkYgkxNzMsMjEyLDE2MiwxNzUsMTU2LDE2NCwxMTQsMTkyCitkYgkxODMsMjUzLDE0NywzOCw1NCw2MywyNDcsMjA0CitkYgk1MiwxNjUsMjI5LDI0MSwxMTMsMjE2LDQ5LDIxCitkYgk0LDE5OSwzNSwxOTUsMjQsMTUwLDUsMTU0CitkYgk3LDE4LDEyOCwyMjYsMjM1LDM5LDE3OCwxMTcKK2RiCTksMTMxLDQ0LDI2LDI3LDExMCw5MCwxNjAKK2RiCTgyLDU5LDIxNCwxNzksNDEsMjI3LDQ3LDEzMgorZGIJODMsMjA5LDAsMjM3LDMyLDI1MiwxNzcsOTEKK2RiCTEwNiwyMDMsMTkwLDU3LDc0LDc2LDg4LDIwNworZGIJMjA4LDIzOSwxNzAsMjUxLDY3LDc3LDUxLDEzMworZGIJNjksMjQ5LDIsMTI3LDgwLDYwLDE1OSwxNjgKK2RiCTgxLDE2Myw2NCwxNDMsMTQ2LDE1Nyw1NiwyNDUKK2RiCTE4OCwxODIsMjE4LDMzLDE2LDI1NSwyNDMsMjEwCitkYgkyMDUsMTIsMTksMjM2LDk1LDE1MSw2OCwyMworZGIJMTk2LDE2NywxMjYsNjEsMTAwLDkzLDI1LDExNQorZGIJOTYsMTI5LDc5LDIyMCwzNCw0MiwxNDQsMTM2CitkYgk3MCwyMzgsMTg0LDIwLDIyMiw5NCwxMSwyMTkKK2RiCTIyNCw1MCw1OCwxMCw3Myw2LDM2LDkyCitkYgkxOTQsMjExLDE3Miw5OCwxNDUsMTQ5LDIyOCwxMjEKK2RiCTIzMSwyMDAsNTUsMTA5LDE0MSwyMTMsNzgsMTY5CitkYgkxMDgsODYsMjQ0LDIzNCwxMDEsMTIyLDE3NCw4CitkYgkxODYsMTIwLDM3LDQ2LDI4LDE2NiwxODAsMTk4CitkYgkyMzIsMjIxLDExNiwzMSw3NSwxODksMTM5LDEzOAorZGIJMTEyLDYyLDE4MSwxMDIsNzIsMywyNDYsMTQKK2RiCTk3LDUzLDg3LDE4NSwxMzQsMTkzLDI5LDE1OAorZGIJMjI1LDI0OCwxNTIsMTcsMTA1LDIxNywxNDIsMTQ4CitkYgkxNTUsMzAsMTM1LDIzMywyMDYsODUsNDAsMjIzCitkYgkxNDAsMTYxLDEzNywxMywxOTEsMjMwLDY2LDEwNAorZGIJNjUsMTUzLDQ1LDE1LDE3Niw4NCwxODcsMjIKK2RiCTk5LDEyNCwxMTksMTIzLDI0MiwxMDcsMTExLDE5NworZGIJNDgsMSwxMDMsNDMsMjU0LDIxNSwxNzEsMTE4CitkYgkyMDIsMTMwLDIwMSwxMjUsMjUwLDg5LDcxLDI0MAorZGIJMTczLDIxMiwxNjIsMTc1LDE1NiwxNjQsMTE0LDE5MgorZGIJMTgzLDI1MywxNDcsMzgsNTQsNjMsMjQ3LDIwNAorZGIJNTIsMTY1LDIyOSwyNDEsMTEzLDIxNiw0OSwyMQorZGIJNCwxOTksMzUsMTk1LDI0LDE1MCw1LDE1NAorZGIJNywxOCwxMjgsMjI2LDIzNSwzOSwxNzgsMTE3CitkYgk5LDEzMSw0NCwyNiwyNywxMTAsOTAsMTYwCitkYgk4Miw1OSwyMTQsMTc5LDQxLDIyNyw0NywxMzIKK2RiCTgzLDIwOSwwLDIzNywzMiwyNTIsMTc3LDkxCitkYgkxMDYsMjAzLDE5MCw1Nyw3NCw3Niw4OCwyMDcKK2RiCTIwOCwyMzksMTcwLDI1MSw2Nyw3Nyw1MSwxMzMKK2RiCTY5LDI0OSwyLDEyNyw4MCw2MCwxNTksMTY4CitkYgk4MSwxNjMsNjQsMTQzLDE0NiwxNTcsNTYsMjQ1CitkYgkxODgsMTgyLDIxOCwzMywxNiwyNTUsMjQzLDIxMAorZGIJMjA1LDEyLDE5LDIzNiw5NSwxNTEsNjgsMjMKK2RiCTE5NiwxNjcsMTI2LDYxLDEwMCw5MywyNSwxMTUKK2RiCTk2LDEyOSw3OSwyMjAsMzQsNDIsMTQ0LDEzNgorZGIJNzAsMjM4LDE4NCwyMCwyMjIsOTQsMTEsMjE5CitkYgkyMjQsNTAsNTgsMTAsNzMsNiwzNiw5MgorZGIJMTk0LDIxMSwxNzIsOTgsMTQ1LDE0OSwyMjgsMTIxCitkYgkyMzEsMjAwLDU1LDEwOSwxNDEsMjEzLDc4LDE2OQorZGIJMTA4LDg2LDI0NCwyMzQsMTAxLDEyMiwxNzQsOAorZGIJMTg2LDEyMCwzNyw0NiwyOCwxNjYsMTgwLDE5OAorZGIJMjMyLDIyMSwxMTYsMzEsNzUsMTg5LDEzOSwxMzgKK2RiCTExMiw2MiwxODEsMTAyLDcyLDMsMjQ2LDE0CitkYgk5Nyw1Myw4NywxODUsMTM0LDE5MywyOSwxNTgKK2RiCTIyNSwyNDgsMTUyLDE3LDEwNSwyMTcsMTQyLDE0OAorZGIJMTU1LDMwLDEzNSwyMzMsMjA2LDg1LDQwLDIyMworZGIJMTQwLDE2MSwxMzcsMTMsMTkxLDIzMCw2NiwxMDQKK2RiCTY1LDE1Myw0NSwxNSwxNzYsODQsMTg3LDIyCitkZAkxLDIsNCw4CitkZAkxNiwzMiw2NCwxMjgKK2RkCTI3LDU0LDAsMAorZGQJMCwwLDAsMAorZ2xvYmFsCV9hZXNfbm9od19lbmNyeXB0CithbGlnbgkxNgorX2Flc19ub2h3X2VuY3J5cHQ6CitMJF9hZXNfbm9od19lbmNyeXB0X2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwltb3YJZWF4LGVzcAorCXN1Ygllc3AsMzYKKwlhbmQJZXNwLC02NAorCWxlYQllYngsW2VkaS0xMjddCisJc3ViCWVieCxlc3AKKwluZWcJZWJ4CisJYW5kCWVieCw5NjAKKwlzdWIJZXNwLGVieAorCWFkZAllc3AsNAorCW1vdglEV09SRCBbMjgrZXNwXSxlYXgKKwljYWxsCUwkMDA0cGljX3BvaW50CitMJDAwNHBpY19wb2ludDoKKwlwb3AJZWJwCisJbGVhCWVheCxbX09QRU5TU0xfaWEzMmNhcF9QXQorCWxlYQllYnAsWyhMJEFFU19UZS1MJDAwNHBpY19wb2ludCkrZWJwXQorCWxlYQllYngsWzc2NCtlc3BdCisJc3ViCWVieCxlYnAKKwlhbmQJZWJ4LDc2OAorCWxlYQllYnAsWzIxNzYrZWJ4KjErZWJwXQorCWJ0CURXT1JEIFtlYXhdLDI1CisJam5jCU5FQVIgTCQwMDV4ODYKKwltb3ZxCW1tMCxbZXNpXQorCW1vdnEJbW00LFs4K2VzaV0KKwljYWxsCV9fc3NlX0FFU19lbmNyeXB0X2NvbXBhY3QKKwltb3YJZXNwLERXT1JEIFsyOCtlc3BdCisJbW92CWVzaSxEV09SRCBbMjQrZXNwXQorCW1vdnEJW2VzaV0sbW0wCisJbW92cQlbOCtlc2ldLG1tNAorCWVtbXMKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CithbGlnbgkxNgorTCQwMDV4ODY6CisJbW92CURXT1JEIFsyNCtlc3BdLGVicAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlc2ldCisJY2FsbAlfX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0CisJbW92CWVzcCxEV09SRCBbMjgrZXNwXQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwltb3YJRFdPUkQgW2VzaV0sZWF4CisJbW92CURXT1JEIFs0K2VzaV0sZWJ4CisJbW92CURXT1JEIFs4K2VzaV0sZWN4CisJbW92CURXT1JEIFsxMitlc2ldLGVkeAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2FsaWduCTE2CitfX3g4Nl9BRVNfZGVjcnlwdF9jb21wYWN0OgorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwl4b3IJZWF4LERXT1JEIFtlZGldCisJeG9yCWVieCxEV09SRCBbNCtlZGldCisJeG9yCWVjeCxEV09SRCBbOCtlZGldCisJeG9yCWVkeCxEV09SRCBbMTIrZWRpXQorCW1vdgllc2ksRFdPUkQgWzI0MCtlZGldCisJbGVhCWVzaSxbZXNpKjErZXNpLTJdCisJbGVhCWVzaSxbZXNpKjgrZWRpXQorCW1vdglEV09SRCBbMjQrZXNwXSxlc2kKKwltb3YJZWRpLERXT1JEIFtlYnAtMTI4XQorCW1vdgllc2ksRFdPUkQgW2VicC05Nl0KKwltb3YJZWRpLERXT1JEIFtlYnAtNjRdCisJbW92CWVzaSxEV09SRCBbZWJwLTMyXQorCW1vdgllZGksRFdPUkQgW2VicF0KKwltb3YJZXNpLERXT1JEIFszMitlYnBdCisJbW92CWVkaSxEV09SRCBbNjQrZWJwXQorCW1vdgllc2ksRFdPUkQgWzk2K2VicF0KK2FsaWduCTE2CitMJDAwNmxvb3A6CisJbW92CWVzaSxlYXgKKwlhbmQJZXNpLDI1NQorCW1vdnp4CWVzaSxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxkaAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksOAorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlY3gKKwlzaHIJZWRpLDE2CisJYW5kCWVkaSwyNTUKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDE2CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVieAorCXNocgllZGksMjQKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDI0CisJeG9yCWVzaSxlZGkKKwltb3YJRFdPUkQgWzQrZXNwXSxlc2kKKwltb3YJZXNpLGVieAorCWFuZAllc2ksMjU1CisJbW92engJZXNpLEJZVEUgW2VzaSoxK2VicC0xMjhdCisJbW92engJZWRpLGFoCisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSw4CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVkeAorCXNocgllZGksMTYKKwlhbmQJZWRpLDI1NQorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMTYKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWN4CisJc2hyCWVkaSwyNAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMjQKKwl4b3IJZXNpLGVkaQorCW1vdglEV09SRCBbOCtlc3BdLGVzaQorCW1vdgllc2ksZWN4CisJYW5kCWVzaSwyNTUKKwltb3Z6eAllc2ksQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYmgKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDgKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWF4CisJc2hyCWVkaSwxNgorCWFuZAllZGksMjU1CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwxNgorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlZHgKKwlzaHIJZWRpLDI0CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwyNAorCXhvcgllc2ksZWRpCisJYW5kCWVkeCwyNTUKKwltb3Z6eAllZHgsQllURSBbZWR4KjErZWJwLTEyOF0KKwltb3Z6eAllY3gsY2gKKwltb3Z6eAllY3gsQllURSBbZWN4KjErZWJwLTEyOF0KKwlzaGwJZWN4LDgKKwl4b3IJZWR4LGVjeAorCW1vdgllY3gsZXNpCisJc2hyCWVieCwxNgorCWFuZAllYngsMjU1CisJbW92engJZWJ4LEJZVEUgW2VieCoxK2VicC0xMjhdCisJc2hsCWVieCwxNgorCXhvcgllZHgsZWJ4CisJc2hyCWVheCwyNAorCW1vdnp4CWVheCxCWVRFIFtlYXgqMStlYnAtMTI4XQorCXNobAllYXgsMjQKKwl4b3IJZWR4LGVheAorCW1vdgllZGksMjE1NTkwNTE1MgorCWFuZAllZGksZWN4CisJbW92CWVzaSxlZGkKKwlzaHIJZWRpLDcKKwlsZWEJZWF4LFtlY3gqMStlY3hdCisJc3ViCWVzaSxlZGkKKwlhbmQJZWF4LDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXhvcgllYXgsZXNpCisJbW92CWVkaSwyMTU1OTA1MTUyCisJYW5kCWVkaSxlYXgKKwltb3YJZXNpLGVkaQorCXNocgllZGksNworCWxlYQllYngsW2VheCoxK2VheF0KKwlzdWIJZXNpLGVkaQorCWFuZAllYngsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJeG9yCWVheCxlY3gKKwl4b3IJZWJ4LGVzaQorCW1vdgllZGksMjE1NTkwNTE1MgorCWFuZAllZGksZWJ4CisJbW92CWVzaSxlZGkKKwlzaHIJZWRpLDcKKwlsZWEJZWJwLFtlYngqMStlYnhdCisJc3ViCWVzaSxlZGkKKwlhbmQJZWJwLDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXhvcgllYngsZWN4CisJcm9sCWVjeCw4CisJeG9yCWVicCxlc2kKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWJwCisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVicAorCXJvbAllYXgsMjQKKwl4b3IJZWN4LGVicAorCXJvbAllYngsMTYKKwl4b3IJZWN4LGVheAorCXJvbAllYnAsOAorCXhvcgllY3gsZWJ4CisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJeG9yCWVjeCxlYnAKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWN4CisJbW92CWVkaSwyMTU1OTA1MTUyCisJYW5kCWVkaSxlZHgKKwltb3YJZXNpLGVkaQorCXNocgllZGksNworCWxlYQllYngsW2VkeCoxK2VkeF0KKwlzdWIJZXNpLGVkaQorCWFuZAllYngsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJeG9yCWVieCxlc2kKKwltb3YJZWRpLDIxNTU5MDUxNTIKKwlhbmQJZWRpLGVieAorCW1vdgllc2ksZWRpCisJc2hyCWVkaSw3CisJbGVhCWVjeCxbZWJ4KjErZWJ4XQorCXN1Ygllc2ksZWRpCisJYW5kCWVjeCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwl4b3IJZWJ4LGVkeAorCXhvcgllY3gsZXNpCisJbW92CWVkaSwyMTU1OTA1MTUyCisJYW5kCWVkaSxlY3gKKwltb3YJZXNpLGVkaQorCXNocgllZGksNworCWxlYQllYnAsW2VjeCoxK2VjeF0KKwlzdWIJZXNpLGVkaQorCWFuZAllYnAsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJeG9yCWVjeCxlZHgKKwlyb2wJZWR4LDgKKwl4b3IJZWJwLGVzaQorCXhvcgllZHgsZWJ4CisJeG9yCWVieCxlYnAKKwl4b3IJZWR4LGVjeAorCXhvcgllY3gsZWJwCisJcm9sCWVieCwyNAorCXhvcgllZHgsZWJwCisJcm9sCWVjeCwxNgorCXhvcgllZHgsZWJ4CisJcm9sCWVicCw4CisJeG9yCWVkeCxlY3gKKwltb3YJZWJ4LERXT1JEIFs4K2VzcF0KKwl4b3IJZWR4LGVicAorCW1vdglEV09SRCBbMTYrZXNwXSxlZHgKKwltb3YJZWRpLDIxNTU5MDUxNTIKKwlhbmQJZWRpLGVheAorCW1vdgllc2ksZWRpCisJc2hyCWVkaSw3CisJbGVhCWVjeCxbZWF4KjErZWF4XQorCXN1Ygllc2ksZWRpCisJYW5kCWVjeCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwl4b3IJZWN4LGVzaQorCW1vdgllZGksMjE1NTkwNTE1MgorCWFuZAllZGksZWN4CisJbW92CWVzaSxlZGkKKwlzaHIJZWRpLDcKKwlsZWEJZWR4LFtlY3gqMStlY3hdCisJc3ViCWVzaSxlZGkKKwlhbmQJZWR4LDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXhvcgllY3gsZWF4CisJeG9yCWVkeCxlc2kKKwltb3YJZWRpLDIxNTU5MDUxNTIKKwlhbmQJZWRpLGVkeAorCW1vdgllc2ksZWRpCisJc2hyCWVkaSw3CisJbGVhCWVicCxbZWR4KjErZWR4XQorCXN1Ygllc2ksZWRpCisJYW5kCWVicCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwl4b3IJZWR4LGVheAorCXJvbAllYXgsOAorCXhvcgllYnAsZXNpCisJeG9yCWVheCxlY3gKKwl4b3IJZWN4LGVicAorCXhvcgllYXgsZWR4CisJeG9yCWVkeCxlYnAKKwlyb2wJZWN4LDI0CisJeG9yCWVheCxlYnAKKwlyb2wJZWR4LDE2CisJeG9yCWVheCxlY3gKKwlyb2wJZWJwLDgKKwl4b3IJZWF4LGVkeAorCXhvcgllYXgsZWJwCisJbW92CWVkaSwyMTU1OTA1MTUyCisJYW5kCWVkaSxlYngKKwltb3YJZXNpLGVkaQorCXNocgllZGksNworCWxlYQllY3gsW2VieCoxK2VieF0KKwlzdWIJZXNpLGVkaQorCWFuZAllY3gsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJeG9yCWVjeCxlc2kKKwltb3YJZWRpLDIxNTU5MDUxNTIKKwlhbmQJZWRpLGVjeAorCW1vdgllc2ksZWRpCisJc2hyCWVkaSw3CisJbGVhCWVkeCxbZWN4KjErZWN4XQorCXN1Ygllc2ksZWRpCisJYW5kCWVkeCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwl4b3IJZWN4LGVieAorCXhvcgllZHgsZXNpCisJbW92CWVkaSwyMTU1OTA1MTUyCisJYW5kCWVkaSxlZHgKKwltb3YJZXNpLGVkaQorCXNocgllZGksNworCWxlYQllYnAsW2VkeCoxK2VkeF0KKwlzdWIJZXNpLGVkaQorCWFuZAllYnAsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJeG9yCWVkeCxlYngKKwlyb2wJZWJ4LDgKKwl4b3IJZWJwLGVzaQorCXhvcgllYngsZWN4CisJeG9yCWVjeCxlYnAKKwl4b3IJZWJ4LGVkeAorCXhvcgllZHgsZWJwCisJcm9sCWVjeCwyNAorCXhvcgllYngsZWJwCisJcm9sCWVkeCwxNgorCXhvcgllYngsZWN4CisJcm9sCWVicCw4CisJeG9yCWVieCxlZHgKKwltb3YJZWN4LERXT1JEIFsxMitlc3BdCisJeG9yCWVieCxlYnAKKwltb3YJZWR4LERXT1JEIFsxNitlc3BdCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllYnAsRFdPUkQgWzI4K2VzcF0KKwlhZGQJZWRpLDE2CisJeG9yCWVheCxEV09SRCBbZWRpXQorCXhvcgllYngsRFdPUkQgWzQrZWRpXQorCXhvcgllY3gsRFdPUkQgWzgrZWRpXQorCXhvcgllZHgsRFdPUkQgWzEyK2VkaV0KKwljbXAJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CURXT1JEIFsyMCtlc3BdLGVkaQorCWpiCU5FQVIgTCQwMDZsb29wCisJbW92CWVzaSxlYXgKKwlhbmQJZXNpLDI1NQorCW1vdnp4CWVzaSxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxkaAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksOAorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlY3gKKwlzaHIJZWRpLDE2CisJYW5kCWVkaSwyNTUKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDE2CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVieAorCXNocgllZGksMjQKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDI0CisJeG9yCWVzaSxlZGkKKwltb3YJRFdPUkQgWzQrZXNwXSxlc2kKKwltb3YJZXNpLGVieAorCWFuZAllc2ksMjU1CisJbW92engJZXNpLEJZVEUgW2VzaSoxK2VicC0xMjhdCisJbW92engJZWRpLGFoCisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSw4CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVkeAorCXNocgllZGksMTYKKwlhbmQJZWRpLDI1NQorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMTYKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWN4CisJc2hyCWVkaSwyNAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCXNobAllZGksMjQKKwl4b3IJZXNpLGVkaQorCW1vdglEV09SRCBbOCtlc3BdLGVzaQorCW1vdgllc2ksZWN4CisJYW5kCWVzaSwyNTUKKwltb3Z6eAllc2ksQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYmgKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwLTEyOF0KKwlzaGwJZWRpLDgKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWF4CisJc2hyCWVkaSwxNgorCWFuZAllZGksMjU1CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwxNgorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlZHgKKwlzaHIJZWRpLDI0CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJc2hsCWVkaSwyNAorCXhvcgllc2ksZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCWFuZAllZHgsMjU1CisJbW92engJZWR4LEJZVEUgW2VkeCoxK2VicC0xMjhdCisJbW92engJZWN4LGNoCisJbW92engJZWN4LEJZVEUgW2VjeCoxK2VicC0xMjhdCisJc2hsCWVjeCw4CisJeG9yCWVkeCxlY3gKKwltb3YJZWN4LGVzaQorCXNocgllYngsMTYKKwlhbmQJZWJ4LDI1NQorCW1vdnp4CWVieCxCWVRFIFtlYngqMStlYnAtMTI4XQorCXNobAllYngsMTYKKwl4b3IJZWR4LGVieAorCW1vdgllYngsRFdPUkQgWzgrZXNwXQorCXNocgllYXgsMjQKKwltb3Z6eAllYXgsQllURSBbZWF4KjErZWJwLTEyOF0KKwlzaGwJZWF4LDI0CisJeG9yCWVkeCxlYXgKKwltb3YJZWF4LERXT1JEIFs0K2VzcF0KKwl4b3IJZWF4LERXT1JEIFsxNitlZGldCisJeG9yCWVieCxEV09SRCBbMjArZWRpXQorCXhvcgllY3gsRFdPUkQgWzI0K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsyOCtlZGldCisJcmV0CithbGlnbgkxNgorX19zc2VfQUVTX2RlY3J5cHRfY29tcGFjdDoKKwlweG9yCW1tMCxbZWRpXQorCXB4b3IJbW00LFs4K2VkaV0KKwltb3YJZXNpLERXT1JEIFsyNDArZWRpXQorCWxlYQllc2ksW2VzaSoxK2VzaS0yXQorCWxlYQllc2ksW2VzaSo4K2VkaV0KKwltb3YJRFdPUkQgWzI0K2VzcF0sZXNpCisJbW92CWVheCw0NTQ3NjEyNDMKKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWF4CisJbW92CWVheCxEV09SRCBbZWJwLTEyOF0KKwltb3YJZWJ4LERXT1JEIFtlYnAtOTZdCisJbW92CWVjeCxEV09SRCBbZWJwLTY0XQorCW1vdgllZHgsRFdPUkQgW2VicC0zMl0KKwltb3YJZWF4LERXT1JEIFtlYnBdCisJbW92CWVieCxEV09SRCBbMzIrZWJwXQorCW1vdgllY3gsRFdPUkQgWzY0K2VicF0KKwltb3YJZWR4LERXT1JEIFs5NitlYnBdCithbGlnbgkxNgorTCQwMDdsb29wOgorCXBzaHVmdwltbTEsbW0wLDEyCisJcHNodWZ3CW1tNSxtbTQsOQorCW1vdmQJZWF4LG1tMQorCW1vdmQJZWJ4LG1tNQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwltb3Z6eAllc2ksYWwKKwltb3Z6eAllZHgsYWgKKwlwc2h1ZncJbW0yLG1tMCw2CisJbW92engJZWN4LEJZVEUgW2VzaSoxK2VicC0xMjhdCisJbW92engJZWRpLGJsCisJbW92engJZWR4LEJZVEUgW2VkeCoxK2VicC0xMjhdCisJc2hyCWVheCwxNgorCXNobAllZHgsOAorCW1vdnp4CWVzaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxiaAorCXNobAllc2ksMTYKKwlwc2h1ZncJbW02LG1tNCwzCisJb3IJZWN4LGVzaQorCW1vdnp4CWVzaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxhaAorCXNobAllc2ksMjQKKwlzaHIJZWJ4LDE2CisJb3IJZWR4LGVzaQorCW1vdnp4CWVzaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxiaAorCXNobAllc2ksMjQKKwlvcgllY3gsZXNpCisJbW92engJZXNpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJbW92engJZWRpLGFsCisJc2hsCWVzaSw4CisJbW92ZAllYXgsbW0yCisJb3IJZWN4LGVzaQorCW1vdnp4CWVzaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxibAorCXNobAllc2ksMTYKKwltb3ZkCWVieCxtbTYKKwltb3ZkCW1tMCxlY3gKKwltb3Z6eAllY3gsQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYWwKKwlvcgllY3gsZXNpCisJbW92engJZXNpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJbW92engJZWRpLGJsCisJb3IJZWR4LGVzaQorCW1vdnp4CWVzaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxhaAorCXNobAllc2ksMTYKKwlzaHIJZWF4LDE2CisJb3IJZWR4LGVzaQorCW1vdnp4CWVzaSxCWVRFIFtlZGkqMStlYnAtMTI4XQorCW1vdnp4CWVkaSxiaAorCXNocgllYngsMTYKKwlzaGwJZXNpLDgKKwltb3ZkCW1tMSxlZHgKKwltb3Z6eAllZHgsQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYmgKKwlzaGwJZWR4LDI0CisJYW5kCWVieCwyNTUKKwlvcgllZHgsZXNpCisJcHVucGNrbGRxCW1tMCxtbTEKKwltb3Z6eAllc2ksQllURSBbZWRpKjErZWJwLTEyOF0KKwltb3Z6eAllZGksYWwKKwlzaGwJZXNpLDgKKwltb3Z6eAllYXgsYWgKKwltb3Z6eAllYngsQllURSBbZWJ4KjErZWJwLTEyOF0KKwlvcgllY3gsZXNpCisJbW92engJZXNpLEJZVEUgW2VkaSoxK2VicC0xMjhdCisJb3IJZWR4LGVieAorCXNobAllc2ksMTYKKwltb3Z6eAllYXgsQllURSBbZWF4KjErZWJwLTEyOF0KKwlvcgllZHgsZXNpCisJc2hsCWVheCwyNAorCW9yCWVjeCxlYXgKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJbW92ZAltbTQsZWR4CisJbW92ZAltbTUsZWN4CisJcHVucGNrbGRxCW1tNCxtbTUKKwlhZGQJZWRpLDE2CisJY21wCWVkaSxEV09SRCBbMjQrZXNwXQorCWphCU5FQVIgTCQwMDhvdXQKKwltb3ZxCW1tMyxtbTAKKwltb3ZxCW1tNyxtbTQKKwlwc2h1ZncJbW0yLG1tMCwyMjgKKwlwc2h1ZncJbW02LG1tNCwyMjgKKwltb3ZxCW1tMSxtbTAKKwltb3ZxCW1tNSxtbTQKKwlwc2h1ZncJbW0wLG1tMCwxNzcKKwlwc2h1ZncJbW00LG1tNCwxNzcKKwlwc2xsZAltbTIsOAorCXBzbGxkCW1tNiw4CisJcHNybGQJbW0zLDgKKwlwc3JsZAltbTcsOAorCXB4b3IJbW0wLG1tMgorCXB4b3IJbW00LG1tNgorCXB4b3IJbW0wLG1tMworCXB4b3IJbW00LG1tNworCXBzbGxkCW1tMiwxNgorCXBzbGxkCW1tNiwxNgorCXBzcmxkCW1tMywxNgorCXBzcmxkCW1tNywxNgorCXB4b3IJbW0wLG1tMgorCXB4b3IJbW00LG1tNgorCXB4b3IJbW0wLG1tMworCXB4b3IJbW00LG1tNworCW1vdnEJbW0zLFs4K2VzcF0KKwlweG9yCW1tMixtbTIKKwlweG9yCW1tNixtbTYKKwlwY21wZ3RiCW1tMixtbTEKKwlwY21wZ3RiCW1tNixtbTUKKwlwYW5kCW1tMixtbTMKKwlwYW5kCW1tNixtbTMKKwlwYWRkYgltbTEsbW0xCisJcGFkZGIJbW01LG1tNQorCXB4b3IJbW0xLG1tMgorCXB4b3IJbW01LG1tNgorCW1vdnEJbW0zLG1tMQorCW1vdnEJbW03LG1tNQorCW1vdnEJbW0yLG1tMQorCW1vdnEJbW02LG1tNQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW00LG1tNQorCXBzbGxkCW1tMywyNAorCXBzbGxkCW1tNywyNAorCXBzcmxkCW1tMiw4CisJcHNybGQJbW02LDgKKwlweG9yCW1tMCxtbTMKKwlweG9yCW1tNCxtbTcKKwlweG9yCW1tMCxtbTIKKwlweG9yCW1tNCxtbTYKKwltb3ZxCW1tMixbOCtlc3BdCisJcHhvcgltbTMsbW0zCisJcHhvcgltbTcsbW03CisJcGNtcGd0YgltbTMsbW0xCisJcGNtcGd0YgltbTcsbW01CisJcGFuZAltbTMsbW0yCisJcGFuZAltbTcsbW0yCisJcGFkZGIJbW0xLG1tMQorCXBhZGRiCW1tNSxtbTUKKwlweG9yCW1tMSxtbTMKKwlweG9yCW1tNSxtbTcKKwlwc2h1ZncJbW0zLG1tMSwxNzcKKwlwc2h1ZncJbW03LG1tNSwxNzcKKwlweG9yCW1tMCxtbTEKKwlweG9yCW1tNCxtbTUKKwlweG9yCW1tMCxtbTMKKwlweG9yCW1tNCxtbTcKKwlweG9yCW1tMyxtbTMKKwlweG9yCW1tNyxtbTcKKwlwY21wZ3RiCW1tMyxtbTEKKwlwY21wZ3RiCW1tNyxtbTUKKwlwYW5kCW1tMyxtbTIKKwlwYW5kCW1tNyxtbTIKKwlwYWRkYgltbTEsbW0xCisJcGFkZGIJbW01LG1tNQorCXB4b3IJbW0xLG1tMworCXB4b3IJbW01LG1tNworCXB4b3IJbW0wLG1tMQorCXB4b3IJbW00LG1tNQorCW1vdnEJbW0zLG1tMQorCW1vdnEJbW03LG1tNQorCXBzaHVmdwltbTIsbW0xLDE3NworCXBzaHVmdwltbTYsbW01LDE3NworCXB4b3IJbW0wLG1tMgorCXB4b3IJbW00LG1tNgorCXBzbGxkCW1tMSw4CisJcHNsbGQJbW01LDgKKwlwc3JsZAltbTMsOAorCXBzcmxkCW1tNyw4CisJbW92cQltbTIsW2VkaV0KKwltb3ZxCW1tNixbOCtlZGldCisJcHhvcgltbTAsbW0xCisJcHhvcgltbTQsbW01CisJcHhvcgltbTAsbW0zCisJcHhvcgltbTQsbW03CisJbW92CWVheCxEV09SRCBbZWJwLTEyOF0KKwlwc2xsZAltbTEsMTYKKwlwc2xsZAltbTUsMTYKKwltb3YJZWJ4LERXT1JEIFtlYnAtNjRdCisJcHNybGQJbW0zLDE2CisJcHNybGQJbW03LDE2CisJbW92CWVjeCxEV09SRCBbZWJwXQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW00LG1tNQorCW1vdgllZHgsRFdPUkQgWzY0K2VicF0KKwlweG9yCW1tMCxtbTMKKwlweG9yCW1tNCxtbTcKKwlweG9yCW1tMCxtbTIKKwlweG9yCW1tNCxtbTYKKwlqbXAJTkVBUiBMJDAwN2xvb3AKK2FsaWduCTE2CitMJDAwOG91dDoKKwlweG9yCW1tMCxbZWRpXQorCXB4b3IJbW00LFs4K2VkaV0KKwlyZXQKK2FsaWduCTE2CitfX3g4Nl9BRVNfZGVjcnlwdDoKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWRpCisJeG9yCWVheCxEV09SRCBbZWRpXQorCXhvcgllYngsRFdPUkQgWzQrZWRpXQorCXhvcgllY3gsRFdPUkQgWzgrZWRpXQorCXhvcgllZHgsRFdPUkQgWzEyK2VkaV0KKwltb3YJZXNpLERXT1JEIFsyNDArZWRpXQorCWxlYQllc2ksW2VzaSoxK2VzaS0yXQorCWxlYQllc2ksW2VzaSo4K2VkaV0KKwltb3YJRFdPUkQgWzI0K2VzcF0sZXNpCithbGlnbgkxNgorTCQwMDlsb29wOgorCW1vdgllc2ksZWF4CisJYW5kCWVzaSwyNTUKKwltb3YJZXNpLERXT1JEIFtlc2kqOCtlYnBdCisJbW92engJZWRpLGRoCisJeG9yCWVzaSxEV09SRCBbMytlZGkqOCtlYnBdCisJbW92CWVkaSxlY3gKKwlzaHIJZWRpLDE2CisJYW5kCWVkaSwyNTUKKwl4b3IJZXNpLERXT1JEIFsyK2VkaSo4K2VicF0KKwltb3YJZWRpLGVieAorCXNocgllZGksMjQKKwl4b3IJZXNpLERXT1JEIFsxK2VkaSo4K2VicF0KKwltb3YJRFdPUkQgWzQrZXNwXSxlc2kKKwltb3YJZXNpLGVieAorCWFuZAllc2ksMjU1CisJbW92CWVzaSxEV09SRCBbZXNpKjgrZWJwXQorCW1vdnp4CWVkaSxhaAorCXhvcgllc2ksRFdPUkQgWzMrZWRpKjgrZWJwXQorCW1vdgllZGksZWR4CisJc2hyCWVkaSwxNgorCWFuZAllZGksMjU1CisJeG9yCWVzaSxEV09SRCBbMitlZGkqOCtlYnBdCisJbW92CWVkaSxlY3gKKwlzaHIJZWRpLDI0CisJeG9yCWVzaSxEV09SRCBbMStlZGkqOCtlYnBdCisJbW92CURXT1JEIFs4K2VzcF0sZXNpCisJbW92CWVzaSxlY3gKKwlhbmQJZXNpLDI1NQorCW1vdgllc2ksRFdPUkQgW2VzaSo4K2VicF0KKwltb3Z6eAllZGksYmgKKwl4b3IJZXNpLERXT1JEIFszK2VkaSo4K2VicF0KKwltb3YJZWRpLGVheAorCXNocgllZGksMTYKKwlhbmQJZWRpLDI1NQorCXhvcgllc2ksRFdPUkQgWzIrZWRpKjgrZWJwXQorCW1vdgllZGksZWR4CisJc2hyCWVkaSwyNAorCXhvcgllc2ksRFdPUkQgWzErZWRpKjgrZWJwXQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwlhbmQJZWR4LDI1NQorCW1vdgllZHgsRFdPUkQgW2VkeCo4K2VicF0KKwltb3Z6eAllY3gsY2gKKwl4b3IJZWR4LERXT1JEIFszK2VjeCo4K2VicF0KKwltb3YJZWN4LGVzaQorCXNocgllYngsMTYKKwlhbmQJZWJ4LDI1NQorCXhvcgllZHgsRFdPUkQgWzIrZWJ4KjgrZWJwXQorCW1vdgllYngsRFdPUkQgWzgrZXNwXQorCXNocgllYXgsMjQKKwl4b3IJZWR4LERXT1JEIFsxK2VheCo4K2VicF0KKwltb3YJZWF4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWRpLDE2CisJeG9yCWVheCxEV09SRCBbZWRpXQorCXhvcgllYngsRFdPUkQgWzQrZWRpXQorCXhvcgllY3gsRFdPUkQgWzgrZWRpXQorCXhvcgllZHgsRFdPUkQgWzEyK2VkaV0KKwljbXAJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CURXT1JEIFsyMCtlc3BdLGVkaQorCWpiCU5FQVIgTCQwMDlsb29wCisJbGVhCWVicCxbMjE3NitlYnBdCisJbW92CWVkaSxEV09SRCBbZWJwLTEyOF0KKwltb3YJZXNpLERXT1JEIFtlYnAtOTZdCisJbW92CWVkaSxEV09SRCBbZWJwLTY0XQorCW1vdgllc2ksRFdPUkQgW2VicC0zMl0KKwltb3YJZWRpLERXT1JEIFtlYnBdCisJbW92CWVzaSxEV09SRCBbMzIrZWJwXQorCW1vdgllZGksRFdPUkQgWzY0K2VicF0KKwltb3YJZXNpLERXT1JEIFs5NitlYnBdCisJbGVhCWVicCxbZWJwLTEyOF0KKwltb3YJZXNpLGVheAorCWFuZAllc2ksMjU1CisJbW92engJZXNpLEJZVEUgW2VzaSoxK2VicF0KKwltb3Z6eAllZGksZGgKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwXQorCXNobAllZGksOAorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlY3gKKwlzaHIJZWRpLDE2CisJYW5kCWVkaSwyNTUKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwXQorCXNobAllZGksMTYKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWJ4CisJc2hyCWVkaSwyNAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnBdCisJc2hsCWVkaSwyNAorCXhvcgllc2ksZWRpCisJbW92CURXT1JEIFs0K2VzcF0sZXNpCisJbW92CWVzaSxlYngKKwlhbmQJZXNpLDI1NQorCW1vdnp4CWVzaSxCWVRFIFtlc2kqMStlYnBdCisJbW92engJZWRpLGFoCisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicF0KKwlzaGwJZWRpLDgKKwl4b3IJZXNpLGVkaQorCW1vdgllZGksZWR4CisJc2hyCWVkaSwxNgorCWFuZAllZGksMjU1CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicF0KKwlzaGwJZWRpLDE2CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVjeAorCXNocgllZGksMjQKKwltb3Z6eAllZGksQllURSBbZWRpKjErZWJwXQorCXNobAllZGksMjQKKwl4b3IJZXNpLGVkaQorCW1vdglEV09SRCBbOCtlc3BdLGVzaQorCW1vdgllc2ksZWN4CisJYW5kCWVzaSwyNTUKKwltb3Z6eAllc2ksQllURSBbZXNpKjErZWJwXQorCW1vdnp4CWVkaSxiaAorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnBdCisJc2hsCWVkaSw4CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLGVheAorCXNocgllZGksMTYKKwlhbmQJZWRpLDI1NQorCW1vdnp4CWVkaSxCWVRFIFtlZGkqMStlYnBdCisJc2hsCWVkaSwxNgorCXhvcgllc2ksZWRpCisJbW92CWVkaSxlZHgKKwlzaHIJZWRpLDI0CisJbW92engJZWRpLEJZVEUgW2VkaSoxK2VicF0KKwlzaGwJZWRpLDI0CisJeG9yCWVzaSxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJYW5kCWVkeCwyNTUKKwltb3Z6eAllZHgsQllURSBbZWR4KjErZWJwXQorCW1vdnp4CWVjeCxjaAorCW1vdnp4CWVjeCxCWVRFIFtlY3gqMStlYnBdCisJc2hsCWVjeCw4CisJeG9yCWVkeCxlY3gKKwltb3YJZWN4LGVzaQorCXNocgllYngsMTYKKwlhbmQJZWJ4LDI1NQorCW1vdnp4CWVieCxCWVRFIFtlYngqMStlYnBdCisJc2hsCWVieCwxNgorCXhvcgllZHgsZWJ4CisJbW92CWVieCxEV09SRCBbOCtlc3BdCisJc2hyCWVheCwyNAorCW1vdnp4CWVheCxCWVRFIFtlYXgqMStlYnBdCisJc2hsCWVheCwyNAorCXhvcgllZHgsZWF4CisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJbGVhCWVicCxbZWJwLTIwNDhdCisJYWRkCWVkaSwxNgorCXhvcgllYXgsRFdPUkQgW2VkaV0KKwl4b3IJZWJ4LERXT1JEIFs0K2VkaV0KKwl4b3IJZWN4LERXT1JEIFs4K2VkaV0KKwl4b3IJZWR4LERXT1JEIFsxMitlZGldCisJcmV0CithbGlnbgk2NAorTCRBRVNfVGQ6CitkZAkxMzUzMTg0MzM3LDEzNTMxODQzMzcKK2RkCTEzOTkxNDQ4MzAsMTM5OTE0NDgzMAorZGQJMzI4MjMxMDkzOCwzMjgyMzEwOTM4CitkZAkyNTIyNzUyODI2LDI1MjI3NTI4MjYKK2RkCTM0MTI4MzEwMzUsMzQxMjgzMTAzNQorZGQJNDA0Nzg3MTI2Myw0MDQ3ODcxMjYzCitkZAkyODc0NzM1Mjc2LDI4NzQ3MzUyNzYKK2RkCTI0NjY1MDU1NDcsMjQ2NjUwNTU0NworZGQJMTQ0MjQ1OTY4MCwxNDQyNDU5NjgwCitkZAk0MTM0MzY4OTQxLDQxMzQzNjg5NDEKK2RkCTI0NDA0ODE5MjgsMjQ0MDQ4MTkyOAorZGQJNjI1NzM4NDg1LDYyNTczODQ4NQorZGQJNDI0MjAwNzM3NSw0MjQyMDA3Mzc1CitkZAkzNjIwNDE2MTk3LDM2MjA0MTYxOTcKK2RkCTIxNTE5NTM3MDIsMjE1MTk1MzcwMgorZGQJMjQwOTg0OTUyNSwyNDA5ODQ5NTI1CitkZAkxMjMwNjgwNTQyLDEyMzA2ODA1NDIKK2RkCTE3Mjk4NzAzNzMsMTcyOTg3MDM3MworZGQJMjU1MTExNDMwOSwyNTUxMTE0MzA5CitkZAkzNzg3NTIxNjI5LDM3ODc1MjE2MjkKK2RkCTQxMjM0MzcxLDQxMjM0MzcxCitkZAkzMTc3MzgxMTMsMzE3NzM4MTEzCitkZAkyNzQ0NjAwMjA1LDI3NDQ2MDAyMDUKK2RkCTMzMzgyNjEzNTUsMzMzODI2MTM1NQorZGQJMzg4MTc5OTQyNywzODgxNzk5NDI3CitkZAkyNTEwMDY2MTk3LDI1MTAwNjYxOTcKK2RkCTM5NTA2NjkyNDcsMzk1MDY2OTI0NworZGQJMzY2MzI4NjkzMywzNjYzMjg2OTMzCitkZAk3NjM2MDg3ODgsNzYzNjA4Nzg4CitkZAkzNTQyMTg1MDQ4LDM1NDIxODUwNDgKK2RkCTY5NDgwNDU1Myw2OTQ4MDQ1NTMKK2RkCTExNTQwMDk0ODYsMTE1NDAwOTQ4NgorZGQJMTc4NzQxMzEwOSwxNzg3NDEzMTA5CitkZAkyMDIxMjMyMzcyLDIwMjEyMzIzNzIKK2RkCTE3OTkyNDgwMjUsMTc5OTI0ODAyNQorZGQJMzcxNTIxNzcwMywzNzE1MjE3NzAzCitkZAkzMDU4Njg4NDQ2LDMwNTg2ODg0NDYKK2RkCTM5NzI0ODc1MiwzOTcyNDg3NTIKK2RkCTE3MjI1NTY2MTcsMTcyMjU1NjYxNworZGQJMzAyMzc1MjgyOSwzMDIzNzUyODI5CitkZAk0MDc1NjAwMzUsNDA3NTYwMDM1CitkZAkyMTg0MjU2MjI5LDIxODQyNTYyMjkKK2RkCTE2MTM5NzU5NTksMTYxMzk3NTk1OQorZGQJMTE2NTk3MjMyMiwxMTY1OTcyMzIyCitkZAkzNzY1OTIwOTQ1LDM3NjU5MjA5NDUKK2RkCTIyMjYwMjMzNTUsMjIyNjAyMzM1NQorZGQJNDgwMjgxMDg2LDQ4MDI4MTA4NgorZGQJMjQ4NTg0ODMxMywyNDg1ODQ4MzEzCitkZAkxNDgzMjI5Mjk2LDE0ODMyMjkyOTYKK2RkCTQzNjAyODgxNSw0MzYwMjg4MTUKK2RkCTIyNzIwNTkwMjgsMjI3MjA1OTAyOAorZGQJMzA4NjUxNTAyNiwzMDg2NTE1MDI2CitkZAk2MDEwNjAyNjcsNjAxMDYwMjY3CitkZAkzNzkxODAxMjAyLDM3OTE4MDEyMDIKK2RkCTE0Njg5OTc2MDMsMTQ2ODk5NzYwMworZGQJNzE1ODcxNTkwLDcxNTg3MTU5MAorZGQJMTIwMTIyMjkwLDEyMDEyMjI5MAorZGQJNjMwOTIwMTUsNjMwOTIwMTUKK2RkCTI1OTE4MDI3NTgsMjU5MTgwMjc1OAorZGQJMjc2ODc3OTIxOSwyNzY4Nzc5MjE5CitkZAk0MDY4OTQzOTIwLDQwNjg5NDM5MjAKK2RkCTI5OTcyMDY4MTksMjk5NzIwNjgxOQorZGQJMzEyNzUwOTc2MiwzMTI3NTA5NzYyCitkZAkxNTUyMDI5NDIxLDE1NTIwMjk0MjEKK2RkCTcyMzMwODQyNiw3MjMzMDg0MjYKK2RkCTI0NjEzMDExNTksMjQ2MTMwMTE1OQorZGQJNDA0MjM5MzU4Nyw0MDQyMzkzNTg3CitkZAkyNzE1OTY5ODcwLDI3MTU5Njk4NzAKK2RkCTM0NTUzNzU5NzMsMzQ1NTM3NTk3MworZGQJMzU4NjAwMDEzNCwzNTg2MDAwMTM0CitkZAk1MjY1Mjk3NDUsNTI2NTI5NzQ1CitkZAkyMzMxOTQ0NjQ0LDIzMzE5NDQ2NDQKK2RkCTI2Mzk0NzQyMjgsMjYzOTQ3NDIyOAorZGQJMjY4OTk4NzQ5MCwyNjg5OTg3NDkwCitkZAk4NTM2NDE3MzMsODUzNjQxNzMzCitkZAkxOTc4Mzk4MzcyLDE5NzgzOTgzNzIKK2RkCTk3MTgwMTM1NSw5NzE4MDEzNTUKK2RkCTI4Njc4MTQ0NjQsMjg2NzgxNDQ2NAorZGQJMTExMTEyNTQyLDExMTExMjU0MgorZGQJMTM2MDAzMTQyMSwxMzYwMDMxNDIxCitkZAk0MTg2NTc5MjYyLDQxODY1NzkyNjIKK2RkCTEwMjM4NjAxMTgsMTAyMzg2MDExOAorZGQJMjkxOTU3OTM1NywyOTE5NTc5MzU3CitkZAkxMTg2ODUwMzgxLDExODY4NTAzODEKK2RkCTMwNDU5MzgzMjEsMzA0NTkzODMyMQorZGQJOTAwMzEyMTcsOTAwMzEyMTcKK2RkCTE4NzYxNjYxNDgsMTg3NjE2NjE0OAorZGQJNDI3OTU4NjkxMiw0Mjc5NTg2OTEyCitkZAk2MjA0NjgyNDksNjIwNDY4MjQ5CitkZAkyNTQ4Njc4MTAyLDI1NDg2NzgxMDIKK2RkCTM0MjY5NTk0OTcsMzQyNjk1OTQ5NworZGQJMjAwNjg5OTA0NywyMDA2ODk5MDQ3CitkZAkzMTc1Mjc4NzY4LDMxNzUyNzg3NjgKK2RkCTIyOTA4NDU5NTksMjI5MDg0NTk1OQorZGQJOTQ1NDk0NTAzLDk0NTQ5NDUwMworZGQJMzY4OTg1OTE5MywzNjg5ODU5MTkzCitkZAkxMTkxODY5NjAxLDExOTE4Njk2MDEKK2RkCTM5MTAwOTEzODgsMzkxMDA5MTM4OAorZGQJMzM3NDIyMDUzNiwzMzc0MjIwNTM2CitkZAkwLDAKK2RkCTIyMDY2Mjk4OTcsMjIwNjYyOTg5NworZGQJMTIyMzUwMjY0MiwxMjIzNTAyNjQyCitkZAkyODkzMDI1NTY2LDI4OTMwMjU1NjYKK2RkCTEzMTYxMTcxMDAsMTMxNjExNzEwMAorZGQJNDIyNzc5NjczMyw0MjI3Nzk2NzMzCitkZAkxNDQ2NTQ0NjU1LDE0NDY1NDQ2NTUKK2RkCTUxNzMyMDI1Myw1MTczMjAyNTMKK2RkCTY1ODA1ODU1MCw2NTgwNTg1NTAKK2RkCTE2OTE5NDY3NjIsMTY5MTk0Njc2MgorZGQJNTY0NTUwNzYwLDU2NDU1MDc2MAorZGQJMzUxMTk2NjYxOSwzNTExOTY2NjE5CitkZAk5NzYxMDcwNDQsOTc2MTA3MDQ0CitkZAkyOTc2MzIwMDEyLDI5NzYzMjAwMTIKK2RkCTI2NjgxOTQ3NSwyNjY4MTk0NzUKK2RkCTM1MzMxMDY4NjgsMzUzMzEwNjg2OAorZGQJMjY2MDM0MjU1NSwyNjYwMzQyNTU1CitkZAkxMzM4MzU5OTM2LDEzMzgzNTk5MzYKK2RkCTI3MjAwNjI1NjEsMjcyMDA2MjU2MQorZGQJMTc2NjU1MzQzNCwxNzY2NTUzNDM0CitkZAkzNzA4MDczMjQsMzcwODA3MzI0CitkZAkxNzk5OTk3MTQsMTc5OTk5NzE0CitkZAkzODQ0Nzc2MTI4LDM4NDQ3NzYxMjgKK2RkCTExMzg3NjIzMDAsMTEzODc2MjMwMAorZGQJNDg4MDUzNTIyLDQ4ODA1MzUyMgorZGQJMTg1NDAzNjYyLDE4NTQwMzY2MgorZGQJMjkxNTUzNTg1OCwyOTE1NTM1ODU4CitkZAkzMTE0ODQxNjQ1LDMxMTQ4NDE2NDUKK2RkCTMzNjY1MjY0ODQsMzM2NjUyNjQ4NAorZGQJMjIzMzA2OTkxMSwyMjMzMDY5OTExCitkZAkxMjc1NTU3Mjk1LDEyNzU1NTcyOTUKK2RkCTMxNTE4NjIyNTQsMzE1MTg2MjI1NAorZGQJNDI1MDk1OTc3OSw0MjUwOTU5Nzc5CitkZAkyNjcwMDY4MjE1LDI2NzAwNjgyMTUKK2RkCTMxNzAyMDIyMDQsMzE3MDIwMjIwNAorZGQJMzMwOTAwNDM1NiwzMzA5MDA0MzU2CitkZAk4ODA3MzcxMTUsODgwNzM3MTE1CitkZAkxOTgyNDE1NzU1LDE5ODI0MTU3NTUKK2RkCTM3MDM5NzI4MTEsMzcwMzk3MjgxMQorZGQJMTc2MTQwNjM5MCwxNzYxNDA2MzkwCitkZAkxNjc2Nzk3MTEyLDE2NzY3OTcxMTIKK2RkCTM0MDM0MjgzMTEsMzQwMzQyODMxMQorZGQJMjc3MTc3MTU0LDI3NzE3NzE1NAorZGQJMTA3NjAwODcyMywxMDc2MDA4NzIzCitkZAk1MzgwMzU4NDQsNTM4MDM1ODQ0CitkZAkyMDk5NTMwMzczLDIwOTk1MzAzNzMKK2RkCTQxNjQ3OTUzNDYsNDE2NDc5NTM0NgorZGQJMjg4NTUzMzkwLDI4ODU1MzM5MAorZGQJMTgzOTI3ODUzNSwxODM5Mjc4NTM1CitkZAkxMjYxNDExODY5LDEyNjE0MTE4NjkKK2RkCTQwODAwNTUwMDQsNDA4MDA1NTAwNAorZGQJMzk2NDgzMTI0NSwzOTY0ODMxMjQ1CitkZAkzNTA0NTg3MTI3LDM1MDQ1ODcxMjcKK2RkCTE4MTM0MjY5ODcsMTgxMzQyNjk4NworZGQJMjU3OTA2NzA0OSwyNTc5MDY3MDQ5CitkZAk0MTk5MDYwNDk3LDQxOTkwNjA0OTcKK2RkCTU3NzAzODY2Myw1NzcwMzg2NjMKK2RkCTMyOTc1NzQwNTYsMzI5NzU3NDA1NgorZGQJNDQwMzk3OTg0LDQ0MDM5Nzk4NAorZGQJMzYyNjc5NDMyNiwzNjI2Nzk0MzI2CitkZAk0MDE5MjA0ODk4LDQwMTkyMDQ4OTgKK2RkCTMzNDM3OTY2MTUsMzM0Mzc5NjYxNQorZGQJMzI1MTcxNDI2NSwzMjUxNzE0MjY1CitkZAk0MjcyMDgxNTQ4LDQyNzIwODE1NDgKK2RkCTkwNjc0NDk4NCw5MDY3NDQ5ODQKK2RkCTM0ODE0MDA3NDIsMzQ4MTQwMDc0MgorZGQJNjg1NjY5MDI5LDY4NTY2OTAyOQorZGQJNjQ2ODg3Mzg2LDY0Njg4NzM4NgorZGQJMjc2NDAyNTE1MSwyNzY0MDI1MTUxCitkZAkzODM1NTA5MjkyLDM4MzU1MDkyOTIKK2RkCTIyNzcwMjg2NCwyMjc3MDI4NjQKK2RkCTI2MTM4NjIyNTAsMjYxMzg2MjI1MAorZGQJMTY0ODc4NzAyOCwxNjQ4Nzg3MDI4CitkZAkzMjU2MDYxNDMwLDMyNTYwNjE0MzAKK2RkCTM5MDQ0MjgxNzYsMzkwNDQyODE3NgorZGQJMTU5MzI2MDMzNCwxNTkzMjYwMzM0CitkZAk0MTIxOTM2NzcwLDQxMjE5MzY3NzAKK2RkCTMxOTYwODM2MTUsMzE5NjA4MzYxNQorZGQJMjA5MDA2MTkyOSwyMDkwMDYxOTI5CitkZAkyODM4MzUzMjYzLDI4MzgzNTMyNjMKK2RkCTMwMDQzMTA5OTEsMzAwNDMxMDk5MQorZGQJOTk5OTI2OTg0LDk5OTkyNjk4NAorZGQJMjgwOTk5MzIzMiwyODA5OTkzMjMyCitkZAkxODUyMDIxOTkyLDE4NTIwMjE5OTIKK2RkCTIwNzU4NjgxMjMsMjA3NTg2ODEyMworZGQJMTU4ODY5MTk3LDE1ODg2OTE5NworZGQJNDA5NTIzNjQ2Miw0MDk1MjM2NDYyCitkZAkyODgwOTk2NCwyODgwOTk2NAorZGQJMjgyODY4NTE4NywyODI4Njg1MTg3CitkZAkxNzAxNzQ2MTUwLDE3MDE3NDYxNTAKK2RkCTIxMjkwNjc5NDYsMjEyOTA2Nzk0NgorZGQJMTQ3ODMxODQxLDE0NzgzMTg0MQorZGQJMzg3Mzk2OTY0NywzODczOTY5NjQ3CitkZAkzNjUwODczMjc0LDM2NTA4NzMyNzQKK2RkCTM0NTk2NzM5MzAsMzQ1OTY3MzkzMAorZGQJMzU1NzQwMDU1NCwzNTU3NDAwNTU0CitkZAkzNTk4NDk1Nzg1LDM1OTg0OTU3ODUKK2RkCTI5NDc3MjAyNDEsMjk0NzcyMDI0MQorZGQJODI0MzkzNTE0LDgyNDM5MzUxNAorZGQJODE1MDQ4MTM0LDgxNTA0ODEzNAorZGQJMzIyNzk1MTY2OSwzMjI3OTUxNjY5CitkZAk5MzUwODc3MzIsOTM1MDg3NzMyCitkZAkyNzk4Mjg5NjYwLDI3OTgyODk2NjAKK2RkCTI5NjY0NTg1OTIsMjk2NjQ1ODU5MgorZGQJMzY2NTIwMTE1LDM2NjUyMDExNQorZGQJMTI1MTQ3NjcyMSwxMjUxNDc2NzIxCitkZAk0MTU4MzE5NjgxLDQxNTgzMTk2ODEKK2RkCTI0MDE3NjUxMSwyNDAxNzY1MTEKK2RkCTgwNDY4ODE1MSw4MDQ2ODgxNTEKK2RkCTIzNzk2MzE5OTAsMjM3OTYzMTk5MAorZGQJMTMwMzQ0MTIxOSwxMzAzNDQxMjE5CitkZAkxNDE0Mzc2MTQwLDE0MTQzNzYxNDAKK2RkCTM3NDE2MTk5NDAsMzc0MTYxOTk0MAorZGQJMzgyMDM0MzcxMCwzODIwMzQzNzEwCitkZAk0NjE5MjQ5NDAsNDYxOTI0OTQwCitkZAkzMDg5MDUwODE3LDMwODkwNTA4MTcKK2RkCTIxMzYwNDA3NzQsMjEzNjA0MDc3NAorZGQJODI0Njg1MDksODI0Njg1MDkKK2RkCTE1NjM3OTAzMzcsMTU2Mzc5MDMzNworZGQJMTkzNzAxNjgyNiwxOTM3MDE2ODI2CitkZAk3NzYwMTQ4NDMsNzc2MDE0ODQzCitkZAkxNTExODc2NTMxLDE1MTE4NzY1MzEKK2RkCTEzODk1NTA0ODIsMTM4OTU1MDQ4MgorZGQJODYxMjc4NDQxLDg2MTI3ODQ0MQorZGQJMzIzNDc1MDUzLDMyMzQ3NTA1MworZGQJMjM1NTIyMjQyNiwyMzU1MjIyNDI2CitkZAkyMDQ3NjQ4MDU1LDIwNDc2NDgwNTUKK2RkCTIzODM3Mzg5NjksMjM4MzczODk2OQorZGQJMjMwMjQxNTg1MSwyMzAyNDE1ODUxCitkZAkzOTk1NTc2NzgyLDM5OTU1NzY3ODIKK2RkCTkwMjM5MDE5OSw5MDIzOTAxOTkKK2RkCTM5OTEyMTUzMjksMzk5MTIxNTMyOQorZGQJMTAxODI1MTEzMCwxMDE4MjUxMTMwCitkZAkxNTA3ODQwNjY4LDE1MDc4NDA2NjgKK2RkCTEwNjQ1NjMyODUsMTA2NDU2MzI4NQorZGQJMjA0MzU0ODY5NiwyMDQzNTQ4Njk2CitkZAkzMjA4MTAzNzk1LDMyMDgxMDM3OTUKK2RkCTM5MzkzNjY3MzksMzkzOTM2NjczOQorZGQJMTUzNzkzMjYzOSwxNTM3OTMyNjM5CitkZAkzNDI4MzQ2NTUsMzQyODM0NjU1CitkZAkyMjYyNTE2ODU2LDIyNjI1MTY4NTYKK2RkCTIxODAyMzExMTQsMjE4MDIzMTExNAorZGQJMTA1MzA1OTI1NywxMDUzMDU5MjU3CitkZAk3NDE2MTQ2NDgsNzQxNjE0NjQ4CitkZAkxNTk4MDcxNzQ2LDE1OTgwNzE3NDYKK2RkCTE5MjUzODk1OTAsMTkyNTM4OTU5MAorZGQJMjAzODA5NDY4LDIwMzgwOTQ2OAorZGQJMjMzNjgzMjU1MiwyMzM2ODMyNTUyCitkZAkxMTAwMjg3NDg3LDExMDAyODc0ODcKK2RkCTE4OTU5MzQwMDksMTg5NTkzNDAwOQorZGQJMzczNjI3NTk3NiwzNzM2Mjc1OTc2CitkZAkyNjMyMjM0MjAwLDI2MzIyMzQyMDAKK2RkCTI0Mjg1ODk2NjgsMjQyODU4OTY2OAorZGQJMTYzNjA5Mjc5NSwxNjM2MDkyNzk1CitkZAkxODkwOTg4NzU3LDE4OTA5ODg3NTcKK2RkCTE5NTIyMTQwODgsMTk1MjIxNDA4OAorZGQJMTExMzA0NTIwMCwxMTEzMDQ1MjAwCitkYgk4Miw5LDEwNiwyMTMsNDgsNTQsMTY1LDU2CitkYgkxOTEsNjQsMTYzLDE1OCwxMjksMjQzLDIxNSwyNTEKK2RiCTEyNCwyMjcsNTcsMTMwLDE1NSw0NywyNTUsMTM1CitkYgk1MiwxNDIsNjcsNjgsMTk2LDIyMiwyMzMsMjAzCitkYgk4NCwxMjMsMTQ4LDUwLDE2NiwxOTQsMzUsNjEKK2RiCTIzOCw3NiwxNDksMTEsNjYsMjUwLDE5NSw3OAorZGIJOCw0NiwxNjEsMTAyLDQwLDIxNywzNiwxNzgKK2RiCTExOCw5MSwxNjIsNzMsMTA5LDEzOSwyMDksMzcKK2RiCTExNCwyNDgsMjQ2LDEwMCwxMzQsMTA0LDE1MiwyMgorZGIJMjEyLDE2NCw5MiwyMDQsOTMsMTAxLDE4MiwxNDYKK2RiCTEwOCwxMTIsNzIsODAsMjUzLDIzNywxODUsMjE4CitkYgk5NCwyMSw3MCw4NywxNjcsMTQxLDE1NywxMzIKK2RiCTE0NCwyMTYsMTcxLDAsMTQwLDE4OCwyMTEsMTAKK2RiCTI0NywyMjgsODgsNSwxODQsMTc5LDY5LDYKK2RiCTIwOCw0NCwzMCwxNDMsMjAyLDYzLDE1LDIKK2RiCTE5MywxNzUsMTg5LDMsMSwxOSwxMzgsMTA3CitkYgk1OCwxNDUsMTcsNjUsNzksMTAzLDIyMCwyMzQKK2RiCTE1MSwyNDIsMjA3LDIwNiwyNDAsMTgwLDIzMCwxMTUKK2RiCTE1MCwxNzIsMTE2LDM0LDIzMSwxNzMsNTMsMTMzCitkYgkyMjYsMjQ5LDU1LDIzMiwyOCwxMTcsMjIzLDExMAorZGIJNzEsMjQxLDI2LDExMywyOSw0MSwxOTcsMTM3CitkYgkxMTEsMTgzLDk4LDE0LDE3MCwyNCwxOTAsMjcKK2RiCTI1Miw4Niw2Miw3NSwxOTgsMjEwLDEyMSwzMgorZGIJMTU0LDIxOSwxOTIsMjU0LDEyMCwyMDUsOTAsMjQ0CitkYgkzMSwyMjEsMTY4LDUxLDEzNiw3LDE5OSw0OQorZGIJMTc3LDE4LDE2LDg5LDM5LDEyOCwyMzYsOTUKK2RiCTk2LDgxLDEyNywxNjksMjUsMTgxLDc0LDEzCitkYgk0NSwyMjksMTIyLDE1OSwxNDcsMjAxLDE1NiwyMzkKK2RiCTE2MCwyMjQsNTksNzcsMTc0LDQyLDI0NSwxNzYKK2RiCTIwMCwyMzUsMTg3LDYwLDEzMSw4MywxNTMsOTcKK2RiCTIzLDQzLDQsMTI2LDE4NiwxMTksMjE0LDM4CitkYgkyMjUsMTA1LDIwLDk5LDg1LDMzLDEyLDEyNQorZGIJODIsOSwxMDYsMjEzLDQ4LDU0LDE2NSw1NgorZGIJMTkxLDY0LDE2MywxNTgsMTI5LDI0MywyMTUsMjUxCitkYgkxMjQsMjI3LDU3LDEzMCwxNTUsNDcsMjU1LDEzNQorZGIJNTIsMTQyLDY3LDY4LDE5NiwyMjIsMjMzLDIwMworZGIJODQsMTIzLDE0OCw1MCwxNjYsMTk0LDM1LDYxCitkYgkyMzgsNzYsMTQ5LDExLDY2LDI1MCwxOTUsNzgKK2RiCTgsNDYsMTYxLDEwMiw0MCwyMTcsMzYsMTc4CitkYgkxMTgsOTEsMTYyLDczLDEwOSwxMzksMjA5LDM3CitkYgkxMTQsMjQ4LDI0NiwxMDAsMTM0LDEwNCwxNTIsMjIKK2RiCTIxMiwxNjQsOTIsMjA0LDkzLDEwMSwxODIsMTQ2CitkYgkxMDgsMTEyLDcyLDgwLDI1MywyMzcsMTg1LDIxOAorZGIJOTQsMjEsNzAsODcsMTY3LDE0MSwxNTcsMTMyCitkYgkxNDQsMjE2LDE3MSwwLDE0MCwxODgsMjExLDEwCitkYgkyNDcsMjI4LDg4LDUsMTg0LDE3OSw2OSw2CitkYgkyMDgsNDQsMzAsMTQzLDIwMiw2MywxNSwyCitkYgkxOTMsMTc1LDE4OSwzLDEsMTksMTM4LDEwNworZGIJNTgsMTQ1LDE3LDY1LDc5LDEwMywyMjAsMjM0CitkYgkxNTEsMjQyLDIwNywyMDYsMjQwLDE4MCwyMzAsMTE1CitkYgkxNTAsMTcyLDExNiwzNCwyMzEsMTczLDUzLDEzMworZGIJMjI2LDI0OSw1NSwyMzIsMjgsMTE3LDIyMywxMTAKK2RiCTcxLDI0MSwyNiwxMTMsMjksNDEsMTk3LDEzNworZGIJMTExLDE4Myw5OCwxNCwxNzAsMjQsMTkwLDI3CitkYgkyNTIsODYsNjIsNzUsMTk4LDIxMCwxMjEsMzIKK2RiCTE1NCwyMTksMTkyLDI1NCwxMjAsMjA1LDkwLDI0NAorZGIJMzEsMjIxLDE2OCw1MSwxMzYsNywxOTksNDkKK2RiCTE3NywxOCwxNiw4OSwzOSwxMjgsMjM2LDk1CitkYgk5Niw4MSwxMjcsMTY5LDI1LDE4MSw3NCwxMworZGIJNDUsMjI5LDEyMiwxNTksMTQ3LDIwMSwxNTYsMjM5CitkYgkxNjAsMjI0LDU5LDc3LDE3NCw0MiwyNDUsMTc2CitkYgkyMDAsMjM1LDE4Nyw2MCwxMzEsODMsMTUzLDk3CitkYgkyMyw0Myw0LDEyNiwxODYsMTE5LDIxNCwzOAorZGIJMjI1LDEwNSwyMCw5OSw4NSwzMywxMiwxMjUKK2RiCTgyLDksMTA2LDIxMyw0OCw1NCwxNjUsNTYKK2RiCTE5MSw2NCwxNjMsMTU4LDEyOSwyNDMsMjE1LDI1MQorZGIJMTI0LDIyNyw1NywxMzAsMTU1LDQ3LDI1NSwxMzUKK2RiCTUyLDE0Miw2Nyw2OCwxOTYsMjIyLDIzMywyMDMKK2RiCTg0LDEyMywxNDgsNTAsMTY2LDE5NCwzNSw2MQorZGIJMjM4LDc2LDE0OSwxMSw2NiwyNTAsMTk1LDc4CitkYgk4LDQ2LDE2MSwxMDIsNDAsMjE3LDM2LDE3OAorZGIJMTE4LDkxLDE2Miw3MywxMDksMTM5LDIwOSwzNworZGIJMTE0LDI0OCwyNDYsMTAwLDEzNCwxMDQsMTUyLDIyCitkYgkyMTIsMTY0LDkyLDIwNCw5MywxMDEsMTgyLDE0NgorZGIJMTA4LDExMiw3Miw4MCwyNTMsMjM3LDE4NSwyMTgKK2RiCTk0LDIxLDcwLDg3LDE2NywxNDEsMTU3LDEzMgorZGIJMTQ0LDIxNiwxNzEsMCwxNDAsMTg4LDIxMSwxMAorZGIJMjQ3LDIyOCw4OCw1LDE4NCwxNzksNjksNgorZGIJMjA4LDQ0LDMwLDE0MywyMDIsNjMsMTUsMgorZGIJMTkzLDE3NSwxODksMywxLDE5LDEzOCwxMDcKK2RiCTU4LDE0NSwxNyw2NSw3OSwxMDMsMjIwLDIzNAorZGIJMTUxLDI0MiwyMDcsMjA2LDI0MCwxODAsMjMwLDExNQorZGIJMTUwLDE3MiwxMTYsMzQsMjMxLDE3Myw1MywxMzMKK2RiCTIyNiwyNDksNTUsMjMyLDI4LDExNywyMjMsMTEwCitkYgk3MSwyNDEsMjYsMTEzLDI5LDQxLDE5NywxMzcKK2RiCTExMSwxODMsOTgsMTQsMTcwLDI0LDE5MCwyNworZGIJMjUyLDg2LDYyLDc1LDE5OCwyMTAsMTIxLDMyCitkYgkxNTQsMjE5LDE5MiwyNTQsMTIwLDIwNSw5MCwyNDQKK2RiCTMxLDIyMSwxNjgsNTEsMTM2LDcsMTk5LDQ5CitkYgkxNzcsMTgsMTYsODksMzksMTI4LDIzNiw5NQorZGIJOTYsODEsMTI3LDE2OSwyNSwxODEsNzQsMTMKK2RiCTQ1LDIyOSwxMjIsMTU5LDE0NywyMDEsMTU2LDIzOQorZGIJMTYwLDIyNCw1OSw3NywxNzQsNDIsMjQ1LDE3NgorZGIJMjAwLDIzNSwxODcsNjAsMTMxLDgzLDE1Myw5NworZGIJMjMsNDMsNCwxMjYsMTg2LDExOSwyMTQsMzgKK2RiCTIyNSwxMDUsMjAsOTksODUsMzMsMTIsMTI1CitkYgk4Miw5LDEwNiwyMTMsNDgsNTQsMTY1LDU2CitkYgkxOTEsNjQsMTYzLDE1OCwxMjksMjQzLDIxNSwyNTEKK2RiCTEyNCwyMjcsNTcsMTMwLDE1NSw0NywyNTUsMTM1CitkYgk1MiwxNDIsNjcsNjgsMTk2LDIyMiwyMzMsMjAzCitkYgk4NCwxMjMsMTQ4LDUwLDE2NiwxOTQsMzUsNjEKK2RiCTIzOCw3NiwxNDksMTEsNjYsMjUwLDE5NSw3OAorZGIJOCw0NiwxNjEsMTAyLDQwLDIxNywzNiwxNzgKK2RiCTExOCw5MSwxNjIsNzMsMTA5LDEzOSwyMDksMzcKK2RiCTExNCwyNDgsMjQ2LDEwMCwxMzQsMTA0LDE1MiwyMgorZGIJMjEyLDE2NCw5MiwyMDQsOTMsMTAxLDE4MiwxNDYKK2RiCTEwOCwxMTIsNzIsODAsMjUzLDIzNywxODUsMjE4CitkYgk5NCwyMSw3MCw4NywxNjcsMTQxLDE1NywxMzIKK2RiCTE0NCwyMTYsMTcxLDAsMTQwLDE4OCwyMTEsMTAKK2RiCTI0NywyMjgsODgsNSwxODQsMTc5LDY5LDYKK2RiCTIwOCw0NCwzMCwxNDMsMjAyLDYzLDE1LDIKK2RiCTE5MywxNzUsMTg5LDMsMSwxOSwxMzgsMTA3CitkYgk1OCwxNDUsMTcsNjUsNzksMTAzLDIyMCwyMzQKK2RiCTE1MSwyNDIsMjA3LDIwNiwyNDAsMTgwLDIzMCwxMTUKK2RiCTE1MCwxNzIsMTE2LDM0LDIzMSwxNzMsNTMsMTMzCitkYgkyMjYsMjQ5LDU1LDIzMiwyOCwxMTcsMjIzLDExMAorZGIJNzEsMjQxLDI2LDExMywyOSw0MSwxOTcsMTM3CitkYgkxMTEsMTgzLDk4LDE0LDE3MCwyNCwxOTAsMjcKK2RiCTI1Miw4Niw2Miw3NSwxOTgsMjEwLDEyMSwzMgorZGIJMTU0LDIxOSwxOTIsMjU0LDEyMCwyMDUsOTAsMjQ0CitkYgkzMSwyMjEsMTY4LDUxLDEzNiw3LDE5OSw0OQorZGIJMTc3LDE4LDE2LDg5LDM5LDEyOCwyMzYsOTUKK2RiCTk2LDgxLDEyNywxNjksMjUsMTgxLDc0LDEzCitkYgk0NSwyMjksMTIyLDE1OSwxNDcsMjAxLDE1NiwyMzkKK2RiCTE2MCwyMjQsNTksNzcsMTc0LDQyLDI0NSwxNzYKK2RiCTIwMCwyMzUsMTg3LDYwLDEzMSw4MywxNTMsOTcKK2RiCTIzLDQzLDQsMTI2LDE4NiwxMTksMjE0LDM4CitkYgkyMjUsMTA1LDIwLDk5LDg1LDMzLDEyLDEyNQorZ2xvYmFsCV9hZXNfbm9od19kZWNyeXB0CithbGlnbgkxNgorX2Flc19ub2h3X2RlY3J5cHQ6CitMJF9hZXNfbm9od19kZWNyeXB0X2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwltb3YJZWF4LGVzcAorCXN1Ygllc3AsMzYKKwlhbmQJZXNwLC02NAorCWxlYQllYngsW2VkaS0xMjddCisJc3ViCWVieCxlc3AKKwluZWcJZWJ4CisJYW5kCWVieCw5NjAKKwlzdWIJZXNwLGVieAorCWFkZAllc3AsNAorCW1vdglEV09SRCBbMjgrZXNwXSxlYXgKKwljYWxsCUwkMDEwcGljX3BvaW50CitMJDAxMHBpY19wb2ludDoKKwlwb3AJZWJwCisJbGVhCWVheCxbX09QRU5TU0xfaWEzMmNhcF9QXQorCWxlYQllYnAsWyhMJEFFU19UZC1MJDAxMHBpY19wb2ludCkrZWJwXQorCWxlYQllYngsWzc2NCtlc3BdCisJc3ViCWVieCxlYnAKKwlhbmQJZWJ4LDc2OAorCWxlYQllYnAsWzIxNzYrZWJ4KjErZWJwXQorCWJ0CURXT1JEIFtlYXhdLDI1CisJam5jCU5FQVIgTCQwMTF4ODYKKwltb3ZxCW1tMCxbZXNpXQorCW1vdnEJbW00LFs4K2VzaV0KKwljYWxsCV9fc3NlX0FFU19kZWNyeXB0X2NvbXBhY3QKKwltb3YJZXNwLERXT1JEIFsyOCtlc3BdCisJbW92CWVzaSxEV09SRCBbMjQrZXNwXQorCW1vdnEJW2VzaV0sbW0wCisJbW92cQlbOCtlc2ldLG1tNAorCWVtbXMKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CithbGlnbgkxNgorTCQwMTF4ODY6CisJbW92CURXT1JEIFsyNCtlc3BdLGVicAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlc2ldCisJY2FsbAlfX3g4Nl9BRVNfZGVjcnlwdF9jb21wYWN0CisJbW92CWVzcCxEV09SRCBbMjgrZXNwXQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwltb3YJRFdPUkQgW2VzaV0sZWF4CisJbW92CURXT1JEIFs0K2VzaV0sZWJ4CisJbW92CURXT1JEIFs4K2VzaV0sZWN4CisJbW92CURXT1JEIFsxMitlc2ldLGVkeAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2dsb2JhbAlfYWVzX25vaHdfY2JjX2VuY3J5cHQKK2FsaWduCTE2CitfYWVzX25vaHdfY2JjX2VuY3J5cHQ6CitMJF9hZXNfbm9od19jYmNfZW5jcnlwdF9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllY3gsRFdPUkQgWzI4K2VzcF0KKwljbXAJZWN4LDAKKwlqZQlORUFSIEwkMDEyZHJvcF9vdXQKKwljYWxsCUwkMDEzcGljX3BvaW50CitMJDAxM3BpY19wb2ludDoKKwlwb3AJZWJwCisJbGVhCWVheCxbX09QRU5TU0xfaWEzMmNhcF9QXQorCWNtcAlEV09SRCBbNDArZXNwXSwwCisJbGVhCWVicCxbKEwkQUVTX1RlLUwkMDEzcGljX3BvaW50KStlYnBdCisJam5lCU5FQVIgTCQwMTRwaWNrZWRfdGUKKwlsZWEJZWJwLFsoTCRBRVNfVGQtTCRBRVNfVGUpK2VicF0KK0wkMDE0cGlja2VkX3RlOgorCXB1c2hmZAorCWNsZAorCWNtcAllY3gsNTEyCisJamIJTkVBUiBMJDAxNXNsb3dfd2F5CisJdGVzdAllY3gsMTUKKwlqbnoJTkVBUiBMJDAxNXNsb3dfd2F5CisJYnQJRFdPUkQgW2VheF0sMjgKKwlqYwlORUFSIEwkMDE1c2xvd193YXkKKwlsZWEJZXNpLFtlc3AtMzI0XQorCWFuZAllc2ksLTY0CisJbW92CWVheCxlYnAKKwlsZWEJZWJ4LFsyMzA0K2VicF0KKwltb3YJZWR4LGVzaQorCWFuZAllYXgsNDA5NQorCWFuZAllYngsNDA5NQorCWFuZAllZHgsNDA5NQorCWNtcAllZHgsZWJ4CisJamIJTkVBUiBMJDAxNnRibF9icmVha19vdXQKKwlzdWIJZWR4LGVieAorCXN1Ygllc2ksZWR4CisJam1wCU5FQVIgTCQwMTd0Ymxfb2sKK2FsaWduCTQKK0wkMDE2dGJsX2JyZWFrX291dDoKKwlzdWIJZWR4LGVheAorCWFuZAllZHgsNDA5NQorCWFkZAllZHgsMzg0CisJc3ViCWVzaSxlZHgKK2FsaWduCTQKK0wkMDE3dGJsX29rOgorCWxlYQllZHgsWzI0K2VzcF0KKwl4Y2hnCWVzcCxlc2kKKwlhZGQJZXNwLDQKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWJwCisJbW92CURXT1JEIFsyOCtlc3BdLGVzaQorCW1vdgllYXgsRFdPUkQgW2VkeF0KKwltb3YJZWJ4LERXT1JEIFs0K2VkeF0KKwltb3YJZWRpLERXT1JEIFsxMitlZHhdCisJbW92CWVzaSxEV09SRCBbMTYrZWR4XQorCW1vdgllZHgsRFdPUkQgWzIwK2VkeF0KKwltb3YJRFdPUkQgWzMyK2VzcF0sZWF4CisJbW92CURXT1JEIFszNitlc3BdLGVieAorCW1vdglEV09SRCBbNDArZXNwXSxlY3gKKwltb3YJRFdPUkQgWzQ0K2VzcF0sZWRpCisJbW92CURXT1JEIFs0OCtlc3BdLGVzaQorCW1vdglEV09SRCBbMzE2K2VzcF0sMAorCW1vdgllYngsZWRpCisJbW92CWVjeCw2MQorCXN1YgllYngsZWJwCisJbW92CWVzaSxlZGkKKwlhbmQJZWJ4LDQwOTUKKwlsZWEJZWRpLFs3Nitlc3BdCisJY21wCWVieCwyMzA0CisJamIJTkVBUiBMJDAxOGRvX2NvcHkKKwljbXAJZWJ4LDM4NTIKKwlqYglORUFSIEwkMDE5c2tpcF9jb3B5CithbGlnbgk0CitMJDAxOGRvX2NvcHk6CisJbW92CURXT1JEIFs0NCtlc3BdLGVkaQorZGQJMjc4NDIyOTAwMQorTCQwMTlza2lwX2NvcHk6CisJbW92CWVkaSwxNgorYWxpZ24JNAorTCQwMjBwcmVmZXRjaF90Ymw6CisJbW92CWVheCxEV09SRCBbZWJwXQorCW1vdgllYngsRFdPUkQgWzMyK2VicF0KKwltb3YJZWN4LERXT1JEIFs2NCtlYnBdCisJbW92CWVzaSxEV09SRCBbOTYrZWJwXQorCWxlYQllYnAsWzEyOCtlYnBdCisJc3ViCWVkaSwxCisJam56CU5FQVIgTCQwMjBwcmVmZXRjaF90YmwKKwlzdWIJZWJwLDIwNDgKKwltb3YJZXNpLERXT1JEIFszMitlc3BdCisJbW92CWVkaSxEV09SRCBbNDgrZXNwXQorCWNtcAllZHgsMAorCWplCU5FQVIgTCQwMjFmYXN0X2RlY3J5cHQKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVieCxEV09SRCBbNCtlZGldCithbGlnbgkxNgorTCQwMjJmYXN0X2VuY19sb29wOgorCW1vdgllY3gsRFdPUkQgWzgrZWRpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwl4b3IJZWF4LERXT1JEIFtlc2ldCisJeG9yCWVieCxEV09SRCBbNCtlc2ldCisJeG9yCWVjeCxEV09SRCBbOCtlc2ldCisJeG9yCWVkeCxEV09SRCBbMTIrZXNpXQorCW1vdgllZGksRFdPUkQgWzQ0K2VzcF0KKwljYWxsCV9feDg2X0FFU19lbmNyeXB0CisJbW92CWVzaSxEV09SRCBbMzIrZXNwXQorCW1vdgllZGksRFdPUkQgWzM2K2VzcF0KKwltb3YJRFdPUkQgW2VkaV0sZWF4CisJbW92CURXT1JEIFs0K2VkaV0sZWJ4CisJbW92CURXT1JEIFs4K2VkaV0sZWN4CisJbW92CURXT1JEIFsxMitlZGldLGVkeAorCWxlYQllc2ksWzE2K2VzaV0KKwltb3YJZWN4LERXT1JEIFs0MCtlc3BdCisJbW92CURXT1JEIFszMitlc3BdLGVzaQorCWxlYQllZHgsWzE2K2VkaV0KKwltb3YJRFdPUkQgWzM2K2VzcF0sZWR4CisJc3ViCWVjeCwxNgorCW1vdglEV09SRCBbNDArZXNwXSxlY3gKKwlqbnoJTkVBUiBMJDAyMmZhc3RfZW5jX2xvb3AKKwltb3YJZXNpLERXT1JEIFs0OCtlc3BdCisJbW92CWVjeCxEV09SRCBbOCtlZGldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCW1vdglEV09SRCBbZXNpXSxlYXgKKwltb3YJRFdPUkQgWzQrZXNpXSxlYngKKwltb3YJRFdPUkQgWzgrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWR4CisJY21wCURXT1JEIFszMTYrZXNwXSwwCisJbW92CWVkaSxEV09SRCBbNDQrZXNwXQorCWplCU5FQVIgTCQwMjNza2lwX2V6ZXJvCisJbW92CWVjeCw2MAorCXhvcgllYXgsZWF4CithbGlnbgk0CitkZAkyODg0ODkyMjk3CitMJDAyM3NraXBfZXplcm86CisJbW92CWVzcCxEV09SRCBbMjgrZXNwXQorCXBvcGZkCitMJDAxMmRyb3Bfb3V0OgorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKKwlwdXNoZmQKK2FsaWduCTE2CitMJDAyMWZhc3RfZGVjcnlwdDoKKwljbXAJZXNpLERXT1JEIFszNitlc3BdCisJamUJTkVBUiBMJDAyNGZhc3RfZGVjX2luX3BsYWNlCisJbW92CURXT1JEIFs1Mitlc3BdLGVkaQorYWxpZ24JNAorYWxpZ24JMTYKK0wkMDI1ZmFzdF9kZWNfbG9vcDoKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbW92CWVieCxEV09SRCBbNCtlc2ldCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVkeCxEV09SRCBbMTIrZXNpXQorCW1vdgllZGksRFdPUkQgWzQ0K2VzcF0KKwljYWxsCV9feDg2X0FFU19kZWNyeXB0CisJbW92CWVkaSxEV09SRCBbNTIrZXNwXQorCW1vdgllc2ksRFdPUkQgWzQwK2VzcF0KKwl4b3IJZWF4LERXT1JEIFtlZGldCisJeG9yCWVieCxEV09SRCBbNCtlZGldCisJeG9yCWVjeCxEV09SRCBbOCtlZGldCisJeG9yCWVkeCxEV09SRCBbMTIrZWRpXQorCW1vdgllZGksRFdPUkQgWzM2K2VzcF0KKwltb3YJZXNpLERXT1JEIFszMitlc3BdCisJbW92CURXT1JEIFtlZGldLGVheAorCW1vdglEV09SRCBbNCtlZGldLGVieAorCW1vdglEV09SRCBbOCtlZGldLGVjeAorCW1vdglEV09SRCBbMTIrZWRpXSxlZHgKKwltb3YJZWN4LERXT1JEIFs0MCtlc3BdCisJbW92CURXT1JEIFs1Mitlc3BdLGVzaQorCWxlYQllc2ksWzE2K2VzaV0KKwltb3YJRFdPUkQgWzMyK2VzcF0sZXNpCisJbGVhCWVkaSxbMTYrZWRpXQorCW1vdglEV09SRCBbMzYrZXNwXSxlZGkKKwlzdWIJZWN4LDE2CisJbW92CURXT1JEIFs0MCtlc3BdLGVjeAorCWpueglORUFSIEwkMDI1ZmFzdF9kZWNfbG9vcAorCW1vdgllZGksRFdPUkQgWzUyK2VzcF0KKwltb3YJZXNpLERXT1JEIFs0OCtlc3BdCisJbW92CWVheCxEV09SRCBbZWRpXQorCW1vdgllYngsRFdPUkQgWzQrZWRpXQorCW1vdgllY3gsRFdPUkQgWzgrZWRpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwltb3YJRFdPUkQgW2VzaV0sZWF4CisJbW92CURXT1JEIFs0K2VzaV0sZWJ4CisJbW92CURXT1JEIFs4K2VzaV0sZWN4CisJbW92CURXT1JEIFsxMitlc2ldLGVkeAorCWptcAlORUFSIEwkMDI2ZmFzdF9kZWNfb3V0CithbGlnbgkxNgorTCQwMjRmYXN0X2RlY19pbl9wbGFjZToKK0wkMDI3ZmFzdF9kZWNfaW5fcGxhY2VfbG9vcDoKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbW92CWVieCxEV09SRCBbNCtlc2ldCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVkeCxEV09SRCBbMTIrZXNpXQorCWxlYQllZGksWzYwK2VzcF0KKwltb3YJRFdPUkQgW2VkaV0sZWF4CisJbW92CURXT1JEIFs0K2VkaV0sZWJ4CisJbW92CURXT1JEIFs4K2VkaV0sZWN4CisJbW92CURXT1JEIFsxMitlZGldLGVkeAorCW1vdgllZGksRFdPUkQgWzQ0K2VzcF0KKwljYWxsCV9feDg2X0FFU19kZWNyeXB0CisJbW92CWVkaSxEV09SRCBbNDgrZXNwXQorCW1vdgllc2ksRFdPUkQgWzM2K2VzcF0KKwl4b3IJZWF4LERXT1JEIFtlZGldCisJeG9yCWVieCxEV09SRCBbNCtlZGldCisJeG9yCWVjeCxEV09SRCBbOCtlZGldCisJeG9yCWVkeCxEV09SRCBbMTIrZWRpXQorCW1vdglEV09SRCBbZXNpXSxlYXgKKwltb3YJRFdPUkQgWzQrZXNpXSxlYngKKwltb3YJRFdPUkQgWzgrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWR4CisJbGVhCWVzaSxbMTYrZXNpXQorCW1vdglEV09SRCBbMzYrZXNwXSxlc2kKKwlsZWEJZXNpLFs2MCtlc3BdCisJbW92CWVheCxEV09SRCBbZXNpXQorCW1vdgllYngsRFdPUkQgWzQrZXNpXQorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VzaV0KKwltb3YJRFdPUkQgW2VkaV0sZWF4CisJbW92CURXT1JEIFs0K2VkaV0sZWJ4CisJbW92CURXT1JEIFs4K2VkaV0sZWN4CisJbW92CURXT1JEIFsxMitlZGldLGVkeAorCW1vdgllc2ksRFdPUkQgWzMyK2VzcF0KKwltb3YJZWN4LERXT1JEIFs0MCtlc3BdCisJbGVhCWVzaSxbMTYrZXNpXQorCW1vdglEV09SRCBbMzIrZXNwXSxlc2kKKwlzdWIJZWN4LDE2CisJbW92CURXT1JEIFs0MCtlc3BdLGVjeAorCWpueglORUFSIEwkMDI3ZmFzdF9kZWNfaW5fcGxhY2VfbG9vcAorYWxpZ24JNAorTCQwMjZmYXN0X2RlY19vdXQ6CisJY21wCURXT1JEIFszMTYrZXNwXSwwCisJbW92CWVkaSxEV09SRCBbNDQrZXNwXQorCWplCU5FQVIgTCQwMjhza2lwX2R6ZXJvCisJbW92CWVjeCw2MAorCXhvcgllYXgsZWF4CithbGlnbgk0CitkZAkyODg0ODkyMjk3CitMJDAyOHNraXBfZHplcm86CisJbW92CWVzcCxEV09SRCBbMjgrZXNwXQorCXBvcGZkCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorCXB1c2hmZAorYWxpZ24JMTYKK0wkMDE1c2xvd193YXk6CisJbW92CWVheCxEV09SRCBbZWF4XQorCW1vdgllZGksRFdPUkQgWzM2K2VzcF0KKwlsZWEJZXNpLFtlc3AtODBdCisJYW5kCWVzaSwtNjQKKwlsZWEJZWJ4LFtlZGktMTQzXQorCXN1YgllYngsZXNpCisJbmVnCWVieAorCWFuZAllYngsOTYwCisJc3ViCWVzaSxlYngKKwlsZWEJZWJ4LFs3NjgrZXNpXQorCXN1YgllYngsZWJwCisJYW5kCWVieCw3NjgKKwlsZWEJZWJwLFsyMTc2K2VieCoxK2VicF0KKwlsZWEJZWR4LFsyNCtlc3BdCisJeGNoZwllc3AsZXNpCisJYWRkCWVzcCw0CisJbW92CURXT1JEIFsyNCtlc3BdLGVicAorCW1vdglEV09SRCBbMjgrZXNwXSxlc2kKKwltb3YJRFdPUkQgWzUyK2VzcF0sZWF4CisJbW92CWVheCxEV09SRCBbZWR4XQorCW1vdgllYngsRFdPUkQgWzQrZWR4XQorCW1vdgllc2ksRFdPUkQgWzE2K2VkeF0KKwltb3YJZWR4LERXT1JEIFsyMCtlZHhdCisJbW92CURXT1JEIFszMitlc3BdLGVheAorCW1vdglEV09SRCBbMzYrZXNwXSxlYngKKwltb3YJRFdPUkQgWzQwK2VzcF0sZWN4CisJbW92CURXT1JEIFs0NCtlc3BdLGVkaQorCW1vdglEV09SRCBbNDgrZXNwXSxlc2kKKwltb3YJZWRpLGVzaQorCW1vdgllc2ksZWF4CisJY21wCWVkeCwwCisJamUJTkVBUiBMJDAyOXNsb3dfZGVjcnlwdAorCWNtcAllY3gsMTYKKwltb3YJZWR4LGVieAorCWpiCU5FQVIgTCQwMzBzbG93X2VuY190YWlsCisJYnQJRFdPUkQgWzUyK2VzcF0sMjUKKwlqbmMJTkVBUiBMJDAzMXNsb3dfZW5jX3g4NgorCW1vdnEJbW0wLFtlZGldCisJbW92cQltbTQsWzgrZWRpXQorYWxpZ24JMTYKK0wkMDMyc2xvd19lbmNfbG9vcF9zc2U6CisJcHhvcgltbTAsW2VzaV0KKwlweG9yCW1tNCxbOCtlc2ldCisJbW92CWVkaSxEV09SRCBbNDQrZXNwXQorCWNhbGwJX19zc2VfQUVTX2VuY3J5cHRfY29tcGFjdAorCW1vdgllc2ksRFdPUkQgWzMyK2VzcF0KKwltb3YJZWRpLERXT1JEIFszNitlc3BdCisJbW92CWVjeCxEV09SRCBbNDArZXNwXQorCW1vdnEJW2VkaV0sbW0wCisJbW92cQlbOCtlZGldLG1tNAorCWxlYQllc2ksWzE2K2VzaV0KKwltb3YJRFdPUkQgWzMyK2VzcF0sZXNpCisJbGVhCWVkeCxbMTYrZWRpXQorCW1vdglEV09SRCBbMzYrZXNwXSxlZHgKKwlzdWIJZWN4LDE2CisJY21wCWVjeCwxNgorCW1vdglEV09SRCBbNDArZXNwXSxlY3gKKwlqYWUJTkVBUiBMJDAzMnNsb3dfZW5jX2xvb3Bfc3NlCisJdGVzdAllY3gsMTUKKwlqbnoJTkVBUiBMJDAzMHNsb3dfZW5jX3RhaWwKKwltb3YJZXNpLERXT1JEIFs0OCtlc3BdCisJbW92cQlbZXNpXSxtbTAKKwltb3ZxCVs4K2VzaV0sbW00CisJZW1tcworCW1vdgllc3AsRFdPUkQgWzI4K2VzcF0KKwlwb3BmZAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKKwlwdXNoZmQKK2FsaWduCTE2CitMJDAzMXNsb3dfZW5jX3g4NjoKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVieCxEV09SRCBbNCtlZGldCithbGlnbgk0CitMJDAzM3Nsb3dfZW5jX2xvb3BfeDg2OgorCW1vdgllY3gsRFdPUkQgWzgrZWRpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwl4b3IJZWF4LERXT1JEIFtlc2ldCisJeG9yCWVieCxEV09SRCBbNCtlc2ldCisJeG9yCWVjeCxEV09SRCBbOCtlc2ldCisJeG9yCWVkeCxEV09SRCBbMTIrZXNpXQorCW1vdgllZGksRFdPUkQgWzQ0K2VzcF0KKwljYWxsCV9feDg2X0FFU19lbmNyeXB0X2NvbXBhY3QKKwltb3YJZXNpLERXT1JEIFszMitlc3BdCisJbW92CWVkaSxEV09SRCBbMzYrZXNwXQorCW1vdglEV09SRCBbZWRpXSxlYXgKKwltb3YJRFdPUkQgWzQrZWRpXSxlYngKKwltb3YJRFdPUkQgWzgrZWRpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VkaV0sZWR4CisJbW92CWVjeCxEV09SRCBbNDArZXNwXQorCWxlYQllc2ksWzE2K2VzaV0KKwltb3YJRFdPUkQgWzMyK2VzcF0sZXNpCisJbGVhCWVkeCxbMTYrZWRpXQorCW1vdglEV09SRCBbMzYrZXNwXSxlZHgKKwlzdWIJZWN4LDE2CisJY21wCWVjeCwxNgorCW1vdglEV09SRCBbNDArZXNwXSxlY3gKKwlqYWUJTkVBUiBMJDAzM3Nsb3dfZW5jX2xvb3BfeDg2CisJdGVzdAllY3gsMTUKKwlqbnoJTkVBUiBMJDAzMHNsb3dfZW5jX3RhaWwKKwltb3YJZXNpLERXT1JEIFs0OCtlc3BdCisJbW92CWVjeCxEV09SRCBbOCtlZGldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCW1vdglEV09SRCBbZXNpXSxlYXgKKwltb3YJRFdPUkQgWzQrZXNpXSxlYngKKwltb3YJRFdPUkQgWzgrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWR4CisJbW92CWVzcCxEV09SRCBbMjgrZXNwXQorCXBvcGZkCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorCXB1c2hmZAorYWxpZ24JMTYKK0wkMDMwc2xvd19lbmNfdGFpbDoKKwllbW1zCisJbW92CWVkaSxlZHgKKwltb3YJZWJ4LDE2CisJc3ViCWVieCxlY3gKKwljbXAJZWRpLGVzaQorCWplCU5FQVIgTCQwMzRlbmNfaW5fcGxhY2UKK2FsaWduCTQKK2RkCTI3Njc0NTE3ODUKKwlqbXAJTkVBUiBMJDAzNWVuY19za2lwX2luX3BsYWNlCitMJDAzNGVuY19pbl9wbGFjZToKKwlsZWEJZWRpLFtlY3gqMStlZGldCitMJDAzNWVuY19za2lwX2luX3BsYWNlOgorCW1vdgllY3gsZWJ4CisJeG9yCWVheCxlYXgKK2FsaWduCTQKK2RkCTI4NjgxMTUwODEKKwltb3YJZWRpLERXT1JEIFs0OCtlc3BdCisJbW92CWVzaSxlZHgKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVieCxEV09SRCBbNCtlZGldCisJbW92CURXT1JEIFs0MCtlc3BdLDE2CisJam1wCU5FQVIgTCQwMzNzbG93X2VuY19sb29wX3g4NgorYWxpZ24JMTYKK0wkMDI5c2xvd19kZWNyeXB0OgorCWJ0CURXT1JEIFs1Mitlc3BdLDI1CisJam5jCU5FQVIgTCQwMzZzbG93X2RlY19sb29wX3g4NgorYWxpZ24JNAorTCQwMzdzbG93X2RlY19sb29wX3NzZToKKwltb3ZxCW1tMCxbZXNpXQorCW1vdnEJbW00LFs4K2VzaV0KKwltb3YJZWRpLERXT1JEIFs0NCtlc3BdCisJY2FsbAlfX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0CisJbW92CWVzaSxEV09SRCBbMzIrZXNwXQorCWxlYQllYXgsWzYwK2VzcF0KKwltb3YJZWJ4LERXT1JEIFszNitlc3BdCisJbW92CWVjeCxEV09SRCBbNDArZXNwXQorCW1vdgllZGksRFdPUkQgWzQ4K2VzcF0KKwltb3ZxCW1tMSxbZXNpXQorCW1vdnEJbW01LFs4K2VzaV0KKwlweG9yCW1tMCxbZWRpXQorCXB4b3IJbW00LFs4K2VkaV0KKwltb3ZxCVtlZGldLG1tMQorCW1vdnEJWzgrZWRpXSxtbTUKKwlzdWIJZWN4LDE2CisJamMJTkVBUiBMJDAzOHNsb3dfZGVjX3BhcnRpYWxfc3NlCisJbW92cQlbZWJ4XSxtbTAKKwltb3ZxCVs4K2VieF0sbW00CisJbGVhCWVieCxbMTYrZWJ4XQorCW1vdglEV09SRCBbMzYrZXNwXSxlYngKKwlsZWEJZXNpLFsxNitlc2ldCisJbW92CURXT1JEIFszMitlc3BdLGVzaQorCW1vdglEV09SRCBbNDArZXNwXSxlY3gKKwlqbnoJTkVBUiBMJDAzN3Nsb3dfZGVjX2xvb3Bfc3NlCisJZW1tcworCW1vdgllc3AsRFdPUkQgWzI4K2VzcF0KKwlwb3BmZAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKKwlwdXNoZmQKK2FsaWduCTE2CitMJDAzOHNsb3dfZGVjX3BhcnRpYWxfc3NlOgorCW1vdnEJW2VheF0sbW0wCisJbW92cQlbOCtlYXhdLG1tNAorCWVtbXMKKwlhZGQJZWN4LDE2CisJbW92CWVkaSxlYngKKwltb3YJZXNpLGVheAorYWxpZ24JNAorZGQJMjc2NzQ1MTc4NQorCW1vdgllc3AsRFdPUkQgWzI4K2VzcF0KKwlwb3BmZAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKKwlwdXNoZmQKK2FsaWduCTE2CitMJDAzNnNsb3dfZGVjX2xvb3BfeDg2OgorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlc2ldCisJbGVhCWVkaSxbNjArZXNwXQorCW1vdglEV09SRCBbZWRpXSxlYXgKKwltb3YJRFdPUkQgWzQrZWRpXSxlYngKKwltb3YJRFdPUkQgWzgrZWRpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VkaV0sZWR4CisJbW92CWVkaSxEV09SRCBbNDQrZXNwXQorCWNhbGwJX194ODZfQUVTX2RlY3J5cHRfY29tcGFjdAorCW1vdgllZGksRFdPUkQgWzQ4K2VzcF0KKwltb3YJZXNpLERXT1JEIFs0MCtlc3BdCisJeG9yCWVheCxEV09SRCBbZWRpXQorCXhvcgllYngsRFdPUkQgWzQrZWRpXQorCXhvcgllY3gsRFdPUkQgWzgrZWRpXQorCXhvcgllZHgsRFdPUkQgWzEyK2VkaV0KKwlzdWIJZXNpLDE2CisJamMJTkVBUiBMJDAzOXNsb3dfZGVjX3BhcnRpYWxfeDg2CisJbW92CURXT1JEIFs0MCtlc3BdLGVzaQorCW1vdgllc2ksRFdPUkQgWzM2K2VzcF0KKwltb3YJRFdPUkQgW2VzaV0sZWF4CisJbW92CURXT1JEIFs0K2VzaV0sZWJ4CisJbW92CURXT1JEIFs4K2VzaV0sZWN4CisJbW92CURXT1JEIFsxMitlc2ldLGVkeAorCWxlYQllc2ksWzE2K2VzaV0KKwltb3YJRFdPUkQgWzM2K2VzcF0sZXNpCisJbGVhCWVzaSxbNjArZXNwXQorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlc2ldCisJbW92CURXT1JEIFtlZGldLGVheAorCW1vdglEV09SRCBbNCtlZGldLGVieAorCW1vdglEV09SRCBbOCtlZGldLGVjeAorCW1vdglEV09SRCBbMTIrZWRpXSxlZHgKKwltb3YJZXNpLERXT1JEIFszMitlc3BdCisJbGVhCWVzaSxbMTYrZXNpXQorCW1vdglEV09SRCBbMzIrZXNwXSxlc2kKKwlqbnoJTkVBUiBMJDAzNnNsb3dfZGVjX2xvb3BfeDg2CisJbW92CWVzcCxEV09SRCBbMjgrZXNwXQorCXBvcGZkCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorCXB1c2hmZAorYWxpZ24JMTYKK0wkMDM5c2xvd19kZWNfcGFydGlhbF94ODY6CisJbGVhCWVzaSxbNjArZXNwXQorCW1vdglEV09SRCBbZXNpXSxlYXgKKwltb3YJRFdPUkQgWzQrZXNpXSxlYngKKwltb3YJRFdPUkQgWzgrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWR4CisJbW92CWVzaSxEV09SRCBbMzIrZXNwXQorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlc2ldCisJbW92CURXT1JEIFtlZGldLGVheAorCW1vdglEV09SRCBbNCtlZGldLGVieAorCW1vdglEV09SRCBbOCtlZGldLGVjeAorCW1vdglEV09SRCBbMTIrZWRpXSxlZHgKKwltb3YJZWN4LERXT1JEIFs0MCtlc3BdCisJbW92CWVkaSxEV09SRCBbMzYrZXNwXQorCWxlYQllc2ksWzYwK2VzcF0KK2FsaWduCTQKK2RkCTI3Njc0NTE3ODUKKwltb3YJZXNwLERXT1JEIFsyOCtlc3BdCisJcG9wZmQKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CithbGlnbgkxNgorX194ODZfQUVTX3NldF9lbmNyeXB0X2tleToKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwltb3YJZWRpLERXT1JEIFszMitlc3BdCisJdGVzdAllc2ksLTEKKwlqeglORUFSIEwkMDQwYmFkcG9pbnRlcgorCXRlc3QJZWRpLC0xCisJanoJTkVBUiBMJDA0MGJhZHBvaW50ZXIKKwljYWxsCUwkMDQxcGljX3BvaW50CitMJDA0MXBpY19wb2ludDoKKwlwb3AJZWJwCisJbGVhCWVicCxbKEwkQUVTX1RlLUwkMDQxcGljX3BvaW50KStlYnBdCisJbGVhCWVicCxbMjE3NitlYnBdCisJbW92CWVheCxEV09SRCBbZWJwLTEyOF0KKwltb3YJZWJ4LERXT1JEIFtlYnAtOTZdCisJbW92CWVjeCxEV09SRCBbZWJwLTY0XQorCW1vdgllZHgsRFdPUkQgW2VicC0zMl0KKwltb3YJZWF4LERXT1JEIFtlYnBdCisJbW92CWVieCxEV09SRCBbMzIrZWJwXQorCW1vdgllY3gsRFdPUkQgWzY0K2VicF0KKwltb3YJZWR4LERXT1JEIFs5NitlYnBdCisJbW92CWVjeCxEV09SRCBbMjgrZXNwXQorCWNtcAllY3gsMTI4CisJamUJTkVBUiBMJDA0MjEwcm91bmRzCisJY21wCWVjeCwxOTIKKwlqZQlORUFSIEwkMDQzMTJyb3VuZHMKKwljbXAJZWN4LDI1NgorCWplCU5FQVIgTCQwNDQxNHJvdW5kcworCW1vdgllYXgsLTIKKwlqbXAJTkVBUiBMJDA0NWV4aXQKK0wkMDQyMTByb3VuZHM6CisJbW92CWVheCxEV09SRCBbZXNpXQorCW1vdgllYngsRFdPUkQgWzQrZXNpXQorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VzaV0KKwltb3YJRFdPUkQgW2VkaV0sZWF4CisJbW92CURXT1JEIFs0K2VkaV0sZWJ4CisJbW92CURXT1JEIFs4K2VkaV0sZWN4CisJbW92CURXT1JEIFsxMitlZGldLGVkeAorCXhvcgllY3gsZWN4CisJam1wCU5FQVIgTCQwNDYxMHNob3J0Y3V0CithbGlnbgk0CitMJDA0NzEwbG9vcDoKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorTCQwNDYxMHNob3J0Y3V0OgorCW1vdnp4CWVzaSxkbAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVzaSxkaAorCXNobAllYngsMjQKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCXNocgllZHgsMTYKKwltb3Z6eAllc2ksZGwKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVzaSxkaAorCXNobAllYngsOAorCXhvcgllYXgsZWJ4CisJbW92engJZWJ4LEJZVEUgW2VzaSoxK2VicC0xMjhdCisJc2hsCWVieCwxNgorCXhvcgllYXgsZWJ4CisJeG9yCWVheCxEV09SRCBbODk2K2VjeCo0K2VicF0KKwltb3YJRFdPUkQgWzE2K2VkaV0sZWF4CisJeG9yCWVheCxEV09SRCBbNCtlZGldCisJbW92CURXT1JEIFsyMCtlZGldLGVheAorCXhvcgllYXgsRFdPUkQgWzgrZWRpXQorCW1vdglEV09SRCBbMjQrZWRpXSxlYXgKKwl4b3IJZWF4LERXT1JEIFsxMitlZGldCisJbW92CURXT1JEIFsyOCtlZGldLGVheAorCWluYwllY3gKKwlhZGQJZWRpLDE2CisJY21wCWVjeCwxMAorCWpsCU5FQVIgTCQwNDcxMGxvb3AKKwltb3YJRFdPUkQgWzgwK2VkaV0sMTAKKwl4b3IJZWF4LGVheAorCWptcAlORUFSIEwkMDQ1ZXhpdAorTCQwNDMxMnJvdW5kczoKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbW92CWVieCxEV09SRCBbNCtlc2ldCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVkeCxEV09SRCBbMTIrZXNpXQorCW1vdglEV09SRCBbZWRpXSxlYXgKKwltb3YJRFdPUkQgWzQrZWRpXSxlYngKKwltb3YJRFdPUkQgWzgrZWRpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VkaV0sZWR4CisJbW92CWVjeCxEV09SRCBbMTYrZXNpXQorCW1vdgllZHgsRFdPUkQgWzIwK2VzaV0KKwltb3YJRFdPUkQgWzE2K2VkaV0sZWN4CisJbW92CURXT1JEIFsyMCtlZGldLGVkeAorCXhvcgllY3gsZWN4CisJam1wCU5FQVIgTCQwNDgxMnNob3J0Y3V0CithbGlnbgk0CitMJDA0OTEybG9vcDoKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVkeCxEV09SRCBbMjArZWRpXQorTCQwNDgxMnNob3J0Y3V0OgorCW1vdnp4CWVzaSxkbAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVzaSxkaAorCXNobAllYngsMjQKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCXNocgllZHgsMTYKKwltb3Z6eAllc2ksZGwKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVzaSxkaAorCXNobAllYngsOAorCXhvcgllYXgsZWJ4CisJbW92engJZWJ4LEJZVEUgW2VzaSoxK2VicC0xMjhdCisJc2hsCWVieCwxNgorCXhvcgllYXgsZWJ4CisJeG9yCWVheCxEV09SRCBbODk2K2VjeCo0K2VicF0KKwltb3YJRFdPUkQgWzI0K2VkaV0sZWF4CisJeG9yCWVheCxEV09SRCBbNCtlZGldCisJbW92CURXT1JEIFsyOCtlZGldLGVheAorCXhvcgllYXgsRFdPUkQgWzgrZWRpXQorCW1vdglEV09SRCBbMzIrZWRpXSxlYXgKKwl4b3IJZWF4LERXT1JEIFsxMitlZGldCisJbW92CURXT1JEIFszNitlZGldLGVheAorCWNtcAllY3gsNworCWplCU5FQVIgTCQwNTAxMmJyZWFrCisJaW5jCWVjeAorCXhvcgllYXgsRFdPUkQgWzE2K2VkaV0KKwltb3YJRFdPUkQgWzQwK2VkaV0sZWF4CisJeG9yCWVheCxEV09SRCBbMjArZWRpXQorCW1vdglEV09SRCBbNDQrZWRpXSxlYXgKKwlhZGQJZWRpLDI0CisJam1wCU5FQVIgTCQwNDkxMmxvb3AKK0wkMDUwMTJicmVhazoKKwltb3YJRFdPUkQgWzcyK2VkaV0sMTIKKwl4b3IJZWF4LGVheAorCWptcAlORUFSIEwkMDQ1ZXhpdAorTCQwNDQxNHJvdW5kczoKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbW92CWVieCxEV09SRCBbNCtlc2ldCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVkeCxEV09SRCBbMTIrZXNpXQorCW1vdglEV09SRCBbZWRpXSxlYXgKKwltb3YJRFdPUkQgWzQrZWRpXSxlYngKKwltb3YJRFdPUkQgWzgrZWRpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VkaV0sZWR4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCW1vdgllYngsRFdPUkQgWzIwK2VzaV0KKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CWVkeCxEV09SRCBbMjgrZXNpXQorCW1vdglEV09SRCBbMTYrZWRpXSxlYXgKKwltb3YJRFdPUkQgWzIwK2VkaV0sZWJ4CisJbW92CURXT1JEIFsyNCtlZGldLGVjeAorCW1vdglEV09SRCBbMjgrZWRpXSxlZHgKKwl4b3IJZWN4LGVjeAorCWptcAlORUFSIEwkMDUxMTRzaG9ydGN1dAorYWxpZ24JNAorTCQwNTIxNGxvb3A6CisJbW92CWVkeCxEV09SRCBbMjgrZWRpXQorTCQwNTExNHNob3J0Y3V0OgorCW1vdgllYXgsRFdPUkQgW2VkaV0KKwltb3Z6eAllc2ksZGwKKwltb3Z6eAllYngsQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllc2ksZGgKKwlzaGwJZWJ4LDI0CisJeG9yCWVheCxlYngKKwltb3Z6eAllYngsQllURSBbZXNpKjErZWJwLTEyOF0KKwlzaHIJZWR4LDE2CisJbW92engJZXNpLGRsCisJeG9yCWVheCxlYngKKwltb3Z6eAllYngsQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllc2ksZGgKKwlzaGwJZWJ4LDgKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCXNobAllYngsMTYKKwl4b3IJZWF4LGVieAorCXhvcgllYXgsRFdPUkQgWzg5NitlY3gqNCtlYnBdCisJbW92CURXT1JEIFszMitlZGldLGVheAorCXhvcgllYXgsRFdPUkQgWzQrZWRpXQorCW1vdglEV09SRCBbMzYrZWRpXSxlYXgKKwl4b3IJZWF4LERXT1JEIFs4K2VkaV0KKwltb3YJRFdPUkQgWzQwK2VkaV0sZWF4CisJeG9yCWVheCxEV09SRCBbMTIrZWRpXQorCW1vdglEV09SRCBbNDQrZWRpXSxlYXgKKwljbXAJZWN4LDYKKwlqZQlORUFSIEwkMDUzMTRicmVhaworCWluYwllY3gKKwltb3YJZWR4LGVheAorCW1vdgllYXgsRFdPUkQgWzE2K2VkaV0KKwltb3Z6eAllc2ksZGwKKwltb3Z6eAllYngsQllURSBbZXNpKjErZWJwLTEyOF0KKwltb3Z6eAllc2ksZGgKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCXNocgllZHgsMTYKKwlzaGwJZWJ4LDgKKwltb3Z6eAllc2ksZGwKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCW1vdnp4CWVzaSxkaAorCXNobAllYngsMTYKKwl4b3IJZWF4LGVieAorCW1vdnp4CWVieCxCWVRFIFtlc2kqMStlYnAtMTI4XQorCXNobAllYngsMjQKKwl4b3IJZWF4LGVieAorCW1vdglEV09SRCBbNDgrZWRpXSxlYXgKKwl4b3IJZWF4LERXT1JEIFsyMCtlZGldCisJbW92CURXT1JEIFs1MitlZGldLGVheAorCXhvcgllYXgsRFdPUkQgWzI0K2VkaV0KKwltb3YJRFdPUkQgWzU2K2VkaV0sZWF4CisJeG9yCWVheCxEV09SRCBbMjgrZWRpXQorCW1vdglEV09SRCBbNjArZWRpXSxlYXgKKwlhZGQJZWRpLDMyCisJam1wCU5FQVIgTCQwNTIxNGxvb3AKK0wkMDUzMTRicmVhazoKKwltb3YJRFdPUkQgWzQ4K2VkaV0sMTQKKwl4b3IJZWF4LGVheAorCWptcAlORUFSIEwkMDQ1ZXhpdAorTCQwNDBiYWRwb2ludGVyOgorCW1vdgllYXgsLTEKK0wkMDQ1ZXhpdDoKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CitnbG9iYWwJX2Flc19ub2h3X3NldF9lbmNyeXB0X2tleQorYWxpZ24JMTYKK19hZXNfbm9od19zZXRfZW5jcnlwdF9rZXk6CitMJF9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXlfYmVnaW46CisJY2FsbAlfX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5CisJcmV0CitnbG9iYWwJX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleQorYWxpZ24JMTYKK19hZXNfbm9od19zZXRfZGVjcnlwdF9rZXk6CitMJF9hZXNfbm9od19zZXRfZGVjcnlwdF9rZXlfYmVnaW46CisJY2FsbAlfX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5CisJY21wCWVheCwwCisJamUJTkVBUiBMJDA1NHByb2NlZWQKKwlyZXQKK0wkMDU0cHJvY2VlZDoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllc2ksRFdPUkQgWzI4K2VzcF0KKwltb3YJZWN4LERXT1JEIFsyNDArZXNpXQorCWxlYQllY3gsW2VjeCo0XQorCWxlYQllZGksW2VjeCo0K2VzaV0KK2FsaWduCTQKK0wkMDU1aW52ZXJ0OgorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFtlZGldCisJbW92CWVkeCxEV09SRCBbNCtlZGldCisJbW92CURXT1JEIFtlZGldLGVheAorCW1vdglEV09SRCBbNCtlZGldLGVieAorCW1vdglEV09SRCBbZXNpXSxlY3gKKwltb3YJRFdPUkQgWzQrZXNpXSxlZHgKKwltb3YJZWF4LERXT1JEIFs4K2VzaV0KKwltb3YJZWJ4LERXT1JEIFsxMitlc2ldCisJbW92CWVjeCxEV09SRCBbOCtlZGldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCW1vdglEV09SRCBbOCtlZGldLGVheAorCW1vdglEV09SRCBbMTIrZWRpXSxlYngKKwltb3YJRFdPUkQgWzgrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWR4CisJYWRkCWVzaSwxNgorCXN1YgllZGksMTYKKwljbXAJZXNpLGVkaQorCWpuZQlORUFSIEwkMDU1aW52ZXJ0CisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCW1vdgllc2ksRFdPUkQgWzI0MCtlZGldCisJbGVhCWVzaSxbZXNpKjErZXNpLTJdCisJbGVhCWVzaSxbZXNpKjgrZWRpXQorCW1vdglEV09SRCBbMjgrZXNwXSxlc2kKKwltb3YJZWF4LERXT1JEIFsxNitlZGldCithbGlnbgk0CitMJDA1NnBlcm11dGU6CisJYWRkCWVkaSwxNgorCW1vdgllYnAsMjE1NTkwNTE1MgorCWFuZAllYnAsZWF4CisJbGVhCWVieCxbZWF4KjErZWF4XQorCW1vdgllc2ksZWJwCisJc2hyCWVicCw3CisJc3ViCWVzaSxlYnAKKwlhbmQJZWJ4LDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXhvcgllYngsZXNpCisJbW92CWVicCwyMTU1OTA1MTUyCisJYW5kCWVicCxlYngKKwlsZWEJZWN4LFtlYngqMStlYnhdCisJbW92CWVzaSxlYnAKKwlzaHIJZWJwLDcKKwlzdWIJZXNpLGVicAorCWFuZAllY3gsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJeG9yCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCW1vdgllYnAsMjE1NTkwNTE1MgorCWFuZAllYnAsZWN4CisJbGVhCWVkeCxbZWN4KjErZWN4XQorCW1vdgllc2ksZWJwCisJc2hyCWVicCw3CisJeG9yCWVjeCxlYXgKKwlzdWIJZXNpLGVicAorCWFuZAllZHgsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJcm9sCWVheCw4CisJeG9yCWVkeCxlc2kKKwltb3YJZWJwLERXT1JEIFs0K2VkaV0KKwl4b3IJZWF4LGVieAorCXhvcgllYngsZWR4CisJeG9yCWVheCxlY3gKKwlyb2wJZWJ4LDI0CisJeG9yCWVjeCxlZHgKKwl4b3IJZWF4LGVkeAorCXJvbAllY3gsMTYKKwl4b3IJZWF4LGVieAorCXJvbAllZHgsOAorCXhvcgllYXgsZWN4CisJbW92CWVieCxlYnAKKwl4b3IJZWF4LGVkeAorCW1vdglEV09SRCBbZWRpXSxlYXgKKwltb3YJZWJwLDIxNTU5MDUxNTIKKwlhbmQJZWJwLGVieAorCWxlYQllY3gsW2VieCoxK2VieF0KKwltb3YJZXNpLGVicAorCXNocgllYnAsNworCXN1Ygllc2ksZWJwCisJYW5kCWVjeCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwl4b3IJZWN4LGVzaQorCW1vdgllYnAsMjE1NTkwNTE1MgorCWFuZAllYnAsZWN4CisJbGVhCWVkeCxbZWN4KjErZWN4XQorCW1vdgllc2ksZWJwCisJc2hyCWVicCw3CisJc3ViCWVzaSxlYnAKKwlhbmQJZWR4LDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXhvcgllY3gsZWJ4CisJeG9yCWVkeCxlc2kKKwltb3YJZWJwLDIxNTU5MDUxNTIKKwlhbmQJZWJwLGVkeAorCWxlYQllYXgsW2VkeCoxK2VkeF0KKwltb3YJZXNpLGVicAorCXNocgllYnAsNworCXhvcgllZHgsZWJ4CisJc3ViCWVzaSxlYnAKKwlhbmQJZWF4LDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXJvbAllYngsOAorCXhvcgllYXgsZXNpCisJbW92CWVicCxEV09SRCBbOCtlZGldCisJeG9yCWVieCxlY3gKKwl4b3IJZWN4LGVheAorCXhvcgllYngsZWR4CisJcm9sCWVjeCwyNAorCXhvcgllZHgsZWF4CisJeG9yCWVieCxlYXgKKwlyb2wJZWR4LDE2CisJeG9yCWVieCxlY3gKKwlyb2wJZWF4LDgKKwl4b3IJZWJ4LGVkeAorCW1vdgllY3gsZWJwCisJeG9yCWVieCxlYXgKKwltb3YJRFdPUkQgWzQrZWRpXSxlYngKKwltb3YJZWJwLDIxNTU5MDUxNTIKKwlhbmQJZWJwLGVjeAorCWxlYQllZHgsW2VjeCoxK2VjeF0KKwltb3YJZXNpLGVicAorCXNocgllYnAsNworCXN1Ygllc2ksZWJwCisJYW5kCWVkeCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwl4b3IJZWR4LGVzaQorCW1vdgllYnAsMjE1NTkwNTE1MgorCWFuZAllYnAsZWR4CisJbGVhCWVheCxbZWR4KjErZWR4XQorCW1vdgllc2ksZWJwCisJc2hyCWVicCw3CisJc3ViCWVzaSxlYnAKKwlhbmQJZWF4LDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXhvcgllZHgsZWN4CisJeG9yCWVheCxlc2kKKwltb3YJZWJwLDIxNTU5MDUxNTIKKwlhbmQJZWJwLGVheAorCWxlYQllYngsW2VheCoxK2VheF0KKwltb3YJZXNpLGVicAorCXNocgllYnAsNworCXhvcgllYXgsZWN4CisJc3ViCWVzaSxlYnAKKwlhbmQJZWJ4LDQyNzgxMjQyODYKKwlhbmQJZXNpLDQ1NDc2MTI0MworCXJvbAllY3gsOAorCXhvcgllYngsZXNpCisJbW92CWVicCxEV09SRCBbMTIrZWRpXQorCXhvcgllY3gsZWR4CisJeG9yCWVkeCxlYngKKwl4b3IJZWN4LGVheAorCXJvbAllZHgsMjQKKwl4b3IJZWF4LGVieAorCXhvcgllY3gsZWJ4CisJcm9sCWVheCwxNgorCXhvcgllY3gsZWR4CisJcm9sCWVieCw4CisJeG9yCWVjeCxlYXgKKwltb3YJZWR4LGVicAorCXhvcgllY3gsZWJ4CisJbW92CURXT1JEIFs4K2VkaV0sZWN4CisJbW92CWVicCwyMTU1OTA1MTUyCisJYW5kCWVicCxlZHgKKwlsZWEJZWF4LFtlZHgqMStlZHhdCisJbW92CWVzaSxlYnAKKwlzaHIJZWJwLDcKKwlzdWIJZXNpLGVicAorCWFuZAllYXgsNDI3ODEyNDI4NgorCWFuZAllc2ksNDU0NzYxMjQzCisJeG9yCWVheCxlc2kKKwltb3YJZWJwLDIxNTU5MDUxNTIKKwlhbmQJZWJwLGVheAorCWxlYQllYngsW2VheCoxK2VheF0KKwltb3YJZXNpLGVicAorCXNocgllYnAsNworCXN1Ygllc2ksZWJwCisJYW5kCWVieCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwl4b3IJZWF4LGVkeAorCXhvcgllYngsZXNpCisJbW92CWVicCwyMTU1OTA1MTUyCisJYW5kCWVicCxlYngKKwlsZWEJZWN4LFtlYngqMStlYnhdCisJbW92CWVzaSxlYnAKKwlzaHIJZWJwLDcKKwl4b3IJZWJ4LGVkeAorCXN1Ygllc2ksZWJwCisJYW5kCWVjeCw0Mjc4MTI0Mjg2CisJYW5kCWVzaSw0NTQ3NjEyNDMKKwlyb2wJZWR4LDgKKwl4b3IJZWN4LGVzaQorCW1vdgllYnAsRFdPUkQgWzE2K2VkaV0KKwl4b3IJZWR4LGVheAorCXhvcgllYXgsZWN4CisJeG9yCWVkeCxlYngKKwlyb2wJZWF4LDI0CisJeG9yCWVieCxlY3gKKwl4b3IJZWR4LGVjeAorCXJvbAllYngsMTYKKwl4b3IJZWR4LGVheAorCXJvbAllY3gsOAorCXhvcgllZHgsZWJ4CisJbW92CWVheCxlYnAKKwl4b3IJZWR4LGVjeAorCW1vdglEV09SRCBbMTIrZWRpXSxlZHgKKwljbXAJZWRpLERXT1JEIFsyOCtlc3BdCisJamIJTkVBUiBMJDA1NnBlcm11dGUKKwl4b3IJZWF4LGVheAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2RiCTY1LDY5LDgzLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw0NCwzMiw2Nyw4Miw4OQorZGIJODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0CitkYgkxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKK3NlZ21lbnQJLmJzcworY29tbW9uCV9PUEVOU1NMX2lhMzJjYXBfUCAxNgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Ni5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzbmkteDg2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWE1OTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Ni5hc20KQEAgLTAsMCArMSwyNDI0IEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorO2V4dGVybglfT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlfYWVzbmlfZW5jcnlwdAorYWxpZ24JMTYKK19hZXNuaV9lbmNyeXB0OgorTCRfYWVzbmlfZW5jcnlwdF9iZWdpbjoKKwltb3YJZWF4LERXT1JEIFs0K2VzcF0KKwltb3YJZWR4LERXT1JEIFsxMitlc3BdCisJbW92dXBzCXhtbTIsW2VheF0KKwltb3YJZWN4LERXT1JEIFsyNDArZWR4XQorCW1vdgllYXgsRFdPUkQgWzgrZXNwXQorCW1vdnVwcwl4bW0wLFtlZHhdCisJbW92dXBzCXhtbTEsWzE2K2VkeF0KKwlsZWEJZWR4LFszMitlZHhdCisJeG9ycHMJeG1tMix4bW0wCitMJDAwMGVuYzFfbG9vcF8xOgorZGIJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWMJZWN4CisJbW92dXBzCXhtbTEsW2VkeF0KKwlsZWEJZWR4LFsxNitlZHhdCisJam56CU5FQVIgTCQwMDBlbmMxX2xvb3BfMQorZGIJMTAyLDE1LDU2LDIyMSwyMDkKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJbW92dXBzCVtlYXhdLHhtbTIKKwlweG9yCXhtbTIseG1tMgorCXJldAorZ2xvYmFsCV9hZXNuaV9kZWNyeXB0CithbGlnbgkxNgorX2Flc25pX2RlY3J5cHQ6CitMJF9hZXNuaV9kZWNyeXB0X2JlZ2luOgorCW1vdgllYXgsRFdPUkQgWzQrZXNwXQorCW1vdgllZHgsRFdPUkQgWzEyK2VzcF0KKwltb3Z1cHMJeG1tMixbZWF4XQorCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCisJbW92CWVheCxEV09SRCBbOCtlc3BdCisJbW92dXBzCXhtbTAsW2VkeF0KKwltb3Z1cHMJeG1tMSxbMTYrZWR4XQorCWxlYQllZHgsWzMyK2VkeF0KKwl4b3Jwcwl4bW0yLHhtbTAKK0wkMDAxZGVjMV9sb29wXzI6CitkYgkxMDIsMTUsNTYsMjIyLDIwOQorCWRlYwllY3gKKwltb3Z1cHMJeG1tMSxbZWR4XQorCWxlYQllZHgsWzE2K2VkeF0KKwlqbnoJTkVBUiBMJDAwMWRlYzFfbG9vcF8yCitkYgkxMDIsMTUsNTYsMjIzLDIwOQorCXB4b3IJeG1tMCx4bW0wCisJcHhvcgl4bW0xLHhtbTEKKwltb3Z1cHMJW2VheF0seG1tMgorCXB4b3IJeG1tMix4bW0yCisJcmV0CithbGlnbgkxNgorX19hZXNuaV9lbmNyeXB0MjoKKwltb3Z1cHMJeG1tMCxbZWR4XQorCXNobAllY3gsNAorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwltb3Z1cHMJeG1tMCxbMzIrZWR4XQorCWxlYQllZHgsWzMyK2VjeCoxK2VkeF0KKwluZWcJZWN4CisJYWRkCWVjeCwxNgorTCQwMDJlbmMyX2xvb3A6CitkYgkxMDIsMTUsNTYsMjIwLDIwOQorZGIJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3Z1cHMJeG1tMSxbZWN4KjErZWR4XQorCWFkZAllY3gsMzIKK2RiCTEwMiwxNSw1NiwyMjAsMjA4CitkYgkxMDIsMTUsNTYsMjIwLDIxNgorCW1vdnVwcwl4bW0wLFtlY3gqMStlZHgtMTZdCisJam56CU5FQVIgTCQwMDJlbmMyX2xvb3AKK2RiCTEwMiwxNSw1NiwyMjAsMjA5CitkYgkxMDIsMTUsNTYsMjIwLDIxNworZGIJMTAyLDE1LDU2LDIyMSwyMDgKK2RiCTEwMiwxNSw1NiwyMjEsMjE2CisJcmV0CithbGlnbgkxNgorX19hZXNuaV9kZWNyeXB0MjoKKwltb3Z1cHMJeG1tMCxbZWR4XQorCXNobAllY3gsNAorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwltb3Z1cHMJeG1tMCxbMzIrZWR4XQorCWxlYQllZHgsWzMyK2VjeCoxK2VkeF0KKwluZWcJZWN4CisJYWRkCWVjeCwxNgorTCQwMDNkZWMyX2xvb3A6CitkYgkxMDIsMTUsNTYsMjIyLDIwOQorZGIJMTAyLDE1LDU2LDIyMiwyMTcKKwltb3Z1cHMJeG1tMSxbZWN4KjErZWR4XQorCWFkZAllY3gsMzIKK2RiCTEwMiwxNSw1NiwyMjIsMjA4CitkYgkxMDIsMTUsNTYsMjIyLDIxNgorCW1vdnVwcwl4bW0wLFtlY3gqMStlZHgtMTZdCisJam56CU5FQVIgTCQwMDNkZWMyX2xvb3AKK2RiCTEwMiwxNSw1NiwyMjIsMjA5CitkYgkxMDIsMTUsNTYsMjIyLDIxNworZGIJMTAyLDE1LDU2LDIyMywyMDgKK2RiCTEwMiwxNSw1NiwyMjMsMjE2CisJcmV0CithbGlnbgkxNgorX19hZXNuaV9lbmNyeXB0MzoKKwltb3Z1cHMJeG1tMCxbZWR4XQorCXNobAllY3gsNAorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMAorCW1vdnVwcwl4bW0wLFszMitlZHhdCisJbGVhCWVkeCxbMzIrZWN4KjErZWR4XQorCW5lZwllY3gKKwlhZGQJZWN4LDE2CitMJDAwNGVuYzNfbG9vcDoKK2RiCTEwMiwxNSw1NiwyMjAsMjA5CitkYgkxMDIsMTUsNTYsMjIwLDIxNworZGIJMTAyLDE1LDU2LDIyMCwyMjUKKwltb3Z1cHMJeG1tMSxbZWN4KjErZWR4XQorCWFkZAllY3gsMzIKK2RiCTEwMiwxNSw1NiwyMjAsMjA4CitkYgkxMDIsMTUsNTYsMjIwLDIxNgorZGIJMTAyLDE1LDU2LDIyMCwyMjQKKwltb3Z1cHMJeG1tMCxbZWN4KjErZWR4LTE2XQorCWpueglORUFSIEwkMDA0ZW5jM19sb29wCitkYgkxMDIsMTUsNTYsMjIwLDIwOQorZGIJMTAyLDE1LDU2LDIyMCwyMTcKK2RiCTEwMiwxNSw1NiwyMjAsMjI1CitkYgkxMDIsMTUsNTYsMjIxLDIwOAorZGIJMTAyLDE1LDU2LDIyMSwyMTYKK2RiCTEwMiwxNSw1NiwyMjEsMjI0CisJcmV0CithbGlnbgkxNgorX19hZXNuaV9kZWNyeXB0MzoKKwltb3Z1cHMJeG1tMCxbZWR4XQorCXNobAllY3gsNAorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMAorCW1vdnVwcwl4bW0wLFszMitlZHhdCisJbGVhCWVkeCxbMzIrZWN4KjErZWR4XQorCW5lZwllY3gKKwlhZGQJZWN4LDE2CitMJDAwNWRlYzNfbG9vcDoKK2RiCTEwMiwxNSw1NiwyMjIsMjA5CitkYgkxMDIsMTUsNTYsMjIyLDIxNworZGIJMTAyLDE1LDU2LDIyMiwyMjUKKwltb3Z1cHMJeG1tMSxbZWN4KjErZWR4XQorCWFkZAllY3gsMzIKK2RiCTEwMiwxNSw1NiwyMjIsMjA4CitkYgkxMDIsMTUsNTYsMjIyLDIxNgorZGIJMTAyLDE1LDU2LDIyMiwyMjQKKwltb3Z1cHMJeG1tMCxbZWN4KjErZWR4LTE2XQorCWpueglORUFSIEwkMDA1ZGVjM19sb29wCitkYgkxMDIsMTUsNTYsMjIyLDIwOQorZGIJMTAyLDE1LDU2LDIyMiwyMTcKK2RiCTEwMiwxNSw1NiwyMjIsMjI1CitkYgkxMDIsMTUsNTYsMjIzLDIwOAorZGIJMTAyLDE1LDU2LDIyMywyMTYKK2RiCTEwMiwxNSw1NiwyMjMsMjI0CisJcmV0CithbGlnbgkxNgorX19hZXNuaV9lbmNyeXB0NDoKKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJc2hsCWVjeCw0CisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMAorCXB4b3IJeG1tNSx4bW0wCisJbW92dXBzCXhtbTAsWzMyK2VkeF0KKwlsZWEJZWR4LFszMitlY3gqMStlZHhdCisJbmVnCWVjeAorZGIJMTUsMzEsNjQsMAorCWFkZAllY3gsMTYKK0wkMDA2ZW5jNF9sb29wOgorZGIJMTAyLDE1LDU2LDIyMCwyMDkKK2RiCTEwMiwxNSw1NiwyMjAsMjE3CitkYgkxMDIsMTUsNTYsMjIwLDIyNQorZGIJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJeG1tMSxbZWN4KjErZWR4XQorCWFkZAllY3gsMzIKK2RiCTEwMiwxNSw1NiwyMjAsMjA4CitkYgkxMDIsMTUsNTYsMjIwLDIxNgorZGIJMTAyLDE1LDU2LDIyMCwyMjQKK2RiCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92dXBzCXhtbTAsW2VjeCoxK2VkeC0xNl0KKwlqbnoJTkVBUiBMJDAwNmVuYzRfbG9vcAorZGIJMTAyLDE1LDU2LDIyMCwyMDkKK2RiCTEwMiwxNSw1NiwyMjAsMjE3CitkYgkxMDIsMTUsNTYsMjIwLDIyNQorZGIJMTAyLDE1LDU2LDIyMCwyMzMKK2RiCTEwMiwxNSw1NiwyMjEsMjA4CitkYgkxMDIsMTUsNTYsMjIxLDIxNgorZGIJMTAyLDE1LDU2LDIyMSwyMjQKK2RiCTEwMiwxNSw1NiwyMjEsMjMyCisJcmV0CithbGlnbgkxNgorX19hZXNuaV9kZWNyeXB0NDoKKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJc2hsCWVjeCw0CisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMAorCXB4b3IJeG1tNSx4bW0wCisJbW92dXBzCXhtbTAsWzMyK2VkeF0KKwlsZWEJZWR4LFszMitlY3gqMStlZHhdCisJbmVnCWVjeAorZGIJMTUsMzEsNjQsMAorCWFkZAllY3gsMTYKK0wkMDA3ZGVjNF9sb29wOgorZGIJMTAyLDE1LDU2LDIyMiwyMDkKK2RiCTEwMiwxNSw1NiwyMjIsMjE3CitkYgkxMDIsMTUsNTYsMjIyLDIyNQorZGIJMTAyLDE1LDU2LDIyMiwyMzMKKwltb3Z1cHMJeG1tMSxbZWN4KjErZWR4XQorCWFkZAllY3gsMzIKK2RiCTEwMiwxNSw1NiwyMjIsMjA4CitkYgkxMDIsMTUsNTYsMjIyLDIxNgorZGIJMTAyLDE1LDU2LDIyMiwyMjQKK2RiCTEwMiwxNSw1NiwyMjIsMjMyCisJbW92dXBzCXhtbTAsW2VjeCoxK2VkeC0xNl0KKwlqbnoJTkVBUiBMJDAwN2RlYzRfbG9vcAorZGIJMTAyLDE1LDU2LDIyMiwyMDkKK2RiCTEwMiwxNSw1NiwyMjIsMjE3CitkYgkxMDIsMTUsNTYsMjIyLDIyNQorZGIJMTAyLDE1LDU2LDIyMiwyMzMKK2RiCTEwMiwxNSw1NiwyMjMsMjA4CitkYgkxMDIsMTUsNTYsMjIzLDIxNgorZGIJMTAyLDE1LDU2LDIyMywyMjQKK2RiCTEwMiwxNSw1NiwyMjMsMjMyCisJcmV0CithbGlnbgkxNgorX19hZXNuaV9lbmNyeXB0NjoKKwltb3Z1cHMJeG1tMCxbZWR4XQorCXNobAllY3gsNAorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMAorZGIJMTAyLDE1LDU2LDIyMCwyMDkKKwlweG9yCXhtbTUseG1tMAorCXB4b3IJeG1tNix4bW0wCitkYgkxMDIsMTUsNTYsMjIwLDIxNworCWxlYQllZHgsWzMyK2VjeCoxK2VkeF0KKwluZWcJZWN4CitkYgkxMDIsMTUsNTYsMjIwLDIyNQorCXB4b3IJeG1tNyx4bW0wCisJbW92dXBzCXhtbTAsW2VjeCoxK2VkeF0KKwlhZGQJZWN4LDE2CisJam1wCU5FQVIgTCQwMDhfYWVzbmlfZW5jcnlwdDZfaW5uZXIKK2FsaWduCTE2CitMJDAwOWVuYzZfbG9vcDoKK2RiCTEwMiwxNSw1NiwyMjAsMjA5CitkYgkxMDIsMTUsNTYsMjIwLDIxNworZGIJMTAyLDE1LDU2LDIyMCwyMjUKK0wkMDA4X2Flc25pX2VuY3J5cHQ2X2lubmVyOgorZGIJMTAyLDE1LDU2LDIyMCwyMzMKK2RiCTEwMiwxNSw1NiwyMjAsMjQxCitkYgkxMDIsMTUsNTYsMjIwLDI0OQorTCRfYWVzbmlfZW5jcnlwdDZfZW50ZXI6CisJbW92dXBzCXhtbTEsW2VjeCoxK2VkeF0KKwlhZGQJZWN4LDMyCitkYgkxMDIsMTUsNTYsMjIwLDIwOAorZGIJMTAyLDE1LDU2LDIyMCwyMTYKK2RiCTEwMiwxNSw1NiwyMjAsMjI0CitkYgkxMDIsMTUsNTYsMjIwLDIzMgorZGIJMTAyLDE1LDU2LDIyMCwyNDAKK2RiCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCXhtbTAsW2VjeCoxK2VkeC0xNl0KKwlqbnoJTkVBUiBMJDAwOWVuYzZfbG9vcAorZGIJMTAyLDE1LDU2LDIyMCwyMDkKK2RiCTEwMiwxNSw1NiwyMjAsMjE3CitkYgkxMDIsMTUsNTYsMjIwLDIyNQorZGIJMTAyLDE1LDU2LDIyMCwyMzMKK2RiCTEwMiwxNSw1NiwyMjAsMjQxCitkYgkxMDIsMTUsNTYsMjIwLDI0OQorZGIJMTAyLDE1LDU2LDIyMSwyMDgKK2RiCTEwMiwxNSw1NiwyMjEsMjE2CitkYgkxMDIsMTUsNTYsMjIxLDIyNAorZGIJMTAyLDE1LDU2LDIyMSwyMzIKK2RiCTEwMiwxNSw1NiwyMjEsMjQwCitkYgkxMDIsMTUsNTYsMjIxLDI0OAorCXJldAorYWxpZ24JMTYKK19fYWVzbmlfZGVjcnlwdDY6CisJbW92dXBzCXhtbTAsW2VkeF0KKwlzaGwJZWN4LDQKKwltb3Z1cHMJeG1tMSxbMTYrZWR4XQorCXhvcnBzCXhtbTIseG1tMAorCXB4b3IJeG1tMyx4bW0wCisJcHhvcgl4bW00LHhtbTAKK2RiCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgl4bW01LHhtbTAKKwlweG9yCXhtbTYseG1tMAorZGIJMTAyLDE1LDU2LDIyMiwyMTcKKwlsZWEJZWR4LFszMitlY3gqMStlZHhdCisJbmVnCWVjeAorZGIJMTAyLDE1LDU2LDIyMiwyMjUKKwlweG9yCXhtbTcseG1tMAorCW1vdnVwcwl4bW0wLFtlY3gqMStlZHhdCisJYWRkCWVjeCwxNgorCWptcAlORUFSIEwkMDEwX2Flc25pX2RlY3J5cHQ2X2lubmVyCithbGlnbgkxNgorTCQwMTFkZWM2X2xvb3A6CitkYgkxMDIsMTUsNTYsMjIyLDIwOQorZGIJMTAyLDE1LDU2LDIyMiwyMTcKK2RiCTEwMiwxNSw1NiwyMjIsMjI1CitMJDAxMF9hZXNuaV9kZWNyeXB0Nl9pbm5lcjoKK2RiCTEwMiwxNSw1NiwyMjIsMjMzCitkYgkxMDIsMTUsNTYsMjIyLDI0MQorZGIJMTAyLDE1LDU2LDIyMiwyNDkKK0wkX2Flc25pX2RlY3J5cHQ2X2VudGVyOgorCW1vdnVwcwl4bW0xLFtlY3gqMStlZHhdCisJYWRkCWVjeCwzMgorZGIJMTAyLDE1LDU2LDIyMiwyMDgKK2RiCTEwMiwxNSw1NiwyMjIsMjE2CitkYgkxMDIsMTUsNTYsMjIyLDIyNAorZGIJMTAyLDE1LDU2LDIyMiwyMzIKK2RiCTEwMiwxNSw1NiwyMjIsMjQwCitkYgkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwl4bW0wLFtlY3gqMStlZHgtMTZdCisJam56CU5FQVIgTCQwMTFkZWM2X2xvb3AKK2RiCTEwMiwxNSw1NiwyMjIsMjA5CitkYgkxMDIsMTUsNTYsMjIyLDIxNworZGIJMTAyLDE1LDU2LDIyMiwyMjUKK2RiCTEwMiwxNSw1NiwyMjIsMjMzCitkYgkxMDIsMTUsNTYsMjIyLDI0MQorZGIJMTAyLDE1LDU2LDIyMiwyNDkKK2RiCTEwMiwxNSw1NiwyMjMsMjA4CitkYgkxMDIsMTUsNTYsMjIzLDIxNgorZGIJMTAyLDE1LDU2LDIyMywyMjQKK2RiCTEwMiwxNSw1NiwyMjMsMjMyCitkYgkxMDIsMTUsNTYsMjIzLDI0MAorZGIJMTAyLDE1LDU2LDIyMywyNDgKKwlyZXQKK2dsb2JhbAlfYWVzbmlfZWNiX2VuY3J5cHQKK2FsaWduCTE2CitfYWVzbmlfZWNiX2VuY3J5cHQ6CitMJF9hZXNuaV9lY2JfZW5jcnlwdF9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVheCxEV09SRCBbMjgrZXNwXQorCW1vdgllZHgsRFdPUkQgWzMyK2VzcF0KKwltb3YJZWJ4LERXT1JEIFszNitlc3BdCisJYW5kCWVheCwtMTYKKwlqeglORUFSIEwkMDEyZWNiX3JldAorCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCisJdGVzdAllYngsZWJ4CisJanoJTkVBUiBMJDAxM2VjYl9kZWNyeXB0CisJbW92CWVicCxlZHgKKwltb3YJZWJ4LGVjeAorCWNtcAllYXgsOTYKKwlqYglORUFSIEwkMDE0ZWNiX2VuY190YWlsCisJbW92ZHF1CXhtbTIsW2VzaV0KKwltb3ZkcXUJeG1tMyxbMTYrZXNpXQorCW1vdmRxdQl4bW00LFszMitlc2ldCisJbW92ZHF1CXhtbTUsWzQ4K2VzaV0KKwltb3ZkcXUJeG1tNixbNjQrZXNpXQorCW1vdmRxdQl4bW03LFs4MCtlc2ldCisJbGVhCWVzaSxbOTYrZXNpXQorCXN1YgllYXgsOTYKKwlqbXAJTkVBUiBMJDAxNWVjYl9lbmNfbG9vcDZfZW50ZXIKK2FsaWduCTE2CitMJDAxNmVjYl9lbmNfbG9vcDY6CisJbW92dXBzCVtlZGldLHhtbTIKKwltb3ZkcXUJeG1tMixbZXNpXQorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92ZHF1CXhtbTMsWzE2K2VzaV0KKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCW1vdmRxdQl4bW00LFszMitlc2ldCisJbW92dXBzCVs0OCtlZGldLHhtbTUKKwltb3ZkcXUJeG1tNSxbNDgrZXNpXQorCW1vdnVwcwlbNjQrZWRpXSx4bW02CisJbW92ZHF1CXhtbTYsWzY0K2VzaV0KKwltb3Z1cHMJWzgwK2VkaV0seG1tNworCWxlYQllZGksWzk2K2VkaV0KKwltb3ZkcXUJeG1tNyxbODArZXNpXQorCWxlYQllc2ksWzk2K2VzaV0KK0wkMDE1ZWNiX2VuY19sb29wNl9lbnRlcjoKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDYKKwltb3YJZWR4LGVicAorCW1vdgllY3gsZWJ4CisJc3ViCWVheCw5NgorCWpuYwlORUFSIEwkMDE2ZWNiX2VuY19sb29wNgorCW1vdnVwcwlbZWRpXSx4bW0yCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCW1vdnVwcwlbNDgrZWRpXSx4bW01CisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwltb3Z1cHMJWzgwK2VkaV0seG1tNworCWxlYQllZGksWzk2K2VkaV0KKwlhZGQJZWF4LDk2CisJanoJTkVBUiBMJDAxMmVjYl9yZXQKK0wkMDE0ZWNiX2VuY190YWlsOgorCW1vdnVwcwl4bW0yLFtlc2ldCisJY21wCWVheCwzMgorCWpiCU5FQVIgTCQwMTdlY2JfZW5jX29uZQorCW1vdnVwcwl4bW0zLFsxNitlc2ldCisJamUJTkVBUiBMJDAxOGVjYl9lbmNfdHdvCisJbW92dXBzCXhtbTQsWzMyK2VzaV0KKwljbXAJZWF4LDY0CisJamIJTkVBUiBMJDAxOWVjYl9lbmNfdGhyZWUKKwltb3Z1cHMJeG1tNSxbNDgrZXNpXQorCWplCU5FQVIgTCQwMjBlY2JfZW5jX2ZvdXIKKwltb3Z1cHMJeG1tNixbNjQrZXNpXQorCXhvcnBzCXhtbTcseG1tNworCWNhbGwJX19hZXNuaV9lbmNyeXB0NgorCW1vdnVwcwlbZWRpXSx4bW0yCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCW1vdnVwcwlbNDgrZWRpXSx4bW01CisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwlqbXAJTkVBUiBMJDAxMmVjYl9yZXQKK2FsaWduCTE2CitMJDAxN2VjYl9lbmNfb25lOgorCW1vdnVwcwl4bW0wLFtlZHhdCisJbW92dXBzCXhtbTEsWzE2K2VkeF0KKwlsZWEJZWR4LFszMitlZHhdCisJeG9ycHMJeG1tMix4bW0wCitMJDAyMWVuYzFfbG9vcF8zOgorZGIJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWMJZWN4CisJbW92dXBzCXhtbTEsW2VkeF0KKwlsZWEJZWR4LFsxNitlZHhdCisJam56CU5FQVIgTCQwMjFlbmMxX2xvb3BfMworZGIJMTAyLDE1LDU2LDIyMSwyMDkKKwltb3Z1cHMJW2VkaV0seG1tMgorCWptcAlORUFSIEwkMDEyZWNiX3JldAorYWxpZ24JMTYKK0wkMDE4ZWNiX2VuY190d286CisJY2FsbAlfX2Flc25pX2VuY3J5cHQyCisJbW92dXBzCVtlZGldLHhtbTIKKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCWptcAlORUFSIEwkMDEyZWNiX3JldAorYWxpZ24JMTYKK0wkMDE5ZWNiX2VuY190aHJlZToKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDMKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwlqbXAJTkVBUiBMJDAxMmVjYl9yZXQKK2FsaWduCTE2CitMJDAyMGVjYl9lbmNfZm91cjoKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDQKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorCWptcAlORUFSIEwkMDEyZWNiX3JldAorYWxpZ24JMTYKK0wkMDEzZWNiX2RlY3J5cHQ6CisJbW92CWVicCxlZHgKKwltb3YJZWJ4LGVjeAorCWNtcAllYXgsOTYKKwlqYglORUFSIEwkMDIyZWNiX2RlY190YWlsCisJbW92ZHF1CXhtbTIsW2VzaV0KKwltb3ZkcXUJeG1tMyxbMTYrZXNpXQorCW1vdmRxdQl4bW00LFszMitlc2ldCisJbW92ZHF1CXhtbTUsWzQ4K2VzaV0KKwltb3ZkcXUJeG1tNixbNjQrZXNpXQorCW1vdmRxdQl4bW03LFs4MCtlc2ldCisJbGVhCWVzaSxbOTYrZXNpXQorCXN1YgllYXgsOTYKKwlqbXAJTkVBUiBMJDAyM2VjYl9kZWNfbG9vcDZfZW50ZXIKK2FsaWduCTE2CitMJDAyNGVjYl9kZWNfbG9vcDY6CisJbW92dXBzCVtlZGldLHhtbTIKKwltb3ZkcXUJeG1tMixbZXNpXQorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92ZHF1CXhtbTMsWzE2K2VzaV0KKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCW1vdmRxdQl4bW00LFszMitlc2ldCisJbW92dXBzCVs0OCtlZGldLHhtbTUKKwltb3ZkcXUJeG1tNSxbNDgrZXNpXQorCW1vdnVwcwlbNjQrZWRpXSx4bW02CisJbW92ZHF1CXhtbTYsWzY0K2VzaV0KKwltb3Z1cHMJWzgwK2VkaV0seG1tNworCWxlYQllZGksWzk2K2VkaV0KKwltb3ZkcXUJeG1tNyxbODArZXNpXQorCWxlYQllc2ksWzk2K2VzaV0KK0wkMDIzZWNiX2RlY19sb29wNl9lbnRlcjoKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDYKKwltb3YJZWR4LGVicAorCW1vdgllY3gsZWJ4CisJc3ViCWVheCw5NgorCWpuYwlORUFSIEwkMDI0ZWNiX2RlY19sb29wNgorCW1vdnVwcwlbZWRpXSx4bW0yCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCW1vdnVwcwlbNDgrZWRpXSx4bW01CisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwltb3Z1cHMJWzgwK2VkaV0seG1tNworCWxlYQllZGksWzk2K2VkaV0KKwlhZGQJZWF4LDk2CisJanoJTkVBUiBMJDAxMmVjYl9yZXQKK0wkMDIyZWNiX2RlY190YWlsOgorCW1vdnVwcwl4bW0yLFtlc2ldCisJY21wCWVheCwzMgorCWpiCU5FQVIgTCQwMjVlY2JfZGVjX29uZQorCW1vdnVwcwl4bW0zLFsxNitlc2ldCisJamUJTkVBUiBMJDAyNmVjYl9kZWNfdHdvCisJbW92dXBzCXhtbTQsWzMyK2VzaV0KKwljbXAJZWF4LDY0CisJamIJTkVBUiBMJDAyN2VjYl9kZWNfdGhyZWUKKwltb3Z1cHMJeG1tNSxbNDgrZXNpXQorCWplCU5FQVIgTCQwMjhlY2JfZGVjX2ZvdXIKKwltb3Z1cHMJeG1tNixbNjQrZXNpXQorCXhvcnBzCXhtbTcseG1tNworCWNhbGwJX19hZXNuaV9kZWNyeXB0NgorCW1vdnVwcwlbZWRpXSx4bW0yCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCW1vdnVwcwlbNDgrZWRpXSx4bW01CisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwlqbXAJTkVBUiBMJDAxMmVjYl9yZXQKK2FsaWduCTE2CitMJDAyNWVjYl9kZWNfb25lOgorCW1vdnVwcwl4bW0wLFtlZHhdCisJbW92dXBzCXhtbTEsWzE2K2VkeF0KKwlsZWEJZWR4LFszMitlZHhdCisJeG9ycHMJeG1tMix4bW0wCitMJDAyOWRlYzFfbG9vcF80OgorZGIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJZWN4CisJbW92dXBzCXhtbTEsW2VkeF0KKwlsZWEJZWR4LFsxNitlZHhdCisJam56CU5FQVIgTCQwMjlkZWMxX2xvb3BfNAorZGIJMTAyLDE1LDU2LDIyMywyMDkKKwltb3Z1cHMJW2VkaV0seG1tMgorCWptcAlORUFSIEwkMDEyZWNiX3JldAorYWxpZ24JMTYKK0wkMDI2ZWNiX2RlY190d286CisJY2FsbAlfX2Flc25pX2RlY3J5cHQyCisJbW92dXBzCVtlZGldLHhtbTIKKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCWptcAlORUFSIEwkMDEyZWNiX3JldAorYWxpZ24JMTYKK0wkMDI3ZWNiX2RlY190aHJlZToKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDMKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwlqbXAJTkVBUiBMJDAxMmVjYl9yZXQKK2FsaWduCTE2CitMJDAyOGVjYl9kZWNfZm91cjoKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDQKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorTCQwMTJlY2JfcmV0OgorCXB4b3IJeG1tMCx4bW0wCisJcHhvcgl4bW0xLHhtbTEKKwlweG9yCXhtbTIseG1tMgorCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorCXB4b3IJeG1tNix4bW02CisJcHhvcgl4bW03LHhtbTcKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CitnbG9iYWwJX2Flc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzCithbGlnbgkxNgorX2Flc25pX2NjbTY0X2VuY3J5cHRfYmxvY2tzOgorTCRfYWVzbmlfY2NtNjRfZW5jcnlwdF9ibG9ja3NfYmVnaW46CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCW1vdgllYXgsRFdPUkQgWzI4K2VzcF0KKwltb3YJZWR4LERXT1JEIFszMitlc3BdCisJbW92CWVieCxEV09SRCBbMzYrZXNwXQorCW1vdgllY3gsRFdPUkQgWzQwK2VzcF0KKwltb3YJZWJwLGVzcAorCXN1Ygllc3AsNjAKKwlhbmQJZXNwLC0xNgorCW1vdglEV09SRCBbNDgrZXNwXSxlYnAKKwltb3ZkcXUJeG1tNyxbZWJ4XQorCW1vdmRxdQl4bW0zLFtlY3hdCisJbW92CWVjeCxEV09SRCBbMjQwK2VkeF0KKwltb3YJRFdPUkQgW2VzcF0sMjAyMTgyMTU5CisJbW92CURXT1JEIFs0K2VzcF0sMTM0ODEwMTIzCisJbW92CURXT1JEIFs4K2VzcF0sNjc0MzgwODcKKwltb3YJRFdPUkQgWzEyK2VzcF0sNjYwNTEKKwltb3YJZWJ4LDEKKwl4b3IJZWJwLGVicAorCW1vdglEV09SRCBbMTYrZXNwXSxlYngKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJwCisJbW92CURXT1JEIFsyNCtlc3BdLGVicAorCW1vdglEV09SRCBbMjgrZXNwXSxlYnAKKwlzaGwJZWN4LDQKKwltb3YJZWJ4LDE2CisJbGVhCWVicCxbZWR4XQorCW1vdmRxYQl4bW01LFtlc3BdCisJbW92ZHFhCXhtbTIseG1tNworCWxlYQllZHgsWzMyK2VjeCoxK2VkeF0KKwlzdWIJZWJ4LGVjeAorZGIJMTAyLDE1LDU2LDAsMjUzCitMJDAzMGNjbTY0X2VuY19vdXRlcjoKKwltb3Z1cHMJeG1tMCxbZWJwXQorCW1vdgllY3gsZWJ4CisJbW92dXBzCXhtbTYsW2VzaV0KKwl4b3Jwcwl4bW0yLHhtbTAKKwltb3Z1cHMJeG1tMSxbMTYrZWJwXQorCXhvcnBzCXhtbTAseG1tNgorCXhvcnBzCXhtbTMseG1tMAorCW1vdnVwcwl4bW0wLFszMitlYnBdCitMJDAzMWNjbTY0X2VuYzJfbG9vcDoKK2RiCTEwMiwxNSw1NiwyMjAsMjA5CitkYgkxMDIsMTUsNTYsMjIwLDIxNworCW1vdnVwcwl4bW0xLFtlY3gqMStlZHhdCisJYWRkCWVjeCwzMgorZGIJMTAyLDE1LDU2LDIyMCwyMDgKK2RiCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCXhtbTAsW2VjeCoxK2VkeC0xNl0KKwlqbnoJTkVBUiBMJDAzMWNjbTY0X2VuYzJfbG9vcAorZGIJMTAyLDE1LDU2LDIyMCwyMDkKK2RiCTEwMiwxNSw1NiwyMjAsMjE3CisJcGFkZHEJeG1tNyxbMTYrZXNwXQorCWRlYwllYXgKK2RiCTEwMiwxNSw1NiwyMjEsMjA4CitkYgkxMDIsMTUsNTYsMjIxLDIxNgorCWxlYQllc2ksWzE2K2VzaV0KKwl4b3Jwcwl4bW02LHhtbTIKKwltb3ZkcWEJeG1tMix4bW03CisJbW92dXBzCVtlZGldLHhtbTYKK2RiCTEwMiwxNSw1NiwwLDIxMworCWxlYQllZGksWzE2K2VkaV0KKwlqbnoJTkVBUiBMJDAzMGNjbTY0X2VuY19vdXRlcgorCW1vdgllc3AsRFdPUkQgWzQ4K2VzcF0KKwltb3YJZWRpLERXT1JEIFs0MCtlc3BdCisJbW92dXBzCVtlZGldLHhtbTMKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJcHhvcgl4bW0yLHhtbTIKKwlweG9yCXhtbTMseG1tMworCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKwlweG9yCXhtbTYseG1tNgorCXB4b3IJeG1tNyx4bW03CisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9hZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrcworYWxpZ24JMTYKK19hZXNuaV9jY202NF9kZWNyeXB0X2Jsb2NrczoKK0wkX2Flc25pX2NjbTY0X2RlY3J5cHRfYmxvY2tzX2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwltb3YJZWF4LERXT1JEIFsyOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMzIrZXNwXQorCW1vdgllYngsRFdPUkQgWzM2K2VzcF0KKwltb3YJZWN4LERXT1JEIFs0MCtlc3BdCisJbW92CWVicCxlc3AKKwlzdWIJZXNwLDYwCisJYW5kCWVzcCwtMTYKKwltb3YJRFdPUkQgWzQ4K2VzcF0sZWJwCisJbW92ZHF1CXhtbTcsW2VieF0KKwltb3ZkcXUJeG1tMyxbZWN4XQorCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCisJbW92CURXT1JEIFtlc3BdLDIwMjE4MjE1OQorCW1vdglEV09SRCBbNCtlc3BdLDEzNDgxMDEyMworCW1vdglEV09SRCBbOCtlc3BdLDY3NDM4MDg3CisJbW92CURXT1JEIFsxMitlc3BdLDY2MDUxCisJbW92CWVieCwxCisJeG9yCWVicCxlYnAKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWJ4CisJbW92CURXT1JEIFsyMCtlc3BdLGVicAorCW1vdglEV09SRCBbMjQrZXNwXSxlYnAKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWJwCisJbW92ZHFhCXhtbTUsW2VzcF0KKwltb3ZkcWEJeG1tMix4bW03CisJbW92CWVicCxlZHgKKwltb3YJZWJ4LGVjeAorZGIJMTAyLDE1LDU2LDAsMjUzCisJbW92dXBzCXhtbTAsW2VkeF0KKwltb3Z1cHMJeG1tMSxbMTYrZWR4XQorCWxlYQllZHgsWzMyK2VkeF0KKwl4b3Jwcwl4bW0yLHhtbTAKK0wkMDMyZW5jMV9sb29wXzU6CitkYgkxMDIsMTUsNTYsMjIwLDIwOQorCWRlYwllY3gKKwltb3Z1cHMJeG1tMSxbZWR4XQorCWxlYQllZHgsWzE2K2VkeF0KKwlqbnoJTkVBUiBMJDAzMmVuYzFfbG9vcF81CitkYgkxMDIsMTUsNTYsMjIxLDIwOQorCXNobAllYngsNAorCW1vdgllY3gsMTYKKwltb3Z1cHMJeG1tNixbZXNpXQorCXBhZGRxCXhtbTcsWzE2K2VzcF0KKwlsZWEJZXNpLFsxNitlc2ldCisJc3ViCWVjeCxlYngKKwlsZWEJZWR4LFszMitlYngqMStlYnBdCisJbW92CWVieCxlY3gKKwlqbXAJTkVBUiBMJDAzM2NjbTY0X2RlY19vdXRlcgorYWxpZ24JMTYKK0wkMDMzY2NtNjRfZGVjX291dGVyOgorCXhvcnBzCXhtbTYseG1tMgorCW1vdmRxYQl4bW0yLHhtbTcKKwltb3Z1cHMJW2VkaV0seG1tNgorCWxlYQllZGksWzE2K2VkaV0KK2RiCTEwMiwxNSw1NiwwLDIxMworCXN1YgllYXgsMQorCWp6CU5FQVIgTCQwMzRjY202NF9kZWNfYnJlYWsKKwltb3Z1cHMJeG1tMCxbZWJwXQorCW1vdgllY3gsZWJ4CisJbW92dXBzCXhtbTEsWzE2K2VicF0KKwl4b3Jwcwl4bW02LHhtbTAKKwl4b3Jwcwl4bW0yLHhtbTAKKwl4b3Jwcwl4bW0zLHhtbTYKKwltb3Z1cHMJeG1tMCxbMzIrZWJwXQorTCQwMzVjY202NF9kZWMyX2xvb3A6CitkYgkxMDIsMTUsNTYsMjIwLDIwOQorZGIJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3Z1cHMJeG1tMSxbZWN4KjErZWR4XQorCWFkZAllY3gsMzIKK2RiCTEwMiwxNSw1NiwyMjAsMjA4CitkYgkxMDIsMTUsNTYsMjIwLDIxNgorCW1vdnVwcwl4bW0wLFtlY3gqMStlZHgtMTZdCisJam56CU5FQVIgTCQwMzVjY202NF9kZWMyX2xvb3AKKwltb3Z1cHMJeG1tNixbZXNpXQorCXBhZGRxCXhtbTcsWzE2K2VzcF0KK2RiCTEwMiwxNSw1NiwyMjAsMjA5CitkYgkxMDIsMTUsNTYsMjIwLDIxNworZGIJMTAyLDE1LDU2LDIyMSwyMDgKK2RiCTEwMiwxNSw1NiwyMjEsMjE2CisJbGVhCWVzaSxbMTYrZXNpXQorCWptcAlORUFSIEwkMDMzY2NtNjRfZGVjX291dGVyCithbGlnbgkxNgorTCQwMzRjY202NF9kZWNfYnJlYWs6CisJbW92CWVjeCxEV09SRCBbMjQwK2VicF0KKwltb3YJZWR4LGVicAorCW1vdnVwcwl4bW0wLFtlZHhdCisJbW92dXBzCXhtbTEsWzE2K2VkeF0KKwl4b3Jwcwl4bW02LHhtbTAKKwlsZWEJZWR4LFszMitlZHhdCisJeG9ycHMJeG1tMyx4bW02CitMJDAzNmVuYzFfbG9vcF82OgorZGIJMTAyLDE1LDU2LDIyMCwyMTcKKwlkZWMJZWN4CisJbW92dXBzCXhtbTEsW2VkeF0KKwlsZWEJZWR4LFsxNitlZHhdCisJam56CU5FQVIgTCQwMzZlbmMxX2xvb3BfNgorZGIJMTAyLDE1LDU2LDIyMSwyMTcKKwltb3YJZXNwLERXT1JEIFs0OCtlc3BdCisJbW92CWVkaSxEV09SRCBbNDArZXNwXQorCW1vdnVwcwlbZWRpXSx4bW0zCisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXB4b3IJeG1tMix4bW0yCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTQseG1tNAorCXB4b3IJeG1tNSx4bW01CisJcHhvcgl4bW02LHhtbTYKKwlweG9yCXhtbTcseG1tNworCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2dsb2JhbAlfYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3MKK2FsaWduCTE2CitfYWVzbmlfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CitMJF9hZXNuaV9jdHIzMl9lbmNyeXB0X2Jsb2Nrc19iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVheCxEV09SRCBbMjgrZXNwXQorCW1vdgllZHgsRFdPUkQgWzMyK2VzcF0KKwltb3YJZWJ4LERXT1JEIFszNitlc3BdCisJbW92CWVicCxlc3AKKwlzdWIJZXNwLDg4CisJYW5kCWVzcCwtMTYKKwltb3YJRFdPUkQgWzgwK2VzcF0sZWJwCisJY21wCWVheCwxCisJamUJTkVBUiBMJDAzN2N0cjMyX29uZV9zaG9ydGN1dAorCW1vdmRxdQl4bW03LFtlYnhdCisJbW92CURXT1JEIFtlc3BdLDIwMjE4MjE1OQorCW1vdglEV09SRCBbNCtlc3BdLDEzNDgxMDEyMworCW1vdglEV09SRCBbOCtlc3BdLDY3NDM4MDg3CisJbW92CURXT1JEIFsxMitlc3BdLDY2MDUxCisJbW92CWVjeCw2CisJeG9yCWVicCxlYnAKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWN4CisJbW92CURXT1JEIFsyMCtlc3BdLGVjeAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWJwCitkYgkxMDIsMTUsNTgsMjIsMjUxLDMKK2RiCTEwMiwxNSw1OCwzNCwyNTMsMworCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCisJYnN3YXAJZWJ4CisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCW1vdmRxYQl4bW0yLFtlc3BdCitkYgkxMDIsMTUsNTgsMzQsMTk1LDAKKwlsZWEJZWJwLFszK2VieF0KK2RiCTEwMiwxNSw1OCwzNCwyMDUsMAorCWluYwllYngKK2RiCTEwMiwxNSw1OCwzNCwxOTUsMQorCWluYwllYnAKK2RiCTEwMiwxNSw1OCwzNCwyMDUsMQorCWluYwllYngKK2RiCTEwMiwxNSw1OCwzNCwxOTUsMgorCWluYwllYnAKK2RiCTEwMiwxNSw1OCwzNCwyMDUsMgorCW1vdmRxYQlbNDgrZXNwXSx4bW0wCitkYgkxMDIsMTUsNTYsMCwxOTQKKwltb3ZkcXUJeG1tNixbZWR4XQorCW1vdmRxYQlbNjQrZXNwXSx4bW0xCitkYgkxMDIsMTUsNTYsMCwyMDIKKwlwc2h1ZmQJeG1tMix4bW0wLDE5MgorCXBzaHVmZAl4bW0zLHhtbTAsMTI4CisJY21wCWVheCw2CisJamIJTkVBUiBMJDAzOGN0cjMyX3RhaWwKKwlweG9yCXhtbTcseG1tNgorCXNobAllY3gsNAorCW1vdgllYngsMTYKKwltb3ZkcWEJWzMyK2VzcF0seG1tNworCW1vdgllYnAsZWR4CisJc3ViCWVieCxlY3gKKwlsZWEJZWR4LFszMitlY3gqMStlZHhdCisJc3ViCWVheCw2CisJam1wCU5FQVIgTCQwMzljdHIzMl9sb29wNgorYWxpZ24JMTYKK0wkMDM5Y3RyMzJfbG9vcDY6CisJcHNodWZkCXhtbTQseG1tMCw2NAorCW1vdmRxYQl4bW0wLFszMitlc3BdCisJcHNodWZkCXhtbTUseG1tMSwxOTIKKwlweG9yCXhtbTIseG1tMAorCXBzaHVmZAl4bW02LHhtbTEsMTI4CisJcHhvcgl4bW0zLHhtbTAKKwlwc2h1ZmQJeG1tNyx4bW0xLDY0CisJbW92dXBzCXhtbTEsWzE2K2VicF0KKwlweG9yCXhtbTQseG1tMAorCXB4b3IJeG1tNSx4bW0wCitkYgkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJeG1tNix4bW0wCisJcHhvcgl4bW03LHhtbTAKK2RiCTEwMiwxNSw1NiwyMjAsMjE3CisJbW92dXBzCXhtbTAsWzMyK2VicF0KKwltb3YJZWN4LGVieAorZGIJMTAyLDE1LDU2LDIyMCwyMjUKK2RiCTEwMiwxNSw1NiwyMjAsMjMzCitkYgkxMDIsMTUsNTYsMjIwLDI0MQorZGIJMTAyLDE1LDU2LDIyMCwyNDkKKwljYWxsCUwkX2Flc25pX2VuY3J5cHQ2X2VudGVyCisJbW92dXBzCXhtbTEsW2VzaV0KKwltb3Z1cHMJeG1tMCxbMTYrZXNpXQorCXhvcnBzCXhtbTIseG1tMQorCW1vdnVwcwl4bW0xLFszMitlc2ldCisJeG9ycHMJeG1tMyx4bW0wCisJbW92dXBzCVtlZGldLHhtbTIKKwltb3ZkcWEJeG1tMCxbMTYrZXNwXQorCXhvcnBzCXhtbTQseG1tMQorCW1vdmRxYQl4bW0xLFs2NCtlc3BdCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCXBhZGRkCXhtbTEseG1tMAorCXBhZGRkCXhtbTAsWzQ4K2VzcF0KKwltb3ZkcWEJeG1tMixbZXNwXQorCW1vdnVwcwl4bW0zLFs0OCtlc2ldCisJbW92dXBzCXhtbTQsWzY0K2VzaV0KKwl4b3Jwcwl4bW01LHhtbTMKKwltb3Z1cHMJeG1tMyxbODArZXNpXQorCWxlYQllc2ksWzk2K2VzaV0KKwltb3ZkcWEJWzQ4K2VzcF0seG1tMAorZGIJMTAyLDE1LDU2LDAsMTk0CisJeG9ycHMJeG1tNix4bW00CisJbW92dXBzCVs0OCtlZGldLHhtbTUKKwl4b3Jwcwl4bW03LHhtbTMKKwltb3ZkcWEJWzY0K2VzcF0seG1tMQorZGIJMTAyLDE1LDU2LDAsMjAyCisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwlwc2h1ZmQJeG1tMix4bW0wLDE5MgorCW1vdnVwcwlbODArZWRpXSx4bW03CisJbGVhCWVkaSxbOTYrZWRpXQorCXBzaHVmZAl4bW0zLHhtbTAsMTI4CisJc3ViCWVheCw2CisJam5jCU5FQVIgTCQwMzljdHIzMl9sb29wNgorCWFkZAllYXgsNgorCWp6CU5FQVIgTCQwNDBjdHIzMl9yZXQKKwltb3ZkcXUJeG1tNyxbZWJwXQorCW1vdgllZHgsZWJwCisJcHhvcgl4bW03LFszMitlc3BdCisJbW92CWVjeCxEV09SRCBbMjQwK2VicF0KK0wkMDM4Y3RyMzJfdGFpbDoKKwlwb3IJeG1tMix4bW03CisJY21wCWVheCwyCisJamIJTkVBUiBMJDA0MWN0cjMyX29uZQorCXBzaHVmZAl4bW00LHhtbTAsNjQKKwlwb3IJeG1tMyx4bW03CisJamUJTkVBUiBMJDA0MmN0cjMyX3R3bworCXBzaHVmZAl4bW01LHhtbTEsMTkyCisJcG9yCXhtbTQseG1tNworCWNtcAllYXgsNAorCWpiCU5FQVIgTCQwNDNjdHIzMl90aHJlZQorCXBzaHVmZAl4bW02LHhtbTEsMTI4CisJcG9yCXhtbTUseG1tNworCWplCU5FQVIgTCQwNDRjdHIzMl9mb3VyCisJcG9yCXhtbTYseG1tNworCWNhbGwJX19hZXNuaV9lbmNyeXB0NgorCW1vdnVwcwl4bW0xLFtlc2ldCisJbW92dXBzCXhtbTAsWzE2K2VzaV0KKwl4b3Jwcwl4bW0yLHhtbTEKKwltb3Z1cHMJeG1tMSxbMzIrZXNpXQorCXhvcnBzCXhtbTMseG1tMAorCW1vdnVwcwl4bW0wLFs0OCtlc2ldCisJeG9ycHMJeG1tNCx4bW0xCisJbW92dXBzCXhtbTEsWzY0K2VzaV0KKwl4b3Jwcwl4bW01LHhtbTAKKwltb3Z1cHMJW2VkaV0seG1tMgorCXhvcnBzCXhtbTYseG1tMQorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorCW1vdnVwcwlbNjQrZWRpXSx4bW02CisJam1wCU5FQVIgTCQwNDBjdHIzMl9yZXQKK2FsaWduCTE2CitMJDAzN2N0cjMyX29uZV9zaG9ydGN1dDoKKwltb3Z1cHMJeG1tMixbZWJ4XQorCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCitMJDA0MWN0cjMyX29uZToKKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJbGVhCWVkeCxbMzIrZWR4XQorCXhvcnBzCXhtbTIseG1tMAorTCQwNDVlbmMxX2xvb3BfNzoKK2RiCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjCWVjeAorCW1vdnVwcwl4bW0xLFtlZHhdCisJbGVhCWVkeCxbMTYrZWR4XQorCWpueglORUFSIEwkMDQ1ZW5jMV9sb29wXzcKK2RiCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92dXBzCXhtbTYsW2VzaV0KKwl4b3Jwcwl4bW02LHhtbTIKKwltb3Z1cHMJW2VkaV0seG1tNgorCWptcAlORUFSIEwkMDQwY3RyMzJfcmV0CithbGlnbgkxNgorTCQwNDJjdHIzMl90d286CisJY2FsbAlfX2Flc25pX2VuY3J5cHQyCisJbW92dXBzCXhtbTUsW2VzaV0KKwltb3Z1cHMJeG1tNixbMTYrZXNpXQorCXhvcnBzCXhtbTIseG1tNQorCXhvcnBzCXhtbTMseG1tNgorCW1vdnVwcwlbZWRpXSx4bW0yCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwlqbXAJTkVBUiBMJDA0MGN0cjMyX3JldAorYWxpZ24JMTYKK0wkMDQzY3RyMzJfdGhyZWU6CisJY2FsbAlfX2Flc25pX2VuY3J5cHQzCisJbW92dXBzCXhtbTUsW2VzaV0KKwltb3Z1cHMJeG1tNixbMTYrZXNpXQorCXhvcnBzCXhtbTIseG1tNQorCW1vdnVwcwl4bW03LFszMitlc2ldCisJeG9ycHMJeG1tMyx4bW02CisJbW92dXBzCVtlZGldLHhtbTIKKwl4b3Jwcwl4bW00LHhtbTcKKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCW1vdnVwcwlbMzIrZWRpXSx4bW00CisJam1wCU5FQVIgTCQwNDBjdHIzMl9yZXQKK2FsaWduCTE2CitMJDA0NGN0cjMyX2ZvdXI6CisJY2FsbAlfX2Flc25pX2VuY3J5cHQ0CisJbW92dXBzCXhtbTYsW2VzaV0KKwltb3Z1cHMJeG1tNyxbMTYrZXNpXQorCW1vdnVwcwl4bW0xLFszMitlc2ldCisJeG9ycHMJeG1tMix4bW02CisJbW92dXBzCXhtbTAsWzQ4K2VzaV0KKwl4b3Jwcwl4bW0zLHhtbTcKKwltb3Z1cHMJW2VkaV0seG1tMgorCXhvcnBzCXhtbTQseG1tMQorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJeG9ycHMJeG1tNSx4bW0wCisJbW92dXBzCVszMitlZGldLHhtbTQKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorTCQwNDBjdHIzMl9yZXQ6CisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXB4b3IJeG1tMix4bW0yCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTQseG1tNAorCW1vdmRxYQlbMzIrZXNwXSx4bW0wCisJcHhvcgl4bW01LHhtbTUKKwltb3ZkcWEJWzQ4K2VzcF0seG1tMAorCXB4b3IJeG1tNix4bW02CisJbW92ZHFhCVs2NCtlc3BdLHhtbTAKKwlweG9yCXhtbTcseG1tNworCW1vdgllc3AsRFdPUkQgWzgwK2VzcF0KKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CitnbG9iYWwJX2Flc25pX3h0c19lbmNyeXB0CithbGlnbgkxNgorX2Flc25pX3h0c19lbmNyeXB0OgorTCRfYWVzbmlfeHRzX2VuY3J5cHRfYmVnaW46CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKKwltb3YJZWR4LERXT1JEIFszNitlc3BdCisJbW92CWVzaSxEV09SRCBbNDArZXNwXQorCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCisJbW92dXBzCXhtbTIsW2VzaV0KKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJbGVhCWVkeCxbMzIrZWR4XQorCXhvcnBzCXhtbTIseG1tMAorTCQwNDZlbmMxX2xvb3BfODoKK2RiCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjCWVjeAorCW1vdnVwcwl4bW0xLFtlZHhdCisJbGVhCWVkeCxbMTYrZWR4XQorCWpueglORUFSIEwkMDQ2ZW5jMV9sb29wXzgKK2RiCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwltb3YJZWF4LERXT1JEIFsyOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMzIrZXNwXQorCW1vdgllYnAsZXNwCisJc3ViCWVzcCwxMjAKKwltb3YJZWN4LERXT1JEIFsyNDArZWR4XQorCWFuZAllc3AsLTE2CisJbW92CURXT1JEIFs5Nitlc3BdLDEzNQorCW1vdglEV09SRCBbMTAwK2VzcF0sMAorCW1vdglEV09SRCBbMTA0K2VzcF0sMQorCW1vdglEV09SRCBbMTA4K2VzcF0sMAorCW1vdglEV09SRCBbMTEyK2VzcF0sZWF4CisJbW92CURXT1JEIFsxMTYrZXNwXSxlYnAKKwltb3ZkcWEJeG1tMSx4bW0yCisJcHhvcgl4bW0wLHhtbTAKKwltb3ZkcWEJeG1tMyxbOTYrZXNwXQorCXBjbXBndGQJeG1tMCx4bW0xCisJYW5kCWVheCwtMTYKKwltb3YJZWJwLGVkeAorCW1vdgllYngsZWN4CisJc3ViCWVheCw5NgorCWpjCU5FQVIgTCQwNDd4dHNfZW5jX3Nob3J0CisJc2hsCWVjeCw0CisJbW92CWVieCwxNgorCXN1YgllYngsZWN4CisJbGVhCWVkeCxbMzIrZWN4KjErZWR4XQorCWptcAlORUFSIEwkMDQ4eHRzX2VuY19sb29wNgorYWxpZ24JMTYKK0wkMDQ4eHRzX2VuY19sb29wNjoKKwlwc2h1ZmQJeG1tMix4bW0wLDE5CisJcHhvcgl4bW0wLHhtbTAKKwltb3ZkcWEJW2VzcF0seG1tMQorCXBhZGRxCXhtbTEseG1tMQorCXBhbmQJeG1tMix4bW0zCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlweG9yCXhtbTEseG1tMgorCXBzaHVmZAl4bW0yLHhtbTAsMTkKKwlweG9yCXhtbTAseG1tMAorCW1vdmRxYQlbMTYrZXNwXSx4bW0xCisJcGFkZHEJeG1tMSx4bW0xCisJcGFuZAl4bW0yLHhtbTMKKwlwY21wZ3RkCXhtbTAseG1tMQorCXB4b3IJeG1tMSx4bW0yCisJcHNodWZkCXhtbTIseG1tMCwxOQorCXB4b3IJeG1tMCx4bW0wCisJbW92ZHFhCVszMitlc3BdLHhtbTEKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTIseG1tMworCXBjbXBndGQJeG1tMCx4bW0xCisJcHhvcgl4bW0xLHhtbTIKKwlwc2h1ZmQJeG1tMix4bW0wLDE5CisJcHhvcgl4bW0wLHhtbTAKKwltb3ZkcWEJWzQ4K2VzcF0seG1tMQorCXBhZGRxCXhtbTEseG1tMQorCXBhbmQJeG1tMix4bW0zCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlweG9yCXhtbTEseG1tMgorCXBzaHVmZAl4bW03LHhtbTAsMTkKKwltb3ZkcWEJWzY0K2VzcF0seG1tMQorCXBhZGRxCXhtbTEseG1tMQorCW1vdnVwcwl4bW0wLFtlYnBdCisJcGFuZAl4bW03LHhtbTMKKwltb3Z1cHMJeG1tMixbZXNpXQorCXB4b3IJeG1tNyx4bW0xCisJbW92CWVjeCxlYngKKwltb3ZkcXUJeG1tMyxbMTYrZXNpXQorCXhvcnBzCXhtbTIseG1tMAorCW1vdmRxdQl4bW00LFszMitlc2ldCisJcHhvcgl4bW0zLHhtbTAKKwltb3ZkcXUJeG1tNSxbNDgrZXNpXQorCXB4b3IJeG1tNCx4bW0wCisJbW92ZHF1CXhtbTYsWzY0K2VzaV0KKwlweG9yCXhtbTUseG1tMAorCW1vdmRxdQl4bW0xLFs4MCtlc2ldCisJcHhvcgl4bW02LHhtbTAKKwlsZWEJZXNpLFs5Nitlc2ldCisJcHhvcgl4bW0yLFtlc3BdCisJbW92ZHFhCVs4MCtlc3BdLHhtbTcKKwlweG9yCXhtbTcseG1tMQorCW1vdnVwcwl4bW0xLFsxNitlYnBdCisJcHhvcgl4bW0zLFsxNitlc3BdCisJcHhvcgl4bW00LFszMitlc3BdCitkYgkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJeG1tNSxbNDgrZXNwXQorCXB4b3IJeG1tNixbNjQrZXNwXQorZGIJMTAyLDE1LDU2LDIyMCwyMTcKKwlweG9yCXhtbTcseG1tMAorCW1vdnVwcwl4bW0wLFszMitlYnBdCitkYgkxMDIsMTUsNTYsMjIwLDIyNQorZGIJMTAyLDE1LDU2LDIyMCwyMzMKK2RiCTEwMiwxNSw1NiwyMjAsMjQxCitkYgkxMDIsMTUsNTYsMjIwLDI0OQorCWNhbGwJTCRfYWVzbmlfZW5jcnlwdDZfZW50ZXIKKwltb3ZkcWEJeG1tMSxbODArZXNwXQorCXB4b3IJeG1tMCx4bW0wCisJeG9ycHMJeG1tMixbZXNwXQorCXBjbXBndGQJeG1tMCx4bW0xCisJeG9ycHMJeG1tMyxbMTYrZXNwXQorCW1vdnVwcwlbZWRpXSx4bW0yCisJeG9ycHMJeG1tNCxbMzIrZXNwXQorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJeG9ycHMJeG1tNSxbNDgrZXNwXQorCW1vdnVwcwlbMzIrZWRpXSx4bW00CisJeG9ycHMJeG1tNixbNjQrZXNwXQorCW1vdnVwcwlbNDgrZWRpXSx4bW01CisJeG9ycHMJeG1tNyx4bW0xCisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwlwc2h1ZmQJeG1tMix4bW0wLDE5CisJbW92dXBzCVs4MCtlZGldLHhtbTcKKwlsZWEJZWRpLFs5NitlZGldCisJbW92ZHFhCXhtbTMsWzk2K2VzcF0KKwlweG9yCXhtbTAseG1tMAorCXBhZGRxCXhtbTEseG1tMQorCXBhbmQJeG1tMix4bW0zCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlweG9yCXhtbTEseG1tMgorCXN1YgllYXgsOTYKKwlqbmMJTkVBUiBMJDA0OHh0c19lbmNfbG9vcDYKKwltb3YJZWN4LERXT1JEIFsyNDArZWJwXQorCW1vdgllZHgsZWJwCisJbW92CWVieCxlY3gKK0wkMDQ3eHRzX2VuY19zaG9ydDoKKwlhZGQJZWF4LDk2CisJanoJTkVBUiBMJDA0OXh0c19lbmNfZG9uZTZ4CisJbW92ZHFhCXhtbTUseG1tMQorCWNtcAllYXgsMzIKKwlqYglORUFSIEwkMDUweHRzX2VuY19vbmUKKwlwc2h1ZmQJeG1tMix4bW0wLDE5CisJcHhvcgl4bW0wLHhtbTAKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTIseG1tMworCXBjbXBndGQJeG1tMCx4bW0xCisJcHhvcgl4bW0xLHhtbTIKKwlqZQlORUFSIEwkMDUxeHRzX2VuY190d28KKwlwc2h1ZmQJeG1tMix4bW0wLDE5CisJcHhvcgl4bW0wLHhtbTAKKwltb3ZkcWEJeG1tNix4bW0xCisJcGFkZHEJeG1tMSx4bW0xCisJcGFuZAl4bW0yLHhtbTMKKwlwY21wZ3RkCXhtbTAseG1tMQorCXB4b3IJeG1tMSx4bW0yCisJY21wCWVheCw2NAorCWpiCU5FQVIgTCQwNTJ4dHNfZW5jX3RocmVlCisJcHNodWZkCXhtbTIseG1tMCwxOQorCXB4b3IJeG1tMCx4bW0wCisJbW92ZHFhCXhtbTcseG1tMQorCXBhZGRxCXhtbTEseG1tMQorCXBhbmQJeG1tMix4bW0zCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlweG9yCXhtbTEseG1tMgorCW1vdmRxYQlbZXNwXSx4bW01CisJbW92ZHFhCVsxNitlc3BdLHhtbTYKKwlqZQlORUFSIEwkMDUzeHRzX2VuY19mb3VyCisJbW92ZHFhCVszMitlc3BdLHhtbTcKKwlwc2h1ZmQJeG1tNyx4bW0wLDE5CisJbW92ZHFhCVs0OCtlc3BdLHhtbTEKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTcseG1tMworCXB4b3IJeG1tNyx4bW0xCisJbW92ZHF1CXhtbTIsW2VzaV0KKwltb3ZkcXUJeG1tMyxbMTYrZXNpXQorCW1vdmRxdQl4bW00LFszMitlc2ldCisJcHhvcgl4bW0yLFtlc3BdCisJbW92ZHF1CXhtbTUsWzQ4K2VzaV0KKwlweG9yCXhtbTMsWzE2K2VzcF0KKwltb3ZkcXUJeG1tNixbNjQrZXNpXQorCXB4b3IJeG1tNCxbMzIrZXNwXQorCWxlYQllc2ksWzgwK2VzaV0KKwlweG9yCXhtbTUsWzQ4K2VzcF0KKwltb3ZkcWEJWzY0K2VzcF0seG1tNworCXB4b3IJeG1tNix4bW03CisJY2FsbAlfX2Flc25pX2VuY3J5cHQ2CisJbW92YXBzCXhtbTEsWzY0K2VzcF0KKwl4b3Jwcwl4bW0yLFtlc3BdCisJeG9ycHMJeG1tMyxbMTYrZXNwXQorCXhvcnBzCXhtbTQsWzMyK2VzcF0KKwltb3Z1cHMJW2VkaV0seG1tMgorCXhvcnBzCXhtbTUsWzQ4K2VzcF0KKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCXhvcnBzCXhtbTYseG1tMQorCW1vdnVwcwlbMzIrZWRpXSx4bW00CisJbW92dXBzCVs0OCtlZGldLHhtbTUKKwltb3Z1cHMJWzY0K2VkaV0seG1tNgorCWxlYQllZGksWzgwK2VkaV0KKwlqbXAJTkVBUiBMJDA1NHh0c19lbmNfZG9uZQorYWxpZ24JMTYKK0wkMDUweHRzX2VuY19vbmU6CisJbW92dXBzCXhtbTIsW2VzaV0KKwlsZWEJZXNpLFsxNitlc2ldCisJeG9ycHMJeG1tMix4bW01CisJbW92dXBzCXhtbTAsW2VkeF0KKwltb3Z1cHMJeG1tMSxbMTYrZWR4XQorCWxlYQllZHgsWzMyK2VkeF0KKwl4b3Jwcwl4bW0yLHhtbTAKK0wkMDU1ZW5jMV9sb29wXzk6CitkYgkxMDIsMTUsNTYsMjIwLDIwOQorCWRlYwllY3gKKwltb3Z1cHMJeG1tMSxbZWR4XQorCWxlYQllZHgsWzE2K2VkeF0KKwlqbnoJTkVBUiBMJDA1NWVuYzFfbG9vcF85CitkYgkxMDIsMTUsNTYsMjIxLDIwOQorCXhvcnBzCXhtbTIseG1tNQorCW1vdnVwcwlbZWRpXSx4bW0yCisJbGVhCWVkaSxbMTYrZWRpXQorCW1vdmRxYQl4bW0xLHhtbTUKKwlqbXAJTkVBUiBMJDA1NHh0c19lbmNfZG9uZQorYWxpZ24JMTYKK0wkMDUxeHRzX2VuY190d286CisJbW92YXBzCXhtbTYseG1tMQorCW1vdnVwcwl4bW0yLFtlc2ldCisJbW92dXBzCXhtbTMsWzE2K2VzaV0KKwlsZWEJZXNpLFszMitlc2ldCisJeG9ycHMJeG1tMix4bW01CisJeG9ycHMJeG1tMyx4bW02CisJY2FsbAlfX2Flc25pX2VuY3J5cHQyCisJeG9ycHMJeG1tMix4bW01CisJeG9ycHMJeG1tMyx4bW02CisJbW92dXBzCVtlZGldLHhtbTIKKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCWxlYQllZGksWzMyK2VkaV0KKwltb3ZkcWEJeG1tMSx4bW02CisJam1wCU5FQVIgTCQwNTR4dHNfZW5jX2RvbmUKK2FsaWduCTE2CitMJDA1Mnh0c19lbmNfdGhyZWU6CisJbW92YXBzCXhtbTcseG1tMQorCW1vdnVwcwl4bW0yLFtlc2ldCisJbW92dXBzCXhtbTMsWzE2K2VzaV0KKwltb3Z1cHMJeG1tNCxbMzIrZXNpXQorCWxlYQllc2ksWzQ4K2VzaV0KKwl4b3Jwcwl4bW0yLHhtbTUKKwl4b3Jwcwl4bW0zLHhtbTYKKwl4b3Jwcwl4bW00LHhtbTcKKwljYWxsCV9fYWVzbmlfZW5jcnlwdDMKKwl4b3Jwcwl4bW0yLHhtbTUKKwl4b3Jwcwl4bW0zLHhtbTYKKwl4b3Jwcwl4bW00LHhtbTcKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwlsZWEJZWRpLFs0OCtlZGldCisJbW92ZHFhCXhtbTEseG1tNworCWptcAlORUFSIEwkMDU0eHRzX2VuY19kb25lCithbGlnbgkxNgorTCQwNTN4dHNfZW5jX2ZvdXI6CisJbW92YXBzCXhtbTYseG1tMQorCW1vdnVwcwl4bW0yLFtlc2ldCisJbW92dXBzCXhtbTMsWzE2K2VzaV0KKwltb3Z1cHMJeG1tNCxbMzIrZXNpXQorCXhvcnBzCXhtbTIsW2VzcF0KKwltb3Z1cHMJeG1tNSxbNDgrZXNpXQorCWxlYQllc2ksWzY0K2VzaV0KKwl4b3Jwcwl4bW0zLFsxNitlc3BdCisJeG9ycHMJeG1tNCx4bW03CisJeG9ycHMJeG1tNSx4bW02CisJY2FsbAlfX2Flc25pX2VuY3J5cHQ0CisJeG9ycHMJeG1tMixbZXNwXQorCXhvcnBzCXhtbTMsWzE2K2VzcF0KKwl4b3Jwcwl4bW00LHhtbTcKKwltb3Z1cHMJW2VkaV0seG1tMgorCXhvcnBzCXhtbTUseG1tNgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorCWxlYQllZGksWzY0K2VkaV0KKwltb3ZkcWEJeG1tMSx4bW02CisJam1wCU5FQVIgTCQwNTR4dHNfZW5jX2RvbmUKK2FsaWduCTE2CitMJDA0OXh0c19lbmNfZG9uZTZ4OgorCW1vdgllYXgsRFdPUkQgWzExMitlc3BdCisJYW5kCWVheCwxNQorCWp6CU5FQVIgTCQwNTZ4dHNfZW5jX3JldAorCW1vdmRxYQl4bW01LHhtbTEKKwltb3YJRFdPUkQgWzExMitlc3BdLGVheAorCWptcAlORUFSIEwkMDU3eHRzX2VuY19zdGVhbAorYWxpZ24JMTYKK0wkMDU0eHRzX2VuY19kb25lOgorCW1vdgllYXgsRFdPUkQgWzExMitlc3BdCisJcHhvcgl4bW0wLHhtbTAKKwlhbmQJZWF4LDE1CisJanoJTkVBUiBMJDA1Nnh0c19lbmNfcmV0CisJcGNtcGd0ZAl4bW0wLHhtbTEKKwltb3YJRFdPUkQgWzExMitlc3BdLGVheAorCXBzaHVmZAl4bW01LHhtbTAsMTkKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTUsWzk2K2VzcF0KKwlweG9yCXhtbTUseG1tMQorTCQwNTd4dHNfZW5jX3N0ZWFsOgorCW1vdnp4CWVjeCxCWVRFIFtlc2ldCisJbW92engJZWR4LEJZVEUgW2VkaS0xNl0KKwlsZWEJZXNpLFsxK2VzaV0KKwltb3YJQllURSBbZWRpLTE2XSxjbAorCW1vdglCWVRFIFtlZGldLGRsCisJbGVhCWVkaSxbMStlZGldCisJc3ViCWVheCwxCisJam56CU5FQVIgTCQwNTd4dHNfZW5jX3N0ZWFsCisJc3ViCWVkaSxEV09SRCBbMTEyK2VzcF0KKwltb3YJZWR4LGVicAorCW1vdgllY3gsZWJ4CisJbW92dXBzCXhtbTIsW2VkaS0xNl0KKwl4b3Jwcwl4bW0yLHhtbTUKKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJbGVhCWVkeCxbMzIrZWR4XQorCXhvcnBzCXhtbTIseG1tMAorTCQwNThlbmMxX2xvb3BfMTA6CitkYgkxMDIsMTUsNTYsMjIwLDIwOQorCWRlYwllY3gKKwltb3Z1cHMJeG1tMSxbZWR4XQorCWxlYQllZHgsWzE2K2VkeF0KKwlqbnoJTkVBUiBMJDA1OGVuYzFfbG9vcF8xMAorZGIJMTAyLDE1LDU2LDIyMSwyMDkKKwl4b3Jwcwl4bW0yLHhtbTUKKwltb3Z1cHMJW2VkaS0xNl0seG1tMgorTCQwNTZ4dHNfZW5jX3JldDoKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJcHhvcgl4bW0yLHhtbTIKKwltb3ZkcWEJW2VzcF0seG1tMAorCXB4b3IJeG1tMyx4bW0zCisJbW92ZHFhCVsxNitlc3BdLHhtbTAKKwlweG9yCXhtbTQseG1tNAorCW1vdmRxYQlbMzIrZXNwXSx4bW0wCisJcHhvcgl4bW01LHhtbTUKKwltb3ZkcWEJWzQ4K2VzcF0seG1tMAorCXB4b3IJeG1tNix4bW02CisJbW92ZHFhCVs2NCtlc3BdLHhtbTAKKwlweG9yCXhtbTcseG1tNworCW1vdmRxYQlbODArZXNwXSx4bW0wCisJbW92CWVzcCxEV09SRCBbMTE2K2VzcF0KKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CitnbG9iYWwJX2Flc25pX3h0c19kZWNyeXB0CithbGlnbgkxNgorX2Flc25pX3h0c19kZWNyeXB0OgorTCRfYWVzbmlfeHRzX2RlY3J5cHRfYmVnaW46CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKKwltb3YJZWR4LERXT1JEIFszNitlc3BdCisJbW92CWVzaSxEV09SRCBbNDArZXNwXQorCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCisJbW92dXBzCXhtbTIsW2VzaV0KKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFsxNitlZHhdCisJbGVhCWVkeCxbMzIrZWR4XQorCXhvcnBzCXhtbTIseG1tMAorTCQwNTllbmMxX2xvb3BfMTE6CitkYgkxMDIsMTUsNTYsMjIwLDIwOQorCWRlYwllY3gKKwltb3Z1cHMJeG1tMSxbZWR4XQorCWxlYQllZHgsWzE2K2VkeF0KKwlqbnoJTkVBUiBMJDA1OWVuYzFfbG9vcF8xMQorZGIJMTAyLDE1LDU2LDIyMSwyMDkKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCW1vdgllYXgsRFdPUkQgWzI4K2VzcF0KKwltb3YJZWR4LERXT1JEIFszMitlc3BdCisJbW92CWVicCxlc3AKKwlzdWIJZXNwLDEyMAorCWFuZAllc3AsLTE2CisJeG9yCWVieCxlYngKKwl0ZXN0CWVheCwxNQorCXNldG56CWJsCisJc2hsCWVieCw0CisJc3ViCWVheCxlYngKKwltb3YJRFdPUkQgWzk2K2VzcF0sMTM1CisJbW92CURXT1JEIFsxMDArZXNwXSwwCisJbW92CURXT1JEIFsxMDQrZXNwXSwxCisJbW92CURXT1JEIFsxMDgrZXNwXSwwCisJbW92CURXT1JEIFsxMTIrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzExNitlc3BdLGVicAorCW1vdgllY3gsRFdPUkQgWzI0MCtlZHhdCisJbW92CWVicCxlZHgKKwltb3YJZWJ4LGVjeAorCW1vdmRxYQl4bW0xLHhtbTIKKwlweG9yCXhtbTAseG1tMAorCW1vdmRxYQl4bW0zLFs5Nitlc3BdCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlhbmQJZWF4LC0xNgorCXN1YgllYXgsOTYKKwlqYwlORUFSIEwkMDYweHRzX2RlY19zaG9ydAorCXNobAllY3gsNAorCW1vdgllYngsMTYKKwlzdWIJZWJ4LGVjeAorCWxlYQllZHgsWzMyK2VjeCoxK2VkeF0KKwlqbXAJTkVBUiBMJDA2MXh0c19kZWNfbG9vcDYKK2FsaWduCTE2CitMJDA2MXh0c19kZWNfbG9vcDY6CisJcHNodWZkCXhtbTIseG1tMCwxOQorCXB4b3IJeG1tMCx4bW0wCisJbW92ZHFhCVtlc3BdLHhtbTEKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTIseG1tMworCXBjbXBndGQJeG1tMCx4bW0xCisJcHhvcgl4bW0xLHhtbTIKKwlwc2h1ZmQJeG1tMix4bW0wLDE5CisJcHhvcgl4bW0wLHhtbTAKKwltb3ZkcWEJWzE2K2VzcF0seG1tMQorCXBhZGRxCXhtbTEseG1tMQorCXBhbmQJeG1tMix4bW0zCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlweG9yCXhtbTEseG1tMgorCXBzaHVmZAl4bW0yLHhtbTAsMTkKKwlweG9yCXhtbTAseG1tMAorCW1vdmRxYQlbMzIrZXNwXSx4bW0xCisJcGFkZHEJeG1tMSx4bW0xCisJcGFuZAl4bW0yLHhtbTMKKwlwY21wZ3RkCXhtbTAseG1tMQorCXB4b3IJeG1tMSx4bW0yCisJcHNodWZkCXhtbTIseG1tMCwxOQorCXB4b3IJeG1tMCx4bW0wCisJbW92ZHFhCVs0OCtlc3BdLHhtbTEKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTIseG1tMworCXBjbXBndGQJeG1tMCx4bW0xCisJcHhvcgl4bW0xLHhtbTIKKwlwc2h1ZmQJeG1tNyx4bW0wLDE5CisJbW92ZHFhCVs2NCtlc3BdLHhtbTEKKwlwYWRkcQl4bW0xLHhtbTEKKwltb3Z1cHMJeG1tMCxbZWJwXQorCXBhbmQJeG1tNyx4bW0zCisJbW92dXBzCXhtbTIsW2VzaV0KKwlweG9yCXhtbTcseG1tMQorCW1vdgllY3gsZWJ4CisJbW92ZHF1CXhtbTMsWzE2K2VzaV0KKwl4b3Jwcwl4bW0yLHhtbTAKKwltb3ZkcXUJeG1tNCxbMzIrZXNpXQorCXB4b3IJeG1tMyx4bW0wCisJbW92ZHF1CXhtbTUsWzQ4K2VzaV0KKwlweG9yCXhtbTQseG1tMAorCW1vdmRxdQl4bW02LFs2NCtlc2ldCisJcHhvcgl4bW01LHhtbTAKKwltb3ZkcXUJeG1tMSxbODArZXNpXQorCXB4b3IJeG1tNix4bW0wCisJbGVhCWVzaSxbOTYrZXNpXQorCXB4b3IJeG1tMixbZXNwXQorCW1vdmRxYQlbODArZXNwXSx4bW03CisJcHhvcgl4bW03LHhtbTEKKwltb3Z1cHMJeG1tMSxbMTYrZWJwXQorCXB4b3IJeG1tMyxbMTYrZXNwXQorCXB4b3IJeG1tNCxbMzIrZXNwXQorZGIJMTAyLDE1LDU2LDIyMiwyMDkKKwlweG9yCXhtbTUsWzQ4K2VzcF0KKwlweG9yCXhtbTYsWzY0K2VzcF0KK2RiCTEwMiwxNSw1NiwyMjIsMjE3CisJcHhvcgl4bW03LHhtbTAKKwltb3Z1cHMJeG1tMCxbMzIrZWJwXQorZGIJMTAyLDE1LDU2LDIyMiwyMjUKK2RiCTEwMiwxNSw1NiwyMjIsMjMzCitkYgkxMDIsMTUsNTYsMjIyLDI0MQorZGIJMTAyLDE1LDU2LDIyMiwyNDkKKwljYWxsCUwkX2Flc25pX2RlY3J5cHQ2X2VudGVyCisJbW92ZHFhCXhtbTEsWzgwK2VzcF0KKwlweG9yCXhtbTAseG1tMAorCXhvcnBzCXhtbTIsW2VzcF0KKwlwY21wZ3RkCXhtbTAseG1tMQorCXhvcnBzCXhtbTMsWzE2K2VzcF0KKwltb3Z1cHMJW2VkaV0seG1tMgorCXhvcnBzCXhtbTQsWzMyK2VzcF0KKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCXhvcnBzCXhtbTUsWzQ4K2VzcF0KKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCXhvcnBzCXhtbTYsWzY0K2VzcF0KKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorCXhvcnBzCXhtbTcseG1tMQorCW1vdnVwcwlbNjQrZWRpXSx4bW02CisJcHNodWZkCXhtbTIseG1tMCwxOQorCW1vdnVwcwlbODArZWRpXSx4bW03CisJbGVhCWVkaSxbOTYrZWRpXQorCW1vdmRxYQl4bW0zLFs5Nitlc3BdCisJcHhvcgl4bW0wLHhtbTAKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTIseG1tMworCXBjbXBndGQJeG1tMCx4bW0xCisJcHhvcgl4bW0xLHhtbTIKKwlzdWIJZWF4LDk2CisJam5jCU5FQVIgTCQwNjF4dHNfZGVjX2xvb3A2CisJbW92CWVjeCxEV09SRCBbMjQwK2VicF0KKwltb3YJZWR4LGVicAorCW1vdgllYngsZWN4CitMJDA2MHh0c19kZWNfc2hvcnQ6CisJYWRkCWVheCw5NgorCWp6CU5FQVIgTCQwNjJ4dHNfZGVjX2RvbmU2eAorCW1vdmRxYQl4bW01LHhtbTEKKwljbXAJZWF4LDMyCisJamIJTkVBUiBMJDA2M3h0c19kZWNfb25lCisJcHNodWZkCXhtbTIseG1tMCwxOQorCXB4b3IJeG1tMCx4bW0wCisJcGFkZHEJeG1tMSx4bW0xCisJcGFuZAl4bW0yLHhtbTMKKwlwY21wZ3RkCXhtbTAseG1tMQorCXB4b3IJeG1tMSx4bW0yCisJamUJTkVBUiBMJDA2NHh0c19kZWNfdHdvCisJcHNodWZkCXhtbTIseG1tMCwxOQorCXB4b3IJeG1tMCx4bW0wCisJbW92ZHFhCXhtbTYseG1tMQorCXBhZGRxCXhtbTEseG1tMQorCXBhbmQJeG1tMix4bW0zCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlweG9yCXhtbTEseG1tMgorCWNtcAllYXgsNjQKKwlqYglORUFSIEwkMDY1eHRzX2RlY190aHJlZQorCXBzaHVmZAl4bW0yLHhtbTAsMTkKKwlweG9yCXhtbTAseG1tMAorCW1vdmRxYQl4bW03LHhtbTEKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTIseG1tMworCXBjbXBndGQJeG1tMCx4bW0xCisJcHhvcgl4bW0xLHhtbTIKKwltb3ZkcWEJW2VzcF0seG1tNQorCW1vdmRxYQlbMTYrZXNwXSx4bW02CisJamUJTkVBUiBMJDA2Nnh0c19kZWNfZm91cgorCW1vdmRxYQlbMzIrZXNwXSx4bW03CisJcHNodWZkCXhtbTcseG1tMCwxOQorCW1vdmRxYQlbNDgrZXNwXSx4bW0xCisJcGFkZHEJeG1tMSx4bW0xCisJcGFuZAl4bW03LHhtbTMKKwlweG9yCXhtbTcseG1tMQorCW1vdmRxdQl4bW0yLFtlc2ldCisJbW92ZHF1CXhtbTMsWzE2K2VzaV0KKwltb3ZkcXUJeG1tNCxbMzIrZXNpXQorCXB4b3IJeG1tMixbZXNwXQorCW1vdmRxdQl4bW01LFs0OCtlc2ldCisJcHhvcgl4bW0zLFsxNitlc3BdCisJbW92ZHF1CXhtbTYsWzY0K2VzaV0KKwlweG9yCXhtbTQsWzMyK2VzcF0KKwlsZWEJZXNpLFs4MCtlc2ldCisJcHhvcgl4bW01LFs0OCtlc3BdCisJbW92ZHFhCVs2NCtlc3BdLHhtbTcKKwlweG9yCXhtbTYseG1tNworCWNhbGwJX19hZXNuaV9kZWNyeXB0NgorCW1vdmFwcwl4bW0xLFs2NCtlc3BdCisJeG9ycHMJeG1tMixbZXNwXQorCXhvcnBzCXhtbTMsWzE2K2VzcF0KKwl4b3Jwcwl4bW00LFszMitlc3BdCisJbW92dXBzCVtlZGldLHhtbTIKKwl4b3Jwcwl4bW01LFs0OCtlc3BdCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwl4b3Jwcwl4bW02LHhtbTEKKwltb3Z1cHMJWzMyK2VkaV0seG1tNAorCW1vdnVwcwlbNDgrZWRpXSx4bW01CisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwlsZWEJZWRpLFs4MCtlZGldCisJam1wCU5FQVIgTCQwNjd4dHNfZGVjX2RvbmUKK2FsaWduCTE2CitMJDA2M3h0c19kZWNfb25lOgorCW1vdnVwcwl4bW0yLFtlc2ldCisJbGVhCWVzaSxbMTYrZXNpXQorCXhvcnBzCXhtbTIseG1tNQorCW1vdnVwcwl4bW0wLFtlZHhdCisJbW92dXBzCXhtbTEsWzE2K2VkeF0KKwlsZWEJZWR4LFszMitlZHhdCisJeG9ycHMJeG1tMix4bW0wCitMJDA2OGRlYzFfbG9vcF8xMjoKK2RiCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjCWVjeAorCW1vdnVwcwl4bW0xLFtlZHhdCisJbGVhCWVkeCxbMTYrZWR4XQorCWpueglORUFSIEwkMDY4ZGVjMV9sb29wXzEyCitkYgkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCXhtbTIseG1tNQorCW1vdnVwcwlbZWRpXSx4bW0yCisJbGVhCWVkaSxbMTYrZWRpXQorCW1vdmRxYQl4bW0xLHhtbTUKKwlqbXAJTkVBUiBMJDA2N3h0c19kZWNfZG9uZQorYWxpZ24JMTYKK0wkMDY0eHRzX2RlY190d286CisJbW92YXBzCXhtbTYseG1tMQorCW1vdnVwcwl4bW0yLFtlc2ldCisJbW92dXBzCXhtbTMsWzE2K2VzaV0KKwlsZWEJZXNpLFszMitlc2ldCisJeG9ycHMJeG1tMix4bW01CisJeG9ycHMJeG1tMyx4bW02CisJY2FsbAlfX2Flc25pX2RlY3J5cHQyCisJeG9ycHMJeG1tMix4bW01CisJeG9ycHMJeG1tMyx4bW02CisJbW92dXBzCVtlZGldLHhtbTIKKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCWxlYQllZGksWzMyK2VkaV0KKwltb3ZkcWEJeG1tMSx4bW02CisJam1wCU5FQVIgTCQwNjd4dHNfZGVjX2RvbmUKK2FsaWduCTE2CitMJDA2NXh0c19kZWNfdGhyZWU6CisJbW92YXBzCXhtbTcseG1tMQorCW1vdnVwcwl4bW0yLFtlc2ldCisJbW92dXBzCXhtbTMsWzE2K2VzaV0KKwltb3Z1cHMJeG1tNCxbMzIrZXNpXQorCWxlYQllc2ksWzQ4K2VzaV0KKwl4b3Jwcwl4bW0yLHhtbTUKKwl4b3Jwcwl4bW0zLHhtbTYKKwl4b3Jwcwl4bW00LHhtbTcKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDMKKwl4b3Jwcwl4bW0yLHhtbTUKKwl4b3Jwcwl4bW0zLHhtbTYKKwl4b3Jwcwl4bW00LHhtbTcKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwlsZWEJZWRpLFs0OCtlZGldCisJbW92ZHFhCXhtbTEseG1tNworCWptcAlORUFSIEwkMDY3eHRzX2RlY19kb25lCithbGlnbgkxNgorTCQwNjZ4dHNfZGVjX2ZvdXI6CisJbW92YXBzCXhtbTYseG1tMQorCW1vdnVwcwl4bW0yLFtlc2ldCisJbW92dXBzCXhtbTMsWzE2K2VzaV0KKwltb3Z1cHMJeG1tNCxbMzIrZXNpXQorCXhvcnBzCXhtbTIsW2VzcF0KKwltb3Z1cHMJeG1tNSxbNDgrZXNpXQorCWxlYQllc2ksWzY0K2VzaV0KKwl4b3Jwcwl4bW0zLFsxNitlc3BdCisJeG9ycHMJeG1tNCx4bW03CisJeG9ycHMJeG1tNSx4bW02CisJY2FsbAlfX2Flc25pX2RlY3J5cHQ0CisJeG9ycHMJeG1tMixbZXNwXQorCXhvcnBzCXhtbTMsWzE2K2VzcF0KKwl4b3Jwcwl4bW00LHhtbTcKKwltb3Z1cHMJW2VkaV0seG1tMgorCXhvcnBzCXhtbTUseG1tNgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbW92dXBzCVszMitlZGldLHhtbTQKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorCWxlYQllZGksWzY0K2VkaV0KKwltb3ZkcWEJeG1tMSx4bW02CisJam1wCU5FQVIgTCQwNjd4dHNfZGVjX2RvbmUKK2FsaWduCTE2CitMJDA2Mnh0c19kZWNfZG9uZTZ4OgorCW1vdgllYXgsRFdPUkQgWzExMitlc3BdCisJYW5kCWVheCwxNQorCWp6CU5FQVIgTCQwNjl4dHNfZGVjX3JldAorCW1vdglEV09SRCBbMTEyK2VzcF0sZWF4CisJam1wCU5FQVIgTCQwNzB4dHNfZGVjX29ubHlfb25lX21vcmUKK2FsaWduCTE2CitMJDA2N3h0c19kZWNfZG9uZToKKwltb3YJZWF4LERXT1JEIFsxMTIrZXNwXQorCXB4b3IJeG1tMCx4bW0wCisJYW5kCWVheCwxNQorCWp6CU5FQVIgTCQwNjl4dHNfZGVjX3JldAorCXBjbXBndGQJeG1tMCx4bW0xCisJbW92CURXT1JEIFsxMTIrZXNwXSxlYXgKKwlwc2h1ZmQJeG1tMix4bW0wLDE5CisJcHhvcgl4bW0wLHhtbTAKKwltb3ZkcWEJeG1tMyxbOTYrZXNwXQorCXBhZGRxCXhtbTEseG1tMQorCXBhbmQJeG1tMix4bW0zCisJcGNtcGd0ZAl4bW0wLHhtbTEKKwlweG9yCXhtbTEseG1tMgorTCQwNzB4dHNfZGVjX29ubHlfb25lX21vcmU6CisJcHNodWZkCXhtbTUseG1tMCwxOQorCW1vdmRxYQl4bW02LHhtbTEKKwlwYWRkcQl4bW0xLHhtbTEKKwlwYW5kCXhtbTUseG1tMworCXB4b3IJeG1tNSx4bW0xCisJbW92CWVkeCxlYnAKKwltb3YJZWN4LGVieAorCW1vdnVwcwl4bW0yLFtlc2ldCisJeG9ycHMJeG1tMix4bW01CisJbW92dXBzCXhtbTAsW2VkeF0KKwltb3Z1cHMJeG1tMSxbMTYrZWR4XQorCWxlYQllZHgsWzMyK2VkeF0KKwl4b3Jwcwl4bW0yLHhtbTAKK0wkMDcxZGVjMV9sb29wXzEzOgorZGIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJZWN4CisJbW92dXBzCXhtbTEsW2VkeF0KKwlsZWEJZWR4LFsxNitlZHhdCisJam56CU5FQVIgTCQwNzFkZWMxX2xvb3BfMTMKK2RiCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJeG1tMix4bW01CisJbW92dXBzCVtlZGldLHhtbTIKK0wkMDcyeHRzX2RlY19zdGVhbDoKKwltb3Z6eAllY3gsQllURSBbMTYrZXNpXQorCW1vdnp4CWVkeCxCWVRFIFtlZGldCisJbGVhCWVzaSxbMStlc2ldCisJbW92CUJZVEUgW2VkaV0sY2wKKwltb3YJQllURSBbMTYrZWRpXSxkbAorCWxlYQllZGksWzErZWRpXQorCXN1YgllYXgsMQorCWpueglORUFSIEwkMDcyeHRzX2RlY19zdGVhbAorCXN1YgllZGksRFdPUkQgWzExMitlc3BdCisJbW92CWVkeCxlYnAKKwltb3YJZWN4LGVieAorCW1vdnVwcwl4bW0yLFtlZGldCisJeG9ycHMJeG1tMix4bW02CisJbW92dXBzCXhtbTAsW2VkeF0KKwltb3Z1cHMJeG1tMSxbMTYrZWR4XQorCWxlYQllZHgsWzMyK2VkeF0KKwl4b3Jwcwl4bW0yLHhtbTAKK0wkMDczZGVjMV9sb29wXzE0OgorZGIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJZWN4CisJbW92dXBzCXhtbTEsW2VkeF0KKwlsZWEJZWR4LFsxNitlZHhdCisJam56CU5FQVIgTCQwNzNkZWMxX2xvb3BfMTQKK2RiCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJeG1tMix4bW02CisJbW92dXBzCVtlZGldLHhtbTIKK0wkMDY5eHRzX2RlY19yZXQ6CisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXB4b3IJeG1tMix4bW0yCisJbW92ZHFhCVtlc3BdLHhtbTAKKwlweG9yCXhtbTMseG1tMworCW1vdmRxYQlbMTYrZXNwXSx4bW0wCisJcHhvcgl4bW00LHhtbTQKKwltb3ZkcWEJWzMyK2VzcF0seG1tMAorCXB4b3IJeG1tNSx4bW01CisJbW92ZHFhCVs0OCtlc3BdLHhtbTAKKwlweG9yCXhtbTYseG1tNgorCW1vdmRxYQlbNjQrZXNwXSx4bW0wCisJcHhvcgl4bW03LHhtbTcKKwltb3ZkcWEJWzgwK2VzcF0seG1tMAorCW1vdgllc3AsRFdPUkQgWzExNitlc3BdCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9hZXNuaV9jYmNfZW5jcnlwdAorYWxpZ24JMTYKK19hZXNuaV9jYmNfZW5jcnlwdDoKK0wkX2Flc25pX2NiY19lbmNyeXB0X2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCW1vdgllYngsZXNwCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCXN1YgllYngsMjQKKwltb3YJZWF4LERXT1JEIFsyOCtlc3BdCisJYW5kCWVieCwtMTYKKwltb3YJZWR4LERXT1JEIFszMitlc3BdCisJbW92CWVicCxEV09SRCBbMzYrZXNwXQorCXRlc3QJZWF4LGVheAorCWp6CU5FQVIgTCQwNzRjYmNfYWJvcnQKKwljbXAJRFdPUkQgWzQwK2VzcF0sMAorCXhjaGcJZWJ4LGVzcAorCW1vdnVwcwl4bW03LFtlYnBdCisJbW92CWVjeCxEV09SRCBbMjQwK2VkeF0KKwltb3YJZWJwLGVkeAorCW1vdglEV09SRCBbMTYrZXNwXSxlYngKKwltb3YJZWJ4LGVjeAorCWplCU5FQVIgTCQwNzVjYmNfZGVjcnlwdAorCW1vdmFwcwl4bW0yLHhtbTcKKwljbXAJZWF4LDE2CisJamIJTkVBUiBMJDA3NmNiY19lbmNfdGFpbAorCXN1YgllYXgsMTYKKwlqbXAJTkVBUiBMJDA3N2NiY19lbmNfbG9vcAorYWxpZ24JMTYKK0wkMDc3Y2JjX2VuY19sb29wOgorCW1vdnVwcwl4bW03LFtlc2ldCisJbGVhCWVzaSxbMTYrZXNpXQorCW1vdnVwcwl4bW0wLFtlZHhdCisJbW92dXBzCXhtbTEsWzE2K2VkeF0KKwl4b3Jwcwl4bW03LHhtbTAKKwlsZWEJZWR4LFszMitlZHhdCisJeG9ycHMJeG1tMix4bW03CitMJDA3OGVuYzFfbG9vcF8xNToKK2RiCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjCWVjeAorCW1vdnVwcwl4bW0xLFtlZHhdCisJbGVhCWVkeCxbMTYrZWR4XQorCWpueglORUFSIEwkMDc4ZW5jMV9sb29wXzE1CitkYgkxMDIsMTUsNTYsMjIxLDIwOQorCW1vdgllY3gsZWJ4CisJbW92CWVkeCxlYnAKKwltb3Z1cHMJW2VkaV0seG1tMgorCWxlYQllZGksWzE2K2VkaV0KKwlzdWIJZWF4LDE2CisJam5jCU5FQVIgTCQwNzdjYmNfZW5jX2xvb3AKKwlhZGQJZWF4LDE2CisJam56CU5FQVIgTCQwNzZjYmNfZW5jX3RhaWwKKwltb3ZhcHMJeG1tNyx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwlqbXAJTkVBUiBMJDA3OWNiY19yZXQKK0wkMDc2Y2JjX2VuY190YWlsOgorCW1vdgllY3gsZWF4CitkZAkyNzY3NDUxNzg1CisJbW92CWVjeCwxNgorCXN1YgllY3gsZWF4CisJeG9yCWVheCxlYXgKK2RkCTI4NjgxMTUwODEKKwlsZWEJZWRpLFtlZGktMTZdCisJbW92CWVjeCxlYngKKwltb3YJZXNpLGVkaQorCW1vdgllZHgsZWJwCisJam1wCU5FQVIgTCQwNzdjYmNfZW5jX2xvb3AKK2FsaWduCTE2CitMJDA3NWNiY19kZWNyeXB0OgorCWNtcAllYXgsODAKKwlqYmUJTkVBUiBMJDA4MGNiY19kZWNfdGFpbAorCW1vdmFwcwlbZXNwXSx4bW03CisJc3ViCWVheCw4MAorCWptcAlORUFSIEwkMDgxY2JjX2RlY19sb29wNl9lbnRlcgorYWxpZ24JMTYKK0wkMDgyY2JjX2RlY19sb29wNjoKKwltb3ZhcHMJW2VzcF0seG1tMAorCW1vdnVwcwlbZWRpXSx4bW03CisJbGVhCWVkaSxbMTYrZWRpXQorTCQwODFjYmNfZGVjX2xvb3A2X2VudGVyOgorCW1vdmRxdQl4bW0yLFtlc2ldCisJbW92ZHF1CXhtbTMsWzE2K2VzaV0KKwltb3ZkcXUJeG1tNCxbMzIrZXNpXQorCW1vdmRxdQl4bW01LFs0OCtlc2ldCisJbW92ZHF1CXhtbTYsWzY0K2VzaV0KKwltb3ZkcXUJeG1tNyxbODArZXNpXQorCWNhbGwJX19hZXNuaV9kZWNyeXB0NgorCW1vdnVwcwl4bW0xLFtlc2ldCisJbW92dXBzCXhtbTAsWzE2K2VzaV0KKwl4b3Jwcwl4bW0yLFtlc3BdCisJeG9ycHMJeG1tMyx4bW0xCisJbW92dXBzCXhtbTEsWzMyK2VzaV0KKwl4b3Jwcwl4bW00LHhtbTAKKwltb3Z1cHMJeG1tMCxbNDgrZXNpXQorCXhvcnBzCXhtbTUseG1tMQorCW1vdnVwcwl4bW0xLFs2NCtlc2ldCisJeG9ycHMJeG1tNix4bW0wCisJbW92dXBzCXhtbTAsWzgwK2VzaV0KKwl4b3Jwcwl4bW03LHhtbTEKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJbGVhCWVzaSxbOTYrZXNpXQorCW1vdnVwcwlbMzIrZWRpXSx4bW00CisJbW92CWVjeCxlYngKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorCW1vdgllZHgsZWJwCisJbW92dXBzCVs2NCtlZGldLHhtbTYKKwlsZWEJZWRpLFs4MCtlZGldCisJc3ViCWVheCw5NgorCWphCU5FQVIgTCQwODJjYmNfZGVjX2xvb3A2CisJbW92YXBzCXhtbTIseG1tNworCW1vdmFwcwl4bW03LHhtbTAKKwlhZGQJZWF4LDgwCisJamxlCU5FQVIgTCQwODNjYmNfZGVjX2NsZWFyX3RhaWxfY29sbGVjdGVkCisJbW92dXBzCVtlZGldLHhtbTIKKwlsZWEJZWRpLFsxNitlZGldCitMJDA4MGNiY19kZWNfdGFpbDoKKwltb3Z1cHMJeG1tMixbZXNpXQorCW1vdmFwcwl4bW02LHhtbTIKKwljbXAJZWF4LDE2CisJamJlCU5FQVIgTCQwODRjYmNfZGVjX29uZQorCW1vdnVwcwl4bW0zLFsxNitlc2ldCisJbW92YXBzCXhtbTUseG1tMworCWNtcAllYXgsMzIKKwlqYmUJTkVBUiBMJDA4NWNiY19kZWNfdHdvCisJbW92dXBzCXhtbTQsWzMyK2VzaV0KKwljbXAJZWF4LDQ4CisJamJlCU5FQVIgTCQwODZjYmNfZGVjX3RocmVlCisJbW92dXBzCXhtbTUsWzQ4K2VzaV0KKwljbXAJZWF4LDY0CisJamJlCU5FQVIgTCQwODdjYmNfZGVjX2ZvdXIKKwltb3Z1cHMJeG1tNixbNjQrZXNpXQorCW1vdmFwcwlbZXNwXSx4bW03CisJbW92dXBzCXhtbTIsW2VzaV0KKwl4b3Jwcwl4bW03LHhtbTcKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDYKKwltb3Z1cHMJeG1tMSxbZXNpXQorCW1vdnVwcwl4bW0wLFsxNitlc2ldCisJeG9ycHMJeG1tMixbZXNwXQorCXhvcnBzCXhtbTMseG1tMQorCW1vdnVwcwl4bW0xLFszMitlc2ldCisJeG9ycHMJeG1tNCx4bW0wCisJbW92dXBzCXhtbTAsWzQ4K2VzaV0KKwl4b3Jwcwl4bW01LHhtbTEKKwltb3Z1cHMJeG1tNyxbNjQrZXNpXQorCXhvcnBzCXhtbTYseG1tMAorCW1vdnVwcwlbZWRpXSx4bW0yCisJbW92dXBzCVsxNitlZGldLHhtbTMKKwlweG9yCXhtbTMseG1tMworCW1vdnVwcwlbMzIrZWRpXSx4bW00CisJcHhvcgl4bW00LHhtbTQKKwltb3Z1cHMJWzQ4K2VkaV0seG1tNQorCXB4b3IJeG1tNSx4bW01CisJbGVhCWVkaSxbNjQrZWRpXQorCW1vdmFwcwl4bW0yLHhtbTYKKwlweG9yCXhtbTYseG1tNgorCXN1YgllYXgsODAKKwlqbXAJTkVBUiBMJDA4OGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKK2FsaWduCTE2CitMJDA4NGNiY19kZWNfb25lOgorCW1vdnVwcwl4bW0wLFtlZHhdCisJbW92dXBzCXhtbTEsWzE2K2VkeF0KKwlsZWEJZWR4LFszMitlZHhdCisJeG9ycHMJeG1tMix4bW0wCitMJDA4OWRlYzFfbG9vcF8xNjoKK2RiCTEwMiwxNSw1NiwyMjIsMjA5CisJZGVjCWVjeAorCW1vdnVwcwl4bW0xLFtlZHhdCisJbGVhCWVkeCxbMTYrZWR4XQorCWpueglORUFSIEwkMDg5ZGVjMV9sb29wXzE2CitkYgkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCXhtbTIseG1tNworCW1vdmFwcwl4bW03LHhtbTYKKwlzdWIJZWF4LDE2CisJam1wCU5FQVIgTCQwODhjYmNfZGVjX3RhaWxfY29sbGVjdGVkCithbGlnbgkxNgorTCQwODVjYmNfZGVjX3R3bzoKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDIKKwl4b3Jwcwl4bW0yLHhtbTcKKwl4b3Jwcwl4bW0zLHhtbTYKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdmFwcwl4bW0yLHhtbTMKKwlweG9yCXhtbTMseG1tMworCWxlYQllZGksWzE2K2VkaV0KKwltb3ZhcHMJeG1tNyx4bW01CisJc3ViCWVheCwzMgorCWptcAlORUFSIEwkMDg4Y2JjX2RlY190YWlsX2NvbGxlY3RlZAorYWxpZ24JMTYKK0wkMDg2Y2JjX2RlY190aHJlZToKKwljYWxsCV9fYWVzbmlfZGVjcnlwdDMKKwl4b3Jwcwl4bW0yLHhtbTcKKwl4b3Jwcwl4bW0zLHhtbTYKKwl4b3Jwcwl4bW00LHhtbTUKKwltb3Z1cHMJW2VkaV0seG1tMgorCW1vdmFwcwl4bW0yLHhtbTQKKwlweG9yCXhtbTQseG1tNAorCW1vdnVwcwlbMTYrZWRpXSx4bW0zCisJcHhvcgl4bW0zLHhtbTMKKwlsZWEJZWRpLFszMitlZGldCisJbW92dXBzCXhtbTcsWzMyK2VzaV0KKwlzdWIJZWF4LDQ4CisJam1wCU5FQVIgTCQwODhjYmNfZGVjX3RhaWxfY29sbGVjdGVkCithbGlnbgkxNgorTCQwODdjYmNfZGVjX2ZvdXI6CisJY2FsbAlfX2Flc25pX2RlY3J5cHQ0CisJbW92dXBzCXhtbTEsWzE2K2VzaV0KKwltb3Z1cHMJeG1tMCxbMzIrZXNpXQorCXhvcnBzCXhtbTIseG1tNworCW1vdnVwcwl4bW03LFs0OCtlc2ldCisJeG9ycHMJeG1tMyx4bW02CisJbW92dXBzCVtlZGldLHhtbTIKKwl4b3Jwcwl4bW00LHhtbTEKKwltb3Z1cHMJWzE2K2VkaV0seG1tMworCXB4b3IJeG1tMyx4bW0zCisJeG9ycHMJeG1tNSx4bW0wCisJbW92dXBzCVszMitlZGldLHhtbTQKKwlweG9yCXhtbTQseG1tNAorCWxlYQllZGksWzQ4K2VkaV0KKwltb3ZhcHMJeG1tMix4bW01CisJcHhvcgl4bW01LHhtbTUKKwlzdWIJZWF4LDY0CisJam1wCU5FQVIgTCQwODhjYmNfZGVjX3RhaWxfY29sbGVjdGVkCithbGlnbgkxNgorTCQwODNjYmNfZGVjX2NsZWFyX3RhaWxfY29sbGVjdGVkOgorCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorCXB4b3IJeG1tNix4bW02CitMJDA4OGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQ6CisJYW5kCWVheCwxNQorCWpueglORUFSIEwkMDkwY2JjX2RlY190YWlsX3BhcnRpYWwKKwltb3Z1cHMJW2VkaV0seG1tMgorCXB4b3IJeG1tMCx4bW0wCisJam1wCU5FQVIgTCQwNzljYmNfcmV0CithbGlnbgkxNgorTCQwOTBjYmNfZGVjX3RhaWxfcGFydGlhbDoKKwltb3ZhcHMJW2VzcF0seG1tMgorCXB4b3IJeG1tMCx4bW0wCisJbW92CWVjeCwxNgorCW1vdgllc2ksZXNwCisJc3ViCWVjeCxlYXgKK2RkCTI3Njc0NTE3ODUKKwltb3ZkcWEJW2VzcF0seG1tMgorTCQwNzljYmNfcmV0OgorCW1vdgllc3AsRFdPUkQgWzE2K2VzcF0KKwltb3YJZWJwLERXT1JEIFszNitlc3BdCisJcHhvcgl4bW0yLHhtbTIKKwlweG9yCXhtbTEseG1tMQorCW1vdnVwcwlbZWJwXSx4bW03CisJcHhvcgl4bW03LHhtbTcKK0wkMDc0Y2JjX2Fib3J0OgorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2FsaWduCTE2CitfX2Flc25pX3NldF9lbmNyeXB0X2tleToKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJdGVzdAllYXgsZWF4CisJanoJTkVBUiBMJDA5MWJhZF9wb2ludGVyCisJdGVzdAllZHgsZWR4CisJanoJTkVBUiBMJDA5MWJhZF9wb2ludGVyCisJY2FsbAlMJDA5MnBpYworTCQwOTJwaWM6CisJcG9wCWVieAorCWxlYQllYngsWyhMJGtleV9jb25zdC1MJDA5MnBpYykrZWJ4XQorCWxlYQllYnAsW19PUEVOU1NMX2lhMzJjYXBfUF0KKwltb3Z1cHMJeG1tMCxbZWF4XQorCXhvcnBzCXhtbTQseG1tNAorCW1vdgllYnAsRFdPUkQgWzQrZWJwXQorCWxlYQllZHgsWzE2K2VkeF0KKwlhbmQJZWJwLDI2ODQzNzUwNAorCWNtcAllY3gsMjU2CisJamUJTkVBUiBMJDA5MzE0cm91bmRzCisJY21wCWVjeCwxOTIKKwlqZQlORUFSIEwkMDk0MTJyb3VuZHMKKwljbXAJZWN4LDEyOAorCWpuZQlORUFSIEwkMDk1YmFkX2tleWJpdHMKK2FsaWduCTE2CitMJDA5NjEwcm91bmRzOgorCWNtcAllYnAsMjY4NDM1NDU2CisJamUJTkVBUiBMJDA5NzEwcm91bmRzX2FsdAorCW1vdgllY3gsOQorCW1vdnVwcwlbZWR4LTE2XSx4bW0wCitkYgkxMDIsMTUsNTgsMjIzLDIwMCwxCisJY2FsbAlMJDA5OGtleV8xMjhfY29sZAorZGIJMTAyLDE1LDU4LDIyMywyMDAsMgorCWNhbGwJTCQwOTlrZXlfMTI4CitkYgkxMDIsMTUsNTgsMjIzLDIwMCw0CisJY2FsbAlMJDA5OWtleV8xMjgKK2RiCTEwMiwxNSw1OCwyMjMsMjAwLDgKKwljYWxsCUwkMDk5a2V5XzEyOAorZGIJMTAyLDE1LDU4LDIyMywyMDAsMTYKKwljYWxsCUwkMDk5a2V5XzEyOAorZGIJMTAyLDE1LDU4LDIyMywyMDAsMzIKKwljYWxsCUwkMDk5a2V5XzEyOAorZGIJMTAyLDE1LDU4LDIyMywyMDAsNjQKKwljYWxsCUwkMDk5a2V5XzEyOAorZGIJMTAyLDE1LDU4LDIyMywyMDAsMTI4CisJY2FsbAlMJDA5OWtleV8xMjgKK2RiCTEwMiwxNSw1OCwyMjMsMjAwLDI3CisJY2FsbAlMJDA5OWtleV8xMjgKK2RiCTEwMiwxNSw1OCwyMjMsMjAwLDU0CisJY2FsbAlMJDA5OWtleV8xMjgKKwltb3Z1cHMJW2VkeF0seG1tMAorCW1vdglEV09SRCBbODArZWR4XSxlY3gKKwlqbXAJTkVBUiBMJDEwMGdvb2Rfa2V5CithbGlnbgkxNgorTCQwOTlrZXlfMTI4OgorCW1vdnVwcwlbZWR4XSx4bW0wCisJbGVhCWVkeCxbMTYrZWR4XQorTCQwOThrZXlfMTI4X2NvbGQ6CisJc2h1ZnBzCXhtbTQseG1tMCwxNgorCXhvcnBzCXhtbTAseG1tNAorCXNodWZwcwl4bW00LHhtbTAsMTQwCisJeG9ycHMJeG1tMCx4bW00CisJc2h1ZnBzCXhtbTEseG1tMSwyNTUKKwl4b3Jwcwl4bW0wLHhtbTEKKwlyZXQKK2FsaWduCTE2CitMJDA5NzEwcm91bmRzX2FsdDoKKwltb3ZkcWEJeG1tNSxbZWJ4XQorCW1vdgllY3gsOAorCW1vdmRxYQl4bW00LFszMitlYnhdCisJbW92ZHFhCXhtbTIseG1tMAorCW1vdmRxdQlbZWR4LTE2XSx4bW0wCitMJDEwMWxvb3Bfa2V5MTI4OgorZGIJMTAyLDE1LDU2LDAsMTk3CitkYgkxMDIsMTUsNTYsMjIxLDE5NgorCXBzbGxkCXhtbTQsMQorCWxlYQllZHgsWzE2K2VkeF0KKwltb3ZkcWEJeG1tMyx4bW0yCisJcHNsbGRxCXhtbTIsNAorCXB4b3IJeG1tMyx4bW0yCisJcHNsbGRxCXhtbTIsNAorCXB4b3IJeG1tMyx4bW0yCisJcHNsbGRxCXhtbTIsNAorCXB4b3IJeG1tMix4bW0zCisJcHhvcgl4bW0wLHhtbTIKKwltb3ZkcXUJW2VkeC0xNl0seG1tMAorCW1vdmRxYQl4bW0yLHhtbTAKKwlkZWMJZWN4CisJam56CU5FQVIgTCQxMDFsb29wX2tleTEyOAorCW1vdmRxYQl4bW00LFs0OCtlYnhdCitkYgkxMDIsMTUsNTYsMCwxOTcKK2RiCTEwMiwxNSw1NiwyMjEsMTk2CisJcHNsbGQJeG1tNCwxCisJbW92ZHFhCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTIseG1tMworCXB4b3IJeG1tMCx4bW0yCisJbW92ZHF1CVtlZHhdLHhtbTAKKwltb3ZkcWEJeG1tMix4bW0wCitkYgkxMDIsMTUsNTYsMCwxOTcKK2RiCTEwMiwxNSw1NiwyMjEsMTk2CisJbW92ZHFhCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTIseG1tMworCXB4b3IJeG1tMCx4bW0yCisJbW92ZHF1CVsxNitlZHhdLHhtbTAKKwltb3YJZWN4LDkKKwltb3YJRFdPUkQgWzk2K2VkeF0sZWN4CisJam1wCU5FQVIgTCQxMDBnb29kX2tleQorYWxpZ24JMTYKK0wkMDk0MTJyb3VuZHM6CisJbW92cQl4bW0yLFsxNitlYXhdCisJY21wCWVicCwyNjg0MzU0NTYKKwlqZQlORUFSIEwkMTAyMTJyb3VuZHNfYWx0CisJbW92CWVjeCwxMQorCW1vdnVwcwlbZWR4LTE2XSx4bW0wCitkYgkxMDIsMTUsNTgsMjIzLDIwMiwxCisJY2FsbAlMJDEwM2tleV8xOTJhX2NvbGQKK2RiCTEwMiwxNSw1OCwyMjMsMjAyLDIKKwljYWxsCUwkMTA0a2V5XzE5MmIKK2RiCTEwMiwxNSw1OCwyMjMsMjAyLDQKKwljYWxsCUwkMTA1a2V5XzE5MmEKK2RiCTEwMiwxNSw1OCwyMjMsMjAyLDgKKwljYWxsCUwkMTA0a2V5XzE5MmIKK2RiCTEwMiwxNSw1OCwyMjMsMjAyLDE2CisJY2FsbAlMJDEwNWtleV8xOTJhCitkYgkxMDIsMTUsNTgsMjIzLDIwMiwzMgorCWNhbGwJTCQxMDRrZXlfMTkyYgorZGIJMTAyLDE1LDU4LDIyMywyMDIsNjQKKwljYWxsCUwkMTA1a2V5XzE5MmEKK2RiCTEwMiwxNSw1OCwyMjMsMjAyLDEyOAorCWNhbGwJTCQxMDRrZXlfMTkyYgorCW1vdnVwcwlbZWR4XSx4bW0wCisJbW92CURXT1JEIFs0OCtlZHhdLGVjeAorCWptcAlORUFSIEwkMTAwZ29vZF9rZXkKK2FsaWduCTE2CitMJDEwNWtleV8xOTJhOgorCW1vdnVwcwlbZWR4XSx4bW0wCisJbGVhCWVkeCxbMTYrZWR4XQorYWxpZ24JMTYKK0wkMTAza2V5XzE5MmFfY29sZDoKKwltb3ZhcHMJeG1tNSx4bW0yCitMJDEwNmtleV8xOTJiX3dhcm06CisJc2h1ZnBzCXhtbTQseG1tMCwxNgorCW1vdmRxYQl4bW0zLHhtbTIKKwl4b3Jwcwl4bW0wLHhtbTQKKwlzaHVmcHMJeG1tNCx4bW0wLDE0MAorCXBzbGxkcQl4bW0zLDQKKwl4b3Jwcwl4bW0wLHhtbTQKKwlwc2h1ZmQJeG1tMSx4bW0xLDg1CisJcHhvcgl4bW0yLHhtbTMKKwlweG9yCXhtbTAseG1tMQorCXBzaHVmZAl4bW0zLHhtbTAsMjU1CisJcHhvcgl4bW0yLHhtbTMKKwlyZXQKK2FsaWduCTE2CitMJDEwNGtleV8xOTJiOgorCW1vdmFwcwl4bW0zLHhtbTAKKwlzaHVmcHMJeG1tNSx4bW0wLDY4CisJbW92dXBzCVtlZHhdLHhtbTUKKwlzaHVmcHMJeG1tMyx4bW0yLDc4CisJbW92dXBzCVsxNitlZHhdLHhtbTMKKwlsZWEJZWR4LFszMitlZHhdCisJam1wCU5FQVIgTCQxMDZrZXlfMTkyYl93YXJtCithbGlnbgkxNgorTCQxMDIxMnJvdW5kc19hbHQ6CisJbW92ZHFhCXhtbTUsWzE2K2VieF0KKwltb3ZkcWEJeG1tNCxbMzIrZWJ4XQorCW1vdgllY3gsOAorCW1vdmRxdQlbZWR4LTE2XSx4bW0wCitMJDEwN2xvb3Bfa2V5MTkyOgorCW1vdnEJW2VkeF0seG1tMgorCW1vdmRxYQl4bW0xLHhtbTIKK2RiCTEwMiwxNSw1NiwwLDIxMworZGIJMTAyLDE1LDU2LDIyMSwyMTIKKwlwc2xsZAl4bW00LDEKKwlsZWEJZWR4LFsyNCtlZHhdCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTAseG1tMworCXBzaHVmZAl4bW0zLHhtbTAsMjU1CisJcHhvcgl4bW0zLHhtbTEKKwlwc2xsZHEJeG1tMSw0CisJcHhvcgl4bW0zLHhtbTEKKwlweG9yCXhtbTAseG1tMgorCXB4b3IJeG1tMix4bW0zCisJbW92ZHF1CVtlZHgtMTZdLHhtbTAKKwlkZWMJZWN4CisJam56CU5FQVIgTCQxMDdsb29wX2tleTE5MgorCW1vdgllY3gsMTEKKwltb3YJRFdPUkQgWzMyK2VkeF0sZWN4CisJam1wCU5FQVIgTCQxMDBnb29kX2tleQorYWxpZ24JMTYKK0wkMDkzMTRyb3VuZHM6CisJbW92dXBzCXhtbTIsWzE2K2VheF0KKwlsZWEJZWR4LFsxNitlZHhdCisJY21wCWVicCwyNjg0MzU0NTYKKwlqZQlORUFSIEwkMTA4MTRyb3VuZHNfYWx0CisJbW92CWVjeCwxMworCW1vdnVwcwlbZWR4LTMyXSx4bW0wCisJbW92dXBzCVtlZHgtMTZdLHhtbTIKK2RiCTEwMiwxNSw1OCwyMjMsMjAyLDEKKwljYWxsCUwkMTA5a2V5XzI1NmFfY29sZAorZGIJMTAyLDE1LDU4LDIyMywyMDAsMQorCWNhbGwJTCQxMTBrZXlfMjU2YgorZGIJMTAyLDE1LDU4LDIyMywyMDIsMgorCWNhbGwJTCQxMTFrZXlfMjU2YQorZGIJMTAyLDE1LDU4LDIyMywyMDAsMgorCWNhbGwJTCQxMTBrZXlfMjU2YgorZGIJMTAyLDE1LDU4LDIyMywyMDIsNAorCWNhbGwJTCQxMTFrZXlfMjU2YQorZGIJMTAyLDE1LDU4LDIyMywyMDAsNAorCWNhbGwJTCQxMTBrZXlfMjU2YgorZGIJMTAyLDE1LDU4LDIyMywyMDIsOAorCWNhbGwJTCQxMTFrZXlfMjU2YQorZGIJMTAyLDE1LDU4LDIyMywyMDAsOAorCWNhbGwJTCQxMTBrZXlfMjU2YgorZGIJMTAyLDE1LDU4LDIyMywyMDIsMTYKKwljYWxsCUwkMTExa2V5XzI1NmEKK2RiCTEwMiwxNSw1OCwyMjMsMjAwLDE2CisJY2FsbAlMJDExMGtleV8yNTZiCitkYgkxMDIsMTUsNTgsMjIzLDIwMiwzMgorCWNhbGwJTCQxMTFrZXlfMjU2YQorZGIJMTAyLDE1LDU4LDIyMywyMDAsMzIKKwljYWxsCUwkMTEwa2V5XzI1NmIKK2RiCTEwMiwxNSw1OCwyMjMsMjAyLDY0CisJY2FsbAlMJDExMWtleV8yNTZhCisJbW92dXBzCVtlZHhdLHhtbTAKKwltb3YJRFdPUkQgWzE2K2VkeF0sZWN4CisJeG9yCWVheCxlYXgKKwlqbXAJTkVBUiBMJDEwMGdvb2Rfa2V5CithbGlnbgkxNgorTCQxMTFrZXlfMjU2YToKKwltb3Z1cHMJW2VkeF0seG1tMgorCWxlYQllZHgsWzE2K2VkeF0KK0wkMTA5a2V5XzI1NmFfY29sZDoKKwlzaHVmcHMJeG1tNCx4bW0wLDE2CisJeG9ycHMJeG1tMCx4bW00CisJc2h1ZnBzCXhtbTQseG1tMCwxNDAKKwl4b3Jwcwl4bW0wLHhtbTQKKwlzaHVmcHMJeG1tMSx4bW0xLDI1NQorCXhvcnBzCXhtbTAseG1tMQorCXJldAorYWxpZ24JMTYKK0wkMTEwa2V5XzI1NmI6CisJbW92dXBzCVtlZHhdLHhtbTAKKwlsZWEJZWR4LFsxNitlZHhdCisJc2h1ZnBzCXhtbTQseG1tMiwxNgorCXhvcnBzCXhtbTIseG1tNAorCXNodWZwcwl4bW00LHhtbTIsMTQwCisJeG9ycHMJeG1tMix4bW00CisJc2h1ZnBzCXhtbTEseG1tMSwxNzAKKwl4b3Jwcwl4bW0yLHhtbTEKKwlyZXQKK2FsaWduCTE2CitMJDEwODE0cm91bmRzX2FsdDoKKwltb3ZkcWEJeG1tNSxbZWJ4XQorCW1vdmRxYQl4bW00LFszMitlYnhdCisJbW92CWVjeCw3CisJbW92ZHF1CVtlZHgtMzJdLHhtbTAKKwltb3ZkcWEJeG1tMSx4bW0yCisJbW92ZHF1CVtlZHgtMTZdLHhtbTIKK0wkMTEybG9vcF9rZXkyNTY6CitkYgkxMDIsMTUsNTYsMCwyMTMKK2RiCTEwMiwxNSw1NiwyMjEsMjEyCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTAseG1tMworCXBzbGxkCXhtbTQsMQorCXB4b3IJeG1tMCx4bW0yCisJbW92ZHF1CVtlZHhdLHhtbTAKKwlkZWMJZWN4CisJanoJTkVBUiBMJDExM2RvbmVfa2V5MjU2CisJcHNodWZkCXhtbTIseG1tMCwyNTUKKwlweG9yCXhtbTMseG1tMworZGIJMTAyLDE1LDU2LDIyMSwyMTEKKwltb3ZkcWEJeG1tMyx4bW0xCisJcHNsbGRxCXhtbTEsNAorCXB4b3IJeG1tMyx4bW0xCisJcHNsbGRxCXhtbTEsNAorCXB4b3IJeG1tMyx4bW0xCisJcHNsbGRxCXhtbTEsNAorCXB4b3IJeG1tMSx4bW0zCisJcHhvcgl4bW0yLHhtbTEKKwltb3ZkcXUJWzE2K2VkeF0seG1tMgorCWxlYQllZHgsWzMyK2VkeF0KKwltb3ZkcWEJeG1tMSx4bW0yCisJam1wCU5FQVIgTCQxMTJsb29wX2tleTI1NgorTCQxMTNkb25lX2tleTI1NjoKKwltb3YJZWN4LDEzCisJbW92CURXT1JEIFsxNitlZHhdLGVjeAorTCQxMDBnb29kX2tleToKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJcHhvcgl4bW0yLHhtbTIKKwlweG9yCXhtbTMseG1tMworCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKwl4b3IJZWF4LGVheAorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CithbGlnbgk0CitMJDA5MWJhZF9wb2ludGVyOgorCW1vdgllYXgsLTEKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JNAorTCQwOTViYWRfa2V5Yml0czoKKwlweG9yCXhtbTAseG1tMAorCW1vdgllYXgsLTIKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9hZXNuaV9zZXRfZW5jcnlwdF9rZXkKK2FsaWduCTE2CitfYWVzbmlfc2V0X2VuY3J5cHRfa2V5OgorTCRfYWVzbmlfc2V0X2VuY3J5cHRfa2V5X2JlZ2luOgorCW1vdgllYXgsRFdPUkQgWzQrZXNwXQorCW1vdgllY3gsRFdPUkQgWzgrZXNwXQorCW1vdgllZHgsRFdPUkQgWzEyK2VzcF0KKwljYWxsCV9fYWVzbmlfc2V0X2VuY3J5cHRfa2V5CisJcmV0CitnbG9iYWwJX2Flc25pX3NldF9kZWNyeXB0X2tleQorYWxpZ24JMTYKK19hZXNuaV9zZXRfZGVjcnlwdF9rZXk6CitMJF9hZXNuaV9zZXRfZGVjcnlwdF9rZXlfYmVnaW46CisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJbW92CWVjeCxEV09SRCBbOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMTIrZXNwXQorCWNhbGwJX19hZXNuaV9zZXRfZW5jcnlwdF9rZXkKKwltb3YJZWR4LERXT1JEIFsxMitlc3BdCisJc2hsCWVjeCw0CisJdGVzdAllYXgsZWF4CisJam56CU5FQVIgTCQxMTRkZWNfa2V5X3JldAorCWxlYQllYXgsWzE2K2VjeCoxK2VkeF0KKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFtlYXhdCisJbW92dXBzCVtlYXhdLHhtbTAKKwltb3Z1cHMJW2VkeF0seG1tMQorCWxlYQllZHgsWzE2K2VkeF0KKwlsZWEJZWF4LFtlYXgtMTZdCitMJDExNWRlY19rZXlfaW52ZXJzZToKKwltb3Z1cHMJeG1tMCxbZWR4XQorCW1vdnVwcwl4bW0xLFtlYXhdCitkYgkxMDIsMTUsNTYsMjE5LDE5MgorZGIJMTAyLDE1LDU2LDIxOSwyMDEKKwlsZWEJZWR4LFsxNitlZHhdCisJbGVhCWVheCxbZWF4LTE2XQorCW1vdnVwcwlbMTYrZWF4XSx4bW0wCisJbW92dXBzCVtlZHgtMTZdLHhtbTEKKwljbXAJZWF4LGVkeAorCWphCU5FQVIgTCQxMTVkZWNfa2V5X2ludmVyc2UKKwltb3Z1cHMJeG1tMCxbZWR4XQorZGIJMTAyLDE1LDU2LDIxOSwxOTIKKwltb3Z1cHMJW2VkeF0seG1tMAorCXB4b3IJeG1tMCx4bW0wCisJcHhvcgl4bW0xLHhtbTEKKwl4b3IJZWF4LGVheAorTCQxMTRkZWNfa2V5X3JldDoKKwlyZXQKK2FsaWduCTY0CitMJGtleV9jb25zdDoKK2RkCTIwMjMxMzIyOSwyMDIzMTMyMjksMjAyMzEzMjI5LDIwMjMxMzIyOQorZGQJNjc1NjkxNTcsNjc1NjkxNTcsNjc1NjkxNTcsNjc1NjkxNTcKK2RkCTEsMSwxLDEKK2RkCTI3LDI3LDI3LDI3CitkYgk2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiw3MywxMTAsMTE2LDEwMSwxMDgsMzIsNjUsNjkKK2RiCTgzLDQ1LDc4LDczLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzCitkYgkzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUKK2RiCTExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorc2VnbWVudAkuYnNzCitjb21tb24JX09QRU5TU0xfaWEzMmNhcF9QIDE2CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvYm4tNTg2LmFzbSBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9ibi01ODYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjIwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvYm4tNTg2LmFzbQpAQCAtMCwwICsxLDE1MjMgQEAKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxvYmoKK3NlY3Rpb24JY29kZQl1c2UzMiBjbGFzcz1jb2RlIGFsaWduPTY0CislZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx3aW4zMgorJWlmZGVmIF9fWUFTTV9WRVJTSU9OX0lEX18KKyVpZiBfX1lBU01fVkVSU0lPTl9JRF9fIDwgMDEwMTAwMDBoCislZXJyb3IgeWFzbSB2ZXJzaW9uIDEuMS4wIG9yIGxhdGVyIG5lZWRlZC4KKyVlbmRpZgorOyBZYXNtIGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgLjAwIGFuZCBjb21wbGFpbnMgYWJvdXQgcmVkZWZpbmluZyBpdC4KKzsgaHR0cHM6Ly93d3cudG9ydGFsbC5uZXQvcHJvamVjdHMveWFzbS9tYW51YWwvaHRtbC9vYmpmbXQtd2luMzItc2FmZXNlaC5odG1sCislZWxzZQorJEBmZWF0LjAwIGVxdSAxCislZW5kaWYKK3NlY3Rpb24JLnRleHQJY29kZSBhbGlnbj02NAorJWVsc2UKK3NlY3Rpb24JLnRleHQJY29kZQorJWVuZGlmCis7ZXh0ZXJuCV9PUEVOU1NMX2lhMzJjYXBfUAorZ2xvYmFsCV9ibl9tdWxfYWRkX3dvcmRzCithbGlnbgkxNgorX2JuX211bF9hZGRfd29yZHM6CitMJF9ibl9tdWxfYWRkX3dvcmRzX2JlZ2luOgorCWxlYQllYXgsW19PUEVOU1NMX2lhMzJjYXBfUF0KKwlidAlEV09SRCBbZWF4XSwyNgorCWpuYwlORUFSIEwkMDAwbWF3X25vbl9zc2UyCisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJbW92CWVkeCxEV09SRCBbOCtlc3BdCisJbW92CWVjeCxEV09SRCBbMTIrZXNwXQorCW1vdmQJbW0wLERXT1JEIFsxNitlc3BdCisJcHhvcgltbTEsbW0xCisJam1wCU5FQVIgTCQwMDFtYXdfc3NlMl9lbnRyeQorYWxpZ24JMTYKK0wkMDAybWF3X3NzZTJfdW5yb2xsZWQ6CisJbW92ZAltbTMsRFdPUkQgW2VheF0KKwlwYWRkcQltbTEsbW0zCisJbW92ZAltbTIsRFdPUkQgW2VkeF0KKwlwbXVsdWRxCW1tMixtbTAKKwltb3ZkCW1tNCxEV09SRCBbNCtlZHhdCisJcG11bHVkcQltbTQsbW0wCisJbW92ZAltbTYsRFdPUkQgWzgrZWR4XQorCXBtdWx1ZHEJbW02LG1tMAorCW1vdmQJbW03LERXT1JEIFsxMitlZHhdCisJcG11bHVkcQltbTcsbW0wCisJcGFkZHEJbW0xLG1tMgorCW1vdmQJbW0zLERXT1JEIFs0K2VheF0KKwlwYWRkcQltbTMsbW00CisJbW92ZAltbTUsRFdPUkQgWzgrZWF4XQorCXBhZGRxCW1tNSxtbTYKKwltb3ZkCW1tNCxEV09SRCBbMTIrZWF4XQorCXBhZGRxCW1tNyxtbTQKKwltb3ZkCURXT1JEIFtlYXhdLG1tMQorCW1vdmQJbW0yLERXT1JEIFsxNitlZHhdCisJcG11bHVkcQltbTIsbW0wCisJcHNybHEJbW0xLDMyCisJbW92ZAltbTQsRFdPUkQgWzIwK2VkeF0KKwlwbXVsdWRxCW1tNCxtbTAKKwlwYWRkcQltbTEsbW0zCisJbW92ZAltbTYsRFdPUkQgWzI0K2VkeF0KKwlwbXVsdWRxCW1tNixtbTAKKwltb3ZkCURXT1JEIFs0K2VheF0sbW0xCisJcHNybHEJbW0xLDMyCisJbW92ZAltbTMsRFdPUkQgWzI4K2VkeF0KKwlhZGQJZWR4LDMyCisJcG11bHVkcQltbTMsbW0wCisJcGFkZHEJbW0xLG1tNQorCW1vdmQJbW01LERXT1JEIFsxNitlYXhdCisJcGFkZHEJbW0yLG1tNQorCW1vdmQJRFdPUkQgWzgrZWF4XSxtbTEKKwlwc3JscQltbTEsMzIKKwlwYWRkcQltbTEsbW03CisJbW92ZAltbTUsRFdPUkQgWzIwK2VheF0KKwlwYWRkcQltbTQsbW01CisJbW92ZAlEV09SRCBbMTIrZWF4XSxtbTEKKwlwc3JscQltbTEsMzIKKwlwYWRkcQltbTEsbW0yCisJbW92ZAltbTUsRFdPUkQgWzI0K2VheF0KKwlwYWRkcQltbTYsbW01CisJbW92ZAlEV09SRCBbMTYrZWF4XSxtbTEKKwlwc3JscQltbTEsMzIKKwlwYWRkcQltbTEsbW00CisJbW92ZAltbTUsRFdPUkQgWzI4K2VheF0KKwlwYWRkcQltbTMsbW01CisJbW92ZAlEV09SRCBbMjArZWF4XSxtbTEKKwlwc3JscQltbTEsMzIKKwlwYWRkcQltbTEsbW02CisJbW92ZAlEV09SRCBbMjQrZWF4XSxtbTEKKwlwc3JscQltbTEsMzIKKwlwYWRkcQltbTEsbW0zCisJbW92ZAlEV09SRCBbMjgrZWF4XSxtbTEKKwlsZWEJZWF4LFszMitlYXhdCisJcHNybHEJbW0xLDMyCisJc3ViCWVjeCw4CisJanoJTkVBUiBMJDAwM21hd19zc2UyX2V4aXQKK0wkMDAxbWF3X3NzZTJfZW50cnk6CisJdGVzdAllY3gsNDI5NDk2NzI4OAorCWpueglORUFSIEwkMDAybWF3X3NzZTJfdW5yb2xsZWQKK2FsaWduCTQKK0wkMDA0bWF3X3NzZTJfbG9vcDoKKwltb3ZkCW1tMixEV09SRCBbZWR4XQorCW1vdmQJbW0zLERXT1JEIFtlYXhdCisJcG11bHVkcQltbTIsbW0wCisJbGVhCWVkeCxbNCtlZHhdCisJcGFkZHEJbW0xLG1tMworCXBhZGRxCW1tMSxtbTIKKwltb3ZkCURXT1JEIFtlYXhdLG1tMQorCXN1YgllY3gsMQorCXBzcmxxCW1tMSwzMgorCWxlYQllYXgsWzQrZWF4XQorCWpueglORUFSIEwkMDA0bWF3X3NzZTJfbG9vcAorTCQwMDNtYXdfc3NlMl9leGl0OgorCW1vdmQJZWF4LG1tMQorCWVtbXMKKwlyZXQKK2FsaWduCTE2CitMJDAwMG1hd19ub25fc3NlMjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCTsgCisJeG9yCWVzaSxlc2kKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJbW92CWVjeCxEV09SRCBbMjgrZXNwXQorCW1vdgllYngsRFdPUkQgWzI0K2VzcF0KKwlhbmQJZWN4LDQyOTQ5NjcyODgKKwltb3YJZWJwLERXT1JEIFszMitlc3BdCisJcHVzaAllY3gKKwlqeglORUFSIEwkMDA1bWF3X2ZpbmlzaAorYWxpZ24JMTYKK0wkMDA2bWF3X2xvb3A6CisJOyBSb3VuZCAwCisJbW92CWVheCxEV09SRCBbZWJ4XQorCW11bAllYnAKKwlhZGQJZWF4LGVzaQorCWFkYwllZHgsMAorCWFkZAllYXgsRFdPUkQgW2VkaV0KKwlhZGMJZWR4LDAKKwltb3YJRFdPUkQgW2VkaV0sZWF4CisJbW92CWVzaSxlZHgKKwk7IFJvdW5kIDQKKwltb3YJZWF4LERXT1JEIFs0K2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFs0K2VkaV0KKwlhZGMJZWR4LDAKKwltb3YJRFdPUkQgWzQrZWRpXSxlYXgKKwltb3YJZXNpLGVkeAorCTsgUm91bmQgOAorCW1vdgllYXgsRFdPUkQgWzgrZWJ4XQorCW11bAllYnAKKwlhZGQJZWF4LGVzaQorCWFkYwllZHgsMAorCWFkZAllYXgsRFdPUkQgWzgrZWRpXQorCWFkYwllZHgsMAorCW1vdglEV09SRCBbOCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCAxMgorCW1vdgllYXgsRFdPUkQgWzEyK2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFsxMitlZGldCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsxMitlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCAxNgorCW1vdgllYXgsRFdPUkQgWzE2K2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFsxNitlZGldCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsxNitlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCAyMAorCW1vdgllYXgsRFdPUkQgWzIwK2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFsyMCtlZGldCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyMCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCAyNAorCW1vdgllYXgsRFdPUkQgWzI0K2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFsyNCtlZGldCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyNCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCAyOAorCW1vdgllYXgsRFdPUkQgWzI4K2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFsyOCtlZGldCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyOCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyAKKwlzdWIJZWN4LDgKKwlsZWEJZWJ4LFszMitlYnhdCisJbGVhCWVkaSxbMzIrZWRpXQorCWpueglORUFSIEwkMDA2bWF3X2xvb3AKK0wkMDA1bWF3X2ZpbmlzaDoKKwltb3YJZWN4LERXT1JEIFszMitlc3BdCisJYW5kCWVjeCw3CisJam56CU5FQVIgTCQwMDdtYXdfZmluaXNoMgorCWptcAlORUFSIEwkMDA4bWF3X2VuZAorTCQwMDdtYXdfZmluaXNoMjoKKwk7IFRhaWwgUm91bmQgMAorCW1vdgllYXgsRFdPUkQgW2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFtlZGldCisJYWRjCWVkeCwwCisJZGVjCWVjeAorCW1vdglEV09SRCBbZWRpXSxlYXgKKwltb3YJZXNpLGVkeAorCWp6CU5FQVIgTCQwMDhtYXdfZW5kCisJOyBUYWlsIFJvdW5kIDEKKwltb3YJZWF4LERXT1JEIFs0K2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFs0K2VkaV0KKwlhZGMJZWR4LDAKKwlkZWMJZWN4CisJbW92CURXT1JEIFs0K2VkaV0sZWF4CisJbW92CWVzaSxlZHgKKwlqeglORUFSIEwkMDA4bWF3X2VuZAorCTsgVGFpbCBSb3VuZCAyCisJbW92CWVheCxEV09SRCBbOCtlYnhdCisJbXVsCWVicAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJYWRkCWVheCxEV09SRCBbOCtlZGldCisJYWRjCWVkeCwwCisJZGVjCWVjeAorCW1vdglEV09SRCBbOCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJanoJTkVBUiBMJDAwOG1hd19lbmQKKwk7IFRhaWwgUm91bmQgMworCW1vdgllYXgsRFdPUkQgWzEyK2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFsxMitlZGldCisJYWRjCWVkeCwwCisJZGVjCWVjeAorCW1vdglEV09SRCBbMTIrZWRpXSxlYXgKKwltb3YJZXNpLGVkeAorCWp6CU5FQVIgTCQwMDhtYXdfZW5kCisJOyBUYWlsIFJvdW5kIDQKKwltb3YJZWF4LERXT1JEIFsxNitlYnhdCisJbXVsCWVicAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJYWRkCWVheCxEV09SRCBbMTYrZWRpXQorCWFkYwllZHgsMAorCWRlYwllY3gKKwltb3YJRFdPUkQgWzE2K2VkaV0sZWF4CisJbW92CWVzaSxlZHgKKwlqeglORUFSIEwkMDA4bWF3X2VuZAorCTsgVGFpbCBSb3VuZCA1CisJbW92CWVheCxEV09SRCBbMjArZWJ4XQorCW11bAllYnAKKwlhZGQJZWF4LGVzaQorCWFkYwllZHgsMAorCWFkZAllYXgsRFdPUkQgWzIwK2VkaV0KKwlhZGMJZWR4LDAKKwlkZWMJZWN4CisJbW92CURXT1JEIFsyMCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJanoJTkVBUiBMJDAwOG1hd19lbmQKKwk7IFRhaWwgUm91bmQgNgorCW1vdgllYXgsRFdPUkQgWzI0K2VieF0KKwltdWwJZWJwCisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwlhZGQJZWF4LERXT1JEIFsyNCtlZGldCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyNCtlZGldLGVheAorCW1vdgllc2ksZWR4CitMJDAwOG1hd19lbmQ6CisJbW92CWVheCxlc2kKKwlwb3AJZWN4CisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9ibl9tdWxfd29yZHMKK2FsaWduCTE2CitfYm5fbXVsX3dvcmRzOgorTCRfYm5fbXVsX3dvcmRzX2JlZ2luOgorCWxlYQllYXgsW19PUEVOU1NMX2lhMzJjYXBfUF0KKwlidAlEV09SRCBbZWF4XSwyNgorCWpuYwlORUFSIEwkMDA5bXdfbm9uX3NzZTIKKwltb3YJZWF4LERXT1JEIFs0K2VzcF0KKwltb3YJZWR4LERXT1JEIFs4K2VzcF0KKwltb3YJZWN4LERXT1JEIFsxMitlc3BdCisJbW92ZAltbTAsRFdPUkQgWzE2K2VzcF0KKwlweG9yCW1tMSxtbTEKK2FsaWduCTE2CitMJDAxMG13X3NzZTJfbG9vcDoKKwltb3ZkCW1tMixEV09SRCBbZWR4XQorCXBtdWx1ZHEJbW0yLG1tMAorCWxlYQllZHgsWzQrZWR4XQorCXBhZGRxCW1tMSxtbTIKKwltb3ZkCURXT1JEIFtlYXhdLG1tMQorCXN1YgllY3gsMQorCXBzcmxxCW1tMSwzMgorCWxlYQllYXgsWzQrZWF4XQorCWpueglORUFSIEwkMDEwbXdfc3NlMl9sb29wCisJbW92ZAllYXgsbW0xCisJZW1tcworCXJldAorYWxpZ24JMTYKK0wkMDA5bXdfbm9uX3NzZTI6CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKKwk7IAorCXhvcgllc2ksZXNpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllYngsRFdPUkQgWzI0K2VzcF0KKwltb3YJZWJwLERXT1JEIFsyOCtlc3BdCisJbW92CWVjeCxEV09SRCBbMzIrZXNwXQorCWFuZAllYnAsNDI5NDk2NzI4OAorCWp6CU5FQVIgTCQwMTFtd19maW5pc2gKK0wkMDEybXdfbG9vcDoKKwk7IFJvdW5kIDAKKwltb3YJZWF4LERXT1JEIFtlYnhdCisJbXVsCWVjeAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFtlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCA0CisJbW92CWVheCxEV09SRCBbNCtlYnhdCisJbXVsCWVjeAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFs0K2VkaV0sZWF4CisJbW92CWVzaSxlZHgKKwk7IFJvdW5kIDgKKwltb3YJZWF4LERXT1JEIFs4K2VieF0KKwltdWwJZWN4CisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwltb3YJRFdPUkQgWzgrZWRpXSxlYXgKKwltb3YJZXNpLGVkeAorCTsgUm91bmQgMTIKKwltb3YJZWF4LERXT1JEIFsxMitlYnhdCisJbXVsCWVjeAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsxMitlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCAxNgorCW1vdgllYXgsRFdPUkQgWzE2K2VieF0KKwltdWwJZWN4CisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwltb3YJRFdPUkQgWzE2K2VkaV0sZWF4CisJbW92CWVzaSxlZHgKKwk7IFJvdW5kIDIwCisJbW92CWVheCxEV09SRCBbMjArZWJ4XQorCW11bAllY3gKKwlhZGQJZWF4LGVzaQorCWFkYwllZHgsMAorCW1vdglEV09SRCBbMjArZWRpXSxlYXgKKwltb3YJZXNpLGVkeAorCTsgUm91bmQgMjQKKwltb3YJZWF4LERXT1JEIFsyNCtlYnhdCisJbXVsCWVjeAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyNCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJOyBSb3VuZCAyOAorCW1vdgllYXgsRFdPUkQgWzI4K2VieF0KKwltdWwJZWN4CisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwltb3YJRFdPUkQgWzI4K2VkaV0sZWF4CisJbW92CWVzaSxlZHgKKwk7IAorCWFkZAllYngsMzIKKwlhZGQJZWRpLDMyCisJc3ViCWVicCw4CisJanoJTkVBUiBMJDAxMW13X2ZpbmlzaAorCWptcAlORUFSIEwkMDEybXdfbG9vcAorTCQwMTFtd19maW5pc2g6CisJbW92CWVicCxEV09SRCBbMjgrZXNwXQorCWFuZAllYnAsNworCWpueglORUFSIEwkMDEzbXdfZmluaXNoMgorCWptcAlORUFSIEwkMDE0bXdfZW5kCitMJDAxM213X2ZpbmlzaDI6CisJOyBUYWlsIFJvdW5kIDAKKwltb3YJZWF4LERXT1JEIFtlYnhdCisJbXVsCWVjeAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFtlZGldLGVheAorCW1vdgllc2ksZWR4CisJZGVjCWVicAorCWp6CU5FQVIgTCQwMTRtd19lbmQKKwk7IFRhaWwgUm91bmQgMQorCW1vdgllYXgsRFdPUkQgWzQrZWJ4XQorCW11bAllY3gKKwlhZGQJZWF4LGVzaQorCWFkYwllZHgsMAorCW1vdglEV09SRCBbNCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJZGVjCWVicAorCWp6CU5FQVIgTCQwMTRtd19lbmQKKwk7IFRhaWwgUm91bmQgMgorCW1vdgllYXgsRFdPUkQgWzgrZWJ4XQorCW11bAllY3gKKwlhZGQJZWF4LGVzaQorCWFkYwllZHgsMAorCW1vdglEV09SRCBbOCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJZGVjCWVicAorCWp6CU5FQVIgTCQwMTRtd19lbmQKKwk7IFRhaWwgUm91bmQgMworCW1vdgllYXgsRFdPUkQgWzEyK2VieF0KKwltdWwJZWN4CisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwltb3YJRFdPUkQgWzEyK2VkaV0sZWF4CisJbW92CWVzaSxlZHgKKwlkZWMJZWJwCisJanoJTkVBUiBMJDAxNG13X2VuZAorCTsgVGFpbCBSb3VuZCA0CisJbW92CWVheCxEV09SRCBbMTYrZWJ4XQorCW11bAllY3gKKwlhZGQJZWF4LGVzaQorCWFkYwllZHgsMAorCW1vdglEV09SRCBbMTYrZWRpXSxlYXgKKwltb3YJZXNpLGVkeAorCWRlYwllYnAKKwlqeglORUFSIEwkMDE0bXdfZW5kCisJOyBUYWlsIFJvdW5kIDUKKwltb3YJZWF4LERXT1JEIFsyMCtlYnhdCisJbXVsCWVjeAorCWFkZAllYXgsZXNpCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyMCtlZGldLGVheAorCW1vdgllc2ksZWR4CisJZGVjCWVicAorCWp6CU5FQVIgTCQwMTRtd19lbmQKKwk7IFRhaWwgUm91bmQgNgorCW1vdgllYXgsRFdPUkQgWzI0K2VieF0KKwltdWwJZWN4CisJYWRkCWVheCxlc2kKKwlhZGMJZWR4LDAKKwltb3YJRFdPUkQgWzI0K2VkaV0sZWF4CisJbW92CWVzaSxlZHgKK0wkMDE0bXdfZW5kOgorCW1vdgllYXgsZXNpCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9ibl9zcXJfd29yZHMKK2FsaWduCTE2CitfYm5fc3FyX3dvcmRzOgorTCRfYm5fc3FyX3dvcmRzX2JlZ2luOgorCWxlYQllYXgsW19PUEVOU1NMX2lhMzJjYXBfUF0KKwlidAlEV09SRCBbZWF4XSwyNgorCWpuYwlORUFSIEwkMDE1c3FyX25vbl9zc2UyCisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJbW92CWVkeCxEV09SRCBbOCtlc3BdCisJbW92CWVjeCxEV09SRCBbMTIrZXNwXQorYWxpZ24JMTYKK0wkMDE2c3FyX3NzZTJfbG9vcDoKKwltb3ZkCW1tMCxEV09SRCBbZWR4XQorCXBtdWx1ZHEJbW0wLG1tMAorCWxlYQllZHgsWzQrZWR4XQorCW1vdnEJW2VheF0sbW0wCisJc3ViCWVjeCwxCisJbGVhCWVheCxbOCtlYXhdCisJam56CU5FQVIgTCQwMTZzcXJfc3NlMl9sb29wCisJZW1tcworCXJldAorYWxpZ24JMTYKK0wkMDE1c3FyX25vbl9zc2UyOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJOyAKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCW1vdgllYngsRFdPUkQgWzI4K2VzcF0KKwlhbmQJZWJ4LDQyOTQ5NjcyODgKKwlqeglORUFSIEwkMDE3c3dfZmluaXNoCitMJDAxOHN3X2xvb3A6CisJOyBSb3VuZCAwCisJbW92CWVheCxEV09SRCBbZWRpXQorCW11bAllYXgKKwltb3YJRFdPUkQgW2VzaV0sZWF4CisJbW92CURXT1JEIFs0K2VzaV0sZWR4CisJOyBSb3VuZCA0CisJbW92CWVheCxEV09SRCBbNCtlZGldCisJbXVsCWVheAorCW1vdglEV09SRCBbOCtlc2ldLGVheAorCW1vdglEV09SRCBbMTIrZXNpXSxlZHgKKwk7IFJvdW5kIDgKKwltb3YJZWF4LERXT1JEIFs4K2VkaV0KKwltdWwJZWF4CisJbW92CURXT1JEIFsxNitlc2ldLGVheAorCW1vdglEV09SRCBbMjArZXNpXSxlZHgKKwk7IFJvdW5kIDEyCisJbW92CWVheCxEV09SRCBbMTIrZWRpXQorCW11bAllYXgKKwltb3YJRFdPUkQgWzI0K2VzaV0sZWF4CisJbW92CURXT1JEIFsyOCtlc2ldLGVkeAorCTsgUm91bmQgMTYKKwltb3YJZWF4LERXT1JEIFsxNitlZGldCisJbXVsCWVheAorCW1vdglEV09SRCBbMzIrZXNpXSxlYXgKKwltb3YJRFdPUkQgWzM2K2VzaV0sZWR4CisJOyBSb3VuZCAyMAorCW1vdgllYXgsRFdPUkQgWzIwK2VkaV0KKwltdWwJZWF4CisJbW92CURXT1JEIFs0MCtlc2ldLGVheAorCW1vdglEV09SRCBbNDQrZXNpXSxlZHgKKwk7IFJvdW5kIDI0CisJbW92CWVheCxEV09SRCBbMjQrZWRpXQorCW11bAllYXgKKwltb3YJRFdPUkQgWzQ4K2VzaV0sZWF4CisJbW92CURXT1JEIFs1Mitlc2ldLGVkeAorCTsgUm91bmQgMjgKKwltb3YJZWF4LERXT1JEIFsyOCtlZGldCisJbXVsCWVheAorCW1vdglEV09SRCBbNTYrZXNpXSxlYXgKKwltb3YJRFdPUkQgWzYwK2VzaV0sZWR4CisJOyAKKwlhZGQJZWRpLDMyCisJYWRkCWVzaSw2NAorCXN1YgllYngsOAorCWpueglORUFSIEwkMDE4c3dfbG9vcAorTCQwMTdzd19maW5pc2g6CisJbW92CWVieCxEV09SRCBbMjgrZXNwXQorCWFuZAllYngsNworCWp6CU5FQVIgTCQwMTlzd19lbmQKKwk7IFRhaWwgUm91bmQgMAorCW1vdgllYXgsRFdPUkQgW2VkaV0KKwltdWwJZWF4CisJbW92CURXT1JEIFtlc2ldLGVheAorCWRlYwllYngKKwltb3YJRFdPUkQgWzQrZXNpXSxlZHgKKwlqeglORUFSIEwkMDE5c3dfZW5kCisJOyBUYWlsIFJvdW5kIDEKKwltb3YJZWF4LERXT1JEIFs0K2VkaV0KKwltdWwJZWF4CisJbW92CURXT1JEIFs4K2VzaV0sZWF4CisJZGVjCWVieAorCW1vdglEV09SRCBbMTIrZXNpXSxlZHgKKwlqeglORUFSIEwkMDE5c3dfZW5kCisJOyBUYWlsIFJvdW5kIDIKKwltb3YJZWF4LERXT1JEIFs4K2VkaV0KKwltdWwJZWF4CisJbW92CURXT1JEIFsxNitlc2ldLGVheAorCWRlYwllYngKKwltb3YJRFdPUkQgWzIwK2VzaV0sZWR4CisJanoJTkVBUiBMJDAxOXN3X2VuZAorCTsgVGFpbCBSb3VuZCAzCisJbW92CWVheCxEV09SRCBbMTIrZWRpXQorCW11bAllYXgKKwltb3YJRFdPUkQgWzI0K2VzaV0sZWF4CisJZGVjCWVieAorCW1vdglEV09SRCBbMjgrZXNpXSxlZHgKKwlqeglORUFSIEwkMDE5c3dfZW5kCisJOyBUYWlsIFJvdW5kIDQKKwltb3YJZWF4LERXT1JEIFsxNitlZGldCisJbXVsCWVheAorCW1vdglEV09SRCBbMzIrZXNpXSxlYXgKKwlkZWMJZWJ4CisJbW92CURXT1JEIFszNitlc2ldLGVkeAorCWp6CU5FQVIgTCQwMTlzd19lbmQKKwk7IFRhaWwgUm91bmQgNQorCW1vdgllYXgsRFdPUkQgWzIwK2VkaV0KKwltdWwJZWF4CisJbW92CURXT1JEIFs0MCtlc2ldLGVheAorCWRlYwllYngKKwltb3YJRFdPUkQgWzQ0K2VzaV0sZWR4CisJanoJTkVBUiBMJDAxOXN3X2VuZAorCTsgVGFpbCBSb3VuZCA2CisJbW92CWVheCxEV09SRCBbMjQrZWRpXQorCW11bAllYXgKKwltb3YJRFdPUkQgWzQ4K2VzaV0sZWF4CisJbW92CURXT1JEIFs1Mitlc2ldLGVkeAorTCQwMTlzd19lbmQ6CisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9ibl9kaXZfd29yZHMKK2FsaWduCTE2CitfYm5fZGl2X3dvcmRzOgorTCRfYm5fZGl2X3dvcmRzX2JlZ2luOgorCW1vdgllZHgsRFdPUkQgWzQrZXNwXQorCW1vdgllYXgsRFdPUkQgWzgrZXNwXQorCW1vdgllY3gsRFdPUkQgWzEyK2VzcF0KKwlkaXYJZWN4CisJcmV0CitnbG9iYWwJX2JuX2FkZF93b3JkcworYWxpZ24JMTYKK19ibl9hZGRfd29yZHM6CitMJF9ibl9hZGRfd29yZHNfYmVnaW46CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKKwk7IAorCW1vdgllYngsRFdPUkQgWzIwK2VzcF0KKwltb3YJZXNpLERXT1JEIFsyNCtlc3BdCisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCW1vdgllYnAsRFdPUkQgWzMyK2VzcF0KKwl4b3IJZWF4LGVheAorCWFuZAllYnAsNDI5NDk2NzI4OAorCWp6CU5FQVIgTCQwMjBhd19maW5pc2gKK0wkMDIxYXdfbG9vcDoKKwk7IFJvdW5kIDAKKwltb3YJZWN4LERXT1JEIFtlc2ldCisJbW92CWVkeCxEV09SRCBbZWRpXQorCWFkZAllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbZWJ4XSxlY3gKKwk7IFJvdW5kIDEKKwltb3YJZWN4LERXT1JEIFs0K2VzaV0KKwltb3YJZWR4LERXT1JEIFs0K2VkaV0KKwlhZGQJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJYWRkCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzQrZWJ4XSxlY3gKKwk7IFJvdW5kIDIKKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWR4LERXT1JEIFs4K2VkaV0KKwlhZGQJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJYWRkCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzgrZWJ4XSxlY3gKKwk7IFJvdW5kIDMKKwltb3YJZWN4LERXT1JEIFsxMitlc2ldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCWFkZAllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbMTIrZWJ4XSxlY3gKKwk7IFJvdW5kIDQKKwltb3YJZWN4LERXT1JEIFsxNitlc2ldCisJbW92CWVkeCxEV09SRCBbMTYrZWRpXQorCWFkZAllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbMTYrZWJ4XSxlY3gKKwk7IFJvdW5kIDUKKwltb3YJZWN4LERXT1JEIFsyMCtlc2ldCisJbW92CWVkeCxEV09SRCBbMjArZWRpXQorCWFkZAllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbMjArZWJ4XSxlY3gKKwk7IFJvdW5kIDYKKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CWVkeCxEV09SRCBbMjQrZWRpXQorCWFkZAllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbMjQrZWJ4XSxlY3gKKwk7IFJvdW5kIDcKKwltb3YJZWN4LERXT1JEIFsyOCtlc2ldCisJbW92CWVkeCxEV09SRCBbMjgrZWRpXQorCWFkZAllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbMjgrZWJ4XSxlY3gKKwk7IAorCWFkZAllc2ksMzIKKwlhZGQJZWRpLDMyCisJYWRkCWVieCwzMgorCXN1YgllYnAsOAorCWpueglORUFSIEwkMDIxYXdfbG9vcAorTCQwMjBhd19maW5pc2g6CisJbW92CWVicCxEV09SRCBbMzIrZXNwXQorCWFuZAllYnAsNworCWp6CU5FQVIgTCQwMjJhd19lbmQKKwk7IFRhaWwgUm91bmQgMAorCW1vdgllY3gsRFdPUkQgW2VzaV0KKwltb3YJZWR4LERXT1JEIFtlZGldCisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCWFkZAllY3gsZWR4CisJYWRjCWVheCwwCisJZGVjCWVicAorCW1vdglEV09SRCBbZWJ4XSxlY3gKKwlqeglORUFSIEwkMDIyYXdfZW5kCisJOyBUYWlsIFJvdW5kIDEKKwltb3YJZWN4LERXT1JEIFs0K2VzaV0KKwltb3YJZWR4LERXT1JEIFs0K2VkaV0KKwlhZGQJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJYWRkCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwlkZWMJZWJwCisJbW92CURXT1JEIFs0K2VieF0sZWN4CisJanoJTkVBUiBMJDAyMmF3X2VuZAorCTsgVGFpbCBSb3VuZCAyCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVkeCxEV09SRCBbOCtlZGldCisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCWFkZAllY3gsZWR4CisJYWRjCWVheCwwCisJZGVjCWVicAorCW1vdglEV09SRCBbOCtlYnhdLGVjeAorCWp6CU5FQVIgTCQwMjJhd19lbmQKKwk7IFRhaWwgUm91bmQgMworCW1vdgllY3gsRFdPUkQgWzEyK2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlZGldCisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCWFkZAllY3gsZWR4CisJYWRjCWVheCwwCisJZGVjCWVicAorCW1vdglEV09SRCBbMTIrZWJ4XSxlY3gKKwlqeglORUFSIEwkMDIyYXdfZW5kCisJOyBUYWlsIFJvdW5kIDQKKwltb3YJZWN4LERXT1JEIFsxNitlc2ldCisJbW92CWVkeCxEV09SRCBbMTYrZWRpXQorCWFkZAllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkYwllYXgsMAorCWRlYwllYnAKKwltb3YJRFdPUkQgWzE2K2VieF0sZWN4CisJanoJTkVBUiBMJDAyMmF3X2VuZAorCTsgVGFpbCBSb3VuZCA1CisJbW92CWVjeCxEV09SRCBbMjArZXNpXQorCW1vdgllZHgsRFdPUkQgWzIwK2VkaV0KKwlhZGQJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJYWRkCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwlkZWMJZWJwCisJbW92CURXT1JEIFsyMCtlYnhdLGVjeAorCWp6CU5FQVIgTCQwMjJhd19lbmQKKwk7IFRhaWwgUm91bmQgNgorCW1vdgllY3gsRFdPUkQgWzI0K2VzaV0KKwltb3YJZWR4LERXT1JEIFsyNCtlZGldCisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCWFkZAllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsyNCtlYnhdLGVjeAorTCQwMjJhd19lbmQ6CisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9ibl9zdWJfd29yZHMKK2FsaWduCTE2CitfYm5fc3ViX3dvcmRzOgorTCRfYm5fc3ViX3dvcmRzX2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJOyAKKwltb3YJZWJ4LERXT1JEIFsyMCtlc3BdCisJbW92CWVzaSxEV09SRCBbMjQrZXNwXQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwltb3YJZWJwLERXT1JEIFszMitlc3BdCisJeG9yCWVheCxlYXgKKwlhbmQJZWJwLDQyOTQ5NjcyODgKKwlqeglORUFSIEwkMDIzYXdfZmluaXNoCitMJDAyNGF3X2xvb3A6CisJOyBSb3VuZCAwCisJbW92CWVjeCxEV09SRCBbZXNpXQorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgW2VieF0sZWN4CisJOyBSb3VuZCAxCisJbW92CWVjeCxEV09SRCBbNCtlc2ldCisJbW92CWVkeCxEV09SRCBbNCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFs0K2VieF0sZWN4CisJOyBSb3VuZCAyCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVkeCxEV09SRCBbOCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFs4K2VieF0sZWN4CisJOyBSb3VuZCAzCisJbW92CWVjeCxEV09SRCBbMTIrZXNpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzEyK2VieF0sZWN4CisJOyBSb3VuZCA0CisJbW92CWVjeCxEV09SRCBbMTYrZXNpXQorCW1vdgllZHgsRFdPUkQgWzE2K2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzE2K2VieF0sZWN4CisJOyBSb3VuZCA1CisJbW92CWVjeCxEV09SRCBbMjArZXNpXQorCW1vdgllZHgsRFdPUkQgWzIwK2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzIwK2VieF0sZWN4CisJOyBSb3VuZCA2CisJbW92CWVjeCxEV09SRCBbMjQrZXNpXQorCW1vdgllZHgsRFdPUkQgWzI0K2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzI0K2VieF0sZWN4CisJOyBSb3VuZCA3CisJbW92CWVjeCxEV09SRCBbMjgrZXNpXQorCW1vdgllZHgsRFdPUkQgWzI4K2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzI4K2VieF0sZWN4CisJOyAKKwlhZGQJZXNpLDMyCisJYWRkCWVkaSwzMgorCWFkZAllYngsMzIKKwlzdWIJZWJwLDgKKwlqbnoJTkVBUiBMJDAyNGF3X2xvb3AKK0wkMDIzYXdfZmluaXNoOgorCW1vdgllYnAsRFdPUkQgWzMyK2VzcF0KKwlhbmQJZWJwLDcKKwlqeglORUFSIEwkMDI1YXdfZW5kCisJOyBUYWlsIFJvdW5kIDAKKwltb3YJZWN4LERXT1JEIFtlc2ldCisJbW92CWVkeCxEV09SRCBbZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCWRlYwllYnAKKwltb3YJRFdPUkQgW2VieF0sZWN4CisJanoJTkVBUiBMJDAyNWF3X2VuZAorCTsgVGFpbCBSb3VuZCAxCisJbW92CWVjeCxEV09SRCBbNCtlc2ldCisJbW92CWVkeCxEV09SRCBbNCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJZGVjCWVicAorCW1vdglEV09SRCBbNCtlYnhdLGVjeAorCWp6CU5FQVIgTCQwMjVhd19lbmQKKwk7IFRhaWwgUm91bmQgMgorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCWRlYwllYnAKKwltb3YJRFdPUkQgWzgrZWJ4XSxlY3gKKwlqeglORUFSIEwkMDI1YXdfZW5kCisJOyBUYWlsIFJvdW5kIDMKKwltb3YJZWN4LERXT1JEIFsxMitlc2ldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCWRlYwllYnAKKwltb3YJRFdPUkQgWzEyK2VieF0sZWN4CisJanoJTkVBUiBMJDAyNWF3X2VuZAorCTsgVGFpbCBSb3VuZCA0CisJbW92CWVjeCxEV09SRCBbMTYrZXNpXQorCW1vdgllZHgsRFdPUkQgWzE2K2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwlkZWMJZWJwCisJbW92CURXT1JEIFsxNitlYnhdLGVjeAorCWp6CU5FQVIgTCQwMjVhd19lbmQKKwk7IFRhaWwgUm91bmQgNQorCW1vdgllY3gsRFdPUkQgWzIwK2VzaV0KKwltb3YJZWR4LERXT1JEIFsyMCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJZGVjCWVicAorCW1vdglEV09SRCBbMjArZWJ4XSxlY3gKKwlqeglORUFSIEwkMDI1YXdfZW5kCisJOyBUYWlsIFJvdW5kIDYKKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CWVkeCxEV09SRCBbMjQrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbMjQrZWJ4XSxlY3gKK0wkMDI1YXdfZW5kOgorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2dsb2JhbAlfYm5fc3ViX3BhcnRfd29yZHMKK2FsaWduCTE2CitfYm5fc3ViX3BhcnRfd29yZHM6CitMJF9ibl9zdWJfcGFydF93b3Jkc19iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCTsgCisJbW92CWVieCxEV09SRCBbMjArZXNwXQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJbW92CWVicCxEV09SRCBbMzIrZXNwXQorCXhvcgllYXgsZWF4CisJYW5kCWVicCw0Mjk0OTY3Mjg4CisJanoJTkVBUiBMJDAyNmF3X2ZpbmlzaAorTCQwMjdhd19sb29wOgorCTsgUm91bmQgMAorCW1vdgllY3gsRFdPUkQgW2VzaV0KKwltb3YJZWR4LERXT1JEIFtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFtlYnhdLGVjeAorCTsgUm91bmQgMQorCW1vdgllY3gsRFdPUkQgWzQrZXNpXQorCW1vdgllZHgsRFdPUkQgWzQrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbNCtlYnhdLGVjeAorCTsgUm91bmQgMgorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbOCtlYnhdLGVjeAorCTsgUm91bmQgMworCW1vdgllY3gsRFdPUkQgWzEyK2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsxMitlYnhdLGVjeAorCTsgUm91bmQgNAorCW1vdgllY3gsRFdPUkQgWzE2K2VzaV0KKwltb3YJZWR4LERXT1JEIFsxNitlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsxNitlYnhdLGVjeAorCTsgUm91bmQgNQorCW1vdgllY3gsRFdPUkQgWzIwK2VzaV0KKwltb3YJZWR4LERXT1JEIFsyMCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsyMCtlYnhdLGVjeAorCTsgUm91bmQgNgorCW1vdgllY3gsRFdPUkQgWzI0K2VzaV0KKwltb3YJZWR4LERXT1JEIFsyNCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsyNCtlYnhdLGVjeAorCTsgUm91bmQgNworCW1vdgllY3gsRFdPUkQgWzI4K2VzaV0KKwltb3YJZWR4LERXT1JEIFsyOCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsyOCtlYnhdLGVjeAorCTsgCisJYWRkCWVzaSwzMgorCWFkZAllZGksMzIKKwlhZGQJZWJ4LDMyCisJc3ViCWVicCw4CisJam56CU5FQVIgTCQwMjdhd19sb29wCitMJDAyNmF3X2ZpbmlzaDoKKwltb3YJZWJwLERXT1JEIFszMitlc3BdCisJYW5kCWVicCw3CisJanoJTkVBUiBMJDAyOGF3X2VuZAorCTsgVGFpbCBSb3VuZCAwCisJbW92CWVjeCxEV09SRCBbZXNpXQorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgW2VieF0sZWN4CisJYWRkCWVzaSw0CisJYWRkCWVkaSw0CisJYWRkCWVieCw0CisJZGVjCWVicAorCWp6CU5FQVIgTCQwMjhhd19lbmQKKwk7IFRhaWwgUm91bmQgMQorCW1vdgllY3gsRFdPUkQgW2VzaV0KKwltb3YJZWR4LERXT1JEIFtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFtlYnhdLGVjeAorCWFkZAllc2ksNAorCWFkZAllZGksNAorCWFkZAllYngsNAorCWRlYwllYnAKKwlqeglORUFSIEwkMDI4YXdfZW5kCisJOyBUYWlsIFJvdW5kIDIKKwltb3YJZWN4LERXT1JEIFtlc2ldCisJbW92CWVkeCxEV09SRCBbZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbZWJ4XSxlY3gKKwlhZGQJZXNpLDQKKwlhZGQJZWRpLDQKKwlhZGQJZWJ4LDQKKwlkZWMJZWJwCisJanoJTkVBUiBMJDAyOGF3X2VuZAorCTsgVGFpbCBSb3VuZCAzCisJbW92CWVjeCxEV09SRCBbZXNpXQorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgW2VieF0sZWN4CisJYWRkCWVzaSw0CisJYWRkCWVkaSw0CisJYWRkCWVieCw0CisJZGVjCWVicAorCWp6CU5FQVIgTCQwMjhhd19lbmQKKwk7IFRhaWwgUm91bmQgNAorCW1vdgllY3gsRFdPUkQgW2VzaV0KKwltb3YJZWR4LERXT1JEIFtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFtlYnhdLGVjeAorCWFkZAllc2ksNAorCWFkZAllZGksNAorCWFkZAllYngsNAorCWRlYwllYnAKKwlqeglORUFSIEwkMDI4YXdfZW5kCisJOyBUYWlsIFJvdW5kIDUKKwltb3YJZWN4LERXT1JEIFtlc2ldCisJbW92CWVkeCxEV09SRCBbZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbZWJ4XSxlY3gKKwlhZGQJZXNpLDQKKwlhZGQJZWRpLDQKKwlhZGQJZWJ4LDQKKwlkZWMJZWJwCisJanoJTkVBUiBMJDAyOGF3X2VuZAorCTsgVGFpbCBSb3VuZCA2CisJbW92CWVjeCxEV09SRCBbZXNpXQorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgW2VieF0sZWN4CisJYWRkCWVzaSw0CisJYWRkCWVkaSw0CisJYWRkCWVieCw0CitMJDAyOGF3X2VuZDoKKwljbXAJRFdPUkQgWzM2K2VzcF0sMAorCWplCU5FQVIgTCQwMjlwd19lbmQKKwltb3YJZWJwLERXT1JEIFszNitlc3BdCisJY21wCWVicCwwCisJamUJTkVBUiBMJDAyOXB3X2VuZAorCWpnZQlORUFSIEwkMDMwcHdfcG9zCisJOyBwd19uZWcKKwltb3YJZWR4LDAKKwlzdWIJZWR4LGVicAorCW1vdgllYnAsZWR4CisJYW5kCWVicCw0Mjk0OTY3Mjg4CisJanoJTkVBUiBMJDAzMXB3X25lZ19maW5pc2gKK0wkMDMycHdfbmVnX2xvb3A6CisJOyBkbDwwIFJvdW5kIDAKKwltb3YJZWN4LDAKKwltb3YJZWR4LERXT1JEIFtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFtlYnhdLGVjeAorCTsgZGw8MCBSb3VuZCAxCisJbW92CWVjeCwwCisJbW92CWVkeCxEV09SRCBbNCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFs0K2VieF0sZWN4CisJOyBkbDwwIFJvdW5kIDIKKwltb3YJZWN4LDAKKwltb3YJZWR4LERXT1JEIFs4K2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzgrZWJ4XSxlY3gKKwk7IGRsPDAgUm91bmQgMworCW1vdgllY3gsMAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzEyK2VieF0sZWN4CisJOyBkbDwwIFJvdW5kIDQKKwltb3YJZWN4LDAKKwltb3YJZWR4LERXT1JEIFsxNitlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsxNitlYnhdLGVjeAorCTsgZGw8MCBSb3VuZCA1CisJbW92CWVjeCwwCisJbW92CWVkeCxEV09SRCBbMjArZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCW1vdglEV09SRCBbMjArZWJ4XSxlY3gKKwk7IGRsPDAgUm91bmQgNgorCW1vdgllY3gsMAorCW1vdgllZHgsRFdPUkQgWzI0K2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzI0K2VieF0sZWN4CisJOyBkbDwwIFJvdW5kIDcKKwltb3YJZWN4LDAKKwltb3YJZWR4LERXT1JEIFsyOCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJbW92CURXT1JEIFsyOCtlYnhdLGVjeAorCTsgCisJYWRkCWVkaSwzMgorCWFkZAllYngsMzIKKwlzdWIJZWJwLDgKKwlqbnoJTkVBUiBMJDAzMnB3X25lZ19sb29wCitMJDAzMXB3X25lZ19maW5pc2g6CisJbW92CWVkeCxEV09SRCBbMzYrZXNwXQorCW1vdgllYnAsMAorCXN1YgllYnAsZWR4CisJYW5kCWVicCw3CisJanoJTkVBUiBMJDAyOXB3X2VuZAorCTsgZGw8MCBUYWlsIFJvdW5kIDAKKwltb3YJZWN4LDAKKwltb3YJZWR4LERXT1JEIFtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJZGVjCWVicAorCW1vdglEV09SRCBbZWJ4XSxlY3gKKwlqeglORUFSIEwkMDI5cHdfZW5kCisJOyBkbDwwIFRhaWwgUm91bmQgMQorCW1vdgllY3gsMAorCW1vdgllZHgsRFdPUkQgWzQrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCWRlYwllYnAKKwltb3YJRFdPUkQgWzQrZWJ4XSxlY3gKKwlqeglORUFSIEwkMDI5cHdfZW5kCisJOyBkbDwwIFRhaWwgUm91bmQgMgorCW1vdgllY3gsMAorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCWRlYwllYnAKKwltb3YJRFdPUkQgWzgrZWJ4XSxlY3gKKwlqeglORUFSIEwkMDI5cHdfZW5kCisJOyBkbDwwIFRhaWwgUm91bmQgMworCW1vdgllY3gsMAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwlkZWMJZWJwCisJbW92CURXT1JEIFsxMitlYnhdLGVjeAorCWp6CU5FQVIgTCQwMjlwd19lbmQKKwk7IGRsPDAgVGFpbCBSb3VuZCA0CisJbW92CWVjeCwwCisJbW92CWVkeCxEV09SRCBbMTYrZWRpXQorCXN1YgllY3gsZWF4CisJbW92CWVheCwwCisJYWRjCWVheCxlYXgKKwlzdWIJZWN4LGVkeAorCWFkYwllYXgsMAorCWRlYwllYnAKKwltb3YJRFdPUkQgWzE2K2VieF0sZWN4CisJanoJTkVBUiBMJDAyOXB3X2VuZAorCTsgZGw8MCBUYWlsIFJvdW5kIDUKKwltb3YJZWN4LDAKKwltb3YJZWR4LERXT1JEIFsyMCtlZGldCisJc3ViCWVjeCxlYXgKKwltb3YJZWF4LDAKKwlhZGMJZWF4LGVheAorCXN1YgllY3gsZWR4CisJYWRjCWVheCwwCisJZGVjCWVicAorCW1vdglEV09SRCBbMjArZWJ4XSxlY3gKKwlqeglORUFSIEwkMDI5cHdfZW5kCisJOyBkbDwwIFRhaWwgUm91bmQgNgorCW1vdgllY3gsMAorCW1vdgllZHgsRFdPUkQgWzI0K2VkaV0KKwlzdWIJZWN4LGVheAorCW1vdgllYXgsMAorCWFkYwllYXgsZWF4CisJc3ViCWVjeCxlZHgKKwlhZGMJZWF4LDAKKwltb3YJRFdPUkQgWzI0K2VieF0sZWN4CisJam1wCU5FQVIgTCQwMjlwd19lbmQKK0wkMDMwcHdfcG9zOgorCWFuZAllYnAsNDI5NDk2NzI4OAorCWp6CU5FQVIgTCQwMzNwd19wb3NfZmluaXNoCitMJDAzNHB3X3Bvc19sb29wOgorCTsgZGw+MCBSb3VuZCAwCisJbW92CWVjeCxEV09SRCBbZXNpXQorCXN1YgllY3gsZWF4CisJbW92CURXT1JEIFtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDM1cHdfbmMwCisJOyBkbD4wIFJvdW5kIDEKKwltb3YJZWN4LERXT1JEIFs0K2VzaV0KKwlzdWIJZWN4LGVheAorCW1vdglEV09SRCBbNCtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDM2cHdfbmMxCisJOyBkbD4wIFJvdW5kIDIKKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwlzdWIJZWN4LGVheAorCW1vdglEV09SRCBbOCtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDM3cHdfbmMyCisJOyBkbD4wIFJvdW5kIDMKKwltb3YJZWN4LERXT1JEIFsxMitlc2ldCisJc3ViCWVjeCxlYXgKKwltb3YJRFdPUkQgWzEyK2VieF0sZWN4CisJam5jCU5FQVIgTCQwMzhwd19uYzMKKwk7IGRsPjAgUm91bmQgNAorCW1vdgllY3gsRFdPUkQgWzE2K2VzaV0KKwlzdWIJZWN4LGVheAorCW1vdglEV09SRCBbMTYrZWJ4XSxlY3gKKwlqbmMJTkVBUiBMJDAzOXB3X25jNAorCTsgZGw+MCBSb3VuZCA1CisJbW92CWVjeCxEV09SRCBbMjArZXNpXQorCXN1YgllY3gsZWF4CisJbW92CURXT1JEIFsyMCtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDQwcHdfbmM1CisJOyBkbD4wIFJvdW5kIDYKKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJc3ViCWVjeCxlYXgKKwltb3YJRFdPUkQgWzI0K2VieF0sZWN4CisJam5jCU5FQVIgTCQwNDFwd19uYzYKKwk7IGRsPjAgUm91bmQgNworCW1vdgllY3gsRFdPUkQgWzI4K2VzaV0KKwlzdWIJZWN4LGVheAorCW1vdglEV09SRCBbMjgrZWJ4XSxlY3gKKwlqbmMJTkVBUiBMJDA0MnB3X25jNworCTsgCisJYWRkCWVzaSwzMgorCWFkZAllYngsMzIKKwlzdWIJZWJwLDgKKwlqbnoJTkVBUiBMJDAzNHB3X3Bvc19sb29wCitMJDAzM3B3X3Bvc19maW5pc2g6CisJbW92CWVicCxEV09SRCBbMzYrZXNwXQorCWFuZAllYnAsNworCWp6CU5FQVIgTCQwMjlwd19lbmQKKwk7IGRsPjAgVGFpbCBSb3VuZCAwCisJbW92CWVjeCxEV09SRCBbZXNpXQorCXN1YgllY3gsZWF4CisJbW92CURXT1JEIFtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDQzcHdfdGFpbF9uYzAKKwlkZWMJZWJwCisJanoJTkVBUiBMJDAyOXB3X2VuZAorCTsgZGw+MCBUYWlsIFJvdW5kIDEKKwltb3YJZWN4LERXT1JEIFs0K2VzaV0KKwlzdWIJZWN4LGVheAorCW1vdglEV09SRCBbNCtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDQ0cHdfdGFpbF9uYzEKKwlkZWMJZWJwCisJanoJTkVBUiBMJDAyOXB3X2VuZAorCTsgZGw+MCBUYWlsIFJvdW5kIDIKKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwlzdWIJZWN4LGVheAorCW1vdglEV09SRCBbOCtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDQ1cHdfdGFpbF9uYzIKKwlkZWMJZWJwCisJanoJTkVBUiBMJDAyOXB3X2VuZAorCTsgZGw+MCBUYWlsIFJvdW5kIDMKKwltb3YJZWN4LERXT1JEIFsxMitlc2ldCisJc3ViCWVjeCxlYXgKKwltb3YJRFdPUkQgWzEyK2VieF0sZWN4CisJam5jCU5FQVIgTCQwNDZwd190YWlsX25jMworCWRlYwllYnAKKwlqeglORUFSIEwkMDI5cHdfZW5kCisJOyBkbD4wIFRhaWwgUm91bmQgNAorCW1vdgllY3gsRFdPUkQgWzE2K2VzaV0KKwlzdWIJZWN4LGVheAorCW1vdglEV09SRCBbMTYrZWJ4XSxlY3gKKwlqbmMJTkVBUiBMJDA0N3B3X3RhaWxfbmM0CisJZGVjCWVicAorCWp6CU5FQVIgTCQwMjlwd19lbmQKKwk7IGRsPjAgVGFpbCBSb3VuZCA1CisJbW92CWVjeCxEV09SRCBbMjArZXNpXQorCXN1YgllY3gsZWF4CisJbW92CURXT1JEIFsyMCtlYnhdLGVjeAorCWpuYwlORUFSIEwkMDQ4cHdfdGFpbF9uYzUKKwlkZWMJZWJwCisJanoJTkVBUiBMJDAyOXB3X2VuZAorCTsgZGw+MCBUYWlsIFJvdW5kIDYKKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJc3ViCWVjeCxlYXgKKwltb3YJRFdPUkQgWzI0K2VieF0sZWN4CisJam5jCU5FQVIgTCQwNDlwd190YWlsX25jNgorCW1vdgllYXgsMQorCWptcAlORUFSIEwkMDI5cHdfZW5kCitMJDA1MHB3X25jX2xvb3A6CisJbW92CWVjeCxEV09SRCBbZXNpXQorCW1vdglEV09SRCBbZWJ4XSxlY3gKK0wkMDM1cHdfbmMwOgorCW1vdgllY3gsRFdPUkQgWzQrZXNpXQorCW1vdglEV09SRCBbNCtlYnhdLGVjeAorTCQwMzZwd19uYzE6CisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CURXT1JEIFs4K2VieF0sZWN4CitMJDAzN3B3X25jMjoKKwltb3YJZWN4LERXT1JEIFsxMitlc2ldCisJbW92CURXT1JEIFsxMitlYnhdLGVjeAorTCQwMzhwd19uYzM6CisJbW92CWVjeCxEV09SRCBbMTYrZXNpXQorCW1vdglEV09SRCBbMTYrZWJ4XSxlY3gKK0wkMDM5cHdfbmM0OgorCW1vdgllY3gsRFdPUkQgWzIwK2VzaV0KKwltb3YJRFdPUkQgWzIwK2VieF0sZWN4CitMJDA0MHB3X25jNToKKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CURXT1JEIFsyNCtlYnhdLGVjeAorTCQwNDFwd19uYzY6CisJbW92CWVjeCxEV09SRCBbMjgrZXNpXQorCW1vdglEV09SRCBbMjgrZWJ4XSxlY3gKK0wkMDQycHdfbmM3OgorCTsgCisJYWRkCWVzaSwzMgorCWFkZAllYngsMzIKKwlzdWIJZWJwLDgKKwlqbnoJTkVBUiBMJDA1MHB3X25jX2xvb3AKKwltb3YJZWJwLERXT1JEIFszNitlc3BdCisJYW5kCWVicCw3CisJanoJTkVBUiBMJDA1MXB3X25jX2VuZAorCW1vdgllY3gsRFdPUkQgW2VzaV0KKwltb3YJRFdPUkQgW2VieF0sZWN4CitMJDA0M3B3X3RhaWxfbmMwOgorCWRlYwllYnAKKwlqeglORUFSIEwkMDUxcHdfbmNfZW5kCisJbW92CWVjeCxEV09SRCBbNCtlc2ldCisJbW92CURXT1JEIFs0K2VieF0sZWN4CitMJDA0NHB3X3RhaWxfbmMxOgorCWRlYwllYnAKKwlqeglORUFSIEwkMDUxcHdfbmNfZW5kCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CURXT1JEIFs4K2VieF0sZWN4CitMJDA0NXB3X3RhaWxfbmMyOgorCWRlYwllYnAKKwlqeglORUFSIEwkMDUxcHdfbmNfZW5kCisJbW92CWVjeCxEV09SRCBbMTIrZXNpXQorCW1vdglEV09SRCBbMTIrZWJ4XSxlY3gKK0wkMDQ2cHdfdGFpbF9uYzM6CisJZGVjCWVicAorCWp6CU5FQVIgTCQwNTFwd19uY19lbmQKKwltb3YJZWN4LERXT1JEIFsxNitlc2ldCisJbW92CURXT1JEIFsxNitlYnhdLGVjeAorTCQwNDdwd190YWlsX25jNDoKKwlkZWMJZWJwCisJanoJTkVBUiBMJDA1MXB3X25jX2VuZAorCW1vdgllY3gsRFdPUkQgWzIwK2VzaV0KKwltb3YJRFdPUkQgWzIwK2VieF0sZWN4CitMJDA0OHB3X3RhaWxfbmM1OgorCWRlYwllYnAKKwlqeglORUFSIEwkMDUxcHdfbmNfZW5kCisJbW92CWVjeCxEV09SRCBbMjQrZXNpXQorCW1vdglEV09SRCBbMjQrZWJ4XSxlY3gKK0wkMDQ5cHdfdGFpbF9uYzY6CitMJDA1MXB3X25jX2VuZDoKKwltb3YJZWF4LDAKK0wkMDI5cHdfZW5kOgorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK3NlZ21lbnQJLmJzcworY29tbW9uCV9PUEVOU1NMX2lhMzJjYXBfUCAxNgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2NvLTU4Ni5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvY28tNTg2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgwZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2NvLTU4Ni5hc20KQEAgLTAsMCArMSwxMjYwIEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorZ2xvYmFsCV9ibl9tdWxfY29tYmE4CithbGlnbgkxNgorX2JuX211bF9jb21iYTg6CitMJF9ibl9tdWxfY29tYmE4X2JlZ2luOgorCXB1c2gJZXNpCisJbW92CWVzaSxEV09SRCBbMTIrZXNwXQorCXB1c2gJZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXB1c2gJZWJwCisJcHVzaAllYngKKwl4b3IJZWJ4LGVieAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwl4b3IJZWN4LGVjeAorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwk7ICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAwCisJeG9yCWVicCxlYnAKKwk7IG11bCBhWzBdKmJbMF0KKwltdWwJZWR4CisJYWRkCWVieCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVjeCxlZHgKKwltb3YJZWR4LERXT1JEIFtlZGldCisJYWRjCWVicCwwCisJbW92CURXT1JEIFtlYXhdLGVieAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCTsgc2F2ZWQgclswXQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEKKwl4b3IJZWJ4LGVieAorCTsgbXVsIGFbMV0qYlswXQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzQrZWRpXQorCWFkYwllYngsMAorCTsgbXVsIGFbMF0qYlsxXQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwlhZGMJZWJ4LDAKKwltb3YJRFdPUkQgWzQrZWF4XSxlY3gKKwltb3YJZWF4LERXT1JEIFs4K2VzaV0KKwk7IHNhdmVkIHJbMV0KKwk7ICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAyCisJeG9yCWVjeCxlY3gKKwk7IG11bCBhWzJdKmJbMF0KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzQrZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbMV0qYlsxXQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbMF0qYlsyXQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwlhZGMJZWN4LDAKKwltb3YJRFdPUkQgWzgrZWF4XSxlYnAKKwltb3YJZWF4LERXT1JEIFsxMitlc2ldCisJOyBzYXZlZCByWzJdCisJOyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMworCXhvcgllYnAsZWJwCisJOyBtdWwgYVszXSpiWzBdCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbOCtlc2ldCisJYWRjCWVjeCxlZHgKKwltb3YJZWR4LERXT1JEIFs0K2VkaV0KKwlhZGMJZWJwLDAKKwk7IG11bCBhWzJdKmJbMV0KKwltdWwJZWR4CisJYWRkCWVieCxlYXgKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbMV0qYlsyXQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlhZGMJZWJwLDAKKwk7IG11bCBhWzBdKmJbM10KKwltdWwJZWR4CisJYWRkCWVieCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVjeCxlZHgKKwltb3YJZWR4LERXT1JEIFtlZGldCisJYWRjCWVicCwwCisJbW92CURXT1JEIFsxMitlYXhdLGVieAorCW1vdgllYXgsRFdPUkQgWzE2K2VzaV0KKwk7IHNhdmVkIHJbM10KKwk7ICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA0CisJeG9yCWVieCxlYngKKwk7IG11bCBhWzRdKmJbMF0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsxMitlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs0K2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzNdKmJbMV0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFs4K2VzaV0KKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCWFkYwllYngsMAorCTsgbXVsIGFbMl0qYlsyXQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCWFkYwllYngsMAorCTsgbXVsIGFbMV0qYlszXQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzE2K2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzBdKmJbNF0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFtlZGldCisJYWRjCWVieCwwCisJbW92CURXT1JEIFsxNitlYXhdLGVjeAorCW1vdgllYXgsRFdPUkQgWzIwK2VzaV0KKwk7IHNhdmVkIHJbNF0KKwk7ICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA1CisJeG9yCWVjeCxlY3gKKwk7IG11bCBhWzVdKmJbMF0KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFsxNitlc2ldCisJYWRjCWVieCxlZHgKKwltb3YJZWR4LERXT1JEIFs0K2VkaV0KKwlhZGMJZWN4LDAKKwk7IG11bCBhWzRdKmJbMV0KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFsxMitlc2ldCisJYWRjCWVieCxlZHgKKwltb3YJZWR4LERXT1JEIFs4K2VkaV0KKwlhZGMJZWN4LDAKKwk7IG11bCBhWzNdKmJbMl0KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFs4K2VzaV0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlhZGMJZWN4LDAKKwk7IG11bCBhWzJdKmJbM10KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzE2K2VkaV0KKwlhZGMJZWN4LDAKKwk7IG11bCBhWzFdKmJbNF0KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJYWRjCWVieCxlZHgKKwltb3YJZWR4LERXT1JEIFsyMCtlZGldCisJYWRjCWVjeCwwCisJOyBtdWwgYVswXSpiWzVdCisJbXVsCWVkeAorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNwXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbZWRpXQorCWFkYwllY3gsMAorCW1vdglEV09SRCBbMjArZWF4XSxlYnAKKwltb3YJZWF4LERXT1JEIFsyNCtlc2ldCisJOyBzYXZlZCByWzVdCisJOyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNgorCXhvcgllYnAsZWJwCisJOyBtdWwgYVs2XSpiWzBdCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbNCtlZGldCisJYWRjCWVicCwwCisJOyBtdWwgYVs1XSpiWzFdCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbOCtlZGldCisJYWRjCWVicCwwCisJOyBtdWwgYVs0XSpiWzJdCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbM10qYlszXQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMTYrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbMl0qYls0XQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMjArZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbMV0qYls1XQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzI0K2VkaV0KKwlhZGMJZWJwLDAKKwk7IG11bCBhWzBdKmJbNl0KKwltdWwJZWR4CisJYWRkCWVieCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVjeCxlZHgKKwltb3YJZWR4LERXT1JEIFtlZGldCisJYWRjCWVicCwwCisJbW92CURXT1JEIFsyNCtlYXhdLGVieAorCW1vdgllYXgsRFdPUkQgWzI4K2VzaV0KKwk7IHNhdmVkIHJbNl0KKwk7ICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA3CisJeG9yCWVieCxlYngKKwk7IG11bCBhWzddKmJbMF0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsyNCtlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs0K2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzZdKmJbMV0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs4K2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzVdKmJbMl0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsxNitlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFsxMitlZGldCisJYWRjCWVieCwwCisJOyBtdWwgYVs0XSpiWzNdCisJbXVsCWVkeAorCWFkZAllY3gsZWF4CisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMTYrZWRpXQorCWFkYwllYngsMAorCTsgbXVsIGFbM10qYls0XQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMjArZWRpXQorCWFkYwllYngsMAorCTsgbXVsIGFbMl0qYls1XQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMjQrZWRpXQorCWFkYwllYngsMAorCTsgbXVsIGFbMV0qYls2XQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzI4K2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzBdKmJbN10KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs0K2VkaV0KKwlhZGMJZWJ4LDAKKwltb3YJRFdPUkQgWzI4K2VheF0sZWN4CisJbW92CWVheCxEV09SRCBbMjgrZXNpXQorCTsgc2F2ZWQgcls3XQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDgKKwl4b3IJZWN4LGVjeAorCTsgbXVsIGFbN10qYlsxXQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzI0K2VzaV0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbNl0qYlsyXQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzaV0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlhZGMJZWN4LDAKKwk7IG11bCBhWzVdKmJbM10KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFsxNitlc2ldCisJYWRjCWVieCxlZHgKKwltb3YJZWR4LERXT1JEIFsxNitlZGldCisJYWRjCWVjeCwwCisJOyBtdWwgYVs0XSpiWzRdCisJbXVsCWVkeAorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbMjArZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbM10qYls1XQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbMjQrZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbMl0qYls2XQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbMjgrZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbMV0qYls3XQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzgrZWRpXQorCWFkYwllY3gsMAorCW1vdglEV09SRCBbMzIrZWF4XSxlYnAKKwltb3YJZWF4LERXT1JEIFsyOCtlc2ldCisJOyBzYXZlZCByWzhdCisJOyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgOQorCXhvcgllYnAsZWJwCisJOyBtdWwgYVs3XSpiWzJdCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbMjQrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbNl0qYlszXQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzaV0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzE2K2VkaV0KKwlhZGMJZWJwLDAKKwk7IG11bCBhWzVdKmJbNF0KKwltdWwJZWR4CisJYWRkCWVieCxlYXgKKwltb3YJZWF4LERXT1JEIFsxNitlc2ldCisJYWRjCWVjeCxlZHgKKwltb3YJZWR4LERXT1JEIFsyMCtlZGldCisJYWRjCWVicCwwCisJOyBtdWwgYVs0XSpiWzVdCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMjQrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbM10qYls2XQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMjgrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbMl0qYls3XQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlhZGMJZWJwLDAKKwltb3YJRFdPUkQgWzM2K2VheF0sZWJ4CisJbW92CWVheCxEV09SRCBbMjgrZXNpXQorCTsgc2F2ZWQgcls5XQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEwCisJeG9yCWVieCxlYngKKwk7IG11bCBhWzddKmJbM10KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsyNCtlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFsxNitlZGldCisJYWRjCWVieCwwCisJOyBtdWwgYVs2XSpiWzRdCisJbXVsCWVkeAorCWFkZAllY3gsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNpXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMjArZWRpXQorCWFkYwllYngsMAorCTsgbXVsIGFbNV0qYls1XQorCW11bAllZHgKKwlhZGQJZWN4LGVheAorCW1vdgllYXgsRFdPUkQgWzE2K2VzaV0KKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzI0K2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzRdKmJbNl0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsxMitlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFsyOCtlZGldCisJYWRjCWVieCwwCisJOyBtdWwgYVszXSpiWzddCisJbXVsCWVkeAorCWFkZAllY3gsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNwXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMTYrZWRpXQorCWFkYwllYngsMAorCW1vdglEV09SRCBbNDArZWF4XSxlY3gKKwltb3YJZWF4LERXT1JEIFsyOCtlc2ldCisJOyBzYXZlZCByWzEwXQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDExCisJeG9yCWVjeCxlY3gKKwk7IG11bCBhWzddKmJbNF0KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFsyNCtlc2ldCisJYWRjCWVieCxlZHgKKwltb3YJZWR4LERXT1JEIFsyMCtlZGldCisJYWRjCWVjeCwwCisJOyBtdWwgYVs2XSpiWzVdCisJbXVsCWVkeAorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNpXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbMjQrZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbNV0qYls2XQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzE2K2VzaV0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzI4K2VkaV0KKwlhZGMJZWN4LDAKKwk7IG11bCBhWzRdKmJbN10KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVieCxlZHgKKwltb3YJZWR4LERXT1JEIFsyMCtlZGldCisJYWRjCWVjeCwwCisJbW92CURXT1JEIFs0NCtlYXhdLGVicAorCW1vdgllYXgsRFdPUkQgWzI4K2VzaV0KKwk7IHNhdmVkIHJbMTFdCisJOyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMTIKKwl4b3IJZWJwLGVicAorCTsgbXVsIGFbN10qYls1XQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzI0K2VzaV0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzI0K2VkaV0KKwlhZGMJZWJwLDAKKwk7IG11bCBhWzZdKmJbNl0KKwltdWwJZWR4CisJYWRkCWVieCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc2ldCisJYWRjCWVjeCxlZHgKKwltb3YJZWR4LERXT1JEIFsyOCtlZGldCisJYWRjCWVicCwwCisJOyBtdWwgYVs1XSpiWzddCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNwXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMjQrZWRpXQorCWFkYwllYnAsMAorCW1vdglEV09SRCBbNDgrZWF4XSxlYngKKwltb3YJZWF4LERXT1JEIFsyOCtlc2ldCisJOyBzYXZlZCByWzEyXQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEzCisJeG9yCWVieCxlYngKKwk7IG11bCBhWzddKmJbNl0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsyNCtlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFsyOCtlZGldCisJYWRjCWVieCwwCisJOyBtdWwgYVs2XSpiWzddCisJbXVsCWVkeAorCWFkZAllY3gsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNwXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMjgrZWRpXQorCWFkYwllYngsMAorCW1vdglEV09SRCBbNTIrZWF4XSxlY3gKKwltb3YJZWF4LERXT1JEIFsyOCtlc2ldCisJOyBzYXZlZCByWzEzXQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDE0CisJeG9yCWVjeCxlY3gKKwk7IG11bCBhWzddKmJbN10KKwltdWwJZWR4CisJYWRkCWVicCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVieCxlZHgKKwlhZGMJZWN4LDAKKwltb3YJRFdPUkQgWzU2K2VheF0sZWJwCisJOyBzYXZlZCByWzE0XQorCTsgc2F2ZSByWzE1XQorCW1vdglEV09SRCBbNjArZWF4XSxlYngKKwlwb3AJZWJ4CisJcG9wCWVicAorCXBvcAllZGkKKwlwb3AJZXNpCisJcmV0CitnbG9iYWwJX2JuX211bF9jb21iYTQKK2FsaWduCTE2CitfYm5fbXVsX2NvbWJhNDoKK0wkX2JuX211bF9jb21iYTRfYmVnaW46CisJcHVzaAllc2kKKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJcHVzaAllZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJcHVzaAllYnAKKwlwdXNoCWVieAorCXhvcgllYngsZWJ4CisJbW92CWVheCxEV09SRCBbZXNpXQorCXhvcgllY3gsZWN4CisJbW92CWVkeCxEV09SRCBbZWRpXQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDAKKwl4b3IJZWJwLGVicAorCTsgbXVsIGFbMF0qYlswXQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgW2VkaV0KKwlhZGMJZWJwLDAKKwltb3YJRFdPUkQgW2VheF0sZWJ4CisJbW92CWVheCxEV09SRCBbNCtlc2ldCisJOyBzYXZlZCByWzBdCisJOyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMQorCXhvcgllYngsZWJ4CisJOyBtdWwgYVsxXSpiWzBdCisJbXVsCWVkeAorCWFkZAllY3gsZWF4CisJbW92CWVheCxEV09SRCBbZXNpXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbNCtlZGldCisJYWRjCWVieCwwCisJOyBtdWwgYVswXSpiWzFdCisJbXVsCWVkeAorCWFkZAllY3gsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNwXQorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbZWRpXQorCWFkYwllYngsMAorCW1vdglEV09SRCBbNCtlYXhdLGVjeAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCTsgc2F2ZWQgclsxXQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDIKKwl4b3IJZWN4LGVjeAorCTsgbXVsIGFbMl0qYlswXQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbNCtlZGldCisJYWRjCWVjeCwwCisJOyBtdWwgYVsxXSpiWzFdCisJbXVsCWVkeAorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbZXNpXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbOCtlZGldCisJYWRjCWVjeCwwCisJOyBtdWwgYVswXSpiWzJdCisJbXVsCWVkeAorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbMjArZXNwXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbZWRpXQorCWFkYwllY3gsMAorCW1vdglEV09SRCBbOCtlYXhdLGVicAorCW1vdgllYXgsRFdPUkQgWzEyK2VzaV0KKwk7IHNhdmVkIHJbMl0KKwk7ICMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAzCisJeG9yCWVicCxlYnAKKwk7IG11bCBhWzNdKmJbMF0KKwltdWwJZWR4CisJYWRkCWVieCxlYXgKKwltb3YJZWF4LERXT1JEIFs4K2VzaV0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzQrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbMl0qYlsxXQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbOCtlZGldCisJYWRjCWVicCwwCisJOyBtdWwgYVsxXSpiWzJdCisJbXVsCWVkeAorCWFkZAllYngsZWF4CisJbW92CWVheCxEV09SRCBbZXNpXQorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCWFkYwllYnAsMAorCTsgbXVsIGFbMF0qYlszXQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzQrZWRpXQorCWFkYwllYnAsMAorCW1vdglEV09SRCBbMTIrZWF4XSxlYngKKwltb3YJZWF4LERXT1JEIFsxMitlc2ldCisJOyBzYXZlZCByWzNdCisJOyAjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNAorCXhvcgllYngsZWJ4CisJOyBtdWwgYVszXSpiWzFdCisJbXVsCWVkeAorCWFkZAllY3gsZWF4CisJbW92CWVheCxEV09SRCBbOCtlc2ldCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs4K2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzJdKmJbMl0KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlhZGMJZWJ4LDAKKwk7IG11bCBhWzFdKmJbM10KKwltdWwJZWR4CisJYWRkCWVjeCxlYXgKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs4K2VkaV0KKwlhZGMJZWJ4LDAKKwltb3YJRFdPUkQgWzE2K2VheF0sZWN4CisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCTsgc2F2ZWQgcls0XQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDUKKwl4b3IJZWN4LGVjeAorCTsgbXVsIGFbM10qYlsyXQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllYngsZWR4CisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCWFkYwllY3gsMAorCTsgbXVsIGFbMl0qYlszXQorCW11bAllZHgKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlhZGMJZWN4LDAKKwltb3YJRFdPUkQgWzIwK2VheF0sZWJwCisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCTsgc2F2ZWQgcls1XQorCTsgIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDYKKwl4b3IJZWJwLGVicAorCTsgbXVsIGFbM10qYlszXQorCW11bAllZHgKKwlhZGQJZWJ4LGVheAorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWN4LGVkeAorCWFkYwllYnAsMAorCW1vdglEV09SRCBbMjQrZWF4XSxlYngKKwk7IHNhdmVkIHJbNl0KKwk7IHNhdmUgcls3XQorCW1vdglEV09SRCBbMjgrZWF4XSxlY3gKKwlwb3AJZWJ4CisJcG9wCWVicAorCXBvcAllZGkKKwlwb3AJZXNpCisJcmV0CitnbG9iYWwJX2JuX3Nxcl9jb21iYTgKK2FsaWduCTE2CitfYm5fc3FyX2NvbWJhODoKK0wkX2JuX3Nxcl9jb21iYThfYmVnaW46CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCXB1c2gJZWJwCisJcHVzaAllYngKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJbW92CWVzaSxEV09SRCBbMjQrZXNwXQorCXhvcgllYngsZWJ4CisJeG9yCWVjeCxlY3gKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMAorCXhvcgllYnAsZWJwCisJOyBzcXIgYVswXSphWzBdCisJbXVsCWVheAorCWFkZAllYngsZWF4CisJYWRjCWVjeCxlZHgKKwltb3YJZWR4LERXT1JEIFtlc2ldCisJYWRjCWVicCwwCisJbW92CURXT1JEIFtlZGldLGVieAorCW1vdgllYXgsRFdPUkQgWzQrZXNpXQorCTsgc2F2ZWQgclswXQorCTsgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEKKwl4b3IJZWJ4LGVieAorCTsgc3FyIGFbMV0qYVswXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVieCwwCisJYWRkCWVjeCxlYXgKKwlhZGMJZWJwLGVkeAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllYngsMAorCW1vdglEV09SRCBbNCtlZGldLGVjeAorCW1vdgllZHgsRFdPUkQgW2VzaV0KKwk7IHNhdmVkIHJbMV0KKwk7ICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAyCisJeG9yCWVjeCxlY3gKKwk7IHNxciBhWzJdKmFbMF0KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllY3gsMAorCWFkZAllYnAsZWF4CisJYWRjCWVieCxlZHgKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlhZGMJZWN4LDAKKwk7IHNxciBhWzFdKmFbMV0KKwltdWwJZWF4CisJYWRkCWVicCxlYXgKKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgW2VzaV0KKwlhZGMJZWN4LDAKKwltb3YJRFdPUkQgWzgrZWRpXSxlYnAKKwltb3YJZWF4LERXT1JEIFsxMitlc2ldCisJOyBzYXZlZCByWzJdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMworCXhvcgllYnAsZWJwCisJOyBzcXIgYVszXSphWzBdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJwLDAKKwlhZGQJZWJ4LGVheAorCWFkYwllY3gsZWR4CisJbW92CWVheCxEV09SRCBbOCtlc2ldCisJYWRjCWVicCwwCisJbW92CWVkeCxEV09SRCBbNCtlc2ldCisJOyBzcXIgYVsyXSphWzFdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJwLDAKKwlhZGQJZWJ4LGVheAorCWFkYwllY3gsZWR4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCWFkYwllYnAsMAorCW1vdglEV09SRCBbMTIrZWRpXSxlYngKKwltb3YJZWR4LERXT1JEIFtlc2ldCisJOyBzYXZlZCByWzNdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNAorCXhvcgllYngsZWJ4CisJOyBzcXIgYVs0XSphWzBdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJ4LDAKKwlhZGQJZWN4LGVheAorCWFkYwllYnAsZWR4CisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCWFkYwllYngsMAorCW1vdgllZHgsRFdPUkQgWzQrZXNpXQorCTsgc3FyIGFbM10qYVsxXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVieCwwCisJYWRkCWVjeCxlYXgKKwlhZGMJZWJwLGVkeAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllYngsMAorCTsgc3FyIGFbMl0qYVsyXQorCW11bAllYXgKKwlhZGQJZWN4LGVheAorCWFkYwllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbZXNpXQorCWFkYwllYngsMAorCW1vdglEV09SRCBbMTYrZWRpXSxlY3gKKwltb3YJZWF4LERXT1JEIFsyMCtlc2ldCisJOyBzYXZlZCByWzRdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNQorCXhvcgllY3gsZWN4CisJOyBzcXIgYVs1XSphWzBdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWN4LDAKKwlhZGQJZWJwLGVheAorCWFkYwllYngsZWR4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCWFkYwllY3gsMAorCW1vdgllZHgsRFdPUkQgWzQrZXNpXQorCTsgc3FyIGFbNF0qYVsxXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVjeCwwCisJYWRkCWVicCxlYXgKKwlhZGMJZWJ4LGVkeAorCW1vdgllYXgsRFdPUkQgWzEyK2VzaV0KKwlhZGMJZWN4LDAKKwltb3YJZWR4LERXT1JEIFs4K2VzaV0KKwk7IHNxciBhWzNdKmFbMl0KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllY3gsMAorCWFkZAllYnAsZWF4CisJYWRjCWVieCxlZHgKKwltb3YJZWF4LERXT1JEIFsyNCtlc2ldCisJYWRjCWVjeCwwCisJbW92CURXT1JEIFsyMCtlZGldLGVicAorCW1vdgllZHgsRFdPUkQgW2VzaV0KKwk7IHNhdmVkIHJbNV0KKwk7ICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCA2CisJeG9yCWVicCxlYnAKKwk7IHNxciBhWzZdKmFbMF0KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllYnAsMAorCWFkZAllYngsZWF4CisJYWRjCWVjeCxlZHgKKwltb3YJZWF4LERXT1JEIFsyMCtlc2ldCisJYWRjCWVicCwwCisJbW92CWVkeCxEV09SRCBbNCtlc2ldCisJOyBzcXIgYVs1XSphWzFdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJwLDAKKwlhZGQJZWJ4LGVheAorCWFkYwllY3gsZWR4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCWFkYwllYnAsMAorCW1vdgllZHgsRFdPUkQgWzgrZXNpXQorCTsgc3FyIGFbNF0qYVsyXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVicCwwCisJYWRkCWVieCxlYXgKKwlhZGMJZWN4LGVkeAorCW1vdgllYXgsRFdPUkQgWzEyK2VzaV0KKwlhZGMJZWJwLDAKKwk7IHNxciBhWzNdKmFbM10KKwltdWwJZWF4CisJYWRkCWVieCxlYXgKKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgW2VzaV0KKwlhZGMJZWJwLDAKKwltb3YJRFdPUkQgWzI0K2VkaV0sZWJ4CisJbW92CWVheCxEV09SRCBbMjgrZXNpXQorCTsgc2F2ZWQgcls2XQorCTsgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDcKKwl4b3IJZWJ4LGVieAorCTsgc3FyIGFbN10qYVswXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVieCwwCisJYWRkCWVjeCxlYXgKKwlhZGMJZWJwLGVkeAorCW1vdgllYXgsRFdPUkQgWzI0K2VzaV0KKwlhZGMJZWJ4LDAKKwltb3YJZWR4LERXT1JEIFs0K2VzaV0KKwk7IHNxciBhWzZdKmFbMV0KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllYngsMAorCWFkZAllY3gsZWF4CisJYWRjCWVicCxlZHgKKwltb3YJZWF4LERXT1JEIFsyMCtlc2ldCisJYWRjCWVieCwwCisJbW92CWVkeCxEV09SRCBbOCtlc2ldCisJOyBzcXIgYVs1XSphWzJdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJ4LDAKKwlhZGQJZWN4LGVheAorCWFkYwllYnAsZWR4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCWFkYwllYngsMAorCW1vdgllZHgsRFdPUkQgWzEyK2VzaV0KKwk7IHNxciBhWzRdKmFbM10KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllYngsMAorCWFkZAllY3gsZWF4CisJYWRjCWVicCxlZHgKKwltb3YJZWF4LERXT1JEIFsyOCtlc2ldCisJYWRjCWVieCwwCisJbW92CURXT1JEIFsyOCtlZGldLGVjeAorCW1vdgllZHgsRFdPUkQgWzQrZXNpXQorCTsgc2F2ZWQgcls3XQorCTsgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDgKKwl4b3IJZWN4LGVjeAorCTsgc3FyIGFbN10qYVsxXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVjeCwwCisJYWRkCWVicCxlYXgKKwlhZGMJZWJ4LGVkeAorCW1vdgllYXgsRFdPUkQgWzI0K2VzaV0KKwlhZGMJZWN4LDAKKwltb3YJZWR4LERXT1JEIFs4K2VzaV0KKwk7IHNxciBhWzZdKmFbMl0KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllY3gsMAorCWFkZAllYnAsZWF4CisJYWRjCWVieCxlZHgKKwltb3YJZWF4LERXT1JEIFsyMCtlc2ldCisJYWRjCWVjeCwwCisJbW92CWVkeCxEV09SRCBbMTIrZXNpXQorCTsgc3FyIGFbNV0qYVszXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVjeCwwCisJYWRkCWVicCxlYXgKKwlhZGMJZWJ4LGVkeAorCW1vdgllYXgsRFdPUkQgWzE2K2VzaV0KKwlhZGMJZWN4LDAKKwk7IHNxciBhWzRdKmFbNF0KKwltdWwJZWF4CisJYWRkCWVicCxlYXgKKwlhZGMJZWJ4LGVkeAorCW1vdgllZHgsRFdPUkQgWzgrZXNpXQorCWFkYwllY3gsMAorCW1vdglEV09SRCBbMzIrZWRpXSxlYnAKKwltb3YJZWF4LERXT1JEIFsyOCtlc2ldCisJOyBzYXZlZCByWzhdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgOQorCXhvcgllYnAsZWJwCisJOyBzcXIgYVs3XSphWzJdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJwLDAKKwlhZGQJZWJ4LGVheAorCWFkYwllY3gsZWR4CisJbW92CWVheCxEV09SRCBbMjQrZXNpXQorCWFkYwllYnAsMAorCW1vdgllZHgsRFdPUkQgWzEyK2VzaV0KKwk7IHNxciBhWzZdKmFbM10KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllYnAsMAorCWFkZAllYngsZWF4CisJYWRjCWVjeCxlZHgKKwltb3YJZWF4LERXT1JEIFsyMCtlc2ldCisJYWRjCWVicCwwCisJbW92CWVkeCxEV09SRCBbMTYrZXNpXQorCTsgc3FyIGFbNV0qYVs0XQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVicCwwCisJYWRkCWVieCxlYXgKKwlhZGMJZWN4LGVkeAorCW1vdgllYXgsRFdPUkQgWzI4K2VzaV0KKwlhZGMJZWJwLDAKKwltb3YJRFdPUkQgWzM2K2VkaV0sZWJ4CisJbW92CWVkeCxEV09SRCBbMTIrZXNpXQorCTsgc2F2ZWQgcls5XQorCTsgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDEwCisJeG9yCWVieCxlYngKKwk7IHNxciBhWzddKmFbM10KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllYngsMAorCWFkZAllY3gsZWF4CisJYWRjCWVicCxlZHgKKwltb3YJZWF4LERXT1JEIFsyNCtlc2ldCisJYWRjCWVieCwwCisJbW92CWVkeCxEV09SRCBbMTYrZXNpXQorCTsgc3FyIGFbNl0qYVs0XQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVieCwwCisJYWRkCWVjeCxlYXgKKwlhZGMJZWJwLGVkeAorCW1vdgllYXgsRFdPUkQgWzIwK2VzaV0KKwlhZGMJZWJ4LDAKKwk7IHNxciBhWzVdKmFbNV0KKwltdWwJZWF4CisJYWRkCWVjeCxlYXgKKwlhZGMJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzE2K2VzaV0KKwlhZGMJZWJ4LDAKKwltb3YJRFdPUkQgWzQwK2VkaV0sZWN4CisJbW92CWVheCxEV09SRCBbMjgrZXNpXQorCTsgc2F2ZWQgclsxMF0KKwk7ICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAxMQorCXhvcgllY3gsZWN4CisJOyBzcXIgYVs3XSphWzRdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWN4LDAKKwlhZGQJZWJwLGVheAorCWFkYwllYngsZWR4CisJbW92CWVheCxEV09SRCBbMjQrZXNpXQorCWFkYwllY3gsMAorCW1vdgllZHgsRFdPUkQgWzIwK2VzaV0KKwk7IHNxciBhWzZdKmFbNV0KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllY3gsMAorCWFkZAllYnAsZWF4CisJYWRjCWVieCxlZHgKKwltb3YJZWF4LERXT1JEIFsyOCtlc2ldCisJYWRjCWVjeCwwCisJbW92CURXT1JEIFs0NCtlZGldLGVicAorCW1vdgllZHgsRFdPUkQgWzIwK2VzaV0KKwk7IHNhdmVkIHJbMTFdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMTIKKwl4b3IJZWJwLGVicAorCTsgc3FyIGFbN10qYVs1XQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVicCwwCisJYWRkCWVieCxlYXgKKwlhZGMJZWN4LGVkeAorCW1vdgllYXgsRFdPUkQgWzI0K2VzaV0KKwlhZGMJZWJwLDAKKwk7IHNxciBhWzZdKmFbNl0KKwltdWwJZWF4CisJYWRkCWVieCxlYXgKKwlhZGMJZWN4LGVkeAorCW1vdgllZHgsRFdPUkQgWzI0K2VzaV0KKwlhZGMJZWJwLDAKKwltb3YJRFdPUkQgWzQ4K2VkaV0sZWJ4CisJbW92CWVheCxEV09SRCBbMjgrZXNpXQorCTsgc2F2ZWQgclsxMl0KKwk7ICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAxMworCXhvcgllYngsZWJ4CisJOyBzcXIgYVs3XSphWzZdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJ4LDAKKwlhZGQJZWN4LGVheAorCWFkYwllYnAsZWR4CisJbW92CWVheCxEV09SRCBbMjgrZXNpXQorCWFkYwllYngsMAorCW1vdglEV09SRCBbNTIrZWRpXSxlY3gKKwk7IHNhdmVkIHJbMTNdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMTQKKwl4b3IJZWN4LGVjeAorCTsgc3FyIGFbN10qYVs3XQorCW11bAllYXgKKwlhZGQJZWJwLGVheAorCWFkYwllYngsZWR4CisJYWRjCWVjeCwwCisJbW92CURXT1JEIFs1NitlZGldLGVicAorCTsgc2F2ZWQgclsxNF0KKwltb3YJRFdPUkQgWzYwK2VkaV0sZWJ4CisJcG9wCWVieAorCXBvcAllYnAKKwlwb3AJZWRpCisJcG9wCWVzaQorCXJldAorZ2xvYmFsCV9ibl9zcXJfY29tYmE0CithbGlnbgkxNgorX2JuX3Nxcl9jb21iYTQ6CitMJF9ibl9zcXJfY29tYmE0X2JlZ2luOgorCXB1c2gJZXNpCisJcHVzaAllZGkKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWJ4LGVieAorCXhvcgllY3gsZWN4CisJbW92CWVheCxEV09SRCBbZXNpXQorCTsgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDAKKwl4b3IJZWJwLGVicAorCTsgc3FyIGFbMF0qYVswXQorCW11bAllYXgKKwlhZGQJZWJ4LGVheAorCWFkYwllY3gsZWR4CisJbW92CWVkeCxEV09SRCBbZXNpXQorCWFkYwllYnAsMAorCW1vdglEV09SRCBbZWRpXSxlYngKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwk7IHNhdmVkIHJbMF0KKwk7ICMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAxCisJeG9yCWVieCxlYngKKwk7IHNxciBhWzFdKmFbMF0KKwltdWwJZWR4CisJYWRkCWVheCxlYXgKKwlhZGMJZWR4LGVkeAorCWFkYwllYngsMAorCWFkZAllY3gsZWF4CisJYWRjCWVicCxlZHgKKwltb3YJZWF4LERXT1JEIFs4K2VzaV0KKwlhZGMJZWJ4LDAKKwltb3YJRFdPUkQgWzQrZWRpXSxlY3gKKwltb3YJZWR4LERXT1JEIFtlc2ldCisJOyBzYXZlZCByWzFdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgMgorCXhvcgllY3gsZWN4CisJOyBzcXIgYVsyXSphWzBdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWN4LDAKKwlhZGQJZWJwLGVheAorCWFkYwllYngsZWR4CisJbW92CWVheCxEV09SRCBbNCtlc2ldCisJYWRjCWVjeCwwCisJOyBzcXIgYVsxXSphWzFdCisJbXVsCWVheAorCWFkZAllYnAsZWF4CisJYWRjCWVieCxlZHgKKwltb3YJZWR4LERXT1JEIFtlc2ldCisJYWRjCWVjeCwwCisJbW92CURXT1JEIFs4K2VkaV0sZWJwCisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCTsgc2F2ZWQgclsyXQorCTsgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDMKKwl4b3IJZWJwLGVicAorCTsgc3FyIGFbM10qYVswXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVicCwwCisJYWRkCWVieCxlYXgKKwlhZGMJZWN4LGVkeAorCW1vdgllYXgsRFdPUkQgWzgrZXNpXQorCWFkYwllYnAsMAorCW1vdgllZHgsRFdPUkQgWzQrZXNpXQorCTsgc3FyIGFbMl0qYVsxXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVicCwwCisJYWRkCWVieCxlYXgKKwlhZGMJZWN4LGVkeAorCW1vdgllYXgsRFdPUkQgWzEyK2VzaV0KKwlhZGMJZWJwLDAKKwltb3YJRFdPUkQgWzEyK2VkaV0sZWJ4CisJbW92CWVkeCxEV09SRCBbNCtlc2ldCisJOyBzYXZlZCByWzNdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNAorCXhvcgllYngsZWJ4CisJOyBzcXIgYVszXSphWzFdCisJbXVsCWVkeAorCWFkZAllYXgsZWF4CisJYWRjCWVkeCxlZHgKKwlhZGMJZWJ4LDAKKwlhZGQJZWN4LGVheAorCWFkYwllYnAsZWR4CisJbW92CWVheCxEV09SRCBbOCtlc2ldCisJYWRjCWVieCwwCisJOyBzcXIgYVsyXSphWzJdCisJbXVsCWVheAorCWFkZAllY3gsZWF4CisJYWRjCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs4K2VzaV0KKwlhZGMJZWJ4LDAKKwltb3YJRFdPUkQgWzE2K2VkaV0sZWN4CisJbW92CWVheCxEV09SRCBbMTIrZXNpXQorCTsgc2F2ZWQgcls0XQorCTsgIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSB3b3JkIDUKKwl4b3IJZWN4LGVjeAorCTsgc3FyIGFbM10qYVsyXQorCW11bAllZHgKKwlhZGQJZWF4LGVheAorCWFkYwllZHgsZWR4CisJYWRjCWVjeCwwCisJYWRkCWVicCxlYXgKKwlhZGMJZWJ4LGVkeAorCW1vdgllYXgsRFdPUkQgWzEyK2VzaV0KKwlhZGMJZWN4LDAKKwltb3YJRFdPUkQgWzIwK2VkaV0sZWJwCisJOyBzYXZlZCByWzVdCisJOyAjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgNgorCXhvcgllYnAsZWJwCisJOyBzcXIgYVszXSphWzNdCisJbXVsCWVheAorCWFkZAllYngsZWF4CisJYWRjCWVjeCxlZHgKKwlhZGMJZWJwLDAKKwltb3YJRFdPUkQgWzI0K2VkaV0sZWJ4CisJOyBzYXZlZCByWzZdCisJbW92CURXT1JEIFsyOCtlZGldLGVjeAorCXBvcAllYngKKwlwb3AJZWJwCisJcG9wCWVkaQorCXBvcAllc2kKKwlyZXQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODYuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Ni5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzNTBkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODYuYXNtCkBAIC0wLDAgKzEsMTA2NiBAQAorJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLG9iagorc2VjdGlvbgljb2RlCXVzZTMyIGNsYXNzPWNvZGUgYWxpZ249NjQKKyVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHdpbjMyCislaWZkZWYgX19ZQVNNX1ZFUlNJT05fSURfXworJWlmIF9fWUFTTV9WRVJTSU9OX0lEX18gPCAwMTAxMDAwMGgKKyVlcnJvciB5YXNtIHZlcnNpb24gMS4xLjAgb3IgbGF0ZXIgbmVlZGVkLgorJWVuZGlmCis7IFlhc20gYXV0b21hdGljYWxseSBpbmNsdWRlcyAuMDAgYW5kIGNvbXBsYWlucyBhYm91dCByZWRlZmluaW5nIGl0LgorOyBodHRwczovL3d3dy50b3J0YWxsLm5ldC9wcm9qZWN0cy95YXNtL21hbnVhbC9odG1sL29iamZtdC13aW4zMi1zYWZlc2VoLmh0bWwKKyVlbHNlCiskQGZlYXQuMDAgZXF1IDEKKyVlbmRpZgorc2VjdGlvbgkudGV4dAljb2RlIGFsaWduPTY0CislZWxzZQorc2VjdGlvbgkudGV4dAljb2RlCislZW5kaWYKK2dsb2JhbAlfZ2NtX2dtdWx0XzRiaXRfbW14CithbGlnbgkxNgorX2djbV9nbXVsdF80Yml0X21teDoKK0wkX2djbV9nbXVsdF80Yml0X21teF9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwltb3YJZXNpLERXT1JEIFsyNCtlc3BdCisJY2FsbAlMJDAwMHBpY19wb2ludAorTCQwMDBwaWNfcG9pbnQ6CisJcG9wCWVheAorCWxlYQllYXgsWyhMJHJlbV80Yml0LUwkMDAwcGljX3BvaW50KStlYXhdCisJbW92engJZWJ4LEJZVEUgWzE1K2VkaV0KKwl4b3IJZWN4LGVjeAorCW1vdgllZHgsZWJ4CisJbW92CWNsLGRsCisJbW92CWVicCwxNAorCXNobAljbCw0CisJYW5kCWVkeCwyNDAKKwltb3ZxCW1tMCxbOCtlY3gqMStlc2ldCisJbW92cQltbTEsW2VjeCoxK2VzaV0KKwltb3ZkCWVieCxtbTAKKwlqbXAJTkVBUiBMJDAwMW1teF9sb29wCithbGlnbgkxNgorTCQwMDFtbXhfbG9vcDoKKwlwc3JscQltbTAsNAorCWFuZAllYngsMTUKKwltb3ZxCW1tMixtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW0wLFs4K2VkeCoxK2VzaV0KKwltb3YJY2wsQllURSBbZWJwKjErZWRpXQorCXBzbGxxCW1tMiw2MAorCXB4b3IJbW0xLFtlYngqOCtlYXhdCisJZGVjCWVicAorCW1vdmQJZWJ4LG1tMAorCXB4b3IJbW0xLFtlZHgqMStlc2ldCisJbW92CWVkeCxlY3gKKwlweG9yCW1tMCxtbTIKKwlqcwlORUFSIEwkMDAybW14X2JyZWFrCisJc2hsCWNsLDQKKwlhbmQJZWJ4LDE1CisJcHNybHEJbW0wLDQKKwlhbmQJZWR4LDI0MAorCW1vdnEJbW0yLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTAsWzgrZWN4KjErZXNpXQorCXBzbGxxCW1tMiw2MAorCXB4b3IJbW0xLFtlYngqOCtlYXhdCisJbW92ZAllYngsbW0wCisJcHhvcgltbTEsW2VjeCoxK2VzaV0KKwlweG9yCW1tMCxtbTIKKwlqbXAJTkVBUiBMJDAwMW1teF9sb29wCithbGlnbgkxNgorTCQwMDJtbXhfYnJlYWs6CisJc2hsCWNsLDQKKwlhbmQJZWJ4LDE1CisJcHNybHEJbW0wLDQKKwlhbmQJZWR4LDI0MAorCW1vdnEJbW0yLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTAsWzgrZWN4KjErZXNpXQorCXBzbGxxCW1tMiw2MAorCXB4b3IJbW0xLFtlYngqOCtlYXhdCisJbW92ZAllYngsbW0wCisJcHhvcgltbTEsW2VjeCoxK2VzaV0KKwlweG9yCW1tMCxtbTIKKwlwc3JscQltbTAsNAorCWFuZAllYngsMTUKKwltb3ZxCW1tMixtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW0wLFs4K2VkeCoxK2VzaV0KKwlwc2xscQltbTIsNjAKKwlweG9yCW1tMSxbZWJ4KjgrZWF4XQorCW1vdmQJZWJ4LG1tMAorCXB4b3IJbW0xLFtlZHgqMStlc2ldCisJcHhvcgltbTAsbW0yCisJcHNybHEJbW0wLDMyCisJbW92ZAllZHgsbW0xCisJcHNybHEJbW0xLDMyCisJbW92ZAllY3gsbW0wCisJbW92ZAllYnAsbW0xCisJYnN3YXAJZWJ4CisJYnN3YXAJZWR4CisJYnN3YXAJZWN4CisJYnN3YXAJZWJwCisJZW1tcworCW1vdglEV09SRCBbMTIrZWRpXSxlYngKKwltb3YJRFdPUkQgWzQrZWRpXSxlZHgKKwltb3YJRFdPUkQgWzgrZWRpXSxlY3gKKwltb3YJRFdPUkQgW2VkaV0sZWJwCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV9nY21fZ2hhc2hfNGJpdF9tbXgKK2FsaWduCTE2CitfZ2NtX2doYXNoXzRiaXRfbW14OgorTCRfZ2NtX2doYXNoXzRiaXRfbW14X2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVheCxEV09SRCBbMjArZXNwXQorCW1vdgllYngsRFdPUkQgWzI0K2VzcF0KKwltb3YJZWN4LERXT1JEIFsyOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMzIrZXNwXQorCW1vdgllYnAsZXNwCisJY2FsbAlMJDAwM3BpY19wb2ludAorTCQwMDNwaWNfcG9pbnQ6CisJcG9wCWVzaQorCWxlYQllc2ksWyhMJHJlbV84Yml0LUwkMDAzcGljX3BvaW50KStlc2ldCisJc3ViCWVzcCw1NDQKKwlhbmQJZXNwLC02NAorCXN1Ygllc3AsMTYKKwlhZGQJZWR4LGVjeAorCW1vdglEV09SRCBbNTQ0K2VzcF0sZWF4CisJbW92CURXT1JEIFs1NTIrZXNwXSxlZHgKKwltb3YJRFdPUkQgWzU1Nitlc3BdLGVicAorCWFkZAllYngsMTI4CisJbGVhCWVkaSxbMTQ0K2VzcF0KKwlsZWEJZWJwLFs0MDArZXNwXQorCW1vdgllZHgsRFdPUkQgW2VieC0xMjBdCisJbW92cQltbTAsW2VieC0xMjBdCisJbW92cQltbTMsW2VieC0xMjhdCisJc2hsCWVkeCw0CisJbW92CUJZVEUgW2VzcF0sZGwKKwltb3YJZWR4LERXT1JEIFtlYngtMTA0XQorCW1vdnEJbW0yLFtlYngtMTA0XQorCW1vdnEJbW01LFtlYngtMTEyXQorCW1vdnEJW2VkaS0xMjhdLG1tMAorCXBzcmxxCW1tMCw0CisJbW92cQlbZWRpXSxtbTMKKwltb3ZxCW1tNyxtbTMKKwlwc3JscQltbTMsNAorCXNobAllZHgsNAorCW1vdglCWVRFIFsxK2VzcF0sZGwKKwltb3YJZWR4LERXT1JEIFtlYngtODhdCisJbW92cQltbTEsW2VieC04OF0KKwlwc2xscQltbTcsNjAKKwltb3ZxCW1tNCxbZWJ4LTk2XQorCXBvcgltbTAsbW03CisJbW92cQlbZWRpLTEyMF0sbW0yCisJcHNybHEJbW0yLDQKKwltb3ZxCVs4K2VkaV0sbW01CisJbW92cQltbTYsbW01CisJbW92cQlbZWJwLTEyOF0sbW0wCisJcHNybHEJbW01LDQKKwltb3ZxCVtlYnBdLG1tMworCXNobAllZHgsNAorCW1vdglCWVRFIFsyK2VzcF0sZGwKKwltb3YJZWR4LERXT1JEIFtlYngtNzJdCisJbW92cQltbTAsW2VieC03Ml0KKwlwc2xscQltbTYsNjAKKwltb3ZxCW1tMyxbZWJ4LTgwXQorCXBvcgltbTIsbW02CisJbW92cQlbZWRpLTExMl0sbW0xCisJcHNybHEJbW0xLDQKKwltb3ZxCVsxNitlZGldLG1tNAorCW1vdnEJbW03LG1tNAorCW1vdnEJW2VicC0xMjBdLG1tMgorCXBzcmxxCW1tNCw0CisJbW92cQlbOCtlYnBdLG1tNQorCXNobAllZHgsNAorCW1vdglCWVRFIFszK2VzcF0sZGwKKwltb3YJZWR4LERXT1JEIFtlYngtNTZdCisJbW92cQltbTIsW2VieC01Nl0KKwlwc2xscQltbTcsNjAKKwltb3ZxCW1tNSxbZWJ4LTY0XQorCXBvcgltbTEsbW03CisJbW92cQlbZWRpLTEwNF0sbW0wCisJcHNybHEJbW0wLDQKKwltb3ZxCVsyNCtlZGldLG1tMworCW1vdnEJbW02LG1tMworCW1vdnEJW2VicC0xMTJdLG1tMQorCXBzcmxxCW1tMyw0CisJbW92cQlbMTYrZWJwXSxtbTQKKwlzaGwJZWR4LDQKKwltb3YJQllURSBbNCtlc3BdLGRsCisJbW92CWVkeCxEV09SRCBbZWJ4LTQwXQorCW1vdnEJbW0xLFtlYngtNDBdCisJcHNsbHEJbW02LDYwCisJbW92cQltbTQsW2VieC00OF0KKwlwb3IJbW0wLG1tNgorCW1vdnEJW2VkaS05Nl0sbW0yCisJcHNybHEJbW0yLDQKKwltb3ZxCVszMitlZGldLG1tNQorCW1vdnEJbW03LG1tNQorCW1vdnEJW2VicC0xMDRdLG1tMAorCXBzcmxxCW1tNSw0CisJbW92cQlbMjQrZWJwXSxtbTMKKwlzaGwJZWR4LDQKKwltb3YJQllURSBbNStlc3BdLGRsCisJbW92CWVkeCxEV09SRCBbZWJ4LTI0XQorCW1vdnEJbW0wLFtlYngtMjRdCisJcHNsbHEJbW03LDYwCisJbW92cQltbTMsW2VieC0zMl0KKwlwb3IJbW0yLG1tNworCW1vdnEJW2VkaS04OF0sbW0xCisJcHNybHEJbW0xLDQKKwltb3ZxCVs0MCtlZGldLG1tNAorCW1vdnEJbW02LG1tNAorCW1vdnEJW2VicC05Nl0sbW0yCisJcHNybHEJbW00LDQKKwltb3ZxCVszMitlYnBdLG1tNQorCXNobAllZHgsNAorCW1vdglCWVRFIFs2K2VzcF0sZGwKKwltb3YJZWR4LERXT1JEIFtlYngtOF0KKwltb3ZxCW1tMixbZWJ4LThdCisJcHNsbHEJbW02LDYwCisJbW92cQltbTUsW2VieC0xNl0KKwlwb3IJbW0xLG1tNgorCW1vdnEJW2VkaS04MF0sbW0wCisJcHNybHEJbW0wLDQKKwltb3ZxCVs0OCtlZGldLG1tMworCW1vdnEJbW03LG1tMworCW1vdnEJW2VicC04OF0sbW0xCisJcHNybHEJbW0zLDQKKwltb3ZxCVs0MCtlYnBdLG1tNAorCXNobAllZHgsNAorCW1vdglCWVRFIFs3K2VzcF0sZGwKKwltb3YJZWR4LERXT1JEIFs4K2VieF0KKwltb3ZxCW1tMSxbOCtlYnhdCisJcHNsbHEJbW03LDYwCisJbW92cQltbTQsW2VieF0KKwlwb3IJbW0wLG1tNworCW1vdnEJW2VkaS03Ml0sbW0yCisJcHNybHEJbW0yLDQKKwltb3ZxCVs1NitlZGldLG1tNQorCW1vdnEJbW02LG1tNQorCW1vdnEJW2VicC04MF0sbW0wCisJcHNybHEJbW01LDQKKwltb3ZxCVs0OCtlYnBdLG1tMworCXNobAllZHgsNAorCW1vdglCWVRFIFs4K2VzcF0sZGwKKwltb3YJZWR4LERXT1JEIFsyNCtlYnhdCisJbW92cQltbTAsWzI0K2VieF0KKwlwc2xscQltbTYsNjAKKwltb3ZxCW1tMyxbMTYrZWJ4XQorCXBvcgltbTIsbW02CisJbW92cQlbZWRpLTY0XSxtbTEKKwlwc3JscQltbTEsNAorCW1vdnEJWzY0K2VkaV0sbW00CisJbW92cQltbTcsbW00CisJbW92cQlbZWJwLTcyXSxtbTIKKwlwc3JscQltbTQsNAorCW1vdnEJWzU2K2VicF0sbW01CisJc2hsCWVkeCw0CisJbW92CUJZVEUgWzkrZXNwXSxkbAorCW1vdgllZHgsRFdPUkQgWzQwK2VieF0KKwltb3ZxCW1tMixbNDArZWJ4XQorCXBzbGxxCW1tNyw2MAorCW1vdnEJbW01LFszMitlYnhdCisJcG9yCW1tMSxtbTcKKwltb3ZxCVtlZGktNTZdLG1tMAorCXBzcmxxCW1tMCw0CisJbW92cQlbNzIrZWRpXSxtbTMKKwltb3ZxCW1tNixtbTMKKwltb3ZxCVtlYnAtNjRdLG1tMQorCXBzcmxxCW1tMyw0CisJbW92cQlbNjQrZWJwXSxtbTQKKwlzaGwJZWR4LDQKKwltb3YJQllURSBbMTArZXNwXSxkbAorCW1vdgllZHgsRFdPUkQgWzU2K2VieF0KKwltb3ZxCW1tMSxbNTYrZWJ4XQorCXBzbGxxCW1tNiw2MAorCW1vdnEJbW00LFs0OCtlYnhdCisJcG9yCW1tMCxtbTYKKwltb3ZxCVtlZGktNDhdLG1tMgorCXBzcmxxCW1tMiw0CisJbW92cQlbODArZWRpXSxtbTUKKwltb3ZxCW1tNyxtbTUKKwltb3ZxCVtlYnAtNTZdLG1tMAorCXBzcmxxCW1tNSw0CisJbW92cQlbNzIrZWJwXSxtbTMKKwlzaGwJZWR4LDQKKwltb3YJQllURSBbMTErZXNwXSxkbAorCW1vdgllZHgsRFdPUkQgWzcyK2VieF0KKwltb3ZxCW1tMCxbNzIrZWJ4XQorCXBzbGxxCW1tNyw2MAorCW1vdnEJbW0zLFs2NCtlYnhdCisJcG9yCW1tMixtbTcKKwltb3ZxCVtlZGktNDBdLG1tMQorCXBzcmxxCW1tMSw0CisJbW92cQlbODgrZWRpXSxtbTQKKwltb3ZxCW1tNixtbTQKKwltb3ZxCVtlYnAtNDhdLG1tMgorCXBzcmxxCW1tNCw0CisJbW92cQlbODArZWJwXSxtbTUKKwlzaGwJZWR4LDQKKwltb3YJQllURSBbMTIrZXNwXSxkbAorCW1vdgllZHgsRFdPUkQgWzg4K2VieF0KKwltb3ZxCW1tMixbODgrZWJ4XQorCXBzbGxxCW1tNiw2MAorCW1vdnEJbW01LFs4MCtlYnhdCisJcG9yCW1tMSxtbTYKKwltb3ZxCVtlZGktMzJdLG1tMAorCXBzcmxxCW1tMCw0CisJbW92cQlbOTYrZWRpXSxtbTMKKwltb3ZxCW1tNyxtbTMKKwltb3ZxCVtlYnAtNDBdLG1tMQorCXBzcmxxCW1tMyw0CisJbW92cQlbODgrZWJwXSxtbTQKKwlzaGwJZWR4LDQKKwltb3YJQllURSBbMTMrZXNwXSxkbAorCW1vdgllZHgsRFdPUkQgWzEwNCtlYnhdCisJbW92cQltbTEsWzEwNCtlYnhdCisJcHNsbHEJbW03LDYwCisJbW92cQltbTQsWzk2K2VieF0KKwlwb3IJbW0wLG1tNworCW1vdnEJW2VkaS0yNF0sbW0yCisJcHNybHEJbW0yLDQKKwltb3ZxCVsxMDQrZWRpXSxtbTUKKwltb3ZxCW1tNixtbTUKKwltb3ZxCVtlYnAtMzJdLG1tMAorCXBzcmxxCW1tNSw0CisJbW92cQlbOTYrZWJwXSxtbTMKKwlzaGwJZWR4LDQKKwltb3YJQllURSBbMTQrZXNwXSxkbAorCW1vdgllZHgsRFdPUkQgWzEyMCtlYnhdCisJbW92cQltbTAsWzEyMCtlYnhdCisJcHNsbHEJbW02LDYwCisJbW92cQltbTMsWzExMitlYnhdCisJcG9yCW1tMixtbTYKKwltb3ZxCVtlZGktMTZdLG1tMQorCXBzcmxxCW1tMSw0CisJbW92cQlbMTEyK2VkaV0sbW00CisJbW92cQltbTcsbW00CisJbW92cQlbZWJwLTI0XSxtbTIKKwlwc3JscQltbTQsNAorCW1vdnEJWzEwNCtlYnBdLG1tNQorCXNobAllZHgsNAorCW1vdglCWVRFIFsxNStlc3BdLGRsCisJcHNsbHEJbW03LDYwCisJcG9yCW1tMSxtbTcKKwltb3ZxCVtlZGktOF0sbW0wCisJcHNybHEJbW0wLDQKKwltb3ZxCVsxMjArZWRpXSxtbTMKKwltb3ZxCW1tNixtbTMKKwltb3ZxCVtlYnAtMTZdLG1tMQorCXBzcmxxCW1tMyw0CisJbW92cQlbMTEyK2VicF0sbW00CisJcHNsbHEJbW02LDYwCisJcG9yCW1tMCxtbTYKKwltb3ZxCVtlYnAtOF0sbW0wCisJbW92cQlbMTIwK2VicF0sbW0zCisJbW92cQltbTYsW2VheF0KKwltb3YJZWJ4LERXT1JEIFs4K2VheF0KKwltb3YJZWR4LERXT1JEIFsxMitlYXhdCithbGlnbgkxNgorTCQwMDRvdXRlcjoKKwl4b3IJZWR4LERXT1JEIFsxMitlY3hdCisJeG9yCWVieCxEV09SRCBbOCtlY3hdCisJcHhvcgltbTYsW2VjeF0KKwlsZWEJZWN4LFsxNitlY3hdCisJbW92CURXT1JEIFs1MzYrZXNwXSxlYngKKwltb3ZxCVs1MjgrZXNwXSxtbTYKKwltb3YJRFdPUkQgWzU0OCtlc3BdLGVjeAorCXhvcgllYXgsZWF4CisJcm9sCWVkeCw4CisJbW92CWFsLGRsCisJbW92CWVicCxlYXgKKwlhbmQJYWwsMTUKKwlzaHIJZWJwLDQKKwlweG9yCW1tMCxtbTAKKwlyb2wJZWR4LDgKKwlweG9yCW1tMSxtbTEKKwlweG9yCW1tMixtbTIKKwltb3ZxCW1tNyxbMTYrZWF4KjgrZXNwXQorCW1vdnEJbW02LFsxNDQrZWF4KjgrZXNwXQorCW1vdglhbCxkbAorCW1vdmQJZWJ4LG1tNworCXBzcmxxCW1tNyw4CisJbW92cQltbTMsbW02CisJbW92CWVkaSxlYXgKKwlwc3JscQltbTYsOAorCXB4b3IJbW03LFsyNzIrZWJwKjgrZXNwXQorCWFuZAlhbCwxNQorCXBzbGxxCW1tMyw1NgorCXNocgllZGksNAorCXB4b3IJbW03LFsxNitlYXgqOCtlc3BdCisJcm9sCWVkeCw4CisJcHhvcgltbTYsWzE0NCtlYXgqOCtlc3BdCisJcHhvcgltbTcsbW0zCisJcHhvcgltbTYsWzQwMCtlYnAqOCtlc3BdCisJeG9yCWJsLEJZVEUgW2VicCoxK2VzcF0KKwltb3YJYWwsZGwKKwltb3ZkCWVjeCxtbTcKKwltb3Z6eAllYngsYmwKKwlwc3JscQltbTcsOAorCW1vdnEJbW0zLG1tNgorCW1vdgllYnAsZWF4CisJcHNybHEJbW02LDgKKwlweG9yCW1tNyxbMjcyK2VkaSo4K2VzcF0KKwlhbmQJYWwsMTUKKwlwc2xscQltbTMsNTYKKwlzaHIJZWJwLDQKKwlwaW5zcncJbW0yLFdPUkQgW2VieCoyK2VzaV0sMgorCXB4b3IJbW03LFsxNitlYXgqOCtlc3BdCisJcm9sCWVkeCw4CisJcHhvcgltbTYsWzE0NCtlYXgqOCtlc3BdCisJcHhvcgltbTcsbW0zCisJcHhvcgltbTYsWzQwMCtlZGkqOCtlc3BdCisJeG9yCWNsLEJZVEUgW2VkaSoxK2VzcF0KKwltb3YJYWwsZGwKKwltb3YJZWR4LERXT1JEIFs1MzYrZXNwXQorCW1vdmQJZWJ4LG1tNworCW1vdnp4CWVjeCxjbAorCXBzcmxxCW1tNyw4CisJbW92cQltbTMsbW02CisJbW92CWVkaSxlYXgKKwlwc3JscQltbTYsOAorCXB4b3IJbW03LFsyNzIrZWJwKjgrZXNwXQorCWFuZAlhbCwxNQorCXBzbGxxCW1tMyw1NgorCXB4b3IJbW02LG1tMgorCXNocgllZGksNAorCXBpbnNydwltbTEsV09SRCBbZWN4KjIrZXNpXSwyCisJcHhvcgltbTcsWzE2K2VheCo4K2VzcF0KKwlyb2wJZWR4LDgKKwlweG9yCW1tNixbMTQ0K2VheCo4K2VzcF0KKwlweG9yCW1tNyxtbTMKKwlweG9yCW1tNixbNDAwK2VicCo4K2VzcF0KKwl4b3IJYmwsQllURSBbZWJwKjErZXNwXQorCW1vdglhbCxkbAorCW1vdmQJZWN4LG1tNworCW1vdnp4CWVieCxibAorCXBzcmxxCW1tNyw4CisJbW92cQltbTMsbW02CisJbW92CWVicCxlYXgKKwlwc3JscQltbTYsOAorCXB4b3IJbW03LFsyNzIrZWRpKjgrZXNwXQorCWFuZAlhbCwxNQorCXBzbGxxCW1tMyw1NgorCXB4b3IJbW02LG1tMQorCXNocgllYnAsNAorCXBpbnNydwltbTAsV09SRCBbZWJ4KjIrZXNpXSwyCisJcHhvcgltbTcsWzE2K2VheCo4K2VzcF0KKwlyb2wJZWR4LDgKKwlweG9yCW1tNixbMTQ0K2VheCo4K2VzcF0KKwlweG9yCW1tNyxtbTMKKwlweG9yCW1tNixbNDAwK2VkaSo4K2VzcF0KKwl4b3IJY2wsQllURSBbZWRpKjErZXNwXQorCW1vdglhbCxkbAorCW1vdmQJZWJ4LG1tNworCW1vdnp4CWVjeCxjbAorCXBzcmxxCW1tNyw4CisJbW92cQltbTMsbW02CisJbW92CWVkaSxlYXgKKwlwc3JscQltbTYsOAorCXB4b3IJbW03LFsyNzIrZWJwKjgrZXNwXQorCWFuZAlhbCwxNQorCXBzbGxxCW1tMyw1NgorCXB4b3IJbW02LG1tMAorCXNocgllZGksNAorCXBpbnNydwltbTIsV09SRCBbZWN4KjIrZXNpXSwyCisJcHhvcgltbTcsWzE2K2VheCo4K2VzcF0KKwlyb2wJZWR4LDgKKwlweG9yCW1tNixbMTQ0K2VheCo4K2VzcF0KKwlweG9yCW1tNyxtbTMKKwlweG9yCW1tNixbNDAwK2VicCo4K2VzcF0KKwl4b3IJYmwsQllURSBbZWJwKjErZXNwXQorCW1vdglhbCxkbAorCW1vdmQJZWN4LG1tNworCW1vdnp4CWVieCxibAorCXBzcmxxCW1tNyw4CisJbW92cQltbTMsbW02CisJbW92CWVicCxlYXgKKwlwc3JscQltbTYsOAorCXB4b3IJbW03LFsyNzIrZWRpKjgrZXNwXQorCWFuZAlhbCwxNQorCXBzbGxxCW1tMyw1NgorCXB4b3IJbW02LG1tMgorCXNocgllYnAsNAorCXBpbnNydwltbTEsV09SRCBbZWJ4KjIrZXNpXSwyCisJcHhvcgltbTcsWzE2K2VheCo4K2VzcF0KKwlyb2wJZWR4LDgKKwlweG9yCW1tNixbMTQ0K2VheCo4K2VzcF0KKwlweG9yCW1tNyxtbTMKKwlweG9yCW1tNixbNDAwK2VkaSo4K2VzcF0KKwl4b3IJY2wsQllURSBbZWRpKjErZXNwXQorCW1vdglhbCxkbAorCW1vdgllZHgsRFdPUkQgWzUzMitlc3BdCisJbW92ZAllYngsbW03CisJbW92engJZWN4LGNsCisJcHNybHEJbW03LDgKKwltb3ZxCW1tMyxtbTYKKwltb3YJZWRpLGVheAorCXBzcmxxCW1tNiw4CisJcHhvcgltbTcsWzI3MitlYnAqOCtlc3BdCisJYW5kCWFsLDE1CisJcHNsbHEJbW0zLDU2CisJcHhvcgltbTYsbW0xCisJc2hyCWVkaSw0CisJcGluc3J3CW1tMCxXT1JEIFtlY3gqMitlc2ldLDIKKwlweG9yCW1tNyxbMTYrZWF4KjgrZXNwXQorCXJvbAllZHgsOAorCXB4b3IJbW02LFsxNDQrZWF4KjgrZXNwXQorCXB4b3IJbW03LG1tMworCXB4b3IJbW02LFs0MDArZWJwKjgrZXNwXQorCXhvcglibCxCWVRFIFtlYnAqMStlc3BdCisJbW92CWFsLGRsCisJbW92ZAllY3gsbW03CisJbW92engJZWJ4LGJsCisJcHNybHEJbW03LDgKKwltb3ZxCW1tMyxtbTYKKwltb3YJZWJwLGVheAorCXBzcmxxCW1tNiw4CisJcHhvcgltbTcsWzI3MitlZGkqOCtlc3BdCisJYW5kCWFsLDE1CisJcHNsbHEJbW0zLDU2CisJcHhvcgltbTYsbW0wCisJc2hyCWVicCw0CisJcGluc3J3CW1tMixXT1JEIFtlYngqMitlc2ldLDIKKwlweG9yCW1tNyxbMTYrZWF4KjgrZXNwXQorCXJvbAllZHgsOAorCXB4b3IJbW02LFsxNDQrZWF4KjgrZXNwXQorCXB4b3IJbW03LG1tMworCXB4b3IJbW02LFs0MDArZWRpKjgrZXNwXQorCXhvcgljbCxCWVRFIFtlZGkqMStlc3BdCisJbW92CWFsLGRsCisJbW92ZAllYngsbW03CisJbW92engJZWN4LGNsCisJcHNybHEJbW03LDgKKwltb3ZxCW1tMyxtbTYKKwltb3YJZWRpLGVheAorCXBzcmxxCW1tNiw4CisJcHhvcgltbTcsWzI3MitlYnAqOCtlc3BdCisJYW5kCWFsLDE1CisJcHNsbHEJbW0zLDU2CisJcHhvcgltbTYsbW0yCisJc2hyCWVkaSw0CisJcGluc3J3CW1tMSxXT1JEIFtlY3gqMitlc2ldLDIKKwlweG9yCW1tNyxbMTYrZWF4KjgrZXNwXQorCXJvbAllZHgsOAorCXB4b3IJbW02LFsxNDQrZWF4KjgrZXNwXQorCXB4b3IJbW03LG1tMworCXB4b3IJbW02LFs0MDArZWJwKjgrZXNwXQorCXhvcglibCxCWVRFIFtlYnAqMStlc3BdCisJbW92CWFsLGRsCisJbW92ZAllY3gsbW03CisJbW92engJZWJ4LGJsCisJcHNybHEJbW03LDgKKwltb3ZxCW1tMyxtbTYKKwltb3YJZWJwLGVheAorCXBzcmxxCW1tNiw4CisJcHhvcgltbTcsWzI3MitlZGkqOCtlc3BdCisJYW5kCWFsLDE1CisJcHNsbHEJbW0zLDU2CisJcHhvcgltbTYsbW0xCisJc2hyCWVicCw0CisJcGluc3J3CW1tMCxXT1JEIFtlYngqMitlc2ldLDIKKwlweG9yCW1tNyxbMTYrZWF4KjgrZXNwXQorCXJvbAllZHgsOAorCXB4b3IJbW02LFsxNDQrZWF4KjgrZXNwXQorCXB4b3IJbW03LG1tMworCXB4b3IJbW02LFs0MDArZWRpKjgrZXNwXQorCXhvcgljbCxCWVRFIFtlZGkqMStlc3BdCisJbW92CWFsLGRsCisJbW92CWVkeCxEV09SRCBbNTI4K2VzcF0KKwltb3ZkCWVieCxtbTcKKwltb3Z6eAllY3gsY2wKKwlwc3JscQltbTcsOAorCW1vdnEJbW0zLG1tNgorCW1vdgllZGksZWF4CisJcHNybHEJbW02LDgKKwlweG9yCW1tNyxbMjcyK2VicCo4K2VzcF0KKwlhbmQJYWwsMTUKKwlwc2xscQltbTMsNTYKKwlweG9yCW1tNixtbTAKKwlzaHIJZWRpLDQKKwlwaW5zcncJbW0yLFdPUkQgW2VjeCoyK2VzaV0sMgorCXB4b3IJbW03LFsxNitlYXgqOCtlc3BdCisJcm9sCWVkeCw4CisJcHhvcgltbTYsWzE0NCtlYXgqOCtlc3BdCisJcHhvcgltbTcsbW0zCisJcHhvcgltbTYsWzQwMCtlYnAqOCtlc3BdCisJeG9yCWJsLEJZVEUgW2VicCoxK2VzcF0KKwltb3YJYWwsZGwKKwltb3ZkCWVjeCxtbTcKKwltb3Z6eAllYngsYmwKKwlwc3JscQltbTcsOAorCW1vdnEJbW0zLG1tNgorCW1vdgllYnAsZWF4CisJcHNybHEJbW02LDgKKwlweG9yCW1tNyxbMjcyK2VkaSo4K2VzcF0KKwlhbmQJYWwsMTUKKwlwc2xscQltbTMsNTYKKwlweG9yCW1tNixtbTIKKwlzaHIJZWJwLDQKKwlwaW5zcncJbW0xLFdPUkQgW2VieCoyK2VzaV0sMgorCXB4b3IJbW03LFsxNitlYXgqOCtlc3BdCisJcm9sCWVkeCw4CisJcHhvcgltbTYsWzE0NCtlYXgqOCtlc3BdCisJcHhvcgltbTcsbW0zCisJcHhvcgltbTYsWzQwMCtlZGkqOCtlc3BdCisJeG9yCWNsLEJZVEUgW2VkaSoxK2VzcF0KKwltb3YJYWwsZGwKKwltb3ZkCWVieCxtbTcKKwltb3Z6eAllY3gsY2wKKwlwc3JscQltbTcsOAorCW1vdnEJbW0zLG1tNgorCW1vdgllZGksZWF4CisJcHNybHEJbW02LDgKKwlweG9yCW1tNyxbMjcyK2VicCo4K2VzcF0KKwlhbmQJYWwsMTUKKwlwc2xscQltbTMsNTYKKwlweG9yCW1tNixtbTEKKwlzaHIJZWRpLDQKKwlwaW5zcncJbW0wLFdPUkQgW2VjeCoyK2VzaV0sMgorCXB4b3IJbW03LFsxNitlYXgqOCtlc3BdCisJcm9sCWVkeCw4CisJcHhvcgltbTYsWzE0NCtlYXgqOCtlc3BdCisJcHhvcgltbTcsbW0zCisJcHhvcgltbTYsWzQwMCtlYnAqOCtlc3BdCisJeG9yCWJsLEJZVEUgW2VicCoxK2VzcF0KKwltb3YJYWwsZGwKKwltb3ZkCWVjeCxtbTcKKwltb3Z6eAllYngsYmwKKwlwc3JscQltbTcsOAorCW1vdnEJbW0zLG1tNgorCW1vdgllYnAsZWF4CisJcHNybHEJbW02LDgKKwlweG9yCW1tNyxbMjcyK2VkaSo4K2VzcF0KKwlhbmQJYWwsMTUKKwlwc2xscQltbTMsNTYKKwlweG9yCW1tNixtbTAKKwlzaHIJZWJwLDQKKwlwaW5zcncJbW0yLFdPUkQgW2VieCoyK2VzaV0sMgorCXB4b3IJbW03LFsxNitlYXgqOCtlc3BdCisJcm9sCWVkeCw4CisJcHhvcgltbTYsWzE0NCtlYXgqOCtlc3BdCisJcHhvcgltbTcsbW0zCisJcHhvcgltbTYsWzQwMCtlZGkqOCtlc3BdCisJeG9yCWNsLEJZVEUgW2VkaSoxK2VzcF0KKwltb3YJYWwsZGwKKwltb3YJZWR4LERXT1JEIFs1MjQrZXNwXQorCW1vdmQJZWJ4LG1tNworCW1vdnp4CWVjeCxjbAorCXBzcmxxCW1tNyw4CisJbW92cQltbTMsbW02CisJbW92CWVkaSxlYXgKKwlwc3JscQltbTYsOAorCXB4b3IJbW03LFsyNzIrZWJwKjgrZXNwXQorCWFuZAlhbCwxNQorCXBzbGxxCW1tMyw1NgorCXB4b3IJbW02LG1tMgorCXNocgllZGksNAorCXBpbnNydwltbTEsV09SRCBbZWN4KjIrZXNpXSwyCisJcHhvcgltbTcsWzE2K2VheCo4K2VzcF0KKwlweG9yCW1tNixbMTQ0K2VheCo4K2VzcF0KKwl4b3IJYmwsQllURSBbZWJwKjErZXNwXQorCXB4b3IJbW03LG1tMworCXB4b3IJbW02LFs0MDArZWJwKjgrZXNwXQorCW1vdnp4CWVieCxibAorCXB4b3IJbW0yLG1tMgorCXBzbGxxCW1tMSw0CisJbW92ZAllY3gsbW03CisJcHNybHEJbW03LDQKKwltb3ZxCW1tMyxtbTYKKwlwc3JscQltbTYsNAorCXNobAllY3gsNAorCXB4b3IJbW03LFsxNitlZGkqOCtlc3BdCisJcHNsbHEJbW0zLDYwCisJbW92engJZWN4LGNsCisJcHhvcgltbTcsbW0zCisJcHhvcgltbTYsWzE0NCtlZGkqOCtlc3BdCisJcGluc3J3CW1tMCxXT1JEIFtlYngqMitlc2ldLDIKKwlweG9yCW1tNixtbTEKKwltb3ZkCWVkeCxtbTcKKwlwaW5zcncJbW0yLFdPUkQgW2VjeCoyK2VzaV0sMworCXBzbGxxCW1tMCwxMgorCXB4b3IJbW02LG1tMAorCXBzcmxxCW1tNywzMgorCXB4b3IJbW02LG1tMgorCW1vdgllY3gsRFdPUkQgWzU0OCtlc3BdCisJbW92ZAllYngsbW03CisJbW92cQltbTMsbW02CisJcHNsbHcJbW02LDgKKwlwc3JsdwltbTMsOAorCXBvcgltbTYsbW0zCisJYnN3YXAJZWR4CisJcHNodWZ3CW1tNixtbTYsMjcKKwlic3dhcAllYngKKwljbXAJZWN4LERXT1JEIFs1NTIrZXNwXQorCWpuZQlORUFSIEwkMDA0b3V0ZXIKKwltb3YJZWF4LERXT1JEIFs1NDQrZXNwXQorCW1vdglEV09SRCBbMTIrZWF4XSxlZHgKKwltb3YJRFdPUkQgWzgrZWF4XSxlYngKKwltb3ZxCVtlYXhdLG1tNgorCW1vdgllc3AsRFdPUkQgWzU1Nitlc3BdCisJZW1tcworCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2dsb2JhbAlfZ2NtX2luaXRfY2xtdWwKK2FsaWduCTE2CitfZ2NtX2luaXRfY2xtdWw6CitMJF9nY21faW5pdF9jbG11bF9iZWdpbjoKKwltb3YJZWR4LERXT1JEIFs0K2VzcF0KKwltb3YJZWF4LERXT1JEIFs4K2VzcF0KKwljYWxsCUwkMDA1cGljCitMJDAwNXBpYzoKKwlwb3AJZWN4CisJbGVhCWVjeCxbKEwkYnN3YXAtTCQwMDVwaWMpK2VjeF0KKwltb3ZkcXUJeG1tMixbZWF4XQorCXBzaHVmZAl4bW0yLHhtbTIsNzgKKwlwc2h1ZmQJeG1tNCx4bW0yLDI1NQorCW1vdmRxYQl4bW0zLHhtbTIKKwlwc2xscQl4bW0yLDEKKwlweG9yCXhtbTUseG1tNQorCXBzcmxxCXhtbTMsNjMKKwlwY21wZ3RkCXhtbTUseG1tNAorCXBzbGxkcQl4bW0zLDgKKwlwb3IJeG1tMix4bW0zCisJcGFuZAl4bW01LFsxNitlY3hdCisJcHhvcgl4bW0yLHhtbTUKKwltb3ZkcWEJeG1tMCx4bW0yCisJbW92ZHFhCXhtbTEseG1tMAorCXBzaHVmZAl4bW0zLHhtbTAsNzgKKwlwc2h1ZmQJeG1tNCx4bW0yLDc4CisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMgorZGIJMTAyLDE1LDU4LDY4LDE5NCwwCitkYgkxMDIsMTUsNTgsNjgsMjAyLDE3CitkYgkxMDIsMTUsNTgsNjgsMjIwLDAKKwl4b3Jwcwl4bW0zLHhtbTAKKwl4b3Jwcwl4bW0zLHhtbTEKKwltb3ZkcWEJeG1tNCx4bW0zCisJcHNybGRxCXhtbTMsOAorCXBzbGxkcQl4bW00LDgKKwlweG9yCXhtbTEseG1tMworCXB4b3IJeG1tMCx4bW00CisJbW92ZHFhCXhtbTQseG1tMAorCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDUKKwlweG9yCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0zCisJcHNsbHEJeG1tMCw1NworCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xsZHEJeG1tMCw4CisJcHNybGRxCXhtbTMsOAorCXB4b3IJeG1tMCx4bW00CisJcHhvcgl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tNCx4bW0wCisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0xLHhtbTQKKwlweG9yCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsNQorCXB4b3IJeG1tMCx4bW00CisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTEKKwlwc2h1ZmQJeG1tMyx4bW0yLDc4CisJcHNodWZkCXhtbTQseG1tMCw3OAorCXB4b3IJeG1tMyx4bW0yCisJbW92ZHF1CVtlZHhdLHhtbTIKKwlweG9yCXhtbTQseG1tMAorCW1vdmRxdQlbMTYrZWR4XSx4bW0wCitkYgkxMDIsMTUsNTgsMTUsMjI3LDgKKwltb3ZkcXUJWzMyK2VkeF0seG1tNAorCXJldAorZ2xvYmFsCV9nY21fZ211bHRfY2xtdWwKK2FsaWduCTE2CitfZ2NtX2dtdWx0X2NsbXVsOgorTCRfZ2NtX2dtdWx0X2NsbXVsX2JlZ2luOgorCW1vdgllYXgsRFdPUkQgWzQrZXNwXQorCW1vdgllZHgsRFdPUkQgWzgrZXNwXQorCWNhbGwJTCQwMDZwaWMKK0wkMDA2cGljOgorCXBvcAllY3gKKwlsZWEJZWN4LFsoTCRic3dhcC1MJDAwNnBpYykrZWN4XQorCW1vdmRxdQl4bW0wLFtlYXhdCisJbW92ZHFhCXhtbTUsW2VjeF0KKwltb3Z1cHMJeG1tMixbZWR4XQorZGIJMTAyLDE1LDU2LDAsMTk3CisJbW92dXBzCXhtbTQsWzMyK2VkeF0KKwltb3ZkcWEJeG1tMSx4bW0wCisJcHNodWZkCXhtbTMseG1tMCw3OAorCXB4b3IJeG1tMyx4bW0wCitkYgkxMDIsMTUsNTgsNjgsMTk0LDAKK2RiCTEwMiwxNSw1OCw2OCwyMDIsMTcKK2RiCTEwMiwxNSw1OCw2OCwyMjAsMAorCXhvcnBzCXhtbTMseG1tMAorCXhvcnBzCXhtbTMseG1tMQorCW1vdmRxYQl4bW00LHhtbTMKKwlwc3JsZHEJeG1tMyw4CisJcHNsbGRxCXhtbTQsOAorCXB4b3IJeG1tMSx4bW0zCisJcHhvcgl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsNQorCXB4b3IJeG1tMyx4bW0wCisJcHNsbHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTMKKwlwc2xscQl4bW0wLDU3CisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDgKKwlwc3JsZHEJeG1tMyw4CisJcHhvcgl4bW0wLHhtbTQKKwlweG9yCXhtbTEseG1tMworCW1vdmRxYQl4bW00LHhtbTAKKwlwc3JscQl4bW0wLDEKKwlweG9yCXhtbTEseG1tNAorCXB4b3IJeG1tNCx4bW0wCisJcHNybHEJeG1tMCw1CisJcHhvcgl4bW0wLHhtbTQKKwlwc3JscQl4bW0wLDEKKwlweG9yCXhtbTAseG1tMQorZGIJMTAyLDE1LDU2LDAsMTk3CisJbW92ZHF1CVtlYXhdLHhtbTAKKwlyZXQKK2dsb2JhbAlfZ2NtX2doYXNoX2NsbXVsCithbGlnbgkxNgorX2djbV9naGFzaF9jbG11bDoKK0wkX2djbV9naGFzaF9jbG11bF9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllYXgsRFdPUkQgWzIwK2VzcF0KKwltb3YJZWR4LERXT1JEIFsyNCtlc3BdCisJbW92CWVzaSxEV09SRCBbMjgrZXNwXQorCW1vdgllYngsRFdPUkQgWzMyK2VzcF0KKwljYWxsCUwkMDA3cGljCitMJDAwN3BpYzoKKwlwb3AJZWN4CisJbGVhCWVjeCxbKEwkYnN3YXAtTCQwMDdwaWMpK2VjeF0KKwltb3ZkcXUJeG1tMCxbZWF4XQorCW1vdmRxYQl4bW01LFtlY3hdCisJbW92ZHF1CXhtbTIsW2VkeF0KK2RiCTEwMiwxNSw1NiwwLDE5NworCXN1YgllYngsMTYKKwlqeglORUFSIEwkMDA4b2RkX3RhaWwKKwltb3ZkcXUJeG1tMyxbZXNpXQorCW1vdmRxdQl4bW02LFsxNitlc2ldCitkYgkxMDIsMTUsNTYsMCwyMjEKK2RiCTEwMiwxNSw1NiwwLDI0NQorCW1vdmRxdQl4bW01LFszMitlZHhdCisJcHhvcgl4bW0wLHhtbTMKKwlwc2h1ZmQJeG1tMyx4bW02LDc4CisJbW92ZHFhCXhtbTcseG1tNgorCXB4b3IJeG1tMyx4bW02CisJbGVhCWVzaSxbMzIrZXNpXQorZGIJMTAyLDE1LDU4LDY4LDI0MiwwCitkYgkxMDIsMTUsNTgsNjgsMjUwLDE3CitkYgkxMDIsMTUsNTgsNjgsMjIxLDAKKwltb3Z1cHMJeG1tMixbMTYrZWR4XQorCW5vcAorCXN1YgllYngsMzIKKwlqYmUJTkVBUiBMJDAwOWV2ZW5fdGFpbAorCWptcAlORUFSIEwkMDEwbW9kX2xvb3AKK2FsaWduCTMyCitMJDAxMG1vZF9sb29wOgorCXBzaHVmZAl4bW00LHhtbTAsNzgKKwltb3ZkcWEJeG1tMSx4bW0wCisJcHhvcgl4bW00LHhtbTAKKwlub3AKK2RiCTEwMiwxNSw1OCw2OCwxOTQsMAorZGIJMTAyLDE1LDU4LDY4LDIwMiwxNworZGIJMTAyLDE1LDU4LDY4LDIyOSwxNgorCW1vdnVwcwl4bW0yLFtlZHhdCisJeG9ycHMJeG1tMCx4bW02CisJbW92ZHFhCXhtbTUsW2VjeF0KKwl4b3Jwcwl4bW0xLHhtbTcKKwltb3ZkcXUJeG1tNyxbZXNpXQorCXB4b3IJeG1tMyx4bW0wCisJbW92ZHF1CXhtbTYsWzE2K2VzaV0KKwlweG9yCXhtbTMseG1tMQorZGIJMTAyLDE1LDU2LDAsMjUzCisJcHhvcgl4bW00LHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CisJcHNybGRxCXhtbTQsOAorCXBzbGxkcQl4bW0zLDgKKwlweG9yCXhtbTEseG1tNAorCXB4b3IJeG1tMCx4bW0zCitkYgkxMDIsMTUsNTYsMCwyNDUKKwlweG9yCXhtbTEseG1tNworCW1vdmRxYQl4bW03LHhtbTYKKwltb3ZkcWEJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsNQorCXB4b3IJeG1tMyx4bW0wCisJcHNsbHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTMKK2RiCTEwMiwxNSw1OCw2OCwyNDIsMAorCW1vdnVwcwl4bW01LFszMitlZHhdCisJcHNsbHEJeG1tMCw1NworCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xsZHEJeG1tMCw4CisJcHNybGRxCXhtbTMsOAorCXB4b3IJeG1tMCx4bW00CisJcHhvcgl4bW0xLHhtbTMKKwlwc2h1ZmQJeG1tMyx4bW03LDc4CisJbW92ZHFhCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMyx4bW03CisJcHhvcgl4bW0xLHhtbTQKK2RiCTEwMiwxNSw1OCw2OCwyNTAsMTcKKwltb3Z1cHMJeG1tMixbMTYrZWR4XQorCXB4b3IJeG1tNCx4bW0wCisJcHNybHEJeG1tMCw1CisJcHhvcgl4bW0wLHhtbTQKKwlwc3JscQl4bW0wLDEKKwlweG9yCXhtbTAseG1tMQorZGIJMTAyLDE1LDU4LDY4LDIyMSwwCisJbGVhCWVzaSxbMzIrZXNpXQorCXN1YgllYngsMzIKKwlqYQlORUFSIEwkMDEwbW9kX2xvb3AKK0wkMDA5ZXZlbl90YWlsOgorCXBzaHVmZAl4bW00LHhtbTAsNzgKKwltb3ZkcWEJeG1tMSx4bW0wCisJcHhvcgl4bW00LHhtbTAKK2RiCTEwMiwxNSw1OCw2OCwxOTQsMAorZGIJMTAyLDE1LDU4LDY4LDIwMiwxNworZGIJMTAyLDE1LDU4LDY4LDIyOSwxNgorCW1vdmRxYQl4bW01LFtlY3hdCisJeG9ycHMJeG1tMCx4bW02CisJeG9ycHMJeG1tMSx4bW03CisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTMseG1tMQorCXB4b3IJeG1tNCx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBzcmxkcQl4bW00LDgKKwlwc2xsZHEJeG1tMyw4CisJcHhvcgl4bW0xLHhtbTQKKwlweG9yCXhtbTAseG1tMworCW1vdmRxYQl4bW00LHhtbTAKKwltb3ZkcWEJeG1tMyx4bW0wCisJcHNsbHEJeG1tMCw1CisJcHhvcgl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDEKKwlweG9yCXhtbTAseG1tMworCXBzbGxxCXhtbTAsNTcKKwltb3ZkcWEJeG1tMyx4bW0wCisJcHNsbGRxCXhtbTAsOAorCXBzcmxkcQl4bW0zLDgKKwlweG9yCXhtbTAseG1tNAorCXB4b3IJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMSx4bW00CisJcHhvcgl4bW00LHhtbTAKKwlwc3JscQl4bW0wLDUKKwlweG9yCXhtbTAseG1tNAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0xCisJdGVzdAllYngsZWJ4CisJam56CU5FQVIgTCQwMTFkb25lCisJbW92dXBzCXhtbTIsW2VkeF0KK0wkMDA4b2RkX3RhaWw6CisJbW92ZHF1CXhtbTMsW2VzaV0KK2RiCTEwMiwxNSw1NiwwLDIyMQorCXB4b3IJeG1tMCx4bW0zCisJbW92ZHFhCXhtbTEseG1tMAorCXBzaHVmZAl4bW0zLHhtbTAsNzgKKwlwc2h1ZmQJeG1tNCx4bW0yLDc4CisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMgorZGIJMTAyLDE1LDU4LDY4LDE5NCwwCitkYgkxMDIsMTUsNTgsNjgsMjAyLDE3CitkYgkxMDIsMTUsNTgsNjgsMjIwLDAKKwl4b3Jwcwl4bW0zLHhtbTAKKwl4b3Jwcwl4bW0zLHhtbTEKKwltb3ZkcWEJeG1tNCx4bW0zCisJcHNybGRxCXhtbTMsOAorCXBzbGxkcQl4bW00LDgKKwlweG9yCXhtbTEseG1tMworCXB4b3IJeG1tMCx4bW00CisJbW92ZHFhCXhtbTQseG1tMAorCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDUKKwlweG9yCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0zCisJcHNsbHEJeG1tMCw1NworCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xsZHEJeG1tMCw4CisJcHNybGRxCXhtbTMsOAorCXB4b3IJeG1tMCx4bW00CisJcHhvcgl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tNCx4bW0wCisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0xLHhtbTQKKwlweG9yCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsNQorCXB4b3IJeG1tMCx4bW00CisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTEKK0wkMDExZG9uZToKK2RiCTEwMiwxNSw1NiwwLDE5NworCW1vdmRxdQlbZWF4XSx4bW0wCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JNjQKK0wkYnN3YXA6CitkYgkxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSwwCitkYgkxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxOTQKK2FsaWduCTY0CitMJHJlbV84Yml0OgorZHcJMCw0NTAsOTAwLDU4MiwxODAwLDE3MzgsMTE2NCwxMzU4CitkdwkzNjAwLDQwNTAsMzQ3NiwzMTU4LDIzMjgsMjI2NiwyNzE2LDI5MTAKK2R3CTcyMDAsNzY1MCw4MTAwLDc3ODIsNjk1Miw2ODkwLDYzMTYsNjUxMAorZHcJNDY1Niw1MTA2LDQ1MzIsNDIxNCw1NDMyLDUzNzAsNTgyMCw2MDE0CitkdwkxNDQwMCwxNDcyMiwxNTMwMCwxNDg1NCwxNjIwMCwxNjAxMCwxNTU2NCwxNTYzMAorZHcJMTM5MDQsMTQyMjYsMTM3ODAsMTMzMzQsMTI2MzIsMTI0NDIsMTMwMjAsMTMwODYKK2R3CTkzMTIsOTYzNCwxMDIxMiw5NzY2LDkwNjQsODg3NCw4NDI4LDg0OTQKK2R3CTEwODY0LDExMTg2LDEwNzQwLDEwMjk0LDExNjQwLDExNDUwLDEyMDI4LDEyMDk0CitkdwkyODgwMCwyODk5NCwyOTQ0NCwyOTM4MiwzMDYwMCwzMDI4MiwyOTcwOCwzMDE1OAorZHcJMzI0MDAsMzI1OTQsMzIwMjAsMzE5NTgsMzExMjgsMzA4MTAsMzEyNjAsMzE3MTAKK2R3CTI3ODA4LDI4MDAyLDI4NDUyLDI4MzkwLDI3NTYwLDI3MjQyLDI2NjY4LDI3MTE4CitkdwkyNTI2NCwyNTQ1OCwyNDg4NCwyNDgyMiwyNjA0MCwyNTcyMiwyNjE3MiwyNjYyMgorZHcJMTg2MjQsMTg2OTAsMTkyNjgsMTkwNzgsMjA0MjQsMTk5NzgsMTk1MzIsMTk4NTQKK2R3CTE4MTI4LDE4MTk0LDE3NzQ4LDE3NTU4LDE2ODU2LDE2NDEwLDE2OTg4LDE3MzEwCitkdwkyMTcyOCwyMTc5NCwyMjM3MiwyMjE4MiwyMTQ4MCwyMTAzNCwyMDU4OCwyMDkxMAorZHcJMjMyODAsMjMzNDYsMjI5MDAsMjI3MTAsMjQwNTYsMjM2MTAsMjQxODgsMjQ1MTAKK2R3CTU3NjAwLDU3NTM4LDU3OTg4LDU4MTgyLDU4ODg4LDU5MzM4LDU4NzY0LDU4NDQ2Citkdwk2MTIwMCw2MTEzOCw2MDU2NCw2MDc1OCw1OTQxNiw1OTg2Niw2MDMxNiw1OTk5OAorZHcJNjQ4MDAsNjQ3MzgsNjUxODgsNjUzODIsNjQwNDAsNjQ0OTAsNjM5MTYsNjM1OTgKK2R3CTYyMjU2LDYyMTk0LDYxNjIwLDYxODE0LDYyNTIwLDYyOTcwLDYzNDIwLDYzMTAyCitkdwk1NTYxNiw1NTQyNiw1NjAwNCw1NjA3MCw1NjkwNCw1NzIyNiw1Njc4MCw1NjMzNAorZHcJNTUxMjAsNTQ5MzAsNTQ0ODQsNTQ1NTAsNTMzMzYsNTM2NTgsNTQyMzYsNTM3OTAKK2R3CTUwNTI4LDUwMzM4LDUwOTE2LDUwOTgyLDQ5NzY4LDUwMDkwLDQ5NjQ0LDQ5MTk4Citkdwk1MjA4MCw1MTg5MCw1MTQ0NCw1MTUxMCw1MjM0NCw1MjY2Niw1MzI0NCw1Mjc5OAorZHcJMzcyNDgsMzY5MzAsMzczODAsMzc4MzAsMzg1MzYsMzg3MzAsMzgxNTYsMzgwOTQKK2R3CTQwODQ4LDQwNTMwLDM5OTU2LDQwNDA2LDM5MDY0LDM5MjU4LDM5NzA4LDM5NjQ2CitkdwkzNjI1NiwzNTkzOCwzNjM4OCwzNjgzOCwzNTQ5NiwzNTY5MCwzNTExNiwzNTA1NAorZHcJMzM3MTIsMzMzOTQsMzI4MjAsMzMyNzAsMzM5NzYsMzQxNzAsMzQ2MjAsMzQ1NTgKK2R3CTQzNDU2LDQzMDEwLDQzNTg4LDQzOTEwLDQ0NzQ0LDQ0ODEwLDQ0MzY0LDQ0MTc0Citkdwk0Mjk2MCw0MjUxNCw0MjA2OCw0MjM5MCw0MTE3Niw0MTI0Miw0MTgyMCw0MTYzMAorZHcJNDY1NjAsNDYxMTQsNDY2OTIsNDcwMTQsNDU4MDAsNDU4NjYsNDU0MjAsNDUyMzAKK2R3CTQ4MTEyLDQ3NjY2LDQ3MjIwLDQ3NTQyLDQ4Mzc2LDQ4NDQyLDQ5MDIwLDQ4ODMwCithbGlnbgk2NAorTCRyZW1fNGJpdDoKK2RkCTAsMCwwLDQ3MTg1OTIwMCwwLDk0MzcxODQwMCwwLDYxMDI3MTIzMgorZGQJMCwxODg3NDM2ODAwLDAsMTgyMjQyNTA4OCwwLDEyMjA1NDI0NjQsMCwxNDIzOTY2MjA4CitkZAkwLDM3NzQ4NzM2MDAsMCw0MjQ2NzMyODAwLDAsMzY0NDg1MDE3NiwwLDMzMTE0MDMwMDgKK2RkCTAsMjQ0MTA4NDkyOCwwLDIzNzYwNzMyMTYsMCwyODQ3OTMyNDE2LDAsMzA1MTM1NjE2MAorZGIJNzEsNzIsNjUsODMsNzIsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDQ0LDMyLDY3CitkYgk4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyCitkYgkxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIKK2RiCTAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9tZDUtNTg2LmFzbSBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9tZDUtNTg2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VlMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL21kNS01ODYuYXNtCkBAIC0wLDAgKzEsNjkxIEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorZ2xvYmFsCV9tZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKK2FsaWduCTE2CitfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyOgorTCRfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyX2JlZ2luOgorCXB1c2gJZXNpCisJcHVzaAllZGkKKwltb3YJZWRpLERXT1JEIFsxMitlc3BdCisJbW92CWVzaSxEV09SRCBbMTYrZXNwXQorCW1vdgllY3gsRFdPUkQgWzIwK2VzcF0KKwlwdXNoCWVicAorCXNobAllY3gsNgorCXB1c2gJZWJ4CisJYWRkCWVjeCxlc2kKKwlzdWIJZWN4LDY0CisJbW92CWVheCxEV09SRCBbZWRpXQorCXB1c2gJZWN4CisJbW92CWVieCxEV09SRCBbNCtlZGldCisJbW92CWVjeCxEV09SRCBbOCtlZGldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorTCQwMDBzdGFydDoKKwk7IAorCTsgUjAgc2VjdGlvbgorCW1vdgllZGksZWN4CisJbW92CWVicCxEV09SRCBbZXNpXQorCTsgUjAgMAorCXhvcgllZGksZWR4CisJYW5kCWVkaSxlYngKKwlsZWEJZWF4LFszNjE0MDkwMzYwK2VicCoxK2VheF0KKwl4b3IJZWRpLGVkeAorCWFkZAllYXgsZWRpCisJbW92CWVkaSxlYngKKwlyb2wJZWF4LDcKKwltb3YJZWJwLERXT1JEIFs0K2VzaV0KKwlhZGQJZWF4LGVieAorCTsgUjAgMQorCXhvcgllZGksZWN4CisJYW5kCWVkaSxlYXgKKwlsZWEJZWR4LFszOTA1NDAyNzEwK2VicCoxK2VkeF0KKwl4b3IJZWRpLGVjeAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxlYXgKKwlyb2wJZWR4LDEyCisJbW92CWVicCxEV09SRCBbOCtlc2ldCisJYWRkCWVkeCxlYXgKKwk7IFIwIDIKKwl4b3IJZWRpLGVieAorCWFuZAllZGksZWR4CisJbGVhCWVjeCxbNjA2MTA1ODE5K2VicCoxK2VjeF0KKwl4b3IJZWRpLGVieAorCWFkZAllY3gsZWRpCisJbW92CWVkaSxlZHgKKwlyb2wJZWN4LDE3CisJbW92CWVicCxEV09SRCBbMTIrZXNpXQorCWFkZAllY3gsZWR4CisJOyBSMCAzCisJeG9yCWVkaSxlYXgKKwlhbmQJZWRpLGVjeAorCWxlYQllYngsWzMyNTA0NDE5NjYrZWJwKjErZWJ4XQorCXhvcgllZGksZWF4CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLGVjeAorCXJvbAllYngsMjIKKwltb3YJZWJwLERXT1JEIFsxNitlc2ldCisJYWRkCWVieCxlY3gKKwk7IFIwIDQKKwl4b3IJZWRpLGVkeAorCWFuZAllZGksZWJ4CisJbGVhCWVheCxbNDExODU0ODM5OStlYnAqMStlYXhdCisJeG9yCWVkaSxlZHgKKwlhZGQJZWF4LGVkaQorCW1vdgllZGksZWJ4CisJcm9sCWVheCw3CisJbW92CWVicCxEV09SRCBbMjArZXNpXQorCWFkZAllYXgsZWJ4CisJOyBSMCA1CisJeG9yCWVkaSxlY3gKKwlhbmQJZWRpLGVheAorCWxlYQllZHgsWzEyMDAwODA0MjYrZWJwKjErZWR4XQorCXhvcgllZGksZWN4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLGVheAorCXJvbAllZHgsMTIKKwltb3YJZWJwLERXT1JEIFsyNCtlc2ldCisJYWRkCWVkeCxlYXgKKwk7IFIwIDYKKwl4b3IJZWRpLGVieAorCWFuZAllZGksZWR4CisJbGVhCWVjeCxbMjgyMTczNTk1NStlYnAqMStlY3hdCisJeG9yCWVkaSxlYngKKwlhZGQJZWN4LGVkaQorCW1vdgllZGksZWR4CisJcm9sCWVjeCwxNworCW1vdgllYnAsRFdPUkQgWzI4K2VzaV0KKwlhZGQJZWN4LGVkeAorCTsgUjAgNworCXhvcgllZGksZWF4CisJYW5kCWVkaSxlY3gKKwlsZWEJZWJ4LFs0MjQ5MjYxMzEzK2VicCoxK2VieF0KKwl4b3IJZWRpLGVheAorCWFkZAllYngsZWRpCisJbW92CWVkaSxlY3gKKwlyb2wJZWJ4LDIyCisJbW92CWVicCxEV09SRCBbMzIrZXNpXQorCWFkZAllYngsZWN4CisJOyBSMCA4CisJeG9yCWVkaSxlZHgKKwlhbmQJZWRpLGVieAorCWxlYQllYXgsWzE3NzAwMzU0MTYrZWJwKjErZWF4XQorCXhvcgllZGksZWR4CisJYWRkCWVheCxlZGkKKwltb3YJZWRpLGVieAorCXJvbAllYXgsNworCW1vdgllYnAsRFdPUkQgWzM2K2VzaV0KKwlhZGQJZWF4LGVieAorCTsgUjAgOQorCXhvcgllZGksZWN4CisJYW5kCWVkaSxlYXgKKwlsZWEJZWR4LFsyMzM2NTUyODc5K2VicCoxK2VkeF0KKwl4b3IJZWRpLGVjeAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxlYXgKKwlyb2wJZWR4LDEyCisJbW92CWVicCxEV09SRCBbNDArZXNpXQorCWFkZAllZHgsZWF4CisJOyBSMCAxMAorCXhvcgllZGksZWJ4CisJYW5kCWVkaSxlZHgKKwlsZWEJZWN4LFs0Mjk0OTI1MjMzK2VicCoxK2VjeF0KKwl4b3IJZWRpLGVieAorCWFkZAllY3gsZWRpCisJbW92CWVkaSxlZHgKKwlyb2wJZWN4LDE3CisJbW92CWVicCxEV09SRCBbNDQrZXNpXQorCWFkZAllY3gsZWR4CisJOyBSMCAxMQorCXhvcgllZGksZWF4CisJYW5kCWVkaSxlY3gKKwlsZWEJZWJ4LFsyMzA0NTYzMTM0K2VicCoxK2VieF0KKwl4b3IJZWRpLGVheAorCWFkZAllYngsZWRpCisJbW92CWVkaSxlY3gKKwlyb2wJZWJ4LDIyCisJbW92CWVicCxEV09SRCBbNDgrZXNpXQorCWFkZAllYngsZWN4CisJOyBSMCAxMgorCXhvcgllZGksZWR4CisJYW5kCWVkaSxlYngKKwlsZWEJZWF4LFsxODA0NjAzNjgyK2VicCoxK2VheF0KKwl4b3IJZWRpLGVkeAorCWFkZAllYXgsZWRpCisJbW92CWVkaSxlYngKKwlyb2wJZWF4LDcKKwltb3YJZWJwLERXT1JEIFs1Mitlc2ldCisJYWRkCWVheCxlYngKKwk7IFIwIDEzCisJeG9yCWVkaSxlY3gKKwlhbmQJZWRpLGVheAorCWxlYQllZHgsWzQyNTQ2MjYxOTUrZWJwKjErZWR4XQorCXhvcgllZGksZWN4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLGVheAorCXJvbAllZHgsMTIKKwltb3YJZWJwLERXT1JEIFs1Nitlc2ldCisJYWRkCWVkeCxlYXgKKwk7IFIwIDE0CisJeG9yCWVkaSxlYngKKwlhbmQJZWRpLGVkeAorCWxlYQllY3gsWzI3OTI5NjUwMDYrZWJwKjErZWN4XQorCXhvcgllZGksZWJ4CisJYWRkCWVjeCxlZGkKKwltb3YJZWRpLGVkeAorCXJvbAllY3gsMTcKKwltb3YJZWJwLERXT1JEIFs2MCtlc2ldCisJYWRkCWVjeCxlZHgKKwk7IFIwIDE1CisJeG9yCWVkaSxlYXgKKwlhbmQJZWRpLGVjeAorCWxlYQllYngsWzEyMzY1MzUzMjkrZWJwKjErZWJ4XQorCXhvcgllZGksZWF4CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLGVjeAorCXJvbAllYngsMjIKKwltb3YJZWJwLERXT1JEIFs0K2VzaV0KKwlhZGQJZWJ4LGVjeAorCTsgCisJOyBSMSBzZWN0aW9uCisJOyBSMSAxNgorCWxlYQllYXgsWzQxMjkxNzA3ODYrZWJwKjErZWF4XQorCXhvcgllZGksZWJ4CisJYW5kCWVkaSxlZHgKKwltb3YJZWJwLERXT1JEIFsyNCtlc2ldCisJeG9yCWVkaSxlY3gKKwlhZGQJZWF4LGVkaQorCW1vdgllZGksZWJ4CisJcm9sCWVheCw1CisJYWRkCWVheCxlYngKKwk7IFIxIDE3CisJbGVhCWVkeCxbMzIyNTQ2NTY2NCtlYnAqMStlZHhdCisJeG9yCWVkaSxlYXgKKwlhbmQJZWRpLGVjeAorCW1vdgllYnAsRFdPUkQgWzQ0K2VzaV0KKwl4b3IJZWRpLGVieAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxlYXgKKwlyb2wJZWR4LDkKKwlhZGQJZWR4LGVheAorCTsgUjEgMTgKKwlsZWEJZWN4LFs2NDM3MTc3MTMrZWJwKjErZWN4XQorCXhvcgllZGksZWR4CisJYW5kCWVkaSxlYngKKwltb3YJZWJwLERXT1JEIFtlc2ldCisJeG9yCWVkaSxlYXgKKwlhZGQJZWN4LGVkaQorCW1vdgllZGksZWR4CisJcm9sCWVjeCwxNAorCWFkZAllY3gsZWR4CisJOyBSMSAxOQorCWxlYQllYngsWzM5MjEwNjk5OTQrZWJwKjErZWJ4XQorCXhvcgllZGksZWN4CisJYW5kCWVkaSxlYXgKKwltb3YJZWJwLERXT1JEIFsyMCtlc2ldCisJeG9yCWVkaSxlZHgKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksZWN4CisJcm9sCWVieCwyMAorCWFkZAllYngsZWN4CisJOyBSMSAyMAorCWxlYQllYXgsWzM1OTM0MDg2MDUrZWJwKjErZWF4XQorCXhvcgllZGksZWJ4CisJYW5kCWVkaSxlZHgKKwltb3YJZWJwLERXT1JEIFs0MCtlc2ldCisJeG9yCWVkaSxlY3gKKwlhZGQJZWF4LGVkaQorCW1vdgllZGksZWJ4CisJcm9sCWVheCw1CisJYWRkCWVheCxlYngKKwk7IFIxIDIxCisJbGVhCWVkeCxbMzgwMTYwODMrZWJwKjErZWR4XQorCXhvcgllZGksZWF4CisJYW5kCWVkaSxlY3gKKwltb3YJZWJwLERXT1JEIFs2MCtlc2ldCisJeG9yCWVkaSxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksZWF4CisJcm9sCWVkeCw5CisJYWRkCWVkeCxlYXgKKwk7IFIxIDIyCisJbGVhCWVjeCxbMzYzNDQ4ODk2MStlYnAqMStlY3hdCisJeG9yCWVkaSxlZHgKKwlhbmQJZWRpLGVieAorCW1vdgllYnAsRFdPUkQgWzE2K2VzaV0KKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWRpCisJbW92CWVkaSxlZHgKKwlyb2wJZWN4LDE0CisJYWRkCWVjeCxlZHgKKwk7IFIxIDIzCisJbGVhCWVieCxbMzg4OTQyOTQ0OCtlYnAqMStlYnhdCisJeG9yCWVkaSxlY3gKKwlhbmQJZWRpLGVheAorCW1vdgllYnAsRFdPUkQgWzM2K2VzaV0KKwl4b3IJZWRpLGVkeAorCWFkZAllYngsZWRpCisJbW92CWVkaSxlY3gKKwlyb2wJZWJ4LDIwCisJYWRkCWVieCxlY3gKKwk7IFIxIDI0CisJbGVhCWVheCxbNTY4NDQ2NDM4K2VicCoxK2VheF0KKwl4b3IJZWRpLGVieAorCWFuZAllZGksZWR4CisJbW92CWVicCxEV09SRCBbNTYrZXNpXQorCXhvcgllZGksZWN4CisJYWRkCWVheCxlZGkKKwltb3YJZWRpLGVieAorCXJvbAllYXgsNQorCWFkZAllYXgsZWJ4CisJOyBSMSAyNQorCWxlYQllZHgsWzMyNzUxNjM2MDYrZWJwKjErZWR4XQorCXhvcgllZGksZWF4CisJYW5kCWVkaSxlY3gKKwltb3YJZWJwLERXT1JEIFsxMitlc2ldCisJeG9yCWVkaSxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksZWF4CisJcm9sCWVkeCw5CisJYWRkCWVkeCxlYXgKKwk7IFIxIDI2CisJbGVhCWVjeCxbNDEwNzYwMzMzNStlYnAqMStlY3hdCisJeG9yCWVkaSxlZHgKKwlhbmQJZWRpLGVieAorCW1vdgllYnAsRFdPUkQgWzMyK2VzaV0KKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWRpCisJbW92CWVkaSxlZHgKKwlyb2wJZWN4LDE0CisJYWRkCWVjeCxlZHgKKwk7IFIxIDI3CisJbGVhCWVieCxbMTE2MzUzMTUwMStlYnAqMStlYnhdCisJeG9yCWVkaSxlY3gKKwlhbmQJZWRpLGVheAorCW1vdgllYnAsRFdPUkQgWzUyK2VzaV0KKwl4b3IJZWRpLGVkeAorCWFkZAllYngsZWRpCisJbW92CWVkaSxlY3gKKwlyb2wJZWJ4LDIwCisJYWRkCWVieCxlY3gKKwk7IFIxIDI4CisJbGVhCWVheCxbMjg1MDI4NTgyOStlYnAqMStlYXhdCisJeG9yCWVkaSxlYngKKwlhbmQJZWRpLGVkeAorCW1vdgllYnAsRFdPUkQgWzgrZXNpXQorCXhvcgllZGksZWN4CisJYWRkCWVheCxlZGkKKwltb3YJZWRpLGVieAorCXJvbAllYXgsNQorCWFkZAllYXgsZWJ4CisJOyBSMSAyOQorCWxlYQllZHgsWzQyNDM1NjM1MTIrZWJwKjErZWR4XQorCXhvcgllZGksZWF4CisJYW5kCWVkaSxlY3gKKwltb3YJZWJwLERXT1JEIFsyOCtlc2ldCisJeG9yCWVkaSxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksZWF4CisJcm9sCWVkeCw5CisJYWRkCWVkeCxlYXgKKwk7IFIxIDMwCisJbGVhCWVjeCxbMTczNTMyODQ3MytlYnAqMStlY3hdCisJeG9yCWVkaSxlZHgKKwlhbmQJZWRpLGVieAorCW1vdgllYnAsRFdPUkQgWzQ4K2VzaV0KKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWRpCisJbW92CWVkaSxlZHgKKwlyb2wJZWN4LDE0CisJYWRkCWVjeCxlZHgKKwk7IFIxIDMxCisJbGVhCWVieCxbMjM2ODM1OTU2MitlYnAqMStlYnhdCisJeG9yCWVkaSxlY3gKKwlhbmQJZWRpLGVheAorCW1vdgllYnAsRFdPUkQgWzIwK2VzaV0KKwl4b3IJZWRpLGVkeAorCWFkZAllYngsZWRpCisJbW92CWVkaSxlY3gKKwlyb2wJZWJ4LDIwCisJYWRkCWVieCxlY3gKKwk7IAorCTsgUjIgc2VjdGlvbgorCTsgUjIgMzIKKwl4b3IJZWRpLGVkeAorCXhvcgllZGksZWJ4CisJbGVhCWVheCxbNDI5NDU4ODczOCtlYnAqMStlYXhdCisJYWRkCWVheCxlZGkKKwlyb2wJZWF4LDQKKwltb3YJZWJwLERXT1JEIFszMitlc2ldCisJbW92CWVkaSxlYngKKwk7IFIyIDMzCisJbGVhCWVkeCxbMjI3MjM5MjgzMytlYnAqMStlZHhdCisJYWRkCWVheCxlYngKKwl4b3IJZWRpLGVjeAorCXhvcgllZGksZWF4CisJbW92CWVicCxEV09SRCBbNDQrZXNpXQorCWFkZAllZHgsZWRpCisJbW92CWVkaSxlYXgKKwlyb2wJZWR4LDExCisJYWRkCWVkeCxlYXgKKwk7IFIyIDM0CisJeG9yCWVkaSxlYngKKwl4b3IJZWRpLGVkeAorCWxlYQllY3gsWzE4MzkwMzA1NjIrZWJwKjErZWN4XQorCWFkZAllY3gsZWRpCisJcm9sCWVjeCwxNgorCW1vdgllYnAsRFdPUkQgWzU2K2VzaV0KKwltb3YJZWRpLGVkeAorCTsgUjIgMzUKKwlsZWEJZWJ4LFs0MjU5NjU3NzQwK2VicCoxK2VieF0KKwlhZGQJZWN4LGVkeAorCXhvcgllZGksZWF4CisJeG9yCWVkaSxlY3gKKwltb3YJZWJwLERXT1JEIFs0K2VzaV0KKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksZWN4CisJcm9sCWVieCwyMworCWFkZAllYngsZWN4CisJOyBSMiAzNgorCXhvcgllZGksZWR4CisJeG9yCWVkaSxlYngKKwlsZWEJZWF4LFsyNzYzOTc1MjM2K2VicCoxK2VheF0KKwlhZGQJZWF4LGVkaQorCXJvbAllYXgsNAorCW1vdgllYnAsRFdPUkQgWzE2K2VzaV0KKwltb3YJZWRpLGVieAorCTsgUjIgMzcKKwlsZWEJZWR4LFsxMjcyODkzMzUzK2VicCoxK2VkeF0KKwlhZGQJZWF4LGVieAorCXhvcgllZGksZWN4CisJeG9yCWVkaSxlYXgKKwltb3YJZWJwLERXT1JEIFsyOCtlc2ldCisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLGVheAorCXJvbAllZHgsMTEKKwlhZGQJZWR4LGVheAorCTsgUjIgMzgKKwl4b3IJZWRpLGVieAorCXhvcgllZGksZWR4CisJbGVhCWVjeCxbNDEzOTQ2OTY2NCtlYnAqMStlY3hdCisJYWRkCWVjeCxlZGkKKwlyb2wJZWN4LDE2CisJbW92CWVicCxEV09SRCBbNDArZXNpXQorCW1vdgllZGksZWR4CisJOyBSMiAzOQorCWxlYQllYngsWzMyMDAyMzY2NTYrZWJwKjErZWJ4XQorCWFkZAllY3gsZWR4CisJeG9yCWVkaSxlYXgKKwl4b3IJZWRpLGVjeAorCW1vdgllYnAsRFdPUkQgWzUyK2VzaV0KKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksZWN4CisJcm9sCWVieCwyMworCWFkZAllYngsZWN4CisJOyBSMiA0MAorCXhvcgllZGksZWR4CisJeG9yCWVkaSxlYngKKwlsZWEJZWF4LFs2ODEyNzkxNzQrZWJwKjErZWF4XQorCWFkZAllYXgsZWRpCisJcm9sCWVheCw0CisJbW92CWVicCxEV09SRCBbZXNpXQorCW1vdgllZGksZWJ4CisJOyBSMiA0MQorCWxlYQllZHgsWzM5MzY0MzAwNzQrZWJwKjErZWR4XQorCWFkZAllYXgsZWJ4CisJeG9yCWVkaSxlY3gKKwl4b3IJZWRpLGVheAorCW1vdgllYnAsRFdPUkQgWzEyK2VzaV0KKwlhZGQJZWR4LGVkaQorCW1vdgllZGksZWF4CisJcm9sCWVkeCwxMQorCWFkZAllZHgsZWF4CisJOyBSMiA0MgorCXhvcgllZGksZWJ4CisJeG9yCWVkaSxlZHgKKwlsZWEJZWN4LFszNTcyNDQ1MzE3K2VicCoxK2VjeF0KKwlhZGQJZWN4LGVkaQorCXJvbAllY3gsMTYKKwltb3YJZWJwLERXT1JEIFsyNCtlc2ldCisJbW92CWVkaSxlZHgKKwk7IFIyIDQzCisJbGVhCWVieCxbNzYwMjkxODkrZWJwKjErZWJ4XQorCWFkZAllY3gsZWR4CisJeG9yCWVkaSxlYXgKKwl4b3IJZWRpLGVjeAorCW1vdgllYnAsRFdPUkQgWzM2K2VzaV0KKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksZWN4CisJcm9sCWVieCwyMworCWFkZAllYngsZWN4CisJOyBSMiA0NAorCXhvcgllZGksZWR4CisJeG9yCWVkaSxlYngKKwlsZWEJZWF4LFszNjU0NjAyODA5K2VicCoxK2VheF0KKwlhZGQJZWF4LGVkaQorCXJvbAllYXgsNAorCW1vdgllYnAsRFdPUkQgWzQ4K2VzaV0KKwltb3YJZWRpLGVieAorCTsgUjIgNDUKKwlsZWEJZWR4LFszODczMTUxNDYxK2VicCoxK2VkeF0KKwlhZGQJZWF4LGVieAorCXhvcgllZGksZWN4CisJeG9yCWVkaSxlYXgKKwltb3YJZWJwLERXT1JEIFs2MCtlc2ldCisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLGVheAorCXJvbAllZHgsMTEKKwlhZGQJZWR4LGVheAorCTsgUjIgNDYKKwl4b3IJZWRpLGVieAorCXhvcgllZGksZWR4CisJbGVhCWVjeCxbNTMwNzQyNTIwK2VicCoxK2VjeF0KKwlhZGQJZWN4LGVkaQorCXJvbAllY3gsMTYKKwltb3YJZWJwLERXT1JEIFs4K2VzaV0KKwltb3YJZWRpLGVkeAorCTsgUjIgNDcKKwlsZWEJZWJ4LFszMjk5NjI4NjQ1K2VicCoxK2VieF0KKwlhZGQJZWN4LGVkeAorCXhvcgllZGksZWF4CisJeG9yCWVkaSxlY3gKKwltb3YJZWJwLERXT1JEIFtlc2ldCisJYWRkCWVieCxlZGkKKwltb3YJZWRpLC0xCisJcm9sCWVieCwyMworCWFkZAllYngsZWN4CisJOyAKKwk7IFIzIHNlY3Rpb24KKwk7IFIzIDQ4CisJeG9yCWVkaSxlZHgKKwlvcgllZGksZWJ4CisJbGVhCWVheCxbNDA5NjMzNjQ1MitlYnAqMStlYXhdCisJeG9yCWVkaSxlY3gKKwltb3YJZWJwLERXT1JEIFsyOCtlc2ldCisJYWRkCWVheCxlZGkKKwltb3YJZWRpLC0xCisJcm9sCWVheCw2CisJeG9yCWVkaSxlY3gKKwlhZGQJZWF4LGVieAorCTsgUjMgNDkKKwlvcgllZGksZWF4CisJbGVhCWVkeCxbMTEyNjg5MTQxNStlYnAqMStlZHhdCisJeG9yCWVkaSxlYngKKwltb3YJZWJwLERXT1JEIFs1Nitlc2ldCisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLC0xCisJcm9sCWVkeCwxMAorCXhvcgllZGksZWJ4CisJYWRkCWVkeCxlYXgKKwk7IFIzIDUwCisJb3IJZWRpLGVkeAorCWxlYQllY3gsWzI4Nzg2MTIzOTErZWJwKjErZWN4XQorCXhvcgllZGksZWF4CisJbW92CWVicCxEV09SRCBbMjArZXNpXQorCWFkZAllY3gsZWRpCisJbW92CWVkaSwtMQorCXJvbAllY3gsMTUKKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWR4CisJOyBSMyA1MQorCW9yCWVkaSxlY3gKKwlsZWEJZWJ4LFs0MjM3NTMzMjQxK2VicCoxK2VieF0KKwl4b3IJZWRpLGVkeAorCW1vdgllYnAsRFdPUkQgWzQ4K2VzaV0KKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksLTEKKwlyb2wJZWJ4LDIxCisJeG9yCWVkaSxlZHgKKwlhZGQJZWJ4LGVjeAorCTsgUjMgNTIKKwlvcgllZGksZWJ4CisJbGVhCWVheCxbMTcwMDQ4NTU3MStlYnAqMStlYXhdCisJeG9yCWVkaSxlY3gKKwltb3YJZWJwLERXT1JEIFsxMitlc2ldCisJYWRkCWVheCxlZGkKKwltb3YJZWRpLC0xCisJcm9sCWVheCw2CisJeG9yCWVkaSxlY3gKKwlhZGQJZWF4LGVieAorCTsgUjMgNTMKKwlvcgllZGksZWF4CisJbGVhCWVkeCxbMjM5OTk4MDY5MCtlYnAqMStlZHhdCisJeG9yCWVkaSxlYngKKwltb3YJZWJwLERXT1JEIFs0MCtlc2ldCisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLC0xCisJcm9sCWVkeCwxMAorCXhvcgllZGksZWJ4CisJYWRkCWVkeCxlYXgKKwk7IFIzIDU0CisJb3IJZWRpLGVkeAorCWxlYQllY3gsWzQyOTM5MTU3NzMrZWJwKjErZWN4XQorCXhvcgllZGksZWF4CisJbW92CWVicCxEV09SRCBbNCtlc2ldCisJYWRkCWVjeCxlZGkKKwltb3YJZWRpLC0xCisJcm9sCWVjeCwxNQorCXhvcgllZGksZWF4CisJYWRkCWVjeCxlZHgKKwk7IFIzIDU1CisJb3IJZWRpLGVjeAorCWxlYQllYngsWzIyNDAwNDQ0OTcrZWJwKjErZWJ4XQorCXhvcgllZGksZWR4CisJbW92CWVicCxEV09SRCBbMzIrZXNpXQorCWFkZAllYngsZWRpCisJbW92CWVkaSwtMQorCXJvbAllYngsMjEKKwl4b3IJZWRpLGVkeAorCWFkZAllYngsZWN4CisJOyBSMyA1NgorCW9yCWVkaSxlYngKKwlsZWEJZWF4LFsxODczMzEzMzU5K2VicCoxK2VheF0KKwl4b3IJZWRpLGVjeAorCW1vdgllYnAsRFdPUkQgWzYwK2VzaV0KKwlhZGQJZWF4LGVkaQorCW1vdgllZGksLTEKKwlyb2wJZWF4LDYKKwl4b3IJZWRpLGVjeAorCWFkZAllYXgsZWJ4CisJOyBSMyA1NworCW9yCWVkaSxlYXgKKwlsZWEJZWR4LFs0MjY0MzU1NTUyK2VicCoxK2VkeF0KKwl4b3IJZWRpLGVieAorCW1vdgllYnAsRFdPUkQgWzI0K2VzaV0KKwlhZGQJZWR4LGVkaQorCW1vdgllZGksLTEKKwlyb2wJZWR4LDEwCisJeG9yCWVkaSxlYngKKwlhZGQJZWR4LGVheAorCTsgUjMgNTgKKwlvcgllZGksZWR4CisJbGVhCWVjeCxbMjczNDc2ODkxNitlYnAqMStlY3hdCisJeG9yCWVkaSxlYXgKKwltb3YJZWJwLERXT1JEIFs1Mitlc2ldCisJYWRkCWVjeCxlZGkKKwltb3YJZWRpLC0xCisJcm9sCWVjeCwxNQorCXhvcgllZGksZWF4CisJYWRkCWVjeCxlZHgKKwk7IFIzIDU5CisJb3IJZWRpLGVjeAorCWxlYQllYngsWzEzMDkxNTE2NDkrZWJwKjErZWJ4XQorCXhvcgllZGksZWR4CisJbW92CWVicCxEV09SRCBbMTYrZXNpXQorCWFkZAllYngsZWRpCisJbW92CWVkaSwtMQorCXJvbAllYngsMjEKKwl4b3IJZWRpLGVkeAorCWFkZAllYngsZWN4CisJOyBSMyA2MAorCW9yCWVkaSxlYngKKwlsZWEJZWF4LFs0MTQ5NDQ0MjI2K2VicCoxK2VheF0KKwl4b3IJZWRpLGVjeAorCW1vdgllYnAsRFdPUkQgWzQ0K2VzaV0KKwlhZGQJZWF4LGVkaQorCW1vdgllZGksLTEKKwlyb2wJZWF4LDYKKwl4b3IJZWRpLGVjeAorCWFkZAllYXgsZWJ4CisJOyBSMyA2MQorCW9yCWVkaSxlYXgKKwlsZWEJZWR4LFszMTc0NzU2OTE3K2VicCoxK2VkeF0KKwl4b3IJZWRpLGVieAorCW1vdgllYnAsRFdPUkQgWzgrZXNpXQorCWFkZAllZHgsZWRpCisJbW92CWVkaSwtMQorCXJvbAllZHgsMTAKKwl4b3IJZWRpLGVieAorCWFkZAllZHgsZWF4CisJOyBSMyA2MgorCW9yCWVkaSxlZHgKKwlsZWEJZWN4LFs3MTg3ODcyNTkrZWJwKjErZWN4XQorCXhvcgllZGksZWF4CisJbW92CWVicCxEV09SRCBbMzYrZXNpXQorCWFkZAllY3gsZWRpCisJbW92CWVkaSwtMQorCXJvbAllY3gsMTUKKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWR4CisJOyBSMyA2MworCW9yCWVkaSxlY3gKKwlsZWEJZWJ4LFszOTUxNDgxNzQ1K2VicCoxK2VieF0KKwl4b3IJZWRpLGVkeAorCW1vdgllYnAsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWJ4LGVkaQorCWFkZAllc2ksNjQKKwlyb2wJZWJ4LDIxCisJbW92CWVkaSxEV09SRCBbZWJwXQorCWFkZAllYngsZWN4CisJYWRkCWVheCxlZGkKKwltb3YJZWRpLERXT1JEIFs0K2VicF0KKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZWJwXQorCWFkZAllY3gsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZWJwXQorCWFkZAllZHgsZWRpCisJbW92CURXT1JEIFtlYnBdLGVheAorCW1vdglEV09SRCBbNCtlYnBdLGVieAorCW1vdgllZGksRFdPUkQgW2VzcF0KKwltb3YJRFdPUkQgWzgrZWJwXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VicF0sZWR4CisJY21wCWVkaSxlc2kKKwlqYWUJTkVBUiBMJDAwMHN0YXJ0CisJcG9wCWVheAorCXBvcAllYngKKwlwb3AJZWJwCisJcG9wCWVkaQorCXBvcAllc2kKKwlyZXQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS9zaGExLTU4Ni5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS01ODYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZThjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS01ODYuYXNtCkBAIC0wLDAgKzEsMzgwOCBAQAorJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLG9iagorc2VjdGlvbgljb2RlCXVzZTMyIGNsYXNzPWNvZGUgYWxpZ249NjQKKyVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHdpbjMyCislaWZkZWYgX19ZQVNNX1ZFUlNJT05fSURfXworJWlmIF9fWUFTTV9WRVJTSU9OX0lEX18gPCAwMTAxMDAwMGgKKyVlcnJvciB5YXNtIHZlcnNpb24gMS4xLjAgb3IgbGF0ZXIgbmVlZGVkLgorJWVuZGlmCis7IFlhc20gYXV0b21hdGljYWxseSBpbmNsdWRlcyAuMDAgYW5kIGNvbXBsYWlucyBhYm91dCByZWRlZmluaW5nIGl0LgorOyBodHRwczovL3d3dy50b3J0YWxsLm5ldC9wcm9qZWN0cy95YXNtL21hbnVhbC9odG1sL29iamZtdC13aW4zMi1zYWZlc2VoLmh0bWwKKyVlbHNlCiskQGZlYXQuMDAgZXF1IDEKKyVlbmRpZgorc2VjdGlvbgkudGV4dAljb2RlIGFsaWduPTY0CislZWxzZQorc2VjdGlvbgkudGV4dAljb2RlCislZW5kaWYKKztleHRlcm4JX09QRU5TU0xfaWEzMmNhcF9QCitnbG9iYWwJX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorYWxpZ24JMTYKK19zaGExX2Jsb2NrX2RhdGFfb3JkZXI6CitMJF9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYmVnaW46CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKKwljYWxsCUwkMDAwcGljX3BvaW50CitMJDAwMHBpY19wb2ludDoKKwlwb3AJZWJwCisJbGVhCWVzaSxbX09QRU5TU0xfaWEzMmNhcF9QXQorCWxlYQllYnAsWyhMJEtfWFhfWFgtTCQwMDBwaWNfcG9pbnQpK2VicF0KKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbW92CWVkeCxEV09SRCBbNCtlc2ldCisJdGVzdAllZHgsNTEyCisJanoJTkVBUiBMJDAwMXg4NgorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCXRlc3QJZWF4LDE2Nzc3MjE2CisJanoJTkVBUiBMJDAwMXg4NgorCWFuZAllZHgsMjY4NDM1NDU2CisJYW5kCWVheCwxMDczNzQxODI0CisJb3IJZWF4LGVkeAorCWNtcAllYXgsMTM0MjE3NzI4MAorCWplCU5FQVIgTCRhdnhfc2hvcnRjdXQKKwlqbXAJTkVBUiBMJHNzc2UzX3Nob3J0Y3V0CithbGlnbgkxNgorTCQwMDF4ODY6CisJbW92CWVicCxEV09SRCBbMjArZXNwXQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwltb3YJZWF4LERXT1JEIFsyOCtlc3BdCisJc3ViCWVzcCw3NgorCXNobAllYXgsNgorCWFkZAllYXgsZXNpCisJbW92CURXT1JEIFsxMDQrZXNwXSxlYXgKKwltb3YJZWRpLERXT1JEIFsxNitlYnBdCisJam1wCU5FQVIgTCQwMDJsb29wCithbGlnbgkxNgorTCQwMDJsb29wOgorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWR4LERXT1JEIFsxMitlc2ldCisJYnN3YXAJZWF4CisJYnN3YXAJZWJ4CisJYnN3YXAJZWN4CisJYnN3YXAJZWR4CisJbW92CURXT1JEIFtlc3BdLGVheAorCW1vdglEV09SRCBbNCtlc3BdLGVieAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCW1vdglEV09SRCBbMTIrZXNwXSxlZHgKKwltb3YJZWF4LERXT1JEIFsxNitlc2ldCisJbW92CWVieCxEV09SRCBbMjArZXNpXQorCW1vdgllY3gsRFdPUkQgWzI0K2VzaV0KKwltb3YJZWR4LERXT1JEIFsyOCtlc2ldCisJYnN3YXAJZWF4CisJYnN3YXAJZWJ4CisJYnN3YXAJZWN4CisJYnN3YXAJZWR4CisJbW92CURXT1JEIFsxNitlc3BdLGVheAorCW1vdglEV09SRCBbMjArZXNwXSxlYngKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJbW92CURXT1JEIFsyOCtlc3BdLGVkeAorCW1vdgllYXgsRFdPUkQgWzMyK2VzaV0KKwltb3YJZWJ4LERXT1JEIFszNitlc2ldCisJbW92CWVjeCxEV09SRCBbNDArZXNpXQorCW1vdgllZHgsRFdPUkQgWzQ0K2VzaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwltb3YJRFdPUkQgWzMyK2VzcF0sZWF4CisJbW92CURXT1JEIFszNitlc3BdLGVieAorCW1vdglEV09SRCBbNDArZXNwXSxlY3gKKwltb3YJRFdPUkQgWzQ0K2VzcF0sZWR4CisJbW92CWVheCxEV09SRCBbNDgrZXNpXQorCW1vdgllYngsRFdPUkQgWzUyK2VzaV0KKwltb3YJZWN4LERXT1JEIFs1Nitlc2ldCisJbW92CWVkeCxEV09SRCBbNjArZXNpXQorCWJzd2FwCWVheAorCWJzd2FwCWVieAorCWJzd2FwCWVjeAorCWJzd2FwCWVkeAorCW1vdglEV09SRCBbNDgrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzUyK2VzcF0sZWJ4CisJbW92CURXT1JEIFs1Nitlc3BdLGVjeAorCW1vdglEV09SRCBbNjArZXNwXSxlZHgKKwltb3YJRFdPUkQgWzEwMCtlc3BdLGVzaQorCW1vdgllYXgsRFdPUkQgW2VicF0KKwltb3YJZWJ4LERXT1JEIFs0K2VicF0KKwltb3YJZWN4LERXT1JEIFs4K2VicF0KKwltb3YJZWR4LERXT1JEIFsxMitlYnBdCisJOyAwMF8xNSAwCisJbW92CWVzaSxlY3gKKwltb3YJZWJwLGVheAorCXJvbAllYnAsNQorCXhvcgllc2ksZWR4CisJYWRkCWVicCxlZGkKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJYW5kCWVzaSxlYngKKwlyb3IJZWJ4LDIKKwl4b3IJZXNpLGVkeAorCWxlYQllYnAsWzE1MTg1MDAyNDkrZWRpKjErZWJwXQorCWFkZAllYnAsZXNpCisJOyAwMF8xNSAxCisJbW92CWVkaSxlYngKKwltb3YJZXNpLGVicAorCXJvbAllYnAsNQorCXhvcgllZGksZWN4CisJYWRkCWVicCxlZHgKKwltb3YJZWR4LERXT1JEIFs0K2VzcF0KKwlhbmQJZWRpLGVheAorCXJvcgllYXgsMgorCXhvcgllZGksZWN4CisJbGVhCWVicCxbMTUxODUwMDI0OStlZHgqMStlYnBdCisJYWRkCWVicCxlZGkKKwk7IDAwXzE1IDIKKwltb3YJZWR4LGVheAorCW1vdgllZGksZWJwCisJcm9sCWVicCw1CisJeG9yCWVkeCxlYngKKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzgrZXNwXQorCWFuZAllZHgsZXNpCisJcm9yCWVzaSwyCisJeG9yCWVkeCxlYngKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VjeCoxK2VicF0KKwlhZGQJZWJwLGVkeAorCTsgMDBfMTUgMworCW1vdgllY3gsZXNpCisJbW92CWVkeCxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZWN4LGVheAorCWFkZAllYnAsZWJ4CisJbW92CWVieCxEV09SRCBbMTIrZXNwXQorCWFuZAllY3gsZWRpCisJcm9yCWVkaSwyCisJeG9yCWVjeCxlYXgKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VieCoxK2VicF0KKwlhZGQJZWJwLGVjeAorCTsgMDBfMTUgNAorCW1vdgllYngsZWRpCisJbW92CWVjeCxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZWJ4LGVzaQorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbMTYrZXNwXQorCWFuZAllYngsZWR4CisJcm9yCWVkeCwyCisJeG9yCWVieCxlc2kKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VheCoxK2VicF0KKwlhZGQJZWJwLGVieAorCTsgMDBfMTUgNQorCW1vdgllYXgsZWR4CisJbW92CWVieCxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZWF4LGVkaQorCWFkZAllYnAsZXNpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCWFuZAllYXgsZWN4CisJcm9yCWVjeCwyCisJeG9yCWVheCxlZGkKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VzaSoxK2VicF0KKwlhZGQJZWJwLGVheAorCTsgMDBfMTUgNgorCW1vdgllc2ksZWN4CisJbW92CWVheCxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZXNpLGVkeAorCWFkZAllYnAsZWRpCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCWFuZAllc2ksZWJ4CisJcm9yCWVieCwyCisJeG9yCWVzaSxlZHgKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VkaSoxK2VicF0KKwlhZGQJZWJwLGVzaQorCTsgMDBfMTUgNworCW1vdgllZGksZWJ4CisJbW92CWVzaSxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZWRpLGVjeAorCWFkZAllYnAsZWR4CisJbW92CWVkeCxEV09SRCBbMjgrZXNwXQorCWFuZAllZGksZWF4CisJcm9yCWVheCwyCisJeG9yCWVkaSxlY3gKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VkeCoxK2VicF0KKwlhZGQJZWJwLGVkaQorCTsgMDBfMTUgOAorCW1vdgllZHgsZWF4CisJbW92CWVkaSxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZWR4LGVieAorCWFkZAllYnAsZWN4CisJbW92CWVjeCxEV09SRCBbMzIrZXNwXQorCWFuZAllZHgsZXNpCisJcm9yCWVzaSwyCisJeG9yCWVkeCxlYngKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VjeCoxK2VicF0KKwlhZGQJZWJwLGVkeAorCTsgMDBfMTUgOQorCW1vdgllY3gsZXNpCisJbW92CWVkeCxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZWN4LGVheAorCWFkZAllYnAsZWJ4CisJbW92CWVieCxEV09SRCBbMzYrZXNwXQorCWFuZAllY3gsZWRpCisJcm9yCWVkaSwyCisJeG9yCWVjeCxlYXgKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VieCoxK2VicF0KKwlhZGQJZWJwLGVjeAorCTsgMDBfMTUgMTAKKwltb3YJZWJ4LGVkaQorCW1vdgllY3gsZWJwCisJcm9sCWVicCw1CisJeG9yCWVieCxlc2kKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgWzQwK2VzcF0KKwlhbmQJZWJ4LGVkeAorCXJvcgllZHgsMgorCXhvcgllYngsZXNpCisJbGVhCWVicCxbMTUxODUwMDI0OStlYXgqMStlYnBdCisJYWRkCWVicCxlYngKKwk7IDAwXzE1IDExCisJbW92CWVheCxlZHgKKwltb3YJZWJ4LGVicAorCXJvbAllYnAsNQorCXhvcgllYXgsZWRpCisJYWRkCWVicCxlc2kKKwltb3YJZXNpLERXT1JEIFs0NCtlc3BdCisJYW5kCWVheCxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZWF4LGVkaQorCWxlYQllYnAsWzE1MTg1MDAyNDkrZXNpKjErZWJwXQorCWFkZAllYnAsZWF4CisJOyAwMF8xNSAxMgorCW1vdgllc2ksZWN4CisJbW92CWVheCxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZXNpLGVkeAorCWFkZAllYnAsZWRpCisJbW92CWVkaSxEV09SRCBbNDgrZXNwXQorCWFuZAllc2ksZWJ4CisJcm9yCWVieCwyCisJeG9yCWVzaSxlZHgKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VkaSoxK2VicF0KKwlhZGQJZWJwLGVzaQorCTsgMDBfMTUgMTMKKwltb3YJZWRpLGVieAorCW1vdgllc2ksZWJwCisJcm9sCWVicCw1CisJeG9yCWVkaSxlY3gKKwlhZGQJZWJwLGVkeAorCW1vdgllZHgsRFdPUkQgWzUyK2VzcF0KKwlhbmQJZWRpLGVheAorCXJvcgllYXgsMgorCXhvcgllZGksZWN4CisJbGVhCWVicCxbMTUxODUwMDI0OStlZHgqMStlYnBdCisJYWRkCWVicCxlZGkKKwk7IDAwXzE1IDE0CisJbW92CWVkeCxlYXgKKwltb3YJZWRpLGVicAorCXJvbAllYnAsNQorCXhvcgllZHgsZWJ4CisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFs1Nitlc3BdCisJYW5kCWVkeCxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWR4LGVieAorCWxlYQllYnAsWzE1MTg1MDAyNDkrZWN4KjErZWJwXQorCWFkZAllYnAsZWR4CisJOyAwMF8xNSAxNQorCW1vdgllY3gsZXNpCisJbW92CWVkeCxlYnAKKwlyb2wJZWJwLDUKKwl4b3IJZWN4LGVheAorCWFkZAllYnAsZWJ4CisJbW92CWVieCxEV09SRCBbNjArZXNwXQorCWFuZAllY3gsZWRpCisJcm9yCWVkaSwyCisJeG9yCWVjeCxlYXgKKwlsZWEJZWJwLFsxNTE4NTAwMjQ5K2VieCoxK2VicF0KKwltb3YJZWJ4LERXT1JEIFtlc3BdCisJYWRkCWVjeCxlYnAKKwk7IDE2XzE5IDE2CisJbW92CWVicCxlZGkKKwl4b3IJZWJ4LERXT1JEIFs4K2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllYngsRFdPUkQgWzMyK2VzcF0KKwlhbmQJZWJwLGVkeAorCXhvcgllYngsRFdPUkQgWzUyK2VzcF0KKwlyb2wJZWJ4LDEKKwl4b3IJZWJwLGVzaQorCWFkZAllYXgsZWJwCisJbW92CWVicCxlY3gKKwlyb3IJZWR4LDIKKwltb3YJRFdPUkQgW2VzcF0sZWJ4CisJcm9sCWVicCw1CisJbGVhCWVieCxbMTUxODUwMDI0OStlYXgqMStlYnhdCisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJYWRkCWVieCxlYnAKKwk7IDE2XzE5IDE3CisJbW92CWVicCxlZHgKKwl4b3IJZWF4LERXT1JEIFsxMitlc3BdCisJeG9yCWVicCxlZGkKKwl4b3IJZWF4LERXT1JEIFszNitlc3BdCisJYW5kCWVicCxlY3gKKwl4b3IJZWF4LERXT1JEIFs1Nitlc3BdCisJcm9sCWVheCwxCisJeG9yCWVicCxlZGkKKwlhZGQJZXNpLGVicAorCW1vdgllYnAsZWJ4CisJcm9yCWVjeCwyCisJbW92CURXT1JEIFs0K2VzcF0sZWF4CisJcm9sCWVicCw1CisJbGVhCWVheCxbMTUxODUwMDI0OStlc2kqMStlYXhdCisJbW92CWVzaSxEV09SRCBbOCtlc3BdCisJYWRkCWVheCxlYnAKKwk7IDE2XzE5IDE4CisJbW92CWVicCxlY3gKKwl4b3IJZXNpLERXT1JEIFsxNitlc3BdCisJeG9yCWVicCxlZHgKKwl4b3IJZXNpLERXT1JEIFs0MCtlc3BdCisJYW5kCWVicCxlYngKKwl4b3IJZXNpLERXT1JEIFs2MCtlc3BdCisJcm9sCWVzaSwxCisJeG9yCWVicCxlZHgKKwlhZGQJZWRpLGVicAorCW1vdgllYnAsZWF4CisJcm9yCWVieCwyCisJbW92CURXT1JEIFs4K2VzcF0sZXNpCisJcm9sCWVicCw1CisJbGVhCWVzaSxbMTUxODUwMDI0OStlZGkqMStlc2ldCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCWFkZAllc2ksZWJwCisJOyAxNl8xOSAxOQorCW1vdgllYnAsZWJ4CisJeG9yCWVkaSxEV09SRCBbMjArZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVkaSxEV09SRCBbNDQrZXNwXQorCWFuZAllYnAsZWF4CisJeG9yCWVkaSxEV09SRCBbZXNwXQorCXJvbAllZGksMQorCXhvcgllYnAsZWN4CisJYWRkCWVkeCxlYnAKKwltb3YJZWJwLGVzaQorCXJvcgllYXgsMgorCW1vdglEV09SRCBbMTIrZXNwXSxlZGkKKwlyb2wJZWJwLDUKKwlsZWEJZWRpLFsxNTE4NTAwMjQ5K2VkeCoxK2VkaV0KKwltb3YJZWR4LERXT1JEIFsxNitlc3BdCisJYWRkCWVkaSxlYnAKKwk7IDIwXzM5IDIwCisJbW92CWVicCxlc2kKKwl4b3IJZWR4LERXT1JEIFsyNCtlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVicCxlYngKKwl4b3IJZWR4LERXT1JEIFs0K2VzcF0KKwlyb2wJZWR4LDEKKwlhZGQJZWN4LGVicAorCXJvcgllc2ksMgorCW1vdgllYnAsZWRpCisJcm9sCWVicCw1CisJbW92CURXT1JEIFsxNitlc3BdLGVkeAorCWxlYQllZHgsWzE4NTk3NzUzOTMrZWN4KjErZWR4XQorCW1vdgllY3gsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWR4LGVicAorCTsgMjBfMzkgMjEKKwltb3YJZWJwLGVkaQorCXhvcgllY3gsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllY3gsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWJwLGVheAorCXhvcgllY3gsRFdPUkQgWzgrZXNwXQorCXJvbAllY3gsMQorCWFkZAllYngsZWJwCisJcm9yCWVkaSwyCisJbW92CWVicCxlZHgKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWN4CisJbGVhCWVjeCxbMTg1OTc3NTM5MytlYngqMStlY3hdCisJbW92CWVieCxEV09SRCBbMjQrZXNwXQorCWFkZAllY3gsZWJwCisJOyAyMF8zOSAyMgorCW1vdgllYnAsZWR4CisJeG9yCWVieCxEV09SRCBbMzIrZXNwXQorCXhvcgllYnAsZWRpCisJeG9yCWVieCxEV09SRCBbNTYrZXNwXQorCXhvcgllYnAsZXNpCisJeG9yCWVieCxEV09SRCBbMTIrZXNwXQorCXJvbAllYngsMQorCWFkZAllYXgsZWJwCisJcm9yCWVkeCwyCisJbW92CWVicCxlY3gKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWJ4CisJbGVhCWVieCxbMTg1OTc3NTM5MytlYXgqMStlYnhdCisJbW92CWVheCxEV09SRCBbMjgrZXNwXQorCWFkZAllYngsZWJwCisJOyAyMF8zOSAyMworCW1vdgllYnAsZWN4CisJeG9yCWVheCxEV09SRCBbMzYrZXNwXQorCXhvcgllYnAsZWR4CisJeG9yCWVheCxEV09SRCBbNjArZXNwXQorCXhvcgllYnAsZWRpCisJeG9yCWVheCxEV09SRCBbMTYrZXNwXQorCXJvbAllYXgsMQorCWFkZAllc2ksZWJwCisJcm9yCWVjeCwyCisJbW92CWVicCxlYngKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWF4CisJbGVhCWVheCxbMTg1OTc3NTM5Mytlc2kqMStlYXhdCisJbW92CWVzaSxEV09SRCBbMzIrZXNwXQorCWFkZAllYXgsZWJwCisJOyAyMF8zOSAyNAorCW1vdgllYnAsZWJ4CisJeG9yCWVzaSxEV09SRCBbNDArZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVzaSxEV09SRCBbZXNwXQorCXhvcgllYnAsZWR4CisJeG9yCWVzaSxEV09SRCBbMjArZXNwXQorCXJvbAllc2ksMQorCWFkZAllZGksZWJwCisJcm9yCWVieCwyCisJbW92CWVicCxlYXgKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzMyK2VzcF0sZXNpCisJbGVhCWVzaSxbMTg1OTc3NTM5MytlZGkqMStlc2ldCisJbW92CWVkaSxEV09SRCBbMzYrZXNwXQorCWFkZAllc2ksZWJwCisJOyAyMF8zOSAyNQorCW1vdgllYnAsZWF4CisJeG9yCWVkaSxEV09SRCBbNDQrZXNwXQorCXhvcgllYnAsZWJ4CisJeG9yCWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVicCxlY3gKKwl4b3IJZWRpLERXT1JEIFsyNCtlc3BdCisJcm9sCWVkaSwxCisJYWRkCWVkeCxlYnAKKwlyb3IJZWF4LDIKKwltb3YJZWJwLGVzaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbMzYrZXNwXSxlZGkKKwlsZWEJZWRpLFsxODU5Nzc1MzkzK2VkeCoxK2VkaV0KKwltb3YJZWR4LERXT1JEIFs0MCtlc3BdCisJYWRkCWVkaSxlYnAKKwk7IDIwXzM5IDI2CisJbW92CWVicCxlc2kKKwl4b3IJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWR4LERXT1JEIFs4K2VzcF0KKwl4b3IJZWJwLGVieAorCXhvcgllZHgsRFdPUkQgWzI4K2VzcF0KKwlyb2wJZWR4LDEKKwlhZGQJZWN4LGVicAorCXJvcgllc2ksMgorCW1vdgllYnAsZWRpCisJcm9sCWVicCw1CisJbW92CURXT1JEIFs0MCtlc3BdLGVkeAorCWxlYQllZHgsWzE4NTk3NzUzOTMrZWN4KjErZWR4XQorCW1vdgllY3gsRFdPUkQgWzQ0K2VzcF0KKwlhZGQJZWR4LGVicAorCTsgMjBfMzkgMjcKKwltb3YJZWJwLGVkaQorCXhvcgllY3gsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllY3gsRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWJwLGVheAorCXhvcgllY3gsRFdPUkQgWzMyK2VzcF0KKwlyb2wJZWN4LDEKKwlhZGQJZWJ4LGVicAorCXJvcgllZGksMgorCW1vdgllYnAsZWR4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs0NCtlc3BdLGVjeAorCWxlYQllY3gsWzE4NTk3NzUzOTMrZWJ4KjErZWN4XQorCW1vdgllYngsRFdPUkQgWzQ4K2VzcF0KKwlhZGQJZWN4LGVicAorCTsgMjBfMzkgMjgKKwltb3YJZWJwLGVkeAorCXhvcgllYngsRFdPUkQgWzU2K2VzcF0KKwl4b3IJZWJwLGVkaQorCXhvcgllYngsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllYngsRFdPUkQgWzM2K2VzcF0KKwlyb2wJZWJ4LDEKKwlhZGQJZWF4LGVicAorCXJvcgllZHgsMgorCW1vdgllYnAsZWN4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCWxlYQllYngsWzE4NTk3NzUzOTMrZWF4KjErZWJ4XQorCW1vdgllYXgsRFdPUkQgWzUyK2VzcF0KKwlhZGQJZWJ4LGVicAorCTsgMjBfMzkgMjkKKwltb3YJZWJwLGVjeAorCXhvcgllYXgsRFdPUkQgWzYwK2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllYXgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWJwLGVkaQorCXhvcgllYXgsRFdPUkQgWzQwK2VzcF0KKwlyb2wJZWF4LDEKKwlhZGQJZXNpLGVicAorCXJvcgllY3gsMgorCW1vdgllYnAsZWJ4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs1Mitlc3BdLGVheAorCWxlYQllYXgsWzE4NTk3NzUzOTMrZXNpKjErZWF4XQorCW1vdgllc2ksRFdPUkQgWzU2K2VzcF0KKwlhZGQJZWF4LGVicAorCTsgMjBfMzkgMzAKKwltb3YJZWJwLGVieAorCXhvcgllc2ksRFdPUkQgW2VzcF0KKwl4b3IJZWJwLGVjeAorCXhvcgllc2ksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllc2ksRFdPUkQgWzQ0K2VzcF0KKwlyb2wJZXNpLDEKKwlhZGQJZWRpLGVicAorCXJvcgllYngsMgorCW1vdgllYnAsZWF4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs1Nitlc3BdLGVzaQorCWxlYQllc2ksWzE4NTk3NzUzOTMrZWRpKjErZXNpXQorCW1vdgllZGksRFdPUkQgWzYwK2VzcF0KKwlhZGQJZXNpLGVicAorCTsgMjBfMzkgMzEKKwltb3YJZWJwLGVheAorCXhvcgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllYnAsZWJ4CisJeG9yCWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVkaSxEV09SRCBbNDgrZXNwXQorCXJvbAllZGksMQorCWFkZAllZHgsZWJwCisJcm9yCWVheCwyCisJbW92CWVicCxlc2kKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzYwK2VzcF0sZWRpCisJbGVhCWVkaSxbMTg1OTc3NTM5MytlZHgqMStlZGldCisJbW92CWVkeCxEV09SRCBbZXNwXQorCWFkZAllZGksZWJwCisJOyAyMF8zOSAzMgorCW1vdgllYnAsZXNpCisJeG9yCWVkeCxEV09SRCBbOCtlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWR4LERXT1JEIFszMitlc3BdCisJeG9yCWVicCxlYngKKwl4b3IJZWR4LERXT1JEIFs1Mitlc3BdCisJcm9sCWVkeCwxCisJYWRkCWVjeCxlYnAKKwlyb3IJZXNpLDIKKwltb3YJZWJwLGVkaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbZXNwXSxlZHgKKwlsZWEJZWR4LFsxODU5Nzc1MzkzK2VjeCoxK2VkeF0KKwltb3YJZWN4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWR4LGVicAorCTsgMjBfMzkgMzMKKwltb3YJZWJwLGVkaQorCXhvcgllY3gsRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllY3gsRFdPUkQgWzM2K2VzcF0KKwl4b3IJZWJwLGVheAorCXhvcgllY3gsRFdPUkQgWzU2K2VzcF0KKwlyb2wJZWN4LDEKKwlhZGQJZWJ4LGVicAorCXJvcgllZGksMgorCW1vdgllYnAsZWR4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs0K2VzcF0sZWN4CisJbGVhCWVjeCxbMTg1OTc3NTM5MytlYngqMStlY3hdCisJbW92CWVieCxEV09SRCBbOCtlc3BdCisJYWRkCWVjeCxlYnAKKwk7IDIwXzM5IDM0CisJbW92CWVicCxlZHgKKwl4b3IJZWJ4LERXT1JEIFsxNitlc3BdCisJeG9yCWVicCxlZGkKKwl4b3IJZWJ4LERXT1JEIFs0MCtlc3BdCisJeG9yCWVicCxlc2kKKwl4b3IJZWJ4LERXT1JEIFs2MCtlc3BdCisJcm9sCWVieCwxCisJYWRkCWVheCxlYnAKKwlyb3IJZWR4LDIKKwltb3YJZWJwLGVjeAorCXJvbAllYnAsNQorCW1vdglEV09SRCBbOCtlc3BdLGVieAorCWxlYQllYngsWzE4NTk3NzUzOTMrZWF4KjErZWJ4XQorCW1vdgllYXgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWJ4LGVicAorCTsgMjBfMzkgMzUKKwltb3YJZWJwLGVjeAorCXhvcgllYXgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllYXgsRFdPUkQgWzQ0K2VzcF0KKwl4b3IJZWJwLGVkaQorCXhvcgllYXgsRFdPUkQgW2VzcF0KKwlyb2wJZWF4LDEKKwlhZGQJZXNpLGVicAorCXJvcgllY3gsMgorCW1vdgllYnAsZWJ4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFsxMitlc3BdLGVheAorCWxlYQllYXgsWzE4NTk3NzUzOTMrZXNpKjErZWF4XQorCW1vdgllc2ksRFdPUkQgWzE2K2VzcF0KKwlhZGQJZWF4LGVicAorCTsgMjBfMzkgMzYKKwltb3YJZWJwLGVieAorCXhvcgllc2ksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWJwLGVjeAorCXhvcgllc2ksRFdPUkQgWzQ4K2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllc2ksRFdPUkQgWzQrZXNwXQorCXJvbAllc2ksMQorCWFkZAllZGksZWJwCisJcm9yCWVieCwyCisJbW92CWVicCxlYXgKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzE2K2VzcF0sZXNpCisJbGVhCWVzaSxbMTg1OTc3NTM5MytlZGkqMStlc2ldCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCWFkZAllc2ksZWJwCisJOyAyMF8zOSAzNworCW1vdgllYnAsZWF4CisJeG9yCWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllYnAsZWJ4CisJeG9yCWVkaSxEV09SRCBbNTIrZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVkaSxEV09SRCBbOCtlc3BdCisJcm9sCWVkaSwxCisJYWRkCWVkeCxlYnAKKwlyb3IJZWF4LDIKKwltb3YJZWJwLGVzaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwlsZWEJZWRpLFsxODU5Nzc1MzkzK2VkeCoxK2VkaV0KKwltb3YJZWR4LERXT1JEIFsyNCtlc3BdCisJYWRkCWVkaSxlYnAKKwk7IDIwXzM5IDM4CisJbW92CWVicCxlc2kKKwl4b3IJZWR4LERXT1JEIFszMitlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWR4LERXT1JEIFs1Nitlc3BdCisJeG9yCWVicCxlYngKKwl4b3IJZWR4LERXT1JEIFsxMitlc3BdCisJcm9sCWVkeCwxCisJYWRkCWVjeCxlYnAKKwlyb3IJZXNpLDIKKwltb3YJZWJwLGVkaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbMjQrZXNwXSxlZHgKKwlsZWEJZWR4LFsxODU5Nzc1MzkzK2VjeCoxK2VkeF0KKwltb3YJZWN4LERXT1JEIFsyOCtlc3BdCisJYWRkCWVkeCxlYnAKKwk7IDIwXzM5IDM5CisJbW92CWVicCxlZGkKKwl4b3IJZWN4LERXT1JEIFszNitlc3BdCisJeG9yCWVicCxlc2kKKwl4b3IJZWN4LERXT1JEIFs2MCtlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWN4LERXT1JEIFsxNitlc3BdCisJcm9sCWVjeCwxCisJYWRkCWVieCxlYnAKKwlyb3IJZWRpLDIKKwltb3YJZWJwLGVkeAorCXJvbAllYnAsNQorCW1vdglEV09SRCBbMjgrZXNwXSxlY3gKKwlsZWEJZWN4LFsxODU5Nzc1MzkzK2VieCoxK2VjeF0KKwltb3YJZWJ4LERXT1JEIFszMitlc3BdCisJYWRkCWVjeCxlYnAKKwk7IDQwXzU5IDQwCisJbW92CWVicCxlZGkKKwl4b3IJZWJ4LERXT1JEIFs0MCtlc3BdCisJeG9yCWVicCxlc2kKKwl4b3IJZWJ4LERXT1JEIFtlc3BdCisJYW5kCWVicCxlZHgKKwl4b3IJZWJ4LERXT1JEIFsyMCtlc3BdCisJcm9sCWVieCwxCisJYWRkCWVicCxlYXgKKwlyb3IJZWR4LDIKKwltb3YJZWF4LGVjeAorCXJvbAllYXgsNQorCW1vdglEV09SRCBbMzIrZXNwXSxlYngKKwlsZWEJZWJ4LFsyNDAwOTU5NzA4K2VicCoxK2VieF0KKwltb3YJZWJwLGVkaQorCWFkZAllYngsZWF4CisJYW5kCWVicCxlc2kKKwltb3YJZWF4LERXT1JEIFszNitlc3BdCisJYWRkCWVieCxlYnAKKwk7IDQwXzU5IDQxCisJbW92CWVicCxlZHgKKwl4b3IJZWF4LERXT1JEIFs0NCtlc3BdCisJeG9yCWVicCxlZGkKKwl4b3IJZWF4LERXT1JEIFs0K2VzcF0KKwlhbmQJZWJwLGVjeAorCXhvcgllYXgsRFdPUkQgWzI0K2VzcF0KKwlyb2wJZWF4LDEKKwlhZGQJZWJwLGVzaQorCXJvcgllY3gsMgorCW1vdgllc2ksZWJ4CisJcm9sCWVzaSw1CisJbW92CURXT1JEIFszNitlc3BdLGVheAorCWxlYQllYXgsWzI0MDA5NTk3MDgrZWJwKjErZWF4XQorCW1vdgllYnAsZWR4CisJYWRkCWVheCxlc2kKKwlhbmQJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzQwK2VzcF0KKwlhZGQJZWF4LGVicAorCTsgNDBfNTkgNDIKKwltb3YJZWJwLGVjeAorCXhvcgllc2ksRFdPUkQgWzQ4K2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllc2ksRFdPUkQgWzgrZXNwXQorCWFuZAllYnAsZWJ4CisJeG9yCWVzaSxEV09SRCBbMjgrZXNwXQorCXJvbAllc2ksMQorCWFkZAllYnAsZWRpCisJcm9yCWVieCwyCisJbW92CWVkaSxlYXgKKwlyb2wJZWRpLDUKKwltb3YJRFdPUkQgWzQwK2VzcF0sZXNpCisJbGVhCWVzaSxbMjQwMDk1OTcwOCtlYnAqMStlc2ldCisJbW92CWVicCxlY3gKKwlhZGQJZXNpLGVkaQorCWFuZAllYnAsZWR4CisJbW92CWVkaSxEV09SRCBbNDQrZXNwXQorCWFkZAllc2ksZWJwCisJOyA0MF81OSA0MworCW1vdgllYnAsZWJ4CisJeG9yCWVkaSxEV09SRCBbNTIrZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVkaSxEV09SRCBbMTIrZXNwXQorCWFuZAllYnAsZWF4CisJeG9yCWVkaSxEV09SRCBbMzIrZXNwXQorCXJvbAllZGksMQorCWFkZAllYnAsZWR4CisJcm9yCWVheCwyCisJbW92CWVkeCxlc2kKKwlyb2wJZWR4LDUKKwltb3YJRFdPUkQgWzQ0K2VzcF0sZWRpCisJbGVhCWVkaSxbMjQwMDk1OTcwOCtlYnAqMStlZGldCisJbW92CWVicCxlYngKKwlhZGQJZWRpLGVkeAorCWFuZAllYnAsZWN4CisJbW92CWVkeCxEV09SRCBbNDgrZXNwXQorCWFkZAllZGksZWJwCisJOyA0MF81OSA0NAorCW1vdgllYnAsZWF4CisJeG9yCWVkeCxEV09SRCBbNTYrZXNwXQorCXhvcgllYnAsZWJ4CisJeG9yCWVkeCxEV09SRCBbMTYrZXNwXQorCWFuZAllYnAsZXNpCisJeG9yCWVkeCxEV09SRCBbMzYrZXNwXQorCXJvbAllZHgsMQorCWFkZAllYnAsZWN4CisJcm9yCWVzaSwyCisJbW92CWVjeCxlZGkKKwlyb2wJZWN4LDUKKwltb3YJRFdPUkQgWzQ4K2VzcF0sZWR4CisJbGVhCWVkeCxbMjQwMDk1OTcwOCtlYnAqMStlZHhdCisJbW92CWVicCxlYXgKKwlhZGQJZWR4LGVjeAorCWFuZAllYnAsZWJ4CisJbW92CWVjeCxEV09SRCBbNTIrZXNwXQorCWFkZAllZHgsZWJwCisJOyA0MF81OSA0NQorCW1vdgllYnAsZXNpCisJeG9yCWVjeCxEV09SRCBbNjArZXNwXQorCXhvcgllYnAsZWF4CisJeG9yCWVjeCxEV09SRCBbMjArZXNwXQorCWFuZAllYnAsZWRpCisJeG9yCWVjeCxEV09SRCBbNDArZXNwXQorCXJvbAllY3gsMQorCWFkZAllYnAsZWJ4CisJcm9yCWVkaSwyCisJbW92CWVieCxlZHgKKwlyb2wJZWJ4LDUKKwltb3YJRFdPUkQgWzUyK2VzcF0sZWN4CisJbGVhCWVjeCxbMjQwMDk1OTcwOCtlYnAqMStlY3hdCisJbW92CWVicCxlc2kKKwlhZGQJZWN4LGVieAorCWFuZAllYnAsZWF4CisJbW92CWVieCxEV09SRCBbNTYrZXNwXQorCWFkZAllY3gsZWJwCisJOyA0MF81OSA0NgorCW1vdgllYnAsZWRpCisJeG9yCWVieCxEV09SRCBbZXNwXQorCXhvcgllYnAsZXNpCisJeG9yCWVieCxEV09SRCBbMjQrZXNwXQorCWFuZAllYnAsZWR4CisJeG9yCWVieCxEV09SRCBbNDQrZXNwXQorCXJvbAllYngsMQorCWFkZAllYnAsZWF4CisJcm9yCWVkeCwyCisJbW92CWVheCxlY3gKKwlyb2wJZWF4LDUKKwltb3YJRFdPUkQgWzU2K2VzcF0sZWJ4CisJbGVhCWVieCxbMjQwMDk1OTcwOCtlYnAqMStlYnhdCisJbW92CWVicCxlZGkKKwlhZGQJZWJ4LGVheAorCWFuZAllYnAsZXNpCisJbW92CWVheCxEV09SRCBbNjArZXNwXQorCWFkZAllYngsZWJwCisJOyA0MF81OSA0NworCW1vdgllYnAsZWR4CisJeG9yCWVheCxEV09SRCBbNCtlc3BdCisJeG9yCWVicCxlZGkKKwl4b3IJZWF4LERXT1JEIFsyOCtlc3BdCisJYW5kCWVicCxlY3gKKwl4b3IJZWF4LERXT1JEIFs0OCtlc3BdCisJcm9sCWVheCwxCisJYWRkCWVicCxlc2kKKwlyb3IJZWN4LDIKKwltb3YJZXNpLGVieAorCXJvbAllc2ksNQorCW1vdglEV09SRCBbNjArZXNwXSxlYXgKKwlsZWEJZWF4LFsyNDAwOTU5NzA4K2VicCoxK2VheF0KKwltb3YJZWJwLGVkeAorCWFkZAllYXgsZXNpCisJYW5kCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFtlc3BdCisJYWRkCWVheCxlYnAKKwk7IDQwXzU5IDQ4CisJbW92CWVicCxlY3gKKwl4b3IJZXNpLERXT1JEIFs4K2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllc2ksRFdPUkQgWzMyK2VzcF0KKwlhbmQJZWJwLGVieAorCXhvcgllc2ksRFdPUkQgWzUyK2VzcF0KKwlyb2wJZXNpLDEKKwlhZGQJZWJwLGVkaQorCXJvcgllYngsMgorCW1vdgllZGksZWF4CisJcm9sCWVkaSw1CisJbW92CURXT1JEIFtlc3BdLGVzaQorCWxlYQllc2ksWzI0MDA5NTk3MDgrZWJwKjErZXNpXQorCW1vdgllYnAsZWN4CisJYWRkCWVzaSxlZGkKKwlhbmQJZWJwLGVkeAorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCWFkZAllc2ksZWJwCisJOyA0MF81OSA0OQorCW1vdgllYnAsZWJ4CisJeG9yCWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVkaSxEV09SRCBbMzYrZXNwXQorCWFuZAllYnAsZWF4CisJeG9yCWVkaSxEV09SRCBbNTYrZXNwXQorCXJvbAllZGksMQorCWFkZAllYnAsZWR4CisJcm9yCWVheCwyCisJbW92CWVkeCxlc2kKKwlyb2wJZWR4LDUKKwltb3YJRFdPUkQgWzQrZXNwXSxlZGkKKwlsZWEJZWRpLFsyNDAwOTU5NzA4K2VicCoxK2VkaV0KKwltb3YJZWJwLGVieAorCWFkZAllZGksZWR4CisJYW5kCWVicCxlY3gKKwltb3YJZWR4LERXT1JEIFs4K2VzcF0KKwlhZGQJZWRpLGVicAorCTsgNDBfNTkgNTAKKwltb3YJZWJwLGVheAorCXhvcgllZHgsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWJwLGVieAorCXhvcgllZHgsRFdPUkQgWzQwK2VzcF0KKwlhbmQJZWJwLGVzaQorCXhvcgllZHgsRFdPUkQgWzYwK2VzcF0KKwlyb2wJZWR4LDEKKwlhZGQJZWJwLGVjeAorCXJvcgllc2ksMgorCW1vdgllY3gsZWRpCisJcm9sCWVjeCw1CisJbW92CURXT1JEIFs4K2VzcF0sZWR4CisJbGVhCWVkeCxbMjQwMDk1OTcwOCtlYnAqMStlZHhdCisJbW92CWVicCxlYXgKKwlhZGQJZWR4LGVjeAorCWFuZAllYnAsZWJ4CisJbW92CWVjeCxEV09SRCBbMTIrZXNwXQorCWFkZAllZHgsZWJwCisJOyA0MF81OSA1MQorCW1vdgllYnAsZXNpCisJeG9yCWVjeCxEV09SRCBbMjArZXNwXQorCXhvcgllYnAsZWF4CisJeG9yCWVjeCxEV09SRCBbNDQrZXNwXQorCWFuZAllYnAsZWRpCisJeG9yCWVjeCxEV09SRCBbZXNwXQorCXJvbAllY3gsMQorCWFkZAllYnAsZWJ4CisJcm9yCWVkaSwyCisJbW92CWVieCxlZHgKKwlyb2wJZWJ4LDUKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWN4CisJbGVhCWVjeCxbMjQwMDk1OTcwOCtlYnAqMStlY3hdCisJbW92CWVicCxlc2kKKwlhZGQJZWN4LGVieAorCWFuZAllYnAsZWF4CisJbW92CWVieCxEV09SRCBbMTYrZXNwXQorCWFkZAllY3gsZWJwCisJOyA0MF81OSA1MgorCW1vdgllYnAsZWRpCisJeG9yCWVieCxEV09SRCBbMjQrZXNwXQorCXhvcgllYnAsZXNpCisJeG9yCWVieCxEV09SRCBbNDgrZXNwXQorCWFuZAllYnAsZWR4CisJeG9yCWVieCxEV09SRCBbNCtlc3BdCisJcm9sCWVieCwxCisJYWRkCWVicCxlYXgKKwlyb3IJZWR4LDIKKwltb3YJZWF4LGVjeAorCXJvbAllYXgsNQorCW1vdglEV09SRCBbMTYrZXNwXSxlYngKKwlsZWEJZWJ4LFsyNDAwOTU5NzA4K2VicCoxK2VieF0KKwltb3YJZWJwLGVkaQorCWFkZAllYngsZWF4CisJYW5kCWVicCxlc2kKKwltb3YJZWF4LERXT1JEIFsyMCtlc3BdCisJYWRkCWVieCxlYnAKKwk7IDQwXzU5IDUzCisJbW92CWVicCxlZHgKKwl4b3IJZWF4LERXT1JEIFsyOCtlc3BdCisJeG9yCWVicCxlZGkKKwl4b3IJZWF4LERXT1JEIFs1Mitlc3BdCisJYW5kCWVicCxlY3gKKwl4b3IJZWF4LERXT1JEIFs4K2VzcF0KKwlyb2wJZWF4LDEKKwlhZGQJZWJwLGVzaQorCXJvcgllY3gsMgorCW1vdgllc2ksZWJ4CisJcm9sCWVzaSw1CisJbW92CURXT1JEIFsyMCtlc3BdLGVheAorCWxlYQllYXgsWzI0MDA5NTk3MDgrZWJwKjErZWF4XQorCW1vdgllYnAsZWR4CisJYWRkCWVheCxlc2kKKwlhbmQJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVicAorCTsgNDBfNTkgNTQKKwltb3YJZWJwLGVjeAorCXhvcgllc2ksRFdPUkQgWzMyK2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllc2ksRFdPUkQgWzU2K2VzcF0KKwlhbmQJZWJwLGVieAorCXhvcgllc2ksRFdPUkQgWzEyK2VzcF0KKwlyb2wJZXNpLDEKKwlhZGQJZWJwLGVkaQorCXJvcgllYngsMgorCW1vdgllZGksZWF4CisJcm9sCWVkaSw1CisJbW92CURXT1JEIFsyNCtlc3BdLGVzaQorCWxlYQllc2ksWzI0MDA5NTk3MDgrZWJwKjErZXNpXQorCW1vdgllYnAsZWN4CisJYWRkCWVzaSxlZGkKKwlhbmQJZWJwLGVkeAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwlhZGQJZXNpLGVicAorCTsgNDBfNTkgNTUKKwltb3YJZWJwLGVieAorCXhvcgllZGksRFdPUkQgWzM2K2VzcF0KKwl4b3IJZWJwLGVjeAorCXhvcgllZGksRFdPUkQgWzYwK2VzcF0KKwlhbmQJZWJwLGVheAorCXhvcgllZGksRFdPUkQgWzE2K2VzcF0KKwlyb2wJZWRpLDEKKwlhZGQJZWJwLGVkeAorCXJvcgllYXgsMgorCW1vdgllZHgsZXNpCisJcm9sCWVkeCw1CisJbW92CURXT1JEIFsyOCtlc3BdLGVkaQorCWxlYQllZGksWzI0MDA5NTk3MDgrZWJwKjErZWRpXQorCW1vdgllYnAsZWJ4CisJYWRkCWVkaSxlZHgKKwlhbmQJZWJwLGVjeAorCW1vdgllZHgsRFdPUkQgWzMyK2VzcF0KKwlhZGQJZWRpLGVicAorCTsgNDBfNTkgNTYKKwltb3YJZWJwLGVheAorCXhvcgllZHgsRFdPUkQgWzQwK2VzcF0KKwl4b3IJZWJwLGVieAorCXhvcgllZHgsRFdPUkQgW2VzcF0KKwlhbmQJZWJwLGVzaQorCXhvcgllZHgsRFdPUkQgWzIwK2VzcF0KKwlyb2wJZWR4LDEKKwlhZGQJZWJwLGVjeAorCXJvcgllc2ksMgorCW1vdgllY3gsZWRpCisJcm9sCWVjeCw1CisJbW92CURXT1JEIFszMitlc3BdLGVkeAorCWxlYQllZHgsWzI0MDA5NTk3MDgrZWJwKjErZWR4XQorCW1vdgllYnAsZWF4CisJYWRkCWVkeCxlY3gKKwlhbmQJZWJwLGVieAorCW1vdgllY3gsRFdPUkQgWzM2K2VzcF0KKwlhZGQJZWR4LGVicAorCTsgNDBfNTkgNTcKKwltb3YJZWJwLGVzaQorCXhvcgllY3gsRFdPUkQgWzQ0K2VzcF0KKwl4b3IJZWJwLGVheAorCXhvcgllY3gsRFdPUkQgWzQrZXNwXQorCWFuZAllYnAsZWRpCisJeG9yCWVjeCxEV09SRCBbMjQrZXNwXQorCXJvbAllY3gsMQorCWFkZAllYnAsZWJ4CisJcm9yCWVkaSwyCisJbW92CWVieCxlZHgKKwlyb2wJZWJ4LDUKKwltb3YJRFdPUkQgWzM2K2VzcF0sZWN4CisJbGVhCWVjeCxbMjQwMDk1OTcwOCtlYnAqMStlY3hdCisJbW92CWVicCxlc2kKKwlhZGQJZWN4LGVieAorCWFuZAllYnAsZWF4CisJbW92CWVieCxEV09SRCBbNDArZXNwXQorCWFkZAllY3gsZWJwCisJOyA0MF81OSA1OAorCW1vdgllYnAsZWRpCisJeG9yCWVieCxEV09SRCBbNDgrZXNwXQorCXhvcgllYnAsZXNpCisJeG9yCWVieCxEV09SRCBbOCtlc3BdCisJYW5kCWVicCxlZHgKKwl4b3IJZWJ4LERXT1JEIFsyOCtlc3BdCisJcm9sCWVieCwxCisJYWRkCWVicCxlYXgKKwlyb3IJZWR4LDIKKwltb3YJZWF4LGVjeAorCXJvbAllYXgsNQorCW1vdglEV09SRCBbNDArZXNwXSxlYngKKwlsZWEJZWJ4LFsyNDAwOTU5NzA4K2VicCoxK2VieF0KKwltb3YJZWJwLGVkaQorCWFkZAllYngsZWF4CisJYW5kCWVicCxlc2kKKwltb3YJZWF4LERXT1JEIFs0NCtlc3BdCisJYWRkCWVieCxlYnAKKwk7IDQwXzU5IDU5CisJbW92CWVicCxlZHgKKwl4b3IJZWF4LERXT1JEIFs1Mitlc3BdCisJeG9yCWVicCxlZGkKKwl4b3IJZWF4LERXT1JEIFsxMitlc3BdCisJYW5kCWVicCxlY3gKKwl4b3IJZWF4LERXT1JEIFszMitlc3BdCisJcm9sCWVheCwxCisJYWRkCWVicCxlc2kKKwlyb3IJZWN4LDIKKwltb3YJZXNpLGVieAorCXJvbAllc2ksNQorCW1vdglEV09SRCBbNDQrZXNwXSxlYXgKKwlsZWEJZWF4LFsyNDAwOTU5NzA4K2VicCoxK2VheF0KKwltb3YJZWJwLGVkeAorCWFkZAllYXgsZXNpCisJYW5kCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs0OCtlc3BdCisJYWRkCWVheCxlYnAKKwk7IDIwXzM5IDYwCisJbW92CWVicCxlYngKKwl4b3IJZXNpLERXT1JEIFs1Nitlc3BdCisJeG9yCWVicCxlY3gKKwl4b3IJZXNpLERXT1JEIFsxNitlc3BdCisJeG9yCWVicCxlZHgKKwl4b3IJZXNpLERXT1JEIFszNitlc3BdCisJcm9sCWVzaSwxCisJYWRkCWVkaSxlYnAKKwlyb3IJZWJ4LDIKKwltb3YJZWJwLGVheAorCXJvbAllYnAsNQorCW1vdglEV09SRCBbNDgrZXNwXSxlc2kKKwlsZWEJZXNpLFszMzk1NDY5NzgyK2VkaSoxK2VzaV0KKwltb3YJZWRpLERXT1JEIFs1Mitlc3BdCisJYWRkCWVzaSxlYnAKKwk7IDIwXzM5IDYxCisJbW92CWVicCxlYXgKKwl4b3IJZWRpLERXT1JEIFs2MCtlc3BdCisJeG9yCWVicCxlYngKKwl4b3IJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVicCxlY3gKKwl4b3IJZWRpLERXT1JEIFs0MCtlc3BdCisJcm9sCWVkaSwxCisJYWRkCWVkeCxlYnAKKwlyb3IJZWF4LDIKKwltb3YJZWJwLGVzaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbNTIrZXNwXSxlZGkKKwlsZWEJZWRpLFszMzk1NDY5NzgyK2VkeCoxK2VkaV0KKwltb3YJZWR4LERXT1JEIFs1Nitlc3BdCisJYWRkCWVkaSxlYnAKKwk7IDIwXzM5IDYyCisJbW92CWVicCxlc2kKKwl4b3IJZWR4LERXT1JEIFtlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWR4LERXT1JEIFsyNCtlc3BdCisJeG9yCWVicCxlYngKKwl4b3IJZWR4LERXT1JEIFs0NCtlc3BdCisJcm9sCWVkeCwxCisJYWRkCWVjeCxlYnAKKwlyb3IJZXNpLDIKKwltb3YJZWJwLGVkaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbNTYrZXNwXSxlZHgKKwlsZWEJZWR4LFszMzk1NDY5NzgyK2VjeCoxK2VkeF0KKwltb3YJZWN4LERXT1JEIFs2MCtlc3BdCisJYWRkCWVkeCxlYnAKKwk7IDIwXzM5IDYzCisJbW92CWVicCxlZGkKKwl4b3IJZWN4LERXT1JEIFs0K2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllY3gsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVheAorCXhvcgllY3gsRFdPUkQgWzQ4K2VzcF0KKwlyb2wJZWN4LDEKKwlhZGQJZWJ4LGVicAorCXJvcgllZGksMgorCW1vdgllYnAsZWR4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs2MCtlc3BdLGVjeAorCWxlYQllY3gsWzMzOTU0Njk3ODIrZWJ4KjErZWN4XQorCW1vdgllYngsRFdPUkQgW2VzcF0KKwlhZGQJZWN4LGVicAorCTsgMjBfMzkgNjQKKwltb3YJZWJwLGVkeAorCXhvcgllYngsRFdPUkQgWzgrZXNwXQorCXhvcgllYnAsZWRpCisJeG9yCWVieCxEV09SRCBbMzIrZXNwXQorCXhvcgllYnAsZXNpCisJeG9yCWVieCxEV09SRCBbNTIrZXNwXQorCXJvbAllYngsMQorCWFkZAllYXgsZWJwCisJcm9yCWVkeCwyCisJbW92CWVicCxlY3gKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgW2VzcF0sZWJ4CisJbGVhCWVieCxbMzM5NTQ2OTc4MitlYXgqMStlYnhdCisJbW92CWVheCxEV09SRCBbNCtlc3BdCisJYWRkCWVieCxlYnAKKwk7IDIwXzM5IDY1CisJbW92CWVicCxlY3gKKwl4b3IJZWF4LERXT1JEIFsxMitlc3BdCisJeG9yCWVicCxlZHgKKwl4b3IJZWF4LERXT1JEIFszNitlc3BdCisJeG9yCWVicCxlZGkKKwl4b3IJZWF4LERXT1JEIFs1Nitlc3BdCisJcm9sCWVheCwxCisJYWRkCWVzaSxlYnAKKwlyb3IJZWN4LDIKKwltb3YJZWJwLGVieAorCXJvbAllYnAsNQorCW1vdglEV09SRCBbNCtlc3BdLGVheAorCWxlYQllYXgsWzMzOTU0Njk3ODIrZXNpKjErZWF4XQorCW1vdgllc2ksRFdPUkQgWzgrZXNwXQorCWFkZAllYXgsZWJwCisJOyAyMF8zOSA2NgorCW1vdgllYnAsZWJ4CisJeG9yCWVzaSxEV09SRCBbMTYrZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVzaSxEV09SRCBbNDArZXNwXQorCXhvcgllYnAsZWR4CisJeG9yCWVzaSxEV09SRCBbNjArZXNwXQorCXJvbAllc2ksMQorCWFkZAllZGksZWJwCisJcm9yCWVieCwyCisJbW92CWVicCxlYXgKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzgrZXNwXSxlc2kKKwlsZWEJZXNpLFszMzk1NDY5NzgyK2VkaSoxK2VzaV0KKwltb3YJZWRpLERXT1JEIFsxMitlc3BdCisJYWRkCWVzaSxlYnAKKwk7IDIwXzM5IDY3CisJbW92CWVicCxlYXgKKwl4b3IJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVicCxlYngKKwl4b3IJZWRpLERXT1JEIFs0NCtlc3BdCisJeG9yCWVicCxlY3gKKwl4b3IJZWRpLERXT1JEIFtlc3BdCisJcm9sCWVkaSwxCisJYWRkCWVkeCxlYnAKKwlyb3IJZWF4LDIKKwltb3YJZWJwLGVzaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbMTIrZXNwXSxlZGkKKwlsZWEJZWRpLFszMzk1NDY5NzgyK2VkeCoxK2VkaV0KKwltb3YJZWR4LERXT1JEIFsxNitlc3BdCisJYWRkCWVkaSxlYnAKKwk7IDIwXzM5IDY4CisJbW92CWVicCxlc2kKKwl4b3IJZWR4LERXT1JEIFsyNCtlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVicCxlYngKKwl4b3IJZWR4LERXT1JEIFs0K2VzcF0KKwlyb2wJZWR4LDEKKwlhZGQJZWN4LGVicAorCXJvcgllc2ksMgorCW1vdgllYnAsZWRpCisJcm9sCWVicCw1CisJbW92CURXT1JEIFsxNitlc3BdLGVkeAorCWxlYQllZHgsWzMzOTU0Njk3ODIrZWN4KjErZWR4XQorCW1vdgllY3gsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWR4LGVicAorCTsgMjBfMzkgNjkKKwltb3YJZWJwLGVkaQorCXhvcgllY3gsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllY3gsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWJwLGVheAorCXhvcgllY3gsRFdPUkQgWzgrZXNwXQorCXJvbAllY3gsMQorCWFkZAllYngsZWJwCisJcm9yCWVkaSwyCisJbW92CWVicCxlZHgKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWN4CisJbGVhCWVjeCxbMzM5NTQ2OTc4MitlYngqMStlY3hdCisJbW92CWVieCxEV09SRCBbMjQrZXNwXQorCWFkZAllY3gsZWJwCisJOyAyMF8zOSA3MAorCW1vdgllYnAsZWR4CisJeG9yCWVieCxEV09SRCBbMzIrZXNwXQorCXhvcgllYnAsZWRpCisJeG9yCWVieCxEV09SRCBbNTYrZXNwXQorCXhvcgllYnAsZXNpCisJeG9yCWVieCxEV09SRCBbMTIrZXNwXQorCXJvbAllYngsMQorCWFkZAllYXgsZWJwCisJcm9yCWVkeCwyCisJbW92CWVicCxlY3gKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWJ4CisJbGVhCWVieCxbMzM5NTQ2OTc4MitlYXgqMStlYnhdCisJbW92CWVheCxEV09SRCBbMjgrZXNwXQorCWFkZAllYngsZWJwCisJOyAyMF8zOSA3MQorCW1vdgllYnAsZWN4CisJeG9yCWVheCxEV09SRCBbMzYrZXNwXQorCXhvcgllYnAsZWR4CisJeG9yCWVheCxEV09SRCBbNjArZXNwXQorCXhvcgllYnAsZWRpCisJeG9yCWVheCxEV09SRCBbMTYrZXNwXQorCXJvbAllYXgsMQorCWFkZAllc2ksZWJwCisJcm9yCWVjeCwyCisJbW92CWVicCxlYngKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWF4CisJbGVhCWVheCxbMzM5NTQ2OTc4Mitlc2kqMStlYXhdCisJbW92CWVzaSxEV09SRCBbMzIrZXNwXQorCWFkZAllYXgsZWJwCisJOyAyMF8zOSA3MgorCW1vdgllYnAsZWJ4CisJeG9yCWVzaSxEV09SRCBbNDArZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVzaSxEV09SRCBbZXNwXQorCXhvcgllYnAsZWR4CisJeG9yCWVzaSxEV09SRCBbMjArZXNwXQorCXJvbAllc2ksMQorCWFkZAllZGksZWJwCisJcm9yCWVieCwyCisJbW92CWVicCxlYXgKKwlyb2wJZWJwLDUKKwltb3YJRFdPUkQgWzMyK2VzcF0sZXNpCisJbGVhCWVzaSxbMzM5NTQ2OTc4MitlZGkqMStlc2ldCisJbW92CWVkaSxEV09SRCBbMzYrZXNwXQorCWFkZAllc2ksZWJwCisJOyAyMF8zOSA3MworCW1vdgllYnAsZWF4CisJeG9yCWVkaSxEV09SRCBbNDQrZXNwXQorCXhvcgllYnAsZWJ4CisJeG9yCWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVicCxlY3gKKwl4b3IJZWRpLERXT1JEIFsyNCtlc3BdCisJcm9sCWVkaSwxCisJYWRkCWVkeCxlYnAKKwlyb3IJZWF4LDIKKwltb3YJZWJwLGVzaQorCXJvbAllYnAsNQorCW1vdglEV09SRCBbMzYrZXNwXSxlZGkKKwlsZWEJZWRpLFszMzk1NDY5NzgyK2VkeCoxK2VkaV0KKwltb3YJZWR4LERXT1JEIFs0MCtlc3BdCisJYWRkCWVkaSxlYnAKKwk7IDIwXzM5IDc0CisJbW92CWVicCxlc2kKKwl4b3IJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVicCxlYXgKKwl4b3IJZWR4LERXT1JEIFs4K2VzcF0KKwl4b3IJZWJwLGVieAorCXhvcgllZHgsRFdPUkQgWzI4K2VzcF0KKwlyb2wJZWR4LDEKKwlhZGQJZWN4LGVicAorCXJvcgllc2ksMgorCW1vdgllYnAsZWRpCisJcm9sCWVicCw1CisJbW92CURXT1JEIFs0MCtlc3BdLGVkeAorCWxlYQllZHgsWzMzOTU0Njk3ODIrZWN4KjErZWR4XQorCW1vdgllY3gsRFdPUkQgWzQ0K2VzcF0KKwlhZGQJZWR4LGVicAorCTsgMjBfMzkgNzUKKwltb3YJZWJwLGVkaQorCXhvcgllY3gsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllY3gsRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWJwLGVheAorCXhvcgllY3gsRFdPUkQgWzMyK2VzcF0KKwlyb2wJZWN4LDEKKwlhZGQJZWJ4LGVicAorCXJvcgllZGksMgorCW1vdgllYnAsZWR4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs0NCtlc3BdLGVjeAorCWxlYQllY3gsWzMzOTU0Njk3ODIrZWJ4KjErZWN4XQorCW1vdgllYngsRFdPUkQgWzQ4K2VzcF0KKwlhZGQJZWN4LGVicAorCTsgMjBfMzkgNzYKKwltb3YJZWJwLGVkeAorCXhvcgllYngsRFdPUkQgWzU2K2VzcF0KKwl4b3IJZWJwLGVkaQorCXhvcgllYngsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWJwLGVzaQorCXhvcgllYngsRFdPUkQgWzM2K2VzcF0KKwlyb2wJZWJ4LDEKKwlhZGQJZWF4LGVicAorCXJvcgllZHgsMgorCW1vdgllYnAsZWN4CisJcm9sCWVicCw1CisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCWxlYQllYngsWzMzOTU0Njk3ODIrZWF4KjErZWJ4XQorCW1vdgllYXgsRFdPUkQgWzUyK2VzcF0KKwlhZGQJZWJ4LGVicAorCTsgMjBfMzkgNzcKKwltb3YJZWJwLGVjeAorCXhvcgllYXgsRFdPUkQgWzYwK2VzcF0KKwl4b3IJZWJwLGVkeAorCXhvcgllYXgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWJwLGVkaQorCXhvcgllYXgsRFdPUkQgWzQwK2VzcF0KKwlyb2wJZWF4LDEKKwlhZGQJZXNpLGVicAorCXJvcgllY3gsMgorCW1vdgllYnAsZWJ4CisJcm9sCWVicCw1CisJbGVhCWVheCxbMzM5NTQ2OTc4Mitlc2kqMStlYXhdCisJbW92CWVzaSxEV09SRCBbNTYrZXNwXQorCWFkZAllYXgsZWJwCisJOyAyMF8zOSA3OAorCW1vdgllYnAsZWJ4CisJeG9yCWVzaSxEV09SRCBbZXNwXQorCXhvcgllYnAsZWN4CisJeG9yCWVzaSxEV09SRCBbMjQrZXNwXQorCXhvcgllYnAsZWR4CisJeG9yCWVzaSxEV09SRCBbNDQrZXNwXQorCXJvbAllc2ksMQorCWFkZAllZGksZWJwCisJcm9yCWVieCwyCisJbW92CWVicCxlYXgKKwlyb2wJZWJwLDUKKwlsZWEJZXNpLFszMzk1NDY5NzgyK2VkaSoxK2VzaV0KKwltb3YJZWRpLERXT1JEIFs2MCtlc3BdCisJYWRkCWVzaSxlYnAKKwk7IDIwXzM5IDc5CisJbW92CWVicCxlYXgKKwl4b3IJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWJwLGVieAorCXhvcgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVjeAorCXhvcgllZGksRFdPUkQgWzQ4K2VzcF0KKwlyb2wJZWRpLDEKKwlhZGQJZWR4LGVicAorCXJvcgllYXgsMgorCW1vdgllYnAsZXNpCisJcm9sCWVicCw1CisJbGVhCWVkaSxbMzM5NTQ2OTc4MitlZHgqMStlZGldCisJYWRkCWVkaSxlYnAKKwltb3YJZWJwLERXT1JEIFs5Nitlc3BdCisJbW92CWVkeCxEV09SRCBbMTAwK2VzcF0KKwlhZGQJZWRpLERXT1JEIFtlYnBdCisJYWRkCWVzaSxEV09SRCBbNCtlYnBdCisJYWRkCWVheCxEV09SRCBbOCtlYnBdCisJYWRkCWVieCxEV09SRCBbMTIrZWJwXQorCWFkZAllY3gsRFdPUkQgWzE2K2VicF0KKwltb3YJRFdPUkQgW2VicF0sZWRpCisJYWRkCWVkeCw2NAorCW1vdglEV09SRCBbNCtlYnBdLGVzaQorCWNtcAllZHgsRFdPUkQgWzEwNCtlc3BdCisJbW92CURXT1JEIFs4K2VicF0sZWF4CisJbW92CWVkaSxlY3gKKwltb3YJRFdPUkQgWzEyK2VicF0sZWJ4CisJbW92CWVzaSxlZHgKKwltb3YJRFdPUkQgWzE2K2VicF0sZWN4CisJamIJTkVBUiBMJDAwMmxvb3AKKwlhZGQJZXNwLDc2CisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JMTYKK19fc2hhMV9ibG9ja19kYXRhX29yZGVyX3Nzc2UzOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJY2FsbAlMJDAwM3BpY19wb2ludAorTCQwMDNwaWNfcG9pbnQ6CisJcG9wCWVicAorCWxlYQllYnAsWyhMJEtfWFhfWFgtTCQwMDNwaWNfcG9pbnQpK2VicF0KK0wkc3NzZTNfc2hvcnRjdXQ6CisJbW92ZHFhCXhtbTcsW2VicF0KKwltb3ZkcWEJeG1tMCxbMTYrZWJwXQorCW1vdmRxYQl4bW0xLFszMitlYnBdCisJbW92ZHFhCXhtbTIsWzQ4K2VicF0KKwltb3ZkcWEJeG1tNixbNjQrZWJwXQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwltb3YJZWJwLERXT1JEIFsyNCtlc3BdCisJbW92CWVkeCxEV09SRCBbMjgrZXNwXQorCW1vdgllc2ksZXNwCisJc3ViCWVzcCwyMDgKKwlhbmQJZXNwLC02NAorCW1vdmRxYQlbMTEyK2VzcF0seG1tMAorCW1vdmRxYQlbMTI4K2VzcF0seG1tMQorCW1vdmRxYQlbMTQ0K2VzcF0seG1tMgorCXNobAllZHgsNgorCW1vdmRxYQlbMTYwK2VzcF0seG1tNworCWFkZAllZHgsZWJwCisJbW92ZHFhCVsxNzYrZXNwXSx4bW02CisJYWRkCWVicCw2NAorCW1vdglEV09SRCBbMTkyK2VzcF0sZWRpCisJbW92CURXT1JEIFsxOTYrZXNwXSxlYnAKKwltb3YJRFdPUkQgWzIwMCtlc3BdLGVkeAorCW1vdglEV09SRCBbMjA0K2VzcF0sZXNpCisJbW92CWVheCxEV09SRCBbZWRpXQorCW1vdgllYngsRFdPUkQgWzQrZWRpXQorCW1vdgllY3gsRFdPUkQgWzgrZWRpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwltb3YJZWRpLERXT1JEIFsxNitlZGldCisJbW92CWVzaSxlYngKKwltb3ZkcXUJeG1tMCxbZWJwLTY0XQorCW1vdmRxdQl4bW0xLFtlYnAtNDhdCisJbW92ZHF1CXhtbTIsW2VicC0zMl0KKwltb3ZkcXUJeG1tMyxbZWJwLTE2XQorZGIJMTAyLDE1LDU2LDAsMTk4CitkYgkxMDIsMTUsNTYsMCwyMDYKK2RiCTEwMiwxNSw1NiwwLDIxNAorCW1vdmRxYQlbOTYrZXNwXSx4bW03CitkYgkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAl4bW0wLHhtbTcKKwlwYWRkZAl4bW0xLHhtbTcKKwlwYWRkZAl4bW0yLHhtbTcKKwltb3ZkcWEJW2VzcF0seG1tMAorCXBzdWJkCXhtbTAseG1tNworCW1vdmRxYQlbMTYrZXNwXSx4bW0xCisJcHN1YmQJeG1tMSx4bW03CisJbW92ZHFhCVszMitlc3BdLHhtbTIKKwltb3YJZWJwLGVjeAorCXBzdWJkCXhtbTIseG1tNworCXhvcgllYnAsZWR4CisJcHNodWZkCXhtbTQseG1tMCwyMzgKKwlhbmQJZXNpLGVicAorCWptcAlORUFSIEwkMDA0bG9vcAorYWxpZ24JMTYKK0wkMDA0bG9vcDoKKwlyb3IJZWJ4LDIKKwl4b3IJZXNpLGVkeAorCW1vdgllYnAsZWF4CisJcHVucGNrbHFkcQl4bW00LHhtbTEKKwltb3ZkcWEJeG1tNix4bW0zCisJYWRkCWVkaSxEV09SRCBbZXNwXQorCXhvcgllYngsZWN4CisJcGFkZGQJeG1tNyx4bW0zCisJbW92ZHFhCVs2NCtlc3BdLHhtbTAKKwlyb2wJZWF4LDUKKwlhZGQJZWRpLGVzaQorCXBzcmxkcQl4bW02LDQKKwlhbmQJZWJwLGVieAorCXhvcgllYngsZWN4CisJcHhvcgl4bW00LHhtbTAKKwlhZGQJZWRpLGVheAorCXJvcgllYXgsNworCXB4b3IJeG1tNix4bW0yCisJeG9yCWVicCxlY3gKKwltb3YJZXNpLGVkaQorCWFkZAllZHgsRFdPUkQgWzQrZXNwXQorCXB4b3IJeG1tNCx4bW02CisJeG9yCWVheCxlYngKKwlyb2wJZWRpLDUKKwltb3ZkcWEJWzQ4K2VzcF0seG1tNworCWFkZAllZHgsZWJwCisJYW5kCWVzaSxlYXgKKwltb3ZkcWEJeG1tMCx4bW00CisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVkaQorCXJvcgllZGksNworCW1vdmRxYQl4bW02LHhtbTQKKwl4b3IJZXNpLGVieAorCXBzbGxkcQl4bW0wLDEyCisJcGFkZGQJeG1tNCx4bW00CisJbW92CWVicCxlZHgKKwlhZGQJZWN4LERXT1JEIFs4K2VzcF0KKwlwc3JsZAl4bW02LDMxCisJeG9yCWVkaSxlYXgKKwlyb2wJZWR4LDUKKwltb3ZkcWEJeG1tNyx4bW0wCisJYWRkCWVjeCxlc2kKKwlhbmQJZWJwLGVkaQorCXhvcgllZGksZWF4CisJcHNybGQJeG1tMCwzMAorCWFkZAllY3gsZWR4CisJcm9yCWVkeCw3CisJcG9yCXhtbTQseG1tNgorCXhvcgllYnAsZWF4CisJbW92CWVzaSxlY3gKKwlhZGQJZWJ4LERXT1JEIFsxMitlc3BdCisJcHNsbGQJeG1tNywyCisJeG9yCWVkeCxlZGkKKwlyb2wJZWN4LDUKKwlweG9yCXhtbTQseG1tMAorCW1vdmRxYQl4bW0wLFs5Nitlc3BdCisJYWRkCWVieCxlYnAKKwlhbmQJZXNpLGVkeAorCXB4b3IJeG1tNCx4bW03CisJcHNodWZkCXhtbTUseG1tMSwyMzgKKwl4b3IJZWR4LGVkaQorCWFkZAllYngsZWN4CisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwltb3YJZWJwLGVieAorCXB1bnBja2xxZHEJeG1tNSx4bW0yCisJbW92ZHFhCXhtbTcseG1tNAorCWFkZAllYXgsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWN4LGVkeAorCXBhZGRkCXhtbTAseG1tNAorCW1vdmRxYQlbODArZXNwXSx4bW0xCisJcm9sCWVieCw1CisJYWRkCWVheCxlc2kKKwlwc3JsZHEJeG1tNyw0CisJYW5kCWVicCxlY3gKKwl4b3IJZWN4LGVkeAorCXB4b3IJeG1tNSx4bW0xCisJYWRkCWVheCxlYngKKwlyb3IJZWJ4LDcKKwlweG9yCXhtbTcseG1tMworCXhvcgllYnAsZWR4CisJbW92CWVzaSxlYXgKKwlhZGQJZWRpLERXT1JEIFsyMCtlc3BdCisJcHhvcgl4bW01LHhtbTcKKwl4b3IJZWJ4LGVjeAorCXJvbAllYXgsNQorCW1vdmRxYQlbZXNwXSx4bW0wCisJYWRkCWVkaSxlYnAKKwlhbmQJZXNpLGVieAorCW1vdmRxYQl4bW0xLHhtbTUKKwl4b3IJZWJ4LGVjeAorCWFkZAllZGksZWF4CisJcm9yCWVheCw3CisJbW92ZHFhCXhtbTcseG1tNQorCXhvcgllc2ksZWN4CisJcHNsbGRxCXhtbTEsMTIKKwlwYWRkZAl4bW01LHhtbTUKKwltb3YJZWJwLGVkaQorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlwc3JsZAl4bW03LDMxCisJeG9yCWVheCxlYngKKwlyb2wJZWRpLDUKKwltb3ZkcWEJeG1tMCx4bW0xCisJYWRkCWVkeCxlc2kKKwlhbmQJZWJwLGVheAorCXhvcgllYXgsZWJ4CisJcHNybGQJeG1tMSwzMAorCWFkZAllZHgsZWRpCisJcm9yCWVkaSw3CisJcG9yCXhtbTUseG1tNworCXhvcgllYnAsZWJ4CisJbW92CWVzaSxlZHgKKwlhZGQJZWN4LERXT1JEIFsyOCtlc3BdCisJcHNsbGQJeG1tMCwyCisJeG9yCWVkaSxlYXgKKwlyb2wJZWR4LDUKKwlweG9yCXhtbTUseG1tMQorCW1vdmRxYQl4bW0xLFsxMTIrZXNwXQorCWFkZAllY3gsZWJwCisJYW5kCWVzaSxlZGkKKwlweG9yCXhtbTUseG1tMAorCXBzaHVmZAl4bW02LHhtbTIsMjM4CisJeG9yCWVkaSxlYXgKKwlhZGQJZWN4LGVkeAorCXJvcgllZHgsNworCXhvcgllc2ksZWF4CisJbW92CWVicCxlY3gKKwlwdW5wY2tscWRxCXhtbTYseG1tMworCW1vdmRxYQl4bW0wLHhtbTUKKwlhZGQJZWJ4LERXT1JEIFszMitlc3BdCisJeG9yCWVkeCxlZGkKKwlwYWRkZAl4bW0xLHhtbTUKKwltb3ZkcWEJWzk2K2VzcF0seG1tMgorCXJvbAllY3gsNQorCWFkZAllYngsZXNpCisJcHNybGRxCXhtbTAsNAorCWFuZAllYnAsZWR4CisJeG9yCWVkeCxlZGkKKwlweG9yCXhtbTYseG1tMgorCWFkZAllYngsZWN4CisJcm9yCWVjeCw3CisJcHhvcgl4bW0wLHhtbTQKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksZWJ4CisJYWRkCWVheCxEV09SRCBbMzYrZXNwXQorCXB4b3IJeG1tNix4bW0wCisJeG9yCWVjeCxlZHgKKwlyb2wJZWJ4LDUKKwltb3ZkcWEJWzE2K2VzcF0seG1tMQorCWFkZAllYXgsZWJwCisJYW5kCWVzaSxlY3gKKwltb3ZkcWEJeG1tMix4bW02CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCXJvcgllYngsNworCW1vdmRxYQl4bW0wLHhtbTYKKwl4b3IJZXNpLGVkeAorCXBzbGxkcQl4bW0yLDEyCisJcGFkZGQJeG1tNix4bW02CisJbW92CWVicCxlYXgKKwlhZGQJZWRpLERXT1JEIFs0MCtlc3BdCisJcHNybGQJeG1tMCwzMQorCXhvcgllYngsZWN4CisJcm9sCWVheCw1CisJbW92ZHFhCXhtbTEseG1tMgorCWFkZAllZGksZXNpCisJYW5kCWVicCxlYngKKwl4b3IJZWJ4LGVjeAorCXBzcmxkCXhtbTIsMzAKKwlhZGQJZWRpLGVheAorCXJvcgllYXgsNworCXBvcgl4bW02LHhtbTAKKwl4b3IJZWJwLGVjeAorCW1vdmRxYQl4bW0wLFs2NCtlc3BdCisJbW92CWVzaSxlZGkKKwlhZGQJZWR4LERXT1JEIFs0NCtlc3BdCisJcHNsbGQJeG1tMSwyCisJeG9yCWVheCxlYngKKwlyb2wJZWRpLDUKKwlweG9yCXhtbTYseG1tMgorCW1vdmRxYQl4bW0yLFsxMTIrZXNwXQorCWFkZAllZHgsZWJwCisJYW5kCWVzaSxlYXgKKwlweG9yCXhtbTYseG1tMQorCXBzaHVmZAl4bW03LHhtbTMsMjM4CisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVkaQorCXJvcgllZGksNworCXhvcgllc2ksZWJ4CisJbW92CWVicCxlZHgKKwlwdW5wY2tscWRxCXhtbTcseG1tNAorCW1vdmRxYQl4bW0xLHhtbTYKKwlhZGQJZWN4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVkaSxlYXgKKwlwYWRkZAl4bW0yLHhtbTYKKwltb3ZkcWEJWzY0K2VzcF0seG1tMworCXJvbAllZHgsNQorCWFkZAllY3gsZXNpCisJcHNybGRxCXhtbTEsNAorCWFuZAllYnAsZWRpCisJeG9yCWVkaSxlYXgKKwlweG9yCXhtbTcseG1tMworCWFkZAllY3gsZWR4CisJcm9yCWVkeCw3CisJcHhvcgl4bW0xLHhtbTUKKwl4b3IJZWJwLGVheAorCW1vdgllc2ksZWN4CisJYWRkCWVieCxEV09SRCBbNTIrZXNwXQorCXB4b3IJeG1tNyx4bW0xCisJeG9yCWVkeCxlZGkKKwlyb2wJZWN4LDUKKwltb3ZkcWEJWzMyK2VzcF0seG1tMgorCWFkZAllYngsZWJwCisJYW5kCWVzaSxlZHgKKwltb3ZkcWEJeG1tMyx4bW03CisJeG9yCWVkeCxlZGkKKwlhZGQJZWJ4LGVjeAorCXJvcgllY3gsNworCW1vdmRxYQl4bW0xLHhtbTcKKwl4b3IJZXNpLGVkaQorCXBzbGxkcQl4bW0zLDEyCisJcGFkZGQJeG1tNyx4bW03CisJbW92CWVicCxlYngKKwlhZGQJZWF4LERXT1JEIFs1Nitlc3BdCisJcHNybGQJeG1tMSwzMQorCXhvcgllY3gsZWR4CisJcm9sCWVieCw1CisJbW92ZHFhCXhtbTIseG1tMworCWFkZAllYXgsZXNpCisJYW5kCWVicCxlY3gKKwl4b3IJZWN4LGVkeAorCXBzcmxkCXhtbTMsMzAKKwlhZGQJZWF4LGVieAorCXJvcgllYngsNworCXBvcgl4bW03LHhtbTEKKwl4b3IJZWJwLGVkeAorCW1vdmRxYQl4bW0xLFs4MCtlc3BdCisJbW92CWVzaSxlYXgKKwlhZGQJZWRpLERXT1JEIFs2MCtlc3BdCisJcHNsbGQJeG1tMiwyCisJeG9yCWVieCxlY3gKKwlyb2wJZWF4LDUKKwlweG9yCXhtbTcseG1tMworCW1vdmRxYQl4bW0zLFsxMTIrZXNwXQorCWFkZAllZGksZWJwCisJYW5kCWVzaSxlYngKKwlweG9yCXhtbTcseG1tMgorCXBzaHVmZAl4bW0yLHhtbTYsMjM4CisJeG9yCWVieCxlY3gKKwlhZGQJZWRpLGVheAorCXJvcgllYXgsNworCXB4b3IJeG1tMCx4bW00CisJcHVucGNrbHFkcQl4bW0yLHhtbTcKKwl4b3IJZXNpLGVjeAorCW1vdgllYnAsZWRpCisJYWRkCWVkeCxEV09SRCBbZXNwXQorCXB4b3IJeG1tMCx4bW0xCisJbW92ZHFhCVs4MCtlc3BdLHhtbTQKKwl4b3IJZWF4LGVieAorCXJvbAllZGksNQorCW1vdmRxYQl4bW00LHhtbTMKKwlhZGQJZWR4LGVzaQorCXBhZGRkCXhtbTMseG1tNworCWFuZAllYnAsZWF4CisJcHhvcgl4bW0wLHhtbTIKKwl4b3IJZWF4LGVieAorCWFkZAllZHgsZWRpCisJcm9yCWVkaSw3CisJeG9yCWVicCxlYngKKwltb3ZkcWEJeG1tMix4bW0wCisJbW92ZHFhCVs0OCtlc3BdLHhtbTMKKwltb3YJZXNpLGVkeAorCWFkZAllY3gsRFdPUkQgWzQrZXNwXQorCXhvcgllZGksZWF4CisJcm9sCWVkeCw1CisJcHNsbGQJeG1tMCwyCisJYWRkCWVjeCxlYnAKKwlhbmQJZXNpLGVkaQorCXBzcmxkCXhtbTIsMzAKKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWR4CisJcm9yCWVkeCw3CisJeG9yCWVzaSxlYXgKKwltb3YJZWJwLGVjeAorCWFkZAllYngsRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWRpCisJcm9sCWVjeCw1CisJcG9yCXhtbTAseG1tMgorCWFkZAllYngsZXNpCisJYW5kCWVicCxlZHgKKwltb3ZkcWEJeG1tMixbOTYrZXNwXQorCXhvcgllZHgsZWRpCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFsxMitlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVieAorCXBzaHVmZAl4bW0zLHhtbTcsMjM4CisJcm9sCWVieCw1CisJYWRkCWVheCxlYnAKKwl4b3IJZXNpLGVkeAorCXJvcgllY3gsNworCWFkZAllYXgsZWJ4CisJYWRkCWVkaSxEV09SRCBbMTYrZXNwXQorCXB4b3IJeG1tMSx4bW01CisJcHVucGNrbHFkcQl4bW0zLHhtbTAKKwl4b3IJZXNpLGVjeAorCW1vdgllYnAsZWF4CisJcm9sCWVheCw1CisJcHhvcgl4bW0xLHhtbTIKKwltb3ZkcWEJWzk2K2VzcF0seG1tNQorCWFkZAllZGksZXNpCisJeG9yCWVicCxlY3gKKwltb3ZkcWEJeG1tNSx4bW00CisJcm9yCWVieCw3CisJcGFkZGQJeG1tNCx4bW0wCisJYWRkCWVkaSxlYXgKKwlweG9yCXhtbTEseG1tMworCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWJwLGVieAorCW1vdgllc2ksZWRpCisJcm9sCWVkaSw1CisJbW92ZHFhCXhtbTMseG1tMQorCW1vdmRxYQlbZXNwXSx4bW00CisJYWRkCWVkeCxlYnAKKwl4b3IJZXNpLGVieAorCXJvcgllYXgsNworCWFkZAllZHgsZWRpCisJcHNsbGQJeG1tMSwyCisJYWRkCWVjeCxEV09SRCBbMjQrZXNwXQorCXhvcgllc2ksZWF4CisJcHNybGQJeG1tMywzMAorCW1vdgllYnAsZWR4CisJcm9sCWVkeCw1CisJYWRkCWVjeCxlc2kKKwl4b3IJZWJwLGVheAorCXJvcgllZGksNworCWFkZAllY3gsZWR4CisJcG9yCXhtbTEseG1tMworCWFkZAllYngsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVkaQorCW1vdmRxYQl4bW0zLFs2NCtlc3BdCisJbW92CWVzaSxlY3gKKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVicAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw3CisJcHNodWZkCXhtbTQseG1tMCwyMzgKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkQgWzMyK2VzcF0KKwlweG9yCXhtbTIseG1tNgorCXB1bnBja2xxZHEJeG1tNCx4bW0xCisJeG9yCWVzaSxlZHgKKwltb3YJZWJwLGVieAorCXJvbAllYngsNQorCXB4b3IJeG1tMix4bW0zCisJbW92ZHFhCVs2NCtlc3BdLHhtbTYKKwlhZGQJZWF4LGVzaQorCXhvcgllYnAsZWR4CisJbW92ZHFhCXhtbTYsWzEyOCtlc3BdCisJcm9yCWVjeCw3CisJcGFkZGQJeG1tNSx4bW0xCisJYWRkCWVheCxlYngKKwlweG9yCXhtbTIseG1tNAorCWFkZAllZGksRFdPUkQgWzM2K2VzcF0KKwl4b3IJZWJwLGVjeAorCW1vdgllc2ksZWF4CisJcm9sCWVheCw1CisJbW92ZHFhCXhtbTQseG1tMgorCW1vdmRxYQlbMTYrZXNwXSx4bW01CisJYWRkCWVkaSxlYnAKKwl4b3IJZXNpLGVjeAorCXJvcgllYngsNworCWFkZAllZGksZWF4CisJcHNsbGQJeG1tMiwyCisJYWRkCWVkeCxEV09SRCBbNDArZXNwXQorCXhvcgllc2ksZWJ4CisJcHNybGQJeG1tNCwzMAorCW1vdgllYnAsZWRpCisJcm9sCWVkaSw1CisJYWRkCWVkeCxlc2kKKwl4b3IJZWJwLGVieAorCXJvcgllYXgsNworCWFkZAllZHgsZWRpCisJcG9yCXhtbTIseG1tNAorCWFkZAllY3gsRFdPUkQgWzQ0K2VzcF0KKwl4b3IJZWJwLGVheAorCW1vdmRxYQl4bW00LFs4MCtlc3BdCisJbW92CWVzaSxlZHgKKwlyb2wJZWR4LDUKKwlhZGQJZWN4LGVicAorCXhvcgllc2ksZWF4CisJcm9yCWVkaSw3CisJcHNodWZkCXhtbTUseG1tMSwyMzgKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkQgWzQ4K2VzcF0KKwlweG9yCXhtbTMseG1tNworCXB1bnBja2xxZHEJeG1tNSx4bW0yCisJeG9yCWVzaSxlZGkKKwltb3YJZWJwLGVjeAorCXJvbAllY3gsNQorCXB4b3IJeG1tMyx4bW00CisJbW92ZHFhCVs4MCtlc3BdLHhtbTcKKwlhZGQJZWJ4LGVzaQorCXhvcgllYnAsZWRpCisJbW92ZHFhCXhtbTcseG1tNgorCXJvcgllZHgsNworCXBhZGRkCXhtbTYseG1tMgorCWFkZAllYngsZWN4CisJcHhvcgl4bW0zLHhtbTUKKwlhZGQJZWF4LERXT1JEIFs1Mitlc3BdCisJeG9yCWVicCxlZHgKKwltb3YJZXNpLGVieAorCXJvbAllYngsNQorCW1vdmRxYQl4bW01LHhtbTMKKwltb3ZkcWEJWzMyK2VzcF0seG1tNgorCWFkZAllYXgsZWJwCisJeG9yCWVzaSxlZHgKKwlyb3IJZWN4LDcKKwlhZGQJZWF4LGVieAorCXBzbGxkCXhtbTMsMgorCWFkZAllZGksRFdPUkQgWzU2K2VzcF0KKwl4b3IJZXNpLGVjeAorCXBzcmxkCXhtbTUsMzAKKwltb3YJZWJwLGVheAorCXJvbAllYXgsNQorCWFkZAllZGksZXNpCisJeG9yCWVicCxlY3gKKwlyb3IJZWJ4LDcKKwlhZGQJZWRpLGVheAorCXBvcgl4bW0zLHhtbTUKKwlhZGQJZWR4LERXT1JEIFs2MCtlc3BdCisJeG9yCWVicCxlYngKKwltb3ZkcWEJeG1tNSxbOTYrZXNwXQorCW1vdgllc2ksZWRpCisJcm9sCWVkaSw1CisJYWRkCWVkeCxlYnAKKwl4b3IJZXNpLGVieAorCXJvcgllYXgsNworCXBzaHVmZAl4bW02LHhtbTIsMjM4CisJYWRkCWVkeCxlZGkKKwlhZGQJZWN4LERXT1JEIFtlc3BdCisJcHhvcgl4bW00LHhtbTAKKwlwdW5wY2tscWRxCXhtbTYseG1tMworCXhvcgllc2ksZWF4CisJbW92CWVicCxlZHgKKwlyb2wJZWR4LDUKKwlweG9yCXhtbTQseG1tNQorCW1vdmRxYQlbOTYrZXNwXSx4bW0wCisJYWRkCWVjeCxlc2kKKwl4b3IJZWJwLGVheAorCW1vdmRxYQl4bW0wLHhtbTcKKwlyb3IJZWRpLDcKKwlwYWRkZAl4bW03LHhtbTMKKwlhZGQJZWN4LGVkeAorCXB4b3IJeG1tNCx4bW02CisJYWRkCWVieCxEV09SRCBbNCtlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVjeAorCXJvbAllY3gsNQorCW1vdmRxYQl4bW02LHhtbTQKKwltb3ZkcWEJWzQ4K2VzcF0seG1tNworCWFkZAllYngsZWJwCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDcKKwlhZGQJZWJ4LGVjeAorCXBzbGxkCXhtbTQsMgorCWFkZAllYXgsRFdPUkQgWzgrZXNwXQorCXhvcgllc2ksZWR4CisJcHNybGQJeG1tNiwzMAorCW1vdgllYnAsZWJ4CisJcm9sCWVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWJwLGVkeAorCXJvcgllY3gsNworCWFkZAllYXgsZWJ4CisJcG9yCXhtbTQseG1tNgorCWFkZAllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWJwLGVjeAorCW1vdmRxYQl4bW02LFs2NCtlc3BdCisJbW92CWVzaSxlYXgKKwlyb2wJZWF4LDUKKwlhZGQJZWRpLGVicAorCXhvcgllc2ksZWN4CisJcm9yCWVieCw3CisJcHNodWZkCXhtbTcseG1tMywyMzgKKwlhZGQJZWRpLGVheAorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlweG9yCXhtbTUseG1tMQorCXB1bnBja2xxZHEJeG1tNyx4bW00CisJeG9yCWVzaSxlYngKKwltb3YJZWJwLGVkaQorCXJvbAllZGksNQorCXB4b3IJeG1tNSx4bW02CisJbW92ZHFhCVs2NCtlc3BdLHhtbTEKKwlhZGQJZWR4LGVzaQorCXhvcgllYnAsZWJ4CisJbW92ZHFhCXhtbTEseG1tMAorCXJvcgllYXgsNworCXBhZGRkCXhtbTAseG1tNAorCWFkZAllZHgsZWRpCisJcHhvcgl4bW01LHhtbTcKKwlhZGQJZWN4LERXT1JEIFsyMCtlc3BdCisJeG9yCWVicCxlYXgKKwltb3YJZXNpLGVkeAorCXJvbAllZHgsNQorCW1vdmRxYQl4bW03LHhtbTUKKwltb3ZkcWEJW2VzcF0seG1tMAorCWFkZAllY3gsZWJwCisJeG9yCWVzaSxlYXgKKwlyb3IJZWRpLDcKKwlhZGQJZWN4LGVkeAorCXBzbGxkCXhtbTUsMgorCWFkZAllYngsRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVkaQorCXBzcmxkCXhtbTcsMzAKKwltb3YJZWJwLGVjeAorCXJvbAllY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVicCxlZGkKKwlyb3IJZWR4LDcKKwlhZGQJZWJ4LGVjeAorCXBvcgl4bW01LHhtbTcKKwlhZGQJZWF4LERXT1JEIFsyOCtlc3BdCisJbW92ZHFhCXhtbTcsWzgwK2VzcF0KKwlyb3IJZWN4LDcKKwltb3YJZXNpLGVieAorCXhvcgllYnAsZWR4CisJcm9sCWVieCw1CisJcHNodWZkCXhtbTAseG1tNCwyMzgKKwlhZGQJZWF4LGVicAorCXhvcgllc2ksZWN4CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCWFkZAllZGksRFdPUkQgWzMyK2VzcF0KKwlweG9yCXhtbTYseG1tMgorCXB1bnBja2xxZHEJeG1tMCx4bW01CisJYW5kCWVzaSxlY3gKKwl4b3IJZWN4LGVkeAorCXJvcgllYngsNworCXB4b3IJeG1tNix4bW03CisJbW92ZHFhCVs4MCtlc3BdLHhtbTIKKwltb3YJZWJwLGVheAorCXhvcgllc2ksZWN4CisJcm9sCWVheCw1CisJbW92ZHFhCXhtbTIseG1tMQorCWFkZAllZGksZXNpCisJcGFkZGQJeG1tMSx4bW01CisJeG9yCWVicCxlYngKKwlweG9yCXhtbTYseG1tMAorCXhvcgllYngsZWN4CisJYWRkCWVkaSxlYXgKKwlhZGQJZWR4LERXT1JEIFszNitlc3BdCisJYW5kCWVicCxlYngKKwltb3ZkcWEJeG1tMCx4bW02CisJbW92ZHFhCVsxNitlc3BdLHhtbTEKKwl4b3IJZWJ4LGVjeAorCXJvcgllYXgsNworCW1vdgllc2ksZWRpCisJeG9yCWVicCxlYngKKwlyb2wJZWRpLDUKKwlwc2xsZAl4bW02LDIKKwlhZGQJZWR4LGVicAorCXhvcgllc2ksZWF4CisJcHNybGQJeG1tMCwzMAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlZGkKKwlhZGQJZWN4LERXT1JEIFs0MCtlc3BdCisJYW5kCWVzaSxlYXgKKwl4b3IJZWF4LGVieAorCXJvcgllZGksNworCXBvcgl4bW02LHhtbTAKKwltb3YJZWJwLGVkeAorCXhvcgllc2ksZWF4CisJbW92ZHFhCXhtbTAsWzk2K2VzcF0KKwlyb2wJZWR4LDUKKwlhZGQJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJeG9yCWVkaSxlYXgKKwlhZGQJZWN4LGVkeAorCXBzaHVmZAl4bW0xLHhtbTUsMjM4CisJYWRkCWVieCxEV09SRCBbNDQrZXNwXQorCWFuZAllYnAsZWRpCisJeG9yCWVkaSxlYXgKKwlyb3IJZWR4LDcKKwltb3YJZXNpLGVjeAorCXhvcgllYnAsZWRpCisJcm9sCWVjeCw1CisJYWRkCWVieCxlYnAKKwl4b3IJZXNpLGVkeAorCXhvcgllZHgsZWRpCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFs0OCtlc3BdCisJcHhvcgl4bW03LHhtbTMKKwlwdW5wY2tscWRxCXhtbTEseG1tNgorCWFuZAllc2ksZWR4CisJeG9yCWVkeCxlZGkKKwlyb3IJZWN4LDcKKwlweG9yCXhtbTcseG1tMAorCW1vdmRxYQlbOTYrZXNwXSx4bW0zCisJbW92CWVicCxlYngKKwl4b3IJZXNpLGVkeAorCXJvbAllYngsNQorCW1vdmRxYQl4bW0zLFsxNDQrZXNwXQorCWFkZAllYXgsZXNpCisJcGFkZGQJeG1tMix4bW02CisJeG9yCWVicCxlY3gKKwlweG9yCXhtbTcseG1tMQorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFs1Mitlc3BdCisJYW5kCWVicCxlY3gKKwltb3ZkcWEJeG1tMSx4bW03CisJbW92ZHFhCVszMitlc3BdLHhtbTIKKwl4b3IJZWN4LGVkeAorCXJvcgllYngsNworCW1vdgllc2ksZWF4CisJeG9yCWVicCxlY3gKKwlyb2wJZWF4LDUKKwlwc2xsZAl4bW03LDIKKwlhZGQJZWRpLGVicAorCXhvcgllc2ksZWJ4CisJcHNybGQJeG1tMSwzMAorCXhvcgllYngsZWN4CisJYWRkCWVkaSxlYXgKKwlhZGQJZWR4LERXT1JEIFs1Nitlc3BdCisJYW5kCWVzaSxlYngKKwl4b3IJZWJ4LGVjeAorCXJvcgllYXgsNworCXBvcgl4bW03LHhtbTEKKwltb3YJZWJwLGVkaQorCXhvcgllc2ksZWJ4CisJbW92ZHFhCXhtbTEsWzY0K2VzcF0KKwlyb2wJZWRpLDUKKwlhZGQJZWR4LGVzaQorCXhvcgllYnAsZWF4CisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVkaQorCXBzaHVmZAl4bW0yLHhtbTYsMjM4CisJYWRkCWVjeCxEV09SRCBbNjArZXNwXQorCWFuZAllYnAsZWF4CisJeG9yCWVheCxlYngKKwlyb3IJZWRpLDcKKwltb3YJZXNpLGVkeAorCXhvcgllYnAsZWF4CisJcm9sCWVkeCw1CisJYWRkCWVjeCxlYnAKKwl4b3IJZXNpLGVkaQorCXhvcgllZGksZWF4CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEIFtlc3BdCisJcHhvcgl4bW0wLHhtbTQKKwlwdW5wY2tscWRxCXhtbTIseG1tNworCWFuZAllc2ksZWRpCisJeG9yCWVkaSxlYXgKKwlyb3IJZWR4LDcKKwlweG9yCXhtbTAseG1tMQorCW1vdmRxYQlbNjQrZXNwXSx4bW00CisJbW92CWVicCxlY3gKKwl4b3IJZXNpLGVkaQorCXJvbAllY3gsNQorCW1vdmRxYQl4bW00LHhtbTMKKwlhZGQJZWJ4LGVzaQorCXBhZGRkCXhtbTMseG1tNworCXhvcgllYnAsZWR4CisJcHhvcgl4bW0wLHhtbTIKKwl4b3IJZWR4LGVkaQorCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRCBbNCtlc3BdCisJYW5kCWVicCxlZHgKKwltb3ZkcWEJeG1tMix4bW0wCisJbW92ZHFhCVs0OCtlc3BdLHhtbTMKKwl4b3IJZWR4LGVkaQorCXJvcgllY3gsNworCW1vdgllc2ksZWJ4CisJeG9yCWVicCxlZHgKKwlyb2wJZWJ4LDUKKwlwc2xsZAl4bW0wLDIKKwlhZGQJZWF4LGVicAorCXhvcgllc2ksZWN4CisJcHNybGQJeG1tMiwzMAorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFs4K2VzcF0KKwlhbmQJZXNpLGVjeAorCXhvcgllY3gsZWR4CisJcm9yCWVieCw3CisJcG9yCXhtbTAseG1tMgorCW1vdgllYnAsZWF4CisJeG9yCWVzaSxlY3gKKwltb3ZkcWEJeG1tMixbODArZXNwXQorCXJvbAllYXgsNQorCWFkZAllZGksZXNpCisJeG9yCWVicCxlYngKKwl4b3IJZWJ4LGVjeAorCWFkZAllZGksZWF4CisJcHNodWZkCXhtbTMseG1tNywyMzgKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJYW5kCWVicCxlYngKKwl4b3IJZWJ4LGVjeAorCXJvcgllYXgsNworCW1vdgllc2ksZWRpCisJeG9yCWVicCxlYngKKwlyb2wJZWRpLDUKKwlhZGQJZWR4LGVicAorCXhvcgllc2ksZWF4CisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVkaQorCWFkZAllY3gsRFdPUkQgWzE2K2VzcF0KKwlweG9yCXhtbTEseG1tNQorCXB1bnBja2xxZHEJeG1tMyx4bW0wCisJYW5kCWVzaSxlYXgKKwl4b3IJZWF4LGVieAorCXJvcgllZGksNworCXB4b3IJeG1tMSx4bW0yCisJbW92ZHFhCVs4MCtlc3BdLHhtbTUKKwltb3YJZWJwLGVkeAorCXhvcgllc2ksZWF4CisJcm9sCWVkeCw1CisJbW92ZHFhCXhtbTUseG1tNAorCWFkZAllY3gsZXNpCisJcGFkZGQJeG1tNCx4bW0wCisJeG9yCWVicCxlZGkKKwlweG9yCXhtbTEseG1tMworCXhvcgllZGksZWF4CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEIFsyMCtlc3BdCisJYW5kCWVicCxlZGkKKwltb3ZkcWEJeG1tMyx4bW0xCisJbW92ZHFhCVtlc3BdLHhtbTQKKwl4b3IJZWRpLGVheAorCXJvcgllZHgsNworCW1vdgllc2ksZWN4CisJeG9yCWVicCxlZGkKKwlyb2wJZWN4LDUKKwlwc2xsZAl4bW0xLDIKKwlhZGQJZWJ4LGVicAorCXhvcgllc2ksZWR4CisJcHNybGQJeG1tMywzMAorCXhvcgllZHgsZWRpCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFsyNCtlc3BdCisJYW5kCWVzaSxlZHgKKwl4b3IJZWR4LGVkaQorCXJvcgllY3gsNworCXBvcgl4bW0xLHhtbTMKKwltb3YJZWJwLGVieAorCXhvcgllc2ksZWR4CisJbW92ZHFhCXhtbTMsWzk2K2VzcF0KKwlyb2wJZWJ4LDUKKwlhZGQJZWF4LGVzaQorCXhvcgllYnAsZWN4CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCXBzaHVmZAl4bW00LHhtbTAsMjM4CisJYWRkCWVkaSxEV09SRCBbMjgrZXNwXQorCWFuZAllYnAsZWN4CisJeG9yCWVjeCxlZHgKKwlyb3IJZWJ4LDcKKwltb3YJZXNpLGVheAorCXhvcgllYnAsZWN4CisJcm9sCWVheCw1CisJYWRkCWVkaSxlYnAKKwl4b3IJZXNpLGVieAorCXhvcgllYngsZWN4CisJYWRkCWVkaSxlYXgKKwlhZGQJZWR4LERXT1JEIFszMitlc3BdCisJcHhvcgl4bW0yLHhtbTYKKwlwdW5wY2tscWRxCXhtbTQseG1tMQorCWFuZAllc2ksZWJ4CisJeG9yCWVieCxlY3gKKwlyb3IJZWF4LDcKKwlweG9yCXhtbTIseG1tMworCW1vdmRxYQlbOTYrZXNwXSx4bW02CisJbW92CWVicCxlZGkKKwl4b3IJZXNpLGVieAorCXJvbAllZGksNQorCW1vdmRxYQl4bW02LHhtbTUKKwlhZGQJZWR4LGVzaQorCXBhZGRkCXhtbTUseG1tMQorCXhvcgllYnAsZWF4CisJcHhvcgl4bW0yLHhtbTQKKwl4b3IJZWF4LGVieAorCWFkZAllZHgsZWRpCisJYWRkCWVjeCxEV09SRCBbMzYrZXNwXQorCWFuZAllYnAsZWF4CisJbW92ZHFhCXhtbTQseG1tMgorCW1vdmRxYQlbMTYrZXNwXSx4bW01CisJeG9yCWVheCxlYngKKwlyb3IJZWRpLDcKKwltb3YJZXNpLGVkeAorCXhvcgllYnAsZWF4CisJcm9sCWVkeCw1CisJcHNsbGQJeG1tMiwyCisJYWRkCWVjeCxlYnAKKwl4b3IJZXNpLGVkaQorCXBzcmxkCXhtbTQsMzAKKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWR4CisJYWRkCWVieCxEV09SRCBbNDArZXNwXQorCWFuZAllc2ksZWRpCisJeG9yCWVkaSxlYXgKKwlyb3IJZWR4LDcKKwlwb3IJeG1tMix4bW00CisJbW92CWVicCxlY3gKKwl4b3IJZXNpLGVkaQorCW1vdmRxYQl4bW00LFs2NCtlc3BdCisJcm9sCWVjeCw1CisJYWRkCWVieCxlc2kKKwl4b3IJZWJwLGVkeAorCXhvcgllZHgsZWRpCisJYWRkCWVieCxlY3gKKwlwc2h1ZmQJeG1tNSx4bW0xLDIzOAorCWFkZAllYXgsRFdPUkQgWzQ0K2VzcF0KKwlhbmQJZWJwLGVkeAorCXhvcgllZHgsZWRpCisJcm9yCWVjeCw3CisJbW92CWVzaSxlYngKKwl4b3IJZWJwLGVkeAorCXJvbAllYngsNQorCWFkZAllYXgsZWJwCisJeG9yCWVzaSxlZHgKKwlhZGQJZWF4LGVieAorCWFkZAllZGksRFdPUkQgWzQ4K2VzcF0KKwlweG9yCXhtbTMseG1tNworCXB1bnBja2xxZHEJeG1tNSx4bW0yCisJeG9yCWVzaSxlY3gKKwltb3YJZWJwLGVheAorCXJvbAllYXgsNQorCXB4b3IJeG1tMyx4bW00CisJbW92ZHFhCVs2NCtlc3BdLHhtbTcKKwlhZGQJZWRpLGVzaQorCXhvcgllYnAsZWN4CisJbW92ZHFhCXhtbTcseG1tNgorCXJvcgllYngsNworCXBhZGRkCXhtbTYseG1tMgorCWFkZAllZGksZWF4CisJcHhvcgl4bW0zLHhtbTUKKwlhZGQJZWR4LERXT1JEIFs1Mitlc3BdCisJeG9yCWVicCxlYngKKwltb3YJZXNpLGVkaQorCXJvbAllZGksNQorCW1vdmRxYQl4bW01LHhtbTMKKwltb3ZkcWEJWzMyK2VzcF0seG1tNgorCWFkZAllZHgsZWJwCisJeG9yCWVzaSxlYngKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVkaQorCXBzbGxkCXhtbTMsMgorCWFkZAllY3gsRFdPUkQgWzU2K2VzcF0KKwl4b3IJZXNpLGVheAorCXBzcmxkCXhtbTUsMzAKKwltb3YJZWJwLGVkeAorCXJvbAllZHgsNQorCWFkZAllY3gsZXNpCisJeG9yCWVicCxlYXgKKwlyb3IJZWRpLDcKKwlhZGQJZWN4LGVkeAorCXBvcgl4bW0zLHhtbTUKKwlhZGQJZWJ4LERXT1JEIFs2MCtlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVjeAorCXJvbAllY3gsNQorCWFkZAllYngsZWJwCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDcKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkQgW2VzcF0KKwl4b3IJZXNpLGVkeAorCW1vdgllYnAsZWJ4CisJcm9sCWVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWJwLGVkeAorCXJvcgllY3gsNworCXBhZGRkCXhtbTcseG1tMworCWFkZAllYXgsZWJ4CisJYWRkCWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVicCxlY3gKKwltb3YJZXNpLGVheAorCW1vdmRxYQlbNDgrZXNwXSx4bW03CisJcm9sCWVheCw1CisJYWRkCWVkaSxlYnAKKwl4b3IJZXNpLGVjeAorCXJvcgllYngsNworCWFkZAllZGksZWF4CisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlYngKKwltb3YJZWJwLGVkaQorCXJvbAllZGksNQorCWFkZAllZHgsZXNpCisJeG9yCWVicCxlYngKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVkaQorCWFkZAllY3gsRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWJwLGVheAorCW1vdgllc2ksZWR4CisJcm9sCWVkeCw1CisJYWRkCWVjeCxlYnAKKwl4b3IJZXNpLGVheAorCXJvcgllZGksNworCWFkZAllY3gsZWR4CisJbW92CWVicCxEV09SRCBbMTk2K2VzcF0KKwljbXAJZWJwLERXT1JEIFsyMDArZXNwXQorCWplCU5FQVIgTCQwMDVkb25lCisJbW92ZHFhCXhtbTcsWzE2MCtlc3BdCisJbW92ZHFhCXhtbTYsWzE3Nitlc3BdCisJbW92ZHF1CXhtbTAsW2VicF0KKwltb3ZkcXUJeG1tMSxbMTYrZWJwXQorCW1vdmRxdQl4bW0yLFszMitlYnBdCisJbW92ZHF1CXhtbTMsWzQ4K2VicF0KKwlhZGQJZWJwLDY0CitkYgkxMDIsMTUsNTYsMCwxOTgKKwltb3YJRFdPUkQgWzE5Nitlc3BdLGVicAorCW1vdmRxYQlbOTYrZXNwXSx4bW03CisJYWRkCWVieCxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWRpCisJbW92CWVicCxlY3gKKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVzaQorCXhvcgllYnAsZWRpCisJcm9yCWVkeCw3CitkYgkxMDIsMTUsNTYsMCwyMDYKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWJwLGVkeAorCW1vdgllc2ksZWJ4CisJcGFkZGQJeG1tMCx4bW03CisJcm9sCWVieCw1CisJYWRkCWVheCxlYnAKKwl4b3IJZXNpLGVkeAorCXJvcgllY3gsNworCW1vdmRxYQlbZXNwXSx4bW0wCisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlY3gKKwltb3YJZWJwLGVheAorCXBzdWJkCXhtbTAseG1tNworCXJvbAllYXgsNQorCWFkZAllZGksZXNpCisJeG9yCWVicCxlY3gKKwlyb3IJZWJ4LDcKKwlhZGQJZWRpLGVheAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVieAorCW1vdgllc2ksZWRpCisJcm9sCWVkaSw1CisJYWRkCWVkeCxlYnAKKwl4b3IJZXNpLGVieAorCXJvcgllYXgsNworCWFkZAllZHgsZWRpCisJYWRkCWVjeCxEV09SRCBbMzIrZXNwXQorCXhvcgllc2ksZWF4CisJbW92CWVicCxlZHgKKwlyb2wJZWR4LDUKKwlhZGQJZWN4LGVzaQorCXhvcgllYnAsZWF4CisJcm9yCWVkaSw3CitkYgkxMDIsMTUsNTYsMCwyMTQKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkQgWzM2K2VzcF0KKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksZWN4CisJcGFkZGQJeG1tMSx4bW03CisJcm9sCWVjeCw1CisJYWRkCWVieCxlYnAKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNworCW1vdmRxYQlbMTYrZXNwXSx4bW0xCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFs0MCtlc3BdCisJeG9yCWVzaSxlZHgKKwltb3YJZWJwLGVieAorCXBzdWJkCXhtbTEseG1tNworCXJvbAllYngsNQorCWFkZAllYXgsZXNpCisJeG9yCWVicCxlZHgKKwlyb3IJZWN4LDcKKwlhZGQJZWF4LGVieAorCWFkZAllZGksRFdPUkQgWzQ0K2VzcF0KKwl4b3IJZWJwLGVjeAorCW1vdgllc2ksZWF4CisJcm9sCWVheCw1CisJYWRkCWVkaSxlYnAKKwl4b3IJZXNpLGVjeAorCXJvcgllYngsNworCWFkZAllZGksZWF4CisJYWRkCWVkeCxEV09SRCBbNDgrZXNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVicCxlZGkKKwlyb2wJZWRpLDUKKwlhZGQJZWR4LGVzaQorCXhvcgllYnAsZWJ4CisJcm9yCWVheCw3CitkYgkxMDIsMTUsNTYsMCwyMjIKKwlhZGQJZWR4LGVkaQorCWFkZAllY3gsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWJwLGVheAorCW1vdgllc2ksZWR4CisJcGFkZGQJeG1tMix4bW03CisJcm9sCWVkeCw1CisJYWRkCWVjeCxlYnAKKwl4b3IJZXNpLGVheAorCXJvcgllZGksNworCW1vdmRxYQlbMzIrZXNwXSx4bW0yCisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEIFs1Nitlc3BdCisJeG9yCWVzaSxlZGkKKwltb3YJZWJwLGVjeAorCXBzdWJkCXhtbTIseG1tNworCXJvbAllY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVicCxlZGkKKwlyb3IJZWR4LDcKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkQgWzYwK2VzcF0KKwl4b3IJZWJwLGVkeAorCW1vdgllc2ksZWJ4CisJcm9sCWVieCw1CisJYWRkCWVheCxlYnAKKwlyb3IJZWN4LDcKKwlhZGQJZWF4LGVieAorCW1vdgllYnAsRFdPUkQgWzE5Mitlc3BdCisJYWRkCWVheCxEV09SRCBbZWJwXQorCWFkZAllc2ksRFdPUkQgWzQrZWJwXQorCWFkZAllY3gsRFdPUkQgWzgrZWJwXQorCW1vdglEV09SRCBbZWJwXSxlYXgKKwlhZGQJZWR4LERXT1JEIFsxMitlYnBdCisJbW92CURXT1JEIFs0K2VicF0sZXNpCisJYWRkCWVkaSxEV09SRCBbMTYrZWJwXQorCW1vdglEV09SRCBbOCtlYnBdLGVjeAorCW1vdgllYngsZWN4CisJbW92CURXT1JEIFsxMitlYnBdLGVkeAorCXhvcgllYngsZWR4CisJbW92CURXT1JEIFsxNitlYnBdLGVkaQorCW1vdgllYnAsZXNpCisJcHNodWZkCXhtbTQseG1tMCwyMzgKKwlhbmQJZXNpLGVieAorCW1vdgllYngsZWJwCisJam1wCU5FQVIgTCQwMDRsb29wCithbGlnbgkxNgorTCQwMDVkb25lOgorCWFkZAllYngsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZXNpLGVkaQorCW1vdgllYnAsZWN4CisJcm9sCWVjeCw1CisJYWRkCWVieCxlc2kKKwl4b3IJZWJwLGVkaQorCXJvcgllZHgsNworCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRCBbMjArZXNwXQorCXhvcgllYnAsZWR4CisJbW92CWVzaSxlYngKKwlyb2wJZWJ4LDUKKwlhZGQJZWF4LGVicAorCXhvcgllc2ksZWR4CisJcm9yCWVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlY3gKKwltb3YJZWJwLGVheAorCXJvbAllYXgsNQorCWFkZAllZGksZXNpCisJeG9yCWVicCxlY3gKKwlyb3IJZWJ4LDcKKwlhZGQJZWRpLGVheAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVieAorCW1vdgllc2ksZWRpCisJcm9sCWVkaSw1CisJYWRkCWVkeCxlYnAKKwl4b3IJZXNpLGVieAorCXJvcgllYXgsNworCWFkZAllZHgsZWRpCisJYWRkCWVjeCxEV09SRCBbMzIrZXNwXQorCXhvcgllc2ksZWF4CisJbW92CWVicCxlZHgKKwlyb2wJZWR4LDUKKwlhZGQJZWN4LGVzaQorCXhvcgllYnAsZWF4CisJcm9yCWVkaSw3CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEIFszNitlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVjeAorCXJvbAllY3gsNQorCWFkZAllYngsZWJwCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDcKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkQgWzQwK2VzcF0KKwl4b3IJZXNpLGVkeAorCW1vdgllYnAsZWJ4CisJcm9sCWVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWJwLGVkeAorCXJvcgllY3gsNworCWFkZAllYXgsZWJ4CisJYWRkCWVkaSxEV09SRCBbNDQrZXNwXQorCXhvcgllYnAsZWN4CisJbW92CWVzaSxlYXgKKwlyb2wJZWF4LDUKKwlhZGQJZWRpLGVicAorCXhvcgllc2ksZWN4CisJcm9yCWVieCw3CisJYWRkCWVkaSxlYXgKKwlhZGQJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVzaSxlYngKKwltb3YJZWJwLGVkaQorCXJvbAllZGksNQorCWFkZAllZHgsZXNpCisJeG9yCWVicCxlYngKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVkaQorCWFkZAllY3gsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWJwLGVheAorCW1vdgllc2ksZWR4CisJcm9sCWVkeCw1CisJYWRkCWVjeCxlYnAKKwl4b3IJZXNpLGVheAorCXJvcgllZGksNworCWFkZAllY3gsZWR4CisJYWRkCWVieCxEV09SRCBbNTYrZXNwXQorCXhvcgllc2ksZWRpCisJbW92CWVicCxlY3gKKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVzaQorCXhvcgllYnAsZWRpCisJcm9yCWVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFs2MCtlc3BdCisJeG9yCWVicCxlZHgKKwltb3YJZXNpLGVieAorCXJvbAllYngsNQorCWFkZAllYXgsZWJwCisJcm9yCWVjeCw3CisJYWRkCWVheCxlYngKKwltb3YJZWJwLERXT1JEIFsxOTIrZXNwXQorCWFkZAllYXgsRFdPUkQgW2VicF0KKwltb3YJZXNwLERXT1JEIFsyMDQrZXNwXQorCWFkZAllc2ksRFdPUkQgWzQrZWJwXQorCWFkZAllY3gsRFdPUkQgWzgrZWJwXQorCW1vdglEV09SRCBbZWJwXSxlYXgKKwlhZGQJZWR4LERXT1JEIFsxMitlYnBdCisJbW92CURXT1JEIFs0K2VicF0sZXNpCisJYWRkCWVkaSxEV09SRCBbMTYrZWJwXQorCW1vdglEV09SRCBbOCtlYnBdLGVjeAorCW1vdglEV09SRCBbMTIrZWJwXSxlZHgKKwltb3YJRFdPUkQgWzE2K2VicF0sZWRpCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JMTYKK19fc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eDoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCWNhbGwJTCQwMDZwaWNfcG9pbnQKK0wkMDA2cGljX3BvaW50OgorCXBvcAllYnAKKwlsZWEJZWJwLFsoTCRLX1hYX1hYLUwkMDA2cGljX3BvaW50KStlYnBdCitMJGF2eF9zaG9ydGN1dDoKKwl2emVyb2FsbAorCXZtb3ZkcWEJeG1tNyxbZWJwXQorCXZtb3ZkcWEJeG1tMCxbMTYrZWJwXQorCXZtb3ZkcWEJeG1tMSxbMzIrZWJwXQorCXZtb3ZkcWEJeG1tMixbNDgrZWJwXQorCXZtb3ZkcWEJeG1tNixbNjQrZWJwXQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwltb3YJZWJwLERXT1JEIFsyNCtlc3BdCisJbW92CWVkeCxEV09SRCBbMjgrZXNwXQorCW1vdgllc2ksZXNwCisJc3ViCWVzcCwyMDgKKwlhbmQJZXNwLC02NAorCXZtb3ZkcWEJWzExMitlc3BdLHhtbTAKKwl2bW92ZHFhCVsxMjgrZXNwXSx4bW0xCisJdm1vdmRxYQlbMTQ0K2VzcF0seG1tMgorCXNobAllZHgsNgorCXZtb3ZkcWEJWzE2MCtlc3BdLHhtbTcKKwlhZGQJZWR4LGVicAorCXZtb3ZkcWEJWzE3Nitlc3BdLHhtbTYKKwlhZGQJZWJwLDY0CisJbW92CURXT1JEIFsxOTIrZXNwXSxlZGkKKwltb3YJRFdPUkQgWzE5Nitlc3BdLGVicAorCW1vdglEV09SRCBbMjAwK2VzcF0sZWR4CisJbW92CURXT1JEIFsyMDQrZXNwXSxlc2kKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVieCxEV09SRCBbNCtlZGldCisJbW92CWVjeCxEV09SRCBbOCtlZGldCisJbW92CWVkeCxEV09SRCBbMTIrZWRpXQorCW1vdgllZGksRFdPUkQgWzE2K2VkaV0KKwltb3YJZXNpLGVieAorCXZtb3ZkcXUJeG1tMCxbZWJwLTY0XQorCXZtb3ZkcXUJeG1tMSxbZWJwLTQ4XQorCXZtb3ZkcXUJeG1tMixbZWJwLTMyXQorCXZtb3ZkcXUJeG1tMyxbZWJwLTE2XQorCXZwc2h1ZmIJeG1tMCx4bW0wLHhtbTYKKwl2cHNodWZiCXhtbTEseG1tMSx4bW02CisJdnBzaHVmYgl4bW0yLHhtbTIseG1tNgorCXZtb3ZkcWEJWzk2K2VzcF0seG1tNworCXZwc2h1ZmIJeG1tMyx4bW0zLHhtbTYKKwl2cGFkZGQJeG1tNCx4bW0wLHhtbTcKKwl2cGFkZGQJeG1tNSx4bW0xLHhtbTcKKwl2cGFkZGQJeG1tNix4bW0yLHhtbTcKKwl2bW92ZHFhCVtlc3BdLHhtbTQKKwltb3YJZWJwLGVjeAorCXZtb3ZkcWEJWzE2K2VzcF0seG1tNQorCXhvcgllYnAsZWR4CisJdm1vdmRxYQlbMzIrZXNwXSx4bW02CisJYW5kCWVzaSxlYnAKKwlqbXAJTkVBUiBMJDAwN2xvb3AKK2FsaWduCTE2CitMJDAwN2xvb3A6CisJc2hyZAllYngsZWJ4LDIKKwl4b3IJZXNpLGVkeAorCXZwYWxpZ25yCXhtbTQseG1tMSx4bW0wLDgKKwltb3YJZWJwLGVheAorCWFkZAllZGksRFdPUkQgW2VzcF0KKwl2cGFkZGQJeG1tNyx4bW03LHhtbTMKKwl2bW92ZHFhCVs2NCtlc3BdLHhtbTAKKwl4b3IJZWJ4LGVjeAorCXNobGQJZWF4LGVheCw1CisJdnBzcmxkcQl4bW02LHhtbTMsNAorCWFkZAllZGksZXNpCisJYW5kCWVicCxlYngKKwl2cHhvcgl4bW00LHhtbTQseG1tMAorCXhvcgllYngsZWN4CisJYWRkCWVkaSxlYXgKKwl2cHhvcgl4bW02LHhtbTYseG1tMgorCXNocmQJZWF4LGVheCw3CisJeG9yCWVicCxlY3gKKwl2bW92ZHFhCVs0OCtlc3BdLHhtbTcKKwltb3YJZXNpLGVkaQorCWFkZAllZHgsRFdPUkQgWzQrZXNwXQorCXZweG9yCXhtbTQseG1tNCx4bW02CisJeG9yCWVheCxlYngKKwlzaGxkCWVkaSxlZGksNQorCWFkZAllZHgsZWJwCisJYW5kCWVzaSxlYXgKKwl2cHNybGQJeG1tNix4bW00LDMxCisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVkaQorCXNocmQJZWRpLGVkaSw3CisJeG9yCWVzaSxlYngKKwl2cHNsbGRxCXhtbTAseG1tNCwxMgorCXZwYWRkZAl4bW00LHhtbTQseG1tNAorCW1vdgllYnAsZWR4CisJYWRkCWVjeCxEV09SRCBbOCtlc3BdCisJeG9yCWVkaSxlYXgKKwlzaGxkCWVkeCxlZHgsNQorCXZwc3JsZAl4bW03LHhtbTAsMzAKKwl2cG9yCXhtbTQseG1tNCx4bW02CisJYWRkCWVjeCxlc2kKKwlhbmQJZWJwLGVkaQorCXhvcgllZGksZWF4CisJYWRkCWVjeCxlZHgKKwl2cHNsbGQJeG1tMCx4bW0wLDIKKwlzaHJkCWVkeCxlZHgsNworCXhvcgllYnAsZWF4CisJdnB4b3IJeG1tNCx4bW00LHhtbTcKKwltb3YJZXNpLGVjeAorCWFkZAllYngsRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWR4LGVkaQorCXNobGQJZWN4LGVjeCw1CisJdnB4b3IJeG1tNCx4bW00LHhtbTAKKwlhZGQJZWJ4LGVicAorCWFuZAllc2ksZWR4CisJdm1vdmRxYQl4bW0wLFs5Nitlc3BdCisJeG9yCWVkeCxlZGkKKwlhZGQJZWJ4LGVjeAorCXNocmQJZWN4LGVjeCw3CisJeG9yCWVzaSxlZGkKKwl2cGFsaWducgl4bW01LHhtbTIseG1tMSw4CisJbW92CWVicCxlYngKKwlhZGQJZWF4LERXT1JEIFsxNitlc3BdCisJdnBhZGRkCXhtbTAseG1tMCx4bW00CisJdm1vdmRxYQlbODArZXNwXSx4bW0xCisJeG9yCWVjeCxlZHgKKwlzaGxkCWVieCxlYngsNQorCXZwc3JsZHEJeG1tNyx4bW00LDQKKwlhZGQJZWF4LGVzaQorCWFuZAllYnAsZWN4CisJdnB4b3IJeG1tNSx4bW01LHhtbTEKKwl4b3IJZWN4LGVkeAorCWFkZAllYXgsZWJ4CisJdnB4b3IJeG1tNyx4bW03LHhtbTMKKwlzaHJkCWVieCxlYngsNworCXhvcgllYnAsZWR4CisJdm1vdmRxYQlbZXNwXSx4bW0wCisJbW92CWVzaSxlYXgKKwlhZGQJZWRpLERXT1JEIFsyMCtlc3BdCisJdnB4b3IJeG1tNSx4bW01LHhtbTcKKwl4b3IJZWJ4LGVjeAorCXNobGQJZWF4LGVheCw1CisJYWRkCWVkaSxlYnAKKwlhbmQJZXNpLGVieAorCXZwc3JsZAl4bW03LHhtbTUsMzEKKwl4b3IJZWJ4LGVjeAorCWFkZAllZGksZWF4CisJc2hyZAllYXgsZWF4LDcKKwl4b3IJZXNpLGVjeAorCXZwc2xsZHEJeG1tMSx4bW01LDEyCisJdnBhZGRkCXhtbTUseG1tNSx4bW01CisJbW92CWVicCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJeG9yCWVheCxlYngKKwlzaGxkCWVkaSxlZGksNQorCXZwc3JsZAl4bW0wLHhtbTEsMzAKKwl2cG9yCXhtbTUseG1tNSx4bW03CisJYWRkCWVkeCxlc2kKKwlhbmQJZWJwLGVheAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlZGkKKwl2cHNsbGQJeG1tMSx4bW0xLDIKKwlzaHJkCWVkaSxlZGksNworCXhvcgllYnAsZWJ4CisJdnB4b3IJeG1tNSx4bW01LHhtbTAKKwltb3YJZXNpLGVkeAorCWFkZAllY3gsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWRpLGVheAorCXNobGQJZWR4LGVkeCw1CisJdnB4b3IJeG1tNSx4bW01LHhtbTEKKwlhZGQJZWN4LGVicAorCWFuZAllc2ksZWRpCisJdm1vdmRxYQl4bW0xLFsxMTIrZXNwXQorCXhvcgllZGksZWF4CisJYWRkCWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsNworCXhvcgllc2ksZWF4CisJdnBhbGlnbnIJeG1tNix4bW0zLHhtbTIsOAorCW1vdgllYnAsZWN4CisJYWRkCWVieCxEV09SRCBbMzIrZXNwXQorCXZwYWRkZAl4bW0xLHhtbTEseG1tNQorCXZtb3ZkcWEJWzk2K2VzcF0seG1tMgorCXhvcgllZHgsZWRpCisJc2hsZAllY3gsZWN4LDUKKwl2cHNybGRxCXhtbTAseG1tNSw0CisJYWRkCWVieCxlc2kKKwlhbmQJZWJwLGVkeAorCXZweG9yCXhtbTYseG1tNix4bW0yCisJeG9yCWVkeCxlZGkKKwlhZGQJZWJ4LGVjeAorCXZweG9yCXhtbTAseG1tMCx4bW00CisJc2hyZAllY3gsZWN4LDcKKwl4b3IJZWJwLGVkaQorCXZtb3ZkcWEJWzE2K2VzcF0seG1tMQorCW1vdgllc2ksZWJ4CisJYWRkCWVheCxEV09SRCBbMzYrZXNwXQorCXZweG9yCXhtbTYseG1tNix4bW0wCisJeG9yCWVjeCxlZHgKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZWJwCisJYW5kCWVzaSxlY3gKKwl2cHNybGQJeG1tMCx4bW02LDMxCisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCXNocmQJZWJ4LGVieCw3CisJeG9yCWVzaSxlZHgKKwl2cHNsbGRxCXhtbTIseG1tNiwxMgorCXZwYWRkZAl4bW02LHhtbTYseG1tNgorCW1vdgllYnAsZWF4CisJYWRkCWVkaSxEV09SRCBbNDArZXNwXQorCXhvcgllYngsZWN4CisJc2hsZAllYXgsZWF4LDUKKwl2cHNybGQJeG1tMSx4bW0yLDMwCisJdnBvcgl4bW02LHhtbTYseG1tMAorCWFkZAllZGksZXNpCisJYW5kCWVicCxlYngKKwl4b3IJZWJ4LGVjeAorCWFkZAllZGksZWF4CisJdnBzbGxkCXhtbTIseG1tMiwyCisJdm1vdmRxYQl4bW0wLFs2NCtlc3BdCisJc2hyZAllYXgsZWF4LDcKKwl4b3IJZWJwLGVjeAorCXZweG9yCXhtbTYseG1tNix4bW0xCisJbW92CWVzaSxlZGkKKwlhZGQJZWR4LERXT1JEIFs0NCtlc3BdCisJeG9yCWVheCxlYngKKwlzaGxkCWVkaSxlZGksNQorCXZweG9yCXhtbTYseG1tNix4bW0yCisJYWRkCWVkeCxlYnAKKwlhbmQJZXNpLGVheAorCXZtb3ZkcWEJeG1tMixbMTEyK2VzcF0KKwl4b3IJZWF4LGVieAorCWFkZAllZHgsZWRpCisJc2hyZAllZGksZWRpLDcKKwl4b3IJZXNpLGVieAorCXZwYWxpZ25yCXhtbTcseG1tNCx4bW0zLDgKKwltb3YJZWJwLGVkeAorCWFkZAllY3gsRFdPUkQgWzQ4K2VzcF0KKwl2cGFkZGQJeG1tMix4bW0yLHhtbTYKKwl2bW92ZHFhCVs2NCtlc3BdLHhtbTMKKwl4b3IJZWRpLGVheAorCXNobGQJZWR4LGVkeCw1CisJdnBzcmxkcQl4bW0xLHhtbTYsNAorCWFkZAllY3gsZXNpCisJYW5kCWVicCxlZGkKKwl2cHhvcgl4bW03LHhtbTcseG1tMworCXhvcgllZGksZWF4CisJYWRkCWVjeCxlZHgKKwl2cHhvcgl4bW0xLHhtbTEseG1tNQorCXNocmQJZWR4LGVkeCw3CisJeG9yCWVicCxlYXgKKwl2bW92ZHFhCVszMitlc3BdLHhtbTIKKwltb3YJZXNpLGVjeAorCWFkZAllYngsRFdPUkQgWzUyK2VzcF0KKwl2cHhvcgl4bW03LHhtbTcseG1tMQorCXhvcgllZHgsZWRpCisJc2hsZAllY3gsZWN4LDUKKwlhZGQJZWJ4LGVicAorCWFuZAllc2ksZWR4CisJdnBzcmxkCXhtbTEseG1tNywzMQorCXhvcgllZHgsZWRpCisJYWRkCWVieCxlY3gKKwlzaHJkCWVjeCxlY3gsNworCXhvcgllc2ksZWRpCisJdnBzbGxkcQl4bW0zLHhtbTcsMTIKKwl2cGFkZGQJeG1tNyx4bW03LHhtbTcKKwltb3YJZWJwLGVieAorCWFkZAllYXgsRFdPUkQgWzU2K2VzcF0KKwl4b3IJZWN4LGVkeAorCXNobGQJZWJ4LGVieCw1CisJdnBzcmxkCXhtbTIseG1tMywzMAorCXZwb3IJeG1tNyx4bW03LHhtbTEKKwlhZGQJZWF4LGVzaQorCWFuZAllYnAsZWN4CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCXZwc2xsZAl4bW0zLHhtbTMsMgorCXZtb3ZkcWEJeG1tMSxbODArZXNwXQorCXNocmQJZWJ4LGVieCw3CisJeG9yCWVicCxlZHgKKwl2cHhvcgl4bW03LHhtbTcseG1tMgorCW1vdgllc2ksZWF4CisJYWRkCWVkaSxEV09SRCBbNjArZXNwXQorCXhvcgllYngsZWN4CisJc2hsZAllYXgsZWF4LDUKKwl2cHhvcgl4bW03LHhtbTcseG1tMworCWFkZAllZGksZWJwCisJYW5kCWVzaSxlYngKKwl2bW92ZHFhCXhtbTMsWzExMitlc3BdCisJeG9yCWVieCxlY3gKKwlhZGQJZWRpLGVheAorCXZwYWxpZ25yCXhtbTIseG1tNyx4bW02LDgKKwl2cHhvcgl4bW0wLHhtbTAseG1tNAorCXNocmQJZWF4LGVheCw3CisJeG9yCWVzaSxlY3gKKwltb3YJZWJwLGVkaQorCWFkZAllZHgsRFdPUkQgW2VzcF0KKwl2cHhvcgl4bW0wLHhtbTAseG1tMQorCXZtb3ZkcWEJWzgwK2VzcF0seG1tNAorCXhvcgllYXgsZWJ4CisJc2hsZAllZGksZWRpLDUKKwl2bW92ZHFhCXhtbTQseG1tMworCXZwYWRkZAl4bW0zLHhtbTMseG1tNworCWFkZAllZHgsZXNpCisJYW5kCWVicCxlYXgKKwl2cHhvcgl4bW0wLHhtbTAseG1tMgorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlZGkKKwlzaHJkCWVkaSxlZGksNworCXhvcgllYnAsZWJ4CisJdnBzcmxkCXhtbTIseG1tMCwzMAorCXZtb3ZkcWEJWzQ4K2VzcF0seG1tMworCW1vdgllc2ksZWR4CisJYWRkCWVjeCxEV09SRCBbNCtlc3BdCisJeG9yCWVkaSxlYXgKKwlzaGxkCWVkeCxlZHgsNQorCXZwc2xsZAl4bW0wLHhtbTAsMgorCWFkZAllY3gsZWJwCisJYW5kCWVzaSxlZGkKKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWR4CisJc2hyZAllZHgsZWR4LDcKKwl4b3IJZXNpLGVheAorCW1vdgllYnAsZWN4CisJYWRkCWVieCxEV09SRCBbOCtlc3BdCisJdnBvcgl4bW0wLHhtbTAseG1tMgorCXhvcgllZHgsZWRpCisJc2hsZAllY3gsZWN4LDUKKwl2bW92ZHFhCXhtbTIsWzk2K2VzcF0KKwlhZGQJZWJ4LGVzaQorCWFuZAllYnAsZWR4CisJeG9yCWVkeCxlZGkKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksZWJ4CisJc2hsZAllYngsZWJ4LDUKKwlhZGQJZWF4LGVicAorCXhvcgllc2ksZWR4CisJc2hyZAllY3gsZWN4LDcKKwlhZGQJZWF4LGVieAorCXZwYWxpZ25yCXhtbTMseG1tMCx4bW03LDgKKwl2cHhvcgl4bW0xLHhtbTEseG1tNQorCWFkZAllZGksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZXNpLGVjeAorCW1vdgllYnAsZWF4CisJc2hsZAllYXgsZWF4LDUKKwl2cHhvcgl4bW0xLHhtbTEseG1tMgorCXZtb3ZkcWEJWzk2K2VzcF0seG1tNQorCWFkZAllZGksZXNpCisJeG9yCWVicCxlY3gKKwl2bW92ZHFhCXhtbTUseG1tNAorCXZwYWRkZAl4bW00LHhtbTQseG1tMAorCXNocmQJZWJ4LGVieCw3CisJYWRkCWVkaSxlYXgKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWJwLGVieAorCW1vdgllc2ksZWRpCisJc2hsZAllZGksZWRpLDUKKwl2cHNybGQJeG1tMyx4bW0xLDMwCisJdm1vdmRxYQlbZXNwXSx4bW00CisJYWRkCWVkeCxlYnAKKwl4b3IJZXNpLGVieAorCXNocmQJZWF4LGVheCw3CisJYWRkCWVkeCxlZGkKKwl2cHNsbGQJeG1tMSx4bW0xLDIKKwlhZGQJZWN4LERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlYXgKKwltb3YJZWJwLGVkeAorCXNobGQJZWR4LGVkeCw1CisJYWRkCWVjeCxlc2kKKwl4b3IJZWJwLGVheAorCXNocmQJZWRpLGVkaSw3CisJYWRkCWVjeCxlZHgKKwl2cG9yCXhtbTEseG1tMSx4bW0zCisJYWRkCWVieCxEV09SRCBbMjgrZXNwXQorCXhvcgllYnAsZWRpCisJdm1vdmRxYQl4bW0zLFs2NCtlc3BdCisJbW92CWVzaSxlY3gKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZWJwCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNworCWFkZAllYngsZWN4CisJdnBhbGlnbnIJeG1tNCx4bW0xLHhtbTAsOAorCXZweG9yCXhtbTIseG1tMix4bW02CisJYWRkCWVheCxEV09SRCBbMzIrZXNwXQorCXhvcgllc2ksZWR4CisJbW92CWVicCxlYngKKwlzaGxkCWVieCxlYngsNQorCXZweG9yCXhtbTIseG1tMix4bW0zCisJdm1vdmRxYQlbNjQrZXNwXSx4bW02CisJYWRkCWVheCxlc2kKKwl4b3IJZWJwLGVkeAorCXZtb3ZkcWEJeG1tNixbMTI4K2VzcF0KKwl2cGFkZGQJeG1tNSx4bW01LHhtbTEKKwlzaHJkCWVjeCxlY3gsNworCWFkZAllYXgsZWJ4CisJdnB4b3IJeG1tMix4bW0yLHhtbTQKKwlhZGQJZWRpLERXT1JEIFszNitlc3BdCisJeG9yCWVicCxlY3gKKwltb3YJZXNpLGVheAorCXNobGQJZWF4LGVheCw1CisJdnBzcmxkCXhtbTQseG1tMiwzMAorCXZtb3ZkcWEJWzE2K2VzcF0seG1tNQorCWFkZAllZGksZWJwCisJeG9yCWVzaSxlY3gKKwlzaHJkCWVieCxlYngsNworCWFkZAllZGksZWF4CisJdnBzbGxkCXhtbTIseG1tMiwyCisJYWRkCWVkeCxEV09SRCBbNDArZXNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVicCxlZGkKKwlzaGxkCWVkaSxlZGksNQorCWFkZAllZHgsZXNpCisJeG9yCWVicCxlYngKKwlzaHJkCWVheCxlYXgsNworCWFkZAllZHgsZWRpCisJdnBvcgl4bW0yLHhtbTIseG1tNAorCWFkZAllY3gsRFdPUkQgWzQ0K2VzcF0KKwl4b3IJZWJwLGVheAorCXZtb3ZkcWEJeG1tNCxbODArZXNwXQorCW1vdgllc2ksZWR4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVicAorCXhvcgllc2ksZWF4CisJc2hyZAllZGksZWRpLDcKKwlhZGQJZWN4LGVkeAorCXZwYWxpZ25yCXhtbTUseG1tMix4bW0xLDgKKwl2cHhvcgl4bW0zLHhtbTMseG1tNworCWFkZAllYngsRFdPUkQgWzQ4K2VzcF0KKwl4b3IJZXNpLGVkaQorCW1vdgllYnAsZWN4CisJc2hsZAllY3gsZWN4LDUKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZtb3ZkcWEJWzgwK2VzcF0seG1tNworCWFkZAllYngsZXNpCisJeG9yCWVicCxlZGkKKwl2bW92ZHFhCXhtbTcseG1tNgorCXZwYWRkZAl4bW02LHhtbTYseG1tMgorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwl2cHhvcgl4bW0zLHhtbTMseG1tNQorCWFkZAllYXgsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWJwLGVkeAorCW1vdgllc2ksZWJ4CisJc2hsZAllYngsZWJ4LDUKKwl2cHNybGQJeG1tNSx4bW0zLDMwCisJdm1vdmRxYQlbMzIrZXNwXSx4bW02CisJYWRkCWVheCxlYnAKKwl4b3IJZXNpLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwl2cHNsbGQJeG1tMyx4bW0zLDIKKwlhZGQJZWRpLERXT1JEIFs1Nitlc3BdCisJeG9yCWVzaSxlY3gKKwltb3YJZWJwLGVheAorCXNobGQJZWF4LGVheCw1CisJYWRkCWVkaSxlc2kKKwl4b3IJZWJwLGVjeAorCXNocmQJZWJ4LGVieCw3CisJYWRkCWVkaSxlYXgKKwl2cG9yCXhtbTMseG1tMyx4bW01CisJYWRkCWVkeCxEV09SRCBbNjArZXNwXQorCXhvcgllYnAsZWJ4CisJdm1vdmRxYQl4bW01LFs5Nitlc3BdCisJbW92CWVzaSxlZGkKKwlzaGxkCWVkaSxlZGksNQorCWFkZAllZHgsZWJwCisJeG9yCWVzaSxlYngKKwlzaHJkCWVheCxlYXgsNworCWFkZAllZHgsZWRpCisJdnBhbGlnbnIJeG1tNix4bW0zLHhtbTIsOAorCXZweG9yCXhtbTQseG1tNCx4bW0wCisJYWRkCWVjeCxEV09SRCBbZXNwXQorCXhvcgllc2ksZWF4CisJbW92CWVicCxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCXZweG9yCXhtbTQseG1tNCx4bW01CisJdm1vdmRxYQlbOTYrZXNwXSx4bW0wCisJYWRkCWVjeCxlc2kKKwl4b3IJZWJwLGVheAorCXZtb3ZkcWEJeG1tMCx4bW03CisJdnBhZGRkCXhtbTcseG1tNyx4bW0zCisJc2hyZAllZGksZWRpLDcKKwlhZGQJZWN4LGVkeAorCXZweG9yCXhtbTQseG1tNCx4bW02CisJYWRkCWVieCxEV09SRCBbNCtlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJdnBzcmxkCXhtbTYseG1tNCwzMAorCXZtb3ZkcWEJWzQ4K2VzcF0seG1tNworCWFkZAllYngsZWJwCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNworCWFkZAllYngsZWN4CisJdnBzbGxkCXhtbTQseG1tNCwyCisJYWRkCWVheCxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlZHgKKwltb3YJZWJwLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWJwLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwl2cG9yCXhtbTQseG1tNCx4bW02CisJYWRkCWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllYnAsZWN4CisJdm1vdmRxYQl4bW02LFs2NCtlc3BdCisJbW92CWVzaSxlYXgKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllZGksZWJwCisJeG9yCWVzaSxlY3gKKwlzaHJkCWVieCxlYngsNworCWFkZAllZGksZWF4CisJdnBhbGlnbnIJeG1tNyx4bW00LHhtbTMsOAorCXZweG9yCXhtbTUseG1tNSx4bW0xCisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVicCxlZGkKKwlzaGxkCWVkaSxlZGksNQorCXZweG9yCXhtbTUseG1tNSx4bW02CisJdm1vdmRxYQlbNjQrZXNwXSx4bW0xCisJYWRkCWVkeCxlc2kKKwl4b3IJZWJwLGVieAorCXZtb3ZkcWEJeG1tMSx4bW0wCisJdnBhZGRkCXhtbTAseG1tMCx4bW00CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVkaQorCXZweG9yCXhtbTUseG1tNSx4bW03CisJYWRkCWVjeCxEV09SRCBbMjArZXNwXQorCXhvcgllYnAsZWF4CisJbW92CWVzaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCXZwc3JsZAl4bW03LHhtbTUsMzAKKwl2bW92ZHFhCVtlc3BdLHhtbTAKKwlhZGQJZWN4LGVicAorCXhvcgllc2ksZWF4CisJc2hyZAllZGksZWRpLDcKKwlhZGQJZWN4LGVkeAorCXZwc2xsZAl4bW01LHhtbTUsMgorCWFkZAllYngsRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVkaQorCW1vdgllYnAsZWN4CisJc2hsZAllY3gsZWN4LDUKKwlhZGQJZWJ4LGVzaQorCXhvcgllYnAsZWRpCisJc2hyZAllZHgsZWR4LDcKKwlhZGQJZWJ4LGVjeAorCXZwb3IJeG1tNSx4bW01LHhtbTcKKwlhZGQJZWF4LERXT1JEIFsyOCtlc3BdCisJdm1vdmRxYQl4bW03LFs4MCtlc3BdCisJc2hyZAllY3gsZWN4LDcKKwltb3YJZXNpLGVieAorCXhvcgllYnAsZWR4CisJc2hsZAllYngsZWJ4LDUKKwlhZGQJZWF4LGVicAorCXhvcgllc2ksZWN4CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCXZwYWxpZ25yCXhtbTAseG1tNSx4bW00LDgKKwl2cHhvcgl4bW02LHhtbTYseG1tMgorCWFkZAllZGksRFdPUkQgWzMyK2VzcF0KKwlhbmQJZXNpLGVjeAorCXhvcgllY3gsZWR4CisJc2hyZAllYngsZWJ4LDcKKwl2cHhvcgl4bW02LHhtbTYseG1tNworCXZtb3ZkcWEJWzgwK2VzcF0seG1tMgorCW1vdgllYnAsZWF4CisJeG9yCWVzaSxlY3gKKwl2bW92ZHFhCXhtbTIseG1tMQorCXZwYWRkZAl4bW0xLHhtbTEseG1tNQorCXNobGQJZWF4LGVheCw1CisJYWRkCWVkaSxlc2kKKwl2cHhvcgl4bW02LHhtbTYseG1tMAorCXhvcgllYnAsZWJ4CisJeG9yCWVieCxlY3gKKwlhZGQJZWRpLGVheAorCWFkZAllZHgsRFdPUkQgWzM2K2VzcF0KKwl2cHNybGQJeG1tMCx4bW02LDMwCisJdm1vdmRxYQlbMTYrZXNwXSx4bW0xCisJYW5kCWVicCxlYngKKwl4b3IJZWJ4LGVjeAorCXNocmQJZWF4LGVheCw3CisJbW92CWVzaSxlZGkKKwl2cHNsbGQJeG1tNix4bW02LDIKKwl4b3IJZWJwLGVieAorCXNobGQJZWRpLGVkaSw1CisJYWRkCWVkeCxlYnAKKwl4b3IJZXNpLGVheAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlZGkKKwlhZGQJZWN4LERXT1JEIFs0MCtlc3BdCisJYW5kCWVzaSxlYXgKKwl2cG9yCXhtbTYseG1tNix4bW0wCisJeG9yCWVheCxlYngKKwlzaHJkCWVkaSxlZGksNworCXZtb3ZkcWEJeG1tMCxbOTYrZXNwXQorCW1vdgllYnAsZWR4CisJeG9yCWVzaSxlYXgKKwlzaGxkCWVkeCxlZHgsNQorCWFkZAllY3gsZXNpCisJeG9yCWVicCxlZGkKKwl4b3IJZWRpLGVheAorCWFkZAllY3gsZWR4CisJYWRkCWVieCxEV09SRCBbNDQrZXNwXQorCWFuZAllYnAsZWRpCisJeG9yCWVkaSxlYXgKKwlzaHJkCWVkeCxlZHgsNworCW1vdgllc2ksZWN4CisJeG9yCWVicCxlZGkKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZWJwCisJeG9yCWVzaSxlZHgKKwl4b3IJZWR4LGVkaQorCWFkZAllYngsZWN4CisJdnBhbGlnbnIJeG1tMSx4bW02LHhtbTUsOAorCXZweG9yCXhtbTcseG1tNyx4bW0zCisJYWRkCWVheCxEV09SRCBbNDgrZXNwXQorCWFuZAllc2ksZWR4CisJeG9yCWVkeCxlZGkKKwlzaHJkCWVjeCxlY3gsNworCXZweG9yCXhtbTcseG1tNyx4bW0wCisJdm1vdmRxYQlbOTYrZXNwXSx4bW0zCisJbW92CWVicCxlYngKKwl4b3IJZXNpLGVkeAorCXZtb3ZkcWEJeG1tMyxbMTQ0K2VzcF0KKwl2cGFkZGQJeG1tMix4bW0yLHhtbTYKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZXNpCisJdnB4b3IJeG1tNyx4bW03LHhtbTEKKwl4b3IJZWJwLGVjeAorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFs1Mitlc3BdCisJdnBzcmxkCXhtbTEseG1tNywzMAorCXZtb3ZkcWEJWzMyK2VzcF0seG1tMgorCWFuZAllYnAsZWN4CisJeG9yCWVjeCxlZHgKKwlzaHJkCWVieCxlYngsNworCW1vdgllc2ksZWF4CisJdnBzbGxkCXhtbTcseG1tNywyCisJeG9yCWVicCxlY3gKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllZGksZWJwCisJeG9yCWVzaSxlYngKKwl4b3IJZWJ4LGVjeAorCWFkZAllZGksZWF4CisJYWRkCWVkeCxEV09SRCBbNTYrZXNwXQorCWFuZAllc2ksZWJ4CisJdnBvcgl4bW03LHhtbTcseG1tMQorCXhvcgllYngsZWN4CisJc2hyZAllYXgsZWF4LDcKKwl2bW92ZHFhCXhtbTEsWzY0K2VzcF0KKwltb3YJZWJwLGVkaQorCXhvcgllc2ksZWJ4CisJc2hsZAllZGksZWRpLDUKKwlhZGQJZWR4LGVzaQorCXhvcgllYnAsZWF4CisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVkaQorCWFkZAllY3gsRFdPUkQgWzYwK2VzcF0KKwlhbmQJZWJwLGVheAorCXhvcgllYXgsZWJ4CisJc2hyZAllZGksZWRpLDcKKwltb3YJZXNpLGVkeAorCXhvcgllYnAsZWF4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVicAorCXhvcgllc2ksZWRpCisJeG9yCWVkaSxlYXgKKwlhZGQJZWN4LGVkeAorCXZwYWxpZ25yCXhtbTIseG1tNyx4bW02LDgKKwl2cHhvcgl4bW0wLHhtbTAseG1tNAorCWFkZAllYngsRFdPUkQgW2VzcF0KKwlhbmQJZXNpLGVkaQorCXhvcgllZGksZWF4CisJc2hyZAllZHgsZWR4LDcKKwl2cHhvcgl4bW0wLHhtbTAseG1tMQorCXZtb3ZkcWEJWzY0K2VzcF0seG1tNAorCW1vdgllYnAsZWN4CisJeG9yCWVzaSxlZGkKKwl2bW92ZHFhCXhtbTQseG1tMworCXZwYWRkZAl4bW0zLHhtbTMseG1tNworCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlc2kKKwl2cHhvcgl4bW0wLHhtbTAseG1tMgorCXhvcgllYnAsZWR4CisJeG9yCWVkeCxlZGkKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkQgWzQrZXNwXQorCXZwc3JsZAl4bW0yLHhtbTAsMzAKKwl2bW92ZHFhCVs0OCtlc3BdLHhtbTMKKwlhbmQJZWJwLGVkeAorCXhvcgllZHgsZWRpCisJc2hyZAllY3gsZWN4LDcKKwltb3YJZXNpLGVieAorCXZwc2xsZAl4bW0wLHhtbTAsMgorCXhvcgllYnAsZWR4CisJc2hsZAllYngsZWJ4LDUKKwlhZGQJZWF4LGVicAorCXhvcgllc2ksZWN4CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCWFkZAllZGksRFdPUkQgWzgrZXNwXQorCWFuZAllc2ksZWN4CisJdnBvcgl4bW0wLHhtbTAseG1tMgorCXhvcgllY3gsZWR4CisJc2hyZAllYngsZWJ4LDcKKwl2bW92ZHFhCXhtbTIsWzgwK2VzcF0KKwltb3YJZWJwLGVheAorCXhvcgllc2ksZWN4CisJc2hsZAllYXgsZWF4LDUKKwlhZGQJZWRpLGVzaQorCXhvcgllYnAsZWJ4CisJeG9yCWVieCxlY3gKKwlhZGQJZWRpLGVheAorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlhbmQJZWJwLGVieAorCXhvcgllYngsZWN4CisJc2hyZAllYXgsZWF4LDcKKwltb3YJZXNpLGVkaQorCXhvcgllYnAsZWJ4CisJc2hsZAllZGksZWRpLDUKKwlhZGQJZWR4LGVicAorCXhvcgllc2ksZWF4CisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVkaQorCXZwYWxpZ25yCXhtbTMseG1tMCx4bW03LDgKKwl2cHhvcgl4bW0xLHhtbTEseG1tNQorCWFkZAllY3gsRFdPUkQgWzE2K2VzcF0KKwlhbmQJZXNpLGVheAorCXhvcgllYXgsZWJ4CisJc2hyZAllZGksZWRpLDcKKwl2cHhvcgl4bW0xLHhtbTEseG1tMgorCXZtb3ZkcWEJWzgwK2VzcF0seG1tNQorCW1vdgllYnAsZWR4CisJeG9yCWVzaSxlYXgKKwl2bW92ZHFhCXhtbTUseG1tNAorCXZwYWRkZAl4bW00LHhtbTQseG1tMAorCXNobGQJZWR4LGVkeCw1CisJYWRkCWVjeCxlc2kKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXhvcgllYnAsZWRpCisJeG9yCWVkaSxlYXgKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkQgWzIwK2VzcF0KKwl2cHNybGQJeG1tMyx4bW0xLDMwCisJdm1vdmRxYQlbZXNwXSx4bW00CisJYW5kCWVicCxlZGkKKwl4b3IJZWRpLGVheAorCXNocmQJZWR4LGVkeCw3CisJbW92CWVzaSxlY3gKKwl2cHNsbGQJeG1tMSx4bW0xLDIKKwl4b3IJZWJwLGVkaQorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlYnAKKwl4b3IJZXNpLGVkeAorCXhvcgllZHgsZWRpCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFsyNCtlc3BdCisJYW5kCWVzaSxlZHgKKwl2cG9yCXhtbTEseG1tMSx4bW0zCisJeG9yCWVkeCxlZGkKKwlzaHJkCWVjeCxlY3gsNworCXZtb3ZkcWEJeG1tMyxbOTYrZXNwXQorCW1vdgllYnAsZWJ4CisJeG9yCWVzaSxlZHgKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZXNpCisJeG9yCWVicCxlY3gKKwl4b3IJZWN4LGVkeAorCWFkZAllYXgsZWJ4CisJYWRkCWVkaSxEV09SRCBbMjgrZXNwXQorCWFuZAllYnAsZWN4CisJeG9yCWVjeCxlZHgKKwlzaHJkCWVieCxlYngsNworCW1vdgllc2ksZWF4CisJeG9yCWVicCxlY3gKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllZGksZWJwCisJeG9yCWVzaSxlYngKKwl4b3IJZWJ4LGVjeAorCWFkZAllZGksZWF4CisJdnBhbGlnbnIJeG1tNCx4bW0xLHhtbTAsOAorCXZweG9yCXhtbTIseG1tMix4bW02CisJYWRkCWVkeCxEV09SRCBbMzIrZXNwXQorCWFuZAllc2ksZWJ4CisJeG9yCWVieCxlY3gKKwlzaHJkCWVheCxlYXgsNworCXZweG9yCXhtbTIseG1tMix4bW0zCisJdm1vdmRxYQlbOTYrZXNwXSx4bW02CisJbW92CWVicCxlZGkKKwl4b3IJZXNpLGVieAorCXZtb3ZkcWEJeG1tNix4bW01CisJdnBhZGRkCXhtbTUseG1tNSx4bW0xCisJc2hsZAllZGksZWRpLDUKKwlhZGQJZWR4LGVzaQorCXZweG9yCXhtbTIseG1tMix4bW00CisJeG9yCWVicCxlYXgKKwl4b3IJZWF4LGVieAorCWFkZAllZHgsZWRpCisJYWRkCWVjeCxEV09SRCBbMzYrZXNwXQorCXZwc3JsZAl4bW00LHhtbTIsMzAKKwl2bW92ZHFhCVsxNitlc3BdLHhtbTUKKwlhbmQJZWJwLGVheAorCXhvcgllYXgsZWJ4CisJc2hyZAllZGksZWRpLDcKKwltb3YJZXNpLGVkeAorCXZwc2xsZAl4bW0yLHhtbTIsMgorCXhvcgllYnAsZWF4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVicAorCXhvcgllc2ksZWRpCisJeG9yCWVkaSxlYXgKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkQgWzQwK2VzcF0KKwlhbmQJZXNpLGVkaQorCXZwb3IJeG1tMix4bW0yLHhtbTQKKwl4b3IJZWRpLGVheAorCXNocmQJZWR4LGVkeCw3CisJdm1vdmRxYQl4bW00LFs2NCtlc3BdCisJbW92CWVicCxlY3gKKwl4b3IJZXNpLGVkaQorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlc2kKKwl4b3IJZWJwLGVkeAorCXhvcgllZHgsZWRpCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFs0NCtlc3BdCisJYW5kCWVicCxlZHgKKwl4b3IJZWR4LGVkaQorCXNocmQJZWN4LGVjeCw3CisJbW92CWVzaSxlYngKKwl4b3IJZWJwLGVkeAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlYnAKKwl4b3IJZXNpLGVkeAorCWFkZAllYXgsZWJ4CisJdnBhbGlnbnIJeG1tNSx4bW0yLHhtbTEsOAorCXZweG9yCXhtbTMseG1tMyx4bW03CisJYWRkCWVkaSxEV09SRCBbNDgrZXNwXQorCXhvcgllc2ksZWN4CisJbW92CWVicCxlYXgKKwlzaGxkCWVheCxlYXgsNQorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdm1vdmRxYQlbNjQrZXNwXSx4bW03CisJYWRkCWVkaSxlc2kKKwl4b3IJZWJwLGVjeAorCXZtb3ZkcWEJeG1tNyx4bW02CisJdnBhZGRkCXhtbTYseG1tNix4bW0yCisJc2hyZAllYngsZWJ4LDcKKwlhZGQJZWRpLGVheAorCXZweG9yCXhtbTMseG1tMyx4bW01CisJYWRkCWVkeCxEV09SRCBbNTIrZXNwXQorCXhvcgllYnAsZWJ4CisJbW92CWVzaSxlZGkKKwlzaGxkCWVkaSxlZGksNQorCXZwc3JsZAl4bW01LHhtbTMsMzAKKwl2bW92ZHFhCVszMitlc3BdLHhtbTYKKwlhZGQJZWR4LGVicAorCXhvcgllc2ksZWJ4CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVkaQorCXZwc2xsZAl4bW0zLHhtbTMsMgorCWFkZAllY3gsRFdPUkQgWzU2K2VzcF0KKwl4b3IJZXNpLGVheAorCW1vdgllYnAsZWR4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVzaQorCXhvcgllYnAsZWF4CisJc2hyZAllZGksZWRpLDcKKwlhZGQJZWN4LGVkeAorCXZwb3IJeG1tMyx4bW0zLHhtbTUKKwlhZGQJZWJ4LERXT1JEIFs2MCtlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlYnAKKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFtlc3BdCisJdnBhZGRkCXhtbTcseG1tNyx4bW0zCisJeG9yCWVzaSxlZHgKKwltb3YJZWJwLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlc2kKKwl2bW92ZHFhCVs0OCtlc3BdLHhtbTcKKwl4b3IJZWJwLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWJwLGVjeAorCW1vdgllc2ksZWF4CisJc2hsZAllYXgsZWF4LDUKKwlhZGQJZWRpLGVicAorCXhvcgllc2ksZWN4CisJc2hyZAllYngsZWJ4LDcKKwlhZGQJZWRpLGVheAorCWFkZAllZHgsRFdPUkQgWzgrZXNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVicCxlZGkKKwlzaGxkCWVkaSxlZGksNQorCWFkZAllZHgsZXNpCisJeG9yCWVicCxlYngKKwlzaHJkCWVheCxlYXgsNworCWFkZAllZHgsZWRpCisJYWRkCWVjeCxEV09SRCBbMTIrZXNwXQorCXhvcgllYnAsZWF4CisJbW92CWVzaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCWFkZAllY3gsZWJwCisJeG9yCWVzaSxlYXgKKwlzaHJkCWVkaSxlZGksNworCWFkZAllY3gsZWR4CisJbW92CWVicCxEV09SRCBbMTk2K2VzcF0KKwljbXAJZWJwLERXT1JEIFsyMDArZXNwXQorCWplCU5FQVIgTCQwMDhkb25lCisJdm1vdmRxYQl4bW03LFsxNjArZXNwXQorCXZtb3ZkcWEJeG1tNixbMTc2K2VzcF0KKwl2bW92ZHF1CXhtbTAsW2VicF0KKwl2bW92ZHF1CXhtbTEsWzE2K2VicF0KKwl2bW92ZHF1CXhtbTIsWzMyK2VicF0KKwl2bW92ZHF1CXhtbTMsWzQ4K2VicF0KKwlhZGQJZWJwLDY0CisJdnBzaHVmYgl4bW0wLHhtbTAseG1tNgorCW1vdglEV09SRCBbMTk2K2VzcF0sZWJwCisJdm1vdmRxYQlbOTYrZXNwXSx4bW03CisJYWRkCWVieCxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWRpCisJdnBzaHVmYgl4bW0xLHhtbTEseG1tNgorCW1vdgllYnAsZWN4CisJc2hsZAllY3gsZWN4LDUKKwl2cGFkZGQJeG1tNCx4bW0wLHhtbTcKKwlhZGQJZWJ4LGVzaQorCXhvcgllYnAsZWRpCisJc2hyZAllZHgsZWR4LDcKKwlhZGQJZWJ4LGVjeAorCXZtb3ZkcWEJW2VzcF0seG1tNAorCWFkZAllYXgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWJwLGVkeAorCW1vdgllc2ksZWJ4CisJc2hsZAllYngsZWJ4LDUKKwlhZGQJZWF4LGVicAorCXhvcgllc2ksZWR4CisJc2hyZAllY3gsZWN4LDcKKwlhZGQJZWF4LGVieAorCWFkZAllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVjeAorCW1vdgllYnAsZWF4CisJc2hsZAllYXgsZWF4LDUKKwlhZGQJZWRpLGVzaQorCXhvcgllYnAsZWN4CisJc2hyZAllYngsZWJ4LDcKKwlhZGQJZWRpLGVheAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWJwLGVieAorCW1vdgllc2ksZWRpCisJc2hsZAllZGksZWRpLDUKKwlhZGQJZWR4LGVicAorCXhvcgllc2ksZWJ4CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVkaQorCWFkZAllY3gsRFdPUkQgWzMyK2VzcF0KKwl4b3IJZXNpLGVheAorCXZwc2h1ZmIJeG1tMix4bW0yLHhtbTYKKwltb3YJZWJwLGVkeAorCXNobGQJZWR4LGVkeCw1CisJdnBhZGRkCXhtbTUseG1tMSx4bW03CisJYWRkCWVjeCxlc2kKKwl4b3IJZWJwLGVheAorCXNocmQJZWRpLGVkaSw3CisJYWRkCWVjeCxlZHgKKwl2bW92ZHFhCVsxNitlc3BdLHhtbTUKKwlhZGQJZWJ4LERXT1JEIFszNitlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlYnAKKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFs0MCtlc3BdCisJeG9yCWVzaSxlZHgKKwltb3YJZWJwLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWJwLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFs0NCtlc3BdCisJeG9yCWVicCxlY3gKKwltb3YJZXNpLGVheAorCXNobGQJZWF4LGVheCw1CisJYWRkCWVkaSxlYnAKKwl4b3IJZXNpLGVjeAorCXNocmQJZWJ4LGVieCw3CisJYWRkCWVkaSxlYXgKKwlhZGQJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVzaSxlYngKKwl2cHNodWZiCXhtbTMseG1tMyx4bW02CisJbW92CWVicCxlZGkKKwlzaGxkCWVkaSxlZGksNQorCXZwYWRkZAl4bW02LHhtbTIseG1tNworCWFkZAllZHgsZXNpCisJeG9yCWVicCxlYngKKwlzaHJkCWVheCxlYXgsNworCWFkZAllZHgsZWRpCisJdm1vdmRxYQlbMzIrZXNwXSx4bW02CisJYWRkCWVjeCxEV09SRCBbNTIrZXNwXQorCXhvcgllYnAsZWF4CisJbW92CWVzaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCWFkZAllY3gsZWJwCisJeG9yCWVzaSxlYXgKKwlzaHJkCWVkaSxlZGksNworCWFkZAllY3gsZWR4CisJYWRkCWVieCxEV09SRCBbNTYrZXNwXQorCXhvcgllc2ksZWRpCisJbW92CWVicCxlY3gKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVicCxlZGkKKwlzaHJkCWVkeCxlZHgsNworCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRCBbNjArZXNwXQorCXhvcgllYnAsZWR4CisJbW92CWVzaSxlYngKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZWJwCisJc2hyZAllY3gsZWN4LDcKKwlhZGQJZWF4LGVieAorCW1vdgllYnAsRFdPUkQgWzE5Mitlc3BdCisJYWRkCWVheCxEV09SRCBbZWJwXQorCWFkZAllc2ksRFdPUkQgWzQrZWJwXQorCWFkZAllY3gsRFdPUkQgWzgrZWJwXQorCW1vdglEV09SRCBbZWJwXSxlYXgKKwlhZGQJZWR4LERXT1JEIFsxMitlYnBdCisJbW92CURXT1JEIFs0K2VicF0sZXNpCisJYWRkCWVkaSxEV09SRCBbMTYrZWJwXQorCW1vdgllYngsZWN4CisJbW92CURXT1JEIFs4K2VicF0sZWN4CisJeG9yCWVieCxlZHgKKwltb3YJRFdPUkQgWzEyK2VicF0sZWR4CisJbW92CURXT1JEIFsxNitlYnBdLGVkaQorCW1vdgllYnAsZXNpCisJYW5kCWVzaSxlYngKKwltb3YJZWJ4LGVicAorCWptcAlORUFSIEwkMDA3bG9vcAorYWxpZ24JMTYKK0wkMDA4ZG9uZToKKwlhZGQJZWJ4LERXT1JEIFsxNitlc3BdCisJeG9yCWVzaSxlZGkKKwltb3YJZWJwLGVjeAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlc2kKKwl4b3IJZWJwLGVkaQorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFsyMCtlc3BdCisJeG9yCWVicCxlZHgKKwltb3YJZXNpLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlYnAKKwl4b3IJZXNpLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlY3gKKwltb3YJZWJwLGVheAorCXNobGQJZWF4LGVheCw1CisJYWRkCWVkaSxlc2kKKwl4b3IJZWJwLGVjeAorCXNocmQJZWJ4LGVieCw3CisJYWRkCWVkaSxlYXgKKwlhZGQJZWR4LERXT1JEIFsyOCtlc3BdCisJeG9yCWVicCxlYngKKwltb3YJZXNpLGVkaQorCXNobGQJZWRpLGVkaSw1CisJYWRkCWVkeCxlYnAKKwl4b3IJZXNpLGVieAorCXNocmQJZWF4LGVheCw3CisJYWRkCWVkeCxlZGkKKwlhZGQJZWN4LERXT1JEIFszMitlc3BdCisJeG9yCWVzaSxlYXgKKwltb3YJZWJwLGVkeAorCXNobGQJZWR4LGVkeCw1CisJYWRkCWVjeCxlc2kKKwl4b3IJZWJwLGVheAorCXNocmQJZWRpLGVkaSw3CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEIFszNitlc3BdCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlYnAKKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFs0MCtlc3BdCisJeG9yCWVzaSxlZHgKKwltb3YJZWJwLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWJwLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWRpLERXT1JEIFs0NCtlc3BdCisJeG9yCWVicCxlY3gKKwltb3YJZXNpLGVheAorCXNobGQJZWF4LGVheCw1CisJYWRkCWVkaSxlYnAKKwl4b3IJZXNpLGVjeAorCXNocmQJZWJ4LGVieCw3CisJYWRkCWVkaSxlYXgKKwlhZGQJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVzaSxlYngKKwltb3YJZWJwLGVkaQorCXNobGQJZWRpLGVkaSw1CisJYWRkCWVkeCxlc2kKKwl4b3IJZWJwLGVieAorCXNocmQJZWF4LGVheCw3CisJYWRkCWVkeCxlZGkKKwlhZGQJZWN4LERXT1JEIFs1Mitlc3BdCisJeG9yCWVicCxlYXgKKwltb3YJZXNpLGVkeAorCXNobGQJZWR4LGVkeCw1CisJYWRkCWVjeCxlYnAKKwl4b3IJZXNpLGVheAorCXNocmQJZWRpLGVkaSw3CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEIFs1Nitlc3BdCisJeG9yCWVzaSxlZGkKKwltb3YJZWJwLGVjeAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlc2kKKwl4b3IJZWJwLGVkaQorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEIFs2MCtlc3BdCisJeG9yCWVicCxlZHgKKwltb3YJZXNpLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlYnAKKwlzaHJkCWVjeCxlY3gsNworCWFkZAllYXgsZWJ4CisJdnplcm9hbGwKKwltb3YJZWJwLERXT1JEIFsxOTIrZXNwXQorCWFkZAllYXgsRFdPUkQgW2VicF0KKwltb3YJZXNwLERXT1JEIFsyMDQrZXNwXQorCWFkZAllc2ksRFdPUkQgWzQrZWJwXQorCWFkZAllY3gsRFdPUkQgWzgrZWJwXQorCW1vdglEV09SRCBbZWJwXSxlYXgKKwlhZGQJZWR4LERXT1JEIFsxMitlYnBdCisJbW92CURXT1JEIFs0K2VicF0sZXNpCisJYWRkCWVkaSxEV09SRCBbMTYrZWJwXQorCW1vdglEV09SRCBbOCtlYnBdLGVjeAorCW1vdglEV09SRCBbMTIrZWJwXSxlZHgKKwltb3YJRFdPUkQgWzE2K2VicF0sZWRpCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JNjQKK0wkS19YWF9YWDoKK2RkCTE1MTg1MDAyNDksMTUxODUwMDI0OSwxNTE4NTAwMjQ5LDE1MTg1MDAyNDkKK2RkCTE4NTk3NzUzOTMsMTg1OTc3NTM5MywxODU5Nzc1MzkzLDE4NTk3NzUzOTMKK2RkCTI0MDA5NTk3MDgsMjQwMDk1OTcwOCwyNDAwOTU5NzA4LDI0MDA5NTk3MDgKK2RkCTMzOTU0Njk3ODIsMzM5NTQ2OTc4MiwzMzk1NDY5NzgyLDMzOTU0Njk3ODIKK2RkCTY2MDUxLDY3NDM4MDg3LDEzNDgxMDEyMywyMDIxODIxNTkKK2RiCTE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDAKK2RiCTgzLDcyLDY1LDQ5LDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcsMTEwLDExNQorZGIJMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw0NCwzMiw2Nyw4MgorZGIJODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIKK2RiCTExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKK3NlZ21lbnQJLmJzcworY29tbW9uCV9PUEVOU1NMX2lhMzJjYXBfUCAxNgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni01ODYuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTI1Ni01ODYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2NmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LTU4Ni5hc20KQEAgLTAsMCArMSw1NTczIEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorO2V4dGVybglfT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKK2FsaWduCTE2Citfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CitMJF9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVheCxEV09SRCBbMjgrZXNwXQorCW1vdgllYngsZXNwCisJY2FsbAlMJDAwMHBpY19wb2ludAorTCQwMDBwaWNfcG9pbnQ6CisJcG9wCWVicAorCWxlYQllYnAsWyhMJDAwMUsyNTYtTCQwMDBwaWNfcG9pbnQpK2VicF0KKwlzdWIJZXNwLDE2CisJYW5kCWVzcCwtNjQKKwlzaGwJZWF4LDYKKwlhZGQJZWF4LGVkaQorCW1vdglEV09SRCBbZXNwXSxlc2kKKwltb3YJRFdPUkQgWzQrZXNwXSxlZGkKKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJ4CisJbGVhCWVkeCxbX09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdgllY3gsRFdPUkQgW2VkeF0KKwltb3YJZWJ4LERXT1JEIFs0K2VkeF0KKwl0ZXN0CWVjeCwxMDQ4NTc2CisJam56CU5FQVIgTCQwMDJsb29wCisJbW92CWVkeCxEV09SRCBbOCtlZHhdCisJdGVzdAllY3gsMTY3NzcyMTYKKwlqeglORUFSIEwkMDAzbm9feG1tCisJYW5kCWVjeCwxMDczNzQxODI0CisJYW5kCWVieCwyNjg0MzU5NjgKKwlvcgllY3gsZWJ4CisJYW5kCWVjeCwxMzQyMTc3MjgwCisJY21wCWVjeCwxMzQyMTc3MjgwCisJamUJTkVBUiBMJDAwNEFWWAorCXRlc3QJZWJ4LDUxMgorCWpueglORUFSIEwkMDA1U1NTRTMKK0wkMDAzbm9feG1tOgorCXN1YgllYXgsZWRpCisJY21wCWVheCwyNTYKKwlqYWUJTkVBUiBMJDAwNnVucm9sbGVkCisJam1wCU5FQVIgTCQwMDJsb29wCithbGlnbgkxNgorTCQwMDJsb29wOgorCW1vdgllYXgsRFdPUkQgW2VkaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VkaV0KKwltb3YJZWN4LERXT1JEIFs4K2VkaV0KKwlic3dhcAllYXgKKwltb3YJZWR4LERXT1JEIFsxMitlZGldCisJYnN3YXAJZWJ4CisJcHVzaAllYXgKKwlic3dhcAllY3gKKwlwdXNoCWVieAorCWJzd2FwCWVkeAorCXB1c2gJZWN4CisJcHVzaAllZHgKKwltb3YJZWF4LERXT1JEIFsxNitlZGldCisJbW92CWVieCxEV09SRCBbMjArZWRpXQorCW1vdgllY3gsRFdPUkQgWzI0K2VkaV0KKwlic3dhcAllYXgKKwltb3YJZWR4LERXT1JEIFsyOCtlZGldCisJYnN3YXAJZWJ4CisJcHVzaAllYXgKKwlic3dhcAllY3gKKwlwdXNoCWVieAorCWJzd2FwCWVkeAorCXB1c2gJZWN4CisJcHVzaAllZHgKKwltb3YJZWF4LERXT1JEIFszMitlZGldCisJbW92CWVieCxEV09SRCBbMzYrZWRpXQorCW1vdgllY3gsRFdPUkQgWzQwK2VkaV0KKwlic3dhcAllYXgKKwltb3YJZWR4LERXT1JEIFs0NCtlZGldCisJYnN3YXAJZWJ4CisJcHVzaAllYXgKKwlic3dhcAllY3gKKwlwdXNoCWVieAorCWJzd2FwCWVkeAorCXB1c2gJZWN4CisJcHVzaAllZHgKKwltb3YJZWF4LERXT1JEIFs0OCtlZGldCisJbW92CWVieCxEV09SRCBbNTIrZWRpXQorCW1vdgllY3gsRFdPUkQgWzU2K2VkaV0KKwlic3dhcAllYXgKKwltb3YJZWR4LERXT1JEIFs2MCtlZGldCisJYnN3YXAJZWJ4CisJcHVzaAllYXgKKwlic3dhcAllY3gKKwlwdXNoCWVieAorCWJzd2FwCWVkeAorCXB1c2gJZWN4CisJcHVzaAllZHgKKwlhZGQJZWRpLDY0CisJbGVhCWVzcCxbZXNwLTM2XQorCW1vdglEV09SRCBbMTA0K2VzcF0sZWRpCisJbW92CWVheCxEV09SRCBbZXNpXQorCW1vdgllYngsRFdPUkQgWzQrZXNpXQorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCW1vdgllZGksRFdPUkQgWzEyK2VzaV0KKwltb3YJRFdPUkQgWzgrZXNwXSxlYngKKwl4b3IJZWJ4LGVjeAorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWRpCisJbW92CURXT1JEIFtlc3BdLGVieAorCW1vdgllZHgsRFdPUkQgWzE2K2VzaV0KKwltb3YJZWJ4LERXT1JEIFsyMCtlc2ldCisJbW92CWVjeCxEV09SRCBbMjQrZXNpXQorCW1vdgllZGksRFdPUkQgWzI4K2VzaV0KKwltb3YJRFdPUkQgWzI0K2VzcF0sZWJ4CisJbW92CURXT1JEIFsyOCtlc3BdLGVjeAorCW1vdglEV09SRCBbMzIrZXNwXSxlZGkKK2FsaWduCTE2CitMJDAwNzAwXzE1OgorCW1vdgllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbMjQrZXNwXQorCXJvcgllY3gsMTQKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJeG9yCWVjeCxlZHgKKwl4b3IJZXNpLGVkaQorCW1vdgllYngsRFdPUkQgWzk2K2VzcF0KKwlyb3IJZWN4LDUKKwlhbmQJZXNpLGVkeAorCW1vdglEV09SRCBbMjArZXNwXSxlZHgKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzMyK2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlc2kKKwlyb3IJZWN4LDkKKwlhZGQJZWJ4LGVkeAorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFs0K2VzcF0sZWF4CisJbGVhCWVzcCxbZXNwLTRdCisJcm9yCWVjeCwxMQorCW1vdgllc2ksRFdPUkQgW2VicF0KKwl4b3IJZWN4LGVheAorCW1vdgllZHgsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYngsZXNpCisJbW92CURXT1JEIFtlc3BdLGVheAorCWFkZAllZHgsZWJ4CisJYW5kCWVheCxEV09SRCBbNCtlc3BdCisJYWRkCWVieCxlY3gKKwl4b3IJZWF4LGVkaQorCWFkZAllYnAsNAorCWFkZAllYXgsZWJ4CisJY21wCWVzaSwzMjQ4MjIyNTgwCisJam5lCU5FQVIgTCQwMDcwMF8xNQorCW1vdgllY3gsRFdPUkQgWzE1Nitlc3BdCisJam1wCU5FQVIgTCQwMDgxNl82MworYWxpZ24JMTYKK0wkMDA4MTZfNjM6CisJbW92CWVieCxlY3gKKwltb3YJZXNpLERXT1JEIFsxMDQrZXNwXQorCXJvcgllY3gsMTEKKwltb3YJZWRpLGVzaQorCXJvcgllc2ksMgorCXhvcgllY3gsZWJ4CisJc2hyCWVieCwzCisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVjeAorCXJvcgllc2ksMTcKKwlhZGQJZWJ4LERXT1JEIFsxNjArZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFsxMjQrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsyNCtlc3BdCisJcm9yCWVjeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllY3gsZWR4CisJeG9yCWVzaSxlZGkKKwltb3YJRFdPUkQgWzk2K2VzcF0sZWJ4CisJcm9yCWVjeCw1CisJYW5kCWVzaSxlZHgKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWR4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFszMitlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZXNpCisJcm9yCWVjeCw5CisJYWRkCWVieCxlZHgKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbNCtlc3BdLGVheAorCWxlYQllc3AsW2VzcC00XQorCXJvcgllY3gsMTEKKwltb3YJZXNpLERXT1JEIFtlYnBdCisJeG9yCWVjeCxlYXgKKwltb3YJZWR4LERXT1JEIFsyMCtlc3BdCisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWJ4LGVzaQorCW1vdglEV09SRCBbZXNwXSxlYXgKKwlhZGQJZWR4LGVieAorCWFuZAllYXgsRFdPUkQgWzQrZXNwXQorCWFkZAllYngsZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFsxNTYrZXNwXQorCWFkZAllYnAsNAorCWFkZAllYXgsZWJ4CisJY21wCWVzaSwzMzI5MzI1Mjk4CisJam5lCU5FQVIgTCQwMDgxNl82MworCW1vdgllc2ksRFdPUkQgWzM1Nitlc3BdCisJbW92CWVieCxEV09SRCBbOCtlc3BdCisJbW92CWVjeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsRFdPUkQgW2VzaV0KKwlhZGQJZWJ4LERXT1JEIFs0K2VzaV0KKwlhZGQJZWRpLERXT1JEIFs4K2VzaV0KKwlhZGQJZWN4LERXT1JEIFsxMitlc2ldCisJbW92CURXT1JEIFtlc2ldLGVheAorCW1vdglEV09SRCBbNCtlc2ldLGVieAorCW1vdglEV09SRCBbOCtlc2ldLGVkaQorCW1vdglEV09SRCBbMTIrZXNpXSxlY3gKKwltb3YJZWF4LERXT1JEIFsyNCtlc3BdCisJbW92CWVieCxEV09SRCBbMjgrZXNwXQorCW1vdgllY3gsRFdPUkQgWzMyK2VzcF0KKwltb3YJZWRpLERXT1JEIFszNjArZXNwXQorCWFkZAllZHgsRFdPUkQgWzE2K2VzaV0KKwlhZGQJZWF4LERXT1JEIFsyMCtlc2ldCisJYWRkCWVieCxEV09SRCBbMjQrZXNpXQorCWFkZAllY3gsRFdPUkQgWzI4K2VzaV0KKwltb3YJRFdPUkQgWzE2K2VzaV0sZWR4CisJbW92CURXT1JEIFsyMCtlc2ldLGVheAorCW1vdglEV09SRCBbMjQrZXNpXSxlYngKKwltb3YJRFdPUkQgWzI4K2VzaV0sZWN4CisJbGVhCWVzcCxbMzU2K2VzcF0KKwlzdWIJZWJwLDI1NgorCWNtcAllZGksRFdPUkQgWzgrZXNwXQorCWpiCU5FQVIgTCQwMDJsb29wCisJbW92CWVzcCxEV09SRCBbMTIrZXNwXQorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2FsaWduCTY0CitMJDAwMUsyNTY6CitkZAkxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOTgKK2RkCTY2MDUxLDY3NDM4MDg3LDEzNDgxMDEyMywyMDIxODIxNTkKK2RiCTgzLDcyLDY1LDUwLDUzLDU0LDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcKK2RiCTExMCwxMTUsMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw0NCwzMgorZGIJNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3CitkYgkxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzCitkYgk2MiwwCithbGlnbgkxNgorTCQwMDZ1bnJvbGxlZDoKKwlsZWEJZXNwLFtlc3AtOTZdCisJbW92CWVheCxEV09SRCBbZXNpXQorCW1vdgllYnAsRFdPUkQgWzQrZXNpXQorCW1vdgllY3gsRFdPUkQgWzgrZXNpXQorCW1vdgllYngsRFdPUkQgWzEyK2VzaV0KKwltb3YJRFdPUkQgWzQrZXNwXSxlYnAKKwl4b3IJZWJwLGVjeAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCW1vdglEV09SRCBbMTIrZXNwXSxlYngKKwltb3YJZWR4LERXT1JEIFsxNitlc2ldCisJbW92CWVieCxEV09SRCBbMjArZXNpXQorCW1vdgllY3gsRFdPUkQgWzI0K2VzaV0KKwltb3YJZXNpLERXT1JEIFsyOCtlc2ldCisJbW92CURXT1JEIFsyMCtlc3BdLGVieAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzcF0sZXNpCisJam1wCU5FQVIgTCQwMDlncmFuZF9sb29wCithbGlnbgkxNgorTCQwMDlncmFuZF9sb29wOgorCW1vdgllYngsRFdPUkQgW2VkaV0KKwltb3YJZWN4LERXT1JEIFs0K2VkaV0KKwlic3dhcAllYngKKwltb3YJZXNpLERXT1JEIFs4K2VkaV0KKwlic3dhcAllY3gKKwltb3YJRFdPUkQgWzMyK2VzcF0sZWJ4CisJYnN3YXAJZXNpCisJbW92CURXT1JEIFszNitlc3BdLGVjeAorCW1vdglEV09SRCBbNDArZXNwXSxlc2kKKwltb3YJZWJ4LERXT1JEIFsxMitlZGldCisJbW92CWVjeCxEV09SRCBbMTYrZWRpXQorCWJzd2FwCWVieAorCW1vdgllc2ksRFdPUkQgWzIwK2VkaV0KKwlic3dhcAllY3gKKwltb3YJRFdPUkQgWzQ0K2VzcF0sZWJ4CisJYnN3YXAJZXNpCisJbW92CURXT1JEIFs0OCtlc3BdLGVjeAorCW1vdglEV09SRCBbNTIrZXNwXSxlc2kKKwltb3YJZWJ4LERXT1JEIFsyNCtlZGldCisJbW92CWVjeCxEV09SRCBbMjgrZWRpXQorCWJzd2FwCWVieAorCW1vdgllc2ksRFdPUkQgWzMyK2VkaV0KKwlic3dhcAllY3gKKwltb3YJRFdPUkQgWzU2K2VzcF0sZWJ4CisJYnN3YXAJZXNpCisJbW92CURXT1JEIFs2MCtlc3BdLGVjeAorCW1vdglEV09SRCBbNjQrZXNwXSxlc2kKKwltb3YJZWJ4LERXT1JEIFszNitlZGldCisJbW92CWVjeCxEV09SRCBbNDArZWRpXQorCWJzd2FwCWVieAorCW1vdgllc2ksRFdPUkQgWzQ0K2VkaV0KKwlic3dhcAllY3gKKwltb3YJRFdPUkQgWzY4K2VzcF0sZWJ4CisJYnN3YXAJZXNpCisJbW92CURXT1JEIFs3Mitlc3BdLGVjeAorCW1vdglEV09SRCBbNzYrZXNwXSxlc2kKKwltb3YJZWJ4LERXT1JEIFs0OCtlZGldCisJbW92CWVjeCxEV09SRCBbNTIrZWRpXQorCWJzd2FwCWVieAorCW1vdgllc2ksRFdPUkQgWzU2K2VkaV0KKwlic3dhcAllY3gKKwltb3YJRFdPUkQgWzgwK2VzcF0sZWJ4CisJYnN3YXAJZXNpCisJbW92CURXT1JEIFs4NCtlc3BdLGVjeAorCW1vdglEV09SRCBbODgrZXNwXSxlc2kKKwltb3YJZWJ4LERXT1JEIFs2MCtlZGldCisJYWRkCWVkaSw2NAorCWJzd2FwCWVieAorCW1vdglEV09SRCBbMTAwK2VzcF0sZWRpCisJbW92CURXT1JEIFs5Mitlc3BdLGVieAorCW1vdgllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCXJvcgllZHgsMTQKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWJ4LERXT1JEIFszMitlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTYrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMTExNjM1MjQwOCtlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVzaSxlZHgKKwltb3YJZWN4LERXT1JEIFsxNitlc3BdCisJcm9yCWVkeCwxNAorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdgllYngsRFdPUkQgWzM2K2VzcF0KKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsxMitlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbMjQrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsyOCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMTg5OTQ0NzQ0MStlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZWN4LGVkeAorCW1vdgllc2ksRFdPUkQgWzEyK2VzcF0KKwlyb3IJZWR4LDE0CisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVieCxEV09SRCBbNDArZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbMjQrZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzMwNDkzMjM0NzErZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzQrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVzaSxlZHgKKwltb3YJZWN4LERXT1JEIFs4K2VzcF0KKwlyb3IJZWR4LDE0CisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CWVieCxEV09SRCBbNDQrZXNwXQorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzQrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMjArZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzM5MjEwMDk1NzMrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgW2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbNCtlc3BdCisJcm9yCWVkeCwxNAorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVieCxEV09SRCBbNDgrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsxMitlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFs5NjE5ODcxNjMrZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllc2ksZWR4CisJbW92CWVjeCxEV09SRCBbZXNwXQorCXJvcgllZHgsMTQKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdgllYngsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsyOCtlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbOCtlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFsxNTA4OTcwOTkzK2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZWN4LGVkeAorCW1vdgllc2ksRFdPUkQgWzI4K2VzcF0KKwlyb3IJZWR4LDE0CisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVieCxEV09SRCBbNTYrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFs0K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMjQ1MzYzNTc0OCtlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVzaSxlZHgKKwltb3YJZWN4LERXT1JEIFsyNCtlc3BdCisJcm9yCWVkeCwxNAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdgllYngsRFdPUkQgWzYwK2VzcF0KKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsyMCtlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzQrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzI4NzA3NjMyMjErZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCXJvcgllZHgsMTQKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWJ4LERXT1JEIFs2NCtlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTYrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMzYyNDM4MTA4MCtlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVzaSxlZHgKKwltb3YJZWN4LERXT1JEIFsxNitlc3BdCisJcm9yCWVkeCwxNAorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdgllYngsRFdPUkQgWzY4K2VzcF0KKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsxMitlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbMjQrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsyOCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMzEwNTk4NDAxK2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbMTIrZXNwXQorCXJvcgllZHgsMTQKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWJ4LERXT1JEIFs3Mitlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbMjArZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFsyNCtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbNjA3MjI1Mjc4K2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllc2ksZWR4CisJbW92CWVjeCxEV09SRCBbOCtlc3BdCisJcm9yCWVkeCwxNAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdgllYngsRFdPUkQgWzc2K2VzcF0KKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFs0K2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFsxNitlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFsxNDI2ODgxOTg3K2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZWN4LGVkeAorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXJvcgllZHgsMTQKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllYngsRFdPUkQgWzgwK2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbMTIrZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFsxNitlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMTkyNTA3ODM4OCtlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVzaSxlZHgKKwltb3YJZWN4LERXT1JEIFtlc3BdCisJcm9yCWVkeCwxNAorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CWVieCxEV09SRCBbODQrZXNwXQorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzI4K2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFs4K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMTIrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzIxNjIwNzgyMDYrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllY3gsZWR4CisJbW92CWVzaSxEV09SRCBbMjgrZXNwXQorCXJvcgllZHgsMTQKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWJ4LERXT1JEIFs4OCtlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzQrZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFs4K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFsyNjE0ODg4MTAzK2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZXNpLGVkeAorCW1vdgllY3gsRFdPUkQgWzI0K2VzcF0KKwlyb3IJZWR4LDE0CisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CWVieCxEV09SRCBbOTIrZXNwXQorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzIwK2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFtlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbNCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMzI0ODIyMjU4MCtlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzM2K2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllc2ksRFdPUkQgWzg4K2VzcF0KKwltb3YJZWJ4LGVjeAorCXJvcgllY3gsMTEKKwltb3YJZWRpLGVzaQorCXJvcgllc2ksMgorCXhvcgllY3gsZWJ4CisJc2hyCWVieCwzCisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVjeAorCXJvcgllc2ksMTcKKwlhZGQJZWJ4LERXT1JEIFszMitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzY4K2VzcF0KKwltb3YJZWN4LGVkeAorCXhvcgllZGksZXNpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdglEV09SRCBbMzIrZXNwXSxlYngKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsxNitlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbMjgrZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFszODM1MzkwNDAxK2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbNDArZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVjeCxEV09SRCBbOTIrZXNwXQorCW1vdgllYngsZXNpCisJcm9yCWVzaSwxMQorCW1vdgllZGksZWN4CisJcm9yCWVjeCwyCisJeG9yCWVzaSxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZXNpLDcKKwl4b3IJZWN4LGVkaQorCXhvcgllYngsZXNpCisJcm9yCWVjeCwxNworCWFkZAllYngsRFdPUkQgWzM2K2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNzIrZXNwXQorCW1vdgllc2ksZWR4CisJeG9yCWVkaSxlY3gKKwltb3YJZWN4LERXT1JEIFsxNitlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXhvcgllZHgsZXNpCisJbW92CURXT1JEIFszNitlc3BdLGVieAorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzEyK2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFsyNCtlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFs0MDIyMjI0Nzc0K2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJbW92CWVjeCxEV09SRCBbNDQrZXNwXQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFszMitlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbNDArZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs3Nitlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzEyK2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJRFdPUkQgWzQwK2VzcF0sZWJ4CisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbMjArZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFsyNCtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMjY0MzQ3MDc4K2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbNDgrZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFszNitlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbNDQrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs4MCtlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgWzgrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNDQrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFs0K2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFsxNitlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFs2MDQ4MDc2MjgrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs1Mitlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs0MCtlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbNDgrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs4NCtlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsxMitlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFs3NzAyNTU5ODMrZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs1Nitlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyOCtlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFs0NCtlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbNTIrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs4OCtlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgW2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNTIrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsyOCtlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbOCtlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFsxMjQ5MTUwMTIyK2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJbW92CWVjeCxEV09SRCBbNjArZXNwXQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMjQrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbNDgrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzU2K2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbOTIrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsyOCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs1Nitlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFs0K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMTU1NTA4MTY5MitlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzY0K2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzUyK2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs2MCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzMyK2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbMjQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNjArZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsyMCtlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzQrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzE5OTYwNjQ5ODYrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs2OCtlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxNitlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs1Nitlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbNjQrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFszNitlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJRFdPUkQgWzY0K2VzcF0sZWJ4CisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTYrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMjU1NDIyMDg4MitlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzcyK2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzYwK2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs2OCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzQwK2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbMTYrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNjgrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsxMitlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbMjQrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsyOCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMjgyMTgzNDM0OStlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzc2K2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzgrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbNjQrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzcyK2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNDQrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs3Mitlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbMjQrZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzI5NTI5OTY4MDgrZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs4MCtlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzY4K2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs3Nitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzQ4K2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbOCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CURXT1JEIFs3Nitlc3BdLGVieAorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzQrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMjArZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzMyMTAzMTM2NzErZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs4NCtlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs3Mitlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbODArZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs1Mitlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs4MCtlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsxMitlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFszMzM2NTcxODkxK2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbODgrZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVjeCxEV09SRCBbNzYrZXNwXQorCW1vdgllYngsZXNpCisJcm9yCWVzaSwxMQorCW1vdgllZGksZWN4CisJcm9yCWVjeCwyCisJeG9yCWVzaSxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZXNpLDcKKwl4b3IJZWN4LGVkaQorCXhvcgllYngsZXNpCisJcm9yCWVjeCwxNworCWFkZAllYngsRFdPUkQgWzg0K2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNTYrZXNwXQorCW1vdgllc2ksZWR4CisJeG9yCWVkaSxlY3gKKwltb3YJZWN4LERXT1JEIFtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVkeCxlc2kKKwltb3YJRFdPUkQgWzg0K2VzcF0sZWJ4CisJeG9yCWVjeCxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZWN4LGVzaQorCW1vdglEV09SRCBbMjgrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzgrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsxMitlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMzU4NDUyODcxMStlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzkyK2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllc2ksRFdPUkQgWzgwK2VzcF0KKwltb3YJZWJ4LGVjeAorCXJvcgllY3gsMTEKKwltb3YJZWRpLGVzaQorCXJvcgllc2ksMgorCXhvcgllY3gsZWJ4CisJc2hyCWVieCwzCisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVjeAorCXJvcgllc2ksMTcKKwlhZGQJZWJ4LERXT1JEIFs4OCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzYwK2VzcF0KKwltb3YJZWN4LGVkeAorCXhvcgllZGksZXNpCisJbW92CWVzaSxEV09SRCBbMjgrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdglEV09SRCBbODgrZXNwXSxlYngKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyNCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbNCtlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsxMitlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzExMzkyNjk5MytlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzMyK2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzg0K2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs5Mitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzY0K2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbMjQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbOTIrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsyMCtlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzQrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzMzODI0MTg5NStlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzM2K2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllc2ksRFdPUkQgWzg4K2VzcF0KKwltb3YJZWJ4LGVjeAorCXJvcgllY3gsMTEKKwltb3YJZWRpLGVzaQorCXJvcgllc2ksMgorCXhvcgllY3gsZWJ4CisJc2hyCWVieCwzCisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVjeAorCXJvcgllc2ksMTcKKwlhZGQJZWJ4LERXT1JEIFszMitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzY4K2VzcF0KKwltb3YJZWN4LGVkeAorCXhvcgllZGksZXNpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdglEV09SRCBbMzIrZXNwXSxlYngKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsxNitlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbMjgrZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFs2NjYzMDcyMDUrZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs0MCtlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFs5Mitlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbMzYrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs3Mitlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgWzE2K2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVkeCxlc2kKKwltb3YJRFdPUkQgWzM2K2VzcF0sZWJ4CisJeG9yCWVjeCxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZWN4LGVzaQorCW1vdglEV09SRCBbMTIrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMjgrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzc3MzUyOTkxMitlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzQ0K2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzgrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbMzIrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzQwK2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNzYrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs0MCtlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbMjQrZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzEyOTQ3NTczNzIrZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs0OCtlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzM2K2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs0NCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzgwK2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbOCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CURXT1JEIFs0NCtlc3BdLGVieAorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzQrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMjArZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzEzOTYxODIyOTErZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs1Mitlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs0MCtlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbNDgrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs4NCtlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsxMitlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFsxNjk1MTgzNzAwK2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbNTYrZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVjeCxEV09SRCBbNDQrZXNwXQorCW1vdgllYngsZXNpCisJcm9yCWVzaSwxMQorCW1vdgllZGksZWN4CisJcm9yCWVjeCwyCisJeG9yCWVzaSxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZXNpLDcKKwl4b3IJZWN4LGVkaQorCXhvcgllYngsZXNpCisJcm9yCWVjeCwxNworCWFkZAllYngsRFdPUkQgWzUyK2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbODgrZXNwXQorCW1vdgllc2ksZWR4CisJeG9yCWVkaSxlY3gKKwltb3YJZWN4LERXT1JEIFtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVkeCxlc2kKKwltb3YJRFdPUkQgWzUyK2VzcF0sZWJ4CisJeG9yCWVjeCxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZWN4LGVzaQorCW1vdglEV09SRCBbMjgrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzgrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsxMitlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMTk4NjY2MTA1MStlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzYwK2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllc2ksRFdPUkQgWzQ4K2VzcF0KKwltb3YJZWJ4LGVjeAorCXJvcgllY3gsMTEKKwltb3YJZWRpLGVzaQorCXJvcgllc2ksMgorCXhvcgllY3gsZWJ4CisJc2hyCWVieCwzCisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVjeAorCXJvcgllc2ksMTcKKwlhZGQJZWJ4LERXT1JEIFs1Nitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzkyK2VzcF0KKwltb3YJZWN4LGVkeAorCXhvcgllZGksZXNpCisJbW92CWVzaSxEV09SRCBbMjgrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdglEV09SRCBbNTYrZXNwXSxlYngKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyNCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbNCtlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsxMitlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzIxNzcwMjYzNTArZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs2NCtlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFs1Mitlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbNjArZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFszMitlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgWzI0K2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJeG9yCWVkeCxlc2kKKwltb3YJRFdPUkQgWzYwK2VzcF0sZWJ4CisJeG9yCWVjeCxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZWN4LGVzaQorCW1vdglEV09SRCBbMjArZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgW2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFs0K2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFsyNDU2OTU2MDM3K2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJbW92CWVjeCxEV09SRCBbNjgrZXNwXQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbNTYrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzY0K2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbMzYrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs2NCtlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsyOCtlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzI3MzA0ODU5MjErZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs3Mitlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFs2MCtlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbNjgrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs0MCtlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgWzE2K2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVkeCxlc2kKKwltb3YJRFdPUkQgWzY4K2VzcF0sZWJ4CisJeG9yCWVjeCxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZWN4LGVzaQorCW1vdglEV09SRCBbMTIrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMjgrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzI4MjAzMDI0MTErZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs3Nitlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllc2ksRFdPUkQgWzY0K2VzcF0KKwltb3YJZWJ4LGVjeAorCXJvcgllY3gsMTEKKwltb3YJZWRpLGVzaQorCXJvcgllc2ksMgorCXhvcgllY3gsZWJ4CisJc2hyCWVieCwzCisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVjeAorCXJvcgllc2ksMTcKKwlhZGQJZWJ4LERXT1JEIFs3Mitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzQ0K2VzcF0KKwltb3YJZWN4LGVkeAorCXhvcgllZGksZXNpCisJbW92CWVzaSxEV09SRCBbMTIrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdglEV09SRCBbNzIrZXNwXSxlYngKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFs4K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsyMCtlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFszMjU5NzMwODAwK2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbODArZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFs2OCtlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbNzYrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs0OCtlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgWzgrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNzYrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFs0K2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFsxNitlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFszMzQ1NzY0NzcxK2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJbW92CWVjeCxEV09SRCBbODQrZXNwXQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbNzIrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzgwK2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNTIrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFs0K2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdglEV09SRCBbODArZXNwXSxlYngKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbMTIrZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFsxNitlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMzUxNjA2NTgxNytlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzg4K2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzc2K2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs4NCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzU2K2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CURXT1JEIFs4NCtlc3BdLGVieAorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzI4K2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFs4K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMTIrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzM2MDAzNTI4MDQrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs5Mitlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs4MCtlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbODgrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs2MCtlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzI4K2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJRFdPUkQgWzg4K2VzcF0sZWJ4CisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzQrZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFs4K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFs0MDk0NTcxOTA5K2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbMzIrZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVjeCxEV09SRCBbODQrZXNwXQorCW1vdgllYngsZXNpCisJcm9yCWVzaSwxMQorCW1vdgllZGksZWN4CisJcm9yCWVjeCwyCisJeG9yCWVzaSxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZXNpLDcKKwl4b3IJZWN4LGVkaQorCXhvcgllYngsZXNpCisJcm9yCWVjeCwxNworCWFkZAllYngsRFdPUkQgWzkyK2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNjQrZXNwXQorCW1vdgllc2ksZWR4CisJeG9yCWVkaSxlY3gKKwltb3YJZWN4LERXT1JEIFsyNCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CURXT1JEIFs5Mitlc3BdLGVieAorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzIwK2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFtlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbNCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMjc1NDIzMzQ0K2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJbW92CWVjeCxEV09SRCBbMzYrZXNwXQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbODgrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzMyK2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNjgrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFszMitlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsyOCtlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzQzMDIyNzczNCtlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzQwK2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzkyK2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFszNitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzcyK2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbMTYrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbMzYrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsxMitlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbMjQrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsyOCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbNTA2OTQ4NjE2K2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJbW92CWVjeCxEV09SRCBbNDQrZXNwXQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFszMitlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbNDArZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs3Nitlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzEyK2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJRFdPUkQgWzQwK2VzcF0sZWJ4CisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJYWRkCWVieCxEV09SRCBbMjArZXNwXQorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWJ4LGVkaQorCXJvcgllY3gsOQorCW1vdgllc2ksZWF4CisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFsyNCtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbNjU5MDYwNTU2K2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbNDgrZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFszNitlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbNDQrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs4MCtlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgWzgrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNDQrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFs0K2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFsxNitlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFs4ODM5OTc4NzcrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs1Mitlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs0MCtlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbNDgrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs4NCtlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsxMitlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFs5NTgxMzk1NzErZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs1Nitlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyOCtlc3BdCisJYWRkCWVicCxlY3gKKwltb3YJZWN4LERXT1JEIFs0NCtlc3BdCisJbW92CWVieCxlc2kKKwlyb3IJZXNpLDExCisJbW92CWVkaSxlY3gKKwlyb3IJZWN4LDIKKwl4b3IJZXNpLGVieAorCXNocgllYngsMworCXJvcgllc2ksNworCXhvcgllY3gsZWRpCisJeG9yCWVieCxlc2kKKwlyb3IJZWN4LDE3CisJYWRkCWVieCxEV09SRCBbNTIrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs4OCtlc3BdCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVjeAorCW1vdgllY3gsRFdPUkQgW2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNTIrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsyOCtlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbOCtlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJwCisJeG9yCWVicCxlZGkKKwlyb3IJZXNpLDExCisJYW5kCWVheCxlYnAKKwlsZWEJZWR4LFsxMzIyODIyMjE4K2VkeCoxK2VieF0KKwl4b3IJZXNpLGVjeAorCXhvcgllYXgsZWRpCisJbW92CWVjeCxEV09SRCBbNjArZXNwXQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMjQrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbNDgrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzU2K2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbOTIrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsyOCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs1Nitlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFs0K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMTUzNzAwMjA2MytlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzY0K2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzUyK2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs2MCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzMyK2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbMjQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNjArZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsyMCtlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJRFdPUkQgWzQrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzE3NDc4NzM3NzkrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs2OCtlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxNitlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs1Nitlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbNjQrZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFszNitlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwlyb3IJZWR4LDE0CisJYWRkCWVieCxlZGkKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJRFdPUkQgWzY0K2VzcF0sZWJ4CisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTYrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllY3gsZWF4CisJbW92CURXT1JEIFtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMTk1NTU2MjIyMitlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzcyK2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzYwK2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs2OCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzQwK2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbMTYrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWR4LGVzaQorCW1vdglEV09SRCBbNjgrZXNwXSxlYngKKwl4b3IJZWN4LGVkaQorCXJvcgllZHgsNQorCWFuZAllY3gsZXNpCisJbW92CURXT1JEIFsxMitlc3BdLGVzaQorCXhvcgllZHgsZXNpCisJYWRkCWVieCxEV09SRCBbMjQrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsyOCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMjAyNDEwNDgxNStlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzc2K2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzgrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbNjQrZXNwXQorCW1vdgllYngsZWN4CisJcm9yCWVjeCwxMQorCW1vdgllZGksZXNpCisJcm9yCWVzaSwyCisJeG9yCWVjeCxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZWN4LDcKKwl4b3IJZXNpLGVkaQorCXhvcgllYngsZWN4CisJcm9yCWVzaSwxNworCWFkZAllYngsRFdPUkQgWzcyK2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNDQrZXNwXQorCW1vdgllY3gsZWR4CisJeG9yCWVkaSxlc2kKKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs3Mitlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCWFkZAllYngsRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbMjQrZXNwXSxlYXgKKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMTEKKwlhbmQJZWJwLGVheAorCWxlYQllZHgsWzIyMjc3MzA0NTIrZWR4KjErZWJ4XQorCXhvcgllY3gsZXNpCisJeG9yCWVicCxlZGkKKwltb3YJZXNpLERXT1JEIFs4MCtlc3BdCisJcm9yCWVjeCwyCisJYWRkCWVicCxlZHgKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzY4K2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs3Nitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzQ4K2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbOCtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllZHgsZXNpCisJbW92CURXT1JEIFs3Nitlc3BdLGVieAorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzQrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWRpLGVjeAorCXJvcgllZHgsNgorCW1vdgllc2ksZWJwCisJYWRkCWVieCxlZGkKKwlyb3IJZXNpLDkKKwltb3YJZWN4LGVicAorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbMjArZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCXJvcgllc2ksMTEKKwlhbmQJZWF4LGVicAorCWxlYQllZHgsWzIzNjE4NTI0MjQrZWR4KjErZWJ4XQorCXhvcgllc2ksZWN4CisJeG9yCWVheCxlZGkKKwltb3YJZWN4LERXT1JEIFs4NCtlc3BdCisJcm9yCWVzaSwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlc2kKKwltb3YJZXNpLERXT1JEIFs3Mitlc3BdCisJbW92CWVieCxlY3gKKwlyb3IJZWN4LDExCisJbW92CWVkaSxlc2kKKwlyb3IJZXNpLDIKKwl4b3IJZWN4LGVieAorCXNocgllYngsMworCXJvcgllY3gsNworCXhvcgllc2ksZWRpCisJeG9yCWVieCxlY3gKKwlyb3IJZXNpLDE3CisJYWRkCWVieCxEV09SRCBbODArZXNwXQorCXNocgllZGksMTAKKwlhZGQJZWJ4LERXT1JEIFs1Mitlc3BdCisJbW92CWVjeCxlZHgKKwl4b3IJZWRpLGVzaQorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CURXT1JEIFs4MCtlc3BdLGVieAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFsxMitlc3BdCisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllYngsZWRpCisJcm9yCWVjeCw5CisJbW92CWVzaSxlYXgKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVjeCxlYXgKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDExCisJYW5kCWVicCxlYXgKKwlsZWEJZWR4LFsyNDI4NDM2NDc0K2VkeCoxK2VieF0KKwl4b3IJZWN4LGVzaQorCXhvcgllYnAsZWRpCisJbW92CWVzaSxEV09SRCBbODgrZXNwXQorCXJvcgllY3gsMgorCWFkZAllYnAsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCWFkZAllYnAsZWN4CisJbW92CWVjeCxEV09SRCBbNzYrZXNwXQorCW1vdgllYngsZXNpCisJcm9yCWVzaSwxMQorCW1vdgllZGksZWN4CisJcm9yCWVjeCwyCisJeG9yCWVzaSxlYngKKwlzaHIJZWJ4LDMKKwlyb3IJZXNpLDcKKwl4b3IJZWN4LGVkaQorCXhvcgllYngsZXNpCisJcm9yCWVjeCwxNworCWFkZAllYngsRFdPUkQgWzg0K2VzcF0KKwlzaHIJZWRpLDEwCisJYWRkCWVieCxEV09SRCBbNTYrZXNwXQorCW1vdgllc2ksZWR4CisJeG9yCWVkaSxlY3gKKwltb3YJZWN4LERXT1JEIFtlc3BdCisJcm9yCWVkeCwxNAorCWFkZAllYngsZWRpCisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVkeCxlc2kKKwltb3YJRFdPUkQgWzg0K2VzcF0sZWJ4CisJeG9yCWVjeCxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZWN4LGVzaQorCW1vdglEV09SRCBbMjgrZXNwXSxlc2kKKwl4b3IJZWR4LGVzaQorCWFkZAllYngsRFdPUkQgWzgrZXNwXQorCXhvcgllZGksZWN4CisJcm9yCWVkeCw2CisJbW92CWVzaSxlYnAKKwlhZGQJZWJ4LGVkaQorCXJvcgllc2ksOQorCW1vdgllY3gsZWJwCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWJwCisJbW92CURXT1JEIFsxMitlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMjc1NjczNDE4NytlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzkyK2VzcF0KKwlyb3IJZXNpLDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVzaQorCW1vdgllc2ksRFdPUkQgWzgwK2VzcF0KKwltb3YJZWJ4LGVjeAorCXJvcgllY3gsMTEKKwltb3YJZWRpLGVzaQorCXJvcgllc2ksMgorCXhvcgllY3gsZWJ4CisJc2hyCWVieCwzCisJcm9yCWVjeCw3CisJeG9yCWVzaSxlZGkKKwl4b3IJZWJ4LGVjeAorCXJvcgllc2ksMTcKKwlhZGQJZWJ4LERXT1JEIFs4OCtlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzYwK2VzcF0KKwltb3YJZWN4LGVkeAorCXhvcgllZGksZXNpCisJbW92CWVzaSxEV09SRCBbMjgrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZWR4LGVjeAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwlhZGQJZWJ4LERXT1JEIFs0K2VzcF0KKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVieCxlZGkKKwlyb3IJZWN4LDkKKwltb3YJZXNpLGVheAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWN4LGVheAorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwxMQorCWFuZAllYnAsZWF4CisJbGVhCWVkeCxbMzIwNDAzMTQ3OStlZHgqMStlYnhdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWJwLGVkaQorCW1vdgllc2ksRFdPUkQgWzMyK2VzcF0KKwlyb3IJZWN4LDIKKwlhZGQJZWJwLGVkeAorCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWJwLGVjeAorCW1vdgllY3gsRFdPUkQgWzg0K2VzcF0KKwltb3YJZWJ4LGVzaQorCXJvcgllc2ksMTEKKwltb3YJZWRpLGVjeAorCXJvcgllY3gsMgorCXhvcgllc2ksZWJ4CisJc2hyCWVieCwzCisJcm9yCWVzaSw3CisJeG9yCWVjeCxlZGkKKwl4b3IJZWJ4LGVzaQorCXJvcgllY3gsMTcKKwlhZGQJZWJ4LERXT1JEIFs5Mitlc3BdCisJc2hyCWVkaSwxMAorCWFkZAllYngsRFdPUkQgWzY0K2VzcF0KKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWN4CisJbW92CWVjeCxEV09SRCBbMjQrZXNwXQorCXJvcgllZHgsMTQKKwlhZGQJZWJ4LGVkaQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVzaQorCXhvcgllY3gsZWRpCisJcm9yCWVkeCw1CisJYW5kCWVjeCxlc2kKKwltb3YJRFdPUkQgWzIwK2VzcF0sZXNpCisJeG9yCWVkeCxlc2kKKwlhZGQJZWJ4LERXT1JEIFtlc3BdCisJeG9yCWVkaSxlY3gKKwlyb3IJZWR4LDYKKwltb3YJZXNpLGVicAorCWFkZAllYngsZWRpCisJcm9yCWVzaSw5CisJbW92CWVjeCxlYnAKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwl4b3IJZXNpLGVicAorCW1vdglEV09SRCBbNCtlc3BdLGVicAorCXhvcgllYnAsZWRpCisJcm9yCWVzaSwxMQorCWFuZAllYXgsZWJwCisJbGVhCWVkeCxbMzMyOTMyNTI5OCtlZHgqMStlYnhdCisJeG9yCWVzaSxlY3gKKwl4b3IJZWF4LGVkaQorCXJvcgllc2ksMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsZXNpCisJbW92CWVzaSxEV09SRCBbOTYrZXNwXQorCXhvcgllYnAsZWRpCisJbW92CWVjeCxEV09SRCBbMTIrZXNwXQorCWFkZAllYXgsRFdPUkQgW2VzaV0KKwlhZGQJZWJwLERXT1JEIFs0K2VzaV0KKwlhZGQJZWRpLERXT1JEIFs4K2VzaV0KKwlhZGQJZWN4LERXT1JEIFsxMitlc2ldCisJbW92CURXT1JEIFtlc2ldLGVheAorCW1vdglEV09SRCBbNCtlc2ldLGVicAorCW1vdglEV09SRCBbOCtlc2ldLGVkaQorCW1vdglEV09SRCBbMTIrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzQrZXNwXSxlYnAKKwl4b3IJZWJwLGVkaQorCW1vdglEV09SRCBbOCtlc3BdLGVkaQorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJbW92CWVieCxEV09SRCBbMjQrZXNwXQorCW1vdgllY3gsRFdPUkQgWzI4K2VzcF0KKwlhZGQJZWR4LERXT1JEIFsxNitlc2ldCisJYWRkCWVkaSxEV09SRCBbMjArZXNpXQorCWFkZAllYngsRFdPUkQgWzI0K2VzaV0KKwlhZGQJZWN4LERXT1JEIFsyOCtlc2ldCisJbW92CURXT1JEIFsxNitlc2ldLGVkeAorCW1vdglEV09SRCBbMjArZXNpXSxlZGkKKwltb3YJRFdPUkQgWzI0K2VzaV0sZWJ4CisJbW92CURXT1JEIFsyOCtlc2ldLGVjeAorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwltb3YJZWRpLERXT1JEIFsxMDArZXNwXQorCW1vdglEV09SRCBbMjQrZXNwXSxlYngKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWN4CisJY21wCWVkaSxEV09SRCBbMTA0K2VzcF0KKwlqYglORUFSIEwkMDA5Z3JhbmRfbG9vcAorCW1vdgllc3AsRFdPUkQgWzEwOCtlc3BdCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JMzIKK0wkMDA1U1NTRTM6CisJbGVhCWVzcCxbZXNwLTk2XQorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWRpLERXT1JEIFsxMitlc2ldCisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVieCxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWRpCisJbW92CWVkeCxEV09SRCBbMTYrZXNpXQorCW1vdgllZGksRFdPUkQgWzIwK2VzaV0KKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CWVzaSxEV09SRCBbMjgrZXNpXQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwltb3YJZWRpLERXT1JEIFsxMDArZXNwXQorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzcF0sZXNpCisJbW92ZHFhCXhtbTcsWzI1NitlYnBdCisJam1wCU5FQVIgTCQwMTBncmFuZF9zc3NlMworYWxpZ24JMTYKK0wkMDEwZ3JhbmRfc3NzZTM6CisJbW92ZHF1CXhtbTAsW2VkaV0KKwltb3ZkcXUJeG1tMSxbMTYrZWRpXQorCW1vdmRxdQl4bW0yLFszMitlZGldCisJbW92ZHF1CXhtbTMsWzQ4K2VkaV0KKwlhZGQJZWRpLDY0CitkYgkxMDIsMTUsNTYsMCwxOTkKKwltb3YJRFdPUkQgWzEwMCtlc3BdLGVkaQorZGIJMTAyLDE1LDU2LDAsMjA3CisJbW92ZHFhCXhtbTQsW2VicF0KK2RiCTEwMiwxNSw1NiwwLDIxNQorCW1vdmRxYQl4bW01LFsxNitlYnBdCisJcGFkZGQJeG1tNCx4bW0wCitkYgkxMDIsMTUsNTYsMCwyMjMKKwltb3ZkcWEJeG1tNixbMzIrZWJwXQorCXBhZGRkCXhtbTUseG1tMQorCW1vdmRxYQl4bW03LFs0OCtlYnBdCisJbW92ZHFhCVszMitlc3BdLHhtbTQKKwlwYWRkZAl4bW02LHhtbTIKKwltb3ZkcWEJWzQ4K2VzcF0seG1tNQorCXBhZGRkCXhtbTcseG1tMworCW1vdmRxYQlbNjQrZXNwXSx4bW02CisJbW92ZHFhCVs4MCtlc3BdLHhtbTcKKwlqbXAJTkVBUiBMJDAxMXNzc2UzXzAwXzQ3CithbGlnbgkxNgorTCQwMTFzc3NlM18wMF80NzoKKwlhZGQJZWJwLDY0CisJbW92CWVjeCxlZHgKKwltb3ZkcWEJeG1tNCx4bW0xCisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwltb3ZkcWEJeG1tNyx4bW0zCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCitkYgkxMDIsMTUsNTgsMTUsMjI0LDQKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CitkYgkxMDIsMTUsNTgsMTUsMjUwLDQKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCW1vdmRxYQl4bW01LHhtbTQKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCW1vdmRxYQl4bW02LHhtbTQKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXBzcmxkCXhtbTQsMworCW1vdgllc2ksZWF4CisJcm9yCWVjeCw5CisJcGFkZGQJeG1tMCx4bW03CisJbW92CURXT1JEIFtlc3BdLGVheAorCXhvcgllY3gsZWF4CisJcHNybGQJeG1tNiw3CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyOCtlc3BdCisJcm9yCWVjeCwxMQorCWFuZAllYngsZWF4CisJcHNodWZkCXhtbTcseG1tMywyNTAKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzMyK2VzcF0KKwlwc2xsZAl4bW01LDE0CisJeG9yCWVieCxlZGkKKwlyb3IJZWN4LDIKKwlweG9yCXhtbTQseG1tNgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCXBzcmxkCXhtbTYsMTEKKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCXB4b3IJeG1tNCx4bW01CisJbW92CWVzaSxEV09SRCBbMTYrZXNwXQorCXhvcgllZHgsZWN4CisJcHNsbGQJeG1tNSwxMQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCXB4b3IJeG1tNCx4bW02CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWN4CisJbW92ZHFhCXhtbTYseG1tNworCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwlweG9yCXhtbTQseG1tNQorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwlwc3JsZAl4bW03LDEwCisJbW92CWVkaSxEV09SRCBbZXNwXQorCW1vdgllc2ksZWJ4CisJcm9yCWVjeCw5CisJcGFkZGQJeG1tMCx4bW00CisJbW92CURXT1JEIFsyOCtlc3BdLGVieAorCXhvcgllY3gsZWJ4CisJcHNybHEJeG1tNiwxNworCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbMjQrZXNwXQorCXJvcgllY3gsMTEKKwlweG9yCXhtbTcseG1tNgorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlwc3JscQl4bW02LDIKKwlhZGQJZWR4LERXT1JEIFszNitlc3BdCisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDIKKwlweG9yCXhtbTcseG1tNgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJcHNodWZkCXhtbTcseG1tNywxMjgKKwlhZGQJZWF4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJcHNybGRxCXhtbTcsOAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlwYWRkZAl4bW0wLHhtbTcKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCW1vdgllc2ksZWF4CisJcm9yCWVjeCw5CisJbW92CURXT1JEIFsyNCtlc3BdLGVheAorCXBzaHVmZAl4bW03LHhtbTAsODAKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCW1vdmRxYQl4bW02LHhtbTcKKwlyb3IJZWN4LDExCisJcHNybGQJeG1tNywxMAorCWFuZAllYngsZWF4CisJcHNybHEJeG1tNiwxNworCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNDArZXNwXQorCXhvcgllYngsZWRpCisJcm9yCWVjeCwyCisJcHhvcgl4bW03LHhtbTYKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzQrZXNwXQorCXBzcmxxCXhtbTYsMgorCWFkZAllYngsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJcHhvcgl4bW03LHhtbTYKKwltb3YJZXNpLERXT1JEIFs4K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwlwc2h1ZmQJeG1tNyx4bW03LDgKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCW1vdmRxYQl4bW02LFtlYnBdCisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzQrZXNwXSxlY3gKKwlwc2xsZHEJeG1tNyw4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVzaSxlYngKKwlyb3IJZWN4LDkKKwlwYWRkZAl4bW0wLHhtbTcKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlwYWRkZAl4bW02LHhtbTAKKwlyb3IJZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzQ0K2VzcF0KKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbZXNwXQorCWFkZAllYXgsZWN4CisJbW92ZHFhCVszMitlc3BdLHhtbTYKKwltb3YJZWN4LGVkeAorCW1vdmRxYQl4bW00LHhtbTIKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbNCtlc3BdCisJbW92ZHFhCXhtbTcseG1tMAorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbOCtlc3BdCitkYgkxMDIsMTUsNTgsMTUsMjI1LDQKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CitkYgkxMDIsMTUsNTgsMTUsMjUxLDQKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCW1vdmRxYQl4bW01LHhtbTQKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCW1vdmRxYQl4bW02LHhtbTQKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwlwc3JsZAl4bW00LDMKKwltb3YJZXNpLGVheAorCXJvcgllY3gsOQorCXBhZGRkCXhtbTEseG1tNworCW1vdglEV09SRCBbMTYrZXNwXSxlYXgKKwl4b3IJZWN4LGVheAorCXBzcmxkCXhtbTYsNworCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCXJvcgllY3gsMTEKKwlhbmQJZWJ4LGVheAorCXBzaHVmZAl4bW03LHhtbTAsMjUwCisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs0OCtlc3BdCisJcHNsbGQJeG1tNSwxNAorCXhvcgllYngsZWRpCisJcm9yCWVjeCwyCisJcHhvcgl4bW00LHhtbTYKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlwc3JsZAl4bW02LDExCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwlweG9yCXhtbTQseG1tNQorCW1vdgllc2ksRFdPUkQgW2VzcF0KKwl4b3IJZWR4LGVjeAorCXBzbGxkCXhtbTUsMTEKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCXB4b3IJeG1tNCx4bW02CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWN4CisJbW92ZHFhCXhtbTYseG1tNworCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwlweG9yCXhtbTQseG1tNQorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwlwc3JsZAl4bW03LDEwCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCW1vdgllc2ksZWJ4CisJcm9yCWVjeCw5CisJcGFkZGQJeG1tMSx4bW00CisJbW92CURXT1JEIFsxMitlc3BdLGVieAorCXhvcgllY3gsZWJ4CisJcHNybHEJeG1tNiwxNworCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJcm9yCWVjeCwxMQorCXB4b3IJeG1tNyx4bW02CisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCXBzcmxxCXhtbTYsMgorCWFkZAllZHgsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMgorCXB4b3IJeG1tNyx4bW02CisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJcHNodWZkCXhtbTcseG1tNywxMjgKKwlhZGQJZWF4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJcHNybGRxCXhtbTcsOAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcGFkZGQJeG1tMSx4bW03CisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwltb3YJZXNpLGVheAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXBzaHVmZAl4bW03LHhtbTEsODAKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJbW92ZHFhCXhtbTYseG1tNworCXJvcgllY3gsMTEKKwlwc3JsZAl4bW03LDEwCisJYW5kCWVieCxlYXgKKwlwc3JscQl4bW02LDE3CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs1Nitlc3BdCisJeG9yCWVieCxlZGkKKwlyb3IJZWN4LDIKKwlweG9yCXhtbTcseG1tNgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCXBzcmxxCXhtbTYsMgorCWFkZAllYngsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJcHhvcgl4bW03LHhtbTYKKwltb3YJZXNpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJcHNodWZkCXhtbTcseG1tNyw4CisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwltb3ZkcWEJeG1tNixbMTYrZWJwXQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyMCtlc3BdLGVjeAorCXBzbGxkcQl4bW03LDgKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCW1vdgllc2ksZWJ4CisJcm9yCWVjeCw5CisJcGFkZGQJeG1tMSx4bW03CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgW2VzcF0KKwlwYWRkZAl4bW02LHhtbTEKKwlyb3IJZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzYwK2VzcF0KKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsZWN4CisJbW92ZHFhCVs0OCtlc3BdLHhtbTYKKwltb3YJZWN4LGVkeAorCW1vdmRxYQl4bW00LHhtbTMKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCW1vdmRxYQl4bW03LHhtbTEKKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KK2RiCTEwMiwxNSw1OCwxNSwyMjYsNAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKK2RiCTEwMiwxNSw1OCwxNSwyNDgsNAorCW1vdglEV09SRCBbMTYrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJbW92ZHFhCXhtbTUseG1tNAorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJbW92ZHFhCXhtbTYseG1tNAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJcHNybGQJeG1tNCwzCisJbW92CWVzaSxlYXgKKwlyb3IJZWN4LDkKKwlwYWRkZAl4bW0yLHhtbTcKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJeG9yCWVjeCxlYXgKKwlwc3JsZAl4bW02LDcKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlyb3IJZWN4LDExCisJYW5kCWVieCxlYXgKKwlwc2h1ZmQJeG1tNyx4bW0xLDI1MAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNjQrZXNwXQorCXBzbGxkCXhtbTUsMTQKKwl4b3IJZWJ4LGVkaQorCXJvcgllY3gsMgorCXB4b3IJeG1tNCx4bW02CisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJcHNybGQJeG1tNiwxMQorCWFkZAllYngsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJcHhvcgl4bW00LHhtbTUKKwltb3YJZXNpLERXT1JEIFsxNitlc3BdCisJeG9yCWVkeCxlY3gKKwlwc2xsZAl4bW01LDExCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJcHhvcgl4bW00LHhtbTYKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwltb3ZkcWEJeG1tNix4bW03CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCXB4b3IJeG1tNCx4bW01CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCXBzcmxkCXhtbTcsMTAKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJbW92CWVzaSxlYngKKwlyb3IJZWN4LDkKKwlwYWRkZAl4bW0yLHhtbTQKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwlwc3JscQl4bW02LDE3CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJcm9yCWVjeCwxMQorCXB4b3IJeG1tNyx4bW02CisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCXBzcmxxCXhtbTYsMgorCWFkZAllZHgsRFdPUkQgWzY4K2VzcF0KKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMgorCXB4b3IJeG1tNyx4bW02CisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlwc2h1ZmQJeG1tNyx4bW03LDEyOAorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMTIrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwlwc3JsZHEJeG1tNyw4CisJbW92CURXT1JEIFs4K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXBhZGRkCXhtbTIseG1tNworCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJbW92CWVzaSxlYXgKKwlyb3IJZWN4LDkKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWF4CisJcHNodWZkCXhtbTcseG1tMiw4MAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJbW92ZHFhCXhtbTYseG1tNworCXJvcgllY3gsMTEKKwlwc3JsZAl4bW03LDEwCisJYW5kCWVieCxlYXgKKwlwc3JscQl4bW02LDE3CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs3Mitlc3BdCisJeG9yCWVieCxlZGkKKwlyb3IJZWN4LDIKKwlweG9yCXhtbTcseG1tNgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJcHNybHEJeG1tNiwyCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwlweG9yCXhtbTcseG1tNgorCW1vdgllc2ksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXBzaHVmZAl4bW03LHhtbTcsOAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJbW92ZHFhCXhtbTYsWzMyK2VicF0KKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbNCtlc3BdLGVjeAorCXBzbGxkcQl4bW03LDgKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwltb3YJZXNpLGVieAorCXJvcgllY3gsOQorCXBhZGRkCXhtbTIseG1tNworCW1vdglEV09SRCBbMjArZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCXBhZGRkCXhtbTYseG1tMgorCXJvcgllY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNzYrZXNwXQorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlY3gKKwltb3ZkcWEJWzY0K2VzcF0seG1tNgorCW1vdgllY3gsZWR4CisJbW92ZHFhCXhtbTQseG1tMAorCXJvcgllZHgsMTQKKwltb3YJZXNpLERXT1JEIFs0K2VzcF0KKwltb3ZkcWEJeG1tNyx4bW0yCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KK2RiCTEwMiwxNSw1OCwxNSwyMjcsNAorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKK2RiCTEwMiwxNSw1OCwxNSwyNDksNAorCW1vdglEV09SRCBbZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJbW92ZHFhCXhtbTUseG1tNAorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJbW92ZHFhCXhtbTYseG1tNAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXBzcmxkCXhtbTQsMworCW1vdgllc2ksZWF4CisJcm9yCWVjeCw5CisJcGFkZGQJeG1tMyx4bW03CisJbW92CURXT1JEIFsxNitlc3BdLGVheAorCXhvcgllY3gsZWF4CisJcHNybGQJeG1tNiw3CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJcm9yCWVjeCwxMQorCWFuZAllYngsZWF4CisJcHNodWZkCXhtbTcseG1tMiwyNTAKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzgwK2VzcF0KKwlwc2xsZAl4bW01LDE0CisJeG9yCWVieCxlZGkKKwlyb3IJZWN4LDIKKwlweG9yCXhtbTQseG1tNgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCXBzcmxkCXhtbTYsMTEKKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCXB4b3IJeG1tNCx4bW01CisJbW92CWVzaSxEV09SRCBbZXNwXQorCXhvcgllZHgsZWN4CisJcHNsbGQJeG1tNSwxMQorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJcHhvcgl4bW00LHhtbTYKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjgrZXNwXSxlY3gKKwltb3ZkcWEJeG1tNix4bW03CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCXB4b3IJeG1tNCx4bW01CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCXBzcmxkCXhtbTcsMTAKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJbW92CWVzaSxlYngKKwlyb3IJZWN4LDkKKwlwYWRkZAl4bW0zLHhtbTQKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwlwc3JscQl4bW02LDE3CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlyb3IJZWN4LDExCisJcHhvcgl4bW03LHhtbTYKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJcHNybHEJeG1tNiwyCisJYWRkCWVkeCxEV09SRCBbODQrZXNwXQorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwyCisJcHhvcgl4bW03LHhtbTYKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlwc2h1ZmQJeG1tNyx4bW03LDEyOAorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMjgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwlwc3JsZHEJeG1tNyw4CisJbW92CURXT1JEIFsyNCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlwYWRkZAl4bW0zLHhtbTcKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCW1vdgllc2ksZWF4CisJcm9yCWVjeCw5CisJbW92CURXT1JEIFs4K2VzcF0sZWF4CisJcHNodWZkCXhtbTcseG1tMyw4MAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwltb3ZkcWEJeG1tNix4bW03CisJcm9yCWVjeCwxMQorCXBzcmxkCXhtbTcsMTAKKwlhbmQJZWJ4LGVheAorCXBzcmxxCXhtbTYsMTcKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzg4K2VzcF0KKwl4b3IJZWJ4LGVkaQorCXJvcgllY3gsMgorCXB4b3IJeG1tNyx4bW02CisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJcHNybHEJeG1tNiwyCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwlweG9yCXhtbTcseG1tNgorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwlwc2h1ZmQJeG1tNyx4bW03LDgKKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCW1vdmRxYQl4bW02LFs0OCtlYnBdCisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWN4CisJcHNsbGRxCXhtbTcsOAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVieAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbOCtlc3BdCisJbW92CWVzaSxlYngKKwlyb3IJZWN4LDkKKwlwYWRkZAl4bW0zLHhtbTcKKwltb3YJRFdPUkQgWzQrZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbZXNwXQorCXBhZGRkCXhtbTYseG1tMworCXJvcgllY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbOTIrZXNwXQorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxNitlc3BdCisJYWRkCWVheCxlY3gKKwltb3ZkcWEJWzgwK2VzcF0seG1tNgorCWNtcAlEV09SRCBbNjQrZWJwXSw2NjA1MQorCWpuZQlORUFSIEwkMDExc3NzZTNfMDBfNDcKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTYrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCW1vdgllc2ksZWF4CisJcm9yCWVjeCw5CisJbW92CURXT1JEIFtlc3BdLGVheAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyOCtlc3BdCisJcm9yCWVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFszMitlc3BdCisJeG9yCWVieCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsxMitlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVieAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbZXNwXQorCW1vdgllc2ksZWJ4CisJcm9yCWVjeCw5CisJbW92CURXT1JEIFsyOCtlc3BdLGVieAorCXhvcgllY3gsZWJ4CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJcm9yCWVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFszNitlc3BdCisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzgrZXNwXQorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMTIrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwltb3YJZXNpLGVheAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbMjQrZXNwXSxlYXgKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCXJvcgllY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNDArZXNwXQorCXhvcgllYngsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzQrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwltb3YJZXNpLGVieAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbMjArZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCXJvcgllY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNDQrZXNwXQorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwltb3YJZXNpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgW2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJbW92CWVzaSxlYXgKKwlyb3IJZWN4LDkKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVjeCxlYXgKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlyb3IJZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzQ4K2VzcF0KKwl4b3IJZWJ4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCWFkZAllYngsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjgrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwltb3YJZXNpLGVieAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbMTIrZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJcm9yCWVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs1Mitlc3BdCisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyNCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCW1vdgllc2ksZWF4CisJcm9yCWVjeCw5CisJbW92CURXT1JEIFs4K2VzcF0sZWF4CisJeG9yCWVjeCxlYXgKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzQrZXNwXQorCXJvcgllY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNTYrZXNwXQorCXhvcgllYngsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwltb3YJZXNpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjArZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCW1vdgllc2ksZWJ4CisJcm9yCWVjeCw5CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgW2VzcF0KKwlyb3IJZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzYwK2VzcF0KKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwltb3YJZXNpLGVheAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbZXNwXSxlYXgKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCXJvcgllY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNjQrZXNwXQorCXhvcgllYngsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwltb3YJZXNpLERXT1JEIFsxNitlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgW2VzcF0KKwltb3YJZXNpLGVieAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbMjgrZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbMjQrZXNwXQorCXJvcgllY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNjgrZXNwXQorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlhZGQJZWF4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFs4K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJbW92CWVzaSxlYXgKKwlyb3IJZWN4LDkKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWF4CisJeG9yCWVjeCxlYXgKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwlyb3IJZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzcyK2VzcF0KKwl4b3IJZWJ4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwltb3YJZXNpLERXT1JEIFs4K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFs0K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVzaSxlYngKKwlyb3IJZWN4LDkKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlyb3IJZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzc2K2VzcF0KKwl4b3IJZWF4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbZXNwXQorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwl4b3IJZXNpLGVkaQorCXJvcgllZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlyb3IJZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllc2ksZWF4CisJcm9yCWVjeCw5CisJbW92CURXT1JEIFsxNitlc3BdLGVheAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJcm9yCWVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs4MCtlc3BdCisJeG9yCWVieCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJcm9yCWVkeCwxNAorCW1vdgllc2ksRFdPUkQgW2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJbW92CWVzaSxlYngKKwlyb3IJZWN4LDkKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgWzgrZXNwXQorCXJvcgllY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbODQrZXNwXQorCXhvcgllYXgsZWRpCisJcm9yCWVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJYWRkCWVheCxlY3gKKwltb3YJZWN4LGVkeAorCXJvcgllZHgsMTQKKwltb3YJZXNpLERXT1JEIFsyOCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJeG9yCWVzaSxlZGkKKwlyb3IJZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJcm9yCWVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwltb3YJZXNpLGVheAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlyb3IJZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzg4K2VzcF0KKwl4b3IJZWJ4LGVkaQorCXJvcgllY3gsMgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCWFkZAllYngsZWN4CisJbW92CWVjeCxlZHgKKwlyb3IJZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMjQrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMjgrZXNwXQorCXhvcgllc2ksZWRpCisJcm9yCWVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXJvcgllZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwltb3YJZXNpLGVieAorCXJvcgllY3gsOQorCW1vdglEV09SRCBbNCtlc3BdLGVieAorCXhvcgllY3gsZWJ4CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJcm9yCWVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs5Mitlc3BdCisJeG9yCWVheCxlZGkKKwlyb3IJZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlhZGQJZWF4LGVjeAorCW1vdgllc2ksRFdPUkQgWzk2K2VzcF0KKwl4b3IJZWJ4LGVkaQorCW1vdgllY3gsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWF4LERXT1JEIFtlc2ldCisJYWRkCWVieCxEV09SRCBbNCtlc2ldCisJYWRkCWVkaSxEV09SRCBbOCtlc2ldCisJYWRkCWVjeCxEV09SRCBbMTIrZXNpXQorCW1vdglEV09SRCBbZXNpXSxlYXgKKwltb3YJRFdPUkQgWzQrZXNpXSxlYngKKwltb3YJRFdPUkQgWzgrZXNpXSxlZGkKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWN4CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVieCxlZGkKKwltb3YJRFdPUkQgWzgrZXNwXSxlZGkKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWN4CisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllY3gsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWR4LERXT1JEIFsxNitlc2ldCisJYWRkCWVkaSxEV09SRCBbMjArZXNpXQorCWFkZAllY3gsRFdPUkQgWzI0K2VzaV0KKwltb3YJRFdPUkQgWzE2K2VzaV0sZWR4CisJbW92CURXT1JEIFsyMCtlc2ldLGVkaQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJbW92CURXT1JEIFsyNCtlc2ldLGVjeAorCWFkZAllZGksRFdPUkQgWzI4K2VzaV0KKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJbW92CURXT1JEIFsyOCtlc2ldLGVkaQorCW1vdglEV09SRCBbMjgrZXNwXSxlZGkKKwltb3YJZWRpLERXT1JEIFsxMDArZXNwXQorCW1vdmRxYQl4bW03LFs2NCtlYnBdCisJc3ViCWVicCwxOTIKKwljbXAJZWRpLERXT1JEIFsxMDQrZXNwXQorCWpiCU5FQVIgTCQwMTBncmFuZF9zc3NlMworCW1vdgllc3AsRFdPUkQgWzEwOCtlc3BdCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JMzIKK0wkMDA0QVZYOgorCWxlYQllc3AsW2VzcC05Nl0KKwl2emVyb2FsbAorCW1vdgllYXgsRFdPUkQgW2VzaV0KKwltb3YJZWJ4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LERXT1JEIFs4K2VzaV0KKwltb3YJZWRpLERXT1JEIFsxMitlc2ldCisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVieCxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWRpCisJbW92CWVkeCxEV09SRCBbMTYrZXNpXQorCW1vdgllZGksRFdPUkQgWzIwK2VzaV0KKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CWVzaSxEV09SRCBbMjgrZXNpXQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwltb3YJZWRpLERXT1JEIFsxMDArZXNwXQorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzcF0sZXNpCisJdm1vdmRxYQl4bW03LFsyNTYrZWJwXQorCWptcAlORUFSIEwkMDEyZ3JhbmRfYXZ4CithbGlnbgkzMgorTCQwMTJncmFuZF9hdng6CisJdm1vdmRxdQl4bW0wLFtlZGldCisJdm1vdmRxdQl4bW0xLFsxNitlZGldCisJdm1vdmRxdQl4bW0yLFszMitlZGldCisJdm1vdmRxdQl4bW0zLFs0OCtlZGldCisJYWRkCWVkaSw2NAorCXZwc2h1ZmIJeG1tMCx4bW0wLHhtbTcKKwltb3YJRFdPUkQgWzEwMCtlc3BdLGVkaQorCXZwc2h1ZmIJeG1tMSx4bW0xLHhtbTcKKwl2cHNodWZiCXhtbTIseG1tMix4bW03CisJdnBhZGRkCXhtbTQseG1tMCxbZWJwXQorCXZwc2h1ZmIJeG1tMyx4bW0zLHhtbTcKKwl2cGFkZGQJeG1tNSx4bW0xLFsxNitlYnBdCisJdnBhZGRkCXhtbTYseG1tMixbMzIrZWJwXQorCXZwYWRkZAl4bW03LHhtbTMsWzQ4K2VicF0KKwl2bW92ZHFhCVszMitlc3BdLHhtbTQKKwl2bW92ZHFhCVs0OCtlc3BdLHhtbTUKKwl2bW92ZHFhCVs2NCtlc3BdLHhtbTYKKwl2bW92ZHFhCVs4MCtlc3BdLHhtbTcKKwlqbXAJTkVBUiBMJDAxM2F2eF8wMF80NworYWxpZ24JMTYKK0wkMDEzYXZ4XzAwXzQ3OgorCWFkZAllYnAsNjQKKwl2cGFsaWducgl4bW00LHhtbTEseG1tMCw0CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJdnBhbGlnbnIJeG1tNyx4bW0zLHhtbTIsNAorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCXhvcgllc2ksZWRpCisJdnBzcmxkCXhtbTYseG1tNCw3CisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTYrZXNwXSxlY3gKKwl2cGFkZGQJeG1tMCx4bW0wLHhtbTcKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJc2hyZAllZHgsZWR4LDYKKwl2cHNybGQJeG1tNyx4bW00LDMKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJdnBzbGxkCXhtbTUseG1tNCwxNAorCW1vdgllc2ksZWF4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJdnB4b3IJeG1tNCx4bW03LHhtbTYKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCXZwc2h1ZmQJeG1tNyx4bW0zLDI1MAorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwl2cHNybGQJeG1tNix4bW02LDExCisJYWRkCWVkeCxEV09SRCBbMzIrZXNwXQorCXhvcgllYngsZWRpCisJc2hyZAllY3gsZWN4LDIKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCWFkZAllYngsZWN4CisJdnBzbGxkCXhtbTUseG1tNSwxMQorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMTYrZXNwXQorCXZweG9yCXhtbTQseG1tNCx4bW02CisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVzaSxlZGkKKwl2cHNybGQJeG1tNix4bW03LDEwCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCXZwc3JscQl4bW01LHhtbTcsMTcKKwltb3YJZWN4LGVieAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbZXNwXQorCXZwYWRkZAl4bW0wLHhtbTAseG1tNAorCW1vdgllc2ksZWJ4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWJ4CisJdnB4b3IJeG1tNix4bW02LHhtbTUKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbMjQrZXNwXQorCXZwc3JscQl4bW03LHhtbTcsMTkKKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwlhZGQJZWR4LERXT1JEIFszNitlc3BdCisJeG9yCWVheCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCXZwc2h1ZmQJeG1tNyx4bW02LDEzMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJYWRkCWVheCxlY3gKKwl2cHNybGRxCXhtbTcseG1tNyw4CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJdnBhZGRkCXhtbTAseG1tMCx4bW03CisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVzaSxlZGkKKwl2cHNodWZkCXhtbTcseG1tMCw4MAorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzgrZXNwXSxlY3gKKwl2cHNybGQJeG1tNix4bW03LDEwCisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJdnBzcmxxCXhtbTUseG1tNywxNworCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJdnB4b3IJeG1tNix4bW02LHhtbTUKKwltb3YJZXNpLGVheAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFsyNCtlc3BdLGVheAorCXZwc3JscQl4bW03LHhtbTcsMTkKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCXZweG9yCXhtbTYseG1tNix4bW03CisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCXZwc2h1ZmQJeG1tNyx4bW02LDIzMgorCWFkZAllZHgsRFdPUkQgWzQwK2VzcF0KKwl4b3IJZWJ4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJdnBzbGxkcQl4bW03LHhtbTcsOAorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJYWRkCWVieCxlY3gKKwl2cGFkZGQJeG1tMCx4bW0wLHhtbTcKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzgrZXNwXQorCXZwYWRkZAl4bW02LHhtbTAsW2VicF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzQrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJc2hyZAllZHgsZWR4LDYKKwltb3YJZWN4LGVieAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCW1vdgllc2ksZWJ4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNDQrZXNwXQorCXhvcgllYXgsZWRpCisJc2hyZAllY3gsZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgW2VzcF0KKwlhZGQJZWF4LGVjeAorCXZtb3ZkcWEJWzMyK2VzcF0seG1tNgorCXZwYWxpZ25yCXhtbTQseG1tMix4bW0xLDQKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXZwYWxpZ25yCXhtbTcseG1tMCx4bW0zLDQKKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllc2ksZWRpCisJdnBzcmxkCXhtbTYseG1tNCw3CisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbZXNwXSxlY3gKKwl2cGFkZGQJeG1tMSx4bW0xLHhtbTcKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJc2hyZAllZHgsZWR4LDYKKwl2cHNybGQJeG1tNyx4bW00LDMKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXZwc2xsZAl4bW01LHhtbTQsMTQKKwltb3YJZXNpLGVheAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFsxNitlc3BdLGVheAorCXZweG9yCXhtbTQseG1tNyx4bW02CisJeG9yCWVjeCxlYXgKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwl2cHNodWZkCXhtbTcseG1tMCwyNTAKKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJdnBzcmxkCXhtbTYseG1tNiwxMQorCWFkZAllZHgsRFdPUkQgWzQ4K2VzcF0KKwl4b3IJZWJ4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJdnB4b3IJeG1tNCx4bW00LHhtbTUKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlhZGQJZWJ4LGVjeAorCXZwc2xsZAl4bW01LHhtbTUsMTEKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgW2VzcF0KKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVzaSxlZGkKKwl2cHNybGQJeG1tNix4bW03LDEwCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjgrZXNwXSxlY3gKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCXZwc3JscQl4bW01LHhtbTcsMTcKKwltb3YJZWN4LGVieAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXZwYWRkZAl4bW0xLHhtbTEseG1tNAorCW1vdgllc2ksZWJ4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJ4CisJdnB4b3IJeG1tNix4bW02LHhtbTUKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJdnBzcmxxCXhtbTcseG1tNywxOQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwl2cHhvcgl4bW02LHhtbTYseG1tNworCWFkZAllZHgsRFdPUkQgWzUyK2VzcF0KKwl4b3IJZWF4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJdnBzaHVmZAl4bW03LHhtbTYsMTMyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJYWRkCWVheCxlY3gKKwl2cHNybGRxCXhtbTcseG1tNyw4CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFsyOCtlc3BdCisJdnBhZGRkCXhtbTEseG1tMSx4bW03CisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJeG9yCWVzaSxlZGkKKwl2cHNodWZkCXhtbTcseG1tMSw4MAorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJdnBzcmxkCXhtbTYseG1tNywxMAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCXZwc3JscQl4bW01LHhtbTcsMTcKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXZweG9yCXhtbTYseG1tNix4bW01CisJbW92CWVzaSxlYXgKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbOCtlc3BdLGVheAorCXZwc3JscQl4bW03LHhtbTcsMTkKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJdnBzaHVmZAl4bW03LHhtbTYsMjMyCisJYWRkCWVkeCxEV09SRCBbNTYrZXNwXQorCXhvcgllYngsZWRpCisJc2hyZAllY3gsZWN4LDIKKwl2cHNsbGRxCXhtbTcseG1tNyw4CisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJYWRkCWVieCxlY3gKKwl2cGFkZGQJeG1tMSx4bW0xLHhtbTcKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwl2cGFkZGQJeG1tNix4bW0xLFsxNitlYnBdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyMCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwltb3YJZXNpLGVieAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgW2VzcF0KKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNjArZXNwXQorCXhvcgllYXgsZWRpCisJc2hyZAllY3gsZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlhZGQJZWF4LGVjeAorCXZtb3ZkcWEJWzQ4K2VzcF0seG1tNgorCXZwYWxpZ25yCXhtbTQseG1tMyx4bW0yLDQKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwl2cGFsaWducgl4bW03LHhtbTEseG1tMCw0CisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlZGkKKwl2cHNybGQJeG1tNix4bW00LDcKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsxNitlc3BdLGVjeAorCXZwYWRkZAl4bW0yLHhtbTIseG1tNworCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCXZwc3JsZAl4bW03LHhtbTQsMworCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl2cHNsbGQJeG1tNSx4bW00LDE0CisJbW92CWVzaSxlYXgKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbZXNwXSxlYXgKKwl2cHhvcgl4bW00LHhtbTcseG1tNgorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyOCtlc3BdCisJdnBzaHVmZAl4bW03LHhtbTEsMjUwCisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCXZwc3JsZAl4bW02LHhtbTYsMTEKKwlhZGQJZWR4LERXT1JEIFs2NCtlc3BdCisJeG9yCWVieCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCXZweG9yCXhtbTQseG1tNCx4bW01CisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJYWRkCWVieCxlY3gKKwl2cHNsbGQJeG1tNSx4bW01LDExCisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFsxNitlc3BdCisJdnB4b3IJeG1tNCx4bW00LHhtbTYKKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZXNpLGVkaQorCXZwc3JsZAl4bW02LHhtbTcsMTAKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsxMitlc3BdLGVjeAorCXZweG9yCXhtbTQseG1tNCx4bW01CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJdnBzcmxxCXhtbTUseG1tNywxNworCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFtlc3BdCisJdnBhZGRkCXhtbTIseG1tMix4bW00CisJbW92CWVzaSxlYngKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbMjgrZXNwXSxlYngKKwl2cHhvcgl4bW02LHhtbTYseG1tNQorCXhvcgllY3gsZWJ4CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJdnBzcmxxCXhtbTcseG1tNywxOQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwl2cHhvcgl4bW02LHhtbTYseG1tNworCWFkZAllZHgsRFdPUkQgWzY4K2VzcF0KKwl4b3IJZWF4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJdnBzaHVmZAl4bW03LHhtbTYsMTMyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlhZGQJZWF4LGVjeAorCXZwc3JsZHEJeG1tNyx4bW03LDgKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzEyK2VzcF0KKwl2cGFkZGQJeG1tMix4bW0yLHhtbTcKKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZXNpLGVkaQorCXZwc2h1ZmQJeG1tNyx4bW0yLDgwCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCXZwc3JsZAl4bW02LHhtbTcsMTAKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJc2hyZAllZHgsZWR4LDYKKwl2cHNybHEJeG1tNSx4bW03LDE3CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl2cHhvcgl4bW02LHhtbTYseG1tNQorCW1vdgllc2ksZWF4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWF4CisJdnBzcmxxCXhtbTcseG1tNywxOQorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJdnBzaHVmZAl4bW03LHhtbTYsMjMyCisJYWRkCWVkeCxEV09SRCBbNzIrZXNwXQorCXhvcgllYngsZWRpCisJc2hyZAllY3gsZWN4LDIKKwl2cHNsbGRxCXhtbTcseG1tNyw4CisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWJ4LGVjeAorCXZwYWRkZAl4bW0yLHhtbTIseG1tNworCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbOCtlc3BdCisJdnBhZGRkCXhtbTYseG1tMixbMzIrZWJwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllc2ksZWRpCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbNCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVzaSxlYngKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbMjArZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs3Nitlc3BdCisJeG9yCWVheCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbZXNwXQorCWFkZAllYXgsZWN4CisJdm1vdmRxYQlbNjQrZXNwXSx4bW02CisJdnBhbGlnbnIJeG1tNCx4bW0wLHhtbTMsNAorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbNCtlc3BdCisJdnBhbGlnbnIJeG1tNyx4bW0yLHhtbTEsNAorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlZGkKKwl2cHNybGQJeG1tNix4bW00LDcKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFtlc3BdLGVjeAorCXZwYWRkZAl4bW0zLHhtbTMseG1tNworCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCXZwc3JsZAl4bW03LHhtbTQsMworCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJdnBzbGxkCXhtbTUseG1tNCwxNAorCW1vdgllc2ksZWF4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJdnB4b3IJeG1tNCx4bW03LHhtbTYKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCXZwc2h1ZmQJeG1tNyx4bW0yLDI1MAorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwl2cHNybGQJeG1tNix4bW02LDExCisJYWRkCWVkeCxEV09SRCBbODArZXNwXQorCXhvcgllYngsZWRpCisJc2hyZAllY3gsZWN4LDIKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCWFkZAllYngsZWN4CisJdnBzbGxkCXhtbTUseG1tNSwxMQorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbZXNwXQorCXZweG9yCXhtbTQseG1tNCx4bW02CisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZXNpLGVkaQorCXZwc3JsZAl4bW02LHhtbTcsMTAKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyOCtlc3BdLGVjeAorCXZweG9yCXhtbTQseG1tNCx4bW01CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJdnBzcmxxCXhtbTUseG1tNywxNworCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJdnBhZGRkCXhtbTMseG1tMyx4bW00CisJbW92CWVzaSxlYngKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbMTIrZXNwXSxlYngKKwl2cHhvcgl4bW02LHhtbTYseG1tNQorCXhvcgllY3gsZWJ4CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwl2cHNybHEJeG1tNyx4bW03LDE5CisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCXZweG9yCXhtbTYseG1tNix4bW03CisJYWRkCWVkeCxEV09SRCBbODQrZXNwXQorCXhvcgllYXgsZWRpCisJc2hyZAllY3gsZWN4LDIKKwl2cHNodWZkCXhtbTcseG1tNiwxMzIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVjeAorCXZwc3JsZHEJeG1tNyx4bW03LDgKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzI4K2VzcF0KKwl2cGFkZGQJeG1tMyx4bW0zLHhtbTcKKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZXNpLGVkaQorCXZwc2h1ZmQJeG1tNyx4bW0zLDgwCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwl2cHNybGQJeG1tNix4bW03LDEwCisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJdnBzcmxxCXhtbTUseG1tNywxNworCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsxMitlc3BdCisJdnB4b3IJeG1tNix4bW02LHhtbTUKKwltb3YJZXNpLGVheAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFs4K2VzcF0sZWF4CisJdnBzcmxxCXhtbTcseG1tNywxOQorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwl2cHhvcgl4bW02LHhtbTYseG1tNworCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwl2cHNodWZkCXhtbTcseG1tNiwyMzIKKwlhZGQJZWR4LERXT1JEIFs4OCtlc3BdCisJeG9yCWVieCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCXZwc2xsZHEJeG1tNyx4bW03LDgKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWJ4LGVjeAorCXZwYWRkZAl4bW0zLHhtbTMseG1tNworCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMjQrZXNwXQorCXZwYWRkZAl4bW02LHhtbTMsWzQ4K2VicF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCW1vdgllc2ksZWJ4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzQrZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbZXNwXQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs5Mitlc3BdCisJeG9yCWVheCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsZWN4CisJdm1vdmRxYQlbODArZXNwXSx4bW02CisJY21wCURXT1JEIFs2NCtlYnBdLDY2MDUxCisJam5lCU5FQVIgTCQwMTNhdnhfMDBfNDcKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzQrZXNwXQorCW1vdgllc2ksZWF4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJeG9yCWVjeCxlYXgKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbMzIrZXNwXQorCXhvcgllYngsZWRpCisJc2hyZAllY3gsZWN4LDIKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMTYrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCXhvcgllc2ksZWRpCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJc2hyZAllZHgsZWR4LDYKKwltb3YJZWN4LGVieAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbZXNwXQorCW1vdgllc2ksZWJ4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbMzYrZXNwXQorCXhvcgllYXgsZWRpCisJc2hyZAllY3gsZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzgrZXNwXQorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFsxMitlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFs4K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwltb3YJZXNpLGVheAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFsyNCtlc3BdLGVheAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzQwK2VzcF0KKwl4b3IJZWJ4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFs0K2VzcF0KKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbOCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsxMitlc3BdCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFs0K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwltb3YJZXNpLGVieAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFsyMCtlc3BdLGVieAorCXhvcgllY3gsZWJ4CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFsxNitlc3BdCisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzQ0K2VzcF0KKwl4b3IJZWF4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFtlc3BdCisJYWRkCWVheCxlY3gKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzQrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbOCtlc3BdCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJbW92CWVzaSxlYXgKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbMTYrZXNwXSxlYXgKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMTIrZXNwXQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs0OCtlc3BdCisJeG9yCWVieCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMjgrZXNwXQorCWFkZAllYngsZWN4CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzE2K2VzcF0KKwltb3YJZXNpLGVieAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFsxMitlc3BdLGVieAorCXhvcgllY3gsZWJ4CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbNTIrZXNwXQorCXhvcgllYXgsZWRpCisJc2hyZAllY3gsZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWF4LGVjeAorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMjgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbZXNwXQorCXhvcgllc2ksZWRpCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbMjQrZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJc2hyZAllZHgsZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCW1vdgllc2ksZWF4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzU2K2VzcF0KKwl4b3IJZWJ4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyMCtlc3BdCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzI0K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzIwK2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCW1vdgllc2ksZWJ4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzQrZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbZXNwXQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs2MCtlc3BdCisJeG9yCWVheCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsxNitlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwltb3YJZXNpLGVheAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFtlc3BdLGVheAorCXhvcgllY3gsZWF4CisJeG9yCWVheCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyOCtlc3BdCisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVieCxlYXgKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzY0K2VzcF0KKwl4b3IJZWJ4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJYWRkCWVieCxlZHgKKwlhZGQJZWR4LERXT1JEIFsxMitlc3BdCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYngKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgW2VzcF0KKwltb3YJZXNpLGVieAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFsyOCtlc3BdLGVieAorCXhvcgllY3gsZWJ4CisJeG9yCWVieCxlZGkKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzY4K2VzcF0KKwl4b3IJZWF4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFs4K2VzcF0KKwlhZGQJZWF4LGVjeAorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbMTIrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMTYrZXNwXQorCXhvcgllc2ksZWRpCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbOCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWF4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJbW92CWVzaSxlYXgKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbMjQrZXNwXSxlYXgKKwl4b3IJZWN4LGVheAorCXhvcgllYXgsZWRpCisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs3Mitlc3BdCisJeG9yCWVieCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbNCtlc3BdCisJYWRkCWVieCxlY3gKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzgrZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCXhvcgllc2ksZWRpCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbNCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVzaSxlYngKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbMjArZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbMTYrZXNwXQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYXgsZWJ4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs3Nitlc3BdCisJeG9yCWVheCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCWFkZAllYXgsZWR4CisJYWRkCWVkeCxEV09SRCBbZXNwXQorCWFkZAllYXgsZWN4CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFs0K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgWzgrZXNwXQorCXhvcgllc2ksZWRpCisJc2hyZAllZHgsZWR4LDUKKwlhbmQJZXNpLGVjeAorCW1vdglEV09SRCBbZXNwXSxlY3gKKwl4b3IJZWR4LGVjeAorCXhvcgllZGksZXNpCisJc2hyZAllZHgsZWR4LDYKKwltb3YJZWN4LGVheAorCWFkZAllZHgsZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllc2ksZWF4CisJc2hyZAllY3gsZWN4LDkKKwltb3YJRFdPUkQgWzE2K2VzcF0sZWF4CisJeG9yCWVjeCxlYXgKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzEyK2VzcF0KKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWJ4LGVheAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbODArZXNwXQorCXhvcgllYngsZWRpCisJc2hyZAllY3gsZWN4LDIKKwlhZGQJZWJ4LGVkeAorCWFkZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlhZGQJZWJ4LGVjeAorCW1vdgllY3gsZWR4CisJc2hyZAllZHgsZWR4LDE0CisJbW92CWVzaSxEV09SRCBbZXNwXQorCXhvcgllZHgsZWN4CisJbW92CWVkaSxEV09SRCBbNCtlc3BdCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyOCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFsxNitlc3BdCisJbW92CWVzaSxlYngKKwlzaHJkCWVjeCxlY3gsOQorCW1vdglEV09SRCBbMTIrZXNwXSxlYngKKwl4b3IJZWN4LGVieAorCXhvcgllYngsZWRpCisJYWRkCWVkeCxEV09SRCBbOCtlc3BdCisJc2hyZAllY3gsZWN4LDExCisJYW5kCWVheCxlYngKKwl4b3IJZWN4LGVzaQorCWFkZAllZHgsRFdPUkQgWzg0K2VzcF0KKwl4b3IJZWF4LGVkaQorCXNocmQJZWN4LGVjeCwyCisJYWRkCWVheCxlZHgKKwlhZGQJZWR4LERXT1JEIFsyNCtlc3BdCisJYWRkCWVheCxlY3gKKwltb3YJZWN4LGVkeAorCXNocmQJZWR4LGVkeCwxNAorCW1vdgllc2ksRFdPUkQgWzI4K2VzcF0KKwl4b3IJZWR4LGVjeAorCW1vdgllZGksRFdPUkQgW2VzcF0KKwl4b3IJZXNpLGVkaQorCXNocmQJZWR4LGVkeCw1CisJYW5kCWVzaSxlY3gKKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJeG9yCWVkeCxlY3gKKwl4b3IJZWRpLGVzaQorCXNocmQJZWR4LGVkeCw2CisJbW92CWVjeCxlYXgKKwlhZGQJZWR4LGVkaQorCW1vdgllZGksRFdPUkQgWzEyK2VzcF0KKwltb3YJZXNpLGVheAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFs4K2VzcF0sZWF4CisJeG9yCWVjeCxlYXgKKwl4b3IJZWF4LGVkaQorCWFkZAllZHgsRFdPUkQgWzQrZXNwXQorCXNocmQJZWN4LGVjeCwxMQorCWFuZAllYngsZWF4CisJeG9yCWVjeCxlc2kKKwlhZGQJZWR4LERXT1JEIFs4OCtlc3BdCisJeG9yCWVieCxlZGkKKwlzaHJkCWVjeCxlY3gsMgorCWFkZAllYngsZWR4CisJYWRkCWVkeCxEV09SRCBbMjArZXNwXQorCWFkZAllYngsZWN4CisJbW92CWVjeCxlZHgKKwlzaHJkCWVkeCxlZHgsMTQKKwltb3YJZXNpLERXT1JEIFsyNCtlc3BdCisJeG9yCWVkeCxlY3gKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJeG9yCWVzaSxlZGkKKwlzaHJkCWVkeCxlZHgsNQorCWFuZAllc2ksZWN4CisJbW92CURXT1JEIFsyMCtlc3BdLGVjeAorCXhvcgllZHgsZWN4CisJeG9yCWVkaSxlc2kKKwlzaHJkCWVkeCxlZHgsNgorCW1vdgllY3gsZWJ4CisJYWRkCWVkeCxlZGkKKwltb3YJZWRpLERXT1JEIFs4K2VzcF0KKwltb3YJZXNpLGVieAorCXNocmQJZWN4LGVjeCw5CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVjeCxlYngKKwl4b3IJZWJ4LGVkaQorCWFkZAllZHgsRFdPUkQgW2VzcF0KKwlzaHJkCWVjeCxlY3gsMTEKKwlhbmQJZWF4LGVieAorCXhvcgllY3gsZXNpCisJYWRkCWVkeCxEV09SRCBbOTIrZXNwXQorCXhvcgllYXgsZWRpCisJc2hyZAllY3gsZWN4LDIKKwlhZGQJZWF4LGVkeAorCWFkZAllZHgsRFdPUkQgWzE2K2VzcF0KKwlhZGQJZWF4LGVjeAorCW1vdgllc2ksRFdPUkQgWzk2K2VzcF0KKwl4b3IJZWJ4LGVkaQorCW1vdgllY3gsRFdPUkQgWzEyK2VzcF0KKwlhZGQJZWF4LERXT1JEIFtlc2ldCisJYWRkCWVieCxEV09SRCBbNCtlc2ldCisJYWRkCWVkaSxEV09SRCBbOCtlc2ldCisJYWRkCWVjeCxEV09SRCBbMTIrZXNpXQorCW1vdglEV09SRCBbZXNpXSxlYXgKKwltb3YJRFdPUkQgWzQrZXNpXSxlYngKKwltb3YJRFdPUkQgWzgrZXNpXSxlZGkKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWN4CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJeG9yCWVieCxlZGkKKwltb3YJRFdPUkQgWzgrZXNwXSxlZGkKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWN4CisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCW1vdgllY3gsRFdPUkQgWzI0K2VzcF0KKwlhZGQJZWR4LERXT1JEIFsxNitlc2ldCisJYWRkCWVkaSxEV09SRCBbMjArZXNpXQorCWFkZAllY3gsRFdPUkQgWzI0K2VzaV0KKwltb3YJRFdPUkQgWzE2K2VzaV0sZWR4CisJbW92CURXT1JEIFsyMCtlc2ldLGVkaQorCW1vdglEV09SRCBbMjArZXNwXSxlZGkKKwltb3YJZWRpLERXT1JEIFsyOCtlc3BdCisJbW92CURXT1JEIFsyNCtlc2ldLGVjeAorCWFkZAllZGksRFdPUkQgWzI4K2VzaV0KKwltb3YJRFdPUkQgWzI0K2VzcF0sZWN4CisJbW92CURXT1JEIFsyOCtlc2ldLGVkaQorCW1vdglEV09SRCBbMjgrZXNwXSxlZGkKKwltb3YJZWRpLERXT1JEIFsxMDArZXNwXQorCXZtb3ZkcWEJeG1tNyxbNjQrZWJwXQorCXN1YgllYnAsMTkyCisJY21wCWVkaSxEV09SRCBbMTA0K2VzcF0KKwlqYglORUFSIEwkMDEyZ3JhbmRfYXZ4CisJbW92CWVzcCxEV09SRCBbMTA4K2VzcF0KKwl2emVyb2FsbAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK3NlZ21lbnQJLmJzcworY29tbW9uCV9PUEVOU1NMX2lhMzJjYXBfUCAxNgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi01ODYuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3NoYTUxMi01ODYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZWQwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLTU4Ni5hc20KQEAgLTAsMCArMSwyODQzIEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorO2V4dGVybglfT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKK2FsaWduCTE2Citfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXI6CitMJF9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwltb3YJZWRpLERXT1JEIFsyNCtlc3BdCisJbW92CWVheCxEV09SRCBbMjgrZXNwXQorCW1vdgllYngsZXNwCisJY2FsbAlMJDAwMHBpY19wb2ludAorTCQwMDBwaWNfcG9pbnQ6CisJcG9wCWVicAorCWxlYQllYnAsWyhMJDAwMUs1MTItTCQwMDBwaWNfcG9pbnQpK2VicF0KKwlzdWIJZXNwLDE2CisJYW5kCWVzcCwtNjQKKwlzaGwJZWF4LDcKKwlhZGQJZWF4LGVkaQorCW1vdglEV09SRCBbZXNwXSxlc2kKKwltb3YJRFdPUkQgWzQrZXNwXSxlZGkKKwltb3YJRFdPUkQgWzgrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzEyK2VzcF0sZWJ4CisJbGVhCWVkeCxbX09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdgllY3gsRFdPUkQgW2VkeF0KKwl0ZXN0CWVjeCw2NzEwODg2NAorCWp6CU5FQVIgTCQwMDJsb29wX3g4NgorCW1vdgllZHgsRFdPUkQgWzQrZWR4XQorCW1vdnEJbW0wLFtlc2ldCisJYW5kCWVjeCwxNjc3NzIxNgorCW1vdnEJbW0xLFs4K2VzaV0KKwlhbmQJZWR4LDUxMgorCW1vdnEJbW0yLFsxNitlc2ldCisJb3IJZWN4LGVkeAorCW1vdnEJbW0zLFsyNCtlc2ldCisJbW92cQltbTQsWzMyK2VzaV0KKwltb3ZxCW1tNSxbNDArZXNpXQorCW1vdnEJbW02LFs0OCtlc2ldCisJbW92cQltbTcsWzU2K2VzaV0KKwljbXAJZWN4LDE2Nzc3NzI4CisJamUJTkVBUiBMJDAwM1NTU0UzCisJc3ViCWVzcCw4MAorCWptcAlORUFSIEwkMDA0bG9vcF9zc2UyCithbGlnbgkxNgorTCQwMDRsb29wX3NzZTI6CisJbW92cQlbOCtlc3BdLG1tMQorCW1vdnEJWzE2K2VzcF0sbW0yCisJbW92cQlbMjQrZXNwXSxtbTMKKwltb3ZxCVs0MCtlc3BdLG1tNQorCW1vdnEJWzQ4K2VzcF0sbW02CisJcHhvcgltbTIsbW0xCisJbW92cQlbNTYrZXNwXSxtbTcKKwltb3ZxCW1tMyxtbTAKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92CWVieCxEV09SRCBbNCtlZGldCisJYWRkCWVkaSw4CisJbW92CWVkeCwxNQorCWJzd2FwCWVheAorCWJzd2FwCWVieAorCWptcAlORUFSIEwkMDA1MDBfMTRfc3NlMgorYWxpZ24JMTYKK0wkMDA1MDBfMTRfc3NlMjoKKwltb3ZkCW1tMSxlYXgKKwltb3YJZWF4LERXT1JEIFtlZGldCisJbW92ZAltbTcsZWJ4CisJbW92CWVieCxEV09SRCBbNCtlZGldCisJYWRkCWVkaSw4CisJYnN3YXAJZWF4CisJYnN3YXAJZWJ4CisJcHVucGNrbGRxCW1tNyxtbTEKKwltb3ZxCW1tMSxtbTQKKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVszMitlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCW1vdnEJbW0wLG1tMworCW1vdnEJWzcyK2VzcF0sbW03CisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVtlc3BdLG1tMAorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzU2K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXBhZGRxCW1tNyxbZWJwXQorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFsyNCtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMAorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTAKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbOCtlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlzdWIJZXNwLDgKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTIsbW0wCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbNDArZXNwXQorCXBhZGRxCW1tMyxtbTIKKwltb3ZxCW1tMixtbTAKKwlhZGQJZWJwLDgKKwlwYWRkcQltbTMsbW02CisJbW92cQltbTYsWzQ4K2VzcF0KKwlkZWMJZWR4CisJam56CU5FQVIgTCQwMDUwMF8xNF9zc2UyCisJbW92ZAltbTEsZWF4CisJbW92ZAltbTcsZWJ4CisJcHVucGNrbGRxCW1tNyxtbTEKKwltb3ZxCW1tMSxtbTQKKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVszMitlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCW1vdnEJbW0wLG1tMworCW1vdnEJWzcyK2VzcF0sbW03CisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVtlc3BdLG1tMAorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzU2K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXBhZGRxCW1tNyxbZWJwXQorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFsyNCtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMAorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTAKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbOCtlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlzdWIJZXNwLDgKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTIsbW0wCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNyxbMTkyK2VzcF0KKwlwYWRkcQltbTMsbW0yCisJbW92cQltbTIsbW0wCisJYWRkCWVicCw4CisJcGFkZHEJbW0zLG1tNgorCXB4b3IJbW0wLG1tMAorCW1vdgllZHgsMzIKKwlqbXAJTkVBUiBMJDAwNjE2Xzc5X3NzZTIKK2FsaWduCTE2CitMJDAwNjE2Xzc5X3NzZTI6CisJbW92cQltbTUsWzg4K2VzcF0KKwltb3ZxCW1tMSxtbTcKKwlwc3JscQltbTcsMQorCW1vdnEJbW02LG1tNQorCXBzcmxxCW1tNSw2CisJcHNsbHEJbW0xLDU2CisJcGFkZHEJbW0wLG1tMworCW1vdnEJbW0zLG1tNworCXBzcmxxCW1tNyw2CisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW0xLDcKKwlweG9yCW1tMyxtbTcKKwlwc3JscQltbTcsMQorCXB4b3IJbW0zLG1tMQorCW1vdnEJbW0xLG1tNQorCXBzcmxxCW1tNSwxMworCXB4b3IJbW03LG1tMworCXBzbGxxCW1tNiwzCisJcHhvcgltbTEsbW01CisJcGFkZHEJbW03LFsyMDArZXNwXQorCXB4b3IJbW0xLG1tNgorCXBzcmxxCW1tNSw0MgorCXBhZGRxCW1tNyxbMTI4K2VzcF0KKwlweG9yCW1tMSxtbTUKKwlwc2xscQltbTYsNDIKKwltb3ZxCW1tNSxbNDArZXNwXQorCXB4b3IJbW0xLG1tNgorCW1vdnEJbW02LFs0OCtlc3BdCisJcGFkZHEJbW03LG1tMQorCW1vdnEJbW0xLG1tNAorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzMyK2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJbW92cQlbNzIrZXNwXSxtbTcKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJW2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbNTYrZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcGFkZHEJbW03LFtlYnBdCisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzI0K2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0wCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMAorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFs4K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXN1Ygllc3AsOAorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW03LFsxOTIrZXNwXQorCXBhZGRxCW1tMixtbTYKKwlhZGQJZWJwLDgKKwltb3ZxCW1tNSxbODgrZXNwXQorCW1vdnEJbW0xLG1tNworCXBzcmxxCW1tNywxCisJbW92cQltbTYsbW01CisJcHNybHEJbW01LDYKKwlwc2xscQltbTEsNTYKKwlwYWRkcQltbTIsbW0zCisJbW92cQltbTMsbW03CisJcHNybHEJbW03LDYKKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTEsNworCXB4b3IJbW0zLG1tNworCXBzcmxxCW1tNywxCisJcHhvcgltbTMsbW0xCisJbW92cQltbTEsbW01CisJcHNybHEJbW01LDEzCisJcHhvcgltbTcsbW0zCisJcHNsbHEJbW02LDMKKwlweG9yCW1tMSxtbTUKKwlwYWRkcQltbTcsWzIwMCtlc3BdCisJcHhvcgltbTEsbW02CisJcHNybHEJbW01LDQyCisJcGFkZHEJbW03LFsxMjgrZXNwXQorCXB4b3IJbW0xLG1tNQorCXBzbGxxCW1tNiw0MgorCW1vdnEJbW01LFs0MCtlc3BdCisJcHhvcgltbTEsbW02CisJbW92cQltbTYsWzQ4K2VzcF0KKwlwYWRkcQltbTcsbW0xCisJbW92cQltbTEsbW00CisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbMzIrZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwltb3ZxCVs3Mitlc3BdLG1tNworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbZXNwXSxtbTIKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFs1Nitlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlwYWRkcQltbTcsW2VicF0KKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbMjQrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTIKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0yCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzgrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJc3ViCWVzcCw4CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTcsWzE5Mitlc3BdCisJcGFkZHEJbW0wLG1tNgorCWFkZAllYnAsOAorCWRlYwllZHgKKwlqbnoJTkVBUiBMJDAwNjE2Xzc5X3NzZTIKKwlwYWRkcQltbTAsbW0zCisJbW92cQltbTEsWzgrZXNwXQorCW1vdnEJbW0zLFsyNCtlc3BdCisJbW92cQltbTUsWzQwK2VzcF0KKwltb3ZxCW1tNixbNDgrZXNwXQorCW1vdnEJbW03LFs1Nitlc3BdCisJcHhvcgltbTIsbW0xCisJcGFkZHEJbW0wLFtlc2ldCisJcGFkZHEJbW0xLFs4K2VzaV0KKwlwYWRkcQltbTIsWzE2K2VzaV0KKwlwYWRkcQltbTMsWzI0K2VzaV0KKwlwYWRkcQltbTQsWzMyK2VzaV0KKwlwYWRkcQltbTUsWzQwK2VzaV0KKwlwYWRkcQltbTYsWzQ4K2VzaV0KKwlwYWRkcQltbTcsWzU2K2VzaV0KKwltb3YJZWF4LDY0MAorCW1vdnEJW2VzaV0sbW0wCisJbW92cQlbOCtlc2ldLG1tMQorCW1vdnEJWzE2K2VzaV0sbW0yCisJbW92cQlbMjQrZXNpXSxtbTMKKwltb3ZxCVszMitlc2ldLG1tNAorCW1vdnEJWzQwK2VzaV0sbW01CisJbW92cQlbNDgrZXNpXSxtbTYKKwltb3ZxCVs1Nitlc2ldLG1tNworCWxlYQllc3AsW2VheCoxK2VzcF0KKwlzdWIJZWJwLGVheAorCWNtcAllZGksRFdPUkQgWzg4K2VzcF0KKwlqYglORUFSIEwkMDA0bG9vcF9zc2UyCisJbW92CWVzcCxEV09SRCBbOTIrZXNwXQorCWVtbXMKKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CithbGlnbgkzMgorTCQwMDNTU1NFMzoKKwlsZWEJZWR4LFtlc3AtNjRdCisJc3ViCWVzcCwyNTYKKwltb3ZkcWEJeG1tMSxbNjQwK2VicF0KKwltb3ZkcXUJeG1tMCxbZWRpXQorZGIJMTAyLDE1LDU2LDAsMTkzCisJbW92ZHFhCXhtbTMsW2VicF0KKwltb3ZkcWEJeG1tMix4bW0xCisJbW92ZHF1CXhtbTEsWzE2K2VkaV0KKwlwYWRkcQl4bW0zLHhtbTAKK2RiCTEwMiwxNSw1NiwwLDIwMgorCW1vdmRxYQlbZWR4LTEyOF0seG1tMworCW1vdmRxYQl4bW00LFsxNitlYnBdCisJbW92ZHFhCXhtbTMseG1tMgorCW1vdmRxdQl4bW0yLFszMitlZGldCisJcGFkZHEJeG1tNCx4bW0xCitkYgkxMDIsMTUsNTYsMCwyMTEKKwltb3ZkcWEJW2VkeC0xMTJdLHhtbTQKKwltb3ZkcWEJeG1tNSxbMzIrZWJwXQorCW1vdmRxYQl4bW00LHhtbTMKKwltb3ZkcXUJeG1tMyxbNDgrZWRpXQorCXBhZGRxCXhtbTUseG1tMgorZGIJMTAyLDE1LDU2LDAsMjIwCisJbW92ZHFhCVtlZHgtOTZdLHhtbTUKKwltb3ZkcWEJeG1tNixbNDgrZWJwXQorCW1vdmRxYQl4bW01LHhtbTQKKwltb3ZkcXUJeG1tNCxbNjQrZWRpXQorCXBhZGRxCXhtbTYseG1tMworZGIJMTAyLDE1LDU2LDAsMjI5CisJbW92ZHFhCVtlZHgtODBdLHhtbTYKKwltb3ZkcWEJeG1tNyxbNjQrZWJwXQorCW1vdmRxYQl4bW02LHhtbTUKKwltb3ZkcXUJeG1tNSxbODArZWRpXQorCXBhZGRxCXhtbTcseG1tNAorZGIJMTAyLDE1LDU2LDAsMjM4CisJbW92ZHFhCVtlZHgtNjRdLHhtbTcKKwltb3ZkcWEJW2VkeF0seG1tMAorCW1vdmRxYQl4bW0wLFs4MCtlYnBdCisJbW92ZHFhCXhtbTcseG1tNgorCW1vdmRxdQl4bW02LFs5NitlZGldCisJcGFkZHEJeG1tMCx4bW01CitkYgkxMDIsMTUsNTYsMCwyNDcKKwltb3ZkcWEJW2VkeC00OF0seG1tMAorCW1vdmRxYQlbMTYrZWR4XSx4bW0xCisJbW92ZHFhCXhtbTEsWzk2K2VicF0KKwltb3ZkcWEJeG1tMCx4bW03CisJbW92ZHF1CXhtbTcsWzExMitlZGldCisJcGFkZHEJeG1tMSx4bW02CitkYgkxMDIsMTUsNTYsMCwyNDgKKwltb3ZkcWEJW2VkeC0zMl0seG1tMQorCW1vdmRxYQlbMzIrZWR4XSx4bW0yCisJbW92ZHFhCXhtbTIsWzExMitlYnBdCisJbW92ZHFhCXhtbTAsW2VkeF0KKwlwYWRkcQl4bW0yLHhtbTcKKwltb3ZkcWEJW2VkeC0xNl0seG1tMgorCW5vcAorYWxpZ24JMzIKK0wkMDA3bG9vcF9zc3NlMzoKKwltb3ZkcWEJeG1tMixbMTYrZWR4XQorCW1vdmRxYQlbNDgrZWR4XSx4bW0zCisJbGVhCWVicCxbMTI4K2VicF0KKwltb3ZxCVs4K2VzcF0sbW0xCisJbW92CWVieCxlZGkKKwltb3ZxCVsxNitlc3BdLG1tMgorCWxlYQllZGksWzEyOCtlZGldCisJbW92cQlbMjQrZXNwXSxtbTMKKwljbXAJZWRpLGVheAorCW1vdnEJWzQwK2VzcF0sbW01CisJY21vdmIJZWJ4LGVkaQorCW1vdnEJWzQ4K2VzcF0sbW02CisJbW92CWVjeCw0CisJcHhvcgltbTIsbW0xCisJbW92cQlbNTYrZXNwXSxtbTcKKwlweG9yCW1tMyxtbTMKKwlqbXAJTkVBUiBMJDAwODAwXzQ3X3Nzc2UzCithbGlnbgkzMgorTCQwMDgwMF80N19zc3NlMzoKKwltb3ZkcWEJeG1tMyx4bW01CisJbW92ZHFhCXhtbTEseG1tMgorZGIJMTAyLDE1LDU4LDE1LDIwOCw4CisJbW92ZHFhCVtlZHhdLHhtbTQKK2RiCTEwMiwxNSw1OCwxNSwyMjAsOAorCW1vdmRxYQl4bW00LHhtbTIKKwlwc3JscQl4bW0yLDcKKwlwYWRkcQl4bW0wLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CisJcHNybHEJeG1tNCwxCisJcHNsbHEJeG1tMyw1NgorCXB4b3IJeG1tMix4bW00CisJcHNybHEJeG1tNCw3CisJcHhvcgl4bW0yLHhtbTMKKwlwc2xscQl4bW0zLDcKKwlweG9yCXhtbTIseG1tNAorCW1vdmRxYQl4bW00LHhtbTcKKwlweG9yCXhtbTIseG1tMworCW1vdmRxYQl4bW0zLHhtbTcKKwlwc3JscQl4bW00LDYKKwlwYWRkcQl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW03CisJcHNybHEJeG1tMywxOQorCXBzbGxxCXhtbTIsMworCXB4b3IJeG1tNCx4bW0zCisJcHNybHEJeG1tMyw0MgorCXB4b3IJeG1tNCx4bW0yCisJcHNsbHEJeG1tMiw0MgorCXB4b3IJeG1tNCx4bW0zCisJbW92ZHFhCXhtbTMsWzMyK2VkeF0KKwlweG9yCXhtbTQseG1tMgorCW1vdmRxYQl4bW0yLFtlYnBdCisJbW92cQltbTEsbW00CisJcGFkZHEJeG1tMCx4bW00CisJbW92cQltbTcsW2VkeC0xMjhdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbMzIrZXNwXSxtbTQKKwlwYWRkcQl4bW0yLHhtbTAKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTAsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVtlc3BdLG1tMAorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzU2K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFsyNCtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMAorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTAKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbOCtlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTIsbW0wCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbMzIrZXNwXQorCXBhZGRxCW1tMixtbTYKKwltb3ZxCW1tNixbNDArZXNwXQorCW1vdnEJbW0xLG1tNAorCW1vdnEJbW03LFtlZHgtMTIwXQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzI0K2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0yLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbNTYrZXNwXSxtbTIKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFs0OCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbMTYrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTIKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0yCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsW2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMCxtbTIKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFsyNCtlc3BdCisJcGFkZHEJbW0wLG1tNgorCW1vdnEJbW02LFszMitlc3BdCisJbW92ZHFhCVtlZHgtMTI4XSx4bW0yCisJbW92ZHFhCXhtbTQseG1tNgorCW1vdmRxYQl4bW0yLHhtbTMKK2RiCTEwMiwxNSw1OCwxNSwyMTcsOAorCW1vdmRxYQlbMTYrZWR4XSx4bW01CitkYgkxMDIsMTUsNTgsMTUsMjI5LDgKKwltb3ZkcWEJeG1tNSx4bW0zCisJcHNybHEJeG1tMyw3CisJcGFkZHEJeG1tMSx4bW00CisJbW92ZHFhCXhtbTQseG1tNQorCXBzcmxxCXhtbTUsMQorCXBzbGxxCXhtbTQsNTYKKwlweG9yCXhtbTMseG1tNQorCXBzcmxxCXhtbTUsNworCXB4b3IJeG1tMyx4bW00CisJcHNsbHEJeG1tNCw3CisJcHhvcgl4bW0zLHhtbTUKKwltb3ZkcWEJeG1tNSx4bW0wCisJcHhvcgl4bW0zLHhtbTQKKwltb3ZkcWEJeG1tNCx4bW0wCisJcHNybHEJeG1tNSw2CisJcGFkZHEJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tMAorCXBzcmxxCXhtbTQsMTkKKwlwc2xscQl4bW0zLDMKKwlweG9yCXhtbTUseG1tNAorCXBzcmxxCXhtbTQsNDIKKwlweG9yCXhtbTUseG1tMworCXBzbGxxCXhtbTMsNDIKKwlweG9yCXhtbTUseG1tNAorCW1vdmRxYQl4bW00LFs0OCtlZHhdCisJcHhvcgl4bW01LHhtbTMKKwltb3ZkcWEJeG1tMyxbMTYrZWJwXQorCW1vdnEJbW0xLG1tNAorCXBhZGRxCXhtbTEseG1tNQorCW1vdnEJbW03LFtlZHgtMTEyXQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzE2K2VzcF0sbW00CisJcGFkZHEJeG1tMyx4bW0xCisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0wLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbNDgrZXNwXSxtbTAKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFs0MCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbOCtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMAorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTAKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbNTYrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMCxtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0yLG1tMAorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzE2K2VzcF0KKwlwYWRkcQltbTIsbW02CisJbW92cQltbTYsWzI0K2VzcF0KKwltb3ZxCW1tMSxtbTQKKwltb3ZxCW1tNyxbZWR4LTEwNF0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVs4K2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0yLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbNDArZXNwXSxtbTIKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFszMitlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTIKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0yCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzQ4K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMCxtbTIKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs4K2VzcF0KKwlwYWRkcQltbTAsbW02CisJbW92cQltbTYsWzE2K2VzcF0KKwltb3ZkcWEJW2VkeC0xMTJdLHhtbTMKKwltb3ZkcWEJeG1tNSx4bW03CisJbW92ZHFhCXhtbTMseG1tNAorZGIJMTAyLDE1LDU4LDE1LDIyNiw4CisJbW92ZHFhCVszMitlZHhdLHhtbTYKK2RiCTEwMiwxNSw1OCwxNSwyMzgsOAorCW1vdmRxYQl4bW02LHhtbTQKKwlwc3JscQl4bW00LDcKKwlwYWRkcQl4bW0yLHhtbTUKKwltb3ZkcWEJeG1tNSx4bW02CisJcHNybHEJeG1tNiwxCisJcHNsbHEJeG1tNSw1NgorCXB4b3IJeG1tNCx4bW02CisJcHNybHEJeG1tNiw3CisJcHhvcgl4bW00LHhtbTUKKwlwc2xscQl4bW01LDcKKwlweG9yCXhtbTQseG1tNgorCW1vdmRxYQl4bW02LHhtbTEKKwlweG9yCXhtbTQseG1tNQorCW1vdmRxYQl4bW01LHhtbTEKKwlwc3JscQl4bW02LDYKKwlwYWRkcQl4bW0yLHhtbTQKKwltb3ZkcWEJeG1tNCx4bW0xCisJcHNybHEJeG1tNSwxOQorCXBzbGxxCXhtbTQsMworCXB4b3IJeG1tNix4bW01CisJcHNybHEJeG1tNSw0MgorCXB4b3IJeG1tNix4bW00CisJcHNsbHEJeG1tNCw0MgorCXB4b3IJeG1tNix4bW01CisJbW92ZHFhCXhtbTUsW2VkeF0KKwlweG9yCXhtbTYseG1tNAorCW1vdmRxYQl4bW00LFszMitlYnBdCisJbW92cQltbTEsbW00CisJcGFkZHEJeG1tMix4bW02CisJbW92cQltbTcsW2VkeC05Nl0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVtlc3BdLG1tNAorCXBhZGRxCXhtbTQseG1tMgorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMCxtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzMyK2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbMjQrZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzU2K2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0wCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMAorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFs0MCtlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTIsbW0wCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbZXNwXQorCXBhZGRxCW1tMixtbTYKKwltb3ZxCW1tNixbOCtlc3BdCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC04OF0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVs1Nitlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMixtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzI0K2VzcF0sbW0yCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbMTYrZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzQ4K2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0yCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMgorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFszMitlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTAsbW0yCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMCxtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbNTYrZXNwXQorCXBhZGRxCW1tMCxtbTYKKwltb3ZxCW1tNixbZXNwXQorCW1vdmRxYQlbZWR4LTk2XSx4bW00CisJbW92ZHFhCXhtbTYseG1tMAorCW1vdmRxYQl4bW00LHhtbTUKK2RiCTEwMiwxNSw1OCwxNSwyMzUsOAorCW1vdmRxYQlbNDgrZWR4XSx4bW03CitkYgkxMDIsMTUsNTgsMTUsMjQ3LDgKKwltb3ZkcWEJeG1tNyx4bW01CisJcHNybHEJeG1tNSw3CisJcGFkZHEJeG1tMyx4bW02CisJbW92ZHFhCXhtbTYseG1tNworCXBzcmxxCXhtbTcsMQorCXBzbGxxCXhtbTYsNTYKKwlweG9yCXhtbTUseG1tNworCXBzcmxxCXhtbTcsNworCXB4b3IJeG1tNSx4bW02CisJcHNsbHEJeG1tNiw3CisJcHhvcgl4bW01LHhtbTcKKwltb3ZkcWEJeG1tNyx4bW0yCisJcHhvcgl4bW01LHhtbTYKKwltb3ZkcWEJeG1tNix4bW0yCisJcHNybHEJeG1tNyw2CisJcGFkZHEJeG1tMyx4bW01CisJbW92ZHFhCXhtbTUseG1tMgorCXBzcmxxCXhtbTYsMTkKKwlwc2xscQl4bW01LDMKKwlweG9yCXhtbTcseG1tNgorCXBzcmxxCXhtbTYsNDIKKwlweG9yCXhtbTcseG1tNQorCXBzbGxxCXhtbTUsNDIKKwlweG9yCXhtbTcseG1tNgorCW1vdmRxYQl4bW02LFsxNitlZHhdCisJcHhvcgl4bW03LHhtbTUKKwltb3ZkcWEJeG1tNSxbNDgrZWJwXQorCW1vdnEJbW0xLG1tNAorCXBhZGRxCXhtbTMseG1tNworCW1vdnEJbW03LFtlZHgtODBdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbNDgrZXNwXSxtbTQKKwlwYWRkcQl4bW01LHhtbTMKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTAsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVsxNitlc3BdLG1tMAorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzgrZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzQwK2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0wCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMAorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFsyNCtlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTIsbW0wCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbNDgrZXNwXQorCXBhZGRxCW1tMixtbTYKKwltb3ZxCW1tNixbNTYrZXNwXQorCW1vdnEJbW0xLG1tNAorCW1vdnEJbW03LFtlZHgtNzJdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbNDArZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTIsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVs4K2VzcF0sbW0yCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzMyK2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0yCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMgorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFsxNitlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTAsbW0yCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMCxtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbNDArZXNwXQorCXBhZGRxCW1tMCxtbTYKKwltb3ZxCW1tNixbNDgrZXNwXQorCW1vdmRxYQlbZWR4LTgwXSx4bW01CisJbW92ZHFhCXhtbTcseG1tMQorCW1vdmRxYQl4bW01LHhtbTYKK2RiCTEwMiwxNSw1OCwxNSwyNDQsOAorCW1vdmRxYQlbZWR4XSx4bW0wCitkYgkxMDIsMTUsNTgsMTUsMjQ4LDgKKwltb3ZkcWEJeG1tMCx4bW02CisJcHNybHEJeG1tNiw3CisJcGFkZHEJeG1tNCx4bW03CisJbW92ZHFhCXhtbTcseG1tMAorCXBzcmxxCXhtbTAsMQorCXBzbGxxCXhtbTcsNTYKKwlweG9yCXhtbTYseG1tMAorCXBzcmxxCXhtbTAsNworCXB4b3IJeG1tNix4bW03CisJcHNsbHEJeG1tNyw3CisJcHhvcgl4bW02LHhtbTAKKwltb3ZkcWEJeG1tMCx4bW0zCisJcHhvcgl4bW02LHhtbTcKKwltb3ZkcWEJeG1tNyx4bW0zCisJcHNybHEJeG1tMCw2CisJcGFkZHEJeG1tNCx4bW02CisJbW92ZHFhCXhtbTYseG1tMworCXBzcmxxCXhtbTcsMTkKKwlwc2xscQl4bW02LDMKKwlweG9yCXhtbTAseG1tNworCXBzcmxxCXhtbTcsNDIKKwlweG9yCXhtbTAseG1tNgorCXBzbGxxCXhtbTYsNDIKKwlweG9yCXhtbTAseG1tNworCW1vdmRxYQl4bW03LFszMitlZHhdCisJcHhvcgl4bW0wLHhtbTYKKwltb3ZkcWEJeG1tNixbNjQrZWJwXQorCW1vdnEJbW0xLG1tNAorCXBhZGRxCXhtbTQseG1tMAorCW1vdnEJbW03LFtlZHgtNjRdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbMzIrZXNwXSxtbTQKKwlwYWRkcQl4bW02LHhtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTAsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVtlc3BdLG1tMAorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzU2K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFsyNCtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMAorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTAKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbOCtlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTIsbW0wCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbMzIrZXNwXQorCXBhZGRxCW1tMixtbTYKKwltb3ZxCW1tNixbNDArZXNwXQorCW1vdnEJbW0xLG1tNAorCW1vdnEJbW03LFtlZHgtNTZdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbMjQrZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTIsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVs1Nitlc3BdLG1tMgorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzQ4K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFsxNitlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMgorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTIKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzI0K2VzcF0KKwlwYWRkcQltbTAsbW02CisJbW92cQltbTYsWzMyK2VzcF0KKwltb3ZkcWEJW2VkeC02NF0seG1tNgorCW1vdmRxYQl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tNix4bW03CitkYgkxMDIsMTUsNTgsMTUsMjUzLDgKKwltb3ZkcWEJWzE2K2VkeF0seG1tMQorZGIJMTAyLDE1LDU4LDE1LDE5Myw4CisJbW92ZHFhCXhtbTEseG1tNworCXBzcmxxCXhtbTcsNworCXBhZGRxCXhtbTUseG1tMAorCW1vdmRxYQl4bW0wLHhtbTEKKwlwc3JscQl4bW0xLDEKKwlwc2xscQl4bW0wLDU2CisJcHhvcgl4bW03LHhtbTEKKwlwc3JscQl4bW0xLDcKKwlweG9yCXhtbTcseG1tMAorCXBzbGxxCXhtbTAsNworCXB4b3IJeG1tNyx4bW0xCisJbW92ZHFhCXhtbTEseG1tNAorCXB4b3IJeG1tNyx4bW0wCisJbW92ZHFhCXhtbTAseG1tNAorCXBzcmxxCXhtbTEsNgorCXBhZGRxCXhtbTUseG1tNworCW1vdmRxYQl4bW03LHhtbTQKKwlwc3JscQl4bW0wLDE5CisJcHNsbHEJeG1tNywzCisJcHhvcgl4bW0xLHhtbTAKKwlwc3JscQl4bW0wLDQyCisJcHhvcgl4bW0xLHhtbTcKKwlwc2xscQl4bW03LDQyCisJcHhvcgl4bW0xLHhtbTAKKwltb3ZkcWEJeG1tMCxbNDgrZWR4XQorCXB4b3IJeG1tMSx4bW03CisJbW92ZHFhCXhtbTcsWzgwK2VicF0KKwltb3ZxCW1tMSxtbTQKKwlwYWRkcQl4bW01LHhtbTEKKwltb3ZxCW1tNyxbZWR4LTQ4XQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzE2K2VzcF0sbW00CisJcGFkZHEJeG1tNyx4bW01CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0wLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbNDgrZXNwXSxtbTAKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFs0MCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbOCtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMAorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTAKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbNTYrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMCxtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0yLG1tMAorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzE2K2VzcF0KKwlwYWRkcQltbTIsbW02CisJbW92cQltbTYsWzI0K2VzcF0KKwltb3ZxCW1tMSxtbTQKKwltb3ZxCW1tNyxbZWR4LTQwXQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzgrZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTIsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVs0MCtlc3BdLG1tMgorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzMyK2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMgorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTIKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbNDgrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzgrZXNwXQorCXBhZGRxCW1tMCxtbTYKKwltb3ZxCW1tNixbMTYrZXNwXQorCW1vdmRxYQlbZWR4LTQ4XSx4bW03CisJbW92ZHFhCXhtbTEseG1tMworCW1vdmRxYQl4bW03LHhtbTAKK2RiCTEwMiwxNSw1OCwxNSwxOTgsOAorCW1vdmRxYQlbMzIrZWR4XSx4bW0yCitkYgkxMDIsMTUsNTgsMTUsMjAyLDgKKwltb3ZkcWEJeG1tMix4bW0wCisJcHNybHEJeG1tMCw3CisJcGFkZHEJeG1tNix4bW0xCisJbW92ZHFhCXhtbTEseG1tMgorCXBzcmxxCXhtbTIsMQorCXBzbGxxCXhtbTEsNTYKKwlweG9yCXhtbTAseG1tMgorCXBzcmxxCXhtbTIsNworCXB4b3IJeG1tMCx4bW0xCisJcHNsbHEJeG1tMSw3CisJcHhvcgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW01CisJcHhvcgl4bW0wLHhtbTEKKwltb3ZkcWEJeG1tMSx4bW01CisJcHNybHEJeG1tMiw2CisJcGFkZHEJeG1tNix4bW0wCisJbW92ZHFhCXhtbTAseG1tNQorCXBzcmxxCXhtbTEsMTkKKwlwc2xscQl4bW0wLDMKKwlweG9yCXhtbTIseG1tMQorCXBzcmxxCXhtbTEsNDIKKwlweG9yCXhtbTIseG1tMAorCXBzbGxxCXhtbTAsNDIKKwlweG9yCXhtbTIseG1tMQorCW1vdmRxYQl4bW0xLFtlZHhdCisJcHhvcgl4bW0yLHhtbTAKKwltb3ZkcWEJeG1tMCxbOTYrZWJwXQorCW1vdnEJbW0xLG1tNAorCXBhZGRxCXhtbTYseG1tMgorCW1vdnEJbW03LFtlZHgtMzJdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbZXNwXSxtbTQKKwlwYWRkcQl4bW0wLHhtbTYKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTAsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVszMitlc3BdLG1tMAorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzI0K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFs1Nitlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMAorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTAKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbNDArZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMCxtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0yLG1tMAorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsW2VzcF0KKwlwYWRkcQltbTIsbW02CisJbW92cQltbTYsWzgrZXNwXQorCW1vdnEJbW0xLG1tNAorCW1vdnEJbW03LFtlZHgtMjRdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbNTYrZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTIsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVsyNCtlc3BdLG1tMgorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzE2K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFs0OCtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMgorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTIKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbMzIrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzU2K2VzcF0KKwlwYWRkcQltbTAsbW02CisJbW92cQltbTYsW2VzcF0KKwltb3ZkcWEJW2VkeC0zMl0seG1tMAorCW1vdmRxYQl4bW0yLHhtbTQKKwltb3ZkcWEJeG1tMCx4bW0xCitkYgkxMDIsMTUsNTgsMTUsMjA3LDgKKwltb3ZkcWEJWzQ4K2VkeF0seG1tMworZGIJMTAyLDE1LDU4LDE1LDIxMSw4CisJbW92ZHFhCXhtbTMseG1tMQorCXBzcmxxCXhtbTEsNworCXBhZGRxCXhtbTcseG1tMgorCW1vdmRxYQl4bW0yLHhtbTMKKwlwc3JscQl4bW0zLDEKKwlwc2xscQl4bW0yLDU2CisJcHhvcgl4bW0xLHhtbTMKKwlwc3JscQl4bW0zLDcKKwlweG9yCXhtbTEseG1tMgorCXBzbGxxCXhtbTIsNworCXB4b3IJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNgorCXB4b3IJeG1tMSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNgorCXBzcmxxCXhtbTMsNgorCXBhZGRxCXhtbTcseG1tMQorCW1vdmRxYQl4bW0xLHhtbTYKKwlwc3JscQl4bW0yLDE5CisJcHNsbHEJeG1tMSwzCisJcHhvcgl4bW0zLHhtbTIKKwlwc3JscQl4bW0yLDQyCisJcHhvcgl4bW0zLHhtbTEKKwlwc2xscQl4bW0xLDQyCisJcHhvcgl4bW0zLHhtbTIKKwltb3ZkcWEJeG1tMixbMTYrZWR4XQorCXB4b3IJeG1tMyx4bW0xCisJbW92ZHFhCXhtbTEsWzExMitlYnBdCisJbW92cQltbTEsbW00CisJcGFkZHEJeG1tNyx4bW0zCisJbW92cQltbTcsW2VkeC0xNl0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVs0OCtlc3BdLG1tNAorCXBhZGRxCXhtbTEseG1tNworCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMCxtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzE2K2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbOCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbNDArZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTAKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0wCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzI0K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs0OCtlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFs1Nitlc3BdCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC04XQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzQwK2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0yLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbOCtlc3BdLG1tMgorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsW2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFszMitlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMgorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTIKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbMTYrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzQwK2VzcF0KKwlwYWRkcQltbTAsbW02CisJbW92cQltbTYsWzQ4K2VzcF0KKwltb3ZkcWEJW2VkeC0xNl0seG1tMQorCWxlYQllYnAsWzEyOCtlYnBdCisJZGVjCWVjeAorCWpueglORUFSIEwkMDA4MDBfNDdfc3NzZTMKKwltb3ZkcWEJeG1tMSxbZWJwXQorCWxlYQllYnAsW2VicC02NDBdCisJbW92ZHF1CXhtbTAsW2VieF0KK2RiCTEwMiwxNSw1NiwwLDE5MworCW1vdmRxYQl4bW0zLFtlYnBdCisJbW92ZHFhCXhtbTIseG1tMQorCW1vdmRxdQl4bW0xLFsxNitlYnhdCisJcGFkZHEJeG1tMyx4bW0wCitkYgkxMDIsMTUsNTYsMCwyMDIKKwltb3ZxCW1tMSxtbTQKKwltb3ZxCW1tNyxbZWR4LTEyOF0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVszMitlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMCxtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJW2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbNTYrZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzI0K2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0wCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMAorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFs4K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFszMitlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFs0MCtlc3BdCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC0xMjBdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbMjQrZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTIsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVs1Nitlc3BdLG1tMgorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzQ4K2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFsxNitlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMgorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTIKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzI0K2VzcF0KKwlwYWRkcQltbTAsbW02CisJbW92cQltbTYsWzMyK2VzcF0KKwltb3ZkcWEJW2VkeC0xMjhdLHhtbTMKKwltb3ZkcWEJeG1tNCxbMTYrZWJwXQorCW1vdmRxYQl4bW0zLHhtbTIKKwltb3ZkcXUJeG1tMixbMzIrZWJ4XQorCXBhZGRxCXhtbTQseG1tMQorZGIJMTAyLDE1LDU2LDAsMjExCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC0xMTJdCisJcHhvcgltbTUsbW02CisJcHNybHEJbW0xLDE0CisJbW92cQlbMTYrZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTAsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVs0OCtlc3BdLG1tMAorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzQwK2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFs4K2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0wCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMAorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFs1Nitlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTIsbW0wCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbMTYrZXNwXQorCXBhZGRxCW1tMixtbTYKKwltb3ZxCW1tNixbMjQrZXNwXQorCW1vdnEJbW0xLG1tNAorCW1vdnEJbW03LFtlZHgtMTA0XQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzgrZXNwXSxtbTQKKwlwYW5kCW1tNSxtbTQKKwlwc2xscQltbTQsMjMKKwlwYWRkcQltbTIsbW0zCisJbW92cQltbTMsbW0xCisJcHNybHEJbW0xLDQKKwlweG9yCW1tNSxtbTYKKwlweG9yCW1tMyxtbTQKKwlwc2xscQltbTQsMjMKKwlweG9yCW1tMyxtbTEKKwltb3ZxCVs0MCtlc3BdLG1tMgorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsWzMyK2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFtlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMgorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTIKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbNDgrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzgrZXNwXQorCXBhZGRxCW1tMCxtbTYKKwltb3ZxCW1tNixbMTYrZXNwXQorCW1vdmRxYQlbZWR4LTExMl0seG1tNAorCW1vdmRxYQl4bW01LFszMitlYnBdCisJbW92ZHFhCXhtbTQseG1tMworCW1vdmRxdQl4bW0zLFs0OCtlYnhdCisJcGFkZHEJeG1tNSx4bW0yCitkYgkxMDIsMTUsNTYsMCwyMjAKKwltb3ZxCW1tMSxtbTQKKwltb3ZxCW1tNyxbZWR4LTk2XQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJW2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0wLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbMzIrZXNwXSxtbTAKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFsyNCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbNTYrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTAKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0wCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzQwK2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFtlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFs4K2VzcF0KKwltb3ZxCW1tMSxtbTQKKwltb3ZxCW1tNyxbZWR4LTg4XQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzU2K2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0yLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbMjQrZXNwXSxtbTIKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFsxNitlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbNDgrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTIKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0yCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzMyK2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMCxtbTIKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs1Nitlc3BdCisJcGFkZHEJbW0wLG1tNgorCW1vdnEJbW02LFtlc3BdCisJbW92ZHFhCVtlZHgtOTZdLHhtbTUKKwltb3ZkcWEJeG1tNixbNDgrZWJwXQorCW1vdmRxYQl4bW01LHhtbTQKKwltb3ZkcXUJeG1tNCxbNjQrZWJ4XQorCXBhZGRxCXhtbTYseG1tMworZGIJMTAyLDE1LDU2LDAsMjI5CisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC04MF0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVs0OCtlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMCxtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzE2K2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbOCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbNDArZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTAKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0wCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzI0K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs0OCtlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFs1Nitlc3BdCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC03Ml0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVs0MCtlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMixtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzgrZXNwXSxtbTIKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbMzIrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTIKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0yCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzE2K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMCxtbTIKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs0MCtlc3BdCisJcGFkZHEJbW0wLG1tNgorCW1vdnEJbW02LFs0OCtlc3BdCisJbW92ZHFhCVtlZHgtODBdLHhtbTYKKwltb3ZkcWEJeG1tNyxbNjQrZWJwXQorCW1vdmRxYQl4bW02LHhtbTUKKwltb3ZkcXUJeG1tNSxbODArZWJ4XQorCXBhZGRxCXhtbTcseG1tNAorZGIJMTAyLDE1LDU2LDAsMjM4CisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC02NF0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVszMitlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMCxtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJW2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbNTYrZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzI0K2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0wCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMAorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFs4K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFszMitlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFs0MCtlc3BdCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC01Nl0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVsyNCtlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMixtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzU2K2VzcF0sbW0yCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbNDgrZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzE2K2VzcF0KKwlwYWRkcQltbTMsbW03CisJbW92cQltbTUsbW0yCisJcHNybHEJbW01LDI4CisJcGFkZHEJbW00LG1tMworCW1vdnEJbW02LG1tMgorCW1vdnEJbW03LG1tNQorCXBzbGxxCW1tNiwyNQorCW1vdnEJbW0xLFtlc3BdCisJcHNybHEJbW01LDYKKwlweG9yCW1tNyxtbTYKKwlwc2xscQltbTYsNQorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXBzcmxxCW1tNSw1CisJcHhvcgltbTcsbW02CisJcGFuZAltbTAsbW0yCisJcHNsbHEJbW02LDYKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMCxtbTEKKwlweG9yCW1tNixtbTcKKwltb3ZxCW1tNSxbMjQrZXNwXQorCXBhZGRxCW1tMCxtbTYKKwltb3ZxCW1tNixbMzIrZXNwXQorCW1vdmRxYQlbZWR4LTY0XSx4bW03CisJbW92ZHFhCVtlZHhdLHhtbTAKKwltb3ZkcWEJeG1tMCxbODArZWJwXQorCW1vdmRxYQl4bW03LHhtbTYKKwltb3ZkcXUJeG1tNixbOTYrZWJ4XQorCXBhZGRxCXhtbTAseG1tNQorZGIJMTAyLDE1LDU2LDAsMjQ3CisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC00OF0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVsxNitlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMCxtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzQ4K2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbNDArZXNwXQorCXB4b3IJbW0zLG1tMQorCXBzbGxxCW1tNCw0CisJcHhvcgltbTMsbW00CisJbW92cQltbTQsWzgrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTAKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0wCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzU2K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFsxNitlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFsyNCtlc3BdCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC00MF0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVs4K2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0yLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbNDArZXNwXSxtbTIKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFszMitlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTIKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0yCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzQ4K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMCxtbTIKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs4K2VzcF0KKwlwYWRkcQltbTAsbW02CisJbW92cQltbTYsWzE2K2VzcF0KKwltb3ZkcWEJW2VkeC00OF0seG1tMAorCW1vdmRxYQlbMTYrZWR4XSx4bW0xCisJbW92ZHFhCXhtbTEsWzk2K2VicF0KKwltb3ZkcWEJeG1tMCx4bW03CisJbW92ZHF1CXhtbTcsWzExMitlYnhdCisJcGFkZHEJeG1tMSx4bW02CitkYgkxMDIsMTUsNTYsMCwyNDgKKwltb3ZxCW1tMSxtbTQKKwltb3ZxCW1tNyxbZWR4LTMyXQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJW2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0wLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbMzIrZXNwXSxtbTAKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFsyNCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbNTYrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTAKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0wCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzQwK2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFtlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFs4K2VzcF0KKwltb3ZxCW1tMSxtbTQKKwltb3ZxCW1tNyxbZWR4LTI0XQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzU2K2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0yLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbMjQrZXNwXSxtbTIKKwlwYWRkcQltbTcsbW01CisJcHhvcgltbTMsbW00CisJcHNybHEJbW0xLDIzCisJcGFkZHEJbW03LFsxNitlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbNDgrZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTIKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0yCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzMyK2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTIsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMCxtbTIKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0wLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs1Nitlc3BdCisJcGFkZHEJbW0wLG1tNgorCW1vdnEJbW02LFtlc3BdCisJbW92ZHFhCVtlZHgtMzJdLHhtbTEKKwltb3ZkcWEJWzMyK2VkeF0seG1tMgorCW1vdmRxYQl4bW0yLFsxMTIrZWJwXQorCW1vdmRxYQl4bW0wLFtlZHhdCisJcGFkZHEJeG1tMix4bW03CisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC0xNl0KKwlweG9yCW1tNSxtbTYKKwlwc3JscQltbTEsMTQKKwltb3ZxCVs0OCtlc3BdLG1tNAorCXBhbmQJbW01LG1tNAorCXBzbGxxCW1tNCwyMworCXBhZGRxCW1tMCxtbTMKKwltb3ZxCW1tMyxtbTEKKwlwc3JscQltbTEsNAorCXB4b3IJbW01LG1tNgorCXB4b3IJbW0zLG1tNAorCXBzbGxxCW1tNCwyMworCXB4b3IJbW0zLG1tMQorCW1vdnEJWzE2K2VzcF0sbW0wCisJcGFkZHEJbW03LG1tNQorCXB4b3IJbW0zLG1tNAorCXBzcmxxCW1tMSwyMworCXBhZGRxCW1tNyxbOCtlc3BdCisJcHhvcgltbTMsbW0xCisJcHNsbHEJbW00LDQKKwlweG9yCW1tMyxtbTQKKwltb3ZxCW1tNCxbNDArZXNwXQorCXBhZGRxCW1tMyxtbTcKKwltb3ZxCW1tNSxtbTAKKwlwc3JscQltbTUsMjgKKwlwYWRkcQltbTQsbW0zCisJbW92cQltbTYsbW0wCisJbW92cQltbTcsbW01CisJcHNsbHEJbW02LDI1CisJbW92cQltbTEsWzI0K2VzcF0KKwlwc3JscQltbTUsNgorCXB4b3IJbW03LG1tNgorCXBzbGxxCW1tNiw1CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHNybHEJbW01LDUKKwlweG9yCW1tNyxtbTYKKwlwYW5kCW1tMixtbTAKKwlwc2xscQltbTYsNgorCXB4b3IJbW03LG1tNQorCXB4b3IJbW0yLG1tMQorCXB4b3IJbW02LG1tNworCW1vdnEJbW01LFs0OCtlc3BdCisJcGFkZHEJbW0yLG1tNgorCW1vdnEJbW02LFs1Nitlc3BdCisJbW92cQltbTEsbW00CisJbW92cQltbTcsW2VkeC04XQorCXB4b3IJbW01LG1tNgorCXBzcmxxCW1tMSwxNAorCW1vdnEJWzQwK2VzcF0sbW00CisJcGFuZAltbTUsbW00CisJcHNsbHEJbW00LDIzCisJcGFkZHEJbW0yLG1tMworCW1vdnEJbW0zLG1tMQorCXBzcmxxCW1tMSw0CisJcHhvcgltbTUsbW02CisJcHhvcgltbTMsbW00CisJcHNsbHEJbW00LDIzCisJcHhvcgltbTMsbW0xCisJbW92cQlbOCtlc3BdLG1tMgorCXBhZGRxCW1tNyxtbTUKKwlweG9yCW1tMyxtbTQKKwlwc3JscQltbTEsMjMKKwlwYWRkcQltbTcsW2VzcF0KKwlweG9yCW1tMyxtbTEKKwlwc2xscQltbTQsNAorCXB4b3IJbW0zLG1tNAorCW1vdnEJbW00LFszMitlc3BdCisJcGFkZHEJbW0zLG1tNworCW1vdnEJbW01LG1tMgorCXBzcmxxCW1tNSwyOAorCXBhZGRxCW1tNCxtbTMKKwltb3ZxCW1tNixtbTIKKwltb3ZxCW1tNyxtbTUKKwlwc2xscQltbTYsMjUKKwltb3ZxCW1tMSxbMTYrZXNwXQorCXBzcmxxCW1tNSw2CisJcHhvcgltbTcsbW02CisJcHNsbHEJbW02LDUKKwlweG9yCW1tNyxtbTUKKwlweG9yCW1tMixtbTEKKwlwc3JscQltbTUsNQorCXB4b3IJbW03LG1tNgorCXBhbmQJbW0wLG1tMgorCXBzbGxxCW1tNiw2CisJcHhvcgltbTcsbW01CisJcHhvcgltbTAsbW0xCisJcHhvcgltbTYsbW03CisJbW92cQltbTUsWzQwK2VzcF0KKwlwYWRkcQltbTAsbW02CisJbW92cQltbTYsWzQ4K2VzcF0KKwltb3ZkcWEJW2VkeC0xNl0seG1tMgorCW1vdnEJbW0xLFs4K2VzcF0KKwlwYWRkcQltbTAsbW0zCisJbW92cQltbTMsWzI0K2VzcF0KKwltb3ZxCW1tNyxbNTYrZXNwXQorCXB4b3IJbW0yLG1tMQorCXBhZGRxCW1tMCxbZXNpXQorCXBhZGRxCW1tMSxbOCtlc2ldCisJcGFkZHEJbW0yLFsxNitlc2ldCisJcGFkZHEJbW0zLFsyNCtlc2ldCisJcGFkZHEJbW00LFszMitlc2ldCisJcGFkZHEJbW01LFs0MCtlc2ldCisJcGFkZHEJbW02LFs0OCtlc2ldCisJcGFkZHEJbW03LFs1Nitlc2ldCisJbW92cQlbZXNpXSxtbTAKKwltb3ZxCVs4K2VzaV0sbW0xCisJbW92cQlbMTYrZXNpXSxtbTIKKwltb3ZxCVsyNCtlc2ldLG1tMworCW1vdnEJWzMyK2VzaV0sbW00CisJbW92cQlbNDArZXNpXSxtbTUKKwltb3ZxCVs0OCtlc2ldLG1tNgorCW1vdnEJWzU2K2VzaV0sbW03CisJY21wCWVkaSxlYXgKKwlqYglORUFSIEwkMDA3bG9vcF9zc3NlMworCW1vdgllc3AsRFdPUkQgWzc2K2VkeF0KKwllbW1zCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorYWxpZ24JMTYKK0wkMDAybG9vcF94ODY6CisJbW92CWVheCxEV09SRCBbZWRpXQorCW1vdgllYngsRFdPUkQgWzQrZWRpXQorCW1vdgllY3gsRFdPUkQgWzgrZWRpXQorCW1vdgllZHgsRFdPUkQgWzEyK2VkaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwlwdXNoCWVheAorCXB1c2gJZWJ4CisJcHVzaAllY3gKKwlwdXNoCWVkeAorCW1vdgllYXgsRFdPUkQgWzE2K2VkaV0KKwltb3YJZWJ4LERXT1JEIFsyMCtlZGldCisJbW92CWVjeCxEV09SRCBbMjQrZWRpXQorCW1vdgllZHgsRFdPUkQgWzI4K2VkaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwlwdXNoCWVheAorCXB1c2gJZWJ4CisJcHVzaAllY3gKKwlwdXNoCWVkeAorCW1vdgllYXgsRFdPUkQgWzMyK2VkaV0KKwltb3YJZWJ4LERXT1JEIFszNitlZGldCisJbW92CWVjeCxEV09SRCBbNDArZWRpXQorCW1vdgllZHgsRFdPUkQgWzQ0K2VkaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwlwdXNoCWVheAorCXB1c2gJZWJ4CisJcHVzaAllY3gKKwlwdXNoCWVkeAorCW1vdgllYXgsRFdPUkQgWzQ4K2VkaV0KKwltb3YJZWJ4LERXT1JEIFs1MitlZGldCisJbW92CWVjeCxEV09SRCBbNTYrZWRpXQorCW1vdgllZHgsRFdPUkQgWzYwK2VkaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwlwdXNoCWVheAorCXB1c2gJZWJ4CisJcHVzaAllY3gKKwlwdXNoCWVkeAorCW1vdgllYXgsRFdPUkQgWzY0K2VkaV0KKwltb3YJZWJ4LERXT1JEIFs2OCtlZGldCisJbW92CWVjeCxEV09SRCBbNzIrZWRpXQorCW1vdgllZHgsRFdPUkQgWzc2K2VkaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwlwdXNoCWVheAorCXB1c2gJZWJ4CisJcHVzaAllY3gKKwlwdXNoCWVkeAorCW1vdgllYXgsRFdPUkQgWzgwK2VkaV0KKwltb3YJZWJ4LERXT1JEIFs4NCtlZGldCisJbW92CWVjeCxEV09SRCBbODgrZWRpXQorCW1vdgllZHgsRFdPUkQgWzkyK2VkaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwlwdXNoCWVheAorCXB1c2gJZWJ4CisJcHVzaAllY3gKKwlwdXNoCWVkeAorCW1vdgllYXgsRFdPUkQgWzk2K2VkaV0KKwltb3YJZWJ4LERXT1JEIFsxMDArZWRpXQorCW1vdgllY3gsRFdPUkQgWzEwNCtlZGldCisJbW92CWVkeCxEV09SRCBbMTA4K2VkaV0KKwlic3dhcAllYXgKKwlic3dhcAllYngKKwlic3dhcAllY3gKKwlic3dhcAllZHgKKwlwdXNoCWVheAorCXB1c2gJZWJ4CisJcHVzaAllY3gKKwlwdXNoCWVkeAorCW1vdgllYXgsRFdPUkQgWzExMitlZGldCisJbW92CWVieCxEV09SRCBbMTE2K2VkaV0KKwltb3YJZWN4LERXT1JEIFsxMjArZWRpXQorCW1vdgllZHgsRFdPUkQgWzEyNCtlZGldCisJYnN3YXAJZWF4CisJYnN3YXAJZWJ4CisJYnN3YXAJZWN4CisJYnN3YXAJZWR4CisJcHVzaAllYXgKKwlwdXNoCWVieAorCXB1c2gJZWN4CisJcHVzaAllZHgKKwlhZGQJZWRpLDEyOAorCXN1Ygllc3AsNzIKKwltb3YJRFdPUkQgWzIwNCtlc3BdLGVkaQorCWxlYQllZGksWzgrZXNwXQorCW1vdgllY3gsMTYKK2RkCTI3ODQyMjkwMDEKK2FsaWduCTE2CitMJDAwOTAwXzE1X3g4NjoKKwltb3YJZWN4LERXT1JEIFs0MCtlc3BdCisJbW92CWVkeCxEV09SRCBbNDQrZXNwXQorCW1vdgllc2ksZWN4CisJc2hyCWVjeCw5CisJbW92CWVkaSxlZHgKKwlzaHIJZWR4LDkKKwltb3YJZWJ4LGVjeAorCXNobAllc2ksMTQKKwltb3YJZWF4LGVkeAorCXNobAllZGksMTQKKwl4b3IJZWJ4LGVzaQorCXNocgllY3gsNQorCXhvcgllYXgsZWRpCisJc2hyCWVkeCw1CisJeG9yCWVheCxlY3gKKwlzaGwJZXNpLDQKKwl4b3IJZWJ4LGVkeAorCXNobAllZGksNAorCXhvcgllYngsZXNpCisJc2hyCWVjeCw0CisJeG9yCWVheCxlZGkKKwlzaHIJZWR4LDQKKwl4b3IJZWF4LGVjeAorCXNobAllc2ksNQorCXhvcgllYngsZWR4CisJc2hsCWVkaSw1CisJeG9yCWVheCxlc2kKKwl4b3IJZWJ4LGVkaQorCW1vdgllY3gsRFdPUkQgWzQ4K2VzcF0KKwltb3YJZWR4LERXT1JEIFs1Mitlc3BdCisJbW92CWVzaSxEV09SRCBbNTYrZXNwXQorCW1vdgllZGksRFdPUkQgWzYwK2VzcF0KKwlhZGQJZWF4LERXT1JEIFs2NCtlc3BdCisJYWRjCWVieCxEV09SRCBbNjgrZXNwXQorCXhvcgllY3gsZXNpCisJeG9yCWVkeCxlZGkKKwlhbmQJZWN4LERXT1JEIFs0MCtlc3BdCisJYW5kCWVkeCxEV09SRCBbNDQrZXNwXQorCWFkZAllYXgsRFdPUkQgWzE5Mitlc3BdCisJYWRjCWVieCxEV09SRCBbMTk2K2VzcF0KKwl4b3IJZWN4LGVzaQorCXhvcgllZHgsZWRpCisJbW92CWVzaSxEV09SRCBbZWJwXQorCW1vdgllZGksRFdPUkQgWzQrZWJwXQorCWFkZAllYXgsZWN4CisJYWRjCWVieCxlZHgKKwltb3YJZWN4LERXT1JEIFszMitlc3BdCisJbW92CWVkeCxEV09SRCBbMzYrZXNwXQorCWFkZAllYXgsZXNpCisJYWRjCWVieCxlZGkKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJYWRkCWVheCxlY3gKKwlhZGMJZWJ4LGVkeAorCW1vdgllY3gsRFdPUkQgWzgrZXNwXQorCW1vdgllZHgsRFdPUkQgWzEyK2VzcF0KKwltb3YJRFdPUkQgWzMyK2VzcF0sZWF4CisJbW92CURXT1JEIFszNitlc3BdLGVieAorCW1vdgllc2ksZWN4CisJc2hyCWVjeCwyCisJbW92CWVkaSxlZHgKKwlzaHIJZWR4LDIKKwltb3YJZWJ4LGVjeAorCXNobAllc2ksNAorCW1vdgllYXgsZWR4CisJc2hsCWVkaSw0CisJeG9yCWVieCxlc2kKKwlzaHIJZWN4LDUKKwl4b3IJZWF4LGVkaQorCXNocgllZHgsNQorCXhvcgllYngsZWN4CisJc2hsCWVzaSwyMQorCXhvcgllYXgsZWR4CisJc2hsCWVkaSwyMQorCXhvcgllYXgsZXNpCisJc2hyCWVjeCwyMQorCXhvcgllYngsZWRpCisJc2hyCWVkeCwyMQorCXhvcgllYXgsZWN4CisJc2hsCWVzaSw1CisJeG9yCWVieCxlZHgKKwlzaGwJZWRpLDUKKwl4b3IJZWF4LGVzaQorCXhvcgllYngsZWRpCisJbW92CWVjeCxEV09SRCBbOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMTIrZXNwXQorCW1vdgllc2ksRFdPUkQgWzE2K2VzcF0KKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJYWRkCWVheCxEV09SRCBbZXNwXQorCWFkYwllYngsRFdPUkQgWzQrZXNwXQorCW9yCWVjeCxlc2kKKwlvcgllZHgsZWRpCisJYW5kCWVjeCxEV09SRCBbMjQrZXNwXQorCWFuZAllZHgsRFdPUkQgWzI4K2VzcF0KKwlhbmQJZXNpLERXT1JEIFs4K2VzcF0KKwlhbmQJZWRpLERXT1JEIFsxMitlc3BdCisJb3IJZWN4LGVzaQorCW9yCWVkeCxlZGkKKwlhZGQJZWF4LGVjeAorCWFkYwllYngsZWR4CisJbW92CURXT1JEIFtlc3BdLGVheAorCW1vdglEV09SRCBbNCtlc3BdLGVieAorCW1vdglkbCxCWVRFIFtlYnBdCisJc3ViCWVzcCw4CisJbGVhCWVicCxbOCtlYnBdCisJY21wCWRsLDE0OAorCWpuZQlORUFSIEwkMDA5MDBfMTVfeDg2CithbGlnbgkxNgorTCQwMTAxNl83OV94ODY6CisJbW92CWVjeCxEV09SRCBbMzEyK2VzcF0KKwltb3YJZWR4LERXT1JEIFszMTYrZXNwXQorCW1vdgllc2ksZWN4CisJc2hyCWVjeCwxCisJbW92CWVkaSxlZHgKKwlzaHIJZWR4LDEKKwltb3YJZWF4LGVjeAorCXNobAllc2ksMjQKKwltb3YJZWJ4LGVkeAorCXNobAllZGksMjQKKwl4b3IJZWJ4LGVzaQorCXNocgllY3gsNgorCXhvcgllYXgsZWRpCisJc2hyCWVkeCw2CisJeG9yCWVheCxlY3gKKwlzaGwJZXNpLDcKKwl4b3IJZWJ4LGVkeAorCXNobAllZGksMQorCXhvcgllYngsZXNpCisJc2hyCWVjeCwxCisJeG9yCWVheCxlZGkKKwlzaHIJZWR4LDEKKwl4b3IJZWF4LGVjeAorCXNobAllZGksNgorCXhvcgllYngsZWR4CisJeG9yCWVheCxlZGkKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJbW92CWVjeCxEV09SRCBbMjA4K2VzcF0KKwltb3YJZWR4LERXT1JEIFsyMTIrZXNwXQorCW1vdgllc2ksZWN4CisJc2hyCWVjeCw2CisJbW92CWVkaSxlZHgKKwlzaHIJZWR4LDYKKwltb3YJZWF4LGVjeAorCXNobAllc2ksMworCW1vdgllYngsZWR4CisJc2hsCWVkaSwzCisJeG9yCWVheCxlc2kKKwlzaHIJZWN4LDEzCisJeG9yCWVieCxlZGkKKwlzaHIJZWR4LDEzCisJeG9yCWVheCxlY3gKKwlzaGwJZXNpLDEwCisJeG9yCWVieCxlZHgKKwlzaGwJZWRpLDEwCisJeG9yCWVieCxlc2kKKwlzaHIJZWN4LDEwCisJeG9yCWVheCxlZGkKKwlzaHIJZWR4LDEwCisJeG9yCWVieCxlY3gKKwlzaGwJZWRpLDEzCisJeG9yCWVheCxlZHgKKwl4b3IJZWF4LGVkaQorCW1vdgllY3gsRFdPUkQgWzMyMCtlc3BdCisJbW92CWVkeCxEV09SRCBbMzI0K2VzcF0KKwlhZGQJZWF4LERXT1JEIFtlc3BdCisJYWRjCWVieCxEV09SRCBbNCtlc3BdCisJbW92CWVzaSxEV09SRCBbMjQ4K2VzcF0KKwltb3YJZWRpLERXT1JEIFsyNTIrZXNwXQorCWFkZAllYXgsZWN4CisJYWRjCWVieCxlZHgKKwlhZGQJZWF4LGVzaQorCWFkYwllYngsZWRpCisJbW92CURXT1JEIFsxOTIrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzE5Nitlc3BdLGVieAorCW1vdgllY3gsRFdPUkQgWzQwK2VzcF0KKwltb3YJZWR4LERXT1JEIFs0NCtlc3BdCisJbW92CWVzaSxlY3gKKwlzaHIJZWN4LDkKKwltb3YJZWRpLGVkeAorCXNocgllZHgsOQorCW1vdgllYngsZWN4CisJc2hsCWVzaSwxNAorCW1vdgllYXgsZWR4CisJc2hsCWVkaSwxNAorCXhvcgllYngsZXNpCisJc2hyCWVjeCw1CisJeG9yCWVheCxlZGkKKwlzaHIJZWR4LDUKKwl4b3IJZWF4LGVjeAorCXNobAllc2ksNAorCXhvcgllYngsZWR4CisJc2hsCWVkaSw0CisJeG9yCWVieCxlc2kKKwlzaHIJZWN4LDQKKwl4b3IJZWF4LGVkaQorCXNocgllZHgsNAorCXhvcgllYXgsZWN4CisJc2hsCWVzaSw1CisJeG9yCWVieCxlZHgKKwlzaGwJZWRpLDUKKwl4b3IJZWF4LGVzaQorCXhvcgllYngsZWRpCisJbW92CWVjeCxEV09SRCBbNDgrZXNwXQorCW1vdgllZHgsRFdPUkQgWzUyK2VzcF0KKwltb3YJZXNpLERXT1JEIFs1Nitlc3BdCisJbW92CWVkaSxEV09SRCBbNjArZXNwXQorCWFkZAllYXgsRFdPUkQgWzY0K2VzcF0KKwlhZGMJZWJ4LERXT1JEIFs2OCtlc3BdCisJeG9yCWVjeCxlc2kKKwl4b3IJZWR4LGVkaQorCWFuZAllY3gsRFdPUkQgWzQwK2VzcF0KKwlhbmQJZWR4LERXT1JEIFs0NCtlc3BdCisJYWRkCWVheCxEV09SRCBbMTkyK2VzcF0KKwlhZGMJZWJ4LERXT1JEIFsxOTYrZXNwXQorCXhvcgllY3gsZXNpCisJeG9yCWVkeCxlZGkKKwltb3YJZXNpLERXT1JEIFtlYnBdCisJbW92CWVkaSxEV09SRCBbNCtlYnBdCisJYWRkCWVheCxlY3gKKwlhZGMJZWJ4LGVkeAorCW1vdgllY3gsRFdPUkQgWzMyK2VzcF0KKwltb3YJZWR4LERXT1JEIFszNitlc3BdCisJYWRkCWVheCxlc2kKKwlhZGMJZWJ4LGVkaQorCW1vdglEV09SRCBbZXNwXSxlYXgKKwltb3YJRFdPUkQgWzQrZXNwXSxlYngKKwlhZGQJZWF4LGVjeAorCWFkYwllYngsZWR4CisJbW92CWVjeCxEV09SRCBbOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMTIrZXNwXQorCW1vdglEV09SRCBbMzIrZXNwXSxlYXgKKwltb3YJRFdPUkQgWzM2K2VzcF0sZWJ4CisJbW92CWVzaSxlY3gKKwlzaHIJZWN4LDIKKwltb3YJZWRpLGVkeAorCXNocgllZHgsMgorCW1vdgllYngsZWN4CisJc2hsCWVzaSw0CisJbW92CWVheCxlZHgKKwlzaGwJZWRpLDQKKwl4b3IJZWJ4LGVzaQorCXNocgllY3gsNQorCXhvcgllYXgsZWRpCisJc2hyCWVkeCw1CisJeG9yCWVieCxlY3gKKwlzaGwJZXNpLDIxCisJeG9yCWVheCxlZHgKKwlzaGwJZWRpLDIxCisJeG9yCWVheCxlc2kKKwlzaHIJZWN4LDIxCisJeG9yCWVieCxlZGkKKwlzaHIJZWR4LDIxCisJeG9yCWVheCxlY3gKKwlzaGwJZXNpLDUKKwl4b3IJZWJ4LGVkeAorCXNobAllZGksNQorCXhvcgllYXgsZXNpCisJeG9yCWVieCxlZGkKKwltb3YJZWN4LERXT1JEIFs4K2VzcF0KKwltb3YJZWR4LERXT1JEIFsxMitlc3BdCisJbW92CWVzaSxEV09SRCBbMTYrZXNwXQorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwlhZGQJZWF4LERXT1JEIFtlc3BdCisJYWRjCWVieCxEV09SRCBbNCtlc3BdCisJb3IJZWN4LGVzaQorCW9yCWVkeCxlZGkKKwlhbmQJZWN4LERXT1JEIFsyNCtlc3BdCisJYW5kCWVkeCxEV09SRCBbMjgrZXNwXQorCWFuZAllc2ksRFdPUkQgWzgrZXNwXQorCWFuZAllZGksRFdPUkQgWzEyK2VzcF0KKwlvcgllY3gsZXNpCisJb3IJZWR4LGVkaQorCWFkZAllYXgsZWN4CisJYWRjCWVieCxlZHgKKwltb3YJRFdPUkQgW2VzcF0sZWF4CisJbW92CURXT1JEIFs0K2VzcF0sZWJ4CisJbW92CWRsLEJZVEUgW2VicF0KKwlzdWIJZXNwLDgKKwlsZWEJZWJwLFs4K2VicF0KKwljbXAJZGwsMjMKKwlqbmUJTkVBUiBMJDAxMDE2Xzc5X3g4NgorCW1vdgllc2ksRFdPUkQgWzg0MCtlc3BdCisJbW92CWVkaSxEV09SRCBbODQ0K2VzcF0KKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbW92CWVieCxEV09SRCBbNCtlc2ldCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVkeCxEV09SRCBbMTIrZXNpXQorCWFkZAllYXgsRFdPUkQgWzgrZXNwXQorCWFkYwllYngsRFdPUkQgWzEyK2VzcF0KKwltb3YJRFdPUkQgW2VzaV0sZWF4CisJbW92CURXT1JEIFs0K2VzaV0sZWJ4CisJYWRkCWVjeCxEV09SRCBbMTYrZXNwXQorCWFkYwllZHgsRFdPUkQgWzIwK2VzcF0KKwltb3YJRFdPUkQgWzgrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzEyK2VzaV0sZWR4CisJbW92CWVheCxEV09SRCBbMTYrZXNpXQorCW1vdgllYngsRFdPUkQgWzIwK2VzaV0KKwltb3YJZWN4LERXT1JEIFsyNCtlc2ldCisJbW92CWVkeCxEV09SRCBbMjgrZXNpXQorCWFkZAllYXgsRFdPUkQgWzI0K2VzcF0KKwlhZGMJZWJ4LERXT1JEIFsyOCtlc3BdCisJbW92CURXT1JEIFsxNitlc2ldLGVheAorCW1vdglEV09SRCBbMjArZXNpXSxlYngKKwlhZGQJZWN4LERXT1JEIFszMitlc3BdCisJYWRjCWVkeCxEV09SRCBbMzYrZXNwXQorCW1vdglEV09SRCBbMjQrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzI4K2VzaV0sZWR4CisJbW92CWVheCxEV09SRCBbMzIrZXNpXQorCW1vdgllYngsRFdPUkQgWzM2K2VzaV0KKwltb3YJZWN4LERXT1JEIFs0MCtlc2ldCisJbW92CWVkeCxEV09SRCBbNDQrZXNpXQorCWFkZAllYXgsRFdPUkQgWzQwK2VzcF0KKwlhZGMJZWJ4LERXT1JEIFs0NCtlc3BdCisJbW92CURXT1JEIFszMitlc2ldLGVheAorCW1vdglEV09SRCBbMzYrZXNpXSxlYngKKwlhZGQJZWN4LERXT1JEIFs0OCtlc3BdCisJYWRjCWVkeCxEV09SRCBbNTIrZXNwXQorCW1vdglEV09SRCBbNDArZXNpXSxlY3gKKwltb3YJRFdPUkQgWzQ0K2VzaV0sZWR4CisJbW92CWVheCxEV09SRCBbNDgrZXNpXQorCW1vdgllYngsRFdPUkQgWzUyK2VzaV0KKwltb3YJZWN4LERXT1JEIFs1Nitlc2ldCisJbW92CWVkeCxEV09SRCBbNjArZXNpXQorCWFkZAllYXgsRFdPUkQgWzU2K2VzcF0KKwlhZGMJZWJ4LERXT1JEIFs2MCtlc3BdCisJbW92CURXT1JEIFs0OCtlc2ldLGVheAorCW1vdglEV09SRCBbNTIrZXNpXSxlYngKKwlhZGQJZWN4LERXT1JEIFs2NCtlc3BdCisJYWRjCWVkeCxEV09SRCBbNjgrZXNwXQorCW1vdglEV09SRCBbNTYrZXNpXSxlY3gKKwltb3YJRFdPUkQgWzYwK2VzaV0sZWR4CisJYWRkCWVzcCw4NDAKKwlzdWIJZWJwLDY0MAorCWNtcAllZGksRFdPUkQgWzgrZXNwXQorCWpiCU5FQVIgTCQwMDJsb29wX3g4NgorCW1vdgllc3AsRFdPUkQgWzEyK2VzcF0KKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CithbGlnbgk2NAorTCQwMDFLNTEyOgorZGQJMzYwOTc2NzQ1OCwxMTE2MzUyNDA4CitkZAk2MDI4OTE3MjUsMTg5OTQ0NzQ0MQorZGQJMzk2NDQ4NDM5OSwzMDQ5MzIzNDcxCitkZAkyMTczMjk1NTQ4LDM5MjEwMDk1NzMKK2RkCTQwODE2Mjg0NzIsOTYxOTg3MTYzCitkZAkzMDUzODM0MjY1LDE1MDg5NzA5OTMKK2RkCTI5Mzc2NzE1NzksMjQ1MzYzNTc0OAorZGQJMzY2NDYwOTU2MCwyODcwNzYzMjIxCitkZAkyNzM0ODgzMzk0LDM2MjQzODEwODAKK2RkCTExNjQ5OTY1NDIsMzEwNTk4NDAxCitkZAkxMzIzNjEwNzY0LDYwNzIyNTI3OAorZGQJMzU5MDMwNDk5NCwxNDI2ODgxOTg3CitkZAk0MDY4MTgyMzgzLDE5MjUwNzgzODgKK2RkCTk5MTMzNjExMywyMTYyMDc4MjA2CitkZAk2MzM4MDMzMTcsMjYxNDg4ODEwMworZGQJMzQ3OTc3NDg2OCwzMjQ4MjIyNTgwCitkZAkyNjY2NjEzNDU4LDM4MzUzOTA0MDEKK2RkCTk0NDcxMTEzOSw0MDIyMjI0Nzc0CitkZAkyMzQxMjYyNzczLDI2NDM0NzA3OAorZGQJMjAwNzgwMDkzMyw2MDQ4MDc2MjgKK2RkCTE0OTU5OTA5MDEsNzcwMjU1OTgzCitkZAkxODU2NDMxMjM1LDEyNDkxNTAxMjIKK2RkCTMxNzUyMTgxMzIsMTU1NTA4MTY5MgorZGQJMjE5ODk1MDgzNywxOTk2MDY0OTg2CitkZAkzOTk5NzE5MzM5LDI1NTQyMjA4ODIKK2RkCTc2Njc4NDAxNiwyODIxODM0MzQ5CitkZAkyNTY2NTk0ODc5LDI5NTI5OTY4MDgKK2RkCTMyMDMzMzc5NTYsMzIxMDMxMzY3MQorZGQJMTAzNDQ1NzAyNiwzMzM2NTcxODkxCitkZAkyNDY2OTQ4OTAxLDM1ODQ1Mjg3MTEKK2RkCTM3NTgzMjYzODMsMTEzOTI2OTkzCitkZAkxNjg3MTc5MzYsMzM4MjQxODk1CitkZAkxMTg4MTc5OTY0LDY2NjMwNzIwNQorZGQJMTU0NjA0NTczNCw3NzM1Mjk5MTIKK2RkCTE1MjI4MDU0ODUsMTI5NDc1NzM3MgorZGQJMjY0MzgzMzgyMywxMzk2MTgyMjkxCitkZAkyMzQzNTI3MzkwLDE2OTUxODM3MDAKK2RkCTEwMTQ0Nzc0ODAsMTk4NjY2MTA1MQorZGQJMTIwNjc1OTE0MiwyMTc3MDI2MzUwCitkZAkzNDQwNzc2MjcsMjQ1Njk1NjAzNworZGQJMTI5MDg2MzQ2MCwyNzMwNDg1OTIxCitkZAkzMTU4NDU0MjczLDI4MjAzMDI0MTEKK2RkCTM1MDU5NTI2NTcsMzI1OTczMDgwMAorZGQJMTA2MjE3MDA4LDMzNDU3NjQ3NzEKK2RkCTM2MDYwMDgzNDQsMzUxNjA2NTgxNworZGQJMTQzMjcyNTc3NiwzNjAwMzUyODA0CitkZAkxNDY3MDMxNTk0LDQwOTQ1NzE5MDkKK2RkCTg1MTE2OTcyMCwyNzU0MjMzNDQKK2RkCTMxMDA4MjM3NTIsNDMwMjI3NzM0CitkZAkxMzYzMjU4MTk1LDUwNjk0ODYxNgorZGQJMzc1MDY4NTU5Myw2NTkwNjA1NTYKK2RkCTM3ODUwNTAyODAsODgzOTk3ODc3CitkZAkzMzE4MzA3NDI3LDk1ODEzOTU3MQorZGQJMzgxMjcyMzQwMywxMzIyODIyMjE4CitkZAkyMDAzMDM0OTk1LDE1MzcwMDIwNjMKK2RkCTM2MDIwMzY4OTksMTc0Nzg3Mzc3OQorZGQJMTU3NTk5MDAxMiwxOTU1NTYyMjIyCitkZAkxMTI1NTkyOTI4LDIwMjQxMDQ4MTUKK2RkCTI3MTY5MDQzMDYsMjIyNzczMDQ1MgorZGQJNDQyNzc2MDQ0LDIzNjE4NTI0MjQKK2RkCTU5MzY5ODM0NCwyNDI4NDM2NDc0CitkZAkzNzMzMTEwMjQ5LDI3NTY3MzQxODcKK2RkCTI5OTkzNTE1NzMsMzIwNDAzMTQ3OQorZGQJMzgxNTkyMDQyNywzMzI5MzI1Mjk4CitkZAkzOTI4MzgzOTAwLDMzOTE1Njk2MTQKK2RkCTU2NjI4MDcxMSwzNTE1MjY3MjcxCitkZAkzNDU0MDY5NTM0LDM5NDAxODc2MDYKK2RkCTQwMDAyMzk5OTIsNDExODYzMDI3MQorZGQJMTkxNDEzODU1NCwxMTY0MTg0NzQKK2RkCTI3MzEwNTUyNzAsMTc0MjkyNDIxCitkZAkzMjAzOTkzMDA2LDI4OTM4MDM1NgorZGQJMzIwNjIwMzE1LDQ2MDM5MzI2OQorZGQJNTg3NDk2ODM2LDY4NTQ3MTczMworZGQJMTA4Njc5Mjg1MSw4NTIxNDI5NzEKK2RkCTM2NTU0MzEwMCwxMDE3MDM2Mjk4CitkZAkyNjE4Mjk3Njc2LDExMjYwMDA1ODAKK2RkCTM0MDk4NTUxNTgsMTI4ODAzMzQ3MAorZGQJNDIzNDUwOTg2NiwxNTAxNTA1OTQ4CitkZAk5ODcxNjc0NjgsMTYwNzE2NzkxNQorZGQJMTI0NjE4OTU5MSwxODE2NDAyMzE2CitkZAk2NzQzODA4Nyw2NjA1MQorZGQJMjAyMTgyMTU5LDEzNDgxMDEyMworZGIJODMsNzIsNjUsNTMsNDksNTAsMzIsOTgsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDExNCw5NworZGIJMTEwLDExNSwxMDIsMTExLDExNCwxMDksMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDQ0LDMyCitkYgk2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcKK2RiCTExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMKK2RiCTYyLDAKK3NlZ21lbnQJLmJzcworY29tbW9uCV9PUEVOU1NMX2lhMzJjYXBfUCAxNgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUvdnBhZXMteDg2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhiMDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Ni5hc20KQEAgLTAsMCArMSw2NDkgQEAKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxvYmoKK3NlY3Rpb24JY29kZQl1c2UzMiBjbGFzcz1jb2RlIGFsaWduPTY0CislZWxpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyx3aW4zMgorJWlmZGVmIF9fWUFTTV9WRVJTSU9OX0lEX18KKyVpZiBfX1lBU01fVkVSU0lPTl9JRF9fIDwgMDEwMTAwMDBoCislZXJyb3IgeWFzbSB2ZXJzaW9uIDEuMS4wIG9yIGxhdGVyIG5lZWRlZC4KKyVlbmRpZgorOyBZYXNtIGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgLjAwIGFuZCBjb21wbGFpbnMgYWJvdXQgcmVkZWZpbmluZyBpdC4KKzsgaHR0cHM6Ly93d3cudG9ydGFsbC5uZXQvcHJvamVjdHMveWFzbS9tYW51YWwvaHRtbC9vYmpmbXQtd2luMzItc2FmZXNlaC5odG1sCislZWxzZQorJEBmZWF0LjAwIGVxdSAxCislZW5kaWYKK3NlY3Rpb24JLnRleHQJY29kZSBhbGlnbj02NAorJWVsc2UKK3NlY3Rpb24JLnRleHQJY29kZQorJWVuZGlmCithbGlnbgk2NAorTCRfdnBhZXNfY29uc3RzOgorZGQJMjE4NjI4NDgwLDIzNTIxMDI1NSwxNjg0OTYxMzAsNjc1NjgzOTMKK2RkCTI1MjM4MTA1NiwxNzA0MTkyNiwzMzg4NDE2OSw1MTE4NzIxMgorZGQJMjUyNjQ1MTM1LDI1MjY0NTEzNSwyNTI2NDUxMzUsMjUyNjQ1MTM1CitkZAkxNTEyNzMwNjI0LDMyNjY1MDQ4NTYsMTM3Nzk5MDY2NCwzNDAxMjQ0ODE2CitkZAk4MzAyMjk3NjAsMTI3NTE0NjM2NSwyOTY5NDIyOTc3LDM0NDc3NjM0NTIKK2RkCTM0MTEwMzM2MDAsMjk3OTc4MzA1NSwzMzgzNTk2MjAsMjc4Mjg4NjUxMAorZGQJNDIwOTEyNDA5Niw5MDc1OTY4MjEsMjIxMTc0MjU1LDEwMDYwOTU1NTMKK2RkCTE5MTk2NDE2MCwzNzk5Njg0MDM4LDMxNjQwOTAzMTcsMTU4OTExMTEyNQorZGQJMTgyNTI4MjU2LDE3NzcwNDM1MjAsMjg3NzQzMjY1MCwzMjY1MzU2NzQ0CitkZAkxODc0NzA4MjI0LDM1MDM0NTE0MTUsMzMwNTI4NTc1MiwzNjM1MTE2NzQKK2RkCTE2MDYxMTc4ODgsMzQ4Nzg1NTc4MSwxMDkzMzUwOTA2LDIzODQzNjc4MjUKK2RkCTE5NzEyMSw2NzU2OTE1NywxMzQ5NDExOTMsMjAyMzEzMjI5CitkZAk2NzU2OTE1NywxMzQ5NDExOTMsMjAyMzEzMjI5LDE5NzEyMQorZGQJMTM0OTQxMTkzLDIwMjMxMzIyOSwxOTcxMjEsNjc1NjkxNTcKK2RkCTIwMjMxMzIyOSwxOTcxMjEsNjc1NjkxNTcsMTM0OTQxMTkzCitkZAkzMzYxOTk3MSwxMDA5OTIwMDcsMTY4MzY0MDQzLDIzNTczNjA3OQorZGQJMjM1NzM2MDc5LDMzNjE5OTcxLDEwMDk5MjAwNywxNjgzNjQwNDMKK2RkCTE2ODM2NDA0MywyMzU3MzYwNzksMzM2MTk5NzEsMTAwOTkyMDA3CitkZAkxMDA5OTIwMDcsMTY4MzY0MDQzLDIzNTczNjA3OSwzMzYxOTk3MQorZGQJNTA0NjI5NzYsMTE3ODM1MDEyLDE4NTIwNzA0OCwyNTI1NzkwODQKK2RkCTI1MjMxNDg4MCw1MTI1MTQ2MCwxMTc1NzQ5MjAsMTg0OTQyODYwCitkZAkxODQ2ODI3NTIsMjUyMDU0Nzg4LDUwOTg3MjcyLDExODM1OTMwOAorZGQJMTE4MDk5MjAwLDE4NTQ2NzE0MCwyNTE3OTA2MDAsNTA3MjcxODAKK2RkCTI5NDYzNjMwNjIsNTI4NzE2MjE3LDEzMDAwMDQyMjUsMTg4MTgzOTYyNAorZGQJMTUzMjcxMzgxOSwxNTMyNzEzODE5LDE1MzI3MTM4MTksMTUzMjcxMzgxOQorZGQJMzYwMjI3NjM1Miw0Mjg4NjI5MDMzLDM3MzcwMjA0MjQsNDE1Mzg4NDk2MQorZGQJMTM1NDU1ODQ2NCwzMjM1NzcxMywyOTU4ODIyNjI0LDM3NzU3NDk1NTMKK2RkCTEyMDE5ODgzNTIsMTMyNDI0NTEyLDE1NzI3OTY2OTgsNTAzMjMyODU4CitkZAkyMjEzMTc3NjAwLDE1OTc0MjEwMjAsNDEwMzkzNzY1NSw2NzUzOTgzMTUKK2RkCTI3NDk2NDY1OTIsNDI3MzU0Mzc3MywxNTExODk4ODczLDEyMTY5MzA5MgorZGQJMzA0MDI0ODU3NiwxMTAzMjYzNzMyLDI4NzE1NjU1OTgsMTYwODI4MDU1NAorZGQJMjIzNjY2NzEzNiwyNTg4OTIwMzUxLDQ4Mjk1NDM5Myw2NDM3NzczNAorZGQJMzA2OTk4NzMyOCwyOTEyMzcyODcsMjExNzM3MDU2OCwzNjUwMjk5MjQ3CitkZAk1MzMzMjEyMTYsMzU3Mzc1MDk4NiwyNTcyMTEyMDA2LDE0MDEyNjQ3MTYKK2RkCTEzMzk4NDk3MDQsMjcyMTE1ODY2MSw1NDg2MDcxMTEsMzQ0NTU1MzUxNAorZGQJMjEyODE5MzI4MCwzMDU0NTk2MDQwLDIxODM0ODY0NjAsMTI1NzA4MzcwMAorZGQJNjU1NjM1MjAwLDExNjUzODE5ODYsMzkyMzQ0MzE1MCwyMzQ0MTMyNTI0CitkZAkxOTAwNzg3MjAsMjU2OTI0NDIwLDI5MDM0MjE3MCwzNTcxODc4NzAKK2RkCTE2MTA5NjYyNzIsMjI2MzA1NzM4Miw0MTAzMjA1MjY4LDMwOTc5NDY3NAorZGQJMjU5MjUyNzg3MiwyMjMzMjA1NTg3LDEzMzU0NDY3MjksMzQwMjk2NDgxNgorZGQJMzk3MzUzMTkwNCwzMjI1MDk4MTIxLDMwMDI4MzYzMjUsMTkxODc3NDQzMAorZGQJMzg3MDQwMTAyNCwyMTAyOTA2MDc5LDIyODQ0NzEzNTMsNDExNzY2NjU3OQorZGQJNjE3MDA3ODcyLDEwMjE1MDgzNDMsMzY2OTMxOTIzLDY5MTA4MzI3NworZGQJMjUyODM5NTc3NiwzNDkxOTE0ODk4LDI5Njg3MDQwMDQsMTYxMzEyMTI3MAorZGQJMzQ0NTE4ODM1MiwzMjQ3NzQxMDk0LDg0NDQ3NDk4Nyw0MDkzNTc4MzAyCitkZAk2NTE0ODEwODgsMTE5MDMwMjM1OCwxNjg5NTgxMjMyLDU3NDc3NTMwMAorZGQJNDI4OTM4MDYwOCwyMDY5Mzk4NTMsMjU1NTk4NTQ1OCwyNDg5ODQwNDkxCitkZAkyMTMwMjY0MDY0LDMyNzY3NDQ1MSwzNTY2NDg1MDM3LDMzNDk4MzUxOTMKK2RkCTI0NzA3MTQ2MjQsMzE2MTAyMTU5LDM2MzY4MjU3NTYsMzM5Mzk0NTk0NQorZGIJODYsMTAxLDk5LDExNiwxMTEsMTE0LDMyLDgwLDEwMSwxMTQsMTA5LDExNywxMTYsOTcsMTE2LDEwNQorZGIJMTExLDExMCwzMiw2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsNDcsODMKK2RiCTgzLDgzLDY5LDUxLDQ0LDMyLDc3LDEwNSwxMDcsMTAxLDMyLDcyLDk3LDEwOSw5OCwxMTcKK2RiCTExNCwxMDMsMzIsNDAsODMsMTE2LDk3LDExMCwxMDIsMTExLDExNCwxMDAsMzIsODUsMTEwLDEwNQorZGIJMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTYsMTIxLDQxLDAKK2FsaWduCTY0CithbGlnbgkxNgorX192cGFlc19wcmVoZWF0OgorCWFkZAllYnAsRFdPUkQgW2VzcF0KKwltb3ZkcWEJeG1tNyxbZWJwLTQ4XQorCW1vdmRxYQl4bW02LFtlYnAtMTZdCisJcmV0CithbGlnbgkxNgorX192cGFlc19lbmNyeXB0X2NvcmU6CisJbW92CWVjeCwxNgorCW1vdgllYXgsRFdPUkQgWzI0MCtlZHhdCisJbW92ZHFhCXhtbTEseG1tNgorCW1vdmRxYQl4bW0yLFtlYnBdCisJcGFuZG4JeG1tMSx4bW0wCisJcGFuZAl4bW0wLHhtbTYKKwltb3ZkcXUJeG1tNSxbZWR4XQorZGIJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCXhtbTAsWzE2K2VicF0KKwlweG9yCXhtbTIseG1tNQorCXBzcmxkCXhtbTEsNAorCWFkZAllZHgsMTYKK2RiCTEwMiwxNSw1NiwwLDE5MworCWxlYQllYngsWzE5MitlYnBdCisJcHhvcgl4bW0wLHhtbTIKKwlqbXAJTkVBUiBMJDAwMGVuY19lbnRyeQorYWxpZ24JMTYKK0wkMDAxZW5jX2xvb3A6CisJbW92ZHFhCXhtbTQsWzMyK2VicF0KKwltb3ZkcWEJeG1tMCxbNDgrZWJwXQorZGIJMTAyLDE1LDU2LDAsMjI2CitkYgkxMDIsMTUsNTYsMCwxOTUKKwlweG9yCXhtbTQseG1tNQorCW1vdmRxYQl4bW01LFs2NCtlYnBdCisJcHhvcgl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tMSxbZWN4KjErZWJ4LTY0XQorZGIJMTAyLDE1LDU2LDAsMjM0CisJbW92ZHFhCXhtbTIsWzgwK2VicF0KKwltb3ZkcWEJeG1tNCxbZWN4KjErZWJ4XQorZGIJMTAyLDE1LDU2LDAsMjExCisJbW92ZHFhCXhtbTMseG1tMAorCXB4b3IJeG1tMix4bW01CitkYgkxMDIsMTUsNTYsMCwxOTMKKwlhZGQJZWR4LDE2CisJcHhvcgl4bW0wLHhtbTIKK2RiCTEwMiwxNSw1NiwwLDIyMAorCWFkZAllY3gsMTYKKwlweG9yCXhtbTMseG1tMAorZGIJMTAyLDE1LDU2LDAsMTkzCisJYW5kCWVjeCw0OAorCXN1YgllYXgsMQorCXB4b3IJeG1tMCx4bW0zCitMJDAwMGVuY19lbnRyeToKKwltb3ZkcWEJeG1tMSx4bW02CisJbW92ZHFhCXhtbTUsW2VicC0zMl0KKwlwYW5kbgl4bW0xLHhtbTAKKwlwc3JsZAl4bW0xLDQKKwlwYW5kCXhtbTAseG1tNgorZGIJMTAyLDE1LDU2LDAsMjMyCisJbW92ZHFhCXhtbTMseG1tNworCXB4b3IJeG1tMCx4bW0xCitkYgkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcWEJeG1tNCx4bW03CisJcHhvcgl4bW0zLHhtbTUKK2RiCTEwMiwxNSw1NiwwLDIyNAorCW1vdmRxYQl4bW0yLHhtbTcKKwlweG9yCXhtbTQseG1tNQorZGIJMTAyLDE1LDU2LDAsMjExCisJbW92ZHFhCXhtbTMseG1tNworCXB4b3IJeG1tMix4bW0wCitkYgkxMDIsMTUsNTYsMCwyMjAKKwltb3ZkcXUJeG1tNSxbZWR4XQorCXB4b3IJeG1tMyx4bW0xCisJam56CU5FQVIgTCQwMDFlbmNfbG9vcAorCW1vdmRxYQl4bW00LFs5NitlYnBdCisJbW92ZHFhCXhtbTAsWzExMitlYnBdCitkYgkxMDIsMTUsNTYsMCwyMjYKKwlweG9yCXhtbTQseG1tNQorZGIJMTAyLDE1LDU2LDAsMTk1CisJbW92ZHFhCXhtbTEsWzY0K2VjeCoxK2VieF0KKwlweG9yCXhtbTAseG1tNAorZGIJMTAyLDE1LDU2LDAsMTkzCisJcmV0CithbGlnbgkxNgorX192cGFlc19kZWNyeXB0X2NvcmU6CisJbGVhCWVieCxbNjA4K2VicF0KKwltb3YJZWF4LERXT1JEIFsyNDArZWR4XQorCW1vdmRxYQl4bW0xLHhtbTYKKwltb3ZkcWEJeG1tMixbZWJ4LTY0XQorCXBhbmRuCXhtbTEseG1tMAorCW1vdgllY3gsZWF4CisJcHNybGQJeG1tMSw0CisJbW92ZHF1CXhtbTUsW2VkeF0KKwlzaGwJZWN4LDQKKwlwYW5kCXhtbTAseG1tNgorZGIJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCXhtbTAsW2VieC00OF0KKwl4b3IJZWN4LDQ4CitkYgkxMDIsMTUsNTYsMCwxOTMKKwlhbmQJZWN4LDQ4CisJcHhvcgl4bW0yLHhtbTUKKwltb3ZkcWEJeG1tNSxbMTc2K2VicF0KKwlweG9yCXhtbTAseG1tMgorCWFkZAllZHgsMTYKKwlsZWEJZWN4LFtlY3gqMStlYngtMzUyXQorCWptcAlORUFSIEwkMDAyZGVjX2VudHJ5CithbGlnbgkxNgorTCQwMDNkZWNfbG9vcDoKKwltb3ZkcWEJeG1tNCxbZWJ4LTMyXQorCW1vdmRxYQl4bW0xLFtlYngtMTZdCitkYgkxMDIsMTUsNTYsMCwyMjYKK2RiCTEwMiwxNSw1NiwwLDIwMworCXB4b3IJeG1tMCx4bW00CisJbW92ZHFhCXhtbTQsW2VieF0KKwlweG9yCXhtbTAseG1tMQorCW1vdmRxYQl4bW0xLFsxNitlYnhdCitkYgkxMDIsMTUsNTYsMCwyMjYKK2RiCTEwMiwxNSw1NiwwLDE5NworZGIJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tNCxbMzIrZWJ4XQorCXB4b3IJeG1tMCx4bW0xCisJbW92ZHFhCXhtbTEsWzQ4K2VieF0KK2RiCTEwMiwxNSw1NiwwLDIyNgorZGIJMTAyLDE1LDU2LDAsMTk3CitkYgkxMDIsMTUsNTYsMCwyMDMKKwlweG9yCXhtbTAseG1tNAorCW1vdmRxYQl4bW00LFs2NCtlYnhdCisJcHhvcgl4bW0wLHhtbTEKKwltb3ZkcWEJeG1tMSxbODArZWJ4XQorZGIJMTAyLDE1LDU2LDAsMjI2CitkYgkxMDIsMTUsNTYsMCwxOTcKK2RiCTEwMiwxNSw1NiwwLDIwMworCXB4b3IJeG1tMCx4bW00CisJYWRkCWVkeCwxNgorZGIJMTAyLDE1LDU4LDE1LDIzNywxMgorCXB4b3IJeG1tMCx4bW0xCisJc3ViCWVheCwxCitMJDAwMmRlY19lbnRyeToKKwltb3ZkcWEJeG1tMSx4bW02CisJbW92ZHFhCXhtbTIsW2VicC0zMl0KKwlwYW5kbgl4bW0xLHhtbTAKKwlwYW5kCXhtbTAseG1tNgorCXBzcmxkCXhtbTEsNAorZGIJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCXhtbTMseG1tNworCXB4b3IJeG1tMCx4bW0xCitkYgkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcWEJeG1tNCx4bW03CisJcHhvcgl4bW0zLHhtbTIKK2RiCTEwMiwxNSw1NiwwLDIyNAorCXB4b3IJeG1tNCx4bW0yCisJbW92ZHFhCXhtbTIseG1tNworZGIJMTAyLDE1LDU2LDAsMjExCisJbW92ZHFhCXhtbTMseG1tNworCXB4b3IJeG1tMix4bW0wCitkYgkxMDIsMTUsNTYsMCwyMjAKKwltb3ZkcXUJeG1tMCxbZWR4XQorCXB4b3IJeG1tMyx4bW0xCisJam56CU5FQVIgTCQwMDNkZWNfbG9vcAorCW1vdmRxYQl4bW00LFs5NitlYnhdCitkYgkxMDIsMTUsNTYsMCwyMjYKKwlweG9yCXhtbTQseG1tMAorCW1vdmRxYQl4bW0wLFsxMTIrZWJ4XQorCW1vdmRxYQl4bW0yLFtlY3hdCitkYgkxMDIsMTUsNTYsMCwxOTUKKwlweG9yCXhtbTAseG1tNAorZGIJMTAyLDE1LDU2LDAsMTk0CisJcmV0CithbGlnbgkxNgorX192cGFlc19zY2hlZHVsZV9jb3JlOgorCWFkZAllYnAsRFdPUkQgW2VzcF0KKwltb3ZkcXUJeG1tMCxbZXNpXQorCW1vdmRxYQl4bW0yLFszMjArZWJwXQorCW1vdmRxYQl4bW0zLHhtbTAKKwlsZWEJZWJ4LFtlYnBdCisJbW92ZHFhCVs0K2VzcF0seG1tMgorCWNhbGwJX192cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcWEJeG1tNyx4bW0wCisJdGVzdAllZGksZWRpCisJam56CU5FQVIgTCQwMDRzY2hlZHVsZV9hbV9kZWNyeXB0aW5nCisJbW92ZHF1CVtlZHhdLHhtbTAKKwlqbXAJTkVBUiBMJDAwNXNjaGVkdWxlX2dvCitMJDAwNHNjaGVkdWxlX2FtX2RlY3J5cHRpbmc6CisJbW92ZHFhCXhtbTEsWzI1NitlY3gqMStlYnBdCitkYgkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcXUJW2VkeF0seG1tMworCXhvcgllY3gsNDgKK0wkMDA1c2NoZWR1bGVfZ286CisJY21wCWVheCwxOTIKKwlqYQlORUFSIEwkMDA2c2NoZWR1bGVfMjU2CisJamUJTkVBUiBMJDAwN3NjaGVkdWxlXzE5MgorTCQwMDhzY2hlZHVsZV8xMjg6CisJbW92CWVheCwxMAorTCQwMDlsb29wX3NjaGVkdWxlXzEyODoKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWMJZWF4CisJanoJTkVBUiBMJDAxMHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWptcAlORUFSIEwkMDA5bG9vcF9zY2hlZHVsZV8xMjgKK2FsaWduCTE2CitMJDAwN3NjaGVkdWxlXzE5MjoKKwltb3ZkcXUJeG1tMCxbOCtlc2ldCisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdmRxYQl4bW02LHhtbTAKKwlweG9yCXhtbTQseG1tNAorCW1vdmhscHMJeG1tNix4bW00CisJbW92CWVheCw0CitMJDAxMWxvb3Bfc2NoZWR1bGVfMTkyOgorCWNhbGwJX192cGFlc19zY2hlZHVsZV9yb3VuZAorZGIJMTAyLDE1LDU4LDE1LDE5OCw4CisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWNhbGwJX192cGFlc19zY2hlZHVsZV8xOTJfc21lYXIKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX3JvdW5kCisJZGVjCWVheAorCWp6CU5FQVIgTCQwMTBzY2hlZHVsZV9tYW5nbGVfbGFzdAorCWNhbGwJX192cGFlc19zY2hlZHVsZV9tYW5nbGUKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyCisJam1wCU5FQVIgTCQwMTFsb29wX3NjaGVkdWxlXzE5MgorYWxpZ24JMTYKK0wkMDA2c2NoZWR1bGVfMjU2OgorCW1vdmRxdQl4bW0wLFsxNitlc2ldCisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdgllYXgsNworTCQwMTJsb29wX3NjaGVkdWxlXzI1NjoKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJbW92ZHFhCXhtbTYseG1tMAorCWNhbGwJX192cGFlc19zY2hlZHVsZV9yb3VuZAorCWRlYwllYXgKKwlqeglORUFSIEwkMDEwc2NoZWR1bGVfbWFuZ2xlX2xhc3QKKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJcHNodWZkCXhtbTAseG1tMCwyNTUKKwltb3ZkcWEJWzIwK2VzcF0seG1tNworCW1vdmRxYQl4bW03LHhtbTYKKwljYWxsCUwkX3ZwYWVzX3NjaGVkdWxlX2xvd19yb3VuZAorCW1vdmRxYQl4bW03LFsyMCtlc3BdCisJam1wCU5FQVIgTCQwMTJsb29wX3NjaGVkdWxlXzI1NgorYWxpZ24JMTYKK0wkMDEwc2NoZWR1bGVfbWFuZ2xlX2xhc3Q6CisJbGVhCWVieCxbMzg0K2VicF0KKwl0ZXN0CWVkaSxlZGkKKwlqbnoJTkVBUiBMJDAxM3NjaGVkdWxlX21hbmdsZV9sYXN0X2RlYworCW1vdmRxYQl4bW0xLFsyNTYrZWN4KjErZWJwXQorZGIJMTAyLDE1LDU2LDAsMTkzCisJbGVhCWVieCxbMzUyK2VicF0KKwlhZGQJZWR4LDMyCitMJDAxM3NjaGVkdWxlX21hbmdsZV9sYXN0X2RlYzoKKwlhZGQJZWR4LC0xNgorCXB4b3IJeG1tMCxbMzM2K2VicF0KKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtCisJbW92ZHF1CVtlZHhdLHhtbTAKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJcHhvcgl4bW0yLHhtbTIKKwlweG9yCXhtbTMseG1tMworCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKwlweG9yCXhtbTYseG1tNgorCXB4b3IJeG1tNyx4bW03CisJcmV0CithbGlnbgkxNgorX192cGFlc19zY2hlZHVsZV8xOTJfc21lYXI6CisJcHNodWZkCXhtbTEseG1tNiwxMjgKKwlwc2h1ZmQJeG1tMCx4bW03LDI1NAorCXB4b3IJeG1tNix4bW0xCisJcHhvcgl4bW0xLHhtbTEKKwlweG9yCXhtbTYseG1tMAorCW1vdmRxYQl4bW0wLHhtbTYKKwltb3ZobHBzCXhtbTYseG1tMQorCXJldAorYWxpZ24JMTYKK19fdnBhZXNfc2NoZWR1bGVfcm91bmQ6CisJbW92ZHFhCXhtbTIsWzgrZXNwXQorCXB4b3IJeG1tMSx4bW0xCitkYgkxMDIsMTUsNTgsMTUsMjAyLDE1CitkYgkxMDIsMTUsNTgsMTUsMjEwLDE1CisJcHhvcgl4bW03LHhtbTEKKwlwc2h1ZmQJeG1tMCx4bW0wLDI1NQorZGIJMTAyLDE1LDU4LDE1LDE5MiwxCisJbW92ZHFhCVs4K2VzcF0seG1tMgorTCRfdnBhZXNfc2NoZWR1bGVfbG93X3JvdW5kOgorCW1vdmRxYQl4bW0xLHhtbTcKKwlwc2xsZHEJeG1tNyw0CisJcHhvcgl4bW03LHhtbTEKKwltb3ZkcWEJeG1tMSx4bW03CisJcHNsbGRxCXhtbTcsOAorCXB4b3IJeG1tNyx4bW0xCisJcHhvcgl4bW03LFszMzYrZWJwXQorCW1vdmRxYQl4bW00LFtlYnAtMTZdCisJbW92ZHFhCXhtbTUsW2VicC00OF0KKwltb3ZkcWEJeG1tMSx4bW00CisJcGFuZG4JeG1tMSx4bW0wCisJcHNybGQJeG1tMSw0CisJcGFuZAl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tMixbZWJwLTMyXQorZGIJMTAyLDE1LDU2LDAsMjA4CisJcHhvcgl4bW0wLHhtbTEKKwltb3ZkcWEJeG1tMyx4bW01CitkYgkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCXhtbTMseG1tMgorCW1vdmRxYQl4bW00LHhtbTUKK2RiCTEwMiwxNSw1NiwwLDIyNAorCXB4b3IJeG1tNCx4bW0yCisJbW92ZHFhCXhtbTIseG1tNQorZGIJMTAyLDE1LDU2LDAsMjExCisJcHhvcgl4bW0yLHhtbTAKKwltb3ZkcWEJeG1tMyx4bW01CitkYgkxMDIsMTUsNTYsMCwyMjAKKwlweG9yCXhtbTMseG1tMQorCW1vdmRxYQl4bW00LFszMitlYnBdCitkYgkxMDIsMTUsNTYsMCwyMjYKKwltb3ZkcWEJeG1tMCxbNDgrZWJwXQorZGIJMTAyLDE1LDU2LDAsMTk1CisJcHhvcgl4bW0wLHhtbTQKKwlweG9yCXhtbTAseG1tNworCW1vdmRxYQl4bW03LHhtbTAKKwlyZXQKK2FsaWduCTE2CitfX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybToKKwltb3ZkcWEJeG1tMixbZWJwLTE2XQorCW1vdmRxYQl4bW0xLHhtbTIKKwlwYW5kbgl4bW0xLHhtbTAKKwlwc3JsZAl4bW0xLDQKKwlwYW5kCXhtbTAseG1tMgorCW1vdmRxYQl4bW0yLFtlYnhdCitkYgkxMDIsMTUsNTYsMCwyMDgKKwltb3ZkcWEJeG1tMCxbMTYrZWJ4XQorZGIJMTAyLDE1LDU2LDAsMTkzCisJcHhvcgl4bW0wLHhtbTIKKwlyZXQKK2FsaWduCTE2CitfX3ZwYWVzX3NjaGVkdWxlX21hbmdsZToKKwltb3ZkcWEJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTUsWzEyOCtlYnBdCisJdGVzdAllZGksZWRpCisJam56CU5FQVIgTCQwMTRzY2hlZHVsZV9tYW5nbGVfZGVjCisJYWRkCWVkeCwxNgorCXB4b3IJeG1tNCxbMzM2K2VicF0KK2RiCTEwMiwxNSw1NiwwLDIyOQorCW1vdmRxYQl4bW0zLHhtbTQKK2RiCTEwMiwxNSw1NiwwLDIyOQorCXB4b3IJeG1tMyx4bW00CitkYgkxMDIsMTUsNTYsMCwyMjkKKwlweG9yCXhtbTMseG1tNAorCWptcAlORUFSIEwkMDE1c2NoZWR1bGVfbWFuZ2xlX2JvdGgKK2FsaWduCTE2CitMJDAxNHNjaGVkdWxlX21hbmdsZV9kZWM6CisJbW92ZHFhCXhtbTIsW2VicC0xNl0KKwlsZWEJZXNpLFs0MTYrZWJwXQorCW1vdmRxYQl4bW0xLHhtbTIKKwlwYW5kbgl4bW0xLHhtbTQKKwlwc3JsZAl4bW0xLDQKKwlwYW5kCXhtbTQseG1tMgorCW1vdmRxYQl4bW0yLFtlc2ldCitkYgkxMDIsMTUsNTYsMCwyMTIKKwltb3ZkcWEJeG1tMyxbMTYrZXNpXQorZGIJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgl4bW0zLHhtbTIKK2RiCTEwMiwxNSw1NiwwLDIyMQorCW1vdmRxYQl4bW0yLFszMitlc2ldCitkYgkxMDIsMTUsNTYsMCwyMTIKKwlweG9yCXhtbTIseG1tMworCW1vdmRxYQl4bW0zLFs0OCtlc2ldCitkYgkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCXhtbTMseG1tMgorZGIJMTAyLDE1LDU2LDAsMjIxCisJbW92ZHFhCXhtbTIsWzY0K2VzaV0KK2RiCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJeG1tMix4bW0zCisJbW92ZHFhCXhtbTMsWzgwK2VzaV0KK2RiCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJeG1tMyx4bW0yCitkYgkxMDIsMTUsNTYsMCwyMjEKKwltb3ZkcWEJeG1tMixbOTYrZXNpXQorZGIJMTAyLDE1LDU2LDAsMjEyCisJcHhvcgl4bW0yLHhtbTMKKwltb3ZkcWEJeG1tMyxbMTEyK2VzaV0KK2RiCTEwMiwxNSw1NiwwLDIxNworCXB4b3IJeG1tMyx4bW0yCisJYWRkCWVkeCwtMTYKK0wkMDE1c2NoZWR1bGVfbWFuZ2xlX2JvdGg6CisJbW92ZHFhCXhtbTEsWzI1NitlY3gqMStlYnBdCitkYgkxMDIsMTUsNTYsMCwyMTcKKwlhZGQJZWN4LC0xNgorCWFuZAllY3gsNDgKKwltb3ZkcXUJW2VkeF0seG1tMworCXJldAorZ2xvYmFsCV92cGFlc19zZXRfZW5jcnlwdF9rZXkKK2FsaWduCTE2CitfdnBhZXNfc2V0X2VuY3J5cHRfa2V5OgorTCRfdnBhZXNfc2V0X2VuY3J5cHRfa2V5X2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCWxlYQllYngsW2VzcC01Nl0KKwltb3YJZWF4LERXT1JEIFsyNCtlc3BdCisJYW5kCWVieCwtMTYKKwltb3YJZWR4LERXT1JEIFsyOCtlc3BdCisJeGNoZwllYngsZXNwCisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCW1vdgllYngsZWF4CisJc2hyCWVieCw1CisJYWRkCWVieCw1CisJbW92CURXT1JEIFsyNDArZWR4XSxlYngKKwltb3YJZWN4LDQ4CisJbW92CWVkaSwwCisJbGVhCWVicCxbKEwkX3ZwYWVzX2NvbnN0cysweDMwLUwkMDE2cGljX3BvaW50KV0KKwljYWxsCV9fdnBhZXNfc2NoZWR1bGVfY29yZQorTCQwMTZwaWNfcG9pbnQ6CisJbW92CWVzcCxEV09SRCBbNDgrZXNwXQorCXhvcgllYXgsZWF4CisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV92cGFlc19zZXRfZGVjcnlwdF9rZXkKK2FsaWduCTE2CitfdnBhZXNfc2V0X2RlY3J5cHRfa2V5OgorTCRfdnBhZXNfc2V0X2RlY3J5cHRfa2V5X2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCWxlYQllYngsW2VzcC01Nl0KKwltb3YJZWF4LERXT1JEIFsyNCtlc3BdCisJYW5kCWVieCwtMTYKKwltb3YJZWR4LERXT1JEIFsyOCtlc3BdCisJeGNoZwllYngsZXNwCisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCW1vdgllYngsZWF4CisJc2hyCWVieCw1CisJYWRkCWVieCw1CisJbW92CURXT1JEIFsyNDArZWR4XSxlYngKKwlzaGwJZWJ4LDQKKwlsZWEJZWR4LFsxNitlYngqMStlZHhdCisJbW92CWVkaSwxCisJbW92CWVjeCxlYXgKKwlzaHIJZWN4LDEKKwlhbmQJZWN4LDMyCisJeG9yCWVjeCwzMgorCWxlYQllYnAsWyhMJF92cGFlc19jb25zdHMrMHgzMC1MJDAxN3BpY19wb2ludCldCisJY2FsbAlfX3ZwYWVzX3NjaGVkdWxlX2NvcmUKK0wkMDE3cGljX3BvaW50OgorCW1vdgllc3AsRFdPUkQgWzQ4K2VzcF0KKwl4b3IJZWF4LGVheAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2dsb2JhbAlfdnBhZXNfZW5jcnlwdAorYWxpZ24JMTYKK192cGFlc19lbmNyeXB0OgorTCRfdnBhZXNfZW5jcnlwdF9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCWxlYQllYnAsWyhMJF92cGFlc19jb25zdHMrMHgzMC1MJDAxOHBpY19wb2ludCldCisJY2FsbAlfX3ZwYWVzX3ByZWhlYXQKK0wkMDE4cGljX3BvaW50OgorCW1vdgllc2ksRFdPUkQgWzIwK2VzcF0KKwlsZWEJZWJ4LFtlc3AtNTZdCisJbW92CWVkaSxEV09SRCBbMjQrZXNwXQorCWFuZAllYngsLTE2CisJbW92CWVkeCxEV09SRCBbMjgrZXNwXQorCXhjaGcJZWJ4LGVzcAorCW1vdglEV09SRCBbNDgrZXNwXSxlYngKKwltb3ZkcXUJeG1tMCxbZXNpXQorCWNhbGwJX192cGFlc19lbmNyeXB0X2NvcmUKKwltb3ZkcXUJW2VkaV0seG1tMAorCW1vdgllc3AsRFdPUkQgWzQ4K2VzcF0KKwlwb3AJZWRpCisJcG9wCWVzaQorCXBvcAllYngKKwlwb3AJZWJwCisJcmV0CitnbG9iYWwJX3ZwYWVzX2RlY3J5cHQKK2FsaWduCTE2CitfdnBhZXNfZGVjcnlwdDoKK0wkX3ZwYWVzX2RlY3J5cHRfYmVnaW46CisJcHVzaAllYnAKKwlwdXNoCWVieAorCXB1c2gJZXNpCisJcHVzaAllZGkKKwlsZWEJZWJwLFsoTCRfdnBhZXNfY29uc3RzKzB4MzAtTCQwMTlwaWNfcG9pbnQpXQorCWNhbGwJX192cGFlc19wcmVoZWF0CitMJDAxOXBpY19wb2ludDoKKwltb3YJZXNpLERXT1JEIFsyMCtlc3BdCisJbGVhCWVieCxbZXNwLTU2XQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwlhbmQJZWJ4LC0xNgorCW1vdgllZHgsRFdPUkQgWzI4K2VzcF0KKwl4Y2hnCWVieCxlc3AKKwltb3YJRFdPUkQgWzQ4K2VzcF0sZWJ4CisJbW92ZHF1CXhtbTAsW2VzaV0KKwljYWxsCV9fdnBhZXNfZGVjcnlwdF9jb3JlCisJbW92ZHF1CVtlZGldLHhtbTAKKwltb3YJZXNwLERXT1JEIFs0OCtlc3BdCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcG9wCWVicAorCXJldAorZ2xvYmFsCV92cGFlc19jYmNfZW5jcnlwdAorYWxpZ24JMTYKK192cGFlc19jYmNfZW5jcnlwdDoKK0wkX3ZwYWVzX2NiY19lbmNyeXB0X2JlZ2luOgorCXB1c2gJZWJwCisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJbW92CWVzaSxEV09SRCBbMjArZXNwXQorCW1vdgllZGksRFdPUkQgWzI0K2VzcF0KKwltb3YJZWF4LERXT1JEIFsyOCtlc3BdCisJbW92CWVkeCxEV09SRCBbMzIrZXNwXQorCXN1YgllYXgsMTYKKwlqYwlORUFSIEwkMDIwY2JjX2Fib3J0CisJbGVhCWVieCxbZXNwLTU2XQorCW1vdgllYnAsRFdPUkQgWzM2K2VzcF0KKwlhbmQJZWJ4LC0xNgorCW1vdgllY3gsRFdPUkQgWzQwK2VzcF0KKwl4Y2hnCWVieCxlc3AKKwltb3ZkcXUJeG1tMSxbZWJwXQorCXN1YgllZGksZXNpCisJbW92CURXT1JEIFs0OCtlc3BdLGVieAorCW1vdglEV09SRCBbZXNwXSxlZGkKKwltb3YJRFdPUkQgWzQrZXNwXSxlZHgKKwltb3YJRFdPUkQgWzgrZXNwXSxlYnAKKwltb3YJZWRpLGVheAorCWxlYQllYnAsWyhMJF92cGFlc19jb25zdHMrMHgzMC1MJDAyMXBpY19wb2ludCldCisJY2FsbAlfX3ZwYWVzX3ByZWhlYXQKK0wkMDIxcGljX3BvaW50OgorCWNtcAllY3gsMAorCWplCU5FQVIgTCQwMjJjYmNfZGVjX2xvb3AKKwlqbXAJTkVBUiBMJDAyM2NiY19lbmNfbG9vcAorYWxpZ24JMTYKK0wkMDIzY2JjX2VuY19sb29wOgorCW1vdmRxdQl4bW0wLFtlc2ldCisJcHhvcgl4bW0wLHhtbTEKKwljYWxsCV9fdnBhZXNfZW5jcnlwdF9jb3JlCisJbW92CWVieCxEV09SRCBbZXNwXQorCW1vdgllZHgsRFdPUkQgWzQrZXNwXQorCW1vdmRxYQl4bW0xLHhtbTAKKwltb3ZkcXUJW2VzaSoxK2VieF0seG1tMAorCWxlYQllc2ksWzE2K2VzaV0KKwlzdWIJZWRpLDE2CisJam5jCU5FQVIgTCQwMjNjYmNfZW5jX2xvb3AKKwlqbXAJTkVBUiBMJDAyNGNiY19kb25lCithbGlnbgkxNgorTCQwMjJjYmNfZGVjX2xvb3A6CisJbW92ZHF1CXhtbTAsW2VzaV0KKwltb3ZkcWEJWzE2K2VzcF0seG1tMQorCW1vdmRxYQlbMzIrZXNwXSx4bW0wCisJY2FsbAlfX3ZwYWVzX2RlY3J5cHRfY29yZQorCW1vdgllYngsRFdPUkQgW2VzcF0KKwltb3YJZWR4LERXT1JEIFs0K2VzcF0KKwlweG9yCXhtbTAsWzE2K2VzcF0KKwltb3ZkcWEJeG1tMSxbMzIrZXNwXQorCW1vdmRxdQlbZXNpKjErZWJ4XSx4bW0wCisJbGVhCWVzaSxbMTYrZXNpXQorCXN1YgllZGksMTYKKwlqbmMJTkVBUiBMJDAyMmNiY19kZWNfbG9vcAorTCQwMjRjYmNfZG9uZToKKwltb3YJZWJ4LERXT1JEIFs4K2VzcF0KKwltb3YJZXNwLERXT1JEIFs0OCtlc3BdCisJbW92ZHF1CVtlYnhdLHhtbTEKK0wkMDIwY2JjX2Fib3J0OgorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Ni9jcnlwdG8vZmlwc21vZHVsZS94ODYtbW9udC5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUveDg2LW1vbnQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmIyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODYvY3J5cHRvL2ZpcHNtb2R1bGUveDg2LW1vbnQuYXNtCkBAIC0wLDAgKzEsNDg3IEBACislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKKyVpZmRlZiBfX1lBU01fVkVSU0lPTl9JRF9fCislaWYgX19ZQVNNX1ZFUlNJT05fSURfXyA8IDAxMDEwMDAwaAorJWVycm9yIHlhc20gdmVyc2lvbiAxLjEuMCBvciBsYXRlciBuZWVkZWQuCislZW5kaWYKKzsgWWFzbSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIC4wMCBhbmQgY29tcGxhaW5zIGFib3V0IHJlZGVmaW5pbmcgaXQuCis7IGh0dHBzOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vbWFudWFsL2h0bWwvb2JqZm10LXdpbjMyLXNhZmVzZWguaHRtbAorJWVsc2UKKyRAZmVhdC4wMCBlcXUgMQorJWVuZGlmCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorO2V4dGVybglfT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlfYm5fbXVsX21vbnQKK2FsaWduCTE2CitfYm5fbXVsX21vbnQ6CitMJF9ibl9tdWxfbW9udF9iZWdpbjoKKwlwdXNoCWVicAorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCXhvcgllYXgsZWF4CisJbW92CWVkaSxEV09SRCBbNDArZXNwXQorCWNtcAllZGksNAorCWpsCU5FQVIgTCQwMDBqdXN0X2xlYXZlCisJbGVhCWVzaSxbMjArZXNwXQorCWxlYQllZHgsWzI0K2VzcF0KKwlhZGQJZWRpLDIKKwluZWcJZWRpCisJbGVhCWVicCxbZWRpKjQrZXNwLTMyXQorCW5lZwllZGkKKwltb3YJZWF4LGVicAorCXN1YgllYXgsZWR4CisJYW5kCWVheCwyMDQ3CisJc3ViCWVicCxlYXgKKwl4b3IJZWR4LGVicAorCWFuZAllZHgsMjA0OAorCXhvcgllZHgsMjA0OAorCXN1YgllYnAsZWR4CisJYW5kCWVicCwtNjQKKwltb3YJZWF4LGVzcAorCXN1YgllYXgsZWJwCisJYW5kCWVheCwtNDA5NgorCW1vdgllZHgsZXNwCisJbGVhCWVzcCxbZWF4KjErZWJwXQorCW1vdgllYXgsRFdPUkQgW2VzcF0KKwljbXAJZXNwLGVicAorCWphCU5FQVIgTCQwMDFwYWdlX3dhbGsKKwlqbXAJTkVBUiBMJDAwMnBhZ2Vfd2Fsa19kb25lCithbGlnbgkxNgorTCQwMDFwYWdlX3dhbGs6CisJbGVhCWVzcCxbZXNwLTQwOTZdCisJbW92CWVheCxEV09SRCBbZXNwXQorCWNtcAllc3AsZWJwCisJamEJTkVBUiBMJDAwMXBhZ2Vfd2FsaworTCQwMDJwYWdlX3dhbGtfZG9uZToKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbW92CWVieCxEV09SRCBbNCtlc2ldCisJbW92CWVjeCxEV09SRCBbOCtlc2ldCisJbW92CWVicCxEV09SRCBbMTIrZXNpXQorCW1vdgllc2ksRFdPUkQgWzE2K2VzaV0KKwltb3YJZXNpLERXT1JEIFtlc2ldCisJbW92CURXT1JEIFs0K2VzcF0sZWF4CisJbW92CURXT1JEIFs4K2VzcF0sZWJ4CisJbW92CURXT1JEIFsxMitlc3BdLGVjeAorCW1vdglEV09SRCBbMTYrZXNwXSxlYnAKKwltb3YJRFdPUkQgWzIwK2VzcF0sZXNpCisJbGVhCWVieCxbZWRpLTNdCisJbW92CURXT1JEIFsyNCtlc3BdLGVkeAorCWxlYQllYXgsW19PUEVOU1NMX2lhMzJjYXBfUF0KKwlidAlEV09SRCBbZWF4XSwyNgorCWpuYwlORUFSIEwkMDAzbm9uX3NzZTIKKwltb3YJZWF4LC0xCisJbW92ZAltbTcsZWF4CisJbW92CWVzaSxEV09SRCBbOCtlc3BdCisJbW92CWVkaSxEV09SRCBbMTIrZXNwXQorCW1vdgllYnAsRFdPUkQgWzE2K2VzcF0KKwl4b3IJZWR4LGVkeAorCXhvcgllY3gsZWN4CisJbW92ZAltbTQsRFdPUkQgW2VkaV0KKwltb3ZkCW1tNSxEV09SRCBbZXNpXQorCW1vdmQJbW0zLERXT1JEIFtlYnBdCisJcG11bHVkcQltbTUsbW00CisJbW92cQltbTIsbW01CisJbW92cQltbTAsbW01CisJcGFuZAltbTAsbW03CisJcG11bHVkcQltbTUsWzIwK2VzcF0KKwlwbXVsdWRxCW1tMyxtbTUKKwlwYWRkcQltbTMsbW0wCisJbW92ZAltbTEsRFdPUkQgWzQrZWJwXQorCW1vdmQJbW0wLERXT1JEIFs0K2VzaV0KKwlwc3JscQltbTIsMzIKKwlwc3JscQltbTMsMzIKKwlpbmMJZWN4CithbGlnbgkxNgorTCQwMDQxc3Q6CisJcG11bHVkcQltbTAsbW00CisJcG11bHVkcQltbTEsbW01CisJcGFkZHEJbW0yLG1tMAorCXBhZGRxCW1tMyxtbTEKKwltb3ZxCW1tMCxtbTIKKwlwYW5kCW1tMCxtbTcKKwltb3ZkCW1tMSxEV09SRCBbNCtlY3gqNCtlYnBdCisJcGFkZHEJbW0zLG1tMAorCW1vdmQJbW0wLERXT1JEIFs0K2VjeCo0K2VzaV0KKwlwc3JscQltbTIsMzIKKwltb3ZkCURXT1JEIFsyOCtlY3gqNCtlc3BdLG1tMworCXBzcmxxCW1tMywzMgorCWxlYQllY3gsWzErZWN4XQorCWNtcAllY3gsZWJ4CisJamwJTkVBUiBMJDAwNDFzdAorCXBtdWx1ZHEJbW0wLG1tNAorCXBtdWx1ZHEJbW0xLG1tNQorCXBhZGRxCW1tMixtbTAKKwlwYWRkcQltbTMsbW0xCisJbW92cQltbTAsbW0yCisJcGFuZAltbTAsbW03CisJcGFkZHEJbW0zLG1tMAorCW1vdmQJRFdPUkQgWzI4K2VjeCo0K2VzcF0sbW0zCisJcHNybHEJbW0yLDMyCisJcHNybHEJbW0zLDMyCisJcGFkZHEJbW0zLG1tMgorCW1vdnEJWzMyK2VieCo0K2VzcF0sbW0zCisJaW5jCWVkeAorTCQwMDVvdXRlcjoKKwl4b3IJZWN4LGVjeAorCW1vdmQJbW00LERXT1JEIFtlZHgqNCtlZGldCisJbW92ZAltbTUsRFdPUkQgW2VzaV0KKwltb3ZkCW1tNixEV09SRCBbMzIrZXNwXQorCW1vdmQJbW0zLERXT1JEIFtlYnBdCisJcG11bHVkcQltbTUsbW00CisJcGFkZHEJbW01LG1tNgorCW1vdnEJbW0wLG1tNQorCW1vdnEJbW0yLG1tNQorCXBhbmQJbW0wLG1tNworCXBtdWx1ZHEJbW01LFsyMCtlc3BdCisJcG11bHVkcQltbTMsbW01CisJcGFkZHEJbW0zLG1tMAorCW1vdmQJbW02LERXT1JEIFszNitlc3BdCisJbW92ZAltbTEsRFdPUkQgWzQrZWJwXQorCW1vdmQJbW0wLERXT1JEIFs0K2VzaV0KKwlwc3JscQltbTIsMzIKKwlwc3JscQltbTMsMzIKKwlwYWRkcQltbTIsbW02CisJaW5jCWVjeAorCWRlYwllYngKK0wkMDA2aW5uZXI6CisJcG11bHVkcQltbTAsbW00CisJcG11bHVkcQltbTEsbW01CisJcGFkZHEJbW0yLG1tMAorCXBhZGRxCW1tMyxtbTEKKwltb3ZxCW1tMCxtbTIKKwltb3ZkCW1tNixEV09SRCBbMzYrZWN4KjQrZXNwXQorCXBhbmQJbW0wLG1tNworCW1vdmQJbW0xLERXT1JEIFs0K2VjeCo0K2VicF0KKwlwYWRkcQltbTMsbW0wCisJbW92ZAltbTAsRFdPUkQgWzQrZWN4KjQrZXNpXQorCXBzcmxxCW1tMiwzMgorCW1vdmQJRFdPUkQgWzI4K2VjeCo0K2VzcF0sbW0zCisJcHNybHEJbW0zLDMyCisJcGFkZHEJbW0yLG1tNgorCWRlYwllYngKKwlsZWEJZWN4LFsxK2VjeF0KKwlqbnoJTkVBUiBMJDAwNmlubmVyCisJbW92CWVieCxlY3gKKwlwbXVsdWRxCW1tMCxtbTQKKwlwbXVsdWRxCW1tMSxtbTUKKwlwYWRkcQltbTIsbW0wCisJcGFkZHEJbW0zLG1tMQorCW1vdnEJbW0wLG1tMgorCXBhbmQJbW0wLG1tNworCXBhZGRxCW1tMyxtbTAKKwltb3ZkCURXT1JEIFsyOCtlY3gqNCtlc3BdLG1tMworCXBzcmxxCW1tMiwzMgorCXBzcmxxCW1tMywzMgorCW1vdmQJbW02LERXT1JEIFszNitlYngqNCtlc3BdCisJcGFkZHEJbW0zLG1tMgorCXBhZGRxCW1tMyxtbTYKKwltb3ZxCVszMitlYngqNCtlc3BdLG1tMworCWxlYQllZHgsWzErZWR4XQorCWNtcAllZHgsZWJ4CisJamxlCU5FQVIgTCQwMDVvdXRlcgorCWVtbXMKKwlqbXAJTkVBUiBMJDAwN2NvbW1vbl90YWlsCithbGlnbgkxNgorTCQwMDNub25fc3NlMjoKKwltb3YJZXNpLERXT1JEIFs4K2VzcF0KKwlsZWEJZWJwLFsxK2VieF0KKwltb3YJZWRpLERXT1JEIFsxMitlc3BdCisJeG9yCWVjeCxlY3gKKwltb3YJZWR4LGVzaQorCWFuZAllYnAsMQorCXN1YgllZHgsZWRpCisJbGVhCWVheCxbNCtlYngqNCtlZGldCisJb3IJZWJwLGVkeAorCW1vdgllZGksRFdPUkQgW2VkaV0KKwlqeglORUFSIEwkMDA4Ym5fc3FyX21vbnQKKwltb3YJRFdPUkQgWzI4K2VzcF0sZWF4CisJbW92CWVheCxEV09SRCBbZXNpXQorCXhvcgllZHgsZWR4CithbGlnbgkxNgorTCQwMDltdWxsOgorCW1vdgllYnAsZWR4CisJbXVsCWVkaQorCWFkZAllYnAsZWF4CisJbGVhCWVjeCxbMStlY3hdCisJYWRjCWVkeCwwCisJbW92CWVheCxEV09SRCBbZWN4KjQrZXNpXQorCWNtcAllY3gsZWJ4CisJbW92CURXT1JEIFsyOCtlY3gqNCtlc3BdLGVicAorCWpsCU5FQVIgTCQwMDltdWxsCisJbW92CWVicCxlZHgKKwltdWwJZWRpCisJbW92CWVkaSxEV09SRCBbMjArZXNwXQorCWFkZAllYXgsZWJwCisJbW92CWVzaSxEV09SRCBbMTYrZXNwXQorCWFkYwllZHgsMAorCWltdWwJZWRpLERXT1JEIFszMitlc3BdCisJbW92CURXT1JEIFszMitlYngqNCtlc3BdLGVheAorCXhvcgllY3gsZWN4CisJbW92CURXT1JEIFszNitlYngqNCtlc3BdLGVkeAorCW1vdglEV09SRCBbNDArZWJ4KjQrZXNwXSxlY3gKKwltb3YJZWF4LERXT1JEIFtlc2ldCisJbXVsCWVkaQorCWFkZAllYXgsRFdPUkQgWzMyK2VzcF0KKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlhZGMJZWR4LDAKKwlpbmMJZWN4CisJam1wCU5FQVIgTCQwMTAybmRtYWRkCithbGlnbgkxNgorTCQwMTExc3RtYWRkOgorCW1vdgllYnAsZWR4CisJbXVsCWVkaQorCWFkZAllYnAsRFdPUkQgWzMyK2VjeCo0K2VzcF0KKwlsZWEJZWN4LFsxK2VjeF0KKwlhZGMJZWR4LDAKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgW2VjeCo0K2VzaV0KKwlhZGMJZWR4LDAKKwljbXAJZWN4LGVieAorCW1vdglEV09SRCBbMjgrZWN4KjQrZXNwXSxlYnAKKwlqbAlORUFSIEwkMDExMXN0bWFkZAorCW1vdgllYnAsZWR4CisJbXVsCWVkaQorCWFkZAllYXgsRFdPUkQgWzMyK2VieCo0K2VzcF0KKwltb3YJZWRpLERXT1JEIFsyMCtlc3BdCisJYWRjCWVkeCwwCisJbW92CWVzaSxEV09SRCBbMTYrZXNwXQorCWFkZAllYnAsZWF4CisJYWRjCWVkeCwwCisJaW11bAllZGksRFdPUkQgWzMyK2VzcF0KKwl4b3IJZWN4LGVjeAorCWFkZAllZHgsRFdPUkQgWzM2K2VieCo0K2VzcF0KKwltb3YJRFdPUkQgWzMyK2VieCo0K2VzcF0sZWJwCisJYWRjCWVjeCwwCisJbW92CWVheCxEV09SRCBbZXNpXQorCW1vdglEV09SRCBbMzYrZWJ4KjQrZXNwXSxlZHgKKwltb3YJRFdPUkQgWzQwK2VieCo0K2VzcF0sZWN4CisJbXVsCWVkaQorCWFkZAllYXgsRFdPUkQgWzMyK2VzcF0KKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlhZGMJZWR4LDAKKwltb3YJZWN4LDEKK2FsaWduCTE2CitMJDAxMDJuZG1hZGQ6CisJbW92CWVicCxlZHgKKwltdWwJZWRpCisJYWRkCWVicCxEV09SRCBbMzIrZWN4KjQrZXNwXQorCWxlYQllY3gsWzErZWN4XQorCWFkYwllZHgsMAorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbZWN4KjQrZXNpXQorCWFkYwllZHgsMAorCWNtcAllY3gsZWJ4CisJbW92CURXT1JEIFsyNCtlY3gqNCtlc3BdLGVicAorCWpsCU5FQVIgTCQwMTAybmRtYWRkCisJbW92CWVicCxlZHgKKwltdWwJZWRpCisJYWRkCWVicCxEV09SRCBbMzIrZWJ4KjQrZXNwXQorCWFkYwllZHgsMAorCWFkZAllYnAsZWF4CisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyOCtlYngqNCtlc3BdLGVicAorCXhvcgllYXgsZWF4CisJbW92CWVjeCxEV09SRCBbMTIrZXNwXQorCWFkZAllZHgsRFdPUkQgWzM2K2VieCo0K2VzcF0KKwlhZGMJZWF4LERXT1JEIFs0MCtlYngqNCtlc3BdCisJbGVhCWVjeCxbNCtlY3hdCisJbW92CURXT1JEIFszMitlYngqNCtlc3BdLGVkeAorCWNtcAllY3gsRFdPUkQgWzI4K2VzcF0KKwltb3YJRFdPUkQgWzM2K2VieCo0K2VzcF0sZWF4CisJamUJTkVBUiBMJDAwN2NvbW1vbl90YWlsCisJbW92CWVkaSxEV09SRCBbZWN4XQorCW1vdgllc2ksRFdPUkQgWzgrZXNwXQorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwl4b3IJZWN4LGVjeAorCXhvcgllZHgsZWR4CisJbW92CWVheCxEV09SRCBbZXNpXQorCWptcAlORUFSIEwkMDExMXN0bWFkZAorYWxpZ24JMTYKK0wkMDA4Ym5fc3FyX21vbnQ6CisJbW92CURXT1JEIFtlc3BdLGVieAorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwltb3YJZWF4LGVkaQorCW11bAllZGkKKwltb3YJRFdPUkQgWzMyK2VzcF0sZWF4CisJbW92CWVieCxlZHgKKwlzaHIJZWR4LDEKKwlhbmQJZWJ4LDEKKwlpbmMJZWN4CithbGlnbgkxNgorTCQwMTJzcXI6CisJbW92CWVheCxEV09SRCBbZWN4KjQrZXNpXQorCW1vdgllYnAsZWR4CisJbXVsCWVkaQorCWFkZAllYXgsZWJwCisJbGVhCWVjeCxbMStlY3hdCisJYWRjCWVkeCwwCisJbGVhCWVicCxbZWF4KjIrZWJ4XQorCXNocgllYXgsMzEKKwljbXAJZWN4LERXT1JEIFtlc3BdCisJbW92CWVieCxlYXgKKwltb3YJRFdPUkQgWzI4K2VjeCo0K2VzcF0sZWJwCisJamwJTkVBUiBMJDAxMnNxcgorCW1vdgllYXgsRFdPUkQgW2VjeCo0K2VzaV0KKwltb3YJZWJwLGVkeAorCW11bAllZGkKKwlhZGQJZWF4LGVicAorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwlhZGMJZWR4LDAKKwltb3YJZXNpLERXT1JEIFsxNitlc3BdCisJbGVhCWVicCxbZWF4KjIrZWJ4XQorCWltdWwJZWRpLERXT1JEIFszMitlc3BdCisJc2hyCWVheCwzMQorCW1vdglEV09SRCBbMzIrZWN4KjQrZXNwXSxlYnAKKwlsZWEJZWJwLFtlZHgqMitlYXhdCisJbW92CWVheCxEV09SRCBbZXNpXQorCXNocgllZHgsMzEKKwltb3YJRFdPUkQgWzM2K2VjeCo0K2VzcF0sZWJwCisJbW92CURXT1JEIFs0MCtlY3gqNCtlc3BdLGVkeAorCW11bAllZGkKKwlhZGQJZWF4LERXT1JEIFszMitlc3BdCisJbW92CWVieCxlY3gKKwlhZGMJZWR4LDAKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwltb3YJZWN4LDEKK2FsaWduCTE2CitMJDAxMzNyZG1hZGQ6CisJbW92CWVicCxlZHgKKwltdWwJZWRpCisJYWRkCWVicCxEV09SRCBbMzIrZWN4KjQrZXNwXQorCWFkYwllZHgsMAorCWFkZAllYnAsZWF4CisJbW92CWVheCxEV09SRCBbNCtlY3gqNCtlc2ldCisJYWRjCWVkeCwwCisJbW92CURXT1JEIFsyOCtlY3gqNCtlc3BdLGVicAorCW1vdgllYnAsZWR4CisJbXVsCWVkaQorCWFkZAllYnAsRFdPUkQgWzM2K2VjeCo0K2VzcF0KKwlsZWEJZWN4LFsyK2VjeF0KKwlhZGMJZWR4LDAKKwlhZGQJZWJwLGVheAorCW1vdgllYXgsRFdPUkQgW2VjeCo0K2VzaV0KKwlhZGMJZWR4LDAKKwljbXAJZWN4LGVieAorCW1vdglEV09SRCBbMjQrZWN4KjQrZXNwXSxlYnAKKwlqbAlORUFSIEwkMDEzM3JkbWFkZAorCW1vdgllYnAsZWR4CisJbXVsCWVkaQorCWFkZAllYnAsRFdPUkQgWzMyK2VieCo0K2VzcF0KKwlhZGMJZWR4LDAKKwlhZGQJZWJwLGVheAorCWFkYwllZHgsMAorCW1vdglEV09SRCBbMjgrZWJ4KjQrZXNwXSxlYnAKKwltb3YJZWN4LERXT1JEIFsxMitlc3BdCisJeG9yCWVheCxlYXgKKwltb3YJZXNpLERXT1JEIFs4K2VzcF0KKwlhZGQJZWR4LERXT1JEIFszNitlYngqNCtlc3BdCisJYWRjCWVheCxEV09SRCBbNDArZWJ4KjQrZXNwXQorCW1vdglEV09SRCBbMzIrZWJ4KjQrZXNwXSxlZHgKKwljbXAJZWN4LGVieAorCW1vdglEV09SRCBbMzYrZWJ4KjQrZXNwXSxlYXgKKwlqZQlORUFSIEwkMDA3Y29tbW9uX3RhaWwKKwltb3YJZWRpLERXT1JEIFs0K2VjeCo0K2VzaV0KKwlsZWEJZWN4LFsxK2VjeF0KKwltb3YJZWF4LGVkaQorCW1vdglEV09SRCBbMTIrZXNwXSxlY3gKKwltdWwJZWRpCisJYWRkCWVheCxEV09SRCBbMzIrZWN4KjQrZXNwXQorCWFkYwllZHgsMAorCW1vdglEV09SRCBbMzIrZWN4KjQrZXNwXSxlYXgKKwl4b3IJZWJwLGVicAorCWNtcAllY3gsZWJ4CisJbGVhCWVjeCxbMStlY3hdCisJamUJTkVBUiBMJDAxNHNxcmxhc3QKKwltb3YJZWJ4LGVkeAorCXNocgllZHgsMQorCWFuZAllYngsMQorYWxpZ24JMTYKK0wkMDE1c3FyYWRkOgorCW1vdgllYXgsRFdPUkQgW2VjeCo0K2VzaV0KKwltb3YJZWJwLGVkeAorCW11bAllZGkKKwlhZGQJZWF4LGVicAorCWxlYQllYnAsW2VheCoxK2VheF0KKwlhZGMJZWR4LDAKKwlzaHIJZWF4LDMxCisJYWRkCWVicCxEV09SRCBbMzIrZWN4KjQrZXNwXQorCWxlYQllY3gsWzErZWN4XQorCWFkYwllYXgsMAorCWFkZAllYnAsZWJ4CisJYWRjCWVheCwwCisJY21wCWVjeCxEV09SRCBbZXNwXQorCW1vdglEV09SRCBbMjgrZWN4KjQrZXNwXSxlYnAKKwltb3YJZWJ4LGVheAorCWpsZQlORUFSIEwkMDE1c3FyYWRkCisJbW92CWVicCxlZHgKKwlhZGQJZWR4LGVkeAorCXNocgllYnAsMzEKKwlhZGQJZWR4LGVieAorCWFkYwllYnAsMAorTCQwMTRzcXJsYXN0OgorCW1vdgllZGksRFdPUkQgWzIwK2VzcF0KKwltb3YJZXNpLERXT1JEIFsxNitlc3BdCisJaW11bAllZGksRFdPUkQgWzMyK2VzcF0KKwlhZGQJZWR4LERXT1JEIFszMitlY3gqNCtlc3BdCisJbW92CWVheCxEV09SRCBbZXNpXQorCWFkYwllYnAsMAorCW1vdglEV09SRCBbMzIrZWN4KjQrZXNwXSxlZHgKKwltb3YJRFdPUkQgWzM2K2VjeCo0K2VzcF0sZWJwCisJbXVsCWVkaQorCWFkZAllYXgsRFdPUkQgWzMyK2VzcF0KKwlsZWEJZWJ4LFtlY3gtMV0KKwlhZGMJZWR4LDAKKwltb3YJZWN4LDEKKwltb3YJZWF4LERXT1JEIFs0K2VzaV0KKwlqbXAJTkVBUiBMJDAxMzNyZG1hZGQKK2FsaWduCTE2CitMJDAwN2NvbW1vbl90YWlsOgorCW1vdgllYnAsRFdPUkQgWzE2K2VzcF0KKwltb3YJZWRpLERXT1JEIFs0K2VzcF0KKwlsZWEJZXNpLFszMitlc3BdCisJbW92CWVheCxEV09SRCBbZXNpXQorCW1vdgllY3gsZWJ4CisJeG9yCWVkeCxlZHgKK2FsaWduCTE2CitMJDAxNnN1YjoKKwlzYmIJZWF4LERXT1JEIFtlZHgqNCtlYnBdCisJbW92CURXT1JEIFtlZHgqNCtlZGldLGVheAorCWRlYwllY3gKKwltb3YJZWF4LERXT1JEIFs0K2VkeCo0K2VzaV0KKwlsZWEJZWR4LFsxK2VkeF0KKwlqZ2UJTkVBUiBMJDAxNnN1YgorCXNiYgllYXgsMAorCW1vdgllZHgsLTEKKwl4b3IJZWR4LGVheAorCWptcAlORUFSIEwkMDE3Y29weQorYWxpZ24JMTYKK0wkMDE3Y29weToKKwltb3YJZXNpLERXT1JEIFszMitlYngqNCtlc3BdCisJbW92CWVicCxEV09SRCBbZWJ4KjQrZWRpXQorCW1vdglEV09SRCBbMzIrZWJ4KjQrZXNwXSxlY3gKKwlhbmQJZXNpLGVheAorCWFuZAllYnAsZWR4CisJb3IJZWJwLGVzaQorCW1vdglEV09SRCBbZWJ4KjQrZWRpXSxlYnAKKwlkZWMJZWJ4CisJamdlCU5FQVIgTCQwMTdjb3B5CisJbW92CWVzcCxEV09SRCBbMjQrZXNwXQorCW1vdgllYXgsMQorTCQwMDBqdXN0X2xlYXZlOgorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXBvcAllYnAKKwlyZXQKK2RiCTc3LDExMSwxMTAsMTE2LDEwMywxMTEsMTA5LDEwMSwxMTQsMTIxLDMyLDc3LDExNywxMDgsMTE2LDEwNQorZGIJMTEyLDEwOCwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1NgorZGIJNTQsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxCitkYgkzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2CitkYgkxMTEsMTE0LDEwMyw2MiwwCitzZWdtZW50CS5ic3MKK2NvbW1vbglfT1BFTlNTTF9pYTMyY2FwX1AgMTYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9jaGFjaGEvY2hhY2hhLXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzNjI0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vY2hhY2hhL2NoYWNoYS14ODZfNjQuYXNtCkBAIC0wLDAgKzEsMTg5MSBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCisKK0VYVEVSTglPUEVOU1NMX2lhMzJjYXBfUAorCitBTElHTgk2NAorJEwkemVybzoKKwlERAkwLDAsMCwwCiskTCRvbmU6CisJREQJMSwwLDAsMAorJEwkaW5jOgorCURECTAsMSwyLDMKKyRMJGZvdXI6CisJREQJNCw0LDQsNAorJEwkaW5jeToKKwlERAkwLDIsNCw2LDEsMyw1LDcKKyRMJGVpZ2h0OgorCURECTgsOCw4LDgsOCw4LDgsOAorJEwkcm90MTY6CitEQgkweDIsMHgzLDB4MCwweDEsMHg2LDB4NywweDQsMHg1LDB4YSwweGIsMHg4LDB4OSwweGUsMHhmLDB4YywweGQKKyRMJHJvdDI0OgorREIJMHgzLDB4MCwweDEsMHgyLDB4NywweDQsMHg1LDB4NiwweGIsMHg4LDB4OSwweGEsMHhmLDB4YywweGQsMHhlCiskTCRzaWdtYToKK0RCCTEwMSwxMjAsMTEyLDk3LDExMCwxMDAsMzIsNTEsNTAsNDUsOTgsMTIxLDExNiwxMDEsMzIsMTA3CitEQgkwCitBTElHTgk2NAorJEwkemVyb3o6CisJREQJMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsMywwLDAsMAorJEwkZm91cno6CisJREQJNCwwLDAsMCw0LDAsMCwwLDQsMCwwLDAsNCwwLDAsMAorJEwkaW5jejoKKwlERAkwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CiskTCRzaXh0ZWVuOgorCURECTE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2CitEQgk2NywxMDQsOTcsNjcsMTA0LDk3LDUwLDQ4LDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NAorREIJOTUsNTQsNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIKK0RCCTk4LDEyMSwzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUKK0RCCTEwOCw0NiwxMTEsMTE0LDEwMyw2MiwwCitnbG9iYWwJQ2hhQ2hhMjBfY3RyMzIKKworQUxJR04JNjQKK0NoYUNoYTIwX2N0cjMyOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fQ2hhQ2hhMjBfY3RyMzI6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKworCisJY21wCXJkeCwwCisJamUJTkVBUiAkTCRub19kYXRhCisJbW92CXIxMCxRV09SRFsoKE9QRU5TU0xfaWEzMmNhcF9QKzQpKV0KKwl0ZXN0CXIxMGQsNTEyCisJam56CU5FQVIgJEwkQ2hhQ2hhMjBfc3NzZTMKKworCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXN1Yglyc3AsNjQrMjQKKyRMJGN0cjMyX2JvZHk6CisKKworCW1vdmRxdQl4bW0xLFhNTVdPUkRbcmN4XQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMTYrcmN4XQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbcjhdCisJbW92ZHFhCXhtbTQsWE1NV09SRFskTCRvbmVdCisKKworCW1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tMQorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tMworCW1vdglyYnAscmR4CisJam1wCU5FQVIgJEwkb29wX291dGVyCisKK0FMSUdOCTMyCiskTCRvb3Bfb3V0ZXI6CisJbW92CWVheCwweDYxNzA3ODY1CisJbW92CWVieCwweDMzMjA2NDZlCisJbW92CWVjeCwweDc5NjIyZDMyCisJbW92CWVkeCwweDZiMjA2NTc0CisJbW92CXI4ZCxEV09SRFsxNityc3BdCisJbW92CXI5ZCxEV09SRFsyMCtyc3BdCisJbW92CXIxMGQsRFdPUkRbMjQrcnNwXQorCW1vdglyMTFkLERXT1JEWzI4K3JzcF0KKwltb3ZkCXIxMmQseG1tMworCW1vdglyMTNkLERXT1JEWzUyK3JzcF0KKwltb3YJcjE0ZCxEV09SRFs1Nityc3BdCisJbW92CXIxNWQsRFdPUkRbNjArcnNwXQorCisJbW92CVFXT1JEWygoNjQrMCkpK3JzcF0scmJwCisJbW92CWVicCwxMAorCW1vdglRV09SRFsoKDY0KzgpKStyc3BdLHJzaQorREIJMTAyLDcyLDE1LDEyNiwyMTQKKwltb3YJUVdPUkRbKCg2NCsxNikpK3JzcF0scmRpCisJbW92CXJkaSxyc2kKKwlzaHIJcmRpLDMyCisJam1wCU5FQVIgJEwkb29wCisKK0FMSUdOCTMyCiskTCRvb3A6CisJYWRkCWVheCxyOGQKKwl4b3IJcjEyZCxlYXgKKwlyb2wJcjEyZCwxNgorCWFkZAllYngscjlkCisJeG9yCXIxM2QsZWJ4CisJcm9sCXIxM2QsMTYKKwlhZGQJZXNpLHIxMmQKKwl4b3IJcjhkLGVzaQorCXJvbAlyOGQsMTIKKwlhZGQJZWRpLHIxM2QKKwl4b3IJcjlkLGVkaQorCXJvbAlyOWQsMTIKKwlhZGQJZWF4LHI4ZAorCXhvcglyMTJkLGVheAorCXJvbAlyMTJkLDgKKwlhZGQJZWJ4LHI5ZAorCXhvcglyMTNkLGVieAorCXJvbAlyMTNkLDgKKwlhZGQJZXNpLHIxMmQKKwl4b3IJcjhkLGVzaQorCXJvbAlyOGQsNworCWFkZAllZGkscjEzZAorCXhvcglyOWQsZWRpCisJcm9sCXI5ZCw3CisJbW92CURXT1JEWzMyK3JzcF0sZXNpCisJbW92CURXT1JEWzM2K3JzcF0sZWRpCisJbW92CWVzaSxEV09SRFs0MCtyc3BdCisJbW92CWVkaSxEV09SRFs0NCtyc3BdCisJYWRkCWVjeCxyMTBkCisJeG9yCXIxNGQsZWN4CisJcm9sCXIxNGQsMTYKKwlhZGQJZWR4LHIxMWQKKwl4b3IJcjE1ZCxlZHgKKwlyb2wJcjE1ZCwxNgorCWFkZAllc2kscjE0ZAorCXhvcglyMTBkLGVzaQorCXJvbAlyMTBkLDEyCisJYWRkCWVkaSxyMTVkCisJeG9yCXIxMWQsZWRpCisJcm9sCXIxMWQsMTIKKwlhZGQJZWN4LHIxMGQKKwl4b3IJcjE0ZCxlY3gKKwlyb2wJcjE0ZCw4CisJYWRkCWVkeCxyMTFkCisJeG9yCXIxNWQsZWR4CisJcm9sCXIxNWQsOAorCWFkZAllc2kscjE0ZAorCXhvcglyMTBkLGVzaQorCXJvbAlyMTBkLDcKKwlhZGQJZWRpLHIxNWQKKwl4b3IJcjExZCxlZGkKKwlyb2wJcjExZCw3CisJYWRkCWVheCxyOWQKKwl4b3IJcjE1ZCxlYXgKKwlyb2wJcjE1ZCwxNgorCWFkZAllYngscjEwZAorCXhvcglyMTJkLGVieAorCXJvbAlyMTJkLDE2CisJYWRkCWVzaSxyMTVkCisJeG9yCXI5ZCxlc2kKKwlyb2wJcjlkLDEyCisJYWRkCWVkaSxyMTJkCisJeG9yCXIxMGQsZWRpCisJcm9sCXIxMGQsMTIKKwlhZGQJZWF4LHI5ZAorCXhvcglyMTVkLGVheAorCXJvbAlyMTVkLDgKKwlhZGQJZWJ4LHIxMGQKKwl4b3IJcjEyZCxlYngKKwlyb2wJcjEyZCw4CisJYWRkCWVzaSxyMTVkCisJeG9yCXI5ZCxlc2kKKwlyb2wJcjlkLDcKKwlhZGQJZWRpLHIxMmQKKwl4b3IJcjEwZCxlZGkKKwlyb2wJcjEwZCw3CisJbW92CURXT1JEWzQwK3JzcF0sZXNpCisJbW92CURXT1JEWzQ0K3JzcF0sZWRpCisJbW92CWVzaSxEV09SRFszMityc3BdCisJbW92CWVkaSxEV09SRFszNityc3BdCisJYWRkCWVjeCxyMTFkCisJeG9yCXIxM2QsZWN4CisJcm9sCXIxM2QsMTYKKwlhZGQJZWR4LHI4ZAorCXhvcglyMTRkLGVkeAorCXJvbAlyMTRkLDE2CisJYWRkCWVzaSxyMTNkCisJeG9yCXIxMWQsZXNpCisJcm9sCXIxMWQsMTIKKwlhZGQJZWRpLHIxNGQKKwl4b3IJcjhkLGVkaQorCXJvbAlyOGQsMTIKKwlhZGQJZWN4LHIxMWQKKwl4b3IJcjEzZCxlY3gKKwlyb2wJcjEzZCw4CisJYWRkCWVkeCxyOGQKKwl4b3IJcjE0ZCxlZHgKKwlyb2wJcjE0ZCw4CisJYWRkCWVzaSxyMTNkCisJeG9yCXIxMWQsZXNpCisJcm9sCXIxMWQsNworCWFkZAllZGkscjE0ZAorCXhvcglyOGQsZWRpCisJcm9sCXI4ZCw3CisJZGVjCWVicAorCWpueglORUFSICRMJG9vcAorCW1vdglEV09SRFszNityc3BdLGVkaQorCW1vdglEV09SRFszMityc3BdLGVzaQorCW1vdglyYnAsUVdPUkRbNjQrcnNwXQorCW1vdmRxYQl4bW0xLHhtbTIKKwltb3YJcnNpLFFXT1JEWygoNjQrOCkpK3JzcF0KKwlwYWRkZAl4bW0zLHhtbTQKKwltb3YJcmRpLFFXT1JEWygoNjQrMTYpKStyc3BdCisKKwlhZGQJZWF4LDB4NjE3MDc4NjUKKwlhZGQJZWJ4LDB4MzMyMDY0NmUKKwlhZGQJZWN4LDB4Nzk2MjJkMzIKKwlhZGQJZWR4LDB4NmIyMDY1NzQKKwlhZGQJcjhkLERXT1JEWzE2K3JzcF0KKwlhZGQJcjlkLERXT1JEWzIwK3JzcF0KKwlhZGQJcjEwZCxEV09SRFsyNCtyc3BdCisJYWRkCXIxMWQsRFdPUkRbMjgrcnNwXQorCWFkZAlyMTJkLERXT1JEWzQ4K3JzcF0KKwlhZGQJcjEzZCxEV09SRFs1Mityc3BdCisJYWRkCXIxNGQsRFdPUkRbNTYrcnNwXQorCWFkZAlyMTVkLERXT1JEWzYwK3JzcF0KKwlwYWRkZAl4bW0xLFhNTVdPUkRbMzIrcnNwXQorCisJY21wCXJicCw2NAorCWpiCU5FQVIgJEwkdGFpbAorCisJeG9yCWVheCxEV09SRFtyc2ldCisJeG9yCWVieCxEV09SRFs0K3JzaV0KKwl4b3IJZWN4LERXT1JEWzgrcnNpXQorCXhvcgllZHgsRFdPUkRbMTIrcnNpXQorCXhvcglyOGQsRFdPUkRbMTYrcnNpXQorCXhvcglyOWQsRFdPUkRbMjArcnNpXQorCXhvcglyMTBkLERXT1JEWzI0K3JzaV0KKwl4b3IJcjExZCxEV09SRFsyOCtyc2ldCisJbW92ZHF1CXhtbTAsWE1NV09SRFszMityc2ldCisJeG9yCXIxMmQsRFdPUkRbNDgrcnNpXQorCXhvcglyMTNkLERXT1JEWzUyK3JzaV0KKwl4b3IJcjE0ZCxEV09SRFs1Nityc2ldCisJeG9yCXIxNWQsRFdPUkRbNjArcnNpXQorCWxlYQlyc2ksWzY0K3JzaV0KKwlweG9yCXhtbTAseG1tMQorCisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0yCisJbW92ZAlEV09SRFs0OCtyc3BdLHhtbTMKKworCW1vdglEV09SRFtyZGldLGVheAorCW1vdglEV09SRFs0K3JkaV0sZWJ4CisJbW92CURXT1JEWzgrcmRpXSxlY3gKKwltb3YJRFdPUkRbMTIrcmRpXSxlZHgKKwltb3YJRFdPUkRbMTYrcmRpXSxyOGQKKwltb3YJRFdPUkRbMjArcmRpXSxyOWQKKwltb3YJRFdPUkRbMjQrcmRpXSxyMTBkCisJbW92CURXT1JEWzI4K3JkaV0scjExZAorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMAorCW1vdglEV09SRFs0OCtyZGldLHIxMmQKKwltb3YJRFdPUkRbNTIrcmRpXSxyMTNkCisJbW92CURXT1JEWzU2K3JkaV0scjE0ZAorCW1vdglEV09SRFs2MCtyZGldLHIxNWQKKwlsZWEJcmRpLFs2NCtyZGldCisKKwlzdWIJcmJwLDY0CisJam56CU5FQVIgJEwkb29wX291dGVyCisKKwlqbXAJTkVBUiAkTCRkb25lCisKK0FMSUdOCTE2CiskTCR0YWlsOgorCW1vdglEV09SRFtyc3BdLGVheAorCW1vdglEV09SRFs0K3JzcF0sZWJ4CisJeG9yCXJieCxyYngKKwltb3YJRFdPUkRbOCtyc3BdLGVjeAorCW1vdglEV09SRFsxMityc3BdLGVkeAorCW1vdglEV09SRFsxNityc3BdLHI4ZAorCW1vdglEV09SRFsyMCtyc3BdLHI5ZAorCW1vdglEV09SRFsyNCtyc3BdLHIxMGQKKwltb3YJRFdPUkRbMjgrcnNwXSxyMTFkCisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0xCisJbW92CURXT1JEWzQ4K3JzcF0scjEyZAorCW1vdglEV09SRFs1Mityc3BdLHIxM2QKKwltb3YJRFdPUkRbNTYrcnNwXSxyMTRkCisJbW92CURXT1JEWzYwK3JzcF0scjE1ZAorCiskTCRvb3BfdGFpbDoKKwltb3Z6eAllYXgsQllURVtyYngqMStyc2ldCisJbW92engJZWR4LEJZVEVbcmJ4KjErcnNwXQorCWxlYQlyYngsWzErcmJ4XQorCXhvcgllYXgsZWR4CisJbW92CUJZVEVbKCgtMSkpK3JieCoxK3JkaV0sYWwKKwlkZWMJcmJwCisJam56CU5FQVIgJEwkb29wX3RhaWwKKworJEwkZG9uZToKKwlsZWEJcnNpLFsoKDY0KzI0KzQ4KSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JzaV0KKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JzaV0KKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyc2ldCisJbGVhCXJzcCxbcnNpXQorJEwkbm9fZGF0YToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKyRMJFNFSF9lbmRfQ2hhQ2hhMjBfY3RyMzI6CisKK0FMSUdOCTMyCitDaGFDaGEyMF9zc3NlMzoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX0NoYUNoYTIwX3Nzc2UzOgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisKKworJEwkQ2hhQ2hhMjBfc3NzZTM6CisJbW92CXI5LHJzcAorCWNtcAlyZHgsMTI4CisJamEJTkVBUiAkTCRDaGFDaGEyMF80eAorCiskTCRkb19zc2UzX2FmdGVyX2FsbDoKKwlzdWIJcnNwLDY0KzQwCisJbW92YXBzCVhNTVdPUkRbKC00MCkrcjldLHhtbTYKKwltb3ZhcHMJWE1NV09SRFsoLTI0KStyOV0seG1tNworJEwkc3NzZTNfYm9keToKKwltb3ZkcWEJeG1tMCxYTU1XT1JEWyRMJHNpZ21hXQorCW1vdmRxdQl4bW0xLFhNTVdPUkRbcmN4XQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMTYrcmN4XQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbcjhdCisJbW92ZHFhCXhtbTYsWE1NV09SRFskTCRyb3QxNl0KKwltb3ZkcWEJeG1tNyxYTU1XT1JEWyRMJHJvdDI0XQorCisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW0wCisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0xCisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0yCisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0zCisJbW92CXI4LDEwCisJam1wCU5FQVIgJEwkb29wX3Nzc2UzCisKK0FMSUdOCTMyCiskTCRvb3Bfb3V0ZXJfc3NzZTM6CisJbW92ZHFhCXhtbTMsWE1NV09SRFskTCRvbmVdCisJbW92ZHFhCXhtbTAsWE1NV09SRFtyc3BdCisJbW92ZHFhCXhtbTEsWE1NV09SRFsxNityc3BdCisJbW92ZHFhCXhtbTIsWE1NV09SRFszMityc3BdCisJcGFkZGQJeG1tMyxYTU1XT1JEWzQ4K3JzcF0KKwltb3YJcjgsMTAKKwltb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTMKKwlqbXAJTkVBUiAkTCRvb3Bfc3NzZTMKKworQUxJR04JMzIKKyRMJG9vcF9zc3NlMzoKKwlwYWRkZAl4bW0wLHhtbTEKKwlweG9yCXhtbTMseG1tMAorREIJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJeG1tMix4bW0zCisJcHhvcgl4bW0xLHhtbTIKKwltb3ZkcWEJeG1tNCx4bW0xCisJcHNybGQJeG1tMSwyMAorCXBzbGxkCXhtbTQsMTIKKwlwb3IJeG1tMSx4bW00CisJcGFkZGQJeG1tMCx4bW0xCisJcHhvcgl4bW0zLHhtbTAKK0RCCTEwMiwxNSw1NiwwLDIyMworCXBhZGRkCXhtbTIseG1tMworCXB4b3IJeG1tMSx4bW0yCisJbW92ZHFhCXhtbTQseG1tMQorCXBzcmxkCXhtbTEsMjUKKwlwc2xsZAl4bW00LDcKKwlwb3IJeG1tMSx4bW00CisJcHNodWZkCXhtbTIseG1tMiw3OAorCXBzaHVmZAl4bW0xLHhtbTEsNTcKKwlwc2h1ZmQJeG1tMyx4bW0zLDE0NworCW5vcAorCXBhZGRkCXhtbTAseG1tMQorCXB4b3IJeG1tMyx4bW0wCitEQgkxMDIsMTUsNTYsMCwyMjIKKwlwYWRkZAl4bW0yLHhtbTMKKwlweG9yCXhtbTEseG1tMgorCW1vdmRxYQl4bW00LHhtbTEKKwlwc3JsZAl4bW0xLDIwCisJcHNsbGQJeG1tNCwxMgorCXBvcgl4bW0xLHhtbTQKKwlwYWRkZAl4bW0wLHhtbTEKKwlweG9yCXhtbTMseG1tMAorREIJMTAyLDE1LDU2LDAsMjIzCisJcGFkZGQJeG1tMix4bW0zCisJcHhvcgl4bW0xLHhtbTIKKwltb3ZkcWEJeG1tNCx4bW0xCisJcHNybGQJeG1tMSwyNQorCXBzbGxkCXhtbTQsNworCXBvcgl4bW0xLHhtbTQKKwlwc2h1ZmQJeG1tMix4bW0yLDc4CisJcHNodWZkCXhtbTEseG1tMSwxNDcKKwlwc2h1ZmQJeG1tMyx4bW0zLDU3CisJZGVjCXI4CisJam56CU5FQVIgJEwkb29wX3Nzc2UzCisJcGFkZGQJeG1tMCxYTU1XT1JEW3JzcF0KKwlwYWRkZAl4bW0xLFhNTVdPUkRbMTYrcnNwXQorCXBhZGRkCXhtbTIsWE1NV09SRFszMityc3BdCisJcGFkZGQJeG1tMyxYTU1XT1JEWzQ4K3JzcF0KKworCWNtcAlyZHgsNjQKKwlqYglORUFSICRMJHRhaWxfc3NzZTMKKworCW1vdmRxdQl4bW00LFhNTVdPUkRbcnNpXQorCW1vdmRxdQl4bW01LFhNTVdPUkRbMTYrcnNpXQorCXB4b3IJeG1tMCx4bW00CisJbW92ZHF1CXhtbTQsWE1NV09SRFszMityc2ldCisJcHhvcgl4bW0xLHhtbTUKKwltb3ZkcXUJeG1tNSxYTU1XT1JEWzQ4K3JzaV0KKwlsZWEJcnNpLFs2NCtyc2ldCisJcHhvcgl4bW0yLHhtbTQKKwlweG9yCXhtbTMseG1tNQorCisJbW92ZHF1CVhNTVdPUkRbcmRpXSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbMTYrcmRpXSx4bW0xCisJbW92ZHF1CVhNTVdPUkRbMzIrcmRpXSx4bW0yCisJbW92ZHF1CVhNTVdPUkRbNDgrcmRpXSx4bW0zCisJbGVhCXJkaSxbNjQrcmRpXQorCisJc3ViCXJkeCw2NAorCWpueglORUFSICRMJG9vcF9vdXRlcl9zc3NlMworCisJam1wCU5FQVIgJEwkZG9uZV9zc3NlMworCitBTElHTgkxNgorJEwkdGFpbF9zc3NlMzoKKwltb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTEKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTIKKwltb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTMKKwl4b3IJcjgscjgKKworJEwkb29wX3RhaWxfc3NzZTM6CisJbW92engJZWF4LEJZVEVbcjgqMStyc2ldCisJbW92engJZWN4LEJZVEVbcjgqMStyc3BdCisJbGVhCXI4LFsxK3I4XQorCXhvcgllYXgsZWN4CisJbW92CUJZVEVbKCgtMSkpK3I4KjErcmRpXSxhbAorCWRlYwlyZHgKKwlqbnoJTkVBUiAkTCRvb3BfdGFpbF9zc3NlMworCiskTCRkb25lX3Nzc2UzOgorCW1vdmFwcwl4bW02LFhNTVdPUkRbKCgtNDApKStyOV0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWygoLTI0KSkrcjldCisJbGVhCXJzcCxbcjldCiskTCRzc3NlM19lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKyRMJFNFSF9lbmRfQ2hhQ2hhMjBfc3NzZTM6CisKK0FMSUdOCTMyCitDaGFDaGEyMF80eDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX0NoYUNoYTIwXzR4OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisKKworJEwkQ2hhQ2hhMjBfNHg6CisJbW92CXI5LHJzcAorCW1vdglyMTEscjEwCisJc2hyCXIxMCwzMgorCXRlc3QJcjEwLDMyCisJam56CU5FQVIgJEwkQ2hhQ2hhMjBfOHgKKwljbXAJcmR4LDE5MgorCWphCU5FQVIgJEwkcHJvY2VlZDR4CisKKwlhbmQJcjExLDcxMzAzMTY4CisJY21wCXIxMSw0MTk0MzA0CisJamUJTkVBUiAkTCRkb19zc2UzX2FmdGVyX2FsbAorCiskTCRwcm9jZWVkNHg6CisJc3ViCXJzcCwweDE0MCsxNjgKKwltb3ZhcHMJWE1NV09SRFsoLTE2OCkrcjldLHhtbTYKKwltb3ZhcHMJWE1NV09SRFsoLTE1MikrcjldLHhtbTcKKwltb3ZhcHMJWE1NV09SRFsoLTEzNikrcjldLHhtbTgKKwltb3ZhcHMJWE1NV09SRFsoLTEyMCkrcjldLHhtbTkKKwltb3ZhcHMJWE1NV09SRFsoLTEwNCkrcjldLHhtbTEwCisJbW92YXBzCVhNTVdPUkRbKC04OCkrcjldLHhtbTExCisJbW92YXBzCVhNTVdPUkRbKC03MikrcjldLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbKC01NikrcjldLHhtbTEzCisJbW92YXBzCVhNTVdPUkRbKC00MCkrcjldLHhtbTE0CisJbW92YXBzCVhNTVdPUkRbKC0yNCkrcjldLHhtbTE1CiskTCQ0eF9ib2R5OgorCW1vdmRxYQl4bW0xMSxYTU1XT1JEWyRMJHNpZ21hXQorCW1vdmRxdQl4bW0xNSxYTU1XT1JEW3JjeF0KKwltb3ZkcXUJeG1tNyxYTU1XT1JEWzE2K3JjeF0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEW3I4XQorCWxlYQlyY3gsWzI1Nityc3BdCisJbGVhCXIxMCxbJEwkcm90MTZdCisJbGVhCXIxMSxbJEwkcm90MjRdCisKKwlwc2h1ZmQJeG1tOCx4bW0xMSwweDAwCisJcHNodWZkCXhtbTkseG1tMTEsMHg1NQorCW1vdmRxYQlYTU1XT1JEWzY0K3JzcF0seG1tOAorCXBzaHVmZAl4bW0xMCx4bW0xMSwweGFhCisJbW92ZHFhCVhNTVdPUkRbODArcnNwXSx4bW05CisJcHNodWZkCXhtbTExLHhtbTExLDB4ZmYKKwltb3ZkcWEJWE1NV09SRFs5Nityc3BdLHhtbTEwCisJbW92ZHFhCVhNTVdPUkRbMTEyK3JzcF0seG1tMTEKKworCXBzaHVmZAl4bW0xMix4bW0xNSwweDAwCisJcHNodWZkCXhtbTEzLHhtbTE1LDB4NTUKKwltb3ZkcWEJWE1NV09SRFsoMTI4LTI1NikrcmN4XSx4bW0xMgorCXBzaHVmZAl4bW0xNCx4bW0xNSwweGFhCisJbW92ZHFhCVhNTVdPUkRbKDE0NC0yNTYpK3JjeF0seG1tMTMKKwlwc2h1ZmQJeG1tMTUseG1tMTUsMHhmZgorCW1vdmRxYQlYTU1XT1JEWygxNjAtMjU2KStyY3hdLHhtbTE0CisJbW92ZHFhCVhNTVdPUkRbKDE3Ni0yNTYpK3JjeF0seG1tMTUKKworCXBzaHVmZAl4bW00LHhtbTcsMHgwMAorCXBzaHVmZAl4bW01LHhtbTcsMHg1NQorCW1vdmRxYQlYTU1XT1JEWygxOTItMjU2KStyY3hdLHhtbTQKKwlwc2h1ZmQJeG1tNix4bW03LDB4YWEKKwltb3ZkcWEJWE1NV09SRFsoMjA4LTI1NikrcmN4XSx4bW01CisJcHNodWZkCXhtbTcseG1tNywweGZmCisJbW92ZHFhCVhNTVdPUkRbKDIyNC0yNTYpK3JjeF0seG1tNgorCW1vdmRxYQlYTU1XT1JEWygyNDAtMjU2KStyY3hdLHhtbTcKKworCXBzaHVmZAl4bW0wLHhtbTMsMHgwMAorCXBzaHVmZAl4bW0xLHhtbTMsMHg1NQorCXBhZGRkCXhtbTAsWE1NV09SRFskTCRpbmNdCisJcHNodWZkCXhtbTIseG1tMywweGFhCisJbW92ZHFhCVhNTVdPUkRbKDI3Mi0yNTYpK3JjeF0seG1tMQorCXBzaHVmZAl4bW0zLHhtbTMsMHhmZgorCW1vdmRxYQlYTU1XT1JEWygyODgtMjU2KStyY3hdLHhtbTIKKwltb3ZkcWEJWE1NV09SRFsoMzA0LTI1NikrcmN4XSx4bW0zCisKKwlqbXAJTkVBUiAkTCRvb3BfZW50ZXI0eAorCitBTElHTgkzMgorJEwkb29wX291dGVyNHg6CisJbW92ZHFhCXhtbTgsWE1NV09SRFs2NCtyc3BdCisJbW92ZHFhCXhtbTksWE1NV09SRFs4MCtyc3BdCisJbW92ZHFhCXhtbTEwLFhNTVdPUkRbOTYrcnNwXQorCW1vdmRxYQl4bW0xMSxYTU1XT1JEWzExMityc3BdCisJbW92ZHFhCXhtbTEyLFhNTVdPUkRbKCgxMjgtMjU2KSkrcmN4XQorCW1vdmRxYQl4bW0xMyxYTU1XT1JEWygoMTQ0LTI1NikpK3JjeF0KKwltb3ZkcWEJeG1tMTQsWE1NV09SRFsoKDE2MC0yNTYpKStyY3hdCisJbW92ZHFhCXhtbTE1LFhNTVdPUkRbKCgxNzYtMjU2KSkrcmN4XQorCW1vdmRxYQl4bW00LFhNTVdPUkRbKCgxOTItMjU2KSkrcmN4XQorCW1vdmRxYQl4bW01LFhNTVdPUkRbKCgyMDgtMjU2KSkrcmN4XQorCW1vdmRxYQl4bW02LFhNTVdPUkRbKCgyMjQtMjU2KSkrcmN4XQorCW1vdmRxYQl4bW03LFhNTVdPUkRbKCgyNDAtMjU2KSkrcmN4XQorCW1vdmRxYQl4bW0wLFhNTVdPUkRbKCgyNTYtMjU2KSkrcmN4XQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbKCgyNzItMjU2KSkrcmN4XQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbKCgyODgtMjU2KSkrcmN4XQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbKCgzMDQtMjU2KSkrcmN4XQorCXBhZGRkCXhtbTAsWE1NV09SRFskTCRmb3VyXQorCiskTCRvb3BfZW50ZXI0eDoKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTYKKwltb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTcKKwltb3ZkcWEJeG1tNyxYTU1XT1JEW3IxMF0KKwltb3YJZWF4LDEwCisJbW92ZHFhCVhNTVdPUkRbKDI1Ni0yNTYpK3JjeF0seG1tMAorCWptcAlORUFSICRMJG9vcDR4CisKK0FMSUdOCTMyCiskTCRvb3A0eDoKKwlwYWRkZAl4bW04LHhtbTEyCisJcGFkZGQJeG1tOSx4bW0xMworCXB4b3IJeG1tMCx4bW04CisJcHhvcgl4bW0xLHhtbTkKK0RCCTEwMiwxNSw1NiwwLDE5OQorREIJMTAyLDE1LDU2LDAsMjA3CisJcGFkZGQJeG1tNCx4bW0wCisJcGFkZGQJeG1tNSx4bW0xCisJcHhvcgl4bW0xMix4bW00CisJcHhvcgl4bW0xMyx4bW01CisJbW92ZHFhCXhtbTYseG1tMTIKKwlwc2xsZAl4bW0xMiwxMgorCXBzcmxkCXhtbTYsMjAKKwltb3ZkcWEJeG1tNyx4bW0xMworCXBzbGxkCXhtbTEzLDEyCisJcG9yCXhtbTEyLHhtbTYKKwlwc3JsZAl4bW03LDIwCisJbW92ZHFhCXhtbTYsWE1NV09SRFtyMTFdCisJcG9yCXhtbTEzLHhtbTcKKwlwYWRkZAl4bW04LHhtbTEyCisJcGFkZGQJeG1tOSx4bW0xMworCXB4b3IJeG1tMCx4bW04CisJcHhvcgl4bW0xLHhtbTkKK0RCCTEwMiwxNSw1NiwwLDE5OAorREIJMTAyLDE1LDU2LDAsMjA2CisJcGFkZGQJeG1tNCx4bW0wCisJcGFkZGQJeG1tNSx4bW0xCisJcHhvcgl4bW0xMix4bW00CisJcHhvcgl4bW0xMyx4bW01CisJbW92ZHFhCXhtbTcseG1tMTIKKwlwc2xsZAl4bW0xMiw3CisJcHNybGQJeG1tNywyNQorCW1vdmRxYQl4bW02LHhtbTEzCisJcHNsbGQJeG1tMTMsNworCXBvcgl4bW0xMix4bW03CisJcHNybGQJeG1tNiwyNQorCW1vdmRxYQl4bW03LFhNTVdPUkRbcjEwXQorCXBvcgl4bW0xMyx4bW02CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW00CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW01CisJbW92ZHFhCXhtbTQsWE1NV09SRFszMityc3BdCisJbW92ZHFhCXhtbTUsWE1NV09SRFs0OCtyc3BdCisJcGFkZGQJeG1tMTAseG1tMTQKKwlwYWRkZAl4bW0xMSx4bW0xNQorCXB4b3IJeG1tMix4bW0xMAorCXB4b3IJeG1tMyx4bW0xMQorREIJMTAyLDE1LDU2LDAsMjE1CitEQgkxMDIsMTUsNTYsMCwyMjMKKwlwYWRkZAl4bW00LHhtbTIKKwlwYWRkZAl4bW01LHhtbTMKKwlweG9yCXhtbTE0LHhtbTQKKwlweG9yCXhtbTE1LHhtbTUKKwltb3ZkcWEJeG1tNix4bW0xNAorCXBzbGxkCXhtbTE0LDEyCisJcHNybGQJeG1tNiwyMAorCW1vdmRxYQl4bW03LHhtbTE1CisJcHNsbGQJeG1tMTUsMTIKKwlwb3IJeG1tMTQseG1tNgorCXBzcmxkCXhtbTcsMjAKKwltb3ZkcWEJeG1tNixYTU1XT1JEW3IxMV0KKwlwb3IJeG1tMTUseG1tNworCXBhZGRkCXhtbTEwLHhtbTE0CisJcGFkZGQJeG1tMTEseG1tMTUKKwlweG9yCXhtbTIseG1tMTAKKwlweG9yCXhtbTMseG1tMTEKK0RCCTEwMiwxNSw1NiwwLDIxNAorREIJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJeG1tNCx4bW0yCisJcGFkZGQJeG1tNSx4bW0zCisJcHhvcgl4bW0xNCx4bW00CisJcHhvcgl4bW0xNSx4bW01CisJbW92ZHFhCXhtbTcseG1tMTQKKwlwc2xsZAl4bW0xNCw3CisJcHNybGQJeG1tNywyNQorCW1vdmRxYQl4bW02LHhtbTE1CisJcHNsbGQJeG1tMTUsNworCXBvcgl4bW0xNCx4bW03CisJcHNybGQJeG1tNiwyNQorCW1vdmRxYQl4bW03LFhNTVdPUkRbcjEwXQorCXBvcgl4bW0xNSx4bW02CisJcGFkZGQJeG1tOCx4bW0xMworCXBhZGRkCXhtbTkseG1tMTQKKwlweG9yCXhtbTMseG1tOAorCXB4b3IJeG1tMCx4bW05CitEQgkxMDIsMTUsNTYsMCwyMjMKK0RCCTEwMiwxNSw1NiwwLDE5OQorCXBhZGRkCXhtbTQseG1tMworCXBhZGRkCXhtbTUseG1tMAorCXB4b3IJeG1tMTMseG1tNAorCXB4b3IJeG1tMTQseG1tNQorCW1vdmRxYQl4bW02LHhtbTEzCisJcHNsbGQJeG1tMTMsMTIKKwlwc3JsZAl4bW02LDIwCisJbW92ZHFhCXhtbTcseG1tMTQKKwlwc2xsZAl4bW0xNCwxMgorCXBvcgl4bW0xMyx4bW02CisJcHNybGQJeG1tNywyMAorCW1vdmRxYQl4bW02LFhNTVdPUkRbcjExXQorCXBvcgl4bW0xNCx4bW03CisJcGFkZGQJeG1tOCx4bW0xMworCXBhZGRkCXhtbTkseG1tMTQKKwlweG9yCXhtbTMseG1tOAorCXB4b3IJeG1tMCx4bW05CitEQgkxMDIsMTUsNTYsMCwyMjIKK0RCCTEwMiwxNSw1NiwwLDE5OAorCXBhZGRkCXhtbTQseG1tMworCXBhZGRkCXhtbTUseG1tMAorCXB4b3IJeG1tMTMseG1tNAorCXB4b3IJeG1tMTQseG1tNQorCW1vdmRxYQl4bW03LHhtbTEzCisJcHNsbGQJeG1tMTMsNworCXBzcmxkCXhtbTcsMjUKKwltb3ZkcWEJeG1tNix4bW0xNAorCXBzbGxkCXhtbTE0LDcKKwlwb3IJeG1tMTMseG1tNworCXBzcmxkCXhtbTYsMjUKKwltb3ZkcWEJeG1tNyxYTU1XT1JEW3IxMF0KKwlwb3IJeG1tMTQseG1tNgorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tNAorCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tNQorCW1vdmRxYQl4bW00LFhNTVdPUkRbcnNwXQorCW1vdmRxYQl4bW01LFhNTVdPUkRbMTYrcnNwXQorCXBhZGRkCXhtbTEwLHhtbTE1CisJcGFkZGQJeG1tMTEseG1tMTIKKwlweG9yCXhtbTEseG1tMTAKKwlweG9yCXhtbTIseG1tMTEKK0RCCTEwMiwxNSw1NiwwLDIwNworREIJMTAyLDE1LDU2LDAsMjE1CisJcGFkZGQJeG1tNCx4bW0xCisJcGFkZGQJeG1tNSx4bW0yCisJcHhvcgl4bW0xNSx4bW00CisJcHhvcgl4bW0xMix4bW01CisJbW92ZHFhCXhtbTYseG1tMTUKKwlwc2xsZAl4bW0xNSwxMgorCXBzcmxkCXhtbTYsMjAKKwltb3ZkcWEJeG1tNyx4bW0xMgorCXBzbGxkCXhtbTEyLDEyCisJcG9yCXhtbTE1LHhtbTYKKwlwc3JsZAl4bW03LDIwCisJbW92ZHFhCXhtbTYsWE1NV09SRFtyMTFdCisJcG9yCXhtbTEyLHhtbTcKKwlwYWRkZAl4bW0xMCx4bW0xNQorCXBhZGRkCXhtbTExLHhtbTEyCisJcHhvcgl4bW0xLHhtbTEwCisJcHhvcgl4bW0yLHhtbTExCitEQgkxMDIsMTUsNTYsMCwyMDYKK0RCCTEwMiwxNSw1NiwwLDIxNAorCXBhZGRkCXhtbTQseG1tMQorCXBhZGRkCXhtbTUseG1tMgorCXB4b3IJeG1tMTUseG1tNAorCXB4b3IJeG1tMTIseG1tNQorCW1vdmRxYQl4bW03LHhtbTE1CisJcHNsbGQJeG1tMTUsNworCXBzcmxkCXhtbTcsMjUKKwltb3ZkcWEJeG1tNix4bW0xMgorCXBzbGxkCXhtbTEyLDcKKwlwb3IJeG1tMTUseG1tNworCXBzcmxkCXhtbTYsMjUKKwltb3ZkcWEJeG1tNyxYTU1XT1JEW3IxMF0KKwlwb3IJeG1tMTIseG1tNgorCWRlYwllYXgKKwlqbnoJTkVBUiAkTCRvb3A0eAorCisJcGFkZGQJeG1tOCxYTU1XT1JEWzY0K3JzcF0KKwlwYWRkZAl4bW05LFhNTVdPUkRbODArcnNwXQorCXBhZGRkCXhtbTEwLFhNTVdPUkRbOTYrcnNwXQorCXBhZGRkCXhtbTExLFhNTVdPUkRbMTEyK3JzcF0KKworCW1vdmRxYQl4bW02LHhtbTgKKwlwdW5wY2tsZHEJeG1tOCx4bW05CisJbW92ZHFhCXhtbTcseG1tMTAKKwlwdW5wY2tsZHEJeG1tMTAseG1tMTEKKwlwdW5wY2toZHEJeG1tNix4bW05CisJcHVucGNraGRxCXhtbTcseG1tMTEKKwltb3ZkcWEJeG1tOSx4bW04CisJcHVucGNrbHFkcQl4bW04LHhtbTEwCisJbW92ZHFhCXhtbTExLHhtbTYKKwlwdW5wY2tscWRxCXhtbTYseG1tNworCXB1bnBja2hxZHEJeG1tOSx4bW0xMAorCXB1bnBja2hxZHEJeG1tMTEseG1tNworCXBhZGRkCXhtbTEyLFhNTVdPUkRbKCgxMjgtMjU2KSkrcmN4XQorCXBhZGRkCXhtbTEzLFhNTVdPUkRbKCgxNDQtMjU2KSkrcmN4XQorCXBhZGRkCXhtbTE0LFhNTVdPUkRbKCgxNjAtMjU2KSkrcmN4XQorCXBhZGRkCXhtbTE1LFhNTVdPUkRbKCgxNzYtMjU2KSkrcmN4XQorCisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW04CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW05CisJbW92ZHFhCXhtbTgsWE1NV09SRFszMityc3BdCisJbW92ZHFhCXhtbTksWE1NV09SRFs0OCtyc3BdCisKKwltb3ZkcWEJeG1tMTAseG1tMTIKKwlwdW5wY2tsZHEJeG1tMTIseG1tMTMKKwltb3ZkcWEJeG1tNyx4bW0xNAorCXB1bnBja2xkcQl4bW0xNCx4bW0xNQorCXB1bnBja2hkcQl4bW0xMCx4bW0xMworCXB1bnBja2hkcQl4bW03LHhtbTE1CisJbW92ZHFhCXhtbTEzLHhtbTEyCisJcHVucGNrbHFkcQl4bW0xMix4bW0xNAorCW1vdmRxYQl4bW0xNSx4bW0xMAorCXB1bnBja2xxZHEJeG1tMTAseG1tNworCXB1bnBja2hxZHEJeG1tMTMseG1tMTQKKwlwdW5wY2tocWRxCXhtbTE1LHhtbTcKKwlwYWRkZAl4bW00LFhNTVdPUkRbKCgxOTItMjU2KSkrcmN4XQorCXBhZGRkCXhtbTUsWE1NV09SRFsoKDIwOC0yNTYpKStyY3hdCisJcGFkZGQJeG1tOCxYTU1XT1JEWygoMjI0LTI1NikpK3JjeF0KKwlwYWRkZAl4bW05LFhNTVdPUkRbKCgyNDAtMjU2KSkrcmN4XQorCisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW02CisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0xMQorCisJbW92ZHFhCXhtbTE0LHhtbTQKKwlwdW5wY2tsZHEJeG1tNCx4bW01CisJbW92ZHFhCXhtbTcseG1tOAorCXB1bnBja2xkcQl4bW04LHhtbTkKKwlwdW5wY2toZHEJeG1tMTQseG1tNQorCXB1bnBja2hkcQl4bW03LHhtbTkKKwltb3ZkcWEJeG1tNSx4bW00CisJcHVucGNrbHFkcQl4bW00LHhtbTgKKwltb3ZkcWEJeG1tOSx4bW0xNAorCXB1bnBja2xxZHEJeG1tMTQseG1tNworCXB1bnBja2hxZHEJeG1tNSx4bW04CisJcHVucGNraHFkcQl4bW05LHhtbTcKKwlwYWRkZAl4bW0wLFhNTVdPUkRbKCgyNTYtMjU2KSkrcmN4XQorCXBhZGRkCXhtbTEsWE1NV09SRFsoKDI3Mi0yNTYpKStyY3hdCisJcGFkZGQJeG1tMixYTU1XT1JEWygoMjg4LTI1NikpK3JjeF0KKwlwYWRkZAl4bW0zLFhNTVdPUkRbKCgzMDQtMjU2KSkrcmN4XQorCisJbW92ZHFhCXhtbTgseG1tMAorCXB1bnBja2xkcQl4bW0wLHhtbTEKKwltb3ZkcWEJeG1tNyx4bW0yCisJcHVucGNrbGRxCXhtbTIseG1tMworCXB1bnBja2hkcQl4bW04LHhtbTEKKwlwdW5wY2toZHEJeG1tNyx4bW0zCisJbW92ZHFhCXhtbTEseG1tMAorCXB1bnBja2xxZHEJeG1tMCx4bW0yCisJbW92ZHFhCXhtbTMseG1tOAorCXB1bnBja2xxZHEJeG1tOCx4bW03CisJcHVucGNraHFkcQl4bW0xLHhtbTIKKwlwdW5wY2tocWRxCXhtbTMseG1tNworCWNtcAlyZHgsNjQqNAorCWpiCU5FQVIgJEwkdGFpbDR4CisKKwltb3ZkcXUJeG1tNixYTU1XT1JEW3JzaV0KKwltb3ZkcXUJeG1tMTEsWE1NV09SRFsxNityc2ldCisJbW92ZHF1CXhtbTIsWE1NV09SRFszMityc2ldCisJbW92ZHF1CXhtbTcsWE1NV09SRFs0OCtyc2ldCisJcHhvcgl4bW02LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMTEseG1tMTIKKwlweG9yCXhtbTIseG1tNAorCXB4b3IJeG1tNyx4bW0wCisKKwltb3ZkcXUJWE1NV09SRFtyZGldLHhtbTYKKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JzaV0KKwltb3ZkcXUJWE1NV09SRFsxNityZGldLHhtbTExCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbODArcnNpXQorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMgorCW1vdmRxdQl4bW0yLFhNTVdPUkRbOTYrcnNpXQorCW1vdmRxdQlYTU1XT1JEWzQ4K3JkaV0seG1tNworCW1vdmRxdQl4bW03LFhNTVdPUkRbMTEyK3JzaV0KKwlsZWEJcnNpLFsxMjgrcnNpXQorCXB4b3IJeG1tNixYTU1XT1JEWzE2K3JzcF0KKwlweG9yCXhtbTExLHhtbTEzCisJcHhvcgl4bW0yLHhtbTUKKwlweG9yCXhtbTcseG1tMQorCisJbW92ZHF1CVhNTVdPUkRbNjQrcmRpXSx4bW02CisJbW92ZHF1CXhtbTYsWE1NV09SRFtyc2ldCisJbW92ZHF1CVhNTVdPUkRbODArcmRpXSx4bW0xMQorCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzE2K3JzaV0KKwltb3ZkcXUJWE1NV09SRFs5NityZGldLHhtbTIKKwltb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3JzaV0KKwltb3ZkcXUJWE1NV09SRFsxMTIrcmRpXSx4bW03CisJbGVhCXJkaSxbMTI4K3JkaV0KKwltb3ZkcXUJeG1tNyxYTU1XT1JEWzQ4K3JzaV0KKwlweG9yCXhtbTYsWE1NV09SRFszMityc3BdCisJcHhvcgl4bW0xMSx4bW0xMAorCXB4b3IJeG1tMix4bW0xNAorCXB4b3IJeG1tNyx4bW04CisKKwltb3ZkcXUJWE1NV09SRFtyZGldLHhtbTYKKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JzaV0KKwltb3ZkcXUJWE1NV09SRFsxNityZGldLHhtbTExCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbODArcnNpXQorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMgorCW1vdmRxdQl4bW0yLFhNTVdPUkRbOTYrcnNpXQorCW1vdmRxdQlYTU1XT1JEWzQ4K3JkaV0seG1tNworCW1vdmRxdQl4bW03LFhNTVdPUkRbMTEyK3JzaV0KKwlsZWEJcnNpLFsxMjgrcnNpXQorCXB4b3IJeG1tNixYTU1XT1JEWzQ4K3JzcF0KKwlweG9yCXhtbTExLHhtbTE1CisJcHhvcgl4bW0yLHhtbTkKKwlweG9yCXhtbTcseG1tMworCW1vdmRxdQlYTU1XT1JEWzY0K3JkaV0seG1tNgorCW1vdmRxdQlYTU1XT1JEWzgwK3JkaV0seG1tMTEKKwltb3ZkcXUJWE1NV09SRFs5NityZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFsxMTIrcmRpXSx4bW03CisJbGVhCXJkaSxbMTI4K3JkaV0KKworCXN1YglyZHgsNjQqNAorCWpueglORUFSICRMJG9vcF9vdXRlcjR4CisKKwlqbXAJTkVBUiAkTCRkb25lNHgKKworJEwkdGFpbDR4OgorCWNtcAlyZHgsMTkyCisJamFlCU5FQVIgJEwkMTkyX29yX21vcmU0eAorCWNtcAlyZHgsMTI4CisJamFlCU5FQVIgJEwkMTI4X29yX21vcmU0eAorCWNtcAlyZHgsNjQKKwlqYWUJTkVBUiAkTCQ2NF9vcl9tb3JlNHgKKworCisJeG9yCXIxMCxyMTAKKworCW1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tMTIKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTQKKwltb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTAKKwlqbXAJTkVBUiAkTCRvb3BfdGFpbDR4CisKK0FMSUdOCTMyCiskTCQ2NF9vcl9tb3JlNHg6CisJbW92ZHF1CXhtbTYsWE1NV09SRFtyc2ldCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbMTYrcnNpXQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcnNpXQorCW1vdmRxdQl4bW03LFhNTVdPUkRbNDgrcnNpXQorCXB4b3IJeG1tNixYTU1XT1JEW3JzcF0KKwlweG9yCXhtbTExLHhtbTEyCisJcHhvcgl4bW0yLHhtbTQKKwlweG9yCXhtbTcseG1tMAorCW1vdmRxdQlYTU1XT1JEW3JkaV0seG1tNgorCW1vdmRxdQlYTU1XT1JEWzE2K3JkaV0seG1tMTEKKwltb3ZkcXUJWE1NV09SRFszMityZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFs0OCtyZGldLHhtbTcKKwlqZQlORUFSICRMJGRvbmU0eAorCisJbW92ZHFhCXhtbTYsWE1NV09SRFsxNityc3BdCisJbGVhCXJzaSxbNjQrcnNpXQorCXhvcglyMTAscjEwCisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW02CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0xMworCWxlYQlyZGksWzY0K3JkaV0KKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTUKKwlzdWIJcmR4LDY0CisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0xCisJam1wCU5FQVIgJEwkb29wX3RhaWw0eAorCitBTElHTgkzMgorJEwkMTI4X29yX21vcmU0eDoKKwltb3ZkcXUJeG1tNixYTU1XT1JEW3JzaV0KKwltb3ZkcXUJeG1tMTEsWE1NV09SRFsxNityc2ldCisJbW92ZHF1CXhtbTIsWE1NV09SRFszMityc2ldCisJbW92ZHF1CXhtbTcsWE1NV09SRFs0OCtyc2ldCisJcHhvcgl4bW02LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMTEseG1tMTIKKwlweG9yCXhtbTIseG1tNAorCXB4b3IJeG1tNyx4bW0wCisKKwltb3ZkcXUJWE1NV09SRFtyZGldLHhtbTYKKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JzaV0KKwltb3ZkcXUJWE1NV09SRFsxNityZGldLHhtbTExCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbODArcnNpXQorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMgorCW1vdmRxdQl4bW0yLFhNTVdPUkRbOTYrcnNpXQorCW1vdmRxdQlYTU1XT1JEWzQ4K3JkaV0seG1tNworCW1vdmRxdQl4bW03LFhNTVdPUkRbMTEyK3JzaV0KKwlweG9yCXhtbTYsWE1NV09SRFsxNityc3BdCisJcHhvcgl4bW0xMSx4bW0xMworCXB4b3IJeG1tMix4bW01CisJcHhvcgl4bW03LHhtbTEKKwltb3ZkcXUJWE1NV09SRFs2NCtyZGldLHhtbTYKKwltb3ZkcXUJWE1NV09SRFs4MCtyZGldLHhtbTExCisJbW92ZHF1CVhNTVdPUkRbOTYrcmRpXSx4bW0yCisJbW92ZHF1CVhNTVdPUkRbMTEyK3JkaV0seG1tNworCWplCU5FQVIgJEwkZG9uZTR4CisKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzMyK3JzcF0KKwlsZWEJcnNpLFsxMjgrcnNpXQorCXhvcglyMTAscjEwCisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW02CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0xMAorCWxlYQlyZGksWzEyOCtyZGldCisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0xNAorCXN1YglyZHgsMTI4CisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW04CisJam1wCU5FQVIgJEwkb29wX3RhaWw0eAorCitBTElHTgkzMgorJEwkMTkyX29yX21vcmU0eDoKKwltb3ZkcXUJeG1tNixYTU1XT1JEW3JzaV0KKwltb3ZkcXUJeG1tMTEsWE1NV09SRFsxNityc2ldCisJbW92ZHF1CXhtbTIsWE1NV09SRFszMityc2ldCisJbW92ZHF1CXhtbTcsWE1NV09SRFs0OCtyc2ldCisJcHhvcgl4bW02LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMTEseG1tMTIKKwlweG9yCXhtbTIseG1tNAorCXB4b3IJeG1tNyx4bW0wCisKKwltb3ZkcXUJWE1NV09SRFtyZGldLHhtbTYKKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JzaV0KKwltb3ZkcXUJWE1NV09SRFsxNityZGldLHhtbTExCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbODArcnNpXQorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMgorCW1vdmRxdQl4bW0yLFhNTVdPUkRbOTYrcnNpXQorCW1vdmRxdQlYTU1XT1JEWzQ4K3JkaV0seG1tNworCW1vdmRxdQl4bW03LFhNTVdPUkRbMTEyK3JzaV0KKwlsZWEJcnNpLFsxMjgrcnNpXQorCXB4b3IJeG1tNixYTU1XT1JEWzE2K3JzcF0KKwlweG9yCXhtbTExLHhtbTEzCisJcHhvcgl4bW0yLHhtbTUKKwlweG9yCXhtbTcseG1tMQorCisJbW92ZHF1CVhNTVdPUkRbNjQrcmRpXSx4bW02CisJbW92ZHF1CXhtbTYsWE1NV09SRFtyc2ldCisJbW92ZHF1CVhNTVdPUkRbODArcmRpXSx4bW0xMQorCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzE2K3JzaV0KKwltb3ZkcXUJWE1NV09SRFs5NityZGldLHhtbTIKKwltb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3JzaV0KKwltb3ZkcXUJWE1NV09SRFsxMTIrcmRpXSx4bW03CisJbGVhCXJkaSxbMTI4K3JkaV0KKwltb3ZkcXUJeG1tNyxYTU1XT1JEWzQ4K3JzaV0KKwlweG9yCXhtbTYsWE1NV09SRFszMityc3BdCisJcHhvcgl4bW0xMSx4bW0xMAorCXB4b3IJeG1tMix4bW0xNAorCXB4b3IJeG1tNyx4bW04CisJbW92ZHF1CVhNTVdPUkRbcmRpXSx4bW02CisJbW92ZHF1CVhNTVdPUkRbMTYrcmRpXSx4bW0xMQorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMgorCW1vdmRxdQlYTU1XT1JEWzQ4K3JkaV0seG1tNworCWplCU5FQVIgJEwkZG9uZTR4CisKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzQ4K3JzcF0KKwlsZWEJcnNpLFs2NCtyc2ldCisJeG9yCXIxMCxyMTAKKwltb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTYKKwltb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTE1CisJbGVhCXJkaSxbNjQrcmRpXQorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tOQorCXN1YglyZHgsMTkyCisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0zCisKKyRMJG9vcF90YWlsNHg6CisJbW92engJZWF4LEJZVEVbcjEwKjErcnNpXQorCW1vdnp4CWVjeCxCWVRFW3IxMCoxK3JzcF0KKwlsZWEJcjEwLFsxK3IxMF0KKwl4b3IJZWF4LGVjeAorCW1vdglCWVRFWygoLTEpKStyMTAqMStyZGldLGFsCisJZGVjCXJkeAorCWpueglORUFSICRMJG9vcF90YWlsNHgKKworJEwkZG9uZTR4OgorCW1vdmFwcwl4bW02LFhNTVdPUkRbKCgtMTY4KSkrcjldCisJbW92YXBzCXhtbTcsWE1NV09SRFsoKC0xNTIpKStyOV0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoLTEzNikpK3I5XQorCW1vdmFwcwl4bW05LFhNTVdPUkRbKCgtMTIwKSkrcjldCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbKCgtMTA0KSkrcjldCisJbW92YXBzCXhtbTExLFhNTVdPUkRbKCgtODgpKStyOV0KKwltb3ZhcHMJeG1tMTIsWE1NV09SRFsoKC03MikpK3I5XQorCW1vdmFwcwl4bW0xMyxYTU1XT1JEWygoLTU2KSkrcjldCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbKCgtNDApKStyOV0KKwltb3ZhcHMJeG1tMTUsWE1NV09SRFsoKC0yNCkpK3I5XQorCWxlYQlyc3AsW3I5XQorJEwkNHhfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CiskTCRTRUhfZW5kX0NoYUNoYTIwXzR4OgorCitBTElHTgkzMgorQ2hhQ2hhMjBfOHg6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9DaGFDaGEyMF84eDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCisKKyRMJENoYUNoYTIwXzh4OgorCW1vdglyOSxyc3AKKwlzdWIJcnNwLDB4MjgwKzE2OAorCWFuZAlyc3AsLTMyCisJbW92YXBzCVhNTVdPUkRbKC0xNjgpK3I5XSx4bW02CisJbW92YXBzCVhNTVdPUkRbKC0xNTIpK3I5XSx4bW03CisJbW92YXBzCVhNTVdPUkRbKC0xMzYpK3I5XSx4bW04CisJbW92YXBzCVhNTVdPUkRbKC0xMjApK3I5XSx4bW05CisJbW92YXBzCVhNTVdPUkRbKC0xMDQpK3I5XSx4bW0xMAorCW1vdmFwcwlYTU1XT1JEWygtODgpK3I5XSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWygtNzIpK3I5XSx4bW0xMgorCW1vdmFwcwlYTU1XT1JEWygtNTYpK3I5XSx4bW0xMworCW1vdmFwcwlYTU1XT1JEWygtNDApK3I5XSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWygtMjQpK3I5XSx4bW0xNQorJEwkOHhfYm9keToKKwl2emVyb3VwcGVyCisKKworCisKKworCisKKworCisKKwl2YnJvYWRjYXN0aTEyOAl5bW0xMSxYTU1XT1JEWyRMJHNpZ21hXQorCXZicm9hZGNhc3RpMTI4CXltbTMsWE1NV09SRFtyY3hdCisJdmJyb2FkY2FzdGkxMjgJeW1tMTUsWE1NV09SRFsxNityY3hdCisJdmJyb2FkY2FzdGkxMjgJeW1tNyxYTU1XT1JEW3I4XQorCWxlYQlyY3gsWzI1Nityc3BdCisJbGVhCXJheCxbNTEyK3JzcF0KKwlsZWEJcjEwLFskTCRyb3QxNl0KKwlsZWEJcjExLFskTCRyb3QyNF0KKworCXZwc2h1ZmQJeW1tOCx5bW0xMSwweDAwCisJdnBzaHVmZAl5bW05LHltbTExLDB4NTUKKwl2bW92ZHFhCVlNTVdPUkRbKDEyOC0yNTYpK3JjeF0seW1tOAorCXZwc2h1ZmQJeW1tMTAseW1tMTEsMHhhYQorCXZtb3ZkcWEJWU1NV09SRFsoMTYwLTI1NikrcmN4XSx5bW05CisJdnBzaHVmZAl5bW0xMSx5bW0xMSwweGZmCisJdm1vdmRxYQlZTU1XT1JEWygxOTItMjU2KStyY3hdLHltbTEwCisJdm1vdmRxYQlZTU1XT1JEWygyMjQtMjU2KStyY3hdLHltbTExCisKKwl2cHNodWZkCXltbTAseW1tMywweDAwCisJdnBzaHVmZAl5bW0xLHltbTMsMHg1NQorCXZtb3ZkcWEJWU1NV09SRFsoMjU2LTI1NikrcmN4XSx5bW0wCisJdnBzaHVmZAl5bW0yLHltbTMsMHhhYQorCXZtb3ZkcWEJWU1NV09SRFsoMjg4LTI1NikrcmN4XSx5bW0xCisJdnBzaHVmZAl5bW0zLHltbTMsMHhmZgorCXZtb3ZkcWEJWU1NV09SRFsoMzIwLTI1NikrcmN4XSx5bW0yCisJdm1vdmRxYQlZTU1XT1JEWygzNTItMjU2KStyY3hdLHltbTMKKworCXZwc2h1ZmQJeW1tMTIseW1tMTUsMHgwMAorCXZwc2h1ZmQJeW1tMTMseW1tMTUsMHg1NQorCXZtb3ZkcWEJWU1NV09SRFsoMzg0LTUxMikrcmF4XSx5bW0xMgorCXZwc2h1ZmQJeW1tMTQseW1tMTUsMHhhYQorCXZtb3ZkcWEJWU1NV09SRFsoNDE2LTUxMikrcmF4XSx5bW0xMworCXZwc2h1ZmQJeW1tMTUseW1tMTUsMHhmZgorCXZtb3ZkcWEJWU1NV09SRFsoNDQ4LTUxMikrcmF4XSx5bW0xNAorCXZtb3ZkcWEJWU1NV09SRFsoNDgwLTUxMikrcmF4XSx5bW0xNQorCisJdnBzaHVmZAl5bW00LHltbTcsMHgwMAorCXZwc2h1ZmQJeW1tNSx5bW03LDB4NTUKKwl2cGFkZGQJeW1tNCx5bW00LFlNTVdPUkRbJEwkaW5jeV0KKwl2cHNodWZkCXltbTYseW1tNywweGFhCisJdm1vdmRxYQlZTU1XT1JEWyg1NDQtNTEyKStyYXhdLHltbTUKKwl2cHNodWZkCXltbTcseW1tNywweGZmCisJdm1vdmRxYQlZTU1XT1JEWyg1NzYtNTEyKStyYXhdLHltbTYKKwl2bW92ZHFhCVlNTVdPUkRbKDYwOC01MTIpK3JheF0seW1tNworCisJam1wCU5FQVIgJEwkb29wX2VudGVyOHgKKworQUxJR04JMzIKKyRMJG9vcF9vdXRlcjh4OgorCXZtb3ZkcWEJeW1tOCxZTU1XT1JEWygoMTI4LTI1NikpK3JjeF0KKwl2bW92ZHFhCXltbTksWU1NV09SRFsoKDE2MC0yNTYpKStyY3hdCisJdm1vdmRxYQl5bW0xMCxZTU1XT1JEWygoMTkyLTI1NikpK3JjeF0KKwl2bW92ZHFhCXltbTExLFlNTVdPUkRbKCgyMjQtMjU2KSkrcmN4XQorCXZtb3ZkcWEJeW1tMCxZTU1XT1JEWygoMjU2LTI1NikpK3JjeF0KKwl2bW92ZHFhCXltbTEsWU1NV09SRFsoKDI4OC0yNTYpKStyY3hdCisJdm1vdmRxYQl5bW0yLFlNTVdPUkRbKCgzMjAtMjU2KSkrcmN4XQorCXZtb3ZkcWEJeW1tMyxZTU1XT1JEWygoMzUyLTI1NikpK3JjeF0KKwl2bW92ZHFhCXltbTEyLFlNTVdPUkRbKCgzODQtNTEyKSkrcmF4XQorCXZtb3ZkcWEJeW1tMTMsWU1NV09SRFsoKDQxNi01MTIpKStyYXhdCisJdm1vdmRxYQl5bW0xNCxZTU1XT1JEWygoNDQ4LTUxMikpK3JheF0KKwl2bW92ZHFhCXltbTE1LFlNTVdPUkRbKCg0ODAtNTEyKSkrcmF4XQorCXZtb3ZkcWEJeW1tNCxZTU1XT1JEWygoNTEyLTUxMikpK3JheF0KKwl2bW92ZHFhCXltbTUsWU1NV09SRFsoKDU0NC01MTIpKStyYXhdCisJdm1vdmRxYQl5bW02LFlNTVdPUkRbKCg1NzYtNTEyKSkrcmF4XQorCXZtb3ZkcWEJeW1tNyxZTU1XT1JEWygoNjA4LTUxMikpK3JheF0KKwl2cGFkZGQJeW1tNCx5bW00LFlNTVdPUkRbJEwkZWlnaHRdCisKKyRMJG9vcF9lbnRlcjh4OgorCXZtb3ZkcWEJWU1NV09SRFs2NCtyc3BdLHltbTE0CisJdm1vdmRxYQlZTU1XT1JEWzk2K3JzcF0seW1tMTUKKwl2YnJvYWRjYXN0aTEyOAl5bW0xNSxYTU1XT1JEW3IxMF0KKwl2bW92ZHFhCVlNTVdPUkRbKDUxMi01MTIpK3JheF0seW1tNAorCW1vdgllYXgsMTAKKwlqbXAJTkVBUiAkTCRvb3A4eAorCitBTElHTgkzMgorJEwkb29wOHg6CisJdnBhZGRkCXltbTgseW1tOCx5bW0wCisJdnB4b3IJeW1tNCx5bW04LHltbTQKKwl2cHNodWZiCXltbTQseW1tNCx5bW0xNQorCXZwYWRkZAl5bW05LHltbTkseW1tMQorCXZweG9yCXltbTUseW1tOSx5bW01CisJdnBzaHVmYgl5bW01LHltbTUseW1tMTUKKwl2cGFkZGQJeW1tMTIseW1tMTIseW1tNAorCXZweG9yCXltbTAseW1tMTIseW1tMAorCXZwc2xsZAl5bW0xNCx5bW0wLDEyCisJdnBzcmxkCXltbTAseW1tMCwyMAorCXZwb3IJeW1tMCx5bW0xNCx5bW0wCisJdmJyb2FkY2FzdGkxMjgJeW1tMTQsWE1NV09SRFtyMTFdCisJdnBhZGRkCXltbTEzLHltbTEzLHltbTUKKwl2cHhvcgl5bW0xLHltbTEzLHltbTEKKwl2cHNsbGQJeW1tMTUseW1tMSwxMgorCXZwc3JsZAl5bW0xLHltbTEsMjAKKwl2cG9yCXltbTEseW1tMTUseW1tMQorCXZwYWRkZAl5bW04LHltbTgseW1tMAorCXZweG9yCXltbTQseW1tOCx5bW00CisJdnBzaHVmYgl5bW00LHltbTQseW1tMTQKKwl2cGFkZGQJeW1tOSx5bW05LHltbTEKKwl2cHhvcgl5bW01LHltbTkseW1tNQorCXZwc2h1ZmIJeW1tNSx5bW01LHltbTE0CisJdnBhZGRkCXltbTEyLHltbTEyLHltbTQKKwl2cHhvcgl5bW0wLHltbTEyLHltbTAKKwl2cHNsbGQJeW1tMTUseW1tMCw3CisJdnBzcmxkCXltbTAseW1tMCwyNQorCXZwb3IJeW1tMCx5bW0xNSx5bW0wCisJdmJyb2FkY2FzdGkxMjgJeW1tMTUsWE1NV09SRFtyMTBdCisJdnBhZGRkCXltbTEzLHltbTEzLHltbTUKKwl2cHhvcgl5bW0xLHltbTEzLHltbTEKKwl2cHNsbGQJeW1tMTQseW1tMSw3CisJdnBzcmxkCXltbTEseW1tMSwyNQorCXZwb3IJeW1tMSx5bW0xNCx5bW0xCisJdm1vdmRxYQlZTU1XT1JEW3JzcF0seW1tMTIKKwl2bW92ZHFhCVlNTVdPUkRbMzIrcnNwXSx5bW0xMworCXZtb3ZkcWEJeW1tMTIsWU1NV09SRFs2NCtyc3BdCisJdm1vdmRxYQl5bW0xMyxZTU1XT1JEWzk2K3JzcF0KKwl2cGFkZGQJeW1tMTAseW1tMTAseW1tMgorCXZweG9yCXltbTYseW1tMTAseW1tNgorCXZwc2h1ZmIJeW1tNix5bW02LHltbTE1CisJdnBhZGRkCXltbTExLHltbTExLHltbTMKKwl2cHhvcgl5bW03LHltbTExLHltbTcKKwl2cHNodWZiCXltbTcseW1tNyx5bW0xNQorCXZwYWRkZAl5bW0xMix5bW0xMix5bW02CisJdnB4b3IJeW1tMix5bW0xMix5bW0yCisJdnBzbGxkCXltbTE0LHltbTIsMTIKKwl2cHNybGQJeW1tMix5bW0yLDIwCisJdnBvcgl5bW0yLHltbTE0LHltbTIKKwl2YnJvYWRjYXN0aTEyOAl5bW0xNCxYTU1XT1JEW3IxMV0KKwl2cGFkZGQJeW1tMTMseW1tMTMseW1tNworCXZweG9yCXltbTMseW1tMTMseW1tMworCXZwc2xsZAl5bW0xNSx5bW0zLDEyCisJdnBzcmxkCXltbTMseW1tMywyMAorCXZwb3IJeW1tMyx5bW0xNSx5bW0zCisJdnBhZGRkCXltbTEwLHltbTEwLHltbTIKKwl2cHhvcgl5bW02LHltbTEwLHltbTYKKwl2cHNodWZiCXltbTYseW1tNix5bW0xNAorCXZwYWRkZAl5bW0xMSx5bW0xMSx5bW0zCisJdnB4b3IJeW1tNyx5bW0xMSx5bW03CisJdnBzaHVmYgl5bW03LHltbTcseW1tMTQKKwl2cGFkZGQJeW1tMTIseW1tMTIseW1tNgorCXZweG9yCXltbTIseW1tMTIseW1tMgorCXZwc2xsZAl5bW0xNSx5bW0yLDcKKwl2cHNybGQJeW1tMix5bW0yLDI1CisJdnBvcgl5bW0yLHltbTE1LHltbTIKKwl2YnJvYWRjYXN0aTEyOAl5bW0xNSxYTU1XT1JEW3IxMF0KKwl2cGFkZGQJeW1tMTMseW1tMTMseW1tNworCXZweG9yCXltbTMseW1tMTMseW1tMworCXZwc2xsZAl5bW0xNCx5bW0zLDcKKwl2cHNybGQJeW1tMyx5bW0zLDI1CisJdnBvcgl5bW0zLHltbTE0LHltbTMKKwl2cGFkZGQJeW1tOCx5bW04LHltbTEKKwl2cHhvcgl5bW03LHltbTgseW1tNworCXZwc2h1ZmIJeW1tNyx5bW03LHltbTE1CisJdnBhZGRkCXltbTkseW1tOSx5bW0yCisJdnB4b3IJeW1tNCx5bW05LHltbTQKKwl2cHNodWZiCXltbTQseW1tNCx5bW0xNQorCXZwYWRkZAl5bW0xMix5bW0xMix5bW03CisJdnB4b3IJeW1tMSx5bW0xMix5bW0xCisJdnBzbGxkCXltbTE0LHltbTEsMTIKKwl2cHNybGQJeW1tMSx5bW0xLDIwCisJdnBvcgl5bW0xLHltbTE0LHltbTEKKwl2YnJvYWRjYXN0aTEyOAl5bW0xNCxYTU1XT1JEW3IxMV0KKwl2cGFkZGQJeW1tMTMseW1tMTMseW1tNAorCXZweG9yCXltbTIseW1tMTMseW1tMgorCXZwc2xsZAl5bW0xNSx5bW0yLDEyCisJdnBzcmxkCXltbTIseW1tMiwyMAorCXZwb3IJeW1tMix5bW0xNSx5bW0yCisJdnBhZGRkCXltbTgseW1tOCx5bW0xCisJdnB4b3IJeW1tNyx5bW04LHltbTcKKwl2cHNodWZiCXltbTcseW1tNyx5bW0xNAorCXZwYWRkZAl5bW05LHltbTkseW1tMgorCXZweG9yCXltbTQseW1tOSx5bW00CisJdnBzaHVmYgl5bW00LHltbTQseW1tMTQKKwl2cGFkZGQJeW1tMTIseW1tMTIseW1tNworCXZweG9yCXltbTEseW1tMTIseW1tMQorCXZwc2xsZAl5bW0xNSx5bW0xLDcKKwl2cHNybGQJeW1tMSx5bW0xLDI1CisJdnBvcgl5bW0xLHltbTE1LHltbTEKKwl2YnJvYWRjYXN0aTEyOAl5bW0xNSxYTU1XT1JEW3IxMF0KKwl2cGFkZGQJeW1tMTMseW1tMTMseW1tNAorCXZweG9yCXltbTIseW1tMTMseW1tMgorCXZwc2xsZAl5bW0xNCx5bW0yLDcKKwl2cHNybGQJeW1tMix5bW0yLDI1CisJdnBvcgl5bW0yLHltbTE0LHltbTIKKwl2bW92ZHFhCVlNTVdPUkRbNjQrcnNwXSx5bW0xMgorCXZtb3ZkcWEJWU1NV09SRFs5Nityc3BdLHltbTEzCisJdm1vdmRxYQl5bW0xMixZTU1XT1JEW3JzcF0KKwl2bW92ZHFhCXltbTEzLFlNTVdPUkRbMzIrcnNwXQorCXZwYWRkZAl5bW0xMCx5bW0xMCx5bW0zCisJdnB4b3IJeW1tNSx5bW0xMCx5bW01CisJdnBzaHVmYgl5bW01LHltbTUseW1tMTUKKwl2cGFkZGQJeW1tMTEseW1tMTEseW1tMAorCXZweG9yCXltbTYseW1tMTEseW1tNgorCXZwc2h1ZmIJeW1tNix5bW02LHltbTE1CisJdnBhZGRkCXltbTEyLHltbTEyLHltbTUKKwl2cHhvcgl5bW0zLHltbTEyLHltbTMKKwl2cHNsbGQJeW1tMTQseW1tMywxMgorCXZwc3JsZAl5bW0zLHltbTMsMjAKKwl2cG9yCXltbTMseW1tMTQseW1tMworCXZicm9hZGNhc3RpMTI4CXltbTE0LFhNTVdPUkRbcjExXQorCXZwYWRkZAl5bW0xMyx5bW0xMyx5bW02CisJdnB4b3IJeW1tMCx5bW0xMyx5bW0wCisJdnBzbGxkCXltbTE1LHltbTAsMTIKKwl2cHNybGQJeW1tMCx5bW0wLDIwCisJdnBvcgl5bW0wLHltbTE1LHltbTAKKwl2cGFkZGQJeW1tMTAseW1tMTAseW1tMworCXZweG9yCXltbTUseW1tMTAseW1tNQorCXZwc2h1ZmIJeW1tNSx5bW01LHltbTE0CisJdnBhZGRkCXltbTExLHltbTExLHltbTAKKwl2cHhvcgl5bW02LHltbTExLHltbTYKKwl2cHNodWZiCXltbTYseW1tNix5bW0xNAorCXZwYWRkZAl5bW0xMix5bW0xMix5bW01CisJdnB4b3IJeW1tMyx5bW0xMix5bW0zCisJdnBzbGxkCXltbTE1LHltbTMsNworCXZwc3JsZAl5bW0zLHltbTMsMjUKKwl2cG9yCXltbTMseW1tMTUseW1tMworCXZicm9hZGNhc3RpMTI4CXltbTE1LFhNTVdPUkRbcjEwXQorCXZwYWRkZAl5bW0xMyx5bW0xMyx5bW02CisJdnB4b3IJeW1tMCx5bW0xMyx5bW0wCisJdnBzbGxkCXltbTE0LHltbTAsNworCXZwc3JsZAl5bW0wLHltbTAsMjUKKwl2cG9yCXltbTAseW1tMTQseW1tMAorCWRlYwllYXgKKwlqbnoJTkVBUiAkTCRvb3A4eAorCisJbGVhCXJheCxbNTEyK3JzcF0KKwl2cGFkZGQJeW1tOCx5bW04LFlNTVdPUkRbKCgxMjgtMjU2KSkrcmN4XQorCXZwYWRkZAl5bW05LHltbTksWU1NV09SRFsoKDE2MC0yNTYpKStyY3hdCisJdnBhZGRkCXltbTEwLHltbTEwLFlNTVdPUkRbKCgxOTItMjU2KSkrcmN4XQorCXZwYWRkZAl5bW0xMSx5bW0xMSxZTU1XT1JEWygoMjI0LTI1NikpK3JjeF0KKworCXZwdW5wY2tsZHEJeW1tMTQseW1tOCx5bW05CisJdnB1bnBja2xkcQl5bW0xNSx5bW0xMCx5bW0xMQorCXZwdW5wY2toZHEJeW1tOCx5bW04LHltbTkKKwl2cHVucGNraGRxCXltbTEwLHltbTEwLHltbTExCisJdnB1bnBja2xxZHEJeW1tOSx5bW0xNCx5bW0xNQorCXZwdW5wY2tocWRxCXltbTE0LHltbTE0LHltbTE1CisJdnB1bnBja2xxZHEJeW1tMTEseW1tOCx5bW0xMAorCXZwdW5wY2tocWRxCXltbTgseW1tOCx5bW0xMAorCXZwYWRkZAl5bW0wLHltbTAsWU1NV09SRFsoKDI1Ni0yNTYpKStyY3hdCisJdnBhZGRkCXltbTEseW1tMSxZTU1XT1JEWygoMjg4LTI1NikpK3JjeF0KKwl2cGFkZGQJeW1tMix5bW0yLFlNTVdPUkRbKCgzMjAtMjU2KSkrcmN4XQorCXZwYWRkZAl5bW0zLHltbTMsWU1NV09SRFsoKDM1Mi0yNTYpKStyY3hdCisKKwl2cHVucGNrbGRxCXltbTEwLHltbTAseW1tMQorCXZwdW5wY2tsZHEJeW1tMTUseW1tMix5bW0zCisJdnB1bnBja2hkcQl5bW0wLHltbTAseW1tMQorCXZwdW5wY2toZHEJeW1tMix5bW0yLHltbTMKKwl2cHVucGNrbHFkcQl5bW0xLHltbTEwLHltbTE1CisJdnB1bnBja2hxZHEJeW1tMTAseW1tMTAseW1tMTUKKwl2cHVucGNrbHFkcQl5bW0zLHltbTAseW1tMgorCXZwdW5wY2tocWRxCXltbTAseW1tMCx5bW0yCisJdnBlcm0yaTEyOAl5bW0xNSx5bW05LHltbTEsMHgyMAorCXZwZXJtMmkxMjgJeW1tMSx5bW05LHltbTEsMHgzMQorCXZwZXJtMmkxMjgJeW1tOSx5bW0xNCx5bW0xMCwweDIwCisJdnBlcm0yaTEyOAl5bW0xMCx5bW0xNCx5bW0xMCwweDMxCisJdnBlcm0yaTEyOAl5bW0xNCx5bW0xMSx5bW0zLDB4MjAKKwl2cGVybTJpMTI4CXltbTMseW1tMTEseW1tMywweDMxCisJdnBlcm0yaTEyOAl5bW0xMSx5bW04LHltbTAsMHgyMAorCXZwZXJtMmkxMjgJeW1tMCx5bW04LHltbTAsMHgzMQorCXZtb3ZkcWEJWU1NV09SRFtyc3BdLHltbTE1CisJdm1vdmRxYQlZTU1XT1JEWzMyK3JzcF0seW1tOQorCXZtb3ZkcWEJeW1tMTUsWU1NV09SRFs2NCtyc3BdCisJdm1vdmRxYQl5bW05LFlNTVdPUkRbOTYrcnNwXQorCisJdnBhZGRkCXltbTEyLHltbTEyLFlNTVdPUkRbKCgzODQtNTEyKSkrcmF4XQorCXZwYWRkZAl5bW0xMyx5bW0xMyxZTU1XT1JEWygoNDE2LTUxMikpK3JheF0KKwl2cGFkZGQJeW1tMTUseW1tMTUsWU1NV09SRFsoKDQ0OC01MTIpKStyYXhdCisJdnBhZGRkCXltbTkseW1tOSxZTU1XT1JEWygoNDgwLTUxMikpK3JheF0KKworCXZwdW5wY2tsZHEJeW1tMix5bW0xMix5bW0xMworCXZwdW5wY2tsZHEJeW1tOCx5bW0xNSx5bW05CisJdnB1bnBja2hkcQl5bW0xMix5bW0xMix5bW0xMworCXZwdW5wY2toZHEJeW1tMTUseW1tMTUseW1tOQorCXZwdW5wY2tscWRxCXltbTEzLHltbTIseW1tOAorCXZwdW5wY2tocWRxCXltbTIseW1tMix5bW04CisJdnB1bnBja2xxZHEJeW1tOSx5bW0xMix5bW0xNQorCXZwdW5wY2tocWRxCXltbTEyLHltbTEyLHltbTE1CisJdnBhZGRkCXltbTQseW1tNCxZTU1XT1JEWygoNTEyLTUxMikpK3JheF0KKwl2cGFkZGQJeW1tNSx5bW01LFlNTVdPUkRbKCg1NDQtNTEyKSkrcmF4XQorCXZwYWRkZAl5bW02LHltbTYsWU1NV09SRFsoKDU3Ni01MTIpKStyYXhdCisJdnBhZGRkCXltbTcseW1tNyxZTU1XT1JEWygoNjA4LTUxMikpK3JheF0KKworCXZwdW5wY2tsZHEJeW1tMTUseW1tNCx5bW01CisJdnB1bnBja2xkcQl5bW04LHltbTYseW1tNworCXZwdW5wY2toZHEJeW1tNCx5bW00LHltbTUKKwl2cHVucGNraGRxCXltbTYseW1tNix5bW03CisJdnB1bnBja2xxZHEJeW1tNSx5bW0xNSx5bW04CisJdnB1bnBja2hxZHEJeW1tMTUseW1tMTUseW1tOAorCXZwdW5wY2tscWRxCXltbTcseW1tNCx5bW02CisJdnB1bnBja2hxZHEJeW1tNCx5bW00LHltbTYKKwl2cGVybTJpMTI4CXltbTgseW1tMTMseW1tNSwweDIwCisJdnBlcm0yaTEyOAl5bW01LHltbTEzLHltbTUsMHgzMQorCXZwZXJtMmkxMjgJeW1tMTMseW1tMix5bW0xNSwweDIwCisJdnBlcm0yaTEyOAl5bW0xNSx5bW0yLHltbTE1LDB4MzEKKwl2cGVybTJpMTI4CXltbTIseW1tOSx5bW03LDB4MjAKKwl2cGVybTJpMTI4CXltbTcseW1tOSx5bW03LDB4MzEKKwl2cGVybTJpMTI4CXltbTkseW1tMTIseW1tNCwweDIwCisJdnBlcm0yaTEyOAl5bW00LHltbTEyLHltbTQsMHgzMQorCXZtb3ZkcWEJeW1tNixZTU1XT1JEW3JzcF0KKwl2bW92ZHFhCXltbTEyLFlNTVdPUkRbMzIrcnNwXQorCisJY21wCXJkeCw2NCo4CisJamIJTkVBUiAkTCR0YWlsOHgKKworCXZweG9yCXltbTYseW1tNixZTU1XT1JEW3JzaV0KKwl2cHhvcgl5bW04LHltbTgsWU1NV09SRFszMityc2ldCisJdnB4b3IJeW1tMSx5bW0xLFlNTVdPUkRbNjQrcnNpXQorCXZweG9yCXltbTUseW1tNSxZTU1XT1JEWzk2K3JzaV0KKwlsZWEJcnNpLFsxMjgrcnNpXQorCXZtb3ZkcXUJWU1NV09SRFtyZGldLHltbTYKKwl2bW92ZHF1CVlNTVdPUkRbMzIrcmRpXSx5bW04CisJdm1vdmRxdQlZTU1XT1JEWzY0K3JkaV0seW1tMQorCXZtb3ZkcXUJWU1NV09SRFs5NityZGldLHltbTUKKwlsZWEJcmRpLFsxMjgrcmRpXQorCisJdnB4b3IJeW1tMTIseW1tMTIsWU1NV09SRFtyc2ldCisJdnB4b3IJeW1tMTMseW1tMTMsWU1NV09SRFszMityc2ldCisJdnB4b3IJeW1tMTAseW1tMTAsWU1NV09SRFs2NCtyc2ldCisJdnB4b3IJeW1tMTUseW1tMTUsWU1NV09SRFs5Nityc2ldCisJbGVhCXJzaSxbMTI4K3JzaV0KKwl2bW92ZHF1CVlNTVdPUkRbcmRpXSx5bW0xMgorCXZtb3ZkcXUJWU1NV09SRFszMityZGldLHltbTEzCisJdm1vdmRxdQlZTU1XT1JEWzY0K3JkaV0seW1tMTAKKwl2bW92ZHF1CVlNTVdPUkRbOTYrcmRpXSx5bW0xNQorCWxlYQlyZGksWzEyOCtyZGldCisKKwl2cHhvcgl5bW0xNCx5bW0xNCxZTU1XT1JEW3JzaV0KKwl2cHhvcgl5bW0yLHltbTIsWU1NV09SRFszMityc2ldCisJdnB4b3IJeW1tMyx5bW0zLFlNTVdPUkRbNjQrcnNpXQorCXZweG9yCXltbTcseW1tNyxZTU1XT1JEWzk2K3JzaV0KKwlsZWEJcnNpLFsxMjgrcnNpXQorCXZtb3ZkcXUJWU1NV09SRFtyZGldLHltbTE0CisJdm1vdmRxdQlZTU1XT1JEWzMyK3JkaV0seW1tMgorCXZtb3ZkcXUJWU1NV09SRFs2NCtyZGldLHltbTMKKwl2bW92ZHF1CVlNTVdPUkRbOTYrcmRpXSx5bW03CisJbGVhCXJkaSxbMTI4K3JkaV0KKworCXZweG9yCXltbTExLHltbTExLFlNTVdPUkRbcnNpXQorCXZweG9yCXltbTkseW1tOSxZTU1XT1JEWzMyK3JzaV0KKwl2cHhvcgl5bW0wLHltbTAsWU1NV09SRFs2NCtyc2ldCisJdnB4b3IJeW1tNCx5bW00LFlNTVdPUkRbOTYrcnNpXQorCWxlYQlyc2ksWzEyOCtyc2ldCisJdm1vdmRxdQlZTU1XT1JEW3JkaV0seW1tMTEKKwl2bW92ZHF1CVlNTVdPUkRbMzIrcmRpXSx5bW05CisJdm1vdmRxdQlZTU1XT1JEWzY0K3JkaV0seW1tMAorCXZtb3ZkcXUJWU1NV09SRFs5NityZGldLHltbTQKKwlsZWEJcmRpLFsxMjgrcmRpXQorCisJc3ViCXJkeCw2NCo4CisJam56CU5FQVIgJEwkb29wX291dGVyOHgKKworCWptcAlORUFSICRMJGRvbmU4eAorCiskTCR0YWlsOHg6CisJY21wCXJkeCw0NDgKKwlqYWUJTkVBUiAkTCQ0NDhfb3JfbW9yZTh4CisJY21wCXJkeCwzODQKKwlqYWUJTkVBUiAkTCQzODRfb3JfbW9yZTh4CisJY21wCXJkeCwzMjAKKwlqYWUJTkVBUiAkTCQzMjBfb3JfbW9yZTh4CisJY21wCXJkeCwyNTYKKwlqYWUJTkVBUiAkTCQyNTZfb3JfbW9yZTh4CisJY21wCXJkeCwxOTIKKwlqYWUJTkVBUiAkTCQxOTJfb3JfbW9yZTh4CisJY21wCXJkeCwxMjgKKwlqYWUJTkVBUiAkTCQxMjhfb3JfbW9yZTh4CisJY21wCXJkeCw2NAorCWphZQlORUFSICRMJDY0X29yX21vcmU4eAorCisJeG9yCXIxMCxyMTAKKwl2bW92ZHFhCVlNTVdPUkRbcnNwXSx5bW02CisJdm1vdmRxYQlZTU1XT1JEWzMyK3JzcF0seW1tOAorCWptcAlORUFSICRMJG9vcF90YWlsOHgKKworQUxJR04JMzIKKyRMJDY0X29yX21vcmU4eDoKKwl2cHhvcgl5bW02LHltbTYsWU1NV09SRFtyc2ldCisJdnB4b3IJeW1tOCx5bW04LFlNTVdPUkRbMzIrcnNpXQorCXZtb3ZkcXUJWU1NV09SRFtyZGldLHltbTYKKwl2bW92ZHF1CVlNTVdPUkRbMzIrcmRpXSx5bW04CisJamUJTkVBUiAkTCRkb25lOHgKKworCWxlYQlyc2ksWzY0K3JzaV0KKwl4b3IJcjEwLHIxMAorCXZtb3ZkcWEJWU1NV09SRFtyc3BdLHltbTEKKwlsZWEJcmRpLFs2NCtyZGldCisJc3ViCXJkeCw2NAorCXZtb3ZkcWEJWU1NV09SRFszMityc3BdLHltbTUKKwlqbXAJTkVBUiAkTCRvb3BfdGFpbDh4CisKK0FMSUdOCTMyCiskTCQxMjhfb3JfbW9yZTh4OgorCXZweG9yCXltbTYseW1tNixZTU1XT1JEW3JzaV0KKwl2cHhvcgl5bW04LHltbTgsWU1NV09SRFszMityc2ldCisJdnB4b3IJeW1tMSx5bW0xLFlNTVdPUkRbNjQrcnNpXQorCXZweG9yCXltbTUseW1tNSxZTU1XT1JEWzk2K3JzaV0KKwl2bW92ZHF1CVlNTVdPUkRbcmRpXSx5bW02CisJdm1vdmRxdQlZTU1XT1JEWzMyK3JkaV0seW1tOAorCXZtb3ZkcXUJWU1NV09SRFs2NCtyZGldLHltbTEKKwl2bW92ZHF1CVlNTVdPUkRbOTYrcmRpXSx5bW01CisJamUJTkVBUiAkTCRkb25lOHgKKworCWxlYQlyc2ksWzEyOCtyc2ldCisJeG9yCXIxMCxyMTAKKwl2bW92ZHFhCVlNTVdPUkRbcnNwXSx5bW0xMgorCWxlYQlyZGksWzEyOCtyZGldCisJc3ViCXJkeCwxMjgKKwl2bW92ZHFhCVlNTVdPUkRbMzIrcnNwXSx5bW0xMworCWptcAlORUFSICRMJG9vcF90YWlsOHgKKworQUxJR04JMzIKKyRMJDE5Ml9vcl9tb3JlOHg6CisJdnB4b3IJeW1tNix5bW02LFlNTVdPUkRbcnNpXQorCXZweG9yCXltbTgseW1tOCxZTU1XT1JEWzMyK3JzaV0KKwl2cHhvcgl5bW0xLHltbTEsWU1NV09SRFs2NCtyc2ldCisJdnB4b3IJeW1tNSx5bW01LFlNTVdPUkRbOTYrcnNpXQorCXZweG9yCXltbTEyLHltbTEyLFlNTVdPUkRbMTI4K3JzaV0KKwl2cHhvcgl5bW0xMyx5bW0xMyxZTU1XT1JEWzE2MCtyc2ldCisJdm1vdmRxdQlZTU1XT1JEW3JkaV0seW1tNgorCXZtb3ZkcXUJWU1NV09SRFszMityZGldLHltbTgKKwl2bW92ZHF1CVlNTVdPUkRbNjQrcmRpXSx5bW0xCisJdm1vdmRxdQlZTU1XT1JEWzk2K3JkaV0seW1tNQorCXZtb3ZkcXUJWU1NV09SRFsxMjgrcmRpXSx5bW0xMgorCXZtb3ZkcXUJWU1NV09SRFsxNjArcmRpXSx5bW0xMworCWplCU5FQVIgJEwkZG9uZTh4CisKKwlsZWEJcnNpLFsxOTIrcnNpXQorCXhvcglyMTAscjEwCisJdm1vdmRxYQlZTU1XT1JEW3JzcF0seW1tMTAKKwlsZWEJcmRpLFsxOTIrcmRpXQorCXN1YglyZHgsMTkyCisJdm1vdmRxYQlZTU1XT1JEWzMyK3JzcF0seW1tMTUKKwlqbXAJTkVBUiAkTCRvb3BfdGFpbDh4CisKK0FMSUdOCTMyCiskTCQyNTZfb3JfbW9yZTh4OgorCXZweG9yCXltbTYseW1tNixZTU1XT1JEW3JzaV0KKwl2cHhvcgl5bW04LHltbTgsWU1NV09SRFszMityc2ldCisJdnB4b3IJeW1tMSx5bW0xLFlNTVdPUkRbNjQrcnNpXQorCXZweG9yCXltbTUseW1tNSxZTU1XT1JEWzk2K3JzaV0KKwl2cHhvcgl5bW0xMix5bW0xMixZTU1XT1JEWzEyOCtyc2ldCisJdnB4b3IJeW1tMTMseW1tMTMsWU1NV09SRFsxNjArcnNpXQorCXZweG9yCXltbTEwLHltbTEwLFlNTVdPUkRbMTkyK3JzaV0KKwl2cHhvcgl5bW0xNSx5bW0xNSxZTU1XT1JEWzIyNCtyc2ldCisJdm1vdmRxdQlZTU1XT1JEW3JkaV0seW1tNgorCXZtb3ZkcXUJWU1NV09SRFszMityZGldLHltbTgKKwl2bW92ZHF1CVlNTVdPUkRbNjQrcmRpXSx5bW0xCisJdm1vdmRxdQlZTU1XT1JEWzk2K3JkaV0seW1tNQorCXZtb3ZkcXUJWU1NV09SRFsxMjgrcmRpXSx5bW0xMgorCXZtb3ZkcXUJWU1NV09SRFsxNjArcmRpXSx5bW0xMworCXZtb3ZkcXUJWU1NV09SRFsxOTIrcmRpXSx5bW0xMAorCXZtb3ZkcXUJWU1NV09SRFsyMjQrcmRpXSx5bW0xNQorCWplCU5FQVIgJEwkZG9uZTh4CisKKwlsZWEJcnNpLFsyNTYrcnNpXQorCXhvcglyMTAscjEwCisJdm1vdmRxYQlZTU1XT1JEW3JzcF0seW1tMTQKKwlsZWEJcmRpLFsyNTYrcmRpXQorCXN1YglyZHgsMjU2CisJdm1vdmRxYQlZTU1XT1JEWzMyK3JzcF0seW1tMgorCWptcAlORUFSICRMJG9vcF90YWlsOHgKKworQUxJR04JMzIKKyRMJDMyMF9vcl9tb3JlOHg6CisJdnB4b3IJeW1tNix5bW02LFlNTVdPUkRbcnNpXQorCXZweG9yCXltbTgseW1tOCxZTU1XT1JEWzMyK3JzaV0KKwl2cHhvcgl5bW0xLHltbTEsWU1NV09SRFs2NCtyc2ldCisJdnB4b3IJeW1tNSx5bW01LFlNTVdPUkRbOTYrcnNpXQorCXZweG9yCXltbTEyLHltbTEyLFlNTVdPUkRbMTI4K3JzaV0KKwl2cHhvcgl5bW0xMyx5bW0xMyxZTU1XT1JEWzE2MCtyc2ldCisJdnB4b3IJeW1tMTAseW1tMTAsWU1NV09SRFsxOTIrcnNpXQorCXZweG9yCXltbTE1LHltbTE1LFlNTVdPUkRbMjI0K3JzaV0KKwl2cHhvcgl5bW0xNCx5bW0xNCxZTU1XT1JEWzI1Nityc2ldCisJdnB4b3IJeW1tMix5bW0yLFlNTVdPUkRbMjg4K3JzaV0KKwl2bW92ZHF1CVlNTVdPUkRbcmRpXSx5bW02CisJdm1vdmRxdQlZTU1XT1JEWzMyK3JkaV0seW1tOAorCXZtb3ZkcXUJWU1NV09SRFs2NCtyZGldLHltbTEKKwl2bW92ZHF1CVlNTVdPUkRbOTYrcmRpXSx5bW01CisJdm1vdmRxdQlZTU1XT1JEWzEyOCtyZGldLHltbTEyCisJdm1vdmRxdQlZTU1XT1JEWzE2MCtyZGldLHltbTEzCisJdm1vdmRxdQlZTU1XT1JEWzE5MityZGldLHltbTEwCisJdm1vdmRxdQlZTU1XT1JEWzIyNCtyZGldLHltbTE1CisJdm1vdmRxdQlZTU1XT1JEWzI1NityZGldLHltbTE0CisJdm1vdmRxdQlZTU1XT1JEWzI4OCtyZGldLHltbTIKKwlqZQlORUFSICRMJGRvbmU4eAorCisJbGVhCXJzaSxbMzIwK3JzaV0KKwl4b3IJcjEwLHIxMAorCXZtb3ZkcWEJWU1NV09SRFtyc3BdLHltbTMKKwlsZWEJcmRpLFszMjArcmRpXQorCXN1YglyZHgsMzIwCisJdm1vdmRxYQlZTU1XT1JEWzMyK3JzcF0seW1tNworCWptcAlORUFSICRMJG9vcF90YWlsOHgKKworQUxJR04JMzIKKyRMJDM4NF9vcl9tb3JlOHg6CisJdnB4b3IJeW1tNix5bW02LFlNTVdPUkRbcnNpXQorCXZweG9yCXltbTgseW1tOCxZTU1XT1JEWzMyK3JzaV0KKwl2cHhvcgl5bW0xLHltbTEsWU1NV09SRFs2NCtyc2ldCisJdnB4b3IJeW1tNSx5bW01LFlNTVdPUkRbOTYrcnNpXQorCXZweG9yCXltbTEyLHltbTEyLFlNTVdPUkRbMTI4K3JzaV0KKwl2cHhvcgl5bW0xMyx5bW0xMyxZTU1XT1JEWzE2MCtyc2ldCisJdnB4b3IJeW1tMTAseW1tMTAsWU1NV09SRFsxOTIrcnNpXQorCXZweG9yCXltbTE1LHltbTE1LFlNTVdPUkRbMjI0K3JzaV0KKwl2cHhvcgl5bW0xNCx5bW0xNCxZTU1XT1JEWzI1Nityc2ldCisJdnB4b3IJeW1tMix5bW0yLFlNTVdPUkRbMjg4K3JzaV0KKwl2cHhvcgl5bW0zLHltbTMsWU1NV09SRFszMjArcnNpXQorCXZweG9yCXltbTcseW1tNyxZTU1XT1JEWzM1Mityc2ldCisJdm1vdmRxdQlZTU1XT1JEW3JkaV0seW1tNgorCXZtb3ZkcXUJWU1NV09SRFszMityZGldLHltbTgKKwl2bW92ZHF1CVlNTVdPUkRbNjQrcmRpXSx5bW0xCisJdm1vdmRxdQlZTU1XT1JEWzk2K3JkaV0seW1tNQorCXZtb3ZkcXUJWU1NV09SRFsxMjgrcmRpXSx5bW0xMgorCXZtb3ZkcXUJWU1NV09SRFsxNjArcmRpXSx5bW0xMworCXZtb3ZkcXUJWU1NV09SRFsxOTIrcmRpXSx5bW0xMAorCXZtb3ZkcXUJWU1NV09SRFsyMjQrcmRpXSx5bW0xNQorCXZtb3ZkcXUJWU1NV09SRFsyNTYrcmRpXSx5bW0xNAorCXZtb3ZkcXUJWU1NV09SRFsyODgrcmRpXSx5bW0yCisJdm1vdmRxdQlZTU1XT1JEWzMyMCtyZGldLHltbTMKKwl2bW92ZHF1CVlNTVdPUkRbMzUyK3JkaV0seW1tNworCWplCU5FQVIgJEwkZG9uZTh4CisKKwlsZWEJcnNpLFszODQrcnNpXQorCXhvcglyMTAscjEwCisJdm1vdmRxYQlZTU1XT1JEW3JzcF0seW1tMTEKKwlsZWEJcmRpLFszODQrcmRpXQorCXN1YglyZHgsMzg0CisJdm1vdmRxYQlZTU1XT1JEWzMyK3JzcF0seW1tOQorCWptcAlORUFSICRMJG9vcF90YWlsOHgKKworQUxJR04JMzIKKyRMJDQ0OF9vcl9tb3JlOHg6CisJdnB4b3IJeW1tNix5bW02LFlNTVdPUkRbcnNpXQorCXZweG9yCXltbTgseW1tOCxZTU1XT1JEWzMyK3JzaV0KKwl2cHhvcgl5bW0xLHltbTEsWU1NV09SRFs2NCtyc2ldCisJdnB4b3IJeW1tNSx5bW01LFlNTVdPUkRbOTYrcnNpXQorCXZweG9yCXltbTEyLHltbTEyLFlNTVdPUkRbMTI4K3JzaV0KKwl2cHhvcgl5bW0xMyx5bW0xMyxZTU1XT1JEWzE2MCtyc2ldCisJdnB4b3IJeW1tMTAseW1tMTAsWU1NV09SRFsxOTIrcnNpXQorCXZweG9yCXltbTE1LHltbTE1LFlNTVdPUkRbMjI0K3JzaV0KKwl2cHhvcgl5bW0xNCx5bW0xNCxZTU1XT1JEWzI1Nityc2ldCisJdnB4b3IJeW1tMix5bW0yLFlNTVdPUkRbMjg4K3JzaV0KKwl2cHhvcgl5bW0zLHltbTMsWU1NV09SRFszMjArcnNpXQorCXZweG9yCXltbTcseW1tNyxZTU1XT1JEWzM1Mityc2ldCisJdnB4b3IJeW1tMTEseW1tMTEsWU1NV09SRFszODQrcnNpXQorCXZweG9yCXltbTkseW1tOSxZTU1XT1JEWzQxNityc2ldCisJdm1vdmRxdQlZTU1XT1JEW3JkaV0seW1tNgorCXZtb3ZkcXUJWU1NV09SRFszMityZGldLHltbTgKKwl2bW92ZHF1CVlNTVdPUkRbNjQrcmRpXSx5bW0xCisJdm1vdmRxdQlZTU1XT1JEWzk2K3JkaV0seW1tNQorCXZtb3ZkcXUJWU1NV09SRFsxMjgrcmRpXSx5bW0xMgorCXZtb3ZkcXUJWU1NV09SRFsxNjArcmRpXSx5bW0xMworCXZtb3ZkcXUJWU1NV09SRFsxOTIrcmRpXSx5bW0xMAorCXZtb3ZkcXUJWU1NV09SRFsyMjQrcmRpXSx5bW0xNQorCXZtb3ZkcXUJWU1NV09SRFsyNTYrcmRpXSx5bW0xNAorCXZtb3ZkcXUJWU1NV09SRFsyODgrcmRpXSx5bW0yCisJdm1vdmRxdQlZTU1XT1JEWzMyMCtyZGldLHltbTMKKwl2bW92ZHF1CVlNTVdPUkRbMzUyK3JkaV0seW1tNworCXZtb3ZkcXUJWU1NV09SRFszODQrcmRpXSx5bW0xMQorCXZtb3ZkcXUJWU1NV09SRFs0MTYrcmRpXSx5bW05CisJamUJTkVBUiAkTCRkb25lOHgKKworCWxlYQlyc2ksWzQ0OCtyc2ldCisJeG9yCXIxMCxyMTAKKwl2bW92ZHFhCVlNTVdPUkRbcnNwXSx5bW0wCisJbGVhCXJkaSxbNDQ4K3JkaV0KKwlzdWIJcmR4LDQ0OAorCXZtb3ZkcWEJWU1NV09SRFszMityc3BdLHltbTQKKworJEwkb29wX3RhaWw4eDoKKwltb3Z6eAllYXgsQllURVtyMTAqMStyc2ldCisJbW92engJZWN4LEJZVEVbcjEwKjErcnNwXQorCWxlYQlyMTAsWzErcjEwXQorCXhvcgllYXgsZWN4CisJbW92CUJZVEVbKCgtMSkpK3IxMCoxK3JkaV0sYWwKKwlkZWMJcmR4CisJam56CU5FQVIgJEwkb29wX3RhaWw4eAorCiskTCRkb25lOHg6CisJdnplcm9hbGwKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTE2OCkpK3I5XQorCW1vdmFwcwl4bW03LFhNTVdPUkRbKCgtMTUyKSkrcjldCisJbW92YXBzCXhtbTgsWE1NV09SRFsoKC0xMzYpKStyOV0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTEyMCkpK3I5XQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWygoLTEwNCkpK3I5XQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWygoLTg4KSkrcjldCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbKCgtNzIpKStyOV0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsoKC01NikpK3I5XQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWygoLTQwKSkrcjldCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbKCgtMjQpKStyOV0KKwlsZWEJcnNwLFtyOV0KKyRMJDh4X2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF9DaGFDaGEyMF84eDoKK0VYVEVSTglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisKK0FMSUdOCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCW1vdglyc2ksUVdPUkRbOCtyOV0KKwltb3YJcjExLFFXT1JEWzU2K3I5XQorCisJbGVhCXIxMCxbJEwkY3RyMzJfYm9keV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcmF4LFFXT1JEWzE1MityOF0KKworCWxlYQlyMTAsWyRMJG5vX2RhdGFdCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCWxlYQlyYXgsWygoNjQrMjQrNDgpKStyYXhdCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYXhdCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JheF0KKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcmF4XQorCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyYXhdCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JheF0KKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcmF4XQorCW1vdglRV09SRFsxNDQrcjhdLHJieAorCW1vdglRV09SRFsxNjArcjhdLHJicAorCW1vdglRV09SRFsyMTYrcjhdLHIxMgorCW1vdglRV09SRFsyMjQrcjhdLHIxMworCW1vdglRV09SRFsyMzIrcjhdLHIxNAorCW1vdglRV09SRFsyNDArcjhdLHIxNQorCiskTCRjb21tb25fc2VoX3RhaWw6CisJbW92CXJkaSxRV09SRFs4K3JheF0KKwltb3YJcnNpLFFXT1JEWzE2K3JheF0KKwltb3YJUVdPUkRbMTUyK3I4XSxyYXgKKwltb3YJUVdPUkRbMTY4K3I4XSxyc2kKKwltb3YJUVdPUkRbMTc2K3I4XSxyZGkKKworCW1vdglyZGksUVdPUkRbNDArcjldCisJbW92CXJzaSxyOAorCW1vdgllY3gsMTU0CisJREQJMHhhNTQ4ZjNmYworCisJbW92CXJzaSxyOQorCXhvcglyY3gscmN4CisJbW92CXJkeCxRV09SRFs4K3JzaV0KKwltb3YJcjgsUVdPUkRbcnNpXQorCW1vdglyOSxRV09SRFsxNityc2ldCisJbW92CXIxMCxRV09SRFs0MCtyc2ldCisJbGVhCXIxMSxbNTYrcnNpXQorCWxlYQlyMTIsWzI0K3JzaV0KKwltb3YJUVdPUkRbMzIrcnNwXSxyMTAKKwltb3YJUVdPUkRbNDArcnNwXSxyMTEKKwltb3YJUVdPUkRbNDgrcnNwXSxyMTIKKwltb3YJUVdPUkRbNTYrcnNwXSxyY3gKKwljYWxsCVFXT1JEW19faW1wX1J0bFZpcnR1YWxVbndpbmRdCisKKwltb3YJZWF4LDEKKwlhZGQJcnNwLDY0CisJcG9wZnEKKwlwb3AJcjE1CisJcG9wCXIxNAorCXBvcAlyMTMKKwlwb3AJcjEyCisJcG9wCXJicAorCXBvcAlyYngKKwlwb3AJcmRpCisJcG9wCXJzaQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworQUxJR04JMTYKK3Nzc2UzX2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTIwK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbW92CXJzaSxRV09SRFs4K3I5XQorCW1vdglyMTEsUVdPUkRbNTYrcjldCisKKwltb3YJcjEwZCxEV09SRFtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyYXgsUVdPUkRbMTkyK3I4XQorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwlsZWEJcnNpLFsoKC00MCkpK3JheF0KKwlsZWEJcmRpLFs1MTIrcjhdCisJbW92CWVjeCw0CisJREQJMHhhNTQ4ZjNmYworCisJam1wCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKworCitBTElHTgkxNgorZnVsbF9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCW1vdglyc2ksUVdPUkRbOCtyOV0KKwltb3YJcjExLFFXT1JEWzU2K3I5XQorCisJbW92CXIxMGQsRFdPUkRbcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcmF4LFFXT1JEWzE5MityOF0KKworCW1vdglyMTBkLERXT1JEWzQrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWphZQlORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbGVhCXJzaSxbKCgtMTY4KSkrcmF4XQorCWxlYQlyZGksWzUxMityOF0KKwltb3YJZWN4LDIwCisJREQJMHhhNTQ4ZjNmYworCisJam1wCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKworc2VjdGlvbgkucGRhdGEgcmRhdGEgYWxpZ249NAorQUxJR04JNAorCURECSRMJFNFSF9iZWdpbl9DaGFDaGEyMF9jdHIzMiB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX0NoYUNoYTIwX2N0cjMyIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX0NoYUNoYTIwX2N0cjMyIHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX0NoYUNoYTIwX3Nzc2UzIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfQ2hhQ2hhMjBfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fQ2hhQ2hhMjBfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fQ2hhQ2hhMjBfNHggd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9DaGFDaGEyMF80eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19DaGFDaGEyMF80eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfYmVnaW5fQ2hhQ2hhMjBfOHggd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9DaGFDaGEyMF84eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19DaGFDaGEyMF84eCB3cnQgLi5pbWFnZWJhc2UKK3NlY3Rpb24JLnhkYXRhIHJkYXRhIGFsaWduPTgKK0FMSUdOCTgKKyRMJFNFSF9pbmZvX0NoYUNoYTIwX2N0cjMyOgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisKKyRMJFNFSF9pbmZvX0NoYUNoYTIwX3Nzc2UzOgorREIJOSwwLDAsMAorCURECXNzc2UzX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkc3NzZTNfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkc3NzZTNfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisKKyRMJFNFSF9pbmZvX0NoYUNoYTIwXzR4OgorREIJOSwwLDAsMAorCURECWZ1bGxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCQ0eF9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCQ0eF9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX0NoYUNoYTIwXzh4OgorREIJOSwwLDAsMAorCURECWZ1bGxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCQ4eF9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCQ4eF9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2FlczEyOGdjbXNpdi14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9jaXBoZXJfZXh0cmEvYWVzMTI4Z2Ntc2l2LXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkYzIwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2FlczEyOGdjbXNpdi14ODZfNjQuYXNtCkBAIC0wLDAgKzEsMzI3MCBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLmRhdGEgZGF0YSBhbGlnbj04CisKKworQUxJR04JMTYKK29uZToKKwlEUQkxLDAKK3R3bzoKKwlEUQkyLDAKK3RocmVlOgorCURRCTMsMAorZm91cjoKKwlEUQk0LDAKK2ZpdmU6CisJRFEJNSwwCitzaXg6CisJRFEJNiwwCitzZXZlbjoKKwlEUQk3LDAKK2VpZ2h0OgorCURRCTgsMAorCitPUl9NQVNLOgorCURECTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDAKK3BvbHk6CisJRFEJMHgxLDB4YzIwMDAwMDAwMDAwMDAwMAorbWFzazoKKwlERAkweDBjMGYwZTBkLDB4MGMwZjBlMGQsMHgwYzBmMGUwZCwweDBjMGYwZTBkCitjb24xOgorCURECTEsMSwxLDEKK2NvbjI6CisJREQJMHgxYiwweDFiLDB4MWIsMHgxYgorY29uMzoKK0RCCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDQsNSw2LDcsNCw1LDYsNworYW5kX21hc2s6CisJREQJMCwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZgorc2VjdGlvbgkudGV4dCBjb2RlIGFsaWduPTY0CisKKworQUxJR04JMTYKK0dGTVVMOgorCisJdnBjbG11bHFkcQl4bW0yLHhtbTAseG1tMSwweDAwCisJdnBjbG11bHFkcQl4bW01LHhtbTAseG1tMSwweDExCisJdnBjbG11bHFkcQl4bW0zLHhtbTAseG1tMSwweDEwCisJdnBjbG11bHFkcQl4bW00LHhtbTAseG1tMSwweDAxCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tMyw4CisJdnBzcmxkcQl4bW0zLHhtbTMsOAorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnB4b3IJeG1tNSx4bW01LHhtbTMKKworCXZwY2xtdWxxZHEJeG1tMyx4bW0yLFhNTVdPUkRbcG9seV0sMHgxMAorCXZwc2h1ZmQJeG1tNCx4bW0yLDc4CisJdnB4b3IJeG1tMix4bW0zLHhtbTQKKworCXZwY2xtdWxxZHEJeG1tMyx4bW0yLFhNTVdPUkRbcG9seV0sMHgxMAorCXZwc2h1ZmQJeG1tNCx4bW0yLDc4CisJdnB4b3IJeG1tMix4bW0zLHhtbTQKKworCXZweG9yCXhtbTAseG1tMix4bW01CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworZ2xvYmFsCWFlc2djbXNpdl9odGFibGVfaW5pdAorCitBTElHTgkxNgorYWVzZ2Ntc2l2X2h0YWJsZV9pbml0OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzZ2Ntc2l2X2h0YWJsZV9pbml0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKworCisKKwl2bW92ZHFhCXhtbTAsWE1NV09SRFtyc2ldCisJdm1vdmRxYQl4bW0xLHhtbTAKKwl2bW92ZHFhCVhNTVdPUkRbcmRpXSx4bW0wCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJWE1NV09SRFsxNityZGldLHhtbTAKKwljYWxsCUdGTVVMCisJdm1vdmRxYQlYTU1XT1JEWzMyK3JkaV0seG1tMAorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCVhNTVdPUkRbNDgrcmRpXSx4bW0wCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJWE1NV09SRFs2NCtyZGldLHhtbTAKKwljYWxsCUdGTVVMCisJdm1vdmRxYQlYTU1XT1JEWzgwK3JkaV0seG1tMAorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCVhNTVdPUkRbOTYrcmRpXSx4bW0wCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJWE1NV09SRFsxMTIrcmRpXSx4bW0wCisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzZ2Ntc2l2X2h0YWJsZV9pbml0OgorZ2xvYmFsCWFlc2djbXNpdl9odGFibGU2X2luaXQKKworQUxJR04JMTYKK2Flc2djbXNpdl9odGFibGU2X2luaXQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNnY21zaXZfaHRhYmxlNl9pbml0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKworCisKKwl2bW92ZHFhCXhtbTAsWE1NV09SRFtyc2ldCisJdm1vdmRxYQl4bW0xLHhtbTAKKwl2bW92ZHFhCVhNTVdPUkRbcmRpXSx4bW0wCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJWE1NV09SRFsxNityZGldLHhtbTAKKwljYWxsCUdGTVVMCisJdm1vdmRxYQlYTU1XT1JEWzMyK3JkaV0seG1tMAorCWNhbGwJR0ZNVUwKKwl2bW92ZHFhCVhNTVdPUkRbNDgrcmRpXSx4bW0wCisJY2FsbAlHRk1VTAorCXZtb3ZkcWEJWE1NV09SRFs2NCtyZGldLHhtbTAKKwljYWxsCUdGTVVMCisJdm1vdmRxYQlYTU1XT1JEWzgwK3JkaV0seG1tMAorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2Flc2djbXNpdl9odGFibGU2X2luaXQ6CitnbG9iYWwJYWVzZ2Ntc2l2X2h0YWJsZV9wb2x5dmFsCisKK0FMSUdOCTE2CithZXNnY21zaXZfaHRhYmxlX3BvbHl2YWw6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNnY21zaXZfaHRhYmxlX3BvbHl2YWw6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisKKworCisJdGVzdAlyZHgscmR4CisJam56CU5FQVIgJEwkaHRhYmxlX3BvbHl2YWxfc3RhcnQKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkaHRhYmxlX3BvbHl2YWxfc3RhcnQ6CisJdnplcm9hbGwKKworCisKKwltb3YJcjExLHJkeAorCWFuZAlyMTEsMTI3CisKKwlqeglORUFSICRMJGh0YWJsZV9wb2x5dmFsX25vX3ByZWZpeAorCisJdnB4b3IJeG1tOSx4bW05LHhtbTkKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFtyY3hdCisJc3ViCXJkeCxyMTEKKworCXN1YglyMTEsMTYKKworCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbcnNpXQorCXZweG9yCXhtbTAseG1tMCx4bW0xCisKKwl2cGNsbXVscWRxCXhtbTUseG1tMCxYTU1XT1JEW3IxMSoxK3JkaV0sMHgwMQorCXZwY2xtdWxxZHEJeG1tMyx4bW0wLFhNTVdPUkRbcjExKjErcmRpXSwweDAwCisJdnBjbG11bHFkcQl4bW00LHhtbTAsWE1NV09SRFtyMTEqMStyZGldLDB4MTEKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEW3IxMSoxK3JkaV0sMHgxMAorCXZweG9yCXhtbTUseG1tNSx4bW02CisKKwlsZWEJcnNpLFsxNityc2ldCisJdGVzdAlyMTEscjExCisJam56CU5FQVIgJEwkaHRhYmxlX3BvbHl2YWxfcHJlZml4X2xvb3AKKwlqbXAJTkVBUiAkTCRodGFibGVfcG9seXZhbF9wcmVmaXhfY29tcGxldGUKKworCitBTElHTgk2NAorJEwkaHRhYmxlX3BvbHl2YWxfcHJlZml4X2xvb3A6CisJc3ViCXIxMSwxNgorCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbcnNpXQorCisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFtyMTEqMStyZGldLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbcjExKjErcmRpXSwweDExCisJdnB4b3IJeG1tNCx4bW00LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEW3IxMSoxK3JkaV0sMHgwMQorCXZweG9yCXhtbTUseG1tNSx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFtyMTEqMStyZGldLDB4MTAKKwl2cHhvcgl4bW01LHhtbTUseG1tNgorCisJdGVzdAlyMTEscjExCisKKwlsZWEJcnNpLFsxNityc2ldCisKKwlqbnoJTkVBUiAkTCRodGFibGVfcG9seXZhbF9wcmVmaXhfbG9vcAorCiskTCRodGFibGVfcG9seXZhbF9wcmVmaXhfY29tcGxldGU6CisJdnBzcmxkcQl4bW02LHhtbTUsOAorCXZwc2xsZHEJeG1tNSx4bW01LDgKKworCXZweG9yCXhtbTkseG1tNCx4bW02CisJdnB4b3IJeG1tMSx4bW0zLHhtbTUKKworCWptcAlORUFSICRMJGh0YWJsZV9wb2x5dmFsX21haW5fbG9vcAorCiskTCRodGFibGVfcG9seXZhbF9ub19wcmVmaXg6CisKKworCisKKwl2cHhvcgl4bW0xLHhtbTEseG1tMQorCXZtb3ZkcWEJeG1tOSxYTU1XT1JEW3JjeF0KKworQUxJR04JNjQKKyRMJGh0YWJsZV9wb2x5dmFsX21haW5fbG9vcDoKKwlzdWIJcmR4LDB4ODAKKwlqYglORUFSICRMJGh0YWJsZV9wb2x5dmFsX291dAorCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbMTEyK3JzaV0KKworCXZwY2xtdWxxZHEJeG1tNSx4bW0wLFhNTVdPUkRbcmRpXSwweDAxCisJdnBjbG11bHFkcQl4bW0zLHhtbTAsWE1NV09SRFtyZGldLDB4MDAKKwl2cGNsbXVscWRxCXhtbTQseG1tMCxYTU1XT1JEW3JkaV0sMHgxMQorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbcmRpXSwweDEwCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKworCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbOTYrcnNpXQorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbMTYrcmRpXSwweDAxCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzE2K3JkaV0sMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFsxNityZGldLDB4MTEKKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbMTYrcmRpXSwweDEwCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKworCisKKwl2bW92ZHF1CXhtbTAsWE1NV09SRFs4MCtyc2ldCisKKwl2cGNsbXVscWRxCXhtbTcseG1tMSxYTU1XT1JEW3BvbHldLDB4MTAKKwl2cGFsaWducgl4bW0xLHhtbTEseG1tMSw4CisKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzMyK3JkaV0sMHgwMQorCXZweG9yCXhtbTUseG1tNSx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFszMityZGldLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbMzIrcmRpXSwweDExCisJdnB4b3IJeG1tNCx4bW00LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzMyK3JkaV0sMHgxMAorCXZweG9yCXhtbTUseG1tNSx4bW02CisKKworCXZweG9yCXhtbTEseG1tMSx4bW03CisKKwl2bW92ZHF1CXhtbTAsWE1NV09SRFs2NCtyc2ldCisKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzQ4K3JkaV0sMHgwMQorCXZweG9yCXhtbTUseG1tNSx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFs0OCtyZGldLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbNDgrcmRpXSwweDExCisJdnB4b3IJeG1tNCx4bW00LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzQ4K3JkaV0sMHgxMAorCXZweG9yCXhtbTUseG1tNSx4bW02CisKKworCXZtb3ZkcXUJeG1tMCxYTU1XT1JEWzQ4K3JzaV0KKworCXZwY2xtdWxxZHEJeG1tNyx4bW0xLFhNTVdPUkRbcG9seV0sMHgxMAorCXZwYWxpZ25yCXhtbTEseG1tMSx4bW0xLDgKKworCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbNjQrcmRpXSwweDAxCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzY0K3JkaV0sMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFs2NCtyZGldLDB4MTEKKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbNjQrcmRpXSwweDEwCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKworCisJdnB4b3IJeG1tMSx4bW0xLHhtbTcKKworCXZtb3ZkcXUJeG1tMCxYTU1XT1JEWzMyK3JzaV0KKworCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbODArcmRpXSwweDAxCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzgwK3JkaV0sMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFs4MCtyZGldLDB4MTEKKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbODArcmRpXSwweDEwCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKworCisJdnB4b3IJeG1tMSx4bW0xLHhtbTkKKworCXZtb3ZkcXUJeG1tMCxYTU1XT1JEWzE2K3JzaV0KKworCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbOTYrcmRpXSwweDAxCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzk2K3JkaV0sMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFs5NityZGldLDB4MTEKKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbOTYrcmRpXSwweDEwCisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKworCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbcnNpXQorCXZweG9yCXhtbTAseG1tMCx4bW0xCisKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzExMityZGldLDB4MDEKKwl2cHhvcgl4bW01LHhtbTUseG1tNgorCXZwY2xtdWxxZHEJeG1tNix4bW0wLFhNTVdPUkRbMTEyK3JkaV0sMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW02CisJdnBjbG11bHFkcQl4bW02LHhtbTAsWE1NV09SRFsxMTIrcmRpXSwweDExCisJdnB4b3IJeG1tNCx4bW00LHhtbTYKKwl2cGNsbXVscWRxCXhtbTYseG1tMCxYTU1XT1JEWzExMityZGldLDB4MTAKKwl2cHhvcgl4bW01LHhtbTUseG1tNgorCisKKwl2cHNybGRxCXhtbTYseG1tNSw4CisJdnBzbGxkcQl4bW01LHhtbTUsOAorCisJdnB4b3IJeG1tOSx4bW00LHhtbTYKKwl2cHhvcgl4bW0xLHhtbTMseG1tNQorCisJbGVhCXJzaSxbMTI4K3JzaV0KKwlqbXAJTkVBUiAkTCRodGFibGVfcG9seXZhbF9tYWluX2xvb3AKKworCisKKyRMJGh0YWJsZV9wb2x5dmFsX291dDoKKwl2cGNsbXVscWRxCXhtbTYseG1tMSxYTU1XT1JEW3BvbHldLDB4MTAKKwl2cGFsaWducgl4bW0xLHhtbTEseG1tMSw4CisJdnB4b3IJeG1tMSx4bW0xLHhtbTYKKworCXZwY2xtdWxxZHEJeG1tNix4bW0xLFhNTVdPUkRbcG9seV0sMHgxMAorCXZwYWxpZ25yCXhtbTEseG1tMSx4bW0xLDgKKwl2cHhvcgl4bW0xLHhtbTEseG1tNgorCXZweG9yCXhtbTEseG1tMSx4bW05CisKKwl2bW92ZHF1CVhNTVdPUkRbcmN4XSx4bW0xCisJdnplcm91cHBlcgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2Flc2djbXNpdl9odGFibGVfcG9seXZhbDoKK2dsb2JhbAlhZXNnY21zaXZfcG9seXZhbF9ob3JuZXIKKworQUxJR04JMTYKK2Flc2djbXNpdl9wb2x5dmFsX2hvcm5lcjoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2Flc2djbXNpdl9wb2x5dmFsX2hvcm5lcjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKworCisKKwl0ZXN0CXJjeCxyY3gKKwlqbnoJTkVBUiAkTCRwb2x5dmFsX2hvcm5lcl9zdGFydAorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRwb2x5dmFsX2hvcm5lcl9zdGFydDoKKworCisKKwl4b3IJcjEwLHIxMAorCXNobAlyY3gsNAorCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbcnNpXQorCXZtb3ZkcWEJeG1tMCxYTU1XT1JEW3JkaV0KKworJEwkcG9seXZhbF9ob3JuZXJfbG9vcDoKKwl2cHhvcgl4bW0wLHhtbTAsWE1NV09SRFtyMTAqMStyZHhdCisJY2FsbAlHRk1VTAorCisJYWRkCXIxMCwxNgorCWNtcAlyY3gscjEwCisJam5lCU5FQVIgJEwkcG9seXZhbF9ob3JuZXJfbG9vcAorCisKKwl2bW92ZHFhCVhNTVdPUkRbcmRpXSx4bW0wCisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzZ2Ntc2l2X3BvbHl2YWxfaG9ybmVyOgorZ2xvYmFsCWFlczEyOGdjbXNpdl9hZXNfa3MKKworQUxJR04JMTYKK2FlczEyOGdjbXNpdl9hZXNfa3M6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXMxMjhnY21zaXZfYWVzX2tzOgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKworCisKKwl2bW92ZHF1CXhtbTEsWE1NV09SRFtyZGldCisJdm1vdmRxYQlYTU1XT1JEW3JzaV0seG1tMQorCisJdm1vdmRxYQl4bW0wLFhNTVdPUkRbY29uMV0KKwl2bW92ZHFhCXhtbTE1LFhNTVdPUkRbbWFza10KKworCW1vdglyYXgsOAorCiskTCRrczEyOF9sb29wOgorCWFkZAlyc2ksMTYKKwlzdWIJcmF4LDEKKwl2cHNodWZiCXhtbTIseG1tMSx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxkCXhtbTAseG1tMCwxCisJdnBzbGxkcQl4bW0zLHhtbTEsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnBzbGxkcQl4bW0zLHhtbTMsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnBzbGxkcQl4bW0zLHhtbTMsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwl2bW92ZHFhCVhNTVdPUkRbcnNpXSx4bW0xCisJam5lCU5FQVIgJEwka3MxMjhfbG9vcAorCisJdm1vdmRxYQl4bW0wLFhNTVdPUkRbY29uMl0KKwl2cHNodWZiCXhtbTIseG1tMSx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxkCXhtbTAseG1tMCwxCisJdnBzbGxkcQl4bW0zLHhtbTEsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnBzbGxkcQl4bW0zLHhtbTMsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnBzbGxkcQl4bW0zLHhtbTMsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNpXSx4bW0xCisKKwl2cHNodWZiCXhtbTIseG1tMSx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxkcQl4bW0zLHhtbTEsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnBzbGxkcQl4bW0zLHhtbTMsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnBzbGxkcQl4bW0zLHhtbTMsNAorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNpXSx4bW0xCisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzMTI4Z2Ntc2l2X2Flc19rczoKK2dsb2JhbAlhZXMyNTZnY21zaXZfYWVzX2tzCisKK0FMSUdOCTE2CithZXMyNTZnY21zaXZfYWVzX2tzOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzMjU2Z2Ntc2l2X2Flc19rczoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisKKworCisJdm1vdmRxdQl4bW0xLFhNTVdPUkRbcmRpXQorCXZtb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwl2bW92ZHFhCVhNTVdPUkRbcnNpXSx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzE2K3JzaV0seG1tMworCXZtb3ZkcWEJeG1tMCxYTU1XT1JEW2NvbjFdCisJdm1vdmRxYQl4bW0xNSxYTU1XT1JEW21hc2tdCisJdnB4b3IJeG1tMTQseG1tMTQseG1tMTQKKwltb3YJcmF4LDYKKworJEwka3MyNTZfbG9vcDoKKwlhZGQJcnNpLDMyCisJc3ViCXJheCwxCisJdnBzaHVmYgl4bW0yLHhtbTMseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW00LHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwc2h1ZmIJeG1tNCx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZweG9yCXhtbTEseG1tMSx4bW0yCisJdm1vdmRxYQlYTU1XT1JEW3JzaV0seG1tMQorCXZwc2h1ZmQJeG1tMix4bW0xLDB4ZmYKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMTQKKwl2cHNsbHEJeG1tNCx4bW0zLDMyCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHNodWZiCXhtbTQseG1tMyxYTU1XT1JEW2NvbjNdCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHhvcgl4bW0zLHhtbTMseG1tMgorCXZtb3ZkcWEJWE1NV09SRFsxNityc2ldLHhtbTMKKwlqbmUJTkVBUiAkTCRrczI1Nl9sb29wCisKKwl2cHNodWZiCXhtbTIseG1tMyx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxxCXhtbTQseG1tMSwzMgorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzaHVmYgl4bW00LHhtbTEsWE1NV09SRFtjb24zXQorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNpXSx4bW0xCisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK2dsb2JhbAlhZXMxMjhnY21zaXZfYWVzX2tzX2VuY194MQorCitBTElHTgkxNgorYWVzMTI4Z2Ntc2l2X2Flc19rc19lbmNfeDE6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXMxMjhnY21zaXZfYWVzX2tzX2VuY194MToKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKworCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFtyY3hdCisJdm1vdmRxYQl4bW00LFhNTVdPUkRbcmRpXQorCisJdm1vdmRxYQlYTU1XT1JEW3JkeF0seG1tMQorCXZweG9yCXhtbTQseG1tNCx4bW0xCisKKwl2bW92ZHFhCXhtbTAsWE1NV09SRFtjb24xXQorCXZtb3ZkcWEJeG1tMTUsWE1NV09SRFttYXNrXQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzE2K3JkeF0seG1tMQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzMyK3JkeF0seG1tMQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzQ4K3JkeF0seG1tMQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzY0K3JkeF0seG1tMQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzgwK3JkeF0seG1tMQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzk2K3JkeF0seG1tMQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdm1vdmRxYQlYTU1XT1JEWzExMityZHhdLHhtbTEKKworCXZwc2h1ZmIJeG1tMix4bW0xLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLHhtbTAKKwl2cHNsbGQJeG1tMCx4bW0wLDEKKwl2cHNsbHEJeG1tMyx4bW0xLDMyCisJdnB4b3IJeG1tMSx4bW0xLHhtbTMKKwl2cHNodWZiCXhtbTMseG1tMSxYTU1XT1JEW2NvbjNdCisJdnB4b3IJeG1tMSx4bW0xLHhtbTMKKwl2cHhvcgl4bW0xLHhtbTEseG1tMgorCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMQorCXZtb3ZkcWEJWE1NV09SRFsxMjgrcmR4XSx4bW0xCisKKworCXZtb3ZkcWEJeG1tMCxYTU1XT1JEW2NvbjJdCisKKwl2cHNodWZiCXhtbTIseG1tMSx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxkCXhtbTAseG1tMCwxCisJdnBzbGxxCXhtbTMseG1tMSwzMgorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnBzaHVmYgl4bW0zLHhtbTEsWE1NV09SRFtjb24zXQorCXZweG9yCXhtbTEseG1tMSx4bW0zCisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKworCXZhZXNlbmMJeG1tNCx4bW00LHhtbTEKKwl2bW92ZHFhCVhNTVdPUkRbMTQ0K3JkeF0seG1tMQorCisJdnBzaHVmYgl4bW0yLHhtbTEseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xscQl4bW0zLHhtbTEsMzIKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2h1ZmIJeG1tMyx4bW0xLFhNTVdPUkRbY29uM10KKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW0yCisKKwl2YWVzZW5jbGFzdAl4bW00LHhtbTQseG1tMQorCXZtb3ZkcWEJWE1NV09SRFsxNjArcmR4XSx4bW0xCisKKworCXZtb3ZkcWEJWE1NV09SRFtyc2ldLHhtbTQKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXMxMjhnY21zaXZfYWVzX2tzX2VuY194MToKK2dsb2JhbAlhZXMxMjhnY21zaXZfa2RmCisKK0FMSUdOCTE2CithZXMxMjhnY21zaXZfa2RmOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzMTI4Z2Ntc2l2X2tkZjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworCisKKworCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbcmR4XQorCXZtb3ZkcWEJeG1tOSxYTU1XT1JEW3JkaV0KKwl2bW92ZHFhCXhtbTEyLFhNTVdPUkRbYW5kX21hc2tdCisJdm1vdmRxYQl4bW0xMyxYTU1XT1JEW29uZV0KKwl2cHNodWZkCXhtbTkseG1tOSwweDkwCisJdnBhbmQJeG1tOSx4bW05LHhtbTEyCisJdnBhZGRkCXhtbTEwLHhtbTkseG1tMTMKKwl2cGFkZGQJeG1tMTEseG1tMTAseG1tMTMKKwl2cGFkZGQJeG1tMTIseG1tMTEseG1tMTMKKworCXZweG9yCXhtbTkseG1tOSx4bW0xCisJdnB4b3IJeG1tMTAseG1tMTAseG1tMQorCXZweG9yCXhtbTExLHhtbTExLHhtbTEKKwl2cHhvcgl4bW0xMix4bW0xMix4bW0xCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFsxNityZHhdCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMQorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMQorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMQorCisJdm1vdmRxYQl4bW0yLFhNTVdPUkRbMzIrcmR4XQorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTIKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTIKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTIKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTIKKworCXZtb3ZkcWEJeG1tMSxYTU1XT1JEWzQ4K3JkeF0KKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0xCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0xCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisKKwl2bW92ZHFhCXhtbTIsWE1NV09SRFs2NCtyZHhdCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMgorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMgorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMgorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMgorCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbODArcmR4XQorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTEKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTEKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTEKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTEKKworCXZtb3ZkcWEJeG1tMixYTU1XT1JEWzk2K3JkeF0KKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0yCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0yCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0yCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0yCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFsxMTIrcmR4XQorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTEKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTEKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTEKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTEKKworCXZtb3ZkcWEJeG1tMixYTU1XT1JEWzEyOCtyZHhdCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMgorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMgorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMgorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMgorCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbMTQ0K3JkeF0KKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0xCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0xCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisKKwl2bW92ZHFhCXhtbTIsWE1NV09SRFsxNjArcmR4XQorCXZhZXNlbmNsYXN0CXhtbTkseG1tOSx4bW0yCisJdmFlc2VuY2xhc3QJeG1tMTAseG1tMTAseG1tMgorCXZhZXNlbmNsYXN0CXhtbTExLHhtbTExLHhtbTIKKwl2YWVzZW5jbGFzdAl4bW0xMix4bW0xMix4bW0yCisKKworCXZtb3ZkcWEJWE1NV09SRFtyc2ldLHhtbTkKKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNpXSx4bW0xMAorCXZtb3ZkcWEJWE1NV09SRFszMityc2ldLHhtbTExCisJdm1vdmRxYQlYTU1XT1JEWzQ4K3JzaV0seG1tMTIKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXMxMjhnY21zaXZfa2RmOgorZ2xvYmFsCWFlczEyOGdjbXNpdl9lbmNfbXNnX3g0CisKK0FMSUdOCTE2CithZXMxMjhnY21zaXZfZW5jX21zZ194NDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2FlczEyOGdjbXNpdl9lbmNfbXNnX3g0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisKKworCisJdGVzdAlyOCxyOAorCWpueglORUFSICRMJDEyOF9lbmNfbXNnX3g0X3N0YXJ0CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJDEyOF9lbmNfbXNnX3g0X3N0YXJ0OgorCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisKKwlzaHIJcjgsNAorCW1vdglyMTAscjgKKwlzaGwJcjEwLDYyCisJc2hyCXIxMCw2MgorCisKKwl2bW92ZHFhCXhtbTE1LFhNTVdPUkRbcmR4XQorCXZwb3IJeG1tMTUseG1tMTUsWE1NV09SRFtPUl9NQVNLXQorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbZm91cl0KKwl2bW92ZHFhCXhtbTAseG1tMTUKKwl2cGFkZGQJeG1tMSx4bW0xNSxYTU1XT1JEW29uZV0KKwl2cGFkZGQJeG1tMix4bW0xNSxYTU1XT1JEW3R3b10KKwl2cGFkZGQJeG1tMyx4bW0xNSxYTU1XT1JEW3RocmVlXQorCisJc2hyCXI4LDIKKwlqZQlORUFSICRMJDEyOF9lbmNfbXNnX3g0X2NoZWNrX3JlbWFpbmRlcgorCisJc3ViCXJzaSw2NAorCXN1YglyZGksNjQKKworJEwkMTI4X2VuY19tc2dfeDRfbG9vcDE6CisJYWRkCXJzaSw2NAorCWFkZAlyZGksNjQKKworCXZtb3ZkcWEJeG1tNSx4bW0wCisJdm1vdmRxYQl4bW02LHhtbTEKKwl2bW92ZHFhCXhtbTcseG1tMgorCXZtb3ZkcWEJeG1tOCx4bW0zCisKKwl2cHhvcgl4bW01LHhtbTUsWE1NV09SRFtyY3hdCisJdnB4b3IJeG1tNix4bW02LFhNTVdPUkRbcmN4XQorCXZweG9yCXhtbTcseG1tNyxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW04LHhtbTgsWE1NV09SRFtyY3hdCisKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbMTYrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LHhtbTEyCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEyCisKKwl2cGFkZGQJeG1tMCx4bW0wLHhtbTQKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbMzIrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LHhtbTEyCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEyCisKKwl2cGFkZGQJeG1tMSx4bW0xLHhtbTQKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbNDgrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LHhtbTEyCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEyCisKKwl2cGFkZGQJeG1tMix4bW0yLHhtbTQKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbNjQrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LHhtbTEyCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEyCisKKwl2cGFkZGQJeG1tMyx4bW0zLHhtbTQKKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFs4MCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFs5NityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFsxMTIrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LHhtbTEyCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEyCisKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbMTI4K3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEyCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xMgorCisJdm1vdmRxdQl4bW0xMixYTU1XT1JEWzE0NCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFsxNjArcmN4XQorCXZhZXNlbmNsYXN0CXhtbTUseG1tNSx4bW0xMgorCXZhZXNlbmNsYXN0CXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmNsYXN0CXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmNsYXN0CXhtbTgseG1tOCx4bW0xMgorCisKKworCXZweG9yCXhtbTUseG1tNSxYTU1XT1JEW3JkaV0KKwl2cHhvcgl4bW02LHhtbTYsWE1NV09SRFsxNityZGldCisJdnB4b3IJeG1tNyx4bW03LFhNTVdPUkRbMzIrcmRpXQorCXZweG9yCXhtbTgseG1tOCxYTU1XT1JEWzQ4K3JkaV0KKworCXN1YglyOCwxCisKKwl2bW92ZHF1CVhNTVdPUkRbcnNpXSx4bW01CisJdm1vdmRxdQlYTU1XT1JEWzE2K3JzaV0seG1tNgorCXZtb3ZkcXUJWE1NV09SRFszMityc2ldLHhtbTcKKwl2bW92ZHF1CVhNTVdPUkRbNDgrcnNpXSx4bW04CisKKwlqbmUJTkVBUiAkTCQxMjhfZW5jX21zZ194NF9sb29wMQorCisJYWRkCXJzaSw2NAorCWFkZAlyZGksNjQKKworJEwkMTI4X2VuY19tc2dfeDRfY2hlY2tfcmVtYWluZGVyOgorCWNtcAlyMTAsMAorCWplCU5FQVIgJEwkMTI4X2VuY19tc2dfeDRfb3V0CisKKyRMJDEyOF9lbmNfbXNnX3g0X2xvb3AyOgorCisKKwl2bW92ZHFhCXhtbTUseG1tMAorCXZwYWRkZAl4bW0wLHhtbTAsWE1NV09SRFtvbmVdCisKKwl2cHhvcgl4bW01LHhtbTUsWE1NV09SRFtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFsxNityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFszMityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs0OCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs2NCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs4MCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs5NityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFsxMTIrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LFhNTVdPUkRbMTI4K3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSxYTU1XT1JEWzE0NCtyY3hdCisJdmFlc2VuY2xhc3QJeG1tNSx4bW01LFhNTVdPUkRbMTYwK3JjeF0KKworCisJdnB4b3IJeG1tNSx4bW01LFhNTVdPUkRbcmRpXQorCXZtb3ZkcXUJWE1NV09SRFtyc2ldLHhtbTUKKworCWFkZAlyZGksMTYKKwlhZGQJcnNpLDE2CisKKwlzdWIJcjEwLDEKKwlqbmUJTkVBUiAkTCQxMjhfZW5jX21zZ194NF9sb29wMgorCiskTCQxMjhfZW5jX21zZ194NF9vdXQ6CisJcG9wCXIxMworCisJcG9wCXIxMgorCisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDQ6CitnbG9iYWwJYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDgKKworQUxJR04JMTYKK2FlczEyOGdjbXNpdl9lbmNfbXNnX3g4OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzMTI4Z2Ntc2l2X2VuY19tc2dfeDg6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKworCisKKwl0ZXN0CXI4LHI4CisJam56CU5FQVIgJEwkMTI4X2VuY19tc2dfeDhfc3RhcnQKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkMTI4X2VuY19tc2dfeDhfc3RhcnQ6CisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXJicAorCisJbW92CXJicCxyc3AKKworCisKKwlzdWIJcnNwLDEyOAorCWFuZAlyc3AsLTY0CisKKwlzaHIJcjgsNAorCW1vdglyMTAscjgKKwlzaGwJcjEwLDYxCisJc2hyCXIxMCw2MQorCisKKwl2bW92ZHF1CXhtbTEsWE1NV09SRFtyZHhdCisJdnBvcgl4bW0xLHhtbTEsWE1NV09SRFtPUl9NQVNLXQorCisKKwl2cGFkZGQJeG1tMCx4bW0xLFhNTVdPUkRbc2V2ZW5dCisJdm1vdmRxdQlYTU1XT1JEW3JzcF0seG1tMAorCXZwYWRkZAl4bW05LHhtbTEsWE1NV09SRFtvbmVdCisJdnBhZGRkCXhtbTEwLHhtbTEsWE1NV09SRFt0d29dCisJdnBhZGRkCXhtbTExLHhtbTEsWE1NV09SRFt0aHJlZV0KKwl2cGFkZGQJeG1tMTIseG1tMSxYTU1XT1JEW2ZvdXJdCisJdnBhZGRkCXhtbTEzLHhtbTEsWE1NV09SRFtmaXZlXQorCXZwYWRkZAl4bW0xNCx4bW0xLFhNTVdPUkRbc2l4XQorCXZtb3ZkcWEJeG1tMCx4bW0xCisKKwlzaHIJcjgsMworCWplCU5FQVIgJEwkMTI4X2VuY19tc2dfeDhfY2hlY2tfcmVtYWluZGVyCisKKwlzdWIJcnNpLDEyOAorCXN1YglyZGksMTI4CisKKyRMJDEyOF9lbmNfbXNnX3g4X2xvb3AxOgorCWFkZAlyc2ksMTI4CisJYWRkCXJkaSwxMjgKKworCXZtb3ZkcWEJeG1tMSx4bW0wCisJdm1vdmRxYQl4bW0yLHhtbTkKKwl2bW92ZHFhCXhtbTMseG1tMTAKKwl2bW92ZHFhCXhtbTQseG1tMTEKKwl2bW92ZHFhCXhtbTUseG1tMTIKKwl2bW92ZHFhCXhtbTYseG1tMTMKKwl2bW92ZHFhCXhtbTcseG1tMTQKKworCXZtb3ZkcXUJeG1tOCxYTU1XT1JEW3JzcF0KKworCXZweG9yCXhtbTEseG1tMSxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW0yLHhtbTIsWE1NV09SRFtyY3hdCisJdnB4b3IJeG1tMyx4bW0zLFhNTVdPUkRbcmN4XQorCXZweG9yCXhtbTQseG1tNCxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW01LHhtbTUsWE1NV09SRFtyY3hdCisJdnB4b3IJeG1tNix4bW02LFhNTVdPUkRbcmN4XQorCXZweG9yCXhtbTcseG1tNyxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW04LHhtbTgsWE1NV09SRFtyY3hdCisKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbMTYrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZtb3ZkcXUJeG1tMTQsWE1NV09SRFtyc3BdCisJdnBhZGRkCXhtbTE0LHhtbTE0LFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxdQlYTU1XT1JEW3JzcF0seG1tMTQKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbMzIrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwc3ViZAl4bW0xNCx4bW0xNCxYTU1XT1JEW29uZV0KKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbNDgrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwYWRkZAl4bW0wLHhtbTAsWE1NV09SRFtlaWdodF0KKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbNjQrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwYWRkZAl4bW05LHhtbTksWE1NV09SRFtlaWdodF0KKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbODArcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwYWRkZAl4bW0xMCx4bW0xMCxYTU1XT1JEW2VpZ2h0XQorCXZtb3ZkcXUJeG1tMTUsWE1NV09SRFs5NityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdnBhZGRkCXhtbTExLHhtbTExLFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzExMityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdnBhZGRkCXhtbTEyLHhtbTEyLFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzEyOCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdnBhZGRkCXhtbTEzLHhtbTEzLFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzE0NCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzE2MCtyY3hdCisJdmFlc2VuY2xhc3QJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNSx4bW01LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tOCx4bW04LHhtbTE1CisKKworCisJdnB4b3IJeG1tMSx4bW0xLFhNTVdPUkRbcmRpXQorCXZweG9yCXhtbTIseG1tMixYTU1XT1JEWzE2K3JkaV0KKwl2cHhvcgl4bW0zLHhtbTMsWE1NV09SRFszMityZGldCisJdnB4b3IJeG1tNCx4bW00LFhNTVdPUkRbNDgrcmRpXQorCXZweG9yCXhtbTUseG1tNSxYTU1XT1JEWzY0K3JkaV0KKwl2cHhvcgl4bW02LHhtbTYsWE1NV09SRFs4MCtyZGldCisJdnB4b3IJeG1tNyx4bW03LFhNTVdPUkRbOTYrcmRpXQorCXZweG9yCXhtbTgseG1tOCxYTU1XT1JEWzExMityZGldCisKKwlkZWMJcjgKKworCXZtb3ZkcXUJWE1NV09SRFtyc2ldLHhtbTEKKwl2bW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW0yCisJdm1vdmRxdQlYTU1XT1JEWzMyK3JzaV0seG1tMworCXZtb3ZkcXUJWE1NV09SRFs0OCtyc2ldLHhtbTQKKwl2bW92ZHF1CVhNTVdPUkRbNjQrcnNpXSx4bW01CisJdm1vdmRxdQlYTU1XT1JEWzgwK3JzaV0seG1tNgorCXZtb3ZkcXUJWE1NV09SRFs5Nityc2ldLHhtbTcKKwl2bW92ZHF1CVhNTVdPUkRbMTEyK3JzaV0seG1tOAorCisJam5lCU5FQVIgJEwkMTI4X2VuY19tc2dfeDhfbG9vcDEKKworCWFkZAlyc2ksMTI4CisJYWRkCXJkaSwxMjgKKworJEwkMTI4X2VuY19tc2dfeDhfY2hlY2tfcmVtYWluZGVyOgorCWNtcAlyMTAsMAorCWplCU5FQVIgJEwkMTI4X2VuY19tc2dfeDhfb3V0CisKKyRMJDEyOF9lbmNfbXNnX3g4X2xvb3AyOgorCisKKwl2bW92ZHFhCXhtbTEseG1tMAorCXZwYWRkZAl4bW0wLHhtbTAsWE1NV09SRFtvbmVdCisKKwl2cHhvcgl4bW0xLHhtbTEsWE1NV09SRFtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFsxNityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFszMityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFs0OCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFs2NCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFs4MCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFs5NityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFsxMTIrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTI4K3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzE0NCtyY3hdCisJdmFlc2VuY2xhc3QJeG1tMSx4bW0xLFhNTVdPUkRbMTYwK3JjeF0KKworCisJdnB4b3IJeG1tMSx4bW0xLFhNTVdPUkRbcmRpXQorCisJdm1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMQorCisJYWRkCXJkaSwxNgorCWFkZAlyc2ksMTYKKworCWRlYwlyMTAKKwlqbmUJTkVBUiAkTCQxMjhfZW5jX21zZ194OF9sb29wMgorCiskTCQxMjhfZW5jX21zZ194OF9vdXQ6CisJbW92CXJzcCxyYnAKKworCXBvcAlyYnAKKworCXBvcAlyMTMKKworCXBvcAlyMTIKKworCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2FlczEyOGdjbXNpdl9lbmNfbXNnX3g4OgorZ2xvYmFsCWFlczEyOGdjbXNpdl9kZWMKKworQUxJR04JMTYKK2FlczEyOGdjbXNpdl9kZWM6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXMxMjhnY21zaXZfZGVjOgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisKKwl0ZXN0CXI5LH4xNQorCWpueglORUFSICRMJDEyOF9kZWNfc3RhcnQKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkMTI4X2RlY19zdGFydDoKKwl2emVyb3VwcGVyCisJdm1vdmRxYQl4bW0wLFhNTVdPUkRbcmR4XQorCW1vdglyYXgscmR4CisKKwlsZWEJcmF4LFszMityYXhdCisJbGVhCXJjeCxbMzIrcmN4XQorCisKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbcjkqMStyZGldCisJdnBvcgl4bW0xNSx4bW0xNSxYTU1XT1JEW09SX01BU0tdCisJYW5kCXI5LH4xNQorCisKKwljbXAJcjksOTYKKwlqYglORUFSICRMJDEyOF9kZWNfbG9vcDIKKworCisJc3ViCXI5LDk2CisJdm1vdmRxYQl4bW03LHhtbTE1CisJdnBhZGRkCXhtbTgseG1tNyxYTU1XT1JEW29uZV0KKwl2cGFkZGQJeG1tOSx4bW03LFhNTVdPUkRbdHdvXQorCXZwYWRkZAl4bW0xMCx4bW05LFhNTVdPUkRbb25lXQorCXZwYWRkZAl4bW0xMSx4bW05LFhNTVdPUkRbdHdvXQorCXZwYWRkZAl4bW0xMix4bW0xMSxYTU1XT1JEW29uZV0KKwl2cGFkZGQJeG1tMTUseG1tMTEsWE1NV09SRFt0d29dCisKKwl2cHhvcgl4bW03LHhtbTcsWE1NV09SRFtyOF0KKwl2cHhvcgl4bW04LHhtbTgsWE1NV09SRFtyOF0KKwl2cHhvcgl4bW05LHhtbTksWE1NV09SRFtyOF0KKwl2cHhvcgl4bW0xMCx4bW0xMCxYTU1XT1JEW3I4XQorCXZweG9yCXhtbTExLHhtbTExLFhNTVdPUkRbcjhdCisJdnB4b3IJeG1tMTIseG1tMTIsWE1NV09SRFtyOF0KKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzE2K3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbMzIrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFs0OCtyOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzY0K3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbODArcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFs5NityOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzExMityOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzEyOCtyOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzE0NCtyOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzE2MCtyOF0KKwl2YWVzZW5jbGFzdAl4bW03LHhtbTcseG1tNAorCXZhZXNlbmNsYXN0CXhtbTgseG1tOCx4bW00CisJdmFlc2VuY2xhc3QJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jbGFzdAl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuY2xhc3QJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmNsYXN0CXhtbTEyLHhtbTEyLHhtbTQKKworCisJdnB4b3IJeG1tNyx4bW03LFhNTVdPUkRbcmRpXQorCXZweG9yCXhtbTgseG1tOCxYTU1XT1JEWzE2K3JkaV0KKwl2cHhvcgl4bW05LHhtbTksWE1NV09SRFszMityZGldCisJdnB4b3IJeG1tMTAseG1tMTAsWE1NV09SRFs0OCtyZGldCisJdnB4b3IJeG1tMTEseG1tMTEsWE1NV09SRFs2NCtyZGldCisJdnB4b3IJeG1tMTIseG1tMTIsWE1NV09SRFs4MCtyZGldCisKKwl2bW92ZHF1CVhNTVdPUkRbcnNpXSx4bW03CisJdm1vdmRxdQlYTU1XT1JEWzE2K3JzaV0seG1tOAorCXZtb3ZkcXUJWE1NV09SRFszMityc2ldLHhtbTkKKwl2bW92ZHF1CVhNTVdPUkRbNDgrcnNpXSx4bW0xMAorCXZtb3ZkcXUJWE1NV09SRFs2NCtyc2ldLHhtbTExCisJdm1vdmRxdQlYTU1XT1JEWzgwK3JzaV0seG1tMTIKKworCWFkZAlyZGksOTYKKwlhZGQJcnNpLDk2CisJam1wCU5FQVIgJEwkMTI4X2RlY19sb29wMQorCisKK0FMSUdOCTY0CiskTCQxMjhfZGVjX2xvb3AxOgorCWNtcAlyOSw5NgorCWpiCU5FQVIgJEwkMTI4X2RlY19maW5pc2hfOTYKKwlzdWIJcjksOTYKKworCXZtb3ZkcWEJeG1tNix4bW0xMgorCXZtb3ZkcWEJWE1NV09SRFsoMTYtMzIpK3JheF0seG1tMTEKKwl2bW92ZHFhCVhNTVdPUkRbKDMyLTMyKStyYXhdLHhtbTEwCisJdm1vdmRxYQlYTU1XT1JEWyg0OC0zMikrcmF4XSx4bW05CisJdm1vdmRxYQlYTU1XT1JEWyg2NC0zMikrcmF4XSx4bW04CisJdm1vdmRxYQlYTU1XT1JEWyg4MC0zMikrcmF4XSx4bW03CisKKwl2bW92ZHFhCXhtbTcseG1tMTUKKwl2cGFkZGQJeG1tOCx4bW03LFhNTVdPUkRbb25lXQorCXZwYWRkZAl4bW05LHhtbTcsWE1NV09SRFt0d29dCisJdnBhZGRkCXhtbTEwLHhtbTksWE1NV09SRFtvbmVdCisJdnBhZGRkCXhtbTExLHhtbTksWE1NV09SRFt0d29dCisJdnBhZGRkCXhtbTEyLHhtbTExLFhNTVdPUkRbb25lXQorCXZwYWRkZAl4bW0xNSx4bW0xMSxYTU1XT1JEW3R3b10KKworCXZtb3ZkcWEJeG1tNCxYTU1XT1JEW3I4XQorCXZweG9yCXhtbTcseG1tNyx4bW00CisJdnB4b3IJeG1tOCx4bW04LHhtbTQKKwl2cHhvcgl4bW05LHhtbTkseG1tNAorCXZweG9yCXhtbTEwLHhtbTEwLHhtbTQKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW00CisJdnB4b3IJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbKCgwLTMyKSkrcmN4XQorCXZwY2xtdWxxZHEJeG1tMix4bW02LHhtbTQsMHgxMQorCXZwY2xtdWxxZHEJeG1tMyx4bW02LHhtbTQsMHgwMAorCXZwY2xtdWxxZHEJeG1tMSx4bW02LHhtbTQsMHgwMQorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTQsMHgxMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNityOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoLTE2KSkrcmF4XQorCXZtb3ZkcXUJeG1tMTMsWE1NV09SRFsoKC0xNikpK3JjeF0KKworCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFszMityOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEW3JheF0KKwl2bW92ZHF1CXhtbTEzLFhNTVdPUkRbcmN4XQorCisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMQorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMQorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzQ4K3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbMTYrcmF4XQorCXZtb3ZkcXUJeG1tMTMsWE1NV09SRFsxNityY3hdCisKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDEwCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDExCisJdnB4b3IJeG1tMix4bW0yLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAwCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAxCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKworCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbNjQrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFszMityYXhdCisJdm1vdmRxdQl4bW0xMyxYTU1XT1JEWzMyK3JjeF0KKworCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFs4MCtyOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzk2K3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbMTEyK3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisKKwl2bW92ZHFhCXhtbTYsWE1NV09SRFsoKDgwLTMyKSkrcmF4XQorCXZweG9yCXhtbTYseG1tNix4bW0wCisJdm1vdmRxdQl4bW01LFhNTVdPUkRbKCg4MC0zMikpK3JjeF0KKworCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTUsMHgwMQorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tNSwweDExCisJdnB4b3IJeG1tMix4bW0yLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW01LDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTUsMHgxMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxMjgrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKworCXZwc3JsZHEJeG1tNCx4bW0xLDgKKwl2cHhvcgl4bW01LHhtbTIseG1tNAorCXZwc2xsZHEJeG1tNCx4bW0xLDgKKwl2cHhvcgl4bW0wLHhtbTMseG1tNAorCisJdm1vdmRxYQl4bW0zLFhNTVdPUkRbcG9seV0KKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzE0NCtyOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEWzE2MCtyOF0KKwl2cGFsaWducgl4bW0yLHhtbTAseG1tMCw4CisJdnBjbG11bHFkcQl4bW0wLHhtbTAseG1tMywweDEwCisJdnB4b3IJeG1tMCx4bW0yLHhtbTAKKworCXZweG9yCXhtbTQseG1tNixYTU1XT1JEW3JkaV0KKwl2YWVzZW5jbGFzdAl4bW03LHhtbTcseG1tNAorCXZweG9yCXhtbTQseG1tNixYTU1XT1JEWzE2K3JkaV0KKwl2YWVzZW5jbGFzdAl4bW04LHhtbTgseG1tNAorCXZweG9yCXhtbTQseG1tNixYTU1XT1JEWzMyK3JkaV0KKwl2YWVzZW5jbGFzdAl4bW05LHhtbTkseG1tNAorCXZweG9yCXhtbTQseG1tNixYTU1XT1JEWzQ4K3JkaV0KKwl2YWVzZW5jbGFzdAl4bW0xMCx4bW0xMCx4bW00CisJdnB4b3IJeG1tNCx4bW02LFhNTVdPUkRbNjQrcmRpXQorCXZhZXNlbmNsYXN0CXhtbTExLHhtbTExLHhtbTQKKwl2cHhvcgl4bW00LHhtbTYsWE1NV09SRFs4MCtyZGldCisJdmFlc2VuY2xhc3QJeG1tMTIseG1tMTIseG1tNAorCisJdnBhbGlnbnIJeG1tMix4bW0wLHhtbTAsOAorCXZwY2xtdWxxZHEJeG1tMCx4bW0wLHhtbTMsMHgxMAorCXZweG9yCXhtbTAseG1tMix4bW0wCisKKwl2bW92ZHF1CVhNTVdPUkRbcnNpXSx4bW03CisJdm1vdmRxdQlYTU1XT1JEWzE2K3JzaV0seG1tOAorCXZtb3ZkcXUJWE1NV09SRFszMityc2ldLHhtbTkKKwl2bW92ZHF1CVhNTVdPUkRbNDgrcnNpXSx4bW0xMAorCXZtb3ZkcXUJWE1NV09SRFs2NCtyc2ldLHhtbTExCisJdm1vdmRxdQlYTU1XT1JEWzgwK3JzaV0seG1tMTIKKworCXZweG9yCXhtbTAseG1tMCx4bW01CisKKwlsZWEJcmRpLFs5NityZGldCisJbGVhCXJzaSxbOTYrcnNpXQorCWptcAlORUFSICRMJDEyOF9kZWNfbG9vcDEKKworJEwkMTI4X2RlY19maW5pc2hfOTY6CisJdm1vdmRxYQl4bW02LHhtbTEyCisJdm1vdmRxYQlYTU1XT1JEWygxNi0zMikrcmF4XSx4bW0xMQorCXZtb3ZkcWEJWE1NV09SRFsoMzItMzIpK3JheF0seG1tMTAKKwl2bW92ZHFhCVhNTVdPUkRbKDQ4LTMyKStyYXhdLHhtbTkKKwl2bW92ZHFhCVhNTVdPUkRbKDY0LTMyKStyYXhdLHhtbTgKKwl2bW92ZHFhCVhNTVdPUkRbKDgwLTMyKStyYXhdLHhtbTcKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWygoMC0zMikpK3JjeF0KKwl2cGNsbXVscWRxCXhtbTEseG1tNix4bW00LDB4MTAKKwl2cGNsbXVscWRxCXhtbTIseG1tNix4bW00LDB4MTEKKwl2cGNsbXVscWRxCXhtbTMseG1tNix4bW00LDB4MDAKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW00LDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgtMTYpKStyYXhdCisJdm1vdmRxdQl4bW0xMyxYTU1XT1JEWygoLTE2KSkrcmN4XQorCisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMQorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMQorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFtyYXhdCisJdm1vdmRxdQl4bW0xMyxYTU1XT1JEW3JjeF0KKworCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbMTYrcmF4XQorCXZtb3ZkcXUJeG1tMTMsWE1NV09SRFsxNityY3hdCisKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDEwCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDExCisJdnB4b3IJeG1tMix4bW0yLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAwCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAxCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEWzMyK3JheF0KKwl2bW92ZHF1CXhtbTEzLFhNTVdPUkRbMzIrcmN4XQorCisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMQorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMQorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoODAtMzIpKStyYXhdCisJdnB4b3IJeG1tNix4bW02LHhtbTAKKwl2bW92ZHF1CXhtbTUsWE1NV09SRFsoKDgwLTMyKSkrcmN4XQorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTUsMHgxMQorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tNSwweDAwCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW01LDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTUsMHgwMQorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKwl2cHNybGRxCXhtbTQseG1tMSw4CisJdnB4b3IJeG1tNSx4bW0yLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tMSw4CisJdnB4b3IJeG1tMCx4bW0zLHhtbTQKKworCXZtb3ZkcWEJeG1tMyxYTU1XT1JEW3BvbHldCisKKwl2cGFsaWducgl4bW0yLHhtbTAseG1tMCw4CisJdnBjbG11bHFkcQl4bW0wLHhtbTAseG1tMywweDEwCisJdnB4b3IJeG1tMCx4bW0yLHhtbTAKKworCXZwYWxpZ25yCXhtbTIseG1tMCx4bW0wLDgKKwl2cGNsbXVscWRxCXhtbTAseG1tMCx4bW0zLDB4MTAKKwl2cHhvcgl4bW0wLHhtbTIseG1tMAorCisJdnB4b3IJeG1tMCx4bW0wLHhtbTUKKworJEwkMTI4X2RlY19sb29wMjoKKworCisKKwljbXAJcjksMTYKKwlqYglORUFSICRMJDEyOF9kZWNfb3V0CisJc3ViCXI5LDE2CisKKwl2bW92ZHFhCXhtbTIseG1tMTUKKwl2cGFkZGQJeG1tMTUseG1tMTUsWE1NV09SRFtvbmVdCisKKwl2cHhvcgl4bW0yLHhtbTIsWE1NV09SRFtyOF0KKwl2YWVzZW5jCXhtbTIseG1tMixYTU1XT1JEWzE2K3I4XQorCXZhZXNlbmMJeG1tMix4bW0yLFhNTVdPUkRbMzIrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFs0OCtyOF0KKwl2YWVzZW5jCXhtbTIseG1tMixYTU1XT1JEWzY0K3I4XQorCXZhZXNlbmMJeG1tMix4bW0yLFhNTVdPUkRbODArcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFs5NityOF0KKwl2YWVzZW5jCXhtbTIseG1tMixYTU1XT1JEWzExMityOF0KKwl2YWVzZW5jCXhtbTIseG1tMixYTU1XT1JEWzEyOCtyOF0KKwl2YWVzZW5jCXhtbTIseG1tMixYTU1XT1JEWzE0NCtyOF0KKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIsWE1NV09SRFsxNjArcjhdCisJdnB4b3IJeG1tMix4bW0yLFhNTVdPUkRbcmRpXQorCXZtb3ZkcXUJWE1NV09SRFtyc2ldLHhtbTIKKwlhZGQJcmRpLDE2CisJYWRkCXJzaSwxNgorCisJdnB4b3IJeG1tMCx4bW0wLHhtbTIKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFsoKC0zMikpK3JjeF0KKwljYWxsCUdGTVVMCisKKwlqbXAJTkVBUiAkTCQxMjhfZGVjX2xvb3AyCisKKyRMJDEyOF9kZWNfb3V0OgorCXZtb3ZkcXUJWE1NV09SRFtyZHhdLHhtbTAKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXMxMjhnY21zaXZfZGVjOgorZ2xvYmFsCWFlczEyOGdjbXNpdl9lY2JfZW5jX2Jsb2NrCisKK0FMSUdOCTE2CithZXMxMjhnY21zaXZfZWNiX2VuY19ibG9jazoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2FlczEyOGdjbXNpdl9lY2JfZW5jX2Jsb2NrOgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbcmRpXQorCisJdnB4b3IJeG1tMSx4bW0xLFhNTVdPUkRbcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTYrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMzIrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbNDgrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbNjQrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbODArcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbOTYrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTEyK3JkeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzEyOCtyZHhdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFsxNDQrcmR4XQorCXZhZXNlbmNsYXN0CXhtbTEseG1tMSxYTU1XT1JEWzE2MCtyZHhdCisKKwl2bW92ZHFhCVhNTVdPUkRbcnNpXSx4bW0xCisKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXMxMjhnY21zaXZfZWNiX2VuY19ibG9jazoKK2dsb2JhbAlhZXMyNTZnY21zaXZfYWVzX2tzX2VuY194MQorCitBTElHTgkxNgorYWVzMjU2Z2Ntc2l2X2Flc19rc19lbmNfeDE6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXMyNTZnY21zaXZfYWVzX2tzX2VuY194MToKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKworCisKKwl2bW92ZHFhCXhtbTAsWE1NV09SRFtjb24xXQorCXZtb3ZkcWEJeG1tMTUsWE1NV09SRFttYXNrXQorCXZtb3ZkcWEJeG1tOCxYTU1XT1JEW3JkaV0KKwl2bW92ZHFhCXhtbTEsWE1NV09SRFtyY3hdCisJdm1vdmRxYQl4bW0zLFhNTVdPUkRbMTYrcmN4XQorCXZweG9yCXhtbTgseG1tOCx4bW0xCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMworCXZtb3ZkcXUJWE1NV09SRFtyZHhdLHhtbTEKKwl2bW92ZHF1CVhNTVdPUkRbMTYrcmR4XSx4bW0zCisJdnB4b3IJeG1tMTQseG1tMTQseG1tMTQKKworCXZwc2h1ZmIJeG1tMix4bW0zLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLHhtbTAKKwl2cHNsbGQJeG1tMCx4bW0wLDEKKwl2cHNsbGRxCXhtbTQseG1tMSw0CisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cHhvcgl4bW0xLHhtbTEseG1tMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEKKwl2bW92ZHF1CVhNTVdPUkRbMzIrcmR4XSx4bW0xCisKKwl2cHNodWZkCXhtbTIseG1tMSwweGZmCisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLHhtbTE0CisJdnBzbGxkcQl4bW00LHhtbTMsNAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnB4b3IJeG1tMyx4bW0zLHhtbTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0zCisJdm1vdmRxdQlYTU1XT1JEWzQ4K3JkeF0seG1tMworCisJdnBzaHVmYgl4bW0yLHhtbTMseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xsZHEJeG1tNCx4bW0xLDQKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZweG9yCXhtbTEseG1tMSx4bW0yCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMQorCXZtb3ZkcXUJWE1NV09SRFs2NCtyZHhdLHhtbTEKKworCXZwc2h1ZmQJeG1tMix4bW0xLDB4ZmYKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMTQKKwl2cHNsbGRxCXhtbTQseG1tMyw0CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHhvcgl4bW0zLHhtbTMseG1tMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTMKKwl2bW92ZHF1CVhNTVdPUkRbODArcmR4XSx4bW0zCisKKwl2cHNodWZiCXhtbTIseG1tMyx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxkCXhtbTAseG1tMCwxCisJdnBzbGxkcQl4bW00LHhtbTEsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xCisJdm1vdmRxdQlYTU1XT1JEWzk2K3JkeF0seG1tMQorCisJdnBzaHVmZAl4bW0yLHhtbTEsMHhmZgorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0xNAorCXZwc2xsZHEJeG1tNCx4bW0zLDQKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZweG9yCXhtbTMseG1tMyx4bW0yCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMworCXZtb3ZkcXUJWE1NV09SRFsxMTIrcmR4XSx4bW0zCisKKwl2cHNodWZiCXhtbTIseG1tMyx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxkCXhtbTAseG1tMCwxCisJdnBzbGxkcQl4bW00LHhtbTEsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xCisJdm1vdmRxdQlYTU1XT1JEWzEyOCtyZHhdLHhtbTEKKworCXZwc2h1ZmQJeG1tMix4bW0xLDB4ZmYKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMTQKKwl2cHNsbGRxCXhtbTQseG1tMyw0CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cHhvcgl4bW0zLHhtbTMseG1tMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTMKKwl2bW92ZHF1CVhNTVdPUkRbMTQ0K3JkeF0seG1tMworCisJdnBzaHVmYgl4bW0yLHhtbTMseG1tMTUKKwl2YWVzZW5jbGFzdAl4bW0yLHhtbTIseG1tMAorCXZwc2xsZAl4bW0wLHhtbTAsMQorCXZwc2xsZHEJeG1tNCx4bW0xLDQKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZweG9yCXhtbTEseG1tMSx4bW0yCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMQorCXZtb3ZkcXUJWE1NV09SRFsxNjArcmR4XSx4bW0xCisKKwl2cHNodWZkCXhtbTIseG1tMSwweGZmCisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLHhtbTE0CisJdnBzbGxkcQl4bW00LHhtbTMsNAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnB4b3IJeG1tMyx4bW0zLHhtbTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0zCisJdm1vdmRxdQlYTU1XT1JEWzE3NityZHhdLHhtbTMKKworCXZwc2h1ZmIJeG1tMix4bW0zLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLHhtbTAKKwl2cHNsbGQJeG1tMCx4bW0wLDEKKwl2cHNsbGRxCXhtbTQseG1tMSw0CisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tNCw0CisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cHhvcgl4bW0xLHhtbTEseG1tMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEKKwl2bW92ZHF1CVhNTVdPUkRbMTkyK3JkeF0seG1tMQorCisJdnBzaHVmZAl4bW0yLHhtbTEsMHhmZgorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0xNAorCXZwc2xsZHEJeG1tNCx4bW0zLDQKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwc2xsZHEJeG1tNCx4bW00LDQKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZweG9yCXhtbTMseG1tMyx4bW0yCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMworCXZtb3ZkcXUJWE1NV09SRFsyMDgrcmR4XSx4bW0zCisKKwl2cHNodWZiCXhtbTIseG1tMyx4bW0xNQorCXZhZXNlbmNsYXN0CXhtbTIseG1tMix4bW0wCisJdnBzbGxkcQl4bW00LHhtbTEsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzbGxkcQl4bW00LHhtbTQsNAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwl2YWVzZW5jbGFzdAl4bW04LHhtbTgseG1tMQorCXZtb3ZkcXUJWE1NV09SRFsyMjQrcmR4XSx4bW0xCisKKwl2bW92ZHFhCVhNTVdPUkRbcnNpXSx4bW04CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzMjU2Z2Ntc2l2X2Flc19rc19lbmNfeDE6CitnbG9iYWwJYWVzMjU2Z2Ntc2l2X2VjYl9lbmNfYmxvY2sKKworQUxJR04JMTYKK2FlczI1NmdjbXNpdl9lY2JfZW5jX2Jsb2NrOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzMjU2Z2Ntc2l2X2VjYl9lbmNfYmxvY2s6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFtyZGldCisJdnB4b3IJeG1tMSx4bW0xLFhNTVdPUkRbcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTYrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMzIrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbNDgrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbNjQrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbODArcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbOTYrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTEyK3JkeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzEyOCtyZHhdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFsxNDQrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTYwK3JkeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzE3NityZHhdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFsxOTIrcmR4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMjA4K3JkeF0KKwl2YWVzZW5jbGFzdAl4bW0xLHhtbTEsWE1NV09SRFsyMjQrcmR4XQorCXZtb3ZkcWEJWE1NV09SRFtyc2ldLHhtbTEKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXMyNTZnY21zaXZfZWNiX2VuY19ibG9jazoKK2dsb2JhbAlhZXMyNTZnY21zaXZfZW5jX21zZ194NAorCitBTElHTgkxNgorYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXMyNTZnY21zaXZfZW5jX21zZ194NDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCisKKworCXRlc3QJcjgscjgKKwlqbnoJTkVBUiAkTCQyNTZfZW5jX21zZ194NF9zdGFydAorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCQyNTZfZW5jX21zZ194NF9zdGFydDoKKwltb3YJcjEwLHI4CisJc2hyCXI4LDQKKwlzaGwJcjEwLDYwCisJanoJTkVBUiAkTCQyNTZfZW5jX21zZ194NF9zdGFydDIKKwlhZGQJcjgsMQorCiskTCQyNTZfZW5jX21zZ194NF9zdGFydDI6CisJbW92CXIxMCxyOAorCXNobAlyMTAsNjIKKwlzaHIJcjEwLDYyCisKKworCXZtb3ZkcWEJeG1tMTUsWE1NV09SRFtyZHhdCisJdnBvcgl4bW0xNSx4bW0xNSxYTU1XT1JEW09SX01BU0tdCisKKwl2bW92ZHFhCXhtbTQsWE1NV09SRFtmb3VyXQorCXZtb3ZkcWEJeG1tMCx4bW0xNQorCXZwYWRkZAl4bW0xLHhtbTE1LFhNTVdPUkRbb25lXQorCXZwYWRkZAl4bW0yLHhtbTE1LFhNTVdPUkRbdHdvXQorCXZwYWRkZAl4bW0zLHhtbTE1LFhNTVdPUkRbdGhyZWVdCisKKwlzaHIJcjgsMgorCWplCU5FQVIgJEwkMjU2X2VuY19tc2dfeDRfY2hlY2tfcmVtYWluZGVyCisKKwlzdWIJcnNpLDY0CisJc3ViCXJkaSw2NAorCiskTCQyNTZfZW5jX21zZ194NF9sb29wMToKKwlhZGQJcnNpLDY0CisJYWRkCXJkaSw2NAorCisJdm1vdmRxYQl4bW01LHhtbTAKKwl2bW92ZHFhCXhtbTYseG1tMQorCXZtb3ZkcWEJeG1tNyx4bW0yCisJdm1vdmRxYQl4bW04LHhtbTMKKworCXZweG9yCXhtbTUseG1tNSxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW02LHhtbTYsWE1NV09SRFtyY3hdCisJdnB4b3IJeG1tNyx4bW03LFhNTVdPUkRbcmN4XQorCXZweG9yCXhtbTgseG1tOCxYTU1XT1JEW3JjeF0KKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFsxNityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZwYWRkZAl4bW0wLHhtbTAseG1tNAorCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFszMityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZwYWRkZAl4bW0xLHhtbTEseG1tNAorCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFs0OCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZwYWRkZAl4bW0yLHhtbTIseG1tNAorCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFs2NCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZwYWRkZAl4bW0zLHhtbTMseG1tNAorCisJdm1vdmRxdQl4bW0xMixYTU1XT1JEWzgwK3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEyCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xMgorCisJdm1vdmRxdQl4bW0xMixYTU1XT1JEWzk2K3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEyCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xMgorCisJdm1vdmRxdQl4bW0xMixYTU1XT1JEWzExMityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFsxMjgrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LHhtbTEyCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEyCisKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbMTQ0K3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEyCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xMgorCisJdm1vdmRxdQl4bW0xMixYTU1XT1JEWzE2MCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFsxNzYrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LHhtbTEyCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTEyCisKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbMTkyK3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEyCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTIKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xMgorCisJdm1vdmRxdQl4bW0xMixYTU1XT1JEWzIwOCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEyCisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTIKKworCXZtb3ZkcXUJeG1tMTIsWE1NV09SRFsyMjQrcmN4XQorCXZhZXNlbmNsYXN0CXhtbTUseG1tNSx4bW0xMgorCXZhZXNlbmNsYXN0CXhtbTYseG1tNix4bW0xMgorCXZhZXNlbmNsYXN0CXhtbTcseG1tNyx4bW0xMgorCXZhZXNlbmNsYXN0CXhtbTgseG1tOCx4bW0xMgorCisKKworCXZweG9yCXhtbTUseG1tNSxYTU1XT1JEW3JkaV0KKwl2cHhvcgl4bW02LHhtbTYsWE1NV09SRFsxNityZGldCisJdnB4b3IJeG1tNyx4bW03LFhNTVdPUkRbMzIrcmRpXQorCXZweG9yCXhtbTgseG1tOCxYTU1XT1JEWzQ4K3JkaV0KKworCXN1YglyOCwxCisKKwl2bW92ZHF1CVhNTVdPUkRbcnNpXSx4bW01CisJdm1vdmRxdQlYTU1XT1JEWzE2K3JzaV0seG1tNgorCXZtb3ZkcXUJWE1NV09SRFszMityc2ldLHhtbTcKKwl2bW92ZHF1CVhNTVdPUkRbNDgrcnNpXSx4bW04CisKKwlqbmUJTkVBUiAkTCQyNTZfZW5jX21zZ194NF9sb29wMQorCisJYWRkCXJzaSw2NAorCWFkZAlyZGksNjQKKworJEwkMjU2X2VuY19tc2dfeDRfY2hlY2tfcmVtYWluZGVyOgorCWNtcAlyMTAsMAorCWplCU5FQVIgJEwkMjU2X2VuY19tc2dfeDRfb3V0CisKKyRMJDI1Nl9lbmNfbXNnX3g0X2xvb3AyOgorCisKKworCXZtb3ZkcWEJeG1tNSx4bW0wCisJdnBhZGRkCXhtbTAseG1tMCxYTU1XT1JEW29uZV0KKwl2cHhvcgl4bW01LHhtbTUsWE1NV09SRFtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFsxNityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFszMityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs0OCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs2NCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs4MCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFs5NityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFsxMTIrcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LFhNTVdPUkRbMTI4K3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSxYTU1XT1JEWzE0NCtyY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFsxNjArcmN4XQorCXZhZXNlbmMJeG1tNSx4bW01LFhNTVdPUkRbMTc2K3JjeF0KKwl2YWVzZW5jCXhtbTUseG1tNSxYTU1XT1JEWzE5MityY3hdCisJdmFlc2VuYwl4bW01LHhtbTUsWE1NV09SRFsyMDgrcmN4XQorCXZhZXNlbmNsYXN0CXhtbTUseG1tNSxYTU1XT1JEWzIyNCtyY3hdCisKKworCXZweG9yCXhtbTUseG1tNSxYTU1XT1JEW3JkaV0KKworCXZtb3ZkcXUJWE1NV09SRFtyc2ldLHhtbTUKKworCWFkZAlyZGksMTYKKwlhZGQJcnNpLDE2CisKKwlzdWIJcjEwLDEKKwlqbmUJTkVBUiAkTCQyNTZfZW5jX21zZ194NF9sb29wMgorCiskTCQyNTZfZW5jX21zZ194NF9vdXQ6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDQ6CitnbG9iYWwJYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDgKKworQUxJR04JMTYKK2FlczI1NmdjbXNpdl9lbmNfbXNnX3g4OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzMjU2Z2Ntc2l2X2VuY19tc2dfeDg6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKworCisKKwl0ZXN0CXI4LHI4CisJam56CU5FQVIgJEwkMjU2X2VuY19tc2dfeDhfc3RhcnQKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkMjU2X2VuY19tc2dfeDhfc3RhcnQ6CisKKwltb3YJcjExLHJzcAorCXN1YglyMTEsMTYKKwlhbmQJcjExLC02NAorCisJbW92CXIxMCxyOAorCXNocglyOCw0CisJc2hsCXIxMCw2MAorCWp6CU5FQVIgJEwkMjU2X2VuY19tc2dfeDhfc3RhcnQyCisJYWRkCXI4LDEKKworJEwkMjU2X2VuY19tc2dfeDhfc3RhcnQyOgorCW1vdglyMTAscjgKKwlzaGwJcjEwLDYxCisJc2hyCXIxMCw2MQorCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFtyZHhdCisJdnBvcgl4bW0xLHhtbTEsWE1NV09SRFtPUl9NQVNLXQorCisKKwl2cGFkZGQJeG1tMCx4bW0xLFhNTVdPUkRbc2V2ZW5dCisJdm1vdmRxYQlYTU1XT1JEW3IxMV0seG1tMAorCXZwYWRkZAl4bW05LHhtbTEsWE1NV09SRFtvbmVdCisJdnBhZGRkCXhtbTEwLHhtbTEsWE1NV09SRFt0d29dCisJdnBhZGRkCXhtbTExLHhtbTEsWE1NV09SRFt0aHJlZV0KKwl2cGFkZGQJeG1tMTIseG1tMSxYTU1XT1JEW2ZvdXJdCisJdnBhZGRkCXhtbTEzLHhtbTEsWE1NV09SRFtmaXZlXQorCXZwYWRkZAl4bW0xNCx4bW0xLFhNTVdPUkRbc2l4XQorCXZtb3ZkcWEJeG1tMCx4bW0xCisKKwlzaHIJcjgsMworCWp6CU5FQVIgJEwkMjU2X2VuY19tc2dfeDhfY2hlY2tfcmVtYWluZGVyCisKKwlzdWIJcnNpLDEyOAorCXN1YglyZGksMTI4CisKKyRMJDI1Nl9lbmNfbXNnX3g4X2xvb3AxOgorCWFkZAlyc2ksMTI4CisJYWRkCXJkaSwxMjgKKworCXZtb3ZkcWEJeG1tMSx4bW0wCisJdm1vdmRxYQl4bW0yLHhtbTkKKwl2bW92ZHFhCXhtbTMseG1tMTAKKwl2bW92ZHFhCXhtbTQseG1tMTEKKwl2bW92ZHFhCXhtbTUseG1tMTIKKwl2bW92ZHFhCXhtbTYseG1tMTMKKwl2bW92ZHFhCXhtbTcseG1tMTQKKworCXZtb3ZkcWEJeG1tOCxYTU1XT1JEW3IxMV0KKworCXZweG9yCXhtbTEseG1tMSxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW0yLHhtbTIsWE1NV09SRFtyY3hdCisJdnB4b3IJeG1tMyx4bW0zLFhNTVdPUkRbcmN4XQorCXZweG9yCXhtbTQseG1tNCxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW01LHhtbTUsWE1NV09SRFtyY3hdCisJdnB4b3IJeG1tNix4bW02LFhNTVdPUkRbcmN4XQorCXZweG9yCXhtbTcseG1tNyxYTU1XT1JEW3JjeF0KKwl2cHhvcgl4bW04LHhtbTgsWE1NV09SRFtyY3hdCisKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbMTYrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZtb3ZkcWEJeG1tMTQsWE1NV09SRFtyMTFdCisJdnBhZGRkCXhtbTE0LHhtbTE0LFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxYQlYTU1XT1JEW3IxMV0seG1tMTQKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbMzIrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwc3ViZAl4bW0xNCx4bW0xNCxYTU1XT1JEW29uZV0KKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbNDgrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwYWRkZAl4bW0wLHhtbTAsWE1NV09SRFtlaWdodF0KKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbNjQrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwYWRkZAl4bW05LHhtbTksWE1NV09SRFtlaWdodF0KKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbODArcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuYwl4bW0yLHhtbTIseG1tMTUKKwl2YWVzZW5jCXhtbTMseG1tMyx4bW0xNQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuYwl4bW01LHhtbTUseG1tMTUKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xNQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuYwl4bW04LHhtbTgseG1tMTUKKworCXZwYWRkZAl4bW0xMCx4bW0xMCxYTU1XT1JEW2VpZ2h0XQorCXZtb3ZkcXUJeG1tMTUsWE1NV09SRFs5NityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdnBhZGRkCXhtbTExLHhtbTExLFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzExMityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdnBhZGRkCXhtbTEyLHhtbTEyLFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzEyOCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdnBhZGRkCXhtbTEzLHhtbTEzLFhNTVdPUkRbZWlnaHRdCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzE0NCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzE2MCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzE3NityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzE5MityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzIwOCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEseG1tMTUKKwl2YWVzZW5jCXhtbTIseG1tMix4bW0xNQorCXZhZXNlbmMJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuYwl4bW00LHhtbTQseG1tMTUKKwl2YWVzZW5jCXhtbTUseG1tNSx4bW0xNQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuYwl4bW03LHhtbTcseG1tMTUKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW0xNQorCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzIyNCtyY3hdCisJdmFlc2VuY2xhc3QJeG1tMSx4bW0xLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tMyx4bW0zLHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNCx4bW00LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNSx4bW01LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNix4bW02LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tNyx4bW03LHhtbTE1CisJdmFlc2VuY2xhc3QJeG1tOCx4bW04LHhtbTE1CisKKworCisJdnB4b3IJeG1tMSx4bW0xLFhNTVdPUkRbcmRpXQorCXZweG9yCXhtbTIseG1tMixYTU1XT1JEWzE2K3JkaV0KKwl2cHhvcgl4bW0zLHhtbTMsWE1NV09SRFszMityZGldCisJdnB4b3IJeG1tNCx4bW00LFhNTVdPUkRbNDgrcmRpXQorCXZweG9yCXhtbTUseG1tNSxYTU1XT1JEWzY0K3JkaV0KKwl2cHhvcgl4bW02LHhtbTYsWE1NV09SRFs4MCtyZGldCisJdnB4b3IJeG1tNyx4bW03LFhNTVdPUkRbOTYrcmRpXQorCXZweG9yCXhtbTgseG1tOCxYTU1XT1JEWzExMityZGldCisKKwlzdWIJcjgsMQorCisJdm1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMQorCXZtb3ZkcXUJWE1NV09SRFsxNityc2ldLHhtbTIKKwl2bW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW0zCisJdm1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tNAorCXZtb3ZkcXUJWE1NV09SRFs2NCtyc2ldLHhtbTUKKwl2bW92ZHF1CVhNTVdPUkRbODArcnNpXSx4bW02CisJdm1vdmRxdQlYTU1XT1JEWzk2K3JzaV0seG1tNworCXZtb3ZkcXUJWE1NV09SRFsxMTIrcnNpXSx4bW04CisKKwlqbmUJTkVBUiAkTCQyNTZfZW5jX21zZ194OF9sb29wMQorCisJYWRkCXJzaSwxMjgKKwlhZGQJcmRpLDEyOAorCiskTCQyNTZfZW5jX21zZ194OF9jaGVja19yZW1haW5kZXI6CisJY21wCXIxMCwwCisJamUJTkVBUiAkTCQyNTZfZW5jX21zZ194OF9vdXQKKworJEwkMjU2X2VuY19tc2dfeDhfbG9vcDI6CisKKworCXZtb3ZkcWEJeG1tMSx4bW0wCisJdnBhZGRkCXhtbTAseG1tMCxYTU1XT1JEW29uZV0KKworCXZweG9yCXhtbTEseG1tMSxYTU1XT1JEW3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzE2K3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzMyK3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzQ4K3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzY0K3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzgwK3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzk2K3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzExMityY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFsxMjgrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTQ0K3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzE2MCtyY3hdCisJdmFlc2VuYwl4bW0xLHhtbTEsWE1NV09SRFsxNzYrcmN4XQorCXZhZXNlbmMJeG1tMSx4bW0xLFhNTVdPUkRbMTkyK3JjeF0KKwl2YWVzZW5jCXhtbTEseG1tMSxYTU1XT1JEWzIwOCtyY3hdCisJdmFlc2VuY2xhc3QJeG1tMSx4bW0xLFhNTVdPUkRbMjI0K3JjeF0KKworCisJdnB4b3IJeG1tMSx4bW0xLFhNTVdPUkRbcmRpXQorCisJdm1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMQorCisJYWRkCXJkaSwxNgorCWFkZAlyc2ksMTYKKwlzdWIJcjEwLDEKKwlqbnoJTkVBUiAkTCQyNTZfZW5jX21zZ194OF9sb29wMgorCiskTCQyNTZfZW5jX21zZ194OF9vdXQ6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworJEwkU0VIX2VuZF9hZXMyNTZnY21zaXZfZW5jX21zZ194ODoKK2dsb2JhbAlhZXMyNTZnY21zaXZfZGVjCisKK0FMSUdOCTE2CithZXMyNTZnY21zaXZfZGVjOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzMjU2Z2Ntc2l2X2RlYzoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCW1vdglyOSxRV09SRFs0OCtyc3BdCisKKworCisJdGVzdAlyOSx+MTUKKwlqbnoJTkVBUiAkTCQyNTZfZGVjX3N0YXJ0CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJDI1Nl9kZWNfc3RhcnQ6CisJdnplcm91cHBlcgorCXZtb3ZkcWEJeG1tMCxYTU1XT1JEW3JkeF0KKwltb3YJcmF4LHJkeAorCisJbGVhCXJheCxbMzIrcmF4XQorCWxlYQlyY3gsWzMyK3JjeF0KKworCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEW3I5KjErcmRpXQorCXZwb3IJeG1tMTUseG1tMTUsWE1NV09SRFtPUl9NQVNLXQorCWFuZAlyOSx+MTUKKworCisJY21wCXI5LDk2CisJamIJTkVBUiAkTCQyNTZfZGVjX2xvb3AyCisKKworCXN1YglyOSw5NgorCXZtb3ZkcWEJeG1tNyx4bW0xNQorCXZwYWRkZAl4bW04LHhtbTcsWE1NV09SRFtvbmVdCisJdnBhZGRkCXhtbTkseG1tNyxYTU1XT1JEW3R3b10KKwl2cGFkZGQJeG1tMTAseG1tOSxYTU1XT1JEW29uZV0KKwl2cGFkZGQJeG1tMTEseG1tOSxYTU1XT1JEW3R3b10KKwl2cGFkZGQJeG1tMTIseG1tMTEsWE1NV09SRFtvbmVdCisJdnBhZGRkCXhtbTE1LHhtbTExLFhNTVdPUkRbdHdvXQorCisJdnB4b3IJeG1tNyx4bW03LFhNTVdPUkRbcjhdCisJdnB4b3IJeG1tOCx4bW04LFhNTVdPUkRbcjhdCisJdnB4b3IJeG1tOSx4bW05LFhNTVdPUkRbcjhdCisJdnB4b3IJeG1tMTAseG1tMTAsWE1NV09SRFtyOF0KKwl2cHhvcgl4bW0xMSx4bW0xMSxYTU1XT1JEW3I4XQorCXZweG9yCXhtbTEyLHhtbTEyLFhNTVdPUkRbcjhdCisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNityOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzMyK3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbNDgrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFs2NCtyOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzgwK3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbOTYrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxMTIrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxMjgrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNDQrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNjArcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNzYrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxOTIrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsyMDgrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsyMjQrcjhdCisJdmFlc2VuY2xhc3QJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jbGFzdAl4bW04LHhtbTgseG1tNAorCXZhZXNlbmNsYXN0CXhtbTkseG1tOSx4bW00CisJdmFlc2VuY2xhc3QJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmNsYXN0CXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jbGFzdAl4bW0xMix4bW0xMix4bW00CisKKworCXZweG9yCXhtbTcseG1tNyxYTU1XT1JEW3JkaV0KKwl2cHhvcgl4bW04LHhtbTgsWE1NV09SRFsxNityZGldCisJdnB4b3IJeG1tOSx4bW05LFhNTVdPUkRbMzIrcmRpXQorCXZweG9yCXhtbTEwLHhtbTEwLFhNTVdPUkRbNDgrcmRpXQorCXZweG9yCXhtbTExLHhtbTExLFhNTVdPUkRbNjQrcmRpXQorCXZweG9yCXhtbTEyLHhtbTEyLFhNTVdPUkRbODArcmRpXQorCisJdm1vdmRxdQlYTU1XT1JEW3JzaV0seG1tNworCXZtb3ZkcXUJWE1NV09SRFsxNityc2ldLHhtbTgKKwl2bW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW05CisJdm1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tMTAKKwl2bW92ZHF1CVhNTVdPUkRbNjQrcnNpXSx4bW0xMQorCXZtb3ZkcXUJWE1NV09SRFs4MCtyc2ldLHhtbTEyCisKKwlhZGQJcmRpLDk2CisJYWRkCXJzaSw5NgorCWptcAlORUFSICRMJDI1Nl9kZWNfbG9vcDEKKworCitBTElHTgk2NAorJEwkMjU2X2RlY19sb29wMToKKwljbXAJcjksOTYKKwlqYglORUFSICRMJDI1Nl9kZWNfZmluaXNoXzk2CisJc3ViCXI5LDk2CisKKwl2bW92ZHFhCXhtbTYseG1tMTIKKwl2bW92ZHFhCVhNTVdPUkRbKDE2LTMyKStyYXhdLHhtbTExCisJdm1vdmRxYQlYTU1XT1JEWygzMi0zMikrcmF4XSx4bW0xMAorCXZtb3ZkcWEJWE1NV09SRFsoNDgtMzIpK3JheF0seG1tOQorCXZtb3ZkcWEJWE1NV09SRFsoNjQtMzIpK3JheF0seG1tOAorCXZtb3ZkcWEJWE1NV09SRFsoODAtMzIpK3JheF0seG1tNworCisJdm1vdmRxYQl4bW03LHhtbTE1CisJdnBhZGRkCXhtbTgseG1tNyxYTU1XT1JEW29uZV0KKwl2cGFkZGQJeG1tOSx4bW03LFhNTVdPUkRbdHdvXQorCXZwYWRkZAl4bW0xMCx4bW05LFhNTVdPUkRbb25lXQorCXZwYWRkZAl4bW0xMSx4bW05LFhNTVdPUkRbdHdvXQorCXZwYWRkZAl4bW0xMix4bW0xMSxYTU1XT1JEW29uZV0KKwl2cGFkZGQJeG1tMTUseG1tMTEsWE1NV09SRFt0d29dCisKKwl2bW92ZHFhCXhtbTQsWE1NV09SRFtyOF0KKwl2cHhvcgl4bW03LHhtbTcseG1tNAorCXZweG9yCXhtbTgseG1tOCx4bW00CisJdnB4b3IJeG1tOSx4bW05LHhtbTQKKwl2cHhvcgl4bW0xMCx4bW0xMCx4bW00CisJdnB4b3IJeG1tMTEseG1tMTEseG1tNAorCXZweG9yCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWygoMC0zMikpK3JjeF0KKwl2cGNsbXVscWRxCXhtbTIseG1tNix4bW00LDB4MTEKKwl2cGNsbXVscWRxCXhtbTMseG1tNix4bW00LDB4MDAKKwl2cGNsbXVscWRxCXhtbTEseG1tNix4bW00LDB4MDEKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW00LDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbMTYrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKC0xNikpK3JheF0KKwl2bW92ZHF1CXhtbTEzLFhNTVdPUkRbKCgtMTYpKStyY3hdCisKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDEwCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDExCisJdnB4b3IJeG1tMix4bW0yLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAwCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAxCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKworCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbMzIrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFtyYXhdCisJdm1vdmRxdQl4bW0xMyxYTU1XT1JEW3JjeF0KKworCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFs0OCtyOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEWzE2K3JheF0KKwl2bW92ZHF1CXhtbTEzLFhNTVdPUkRbMTYrcmN4XQorCisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMQorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMQorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzY0K3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbMzIrcmF4XQorCXZtb3ZkcXUJeG1tMTMsWE1NV09SRFszMityY3hdCisKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDEwCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDExCisJdnB4b3IJeG1tMix4bW0yLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAwCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAxCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKworCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbODArcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFs5NityOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzExMityOF0KKwl2YWVzZW5jCXhtbTcseG1tNyx4bW00CisJdmFlc2VuYwl4bW04LHhtbTgseG1tNAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTQKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTQKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTQKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTQKKworCisJdm1vdmRxYQl4bW02LFhNTVdPUkRbKCg4MC0zMikpK3JheF0KKwl2cHhvcgl4bW02LHhtbTYseG1tMAorCXZtb3ZkcXUJeG1tNSxYTU1XT1JEWygoODAtMzIpKStyY3hdCisKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW01LDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTUsMHgxMQorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tNSwweDAwCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW01LDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbMTI4K3I4XQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTQKKwl2YWVzZW5jCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW05LHhtbTkseG1tNAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tNAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tNAorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tNAorCisKKwl2cHNybGRxCXhtbTQseG1tMSw4CisJdnB4b3IJeG1tNSx4bW0yLHhtbTQKKwl2cHNsbGRxCXhtbTQseG1tMSw4CisJdnB4b3IJeG1tMCx4bW0zLHhtbTQKKworCXZtb3ZkcWEJeG1tMyxYTU1XT1JEW3BvbHldCisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNDQrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNjArcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxNzYrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsxOTIrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsyMDgrcjhdCisJdmFlc2VuYwl4bW03LHhtbTcseG1tNAorCXZhZXNlbmMJeG1tOCx4bW04LHhtbTQKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW00CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW00CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW00CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW00CisKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsyMjQrcjhdCisJdnBhbGlnbnIJeG1tMix4bW0wLHhtbTAsOAorCXZwY2xtdWxxZHEJeG1tMCx4bW0wLHhtbTMsMHgxMAorCXZweG9yCXhtbTAseG1tMix4bW0wCisKKwl2cHhvcgl4bW00LHhtbTYsWE1NV09SRFtyZGldCisJdmFlc2VuY2xhc3QJeG1tNyx4bW03LHhtbTQKKwl2cHhvcgl4bW00LHhtbTYsWE1NV09SRFsxNityZGldCisJdmFlc2VuY2xhc3QJeG1tOCx4bW04LHhtbTQKKwl2cHhvcgl4bW00LHhtbTYsWE1NV09SRFszMityZGldCisJdmFlc2VuY2xhc3QJeG1tOSx4bW05LHhtbTQKKwl2cHhvcgl4bW00LHhtbTYsWE1NV09SRFs0OCtyZGldCisJdmFlc2VuY2xhc3QJeG1tMTAseG1tMTAseG1tNAorCXZweG9yCXhtbTQseG1tNixYTU1XT1JEWzY0K3JkaV0KKwl2YWVzZW5jbGFzdAl4bW0xMSx4bW0xMSx4bW00CisJdnB4b3IJeG1tNCx4bW02LFhNTVdPUkRbODArcmRpXQorCXZhZXNlbmNsYXN0CXhtbTEyLHhtbTEyLHhtbTQKKworCXZwYWxpZ25yCXhtbTIseG1tMCx4bW0wLDgKKwl2cGNsbXVscWRxCXhtbTAseG1tMCx4bW0zLDB4MTAKKwl2cHhvcgl4bW0wLHhtbTIseG1tMAorCisJdm1vdmRxdQlYTU1XT1JEW3JzaV0seG1tNworCXZtb3ZkcXUJWE1NV09SRFsxNityc2ldLHhtbTgKKwl2bW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW05CisJdm1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tMTAKKwl2bW92ZHF1CVhNTVdPUkRbNjQrcnNpXSx4bW0xMQorCXZtb3ZkcXUJWE1NV09SRFs4MCtyc2ldLHhtbTEyCisKKwl2cHhvcgl4bW0wLHhtbTAseG1tNQorCisJbGVhCXJkaSxbOTYrcmRpXQorCWxlYQlyc2ksWzk2K3JzaV0KKwlqbXAJTkVBUiAkTCQyNTZfZGVjX2xvb3AxCisKKyRMJDI1Nl9kZWNfZmluaXNoXzk2OgorCXZtb3ZkcWEJeG1tNix4bW0xMgorCXZtb3ZkcWEJWE1NV09SRFsoMTYtMzIpK3JheF0seG1tMTEKKwl2bW92ZHFhCVhNTVdPUkRbKDMyLTMyKStyYXhdLHhtbTEwCisJdm1vdmRxYQlYTU1XT1JEWyg0OC0zMikrcmF4XSx4bW05CisJdm1vdmRxYQlYTU1XT1JEWyg2NC0zMikrcmF4XSx4bW04CisJdm1vdmRxYQlYTU1XT1JEWyg4MC0zMikrcmF4XSx4bW03CisKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFsoKDAtMzIpKStyY3hdCisJdnBjbG11bHFkcQl4bW0xLHhtbTYseG1tNCwweDEwCisJdnBjbG11bHFkcQl4bW0yLHhtbTYseG1tNCwweDExCisJdnBjbG11bHFkcQl4bW0zLHhtbTYseG1tNCwweDAwCisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tNCwweDAxCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoLTE2KSkrcmF4XQorCXZtb3ZkcXUJeG1tMTMsWE1NV09SRFsoKC0xNikpK3JjeF0KKworCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbcmF4XQorCXZtb3ZkcXUJeG1tMTMsWE1NV09SRFtyY3hdCisKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDEwCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDExCisJdnB4b3IJeG1tMix4bW0yLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAwCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0xMywweDAxCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKworCXZtb3ZkcXUJeG1tNixYTU1XT1JEWzE2K3JheF0KKwl2bW92ZHF1CXhtbTEzLFhNTVdPUkRbMTYrcmN4XQorCisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgxMQorCXZweG9yCXhtbTIseG1tMix4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tMTMsMHgwMQorCXZweG9yCXhtbTEseG1tMSx4bW00CisKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFszMityYXhdCisJdm1vdmRxdQl4bW0xMyxYTU1XT1JEWzMyK3JjeF0KKworCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDAKKwl2cHhvcgl4bW0zLHhtbTMseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTEzLDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKDgwLTMyKSkrcmF4XQorCXZweG9yCXhtbTYseG1tNix4bW0wCisJdm1vdmRxdQl4bW01LFhNTVdPUkRbKCg4MC0zMikpK3JjeF0KKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW01LDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tNAorCXZwY2xtdWxxZHEJeG1tNCx4bW02LHhtbTUsMHgwMAorCXZweG9yCXhtbTMseG1tMyx4bW00CisJdnBjbG11bHFkcQl4bW00LHhtbTYseG1tNSwweDEwCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW01LDB4MDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCisJdnBzcmxkcQl4bW00LHhtbTEsOAorCXZweG9yCXhtbTUseG1tMix4bW00CisJdnBzbGxkcQl4bW00LHhtbTEsOAorCXZweG9yCXhtbTAseG1tMyx4bW00CisKKwl2bW92ZHFhCXhtbTMsWE1NV09SRFtwb2x5XQorCisJdnBhbGlnbnIJeG1tMix4bW0wLHhtbTAsOAorCXZwY2xtdWxxZHEJeG1tMCx4bW0wLHhtbTMsMHgxMAorCXZweG9yCXhtbTAseG1tMix4bW0wCisKKwl2cGFsaWducgl4bW0yLHhtbTAseG1tMCw4CisJdnBjbG11bHFkcQl4bW0wLHhtbTAseG1tMywweDEwCisJdnB4b3IJeG1tMCx4bW0yLHhtbTAKKworCXZweG9yCXhtbTAseG1tMCx4bW01CisKKyRMJDI1Nl9kZWNfbG9vcDI6CisKKworCisJY21wCXI5LDE2CisJamIJTkVBUiAkTCQyNTZfZGVjX291dAorCXN1YglyOSwxNgorCisJdm1vdmRxYQl4bW0yLHhtbTE1CisJdnBhZGRkCXhtbTE1LHhtbTE1LFhNTVdPUkRbb25lXQorCisJdnB4b3IJeG1tMix4bW0yLFhNTVdPUkRbcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsxNityOF0KKwl2YWVzZW5jCXhtbTIseG1tMixYTU1XT1JEWzMyK3I4XQorCXZhZXNlbmMJeG1tMix4bW0yLFhNTVdPUkRbNDgrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFs2NCtyOF0KKwl2YWVzZW5jCXhtbTIseG1tMixYTU1XT1JEWzgwK3I4XQorCXZhZXNlbmMJeG1tMix4bW0yLFhNTVdPUkRbOTYrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsxMTIrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsxMjgrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsxNDQrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsxNjArcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsxNzYrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsxOTIrcjhdCisJdmFlc2VuYwl4bW0yLHhtbTIsWE1NV09SRFsyMDgrcjhdCisJdmFlc2VuY2xhc3QJeG1tMix4bW0yLFhNTVdPUkRbMjI0K3I4XQorCXZweG9yCXhtbTIseG1tMixYTU1XT1JEW3JkaV0KKwl2bW92ZHF1CVhNTVdPUkRbcnNpXSx4bW0yCisJYWRkCXJkaSwxNgorCWFkZAlyc2ksMTYKKworCXZweG9yCXhtbTAseG1tMCx4bW0yCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbKCgtMzIpKStyY3hdCisJY2FsbAlHRk1VTAorCisJam1wCU5FQVIgJEwkMjU2X2RlY19sb29wMgorCiskTCQyNTZfZGVjX291dDoKKwl2bW92ZHF1CVhNTVdPUkRbcmR4XSx4bW0wCisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzMjU2Z2Ntc2l2X2RlYzoKK2dsb2JhbAlhZXMyNTZnY21zaXZfa2RmCisKK0FMSUdOCTE2CithZXMyNTZnY21zaXZfa2RmOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzMjU2Z2Ntc2l2X2tkZjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworCisKKworCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbcmR4XQorCXZtb3ZkcWEJeG1tNCxYTU1XT1JEW3JkaV0KKwl2bW92ZHFhCXhtbTExLFhNTVdPUkRbYW5kX21hc2tdCisJdm1vdmRxYQl4bW04LFhNTVdPUkRbb25lXQorCXZwc2h1ZmQJeG1tNCx4bW00LDB4OTAKKwl2cGFuZAl4bW00LHhtbTQseG1tMTEKKwl2cGFkZGQJeG1tNix4bW00LHhtbTgKKwl2cGFkZGQJeG1tNyx4bW02LHhtbTgKKwl2cGFkZGQJeG1tMTEseG1tNyx4bW04CisJdnBhZGRkCXhtbTEyLHhtbTExLHhtbTgKKwl2cGFkZGQJeG1tMTMseG1tMTIseG1tOAorCisJdnB4b3IJeG1tNCx4bW00LHhtbTEKKwl2cHhvcgl4bW02LHhtbTYseG1tMQorCXZweG9yCXhtbTcseG1tNyx4bW0xCisJdnB4b3IJeG1tMTEseG1tMTEseG1tMQorCXZweG9yCXhtbTEyLHhtbTEyLHhtbTEKKwl2cHhvcgl4bW0xMyx4bW0xMyx4bW0xCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFsxNityZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xCisKKwl2bW92ZHFhCXhtbTIsWE1NV09SRFszMityZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0yCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0yCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0yCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0yCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFs0OCtyZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xCisKKwl2bW92ZHFhCXhtbTIsWE1NV09SRFs2NCtyZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0yCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0yCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0yCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0yCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFs4MCtyZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xCisKKwl2bW92ZHFhCXhtbTIsWE1NV09SRFs5NityZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0yCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0yCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0yCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0yCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFsxMTIrcmR4XQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTEKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMQorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMQorCXZhZXNlbmMJeG1tMTMseG1tMTMseG1tMQorCisJdm1vdmRxYQl4bW0yLFhNTVdPUkRbMTI4K3JkeF0KKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0yCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMgorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTIKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTIKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTIKKwl2YWVzZW5jCXhtbTEzLHhtbTEzLHhtbTIKKworCXZtb3ZkcWEJeG1tMSxYTU1XT1JEWzE0NCtyZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMQorCXZhZXNlbmMJeG1tNix4bW02LHhtbTEKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0xCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xCisKKwl2bW92ZHFhCXhtbTIsWE1NV09SRFsxNjArcmR4XQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTIKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0yCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMgorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMgorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMgorCXZhZXNlbmMJeG1tMTMseG1tMTMseG1tMgorCisJdm1vdmRxYQl4bW0xLFhNTVdPUkRbMTc2K3JkeF0KKwl2YWVzZW5jCXhtbTQseG1tNCx4bW0xCisJdmFlc2VuYwl4bW02LHhtbTYseG1tMQorCXZhZXNlbmMJeG1tNyx4bW03LHhtbTEKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTEKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTEKKwl2YWVzZW5jCXhtbTEzLHhtbTEzLHhtbTEKKworCXZtb3ZkcWEJeG1tMixYTU1XT1JEWzE5MityZHhdCisJdmFlc2VuYwl4bW00LHhtbTQseG1tMgorCXZhZXNlbmMJeG1tNix4bW02LHhtbTIKKwl2YWVzZW5jCXhtbTcseG1tNyx4bW0yCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0yCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0yCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0yCisKKwl2bW92ZHFhCXhtbTEsWE1NV09SRFsyMDgrcmR4XQorCXZhZXNlbmMJeG1tNCx4bW00LHhtbTEKKwl2YWVzZW5jCXhtbTYseG1tNix4bW0xCisJdmFlc2VuYwl4bW03LHhtbTcseG1tMQorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMQorCXZhZXNlbmMJeG1tMTMseG1tMTMseG1tMQorCisJdm1vdmRxYQl4bW0yLFhNTVdPUkRbMjI0K3JkeF0KKwl2YWVzZW5jbGFzdAl4bW00LHhtbTQseG1tMgorCXZhZXNlbmNsYXN0CXhtbTYseG1tNix4bW0yCisJdmFlc2VuY2xhc3QJeG1tNyx4bW03LHhtbTIKKwl2YWVzZW5jbGFzdAl4bW0xMSx4bW0xMSx4bW0yCisJdmFlc2VuY2xhc3QJeG1tMTIseG1tMTIseG1tMgorCXZhZXNlbmNsYXN0CXhtbTEzLHhtbTEzLHhtbTIKKworCisJdm1vdmRxYQlYTU1XT1JEW3JzaV0seG1tNAorCXZtb3ZkcWEJWE1NV09SRFsxNityc2ldLHhtbTYKKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNpXSx4bW03CisJdm1vdmRxYQlYTU1XT1JEWzQ4K3JzaV0seG1tMTEKKwl2bW92ZHFhCVhNTVdPUkRbNjQrcnNpXSx4bW0xMgorCXZtb3ZkcWEJWE1NV09SRFs4MCtyc2ldLHhtbTEzCisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzMjU2Z2Ntc2l2X2tkZjoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vY2lwaGVyX2V4dHJhL2NoYWNoYTIwX3BvbHkxMzA1X3g4Nl82NC5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGNmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2NpcGhlcl9leHRyYS9jaGFjaGEyMF9wb2x5MTMwNV94ODZfNjQuYXNtCkBAIC0wLDAgKzEsOCBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK2dsb2JhbAlkdW1teV9jaGFjaGEyMF9wb2x5MTMwNV9hc20KKworZHVtbXlfY2hhY2hhMjBfcG9seTEzMDVfYXNtOgorCURCCTBGM2gsMEMzaAkJO3JlcHJldApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flcy14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flcy14ODZfNjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzNhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzLXg4Nl82NC5hc20KQEAgLTAsMCArMSwyOTQxIEBACitkZWZhdWx0CXJlbAorJWRlZmluZSBYTU1XT1JECislZGVmaW5lIFlNTVdPUkQKKyVkZWZpbmUgWk1NV09SRAorc2VjdGlvbgkudGV4dCBjb2RlIGFsaWduPTY0CisKKworQUxJR04JMTYKK194ODZfNjRfQUVTX2VuY3J5cHQ6CisJeG9yCWVheCxEV09SRFtyMTVdCisJeG9yCWVieCxEV09SRFs0K3IxNV0KKwl4b3IJZWN4LERXT1JEWzgrcjE1XQorCXhvcgllZHgsRFdPUkRbMTIrcjE1XQorCisJbW92CXIxM2QsRFdPUkRbMjQwK3IxNV0KKwlzdWIJcjEzZCwxCisJam1wCU5FQVIgJEwkZW5jX2xvb3AKK0FMSUdOCTE2CiskTCRlbmNfbG9vcDoKKworCW1vdnp4CWVzaSxhbAorCW1vdnp4CWVkaSxibAorCW1vdnp4CWVicCxjbAorCW1vdglyMTBkLERXT1JEW3JzaSo4K3IxNF0KKwltb3YJcjExZCxEV09SRFtyZGkqOCtyMTRdCisJbW92CXIxMmQsRFdPUkRbcmJwKjgrcjE0XQorCisJbW92engJZXNpLGJoCisJbW92engJZWRpLGNoCisJbW92engJZWJwLGRsCisJeG9yCXIxMGQsRFdPUkRbMytyc2kqOCtyMTRdCisJeG9yCXIxMWQsRFdPUkRbMytyZGkqOCtyMTRdCisJbW92CXI4ZCxEV09SRFtyYnAqOCtyMTRdCisKKwltb3Z6eAllc2ksZGgKKwlzaHIJZWN4LDE2CisJbW92engJZWJwLGFoCisJeG9yCXIxMmQsRFdPUkRbMytyc2kqOCtyMTRdCisJc2hyCWVkeCwxNgorCXhvcglyOGQsRFdPUkRbMytyYnAqOCtyMTRdCisKKwlzaHIJZWJ4LDE2CisJbGVhCXIxNSxbMTYrcjE1XQorCXNocgllYXgsMTYKKworCW1vdnp4CWVzaSxjbAorCW1vdnp4CWVkaSxkbAorCW1vdnp4CWVicCxhbAorCXhvcglyMTBkLERXT1JEWzIrcnNpKjgrcjE0XQorCXhvcglyMTFkLERXT1JEWzIrcmRpKjgrcjE0XQorCXhvcglyMTJkLERXT1JEWzIrcmJwKjgrcjE0XQorCisJbW92engJZXNpLGRoCisJbW92engJZWRpLGFoCisJbW92engJZWJwLGJsCisJeG9yCXIxMGQsRFdPUkRbMStyc2kqOCtyMTRdCisJeG9yCXIxMWQsRFdPUkRbMStyZGkqOCtyMTRdCisJeG9yCXI4ZCxEV09SRFsyK3JicCo4K3IxNF0KKworCW1vdgllZHgsRFdPUkRbMTIrcjE1XQorCW1vdnp4CWVkaSxiaAorCW1vdnp4CWVicCxjaAorCW1vdgllYXgsRFdPUkRbcjE1XQorCXhvcglyMTJkLERXT1JEWzErcmRpKjgrcjE0XQorCXhvcglyOGQsRFdPUkRbMStyYnAqOCtyMTRdCisKKwltb3YJZWJ4LERXT1JEWzQrcjE1XQorCW1vdgllY3gsRFdPUkRbOCtyMTVdCisJeG9yCWVheCxyMTBkCisJeG9yCWVieCxyMTFkCisJeG9yCWVjeCxyMTJkCisJeG9yCWVkeCxyOGQKKwlzdWIJcjEzZCwxCisJam56CU5FQVIgJEwkZW5jX2xvb3AKKwltb3Z6eAllc2ksYWwKKwltb3Z6eAllZGksYmwKKwltb3Z6eAllYnAsY2wKKwltb3Z6eAlyMTBkLEJZVEVbMityc2kqOCtyMTRdCisJbW92engJcjExZCxCWVRFWzIrcmRpKjgrcjE0XQorCW1vdnp4CXIxMmQsQllURVsyK3JicCo4K3IxNF0KKworCW1vdnp4CWVzaSxkbAorCW1vdnp4CWVkaSxiaAorCW1vdnp4CWVicCxjaAorCW1vdnp4CXI4ZCxCWVRFWzIrcnNpKjgrcjE0XQorCW1vdgllZGksRFdPUkRbcmRpKjgrcjE0XQorCW1vdgllYnAsRFdPUkRbcmJwKjgrcjE0XQorCisJYW5kCWVkaSwweDAwMDBmZjAwCisJYW5kCWVicCwweDAwMDBmZjAwCisKKwl4b3IJcjEwZCxlZGkKKwl4b3IJcjExZCxlYnAKKwlzaHIJZWN4LDE2CisKKwltb3Z6eAllc2ksZGgKKwltb3Z6eAllZGksYWgKKwlzaHIJZWR4LDE2CisJbW92CWVzaSxEV09SRFtyc2kqOCtyMTRdCisJbW92CWVkaSxEV09SRFtyZGkqOCtyMTRdCisKKwlhbmQJZXNpLDB4MDAwMGZmMDAKKwlhbmQJZWRpLDB4MDAwMGZmMDAKKwlzaHIJZWJ4LDE2CisJeG9yCXIxMmQsZXNpCisJeG9yCXI4ZCxlZGkKKwlzaHIJZWF4LDE2CisKKwltb3Z6eAllc2ksY2wKKwltb3Z6eAllZGksZGwKKwltb3Z6eAllYnAsYWwKKwltb3YJZXNpLERXT1JEW3JzaSo4K3IxNF0KKwltb3YJZWRpLERXT1JEW3JkaSo4K3IxNF0KKwltb3YJZWJwLERXT1JEW3JicCo4K3IxNF0KKworCWFuZAllc2ksMHgwMGZmMDAwMAorCWFuZAllZGksMHgwMGZmMDAwMAorCWFuZAllYnAsMHgwMGZmMDAwMAorCisJeG9yCXIxMGQsZXNpCisJeG9yCXIxMWQsZWRpCisJeG9yCXIxMmQsZWJwCisKKwltb3Z6eAllc2ksYmwKKwltb3Z6eAllZGksZGgKKwltb3Z6eAllYnAsYWgKKwltb3YJZXNpLERXT1JEW3JzaSo4K3IxNF0KKwltb3YJZWRpLERXT1JEWzIrcmRpKjgrcjE0XQorCW1vdgllYnAsRFdPUkRbMityYnAqOCtyMTRdCisKKwlhbmQJZXNpLDB4MDBmZjAwMDAKKwlhbmQJZWRpLDB4ZmYwMDAwMDAKKwlhbmQJZWJwLDB4ZmYwMDAwMDAKKworCXhvcglyOGQsZXNpCisJeG9yCXIxMGQsZWRpCisJeG9yCXIxMWQsZWJwCisKKwltb3Z6eAllc2ksYmgKKwltb3Z6eAllZGksY2gKKwltb3YJZWR4LERXT1JEWygoMTYrMTIpKStyMTVdCisJbW92CWVzaSxEV09SRFsyK3JzaSo4K3IxNF0KKwltb3YJZWRpLERXT1JEWzIrcmRpKjgrcjE0XQorCW1vdgllYXgsRFdPUkRbKCgxNiswKSkrcjE1XQorCisJYW5kCWVzaSwweGZmMDAwMDAwCisJYW5kCWVkaSwweGZmMDAwMDAwCisKKwl4b3IJcjEyZCxlc2kKKwl4b3IJcjhkLGVkaQorCisJbW92CWVieCxEV09SRFsoKDE2KzQpKStyMTVdCisJbW92CWVjeCxEV09SRFsoKDE2KzgpKStyMTVdCisJeG9yCWVheCxyMTBkCisJeG9yCWVieCxyMTFkCisJeG9yCWVjeCxyMTJkCisJeG9yCWVkeCxyOGQKK0RCCTB4ZjMsMHhjMworCisKK0FMSUdOCTE2CitfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJbGVhCXI4LFsxMjgrcjE0XQorCW1vdgllZGksRFdPUkRbKCgwLTEyOCkpK3I4XQorCW1vdgllYnAsRFdPUkRbKCgzMi0xMjgpKStyOF0KKwltb3YJcjEwZCxEV09SRFsoKDY0LTEyOCkpK3I4XQorCW1vdglyMTFkLERXT1JEWygoOTYtMTI4KSkrcjhdCisJbW92CWVkaSxEV09SRFsoKDEyOC0xMjgpKStyOF0KKwltb3YJZWJwLERXT1JEWygoMTYwLTEyOCkpK3I4XQorCW1vdglyMTBkLERXT1JEWygoMTkyLTEyOCkpK3I4XQorCW1vdglyMTFkLERXT1JEWygoMjI0LTEyOCkpK3I4XQorCWptcAlORUFSICRMJGVuY19sb29wX2NvbXBhY3QKK0FMSUdOCTE2CiskTCRlbmNfbG9vcF9jb21wYWN0OgorCXhvcgllYXgsRFdPUkRbcjE1XQorCXhvcgllYngsRFdPUkRbNCtyMTVdCisJeG9yCWVjeCxEV09SRFs4K3IxNV0KKwl4b3IJZWR4LERXT1JEWzEyK3IxNV0KKwlsZWEJcjE1LFsxNityMTVdCisJbW92engJcjEwZCxhbAorCW1vdnp4CXIxMWQsYmwKKwltb3Z6eAlyMTJkLGNsCisJbW92engJcjhkLGRsCisJbW92engJZXNpLGJoCisJbW92engJZWRpLGNoCisJc2hyCWVjeCwxNgorCW1vdnp4CWVicCxkaAorCW1vdnp4CXIxMGQsQllURVtyMTAqMStyMTRdCisJbW92engJcjExZCxCWVRFW3IxMSoxK3IxNF0KKwltb3Z6eAlyMTJkLEJZVEVbcjEyKjErcjE0XQorCW1vdnp4CXI4ZCxCWVRFW3I4KjErcjE0XQorCisJbW92engJcjlkLEJZVEVbcnNpKjErcjE0XQorCW1vdnp4CWVzaSxhaAorCW1vdnp4CXIxM2QsQllURVtyZGkqMStyMTRdCisJbW92engJZWRpLGNsCisJbW92engJZWJwLEJZVEVbcmJwKjErcjE0XQorCW1vdnp4CWVzaSxCWVRFW3JzaSoxK3IxNF0KKworCXNobAlyOWQsOAorCXNocgllZHgsMTYKKwlzaGwJcjEzZCw4CisJeG9yCXIxMGQscjlkCisJc2hyCWVheCwxNgorCW1vdnp4CXI5ZCxkbAorCXNocgllYngsMTYKKwl4b3IJcjExZCxyMTNkCisJc2hsCWVicCw4CisJbW92engJcjEzZCxhbAorCW1vdnp4CWVkaSxCWVRFW3JkaSoxK3IxNF0KKwl4b3IJcjEyZCxlYnAKKworCXNobAllc2ksOAorCW1vdnp4CWVicCxibAorCXNobAllZGksMTYKKwl4b3IJcjhkLGVzaQorCW1vdnp4CXI5ZCxCWVRFW3I5KjErcjE0XQorCW1vdnp4CWVzaSxkaAorCW1vdnp4CXIxM2QsQllURVtyMTMqMStyMTRdCisJeG9yCXIxMGQsZWRpCisKKwlzaHIJZWN4LDgKKwltb3Z6eAllZGksYWgKKwlzaGwJcjlkLDE2CisJc2hyCWVieCw4CisJc2hsCXIxM2QsMTYKKwl4b3IJcjExZCxyOWQKKwltb3Z6eAllYnAsQllURVtyYnAqMStyMTRdCisJbW92engJZXNpLEJZVEVbcnNpKjErcjE0XQorCW1vdnp4CWVkaSxCWVRFW3JkaSoxK3IxNF0KKwltb3Z6eAllZHgsQllURVtyY3gqMStyMTRdCisJbW92engJZWN4LEJZVEVbcmJ4KjErcjE0XQorCisJc2hsCWVicCwxNgorCXhvcglyMTJkLHIxM2QKKwlzaGwJZXNpLDI0CisJeG9yCXI4ZCxlYnAKKwlzaGwJZWRpLDI0CisJeG9yCXIxMGQsZXNpCisJc2hsCWVkeCwyNAorCXhvcglyMTFkLGVkaQorCXNobAllY3gsMjQKKwltb3YJZWF4LHIxMGQKKwltb3YJZWJ4LHIxMWQKKwl4b3IJZWN4LHIxMmQKKwl4b3IJZWR4LHI4ZAorCWNtcAlyMTUsUVdPUkRbMTYrcnNwXQorCWplCU5FQVIgJEwkZW5jX2NvbXBhY3RfZG9uZQorCW1vdglyMTBkLDB4ODA4MDgwODAKKwltb3YJcjExZCwweDgwODA4MDgwCisJYW5kCXIxMGQsZWF4CisJYW5kCXIxMWQsZWJ4CisJbW92CWVzaSxyMTBkCisJbW92CWVkaSxyMTFkCisJc2hyCXIxMGQsNworCWxlYQlyOGQsW3JheCoxK3JheF0KKwlzaHIJcjExZCw3CisJbGVhCXI5ZCxbcmJ4KjErcmJ4XQorCXN1Ygllc2kscjEwZAorCXN1YgllZGkscjExZAorCWFuZAlyOGQsMHhmZWZlZmVmZQorCWFuZAlyOWQsMHhmZWZlZmVmZQorCWFuZAllc2ksMHgxYjFiMWIxYgorCWFuZAllZGksMHgxYjFiMWIxYgorCW1vdglyMTBkLGVheAorCW1vdglyMTFkLGVieAorCXhvcglyOGQsZXNpCisJeG9yCXI5ZCxlZGkKKworCXhvcgllYXgscjhkCisJeG9yCWVieCxyOWQKKwltb3YJcjEyZCwweDgwODA4MDgwCisJcm9sCWVheCwyNAorCW1vdgllYnAsMHg4MDgwODA4MAorCXJvbAllYngsMjQKKwlhbmQJcjEyZCxlY3gKKwlhbmQJZWJwLGVkeAorCXhvcgllYXgscjhkCisJeG9yCWVieCxyOWQKKwltb3YJZXNpLHIxMmQKKwlyb3IJcjEwZCwxNgorCW1vdgllZGksZWJwCisJcm9yCXIxMWQsMTYKKwlsZWEJcjhkLFtyY3gqMStyY3hdCisJc2hyCXIxMmQsNworCXhvcgllYXgscjEwZAorCXNocgllYnAsNworCXhvcgllYngscjExZAorCXJvcglyMTBkLDgKKwlsZWEJcjlkLFtyZHgqMStyZHhdCisJcm9yCXIxMWQsOAorCXN1Ygllc2kscjEyZAorCXN1YgllZGksZWJwCisJeG9yCWVheCxyMTBkCisJeG9yCWVieCxyMTFkCisKKwlhbmQJcjhkLDB4ZmVmZWZlZmUKKwlhbmQJcjlkLDB4ZmVmZWZlZmUKKwlhbmQJZXNpLDB4MWIxYjFiMWIKKwlhbmQJZWRpLDB4MWIxYjFiMWIKKwltb3YJcjEyZCxlY3gKKwltb3YJZWJwLGVkeAorCXhvcglyOGQsZXNpCisJeG9yCXI5ZCxlZGkKKworCXJvcglyMTJkLDE2CisJeG9yCWVjeCxyOGQKKwlyb3IJZWJwLDE2CisJeG9yCWVkeCxyOWQKKwlyb2wJZWN4LDI0CisJbW92CWVzaSxEV09SRFtyMTRdCisJcm9sCWVkeCwyNAorCXhvcgllY3gscjhkCisJbW92CWVkaSxEV09SRFs2NCtyMTRdCisJeG9yCWVkeCxyOWQKKwltb3YJcjhkLERXT1JEWzEyOCtyMTRdCisJeG9yCWVjeCxyMTJkCisJcm9yCXIxMmQsOAorCXhvcgllZHgsZWJwCisJcm9yCWVicCw4CisJeG9yCWVjeCxyMTJkCisJbW92CXI5ZCxEV09SRFsxOTIrcjE0XQorCXhvcgllZHgsZWJwCisJam1wCU5FQVIgJEwkZW5jX2xvb3BfY29tcGFjdAorQUxJR04JMTYKKyRMJGVuY19jb21wYWN0X2RvbmU6CisJeG9yCWVheCxEV09SRFtyMTVdCisJeG9yCWVieCxEV09SRFs0K3IxNV0KKwl4b3IJZWN4LERXT1JEWzgrcjE1XQorCXhvcgllZHgsRFdPUkRbMTIrcjE1XQorREIJMHhmMywweGMzCisKK0FMSUdOCTE2CitnbG9iYWwJYWVzX25vaHdfZW5jcnlwdAorCisKK2Flc19ub2h3X2VuY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNfbm9od19lbmNyeXB0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworCisJbW92CXJheCxyc3AKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCisKKwlsZWEJcmN4LFsoKC02MykpK3JkeF0KKwlhbmQJcnNwLC02NAorCXN1YglyY3gscnNwCisJbmVnCXJjeAorCWFuZAlyY3gsMHgzYzAKKwlzdWIJcnNwLHJjeAorCXN1Yglyc3AsMzIKKworCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglRV09SRFsyNCtyc3BdLHJheAorCiskTCRlbmNfcHJvbG9ndWU6CisKKwltb3YJcjE1LHJkeAorCW1vdglyMTNkLERXT1JEWzI0MCtyMTVdCisKKwltb3YJZWF4LERXT1JEW3JkaV0KKwltb3YJZWJ4LERXT1JEWzQrcmRpXQorCW1vdgllY3gsRFdPUkRbOCtyZGldCisJbW92CWVkeCxEV09SRFsxMityZGldCisKKwlzaGwJcjEzZCw0CisJbGVhCXJicCxbcjEzKjErcjE1XQorCW1vdglRV09SRFtyc3BdLHIxNQorCW1vdglRV09SRFs4K3JzcF0scmJwCisKKworCWxlYQlyMTQsWygoJEwkQUVTX1RlKzIwNDgpKV0KKwlsZWEJcmJwLFs3NjgrcnNwXQorCXN1YglyYnAscjE0CisJYW5kCXJicCwweDMwMAorCWxlYQlyMTQsW3JicCoxK3IxNF0KKworCWNhbGwJX3g4Nl82NF9BRVNfZW5jcnlwdF9jb21wYWN0CisKKwltb3YJcjksUVdPUkRbMTYrcnNwXQorCW1vdglyc2ksUVdPUkRbMjQrcnNwXQorCisJbW92CURXT1JEW3I5XSxlYXgKKwltb3YJRFdPUkRbNCtyOV0sZWJ4CisJbW92CURXT1JEWzgrcjldLGVjeAorCW1vdglEV09SRFsxMityOV0sZWR4CisKKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcnNpXQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JzaV0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyc2ldCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcnNpXQorCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JzaV0KKworCWxlYQlyc3AsW3JzaV0KKworJEwkZW5jX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2Flc19ub2h3X2VuY3J5cHQ6CisKK0FMSUdOCTE2CitfeDg2XzY0X0FFU19kZWNyeXB0OgorCXhvcgllYXgsRFdPUkRbcjE1XQorCXhvcgllYngsRFdPUkRbNCtyMTVdCisJeG9yCWVjeCxEV09SRFs4K3IxNV0KKwl4b3IJZWR4LERXT1JEWzEyK3IxNV0KKworCW1vdglyMTNkLERXT1JEWzI0MCtyMTVdCisJc3ViCXIxM2QsMQorCWptcAlORUFSICRMJGRlY19sb29wCitBTElHTgkxNgorJEwkZGVjX2xvb3A6CisKKwltb3Z6eAllc2ksYWwKKwltb3Z6eAllZGksYmwKKwltb3Z6eAllYnAsY2wKKwltb3YJcjEwZCxEV09SRFtyc2kqOCtyMTRdCisJbW92CXIxMWQsRFdPUkRbcmRpKjgrcjE0XQorCW1vdglyMTJkLERXT1JEW3JicCo4K3IxNF0KKworCW1vdnp4CWVzaSxkaAorCW1vdnp4CWVkaSxhaAorCW1vdnp4CWVicCxkbAorCXhvcglyMTBkLERXT1JEWzMrcnNpKjgrcjE0XQorCXhvcglyMTFkLERXT1JEWzMrcmRpKjgrcjE0XQorCW1vdglyOGQsRFdPUkRbcmJwKjgrcjE0XQorCisJbW92engJZXNpLGJoCisJc2hyCWVheCwxNgorCW1vdnp4CWVicCxjaAorCXhvcglyMTJkLERXT1JEWzMrcnNpKjgrcjE0XQorCXNocgllZHgsMTYKKwl4b3IJcjhkLERXT1JEWzMrcmJwKjgrcjE0XQorCisJc2hyCWVieCwxNgorCWxlYQlyMTUsWzE2K3IxNV0KKwlzaHIJZWN4LDE2CisKKwltb3Z6eAllc2ksY2wKKwltb3Z6eAllZGksZGwKKwltb3Z6eAllYnAsYWwKKwl4b3IJcjEwZCxEV09SRFsyK3JzaSo4K3IxNF0KKwl4b3IJcjExZCxEV09SRFsyK3JkaSo4K3IxNF0KKwl4b3IJcjEyZCxEV09SRFsyK3JicCo4K3IxNF0KKworCW1vdnp4CWVzaSxiaAorCW1vdnp4CWVkaSxjaAorCW1vdnp4CWVicCxibAorCXhvcglyMTBkLERXT1JEWzErcnNpKjgrcjE0XQorCXhvcglyMTFkLERXT1JEWzErcmRpKjgrcjE0XQorCXhvcglyOGQsRFdPUkRbMityYnAqOCtyMTRdCisKKwltb3Z6eAllc2ksZGgKKwltb3YJZWR4LERXT1JEWzEyK3IxNV0KKwltb3Z6eAllYnAsYWgKKwl4b3IJcjEyZCxEV09SRFsxK3JzaSo4K3IxNF0KKwltb3YJZWF4LERXT1JEW3IxNV0KKwl4b3IJcjhkLERXT1JEWzErcmJwKjgrcjE0XQorCisJeG9yCWVheCxyMTBkCisJbW92CWVieCxEV09SRFs0K3IxNV0KKwltb3YJZWN4LERXT1JEWzgrcjE1XQorCXhvcgllY3gscjEyZAorCXhvcgllYngscjExZAorCXhvcgllZHgscjhkCisJc3ViCXIxM2QsMQorCWpueglORUFSICRMJGRlY19sb29wCisJbGVhCXIxNCxbMjA0OCtyMTRdCisJbW92engJZXNpLGFsCisJbW92engJZWRpLGJsCisJbW92engJZWJwLGNsCisJbW92engJcjEwZCxCWVRFW3JzaSoxK3IxNF0KKwltb3Z6eAlyMTFkLEJZVEVbcmRpKjErcjE0XQorCW1vdnp4CXIxMmQsQllURVtyYnAqMStyMTRdCisKKwltb3Z6eAllc2ksZGwKKwltb3Z6eAllZGksZGgKKwltb3Z6eAllYnAsYWgKKwltb3Z6eAlyOGQsQllURVtyc2kqMStyMTRdCisJbW92engJZWRpLEJZVEVbcmRpKjErcjE0XQorCW1vdnp4CWVicCxCWVRFW3JicCoxK3IxNF0KKworCXNobAllZGksOAorCXNobAllYnAsOAorCisJeG9yCXIxMGQsZWRpCisJeG9yCXIxMWQsZWJwCisJc2hyCWVkeCwxNgorCisJbW92engJZXNpLGJoCisJbW92engJZWRpLGNoCisJc2hyCWVheCwxNgorCW1vdnp4CWVzaSxCWVRFW3JzaSoxK3IxNF0KKwltb3Z6eAllZGksQllURVtyZGkqMStyMTRdCisKKwlzaGwJZXNpLDgKKwlzaGwJZWRpLDgKKwlzaHIJZWJ4LDE2CisJeG9yCXIxMmQsZXNpCisJeG9yCXI4ZCxlZGkKKwlzaHIJZWN4LDE2CisKKwltb3Z6eAllc2ksY2wKKwltb3Z6eAllZGksZGwKKwltb3Z6eAllYnAsYWwKKwltb3Z6eAllc2ksQllURVtyc2kqMStyMTRdCisJbW92engJZWRpLEJZVEVbcmRpKjErcjE0XQorCW1vdnp4CWVicCxCWVRFW3JicCoxK3IxNF0KKworCXNobAllc2ksMTYKKwlzaGwJZWRpLDE2CisJc2hsCWVicCwxNgorCisJeG9yCXIxMGQsZXNpCisJeG9yCXIxMWQsZWRpCisJeG9yCXIxMmQsZWJwCisKKwltb3Z6eAllc2ksYmwKKwltb3Z6eAllZGksYmgKKwltb3Z6eAllYnAsY2gKKwltb3Z6eAllc2ksQllURVtyc2kqMStyMTRdCisJbW92engJZWRpLEJZVEVbcmRpKjErcjE0XQorCW1vdnp4CWVicCxCWVRFW3JicCoxK3IxNF0KKworCXNobAllc2ksMTYKKwlzaGwJZWRpLDI0CisJc2hsCWVicCwyNAorCisJeG9yCXI4ZCxlc2kKKwl4b3IJcjEwZCxlZGkKKwl4b3IJcjExZCxlYnAKKworCW1vdnp4CWVzaSxkaAorCW1vdnp4CWVkaSxhaAorCW1vdgllZHgsRFdPUkRbKCgxNisxMikpK3IxNV0KKwltb3Z6eAllc2ksQllURVtyc2kqMStyMTRdCisJbW92engJZWRpLEJZVEVbcmRpKjErcjE0XQorCW1vdgllYXgsRFdPUkRbKCgxNiswKSkrcjE1XQorCisJc2hsCWVzaSwyNAorCXNobAllZGksMjQKKworCXhvcglyMTJkLGVzaQorCXhvcglyOGQsZWRpCisKKwltb3YJZWJ4LERXT1JEWygoMTYrNCkpK3IxNV0KKwltb3YJZWN4LERXT1JEWygoMTYrOCkpK3IxNV0KKwlsZWEJcjE0LFsoKC0yMDQ4KSkrcjE0XQorCXhvcgllYXgscjEwZAorCXhvcgllYngscjExZAorCXhvcgllY3gscjEyZAorCXhvcgllZHgscjhkCitEQgkweGYzLDB4YzMKKworCitBTElHTgkxNgorX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0OgorCWxlYQlyOCxbMTI4K3IxNF0KKwltb3YJZWRpLERXT1JEWygoMC0xMjgpKStyOF0KKwltb3YJZWJwLERXT1JEWygoMzItMTI4KSkrcjhdCisJbW92CXIxMGQsRFdPUkRbKCg2NC0xMjgpKStyOF0KKwltb3YJcjExZCxEV09SRFsoKDk2LTEyOCkpK3I4XQorCW1vdgllZGksRFdPUkRbKCgxMjgtMTI4KSkrcjhdCisJbW92CWVicCxEV09SRFsoKDE2MC0xMjgpKStyOF0KKwltb3YJcjEwZCxEV09SRFsoKDE5Mi0xMjgpKStyOF0KKwltb3YJcjExZCxEV09SRFsoKDIyNC0xMjgpKStyOF0KKwlqbXAJTkVBUiAkTCRkZWNfbG9vcF9jb21wYWN0CisKK0FMSUdOCTE2CiskTCRkZWNfbG9vcF9jb21wYWN0OgorCXhvcgllYXgsRFdPUkRbcjE1XQorCXhvcgllYngsRFdPUkRbNCtyMTVdCisJeG9yCWVjeCxEV09SRFs4K3IxNV0KKwl4b3IJZWR4LERXT1JEWzEyK3IxNV0KKwlsZWEJcjE1LFsxNityMTVdCisJbW92engJcjEwZCxhbAorCW1vdnp4CXIxMWQsYmwKKwltb3Z6eAlyMTJkLGNsCisJbW92engJcjhkLGRsCisJbW92engJZXNpLGRoCisJbW92engJZWRpLGFoCisJc2hyCWVkeCwxNgorCW1vdnp4CWVicCxiaAorCW1vdnp4CXIxMGQsQllURVtyMTAqMStyMTRdCisJbW92engJcjExZCxCWVRFW3IxMSoxK3IxNF0KKwltb3Z6eAlyMTJkLEJZVEVbcjEyKjErcjE0XQorCW1vdnp4CXI4ZCxCWVRFW3I4KjErcjE0XQorCisJbW92engJcjlkLEJZVEVbcnNpKjErcjE0XQorCW1vdnp4CWVzaSxjaAorCW1vdnp4CXIxM2QsQllURVtyZGkqMStyMTRdCisJbW92engJZWJwLEJZVEVbcmJwKjErcjE0XQorCW1vdnp4CWVzaSxCWVRFW3JzaSoxK3IxNF0KKworCXNocgllY3gsMTYKKwlzaGwJcjEzZCw4CisJc2hsCXI5ZCw4CisJbW92engJZWRpLGNsCisJc2hyCWVheCwxNgorCXhvcglyMTBkLHI5ZAorCXNocgllYngsMTYKKwltb3Z6eAlyOWQsZGwKKworCXNobAllYnAsOAorCXhvcglyMTFkLHIxM2QKKwlzaGwJZXNpLDgKKwltb3Z6eAlyMTNkLGFsCisJbW92engJZWRpLEJZVEVbcmRpKjErcjE0XQorCXhvcglyMTJkLGVicAorCW1vdnp4CWVicCxibAorCisJc2hsCWVkaSwxNgorCXhvcglyOGQsZXNpCisJbW92engJcjlkLEJZVEVbcjkqMStyMTRdCisJbW92engJZXNpLGJoCisJbW92engJZWJwLEJZVEVbcmJwKjErcjE0XQorCXhvcglyMTBkLGVkaQorCW1vdnp4CXIxM2QsQllURVtyMTMqMStyMTRdCisJbW92engJZWRpLGNoCisKKwlzaGwJZWJwLDE2CisJc2hsCXI5ZCwxNgorCXNobAlyMTNkLDE2CisJeG9yCXI4ZCxlYnAKKwltb3Z6eAllYnAsZGgKKwl4b3IJcjExZCxyOWQKKwlzaHIJZWF4LDgKKwl4b3IJcjEyZCxyMTNkCisKKwltb3Z6eAllc2ksQllURVtyc2kqMStyMTRdCisJbW92engJZWJ4LEJZVEVbcmRpKjErcjE0XQorCW1vdnp4CWVjeCxCWVRFW3JicCoxK3IxNF0KKwltb3Z6eAllZHgsQllURVtyYXgqMStyMTRdCisKKwltb3YJZWF4LHIxMGQKKwlzaGwJZXNpLDI0CisJc2hsCWVieCwyNAorCXNobAllY3gsMjQKKwl4b3IJZWF4LGVzaQorCXNobAllZHgsMjQKKwl4b3IJZWJ4LHIxMWQKKwl4b3IJZWN4LHIxMmQKKwl4b3IJZWR4LHI4ZAorCWNtcAlyMTUsUVdPUkRbMTYrcnNwXQorCWplCU5FQVIgJEwkZGVjX2NvbXBhY3RfZG9uZQorCisJbW92CXJzaSxRV09SRFsoKDI1NiswKSkrcjE0XQorCXNobAlyYngsMzIKKwlzaGwJcmR4LDMyCisJbW92CXJkaSxRV09SRFsoKDI1Nis4KSkrcjE0XQorCW9yCXJheCxyYngKKwlvcglyY3gscmR4CisJbW92CXJicCxRV09SRFsoKDI1NisxNikpK3IxNF0KKwltb3YJcjkscnNpCisJbW92CXIxMixyc2kKKwlhbmQJcjkscmF4CisJYW5kCXIxMixyY3gKKwltb3YJcmJ4LHI5CisJbW92CXJkeCxyMTIKKwlzaHIJcjksNworCWxlYQlyOCxbcmF4KjErcmF4XQorCXNocglyMTIsNworCWxlYQlyMTEsW3JjeCoxK3JjeF0KKwlzdWIJcmJ4LHI5CisJc3ViCXJkeCxyMTIKKwlhbmQJcjgscmRpCisJYW5kCXIxMSxyZGkKKwlhbmQJcmJ4LHJicAorCWFuZAlyZHgscmJwCisJeG9yCXI4LHJieAorCXhvcglyMTEscmR4CisJbW92CXIxMCxyc2kKKwltb3YJcjEzLHJzaQorCisJYW5kCXIxMCxyOAorCWFuZAlyMTMscjExCisJbW92CXJieCxyMTAKKwltb3YJcmR4LHIxMworCXNocglyMTAsNworCWxlYQlyOSxbcjgqMStyOF0KKwlzaHIJcjEzLDcKKwlsZWEJcjEyLFtyMTEqMStyMTFdCisJc3ViCXJieCxyMTAKKwlzdWIJcmR4LHIxMworCWFuZAlyOSxyZGkKKwlhbmQJcjEyLHJkaQorCWFuZAlyYngscmJwCisJYW5kCXJkeCxyYnAKKwl4b3IJcjkscmJ4CisJeG9yCXIxMixyZHgKKwltb3YJcjEwLHJzaQorCW1vdglyMTMscnNpCisKKwlhbmQJcjEwLHI5CisJYW5kCXIxMyxyMTIKKwltb3YJcmJ4LHIxMAorCW1vdglyZHgscjEzCisJc2hyCXIxMCw3CisJeG9yCXI4LHJheAorCXNocglyMTMsNworCXhvcglyMTEscmN4CisJc3ViCXJieCxyMTAKKwlzdWIJcmR4LHIxMworCWxlYQlyMTAsW3I5KjErcjldCisJbGVhCXIxMyxbcjEyKjErcjEyXQorCXhvcglyOSxyYXgKKwl4b3IJcjEyLHJjeAorCWFuZAlyMTAscmRpCisJYW5kCXIxMyxyZGkKKwlhbmQJcmJ4LHJicAorCWFuZAlyZHgscmJwCisJeG9yCXIxMCxyYngKKwl4b3IJcjEzLHJkeAorCisJeG9yCXJheCxyMTAKKwl4b3IJcmN4LHIxMworCXhvcglyOCxyMTAKKwl4b3IJcjExLHIxMworCW1vdglyYngscmF4CisJbW92CXJkeCxyY3gKKwl4b3IJcjkscjEwCisJc2hyCXJieCwzMgorCXhvcglyMTIscjEzCisJc2hyCXJkeCwzMgorCXhvcglyMTAscjgKKwlyb2wJZWF4LDgKKwl4b3IJcjEzLHIxMQorCXJvbAllY3gsOAorCXhvcglyMTAscjkKKwlyb2wJZWJ4LDgKKwl4b3IJcjEzLHIxMgorCisJcm9sCWVkeCw4CisJeG9yCWVheCxyMTBkCisJc2hyCXIxMCwzMgorCXhvcgllY3gscjEzZAorCXNocglyMTMsMzIKKwl4b3IJZWJ4LHIxMGQKKwl4b3IJZWR4LHIxM2QKKworCW1vdglyMTAscjgKKwlyb2wJcjhkLDI0CisJbW92CXIxMyxyMTEKKwlyb2wJcjExZCwyNAorCXNocglyMTAsMzIKKwl4b3IJZWF4LHI4ZAorCXNocglyMTMsMzIKKwl4b3IJZWN4LHIxMWQKKwlyb2wJcjEwZCwyNAorCW1vdglyOCxyOQorCXJvbAlyMTNkLDI0CisJbW92CXIxMSxyMTIKKwlzaHIJcjgsMzIKKwl4b3IJZWJ4LHIxMGQKKwlzaHIJcjExLDMyCisJeG9yCWVkeCxyMTNkCisKKwltb3YJcnNpLFFXT1JEW3IxNF0KKwlyb2wJcjlkLDE2CisJbW92CXJkaSxRV09SRFs2NCtyMTRdCisJcm9sCXIxMmQsMTYKKwltb3YJcmJwLFFXT1JEWzEyOCtyMTRdCisJcm9sCXI4ZCwxNgorCW1vdglyMTAsUVdPUkRbMTkyK3IxNF0KKwl4b3IJZWF4LHI5ZAorCXJvbAlyMTFkLDE2CisJeG9yCWVjeCxyMTJkCisJbW92CXIxMyxRV09SRFsyNTYrcjE0XQorCXhvcgllYngscjhkCisJeG9yCWVkeCxyMTFkCisJam1wCU5FQVIgJEwkZGVjX2xvb3BfY29tcGFjdAorQUxJR04JMTYKKyRMJGRlY19jb21wYWN0X2RvbmU6CisJeG9yCWVheCxEV09SRFtyMTVdCisJeG9yCWVieCxEV09SRFs0K3IxNV0KKwl4b3IJZWN4LERXT1JEWzgrcjE1XQorCXhvcgllZHgsRFdPUkRbMTIrcjE1XQorREIJMHhmMywweGMzCisKK0FMSUdOCTE2CitnbG9iYWwJYWVzX25vaHdfZGVjcnlwdAorCisKK2Flc19ub2h3X2RlY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNfbm9od19kZWNyeXB0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworCisJbW92CXJheCxyc3AKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCisKKwlsZWEJcmN4LFsoKC02MykpK3JkeF0KKwlhbmQJcnNwLC02NAorCXN1YglyY3gscnNwCisJbmVnCXJjeAorCWFuZAlyY3gsMHgzYzAKKwlzdWIJcnNwLHJjeAorCXN1Yglyc3AsMzIKKworCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglRV09SRFsyNCtyc3BdLHJheAorCiskTCRkZWNfcHJvbG9ndWU6CisKKwltb3YJcjE1LHJkeAorCW1vdglyMTNkLERXT1JEWzI0MCtyMTVdCisKKwltb3YJZWF4LERXT1JEW3JkaV0KKwltb3YJZWJ4LERXT1JEWzQrcmRpXQorCW1vdgllY3gsRFdPUkRbOCtyZGldCisJbW92CWVkeCxEV09SRFsxMityZGldCisKKwlzaGwJcjEzZCw0CisJbGVhCXJicCxbcjEzKjErcjE1XQorCW1vdglRV09SRFtyc3BdLHIxNQorCW1vdglRV09SRFs4K3JzcF0scmJwCisKKworCWxlYQlyMTQsWygoJEwkQUVTX1RkKzIwNDgpKV0KKwlsZWEJcmJwLFs3NjgrcnNwXQorCXN1YglyYnAscjE0CisJYW5kCXJicCwweDMwMAorCWxlYQlyMTQsW3JicCoxK3IxNF0KKwlzaHIJcmJwLDMKKwlhZGQJcjE0LHJicAorCisJY2FsbAlfeDg2XzY0X0FFU19kZWNyeXB0X2NvbXBhY3QKKworCW1vdglyOSxRV09SRFsxNityc3BdCisJbW92CXJzaSxRV09SRFsyNCtyc3BdCisKKwltb3YJRFdPUkRbcjldLGVheAorCW1vdglEV09SRFs0K3I5XSxlYngKKwltb3YJRFdPUkRbOCtyOV0sZWN4CisJbW92CURXT1JEWzEyK3I5XSxlZHgKKworCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRkZWNfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzX25vaHdfZGVjcnlwdDoKK0FMSUdOCTE2CitnbG9iYWwJYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5CisKK2Flc19ub2h3X3NldF9lbmNyeXB0X2tleToKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2Flc19ub2h3X3NldF9lbmNyeXB0X2tleToKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXN1Yglyc3AsOAorCiskTCRlbmNfa2V5X3Byb2xvZ3VlOgorCisJY2FsbAlfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXkKKworCW1vdglyYnAsUVdPUkRbNDArcnNwXQorCisJbW92CXJieCxRV09SRFs0OCtyc3BdCisKKwlhZGQJcnNwLDU2CisKKyRMJGVuY19rZXlfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5OgorCisKK0FMSUdOCTE2CitfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXk6CisJbW92CWVjeCxlc2kKKwltb3YJcnNpLHJkaQorCW1vdglyZGkscmR4CisKKwl0ZXN0CXJzaSwtMQorCWp6CU5FQVIgJEwkYmFkcG9pbnRlcgorCXRlc3QJcmRpLC0xCisJanoJTkVBUiAkTCRiYWRwb2ludGVyCisKKwlsZWEJcmJwLFskTCRBRVNfVGVdCisJbGVhCXJicCxbKCgyMDQ4KzEyOCkpK3JicF0KKworCisJbW92CWVheCxEV09SRFsoKDAtMTI4KSkrcmJwXQorCW1vdgllYngsRFdPUkRbKCgzMi0xMjgpKStyYnBdCisJbW92CXI4ZCxEV09SRFsoKDY0LTEyOCkpK3JicF0KKwltb3YJZWR4LERXT1JEWygoOTYtMTI4KSkrcmJwXQorCW1vdgllYXgsRFdPUkRbKCgxMjgtMTI4KSkrcmJwXQorCW1vdgllYngsRFdPUkRbKCgxNjAtMTI4KSkrcmJwXQorCW1vdglyOGQsRFdPUkRbKCgxOTItMTI4KSkrcmJwXQorCW1vdgllZHgsRFdPUkRbKCgyMjQtMTI4KSkrcmJwXQorCisJY21wCWVjeCwxMjgKKwlqZQlORUFSICRMJDEwcm91bmRzCisJY21wCWVjeCwxOTIKKwlqZQlORUFSICRMJDEycm91bmRzCisJY21wCWVjeCwyNTYKKwlqZQlORUFSICRMJDE0cm91bmRzCisJbW92CXJheCwtMgorCWptcAlORUFSICRMJGV4aXQKKworJEwkMTByb3VuZHM6CisJbW92CXJheCxRV09SRFtyc2ldCisJbW92CXJkeCxRV09SRFs4K3JzaV0KKwltb3YJUVdPUkRbcmRpXSxyYXgKKwltb3YJUVdPUkRbOCtyZGldLHJkeAorCisJc2hyCXJkeCwzMgorCXhvcgllY3gsZWN4CisJam1wCU5FQVIgJEwkMTBzaG9ydGN1dAorQUxJR04JNAorJEwkMTBsb29wOgorCW1vdgllYXgsRFdPUkRbcmRpXQorCW1vdgllZHgsRFdPUkRbMTIrcmRpXQorJEwkMTBzaG9ydGN1dDoKKwltb3Z6eAllc2ksZGwKKwltb3Z6eAllYngsQllURVsoKC0xMjgpKStyc2kqMStyYnBdCisJbW92engJZXNpLGRoCisJc2hsCWVieCwyNAorCXhvcgllYXgsZWJ4CisKKwltb3Z6eAllYngsQllURVsoKC0xMjgpKStyc2kqMStyYnBdCisJc2hyCWVkeCwxNgorCW1vdnp4CWVzaSxkbAorCXhvcgllYXgsZWJ4CisKKwltb3Z6eAllYngsQllURVsoKC0xMjgpKStyc2kqMStyYnBdCisJbW92engJZXNpLGRoCisJc2hsCWVieCw4CisJeG9yCWVheCxlYngKKworCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwlzaGwJZWJ4LDE2CisJeG9yCWVheCxlYngKKworCXhvcgllYXgsRFdPUkRbKCgxMDI0LTEyOCkpK3JjeCo0K3JicF0KKwltb3YJRFdPUkRbMTYrcmRpXSxlYXgKKwl4b3IJZWF4LERXT1JEWzQrcmRpXQorCW1vdglEV09SRFsyMCtyZGldLGVheAorCXhvcgllYXgsRFdPUkRbOCtyZGldCisJbW92CURXT1JEWzI0K3JkaV0sZWF4CisJeG9yCWVheCxEV09SRFsxMityZGldCisJbW92CURXT1JEWzI4K3JkaV0sZWF4CisJYWRkCWVjeCwxCisJbGVhCXJkaSxbMTYrcmRpXQorCWNtcAllY3gsMTAKKwlqbAlORUFSICRMJDEwbG9vcAorCisJbW92CURXT1JEWzgwK3JkaV0sMTAKKwl4b3IJcmF4LHJheAorCWptcAlORUFSICRMJGV4aXQKKworJEwkMTJyb3VuZHM6CisJbW92CXJheCxRV09SRFtyc2ldCisJbW92CXJieCxRV09SRFs4K3JzaV0KKwltb3YJcmR4LFFXT1JEWzE2K3JzaV0KKwltb3YJUVdPUkRbcmRpXSxyYXgKKwltb3YJUVdPUkRbOCtyZGldLHJieAorCW1vdglRV09SRFsxNityZGldLHJkeAorCisJc2hyCXJkeCwzMgorCXhvcgllY3gsZWN4CisJam1wCU5FQVIgJEwkMTJzaG9ydGN1dAorQUxJR04JNAorJEwkMTJsb29wOgorCW1vdgllYXgsRFdPUkRbcmRpXQorCW1vdgllZHgsRFdPUkRbMjArcmRpXQorJEwkMTJzaG9ydGN1dDoKKwltb3Z6eAllc2ksZGwKKwltb3Z6eAllYngsQllURVsoKC0xMjgpKStyc2kqMStyYnBdCisJbW92engJZXNpLGRoCisJc2hsCWVieCwyNAorCXhvcgllYXgsZWJ4CisKKwltb3Z6eAllYngsQllURVsoKC0xMjgpKStyc2kqMStyYnBdCisJc2hyCWVkeCwxNgorCW1vdnp4CWVzaSxkbAorCXhvcgllYXgsZWJ4CisKKwltb3Z6eAllYngsQllURVsoKC0xMjgpKStyc2kqMStyYnBdCisJbW92engJZXNpLGRoCisJc2hsCWVieCw4CisJeG9yCWVheCxlYngKKworCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwlzaGwJZWJ4LDE2CisJeG9yCWVheCxlYngKKworCXhvcgllYXgsRFdPUkRbKCgxMDI0LTEyOCkpK3JjeCo0K3JicF0KKwltb3YJRFdPUkRbMjQrcmRpXSxlYXgKKwl4b3IJZWF4LERXT1JEWzQrcmRpXQorCW1vdglEV09SRFsyOCtyZGldLGVheAorCXhvcgllYXgsRFdPUkRbOCtyZGldCisJbW92CURXT1JEWzMyK3JkaV0sZWF4CisJeG9yCWVheCxEV09SRFsxMityZGldCisJbW92CURXT1JEWzM2K3JkaV0sZWF4CisKKwljbXAJZWN4LDcKKwlqZQlORUFSICRMJDEyYnJlYWsKKwlhZGQJZWN4LDEKKworCXhvcgllYXgsRFdPUkRbMTYrcmRpXQorCW1vdglEV09SRFs0MCtyZGldLGVheAorCXhvcgllYXgsRFdPUkRbMjArcmRpXQorCW1vdglEV09SRFs0NCtyZGldLGVheAorCisJbGVhCXJkaSxbMjQrcmRpXQorCWptcAlORUFSICRMJDEybG9vcAorJEwkMTJicmVhazoKKwltb3YJRFdPUkRbNzIrcmRpXSwxMgorCXhvcglyYXgscmF4CisJam1wCU5FQVIgJEwkZXhpdAorCiskTCQxNHJvdW5kczoKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwltb3YJcmJ4LFFXT1JEWzgrcnNpXQorCW1vdglyY3gsUVdPUkRbMTYrcnNpXQorCW1vdglyZHgsUVdPUkRbMjQrcnNpXQorCW1vdglRV09SRFtyZGldLHJheAorCW1vdglRV09SRFs4K3JkaV0scmJ4CisJbW92CVFXT1JEWzE2K3JkaV0scmN4CisJbW92CVFXT1JEWzI0K3JkaV0scmR4CisKKwlzaHIJcmR4LDMyCisJeG9yCWVjeCxlY3gKKwlqbXAJTkVBUiAkTCQxNHNob3J0Y3V0CitBTElHTgk0CiskTCQxNGxvb3A6CisJbW92CWVheCxEV09SRFtyZGldCisJbW92CWVkeCxEV09SRFsyOCtyZGldCiskTCQxNHNob3J0Y3V0OgorCW1vdnp4CWVzaSxkbAorCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwltb3Z6eAllc2ksZGgKKwlzaGwJZWJ4LDI0CisJeG9yCWVheCxlYngKKworCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwlzaHIJZWR4LDE2CisJbW92engJZXNpLGRsCisJeG9yCWVheCxlYngKKworCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwltb3Z6eAllc2ksZGgKKwlzaGwJZWJ4LDgKKwl4b3IJZWF4LGVieAorCisJbW92engJZWJ4LEJZVEVbKCgtMTI4KSkrcnNpKjErcmJwXQorCXNobAllYngsMTYKKwl4b3IJZWF4LGVieAorCisJeG9yCWVheCxEV09SRFsoKDEwMjQtMTI4KSkrcmN4KjQrcmJwXQorCW1vdglEV09SRFszMityZGldLGVheAorCXhvcgllYXgsRFdPUkRbNCtyZGldCisJbW92CURXT1JEWzM2K3JkaV0sZWF4CisJeG9yCWVheCxEV09SRFs4K3JkaV0KKwltb3YJRFdPUkRbNDArcmRpXSxlYXgKKwl4b3IJZWF4LERXT1JEWzEyK3JkaV0KKwltb3YJRFdPUkRbNDQrcmRpXSxlYXgKKworCWNtcAllY3gsNgorCWplCU5FQVIgJEwkMTRicmVhaworCWFkZAllY3gsMQorCisJbW92CWVkeCxlYXgKKwltb3YJZWF4LERXT1JEWzE2K3JkaV0KKwltb3Z6eAllc2ksZGwKKwltb3Z6eAllYngsQllURVsoKC0xMjgpKStyc2kqMStyYnBdCisJbW92engJZXNpLGRoCisJeG9yCWVheCxlYngKKworCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwlzaHIJZWR4LDE2CisJc2hsCWVieCw4CisJbW92engJZXNpLGRsCisJeG9yCWVheCxlYngKKworCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwltb3Z6eAllc2ksZGgKKwlzaGwJZWJ4LDE2CisJeG9yCWVheCxlYngKKworCW1vdnp4CWVieCxCWVRFWygoLTEyOCkpK3JzaSoxK3JicF0KKwlzaGwJZWJ4LDI0CisJeG9yCWVheCxlYngKKworCW1vdglEV09SRFs0OCtyZGldLGVheAorCXhvcgllYXgsRFdPUkRbMjArcmRpXQorCW1vdglEV09SRFs1MityZGldLGVheAorCXhvcgllYXgsRFdPUkRbMjQrcmRpXQorCW1vdglEV09SRFs1NityZGldLGVheAorCXhvcgllYXgsRFdPUkRbMjgrcmRpXQorCW1vdglEV09SRFs2MCtyZGldLGVheAorCisJbGVhCXJkaSxbMzIrcmRpXQorCWptcAlORUFSICRMJDE0bG9vcAorJEwkMTRicmVhazoKKwltb3YJRFdPUkRbNDgrcmRpXSwxNAorCXhvcglyYXgscmF4CisJam1wCU5FQVIgJEwkZXhpdAorCiskTCRiYWRwb2ludGVyOgorCW1vdglyYXgsLTEKKyRMJGV4aXQ6CitEQgkweGYzLDB4YzMKKworQUxJR04JMTYKK2dsb2JhbAlhZXNfbm9od19zZXRfZGVjcnlwdF9rZXkKKworYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworCisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJcHVzaAlyZHgKKworJEwkZGVjX2tleV9wcm9sb2d1ZToKKworCWNhbGwJX3g4Nl82NF9BRVNfc2V0X2VuY3J5cHRfa2V5CisJbW92CXI4LFFXT1JEW3JzcF0KKwljbXAJZWF4LDAKKwlqbmUJTkVBUiAkTCRhYm9ydAorCisJbW92CXIxNGQsRFdPUkRbMjQwK3I4XQorCXhvcglyZGkscmRpCisJbGVhCXJjeCxbcjE0KjQrcmRpXQorCW1vdglyc2kscjgKKwlsZWEJcmRpLFtyY3gqNCtyOF0KK0FMSUdOCTQKKyRMJGludmVydDoKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwltb3YJcmJ4LFFXT1JEWzgrcnNpXQorCW1vdglyY3gsUVdPUkRbcmRpXQorCW1vdglyZHgsUVdPUkRbOCtyZGldCisJbW92CVFXT1JEW3JkaV0scmF4CisJbW92CVFXT1JEWzgrcmRpXSxyYngKKwltb3YJUVdPUkRbcnNpXSxyY3gKKwltb3YJUVdPUkRbOCtyc2ldLHJkeAorCWxlYQlyc2ksWzE2K3JzaV0KKwlsZWEJcmRpLFsoKC0xNikpK3JkaV0KKwljbXAJcmRpLHJzaQorCWpuZQlORUFSICRMJGludmVydAorCisJbGVhCXJheCxbKCgkTCRBRVNfVGUrMjA0OCsxMDI0KSldCisKKwltb3YJcnNpLFFXT1JEWzQwK3JheF0KKwltb3YJcmRpLFFXT1JEWzQ4K3JheF0KKwltb3YJcmJwLFFXT1JEWzU2K3JheF0KKworCW1vdglyMTUscjgKKwlzdWIJcjE0ZCwxCitBTElHTgk0CiskTCRwZXJtdXRlOgorCWxlYQlyMTUsWzE2K3IxNV0KKwltb3YJcmF4LFFXT1JEW3IxNV0KKwltb3YJcmN4LFFXT1JEWzgrcjE1XQorCW1vdglyOSxyc2kKKwltb3YJcjEyLHJzaQorCWFuZAlyOSxyYXgKKwlhbmQJcjEyLHJjeAorCW1vdglyYngscjkKKwltb3YJcmR4LHIxMgorCXNocglyOSw3CisJbGVhCXI4LFtyYXgqMStyYXhdCisJc2hyCXIxMiw3CisJbGVhCXIxMSxbcmN4KjErcmN4XQorCXN1YglyYngscjkKKwlzdWIJcmR4LHIxMgorCWFuZAlyOCxyZGkKKwlhbmQJcjExLHJkaQorCWFuZAlyYngscmJwCisJYW5kCXJkeCxyYnAKKwl4b3IJcjgscmJ4CisJeG9yCXIxMSxyZHgKKwltb3YJcjEwLHJzaQorCW1vdglyMTMscnNpCisKKwlhbmQJcjEwLHI4CisJYW5kCXIxMyxyMTEKKwltb3YJcmJ4LHIxMAorCW1vdglyZHgscjEzCisJc2hyCXIxMCw3CisJbGVhCXI5LFtyOCoxK3I4XQorCXNocglyMTMsNworCWxlYQlyMTIsW3IxMSoxK3IxMV0KKwlzdWIJcmJ4LHIxMAorCXN1YglyZHgscjEzCisJYW5kCXI5LHJkaQorCWFuZAlyMTIscmRpCisJYW5kCXJieCxyYnAKKwlhbmQJcmR4LHJicAorCXhvcglyOSxyYngKKwl4b3IJcjEyLHJkeAorCW1vdglyMTAscnNpCisJbW92CXIxMyxyc2kKKworCWFuZAlyMTAscjkKKwlhbmQJcjEzLHIxMgorCW1vdglyYngscjEwCisJbW92CXJkeCxyMTMKKwlzaHIJcjEwLDcKKwl4b3IJcjgscmF4CisJc2hyCXIxMyw3CisJeG9yCXIxMSxyY3gKKwlzdWIJcmJ4LHIxMAorCXN1YglyZHgscjEzCisJbGVhCXIxMCxbcjkqMStyOV0KKwlsZWEJcjEzLFtyMTIqMStyMTJdCisJeG9yCXI5LHJheAorCXhvcglyMTIscmN4CisJYW5kCXIxMCxyZGkKKwlhbmQJcjEzLHJkaQorCWFuZAlyYngscmJwCisJYW5kCXJkeCxyYnAKKwl4b3IJcjEwLHJieAorCXhvcglyMTMscmR4CisKKwl4b3IJcmF4LHIxMAorCXhvcglyY3gscjEzCisJeG9yCXI4LHIxMAorCXhvcglyMTEscjEzCisJbW92CXJieCxyYXgKKwltb3YJcmR4LHJjeAorCXhvcglyOSxyMTAKKwlzaHIJcmJ4LDMyCisJeG9yCXIxMixyMTMKKwlzaHIJcmR4LDMyCisJeG9yCXIxMCxyOAorCXJvbAllYXgsOAorCXhvcglyMTMscjExCisJcm9sCWVjeCw4CisJeG9yCXIxMCxyOQorCXJvbAllYngsOAorCXhvcglyMTMscjEyCisKKwlyb2wJZWR4LDgKKwl4b3IJZWF4LHIxMGQKKwlzaHIJcjEwLDMyCisJeG9yCWVjeCxyMTNkCisJc2hyCXIxMywzMgorCXhvcgllYngscjEwZAorCXhvcgllZHgscjEzZAorCisJbW92CXIxMCxyOAorCXJvbAlyOGQsMjQKKwltb3YJcjEzLHIxMQorCXJvbAlyMTFkLDI0CisJc2hyCXIxMCwzMgorCXhvcgllYXgscjhkCisJc2hyCXIxMywzMgorCXhvcgllY3gscjExZAorCXJvbAlyMTBkLDI0CisJbW92CXI4LHI5CisJcm9sCXIxM2QsMjQKKwltb3YJcjExLHIxMgorCXNocglyOCwzMgorCXhvcgllYngscjEwZAorCXNocglyMTEsMzIKKwl4b3IJZWR4LHIxM2QKKworCisJcm9sCXI5ZCwxNgorCisJcm9sCXIxMmQsMTYKKworCXJvbAlyOGQsMTYKKworCXhvcgllYXgscjlkCisJcm9sCXIxMWQsMTYKKwl4b3IJZWN4LHIxMmQKKworCXhvcgllYngscjhkCisJeG9yCWVkeCxyMTFkCisJbW92CURXT1JEW3IxNV0sZWF4CisJbW92CURXT1JEWzQrcjE1XSxlYngKKwltb3YJRFdPUkRbOCtyMTVdLGVjeAorCW1vdglEV09SRFsxMityMTVdLGVkeAorCXN1YglyMTRkLDEKKwlqbnoJTkVBUiAkTCRwZXJtdXRlCisKKwl4b3IJcmF4LHJheAorJEwkYWJvcnQ6CisJbW92CXIxNSxRV09SRFs4K3JzcF0KKworCW1vdglyMTQsUVdPUkRbMTYrcnNwXQorCisJbW92CXIxMyxRV09SRFsyNCtyc3BdCisKKwltb3YJcjEyLFFXT1JEWzMyK3JzcF0KKworCW1vdglyYnAsUVdPUkRbNDArcnNwXQorCisJbW92CXJieCxRV09SRFs0OCtyc3BdCisKKwlhZGQJcnNwLDU2CisKKyRMJGRlY19rZXlfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzX25vaHdfc2V0X2RlY3J5cHRfa2V5OgorQUxJR04JMTYKK2dsb2JhbAlhZXNfbm9od19jYmNfZW5jcnlwdAorCitFWFRFUk4JT1BFTlNTTF9pYTMyY2FwX1AKKworYWVzX25vaHdfY2JjX2VuY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNfbm9od19jYmNfZW5jcnlwdDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCW1vdglyOSxRV09SRFs0OCtyc3BdCisKKworCisJY21wCXJkeCwwCisJamUJTkVBUiAkTCRjYmNfZXBpbG9ndWUKKwlwdXNoZnEKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworJEwkY2JjX3Byb2xvZ3VlOgorCisJY2xkCisJbW92CXI5ZCxyOWQKKworCWxlYQlyMTQsWyRMJEFFU19UZV0KKwlsZWEJcjEwLFskTCRBRVNfVGRdCisJY21wCXI5LDAKKwljbW92ZQlyMTQscjEwCisKKwlsZWEJcjEwLFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJcjEwZCxEV09SRFtyMTBdCisJY21wCXJkeCw1MTIKKwlqYglORUFSICRMJGNiY19zbG93X3Byb2xvZ3VlCisJdGVzdAlyZHgsMTUKKwlqbnoJTkVBUiAkTCRjYmNfc2xvd19wcm9sb2d1ZQorCWJ0CXIxMGQsMjgKKwlqYwlORUFSICRMJGNiY19zbG93X3Byb2xvZ3VlCisKKworCWxlYQlyMTUsWygoLTg4LTI0OCkpK3JzcF0KKwlhbmQJcjE1LC02NAorCisKKwltb3YJcjEwLHIxNAorCWxlYQlyMTEsWzIzMDQrcjE0XQorCW1vdglyMTIscjE1CisJYW5kCXIxMCwweEZGRgorCWFuZAlyMTEsMHhGRkYKKwlhbmQJcjEyLDB4RkZGCisKKwljbXAJcjEyLHIxMQorCWpiCU5FQVIgJEwkY2JjX3RlX2JyZWFrX291dAorCXN1YglyMTIscjExCisJc3ViCXIxNSxyMTIKKwlqbXAJTkVBUiAkTCRjYmNfdGVfb2sKKyRMJGNiY190ZV9icmVha19vdXQ6CisJc3ViCXIxMixyMTAKKwlhbmQJcjEyLDB4RkZGCisJYWRkCXIxMiwzMjAKKwlzdWIJcjE1LHIxMgorQUxJR04JNAorJEwkY2JjX3RlX29rOgorCisJeGNoZwlyMTUscnNwCisKKworCW1vdglRV09SRFsxNityc3BdLHIxNQorCiskTCRjYmNfZmFzdF9ib2R5OgorCW1vdglRV09SRFsyNCtyc3BdLHJkaQorCW1vdglRV09SRFszMityc3BdLHJzaQorCW1vdglRV09SRFs0MCtyc3BdLHJkeAorCW1vdglRV09SRFs0OCtyc3BdLHJjeAorCW1vdglRV09SRFs1Nityc3BdLHI4CisJbW92CURXT1JEWygoODArMjQwKSkrcnNwXSwwCisJbW92CXJicCxyOAorCW1vdglyYngscjkKKwltb3YJcjkscnNpCisJbW92CXI4LHJkaQorCW1vdglyMTUscmN4CisKKwltb3YJZWF4LERXT1JEWzI0MCtyMTVdCisKKwltb3YJcjEwLHIxNQorCXN1YglyMTAscjE0CisJYW5kCXIxMCwweGZmZgorCWNtcAlyMTAsMjMwNAorCWpiCU5FQVIgJEwkY2JjX2RvX2Vjb3B5CisJY21wCXIxMCw0MDk2LTI0OAorCWpiCU5FQVIgJEwkY2JjX3NraXBfZWNvcHkKK0FMSUdOCTQKKyRMJGNiY19kb19lY29weToKKwltb3YJcnNpLHIxNQorCWxlYQlyZGksWzgwK3JzcF0KKwlsZWEJcjE1LFs4MCtyc3BdCisJbW92CWVjeCwyNDAvOAorCURECTB4OTBBNTQ4RjMKKwltb3YJRFdPUkRbcmRpXSxlYXgKKyRMJGNiY19za2lwX2Vjb3B5OgorCW1vdglRV09SRFtyc3BdLHIxNQorCisJbW92CWVjeCwxOAorQUxJR04JNAorJEwkY2JjX3ByZWZldGNoX3RlOgorCW1vdglyMTAsUVdPUkRbcjE0XQorCW1vdglyMTEsUVdPUkRbMzIrcjE0XQorCW1vdglyMTIsUVdPUkRbNjQrcjE0XQorCW1vdglyMTMsUVdPUkRbOTYrcjE0XQorCWxlYQlyMTQsWzEyOCtyMTRdCisJc3ViCWVjeCwxCisJam56CU5FQVIgJEwkY2JjX3ByZWZldGNoX3RlCisJbGVhCXIxNCxbKCgtMjMwNCkpK3IxNF0KKworCWNtcAlyYngsMAorCWplCU5FQVIgJEwkRkFTVF9ERUNSWVBUCisKKworCW1vdgllYXgsRFdPUkRbcmJwXQorCW1vdgllYngsRFdPUkRbNCtyYnBdCisJbW92CWVjeCxEV09SRFs4K3JicF0KKwltb3YJZWR4LERXT1JEWzEyK3JicF0KKworQUxJR04JNAorJEwkY2JjX2Zhc3RfZW5jX2xvb3A6CisJeG9yCWVheCxEV09SRFtyOF0KKwl4b3IJZWJ4LERXT1JEWzQrcjhdCisJeG9yCWVjeCxEV09SRFs4K3I4XQorCXhvcgllZHgsRFdPUkRbMTIrcjhdCisJbW92CXIxNSxRV09SRFtyc3BdCisJbW92CVFXT1JEWzI0K3JzcF0scjgKKworCWNhbGwJX3g4Nl82NF9BRVNfZW5jcnlwdAorCisJbW92CXI4LFFXT1JEWzI0K3JzcF0KKwltb3YJcjEwLFFXT1JEWzQwK3JzcF0KKwltb3YJRFdPUkRbcjldLGVheAorCW1vdglEV09SRFs0K3I5XSxlYngKKwltb3YJRFdPUkRbOCtyOV0sZWN4CisJbW92CURXT1JEWzEyK3I5XSxlZHgKKworCWxlYQlyOCxbMTYrcjhdCisJbGVhCXI5LFsxNityOV0KKwlzdWIJcjEwLDE2CisJdGVzdAlyMTAsLTE2CisJbW92CVFXT1JEWzQwK3JzcF0scjEwCisJam56CU5FQVIgJEwkY2JjX2Zhc3RfZW5jX2xvb3AKKwltb3YJcmJwLFFXT1JEWzU2K3JzcF0KKwltb3YJRFdPUkRbcmJwXSxlYXgKKwltb3YJRFdPUkRbNCtyYnBdLGVieAorCW1vdglEV09SRFs4K3JicF0sZWN4CisJbW92CURXT1JEWzEyK3JicF0sZWR4CisKKwlqbXAJTkVBUiAkTCRjYmNfZmFzdF9jbGVhbnVwCisKKworQUxJR04JMTYKKyRMJEZBU1RfREVDUllQVDoKKwljbXAJcjkscjgKKwlqZQlORUFSICRMJGNiY19mYXN0X2RlY19pbl9wbGFjZQorCisJbW92CVFXT1JEWzY0K3JzcF0scmJwCitBTElHTgk0CiskTCRjYmNfZmFzdF9kZWNfbG9vcDoKKwltb3YJZWF4LERXT1JEW3I4XQorCW1vdgllYngsRFdPUkRbNCtyOF0KKwltb3YJZWN4LERXT1JEWzgrcjhdCisJbW92CWVkeCxEV09SRFsxMityOF0KKwltb3YJcjE1LFFXT1JEW3JzcF0KKwltb3YJUVdPUkRbMjQrcnNwXSxyOAorCisJY2FsbAlfeDg2XzY0X0FFU19kZWNyeXB0CisKKwltb3YJcmJwLFFXT1JEWzY0K3JzcF0KKwltb3YJcjgsUVdPUkRbMjQrcnNwXQorCW1vdglyMTAsUVdPUkRbNDArcnNwXQorCXhvcgllYXgsRFdPUkRbcmJwXQorCXhvcgllYngsRFdPUkRbNCtyYnBdCisJeG9yCWVjeCxEV09SRFs4K3JicF0KKwl4b3IJZWR4LERXT1JEWzEyK3JicF0KKwltb3YJcmJwLHI4CisKKwlzdWIJcjEwLDE2CisJbW92CVFXT1JEWzQwK3JzcF0scjEwCisJbW92CVFXT1JEWzY0K3JzcF0scmJwCisKKwltb3YJRFdPUkRbcjldLGVheAorCW1vdglEV09SRFs0K3I5XSxlYngKKwltb3YJRFdPUkRbOCtyOV0sZWN4CisJbW92CURXT1JEWzEyK3I5XSxlZHgKKworCWxlYQlyOCxbMTYrcjhdCisJbGVhCXI5LFsxNityOV0KKwlqbnoJTkVBUiAkTCRjYmNfZmFzdF9kZWNfbG9vcAorCW1vdglyMTIsUVdPUkRbNTYrcnNwXQorCW1vdglyMTAsUVdPUkRbcmJwXQorCW1vdglyMTEsUVdPUkRbOCtyYnBdCisJbW92CVFXT1JEW3IxMl0scjEwCisJbW92CVFXT1JEWzgrcjEyXSxyMTEKKwlqbXAJTkVBUiAkTCRjYmNfZmFzdF9jbGVhbnVwCisKK0FMSUdOCTE2CiskTCRjYmNfZmFzdF9kZWNfaW5fcGxhY2U6CisJbW92CXIxMCxRV09SRFtyYnBdCisJbW92CXIxMSxRV09SRFs4K3JicF0KKwltb3YJUVdPUkRbKCgwKzY0KSkrcnNwXSxyMTAKKwltb3YJUVdPUkRbKCg4KzY0KSkrcnNwXSxyMTEKK0FMSUdOCTQKKyRMJGNiY19mYXN0X2RlY19pbl9wbGFjZV9sb29wOgorCW1vdgllYXgsRFdPUkRbcjhdCisJbW92CWVieCxEV09SRFs0K3I4XQorCW1vdgllY3gsRFdPUkRbOCtyOF0KKwltb3YJZWR4LERXT1JEWzEyK3I4XQorCW1vdglyMTUsUVdPUkRbcnNwXQorCW1vdglRV09SRFsyNCtyc3BdLHI4CisKKwljYWxsCV94ODZfNjRfQUVTX2RlY3J5cHQKKworCW1vdglyOCxRV09SRFsyNCtyc3BdCisJbW92CXIxMCxRV09SRFs0MCtyc3BdCisJeG9yCWVheCxEV09SRFsoKDArNjQpKStyc3BdCisJeG9yCWVieCxEV09SRFsoKDQrNjQpKStyc3BdCisJeG9yCWVjeCxEV09SRFsoKDgrNjQpKStyc3BdCisJeG9yCWVkeCxEV09SRFsoKDEyKzY0KSkrcnNwXQorCisJbW92CXIxMSxRV09SRFtyOF0KKwltb3YJcjEyLFFXT1JEWzgrcjhdCisJc3ViCXIxMCwxNgorCWp6CU5FQVIgJEwkY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2RvbmUKKworCW1vdglRV09SRFsoKDArNjQpKStyc3BdLHIxMQorCW1vdglRV09SRFsoKDgrNjQpKStyc3BdLHIxMgorCisJbW92CURXT1JEW3I5XSxlYXgKKwltb3YJRFdPUkRbNCtyOV0sZWJ4CisJbW92CURXT1JEWzgrcjldLGVjeAorCW1vdglEV09SRFsxMityOV0sZWR4CisKKwlsZWEJcjgsWzE2K3I4XQorCWxlYQlyOSxbMTYrcjldCisJbW92CVFXT1JEWzQwK3JzcF0scjEwCisJam1wCU5FQVIgJEwkY2JjX2Zhc3RfZGVjX2luX3BsYWNlX2xvb3AKKyRMJGNiY19mYXN0X2RlY19pbl9wbGFjZV9kb25lOgorCW1vdglyZGksUVdPUkRbNTYrcnNwXQorCW1vdglRV09SRFtyZGldLHIxMQorCW1vdglRV09SRFs4K3JkaV0scjEyCisKKwltb3YJRFdPUkRbcjldLGVheAorCW1vdglEV09SRFs0K3I5XSxlYngKKwltb3YJRFdPUkRbOCtyOV0sZWN4CisJbW92CURXT1JEWzEyK3I5XSxlZHgKKworQUxJR04JNAorJEwkY2JjX2Zhc3RfY2xlYW51cDoKKwljbXAJRFdPUkRbKCg4MCsyNDApKStyc3BdLDAKKwlsZWEJcmRpLFs4MCtyc3BdCisJamUJTkVBUiAkTCRjYmNfZXhpdAorCW1vdgllY3gsMjQwLzgKKwl4b3IJcmF4LHJheAorCURECTB4OTBBQjQ4RjMKKworCWptcAlORUFSICRMJGNiY19leGl0CisKKworQUxJR04JMTYKKyRMJGNiY19zbG93X3Byb2xvZ3VlOgorCisJbGVhCXJicCxbKCgtODgpKStyc3BdCisJYW5kCXJicCwtNjQKKworCWxlYQlyMTAsWygoLTg4LTYzKSkrcmN4XQorCXN1YglyMTAscmJwCisJbmVnCXIxMAorCWFuZAlyMTAsMHgzYzAKKwlzdWIJcmJwLHIxMAorCisJeGNoZwlyYnAscnNwCisKKwltb3YJUVdPUkRbMTYrcnNwXSxyYnAKKyRMJGNiY19zbG93X2JvZHk6CisKKworCisKKwltb3YJUVdPUkRbNTYrcnNwXSxyOAorCW1vdglyYnAscjgKKwltb3YJcmJ4LHI5CisJbW92CXI5LHJzaQorCW1vdglyOCxyZGkKKwltb3YJcjE1LHJjeAorCW1vdglyMTAscmR4CisKKwltb3YJZWF4LERXT1JEWzI0MCtyMTVdCisJbW92CVFXT1JEW3JzcF0scjE1CisJc2hsCWVheCw0CisJbGVhCXJheCxbcmF4KjErcjE1XQorCW1vdglRV09SRFs4K3JzcF0scmF4CisKKworCWxlYQlyMTQsWzIwNDgrcjE0XQorCWxlYQlyYXgsWygoNzY4LTgpKStyc3BdCisJc3ViCXJheCxyMTQKKwlhbmQJcmF4LDB4MzAwCisJbGVhCXIxNCxbcmF4KjErcjE0XQorCisJY21wCXJieCwwCisJamUJTkVBUiAkTCRTTE9XX0RFQ1JZUFQKKworCisJdGVzdAlyMTAsLTE2CisJbW92CWVheCxEV09SRFtyYnBdCisJbW92CWVieCxEV09SRFs0K3JicF0KKwltb3YJZWN4LERXT1JEWzgrcmJwXQorCW1vdgllZHgsRFdPUkRbMTIrcmJwXQorCWp6CU5FQVIgJEwkY2JjX3Nsb3dfZW5jX3RhaWwKKworQUxJR04JNAorJEwkY2JjX3Nsb3dfZW5jX2xvb3A6CisJeG9yCWVheCxEV09SRFtyOF0KKwl4b3IJZWJ4LERXT1JEWzQrcjhdCisJeG9yCWVjeCxEV09SRFs4K3I4XQorCXhvcgllZHgsRFdPUkRbMTIrcjhdCisJbW92CXIxNSxRV09SRFtyc3BdCisJbW92CVFXT1JEWzI0K3JzcF0scjgKKwltb3YJUVdPUkRbMzIrcnNwXSxyOQorCW1vdglRV09SRFs0MCtyc3BdLHIxMAorCisJY2FsbAlfeDg2XzY0X0FFU19lbmNyeXB0X2NvbXBhY3QKKworCW1vdglyOCxRV09SRFsyNCtyc3BdCisJbW92CXI5LFFXT1JEWzMyK3JzcF0KKwltb3YJcjEwLFFXT1JEWzQwK3JzcF0KKwltb3YJRFdPUkRbcjldLGVheAorCW1vdglEV09SRFs0K3I5XSxlYngKKwltb3YJRFdPUkRbOCtyOV0sZWN4CisJbW92CURXT1JEWzEyK3I5XSxlZHgKKworCWxlYQlyOCxbMTYrcjhdCisJbGVhCXI5LFsxNityOV0KKwlzdWIJcjEwLDE2CisJdGVzdAlyMTAsLTE2CisJam56CU5FQVIgJEwkY2JjX3Nsb3dfZW5jX2xvb3AKKwl0ZXN0CXIxMCwxNQorCWpueglORUFSICRMJGNiY19zbG93X2VuY190YWlsCisJbW92CXJicCxRV09SRFs1Nityc3BdCisJbW92CURXT1JEW3JicF0sZWF4CisJbW92CURXT1JEWzQrcmJwXSxlYngKKwltb3YJRFdPUkRbOCtyYnBdLGVjeAorCW1vdglEV09SRFsxMityYnBdLGVkeAorCisJam1wCU5FQVIgJEwkY2JjX2V4aXQKKworQUxJR04JNAorJEwkY2JjX3Nsb3dfZW5jX3RhaWw6CisJbW92CXIxMSxyYXgKKwltb3YJcjEyLHJjeAorCW1vdglyY3gscjEwCisJbW92CXJzaSxyOAorCW1vdglyZGkscjkKKwlERAkweDkwNjZBNEYzCisJbW92CXJjeCwxNgorCXN1YglyY3gscjEwCisJeG9yCXJheCxyYXgKKwlERAkweDkwNjZBQUYzCisJbW92CXI4LHI5CisJbW92CXIxMCwxNgorCW1vdglyYXgscjExCisJbW92CXJjeCxyMTIKKwlqbXAJTkVBUiAkTCRjYmNfc2xvd19lbmNfbG9vcAorCitBTElHTgkxNgorJEwkU0xPV19ERUNSWVBUOgorCXNocglyYXgsMworCWFkZAlyMTQscmF4CisKKwltb3YJcjExLFFXT1JEW3JicF0KKwltb3YJcjEyLFFXT1JEWzgrcmJwXQorCW1vdglRV09SRFsoKDArNjQpKStyc3BdLHIxMQorCW1vdglRV09SRFsoKDgrNjQpKStyc3BdLHIxMgorCitBTElHTgk0CiskTCRjYmNfc2xvd19kZWNfbG9vcDoKKwltb3YJZWF4LERXT1JEW3I4XQorCW1vdgllYngsRFdPUkRbNCtyOF0KKwltb3YJZWN4LERXT1JEWzgrcjhdCisJbW92CWVkeCxEV09SRFsxMityOF0KKwltb3YJcjE1LFFXT1JEW3JzcF0KKwltb3YJUVdPUkRbMjQrcnNwXSxyOAorCW1vdglRV09SRFszMityc3BdLHI5CisJbW92CVFXT1JEWzQwK3JzcF0scjEwCisKKwljYWxsCV94ODZfNjRfQUVTX2RlY3J5cHRfY29tcGFjdAorCisJbW92CXI4LFFXT1JEWzI0K3JzcF0KKwltb3YJcjksUVdPUkRbMzIrcnNwXQorCW1vdglyMTAsUVdPUkRbNDArcnNwXQorCXhvcgllYXgsRFdPUkRbKCgwKzY0KSkrcnNwXQorCXhvcgllYngsRFdPUkRbKCg0KzY0KSkrcnNwXQorCXhvcgllY3gsRFdPUkRbKCg4KzY0KSkrcnNwXQorCXhvcgllZHgsRFdPUkRbKCgxMis2NCkpK3JzcF0KKworCW1vdglyMTEsUVdPUkRbcjhdCisJbW92CXIxMixRV09SRFs4K3I4XQorCXN1YglyMTAsMTYKKwlqYwlORUFSICRMJGNiY19zbG93X2RlY19wYXJ0aWFsCisJanoJTkVBUiAkTCRjYmNfc2xvd19kZWNfZG9uZQorCisJbW92CVFXT1JEWygoMCs2NCkpK3JzcF0scjExCisJbW92CVFXT1JEWygoOCs2NCkpK3JzcF0scjEyCisKKwltb3YJRFdPUkRbcjldLGVheAorCW1vdglEV09SRFs0K3I5XSxlYngKKwltb3YJRFdPUkRbOCtyOV0sZWN4CisJbW92CURXT1JEWzEyK3I5XSxlZHgKKworCWxlYQlyOCxbMTYrcjhdCisJbGVhCXI5LFsxNityOV0KKwlqbXAJTkVBUiAkTCRjYmNfc2xvd19kZWNfbG9vcAorJEwkY2JjX3Nsb3dfZGVjX2RvbmU6CisJbW92CXJkaSxRV09SRFs1Nityc3BdCisJbW92CVFXT1JEW3JkaV0scjExCisJbW92CVFXT1JEWzgrcmRpXSxyMTIKKworCW1vdglEV09SRFtyOV0sZWF4CisJbW92CURXT1JEWzQrcjldLGVieAorCW1vdglEV09SRFs4K3I5XSxlY3gKKwltb3YJRFdPUkRbMTIrcjldLGVkeAorCisJam1wCU5FQVIgJEwkY2JjX2V4aXQKKworQUxJR04JNAorJEwkY2JjX3Nsb3dfZGVjX3BhcnRpYWw6CisJbW92CXJkaSxRV09SRFs1Nityc3BdCisJbW92CVFXT1JEW3JkaV0scjExCisJbW92CVFXT1JEWzgrcmRpXSxyMTIKKworCW1vdglEV09SRFsoKDArNjQpKStyc3BdLGVheAorCW1vdglEV09SRFsoKDQrNjQpKStyc3BdLGVieAorCW1vdglEV09SRFsoKDgrNjQpKStyc3BdLGVjeAorCW1vdglEV09SRFsoKDEyKzY0KSkrcnNwXSxlZHgKKworCW1vdglyZGkscjkKKwlsZWEJcnNpLFs2NCtyc3BdCisJbGVhCXJjeCxbMTYrcjEwXQorCURECTB4OTA2NkE0RjMKKwlqbXAJTkVBUiAkTCRjYmNfZXhpdAorCitBTElHTgkxNgorJEwkY2JjX2V4aXQ6CisJbW92CXJzaSxRV09SRFsxNityc3BdCisKKwltb3YJcjE1LFFXT1JEW3JzaV0KKworCW1vdglyMTQsUVdPUkRbOCtyc2ldCisKKwltb3YJcjEzLFFXT1JEWzE2K3JzaV0KKworCW1vdglyMTIsUVdPUkRbMjQrcnNpXQorCisJbW92CXJicCxRV09SRFszMityc2ldCisKKwltb3YJcmJ4LFFXT1JEWzQwK3JzaV0KKworCWxlYQlyc3AsWzQ4K3JzaV0KKworJEwkY2JjX3BvcGZxOgorCXBvcGZxCisKKyRMJGNiY19lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXNfbm9od19jYmNfZW5jcnlwdDoKK0FMSUdOCTY0CiskTCRBRVNfVGU6CisJREQJMHhhNTYzNjNjNiwweGE1NjM2M2M2CisJREQJMHg4NDdjN2NmOCwweDg0N2M3Y2Y4CisJREQJMHg5OTc3NzdlZSwweDk5Nzc3N2VlCisJREQJMHg4ZDdiN2JmNiwweDhkN2I3YmY2CisJREQJMHgwZGYyZjJmZiwweDBkZjJmMmZmCisJREQJMHhiZDZiNmJkNiwweGJkNmI2YmQ2CisJREQJMHhiMTZmNmZkZSwweGIxNmY2ZmRlCisJREQJMHg1NGM1YzU5MSwweDU0YzVjNTkxCisJREQJMHg1MDMwMzA2MCwweDUwMzAzMDYwCisJREQJMHgwMzAxMDEwMiwweDAzMDEwMTAyCisJREQJMHhhOTY3NjdjZSwweGE5Njc2N2NlCisJREQJMHg3ZDJiMmI1NiwweDdkMmIyYjU2CisJREQJMHgxOWZlZmVlNywweDE5ZmVmZWU3CisJREQJMHg2MmQ3ZDdiNSwweDYyZDdkN2I1CisJREQJMHhlNmFiYWI0ZCwweGU2YWJhYjRkCisJREQJMHg5YTc2NzZlYywweDlhNzY3NmVjCisJREQJMHg0NWNhY2E4ZiwweDQ1Y2FjYThmCisJREQJMHg5ZDgyODIxZiwweDlkODI4MjFmCisJREQJMHg0MGM5Yzk4OSwweDQwYzljOTg5CisJREQJMHg4NzdkN2RmYSwweDg3N2Q3ZGZhCisJREQJMHgxNWZhZmFlZiwweDE1ZmFmYWVmCisJREQJMHhlYjU5NTliMiwweGViNTk1OWIyCisJREQJMHhjOTQ3NDc4ZSwweGM5NDc0NzhlCisJREQJMHgwYmYwZjBmYiwweDBiZjBmMGZiCisJREQJMHhlY2FkYWQ0MSwweGVjYWRhZDQxCisJREQJMHg2N2Q0ZDRiMywweDY3ZDRkNGIzCisJREQJMHhmZGEyYTI1ZiwweGZkYTJhMjVmCisJREQJMHhlYWFmYWY0NSwweGVhYWZhZjQ1CisJREQJMHhiZjljOWMyMywweGJmOWM5YzIzCisJREQJMHhmN2E0YTQ1MywweGY3YTRhNDUzCisJREQJMHg5NjcyNzJlNCwweDk2NzI3MmU0CisJREQJMHg1YmMwYzA5YiwweDViYzBjMDliCisJREQJMHhjMmI3Yjc3NSwweGMyYjdiNzc1CisJREQJMHgxY2ZkZmRlMSwweDFjZmRmZGUxCisJREQJMHhhZTkzOTMzZCwweGFlOTM5MzNkCisJREQJMHg2YTI2MjY0YywweDZhMjYyNjRjCisJREQJMHg1YTM2MzY2YywweDVhMzYzNjZjCisJREQJMHg0MTNmM2Y3ZSwweDQxM2YzZjdlCisJREQJMHgwMmY3ZjdmNSwweDAyZjdmN2Y1CisJREQJMHg0ZmNjY2M4MywweDRmY2NjYzgzCisJREQJMHg1YzM0MzQ2OCwweDVjMzQzNDY4CisJREQJMHhmNGE1YTU1MSwweGY0YTVhNTUxCisJREQJMHgzNGU1ZTVkMSwweDM0ZTVlNWQxCisJREQJMHgwOGYxZjFmOSwweDA4ZjFmMWY5CisJREQJMHg5MzcxNzFlMiwweDkzNzE3MWUyCisJREQJMHg3M2Q4ZDhhYiwweDczZDhkOGFiCisJREQJMHg1MzMxMzE2MiwweDUzMzEzMTYyCisJREQJMHgzZjE1MTUyYSwweDNmMTUxNTJhCisJREQJMHgwYzA0MDQwOCwweDBjMDQwNDA4CisJREQJMHg1MmM3Yzc5NSwweDUyYzdjNzk1CisJREQJMHg2NTIzMjM0NiwweDY1MjMyMzQ2CisJREQJMHg1ZWMzYzM5ZCwweDVlYzNjMzlkCisJREQJMHgyODE4MTgzMCwweDI4MTgxODMwCisJREQJMHhhMTk2OTYzNywweGExOTY5NjM3CisJREQJMHgwZjA1MDUwYSwweDBmMDUwNTBhCisJREQJMHhiNTlhOWEyZiwweGI1OWE5YTJmCisJREQJMHgwOTA3MDcwZSwweDA5MDcwNzBlCisJREQJMHgzNjEyMTIyNCwweDM2MTIxMjI0CisJREQJMHg5YjgwODAxYiwweDliODA4MDFiCisJREQJMHgzZGUyZTJkZiwweDNkZTJlMmRmCisJREQJMHgyNmViZWJjZCwweDI2ZWJlYmNkCisJREQJMHg2OTI3Mjc0ZSwweDY5MjcyNzRlCisJREQJMHhjZGIyYjI3ZiwweGNkYjJiMjdmCisJREQJMHg5Zjc1NzVlYSwweDlmNzU3NWVhCisJREQJMHgxYjA5MDkxMiwweDFiMDkwOTEyCisJREQJMHg5ZTgzODMxZCwweDllODM4MzFkCisJREQJMHg3NDJjMmM1OCwweDc0MmMyYzU4CisJREQJMHgyZTFhMWEzNCwweDJlMWExYTM0CisJREQJMHgyZDFiMWIzNiwweDJkMWIxYjM2CisJREQJMHhiMjZlNmVkYywweGIyNmU2ZWRjCisJREQJMHhlZTVhNWFiNCwweGVlNWE1YWI0CisJREQJMHhmYmEwYTA1YiwweGZiYTBhMDViCisJREQJMHhmNjUyNTJhNCwweGY2NTI1MmE0CisJREQJMHg0ZDNiM2I3NiwweDRkM2IzYjc2CisJREQJMHg2MWQ2ZDZiNywweDYxZDZkNmI3CisJREQJMHhjZWIzYjM3ZCwweGNlYjNiMzdkCisJREQJMHg3YjI5Mjk1MiwweDdiMjkyOTUyCisJREQJMHgzZWUzZTNkZCwweDNlZTNlM2RkCisJREQJMHg3MTJmMmY1ZSwweDcxMmYyZjVlCisJREQJMHg5Nzg0ODQxMywweDk3ODQ4NDEzCisJREQJMHhmNTUzNTNhNiwweGY1NTM1M2E2CisJREQJMHg2OGQxZDFiOSwweDY4ZDFkMWI5CisJREQJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJREQJMHgyY2VkZWRjMSwweDJjZWRlZGMxCisJREQJMHg2MDIwMjA0MCwweDYwMjAyMDQwCisJREQJMHgxZmZjZmNlMywweDFmZmNmY2UzCisJREQJMHhjOGIxYjE3OSwweGM4YjFiMTc5CisJREQJMHhlZDViNWJiNiwweGVkNWI1YmI2CisJREQJMHhiZTZhNmFkNCwweGJlNmE2YWQ0CisJREQJMHg0NmNiY2I4ZCwweDQ2Y2JjYjhkCisJREQJMHhkOWJlYmU2NywweGQ5YmViZTY3CisJREQJMHg0YjM5Mzk3MiwweDRiMzkzOTcyCisJREQJMHhkZTRhNGE5NCwweGRlNGE0YTk0CisJREQJMHhkNDRjNGM5OCwweGQ0NGM0Yzk4CisJREQJMHhlODU4NThiMCwweGU4NTg1OGIwCisJREQJMHg0YWNmY2Y4NSwweDRhY2ZjZjg1CisJREQJMHg2YmQwZDBiYiwweDZiZDBkMGJiCisJREQJMHgyYWVmZWZjNSwweDJhZWZlZmM1CisJREQJMHhlNWFhYWE0ZiwweGU1YWFhYTRmCisJREQJMHgxNmZiZmJlZCwweDE2ZmJmYmVkCisJREQJMHhjNTQzNDM4NiwweGM1NDM0Mzg2CisJREQJMHhkNzRkNGQ5YSwweGQ3NGQ0ZDlhCisJREQJMHg1NTMzMzM2NiwweDU1MzMzMzY2CisJREQJMHg5NDg1ODUxMSwweDk0ODU4NTExCisJREQJMHhjZjQ1NDU4YSwweGNmNDU0NThhCisJREQJMHgxMGY5ZjllOSwweDEwZjlmOWU5CisJREQJMHgwNjAyMDIwNCwweDA2MDIwMjA0CisJREQJMHg4MTdmN2ZmZSwweDgxN2Y3ZmZlCisJREQJMHhmMDUwNTBhMCwweGYwNTA1MGEwCisJREQJMHg0NDNjM2M3OCwweDQ0M2MzYzc4CisJREQJMHhiYTlmOWYyNSwweGJhOWY5ZjI1CisJREQJMHhlM2E4YTg0YiwweGUzYThhODRiCisJREQJMHhmMzUxNTFhMiwweGYzNTE1MWEyCisJREQJMHhmZWEzYTM1ZCwweGZlYTNhMzVkCisJREQJMHhjMDQwNDA4MCwweGMwNDA0MDgwCisJREQJMHg4YThmOGYwNSwweDhhOGY4ZjA1CisJREQJMHhhZDkyOTIzZiwweGFkOTI5MjNmCisJREQJMHhiYzlkOWQyMSwweGJjOWQ5ZDIxCisJREQJMHg0ODM4Mzg3MCwweDQ4MzgzODcwCisJREQJMHgwNGY1ZjVmMSwweDA0ZjVmNWYxCisJREQJMHhkZmJjYmM2MywweGRmYmNiYzYzCisJREQJMHhjMWI2YjY3NywweGMxYjZiNjc3CisJREQJMHg3NWRhZGFhZiwweDc1ZGFkYWFmCisJREQJMHg2MzIxMjE0MiwweDYzMjEyMTQyCisJREQJMHgzMDEwMTAyMCwweDMwMTAxMDIwCisJREQJMHgxYWZmZmZlNSwweDFhZmZmZmU1CisJREQJMHgwZWYzZjNmZCwweDBlZjNmM2ZkCisJREQJMHg2ZGQyZDJiZiwweDZkZDJkMmJmCisJREQJMHg0Y2NkY2Q4MSwweDRjY2RjZDgxCisJREQJMHgxNDBjMGMxOCwweDE0MGMwYzE4CisJREQJMHgzNTEzMTMyNiwweDM1MTMxMzI2CisJREQJMHgyZmVjZWNjMywweDJmZWNlY2MzCisJREQJMHhlMTVmNWZiZSwweGUxNWY1ZmJlCisJREQJMHhhMjk3OTczNSwweGEyOTc5NzM1CisJREQJMHhjYzQ0NDQ4OCwweGNjNDQ0NDg4CisJREQJMHgzOTE3MTcyZSwweDM5MTcxNzJlCisJREQJMHg1N2M0YzQ5MywweDU3YzRjNDkzCisJREQJMHhmMmE3YTc1NSwweGYyYTdhNzU1CisJREQJMHg4MjdlN2VmYywweDgyN2U3ZWZjCisJREQJMHg0NzNkM2Q3YSwweDQ3M2QzZDdhCisJREQJMHhhYzY0NjRjOCwweGFjNjQ2NGM4CisJREQJMHhlNzVkNWRiYSwweGU3NWQ1ZGJhCisJREQJMHgyYjE5MTkzMiwweDJiMTkxOTMyCisJREQJMHg5NTczNzNlNiwweDk1NzM3M2U2CisJREQJMHhhMDYwNjBjMCwweGEwNjA2MGMwCisJREQJMHg5ODgxODExOSwweDk4ODE4MTE5CisJREQJMHhkMTRmNGY5ZSwweGQxNGY0ZjllCisJREQJMHg3ZmRjZGNhMywweDdmZGNkY2EzCisJREQJMHg2NjIyMjI0NCwweDY2MjIyMjQ0CisJREQJMHg3ZTJhMmE1NCwweDdlMmEyYTU0CisJREQJMHhhYjkwOTAzYiwweGFiOTA5MDNiCisJREQJMHg4Mzg4ODgwYiwweDgzODg4ODBiCisJREQJMHhjYTQ2NDY4YywweGNhNDY0NjhjCisJREQJMHgyOWVlZWVjNywweDI5ZWVlZWM3CisJREQJMHhkM2I4Yjg2YiwweGQzYjhiODZiCisJREQJMHgzYzE0MTQyOCwweDNjMTQxNDI4CisJREQJMHg3OWRlZGVhNywweDc5ZGVkZWE3CisJREQJMHhlMjVlNWViYywweGUyNWU1ZWJjCisJREQJMHgxZDBiMGIxNiwweDFkMGIwYjE2CisJREQJMHg3NmRiZGJhZCwweDc2ZGJkYmFkCisJREQJMHgzYmUwZTBkYiwweDNiZTBlMGRiCisJREQJMHg1NjMyMzI2NCwweDU2MzIzMjY0CisJREQJMHg0ZTNhM2E3NCwweDRlM2EzYTc0CisJREQJMHgxZTBhMGExNCwweDFlMGEwYTE0CisJREQJMHhkYjQ5NDk5MiwweGRiNDk0OTkyCisJREQJMHgwYTA2MDYwYywweDBhMDYwNjBjCisJREQJMHg2YzI0MjQ0OCwweDZjMjQyNDQ4CisJREQJMHhlNDVjNWNiOCwweGU0NWM1Y2I4CisJREQJMHg1ZGMyYzI5ZiwweDVkYzJjMjlmCisJREQJMHg2ZWQzZDNiZCwweDZlZDNkM2JkCisJREQJMHhlZmFjYWM0MywweGVmYWNhYzQzCisJREQJMHhhNjYyNjJjNCwweGE2NjI2MmM0CisJREQJMHhhODkxOTEzOSwweGE4OTE5MTM5CisJREQJMHhhNDk1OTUzMSwweGE0OTU5NTMxCisJREQJMHgzN2U0ZTRkMywweDM3ZTRlNGQzCisJREQJMHg4Yjc5NzlmMiwweDhiNzk3OWYyCisJREQJMHgzMmU3ZTdkNSwweDMyZTdlN2Q1CisJREQJMHg0M2M4Yzg4YiwweDQzYzhjODhiCisJREQJMHg1OTM3Mzc2ZSwweDU5MzczNzZlCisJREQJMHhiNzZkNmRkYSwweGI3NmQ2ZGRhCisJREQJMHg4YzhkOGQwMSwweDhjOGQ4ZDAxCisJREQJMHg2NGQ1ZDViMSwweDY0ZDVkNWIxCisJREQJMHhkMjRlNGU5YywweGQyNGU0ZTljCisJREQJMHhlMGE5YTk0OSwweGUwYTlhOTQ5CisJREQJMHhiNDZjNmNkOCwweGI0NmM2Y2Q4CisJREQJMHhmYTU2NTZhYywweGZhNTY1NmFjCisJREQJMHgwN2Y0ZjRmMywweDA3ZjRmNGYzCisJREQJMHgyNWVhZWFjZiwweDI1ZWFlYWNmCisJREQJMHhhZjY1NjVjYSwweGFmNjU2NWNhCisJREQJMHg4ZTdhN2FmNCwweDhlN2E3YWY0CisJREQJMHhlOWFlYWU0NywweGU5YWVhZTQ3CisJREQJMHgxODA4MDgxMCwweDE4MDgwODEwCisJREQJMHhkNWJhYmE2ZiwweGQ1YmFiYTZmCisJREQJMHg4ODc4NzhmMCwweDg4Nzg3OGYwCisJREQJMHg2ZjI1MjU0YSwweDZmMjUyNTRhCisJREQJMHg3MjJlMmU1YywweDcyMmUyZTVjCisJREQJMHgyNDFjMWMzOCwweDI0MWMxYzM4CisJREQJMHhmMWE2YTY1NywweGYxYTZhNjU3CisJREQJMHhjN2I0YjQ3MywweGM3YjRiNDczCisJREQJMHg1MWM2YzY5NywweDUxYzZjNjk3CisJREQJMHgyM2U4ZThjYiwweDIzZThlOGNiCisJREQJMHg3Y2RkZGRhMSwweDdjZGRkZGExCisJREQJMHg5Yzc0NzRlOCwweDljNzQ3NGU4CisJREQJMHgyMTFmMWYzZSwweDIxMWYxZjNlCisJREQJMHhkZDRiNGI5NiwweGRkNGI0Yjk2CisJREQJMHhkY2JkYmQ2MSwweGRjYmRiZDYxCisJREQJMHg4NjhiOGIwZCwweDg2OGI4YjBkCisJREQJMHg4NThhOGEwZiwweDg1OGE4YTBmCisJREQJMHg5MDcwNzBlMCwweDkwNzA3MGUwCisJREQJMHg0MjNlM2U3YywweDQyM2UzZTdjCisJREQJMHhjNGI1YjU3MSwweGM0YjViNTcxCisJREQJMHhhYTY2NjZjYywweGFhNjY2NmNjCisJREQJMHhkODQ4NDg5MCwweGQ4NDg0ODkwCisJREQJMHgwNTAzMDMwNiwweDA1MDMwMzA2CisJREQJMHgwMWY2ZjZmNywweDAxZjZmNmY3CisJREQJMHgxMjBlMGUxYywweDEyMGUwZTFjCisJREQJMHhhMzYxNjFjMiwweGEzNjE2MWMyCisJREQJMHg1ZjM1MzU2YSwweDVmMzUzNTZhCisJREQJMHhmOTU3NTdhZSwweGY5NTc1N2FlCisJREQJMHhkMGI5Yjk2OSwweGQwYjliOTY5CisJREQJMHg5MTg2ODYxNywweDkxODY4NjE3CisJREQJMHg1OGMxYzE5OSwweDU4YzFjMTk5CisJREQJMHgyNzFkMWQzYSwweDI3MWQxZDNhCisJREQJMHhiOTllOWUyNywweGI5OWU5ZTI3CisJREQJMHgzOGUxZTFkOSwweDM4ZTFlMWQ5CisJREQJMHgxM2Y4ZjhlYiwweDEzZjhmOGViCisJREQJMHhiMzk4OTgyYiwweGIzOTg5ODJiCisJREQJMHgzMzExMTEyMiwweDMzMTExMTIyCisJREQJMHhiYjY5NjlkMiwweGJiNjk2OWQyCisJREQJMHg3MGQ5ZDlhOSwweDcwZDlkOWE5CisJREQJMHg4OThlOGUwNywweDg5OGU4ZTA3CisJREQJMHhhNzk0OTQzMywweGE3OTQ5NDMzCisJREQJMHhiNjliOWIyZCwweGI2OWI5YjJkCisJREQJMHgyMjFlMWUzYywweDIyMWUxZTNjCisJREQJMHg5Mjg3ODcxNSwweDkyODc4NzE1CisJREQJMHgyMGU5ZTljOSwweDIwZTllOWM5CisJREQJMHg0OWNlY2U4NywweDQ5Y2VjZTg3CisJREQJMHhmZjU1NTVhYSwweGZmNTU1NWFhCisJREQJMHg3ODI4Mjg1MCwweDc4MjgyODUwCisJREQJMHg3YWRmZGZhNSwweDdhZGZkZmE1CisJREQJMHg4ZjhjOGMwMywweDhmOGM4YzAzCisJREQJMHhmOGExYTE1OSwweGY4YTFhMTU5CisJREQJMHg4MDg5ODkwOSwweDgwODk4OTA5CisJREQJMHgxNzBkMGQxYSwweDE3MGQwZDFhCisJREQJMHhkYWJmYmY2NSwweGRhYmZiZjY1CisJREQJMHgzMWU2ZTZkNywweDMxZTZlNmQ3CisJREQJMHhjNjQyNDI4NCwweGM2NDI0Mjg0CisJREQJMHhiODY4NjhkMCwweGI4Njg2OGQwCisJREQJMHhjMzQxNDE4MiwweGMzNDE0MTgyCisJREQJMHhiMDk5OTkyOSwweGIwOTk5OTI5CisJREQJMHg3NzJkMmQ1YSwweDc3MmQyZDVhCisJREQJMHgxMTBmMGYxZSwweDExMGYwZjFlCisJREQJMHhjYmIwYjA3YiwweGNiYjBiMDdiCisJREQJMHhmYzU0NTRhOCwweGZjNTQ1NGE4CisJREQJMHhkNmJiYmI2ZCwweGQ2YmJiYjZkCisJREQJMHgzYTE2MTYyYywweDNhMTYxNjJjCitEQgkweDYzLDB4N2MsMHg3NywweDdiLDB4ZjIsMHg2YiwweDZmLDB4YzUKK0RCCTB4MzAsMHgwMSwweDY3LDB4MmIsMHhmZSwweGQ3LDB4YWIsMHg3NgorREIJMHhjYSwweDgyLDB4YzksMHg3ZCwweGZhLDB4NTksMHg0NywweGYwCitEQgkweGFkLDB4ZDQsMHhhMiwweGFmLDB4OWMsMHhhNCwweDcyLDB4YzAKK0RCCTB4YjcsMHhmZCwweDkzLDB4MjYsMHgzNiwweDNmLDB4ZjcsMHhjYworREIJMHgzNCwweGE1LDB4ZTUsMHhmMSwweDcxLDB4ZDgsMHgzMSwweDE1CitEQgkweDA0LDB4YzcsMHgyMywweGMzLDB4MTgsMHg5NiwweDA1LDB4OWEKK0RCCTB4MDcsMHgxMiwweDgwLDB4ZTIsMHhlYiwweDI3LDB4YjIsMHg3NQorREIJMHgwOSwweDgzLDB4MmMsMHgxYSwweDFiLDB4NmUsMHg1YSwweGEwCitEQgkweDUyLDB4M2IsMHhkNiwweGIzLDB4MjksMHhlMywweDJmLDB4ODQKK0RCCTB4NTMsMHhkMSwweDAwLDB4ZWQsMHgyMCwweGZjLDB4YjEsMHg1YgorREIJMHg2YSwweGNiLDB4YmUsMHgzOSwweDRhLDB4NGMsMHg1OCwweGNmCitEQgkweGQwLDB4ZWYsMHhhYSwweGZiLDB4NDMsMHg0ZCwweDMzLDB4ODUKK0RCCTB4NDUsMHhmOSwweDAyLDB4N2YsMHg1MCwweDNjLDB4OWYsMHhhOAorREIJMHg1MSwweGEzLDB4NDAsMHg4ZiwweDkyLDB4OWQsMHgzOCwweGY1CitEQgkweGJjLDB4YjYsMHhkYSwweDIxLDB4MTAsMHhmZiwweGYzLDB4ZDIKK0RCCTB4Y2QsMHgwYywweDEzLDB4ZWMsMHg1ZiwweDk3LDB4NDQsMHgxNworREIJMHhjNCwweGE3LDB4N2UsMHgzZCwweDY0LDB4NWQsMHgxOSwweDczCitEQgkweDYwLDB4ODEsMHg0ZiwweGRjLDB4MjIsMHgyYSwweDkwLDB4ODgKK0RCCTB4NDYsMHhlZSwweGI4LDB4MTQsMHhkZSwweDVlLDB4MGIsMHhkYgorREIJMHhlMCwweDMyLDB4M2EsMHgwYSwweDQ5LDB4MDYsMHgyNCwweDVjCitEQgkweGMyLDB4ZDMsMHhhYywweDYyLDB4OTEsMHg5NSwweGU0LDB4NzkKK0RCCTB4ZTcsMHhjOCwweDM3LDB4NmQsMHg4ZCwweGQ1LDB4NGUsMHhhOQorREIJMHg2YywweDU2LDB4ZjQsMHhlYSwweDY1LDB4N2EsMHhhZSwweDA4CitEQgkweGJhLDB4NzgsMHgyNSwweDJlLDB4MWMsMHhhNiwweGI0LDB4YzYKK0RCCTB4ZTgsMHhkZCwweDc0LDB4MWYsMHg0YiwweGJkLDB4OGIsMHg4YQorREIJMHg3MCwweDNlLDB4YjUsMHg2NiwweDQ4LDB4MDMsMHhmNiwweDBlCitEQgkweDYxLDB4MzUsMHg1NywweGI5LDB4ODYsMHhjMSwweDFkLDB4OWUKK0RCCTB4ZTEsMHhmOCwweDk4LDB4MTEsMHg2OSwweGQ5LDB4OGUsMHg5NAorREIJMHg5YiwweDFlLDB4ODcsMHhlOSwweGNlLDB4NTUsMHgyOCwweGRmCitEQgkweDhjLDB4YTEsMHg4OSwweDBkLDB4YmYsMHhlNiwweDQyLDB4NjgKK0RCCTB4NDEsMHg5OSwweDJkLDB4MGYsMHhiMCwweDU0LDB4YmIsMHgxNgorREIJMHg2MywweDdjLDB4NzcsMHg3YiwweGYyLDB4NmIsMHg2ZiwweGM1CitEQgkweDMwLDB4MDEsMHg2NywweDJiLDB4ZmUsMHhkNywweGFiLDB4NzYKK0RCCTB4Y2EsMHg4MiwweGM5LDB4N2QsMHhmYSwweDU5LDB4NDcsMHhmMAorREIJMHhhZCwweGQ0LDB4YTIsMHhhZiwweDljLDB4YTQsMHg3MiwweGMwCitEQgkweGI3LDB4ZmQsMHg5MywweDI2LDB4MzYsMHgzZiwweGY3LDB4Y2MKK0RCCTB4MzQsMHhhNSwweGU1LDB4ZjEsMHg3MSwweGQ4LDB4MzEsMHgxNQorREIJMHgwNCwweGM3LDB4MjMsMHhjMywweDE4LDB4OTYsMHgwNSwweDlhCitEQgkweDA3LDB4MTIsMHg4MCwweGUyLDB4ZWIsMHgyNywweGIyLDB4NzUKK0RCCTB4MDksMHg4MywweDJjLDB4MWEsMHgxYiwweDZlLDB4NWEsMHhhMAorREIJMHg1MiwweDNiLDB4ZDYsMHhiMywweDI5LDB4ZTMsMHgyZiwweDg0CitEQgkweDUzLDB4ZDEsMHgwMCwweGVkLDB4MjAsMHhmYywweGIxLDB4NWIKK0RCCTB4NmEsMHhjYiwweGJlLDB4MzksMHg0YSwweDRjLDB4NTgsMHhjZgorREIJMHhkMCwweGVmLDB4YWEsMHhmYiwweDQzLDB4NGQsMHgzMywweDg1CitEQgkweDQ1LDB4ZjksMHgwMiwweDdmLDB4NTAsMHgzYywweDlmLDB4YTgKK0RCCTB4NTEsMHhhMywweDQwLDB4OGYsMHg5MiwweDlkLDB4MzgsMHhmNQorREIJMHhiYywweGI2LDB4ZGEsMHgyMSwweDEwLDB4ZmYsMHhmMywweGQyCitEQgkweGNkLDB4MGMsMHgxMywweGVjLDB4NWYsMHg5NywweDQ0LDB4MTcKK0RCCTB4YzQsMHhhNywweDdlLDB4M2QsMHg2NCwweDVkLDB4MTksMHg3MworREIJMHg2MCwweDgxLDB4NGYsMHhkYywweDIyLDB4MmEsMHg5MCwweDg4CitEQgkweDQ2LDB4ZWUsMHhiOCwweDE0LDB4ZGUsMHg1ZSwweDBiLDB4ZGIKK0RCCTB4ZTAsMHgzMiwweDNhLDB4MGEsMHg0OSwweDA2LDB4MjQsMHg1YworREIJMHhjMiwweGQzLDB4YWMsMHg2MiwweDkxLDB4OTUsMHhlNCwweDc5CitEQgkweGU3LDB4YzgsMHgzNywweDZkLDB4OGQsMHhkNSwweDRlLDB4YTkKK0RCCTB4NmMsMHg1NiwweGY0LDB4ZWEsMHg2NSwweDdhLDB4YWUsMHgwOAorREIJMHhiYSwweDc4LDB4MjUsMHgyZSwweDFjLDB4YTYsMHhiNCwweGM2CitEQgkweGU4LDB4ZGQsMHg3NCwweDFmLDB4NGIsMHhiZCwweDhiLDB4OGEKK0RCCTB4NzAsMHgzZSwweGI1LDB4NjYsMHg0OCwweDAzLDB4ZjYsMHgwZQorREIJMHg2MSwweDM1LDB4NTcsMHhiOSwweDg2LDB4YzEsMHgxZCwweDllCitEQgkweGUxLDB4ZjgsMHg5OCwweDExLDB4NjksMHhkOSwweDhlLDB4OTQKK0RCCTB4OWIsMHgxZSwweDg3LDB4ZTksMHhjZSwweDU1LDB4MjgsMHhkZgorREIJMHg4YywweGExLDB4ODksMHgwZCwweGJmLDB4ZTYsMHg0MiwweDY4CitEQgkweDQxLDB4OTksMHgyZCwweDBmLDB4YjAsMHg1NCwweGJiLDB4MTYKK0RCCTB4NjMsMHg3YywweDc3LDB4N2IsMHhmMiwweDZiLDB4NmYsMHhjNQorREIJMHgzMCwweDAxLDB4NjcsMHgyYiwweGZlLDB4ZDcsMHhhYiwweDc2CitEQgkweGNhLDB4ODIsMHhjOSwweDdkLDB4ZmEsMHg1OSwweDQ3LDB4ZjAKK0RCCTB4YWQsMHhkNCwweGEyLDB4YWYsMHg5YywweGE0LDB4NzIsMHhjMAorREIJMHhiNywweGZkLDB4OTMsMHgyNiwweDM2LDB4M2YsMHhmNywweGNjCitEQgkweDM0LDB4YTUsMHhlNSwweGYxLDB4NzEsMHhkOCwweDMxLDB4MTUKK0RCCTB4MDQsMHhjNywweDIzLDB4YzMsMHgxOCwweDk2LDB4MDUsMHg5YQorREIJMHgwNywweDEyLDB4ODAsMHhlMiwweGViLDB4MjcsMHhiMiwweDc1CitEQgkweDA5LDB4ODMsMHgyYywweDFhLDB4MWIsMHg2ZSwweDVhLDB4YTAKK0RCCTB4NTIsMHgzYiwweGQ2LDB4YjMsMHgyOSwweGUzLDB4MmYsMHg4NAorREIJMHg1MywweGQxLDB4MDAsMHhlZCwweDIwLDB4ZmMsMHhiMSwweDViCitEQgkweDZhLDB4Y2IsMHhiZSwweDM5LDB4NGEsMHg0YywweDU4LDB4Y2YKK0RCCTB4ZDAsMHhlZiwweGFhLDB4ZmIsMHg0MywweDRkLDB4MzMsMHg4NQorREIJMHg0NSwweGY5LDB4MDIsMHg3ZiwweDUwLDB4M2MsMHg5ZiwweGE4CitEQgkweDUxLDB4YTMsMHg0MCwweDhmLDB4OTIsMHg5ZCwweDM4LDB4ZjUKK0RCCTB4YmMsMHhiNiwweGRhLDB4MjEsMHgxMCwweGZmLDB4ZjMsMHhkMgorREIJMHhjZCwweDBjLDB4MTMsMHhlYywweDVmLDB4OTcsMHg0NCwweDE3CitEQgkweGM0LDB4YTcsMHg3ZSwweDNkLDB4NjQsMHg1ZCwweDE5LDB4NzMKK0RCCTB4NjAsMHg4MSwweDRmLDB4ZGMsMHgyMiwweDJhLDB4OTAsMHg4OAorREIJMHg0NiwweGVlLDB4YjgsMHgxNCwweGRlLDB4NWUsMHgwYiwweGRiCitEQgkweGUwLDB4MzIsMHgzYSwweDBhLDB4NDksMHgwNiwweDI0LDB4NWMKK0RCCTB4YzIsMHhkMywweGFjLDB4NjIsMHg5MSwweDk1LDB4ZTQsMHg3OQorREIJMHhlNywweGM4LDB4MzcsMHg2ZCwweDhkLDB4ZDUsMHg0ZSwweGE5CitEQgkweDZjLDB4NTYsMHhmNCwweGVhLDB4NjUsMHg3YSwweGFlLDB4MDgKK0RCCTB4YmEsMHg3OCwweDI1LDB4MmUsMHgxYywweGE2LDB4YjQsMHhjNgorREIJMHhlOCwweGRkLDB4NzQsMHgxZiwweDRiLDB4YmQsMHg4YiwweDhhCitEQgkweDcwLDB4M2UsMHhiNSwweDY2LDB4NDgsMHgwMywweGY2LDB4MGUKK0RCCTB4NjEsMHgzNSwweDU3LDB4YjksMHg4NiwweGMxLDB4MWQsMHg5ZQorREIJMHhlMSwweGY4LDB4OTgsMHgxMSwweDY5LDB4ZDksMHg4ZSwweDk0CitEQgkweDliLDB4MWUsMHg4NywweGU5LDB4Y2UsMHg1NSwweDI4LDB4ZGYKK0RCCTB4OGMsMHhhMSwweDg5LDB4MGQsMHhiZiwweGU2LDB4NDIsMHg2OAorREIJMHg0MSwweDk5LDB4MmQsMHgwZiwweGIwLDB4NTQsMHhiYiwweDE2CitEQgkweDYzLDB4N2MsMHg3NywweDdiLDB4ZjIsMHg2YiwweDZmLDB4YzUKK0RCCTB4MzAsMHgwMSwweDY3LDB4MmIsMHhmZSwweGQ3LDB4YWIsMHg3NgorREIJMHhjYSwweDgyLDB4YzksMHg3ZCwweGZhLDB4NTksMHg0NywweGYwCitEQgkweGFkLDB4ZDQsMHhhMiwweGFmLDB4OWMsMHhhNCwweDcyLDB4YzAKK0RCCTB4YjcsMHhmZCwweDkzLDB4MjYsMHgzNiwweDNmLDB4ZjcsMHhjYworREIJMHgzNCwweGE1LDB4ZTUsMHhmMSwweDcxLDB4ZDgsMHgzMSwweDE1CitEQgkweDA0LDB4YzcsMHgyMywweGMzLDB4MTgsMHg5NiwweDA1LDB4OWEKK0RCCTB4MDcsMHgxMiwweDgwLDB4ZTIsMHhlYiwweDI3LDB4YjIsMHg3NQorREIJMHgwOSwweDgzLDB4MmMsMHgxYSwweDFiLDB4NmUsMHg1YSwweGEwCitEQgkweDUyLDB4M2IsMHhkNiwweGIzLDB4MjksMHhlMywweDJmLDB4ODQKK0RCCTB4NTMsMHhkMSwweDAwLDB4ZWQsMHgyMCwweGZjLDB4YjEsMHg1YgorREIJMHg2YSwweGNiLDB4YmUsMHgzOSwweDRhLDB4NGMsMHg1OCwweGNmCitEQgkweGQwLDB4ZWYsMHhhYSwweGZiLDB4NDMsMHg0ZCwweDMzLDB4ODUKK0RCCTB4NDUsMHhmOSwweDAyLDB4N2YsMHg1MCwweDNjLDB4OWYsMHhhOAorREIJMHg1MSwweGEzLDB4NDAsMHg4ZiwweDkyLDB4OWQsMHgzOCwweGY1CitEQgkweGJjLDB4YjYsMHhkYSwweDIxLDB4MTAsMHhmZiwweGYzLDB4ZDIKK0RCCTB4Y2QsMHgwYywweDEzLDB4ZWMsMHg1ZiwweDk3LDB4NDQsMHgxNworREIJMHhjNCwweGE3LDB4N2UsMHgzZCwweDY0LDB4NWQsMHgxOSwweDczCitEQgkweDYwLDB4ODEsMHg0ZiwweGRjLDB4MjIsMHgyYSwweDkwLDB4ODgKK0RCCTB4NDYsMHhlZSwweGI4LDB4MTQsMHhkZSwweDVlLDB4MGIsMHhkYgorREIJMHhlMCwweDMyLDB4M2EsMHgwYSwweDQ5LDB4MDYsMHgyNCwweDVjCitEQgkweGMyLDB4ZDMsMHhhYywweDYyLDB4OTEsMHg5NSwweGU0LDB4NzkKK0RCCTB4ZTcsMHhjOCwweDM3LDB4NmQsMHg4ZCwweGQ1LDB4NGUsMHhhOQorREIJMHg2YywweDU2LDB4ZjQsMHhlYSwweDY1LDB4N2EsMHhhZSwweDA4CitEQgkweGJhLDB4NzgsMHgyNSwweDJlLDB4MWMsMHhhNiwweGI0LDB4YzYKK0RCCTB4ZTgsMHhkZCwweDc0LDB4MWYsMHg0YiwweGJkLDB4OGIsMHg4YQorREIJMHg3MCwweDNlLDB4YjUsMHg2NiwweDQ4LDB4MDMsMHhmNiwweDBlCitEQgkweDYxLDB4MzUsMHg1NywweGI5LDB4ODYsMHhjMSwweDFkLDB4OWUKK0RCCTB4ZTEsMHhmOCwweDk4LDB4MTEsMHg2OSwweGQ5LDB4OGUsMHg5NAorREIJMHg5YiwweDFlLDB4ODcsMHhlOSwweGNlLDB4NTUsMHgyOCwweGRmCitEQgkweDhjLDB4YTEsMHg4OSwweDBkLDB4YmYsMHhlNiwweDQyLDB4NjgKK0RCCTB4NDEsMHg5OSwweDJkLDB4MGYsMHhiMCwweDU0LDB4YmIsMHgxNgorCURECTB4MDAwMDAwMDEsMHgwMDAwMDAwMiwweDAwMDAwMDA0LDB4MDAwMDAwMDgKKwlERAkweDAwMDAwMDEwLDB4MDAwMDAwMjAsMHgwMDAwMDA0MCwweDAwMDAwMDgwCisJREQJMHgwMDAwMDAxYiwweDAwMDAwMDM2LDB4ODA4MDgwODAsMHg4MDgwODA4MAorCURECTB4ZmVmZWZlZmUsMHhmZWZlZmVmZSwweDFiMWIxYjFiLDB4MWIxYjFiMWIKK0FMSUdOCTY0CiskTCRBRVNfVGQ6CisJREQJMHg1MGE3ZjQ1MSwweDUwYTdmNDUxCisJREQJMHg1MzY1NDE3ZSwweDUzNjU0MTdlCisJREQJMHhjM2E0MTcxYSwweGMzYTQxNzFhCisJREQJMHg5NjVlMjczYSwweDk2NWUyNzNhCisJREQJMHhjYjZiYWIzYiwweGNiNmJhYjNiCisJREQJMHhmMTQ1OWQxZiwweGYxNDU5ZDFmCisJREQJMHhhYjU4ZmFhYywweGFiNThmYWFjCisJREQJMHg5MzAzZTM0YiwweDkzMDNlMzRiCisJREQJMHg1NWZhMzAyMCwweDU1ZmEzMDIwCisJREQJMHhmNjZkNzZhZCwweGY2NmQ3NmFkCisJREQJMHg5MTc2Y2M4OCwweDkxNzZjYzg4CisJREQJMHgyNTRjMDJmNSwweDI1NGMwMmY1CisJREQJMHhmY2Q3ZTU0ZiwweGZjZDdlNTRmCisJREQJMHhkN2NiMmFjNSwweGQ3Y2IyYWM1CisJREQJMHg4MDQ0MzUyNiwweDgwNDQzNTI2CisJREQJMHg4ZmEzNjJiNSwweDhmYTM2MmI1CisJREQJMHg0OTVhYjFkZSwweDQ5NWFiMWRlCisJREQJMHg2NzFiYmEyNSwweDY3MWJiYTI1CisJREQJMHg5ODBlZWE0NSwweDk4MGVlYTQ1CisJREQJMHhlMWMwZmU1ZCwweGUxYzBmZTVkCisJREQJMHgwMjc1MmZjMywweDAyNzUyZmMzCisJREQJMHgxMmYwNGM4MSwweDEyZjA0YzgxCisJREQJMHhhMzk3NDY4ZCwweGEzOTc0NjhkCisJREQJMHhjNmY5ZDM2YiwweGM2ZjlkMzZiCisJREQJMHhlNzVmOGYwMywweGU3NWY4ZjAzCisJREQJMHg5NTljOTIxNSwweDk1OWM5MjE1CisJREQJMHhlYjdhNmRiZiwweGViN2E2ZGJmCisJREQJMHhkYTU5NTI5NSwweGRhNTk1Mjk1CisJREQJMHgyZDgzYmVkNCwweDJkODNiZWQ0CisJREQJMHhkMzIxNzQ1OCwweGQzMjE3NDU4CisJREQJMHgyOTY5ZTA0OSwweDI5NjllMDQ5CisJREQJMHg0NGM4Yzk4ZSwweDQ0YzhjOThlCisJREQJMHg2YTg5YzI3NSwweDZhODljMjc1CisJREQJMHg3ODc5OGVmNCwweDc4Nzk4ZWY0CisJREQJMHg2YjNlNTg5OSwweDZiM2U1ODk5CisJREQJMHhkZDcxYjkyNywweGRkNzFiOTI3CisJREQJMHhiNjRmZTFiZSwweGI2NGZlMWJlCisJREQJMHgxN2FkODhmMCwweDE3YWQ4OGYwCisJREQJMHg2NmFjMjBjOSwweDY2YWMyMGM5CisJREQJMHhiNDNhY2U3ZCwweGI0M2FjZTdkCisJREQJMHgxODRhZGY2MywweDE4NGFkZjYzCisJREQJMHg4MjMxMWFlNSwweDgyMzExYWU1CisJREQJMHg2MDMzNTE5NywweDYwMzM1MTk3CisJREQJMHg0NTdmNTM2MiwweDQ1N2Y1MzYyCisJREQJMHhlMDc3NjRiMSwweGUwNzc2NGIxCisJREQJMHg4NGFlNmJiYiwweDg0YWU2YmJiCisJREQJMHgxY2EwODFmZSwweDFjYTA4MWZlCisJREQJMHg5NDJiMDhmOSwweDk0MmIwOGY5CisJREQJMHg1ODY4NDg3MCwweDU4Njg0ODcwCisJREQJMHgxOWZkNDU4ZiwweDE5ZmQ0NThmCisJREQJMHg4NzZjZGU5NCwweDg3NmNkZTk0CisJREQJMHhiN2Y4N2I1MiwweGI3Zjg3YjUyCisJREQJMHgyM2QzNzNhYiwweDIzZDM3M2FiCisJREQJMHhlMjAyNGI3MiwweGUyMDI0YjcyCisJREQJMHg1NzhmMWZlMywweDU3OGYxZmUzCisJREQJMHgyYWFiNTU2NiwweDJhYWI1NTY2CisJREQJMHgwNzI4ZWJiMiwweDA3MjhlYmIyCisJREQJMHgwM2MyYjUyZiwweDAzYzJiNTJmCisJREQJMHg5YTdiYzU4NiwweDlhN2JjNTg2CisJREQJMHhhNTA4MzdkMywweGE1MDgzN2QzCisJREQJMHhmMjg3MjgzMCwweGYyODcyODMwCisJREQJMHhiMmE1YmYyMywweGIyYTViZjIzCisJREQJMHhiYTZhMDMwMiwweGJhNmEwMzAyCisJREQJMHg1YzgyMTZlZCwweDVjODIxNmVkCisJREQJMHgyYjFjY2Y4YSwweDJiMWNjZjhhCisJREQJMHg5MmI0NzlhNywweDkyYjQ3OWE3CisJREQJMHhmMGYyMDdmMywweGYwZjIwN2YzCisJREQJMHhhMWUyNjk0ZSwweGExZTI2OTRlCisJREQJMHhjZGY0ZGE2NSwweGNkZjRkYTY1CisJREQJMHhkNWJlMDUwNiwweGQ1YmUwNTA2CisJREQJMHgxZjYyMzRkMSwweDFmNjIzNGQxCisJREQJMHg4YWZlYTZjNCwweDhhZmVhNmM0CisJREQJMHg5ZDUzMmUzNCwweDlkNTMyZTM0CisJREQJMHhhMDU1ZjNhMiwweGEwNTVmM2EyCisJREQJMHgzMmUxOGEwNSwweDMyZTE4YTA1CisJREQJMHg3NWViZjZhNCwweDc1ZWJmNmE0CisJREQJMHgzOWVjODMwYiwweDM5ZWM4MzBiCisJREQJMHhhYWVmNjA0MCwweGFhZWY2MDQwCisJREQJMHgwNjlmNzE1ZSwweDA2OWY3MTVlCisJREQJMHg1MTEwNmViZCwweDUxMTA2ZWJkCisJREQJMHhmOThhMjEzZSwweGY5OGEyMTNlCisJREQJMHgzZDA2ZGQ5NiwweDNkMDZkZDk2CisJREQJMHhhZTA1M2VkZCwweGFlMDUzZWRkCisJREQJMHg0NmJkZTY0ZCwweDQ2YmRlNjRkCisJREQJMHhiNThkNTQ5MSwweGI1OGQ1NDkxCisJREQJMHgwNTVkYzQ3MSwweDA1NWRjNDcxCisJREQJMHg2ZmQ0MDYwNCwweDZmZDQwNjA0CisJREQJMHhmZjE1NTA2MCwweGZmMTU1MDYwCisJREQJMHgyNGZiOTgxOSwweDI0ZmI5ODE5CisJREQJMHg5N2U5YmRkNiwweDk3ZTliZGQ2CisJREQJMHhjYzQzNDA4OSwweGNjNDM0MDg5CisJREQJMHg3NzllZDk2NywweDc3OWVkOTY3CisJREQJMHhiZDQyZThiMCwweGJkNDJlOGIwCisJREQJMHg4ODhiODkwNywweDg4OGI4OTA3CisJREQJMHgzODViMTllNywweDM4NWIxOWU3CisJREQJMHhkYmVlYzg3OSwweGRiZWVjODc5CisJREQJMHg0NzBhN2NhMSwweDQ3MGE3Y2ExCisJREQJMHhlOTBmNDI3YywweGU5MGY0MjdjCisJREQJMHhjOTFlODRmOCwweGM5MWU4NGY4CisJREQJMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJREQJMHg4Mzg2ODAwOSwweDgzODY4MDA5CisJREQJMHg0OGVkMmIzMiwweDQ4ZWQyYjMyCisJREQJMHhhYzcwMTExZSwweGFjNzAxMTFlCisJREQJMHg0ZTcyNWE2YywweDRlNzI1YTZjCisJREQJMHhmYmZmMGVmZCwweGZiZmYwZWZkCisJREQJMHg1NjM4ODUwZiwweDU2Mzg4NTBmCisJREQJMHgxZWQ1YWUzZCwweDFlZDVhZTNkCisJREQJMHgyNzM5MmQzNiwweDI3MzkyZDM2CisJREQJMHg2NGQ5MGYwYSwweDY0ZDkwZjBhCisJREQJMHgyMWE2NWM2OCwweDIxYTY1YzY4CisJREQJMHhkMTU0NWI5YiwweGQxNTQ1YjliCisJREQJMHgzYTJlMzYyNCwweDNhMmUzNjI0CisJREQJMHhiMTY3MGEwYywweGIxNjcwYTBjCisJREQJMHgwZmU3NTc5MywweDBmZTc1NzkzCisJREQJMHhkMjk2ZWViNCwweGQyOTZlZWI0CisJREQJMHg5ZTkxOWIxYiwweDllOTE5YjFiCisJREQJMHg0ZmM1YzA4MCwweDRmYzVjMDgwCisJREQJMHhhMjIwZGM2MSwweGEyMjBkYzYxCisJREQJMHg2OTRiNzc1YSwweDY5NGI3NzVhCisJREQJMHgxNjFhMTIxYywweDE2MWExMjFjCisJREQJMHgwYWJhOTNlMiwweDBhYmE5M2UyCisJREQJMHhlNTJhYTBjMCwweGU1MmFhMGMwCisJREQJMHg0M2UwMjIzYywweDQzZTAyMjNjCisJREQJMHgxZDE3MWIxMiwweDFkMTcxYjEyCisJREQJMHgwYjBkMDkwZSwweDBiMGQwOTBlCisJREQJMHhhZGM3OGJmMiwweGFkYzc4YmYyCisJREQJMHhiOWE4YjYyZCwweGI5YThiNjJkCisJREQJMHhjOGE5MWUxNCwweGM4YTkxZTE0CisJREQJMHg4NTE5ZjE1NywweDg1MTlmMTU3CisJREQJMHg0YzA3NzVhZiwweDRjMDc3NWFmCisJREQJMHhiYmRkOTllZSwweGJiZGQ5OWVlCisJREQJMHhmZDYwN2ZhMywweGZkNjA3ZmEzCisJREQJMHg5ZjI2MDFmNywweDlmMjYwMWY3CisJREQJMHhiY2Y1NzI1YywweGJjZjU3MjVjCisJREQJMHhjNTNiNjY0NCwweGM1M2I2NjQ0CisJREQJMHgzNDdlZmI1YiwweDM0N2VmYjViCisJREQJMHg3NjI5NDM4YiwweDc2Mjk0MzhiCisJREQJMHhkY2M2MjNjYiwweGRjYzYyM2NiCisJREQJMHg2OGZjZWRiNiwweDY4ZmNlZGI2CisJREQJMHg2M2YxZTRiOCwweDYzZjFlNGI4CisJREQJMHhjYWRjMzFkNywweGNhZGMzMWQ3CisJREQJMHgxMDg1NjM0MiwweDEwODU2MzQyCisJREQJMHg0MDIyOTcxMywweDQwMjI5NzEzCisJREQJMHgyMDExYzY4NCwweDIwMTFjNjg0CisJREQJMHg3ZDI0NGE4NSwweDdkMjQ0YTg1CisJREQJMHhmODNkYmJkMiwweGY4M2RiYmQyCisJREQJMHgxMTMyZjlhZSwweDExMzJmOWFlCisJREQJMHg2ZGExMjljNywweDZkYTEyOWM3CisJREQJMHg0YjJmOWUxZCwweDRiMmY5ZTFkCisJREQJMHhmMzMwYjJkYywweGYzMzBiMmRjCisJREQJMHhlYzUyODYwZCwweGVjNTI4NjBkCisJREQJMHhkMGUzYzE3NywweGQwZTNjMTc3CisJREQJMHg2YzE2YjMyYiwweDZjMTZiMzJiCisJREQJMHg5OWI5NzBhOSwweDk5Yjk3MGE5CisJREQJMHhmYTQ4OTQxMSwweGZhNDg5NDExCisJREQJMHgyMjY0ZTk0NywweDIyNjRlOTQ3CisJREQJMHhjNDhjZmNhOCwweGM0OGNmY2E4CisJREQJMHgxYTNmZjBhMCwweDFhM2ZmMGEwCisJREQJMHhkODJjN2Q1NiwweGQ4MmM3ZDU2CisJREQJMHhlZjkwMzMyMiwweGVmOTAzMzIyCisJREQJMHhjNzRlNDk4NywweGM3NGU0OTg3CisJREQJMHhjMWQxMzhkOSwweGMxZDEzOGQ5CisJREQJMHhmZWEyY2E4YywweGZlYTJjYThjCisJREQJMHgzNjBiZDQ5OCwweDM2MGJkNDk4CisJREQJMHhjZjgxZjVhNiwweGNmODFmNWE2CisJREQJMHgyOGRlN2FhNSwweDI4ZGU3YWE1CisJREQJMHgyNjhlYjdkYSwweDI2OGViN2RhCisJREQJMHhhNGJmYWQzZiwweGE0YmZhZDNmCisJREQJMHhlNDlkM2EyYywweGU0OWQzYTJjCisJREQJMHgwZDkyNzg1MCwweDBkOTI3ODUwCisJREQJMHg5YmNjNWY2YSwweDliY2M1ZjZhCisJREQJMHg2MjQ2N2U1NCwweDYyNDY3ZTU0CisJREQJMHhjMjEzOGRmNiwweGMyMTM4ZGY2CisJREQJMHhlOGI4ZDg5MCwweGU4YjhkODkwCisJREQJMHg1ZWY3MzkyZSwweDVlZjczOTJlCisJREQJMHhmNWFmYzM4MiwweGY1YWZjMzgyCisJREQJMHhiZTgwNWQ5ZiwweGJlODA1ZDlmCisJREQJMHg3YzkzZDA2OSwweDdjOTNkMDY5CisJREQJMHhhOTJkZDU2ZiwweGE5MmRkNTZmCisJREQJMHhiMzEyMjVjZiwweGIzMTIyNWNmCisJREQJMHgzYjk5YWNjOCwweDNiOTlhY2M4CisJREQJMHhhNzdkMTgxMCwweGE3N2QxODEwCisJREQJMHg2ZTYzOWNlOCwweDZlNjM5Y2U4CisJREQJMHg3YmJiM2JkYiwweDdiYmIzYmRiCisJREQJMHgwOTc4MjZjZCwweDA5NzgyNmNkCisJREQJMHhmNDE4NTk2ZSwweGY0MTg1OTZlCisJREQJMHgwMWI3OWFlYywweDAxYjc5YWVjCisJREQJMHhhODlhNGY4MywweGE4OWE0ZjgzCisJREQJMHg2NTZlOTVlNiwweDY1NmU5NWU2CisJREQJMHg3ZWU2ZmZhYSwweDdlZTZmZmFhCisJREQJMHgwOGNmYmMyMSwweDA4Y2ZiYzIxCisJREQJMHhlNmU4MTVlZiwweGU2ZTgxNWVmCisJREQJMHhkOTliZTdiYSwweGQ5OWJlN2JhCisJREQJMHhjZTM2NmY0YSwweGNlMzY2ZjRhCisJREQJMHhkNDA5OWZlYSwweGQ0MDk5ZmVhCisJREQJMHhkNjdjYjAyOSwweGQ2N2NiMDI5CisJREQJMHhhZmIyYTQzMSwweGFmYjJhNDMxCisJREQJMHgzMTIzM2YyYSwweDMxMjMzZjJhCisJREQJMHgzMDk0YTVjNiwweDMwOTRhNWM2CisJREQJMHhjMDY2YTIzNSwweGMwNjZhMjM1CisJREQJMHgzN2JjNGU3NCwweDM3YmM0ZTc0CisJREQJMHhhNmNhODJmYywweGE2Y2E4MmZjCisJREQJMHhiMGQwOTBlMCwweGIwZDA5MGUwCisJREQJMHgxNWQ4YTczMywweDE1ZDhhNzMzCisJREQJMHg0YTk4MDRmMSwweDRhOTgwNGYxCisJREQJMHhmN2RhZWM0MSwweGY3ZGFlYzQxCisJREQJMHgwZTUwY2Q3ZiwweDBlNTBjZDdmCisJREQJMHgyZmY2OTExNywweDJmZjY5MTE3CisJREQJMHg4ZGQ2NGQ3NiwweDhkZDY0ZDc2CisJREQJMHg0ZGIwZWY0MywweDRkYjBlZjQzCisJREQJMHg1NDRkYWFjYywweDU0NGRhYWNjCisJREQJMHhkZjA0OTZlNCwweGRmMDQ5NmU0CisJREQJMHhlM2I1ZDE5ZSwweGUzYjVkMTllCisJREQJMHgxYjg4NmE0YywweDFiODg2YTRjCisJREQJMHhiODFmMmNjMSwweGI4MWYyY2MxCisJREQJMHg3ZjUxNjU0NiwweDdmNTE2NTQ2CisJREQJMHgwNGVhNWU5ZCwweDA0ZWE1ZTlkCisJREQJMHg1ZDM1OGMwMSwweDVkMzU4YzAxCisJREQJMHg3Mzc0ODdmYSwweDczNzQ4N2ZhCisJREQJMHgyZTQxMGJmYiwweDJlNDEwYmZiCisJREQJMHg1YTFkNjdiMywweDVhMWQ2N2IzCisJREQJMHg1MmQyZGI5MiwweDUyZDJkYjkyCisJREQJMHgzMzU2MTBlOSwweDMzNTYxMGU5CisJREQJMHgxMzQ3ZDY2ZCwweDEzNDdkNjZkCisJREQJMHg4YzYxZDc5YSwweDhjNjFkNzlhCisJREQJMHg3YTBjYTEzNywweDdhMGNhMTM3CisJREQJMHg4ZTE0Zjg1OSwweDhlMTRmODU5CisJREQJMHg4OTNjMTNlYiwweDg5M2MxM2ViCisJREQJMHhlZTI3YTljZSwweGVlMjdhOWNlCisJREQJMHgzNWM5NjFiNywweDM1Yzk2MWI3CisJREQJMHhlZGU1MWNlMSwweGVkZTUxY2UxCisJREQJMHgzY2IxNDc3YSwweDNjYjE0NzdhCisJREQJMHg1OWRmZDI5YywweDU5ZGZkMjljCisJREQJMHgzZjczZjI1NSwweDNmNzNmMjU1CisJREQJMHg3OWNlMTQxOCwweDc5Y2UxNDE4CisJREQJMHhiZjM3Yzc3MywweGJmMzdjNzczCisJREQJMHhlYWNkZjc1MywweGVhY2RmNzUzCisJREQJMHg1YmFhZmQ1ZiwweDViYWFmZDVmCisJREQJMHgxNDZmM2RkZiwweDE0NmYzZGRmCisJREQJMHg4NmRiNDQ3OCwweDg2ZGI0NDc4CisJREQJMHg4MWYzYWZjYSwweDgxZjNhZmNhCisJREQJMHgzZWM0NjhiOSwweDNlYzQ2OGI5CisJREQJMHgyYzM0MjQzOCwweDJjMzQyNDM4CisJREQJMHg1ZjQwYTNjMiwweDVmNDBhM2MyCisJREQJMHg3MmMzMWQxNiwweDcyYzMxZDE2CisJREQJMHgwYzI1ZTJiYywweDBjMjVlMmJjCisJREQJMHg4YjQ5M2MyOCwweDhiNDkzYzI4CisJREQJMHg0MTk1MGRmZiwweDQxOTUwZGZmCisJREQJMHg3MTAxYTgzOSwweDcxMDFhODM5CisJREQJMHhkZWIzMGMwOCwweGRlYjMwYzA4CisJREQJMHg5Y2U0YjRkOCwweDljZTRiNGQ4CisJREQJMHg5MGMxNTY2NCwweDkwYzE1NjY0CisJREQJMHg2MTg0Y2I3YiwweDYxODRjYjdiCisJREQJMHg3MGI2MzJkNSwweDcwYjYzMmQ1CisJREQJMHg3NDVjNmM0OCwweDc0NWM2YzQ4CisJREQJMHg0MjU3YjhkMCwweDQyNTdiOGQwCitEQgkweDUyLDB4MDksMHg2YSwweGQ1LDB4MzAsMHgzNiwweGE1LDB4MzgKK0RCCTB4YmYsMHg0MCwweGEzLDB4OWUsMHg4MSwweGYzLDB4ZDcsMHhmYgorREIJMHg3YywweGUzLDB4MzksMHg4MiwweDliLDB4MmYsMHhmZiwweDg3CitEQgkweDM0LDB4OGUsMHg0MywweDQ0LDB4YzQsMHhkZSwweGU5LDB4Y2IKK0RCCTB4NTQsMHg3YiwweDk0LDB4MzIsMHhhNiwweGMyLDB4MjMsMHgzZAorREIJMHhlZSwweDRjLDB4OTUsMHgwYiwweDQyLDB4ZmEsMHhjMywweDRlCitEQgkweDA4LDB4MmUsMHhhMSwweDY2LDB4MjgsMHhkOSwweDI0LDB4YjIKK0RCCTB4NzYsMHg1YiwweGEyLDB4NDksMHg2ZCwweDhiLDB4ZDEsMHgyNQorREIJMHg3MiwweGY4LDB4ZjYsMHg2NCwweDg2LDB4NjgsMHg5OCwweDE2CitEQgkweGQ0LDB4YTQsMHg1YywweGNjLDB4NWQsMHg2NSwweGI2LDB4OTIKK0RCCTB4NmMsMHg3MCwweDQ4LDB4NTAsMHhmZCwweGVkLDB4YjksMHhkYQorREIJMHg1ZSwweDE1LDB4NDYsMHg1NywweGE3LDB4OGQsMHg5ZCwweDg0CitEQgkweDkwLDB4ZDgsMHhhYiwweDAwLDB4OGMsMHhiYywweGQzLDB4MGEKK0RCCTB4ZjcsMHhlNCwweDU4LDB4MDUsMHhiOCwweGIzLDB4NDUsMHgwNgorREIJMHhkMCwweDJjLDB4MWUsMHg4ZiwweGNhLDB4M2YsMHgwZiwweDAyCitEQgkweGMxLDB4YWYsMHhiZCwweDAzLDB4MDEsMHgxMywweDhhLDB4NmIKK0RCCTB4M2EsMHg5MSwweDExLDB4NDEsMHg0ZiwweDY3LDB4ZGMsMHhlYQorREIJMHg5NywweGYyLDB4Y2YsMHhjZSwweGYwLDB4YjQsMHhlNiwweDczCitEQgkweDk2LDB4YWMsMHg3NCwweDIyLDB4ZTcsMHhhZCwweDM1LDB4ODUKK0RCCTB4ZTIsMHhmOSwweDM3LDB4ZTgsMHgxYywweDc1LDB4ZGYsMHg2ZQorREIJMHg0NywweGYxLDB4MWEsMHg3MSwweDFkLDB4MjksMHhjNSwweDg5CitEQgkweDZmLDB4YjcsMHg2MiwweDBlLDB4YWEsMHgxOCwweGJlLDB4MWIKK0RCCTB4ZmMsMHg1NiwweDNlLDB4NGIsMHhjNiwweGQyLDB4NzksMHgyMAorREIJMHg5YSwweGRiLDB4YzAsMHhmZSwweDc4LDB4Y2QsMHg1YSwweGY0CitEQgkweDFmLDB4ZGQsMHhhOCwweDMzLDB4ODgsMHgwNywweGM3LDB4MzEKK0RCCTB4YjEsMHgxMiwweDEwLDB4NTksMHgyNywweDgwLDB4ZWMsMHg1ZgorREIJMHg2MCwweDUxLDB4N2YsMHhhOSwweDE5LDB4YjUsMHg0YSwweDBkCitEQgkweDJkLDB4ZTUsMHg3YSwweDlmLDB4OTMsMHhjOSwweDljLDB4ZWYKK0RCCTB4YTAsMHhlMCwweDNiLDB4NGQsMHhhZSwweDJhLDB4ZjUsMHhiMAorREIJMHhjOCwweGViLDB4YmIsMHgzYywweDgzLDB4NTMsMHg5OSwweDYxCitEQgkweDE3LDB4MmIsMHgwNCwweDdlLDB4YmEsMHg3NywweGQ2LDB4MjYKK0RCCTB4ZTEsMHg2OSwweDE0LDB4NjMsMHg1NSwweDIxLDB4MGMsMHg3ZAorCURECTB4ODA4MDgwODAsMHg4MDgwODA4MCwweGZlZmVmZWZlLDB4ZmVmZWZlZmUKKwlERAkweDFiMWIxYjFiLDB4MWIxYjFiMWIsMCwwCitEQgkweDUyLDB4MDksMHg2YSwweGQ1LDB4MzAsMHgzNiwweGE1LDB4MzgKK0RCCTB4YmYsMHg0MCwweGEzLDB4OWUsMHg4MSwweGYzLDB4ZDcsMHhmYgorREIJMHg3YywweGUzLDB4MzksMHg4MiwweDliLDB4MmYsMHhmZiwweDg3CitEQgkweDM0LDB4OGUsMHg0MywweDQ0LDB4YzQsMHhkZSwweGU5LDB4Y2IKK0RCCTB4NTQsMHg3YiwweDk0LDB4MzIsMHhhNiwweGMyLDB4MjMsMHgzZAorREIJMHhlZSwweDRjLDB4OTUsMHgwYiwweDQyLDB4ZmEsMHhjMywweDRlCitEQgkweDA4LDB4MmUsMHhhMSwweDY2LDB4MjgsMHhkOSwweDI0LDB4YjIKK0RCCTB4NzYsMHg1YiwweGEyLDB4NDksMHg2ZCwweDhiLDB4ZDEsMHgyNQorREIJMHg3MiwweGY4LDB4ZjYsMHg2NCwweDg2LDB4NjgsMHg5OCwweDE2CitEQgkweGQ0LDB4YTQsMHg1YywweGNjLDB4NWQsMHg2NSwweGI2LDB4OTIKK0RCCTB4NmMsMHg3MCwweDQ4LDB4NTAsMHhmZCwweGVkLDB4YjksMHhkYQorREIJMHg1ZSwweDE1LDB4NDYsMHg1NywweGE3LDB4OGQsMHg5ZCwweDg0CitEQgkweDkwLDB4ZDgsMHhhYiwweDAwLDB4OGMsMHhiYywweGQzLDB4MGEKK0RCCTB4ZjcsMHhlNCwweDU4LDB4MDUsMHhiOCwweGIzLDB4NDUsMHgwNgorREIJMHhkMCwweDJjLDB4MWUsMHg4ZiwweGNhLDB4M2YsMHgwZiwweDAyCitEQgkweGMxLDB4YWYsMHhiZCwweDAzLDB4MDEsMHgxMywweDhhLDB4NmIKK0RCCTB4M2EsMHg5MSwweDExLDB4NDEsMHg0ZiwweDY3LDB4ZGMsMHhlYQorREIJMHg5NywweGYyLDB4Y2YsMHhjZSwweGYwLDB4YjQsMHhlNiwweDczCitEQgkweDk2LDB4YWMsMHg3NCwweDIyLDB4ZTcsMHhhZCwweDM1LDB4ODUKK0RCCTB4ZTIsMHhmOSwweDM3LDB4ZTgsMHgxYywweDc1LDB4ZGYsMHg2ZQorREIJMHg0NywweGYxLDB4MWEsMHg3MSwweDFkLDB4MjksMHhjNSwweDg5CitEQgkweDZmLDB4YjcsMHg2MiwweDBlLDB4YWEsMHgxOCwweGJlLDB4MWIKK0RCCTB4ZmMsMHg1NiwweDNlLDB4NGIsMHhjNiwweGQyLDB4NzksMHgyMAorREIJMHg5YSwweGRiLDB4YzAsMHhmZSwweDc4LDB4Y2QsMHg1YSwweGY0CitEQgkweDFmLDB4ZGQsMHhhOCwweDMzLDB4ODgsMHgwNywweGM3LDB4MzEKK0RCCTB4YjEsMHgxMiwweDEwLDB4NTksMHgyNywweDgwLDB4ZWMsMHg1ZgorREIJMHg2MCwweDUxLDB4N2YsMHhhOSwweDE5LDB4YjUsMHg0YSwweDBkCitEQgkweDJkLDB4ZTUsMHg3YSwweDlmLDB4OTMsMHhjOSwweDljLDB4ZWYKK0RCCTB4YTAsMHhlMCwweDNiLDB4NGQsMHhhZSwweDJhLDB4ZjUsMHhiMAorREIJMHhjOCwweGViLDB4YmIsMHgzYywweDgzLDB4NTMsMHg5OSwweDYxCitEQgkweDE3LDB4MmIsMHgwNCwweDdlLDB4YmEsMHg3NywweGQ2LDB4MjYKK0RCCTB4ZTEsMHg2OSwweDE0LDB4NjMsMHg1NSwweDIxLDB4MGMsMHg3ZAorCURECTB4ODA4MDgwODAsMHg4MDgwODA4MCwweGZlZmVmZWZlLDB4ZmVmZWZlZmUKKwlERAkweDFiMWIxYjFiLDB4MWIxYjFiMWIsMCwwCitEQgkweDUyLDB4MDksMHg2YSwweGQ1LDB4MzAsMHgzNiwweGE1LDB4MzgKK0RCCTB4YmYsMHg0MCwweGEzLDB4OWUsMHg4MSwweGYzLDB4ZDcsMHhmYgorREIJMHg3YywweGUzLDB4MzksMHg4MiwweDliLDB4MmYsMHhmZiwweDg3CitEQgkweDM0LDB4OGUsMHg0MywweDQ0LDB4YzQsMHhkZSwweGU5LDB4Y2IKK0RCCTB4NTQsMHg3YiwweDk0LDB4MzIsMHhhNiwweGMyLDB4MjMsMHgzZAorREIJMHhlZSwweDRjLDB4OTUsMHgwYiwweDQyLDB4ZmEsMHhjMywweDRlCitEQgkweDA4LDB4MmUsMHhhMSwweDY2LDB4MjgsMHhkOSwweDI0LDB4YjIKK0RCCTB4NzYsMHg1YiwweGEyLDB4NDksMHg2ZCwweDhiLDB4ZDEsMHgyNQorREIJMHg3MiwweGY4LDB4ZjYsMHg2NCwweDg2LDB4NjgsMHg5OCwweDE2CitEQgkweGQ0LDB4YTQsMHg1YywweGNjLDB4NWQsMHg2NSwweGI2LDB4OTIKK0RCCTB4NmMsMHg3MCwweDQ4LDB4NTAsMHhmZCwweGVkLDB4YjksMHhkYQorREIJMHg1ZSwweDE1LDB4NDYsMHg1NywweGE3LDB4OGQsMHg5ZCwweDg0CitEQgkweDkwLDB4ZDgsMHhhYiwweDAwLDB4OGMsMHhiYywweGQzLDB4MGEKK0RCCTB4ZjcsMHhlNCwweDU4LDB4MDUsMHhiOCwweGIzLDB4NDUsMHgwNgorREIJMHhkMCwweDJjLDB4MWUsMHg4ZiwweGNhLDB4M2YsMHgwZiwweDAyCitEQgkweGMxLDB4YWYsMHhiZCwweDAzLDB4MDEsMHgxMywweDhhLDB4NmIKK0RCCTB4M2EsMHg5MSwweDExLDB4NDEsMHg0ZiwweDY3LDB4ZGMsMHhlYQorREIJMHg5NywweGYyLDB4Y2YsMHhjZSwweGYwLDB4YjQsMHhlNiwweDczCitEQgkweDk2LDB4YWMsMHg3NCwweDIyLDB4ZTcsMHhhZCwweDM1LDB4ODUKK0RCCTB4ZTIsMHhmOSwweDM3LDB4ZTgsMHgxYywweDc1LDB4ZGYsMHg2ZQorREIJMHg0NywweGYxLDB4MWEsMHg3MSwweDFkLDB4MjksMHhjNSwweDg5CitEQgkweDZmLDB4YjcsMHg2MiwweDBlLDB4YWEsMHgxOCwweGJlLDB4MWIKK0RCCTB4ZmMsMHg1NiwweDNlLDB4NGIsMHhjNiwweGQyLDB4NzksMHgyMAorREIJMHg5YSwweGRiLDB4YzAsMHhmZSwweDc4LDB4Y2QsMHg1YSwweGY0CitEQgkweDFmLDB4ZGQsMHhhOCwweDMzLDB4ODgsMHgwNywweGM3LDB4MzEKK0RCCTB4YjEsMHgxMiwweDEwLDB4NTksMHgyNywweDgwLDB4ZWMsMHg1ZgorREIJMHg2MCwweDUxLDB4N2YsMHhhOSwweDE5LDB4YjUsMHg0YSwweDBkCitEQgkweDJkLDB4ZTUsMHg3YSwweDlmLDB4OTMsMHhjOSwweDljLDB4ZWYKK0RCCTB4YTAsMHhlMCwweDNiLDB4NGQsMHhhZSwweDJhLDB4ZjUsMHhiMAorREIJMHhjOCwweGViLDB4YmIsMHgzYywweDgzLDB4NTMsMHg5OSwweDYxCitEQgkweDE3LDB4MmIsMHgwNCwweDdlLDB4YmEsMHg3NywweGQ2LDB4MjYKK0RCCTB4ZTEsMHg2OSwweDE0LDB4NjMsMHg1NSwweDIxLDB4MGMsMHg3ZAorCURECTB4ODA4MDgwODAsMHg4MDgwODA4MCwweGZlZmVmZWZlLDB4ZmVmZWZlZmUKKwlERAkweDFiMWIxYjFiLDB4MWIxYjFiMWIsMCwwCitEQgkweDUyLDB4MDksMHg2YSwweGQ1LDB4MzAsMHgzNiwweGE1LDB4MzgKK0RCCTB4YmYsMHg0MCwweGEzLDB4OWUsMHg4MSwweGYzLDB4ZDcsMHhmYgorREIJMHg3YywweGUzLDB4MzksMHg4MiwweDliLDB4MmYsMHhmZiwweDg3CitEQgkweDM0LDB4OGUsMHg0MywweDQ0LDB4YzQsMHhkZSwweGU5LDB4Y2IKK0RCCTB4NTQsMHg3YiwweDk0LDB4MzIsMHhhNiwweGMyLDB4MjMsMHgzZAorREIJMHhlZSwweDRjLDB4OTUsMHgwYiwweDQyLDB4ZmEsMHhjMywweDRlCitEQgkweDA4LDB4MmUsMHhhMSwweDY2LDB4MjgsMHhkOSwweDI0LDB4YjIKK0RCCTB4NzYsMHg1YiwweGEyLDB4NDksMHg2ZCwweDhiLDB4ZDEsMHgyNQorREIJMHg3MiwweGY4LDB4ZjYsMHg2NCwweDg2LDB4NjgsMHg5OCwweDE2CitEQgkweGQ0LDB4YTQsMHg1YywweGNjLDB4NWQsMHg2NSwweGI2LDB4OTIKK0RCCTB4NmMsMHg3MCwweDQ4LDB4NTAsMHhmZCwweGVkLDB4YjksMHhkYQorREIJMHg1ZSwweDE1LDB4NDYsMHg1NywweGE3LDB4OGQsMHg5ZCwweDg0CitEQgkweDkwLDB4ZDgsMHhhYiwweDAwLDB4OGMsMHhiYywweGQzLDB4MGEKK0RCCTB4ZjcsMHhlNCwweDU4LDB4MDUsMHhiOCwweGIzLDB4NDUsMHgwNgorREIJMHhkMCwweDJjLDB4MWUsMHg4ZiwweGNhLDB4M2YsMHgwZiwweDAyCitEQgkweGMxLDB4YWYsMHhiZCwweDAzLDB4MDEsMHgxMywweDhhLDB4NmIKK0RCCTB4M2EsMHg5MSwweDExLDB4NDEsMHg0ZiwweDY3LDB4ZGMsMHhlYQorREIJMHg5NywweGYyLDB4Y2YsMHhjZSwweGYwLDB4YjQsMHhlNiwweDczCitEQgkweDk2LDB4YWMsMHg3NCwweDIyLDB4ZTcsMHhhZCwweDM1LDB4ODUKK0RCCTB4ZTIsMHhmOSwweDM3LDB4ZTgsMHgxYywweDc1LDB4ZGYsMHg2ZQorREIJMHg0NywweGYxLDB4MWEsMHg3MSwweDFkLDB4MjksMHhjNSwweDg5CitEQgkweDZmLDB4YjcsMHg2MiwweDBlLDB4YWEsMHgxOCwweGJlLDB4MWIKK0RCCTB4ZmMsMHg1NiwweDNlLDB4NGIsMHhjNiwweGQyLDB4NzksMHgyMAorREIJMHg5YSwweGRiLDB4YzAsMHhmZSwweDc4LDB4Y2QsMHg1YSwweGY0CitEQgkweDFmLDB4ZGQsMHhhOCwweDMzLDB4ODgsMHgwNywweGM3LDB4MzEKK0RCCTB4YjEsMHgxMiwweDEwLDB4NTksMHgyNywweDgwLDB4ZWMsMHg1ZgorREIJMHg2MCwweDUxLDB4N2YsMHhhOSwweDE5LDB4YjUsMHg0YSwweDBkCitEQgkweDJkLDB4ZTUsMHg3YSwweDlmLDB4OTMsMHhjOSwweDljLDB4ZWYKK0RCCTB4YTAsMHhlMCwweDNiLDB4NGQsMHhhZSwweDJhLDB4ZjUsMHhiMAorREIJMHhjOCwweGViLDB4YmIsMHgzYywweDgzLDB4NTMsMHg5OSwweDYxCitEQgkweDE3LDB4MmIsMHgwNCwweDdlLDB4YmEsMHg3NywweGQ2LDB4MjYKK0RCCTB4ZTEsMHg2OSwweDE0LDB4NjMsMHg1NSwweDIxLDB4MGMsMHg3ZAorCURECTB4ODA4MDgwODAsMHg4MDgwODA4MCwweGZlZmVmZWZlLDB4ZmVmZWZlZmUKKwlERAkweDFiMWIxYjFiLDB4MWIxYjFiMWIsMCwwCitEQgk2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQsMzIKK0RCCTY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MCw5NworREIJMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0LDEwMworREIJNjIsMAorQUxJR04JNjQKK0VYVEVSTglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisKK0FMSUdOCTE2CitibG9ja19zZV9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCW1vdglyc2ksUVdPUkRbOCtyOV0KKwltb3YJcjExLFFXT1JEWzU2K3I5XQorCisJbW92CXIxMGQsRFdPUkRbcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fYmxvY2tfcHJvbG9ndWUKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkaW5fYmxvY2tfcHJvbG9ndWUKKworCW1vdglyYXgsUVdPUkRbMjQrcmF4XQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcmF4XQorCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyYXhdCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JheF0KKwltb3YJUVdPUkRbMTQ0K3I4XSxyYngKKwltb3YJUVdPUkRbMTYwK3I4XSxyYnAKKwltb3YJUVdPUkRbMjE2K3I4XSxyMTIKKwltb3YJUVdPUkRbMjI0K3I4XSxyMTMKKwltb3YJUVdPUkRbMjMyK3I4XSxyMTQKKwltb3YJUVdPUkRbMjQwK3I4XSxyMTUKKworJEwkaW5fYmxvY2tfcHJvbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JheF0KKwltb3YJcnNpLFFXT1JEWzE2K3JheF0KKwltb3YJUVdPUkRbMTUyK3I4XSxyYXgKKwltb3YJUVdPUkRbMTY4K3I4XSxyc2kKKwltb3YJUVdPUkRbMTc2K3I4XSxyZGkKKworCWptcAlORUFSICRMJGNvbW1vbl9zZWhfZXhpdAorCisKKworQUxJR04JMTYKK2tleV9zZV9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCW1vdglyc2ksUVdPUkRbOCtyOV0KKwltb3YJcjExLFFXT1JEWzU2K3I5XQorCisJbW92CXIxMGQsRFdPUkRbcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fa2V5X3Byb2xvZ3VlCisKKwltb3YJcmF4LFFXT1JEWzE1MityOF0KKworCW1vdglyMTBkLERXT1JEWzQrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWphZQlORUFSICRMJGluX2tleV9wcm9sb2d1ZQorCisJbGVhCXJheCxbNTYrcmF4XQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcmF4XQorCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyYXhdCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JheF0KKwltb3YJUVdPUkRbMTQ0K3I4XSxyYngKKwltb3YJUVdPUkRbMTYwK3I4XSxyYnAKKwltb3YJUVdPUkRbMjE2K3I4XSxyMTIKKwltb3YJUVdPUkRbMjI0K3I4XSxyMTMKKwltb3YJUVdPUkRbMjMyK3I4XSxyMTQKKwltb3YJUVdPUkRbMjQwK3I4XSxyMTUKKworJEwkaW5fa2V5X3Byb2xvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyYXhdCisJbW92CXJzaSxRV09SRFsxNityYXhdCisJbW92CVFXT1JEWzE1MityOF0scmF4CisJbW92CVFXT1JEWzE2OCtyOF0scnNpCisJbW92CVFXT1JEWzE3NityOF0scmRpCisKKwlqbXAJTkVBUiAkTCRjb21tb25fc2VoX2V4aXQKKworCisKK0FMSUdOCTE2CitjYmNfc2VfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwlsZWEJcjEwLFskTCRjYmNfcHJvbG9ndWVdCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGluX2NiY19wcm9sb2d1ZQorCisJbGVhCXIxMCxbJEwkY2JjX2Zhc3RfYm9keV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fY2JjX2ZyYW1lX3NldHVwCisKKwlsZWEJcjEwLFskTCRjYmNfc2xvd19wcm9sb2d1ZV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fY2JjX2JvZHkKKworCWxlYQlyMTAsWyRMJGNiY19zbG93X2JvZHldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGluX2NiY19mcmFtZV9zZXR1cAorCiskTCRpbl9jYmNfYm9keToKKwltb3YJcmF4LFFXT1JEWzE1MityOF0KKworCWxlYQlyMTAsWyRMJGNiY19lcGlsb2d1ZV0KKwljbXAJcmJ4LHIxMAorCWphZQlORUFSICRMJGluX2NiY19wcm9sb2d1ZQorCisJbGVhCXJheCxbOCtyYXhdCisKKwlsZWEJcjEwLFskTCRjYmNfcG9wZnFdCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRpbl9jYmNfcHJvbG9ndWUKKworCW1vdglyYXgsUVdPUkRbOCtyYXhdCisJbGVhCXJheCxbNTYrcmF4XQorCiskTCRpbl9jYmNfZnJhbWVfc2V0dXA6CisJbW92CXJieCxRV09SRFsoKC0xNikpK3JheF0KKwltb3YJcmJwLFFXT1JEWygoLTI0KSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMzIpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC00MCkpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTQ4KSkrcmF4XQorCW1vdglyMTUsUVdPUkRbKCgtNTYpKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisKKyRMJGluX2NiY19wcm9sb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcmF4XQorCW1vdglyc2ksUVdPUkRbMTYrcmF4XQorCW1vdglRV09SRFsxNTIrcjhdLHJheAorCW1vdglRV09SRFsxNjgrcjhdLHJzaQorCW1vdglRV09SRFsxNzYrcjhdLHJkaQorCiskTCRjb21tb25fc2VoX2V4aXQ6CisKKwltb3YJcmRpLFFXT1JEWzQwK3I5XQorCW1vdglyc2kscjgKKwltb3YJZWN4LDE1NAorCURECTB4YTU0OGYzZmMKKworCW1vdglyc2kscjkKKwl4b3IJcmN4LHJjeAorCW1vdglyZHgsUVdPUkRbOCtyc2ldCisJbW92CXI4LFFXT1JEW3JzaV0KKwltb3YJcjksUVdPUkRbMTYrcnNpXQorCW1vdglyMTAsUVdPUkRbNDArcnNpXQorCWxlYQlyMTEsWzU2K3JzaV0KKwlsZWEJcjEyLFsyNCtyc2ldCisJbW92CVFXT1JEWzMyK3JzcF0scjEwCisJbW92CVFXT1JEWzQwK3JzcF0scjExCisJbW92CVFXT1JEWzQ4K3JzcF0scjEyCisJbW92CVFXT1JEWzU2K3JzcF0scmN4CisJY2FsbAlRV09SRFtfX2ltcF9SdGxWaXJ0dWFsVW53aW5kXQorCisJbW92CWVheCwxCisJYWRkCXJzcCw2NAorCXBvcGZxCisJcG9wCXIxNQorCXBvcAlyMTQKKwlwb3AJcjEzCisJcG9wCXIxMgorCXBvcAlyYnAKKwlwb3AJcmJ4CisJcG9wCXJkaQorCXBvcAlyc2kKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitzZWN0aW9uCS5wZGF0YSByZGF0YSBhbGlnbj00CitBTElHTgk0CisJREQJJEwkU0VIX2JlZ2luX2Flc19ub2h3X2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfbm9od19lbmNyeXB0IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2Flc19ub2h3X2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fYWVzX25vaHdfZGVjcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2Flc19ub2h3X2RlY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fYWVzX25vaHdfZGVjcnlwdCB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXkgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfbm9od19zZXRfZW5jcnlwdF9rZXkgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5IHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2Flc19ub2h3X3NldF9kZWNyeXB0X2tleSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19hZXNfbm9od19zZXRfZGVjcnlwdF9rZXkgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fYWVzX25vaHdfY2JjX2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfbm9od19jYmNfZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19hZXNfbm9od19jYmNfZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKworc2VjdGlvbgkueGRhdGEgcmRhdGEgYWxpZ249OAorQUxJR04JOAorJEwkU0VIX2luZm9fYWVzX25vaHdfZW5jcnlwdDoKK0RCCTksMCwwLDAKKwlERAlibG9ja19zZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGVuY19wcm9sb2d1ZSB3cnQgLi5pbWFnZWJhc2UsJEwkZW5jX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fYWVzX25vaHdfZGVjcnlwdDoKK0RCCTksMCwwLDAKKwlERAlibG9ja19zZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGRlY19wcm9sb2d1ZSB3cnQgLi5pbWFnZWJhc2UsJEwkZGVjX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fYWVzX25vaHdfc2V0X2VuY3J5cHRfa2V5OgorREIJOSwwLDAsMAorCURECWtleV9zZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGVuY19rZXlfcHJvbG9ndWUgd3J0IC4uaW1hZ2ViYXNlLCRMJGVuY19rZXlfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCiskTCRTRUhfaW5mb19hZXNfbm9od19zZXRfZGVjcnlwdF9rZXk6CitEQgk5LDAsMCwwCisJREQJa2V5X3NlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkZGVjX2tleV9wcm9sb2d1ZSB3cnQgLi5pbWFnZWJhc2UsJEwkZGVjX2tleV9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX2Flc19ub2h3X2NiY19lbmNyeXB0OgorREIJOSwwLDAsMAorCURECWNiY19zZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLWdjbS14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLWdjbS14ODZfNjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYmNkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvYWVzbmktZ2NtLXg4Nl82NC5hc20KQEAgLTAsMCArMSwxMDIyIEBACitkZWZhdWx0CXJlbAorJWRlZmluZSBYTU1XT1JECislZGVmaW5lIFlNTVdPUkQKKyVkZWZpbmUgWk1NV09SRAorc2VjdGlvbgkudGV4dCBjb2RlIGFsaWduPTY0CisKKworCitBTElHTgkzMgorX2Flc25pX2N0cjMyX2doYXNoXzZ4OgorCisJdm1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcjExXQorCXN1YglyZHgsNgorCXZweG9yCXhtbTQseG1tNCx4bW00CisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWygoMC0xMjgpKStyY3hdCisJdnBhZGRiCXhtbTEwLHhtbTEseG1tMgorCXZwYWRkYgl4bW0xMSx4bW0xMCx4bW0yCisJdnBhZGRiCXhtbTEyLHhtbTExLHhtbTIKKwl2cGFkZGIJeG1tMTMseG1tMTIseG1tMgorCXZwYWRkYgl4bW0xNCx4bW0xMyx4bW0yCisJdnB4b3IJeG1tOSx4bW0xLHhtbTE1CisJdm1vdmRxdQlYTU1XT1JEWygxNis4KStyc3BdLHhtbTQKKwlqbXAJTkVBUiAkTCRvb3A2eAorCitBTElHTgkzMgorJEwkb29wNng6CisJYWRkCWVieCwxMDA2NjMyOTYKKwlqYwlORUFSICRMJGhhbmRsZV9jdHIzMgorCXZtb3ZkcXUJeG1tMyxYTU1XT1JEWygoMC0zMikpK3I5XQorCXZwYWRkYgl4bW0xLHhtbTE0LHhtbTIKKwl2cHhvcgl4bW0xMCx4bW0xMCx4bW0xNQorCXZweG9yCXhtbTExLHhtbTExLHhtbTE1CisKKyRMJHJlc3VtZV9jdHIzMjoKKwl2bW92ZHF1CVhNTVdPUkRbcjhdLHhtbTEKKwl2cGNsbXVscWRxCXhtbTUseG1tNyx4bW0zLDB4MTAKKwl2cHhvcgl4bW0xMix4bW0xMix4bW0xNQorCXZtb3Z1cHMJeG1tMixYTU1XT1JEWygoMTYtMTI4KSkrcmN4XQorCXZwY2xtdWxxZHEJeG1tNix4bW03LHhtbTMsMHgwMQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwl4b3IJcjEyLHIxMgorCWNtcAlyMTUscjE0CisKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0yCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbKCg0OCs4KSkrcnNwXQorCXZweG9yCXhtbTEzLHhtbTEzLHhtbTE1CisJdnBjbG11bHFkcQl4bW0xLHhtbTcseG1tMywweDAwCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0yCisJdnB4b3IJeG1tMTQseG1tMTQseG1tMTUKKwlzZXRuYwlyMTJiCisJdnBjbG11bHFkcQl4bW03LHhtbTcseG1tMywweDExCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0yCisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbKCgxNi0zMikpK3I5XQorCW5lZwlyMTIKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTIKKwl2cHhvcgl4bW02LHhtbTYseG1tNQorCXZwY2xtdWxxZHEJeG1tNSx4bW0wLHhtbTMsMHgwMAorCXZweG9yCXhtbTgseG1tOCx4bW00CisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0yCisJdnB4b3IJeG1tNCx4bW0xLHhtbTUKKwlhbmQJcjEyLDB4NjAKKwl2bW92dXBzCXhtbTE1LFhNTVdPUkRbKCgzMi0xMjgpKStyY3hdCisJdnBjbG11bHFkcQl4bW0xLHhtbTAseG1tMywweDEwCisJdmFlc2VuYwl4bW0xNCx4bW0xNCx4bW0yCisKKwl2cGNsbXVscWRxCXhtbTIseG1tMCx4bW0zLDB4MDEKKwlsZWEJcjE0LFtyMTIqMStyMTRdCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMTUKKwl2cHhvcgl4bW04LHhtbTgsWE1NV09SRFsoKDE2KzgpKStyc3BdCisJdnBjbG11bHFkcQl4bW0zLHhtbTAseG1tMywweDExCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbKCg2NCs4KSkrcnNwXQorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMTUKKwltb3ZiZQlyMTMsUVdPUkRbODgrcjE0XQorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMTUKKwltb3ZiZQlyMTIsUVdPUkRbODArcjE0XQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMTUKKwltb3YJUVdPUkRbKCgzMis4KSkrcnNwXSxyMTMKKwl2YWVzZW5jCXhtbTEzLHhtbTEzLHhtbTE1CisJbW92CVFXT1JEWygoNDArOCkpK3JzcF0scjEyCisJdm1vdmRxdQl4bW01LFhNTVdPUkRbKCg0OC0zMikpK3I5XQorCXZhZXNlbmMJeG1tMTQseG1tMTQseG1tMTUKKworCXZtb3Z1cHMJeG1tMTUsWE1NV09SRFsoKDQ4LTEyOCkpK3JjeF0KKwl2cHhvcgl4bW02LHhtbTYseG1tMQorCXZwY2xtdWxxZHEJeG1tMSx4bW0wLHhtbTUsMHgwMAorCXZhZXNlbmMJeG1tOSx4bW05LHhtbTE1CisJdnB4b3IJeG1tNix4bW02LHhtbTIKKwl2cGNsbXVscWRxCXhtbTIseG1tMCx4bW01LDB4MTAKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTE1CisJdnB4b3IJeG1tNyx4bW03LHhtbTMKKwl2cGNsbXVscWRxCXhtbTMseG1tMCx4bW01LDB4MDEKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTE1CisJdnBjbG11bHFkcQl4bW01LHhtbTAseG1tNSwweDExCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbKCg4MCs4KSkrcnNwXQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMTUKKwl2YWVzZW5jCXhtbTEzLHhtbTEzLHhtbTE1CisJdnB4b3IJeG1tNCx4bW00LHhtbTEKKwl2bW92ZHF1CXhtbTEsWE1NV09SRFsoKDY0LTMyKSkrcjldCisJdmFlc2VuYwl4bW0xNCx4bW0xNCx4bW0xNQorCisJdm1vdnVwcwl4bW0xNSxYTU1XT1JEWygoNjQtMTI4KSkrcmN4XQorCXZweG9yCXhtbTYseG1tNix4bW0yCisJdnBjbG11bHFkcQl4bW0yLHhtbTAseG1tMSwweDAwCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMTUKKwl2cHhvcgl4bW02LHhtbTYseG1tMworCXZwY2xtdWxxZHEJeG1tMyx4bW0wLHhtbTEsMHgxMAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMTUKKwltb3ZiZQlyMTMsUVdPUkRbNzIrcjE0XQorCXZweG9yCXhtbTcseG1tNyx4bW01CisJdnBjbG11bHFkcQl4bW01LHhtbTAseG1tMSwweDAxCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xNQorCW1vdmJlCXIxMixRV09SRFs2NCtyMTRdCisJdnBjbG11bHFkcQl4bW0xLHhtbTAseG1tMSwweDExCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbKCg5Nis4KSkrcnNwXQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMTUKKwltb3YJUVdPUkRbKCg0OCs4KSkrcnNwXSxyMTMKKwl2YWVzZW5jCXhtbTEzLHhtbTEzLHhtbTE1CisJbW92CVFXT1JEWygoNTYrOCkpK3JzcF0scjEyCisJdnB4b3IJeG1tNCx4bW00LHhtbTIKKwl2bW92ZHF1CXhtbTIsWE1NV09SRFsoKDk2LTMyKSkrcjldCisJdmFlc2VuYwl4bW0xNCx4bW0xNCx4bW0xNQorCisJdm1vdnVwcwl4bW0xNSxYTU1XT1JEWygoODAtMTI4KSkrcmN4XQorCXZweG9yCXhtbTYseG1tNix4bW0zCisJdnBjbG11bHFkcQl4bW0zLHhtbTAseG1tMiwweDAwCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMTUKKwl2cHhvcgl4bW02LHhtbTYseG1tNQorCXZwY2xtdWxxZHEJeG1tNSx4bW0wLHhtbTIsMHgxMAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMTUKKwltb3ZiZQlyMTMsUVdPUkRbNTYrcjE0XQorCXZweG9yCXhtbTcseG1tNyx4bW0xCisJdnBjbG11bHFkcQl4bW0xLHhtbTAseG1tMiwweDAxCisJdnB4b3IJeG1tOCx4bW04LFhNTVdPUkRbKCgxMTIrOCkpK3JzcF0KKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTE1CisJbW92YmUJcjEyLFFXT1JEWzQ4K3IxNF0KKwl2cGNsbXVscWRxCXhtbTIseG1tMCx4bW0yLDB4MTEKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTE1CisJbW92CVFXT1JEWygoNjQrOCkpK3JzcF0scjEzCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xNQorCW1vdglRV09SRFsoKDcyKzgpKStyc3BdLHIxMgorCXZweG9yCXhtbTQseG1tNCx4bW0zCisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbKCgxMTItMzIpKStyOV0KKwl2YWVzZW5jCXhtbTE0LHhtbTE0LHhtbTE1CisKKwl2bW92dXBzCXhtbTE1LFhNTVdPUkRbKCg5Ni0xMjgpKStyY3hdCisJdnB4b3IJeG1tNix4bW02LHhtbTUKKwl2cGNsbXVscWRxCXhtbTUseG1tOCx4bW0zLDB4MTAKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0xNQorCXZweG9yCXhtbTYseG1tNix4bW0xCisJdnBjbG11bHFkcQl4bW0xLHhtbTgseG1tMywweDAxCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0xNQorCW1vdmJlCXIxMyxRV09SRFs0MCtyMTRdCisJdnB4b3IJeG1tNyx4bW03LHhtbTIKKwl2cGNsbXVscWRxCXhtbTIseG1tOCx4bW0zLDB4MDAKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTE1CisJbW92YmUJcjEyLFFXT1JEWzMyK3IxNF0KKwl2cGNsbXVscWRxCXhtbTgseG1tOCx4bW0zLDB4MTEKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTE1CisJbW92CVFXT1JEWygoODArOCkpK3JzcF0scjEzCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xNQorCW1vdglRV09SRFsoKDg4KzgpKStyc3BdLHIxMgorCXZweG9yCXhtbTYseG1tNix4bW01CisJdmFlc2VuYwl4bW0xNCx4bW0xNCx4bW0xNQorCXZweG9yCXhtbTYseG1tNix4bW0xCisKKwl2bW92dXBzCXhtbTE1LFhNTVdPUkRbKCgxMTItMTI4KSkrcmN4XQorCXZwc2xsZHEJeG1tNSx4bW02LDgKKwl2cHhvcgl4bW00LHhtbTQseG1tMgorCXZtb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3IxMV0KKworCXZhZXNlbmMJeG1tOSx4bW05LHhtbTE1CisJdnB4b3IJeG1tNyx4bW03LHhtbTgKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTE1CisJdnB4b3IJeG1tNCx4bW00LHhtbTUKKwltb3ZiZQlyMTMsUVdPUkRbMjQrcjE0XQorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMTUKKwltb3ZiZQlyMTIsUVdPUkRbMTYrcjE0XQorCXZwYWxpZ25yCXhtbTAseG1tNCx4bW00LDgKKwl2cGNsbXVscWRxCXhtbTQseG1tNCx4bW0zLDB4MTAKKwltb3YJUVdPUkRbKCg5Nis4KSkrcnNwXSxyMTMKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTE1CisJbW92CVFXT1JEWygoMTA0KzgpKStyc3BdLHIxMgorCXZhZXNlbmMJeG1tMTMseG1tMTMseG1tMTUKKwl2bW92dXBzCXhtbTEsWE1NV09SRFsoKDEyOC0xMjgpKStyY3hdCisJdmFlc2VuYwl4bW0xNCx4bW0xNCx4bW0xNQorCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMQorCXZtb3Z1cHMJeG1tMTUsWE1NV09SRFsoKDE0NC0xMjgpKStyY3hdCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0xCisJdnBzcmxkcQl4bW02LHhtbTYsOAorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMQorCXZweG9yCXhtbTcseG1tNyx4bW02CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisJdnB4b3IJeG1tNCx4bW00LHhtbTAKKwltb3ZiZQlyMTMsUVdPUkRbOCtyMTRdCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xCisJbW92YmUJcjEyLFFXT1JEW3IxNF0KKwl2YWVzZW5jCXhtbTE0LHhtbTE0LHhtbTEKKwl2bW92dXBzCXhtbTEsWE1NV09SRFsoKDE2MC0xMjgpKStyY3hdCisJY21wCWVicCwxMQorCWpiCU5FQVIgJEwkZW5jX3RhaWwKKworCXZhZXNlbmMJeG1tOSx4bW05LHhtbTE1CisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0xNQorCXZhZXNlbmMJeG1tMTEseG1tMTEseG1tMTUKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTE1CisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xNQorCXZhZXNlbmMJeG1tMTQseG1tMTQseG1tMTUKKworCXZhZXNlbmMJeG1tOSx4bW05LHhtbTEKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTEKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTEKKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTEKKwl2YWVzZW5jCXhtbTEzLHhtbTEzLHhtbTEKKwl2bW92dXBzCXhtbTE1LFhNTVdPUkRbKCgxNzYtMTI4KSkrcmN4XQorCXZhZXNlbmMJeG1tMTQseG1tMTQseG1tMQorCXZtb3Z1cHMJeG1tMSxYTU1XT1JEWygoMTkyLTEyOCkpK3JjeF0KKwlqZQlORUFSICRMJGVuY190YWlsCisKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0xNQorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMTUKKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTE1CisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xNQorCXZhZXNlbmMJeG1tMTMseG1tMTMseG1tMTUKKwl2YWVzZW5jCXhtbTE0LHhtbTE0LHhtbTE1CisKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0xCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0xCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xCisJdmFlc2VuYwl4bW0xMix4bW0xMix4bW0xCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xCisJdm1vdnVwcwl4bW0xNSxYTU1XT1JEWygoMjA4LTEyOCkpK3JjeF0KKwl2YWVzZW5jCXhtbTE0LHhtbTE0LHhtbTEKKwl2bW92dXBzCXhtbTEsWE1NV09SRFsoKDIyNC0xMjgpKStyY3hdCisJam1wCU5FQVIgJEwkZW5jX3RhaWwKKworQUxJR04JMzIKKyRMJGhhbmRsZV9jdHIzMjoKKwl2bW92ZHF1CXhtbTAsWE1NV09SRFtyMTFdCisJdnBzaHVmYgl4bW02LHhtbTEseG1tMAorCXZtb3ZkcXUJeG1tNSxYTU1XT1JEWzQ4K3IxMV0KKwl2cGFkZGQJeG1tMTAseG1tNixYTU1XT1JEWzY0K3IxMV0KKwl2cGFkZGQJeG1tMTEseG1tNix4bW01CisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbKCgwLTMyKSkrcjldCisJdnBhZGRkCXhtbTEyLHhtbTEwLHhtbTUKKwl2cHNodWZiCXhtbTEwLHhtbTEwLHhtbTAKKwl2cGFkZGQJeG1tMTMseG1tMTEseG1tNQorCXZwc2h1ZmIJeG1tMTEseG1tMTEseG1tMAorCXZweG9yCXhtbTEwLHhtbTEwLHhtbTE1CisJdnBhZGRkCXhtbTE0LHhtbTEyLHhtbTUKKwl2cHNodWZiCXhtbTEyLHhtbTEyLHhtbTAKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xNQorCXZwYWRkZAl4bW0xLHhtbTEzLHhtbTUKKwl2cHNodWZiCXhtbTEzLHhtbTEzLHhtbTAKKwl2cHNodWZiCXhtbTE0LHhtbTE0LHhtbTAKKwl2cHNodWZiCXhtbTEseG1tMSx4bW0wCisJam1wCU5FQVIgJEwkcmVzdW1lX2N0cjMyCisKK0FMSUdOCTMyCiskTCRlbmNfdGFpbDoKKwl2YWVzZW5jCXhtbTkseG1tOSx4bW0xNQorCXZtb3ZkcXUJWE1NV09SRFsoMTYrOCkrcnNwXSx4bW03CisJdnBhbGlnbnIJeG1tOCx4bW00LHhtbTQsOAorCXZhZXNlbmMJeG1tMTAseG1tMTAseG1tMTUKKwl2cGNsbXVscWRxCXhtbTQseG1tNCx4bW0zLDB4MTAKKwl2cHhvcgl4bW0yLHhtbTEsWE1NV09SRFtyZGldCisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xNQorCXZweG9yCXhtbTAseG1tMSxYTU1XT1JEWzE2K3JkaV0KKwl2YWVzZW5jCXhtbTEyLHhtbTEyLHhtbTE1CisJdnB4b3IJeG1tNSx4bW0xLFhNTVdPUkRbMzIrcmRpXQorCXZhZXNlbmMJeG1tMTMseG1tMTMseG1tMTUKKwl2cHhvcgl4bW02LHhtbTEsWE1NV09SRFs0OCtyZGldCisJdmFlc2VuYwl4bW0xNCx4bW0xNCx4bW0xNQorCXZweG9yCXhtbTcseG1tMSxYTU1XT1JEWzY0K3JkaV0KKwl2cHhvcgl4bW0zLHhtbTEsWE1NV09SRFs4MCtyZGldCisJdm1vdmRxdQl4bW0xLFhNTVdPUkRbcjhdCisKKwl2YWVzZW5jbGFzdAl4bW05LHhtbTkseG1tMgorCXZtb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3IxMV0KKwl2YWVzZW5jbGFzdAl4bW0xMCx4bW0xMCx4bW0wCisJdnBhZGRiCXhtbTAseG1tMSx4bW0yCisJbW92CVFXT1JEWygoMTEyKzgpKStyc3BdLHIxMworCWxlYQlyZGksWzk2K3JkaV0KKwl2YWVzZW5jbGFzdAl4bW0xMSx4bW0xMSx4bW01CisJdnBhZGRiCXhtbTUseG1tMCx4bW0yCisJbW92CVFXT1JEWygoMTIwKzgpKStyc3BdLHIxMgorCWxlYQlyc2ksWzk2K3JzaV0KKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbKCgwLTEyOCkpK3JjeF0KKwl2YWVzZW5jbGFzdAl4bW0xMix4bW0xMix4bW02CisJdnBhZGRiCXhtbTYseG1tNSx4bW0yCisJdmFlc2VuY2xhc3QJeG1tMTMseG1tMTMseG1tNworCXZwYWRkYgl4bW03LHhtbTYseG1tMgorCXZhZXNlbmNsYXN0CXhtbTE0LHhtbTE0LHhtbTMKKwl2cGFkZGIJeG1tMyx4bW03LHhtbTIKKworCWFkZAlyMTAsMHg2MAorCXN1YglyZHgsMHg2CisJamMJTkVBUiAkTCQ2eF9kb25lCisKKwl2bW92dXBzCVhNTVdPUkRbKC05NikrcnNpXSx4bW05CisJdnB4b3IJeG1tOSx4bW0xLHhtbTE1CisJdm1vdnVwcwlYTU1XT1JEWygtODApK3JzaV0seG1tMTAKKwl2bW92ZHFhCXhtbTEwLHhtbTAKKwl2bW92dXBzCVhNTVdPUkRbKC02NCkrcnNpXSx4bW0xMQorCXZtb3ZkcWEJeG1tMTEseG1tNQorCXZtb3Z1cHMJWE1NV09SRFsoLTQ4KStyc2ldLHhtbTEyCisJdm1vdmRxYQl4bW0xMix4bW02CisJdm1vdnVwcwlYTU1XT1JEWygtMzIpK3JzaV0seG1tMTMKKwl2bW92ZHFhCXhtbTEzLHhtbTcKKwl2bW92dXBzCVhNTVdPUkRbKC0xNikrcnNpXSx4bW0xNAorCXZtb3ZkcWEJeG1tMTQseG1tMworCXZtb3ZkcXUJeG1tNyxYTU1XT1JEWygoMzIrOCkpK3JzcF0KKwlqbXAJTkVBUiAkTCRvb3A2eAorCiskTCQ2eF9kb25lOgorCXZweG9yCXhtbTgseG1tOCxYTU1XT1JEWygoMTYrOCkpK3JzcF0KKwl2cHhvcgl4bW04LHhtbTgseG1tNAorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworZ2xvYmFsCWFlc25pX2djbV9kZWNyeXB0CisKK0FMSUdOCTMyCithZXNuaV9nY21fZGVjcnlwdDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2Flc25pX2djbV9kZWNyeXB0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisKKwl4b3IJcjEwLHIxMAorCisKKworCWNtcAlyZHgsMHg2MAorCWpiCU5FQVIgJEwkZ2NtX2RlY19hYm9ydAorCisJbGVhCXJheCxbcnNwXQorCisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJbGVhCXJzcCxbKCgtMTY4KSkrcnNwXQorCW1vdmFwcwlYTU1XT1JEWygtMjE2KStyYXhdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFsoLTIwMCkrcmF4XSx4bW03CisJbW92YXBzCVhNTVdPUkRbKC0xODQpK3JheF0seG1tOAorCW1vdmFwcwlYTU1XT1JEWygtMTY4KStyYXhdLHhtbTkKKwltb3ZhcHMJWE1NV09SRFsoLTE1MikrcmF4XSx4bW0xMAorCW1vdmFwcwlYTU1XT1JEWygtMTM2KStyYXhdLHhtbTExCisJbW92YXBzCVhNTVdPUkRbKC0xMjApK3JheF0seG1tMTIKKwltb3ZhcHMJWE1NV09SRFsoLTEwNCkrcmF4XSx4bW0xMworCW1vdmFwcwlYTU1XT1JEWygtODgpK3JheF0seG1tMTQKKwltb3ZhcHMJWE1NV09SRFsoLTcyKStyYXhdLHhtbTE1CiskTCRnY21fZGVjX2JvZHk6CisJdnplcm91cHBlcgorCisJdm1vdmRxdQl4bW0xLFhNTVdPUkRbcjhdCisJYWRkCXJzcCwtMTI4CisJbW92CWVieCxEV09SRFsxMityOF0KKwlsZWEJcjExLFskTCRic3dhcF9tYXNrXQorCWxlYQlyMTQsWygoLTEyOCkpK3JjeF0KKwltb3YJcjE1LDB4ZjgwCisJdm1vdmRxdQl4bW04LFhNTVdPUkRbcjldCisJYW5kCXJzcCwtMTI4CisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbcjExXQorCWxlYQlyY3gsWzEyOCtyY3hdCisJbGVhCXI5LFsoKDMyKzMyKSkrcjldCisJbW92CWVicCxEV09SRFsoKDI0MC0xMjgpKStyY3hdCisJdnBzaHVmYgl4bW04LHhtbTgseG1tMAorCisJYW5kCXIxNCxyMTUKKwlhbmQJcjE1LHJzcAorCXN1YglyMTUscjE0CisJamMJTkVBUiAkTCRkZWNfbm9fa2V5X2FsaWFzaW5nCisJY21wCXIxNSw3NjgKKwlqbmMJTkVBUiAkTCRkZWNfbm9fa2V5X2FsaWFzaW5nCisJc3ViCXJzcCxyMTUKKyRMJGRlY19ub19rZXlfYWxpYXNpbmc6CisKKwl2bW92ZHF1CXhtbTcsWE1NV09SRFs4MCtyZGldCisJbGVhCXIxNCxbcmRpXQorCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWzY0K3JkaV0KKworCisKKworCisKKworCWxlYQlyMTUsWygoLTE5MikpK3JkeCoxK3JkaV0KKworCXZtb3ZkcXUJeG1tNSxYTU1XT1JEWzQ4K3JkaV0KKwlzaHIJcmR4LDQKKwl4b3IJcjEwLHIxMAorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWzMyK3JkaV0KKwl2cHNodWZiCXhtbTcseG1tNyx4bW0wCisJdm1vdmRxdQl4bW0yLFhNTVdPUkRbMTYrcmRpXQorCXZwc2h1ZmIJeG1tNCx4bW00LHhtbTAKKwl2bW92ZHF1CXhtbTMsWE1NV09SRFtyZGldCisJdnBzaHVmYgl4bW01LHhtbTUseG1tMAorCXZtb3ZkcXUJWE1NV09SRFs0OCtyc3BdLHhtbTQKKwl2cHNodWZiCXhtbTYseG1tNix4bW0wCisJdm1vdmRxdQlYTU1XT1JEWzY0K3JzcF0seG1tNQorCXZwc2h1ZmIJeG1tMix4bW0yLHhtbTAKKwl2bW92ZHF1CVhNTVdPUkRbODArcnNwXSx4bW02CisJdnBzaHVmYgl4bW0zLHhtbTMseG1tMAorCXZtb3ZkcXUJWE1NV09SRFs5Nityc3BdLHhtbTIKKwl2bW92ZHF1CVhNTVdPUkRbMTEyK3JzcF0seG1tMworCisJY2FsbAlfYWVzbmlfY3RyMzJfZ2hhc2hfNngKKworCXZtb3Z1cHMJWE1NV09SRFsoLTk2KStyc2ldLHhtbTkKKwl2bW92dXBzCVhNTVdPUkRbKC04MCkrcnNpXSx4bW0xMAorCXZtb3Z1cHMJWE1NV09SRFsoLTY0KStyc2ldLHhtbTExCisJdm1vdnVwcwlYTU1XT1JEWygtNDgpK3JzaV0seG1tMTIKKwl2bW92dXBzCVhNTVdPUkRbKC0zMikrcnNpXSx4bW0xMworCXZtb3Z1cHMJWE1NV09SRFsoLTE2KStyc2ldLHhtbTE0CisKKwl2cHNodWZiCXhtbTgseG1tOCxYTU1XT1JEW3IxMV0KKwl2bW92ZHF1CVhNTVdPUkRbKC02NCkrcjldLHhtbTgKKworCXZ6ZXJvdXBwZXIKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTIxNikpK3JheF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWygoLTIwMCkpK3JheF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoLTE4NCkpK3JheF0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTE2OCkpK3JheF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFsoKC0xNTIpKStyYXhdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbKCgtMTM2KSkrcmF4XQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWygoLTEyMCkpK3JheF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsoKC0xMDQpKStyYXhdCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbKCgtODgpKStyYXhdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbKCgtNzIpKStyYXhdCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JheF0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyYXhdCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYXhdCisKKwlsZWEJcnNwLFtyYXhdCisKKyRMJGdjbV9kZWNfYWJvcnQ6CisJbW92CXJheCxyMTAKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXNuaV9nY21fZGVjcnlwdDoKKworQUxJR04JMzIKK19hZXNuaV9jdHIzMl82eDoKKworCXZtb3ZkcXUJeG1tNCxYTU1XT1JEWygoMC0xMjgpKStyY3hdCisJdm1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcjExXQorCWxlYQlyMTMsWygoLTEpKStyYnBdCisJdm1vdnVwcwl4bW0xNSxYTU1XT1JEWygoMTYtMTI4KSkrcmN4XQorCWxlYQlyMTIsWygoMzItMTI4KSkrcmN4XQorCXZweG9yCXhtbTkseG1tMSx4bW00CisJYWRkCWVieCwxMDA2NjMyOTYKKwlqYwlORUFSICRMJGhhbmRsZV9jdHIzMl8yCisJdnBhZGRiCXhtbTEwLHhtbTEseG1tMgorCXZwYWRkYgl4bW0xMSx4bW0xMCx4bW0yCisJdnB4b3IJeG1tMTAseG1tMTAseG1tNAorCXZwYWRkYgl4bW0xMix4bW0xMSx4bW0yCisJdnB4b3IJeG1tMTEseG1tMTEseG1tNAorCXZwYWRkYgl4bW0xMyx4bW0xMix4bW0yCisJdnB4b3IJeG1tMTIseG1tMTIseG1tNAorCXZwYWRkYgl4bW0xNCx4bW0xMyx4bW0yCisJdnB4b3IJeG1tMTMseG1tMTMseG1tNAorCXZwYWRkYgl4bW0xLHhtbTE0LHhtbTIKKwl2cHhvcgl4bW0xNCx4bW0xNCx4bW00CisJam1wCU5FQVIgJEwkb29wX2N0cjMyCisKK0FMSUdOCTE2CiskTCRvb3BfY3RyMzI6CisJdmFlc2VuYwl4bW05LHhtbTkseG1tMTUKKwl2YWVzZW5jCXhtbTEwLHhtbTEwLHhtbTE1CisJdmFlc2VuYwl4bW0xMSx4bW0xMSx4bW0xNQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMTUKKwl2YWVzZW5jCXhtbTEzLHhtbTEzLHhtbTE1CisJdmFlc2VuYwl4bW0xNCx4bW0xNCx4bW0xNQorCXZtb3Z1cHMJeG1tMTUsWE1NV09SRFtyMTJdCisJbGVhCXIxMixbMTYrcjEyXQorCWRlYwlyMTNkCisJam56CU5FQVIgJEwkb29wX2N0cjMyCisKKwl2bW92ZHF1CXhtbTMsWE1NV09SRFtyMTJdCisJdmFlc2VuYwl4bW05LHhtbTkseG1tMTUKKwl2cHhvcgl4bW00LHhtbTMsWE1NV09SRFtyZGldCisJdmFlc2VuYwl4bW0xMCx4bW0xMCx4bW0xNQorCXZweG9yCXhtbTUseG1tMyxYTU1XT1JEWzE2K3JkaV0KKwl2YWVzZW5jCXhtbTExLHhtbTExLHhtbTE1CisJdnB4b3IJeG1tNix4bW0zLFhNTVdPUkRbMzIrcmRpXQorCXZhZXNlbmMJeG1tMTIseG1tMTIseG1tMTUKKwl2cHhvcgl4bW04LHhtbTMsWE1NV09SRFs0OCtyZGldCisJdmFlc2VuYwl4bW0xMyx4bW0xMyx4bW0xNQorCXZweG9yCXhtbTIseG1tMyxYTU1XT1JEWzY0K3JkaV0KKwl2YWVzZW5jCXhtbTE0LHhtbTE0LHhtbTE1CisJdnB4b3IJeG1tMyx4bW0zLFhNTVdPUkRbODArcmRpXQorCWxlYQlyZGksWzk2K3JkaV0KKworCXZhZXNlbmNsYXN0CXhtbTkseG1tOSx4bW00CisJdmFlc2VuY2xhc3QJeG1tMTAseG1tMTAseG1tNQorCXZhZXNlbmNsYXN0CXhtbTExLHhtbTExLHhtbTYKKwl2YWVzZW5jbGFzdAl4bW0xMix4bW0xMix4bW04CisJdmFlc2VuY2xhc3QJeG1tMTMseG1tMTMseG1tMgorCXZhZXNlbmNsYXN0CXhtbTE0LHhtbTE0LHhtbTMKKwl2bW92dXBzCVhNTVdPUkRbcnNpXSx4bW05CisJdm1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMTAKKwl2bW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW0xMQorCXZtb3Z1cHMJWE1NV09SRFs0OCtyc2ldLHhtbTEyCisJdm1vdnVwcwlYTU1XT1JEWzY0K3JzaV0seG1tMTMKKwl2bW92dXBzCVhNTVdPUkRbODArcnNpXSx4bW0xNAorCWxlYQlyc2ksWzk2K3JzaV0KKworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorQUxJR04JMzIKKyRMJGhhbmRsZV9jdHIzMl8yOgorCXZwc2h1ZmIJeG1tNix4bW0xLHhtbTAKKwl2bW92ZHF1CXhtbTUsWE1NV09SRFs0OCtyMTFdCisJdnBhZGRkCXhtbTEwLHhtbTYsWE1NV09SRFs2NCtyMTFdCisJdnBhZGRkCXhtbTExLHhtbTYseG1tNQorCXZwYWRkZAl4bW0xMix4bW0xMCx4bW01CisJdnBzaHVmYgl4bW0xMCx4bW0xMCx4bW0wCisJdnBhZGRkCXhtbTEzLHhtbTExLHhtbTUKKwl2cHNodWZiCXhtbTExLHhtbTExLHhtbTAKKwl2cHhvcgl4bW0xMCx4bW0xMCx4bW00CisJdnBhZGRkCXhtbTE0LHhtbTEyLHhtbTUKKwl2cHNodWZiCXhtbTEyLHhtbTEyLHhtbTAKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW00CisJdnBhZGRkCXhtbTEseG1tMTMseG1tNQorCXZwc2h1ZmIJeG1tMTMseG1tMTMseG1tMAorCXZweG9yCXhtbTEyLHhtbTEyLHhtbTQKKwl2cHNodWZiCXhtbTE0LHhtbTE0LHhtbTAKKwl2cHhvcgl4bW0xMyx4bW0xMyx4bW00CisJdnBzaHVmYgl4bW0xLHhtbTEseG1tMAorCXZweG9yCXhtbTE0LHhtbTE0LHhtbTQKKwlqbXAJTkVBUiAkTCRvb3BfY3RyMzIKKworCisKK2dsb2JhbAlhZXNuaV9nY21fZW5jcnlwdAorCitBTElHTgkzMgorYWVzbmlfZ2NtX2VuY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNuaV9nY21fZW5jcnlwdDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCW1vdglyOSxRV09SRFs0OCtyc3BdCisKKworCisJeG9yCXIxMCxyMTAKKworCisKKworCWNtcAlyZHgsMHg2MCozCisJamIJTkVBUiAkTCRnY21fZW5jX2Fib3J0CisKKwlsZWEJcmF4LFtyc3BdCisKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKwlsZWEJcnNwLFsoKC0xNjgpKStyc3BdCisJbW92YXBzCVhNTVdPUkRbKC0yMTYpK3JheF0seG1tNgorCW1vdmFwcwlYTU1XT1JEWygtMjAwKStyYXhdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFsoLTE4NCkrcmF4XSx4bW04CisJbW92YXBzCVhNTVdPUkRbKC0xNjgpK3JheF0seG1tOQorCW1vdmFwcwlYTU1XT1JEWygtMTUyKStyYXhdLHhtbTEwCisJbW92YXBzCVhNTVdPUkRbKC0xMzYpK3JheF0seG1tMTEKKwltb3ZhcHMJWE1NV09SRFsoLTEyMCkrcmF4XSx4bW0xMgorCW1vdmFwcwlYTU1XT1JEWygtMTA0KStyYXhdLHhtbTEzCisJbW92YXBzCVhNTVdPUkRbKC04OCkrcmF4XSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWygtNzIpK3JheF0seG1tMTUKKyRMJGdjbV9lbmNfYm9keToKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CXhtbTEsWE1NV09SRFtyOF0KKwlhZGQJcnNwLC0xMjgKKwltb3YJZWJ4LERXT1JEWzEyK3I4XQorCWxlYQlyMTEsWyRMJGJzd2FwX21hc2tdCisJbGVhCXIxNCxbKCgtMTI4KSkrcmN4XQorCW1vdglyMTUsMHhmODAKKwlsZWEJcmN4LFsxMjgrcmN4XQorCXZtb3ZkcXUJeG1tMCxYTU1XT1JEW3IxMV0KKwlhbmQJcnNwLC0xMjgKKwltb3YJZWJwLERXT1JEWygoMjQwLTEyOCkpK3JjeF0KKworCWFuZAlyMTQscjE1CisJYW5kCXIxNSxyc3AKKwlzdWIJcjE1LHIxNAorCWpjCU5FQVIgJEwkZW5jX25vX2tleV9hbGlhc2luZworCWNtcAlyMTUsNzY4CisJam5jCU5FQVIgJEwkZW5jX25vX2tleV9hbGlhc2luZworCXN1Yglyc3AscjE1CiskTCRlbmNfbm9fa2V5X2FsaWFzaW5nOgorCisJbGVhCXIxNCxbcnNpXQorCisKKworCisKKworCisKKwlsZWEJcjE1LFsoKC0xOTIpKStyZHgqMStyc2ldCisKKwlzaHIJcmR4LDQKKworCWNhbGwJX2Flc25pX2N0cjMyXzZ4CisJdnBzaHVmYgl4bW04LHhtbTkseG1tMAorCXZwc2h1ZmIJeG1tMix4bW0xMCx4bW0wCisJdm1vdmRxdQlYTU1XT1JEWzExMityc3BdLHhtbTgKKwl2cHNodWZiCXhtbTQseG1tMTEseG1tMAorCXZtb3ZkcXUJWE1NV09SRFs5Nityc3BdLHhtbTIKKwl2cHNodWZiCXhtbTUseG1tMTIseG1tMAorCXZtb3ZkcXUJWE1NV09SRFs4MCtyc3BdLHhtbTQKKwl2cHNodWZiCXhtbTYseG1tMTMseG1tMAorCXZtb3ZkcXUJWE1NV09SRFs2NCtyc3BdLHhtbTUKKwl2cHNodWZiCXhtbTcseG1tMTQseG1tMAorCXZtb3ZkcXUJWE1NV09SRFs0OCtyc3BdLHhtbTYKKworCWNhbGwJX2Flc25pX2N0cjMyXzZ4CisKKwl2bW92ZHF1CXhtbTgsWE1NV09SRFtyOV0KKwlsZWEJcjksWygoMzIrMzIpKStyOV0KKwlzdWIJcmR4LDEyCisJbW92CXIxMCwweDYwKjIKKwl2cHNodWZiCXhtbTgseG1tOCx4bW0wCisKKwljYWxsCV9hZXNuaV9jdHIzMl9naGFzaF82eAorCXZtb3ZkcXUJeG1tNyxYTU1XT1JEWzMyK3JzcF0KKwl2bW92ZHF1CXhtbTAsWE1NV09SRFtyMTFdCisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbKCgwLTMyKSkrcjldCisJdnB1bnBja2hxZHEJeG1tMSx4bW03LHhtbTcKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbKCgzMi0zMikpK3I5XQorCXZtb3Z1cHMJWE1NV09SRFsoLTk2KStyc2ldLHhtbTkKKwl2cHNodWZiCXhtbTkseG1tOSx4bW0wCisJdnB4b3IJeG1tMSx4bW0xLHhtbTcKKwl2bW92dXBzCVhNTVdPUkRbKC04MCkrcnNpXSx4bW0xMAorCXZwc2h1ZmIJeG1tMTAseG1tMTAseG1tMAorCXZtb3Z1cHMJWE1NV09SRFsoLTY0KStyc2ldLHhtbTExCisJdnBzaHVmYgl4bW0xMSx4bW0xMSx4bW0wCisJdm1vdnVwcwlYTU1XT1JEWygtNDgpK3JzaV0seG1tMTIKKwl2cHNodWZiCXhtbTEyLHhtbTEyLHhtbTAKKwl2bW92dXBzCVhNTVdPUkRbKC0zMikrcnNpXSx4bW0xMworCXZwc2h1ZmIJeG1tMTMseG1tMTMseG1tMAorCXZtb3Z1cHMJWE1NV09SRFsoLTE2KStyc2ldLHhtbTE0CisJdnBzaHVmYgl4bW0xNCx4bW0xNCx4bW0wCisJdm1vdmRxdQlYTU1XT1JEWzE2K3JzcF0seG1tOQorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWzQ4K3JzcF0KKwl2bW92ZHF1CXhtbTAsWE1NV09SRFsoKDE2LTMyKSkrcjldCisJdnB1bnBja2hxZHEJeG1tMix4bW02LHhtbTYKKwl2cGNsbXVscWRxCXhtbTUseG1tNyx4bW0zLDB4MDAKKwl2cHhvcgl4bW0yLHhtbTIseG1tNgorCXZwY2xtdWxxZHEJeG1tNyx4bW03LHhtbTMsMHgxMQorCXZwY2xtdWxxZHEJeG1tMSx4bW0xLHhtbTE1LDB4MDAKKworCXZtb3ZkcXUJeG1tOSxYTU1XT1JEWzY0K3JzcF0KKwl2cGNsbXVscWRxCXhtbTQseG1tNix4bW0wLDB4MDAKKwl2bW92ZHF1CXhtbTMsWE1NV09SRFsoKDQ4LTMyKSkrcjldCisJdnB4b3IJeG1tNCx4bW00LHhtbTUKKwl2cHVucGNraHFkcQl4bW01LHhtbTkseG1tOQorCXZwY2xtdWxxZHEJeG1tNix4bW02LHhtbTAsMHgxMQorCXZweG9yCXhtbTUseG1tNSx4bW05CisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwl2cGNsbXVscWRxCXhtbTIseG1tMix4bW0xNSwweDEwCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWygoODAtMzIpKStyOV0KKwl2cHhvcgl4bW0yLHhtbTIseG1tMQorCisJdm1vdmRxdQl4bW0xLFhNTVdPUkRbODArcnNwXQorCXZwY2xtdWxxZHEJeG1tNyx4bW05LHhtbTMsMHgwMAorCXZtb3ZkcXUJeG1tMCxYTU1XT1JEWygoNjQtMzIpKStyOV0KKwl2cHhvcgl4bW03LHhtbTcseG1tNAorCXZwdW5wY2tocWRxCXhtbTQseG1tMSx4bW0xCisJdnBjbG11bHFkcQl4bW05LHhtbTkseG1tMywweDExCisJdnB4b3IJeG1tNCx4bW00LHhtbTEKKwl2cHhvcgl4bW05LHhtbTkseG1tNgorCXZwY2xtdWxxZHEJeG1tNSx4bW01LHhtbTE1LDB4MDAKKwl2cHhvcgl4bW01LHhtbTUseG1tMgorCisJdm1vdmRxdQl4bW0yLFhNTVdPUkRbOTYrcnNwXQorCXZwY2xtdWxxZHEJeG1tNix4bW0xLHhtbTAsMHgwMAorCXZtb3ZkcXUJeG1tMyxYTU1XT1JEWygoOTYtMzIpKStyOV0KKwl2cHhvcgl4bW02LHhtbTYseG1tNworCXZwdW5wY2tocWRxCXhtbTcseG1tMix4bW0yCisJdnBjbG11bHFkcQl4bW0xLHhtbTEseG1tMCwweDExCisJdnB4b3IJeG1tNyx4bW03LHhtbTIKKwl2cHhvcgl4bW0xLHhtbTEseG1tOQorCXZwY2xtdWxxZHEJeG1tNCx4bW00LHhtbTE1LDB4MTAKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbKCgxMjgtMzIpKStyOV0KKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCisJdnB4b3IJeG1tOCx4bW04LFhNTVdPUkRbMTEyK3JzcF0KKwl2cGNsbXVscWRxCXhtbTUseG1tMix4bW0zLDB4MDAKKwl2bW92ZHF1CXhtbTAsWE1NV09SRFsoKDExMi0zMikpK3I5XQorCXZwdW5wY2tocWRxCXhtbTkseG1tOCx4bW04CisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKwl2cGNsbXVscWRxCXhtbTIseG1tMix4bW0zLDB4MTEKKwl2cHhvcgl4bW05LHhtbTkseG1tOAorCXZweG9yCXhtbTIseG1tMix4bW0xCisJdnBjbG11bHFkcQl4bW03LHhtbTcseG1tMTUsMHgwMAorCXZweG9yCXhtbTQseG1tNyx4bW00CisKKwl2cGNsbXVscWRxCXhtbTYseG1tOCx4bW0wLDB4MDAKKwl2bW92ZHF1CXhtbTMsWE1NV09SRFsoKDAtMzIpKStyOV0KKwl2cHVucGNraHFkcQl4bW0xLHhtbTE0LHhtbTE0CisJdnBjbG11bHFkcQl4bW04LHhtbTgseG1tMCwweDExCisJdnB4b3IJeG1tMSx4bW0xLHhtbTE0CisJdnB4b3IJeG1tNSx4bW02LHhtbTUKKwl2cGNsbXVscWRxCXhtbTkseG1tOSx4bW0xNSwweDEwCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWygoMzItMzIpKStyOV0KKwl2cHhvcgl4bW03LHhtbTgseG1tMgorCXZweG9yCXhtbTYseG1tOSx4bW00CisKKwl2bW92ZHF1CXhtbTAsWE1NV09SRFsoKDE2LTMyKSkrcjldCisJdnB4b3IJeG1tOSx4bW03LHhtbTUKKwl2cGNsbXVscWRxCXhtbTQseG1tMTQseG1tMywweDAwCisJdnB4b3IJeG1tNix4bW02LHhtbTkKKwl2cHVucGNraHFkcQl4bW0yLHhtbTEzLHhtbTEzCisJdnBjbG11bHFkcQl4bW0xNCx4bW0xNCx4bW0zLDB4MTEKKwl2cHhvcgl4bW0yLHhtbTIseG1tMTMKKwl2cHNsbGRxCXhtbTkseG1tNiw4CisJdnBjbG11bHFkcQl4bW0xLHhtbTEseG1tMTUsMHgwMAorCXZweG9yCXhtbTgseG1tNSx4bW05CisJdnBzcmxkcQl4bW02LHhtbTYsOAorCXZweG9yCXhtbTcseG1tNyx4bW02CisKKwl2cGNsbXVscWRxCXhtbTUseG1tMTMseG1tMCwweDAwCisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbKCg0OC0zMikpK3I5XQorCXZweG9yCXhtbTUseG1tNSx4bW00CisJdnB1bnBja2hxZHEJeG1tOSx4bW0xMix4bW0xMgorCXZwY2xtdWxxZHEJeG1tMTMseG1tMTMseG1tMCwweDExCisJdnB4b3IJeG1tOSx4bW05LHhtbTEyCisJdnB4b3IJeG1tMTMseG1tMTMseG1tMTQKKwl2cGFsaWducgl4bW0xNCx4bW04LHhtbTgsOAorCXZwY2xtdWxxZHEJeG1tMix4bW0yLHhtbTE1LDB4MTAKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbKCg4MC0zMikpK3I5XQorCXZweG9yCXhtbTIseG1tMix4bW0xCisKKwl2cGNsbXVscWRxCXhtbTQseG1tMTIseG1tMywweDAwCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbKCg2NC0zMikpK3I5XQorCXZweG9yCXhtbTQseG1tNCx4bW01CisJdnB1bnBja2hxZHEJeG1tMSx4bW0xMSx4bW0xMQorCXZwY2xtdWxxZHEJeG1tMTIseG1tMTIseG1tMywweDExCisJdnB4b3IJeG1tMSx4bW0xLHhtbTExCisJdnB4b3IJeG1tMTIseG1tMTIseG1tMTMKKwl2eG9ycHMJeG1tNyx4bW03LFhNTVdPUkRbMTYrcnNwXQorCXZwY2xtdWxxZHEJeG1tOSx4bW05LHhtbTE1LDB4MDAKKwl2cHhvcgl4bW05LHhtbTkseG1tMgorCisJdnBjbG11bHFkcQl4bW04LHhtbTgsWE1NV09SRFsxNityMTFdLDB4MTAKKwl2eG9ycHMJeG1tOCx4bW04LHhtbTE0CisKKwl2cGNsbXVscWRxCXhtbTUseG1tMTEseG1tMCwweDAwCisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbKCg5Ni0zMikpK3I5XQorCXZweG9yCXhtbTUseG1tNSx4bW00CisJdnB1bnBja2hxZHEJeG1tMix4bW0xMCx4bW0xMAorCXZwY2xtdWxxZHEJeG1tMTEseG1tMTEseG1tMCwweDExCisJdnB4b3IJeG1tMix4bW0yLHhtbTEwCisJdnBhbGlnbnIJeG1tMTQseG1tOCx4bW04LDgKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMgorCXZwY2xtdWxxZHEJeG1tMSx4bW0xLHhtbTE1LDB4MTAKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbKCgxMjgtMzIpKStyOV0KKwl2cHhvcgl4bW0xLHhtbTEseG1tOQorCisJdnhvcnBzCXhtbTE0LHhtbTE0LHhtbTcKKwl2cGNsbXVscWRxCXhtbTgseG1tOCxYTU1XT1JEWzE2K3IxMV0sMHgxMAorCXZ4b3Jwcwl4bW04LHhtbTgseG1tMTQKKworCXZwY2xtdWxxZHEJeG1tNCx4bW0xMCx4bW0zLDB4MDAKKwl2bW92ZHF1CXhtbTAsWE1NV09SRFsoKDExMi0zMikpK3I5XQorCXZweG9yCXhtbTQseG1tNCx4bW01CisJdnB1bnBja2hxZHEJeG1tOSx4bW04LHhtbTgKKwl2cGNsbXVscWRxCXhtbTEwLHhtbTEwLHhtbTMsMHgxMQorCXZweG9yCXhtbTkseG1tOSx4bW04CisJdnB4b3IJeG1tMTAseG1tMTAseG1tMTEKKwl2cGNsbXVscWRxCXhtbTIseG1tMix4bW0xNSwweDAwCisJdnB4b3IJeG1tMix4bW0yLHhtbTEKKworCXZwY2xtdWxxZHEJeG1tNSx4bW04LHhtbTAsMHgwMAorCXZwY2xtdWxxZHEJeG1tNyx4bW04LHhtbTAsMHgxMQorCXZweG9yCXhtbTUseG1tNSx4bW00CisJdnBjbG11bHFkcQl4bW02LHhtbTkseG1tMTUsMHgxMAorCXZweG9yCXhtbTcseG1tNyx4bW0xMAorCXZweG9yCXhtbTYseG1tNix4bW0yCisKKwl2cHhvcgl4bW00LHhtbTcseG1tNQorCXZweG9yCXhtbTYseG1tNix4bW00CisJdnBzbGxkcQl4bW0xLHhtbTYsOAorCXZtb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3IxMV0KKwl2cHNybGRxCXhtbTYseG1tNiw4CisJdnB4b3IJeG1tOCx4bW01LHhtbTEKKwl2cHhvcgl4bW03LHhtbTcseG1tNgorCisJdnBhbGlnbnIJeG1tMix4bW04LHhtbTgsOAorCXZwY2xtdWxxZHEJeG1tOCx4bW04LHhtbTMsMHgxMAorCXZweG9yCXhtbTgseG1tOCx4bW0yCisKKwl2cGFsaWducgl4bW0yLHhtbTgseG1tOCw4CisJdnBjbG11bHFkcQl4bW04LHhtbTgseG1tMywweDEwCisJdnB4b3IJeG1tMix4bW0yLHhtbTcKKwl2cHhvcgl4bW04LHhtbTgseG1tMgorCXZwc2h1ZmIJeG1tOCx4bW04LFhNTVdPUkRbcjExXQorCXZtb3ZkcXUJWE1NV09SRFsoLTY0KStyOV0seG1tOAorCisJdnplcm91cHBlcgorCW1vdmFwcwl4bW02LFhNTVdPUkRbKCgtMjE2KSkrcmF4XQorCW1vdmFwcwl4bW03LFhNTVdPUkRbKCgtMjAwKSkrcmF4XQorCW1vdmFwcwl4bW04LFhNTVdPUkRbKCgtMTg0KSkrcmF4XQorCW1vdmFwcwl4bW05LFhNTVdPUkRbKCgtMTY4KSkrcmF4XQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWygoLTE1MikpK3JheF0KKwltb3ZhcHMJeG1tMTEsWE1NV09SRFsoKC0xMzYpKStyYXhdCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbKCgtMTIwKSkrcmF4XQorCW1vdmFwcwl4bW0xMyxYTU1XT1JEWygoLTEwNCkpK3JheF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsoKC04OCkpK3JheF0KKwltb3ZhcHMJeG1tMTUsWE1NV09SRFsoKC03MikpK3JheF0KKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcmF4XQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JheF0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyYXhdCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcmF4XQorCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JheF0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JheF0KKworCWxlYQlyc3AsW3JheF0KKworJEwkZ2NtX2VuY19hYm9ydDoKKwltb3YJcmF4LHIxMAorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2Flc25pX2djbV9lbmNyeXB0OgorQUxJR04JNjQKKyRMJGJzd2FwX21hc2s6CitEQgkxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSwwCiskTCRwb2x5OgorREIJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMHhjMgorJEwkb25lX21zYjoKK0RCCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEKKyRMJHR3b19sc2I6CitEQgkyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCiskTCRvbmVfbHNiOgorREIJMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorREIJNjUsNjksODMsNDUsNzgsNzMsMzIsNzEsNjcsNzcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOAorREIJMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NCw1Miw0NCwzMiw2Nyw4MgorREIJODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIKK0RCCTExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKK0FMSUdOCTY0CitFWFRFUk4JX19pbXBfUnRsVmlydHVhbFVud2luZAorCitBTElHTgkxNgorZ2NtX3NlX2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTIwK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbW92CXJzaSxRV09SRFs4K3I5XQorCW1vdglyMTEsUVdPUkRbNTYrcjldCisKKwltb3YJcjEwZCxEV09SRFtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKworCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JheF0KKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JheF0KKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYXhdCisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisKKwlsZWEJcnNpLFsoKC0yMTYpKStyYXhdCisJbGVhCXJkaSxbNTEyK3I4XQorCW1vdgllY3gsMjAKKwlERAkweGE1NDhmM2ZjCisKKyRMJGNvbW1vbl9zZWhfdGFpbDoKKwltb3YJcmRpLFFXT1JEWzgrcmF4XQorCW1vdglyc2ksUVdPUkRbMTYrcmF4XQorCW1vdglRV09SRFsxNTIrcjhdLHJheAorCW1vdglRV09SRFsxNjgrcjhdLHJzaQorCW1vdglRV09SRFsxNzYrcjhdLHJkaQorCisJbW92CXJkaSxRV09SRFs0MCtyOV0KKwltb3YJcnNpLHI4CisJbW92CWVjeCwxNTQKKwlERAkweGE1NDhmM2ZjCisKKwltb3YJcnNpLHI5CisJeG9yCXJjeCxyY3gKKwltb3YJcmR4LFFXT1JEWzgrcnNpXQorCW1vdglyOCxRV09SRFtyc2ldCisJbW92CXI5LFFXT1JEWzE2K3JzaV0KKwltb3YJcjEwLFFXT1JEWzQwK3JzaV0KKwlsZWEJcjExLFs1Nityc2ldCisJbGVhCXIxMixbMjQrcnNpXQorCW1vdglRV09SRFszMityc3BdLHIxMAorCW1vdglRV09SRFs0MCtyc3BdLHIxMQorCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCW1vdglRV09SRFs1Nityc3BdLHJjeAorCWNhbGwJUVdPUkRbX19pbXBfUnRsVmlydHVhbFVud2luZF0KKworCW1vdgllYXgsMQorCWFkZAlyc3AsNjQKKwlwb3BmcQorCXBvcAlyMTUKKwlwb3AJcjE0CisJcG9wCXIxMworCXBvcAlyMTIKKwlwb3AJcmJwCisJcG9wCXJieAorCXBvcAlyZGkKKwlwb3AJcnNpCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworc2VjdGlvbgkucGRhdGEgcmRhdGEgYWxpZ249NAorQUxJR04JNAorCURECSRMJFNFSF9iZWdpbl9hZXNuaV9nY21fZGVjcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2Flc25pX2djbV9kZWNyeXB0IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9nY21fZGVjX2luZm8gd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fYWVzbmlfZ2NtX2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNuaV9nY21fZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZ2NtX2VuY19pbmZvIHdydCAuLmltYWdlYmFzZQorc2VjdGlvbgkueGRhdGEgcmRhdGEgYWxpZ249OAorQUxJR04JOAorJEwkU0VIX2djbV9kZWNfaW5mbzoKK0RCCTksMCwwLDAKKwlERAlnY21fc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRnY21fZGVjX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJGdjbV9kZWNfYWJvcnQgd3J0IC4uaW1hZ2ViYXNlCiskTCRTRUhfZ2NtX2VuY19pbmZvOgorREIJOSwwLDAsMAorCURECWdjbV9zZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGdjbV9lbmNfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkZ2NtX2VuY19hYm9ydCB3cnQgLi5pbWFnZWJhc2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2Flc25pLXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiZTNhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9hZXNuaS14ODZfNjQuYXNtCkBAIC0wLDAgKzEsNTA1NCBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCitFWFRFUk4JT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlhZXNfaHdfZW5jcnlwdAorCitBTElHTgkxNgorYWVzX2h3X2VuY3J5cHQ6CisJbW92dXBzCXhtbTIsWE1NV09SRFtyY3hdCisJbW92CWVheCxEV09SRFsyNDArcjhdCisJbW92dXBzCXhtbTAsWE1NV09SRFtyOF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3I4XQorCWxlYQlyOCxbMzIrcjhdCisJeG9ycHMJeG1tMix4bW0wCiskTCRvb3BfZW5jMV8xOgorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWMJZWF4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyOF0KKwlsZWEJcjgsWzE2K3I4XQorCWpueglORUFSICRMJG9vcF9lbmMxXzEKK0RCCTEwMiwxNSw1NiwyMjEsMjA5CisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCW1vdnVwcwlYTU1XT1JEW3JkeF0seG1tMgorCXB4b3IJeG1tMix4bW0yCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworZ2xvYmFsCWFlc19od19kZWNyeXB0CisKK0FMSUdOCTE2CithZXNfaHdfZGVjcnlwdDoKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3JjeF0KKwltb3YJZWF4LERXT1JEWzI0MCtyOF0KKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3I4XQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcjhdCisJbGVhCXI4LFszMityOF0KKwl4b3Jwcwl4bW0yLHhtbTAKKyRMJG9vcF9kZWMxXzI6CitEQgkxMDIsMTUsNTYsMjIyLDIwOQorCWRlYwllYXgKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3I4XQorCWxlYQlyOCxbMTYrcjhdCisJam56CU5FQVIgJEwkb29wX2RlYzFfMgorREIJMTAyLDE1LDU2LDIyMywyMDkKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJbW92dXBzCVhNTVdPUkRbcmR4XSx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitBTElHTgkxNgorX2Flc25pX2VuY3J5cHQyOgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCXNobAllYXgsNAorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmN4XQorCXhvcnBzCXhtbTIseG1tMAorCXhvcnBzCXhtbTMseG1tMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbMzIrcmN4XQorCWxlYQlyY3gsWzMyK3JheCoxK3JjeF0KKwluZWcJcmF4CisJYWRkCXJheCwxNgorCiskTCRlbmNfbG9vcDI6CitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCitEQgkxMDIsMTUsNTYsMjIwLDIwOAorREIJMTAyLDE1LDU2LDIyMCwyMTYKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcmF4KjErcmN4XQorCWpueglORUFSICRMJGVuY19sb29wMgorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjEsMjA4CitEQgkxMDIsMTUsNTYsMjIxLDIxNgorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTE2CitfYWVzbmlfZGVjcnlwdDI6CisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJc2hsCWVheCw0CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJeG9ycHMJeG1tMix4bW0wCisJeG9ycHMJeG1tMyx4bW0wCisJbW92dXBzCXhtbTAsWE1NV09SRFszMityY3hdCisJbGVhCXJjeCxbMzIrcmF4KjErcmN4XQorCW5lZwlyYXgKKwlhZGQJcmF4LDE2CisKKyRMJGRlY19sb29wMjoKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmF4KjErcmN4XQorCWFkZAlyYXgsMzIKK0RCCTEwMiwxNSw1NiwyMjIsMjA4CitEQgkxMDIsMTUsNTYsMjIyLDIxNgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgtMTYpKStyYXgqMStyY3hdCisJam56CU5FQVIgJEwkZGVjX2xvb3AyCisKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworREIJMTAyLDE1LDU2LDIyMywyMDgKK0RCCTEwMiwxNSw1NiwyMjMsMjE2CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworQUxJR04JMTYKK19hZXNuaV9lbmNyeXB0MzoKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwlzaGwJZWF4LDQKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKwl4b3Jwcwl4bW0zLHhtbTAKKwl4b3Jwcwl4bW00LHhtbTAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzMyK3JjeF0KKwlsZWEJcmN4LFszMityYXgqMStyY3hdCisJbmVnCXJheAorCWFkZAlyYXgsMTYKKworJEwkZW5jX2xvb3AzOgorREIJMTAyLDE1LDU2LDIyMCwyMDkKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CitEQgkxMDIsMTUsNTYsMjIwLDIyNQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmF4KjErcmN4XQorCWFkZAlyYXgsMzIKK0RCCTEwMiwxNSw1NiwyMjAsMjA4CitEQgkxMDIsMTUsNTYsMjIwLDIxNgorREIJMTAyLDE1LDU2LDIyMCwyMjQKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcmF4KjErcmN4XQorCWpueglORUFSICRMJGVuY19sb29wMworCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIxLDIwOAorREIJMTAyLDE1LDU2LDIyMSwyMTYKK0RCCTEwMiwxNSw1NiwyMjEsMjI0CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworQUxJR04JMTYKK19hZXNuaV9kZWNyeXB0MzoKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwlzaGwJZWF4LDQKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKwl4b3Jwcwl4bW0zLHhtbTAKKwl4b3Jwcwl4bW00LHhtbTAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzMyK3JjeF0KKwlsZWEJcmN4LFszMityYXgqMStyY3hdCisJbmVnCXJheAorCWFkZAlyYXgsMTYKKworJEwkZGVjX2xvb3AzOgorREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmF4KjErcmN4XQorCWFkZAlyYXgsMzIKK0RCCTEwMiwxNSw1NiwyMjIsMjA4CitEQgkxMDIsMTUsNTYsMjIyLDIxNgorREIJMTAyLDE1LDU2LDIyMiwyMjQKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcmF4KjErcmN4XQorCWpueglORUFSICRMJGRlY19sb29wMworCitEQgkxMDIsMTUsNTYsMjIyLDIwOQorREIJMTAyLDE1LDU2LDIyMiwyMTcKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIzLDIwOAorREIJMTAyLDE1LDU2LDIyMywyMTYKK0RCCTEwMiwxNSw1NiwyMjMsMjI0CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworQUxJR04JMTYKK19hZXNuaV9lbmNyeXB0NDoKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwlzaGwJZWF4LDQKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKwl4b3Jwcwl4bW0zLHhtbTAKKwl4b3Jwcwl4bW00LHhtbTAKKwl4b3Jwcwl4bW01LHhtbTAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzMyK3JjeF0KKwlsZWEJcmN4LFszMityYXgqMStyY3hdCisJbmVnCXJheAorREIJMHgwZiwweDFmLDB4MDAKKwlhZGQJcmF4LDE2CisKKyRMJGVuY19sb29wNDoKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworREIJMTAyLDE1LDU2LDIyMCwyMjUKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92dXBzCXhtbTEsWE1NV09SRFtyYXgqMStyY3hdCisJYWRkCXJheCwzMgorREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CitEQgkxMDIsMTUsNTYsMjIwLDIyNAorREIJMTAyLDE1LDU2LDIyMCwyMzIKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcmF4KjErcmN4XQorCWpueglORUFSICRMJGVuY19sb29wNAorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworREIJMTAyLDE1LDU2LDIyMSwyMDgKK0RCCTEwMiwxNSw1NiwyMjEsMjE2CitEQgkxMDIsMTUsNTYsMjIxLDIyNAorREIJMTAyLDE1LDU2LDIyMSwyMzIKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitBTElHTgkxNgorX2Flc25pX2RlY3J5cHQ0OgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCXNobAllYXgsNAorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmN4XQorCXhvcnBzCXhtbTIseG1tMAorCXhvcnBzCXhtbTMseG1tMAorCXhvcnBzCXhtbTQseG1tMAorCXhvcnBzCXhtbTUseG1tMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbMzIrcmN4XQorCWxlYQlyY3gsWzMyK3JheCoxK3JjeF0KKwluZWcJcmF4CitEQgkweDBmLDB4MWYsMHgwMAorCWFkZAlyYXgsMTYKKworJEwkZGVjX2xvb3A0OgorREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCitEQgkxMDIsMTUsNTYsMjIyLDIwOAorREIJMTAyLDE1LDU2LDIyMiwyMTYKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgtMTYpKStyYXgqMStyY3hdCisJam56CU5FQVIgJEwkZGVjX2xvb3A0CisKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworREIJMTAyLDE1LDU2LDIyMiwyMjUKK0RCCTEwMiwxNSw1NiwyMjIsMjMzCitEQgkxMDIsMTUsNTYsMjIzLDIwOAorREIJMTAyLDE1LDU2LDIyMywyMTYKK0RCCTEwMiwxNSw1NiwyMjMsMjI0CitEQgkxMDIsMTUsNTYsMjIzLDIzMgorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTE2CitfYWVzbmlfZW5jcnlwdDY6CisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJc2hsCWVheCw0CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMAorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwlsZWEJcmN4LFszMityYXgqMStyY3hdCisJbmVnCXJheAorREIJMTAyLDE1LDU2LDIyMCwyMTcKKwlweG9yCXhtbTUseG1tMAorCXB4b3IJeG1tNix4bW0wCitEQgkxMDIsMTUsNTYsMjIwLDIyNQorCXB4b3IJeG1tNyx4bW0wCisJbW92dXBzCXhtbTAsWE1NV09SRFtyYXgqMStyY3hdCisJYWRkCXJheCwxNgorCWptcAlORUFSICRMJGVuY19sb29wNl9lbnRlcgorQUxJR04JMTYKKyRMJGVuY19sb29wNjoKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworREIJMTAyLDE1LDU2LDIyMCwyMjUKKyRMJGVuY19sb29wNl9lbnRlcjoKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCitEQgkxMDIsMTUsNTYsMjIwLDI0MQorREIJMTAyLDE1LDU2LDIyMCwyNDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCitEQgkxMDIsMTUsNTYsMjIwLDIwOAorREIJMTAyLDE1LDU2LDIyMCwyMTYKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CitEQgkxMDIsMTUsNTYsMjIwLDIzMgorREIJMTAyLDE1LDU2LDIyMCwyNDAKK0RCCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC0xNikpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCRlbmNfbG9vcDYKKworREIJMTAyLDE1LDU2LDIyMCwyMDkKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CitEQgkxMDIsMTUsNTYsMjIwLDIyNQorREIJMTAyLDE1LDU2LDIyMCwyMzMKK0RCCTEwMiwxNSw1NiwyMjAsMjQxCitEQgkxMDIsMTUsNTYsMjIwLDI0OQorREIJMTAyLDE1LDU2LDIyMSwyMDgKK0RCCTEwMiwxNSw1NiwyMjEsMjE2CitEQgkxMDIsMTUsNTYsMjIxLDIyNAorREIJMTAyLDE1LDU2LDIyMSwyMzIKK0RCCTEwMiwxNSw1NiwyMjEsMjQwCitEQgkxMDIsMTUsNTYsMjIxLDI0OAorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTE2CitfYWVzbmlfZGVjcnlwdDY6CisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJc2hsCWVheCw0CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJeG9ycHMJeG1tMix4bW0wCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTQseG1tMAorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlsZWEJcmN4LFszMityYXgqMStyY3hdCisJbmVnCXJheAorREIJMTAyLDE1LDU2LDIyMiwyMTcKKwlweG9yCXhtbTUseG1tMAorCXB4b3IJeG1tNix4bW0wCitEQgkxMDIsMTUsNTYsMjIyLDIyNQorCXB4b3IJeG1tNyx4bW0wCisJbW92dXBzCXhtbTAsWE1NV09SRFtyYXgqMStyY3hdCisJYWRkCXJheCwxNgorCWptcAlORUFSICRMJGRlY19sb29wNl9lbnRlcgorQUxJR04JMTYKKyRMJGRlY19sb29wNjoKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworREIJMTAyLDE1LDU2LDIyMiwyMjUKKyRMJGRlY19sb29wNl9lbnRlcjoKK0RCCTEwMiwxNSw1NiwyMjIsMjMzCitEQgkxMDIsMTUsNTYsMjIyLDI0MQorREIJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCitEQgkxMDIsMTUsNTYsMjIyLDIwOAorREIJMTAyLDE1LDU2LDIyMiwyMTYKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorREIJMTAyLDE1LDU2LDIyMiwyNDAKK0RCCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC0xNikpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCRkZWNfbG9vcDYKKworREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKK0RCCTEwMiwxNSw1NiwyMjIsMjQxCitEQgkxMDIsMTUsNTYsMjIyLDI0OQorREIJMTAyLDE1LDU2LDIyMywyMDgKK0RCCTEwMiwxNSw1NiwyMjMsMjE2CitEQgkxMDIsMTUsNTYsMjIzLDIyNAorREIJMTAyLDE1LDU2LDIyMywyMzIKK0RCCTEwMiwxNSw1NiwyMjMsMjQwCitEQgkxMDIsMTUsNTYsMjIzLDI0OAorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTE2CitfYWVzbmlfZW5jcnlwdDg6CisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJc2hsCWVheCw0CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJeG9ycHMJeG1tMix4bW0wCisJeG9ycHMJeG1tMyx4bW0wCisJcHhvcgl4bW00LHhtbTAKKwlweG9yCXhtbTUseG1tMAorCXB4b3IJeG1tNix4bW0wCisJbGVhCXJjeCxbMzIrcmF4KjErcmN4XQorCW5lZwlyYXgKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJcHhvcgl4bW03LHhtbTAKKwlweG9yCXhtbTgseG1tMAorREIJMTAyLDE1LDU2LDIyMCwyMTcKKwlweG9yCXhtbTkseG1tMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmF4KjErcmN4XQorCWFkZAlyYXgsMTYKKwlqbXAJTkVBUiAkTCRlbmNfbG9vcDhfaW5uZXIKK0FMSUdOCTE2CiskTCRlbmNfbG9vcDg6CitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKKyRMJGVuY19sb29wOF9pbm5lcjoKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKyRMJGVuY19sb29wOF9lbnRlcjoKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCitEQgkxMDIsMTUsNTYsMjIwLDIwOAorREIJMTAyLDE1LDU2LDIyMCwyMTYKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CitEQgkxMDIsMTUsNTYsMjIwLDIzMgorREIJMTAyLDE1LDU2LDIyMCwyNDAKK0RCCTEwMiwxNSw1NiwyMjAsMjQ4CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MgorREIJMTAyLDY4LDE1LDU2LDIyMCwyMDAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcmF4KjErcmN4XQorCWpueglORUFSICRMJGVuY19sb29wOAorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMCwyMDEKK0RCCTEwMiwxNSw1NiwyMjEsMjA4CitEQgkxMDIsMTUsNTYsMjIxLDIxNgorREIJMTAyLDE1LDU2LDIyMSwyMjQKK0RCCTEwMiwxNSw1NiwyMjEsMjMyCitEQgkxMDIsMTUsNTYsMjIxLDI0MAorREIJMTAyLDE1LDU2LDIyMSwyNDgKK0RCCTEwMiw2OCwxNSw1NiwyMjEsMTkyCitEQgkxMDIsNjgsMTUsNTYsMjIxLDIwMAorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTE2CitfYWVzbmlfZGVjcnlwdDg6CisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJc2hsCWVheCw0CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJeG9ycHMJeG1tMix4bW0wCisJeG9ycHMJeG1tMyx4bW0wCisJcHhvcgl4bW00LHhtbTAKKwlweG9yCXhtbTUseG1tMAorCXB4b3IJeG1tNix4bW0wCisJbGVhCXJjeCxbMzIrcmF4KjErcmN4XQorCW5lZwlyYXgKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgl4bW03LHhtbTAKKwlweG9yCXhtbTgseG1tMAorREIJMTAyLDE1LDU2LDIyMiwyMTcKKwlweG9yCXhtbTkseG1tMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmF4KjErcmN4XQorCWFkZAlyYXgsMTYKKwlqbXAJTkVBUiAkTCRkZWNfbG9vcDhfaW5uZXIKK0FMSUdOCTE2CiskTCRkZWNfbG9vcDg6CitEQgkxMDIsMTUsNTYsMjIyLDIwOQorREIJMTAyLDE1LDU2LDIyMiwyMTcKKyRMJGRlY19sb29wOF9pbm5lcjoKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworREIJMTAyLDE1LDU2LDIyMiwyNDEKK0RCCTEwMiwxNSw1NiwyMjIsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKyRMJGRlY19sb29wOF9lbnRlcjoKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCitEQgkxMDIsMTUsNTYsMjIyLDIwOAorREIJMTAyLDE1LDU2LDIyMiwyMTYKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorREIJMTAyLDE1LDU2LDIyMiwyNDAKK0RCCTEwMiwxNSw1NiwyMjIsMjQ4CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MgorREIJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcmF4KjErcmN4XQorCWpueglORUFSICRMJGRlY19sb29wOAorCitEQgkxMDIsMTUsNTYsMjIyLDIwOQorREIJMTAyLDE1LDU2LDIyMiwyMTcKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworREIJMTAyLDE1LDU2LDIyMiwyNDEKK0RCCTEwMiwxNSw1NiwyMjIsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMiwyMDEKK0RCCTEwMiwxNSw1NiwyMjMsMjA4CitEQgkxMDIsMTUsNTYsMjIzLDIxNgorREIJMTAyLDE1LDU2LDIyMywyMjQKK0RCCTEwMiwxNSw1NiwyMjMsMjMyCitEQgkxMDIsMTUsNTYsMjIzLDI0MAorREIJMTAyLDE1LDU2LDIyMywyNDgKK0RCCTEwMiw2OCwxNSw1NiwyMjMsMTkyCitEQgkxMDIsNjgsMTUsNTYsMjIzLDIwMAorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitnbG9iYWwJYWVzX2h3X2VjYl9lbmNyeXB0CisKK0FMSUdOCTE2CithZXNfaHdfZWNiX2VuY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNfaHdfZWNiX2VuY3J5cHQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKworCisJbGVhCXJzcCxbKCgtODgpKStyc3BdCisJbW92YXBzCVhNTVdPUkRbcnNwXSx4bW02CisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW03CisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW04CisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW05CiskTCRlY2JfZW5jX2JvZHk6CisJYW5kCXJkeCwtMTYKKwlqeglORUFSICRMJGVjYl9yZXQKKworCW1vdgllYXgsRFdPUkRbMjQwK3JjeF0KKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwltb3YJcjExLHJjeAorCW1vdglyMTBkLGVheAorCXRlc3QJcjhkLHI4ZAorCWp6CU5FQVIgJEwkZWNiX2RlY3J5cHQKKworCWNtcAlyZHgsMHg4MAorCWpiCU5FQVIgJEwkZWNiX2VuY190YWlsCisKKwltb3ZkcXUJeG1tMixYTU1XT1JEW3JkaV0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwltb3ZkcXUJeG1tNSxYTU1XT1JEWzQ4K3JkaV0KKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JkaV0KKwltb3ZkcXUJeG1tNyxYTU1XT1JEWzgwK3JkaV0KKwltb3ZkcXUJeG1tOCxYTU1XT1JEWzk2K3JkaV0KKwltb3ZkcXUJeG1tOSxYTU1XT1JEWzExMityZGldCisJbGVhCXJkaSxbMTI4K3JkaV0KKwlzdWIJcmR4LDB4ODAKKwlqbXAJTkVBUiAkTCRlY2JfZW5jX2xvb3A4X2VudGVyCitBTElHTgkxNgorJEwkZWNiX2VuY19sb29wODoKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwltb3YJcmN4LHIxMQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmRpXQorCW1vdgllYXgscjEwZAorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdmRxdQl4bW0zLFhNTVdPUkRbMTYrcmRpXQorCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdmRxdQl4bW00LFhNTVdPUkRbMzIrcmRpXQorCW1vdnVwcwlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCW1vdmRxdQl4bW01LFhNTVdPUkRbNDgrcmRpXQorCW1vdnVwcwlYTU1XT1JEWzY0K3JzaV0seG1tNgorCW1vdmRxdQl4bW02LFhNTVdPUkRbNjQrcmRpXQorCW1vdnVwcwlYTU1XT1JEWzgwK3JzaV0seG1tNworCW1vdmRxdQl4bW03LFhNTVdPUkRbODArcmRpXQorCW1vdnVwcwlYTU1XT1JEWzk2K3JzaV0seG1tOAorCW1vdmRxdQl4bW04LFhNTVdPUkRbOTYrcmRpXQorCW1vdnVwcwlYTU1XT1JEWzExMityc2ldLHhtbTkKKwlsZWEJcnNpLFsxMjgrcnNpXQorCW1vdmRxdQl4bW05LFhNTVdPUkRbMTEyK3JkaV0KKwlsZWEJcmRpLFsxMjgrcmRpXQorJEwkZWNiX2VuY19sb29wOF9lbnRlcjoKKworCWNhbGwJX2Flc25pX2VuY3J5cHQ4CisKKwlzdWIJcmR4LDB4ODAKKwlqbmMJTkVBUiAkTCRlY2JfZW5jX2xvb3A4CisKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwltb3YJcmN4LHIxMQorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdgllYXgscjEwZAorCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdnVwcwlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCW1vdnVwcwlYTU1XT1JEWzY0K3JzaV0seG1tNgorCW1vdnVwcwlYTU1XT1JEWzgwK3JzaV0seG1tNworCW1vdnVwcwlYTU1XT1JEWzk2K3JzaV0seG1tOAorCW1vdnVwcwlYTU1XT1JEWzExMityc2ldLHhtbTkKKwlsZWEJcnNpLFsxMjgrcnNpXQorCWFkZAlyZHgsMHg4MAorCWp6CU5FQVIgJEwkZWNiX3JldAorCiskTCRlY2JfZW5jX3RhaWw6CisJbW92dXBzCXhtbTIsWE1NV09SRFtyZGldCisJY21wCXJkeCwweDIwCisJamIJTkVBUiAkTCRlY2JfZW5jX29uZQorCW1vdnVwcwl4bW0zLFhNTVdPUkRbMTYrcmRpXQorCWplCU5FQVIgJEwkZWNiX2VuY190d28KKwltb3Z1cHMJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwljbXAJcmR4LDB4NDAKKwlqYglORUFSICRMJGVjYl9lbmNfdGhyZWUKKwltb3Z1cHMJeG1tNSxYTU1XT1JEWzQ4K3JkaV0KKwlqZQlORUFSICRMJGVjYl9lbmNfZm91cgorCW1vdnVwcwl4bW02LFhNTVdPUkRbNjQrcmRpXQorCWNtcAlyZHgsMHg2MAorCWpiCU5FQVIgJEwkZWNiX2VuY19maXZlCisJbW92dXBzCXhtbTcsWE1NV09SRFs4MCtyZGldCisJamUJTkVBUiAkTCRlY2JfZW5jX3NpeAorCW1vdmRxdQl4bW04LFhNTVdPUkRbOTYrcmRpXQorCXhvcnBzCXhtbTkseG1tOQorCWNhbGwJX2Flc25pX2VuY3J5cHQ4CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJbW92dXBzCVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJbW92dXBzCVhNTVdPUkRbNjQrcnNpXSx4bW02CisJbW92dXBzCVhNTVdPUkRbODArcnNpXSx4bW03CisJbW92dXBzCVhNTVdPUkRbOTYrcnNpXSx4bW04CisJam1wCU5FQVIgJEwkZWNiX3JldAorQUxJR04JMTYKKyRMJGVjYl9lbmNfb25lOgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmN4XQorCWxlYQlyY3gsWzMyK3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKyRMJG9vcF9lbmMxXzM6CitEQgkxMDIsMTUsNTYsMjIwLDIwOQorCWRlYwllYXgKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JjeF0KKwlsZWEJcmN4LFsxNityY3hdCisJam56CU5FQVIgJEwkb29wX2VuYzFfMworREIJMTAyLDE1LDU2LDIyMSwyMDkKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlqbXAJTkVBUiAkTCRlY2JfcmV0CitBTElHTgkxNgorJEwkZWNiX2VuY190d286CisJY2FsbAlfYWVzbmlfZW5jcnlwdDIKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwlqbXAJTkVBUiAkTCRlY2JfcmV0CitBTElHTgkxNgorJEwkZWNiX2VuY190aHJlZToKKwljYWxsCV9hZXNuaV9lbmNyeXB0MworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCWptcAlORUFSICRMJGVjYl9yZXQKK0FMSUdOCTE2CiskTCRlY2JfZW5jX2ZvdXI6CisJY2FsbAlfYWVzbmlfZW5jcnlwdDQKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwltb3Z1cHMJWE1NV09SRFszMityc2ldLHhtbTQKKwltb3Z1cHMJWE1NV09SRFs0OCtyc2ldLHhtbTUKKwlqbXAJTkVBUiAkTCRlY2JfcmV0CitBTElHTgkxNgorJEwkZWNiX2VuY19maXZlOgorCXhvcnBzCXhtbTcseG1tNworCWNhbGwJX2Flc25pX2VuY3J5cHQ2CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJbW92dXBzCVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJbW92dXBzCVhNTVdPUkRbNjQrcnNpXSx4bW02CisJam1wCU5FQVIgJEwkZWNiX3JldAorQUxJR04JMTYKKyRMJGVjYl9lbmNfc2l4OgorCWNhbGwJX2Flc25pX2VuY3J5cHQ2CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJbW92dXBzCVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJbW92dXBzCVhNTVdPUkRbNjQrcnNpXSx4bW02CisJbW92dXBzCVhNTVdPUkRbODArcnNpXSx4bW03CisJam1wCU5FQVIgJEwkZWNiX3JldAorCitBTElHTgkxNgorJEwkZWNiX2RlY3J5cHQ6CisJY21wCXJkeCwweDgwCisJamIJTkVBUiAkTCRlY2JfZGVjX3RhaWwKKworCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmRpXQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbMTYrcmRpXQorCW1vdmRxdQl4bW00LFhNTVdPUkRbMzIrcmRpXQorCW1vdmRxdQl4bW01LFhNTVdPUkRbNDgrcmRpXQorCW1vdmRxdQl4bW02LFhNTVdPUkRbNjQrcmRpXQorCW1vdmRxdQl4bW03LFhNTVdPUkRbODArcmRpXQorCW1vdmRxdQl4bW04LFhNTVdPUkRbOTYrcmRpXQorCW1vdmRxdQl4bW05LFhNTVdPUkRbMTEyK3JkaV0KKwlsZWEJcmRpLFsxMjgrcmRpXQorCXN1YglyZHgsMHg4MAorCWptcAlORUFSICRMJGVjYl9kZWNfbG9vcDhfZW50ZXIKK0FMSUdOCTE2CiskTCRlY2JfZGVjX2xvb3A4OgorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdglyY3gscjExCisJbW92ZHF1CXhtbTIsWE1NV09SRFtyZGldCisJbW92CWVheCxyMTBkCisJbW92dXBzCVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJbW92ZHF1CXhtbTMsWE1NV09SRFsxNityZGldCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJbW92ZHF1CXhtbTQsWE1NV09SRFszMityZGldCisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJbW92ZHF1CXhtbTUsWE1NV09SRFs0OCtyZGldCisJbW92dXBzCVhNTVdPUkRbNjQrcnNpXSx4bW02CisJbW92ZHF1CXhtbTYsWE1NV09SRFs2NCtyZGldCisJbW92dXBzCVhNTVdPUkRbODArcnNpXSx4bW03CisJbW92ZHF1CXhtbTcsWE1NV09SRFs4MCtyZGldCisJbW92dXBzCVhNTVdPUkRbOTYrcnNpXSx4bW04CisJbW92ZHF1CXhtbTgsWE1NV09SRFs5NityZGldCisJbW92dXBzCVhNTVdPUkRbMTEyK3JzaV0seG1tOQorCWxlYQlyc2ksWzEyOCtyc2ldCisJbW92ZHF1CXhtbTksWE1NV09SRFsxMTIrcmRpXQorCWxlYQlyZGksWzEyOCtyZGldCiskTCRlY2JfZGVjX2xvb3A4X2VudGVyOgorCisJY2FsbAlfYWVzbmlfZGVjcnlwdDgKKworCW1vdnVwcwl4bW0wLFhNTVdPUkRbcjExXQorCXN1YglyZHgsMHg4MAorCWpuYwlORUFSICRMJGVjYl9kZWNfbG9vcDgKKworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCXB4b3IJeG1tMix4bW0yCisJbW92CXJjeCxyMTEKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwlweG9yCXhtbTMseG1tMworCW1vdgllYXgscjEwZAorCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tNCx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJcHhvcgl4bW01LHhtbTUKKwltb3Z1cHMJWE1NV09SRFs2NCtyc2ldLHhtbTYKKwlweG9yCXhtbTYseG1tNgorCW1vdnVwcwlYTU1XT1JEWzgwK3JzaV0seG1tNworCXB4b3IJeG1tNyx4bW03CisJbW92dXBzCVhNTVdPUkRbOTYrcnNpXSx4bW04CisJcHhvcgl4bW04LHhtbTgKKwltb3Z1cHMJWE1NV09SRFsxMTIrcnNpXSx4bW05CisJcHhvcgl4bW05LHhtbTkKKwlsZWEJcnNpLFsxMjgrcnNpXQorCWFkZAlyZHgsMHg4MAorCWp6CU5FQVIgJEwkZWNiX3JldAorCiskTCRlY2JfZGVjX3RhaWw6CisJbW92dXBzCXhtbTIsWE1NV09SRFtyZGldCisJY21wCXJkeCwweDIwCisJamIJTkVBUiAkTCRlY2JfZGVjX29uZQorCW1vdnVwcwl4bW0zLFhNTVdPUkRbMTYrcmRpXQorCWplCU5FQVIgJEwkZWNiX2RlY190d28KKwltb3Z1cHMJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwljbXAJcmR4LDB4NDAKKwlqYglORUFSICRMJGVjYl9kZWNfdGhyZWUKKwltb3Z1cHMJeG1tNSxYTU1XT1JEWzQ4K3JkaV0KKwlqZQlORUFSICRMJGVjYl9kZWNfZm91cgorCW1vdnVwcwl4bW02LFhNTVdPUkRbNjQrcmRpXQorCWNtcAlyZHgsMHg2MAorCWpiCU5FQVIgJEwkZWNiX2RlY19maXZlCisJbW92dXBzCXhtbTcsWE1NV09SRFs4MCtyZGldCisJamUJTkVBUiAkTCRlY2JfZGVjX3NpeAorCW1vdnVwcwl4bW04LFhNTVdPUkRbOTYrcmRpXQorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCXhvcnBzCXhtbTkseG1tOQorCWNhbGwJX2Flc25pX2RlY3J5cHQ4CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwlweG9yCXhtbTMseG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tNCx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJcHhvcgl4bW01LHhtbTUKKwltb3Z1cHMJWE1NV09SRFs2NCtyc2ldLHhtbTYKKwlweG9yCXhtbTYseG1tNgorCW1vdnVwcwlYTU1XT1JEWzgwK3JzaV0seG1tNworCXB4b3IJeG1tNyx4bW03CisJbW92dXBzCVhNTVdPUkRbOTYrcnNpXSx4bW04CisJcHhvcgl4bW04LHhtbTgKKwlweG9yCXhtbTkseG1tOQorCWptcAlORUFSICRMJGVjYl9yZXQKK0FMSUdOCTE2CiskTCRlY2JfZGVjX29uZToKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKwlsZWEJcmN4LFszMityY3hdCisJeG9ycHMJeG1tMix4bW0wCiskTCRvb3BfZGVjMV80OgorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJZWF4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyY3hdCisJbGVhCXJjeCxbMTYrcmN4XQorCWpueglORUFSICRMJG9vcF9kZWMxXzQKK0RCCTEwMiwxNSw1NiwyMjMsMjA5CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwlqbXAJTkVBUiAkTCRlY2JfcmV0CitBTElHTgkxNgorJEwkZWNiX2RlY190d286CisJY2FsbAlfYWVzbmlfZGVjcnlwdDIKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlweG9yCXhtbTIseG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCXB4b3IJeG1tMyx4bW0zCisJam1wCU5FQVIgJEwkZWNiX3JldAorQUxJR04JMTYKKyRMJGVjYl9kZWNfdGhyZWU6CisJY2FsbAlfYWVzbmlfZGVjcnlwdDMKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlweG9yCXhtbTIseG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCXB4b3IJeG1tMyx4bW0zCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJcHhvcgl4bW00LHhtbTQKKwlqbXAJTkVBUiAkTCRlY2JfcmV0CitBTElHTgkxNgorJEwkZWNiX2RlY19mb3VyOgorCWNhbGwJX2Flc25pX2RlY3J5cHQ0CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwlweG9yCXhtbTMseG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tNCx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJcHhvcgl4bW01LHhtbTUKKwlqbXAJTkVBUiAkTCRlY2JfcmV0CitBTElHTgkxNgorJEwkZWNiX2RlY19maXZlOgorCXhvcnBzCXhtbTcseG1tNworCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwlweG9yCXhtbTMseG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tNCx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJcHhvcgl4bW01LHhtbTUKKwltb3Z1cHMJWE1NV09SRFs2NCtyc2ldLHhtbTYKKwlweG9yCXhtbTYseG1tNgorCXB4b3IJeG1tNyx4bW03CisJam1wCU5FQVIgJEwkZWNiX3JldAorQUxJR04JMTYKKyRMJGVjYl9kZWNfc2l4OgorCWNhbGwJX2Flc25pX2RlY3J5cHQ2CisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwlweG9yCXhtbTMseG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tNCx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJcHhvcgl4bW01LHhtbTUKKwltb3Z1cHMJWE1NV09SRFs2NCtyc2ldLHhtbTYKKwlweG9yCXhtbTYseG1tNgorCW1vdnVwcwlYTU1XT1JEWzgwK3JzaV0seG1tNworCXB4b3IJeG1tNyx4bW03CisKKyRMJGVjYl9yZXQ6CisJeG9ycHMJeG1tMCx4bW0wCisJcHhvcgl4bW0xLHhtbTEKKwltb3ZhcHMJeG1tNixYTU1XT1JEW3JzcF0KKwltb3ZhcHMJWE1NV09SRFtyc3BdLHhtbTAKKwltb3ZhcHMJeG1tNyxYTU1XT1JEWzE2K3JzcF0KKwltb3ZhcHMJWE1NV09SRFsxNityc3BdLHhtbTAKKwltb3ZhcHMJeG1tOCxYTU1XT1JEWzMyK3JzcF0KKwltb3ZhcHMJWE1NV09SRFszMityc3BdLHhtbTAKKwltb3ZhcHMJeG1tOSxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZhcHMJWE1NV09SRFs0OCtyc3BdLHhtbTAKKwlsZWEJcnNwLFs4OCtyc3BdCiskTCRlY2JfZW5jX3JldDoKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKyRMJFNFSF9lbmRfYWVzX2h3X2VjYl9lbmNyeXB0OgorZ2xvYmFsCWFlc19od19jY202NF9lbmNyeXB0X2Jsb2NrcworCitBTElHTgkxNgorYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzOgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisJbGVhCXJzcCxbKCgtODgpKStyc3BdCisJbW92YXBzCVhNTVdPUkRbcnNwXSx4bW02CisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW03CisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW04CisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW05CiskTCRjY202NF9lbmNfYm9keToKKwltb3YJZWF4LERXT1JEWzI0MCtyY3hdCisJbW92ZHF1CXhtbTYsWE1NV09SRFtyOF0KKwltb3ZkcWEJeG1tOSxYTU1XT1JEWyRMJGluY3JlbWVudDY0XQorCW1vdmRxYQl4bW03LFhNTVdPUkRbJEwkYnN3YXBfbWFza10KKworCXNobAllYXgsNAorCW1vdglyMTBkLDE2CisJbGVhCXIxMSxbcmN4XQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbcjldCisJbW92ZHFhCXhtbTIseG1tNgorCWxlYQlyY3gsWzMyK3JheCoxK3JjeF0KK0RCCTEwMiwxNSw1NiwwLDI0NworCXN1YglyMTAscmF4CisJam1wCU5FQVIgJEwkY2NtNjRfZW5jX291dGVyCitBTElHTgkxNgorJEwkY2NtNjRfZW5jX291dGVyOgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcjExXQorCW1vdglyYXgscjEwCisJbW92dXBzCXhtbTgsWE1NV09SRFtyZGldCisKKwl4b3Jwcwl4bW0yLHhtbTAKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3IxMV0KKwl4b3Jwcwl4bW0wLHhtbTgKKwl4b3Jwcwl4bW0zLHhtbTAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzMyK3IxMV0KKworJEwkY2NtNjRfZW5jMl9sb29wOgorREIJMTAyLDE1LDU2LDIyMCwyMDkKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CisJbW92dXBzCXhtbTEsWE1NV09SRFtyYXgqMStyY3hdCisJYWRkCXJheCwzMgorREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC0xNikpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCRjY202NF9lbmMyX2xvb3AKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworCXBhZGRxCXhtbTYseG1tOQorCWRlYwlyZHgKK0RCCTEwMiwxNSw1NiwyMjEsMjA4CitEQgkxMDIsMTUsNTYsMjIxLDIxNgorCisJbGVhCXJkaSxbMTYrcmRpXQorCXhvcnBzCXhtbTgseG1tMgorCW1vdmRxYQl4bW0yLHhtbTYKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTgKK0RCCTEwMiwxNSw1NiwwLDIxNQorCWxlYQlyc2ksWzE2K3JzaV0KKwlqbnoJTkVBUiAkTCRjY202NF9lbmNfb3V0ZXIKKworCXB4b3IJeG1tMCx4bW0wCisJcHhvcgl4bW0xLHhtbTEKKwlweG9yCXhtbTIseG1tMgorCW1vdnVwcwlYTU1XT1JEW3I5XSx4bW0zCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTgseG1tOAorCXB4b3IJeG1tNix4bW02CisJbW92YXBzCXhtbTYsWE1NV09SRFtyc3BdCisJbW92YXBzCVhNTVdPUkRbcnNwXSx4bW0wCisJbW92YXBzCXhtbTcsWE1NV09SRFsxNityc3BdCisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW0wCisJbW92YXBzCXhtbTgsWE1NV09SRFszMityc3BdCisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW0wCisJbW92YXBzCXhtbTksWE1NV09SRFs0OCtyc3BdCisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW0wCisJbGVhCXJzcCxbODgrcnNwXQorJEwkY2NtNjRfZW5jX3JldDoKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKyRMJFNFSF9lbmRfYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzOgorZ2xvYmFsCWFlc19od19jY202NF9kZWNyeXB0X2Jsb2NrcworCitBTElHTgkxNgorYWVzX2h3X2NjbTY0X2RlY3J5cHRfYmxvY2tzOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzX2h3X2NjbTY0X2RlY3J5cHRfYmxvY2tzOgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisJbGVhCXJzcCxbKCgtODgpKStyc3BdCisJbW92YXBzCVhNTVdPUkRbcnNwXSx4bW02CisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW03CisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW04CisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW05CiskTCRjY202NF9kZWNfYm9keToKKwltb3YJZWF4LERXT1JEWzI0MCtyY3hdCisJbW92dXBzCXhtbTYsWE1NV09SRFtyOF0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEW3I5XQorCW1vdmRxYQl4bW05LFhNTVdPUkRbJEwkaW5jcmVtZW50NjRdCisJbW92ZHFhCXhtbTcsWE1NV09SRFskTCRic3dhcF9tYXNrXQorCisJbW92YXBzCXhtbTIseG1tNgorCW1vdglyMTBkLGVheAorCW1vdglyMTEscmN4CitEQgkxMDIsMTUsNTYsMCwyNDcKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKwlsZWEJcmN4LFszMityY3hdCisJeG9ycHMJeG1tMix4bW0wCiskTCRvb3BfZW5jMV81OgorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWMJZWF4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyY3hdCisJbGVhCXJjeCxbMTYrcmN4XQorCWpueglORUFSICRMJG9vcF9lbmMxXzUKK0RCCTEwMiwxNSw1NiwyMjEsMjA5CisJc2hsCXIxMGQsNAorCW1vdgllYXgsMTYKKwltb3Z1cHMJeG1tOCxYTU1XT1JEW3JkaV0KKwlwYWRkcQl4bW02LHhtbTkKKwlsZWEJcmRpLFsxNityZGldCisJc3ViCXJheCxyMTAKKwlsZWEJcmN4LFszMityMTAqMStyMTFdCisJbW92CXIxMCxyYXgKKwlqbXAJTkVBUiAkTCRjY202NF9kZWNfb3V0ZXIKK0FMSUdOCTE2CiskTCRjY202NF9kZWNfb3V0ZXI6CisJeG9ycHMJeG1tOCx4bW0yCisJbW92ZHFhCXhtbTIseG1tNgorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tOAorCWxlYQlyc2ksWzE2K3JzaV0KK0RCCTEwMiwxNSw1NiwwLDIxNQorCisJc3ViCXJkeCwxCisJanoJTkVBUiAkTCRjY202NF9kZWNfYnJlYWsKKworCW1vdnVwcwl4bW0wLFhNTVdPUkRbcjExXQorCW1vdglyYXgscjEwCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityMTFdCisJeG9ycHMJeG1tOCx4bW0wCisJeG9ycHMJeG1tMix4bW0wCisJeG9ycHMJeG1tMyx4bW04CisJbW92dXBzCXhtbTAsWE1NV09SRFszMityMTFdCisJam1wCU5FQVIgJEwkY2NtNjRfZGVjMl9sb29wCitBTElHTgkxNgorJEwkY2NtNjRfZGVjMl9sb29wOgorREIJMTAyLDE1LDU2LDIyMCwyMDkKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CisJbW92dXBzCXhtbTEsWE1NV09SRFtyYXgqMStyY3hdCisJYWRkCXJheCwzMgorREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC0xNikpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCRjY202NF9kZWMyX2xvb3AKKwltb3Z1cHMJeG1tOCxYTU1XT1JEW3JkaV0KKwlwYWRkcQl4bW02LHhtbTkKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworREIJMTAyLDE1LDU2LDIyMSwyMDgKK0RCCTEwMiwxNSw1NiwyMjEsMjE2CisJbGVhCXJkaSxbMTYrcmRpXQorCWptcAlORUFSICRMJGNjbTY0X2RlY19vdXRlcgorCitBTElHTgkxNgorJEwkY2NtNjRfZGVjX2JyZWFrOgorCisJbW92CWVheCxEV09SRFsyNDArcjExXQorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcjExXQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcjExXQorCXhvcnBzCXhtbTgseG1tMAorCWxlYQlyMTEsWzMyK3IxMV0KKwl4b3Jwcwl4bW0zLHhtbTgKKyRMJG9vcF9lbmMxXzY6CitEQgkxMDIsMTUsNTYsMjIwLDIxNworCWRlYwllYXgKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3IxMV0KKwlsZWEJcjExLFsxNityMTFdCisJam56CU5FQVIgJEwkb29wX2VuYzFfNgorREIJMTAyLDE1LDU2LDIyMSwyMTcKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJcHhvcgl4bW0yLHhtbTIKKwltb3Z1cHMJWE1NV09SRFtyOV0seG1tMworCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW04LHhtbTgKKwlweG9yCXhtbTYseG1tNgorCW1vdmFwcwl4bW02LFhNTVdPUkRbcnNwXQorCW1vdmFwcwlYTU1XT1JEW3JzcF0seG1tMAorCW1vdmFwcwl4bW03LFhNTVdPUkRbMTYrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzE2K3JzcF0seG1tMAorCW1vdmFwcwl4bW04LFhNTVdPUkRbMzIrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzMyK3JzcF0seG1tMAorCW1vdmFwcwl4bW05LFhNTVdPUkRbNDgrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzQ4K3JzcF0seG1tMAorCWxlYQlyc3AsWzg4K3JzcF0KKyRMJGNjbTY0X2RlY19yZXQ6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CiskTCRTRUhfZW5kX2Flc19od19jY202NF9kZWNyeXB0X2Jsb2NrczoKK2dsb2JhbAlhZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3MKKworQUxJR04JMTYKK2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrczoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrczoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCisKKworCWNtcAlyZHgsMQorCWpuZQlORUFSICRMJGN0cjMyX2J1bGsKKworCisKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3I4XQorCW1vdnVwcwl4bW0zLFhNTVdPUkRbcmRpXQorCW1vdgllZHgsRFdPUkRbMjQwK3JjeF0KKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKwlsZWEJcmN4LFszMityY3hdCisJeG9ycHMJeG1tMix4bW0wCiskTCRvb3BfZW5jMV83OgorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWMJZWR4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyY3hdCisJbGVhCXJjeCxbMTYrcmN4XQorCWpueglORUFSICRMJG9vcF9lbmMxXzcKK0RCCTEwMiwxNSw1NiwyMjEsMjA5CisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXhvcnBzCXhtbTIseG1tMworCXB4b3IJeG1tMyx4bW0zCisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJeG9ycHMJeG1tMix4bW0yCisJam1wCU5FQVIgJEwkY3RyMzJfZXBpbG9ndWUKKworQUxJR04JMTYKKyRMJGN0cjMyX2J1bGs6CisJbGVhCXIxMSxbcnNwXQorCisJcHVzaAlyYnAKKworCXN1Yglyc3AsMjg4CisJYW5kCXJzcCwtMTYKKwltb3ZhcHMJWE1NV09SRFsoLTE2OCkrcjExXSx4bW02CisJbW92YXBzCVhNTVdPUkRbKC0xNTIpK3IxMV0seG1tNworCW1vdmFwcwlYTU1XT1JEWygtMTM2KStyMTFdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFsoLTEyMCkrcjExXSx4bW05CisJbW92YXBzCVhNTVdPUkRbKC0xMDQpK3IxMV0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFsoLTg4KStyMTFdLHhtbTExCisJbW92YXBzCVhNTVdPUkRbKC03MikrcjExXSx4bW0xMgorCW1vdmFwcwlYTU1XT1JEWygtNTYpK3IxMV0seG1tMTMKKwltb3ZhcHMJWE1NV09SRFsoLTQwKStyMTFdLHhtbTE0CisJbW92YXBzCVhNTVdPUkRbKC0yNCkrcjExXSx4bW0xNQorJEwkY3RyMzJfYm9keToKKworCisKKworCW1vdmRxdQl4bW0yLFhNTVdPUkRbcjhdCisJbW92ZHF1CXhtbTAsWE1NV09SRFtyY3hdCisJbW92CXI4ZCxEV09SRFsxMityOF0KKwlweG9yCXhtbTIseG1tMAorCW1vdgllYnAsRFdPUkRbMTIrcmN4XQorCW1vdmRxYQlYTU1XT1JEW3JzcF0seG1tMgorCWJzd2FwCXI4ZAorCW1vdmRxYQl4bW0zLHhtbTIKKwltb3ZkcWEJeG1tNCx4bW0yCisJbW92ZHFhCXhtbTUseG1tMgorCW1vdmRxYQlYTU1XT1JEWzY0K3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWzgwK3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWzk2K3JzcF0seG1tMgorCW1vdglyMTAscmR4CisJbW92ZHFhCVhNTVdPUkRbMTEyK3JzcF0seG1tMgorCisJbGVhCXJheCxbMStyOF0KKwlsZWEJcmR4LFsyK3I4XQorCWJzd2FwCWVheAorCWJzd2FwCWVkeAorCXhvcgllYXgsZWJwCisJeG9yCWVkeCxlYnAKK0RCCTEwMiwxNSw1OCwzNCwyMTYsMworCWxlYQlyYXgsWzMrcjhdCisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0zCitEQgkxMDIsMTUsNTgsMzQsMjI2LDMKKwlic3dhcAllYXgKKwltb3YJcmR4LHIxMAorCWxlYQlyMTAsWzQrcjhdCisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW00CisJeG9yCWVheCxlYnAKKwlic3dhcAlyMTBkCitEQgkxMDIsMTUsNTgsMzQsMjMyLDMKKwl4b3IJcjEwZCxlYnAKKwltb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTUKKwlsZWEJcjksWzUrcjhdCisJbW92CURXT1JEWygoNjQrMTIpKStyc3BdLHIxMGQKKwlic3dhcAlyOWQKKwlsZWEJcjEwLFs2K3I4XQorCW1vdgllYXgsRFdPUkRbMjQwK3JjeF0KKwl4b3IJcjlkLGVicAorCWJzd2FwCXIxMGQKKwltb3YJRFdPUkRbKCg4MCsxMikpK3JzcF0scjlkCisJeG9yCXIxMGQsZWJwCisJbGVhCXI5LFs3K3I4XQorCW1vdglEV09SRFsoKDk2KzEyKSkrcnNwXSxyMTBkCisJYnN3YXAJcjlkCisJbGVhCXIxMCxbT1BFTlNTTF9pYTMyY2FwX1BdCisJbW92CXIxMGQsRFdPUkRbNCtyMTBdCisJeG9yCXI5ZCxlYnAKKwlhbmQJcjEwZCw3MTMwMzE2OAorCW1vdglEV09SRFsoKDExMisxMikpK3JzcF0scjlkCisKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKworCW1vdmRxYQl4bW02LFhNTVdPUkRbNjQrcnNwXQorCW1vdmRxYQl4bW03LFhNTVdPUkRbODArcnNwXQorCisJY21wCXJkeCw4CisJamIJTkVBUiAkTCRjdHIzMl90YWlsCisKKwlzdWIJcmR4LDYKKwljbXAJcjEwZCw0MTk0MzA0CisJamUJTkVBUiAkTCRjdHIzMl82eAorCisJbGVhCXJjeCxbMTI4K3JjeF0KKwlzdWIJcmR4LDIKKwlqbXAJTkVBUiAkTCRjdHIzMl9sb29wOAorCitBTElHTgkxNgorJEwkY3RyMzJfNng6CisJc2hsCWVheCw0CisJbW92CXIxMGQsNDgKKwlic3dhcAllYnAKKwlsZWEJcmN4LFszMityYXgqMStyY3hdCisJc3ViCXIxMCxyYXgKKwlqbXAJTkVBUiAkTCRjdHIzMl9sb29wNgorCitBTElHTgkxNgorJEwkY3RyMzJfbG9vcDY6CisJYWRkCXI4ZCw2CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC00OCkpK3IxMCoxK3JjeF0KK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92CWVheCxyOGQKKwl4b3IJZWF4LGVicAorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCwxMgorCWxlYQllYXgsWzErcjhdCitEQgkxMDIsMTUsNTYsMjIwLDIyNQorCXhvcgllYXgsZWJwCitEQgkweDBmLDB4MzgsMHhmMSwweDQ0LDB4MjQsMjgKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCisJbGVhCWVheCxbMityOF0KKwl4b3IJZWF4LGVicAorREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCw0NAorCWxlYQllYXgsWzMrcjhdCitEQgkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbKCgtMzIpKStyMTAqMStyY3hdCisJeG9yCWVheCxlYnAKKworREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCw2MAorCWxlYQllYXgsWzQrcjhdCitEQgkxMDIsMTUsNTYsMjIwLDIxNgorCXhvcgllYXgsZWJwCitEQgkweDBmLDB4MzgsMHhmMSwweDQ0LDB4MjQsNzYKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CisJbGVhCWVheCxbNStyOF0KKwl4b3IJZWF4LGVicAorREIJMTAyLDE1LDU2LDIyMCwyMzIKK0RCCTB4MGYsMHgzOCwweGYxLDB4NDQsMHgyNCw5MgorCW1vdglyYXgscjEwCitEQgkxMDIsMTUsNTYsMjIwLDI0MAorREIJMTAyLDE1LDU2LDIyMCwyNDgKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcjEwKjErcmN4XQorCisJY2FsbAkkTCRlbmNfbG9vcDYKKworCW1vdmRxdQl4bW04LFhNTVdPUkRbcmRpXQorCW1vdmRxdQl4bW05LFhNTVdPUkRbMTYrcmRpXQorCW1vdmRxdQl4bW0xMCxYTU1XT1JEWzMyK3JkaV0KKwltb3ZkcXUJeG1tMTEsWE1NV09SRFs0OCtyZGldCisJbW92ZHF1CXhtbTEyLFhNTVdPUkRbNjQrcmRpXQorCW1vdmRxdQl4bW0xMyxYTU1XT1JEWzgwK3JkaV0KKwlsZWEJcmRpLFs5NityZGldCisJbW92dXBzCXhtbTEsWE1NV09SRFsoKC02NCkpK3IxMCoxK3JjeF0KKwlweG9yCXhtbTgseG1tMgorCW1vdmFwcwl4bW0yLFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tOSx4bW0zCisJbW92YXBzCXhtbTMsWE1NV09SRFsxNityc3BdCisJcHhvcgl4bW0xMCx4bW00CisJbW92YXBzCXhtbTQsWE1NV09SRFszMityc3BdCisJcHhvcgl4bW0xMSx4bW01CisJbW92YXBzCXhtbTUsWE1NV09SRFs0OCtyc3BdCisJcHhvcgl4bW0xMix4bW02CisJbW92YXBzCXhtbTYsWE1NV09SRFs2NCtyc3BdCisJcHhvcgl4bW0xMyx4bW03CisJbW92YXBzCXhtbTcsWE1NV09SRFs4MCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbcnNpXSx4bW04CisJbW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW05CisJbW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW0xMAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tMTEKKwltb3ZkcXUJWE1NV09SRFs2NCtyc2ldLHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbODArcnNpXSx4bW0xMworCWxlYQlyc2ksWzk2K3JzaV0KKworCXN1YglyZHgsNgorCWpuYwlORUFSICRMJGN0cjMyX2xvb3A2CisKKwlhZGQJcmR4LDYKKwlqeglORUFSICRMJGN0cjMyX2RvbmUKKworCWxlYQllYXgsWygoLTQ4KSkrcjEwXQorCWxlYQlyY3gsWygoLTgwKSkrcjEwKjErcmN4XQorCW5lZwllYXgKKwlzaHIJZWF4LDQKKwlqbXAJTkVBUiAkTCRjdHIzMl90YWlsCisKK0FMSUdOCTMyCiskTCRjdHIzMl9sb29wODoKKwlhZGQJcjhkLDgKKwltb3ZkcWEJeG1tOCxYTU1XT1JEWzk2K3JzcF0KK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92CXI5ZCxyOGQKKwltb3ZkcWEJeG1tOSxYTU1XT1JEWzExMityc3BdCitEQgkxMDIsMTUsNTYsMjIwLDIxNworCWJzd2FwCXI5ZAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgzMi0xMjgpKStyY3hdCitEQgkxMDIsMTUsNTYsMjIwLDIyNQorCXhvcglyOWQsZWJwCisJbm9wCitEQgkxMDIsMTUsNTYsMjIwLDIzMworCW1vdglEV09SRFsoKDArMTIpKStyc3BdLHI5ZAorCWxlYQlyOSxbMStyOF0KK0RCCTEwMiwxNSw1NiwyMjAsMjQxCitEQgkxMDIsMTUsNTYsMjIwLDI0OQorREIJMTAyLDY4LDE1LDU2LDIyMCwxOTMKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMjAxCisJbW92dXBzCXhtbTEsWE1NV09SRFsoKDQ4LTEyOCkpK3JjeF0KKwlic3dhcAlyOWQKK0RCCTEwMiwxNSw1NiwyMjAsMjA4CitEQgkxMDIsMTUsNTYsMjIwLDIxNgorCXhvcglyOWQsZWJwCitEQgkweDY2LDB4OTAKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CitEQgkxMDIsMTUsNTYsMjIwLDIzMgorCW1vdglEV09SRFsoKDE2KzEyKSkrcnNwXSxyOWQKKwlsZWEJcjksWzIrcjhdCitEQgkxMDIsMTUsNTYsMjIwLDI0MAorREIJMTAyLDE1LDU2LDIyMCwyNDgKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMTkyCitEQgkxMDIsNjgsMTUsNTYsMjIwLDIwMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCg2NC0xMjgpKStyY3hdCisJYnN3YXAJcjlkCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKKwl4b3IJcjlkLGVicAorREIJMHg2NiwweDkwCitEQgkxMDIsMTUsNTYsMjIwLDIyNQorREIJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3YJRFdPUkRbKCgzMisxMikpK3JzcF0scjlkCisJbGVhCXI5LFszK3I4XQorREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoODAtMTI4KSkrcmN4XQorCWJzd2FwCXI5ZAorREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CisJeG9yCXI5ZCxlYnAKK0RCCTB4NjYsMHg5MAorREIJMTAyLDE1LDU2LDIyMCwyMjQKK0RCCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92CURXT1JEWygoNDgrMTIpKStyc3BdLHI5ZAorCWxlYQlyOSxbNCtyOF0KK0RCCTEwMiwxNSw1NiwyMjAsMjQwCitEQgkxMDIsMTUsNTYsMjIwLDI0OAorREIJMTAyLDY4LDE1LDU2LDIyMCwxOTIKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCXhtbTAsWE1NV09SRFsoKDk2LTEyOCkpK3JjeF0KKwlic3dhcAlyOWQKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworCXhvcglyOWQsZWJwCitEQgkweDY2LDB4OTAKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworCW1vdglEV09SRFsoKDY0KzEyKSkrcnNwXSxyOWQKKwlsZWEJcjksWzUrcjhdCitEQgkxMDIsMTUsNTYsMjIwLDI0MQorREIJMTAyLDE1LDU2LDIyMCwyNDkKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMTkzCitEQgkxMDIsNjgsMTUsNTYsMjIwLDIwMQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbKCgxMTItMTI4KSkrcmN4XQorCWJzd2FwCXI5ZAorREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CisJeG9yCXI5ZCxlYnAKK0RCCTB4NjYsMHg5MAorREIJMTAyLDE1LDU2LDIyMCwyMjQKK0RCCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92CURXT1JEWygoODArMTIpKStyc3BdLHI5ZAorCWxlYQlyOSxbNityOF0KK0RCCTEwMiwxNSw1NiwyMjAsMjQwCitEQgkxMDIsMTUsNTYsMjIwLDI0OAorREIJMTAyLDY4LDE1LDU2LDIyMCwxOTIKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCXhtbTAsWE1NV09SRFsoKDEyOC0xMjgpKStyY3hdCisJYnN3YXAJcjlkCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKKwl4b3IJcjlkLGVicAorREIJMHg2NiwweDkwCitEQgkxMDIsMTUsNTYsMjIwLDIyNQorREIJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3YJRFdPUkRbKCg5NisxMikpK3JzcF0scjlkCisJbGVhCXI5LFs3K3I4XQorREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoMTQ0LTEyOCkpK3JjeF0KKwlic3dhcAlyOWQKK0RCCTEwMiwxNSw1NiwyMjAsMjA4CitEQgkxMDIsMTUsNTYsMjIwLDIxNgorREIJMTAyLDE1LDU2LDIyMCwyMjQKKwl4b3IJcjlkLGVicAorCW1vdmRxdQl4bW0xMCxYTU1XT1JEW3JkaV0KK0RCCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92CURXT1JEWygoMTEyKzEyKSkrcnNwXSxyOWQKKwljbXAJZWF4LDExCitEQgkxMDIsMTUsNTYsMjIwLDI0MAorREIJMTAyLDE1LDU2LDIyMCwyNDgKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMTkyCitEQgkxMDIsNjgsMTUsNTYsMjIwLDIwMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgxNjAtMTI4KSkrcmN4XQorCisJamIJTkVBUiAkTCRjdHIzMl9lbmNfZG9uZQorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoMTc2LTEyOCkpK3JjeF0KKworREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CitEQgkxMDIsMTUsNTYsMjIwLDIyNAorREIJMTAyLDE1LDU2LDIyMCwyMzIKK0RCCTEwMiwxNSw1NiwyMjAsMjQwCitEQgkxMDIsMTUsNTYsMjIwLDI0OAorREIJMTAyLDY4LDE1LDU2LDIyMCwxOTIKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCXhtbTAsWE1NV09SRFsoKDE5Mi0xMjgpKStyY3hdCisJamUJTkVBUiAkTCRjdHIzMl9lbmNfZG9uZQorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoMjA4LTEyOCkpK3JjeF0KKworREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CitEQgkxMDIsMTUsNTYsMjIwLDIyNAorREIJMTAyLDE1LDU2LDIyMCwyMzIKK0RCCTEwMiwxNSw1NiwyMjAsMjQwCitEQgkxMDIsMTUsNTYsMjIwLDI0OAorREIJMTAyLDY4LDE1LDU2LDIyMCwxOTIKK0RCCTEwMiw2OCwxNSw1NiwyMjAsMjAwCisJbW92dXBzCXhtbTAsWE1NV09SRFsoKDIyNC0xMjgpKStyY3hdCisJam1wCU5FQVIgJEwkY3RyMzJfZW5jX2RvbmUKKworQUxJR04JMTYKKyRMJGN0cjMyX2VuY19kb25lOgorCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzE2K3JkaV0KKwlweG9yCXhtbTEwLHhtbTAKKwltb3ZkcXUJeG1tMTIsWE1NV09SRFszMityZGldCisJcHhvcgl4bW0xMSx4bW0wCisJbW92ZHF1CXhtbTEzLFhNTVdPUkRbNDgrcmRpXQorCXB4b3IJeG1tMTIseG1tMAorCW1vdmRxdQl4bW0xNCxYTU1XT1JEWzY0K3JkaV0KKwlweG9yCXhtbTEzLHhtbTAKKwltb3ZkcXUJeG1tMTUsWE1NV09SRFs4MCtyZGldCisJcHhvcgl4bW0xNCx4bW0wCisJcHhvcgl4bW0xNSx4bW0wCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMCwyMDEKKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzk2K3JkaV0KKwlsZWEJcmRpLFsxMjgrcmRpXQorCitEQgkxMDIsNjUsMTUsNTYsMjIxLDIxMAorCXB4b3IJeG1tMSx4bW0wCisJbW92ZHF1CXhtbTEwLFhNTVdPUkRbKCgxMTItMTI4KSkrcmRpXQorREIJMTAyLDY1LDE1LDU2LDIyMSwyMTkKKwlweG9yCXhtbTEwLHhtbTAKKwltb3ZkcWEJeG1tMTEsWE1NV09SRFtyc3BdCitEQgkxMDIsNjUsMTUsNTYsMjIxLDIyOAorREIJMTAyLDY1LDE1LDU2LDIyMSwyMzcKKwltb3ZkcWEJeG1tMTIsWE1NV09SRFsxNityc3BdCisJbW92ZHFhCXhtbTEzLFhNTVdPUkRbMzIrcnNwXQorREIJMTAyLDY1LDE1LDU2LDIyMSwyNDYKK0RCCTEwMiw2NSwxNSw1NiwyMjEsMjU1CisJbW92ZHFhCXhtbTE0LFhNTVdPUkRbNDgrcnNwXQorCW1vdmRxYQl4bW0xNSxYTU1XT1JEWzY0K3JzcF0KK0RCCTEwMiw2OCwxNSw1NiwyMjEsMTkzCisJbW92ZHFhCXhtbTAsWE1NV09SRFs4MCtyc3BdCisJbW92dXBzCXhtbTEsWE1NV09SRFsoKDE2LTEyOCkpK3JjeF0KK0RCCTEwMiw2OSwxNSw1NiwyMjEsMjAyCisKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwltb3ZkcWEJeG1tMix4bW0xMQorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdmRxYQl4bW0zLHhtbTEyCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJbW92ZHFhCXhtbTQseG1tMTMKKwltb3Z1cHMJWE1NV09SRFs0OCtyc2ldLHhtbTUKKwltb3ZkcWEJeG1tNSx4bW0xNAorCW1vdnVwcwlYTU1XT1JEWzY0K3JzaV0seG1tNgorCW1vdmRxYQl4bW02LHhtbTE1CisJbW92dXBzCVhNTVdPUkRbODArcnNpXSx4bW03CisJbW92ZHFhCXhtbTcseG1tMAorCW1vdnVwcwlYTU1XT1JEWzk2K3JzaV0seG1tOAorCW1vdnVwcwlYTU1XT1JEWzExMityc2ldLHhtbTkKKwlsZWEJcnNpLFsxMjgrcnNpXQorCisJc3ViCXJkeCw4CisJam5jCU5FQVIgJEwkY3RyMzJfbG9vcDgKKworCWFkZAlyZHgsOAorCWp6CU5FQVIgJEwkY3RyMzJfZG9uZQorCWxlYQlyY3gsWygoLTEyOCkpK3JjeF0KKworJEwkY3RyMzJfdGFpbDoKKworCisJbGVhCXJjeCxbMTYrcmN4XQorCWNtcAlyZHgsNAorCWpiCU5FQVIgJEwkY3RyMzJfbG9vcDMKKwlqZQlORUFSICRMJGN0cjMyX2xvb3A0CisKKworCXNobAllYXgsNAorCW1vdmRxYQl4bW04LFhNTVdPUkRbOTYrcnNwXQorCXB4b3IJeG1tOSx4bW05CisKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzE2K3JjeF0KK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworCWxlYQlyY3gsWygoMzItMTYpKStyYXgqMStyY3hdCisJbmVnCXJheAorREIJMTAyLDE1LDU2LDIyMCwyMjUKKwlhZGQJcmF4LDE2CisJbW92dXBzCXhtbTEwLFhNTVdPUkRbcmRpXQorREIJMTAyLDE1LDU2LDIyMCwyMzMKK0RCCTEwMiwxNSw1NiwyMjAsMjQxCisJbW92dXBzCXhtbTExLFhNTVdPUkRbMTYrcmRpXQorCW1vdnVwcwl4bW0xMixYTU1XT1JEWzMyK3JkaV0KK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIwLDE5MworCisJY2FsbAkkTCRlbmNfbG9vcDhfZW50ZXIKKworCW1vdmRxdQl4bW0xMyxYTU1XT1JEWzQ4K3JkaV0KKwlweG9yCXhtbTIseG1tMTAKKwltb3ZkcXUJeG1tMTAsWE1NV09SRFs2NCtyZGldCisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW00LHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJcHhvcgl4bW01LHhtbTEzCisJbW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW00CisJcHhvcgl4bW02LHhtbTEwCisJbW92ZHF1CVhNTVdPUkRbNDgrcnNpXSx4bW01CisJbW92ZHF1CVhNTVdPUkRbNjQrcnNpXSx4bW02CisJY21wCXJkeCw2CisJamIJTkVBUiAkTCRjdHIzMl9kb25lCisKKwltb3Z1cHMJeG1tMTEsWE1NV09SRFs4MCtyZGldCisJeG9ycHMJeG1tNyx4bW0xMQorCW1vdnVwcwlYTU1XT1JEWzgwK3JzaV0seG1tNworCWplCU5FQVIgJEwkY3RyMzJfZG9uZQorCisJbW92dXBzCXhtbTEyLFhNTVdPUkRbOTYrcmRpXQorCXhvcnBzCXhtbTgseG1tMTIKKwltb3Z1cHMJWE1NV09SRFs5Nityc2ldLHhtbTgKKwlqbXAJTkVBUiAkTCRjdHIzMl9kb25lCisKK0FMSUdOCTMyCiskTCRjdHIzMl9sb29wNDoKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJbGVhCXJjeCxbMTYrcmN4XQorCWRlYwllYXgKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CitEQgkxMDIsMTUsNTYsMjIwLDIyNQorREIJMTAyLDE1LDU2LDIyMCwyMzMKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JjeF0KKwlqbnoJTkVBUiAkTCRjdHIzMl9sb29wNAorREIJMTAyLDE1LDU2LDIyMSwyMDkKK0RCCTEwMiwxNSw1NiwyMjEsMjE3CisJbW92dXBzCXhtbTEwLFhNTVdPUkRbcmRpXQorCW1vdnVwcwl4bW0xMSxYTU1XT1JEWzE2K3JkaV0KK0RCCTEwMiwxNSw1NiwyMjEsMjI1CitEQgkxMDIsMTUsNTYsMjIxLDIzMworCW1vdnVwcwl4bW0xMixYTU1XT1JEWzMyK3JkaV0KKwltb3Z1cHMJeG1tMTMsWE1NV09SRFs0OCtyZGldCisKKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJeG9ycHMJeG1tMyx4bW0xMQorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCXB4b3IJeG1tNCx4bW0xMgorCW1vdmRxdQlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tNSx4bW0xMworCW1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCWptcAlORUFSICRMJGN0cjMyX2RvbmUKKworQUxJR04JMzIKKyRMJGN0cjMyX2xvb3AzOgorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwlsZWEJcmN4LFsxNityY3hdCisJZGVjCWVheAorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CisJbW92dXBzCXhtbTEsWE1NV09SRFtyY3hdCisJam56CU5FQVIgJEwkY3RyMzJfbG9vcDMKK0RCCTEwMiwxNSw1NiwyMjEsMjA5CitEQgkxMDIsMTUsNTYsMjIxLDIxNworREIJMTAyLDE1LDU2LDIyMSwyMjUKKworCW1vdnVwcwl4bW0xMCxYTU1XT1JEW3JkaV0KKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJY21wCXJkeCwyCisJamIJTkVBUiAkTCRjdHIzMl9kb25lCisKKwltb3Z1cHMJeG1tMTEsWE1NV09SRFsxNityZGldCisJeG9ycHMJeG1tMyx4bW0xMQorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCWplCU5FQVIgJEwkY3RyMzJfZG9uZQorCisJbW92dXBzCXhtbTEyLFhNTVdPUkRbMzIrcmRpXQorCXhvcnBzCXhtbTQseG1tMTIKKwltb3Z1cHMJWE1NV09SRFszMityc2ldLHhtbTQKKworJEwkY3RyMzJfZG9uZToKKwl4b3Jwcwl4bW0wLHhtbTAKKwl4b3IJZWJwLGVicAorCXB4b3IJeG1tMSx4bW0xCisJcHhvcgl4bW0yLHhtbTIKKwlweG9yCXhtbTMseG1tMworCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTE2OCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTE2OCkrcjExXSx4bW0wCisJbW92YXBzCXhtbTcsWE1NV09SRFsoKC0xNTIpKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC0xNTIpK3IxMV0seG1tMAorCW1vdmFwcwl4bW04LFhNTVdPUkRbKCgtMTM2KSkrcjExXQorCW1vdmFwcwlYTU1XT1JEWygtMTM2KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTEyMCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTEyMCkrcjExXSx4bW0wCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbKCgtMTA0KSkrcjExXQorCW1vdmFwcwlYTU1XT1JEWygtMTA0KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTEsWE1NV09SRFsoKC04OCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTg4KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTIsWE1NV09SRFsoKC03MikpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTcyKStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsoKC01NikpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTU2KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsoKC00MCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTQwKStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTUsWE1NV09SRFsoKC0yNCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTI0KStyMTFdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFsxNityc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFszMityc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs0OCtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW0wCisJbW92CXJicCxRV09SRFsoKC04KSkrcjExXQorCisJbGVhCXJzcCxbcjExXQorCiskTCRjdHIzMl9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXNfaHdfY3RyMzJfZW5jcnlwdF9ibG9ja3M6CitnbG9iYWwJYWVzX2h3X3h0c19lbmNyeXB0CisKK0FMSUdOCTE2CithZXNfaHdfeHRzX2VuY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNfaHdfeHRzX2VuY3J5cHQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKwltb3YJcjksUVdPUkRbNDgrcnNwXQorCisKKworCWxlYQlyMTEsW3JzcF0KKworCXB1c2gJcmJwCisKKwlzdWIJcnNwLDI3MgorCWFuZAlyc3AsLTE2CisJbW92YXBzCVhNTVdPUkRbKC0xNjgpK3IxMV0seG1tNgorCW1vdmFwcwlYTU1XT1JEWygtMTUyKStyMTFdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFsoLTEzNikrcjExXSx4bW04CisJbW92YXBzCVhNTVdPUkRbKC0xMjApK3IxMV0seG1tOQorCW1vdmFwcwlYTU1XT1JEWygtMTA0KStyMTFdLHhtbTEwCisJbW92YXBzCVhNTVdPUkRbKC04OCkrcjExXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWygtNzIpK3IxMV0seG1tMTIKKwltb3ZhcHMJWE1NV09SRFsoLTU2KStyMTFdLHhtbTEzCisJbW92YXBzCVhNTVdPUkRbKC00MCkrcjExXSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWygtMjQpK3IxMV0seG1tMTUKKyRMJHh0c19lbmNfYm9keToKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3I5XQorCW1vdgllYXgsRFdPUkRbMjQwK3I4XQorCW1vdglyMTBkLERXT1JEWzI0MCtyY3hdCisJbW92dXBzCXhtbTAsWE1NV09SRFtyOF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3I4XQorCWxlYQlyOCxbMzIrcjhdCisJeG9ycHMJeG1tMix4bW0wCiskTCRvb3BfZW5jMV84OgorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwlkZWMJZWF4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyOF0KKwlsZWEJcjgsWzE2K3I4XQorCWpueglORUFSICRMJG9vcF9lbmMxXzgKK0RCCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJbW92CXJicCxyY3gKKwltb3YJZWF4LHIxMGQKKwlzaGwJcjEwZCw0CisJbW92CXI5LHJkeAorCWFuZAlyZHgsLTE2CisKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3IxMCoxK3JjeF0KKworCW1vdmRxYQl4bW04LFhNTVdPUkRbJEwkeHRzX21hZ2ljXQorCW1vdmRxYQl4bW0xNSx4bW0yCisJcHNodWZkCXhtbTkseG1tMiwweDVmCisJcHhvcgl4bW0xLHhtbTAKKwltb3ZkcWEJeG1tMTQseG1tOQorCXBhZGRkCXhtbTkseG1tOQorCW1vdmRxYQl4bW0xMCx4bW0xNQorCXBzcmFkCXhtbTE0LDMxCisJcGFkZHEJeG1tMTUseG1tMTUKKwlwYW5kCXhtbTE0LHhtbTgKKwlweG9yCXhtbTEwLHhtbTAKKwlweG9yCXhtbTE1LHhtbTE0CisJbW92ZHFhCXhtbTE0LHhtbTkKKwlwYWRkZAl4bW05LHhtbTkKKwltb3ZkcWEJeG1tMTEseG1tMTUKKwlwc3JhZAl4bW0xNCwzMQorCXBhZGRxCXhtbTE1LHhtbTE1CisJcGFuZAl4bW0xNCx4bW04CisJcHhvcgl4bW0xMSx4bW0wCisJcHhvcgl4bW0xNSx4bW0xNAorCW1vdmRxYQl4bW0xNCx4bW05CisJcGFkZGQJeG1tOSx4bW05CisJbW92ZHFhCXhtbTEyLHhtbTE1CisJcHNyYWQJeG1tMTQsMzEKKwlwYWRkcQl4bW0xNSx4bW0xNQorCXBhbmQJeG1tMTQseG1tOAorCXB4b3IJeG1tMTIseG1tMAorCXB4b3IJeG1tMTUseG1tMTQKKwltb3ZkcWEJeG1tMTQseG1tOQorCXBhZGRkCXhtbTkseG1tOQorCW1vdmRxYQl4bW0xMyx4bW0xNQorCXBzcmFkCXhtbTE0LDMxCisJcGFkZHEJeG1tMTUseG1tMTUKKwlwYW5kCXhtbTE0LHhtbTgKKwlweG9yCXhtbTEzLHhtbTAKKwlweG9yCXhtbTE1LHhtbTE0CisJbW92ZHFhCXhtbTE0LHhtbTE1CisJcHNyYWQJeG1tOSwzMQorCXBhZGRxCXhtbTE1LHhtbTE1CisJcGFuZAl4bW05LHhtbTgKKwlweG9yCXhtbTE0LHhtbTAKKwlweG9yCXhtbTE1LHhtbTkKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTEKKworCXN1YglyZHgsMTYqNgorCWpjCU5FQVIgJEwkeHRzX2VuY19zaG9ydAorCisJbW92CWVheCwxNis5NgorCWxlYQlyY3gsWzMyK3IxMCoxK3JicF0KKwlzdWIJcmF4LHIxMAorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmJwXQorCW1vdglyMTAscmF4CisJbGVhCXI4LFskTCR4dHNfbWFnaWNdCisJam1wCU5FQVIgJEwkeHRzX2VuY19ncmFuZGxvb3AKKworQUxJR04JMzIKKyRMJHh0c19lbmNfZ3JhbmRsb29wOgorCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmRpXQorCW1vdmRxYQl4bW04LHhtbTAKKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwlweG9yCXhtbTIseG1tMTAKKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwlweG9yCXhtbTMseG1tMTEKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92ZHF1CXhtbTUsWE1NV09SRFs0OCtyZGldCisJcHhvcgl4bW00LHhtbTEyCitEQgkxMDIsMTUsNTYsMjIwLDIxNworCW1vdmRxdQl4bW02LFhNTVdPUkRbNjQrcmRpXQorCXB4b3IJeG1tNSx4bW0xMworREIJMTAyLDE1LDU2LDIyMCwyMjUKKwltb3ZkcXUJeG1tNyxYTU1XT1JEWzgwK3JkaV0KKwlweG9yCXhtbTgseG1tMTUKKwltb3ZkcWEJeG1tOSxYTU1XT1JEWzk2K3JzcF0KKwlweG9yCXhtbTYseG1tMTQKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92dXBzCXhtbTAsWE1NV09SRFszMityYnBdCisJbGVhCXJkaSxbOTYrcmRpXQorCXB4b3IJeG1tNyx4bW04CisKKwlweG9yCXhtbTEwLHhtbTkKK0RCCTEwMiwxNSw1NiwyMjAsMjQxCisJcHhvcgl4bW0xMSx4bW05CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW0xMAorREIJMTAyLDE1LDU2LDIyMCwyNDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzQ4K3JicF0KKwlweG9yCXhtbTEyLHhtbTkKKworREIJMTAyLDE1LDU2LDIyMCwyMDgKKwlweG9yCXhtbTEzLHhtbTkKKwltb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTExCitEQgkxMDIsMTUsNTYsMjIwLDIxNgorCXB4b3IJeG1tMTQseG1tOQorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tMTIKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CitEQgkxMDIsMTUsNTYsMjIwLDIzMgorCXB4b3IJeG1tOCx4bW05CisJbW92ZHFhCVhNTVdPUkRbNjQrcnNwXSx4bW0xNAorREIJMTAyLDE1LDU2LDIyMCwyNDAKK0RCCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCXhtbTAsWE1NV09SRFs2NCtyYnBdCisJbW92ZHFhCVhNTVdPUkRbODArcnNwXSx4bW04CisJcHNodWZkCXhtbTkseG1tMTUsMHg1ZgorCWptcAlORUFSICRMJHh0c19lbmNfbG9vcDYKK0FMSUdOCTMyCiskTCR4dHNfZW5jX2xvb3A2OgorREIJMTAyLDE1LDU2LDIyMCwyMDkKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CitEQgkxMDIsMTUsNTYsMjIwLDIyNQorREIJMTAyLDE1LDU2LDIyMCwyMzMKK0RCCTEwMiwxNSw1NiwyMjAsMjQxCitEQgkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbKCgtNjQpKStyYXgqMStyY3hdCisJYWRkCXJheCwzMgorCitEQgkxMDIsMTUsNTYsMjIwLDIwOAorREIJMTAyLDE1LDU2LDIyMCwyMTYKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CitEQgkxMDIsMTUsNTYsMjIwLDIzMgorREIJMTAyLDE1LDU2LDIyMCwyNDAKK0RCCTEwMiwxNSw1NiwyMjAsMjQ4CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC04MCkpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCR4dHNfZW5jX2xvb3A2CisKKwltb3ZkcWEJeG1tOCxYTU1XT1JEW3I4XQorCW1vdmRxYQl4bW0xNCx4bW05CisJcGFkZGQJeG1tOSx4bW05CitEQgkxMDIsMTUsNTYsMjIwLDIwOQorCXBhZGRxCXhtbTE1LHhtbTE1CisJcHNyYWQJeG1tMTQsMzEKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CisJcGFuZAl4bW0xNCx4bW04CisJbW92dXBzCXhtbTEwLFhNTVdPUkRbcmJwXQorREIJMTAyLDE1LDU2LDIyMCwyMjUKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCitEQgkxMDIsMTUsNTYsMjIwLDI0MQorCXB4b3IJeG1tMTUseG1tMTQKKwltb3ZhcHMJeG1tMTEseG1tMTAKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCXhtbTEsWE1NV09SRFsoKC02NCkpK3JjeF0KKworCW1vdmRxYQl4bW0xNCx4bW05CitEQgkxMDIsMTUsNTYsMjIwLDIwOAorCXBhZGRkCXhtbTkseG1tOQorCXB4b3IJeG1tMTAseG1tMTUKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CisJcHNyYWQJeG1tMTQsMzEKKwlwYWRkcQl4bW0xNSx4bW0xNQorREIJMTAyLDE1LDU2LDIyMCwyMjQKK0RCCTEwMiwxNSw1NiwyMjAsMjMyCisJcGFuZAl4bW0xNCx4bW04CisJbW92YXBzCXhtbTEyLHhtbTExCitEQgkxMDIsMTUsNTYsMjIwLDI0MAorCXB4b3IJeG1tMTUseG1tMTQKKwltb3ZkcWEJeG1tMTQseG1tOQorREIJMTAyLDE1LDU2LDIyMCwyNDgKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTQ4KSkrcmN4XQorCisJcGFkZGQJeG1tOSx4bW05CitEQgkxMDIsMTUsNTYsMjIwLDIwOQorCXB4b3IJeG1tMTEseG1tMTUKKwlwc3JhZAl4bW0xNCwzMQorREIJMTAyLDE1LDU2LDIyMCwyMTcKKwlwYWRkcQl4bW0xNSx4bW0xNQorCXBhbmQJeG1tMTQseG1tOAorREIJMTAyLDE1LDU2LDIyMCwyMjUKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0xMworCXB4b3IJeG1tMTUseG1tMTQKK0RCCTEwMiwxNSw1NiwyMjAsMjQxCisJbW92YXBzCXhtbTEzLHhtbTEyCisJbW92ZHFhCXhtbTE0LHhtbTkKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCXhtbTEsWE1NV09SRFsoKC0zMikpK3JjeF0KKworCXBhZGRkCXhtbTkseG1tOQorREIJMTAyLDE1LDU2LDIyMCwyMDgKKwlweG9yCXhtbTEyLHhtbTE1CisJcHNyYWQJeG1tMTQsMzEKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CisJcGFkZHEJeG1tMTUseG1tMTUKKwlwYW5kCXhtbTE0LHhtbTgKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CitEQgkxMDIsMTUsNTYsMjIwLDIzMgorREIJMTAyLDE1LDU2LDIyMCwyNDAKKwlweG9yCXhtbTE1LHhtbTE0CisJbW92YXBzCXhtbTE0LHhtbTEzCitEQgkxMDIsMTUsNTYsMjIwLDI0OAorCisJbW92ZHFhCXhtbTAseG1tOQorCXBhZGRkCXhtbTkseG1tOQorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwlweG9yCXhtbTEzLHhtbTE1CisJcHNyYWQJeG1tMCwzMQorREIJMTAyLDE1LDU2LDIyMCwyMTcKKwlwYWRkcQl4bW0xNSx4bW0xNQorCXBhbmQJeG1tMCx4bW04CitEQgkxMDIsMTUsNTYsMjIwLDIyNQorREIJMTAyLDE1LDU2LDIyMCwyMzMKKwlweG9yCXhtbTE1LHhtbTAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JicF0KK0RCCTEwMiwxNSw1NiwyMjAsMjQxCitEQgkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmJwXQorCisJcHhvcgl4bW0xNCx4bW0xNQorREIJMTAyLDE1LDU2LDIyMSw4NCwzNiwwCisJcHNyYWQJeG1tOSwzMQorCXBhZGRxCXhtbTE1LHhtbTE1CitEQgkxMDIsMTUsNTYsMjIxLDkyLDM2LDE2CitEQgkxMDIsMTUsNTYsMjIxLDEwMCwzNiwzMgorCXBhbmQJeG1tOSx4bW04CisJbW92CXJheCxyMTAKK0RCCTEwMiwxNSw1NiwyMjEsMTA4LDM2LDQ4CitEQgkxMDIsMTUsNTYsMjIxLDExNiwzNiw2NAorREIJMTAyLDE1LDU2LDIyMSwxMjQsMzYsODAKKwlweG9yCXhtbTE1LHhtbTkKKworCWxlYQlyc2ksWzk2K3JzaV0KKwltb3Z1cHMJWE1NV09SRFsoLTk2KStyc2ldLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsoLTgwKStyc2ldLHhtbTMKKwltb3Z1cHMJWE1NV09SRFsoLTY0KStyc2ldLHhtbTQKKwltb3Z1cHMJWE1NV09SRFsoLTQ4KStyc2ldLHhtbTUKKwltb3Z1cHMJWE1NV09SRFsoLTMyKStyc2ldLHhtbTYKKwltb3Z1cHMJWE1NV09SRFsoLTE2KStyc2ldLHhtbTcKKwlzdWIJcmR4LDE2KjYKKwlqbmMJTkVBUiAkTCR4dHNfZW5jX2dyYW5kbG9vcAorCisJbW92CWVheCwxNis5NgorCXN1YgllYXgscjEwZAorCW1vdglyY3gscmJwCisJc2hyCWVheCw0CisKKyRMJHh0c19lbmNfc2hvcnQ6CisKKwltb3YJcjEwZCxlYXgKKwlweG9yCXhtbTEwLHhtbTAKKwlhZGQJcmR4LDE2KjYKKwlqeglORUFSICRMJHh0c19lbmNfZG9uZQorCisJcHhvcgl4bW0xMSx4bW0wCisJY21wCXJkeCwweDIwCisJamIJTkVBUiAkTCR4dHNfZW5jX29uZQorCXB4b3IJeG1tMTIseG1tMAorCWplCU5FQVIgJEwkeHRzX2VuY190d28KKworCXB4b3IJeG1tMTMseG1tMAorCWNtcAlyZHgsMHg0MAorCWpiCU5FQVIgJEwkeHRzX2VuY190aHJlZQorCXB4b3IJeG1tMTQseG1tMAorCWplCU5FQVIgJEwkeHRzX2VuY19mb3VyCisKKwltb3ZkcXUJeG1tMixYTU1XT1JEW3JkaV0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwlweG9yCXhtbTIseG1tMTAKKwltb3ZkcXUJeG1tNSxYTU1XT1JEWzQ4K3JkaV0KKwlweG9yCXhtbTMseG1tMTEKKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JkaV0KKwlsZWEJcmRpLFs4MCtyZGldCisJcHhvcgl4bW00LHhtbTEyCisJcHhvcgl4bW01LHhtbTEzCisJcHhvcgl4bW02LHhtbTE0CisJcHhvcgl4bW03LHhtbTcKKworCWNhbGwJX2Flc25pX2VuY3J5cHQ2CisKKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92ZHFhCXhtbTEwLHhtbTE1CisJeG9ycHMJeG1tMyx4bW0xMQorCXhvcnBzCXhtbTQseG1tMTIKKwltb3ZkcXUJWE1NV09SRFtyc2ldLHhtbTIKKwl4b3Jwcwl4bW01LHhtbTEzCisJbW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJeG9ycHMJeG1tNix4bW0xNAorCW1vdmRxdQlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCW1vdmRxdQlYTU1XT1JEWzY0K3JzaV0seG1tNgorCWxlYQlyc2ksWzgwK3JzaV0KKwlqbXAJTkVBUiAkTCR4dHNfZW5jX2RvbmUKKworQUxJR04JMTYKKyRMJHh0c19lbmNfb25lOgorCW1vdnVwcwl4bW0yLFhNTVdPUkRbcmRpXQorCWxlYQlyZGksWzE2K3JkaV0KKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJbGVhCXJjeCxbMzIrcmN4XQorCXhvcnBzCXhtbTIseG1tMAorJEwkb29wX2VuYzFfOToKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjCWVheAorCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmN4XQorCWxlYQlyY3gsWzE2K3JjeF0KKwlqbnoJTkVBUiAkTCRvb3BfZW5jMV85CitEQgkxMDIsMTUsNTYsMjIxLDIwOQorCXhvcnBzCXhtbTIseG1tMTAKKwltb3ZkcWEJeG1tMTAseG1tMTEKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlsZWEJcnNpLFsxNityc2ldCisJam1wCU5FQVIgJEwkeHRzX2VuY19kb25lCisKK0FMSUdOCTE2CiskTCR4dHNfZW5jX3R3bzoKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3JkaV0KKwltb3Z1cHMJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwlsZWEJcmRpLFszMityZGldCisJeG9ycHMJeG1tMix4bW0xMAorCXhvcnBzCXhtbTMseG1tMTEKKworCWNhbGwJX2Flc25pX2VuY3J5cHQyCisKKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92ZHFhCXhtbTEwLHhtbTEyCisJeG9ycHMJeG1tMyx4bW0xMQorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCWxlYQlyc2ksWzMyK3JzaV0KKwlqbXAJTkVBUiAkTCR4dHNfZW5jX2RvbmUKKworQUxJR04JMTYKKyRMJHh0c19lbmNfdGhyZWU6CisJbW92dXBzCXhtbTIsWE1NV09SRFtyZGldCisJbW92dXBzCXhtbTMsWE1NV09SRFsxNityZGldCisJbW92dXBzCXhtbTQsWE1NV09SRFszMityZGldCisJbGVhCXJkaSxbNDgrcmRpXQorCXhvcnBzCXhtbTIseG1tMTAKKwl4b3Jwcwl4bW0zLHhtbTExCisJeG9ycHMJeG1tNCx4bW0xMgorCisJY2FsbAlfYWVzbmlfZW5jcnlwdDMKKworCXhvcnBzCXhtbTIseG1tMTAKKwltb3ZkcWEJeG1tMTAseG1tMTMKKwl4b3Jwcwl4bW0zLHhtbTExCisJeG9ycHMJeG1tNCx4bW0xMgorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCWxlYQlyc2ksWzQ4K3JzaV0KKwlqbXAJTkVBUiAkTCR4dHNfZW5jX2RvbmUKKworQUxJR04JMTYKKyRMJHh0c19lbmNfZm91cjoKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3JkaV0KKwltb3Z1cHMJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwltb3Z1cHMJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92dXBzCXhtbTUsWE1NV09SRFs0OCtyZGldCisJbGVhCXJkaSxbNjQrcmRpXQorCXhvcnBzCXhtbTMseG1tMTEKKwl4b3Jwcwl4bW00LHhtbTEyCisJeG9ycHMJeG1tNSx4bW0xMworCisJY2FsbAlfYWVzbmlfZW5jcnlwdDQKKworCXB4b3IJeG1tMix4bW0xMAorCW1vdmRxYQl4bW0xMCx4bW0xNAorCXB4b3IJeG1tMyx4bW0xMQorCXB4b3IJeG1tNCx4bW0xMgorCW1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMgorCXB4b3IJeG1tNSx4bW0xMworCW1vdmRxdQlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdmRxdQlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCWxlYQlyc2ksWzY0K3JzaV0KKwlqbXAJTkVBUiAkTCR4dHNfZW5jX2RvbmUKKworQUxJR04JMTYKKyRMJHh0c19lbmNfZG9uZToKKwlhbmQJcjksMTUKKwlqeglORUFSICRMJHh0c19lbmNfcmV0CisJbW92CXJkeCxyOQorCiskTCR4dHNfZW5jX3N0ZWFsOgorCW1vdnp4CWVheCxCWVRFW3JkaV0KKwltb3Z6eAllY3gsQllURVsoKC0xNikpK3JzaV0KKwlsZWEJcmRpLFsxK3JkaV0KKwltb3YJQllURVsoKC0xNikpK3JzaV0sYWwKKwltb3YJQllURVtyc2ldLGNsCisJbGVhCXJzaSxbMStyc2ldCisJc3ViCXJkeCwxCisJam56CU5FQVIgJEwkeHRzX2VuY19zdGVhbAorCisJc3ViCXJzaSxyOQorCW1vdglyY3gscmJwCisJbW92CWVheCxyMTBkCisKKwltb3Z1cHMJeG1tMixYTU1XT1JEWygoLTE2KSkrcnNpXQorCXhvcnBzCXhtbTIseG1tMTAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JjeF0KKwlsZWEJcmN4LFszMityY3hdCisJeG9ycHMJeG1tMix4bW0wCiskTCRvb3BfZW5jMV8xMDoKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJZGVjCWVheAorCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmN4XQorCWxlYQlyY3gsWzE2K3JjeF0KKwlqbnoJTkVBUiAkTCRvb3BfZW5jMV8xMAorREIJMTAyLDE1LDU2LDIyMSwyMDkKKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92dXBzCVhNTVdPUkRbKC0xNikrcnNpXSx4bW0yCisKKyRMJHh0c19lbmNfcmV0OgorCXhvcnBzCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJcHhvcgl4bW0yLHhtbTIKKwlweG9yCXhtbTMseG1tMworCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTE2OCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTE2OCkrcjExXSx4bW0wCisJbW92YXBzCXhtbTcsWE1NV09SRFsoKC0xNTIpKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC0xNTIpK3IxMV0seG1tMAorCW1vdmFwcwl4bW04LFhNTVdPUkRbKCgtMTM2KSkrcjExXQorCW1vdmFwcwlYTU1XT1JEWygtMTM2KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTEyMCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTEyMCkrcjExXSx4bW0wCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbKCgtMTA0KSkrcjExXQorCW1vdmFwcwlYTU1XT1JEWygtMTA0KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTEsWE1NV09SRFsoKC04OCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTg4KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTIsWE1NV09SRFsoKC03MikpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTcyKStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsoKC01NikpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTU2KStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsoKC00MCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTQwKStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tMTUsWE1NV09SRFsoKC0yNCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTI0KStyMTFdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFsxNityc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFszMityc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs0OCtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTAKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTAKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyMTFdCisKKwlsZWEJcnNwLFtyMTFdCisKKyRMJHh0c19lbmNfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzX2h3X3h0c19lbmNyeXB0OgorZ2xvYmFsCWFlc19od194dHNfZGVjcnlwdAorCitBTElHTgkxNgorYWVzX2h3X3h0c19kZWNyeXB0OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzX2h3X3h0c19kZWNyeXB0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisKKwlsZWEJcjExLFtyc3BdCisKKwlwdXNoCXJicAorCisJc3ViCXJzcCwyNzIKKwlhbmQJcnNwLC0xNgorCW1vdmFwcwlYTU1XT1JEWygtMTY4KStyMTFdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFsoLTE1MikrcjExXSx4bW03CisJbW92YXBzCVhNTVdPUkRbKC0xMzYpK3IxMV0seG1tOAorCW1vdmFwcwlYTU1XT1JEWygtMTIwKStyMTFdLHhtbTkKKwltb3ZhcHMJWE1NV09SRFsoLTEwNCkrcjExXSx4bW0xMAorCW1vdmFwcwlYTU1XT1JEWygtODgpK3IxMV0seG1tMTEKKwltb3ZhcHMJWE1NV09SRFsoLTcyKStyMTFdLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbKC01NikrcjExXSx4bW0xMworCW1vdmFwcwlYTU1XT1JEWygtNDApK3IxMV0seG1tMTQKKwltb3ZhcHMJWE1NV09SRFsoLTI0KStyMTFdLHhtbTE1CiskTCR4dHNfZGVjX2JvZHk6CisJbW92dXBzCXhtbTIsWE1NV09SRFtyOV0KKwltb3YJZWF4LERXT1JEWzI0MCtyOF0KKwltb3YJcjEwZCxEV09SRFsyNDArcmN4XQorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcjhdCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityOF0KKwlsZWEJcjgsWzMyK3I4XQorCXhvcnBzCXhtbTIseG1tMAorJEwkb29wX2VuYzFfMTE6CitEQgkxMDIsMTUsNTYsMjIwLDIwOQorCWRlYwllYXgKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3I4XQorCWxlYQlyOCxbMTYrcjhdCisJam56CU5FQVIgJEwkb29wX2VuYzFfMTEKK0RCCTEwMiwxNSw1NiwyMjEsMjA5CisJeG9yCWVheCxlYXgKKwl0ZXN0CXJkeCwxNQorCXNldG56CWFsCisJc2hsCXJheCw0CisJc3ViCXJkeCxyYXgKKworCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCW1vdglyYnAscmN4CisJbW92CWVheCxyMTBkCisJc2hsCXIxMGQsNAorCW1vdglyOSxyZHgKKwlhbmQJcmR4LC0xNgorCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityMTAqMStyY3hdCisKKwltb3ZkcWEJeG1tOCxYTU1XT1JEWyRMJHh0c19tYWdpY10KKwltb3ZkcWEJeG1tMTUseG1tMgorCXBzaHVmZAl4bW05LHhtbTIsMHg1ZgorCXB4b3IJeG1tMSx4bW0wCisJbW92ZHFhCXhtbTE0LHhtbTkKKwlwYWRkZAl4bW05LHhtbTkKKwltb3ZkcWEJeG1tMTAseG1tMTUKKwlwc3JhZAl4bW0xNCwzMQorCXBhZGRxCXhtbTE1LHhtbTE1CisJcGFuZAl4bW0xNCx4bW04CisJcHhvcgl4bW0xMCx4bW0wCisJcHhvcgl4bW0xNSx4bW0xNAorCW1vdmRxYQl4bW0xNCx4bW05CisJcGFkZGQJeG1tOSx4bW05CisJbW92ZHFhCXhtbTExLHhtbTE1CisJcHNyYWQJeG1tMTQsMzEKKwlwYWRkcQl4bW0xNSx4bW0xNQorCXBhbmQJeG1tMTQseG1tOAorCXB4b3IJeG1tMTEseG1tMAorCXB4b3IJeG1tMTUseG1tMTQKKwltb3ZkcWEJeG1tMTQseG1tOQorCXBhZGRkCXhtbTkseG1tOQorCW1vdmRxYQl4bW0xMix4bW0xNQorCXBzcmFkCXhtbTE0LDMxCisJcGFkZHEJeG1tMTUseG1tMTUKKwlwYW5kCXhtbTE0LHhtbTgKKwlweG9yCXhtbTEyLHhtbTAKKwlweG9yCXhtbTE1LHhtbTE0CisJbW92ZHFhCXhtbTE0LHhtbTkKKwlwYWRkZAl4bW05LHhtbTkKKwltb3ZkcWEJeG1tMTMseG1tMTUKKwlwc3JhZAl4bW0xNCwzMQorCXBhZGRxCXhtbTE1LHhtbTE1CisJcGFuZAl4bW0xNCx4bW04CisJcHhvcgl4bW0xMyx4bW0wCisJcHhvcgl4bW0xNSx4bW0xNAorCW1vdmRxYQl4bW0xNCx4bW0xNQorCXBzcmFkCXhtbTksMzEKKwlwYWRkcQl4bW0xNSx4bW0xNQorCXBhbmQJeG1tOSx4bW04CisJcHhvcgl4bW0xNCx4bW0wCisJcHhvcgl4bW0xNSx4bW05CisJbW92YXBzCVhNTVdPUkRbOTYrcnNwXSx4bW0xCisKKwlzdWIJcmR4LDE2KjYKKwlqYwlORUFSICRMJHh0c19kZWNfc2hvcnQKKworCW1vdgllYXgsMTYrOTYKKwlsZWEJcmN4LFszMityMTAqMStyYnBdCisJc3ViCXJheCxyMTAKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JicF0KKwltb3YJcjEwLHJheAorCWxlYQlyOCxbJEwkeHRzX21hZ2ljXQorCWptcAlORUFSICRMJHh0c19kZWNfZ3JhbmRsb29wCisKK0FMSUdOCTMyCiskTCR4dHNfZGVjX2dyYW5kbG9vcDoKKwltb3ZkcXUJeG1tMixYTU1XT1JEW3JkaV0KKwltb3ZkcWEJeG1tOCx4bW0wCisJbW92ZHF1CXhtbTMsWE1NV09SRFsxNityZGldCisJcHhvcgl4bW0yLHhtbTEwCisJbW92ZHF1CXhtbTQsWE1NV09SRFszMityZGldCisJcHhvcgl4bW0zLHhtbTExCitEQgkxMDIsMTUsNTYsMjIyLDIwOQorCW1vdmRxdQl4bW01LFhNTVdPUkRbNDgrcmRpXQorCXB4b3IJeG1tNCx4bW0xMgorREIJMTAyLDE1LDU2LDIyMiwyMTcKKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JkaV0KKwlweG9yCXhtbTUseG1tMTMKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CisJbW92ZHF1CXhtbTcsWE1NV09SRFs4MCtyZGldCisJcHhvcgl4bW04LHhtbTE1CisJbW92ZHFhCXhtbTksWE1NV09SRFs5Nityc3BdCisJcHhvcgl4bW02LHhtbTE0CitEQgkxMDIsMTUsNTYsMjIyLDIzMworCW1vdnVwcwl4bW0wLFhNTVdPUkRbMzIrcmJwXQorCWxlYQlyZGksWzk2K3JkaV0KKwlweG9yCXhtbTcseG1tOAorCisJcHhvcgl4bW0xMCx4bW05CitEQgkxMDIsMTUsNTYsMjIyLDI0MQorCXB4b3IJeG1tMTEseG1tOQorCW1vdmRxYQlYTU1XT1JEW3JzcF0seG1tMTAKK0RCCTEwMiwxNSw1NiwyMjIsMjQ5CisJbW92dXBzCXhtbTEsWE1NV09SRFs0OCtyYnBdCisJcHhvcgl4bW0xMix4bW05CisKK0RCCTEwMiwxNSw1NiwyMjIsMjA4CisJcHhvcgl4bW0xMyx4bW05CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0xMQorREIJMTAyLDE1LDU2LDIyMiwyMTYKKwlweG9yCXhtbTE0LHhtbTkKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTEyCitEQgkxMDIsMTUsNTYsMjIyLDIyNAorREIJMTAyLDE1LDU2LDIyMiwyMzIKKwlweG9yCXhtbTgseG1tOQorCW1vdmRxYQlYTU1XT1JEWzY0K3JzcF0seG1tMTQKK0RCCTEwMiwxNSw1NiwyMjIsMjQwCitEQgkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbNjQrcmJwXQorCW1vdmRxYQlYTU1XT1JEWzgwK3JzcF0seG1tOAorCXBzaHVmZAl4bW05LHhtbTE1LDB4NWYKKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2xvb3A2CitBTElHTgkzMgorJEwkeHRzX2RlY19sb29wNjoKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworREIJMTAyLDE1LDU2LDIyMiwyMjUKK0RCCTEwMiwxNSw1NiwyMjIsMjMzCitEQgkxMDIsMTUsNTYsMjIyLDI0MQorREIJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoLTY0KSkrcmF4KjErcmN4XQorCWFkZAlyYXgsMzIKKworREIJMTAyLDE1LDU2LDIyMiwyMDgKK0RCCTEwMiwxNSw1NiwyMjIsMjE2CitEQgkxMDIsMTUsNTYsMjIyLDIyNAorREIJMTAyLDE1LDU2LDIyMiwyMzIKK0RCCTEwMiwxNSw1NiwyMjIsMjQwCitEQgkxMDIsMTUsNTYsMjIyLDI0OAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgtODApKStyYXgqMStyY3hdCisJam56CU5FQVIgJEwkeHRzX2RlY19sb29wNgorCisJbW92ZHFhCXhtbTgsWE1NV09SRFtyOF0KKwltb3ZkcWEJeG1tMTQseG1tOQorCXBhZGRkCXhtbTkseG1tOQorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlwYWRkcQl4bW0xNSx4bW0xNQorCXBzcmFkCXhtbTE0LDMxCitEQgkxMDIsMTUsNTYsMjIyLDIxNworCXBhbmQJeG1tMTQseG1tOAorCW1vdnVwcwl4bW0xMCxYTU1XT1JEW3JicF0KK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworREIJMTAyLDE1LDU2LDIyMiwyNDEKKwlweG9yCXhtbTE1LHhtbTE0CisJbW92YXBzCXhtbTExLHhtbTEwCitEQgkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbKCgtNjQpKStyY3hdCisKKwltb3ZkcWEJeG1tMTQseG1tOQorREIJMTAyLDE1LDU2LDIyMiwyMDgKKwlwYWRkZAl4bW05LHhtbTkKKwlweG9yCXhtbTEwLHhtbTE1CitEQgkxMDIsMTUsNTYsMjIyLDIxNgorCXBzcmFkCXhtbTE0LDMxCisJcGFkZHEJeG1tMTUseG1tMTUKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorCXBhbmQJeG1tMTQseG1tOAorCW1vdmFwcwl4bW0xMix4bW0xMQorREIJMTAyLDE1LDU2LDIyMiwyNDAKKwlweG9yCXhtbTE1LHhtbTE0CisJbW92ZHFhCXhtbTE0LHhtbTkKK0RCCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC00OCkpK3JjeF0KKworCXBhZGRkCXhtbTkseG1tOQorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlweG9yCXhtbTExLHhtbTE1CisJcHNyYWQJeG1tMTQsMzEKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CisJcGFkZHEJeG1tMTUseG1tMTUKKwlwYW5kCXhtbTE0LHhtbTgKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tMTMKKwlweG9yCXhtbTE1LHhtbTE0CitEQgkxMDIsMTUsNTYsMjIyLDI0MQorCW1vdmFwcwl4bW0xMyx4bW0xMgorCW1vdmRxYQl4bW0xNCx4bW05CitEQgkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbKCgtMzIpKStyY3hdCisKKwlwYWRkZAl4bW05LHhtbTkKK0RCCTEwMiwxNSw1NiwyMjIsMjA4CisJcHhvcgl4bW0xMix4bW0xNQorCXBzcmFkCXhtbTE0LDMxCitEQgkxMDIsMTUsNTYsMjIyLDIxNgorCXBhZGRxCXhtbTE1LHhtbTE1CisJcGFuZAl4bW0xNCx4bW04CitEQgkxMDIsMTUsNTYsMjIyLDIyNAorREIJMTAyLDE1LDU2LDIyMiwyMzIKK0RCCTEwMiwxNSw1NiwyMjIsMjQwCisJcHhvcgl4bW0xNSx4bW0xNAorCW1vdmFwcwl4bW0xNCx4bW0xMworREIJMTAyLDE1LDU2LDIyMiwyNDgKKworCW1vdmRxYQl4bW0wLHhtbTkKKwlwYWRkZAl4bW05LHhtbTkKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgl4bW0xMyx4bW0xNQorCXBzcmFkCXhtbTAsMzEKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CisJcGFkZHEJeG1tMTUseG1tMTUKKwlwYW5kCXhtbTAseG1tOAorREIJMTAyLDE1LDU2LDIyMiwyMjUKK0RCCTEwMiwxNSw1NiwyMjIsMjMzCisJcHhvcgl4bW0xNSx4bW0wCisJbW92dXBzCXhtbTAsWE1NV09SRFtyYnBdCitEQgkxMDIsMTUsNTYsMjIyLDI0MQorREIJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3JicF0KKworCXB4b3IJeG1tMTQseG1tMTUKK0RCCTEwMiwxNSw1NiwyMjMsODQsMzYsMAorCXBzcmFkCXhtbTksMzEKKwlwYWRkcQl4bW0xNSx4bW0xNQorREIJMTAyLDE1LDU2LDIyMyw5MiwzNiwxNgorREIJMTAyLDE1LDU2LDIyMywxMDAsMzYsMzIKKwlwYW5kCXhtbTkseG1tOAorCW1vdglyYXgscjEwCitEQgkxMDIsMTUsNTYsMjIzLDEwOCwzNiw0OAorREIJMTAyLDE1LDU2LDIyMywxMTYsMzYsNjQKK0RCCTEwMiwxNSw1NiwyMjMsMTI0LDM2LDgwCisJcHhvcgl4bW0xNSx4bW05CisKKwlsZWEJcnNpLFs5Nityc2ldCisJbW92dXBzCVhNTVdPUkRbKC05NikrcnNpXSx4bW0yCisJbW92dXBzCVhNTVdPUkRbKC04MCkrcnNpXSx4bW0zCisJbW92dXBzCVhNTVdPUkRbKC02NCkrcnNpXSx4bW00CisJbW92dXBzCVhNTVdPUkRbKC00OCkrcnNpXSx4bW01CisJbW92dXBzCVhNTVdPUkRbKC0zMikrcnNpXSx4bW02CisJbW92dXBzCVhNTVdPUkRbKC0xNikrcnNpXSx4bW03CisJc3ViCXJkeCwxNio2CisJam5jCU5FQVIgJEwkeHRzX2RlY19ncmFuZGxvb3AKKworCW1vdgllYXgsMTYrOTYKKwlzdWIJZWF4LHIxMGQKKwltb3YJcmN4LHJicAorCXNocgllYXgsNAorCiskTCR4dHNfZGVjX3Nob3J0OgorCisJbW92CXIxMGQsZWF4CisJcHhvcgl4bW0xMCx4bW0wCisJcHhvcgl4bW0xMSx4bW0wCisJYWRkCXJkeCwxNio2CisJanoJTkVBUiAkTCR4dHNfZGVjX2RvbmUKKworCXB4b3IJeG1tMTIseG1tMAorCWNtcAlyZHgsMHgyMAorCWpiCU5FQVIgJEwkeHRzX2RlY19vbmUKKwlweG9yCXhtbTEzLHhtbTAKKwlqZQlORUFSICRMJHh0c19kZWNfdHdvCisKKwlweG9yCXhtbTE0LHhtbTAKKwljbXAJcmR4LDB4NDAKKwlqYglORUFSICRMJHh0c19kZWNfdGhyZWUKKwlqZQlORUFSICRMJHh0c19kZWNfZm91cgorCisJbW92ZHF1CXhtbTIsWE1NV09SRFtyZGldCisJbW92ZHF1CXhtbTMsWE1NV09SRFsxNityZGldCisJbW92ZHF1CXhtbTQsWE1NV09SRFszMityZGldCisJcHhvcgl4bW0yLHhtbTEwCisJbW92ZHF1CXhtbTUsWE1NV09SRFs0OCtyZGldCisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CXhtbTYsWE1NV09SRFs2NCtyZGldCisJbGVhCXJkaSxbODArcmRpXQorCXB4b3IJeG1tNCx4bW0xMgorCXB4b3IJeG1tNSx4bW0xMworCXB4b3IJeG1tNix4bW0xNAorCisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKworCXhvcnBzCXhtbTIseG1tMTAKKwl4b3Jwcwl4bW0zLHhtbTExCisJeG9ycHMJeG1tNCx4bW0xMgorCW1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMgorCXhvcnBzCXhtbTUseG1tMTMKKwltb3ZkcXUJWE1NV09SRFsxNityc2ldLHhtbTMKKwl4b3Jwcwl4bW02LHhtbTE0CisJbW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW00CisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCXBjbXBndGQJeG1tMTQseG1tMTUKKwltb3ZkcXUJWE1NV09SRFs2NCtyc2ldLHhtbTYKKwlsZWEJcnNpLFs4MCtyc2ldCisJcHNodWZkCXhtbTExLHhtbTE0LDB4MTMKKwlhbmQJcjksMTUKKwlqeglORUFSICRMJHh0c19kZWNfcmV0CisKKwltb3ZkcWEJeG1tMTAseG1tMTUKKwlwYWRkcQl4bW0xNSx4bW0xNQorCXBhbmQJeG1tMTEseG1tOAorCXB4b3IJeG1tMTEseG1tMTUKKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2RvbmUyCisKK0FMSUdOCTE2CiskTCR4dHNfZGVjX29uZToKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3JkaV0KKwlsZWEJcmRpLFsxNityZGldCisJeG9ycHMJeG1tMix4bW0xMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmN4XQorCWxlYQlyY3gsWzMyK3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKyRMJG9vcF9kZWMxXzEyOgorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJZWF4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyY3hdCisJbGVhCXJjeCxbMTYrcmN4XQorCWpueglORUFSICRMJG9vcF9kZWMxXzEyCitEQgkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCXhtbTIseG1tMTAKKwltb3ZkcWEJeG1tMTAseG1tMTEKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwltb3ZkcWEJeG1tMTEseG1tMTIKKwlsZWEJcnNpLFsxNityc2ldCisJam1wCU5FQVIgJEwkeHRzX2RlY19kb25lCisKK0FMSUdOCTE2CiskTCR4dHNfZGVjX3R3bzoKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3JkaV0KKwltb3Z1cHMJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwlsZWEJcmRpLFszMityZGldCisJeG9ycHMJeG1tMix4bW0xMAorCXhvcnBzCXhtbTMseG1tMTEKKworCWNhbGwJX2Flc25pX2RlY3J5cHQyCisKKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92ZHFhCXhtbTEwLHhtbTEyCisJeG9ycHMJeG1tMyx4bW0xMQorCW1vdmRxYQl4bW0xMSx4bW0xMworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCWxlYQlyc2ksWzMyK3JzaV0KKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2RvbmUKKworQUxJR04JMTYKKyRMJHh0c19kZWNfdGhyZWU6CisJbW92dXBzCXhtbTIsWE1NV09SRFtyZGldCisJbW92dXBzCXhtbTMsWE1NV09SRFsxNityZGldCisJbW92dXBzCXhtbTQsWE1NV09SRFszMityZGldCisJbGVhCXJkaSxbNDgrcmRpXQorCXhvcnBzCXhtbTIseG1tMTAKKwl4b3Jwcwl4bW0zLHhtbTExCisJeG9ycHMJeG1tNCx4bW0xMgorCisJY2FsbAlfYWVzbmlfZGVjcnlwdDMKKworCXhvcnBzCXhtbTIseG1tMTAKKwltb3ZkcWEJeG1tMTAseG1tMTMKKwl4b3Jwcwl4bW0zLHhtbTExCisJbW92ZHFhCXhtbTExLHhtbTE0CisJeG9ycHMJeG1tNCx4bW0xMgorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCWxlYQlyc2ksWzQ4K3JzaV0KKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2RvbmUKKworQUxJR04JMTYKKyRMJHh0c19kZWNfZm91cjoKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3JkaV0KKwltb3Z1cHMJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwltb3Z1cHMJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92dXBzCXhtbTUsWE1NV09SRFs0OCtyZGldCisJbGVhCXJkaSxbNjQrcmRpXQorCXhvcnBzCXhtbTMseG1tMTEKKwl4b3Jwcwl4bW00LHhtbTEyCisJeG9ycHMJeG1tNSx4bW0xMworCisJY2FsbAlfYWVzbmlfZGVjcnlwdDQKKworCXB4b3IJeG1tMix4bW0xMAorCW1vdmRxYQl4bW0xMCx4bW0xNAorCXB4b3IJeG1tMyx4bW0xMQorCW1vdmRxYQl4bW0xMSx4bW0xNQorCXB4b3IJeG1tNCx4bW0xMgorCW1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMgorCXB4b3IJeG1tNSx4bW0xMworCW1vdmRxdQlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdmRxdQlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCWxlYQlyc2ksWzY0K3JzaV0KKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2RvbmUKKworQUxJR04JMTYKKyRMJHh0c19kZWNfZG9uZToKKwlhbmQJcjksMTUKKwlqeglORUFSICRMJHh0c19kZWNfcmV0CiskTCR4dHNfZGVjX2RvbmUyOgorCW1vdglyZHgscjkKKwltb3YJcmN4LHJicAorCW1vdgllYXgscjEwZAorCisJbW92dXBzCXhtbTIsWE1NV09SRFtyZGldCisJeG9ycHMJeG1tMix4bW0xMQorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmN4XQorCWxlYQlyY3gsWzMyK3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKyRMJG9vcF9kZWMxXzEzOgorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJZWF4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyY3hdCisJbGVhCXJjeCxbMTYrcmN4XQorCWpueglORUFSICRMJG9vcF9kZWMxXzEzCitEQgkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCXhtbTIseG1tMTEKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKworJEwkeHRzX2RlY19zdGVhbDoKKwltb3Z6eAllYXgsQllURVsxNityZGldCisJbW92engJZWN4LEJZVEVbcnNpXQorCWxlYQlyZGksWzErcmRpXQorCW1vdglCWVRFW3JzaV0sYWwKKwltb3YJQllURVsxNityc2ldLGNsCisJbGVhCXJzaSxbMStyc2ldCisJc3ViCXJkeCwxCisJam56CU5FQVIgJEwkeHRzX2RlY19zdGVhbAorCisJc3ViCXJzaSxyOQorCW1vdglyY3gscmJwCisJbW92CWVheCxyMTBkCisKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3JzaV0KKwl4b3Jwcwl4bW0yLHhtbTEwCisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJbGVhCXJjeCxbMzIrcmN4XQorCXhvcnBzCXhtbTIseG1tMAorJEwkb29wX2RlYzFfMTQ6CitEQgkxMDIsMTUsNTYsMjIyLDIwOQorCWRlYwllYXgKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JjeF0KKwlsZWEJcmN4LFsxNityY3hdCisJam56CU5FQVIgJEwkb29wX2RlYzFfMTQKK0RCCTEwMiwxNSw1NiwyMjMsMjA5CisJeG9ycHMJeG1tMix4bW0xMAorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCiskTCR4dHNfZGVjX3JldDoKKwl4b3Jwcwl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXB4b3IJeG1tMix4bW0yCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTQseG1tNAorCXB4b3IJeG1tNSx4bW01CisJbW92YXBzCXhtbTYsWE1NV09SRFsoKC0xNjgpKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC0xNjgpK3IxMV0seG1tMAorCW1vdmFwcwl4bW03LFhNTVdPUkRbKCgtMTUyKSkrcjExXQorCW1vdmFwcwlYTU1XT1JEWygtMTUyKStyMTFdLHhtbTAKKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoLTEzNikpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTEzNikrcjExXSx4bW0wCisJbW92YXBzCXhtbTksWE1NV09SRFsoKC0xMjApKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC0xMjApK3IxMV0seG1tMAorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWygoLTEwNCkpK3IxMV0KKwltb3ZhcHMJWE1NV09SRFsoLTEwNCkrcjExXSx4bW0wCisJbW92YXBzCXhtbTExLFhNTVdPUkRbKCgtODgpKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC04OCkrcjExXSx4bW0wCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbKCgtNzIpKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC03MikrcjExXSx4bW0wCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbKCgtNTYpKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC01NikrcjExXSx4bW0wCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbKCgtNDApKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC00MCkrcjExXSx4bW0wCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbKCgtMjQpKStyMTFdCisJbW92YXBzCVhNTVdPUkRbKC0yNCkrcjExXSx4bW0wCisJbW92YXBzCVhNTVdPUkRbcnNwXSx4bW0wCisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW0wCisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW0wCisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW0wCisJbW92YXBzCVhNTVdPUkRbNjQrcnNwXSx4bW0wCisJbW92YXBzCVhNTVdPUkRbODArcnNwXSx4bW0wCisJbW92YXBzCVhNTVdPUkRbOTYrcnNwXSx4bW0wCisJbW92CXJicCxRV09SRFsoKC04KSkrcjExXQorCisJbGVhCXJzcCxbcjExXQorCiskTCR4dHNfZGVjX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2Flc19od194dHNfZGVjcnlwdDoKK2dsb2JhbAlhZXNfaHdfb2NiX2VuY3J5cHQKKworQUxJR04JMzIKK2Flc19od19vY2JfZW5jcnlwdDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2Flc19od19vY2JfZW5jcnlwdDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCW1vdglyOSxRV09SRFs0OCtyc3BdCisKKworCisJbGVhCXJheCxbcnNwXQorCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJbGVhCXJzcCxbKCgtMTYwKSkrcnNwXQorCW1vdmFwcwlYTU1XT1JEW3JzcF0seG1tNgorCW1vdmFwcwlYTU1XT1JEWzE2K3JzcF0seG1tNworCW1vdmFwcwlYTU1XT1JEWzMyK3JzcF0seG1tOAorCW1vdmFwcwlYTU1XT1JEWzQ4K3JzcF0seG1tOQorCW1vdmFwcwlYTU1XT1JEWzY0K3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTExCisJbW92YXBzCVhNTVdPUkRbOTYrcnNwXSx4bW0xMgorCW1vdmFwcwlYTU1XT1JEWzExMityc3BdLHhtbTEzCisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMTQKKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0xNQorJEwkb2NiX2VuY19ib2R5OgorCW1vdglyYngsUVdPUkRbNTYrcmF4XQorCW1vdglyYnAsUVdPUkRbKCg1Nis4KSkrcmF4XQorCisJbW92CXIxMGQsRFdPUkRbMjQwK3JjeF0KKwltb3YJcjExLHJjeAorCXNobAlyMTBkLDQKKwltb3Z1cHMJeG1tOSxYTU1XT1JEW3JjeF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3IxMCoxK3JjeF0KKworCW1vdmRxdQl4bW0xNSxYTU1XT1JEW3I5XQorCXB4b3IJeG1tOSx4bW0xCisJcHhvcgl4bW0xNSx4bW0xCisKKwltb3YJZWF4LDE2KzMyCisJbGVhCXJjeCxbMzIrcjEwKjErcjExXQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcjExXQorCXN1YglyYXgscjEwCisJbW92CXIxMCxyYXgKKworCW1vdmRxdQl4bW0xMCxYTU1XT1JEW3JieF0KKwltb3ZkcXUJeG1tOCxYTU1XT1JEW3JicF0KKworCXRlc3QJcjgsMQorCWpueglORUFSICRMJG9jYl9lbmNfb2RkCisKKwlic2YJcjEyLHI4CisJYWRkCXI4LDEKKwlzaGwJcjEyLDQKKwltb3ZkcXUJeG1tNyxYTU1XT1JEW3IxMioxK3JieF0KKwltb3ZkcXUJeG1tMixYTU1XT1JEW3JkaV0KKwlsZWEJcmRpLFsxNityZGldCisKKwljYWxsCV9fb2NiX2VuY3J5cHQxCisKKwltb3ZkcWEJeG1tMTUseG1tNworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCWxlYQlyc2ksWzE2K3JzaV0KKwlzdWIJcmR4LDEKKwlqeglORUFSICRMJG9jYl9lbmNfZG9uZQorCiskTCRvY2JfZW5jX29kZDoKKwlsZWEJcjEyLFsxK3I4XQorCWxlYQlyMTMsWzMrcjhdCisJbGVhCXIxNCxbNStyOF0KKwlsZWEJcjgsWzYrcjhdCisJYnNmCXIxMixyMTIKKwlic2YJcjEzLHIxMworCWJzZglyMTQscjE0CisJc2hsCXIxMiw0CisJc2hsCXIxMyw0CisJc2hsCXIxNCw0CisKKwlzdWIJcmR4LDYKKwlqYwlORUFSICRMJG9jYl9lbmNfc2hvcnQKKwlqbXAJTkVBUiAkTCRvY2JfZW5jX2dyYW5kbG9vcAorCitBTElHTgkzMgorJEwkb2NiX2VuY19ncmFuZGxvb3A6CisJbW92ZHF1CXhtbTIsWE1NV09SRFtyZGldCisJbW92ZHF1CXhtbTMsWE1NV09SRFsxNityZGldCisJbW92ZHF1CXhtbTQsWE1NV09SRFszMityZGldCisJbW92ZHF1CXhtbTUsWE1NV09SRFs0OCtyZGldCisJbW92ZHF1CXhtbTYsWE1NV09SRFs2NCtyZGldCisJbW92ZHF1CXhtbTcsWE1NV09SRFs4MCtyZGldCisJbGVhCXJkaSxbOTYrcmRpXQorCisJY2FsbAlfX29jYl9lbmNyeXB0NgorCisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJbW92dXBzCVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJbW92dXBzCVhNTVdPUkRbNjQrcnNpXSx4bW02CisJbW92dXBzCVhNTVdPUkRbODArcnNpXSx4bW03CisJbGVhCXJzaSxbOTYrcnNpXQorCXN1YglyZHgsNgorCWpuYwlORUFSICRMJG9jYl9lbmNfZ3JhbmRsb29wCisKKyRMJG9jYl9lbmNfc2hvcnQ6CisJYWRkCXJkeCw2CisJanoJTkVBUiAkTCRvY2JfZW5jX2RvbmUKKworCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmRpXQorCWNtcAlyZHgsMgorCWpiCU5FQVIgJEwkb2NiX2VuY19vbmUKKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwlqZQlORUFSICRMJG9jYl9lbmNfdHdvCisKKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwljbXAJcmR4LDQKKwlqYglORUFSICRMJG9jYl9lbmNfdGhyZWUKKwltb3ZkcXUJeG1tNSxYTU1XT1JEWzQ4K3JkaV0KKwlqZQlORUFSICRMJG9jYl9lbmNfZm91cgorCisJbW92ZHF1CXhtbTYsWE1NV09SRFs2NCtyZGldCisJcHhvcgl4bW03LHhtbTcKKworCWNhbGwJX19vY2JfZW5jcnlwdDYKKworCW1vdmRxYQl4bW0xNSx4bW0xNAorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdnVwcwlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCW1vdnVwcwlYTU1XT1JEWzY0K3JzaV0seG1tNgorCisJam1wCU5FQVIgJEwkb2NiX2VuY19kb25lCisKK0FMSUdOCTE2CiskTCRvY2JfZW5jX29uZToKKwltb3ZkcWEJeG1tNyx4bW0xMAorCisJY2FsbAlfX29jYl9lbmNyeXB0MQorCisJbW92ZHFhCXhtbTE1LHhtbTcKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlqbXAJTkVBUiAkTCRvY2JfZW5jX2RvbmUKKworQUxJR04JMTYKKyRMJG9jYl9lbmNfdHdvOgorCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKworCWNhbGwJX19vY2JfZW5jcnlwdDQKKworCW1vdmRxYQl4bW0xNSx4bW0xMQorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCisJam1wCU5FQVIgJEwkb2NiX2VuY19kb25lCisKK0FMSUdOCTE2CiskTCRvY2JfZW5jX3RocmVlOgorCXB4b3IJeG1tNSx4bW01CisKKwljYWxsCV9fb2NiX2VuY3J5cHQ0CisKKwltb3ZkcWEJeG1tMTUseG1tMTIKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwltb3Z1cHMJWE1NV09SRFszMityc2ldLHhtbTQKKworCWptcAlORUFSICRMJG9jYl9lbmNfZG9uZQorCitBTElHTgkxNgorJEwkb2NiX2VuY19mb3VyOgorCWNhbGwJX19vY2JfZW5jcnlwdDQKKworCW1vdmRxYQl4bW0xNSx4bW0xMworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdnVwcwlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCiskTCRvY2JfZW5jX2RvbmU6CisJcHhvcgl4bW0xNSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbcmJwXSx4bW04CisJbW92ZHF1CVhNTVdPUkRbcjldLHhtbTE1CisKKwl4b3Jwcwl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXB4b3IJeG1tMix4bW0yCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTQseG1tNAorCXB4b3IJeG1tNSx4bW01CisJbW92YXBzCXhtbTYsWE1NV09SRFtyc3BdCisJbW92YXBzCVhNTVdPUkRbcnNwXSx4bW0wCisJbW92YXBzCXhtbTcsWE1NV09SRFsxNityc3BdCisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW0wCisJbW92YXBzCXhtbTgsWE1NV09SRFszMityc3BdCisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW0wCisJbW92YXBzCXhtbTksWE1NV09SRFs0OCtyc3BdCisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW0wCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzY0K3JzcF0seG1tMAorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTAKKwltb3ZhcHMJeG1tMTIsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCVhNTVdPUkRbOTYrcnNwXSx4bW0wCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW0wCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbMTI4K3JzcF0KKwltb3ZhcHMJWE1NV09SRFsxMjgrcnNwXSx4bW0wCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbMTQ0K3JzcF0KKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0wCisJbGVhCXJheCxbKCgxNjArNDApKStyc3BdCiskTCRvY2JfZW5jX3BvcDoKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcmF4XQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcmF4XQorCisJbGVhCXJzcCxbcmF4XQorCiskTCRvY2JfZW5jX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2Flc19od19vY2JfZW5jcnlwdDoKKworCitBTElHTgkzMgorX19vY2JfZW5jcnlwdDY6CisJcHhvcgl4bW0xNSx4bW05CisJbW92ZHF1CXhtbTExLFhNTVdPUkRbcjEyKjErcmJ4XQorCW1vdmRxYQl4bW0xMix4bW0xMAorCW1vdmRxdQl4bW0xMyxYTU1XT1JEW3IxMyoxK3JieF0KKwltb3ZkcWEJeG1tMTQseG1tMTAKKwlweG9yCXhtbTEwLHhtbTE1CisJbW92ZHF1CXhtbTE1LFhNTVdPUkRbcjE0KjErcmJ4XQorCXB4b3IJeG1tMTEseG1tMTAKKwlweG9yCXhtbTgseG1tMgorCXB4b3IJeG1tMix4bW0xMAorCXB4b3IJeG1tMTIseG1tMTEKKwlweG9yCXhtbTgseG1tMworCXB4b3IJeG1tMyx4bW0xMQorCXB4b3IJeG1tMTMseG1tMTIKKwlweG9yCXhtbTgseG1tNAorCXB4b3IJeG1tNCx4bW0xMgorCXB4b3IJeG1tMTQseG1tMTMKKwlweG9yCXhtbTgseG1tNQorCXB4b3IJeG1tNSx4bW0xMworCXB4b3IJeG1tMTUseG1tMTQKKwlweG9yCXhtbTgseG1tNgorCXB4b3IJeG1tNix4bW0xNAorCXB4b3IJeG1tOCx4bW03CisJcHhvcgl4bW03LHhtbTE1CisJbW92dXBzCXhtbTAsWE1NV09SRFszMityMTFdCisKKwlsZWEJcjEyLFsxK3I4XQorCWxlYQlyMTMsWzMrcjhdCisJbGVhCXIxNCxbNStyOF0KKwlhZGQJcjgsNgorCXB4b3IJeG1tMTAseG1tOQorCWJzZglyMTIscjEyCisJYnNmCXIxMyxyMTMKKwlic2YJcjE0LHIxNAorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworCXB4b3IJeG1tMTEseG1tOQorCXB4b3IJeG1tMTIseG1tOQorREIJMTAyLDE1LDU2LDIyMCwyNDEKKwlweG9yCXhtbTEzLHhtbTkKKwlweG9yCXhtbTE0LHhtbTkKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCXhtbTEsWE1NV09SRFs0OCtyMTFdCisJcHhvcgl4bW0xNSx4bW05CisKK0RCCTEwMiwxNSw1NiwyMjAsMjA4CitEQgkxMDIsMTUsNTYsMjIwLDIxNgorREIJMTAyLDE1LDU2LDIyMCwyMjQKK0RCCTEwMiwxNSw1NiwyMjAsMjMyCitEQgkxMDIsMTUsNTYsMjIwLDI0MAorREIJMTAyLDE1LDU2LDIyMCwyNDgKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzY0K3IxMV0KKwlzaGwJcjEyLDQKKwlzaGwJcjEzLDQKKwlqbXAJTkVBUiAkTCRvY2JfZW5jX2xvb3A2CisKK0FMSUdOCTMyCiskTCRvY2JfZW5jX2xvb3A2OgorREIJMTAyLDE1LDU2LDIyMCwyMDkKK0RCCTEwMiwxNSw1NiwyMjAsMjE3CitEQgkxMDIsMTUsNTYsMjIwLDIyNQorREIJMTAyLDE1LDU2LDIyMCwyMzMKK0RCCTEwMiwxNSw1NiwyMjAsMjQxCitEQgkxMDIsMTUsNTYsMjIwLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmF4KjErcmN4XQorCWFkZAlyYXgsMzIKKworREIJMTAyLDE1LDU2LDIyMCwyMDgKK0RCCTEwMiwxNSw1NiwyMjAsMjE2CitEQgkxMDIsMTUsNTYsMjIwLDIyNAorREIJMTAyLDE1LDU2LDIyMCwyMzIKK0RCCTEwMiwxNSw1NiwyMjAsMjQwCitEQgkxMDIsMTUsNTYsMjIwLDI0OAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgtMTYpKStyYXgqMStyY3hdCisJam56CU5FQVIgJEwkb2NiX2VuY19sb29wNgorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworREIJMTAyLDE1LDU2LDIyMCwyNDEKK0RCCTEwMiwxNSw1NiwyMjAsMjQ5CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityMTFdCisJc2hsCXIxNCw0CisKK0RCCTEwMiw2NSwxNSw1NiwyMjEsMjEwCisJbW92ZHF1CXhtbTEwLFhNTVdPUkRbcmJ4XQorCW1vdglyYXgscjEwCitEQgkxMDIsNjUsMTUsNTYsMjIxLDIxOQorREIJMTAyLDY1LDE1LDU2LDIyMSwyMjgKK0RCCTEwMiw2NSwxNSw1NiwyMjEsMjM3CitEQgkxMDIsNjUsMTUsNTYsMjIxLDI0NgorREIJMTAyLDY1LDE1LDU2LDIyMSwyNTUKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKK0FMSUdOCTMyCitfX29jYl9lbmNyeXB0NDoKKwlweG9yCXhtbTE1LHhtbTkKKwltb3ZkcXUJeG1tMTEsWE1NV09SRFtyMTIqMStyYnhdCisJbW92ZHFhCXhtbTEyLHhtbTEwCisJbW92ZHF1CXhtbTEzLFhNTVdPUkRbcjEzKjErcmJ4XQorCXB4b3IJeG1tMTAseG1tMTUKKwlweG9yCXhtbTExLHhtbTEwCisJcHhvcgl4bW04LHhtbTIKKwlweG9yCXhtbTIseG1tMTAKKwlweG9yCXhtbTEyLHhtbTExCisJcHhvcgl4bW04LHhtbTMKKwlweG9yCXhtbTMseG1tMTEKKwlweG9yCXhtbTEzLHhtbTEyCisJcHhvcgl4bW04LHhtbTQKKwlweG9yCXhtbTQseG1tMTIKKwlweG9yCXhtbTgseG1tNQorCXB4b3IJeG1tNSx4bW0xMworCW1vdnVwcwl4bW0wLFhNTVdPUkRbMzIrcjExXQorCisJcHhvcgl4bW0xMCx4bW05CisJcHhvcgl4bW0xMSx4bW05CisJcHhvcgl4bW0xMix4bW05CisJcHhvcgl4bW0xMyx4bW05CisKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworREIJMTAyLDE1LDU2LDIyMCwyMjUKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92dXBzCXhtbTEsWE1NV09SRFs0OCtyMTFdCisKK0RCCTEwMiwxNSw1NiwyMjAsMjA4CitEQgkxMDIsMTUsNTYsMjIwLDIxNgorREIJMTAyLDE1LDU2LDIyMCwyMjQKK0RCCTEwMiwxNSw1NiwyMjAsMjMyCisJbW92dXBzCXhtbTAsWE1NV09SRFs2NCtyMTFdCisJam1wCU5FQVIgJEwkb2NiX2VuY19sb29wNAorCitBTElHTgkzMgorJEwkb2NiX2VuY19sb29wNDoKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CitEQgkxMDIsMTUsNTYsMjIwLDIxNworREIJMTAyLDE1LDU2LDIyMCwyMjUKK0RCCTEwMiwxNSw1NiwyMjAsMjMzCisJbW92dXBzCXhtbTEsWE1NV09SRFtyYXgqMStyY3hdCisJYWRkCXJheCwzMgorCitEQgkxMDIsMTUsNTYsMjIwLDIwOAorREIJMTAyLDE1LDU2LDIyMCwyMTYKK0RCCTEwMiwxNSw1NiwyMjAsMjI0CitEQgkxMDIsMTUsNTYsMjIwLDIzMgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgtMTYpKStyYXgqMStyY3hdCisJam56CU5FQVIgJEwkb2NiX2VuY19sb29wNAorCitEQgkxMDIsMTUsNTYsMjIwLDIwOQorREIJMTAyLDE1LDU2LDIyMCwyMTcKK0RCCTEwMiwxNSw1NiwyMjAsMjI1CitEQgkxMDIsMTUsNTYsMjIwLDIzMworCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcjExXQorCW1vdglyYXgscjEwCisKK0RCCTEwMiw2NSwxNSw1NiwyMjEsMjEwCitEQgkxMDIsNjUsMTUsNTYsMjIxLDIxOQorREIJMTAyLDY1LDE1LDU2LDIyMSwyMjgKK0RCCTEwMiw2NSwxNSw1NiwyMjEsMjM3CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCitBTElHTgkzMgorX19vY2JfZW5jcnlwdDE6CisJcHhvcgl4bW03LHhtbTE1CisJcHhvcgl4bW03LHhtbTkKKwlweG9yCXhtbTgseG1tMgorCXB4b3IJeG1tMix4bW03CisJbW92dXBzCXhtbTAsWE1NV09SRFszMityMTFdCisKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92dXBzCXhtbTEsWE1NV09SRFs0OCtyMTFdCisJcHhvcgl4bW03LHhtbTkKKworREIJMTAyLDE1LDU2LDIyMCwyMDgKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzY0K3IxMV0KKwlqbXAJTkVBUiAkTCRvY2JfZW5jX2xvb3AxCisKK0FMSUdOCTMyCiskTCRvY2JfZW5jX2xvb3AxOgorREIJMTAyLDE1LDU2LDIyMCwyMDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCisKK0RCCTEwMiwxNSw1NiwyMjAsMjA4CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC0xNikpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCRvY2JfZW5jX2xvb3AxCisKK0RCCTEwMiwxNSw1NiwyMjAsMjA5CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityMTFdCisJbW92CXJheCxyMTAKKworREIJMTAyLDE1LDU2LDIyMSwyMTUKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitnbG9iYWwJYWVzX2h3X29jYl9kZWNyeXB0CisKK0FMSUdOCTMyCithZXNfaHdfb2NiX2RlY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9hZXNfaHdfb2NiX2RlY3J5cHQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKwltb3YJcjksUVdPUkRbNDgrcnNwXQorCisKKworCWxlYQlyYXgsW3JzcF0KKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCWxlYQlyc3AsWygoLTE2MCkpK3JzcF0KKwltb3ZhcHMJWE1NV09SRFtyc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFsxNityc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFszMityc3BdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFs0OCtyc3BdLHhtbTkKKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTEwCisJbW92YXBzCVhNTVdPUkRbODArcnNwXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWzk2K3JzcF0seG1tMTIKKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW0xMworCW1vdmFwcwlYTU1XT1JEWzEyOCtyc3BdLHhtbTE0CisJbW92YXBzCVhNTVdPUkRbMTQ0K3JzcF0seG1tMTUKKyRMJG9jYl9kZWNfYm9keToKKwltb3YJcmJ4LFFXT1JEWzU2K3JheF0KKwltb3YJcmJwLFFXT1JEWygoNTYrOCkpK3JheF0KKworCW1vdglyMTBkLERXT1JEWzI0MCtyY3hdCisJbW92CXIxMSxyY3gKKwlzaGwJcjEwZCw0CisJbW92dXBzCXhtbTksWE1NV09SRFtyY3hdCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityMTAqMStyY3hdCisKKwltb3ZkcXUJeG1tMTUsWE1NV09SRFtyOV0KKwlweG9yCXhtbTkseG1tMQorCXB4b3IJeG1tMTUseG1tMQorCisJbW92CWVheCwxNiszMgorCWxlYQlyY3gsWzMyK3IxMCoxK3IxMV0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzE2K3IxMV0KKwlzdWIJcmF4LHIxMAorCW1vdglyMTAscmF4CisKKwltb3ZkcXUJeG1tMTAsWE1NV09SRFtyYnhdCisJbW92ZHF1CXhtbTgsWE1NV09SRFtyYnBdCisKKwl0ZXN0CXI4LDEKKwlqbnoJTkVBUiAkTCRvY2JfZGVjX29kZAorCisJYnNmCXIxMixyOAorCWFkZAlyOCwxCisJc2hsCXIxMiw0CisJbW92ZHF1CXhtbTcsWE1NV09SRFtyMTIqMStyYnhdCisJbW92ZHF1CXhtbTIsWE1NV09SRFtyZGldCisJbGVhCXJkaSxbMTYrcmRpXQorCisJY2FsbAlfX29jYl9kZWNyeXB0MQorCisJbW92ZHFhCXhtbTE1LHhtbTcKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwl4b3Jwcwl4bW04LHhtbTIKKwlsZWEJcnNpLFsxNityc2ldCisJc3ViCXJkeCwxCisJanoJTkVBUiAkTCRvY2JfZGVjX2RvbmUKKworJEwkb2NiX2RlY19vZGQ6CisJbGVhCXIxMixbMStyOF0KKwlsZWEJcjEzLFszK3I4XQorCWxlYQlyMTQsWzUrcjhdCisJbGVhCXI4LFs2K3I4XQorCWJzZglyMTIscjEyCisJYnNmCXIxMyxyMTMKKwlic2YJcjE0LHIxNAorCXNobAlyMTIsNAorCXNobAlyMTMsNAorCXNobAlyMTQsNAorCisJc3ViCXJkeCw2CisJamMJTkVBUiAkTCRvY2JfZGVjX3Nob3J0CisJam1wCU5FQVIgJEwkb2NiX2RlY19ncmFuZGxvb3AKKworQUxJR04JMzIKKyRMJG9jYl9kZWNfZ3JhbmRsb29wOgorCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmRpXQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbMTYrcmRpXQorCW1vdmRxdQl4bW00LFhNTVdPUkRbMzIrcmRpXQorCW1vdmRxdQl4bW01LFhNTVdPUkRbNDgrcmRpXQorCW1vdmRxdQl4bW02LFhNTVdPUkRbNjQrcmRpXQorCW1vdmRxdQl4bW03LFhNTVdPUkRbODArcmRpXQorCWxlYQlyZGksWzk2K3JkaV0KKworCWNhbGwJX19vY2JfZGVjcnlwdDYKKworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCXB4b3IJeG1tOCx4bW0yCisJbW92dXBzCVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJcHhvcgl4bW04LHhtbTMKKwltb3Z1cHMJWE1NV09SRFszMityc2ldLHhtbTQKKwlweG9yCXhtbTgseG1tNAorCW1vdnVwcwlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCXB4b3IJeG1tOCx4bW01CisJbW92dXBzCVhNTVdPUkRbNjQrcnNpXSx4bW02CisJcHhvcgl4bW04LHhtbTYKKwltb3Z1cHMJWE1NV09SRFs4MCtyc2ldLHhtbTcKKwlweG9yCXhtbTgseG1tNworCWxlYQlyc2ksWzk2K3JzaV0KKwlzdWIJcmR4LDYKKwlqbmMJTkVBUiAkTCRvY2JfZGVjX2dyYW5kbG9vcAorCiskTCRvY2JfZGVjX3Nob3J0OgorCWFkZAlyZHgsNgorCWp6CU5FQVIgJEwkb2NiX2RlY19kb25lCisKKwltb3ZkcXUJeG1tMixYTU1XT1JEW3JkaV0KKwljbXAJcmR4LDIKKwlqYglORUFSICRMJG9jYl9kZWNfb25lCisJbW92ZHF1CXhtbTMsWE1NV09SRFsxNityZGldCisJamUJTkVBUiAkTCRvY2JfZGVjX3R3bworCisJbW92ZHF1CXhtbTQsWE1NV09SRFszMityZGldCisJY21wCXJkeCw0CisJamIJTkVBUiAkTCRvY2JfZGVjX3RocmVlCisJbW92ZHF1CXhtbTUsWE1NV09SRFs0OCtyZGldCisJamUJTkVBUiAkTCRvY2JfZGVjX2ZvdXIKKworCW1vdmRxdQl4bW02LFhNTVdPUkRbNjQrcmRpXQorCXB4b3IJeG1tNyx4bW03CisKKwljYWxsCV9fb2NiX2RlY3J5cHQ2CisKKwltb3ZkcWEJeG1tMTUseG1tMTQKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlweG9yCXhtbTgseG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCXB4b3IJeG1tOCx4bW0zCisJbW92dXBzCVhNTVdPUkRbMzIrcnNpXSx4bW00CisJcHhvcgl4bW04LHhtbTQKKwltb3Z1cHMJWE1NV09SRFs0OCtyc2ldLHhtbTUKKwlweG9yCXhtbTgseG1tNQorCW1vdnVwcwlYTU1XT1JEWzY0K3JzaV0seG1tNgorCXB4b3IJeG1tOCx4bW02CisKKwlqbXAJTkVBUiAkTCRvY2JfZGVjX2RvbmUKKworQUxJR04JMTYKKyRMJG9jYl9kZWNfb25lOgorCW1vdmRxYQl4bW03LHhtbTEwCisKKwljYWxsCV9fb2NiX2RlY3J5cHQxCisKKwltb3ZkcWEJeG1tMTUseG1tNworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCXhvcnBzCXhtbTgseG1tMgorCWptcAlORUFSICRMJG9jYl9kZWNfZG9uZQorCitBTElHTgkxNgorJEwkb2NiX2RlY190d286CisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorCisJY2FsbAlfX29jYl9kZWNyeXB0NAorCisJbW92ZHFhCXhtbTE1LHhtbTExCisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJeG9ycHMJeG1tOCx4bW0yCisJbW92dXBzCVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJeG9ycHMJeG1tOCx4bW0zCisKKwlqbXAJTkVBUiAkTCRvY2JfZGVjX2RvbmUKKworQUxJR04JMTYKKyRMJG9jYl9kZWNfdGhyZWU6CisJcHhvcgl4bW01LHhtbTUKKworCWNhbGwJX19vY2JfZGVjcnlwdDQKKworCW1vdmRxYQl4bW0xNSx4bW0xMgorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCXhvcnBzCXhtbTgseG1tMgorCW1vdnVwcwlYTU1XT1JEWzE2K3JzaV0seG1tMworCXhvcnBzCXhtbTgseG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXhvcnBzCXhtbTgseG1tNAorCisJam1wCU5FQVIgJEwkb2NiX2RlY19kb25lCisKK0FMSUdOCTE2CiskTCRvY2JfZGVjX2ZvdXI6CisJY2FsbAlfX29jYl9kZWNyeXB0NAorCisJbW92ZHFhCXhtbTE1LHhtbTEzCisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW04LHhtbTIKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwlweG9yCXhtbTgseG1tMworCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tOCx4bW00CisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJcHhvcgl4bW04LHhtbTUKKworJEwkb2NiX2RlY19kb25lOgorCXB4b3IJeG1tMTUseG1tMAorCW1vdmRxdQlYTU1XT1JEW3JicF0seG1tOAorCW1vdmRxdQlYTU1XT1JEW3I5XSx4bW0xNQorCisJeG9ycHMJeG1tMCx4bW0wCisJcHhvcgl4bW0xLHhtbTEKKwlweG9yCXhtbTIseG1tMgorCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorCW1vdmFwcwl4bW02LFhNTVdPUkRbcnNwXQorCW1vdmFwcwlYTU1XT1JEW3JzcF0seG1tMAorCW1vdmFwcwl4bW03LFhNTVdPUkRbMTYrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzE2K3JzcF0seG1tMAorCW1vdmFwcwl4bW04LFhNTVdPUkRbMzIrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzMyK3JzcF0seG1tMAorCW1vdmFwcwl4bW05LFhNTVdPUkRbNDgrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzQ4K3JzcF0seG1tMAorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWzY0K3JzcF0KKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTAKKwltb3ZhcHMJeG1tMTEsWE1NV09SRFs4MCtyc3BdCisJbW92YXBzCVhNTVdPUkRbODArcnNwXSx4bW0wCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbOTYrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzk2K3JzcF0seG1tMAorCW1vdmFwcwl4bW0xMyxYTU1XT1JEWzExMityc3BdCisJbW92YXBzCVhNTVdPUkRbMTEyK3JzcF0seG1tMAorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWzEyOCtyc3BdCisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMAorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzE0NCtyc3BdCisJbW92YXBzCVhNTVdPUkRbMTQ0K3JzcF0seG1tMAorCWxlYQlyYXgsWygoMTYwKzQwKSkrcnNwXQorJEwkb2NiX2RlY19wb3A6CisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JheF0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyYXhdCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcmF4XQorCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JheF0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JheF0KKworCWxlYQlyc3AsW3JheF0KKworJEwkb2NiX2RlY19lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9hZXNfaHdfb2NiX2RlY3J5cHQ6CisKKworQUxJR04JMzIKK19fb2NiX2RlY3J5cHQ2OgorCXB4b3IJeG1tMTUseG1tOQorCW1vdmRxdQl4bW0xMSxYTU1XT1JEW3IxMioxK3JieF0KKwltb3ZkcWEJeG1tMTIseG1tMTAKKwltb3ZkcXUJeG1tMTMsWE1NV09SRFtyMTMqMStyYnhdCisJbW92ZHFhCXhtbTE0LHhtbTEwCisJcHhvcgl4bW0xMCx4bW0xNQorCW1vdmRxdQl4bW0xNSxYTU1XT1JEW3IxNCoxK3JieF0KKwlweG9yCXhtbTExLHhtbTEwCisJcHhvcgl4bW0yLHhtbTEwCisJcHhvcgl4bW0xMix4bW0xMQorCXB4b3IJeG1tMyx4bW0xMQorCXB4b3IJeG1tMTMseG1tMTIKKwlweG9yCXhtbTQseG1tMTIKKwlweG9yCXhtbTE0LHhtbTEzCisJcHhvcgl4bW01LHhtbTEzCisJcHhvcgl4bW0xNSx4bW0xNAorCXB4b3IJeG1tNix4bW0xNAorCXB4b3IJeG1tNyx4bW0xNQorCW1vdnVwcwl4bW0wLFhNTVdPUkRbMzIrcjExXQorCisJbGVhCXIxMixbMStyOF0KKwlsZWEJcjEzLFszK3I4XQorCWxlYQlyMTQsWzUrcjhdCisJYWRkCXI4LDYKKwlweG9yCXhtbTEwLHhtbTkKKwlic2YJcjEyLHIxMgorCWJzZglyMTMscjEzCisJYnNmCXIxNCxyMTQKKworREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKKwlweG9yCXhtbTExLHhtbTkKKwlweG9yCXhtbTEyLHhtbTkKK0RCCTEwMiwxNSw1NiwyMjIsMjQxCisJcHhvcgl4bW0xMyx4bW05CisJcHhvcgl4bW0xNCx4bW05CitEQgkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbNDgrcjExXQorCXB4b3IJeG1tMTUseG1tOQorCitEQgkxMDIsMTUsNTYsMjIyLDIwOAorREIJMTAyLDE1LDU2LDIyMiwyMTYKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorREIJMTAyLDE1LDU2LDIyMiwyNDAKK0RCCTEwMiwxNSw1NiwyMjIsMjQ4CisJbW92dXBzCXhtbTAsWE1NV09SRFs2NCtyMTFdCisJc2hsCXIxMiw0CisJc2hsCXIxMyw0CisJam1wCU5FQVIgJEwkb2NiX2RlY19sb29wNgorCitBTElHTgkzMgorJEwkb2NiX2RlY19sb29wNjoKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworREIJMTAyLDE1LDU2LDIyMiwyMjUKK0RCCTEwMiwxNSw1NiwyMjIsMjMzCitEQgkxMDIsMTUsNTYsMjIyLDI0MQorREIJMTAyLDE1LDU2LDIyMiwyNDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCisKK0RCCTEwMiwxNSw1NiwyMjIsMjA4CitEQgkxMDIsMTUsNTYsMjIyLDIxNgorREIJMTAyLDE1LDU2LDIyMiwyMjQKK0RCCTEwMiwxNSw1NiwyMjIsMjMyCitEQgkxMDIsMTUsNTYsMjIyLDI0MAorREIJMTAyLDE1LDU2LDIyMiwyNDgKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoLTE2KSkrcmF4KjErcmN4XQorCWpueglORUFSICRMJG9jYl9kZWNfbG9vcDYKKworREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKK0RCCTEwMiwxNSw1NiwyMjIsMjQxCitEQgkxMDIsMTUsNTYsMjIyLDI0OQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcjExXQorCXNobAlyMTQsNAorCitEQgkxMDIsNjUsMTUsNTYsMjIzLDIxMAorCW1vdmRxdQl4bW0xMCxYTU1XT1JEW3JieF0KKwltb3YJcmF4LHIxMAorREIJMTAyLDY1LDE1LDU2LDIyMywyMTkKK0RCCTEwMiw2NSwxNSw1NiwyMjMsMjI4CitEQgkxMDIsNjUsMTUsNTYsMjIzLDIzNworREIJMTAyLDY1LDE1LDU2LDIyMywyNDYKK0RCCTEwMiw2NSwxNSw1NiwyMjMsMjU1CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCitBTElHTgkzMgorX19vY2JfZGVjcnlwdDQ6CisJcHhvcgl4bW0xNSx4bW05CisJbW92ZHF1CXhtbTExLFhNTVdPUkRbcjEyKjErcmJ4XQorCW1vdmRxYQl4bW0xMix4bW0xMAorCW1vdmRxdQl4bW0xMyxYTU1XT1JEW3IxMyoxK3JieF0KKwlweG9yCXhtbTEwLHhtbTE1CisJcHhvcgl4bW0xMSx4bW0xMAorCXB4b3IJeG1tMix4bW0xMAorCXB4b3IJeG1tMTIseG1tMTEKKwlweG9yCXhtbTMseG1tMTEKKwlweG9yCXhtbTEzLHhtbTEyCisJcHhvcgl4bW00LHhtbTEyCisJcHhvcgl4bW01LHhtbTEzCisJbW92dXBzCXhtbTAsWE1NV09SRFszMityMTFdCisKKwlweG9yCXhtbTEwLHhtbTkKKwlweG9yCXhtbTExLHhtbTkKKwlweG9yCXhtbTEyLHhtbTkKKwlweG9yCXhtbTEzLHhtbTkKKworREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWzQ4K3IxMV0KKworREIJMTAyLDE1LDU2LDIyMiwyMDgKK0RCCTEwMiwxNSw1NiwyMjIsMjE2CitEQgkxMDIsMTUsNTYsMjIyLDIyNAorREIJMTAyLDE1LDU2LDIyMiwyMzIKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzY0K3IxMV0KKwlqbXAJTkVBUiAkTCRvY2JfZGVjX2xvb3A0CisKK0FMSUdOCTMyCiskTCRvY2JfZGVjX2xvb3A0OgorREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCisKK0RCCTEwMiwxNSw1NiwyMjIsMjA4CitEQgkxMDIsMTUsNTYsMjIyLDIxNgorREIJMTAyLDE1LDU2LDIyMiwyMjQKK0RCCTEwMiwxNSw1NiwyMjIsMjMyCisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC0xNikpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCRvY2JfZGVjX2xvb3A0CisKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworREIJMTAyLDE1LDU2LDIyMiwyMjUKK0RCCTEwMiwxNSw1NiwyMjIsMjMzCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityMTFdCisJbW92CXJheCxyMTAKKworREIJMTAyLDY1LDE1LDU2LDIyMywyMTAKK0RCCTEwMiw2NSwxNSw1NiwyMjMsMjE5CitEQgkxMDIsNjUsMTUsNTYsMjIzLDIyOAorREIJMTAyLDY1LDE1LDU2LDIyMywyMzcKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKK0FMSUdOCTMyCitfX29jYl9kZWNyeXB0MToKKwlweG9yCXhtbTcseG1tMTUKKwlweG9yCXhtbTcseG1tOQorCXB4b3IJeG1tMix4bW03CisJbW92dXBzCXhtbTAsWE1NV09SRFszMityMTFdCisKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CisJbW92dXBzCXhtbTEsWE1NV09SRFs0OCtyMTFdCisJcHhvcgl4bW03LHhtbTkKKworREIJMTAyLDE1LDU2LDIyMiwyMDgKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWzY0K3IxMV0KKwlqbXAJTkVBUiAkTCRvY2JfZGVjX2xvb3AxCisKK0FMSUdOCTMyCiskTCRvY2JfZGVjX2xvb3AxOgorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JheCoxK3JjeF0KKwlhZGQJcmF4LDMyCisKK0RCCTEwMiwxNSw1NiwyMjIsMjA4CisJbW92dXBzCXhtbTAsWE1NV09SRFsoKC0xNikpK3JheCoxK3JjeF0KKwlqbnoJTkVBUiAkTCRvY2JfZGVjX2xvb3AxCisKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityMTFdCisJbW92CXJheCxyMTAKKworREIJMTAyLDE1LDU2LDIyMywyMTUKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworZ2xvYmFsCWFlc19od19jYmNfZW5jcnlwdAorCitBTElHTgkxNgorYWVzX2h3X2NiY19lbmNyeXB0OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYWVzX2h3X2NiY19lbmNyeXB0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisKKwl0ZXN0CXJkeCxyZHgKKwlqeglORUFSICRMJGNiY19yZXQKKworCW1vdglyMTBkLERXT1JEWzI0MCtyY3hdCisJbW92CXIxMSxyY3gKKwl0ZXN0CXI5ZCxyOWQKKwlqeglORUFSICRMJGNiY19kZWNyeXB0CisKKwltb3Z1cHMJeG1tMixYTU1XT1JEW3I4XQorCW1vdgllYXgscjEwZAorCWNtcAlyZHgsMTYKKwlqYglORUFSICRMJGNiY19lbmNfdGFpbAorCXN1YglyZHgsMTYKKwlqbXAJTkVBUiAkTCRjYmNfZW5jX2xvb3AKK0FMSUdOCTE2CiskTCRjYmNfZW5jX2xvb3A6CisJbW92dXBzCXhtbTMsWE1NV09SRFtyZGldCisJbGVhCXJkaSxbMTYrcmRpXQorCisJbW92dXBzCXhtbTAsWE1NV09SRFtyY3hdCisJbW92dXBzCXhtbTEsWE1NV09SRFsxNityY3hdCisJeG9ycHMJeG1tMyx4bW0wCisJbGVhCXJjeCxbMzIrcmN4XQorCXhvcnBzCXhtbTIseG1tMworJEwkb29wX2VuYzFfMTU6CitEQgkxMDIsMTUsNTYsMjIwLDIwOQorCWRlYwllYXgKKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JjeF0KKwlsZWEJcmN4LFsxNityY3hdCisJam56CU5FQVIgJEwkb29wX2VuYzFfMTUKK0RCCTEwMiwxNSw1NiwyMjEsMjA5CisJbW92CWVheCxyMTBkCisJbW92CXJjeCxyMTEKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlsZWEJcnNpLFsxNityc2ldCisJc3ViCXJkeCwxNgorCWpuYwlORUFSICRMJGNiY19lbmNfbG9vcAorCWFkZAlyZHgsMTYKKwlqbnoJTkVBUiAkTCRjYmNfZW5jX3RhaWwKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJbW92dXBzCVhNTVdPUkRbcjhdLHhtbTIKKwlweG9yCXhtbTIseG1tMgorCXB4b3IJeG1tMyx4bW0zCisJam1wCU5FQVIgJEwkY2JjX3JldAorCiskTCRjYmNfZW5jX3RhaWw6CisJbW92CXJjeCxyZHgKKwl4Y2hnCXJzaSxyZGkKKwlERAkweDkwNjZBNEYzCisJbW92CWVjeCwxNgorCXN1YglyY3gscmR4CisJeG9yCWVheCxlYXgKKwlERAkweDkwNjZBQUYzCisJbGVhCXJkaSxbKCgtMTYpKStyZGldCisJbW92CWVheCxyMTBkCisJbW92CXJzaSxyZGkKKwltb3YJcmN4LHIxMQorCXhvcglyZHgscmR4CisJam1wCU5FQVIgJEwkY2JjX2VuY19sb29wCisKK0FMSUdOCTE2CiskTCRjYmNfZGVjcnlwdDoKKwljbXAJcmR4LDE2CisJam5lCU5FQVIgJEwkY2JjX2RlY3J5cHRfYnVsaworCisKKworCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmRpXQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbcjhdCisJbW92ZHFhCXhtbTQseG1tMgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmN4XQorCWxlYQlyY3gsWzMyK3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKyRMJG9vcF9kZWMxXzE2OgorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJcjEwZAorCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmN4XQorCWxlYQlyY3gsWzE2K3JjeF0KKwlqbnoJTkVBUiAkTCRvb3BfZGVjMV8xNgorREIJMTAyLDE1LDU2LDIyMywyMDkKKwlweG9yCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJbW92ZHF1CVhNTVdPUkRbcjhdLHhtbTQKKwl4b3Jwcwl4bW0yLHhtbTMKKwlweG9yCXhtbTMseG1tMworCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tMgorCXB4b3IJeG1tMix4bW0yCisJam1wCU5FQVIgJEwkY2JjX3JldAorQUxJR04JMTYKKyRMJGNiY19kZWNyeXB0X2J1bGs6CisJbGVhCXIxMSxbcnNwXQorCisJcHVzaAlyYnAKKworCXN1Yglyc3AsMTc2CisJYW5kCXJzcCwtMTYKKwltb3ZhcHMJWE1NV09SRFsxNityc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFszMityc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFs0OCtyc3BdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTkKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTEwCisJbW92YXBzCVhNTVdPUkRbOTYrcnNwXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWzExMityc3BdLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMTMKKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWzE2MCtyc3BdLHhtbTE1CiskTCRjYmNfZGVjcnlwdF9ib2R5OgorCW1vdglyYnAscmN4CisJbW92dXBzCXhtbTEwLFhNTVdPUkRbcjhdCisJbW92CWVheCxyMTBkCisJY21wCXJkeCwweDUwCisJamJlCU5FQVIgJEwkY2JjX2RlY190YWlsCisKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3JjeF0KKwltb3ZkcXUJeG1tMixYTU1XT1JEW3JkaV0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwltb3ZkcWEJeG1tMTEseG1tMgorCW1vdmRxdQl4bW00LFhNTVdPUkRbMzIrcmRpXQorCW1vdmRxYQl4bW0xMix4bW0zCisJbW92ZHF1CXhtbTUsWE1NV09SRFs0OCtyZGldCisJbW92ZHFhCXhtbTEzLHhtbTQKKwltb3ZkcXUJeG1tNixYTU1XT1JEWzY0K3JkaV0KKwltb3ZkcWEJeG1tMTQseG1tNQorCW1vdmRxdQl4bW03LFhNTVdPUkRbODArcmRpXQorCW1vdmRxYQl4bW0xNSx4bW02CisJbGVhCXI5LFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJcjlkLERXT1JEWzQrcjldCisJY21wCXJkeCwweDcwCisJamJlCU5FQVIgJEwkY2JjX2RlY19zaXhfb3Jfc2V2ZW4KKworCWFuZAlyOWQsNzEzMDMxNjgKKwlzdWIJcmR4LDB4NTAKKwljbXAJcjlkLDQxOTQzMDQKKwlqZQlORUFSICRMJGNiY19kZWNfbG9vcDZfZW50ZXIKKwlzdWIJcmR4LDB4MjAKKwlsZWEJcmN4LFsxMTIrcmN4XQorCWptcAlORUFSICRMJGNiY19kZWNfbG9vcDhfZW50ZXIKK0FMSUdOCTE2CiskTCRjYmNfZGVjX2xvb3A4OgorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tOQorCWxlYQlyc2ksWzE2K3JzaV0KKyRMJGNiY19kZWNfbG9vcDhfZW50ZXI6CisJbW92ZHF1CXhtbTgsWE1NV09SRFs5NityZGldCisJcHhvcgl4bW0yLHhtbTAKKwltb3ZkcXUJeG1tOSxYTU1XT1JEWzExMityZGldCisJcHhvcgl4bW0zLHhtbTAKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoMTYtMTEyKSkrcmN4XQorCXB4b3IJeG1tNCx4bW0wCisJbW92CXJicCwtMQorCWNtcAlyZHgsMHg3MAorCXB4b3IJeG1tNSx4bW0wCisJcHhvcgl4bW02LHhtbTAKKwlweG9yCXhtbTcseG1tMAorCXB4b3IJeG1tOCx4bW0wCisKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CisJcHhvcgl4bW05LHhtbTAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoMzItMTEyKSkrcmN4XQorREIJMTAyLDE1LDU2LDIyMiwyMTcKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworREIJMTAyLDE1LDU2LDIyMiwyNDEKK0RCCTEwMiwxNSw1NiwyMjIsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MworCWFkYwlyYnAsMAorCWFuZAlyYnAsMTI4CitEQgkxMDIsNjgsMTUsNTYsMjIyLDIwMQorCWFkZAlyYnAscmRpCisJbW92dXBzCXhtbTEsWE1NV09SRFsoKDQ4LTExMikpK3JjeF0KK0RCCTEwMiwxNSw1NiwyMjIsMjA4CitEQgkxMDIsMTUsNTYsMjIyLDIxNgorREIJMTAyLDE1LDU2LDIyMiwyMjQKK0RCCTEwMiwxNSw1NiwyMjIsMjMyCitEQgkxMDIsMTUsNTYsMjIyLDI0MAorREIJMTAyLDE1LDU2LDIyMiwyNDgKK0RCCTEwMiw2OCwxNSw1NiwyMjIsMTkyCitEQgkxMDIsNjgsMTUsNTYsMjIyLDIwMAorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCg2NC0xMTIpKStyY3hdCisJbm9wCitEQgkxMDIsMTUsNTYsMjIyLDIwOQorREIJMTAyLDE1LDU2LDIyMiwyMTcKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworREIJMTAyLDE1LDU2LDIyMiwyNDEKK0RCCTEwMiwxNSw1NiwyMjIsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoODAtMTEyKSkrcmN4XQorCW5vcAorREIJMTAyLDE1LDU2LDIyMiwyMDgKK0RCCTEwMiwxNSw1NiwyMjIsMjE2CitEQgkxMDIsMTUsNTYsMjIyLDIyNAorREIJMTAyLDE1LDU2LDIyMiwyMzIKK0RCCTEwMiwxNSw1NiwyMjIsMjQwCitEQgkxMDIsMTUsNTYsMjIyLDI0OAorREIJMTAyLDY4LDE1LDU2LDIyMiwxOTIKK0RCCTEwMiw2OCwxNSw1NiwyMjIsMjAwCisJbW92dXBzCXhtbTAsWE1NV09SRFsoKDk2LTExMikpK3JjeF0KKwlub3AKK0RCCTEwMiwxNSw1NiwyMjIsMjA5CitEQgkxMDIsMTUsNTYsMjIyLDIxNworREIJMTAyLDE1LDU2LDIyMiwyMjUKK0RCCTEwMiwxNSw1NiwyMjIsMjMzCitEQgkxMDIsMTUsNTYsMjIyLDI0MQorREIJMTAyLDE1LDU2LDIyMiwyNDkKK0RCCTEwMiw2OCwxNSw1NiwyMjIsMTkzCitEQgkxMDIsNjgsMTUsNTYsMjIyLDIwMQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbKCgxMTItMTEyKSkrcmN4XQorCW5vcAorREIJMTAyLDE1LDU2LDIyMiwyMDgKK0RCCTEwMiwxNSw1NiwyMjIsMjE2CitEQgkxMDIsMTUsNTYsMjIyLDIyNAorREIJMTAyLDE1LDU2LDIyMiwyMzIKK0RCCTEwMiwxNSw1NiwyMjIsMjQwCitEQgkxMDIsMTUsNTYsMjIyLDI0OAorREIJMTAyLDY4LDE1LDU2LDIyMiwxOTIKK0RCCTEwMiw2OCwxNSw1NiwyMjIsMjAwCisJbW92dXBzCXhtbTAsWE1NV09SRFsoKDEyOC0xMTIpKStyY3hdCisJbm9wCitEQgkxMDIsMTUsNTYsMjIyLDIwOQorREIJMTAyLDE1LDU2LDIyMiwyMTcKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworREIJMTAyLDE1LDU2LDIyMiwyNDEKK0RCCTEwMiwxNSw1NiwyMjIsMjQ5CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwltb3Z1cHMJeG1tMSxYTU1XT1JEWygoMTQ0LTExMikpK3JjeF0KKwljbXAJZWF4LDExCitEQgkxMDIsMTUsNTYsMjIyLDIwOAorREIJMTAyLDE1LDU2LDIyMiwyMTYKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorREIJMTAyLDE1LDU2LDIyMiwyNDAKK0RCCTEwMiwxNSw1NiwyMjIsMjQ4CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MgorREIJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoMTYwLTExMikpK3JjeF0KKwlqYglORUFSICRMJGNiY19kZWNfZG9uZQorREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKK0RCCTEwMiwxNSw1NiwyMjIsMjQxCitEQgkxMDIsMTUsNTYsMjIyLDI0OQorREIJMTAyLDY4LDE1LDU2LDIyMiwxOTMKK0RCCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisJbW92dXBzCXhtbTEsWE1NV09SRFsoKDE3Ni0xMTIpKStyY3hdCisJbm9wCitEQgkxMDIsMTUsNTYsMjIyLDIwOAorREIJMTAyLDE1LDU2LDIyMiwyMTYKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorREIJMTAyLDE1LDU2LDIyMiwyNDAKK0RCCTEwMiwxNSw1NiwyMjIsMjQ4CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MgorREIJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoMTkyLTExMikpK3JjeF0KKwlqZQlORUFSICRMJGNiY19kZWNfZG9uZQorREIJMTAyLDE1LDU2LDIyMiwyMDkKK0RCCTEwMiwxNSw1NiwyMjIsMjE3CitEQgkxMDIsMTUsNTYsMjIyLDIyNQorREIJMTAyLDE1LDU2LDIyMiwyMzMKK0RCCTEwMiwxNSw1NiwyMjIsMjQxCitEQgkxMDIsMTUsNTYsMjIyLDI0OQorREIJMTAyLDY4LDE1LDU2LDIyMiwxOTMKK0RCCTEwMiw2OCwxNSw1NiwyMjIsMjAxCisJbW92dXBzCXhtbTEsWE1NV09SRFsoKDIwOC0xMTIpKStyY3hdCisJbm9wCitEQgkxMDIsMTUsNTYsMjIyLDIwOAorREIJMTAyLDE1LDU2LDIyMiwyMTYKK0RCCTEwMiwxNSw1NiwyMjIsMjI0CitEQgkxMDIsMTUsNTYsMjIyLDIzMgorREIJMTAyLDE1LDU2LDIyMiwyNDAKK0RCCTEwMiwxNSw1NiwyMjIsMjQ4CitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MgorREIJMTAyLDY4LDE1LDU2LDIyMiwyMDAKKwltb3Z1cHMJeG1tMCxYTU1XT1JEWygoMjI0LTExMikpK3JjeF0KKwlqbXAJTkVBUiAkTCRjYmNfZGVjX2RvbmUKK0FMSUdOCTE2CiskTCRjYmNfZGVjX2RvbmU6CitEQgkxMDIsMTUsNTYsMjIyLDIwOQorREIJMTAyLDE1LDU2LDIyMiwyMTcKKwlweG9yCXhtbTEwLHhtbTAKKwlweG9yCXhtbTExLHhtbTAKK0RCCTEwMiwxNSw1NiwyMjIsMjI1CitEQgkxMDIsMTUsNTYsMjIyLDIzMworCXB4b3IJeG1tMTIseG1tMAorCXB4b3IJeG1tMTMseG1tMAorREIJMTAyLDE1LDU2LDIyMiwyNDEKK0RCCTEwMiwxNSw1NiwyMjIsMjQ5CisJcHhvcgl4bW0xNCx4bW0wCisJcHhvcgl4bW0xNSx4bW0wCitEQgkxMDIsNjgsMTUsNTYsMjIyLDE5MworREIJMTAyLDY4LDE1LDU2LDIyMiwyMDEKKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzgwK3JkaV0KKworREIJMTAyLDY1LDE1LDU2LDIyMywyMTAKKwltb3ZkcXUJeG1tMTAsWE1NV09SRFs5NityZGldCisJcHhvcgl4bW0xLHhtbTAKK0RCCTEwMiw2NSwxNSw1NiwyMjMsMjE5CisJcHhvcgl4bW0xMCx4bW0wCisJbW92ZHF1CXhtbTAsWE1NV09SRFsxMTIrcmRpXQorREIJMTAyLDY1LDE1LDU2LDIyMywyMjgKKwlsZWEJcmRpLFsxMjgrcmRpXQorCW1vdmRxdQl4bW0xMSxYTU1XT1JEW3JicF0KK0RCCTEwMiw2NSwxNSw1NiwyMjMsMjM3CitEQgkxMDIsNjUsMTUsNTYsMjIzLDI0NgorCW1vdmRxdQl4bW0xMixYTU1XT1JEWzE2K3JicF0KKwltb3ZkcXUJeG1tMTMsWE1NV09SRFszMityYnBdCitEQgkxMDIsNjUsMTUsNTYsMjIzLDI1NQorREIJMTAyLDY4LDE1LDU2LDIyMywxOTMKKwltb3ZkcXUJeG1tMTQsWE1NV09SRFs0OCtyYnBdCisJbW92ZHF1CXhtbTE1LFhNTVdPUkRbNjQrcmJwXQorREIJMTAyLDY5LDE1LDU2LDIyMywyMDIKKwltb3ZkcWEJeG1tMTAseG1tMAorCW1vdmRxdQl4bW0xLFhNTVdPUkRbODArcmJwXQorCW1vdnVwcwl4bW0wLFhNTVdPUkRbKCgtMTEyKSkrcmN4XQorCisJbW92dXBzCVhNTVdPUkRbcnNpXSx4bW0yCisJbW92ZHFhCXhtbTIseG1tMTEKKwltb3Z1cHMJWE1NV09SRFsxNityc2ldLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW0xMgorCW1vdnVwcwlYTU1XT1JEWzMyK3JzaV0seG1tNAorCW1vdmRxYQl4bW00LHhtbTEzCisJbW92dXBzCVhNTVdPUkRbNDgrcnNpXSx4bW01CisJbW92ZHFhCXhtbTUseG1tMTQKKwltb3Z1cHMJWE1NV09SRFs2NCtyc2ldLHhtbTYKKwltb3ZkcWEJeG1tNix4bW0xNQorCW1vdnVwcwlYTU1XT1JEWzgwK3JzaV0seG1tNworCW1vdmRxYQl4bW03LHhtbTEKKwltb3Z1cHMJWE1NV09SRFs5Nityc2ldLHhtbTgKKwlsZWEJcnNpLFsxMTIrcnNpXQorCisJc3ViCXJkeCwweDgwCisJamEJTkVBUiAkTCRjYmNfZGVjX2xvb3A4CisKKwltb3ZhcHMJeG1tMix4bW05CisJbGVhCXJjeCxbKCgtMTEyKSkrcmN4XQorCWFkZAlyZHgsMHg3MAorCWpsZQlORUFSICRMJGNiY19kZWNfY2xlYXJfdGFpbF9jb2xsZWN0ZWQKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTkKKwlsZWEJcnNpLFsxNityc2ldCisJY21wCXJkeCwweDUwCisJamJlCU5FQVIgJEwkY2JjX2RlY190YWlsCisKKwltb3ZhcHMJeG1tMix4bW0xMQorJEwkY2JjX2RlY19zaXhfb3Jfc2V2ZW46CisJY21wCXJkeCwweDYwCisJamEJTkVBUiAkTCRjYmNfZGVjX3NldmVuCisKKwltb3ZhcHMJeG1tOCx4bW03CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwlweG9yCXhtbTIseG1tMTAKKwltb3ZhcHMJeG1tMTAseG1tOAorCXB4b3IJeG1tMyx4bW0xMQorCW1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMgorCXB4b3IJeG1tNCx4bW0xMgorCW1vdmRxdQlYTU1XT1JEWzE2K3JzaV0seG1tMworCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW01LHhtbTEzCisJbW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW00CisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTYseG1tMTQKKwltb3ZkcXUJWE1NV09SRFs0OCtyc2ldLHhtbTUKKwlweG9yCXhtbTUseG1tNQorCXB4b3IJeG1tNyx4bW0xNQorCW1vdmRxdQlYTU1XT1JEWzY0K3JzaV0seG1tNgorCXB4b3IJeG1tNix4bW02CisJbGVhCXJzaSxbODArcnNpXQorCW1vdmRxYQl4bW0yLHhtbTcKKwlweG9yCXhtbTcseG1tNworCWptcAlORUFSICRMJGNiY19kZWNfdGFpbF9jb2xsZWN0ZWQKKworQUxJR04JMTYKKyRMJGNiY19kZWNfc2V2ZW46CisJbW92dXBzCXhtbTgsWE1NV09SRFs5NityZGldCisJeG9ycHMJeG1tOSx4bW05CisJY2FsbAlfYWVzbmlfZGVjcnlwdDgKKwltb3Z1cHMJeG1tOSxYTU1XT1JEWzgwK3JkaV0KKwlweG9yCXhtbTIseG1tMTAKKwltb3Z1cHMJeG1tMTAsWE1NV09SRFs5NityZGldCisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW00LHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTUseG1tMTMKKwltb3ZkcXUJWE1NV09SRFszMityc2ldLHhtbTQKKwlweG9yCXhtbTQseG1tNAorCXB4b3IJeG1tNix4bW0xNAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JzaV0seG1tNQorCXB4b3IJeG1tNSx4bW01CisJcHhvcgl4bW03LHhtbTE1CisJbW92ZHF1CVhNTVdPUkRbNjQrcnNpXSx4bW02CisJcHhvcgl4bW02LHhtbTYKKwlweG9yCXhtbTgseG1tOQorCW1vdmRxdQlYTU1XT1JEWzgwK3JzaV0seG1tNworCXB4b3IJeG1tNyx4bW03CisJbGVhCXJzaSxbOTYrcnNpXQorCW1vdmRxYQl4bW0yLHhtbTgKKwlweG9yCXhtbTgseG1tOAorCXB4b3IJeG1tOSx4bW05CisJam1wCU5FQVIgJEwkY2JjX2RlY190YWlsX2NvbGxlY3RlZAorCitBTElHTgkxNgorJEwkY2JjX2RlY19sb29wNjoKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTcKKwlsZWEJcnNpLFsxNityc2ldCisJbW92ZHF1CXhtbTIsWE1NV09SRFtyZGldCisJbW92ZHF1CXhtbTMsWE1NV09SRFsxNityZGldCisJbW92ZHFhCXhtbTExLHhtbTIKKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwltb3ZkcWEJeG1tMTIseG1tMworCW1vdmRxdQl4bW01LFhNTVdPUkRbNDgrcmRpXQorCW1vdmRxYQl4bW0xMyx4bW00CisJbW92ZHF1CXhtbTYsWE1NV09SRFs2NCtyZGldCisJbW92ZHFhCXhtbTE0LHhtbTUKKwltb3ZkcXUJeG1tNyxYTU1XT1JEWzgwK3JkaV0KKwltb3ZkcWEJeG1tMTUseG1tNgorJEwkY2JjX2RlY19sb29wNl9lbnRlcjoKKwlsZWEJcmRpLFs5NityZGldCisJbW92ZHFhCXhtbTgseG1tNworCisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKworCXB4b3IJeG1tMix4bW0xMAorCW1vdmRxYQl4bW0xMCx4bW04CisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW00LHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJcHhvcgl4bW01LHhtbTEzCisJbW92ZHF1CVhNTVdPUkRbMzIrcnNpXSx4bW00CisJcHhvcgl4bW02LHhtbTE0CisJbW92CXJjeCxyYnAKKwltb3ZkcXUJWE1NV09SRFs0OCtyc2ldLHhtbTUKKwlweG9yCXhtbTcseG1tMTUKKwltb3YJZWF4LHIxMGQKKwltb3ZkcXUJWE1NV09SRFs2NCtyc2ldLHhtbTYKKwlsZWEJcnNpLFs4MCtyc2ldCisJc3ViCXJkeCwweDYwCisJamEJTkVBUiAkTCRjYmNfZGVjX2xvb3A2CisKKwltb3ZkcWEJeG1tMix4bW03CisJYWRkCXJkeCwweDUwCisJamxlCU5FQVIgJEwkY2JjX2RlY19jbGVhcl90YWlsX2NvbGxlY3RlZAorCW1vdnVwcwlYTU1XT1JEW3JzaV0seG1tNworCWxlYQlyc2ksWzE2K3JzaV0KKworJEwkY2JjX2RlY190YWlsOgorCW1vdnVwcwl4bW0yLFhNTVdPUkRbcmRpXQorCXN1YglyZHgsMHgxMAorCWpiZQlORUFSICRMJGNiY19kZWNfb25lCisKKwltb3Z1cHMJeG1tMyxYTU1XT1JEWzE2K3JkaV0KKwltb3ZhcHMJeG1tMTEseG1tMgorCXN1YglyZHgsMHgxMAorCWpiZQlORUFSICRMJGNiY19kZWNfdHdvCisKKwltb3Z1cHMJeG1tNCxYTU1XT1JEWzMyK3JkaV0KKwltb3ZhcHMJeG1tMTIseG1tMworCXN1YglyZHgsMHgxMAorCWpiZQlORUFSICRMJGNiY19kZWNfdGhyZWUKKworCW1vdnVwcwl4bW01LFhNTVdPUkRbNDgrcmRpXQorCW1vdmFwcwl4bW0xMyx4bW00CisJc3ViCXJkeCwweDEwCisJamJlCU5FQVIgJEwkY2JjX2RlY19mb3VyCisKKwltb3Z1cHMJeG1tNixYTU1XT1JEWzY0K3JkaV0KKwltb3ZhcHMJeG1tMTQseG1tNQorCW1vdmFwcwl4bW0xNSx4bW02CisJeG9ycHMJeG1tNyx4bW03CisJY2FsbAlfYWVzbmlfZGVjcnlwdDYKKwlweG9yCXhtbTIseG1tMTAKKwltb3ZhcHMJeG1tMTAseG1tMTUKKwlweG9yCXhtbTMseG1tMTEKKwltb3ZkcXUJWE1NV09SRFtyc2ldLHhtbTIKKwlweG9yCXhtbTQseG1tMTIKKwltb3ZkcXUJWE1NV09SRFsxNityc2ldLHhtbTMKKwlweG9yCXhtbTMseG1tMworCXB4b3IJeG1tNSx4bW0xMworCW1vdmRxdQlYTU1XT1JEWzMyK3JzaV0seG1tNAorCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW02LHhtbTE0CisJbW92ZHF1CVhNTVdPUkRbNDgrcnNpXSx4bW01CisJcHhvcgl4bW01LHhtbTUKKwlsZWEJcnNpLFs2NCtyc2ldCisJbW92ZHFhCXhtbTIseG1tNgorCXB4b3IJeG1tNix4bW02CisJcHhvcgl4bW03LHhtbTcKKwlzdWIJcmR4LDB4MTAKKwlqbXAJTkVBUiAkTCRjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisKK0FMSUdOCTE2CiskTCRjYmNfZGVjX29uZToKKwltb3ZhcHMJeG1tMTEseG1tMgorCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbMTYrcmN4XQorCWxlYQlyY3gsWzMyK3JjeF0KKwl4b3Jwcwl4bW0yLHhtbTAKKyRMJG9vcF9kZWMxXzE3OgorREIJMTAyLDE1LDU2LDIyMiwyMDkKKwlkZWMJZWF4CisJbW92dXBzCXhtbTEsWE1NV09SRFtyY3hdCisJbGVhCXJjeCxbMTYrcmN4XQorCWpueglORUFSICRMJG9vcF9kZWMxXzE3CitEQgkxMDIsMTUsNTYsMjIzLDIwOQorCXhvcnBzCXhtbTIseG1tMTAKKwltb3ZhcHMJeG1tMTAseG1tMTEKKwlqbXAJTkVBUiAkTCRjYmNfZGVjX3RhaWxfY29sbGVjdGVkCitBTElHTgkxNgorJEwkY2JjX2RlY190d286CisJbW92YXBzCXhtbTEyLHhtbTMKKwljYWxsCV9hZXNuaV9kZWNyeXB0MgorCXB4b3IJeG1tMix4bW0xMAorCW1vdmFwcwl4bW0xMCx4bW0xMgorCXB4b3IJeG1tMyx4bW0xMQorCW1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMgorCW1vdmRxYQl4bW0yLHhtbTMKKwlweG9yCXhtbTMseG1tMworCWxlYQlyc2ksWzE2K3JzaV0KKwlqbXAJTkVBUiAkTCRjYmNfZGVjX3RhaWxfY29sbGVjdGVkCitBTElHTgkxNgorJEwkY2JjX2RlY190aHJlZToKKwltb3ZhcHMJeG1tMTMseG1tNAorCWNhbGwJX2Flc25pX2RlY3J5cHQzCisJcHhvcgl4bW0yLHhtbTEwCisJbW92YXBzCXhtbTEwLHhtbTEzCisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW00LHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJcHhvcgl4bW0zLHhtbTMKKwltb3ZkcWEJeG1tMix4bW00CisJcHhvcgl4bW00LHhtbTQKKwlsZWEJcnNpLFszMityc2ldCisJam1wCU5FQVIgJEwkY2JjX2RlY190YWlsX2NvbGxlY3RlZAorQUxJR04JMTYKKyRMJGNiY19kZWNfZm91cjoKKwltb3ZhcHMJeG1tMTQseG1tNQorCWNhbGwJX2Flc25pX2RlY3J5cHQ0CisJcHhvcgl4bW0yLHhtbTEwCisJbW92YXBzCXhtbTEwLHhtbTE0CisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CVhNTVdPUkRbcnNpXSx4bW0yCisJcHhvcgl4bW00LHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbMTYrcnNpXSx4bW0zCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTUseG1tMTMKKwltb3ZkcXUJWE1NV09SRFszMityc2ldLHhtbTQKKwlweG9yCXhtbTQseG1tNAorCW1vdmRxYQl4bW0yLHhtbTUKKwlweG9yCXhtbTUseG1tNQorCWxlYQlyc2ksWzQ4K3JzaV0KKwlqbXAJTkVBUiAkTCRjYmNfZGVjX3RhaWxfY29sbGVjdGVkCisKK0FMSUdOCTE2CiskTCRjYmNfZGVjX2NsZWFyX3RhaWxfY29sbGVjdGVkOgorCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorJEwkY2JjX2RlY190YWlsX2NvbGxlY3RlZDoKKwltb3Z1cHMJWE1NV09SRFtyOF0seG1tMTAKKwlhbmQJcmR4LDE1CisJam56CU5FQVIgJEwkY2JjX2RlY190YWlsX3BhcnRpYWwKKwltb3Z1cHMJWE1NV09SRFtyc2ldLHhtbTIKKwlweG9yCXhtbTIseG1tMgorCWptcAlORUFSICRMJGNiY19kZWNfcmV0CitBTElHTgkxNgorJEwkY2JjX2RlY190YWlsX3BhcnRpYWw6CisJbW92YXBzCVhNTVdPUkRbcnNwXSx4bW0yCisJcHhvcgl4bW0yLHhtbTIKKwltb3YJcmN4LDE2CisJbW92CXJkaSxyc2kKKwlzdWIJcmN4LHJkeAorCWxlYQlyc2ksW3JzcF0KKwlERAkweDkwNjZBNEYzCisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW0yCisKKyRMJGNiY19kZWNfcmV0OgorCXhvcnBzCXhtbTAseG1tMAorCXB4b3IJeG1tMSx4bW0xCisJbW92YXBzCXhtbTYsWE1NV09SRFsxNityc3BdCisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW0wCisJbW92YXBzCXhtbTcsWE1NV09SRFszMityc3BdCisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW0wCisJbW92YXBzCXhtbTgsWE1NV09SRFs0OCtyc3BdCisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW0wCisJbW92YXBzCXhtbTksWE1NV09SRFs2NCtyc3BdCisJbW92YXBzCVhNTVdPUkRbNjQrcnNwXSx4bW0wCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbODArcnNwXQorCW1vdmFwcwlYTU1XT1JEWzgwK3JzcF0seG1tMAorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzk2K3JzcF0KKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTAKKwltb3ZhcHMJeG1tMTIsWE1NV09SRFsxMTIrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzExMityc3BdLHhtbTAKKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzEyOCtyc3BdLHhtbTAKKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxNDQrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzE0NCtyc3BdLHhtbTAKKwltb3ZhcHMJeG1tMTUsWE1NV09SRFsxNjArcnNwXQorCW1vdmFwcwlYTU1XT1JEWzE2MCtyc3BdLHhtbTAKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyMTFdCisKKwlsZWEJcnNwLFtyMTFdCisKKyRMJGNiY19yZXQ6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYWVzX2h3X2NiY19lbmNyeXB0OgorZ2xvYmFsCWFlc19od19zZXRfZGVjcnlwdF9rZXkKKworQUxJR04JMTYKK2Flc19od19zZXRfZGVjcnlwdF9rZXk6CisKK0RCCTB4NDgsMHg4MywweEVDLDB4MDgKKworCWNhbGwJX19hZXNuaV9zZXRfZW5jcnlwdF9rZXkKKwlzaGwJZWR4LDQKKwl0ZXN0CWVheCxlYXgKKwlqbnoJTkVBUiAkTCRkZWNfa2V5X3JldAorCWxlYQlyY3gsWzE2K3JkeCoxK3I4XQorCisJbW92dXBzCXhtbTAsWE1NV09SRFtyOF0KKwltb3Z1cHMJeG1tMSxYTU1XT1JEW3JjeF0KKwltb3Z1cHMJWE1NV09SRFtyY3hdLHhtbTAKKwltb3Z1cHMJWE1NV09SRFtyOF0seG1tMQorCWxlYQlyOCxbMTYrcjhdCisJbGVhCXJjeCxbKCgtMTYpKStyY3hdCisKKyRMJGRlY19rZXlfaW52ZXJzZToKKwltb3Z1cHMJeG1tMCxYTU1XT1JEW3I4XQorCW1vdnVwcwl4bW0xLFhNTVdPUkRbcmN4XQorREIJMTAyLDE1LDU2LDIxOSwxOTIKK0RCCTEwMiwxNSw1NiwyMTksMjAxCisJbGVhCXI4LFsxNityOF0KKwlsZWEJcmN4LFsoKC0xNikpK3JjeF0KKwltb3Z1cHMJWE1NV09SRFsxNityY3hdLHhtbTAKKwltb3Z1cHMJWE1NV09SRFsoLTE2KStyOF0seG1tMQorCWNtcAlyY3gscjgKKwlqYQlORUFSICRMJGRlY19rZXlfaW52ZXJzZQorCisJbW92dXBzCXhtbTAsWE1NV09SRFtyOF0KK0RCCTEwMiwxNSw1NiwyMTksMTkyCisJcHhvcgl4bW0xLHhtbTEKKwltb3Z1cHMJWE1NV09SRFtyY3hdLHhtbTAKKwlweG9yCXhtbTAseG1tMAorJEwkZGVjX2tleV9yZXQ6CisJYWRkCXJzcCw4CisKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9zZXRfZGVjcnlwdF9rZXk6CisKK2dsb2JhbAlhZXNfaHdfc2V0X2VuY3J5cHRfa2V5CisKK0FMSUdOCTE2CithZXNfaHdfc2V0X2VuY3J5cHRfa2V5OgorX19hZXNuaV9zZXRfZW5jcnlwdF9rZXk6CisKK0RCCTB4NDgsMHg4MywweEVDLDB4MDgKKworCW1vdglyYXgsLTEKKwl0ZXN0CXJjeCxyY3gKKwlqeglORUFSICRMJGVuY19rZXlfcmV0CisJdGVzdAlyOCxyOAorCWp6CU5FQVIgJEwkZW5jX2tleV9yZXQKKworCW1vdnVwcwl4bW0wLFhNTVdPUkRbcmN4XQorCXhvcnBzCXhtbTQseG1tNAorCWxlYQlyMTAsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyMTBkLERXT1JEWzQrcjEwXQorCWFuZAlyMTBkLDI2ODQzNzUwNAorCWxlYQlyYXgsWzE2K3I4XQorCWNtcAllZHgsMjU2CisJamUJTkVBUiAkTCQxNHJvdW5kcworCWNtcAllZHgsMTkyCisJamUJTkVBUiAkTCQxMnJvdW5kcworCWNtcAllZHgsMTI4CisJam5lCU5FQVIgJEwkYmFkX2tleWJpdHMKKworJEwkMTByb3VuZHM6CisJbW92CWVkeCw5CisJY21wCXIxMGQsMjY4NDM1NDU2CisJamUJTkVBUiAkTCQxMHJvdW5kc19hbHQKKworCW1vdnVwcwlYTU1XT1JEW3I4XSx4bW0wCitEQgkxMDIsMTUsNTgsMjIzLDIwMCwxCisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzEyOF9jb2xkCitEQgkxMDIsMTUsNTgsMjIzLDIwMCwyCisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzEyOAorREIJMTAyLDE1LDU4LDIyMywyMDAsNAorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8xMjgKK0RCCTEwMiwxNSw1OCwyMjMsMjAwLDgKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMTI4CitEQgkxMDIsMTUsNTgsMjIzLDIwMCwxNgorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8xMjgKK0RCCTEwMiwxNSw1OCwyMjMsMjAwLDMyCisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzEyOAorREIJMTAyLDE1LDU4LDIyMywyMDAsNjQKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMTI4CitEQgkxMDIsMTUsNTgsMjIzLDIwMCwxMjgKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMTI4CitEQgkxMDIsMTUsNTgsMjIzLDIwMCwyNworCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8xMjgKK0RCCTEwMiwxNSw1OCwyMjMsMjAwLDU0CisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzEyOAorCW1vdnVwcwlYTU1XT1JEW3JheF0seG1tMAorCW1vdglEV09SRFs4MCtyYXhdLGVkeAorCXhvcgllYXgsZWF4CisJam1wCU5FQVIgJEwkZW5jX2tleV9yZXQKKworQUxJR04JMTYKKyRMJDEwcm91bmRzX2FsdDoKKwltb3ZkcWEJeG1tNSxYTU1XT1JEWyRMJGtleV9yb3RhdGVdCisJbW92CXIxMGQsOAorCW1vdmRxYQl4bW00LFhNTVdPUkRbJEwka2V5X3Jjb24xXQorCW1vdmRxYQl4bW0yLHhtbTAKKwltb3ZkcXUJWE1NV09SRFtyOF0seG1tMAorCWptcAlORUFSICRMJG9vcF9rZXkxMjgKKworQUxJR04JMTYKKyRMJG9vcF9rZXkxMjg6CitEQgkxMDIsMTUsNTYsMCwxOTcKK0RCCTEwMiwxNSw1NiwyMjEsMTk2CisJcHNsbGQJeG1tNCwxCisJbGVhCXJheCxbMTYrcmF4XQorCisJbW92ZHFhCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTIseG1tMworCisJcHhvcgl4bW0wLHhtbTIKKwltb3ZkcXUJWE1NV09SRFsoLTE2KStyYXhdLHhtbTAKKwltb3ZkcWEJeG1tMix4bW0wCisKKwlkZWMJcjEwZAorCWpueglORUFSICRMJG9vcF9rZXkxMjgKKworCW1vdmRxYQl4bW00LFhNTVdPUkRbJEwka2V5X3Jjb24xYl0KKworREIJMTAyLDE1LDU2LDAsMTk3CitEQgkxMDIsMTUsNTYsMjIxLDE5NgorCXBzbGxkCXhtbTQsMQorCisJbW92ZHFhCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTMseG1tMgorCXBzbGxkcQl4bW0yLDQKKwlweG9yCXhtbTIseG1tMworCisJcHhvcgl4bW0wLHhtbTIKKwltb3ZkcXUJWE1NV09SRFtyYXhdLHhtbTAKKworCW1vdmRxYQl4bW0yLHhtbTAKK0RCCTEwMiwxNSw1NiwwLDE5NworREIJMTAyLDE1LDU2LDIyMSwxOTYKKworCW1vdmRxYQl4bW0zLHhtbTIKKwlwc2xsZHEJeG1tMiw0CisJcHhvcgl4bW0zLHhtbTIKKwlwc2xsZHEJeG1tMiw0CisJcHhvcgl4bW0zLHhtbTIKKwlwc2xsZHEJeG1tMiw0CisJcHhvcgl4bW0yLHhtbTMKKworCXB4b3IJeG1tMCx4bW0yCisJbW92ZHF1CVhNTVdPUkRbMTYrcmF4XSx4bW0wCisKKwltb3YJRFdPUkRbOTYrcmF4XSxlZHgKKwl4b3IJZWF4LGVheAorCWptcAlORUFSICRMJGVuY19rZXlfcmV0CisKK0FMSUdOCTE2CiskTCQxMnJvdW5kczoKKwltb3ZxCXhtbTIsUVdPUkRbMTYrcmN4XQorCW1vdgllZHgsMTEKKwljbXAJcjEwZCwyNjg0MzU0NTYKKwlqZQlORUFSICRMJDEycm91bmRzX2FsdAorCisJbW92dXBzCVhNTVdPUkRbcjhdLHhtbTAKK0RCCTEwMiwxNSw1OCwyMjMsMjAyLDEKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMTkyYV9jb2xkCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwyCisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzE5MmIKK0RCCTEwMiwxNSw1OCwyMjMsMjAyLDQKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMTkyYQorREIJMTAyLDE1LDU4LDIyMywyMDIsOAorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8xOTJiCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwxNgorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8xOTJhCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwzMgorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8xOTJiCitEQgkxMDIsMTUsNTgsMjIzLDIwMiw2NAorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8xOTJhCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwxMjgKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMTkyYgorCW1vdnVwcwlYTU1XT1JEW3JheF0seG1tMAorCW1vdglEV09SRFs0OCtyYXhdLGVkeAorCXhvcglyYXgscmF4CisJam1wCU5FQVIgJEwkZW5jX2tleV9yZXQKKworQUxJR04JMTYKKyRMJDEycm91bmRzX2FsdDoKKwltb3ZkcWEJeG1tNSxYTU1XT1JEWyRMJGtleV9yb3RhdGUxOTJdCisJbW92ZHFhCXhtbTQsWE1NV09SRFskTCRrZXlfcmNvbjFdCisJbW92CXIxMGQsOAorCW1vdmRxdQlYTU1XT1JEW3I4XSx4bW0wCisJam1wCU5FQVIgJEwkb29wX2tleTE5MgorCitBTElHTgkxNgorJEwkb29wX2tleTE5MjoKKwltb3ZxCVFXT1JEW3JheF0seG1tMgorCW1vdmRxYQl4bW0xLHhtbTIKK0RCCTEwMiwxNSw1NiwwLDIxMworREIJMTAyLDE1LDU2LDIyMSwyMTIKKwlwc2xsZAl4bW00LDEKKwlsZWEJcmF4LFsyNCtyYXhdCisKKwltb3ZkcWEJeG1tMyx4bW0wCisJcHNsbGRxCXhtbTAsNAorCXB4b3IJeG1tMyx4bW0wCisJcHNsbGRxCXhtbTAsNAorCXB4b3IJeG1tMyx4bW0wCisJcHNsbGRxCXhtbTAsNAorCXB4b3IJeG1tMCx4bW0zCisKKwlwc2h1ZmQJeG1tMyx4bW0wLDB4ZmYKKwlweG9yCXhtbTMseG1tMQorCXBzbGxkcQl4bW0xLDQKKwlweG9yCXhtbTMseG1tMQorCisJcHhvcgl4bW0wLHhtbTIKKwlweG9yCXhtbTIseG1tMworCW1vdmRxdQlYTU1XT1JEWygtMTYpK3JheF0seG1tMAorCisJZGVjCXIxMGQKKwlqbnoJTkVBUiAkTCRvb3Bfa2V5MTkyCisKKwltb3YJRFdPUkRbMzIrcmF4XSxlZHgKKwl4b3IJZWF4LGVheAorCWptcAlORUFSICRMJGVuY19rZXlfcmV0CisKK0FMSUdOCTE2CiskTCQxNHJvdW5kczoKKwltb3Z1cHMJeG1tMixYTU1XT1JEWzE2K3JjeF0KKwltb3YJZWR4LDEzCisJbGVhCXJheCxbMTYrcmF4XQorCWNtcAlyMTBkLDI2ODQzNTQ1NgorCWplCU5FQVIgJEwkMTRyb3VuZHNfYWx0CisKKwltb3Z1cHMJWE1NV09SRFtyOF0seG1tMAorCW1vdnVwcwlYTU1XT1JEWzE2K3I4XSx4bW0yCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwxCisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzI1NmFfY29sZAorREIJMTAyLDE1LDU4LDIyMywyMDAsMQorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZiCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwyCisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzI1NmEKK0RCCTEwMiwxNSw1OCwyMjMsMjAwLDIKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMjU2YgorREIJMTAyLDE1LDU4LDIyMywyMDIsNAorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZhCitEQgkxMDIsMTUsNTgsMjIzLDIwMCw0CisJY2FsbAkkTCRrZXlfZXhwYW5zaW9uXzI1NmIKK0RCCTEwMiwxNSw1OCwyMjMsMjAyLDgKKwljYWxsCSRMJGtleV9leHBhbnNpb25fMjU2YQorREIJMTAyLDE1LDU4LDIyMywyMDAsOAorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZiCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwxNgorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZhCitEQgkxMDIsMTUsNTgsMjIzLDIwMCwxNgorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZiCitEQgkxMDIsMTUsNTgsMjIzLDIwMiwzMgorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZhCitEQgkxMDIsMTUsNTgsMjIzLDIwMCwzMgorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZiCitEQgkxMDIsMTUsNTgsMjIzLDIwMiw2NAorCWNhbGwJJEwka2V5X2V4cGFuc2lvbl8yNTZhCisJbW92dXBzCVhNTVdPUkRbcmF4XSx4bW0wCisJbW92CURXT1JEWzE2K3JheF0sZWR4CisJeG9yCXJheCxyYXgKKwlqbXAJTkVBUiAkTCRlbmNfa2V5X3JldAorCitBTElHTgkxNgorJEwkMTRyb3VuZHNfYWx0OgorCW1vdmRxYQl4bW01LFhNTVdPUkRbJEwka2V5X3JvdGF0ZV0KKwltb3ZkcWEJeG1tNCxYTU1XT1JEWyRMJGtleV9yY29uMV0KKwltb3YJcjEwZCw3CisJbW92ZHF1CVhNTVdPUkRbcjhdLHhtbTAKKwltb3ZkcWEJeG1tMSx4bW0yCisJbW92ZHF1CVhNTVdPUkRbMTYrcjhdLHhtbTIKKwlqbXAJTkVBUiAkTCRvb3Bfa2V5MjU2CisKK0FMSUdOCTE2CiskTCRvb3Bfa2V5MjU2OgorREIJMTAyLDE1LDU2LDAsMjEzCitEQgkxMDIsMTUsNTYsMjIxLDIxMgorCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDQKKwlweG9yCXhtbTAseG1tMworCXBzbGxkCXhtbTQsMQorCisJcHhvcgl4bW0wLHhtbTIKKwltb3ZkcXUJWE1NV09SRFtyYXhdLHhtbTAKKworCWRlYwlyMTBkCisJanoJTkVBUiAkTCRkb25lX2tleTI1NgorCisJcHNodWZkCXhtbTIseG1tMCwweGZmCisJcHhvcgl4bW0zLHhtbTMKK0RCCTEwMiwxNSw1NiwyMjEsMjExCisKKwltb3ZkcWEJeG1tMyx4bW0xCisJcHNsbGRxCXhtbTEsNAorCXB4b3IJeG1tMyx4bW0xCisJcHNsbGRxCXhtbTEsNAorCXB4b3IJeG1tMyx4bW0xCisJcHNsbGRxCXhtbTEsNAorCXB4b3IJeG1tMSx4bW0zCisKKwlweG9yCXhtbTIseG1tMQorCW1vdmRxdQlYTU1XT1JEWzE2K3JheF0seG1tMgorCWxlYQlyYXgsWzMyK3JheF0KKwltb3ZkcWEJeG1tMSx4bW0yCisKKwlqbXAJTkVBUiAkTCRvb3Bfa2V5MjU2CisKKyRMJGRvbmVfa2V5MjU2OgorCW1vdglEV09SRFsxNityYXhdLGVkeAorCXhvcgllYXgsZWF4CisJam1wCU5FQVIgJEwkZW5jX2tleV9yZXQKKworQUxJR04JMTYKKyRMJGJhZF9rZXliaXRzOgorCW1vdglyYXgsLTIKKyRMJGVuY19rZXlfcmV0OgorCXB4b3IJeG1tMCx4bW0wCisJcHhvcgl4bW0xLHhtbTEKKwlweG9yCXhtbTIseG1tMgorCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorCWFkZAlyc3AsOAorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfc2V0X2VuY3J5cHRfa2V5OgorCitBTElHTgkxNgorJEwka2V5X2V4cGFuc2lvbl8xMjg6CisJbW92dXBzCVhNTVdPUkRbcmF4XSx4bW0wCisJbGVhCXJheCxbMTYrcmF4XQorJEwka2V5X2V4cGFuc2lvbl8xMjhfY29sZDoKKwlzaHVmcHMJeG1tNCx4bW0wLDE2CisJeG9ycHMJeG1tMCx4bW00CisJc2h1ZnBzCXhtbTQseG1tMCwxNDAKKwl4b3Jwcwl4bW0wLHhtbTQKKwlzaHVmcHMJeG1tMSx4bW0xLDI1NQorCXhvcnBzCXhtbTAseG1tMQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitBTElHTgkxNgorJEwka2V5X2V4cGFuc2lvbl8xOTJhOgorCW1vdnVwcwlYTU1XT1JEW3JheF0seG1tMAorCWxlYQlyYXgsWzE2K3JheF0KKyRMJGtleV9leHBhbnNpb25fMTkyYV9jb2xkOgorCW1vdmFwcwl4bW01LHhtbTIKKyRMJGtleV9leHBhbnNpb25fMTkyYl93YXJtOgorCXNodWZwcwl4bW00LHhtbTAsMTYKKwltb3ZkcWEJeG1tMyx4bW0yCisJeG9ycHMJeG1tMCx4bW00CisJc2h1ZnBzCXhtbTQseG1tMCwxNDAKKwlwc2xsZHEJeG1tMyw0CisJeG9ycHMJeG1tMCx4bW00CisJcHNodWZkCXhtbTEseG1tMSw4NQorCXB4b3IJeG1tMix4bW0zCisJcHhvcgl4bW0wLHhtbTEKKwlwc2h1ZmQJeG1tMyx4bW0wLDI1NQorCXB4b3IJeG1tMix4bW0zCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK0FMSUdOCTE2CiskTCRrZXlfZXhwYW5zaW9uXzE5MmI6CisJbW92YXBzCXhtbTMseG1tMAorCXNodWZwcwl4bW01LHhtbTAsNjgKKwltb3Z1cHMJWE1NV09SRFtyYXhdLHhtbTUKKwlzaHVmcHMJeG1tMyx4bW0yLDc4CisJbW92dXBzCVhNTVdPUkRbMTYrcmF4XSx4bW0zCisJbGVhCXJheCxbMzIrcmF4XQorCWptcAlORUFSICRMJGtleV9leHBhbnNpb25fMTkyYl93YXJtCisKK0FMSUdOCTE2CiskTCRrZXlfZXhwYW5zaW9uXzI1NmE6CisJbW92dXBzCVhNTVdPUkRbcmF4XSx4bW0yCisJbGVhCXJheCxbMTYrcmF4XQorJEwka2V5X2V4cGFuc2lvbl8yNTZhX2NvbGQ6CisJc2h1ZnBzCXhtbTQseG1tMCwxNgorCXhvcnBzCXhtbTAseG1tNAorCXNodWZwcwl4bW00LHhtbTAsMTQwCisJeG9ycHMJeG1tMCx4bW00CisJc2h1ZnBzCXhtbTEseG1tMSwyNTUKKwl4b3Jwcwl4bW0wLHhtbTEKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworQUxJR04JMTYKKyRMJGtleV9leHBhbnNpb25fMjU2YjoKKwltb3Z1cHMJWE1NV09SRFtyYXhdLHhtbTAKKwlsZWEJcmF4LFsxNityYXhdCisKKwlzaHVmcHMJeG1tNCx4bW0yLDE2CisJeG9ycHMJeG1tMix4bW00CisJc2h1ZnBzCXhtbTQseG1tMiwxNDAKKwl4b3Jwcwl4bW0yLHhtbTQKKwlzaHVmcHMJeG1tMSx4bW0xLDE3MAorCXhvcnBzCXhtbTIseG1tMQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTY0CiskTCRic3dhcF9tYXNrOgorREIJMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDcsNiw1LDQsMywyLDEsMAorJEwkaW5jcmVtZW50MzI6CisJREQJNiw2LDYsMAorJEwkaW5jcmVtZW50NjQ6CisJREQJMSwwLDAsMAorJEwkeHRzX21hZ2ljOgorCURECTB4ODcsMCwxLDAKKyRMJGluY3JlbWVudDE6CitEQgkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxCiskTCRrZXlfcm90YXRlOgorCURECTB4MGMwZjBlMGQsMHgwYzBmMGUwZCwweDBjMGYwZTBkLDB4MGMwZjBlMGQKKyRMJGtleV9yb3RhdGUxOTI6CisJREQJMHgwNDA3MDYwNSwweDA0MDcwNjA1LDB4MDQwNzA2MDUsMHgwNDA3MDYwNQorJEwka2V5X3Jjb24xOgorCURECTEsMSwxLDEKKyRMJGtleV9yY29uMWI6CisJREQJMHgxYiwweDFiLDB4MWIsMHgxYgorCitEQgk2NSw2OSw4MywzMiwxMDIsMTExLDExNCwzMiw3MywxMTAsMTE2LDEwMSwxMDgsMzIsNjUsNjkKK0RCCTgzLDQ1LDc4LDczLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzCitEQgkzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUKK0RCCTExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorQUxJR04JNjQKK0VYVEVSTglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisKK0FMSUdOCTE2CitlY2JfY2NtNjRfc2VfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwltb3YJcnNpLFFXT1JEWzgrcjldCisJbW92CXIxMSxRV09SRFs1NityOV0KKworCW1vdglyMTBkLERXT1JEW3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbW92CXJheCxRV09SRFsxNTIrcjhdCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCWxlYQlyc2ksW3JheF0KKwlsZWEJcmRpLFs1MTIrcjhdCisJbW92CWVjeCw4CisJREQJMHhhNTQ4ZjNmYworCWxlYQlyYXgsWzg4K3JheF0KKworCWptcAlORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisKKworQUxJR04JMTYKK2N0cl94dHNfc2VfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwltb3YJcnNpLFFXT1JEWzgrcjldCisJbW92CXIxMSxRV09SRFs1NityOV0KKworCW1vdglyMTBkLERXT1JEW3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbW92CXJheCxRV09SRFsxNTIrcjhdCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyYXgsUVdPUkRbMjA4K3I4XQorCisJbGVhCXJzaSxbKCgtMTY4KSkrcmF4XQorCWxlYQlyZGksWzUxMityOF0KKwltb3YJZWN4LDIwCisJREQJMHhhNTQ4ZjNmYworCisJbW92CXJicCxRV09SRFsoKC04KSkrcmF4XQorCW1vdglRV09SRFsxNjArcjhdLHJicAorCWptcAlORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisKKworQUxJR04JMTYKK29jYl9zZV9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCW1vdglyc2ksUVdPUkRbOCtyOV0KKwltb3YJcjExLFFXT1JEWzU2K3I5XQorCisJbW92CXIxMGQsRFdPUkRbcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyMTBkLERXT1JEWzgrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWphZQlORUFSICRMJG9jYl9ub194bW0KKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbGVhCXJzaSxbcmF4XQorCWxlYQlyZGksWzUxMityOF0KKwltb3YJZWN4LDIwCisJREQJMHhhNTQ4ZjNmYworCWxlYQlyYXgsWygoMTYwKzQwKSkrcmF4XQorCiskTCRvY2Jfbm9feG1tOgorCW1vdglyYngsUVdPUkRbKCgtOCkpK3JheF0KKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisKKwlqbXAJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCitBTElHTgkxNgorY2JjX3NlX2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbGVhCXIxMCxbJEwkY2JjX2RlY3J5cHRfYnVsa10KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKworCWxlYQlyMTAsWyRMJGNiY19kZWNyeXB0X2JvZHldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbW92CXJheCxRV09SRFsxNTIrcjhdCisKKwlsZWEJcjEwLFskTCRjYmNfcmV0XQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwlsZWEJcnNpLFsxNityYXhdCisJbGVhCXJkaSxbNTEyK3I4XQorCW1vdgllY3gsMjAKKwlERAkweGE1NDhmM2ZjCisKKwltb3YJcmF4LFFXT1JEWzIwOCtyOF0KKworCW1vdglyYnAsUVdPUkRbKCgtOCkpK3JheF0KKwltb3YJUVdPUkRbMTYwK3I4XSxyYnAKKworJEwkY29tbW9uX3NlaF90YWlsOgorCW1vdglyZGksUVdPUkRbOCtyYXhdCisJbW92CXJzaSxRV09SRFsxNityYXhdCisJbW92CVFXT1JEWzE1MityOF0scmF4CisJbW92CVFXT1JEWzE2OCtyOF0scnNpCisJbW92CVFXT1JEWzE3NityOF0scmRpCisKKwltb3YJcmRpLFFXT1JEWzQwK3I5XQorCW1vdglyc2kscjgKKwltb3YJZWN4LDE1NAorCURECTB4YTU0OGYzZmMKKworCW1vdglyc2kscjkKKwl4b3IJcmN4LHJjeAorCW1vdglyZHgsUVdPUkRbOCtyc2ldCisJbW92CXI4LFFXT1JEW3JzaV0KKwltb3YJcjksUVdPUkRbMTYrcnNpXQorCW1vdglyMTAsUVdPUkRbNDArcnNpXQorCWxlYQlyMTEsWzU2K3JzaV0KKwlsZWEJcjEyLFsyNCtyc2ldCisJbW92CVFXT1JEWzMyK3JzcF0scjEwCisJbW92CVFXT1JEWzQwK3JzcF0scjExCisJbW92CVFXT1JEWzQ4K3JzcF0scjEyCisJbW92CVFXT1JEWzU2K3JzcF0scmN4CisJY2FsbAlRV09SRFtfX2ltcF9SdGxWaXJ0dWFsVW53aW5kXQorCisJbW92CWVheCwxCisJYWRkCXJzcCw2NAorCXBvcGZxCisJcG9wCXIxNQorCXBvcAlyMTQKKwlwb3AJcjEzCisJcG9wCXIxMgorCXBvcAlyYnAKKwlwb3AJcmJ4CisJcG9wCXJkaQorCXBvcAlyc2kKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitzZWN0aW9uCS5wZGF0YSByZGF0YSBhbGlnbj00CitBTElHTgk0CisJREQJJEwkU0VIX2JlZ2luX2Flc19od19lY2JfZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2Flc19od19lY2JfZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19lY2Igd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfYWVzX2h3X2NjbTY0X2VuY3J5cHRfYmxvY2tzIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2NjbTY0X2VuYyB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9hZXNfaHdfY2NtNjRfZGVjcnlwdF9ibG9ja3Mgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfaHdfY2NtNjRfZGVjcnlwdF9ibG9ja3Mgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fY2NtNjRfZGVjIHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcyB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2Flc19od19jdHIzMl9lbmNyeXB0X2Jsb2NrcyB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19jdHIzMiB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9hZXNfaHdfeHRzX2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfaHdfeHRzX2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9feHRzX2VuYyB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9hZXNfaHdfeHRzX2RlY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfaHdfeHRzX2RlY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9feHRzX2RlYyB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9hZXNfaHdfb2NiX2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfaHdfb2NiX2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fb2NiX2VuYyB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9hZXNfaHdfb2NiX2RlY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9hZXNfaHdfb2NiX2RlY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fb2NiX2RlYyB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfYmVnaW5fYWVzX2h3X2NiY19lbmNyeXB0IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfYWVzX2h3X2NiY19lbmNyeXB0IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2NiYyB3cnQgLi5pbWFnZWJhc2UKKworCURECWFlc19od19zZXRfZGVjcnlwdF9rZXkgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9zZXRfZGVjcnlwdF9rZXkgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fa2V5IHdydCAuLmltYWdlYmFzZQorCisJREQJYWVzX2h3X3NldF9lbmNyeXB0X2tleSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX3NldF9lbmNyeXB0X2tleSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19rZXkgd3J0IC4uaW1hZ2ViYXNlCitzZWN0aW9uCS54ZGF0YSByZGF0YSBhbGlnbj04CitBTElHTgk4CiskTCRTRUhfaW5mb19lY2I6CitEQgk5LDAsMCwwCisJREQJZWNiX2NjbTY0X3NlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkZWNiX2VuY19ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRlY2JfZW5jX3JldCB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX2NjbTY0X2VuYzoKK0RCCTksMCwwLDAKKwlERAllY2JfY2NtNjRfc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRjY202NF9lbmNfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkY2NtNjRfZW5jX3JldCB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX2NjbTY0X2RlYzoKK0RCCTksMCwwLDAKKwlERAllY2JfY2NtNjRfc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRjY202NF9kZWNfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkY2NtNjRfZGVjX3JldCB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX2N0cjMyOgorREIJOSwwLDAsMAorCURECWN0cl94dHNfc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRjdHIzMl9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRjdHIzMl9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX3h0c19lbmM6CitEQgk5LDAsMCwwCisJREQJY3RyX3h0c19zZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJHh0c19lbmNfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkeHRzX2VuY19lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX3h0c19kZWM6CitEQgk5LDAsMCwwCisJREQJY3RyX3h0c19zZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJHh0c19kZWNfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkeHRzX2RlY19lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX29jYl9lbmM6CitEQgk5LDAsMCwwCisJREQJb2NiX3NlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkb2NiX2VuY19ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRvY2JfZW5jX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECSRMJG9jYl9lbmNfcG9wIHdydCAuLmltYWdlYmFzZQorCURECTAKKyRMJFNFSF9pbmZvX29jYl9kZWM6CitEQgk5LDAsMCwwCisJREQJb2NiX3NlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkb2NiX2RlY19ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRvY2JfZGVjX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECSRMJG9jYl9kZWNfcG9wIHdydCAuLmltYWdlYmFzZQorCURECTAKKyRMJFNFSF9pbmZvX2NiYzoKK0RCCTksMCwwLDAKKwlERAljYmNfc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX2tleToKK0RCCTB4MDEsMHgwNCwweDAxLDB4MDAKK0RCCTB4MDQsMHgwMiwweDAwLDB4MDAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9ic2Flcy14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2JzYWVzLXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkMGRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9ic2Flcy14ODZfNjQuYXNtCkBAIC0wLDAgKzEsMjgxNSBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCisKK0VYVEVSTglhZXNfbm9od19lbmNyeXB0CitFWFRFUk4JYWVzX25vaHdfZGVjcnlwdAorCisKK0FMSUdOCTY0CitfYnNhZXNfZW5jcnlwdDg6CisJbGVhCXIxMSxbJEwkQlMwXQorCisJbW92ZHFhCXhtbTgsWE1NV09SRFtyYXhdCisJbGVhCXJheCxbMTYrcmF4XQorCW1vdmRxYQl4bW03LFhNTVdPUkRbODArcjExXQorCXB4b3IJeG1tMTUseG1tOAorCXB4b3IJeG1tMCx4bW04CisJcHhvcgl4bW0xLHhtbTgKKwlweG9yCXhtbTIseG1tOAorREIJMTAyLDY4LDE1LDU2LDAsMjU1CitEQgkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCXhtbTMseG1tOAorCXB4b3IJeG1tNCx4bW04CitEQgkxMDIsMTUsNTYsMCwyMDcKK0RCCTEwMiwxNSw1NiwwLDIxNQorCXB4b3IJeG1tNSx4bW04CisJcHhvcgl4bW02LHhtbTgKK0RCCTEwMiwxNSw1NiwwLDIyMworREIJMTAyLDE1LDU2LDAsMjMxCitEQgkxMDIsMTUsNTYsMCwyMzkKK0RCCTEwMiwxNSw1NiwwLDI0NworX2JzYWVzX2VuY3J5cHQ4X2JpdHNsaWNlOgorCW1vdmRxYQl4bW03LFhNTVdPUkRbcjExXQorCW1vdmRxYQl4bW04LFhNTVdPUkRbMTYrcjExXQorCW1vdmRxYQl4bW05LHhtbTUKKwlwc3JscQl4bW01LDEKKwltb3ZkcWEJeG1tMTAseG1tMworCXBzcmxxCXhtbTMsMQorCXB4b3IJeG1tNSx4bW02CisJcHhvcgl4bW0zLHhtbTQKKwlwYW5kCXhtbTUseG1tNworCXBhbmQJeG1tMyx4bW03CisJcHhvcgl4bW02LHhtbTUKKwlwc2xscQl4bW01LDEKKwlweG9yCXhtbTQseG1tMworCXBzbGxxCXhtbTMsMQorCXB4b3IJeG1tNSx4bW05CisJcHhvcgl4bW0zLHhtbTEwCisJbW92ZHFhCXhtbTkseG1tMQorCXBzcmxxCXhtbTEsMQorCW1vdmRxYQl4bW0xMCx4bW0xNQorCXBzcmxxCXhtbTE1LDEKKwlweG9yCXhtbTEseG1tMgorCXB4b3IJeG1tMTUseG1tMAorCXBhbmQJeG1tMSx4bW03CisJcGFuZAl4bW0xNSx4bW03CisJcHhvcgl4bW0yLHhtbTEKKwlwc2xscQl4bW0xLDEKKwlweG9yCXhtbTAseG1tMTUKKwlwc2xscQl4bW0xNSwxCisJcHhvcgl4bW0xLHhtbTkKKwlweG9yCXhtbTE1LHhtbTEwCisJbW92ZHFhCXhtbTcsWE1NV09SRFszMityMTFdCisJbW92ZHFhCXhtbTkseG1tNAorCXBzcmxxCXhtbTQsMgorCW1vdmRxYQl4bW0xMCx4bW0zCisJcHNybHEJeG1tMywyCisJcHhvcgl4bW00LHhtbTYKKwlweG9yCXhtbTMseG1tNQorCXBhbmQJeG1tNCx4bW04CisJcGFuZAl4bW0zLHhtbTgKKwlweG9yCXhtbTYseG1tNAorCXBzbGxxCXhtbTQsMgorCXB4b3IJeG1tNSx4bW0zCisJcHNsbHEJeG1tMywyCisJcHhvcgl4bW00LHhtbTkKKwlweG9yCXhtbTMseG1tMTAKKwltb3ZkcWEJeG1tOSx4bW0wCisJcHNybHEJeG1tMCwyCisJbW92ZHFhCXhtbTEwLHhtbTE1CisJcHNybHEJeG1tMTUsMgorCXB4b3IJeG1tMCx4bW0yCisJcHhvcgl4bW0xNSx4bW0xCisJcGFuZAl4bW0wLHhtbTgKKwlwYW5kCXhtbTE1LHhtbTgKKwlweG9yCXhtbTIseG1tMAorCXBzbGxxCXhtbTAsMgorCXB4b3IJeG1tMSx4bW0xNQorCXBzbGxxCXhtbTE1LDIKKwlweG9yCXhtbTAseG1tOQorCXB4b3IJeG1tMTUseG1tMTAKKwltb3ZkcWEJeG1tOSx4bW0yCisJcHNybHEJeG1tMiw0CisJbW92ZHFhCXhtbTEwLHhtbTEKKwlwc3JscQl4bW0xLDQKKwlweG9yCXhtbTIseG1tNgorCXB4b3IJeG1tMSx4bW01CisJcGFuZAl4bW0yLHhtbTcKKwlwYW5kCXhtbTEseG1tNworCXB4b3IJeG1tNix4bW0yCisJcHNsbHEJeG1tMiw0CisJcHhvcgl4bW01LHhtbTEKKwlwc2xscQl4bW0xLDQKKwlweG9yCXhtbTIseG1tOQorCXB4b3IJeG1tMSx4bW0xMAorCW1vdmRxYQl4bW05LHhtbTAKKwlwc3JscQl4bW0wLDQKKwltb3ZkcWEJeG1tMTAseG1tMTUKKwlwc3JscQl4bW0xNSw0CisJcHhvcgl4bW0wLHhtbTQKKwlweG9yCXhtbTE1LHhtbTMKKwlwYW5kCXhtbTAseG1tNworCXBhbmQJeG1tMTUseG1tNworCXB4b3IJeG1tNCx4bW0wCisJcHNsbHEJeG1tMCw0CisJcHhvcgl4bW0zLHhtbTE1CisJcHNsbHEJeG1tMTUsNAorCXB4b3IJeG1tMCx4bW05CisJcHhvcgl4bW0xNSx4bW0xMAorCWRlYwlyMTBkCisJam1wCU5FQVIgJEwkZW5jX3Nib3gKK0FMSUdOCTE2CiskTCRlbmNfbG9vcDoKKwlweG9yCXhtbTE1LFhNTVdPUkRbcmF4XQorCXB4b3IJeG1tMCxYTU1XT1JEWzE2K3JheF0KKwlweG9yCXhtbTEsWE1NV09SRFszMityYXhdCisJcHhvcgl4bW0yLFhNTVdPUkRbNDgrcmF4XQorREIJMTAyLDY4LDE1LDU2LDAsMjU1CitEQgkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCXhtbTMsWE1NV09SRFs2NCtyYXhdCisJcHhvcgl4bW00LFhNTVdPUkRbODArcmF4XQorREIJMTAyLDE1LDU2LDAsMjA3CitEQgkxMDIsMTUsNTYsMCwyMTUKKwlweG9yCXhtbTUsWE1NV09SRFs5NityYXhdCisJcHhvcgl4bW02LFhNTVdPUkRbMTEyK3JheF0KK0RCCTEwMiwxNSw1NiwwLDIyMworREIJMTAyLDE1LDU2LDAsMjMxCitEQgkxMDIsMTUsNTYsMCwyMzkKK0RCCTEwMiwxNSw1NiwwLDI0NworCWxlYQlyYXgsWzEyOCtyYXhdCiskTCRlbmNfc2JveDoKKwlweG9yCXhtbTQseG1tNQorCXB4b3IJeG1tMSx4bW0wCisJcHhvcgl4bW0yLHhtbTE1CisJcHhvcgl4bW01LHhtbTEKKwlweG9yCXhtbTQseG1tMTUKKworCXB4b3IJeG1tNSx4bW0yCisJcHhvcgl4bW0yLHhtbTYKKwlweG9yCXhtbTYseG1tNAorCXB4b3IJeG1tMix4bW0zCisJcHhvcgl4bW0zLHhtbTQKKwlweG9yCXhtbTIseG1tMAorCisJcHhvcgl4bW0xLHhtbTYKKwlweG9yCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xMCx4bW02CisJbW92ZHFhCXhtbTkseG1tMAorCW1vdmRxYQl4bW04LHhtbTQKKwltb3ZkcWEJeG1tMTIseG1tMQorCW1vdmRxYQl4bW0xMSx4bW01CisKKwlweG9yCXhtbTEwLHhtbTMKKwlweG9yCXhtbTkseG1tMQorCXB4b3IJeG1tOCx4bW0yCisJbW92ZHFhCXhtbTEzLHhtbTEwCisJcHhvcgl4bW0xMix4bW0zCisJbW92ZHFhCXhtbTcseG1tOQorCXB4b3IJeG1tMTEseG1tMTUKKwltb3ZkcWEJeG1tMTQseG1tMTAKKworCXBvcgl4bW05LHhtbTgKKwlwb3IJeG1tMTAseG1tMTEKKwlweG9yCXhtbTE0LHhtbTcKKwlwYW5kCXhtbTEzLHhtbTExCisJcHhvcgl4bW0xMSx4bW04CisJcGFuZAl4bW03LHhtbTgKKwlwYW5kCXhtbTE0LHhtbTExCisJbW92ZHFhCXhtbTExLHhtbTIKKwlweG9yCXhtbTExLHhtbTE1CisJcGFuZAl4bW0xMix4bW0xMQorCXB4b3IJeG1tMTAseG1tMTIKKwlweG9yCXhtbTkseG1tMTIKKwltb3ZkcWEJeG1tMTIseG1tNgorCW1vdmRxYQl4bW0xMSx4bW00CisJcHhvcgl4bW0xMix4bW0wCisJcHhvcgl4bW0xMSx4bW01CisJbW92ZHFhCXhtbTgseG1tMTIKKwlwYW5kCXhtbTEyLHhtbTExCisJcG9yCXhtbTgseG1tMTEKKwlweG9yCXhtbTcseG1tMTIKKwlweG9yCXhtbTEwLHhtbTE0CisJcHhvcgl4bW05LHhtbTEzCisJcHhvcgl4bW04LHhtbTE0CisJbW92ZHFhCXhtbTExLHhtbTEKKwlweG9yCXhtbTcseG1tMTMKKwltb3ZkcWEJeG1tMTIseG1tMworCXB4b3IJeG1tOCx4bW0xMworCW1vdmRxYQl4bW0xMyx4bW0wCisJcGFuZAl4bW0xMSx4bW0yCisJbW92ZHFhCXhtbTE0LHhtbTYKKwlwYW5kCXhtbTEyLHhtbTE1CisJcGFuZAl4bW0xMyx4bW00CisJcG9yCXhtbTE0LHhtbTUKKwlweG9yCXhtbTEwLHhtbTExCisJcHhvcgl4bW05LHhtbTEyCisJcHhvcgl4bW04LHhtbTEzCisJcHhvcgl4bW03LHhtbTE0CisKKworCisKKworCW1vdmRxYQl4bW0xMSx4bW0xMAorCXBhbmQJeG1tMTAseG1tOAorCXB4b3IJeG1tMTEseG1tOQorCisJbW92ZHFhCXhtbTEzLHhtbTcKKwltb3ZkcWEJeG1tMTQseG1tMTEKKwlweG9yCXhtbTEzLHhtbTEwCisJcGFuZAl4bW0xNCx4bW0xMworCisJbW92ZHFhCXhtbTEyLHhtbTgKKwlweG9yCXhtbTE0LHhtbTkKKwlweG9yCXhtbTEyLHhtbTcKKworCXB4b3IJeG1tMTAseG1tOQorCisJcGFuZAl4bW0xMix4bW0xMAorCisJbW92ZHFhCXhtbTkseG1tMTMKKwlweG9yCXhtbTEyLHhtbTcKKworCXB4b3IJeG1tOSx4bW0xMgorCXB4b3IJeG1tOCx4bW0xMgorCisJcGFuZAl4bW05LHhtbTcKKworCXB4b3IJeG1tMTMseG1tOQorCXB4b3IJeG1tOCx4bW05CisKKwlwYW5kCXhtbTEzLHhtbTE0CisKKwlweG9yCXhtbTEzLHhtbTExCisJbW92ZHFhCXhtbTExLHhtbTUKKwltb3ZkcWEJeG1tNyx4bW00CisJbW92ZHFhCXhtbTkseG1tMTQKKwlweG9yCXhtbTkseG1tMTMKKwlwYW5kCXhtbTkseG1tNQorCXB4b3IJeG1tNSx4bW00CisJcGFuZAl4bW00LHhtbTE0CisJcGFuZAl4bW01LHhtbTEzCisJcHhvcgl4bW01LHhtbTQKKwlweG9yCXhtbTQseG1tOQorCXB4b3IJeG1tMTEseG1tMTUKKwlweG9yCXhtbTcseG1tMgorCXB4b3IJeG1tMTQseG1tMTIKKwlweG9yCXhtbTEzLHhtbTgKKwltb3ZkcWEJeG1tMTAseG1tMTQKKwltb3ZkcWEJeG1tOSx4bW0xMgorCXB4b3IJeG1tMTAseG1tMTMKKwlweG9yCXhtbTkseG1tOAorCXBhbmQJeG1tMTAseG1tMTEKKwlwYW5kCXhtbTkseG1tMTUKKwlweG9yCXhtbTExLHhtbTcKKwlweG9yCXhtbTE1LHhtbTIKKwlwYW5kCXhtbTcseG1tMTQKKwlwYW5kCXhtbTIseG1tMTIKKwlwYW5kCXhtbTExLHhtbTEzCisJcGFuZAl4bW0xNSx4bW04CisJcHhvcgl4bW03LHhtbTExCisJcHhvcgl4bW0xNSx4bW0yCisJcHhvcgl4bW0xMSx4bW0xMAorCXB4b3IJeG1tMix4bW05CisJcHhvcgl4bW01LHhtbTExCisJcHhvcgl4bW0xNSx4bW0xMQorCXB4b3IJeG1tNCx4bW03CisJcHhvcgl4bW0yLHhtbTcKKworCW1vdmRxYQl4bW0xMSx4bW02CisJbW92ZHFhCXhtbTcseG1tMAorCXB4b3IJeG1tMTEseG1tMworCXB4b3IJeG1tNyx4bW0xCisJbW92ZHFhCXhtbTEwLHhtbTE0CisJbW92ZHFhCXhtbTkseG1tMTIKKwlweG9yCXhtbTEwLHhtbTEzCisJcHhvcgl4bW05LHhtbTgKKwlwYW5kCXhtbTEwLHhtbTExCisJcGFuZAl4bW05LHhtbTMKKwlweG9yCXhtbTExLHhtbTcKKwlweG9yCXhtbTMseG1tMQorCXBhbmQJeG1tNyx4bW0xNAorCXBhbmQJeG1tMSx4bW0xMgorCXBhbmQJeG1tMTEseG1tMTMKKwlwYW5kCXhtbTMseG1tOAorCXB4b3IJeG1tNyx4bW0xMQorCXB4b3IJeG1tMyx4bW0xCisJcHhvcgl4bW0xMSx4bW0xMAorCXB4b3IJeG1tMSx4bW05CisJcHhvcgl4bW0xNCx4bW0xMgorCXB4b3IJeG1tMTMseG1tOAorCW1vdmRxYQl4bW0xMCx4bW0xNAorCXB4b3IJeG1tMTAseG1tMTMKKwlwYW5kCXhtbTEwLHhtbTYKKwlweG9yCXhtbTYseG1tMAorCXBhbmQJeG1tMCx4bW0xNAorCXBhbmQJeG1tNix4bW0xMworCXB4b3IJeG1tNix4bW0wCisJcHhvcgl4bW0wLHhtbTEwCisJcHhvcgl4bW02LHhtbTExCisJcHhvcgl4bW0zLHhtbTExCisJcHhvcgl4bW0wLHhtbTcKKwlweG9yCXhtbTEseG1tNworCXB4b3IJeG1tNix4bW0xNQorCXB4b3IJeG1tMCx4bW01CisJcHhvcgl4bW0zLHhtbTYKKwlweG9yCXhtbTUseG1tMTUKKwlweG9yCXhtbTE1LHhtbTAKKworCXB4b3IJeG1tMCx4bW00CisJcHhvcgl4bW00LHhtbTEKKwlweG9yCXhtbTEseG1tMgorCXB4b3IJeG1tMix4bW00CisJcHhvcgl4bW0zLHhtbTQKKworCXB4b3IJeG1tNSx4bW0yCisJZGVjCXIxMGQKKwlqbAlORUFSICRMJGVuY19kb25lCisJcHNodWZkCXhtbTcseG1tMTUsMHg5MworCXBzaHVmZAl4bW04LHhtbTAsMHg5MworCXB4b3IJeG1tMTUseG1tNworCXBzaHVmZAl4bW05LHhtbTMsMHg5MworCXB4b3IJeG1tMCx4bW04CisJcHNodWZkCXhtbTEwLHhtbTUsMHg5MworCXB4b3IJeG1tMyx4bW05CisJcHNodWZkCXhtbTExLHhtbTIsMHg5MworCXB4b3IJeG1tNSx4bW0xMAorCXBzaHVmZAl4bW0xMix4bW02LDB4OTMKKwlweG9yCXhtbTIseG1tMTEKKwlwc2h1ZmQJeG1tMTMseG1tMSwweDkzCisJcHhvcgl4bW02LHhtbTEyCisJcHNodWZkCXhtbTE0LHhtbTQsMHg5MworCXB4b3IJeG1tMSx4bW0xMworCXB4b3IJeG1tNCx4bW0xNAorCisJcHhvcgl4bW04LHhtbTE1CisJcHhvcgl4bW03LHhtbTQKKwlweG9yCXhtbTgseG1tNAorCXBzaHVmZAl4bW0xNSx4bW0xNSwweDRFCisJcHhvcgl4bW05LHhtbTAKKwlwc2h1ZmQJeG1tMCx4bW0wLDB4NEUKKwlweG9yCXhtbTEyLHhtbTIKKwlweG9yCXhtbTE1LHhtbTcKKwlweG9yCXhtbTEzLHhtbTYKKwlweG9yCXhtbTAseG1tOAorCXB4b3IJeG1tMTEseG1tNQorCXBzaHVmZAl4bW03LHhtbTIsMHg0RQorCXB4b3IJeG1tMTQseG1tMQorCXBzaHVmZAl4bW04LHhtbTYsMHg0RQorCXB4b3IJeG1tMTAseG1tMworCXBzaHVmZAl4bW0yLHhtbTUsMHg0RQorCXB4b3IJeG1tMTAseG1tNAorCXBzaHVmZAl4bW02LHhtbTQsMHg0RQorCXB4b3IJeG1tMTEseG1tNAorCXBzaHVmZAl4bW01LHhtbTEsMHg0RQorCXB4b3IJeG1tNyx4bW0xMQorCXBzaHVmZAl4bW0xLHhtbTMsMHg0RQorCXB4b3IJeG1tOCx4bW0xMgorCXB4b3IJeG1tMix4bW0xMAorCXB4b3IJeG1tNix4bW0xNAorCXB4b3IJeG1tNSx4bW0xMworCW1vdmRxYQl4bW0zLHhtbTcKKwlweG9yCXhtbTEseG1tOQorCW1vdmRxYQl4bW00LHhtbTgKKwltb3ZkcWEJeG1tNyxYTU1XT1JEWzQ4K3IxMV0KKwlqbnoJTkVBUiAkTCRlbmNfbG9vcAorCW1vdmRxYQl4bW03LFhNTVdPUkRbNjQrcjExXQorCWptcAlORUFSICRMJGVuY19sb29wCitBTElHTgkxNgorJEwkZW5jX2RvbmU6CisJbW92ZHFhCXhtbTcsWE1NV09SRFtyMTFdCisJbW92ZHFhCXhtbTgsWE1NV09SRFsxNityMTFdCisJbW92ZHFhCXhtbTkseG1tMQorCXBzcmxxCXhtbTEsMQorCW1vdmRxYQl4bW0xMCx4bW0yCisJcHNybHEJeG1tMiwxCisJcHhvcgl4bW0xLHhtbTQKKwlweG9yCXhtbTIseG1tNgorCXBhbmQJeG1tMSx4bW03CisJcGFuZAl4bW0yLHhtbTcKKwlweG9yCXhtbTQseG1tMQorCXBzbGxxCXhtbTEsMQorCXB4b3IJeG1tNix4bW0yCisJcHNsbHEJeG1tMiwxCisJcHhvcgl4bW0xLHhtbTkKKwlweG9yCXhtbTIseG1tMTAKKwltb3ZkcWEJeG1tOSx4bW0zCisJcHNybHEJeG1tMywxCisJbW92ZHFhCXhtbTEwLHhtbTE1CisJcHNybHEJeG1tMTUsMQorCXB4b3IJeG1tMyx4bW01CisJcHhvcgl4bW0xNSx4bW0wCisJcGFuZAl4bW0zLHhtbTcKKwlwYW5kCXhtbTE1LHhtbTcKKwlweG9yCXhtbTUseG1tMworCXBzbGxxCXhtbTMsMQorCXB4b3IJeG1tMCx4bW0xNQorCXBzbGxxCXhtbTE1LDEKKwlweG9yCXhtbTMseG1tOQorCXB4b3IJeG1tMTUseG1tMTAKKwltb3ZkcWEJeG1tNyxYTU1XT1JEWzMyK3IxMV0KKwltb3ZkcWEJeG1tOSx4bW02CisJcHNybHEJeG1tNiwyCisJbW92ZHFhCXhtbTEwLHhtbTIKKwlwc3JscQl4bW0yLDIKKwlweG9yCXhtbTYseG1tNAorCXB4b3IJeG1tMix4bW0xCisJcGFuZAl4bW02LHhtbTgKKwlwYW5kCXhtbTIseG1tOAorCXB4b3IJeG1tNCx4bW02CisJcHNsbHEJeG1tNiwyCisJcHhvcgl4bW0xLHhtbTIKKwlwc2xscQl4bW0yLDIKKwlweG9yCXhtbTYseG1tOQorCXB4b3IJeG1tMix4bW0xMAorCW1vdmRxYQl4bW05LHhtbTAKKwlwc3JscQl4bW0wLDIKKwltb3ZkcWEJeG1tMTAseG1tMTUKKwlwc3JscQl4bW0xNSwyCisJcHhvcgl4bW0wLHhtbTUKKwlweG9yCXhtbTE1LHhtbTMKKwlwYW5kCXhtbTAseG1tOAorCXBhbmQJeG1tMTUseG1tOAorCXB4b3IJeG1tNSx4bW0wCisJcHNsbHEJeG1tMCwyCisJcHhvcgl4bW0zLHhtbTE1CisJcHNsbHEJeG1tMTUsMgorCXB4b3IJeG1tMCx4bW05CisJcHhvcgl4bW0xNSx4bW0xMAorCW1vdmRxYQl4bW05LHhtbTUKKwlwc3JscQl4bW01LDQKKwltb3ZkcWEJeG1tMTAseG1tMworCXBzcmxxCXhtbTMsNAorCXB4b3IJeG1tNSx4bW00CisJcHhvcgl4bW0zLHhtbTEKKwlwYW5kCXhtbTUseG1tNworCXBhbmQJeG1tMyx4bW03CisJcHhvcgl4bW00LHhtbTUKKwlwc2xscQl4bW01LDQKKwlweG9yCXhtbTEseG1tMworCXBzbGxxCXhtbTMsNAorCXB4b3IJeG1tNSx4bW05CisJcHhvcgl4bW0zLHhtbTEwCisJbW92ZHFhCXhtbTkseG1tMAorCXBzcmxxCXhtbTAsNAorCW1vdmRxYQl4bW0xMCx4bW0xNQorCXBzcmxxCXhtbTE1LDQKKwlweG9yCXhtbTAseG1tNgorCXB4b3IJeG1tMTUseG1tMgorCXBhbmQJeG1tMCx4bW03CisJcGFuZAl4bW0xNSx4bW03CisJcHhvcgl4bW02LHhtbTAKKwlwc2xscQl4bW0wLDQKKwlweG9yCXhtbTIseG1tMTUKKwlwc2xscQl4bW0xNSw0CisJcHhvcgl4bW0wLHhtbTkKKwlweG9yCXhtbTE1LHhtbTEwCisJbW92ZHFhCXhtbTcsWE1NV09SRFtyYXhdCisJcHhvcgl4bW0zLHhtbTcKKwlweG9yCXhtbTUseG1tNworCXB4b3IJeG1tMix4bW03CisJcHhvcgl4bW02LHhtbTcKKwlweG9yCXhtbTEseG1tNworCXB4b3IJeG1tNCx4bW03CisJcHhvcgl4bW0xNSx4bW03CisJcHhvcgl4bW0wLHhtbTcKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKK0FMSUdOCTY0CitfYnNhZXNfZGVjcnlwdDg6CisJbGVhCXIxMSxbJEwkQlMwXQorCisJbW92ZHFhCXhtbTgsWE1NV09SRFtyYXhdCisJbGVhCXJheCxbMTYrcmF4XQorCW1vdmRxYQl4bW03LFhNTVdPUkRbKCgtNDgpKStyMTFdCisJcHhvcgl4bW0xNSx4bW04CisJcHhvcgl4bW0wLHhtbTgKKwlweG9yCXhtbTEseG1tOAorCXB4b3IJeG1tMix4bW04CitEQgkxMDIsNjgsMTUsNTYsMCwyNTUKK0RCCTEwMiwxNSw1NiwwLDE5OQorCXB4b3IJeG1tMyx4bW04CisJcHhvcgl4bW00LHhtbTgKK0RCCTEwMiwxNSw1NiwwLDIwNworREIJMTAyLDE1LDU2LDAsMjE1CisJcHhvcgl4bW01LHhtbTgKKwlweG9yCXhtbTYseG1tOAorREIJMTAyLDE1LDU2LDAsMjIzCitEQgkxMDIsMTUsNTYsMCwyMzEKK0RCCTEwMiwxNSw1NiwwLDIzOQorREIJMTAyLDE1LDU2LDAsMjQ3CisJbW92ZHFhCXhtbTcsWE1NV09SRFtyMTFdCisJbW92ZHFhCXhtbTgsWE1NV09SRFsxNityMTFdCisJbW92ZHFhCXhtbTkseG1tNQorCXBzcmxxCXhtbTUsMQorCW1vdmRxYQl4bW0xMCx4bW0zCisJcHNybHEJeG1tMywxCisJcHhvcgl4bW01LHhtbTYKKwlweG9yCXhtbTMseG1tNAorCXBhbmQJeG1tNSx4bW03CisJcGFuZAl4bW0zLHhtbTcKKwlweG9yCXhtbTYseG1tNQorCXBzbGxxCXhtbTUsMQorCXB4b3IJeG1tNCx4bW0zCisJcHNsbHEJeG1tMywxCisJcHhvcgl4bW01LHhtbTkKKwlweG9yCXhtbTMseG1tMTAKKwltb3ZkcWEJeG1tOSx4bW0xCisJcHNybHEJeG1tMSwxCisJbW92ZHFhCXhtbTEwLHhtbTE1CisJcHNybHEJeG1tMTUsMQorCXB4b3IJeG1tMSx4bW0yCisJcHhvcgl4bW0xNSx4bW0wCisJcGFuZAl4bW0xLHhtbTcKKwlwYW5kCXhtbTE1LHhtbTcKKwlweG9yCXhtbTIseG1tMQorCXBzbGxxCXhtbTEsMQorCXB4b3IJeG1tMCx4bW0xNQorCXBzbGxxCXhtbTE1LDEKKwlweG9yCXhtbTEseG1tOQorCXB4b3IJeG1tMTUseG1tMTAKKwltb3ZkcWEJeG1tNyxYTU1XT1JEWzMyK3IxMV0KKwltb3ZkcWEJeG1tOSx4bW00CisJcHNybHEJeG1tNCwyCisJbW92ZHFhCXhtbTEwLHhtbTMKKwlwc3JscQl4bW0zLDIKKwlweG9yCXhtbTQseG1tNgorCXB4b3IJeG1tMyx4bW01CisJcGFuZAl4bW00LHhtbTgKKwlwYW5kCXhtbTMseG1tOAorCXB4b3IJeG1tNix4bW00CisJcHNsbHEJeG1tNCwyCisJcHhvcgl4bW01LHhtbTMKKwlwc2xscQl4bW0zLDIKKwlweG9yCXhtbTQseG1tOQorCXB4b3IJeG1tMyx4bW0xMAorCW1vdmRxYQl4bW05LHhtbTAKKwlwc3JscQl4bW0wLDIKKwltb3ZkcWEJeG1tMTAseG1tMTUKKwlwc3JscQl4bW0xNSwyCisJcHhvcgl4bW0wLHhtbTIKKwlweG9yCXhtbTE1LHhtbTEKKwlwYW5kCXhtbTAseG1tOAorCXBhbmQJeG1tMTUseG1tOAorCXB4b3IJeG1tMix4bW0wCisJcHNsbHEJeG1tMCwyCisJcHhvcgl4bW0xLHhtbTE1CisJcHNsbHEJeG1tMTUsMgorCXB4b3IJeG1tMCx4bW05CisJcHhvcgl4bW0xNSx4bW0xMAorCW1vdmRxYQl4bW05LHhtbTIKKwlwc3JscQl4bW0yLDQKKwltb3ZkcWEJeG1tMTAseG1tMQorCXBzcmxxCXhtbTEsNAorCXB4b3IJeG1tMix4bW02CisJcHhvcgl4bW0xLHhtbTUKKwlwYW5kCXhtbTIseG1tNworCXBhbmQJeG1tMSx4bW03CisJcHhvcgl4bW02LHhtbTIKKwlwc2xscQl4bW0yLDQKKwlweG9yCXhtbTUseG1tMQorCXBzbGxxCXhtbTEsNAorCXB4b3IJeG1tMix4bW05CisJcHhvcgl4bW0xLHhtbTEwCisJbW92ZHFhCXhtbTkseG1tMAorCXBzcmxxCXhtbTAsNAorCW1vdmRxYQl4bW0xMCx4bW0xNQorCXBzcmxxCXhtbTE1LDQKKwlweG9yCXhtbTAseG1tNAorCXB4b3IJeG1tMTUseG1tMworCXBhbmQJeG1tMCx4bW03CisJcGFuZAl4bW0xNSx4bW03CisJcHhvcgl4bW00LHhtbTAKKwlwc2xscQl4bW0wLDQKKwlweG9yCXhtbTMseG1tMTUKKwlwc2xscQl4bW0xNSw0CisJcHhvcgl4bW0wLHhtbTkKKwlweG9yCXhtbTE1LHhtbTEwCisJZGVjCXIxMGQKKwlqbXAJTkVBUiAkTCRkZWNfc2JveAorQUxJR04JMTYKKyRMJGRlY19sb29wOgorCXB4b3IJeG1tMTUsWE1NV09SRFtyYXhdCisJcHhvcgl4bW0wLFhNTVdPUkRbMTYrcmF4XQorCXB4b3IJeG1tMSxYTU1XT1JEWzMyK3JheF0KKwlweG9yCXhtbTIsWE1NV09SRFs0OCtyYXhdCitEQgkxMDIsNjgsMTUsNTYsMCwyNTUKK0RCCTEwMiwxNSw1NiwwLDE5OQorCXB4b3IJeG1tMyxYTU1XT1JEWzY0K3JheF0KKwlweG9yCXhtbTQsWE1NV09SRFs4MCtyYXhdCitEQgkxMDIsMTUsNTYsMCwyMDcKK0RCCTEwMiwxNSw1NiwwLDIxNQorCXB4b3IJeG1tNSxYTU1XT1JEWzk2K3JheF0KKwlweG9yCXhtbTYsWE1NV09SRFsxMTIrcmF4XQorREIJMTAyLDE1LDU2LDAsMjIzCitEQgkxMDIsMTUsNTYsMCwyMzEKK0RCCTEwMiwxNSw1NiwwLDIzOQorREIJMTAyLDE1LDU2LDAsMjQ3CisJbGVhCXJheCxbMTI4K3JheF0KKyRMJGRlY19zYm94OgorCXB4b3IJeG1tMix4bW0zCisKKwlweG9yCXhtbTMseG1tNgorCXB4b3IJeG1tMSx4bW02CisJcHhvcgl4bW01LHhtbTMKKwlweG9yCXhtbTYseG1tNQorCXB4b3IJeG1tMCx4bW02CisKKwlweG9yCXhtbTE1LHhtbTAKKwlweG9yCXhtbTEseG1tNAorCXB4b3IJeG1tMix4bW0xNQorCXB4b3IJeG1tNCx4bW0xNQorCXB4b3IJeG1tMCx4bW0yCisJbW92ZHFhCXhtbTEwLHhtbTIKKwltb3ZkcWEJeG1tOSx4bW02CisJbW92ZHFhCXhtbTgseG1tMAorCW1vdmRxYQl4bW0xMix4bW0zCisJbW92ZHFhCXhtbTExLHhtbTQKKworCXB4b3IJeG1tMTAseG1tMTUKKwlweG9yCXhtbTkseG1tMworCXB4b3IJeG1tOCx4bW01CisJbW92ZHFhCXhtbTEzLHhtbTEwCisJcHhvcgl4bW0xMix4bW0xNQorCW1vdmRxYQl4bW03LHhtbTkKKwlweG9yCXhtbTExLHhtbTEKKwltb3ZkcWEJeG1tMTQseG1tMTAKKworCXBvcgl4bW05LHhtbTgKKwlwb3IJeG1tMTAseG1tMTEKKwlweG9yCXhtbTE0LHhtbTcKKwlwYW5kCXhtbTEzLHhtbTExCisJcHhvcgl4bW0xMSx4bW04CisJcGFuZAl4bW03LHhtbTgKKwlwYW5kCXhtbTE0LHhtbTExCisJbW92ZHFhCXhtbTExLHhtbTUKKwlweG9yCXhtbTExLHhtbTEKKwlwYW5kCXhtbTEyLHhtbTExCisJcHhvcgl4bW0xMCx4bW0xMgorCXB4b3IJeG1tOSx4bW0xMgorCW1vdmRxYQl4bW0xMix4bW0yCisJbW92ZHFhCXhtbTExLHhtbTAKKwlweG9yCXhtbTEyLHhtbTYKKwlweG9yCXhtbTExLHhtbTQKKwltb3ZkcWEJeG1tOCx4bW0xMgorCXBhbmQJeG1tMTIseG1tMTEKKwlwb3IJeG1tOCx4bW0xMQorCXB4b3IJeG1tNyx4bW0xMgorCXB4b3IJeG1tMTAseG1tMTQKKwlweG9yCXhtbTkseG1tMTMKKwlweG9yCXhtbTgseG1tMTQKKwltb3ZkcWEJeG1tMTEseG1tMworCXB4b3IJeG1tNyx4bW0xMworCW1vdmRxYQl4bW0xMix4bW0xNQorCXB4b3IJeG1tOCx4bW0xMworCW1vdmRxYQl4bW0xMyx4bW02CisJcGFuZAl4bW0xMSx4bW01CisJbW92ZHFhCXhtbTE0LHhtbTIKKwlwYW5kCXhtbTEyLHhtbTEKKwlwYW5kCXhtbTEzLHhtbTAKKwlwb3IJeG1tMTQseG1tNAorCXB4b3IJeG1tMTAseG1tMTEKKwlweG9yCXhtbTkseG1tMTIKKwlweG9yCXhtbTgseG1tMTMKKwlweG9yCXhtbTcseG1tMTQKKworCisKKworCisJbW92ZHFhCXhtbTExLHhtbTEwCisJcGFuZAl4bW0xMCx4bW04CisJcHhvcgl4bW0xMSx4bW05CisKKwltb3ZkcWEJeG1tMTMseG1tNworCW1vdmRxYQl4bW0xNCx4bW0xMQorCXB4b3IJeG1tMTMseG1tMTAKKwlwYW5kCXhtbTE0LHhtbTEzCisKKwltb3ZkcWEJeG1tMTIseG1tOAorCXB4b3IJeG1tMTQseG1tOQorCXB4b3IJeG1tMTIseG1tNworCisJcHhvcgl4bW0xMCx4bW05CisKKwlwYW5kCXhtbTEyLHhtbTEwCisKKwltb3ZkcWEJeG1tOSx4bW0xMworCXB4b3IJeG1tMTIseG1tNworCisJcHhvcgl4bW05LHhtbTEyCisJcHhvcgl4bW04LHhtbTEyCisKKwlwYW5kCXhtbTkseG1tNworCisJcHhvcgl4bW0xMyx4bW05CisJcHhvcgl4bW04LHhtbTkKKworCXBhbmQJeG1tMTMseG1tMTQKKworCXB4b3IJeG1tMTMseG1tMTEKKwltb3ZkcWEJeG1tMTEseG1tNAorCW1vdmRxYQl4bW03LHhtbTAKKwltb3ZkcWEJeG1tOSx4bW0xNAorCXB4b3IJeG1tOSx4bW0xMworCXBhbmQJeG1tOSx4bW00CisJcHhvcgl4bW00LHhtbTAKKwlwYW5kCXhtbTAseG1tMTQKKwlwYW5kCXhtbTQseG1tMTMKKwlweG9yCXhtbTQseG1tMAorCXB4b3IJeG1tMCx4bW05CisJcHhvcgl4bW0xMSx4bW0xCisJcHhvcgl4bW03LHhtbTUKKwlweG9yCXhtbTE0LHhtbTEyCisJcHhvcgl4bW0xMyx4bW04CisJbW92ZHFhCXhtbTEwLHhtbTE0CisJbW92ZHFhCXhtbTkseG1tMTIKKwlweG9yCXhtbTEwLHhtbTEzCisJcHhvcgl4bW05LHhtbTgKKwlwYW5kCXhtbTEwLHhtbTExCisJcGFuZAl4bW05LHhtbTEKKwlweG9yCXhtbTExLHhtbTcKKwlweG9yCXhtbTEseG1tNQorCXBhbmQJeG1tNyx4bW0xNAorCXBhbmQJeG1tNSx4bW0xMgorCXBhbmQJeG1tMTEseG1tMTMKKwlwYW5kCXhtbTEseG1tOAorCXB4b3IJeG1tNyx4bW0xMQorCXB4b3IJeG1tMSx4bW01CisJcHhvcgl4bW0xMSx4bW0xMAorCXB4b3IJeG1tNSx4bW05CisJcHhvcgl4bW00LHhtbTExCisJcHhvcgl4bW0xLHhtbTExCisJcHhvcgl4bW0wLHhtbTcKKwlweG9yCXhtbTUseG1tNworCisJbW92ZHFhCXhtbTExLHhtbTIKKwltb3ZkcWEJeG1tNyx4bW02CisJcHhvcgl4bW0xMSx4bW0xNQorCXB4b3IJeG1tNyx4bW0zCisJbW92ZHFhCXhtbTEwLHhtbTE0CisJbW92ZHFhCXhtbTkseG1tMTIKKwlweG9yCXhtbTEwLHhtbTEzCisJcHhvcgl4bW05LHhtbTgKKwlwYW5kCXhtbTEwLHhtbTExCisJcGFuZAl4bW05LHhtbTE1CisJcHhvcgl4bW0xMSx4bW03CisJcHhvcgl4bW0xNSx4bW0zCisJcGFuZAl4bW03LHhtbTE0CisJcGFuZAl4bW0zLHhtbTEyCisJcGFuZAl4bW0xMSx4bW0xMworCXBhbmQJeG1tMTUseG1tOAorCXB4b3IJeG1tNyx4bW0xMQorCXB4b3IJeG1tMTUseG1tMworCXB4b3IJeG1tMTEseG1tMTAKKwlweG9yCXhtbTMseG1tOQorCXB4b3IJeG1tMTQseG1tMTIKKwlweG9yCXhtbTEzLHhtbTgKKwltb3ZkcWEJeG1tMTAseG1tMTQKKwlweG9yCXhtbTEwLHhtbTEzCisJcGFuZAl4bW0xMCx4bW0yCisJcHhvcgl4bW0yLHhtbTYKKwlwYW5kCXhtbTYseG1tMTQKKwlwYW5kCXhtbTIseG1tMTMKKwlweG9yCXhtbTIseG1tNgorCXB4b3IJeG1tNix4bW0xMAorCXB4b3IJeG1tMix4bW0xMQorCXB4b3IJeG1tMTUseG1tMTEKKwlweG9yCXhtbTYseG1tNworCXB4b3IJeG1tMyx4bW03CisJcHhvcgl4bW0wLHhtbTYKKwlweG9yCXhtbTUseG1tNAorCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTEseG1tNgorCXB4b3IJeG1tNCx4bW02CisJcHhvcgl4bW0zLHhtbTEKKwlweG9yCXhtbTYseG1tMTUKKwlweG9yCXhtbTMseG1tNAorCXB4b3IJeG1tMix4bW01CisJcHhvcgl4bW01LHhtbTAKKwlweG9yCXhtbTIseG1tMworCisJcHhvcgl4bW0zLHhtbTE1CisJcHhvcgl4bW02LHhtbTIKKwlkZWMJcjEwZAorCWpsCU5FQVIgJEwkZGVjX2RvbmUKKworCXBzaHVmZAl4bW03LHhtbTE1LDB4NEUKKwlwc2h1ZmQJeG1tMTMseG1tMiwweDRFCisJcHhvcgl4bW03LHhtbTE1CisJcHNodWZkCXhtbTE0LHhtbTQsMHg0RQorCXB4b3IJeG1tMTMseG1tMgorCXBzaHVmZAl4bW04LHhtbTAsMHg0RQorCXB4b3IJeG1tMTQseG1tNAorCXBzaHVmZAl4bW05LHhtbTUsMHg0RQorCXB4b3IJeG1tOCx4bW0wCisJcHNodWZkCXhtbTEwLHhtbTMsMHg0RQorCXB4b3IJeG1tOSx4bW01CisJcHhvcgl4bW0xNSx4bW0xMworCXB4b3IJeG1tMCx4bW0xMworCXBzaHVmZAl4bW0xMSx4bW0xLDB4NEUKKwlweG9yCXhtbTEwLHhtbTMKKwlweG9yCXhtbTUseG1tNworCXB4b3IJeG1tMyx4bW04CisJcHNodWZkCXhtbTEyLHhtbTYsMHg0RQorCXB4b3IJeG1tMTEseG1tMQorCXB4b3IJeG1tMCx4bW0xNAorCXB4b3IJeG1tMSx4bW05CisJcHhvcgl4bW0xMix4bW02CisKKwlweG9yCXhtbTUseG1tMTQKKwlweG9yCXhtbTMseG1tMTMKKwlweG9yCXhtbTEseG1tMTMKKwlweG9yCXhtbTYseG1tMTAKKwlweG9yCXhtbTIseG1tMTEKKwlweG9yCXhtbTEseG1tMTQKKwlweG9yCXhtbTYseG1tMTQKKwlweG9yCXhtbTQseG1tMTIKKwlwc2h1ZmQJeG1tNyx4bW0xNSwweDkzCisJcHNodWZkCXhtbTgseG1tMCwweDkzCisJcHhvcgl4bW0xNSx4bW03CisJcHNodWZkCXhtbTkseG1tNSwweDkzCisJcHhvcgl4bW0wLHhtbTgKKwlwc2h1ZmQJeG1tMTAseG1tMywweDkzCisJcHhvcgl4bW01LHhtbTkKKwlwc2h1ZmQJeG1tMTEseG1tMSwweDkzCisJcHhvcgl4bW0zLHhtbTEwCisJcHNodWZkCXhtbTEyLHhtbTYsMHg5MworCXB4b3IJeG1tMSx4bW0xMQorCXBzaHVmZAl4bW0xMyx4bW0yLDB4OTMKKwlweG9yCXhtbTYseG1tMTIKKwlwc2h1ZmQJeG1tMTQseG1tNCwweDkzCisJcHhvcgl4bW0yLHhtbTEzCisJcHhvcgl4bW00LHhtbTE0CisKKwlweG9yCXhtbTgseG1tMTUKKwlweG9yCXhtbTcseG1tNAorCXB4b3IJeG1tOCx4bW00CisJcHNodWZkCXhtbTE1LHhtbTE1LDB4NEUKKwlweG9yCXhtbTkseG1tMAorCXBzaHVmZAl4bW0wLHhtbTAsMHg0RQorCXB4b3IJeG1tMTIseG1tMQorCXB4b3IJeG1tMTUseG1tNworCXB4b3IJeG1tMTMseG1tNgorCXB4b3IJeG1tMCx4bW04CisJcHhvcgl4bW0xMSx4bW0zCisJcHNodWZkCXhtbTcseG1tMSwweDRFCisJcHhvcgl4bW0xNCx4bW0yCisJcHNodWZkCXhtbTgseG1tNiwweDRFCisJcHhvcgl4bW0xMCx4bW01CisJcHNodWZkCXhtbTEseG1tMywweDRFCisJcHhvcgl4bW0xMCx4bW00CisJcHNodWZkCXhtbTYseG1tNCwweDRFCisJcHhvcgl4bW0xMSx4bW00CisJcHNodWZkCXhtbTMseG1tMiwweDRFCisJcHhvcgl4bW03LHhtbTExCisJcHNodWZkCXhtbTIseG1tNSwweDRFCisJcHhvcgl4bW04LHhtbTEyCisJcHhvcgl4bW0xMCx4bW0xCisJcHhvcgl4bW02LHhtbTE0CisJcHhvcgl4bW0xMyx4bW0zCisJbW92ZHFhCXhtbTMseG1tNworCXB4b3IJeG1tMix4bW05CisJbW92ZHFhCXhtbTUseG1tMTMKKwltb3ZkcWEJeG1tNCx4bW04CisJbW92ZHFhCXhtbTEseG1tMgorCW1vdmRxYQl4bW0yLHhtbTEwCisJbW92ZHFhCXhtbTcsWE1NV09SRFsoKC0xNikpK3IxMV0KKwlqbnoJTkVBUiAkTCRkZWNfbG9vcAorCW1vdmRxYQl4bW03LFhNTVdPUkRbKCgtMzIpKStyMTFdCisJam1wCU5FQVIgJEwkZGVjX2xvb3AKK0FMSUdOCTE2CiskTCRkZWNfZG9uZToKKwltb3ZkcWEJeG1tNyxYTU1XT1JEW3IxMV0KKwltb3ZkcWEJeG1tOCxYTU1XT1JEWzE2K3IxMV0KKwltb3ZkcWEJeG1tOSx4bW0yCisJcHNybHEJeG1tMiwxCisJbW92ZHFhCXhtbTEwLHhtbTEKKwlwc3JscQl4bW0xLDEKKwlweG9yCXhtbTIseG1tNAorCXB4b3IJeG1tMSx4bW02CisJcGFuZAl4bW0yLHhtbTcKKwlwYW5kCXhtbTEseG1tNworCXB4b3IJeG1tNCx4bW0yCisJcHNsbHEJeG1tMiwxCisJcHhvcgl4bW02LHhtbTEKKwlwc2xscQl4bW0xLDEKKwlweG9yCXhtbTIseG1tOQorCXB4b3IJeG1tMSx4bW0xMAorCW1vdmRxYQl4bW05LHhtbTUKKwlwc3JscQl4bW01LDEKKwltb3ZkcWEJeG1tMTAseG1tMTUKKwlwc3JscQl4bW0xNSwxCisJcHhvcgl4bW01LHhtbTMKKwlweG9yCXhtbTE1LHhtbTAKKwlwYW5kCXhtbTUseG1tNworCXBhbmQJeG1tMTUseG1tNworCXB4b3IJeG1tMyx4bW01CisJcHNsbHEJeG1tNSwxCisJcHhvcgl4bW0wLHhtbTE1CisJcHNsbHEJeG1tMTUsMQorCXB4b3IJeG1tNSx4bW05CisJcHhvcgl4bW0xNSx4bW0xMAorCW1vdmRxYQl4bW03LFhNTVdPUkRbMzIrcjExXQorCW1vdmRxYQl4bW05LHhtbTYKKwlwc3JscQl4bW02LDIKKwltb3ZkcWEJeG1tMTAseG1tMQorCXBzcmxxCXhtbTEsMgorCXB4b3IJeG1tNix4bW00CisJcHhvcgl4bW0xLHhtbTIKKwlwYW5kCXhtbTYseG1tOAorCXBhbmQJeG1tMSx4bW04CisJcHhvcgl4bW00LHhtbTYKKwlwc2xscQl4bW02LDIKKwlweG9yCXhtbTIseG1tMQorCXBzbGxxCXhtbTEsMgorCXB4b3IJeG1tNix4bW05CisJcHhvcgl4bW0xLHhtbTEwCisJbW92ZHFhCXhtbTkseG1tMAorCXBzcmxxCXhtbTAsMgorCW1vdmRxYQl4bW0xMCx4bW0xNQorCXBzcmxxCXhtbTE1LDIKKwlweG9yCXhtbTAseG1tMworCXB4b3IJeG1tMTUseG1tNQorCXBhbmQJeG1tMCx4bW04CisJcGFuZAl4bW0xNSx4bW04CisJcHhvcgl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDIKKwlweG9yCXhtbTUseG1tMTUKKwlwc2xscQl4bW0xNSwyCisJcHhvcgl4bW0wLHhtbTkKKwlweG9yCXhtbTE1LHhtbTEwCisJbW92ZHFhCXhtbTkseG1tMworCXBzcmxxCXhtbTMsNAorCW1vdmRxYQl4bW0xMCx4bW01CisJcHNybHEJeG1tNSw0CisJcHhvcgl4bW0zLHhtbTQKKwlweG9yCXhtbTUseG1tMgorCXBhbmQJeG1tMyx4bW03CisJcGFuZAl4bW01LHhtbTcKKwlweG9yCXhtbTQseG1tMworCXBzbGxxCXhtbTMsNAorCXB4b3IJeG1tMix4bW01CisJcHNsbHEJeG1tNSw0CisJcHhvcgl4bW0zLHhtbTkKKwlweG9yCXhtbTUseG1tMTAKKwltb3ZkcWEJeG1tOSx4bW0wCisJcHNybHEJeG1tMCw0CisJbW92ZHFhCXhtbTEwLHhtbTE1CisJcHNybHEJeG1tMTUsNAorCXB4b3IJeG1tMCx4bW02CisJcHhvcgl4bW0xNSx4bW0xCisJcGFuZAl4bW0wLHhtbTcKKwlwYW5kCXhtbTE1LHhtbTcKKwlweG9yCXhtbTYseG1tMAorCXBzbGxxCXhtbTAsNAorCXB4b3IJeG1tMSx4bW0xNQorCXBzbGxxCXhtbTE1LDQKKwlweG9yCXhtbTAseG1tOQorCXB4b3IJeG1tMTUseG1tMTAKKwltb3ZkcWEJeG1tNyxYTU1XT1JEW3JheF0KKwlweG9yCXhtbTUseG1tNworCXB4b3IJeG1tMyx4bW03CisJcHhvcgl4bW0xLHhtbTcKKwlweG9yCXhtbTYseG1tNworCXB4b3IJeG1tMix4bW03CisJcHhvcgl4bW00LHhtbTcKKwlweG9yCXhtbTE1LHhtbTcKKwlweG9yCXhtbTAseG1tNworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTE2CitfYnNhZXNfa2V5X2NvbnZlcnQ6CisJbGVhCXIxMSxbJEwkbWFza3NdCisJbW92ZHF1CXhtbTcsWE1NV09SRFtyY3hdCisJbGVhCXJjeCxbMTYrcmN4XQorCW1vdmRxYQl4bW0wLFhNTVdPUkRbcjExXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbMTYrcjExXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbMzIrcjExXQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbNDgrcjExXQorCW1vdmRxYQl4bW00LFhNTVdPUkRbNjQrcjExXQorCXBjbXBlcWQJeG1tNSx4bW01CisKKwltb3ZkcXUJeG1tNixYTU1XT1JEW3JjeF0KKwltb3ZkcWEJWE1NV09SRFtyYXhdLHhtbTcKKwlsZWEJcmF4LFsxNityYXhdCisJZGVjCXIxMGQKKwlqbXAJTkVBUiAkTCRrZXlfbG9vcAorQUxJR04JMTYKKyRMJGtleV9sb29wOgorREIJMTAyLDE1LDU2LDAsMjQ0CisKKwltb3ZkcWEJeG1tOCx4bW0wCisJbW92ZHFhCXhtbTkseG1tMQorCisJcGFuZAl4bW04LHhtbTYKKwlwYW5kCXhtbTkseG1tNgorCW1vdmRxYQl4bW0xMCx4bW0yCisJcGNtcGVxYgl4bW04LHhtbTAKKwlwc2xscQl4bW0wLDQKKwltb3ZkcWEJeG1tMTEseG1tMworCXBjbXBlcWIJeG1tOSx4bW0xCisJcHNsbHEJeG1tMSw0CisKKwlwYW5kCXhtbTEwLHhtbTYKKwlwYW5kCXhtbTExLHhtbTYKKwltb3ZkcWEJeG1tMTIseG1tMAorCXBjbXBlcWIJeG1tMTAseG1tMgorCXBzbGxxCXhtbTIsNAorCW1vdmRxYQl4bW0xMyx4bW0xCisJcGNtcGVxYgl4bW0xMSx4bW0zCisJcHNsbHEJeG1tMyw0CisKKwltb3ZkcWEJeG1tMTQseG1tMgorCW1vdmRxYQl4bW0xNSx4bW0zCisJcHhvcgl4bW04LHhtbTUKKwlweG9yCXhtbTkseG1tNQorCisJcGFuZAl4bW0xMix4bW02CisJcGFuZAl4bW0xMyx4bW02CisJbW92ZHFhCVhNTVdPUkRbcmF4XSx4bW04CisJcGNtcGVxYgl4bW0xMix4bW0wCisJcHNybHEJeG1tMCw0CisJbW92ZHFhCVhNTVdPUkRbMTYrcmF4XSx4bW05CisJcGNtcGVxYgl4bW0xMyx4bW0xCisJcHNybHEJeG1tMSw0CisJbGVhCXJjeCxbMTYrcmN4XQorCisJcGFuZAl4bW0xNCx4bW02CisJcGFuZAl4bW0xNSx4bW02CisJbW92ZHFhCVhNTVdPUkRbMzIrcmF4XSx4bW0xMAorCXBjbXBlcWIJeG1tMTQseG1tMgorCXBzcmxxCXhtbTIsNAorCW1vdmRxYQlYTU1XT1JEWzQ4K3JheF0seG1tMTEKKwlwY21wZXFiCXhtbTE1LHhtbTMKKwlwc3JscQl4bW0zLDQKKwltb3ZkcXUJeG1tNixYTU1XT1JEW3JjeF0KKworCXB4b3IJeG1tMTMseG1tNQorCXB4b3IJeG1tMTQseG1tNQorCW1vdmRxYQlYTU1XT1JEWzY0K3JheF0seG1tMTIKKwltb3ZkcWEJWE1NV09SRFs4MCtyYXhdLHhtbTEzCisJbW92ZHFhCVhNTVdPUkRbOTYrcmF4XSx4bW0xNAorCW1vdmRxYQlYTU1XT1JEWzExMityYXhdLHhtbTE1CisJbGVhCXJheCxbMTI4K3JheF0KKwlkZWMJcjEwZAorCWpueglORUFSICRMJGtleV9sb29wCisKKwltb3ZkcWEJeG1tNyxYTU1XT1JEWzgwK3IxMV0KKworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitFWFRFUk4JYWVzX25vaHdfY2JjX2VuY3J5cHQKK2dsb2JhbAlic2Flc19jYmNfZW5jcnlwdAorCitBTElHTgkxNgorYnNhZXNfY2JjX2VuY3J5cHQ6CisKKwltb3YJcjExZCxEV09SRFs0OCtyc3BdCisJY21wCXIxMWQsMAorCWpuZQlORUFSIGFlc19ub2h3X2NiY19lbmNyeXB0CisJY21wCXI4LDEyOAorCWpiCU5FQVIgYWVzX25vaHdfY2JjX2VuY3J5cHQKKworCW1vdglyYXgscnNwCiskTCRjYmNfZGVjX3Byb2xvZ3VlOgorCXB1c2gJcmJwCisKKwlwdXNoCXJieAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCWxlYQlyc3AsWygoLTcyKSkrcnNwXQorCisJbW92CXIxMCxRV09SRFsxNjArcnNwXQorCWxlYQlyc3AsWygoLTE2MCkpK3JzcF0KKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW05CisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWzE2MCtyc3BdLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbMTc2K3JzcF0seG1tMTMKKwltb3ZhcHMJWE1NV09SRFsxOTIrcnNwXSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWzIwOCtyc3BdLHhtbTE1CiskTCRjYmNfZGVjX2JvZHk6CisJbW92CXJicCxyc3AKKworCW1vdgllYXgsRFdPUkRbMjQwK3I5XQorCW1vdglyMTIscmN4CisJbW92CXIxMyxyZHgKKwltb3YJcjE0LHI4CisJbW92CXIxNSxyOQorCW1vdglyYngscjEwCisJc2hyCXIxNCw0CisKKwltb3YJZWR4LGVheAorCXNobAlyYXgsNworCXN1YglyYXgsOTYKKwlzdWIJcnNwLHJheAorCisJbW92CXJheCxyc3AKKwltb3YJcmN4LHIxNQorCW1vdglyMTBkLGVkeAorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgl4bW03LFhNTVdPUkRbcnNwXQorCW1vdmRxYQlYTU1XT1JEW3JheF0seG1tNgorCW1vdmRxYQlYTU1XT1JEW3JzcF0seG1tNworCisJbW92ZHF1CXhtbTE0LFhNTVdPUkRbcmJ4XQorCXN1YglyMTQsOAorJEwkY2JjX2RlY19sb29wOgorCW1vdmRxdQl4bW0xNSxYTU1XT1JEW3IxMl0KKwltb3ZkcXUJeG1tMCxYTU1XT1JEWzE2K3IxMl0KKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzMyK3IxMl0KKwltb3ZkcXUJeG1tMixYTU1XT1JEWzQ4K3IxMl0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzY0K3IxMl0KKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzgwK3IxMl0KKwltb3YJcmF4LHJzcAorCW1vdmRxdQl4bW01LFhNTVdPUkRbOTYrcjEyXQorCW1vdglyMTBkLGVkeAorCW1vdmRxdQl4bW02LFhNTVdPUkRbMTEyK3IxMl0KKwltb3ZkcWEJWE1NV09SRFszMityYnBdLHhtbTE0CisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgl4bW0xNSxYTU1XT1JEWzMyK3JicF0KKwltb3ZkcXUJeG1tNyxYTU1XT1JEW3IxMl0KKwltb3ZkcXUJeG1tOCxYTU1XT1JEWzE2K3IxMl0KKwlweG9yCXhtbTAseG1tNworCW1vdmRxdQl4bW05LFhNTVdPUkRbMzIrcjEyXQorCXB4b3IJeG1tNSx4bW04CisJbW92ZHF1CXhtbTEwLFhNTVdPUkRbNDgrcjEyXQorCXB4b3IJeG1tMyx4bW05CisJbW92ZHF1CXhtbTExLFhNTVdPUkRbNjQrcjEyXQorCXB4b3IJeG1tMSx4bW0xMAorCW1vdmRxdQl4bW0xMixYTU1XT1JEWzgwK3IxMl0KKwlweG9yCXhtbTYseG1tMTEKKwltb3ZkcXUJeG1tMTMsWE1NV09SRFs5NityMTJdCisJcHhvcgl4bW0yLHhtbTEyCisJbW92ZHF1CXhtbTE0LFhNTVdPUkRbMTEyK3IxMl0KKwlweG9yCXhtbTQseG1tMTMKKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJbGVhCXIxMixbMTI4K3IxMl0KKwltb3ZkcXUJWE1NV09SRFsxNityMTNdLHhtbTAKKwltb3ZkcXUJWE1NV09SRFszMityMTNdLHhtbTUKKwltb3ZkcXUJWE1NV09SRFs0OCtyMTNdLHhtbTMKKwltb3ZkcXUJWE1NV09SRFs2NCtyMTNdLHhtbTEKKwltb3ZkcXUJWE1NV09SRFs4MCtyMTNdLHhtbTYKKwltb3ZkcXUJWE1NV09SRFs5NityMTNdLHhtbTIKKwltb3ZkcXUJWE1NV09SRFsxMTIrcjEzXSx4bW00CisJbGVhCXIxMyxbMTI4K3IxM10KKwlzdWIJcjE0LDgKKwlqbmMJTkVBUiAkTCRjYmNfZGVjX2xvb3AKKworCWFkZAlyMTQsOAorCWp6CU5FQVIgJEwkY2JjX2RlY19kb25lCisKKwltb3ZkcXUJeG1tMTUsWE1NV09SRFtyMTJdCisJbW92CXJheCxyc3AKKwltb3YJcjEwZCxlZHgKKwljbXAJcjE0LDIKKwlqYglORUFSICRMJGNiY19kZWNfb25lCisJbW92ZHF1CXhtbTAsWE1NV09SRFsxNityMTJdCisJamUJTkVBUiAkTCRjYmNfZGVjX3R3bworCW1vdmRxdQl4bW0xLFhNTVdPUkRbMzIrcjEyXQorCWNtcAlyMTQsNAorCWpiCU5FQVIgJEwkY2JjX2RlY190aHJlZQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbNDgrcjEyXQorCWplCU5FQVIgJEwkY2JjX2RlY19mb3VyCisJbW92ZHF1CXhtbTMsWE1NV09SRFs2NCtyMTJdCisJY21wCXIxNCw2CisJamIJTkVBUiAkTCRjYmNfZGVjX2ZpdmUKKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzgwK3IxMl0KKwlqZQlORUFSICRMJGNiY19kZWNfc2l4CisJbW92ZHF1CXhtbTUsWE1NV09SRFs5NityMTJdCisJbW92ZHFhCVhNTVdPUkRbMzIrcmJwXSx4bW0xNAorCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisJcHhvcgl4bW0xNSxYTU1XT1JEWzMyK3JicF0KKwltb3ZkcXUJeG1tNyxYTU1XT1JEW3IxMl0KKwltb3ZkcXUJeG1tOCxYTU1XT1JEWzE2K3IxMl0KKwlweG9yCXhtbTAseG1tNworCW1vdmRxdQl4bW05LFhNTVdPUkRbMzIrcjEyXQorCXB4b3IJeG1tNSx4bW04CisJbW92ZHF1CXhtbTEwLFhNTVdPUkRbNDgrcjEyXQorCXB4b3IJeG1tMyx4bW05CisJbW92ZHF1CXhtbTExLFhNTVdPUkRbNjQrcjEyXQorCXB4b3IJeG1tMSx4bW0xMAorCW1vdmRxdQl4bW0xMixYTU1XT1JEWzgwK3IxMl0KKwlweG9yCXhtbTYseG1tMTEKKwltb3ZkcXUJeG1tMTQsWE1NV09SRFs5NityMTJdCisJcHhvcgl4bW0yLHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCW1vdmRxdQlYTU1XT1JEWzMyK3IxM10seG1tNQorCW1vdmRxdQlYTU1XT1JEWzQ4K3IxM10seG1tMworCW1vdmRxdQlYTU1XT1JEWzY0K3IxM10seG1tMQorCW1vdmRxdQlYTU1XT1JEWzgwK3IxM10seG1tNgorCW1vdmRxdQlYTU1XT1JEWzk2K3IxM10seG1tMgorCWptcAlORUFSICRMJGNiY19kZWNfZG9uZQorQUxJR04JMTYKKyRMJGNiY19kZWNfc2l4OgorCW1vdmRxYQlYTU1XT1JEWzMyK3JicF0seG1tMTQKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCXB4b3IJeG1tMTUsWE1NV09SRFszMityYnBdCisJbW92ZHF1CXhtbTcsWE1NV09SRFtyMTJdCisJbW92ZHF1CXhtbTgsWE1NV09SRFsxNityMTJdCisJcHhvcgl4bW0wLHhtbTcKKwltb3ZkcXUJeG1tOSxYTU1XT1JEWzMyK3IxMl0KKwlweG9yCXhtbTUseG1tOAorCW1vdmRxdQl4bW0xMCxYTU1XT1JEWzQ4K3IxMl0KKwlweG9yCXhtbTMseG1tOQorCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzY0K3IxMl0KKwlweG9yCXhtbTEseG1tMTAKKwltb3ZkcXUJeG1tMTQsWE1NV09SRFs4MCtyMTJdCisJcHhvcgl4bW02LHhtbTExCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCW1vdmRxdQlYTU1XT1JEWzMyK3IxM10seG1tNQorCW1vdmRxdQlYTU1XT1JEWzQ4K3IxM10seG1tMworCW1vdmRxdQlYTU1XT1JEWzY0K3IxM10seG1tMQorCW1vdmRxdQlYTU1XT1JEWzgwK3IxM10seG1tNgorCWptcAlORUFSICRMJGNiY19kZWNfZG9uZQorQUxJR04JMTYKKyRMJGNiY19kZWNfZml2ZToKKwltb3ZkcWEJWE1NV09SRFszMityYnBdLHhtbTE0CisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCXhtbTE1LFhNTVdPUkRbMzIrcmJwXQorCW1vdmRxdQl4bW03LFhNTVdPUkRbcjEyXQorCW1vdmRxdQl4bW04LFhNTVdPUkRbMTYrcjEyXQorCXB4b3IJeG1tMCx4bW03CisJbW92ZHF1CXhtbTksWE1NV09SRFszMityMTJdCisJcHhvcgl4bW01LHhtbTgKKwltb3ZkcXUJeG1tMTAsWE1NV09SRFs0OCtyMTJdCisJcHhvcgl4bW0zLHhtbTkKKwltb3ZkcXUJeG1tMTQsWE1NV09SRFs2NCtyMTJdCisJcHhvcgl4bW0xLHhtbTEwCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCW1vdmRxdQlYTU1XT1JEWzMyK3IxM10seG1tNQorCW1vdmRxdQlYTU1XT1JEWzQ4K3IxM10seG1tMworCW1vdmRxdQlYTU1XT1JEWzY0K3IxM10seG1tMQorCWptcAlORUFSICRMJGNiY19kZWNfZG9uZQorQUxJR04JMTYKKyRMJGNiY19kZWNfZm91cjoKKwltb3ZkcWEJWE1NV09SRFszMityYnBdLHhtbTE0CisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCXhtbTE1LFhNTVdPUkRbMzIrcmJwXQorCW1vdmRxdQl4bW03LFhNTVdPUkRbcjEyXQorCW1vdmRxdQl4bW04LFhNTVdPUkRbMTYrcjEyXQorCXB4b3IJeG1tMCx4bW03CisJbW92ZHF1CXhtbTksWE1NV09SRFszMityMTJdCisJcHhvcgl4bW01LHhtbTgKKwltb3ZkcXUJeG1tMTQsWE1NV09SRFs0OCtyMTJdCisJcHhvcgl4bW0zLHhtbTkKKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJbW92ZHF1CVhNTVdPUkRbMTYrcjEzXSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbMzIrcjEzXSx4bW01CisJbW92ZHF1CVhNTVdPUkRbNDgrcjEzXSx4bW0zCisJam1wCU5FQVIgJEwkY2JjX2RlY19kb25lCitBTElHTgkxNgorJEwkY2JjX2RlY190aHJlZToKKwltb3ZkcWEJWE1NV09SRFszMityYnBdLHhtbTE0CisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKwlweG9yCXhtbTE1LFhNTVdPUkRbMzIrcmJwXQorCW1vdmRxdQl4bW03LFhNTVdPUkRbcjEyXQorCW1vdmRxdQl4bW04LFhNTVdPUkRbMTYrcjEyXQorCXB4b3IJeG1tMCx4bW03CisJbW92ZHF1CXhtbTE0LFhNTVdPUkRbMzIrcjEyXQorCXB4b3IJeG1tNSx4bW04CisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCW1vdmRxdQlYTU1XT1JEWzMyK3IxM10seG1tNQorCWptcAlORUFSICRMJGNiY19kZWNfZG9uZQorQUxJR04JMTYKKyRMJGNiY19kZWNfdHdvOgorCW1vdmRxYQlYTU1XT1JEWzMyK3JicF0seG1tMTQKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCXB4b3IJeG1tMTUsWE1NV09SRFszMityYnBdCisJbW92ZHF1CXhtbTcsWE1NV09SRFtyMTJdCisJbW92ZHF1CXhtbTE0LFhNTVdPUkRbMTYrcjEyXQorCXB4b3IJeG1tMCx4bW03CisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCWptcAlORUFSICRMJGNiY19kZWNfZG9uZQorQUxJR04JMTYKKyRMJGNiY19kZWNfb25lOgorCWxlYQlyY3gsW3IxMl0KKwlsZWEJcmR4LFszMityYnBdCisJbGVhCXI4LFtyMTVdCisJY2FsbAlhZXNfbm9od19kZWNyeXB0CisJcHhvcgl4bW0xNCxYTU1XT1JEWzMyK3JicF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE0CisJbW92ZHFhCXhtbTE0LHhtbTE1CisKKyRMJGNiY19kZWNfZG9uZToKKwltb3ZkcXUJWE1NV09SRFtyYnhdLHhtbTE0CisJbGVhCXJheCxbcnNwXQorCXB4b3IJeG1tMCx4bW0wCiskTCRjYmNfZGVjX2J6ZXJvOgorCW1vdmRxYQlYTU1XT1JEW3JheF0seG1tMAorCW1vdmRxYQlYTU1XT1JEWzE2K3JheF0seG1tMAorCWxlYQlyYXgsWzMyK3JheF0KKwljbXAJcmJwLHJheAorCWphCU5FQVIgJEwkY2JjX2RlY19iemVybworCisJbGVhCXJheCxbMTIwK3JicF0KKworCW1vdmFwcwl4bW02LFhNTVdPUkRbNjQrcmJwXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbODArcmJwXQorCW1vdmFwcwl4bW04LFhNTVdPUkRbOTYrcmJwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbMTEyK3JicF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFsxMjgrcmJwXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzE0NCtyYnBdCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbMTYwK3JicF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsxNzYrcmJwXQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWzE5MityYnBdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbMjA4K3JicF0KKwlsZWEJcmF4LFsxNjArcmF4XQorJEwkY2JjX2RlY190YWlsOgorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisKKwltb3YJcmJ4LFFXT1JEWygoLTE2KSkrcmF4XQorCisJbW92CXJicCxRV09SRFsoKC04KSkrcmF4XQorCisJbGVhCXJzcCxbcmF4XQorCiskTCRjYmNfZGVjX2VwaWxvZ3VlOgorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworZ2xvYmFsCWJzYWVzX2N0cjMyX2VuY3J5cHRfYmxvY2tzCisKK0FMSUdOCTE2Citic2Flc19jdHIzMl9lbmNyeXB0X2Jsb2NrczoKKworCW1vdglyYXgscnNwCiskTCRjdHJfZW5jX3Byb2xvZ3VlOgorCXB1c2gJcmJwCisKKwlwdXNoCXJieAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCWxlYQlyc3AsWygoLTcyKSkrcnNwXQorCisJbW92CXIxMCxRV09SRFsxNjArcnNwXQorCWxlYQlyc3AsWygoLTE2MCkpK3JzcF0KKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW05CisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWzE2MCtyc3BdLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbMTc2K3JzcF0seG1tMTMKKwltb3ZhcHMJWE1NV09SRFsxOTIrcnNwXSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWzIwOCtyc3BdLHhtbTE1CiskTCRjdHJfZW5jX2JvZHk6CisJbW92CXJicCxyc3AKKworCW1vdmRxdQl4bW0wLFhNTVdPUkRbcjEwXQorCW1vdgllYXgsRFdPUkRbMjQwK3I5XQorCW1vdglyMTIscmN4CisJbW92CXIxMyxyZHgKKwltb3YJcjE0LHI4CisJbW92CXIxNSxyOQorCW1vdmRxYQlYTU1XT1JEWzMyK3JicF0seG1tMAorCWNtcAlyOCw4CisJamIJTkVBUiAkTCRjdHJfZW5jX3Nob3J0CisKKwltb3YJZWJ4LGVheAorCXNobAlyYXgsNworCXN1YglyYXgsOTYKKwlzdWIJcnNwLHJheAorCisJbW92CXJheCxyc3AKKwltb3YJcmN4LHIxNQorCW1vdglyMTBkLGVieAorCWNhbGwJX2JzYWVzX2tleV9jb252ZXJ0CisJcHhvcgl4bW03LHhtbTYKKwltb3ZkcWEJWE1NV09SRFtyYXhdLHhtbTcKKworCW1vdmRxYQl4bW04LFhNTVdPUkRbcnNwXQorCWxlYQlyMTEsWyRMJEFERDFdCisJbW92ZHFhCXhtbTE1LFhNTVdPUkRbMzIrcmJwXQorCW1vdmRxYQl4bW03LFhNTVdPUkRbKCgtMzIpKStyMTFdCitEQgkxMDIsNjgsMTUsNTYsMCwxOTkKK0RCCTEwMiw2OCwxNSw1NiwwLDI1NQorCW1vdmRxYQlYTU1XT1JEW3JzcF0seG1tOAorCWptcAlORUFSICRMJGN0cl9lbmNfbG9vcAorQUxJR04JMTYKKyRMJGN0cl9lbmNfbG9vcDoKKwltb3ZkcWEJWE1NV09SRFszMityYnBdLHhtbTE1CisJbW92ZHFhCXhtbTAseG1tMTUKKwltb3ZkcWEJeG1tMSx4bW0xNQorCXBhZGRkCXhtbTAsWE1NV09SRFtyMTFdCisJbW92ZHFhCXhtbTIseG1tMTUKKwlwYWRkZAl4bW0xLFhNTVdPUkRbMTYrcjExXQorCW1vdmRxYQl4bW0zLHhtbTE1CisJcGFkZGQJeG1tMixYTU1XT1JEWzMyK3IxMV0KKwltb3ZkcWEJeG1tNCx4bW0xNQorCXBhZGRkCXhtbTMsWE1NV09SRFs0OCtyMTFdCisJbW92ZHFhCXhtbTUseG1tMTUKKwlwYWRkZAl4bW00LFhNTVdPUkRbNjQrcjExXQorCW1vdmRxYQl4bW02LHhtbTE1CisJcGFkZGQJeG1tNSxYTU1XT1JEWzgwK3IxMV0KKwlwYWRkZAl4bW02LFhNTVdPUkRbOTYrcjExXQorCisKKworCW1vdmRxYQl4bW04LFhNTVdPUkRbcnNwXQorCWxlYQlyYXgsWzE2K3JzcF0KKwltb3ZkcWEJeG1tNyxYTU1XT1JEWygoLTE2KSkrcjExXQorCXB4b3IJeG1tMTUseG1tOAorCXB4b3IJeG1tMCx4bW04CisJcHhvcgl4bW0xLHhtbTgKKwlweG9yCXhtbTIseG1tOAorREIJMTAyLDY4LDE1LDU2LDAsMjU1CitEQgkxMDIsMTUsNTYsMCwxOTkKKwlweG9yCXhtbTMseG1tOAorCXB4b3IJeG1tNCx4bW04CitEQgkxMDIsMTUsNTYsMCwyMDcKK0RCCTEwMiwxNSw1NiwwLDIxNQorCXB4b3IJeG1tNSx4bW04CisJcHhvcgl4bW02LHhtbTgKK0RCCTEwMiwxNSw1NiwwLDIyMworREIJMTAyLDE1LDU2LDAsMjMxCitEQgkxMDIsMTUsNTYsMCwyMzkKK0RCCTEwMiwxNSw1NiwwLDI0NworCWxlYQlyMTEsWyRMJEJTMF0KKwltb3YJcjEwZCxlYngKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4X2JpdHNsaWNlCisKKwlzdWIJcjE0LDgKKwlqYwlORUFSICRMJGN0cl9lbmNfbG9vcF9kb25lCisKKwltb3ZkcXUJeG1tNyxYTU1XT1JEW3IxMl0KKwltb3ZkcXUJeG1tOCxYTU1XT1JEWzE2K3IxMl0KKwltb3ZkcXUJeG1tOSxYTU1XT1JEWzMyK3IxMl0KKwltb3ZkcXUJeG1tMTAsWE1NV09SRFs0OCtyMTJdCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbNjQrcjEyXQorCW1vdmRxdQl4bW0xMixYTU1XT1JEWzgwK3IxMl0KKwltb3ZkcXUJeG1tMTMsWE1NV09SRFs5NityMTJdCisJbW92ZHF1CXhtbTE0LFhNTVdPUkRbMTEyK3IxMl0KKwlsZWEJcjEyLFsxMjgrcjEyXQorCXB4b3IJeG1tNyx4bW0xNQorCW1vdmRxYQl4bW0xNSxYTU1XT1JEWzMyK3JicF0KKwlweG9yCXhtbTAseG1tOAorCW1vdmRxdQlYTU1XT1JEW3IxM10seG1tNworCXB4b3IJeG1tMyx4bW05CisJbW92ZHF1CVhNTVdPUkRbMTYrcjEzXSx4bW0wCisJcHhvcgl4bW01LHhtbTEwCisJbW92ZHF1CVhNTVdPUkRbMzIrcjEzXSx4bW0zCisJcHhvcgl4bW0yLHhtbTExCisJbW92ZHF1CVhNTVdPUkRbNDgrcjEzXSx4bW01CisJcHhvcgl4bW02LHhtbTEyCisJbW92ZHF1CVhNTVdPUkRbNjQrcjEzXSx4bW0yCisJcHhvcgl4bW0xLHhtbTEzCisJbW92ZHF1CVhNTVdPUkRbODArcjEzXSx4bW02CisJcHhvcgl4bW00LHhtbTE0CisJbW92ZHF1CVhNTVdPUkRbOTYrcjEzXSx4bW0xCisJbGVhCXIxMSxbJEwkQUREMV0KKwltb3ZkcXUJWE1NV09SRFsxMTIrcjEzXSx4bW00CisJbGVhCXIxMyxbMTI4K3IxM10KKwlwYWRkZAl4bW0xNSxYTU1XT1JEWzExMityMTFdCisJam56CU5FQVIgJEwkY3RyX2VuY19sb29wCisKKwlqbXAJTkVBUiAkTCRjdHJfZW5jX2RvbmUKK0FMSUdOCTE2CiskTCRjdHJfZW5jX2xvb3BfZG9uZToKKwlhZGQJcjE0LDgKKwltb3ZkcXUJeG1tNyxYTU1XT1JEW3IxMl0KKwlweG9yCXhtbTE1LHhtbTcKKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJY21wCXIxNCwyCisJamIJTkVBUiAkTCRjdHJfZW5jX2RvbmUKKwltb3ZkcXUJeG1tOCxYTU1XT1JEWzE2K3IxMl0KKwlweG9yCXhtbTAseG1tOAorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCWplCU5FQVIgJEwkY3RyX2VuY19kb25lCisJbW92ZHF1CXhtbTksWE1NV09SRFszMityMTJdCisJcHhvcgl4bW0zLHhtbTkKKwltb3ZkcXUJWE1NV09SRFszMityMTNdLHhtbTMKKwljbXAJcjE0LDQKKwlqYglORUFSICRMJGN0cl9lbmNfZG9uZQorCW1vdmRxdQl4bW0xMCxYTU1XT1JEWzQ4K3IxMl0KKwlweG9yCXhtbTUseG1tMTAKKwltb3ZkcXUJWE1NV09SRFs0OCtyMTNdLHhtbTUKKwlqZQlORUFSICRMJGN0cl9lbmNfZG9uZQorCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzY0K3IxMl0KKwlweG9yCXhtbTIseG1tMTEKKwltb3ZkcXUJWE1NV09SRFs2NCtyMTNdLHhtbTIKKwljbXAJcjE0LDYKKwlqYglORUFSICRMJGN0cl9lbmNfZG9uZQorCW1vdmRxdQl4bW0xMixYTU1XT1JEWzgwK3IxMl0KKwlweG9yCXhtbTYseG1tMTIKKwltb3ZkcXUJWE1NV09SRFs4MCtyMTNdLHhtbTYKKwlqZQlORUFSICRMJGN0cl9lbmNfZG9uZQorCW1vdmRxdQl4bW0xMyxYTU1XT1JEWzk2K3IxMl0KKwlweG9yCXhtbTEseG1tMTMKKwltb3ZkcXUJWE1NV09SRFs5NityMTNdLHhtbTEKKwlqbXAJTkVBUiAkTCRjdHJfZW5jX2RvbmUKKworQUxJR04JMTYKKyRMJGN0cl9lbmNfc2hvcnQ6CisJbGVhCXJjeCxbMzIrcmJwXQorCWxlYQlyZHgsWzQ4K3JicF0KKwlsZWEJcjgsW3IxNV0KKwljYWxsCWFlc19ub2h3X2VuY3J5cHQKKwltb3ZkcXUJeG1tMCxYTU1XT1JEW3IxMl0KKwlsZWEJcjEyLFsxNityMTJdCisJbW92CWVheCxEV09SRFs0NCtyYnBdCisJYnN3YXAJZWF4CisJcHhvcgl4bW0wLFhNTVdPUkRbNDgrcmJwXQorCWluYwllYXgKKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTAKKwlic3dhcAllYXgKKwlsZWEJcjEzLFsxNityMTNdCisJbW92CURXT1JEWzQ0K3JzcF0sZWF4CisJZGVjCXIxNAorCWpueglORUFSICRMJGN0cl9lbmNfc2hvcnQKKworJEwkY3RyX2VuY19kb25lOgorCWxlYQlyYXgsW3JzcF0KKwlweG9yCXhtbTAseG1tMAorJEwkY3RyX2VuY19iemVybzoKKwltb3ZkcWEJWE1NV09SRFtyYXhdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsxNityYXhdLHhtbTAKKwlsZWEJcmF4LFszMityYXhdCisJY21wCXJicCxyYXgKKwlqYQlORUFSICRMJGN0cl9lbmNfYnplcm8KKworCWxlYQlyYXgsWzEyMCtyYnBdCisKKwltb3ZhcHMJeG1tNixYTU1XT1JEWzY0K3JicF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWzgwK3JicF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWzk2K3JicF0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWzExMityYnBdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbMTI4K3JicF0KKwltb3ZhcHMJeG1tMTEsWE1NV09SRFsxNDQrcmJwXQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWzE2MCtyYnBdCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTc2K3JicF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxOTIrcmJwXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzIwOCtyYnBdCisJbGVhCXJheCxbMTYwK3JheF0KKyRMJGN0cl9lbmNfdGFpbDoKKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcmF4XQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JheF0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyYXhdCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcmF4XQorCisJbW92CXJieCxRV09SRFsoKC0xNikpK3JheF0KKworCW1vdglyYnAsUVdPUkRbKCgtOCkpK3JheF0KKworCWxlYQlyc3AsW3JheF0KKworJEwkY3RyX2VuY19lcGlsb2d1ZToKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitnbG9iYWwJYnNhZXNfeHRzX2VuY3J5cHQKKworQUxJR04JMTYKK2JzYWVzX3h0c19lbmNyeXB0OgorCisJbW92CXJheCxyc3AKKyRMJHh0c19lbmNfcHJvbG9ndWU6CisJcHVzaAlyYnAKKworCXB1c2gJcmJ4CisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJbGVhCXJzcCxbKCgtNzIpKStyc3BdCisKKwltb3YJcjEwLFFXT1JEWzE2MCtyc3BdCisJbW92CXIxMSxRV09SRFsxNjgrcnNwXQorCWxlYQlyc3AsWygoLTE2MCkpK3JzcF0KKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW05CisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWzE2MCtyc3BdLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbMTc2K3JzcF0seG1tMTMKKwltb3ZhcHMJWE1NV09SRFsxOTIrcnNwXSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWzIwOCtyc3BdLHhtbTE1CiskTCR4dHNfZW5jX2JvZHk6CisJbW92CXJicCxyc3AKKworCW1vdglyMTIscmN4CisJbW92CXIxMyxyZHgKKwltb3YJcjE0LHI4CisJbW92CXIxNSxyOQorCisJbGVhCXJjeCxbcjExXQorCWxlYQlyZHgsWzMyK3JicF0KKwlsZWEJcjgsW3IxMF0KKwljYWxsCWFlc19ub2h3X2VuY3J5cHQKKworCW1vdgllYXgsRFdPUkRbMjQwK3IxNV0KKwltb3YJcmJ4LHIxNAorCisJbW92CWVkeCxlYXgKKwlzaGwJcmF4LDcKKwlzdWIJcmF4LDk2CisJc3ViCXJzcCxyYXgKKworCW1vdglyYXgscnNwCisJbW92CXJjeCxyMTUKKwltb3YJcjEwZCxlZHgKKwljYWxsCV9ic2Flc19rZXlfY29udmVydAorCXB4b3IJeG1tNyx4bW02CisJbW92ZHFhCVhNTVdPUkRbcmF4XSx4bW03CisKKwlhbmQJcjE0LC0xNgorCXN1Yglyc3AsMHg4MAorCW1vdmRxYQl4bW02LFhNTVdPUkRbMzIrcmJwXQorCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0xMixYTU1XT1JEWyRMJHh0c19tYWdpY10KKwlwY21wZ3RkCXhtbTE0LHhtbTYKKworCXN1YglyMTQsMHg4MAorCWpjCU5FQVIgJEwkeHRzX2VuY19zaG9ydAorCWptcAlORUFSICRMJHh0c19lbmNfbG9vcAorCitBTElHTgkxNgorJEwkeHRzX2VuY19sb29wOgorCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0xNSx4bW02CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0wLHhtbTYKKwltb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTYKKwlwYWRkcQl4bW02LHhtbTYKKwlwYW5kCXhtbTEzLHhtbTEyCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHhvcgl4bW02LHhtbTEzCisJbW92ZHF1CXhtbTcsWE1NV09SRFtyMTJdCisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTEseG1tNgorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tOCxYTU1XT1JEWzE2K3IxMl0KKwlweG9yCXhtbTE1LHhtbTcKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMix4bW02CisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW05LFhNTVdPUkRbMzIrcjEyXQorCXB4b3IJeG1tMCx4bW04CisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTMseG1tNgorCW1vdmRxYQlYTU1XT1JEWzY0K3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tMTAsWE1NV09SRFs0OCtyMTJdCisJcHhvcgl4bW0xLHhtbTkKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tNCx4bW02CisJbW92ZHFhCVhNTVdPUkRbODArcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzY0K3IxMl0KKwlweG9yCXhtbTIseG1tMTAKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tNSx4bW02CisJbW92ZHFhCVhNTVdPUkRbOTYrcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW0xMixYTU1XT1JEWzgwK3IxMl0KKwlweG9yCXhtbTMseG1tMTEKKwltb3ZkcXUJeG1tMTMsWE1NV09SRFs5NityMTJdCisJcHhvcgl4bW00LHhtbTEyCisJbW92ZHF1CXhtbTE0LFhNTVdPUkRbMTEyK3IxMl0KKwlsZWEJcjEyLFsxMjgrcjEyXQorCW1vdmRxYQlYTU1XT1JEWzExMityc3BdLHhtbTYKKwlweG9yCXhtbTUseG1tMTMKKwlsZWEJcmF4LFsxMjgrcnNwXQorCXB4b3IJeG1tNix4bW0xNAorCW1vdglyMTBkLGVkeAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJeG1tMTUsWE1NV09SRFtyc3BdCisJcHhvcgl4bW0wLFhNTVdPUkRbMTYrcnNwXQorCW1vdmRxdQlYTU1XT1JEW3IxM10seG1tMTUKKwlweG9yCXhtbTMsWE1NV09SRFszMityc3BdCisJbW92ZHF1CVhNTVdPUkRbMTYrcjEzXSx4bW0wCisJcHhvcgl4bW01LFhNTVdPUkRbNDgrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzMyK3IxM10seG1tMworCXB4b3IJeG1tMixYTU1XT1JEWzY0K3JzcF0KKwltb3ZkcXUJWE1NV09SRFs0OCtyMTNdLHhtbTUKKwlweG9yCXhtbTYsWE1NV09SRFs4MCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbNjQrcjEzXSx4bW0yCisJcHhvcgl4bW0xLFhNTVdPUkRbOTYrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzgwK3IxM10seG1tNgorCXB4b3IJeG1tNCxYTU1XT1JEWzExMityc3BdCisJbW92ZHF1CVhNTVdPUkRbOTYrcjEzXSx4bW0xCisJbW92ZHF1CVhNTVdPUkRbMTEyK3IxM10seG1tNAorCWxlYQlyMTMsWzEyOCtyMTNdCisKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzExMityc3BdCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0xMixYTU1XT1JEWyRMJHh0c19tYWdpY10KKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwlwYWRkcQl4bW02LHhtbTYKKwlwYW5kCXhtbTEzLHhtbTEyCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHhvcgl4bW02LHhtbTEzCisKKwlzdWIJcjE0LDB4ODAKKwlqbmMJTkVBUiAkTCR4dHNfZW5jX2xvb3AKKworJEwkeHRzX2VuY19zaG9ydDoKKwlhZGQJcjE0LDB4ODAKKwlqeglORUFSICRMJHh0c19lbmNfZG9uZQorCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0xNSx4bW02CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0wLHhtbTYKKwltb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTYKKwlwYWRkcQl4bW02LHhtbTYKKwlwYW5kCXhtbTEzLHhtbTEyCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHhvcgl4bW02LHhtbTEzCisJbW92ZHF1CXhtbTcsWE1NV09SRFtyMTJdCisJY21wCXIxNCwxNgorCWplCU5FQVIgJEwkeHRzX2VuY18xCisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTEseG1tNgorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tOCxYTU1XT1JEWzE2K3IxMl0KKwljbXAJcjE0LDMyCisJamUJTkVBUiAkTCR4dHNfZW5jXzIKKwlweG9yCXhtbTE1LHhtbTcKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMix4bW02CisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW05LFhNTVdPUkRbMzIrcjEyXQorCWNtcAlyMTQsNDgKKwlqZQlORUFSICRMJHh0c19lbmNfMworCXB4b3IJeG1tMCx4bW04CisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTMseG1tNgorCW1vdmRxYQlYTU1XT1JEWzY0K3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tMTAsWE1NV09SRFs0OCtyMTJdCisJY21wCXIxNCw2NAorCWplCU5FQVIgJEwkeHRzX2VuY180CisJcHhvcgl4bW0xLHhtbTkKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tNCx4bW02CisJbW92ZHFhCVhNTVdPUkRbODArcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzY0K3IxMl0KKwljbXAJcjE0LDgwCisJamUJTkVBUiAkTCR4dHNfZW5jXzUKKwlweG9yCXhtbTIseG1tMTAKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tNSx4bW02CisJbW92ZHFhCVhNTVdPUkRbOTYrcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW0xMixYTU1XT1JEWzgwK3IxMl0KKwljbXAJcjE0LDk2CisJamUJTkVBUiAkTCR4dHNfZW5jXzYKKwlweG9yCXhtbTMseG1tMTEKKwltb3ZkcXUJeG1tMTMsWE1NV09SRFs5NityMTJdCisJcHhvcgl4bW00LHhtbTEyCisJbW92ZHFhCVhNTVdPUkRbMTEyK3JzcF0seG1tNgorCWxlYQlyMTIsWzExMityMTJdCisJcHhvcgl4bW01LHhtbTEzCisJbGVhCXJheCxbMTI4K3JzcF0KKwltb3YJcjEwZCxlZHgKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCXhtbTE1LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMCxYTU1XT1JEWzE2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJcHhvcgl4bW0zLFhNTVdPUkRbMzIrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCXB4b3IJeG1tNSxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZkcXUJWE1NV09SRFszMityMTNdLHhtbTMKKwlweG9yCXhtbTIsWE1NV09SRFs2NCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbNDgrcjEzXSx4bW01CisJcHhvcgl4bW02LFhNTVdPUkRbODArcnNwXQorCW1vdmRxdQlYTU1XT1JEWzY0K3IxM10seG1tMgorCXB4b3IJeG1tMSxYTU1XT1JEWzk2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFs4MCtyMTNdLHhtbTYKKwltb3ZkcXUJWE1NV09SRFs5NityMTNdLHhtbTEKKwlsZWEJcjEzLFsxMTIrcjEzXQorCisJbW92ZHFhCXhtbTYsWE1NV09SRFsxMTIrcnNwXQorCWptcAlORUFSICRMJHh0c19lbmNfZG9uZQorQUxJR04JMTYKKyRMJHh0c19lbmNfNjoKKwlweG9yCXhtbTMseG1tMTEKKwlsZWEJcjEyLFs5NityMTJdCisJcHhvcgl4bW00LHhtbTEyCisJbGVhCXJheCxbMTI4K3JzcF0KKwltb3YJcjEwZCxlZHgKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCXhtbTE1LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMCxYTU1XT1JEWzE2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJcHhvcgl4bW0zLFhNTVdPUkRbMzIrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCXB4b3IJeG1tNSxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZkcXUJWE1NV09SRFszMityMTNdLHhtbTMKKwlweG9yCXhtbTIsWE1NV09SRFs2NCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbNDgrcjEzXSx4bW01CisJcHhvcgl4bW02LFhNTVdPUkRbODArcnNwXQorCW1vdmRxdQlYTU1XT1JEWzY0K3IxM10seG1tMgorCW1vdmRxdQlYTU1XT1JEWzgwK3IxM10seG1tNgorCWxlYQlyMTMsWzk2K3IxM10KKworCW1vdmRxYQl4bW02LFhNTVdPUkRbOTYrcnNwXQorCWptcAlORUFSICRMJHh0c19lbmNfZG9uZQorQUxJR04JMTYKKyRMJHh0c19lbmNfNToKKwlweG9yCXhtbTIseG1tMTAKKwlsZWEJcjEyLFs4MCtyMTJdCisJcHhvcgl4bW0zLHhtbTExCisJbGVhCXJheCxbMTI4K3JzcF0KKwltb3YJcjEwZCxlZHgKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCXhtbTE1LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMCxYTU1XT1JEWzE2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJcHhvcgl4bW0zLFhNTVdPUkRbMzIrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCXB4b3IJeG1tNSxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZkcXUJWE1NV09SRFszMityMTNdLHhtbTMKKwlweG9yCXhtbTIsWE1NV09SRFs2NCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbNDgrcjEzXSx4bW01CisJbW92ZHF1CVhNTVdPUkRbNjQrcjEzXSx4bW0yCisJbGVhCXIxMyxbODArcjEzXQorCisJbW92ZHFhCXhtbTYsWE1NV09SRFs4MCtyc3BdCisJam1wCU5FQVIgJEwkeHRzX2VuY19kb25lCitBTElHTgkxNgorJEwkeHRzX2VuY180OgorCXB4b3IJeG1tMSx4bW05CisJbGVhCXIxMixbNjQrcjEyXQorCXB4b3IJeG1tMix4bW0xMAorCWxlYQlyYXgsWzEyOCtyc3BdCisJbW92CXIxMGQsZWR4CisKKwljYWxsCV9ic2Flc19lbmNyeXB0OAorCisJcHhvcgl4bW0xNSxYTU1XT1JEW3JzcF0KKwlweG9yCXhtbTAsWE1NV09SRFsxNityc3BdCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCXB4b3IJeG1tMyxYTU1XT1JEWzMyK3JzcF0KKwltb3ZkcXUJWE1NV09SRFsxNityMTNdLHhtbTAKKwlweG9yCXhtbTUsWE1NV09SRFs0OCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbMzIrcjEzXSx4bW0zCisJbW92ZHF1CVhNTVdPUkRbNDgrcjEzXSx4bW01CisJbGVhCXIxMyxbNjQrcjEzXQorCisJbW92ZHFhCXhtbTYsWE1NV09SRFs2NCtyc3BdCisJam1wCU5FQVIgJEwkeHRzX2VuY19kb25lCitBTElHTgkxNgorJEwkeHRzX2VuY18zOgorCXB4b3IJeG1tMCx4bW04CisJbGVhCXIxMixbNDgrcjEyXQorCXB4b3IJeG1tMSx4bW05CisJbGVhCXJheCxbMTI4K3JzcF0KKwltb3YJcjEwZCxlZHgKKworCWNhbGwJX2JzYWVzX2VuY3J5cHQ4CisKKwlweG9yCXhtbTE1LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMCxYTU1XT1JEWzE2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJcHhvcgl4bW0zLFhNTVdPUkRbMzIrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCW1vdmRxdQlYTU1XT1JEWzMyK3IxM10seG1tMworCWxlYQlyMTMsWzQ4K3IxM10KKworCW1vdmRxYQl4bW02LFhNTVdPUkRbNDgrcnNwXQorCWptcAlORUFSICRMJHh0c19lbmNfZG9uZQorQUxJR04JMTYKKyRMJHh0c19lbmNfMjoKKwlweG9yCXhtbTE1LHhtbTcKKwlsZWEJcjEyLFszMityMTJdCisJcHhvcgl4bW0wLHhtbTgKKwlsZWEJcmF4LFsxMjgrcnNwXQorCW1vdglyMTBkLGVkeAorCisJY2FsbAlfYnNhZXNfZW5jcnlwdDgKKworCXB4b3IJeG1tMTUsWE1NV09SRFtyc3BdCisJcHhvcgl4bW0wLFhNTVdPUkRbMTYrcnNwXQorCW1vdmRxdQlYTU1XT1JEW3IxM10seG1tMTUKKwltb3ZkcXUJWE1NV09SRFsxNityMTNdLHhtbTAKKwlsZWEJcjEzLFszMityMTNdCisKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzMyK3JzcF0KKwlqbXAJTkVBUiAkTCR4dHNfZW5jX2RvbmUKK0FMSUdOCTE2CiskTCR4dHNfZW5jXzE6CisJcHhvcgl4bW03LHhtbTE1CisJbGVhCXIxMixbMTYrcjEyXQorCW1vdmRxYQlYTU1XT1JEWzMyK3JicF0seG1tNworCWxlYQlyY3gsWzMyK3JicF0KKwlsZWEJcmR4LFszMityYnBdCisJbGVhCXI4LFtyMTVdCisJY2FsbAlhZXNfbm9od19lbmNyeXB0CisJcHhvcgl4bW0xNSxYTU1XT1JEWzMyK3JicF0KKworCisKKworCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCWxlYQlyMTMsWzE2K3IxM10KKworCW1vdmRxYQl4bW02LFhNTVdPUkRbMTYrcnNwXQorCiskTCR4dHNfZW5jX2RvbmU6CisJYW5kCWVieCwxNQorCWp6CU5FQVIgJEwkeHRzX2VuY19yZXQKKwltb3YJcmR4LHIxMworCiskTCR4dHNfZW5jX3N0ZWFsOgorCW1vdnp4CWVheCxCWVRFW3IxMl0KKwltb3Z6eAllY3gsQllURVsoKC0xNikpK3JkeF0KKwlsZWEJcjEyLFsxK3IxMl0KKwltb3YJQllURVsoKC0xNikpK3JkeF0sYWwKKwltb3YJQllURVtyZHhdLGNsCisJbGVhCXJkeCxbMStyZHhdCisJc3ViCWVieCwxCisJam56CU5FQVIgJEwkeHRzX2VuY19zdGVhbAorCisJbW92ZHF1CXhtbTE1LFhNTVdPUkRbKCgtMTYpKStyMTNdCisJbGVhCXJjeCxbMzIrcmJwXQorCXB4b3IJeG1tMTUseG1tNgorCWxlYQlyZHgsWzMyK3JicF0KKwltb3ZkcWEJWE1NV09SRFszMityYnBdLHhtbTE1CisJbGVhCXI4LFtyMTVdCisJY2FsbAlhZXNfbm9od19lbmNyeXB0CisJcHhvcgl4bW02LFhNTVdPUkRbMzIrcmJwXQorCW1vdmRxdQlYTU1XT1JEWygtMTYpK3IxM10seG1tNgorCiskTCR4dHNfZW5jX3JldDoKKwlsZWEJcmF4LFtyc3BdCisJcHhvcgl4bW0wLHhtbTAKKyRMJHh0c19lbmNfYnplcm86CisJbW92ZHFhCVhNTVdPUkRbcmF4XSx4bW0wCisJbW92ZHFhCVhNTVdPUkRbMTYrcmF4XSx4bW0wCisJbGVhCXJheCxbMzIrcmF4XQorCWNtcAlyYnAscmF4CisJamEJTkVBUiAkTCR4dHNfZW5jX2J6ZXJvCisKKwlsZWEJcmF4LFsxMjArcmJwXQorCisJbW92YXBzCXhtbTYsWE1NV09SRFs2NCtyYnBdCisJbW92YXBzCXhtbTcsWE1NV09SRFs4MCtyYnBdCisJbW92YXBzCXhtbTgsWE1NV09SRFs5NityYnBdCisJbW92YXBzCXhtbTksWE1NV09SRFsxMTIrcmJwXQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWzEyOCtyYnBdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbMTQ0K3JicF0KKwltb3ZhcHMJeG1tMTIsWE1NV09SRFsxNjArcmJwXQorCW1vdmFwcwl4bW0xMyxYTU1XT1JEWzE3NityYnBdCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbMTkyK3JicF0KKwltb3ZhcHMJeG1tMTUsWE1NV09SRFsyMDgrcmJwXQorCWxlYQlyYXgsWzE2MCtyYXhdCiskTCR4dHNfZW5jX3RhaWw6CisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JheF0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKworCW1vdglyYngsUVdPUkRbKCgtMTYpKStyYXhdCisKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyYXhdCisKKwlsZWEJcnNwLFtyYXhdCisKKyRMJHh0c19lbmNfZXBpbG9ndWU6CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCitnbG9iYWwJYnNhZXNfeHRzX2RlY3J5cHQKKworQUxJR04JMTYKK2JzYWVzX3h0c19kZWNyeXB0OgorCisJbW92CXJheCxyc3AKKyRMJHh0c19kZWNfcHJvbG9ndWU6CisJcHVzaAlyYnAKKworCXB1c2gJcmJ4CisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJbGVhCXJzcCxbKCgtNzIpKStyc3BdCisKKwltb3YJcjEwLFFXT1JEWzE2MCtyc3BdCisJbW92CXIxMSxRV09SRFsxNjgrcnNwXQorCWxlYQlyc3AsWygoLTE2MCkpK3JzcF0KKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW05CisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWzE2MCtyc3BdLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbMTc2K3JzcF0seG1tMTMKKwltb3ZhcHMJWE1NV09SRFsxOTIrcnNwXSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWzIwOCtyc3BdLHhtbTE1CiskTCR4dHNfZGVjX2JvZHk6CisJbW92CXJicCxyc3AKKwltb3YJcjEyLHJjeAorCW1vdglyMTMscmR4CisJbW92CXIxNCxyOAorCW1vdglyMTUscjkKKworCWxlYQlyY3gsW3IxMV0KKwlsZWEJcmR4LFszMityYnBdCisJbGVhCXI4LFtyMTBdCisJY2FsbAlhZXNfbm9od19lbmNyeXB0CisKKwltb3YJZWF4LERXT1JEWzI0MCtyMTVdCisJbW92CXJieCxyMTQKKworCW1vdgllZHgsZWF4CisJc2hsCXJheCw3CisJc3ViCXJheCw5NgorCXN1Yglyc3AscmF4CisKKwltb3YJcmF4LHJzcAorCW1vdglyY3gscjE1CisJbW92CXIxMGQsZWR4CisJY2FsbAlfYnNhZXNfa2V5X2NvbnZlcnQKKwlweG9yCXhtbTcsWE1NV09SRFtyc3BdCisJbW92ZHFhCVhNTVdPUkRbcmF4XSx4bW02CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW03CisKKwl4b3IJZWF4LGVheAorCWFuZAlyMTQsLTE2CisJdGVzdAllYngsMTUKKwlzZXRueglhbAorCXNobAlyYXgsNAorCXN1YglyMTQscmF4CisKKwlzdWIJcnNwLDB4ODAKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzMyK3JicF0KKworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMTIsWE1NV09SRFskTCR4dHNfbWFnaWNdCisJcGNtcGd0ZAl4bW0xNCx4bW02CisKKwlzdWIJcjE0LDB4ODAKKwlqYwlORUFSICRMJHh0c19kZWNfc2hvcnQKKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2xvb3AKKworQUxJR04JMTYKKyRMJHh0c19kZWNfbG9vcDoKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMTUseG1tNgorCW1vdmRxYQlYTU1XT1JEW3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMCx4bW02CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW03LFhNTVdPUkRbcjEyXQorCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0xLHhtbTYKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTYKKwlwYWRkcQl4bW02LHhtbTYKKwlwYW5kCXhtbTEzLHhtbTEyCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHhvcgl4bW02LHhtbTEzCisJbW92ZHF1CXhtbTgsWE1NV09SRFsxNityMTJdCisJcHhvcgl4bW0xNSx4bW03CisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTIseG1tNgorCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tOSxYTU1XT1JEWzMyK3IxMl0KKwlweG9yCXhtbTAseG1tOAorCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0zLHhtbTYKKwltb3ZkcWEJWE1NV09SRFs2NCtyc3BdLHhtbTYKKwlwYWRkcQl4bW02LHhtbTYKKwlwYW5kCXhtbTEzLHhtbTEyCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHhvcgl4bW02LHhtbTEzCisJbW92ZHF1CXhtbTEwLFhNTVdPUkRbNDgrcjEyXQorCXB4b3IJeG1tMSx4bW05CisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTQseG1tNgorCW1vdmRxYQlYTU1XT1JEWzgwK3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tMTEsWE1NV09SRFs2NCtyMTJdCisJcHhvcgl4bW0yLHhtbTEwCisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTUseG1tNgorCW1vdmRxYQlYTU1XT1JEWzk2K3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tMTIsWE1NV09SRFs4MCtyMTJdCisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CXhtbTEzLFhNTVdPUkRbOTYrcjEyXQorCXB4b3IJeG1tNCx4bW0xMgorCW1vdmRxdQl4bW0xNCxYTU1XT1JEWzExMityMTJdCisJbGVhCXIxMixbMTI4K3IxMl0KKwltb3ZkcWEJWE1NV09SRFsxMTIrcnNwXSx4bW02CisJcHhvcgl4bW01LHhtbTEzCisJbGVhCXJheCxbMTI4K3JzcF0KKwlweG9yCXhtbTYseG1tMTQKKwltb3YJcjEwZCxlZHgKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCXhtbTE1LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMCxYTU1XT1JEWzE2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJcHhvcgl4bW01LFhNTVdPUkRbMzIrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzE2K3IxM10seG1tMAorCXB4b3IJeG1tMyxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZkcXUJWE1NV09SRFszMityMTNdLHhtbTUKKwlweG9yCXhtbTEsWE1NV09SRFs2NCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbNDgrcjEzXSx4bW0zCisJcHhvcgl4bW02LFhNTVdPUkRbODArcnNwXQorCW1vdmRxdQlYTU1XT1JEWzY0K3IxM10seG1tMQorCXB4b3IJeG1tMixYTU1XT1JEWzk2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFs4MCtyMTNdLHhtbTYKKwlweG9yCXhtbTQsWE1NV09SRFsxMTIrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzk2K3IxM10seG1tMgorCW1vdmRxdQlYTU1XT1JEWzExMityMTNdLHhtbTQKKwlsZWEJcjEzLFsxMjgrcjEzXQorCisJbW92ZHFhCXhtbTYsWE1NV09SRFsxMTIrcnNwXQorCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMTIsWE1NV09SRFskTCR4dHNfbWFnaWNdCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCisJc3ViCXIxNCwweDgwCisJam5jCU5FQVIgJEwkeHRzX2RlY19sb29wCisKKyRMJHh0c19kZWNfc2hvcnQ6CisJYWRkCXIxNCwweDgwCisJanoJTkVBUiAkTCR4dHNfZGVjX2RvbmUKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMTUseG1tNgorCW1vdmRxYQlYTU1XT1JEW3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwlwc2h1ZmQJeG1tMTMseG1tMTQsMHgxMworCXB4b3IJeG1tMTQseG1tMTQKKwltb3ZkcWEJeG1tMCx4bW02CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW02CisJcGFkZHEJeG1tNix4bW02CisJcGFuZAl4bW0xMyx4bW0xMgorCXBjbXBndGQJeG1tMTQseG1tNgorCXB4b3IJeG1tNix4bW0xMworCW1vdmRxdQl4bW03LFhNTVdPUkRbcjEyXQorCWNtcAlyMTQsMTYKKwlqZQlORUFSICRMJHh0c19kZWNfMQorCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0xLHhtbTYKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTYKKwlwYWRkcQl4bW02LHhtbTYKKwlwYW5kCXhtbTEzLHhtbTEyCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHhvcgl4bW02LHhtbTEzCisJbW92ZHF1CXhtbTgsWE1NV09SRFsxNityMTJdCisJY21wCXIxNCwzMgorCWplCU5FQVIgJEwkeHRzX2RlY18yCisJcHhvcgl4bW0xNSx4bW03CisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTIseG1tNgorCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tOSxYTU1XT1JEWzMyK3IxMl0KKwljbXAJcjE0LDQ4CisJamUJTkVBUiAkTCR4dHNfZGVjXzMKKwlweG9yCXhtbTAseG1tOAorCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJcHhvcgl4bW0xNCx4bW0xNAorCW1vdmRxYQl4bW0zLHhtbTYKKwltb3ZkcWEJWE1NV09SRFs2NCtyc3BdLHhtbTYKKwlwYWRkcQl4bW02LHhtbTYKKwlwYW5kCXhtbTEzLHhtbTEyCisJcGNtcGd0ZAl4bW0xNCx4bW02CisJcHhvcgl4bW02LHhtbTEzCisJbW92ZHF1CXhtbTEwLFhNTVdPUkRbNDgrcjEyXQorCWNtcAlyMTQsNjQKKwlqZQlORUFSICRMJHh0c19kZWNfNAorCXB4b3IJeG1tMSx4bW05CisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTQseG1tNgorCW1vdmRxYQlYTU1XT1JEWzgwK3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tMTEsWE1NV09SRFs2NCtyMTJdCisJY21wCXIxNCw4MAorCWplCU5FQVIgJEwkeHRzX2RlY181CisJcHhvcgl4bW0yLHhtbTEwCisJcHNodWZkCXhtbTEzLHhtbTE0LDB4MTMKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTUseG1tNgorCW1vdmRxYQlYTU1XT1JEWzk2K3JzcF0seG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwlwY21wZ3RkCXhtbTE0LHhtbTYKKwlweG9yCXhtbTYseG1tMTMKKwltb3ZkcXUJeG1tMTIsWE1NV09SRFs4MCtyMTJdCisJY21wCXIxNCw5NgorCWplCU5FQVIgJEwkeHRzX2RlY182CisJcHhvcgl4bW0zLHhtbTExCisJbW92ZHF1CXhtbTEzLFhNTVdPUkRbOTYrcjEyXQorCXB4b3IJeG1tNCx4bW0xMgorCW1vdmRxYQlYTU1XT1JEWzExMityc3BdLHhtbTYKKwlsZWEJcjEyLFsxMTIrcjEyXQorCXB4b3IJeG1tNSx4bW0xMworCWxlYQlyYXgsWzEyOCtyc3BdCisJbW92CXIxMGQsZWR4CisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgl4bW0xNSxYTU1XT1JEW3JzcF0KKwlweG9yCXhtbTAsWE1NV09SRFsxNityc3BdCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCXB4b3IJeG1tNSxYTU1XT1JEWzMyK3JzcF0KKwltb3ZkcXUJWE1NV09SRFsxNityMTNdLHhtbTAKKwlweG9yCXhtbTMsWE1NV09SRFs0OCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbMzIrcjEzXSx4bW01CisJcHhvcgl4bW0xLFhNTVdPUkRbNjQrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzQ4K3IxM10seG1tMworCXB4b3IJeG1tNixYTU1XT1JEWzgwK3JzcF0KKwltb3ZkcXUJWE1NV09SRFs2NCtyMTNdLHhtbTEKKwlweG9yCXhtbTIsWE1NV09SRFs5Nityc3BdCisJbW92ZHF1CVhNTVdPUkRbODArcjEzXSx4bW02CisJbW92ZHF1CVhNTVdPUkRbOTYrcjEzXSx4bW0yCisJbGVhCXIxMyxbMTEyK3IxM10KKworCW1vdmRxYQl4bW02LFhNTVdPUkRbMTEyK3JzcF0KKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2RvbmUKK0FMSUdOCTE2CiskTCR4dHNfZGVjXzY6CisJcHhvcgl4bW0zLHhtbTExCisJbGVhCXIxMixbOTYrcjEyXQorCXB4b3IJeG1tNCx4bW0xMgorCWxlYQlyYXgsWzEyOCtyc3BdCisJbW92CXIxMGQsZWR4CisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgl4bW0xNSxYTU1XT1JEW3JzcF0KKwlweG9yCXhtbTAsWE1NV09SRFsxNityc3BdCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCXB4b3IJeG1tNSxYTU1XT1JEWzMyK3JzcF0KKwltb3ZkcXUJWE1NV09SRFsxNityMTNdLHhtbTAKKwlweG9yCXhtbTMsWE1NV09SRFs0OCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbMzIrcjEzXSx4bW01CisJcHhvcgl4bW0xLFhNTVdPUkRbNjQrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzQ4K3IxM10seG1tMworCXB4b3IJeG1tNixYTU1XT1JEWzgwK3JzcF0KKwltb3ZkcXUJWE1NV09SRFs2NCtyMTNdLHhtbTEKKwltb3ZkcXUJWE1NV09SRFs4MCtyMTNdLHhtbTYKKwlsZWEJcjEzLFs5NityMTNdCisKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzk2K3JzcF0KKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2RvbmUKK0FMSUdOCTE2CiskTCR4dHNfZGVjXzU6CisJcHhvcgl4bW0yLHhtbTEwCisJbGVhCXIxMixbODArcjEyXQorCXB4b3IJeG1tMyx4bW0xMQorCWxlYQlyYXgsWzEyOCtyc3BdCisJbW92CXIxMGQsZWR4CisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgl4bW0xNSxYTU1XT1JEW3JzcF0KKwlweG9yCXhtbTAsWE1NV09SRFsxNityc3BdCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCXB4b3IJeG1tNSxYTU1XT1JEWzMyK3JzcF0KKwltb3ZkcXUJWE1NV09SRFsxNityMTNdLHhtbTAKKwlweG9yCXhtbTMsWE1NV09SRFs0OCtyc3BdCisJbW92ZHF1CVhNTVdPUkRbMzIrcjEzXSx4bW01CisJcHhvcgl4bW0xLFhNTVdPUkRbNjQrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzQ4K3IxM10seG1tMworCW1vdmRxdQlYTU1XT1JEWzY0K3IxM10seG1tMQorCWxlYQlyMTMsWzgwK3IxM10KKworCW1vdmRxYQl4bW02LFhNTVdPUkRbODArcnNwXQorCWptcAlORUFSICRMJHh0c19kZWNfZG9uZQorQUxJR04JMTYKKyRMJHh0c19kZWNfNDoKKwlweG9yCXhtbTEseG1tOQorCWxlYQlyMTIsWzY0K3IxMl0KKwlweG9yCXhtbTIseG1tMTAKKwlsZWEJcmF4LFsxMjgrcnNwXQorCW1vdglyMTBkLGVkeAorCisJY2FsbAlfYnNhZXNfZGVjcnlwdDgKKworCXB4b3IJeG1tMTUsWE1NV09SRFtyc3BdCisJcHhvcgl4bW0wLFhNTVdPUkRbMTYrcnNwXQorCW1vdmRxdQlYTU1XT1JEW3IxM10seG1tMTUKKwlweG9yCXhtbTUsWE1NV09SRFszMityc3BdCisJbW92ZHF1CVhNTVdPUkRbMTYrcjEzXSx4bW0wCisJcHhvcgl4bW0zLFhNTVdPUkRbNDgrcnNwXQorCW1vdmRxdQlYTU1XT1JEWzMyK3IxM10seG1tNQorCW1vdmRxdQlYTU1XT1JEWzQ4K3IxM10seG1tMworCWxlYQlyMTMsWzY0K3IxM10KKworCW1vdmRxYQl4bW02LFhNTVdPUkRbNjQrcnNwXQorCWptcAlORUFSICRMJHh0c19kZWNfZG9uZQorQUxJR04JMTYKKyRMJHh0c19kZWNfMzoKKwlweG9yCXhtbTAseG1tOAorCWxlYQlyMTIsWzQ4K3IxMl0KKwlweG9yCXhtbTEseG1tOQorCWxlYQlyYXgsWzEyOCtyc3BdCisJbW92CXIxMGQsZWR4CisKKwljYWxsCV9ic2Flc19kZWNyeXB0OAorCisJcHhvcgl4bW0xNSxYTU1XT1JEW3JzcF0KKwlweG9yCXhtbTAsWE1NV09SRFsxNityc3BdCisJbW92ZHF1CVhNTVdPUkRbcjEzXSx4bW0xNQorCXB4b3IJeG1tNSxYTU1XT1JEWzMyK3JzcF0KKwltb3ZkcXUJWE1NV09SRFsxNityMTNdLHhtbTAKKwltb3ZkcXUJWE1NV09SRFszMityMTNdLHhtbTUKKwlsZWEJcjEzLFs0OCtyMTNdCisKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzQ4K3JzcF0KKwlqbXAJTkVBUiAkTCR4dHNfZGVjX2RvbmUKK0FMSUdOCTE2CiskTCR4dHNfZGVjXzI6CisJcHhvcgl4bW0xNSx4bW03CisJbGVhCXIxMixbMzIrcjEyXQorCXB4b3IJeG1tMCx4bW04CisJbGVhCXJheCxbMTI4K3JzcF0KKwltb3YJcjEwZCxlZHgKKworCWNhbGwJX2JzYWVzX2RlY3J5cHQ4CisKKwlweG9yCXhtbTE1LFhNTVdPUkRbcnNwXQorCXB4b3IJeG1tMCxYTU1XT1JEWzE2K3JzcF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTE1CisJbW92ZHF1CVhNTVdPUkRbMTYrcjEzXSx4bW0wCisJbGVhCXIxMyxbMzIrcjEzXQorCisJbW92ZHFhCXhtbTYsWE1NV09SRFszMityc3BdCisJam1wCU5FQVIgJEwkeHRzX2RlY19kb25lCitBTElHTgkxNgorJEwkeHRzX2RlY18xOgorCXB4b3IJeG1tNyx4bW0xNQorCWxlYQlyMTIsWzE2K3IxMl0KKwltb3ZkcWEJWE1NV09SRFszMityYnBdLHhtbTcKKwlsZWEJcmN4LFszMityYnBdCisJbGVhCXJkeCxbMzIrcmJwXQorCWxlYQlyOCxbcjE1XQorCWNhbGwJYWVzX25vaHdfZGVjcnlwdAorCXB4b3IJeG1tMTUsWE1NV09SRFszMityYnBdCisKKworCisKKworCW1vdmRxdQlYTU1XT1JEW3IxM10seG1tMTUKKwlsZWEJcjEzLFsxNityMTNdCisKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzE2K3JzcF0KKworJEwkeHRzX2RlY19kb25lOgorCWFuZAllYngsMTUKKwlqeglORUFSICRMJHh0c19kZWNfcmV0CisKKwlweG9yCXhtbTE0LHhtbTE0CisJbW92ZHFhCXhtbTEyLFhNTVdPUkRbJEwkeHRzX21hZ2ljXQorCXBjbXBndGQJeG1tMTQseG1tNgorCXBzaHVmZAl4bW0xMyx4bW0xNCwweDEzCisJbW92ZHFhCXhtbTUseG1tNgorCXBhZGRxCXhtbTYseG1tNgorCXBhbmQJeG1tMTMseG1tMTIKKwltb3ZkcXUJeG1tMTUsWE1NV09SRFtyMTJdCisJcHhvcgl4bW02LHhtbTEzCisKKwlsZWEJcmN4LFszMityYnBdCisJcHhvcgl4bW0xNSx4bW02CisJbGVhCXJkeCxbMzIrcmJwXQorCW1vdmRxYQlYTU1XT1JEWzMyK3JicF0seG1tMTUKKwlsZWEJcjgsW3IxNV0KKwljYWxsCWFlc19ub2h3X2RlY3J5cHQKKwlweG9yCXhtbTYsWE1NV09SRFszMityYnBdCisJbW92CXJkeCxyMTMKKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTYKKworJEwkeHRzX2RlY19zdGVhbDoKKwltb3Z6eAllYXgsQllURVsxNityMTJdCisJbW92engJZWN4LEJZVEVbcmR4XQorCWxlYQlyMTIsWzErcjEyXQorCW1vdglCWVRFW3JkeF0sYWwKKwltb3YJQllURVsxNityZHhdLGNsCisJbGVhCXJkeCxbMStyZHhdCisJc3ViCWVieCwxCisJam56CU5FQVIgJEwkeHRzX2RlY19zdGVhbAorCisJbW92ZHF1CXhtbTE1LFhNTVdPUkRbcjEzXQorCWxlYQlyY3gsWzMyK3JicF0KKwlweG9yCXhtbTE1LHhtbTUKKwlsZWEJcmR4LFszMityYnBdCisJbW92ZHFhCVhNTVdPUkRbMzIrcmJwXSx4bW0xNQorCWxlYQlyOCxbcjE1XQorCWNhbGwJYWVzX25vaHdfZGVjcnlwdAorCXB4b3IJeG1tNSxYTU1XT1JEWzMyK3JicF0KKwltb3ZkcXUJWE1NV09SRFtyMTNdLHhtbTUKKworJEwkeHRzX2RlY19yZXQ6CisJbGVhCXJheCxbcnNwXQorCXB4b3IJeG1tMCx4bW0wCiskTCR4dHNfZGVjX2J6ZXJvOgorCW1vdmRxYQlYTU1XT1JEW3JheF0seG1tMAorCW1vdmRxYQlYTU1XT1JEWzE2K3JheF0seG1tMAorCWxlYQlyYXgsWzMyK3JheF0KKwljbXAJcmJwLHJheAorCWphCU5FQVIgJEwkeHRzX2RlY19iemVybworCisJbGVhCXJheCxbMTIwK3JicF0KKworCW1vdmFwcwl4bW02LFhNTVdPUkRbNjQrcmJwXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbODArcmJwXQorCW1vdmFwcwl4bW04LFhNTVdPUkRbOTYrcmJwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbMTEyK3JicF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFsxMjgrcmJwXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzE0NCtyYnBdCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbMTYwK3JicF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsxNzYrcmJwXQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWzE5MityYnBdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbMjA4K3JicF0KKwlsZWEJcmF4LFsxNjArcmF4XQorJEwkeHRzX2RlY190YWlsOgorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisKKwltb3YJcmJ4LFFXT1JEWygoLTE2KSkrcmF4XQorCisJbW92CXJicCxRV09SRFsoKC04KSkrcmF4XQorCisJbGVhCXJzcCxbcmF4XQorCiskTCR4dHNfZGVjX2VwaWxvZ3VlOgorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworQUxJR04JNjQKK19ic2Flc19jb25zdDoKKyRMJE0wSVNSOgorCURRCTB4MGEwZTAyMDYwNzBiMGYwMywweDAwMDQwODBjMGQwMTA1MDkKKyRMJElTUk0wOgorCURRCTB4MDEwNDBiMGUwMjA1MDgwZiwweDAzMDYwOTBjMDAwNzBhMGQKKyRMJElTUjoKKwlEUQkweDA1MDQwNzA2MDIwMTAwMDMsMHgwZjBlMGQwYzA4MGIwYTA5CiskTCRCUzA6CisJRFEJMHg1NTU1NTU1NTU1NTU1NTU1LDB4NTU1NTU1NTU1NTU1NTU1NQorJEwkQlMxOgorCURRCTB4MzMzMzMzMzMzMzMzMzMzMywweDMzMzMzMzMzMzMzMzMzMzMKKyRMJEJTMjoKKwlEUQkweDBmMGYwZjBmMGYwZjBmMGYsMHgwZjBmMGYwZjBmMGYwZjBmCiskTCRTUjoKKwlEUQkweDA1MDQwNzA2MDAwMzAyMDEsMHgwZjBlMGQwYzBhMDkwODBiCiskTCRTUk0wOgorCURRCTB4MDMwNDA5MGUwMDA1MGEwZiwweDAxMDYwYjBjMDIwNzA4MGQKKyRMJE0wU1I6CisJRFEJMHgwYTBlMDIwNjBmMDMwNzBiLDB4MDAwNDA4MGMwNTA5MGQwMQorJEwkU1dQVVA6CisJRFEJMHgwNzA2MDUwNDAzMDIwMTAwLDB4MGMwZDBlMGYwYjBhMDkwOAorJEwkU1dQVVBNMFNSOgorCURRCTB4MGEwZDAyMDYwYzAzMDcwYiwweDAwMDQwODBmMDUwOTBlMDEKKyRMJEFERDE6CisJRFEJMHgwMDAwMDAwMDAwMDAwMDAwLDB4MDAwMDAwMDEwMDAwMDAwMAorJEwkQUREMjoKKwlEUQkweDAwMDAwMDAwMDAwMDAwMDAsMHgwMDAwMDAwMjAwMDAwMDAwCiskTCRBREQzOgorCURRCTB4MDAwMDAwMDAwMDAwMDAwMCwweDAwMDAwMDAzMDAwMDAwMDAKKyRMJEFERDQ6CisJRFEJMHgwMDAwMDAwMDAwMDAwMDAwLDB4MDAwMDAwMDQwMDAwMDAwMAorJEwkQURENToKKwlEUQkweDAwMDAwMDAwMDAwMDAwMDAsMHgwMDAwMDAwNTAwMDAwMDAwCiskTCRBREQ2OgorCURRCTB4MDAwMDAwMDAwMDAwMDAwMCwweDAwMDAwMDA2MDAwMDAwMDAKKyRMJEFERDc6CisJRFEJMHgwMDAwMDAwMDAwMDAwMDAwLDB4MDAwMDAwMDcwMDAwMDAwMAorJEwkQUREODoKKwlEUQkweDAwMDAwMDAwMDAwMDAwMDAsMHgwMDAwMDAwODAwMDAwMDAwCiskTCR4dHNfbWFnaWM6CisJREQJMHg4NywwLDEsMAorJEwkbWFza3M6CisJRFEJMHgwMTAxMDEwMTAxMDEwMTAxLDB4MDEwMTAxMDEwMTAxMDEwMQorCURRCTB4MDIwMjAyMDIwMjAyMDIwMiwweDAyMDIwMjAyMDIwMjAyMDIKKwlEUQkweDA0MDQwNDA0MDQwNDA0MDQsMHgwNDA0MDQwNDA0MDQwNDA0CisJRFEJMHgwODA4MDgwODA4MDgwODA4LDB4MDgwODA4MDgwODA4MDgwOAorJEwkTTA6CisJRFEJMHgwMjA2MGEwZTAzMDcwYjBmLDB4MDAwNDA4MGMwMTA1MDkwZAorJEwkNjM6CisJRFEJMHg2MzYzNjM2MzYzNjM2MzYzLDB4NjM2MzYzNjM2MzYzNjM2MworREIJNjYsMTA1LDExNiw0NSwxMTUsMTA4LDEwNSw5OSwxMDEsMTAwLDMyLDY1LDY5LDgzLDMyLDEwMgorREIJMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDcsODMsODMsODMsNjksNTEsNDQKK0RCCTMyLDY5LDEwOSwxMDUsMTA4LDEwNSw5NywzMiw3NSwxOTUsMTY0LDExNSwxMTIsMTAxLDExNCw0NAorREIJMzIsODAsMTAxLDExNiwxMDEsMTE0LDMyLDgzLDk5LDEwNCwxMTksOTcsOTgsMTAxLDQ0LDMyCitEQgk2NSwxMTAsMTAwLDEyMSwzMiw4MCwxMTEsMTA4LDEyMSw5NywxMDcsMTExLDExOCwwCitBTElHTgk2NAorCitFWFRFUk4JX19pbXBfUnRsVmlydHVhbFVud2luZAorCitBTElHTgkxNgorc2VfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwltb3YJcnNpLFFXT1JEWzgrcjldCisJbW92CXIxMSxRV09SRFs1NityOV0KKworCW1vdglyMTBkLERXT1JEW3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYmUJTkVBUiAkTCRpbl9wcm9sb2d1ZQorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkaW5fcHJvbG9ndWUKKworCW1vdglyMTBkLERXT1JEWzgrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWphZQlORUFSICRMJGluX3RhaWwKKworCW1vdglyYXgsUVdPUkRbMTYwK3I4XQorCisJbGVhCXJzaSxbNjQrcmF4XQorCWxlYQlyZGksWzUxMityOF0KKwltb3YJZWN4LDIwCisJREQJMHhhNTQ4ZjNmYworCWxlYQlyYXgsWygoMTYwKzEyMCkpK3JheF0KKworJEwkaW5fdGFpbDoKKwltb3YJcmJwLFFXT1JEWygoLTQ4KSkrcmF4XQorCW1vdglyYngsUVdPUkRbKCgtNDApKStyYXhdCisJbW92CXIxMixRV09SRFsoKC0zMikpK3JheF0KKwltb3YJcjEzLFFXT1JEWygoLTI0KSkrcmF4XQorCW1vdglyMTQsUVdPUkRbKCgtMTYpKStyYXhdCisJbW92CXIxNSxRV09SRFsoKC04KSkrcmF4XQorCW1vdglRV09SRFsxNDQrcjhdLHJieAorCW1vdglRV09SRFsxNjArcjhdLHJicAorCW1vdglRV09SRFsyMTYrcjhdLHIxMgorCW1vdglRV09SRFsyMjQrcjhdLHIxMworCW1vdglRV09SRFsyMzIrcjhdLHIxNAorCW1vdglRV09SRFsyNDArcjhdLHIxNQorCiskTCRpbl9wcm9sb2d1ZToKKwltb3YJUVdPUkRbMTUyK3I4XSxyYXgKKworCW1vdglyZGksUVdPUkRbNDArcjldCisJbW92CXJzaSxyOAorCW1vdgllY3gsMTU0CisJREQJMHhhNTQ4ZjNmYworCisJbW92CXJzaSxyOQorCXhvcglyY3gscmN4CisJbW92CXJkeCxRV09SRFs4K3JzaV0KKwltb3YJcjgsUVdPUkRbcnNpXQorCW1vdglyOSxRV09SRFsxNityc2ldCisJbW92CXIxMCxRV09SRFs0MCtyc2ldCisJbGVhCXIxMSxbNTYrcnNpXQorCWxlYQlyMTIsWzI0K3JzaV0KKwltb3YJUVdPUkRbMzIrcnNwXSxyMTAKKwltb3YJUVdPUkRbNDArcnNwXSxyMTEKKwltb3YJUVdPUkRbNDgrcnNwXSxyMTIKKwltb3YJUVdPUkRbNTYrcnNwXSxyY3gKKwljYWxsCVFXT1JEW19faW1wX1J0bFZpcnR1YWxVbndpbmRdCisKKwltb3YJZWF4LDEKKwlhZGQJcnNwLDY0CisJcG9wZnEKKwlwb3AJcjE1CisJcG9wCXIxNAorCXBvcAlyMTMKKwlwb3AJcjEyCisJcG9wCXJicAorCXBvcAlyYngKKwlwb3AJcmRpCisJcG9wCXJzaQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK3NlY3Rpb24JLnBkYXRhIHJkYXRhIGFsaWduPTQKK0FMSUdOCTQKKwlERAkkTCRjYmNfZGVjX3Byb2xvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECSRMJGNiY19kZWNfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkY2JjX2RlY19pbmZvIHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkY3RyX2VuY19wcm9sb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRjdHJfZW5jX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECSRMJGN0cl9lbmNfaW5mbyB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJHh0c19lbmNfcHJvbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkeHRzX2VuY19lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCR4dHNfZW5jX2luZm8gd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCR4dHNfZGVjX3Byb2xvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECSRMJHh0c19kZWNfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkeHRzX2RlY19pbmZvIHdydCAuLmltYWdlYmFzZQorCitzZWN0aW9uCS54ZGF0YSByZGF0YSBhbGlnbj04CitBTElHTgk4CiskTCRjYmNfZGVjX2luZm86CitEQgk5LDAsMCwwCisJREQJc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRjYmNfZGVjX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJGNiY19kZWNfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkY2JjX2RlY190YWlsIHdydCAuLmltYWdlYmFzZQorCURECTAKKyRMJGN0cl9lbmNfaW5mbzoKK0RCCTksMCwwLDAKKwlERAlzZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGN0cl9lbmNfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkY3RyX2VuY19lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRjdHJfZW5jX3RhaWwgd3J0IC4uaW1hZ2ViYXNlCisJREQJMAorJEwkeHRzX2VuY19pbmZvOgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkeHRzX2VuY19ib2R5IHdydCAuLmltYWdlYmFzZSwkTCR4dHNfZW5jX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECSRMJHh0c19lbmNfdGFpbCB3cnQgLi5pbWFnZWJhc2UKKwlERAkwCiskTCR4dHNfZGVjX2luZm86CitEQgk5LDAsMCwwCisJREQJc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCR4dHNfZGVjX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJHh0c19kZWNfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkeHRzX2RlY190YWlsIHdydCAuLmltYWdlYmFzZQorCURECTAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL2doYXNoLXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZDE3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9naGFzaC14ODZfNjQuYXNtCkBAIC0wLDAgKzEsMjA1OSBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCitFWFRFUk4JT1BFTlNTTF9pYTMyY2FwX1AKKworZ2xvYmFsCWdjbV9nbXVsdF80Yml0CisKK0FMSUdOCTE2CitnY21fZ211bHRfNGJpdDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2djbV9nbXVsdF80Yml0OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKworCisKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKwlzdWIJcnNwLDI4MAorCiskTCRnbXVsdF9wcm9sb2d1ZToKKworCW1vdnp4CXI4LEJZVEVbMTUrcmRpXQorCWxlYQlyMTEsWyRMJHJlbV80Yml0XQorCXhvcglyYXgscmF4CisJeG9yCXJieCxyYngKKwltb3YJYWwscjhiCisJbW92CWJsLHI4YgorCXNobAlhbCw0CisJbW92CXJjeCwxNAorCW1vdglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwltb3YJcjksUVdPUkRbcmF4KjErcnNpXQorCWFuZAlibCwweGYwCisJbW92CXJkeCxyOAorCWptcAlORUFSICRMJG9vcDEKKworQUxJR04JMTYKKyRMJG9vcDE6CisJc2hyCXI4LDQKKwlhbmQJcmR4LDB4ZgorCW1vdglyMTAscjkKKwltb3YJYWwsQllURVtyY3gqMStyZGldCisJc2hyCXI5LDQKKwl4b3IJcjgsUVdPUkRbOCtyYngqMStyc2ldCisJc2hsCXIxMCw2MAorCXhvcglyOSxRV09SRFtyYngqMStyc2ldCisJbW92CWJsLGFsCisJeG9yCXI5LFFXT1JEW3JkeCo4K3IxMV0KKwltb3YJcmR4LHI4CisJc2hsCWFsLDQKKwl4b3IJcjgscjEwCisJZGVjCXJjeAorCWpzCU5FQVIgJEwkYnJlYWsxCisKKwlzaHIJcjgsNAorCWFuZAlyZHgsMHhmCisJbW92CXIxMCxyOQorCXNocglyOSw0CisJeG9yCXI4LFFXT1JEWzgrcmF4KjErcnNpXQorCXNobAlyMTAsNjAKKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCWFuZAlibCwweGYwCisJeG9yCXI5LFFXT1JEW3JkeCo4K3IxMV0KKwltb3YJcmR4LHI4CisJeG9yCXI4LHIxMAorCWptcAlORUFSICRMJG9vcDEKKworQUxJR04JMTYKKyRMJGJyZWFrMToKKwlzaHIJcjgsNAorCWFuZAlyZHgsMHhmCisJbW92CXIxMCxyOQorCXNocglyOSw0CisJeG9yCXI4LFFXT1JEWzgrcmF4KjErcnNpXQorCXNobAlyMTAsNjAKKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCWFuZAlibCwweGYwCisJeG9yCXI5LFFXT1JEW3JkeCo4K3IxMV0KKwltb3YJcmR4LHI4CisJeG9yCXI4LHIxMAorCisJc2hyCXI4LDQKKwlhbmQJcmR4LDB4ZgorCW1vdglyMTAscjkKKwlzaHIJcjksNAorCXhvcglyOCxRV09SRFs4K3JieCoxK3JzaV0KKwlzaGwJcjEwLDYwCisJeG9yCXI5LFFXT1JEW3JieCoxK3JzaV0KKwl4b3IJcjgscjEwCisJeG9yCXI5LFFXT1JEW3JkeCo4K3IxMV0KKworCWJzd2FwCXI4CisJYnN3YXAJcjkKKwltb3YJUVdPUkRbOCtyZGldLHI4CisJbW92CVFXT1JEW3JkaV0scjkKKworCWxlYQlyc2ksWygoMjgwKzQ4KSkrcnNwXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRnbXVsdF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9nY21fZ211bHRfNGJpdDoKK2dsb2JhbAlnY21fZ2hhc2hfNGJpdAorCitBTElHTgkxNgorZ2NtX2doYXNoXzRiaXQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9nY21fZ2hhc2hfNGJpdDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKworCisKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKwlzdWIJcnNwLDI4MAorCiskTCRnaGFzaF9wcm9sb2d1ZToKKwltb3YJcjE0LHJkeAorCW1vdglyMTUscmN4CisJc3ViCXJzaSwtMTI4CisJbGVhCXJicCxbKCgxNisxMjgpKStyc3BdCisJeG9yCWVkeCxlZHgKKwltb3YJcjgsUVdPUkRbKCgwKzAtMTI4KSkrcnNpXQorCW1vdglyYXgsUVdPUkRbKCgwKzgtMTI4KSkrcnNpXQorCW1vdglkbCxhbAorCXNocglyYXgsNAorCW1vdglyMTAscjgKKwlzaHIJcjgsNAorCW1vdglyOSxRV09SRFsoKDE2KzAtMTI4KSkrcnNpXQorCXNobAlkbCw0CisJbW92CXJieCxRV09SRFsoKDE2KzgtMTI4KSkrcnNpXQorCXNobAlyMTAsNjAKKwltb3YJQllURVtyc3BdLGRsCisJb3IJcmF4LHIxMAorCW1vdglkbCxibAorCXNocglyYngsNAorCW1vdglyMTAscjkKKwlzaHIJcjksNAorCW1vdglRV09SRFtyYnBdLHI4CisJbW92CXI4LFFXT1JEWygoMzIrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCgwLTEyOCkpK3JicF0scmF4CisJbW92CXJheCxRV09SRFsoKDMyKzgtMTI4KSkrcnNpXQorCXNobAlyMTAsNjAKKwltb3YJQllURVsxK3JzcF0sZGwKKwlvcglyYngscjEwCisJbW92CWRsLGFsCisJc2hyCXJheCw0CisJbW92CXIxMCxyOAorCXNocglyOCw0CisJbW92CVFXT1JEWzgrcmJwXSxyOQorCW1vdglyOSxRV09SRFsoKDQ4KzAtMTI4KSkrcnNpXQorCXNobAlkbCw0CisJbW92CVFXT1JEWygoOC0xMjgpKStyYnBdLHJieAorCW1vdglyYngsUVdPUkRbKCg0OCs4LTEyOCkpK3JzaV0KKwlzaGwJcjEwLDYwCisJbW92CUJZVEVbMityc3BdLGRsCisJb3IJcmF4LHIxMAorCW1vdglkbCxibAorCXNocglyYngsNAorCW1vdglyMTAscjkKKwlzaHIJcjksNAorCW1vdglRV09SRFsxNityYnBdLHI4CisJbW92CXI4LFFXT1JEWygoNjQrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCgxNi0xMjgpKStyYnBdLHJheAorCW1vdglyYXgsUVdPUkRbKCg2NCs4LTEyOCkpK3JzaV0KKwlzaGwJcjEwLDYwCisJbW92CUJZVEVbMytyc3BdLGRsCisJb3IJcmJ4LHIxMAorCW1vdglkbCxhbAorCXNocglyYXgsNAorCW1vdglyMTAscjgKKwlzaHIJcjgsNAorCW1vdglRV09SRFsyNCtyYnBdLHI5CisJbW92CXI5LFFXT1JEWygoODArMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCgyNC0xMjgpKStyYnBdLHJieAorCW1vdglyYngsUVdPUkRbKCg4MCs4LTEyOCkpK3JzaV0KKwlzaGwJcjEwLDYwCisJbW92CUJZVEVbNCtyc3BdLGRsCisJb3IJcmF4LHIxMAorCW1vdglkbCxibAorCXNocglyYngsNAorCW1vdglyMTAscjkKKwlzaHIJcjksNAorCW1vdglRV09SRFszMityYnBdLHI4CisJbW92CXI4LFFXT1JEWygoOTYrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCgzMi0xMjgpKStyYnBdLHJheAorCW1vdglyYXgsUVdPUkRbKCg5Nis4LTEyOCkpK3JzaV0KKwlzaGwJcjEwLDYwCisJbW92CUJZVEVbNStyc3BdLGRsCisJb3IJcmJ4LHIxMAorCW1vdglkbCxhbAorCXNocglyYXgsNAorCW1vdglyMTAscjgKKwlzaHIJcjgsNAorCW1vdglRV09SRFs0MCtyYnBdLHI5CisJbW92CXI5LFFXT1JEWygoMTEyKzAtMTI4KSkrcnNpXQorCXNobAlkbCw0CisJbW92CVFXT1JEWygoNDAtMTI4KSkrcmJwXSxyYngKKwltb3YJcmJ4LFFXT1JEWygoMTEyKzgtMTI4KSkrcnNpXQorCXNobAlyMTAsNjAKKwltb3YJQllURVs2K3JzcF0sZGwKKwlvcglyYXgscjEwCisJbW92CWRsLGJsCisJc2hyCXJieCw0CisJbW92CXIxMCxyOQorCXNocglyOSw0CisJbW92CVFXT1JEWzQ4K3JicF0scjgKKwltb3YJcjgsUVdPUkRbKCgxMjgrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCg0OC0xMjgpKStyYnBdLHJheAorCW1vdglyYXgsUVdPUkRbKCgxMjgrOC0xMjgpKStyc2ldCisJc2hsCXIxMCw2MAorCW1vdglCWVRFWzcrcnNwXSxkbAorCW9yCXJieCxyMTAKKwltb3YJZGwsYWwKKwlzaHIJcmF4LDQKKwltb3YJcjEwLHI4CisJc2hyCXI4LDQKKwltb3YJUVdPUkRbNTYrcmJwXSxyOQorCW1vdglyOSxRV09SRFsoKDE0NCswLTEyOCkpK3JzaV0KKwlzaGwJZGwsNAorCW1vdglRV09SRFsoKDU2LTEyOCkpK3JicF0scmJ4CisJbW92CXJieCxRV09SRFsoKDE0NCs4LTEyOCkpK3JzaV0KKwlzaGwJcjEwLDYwCisJbW92CUJZVEVbOCtyc3BdLGRsCisJb3IJcmF4LHIxMAorCW1vdglkbCxibAorCXNocglyYngsNAorCW1vdglyMTAscjkKKwlzaHIJcjksNAorCW1vdglRV09SRFs2NCtyYnBdLHI4CisJbW92CXI4LFFXT1JEWygoMTYwKzAtMTI4KSkrcnNpXQorCXNobAlkbCw0CisJbW92CVFXT1JEWygoNjQtMTI4KSkrcmJwXSxyYXgKKwltb3YJcmF4LFFXT1JEWygoMTYwKzgtMTI4KSkrcnNpXQorCXNobAlyMTAsNjAKKwltb3YJQllURVs5K3JzcF0sZGwKKwlvcglyYngscjEwCisJbW92CWRsLGFsCisJc2hyCXJheCw0CisJbW92CXIxMCxyOAorCXNocglyOCw0CisJbW92CVFXT1JEWzcyK3JicF0scjkKKwltb3YJcjksUVdPUkRbKCgxNzYrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCg3Mi0xMjgpKStyYnBdLHJieAorCW1vdglyYngsUVdPUkRbKCgxNzYrOC0xMjgpKStyc2ldCisJc2hsCXIxMCw2MAorCW1vdglCWVRFWzEwK3JzcF0sZGwKKwlvcglyYXgscjEwCisJbW92CWRsLGJsCisJc2hyCXJieCw0CisJbW92CXIxMCxyOQorCXNocglyOSw0CisJbW92CVFXT1JEWzgwK3JicF0scjgKKwltb3YJcjgsUVdPUkRbKCgxOTIrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCg4MC0xMjgpKStyYnBdLHJheAorCW1vdglyYXgsUVdPUkRbKCgxOTIrOC0xMjgpKStyc2ldCisJc2hsCXIxMCw2MAorCW1vdglCWVRFWzExK3JzcF0sZGwKKwlvcglyYngscjEwCisJbW92CWRsLGFsCisJc2hyCXJheCw0CisJbW92CXIxMCxyOAorCXNocglyOCw0CisJbW92CVFXT1JEWzg4K3JicF0scjkKKwltb3YJcjksUVdPUkRbKCgyMDgrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCg4OC0xMjgpKStyYnBdLHJieAorCW1vdglyYngsUVdPUkRbKCgyMDgrOC0xMjgpKStyc2ldCisJc2hsCXIxMCw2MAorCW1vdglCWVRFWzEyK3JzcF0sZGwKKwlvcglyYXgscjEwCisJbW92CWRsLGJsCisJc2hyCXJieCw0CisJbW92CXIxMCxyOQorCXNocglyOSw0CisJbW92CVFXT1JEWzk2K3JicF0scjgKKwltb3YJcjgsUVdPUkRbKCgyMjQrMC0xMjgpKStyc2ldCisJc2hsCWRsLDQKKwltb3YJUVdPUkRbKCg5Ni0xMjgpKStyYnBdLHJheAorCW1vdglyYXgsUVdPUkRbKCgyMjQrOC0xMjgpKStyc2ldCisJc2hsCXIxMCw2MAorCW1vdglCWVRFWzEzK3JzcF0sZGwKKwlvcglyYngscjEwCisJbW92CWRsLGFsCisJc2hyCXJheCw0CisJbW92CXIxMCxyOAorCXNocglyOCw0CisJbW92CVFXT1JEWzEwNCtyYnBdLHI5CisJbW92CXI5LFFXT1JEWygoMjQwKzAtMTI4KSkrcnNpXQorCXNobAlkbCw0CisJbW92CVFXT1JEWygoMTA0LTEyOCkpK3JicF0scmJ4CisJbW92CXJieCxRV09SRFsoKDI0MCs4LTEyOCkpK3JzaV0KKwlzaGwJcjEwLDYwCisJbW92CUJZVEVbMTQrcnNwXSxkbAorCW9yCXJheCxyMTAKKwltb3YJZGwsYmwKKwlzaHIJcmJ4LDQKKwltb3YJcjEwLHI5CisJc2hyCXI5LDQKKwltb3YJUVdPUkRbMTEyK3JicF0scjgKKwlzaGwJZGwsNAorCW1vdglRV09SRFsoKDExMi0xMjgpKStyYnBdLHJheAorCXNobAlyMTAsNjAKKwltb3YJQllURVsxNStyc3BdLGRsCisJb3IJcmJ4LHIxMAorCW1vdglRV09SRFsxMjArcmJwXSxyOQorCW1vdglRV09SRFsoKDEyMC0xMjgpKStyYnBdLHJieAorCWFkZAlyc2ksLTEyOAorCW1vdglyOCxRV09SRFs4K3JkaV0KKwltb3YJcjksUVdPUkRbcmRpXQorCWFkZAlyMTUscjE0CisJbGVhCXIxMSxbJEwkcmVtXzhiaXRdCisJam1wCU5FQVIgJEwkb3V0ZXJfbG9vcAorQUxJR04JMTYKKyRMJG91dGVyX2xvb3A6CisJeG9yCXI5LFFXT1JEW3IxNF0KKwltb3YJcmR4LFFXT1JEWzgrcjE0XQorCWxlYQlyMTQsWzE2K3IxNF0KKwl4b3IJcmR4LHI4CisJbW92CVFXT1JEW3JkaV0scjkKKwltb3YJUVdPUkRbOCtyZGldLHJkeAorCXNocglyZHgsMzIKKwl4b3IJcmF4LHJheAorCXJvbAllZHgsOAorCW1vdglhbCxkbAorCW1vdnp4CWVieCxkbAorCXNobAlhbCw0CisJc2hyCWVieCw0CisJcm9sCWVkeCw4CisJbW92CXI4LFFXT1JEWzgrcmF4KjErcnNpXQorCW1vdglyOSxRV09SRFtyYXgqMStyc2ldCisJbW92CWFsLGRsCisJbW92engJZWN4LGRsCisJc2hsCWFsLDQKKwltb3Z6eAlyMTIsQllURVtyYngqMStyc3BdCisJc2hyCWVjeCw0CisJeG9yCXIxMixyOAorCW1vdglyMTAscjkKKwlzaHIJcjgsOAorCW1vdnp4CXIxMixyMTJiCisJc2hyCXI5LDgKKwl4b3IJcjgsUVdPUkRbKCgtMTI4KSkrcmJ4KjgrcmJwXQorCXNobAlyMTAsNTYKKwl4b3IJcjksUVdPUkRbcmJ4KjgrcmJwXQorCXJvbAllZHgsOAorCXhvcglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCW1vdglhbCxkbAorCXhvcglyOCxyMTAKKwltb3Z6eAlyMTIsV09SRFtyMTIqMityMTFdCisJbW92engJZWJ4LGRsCisJc2hsCWFsLDQKKwltb3Z6eAlyMTMsQllURVtyY3gqMStyc3BdCisJc2hyCWVieCw0CisJc2hsCXIxMiw0OAorCXhvcglyMTMscjgKKwltb3YJcjEwLHI5CisJeG9yCXI5LHIxMgorCXNocglyOCw4CisJbW92engJcjEzLHIxM2IKKwlzaHIJcjksOAorCXhvcglyOCxRV09SRFsoKC0xMjgpKStyY3gqOCtyYnBdCisJc2hsCXIxMCw1NgorCXhvcglyOSxRV09SRFtyY3gqOCtyYnBdCisJcm9sCWVkeCw4CisJeG9yCXI4LFFXT1JEWzgrcmF4KjErcnNpXQorCXhvcglyOSxRV09SRFtyYXgqMStyc2ldCisJbW92CWFsLGRsCisJeG9yCXI4LHIxMAorCW1vdnp4CXIxMyxXT1JEW3IxMyoyK3IxMV0KKwltb3Z6eAllY3gsZGwKKwlzaGwJYWwsNAorCW1vdnp4CXIxMixCWVRFW3JieCoxK3JzcF0KKwlzaHIJZWN4LDQKKwlzaGwJcjEzLDQ4CisJeG9yCXIxMixyOAorCW1vdglyMTAscjkKKwl4b3IJcjkscjEzCisJc2hyCXI4LDgKKwltb3Z6eAlyMTIscjEyYgorCW1vdgllZHgsRFdPUkRbOCtyZGldCisJc2hyCXI5LDgKKwl4b3IJcjgsUVdPUkRbKCgtMTI4KSkrcmJ4KjgrcmJwXQorCXNobAlyMTAsNTYKKwl4b3IJcjksUVdPUkRbcmJ4KjgrcmJwXQorCXJvbAllZHgsOAorCXhvcglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCW1vdglhbCxkbAorCXhvcglyOCxyMTAKKwltb3Z6eAlyMTIsV09SRFtyMTIqMityMTFdCisJbW92engJZWJ4LGRsCisJc2hsCWFsLDQKKwltb3Z6eAlyMTMsQllURVtyY3gqMStyc3BdCisJc2hyCWVieCw0CisJc2hsCXIxMiw0OAorCXhvcglyMTMscjgKKwltb3YJcjEwLHI5CisJeG9yCXI5LHIxMgorCXNocglyOCw4CisJbW92engJcjEzLHIxM2IKKwlzaHIJcjksOAorCXhvcglyOCxRV09SRFsoKC0xMjgpKStyY3gqOCtyYnBdCisJc2hsCXIxMCw1NgorCXhvcglyOSxRV09SRFtyY3gqOCtyYnBdCisJcm9sCWVkeCw4CisJeG9yCXI4LFFXT1JEWzgrcmF4KjErcnNpXQorCXhvcglyOSxRV09SRFtyYXgqMStyc2ldCisJbW92CWFsLGRsCisJeG9yCXI4LHIxMAorCW1vdnp4CXIxMyxXT1JEW3IxMyoyK3IxMV0KKwltb3Z6eAllY3gsZGwKKwlzaGwJYWwsNAorCW1vdnp4CXIxMixCWVRFW3JieCoxK3JzcF0KKwlzaHIJZWN4LDQKKwlzaGwJcjEzLDQ4CisJeG9yCXIxMixyOAorCW1vdglyMTAscjkKKwl4b3IJcjkscjEzCisJc2hyCXI4LDgKKwltb3Z6eAlyMTIscjEyYgorCXNocglyOSw4CisJeG9yCXI4LFFXT1JEWygoLTEyOCkpK3JieCo4K3JicF0KKwlzaGwJcjEwLDU2CisJeG9yCXI5LFFXT1JEW3JieCo4K3JicF0KKwlyb2wJZWR4LDgKKwl4b3IJcjgsUVdPUkRbOCtyYXgqMStyc2ldCisJeG9yCXI5LFFXT1JEW3JheCoxK3JzaV0KKwltb3YJYWwsZGwKKwl4b3IJcjgscjEwCisJbW92engJcjEyLFdPUkRbcjEyKjIrcjExXQorCW1vdnp4CWVieCxkbAorCXNobAlhbCw0CisJbW92engJcjEzLEJZVEVbcmN4KjErcnNwXQorCXNocgllYngsNAorCXNobAlyMTIsNDgKKwl4b3IJcjEzLHI4CisJbW92CXIxMCxyOQorCXhvcglyOSxyMTIKKwlzaHIJcjgsOAorCW1vdnp4CXIxMyxyMTNiCisJc2hyCXI5LDgKKwl4b3IJcjgsUVdPUkRbKCgtMTI4KSkrcmN4KjgrcmJwXQorCXNobAlyMTAsNTYKKwl4b3IJcjksUVdPUkRbcmN4KjgrcmJwXQorCXJvbAllZHgsOAorCXhvcglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCW1vdglhbCxkbAorCXhvcglyOCxyMTAKKwltb3Z6eAlyMTMsV09SRFtyMTMqMityMTFdCisJbW92engJZWN4LGRsCisJc2hsCWFsLDQKKwltb3Z6eAlyMTIsQllURVtyYngqMStyc3BdCisJc2hyCWVjeCw0CisJc2hsCXIxMyw0OAorCXhvcglyMTIscjgKKwltb3YJcjEwLHI5CisJeG9yCXI5LHIxMworCXNocglyOCw4CisJbW92engJcjEyLHIxMmIKKwltb3YJZWR4LERXT1JEWzQrcmRpXQorCXNocglyOSw4CisJeG9yCXI4LFFXT1JEWygoLTEyOCkpK3JieCo4K3JicF0KKwlzaGwJcjEwLDU2CisJeG9yCXI5LFFXT1JEW3JieCo4K3JicF0KKwlyb2wJZWR4LDgKKwl4b3IJcjgsUVdPUkRbOCtyYXgqMStyc2ldCisJeG9yCXI5LFFXT1JEW3JheCoxK3JzaV0KKwltb3YJYWwsZGwKKwl4b3IJcjgscjEwCisJbW92engJcjEyLFdPUkRbcjEyKjIrcjExXQorCW1vdnp4CWVieCxkbAorCXNobAlhbCw0CisJbW92engJcjEzLEJZVEVbcmN4KjErcnNwXQorCXNocgllYngsNAorCXNobAlyMTIsNDgKKwl4b3IJcjEzLHI4CisJbW92CXIxMCxyOQorCXhvcglyOSxyMTIKKwlzaHIJcjgsOAorCW1vdnp4CXIxMyxyMTNiCisJc2hyCXI5LDgKKwl4b3IJcjgsUVdPUkRbKCgtMTI4KSkrcmN4KjgrcmJwXQorCXNobAlyMTAsNTYKKwl4b3IJcjksUVdPUkRbcmN4KjgrcmJwXQorCXJvbAllZHgsOAorCXhvcglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCW1vdglhbCxkbAorCXhvcglyOCxyMTAKKwltb3Z6eAlyMTMsV09SRFtyMTMqMityMTFdCisJbW92engJZWN4LGRsCisJc2hsCWFsLDQKKwltb3Z6eAlyMTIsQllURVtyYngqMStyc3BdCisJc2hyCWVjeCw0CisJc2hsCXIxMyw0OAorCXhvcglyMTIscjgKKwltb3YJcjEwLHI5CisJeG9yCXI5LHIxMworCXNocglyOCw4CisJbW92engJcjEyLHIxMmIKKwlzaHIJcjksOAorCXhvcglyOCxRV09SRFsoKC0xMjgpKStyYngqOCtyYnBdCisJc2hsCXIxMCw1NgorCXhvcglyOSxRV09SRFtyYngqOCtyYnBdCisJcm9sCWVkeCw4CisJeG9yCXI4LFFXT1JEWzgrcmF4KjErcnNpXQorCXhvcglyOSxRV09SRFtyYXgqMStyc2ldCisJbW92CWFsLGRsCisJeG9yCXI4LHIxMAorCW1vdnp4CXIxMixXT1JEW3IxMioyK3IxMV0KKwltb3Z6eAllYngsZGwKKwlzaGwJYWwsNAorCW1vdnp4CXIxMyxCWVRFW3JjeCoxK3JzcF0KKwlzaHIJZWJ4LDQKKwlzaGwJcjEyLDQ4CisJeG9yCXIxMyxyOAorCW1vdglyMTAscjkKKwl4b3IJcjkscjEyCisJc2hyCXI4LDgKKwltb3Z6eAlyMTMscjEzYgorCXNocglyOSw4CisJeG9yCXI4LFFXT1JEWygoLTEyOCkpK3JjeCo4K3JicF0KKwlzaGwJcjEwLDU2CisJeG9yCXI5LFFXT1JEW3JjeCo4K3JicF0KKwlyb2wJZWR4LDgKKwl4b3IJcjgsUVdPUkRbOCtyYXgqMStyc2ldCisJeG9yCXI5LFFXT1JEW3JheCoxK3JzaV0KKwltb3YJYWwsZGwKKwl4b3IJcjgscjEwCisJbW92engJcjEzLFdPUkRbcjEzKjIrcjExXQorCW1vdnp4CWVjeCxkbAorCXNobAlhbCw0CisJbW92engJcjEyLEJZVEVbcmJ4KjErcnNwXQorCXNocgllY3gsNAorCXNobAlyMTMsNDgKKwl4b3IJcjEyLHI4CisJbW92CXIxMCxyOQorCXhvcglyOSxyMTMKKwlzaHIJcjgsOAorCW1vdnp4CXIxMixyMTJiCisJbW92CWVkeCxEV09SRFtyZGldCisJc2hyCXI5LDgKKwl4b3IJcjgsUVdPUkRbKCgtMTI4KSkrcmJ4KjgrcmJwXQorCXNobAlyMTAsNTYKKwl4b3IJcjksUVdPUkRbcmJ4KjgrcmJwXQorCXJvbAllZHgsOAorCXhvcglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCW1vdglhbCxkbAorCXhvcglyOCxyMTAKKwltb3Z6eAlyMTIsV09SRFtyMTIqMityMTFdCisJbW92engJZWJ4LGRsCisJc2hsCWFsLDQKKwltb3Z6eAlyMTMsQllURVtyY3gqMStyc3BdCisJc2hyCWVieCw0CisJc2hsCXIxMiw0OAorCXhvcglyMTMscjgKKwltb3YJcjEwLHI5CisJeG9yCXI5LHIxMgorCXNocglyOCw4CisJbW92engJcjEzLHIxM2IKKwlzaHIJcjksOAorCXhvcglyOCxRV09SRFsoKC0xMjgpKStyY3gqOCtyYnBdCisJc2hsCXIxMCw1NgorCXhvcglyOSxRV09SRFtyY3gqOCtyYnBdCisJcm9sCWVkeCw4CisJeG9yCXI4LFFXT1JEWzgrcmF4KjErcnNpXQorCXhvcglyOSxRV09SRFtyYXgqMStyc2ldCisJbW92CWFsLGRsCisJeG9yCXI4LHIxMAorCW1vdnp4CXIxMyxXT1JEW3IxMyoyK3IxMV0KKwltb3Z6eAllY3gsZGwKKwlzaGwJYWwsNAorCW1vdnp4CXIxMixCWVRFW3JieCoxK3JzcF0KKwlzaHIJZWN4LDQKKwlzaGwJcjEzLDQ4CisJeG9yCXIxMixyOAorCW1vdglyMTAscjkKKwl4b3IJcjkscjEzCisJc2hyCXI4LDgKKwltb3Z6eAlyMTIscjEyYgorCXNocglyOSw4CisJeG9yCXI4LFFXT1JEWygoLTEyOCkpK3JieCo4K3JicF0KKwlzaGwJcjEwLDU2CisJeG9yCXI5LFFXT1JEW3JieCo4K3JicF0KKwlyb2wJZWR4LDgKKwl4b3IJcjgsUVdPUkRbOCtyYXgqMStyc2ldCisJeG9yCXI5LFFXT1JEW3JheCoxK3JzaV0KKwltb3YJYWwsZGwKKwl4b3IJcjgscjEwCisJbW92engJcjEyLFdPUkRbcjEyKjIrcjExXQorCW1vdnp4CWVieCxkbAorCXNobAlhbCw0CisJbW92engJcjEzLEJZVEVbcmN4KjErcnNwXQorCXNocgllYngsNAorCXNobAlyMTIsNDgKKwl4b3IJcjEzLHI4CisJbW92CXIxMCxyOQorCXhvcglyOSxyMTIKKwlzaHIJcjgsOAorCW1vdnp4CXIxMyxyMTNiCisJc2hyCXI5LDgKKwl4b3IJcjgsUVdPUkRbKCgtMTI4KSkrcmN4KjgrcmJwXQorCXNobAlyMTAsNTYKKwl4b3IJcjksUVdPUkRbcmN4KjgrcmJwXQorCXJvbAllZHgsOAorCXhvcglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCW1vdglhbCxkbAorCXhvcglyOCxyMTAKKwltb3Z6eAlyMTMsV09SRFtyMTMqMityMTFdCisJbW92engJZWN4LGRsCisJc2hsCWFsLDQKKwltb3Z6eAlyMTIsQllURVtyYngqMStyc3BdCisJYW5kCWVjeCwyNDAKKwlzaGwJcjEzLDQ4CisJeG9yCXIxMixyOAorCW1vdglyMTAscjkKKwl4b3IJcjkscjEzCisJc2hyCXI4LDgKKwltb3Z6eAlyMTIscjEyYgorCW1vdgllZHgsRFdPUkRbKCgtNCkpK3JkaV0KKwlzaHIJcjksOAorCXhvcglyOCxRV09SRFsoKC0xMjgpKStyYngqOCtyYnBdCisJc2hsCXIxMCw1NgorCXhvcglyOSxRV09SRFtyYngqOCtyYnBdCisJbW92engJcjEyLFdPUkRbcjEyKjIrcjExXQorCXhvcglyOCxRV09SRFs4K3JheCoxK3JzaV0KKwl4b3IJcjksUVdPUkRbcmF4KjErcnNpXQorCXNobAlyMTIsNDgKKwl4b3IJcjgscjEwCisJeG9yCXI5LHIxMgorCW1vdnp4CXIxMyxyOGIKKwlzaHIJcjgsNAorCW1vdglyMTAscjkKKwlzaGwJcjEzYiw0CisJc2hyCXI5LDQKKwl4b3IJcjgsUVdPUkRbOCtyY3gqMStyc2ldCisJbW92engJcjEzLFdPUkRbcjEzKjIrcjExXQorCXNobAlyMTAsNjAKKwl4b3IJcjksUVdPUkRbcmN4KjErcnNpXQorCXhvcglyOCxyMTAKKwlzaGwJcjEzLDQ4CisJYnN3YXAJcjgKKwl4b3IJcjkscjEzCisJYnN3YXAJcjkKKwljbXAJcjE0LHIxNQorCWpiCU5FQVIgJEwkb3V0ZXJfbG9vcAorCW1vdglRV09SRFs4K3JkaV0scjgKKwltb3YJUVdPUkRbcmRpXSxyOQorCisJbGVhCXJzaSxbKCgyODArNDgpKStyc3BdCisKKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcnNpXQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JzaV0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyc2ldCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcnNpXQorCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JzaV0KKworCWxlYQlyc3AsW3JzaV0KKworJEwkZ2hhc2hfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfZ2NtX2doYXNoXzRiaXQ6CitnbG9iYWwJZ2NtX2luaXRfY2xtdWwKKworQUxJR04JMTYKK2djbV9pbml0X2NsbXVsOgorJEwkX2luaXRfY2xtdWw6CiskTCRTRUhfYmVnaW5fZ2NtX2luaXRfY2xtdWw6CisKK0RCCTB4NDgsMHg4MywweGVjLDB4MTgKK0RCCTB4MGYsMHgyOSwweDM0LDB4MjQKKwltb3ZkcXUJeG1tMixYTU1XT1JEW3JkeF0KKwlwc2h1ZmQJeG1tMix4bW0yLDc4CisKKworCXBzaHVmZAl4bW00LHhtbTIsMjU1CisJbW92ZHFhCXhtbTMseG1tMgorCXBzbGxxCXhtbTIsMQorCXB4b3IJeG1tNSx4bW01CisJcHNybHEJeG1tMyw2MworCXBjbXBndGQJeG1tNSx4bW00CisJcHNsbGRxCXhtbTMsOAorCXBvcgl4bW0yLHhtbTMKKworCisJcGFuZAl4bW01LFhNTVdPUkRbJEwkMHgxYzJfcG9seW5vbWlhbF0KKwlweG9yCXhtbTIseG1tNQorCisKKwlwc2h1ZmQJeG1tNix4bW0yLDc4CisJbW92ZHFhCXhtbTAseG1tMgorCXB4b3IJeG1tNix4bW0yCisJbW92ZHFhCXhtbTEseG1tMAorCXBzaHVmZAl4bW0zLHhtbTAsNzgKKwlweG9yCXhtbTMseG1tMAorREIJMTAyLDE1LDU4LDY4LDE5NCwwCitEQgkxMDIsMTUsNTgsNjgsMjAyLDE3CitEQgkxMDIsMTUsNTgsNjgsMjIyLDAKKwlweG9yCXhtbTMseG1tMAorCXB4b3IJeG1tMyx4bW0xCisKKwltb3ZkcWEJeG1tNCx4bW0zCisJcHNybGRxCXhtbTMsOAorCXBzbGxkcQl4bW00LDgKKwlweG9yCXhtbTEseG1tMworCXB4b3IJeG1tMCx4bW00CisKKwltb3ZkcWEJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsNQorCXB4b3IJeG1tMyx4bW0wCisJcHNsbHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTMKKwlwc2xscQl4bW0wLDU3CisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDgKKwlwc3JsZHEJeG1tMyw4CisJcHhvcgl4bW0wLHhtbTQKKwlweG9yCXhtbTEseG1tMworCisKKwltb3ZkcWEJeG1tNCx4bW0wCisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0xLHhtbTQKKwlweG9yCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsNQorCXB4b3IJeG1tMCx4bW00CisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTEKKwlwc2h1ZmQJeG1tMyx4bW0yLDc4CisJcHNodWZkCXhtbTQseG1tMCw3OAorCXB4b3IJeG1tMyx4bW0yCisJbW92ZHF1CVhNTVdPUkRbcmN4XSx4bW0yCisJcHhvcgl4bW00LHhtbTAKKwltb3ZkcXUJWE1NV09SRFsxNityY3hdLHhtbTAKK0RCCTEwMiwxNSw1OCwxNSwyMjcsOAorCW1vdmRxdQlYTU1XT1JEWzMyK3JjeF0seG1tNAorCW1vdmRxYQl4bW0xLHhtbTAKKwlwc2h1ZmQJeG1tMyx4bW0wLDc4CisJcHhvcgl4bW0zLHhtbTAKK0RCCTEwMiwxNSw1OCw2OCwxOTQsMAorREIJMTAyLDE1LDU4LDY4LDIwMiwxNworREIJMTAyLDE1LDU4LDY4LDIyMiwwCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTQseG1tMworCXBzcmxkcQl4bW0zLDgKKwlwc2xsZHEJeG1tNCw4CisJcHhvcgl4bW0xLHhtbTMKKwlweG9yCXhtbTAseG1tNAorCisJbW92ZHFhCXhtbTQseG1tMAorCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDUKKwlweG9yCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0zCisJcHNsbHEJeG1tMCw1NworCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xsZHEJeG1tMCw4CisJcHNybGRxCXhtbTMsOAorCXB4b3IJeG1tMCx4bW00CisJcHhvcgl4bW0xLHhtbTMKKworCisJbW92ZHFhCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMSx4bW00CisJcHhvcgl4bW00LHhtbTAKKwlwc3JscQl4bW0wLDUKKwlweG9yCXhtbTAseG1tNAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0xCisJbW92ZHFhCXhtbTUseG1tMAorCW1vdmRxYQl4bW0xLHhtbTAKKwlwc2h1ZmQJeG1tMyx4bW0wLDc4CisJcHhvcgl4bW0zLHhtbTAKK0RCCTEwMiwxNSw1OCw2OCwxOTQsMAorREIJMTAyLDE1LDU4LDY4LDIwMiwxNworREIJMTAyLDE1LDU4LDY4LDIyMiwwCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTQseG1tMworCXBzcmxkcQl4bW0zLDgKKwlwc2xsZHEJeG1tNCw4CisJcHhvcgl4bW0xLHhtbTMKKwlweG9yCXhtbTAseG1tNAorCisJbW92ZHFhCXhtbTQseG1tMAorCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDUKKwlweG9yCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0zCisJcHNsbHEJeG1tMCw1NworCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xsZHEJeG1tMCw4CisJcHNybGRxCXhtbTMsOAorCXB4b3IJeG1tMCx4bW00CisJcHhvcgl4bW0xLHhtbTMKKworCisJbW92ZHFhCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMSx4bW00CisJcHhvcgl4bW00LHhtbTAKKwlwc3JscQl4bW0wLDUKKwlweG9yCXhtbTAseG1tNAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0xCisJcHNodWZkCXhtbTMseG1tNSw3OAorCXBzaHVmZAl4bW00LHhtbTAsNzgKKwlweG9yCXhtbTMseG1tNQorCW1vdmRxdQlYTU1XT1JEWzQ4K3JjeF0seG1tNQorCXB4b3IJeG1tNCx4bW0wCisJbW92ZHF1CVhNTVdPUkRbNjQrcmN4XSx4bW0wCitEQgkxMDIsMTUsNTgsMTUsMjI3LDgKKwltb3ZkcXUJWE1NV09SRFs4MCtyY3hdLHhtbTQKKwltb3ZhcHMJeG1tNixYTU1XT1JEW3JzcF0KKwlsZWEJcnNwLFsyNCtyc3BdCiskTCRTRUhfZW5kX2djbV9pbml0X2NsbXVsOgorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitnbG9iYWwJZ2NtX2dtdWx0X2NsbXVsCisKK0FMSUdOCTE2CitnY21fZ211bHRfY2xtdWw6CiskTCRfZ211bHRfY2xtdWw6CisJbW92ZHF1CXhtbTAsWE1NV09SRFtyY3hdCisJbW92ZHFhCXhtbTUsWE1NV09SRFskTCRic3dhcF9tYXNrXQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmR4XQorCW1vdmRxdQl4bW00LFhNTVdPUkRbMzIrcmR4XQorREIJMTAyLDE1LDU2LDAsMTk3CisJbW92ZHFhCXhtbTEseG1tMAorCXBzaHVmZAl4bW0zLHhtbTAsNzgKKwlweG9yCXhtbTMseG1tMAorREIJMTAyLDE1LDU4LDY4LDE5NCwwCitEQgkxMDIsMTUsNTgsNjgsMjAyLDE3CitEQgkxMDIsMTUsNTgsNjgsMjIwLDAKKwlweG9yCXhtbTMseG1tMAorCXB4b3IJeG1tMyx4bW0xCisKKwltb3ZkcWEJeG1tNCx4bW0zCisJcHNybGRxCXhtbTMsOAorCXBzbGxkcQl4bW00LDgKKwlweG9yCXhtbTEseG1tMworCXB4b3IJeG1tMCx4bW00CisKKwltb3ZkcWEJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsNQorCXB4b3IJeG1tMyx4bW0wCisJcHNsbHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTMKKwlwc2xscQl4bW0wLDU3CisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDgKKwlwc3JsZHEJeG1tMyw4CisJcHhvcgl4bW0wLHhtbTQKKwlweG9yCXhtbTEseG1tMworCisKKwltb3ZkcWEJeG1tNCx4bW0wCisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0xLHhtbTQKKwlweG9yCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsNQorCXB4b3IJeG1tMCx4bW00CisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTEKK0RCCTEwMiwxNSw1NiwwLDE5NworCW1vdmRxdQlYTU1XT1JEW3JjeF0seG1tMAorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitnbG9iYWwJZ2NtX2doYXNoX2NsbXVsCisKK0FMSUdOCTMyCitnY21fZ2hhc2hfY2xtdWw6CiskTCRfZ2hhc2hfY2xtdWw6CisJbGVhCXJheCxbKCgtMTM2KSkrcnNwXQorJEwkU0VIX2JlZ2luX2djbV9naGFzaF9jbG11bDoKKworREIJMHg0OCwweDhkLDB4NjAsMHhlMAorREIJMHgwZiwweDI5LDB4NzAsMHhlMAorREIJMHgwZiwweDI5LDB4NzgsMHhmMAorREIJMHg0NCwweDBmLDB4MjksMHgwMAorREIJMHg0NCwweDBmLDB4MjksMHg0OCwweDEwCitEQgkweDQ0LDB4MGYsMHgyOSwweDUwLDB4MjAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NTgsMHgzMAorREIJMHg0NCwweDBmLDB4MjksMHg2MCwweDQwCitEQgkweDQ0LDB4MGYsMHgyOSwweDY4LDB4NTAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NzAsMHg2MAorREIJMHg0NCwweDBmLDB4MjksMHg3OCwweDcwCisJbW92ZHFhCXhtbTEwLFhNTVdPUkRbJEwkYnN3YXBfbWFza10KKworCW1vdmRxdQl4bW0wLFhNTVdPUkRbcmN4XQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmR4XQorCW1vdmRxdQl4bW03LFhNTVdPUkRbMzIrcmR4XQorREIJMTAyLDY1LDE1LDU2LDAsMTk0CisKKwlzdWIJcjksMHgxMAorCWp6CU5FQVIgJEwkb2RkX3RhaWwKKworCW1vdmRxdQl4bW02LFhNTVdPUkRbMTYrcmR4XQorCWxlYQlyYXgsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdgllYXgsRFdPUkRbNCtyYXhdCisJY21wCXI5LDB4MzAKKwlqYglORUFSICRMJHNraXA0eAorCisJYW5kCWVheCw3MTMwMzE2OAorCWNtcAllYXgsNDE5NDMwNAorCWplCU5FQVIgJEwkc2tpcDR4CisKKwlzdWIJcjksMHgzMAorCW1vdglyYXgsMHhBMDQwNjA4MDIwQzBFMDAwCisJbW92ZHF1CXhtbTE0LFhNTVdPUkRbNDgrcmR4XQorCW1vdmRxdQl4bW0xNSxYTU1XT1JEWzY0K3JkeF0KKworCisKKworCW1vdmRxdQl4bW0zLFhNTVdPUkRbNDgrcjhdCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbMzIrcjhdCitEQgkxMDIsNjUsMTUsNTYsMCwyMTgKK0RCCTEwMiw2OSwxNSw1NiwwLDIxOAorCW1vdmRxYQl4bW01LHhtbTMKKwlwc2h1ZmQJeG1tNCx4bW0zLDc4CisJcHhvcgl4bW00LHhtbTMKK0RCCTEwMiwxNSw1OCw2OCwyMTgsMAorREIJMTAyLDE1LDU4LDY4LDIzNCwxNworREIJMTAyLDE1LDU4LDY4LDIzMSwwCisKKwltb3ZkcWEJeG1tMTMseG1tMTEKKwlwc2h1ZmQJeG1tMTIseG1tMTEsNzgKKwlweG9yCXhtbTEyLHhtbTExCitEQgkxMDIsNjgsMTUsNTgsNjgsMjIyLDAKK0RCCTEwMiw2OCwxNSw1OCw2OCwyMzgsMTcKK0RCCTEwMiw2OCwxNSw1OCw2OCwyMzEsMTYKKwl4b3Jwcwl4bW0zLHhtbTExCisJeG9ycHMJeG1tNSx4bW0xMworCW1vdnVwcwl4bW03LFhNTVdPUkRbODArcmR4XQorCXhvcnBzCXhtbTQseG1tMTIKKworCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzE2K3I4XQorCW1vdmRxdQl4bW04LFhNTVdPUkRbcjhdCitEQgkxMDIsNjksMTUsNTYsMCwyMTgKK0RCCTEwMiw2OSwxNSw1NiwwLDE5NAorCW1vdmRxYQl4bW0xMyx4bW0xMQorCXBzaHVmZAl4bW0xMix4bW0xMSw3OAorCXB4b3IJeG1tMCx4bW04CisJcHhvcgl4bW0xMix4bW0xMQorREIJMTAyLDY5LDE1LDU4LDY4LDIyMiwwCisJbW92ZHFhCXhtbTEseG1tMAorCXBzaHVmZAl4bW04LHhtbTAsNzgKKwlweG9yCXhtbTgseG1tMAorREIJMTAyLDY5LDE1LDU4LDY4LDIzOCwxNworREIJMTAyLDY4LDE1LDU4LDY4LDIzMSwwCisJeG9ycHMJeG1tMyx4bW0xMQorCXhvcnBzCXhtbTUseG1tMTMKKworCWxlYQlyOCxbNjQrcjhdCisJc3ViCXI5LDB4NDAKKwlqYwlORUFSICRMJHRhaWw0eAorCisJam1wCU5FQVIgJEwkbW9kNF9sb29wCitBTElHTgkzMgorJEwkbW9kNF9sb29wOgorREIJMTAyLDY1LDE1LDU4LDY4LDE5OSwwCisJeG9ycHMJeG1tNCx4bW0xMgorCW1vdmRxdQl4bW0xMSxYTU1XT1JEWzQ4K3I4XQorREIJMTAyLDY5LDE1LDU2LDAsMjE4CitEQgkxMDIsNjUsMTUsNTgsNjgsMjA3LDE3CisJeG9ycHMJeG1tMCx4bW0zCisJbW92ZHF1CXhtbTMsWE1NV09SRFszMityOF0KKwltb3ZkcWEJeG1tMTMseG1tMTEKK0RCCTEwMiw2OCwxNSw1OCw2OCwxOTksMTYKKwlwc2h1ZmQJeG1tMTIseG1tMTEsNzgKKwl4b3Jwcwl4bW0xLHhtbTUKKwlweG9yCXhtbTEyLHhtbTExCitEQgkxMDIsNjUsMTUsNTYsMCwyMTgKKwltb3Z1cHMJeG1tNyxYTU1XT1JEWzMyK3JkeF0KKwl4b3Jwcwl4bW04LHhtbTQKK0RCCTEwMiw2OCwxNSw1OCw2OCwyMTgsMAorCXBzaHVmZAl4bW00LHhtbTMsNzgKKworCXB4b3IJeG1tOCx4bW0wCisJbW92ZHFhCXhtbTUseG1tMworCXB4b3IJeG1tOCx4bW0xCisJcHhvcgl4bW00LHhtbTMKKwltb3ZkcWEJeG1tOSx4bW04CitEQgkxMDIsNjgsMTUsNTgsNjgsMjM0LDE3CisJcHNsbGRxCXhtbTgsOAorCXBzcmxkcQl4bW05LDgKKwlweG9yCXhtbTAseG1tOAorCW1vdmRxYQl4bW04LFhNTVdPUkRbJEwkN19tYXNrXQorCXB4b3IJeG1tMSx4bW05CitEQgkxMDIsNzYsMTUsMTEwLDIwMAorCisJcGFuZAl4bW04LHhtbTAKK0RCCTEwMiw2OSwxNSw1NiwwLDIwMAorCXB4b3IJeG1tOSx4bW0wCitEQgkxMDIsNjgsMTUsNTgsNjgsMjMxLDAKKwlwc2xscQl4bW05LDU3CisJbW92ZHFhCXhtbTgseG1tOQorCXBzbGxkcQl4bW05LDgKK0RCCTEwMiwxNSw1OCw2OCwyMjIsMAorCXBzcmxkcQl4bW04LDgKKwlweG9yCXhtbTAseG1tOQorCXB4b3IJeG1tMSx4bW04CisJbW92ZHF1CXhtbTgsWE1NV09SRFtyOF0KKworCW1vdmRxYQl4bW05LHhtbTAKKwlwc3JscQl4bW0wLDEKK0RCCTEwMiwxNSw1OCw2OCwyMzgsMTcKKwl4b3Jwcwl4bW0zLHhtbTExCisJbW92ZHF1CXhtbTExLFhNTVdPUkRbMTYrcjhdCitEQgkxMDIsNjksMTUsNTYsMCwyMTgKK0RCCTEwMiwxNSw1OCw2OCwyMzEsMTYKKwl4b3Jwcwl4bW01LHhtbTEzCisJbW92dXBzCXhtbTcsWE1NV09SRFs4MCtyZHhdCitEQgkxMDIsNjksMTUsNTYsMCwxOTQKKwlweG9yCXhtbTEseG1tOQorCXB4b3IJeG1tOSx4bW0wCisJcHNybHEJeG1tMCw1CisKKwltb3ZkcWEJeG1tMTMseG1tMTEKKwlweG9yCXhtbTQseG1tMTIKKwlwc2h1ZmQJeG1tMTIseG1tMTEsNzgKKwlweG9yCXhtbTAseG1tOQorCXB4b3IJeG1tMSx4bW04CisJcHhvcgl4bW0xMix4bW0xMQorREIJMTAyLDY5LDE1LDU4LDY4LDIyMiwwCisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTEKKwltb3ZkcWEJeG1tMSx4bW0wCitEQgkxMDIsNjksMTUsNTgsNjgsMjM4LDE3CisJeG9ycHMJeG1tMyx4bW0xMQorCXBzaHVmZAl4bW04LHhtbTAsNzgKKwlweG9yCXhtbTgseG1tMAorCitEQgkxMDIsNjgsMTUsNTgsNjgsMjMxLDAKKwl4b3Jwcwl4bW01LHhtbTEzCisKKwlsZWEJcjgsWzY0K3I4XQorCXN1YglyOSwweDQwCisJam5jCU5FQVIgJEwkbW9kNF9sb29wCisKKyRMJHRhaWw0eDoKK0RCCTEwMiw2NSwxNSw1OCw2OCwxOTksMAorREIJMTAyLDY1LDE1LDU4LDY4LDIwNywxNworREIJMTAyLDY4LDE1LDU4LDY4LDE5OSwxNgorCXhvcnBzCXhtbTQseG1tMTIKKwl4b3Jwcwl4bW0wLHhtbTMKKwl4b3Jwcwl4bW0xLHhtbTUKKwlweG9yCXhtbTEseG1tMAorCXB4b3IJeG1tOCx4bW00CisKKwlweG9yCXhtbTgseG1tMQorCXB4b3IJeG1tMSx4bW0wCisKKwltb3ZkcWEJeG1tOSx4bW04CisJcHNybGRxCXhtbTgsOAorCXBzbGxkcQl4bW05LDgKKwlweG9yCXhtbTEseG1tOAorCXB4b3IJeG1tMCx4bW05CisKKwltb3ZkcWEJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsNQorCXB4b3IJeG1tMyx4bW0wCisJcHNsbHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTMKKwlwc2xscQl4bW0wLDU3CisJbW92ZHFhCXhtbTMseG1tMAorCXBzbGxkcQl4bW0wLDgKKwlwc3JsZHEJeG1tMyw4CisJcHhvcgl4bW0wLHhtbTQKKwlweG9yCXhtbTEseG1tMworCisKKwltb3ZkcWEJeG1tNCx4bW0wCisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0xLHhtbTQKKwlweG9yCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsNQorCXB4b3IJeG1tMCx4bW00CisJcHNybHEJeG1tMCwxCisJcHhvcgl4bW0wLHhtbTEKKwlhZGQJcjksMHg0MAorCWp6CU5FQVIgJEwkZG9uZQorCW1vdmRxdQl4bW03LFhNTVdPUkRbMzIrcmR4XQorCXN1YglyOSwweDEwCisJanoJTkVBUiAkTCRvZGRfdGFpbAorJEwkc2tpcDR4OgorCisKKworCisKKwltb3ZkcXUJeG1tOCxYTU1XT1JEW3I4XQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbMTYrcjhdCitEQgkxMDIsNjksMTUsNTYsMCwxOTQKK0RCCTEwMiw2NSwxNSw1NiwwLDIxOAorCXB4b3IJeG1tMCx4bW04CisKKwltb3ZkcWEJeG1tNSx4bW0zCisJcHNodWZkCXhtbTQseG1tMyw3OAorCXB4b3IJeG1tNCx4bW0zCitEQgkxMDIsMTUsNTgsNjgsMjE4LDAKK0RCCTEwMiwxNSw1OCw2OCwyMzQsMTcKK0RCCTEwMiwxNSw1OCw2OCwyMzEsMAorCisJbGVhCXI4LFszMityOF0KKwlub3AKKwlzdWIJcjksMHgyMAorCWpiZQlORUFSICRMJGV2ZW5fdGFpbAorCW5vcAorCWptcAlORUFSICRMJG1vZF9sb29wCisKK0FMSUdOCTMyCiskTCRtb2RfbG9vcDoKKwltb3ZkcWEJeG1tMSx4bW0wCisJbW92ZHFhCXhtbTgseG1tNAorCXBzaHVmZAl4bW00LHhtbTAsNzgKKwlweG9yCXhtbTQseG1tMAorCitEQgkxMDIsMTUsNTgsNjgsMTk4LDAKK0RCCTEwMiwxNSw1OCw2OCwyMDYsMTcKK0RCCTEwMiwxNSw1OCw2OCwyMzEsMTYKKworCXB4b3IJeG1tMCx4bW0zCisJcHhvcgl4bW0xLHhtbTUKKwltb3ZkcXUJeG1tOSxYTU1XT1JEW3I4XQorCXB4b3IJeG1tOCx4bW0wCitEQgkxMDIsNjksMTUsNTYsMCwyMDIKKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzE2K3I4XQorCisJcHhvcgl4bW04LHhtbTEKKwlweG9yCXhtbTEseG1tOQorCXB4b3IJeG1tNCx4bW04CitEQgkxMDIsNjUsMTUsNTYsMCwyMTgKKwltb3ZkcWEJeG1tOCx4bW00CisJcHNybGRxCXhtbTgsOAorCXBzbGxkcQl4bW00LDgKKwlweG9yCXhtbTEseG1tOAorCXB4b3IJeG1tMCx4bW00CisKKwltb3ZkcWEJeG1tNSx4bW0zCisKKwltb3ZkcWEJeG1tOSx4bW0wCisJbW92ZHFhCXhtbTgseG1tMAorCXBzbGxxCXhtbTAsNQorCXB4b3IJeG1tOCx4bW0wCitEQgkxMDIsMTUsNTgsNjgsMjE4LDAKKwlwc2xscQl4bW0wLDEKKwlweG9yCXhtbTAseG1tOAorCXBzbGxxCXhtbTAsNTcKKwltb3ZkcWEJeG1tOCx4bW0wCisJcHNsbGRxCXhtbTAsOAorCXBzcmxkcQl4bW04LDgKKwlweG9yCXhtbTAseG1tOQorCXBzaHVmZAl4bW00LHhtbTUsNzgKKwlweG9yCXhtbTEseG1tOAorCXB4b3IJeG1tNCx4bW01CisKKwltb3ZkcWEJeG1tOSx4bW0wCisJcHNybHEJeG1tMCwxCitEQgkxMDIsMTUsNTgsNjgsMjM0LDE3CisJcHhvcgl4bW0xLHhtbTkKKwlweG9yCXhtbTkseG1tMAorCXBzcmxxCXhtbTAsNQorCXB4b3IJeG1tMCx4bW05CisJbGVhCXI4LFszMityOF0KKwlwc3JscQl4bW0wLDEKK0RCCTEwMiwxNSw1OCw2OCwyMzEsMAorCXB4b3IJeG1tMCx4bW0xCisKKwlzdWIJcjksMHgyMAorCWphCU5FQVIgJEwkbW9kX2xvb3AKKworJEwkZXZlbl90YWlsOgorCW1vdmRxYQl4bW0xLHhtbTAKKwltb3ZkcWEJeG1tOCx4bW00CisJcHNodWZkCXhtbTQseG1tMCw3OAorCXB4b3IJeG1tNCx4bW0wCisKK0RCCTEwMiwxNSw1OCw2OCwxOTgsMAorREIJMTAyLDE1LDU4LDY4LDIwNiwxNworREIJMTAyLDE1LDU4LDY4LDIzMSwxNgorCisJcHhvcgl4bW0wLHhtbTMKKwlweG9yCXhtbTEseG1tNQorCXB4b3IJeG1tOCx4bW0wCisJcHhvcgl4bW04LHhtbTEKKwlweG9yCXhtbTQseG1tOAorCW1vdmRxYQl4bW04LHhtbTQKKwlwc3JsZHEJeG1tOCw4CisJcHNsbGRxCXhtbTQsOAorCXB4b3IJeG1tMSx4bW04CisJcHhvcgl4bW0wLHhtbTQKKworCW1vdmRxYQl4bW00LHhtbTAKKwltb3ZkcWEJeG1tMyx4bW0wCisJcHNsbHEJeG1tMCw1CisJcHhvcgl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDEKKwlweG9yCXhtbTAseG1tMworCXBzbGxxCXhtbTAsNTcKKwltb3ZkcWEJeG1tMyx4bW0wCisJcHNsbGRxCXhtbTAsOAorCXBzcmxkcQl4bW0zLDgKKwlweG9yCXhtbTAseG1tNAorCXB4b3IJeG1tMSx4bW0zCisKKworCW1vdmRxYQl4bW00LHhtbTAKKwlwc3JscQl4bW0wLDEKKwlweG9yCXhtbTEseG1tNAorCXB4b3IJeG1tNCx4bW0wCisJcHNybHEJeG1tMCw1CisJcHhvcgl4bW0wLHhtbTQKKwlwc3JscQl4bW0wLDEKKwlweG9yCXhtbTAseG1tMQorCXRlc3QJcjkscjkKKwlqbnoJTkVBUiAkTCRkb25lCisKKyRMJG9kZF90YWlsOgorCW1vdmRxdQl4bW04LFhNTVdPUkRbcjhdCitEQgkxMDIsNjksMTUsNTYsMCwxOTQKKwlweG9yCXhtbTAseG1tOAorCW1vdmRxYQl4bW0xLHhtbTAKKwlwc2h1ZmQJeG1tMyx4bW0wLDc4CisJcHhvcgl4bW0zLHhtbTAKK0RCCTEwMiwxNSw1OCw2OCwxOTQsMAorREIJMTAyLDE1LDU4LDY4LDIwMiwxNworREIJMTAyLDE1LDU4LDY4LDIyMywwCisJcHhvcgl4bW0zLHhtbTAKKwlweG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTQseG1tMworCXBzcmxkcQl4bW0zLDgKKwlwc2xsZHEJeG1tNCw4CisJcHhvcgl4bW0xLHhtbTMKKwlweG9yCXhtbTAseG1tNAorCisJbW92ZHFhCXhtbTQseG1tMAorCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xscQl4bW0wLDUKKwlweG9yCXhtbTMseG1tMAorCXBzbGxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0zCisJcHNsbHEJeG1tMCw1NworCW1vdmRxYQl4bW0zLHhtbTAKKwlwc2xsZHEJeG1tMCw4CisJcHNybGRxCXhtbTMsOAorCXB4b3IJeG1tMCx4bW00CisJcHhvcgl4bW0xLHhtbTMKKworCisJbW92ZHFhCXhtbTQseG1tMAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMSx4bW00CisJcHhvcgl4bW00LHhtbTAKKwlwc3JscQl4bW0wLDUKKwlweG9yCXhtbTAseG1tNAorCXBzcmxxCXhtbTAsMQorCXB4b3IJeG1tMCx4bW0xCiskTCRkb25lOgorREIJMTAyLDY1LDE1LDU2LDAsMTk0CisJbW92ZHF1CVhNTVdPUkRbcmN4XSx4bW0wCisJbW92YXBzCXhtbTYsWE1NV09SRFtyc3BdCisJbW92YXBzCXhtbTcsWE1NV09SRFsxNityc3BdCisJbW92YXBzCXhtbTgsWE1NV09SRFszMityc3BdCisJbW92YXBzCXhtbTksWE1NV09SRFs0OCtyc3BdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJeG1tMTIsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzE0NCtyc3BdCisJbGVhCXJzcCxbMTY4K3JzcF0KKyRMJFNFSF9lbmRfZ2NtX2doYXNoX2NsbXVsOgorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitnbG9iYWwJZ2NtX2luaXRfYXZ4CisKK0FMSUdOCTMyCitnY21faW5pdF9hdng6CiskTCRTRUhfYmVnaW5fZ2NtX2luaXRfYXZ4OgorCitEQgkweDQ4LDB4ODMsMHhlYywweDE4CitEQgkweDBmLDB4MjksMHgzNCwweDI0CisJdnplcm91cHBlcgorCisJdm1vdmRxdQl4bW0yLFhNTVdPUkRbcmR4XQorCXZwc2h1ZmQJeG1tMix4bW0yLDc4CisKKworCXZwc2h1ZmQJeG1tNCx4bW0yLDI1NQorCXZwc3JscQl4bW0zLHhtbTIsNjMKKwl2cHNsbHEJeG1tMix4bW0yLDEKKwl2cHhvcgl4bW01LHhtbTUseG1tNQorCXZwY21wZ3RkCXhtbTUseG1tNSx4bW00CisJdnBzbGxkcQl4bW0zLHhtbTMsOAorCXZwb3IJeG1tMix4bW0yLHhtbTMKKworCisJdnBhbmQJeG1tNSx4bW01LFhNTVdPUkRbJEwkMHgxYzJfcG9seW5vbWlhbF0KKwl2cHhvcgl4bW0yLHhtbTIseG1tNQorCisJdnB1bnBja2hxZHEJeG1tNix4bW0yLHhtbTIKKwl2bW92ZHFhCXhtbTAseG1tMgorCXZweG9yCXhtbTYseG1tNix4bW0yCisJbW92CXIxMCw0CisJam1wCU5FQVIgJEwkaW5pdF9zdGFydF9hdngKK0FMSUdOCTMyCiskTCRpbml0X2xvb3BfYXZ4OgorCXZwYWxpZ25yCXhtbTUseG1tNCx4bW0zLDgKKwl2bW92ZHF1CVhNTVdPUkRbKC0xNikrcmN4XSx4bW01CisJdnB1bnBja2hxZHEJeG1tMyx4bW0wLHhtbTAKKwl2cHhvcgl4bW0zLHhtbTMseG1tMAorCXZwY2xtdWxxZHEJeG1tMSx4bW0wLHhtbTIsMHgxMQorCXZwY2xtdWxxZHEJeG1tMCx4bW0wLHhtbTIsMHgwMAorCXZwY2xtdWxxZHEJeG1tMyx4bW0zLHhtbTYsMHgwMAorCXZweG9yCXhtbTQseG1tMSx4bW0wCisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKworCXZwc2xsZHEJeG1tNCx4bW0zLDgKKwl2cHNybGRxCXhtbTMseG1tMyw4CisJdnB4b3IJeG1tMCx4bW0wLHhtbTQKKwl2cHhvcgl4bW0xLHhtbTEseG1tMworCXZwc2xscQl4bW0zLHhtbTAsNTcKKwl2cHNsbHEJeG1tNCx4bW0wLDYyCisJdnB4b3IJeG1tNCx4bW00LHhtbTMKKwl2cHNsbHEJeG1tMyx4bW0wLDYzCisJdnB4b3IJeG1tNCx4bW00LHhtbTMKKwl2cHNsbGRxCXhtbTMseG1tNCw4CisJdnBzcmxkcQl4bW00LHhtbTQsOAorCXZweG9yCXhtbTAseG1tMCx4bW0zCisJdnB4b3IJeG1tMSx4bW0xLHhtbTQKKworCXZwc3JscQl4bW00LHhtbTAsMQorCXZweG9yCXhtbTEseG1tMSx4bW0wCisJdnB4b3IJeG1tMCx4bW0wLHhtbTQKKwl2cHNybHEJeG1tNCx4bW00LDUKKwl2cHhvcgl4bW0wLHhtbTAseG1tNAorCXZwc3JscQl4bW0wLHhtbTAsMQorCXZweG9yCXhtbTAseG1tMCx4bW0xCiskTCRpbml0X3N0YXJ0X2F2eDoKKwl2bW92ZHFhCXhtbTUseG1tMAorCXZwdW5wY2tocWRxCXhtbTMseG1tMCx4bW0wCisJdnB4b3IJeG1tMyx4bW0zLHhtbTAKKwl2cGNsbXVscWRxCXhtbTEseG1tMCx4bW0yLDB4MTEKKwl2cGNsbXVscWRxCXhtbTAseG1tMCx4bW0yLDB4MDAKKwl2cGNsbXVscWRxCXhtbTMseG1tMyx4bW02LDB4MDAKKwl2cHhvcgl4bW00LHhtbTEseG1tMAorCXZweG9yCXhtbTMseG1tMyx4bW00CisKKwl2cHNsbGRxCXhtbTQseG1tMyw4CisJdnBzcmxkcQl4bW0zLHhtbTMsOAorCXZweG9yCXhtbTAseG1tMCx4bW00CisJdnB4b3IJeG1tMSx4bW0xLHhtbTMKKwl2cHNsbHEJeG1tMyx4bW0wLDU3CisJdnBzbGxxCXhtbTQseG1tMCw2MgorCXZweG9yCXhtbTQseG1tNCx4bW0zCisJdnBzbGxxCXhtbTMseG1tMCw2MworCXZweG9yCXhtbTQseG1tNCx4bW0zCisJdnBzbGxkcQl4bW0zLHhtbTQsOAorCXZwc3JsZHEJeG1tNCx4bW00LDgKKwl2cHhvcgl4bW0wLHhtbTAseG1tMworCXZweG9yCXhtbTEseG1tMSx4bW00CisKKwl2cHNybHEJeG1tNCx4bW0wLDEKKwl2cHhvcgl4bW0xLHhtbTEseG1tMAorCXZweG9yCXhtbTAseG1tMCx4bW00CisJdnBzcmxxCXhtbTQseG1tNCw1CisJdnB4b3IJeG1tMCx4bW0wLHhtbTQKKwl2cHNybHEJeG1tMCx4bW0wLDEKKwl2cHhvcgl4bW0wLHhtbTAseG1tMQorCXZwc2h1ZmQJeG1tMyx4bW01LDc4CisJdnBzaHVmZAl4bW00LHhtbTAsNzgKKwl2cHhvcgl4bW0zLHhtbTMseG1tNQorCXZtb3ZkcXUJWE1NV09SRFtyY3hdLHhtbTUKKwl2cHhvcgl4bW00LHhtbTQseG1tMAorCXZtb3ZkcXUJWE1NV09SRFsxNityY3hdLHhtbTAKKwlsZWEJcmN4LFs0OCtyY3hdCisJc3ViCXIxMCwxCisJam56CU5FQVIgJEwkaW5pdF9sb29wX2F2eAorCisJdnBhbGlnbnIJeG1tNSx4bW0zLHhtbTQsOAorCXZtb3ZkcXUJWE1NV09SRFsoLTE2KStyY3hdLHhtbTUKKworCXZ6ZXJvdXBwZXIKKwltb3ZhcHMJeG1tNixYTU1XT1JEW3JzcF0KKwlsZWEJcnNwLFsyNCtyc3BdCiskTCRTRUhfZW5kX2djbV9pbml0X2F2eDoKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworZ2xvYmFsCWdjbV9nbXVsdF9hdngKKworQUxJR04JMzIKK2djbV9nbXVsdF9hdng6CisJam1wCU5FQVIgJEwkX2dtdWx0X2NsbXVsCisKK2dsb2JhbAlnY21fZ2hhc2hfYXZ4CisKK0FMSUdOCTMyCitnY21fZ2hhc2hfYXZ4OgorCWxlYQlyYXgsWygoLTEzNikpK3JzcF0KKyRMJFNFSF9iZWdpbl9nY21fZ2hhc2hfYXZ4OgorCitEQgkweDQ4LDB4OGQsMHg2MCwweGUwCitEQgkweDBmLDB4MjksMHg3MCwweGUwCitEQgkweDBmLDB4MjksMHg3OCwweGYwCitEQgkweDQ0LDB4MGYsMHgyOSwweDAwCitEQgkweDQ0LDB4MGYsMHgyOSwweDQ4LDB4MTAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NTAsMHgyMAorREIJMHg0NCwweDBmLDB4MjksMHg1OCwweDMwCitEQgkweDQ0LDB4MGYsMHgyOSwweDYwLDB4NDAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NjgsMHg1MAorREIJMHg0NCwweDBmLDB4MjksMHg3MCwweDYwCitEQgkweDQ0LDB4MGYsMHgyOSwweDc4LDB4NzAKKwl2emVyb3VwcGVyCisKKwl2bW92ZHF1CXhtbTEwLFhNTVdPUkRbcmN4XQorCWxlYQlyMTAsWyRMJDB4MWMyX3BvbHlub21pYWxdCisJbGVhCXJkeCxbNjQrcmR4XQorCXZtb3ZkcXUJeG1tMTMsWE1NV09SRFskTCRic3dhcF9tYXNrXQorCXZwc2h1ZmIJeG1tMTAseG1tMTAseG1tMTMKKwljbXAJcjksMHg4MAorCWpiCU5FQVIgJEwkc2hvcnRfYXZ4CisJc3ViCXI5LDB4ODAKKworCXZtb3ZkcXUJeG1tMTQsWE1NV09SRFsxMTIrcjhdCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgwLTY0KSkrcmR4XQorCXZwc2h1ZmIJeG1tMTQseG1tMTQseG1tMTMKKwl2bW92ZHF1CXhtbTcsWE1NV09SRFsoKDMyLTY0KSkrcmR4XQorCisJdnB1bnBja2hxZHEJeG1tOSx4bW0xNCx4bW0xNAorCXZtb3ZkcXUJeG1tMTUsWE1NV09SRFs5NityOF0KKwl2cGNsbXVscWRxCXhtbTAseG1tMTQseG1tNiwweDAwCisJdnB4b3IJeG1tOSx4bW05LHhtbTE0CisJdnBzaHVmYgl4bW0xNSx4bW0xNSx4bW0xMworCXZwY2xtdWxxZHEJeG1tMSx4bW0xNCx4bW02LDB4MTEKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKDE2LTY0KSkrcmR4XQorCXZwdW5wY2tocWRxCXhtbTgseG1tMTUseG1tMTUKKwl2bW92ZHF1CXhtbTE0LFhNTVdPUkRbODArcjhdCisJdnBjbG11bHFkcQl4bW0yLHhtbTkseG1tNywweDAwCisJdnB4b3IJeG1tOCx4bW04LHhtbTE1CisKKwl2cHNodWZiCXhtbTE0LHhtbTE0LHhtbTEzCisJdnBjbG11bHFkcQl4bW0zLHhtbTE1LHhtbTYsMHgwMAorCXZwdW5wY2tocWRxCXhtbTkseG1tMTQseG1tMTQKKwl2cGNsbXVscWRxCXhtbTQseG1tMTUseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCg0OC02NCkpK3JkeF0KKwl2cHhvcgl4bW05LHhtbTkseG1tMTQKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbNjQrcjhdCisJdnBjbG11bHFkcQl4bW01LHhtbTgseG1tNywweDEwCisJdm1vdmRxdQl4bW03LFhNTVdPUkRbKCg4MC02NCkpK3JkeF0KKworCXZwc2h1ZmIJeG1tMTUseG1tMTUseG1tMTMKKwl2cHhvcgl4bW0zLHhtbTMseG1tMAorCXZwY2xtdWxxZHEJeG1tMCx4bW0xNCx4bW02LDB4MDAKKwl2cHhvcgl4bW00LHhtbTQseG1tMQorCXZwdW5wY2tocWRxCXhtbTgseG1tMTUseG1tMTUKKwl2cGNsbXVscWRxCXhtbTEseG1tMTQseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCg2NC02NCkpK3JkeF0KKwl2cHhvcgl4bW01LHhtbTUseG1tMgorCXZwY2xtdWxxZHEJeG1tMix4bW05LHhtbTcsMHgwMAorCXZweG9yCXhtbTgseG1tOCx4bW0xNQorCisJdm1vdmRxdQl4bW0xNCxYTU1XT1JEWzQ4K3I4XQorCXZweG9yCXhtbTAseG1tMCx4bW0zCisJdnBjbG11bHFkcQl4bW0zLHhtbTE1LHhtbTYsMHgwMAorCXZweG9yCXhtbTEseG1tMSx4bW00CisJdnBzaHVmYgl4bW0xNCx4bW0xNCx4bW0xMworCXZwY2xtdWxxZHEJeG1tNCx4bW0xNSx4bW02LDB4MTEKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKDk2LTY0KSkrcmR4XQorCXZweG9yCXhtbTIseG1tMix4bW01CisJdnB1bnBja2hxZHEJeG1tOSx4bW0xNCx4bW0xNAorCXZwY2xtdWxxZHEJeG1tNSx4bW04LHhtbTcsMHgxMAorCXZtb3ZkcXUJeG1tNyxYTU1XT1JEWygoMTI4LTY0KSkrcmR4XQorCXZweG9yCXhtbTkseG1tOSx4bW0xNAorCisJdm1vdmRxdQl4bW0xNSxYTU1XT1JEWzMyK3I4XQorCXZweG9yCXhtbTMseG1tMyx4bW0wCisJdnBjbG11bHFkcQl4bW0wLHhtbTE0LHhtbTYsMHgwMAorCXZweG9yCXhtbTQseG1tNCx4bW0xCisJdnBzaHVmYgl4bW0xNSx4bW0xNSx4bW0xMworCXZwY2xtdWxxZHEJeG1tMSx4bW0xNCx4bW02LDB4MTEKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKDExMi02NCkpK3JkeF0KKwl2cHhvcgl4bW01LHhtbTUseG1tMgorCXZwdW5wY2tocWRxCXhtbTgseG1tMTUseG1tMTUKKwl2cGNsbXVscWRxCXhtbTIseG1tOSx4bW03LDB4MDAKKwl2cHhvcgl4bW04LHhtbTgseG1tMTUKKworCXZtb3ZkcXUJeG1tMTQsWE1NV09SRFsxNityOF0KKwl2cHhvcgl4bW0wLHhtbTAseG1tMworCXZwY2xtdWxxZHEJeG1tMyx4bW0xNSx4bW02LDB4MDAKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwc2h1ZmIJeG1tMTQseG1tMTQseG1tMTMKKwl2cGNsbXVscWRxCXhtbTQseG1tMTUseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgxNDQtNjQpKStyZHhdCisJdnB4b3IJeG1tMix4bW0yLHhtbTUKKwl2cHVucGNraHFkcQl4bW05LHhtbTE0LHhtbTE0CisJdnBjbG11bHFkcQl4bW01LHhtbTgseG1tNywweDEwCisJdm1vdmRxdQl4bW03LFhNTVdPUkRbKCgxNzYtNjQpKStyZHhdCisJdnB4b3IJeG1tOSx4bW05LHhtbTE0CisKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbcjhdCisJdnB4b3IJeG1tMyx4bW0zLHhtbTAKKwl2cGNsbXVscWRxCXhtbTAseG1tMTQseG1tNiwweDAwCisJdnB4b3IJeG1tNCx4bW00LHhtbTEKKwl2cHNodWZiCXhtbTE1LHhtbTE1LHhtbTEzCisJdnBjbG11bHFkcQl4bW0xLHhtbTE0LHhtbTYsMHgxMQorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoMTYwLTY0KSkrcmR4XQorCXZweG9yCXhtbTUseG1tNSx4bW0yCisJdnBjbG11bHFkcQl4bW0yLHhtbTkseG1tNywweDEwCisKKwlsZWEJcjgsWzEyOCtyOF0KKwljbXAJcjksMHg4MAorCWpiCU5FQVIgJEwkdGFpbF9hdngKKworCXZweG9yCXhtbTE1LHhtbTE1LHhtbTEwCisJc3ViCXI5LDB4ODAKKwlqbXAJTkVBUiAkTCRvb3A4eF9hdngKKworQUxJR04JMzIKKyRMJG9vcDh4X2F2eDoKKwl2cHVucGNraHFkcQl4bW04LHhtbTE1LHhtbTE1CisJdm1vdmRxdQl4bW0xNCxYTU1XT1JEWzExMityOF0KKwl2cHhvcgl4bW0zLHhtbTMseG1tMAorCXZweG9yCXhtbTgseG1tOCx4bW0xNQorCXZwY2xtdWxxZHEJeG1tMTAseG1tMTUseG1tNiwweDAwCisJdnBzaHVmYgl4bW0xNCx4bW0xNCx4bW0xMworCXZweG9yCXhtbTQseG1tNCx4bW0xCisJdnBjbG11bHFkcQl4bW0xMSx4bW0xNSx4bW02LDB4MTEKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKDAtNjQpKStyZHhdCisJdnB1bnBja2hxZHEJeG1tOSx4bW0xNCx4bW0xNAorCXZweG9yCXhtbTUseG1tNSx4bW0yCisJdnBjbG11bHFkcQl4bW0xMix4bW04LHhtbTcsMHgwMAorCXZtb3ZkcXUJeG1tNyxYTU1XT1JEWygoMzItNjQpKStyZHhdCisJdnB4b3IJeG1tOSx4bW05LHhtbTE0CisKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbOTYrcjhdCisJdnBjbG11bHFkcQl4bW0wLHhtbTE0LHhtbTYsMHgwMAorCXZweG9yCXhtbTEwLHhtbTEwLHhtbTMKKwl2cHNodWZiCXhtbTE1LHhtbTE1LHhtbTEzCisJdnBjbG11bHFkcQl4bW0xLHhtbTE0LHhtbTYsMHgxMQorCXZ4b3Jwcwl4bW0xMSx4bW0xMSx4bW00CisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgxNi02NCkpK3JkeF0KKwl2cHVucGNraHFkcQl4bW04LHhtbTE1LHhtbTE1CisJdnBjbG11bHFkcQl4bW0yLHhtbTkseG1tNywweDAwCisJdnB4b3IJeG1tMTIseG1tMTIseG1tNQorCXZ4b3Jwcwl4bW04LHhtbTgseG1tMTUKKworCXZtb3ZkcXUJeG1tMTQsWE1NV09SRFs4MCtyOF0KKwl2cHhvcgl4bW0xMix4bW0xMix4bW0xMAorCXZwY2xtdWxxZHEJeG1tMyx4bW0xNSx4bW02LDB4MDAKKwl2cHhvcgl4bW0xMix4bW0xMix4bW0xMQorCXZwc2xsZHEJeG1tOSx4bW0xMiw4CisJdnB4b3IJeG1tMyx4bW0zLHhtbTAKKwl2cGNsbXVscWRxCXhtbTQseG1tMTUseG1tNiwweDExCisJdnBzcmxkcQl4bW0xMix4bW0xMiw4CisJdnB4b3IJeG1tMTAseG1tMTAseG1tOQorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoNDgtNjQpKStyZHhdCisJdnBzaHVmYgl4bW0xNCx4bW0xNCx4bW0xMworCXZ4b3Jwcwl4bW0xMSx4bW0xMSx4bW0xMgorCXZweG9yCXhtbTQseG1tNCx4bW0xCisJdnB1bnBja2hxZHEJeG1tOSx4bW0xNCx4bW0xNAorCXZwY2xtdWxxZHEJeG1tNSx4bW04LHhtbTcsMHgxMAorCXZtb3ZkcXUJeG1tNyxYTU1XT1JEWygoODAtNjQpKStyZHhdCisJdnB4b3IJeG1tOSx4bW05LHhtbTE0CisJdnB4b3IJeG1tNSx4bW01LHhtbTIKKworCXZtb3ZkcXUJeG1tMTUsWE1NV09SRFs2NCtyOF0KKwl2cGFsaWducgl4bW0xMix4bW0xMCx4bW0xMCw4CisJdnBjbG11bHFkcQl4bW0wLHhtbTE0LHhtbTYsMHgwMAorCXZwc2h1ZmIJeG1tMTUseG1tMTUseG1tMTMKKwl2cHhvcgl4bW0wLHhtbTAseG1tMworCXZwY2xtdWxxZHEJeG1tMSx4bW0xNCx4bW02LDB4MTEKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKDY0LTY0KSkrcmR4XQorCXZwdW5wY2tocWRxCXhtbTgseG1tMTUseG1tMTUKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tMix4bW05LHhtbTcsMHgwMAorCXZ4b3Jwcwl4bW04LHhtbTgseG1tMTUKKwl2cHhvcgl4bW0yLHhtbTIseG1tNQorCisJdm1vdmRxdQl4bW0xNCxYTU1XT1JEWzQ4K3I4XQorCXZwY2xtdWxxZHEJeG1tMTAseG1tMTAsWE1NV09SRFtyMTBdLDB4MTAKKwl2cGNsbXVscWRxCXhtbTMseG1tMTUseG1tNiwweDAwCisJdnBzaHVmYgl4bW0xNCx4bW0xNCx4bW0xMworCXZweG9yCXhtbTMseG1tMyx4bW0wCisJdnBjbG11bHFkcQl4bW00LHhtbTE1LHhtbTYsMHgxMQorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoOTYtNjQpKStyZHhdCisJdnB1bnBja2hxZHEJeG1tOSx4bW0xNCx4bW0xNAorCXZweG9yCXhtbTQseG1tNCx4bW0xCisJdnBjbG11bHFkcQl4bW01LHhtbTgseG1tNywweDEwCisJdm1vdmRxdQl4bW03LFhNTVdPUkRbKCgxMjgtNjQpKStyZHhdCisJdnB4b3IJeG1tOSx4bW05LHhtbTE0CisJdnB4b3IJeG1tNSx4bW01LHhtbTIKKworCXZtb3ZkcXUJeG1tMTUsWE1NV09SRFszMityOF0KKwl2cGNsbXVscWRxCXhtbTAseG1tMTQseG1tNiwweDAwCisJdnBzaHVmYgl4bW0xNSx4bW0xNSx4bW0xMworCXZweG9yCXhtbTAseG1tMCx4bW0zCisJdnBjbG11bHFkcQl4bW0xLHhtbTE0LHhtbTYsMHgxMQorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoMTEyLTY0KSkrcmR4XQorCXZwdW5wY2tocWRxCXhtbTgseG1tMTUseG1tMTUKKwl2cHhvcgl4bW0xLHhtbTEseG1tNAorCXZwY2xtdWxxZHEJeG1tMix4bW05LHhtbTcsMHgwMAorCXZweG9yCXhtbTgseG1tOCx4bW0xNQorCXZweG9yCXhtbTIseG1tMix4bW01CisJdnhvcnBzCXhtbTEwLHhtbTEwLHhtbTEyCisKKwl2bW92ZHF1CXhtbTE0LFhNTVdPUkRbMTYrcjhdCisJdnBhbGlnbnIJeG1tMTIseG1tMTAseG1tMTAsOAorCXZwY2xtdWxxZHEJeG1tMyx4bW0xNSx4bW02LDB4MDAKKwl2cHNodWZiCXhtbTE0LHhtbTE0LHhtbTEzCisJdnB4b3IJeG1tMyx4bW0zLHhtbTAKKwl2cGNsbXVscWRxCXhtbTQseG1tMTUseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgxNDQtNjQpKStyZHhdCisJdnBjbG11bHFkcQl4bW0xMCx4bW0xMCxYTU1XT1JEW3IxMF0sMHgxMAorCXZ4b3Jwcwl4bW0xMix4bW0xMix4bW0xMQorCXZwdW5wY2tocWRxCXhtbTkseG1tMTQseG1tMTQKKwl2cHhvcgl4bW00LHhtbTQseG1tMQorCXZwY2xtdWxxZHEJeG1tNSx4bW04LHhtbTcsMHgxMAorCXZtb3ZkcXUJeG1tNyxYTU1XT1JEWygoMTc2LTY0KSkrcmR4XQorCXZweG9yCXhtbTkseG1tOSx4bW0xNAorCXZweG9yCXhtbTUseG1tNSx4bW0yCisKKwl2bW92ZHF1CXhtbTE1LFhNTVdPUkRbcjhdCisJdnBjbG11bHFkcQl4bW0wLHhtbTE0LHhtbTYsMHgwMAorCXZwc2h1ZmIJeG1tMTUseG1tMTUseG1tMTMKKwl2cGNsbXVscWRxCXhtbTEseG1tMTQseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgxNjAtNjQpKStyZHhdCisJdnB4b3IJeG1tMTUseG1tMTUseG1tMTIKKwl2cGNsbXVscWRxCXhtbTIseG1tOSx4bW03LDB4MTAKKwl2cHhvcgl4bW0xNSx4bW0xNSx4bW0xMAorCisJbGVhCXI4LFsxMjgrcjhdCisJc3ViCXI5LDB4ODAKKwlqbmMJTkVBUiAkTCRvb3A4eF9hdngKKworCWFkZAlyOSwweDgwCisJam1wCU5FQVIgJEwkdGFpbF9ub194b3JfYXZ4CisKK0FMSUdOCTMyCiskTCRzaG9ydF9hdng6CisJdm1vdmRxdQl4bW0xNCxYTU1XT1JEWygoLTE2KSkrcjkqMStyOF0KKwlsZWEJcjgsW3I5KjErcjhdCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgwLTY0KSkrcmR4XQorCXZtb3ZkcXUJeG1tNyxYTU1XT1JEWygoMzItNjQpKStyZHhdCisJdnBzaHVmYgl4bW0xNSx4bW0xNCx4bW0xMworCisJdm1vdmRxYQl4bW0zLHhtbTAKKwl2bW92ZHFhCXhtbTQseG1tMQorCXZtb3ZkcWEJeG1tNSx4bW0yCisJc3ViCXI5LDB4MTAKKwlqeglORUFSICRMJHRhaWxfYXZ4CisKKwl2cHVucGNraHFkcQl4bW04LHhtbTE1LHhtbTE1CisJdnB4b3IJeG1tMyx4bW0zLHhtbTAKKwl2cGNsbXVscWRxCXhtbTAseG1tMTUseG1tNiwweDAwCisJdnB4b3IJeG1tOCx4bW04LHhtbTE1CisJdm1vdmRxdQl4bW0xNCxYTU1XT1JEWygoLTMyKSkrcjhdCisJdnB4b3IJeG1tNCx4bW00LHhtbTEKKwl2cGNsbXVscWRxCXhtbTEseG1tMTUseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgxNi02NCkpK3JkeF0KKwl2cHNodWZiCXhtbTE1LHhtbTE0LHhtbTEzCisJdnB4b3IJeG1tNSx4bW01LHhtbTIKKwl2cGNsbXVscWRxCXhtbTIseG1tOCx4bW03LDB4MDAKKwl2cHNybGRxCXhtbTcseG1tNyw4CisJc3ViCXI5LDB4MTAKKwlqeglORUFSICRMJHRhaWxfYXZ4CisKKwl2cHVucGNraHFkcQl4bW04LHhtbTE1LHhtbTE1CisJdnB4b3IJeG1tMyx4bW0zLHhtbTAKKwl2cGNsbXVscWRxCXhtbTAseG1tMTUseG1tNiwweDAwCisJdnB4b3IJeG1tOCx4bW04LHhtbTE1CisJdm1vdmRxdQl4bW0xNCxYTU1XT1JEWygoLTQ4KSkrcjhdCisJdnB4b3IJeG1tNCx4bW00LHhtbTEKKwl2cGNsbXVscWRxCXhtbTEseG1tMTUseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCg0OC02NCkpK3JkeF0KKwl2cHNodWZiCXhtbTE1LHhtbTE0LHhtbTEzCisJdnB4b3IJeG1tNSx4bW01LHhtbTIKKwl2cGNsbXVscWRxCXhtbTIseG1tOCx4bW03LDB4MDAKKwl2bW92ZHF1CXhtbTcsWE1NV09SRFsoKDgwLTY0KSkrcmR4XQorCXN1YglyOSwweDEwCisJanoJTkVBUiAkTCR0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJeG1tOCx4bW0xNSx4bW0xNQorCXZweG9yCXhtbTMseG1tMyx4bW0wCisJdnBjbG11bHFkcQl4bW0wLHhtbTE1LHhtbTYsMHgwMAorCXZweG9yCXhtbTgseG1tOCx4bW0xNQorCXZtb3ZkcXUJeG1tMTQsWE1NV09SRFsoKC02NCkpK3I4XQorCXZweG9yCXhtbTQseG1tNCx4bW0xCisJdnBjbG11bHFkcQl4bW0xLHhtbTE1LHhtbTYsMHgxMQorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoNjQtNjQpKStyZHhdCisJdnBzaHVmYgl4bW0xNSx4bW0xNCx4bW0xMworCXZweG9yCXhtbTUseG1tNSx4bW0yCisJdnBjbG11bHFkcQl4bW0yLHhtbTgseG1tNywweDAwCisJdnBzcmxkcQl4bW03LHhtbTcsOAorCXN1YglyOSwweDEwCisJanoJTkVBUiAkTCR0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJeG1tOCx4bW0xNSx4bW0xNQorCXZweG9yCXhtbTMseG1tMyx4bW0wCisJdnBjbG11bHFkcQl4bW0wLHhtbTE1LHhtbTYsMHgwMAorCXZweG9yCXhtbTgseG1tOCx4bW0xNQorCXZtb3ZkcXUJeG1tMTQsWE1NV09SRFsoKC04MCkpK3I4XQorCXZweG9yCXhtbTQseG1tNCx4bW0xCisJdnBjbG11bHFkcQl4bW0xLHhtbTE1LHhtbTYsMHgxMQorCXZtb3ZkcXUJeG1tNixYTU1XT1JEWygoOTYtNjQpKStyZHhdCisJdnBzaHVmYgl4bW0xNSx4bW0xNCx4bW0xMworCXZweG9yCXhtbTUseG1tNSx4bW0yCisJdnBjbG11bHFkcQl4bW0yLHhtbTgseG1tNywweDAwCisJdm1vdmRxdQl4bW03LFhNTVdPUkRbKCgxMjgtNjQpKStyZHhdCisJc3ViCXI5LDB4MTAKKwlqeglORUFSICRMJHRhaWxfYXZ4CisKKwl2cHVucGNraHFkcQl4bW04LHhtbTE1LHhtbTE1CisJdnB4b3IJeG1tMyx4bW0zLHhtbTAKKwl2cGNsbXVscWRxCXhtbTAseG1tMTUseG1tNiwweDAwCisJdnB4b3IJeG1tOCx4bW04LHhtbTE1CisJdm1vdmRxdQl4bW0xNCxYTU1XT1JEWygoLTk2KSkrcjhdCisJdnB4b3IJeG1tNCx4bW00LHhtbTEKKwl2cGNsbXVscWRxCXhtbTEseG1tMTUseG1tNiwweDExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbKCgxMTItNjQpKStyZHhdCisJdnBzaHVmYgl4bW0xNSx4bW0xNCx4bW0xMworCXZweG9yCXhtbTUseG1tNSx4bW0yCisJdnBjbG11bHFkcQl4bW0yLHhtbTgseG1tNywweDAwCisJdnBzcmxkcQl4bW03LHhtbTcsOAorCXN1YglyOSwweDEwCisJanoJTkVBUiAkTCR0YWlsX2F2eAorCisJdnB1bnBja2hxZHEJeG1tOCx4bW0xNSx4bW0xNQorCXZweG9yCXhtbTMseG1tMyx4bW0wCisJdnBjbG11bHFkcQl4bW0wLHhtbTE1LHhtbTYsMHgwMAorCXZweG9yCXhtbTgseG1tOCx4bW0xNQorCXZtb3ZkcXUJeG1tMTQsWE1NV09SRFsoKC0xMTIpKStyOF0KKwl2cHhvcgl4bW00LHhtbTQseG1tMQorCXZwY2xtdWxxZHEJeG1tMSx4bW0xNSx4bW02LDB4MTEKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFsoKDE0NC02NCkpK3JkeF0KKwl2cHNodWZiCXhtbTE1LHhtbTE0LHhtbTEzCisJdnB4b3IJeG1tNSx4bW01LHhtbTIKKwl2cGNsbXVscWRxCXhtbTIseG1tOCx4bW03LDB4MDAKKwl2bW92cQl4bW03LFFXT1JEWygoMTg0LTY0KSkrcmR4XQorCXN1YglyOSwweDEwCisJam1wCU5FQVIgJEwkdGFpbF9hdngKKworQUxJR04JMzIKKyRMJHRhaWxfYXZ4OgorCXZweG9yCXhtbTE1LHhtbTE1LHhtbTEwCiskTCR0YWlsX25vX3hvcl9hdng6CisJdnB1bnBja2hxZHEJeG1tOCx4bW0xNSx4bW0xNQorCXZweG9yCXhtbTMseG1tMyx4bW0wCisJdnBjbG11bHFkcQl4bW0wLHhtbTE1LHhtbTYsMHgwMAorCXZweG9yCXhtbTgseG1tOCx4bW0xNQorCXZweG9yCXhtbTQseG1tNCx4bW0xCisJdnBjbG11bHFkcQl4bW0xLHhtbTE1LHhtbTYsMHgxMQorCXZweG9yCXhtbTUseG1tNSx4bW0yCisJdnBjbG11bHFkcQl4bW0yLHhtbTgseG1tNywweDAwCisKKwl2bW92ZHF1CXhtbTEyLFhNTVdPUkRbcjEwXQorCisJdnB4b3IJeG1tMTAseG1tMyx4bW0wCisJdnB4b3IJeG1tMTEseG1tNCx4bW0xCisJdnB4b3IJeG1tNSx4bW01LHhtbTIKKworCXZweG9yCXhtbTUseG1tNSx4bW0xMAorCXZweG9yCXhtbTUseG1tNSx4bW0xMQorCXZwc2xsZHEJeG1tOSx4bW01LDgKKwl2cHNybGRxCXhtbTUseG1tNSw4CisJdnB4b3IJeG1tMTAseG1tMTAseG1tOQorCXZweG9yCXhtbTExLHhtbTExLHhtbTUKKworCXZwY2xtdWxxZHEJeG1tOSx4bW0xMCx4bW0xMiwweDEwCisJdnBhbGlnbnIJeG1tMTAseG1tMTAseG1tMTAsOAorCXZweG9yCXhtbTEwLHhtbTEwLHhtbTkKKworCXZwY2xtdWxxZHEJeG1tOSx4bW0xMCx4bW0xMiwweDEwCisJdnBhbGlnbnIJeG1tMTAseG1tMTAseG1tMTAsOAorCXZweG9yCXhtbTEwLHhtbTEwLHhtbTExCisJdnB4b3IJeG1tMTAseG1tMTAseG1tOQorCisJY21wCXI5LDAKKwlqbmUJTkVBUiAkTCRzaG9ydF9hdngKKworCXZwc2h1ZmIJeG1tMTAseG1tMTAseG1tMTMKKwl2bW92ZHF1CVhNTVdPUkRbcmN4XSx4bW0xMAorCXZ6ZXJvdXBwZXIKKwltb3ZhcHMJeG1tNixYTU1XT1JEW3JzcF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWzE2K3JzcF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWzMyK3JzcF0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFs2NCtyc3BdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbODArcnNwXQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWzk2K3JzcF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsxMTIrcnNwXQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWzEyOCtyc3BdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbMTQ0K3JzcF0KKwlsZWEJcnNwLFsxNjgrcnNwXQorJEwkU0VIX2VuZF9nY21fZ2hhc2hfYXZ4OgorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitBTElHTgk2NAorJEwkYnN3YXBfbWFzazoKK0RCCTE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDAKKyRMJDB4MWMyX3BvbHlub21pYWw6CitEQgkxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwweGMyCiskTCQ3X21hc2s6CisJREQJNywwLDcsMAorJEwkN19tYXNrX3BvbHk6CisJREQJNywwLDQ1MCwwCitBTElHTgk2NAorCiskTCRyZW1fNGJpdDoKKwlERAkwLDAsMCw0NzE4NTkyMDAsMCw5NDM3MTg0MDAsMCw2MTAyNzEyMzIKKwlERAkwLDE4ODc0MzY4MDAsMCwxODIyNDI1MDg4LDAsMTIyMDU0MjQ2NCwwLDE0MjM5NjYyMDgKKwlERAkwLDM3NzQ4NzM2MDAsMCw0MjQ2NzMyODAwLDAsMzY0NDg1MDE3NiwwLDMzMTE0MDMwMDgKKwlERAkwLDI0NDEwODQ5MjgsMCwyMzc2MDczMjE2LDAsMjg0NzkzMjQxNiwwLDMwNTEzNTYxNjAKKworJEwkcmVtXzhiaXQ6CisJRFcJMHgwMDAwLDB4MDFDMiwweDAzODQsMHgwMjQ2LDB4MDcwOCwweDA2Q0EsMHgwNDhDLDB4MDU0RQorCURXCTB4MEUxMCwweDBGRDIsMHgwRDk0LDB4MEM1NiwweDA5MTgsMHgwOERBLDB4MEE5QywweDBCNUUKKwlEVwkweDFDMjAsMHgxREUyLDB4MUZBNCwweDFFNjYsMHgxQjI4LDB4MUFFQSwweDE4QUMsMHgxOTZFCisJRFcJMHgxMjMwLDB4MTNGMiwweDExQjQsMHgxMDc2LDB4MTUzOCwweDE0RkEsMHgxNkJDLDB4MTc3RQorCURXCTB4Mzg0MCwweDM5ODIsMHgzQkM0LDB4M0EwNiwweDNGNDgsMHgzRThBLDB4M0NDQywweDNEMEUKKwlEVwkweDM2NTAsMHgzNzkyLDB4MzVENCwweDM0MTYsMHgzMTU4LDB4MzA5QSwweDMyREMsMHgzMzFFCisJRFcJMHgyNDYwLDB4MjVBMiwweDI3RTQsMHgyNjI2LDB4MjM2OCwweDIyQUEsMHgyMEVDLDB4MjEyRQorCURXCTB4MkE3MCwweDJCQjIsMHgyOUY0LDB4MjgzNiwweDJENzgsMHgyQ0JBLDB4MkVGQywweDJGM0UKKwlEVwkweDcwODAsMHg3MTQyLDB4NzMwNCwweDcyQzYsMHg3Nzg4LDB4NzY0QSwweDc0MEMsMHg3NUNFCisJRFcJMHg3RTkwLDB4N0Y1MiwweDdEMTQsMHg3Q0Q2LDB4Nzk5OCwweDc4NUEsMHg3QTFDLDB4N0JERQorCURXCTB4NkNBMCwweDZENjIsMHg2RjI0LDB4NkVFNiwweDZCQTgsMHg2QTZBLDB4NjgyQywweDY5RUUKKwlEVwkweDYyQjAsMHg2MzcyLDB4NjEzNCwweDYwRjYsMHg2NUI4LDB4NjQ3QSwweDY2M0MsMHg2N0ZFCisJRFcJMHg0OEMwLDB4NDkwMiwweDRCNDQsMHg0QTg2LDB4NEZDOCwweDRFMEEsMHg0QzRDLDB4NEQ4RQorCURXCTB4NDZEMCwweDQ3MTIsMHg0NTU0LDB4NDQ5NiwweDQxRDgsMHg0MDFBLDB4NDI1QywweDQzOUUKKwlEVwkweDU0RTAsMHg1NTIyLDB4NTc2NCwweDU2QTYsMHg1M0U4LDB4NTIyQSwweDUwNkMsMHg1MUFFCisJRFcJMHg1QUYwLDB4NUIzMiwweDU5NzQsMHg1OEI2LDB4NURGOCwweDVDM0EsMHg1RTdDLDB4NUZCRQorCURXCTB4RTEwMCwweEUwQzIsMHhFMjg0LDB4RTM0NiwweEU2MDgsMHhFN0NBLDB4RTU4QywweEU0NEUKKwlEVwkweEVGMTAsMHhFRUQyLDB4RUM5NCwweEVENTYsMHhFODE4LDB4RTlEQSwweEVCOUMsMHhFQTVFCisJRFcJMHhGRDIwLDB4RkNFMiwweEZFQTQsMHhGRjY2LDB4RkEyOCwweEZCRUEsMHhGOUFDLDB4Rjg2RQorCURXCTB4RjMzMCwweEYyRjIsMHhGMEI0LDB4RjE3NiwweEY0MzgsMHhGNUZBLDB4RjdCQywweEY2N0UKKwlEVwkweEQ5NDAsMHhEODgyLDB4REFDNCwweERCMDYsMHhERTQ4LDB4REY4QSwweEREQ0MsMHhEQzBFCisJRFcJMHhENzUwLDB4RDY5MiwweEQ0RDQsMHhENTE2LDB4RDA1OCwweEQxOUEsMHhEM0RDLDB4RDIxRQorCURXCTB4QzU2MCwweEM0QTIsMHhDNkU0LDB4QzcyNiwweEMyNjgsMHhDM0FBLDB4QzFFQywweEMwMkUKKwlEVwkweENCNzAsMHhDQUIyLDB4QzhGNCwweEM5MzYsMHhDQzc4LDB4Q0RCQSwweENGRkMsMHhDRTNFCisJRFcJMHg5MTgwLDB4OTA0MiwweDkyMDQsMHg5M0M2LDB4OTY4OCwweDk3NEEsMHg5NTBDLDB4OTRDRQorCURXCTB4OUY5MCwweDlFNTIsMHg5QzE0LDB4OURENiwweDk4OTgsMHg5OTVBLDB4OUIxQywweDlBREUKKwlEVwkweDhEQTAsMHg4QzYyLDB4OEUyNCwweDhGRTYsMHg4QUE4LDB4OEI2QSwweDg5MkMsMHg4OEVFCisJRFcJMHg4M0IwLDB4ODI3MiwweDgwMzQsMHg4MUY2LDB4ODRCOCwweDg1N0EsMHg4NzNDLDB4ODZGRQorCURXCTB4QTlDMCwweEE4MDIsMHhBQTQ0LDB4QUI4NiwweEFFQzgsMHhBRjBBLDB4QUQ0QywweEFDOEUKKwlEVwkweEE3RDAsMHhBNjEyLDB4QTQ1NCwweEE1OTYsMHhBMEQ4LDB4QTExQSwweEEzNUMsMHhBMjlFCisJRFcJMHhCNUUwLDB4QjQyMiwweEI2NjQsMHhCN0E2LDB4QjJFOCwweEIzMkEsMHhCMTZDLDB4QjBBRQorCURXCTB4QkJGMCwweEJBMzIsMHhCODc0LDB4QjlCNiwweEJDRjgsMHhCRDNBLDB4QkY3QywweEJFQkUKKworREIJNzEsNzIsNjUsODMsNzIsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyCitEQgk0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIKK0RCCTYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExCitEQgkxMTQsMTAzLDYyLDAKK0FMSUdOCTY0CitFWFRFUk4JX19pbXBfUnRsVmlydHVhbFVud2luZAorCitBTElHTgkxNgorc2VfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwltb3YJcnNpLFFXT1JEWzgrcjldCisJbW92CXIxMSxRV09SRFs1NityOV0KKworCW1vdglyMTBkLERXT1JEW3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGluX3Byb2xvZ3VlCisKKwltb3YJcmF4LFFXT1JEWzE1MityOF0KKworCW1vdglyMTBkLERXT1JEWzQrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWphZQlORUFSICRMJGluX3Byb2xvZ3VlCisKKwlsZWEJcmF4LFsoKDQ4KzI4MCkpK3JheF0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JheF0KKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisKKyRMJGluX3Byb2xvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyYXhdCisJbW92CXJzaSxRV09SRFsxNityYXhdCisJbW92CVFXT1JEWzE1MityOF0scmF4CisJbW92CVFXT1JEWzE2OCtyOF0scnNpCisJbW92CVFXT1JEWzE3NityOF0scmRpCisKKwltb3YJcmRpLFFXT1JEWzQwK3I5XQorCW1vdglyc2kscjgKKwltb3YJZWN4LDE1NAorCURECTB4YTU0OGYzZmMKKworCW1vdglyc2kscjkKKwl4b3IJcmN4LHJjeAorCW1vdglyZHgsUVdPUkRbOCtyc2ldCisJbW92CXI4LFFXT1JEW3JzaV0KKwltb3YJcjksUVdPUkRbMTYrcnNpXQorCW1vdglyMTAsUVdPUkRbNDArcnNpXQorCWxlYQlyMTEsWzU2K3JzaV0KKwlsZWEJcjEyLFsyNCtyc2ldCisJbW92CVFXT1JEWzMyK3JzcF0scjEwCisJbW92CVFXT1JEWzQwK3JzcF0scjExCisJbW92CVFXT1JEWzQ4K3JzcF0scjEyCisJbW92CVFXT1JEWzU2K3JzcF0scmN4CisJY2FsbAlRV09SRFtfX2ltcF9SdGxWaXJ0dWFsVW53aW5kXQorCisJbW92CWVheCwxCisJYWRkCXJzcCw2NAorCXBvcGZxCisJcG9wCXIxNQorCXBvcAlyMTQKKwlwb3AJcjEzCisJcG9wCXIxMgorCXBvcAlyYnAKKwlwb3AJcmJ4CisJcG9wCXJkaQorCXBvcAlyc2kKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitzZWN0aW9uCS5wZGF0YSByZGF0YSBhbGlnbj00CitBTElHTgk0CisJREQJJEwkU0VIX2JlZ2luX2djbV9nbXVsdF80Yml0IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfZ2NtX2dtdWx0XzRiaXQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fZ2NtX2dtdWx0XzRiaXQgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fZ2NtX2doYXNoXzRiaXQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9nY21fZ2hhc2hfNGJpdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19nY21fZ2hhc2hfNGJpdCB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9nY21faW5pdF9jbG11bCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2djbV9pbml0X2NsbXVsIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2djbV9pbml0X2NsbXVsIHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2djbV9naGFzaF9jbG11bCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2djbV9naGFzaF9jbG11bCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19nY21fZ2hhc2hfY2xtdWwgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2JlZ2luX2djbV9pbml0X2F2eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2djbV9pbml0X2F2eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19nY21faW5pdF9jbG11bCB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9nY21fZ2hhc2hfYXZ4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfZ2NtX2doYXNoX2F2eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19nY21fZ2hhc2hfY2xtdWwgd3J0IC4uaW1hZ2ViYXNlCitzZWN0aW9uCS54ZGF0YSByZGF0YSBhbGlnbj04CitBTElHTgk4CiskTCRTRUhfaW5mb19nY21fZ211bHRfNGJpdDoKK0RCCTksMCwwLDAKKwlERAlzZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGdtdWx0X3Byb2xvZ3VlIHdydCAuLmltYWdlYmFzZSwkTCRnbXVsdF9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX2djbV9naGFzaF80Yml0OgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkZ2hhc2hfcHJvbG9ndWUgd3J0IC4uaW1hZ2ViYXNlLCRMJGdoYXNoX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fZ2NtX2luaXRfY2xtdWw6CitEQgkweDAxLDB4MDgsMHgwMywweDAwCitEQgkweDA4LDB4NjgsMHgwMCwweDAwCitEQgkweDA0LDB4MjIsMHgwMCwweDAwCiskTCRTRUhfaW5mb19nY21fZ2hhc2hfY2xtdWw6CitEQgkweDAxLDB4MzMsMHgxNiwweDAwCitEQgkweDMzLDB4ZjgsMHgwOSwweDAwCitEQgkweDJlLDB4ZTgsMHgwOCwweDAwCitEQgkweDI5LDB4ZDgsMHgwNywweDAwCitEQgkweDI0LDB4YzgsMHgwNiwweDAwCitEQgkweDFmLDB4YjgsMHgwNSwweDAwCitEQgkweDFhLDB4YTgsMHgwNCwweDAwCitEQgkweDE1LDB4OTgsMHgwMywweDAwCitEQgkweDEwLDB4ODgsMHgwMiwweDAwCitEQgkweDBjLDB4NzgsMHgwMSwweDAwCitEQgkweDA4LDB4NjgsMHgwMCwweDAwCitEQgkweDA0LDB4MDEsMHgxNSwweDAwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvbWQ1LXg4Nl82NC5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvbWQ1LXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5ZDJjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9tZDUteDg2XzY0LmFzbQpAQCAtMCwwICsxLDc3NiBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCitBTElHTgkxNgorCitnbG9iYWwJbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisKK21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKwlwdXNoCXJicAorCXB1c2gJcmJ4CisJcHVzaAlyMTIKKwlwdXNoCXIxNAorCXB1c2gJcjE1CiskTCRwcm9sb2d1ZToKKworCisKKworCW1vdglyYnAscmRpCisJc2hsCXJkeCw2CisJbGVhCXJkaSxbcmR4KjErcnNpXQorCW1vdgllYXgsRFdPUkRbcmJwXQorCW1vdgllYngsRFdPUkRbNCtyYnBdCisJbW92CWVjeCxEV09SRFs4K3JicF0KKwltb3YJZWR4LERXT1JEWzEyK3JicF0KKworCisKKworCisKKworCWNtcAlyc2kscmRpCisJamUJTkVBUiAkTCRlbmQKKworCiskTCRsb29wOgorCW1vdglyOGQsZWF4CisJbW92CXI5ZCxlYngKKwltb3YJcjE0ZCxlY3gKKwltb3YJcjE1ZCxlZHgKKwltb3YJcjEwZCxEV09SRFtyc2ldCisJbW92CXIxMWQsZWR4CisJeG9yCXIxMWQsZWN4CisJbGVhCWVheCxbKCgtNjgwODc2OTM2KSkrcjEwKjErcmF4XQorCWFuZAlyMTFkLGVieAorCXhvcglyMTFkLGVkeAorCW1vdglyMTBkLERXT1JEWzQrcnNpXQorCWFkZAllYXgscjExZAorCXJvbAllYXgsNworCW1vdglyMTFkLGVjeAorCWFkZAllYXgsZWJ4CisJeG9yCXIxMWQsZWJ4CisJbGVhCWVkeCxbKCgtMzg5NTY0NTg2KSkrcjEwKjErcmR4XQorCWFuZAlyMTFkLGVheAorCXhvcglyMTFkLGVjeAorCW1vdglyMTBkLERXT1JEWzgrcnNpXQorCWFkZAllZHgscjExZAorCXJvbAllZHgsMTIKKwltb3YJcjExZCxlYngKKwlhZGQJZWR4LGVheAorCXhvcglyMTFkLGVheAorCWxlYQllY3gsWzYwNjEwNTgxOStyMTAqMStyY3hdCisJYW5kCXIxMWQsZWR4CisJeG9yCXIxMWQsZWJ4CisJbW92CXIxMGQsRFdPUkRbMTIrcnNpXQorCWFkZAllY3gscjExZAorCXJvbAllY3gsMTcKKwltb3YJcjExZCxlYXgKKwlhZGQJZWN4LGVkeAorCXhvcglyMTFkLGVkeAorCWxlYQllYngsWygoLTEwNDQ1MjUzMzApKStyMTAqMStyYnhdCisJYW5kCXIxMWQsZWN4CisJeG9yCXIxMWQsZWF4CisJbW92CXIxMGQsRFdPUkRbMTYrcnNpXQorCWFkZAllYngscjExZAorCXJvbAllYngsMjIKKwltb3YJcjExZCxlZHgKKwlhZGQJZWJ4LGVjeAorCXhvcglyMTFkLGVjeAorCWxlYQllYXgsWygoLTE3NjQxODg5NykpK3IxMCoxK3JheF0KKwlhbmQJcjExZCxlYngKKwl4b3IJcjExZCxlZHgKKwltb3YJcjEwZCxEV09SRFsyMCtyc2ldCisJYWRkCWVheCxyMTFkCisJcm9sCWVheCw3CisJbW92CXIxMWQsZWN4CisJYWRkCWVheCxlYngKKwl4b3IJcjExZCxlYngKKwlsZWEJZWR4LFsxMjAwMDgwNDI2K3IxMCoxK3JkeF0KKwlhbmQJcjExZCxlYXgKKwl4b3IJcjExZCxlY3gKKwltb3YJcjEwZCxEV09SRFsyNCtyc2ldCisJYWRkCWVkeCxyMTFkCisJcm9sCWVkeCwxMgorCW1vdglyMTFkLGVieAorCWFkZAllZHgsZWF4CisJeG9yCXIxMWQsZWF4CisJbGVhCWVjeCxbKCgtMTQ3MzIzMTM0MSkpK3IxMCoxK3JjeF0KKwlhbmQJcjExZCxlZHgKKwl4b3IJcjExZCxlYngKKwltb3YJcjEwZCxEV09SRFsyOCtyc2ldCisJYWRkCWVjeCxyMTFkCisJcm9sCWVjeCwxNworCW1vdglyMTFkLGVheAorCWFkZAllY3gsZWR4CisJeG9yCXIxMWQsZWR4CisJbGVhCWVieCxbKCgtNDU3MDU5ODMpKStyMTAqMStyYnhdCisJYW5kCXIxMWQsZWN4CisJeG9yCXIxMWQsZWF4CisJbW92CXIxMGQsRFdPUkRbMzIrcnNpXQorCWFkZAllYngscjExZAorCXJvbAllYngsMjIKKwltb3YJcjExZCxlZHgKKwlhZGQJZWJ4LGVjeAorCXhvcglyMTFkLGVjeAorCWxlYQllYXgsWzE3NzAwMzU0MTYrcjEwKjErcmF4XQorCWFuZAlyMTFkLGVieAorCXhvcglyMTFkLGVkeAorCW1vdglyMTBkLERXT1JEWzM2K3JzaV0KKwlhZGQJZWF4LHIxMWQKKwlyb2wJZWF4LDcKKwltb3YJcjExZCxlY3gKKwlhZGQJZWF4LGVieAorCXhvcglyMTFkLGVieAorCWxlYQllZHgsWygoLTE5NTg0MTQ0MTcpKStyMTAqMStyZHhdCisJYW5kCXIxMWQsZWF4CisJeG9yCXIxMWQsZWN4CisJbW92CXIxMGQsRFdPUkRbNDArcnNpXQorCWFkZAllZHgscjExZAorCXJvbAllZHgsMTIKKwltb3YJcjExZCxlYngKKwlhZGQJZWR4LGVheAorCXhvcglyMTFkLGVheAorCWxlYQllY3gsWygoLTQyMDYzKSkrcjEwKjErcmN4XQorCWFuZAlyMTFkLGVkeAorCXhvcglyMTFkLGVieAorCW1vdglyMTBkLERXT1JEWzQ0K3JzaV0KKwlhZGQJZWN4LHIxMWQKKwlyb2wJZWN4LDE3CisJbW92CXIxMWQsZWF4CisJYWRkCWVjeCxlZHgKKwl4b3IJcjExZCxlZHgKKwlsZWEJZWJ4LFsoKC0xOTkwNDA0MTYyKSkrcjEwKjErcmJ4XQorCWFuZAlyMTFkLGVjeAorCXhvcglyMTFkLGVheAorCW1vdglyMTBkLERXT1JEWzQ4K3JzaV0KKwlhZGQJZWJ4LHIxMWQKKwlyb2wJZWJ4LDIyCisJbW92CXIxMWQsZWR4CisJYWRkCWVieCxlY3gKKwl4b3IJcjExZCxlY3gKKwlsZWEJZWF4LFsxODA0NjAzNjgyK3IxMCoxK3JheF0KKwlhbmQJcjExZCxlYngKKwl4b3IJcjExZCxlZHgKKwltb3YJcjEwZCxEV09SRFs1Mityc2ldCisJYWRkCWVheCxyMTFkCisJcm9sCWVheCw3CisJbW92CXIxMWQsZWN4CisJYWRkCWVheCxlYngKKwl4b3IJcjExZCxlYngKKwlsZWEJZWR4LFsoKC00MDM0MTEwMSkpK3IxMCoxK3JkeF0KKwlhbmQJcjExZCxlYXgKKwl4b3IJcjExZCxlY3gKKwltb3YJcjEwZCxEV09SRFs1Nityc2ldCisJYWRkCWVkeCxyMTFkCisJcm9sCWVkeCwxMgorCW1vdglyMTFkLGVieAorCWFkZAllZHgsZWF4CisJeG9yCXIxMWQsZWF4CisJbGVhCWVjeCxbKCgtMTUwMjAwMjI5MCkpK3IxMCoxK3JjeF0KKwlhbmQJcjExZCxlZHgKKwl4b3IJcjExZCxlYngKKwltb3YJcjEwZCxEV09SRFs2MCtyc2ldCisJYWRkCWVjeCxyMTFkCisJcm9sCWVjeCwxNworCW1vdglyMTFkLGVheAorCWFkZAllY3gsZWR4CisJeG9yCXIxMWQsZWR4CisJbGVhCWVieCxbMTIzNjUzNTMyOStyMTAqMStyYnhdCisJYW5kCXIxMWQsZWN4CisJeG9yCXIxMWQsZWF4CisJbW92CXIxMGQsRFdPUkRbcnNpXQorCWFkZAllYngscjExZAorCXJvbAllYngsMjIKKwltb3YJcjExZCxlZHgKKwlhZGQJZWJ4LGVjeAorCW1vdglyMTBkLERXT1JEWzQrcnNpXQorCW1vdglyMTFkLGVkeAorCW1vdglyMTJkLGVkeAorCW5vdAlyMTFkCisJbGVhCWVheCxbKCgtMTY1Nzk2NTEwKSkrcjEwKjErcmF4XQorCWFuZAlyMTJkLGVieAorCWFuZAlyMTFkLGVjeAorCW1vdglyMTBkLERXT1JEWzI0K3JzaV0KKwlvcglyMTJkLHIxMWQKKwltb3YJcjExZCxlY3gKKwlhZGQJZWF4LHIxMmQKKwltb3YJcjEyZCxlY3gKKwlyb2wJZWF4LDUKKwlhZGQJZWF4LGVieAorCW5vdAlyMTFkCisJbGVhCWVkeCxbKCgtMTA2OTUwMTYzMikpK3IxMCoxK3JkeF0KKwlhbmQJcjEyZCxlYXgKKwlhbmQJcjExZCxlYngKKwltb3YJcjEwZCxEV09SRFs0NCtyc2ldCisJb3IJcjEyZCxyMTFkCisJbW92CXIxMWQsZWJ4CisJYWRkCWVkeCxyMTJkCisJbW92CXIxMmQsZWJ4CisJcm9sCWVkeCw5CisJYWRkCWVkeCxlYXgKKwlub3QJcjExZAorCWxlYQllY3gsWzY0MzcxNzcxMytyMTAqMStyY3hdCisJYW5kCXIxMmQsZWR4CisJYW5kCXIxMWQsZWF4CisJbW92CXIxMGQsRFdPUkRbcnNpXQorCW9yCXIxMmQscjExZAorCW1vdglyMTFkLGVheAorCWFkZAllY3gscjEyZAorCW1vdglyMTJkLGVheAorCXJvbAllY3gsMTQKKwlhZGQJZWN4LGVkeAorCW5vdAlyMTFkCisJbGVhCWVieCxbKCgtMzczODk3MzAyKSkrcjEwKjErcmJ4XQorCWFuZAlyMTJkLGVjeAorCWFuZAlyMTFkLGVkeAorCW1vdglyMTBkLERXT1JEWzIwK3JzaV0KKwlvcglyMTJkLHIxMWQKKwltb3YJcjExZCxlZHgKKwlhZGQJZWJ4LHIxMmQKKwltb3YJcjEyZCxlZHgKKwlyb2wJZWJ4LDIwCisJYWRkCWVieCxlY3gKKwlub3QJcjExZAorCWxlYQllYXgsWygoLTcwMTU1ODY5MSkpK3IxMCoxK3JheF0KKwlhbmQJcjEyZCxlYngKKwlhbmQJcjExZCxlY3gKKwltb3YJcjEwZCxEV09SRFs0MCtyc2ldCisJb3IJcjEyZCxyMTFkCisJbW92CXIxMWQsZWN4CisJYWRkCWVheCxyMTJkCisJbW92CXIxMmQsZWN4CisJcm9sCWVheCw1CisJYWRkCWVheCxlYngKKwlub3QJcjExZAorCWxlYQllZHgsWzM4MDE2MDgzK3IxMCoxK3JkeF0KKwlhbmQJcjEyZCxlYXgKKwlhbmQJcjExZCxlYngKKwltb3YJcjEwZCxEV09SRFs2MCtyc2ldCisJb3IJcjEyZCxyMTFkCisJbW92CXIxMWQsZWJ4CisJYWRkCWVkeCxyMTJkCisJbW92CXIxMmQsZWJ4CisJcm9sCWVkeCw5CisJYWRkCWVkeCxlYXgKKwlub3QJcjExZAorCWxlYQllY3gsWygoLTY2MDQ3ODMzNSkpK3IxMCoxK3JjeF0KKwlhbmQJcjEyZCxlZHgKKwlhbmQJcjExZCxlYXgKKwltb3YJcjEwZCxEV09SRFsxNityc2ldCisJb3IJcjEyZCxyMTFkCisJbW92CXIxMWQsZWF4CisJYWRkCWVjeCxyMTJkCisJbW92CXIxMmQsZWF4CisJcm9sCWVjeCwxNAorCWFkZAllY3gsZWR4CisJbm90CXIxMWQKKwlsZWEJZWJ4LFsoKC00MDU1Mzc4NDgpKStyMTAqMStyYnhdCisJYW5kCXIxMmQsZWN4CisJYW5kCXIxMWQsZWR4CisJbW92CXIxMGQsRFdPUkRbMzYrcnNpXQorCW9yCXIxMmQscjExZAorCW1vdglyMTFkLGVkeAorCWFkZAllYngscjEyZAorCW1vdglyMTJkLGVkeAorCXJvbAllYngsMjAKKwlhZGQJZWJ4LGVjeAorCW5vdAlyMTFkCisJbGVhCWVheCxbNTY4NDQ2NDM4K3IxMCoxK3JheF0KKwlhbmQJcjEyZCxlYngKKwlhbmQJcjExZCxlY3gKKwltb3YJcjEwZCxEV09SRFs1Nityc2ldCisJb3IJcjEyZCxyMTFkCisJbW92CXIxMWQsZWN4CisJYWRkCWVheCxyMTJkCisJbW92CXIxMmQsZWN4CisJcm9sCWVheCw1CisJYWRkCWVheCxlYngKKwlub3QJcjExZAorCWxlYQllZHgsWygoLTEwMTk4MDM2OTApKStyMTAqMStyZHhdCisJYW5kCXIxMmQsZWF4CisJYW5kCXIxMWQsZWJ4CisJbW92CXIxMGQsRFdPUkRbMTIrcnNpXQorCW9yCXIxMmQscjExZAorCW1vdglyMTFkLGVieAorCWFkZAllZHgscjEyZAorCW1vdglyMTJkLGVieAorCXJvbAllZHgsOQorCWFkZAllZHgsZWF4CisJbm90CXIxMWQKKwlsZWEJZWN4LFsoKC0xODczNjM5NjEpKStyMTAqMStyY3hdCisJYW5kCXIxMmQsZWR4CisJYW5kCXIxMWQsZWF4CisJbW92CXIxMGQsRFdPUkRbMzIrcnNpXQorCW9yCXIxMmQscjExZAorCW1vdglyMTFkLGVheAorCWFkZAllY3gscjEyZAorCW1vdglyMTJkLGVheAorCXJvbAllY3gsMTQKKwlhZGQJZWN4LGVkeAorCW5vdAlyMTFkCisJbGVhCWVieCxbMTE2MzUzMTUwMStyMTAqMStyYnhdCisJYW5kCXIxMmQsZWN4CisJYW5kCXIxMWQsZWR4CisJbW92CXIxMGQsRFdPUkRbNTIrcnNpXQorCW9yCXIxMmQscjExZAorCW1vdglyMTFkLGVkeAorCWFkZAllYngscjEyZAorCW1vdglyMTJkLGVkeAorCXJvbAllYngsMjAKKwlhZGQJZWJ4LGVjeAorCW5vdAlyMTFkCisJbGVhCWVheCxbKCgtMTQ0NDY4MTQ2NykpK3IxMCoxK3JheF0KKwlhbmQJcjEyZCxlYngKKwlhbmQJcjExZCxlY3gKKwltb3YJcjEwZCxEV09SRFs4K3JzaV0KKwlvcglyMTJkLHIxMWQKKwltb3YJcjExZCxlY3gKKwlhZGQJZWF4LHIxMmQKKwltb3YJcjEyZCxlY3gKKwlyb2wJZWF4LDUKKwlhZGQJZWF4LGVieAorCW5vdAlyMTFkCisJbGVhCWVkeCxbKCgtNTE0MDM3ODQpKStyMTAqMStyZHhdCisJYW5kCXIxMmQsZWF4CisJYW5kCXIxMWQsZWJ4CisJbW92CXIxMGQsRFdPUkRbMjgrcnNpXQorCW9yCXIxMmQscjExZAorCW1vdglyMTFkLGVieAorCWFkZAllZHgscjEyZAorCW1vdglyMTJkLGVieAorCXJvbAllZHgsOQorCWFkZAllZHgsZWF4CisJbm90CXIxMWQKKwlsZWEJZWN4LFsxNzM1MzI4NDczK3IxMCoxK3JjeF0KKwlhbmQJcjEyZCxlZHgKKwlhbmQJcjExZCxlYXgKKwltb3YJcjEwZCxEV09SRFs0OCtyc2ldCisJb3IJcjEyZCxyMTFkCisJbW92CXIxMWQsZWF4CisJYWRkCWVjeCxyMTJkCisJbW92CXIxMmQsZWF4CisJcm9sCWVjeCwxNAorCWFkZAllY3gsZWR4CisJbm90CXIxMWQKKwlsZWEJZWJ4LFsoKC0xOTI2NjA3NzM0KSkrcjEwKjErcmJ4XQorCWFuZAlyMTJkLGVjeAorCWFuZAlyMTFkLGVkeAorCW1vdglyMTBkLERXT1JEW3JzaV0KKwlvcglyMTJkLHIxMWQKKwltb3YJcjExZCxlZHgKKwlhZGQJZWJ4LHIxMmQKKwltb3YJcjEyZCxlZHgKKwlyb2wJZWJ4LDIwCisJYWRkCWVieCxlY3gKKwltb3YJcjEwZCxEV09SRFsyMCtyc2ldCisJbW92CXIxMWQsZWN4CisJbGVhCWVheCxbKCgtMzc4NTU4KSkrcjEwKjErcmF4XQorCW1vdglyMTBkLERXT1JEWzMyK3JzaV0KKwl4b3IJcjExZCxlZHgKKwl4b3IJcjExZCxlYngKKwlhZGQJZWF4LHIxMWQKKwlyb2wJZWF4LDQKKwltb3YJcjExZCxlYngKKwlhZGQJZWF4LGVieAorCWxlYQllZHgsWygoLTIwMjI1NzQ0NjMpKStyMTAqMStyZHhdCisJbW92CXIxMGQsRFdPUkRbNDQrcnNpXQorCXhvcglyMTFkLGVjeAorCXhvcglyMTFkLGVheAorCWFkZAllZHgscjExZAorCXJvbAllZHgsMTEKKwltb3YJcjExZCxlYXgKKwlhZGQJZWR4LGVheAorCWxlYQllY3gsWzE4MzkwMzA1NjIrcjEwKjErcmN4XQorCW1vdglyMTBkLERXT1JEWzU2K3JzaV0KKwl4b3IJcjExZCxlYngKKwl4b3IJcjExZCxlZHgKKwlhZGQJZWN4LHIxMWQKKwlyb2wJZWN4LDE2CisJbW92CXIxMWQsZWR4CisJYWRkCWVjeCxlZHgKKwlsZWEJZWJ4LFsoKC0zNTMwOTU1NikpK3IxMCoxK3JieF0KKwltb3YJcjEwZCxEV09SRFs0K3JzaV0KKwl4b3IJcjExZCxlYXgKKwl4b3IJcjExZCxlY3gKKwlhZGQJZWJ4LHIxMWQKKwlyb2wJZWJ4LDIzCisJbW92CXIxMWQsZWN4CisJYWRkCWVieCxlY3gKKwlsZWEJZWF4LFsoKC0xNTMwOTkyMDYwKSkrcjEwKjErcmF4XQorCW1vdglyMTBkLERXT1JEWzE2K3JzaV0KKwl4b3IJcjExZCxlZHgKKwl4b3IJcjExZCxlYngKKwlhZGQJZWF4LHIxMWQKKwlyb2wJZWF4LDQKKwltb3YJcjExZCxlYngKKwlhZGQJZWF4LGVieAorCWxlYQllZHgsWzEyNzI4OTMzNTMrcjEwKjErcmR4XQorCW1vdglyMTBkLERXT1JEWzI4K3JzaV0KKwl4b3IJcjExZCxlY3gKKwl4b3IJcjExZCxlYXgKKwlhZGQJZWR4LHIxMWQKKwlyb2wJZWR4LDExCisJbW92CXIxMWQsZWF4CisJYWRkCWVkeCxlYXgKKwlsZWEJZWN4LFsoKC0xNTU0OTc2MzIpKStyMTAqMStyY3hdCisJbW92CXIxMGQsRFdPUkRbNDArcnNpXQorCXhvcglyMTFkLGVieAorCXhvcglyMTFkLGVkeAorCWFkZAllY3gscjExZAorCXJvbAllY3gsMTYKKwltb3YJcjExZCxlZHgKKwlhZGQJZWN4LGVkeAorCWxlYQllYngsWygoLTEwOTQ3MzA2NDApKStyMTAqMStyYnhdCisJbW92CXIxMGQsRFdPUkRbNTIrcnNpXQorCXhvcglyMTFkLGVheAorCXhvcglyMTFkLGVjeAorCWFkZAllYngscjExZAorCXJvbAllYngsMjMKKwltb3YJcjExZCxlY3gKKwlhZGQJZWJ4LGVjeAorCWxlYQllYXgsWzY4MTI3OTE3NCtyMTAqMStyYXhdCisJbW92CXIxMGQsRFdPUkRbcnNpXQorCXhvcglyMTFkLGVkeAorCXhvcglyMTFkLGVieAorCWFkZAllYXgscjExZAorCXJvbAllYXgsNAorCW1vdglyMTFkLGVieAorCWFkZAllYXgsZWJ4CisJbGVhCWVkeCxbKCgtMzU4NTM3MjIyKSkrcjEwKjErcmR4XQorCW1vdglyMTBkLERXT1JEWzEyK3JzaV0KKwl4b3IJcjExZCxlY3gKKwl4b3IJcjExZCxlYXgKKwlhZGQJZWR4LHIxMWQKKwlyb2wJZWR4LDExCisJbW92CXIxMWQsZWF4CisJYWRkCWVkeCxlYXgKKwlsZWEJZWN4LFsoKC03MjI1MjE5NzkpKStyMTAqMStyY3hdCisJbW92CXIxMGQsRFdPUkRbMjQrcnNpXQorCXhvcglyMTFkLGVieAorCXhvcglyMTFkLGVkeAorCWFkZAllY3gscjExZAorCXJvbAllY3gsMTYKKwltb3YJcjExZCxlZHgKKwlhZGQJZWN4LGVkeAorCWxlYQllYngsWzc2MDI5MTg5K3IxMCoxK3JieF0KKwltb3YJcjEwZCxEV09SRFszNityc2ldCisJeG9yCXIxMWQsZWF4CisJeG9yCXIxMWQsZWN4CisJYWRkCWVieCxyMTFkCisJcm9sCWVieCwyMworCW1vdglyMTFkLGVjeAorCWFkZAllYngsZWN4CisJbGVhCWVheCxbKCgtNjQwMzY0NDg3KSkrcjEwKjErcmF4XQorCW1vdglyMTBkLERXT1JEWzQ4K3JzaV0KKwl4b3IJcjExZCxlZHgKKwl4b3IJcjExZCxlYngKKwlhZGQJZWF4LHIxMWQKKwlyb2wJZWF4LDQKKwltb3YJcjExZCxlYngKKwlhZGQJZWF4LGVieAorCWxlYQllZHgsWygoLTQyMTgxNTgzNSkpK3IxMCoxK3JkeF0KKwltb3YJcjEwZCxEV09SRFs2MCtyc2ldCisJeG9yCXIxMWQsZWN4CisJeG9yCXIxMWQsZWF4CisJYWRkCWVkeCxyMTFkCisJcm9sCWVkeCwxMQorCW1vdglyMTFkLGVheAorCWFkZAllZHgsZWF4CisJbGVhCWVjeCxbNTMwNzQyNTIwK3IxMCoxK3JjeF0KKwltb3YJcjEwZCxEV09SRFs4K3JzaV0KKwl4b3IJcjExZCxlYngKKwl4b3IJcjExZCxlZHgKKwlhZGQJZWN4LHIxMWQKKwlyb2wJZWN4LDE2CisJbW92CXIxMWQsZWR4CisJYWRkCWVjeCxlZHgKKwlsZWEJZWJ4LFsoKC05OTUzMzg2NTEpKStyMTAqMStyYnhdCisJbW92CXIxMGQsRFdPUkRbcnNpXQorCXhvcglyMTFkLGVheAorCXhvcglyMTFkLGVjeAorCWFkZAllYngscjExZAorCXJvbAllYngsMjMKKwltb3YJcjExZCxlY3gKKwlhZGQJZWJ4LGVjeAorCW1vdglyMTBkLERXT1JEW3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJeG9yCXIxMWQsZWR4CisJbGVhCWVheCxbKCgtMTk4NjMwODQ0KSkrcjEwKjErcmF4XQorCW9yCXIxMWQsZWJ4CisJeG9yCXIxMWQsZWN4CisJYWRkCWVheCxyMTFkCisJbW92CXIxMGQsRFdPUkRbMjgrcnNpXQorCW1vdglyMTFkLDB4ZmZmZmZmZmYKKwlyb2wJZWF4LDYKKwl4b3IJcjExZCxlY3gKKwlhZGQJZWF4LGVieAorCWxlYQllZHgsWzExMjY4OTE0MTUrcjEwKjErcmR4XQorCW9yCXIxMWQsZWF4CisJeG9yCXIxMWQsZWJ4CisJYWRkCWVkeCxyMTFkCisJbW92CXIxMGQsRFdPUkRbNTYrcnNpXQorCW1vdglyMTFkLDB4ZmZmZmZmZmYKKwlyb2wJZWR4LDEwCisJeG9yCXIxMWQsZWJ4CisJYWRkCWVkeCxlYXgKKwlsZWEJZWN4LFsoKC0xNDE2MzU0OTA1KSkrcjEwKjErcmN4XQorCW9yCXIxMWQsZWR4CisJeG9yCXIxMWQsZWF4CisJYWRkCWVjeCxyMTFkCisJbW92CXIxMGQsRFdPUkRbMjArcnNpXQorCW1vdglyMTFkLDB4ZmZmZmZmZmYKKwlyb2wJZWN4LDE1CisJeG9yCXIxMWQsZWF4CisJYWRkCWVjeCxlZHgKKwlsZWEJZWJ4LFsoKC01NzQzNDA1NSkpK3IxMCoxK3JieF0KKwlvcglyMTFkLGVjeAorCXhvcglyMTFkLGVkeAorCWFkZAllYngscjExZAorCW1vdglyMTBkLERXT1JEWzQ4K3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJcm9sCWVieCwyMQorCXhvcglyMTFkLGVkeAorCWFkZAllYngsZWN4CisJbGVhCWVheCxbMTcwMDQ4NTU3MStyMTAqMStyYXhdCisJb3IJcjExZCxlYngKKwl4b3IJcjExZCxlY3gKKwlhZGQJZWF4LHIxMWQKKwltb3YJcjEwZCxEV09SRFsxMityc2ldCisJbW92CXIxMWQsMHhmZmZmZmZmZgorCXJvbAllYXgsNgorCXhvcglyMTFkLGVjeAorCWFkZAllYXgsZWJ4CisJbGVhCWVkeCxbKCgtMTg5NDk4NjYwNikpK3IxMCoxK3JkeF0KKwlvcglyMTFkLGVheAorCXhvcglyMTFkLGVieAorCWFkZAllZHgscjExZAorCW1vdglyMTBkLERXT1JEWzQwK3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJcm9sCWVkeCwxMAorCXhvcglyMTFkLGVieAorCWFkZAllZHgsZWF4CisJbGVhCWVjeCxbKCgtMTA1MTUyMykpK3IxMCoxK3JjeF0KKwlvcglyMTFkLGVkeAorCXhvcglyMTFkLGVheAorCWFkZAllY3gscjExZAorCW1vdglyMTBkLERXT1JEWzQrcnNpXQorCW1vdglyMTFkLDB4ZmZmZmZmZmYKKwlyb2wJZWN4LDE1CisJeG9yCXIxMWQsZWF4CisJYWRkCWVjeCxlZHgKKwlsZWEJZWJ4LFsoKC0yMDU0OTIyNzk5KSkrcjEwKjErcmJ4XQorCW9yCXIxMWQsZWN4CisJeG9yCXIxMWQsZWR4CisJYWRkCWVieCxyMTFkCisJbW92CXIxMGQsRFdPUkRbMzIrcnNpXQorCW1vdglyMTFkLDB4ZmZmZmZmZmYKKwlyb2wJZWJ4LDIxCisJeG9yCXIxMWQsZWR4CisJYWRkCWVieCxlY3gKKwlsZWEJZWF4LFsxODczMzEzMzU5K3IxMCoxK3JheF0KKwlvcglyMTFkLGVieAorCXhvcglyMTFkLGVjeAorCWFkZAllYXgscjExZAorCW1vdglyMTBkLERXT1JEWzYwK3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJcm9sCWVheCw2CisJeG9yCXIxMWQsZWN4CisJYWRkCWVheCxlYngKKwlsZWEJZWR4LFsoKC0zMDYxMTc0NCkpK3IxMCoxK3JkeF0KKwlvcglyMTFkLGVheAorCXhvcglyMTFkLGVieAorCWFkZAllZHgscjExZAorCW1vdglyMTBkLERXT1JEWzI0K3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJcm9sCWVkeCwxMAorCXhvcglyMTFkLGVieAorCWFkZAllZHgsZWF4CisJbGVhCWVjeCxbKCgtMTU2MDE5ODM4MCkpK3IxMCoxK3JjeF0KKwlvcglyMTFkLGVkeAorCXhvcglyMTFkLGVheAorCWFkZAllY3gscjExZAorCW1vdglyMTBkLERXT1JEWzUyK3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJcm9sCWVjeCwxNQorCXhvcglyMTFkLGVheAorCWFkZAllY3gsZWR4CisJbGVhCWVieCxbMTMwOTE1MTY0OStyMTAqMStyYnhdCisJb3IJcjExZCxlY3gKKwl4b3IJcjExZCxlZHgKKwlhZGQJZWJ4LHIxMWQKKwltb3YJcjEwZCxEV09SRFsxNityc2ldCisJbW92CXIxMWQsMHhmZmZmZmZmZgorCXJvbAllYngsMjEKKwl4b3IJcjExZCxlZHgKKwlhZGQJZWJ4LGVjeAorCWxlYQllYXgsWygoLTE0NTUyMzA3MCkpK3IxMCoxK3JheF0KKwlvcglyMTFkLGVieAorCXhvcglyMTFkLGVjeAorCWFkZAllYXgscjExZAorCW1vdglyMTBkLERXT1JEWzQ0K3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJcm9sCWVheCw2CisJeG9yCXIxMWQsZWN4CisJYWRkCWVheCxlYngKKwlsZWEJZWR4LFsoKC0xMTIwMjEwMzc5KSkrcjEwKjErcmR4XQorCW9yCXIxMWQsZWF4CisJeG9yCXIxMWQsZWJ4CisJYWRkCWVkeCxyMTFkCisJbW92CXIxMGQsRFdPUkRbOCtyc2ldCisJbW92CXIxMWQsMHhmZmZmZmZmZgorCXJvbAllZHgsMTAKKwl4b3IJcjExZCxlYngKKwlhZGQJZWR4LGVheAorCWxlYQllY3gsWzcxODc4NzI1OStyMTAqMStyY3hdCisJb3IJcjExZCxlZHgKKwl4b3IJcjExZCxlYXgKKwlhZGQJZWN4LHIxMWQKKwltb3YJcjEwZCxEV09SRFszNityc2ldCisJbW92CXIxMWQsMHhmZmZmZmZmZgorCXJvbAllY3gsMTUKKwl4b3IJcjExZCxlYXgKKwlhZGQJZWN4LGVkeAorCWxlYQllYngsWygoLTM0MzQ4NTU1MSkpK3IxMCoxK3JieF0KKwlvcglyMTFkLGVjeAorCXhvcglyMTFkLGVkeAorCWFkZAllYngscjExZAorCW1vdglyMTBkLERXT1JEW3JzaV0KKwltb3YJcjExZCwweGZmZmZmZmZmCisJcm9sCWVieCwyMQorCXhvcglyMTFkLGVkeAorCWFkZAllYngsZWN4CisKKwlhZGQJZWF4LHI4ZAorCWFkZAllYngscjlkCisJYWRkCWVjeCxyMTRkCisJYWRkCWVkeCxyMTVkCisKKworCWFkZAlyc2ksNjQKKwljbXAJcnNpLHJkaQorCWpiCU5FQVIgJEwkbG9vcAorCisKKyRMJGVuZDoKKwltb3YJRFdPUkRbcmJwXSxlYXgKKwltb3YJRFdPUkRbNCtyYnBdLGVieAorCW1vdglEV09SRFs4K3JicF0sZWN4CisJbW92CURXT1JEWzEyK3JicF0sZWR4CisKKwltb3YJcjE1LFFXT1JEW3JzcF0KKwltb3YJcjE0LFFXT1JEWzgrcnNwXQorCW1vdglyMTIsUVdPUkRbMTYrcnNwXQorCW1vdglyYngsUVdPUkRbMjQrcnNwXQorCW1vdglyYnAsUVdPUkRbMzIrcnNwXQorCWFkZAlyc3AsNDAKKyRMJGVwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF9tZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXI6CitFWFRFUk4JX19pbXBfUnRsVmlydHVhbFVud2luZAorCitBTElHTgkxNgorc2VfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwlsZWEJcjEwLFskTCRwcm9sb2d1ZV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fcHJvbG9ndWUKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbGVhCXIxMCxbJEwkZXBpbG9ndWVdCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRpbl9wcm9sb2d1ZQorCisJbGVhCXJheCxbNDArcmF4XQorCisJbW92CXJicCxRV09SRFsoKC04KSkrcmF4XQorCW1vdglyYngsUVdPUkRbKCgtMTYpKStyYXhdCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTMyKSkrcmF4XQorCW1vdglyMTUsUVdPUkRbKCgtNDApKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisKKyRMJGluX3Byb2xvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyYXhdCisJbW92CXJzaSxRV09SRFsxNityYXhdCisJbW92CVFXT1JEWzE1MityOF0scmF4CisJbW92CVFXT1JEWzE2OCtyOF0scnNpCisJbW92CVFXT1JEWzE3NityOF0scmRpCisKKwltb3YJcmRpLFFXT1JEWzQwK3I5XQorCW1vdglyc2kscjgKKwltb3YJZWN4LDE1NAorCURECTB4YTU0OGYzZmMKKworCW1vdglyc2kscjkKKwl4b3IJcmN4LHJjeAorCW1vdglyZHgsUVdPUkRbOCtyc2ldCisJbW92CXI4LFFXT1JEW3JzaV0KKwltb3YJcjksUVdPUkRbMTYrcnNpXQorCW1vdglyMTAsUVdPUkRbNDArcnNpXQorCWxlYQlyMTEsWzU2K3JzaV0KKwlsZWEJcjEyLFsyNCtyc2ldCisJbW92CVFXT1JEWzMyK3JzcF0scjEwCisJbW92CVFXT1JEWzQwK3JzcF0scjExCisJbW92CVFXT1JEWzQ4K3JzcF0scjEyCisJbW92CVFXT1JEWzU2K3JzcF0scmN4CisJY2FsbAlRV09SRFtfX2ltcF9SdGxWaXJ0dWFsVW53aW5kXQorCisJbW92CWVheCwxCisJYWRkCXJzcCw2NAorCXBvcGZxCisJcG9wCXIxNQorCXBvcAlyMTQKKwlwb3AJcjEzCisJcG9wCXIxMgorCXBvcAlyYnAKKwlwb3AJcmJ4CisJcG9wCXJkaQorCXBvcAlyc2kKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitzZWN0aW9uCS5wZGF0YSByZGF0YSBhbGlnbj00CitBTElHTgk0CisJREQJJEwkU0VIX2JlZ2luX21kNV9ibG9ja19hc21fZGF0YV9vcmRlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX21kNV9ibG9ja19hc21fZGF0YV9vcmRlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19tZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIgd3J0IC4uaW1hZ2ViYXNlCisKK3NlY3Rpb24JLnhkYXRhIHJkYXRhIGFsaWduPTgKK0FMSUdOCTgKKyRMJFNFSF9pbmZvX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKK0RCCTksMCwwLDAKKwlERAlzZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3AyNTYteDg2XzY0LWFzbS5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvcDI1Ni14ODZfNjQtYXNtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI3YzA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3AyNTYteDg2XzY0LWFzbS5hc20KQEAgLTAsMCArMSw0OTI3IEBACitkZWZhdWx0CXJlbAorJWRlZmluZSBYTU1XT1JECislZGVmaW5lIFlNTVdPUkQKKyVkZWZpbmUgWk1NV09SRAorc2VjdGlvbgkudGV4dCBjb2RlIGFsaWduPTY0CisKK0VYVEVSTglPUEVOU1NMX2lhMzJjYXBfUAorCisKK0FMSUdOCTY0CiskTCRwb2x5OgorCURRCTB4ZmZmZmZmZmZmZmZmZmZmZiwweDAwMDAwMDAwZmZmZmZmZmYsMHgwMDAwMDAwMDAwMDAwMDAwLDB4ZmZmZmZmZmYwMDAwMDAwMQorCiskTCRPbmU6CisJREQJMSwxLDEsMSwxLDEsMSwxCiskTCRUd286CisJREQJMiwyLDIsMiwyLDIsMiwyCiskTCRUaHJlZToKKwlERAkzLDMsMywzLDMsMywzLDMKKyRMJE9ORV9tb250OgorCURRCTB4MDAwMDAwMDAwMDAwMDAwMSwweGZmZmZmZmZmMDAwMDAwMDAsMHhmZmZmZmZmZmZmZmZmZmZmLDB4MDAwMDAwMDBmZmZmZmZmZQorCisKKyRMJG9yZDoKKwlEUQkweGYzYjljYWMyZmM2MzI1NTEsMHhiY2U2ZmFhZGE3MTc5ZTg0LDB4ZmZmZmZmZmZmZmZmZmZmZiwweGZmZmZmZmZmMDAwMDAwMDAKKyRMJG9yZEs6CisJRFEJMHhjY2QxYzhhYWVlMDBiYzRmCisKKworCitnbG9iYWwJZWNwX25pc3R6MjU2X25lZworCitBTElHTgkzMgorZWNwX25pc3R6MjU2X25lZzoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9uZWc6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCisKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCiskTCRuZWdfYm9keToKKworCXhvcglyOCxyOAorCXhvcglyOSxyOQorCXhvcglyMTAscjEwCisJeG9yCXIxMSxyMTEKKwl4b3IJcjEzLHIxMworCisJc3ViCXI4LFFXT1JEW3JzaV0KKwlzYmIJcjksUVdPUkRbOCtyc2ldCisJc2JiCXIxMCxRV09SRFsxNityc2ldCisJbW92CXJheCxyOAorCXNiYglyMTEsUVdPUkRbMjQrcnNpXQorCWxlYQlyc2ksWyRMJHBvbHldCisJbW92CXJkeCxyOQorCXNiYglyMTMsMAorCisJYWRkCXI4LFFXT1JEW3JzaV0KKwltb3YJcmN4LHIxMAorCWFkYwlyOSxRV09SRFs4K3JzaV0KKwlhZGMJcjEwLFFXT1JEWzE2K3JzaV0KKwltb3YJcjEyLHIxMQorCWFkYwlyMTEsUVdPUkRbMjQrcnNpXQorCXRlc3QJcjEzLHIxMworCisJY21vdnoJcjgscmF4CisJY21vdnoJcjkscmR4CisJbW92CVFXT1JEW3JkaV0scjgKKwljbW92eglyMTAscmN4CisJbW92CVFXT1JEWzgrcmRpXSxyOQorCWNtb3Z6CXIxMSxyMTIKKwltb3YJUVdPUkRbMTYrcmRpXSxyMTAKKwltb3YJUVdPUkRbMjQrcmRpXSxyMTEKKworCW1vdglyMTMsUVdPUkRbcnNwXQorCisJbW92CXIxMixRV09SRFs4K3JzcF0KKworCWxlYQlyc3AsWzE2K3JzcF0KKworJEwkbmVnX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9uZWc6CisKKworCisKKworCitnbG9iYWwJZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udAorCitBTElHTgkzMgorZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisKKwlsZWEJcmN4LFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJcmN4LFFXT1JEWzgrcmN4XQorCWFuZAllY3gsMHg4MDEwMAorCWNtcAllY3gsMHg4MDEwMAorCWplCU5FQVIgJEwkZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udHgKKwlwdXNoCXJicAorCisJcHVzaAlyYngKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKyRMJG9yZF9tdWxfYm9keToKKworCW1vdglyYXgsUVdPUkRbcmR4XQorCW1vdglyYngscmR4CisJbGVhCXIxNCxbJEwkb3JkXQorCW1vdglyMTUsUVdPUkRbJEwkb3JkS10KKworCisJbW92CXJjeCxyYXgKKwltdWwJUVdPUkRbcnNpXQorCW1vdglyOCxyYXgKKwltb3YJcmF4LHJjeAorCW1vdglyOSxyZHgKKworCW11bAlRV09SRFs4K3JzaV0KKwlhZGQJcjkscmF4CisJbW92CXJheCxyY3gKKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCVFXT1JEWzE2K3JzaV0KKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmN4CisJYWRjCXJkeCwwCisKKwltb3YJcjEzLHI4CisJaW11bAlyOCxyMTUKKworCW1vdglyMTEscmR4CisJbXVsCVFXT1JEWzI0K3JzaV0KKwlhZGQJcjExLHJheAorCW1vdglyYXgscjgKKwlhZGMJcmR4LDAKKwltb3YJcjEyLHJkeAorCisKKwltdWwJUVdPUkRbcjE0XQorCW1vdglyYnAscjgKKwlhZGQJcjEzLHJheAorCW1vdglyYXgscjgKKwlhZGMJcmR4LDAKKwltb3YJcmN4LHJkeAorCisJc3ViCXIxMCxyOAorCXNiYglyOCwwCisKKwltdWwJUVdPUkRbOCtyMTRdCisJYWRkCXI5LHJjeAorCWFkYwlyZHgsMAorCWFkZAlyOSxyYXgKKwltb3YJcmF4LHJicAorCWFkYwlyMTAscmR4CisJbW92CXJkeCxyYnAKKwlhZGMJcjgsMAorCisJc2hsCXJheCwzMgorCXNocglyZHgsMzIKKwlzdWIJcjExLHJheAorCW1vdglyYXgsUVdPUkRbOCtyYnhdCisJc2JiCXJicCxyZHgKKworCWFkZAlyMTEscjgKKwlhZGMJcjEyLHJicAorCWFkYwlyMTMsMAorCisKKwltb3YJcmN4LHJheAorCW11bAlRV09SRFtyc2ldCisJYWRkCXI5LHJheAorCW1vdglyYXgscmN4CisJYWRjCXJkeCwwCisJbW92CXJicCxyZHgKKworCW11bAlRV09SRFs4K3JzaV0KKwlhZGQJcjEwLHJicAorCWFkYwlyZHgsMAorCWFkZAlyMTAscmF4CisJbW92CXJheCxyY3gKKwlhZGMJcmR4LDAKKwltb3YJcmJwLHJkeAorCisJbXVsCVFXT1JEWzE2K3JzaV0KKwlhZGQJcjExLHJicAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmF4CisJbW92CXJheCxyY3gKKwlhZGMJcmR4LDAKKworCW1vdglyY3gscjkKKwlpbXVsCXI5LHIxNQorCisJbW92CXJicCxyZHgKKwltdWwJUVdPUkRbMjQrcnNpXQorCWFkZAlyMTIscmJwCisJYWRjCXJkeCwwCisJeG9yCXI4LHI4CisJYWRkCXIxMixyYXgKKwltb3YJcmF4LHI5CisJYWRjCXIxMyxyZHgKKwlhZGMJcjgsMAorCisKKwltdWwJUVdPUkRbcjE0XQorCW1vdglyYnAscjkKKwlhZGQJcmN4LHJheAorCW1vdglyYXgscjkKKwlhZGMJcmN4LHJkeAorCisJc3ViCXIxMSxyOQorCXNiYglyOSwwCisKKwltdWwJUVdPUkRbOCtyMTRdCisJYWRkCXIxMCxyY3gKKwlhZGMJcmR4LDAKKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmJwCisJYWRjCXIxMSxyZHgKKwltb3YJcmR4LHJicAorCWFkYwlyOSwwCisKKwlzaGwJcmF4LDMyCisJc2hyCXJkeCwzMgorCXN1YglyMTIscmF4CisJbW92CXJheCxRV09SRFsxNityYnhdCisJc2JiCXJicCxyZHgKKworCWFkZAlyMTIscjkKKwlhZGMJcjEzLHJicAorCWFkYwlyOCwwCisKKworCW1vdglyY3gscmF4CisJbXVsCVFXT1JEW3JzaV0KKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmN4CisJYWRjCXJkeCwwCisJbW92CXJicCxyZHgKKworCW11bAlRV09SRFs4K3JzaV0KKwlhZGQJcjExLHJicAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmF4CisJbW92CXJheCxyY3gKKwlhZGMJcmR4LDAKKwltb3YJcmJwLHJkeAorCisJbXVsCVFXT1JEWzE2K3JzaV0KKwlhZGQJcjEyLHJicAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmF4CisJbW92CXJheCxyY3gKKwlhZGMJcmR4LDAKKworCW1vdglyY3gscjEwCisJaW11bAlyMTAscjE1CisKKwltb3YJcmJwLHJkeAorCW11bAlRV09SRFsyNCtyc2ldCisJYWRkCXIxMyxyYnAKKwlhZGMJcmR4LDAKKwl4b3IJcjkscjkKKwlhZGQJcjEzLHJheAorCW1vdglyYXgscjEwCisJYWRjCXI4LHJkeAorCWFkYwlyOSwwCisKKworCW11bAlRV09SRFtyMTRdCisJbW92CXJicCxyMTAKKwlhZGQJcmN4LHJheAorCW1vdglyYXgscjEwCisJYWRjCXJjeCxyZHgKKworCXN1YglyMTIscjEwCisJc2JiCXIxMCwwCisKKwltdWwJUVdPUkRbOCtyMTRdCisJYWRkCXIxMSxyY3gKKwlhZGMJcmR4LDAKKwlhZGQJcjExLHJheAorCW1vdglyYXgscmJwCisJYWRjCXIxMixyZHgKKwltb3YJcmR4LHJicAorCWFkYwlyMTAsMAorCisJc2hsCXJheCwzMgorCXNocglyZHgsMzIKKwlzdWIJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbMjQrcmJ4XQorCXNiYglyYnAscmR4CisKKwlhZGQJcjEzLHIxMAorCWFkYwlyOCxyYnAKKwlhZGMJcjksMAorCisKKwltb3YJcmN4LHJheAorCW11bAlRV09SRFtyc2ldCisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LHJjeAorCWFkYwlyZHgsMAorCW1vdglyYnAscmR4CisKKwltdWwJUVdPUkRbOCtyc2ldCisJYWRkCXIxMixyYnAKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJheAorCW1vdglyYXgscmN4CisJYWRjCXJkeCwwCisJbW92CXJicCxyZHgKKworCW11bAlRV09SRFsxNityc2ldCisJYWRkCXIxMyxyYnAKKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHJheAorCW1vdglyYXgscmN4CisJYWRjCXJkeCwwCisKKwltb3YJcmN4LHIxMQorCWltdWwJcjExLHIxNQorCisJbW92CXJicCxyZHgKKwltdWwJUVdPUkRbMjQrcnNpXQorCWFkZAlyOCxyYnAKKwlhZGMJcmR4LDAKKwl4b3IJcjEwLHIxMAorCWFkZAlyOCxyYXgKKwltb3YJcmF4LHIxMQorCWFkYwlyOSxyZHgKKwlhZGMJcjEwLDAKKworCisJbXVsCVFXT1JEW3IxNF0KKwltb3YJcmJwLHIxMQorCWFkZAlyY3gscmF4CisJbW92CXJheCxyMTEKKwlhZGMJcmN4LHJkeAorCisJc3ViCXIxMyxyMTEKKwlzYmIJcjExLDAKKworCW11bAlRV09SRFs4K3IxNF0KKwlhZGQJcjEyLHJjeAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmF4CisJbW92CXJheCxyYnAKKwlhZGMJcjEzLHJkeAorCW1vdglyZHgscmJwCisJYWRjCXIxMSwwCisKKwlzaGwJcmF4LDMyCisJc2hyCXJkeCwzMgorCXN1YglyOCxyYXgKKwlzYmIJcmJwLHJkeAorCisJYWRkCXI4LHIxMQorCWFkYwlyOSxyYnAKKwlhZGMJcjEwLDAKKworCisJbW92CXJzaSxyMTIKKwlzdWIJcjEyLFFXT1JEW3IxNF0KKwltb3YJcjExLHIxMworCXNiYglyMTMsUVdPUkRbOCtyMTRdCisJbW92CXJjeCxyOAorCXNiYglyOCxRV09SRFsxNityMTRdCisJbW92CXJicCxyOQorCXNiYglyOSxRV09SRFsyNCtyMTRdCisJc2JiCXIxMCwwCisKKwljbW92YwlyMTIscnNpCisJY21vdmMJcjEzLHIxMQorCWNtb3ZjCXI4LHJjeAorCWNtb3ZjCXI5LHJicAorCisJbW92CVFXT1JEW3JkaV0scjEyCisJbW92CVFXT1JEWzgrcmRpXSxyMTMKKwltb3YJUVdPUkRbMTYrcmRpXSxyOAorCW1vdglRV09SRFsyNCtyZGldLHI5CisKKwltb3YJcjE1LFFXT1JEW3JzcF0KKworCW1vdglyMTQsUVdPUkRbOCtyc3BdCisKKwltb3YJcjEzLFFXT1JEWzE2K3JzcF0KKworCW1vdglyMTIsUVdPUkRbMjQrcnNwXQorCisJbW92CXJieCxRV09SRFszMityc3BdCisKKwltb3YJcmJwLFFXT1JEWzQwK3JzcF0KKworCWxlYQlyc3AsWzQ4K3JzcF0KKworJEwkb3JkX211bF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfb3JkX211bF9tb250OgorCisKKworCisKKworCitnbG9iYWwJZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udAorCitBTElHTgkzMgorZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisKKwlsZWEJcmN4LFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJcmN4LFFXT1JEWzgrcmN4XQorCWFuZAllY3gsMHg4MDEwMAorCWNtcAllY3gsMHg4MDEwMAorCWplCU5FQVIgJEwkZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udHgKKwlwdXNoCXJicAorCisJcHVzaAlyYngKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKyRMJG9yZF9zcXJfYm9keToKKworCW1vdglyOCxRV09SRFtyc2ldCisJbW92CXJheCxRV09SRFs4K3JzaV0KKwltb3YJcjE0LFFXT1JEWzE2K3JzaV0KKwltb3YJcjE1LFFXT1JEWzI0K3JzaV0KKwlsZWEJcnNpLFskTCRvcmRdCisJbW92CXJieCxyZHgKKwlqbXAJTkVBUiAkTCRvb3Bfb3JkX3NxcgorCitBTElHTgkzMgorJEwkb29wX29yZF9zcXI6CisKKwltb3YJcmJwLHJheAorCW11bAlyOAorCW1vdglyOSxyYXgKK0RCCTEwMiw3MiwxNSwxMTAsMjA1CisJbW92CXJheCxyMTQKKwltb3YJcjEwLHJkeAorCisJbXVsCXI4CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHIxNQorREIJMTAyLDczLDE1LDExMCwyMTQKKwlhZGMJcmR4LDAKKwltb3YJcjExLHJkeAorCisJbXVsCXI4CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LHIxNQorREIJMTAyLDczLDE1LDExMCwyMjMKKwlhZGMJcmR4LDAKKwltb3YJcjEyLHJkeAorCisKKwltdWwJcjE0CisJbW92CXIxMyxyYXgKKwltb3YJcmF4LHIxNAorCW1vdglyMTQscmR4CisKKworCW11bAlyYnAKKwlhZGQJcjExLHJheAorCW1vdglyYXgscjE1CisJYWRjCXJkeCwwCisJbW92CXIxNSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEyLHJheAorCWFkYwlyZHgsMAorCisJYWRkCXIxMixyMTUKKwlhZGMJcjEzLHJkeAorCWFkYwlyMTQsMAorCisKKwl4b3IJcjE1LHIxNQorCW1vdglyYXgscjgKKwlhZGQJcjkscjkKKwlhZGMJcjEwLHIxMAorCWFkYwlyMTEscjExCisJYWRjCXIxMixyMTIKKwlhZGMJcjEzLHIxMworCWFkYwlyMTQscjE0CisJYWRjCXIxNSwwCisKKworCW11bAlyYXgKKwltb3YJcjgscmF4CitEQgkxMDIsNzIsMTUsMTI2LDIwMAorCW1vdglyYnAscmR4CisKKwltdWwJcmF4CisJYWRkCXI5LHJicAorCWFkYwlyMTAscmF4CitEQgkxMDIsNzIsMTUsMTI2LDIwOAorCWFkYwlyZHgsMAorCW1vdglyYnAscmR4CisKKwltdWwJcmF4CisJYWRkCXIxMSxyYnAKKwlhZGMJcjEyLHJheAorREIJMTAyLDcyLDE1LDEyNiwyMTYKKwlhZGMJcmR4LDAKKwltb3YJcmJwLHJkeAorCisJbW92CXJjeCxyOAorCWltdWwJcjgsUVdPUkRbMzIrcnNpXQorCisJbXVsCXJheAorCWFkZAlyMTMscmJwCisJYWRjCXIxNCxyYXgKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwlhZGMJcjE1LHJkeAorCisKKwltdWwJcjgKKwltb3YJcmJwLHI4CisJYWRkCXJjeCxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcnNpXQorCWFkYwlyY3gscmR4CisKKwlzdWIJcjEwLHI4CisJc2JiCXJicCwwCisKKwltdWwJcjgKKwlhZGQJcjkscmN4CisJYWRjCXJkeCwwCisJYWRkCXI5LHJheAorCW1vdglyYXgscjgKKwlhZGMJcjEwLHJkeAorCW1vdglyZHgscjgKKwlhZGMJcmJwLDAKKworCW1vdglyY3gscjkKKwlpbXVsCXI5LFFXT1JEWzMyK3JzaV0KKworCXNobAlyYXgsMzIKKwlzaHIJcmR4LDMyCisJc3ViCXIxMSxyYXgKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwlzYmIJcjgscmR4CisKKwlhZGQJcjExLHJicAorCWFkYwlyOCwwCisKKworCW11bAlyOQorCW1vdglyYnAscjkKKwlhZGQJcmN4LHJheAorCW1vdglyYXgsUVdPUkRbOCtyc2ldCisJYWRjCXJjeCxyZHgKKworCXN1YglyMTEscjkKKwlzYmIJcmJwLDAKKworCW11bAlyOQorCWFkZAlyMTAscmN4CisJYWRjCXJkeCwwCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHI5CisJYWRjCXIxMSxyZHgKKwltb3YJcmR4LHI5CisJYWRjCXJicCwwCisKKwltb3YJcmN4LHIxMAorCWltdWwJcjEwLFFXT1JEWzMyK3JzaV0KKworCXNobAlyYXgsMzIKKwlzaHIJcmR4LDMyCisJc3ViCXI4LHJheAorCW1vdglyYXgsUVdPUkRbcnNpXQorCXNiYglyOSxyZHgKKworCWFkZAlyOCxyYnAKKwlhZGMJcjksMAorCisKKwltdWwJcjEwCisJbW92CXJicCxyMTAKKwlhZGQJcmN4LHJheAorCW1vdglyYXgsUVdPUkRbOCtyc2ldCisJYWRjCXJjeCxyZHgKKworCXN1YglyOCxyMTAKKwlzYmIJcmJwLDAKKworCW11bAlyMTAKKwlhZGQJcjExLHJjeAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmF4CisJbW92CXJheCxyMTAKKwlhZGMJcjgscmR4CisJbW92CXJkeCxyMTAKKwlhZGMJcmJwLDAKKworCW1vdglyY3gscjExCisJaW11bAlyMTEsUVdPUkRbMzIrcnNpXQorCisJc2hsCXJheCwzMgorCXNocglyZHgsMzIKKwlzdWIJcjkscmF4CisJbW92CXJheCxRV09SRFtyc2ldCisJc2JiCXIxMCxyZHgKKworCWFkZAlyOSxyYnAKKwlhZGMJcjEwLDAKKworCisJbXVsCXIxMQorCW1vdglyYnAscjExCisJYWRkCXJjeCxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcnNpXQorCWFkYwlyY3gscmR4CisKKwlzdWIJcjkscjExCisJc2JiCXJicCwwCisKKwltdWwJcjExCisJYWRkCXI4LHJjeAorCWFkYwlyZHgsMAorCWFkZAlyOCxyYXgKKwltb3YJcmF4LHIxMQorCWFkYwlyOSxyZHgKKwltb3YJcmR4LHIxMQorCWFkYwlyYnAsMAorCisJc2hsCXJheCwzMgorCXNocglyZHgsMzIKKwlzdWIJcjEwLHJheAorCXNiYglyMTEscmR4CisKKwlhZGQJcjEwLHJicAorCWFkYwlyMTEsMAorCisKKwl4b3IJcmR4LHJkeAorCWFkZAlyOCxyMTIKKwlhZGMJcjkscjEzCisJbW92CXIxMixyOAorCWFkYwlyMTAscjE0CisJYWRjCXIxMSxyMTUKKwltb3YJcmF4LHI5CisJYWRjCXJkeCwwCisKKworCXN1YglyOCxRV09SRFtyc2ldCisJbW92CXIxNCxyMTAKKwlzYmIJcjksUVdPUkRbOCtyc2ldCisJc2JiCXIxMCxRV09SRFsxNityc2ldCisJbW92CXIxNSxyMTEKKwlzYmIJcjExLFFXT1JEWzI0K3JzaV0KKwlzYmIJcmR4LDAKKworCWNtb3ZjCXI4LHIxMgorCWNtb3ZuYwlyYXgscjkKKwljbW92bmMJcjE0LHIxMAorCWNtb3ZuYwlyMTUscjExCisKKwlkZWMJcmJ4CisJam56CU5FQVIgJEwkb29wX29yZF9zcXIKKworCW1vdglRV09SRFtyZGldLHI4CisJbW92CVFXT1JEWzgrcmRpXSxyYXgKKwlweG9yCXhtbTEseG1tMQorCW1vdglRV09SRFsxNityZGldLHIxNAorCXB4b3IJeG1tMix4bW0yCisJbW92CVFXT1JEWzI0K3JkaV0scjE1CisJcHhvcgl4bW0zLHhtbTMKKworCW1vdglyMTUsUVdPUkRbcnNwXQorCisJbW92CXIxNCxRV09SRFs4K3JzcF0KKworCW1vdglyMTMsUVdPUkRbMTYrcnNwXQorCisJbW92CXIxMixRV09SRFsyNCtyc3BdCisKKwltb3YJcmJ4LFFXT1JEWzMyK3JzcF0KKworCW1vdglyYnAsUVdPUkRbNDArcnNwXQorCisJbGVhCXJzcCxbNDgrcnNwXQorCiskTCRvcmRfc3FyX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnQ6CisKKworQUxJR04JMzIKK2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnR4OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udHg6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisKKyRMJGVjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnR4OgorCXB1c2gJcmJwCisKKwlwdXNoCXJieAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworJEwkb3JkX211bHhfYm9keToKKworCW1vdglyYngscmR4CisJbW92CXJkeCxRV09SRFtyZHhdCisJbW92CXI5LFFXT1JEW3JzaV0KKwltb3YJcjEwLFFXT1JEWzgrcnNpXQorCW1vdglyMTEsUVdPUkRbMTYrcnNpXQorCW1vdglyMTIsUVdPUkRbMjQrcnNpXQorCWxlYQlyc2ksWygoLTEyOCkpK3JzaV0KKwlsZWEJcjE0LFsoKCRMJG9yZC0xMjgpKV0KKwltb3YJcjE1LFFXT1JEWyRMJG9yZEtdCisKKworCW11bHgJcjkscjgscjkKKwltdWx4CXIxMCxyY3gscjEwCisJbXVseAlyMTEscmJwLHIxMQorCWFkZAlyOSxyY3gKKwltdWx4CXIxMixyY3gscjEyCisJbW92CXJkeCxyOAorCW11bHgJcmF4LHJkeCxyMTUKKwlhZGMJcjEwLHJicAorCWFkYwlyMTEscmN4CisJYWRjCXIxMiwwCisKKworCXhvcglyMTMscjEzCisJbXVseAlyYnAscmN4LFFXT1JEWygoMCsxMjgpKStyMTRdCisJYWRjeAlyOCxyY3gKKwlhZG94CXI5LHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoOCsxMjgpKStyMTRdCisJYWRjeAlyOSxyY3gKKwlhZG94CXIxMCxyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDE2KzEyOCkpK3IxNF0KKwlhZGN4CXIxMCxyY3gKKwlhZG94CXIxMSxyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDI0KzEyOCkpK3IxNF0KKwltb3YJcmR4LFFXT1JEWzgrcmJ4XQorCWFkY3gJcjExLHJjeAorCWFkb3gJcjEyLHJicAorCWFkY3gJcjEyLHI4CisJYWRveAlyMTMscjgKKwlhZGMJcjEzLDAKKworCisJbXVseAlyYnAscmN4LFFXT1JEWygoMCsxMjgpKStyc2ldCisJYWRjeAlyOSxyY3gKKwlhZG94CXIxMCxyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDgrMTI4KSkrcnNpXQorCWFkY3gJcjEwLHJjeAorCWFkb3gJcjExLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMTYrMTI4KSkrcnNpXQorCWFkY3gJcjExLHJjeAorCWFkb3gJcjEyLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMjQrMTI4KSkrcnNpXQorCW1vdglyZHgscjkKKwltdWx4CXJheCxyZHgscjE1CisJYWRjeAlyMTIscmN4CisJYWRveAlyMTMscmJwCisKKwlhZGN4CXIxMyxyOAorCWFkb3gJcjgscjgKKwlhZGMJcjgsMAorCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgwKzEyOCkpK3IxNF0KKwlhZGN4CXI5LHJjeAorCWFkb3gJcjEwLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoOCsxMjgpKStyMTRdCisJYWRjeAlyMTAscmN4CisJYWRveAlyMTEscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgxNisxMjgpKStyMTRdCisJYWRjeAlyMTEscmN4CisJYWRveAlyMTIscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgyNCsxMjgpKStyMTRdCisJbW92CXJkeCxRV09SRFsxNityYnhdCisJYWRjeAlyMTIscmN4CisJYWRveAlyMTMscmJwCisJYWRjeAlyMTMscjkKKwlhZG94CXI4LHI5CisJYWRjCXI4LDAKKworCisJbXVseAlyYnAscmN4LFFXT1JEWygoMCsxMjgpKStyc2ldCisJYWRjeAlyMTAscmN4CisJYWRveAlyMTEscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCg4KzEyOCkpK3JzaV0KKwlhZGN4CXIxMSxyY3gKKwlhZG94CXIxMixyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDE2KzEyOCkpK3JzaV0KKwlhZGN4CXIxMixyY3gKKwlhZG94CXIxMyxyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDI0KzEyOCkpK3JzaV0KKwltb3YJcmR4LHIxMAorCW11bHgJcmF4LHJkeCxyMTUKKwlhZGN4CXIxMyxyY3gKKwlhZG94CXI4LHJicAorCisJYWRjeAlyOCxyOQorCWFkb3gJcjkscjkKKwlhZGMJcjksMAorCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgwKzEyOCkpK3IxNF0KKwlhZGN4CXIxMCxyY3gKKwlhZG94CXIxMSxyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDgrMTI4KSkrcjE0XQorCWFkY3gJcjExLHJjeAorCWFkb3gJcjEyLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMTYrMTI4KSkrcjE0XQorCWFkY3gJcjEyLHJjeAorCWFkb3gJcjEzLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMjQrMTI4KSkrcjE0XQorCW1vdglyZHgsUVdPUkRbMjQrcmJ4XQorCWFkY3gJcjEzLHJjeAorCWFkb3gJcjgscmJwCisJYWRjeAlyOCxyMTAKKwlhZG94CXI5LHIxMAorCWFkYwlyOSwwCisKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDArMTI4KSkrcnNpXQorCWFkY3gJcjExLHJjeAorCWFkb3gJcjEyLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoOCsxMjgpKStyc2ldCisJYWRjeAlyMTIscmN4CisJYWRveAlyMTMscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgxNisxMjgpKStyc2ldCisJYWRjeAlyMTMscmN4CisJYWRveAlyOCxyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDI0KzEyOCkpK3JzaV0KKwltb3YJcmR4LHIxMQorCW11bHgJcmF4LHJkeCxyMTUKKwlhZGN4CXI4LHJjeAorCWFkb3gJcjkscmJwCisKKwlhZGN4CXI5LHIxMAorCWFkb3gJcjEwLHIxMAorCWFkYwlyMTAsMAorCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgwKzEyOCkpK3IxNF0KKwlhZGN4CXIxMSxyY3gKKwlhZG94CXIxMixyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDgrMTI4KSkrcjE0XQorCWFkY3gJcjEyLHJjeAorCWFkb3gJcjEzLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMTYrMTI4KSkrcjE0XQorCWFkY3gJcjEzLHJjeAorCWFkb3gJcjgscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgyNCsxMjgpKStyMTRdCisJbGVhCXIxNCxbMTI4K3IxNF0KKwltb3YJcmJ4LHIxMgorCWFkY3gJcjgscmN4CisJYWRveAlyOSxyYnAKKwltb3YJcmR4LHIxMworCWFkY3gJcjkscjExCisJYWRveAlyMTAscjExCisJYWRjCXIxMCwwCisKKworCisJbW92CXJjeCxyOAorCXN1YglyMTIsUVdPUkRbcjE0XQorCXNiYglyMTMsUVdPUkRbOCtyMTRdCisJc2JiCXI4LFFXT1JEWzE2K3IxNF0KKwltb3YJcmJwLHI5CisJc2JiCXI5LFFXT1JEWzI0K3IxNF0KKwlzYmIJcjEwLDAKKworCWNtb3ZjCXIxMixyYngKKwljbW92YwlyMTMscmR4CisJY21vdmMJcjgscmN4CisJY21vdmMJcjkscmJwCisKKwltb3YJUVdPUkRbcmRpXSxyMTIKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCW1vdglRV09SRFsxNityZGldLHI4CisJbW92CVFXT1JEWzI0K3JkaV0scjkKKworCW1vdglyMTUsUVdPUkRbcnNwXQorCisJbW92CXIxNCxRV09SRFs4K3JzcF0KKworCW1vdglyMTMsUVdPUkRbMTYrcnNwXQorCisJbW92CXIxMixRV09SRFsyNCtyc3BdCisKKwltb3YJcmJ4LFFXT1JEWzMyK3JzcF0KKworCW1vdglyYnAsUVdPUkRbNDArcnNwXQorCisJbGVhCXJzcCxbNDgrcnNwXQorCiskTCRvcmRfbXVseF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfb3JkX211bF9tb250eDoKKworCitBTElHTgkzMgorZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udHg6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250eDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworJEwkZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udHg6CisJcHVzaAlyYnAKKworCXB1c2gJcmJ4CisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCiskTCRvcmRfc3FyeF9ib2R5OgorCisJbW92CXJieCxyZHgKKwltb3YJcmR4LFFXT1JEW3JzaV0KKwltb3YJcjE0LFFXT1JEWzgrcnNpXQorCW1vdglyMTUsUVdPUkRbMTYrcnNpXQorCW1vdglyOCxRV09SRFsyNCtyc2ldCisJbGVhCXJzaSxbJEwkb3JkXQorCWptcAlORUFSICRMJG9vcF9vcmRfc3FyeAorCitBTElHTgkzMgorJEwkb29wX29yZF9zcXJ4OgorCW11bHgJcjEwLHI5LHIxNAorCW11bHgJcjExLHJjeCxyMTUKKwltb3YJcmF4LHJkeAorREIJMTAyLDczLDE1LDExMCwyMDYKKwltdWx4CXIxMixyYnAscjgKKwltb3YJcmR4LHIxNAorCWFkZAlyMTAscmN4CitEQgkxMDIsNzMsMTUsMTEwLDIxNQorCWFkYwlyMTEscmJwCisJYWRjCXIxMiwwCisJeG9yCXIxMyxyMTMKKworCW11bHgJcmJwLHJjeCxyMTUKKwlhZGN4CXIxMSxyY3gKKwlhZG94CXIxMixyYnAKKworCW11bHgJcmJwLHJjeCxyOAorCW1vdglyZHgscjE1CisJYWRjeAlyMTIscmN4CisJYWRveAlyMTMscmJwCisJYWRjCXIxMywwCisKKwltdWx4CXIxNCxyY3gscjgKKwltb3YJcmR4LHJheAorREIJMTAyLDczLDE1LDExMCwyMTYKKwl4b3IJcjE1LHIxNQorCWFkY3gJcjkscjkKKwlhZG94CXIxMyxyY3gKKwlhZGN4CXIxMCxyMTAKKwlhZG94CXIxNCxyMTUKKworCisJbXVseAlyYnAscjgscmR4CitEQgkxMDIsNzIsMTUsMTI2LDIwMgorCWFkY3gJcjExLHIxMQorCWFkb3gJcjkscmJwCisJYWRjeAlyMTIscjEyCisJbXVseAlyYXgscmN4LHJkeAorREIJMTAyLDcyLDE1LDEyNiwyMTAKKwlhZGN4CXIxMyxyMTMKKwlhZG94CXIxMCxyY3gKKwlhZGN4CXIxNCxyMTQKKwltdWx4CXJicCxyY3gscmR4CitEQgkweDY3CitEQgkxMDIsNzIsMTUsMTI2LDIxOAorCWFkb3gJcjExLHJheAorCWFkY3gJcjE1LHIxNQorCWFkb3gJcjEyLHJjeAorCWFkb3gJcjEzLHJicAorCW11bHgJcmF4LHJjeCxyZHgKKwlhZG94CXIxNCxyY3gKKwlhZG94CXIxNSxyYXgKKworCisJbW92CXJkeCxyOAorCW11bHgJcmN4LHJkeCxRV09SRFszMityc2ldCisKKwl4b3IJcmF4LHJheAorCW11bHgJcmJwLHJjeCxRV09SRFtyc2ldCisJYWRjeAlyOCxyY3gKKwlhZG94CXI5LHJicAorCW11bHgJcmJwLHJjeCxRV09SRFs4K3JzaV0KKwlhZGN4CXI5LHJjeAorCWFkb3gJcjEwLHJicAorCW11bHgJcmJwLHJjeCxRV09SRFsxNityc2ldCisJYWRjeAlyMTAscmN4CisJYWRveAlyMTEscmJwCisJbXVseAlyYnAscmN4LFFXT1JEWzI0K3JzaV0KKwlhZGN4CXIxMSxyY3gKKwlhZG94CXI4LHJicAorCWFkY3gJcjgscmF4CisKKworCW1vdglyZHgscjkKKwltdWx4CXJjeCxyZHgsUVdPUkRbMzIrcnNpXQorCisJbXVseAlyYnAscmN4LFFXT1JEW3JzaV0KKwlhZG94CXI5LHJjeAorCWFkY3gJcjEwLHJicAorCW11bHgJcmJwLHJjeCxRV09SRFs4K3JzaV0KKwlhZG94CXIxMCxyY3gKKwlhZGN4CXIxMSxyYnAKKwltdWx4CXJicCxyY3gsUVdPUkRbMTYrcnNpXQorCWFkb3gJcjExLHJjeAorCWFkY3gJcjgscmJwCisJbXVseAlyYnAscmN4LFFXT1JEWzI0K3JzaV0KKwlhZG94CXI4LHJjeAorCWFkY3gJcjkscmJwCisJYWRveAlyOSxyYXgKKworCisJbW92CXJkeCxyMTAKKwltdWx4CXJjeCxyZHgsUVdPUkRbMzIrcnNpXQorCisJbXVseAlyYnAscmN4LFFXT1JEW3JzaV0KKwlhZGN4CXIxMCxyY3gKKwlhZG94CXIxMSxyYnAKKwltdWx4CXJicCxyY3gsUVdPUkRbOCtyc2ldCisJYWRjeAlyMTEscmN4CisJYWRveAlyOCxyYnAKKwltdWx4CXJicCxyY3gsUVdPUkRbMTYrcnNpXQorCWFkY3gJcjgscmN4CisJYWRveAlyOSxyYnAKKwltdWx4CXJicCxyY3gsUVdPUkRbMjQrcnNpXQorCWFkY3gJcjkscmN4CisJYWRveAlyMTAscmJwCisJYWRjeAlyMTAscmF4CisKKworCW1vdglyZHgscjExCisJbXVseAlyY3gscmR4LFFXT1JEWzMyK3JzaV0KKworCW11bHgJcmJwLHJjeCxRV09SRFtyc2ldCisJYWRveAlyMTEscmN4CisJYWRjeAlyOCxyYnAKKwltdWx4CXJicCxyY3gsUVdPUkRbOCtyc2ldCisJYWRveAlyOCxyY3gKKwlhZGN4CXI5LHJicAorCW11bHgJcmJwLHJjeCxRV09SRFsxNityc2ldCisJYWRveAlyOSxyY3gKKwlhZGN4CXIxMCxyYnAKKwltdWx4CXJicCxyY3gsUVdPUkRbMjQrcnNpXQorCWFkb3gJcjEwLHJjeAorCWFkY3gJcjExLHJicAorCWFkb3gJcjExLHJheAorCisKKwlhZGQJcjEyLHI4CisJYWRjCXI5LHIxMworCW1vdglyZHgscjEyCisJYWRjCXIxMCxyMTQKKwlhZGMJcjExLHIxNQorCW1vdglyMTQscjkKKwlhZGMJcmF4LDAKKworCisJc3ViCXIxMixRV09SRFtyc2ldCisJbW92CXIxNSxyMTAKKwlzYmIJcjksUVdPUkRbOCtyc2ldCisJc2JiCXIxMCxRV09SRFsxNityc2ldCisJbW92CXI4LHIxMQorCXNiYglyMTEsUVdPUkRbMjQrcnNpXQorCXNiYglyYXgsMAorCisJY21vdm5jCXJkeCxyMTIKKwljbW92bmMJcjE0LHI5CisJY21vdm5jCXIxNSxyMTAKKwljbW92bmMJcjgscjExCisKKwlkZWMJcmJ4CisJam56CU5FQVIgJEwkb29wX29yZF9zcXJ4CisKKwltb3YJUVdPUkRbcmRpXSxyZHgKKwltb3YJUVdPUkRbOCtyZGldLHIxNAorCXB4b3IJeG1tMSx4bW0xCisJbW92CVFXT1JEWzE2K3JkaV0scjE1CisJcHhvcgl4bW0yLHhtbTIKKwltb3YJUVdPUkRbMjQrcmRpXSxyOAorCXB4b3IJeG1tMyx4bW0zCisKKwltb3YJcjE1LFFXT1JEW3JzcF0KKworCW1vdglyMTQsUVdPUkRbOCtyc3BdCisKKwltb3YJcjEzLFFXT1JEWzE2K3JzcF0KKworCW1vdglyMTIsUVdPUkRbMjQrcnNwXQorCisJbW92CXJieCxRV09SRFszMityc3BdCisKKwltb3YJcmJwLFFXT1JEWzQwK3JzcF0KKworCWxlYQlyc3AsWzQ4K3JzcF0KKworJEwkb3JkX3NxcnhfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udHg6CisKKworCisKKworCitnbG9iYWwJZWNwX25pc3R6MjU2X211bF9tb250CisKK0FMSUdOCTMyCitlY3BfbmlzdHoyNTZfbXVsX21vbnQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfbXVsX21vbnQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisKKwlsZWEJcmN4LFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJcmN4LFFXT1JEWzgrcmN4XQorCWFuZAllY3gsMHg4MDEwMAorJEwkbXVsX21vbnQ6CisJcHVzaAlyYnAKKworCXB1c2gJcmJ4CisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCiskTCRtdWxfYm9keToKKwljbXAJZWN4LDB4ODAxMDAKKwlqZQlORUFSICRMJG11bF9tb250eAorCW1vdglyYngscmR4CisJbW92CXJheCxRV09SRFtyZHhdCisJbW92CXI5LFFXT1JEW3JzaV0KKwltb3YJcjEwLFFXT1JEWzgrcnNpXQorCW1vdglyMTEsUVdPUkRbMTYrcnNpXQorCW1vdglyMTIsUVdPUkRbMjQrcnNpXQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKwlqbXAJTkVBUiAkTCRtdWxfbW9udF9kb25lCisKK0FMSUdOCTMyCiskTCRtdWxfbW9udHg6CisJbW92CXJieCxyZHgKKwltb3YJcmR4LFFXT1JEW3JkeF0KKwltb3YJcjksUVdPUkRbcnNpXQorCW1vdglyMTAsUVdPUkRbOCtyc2ldCisJbW92CXIxMSxRV09SRFsxNityc2ldCisJbW92CXIxMixRV09SRFsyNCtyc2ldCisJbGVhCXJzaSxbKCgtMTI4KSkrcnNpXQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKyRMJG11bF9tb250X2RvbmU6CisJbW92CXIxNSxRV09SRFtyc3BdCisKKwltb3YJcjE0LFFXT1JEWzgrcnNwXQorCisJbW92CXIxMyxRV09SRFsxNityc3BdCisKKwltb3YJcjEyLFFXT1JEWzI0K3JzcF0KKworCW1vdglyYngsUVdPUkRbMzIrcnNwXQorCisJbW92CXJicCxRV09SRFs0MCtyc3BdCisKKwlsZWEJcnNwLFs0OCtyc3BdCisKKyRMJG11bF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfbXVsX21vbnQ6CisKKworQUxJR04JMzIKK19fZWNwX25pc3R6MjU2X211bF9tb250cToKKworCisJbW92CXJicCxyYXgKKwltdWwJcjkKKwltb3YJcjE0LFFXT1JEWygoJEwkcG9seSs4KSldCisJbW92CXI4LHJheAorCW1vdglyYXgscmJwCisJbW92CXI5LHJkeAorCisJbXVsCXIxMAorCW1vdglyMTUsUVdPUkRbKCgkTCRwb2x5KzI0KSldCisJYWRkCXI5LHJheAorCW1vdglyYXgscmJwCisJYWRjCXJkeCwwCisJbW92CXIxMCxyZHgKKworCW11bAlyMTEKKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmJwCisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKworCW11bAlyMTIKKwlhZGQJcjExLHJheAorCW1vdglyYXgscjgKKwlhZGMJcmR4LDAKKwl4b3IJcjEzLHIxMworCW1vdglyMTIscmR4CisKKworCisKKworCisKKworCisKKwltb3YJcmJwLHI4CisJc2hsCXI4LDMyCisJbXVsCXIxNQorCXNocglyYnAsMzIKKwlhZGQJcjkscjgKKwlhZGMJcjEwLHJicAorCWFkYwlyMTEscmF4CisJbW92CXJheCxRV09SRFs4K3JieF0KKwlhZGMJcjEyLHJkeAorCWFkYwlyMTMsMAorCXhvcglyOCxyOAorCisKKworCW1vdglyYnAscmF4CisJbXVsCVFXT1JEW3JzaV0KKwlhZGQJcjkscmF4CisJbW92CXJheCxyYnAKKwlhZGMJcmR4LDAKKwltb3YJcmN4LHJkeAorCisJbXVsCVFXT1JEWzgrcnNpXQorCWFkZAlyMTAscmN4CisJYWRjCXJkeCwwCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHJicAorCWFkYwlyZHgsMAorCW1vdglyY3gscmR4CisKKwltdWwJUVdPUkRbMTYrcnNpXQorCWFkZAlyMTEscmN4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LHJicAorCWFkYwlyZHgsMAorCW1vdglyY3gscmR4CisKKwltdWwJUVdPUkRbMjQrcnNpXQorCWFkZAlyMTIscmN4CisJYWRjCXJkeCwwCisJYWRkCXIxMixyYXgKKwltb3YJcmF4LHI5CisJYWRjCXIxMyxyZHgKKwlhZGMJcjgsMAorCisKKworCW1vdglyYnAscjkKKwlzaGwJcjksMzIKKwltdWwJcjE1CisJc2hyCXJicCwzMgorCWFkZAlyMTAscjkKKwlhZGMJcjExLHJicAorCWFkYwlyMTIscmF4CisJbW92CXJheCxRV09SRFsxNityYnhdCisJYWRjCXIxMyxyZHgKKwlhZGMJcjgsMAorCXhvcglyOSxyOQorCisKKworCW1vdglyYnAscmF4CisJbXVsCVFXT1JEW3JzaV0KKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmJwCisJYWRjCXJkeCwwCisJbW92CXJjeCxyZHgKKworCW11bAlRV09SRFs4K3JzaV0KKwlhZGQJcjExLHJjeAorCWFkYwlyZHgsMAorCWFkZAlyMTEscmF4CisJbW92CXJheCxyYnAKKwlhZGMJcmR4LDAKKwltb3YJcmN4LHJkeAorCisJbXVsCVFXT1JEWzE2K3JzaV0KKwlhZGQJcjEyLHJjeAorCWFkYwlyZHgsMAorCWFkZAlyMTIscmF4CisJbW92CXJheCxyYnAKKwlhZGMJcmR4LDAKKwltb3YJcmN4LHJkeAorCisJbXVsCVFXT1JEWzI0K3JzaV0KKwlhZGQJcjEzLHJjeAorCWFkYwlyZHgsMAorCWFkZAlyMTMscmF4CisJbW92CXJheCxyMTAKKwlhZGMJcjgscmR4CisJYWRjCXI5LDAKKworCisKKwltb3YJcmJwLHIxMAorCXNobAlyMTAsMzIKKwltdWwJcjE1CisJc2hyCXJicCwzMgorCWFkZAlyMTEscjEwCisJYWRjCXIxMixyYnAKKwlhZGMJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbMjQrcmJ4XQorCWFkYwlyOCxyZHgKKwlhZGMJcjksMAorCXhvcglyMTAscjEwCisKKworCisJbW92CXJicCxyYXgKKwltdWwJUVdPUkRbcnNpXQorCWFkZAlyMTEscmF4CisJbW92CXJheCxyYnAKKwlhZGMJcmR4LDAKKwltb3YJcmN4LHJkeAorCisJbXVsCVFXT1JEWzgrcnNpXQorCWFkZAlyMTIscmN4CisJYWRjCXJkeCwwCisJYWRkCXIxMixyYXgKKwltb3YJcmF4LHJicAorCWFkYwlyZHgsMAorCW1vdglyY3gscmR4CisKKwltdWwJUVdPUkRbMTYrcnNpXQorCWFkZAlyMTMscmN4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyYXgKKwltb3YJcmF4LHJicAorCWFkYwlyZHgsMAorCW1vdglyY3gscmR4CisKKwltdWwJUVdPUkRbMjQrcnNpXQorCWFkZAlyOCxyY3gKKwlhZGMJcmR4LDAKKwlhZGQJcjgscmF4CisJbW92CXJheCxyMTEKKwlhZGMJcjkscmR4CisJYWRjCXIxMCwwCisKKworCisJbW92CXJicCxyMTEKKwlzaGwJcjExLDMyCisJbXVsCXIxNQorCXNocglyYnAsMzIKKwlhZGQJcjEyLHIxMQorCWFkYwlyMTMscmJwCisJbW92CXJjeCxyMTIKKwlhZGMJcjgscmF4CisJYWRjCXI5LHJkeAorCW1vdglyYnAscjEzCisJYWRjCXIxMCwwCisKKworCisJc3ViCXIxMiwtMQorCW1vdglyYngscjgKKwlzYmIJcjEzLHIxNAorCXNiYglyOCwwCisJbW92CXJkeCxyOQorCXNiYglyOSxyMTUKKwlzYmIJcjEwLDAKKworCWNtb3ZjCXIxMixyY3gKKwljbW92YwlyMTMscmJwCisJbW92CVFXT1JEW3JkaV0scjEyCisJY21vdmMJcjgscmJ4CisJbW92CVFXT1JEWzgrcmRpXSxyMTMKKwljbW92YwlyOSxyZHgKKwltb3YJUVdPUkRbMTYrcmRpXSxyOAorCW1vdglRV09SRFsyNCtyZGldLHI5CisKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKKworCisKKworCisKK2dsb2JhbAllY3BfbmlzdHoyNTZfc3FyX21vbnQKKworQUxJR04JMzIKK2VjcF9uaXN0ejI1Nl9zcXJfbW9udDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9zcXJfbW9udDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisKKworCisJbGVhCXJjeCxbT1BFTlNTTF9pYTMyY2FwX1BdCisJbW92CXJjeCxRV09SRFs4K3JjeF0KKwlhbmQJZWN4LDB4ODAxMDAKKwlwdXNoCXJicAorCisJcHVzaAlyYngKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKyRMJHNxcl9ib2R5OgorCWNtcAllY3gsMHg4MDEwMAorCWplCU5FQVIgJEwkc3FyX21vbnR4CisJbW92CXJheCxRV09SRFtyc2ldCisJbW92CXIxNCxRV09SRFs4K3JzaV0KKwltb3YJcjE1LFFXT1JEWzE2K3JzaV0KKwltb3YJcjgsUVdPUkRbMjQrcnNpXQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKwlqbXAJTkVBUiAkTCRzcXJfbW9udF9kb25lCisKK0FMSUdOCTMyCiskTCRzcXJfbW9udHg6CisJbW92CXJkeCxRV09SRFtyc2ldCisJbW92CXIxNCxRV09SRFs4K3JzaV0KKwltb3YJcjE1LFFXT1JEWzE2K3JzaV0KKwltb3YJcjgsUVdPUkRbMjQrcnNpXQorCWxlYQlyc2ksWygoLTEyOCkpK3JzaV0KKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CiskTCRzcXJfbW9udF9kb25lOgorCW1vdglyMTUsUVdPUkRbcnNwXQorCisJbW92CXIxNCxRV09SRFs4K3JzcF0KKworCW1vdglyMTMsUVdPUkRbMTYrcnNwXQorCisJbW92CXIxMixRV09SRFsyNCtyc3BdCisKKwltb3YJcmJ4LFFXT1JEWzMyK3JzcF0KKworCW1vdglyYnAsUVdPUkRbNDArcnNwXQorCisJbGVhCXJzcCxbNDgrcnNwXQorCiskTCRzcXJfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3Nxcl9tb250OgorCisKK0FMSUdOCTMyCitfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHE6CisJbW92CXIxMyxyYXgKKwltdWwJcjE0CisJbW92CXI5LHJheAorCW1vdglyYXgscjE1CisJbW92CXIxMCxyZHgKKworCW11bAlyMTMKKwlhZGQJcjEwLHJheAorCW1vdglyYXgscjgKKwlhZGMJcmR4LDAKKwltb3YJcjExLHJkeAorCisJbXVsCXIxMworCWFkZAlyMTEscmF4CisJbW92CXJheCxyMTUKKwlhZGMJcmR4LDAKKwltb3YJcjEyLHJkeAorCisKKwltdWwJcjE0CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LHI4CisJYWRjCXJkeCwwCisJbW92CXJicCxyZHgKKworCW11bAlyMTQKKwlhZGQJcjEyLHJheAorCW1vdglyYXgscjgKKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHJicAorCW1vdglyMTMscmR4CisJYWRjCXIxMywwCisKKworCW11bAlyMTUKKwl4b3IJcjE1LHIxNQorCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFtyc2ldCisJbW92CXIxNCxyZHgKKwlhZGMJcjE0LDAKKworCWFkZAlyOSxyOQorCWFkYwlyMTAscjEwCisJYWRjCXIxMSxyMTEKKwlhZGMJcjEyLHIxMgorCWFkYwlyMTMscjEzCisJYWRjCXIxNCxyMTQKKwlhZGMJcjE1LDAKKworCW11bAlyYXgKKwltb3YJcjgscmF4CisJbW92CXJheCxRV09SRFs4K3JzaV0KKwltb3YJcmN4LHJkeAorCisJbXVsCXJheAorCWFkZAlyOSxyY3gKKwlhZGMJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbMTYrcnNpXQorCWFkYwlyZHgsMAorCW1vdglyY3gscmR4CisKKwltdWwJcmF4CisJYWRkCXIxMSxyY3gKKwlhZGMJcjEyLHJheAorCW1vdglyYXgsUVdPUkRbMjQrcnNpXQorCWFkYwlyZHgsMAorCW1vdglyY3gscmR4CisKKwltdWwJcmF4CisJYWRkCXIxMyxyY3gKKwlhZGMJcjE0LHJheAorCW1vdglyYXgscjgKKwlhZGMJcjE1LHJkeAorCisJbW92CXJzaSxRV09SRFsoKCRMJHBvbHkrOCkpXQorCW1vdglyYnAsUVdPUkRbKCgkTCRwb2x5KzI0KSldCisKKworCisKKwltb3YJcmN4LHI4CisJc2hsCXI4LDMyCisJbXVsCXJicAorCXNocglyY3gsMzIKKwlhZGQJcjkscjgKKwlhZGMJcjEwLHJjeAorCWFkYwlyMTEscmF4CisJbW92CXJheCxyOQorCWFkYwlyZHgsMAorCisKKworCW1vdglyY3gscjkKKwlzaGwJcjksMzIKKwltb3YJcjgscmR4CisJbXVsCXJicAorCXNocglyY3gsMzIKKwlhZGQJcjEwLHI5CisJYWRjCXIxMSxyY3gKKwlhZGMJcjgscmF4CisJbW92CXJheCxyMTAKKwlhZGMJcmR4LDAKKworCisKKwltb3YJcmN4LHIxMAorCXNobAlyMTAsMzIKKwltb3YJcjkscmR4CisJbXVsCXJicAorCXNocglyY3gsMzIKKwlhZGQJcjExLHIxMAorCWFkYwlyOCxyY3gKKwlhZGMJcjkscmF4CisJbW92CXJheCxyMTEKKwlhZGMJcmR4LDAKKworCisKKwltb3YJcmN4LHIxMQorCXNobAlyMTEsMzIKKwltb3YJcjEwLHJkeAorCW11bAlyYnAKKwlzaHIJcmN4LDMyCisJYWRkCXI4LHIxMQorCWFkYwlyOSxyY3gKKwlhZGMJcjEwLHJheAorCWFkYwlyZHgsMAorCXhvcglyMTEscjExCisKKworCisJYWRkCXIxMixyOAorCWFkYwlyMTMscjkKKwltb3YJcjgscjEyCisJYWRjCXIxNCxyMTAKKwlhZGMJcjE1LHJkeAorCW1vdglyOSxyMTMKKwlhZGMJcjExLDAKKworCXN1YglyMTIsLTEKKwltb3YJcjEwLHIxNAorCXNiYglyMTMscnNpCisJc2JiCXIxNCwwCisJbW92CXJjeCxyMTUKKwlzYmIJcjE1LHJicAorCXNiYglyMTEsMAorCisJY21vdmMJcjEyLHI4CisJY21vdmMJcjEzLHI5CisJbW92CVFXT1JEW3JkaV0scjEyCisJY21vdmMJcjE0LHIxMAorCW1vdglRV09SRFs4K3JkaV0scjEzCisJY21vdmMJcjE1LHJjeAorCW1vdglRV09SRFsxNityZGldLHIxNAorCW1vdglRV09SRFsyNCtyZGldLHIxNQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworQUxJR04JMzIKK19fZWNwX25pc3R6MjU2X211bF9tb250eDoKKworCisJbXVseAlyOSxyOCxyOQorCW11bHgJcjEwLHJjeCxyMTAKKwltb3YJcjE0LDMyCisJeG9yCXIxMyxyMTMKKwltdWx4CXIxMSxyYnAscjExCisJbW92CXIxNSxRV09SRFsoKCRMJHBvbHkrMjQpKV0KKwlhZGMJcjkscmN4CisJbXVseAlyMTIscmN4LHIxMgorCW1vdglyZHgscjgKKwlhZGMJcjEwLHJicAorCXNobHgJcmJwLHI4LHIxNAorCWFkYwlyMTEscmN4CisJc2hyeAlyY3gscjgscjE0CisJYWRjCXIxMiwwCisKKworCisJYWRkCXI5LHJicAorCWFkYwlyMTAscmN4CisKKwltdWx4CXJicCxyY3gscjE1CisJbW92CXJkeCxRV09SRFs4K3JieF0KKwlhZGMJcjExLHJjeAorCWFkYwlyMTIscmJwCisJYWRjCXIxMywwCisJeG9yCXI4LHI4CisKKworCisJbXVseAlyYnAscmN4LFFXT1JEWygoMCsxMjgpKStyc2ldCisJYWRjeAlyOSxyY3gKKwlhZG94CXIxMCxyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDgrMTI4KSkrcnNpXQorCWFkY3gJcjEwLHJjeAorCWFkb3gJcjExLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMTYrMTI4KSkrcnNpXQorCWFkY3gJcjExLHJjeAorCWFkb3gJcjEyLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMjQrMTI4KSkrcnNpXQorCW1vdglyZHgscjkKKwlhZGN4CXIxMixyY3gKKwlzaGx4CXJjeCxyOSxyMTQKKwlhZG94CXIxMyxyYnAKKwlzaHJ4CXJicCxyOSxyMTQKKworCWFkY3gJcjEzLHI4CisJYWRveAlyOCxyOAorCWFkYwlyOCwwCisKKworCisJYWRkCXIxMCxyY3gKKwlhZGMJcjExLHJicAorCisJbXVseAlyYnAscmN4LHIxNQorCW1vdglyZHgsUVdPUkRbMTYrcmJ4XQorCWFkYwlyMTIscmN4CisJYWRjCXIxMyxyYnAKKwlhZGMJcjgsMAorCXhvcglyOSxyOQorCisKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDArMTI4KSkrcnNpXQorCWFkY3gJcjEwLHJjeAorCWFkb3gJcjExLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoOCsxMjgpKStyc2ldCisJYWRjeAlyMTEscmN4CisJYWRveAlyMTIscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgxNisxMjgpKStyc2ldCisJYWRjeAlyMTIscmN4CisJYWRveAlyMTMscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgyNCsxMjgpKStyc2ldCisJbW92CXJkeCxyMTAKKwlhZGN4CXIxMyxyY3gKKwlzaGx4CXJjeCxyMTAscjE0CisJYWRveAlyOCxyYnAKKwlzaHJ4CXJicCxyMTAscjE0CisKKwlhZGN4CXI4LHI5CisJYWRveAlyOSxyOQorCWFkYwlyOSwwCisKKworCisJYWRkCXIxMSxyY3gKKwlhZGMJcjEyLHJicAorCisJbXVseAlyYnAscmN4LHIxNQorCW1vdglyZHgsUVdPUkRbMjQrcmJ4XQorCWFkYwlyMTMscmN4CisJYWRjCXI4LHJicAorCWFkYwlyOSwwCisJeG9yCXIxMCxyMTAKKworCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgwKzEyOCkpK3JzaV0KKwlhZGN4CXIxMSxyY3gKKwlhZG94CXIxMixyYnAKKworCW11bHgJcmJwLHJjeCxRV09SRFsoKDgrMTI4KSkrcnNpXQorCWFkY3gJcjEyLHJjeAorCWFkb3gJcjEzLHJicAorCisJbXVseAlyYnAscmN4LFFXT1JEWygoMTYrMTI4KSkrcnNpXQorCWFkY3gJcjEzLHJjeAorCWFkb3gJcjgscmJwCisKKwltdWx4CXJicCxyY3gsUVdPUkRbKCgyNCsxMjgpKStyc2ldCisJbW92CXJkeCxyMTEKKwlhZGN4CXI4LHJjeAorCXNobHgJcmN4LHIxMSxyMTQKKwlhZG94CXI5LHJicAorCXNocngJcmJwLHIxMSxyMTQKKworCWFkY3gJcjkscjEwCisJYWRveAlyMTAscjEwCisJYWRjCXIxMCwwCisKKworCisJYWRkCXIxMixyY3gKKwlhZGMJcjEzLHJicAorCisJbXVseAlyYnAscmN4LHIxNQorCW1vdglyYngscjEyCisJbW92CXIxNCxRV09SRFsoKCRMJHBvbHkrOCkpXQorCWFkYwlyOCxyY3gKKwltb3YJcmR4LHIxMworCWFkYwlyOSxyYnAKKwlhZGMJcjEwLDAKKworCisKKwl4b3IJZWF4LGVheAorCW1vdglyY3gscjgKKwlzYmIJcjEyLC0xCisJc2JiCXIxMyxyMTQKKwlzYmIJcjgsMAorCW1vdglyYnAscjkKKwlzYmIJcjkscjE1CisJc2JiCXIxMCwwCisKKwljbW92YwlyMTIscmJ4CisJY21vdmMJcjEzLHJkeAorCW1vdglRV09SRFtyZGldLHIxMgorCWNtb3ZjCXI4LHJjeAorCW1vdglRV09SRFs4K3JkaV0scjEzCisJY21vdmMJcjkscmJwCisJbW92CVFXT1JEWzE2K3JkaV0scjgKKwltb3YJUVdPUkRbMjQrcmRpXSxyOQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCitBTElHTgkzMgorX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4OgorCW11bHgJcjEwLHI5LHIxNAorCW11bHgJcjExLHJjeCxyMTUKKwl4b3IJZWF4LGVheAorCWFkYwlyMTAscmN4CisJbXVseAlyMTIscmJwLHI4CisJbW92CXJkeCxyMTQKKwlhZGMJcjExLHJicAorCWFkYwlyMTIsMAorCXhvcglyMTMscjEzCisKKworCW11bHgJcmJwLHJjeCxyMTUKKwlhZGN4CXIxMSxyY3gKKwlhZG94CXIxMixyYnAKKworCW11bHgJcmJwLHJjeCxyOAorCW1vdglyZHgscjE1CisJYWRjeAlyMTIscmN4CisJYWRveAlyMTMscmJwCisJYWRjCXIxMywwCisKKworCW11bHgJcjE0LHJjeCxyOAorCW1vdglyZHgsUVdPUkRbKCgwKzEyOCkpK3JzaV0KKwl4b3IJcjE1LHIxNQorCWFkY3gJcjkscjkKKwlhZG94CXIxMyxyY3gKKwlhZGN4CXIxMCxyMTAKKwlhZG94CXIxNCxyMTUKKworCW11bHgJcmJwLHI4LHJkeAorCW1vdglyZHgsUVdPUkRbKCg4KzEyOCkpK3JzaV0KKwlhZGN4CXIxMSxyMTEKKwlhZG94CXI5LHJicAorCWFkY3gJcjEyLHIxMgorCW11bHgJcmF4LHJjeCxyZHgKKwltb3YJcmR4LFFXT1JEWygoMTYrMTI4KSkrcnNpXQorCWFkY3gJcjEzLHIxMworCWFkb3gJcjEwLHJjeAorCWFkY3gJcjE0LHIxNAorREIJMHg2NworCW11bHgJcmJwLHJjeCxyZHgKKwltb3YJcmR4LFFXT1JEWygoMjQrMTI4KSkrcnNpXQorCWFkb3gJcjExLHJheAorCWFkY3gJcjE1LHIxNQorCWFkb3gJcjEyLHJjeAorCW1vdglyc2ksMzIKKwlhZG94CXIxMyxyYnAKK0RCCTB4NjcsMHg2NworCW11bHgJcmF4LHJjeCxyZHgKKwltb3YJcmR4LFFXT1JEWygoJEwkcG9seSsyNCkpXQorCWFkb3gJcjE0LHJjeAorCXNobHgJcmN4LHI4LHJzaQorCWFkb3gJcjE1LHJheAorCXNocngJcmF4LHI4LHJzaQorCW1vdglyYnAscmR4CisKKworCWFkZAlyOSxyY3gKKwlhZGMJcjEwLHJheAorCisJbXVseAlyOCxyY3gscjgKKwlhZGMJcjExLHJjeAorCXNobHgJcmN4LHI5LHJzaQorCWFkYwlyOCwwCisJc2hyeAlyYXgscjkscnNpCisKKworCWFkZAlyMTAscmN4CisJYWRjCXIxMSxyYXgKKworCW11bHgJcjkscmN4LHI5CisJYWRjCXI4LHJjeAorCXNobHgJcmN4LHIxMCxyc2kKKwlhZGMJcjksMAorCXNocngJcmF4LHIxMCxyc2kKKworCisJYWRkCXIxMSxyY3gKKwlhZGMJcjgscmF4CisKKwltdWx4CXIxMCxyY3gscjEwCisJYWRjCXI5LHJjeAorCXNobHgJcmN4LHIxMSxyc2kKKwlhZGMJcjEwLDAKKwlzaHJ4CXJheCxyMTEscnNpCisKKworCWFkZAlyOCxyY3gKKwlhZGMJcjkscmF4CisKKwltdWx4CXIxMSxyY3gscjExCisJYWRjCXIxMCxyY3gKKwlhZGMJcjExLDAKKworCXhvcglyZHgscmR4CisJYWRkCXIxMixyOAorCW1vdglyc2ksUVdPUkRbKCgkTCRwb2x5KzgpKV0KKwlhZGMJcjEzLHI5CisJbW92CXI4LHIxMgorCWFkYwlyMTQscjEwCisJYWRjCXIxNSxyMTEKKwltb3YJcjkscjEzCisJYWRjCXJkeCwwCisKKwlzdWIJcjEyLC0xCisJbW92CXIxMCxyMTQKKwlzYmIJcjEzLHJzaQorCXNiYglyMTQsMAorCW1vdglyMTEscjE1CisJc2JiCXIxNSxyYnAKKwlzYmIJcmR4LDAKKworCWNtb3ZjCXIxMixyOAorCWNtb3ZjCXIxMyxyOQorCW1vdglRV09SRFtyZGldLHIxMgorCWNtb3ZjCXIxNCxyMTAKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCWNtb3ZjCXIxNSxyMTEKKwltb3YJUVdPUkRbMTYrcmRpXSxyMTQKKwltb3YJUVdPUkRbMjQrcmRpXSxyMTUKKworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworZ2xvYmFsCWVjcF9uaXN0ejI1Nl9zZWxlY3RfdzUKKworQUxJR04JMzIKK2VjcF9uaXN0ejI1Nl9zZWxlY3RfdzU6CisJbGVhCXJheCxbT1BFTlNTTF9pYTMyY2FwX1BdCisJbW92CXJheCxRV09SRFs4K3JheF0KKwl0ZXN0CWVheCwzMgorCWpueglORUFSICRMJGF2eDJfc2VsZWN0X3c1CisJbGVhCXJheCxbKCgtMTM2KSkrcnNwXQorJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9zZWxlY3RfdzU6CitEQgkweDQ4LDB4OGQsMHg2MCwweGUwCitEQgkweDBmLDB4MjksMHg3MCwweGUwCitEQgkweDBmLDB4MjksMHg3OCwweGYwCitEQgkweDQ0LDB4MGYsMHgyOSwweDAwCitEQgkweDQ0LDB4MGYsMHgyOSwweDQ4LDB4MTAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NTAsMHgyMAorREIJMHg0NCwweDBmLDB4MjksMHg1OCwweDMwCitEQgkweDQ0LDB4MGYsMHgyOSwweDYwLDB4NDAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NjgsMHg1MAorREIJMHg0NCwweDBmLDB4MjksMHg3MCwweDYwCitEQgkweDQ0LDB4MGYsMHgyOSwweDc4LDB4NzAKKwltb3ZkcWEJeG1tMCxYTU1XT1JEWyRMJE9uZV0KKwltb3ZkCXhtbTEscjhkCisKKwlweG9yCXhtbTIseG1tMgorCXB4b3IJeG1tMyx4bW0zCisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorCXB4b3IJeG1tNix4bW02CisJcHhvcgl4bW03LHhtbTcKKworCW1vdmRxYQl4bW04LHhtbTAKKwlwc2h1ZmQJeG1tMSx4bW0xLDAKKworCW1vdglyYXgsMTYKKyRMJHNlbGVjdF9sb29wX3NzZV93NToKKworCW1vdmRxYQl4bW0xNSx4bW04CisJcGFkZGQJeG1tOCx4bW0wCisJcGNtcGVxZAl4bW0xNSx4bW0xCisKKwltb3ZkcWEJeG1tOSxYTU1XT1JEW3JkeF0KKwltb3ZkcWEJeG1tMTAsWE1NV09SRFsxNityZHhdCisJbW92ZHFhCXhtbTExLFhNTVdPUkRbMzIrcmR4XQorCW1vdmRxYQl4bW0xMixYTU1XT1JEWzQ4K3JkeF0KKwltb3ZkcWEJeG1tMTMsWE1NV09SRFs2NCtyZHhdCisJbW92ZHFhCXhtbTE0LFhNTVdPUkRbODArcmR4XQorCWxlYQlyZHgsWzk2K3JkeF0KKworCXBhbmQJeG1tOSx4bW0xNQorCXBhbmQJeG1tMTAseG1tMTUKKwlwb3IJeG1tMix4bW05CisJcGFuZAl4bW0xMSx4bW0xNQorCXBvcgl4bW0zLHhtbTEwCisJcGFuZAl4bW0xMix4bW0xNQorCXBvcgl4bW00LHhtbTExCisJcGFuZAl4bW0xMyx4bW0xNQorCXBvcgl4bW01LHhtbTEyCisJcGFuZAl4bW0xNCx4bW0xNQorCXBvcgl4bW02LHhtbTEzCisJcG9yCXhtbTcseG1tMTQKKworCWRlYwlyYXgKKwlqbnoJTkVBUiAkTCRzZWxlY3RfbG9vcF9zc2VfdzUKKworCW1vdmRxdQlYTU1XT1JEW3JjeF0seG1tMgorCW1vdmRxdQlYTU1XT1JEWzE2K3JjeF0seG1tMworCW1vdmRxdQlYTU1XT1JEWzMyK3JjeF0seG1tNAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JjeF0seG1tNQorCW1vdmRxdQlYTU1XT1JEWzY0K3JjeF0seG1tNgorCW1vdmRxdQlYTU1XT1JEWzgwK3JjeF0seG1tNworCW1vdmFwcwl4bW02LFhNTVdPUkRbcnNwXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbMTYrcnNwXQorCW1vdmFwcwl4bW04LFhNTVdPUkRbMzIrcnNwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbNDgrcnNwXQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWzY0K3JzcF0KKwltb3ZhcHMJeG1tMTEsWE1NV09SRFs4MCtyc3BdCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbOTYrcnNwXQorCW1vdmFwcwl4bW0xMyxYTU1XT1JEWzExMityc3BdCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbMTI4K3JzcF0KKwltb3ZhcHMJeG1tMTUsWE1NV09SRFsxNDQrcnNwXQorCWxlYQlyc3AsWzE2OCtyc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CiskTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9zZWxlY3RfdzU6CisKKworCisKK2dsb2JhbAllY3BfbmlzdHoyNTZfc2VsZWN0X3c3CisKK0FMSUdOCTMyCitlY3BfbmlzdHoyNTZfc2VsZWN0X3c3OgorCWxlYQlyYXgsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyYXgsUVdPUkRbOCtyYXhdCisJdGVzdAllYXgsMzIKKwlqbnoJTkVBUiAkTCRhdngyX3NlbGVjdF93NworCWxlYQlyYXgsWygoLTEzNikpK3JzcF0KKyRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfc2VsZWN0X3c3OgorREIJMHg0OCwweDhkLDB4NjAsMHhlMAorREIJMHgwZiwweDI5LDB4NzAsMHhlMAorREIJMHgwZiwweDI5LDB4NzgsMHhmMAorREIJMHg0NCwweDBmLDB4MjksMHgwMAorREIJMHg0NCwweDBmLDB4MjksMHg0OCwweDEwCitEQgkweDQ0LDB4MGYsMHgyOSwweDUwLDB4MjAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NTgsMHgzMAorREIJMHg0NCwweDBmLDB4MjksMHg2MCwweDQwCitEQgkweDQ0LDB4MGYsMHgyOSwweDY4LDB4NTAKK0RCCTB4NDQsMHgwZiwweDI5LDB4NzAsMHg2MAorREIJMHg0NCwweDBmLDB4MjksMHg3OCwweDcwCisJbW92ZHFhCXhtbTgsWE1NV09SRFskTCRPbmVdCisJbW92ZAl4bW0xLHI4ZAorCisJcHhvcgl4bW0yLHhtbTIKKwlweG9yCXhtbTMseG1tMworCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKworCW1vdmRxYQl4bW0wLHhtbTgKKwlwc2h1ZmQJeG1tMSx4bW0xLDAKKwltb3YJcmF4LDY0CisKKyRMJHNlbGVjdF9sb29wX3NzZV93NzoKKwltb3ZkcWEJeG1tMTUseG1tOAorCXBhZGRkCXhtbTgseG1tMAorCW1vdmRxYQl4bW05LFhNTVdPUkRbcmR4XQorCW1vdmRxYQl4bW0xMCxYTU1XT1JEWzE2K3JkeF0KKwlwY21wZXFkCXhtbTE1LHhtbTEKKwltb3ZkcWEJeG1tMTEsWE1NV09SRFszMityZHhdCisJbW92ZHFhCXhtbTEyLFhNTVdPUkRbNDgrcmR4XQorCWxlYQlyZHgsWzY0K3JkeF0KKworCXBhbmQJeG1tOSx4bW0xNQorCXBhbmQJeG1tMTAseG1tMTUKKwlwb3IJeG1tMix4bW05CisJcGFuZAl4bW0xMSx4bW0xNQorCXBvcgl4bW0zLHhtbTEwCisJcGFuZAl4bW0xMix4bW0xNQorCXBvcgl4bW00LHhtbTExCisJcHJlZmV0Y2h0MAlbMjU1K3JkeF0KKwlwb3IJeG1tNSx4bW0xMgorCisJZGVjCXJheAorCWpueglORUFSICRMJHNlbGVjdF9sb29wX3NzZV93NworCisJbW92ZHF1CVhNTVdPUkRbcmN4XSx4bW0yCisJbW92ZHF1CVhNTVdPUkRbMTYrcmN4XSx4bW0zCisJbW92ZHF1CVhNTVdPUkRbMzIrcmN4XSx4bW00CisJbW92ZHF1CVhNTVdPUkRbNDgrcmN4XSx4bW01CisJbW92YXBzCXhtbTYsWE1NV09SRFtyc3BdCisJbW92YXBzCXhtbTcsWE1NV09SRFsxNityc3BdCisJbW92YXBzCXhtbTgsWE1NV09SRFszMityc3BdCisJbW92YXBzCXhtbTksWE1NV09SRFs0OCtyc3BdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJeG1tMTIsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzE0NCtyc3BdCisJbGVhCXJzcCxbMTY4K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKyRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3NlbGVjdF93NzoKKworCisKKworQUxJR04JMzIKK2VjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NToKKyRMJGF2eDJfc2VsZWN0X3c1OgorCXZ6ZXJvdXBwZXIKKwlsZWEJcmF4LFsoKC0xMzYpKStyc3BdCisJbW92CXIxMSxyc3AKKyRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzU6CitEQgkweDQ4LDB4OGQsMHg2MCwweGUwCitEQgkweGM1LDB4ZjgsMHgyOSwweDcwLDB4ZTAKK0RCCTB4YzUsMHhmOCwweDI5LDB4NzgsMHhmMAorREIJMHhjNSwweDc4LDB4MjksMHg0MCwweDAwCitEQgkweGM1LDB4NzgsMHgyOSwweDQ4LDB4MTAKK0RCCTB4YzUsMHg3OCwweDI5LDB4NTAsMHgyMAorREIJMHhjNSwweDc4LDB4MjksMHg1OCwweDMwCitEQgkweGM1LDB4NzgsMHgyOSwweDYwLDB4NDAKK0RCCTB4YzUsMHg3OCwweDI5LDB4NjgsMHg1MAorREIJMHhjNSwweDc4LDB4MjksMHg3MCwweDYwCitEQgkweGM1LDB4NzgsMHgyOSwweDc4LDB4NzAKKwl2bW92ZHFhCXltbTAsWU1NV09SRFskTCRUd29dCisKKwl2cHhvcgl5bW0yLHltbTIseW1tMgorCXZweG9yCXltbTMseW1tMyx5bW0zCisJdnB4b3IJeW1tNCx5bW00LHltbTQKKworCXZtb3ZkcWEJeW1tNSxZTU1XT1JEWyRMJE9uZV0KKwl2bW92ZHFhCXltbTEwLFlNTVdPUkRbJEwkVHdvXQorCisJdm1vdmQJeG1tMSxyOGQKKwl2cGVybWQJeW1tMSx5bW0yLHltbTEKKworCW1vdglyYXgsOAorJEwkc2VsZWN0X2xvb3BfYXZ4Ml93NToKKworCXZtb3ZkcWEJeW1tNixZTU1XT1JEW3JkeF0KKwl2bW92ZHFhCXltbTcsWU1NV09SRFszMityZHhdCisJdm1vdmRxYQl5bW04LFlNTVdPUkRbNjQrcmR4XQorCisJdm1vdmRxYQl5bW0xMSxZTU1XT1JEWzk2K3JkeF0KKwl2bW92ZHFhCXltbTEyLFlNTVdPUkRbMTI4K3JkeF0KKwl2bW92ZHFhCXltbTEzLFlNTVdPUkRbMTYwK3JkeF0KKworCXZwY21wZXFkCXltbTkseW1tNSx5bW0xCisJdnBjbXBlcWQJeW1tMTQseW1tMTAseW1tMQorCisJdnBhZGRkCXltbTUseW1tNSx5bW0wCisJdnBhZGRkCXltbTEwLHltbTEwLHltbTAKKwlsZWEJcmR4LFsxOTIrcmR4XQorCisJdnBhbmQJeW1tNix5bW02LHltbTkKKwl2cGFuZAl5bW03LHltbTcseW1tOQorCXZwYW5kCXltbTgseW1tOCx5bW05CisJdnBhbmQJeW1tMTEseW1tMTEseW1tMTQKKwl2cGFuZAl5bW0xMix5bW0xMix5bW0xNAorCXZwYW5kCXltbTEzLHltbTEzLHltbTE0CisKKwl2cHhvcgl5bW0yLHltbTIseW1tNgorCXZweG9yCXltbTMseW1tMyx5bW03CisJdnB4b3IJeW1tNCx5bW00LHltbTgKKwl2cHhvcgl5bW0yLHltbTIseW1tMTEKKwl2cHhvcgl5bW0zLHltbTMseW1tMTIKKwl2cHhvcgl5bW00LHltbTQseW1tMTMKKworCWRlYwlyYXgKKwlqbnoJTkVBUiAkTCRzZWxlY3RfbG9vcF9hdngyX3c1CisKKwl2bW92ZHF1CVlNTVdPUkRbcmN4XSx5bW0yCisJdm1vdmRxdQlZTU1XT1JEWzMyK3JjeF0seW1tMworCXZtb3ZkcXUJWU1NV09SRFs2NCtyY3hdLHltbTQKKwl2emVyb3VwcGVyCisJbW92YXBzCXhtbTYsWE1NV09SRFtyc3BdCisJbW92YXBzCXhtbTcsWE1NV09SRFsxNityc3BdCisJbW92YXBzCXhtbTgsWE1NV09SRFszMityc3BdCisJbW92YXBzCXhtbTksWE1NV09SRFs0OCtyc3BdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJeG1tMTIsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzE0NCtyc3BdCisJbGVhCXJzcCxbcjExXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzU6CisKKworCisKK2dsb2JhbAllY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzcKKworQUxJR04JMzIKK2VjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NzoKKyRMJGF2eDJfc2VsZWN0X3c3OgorCXZ6ZXJvdXBwZXIKKwltb3YJcjExLHJzcAorCWxlYQlyYXgsWygoLTEzNikpK3JzcF0KKyRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3Rfdzc6CitEQgkweDQ4LDB4OGQsMHg2MCwweGUwCitEQgkweGM1LDB4ZjgsMHgyOSwweDcwLDB4ZTAKK0RCCTB4YzUsMHhmOCwweDI5LDB4NzgsMHhmMAorREIJMHhjNSwweDc4LDB4MjksMHg0MCwweDAwCitEQgkweGM1LDB4NzgsMHgyOSwweDQ4LDB4MTAKK0RCCTB4YzUsMHg3OCwweDI5LDB4NTAsMHgyMAorREIJMHhjNSwweDc4LDB4MjksMHg1OCwweDMwCitEQgkweGM1LDB4NzgsMHgyOSwweDYwLDB4NDAKK0RCCTB4YzUsMHg3OCwweDI5LDB4NjgsMHg1MAorREIJMHhjNSwweDc4LDB4MjksMHg3MCwweDYwCitEQgkweGM1LDB4NzgsMHgyOSwweDc4LDB4NzAKKwl2bW92ZHFhCXltbTAsWU1NV09SRFskTCRUaHJlZV0KKworCXZweG9yCXltbTIseW1tMix5bW0yCisJdnB4b3IJeW1tMyx5bW0zLHltbTMKKworCXZtb3ZkcWEJeW1tNCxZTU1XT1JEWyRMJE9uZV0KKwl2bW92ZHFhCXltbTgsWU1NV09SRFskTCRUd29dCisJdm1vdmRxYQl5bW0xMixZTU1XT1JEWyRMJFRocmVlXQorCisJdm1vdmQJeG1tMSxyOGQKKwl2cGVybWQJeW1tMSx5bW0yLHltbTEKKworCisJbW92CXJheCwyMQorJEwkc2VsZWN0X2xvb3BfYXZ4Ml93NzoKKworCXZtb3ZkcWEJeW1tNSxZTU1XT1JEW3JkeF0KKwl2bW92ZHFhCXltbTYsWU1NV09SRFszMityZHhdCisKKwl2bW92ZHFhCXltbTksWU1NV09SRFs2NCtyZHhdCisJdm1vdmRxYQl5bW0xMCxZTU1XT1JEWzk2K3JkeF0KKworCXZtb3ZkcWEJeW1tMTMsWU1NV09SRFsxMjgrcmR4XQorCXZtb3ZkcWEJeW1tMTQsWU1NV09SRFsxNjArcmR4XQorCisJdnBjbXBlcWQJeW1tNyx5bW00LHltbTEKKwl2cGNtcGVxZAl5bW0xMSx5bW04LHltbTEKKwl2cGNtcGVxZAl5bW0xNSx5bW0xMix5bW0xCisKKwl2cGFkZGQJeW1tNCx5bW00LHltbTAKKwl2cGFkZGQJeW1tOCx5bW04LHltbTAKKwl2cGFkZGQJeW1tMTIseW1tMTIseW1tMAorCWxlYQlyZHgsWzE5MityZHhdCisKKwl2cGFuZAl5bW01LHltbTUseW1tNworCXZwYW5kCXltbTYseW1tNix5bW03CisJdnBhbmQJeW1tOSx5bW05LHltbTExCisJdnBhbmQJeW1tMTAseW1tMTAseW1tMTEKKwl2cGFuZAl5bW0xMyx5bW0xMyx5bW0xNQorCXZwYW5kCXltbTE0LHltbTE0LHltbTE1CisKKwl2cHhvcgl5bW0yLHltbTIseW1tNQorCXZweG9yCXltbTMseW1tMyx5bW02CisJdnB4b3IJeW1tMix5bW0yLHltbTkKKwl2cHhvcgl5bW0zLHltbTMseW1tMTAKKwl2cHhvcgl5bW0yLHltbTIseW1tMTMKKwl2cHhvcgl5bW0zLHltbTMseW1tMTQKKworCWRlYwlyYXgKKwlqbnoJTkVBUiAkTCRzZWxlY3RfbG9vcF9hdngyX3c3CisKKworCXZtb3ZkcWEJeW1tNSxZTU1XT1JEW3JkeF0KKwl2bW92ZHFhCXltbTYsWU1NV09SRFszMityZHhdCisKKwl2cGNtcGVxZAl5bW03LHltbTQseW1tMQorCisJdnBhbmQJeW1tNSx5bW01LHltbTcKKwl2cGFuZAl5bW02LHltbTYseW1tNworCisJdnB4b3IJeW1tMix5bW0yLHltbTUKKwl2cHhvcgl5bW0zLHltbTMseW1tNgorCisJdm1vdmRxdQlZTU1XT1JEW3JjeF0seW1tMgorCXZtb3ZkcXUJWU1NV09SRFszMityY3hdLHltbTMKKwl2emVyb3VwcGVyCisJbW92YXBzCXhtbTYsWE1NV09SRFtyc3BdCisJbW92YXBzCXhtbTcsWE1NV09SRFsxNityc3BdCisJbW92YXBzCXhtbTgsWE1NV09SRFszMityc3BdCisJbW92YXBzCXhtbTksWE1NV09SRFs0OCtyc3BdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJeG1tMTIsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzE0NCtyc3BdCisJbGVhCXJzcCxbcjExXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3Rfdzc6CisKKworQUxJR04JMzIKK19fZWNwX25pc3R6MjU2X2FkZF90b3E6CisJeG9yCXIxMSxyMTEKKwlhZGQJcjEyLFFXT1JEW3JieF0KKwlhZGMJcjEzLFFXT1JEWzgrcmJ4XQorCW1vdglyYXgscjEyCisJYWRjCXI4LFFXT1JEWzE2K3JieF0KKwlhZGMJcjksUVdPUkRbMjQrcmJ4XQorCW1vdglyYnAscjEzCisJYWRjCXIxMSwwCisKKwlzdWIJcjEyLC0xCisJbW92CXJjeCxyOAorCXNiYglyMTMscjE0CisJc2JiCXI4LDAKKwltb3YJcjEwLHI5CisJc2JiCXI5LHIxNQorCXNiYglyMTEsMAorCisJY21vdmMJcjEyLHJheAorCWNtb3ZjCXIxMyxyYnAKKwltb3YJUVdPUkRbcmRpXSxyMTIKKwljbW92YwlyOCxyY3gKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCWNtb3ZjCXI5LHIxMAorCW1vdglRV09SRFsxNityZGldLHI4CisJbW92CVFXT1JEWzI0K3JkaV0scjkKKworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworQUxJR04JMzIKK19fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcToKKwlzdWIJcjEyLFFXT1JEW3JieF0KKwlzYmIJcjEzLFFXT1JEWzgrcmJ4XQorCW1vdglyYXgscjEyCisJc2JiCXI4LFFXT1JEWzE2K3JieF0KKwlzYmIJcjksUVdPUkRbMjQrcmJ4XQorCW1vdglyYnAscjEzCisJc2JiCXIxMSxyMTEKKworCWFkZAlyMTIsLTEKKwltb3YJcmN4LHI4CisJYWRjCXIxMyxyMTQKKwlhZGMJcjgsMAorCW1vdglyMTAscjkKKwlhZGMJcjkscjE1CisJdGVzdAlyMTEscjExCisKKwljbW92eglyMTIscmF4CisJY21vdnoJcjEzLHJicAorCW1vdglRV09SRFtyZGldLHIxMgorCWNtb3Z6CXI4LHJjeAorCW1vdglRV09SRFs4K3JkaV0scjEzCisJY21vdnoJcjkscjEwCisJbW92CVFXT1JEWzE2K3JkaV0scjgKKwltb3YJUVdPUkRbMjQrcmRpXSxyOQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCitBTElHTgkzMgorX19lY3BfbmlzdHoyNTZfc3VicToKKwlzdWIJcmF4LHIxMgorCXNiYglyYnAscjEzCisJbW92CXIxMixyYXgKKwlzYmIJcmN4LHI4CisJc2JiCXIxMCxyOQorCW1vdglyMTMscmJwCisJc2JiCXIxMSxyMTEKKworCWFkZAlyYXgsLTEKKwltb3YJcjgscmN4CisJYWRjCXJicCxyMTQKKwlhZGMJcmN4LDAKKwltb3YJcjkscjEwCisJYWRjCXIxMCxyMTUKKwl0ZXN0CXIxMSxyMTEKKworCWNtb3ZueglyMTIscmF4CisJY21vdm56CXIxMyxyYnAKKwljbW92bnoJcjgscmN4CisJY21vdm56CXI5LHIxMAorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCitBTElHTgkzMgorX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJxOgorCXhvcglyMTEscjExCisJYWRkCXIxMixyMTIKKwlhZGMJcjEzLHIxMworCW1vdglyYXgscjEyCisJYWRjCXI4LHI4CisJYWRjCXI5LHI5CisJbW92CXJicCxyMTMKKwlhZGMJcjExLDAKKworCXN1YglyMTIsLTEKKwltb3YJcmN4LHI4CisJc2JiCXIxMyxyMTQKKwlzYmIJcjgsMAorCW1vdglyMTAscjkKKwlzYmIJcjkscjE1CisJc2JiCXIxMSwwCisKKwljbW92YwlyMTIscmF4CisJY21vdmMJcjEzLHJicAorCW1vdglRV09SRFtyZGldLHIxMgorCWNtb3ZjCXI4LHJjeAorCW1vdglRV09SRFs4K3JkaV0scjEzCisJY21vdmMJcjkscjEwCisJbW92CVFXT1JEWzE2K3JkaV0scjgKKwltb3YJUVdPUkRbMjQrcmRpXSxyOQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK2dsb2JhbAllY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxlCisKK0FMSUdOCTMyCitlY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxlOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZToKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisKKworCisJbGVhCXJjeCxbT1BFTlNTTF9pYTMyY2FwX1BdCisJbW92CXJjeCxRV09SRFs4K3JjeF0KKwlhbmQJZWN4LDB4ODAxMDAKKwljbXAJZWN4LDB4ODAxMDAKKwlqZQlORUFSICRMJHBvaW50X2RvdWJsZXgKKwlwdXNoCXJicAorCisJcHVzaAlyYngKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKwlzdWIJcnNwLDMyKjUrOAorCiskTCRwb2ludF9kb3VibGVxX2JvZHk6CisKKyRMJHBvaW50X2RvdWJsZV9zaG9ydGN1dHE6CisJbW92ZHF1CXhtbTAsWE1NV09SRFtyc2ldCisJbW92CXJieCxyc2kKKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3JzaV0KKwltb3YJcjEyLFFXT1JEWygoMzIrMCkpK3JzaV0KKwltb3YJcjEzLFFXT1JEWygoMzIrOCkpK3JzaV0KKwltb3YJcjgsUVdPUkRbKCgzMisxNikpK3JzaV0KKwltb3YJcjksUVdPUkRbKCgzMisyNCkpK3JzaV0KKwltb3YJcjE0LFFXT1JEWygoJEwkcG9seSs4KSldCisJbW92CXIxNSxRV09SRFsoKCRMJHBvbHkrMjQpKV0KKwltb3ZkcWEJWE1NV09SRFs5Nityc3BdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsoOTYrMTYpK3JzcF0seG1tMQorCWxlYQlyMTAsWzMyK3JkaV0KKwlsZWEJcjExLFs2NCtyZGldCitEQgkxMDIsNzIsMTUsMTEwLDE5OQorREIJMTAyLDczLDE1LDExMCwyMDIKK0RCCTEwMiw3MywxNSwxMTAsMjExCisKKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEKKworCW1vdglyYXgsUVdPUkRbKCg2NCswKSkrcnNpXQorCW1vdglyMTQsUVdPUkRbKCg2NCs4KSkrcnNpXQorCW1vdglyMTUsUVdPUkRbKCg2NCsxNikpK3JzaV0KKwltb3YJcjgsUVdPUkRbKCg2NCsyNCkpK3JzaV0KKwlsZWEJcnNpLFsoKDY0LTApKStyc2ldCisJbGVhCXJkaSxbNjQrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwltb3YJcmF4LFFXT1JEWygoMCswKSkrcnNwXQorCW1vdglyMTQsUVdPUkRbKCg4KzApKStyc3BdCisJbGVhCXJzaSxbKCgwKzApKStyc3BdCisJbW92CXIxNSxRV09SRFsoKDE2KzApKStyc3BdCisJbW92CXI4LFFXT1JEWygoMjQrMCkpK3JzcF0KKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHEKKworCW1vdglyYXgsUVdPUkRbMzIrcmJ4XQorCW1vdglyOSxRV09SRFsoKDY0KzApKStyYnhdCisJbW92CXIxMCxRV09SRFsoKDY0KzgpKStyYnhdCisJbW92CXIxMSxRV09SRFsoKDY0KzE2KSkrcmJ4XQorCW1vdglyMTIsUVdPUkRbKCg2NCsyNCkpK3JieF0KKwlsZWEJcnNpLFsoKDY0LTApKStyYnhdCisJbGVhCXJieCxbMzIrcmJ4XQorREIJMTAyLDcyLDE1LDEyNiwyMTUKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJxCisKKwltb3YJcjEyLFFXT1JEWygoOTYrMCkpK3JzcF0KKwltb3YJcjEzLFFXT1JEWygoOTYrOCkpK3JzcF0KKwlsZWEJcmJ4LFs2NCtyc3BdCisJbW92CXI4LFFXT1JEWygoOTYrMTYpKStyc3BdCisJbW92CXI5LFFXT1JEWygoOTYrMjQpKStyc3BdCisJbGVhCXJkaSxbMzIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfYWRkX3RvcQorCisJbW92CXIxMixRV09SRFsoKDk2KzApKStyc3BdCisJbW92CXIxMyxRV09SRFsoKDk2KzgpKStyc3BdCisJbGVhCXJieCxbNjQrcnNwXQorCW1vdglyOCxRV09SRFsoKDk2KzE2KSkrcnNwXQorCW1vdglyOSxRV09SRFsoKDk2KzI0KSkrcnNwXQorCWxlYQlyZGksWzY0K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92CXJheCxRV09SRFsoKDArMCkpK3JzcF0KKwltb3YJcjE0LFFXT1JEWygoOCswKSkrcnNwXQorCWxlYQlyc2ksWygoMCswKSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgxNiswKSkrcnNwXQorCW1vdglyOCxRV09SRFsoKDI0KzApKStyc3BdCitEQgkxMDIsNzIsMTUsMTI2LDIwNworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisJeG9yCXI5LHI5CisJbW92CXJheCxyMTIKKwlhZGQJcjEyLC0xCisJbW92CXIxMCxyMTMKKwlhZGMJcjEzLHJzaQorCW1vdglyY3gscjE0CisJYWRjCXIxNCwwCisJbW92CXI4LHIxNQorCWFkYwlyMTUscmJwCisJYWRjCXI5LDAKKwl4b3IJcnNpLHJzaQorCXRlc3QJcmF4LDEKKworCWNtb3Z6CXIxMixyYXgKKwljbW92eglyMTMscjEwCisJY21vdnoJcjE0LHJjeAorCWNtb3Z6CXIxNSxyOAorCWNtb3Z6CXI5LHJzaQorCisJbW92CXJheCxyMTMKKwlzaHIJcjEyLDEKKwlzaGwJcmF4LDYzCisJbW92CXIxMCxyMTQKKwlzaHIJcjEzLDEKKwlvcglyMTIscmF4CisJc2hsCXIxMCw2MworCW1vdglyY3gscjE1CisJc2hyCXIxNCwxCisJb3IJcjEzLHIxMAorCXNobAlyY3gsNjMKKwltb3YJUVdPUkRbcmRpXSxyMTIKKwlzaHIJcjE1LDEKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCXNobAlyOSw2MworCW9yCXIxNCxyY3gKKwlvcglyMTUscjkKKwltb3YJUVdPUkRbMTYrcmRpXSxyMTQKKwltb3YJUVdPUkRbMjQrcmRpXSxyMTUKKwltb3YJcmF4LFFXT1JEWzY0K3JzcF0KKwlsZWEJcmJ4LFs2NCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCszMikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCszMikpK3JzcF0KKwlsZWEJcnNpLFsoKDArMzIpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzMyKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCszMikpK3JzcF0KKwlsZWEJcmRpLFszMityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYQlyZGksWzEyOCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMnEKKworCWxlYQlyYngsWzMyK3JzcF0KKwlsZWEJcmRpLFszMityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9hZGRfdG9xCisKKwltb3YJcmF4LFFXT1JEWzk2K3JzcF0KKwlsZWEJcmJ4LFs5Nityc3BdCisJbW92CXI5LFFXT1JEWygoMCswKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzApKStyc3BdCisJbGVhCXJzaSxbKCgwKzApKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzApKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzApKStyc3BdCisJbGVhCXJkaSxbcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWEJcmRpLFsxMjgrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJxCisKKwltb3YJcmF4LFFXT1JEWygoMCszMikpK3JzcF0KKwltb3YJcjE0LFFXT1JEWygoOCszMikpK3JzcF0KKwlsZWEJcnNpLFsoKDArMzIpKStyc3BdCisJbW92CXIxNSxRV09SRFsoKDE2KzMyKSkrcnNwXQorCW1vdglyOCxRV09SRFsoKDI0KzMyKSkrcnNwXQorREIJMTAyLDcyLDE1LDEyNiwxOTkKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbGVhCXJieCxbMTI4K3JzcF0KKwltb3YJcjgscjE0CisJbW92CXI5LHIxNQorCW1vdglyMTQscnNpCisJbW92CXIxNSxyYnAKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJbW92CXJheCxRV09SRFsoKDArMCkpK3JzcF0KKwltb3YJcmJwLFFXT1JEWygoMCs4KSkrcnNwXQorCW1vdglyY3gsUVdPUkRbKCgwKzE2KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCgwKzI0KSkrcnNwXQorCWxlYQlyZGksW3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YnEKKworCW1vdglyYXgsUVdPUkRbMzIrcnNwXQorCWxlYQlyYngsWzMyK3JzcF0KKwltb3YJcjE0LHIxMgorCXhvcgllY3gsZWN4CisJbW92CVFXT1JEWygoMCswKSkrcnNwXSxyMTIKKwltb3YJcjEwLHIxMworCW1vdglRV09SRFsoKDArOCkpK3JzcF0scjEzCisJY21vdnoJcjExLHI4CisJbW92CVFXT1JEWygoMCsxNikpK3JzcF0scjgKKwlsZWEJcnNpLFsoKDAtMCkpK3JzcF0KKwljbW92eglyMTIscjkKKwltb3YJUVdPUkRbKCgwKzI0KSkrcnNwXSxyOQorCW1vdglyOSxyMTQKKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworREIJMTAyLDcyLDE1LDEyNiwyMDMKK0RCCTEwMiw3MiwxNSwxMjYsMjA3CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCWxlYQlyc2ksWygoMTYwKzU2KSkrcnNwXQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJHBvaW50X2RvdWJsZXFfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZToKK2dsb2JhbAllY3BfbmlzdHoyNTZfcG9pbnRfYWRkCisKK0FMSUdOCTMyCitlY3BfbmlzdHoyNTZfcG9pbnRfYWRkOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X3BvaW50X2FkZDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworCWxlYQlyY3gsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyY3gsUVdPUkRbOCtyY3hdCisJYW5kCWVjeCwweDgwMTAwCisJY21wCWVjeCwweDgwMTAwCisJamUJTkVBUiAkTCRwb2ludF9hZGR4CisJcHVzaAlyYnAKKworCXB1c2gJcmJ4CisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJc3ViCXJzcCwzMioxOCs4CisKKyRMJHBvaW50X2FkZHFfYm9keToKKworCW1vdmRxdQl4bW0wLFhNTVdPUkRbcnNpXQorCW1vdmRxdQl4bW0xLFhNTVdPUkRbMTYrcnNpXQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcnNpXQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbNDgrcnNpXQorCW1vdmRxdQl4bW00LFhNTVdPUkRbNjQrcnNpXQorCW1vdmRxdQl4bW01LFhNTVdPUkRbODArcnNpXQorCW1vdglyYngscnNpCisJbW92CXJzaSxyZHgKKwltb3ZkcWEJWE1NV09SRFszODQrcnNwXSx4bW0wCisJbW92ZHFhCVhNTVdPUkRbKDM4NCsxNikrcnNwXSx4bW0xCisJbW92ZHFhCVhNTVdPUkRbNDE2K3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWyg0MTYrMTYpK3JzcF0seG1tMworCW1vdmRxYQlYTU1XT1JEWzQ0OCtyc3BdLHhtbTQKKwltb3ZkcWEJWE1NV09SRFsoNDQ4KzE2KStyc3BdLHhtbTUKKwlwb3IJeG1tNSx4bW00CisKKwltb3ZkcXUJeG1tMCxYTU1XT1JEW3JzaV0KKwlwc2h1ZmQJeG1tMyx4bW01LDB4YjEKKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3JzaV0KKwltb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3JzaV0KKwlwb3IJeG1tNSx4bW0zCisJbW92ZHF1CXhtbTMsWE1NV09SRFs0OCtyc2ldCisJbW92CXJheCxRV09SRFsoKDY0KzApKStyc2ldCisJbW92CXIxNCxRV09SRFsoKDY0KzgpKStyc2ldCisJbW92CXIxNSxRV09SRFsoKDY0KzE2KSkrcnNpXQorCW1vdglyOCxRV09SRFsoKDY0KzI0KSkrcnNpXQorCW1vdmRxYQlYTU1XT1JEWzQ4MCtyc3BdLHhtbTAKKwlwc2h1ZmQJeG1tNCx4bW01LDB4MWUKKwltb3ZkcWEJWE1NV09SRFsoNDgwKzE2KStyc3BdLHhtbTEKKwltb3ZkcXUJeG1tMCxYTU1XT1JEWzY0K3JzaV0KKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzgwK3JzaV0KKwltb3ZkcWEJWE1NV09SRFs1MTIrcnNwXSx4bW0yCisJbW92ZHFhCVhNTVdPUkRbKDUxMisxNikrcnNwXSx4bW0zCisJcG9yCXhtbTUseG1tNAorCXB4b3IJeG1tNCx4bW00CisJcG9yCXhtbTEseG1tMAorREIJMTAyLDcyLDE1LDExMCwxOTkKKworCWxlYQlyc2ksWygoNjQtMCkpK3JzaV0KKwltb3YJUVdPUkRbKCg1NDQrMCkpK3JzcF0scmF4CisJbW92CVFXT1JEWygoNTQ0KzgpKStyc3BdLHIxNAorCW1vdglRV09SRFsoKDU0NCsxNikpK3JzcF0scjE1CisJbW92CVFXT1JEWygoNTQ0KzI0KSkrcnNwXSxyOAorCWxlYQlyZGksWzk2K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJcGNtcGVxZAl4bW01LHhtbTQKKwlwc2h1ZmQJeG1tNCx4bW0xLDB4YjEKKwlwb3IJeG1tNCx4bW0xCisJcHNodWZkCXhtbTUseG1tNSwwCisJcHNodWZkCXhtbTMseG1tNCwweDFlCisJcG9yCXhtbTQseG1tMworCXB4b3IJeG1tMyx4bW0zCisJcGNtcGVxZAl4bW00LHhtbTMKKwlwc2h1ZmQJeG1tNCx4bW00LDAKKwltb3YJcmF4LFFXT1JEWygoNjQrMCkpK3JieF0KKwltb3YJcjE0LFFXT1JEWygoNjQrOCkpK3JieF0KKwltb3YJcjE1LFFXT1JEWygoNjQrMTYpKStyYnhdCisJbW92CXI4LFFXT1JEWygoNjQrMjQpKStyYnhdCitEQgkxMDIsNzIsMTUsMTEwLDIwMworCisJbGVhCXJzaSxbKCg2NC0wKSkrcmJ4XQorCWxlYQlyZGksWzMyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92CXJheCxRV09SRFs1NDQrcnNwXQorCWxlYQlyYngsWzU0NCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCs5NikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCs5NikpK3JzcF0KKwlsZWEJcnNpLFsoKDArOTYpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2Kzk2KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCs5NikpK3JzcF0KKwlsZWEJcmRpLFsyMjQrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3YJcmF4LFFXT1JEWzQ0OCtyc3BdCisJbGVhCXJieCxbNDQ4K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzMyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzMyKSkrcnNwXQorCWxlYQlyc2ksWygoMCszMikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzMyKSkrcnNwXQorCWxlYQlyZGksWzI1Nityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCW1vdglyYXgsUVdPUkRbNDE2K3JzcF0KKwlsZWEJcmJ4LFs0MTYrcnNwXQorCW1vdglyOSxRV09SRFsoKDArMjI0KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzIyNCkpK3JzcF0KKwlsZWEJcnNpLFsoKDArMjI0KSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNisyMjQpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzIyNCkpK3JzcF0KKwlsZWEJcmRpLFsyMjQrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3YJcmF4LFFXT1JEWzUxMityc3BdCisJbGVhCXJieCxbNTEyK3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzI1NikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCsyNTYpKStyc3BdCisJbGVhCXJzaSxbKCgwKzI1NikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMjU2KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCsyNTYpKStyc3BdCisJbGVhCXJkaSxbMjU2K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbGVhCXJieCxbMjI0K3JzcF0KKwlsZWEJcmRpLFs2NCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCW9yCXIxMixyMTMKKwltb3ZkcWEJeG1tMix4bW00CisJb3IJcjEyLHI4CisJb3IJcjEyLHI5CisJcG9yCXhtbTIseG1tNQorREIJMTAyLDczLDE1LDExMCwyMjAKKworCW1vdglyYXgsUVdPUkRbMzg0K3JzcF0KKwlsZWEJcmJ4LFszODQrcnNwXQorCW1vdglyOSxRV09SRFsoKDArOTYpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDgrOTYpKStyc3BdCisJbGVhCXJzaSxbKCgwKzk2KSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNis5NikpK3JzcF0KKwltb3YJcjEyLFFXT1JEWygoMjQrOTYpKStyc3BdCisJbGVhCXJkaSxbMTYwK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92CXJheCxRV09SRFs0ODArcnNwXQorCWxlYQlyYngsWzQ4MCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCszMikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCszMikpK3JzcF0KKwlsZWEJcnNpLFsoKDArMzIpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzMyKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCszMikpK3JzcF0KKwlsZWEJcmRpLFsxOTIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWEJcmJ4LFsxNjArcnNwXQorCWxlYQlyZGksW3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9tcQorCisJb3IJcjEyLHIxMworCW9yCXIxMixyOAorCW9yCXIxMixyOQorCitEQgkweDNlCisJam56CU5FQVIgJEwkYWRkX3Byb2NlZWRxCitEQgkxMDIsNzMsMTUsMTI2LDIwOAorREIJMTAyLDczLDE1LDEyNiwyMTcKKwl0ZXN0CXI4LHI4CisJam56CU5FQVIgJEwkYWRkX3Byb2NlZWRxCisJdGVzdAlyOSxyOQorCWp6CU5FQVIgJEwkYWRkX2RvdWJsZXEKKworREIJMTAyLDcyLDE1LDEyNiwxOTkKKwlweG9yCXhtbTAseG1tMAorCW1vdmRxdQlYTU1XT1JEW3JkaV0seG1tMAorCW1vdmRxdQlYTU1XT1JEWzE2K3JkaV0seG1tMAorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMAorCW1vdmRxdQlYTU1XT1JEWzQ4K3JkaV0seG1tMAorCW1vdmRxdQlYTU1XT1JEWzY0K3JkaV0seG1tMAorCW1vdmRxdQlYTU1XT1JEWzgwK3JkaV0seG1tMAorCWptcAlORUFSICRMJGFkZF9kb25lcQorCitBTElHTgkzMgorJEwkYWRkX2RvdWJsZXE6CitEQgkxMDIsNzIsMTUsMTI2LDIwNgorREIJMTAyLDcyLDE1LDEyNiwxOTkKKwlhZGQJcnNwLDQxNgorCWptcAlORUFSICRMJHBvaW50X2RvdWJsZV9zaG9ydGN1dHEKKworQUxJR04JMzIKKyRMJGFkZF9wcm9jZWVkcToKKwltb3YJcmF4LFFXT1JEWygoMCs2NCkpK3JzcF0KKwltb3YJcjE0LFFXT1JEWygoOCs2NCkpK3JzcF0KKwlsZWEJcnNpLFsoKDArNjQpKStyc3BdCisJbW92CXIxNSxRV09SRFsoKDE2KzY0KSkrcnNwXQorCW1vdglyOCxRV09SRFsoKDI0KzY0KSkrcnNwXQorCWxlYQlyZGksWzk2K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92CXJheCxRV09SRFs0NDgrcnNwXQorCWxlYQlyYngsWzQ0OCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCswKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzApKStyc3BdCisJbGVhCXJzaSxbKCgwKzApKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzApKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzApKStyc3BdCisJbGVhCXJkaSxbMzUyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92CXJheCxRV09SRFsoKDArMCkpK3JzcF0KKwltb3YJcjE0LFFXT1JEWygoOCswKSkrcnNwXQorCWxlYQlyc2ksWygoMCswKSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgxNiswKSkrcnNwXQorCW1vdglyOCxRV09SRFsoKDI0KzApKStyc3BdCisJbGVhCXJkaSxbMzIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwltb3YJcmF4LFFXT1JEWzU0NCtyc3BdCisJbGVhCXJieCxbNTQ0K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzM1MikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCszNTIpKStyc3BdCisJbGVhCXJzaSxbKCgwKzM1MikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzUyKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCszNTIpKStyc3BdCisJbGVhCXJkaSxbMzUyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92CXJheCxRV09SRFtyc3BdCisJbGVhCXJieCxbcnNwXQorCW1vdglyOSxRV09SRFsoKDArMzIpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDgrMzIpKStyc3BdCisJbGVhCXJzaSxbKCgwKzMyKSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNiszMikpK3JzcF0KKwltb3YJcjEyLFFXT1JEWygoMjQrMzIpKStyc3BdCisJbGVhCXJkaSxbMTI4K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92CXJheCxRV09SRFsxNjArcnNwXQorCWxlYQlyYngsWzE2MCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCszMikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCszMikpK3JzcF0KKwlsZWEJcnNpLFsoKDArMzIpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzMyKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCszMikpK3JzcF0KKwlsZWEJcmRpLFsxOTIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKworCisKKwl4b3IJcjExLHIxMQorCWFkZAlyMTIscjEyCisJbGVhCXJzaSxbOTYrcnNwXQorCWFkYwlyMTMscjEzCisJbW92CXJheCxyMTIKKwlhZGMJcjgscjgKKwlhZGMJcjkscjkKKwltb3YJcmJwLHIxMworCWFkYwlyMTEsMAorCisJc3ViCXIxMiwtMQorCW1vdglyY3gscjgKKwlzYmIJcjEzLHIxNAorCXNiYglyOCwwCisJbW92CXIxMCxyOQorCXNiYglyOSxyMTUKKwlzYmIJcjExLDAKKworCWNtb3ZjCXIxMixyYXgKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwljbW92YwlyMTMscmJwCisJbW92CXJicCxRV09SRFs4K3JzaV0KKwljbW92YwlyOCxyY3gKKwltb3YJcmN4LFFXT1JEWzE2K3JzaV0KKwljbW92YwlyOSxyMTAKKwltb3YJcjEwLFFXT1JEWzI0K3JzaV0KKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VicQorCisJbGVhCXJieCxbMTI4K3JzcF0KKwlsZWEJcmRpLFsyODgrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwltb3YJcmF4LFFXT1JEWygoMTkyKzApKStyc3BdCisJbW92CXJicCxRV09SRFsoKDE5Mis4KSkrcnNwXQorCW1vdglyY3gsUVdPUkRbKCgxOTIrMTYpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDE5MisyNCkpK3JzcF0KKwlsZWEJcmRpLFszMjArcnNwXQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJxCisKKwltb3YJUVdPUkRbcmRpXSxyMTIKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCW1vdglRV09SRFsxNityZGldLHI4CisJbW92CVFXT1JEWzI0K3JkaV0scjkKKwltb3YJcmF4LFFXT1JEWzEyOCtyc3BdCisJbGVhCXJieCxbMTI4K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzIyNCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCsyMjQpKStyc3BdCisJbGVhCXJzaSxbKCgwKzIyNCkpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMjI0KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCsyMjQpKStyc3BdCisJbGVhCXJkaSxbMjU2K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92CXJheCxRV09SRFszMjArcnNwXQorCWxlYQlyYngsWzMyMCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCs2NCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCs2NCkpK3JzcF0KKwlsZWEJcnNpLFsoKDArNjQpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzY0KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCs2NCkpK3JzcF0KKwlsZWEJcmRpLFszMjArcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwlsZWEJcmJ4LFsyNTYrcnNwXQorCWxlYQlyZGksWzMyMCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworREIJMTAyLDcyLDE1LDEyNiwxOTkKKworCW1vdmRxYQl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW01CisJcGFuZG4JeG1tMCxYTU1XT1JEWzM1Mityc3BdCisJbW92ZHFhCXhtbTIseG1tNQorCXBhbmRuCXhtbTEsWE1NV09SRFsoKDM1MisxNikpK3JzcF0KKwltb3ZkcWEJeG1tMyx4bW01CisJcGFuZAl4bW0yLFhNTVdPUkRbNTQ0K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDU0NCsxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzQ0OCtyc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCg0NDgrMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFs2NCtyZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFs4MCtyZGldLHhtbTMKKworCW1vdmRxYQl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW01CisJcGFuZG4JeG1tMCxYTU1XT1JEWzI4OCtyc3BdCisJbW92ZHFhCXhtbTIseG1tNQorCXBhbmRuCXhtbTEsWE1NV09SRFsoKDI4OCsxNikpK3JzcF0KKwltb3ZkcWEJeG1tMyx4bW01CisJcGFuZAl4bW0yLFhNTVdPUkRbNDgwK3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDQ4MCsxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzM4NCtyc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgzODQrMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFtyZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFsxNityZGldLHhtbTMKKworCW1vdmRxYQl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW01CisJcGFuZG4JeG1tMCxYTU1XT1JEWzMyMCtyc3BdCisJbW92ZHFhCXhtbTIseG1tNQorCXBhbmRuCXhtbTEsWE1NV09SRFsoKDMyMCsxNikpK3JzcF0KKwltb3ZkcWEJeG1tMyx4bW01CisJcGFuZAl4bW0yLFhNTVdPUkRbNTEyK3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDUxMisxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzQxNityc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCg0MTYrMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFszMityZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFs0OCtyZGldLHhtbTMKKworJEwkYWRkX2RvbmVxOgorCWxlYQlyc2ksWygoNTc2KzU2KSkrcnNwXQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJHBvaW50X2FkZHFfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3BvaW50X2FkZDoKK2dsb2JhbAllY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZQorCitBTElHTgkzMgorZWNwX25pc3R6MjU2X3BvaW50X2FkZF9hZmZpbmU6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZToKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworCWxlYQlyY3gsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyY3gsUVdPUkRbOCtyY3hdCisJYW5kCWVjeCwweDgwMTAwCisJY21wCWVjeCwweDgwMTAwCisJamUJTkVBUiAkTCRwb2ludF9hZGRfYWZmaW5leAorCXB1c2gJcmJwCisKKwlwdXNoCXJieAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXN1Yglyc3AsMzIqMTUrOAorCiskTCRhZGRfYWZmaW5lcV9ib2R5OgorCisJbW92ZHF1CXhtbTAsWE1NV09SRFtyc2ldCisJbW92CXJieCxyZHgKKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3JzaV0KKwltb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3JzaV0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzQ4K3JzaV0KKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzY0K3JzaV0KKwltb3ZkcXUJeG1tNSxYTU1XT1JEWzgwK3JzaV0KKwltb3YJcmF4LFFXT1JEWygoNjQrMCkpK3JzaV0KKwltb3YJcjE0LFFXT1JEWygoNjQrOCkpK3JzaV0KKwltb3YJcjE1LFFXT1JEWygoNjQrMTYpKStyc2ldCisJbW92CXI4LFFXT1JEWygoNjQrMjQpKStyc2ldCisJbW92ZHFhCVhNTVdPUkRbMzIwK3JzcF0seG1tMAorCW1vdmRxYQlYTU1XT1JEWygzMjArMTYpK3JzcF0seG1tMQorCW1vdmRxYQlYTU1XT1JEWzM1Mityc3BdLHhtbTIKKwltb3ZkcWEJWE1NV09SRFsoMzUyKzE2KStyc3BdLHhtbTMKKwltb3ZkcWEJWE1NV09SRFszODQrcnNwXSx4bW00CisJbW92ZHFhCVhNTVdPUkRbKDM4NCsxNikrcnNwXSx4bW01CisJcG9yCXhtbTUseG1tNAorCisJbW92ZHF1CXhtbTAsWE1NV09SRFtyYnhdCisJcHNodWZkCXhtbTMseG1tNSwweGIxCisJbW92ZHF1CXhtbTEsWE1NV09SRFsxNityYnhdCisJbW92ZHF1CXhtbTIsWE1NV09SRFszMityYnhdCisJcG9yCXhtbTUseG1tMworCW1vdmRxdQl4bW0zLFhNTVdPUkRbNDgrcmJ4XQorCW1vdmRxYQlYTU1XT1JEWzQxNityc3BdLHhtbTAKKwlwc2h1ZmQJeG1tNCx4bW01LDB4MWUKKwltb3ZkcWEJWE1NV09SRFsoNDE2KzE2KStyc3BdLHhtbTEKKwlwb3IJeG1tMSx4bW0wCitEQgkxMDIsNzIsMTUsMTEwLDE5OQorCW1vdmRxYQlYTU1XT1JEWzQ0OCtyc3BdLHhtbTIKKwltb3ZkcWEJWE1NV09SRFsoNDQ4KzE2KStyc3BdLHhtbTMKKwlwb3IJeG1tMyx4bW0yCisJcG9yCXhtbTUseG1tNAorCXB4b3IJeG1tNCx4bW00CisJcG9yCXhtbTMseG1tMQorCisJbGVhCXJzaSxbKCg2NC0wKSkrcnNpXQorCWxlYQlyZGksWzMyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJcGNtcGVxZAl4bW01LHhtbTQKKwlwc2h1ZmQJeG1tNCx4bW0zLDB4YjEKKwltb3YJcmF4LFFXT1JEW3JieF0KKworCW1vdglyOSxyMTIKKwlwb3IJeG1tNCx4bW0zCisJcHNodWZkCXhtbTUseG1tNSwwCisJcHNodWZkCXhtbTMseG1tNCwweDFlCisJbW92CXIxMCxyMTMKKwlwb3IJeG1tNCx4bW0zCisJcHhvcgl4bW0zLHhtbTMKKwltb3YJcjExLHIxNAorCXBjbXBlcWQJeG1tNCx4bW0zCisJcHNodWZkCXhtbTQseG1tNCwwCisKKwlsZWEJcnNpLFsoKDMyLTApKStyc3BdCisJbW92CXIxMixyMTUKKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYQlyYngsWzMyMCtyc3BdCisJbGVhCXJkaSxbNjQrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwltb3YJcmF4LFFXT1JEWzM4NCtyc3BdCisJbGVhCXJieCxbMzg0K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzMyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzMyKSkrcnNwXQorCWxlYQlyc2ksWygoMCszMikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzMyKSkrcnNwXQorCWxlYQlyZGksWzMyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbW92CXJheCxRV09SRFszODQrcnNwXQorCWxlYQlyYngsWzM4NCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCs2NCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCs2NCkpK3JzcF0KKwlsZWEJcnNpLFsoKDArNjQpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzY0KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCs2NCkpK3JzcF0KKwlsZWEJcmRpLFsyODgrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3YJcmF4LFFXT1JEWzQ0OCtyc3BdCisJbGVhCXJieCxbNDQ4K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzMyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzMyKSkrcnNwXQorCWxlYQlyc2ksWygoMCszMikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzMyKSkrcnNwXQorCWxlYQlyZGksWzMyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250cQorCisJbGVhCXJieCxbMzUyK3JzcF0KKwlsZWEJcmRpLFs5Nityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXEKKworCW1vdglyYXgsUVdPUkRbKCgwKzY0KSkrcnNwXQorCW1vdglyMTQsUVdPUkRbKCg4KzY0KSkrcnNwXQorCWxlYQlyc2ksWygoMCs2NCkpK3JzcF0KKwltb3YJcjE1LFFXT1JEWygoMTYrNjQpKStyc3BdCisJbW92CXI4LFFXT1JEWygoMjQrNjQpKStyc3BdCisJbGVhCXJkaSxbMTI4K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250cQorCisJbW92CXJheCxRV09SRFsoKDArOTYpKStyc3BdCisJbW92CXIxNCxRV09SRFsoKDgrOTYpKStyc3BdCisJbGVhCXJzaSxbKCgwKzk2KSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgxNis5NikpK3JzcF0KKwltb3YJcjgsUVdPUkRbKCgyNCs5NikpK3JzcF0KKwlsZWEJcmRpLFsxOTIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnRxCisKKwltb3YJcmF4LFFXT1JEWzEyOCtyc3BdCisJbGVhCXJieCxbMTI4K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzY0KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzY0KSkrcnNwXQorCWxlYQlyc2ksWygoMCs2NCkpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrNjQpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzY0KSkrcnNwXQorCWxlYQlyZGksWzE2MCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCW1vdglyYXgsUVdPUkRbMzIwK3JzcF0KKwlsZWEJcmJ4LFszMjArcnNwXQorCW1vdglyOSxRV09SRFsoKDArMTI4KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzEyOCkpK3JzcF0KKwlsZWEJcnNpLFsoKDArMTI4KSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNisxMjgpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzEyOCkpK3JzcF0KKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCisKKworCXhvcglyMTEscjExCisJYWRkCXIxMixyMTIKKwlsZWEJcnNpLFsxOTIrcnNwXQorCWFkYwlyMTMscjEzCisJbW92CXJheCxyMTIKKwlhZGMJcjgscjgKKwlhZGMJcjkscjkKKwltb3YJcmJwLHIxMworCWFkYwlyMTEsMAorCisJc3ViCXIxMiwtMQorCW1vdglyY3gscjgKKwlzYmIJcjEzLHIxNAorCXNiYglyOCwwCisJbW92CXIxMCxyOQorCXNiYglyOSxyMTUKKwlzYmIJcjExLDAKKworCWNtb3ZjCXIxMixyYXgKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwljbW92YwlyMTMscmJwCisJbW92CXJicCxRV09SRFs4K3JzaV0KKwljbW92YwlyOCxyY3gKKwltb3YJcmN4LFFXT1JEWzE2K3JzaV0KKwljbW92YwlyOSxyMTAKKwltb3YJcjEwLFFXT1JEWzI0K3JzaV0KKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VicQorCisJbGVhCXJieCxbMTYwK3JzcF0KKwlsZWEJcmRpLFsyMjQrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKKwltb3YJcmF4LFFXT1JEWygoMCswKSkrcnNwXQorCW1vdglyYnAsUVdPUkRbKCgwKzgpKStyc3BdCisJbW92CXJjeCxRV09SRFsoKDArMTYpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDArMjQpKStyc3BdCisJbGVhCXJkaSxbNjQrcnNwXQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJxCisKKwltb3YJUVdPUkRbcmRpXSxyMTIKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCW1vdglRV09SRFsxNityZGldLHI4CisJbW92CVFXT1JEWzI0K3JkaV0scjkKKwltb3YJcmF4LFFXT1JEWzM1Mityc3BdCisJbGVhCXJieCxbMzUyK3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzE2MCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCsxNjApKStyc3BdCisJbGVhCXJzaSxbKCgwKzE2MCkpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMTYwKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCsxNjApKStyc3BdCisJbGVhCXJkaSxbMzIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnRxCisKKwltb3YJcmF4LFFXT1JEWzk2K3JzcF0KKwlsZWEJcmJ4LFs5Nityc3BdCisJbW92CXI5LFFXT1JEWygoMCs2NCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCs2NCkpK3JzcF0KKwlsZWEJcnNpLFsoKDArNjQpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzY0KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCs2NCkpK3JzcF0KKwlsZWEJcmRpLFs2NCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHEKKworCWxlYQlyYngsWzMyK3JzcF0KKwlsZWEJcmRpLFsyNTYrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb21xCisKK0RCCTEwMiw3MiwxNSwxMjYsMTk5CisKKwltb3ZkcWEJeG1tMCx4bW01CisJbW92ZHFhCXhtbTEseG1tNQorCXBhbmRuCXhtbTAsWE1NV09SRFsyODgrcnNwXQorCW1vdmRxYQl4bW0yLHhtbTUKKwlwYW5kbgl4bW0xLFhNTVdPUkRbKCgyODgrMTYpKStyc3BdCisJbW92ZHFhCXhtbTMseG1tNQorCXBhbmQJeG1tMixYTU1XT1JEWyRMJE9ORV9tb250XQorCXBhbmQJeG1tMyxYTU1XT1JEWygoJEwkT05FX21vbnQrMTYpKV0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzM4NCtyc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgzODQrMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFs2NCtyZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFs4MCtyZGldLHhtbTMKKworCW1vdmRxYQl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW01CisJcGFuZG4JeG1tMCxYTU1XT1JEWzIyNCtyc3BdCisJbW92ZHFhCXhtbTIseG1tNQorCXBhbmRuCXhtbTEsWE1NV09SRFsoKDIyNCsxNikpK3JzcF0KKwltb3ZkcWEJeG1tMyx4bW01CisJcGFuZAl4bW0yLFhNTVdPUkRbNDE2K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDQxNisxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzMyMCtyc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgzMjArMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFtyZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFsxNityZGldLHhtbTMKKworCW1vdmRxYQl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW01CisJcGFuZG4JeG1tMCxYTU1XT1JEWzI1Nityc3BdCisJbW92ZHFhCXhtbTIseG1tNQorCXBhbmRuCXhtbTEsWE1NV09SRFsoKDI1NisxNikpK3JzcF0KKwltb3ZkcWEJeG1tMyx4bW01CisJcGFuZAl4bW0yLFhNTVdPUkRbNDQ4K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDQ0OCsxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzM1Mityc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgzNTIrMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFszMityZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFs0OCtyZGldLHhtbTMKKworCWxlYQlyc2ksWygoNDgwKzU2KSkrcnNwXQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJGFkZF9hZmZpbmVxX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lOgorCitBTElHTgkzMgorX19lY3BfbmlzdHoyNTZfYWRkX3RveDoKKwl4b3IJcjExLHIxMQorCWFkYwlyMTIsUVdPUkRbcmJ4XQorCWFkYwlyMTMsUVdPUkRbOCtyYnhdCisJbW92CXJheCxyMTIKKwlhZGMJcjgsUVdPUkRbMTYrcmJ4XQorCWFkYwlyOSxRV09SRFsyNCtyYnhdCisJbW92CXJicCxyMTMKKwlhZGMJcjExLDAKKworCXhvcglyMTAscjEwCisJc2JiCXIxMiwtMQorCW1vdglyY3gscjgKKwlzYmIJcjEzLHIxNAorCXNiYglyOCwwCisJbW92CXIxMCxyOQorCXNiYglyOSxyMTUKKwlzYmIJcjExLDAKKworCWNtb3ZjCXIxMixyYXgKKwljbW92YwlyMTMscmJwCisJbW92CVFXT1JEW3JkaV0scjEyCisJY21vdmMJcjgscmN4CisJbW92CVFXT1JEWzgrcmRpXSxyMTMKKwljbW92YwlyOSxyMTAKKwltb3YJUVdPUkRbMTYrcmRpXSxyOAorCW1vdglRV09SRFsyNCtyZGldLHI5CisKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKK0FMSUdOCTMyCitfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXg6CisJeG9yCXIxMSxyMTEKKwlzYmIJcjEyLFFXT1JEW3JieF0KKwlzYmIJcjEzLFFXT1JEWzgrcmJ4XQorCW1vdglyYXgscjEyCisJc2JiCXI4LFFXT1JEWzE2K3JieF0KKwlzYmIJcjksUVdPUkRbMjQrcmJ4XQorCW1vdglyYnAscjEzCisJc2JiCXIxMSwwCisKKwl4b3IJcjEwLHIxMAorCWFkYwlyMTIsLTEKKwltb3YJcmN4LHI4CisJYWRjCXIxMyxyMTQKKwlhZGMJcjgsMAorCW1vdglyMTAscjkKKwlhZGMJcjkscjE1CisKKwlidAlyMTEsMAorCWNtb3ZuYwlyMTIscmF4CisJY21vdm5jCXIxMyxyYnAKKwltb3YJUVdPUkRbcmRpXSxyMTIKKwljbW92bmMJcjgscmN4CisJbW92CVFXT1JEWzgrcmRpXSxyMTMKKwljbW92bmMJcjkscjEwCisJbW92CVFXT1JEWzE2K3JkaV0scjgKKwltb3YJUVdPUkRbMjQrcmRpXSxyOQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCitBTElHTgkzMgorX19lY3BfbmlzdHoyNTZfc3VieDoKKwl4b3IJcjExLHIxMQorCXNiYglyYXgscjEyCisJc2JiCXJicCxyMTMKKwltb3YJcjEyLHJheAorCXNiYglyY3gscjgKKwlzYmIJcjEwLHI5CisJbW92CXIxMyxyYnAKKwlzYmIJcjExLDAKKworCXhvcglyOSxyOQorCWFkYwlyYXgsLTEKKwltb3YJcjgscmN4CisJYWRjCXJicCxyMTQKKwlhZGMJcmN4LDAKKwltb3YJcjkscjEwCisJYWRjCXIxMCxyMTUKKworCWJ0CXIxMSwwCisJY21vdmMJcjEyLHJheAorCWNtb3ZjCXIxMyxyYnAKKwljbW92YwlyOCxyY3gKKwljbW92YwlyOSxyMTAKKworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworQUxJR04JMzIKK19fZWNwX25pc3R6MjU2X211bF9ieV8yeDoKKwl4b3IJcjExLHIxMQorCWFkYwlyMTIscjEyCisJYWRjCXIxMyxyMTMKKwltb3YJcmF4LHIxMgorCWFkYwlyOCxyOAorCWFkYwlyOSxyOQorCW1vdglyYnAscjEzCisJYWRjCXIxMSwwCisKKwl4b3IJcjEwLHIxMAorCXNiYglyMTIsLTEKKwltb3YJcmN4LHI4CisJc2JiCXIxMyxyMTQKKwlzYmIJcjgsMAorCW1vdglyMTAscjkKKwlzYmIJcjkscjE1CisJc2JiCXIxMSwwCisKKwljbW92YwlyMTIscmF4CisJY21vdmMJcjEzLHJicAorCW1vdglRV09SRFtyZGldLHIxMgorCWNtb3ZjCXI4LHJjeAorCW1vdglRV09SRFs4K3JkaV0scjEzCisJY21vdmMJcjkscjEwCisJbW92CVFXT1JEWzE2K3JkaV0scjgKKwltb3YJUVdPUkRbMjQrcmRpXSxyOQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworQUxJR04JMzIKK2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGV4OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZXg6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCisKKworJEwkcG9pbnRfZG91YmxleDoKKwlwdXNoCXJicAorCisJcHVzaAlyYngKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKwlzdWIJcnNwLDMyKjUrOAorCiskTCRwb2ludF9kb3VibGV4X2JvZHk6CisKKyRMJHBvaW50X2RvdWJsZV9zaG9ydGN1dHg6CisJbW92ZHF1CXhtbTAsWE1NV09SRFtyc2ldCisJbW92CXJieCxyc2kKKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3JzaV0KKwltb3YJcjEyLFFXT1JEWygoMzIrMCkpK3JzaV0KKwltb3YJcjEzLFFXT1JEWygoMzIrOCkpK3JzaV0KKwltb3YJcjgsUVdPUkRbKCgzMisxNikpK3JzaV0KKwltb3YJcjksUVdPUkRbKCgzMisyNCkpK3JzaV0KKwltb3YJcjE0LFFXT1JEWygoJEwkcG9seSs4KSldCisJbW92CXIxNSxRV09SRFsoKCRMJHBvbHkrMjQpKV0KKwltb3ZkcWEJWE1NV09SRFs5Nityc3BdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsoOTYrMTYpK3JzcF0seG1tMQorCWxlYQlyMTAsWzMyK3JkaV0KKwlsZWEJcjExLFs2NCtyZGldCitEQgkxMDIsNzIsMTUsMTEwLDE5OQorREIJMTAyLDczLDE1LDExMCwyMDIKK0RCCTEwMiw3MywxNSwxMTAsMjExCisKKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfYnlfMngKKworCW1vdglyZHgsUVdPUkRbKCg2NCswKSkrcnNpXQorCW1vdglyMTQsUVdPUkRbKCg2NCs4KSkrcnNpXQorCW1vdglyMTUsUVdPUkRbKCg2NCsxNikpK3JzaV0KKwltb3YJcjgsUVdPUkRbKCg2NCsyNCkpK3JzaV0KKwlsZWEJcnNpLFsoKDY0LTEyOCkpK3JzaV0KKwlsZWEJcmRpLFs2NCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCW1vdglyZHgsUVdPUkRbKCgwKzApKStyc3BdCisJbW92CXIxNCxRV09SRFsoKDgrMCkpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMCkpK3JzcF0KKwltb3YJcjE1LFFXT1JEWygoMTYrMCkpK3JzcF0KKwltb3YJcjgsUVdPUkRbKCgyNCswKSkrcnNwXQorCWxlYQlyZGksW3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eAorCisJbW92CXJkeCxRV09SRFszMityYnhdCisJbW92CXI5LFFXT1JEWygoNjQrMCkpK3JieF0KKwltb3YJcjEwLFFXT1JEWygoNjQrOCkpK3JieF0KKwltb3YJcjExLFFXT1JEWygoNjQrMTYpKStyYnhdCisJbW92CXIxMixRV09SRFsoKDY0KzI0KSkrcmJ4XQorCWxlYQlyc2ksWygoNjQtMTI4KSkrcmJ4XQorCWxlYQlyYngsWzMyK3JieF0KK0RCCTEwMiw3MiwxNSwxMjYsMjE1CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8yeAorCisJbW92CXIxMixRV09SRFsoKDk2KzApKStyc3BdCisJbW92CXIxMyxRV09SRFsoKDk2KzgpKStyc3BdCisJbGVhCXJieCxbNjQrcnNwXQorCW1vdglyOCxRV09SRFsoKDk2KzE2KSkrcnNwXQorCW1vdglyOSxRV09SRFsoKDk2KzI0KSkrcnNwXQorCWxlYQlyZGksWzMyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X2FkZF90b3gKKworCW1vdglyMTIsUVdPUkRbKCg5NiswKSkrcnNwXQorCW1vdglyMTMsUVdPUkRbKCg5Nis4KSkrcnNwXQorCWxlYQlyYngsWzY0K3JzcF0KKwltb3YJcjgsUVdPUkRbKCg5NisxNikpK3JzcF0KKwltb3YJcjksUVdPUkRbKCg5NisyNCkpK3JzcF0KKwlsZWEJcmRpLFs2NCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW1vdglyZHgsUVdPUkRbKCgwKzApKStyc3BdCisJbW92CXIxNCxRV09SRFsoKDgrMCkpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMCkpK3JzcF0KKwltb3YJcjE1LFFXT1JEWygoMTYrMCkpK3JzcF0KKwltb3YJcjgsUVdPUkRbKCgyNCswKSkrcnNwXQorREIJMTAyLDcyLDE1LDEyNiwyMDcKKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eAorCXhvcglyOSxyOQorCW1vdglyYXgscjEyCisJYWRkCXIxMiwtMQorCW1vdglyMTAscjEzCisJYWRjCXIxMyxyc2kKKwltb3YJcmN4LHIxNAorCWFkYwlyMTQsMAorCW1vdglyOCxyMTUKKwlhZGMJcjE1LHJicAorCWFkYwlyOSwwCisJeG9yCXJzaSxyc2kKKwl0ZXN0CXJheCwxCisKKwljbW92eglyMTIscmF4CisJY21vdnoJcjEzLHIxMAorCWNtb3Z6CXIxNCxyY3gKKwljbW92eglyMTUscjgKKwljbW92eglyOSxyc2kKKworCW1vdglyYXgscjEzCisJc2hyCXIxMiwxCisJc2hsCXJheCw2MworCW1vdglyMTAscjE0CisJc2hyCXIxMywxCisJb3IJcjEyLHJheAorCXNobAlyMTAsNjMKKwltb3YJcmN4LHIxNQorCXNocglyMTQsMQorCW9yCXIxMyxyMTAKKwlzaGwJcmN4LDYzCisJbW92CVFXT1JEW3JkaV0scjEyCisJc2hyCXIxNSwxCisJbW92CVFXT1JEWzgrcmRpXSxyMTMKKwlzaGwJcjksNjMKKwlvcglyMTQscmN4CisJb3IJcjE1LHI5CisJbW92CVFXT1JEWzE2K3JkaV0scjE0CisJbW92CVFXT1JEWzI0K3JkaV0scjE1CisJbW92CXJkeCxRV09SRFs2NCtyc3BdCisJbGVhCXJieCxbNjQrcnNwXQorCW1vdglyOSxRV09SRFsoKDArMzIpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDgrMzIpKStyc3BdCisJbGVhCXJzaSxbKCgtMTI4KzMyKSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNiszMikpK3JzcF0KKwltb3YJcjEyLFFXT1JEWygoMjQrMzIpKStyc3BdCisJbGVhCXJkaSxbMzIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwlsZWEJcmRpLFsxMjgrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX2J5XzJ4CisKKwlsZWEJcmJ4LFszMityc3BdCisJbGVhCXJkaSxbMzIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfYWRkX3RveAorCisJbW92CXJkeCxRV09SRFs5Nityc3BdCisJbGVhCXJieCxbOTYrcnNwXQorCW1vdglyOSxRV09SRFsoKDArMCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCswKSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCswKSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNiswKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCswKSkrcnNwXQorCWxlYQlyZGksW3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbGVhCXJkaSxbMTI4K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9ieV8yeAorCisJbW92CXJkeCxRV09SRFsoKDArMzIpKStyc3BdCisJbW92CXIxNCxRV09SRFsoKDgrMzIpKStyc3BdCisJbGVhCXJzaSxbKCgtMTI4KzMyKSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgxNiszMikpK3JzcF0KKwltb3YJcjgsUVdPUkRbKCgyNCszMikpK3JzcF0KK0RCCTEwMiw3MiwxNSwxMjYsMTk5CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCWxlYQlyYngsWzEyOCtyc3BdCisJbW92CXI4LHIxNAorCW1vdglyOSxyMTUKKwltb3YJcjE0LHJzaQorCW1vdglyMTUscmJwCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW1vdglyYXgsUVdPUkRbKCgwKzApKStyc3BdCisJbW92CXJicCxRV09SRFsoKDArOCkpK3JzcF0KKwltb3YJcmN4LFFXT1JEWygoMCsxNikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoMCsyNCkpK3JzcF0KKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwltb3YJcmR4LFFXT1JEWzMyK3JzcF0KKwlsZWEJcmJ4LFszMityc3BdCisJbW92CXIxNCxyMTIKKwl4b3IJZWN4LGVjeAorCW1vdglRV09SRFsoKDArMCkpK3JzcF0scjEyCisJbW92CXIxMCxyMTMKKwltb3YJUVdPUkRbKCgwKzgpKStyc3BdLHIxMworCWNtb3Z6CXIxMSxyOAorCW1vdglRV09SRFsoKDArMTYpKStyc3BdLHI4CisJbGVhCXJzaSxbKCgwLTEyOCkpK3JzcF0KKwljbW92eglyMTIscjkKKwltb3YJUVdPUkRbKCgwKzI0KSkrcnNwXSxyOQorCW1vdglyOSxyMTQKKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworREIJMTAyLDcyLDE1LDEyNiwyMDMKK0RCCTEwMiw3MiwxNSwxMjYsMjA3CisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCWxlYQlyc2ksWygoMTYwKzU2KSkrcnNwXQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJHBvaW50X2RvdWJsZXhfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZXg6CisKK0FMSUdOCTMyCitlY3BfbmlzdHoyNTZfcG9pbnRfYWRkeDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGR4OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworCiskTCRwb2ludF9hZGR4OgorCXB1c2gJcmJwCisKKwlwdXNoCXJieAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXN1Yglyc3AsMzIqMTgrOAorCiskTCRwb2ludF9hZGR4X2JvZHk6CisKKwltb3ZkcXUJeG1tMCxYTU1XT1JEW3JzaV0KKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3JzaV0KKwltb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3JzaV0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzQ4K3JzaV0KKwltb3ZkcXUJeG1tNCxYTU1XT1JEWzY0K3JzaV0KKwltb3ZkcXUJeG1tNSxYTU1XT1JEWzgwK3JzaV0KKwltb3YJcmJ4LHJzaQorCW1vdglyc2kscmR4CisJbW92ZHFhCVhNTVdPUkRbMzg0K3JzcF0seG1tMAorCW1vdmRxYQlYTU1XT1JEWygzODQrMTYpK3JzcF0seG1tMQorCW1vdmRxYQlYTU1XT1JEWzQxNityc3BdLHhtbTIKKwltb3ZkcWEJWE1NV09SRFsoNDE2KzE2KStyc3BdLHhtbTMKKwltb3ZkcWEJWE1NV09SRFs0NDgrcnNwXSx4bW00CisJbW92ZHFhCVhNTVdPUkRbKDQ0OCsxNikrcnNwXSx4bW01CisJcG9yCXhtbTUseG1tNAorCisJbW92ZHF1CXhtbTAsWE1NV09SRFtyc2ldCisJcHNodWZkCXhtbTMseG1tNSwweGIxCisJbW92ZHF1CXhtbTEsWE1NV09SRFsxNityc2ldCisJbW92ZHF1CXhtbTIsWE1NV09SRFszMityc2ldCisJcG9yCXhtbTUseG1tMworCW1vdmRxdQl4bW0zLFhNTVdPUkRbNDgrcnNpXQorCW1vdglyZHgsUVdPUkRbKCg2NCswKSkrcnNpXQorCW1vdglyMTQsUVdPUkRbKCg2NCs4KSkrcnNpXQorCW1vdglyMTUsUVdPUkRbKCg2NCsxNikpK3JzaV0KKwltb3YJcjgsUVdPUkRbKCg2NCsyNCkpK3JzaV0KKwltb3ZkcWEJWE1NV09SRFs0ODArcnNwXSx4bW0wCisJcHNodWZkCXhtbTQseG1tNSwweDFlCisJbW92ZHFhCVhNTVdPUkRbKDQ4MCsxNikrcnNwXSx4bW0xCisJbW92ZHF1CXhtbTAsWE1NV09SRFs2NCtyc2ldCisJbW92ZHF1CXhtbTEsWE1NV09SRFs4MCtyc2ldCisJbW92ZHFhCVhNTVdPUkRbNTEyK3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWyg1MTIrMTYpK3JzcF0seG1tMworCXBvcgl4bW01LHhtbTQKKwlweG9yCXhtbTQseG1tNAorCXBvcgl4bW0xLHhtbTAKK0RCCTEwMiw3MiwxNSwxMTAsMTk5CisKKwlsZWEJcnNpLFsoKDY0LTEyOCkpK3JzaV0KKwltb3YJUVdPUkRbKCg1NDQrMCkpK3JzcF0scmR4CisJbW92CVFXT1JEWygoNTQ0KzgpKStyc3BdLHIxNAorCW1vdglRV09SRFsoKDU0NCsxNikpK3JzcF0scjE1CisJbW92CVFXT1JEWygoNTQ0KzI0KSkrcnNwXSxyOAorCWxlYQlyZGksWzk2K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eAorCisJcGNtcGVxZAl4bW01LHhtbTQKKwlwc2h1ZmQJeG1tNCx4bW0xLDB4YjEKKwlwb3IJeG1tNCx4bW0xCisJcHNodWZkCXhtbTUseG1tNSwwCisJcHNodWZkCXhtbTMseG1tNCwweDFlCisJcG9yCXhtbTQseG1tMworCXB4b3IJeG1tMyx4bW0zCisJcGNtcGVxZAl4bW00LHhtbTMKKwlwc2h1ZmQJeG1tNCx4bW00LDAKKwltb3YJcmR4LFFXT1JEWygoNjQrMCkpK3JieF0KKwltb3YJcjE0LFFXT1JEWygoNjQrOCkpK3JieF0KKwltb3YJcjE1LFFXT1JEWygoNjQrMTYpKStyYnhdCisJbW92CXI4LFFXT1JEWygoNjQrMjQpKStyYnhdCitEQgkxMDIsNzIsMTUsMTEwLDIwMworCisJbGVhCXJzaSxbKCg2NC0xMjgpKStyYnhdCisJbGVhCXJkaSxbMzIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzU0NCtyc3BdCisJbGVhCXJieCxbNTQ0K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzk2KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4Kzk2KSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCs5NikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrOTYpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0Kzk2KSkrcnNwXQorCWxlYQlyZGksWzIyNCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdglyZHgsUVdPUkRbNDQ4K3JzcF0KKwlsZWEJcmJ4LFs0NDgrcnNwXQorCW1vdglyOSxRV09SRFsoKDArMzIpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDgrMzIpKStyc3BdCisJbGVhCXJzaSxbKCgtMTI4KzMyKSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNiszMikpK3JzcF0KKwltb3YJcjEyLFFXT1JEWygoMjQrMzIpKStyc3BdCisJbGVhCXJkaSxbMjU2K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92CXJkeCxRV09SRFs0MTYrcnNwXQorCWxlYQlyYngsWzQxNityc3BdCisJbW92CXI5LFFXT1JEWygoMCsyMjQpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDgrMjI0KSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCsyMjQpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzIyNCkpK3JzcF0KKwltb3YJcjEyLFFXT1JEWygoMjQrMjI0KSkrcnNwXQorCWxlYQlyZGksWzIyNCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdglyZHgsUVdPUkRbNTEyK3JzcF0KKwlsZWEJcmJ4LFs1MTIrcnNwXQorCW1vdglyOSxRV09SRFsoKDArMjU2KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzI1NikpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMjU2KSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNisyNTYpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzI1NikpK3JzcF0KKwlsZWEJcmRpLFsyNTYrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwlsZWEJcmJ4LFsyMjQrcnNwXQorCWxlYQlyZGksWzY0K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCisJb3IJcjEyLHIxMworCW1vdmRxYQl4bW0yLHhtbTQKKwlvcglyMTIscjgKKwlvcglyMTIscjkKKwlwb3IJeG1tMix4bW01CitEQgkxMDIsNzMsMTUsMTEwLDIyMAorCisJbW92CXJkeCxRV09SRFszODQrcnNwXQorCWxlYQlyYngsWzM4NCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCs5NikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCs5NikpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrOTYpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2Kzk2KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCs5NikpK3JzcF0KKwlsZWEJcmRpLFsxNjArcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzQ4MCtyc3BdCisJbGVhCXJieCxbNDgwK3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzMyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzMyKSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCszMikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzMyKSkrcnNwXQorCWxlYQlyZGksWzE5Mityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYQlyYngsWzE2MCtyc3BdCisJbGVhCXJkaSxbcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKwlvcglyMTIscjEzCisJb3IJcjEyLHI4CisJb3IJcjEyLHI5CisKK0RCCTB4M2UKKwlqbnoJTkVBUiAkTCRhZGRfcHJvY2VlZHgKK0RCCTEwMiw3MywxNSwxMjYsMjA4CitEQgkxMDIsNzMsMTUsMTI2LDIxNworCXRlc3QJcjgscjgKKwlqbnoJTkVBUiAkTCRhZGRfcHJvY2VlZHgKKwl0ZXN0CXI5LHI5CisJanoJTkVBUiAkTCRhZGRfZG91YmxleAorCitEQgkxMDIsNzIsMTUsMTI2LDE5OQorCXB4b3IJeG1tMCx4bW0wCisJbW92ZHF1CVhNTVdPUkRbcmRpXSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbMTYrcmRpXSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbMzIrcmRpXSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbNDgrcmRpXSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbNjQrcmRpXSx4bW0wCisJbW92ZHF1CVhNTVdPUkRbODArcmRpXSx4bW0wCisJam1wCU5FQVIgJEwkYWRkX2RvbmV4CisKK0FMSUdOCTMyCiskTCRhZGRfZG91YmxleDoKK0RCCTEwMiw3MiwxNSwxMjYsMjA2CitEQgkxMDIsNzIsMTUsMTI2LDE5OQorCWFkZAlyc3AsNDE2CisJam1wCU5FQVIgJEwkcG9pbnRfZG91YmxlX3Nob3J0Y3V0eAorCitBTElHTgkzMgorJEwkYWRkX3Byb2NlZWR4OgorCW1vdglyZHgsUVdPUkRbKCgwKzY0KSkrcnNwXQorCW1vdglyMTQsUVdPUkRbKCg4KzY0KSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCs2NCkpK3JzcF0KKwltb3YJcjE1LFFXT1JEWygoMTYrNjQpKStyc3BdCisJbW92CXI4LFFXT1JEWygoMjQrNjQpKStyc3BdCisJbGVhCXJkaSxbOTYrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzQ0OCtyc3BdCisJbGVhCXJieCxbNDQ4K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzApKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDgrMCkpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMCkpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMCkpK3JzcF0KKwltb3YJcjEyLFFXT1JEWygoMjQrMCkpK3JzcF0KKwlsZWEJcmRpLFszNTIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWygoMCswKSkrcnNwXQorCW1vdglyMTQsUVdPUkRbKCg4KzApKStyc3BdCisJbGVhCXJzaSxbKCgtMTI4KzApKStyc3BdCisJbW92CXIxNSxRV09SRFsoKDE2KzApKStyc3BdCisJbW92CXI4LFFXT1JEWygoMjQrMCkpK3JzcF0KKwlsZWEJcmRpLFszMityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCW1vdglyZHgsUVdPUkRbNTQ0K3JzcF0KKwlsZWEJcmJ4LFs1NDQrcnNwXQorCW1vdglyOSxRV09SRFsoKDArMzUyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzM1MikpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMzUyKSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNiszNTIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzM1MikpK3JzcF0KKwlsZWEJcmRpLFszNTIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3YJcmR4LFFXT1JEW3JzcF0KKwlsZWEJcmJ4LFtyc3BdCisJbW92CXI5LFFXT1JEWygoMCszMikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCszMikpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMzIpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzMyKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCszMikpK3JzcF0KKwlsZWEJcmRpLFsxMjgrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzE2MCtyc3BdCisJbGVhCXJieCxbMTYwK3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzMyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzMyKSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCszMikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzMyKSkrcnNwXQorCWxlYQlyZGksWzE5Mityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCisKKworCXhvcglyMTEscjExCisJYWRkCXIxMixyMTIKKwlsZWEJcnNpLFs5Nityc3BdCisJYWRjCXIxMyxyMTMKKwltb3YJcmF4LHIxMgorCWFkYwlyOCxyOAorCWFkYwlyOSxyOQorCW1vdglyYnAscjEzCisJYWRjCXIxMSwwCisKKwlzdWIJcjEyLC0xCisJbW92CXJjeCxyOAorCXNiYglyMTMscjE0CisJc2JiCXI4LDAKKwltb3YJcjEwLHI5CisJc2JiCXI5LHIxNQorCXNiYglyMTEsMAorCisJY21vdmMJcjEyLHJheAorCW1vdglyYXgsUVdPUkRbcnNpXQorCWNtb3ZjCXIxMyxyYnAKKwltb3YJcmJwLFFXT1JEWzgrcnNpXQorCWNtb3ZjCXI4LHJjeAorCW1vdglyY3gsUVdPUkRbMTYrcnNpXQorCWNtb3ZjCXI5LHIxMAorCW1vdglyMTAsUVdPUkRbMjQrcnNpXQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwlsZWEJcmJ4LFsxMjgrcnNwXQorCWxlYQlyZGksWzI4OCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW1vdglyYXgsUVdPUkRbKCgxOTIrMCkpK3JzcF0KKwltb3YJcmJwLFFXT1JEWygoMTkyKzgpKStyc3BdCisJbW92CXJjeCxRV09SRFsoKDE5MisxNikpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoMTkyKzI0KSkrcnNwXQorCWxlYQlyZGksWzMyMCtyc3BdCisKKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1YngKKworCW1vdglRV09SRFtyZGldLHIxMgorCW1vdglRV09SRFs4K3JkaV0scjEzCisJbW92CVFXT1JEWzE2K3JkaV0scjgKKwltb3YJUVdPUkRbMjQrcmRpXSxyOQorCW1vdglyZHgsUVdPUkRbMTI4K3JzcF0KKwlsZWEJcmJ4LFsxMjgrcnNwXQorCW1vdglyOSxRV09SRFsoKDArMjI0KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzIyNCkpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMjI0KSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNisyMjQpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzIyNCkpK3JzcF0KKwlsZWEJcmRpLFsyNTYrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzMyMCtyc3BdCisJbGVhCXJieCxbMzIwK3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzY0KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzY0KSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCs2NCkpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrNjQpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzY0KSkrcnNwXQorCWxlYQlyZGksWzMyMCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYQlyYngsWzI1Nityc3BdCisJbGVhCXJkaSxbMzIwK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3N1Yl9mcm9teAorCitEQgkxMDIsNzIsMTUsMTI2LDE5OQorCisJbW92ZHFhCXhtbTAseG1tNQorCW1vdmRxYQl4bW0xLHhtbTUKKwlwYW5kbgl4bW0wLFhNTVdPUkRbMzUyK3JzcF0KKwltb3ZkcWEJeG1tMix4bW01CisJcGFuZG4JeG1tMSxYTU1XT1JEWygoMzUyKzE2KSkrcnNwXQorCW1vdmRxYQl4bW0zLHhtbTUKKwlwYW5kCXhtbTIsWE1NV09SRFs1NDQrcnNwXQorCXBhbmQJeG1tMyxYTU1XT1JEWygoNTQ0KzE2KSkrcnNwXQorCXBvcgl4bW0yLHhtbTAKKwlwb3IJeG1tMyx4bW0xCisKKwltb3ZkcWEJeG1tMCx4bW00CisJbW92ZHFhCXhtbTEseG1tNAorCXBhbmRuCXhtbTAseG1tMgorCW1vdmRxYQl4bW0yLHhtbTQKKwlwYW5kbgl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CisJcGFuZAl4bW0yLFhNTVdPUkRbNDQ4K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDQ0OCsxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCW1vdmRxdQlYTU1XT1JEWzY0K3JkaV0seG1tMgorCW1vdmRxdQlYTU1XT1JEWzgwK3JkaV0seG1tMworCisJbW92ZHFhCXhtbTAseG1tNQorCW1vdmRxYQl4bW0xLHhtbTUKKwlwYW5kbgl4bW0wLFhNTVdPUkRbMjg4K3JzcF0KKwltb3ZkcWEJeG1tMix4bW01CisJcGFuZG4JeG1tMSxYTU1XT1JEWygoMjg4KzE2KSkrcnNwXQorCW1vdmRxYQl4bW0zLHhtbTUKKwlwYW5kCXhtbTIsWE1NV09SRFs0ODArcnNwXQorCXBhbmQJeG1tMyxYTU1XT1JEWygoNDgwKzE2KSkrcnNwXQorCXBvcgl4bW0yLHhtbTAKKwlwb3IJeG1tMyx4bW0xCisKKwltb3ZkcWEJeG1tMCx4bW00CisJbW92ZHFhCXhtbTEseG1tNAorCXBhbmRuCXhtbTAseG1tMgorCW1vdmRxYQl4bW0yLHhtbTQKKwlwYW5kbgl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CisJcGFuZAl4bW0yLFhNTVdPUkRbMzg0K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDM4NCsxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCW1vdmRxdQlYTU1XT1JEW3JkaV0seG1tMgorCW1vdmRxdQlYTU1XT1JEWzE2K3JkaV0seG1tMworCisJbW92ZHFhCXhtbTAseG1tNQorCW1vdmRxYQl4bW0xLHhtbTUKKwlwYW5kbgl4bW0wLFhNTVdPUkRbMzIwK3JzcF0KKwltb3ZkcWEJeG1tMix4bW01CisJcGFuZG4JeG1tMSxYTU1XT1JEWygoMzIwKzE2KSkrcnNwXQorCW1vdmRxYQl4bW0zLHhtbTUKKwlwYW5kCXhtbTIsWE1NV09SRFs1MTIrcnNwXQorCXBhbmQJeG1tMyxYTU1XT1JEWygoNTEyKzE2KSkrcnNwXQorCXBvcgl4bW0yLHhtbTAKKwlwb3IJeG1tMyx4bW0xCisKKwltb3ZkcWEJeG1tMCx4bW00CisJbW92ZHFhCXhtbTEseG1tNAorCXBhbmRuCXhtbTAseG1tMgorCW1vdmRxYQl4bW0yLHhtbTQKKwlwYW5kbgl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CisJcGFuZAl4bW0yLFhNTVdPUkRbNDE2K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDQxNisxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCW1vdmRxdQlYTU1XT1JEWzMyK3JkaV0seG1tMgorCW1vdmRxdQlYTU1XT1JEWzQ4K3JkaV0seG1tMworCiskTCRhZGRfZG9uZXg6CisJbGVhCXJzaSxbKCg1NzYrNTYpKStyc3BdCisKKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcnNpXQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JzaV0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyc2ldCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC0xNikpK3JzaV0KKworCW1vdglyYnAsUVdPUkRbKCgtOCkpK3JzaV0KKworCWxlYQlyc3AsW3JzaV0KKworJEwkcG9pbnRfYWRkeF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfcG9pbnRfYWRkeDoKKworQUxJR04JMzIKK2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5leDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5leDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworJEwkcG9pbnRfYWRkX2FmZmluZXg6CisJcHVzaAlyYnAKKworCXB1c2gJcmJ4CisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJc3ViCXJzcCwzMioxNSs4CisKKyRMJGFkZF9hZmZpbmV4X2JvZHk6CisKKwltb3ZkcXUJeG1tMCxYTU1XT1JEW3JzaV0KKwltb3YJcmJ4LHJkeAorCW1vdmRxdQl4bW0xLFhNTVdPUkRbMTYrcnNpXQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcnNpXQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbNDgrcnNpXQorCW1vdmRxdQl4bW00LFhNTVdPUkRbNjQrcnNpXQorCW1vdmRxdQl4bW01LFhNTVdPUkRbODArcnNpXQorCW1vdglyZHgsUVdPUkRbKCg2NCswKSkrcnNpXQorCW1vdglyMTQsUVdPUkRbKCg2NCs4KSkrcnNpXQorCW1vdglyMTUsUVdPUkRbKCg2NCsxNikpK3JzaV0KKwltb3YJcjgsUVdPUkRbKCg2NCsyNCkpK3JzaV0KKwltb3ZkcWEJWE1NV09SRFszMjArcnNwXSx4bW0wCisJbW92ZHFhCVhNTVdPUkRbKDMyMCsxNikrcnNwXSx4bW0xCisJbW92ZHFhCVhNTVdPUkRbMzUyK3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWygzNTIrMTYpK3JzcF0seG1tMworCW1vdmRxYQlYTU1XT1JEWzM4NCtyc3BdLHhtbTQKKwltb3ZkcWEJWE1NV09SRFsoMzg0KzE2KStyc3BdLHhtbTUKKwlwb3IJeG1tNSx4bW00CisKKwltb3ZkcXUJeG1tMCxYTU1XT1JEW3JieF0KKwlwc2h1ZmQJeG1tMyx4bW01LDB4YjEKKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3JieF0KKwltb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3JieF0KKwlwb3IJeG1tNSx4bW0zCisJbW92ZHF1CXhtbTMsWE1NV09SRFs0OCtyYnhdCisJbW92ZHFhCVhNTVdPUkRbNDE2K3JzcF0seG1tMAorCXBzaHVmZAl4bW00LHhtbTUsMHgxZQorCW1vdmRxYQlYTU1XT1JEWyg0MTYrMTYpK3JzcF0seG1tMQorCXBvcgl4bW0xLHhtbTAKK0RCCTEwMiw3MiwxNSwxMTAsMTk5CisJbW92ZHFhCVhNTVdPUkRbNDQ4K3JzcF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWyg0NDgrMTYpK3JzcF0seG1tMworCXBvcgl4bW0zLHhtbTIKKwlwb3IJeG1tNSx4bW00CisJcHhvcgl4bW00LHhtbTQKKwlwb3IJeG1tMyx4bW0xCisKKwlsZWEJcnNpLFsoKDY0LTEyOCkpK3JzaV0KKwlsZWEJcmRpLFszMityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zcXJfbW9udHgKKworCXBjbXBlcWQJeG1tNSx4bW00CisJcHNodWZkCXhtbTQseG1tMywweGIxCisJbW92CXJkeCxRV09SRFtyYnhdCisKKwltb3YJcjkscjEyCisJcG9yCXhtbTQseG1tMworCXBzaHVmZAl4bW01LHhtbTUsMAorCXBzaHVmZAl4bW0zLHhtbTQsMHgxZQorCW1vdglyMTAscjEzCisJcG9yCXhtbTQseG1tMworCXB4b3IJeG1tMyx4bW0zCisJbW92CXIxMSxyMTQKKwlwY21wZXFkCXhtbTQseG1tMworCXBzaHVmZAl4bW00LHhtbTQsMAorCisJbGVhCXJzaSxbKCgzMi0xMjgpKStyc3BdCisJbW92CXIxMixyMTUKKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYQlyYngsWzMyMCtyc3BdCisJbGVhCXJkaSxbNjQrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKwltb3YJcmR4LFFXT1JEWzM4NCtyc3BdCisJbGVhCXJieCxbMzg0K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzMyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzMyKSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCszMikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzMyKSkrcnNwXQorCWxlYQlyZGksWzMyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbW92CXJkeCxRV09SRFszODQrcnNwXQorCWxlYQlyYngsWzM4NCtyc3BdCisJbW92CXI5LFFXT1JEWygoMCs2NCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCs2NCkpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrNjQpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzY0KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCs2NCkpK3JzcF0KKwlsZWEJcmRpLFsyODgrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzQ0OCtyc3BdCisJbGVhCXJieCxbNDQ4K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzMyKSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzMyKSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCszMikpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMzIpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzMyKSkrcnNwXQorCWxlYQlyZGksWzMyK3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X211bF9tb250eAorCisJbGVhCXJieCxbMzUyK3JzcF0KKwlsZWEJcmRpLFs5Nityc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJfZnJvbXgKKworCW1vdglyZHgsUVdPUkRbKCgwKzY0KSkrcnNwXQorCW1vdglyMTQsUVdPUkRbKCg4KzY0KSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCs2NCkpK3JzcF0KKwltb3YJcjE1LFFXT1JEWygoMTYrNjQpKStyc3BdCisJbW92CXI4LFFXT1JEWygoMjQrNjQpKStyc3BdCisJbGVhCXJkaSxbMTI4K3JzcF0KKwljYWxsCV9fZWNwX25pc3R6MjU2X3Nxcl9tb250eAorCisJbW92CXJkeCxRV09SRFsoKDArOTYpKStyc3BdCisJbW92CXIxNCxRV09SRFsoKDgrOTYpKStyc3BdCisJbGVhCXJzaSxbKCgtMTI4Kzk2KSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgxNis5NikpK3JzcF0KKwltb3YJcjgsUVdPUkRbKCgyNCs5NikpK3JzcF0KKwlsZWEJcmRpLFsxOTIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3FyX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzEyOCtyc3BdCisJbGVhCXJieCxbMTI4K3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzY0KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzY0KSkrcnNwXQorCWxlYQlyc2ksWygoLTEyOCs2NCkpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrNjQpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzY0KSkrcnNwXQorCWxlYQlyZGksWzE2MCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCW1vdglyZHgsUVdPUkRbMzIwK3JzcF0KKwlsZWEJcmJ4LFszMjArcnNwXQorCW1vdglyOSxRV09SRFsoKDArMTI4KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbKCg4KzEyOCkpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrMTI4KSkrcnNwXQorCW1vdglyMTEsUVdPUkRbKCgxNisxMjgpKStyc3BdCisJbW92CXIxMixRV09SRFsoKDI0KzEyOCkpK3JzcF0KKwlsZWEJcmRpLFtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCisKKworCXhvcglyMTEscjExCisJYWRkCXIxMixyMTIKKwlsZWEJcnNpLFsxOTIrcnNwXQorCWFkYwlyMTMscjEzCisJbW92CXJheCxyMTIKKwlhZGMJcjgscjgKKwlhZGMJcjkscjkKKwltb3YJcmJwLHIxMworCWFkYwlyMTEsMAorCisJc3ViCXIxMiwtMQorCW1vdglyY3gscjgKKwlzYmIJcjEzLHIxNAorCXNiYglyOCwwCisJbW92CXIxMCxyOQorCXNiYglyOSxyMTUKKwlzYmIJcjExLDAKKworCWNtb3ZjCXIxMixyYXgKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwljbW92YwlyMTMscmJwCisJbW92CXJicCxRV09SRFs4K3JzaV0KKwljbW92YwlyOCxyY3gKKwltb3YJcmN4LFFXT1JEWzE2K3JzaV0KKwljbW92YwlyOSxyMTAKKwltb3YJcjEwLFFXT1JEWzI0K3JzaV0KKworCWNhbGwJX19lY3BfbmlzdHoyNTZfc3VieAorCisJbGVhCXJieCxbMTYwK3JzcF0KKwlsZWEJcmRpLFsyMjQrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKKwltb3YJcmF4LFFXT1JEWygoMCswKSkrcnNwXQorCW1vdglyYnAsUVdPUkRbKCgwKzgpKStyc3BdCisJbW92CXJjeCxRV09SRFsoKDArMTYpKStyc3BdCisJbW92CXIxMCxRV09SRFsoKDArMjQpKStyc3BdCisJbGVhCXJkaSxbNjQrcnNwXQorCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9zdWJ4CisKKwltb3YJUVdPUkRbcmRpXSxyMTIKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCW1vdglRV09SRFsxNityZGldLHI4CisJbW92CVFXT1JEWzI0K3JkaV0scjkKKwltb3YJcmR4LFFXT1JEWzM1Mityc3BdCisJbGVhCXJieCxbMzUyK3JzcF0KKwltb3YJcjksUVdPUkRbKCgwKzE2MCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCsxNjApKStyc3BdCisJbGVhCXJzaSxbKCgtMTI4KzE2MCkpK3JzcF0KKwltb3YJcjExLFFXT1JEWygoMTYrMTYwKSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCsxNjApKStyc3BdCisJbGVhCXJkaSxbMzIrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfbXVsX21vbnR4CisKKwltb3YJcmR4LFFXT1JEWzk2K3JzcF0KKwlsZWEJcmJ4LFs5Nityc3BdCisJbW92CXI5LFFXT1JEWygoMCs2NCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoOCs2NCkpK3JzcF0KKwlsZWEJcnNpLFsoKC0xMjgrNjQpKStyc3BdCisJbW92CXIxMSxRV09SRFsoKDE2KzY0KSkrcnNwXQorCW1vdglyMTIsUVdPUkRbKCgyNCs2NCkpK3JzcF0KKwlsZWEJcmRpLFs2NCtyc3BdCisJY2FsbAlfX2VjcF9uaXN0ejI1Nl9tdWxfbW9udHgKKworCWxlYQlyYngsWzMyK3JzcF0KKwlsZWEJcmRpLFsyNTYrcnNwXQorCWNhbGwJX19lY3BfbmlzdHoyNTZfc3ViX2Zyb214CisKK0RCCTEwMiw3MiwxNSwxMjYsMTk5CisKKwltb3ZkcWEJeG1tMCx4bW01CisJbW92ZHFhCXhtbTEseG1tNQorCXBhbmRuCXhtbTAsWE1NV09SRFsyODgrcnNwXQorCW1vdmRxYQl4bW0yLHhtbTUKKwlwYW5kbgl4bW0xLFhNTVdPUkRbKCgyODgrMTYpKStyc3BdCisJbW92ZHFhCXhtbTMseG1tNQorCXBhbmQJeG1tMixYTU1XT1JEWyRMJE9ORV9tb250XQorCXBhbmQJeG1tMyxYTU1XT1JEWygoJEwkT05FX21vbnQrMTYpKV0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzM4NCtyc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgzODQrMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFs2NCtyZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFs4MCtyZGldLHhtbTMKKworCW1vdmRxYQl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW01CisJcGFuZG4JeG1tMCxYTU1XT1JEWzIyNCtyc3BdCisJbW92ZHFhCXhtbTIseG1tNQorCXBhbmRuCXhtbTEsWE1NV09SRFsoKDIyNCsxNikpK3JzcF0KKwltb3ZkcWEJeG1tMyx4bW01CisJcGFuZAl4bW0yLFhNTVdPUkRbNDE2K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDQxNisxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzMyMCtyc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgzMjArMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFtyZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFsxNityZGldLHhtbTMKKworCW1vdmRxYQl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMSx4bW01CisJcGFuZG4JeG1tMCxYTU1XT1JEWzI1Nityc3BdCisJbW92ZHFhCXhtbTIseG1tNQorCXBhbmRuCXhtbTEsWE1NV09SRFsoKDI1NisxNikpK3JzcF0KKwltb3ZkcWEJeG1tMyx4bW01CisJcGFuZAl4bW0yLFhNTVdPUkRbNDQ4K3JzcF0KKwlwYW5kCXhtbTMsWE1NV09SRFsoKDQ0OCsxNikpK3JzcF0KKwlwb3IJeG1tMix4bW0wCisJcG9yCXhtbTMseG1tMQorCisJbW92ZHFhCXhtbTAseG1tNAorCW1vdmRxYQl4bW0xLHhtbTQKKwlwYW5kbgl4bW0wLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisJcGFuZG4JeG1tMSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzM1Mityc3BdCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgzNTIrMTYpKStyc3BdCisJcG9yCXhtbTIseG1tMAorCXBvcgl4bW0zLHhtbTEKKwltb3ZkcXUJWE1NV09SRFszMityZGldLHhtbTIKKwltb3ZkcXUJWE1NV09SRFs0OCtyZGldLHhtbTMKKworCWxlYQlyc2ksWygoNDgwKzU2KSkrcnNwXQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJGFkZF9hZmZpbmV4X2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5leDoKK0VYVEVSTglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisKKworQUxJR04JMTYKK3Nob3J0X2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTIwK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbW92CXJzaSxRV09SRFs4K3I5XQorCW1vdglyMTEsUVdPUkRbNTYrcjldCisKKwltb3YJcjEwZCxEV09SRFtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwlsZWEJcmF4LFsxNityYXhdCisKKwltb3YJcjEyLFFXT1JEWygoLTgpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC0xNikpK3JheF0KKwltb3YJUVdPUkRbMjE2K3I4XSxyMTIKKwltb3YJUVdPUkRbMjI0K3I4XSxyMTMKKworCWptcAlORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisKKworQUxJR04JMTYKK2Z1bGxfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwltb3YJcnNpLFFXT1JEWzgrcjldCisJbW92CXIxMSxRV09SRFs1NityOV0KKworCW1vdglyMTBkLERXT1JEW3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbW92CXJheCxRV09SRFsxNTIrcjhdCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyMTBkLERXT1JEWzgrcjExXQorCWxlYQlyYXgsW3IxMCoxK3JheF0KKworCW1vdglyYnAsUVdPUkRbKCgtOCkpK3JheF0KKwltb3YJcmJ4LFFXT1JEWygoLTE2KSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisKKyRMJGNvbW1vbl9zZWhfdGFpbDoKKwltb3YJcmRpLFFXT1JEWzgrcmF4XQorCW1vdglyc2ksUVdPUkRbMTYrcmF4XQorCW1vdglRV09SRFsxNTIrcjhdLHJheAorCW1vdglRV09SRFsxNjgrcjhdLHJzaQorCW1vdglRV09SRFsxNzYrcjhdLHJkaQorCisJbW92CXJkaSxRV09SRFs0MCtyOV0KKwltb3YJcnNpLHI4CisJbW92CWVjeCwxNTQKKwlERAkweGE1NDhmM2ZjCisKKwltb3YJcnNpLHI5CisJeG9yCXJjeCxyY3gKKwltb3YJcmR4LFFXT1JEWzgrcnNpXQorCW1vdglyOCxRV09SRFtyc2ldCisJbW92CXI5LFFXT1JEWzE2K3JzaV0KKwltb3YJcjEwLFFXT1JEWzQwK3JzaV0KKwlsZWEJcjExLFs1Nityc2ldCisJbGVhCXIxMixbMjQrcnNpXQorCW1vdglRV09SRFszMityc3BdLHIxMAorCW1vdglRV09SRFs0MCtyc3BdLHIxMQorCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCW1vdglRV09SRFs1Nityc3BdLHJjeAorCWNhbGwJUVdPUkRbX19pbXBfUnRsVmlydHVhbFVud2luZF0KKworCW1vdgllYXgsMQorCWFkZAlyc3AsNjQKKwlwb3BmcQorCXBvcAlyMTUKKwlwb3AJcjE0CisJcG9wCXIxMworCXBvcAlyMTIKKwlwb3AJcmJwCisJcG9wCXJieAorCXBvcAlyZGkKKwlwb3AJcnNpCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworc2VjdGlvbgkucGRhdGEgcmRhdGEgYWxpZ249NAorQUxJR04JNAorCURECSRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfbmVnIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X25lZyB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfbmVnIHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfb3JkX211bF9tb250IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnQgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X29yZF9tdWxfbW9udHggd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfb3JkX211bF9tb250eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfb3JkX211bF9tb250eCB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnR4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9vcmRfc3FyX21vbnR4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfbXVsX21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfbXVsX21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X211bF9tb250IHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9zcXJfbW9udCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9zcXJfbW9udCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfc3FyX21vbnQgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X3NlbGVjdF93NSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9zZWxlY3RfdzUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X3NlbGVjdF93WCB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfc2VsZWN0X3c3IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3NlbGVjdF93NyB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfc2VsZWN0X3dYIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3RfdzUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3dYIHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NyB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9hdngyX3NlbGVjdF93NyB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfYXZ4Ml9zZWxlY3Rfd1ggd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9lY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxlIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGUgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X3BvaW50X2FkZCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X3BvaW50X2FkZCB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9iZWdpbl9lY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxleCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGV4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9wb2ludF9kb3VibGV4IHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGR4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3BvaW50X2FkZHggd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X3BvaW50X2FkZHggd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fZWNwX25pc3R6MjU2X3BvaW50X2FkZF9hZmZpbmV4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfZWNwX25pc3R6MjU2X3BvaW50X2FkZF9hZmZpbmV4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5leCB3cnQgLi5pbWFnZWJhc2UKKworc2VjdGlvbgkueGRhdGEgcmRhdGEgYWxpZ249OAorQUxJR04JOAorJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X25lZzoKK0RCCTksMCwwLDAKKwlERAlzaG9ydF9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJG5lZ19ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRuZWdfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCiskTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfb3JkX211bF9tb250OgorREIJOSwwLDAsMAorCURECWZ1bGxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRvcmRfbXVsX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJG9yZF9tdWxfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisJREQJNDgsMAorJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X29yZF9zcXJfbW9udDoKK0RCCTksMCwwLDAKKwlERAlmdWxsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkb3JkX3Nxcl9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRvcmRfc3FyX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECTQ4LDAKKyRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9vcmRfbXVsX21vbnR4OgorREIJOSwwLDAsMAorCURECWZ1bGxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRvcmRfbXVseF9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRvcmRfbXVseF9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKwlERAk0OCwwCiskTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfb3JkX3Nxcl9tb250eDoKK0RCCTksMCwwLDAKKwlERAlmdWxsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkb3JkX3NxcnhfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkb3JkX3NxcnhfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCisJREQJNDgsMAorJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X211bF9tb250OgorREIJOSwwLDAsMAorCURECWZ1bGxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRtdWxfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkbXVsX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECTQ4LDAKKyRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9zcXJfbW9udDoKK0RCCTksMCwwLDAKKwlERAlmdWxsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkc3FyX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJHNxcl9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKwlERAk0OCwwCiskTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfc2VsZWN0X3dYOgorREIJMHgwMSwweDMzLDB4MTYsMHgwMAorREIJMHgzMywweGY4LDB4MDksMHgwMAorREIJMHgyZSwweGU4LDB4MDgsMHgwMAorREIJMHgyOSwweGQ4LDB4MDcsMHgwMAorREIJMHgyNCwweGM4LDB4MDYsMHgwMAorREIJMHgxZiwweGI4LDB4MDUsMHgwMAorREIJMHgxYSwweGE4LDB4MDQsMHgwMAorREIJMHgxNSwweDk4LDB4MDMsMHgwMAorREIJMHgxMCwweDg4LDB4MDIsMHgwMAorREIJMHgwYywweDc4LDB4MDEsMHgwMAorREIJMHgwOCwweDY4LDB4MDAsMHgwMAorREIJMHgwNCwweDAxLDB4MTUsMHgwMAorQUxJR04JOAorJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X2F2eDJfc2VsZWN0X3dYOgorREIJMHgwMSwweDM2LDB4MTcsMHgwYgorREIJMHgzNiwweGY4LDB4MDksMHgwMAorREIJMHgzMSwweGU4LDB4MDgsMHgwMAorREIJMHgyYywweGQ4LDB4MDcsMHgwMAorREIJMHgyNywweGM4LDB4MDYsMHgwMAorREIJMHgyMiwweGI4LDB4MDUsMHgwMAorREIJMHgxZCwweGE4LDB4MDQsMHgwMAorREIJMHgxOCwweDk4LDB4MDMsMHgwMAorREIJMHgxMywweDg4LDB4MDIsMHgwMAorREIJMHgwZSwweDc4LDB4MDEsMHgwMAorREIJMHgwOSwweDY4LDB4MDAsMHgwMAorREIJMHgwNCwweDAxLDB4MTUsMHgwMAorREIJMHgwMCwweGIzLDB4MDAsMHgwMAorQUxJR04JOAorJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X3BvaW50X2RvdWJsZToKK0RCCTksMCwwLDAKKwlERAlmdWxsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcG9pbnRfZG91YmxlcV9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRwb2ludF9kb3VibGVxX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECTMyKjUrNTYsMAorJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X3BvaW50X2FkZDoKK0RCCTksMCwwLDAKKwlERAlmdWxsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcG9pbnRfYWRkcV9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRwb2ludF9hZGRxX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECTMyKjE4KzU2LDAKKyRMJFNFSF9pbmZvX2VjcF9uaXN0ejI1Nl9wb2ludF9hZGRfYWZmaW5lOgorREIJOSwwLDAsMAorCURECWZ1bGxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRhZGRfYWZmaW5lcV9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRhZGRfYWZmaW5lcV9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKwlERAkzMioxNSs1NiwwCitBTElHTgk4CiskTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfcG9pbnRfZG91YmxleDoKK0RCCTksMCwwLDAKKwlERAlmdWxsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcG9pbnRfZG91YmxleF9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRwb2ludF9kb3VibGV4X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECTMyKjUrNTYsMAorJEwkU0VIX2luZm9fZWNwX25pc3R6MjU2X3BvaW50X2FkZHg6CitEQgk5LDAsMCwwCisJREQJZnVsbF9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJHBvaW50X2FkZHhfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkcG9pbnRfYWRkeF9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKwlERAkzMioxOCs1NiwwCiskTCRTRUhfaW5mb19lY3BfbmlzdHoyNTZfcG9pbnRfYWRkX2FmZmluZXg6CitEQgk5LDAsMCwwCisJREQJZnVsbF9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGFkZF9hZmZpbmV4X2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJGFkZF9hZmZpbmV4X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorCURECTMyKjE1KzU2LDAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9yZHJhbmQteDg2XzY0LmFzbSBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9yZHJhbmQteDg2XzY0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjA4ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JkcmFuZC14ODZfNjQuYXNtCkBAIC0wLDAgKzEsNzQgQEAKK2RlZmF1bHQJcmVsCislZGVmaW5lIFhNTVdPUkQKKyVkZWZpbmUgWU1NV09SRAorJWRlZmluZSBaTU1XT1JECitzZWN0aW9uCS50ZXh0IGNvZGUgYWxpZ249NjQKKworCisKKworCitnbG9iYWwJQ1JZUFRPX3JkcmFuZAorCitBTElHTgkxNgorQ1JZUFRPX3JkcmFuZDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX0NSWVBUT19yZHJhbmQ6CisJbW92CXJkaSxyY3gKKworCisKKwl4b3IJcmF4LHJheAorCisKK0RCCTB4NDgsMHgwZiwweGM3LDB4ZjEKKworCWFkYwlyYXgscmF4CisJbW92CVFXT1JEW3JkaV0scmN4CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCisKKworCitnbG9iYWwJQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmCisKK0FMSUdOCTE2CitDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWY6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9DUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWY6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCisKKworCXRlc3QJcnNpLHJzaQorCWp6CU5FQVIgJEwkb3V0CisJbW92CXJkeCw4CiskTCRsb29wOgorCisKK0RCCTB4NDgsMHgwZiwweGM3LDB4ZjEKKwlqbmMJTkVBUiAkTCRlcnIKKwltb3YJUVdPUkRbcmRpXSxyY3gKKwlhZGQJcmRpLHJkeAorCXN1Yglyc2kscmR4CisJam56CU5FQVIgJEwkbG9vcAorJEwkb3V0OgorCW1vdglyYXgsMQorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkZXJyOgorCXhvcglyYXgscmF4CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9yc2F6LWF2eDIuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3JzYXotYXZ4Mi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2ZjZlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9yc2F6LWF2eDIuYXNtCkBAIC0wLDAgKzEsMTk3NiBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCisKK2dsb2JhbAlyc2F6XzEwMjRfc3FyX2F2eDIKKworQUxJR04JNjQKK3JzYXpfMTAyNF9zcXJfYXZ4MjoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX3JzYXpfMTAyNF9zcXJfYXZ4MjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCisKKworCWxlYQlyYXgsW3JzcF0KKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXZ6ZXJvdXBwZXIKKwlsZWEJcnNwLFsoKC0xNjgpKStyc3BdCisJdm1vdmFwcwlYTU1XT1JEWygtMjE2KStyYXhdLHhtbTYKKwl2bW92YXBzCVhNTVdPUkRbKC0yMDApK3JheF0seG1tNworCXZtb3ZhcHMJWE1NV09SRFsoLTE4NCkrcmF4XSx4bW04CisJdm1vdmFwcwlYTU1XT1JEWygtMTY4KStyYXhdLHhtbTkKKwl2bW92YXBzCVhNTVdPUkRbKC0xNTIpK3JheF0seG1tMTAKKwl2bW92YXBzCVhNTVdPUkRbKC0xMzYpK3JheF0seG1tMTEKKwl2bW92YXBzCVhNTVdPUkRbKC0xMjApK3JheF0seG1tMTIKKwl2bW92YXBzCVhNTVdPUkRbKC0xMDQpK3JheF0seG1tMTMKKwl2bW92YXBzCVhNTVdPUkRbKC04OCkrcmF4XSx4bW0xNAorCXZtb3ZhcHMJWE1NV09SRFsoLTcyKStyYXhdLHhtbTE1CiskTCRzcXJfMTAyNF9ib2R5OgorCW1vdglyYnAscmF4CisKKwltb3YJcjEzLHJkeAorCXN1Yglyc3AsODMyCisJbW92CXIxNSxyMTMKKwlzdWIJcmRpLC0xMjgKKwlzdWIJcnNpLC0xMjgKKwlzdWIJcjEzLC0xMjgKKworCWFuZAlyMTUsNDA5NQorCWFkZAlyMTUsMzIqMTAKKwlzaHIJcjE1LDEyCisJdnB4b3IJeW1tOSx5bW05LHltbTkKKwlqeglORUFSICRMJHNxcl8xMDI0X25vX25fY29weQorCisKKworCisKKwlzdWIJcnNwLDMyKjEwCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgwLTEyOCkpK3IxM10KKwlhbmQJcnNwLC0yMDQ4CisJdm1vdmRxdQl5bW0xLFlNTVdPUkRbKCgzMi0xMjgpKStyMTNdCisJdm1vdmRxdQl5bW0yLFlNTVdPUkRbKCg2NC0xMjgpKStyMTNdCisJdm1vdmRxdQl5bW0zLFlNTVdPUkRbKCg5Ni0xMjgpKStyMTNdCisJdm1vdmRxdQl5bW00LFlNTVdPUkRbKCgxMjgtMTI4KSkrcjEzXQorCXZtb3ZkcXUJeW1tNSxZTU1XT1JEWygoMTYwLTEyOCkpK3IxM10KKwl2bW92ZHF1CXltbTYsWU1NV09SRFsoKDE5Mi0xMjgpKStyMTNdCisJdm1vdmRxdQl5bW03LFlNTVdPUkRbKCgyMjQtMTI4KSkrcjEzXQorCXZtb3ZkcXUJeW1tOCxZTU1XT1JEWygoMjU2LTEyOCkpK3IxM10KKwlsZWEJcjEzLFsoKDgzMisxMjgpKStyc3BdCisJdm1vdmRxdQlZTU1XT1JEWygwLTEyOCkrcjEzXSx5bW0wCisJdm1vdmRxdQlZTU1XT1JEWygzMi0xMjgpK3IxM10seW1tMQorCXZtb3ZkcXUJWU1NV09SRFsoNjQtMTI4KStyMTNdLHltbTIKKwl2bW92ZHF1CVlNTVdPUkRbKDk2LTEyOCkrcjEzXSx5bW0zCisJdm1vdmRxdQlZTU1XT1JEWygxMjgtMTI4KStyMTNdLHltbTQKKwl2bW92ZHF1CVlNTVdPUkRbKDE2MC0xMjgpK3IxM10seW1tNQorCXZtb3ZkcXUJWU1NV09SRFsoMTkyLTEyOCkrcjEzXSx5bW02CisJdm1vdmRxdQlZTU1XT1JEWygyMjQtMTI4KStyMTNdLHltbTcKKwl2bW92ZHF1CVlNTVdPUkRbKDI1Ni0xMjgpK3IxM10seW1tOAorCXZtb3ZkcXUJWU1NV09SRFsoMjg4LTEyOCkrcjEzXSx5bW05CisKKyRMJHNxcl8xMDI0X25vX25fY29weToKKwlhbmQJcnNwLC0xMDI0CisKKwl2bW92ZHF1CXltbTEsWU1NV09SRFsoKDMyLTEyOCkpK3JzaV0KKwl2bW92ZHF1CXltbTIsWU1NV09SRFsoKDY0LTEyOCkpK3JzaV0KKwl2bW92ZHF1CXltbTMsWU1NV09SRFsoKDk2LTEyOCkpK3JzaV0KKwl2bW92ZHF1CXltbTQsWU1NV09SRFsoKDEyOC0xMjgpKStyc2ldCisJdm1vdmRxdQl5bW01LFlNTVdPUkRbKCgxNjAtMTI4KSkrcnNpXQorCXZtb3ZkcXUJeW1tNixZTU1XT1JEWygoMTkyLTEyOCkpK3JzaV0KKwl2bW92ZHF1CXltbTcsWU1NV09SRFsoKDIyNC0xMjgpKStyc2ldCisJdm1vdmRxdQl5bW04LFlNTVdPUkRbKCgyNTYtMTI4KSkrcnNpXQorCisJbGVhCXJieCxbMTkyK3JzcF0KKwl2bW92ZHF1CXltbTE1LFlNTVdPUkRbJEwkYW5kX21hc2tdCisJam1wCU5FQVIgJEwkT09QX0dSQU5ERV9TUVJfMTAyNAorCitBTElHTgkzMgorJEwkT09QX0dSQU5ERV9TUVJfMTAyNDoKKwlsZWEJcjksWygoNTc2KzEyOCkpK3JzcF0KKwlsZWEJcjEyLFs0NDgrcnNwXQorCisKKworCisJdnBhZGRxCXltbTEseW1tMSx5bW0xCisJdnBicm9hZGNhc3RxCXltbTEwLFFXT1JEWygoMC0xMjgpKStyc2ldCisJdnBhZGRxCXltbTIseW1tMix5bW0yCisJdm1vdmRxYQlZTU1XT1JEWygwLTEyOCkrcjldLHltbTEKKwl2cGFkZHEJeW1tMyx5bW0zLHltbTMKKwl2bW92ZHFhCVlNTVdPUkRbKDMyLTEyOCkrcjldLHltbTIKKwl2cGFkZHEJeW1tNCx5bW00LHltbTQKKwl2bW92ZHFhCVlNTVdPUkRbKDY0LTEyOCkrcjldLHltbTMKKwl2cGFkZHEJeW1tNSx5bW01LHltbTUKKwl2bW92ZHFhCVlNTVdPUkRbKDk2LTEyOCkrcjldLHltbTQKKwl2cGFkZHEJeW1tNix5bW02LHltbTYKKwl2bW92ZHFhCVlNTVdPUkRbKDEyOC0xMjgpK3I5XSx5bW01CisJdnBhZGRxCXltbTcseW1tNyx5bW03CisJdm1vdmRxYQlZTU1XT1JEWygxNjAtMTI4KStyOV0seW1tNgorCXZwYWRkcQl5bW04LHltbTgseW1tOAorCXZtb3ZkcWEJWU1NV09SRFsoMTkyLTEyOCkrcjldLHltbTcKKwl2cHhvcgl5bW05LHltbTkseW1tOQorCXZtb3ZkcWEJWU1NV09SRFsoMjI0LTEyOCkrcjldLHltbTgKKworCXZwbXVsdWRxCXltbTAseW1tMTAsWU1NV09SRFsoKDAtMTI4KSkrcnNpXQorCXZwYnJvYWRjYXN0cQl5bW0xMSxRV09SRFsoKDMyLTEyOCkpK3JzaV0KKwl2bW92ZHF1CVlNTVdPUkRbKDI4OC0xOTIpK3JieF0seW1tOQorCXZwbXVsdWRxCXltbTEseW1tMSx5bW0xMAorCXZtb3ZkcXUJWU1NV09SRFsoMzIwLTQ0OCkrcjEyXSx5bW05CisJdnBtdWx1ZHEJeW1tMix5bW0yLHltbTEwCisJdm1vdmRxdQlZTU1XT1JEWygzNTItNDQ4KStyMTJdLHltbTkKKwl2cG11bHVkcQl5bW0zLHltbTMseW1tMTAKKwl2bW92ZHF1CVlNTVdPUkRbKDM4NC00NDgpK3IxMl0seW1tOQorCXZwbXVsdWRxCXltbTQseW1tNCx5bW0xMAorCXZtb3ZkcXUJWU1NV09SRFsoNDE2LTQ0OCkrcjEyXSx5bW05CisJdnBtdWx1ZHEJeW1tNSx5bW01LHltbTEwCisJdm1vdmRxdQlZTU1XT1JEWyg0NDgtNDQ4KStyMTJdLHltbTkKKwl2cG11bHVkcQl5bW02LHltbTYseW1tMTAKKwl2bW92ZHF1CVlNTVdPUkRbKDQ4MC00NDgpK3IxMl0seW1tOQorCXZwbXVsdWRxCXltbTcseW1tNyx5bW0xMAorCXZtb3ZkcXUJWU1NV09SRFsoNTEyLTQ0OCkrcjEyXSx5bW05CisJdnBtdWx1ZHEJeW1tOCx5bW04LHltbTEwCisJdnBicm9hZGNhc3RxCXltbTEwLFFXT1JEWygoNjQtMTI4KSkrcnNpXQorCXZtb3ZkcXUJWU1NV09SRFsoNTQ0LTQ0OCkrcjEyXSx5bW05CisKKwltb3YJcjE1LHJzaQorCW1vdglyMTRkLDQKKwlqbXAJTkVBUiAkTCRzcXJfZW50cnlfMTAyNAorQUxJR04JMzIKKyRMJE9PUF9TUVJfMTAyNDoKKwl2cGJyb2FkY2FzdHEJeW1tMTEsUVdPUkRbKCgzMi0xMjgpKStyMTVdCisJdnBtdWx1ZHEJeW1tMCx5bW0xMCxZTU1XT1JEWygoMC0xMjgpKStyc2ldCisJdnBhZGRxCXltbTAseW1tMCxZTU1XT1JEWygoMC0xOTIpKStyYnhdCisJdnBtdWx1ZHEJeW1tMSx5bW0xMCxZTU1XT1JEWygoMC0xMjgpKStyOV0KKwl2cGFkZHEJeW1tMSx5bW0xLFlNTVdPUkRbKCgzMi0xOTIpKStyYnhdCisJdnBtdWx1ZHEJeW1tMix5bW0xMCxZTU1XT1JEWygoMzItMTI4KSkrcjldCisJdnBhZGRxCXltbTIseW1tMixZTU1XT1JEWygoNjQtMTkyKSkrcmJ4XQorCXZwbXVsdWRxCXltbTMseW1tMTAsWU1NV09SRFsoKDY0LTEyOCkpK3I5XQorCXZwYWRkcQl5bW0zLHltbTMsWU1NV09SRFsoKDk2LTE5MikpK3JieF0KKwl2cG11bHVkcQl5bW00LHltbTEwLFlNTVdPUkRbKCg5Ni0xMjgpKStyOV0KKwl2cGFkZHEJeW1tNCx5bW00LFlNTVdPUkRbKCgxMjgtMTkyKSkrcmJ4XQorCXZwbXVsdWRxCXltbTUseW1tMTAsWU1NV09SRFsoKDEyOC0xMjgpKStyOV0KKwl2cGFkZHEJeW1tNSx5bW01LFlNTVdPUkRbKCgxNjAtMTkyKSkrcmJ4XQorCXZwbXVsdWRxCXltbTYseW1tMTAsWU1NV09SRFsoKDE2MC0xMjgpKStyOV0KKwl2cGFkZHEJeW1tNix5bW02LFlNTVdPUkRbKCgxOTItMTkyKSkrcmJ4XQorCXZwbXVsdWRxCXltbTcseW1tMTAsWU1NV09SRFsoKDE5Mi0xMjgpKStyOV0KKwl2cGFkZHEJeW1tNyx5bW03LFlNTVdPUkRbKCgyMjQtMTkyKSkrcmJ4XQorCXZwbXVsdWRxCXltbTgseW1tMTAsWU1NV09SRFsoKDIyNC0xMjgpKStyOV0KKwl2cGJyb2FkY2FzdHEJeW1tMTAsUVdPUkRbKCg2NC0xMjgpKStyMTVdCisJdnBhZGRxCXltbTgseW1tOCxZTU1XT1JEWygoMjU2LTE5MikpK3JieF0KKyRMJHNxcl9lbnRyeV8xMDI0OgorCXZtb3ZkcXUJWU1NV09SRFsoMC0xOTIpK3JieF0seW1tMAorCXZtb3ZkcXUJWU1NV09SRFsoMzItMTkyKStyYnhdLHltbTEKKworCXZwbXVsdWRxCXltbTEyLHltbTExLFlNTVdPUkRbKCgzMi0xMjgpKStyc2ldCisJdnBhZGRxCXltbTIseW1tMix5bW0xMgorCXZwbXVsdWRxCXltbTE0LHltbTExLFlNTVdPUkRbKCgzMi0xMjgpKStyOV0KKwl2cGFkZHEJeW1tMyx5bW0zLHltbTE0CisJdnBtdWx1ZHEJeW1tMTMseW1tMTEsWU1NV09SRFsoKDY0LTEyOCkpK3I5XQorCXZwYWRkcQl5bW00LHltbTQseW1tMTMKKwl2cG11bHVkcQl5bW0xMix5bW0xMSxZTU1XT1JEWygoOTYtMTI4KSkrcjldCisJdnBhZGRxCXltbTUseW1tNSx5bW0xMgorCXZwbXVsdWRxCXltbTE0LHltbTExLFlNTVdPUkRbKCgxMjgtMTI4KSkrcjldCisJdnBhZGRxCXltbTYseW1tNix5bW0xNAorCXZwbXVsdWRxCXltbTEzLHltbTExLFlNTVdPUkRbKCgxNjAtMTI4KSkrcjldCisJdnBhZGRxCXltbTcseW1tNyx5bW0xMworCXZwbXVsdWRxCXltbTEyLHltbTExLFlNTVdPUkRbKCgxOTItMTI4KSkrcjldCisJdnBhZGRxCXltbTgseW1tOCx5bW0xMgorCXZwbXVsdWRxCXltbTAseW1tMTEsWU1NV09SRFsoKDIyNC0xMjgpKStyOV0KKwl2cGJyb2FkY2FzdHEJeW1tMTEsUVdPUkRbKCg5Ni0xMjgpKStyMTVdCisJdnBhZGRxCXltbTAseW1tMCxZTU1XT1JEWygoMjg4LTE5MikpK3JieF0KKworCXZtb3ZkcXUJWU1NV09SRFsoNjQtMTkyKStyYnhdLHltbTIKKwl2bW92ZHF1CVlNTVdPUkRbKDk2LTE5MikrcmJ4XSx5bW0zCisKKwl2cG11bHVkcQl5bW0xMyx5bW0xMCxZTU1XT1JEWygoNjQtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW00LHltbTQseW1tMTMKKwl2cG11bHVkcQl5bW0xMix5bW0xMCxZTU1XT1JEWygoNjQtMTI4KSkrcjldCisJdnBhZGRxCXltbTUseW1tNSx5bW0xMgorCXZwbXVsdWRxCXltbTE0LHltbTEwLFlNTVdPUkRbKCg5Ni0xMjgpKStyOV0KKwl2cGFkZHEJeW1tNix5bW02LHltbTE0CisJdnBtdWx1ZHEJeW1tMTMseW1tMTAsWU1NV09SRFsoKDEyOC0xMjgpKStyOV0KKwl2cGFkZHEJeW1tNyx5bW03LHltbTEzCisJdnBtdWx1ZHEJeW1tMTIseW1tMTAsWU1NV09SRFsoKDE2MC0xMjgpKStyOV0KKwl2cGFkZHEJeW1tOCx5bW04LHltbTEyCisJdnBtdWx1ZHEJeW1tMTQseW1tMTAsWU1NV09SRFsoKDE5Mi0xMjgpKStyOV0KKwl2cGFkZHEJeW1tMCx5bW0wLHltbTE0CisJdnBtdWx1ZHEJeW1tMSx5bW0xMCxZTU1XT1JEWygoMjI0LTEyOCkpK3I5XQorCXZwYnJvYWRjYXN0cQl5bW0xMCxRV09SRFsoKDEyOC0xMjgpKStyMTVdCisJdnBhZGRxCXltbTEseW1tMSxZTU1XT1JEWygoMzIwLTQ0OCkpK3IxMl0KKworCXZtb3ZkcXUJWU1NV09SRFsoMTI4LTE5MikrcmJ4XSx5bW00CisJdm1vdmRxdQlZTU1XT1JEWygxNjAtMTkyKStyYnhdLHltbTUKKworCXZwbXVsdWRxCXltbTEyLHltbTExLFlNTVdPUkRbKCg5Ni0xMjgpKStyc2ldCisJdnBhZGRxCXltbTYseW1tNix5bW0xMgorCXZwbXVsdWRxCXltbTE0LHltbTExLFlNTVdPUkRbKCg5Ni0xMjgpKStyOV0KKwl2cGFkZHEJeW1tNyx5bW03LHltbTE0CisJdnBtdWx1ZHEJeW1tMTMseW1tMTEsWU1NV09SRFsoKDEyOC0xMjgpKStyOV0KKwl2cGFkZHEJeW1tOCx5bW04LHltbTEzCisJdnBtdWx1ZHEJeW1tMTIseW1tMTEsWU1NV09SRFsoKDE2MC0xMjgpKStyOV0KKwl2cGFkZHEJeW1tMCx5bW0wLHltbTEyCisJdnBtdWx1ZHEJeW1tMTQseW1tMTEsWU1NV09SRFsoKDE5Mi0xMjgpKStyOV0KKwl2cGFkZHEJeW1tMSx5bW0xLHltbTE0CisJdnBtdWx1ZHEJeW1tMix5bW0xMSxZTU1XT1JEWygoMjI0LTEyOCkpK3I5XQorCXZwYnJvYWRjYXN0cQl5bW0xMSxRV09SRFsoKDE2MC0xMjgpKStyMTVdCisJdnBhZGRxCXltbTIseW1tMixZTU1XT1JEWygoMzUyLTQ0OCkpK3IxMl0KKworCXZtb3ZkcXUJWU1NV09SRFsoMTkyLTE5MikrcmJ4XSx5bW02CisJdm1vdmRxdQlZTU1XT1JEWygyMjQtMTkyKStyYnhdLHltbTcKKworCXZwbXVsdWRxCXltbTEyLHltbTEwLFlNTVdPUkRbKCgxMjgtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW04LHltbTgseW1tMTIKKwl2cG11bHVkcQl5bW0xNCx5bW0xMCxZTU1XT1JEWygoMTI4LTEyOCkpK3I5XQorCXZwYWRkcQl5bW0wLHltbTAseW1tMTQKKwl2cG11bHVkcQl5bW0xMyx5bW0xMCxZTU1XT1JEWygoMTYwLTEyOCkpK3I5XQorCXZwYWRkcQl5bW0xLHltbTEseW1tMTMKKwl2cG11bHVkcQl5bW0xMix5bW0xMCxZTU1XT1JEWygoMTkyLTEyOCkpK3I5XQorCXZwYWRkcQl5bW0yLHltbTIseW1tMTIKKwl2cG11bHVkcQl5bW0zLHltbTEwLFlNTVdPUkRbKCgyMjQtMTI4KSkrcjldCisJdnBicm9hZGNhc3RxCXltbTEwLFFXT1JEWygoMTkyLTEyOCkpK3IxNV0KKwl2cGFkZHEJeW1tMyx5bW0zLFlNTVdPUkRbKCgzODQtNDQ4KSkrcjEyXQorCisJdm1vdmRxdQlZTU1XT1JEWygyNTYtMTkyKStyYnhdLHltbTgKKwl2bW92ZHF1CVlNTVdPUkRbKDI4OC0xOTIpK3JieF0seW1tMAorCWxlYQlyYngsWzgrcmJ4XQorCisJdnBtdWx1ZHEJeW1tMTMseW1tMTEsWU1NV09SRFsoKDE2MC0xMjgpKStyc2ldCisJdnBhZGRxCXltbTEseW1tMSx5bW0xMworCXZwbXVsdWRxCXltbTEyLHltbTExLFlNTVdPUkRbKCgxNjAtMTI4KSkrcjldCisJdnBhZGRxCXltbTIseW1tMix5bW0xMgorCXZwbXVsdWRxCXltbTE0LHltbTExLFlNTVdPUkRbKCgxOTItMTI4KSkrcjldCisJdnBhZGRxCXltbTMseW1tMyx5bW0xNAorCXZwbXVsdWRxCXltbTQseW1tMTEsWU1NV09SRFsoKDIyNC0xMjgpKStyOV0KKwl2cGJyb2FkY2FzdHEJeW1tMTEsUVdPUkRbKCgyMjQtMTI4KSkrcjE1XQorCXZwYWRkcQl5bW00LHltbTQsWU1NV09SRFsoKDQxNi00NDgpKStyMTJdCisKKwl2bW92ZHF1CVlNTVdPUkRbKDMyMC00NDgpK3IxMl0seW1tMQorCXZtb3ZkcXUJWU1NV09SRFsoMzUyLTQ0OCkrcjEyXSx5bW0yCisKKwl2cG11bHVkcQl5bW0xMix5bW0xMCxZTU1XT1JEWygoMTkyLTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tMyx5bW0zLHltbTEyCisJdnBtdWx1ZHEJeW1tMTQseW1tMTAsWU1NV09SRFsoKDE5Mi0xMjgpKStyOV0KKwl2cGJyb2FkY2FzdHEJeW1tMCxRV09SRFsoKDI1Ni0xMjgpKStyMTVdCisJdnBhZGRxCXltbTQseW1tNCx5bW0xNAorCXZwbXVsdWRxCXltbTUseW1tMTAsWU1NV09SRFsoKDIyNC0xMjgpKStyOV0KKwl2cGJyb2FkY2FzdHEJeW1tMTAsUVdPUkRbKCgwKzgtMTI4KSkrcjE1XQorCXZwYWRkcQl5bW01LHltbTUsWU1NV09SRFsoKDQ0OC00NDgpKStyMTJdCisKKwl2bW92ZHF1CVlNTVdPUkRbKDM4NC00NDgpK3IxMl0seW1tMworCXZtb3ZkcXUJWU1NV09SRFsoNDE2LTQ0OCkrcjEyXSx5bW00CisJbGVhCXIxNSxbOCtyMTVdCisKKwl2cG11bHVkcQl5bW0xMix5bW0xMSxZTU1XT1JEWygoMjI0LTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tNSx5bW01LHltbTEyCisJdnBtdWx1ZHEJeW1tNix5bW0xMSxZTU1XT1JEWygoMjI0LTEyOCkpK3I5XQorCXZwYWRkcQl5bW02LHltbTYsWU1NV09SRFsoKDQ4MC00NDgpKStyMTJdCisKKwl2cG11bHVkcQl5bW03LHltbTAsWU1NV09SRFsoKDI1Ni0xMjgpKStyc2ldCisJdm1vdmRxdQlZTU1XT1JEWyg0NDgtNDQ4KStyMTJdLHltbTUKKwl2cGFkZHEJeW1tNyx5bW03LFlNTVdPUkRbKCg1MTItNDQ4KSkrcjEyXQorCXZtb3ZkcXUJWU1NV09SRFsoNDgwLTQ0OCkrcjEyXSx5bW02CisJdm1vdmRxdQlZTU1XT1JEWyg1MTItNDQ4KStyMTJdLHltbTcKKwlsZWEJcjEyLFs4K3IxMl0KKworCWRlYwlyMTRkCisJam56CU5FQVIgJEwkT09QX1NRUl8xMDI0CisKKwl2bW92ZHF1CXltbTgsWU1NV09SRFsyNTYrcnNwXQorCXZtb3ZkcXUJeW1tMSxZTU1XT1JEWzI4OCtyc3BdCisJdm1vdmRxdQl5bW0yLFlNTVdPUkRbMzIwK3JzcF0KKwlsZWEJcmJ4LFsxOTIrcnNwXQorCisJdnBzcmxxCXltbTE0LHltbTgsMjkKKwl2cGFuZAl5bW04LHltbTgseW1tMTUKKwl2cHNybHEJeW1tMTEseW1tMSwyOQorCXZwYW5kCXltbTEseW1tMSx5bW0xNQorCisJdnBlcm1xCXltbTE0LHltbTE0LDB4OTMKKwl2cHhvcgl5bW05LHltbTkseW1tOQorCXZwZXJtcQl5bW0xMSx5bW0xMSwweDkzCisKKwl2cGJsZW5kZAl5bW0xMCx5bW0xNCx5bW05LDMKKwl2cGJsZW5kZAl5bW0xNCx5bW0xMSx5bW0xNCwzCisJdnBhZGRxCXltbTgseW1tOCx5bW0xMAorCXZwYmxlbmRkCXltbTExLHltbTkseW1tMTEsMworCXZwYWRkcQl5bW0xLHltbTEseW1tMTQKKwl2cGFkZHEJeW1tMix5bW0yLHltbTExCisJdm1vdmRxdQlZTU1XT1JEWygyODgtMTkyKStyYnhdLHltbTEKKwl2bW92ZHF1CVlNTVdPUkRbKDMyMC0xOTIpK3JieF0seW1tMgorCisJbW92CXJheCxRV09SRFtyc3BdCisJbW92CXIxMCxRV09SRFs4K3JzcF0KKwltb3YJcjExLFFXT1JEWzE2K3JzcF0KKwltb3YJcjEyLFFXT1JEWzI0K3JzcF0KKwl2bW92ZHF1CXltbTEsWU1NV09SRFszMityc3BdCisJdm1vdmRxdQl5bW0yLFlNTVdPUkRbKCg2NC0xOTIpKStyYnhdCisJdm1vdmRxdQl5bW0zLFlNTVdPUkRbKCg5Ni0xOTIpKStyYnhdCisJdm1vdmRxdQl5bW00LFlNTVdPUkRbKCgxMjgtMTkyKSkrcmJ4XQorCXZtb3ZkcXUJeW1tNSxZTU1XT1JEWygoMTYwLTE5MikpK3JieF0KKwl2bW92ZHF1CXltbTYsWU1NV09SRFsoKDE5Mi0xOTIpKStyYnhdCisJdm1vdmRxdQl5bW03LFlNTVdPUkRbKCgyMjQtMTkyKSkrcmJ4XQorCisJbW92CXI5LHJheAorCWltdWwJZWF4LGVjeAorCWFuZAllYXgsMHgxZmZmZmZmZgorCXZtb3ZkCXhtbTEyLGVheAorCisJbW92CXJkeCxyYXgKKwlpbXVsCXJheCxRV09SRFsoKC0xMjgpKStyMTNdCisJdnBicm9hZGNhc3RxCXltbTEyLHhtbTEyCisJYWRkCXI5LHJheAorCW1vdglyYXgscmR4CisJaW11bAlyYXgsUVdPUkRbKCg4LTEyOCkpK3IxM10KKwlzaHIJcjksMjkKKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmR4CisJaW11bAlyYXgsUVdPUkRbKCgxNi0xMjgpKStyMTNdCisJYWRkCXIxMCxyOQorCWFkZAlyMTEscmF4CisJaW11bAlyZHgsUVdPUkRbKCgyNC0xMjgpKStyMTNdCisJYWRkCXIxMixyZHgKKworCW1vdglyYXgscjEwCisJaW11bAllYXgsZWN4CisJYW5kCWVheCwweDFmZmZmZmZmCisKKwltb3YJcjE0ZCw5CisJam1wCU5FQVIgJEwkT09QX1JFRFVDRV8xMDI0CisKK0FMSUdOCTMyCiskTCRPT1BfUkVEVUNFXzEwMjQ6CisJdm1vdmQJeG1tMTMsZWF4CisJdnBicm9hZGNhc3RxCXltbTEzLHhtbTEzCisKKwl2cG11bHVkcQl5bW0xMCx5bW0xMixZTU1XT1JEWygoMzItMTI4KSkrcjEzXQorCW1vdglyZHgscmF4CisJaW11bAlyYXgsUVdPUkRbKCgtMTI4KSkrcjEzXQorCXZwYWRkcQl5bW0xLHltbTEseW1tMTAKKwlhZGQJcjEwLHJheAorCXZwbXVsdWRxCXltbTE0LHltbTEyLFlNTVdPUkRbKCg2NC0xMjgpKStyMTNdCisJbW92CXJheCxyZHgKKwlpbXVsCXJheCxRV09SRFsoKDgtMTI4KSkrcjEzXQorCXZwYWRkcQl5bW0yLHltbTIseW1tMTQKKwl2cG11bHVkcQl5bW0xMSx5bW0xMixZTU1XT1JEWygoOTYtMTI4KSkrcjEzXQorREIJMHg2NworCWFkZAlyMTEscmF4CitEQgkweDY3CisJbW92CXJheCxyZHgKKwlpbXVsCXJheCxRV09SRFsoKDE2LTEyOCkpK3IxM10KKwlzaHIJcjEwLDI5CisJdnBhZGRxCXltbTMseW1tMyx5bW0xMQorCXZwbXVsdWRxCXltbTEwLHltbTEyLFlNTVdPUkRbKCgxMjgtMTI4KSkrcjEzXQorCWFkZAlyMTIscmF4CisJYWRkCXIxMSxyMTAKKwl2cGFkZHEJeW1tNCx5bW00LHltbTEwCisJdnBtdWx1ZHEJeW1tMTQseW1tMTIsWU1NV09SRFsoKDE2MC0xMjgpKStyMTNdCisJbW92CXJheCxyMTEKKwlpbXVsCWVheCxlY3gKKwl2cGFkZHEJeW1tNSx5bW01LHltbTE0CisJdnBtdWx1ZHEJeW1tMTEseW1tMTIsWU1NV09SRFsoKDE5Mi0xMjgpKStyMTNdCisJYW5kCWVheCwweDFmZmZmZmZmCisJdnBhZGRxCXltbTYseW1tNix5bW0xMQorCXZwbXVsdWRxCXltbTEwLHltbTEyLFlNTVdPUkRbKCgyMjQtMTI4KSkrcjEzXQorCXZwYWRkcQl5bW03LHltbTcseW1tMTAKKwl2cG11bHVkcQl5bW0xNCx5bW0xMixZTU1XT1JEWygoMjU2LTEyOCkpK3IxM10KKwl2bW92ZAl4bW0xMixlYXgKKworCXZwYWRkcQl5bW04LHltbTgseW1tMTQKKworCXZwYnJvYWRjYXN0cQl5bW0xMix4bW0xMgorCisJdnBtdWx1ZHEJeW1tMTEseW1tMTMsWU1NV09SRFsoKDMyLTgtMTI4KSkrcjEzXQorCXZtb3ZkcXUJeW1tMTQsWU1NV09SRFsoKDk2LTgtMTI4KSkrcjEzXQorCW1vdglyZHgscmF4CisJaW11bAlyYXgsUVdPUkRbKCgtMTI4KSkrcjEzXQorCXZwYWRkcQl5bW0xLHltbTEseW1tMTEKKwl2cG11bHVkcQl5bW0xMCx5bW0xMyxZTU1XT1JEWygoNjQtOC0xMjgpKStyMTNdCisJdm1vdmRxdQl5bW0xMSxZTU1XT1JEWygoMTI4LTgtMTI4KSkrcjEzXQorCWFkZAlyMTEscmF4CisJbW92CXJheCxyZHgKKwlpbXVsCXJheCxRV09SRFsoKDgtMTI4KSkrcjEzXQorCXZwYWRkcQl5bW0yLHltbTIseW1tMTAKKwlhZGQJcmF4LHIxMgorCXNocglyMTEsMjkKKwl2cG11bHVkcQl5bW0xNCx5bW0xNCx5bW0xMworCXZtb3ZkcXUJeW1tMTAsWU1NV09SRFsoKDE2MC04LTEyOCkpK3IxM10KKwlhZGQJcmF4LHIxMQorCXZwYWRkcQl5bW0zLHltbTMseW1tMTQKKwl2cG11bHVkcQl5bW0xMSx5bW0xMSx5bW0xMworCXZtb3ZkcXUJeW1tMTQsWU1NV09SRFsoKDE5Mi04LTEyOCkpK3IxM10KK0RCCTB4NjcKKwltb3YJcjEyLHJheAorCWltdWwJZWF4LGVjeAorCXZwYWRkcQl5bW00LHltbTQseW1tMTEKKwl2cG11bHVkcQl5bW0xMCx5bW0xMCx5bW0xMworREIJMHhjNCwweDQxLDB4N2UsMHg2ZiwweDlkLDB4NTgsMHgwMCwweDAwLDB4MDAKKwlhbmQJZWF4LDB4MWZmZmZmZmYKKwl2cGFkZHEJeW1tNSx5bW01LHltbTEwCisJdnBtdWx1ZHEJeW1tMTQseW1tMTQseW1tMTMKKwl2bW92ZHF1CXltbTEwLFlNTVdPUkRbKCgyNTYtOC0xMjgpKStyMTNdCisJdnBhZGRxCXltbTYseW1tNix5bW0xNAorCXZwbXVsdWRxCXltbTExLHltbTExLHltbTEzCisJdm1vdmRxdQl5bW05LFlNTVdPUkRbKCgyODgtOC0xMjgpKStyMTNdCisJdm1vdmQJeG1tMCxlYXgKKwlpbXVsCXJheCxRV09SRFsoKC0xMjgpKStyMTNdCisJdnBhZGRxCXltbTcseW1tNyx5bW0xMQorCXZwbXVsdWRxCXltbTEwLHltbTEwLHltbTEzCisJdm1vdmRxdQl5bW0xNCxZTU1XT1JEWygoMzItMTYtMTI4KSkrcjEzXQorCXZwYnJvYWRjYXN0cQl5bW0wLHhtbTAKKwl2cGFkZHEJeW1tOCx5bW04LHltbTEwCisJdnBtdWx1ZHEJeW1tOSx5bW05LHltbTEzCisJdm1vdmRxdQl5bW0xMSxZTU1XT1JEWygoNjQtMTYtMTI4KSkrcjEzXQorCWFkZAlyMTIscmF4CisKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgzMi0yNC0xMjgpKStyMTNdCisJdnBtdWx1ZHEJeW1tMTQseW1tMTQseW1tMTIKKwl2bW92ZHF1CXltbTEwLFlNTVdPUkRbKCg5Ni0xNi0xMjgpKStyMTNdCisJdnBhZGRxCXltbTEseW1tMSx5bW0xNAorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTAKKwl2cG11bHVkcQl5bW0xMSx5bW0xMSx5bW0xMgorREIJMHhjNCwweDQxLDB4N2UsMHg2ZiwweGI1LDB4ZjAsMHhmZiwweGZmLDB4ZmYKKwl2cGFkZHEJeW1tMTMseW1tMTMseW1tMQorCXZwYWRkcQl5bW0yLHltbTIseW1tMTEKKwl2cG11bHVkcQl5bW0xMCx5bW0xMCx5bW0xMgorCXZtb3ZkcXUJeW1tMTEsWU1NV09SRFsoKDE2MC0xNi0xMjgpKStyMTNdCitEQgkweDY3CisJdm1vdnEJcmF4LHhtbTEzCisJdm1vdmRxdQlZTU1XT1JEW3JzcF0seW1tMTMKKwl2cGFkZHEJeW1tMyx5bW0zLHltbTEwCisJdnBtdWx1ZHEJeW1tMTQseW1tMTQseW1tMTIKKwl2bW92ZHF1CXltbTEwLFlNTVdPUkRbKCgxOTItMTYtMTI4KSkrcjEzXQorCXZwYWRkcQl5bW00LHltbTQseW1tMTQKKwl2cG11bHVkcQl5bW0xMSx5bW0xMSx5bW0xMgorCXZtb3ZkcXUJeW1tMTQsWU1NV09SRFsoKDIyNC0xNi0xMjgpKStyMTNdCisJdnBhZGRxCXltbTUseW1tNSx5bW0xMQorCXZwbXVsdWRxCXltbTEwLHltbTEwLHltbTEyCisJdm1vdmRxdQl5bW0xMSxZTU1XT1JEWygoMjU2LTE2LTEyOCkpK3IxM10KKwl2cGFkZHEJeW1tNix5bW02LHltbTEwCisJdnBtdWx1ZHEJeW1tMTQseW1tMTQseW1tMTIKKwlzaHIJcjEyLDI5CisJdm1vdmRxdQl5bW0xMCxZTU1XT1JEWygoMjg4LTE2LTEyOCkpK3IxM10KKwlhZGQJcmF4LHIxMgorCXZwYWRkcQl5bW03LHltbTcseW1tMTQKKwl2cG11bHVkcQl5bW0xMSx5bW0xMSx5bW0xMgorCisJbW92CXI5LHJheAorCWltdWwJZWF4LGVjeAorCXZwYWRkcQl5bW04LHltbTgseW1tMTEKKwl2cG11bHVkcQl5bW0xMCx5bW0xMCx5bW0xMgorCWFuZAllYXgsMHgxZmZmZmZmZgorCXZtb3ZkCXhtbTEyLGVheAorCXZtb3ZkcXUJeW1tMTEsWU1NV09SRFsoKDk2LTI0LTEyOCkpK3IxM10KK0RCCTB4NjcKKwl2cGFkZHEJeW1tOSx5bW05LHltbTEwCisJdnBicm9hZGNhc3RxCXltbTEyLHhtbTEyCisKKwl2cG11bHVkcQl5bW0xNCx5bW0wLFlNTVdPUkRbKCg2NC0yNC0xMjgpKStyMTNdCisJdm1vdmRxdQl5bW0xMCxZTU1XT1JEWygoMTI4LTI0LTEyOCkpK3IxM10KKwltb3YJcmR4LHJheAorCWltdWwJcmF4LFFXT1JEWygoLTEyOCkpK3IxM10KKwltb3YJcjEwLFFXT1JEWzgrcnNwXQorCXZwYWRkcQl5bW0xLHltbTIseW1tMTQKKwl2cG11bHVkcQl5bW0xMSx5bW0xMSx5bW0wCisJdm1vdmRxdQl5bW0xNCxZTU1XT1JEWygoMTYwLTI0LTEyOCkpK3IxM10KKwlhZGQJcjkscmF4CisJbW92CXJheCxyZHgKKwlpbXVsCXJheCxRV09SRFsoKDgtMTI4KSkrcjEzXQorREIJMHg2NworCXNocglyOSwyOQorCW1vdglyMTEsUVdPUkRbMTYrcnNwXQorCXZwYWRkcQl5bW0yLHltbTMseW1tMTEKKwl2cG11bHVkcQl5bW0xMCx5bW0xMCx5bW0wCisJdm1vdmRxdQl5bW0xMSxZTU1XT1JEWygoMTkyLTI0LTEyOCkpK3IxM10KKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmR4CisJaW11bAlyYXgsUVdPUkRbKCgxNi0xMjgpKStyMTNdCisJdnBhZGRxCXltbTMseW1tNCx5bW0xMAorCXZwbXVsdWRxCXltbTE0LHltbTE0LHltbTAKKwl2bW92ZHF1CXltbTEwLFlNTVdPUkRbKCgyMjQtMjQtMTI4KSkrcjEzXQorCWltdWwJcmR4LFFXT1JEWygoMjQtMTI4KSkrcjEzXQorCWFkZAlyMTEscmF4CisJbGVhCXJheCxbcjEwKjErcjldCisJdnBhZGRxCXltbTQseW1tNSx5bW0xNAorCXZwbXVsdWRxCXltbTExLHltbTExLHltbTAKKwl2bW92ZHF1CXltbTE0LFlNTVdPUkRbKCgyNTYtMjQtMTI4KSkrcjEzXQorCW1vdglyMTAscmF4CisJaW11bAllYXgsZWN4CisJdnBtdWx1ZHEJeW1tMTAseW1tMTAseW1tMAorCXZwYWRkcQl5bW01LHltbTYseW1tMTEKKwl2bW92ZHF1CXltbTExLFlNTVdPUkRbKCgyODgtMjQtMTI4KSkrcjEzXQorCWFuZAllYXgsMHgxZmZmZmZmZgorCXZwYWRkcQl5bW02LHltbTcseW1tMTAKKwl2cG11bHVkcQl5bW0xNCx5bW0xNCx5bW0wCisJYWRkCXJkeCxRV09SRFsyNCtyc3BdCisJdnBhZGRxCXltbTcseW1tOCx5bW0xNAorCXZwbXVsdWRxCXltbTExLHltbTExLHltbTAKKwl2cGFkZHEJeW1tOCx5bW05LHltbTExCisJdm1vdnEJeG1tOSxyMTIKKwltb3YJcjEyLHJkeAorCisJZGVjCXIxNGQKKwlqbnoJTkVBUiAkTCRPT1BfUkVEVUNFXzEwMjQKKwlsZWEJcjEyLFs0NDgrcnNwXQorCXZwYWRkcQl5bW0wLHltbTEzLHltbTkKKwl2cHhvcgl5bW05LHltbTkseW1tOQorCisJdnBhZGRxCXltbTAseW1tMCxZTU1XT1JEWygoMjg4LTE5MikpK3JieF0KKwl2cGFkZHEJeW1tMSx5bW0xLFlNTVdPUkRbKCgzMjAtNDQ4KSkrcjEyXQorCXZwYWRkcQl5bW0yLHltbTIsWU1NV09SRFsoKDM1Mi00NDgpKStyMTJdCisJdnBhZGRxCXltbTMseW1tMyxZTU1XT1JEWygoMzg0LTQ0OCkpK3IxMl0KKwl2cGFkZHEJeW1tNCx5bW00LFlNTVdPUkRbKCg0MTYtNDQ4KSkrcjEyXQorCXZwYWRkcQl5bW01LHltbTUsWU1NV09SRFsoKDQ0OC00NDgpKStyMTJdCisJdnBhZGRxCXltbTYseW1tNixZTU1XT1JEWygoNDgwLTQ0OCkpK3IxMl0KKwl2cGFkZHEJeW1tNyx5bW03LFlNTVdPUkRbKCg1MTItNDQ4KSkrcjEyXQorCXZwYWRkcQl5bW04LHltbTgsWU1NV09SRFsoKDU0NC00NDgpKStyMTJdCisKKwl2cHNybHEJeW1tMTQseW1tMCwyOQorCXZwYW5kCXltbTAseW1tMCx5bW0xNQorCXZwc3JscQl5bW0xMSx5bW0xLDI5CisJdnBhbmQJeW1tMSx5bW0xLHltbTE1CisJdnBzcmxxCXltbTEyLHltbTIsMjkKKwl2cGVybXEJeW1tMTQseW1tMTQsMHg5MworCXZwYW5kCXltbTIseW1tMix5bW0xNQorCXZwc3JscQl5bW0xMyx5bW0zLDI5CisJdnBlcm1xCXltbTExLHltbTExLDB4OTMKKwl2cGFuZAl5bW0zLHltbTMseW1tMTUKKwl2cGVybXEJeW1tMTIseW1tMTIsMHg5MworCisJdnBibGVuZGQJeW1tMTAseW1tMTQseW1tOSwzCisJdnBlcm1xCXltbTEzLHltbTEzLDB4OTMKKwl2cGJsZW5kZAl5bW0xNCx5bW0xMSx5bW0xNCwzCisJdnBhZGRxCXltbTAseW1tMCx5bW0xMAorCXZwYmxlbmRkCXltbTExLHltbTEyLHltbTExLDMKKwl2cGFkZHEJeW1tMSx5bW0xLHltbTE0CisJdnBibGVuZGQJeW1tMTIseW1tMTMseW1tMTIsMworCXZwYWRkcQl5bW0yLHltbTIseW1tMTEKKwl2cGJsZW5kZAl5bW0xMyx5bW05LHltbTEzLDMKKwl2cGFkZHEJeW1tMyx5bW0zLHltbTEyCisJdnBhZGRxCXltbTQseW1tNCx5bW0xMworCisJdnBzcmxxCXltbTE0LHltbTAsMjkKKwl2cGFuZAl5bW0wLHltbTAseW1tMTUKKwl2cHNybHEJeW1tMTEseW1tMSwyOQorCXZwYW5kCXltbTEseW1tMSx5bW0xNQorCXZwc3JscQl5bW0xMix5bW0yLDI5CisJdnBlcm1xCXltbTE0LHltbTE0LDB4OTMKKwl2cGFuZAl5bW0yLHltbTIseW1tMTUKKwl2cHNybHEJeW1tMTMseW1tMywyOQorCXZwZXJtcQl5bW0xMSx5bW0xMSwweDkzCisJdnBhbmQJeW1tMyx5bW0zLHltbTE1CisJdnBlcm1xCXltbTEyLHltbTEyLDB4OTMKKworCXZwYmxlbmRkCXltbTEwLHltbTE0LHltbTksMworCXZwZXJtcQl5bW0xMyx5bW0xMywweDkzCisJdnBibGVuZGQJeW1tMTQseW1tMTEseW1tMTQsMworCXZwYWRkcQl5bW0wLHltbTAseW1tMTAKKwl2cGJsZW5kZAl5bW0xMSx5bW0xMix5bW0xMSwzCisJdnBhZGRxCXltbTEseW1tMSx5bW0xNAorCXZtb3ZkcXUJWU1NV09SRFsoMC0xMjgpK3JkaV0seW1tMAorCXZwYmxlbmRkCXltbTEyLHltbTEzLHltbTEyLDMKKwl2cGFkZHEJeW1tMix5bW0yLHltbTExCisJdm1vdmRxdQlZTU1XT1JEWygzMi0xMjgpK3JkaV0seW1tMQorCXZwYmxlbmRkCXltbTEzLHltbTkseW1tMTMsMworCXZwYWRkcQl5bW0zLHltbTMseW1tMTIKKwl2bW92ZHF1CVlNTVdPUkRbKDY0LTEyOCkrcmRpXSx5bW0yCisJdnBhZGRxCXltbTQseW1tNCx5bW0xMworCXZtb3ZkcXUJWU1NV09SRFsoOTYtMTI4KStyZGldLHltbTMKKwl2cHNybHEJeW1tMTQseW1tNCwyOQorCXZwYW5kCXltbTQseW1tNCx5bW0xNQorCXZwc3JscQl5bW0xMSx5bW01LDI5CisJdnBhbmQJeW1tNSx5bW01LHltbTE1CisJdnBzcmxxCXltbTEyLHltbTYsMjkKKwl2cGVybXEJeW1tMTQseW1tMTQsMHg5MworCXZwYW5kCXltbTYseW1tNix5bW0xNQorCXZwc3JscQl5bW0xMyx5bW03LDI5CisJdnBlcm1xCXltbTExLHltbTExLDB4OTMKKwl2cGFuZAl5bW03LHltbTcseW1tMTUKKwl2cHNybHEJeW1tMCx5bW04LDI5CisJdnBlcm1xCXltbTEyLHltbTEyLDB4OTMKKwl2cGFuZAl5bW04LHltbTgseW1tMTUKKwl2cGVybXEJeW1tMTMseW1tMTMsMHg5MworCisJdnBibGVuZGQJeW1tMTAseW1tMTQseW1tOSwzCisJdnBlcm1xCXltbTAseW1tMCwweDkzCisJdnBibGVuZGQJeW1tMTQseW1tMTEseW1tMTQsMworCXZwYWRkcQl5bW00LHltbTQseW1tMTAKKwl2cGJsZW5kZAl5bW0xMSx5bW0xMix5bW0xMSwzCisJdnBhZGRxCXltbTUseW1tNSx5bW0xNAorCXZwYmxlbmRkCXltbTEyLHltbTEzLHltbTEyLDMKKwl2cGFkZHEJeW1tNix5bW02LHltbTExCisJdnBibGVuZGQJeW1tMTMseW1tMCx5bW0xMywzCisJdnBhZGRxCXltbTcseW1tNyx5bW0xMgorCXZwYWRkcQl5bW04LHltbTgseW1tMTMKKworCXZwc3JscQl5bW0xNCx5bW00LDI5CisJdnBhbmQJeW1tNCx5bW00LHltbTE1CisJdnBzcmxxCXltbTExLHltbTUsMjkKKwl2cGFuZAl5bW01LHltbTUseW1tMTUKKwl2cHNybHEJeW1tMTIseW1tNiwyOQorCXZwZXJtcQl5bW0xNCx5bW0xNCwweDkzCisJdnBhbmQJeW1tNix5bW02LHltbTE1CisJdnBzcmxxCXltbTEzLHltbTcsMjkKKwl2cGVybXEJeW1tMTEseW1tMTEsMHg5MworCXZwYW5kCXltbTcseW1tNyx5bW0xNQorCXZwc3JscQl5bW0wLHltbTgsMjkKKwl2cGVybXEJeW1tMTIseW1tMTIsMHg5MworCXZwYW5kCXltbTgseW1tOCx5bW0xNQorCXZwZXJtcQl5bW0xMyx5bW0xMywweDkzCisKKwl2cGJsZW5kZAl5bW0xMCx5bW0xNCx5bW05LDMKKwl2cGVybXEJeW1tMCx5bW0wLDB4OTMKKwl2cGJsZW5kZAl5bW0xNCx5bW0xMSx5bW0xNCwzCisJdnBhZGRxCXltbTQseW1tNCx5bW0xMAorCXZwYmxlbmRkCXltbTExLHltbTEyLHltbTExLDMKKwl2cGFkZHEJeW1tNSx5bW01LHltbTE0CisJdm1vdmRxdQlZTU1XT1JEWygxMjgtMTI4KStyZGldLHltbTQKKwl2cGJsZW5kZAl5bW0xMix5bW0xMyx5bW0xMiwzCisJdnBhZGRxCXltbTYseW1tNix5bW0xMQorCXZtb3ZkcXUJWU1NV09SRFsoMTYwLTEyOCkrcmRpXSx5bW01CisJdnBibGVuZGQJeW1tMTMseW1tMCx5bW0xMywzCisJdnBhZGRxCXltbTcseW1tNyx5bW0xMgorCXZtb3ZkcXUJWU1NV09SRFsoMTkyLTEyOCkrcmRpXSx5bW02CisJdnBhZGRxCXltbTgseW1tOCx5bW0xMworCXZtb3ZkcXUJWU1NV09SRFsoMjI0LTEyOCkrcmRpXSx5bW03CisJdm1vdmRxdQlZTU1XT1JEWygyNTYtMTI4KStyZGldLHltbTgKKworCW1vdglyc2kscmRpCisJZGVjCXI4ZAorCWpuZQlORUFSICRMJE9PUF9HUkFOREVfU1FSXzEwMjQKKworCXZ6ZXJvYWxsCisJbW92CXJheCxyYnAKKworJEwkc3FyXzEwMjRfaW5fdGFpbDoKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTIxNikpK3JheF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWygoLTIwMCkpK3JheF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoLTE4NCkpK3JheF0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTE2OCkpK3JheF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFsoKC0xNTIpKStyYXhdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbKCgtMTM2KSkrcmF4XQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWygoLTEyMCkpK3JheF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsoKC0xMDQpKStyYXhdCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbKCgtODgpKStyYXhdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbKCgtNzIpKStyYXhdCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JheF0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyYXhdCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYXhdCisKKwlsZWEJcnNwLFtyYXhdCisKKyRMJHNxcl8xMDI0X2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX3JzYXpfMTAyNF9zcXJfYXZ4MjoKK2dsb2JhbAlyc2F6XzEwMjRfbXVsX2F2eDIKKworQUxJR04JNjQKK3JzYXpfMTAyNF9tdWxfYXZ4MjoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX3JzYXpfMTAyNF9tdWxfYXZ4MjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCisKKworCWxlYQlyYXgsW3JzcF0KKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXZ6ZXJvdXBwZXIKKwlsZWEJcnNwLFsoKC0xNjgpKStyc3BdCisJdm1vdmFwcwlYTU1XT1JEWygtMjE2KStyYXhdLHhtbTYKKwl2bW92YXBzCVhNTVdPUkRbKC0yMDApK3JheF0seG1tNworCXZtb3ZhcHMJWE1NV09SRFsoLTE4NCkrcmF4XSx4bW04CisJdm1vdmFwcwlYTU1XT1JEWygtMTY4KStyYXhdLHhtbTkKKwl2bW92YXBzCVhNTVdPUkRbKC0xNTIpK3JheF0seG1tMTAKKwl2bW92YXBzCVhNTVdPUkRbKC0xMzYpK3JheF0seG1tMTEKKwl2bW92YXBzCVhNTVdPUkRbKC0xMjApK3JheF0seG1tMTIKKwl2bW92YXBzCVhNTVdPUkRbKC0xMDQpK3JheF0seG1tMTMKKwl2bW92YXBzCVhNTVdPUkRbKC04OCkrcmF4XSx4bW0xNAorCXZtb3ZhcHMJWE1NV09SRFsoLTcyKStyYXhdLHhtbTE1CiskTCRtdWxfMTAyNF9ib2R5OgorCW1vdglyYnAscmF4CisKKwl2emVyb2FsbAorCW1vdglyMTMscmR4CisJc3ViCXJzcCw2NAorCisKKworCisKKworREIJMHg2NywweDY3CisJbW92CXIxNSxyc2kKKwlhbmQJcjE1LDQwOTUKKwlhZGQJcjE1LDMyKjEwCisJc2hyCXIxNSwxMgorCW1vdglyMTUscnNpCisJY21vdm56CXJzaSxyMTMKKwljbW92bnoJcjEzLHIxNQorCisJbW92CXIxNSxyY3gKKwlzdWIJcnNpLC0xMjgKKwlzdWIJcmN4LC0xMjgKKwlzdWIJcmRpLC0xMjgKKworCWFuZAlyMTUsNDA5NQorCWFkZAlyMTUsMzIqMTAKK0RCCTB4NjcsMHg2NworCXNocglyMTUsMTIKKwlqeglORUFSICRMJG11bF8xMDI0X25vX25fY29weQorCisKKworCisKKwlzdWIJcnNwLDMyKjEwCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgwLTEyOCkpK3JjeF0KKwlhbmQJcnNwLC01MTIKKwl2bW92ZHF1CXltbTEsWU1NV09SRFsoKDMyLTEyOCkpK3JjeF0KKwl2bW92ZHF1CXltbTIsWU1NV09SRFsoKDY0LTEyOCkpK3JjeF0KKwl2bW92ZHF1CXltbTMsWU1NV09SRFsoKDk2LTEyOCkpK3JjeF0KKwl2bW92ZHF1CXltbTQsWU1NV09SRFsoKDEyOC0xMjgpKStyY3hdCisJdm1vdmRxdQl5bW01LFlNTVdPUkRbKCgxNjAtMTI4KSkrcmN4XQorCXZtb3ZkcXUJeW1tNixZTU1XT1JEWygoMTkyLTEyOCkpK3JjeF0KKwl2bW92ZHF1CXltbTcsWU1NV09SRFsoKDIyNC0xMjgpKStyY3hdCisJdm1vdmRxdQl5bW04LFlNTVdPUkRbKCgyNTYtMTI4KSkrcmN4XQorCWxlYQlyY3gsWygoNjQrMTI4KSkrcnNwXQorCXZtb3ZkcXUJWU1NV09SRFsoMC0xMjgpK3JjeF0seW1tMAorCXZweG9yCXltbTAseW1tMCx5bW0wCisJdm1vdmRxdQlZTU1XT1JEWygzMi0xMjgpK3JjeF0seW1tMQorCXZweG9yCXltbTEseW1tMSx5bW0xCisJdm1vdmRxdQlZTU1XT1JEWyg2NC0xMjgpK3JjeF0seW1tMgorCXZweG9yCXltbTIseW1tMix5bW0yCisJdm1vdmRxdQlZTU1XT1JEWyg5Ni0xMjgpK3JjeF0seW1tMworCXZweG9yCXltbTMseW1tMyx5bW0zCisJdm1vdmRxdQlZTU1XT1JEWygxMjgtMTI4KStyY3hdLHltbTQKKwl2cHhvcgl5bW00LHltbTQseW1tNAorCXZtb3ZkcXUJWU1NV09SRFsoMTYwLTEyOCkrcmN4XSx5bW01CisJdnB4b3IJeW1tNSx5bW01LHltbTUKKwl2bW92ZHF1CVlNTVdPUkRbKDE5Mi0xMjgpK3JjeF0seW1tNgorCXZweG9yCXltbTYseW1tNix5bW02CisJdm1vdmRxdQlZTU1XT1JEWygyMjQtMTI4KStyY3hdLHltbTcKKwl2cHhvcgl5bW03LHltbTcseW1tNworCXZtb3ZkcXUJWU1NV09SRFsoMjU2LTEyOCkrcmN4XSx5bW04CisJdm1vdmRxYQl5bW04LHltbTAKKwl2bW92ZHF1CVlNTVdPUkRbKDI4OC0xMjgpK3JjeF0seW1tOQorJEwkbXVsXzEwMjRfbm9fbl9jb3B5OgorCWFuZAlyc3AsLTY0CisKKwltb3YJcmJ4LFFXT1JEW3IxM10KKwl2cGJyb2FkY2FzdHEJeW1tMTAsUVdPUkRbcjEzXQorCXZtb3ZkcXUJWU1NV09SRFtyc3BdLHltbTAKKwl4b3IJcjkscjkKK0RCCTB4NjcKKwl4b3IJcjEwLHIxMAorCXhvcglyMTEscjExCisJeG9yCXIxMixyMTIKKworCXZtb3ZkcXUJeW1tMTUsWU1NV09SRFskTCRhbmRfbWFza10KKwltb3YJcjE0ZCw5CisJdm1vdmRxdQlZTU1XT1JEWygyODgtMTI4KStyZGldLHltbTkKKwlqbXAJTkVBUiAkTCRvb3BfbXVsXzEwMjQKKworQUxJR04JMzIKKyRMJG9vcF9tdWxfMTAyNDoKKwl2cHNybHEJeW1tOSx5bW0zLDI5CisJbW92CXJheCxyYngKKwlpbXVsCXJheCxRV09SRFsoKC0xMjgpKStyc2ldCisJYWRkCXJheCxyOQorCW1vdglyMTAscmJ4CisJaW11bAlyMTAsUVdPUkRbKCg4LTEyOCkpK3JzaV0KKwlhZGQJcjEwLFFXT1JEWzgrcnNwXQorCisJbW92CXI5LHJheAorCWltdWwJZWF4LHI4ZAorCWFuZAllYXgsMHgxZmZmZmZmZgorCisJbW92CXIxMSxyYngKKwlpbXVsCXIxMSxRV09SRFsoKDE2LTEyOCkpK3JzaV0KKwlhZGQJcjExLFFXT1JEWzE2K3JzcF0KKworCW1vdglyMTIscmJ4CisJaW11bAlyMTIsUVdPUkRbKCgyNC0xMjgpKStyc2ldCisJYWRkCXIxMixRV09SRFsyNCtyc3BdCisJdnBtdWx1ZHEJeW1tMCx5bW0xMCxZTU1XT1JEWygoMzItMTI4KSkrcnNpXQorCXZtb3ZkCXhtbTExLGVheAorCXZwYWRkcQl5bW0xLHltbTEseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTEwLFlNTVdPUkRbKCg2NC0xMjgpKStyc2ldCisJdnBicm9hZGNhc3RxCXltbTExLHhtbTExCisJdnBhZGRxCXltbTIseW1tMix5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEwLFlNTVdPUkRbKCg5Ni0xMjgpKStyc2ldCisJdnBhbmQJeW1tMyx5bW0zLHltbTE1CisJdnBhZGRxCXltbTMseW1tMyx5bW0xMworCXZwbXVsdWRxCXltbTAseW1tMTAsWU1NV09SRFsoKDEyOC0xMjgpKStyc2ldCisJdnBhZGRxCXltbTQseW1tNCx5bW0wCisJdnBtdWx1ZHEJeW1tMTIseW1tMTAsWU1NV09SRFsoKDE2MC0xMjgpKStyc2ldCisJdnBhZGRxCXltbTUseW1tNSx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEwLFlNTVdPUkRbKCgxOTItMTI4KSkrcnNpXQorCXZwYWRkcQl5bW02LHltbTYseW1tMTMKKwl2cG11bHVkcQl5bW0wLHltbTEwLFlNTVdPUkRbKCgyMjQtMTI4KSkrcnNpXQorCXZwZXJtcQl5bW05LHltbTksMHg5MworCXZwYWRkcQl5bW03LHltbTcseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTEwLFlNTVdPUkRbKCgyNTYtMTI4KSkrcnNpXQorCXZwYnJvYWRjYXN0cQl5bW0xMCxRV09SRFs4K3IxM10KKwl2cGFkZHEJeW1tOCx5bW04LHltbTEyCisKKwltb3YJcmR4LHJheAorCWltdWwJcmF4LFFXT1JEWygoLTEyOCkpK3JjeF0KKwlhZGQJcjkscmF4CisJbW92CXJheCxyZHgKKwlpbXVsCXJheCxRV09SRFsoKDgtMTI4KSkrcmN4XQorCWFkZAlyMTAscmF4CisJbW92CXJheCxyZHgKKwlpbXVsCXJheCxRV09SRFsoKDE2LTEyOCkpK3JjeF0KKwlhZGQJcjExLHJheAorCXNocglyOSwyOQorCWltdWwJcmR4LFFXT1JEWygoMjQtMTI4KSkrcmN4XQorCWFkZAlyMTIscmR4CisJYWRkCXIxMCxyOQorCisJdnBtdWx1ZHEJeW1tMTMseW1tMTEsWU1NV09SRFsoKDMyLTEyOCkpK3JjeF0KKwl2bW92cQlyYngseG1tMTAKKwl2cGFkZHEJeW1tMSx5bW0xLHltbTEzCisJdnBtdWx1ZHEJeW1tMCx5bW0xMSxZTU1XT1JEWygoNjQtMTI4KSkrcmN4XQorCXZwYWRkcQl5bW0yLHltbTIseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTExLFlNTVdPUkRbKCg5Ni0xMjgpKStyY3hdCisJdnBhZGRxCXltbTMseW1tMyx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTExLFlNTVdPUkRbKCgxMjgtMTI4KSkrcmN4XQorCXZwYWRkcQl5bW00LHltbTQseW1tMTMKKwl2cG11bHVkcQl5bW0wLHltbTExLFlNTVdPUkRbKCgxNjAtMTI4KSkrcmN4XQorCXZwYWRkcQl5bW01LHltbTUseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTExLFlNTVdPUkRbKCgxOTItMTI4KSkrcmN4XQorCXZwYWRkcQl5bW02LHltbTYseW1tMTIKKwl2cG11bHVkcQl5bW0xMyx5bW0xMSxZTU1XT1JEWygoMjI0LTEyOCkpK3JjeF0KKwl2cGJsZW5kZAl5bW0xMix5bW05LHltbTE0LDMKKwl2cGFkZHEJeW1tNyx5bW03LHltbTEzCisJdnBtdWx1ZHEJeW1tMCx5bW0xMSxZTU1XT1JEWygoMjU2LTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tMyx5bW0zLHltbTEyCisJdnBhZGRxCXltbTgseW1tOCx5bW0wCisKKwltb3YJcmF4LHJieAorCWltdWwJcmF4LFFXT1JEWygoLTEyOCkpK3JzaV0KKwlhZGQJcjEwLHJheAorCXZtb3ZkcXUJeW1tMTIsWU1NV09SRFsoKC04KzMyLTEyOCkpK3JzaV0KKwltb3YJcmF4LHJieAorCWltdWwJcmF4LFFXT1JEWygoOC0xMjgpKStyc2ldCisJYWRkCXIxMSxyYXgKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgtOCs2NC0xMjgpKStyc2ldCisKKwltb3YJcmF4LHIxMAorCXZwYmxlbmRkCXltbTkseW1tOSx5bW0xNCwweGZjCisJaW11bAllYXgscjhkCisJdnBhZGRxCXltbTQseW1tNCx5bW05CisJYW5kCWVheCwweDFmZmZmZmZmCisKKwlpbXVsCXJieCxRV09SRFsoKDE2LTEyOCkpK3JzaV0KKwlhZGQJcjEyLHJieAorCXZwbXVsdWRxCXltbTEyLHltbTEyLHltbTEwCisJdm1vdmQJeG1tMTEsZWF4CisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgtOCs5Ni0xMjgpKStyc2ldCisJdnBhZGRxCXltbTEseW1tMSx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTEwCisJdnBicm9hZGNhc3RxCXltbTExLHhtbTExCisJdm1vdmRxdQl5bW0xMixZTU1XT1JEWygoLTgrMTI4LTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tMix5bW0yLHltbTEzCisJdnBtdWx1ZHEJeW1tMCx5bW0wLHltbTEwCisJdm1vdmRxdQl5bW0xMyxZTU1XT1JEWygoLTgrMTYwLTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tMyx5bW0zLHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMAorCXZtb3ZkcXUJeW1tMCxZTU1XT1JEWygoLTgrMTkyLTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tNCx5bW00LHltbTEyCisJdnBtdWx1ZHEJeW1tMTMseW1tMTMseW1tMTAKKwl2bW92ZHF1CXltbTEyLFlNTVdPUkRbKCgtOCsyMjQtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW01LHltbTUseW1tMTMKKwl2cG11bHVkcQl5bW0wLHltbTAseW1tMTAKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgtOCsyNTYtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW02LHltbTYseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTEyLHltbTEwCisJdm1vdmRxdQl5bW05LFlNTVdPUkRbKCgtOCsyODgtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW03LHltbTcseW1tMTIKKwl2cG11bHVkcQl5bW0xMyx5bW0xMyx5bW0xMAorCXZwYWRkcQl5bW04LHltbTgseW1tMTMKKwl2cG11bHVkcQl5bW05LHltbTkseW1tMTAKKwl2cGJyb2FkY2FzdHEJeW1tMTAsUVdPUkRbMTYrcjEzXQorCisJbW92CXJkeCxyYXgKKwlpbXVsCXJheCxRV09SRFsoKC0xMjgpKStyY3hdCisJYWRkCXIxMCxyYXgKKwl2bW92ZHF1CXltbTAsWU1NV09SRFsoKC04KzMyLTEyOCkpK3JjeF0KKwltb3YJcmF4LHJkeAorCWltdWwJcmF4LFFXT1JEWygoOC0xMjgpKStyY3hdCisJYWRkCXIxMSxyYXgKKwl2bW92ZHF1CXltbTEyLFlNTVdPUkRbKCgtOCs2NC0xMjgpKStyY3hdCisJc2hyCXIxMCwyOQorCWltdWwJcmR4LFFXT1JEWygoMTYtMTI4KSkrcmN4XQorCWFkZAlyMTIscmR4CisJYWRkCXIxMSxyMTAKKworCXZwbXVsdWRxCXltbTAseW1tMCx5bW0xMQorCXZtb3ZxCXJieCx4bW0xMAorCXZtb3ZkcXUJeW1tMTMsWU1NV09SRFsoKC04Kzk2LTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tMSx5bW0xLHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMQorCXZtb3ZkcXUJeW1tMCxZTU1XT1JEWygoLTgrMTI4LTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tMix5bW0yLHltbTEyCisJdnBtdWx1ZHEJeW1tMTMseW1tMTMseW1tMTEKKwl2bW92ZHF1CXltbTEyLFlNTVdPUkRbKCgtOCsxNjAtMTI4KSkrcmN4XQorCXZwYWRkcQl5bW0zLHltbTMseW1tMTMKKwl2cG11bHVkcQl5bW0wLHltbTAseW1tMTEKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgtOCsxOTItMTI4KSkrcmN4XQorCXZwYWRkcQl5bW00LHltbTQseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTEyLHltbTExCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgtOCsyMjQtMTI4KSkrcmN4XQorCXZwYWRkcQl5bW01LHltbTUseW1tMTIKKwl2cG11bHVkcQl5bW0xMyx5bW0xMyx5bW0xMQorCXZtb3ZkcXUJeW1tMTIsWU1NV09SRFsoKC04KzI1Ni0xMjgpKStyY3hdCisJdnBhZGRxCXltbTYseW1tNix5bW0xMworCXZwbXVsdWRxCXltbTAseW1tMCx5bW0xMQorCXZtb3ZkcXUJeW1tMTMsWU1NV09SRFsoKC04KzI4OC0xMjgpKStyY3hdCisJdnBhZGRxCXltbTcseW1tNyx5bW0wCisJdnBtdWx1ZHEJeW1tMTIseW1tMTIseW1tMTEKKwl2cGFkZHEJeW1tOCx5bW04LHltbTEyCisJdnBtdWx1ZHEJeW1tMTMseW1tMTMseW1tMTEKKwl2cGFkZHEJeW1tOSx5bW05LHltbTEzCisKKwl2bW92ZHF1CXltbTAsWU1NV09SRFsoKC0xNiszMi0xMjgpKStyc2ldCisJbW92CXJheCxyYngKKwlpbXVsCXJheCxRV09SRFsoKC0xMjgpKStyc2ldCisJYWRkCXJheCxyMTEKKworCXZtb3ZkcXUJeW1tMTIsWU1NV09SRFsoKC0xNis2NC0xMjgpKStyc2ldCisJbW92CXIxMSxyYXgKKwlpbXVsCWVheCxyOGQKKwlhbmQJZWF4LDB4MWZmZmZmZmYKKworCWltdWwJcmJ4LFFXT1JEWygoOC0xMjgpKStyc2ldCisJYWRkCXIxMixyYngKKwl2cG11bHVkcQl5bW0wLHltbTAseW1tMTAKKwl2bW92ZAl4bW0xMSxlYXgKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgtMTYrOTYtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW0xLHltbTEseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTEyLHltbTEwCisJdnBicm9hZGNhc3RxCXltbTExLHhtbTExCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgtMTYrMTI4LTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tMix5bW0yLHltbTEyCisJdnBtdWx1ZHEJeW1tMTMseW1tMTMseW1tMTAKKwl2bW92ZHF1CXltbTEyLFlNTVdPUkRbKCgtMTYrMTYwLTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tMyx5bW0zLHltbTEzCisJdnBtdWx1ZHEJeW1tMCx5bW0wLHltbTEwCisJdm1vdmRxdQl5bW0xMyxZTU1XT1JEWygoLTE2KzE5Mi0xMjgpKStyc2ldCisJdnBhZGRxCXltbTQseW1tNCx5bW0wCisJdnBtdWx1ZHEJeW1tMTIseW1tMTIseW1tMTAKKwl2bW92ZHF1CXltbTAsWU1NV09SRFsoKC0xNisyMjQtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW01LHltbTUseW1tMTIKKwl2cG11bHVkcQl5bW0xMyx5bW0xMyx5bW0xMAorCXZtb3ZkcXUJeW1tMTIsWU1NV09SRFsoKC0xNisyNTYtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW02LHltbTYseW1tMTMKKwl2cG11bHVkcQl5bW0wLHltbTAseW1tMTAKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgtMTYrMjg4LTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tNyx5bW03LHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMAorCXZwYWRkcQl5bW04LHltbTgseW1tMTIKKwl2cG11bHVkcQl5bW0xMyx5bW0xMyx5bW0xMAorCXZwYnJvYWRjYXN0cQl5bW0xMCxRV09SRFsyNCtyMTNdCisJdnBhZGRxCXltbTkseW1tOSx5bW0xMworCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgtMTYrMzItMTI4KSkrcmN4XQorCW1vdglyZHgscmF4CisJaW11bAlyYXgsUVdPUkRbKCgtMTI4KSkrcmN4XQorCWFkZAlyMTEscmF4CisJdm1vdmRxdQl5bW0xMixZTU1XT1JEWygoLTE2KzY0LTEyOCkpK3JjeF0KKwlpbXVsCXJkeCxRV09SRFsoKDgtMTI4KSkrcmN4XQorCWFkZAlyMTIscmR4CisJc2hyCXIxMSwyOQorCisJdnBtdWx1ZHEJeW1tMCx5bW0wLHltbTExCisJdm1vdnEJcmJ4LHhtbTEwCisJdm1vdmRxdQl5bW0xMyxZTU1XT1JEWygoLTE2Kzk2LTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tMSx5bW0xLHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMQorCXZtb3ZkcXUJeW1tMCxZTU1XT1JEWygoLTE2KzEyOC0xMjgpKStyY3hdCisJdnBhZGRxCXltbTIseW1tMix5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTExCisJdm1vdmRxdQl5bW0xMixZTU1XT1JEWygoLTE2KzE2MC0xMjgpKStyY3hdCisJdnBhZGRxCXltbTMseW1tMyx5bW0xMworCXZwbXVsdWRxCXltbTAseW1tMCx5bW0xMQorCXZtb3ZkcXUJeW1tMTMsWU1NV09SRFsoKC0xNisxOTItMTI4KSkrcmN4XQorCXZwYWRkcQl5bW00LHltbTQseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTEyLHltbTExCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgtMTYrMjI0LTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tNSx5bW01LHltbTEyCisJdnBtdWx1ZHEJeW1tMTMseW1tMTMseW1tMTEKKwl2bW92ZHF1CXltbTEyLFlNTVdPUkRbKCgtMTYrMjU2LTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tNix5bW02LHltbTEzCisJdnBtdWx1ZHEJeW1tMCx5bW0wLHltbTExCisJdm1vdmRxdQl5bW0xMyxZTU1XT1JEWygoLTE2KzI4OC0xMjgpKStyY3hdCisJdnBhZGRxCXltbTcseW1tNyx5bW0wCisJdnBtdWx1ZHEJeW1tMTIseW1tMTIseW1tMTEKKwl2bW92ZHF1CXltbTAsWU1NV09SRFsoKC0yNCszMi0xMjgpKStyc2ldCisJdnBhZGRxCXltbTgseW1tOCx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTExCisJdm1vdmRxdQl5bW0xMixZTU1XT1JEWygoLTI0KzY0LTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tOSx5bW05LHltbTEzCisKKwlhZGQJcjEyLHIxMQorCWltdWwJcmJ4LFFXT1JEWygoLTEyOCkpK3JzaV0KKwlhZGQJcjEyLHJieAorCisJbW92CXJheCxyMTIKKwlpbXVsCWVheCxyOGQKKwlhbmQJZWF4LDB4MWZmZmZmZmYKKworCXZwbXVsdWRxCXltbTAseW1tMCx5bW0xMAorCXZtb3ZkCXhtbTExLGVheAorCXZtb3ZkcXUJeW1tMTMsWU1NV09SRFsoKC0yNCs5Ni0xMjgpKStyc2ldCisJdnBhZGRxCXltbTEseW1tMSx5bW0wCisJdnBtdWx1ZHEJeW1tMTIseW1tMTIseW1tMTAKKwl2cGJyb2FkY2FzdHEJeW1tMTEseG1tMTEKKwl2bW92ZHF1CXltbTAsWU1NV09SRFsoKC0yNCsxMjgtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW0yLHltbTIseW1tMTIKKwl2cG11bHVkcQl5bW0xMyx5bW0xMyx5bW0xMAorCXZtb3ZkcXUJeW1tMTIsWU1NV09SRFsoKC0yNCsxNjAtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW0zLHltbTMseW1tMTMKKwl2cG11bHVkcQl5bW0wLHltbTAseW1tMTAKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgtMjQrMTkyLTEyOCkpK3JzaV0KKwl2cGFkZHEJeW1tNCx5bW00LHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMAorCXZtb3ZkcXUJeW1tMCxZTU1XT1JEWygoLTI0KzIyNC0xMjgpKStyc2ldCisJdnBhZGRxCXltbTUseW1tNSx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTEwCisJdm1vdmRxdQl5bW0xMixZTU1XT1JEWygoLTI0KzI1Ni0xMjgpKStyc2ldCisJdnBhZGRxCXltbTYseW1tNix5bW0xMworCXZwbXVsdWRxCXltbTAseW1tMCx5bW0xMAorCXZtb3ZkcXUJeW1tMTMsWU1NV09SRFsoKC0yNCsyODgtMTI4KSkrcnNpXQorCXZwYWRkcQl5bW03LHltbTcseW1tMAorCXZwbXVsdWRxCXltbTEyLHltbTEyLHltbTEwCisJdnBhZGRxCXltbTgseW1tOCx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTEwCisJdnBicm9hZGNhc3RxCXltbTEwLFFXT1JEWzMyK3IxM10KKwl2cGFkZHEJeW1tOSx5bW05LHltbTEzCisJYWRkCXIxMywzMgorCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgtMjQrMzItMTI4KSkrcmN4XQorCWltdWwJcmF4LFFXT1JEWygoLTEyOCkpK3JjeF0KKwlhZGQJcjEyLHJheAorCXNocglyMTIsMjkKKworCXZtb3ZkcXUJeW1tMTIsWU1NV09SRFsoKC0yNCs2NC0xMjgpKStyY3hdCisJdnBtdWx1ZHEJeW1tMCx5bW0wLHltbTExCisJdm1vdnEJcmJ4LHhtbTEwCisJdm1vdmRxdQl5bW0xMyxZTU1XT1JEWygoLTI0Kzk2LTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tMCx5bW0xLHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMQorCXZtb3ZkcXUJWU1NV09SRFtyc3BdLHltbTAKKwl2cGFkZHEJeW1tMSx5bW0yLHltbTEyCisJdm1vdmRxdQl5bW0wLFlNTVdPUkRbKCgtMjQrMTI4LTEyOCkpK3JjeF0KKwl2cG11bHVkcQl5bW0xMyx5bW0xMyx5bW0xMQorCXZtb3ZkcXUJeW1tMTIsWU1NV09SRFsoKC0yNCsxNjAtMTI4KSkrcmN4XQorCXZwYWRkcQl5bW0yLHltbTMseW1tMTMKKwl2cG11bHVkcQl5bW0wLHltbTAseW1tMTEKKwl2bW92ZHF1CXltbTEzLFlNTVdPUkRbKCgtMjQrMTkyLTEyOCkpK3JjeF0KKwl2cGFkZHEJeW1tMyx5bW00LHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMQorCXZtb3ZkcXUJeW1tMCxZTU1XT1JEWygoLTI0KzIyNC0xMjgpKStyY3hdCisJdnBhZGRxCXltbTQseW1tNSx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTExCisJdm1vdmRxdQl5bW0xMixZTU1XT1JEWygoLTI0KzI1Ni0xMjgpKStyY3hdCisJdnBhZGRxCXltbTUseW1tNix5bW0xMworCXZwbXVsdWRxCXltbTAseW1tMCx5bW0xMQorCXZtb3ZkcXUJeW1tMTMsWU1NV09SRFsoKC0yNCsyODgtMTI4KSkrcmN4XQorCW1vdglyOSxyMTIKKwl2cGFkZHEJeW1tNix5bW03LHltbTAKKwl2cG11bHVkcQl5bW0xMix5bW0xMix5bW0xMQorCWFkZAlyOSxRV09SRFtyc3BdCisJdnBhZGRxCXltbTcseW1tOCx5bW0xMgorCXZwbXVsdWRxCXltbTEzLHltbTEzLHltbTExCisJdm1vdnEJeG1tMTIscjEyCisJdnBhZGRxCXltbTgseW1tOSx5bW0xMworCisJZGVjCXIxNGQKKwlqbnoJTkVBUiAkTCRvb3BfbXVsXzEwMjQKKwl2cGFkZHEJeW1tMCx5bW0xMixZTU1XT1JEW3JzcF0KKworCXZwc3JscQl5bW0xMix5bW0wLDI5CisJdnBhbmQJeW1tMCx5bW0wLHltbTE1CisJdnBzcmxxCXltbTEzLHltbTEsMjkKKwl2cGFuZAl5bW0xLHltbTEseW1tMTUKKwl2cHNybHEJeW1tMTAseW1tMiwyOQorCXZwZXJtcQl5bW0xMix5bW0xMiwweDkzCisJdnBhbmQJeW1tMix5bW0yLHltbTE1CisJdnBzcmxxCXltbTExLHltbTMsMjkKKwl2cGVybXEJeW1tMTMseW1tMTMsMHg5MworCXZwYW5kCXltbTMseW1tMyx5bW0xNQorCisJdnBibGVuZGQJeW1tOSx5bW0xMix5bW0xNCwzCisJdnBlcm1xCXltbTEwLHltbTEwLDB4OTMKKwl2cGJsZW5kZAl5bW0xMix5bW0xMyx5bW0xMiwzCisJdnBlcm1xCXltbTExLHltbTExLDB4OTMKKwl2cGFkZHEJeW1tMCx5bW0wLHltbTkKKwl2cGJsZW5kZAl5bW0xMyx5bW0xMCx5bW0xMywzCisJdnBhZGRxCXltbTEseW1tMSx5bW0xMgorCXZwYmxlbmRkCXltbTEwLHltbTExLHltbTEwLDMKKwl2cGFkZHEJeW1tMix5bW0yLHltbTEzCisJdnBibGVuZGQJeW1tMTEseW1tMTQseW1tMTEsMworCXZwYWRkcQl5bW0zLHltbTMseW1tMTAKKwl2cGFkZHEJeW1tNCx5bW00LHltbTExCisKKwl2cHNybHEJeW1tMTIseW1tMCwyOQorCXZwYW5kCXltbTAseW1tMCx5bW0xNQorCXZwc3JscQl5bW0xMyx5bW0xLDI5CisJdnBhbmQJeW1tMSx5bW0xLHltbTE1CisJdnBzcmxxCXltbTEwLHltbTIsMjkKKwl2cGVybXEJeW1tMTIseW1tMTIsMHg5MworCXZwYW5kCXltbTIseW1tMix5bW0xNQorCXZwc3JscQl5bW0xMSx5bW0zLDI5CisJdnBlcm1xCXltbTEzLHltbTEzLDB4OTMKKwl2cGFuZAl5bW0zLHltbTMseW1tMTUKKwl2cGVybXEJeW1tMTAseW1tMTAsMHg5MworCisJdnBibGVuZGQJeW1tOSx5bW0xMix5bW0xNCwzCisJdnBlcm1xCXltbTExLHltbTExLDB4OTMKKwl2cGJsZW5kZAl5bW0xMix5bW0xMyx5bW0xMiwzCisJdnBhZGRxCXltbTAseW1tMCx5bW05CisJdnBibGVuZGQJeW1tMTMseW1tMTAseW1tMTMsMworCXZwYWRkcQl5bW0xLHltbTEseW1tMTIKKwl2cGJsZW5kZAl5bW0xMCx5bW0xMSx5bW0xMCwzCisJdnBhZGRxCXltbTIseW1tMix5bW0xMworCXZwYmxlbmRkCXltbTExLHltbTE0LHltbTExLDMKKwl2cGFkZHEJeW1tMyx5bW0zLHltbTEwCisJdnBhZGRxCXltbTQseW1tNCx5bW0xMQorCisJdm1vdmRxdQlZTU1XT1JEWygwLTEyOCkrcmRpXSx5bW0wCisJdm1vdmRxdQlZTU1XT1JEWygzMi0xMjgpK3JkaV0seW1tMQorCXZtb3ZkcXUJWU1NV09SRFsoNjQtMTI4KStyZGldLHltbTIKKwl2bW92ZHF1CVlNTVdPUkRbKDk2LTEyOCkrcmRpXSx5bW0zCisJdnBzcmxxCXltbTEyLHltbTQsMjkKKwl2cGFuZAl5bW00LHltbTQseW1tMTUKKwl2cHNybHEJeW1tMTMseW1tNSwyOQorCXZwYW5kCXltbTUseW1tNSx5bW0xNQorCXZwc3JscQl5bW0xMCx5bW02LDI5CisJdnBlcm1xCXltbTEyLHltbTEyLDB4OTMKKwl2cGFuZAl5bW02LHltbTYseW1tMTUKKwl2cHNybHEJeW1tMTEseW1tNywyOQorCXZwZXJtcQl5bW0xMyx5bW0xMywweDkzCisJdnBhbmQJeW1tNyx5bW03LHltbTE1CisJdnBzcmxxCXltbTAseW1tOCwyOQorCXZwZXJtcQl5bW0xMCx5bW0xMCwweDkzCisJdnBhbmQJeW1tOCx5bW04LHltbTE1CisJdnBlcm1xCXltbTExLHltbTExLDB4OTMKKworCXZwYmxlbmRkCXltbTkseW1tMTIseW1tMTQsMworCXZwZXJtcQl5bW0wLHltbTAsMHg5MworCXZwYmxlbmRkCXltbTEyLHltbTEzLHltbTEyLDMKKwl2cGFkZHEJeW1tNCx5bW00LHltbTkKKwl2cGJsZW5kZAl5bW0xMyx5bW0xMCx5bW0xMywzCisJdnBhZGRxCXltbTUseW1tNSx5bW0xMgorCXZwYmxlbmRkCXltbTEwLHltbTExLHltbTEwLDMKKwl2cGFkZHEJeW1tNix5bW02LHltbTEzCisJdnBibGVuZGQJeW1tMTEseW1tMCx5bW0xMSwzCisJdnBhZGRxCXltbTcseW1tNyx5bW0xMAorCXZwYWRkcQl5bW04LHltbTgseW1tMTEKKworCXZwc3JscQl5bW0xMix5bW00LDI5CisJdnBhbmQJeW1tNCx5bW00LHltbTE1CisJdnBzcmxxCXltbTEzLHltbTUsMjkKKwl2cGFuZAl5bW01LHltbTUseW1tMTUKKwl2cHNybHEJeW1tMTAseW1tNiwyOQorCXZwZXJtcQl5bW0xMix5bW0xMiwweDkzCisJdnBhbmQJeW1tNix5bW02LHltbTE1CisJdnBzcmxxCXltbTExLHltbTcsMjkKKwl2cGVybXEJeW1tMTMseW1tMTMsMHg5MworCXZwYW5kCXltbTcseW1tNyx5bW0xNQorCXZwc3JscQl5bW0wLHltbTgsMjkKKwl2cGVybXEJeW1tMTAseW1tMTAsMHg5MworCXZwYW5kCXltbTgseW1tOCx5bW0xNQorCXZwZXJtcQl5bW0xMSx5bW0xMSwweDkzCisKKwl2cGJsZW5kZAl5bW05LHltbTEyLHltbTE0LDMKKwl2cGVybXEJeW1tMCx5bW0wLDB4OTMKKwl2cGJsZW5kZAl5bW0xMix5bW0xMyx5bW0xMiwzCisJdnBhZGRxCXltbTQseW1tNCx5bW05CisJdnBibGVuZGQJeW1tMTMseW1tMTAseW1tMTMsMworCXZwYWRkcQl5bW01LHltbTUseW1tMTIKKwl2cGJsZW5kZAl5bW0xMCx5bW0xMSx5bW0xMCwzCisJdnBhZGRxCXltbTYseW1tNix5bW0xMworCXZwYmxlbmRkCXltbTExLHltbTAseW1tMTEsMworCXZwYWRkcQl5bW03LHltbTcseW1tMTAKKwl2cGFkZHEJeW1tOCx5bW04LHltbTExCisKKwl2bW92ZHF1CVlNTVdPUkRbKDEyOC0xMjgpK3JkaV0seW1tNAorCXZtb3ZkcXUJWU1NV09SRFsoMTYwLTEyOCkrcmRpXSx5bW01CisJdm1vdmRxdQlZTU1XT1JEWygxOTItMTI4KStyZGldLHltbTYKKwl2bW92ZHF1CVlNTVdPUkRbKDIyNC0xMjgpK3JkaV0seW1tNworCXZtb3ZkcXUJWU1NV09SRFsoMjU2LTEyOCkrcmRpXSx5bW04CisJdnplcm91cHBlcgorCisJbW92CXJheCxyYnAKKworJEwkbXVsXzEwMjRfaW5fdGFpbDoKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTIxNikpK3JheF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWygoLTIwMCkpK3JheF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoLTE4NCkpK3JheF0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTE2OCkpK3JheF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFsoKC0xNTIpKStyYXhdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbKCgtMTM2KSkrcmF4XQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWygoLTEyMCkpK3JheF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsoKC0xMDQpKStyYXhdCisJbW92YXBzCXhtbTE0LFhNTVdPUkRbKCgtODgpKStyYXhdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbKCgtNzIpKStyYXhdCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JheF0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyYXhdCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYXhdCisKKwlsZWEJcnNwLFtyYXhdCisKKyRMJG11bF8xMDI0X2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX3JzYXpfMTAyNF9tdWxfYXZ4MjoKK2dsb2JhbAlyc2F6XzEwMjRfcmVkMm5vcm1fYXZ4MgorCitBTElHTgkzMgorcnNhel8xMDI0X3JlZDJub3JtX2F2eDI6CisJc3ViCXJkeCwtMTI4CisJeG9yCXJheCxyYXgKKwltb3YJcjgsUVdPUkRbKCgtMTI4KSkrcmR4XQorCW1vdglyOSxRV09SRFsoKC0xMjApKStyZHhdCisJbW92CXIxMCxRV09SRFsoKC0xMTIpKStyZHhdCisJc2hsCXI4LDAKKwlzaGwJcjksMjkKKwltb3YJcjExLHIxMAorCXNobAlyMTAsNTgKKwlzaHIJcjExLDYKKwlhZGQJcmF4LHI4CisJYWRkCXJheCxyOQorCWFkZAlyYXgscjEwCisJYWRjCXIxMSwwCisJbW92CVFXT1JEW3JjeF0scmF4CisJbW92CXJheCxyMTEKKwltb3YJcjgsUVdPUkRbKCgtMTA0KSkrcmR4XQorCW1vdglyOSxRV09SRFsoKC05NikpK3JkeF0KKwlzaGwJcjgsMjMKKwltb3YJcjEwLHI5CisJc2hsCXI5LDUyCisJc2hyCXIxMCwxMgorCWFkZAlyYXgscjgKKwlhZGQJcmF4LHI5CisJYWRjCXIxMCwwCisJbW92CVFXT1JEWzgrcmN4XSxyYXgKKwltb3YJcmF4LHIxMAorCW1vdglyMTEsUVdPUkRbKCgtODgpKStyZHhdCisJbW92CXI4LFFXT1JEWygoLTgwKSkrcmR4XQorCXNobAlyMTEsMTcKKwltb3YJcjkscjgKKwlzaGwJcjgsNDYKKwlzaHIJcjksMTgKKwlhZGQJcmF4LHIxMQorCWFkZAlyYXgscjgKKwlhZGMJcjksMAorCW1vdglRV09SRFsxNityY3hdLHJheAorCW1vdglyYXgscjkKKwltb3YJcjEwLFFXT1JEWygoLTcyKSkrcmR4XQorCW1vdglyMTEsUVdPUkRbKCgtNjQpKStyZHhdCisJc2hsCXIxMCwxMQorCW1vdglyOCxyMTEKKwlzaGwJcjExLDQwCisJc2hyCXI4LDI0CisJYWRkCXJheCxyMTAKKwlhZGQJcmF4LHIxMQorCWFkYwlyOCwwCisJbW92CVFXT1JEWzI0K3JjeF0scmF4CisJbW92CXJheCxyOAorCW1vdglyOSxRV09SRFsoKC01NikpK3JkeF0KKwltb3YJcjEwLFFXT1JEWygoLTQ4KSkrcmR4XQorCW1vdglyMTEsUVdPUkRbKCgtNDApKStyZHhdCisJc2hsCXI5LDUKKwlzaGwJcjEwLDM0CisJbW92CXI4LHIxMQorCXNobAlyMTEsNjMKKwlzaHIJcjgsMQorCWFkZAlyYXgscjkKKwlhZGQJcmF4LHIxMAorCWFkZAlyYXgscjExCisJYWRjCXI4LDAKKwltb3YJUVdPUkRbMzIrcmN4XSxyYXgKKwltb3YJcmF4LHI4CisJbW92CXI5LFFXT1JEWygoLTMyKSkrcmR4XQorCW1vdglyMTAsUVdPUkRbKCgtMjQpKStyZHhdCisJc2hsCXI5LDI4CisJbW92CXIxMSxyMTAKKwlzaGwJcjEwLDU3CisJc2hyCXIxMSw3CisJYWRkCXJheCxyOQorCWFkZAlyYXgscjEwCisJYWRjCXIxMSwwCisJbW92CVFXT1JEWzQwK3JjeF0scmF4CisJbW92CXJheCxyMTEKKwltb3YJcjgsUVdPUkRbKCgtMTYpKStyZHhdCisJbW92CXI5LFFXT1JEWygoLTgpKStyZHhdCisJc2hsCXI4LDIyCisJbW92CXIxMCxyOQorCXNobAlyOSw1MQorCXNocglyMTAsMTMKKwlhZGQJcmF4LHI4CisJYWRkCXJheCxyOQorCWFkYwlyMTAsMAorCW1vdglRV09SRFs0OCtyY3hdLHJheAorCW1vdglyYXgscjEwCisJbW92CXIxMSxRV09SRFtyZHhdCisJbW92CXI4LFFXT1JEWzgrcmR4XQorCXNobAlyMTEsMTYKKwltb3YJcjkscjgKKwlzaGwJcjgsNDUKKwlzaHIJcjksMTkKKwlhZGQJcmF4LHIxMQorCWFkZAlyYXgscjgKKwlhZGMJcjksMAorCW1vdglRV09SRFs1NityY3hdLHJheAorCW1vdglyYXgscjkKKwltb3YJcjEwLFFXT1JEWzE2K3JkeF0KKwltb3YJcjExLFFXT1JEWzI0K3JkeF0KKwlzaGwJcjEwLDEwCisJbW92CXI4LHIxMQorCXNobAlyMTEsMzkKKwlzaHIJcjgsMjUKKwlhZGQJcmF4LHIxMAorCWFkZAlyYXgscjExCisJYWRjCXI4LDAKKwltb3YJUVdPUkRbNjQrcmN4XSxyYXgKKwltb3YJcmF4LHI4CisJbW92CXI5LFFXT1JEWzMyK3JkeF0KKwltb3YJcjEwLFFXT1JEWzQwK3JkeF0KKwltb3YJcjExLFFXT1JEWzQ4K3JkeF0KKwlzaGwJcjksNAorCXNobAlyMTAsMzMKKwltb3YJcjgscjExCisJc2hsCXIxMSw2MgorCXNocglyOCwyCisJYWRkCXJheCxyOQorCWFkZAlyYXgscjEwCisJYWRkCXJheCxyMTEKKwlhZGMJcjgsMAorCW1vdglRV09SRFs3MityY3hdLHJheAorCW1vdglyYXgscjgKKwltb3YJcjksUVdPUkRbNTYrcmR4XQorCW1vdglyMTAsUVdPUkRbNjQrcmR4XQorCXNobAlyOSwyNworCW1vdglyMTEscjEwCisJc2hsCXIxMCw1NgorCXNocglyMTEsOAorCWFkZAlyYXgscjkKKwlhZGQJcmF4LHIxMAorCWFkYwlyMTEsMAorCW1vdglRV09SRFs4MCtyY3hdLHJheAorCW1vdglyYXgscjExCisJbW92CXI4LFFXT1JEWzcyK3JkeF0KKwltb3YJcjksUVdPUkRbODArcmR4XQorCXNobAlyOCwyMQorCW1vdglyMTAscjkKKwlzaGwJcjksNTAKKwlzaHIJcjEwLDE0CisJYWRkCXJheCxyOAorCWFkZAlyYXgscjkKKwlhZGMJcjEwLDAKKwltb3YJUVdPUkRbODgrcmN4XSxyYXgKKwltb3YJcmF4LHIxMAorCW1vdglyMTEsUVdPUkRbODgrcmR4XQorCW1vdglyOCxRV09SRFs5NityZHhdCisJc2hsCXIxMSwxNQorCW1vdglyOSxyOAorCXNobAlyOCw0NAorCXNocglyOSwyMAorCWFkZAlyYXgscjExCisJYWRkCXJheCxyOAorCWFkYwlyOSwwCisJbW92CVFXT1JEWzk2K3JjeF0scmF4CisJbW92CXJheCxyOQorCW1vdglyMTAsUVdPUkRbMTA0K3JkeF0KKwltb3YJcjExLFFXT1JEWzExMityZHhdCisJc2hsCXIxMCw5CisJbW92CXI4LHIxMQorCXNobAlyMTEsMzgKKwlzaHIJcjgsMjYKKwlhZGQJcmF4LHIxMAorCWFkZAlyYXgscjExCisJYWRjCXI4LDAKKwltb3YJUVdPUkRbMTA0K3JjeF0scmF4CisJbW92CXJheCxyOAorCW1vdglyOSxRV09SRFsxMjArcmR4XQorCW1vdglyMTAsUVdPUkRbMTI4K3JkeF0KKwltb3YJcjExLFFXT1JEWzEzNityZHhdCisJc2hsCXI5LDMKKwlzaGwJcjEwLDMyCisJbW92CXI4LHIxMQorCXNobAlyMTEsNjEKKwlzaHIJcjgsMworCWFkZAlyYXgscjkKKwlhZGQJcmF4LHIxMAorCWFkZAlyYXgscjExCisJYWRjCXI4LDAKKwltb3YJUVdPUkRbMTEyK3JjeF0scmF4CisJbW92CXJheCxyOAorCW1vdglyOSxRV09SRFsxNDQrcmR4XQorCW1vdglyMTAsUVdPUkRbMTUyK3JkeF0KKwlzaGwJcjksMjYKKwltb3YJcjExLHIxMAorCXNobAlyMTAsNTUKKwlzaHIJcjExLDkKKwlhZGQJcmF4LHI5CisJYWRkCXJheCxyMTAKKwlhZGMJcjExLDAKKwltb3YJUVdPUkRbMTIwK3JjeF0scmF4CisJbW92CXJheCxyMTEKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitnbG9iYWwJcnNhel8xMDI0X25vcm0ycmVkX2F2eDIKKworQUxJR04JMzIKK3JzYXpfMTAyNF9ub3JtMnJlZF9hdngyOgorCXN1YglyY3gsLTEyOAorCW1vdglyOCxRV09SRFtyZHhdCisJbW92CWVheCwweDFmZmZmZmZmCisJbW92CXI5LFFXT1JEWzgrcmR4XQorCW1vdglyMTEscjgKKwlzaHIJcjExLDAKKwlhbmQJcjExLHJheAorCW1vdglRV09SRFsoKC0xMjgpKStyY3hdLHIxMQorCW1vdglyMTAscjgKKwlzaHIJcjEwLDI5CisJYW5kCXIxMCxyYXgKKwltb3YJUVdPUkRbKCgtMTIwKSkrcmN4XSxyMTAKKwlzaHJkCXI4LHI5LDU4CisJYW5kCXI4LHJheAorCW1vdglRV09SRFsoKC0xMTIpKStyY3hdLHI4CisJbW92CXIxMCxRV09SRFsxNityZHhdCisJbW92CXI4LHI5CisJc2hyCXI4LDIzCisJYW5kCXI4LHJheAorCW1vdglRV09SRFsoKC0xMDQpKStyY3hdLHI4CisJc2hyZAlyOSxyMTAsNTIKKwlhbmQJcjkscmF4CisJbW92CVFXT1JEWygoLTk2KSkrcmN4XSxyOQorCW1vdglyMTEsUVdPUkRbMjQrcmR4XQorCW1vdglyOSxyMTAKKwlzaHIJcjksMTcKKwlhbmQJcjkscmF4CisJbW92CVFXT1JEWygoLTg4KSkrcmN4XSxyOQorCXNocmQJcjEwLHIxMSw0NgorCWFuZAlyMTAscmF4CisJbW92CVFXT1JEWygoLTgwKSkrcmN4XSxyMTAKKwltb3YJcjgsUVdPUkRbMzIrcmR4XQorCW1vdglyMTAscjExCisJc2hyCXIxMCwxMQorCWFuZAlyMTAscmF4CisJbW92CVFXT1JEWygoLTcyKSkrcmN4XSxyMTAKKwlzaHJkCXIxMSxyOCw0MAorCWFuZAlyMTEscmF4CisJbW92CVFXT1JEWygoLTY0KSkrcmN4XSxyMTEKKwltb3YJcjksUVdPUkRbNDArcmR4XQorCW1vdglyMTEscjgKKwlzaHIJcjExLDUKKwlhbmQJcjExLHJheAorCW1vdglRV09SRFsoKC01NikpK3JjeF0scjExCisJbW92CXIxMCxyOAorCXNocglyMTAsMzQKKwlhbmQJcjEwLHJheAorCW1vdglRV09SRFsoKC00OCkpK3JjeF0scjEwCisJc2hyZAlyOCxyOSw2MworCWFuZAlyOCxyYXgKKwltb3YJUVdPUkRbKCgtNDApKStyY3hdLHI4CisJbW92CXIxMCxRV09SRFs0OCtyZHhdCisJbW92CXI4LHI5CisJc2hyCXI4LDI4CisJYW5kCXI4LHJheAorCW1vdglRV09SRFsoKC0zMikpK3JjeF0scjgKKwlzaHJkCXI5LHIxMCw1NworCWFuZAlyOSxyYXgKKwltb3YJUVdPUkRbKCgtMjQpKStyY3hdLHI5CisJbW92CXIxMSxRV09SRFs1NityZHhdCisJbW92CXI5LHIxMAorCXNocglyOSwyMgorCWFuZAlyOSxyYXgKKwltb3YJUVdPUkRbKCgtMTYpKStyY3hdLHI5CisJc2hyZAlyMTAscjExLDUxCisJYW5kCXIxMCxyYXgKKwltb3YJUVdPUkRbKCgtOCkpK3JjeF0scjEwCisJbW92CXI4LFFXT1JEWzY0K3JkeF0KKwltb3YJcjEwLHIxMQorCXNocglyMTAsMTYKKwlhbmQJcjEwLHJheAorCW1vdglRV09SRFtyY3hdLHIxMAorCXNocmQJcjExLHI4LDQ1CisJYW5kCXIxMSxyYXgKKwltb3YJUVdPUkRbOCtyY3hdLHIxMQorCW1vdglyOSxRV09SRFs3MityZHhdCisJbW92CXIxMSxyOAorCXNocglyMTEsMTAKKwlhbmQJcjExLHJheAorCW1vdglRV09SRFsxNityY3hdLHIxMQorCXNocmQJcjgscjksMzkKKwlhbmQJcjgscmF4CisJbW92CVFXT1JEWzI0K3JjeF0scjgKKwltb3YJcjEwLFFXT1JEWzgwK3JkeF0KKwltb3YJcjgscjkKKwlzaHIJcjgsNAorCWFuZAlyOCxyYXgKKwltb3YJUVdPUkRbMzIrcmN4XSxyOAorCW1vdglyMTEscjkKKwlzaHIJcjExLDMzCisJYW5kCXIxMSxyYXgKKwltb3YJUVdPUkRbNDArcmN4XSxyMTEKKwlzaHJkCXI5LHIxMCw2MgorCWFuZAlyOSxyYXgKKwltb3YJUVdPUkRbNDgrcmN4XSxyOQorCW1vdglyMTEsUVdPUkRbODgrcmR4XQorCW1vdglyOSxyMTAKKwlzaHIJcjksMjcKKwlhbmQJcjkscmF4CisJbW92CVFXT1JEWzU2K3JjeF0scjkKKwlzaHJkCXIxMCxyMTEsNTYKKwlhbmQJcjEwLHJheAorCW1vdglRV09SRFs2NCtyY3hdLHIxMAorCW1vdglyOCxRV09SRFs5NityZHhdCisJbW92CXIxMCxyMTEKKwlzaHIJcjEwLDIxCisJYW5kCXIxMCxyYXgKKwltb3YJUVdPUkRbNzIrcmN4XSxyMTAKKwlzaHJkCXIxMSxyOCw1MAorCWFuZAlyMTEscmF4CisJbW92CVFXT1JEWzgwK3JjeF0scjExCisJbW92CXI5LFFXT1JEWzEwNCtyZHhdCisJbW92CXIxMSxyOAorCXNocglyMTEsMTUKKwlhbmQJcjExLHJheAorCW1vdglRV09SRFs4OCtyY3hdLHIxMQorCXNocmQJcjgscjksNDQKKwlhbmQJcjgscmF4CisJbW92CVFXT1JEWzk2K3JjeF0scjgKKwltb3YJcjEwLFFXT1JEWzExMityZHhdCisJbW92CXI4LHI5CisJc2hyCXI4LDkKKwlhbmQJcjgscmF4CisJbW92CVFXT1JEWzEwNCtyY3hdLHI4CisJc2hyZAlyOSxyMTAsMzgKKwlhbmQJcjkscmF4CisJbW92CVFXT1JEWzExMityY3hdLHI5CisJbW92CXIxMSxRV09SRFsxMjArcmR4XQorCW1vdglyOSxyMTAKKwlzaHIJcjksMworCWFuZAlyOSxyYXgKKwltb3YJUVdPUkRbMTIwK3JjeF0scjkKKwltb3YJcjgscjEwCisJc2hyCXI4LDMyCisJYW5kCXI4LHJheAorCW1vdglRV09SRFsxMjgrcmN4XSxyOAorCXNocmQJcjEwLHIxMSw2MQorCWFuZAlyMTAscmF4CisJbW92CVFXT1JEWzEzNityY3hdLHIxMAorCXhvcglyOCxyOAorCW1vdglyMTAscjExCisJc2hyCXIxMCwyNgorCWFuZAlyMTAscmF4CisJbW92CVFXT1JEWzE0NCtyY3hdLHIxMAorCXNocmQJcjExLHI4LDU1CisJYW5kCXIxMSxyYXgKKwltb3YJUVdPUkRbMTUyK3JjeF0scjExCisJbW92CVFXT1JEWzE2MCtyY3hdLHI4CisJbW92CVFXT1JEWzE2OCtyY3hdLHI4CisJbW92CVFXT1JEWzE3NityY3hdLHI4CisJbW92CVFXT1JEWzE4NCtyY3hdLHI4CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK2dsb2JhbAlyc2F6XzEwMjRfc2NhdHRlcjVfYXZ4MgorCitBTElHTgkzMgorcnNhel8xMDI0X3NjYXR0ZXI1X2F2eDI6CisJdnplcm91cHBlcgorCXZtb3ZkcXUJeW1tNSxZTU1XT1JEWyRMJHNjYXR0ZXJfcGVybWRdCisJc2hsCXI4ZCw0CisJbGVhCXJjeCxbcjgqMStyY3hdCisJbW92CWVheCw5CisJam1wCU5FQVIgJEwkb29wX3NjYXR0ZXJfMTAyNAorCitBTElHTgkzMgorJEwkb29wX3NjYXR0ZXJfMTAyNDoKKwl2bW92ZHF1CXltbTAsWU1NV09SRFtyZHhdCisJbGVhCXJkeCxbMzIrcmR4XQorCXZwZXJtZAl5bW0wLHltbTUseW1tMAorCXZtb3ZkcXUJWE1NV09SRFtyY3hdLHhtbTAKKwlsZWEJcmN4LFs1MTIrcmN4XQorCWRlYwllYXgKKwlqbnoJTkVBUiAkTCRvb3Bfc2NhdHRlcl8xMDI0CisKKwl2emVyb3VwcGVyCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworZ2xvYmFsCXJzYXpfMTAyNF9nYXRoZXI1X2F2eDIKKworQUxJR04JMzIKK3JzYXpfMTAyNF9nYXRoZXI1X2F2eDI6CisKKwl2emVyb3VwcGVyCisJbW92CXIxMSxyc3AKKworCWxlYQlyYXgsWygoLTEzNikpK3JzcF0KKyRMJFNFSF9iZWdpbl9yc2F6XzEwMjRfZ2F0aGVyNToKKworREIJMHg0OCwweDhkLDB4NjAsMHhlMAorREIJMHhjNSwweGY4LDB4MjksMHg3MCwweGUwCitEQgkweGM1LDB4ZjgsMHgyOSwweDc4LDB4ZjAKK0RCCTB4YzUsMHg3OCwweDI5LDB4NDAsMHgwMAorREIJMHhjNSwweDc4LDB4MjksMHg0OCwweDEwCitEQgkweGM1LDB4NzgsMHgyOSwweDUwLDB4MjAKK0RCCTB4YzUsMHg3OCwweDI5LDB4NTgsMHgzMAorREIJMHhjNSwweDc4LDB4MjksMHg2MCwweDQwCitEQgkweGM1LDB4NzgsMHgyOSwweDY4LDB4NTAKK0RCCTB4YzUsMHg3OCwweDI5LDB4NzAsMHg2MAorREIJMHhjNSwweDc4LDB4MjksMHg3OCwweDcwCisJbGVhCXJzcCxbKCgtMjU2KSkrcnNwXQorCWFuZAlyc3AsLTMyCisJbGVhCXIxMCxbJEwkaW5jXQorCWxlYQlyYXgsWygoLTEyOCkpK3JzcF0KKworCXZtb3ZkCXhtbTQscjhkCisJdm1vdmRxYQl5bW0wLFlNTVdPUkRbcjEwXQorCXZtb3ZkcWEJeW1tMSxZTU1XT1JEWzMyK3IxMF0KKwl2bW92ZHFhCXltbTUsWU1NV09SRFs2NCtyMTBdCisJdnBicm9hZGNhc3RkCXltbTQseG1tNAorCisJdnBhZGRkCXltbTIseW1tMCx5bW01CisJdnBjbXBlcWQJeW1tMCx5bW0wLHltbTQKKwl2cGFkZGQJeW1tMyx5bW0xLHltbTUKKwl2cGNtcGVxZAl5bW0xLHltbTEseW1tNAorCXZtb3ZkcWEJWU1NV09SRFsoMCsxMjgpK3JheF0seW1tMAorCXZwYWRkZAl5bW0wLHltbTIseW1tNQorCXZwY21wZXFkCXltbTIseW1tMix5bW00CisJdm1vdmRxYQlZTU1XT1JEWygzMisxMjgpK3JheF0seW1tMQorCXZwYWRkZAl5bW0xLHltbTMseW1tNQorCXZwY21wZXFkCXltbTMseW1tMyx5bW00CisJdm1vdmRxYQlZTU1XT1JEWyg2NCsxMjgpK3JheF0seW1tMgorCXZwYWRkZAl5bW0yLHltbTAseW1tNQorCXZwY21wZXFkCXltbTAseW1tMCx5bW00CisJdm1vdmRxYQlZTU1XT1JEWyg5NisxMjgpK3JheF0seW1tMworCXZwYWRkZAl5bW0zLHltbTEseW1tNQorCXZwY21wZXFkCXltbTEseW1tMSx5bW00CisJdm1vdmRxYQlZTU1XT1JEWygxMjgrMTI4KStyYXhdLHltbTAKKwl2cGFkZGQJeW1tOCx5bW0yLHltbTUKKwl2cGNtcGVxZAl5bW0yLHltbTIseW1tNAorCXZtb3ZkcWEJWU1NV09SRFsoMTYwKzEyOCkrcmF4XSx5bW0xCisJdnBhZGRkCXltbTkseW1tMyx5bW01CisJdnBjbXBlcWQJeW1tMyx5bW0zLHltbTQKKwl2bW92ZHFhCVlNTVdPUkRbKDE5MisxMjgpK3JheF0seW1tMgorCXZwYWRkZAl5bW0xMCx5bW04LHltbTUKKwl2cGNtcGVxZAl5bW04LHltbTgseW1tNAorCXZtb3ZkcWEJWU1NV09SRFsoMjI0KzEyOCkrcmF4XSx5bW0zCisJdnBhZGRkCXltbTExLHltbTkseW1tNQorCXZwY21wZXFkCXltbTkseW1tOSx5bW00CisJdnBhZGRkCXltbTEyLHltbTEwLHltbTUKKwl2cGNtcGVxZAl5bW0xMCx5bW0xMCx5bW00CisJdnBhZGRkCXltbTEzLHltbTExLHltbTUKKwl2cGNtcGVxZAl5bW0xMSx5bW0xMSx5bW00CisJdnBhZGRkCXltbTE0LHltbTEyLHltbTUKKwl2cGNtcGVxZAl5bW0xMix5bW0xMix5bW00CisJdnBhZGRkCXltbTE1LHltbTEzLHltbTUKKwl2cGNtcGVxZAl5bW0xMyx5bW0xMyx5bW00CisJdnBjbXBlcWQJeW1tMTQseW1tMTQseW1tNAorCXZwY21wZXFkCXltbTE1LHltbTE1LHltbTQKKworCXZtb3ZkcWEJeW1tNyxZTU1XT1JEWygoLTMyKSkrcjEwXQorCWxlYQlyZHgsWzEyOCtyZHhdCisJbW92CXI4ZCw5CisKKyRMJG9vcF9nYXRoZXJfMTAyNDoKKwl2bW92ZHFhCXltbTAsWU1NV09SRFsoKDAtMTI4KSkrcmR4XQorCXZtb3ZkcWEJeW1tMSxZTU1XT1JEWygoMzItMTI4KSkrcmR4XQorCXZtb3ZkcWEJeW1tMixZTU1XT1JEWygoNjQtMTI4KSkrcmR4XQorCXZtb3ZkcWEJeW1tMyxZTU1XT1JEWygoOTYtMTI4KSkrcmR4XQorCXZwYW5kCXltbTAseW1tMCxZTU1XT1JEWygoMCsxMjgpKStyYXhdCisJdnBhbmQJeW1tMSx5bW0xLFlNTVdPUkRbKCgzMisxMjgpKStyYXhdCisJdnBhbmQJeW1tMix5bW0yLFlNTVdPUkRbKCg2NCsxMjgpKStyYXhdCisJdnBvcgl5bW00LHltbTEseW1tMAorCXZwYW5kCXltbTMseW1tMyxZTU1XT1JEWygoOTYrMTI4KSkrcmF4XQorCXZtb3ZkcWEJeW1tMCxZTU1XT1JEWygoMTI4LTEyOCkpK3JkeF0KKwl2bW92ZHFhCXltbTEsWU1NV09SRFsoKDE2MC0xMjgpKStyZHhdCisJdnBvcgl5bW01LHltbTMseW1tMgorCXZtb3ZkcWEJeW1tMixZTU1XT1JEWygoMTkyLTEyOCkpK3JkeF0KKwl2bW92ZHFhCXltbTMsWU1NV09SRFsoKDIyNC0xMjgpKStyZHhdCisJdnBhbmQJeW1tMCx5bW0wLFlNTVdPUkRbKCgxMjgrMTI4KSkrcmF4XQorCXZwYW5kCXltbTEseW1tMSxZTU1XT1JEWygoMTYwKzEyOCkpK3JheF0KKwl2cGFuZAl5bW0yLHltbTIsWU1NV09SRFsoKDE5MisxMjgpKStyYXhdCisJdnBvcgl5bW00LHltbTQseW1tMAorCXZwYW5kCXltbTMseW1tMyxZTU1XT1JEWygoMjI0KzEyOCkpK3JheF0KKwl2cGFuZAl5bW0wLHltbTgsWU1NV09SRFsoKDI1Ni0xMjgpKStyZHhdCisJdnBvcgl5bW01LHltbTUseW1tMQorCXZwYW5kCXltbTEseW1tOSxZTU1XT1JEWygoMjg4LTEyOCkpK3JkeF0KKwl2cG9yCXltbTQseW1tNCx5bW0yCisJdnBhbmQJeW1tMix5bW0xMCxZTU1XT1JEWygoMzIwLTEyOCkpK3JkeF0KKwl2cG9yCXltbTUseW1tNSx5bW0zCisJdnBhbmQJeW1tMyx5bW0xMSxZTU1XT1JEWygoMzUyLTEyOCkpK3JkeF0KKwl2cG9yCXltbTQseW1tNCx5bW0wCisJdnBhbmQJeW1tMCx5bW0xMixZTU1XT1JEWygoMzg0LTEyOCkpK3JkeF0KKwl2cG9yCXltbTUseW1tNSx5bW0xCisJdnBhbmQJeW1tMSx5bW0xMyxZTU1XT1JEWygoNDE2LTEyOCkpK3JkeF0KKwl2cG9yCXltbTQseW1tNCx5bW0yCisJdnBhbmQJeW1tMix5bW0xNCxZTU1XT1JEWygoNDQ4LTEyOCkpK3JkeF0KKwl2cG9yCXltbTUseW1tNSx5bW0zCisJdnBhbmQJeW1tMyx5bW0xNSxZTU1XT1JEWygoNDgwLTEyOCkpK3JkeF0KKwlsZWEJcmR4LFs1MTIrcmR4XQorCXZwb3IJeW1tNCx5bW00LHltbTAKKwl2cG9yCXltbTUseW1tNSx5bW0xCisJdnBvcgl5bW00LHltbTQseW1tMgorCXZwb3IJeW1tNSx5bW01LHltbTMKKworCXZwb3IJeW1tNCx5bW00LHltbTUKKwl2ZXh0cmFjdGkxMjgJeG1tNSx5bW00LDEKKwl2cG9yCXhtbTUseG1tNSx4bW00CisJdnBlcm1kCXltbTUseW1tNyx5bW01CisJdm1vdmRxdQlZTU1XT1JEW3JjeF0seW1tNQorCWxlYQlyY3gsWzMyK3JjeF0KKwlkZWMJcjhkCisJam56CU5FQVIgJEwkb29wX2dhdGhlcl8xMDI0CisKKwl2cHhvcgl5bW0wLHltbTAseW1tMAorCXZtb3ZkcXUJWU1NV09SRFtyY3hdLHltbTAKKwl2emVyb3VwcGVyCisJbW92YXBzCXhtbTYsWE1NV09SRFsoKC0xNjgpKStyMTFdCisJbW92YXBzCXhtbTcsWE1NV09SRFsoKC0xNTIpKStyMTFdCisJbW92YXBzCXhtbTgsWE1NV09SRFsoKC0xMzYpKStyMTFdCisJbW92YXBzCXhtbTksWE1NV09SRFsoKC0xMjApKStyMTFdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbKCgtMTA0KSkrcjExXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWygoLTg4KSkrcjExXQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWygoLTcyKSkrcjExXQorCW1vdmFwcwl4bW0xMyxYTU1XT1JEWygoLTU2KSkrcjExXQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWygoLTQwKSkrcjExXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWygoLTI0KSkrcjExXQorCWxlYQlyc3AsW3IxMV0KKworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX3JzYXpfMTAyNF9nYXRoZXI1OgorCitFWFRFUk4JT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlyc2F6X2F2eDJfZWxpZ2libGUKKworQUxJR04JMzIKK3JzYXpfYXZ4Ml9lbGlnaWJsZToKKwlsZWEJcmF4LFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJZWF4LERXT1JEWzgrcmF4XQorCW1vdgllY3gsNTI0NTQ0CisJbW92CWVkeCwwCisJYW5kCWVjeCxlYXgKKwljbXAJZWN4LDUyNDU0NAorCWNtb3ZlCWVheCxlZHgKKwlhbmQJZWF4LDMyCisJc2hyCWVheCw1CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworQUxJR04JNjQKKyRMJGFuZF9tYXNrOgorCURRCTB4MWZmZmZmZmYsMHgxZmZmZmZmZiwweDFmZmZmZmZmLDB4MWZmZmZmZmYKKyRMJHNjYXR0ZXJfcGVybWQ6CisJREQJMCwyLDQsNiw3LDcsNyw3CiskTCRnYXRoZXJfcGVybWQ6CisJREQJMCw3LDEsNywyLDcsMyw3CiskTCRpbmM6CisJREQJMCwwLDAsMCwxLDEsMSwxCisJREQJMiwyLDIsMiwzLDMsMywzCisJREQJNCw0LDQsNCw0LDQsNCw0CitBTElHTgk2NAorRVhURVJOCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKworQUxJR04JMTYKK3JzYXpfc2VfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwltb3YJcnNpLFFXT1JEWzgrcjldCisJbW92CXIxMSxRV09SRFs1NityOV0KKworCW1vdglyMTBkLERXT1JEW3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcmJwLFFXT1JEWzE2MCtyOF0KKworCW1vdglyMTBkLERXT1JEWzgrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWNtb3ZjCXJheCxyYnAKKworCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JheF0KKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JheF0KKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYXhdCisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisKKwlsZWEJcnNpLFsoKC0yMTYpKStyYXhdCisJbGVhCXJkaSxbNTEyK3I4XQorCW1vdgllY3gsMjAKKwlERAkweGE1NDhmM2ZjCisKKyRMJGNvbW1vbl9zZWhfdGFpbDoKKwltb3YJcmRpLFFXT1JEWzgrcmF4XQorCW1vdglyc2ksUVdPUkRbMTYrcmF4XQorCW1vdglRV09SRFsxNTIrcjhdLHJheAorCW1vdglRV09SRFsxNjgrcjhdLHJzaQorCW1vdglRV09SRFsxNzYrcjhdLHJkaQorCisJbW92CXJkaSxRV09SRFs0MCtyOV0KKwltb3YJcnNpLHI4CisJbW92CWVjeCwxNTQKKwlERAkweGE1NDhmM2ZjCisKKwltb3YJcnNpLHI5CisJeG9yCXJjeCxyY3gKKwltb3YJcmR4LFFXT1JEWzgrcnNpXQorCW1vdglyOCxRV09SRFtyc2ldCisJbW92CXI5LFFXT1JEWzE2K3JzaV0KKwltb3YJcjEwLFFXT1JEWzQwK3JzaV0KKwlsZWEJcjExLFs1Nityc2ldCisJbGVhCXIxMixbMjQrcnNpXQorCW1vdglRV09SRFszMityc3BdLHIxMAorCW1vdglRV09SRFs0MCtyc3BdLHIxMQorCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCW1vdglRV09SRFs1Nityc3BdLHJjeAorCWNhbGwJUVdPUkRbX19pbXBfUnRsVmlydHVhbFVud2luZF0KKworCW1vdgllYXgsMQorCWFkZAlyc3AsNjQKKwlwb3BmcQorCXBvcAlyMTUKKwlwb3AJcjE0CisJcG9wCXIxMworCXBvcAlyMTIKKwlwb3AJcmJwCisJcG9wCXJieAorCXBvcAlyZGkKKwlwb3AJcnNpCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworc2VjdGlvbgkucGRhdGEgcmRhdGEgYWxpZ249NAorQUxJR04JNAorCURECSRMJFNFSF9iZWdpbl9yc2F6XzEwMjRfc3FyX2F2eDIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9yc2F6XzEwMjRfc3FyX2F2eDIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fcnNhel8xMDI0X3Nxcl9hdngyIHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX3JzYXpfMTAyNF9tdWxfYXZ4MiB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX3JzYXpfMTAyNF9tdWxfYXZ4MiB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19yc2F6XzEwMjRfbXVsX2F2eDIgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fcnNhel8xMDI0X2dhdGhlcjUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9yc2F6XzEwMjRfZ2F0aGVyNSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19yc2F6XzEwMjRfZ2F0aGVyNSB3cnQgLi5pbWFnZWJhc2UKK3NlY3Rpb24JLnhkYXRhIHJkYXRhIGFsaWduPTgKK0FMSUdOCTgKKyRMJFNFSF9pbmZvX3JzYXpfMTAyNF9zcXJfYXZ4MjoKK0RCCTksMCwwLDAKKwlERAlyc2F6X3NlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkc3FyXzEwMjRfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkc3FyXzEwMjRfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlLCRMJHNxcl8xMDI0X2luX3RhaWwgd3J0IC4uaW1hZ2ViYXNlCisJREQJMAorJEwkU0VIX2luZm9fcnNhel8xMDI0X211bF9hdngyOgorREIJOSwwLDAsMAorCURECXJzYXpfc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRtdWxfMTAyNF9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRtdWxfMTAyNF9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UsJEwkbXVsXzEwMjRfaW5fdGFpbCB3cnQgLi5pbWFnZWJhc2UKKwlERAkwCiskTCRTRUhfaW5mb19yc2F6XzEwMjRfZ2F0aGVyNToKK0RCCTB4MDEsMHgzNiwweDE3LDB4MGIKK0RCCTB4MzYsMHhmOCwweDA5LDB4MDAKK0RCCTB4MzEsMHhlOCwweDA4LDB4MDAKK0RCCTB4MmMsMHhkOCwweDA3LDB4MDAKK0RCCTB4MjcsMHhjOCwweDA2LDB4MDAKK0RCCTB4MjIsMHhiOCwweDA1LDB4MDAKK0RCCTB4MWQsMHhhOCwweDA0LDB4MDAKK0RCCTB4MTgsMHg5OCwweDAzLDB4MDAKK0RCCTB4MTMsMHg4OCwweDAyLDB4MDAKK0RCCTB4MGUsMHg3OCwweDAxLDB4MDAKK0RCCTB4MDksMHg2OCwweDAwLDB4MDAKK0RCCTB4MDQsMHgwMSwweDE1LDB4MDAKK0RCCTB4MDAsMHhiMywweDAwLDB4MDAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGExLXg4Nl82NC5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS14ODZfNjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWZhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMS14ODZfNjQuYXNtCkBAIC0wLDAgKzEsMzgwNyBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCitFWFRFUk4JT1BFTlNTTF9pYTMyY2FwX1AKKworZ2xvYmFsCXNoYTFfYmxvY2tfZGF0YV9vcmRlcgorCitBTElHTgkxNgorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fc2hhMV9ibG9ja19kYXRhX29yZGVyOgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworCisJbGVhCXIxMCxbT1BFTlNTTF9pYTMyY2FwX1BdCisJbW92CXI5ZCxEV09SRFtyMTBdCisJbW92CXI4ZCxEV09SRFs0K3IxMF0KKwltb3YJcjEwZCxEV09SRFs4K3IxMF0KKwl0ZXN0CXI4ZCw1MTIKKwlqeglORUFSICRMJGlhbHUKKwlhbmQJcjhkLDI2ODQzNTQ1NgorCWFuZAlyOWQsMTA3Mzc0MTgyNAorCW9yCXI4ZCxyOWQKKwljbXAJcjhkLDEzNDIxNzcyODAKKwlqZQlORUFSIF9hdnhfc2hvcnRjdXQKKwlqbXAJTkVBUiBfc3NzZTNfc2hvcnRjdXQKKworQUxJR04JMTYKKyRMJGlhbHU6CisJbW92CXJheCxyc3AKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJbW92CXI4LHJkaQorCXN1Yglyc3AsNzIKKwltb3YJcjkscnNpCisJYW5kCXJzcCwtNjQKKwltb3YJcjEwLHJkeAorCW1vdglRV09SRFs2NCtyc3BdLHJheAorCiskTCRwcm9sb2d1ZToKKworCW1vdgllc2ksRFdPUkRbcjhdCisJbW92CWVkaSxEV09SRFs0K3I4XQorCW1vdglyMTFkLERXT1JEWzgrcjhdCisJbW92CXIxMmQsRFdPUkRbMTIrcjhdCisJbW92CXIxM2QsRFdPUkRbMTYrcjhdCisJam1wCU5FQVIgJEwkbG9vcAorCitBTElHTgkxNgorJEwkbG9vcDoKKwltb3YJZWR4LERXT1JEW3I5XQorCWJzd2FwCWVkeAorCW1vdgllYnAsRFdPUkRbNCtyOV0KKwltb3YJZWF4LHIxMmQKKwltb3YJRFdPUkRbcnNwXSxlZHgKKwltb3YJZWN4LGVzaQorCWJzd2FwCWVicAorCXhvcgllYXgscjExZAorCXJvbAllY3gsNQorCWFuZAllYXgsZWRpCisJbGVhCXIxM2QsWzE1MTg1MDAyNDkrcjEzKjErcmR4XQorCWFkZAlyMTNkLGVjeAorCXhvcgllYXgscjEyZAorCXJvbAllZGksMzAKKwlhZGQJcjEzZCxlYXgKKwltb3YJcjE0ZCxEV09SRFs4K3I5XQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFs0K3JzcF0sZWJwCisJbW92CWVjeCxyMTNkCisJYnN3YXAJcjE0ZAorCXhvcgllYXgsZWRpCisJcm9sCWVjeCw1CisJYW5kCWVheCxlc2kKKwlsZWEJcjEyZCxbMTUxODUwMDI0OStyMTIqMStyYnBdCisJYWRkCXIxMmQsZWN4CisJeG9yCWVheCxyMTFkCisJcm9sCWVzaSwzMAorCWFkZAlyMTJkLGVheAorCW1vdgllZHgsRFdPUkRbMTIrcjldCisJbW92CWVheCxlZGkKKwltb3YJRFdPUkRbOCtyc3BdLHIxNGQKKwltb3YJZWN4LHIxMmQKKwlic3dhcAllZHgKKwl4b3IJZWF4LGVzaQorCXJvbAllY3gsNQorCWFuZAllYXgscjEzZAorCWxlYQlyMTFkLFsxNTE4NTAwMjQ5K3IxMSoxK3IxNF0KKwlhZGQJcjExZCxlY3gKKwl4b3IJZWF4LGVkaQorCXJvbAlyMTNkLDMwCisJYWRkCXIxMWQsZWF4CisJbW92CWVicCxEV09SRFsxNityOV0KKwltb3YJZWF4LGVzaQorCW1vdglEV09SRFsxMityc3BdLGVkeAorCW1vdgllY3gscjExZAorCWJzd2FwCWVicAorCXhvcgllYXgscjEzZAorCXJvbAllY3gsNQorCWFuZAllYXgscjEyZAorCWxlYQllZGksWzE1MTg1MDAyNDkrcmRpKjErcmR4XQorCWFkZAllZGksZWN4CisJeG9yCWVheCxlc2kKKwlyb2wJcjEyZCwzMAorCWFkZAllZGksZWF4CisJbW92CXIxNGQsRFdPUkRbMjArcjldCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzE2K3JzcF0sZWJwCisJbW92CWVjeCxlZGkKKwlic3dhcAlyMTRkCisJeG9yCWVheCxyMTJkCisJcm9sCWVjeCw1CisJYW5kCWVheCxyMTFkCisJbGVhCWVzaSxbMTUxODUwMDI0OStyc2kqMStyYnBdCisJYWRkCWVzaSxlY3gKKwl4b3IJZWF4LHIxM2QKKwlyb2wJcjExZCwzMAorCWFkZAllc2ksZWF4CisJbW92CWVkeCxEV09SRFsyNCtyOV0KKwltb3YJZWF4LHIxMmQKKwltb3YJRFdPUkRbMjArcnNwXSxyMTRkCisJbW92CWVjeCxlc2kKKwlic3dhcAllZHgKKwl4b3IJZWF4LHIxMWQKKwlyb2wJZWN4LDUKKwlhbmQJZWF4LGVkaQorCWxlYQlyMTNkLFsxNTE4NTAwMjQ5K3IxMyoxK3IxNF0KKwlhZGQJcjEzZCxlY3gKKwl4b3IJZWF4LHIxMmQKKwlyb2wJZWRpLDMwCisJYWRkCXIxM2QsZWF4CisJbW92CWVicCxEV09SRFsyOCtyOV0KKwltb3YJZWF4LHIxMWQKKwltb3YJRFdPUkRbMjQrcnNwXSxlZHgKKwltb3YJZWN4LHIxM2QKKwlic3dhcAllYnAKKwl4b3IJZWF4LGVkaQorCXJvbAllY3gsNQorCWFuZAllYXgsZXNpCisJbGVhCXIxMmQsWzE1MTg1MDAyNDkrcjEyKjErcmR4XQorCWFkZAlyMTJkLGVjeAorCXhvcgllYXgscjExZAorCXJvbAllc2ksMzAKKwlhZGQJcjEyZCxlYXgKKwltb3YJcjE0ZCxEV09SRFszMityOV0KKwltb3YJZWF4LGVkaQorCW1vdglEV09SRFsyOCtyc3BdLGVicAorCW1vdgllY3gscjEyZAorCWJzd2FwCXIxNGQKKwl4b3IJZWF4LGVzaQorCXJvbAllY3gsNQorCWFuZAllYXgscjEzZAorCWxlYQlyMTFkLFsxNTE4NTAwMjQ5K3IxMSoxK3JicF0KKwlhZGQJcjExZCxlY3gKKwl4b3IJZWF4LGVkaQorCXJvbAlyMTNkLDMwCisJYWRkCXIxMWQsZWF4CisJbW92CWVkeCxEV09SRFszNityOV0KKwltb3YJZWF4LGVzaQorCW1vdglEV09SRFszMityc3BdLHIxNGQKKwltb3YJZWN4LHIxMWQKKwlic3dhcAllZHgKKwl4b3IJZWF4LHIxM2QKKwlyb2wJZWN4LDUKKwlhbmQJZWF4LHIxMmQKKwlsZWEJZWRpLFsxNTE4NTAwMjQ5K3JkaSoxK3IxNF0KKwlhZGQJZWRpLGVjeAorCXhvcgllYXgsZXNpCisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVheAorCW1vdgllYnAsRFdPUkRbNDArcjldCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzM2K3JzcF0sZWR4CisJbW92CWVjeCxlZGkKKwlic3dhcAllYnAKKwl4b3IJZWF4LHIxMmQKKwlyb2wJZWN4LDUKKwlhbmQJZWF4LHIxMWQKKwlsZWEJZXNpLFsxNTE4NTAwMjQ5K3JzaSoxK3JkeF0KKwlhZGQJZXNpLGVjeAorCXhvcgllYXgscjEzZAorCXJvbAlyMTFkLDMwCisJYWRkCWVzaSxlYXgKKwltb3YJcjE0ZCxEV09SRFs0NCtyOV0KKwltb3YJZWF4LHIxMmQKKwltb3YJRFdPUkRbNDArcnNwXSxlYnAKKwltb3YJZWN4LGVzaQorCWJzd2FwCXIxNGQKKwl4b3IJZWF4LHIxMWQKKwlyb2wJZWN4LDUKKwlhbmQJZWF4LGVkaQorCWxlYQlyMTNkLFsxNTE4NTAwMjQ5K3IxMyoxK3JicF0KKwlhZGQJcjEzZCxlY3gKKwl4b3IJZWF4LHIxMmQKKwlyb2wJZWRpLDMwCisJYWRkCXIxM2QsZWF4CisJbW92CWVkeCxEV09SRFs0OCtyOV0KKwltb3YJZWF4LHIxMWQKKwltb3YJRFdPUkRbNDQrcnNwXSxyMTRkCisJbW92CWVjeCxyMTNkCisJYnN3YXAJZWR4CisJeG9yCWVheCxlZGkKKwlyb2wJZWN4LDUKKwlhbmQJZWF4LGVzaQorCWxlYQlyMTJkLFsxNTE4NTAwMjQ5K3IxMioxK3IxNF0KKwlhZGQJcjEyZCxlY3gKKwl4b3IJZWF4LHIxMWQKKwlyb2wJZXNpLDMwCisJYWRkCXIxMmQsZWF4CisJbW92CWVicCxEV09SRFs1MityOV0KKwltb3YJZWF4LGVkaQorCW1vdglEV09SRFs0OCtyc3BdLGVkeAorCW1vdgllY3gscjEyZAorCWJzd2FwCWVicAorCXhvcgllYXgsZXNpCisJcm9sCWVjeCw1CisJYW5kCWVheCxyMTNkCisJbGVhCXIxMWQsWzE1MTg1MDAyNDkrcjExKjErcmR4XQorCWFkZAlyMTFkLGVjeAorCXhvcgllYXgsZWRpCisJcm9sCXIxM2QsMzAKKwlhZGQJcjExZCxlYXgKKwltb3YJcjE0ZCxEV09SRFs1NityOV0KKwltb3YJZWF4LGVzaQorCW1vdglEV09SRFs1Mityc3BdLGVicAorCW1vdgllY3gscjExZAorCWJzd2FwCXIxNGQKKwl4b3IJZWF4LHIxM2QKKwlyb2wJZWN4LDUKKwlhbmQJZWF4LHIxMmQKKwlsZWEJZWRpLFsxNTE4NTAwMjQ5K3JkaSoxK3JicF0KKwlhZGQJZWRpLGVjeAorCXhvcgllYXgsZXNpCisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVheAorCW1vdgllZHgsRFdPUkRbNjArcjldCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzU2K3JzcF0scjE0ZAorCW1vdgllY3gsZWRpCisJYnN3YXAJZWR4CisJeG9yCWVheCxyMTJkCisJcm9sCWVjeCw1CisJYW5kCWVheCxyMTFkCisJbGVhCWVzaSxbMTUxODUwMDI0OStyc2kqMStyMTRdCisJYWRkCWVzaSxlY3gKKwl4b3IJZWF4LHIxM2QKKwlyb2wJcjExZCwzMAorCWFkZAllc2ksZWF4CisJeG9yCWVicCxEV09SRFtyc3BdCisJbW92CWVheCxyMTJkCisJbW92CURXT1JEWzYwK3JzcF0sZWR4CisJbW92CWVjeCxlc2kKKwl4b3IJZWJwLERXT1JEWzgrcnNwXQorCXhvcgllYXgscjExZAorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbMzIrcnNwXQorCWFuZAllYXgsZWRpCisJbGVhCXIxM2QsWzE1MTg1MDAyNDkrcjEzKjErcmR4XQorCXJvbAllZGksMzAKKwl4b3IJZWF4LHIxMmQKKwlhZGQJcjEzZCxlY3gKKwlyb2wJZWJwLDEKKwlhZGQJcjEzZCxlYXgKKwl4b3IJcjE0ZCxEV09SRFs0K3JzcF0KKwltb3YJZWF4LHIxMWQKKwltb3YJRFdPUkRbcnNwXSxlYnAKKwltb3YJZWN4LHIxM2QKKwl4b3IJcjE0ZCxEV09SRFsxMityc3BdCisJeG9yCWVheCxlZGkKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFszNityc3BdCisJYW5kCWVheCxlc2kKKwlsZWEJcjEyZCxbMTUxODUwMDI0OStyMTIqMStyYnBdCisJcm9sCWVzaSwzMAorCXhvcgllYXgscjExZAorCWFkZAlyMTJkLGVjeAorCXJvbAlyMTRkLDEKKwlhZGQJcjEyZCxlYXgKKwl4b3IJZWR4LERXT1JEWzgrcnNwXQorCW1vdgllYXgsZWRpCisJbW92CURXT1JEWzQrcnNwXSxyMTRkCisJbW92CWVjeCxyMTJkCisJeG9yCWVkeCxEV09SRFsxNityc3BdCisJeG9yCWVheCxlc2kKKwlyb2wJZWN4LDUKKwl4b3IJZWR4LERXT1JEWzQwK3JzcF0KKwlhbmQJZWF4LHIxM2QKKwlsZWEJcjExZCxbMTUxODUwMDI0OStyMTEqMStyMTRdCisJcm9sCXIxM2QsMzAKKwl4b3IJZWF4LGVkaQorCWFkZAlyMTFkLGVjeAorCXJvbAllZHgsMQorCWFkZAlyMTFkLGVheAorCXhvcgllYnAsRFdPUkRbMTIrcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEWzgrcnNwXSxlZHgKKwltb3YJZWN4LHIxMWQKKwl4b3IJZWJwLERXT1JEWzIwK3JzcF0KKwl4b3IJZWF4LHIxM2QKKwlyb2wJZWN4LDUKKwl4b3IJZWJwLERXT1JEWzQ0K3JzcF0KKwlhbmQJZWF4LHIxMmQKKwlsZWEJZWRpLFsxNTE4NTAwMjQ5K3JkaSoxK3JkeF0KKwlyb2wJcjEyZCwzMAorCXhvcgllYXgsZXNpCisJYWRkCWVkaSxlY3gKKwlyb2wJZWJwLDEKKwlhZGQJZWRpLGVheAorCXhvcglyMTRkLERXT1JEWzE2K3JzcF0KKwltb3YJZWF4LHIxM2QKKwltb3YJRFdPUkRbMTIrcnNwXSxlYnAKKwltb3YJZWN4LGVkaQorCXhvcglyMTRkLERXT1JEWzI0K3JzcF0KKwl4b3IJZWF4LHIxMmQKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFs0OCtyc3BdCisJYW5kCWVheCxyMTFkCisJbGVhCWVzaSxbMTUxODUwMDI0OStyc2kqMStyYnBdCisJcm9sCXIxMWQsMzAKKwl4b3IJZWF4LHIxM2QKKwlhZGQJZXNpLGVjeAorCXJvbAlyMTRkLDEKKwlhZGQJZXNpLGVheAorCXhvcgllZHgsRFdPUkRbMjArcnNwXQorCW1vdgllYXgsZWRpCisJbW92CURXT1JEWzE2K3JzcF0scjE0ZAorCW1vdgllY3gsZXNpCisJeG9yCWVkeCxEV09SRFsyOCtyc3BdCisJeG9yCWVheCxyMTJkCisJcm9sCWVjeCw1CisJeG9yCWVkeCxEV09SRFs1Mityc3BdCisJbGVhCXIxM2QsWzE4NTk3NzUzOTMrcjEzKjErcjE0XQorCXhvcgllYXgscjExZAorCWFkZAlyMTNkLGVjeAorCXJvbAllZGksMzAKKwlhZGQJcjEzZCxlYXgKKwlyb2wJZWR4LDEKKwl4b3IJZWJwLERXT1JEWzI0K3JzcF0KKwltb3YJZWF4LGVzaQorCW1vdglEV09SRFsyMCtyc3BdLGVkeAorCW1vdgllY3gscjEzZAorCXhvcgllYnAsRFdPUkRbMzIrcnNwXQorCXhvcgllYXgscjExZAorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbNTYrcnNwXQorCWxlYQlyMTJkLFsxODU5Nzc1MzkzK3IxMioxK3JkeF0KKwl4b3IJZWF4LGVkaQorCWFkZAlyMTJkLGVjeAorCXJvbAllc2ksMzAKKwlhZGQJcjEyZCxlYXgKKwlyb2wJZWJwLDEKKwl4b3IJcjE0ZCxEV09SRFsyOCtyc3BdCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzI0K3JzcF0sZWJwCisJbW92CWVjeCxyMTJkCisJeG9yCXIxNGQsRFdPUkRbMzYrcnNwXQorCXhvcgllYXgsZWRpCisJcm9sCWVjeCw1CisJeG9yCXIxNGQsRFdPUkRbNjArcnNwXQorCWxlYQlyMTFkLFsxODU5Nzc1MzkzK3IxMSoxK3JicF0KKwl4b3IJZWF4LGVzaQorCWFkZAlyMTFkLGVjeAorCXJvbAlyMTNkLDMwCisJYWRkCXIxMWQsZWF4CisJcm9sCXIxNGQsMQorCXhvcgllZHgsRFdPUkRbMzIrcnNwXQorCW1vdgllYXgscjEyZAorCW1vdglEV09SRFsyOCtyc3BdLHIxNGQKKwltb3YJZWN4LHIxMWQKKwl4b3IJZWR4LERXT1JEWzQwK3JzcF0KKwl4b3IJZWF4LGVzaQorCXJvbAllY3gsNQorCXhvcgllZHgsRFdPUkRbcnNwXQorCWxlYQllZGksWzE4NTk3NzUzOTMrcmRpKjErcjE0XQorCXhvcgllYXgscjEzZAorCWFkZAllZGksZWN4CisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVheAorCXJvbAllZHgsMQorCXhvcgllYnAsRFdPUkRbMzYrcnNwXQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFszMityc3BdLGVkeAorCW1vdgllY3gsZWRpCisJeG9yCWVicCxEV09SRFs0NCtyc3BdCisJeG9yCWVheCxyMTNkCisJcm9sCWVjeCw1CisJeG9yCWVicCxEV09SRFs0K3JzcF0KKwlsZWEJZXNpLFsxODU5Nzc1MzkzK3JzaSoxK3JkeF0KKwl4b3IJZWF4LHIxMmQKKwlhZGQJZXNpLGVjeAorCXJvbAlyMTFkLDMwCisJYWRkCWVzaSxlYXgKKwlyb2wJZWJwLDEKKwl4b3IJcjE0ZCxEV09SRFs0MCtyc3BdCisJbW92CWVheCxlZGkKKwltb3YJRFdPUkRbMzYrcnNwXSxlYnAKKwltb3YJZWN4LGVzaQorCXhvcglyMTRkLERXT1JEWzQ4K3JzcF0KKwl4b3IJZWF4LHIxMmQKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFs4K3JzcF0KKwlsZWEJcjEzZCxbMTg1OTc3NTM5MytyMTMqMStyYnBdCisJeG9yCWVheCxyMTFkCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVheAorCXJvbAlyMTRkLDEKKwl4b3IJZWR4LERXT1JEWzQ0K3JzcF0KKwltb3YJZWF4LGVzaQorCW1vdglEV09SRFs0MCtyc3BdLHIxNGQKKwltb3YJZWN4LHIxM2QKKwl4b3IJZWR4LERXT1JEWzUyK3JzcF0KKwl4b3IJZWF4LHIxMWQKKwlyb2wJZWN4LDUKKwl4b3IJZWR4LERXT1JEWzEyK3JzcF0KKwlsZWEJcjEyZCxbMTg1OTc3NTM5MytyMTIqMStyMTRdCisJeG9yCWVheCxlZGkKKwlhZGQJcjEyZCxlY3gKKwlyb2wJZXNpLDMwCisJYWRkCXIxMmQsZWF4CisJcm9sCWVkeCwxCisJeG9yCWVicCxEV09SRFs0OCtyc3BdCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzQ0K3JzcF0sZWR4CisJbW92CWVjeCxyMTJkCisJeG9yCWVicCxEV09SRFs1Nityc3BdCisJeG9yCWVheCxlZGkKKwlyb2wJZWN4LDUKKwl4b3IJZWJwLERXT1JEWzE2K3JzcF0KKwlsZWEJcjExZCxbMTg1OTc3NTM5MytyMTEqMStyZHhdCisJeG9yCWVheCxlc2kKKwlhZGQJcjExZCxlY3gKKwlyb2wJcjEzZCwzMAorCWFkZAlyMTFkLGVheAorCXJvbAllYnAsMQorCXhvcglyMTRkLERXT1JEWzUyK3JzcF0KKwltb3YJZWF4LHIxMmQKKwltb3YJRFdPUkRbNDgrcnNwXSxlYnAKKwltb3YJZWN4LHIxMWQKKwl4b3IJcjE0ZCxEV09SRFs2MCtyc3BdCisJeG9yCWVheCxlc2kKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFsyMCtyc3BdCisJbGVhCWVkaSxbMTg1OTc3NTM5MytyZGkqMStyYnBdCisJeG9yCWVheCxyMTNkCisJYWRkCWVkaSxlY3gKKwlyb2wJcjEyZCwzMAorCWFkZAllZGksZWF4CisJcm9sCXIxNGQsMQorCXhvcgllZHgsRFdPUkRbNTYrcnNwXQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFs1Mityc3BdLHIxNGQKKwltb3YJZWN4LGVkaQorCXhvcgllZHgsRFdPUkRbcnNwXQorCXhvcgllYXgscjEzZAorCXJvbAllY3gsNQorCXhvcgllZHgsRFdPUkRbMjQrcnNwXQorCWxlYQllc2ksWzE4NTk3NzUzOTMrcnNpKjErcjE0XQorCXhvcgllYXgscjEyZAorCWFkZAllc2ksZWN4CisJcm9sCXIxMWQsMzAKKwlhZGQJZXNpLGVheAorCXJvbAllZHgsMQorCXhvcgllYnAsRFdPUkRbNjArcnNwXQorCW1vdgllYXgsZWRpCisJbW92CURXT1JEWzU2K3JzcF0sZWR4CisJbW92CWVjeCxlc2kKKwl4b3IJZWJwLERXT1JEWzQrcnNwXQorCXhvcgllYXgscjEyZAorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbMjgrcnNwXQorCWxlYQlyMTNkLFsxODU5Nzc1MzkzK3IxMyoxK3JkeF0KKwl4b3IJZWF4LHIxMWQKKwlhZGQJcjEzZCxlY3gKKwlyb2wJZWRpLDMwCisJYWRkCXIxM2QsZWF4CisJcm9sCWVicCwxCisJeG9yCXIxNGQsRFdPUkRbcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEWzYwK3JzcF0sZWJwCisJbW92CWVjeCxyMTNkCisJeG9yCXIxNGQsRFdPUkRbOCtyc3BdCisJeG9yCWVheCxyMTFkCisJcm9sCWVjeCw1CisJeG9yCXIxNGQsRFdPUkRbMzIrcnNwXQorCWxlYQlyMTJkLFsxODU5Nzc1MzkzK3IxMioxK3JicF0KKwl4b3IJZWF4LGVkaQorCWFkZAlyMTJkLGVjeAorCXJvbAllc2ksMzAKKwlhZGQJcjEyZCxlYXgKKwlyb2wJcjE0ZCwxCisJeG9yCWVkeCxEV09SRFs0K3JzcF0KKwltb3YJZWF4LHIxM2QKKwltb3YJRFdPUkRbcnNwXSxyMTRkCisJbW92CWVjeCxyMTJkCisJeG9yCWVkeCxEV09SRFsxMityc3BdCisJeG9yCWVheCxlZGkKKwlyb2wJZWN4LDUKKwl4b3IJZWR4LERXT1JEWzM2K3JzcF0KKwlsZWEJcjExZCxbMTg1OTc3NTM5MytyMTEqMStyMTRdCisJeG9yCWVheCxlc2kKKwlhZGQJcjExZCxlY3gKKwlyb2wJcjEzZCwzMAorCWFkZAlyMTFkLGVheAorCXJvbAllZHgsMQorCXhvcgllYnAsRFdPUkRbOCtyc3BdCisJbW92CWVheCxyMTJkCisJbW92CURXT1JEWzQrcnNwXSxlZHgKKwltb3YJZWN4LHIxMWQKKwl4b3IJZWJwLERXT1JEWzE2K3JzcF0KKwl4b3IJZWF4LGVzaQorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbNDArcnNwXQorCWxlYQllZGksWzE4NTk3NzUzOTMrcmRpKjErcmR4XQorCXhvcgllYXgscjEzZAorCWFkZAllZGksZWN4CisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVheAorCXJvbAllYnAsMQorCXhvcglyMTRkLERXT1JEWzEyK3JzcF0KKwltb3YJZWF4LHIxMWQKKwltb3YJRFdPUkRbOCtyc3BdLGVicAorCW1vdgllY3gsZWRpCisJeG9yCXIxNGQsRFdPUkRbMjArcnNwXQorCXhvcgllYXgscjEzZAorCXJvbAllY3gsNQorCXhvcglyMTRkLERXT1JEWzQ0K3JzcF0KKwlsZWEJZXNpLFsxODU5Nzc1MzkzK3JzaSoxK3JicF0KKwl4b3IJZWF4LHIxMmQKKwlhZGQJZXNpLGVjeAorCXJvbAlyMTFkLDMwCisJYWRkCWVzaSxlYXgKKwlyb2wJcjE0ZCwxCisJeG9yCWVkeCxEV09SRFsxNityc3BdCisJbW92CWVheCxlZGkKKwltb3YJRFdPUkRbMTIrcnNwXSxyMTRkCisJbW92CWVjeCxlc2kKKwl4b3IJZWR4LERXT1JEWzI0K3JzcF0KKwl4b3IJZWF4LHIxMmQKKwlyb2wJZWN4LDUKKwl4b3IJZWR4LERXT1JEWzQ4K3JzcF0KKwlsZWEJcjEzZCxbMTg1OTc3NTM5MytyMTMqMStyMTRdCisJeG9yCWVheCxyMTFkCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVheAorCXJvbAllZHgsMQorCXhvcgllYnAsRFdPUkRbMjArcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEWzE2K3JzcF0sZWR4CisJbW92CWVjeCxyMTNkCisJeG9yCWVicCxEV09SRFsyOCtyc3BdCisJeG9yCWVheCxyMTFkCisJcm9sCWVjeCw1CisJeG9yCWVicCxEV09SRFs1Mityc3BdCisJbGVhCXIxMmQsWzE4NTk3NzUzOTMrcjEyKjErcmR4XQorCXhvcgllYXgsZWRpCisJYWRkCXIxMmQsZWN4CisJcm9sCWVzaSwzMAorCWFkZAlyMTJkLGVheAorCXJvbAllYnAsMQorCXhvcglyMTRkLERXT1JEWzI0K3JzcF0KKwltb3YJZWF4LHIxM2QKKwltb3YJRFdPUkRbMjArcnNwXSxlYnAKKwltb3YJZWN4LHIxMmQKKwl4b3IJcjE0ZCxEV09SRFszMityc3BdCisJeG9yCWVheCxlZGkKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFs1Nityc3BdCisJbGVhCXIxMWQsWzE4NTk3NzUzOTMrcjExKjErcmJwXQorCXhvcgllYXgsZXNpCisJYWRkCXIxMWQsZWN4CisJcm9sCXIxM2QsMzAKKwlhZGQJcjExZCxlYXgKKwlyb2wJcjE0ZCwxCisJeG9yCWVkeCxEV09SRFsyOCtyc3BdCisJbW92CWVheCxyMTJkCisJbW92CURXT1JEWzI0K3JzcF0scjE0ZAorCW1vdgllY3gscjExZAorCXhvcgllZHgsRFdPUkRbMzYrcnNwXQorCXhvcgllYXgsZXNpCisJcm9sCWVjeCw1CisJeG9yCWVkeCxEV09SRFs2MCtyc3BdCisJbGVhCWVkaSxbMTg1OTc3NTM5MytyZGkqMStyMTRdCisJeG9yCWVheCxyMTNkCisJYWRkCWVkaSxlY3gKKwlyb2wJcjEyZCwzMAorCWFkZAllZGksZWF4CisJcm9sCWVkeCwxCisJeG9yCWVicCxEV09SRFszMityc3BdCisJbW92CWVheCxyMTFkCisJbW92CURXT1JEWzI4K3JzcF0sZWR4CisJbW92CWVjeCxlZGkKKwl4b3IJZWJwLERXT1JEWzQwK3JzcF0KKwl4b3IJZWF4LHIxM2QKKwlyb2wJZWN4LDUKKwl4b3IJZWJwLERXT1JEW3JzcF0KKwlsZWEJZXNpLFsxODU5Nzc1MzkzK3JzaSoxK3JkeF0KKwl4b3IJZWF4LHIxMmQKKwlhZGQJZXNpLGVjeAorCXJvbAlyMTFkLDMwCisJYWRkCWVzaSxlYXgKKwlyb2wJZWJwLDEKKwl4b3IJcjE0ZCxEV09SRFszNityc3BdCisJbW92CWVheCxyMTJkCisJbW92CURXT1JEWzMyK3JzcF0sZWJwCisJbW92CWVieCxyMTJkCisJeG9yCXIxNGQsRFdPUkRbNDQrcnNwXQorCWFuZAllYXgscjExZAorCW1vdgllY3gsZXNpCisJeG9yCXIxNGQsRFdPUkRbNCtyc3BdCisJbGVhCXIxM2QsWygoLTE4OTQwMDc1ODgpKStyMTMqMStyYnBdCisJeG9yCWVieCxyMTFkCisJcm9sCWVjeCw1CisJYWRkCXIxM2QsZWF4CisJcm9sCXIxNGQsMQorCWFuZAllYngsZWRpCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVieAorCXhvcgllZHgsRFdPUkRbNDArcnNwXQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFszNityc3BdLHIxNGQKKwltb3YJZWJ4LHIxMWQKKwl4b3IJZWR4LERXT1JEWzQ4K3JzcF0KKwlhbmQJZWF4LGVkaQorCW1vdgllY3gscjEzZAorCXhvcgllZHgsRFdPUkRbOCtyc3BdCisJbGVhCXIxMmQsWygoLTE4OTQwMDc1ODgpKStyMTIqMStyMTRdCisJeG9yCWVieCxlZGkKKwlyb2wJZWN4LDUKKwlhZGQJcjEyZCxlYXgKKwlyb2wJZWR4LDEKKwlhbmQJZWJ4LGVzaQorCWFkZAlyMTJkLGVjeAorCXJvbAllc2ksMzAKKwlhZGQJcjEyZCxlYngKKwl4b3IJZWJwLERXT1JEWzQ0K3JzcF0KKwltb3YJZWF4LGVkaQorCW1vdglEV09SRFs0MCtyc3BdLGVkeAorCW1vdgllYngsZWRpCisJeG9yCWVicCxEV09SRFs1Mityc3BdCisJYW5kCWVheCxlc2kKKwltb3YJZWN4LHIxMmQKKwl4b3IJZWJwLERXT1JEWzEyK3JzcF0KKwlsZWEJcjExZCxbKCgtMTg5NDAwNzU4OCkpK3IxMSoxK3JkeF0KKwl4b3IJZWJ4LGVzaQorCXJvbAllY3gsNQorCWFkZAlyMTFkLGVheAorCXJvbAllYnAsMQorCWFuZAllYngscjEzZAorCWFkZAlyMTFkLGVjeAorCXJvbAlyMTNkLDMwCisJYWRkCXIxMWQsZWJ4CisJeG9yCXIxNGQsRFdPUkRbNDgrcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEWzQ0K3JzcF0sZWJwCisJbW92CWVieCxlc2kKKwl4b3IJcjE0ZCxEV09SRFs1Nityc3BdCisJYW5kCWVheCxyMTNkCisJbW92CWVjeCxyMTFkCisJeG9yCXIxNGQsRFdPUkRbMTYrcnNwXQorCWxlYQllZGksWygoLTE4OTQwMDc1ODgpKStyZGkqMStyYnBdCisJeG9yCWVieCxyMTNkCisJcm9sCWVjeCw1CisJYWRkCWVkaSxlYXgKKwlyb2wJcjE0ZCwxCisJYW5kCWVieCxyMTJkCisJYWRkCWVkaSxlY3gKKwlyb2wJcjEyZCwzMAorCWFkZAllZGksZWJ4CisJeG9yCWVkeCxEV09SRFs1Mityc3BdCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzQ4K3JzcF0scjE0ZAorCW1vdgllYngscjEzZAorCXhvcgllZHgsRFdPUkRbNjArcnNwXQorCWFuZAllYXgscjEyZAorCW1vdgllY3gsZWRpCisJeG9yCWVkeCxEV09SRFsyMCtyc3BdCisJbGVhCWVzaSxbKCgtMTg5NDAwNzU4OCkpK3JzaSoxK3IxNF0KKwl4b3IJZWJ4LHIxMmQKKwlyb2wJZWN4LDUKKwlhZGQJZXNpLGVheAorCXJvbAllZHgsMQorCWFuZAllYngscjExZAorCWFkZAllc2ksZWN4CisJcm9sCXIxMWQsMzAKKwlhZGQJZXNpLGVieAorCXhvcgllYnAsRFdPUkRbNTYrcnNwXQorCW1vdgllYXgscjEyZAorCW1vdglEV09SRFs1Mityc3BdLGVkeAorCW1vdgllYngscjEyZAorCXhvcgllYnAsRFdPUkRbcnNwXQorCWFuZAllYXgscjExZAorCW1vdgllY3gsZXNpCisJeG9yCWVicCxEV09SRFsyNCtyc3BdCisJbGVhCXIxM2QsWygoLTE4OTQwMDc1ODgpKStyMTMqMStyZHhdCisJeG9yCWVieCxyMTFkCisJcm9sCWVjeCw1CisJYWRkCXIxM2QsZWF4CisJcm9sCWVicCwxCisJYW5kCWVieCxlZGkKKwlhZGQJcjEzZCxlY3gKKwlyb2wJZWRpLDMwCisJYWRkCXIxM2QsZWJ4CisJeG9yCXIxNGQsRFdPUkRbNjArcnNwXQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFs1Nityc3BdLGVicAorCW1vdgllYngscjExZAorCXhvcglyMTRkLERXT1JEWzQrcnNwXQorCWFuZAllYXgsZWRpCisJbW92CWVjeCxyMTNkCisJeG9yCXIxNGQsRFdPUkRbMjgrcnNwXQorCWxlYQlyMTJkLFsoKC0xODk0MDA3NTg4KSkrcjEyKjErcmJwXQorCXhvcgllYngsZWRpCisJcm9sCWVjeCw1CisJYWRkCXIxMmQsZWF4CisJcm9sCXIxNGQsMQorCWFuZAllYngsZXNpCisJYWRkCXIxMmQsZWN4CisJcm9sCWVzaSwzMAorCWFkZAlyMTJkLGVieAorCXhvcgllZHgsRFdPUkRbcnNwXQorCW1vdgllYXgsZWRpCisJbW92CURXT1JEWzYwK3JzcF0scjE0ZAorCW1vdgllYngsZWRpCisJeG9yCWVkeCxEV09SRFs4K3JzcF0KKwlhbmQJZWF4LGVzaQorCW1vdgllY3gscjEyZAorCXhvcgllZHgsRFdPUkRbMzIrcnNwXQorCWxlYQlyMTFkLFsoKC0xODk0MDA3NTg4KSkrcjExKjErcjE0XQorCXhvcgllYngsZXNpCisJcm9sCWVjeCw1CisJYWRkCXIxMWQsZWF4CisJcm9sCWVkeCwxCisJYW5kCWVieCxyMTNkCisJYWRkCXIxMWQsZWN4CisJcm9sCXIxM2QsMzAKKwlhZGQJcjExZCxlYngKKwl4b3IJZWJwLERXT1JEWzQrcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEW3JzcF0sZWR4CisJbW92CWVieCxlc2kKKwl4b3IJZWJwLERXT1JEWzEyK3JzcF0KKwlhbmQJZWF4LHIxM2QKKwltb3YJZWN4LHIxMWQKKwl4b3IJZWJwLERXT1JEWzM2K3JzcF0KKwlsZWEJZWRpLFsoKC0xODk0MDA3NTg4KSkrcmRpKjErcmR4XQorCXhvcgllYngscjEzZAorCXJvbAllY3gsNQorCWFkZAllZGksZWF4CisJcm9sCWVicCwxCisJYW5kCWVieCxyMTJkCisJYWRkCWVkaSxlY3gKKwlyb2wJcjEyZCwzMAorCWFkZAllZGksZWJ4CisJeG9yCXIxNGQsRFdPUkRbOCtyc3BdCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzQrcnNwXSxlYnAKKwltb3YJZWJ4LHIxM2QKKwl4b3IJcjE0ZCxEV09SRFsxNityc3BdCisJYW5kCWVheCxyMTJkCisJbW92CWVjeCxlZGkKKwl4b3IJcjE0ZCxEV09SRFs0MCtyc3BdCisJbGVhCWVzaSxbKCgtMTg5NDAwNzU4OCkpK3JzaSoxK3JicF0KKwl4b3IJZWJ4LHIxMmQKKwlyb2wJZWN4LDUKKwlhZGQJZXNpLGVheAorCXJvbAlyMTRkLDEKKwlhbmQJZWJ4LHIxMWQKKwlhZGQJZXNpLGVjeAorCXJvbAlyMTFkLDMwCisJYWRkCWVzaSxlYngKKwl4b3IJZWR4LERXT1JEWzEyK3JzcF0KKwltb3YJZWF4LHIxMmQKKwltb3YJRFdPUkRbOCtyc3BdLHIxNGQKKwltb3YJZWJ4LHIxMmQKKwl4b3IJZWR4LERXT1JEWzIwK3JzcF0KKwlhbmQJZWF4LHIxMWQKKwltb3YJZWN4LGVzaQorCXhvcgllZHgsRFdPUkRbNDQrcnNwXQorCWxlYQlyMTNkLFsoKC0xODk0MDA3NTg4KSkrcjEzKjErcjE0XQorCXhvcgllYngscjExZAorCXJvbAllY3gsNQorCWFkZAlyMTNkLGVheAorCXJvbAllZHgsMQorCWFuZAllYngsZWRpCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVieAorCXhvcgllYnAsRFdPUkRbMTYrcnNwXQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFsxMityc3BdLGVkeAorCW1vdgllYngscjExZAorCXhvcgllYnAsRFdPUkRbMjQrcnNwXQorCWFuZAllYXgsZWRpCisJbW92CWVjeCxyMTNkCisJeG9yCWVicCxEV09SRFs0OCtyc3BdCisJbGVhCXIxMmQsWygoLTE4OTQwMDc1ODgpKStyMTIqMStyZHhdCisJeG9yCWVieCxlZGkKKwlyb2wJZWN4LDUKKwlhZGQJcjEyZCxlYXgKKwlyb2wJZWJwLDEKKwlhbmQJZWJ4LGVzaQorCWFkZAlyMTJkLGVjeAorCXJvbAllc2ksMzAKKwlhZGQJcjEyZCxlYngKKwl4b3IJcjE0ZCxEV09SRFsyMCtyc3BdCisJbW92CWVheCxlZGkKKwltb3YJRFdPUkRbMTYrcnNwXSxlYnAKKwltb3YJZWJ4LGVkaQorCXhvcglyMTRkLERXT1JEWzI4K3JzcF0KKwlhbmQJZWF4LGVzaQorCW1vdgllY3gscjEyZAorCXhvcglyMTRkLERXT1JEWzUyK3JzcF0KKwlsZWEJcjExZCxbKCgtMTg5NDAwNzU4OCkpK3IxMSoxK3JicF0KKwl4b3IJZWJ4LGVzaQorCXJvbAllY3gsNQorCWFkZAlyMTFkLGVheAorCXJvbAlyMTRkLDEKKwlhbmQJZWJ4LHIxM2QKKwlhZGQJcjExZCxlY3gKKwlyb2wJcjEzZCwzMAorCWFkZAlyMTFkLGVieAorCXhvcgllZHgsRFdPUkRbMjQrcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEWzIwK3JzcF0scjE0ZAorCW1vdgllYngsZXNpCisJeG9yCWVkeCxEV09SRFszMityc3BdCisJYW5kCWVheCxyMTNkCisJbW92CWVjeCxyMTFkCisJeG9yCWVkeCxEV09SRFs1Nityc3BdCisJbGVhCWVkaSxbKCgtMTg5NDAwNzU4OCkpK3JkaSoxK3IxNF0KKwl4b3IJZWJ4LHIxM2QKKwlyb2wJZWN4LDUKKwlhZGQJZWRpLGVheAorCXJvbAllZHgsMQorCWFuZAllYngscjEyZAorCWFkZAllZGksZWN4CisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVieAorCXhvcgllYnAsRFdPUkRbMjgrcnNwXQorCW1vdgllYXgscjEzZAorCW1vdglEV09SRFsyNCtyc3BdLGVkeAorCW1vdgllYngscjEzZAorCXhvcgllYnAsRFdPUkRbMzYrcnNwXQorCWFuZAllYXgscjEyZAorCW1vdgllY3gsZWRpCisJeG9yCWVicCxEV09SRFs2MCtyc3BdCisJbGVhCWVzaSxbKCgtMTg5NDAwNzU4OCkpK3JzaSoxK3JkeF0KKwl4b3IJZWJ4LHIxMmQKKwlyb2wJZWN4LDUKKwlhZGQJZXNpLGVheAorCXJvbAllYnAsMQorCWFuZAllYngscjExZAorCWFkZAllc2ksZWN4CisJcm9sCXIxMWQsMzAKKwlhZGQJZXNpLGVieAorCXhvcglyMTRkLERXT1JEWzMyK3JzcF0KKwltb3YJZWF4LHIxMmQKKwltb3YJRFdPUkRbMjgrcnNwXSxlYnAKKwltb3YJZWJ4LHIxMmQKKwl4b3IJcjE0ZCxEV09SRFs0MCtyc3BdCisJYW5kCWVheCxyMTFkCisJbW92CWVjeCxlc2kKKwl4b3IJcjE0ZCxEV09SRFtyc3BdCisJbGVhCXIxM2QsWygoLTE4OTQwMDc1ODgpKStyMTMqMStyYnBdCisJeG9yCWVieCxyMTFkCisJcm9sCWVjeCw1CisJYWRkCXIxM2QsZWF4CisJcm9sCXIxNGQsMQorCWFuZAllYngsZWRpCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVieAorCXhvcgllZHgsRFdPUkRbMzYrcnNwXQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFszMityc3BdLHIxNGQKKwltb3YJZWJ4LHIxMWQKKwl4b3IJZWR4LERXT1JEWzQ0K3JzcF0KKwlhbmQJZWF4LGVkaQorCW1vdgllY3gscjEzZAorCXhvcgllZHgsRFdPUkRbNCtyc3BdCisJbGVhCXIxMmQsWygoLTE4OTQwMDc1ODgpKStyMTIqMStyMTRdCisJeG9yCWVieCxlZGkKKwlyb2wJZWN4LDUKKwlhZGQJcjEyZCxlYXgKKwlyb2wJZWR4LDEKKwlhbmQJZWJ4LGVzaQorCWFkZAlyMTJkLGVjeAorCXJvbAllc2ksMzAKKwlhZGQJcjEyZCxlYngKKwl4b3IJZWJwLERXT1JEWzQwK3JzcF0KKwltb3YJZWF4LGVkaQorCW1vdglEV09SRFszNityc3BdLGVkeAorCW1vdgllYngsZWRpCisJeG9yCWVicCxEV09SRFs0OCtyc3BdCisJYW5kCWVheCxlc2kKKwltb3YJZWN4LHIxMmQKKwl4b3IJZWJwLERXT1JEWzgrcnNwXQorCWxlYQlyMTFkLFsoKC0xODk0MDA3NTg4KSkrcjExKjErcmR4XQorCXhvcgllYngsZXNpCisJcm9sCWVjeCw1CisJYWRkCXIxMWQsZWF4CisJcm9sCWVicCwxCisJYW5kCWVieCxyMTNkCisJYWRkCXIxMWQsZWN4CisJcm9sCXIxM2QsMzAKKwlhZGQJcjExZCxlYngKKwl4b3IJcjE0ZCxEV09SRFs0NCtyc3BdCisJbW92CWVheCxlc2kKKwltb3YJRFdPUkRbNDArcnNwXSxlYnAKKwltb3YJZWJ4LGVzaQorCXhvcglyMTRkLERXT1JEWzUyK3JzcF0KKwlhbmQJZWF4LHIxM2QKKwltb3YJZWN4LHIxMWQKKwl4b3IJcjE0ZCxEV09SRFsxMityc3BdCisJbGVhCWVkaSxbKCgtMTg5NDAwNzU4OCkpK3JkaSoxK3JicF0KKwl4b3IJZWJ4LHIxM2QKKwlyb2wJZWN4LDUKKwlhZGQJZWRpLGVheAorCXJvbAlyMTRkLDEKKwlhbmQJZWJ4LHIxMmQKKwlhZGQJZWRpLGVjeAorCXJvbAlyMTJkLDMwCisJYWRkCWVkaSxlYngKKwl4b3IJZWR4LERXT1JEWzQ4K3JzcF0KKwltb3YJZWF4LHIxM2QKKwltb3YJRFdPUkRbNDQrcnNwXSxyMTRkCisJbW92CWVieCxyMTNkCisJeG9yCWVkeCxEV09SRFs1Nityc3BdCisJYW5kCWVheCxyMTJkCisJbW92CWVjeCxlZGkKKwl4b3IJZWR4LERXT1JEWzE2K3JzcF0KKwlsZWEJZXNpLFsoKC0xODk0MDA3NTg4KSkrcnNpKjErcjE0XQorCXhvcgllYngscjEyZAorCXJvbAllY3gsNQorCWFkZAllc2ksZWF4CisJcm9sCWVkeCwxCisJYW5kCWVieCxyMTFkCisJYWRkCWVzaSxlY3gKKwlyb2wJcjExZCwzMAorCWFkZAllc2ksZWJ4CisJeG9yCWVicCxEV09SRFs1Mityc3BdCisJbW92CWVheCxlZGkKKwltb3YJRFdPUkRbNDgrcnNwXSxlZHgKKwltb3YJZWN4LGVzaQorCXhvcgllYnAsRFdPUkRbNjArcnNwXQorCXhvcgllYXgscjEyZAorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbMjArcnNwXQorCWxlYQlyMTNkLFsoKC04OTk0OTc1MTQpKStyMTMqMStyZHhdCisJeG9yCWVheCxyMTFkCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVheAorCXJvbAllYnAsMQorCXhvcglyMTRkLERXT1JEWzU2K3JzcF0KKwltb3YJZWF4LGVzaQorCW1vdglEV09SRFs1Mityc3BdLGVicAorCW1vdgllY3gscjEzZAorCXhvcglyMTRkLERXT1JEW3JzcF0KKwl4b3IJZWF4LHIxMWQKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFsyNCtyc3BdCisJbGVhCXIxMmQsWygoLTg5OTQ5NzUxNCkpK3IxMioxK3JicF0KKwl4b3IJZWF4LGVkaQorCWFkZAlyMTJkLGVjeAorCXJvbAllc2ksMzAKKwlhZGQJcjEyZCxlYXgKKwlyb2wJcjE0ZCwxCisJeG9yCWVkeCxEV09SRFs2MCtyc3BdCisJbW92CWVheCxyMTNkCisJbW92CURXT1JEWzU2K3JzcF0scjE0ZAorCW1vdgllY3gscjEyZAorCXhvcgllZHgsRFdPUkRbNCtyc3BdCisJeG9yCWVheCxlZGkKKwlyb2wJZWN4LDUKKwl4b3IJZWR4LERXT1JEWzI4K3JzcF0KKwlsZWEJcjExZCxbKCgtODk5NDk3NTE0KSkrcjExKjErcjE0XQorCXhvcgllYXgsZXNpCisJYWRkCXIxMWQsZWN4CisJcm9sCXIxM2QsMzAKKwlhZGQJcjExZCxlYXgKKwlyb2wJZWR4LDEKKwl4b3IJZWJwLERXT1JEW3JzcF0KKwltb3YJZWF4LHIxMmQKKwltb3YJRFdPUkRbNjArcnNwXSxlZHgKKwltb3YJZWN4LHIxMWQKKwl4b3IJZWJwLERXT1JEWzgrcnNwXQorCXhvcgllYXgsZXNpCisJcm9sCWVjeCw1CisJeG9yCWVicCxEV09SRFszMityc3BdCisJbGVhCWVkaSxbKCgtODk5NDk3NTE0KSkrcmRpKjErcmR4XQorCXhvcgllYXgscjEzZAorCWFkZAllZGksZWN4CisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVheAorCXJvbAllYnAsMQorCXhvcglyMTRkLERXT1JEWzQrcnNwXQorCW1vdgllYXgscjExZAorCW1vdglEV09SRFtyc3BdLGVicAorCW1vdgllY3gsZWRpCisJeG9yCXIxNGQsRFdPUkRbMTIrcnNwXQorCXhvcgllYXgscjEzZAorCXJvbAllY3gsNQorCXhvcglyMTRkLERXT1JEWzM2K3JzcF0KKwlsZWEJZXNpLFsoKC04OTk0OTc1MTQpKStyc2kqMStyYnBdCisJeG9yCWVheCxyMTJkCisJYWRkCWVzaSxlY3gKKwlyb2wJcjExZCwzMAorCWFkZAllc2ksZWF4CisJcm9sCXIxNGQsMQorCXhvcgllZHgsRFdPUkRbOCtyc3BdCisJbW92CWVheCxlZGkKKwltb3YJRFdPUkRbNCtyc3BdLHIxNGQKKwltb3YJZWN4LGVzaQorCXhvcgllZHgsRFdPUkRbMTYrcnNwXQorCXhvcgllYXgscjEyZAorCXJvbAllY3gsNQorCXhvcgllZHgsRFdPUkRbNDArcnNwXQorCWxlYQlyMTNkLFsoKC04OTk0OTc1MTQpKStyMTMqMStyMTRdCisJeG9yCWVheCxyMTFkCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVheAorCXJvbAllZHgsMQorCXhvcgllYnAsRFdPUkRbMTIrcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEWzgrcnNwXSxlZHgKKwltb3YJZWN4LHIxM2QKKwl4b3IJZWJwLERXT1JEWzIwK3JzcF0KKwl4b3IJZWF4LHIxMWQKKwlyb2wJZWN4LDUKKwl4b3IJZWJwLERXT1JEWzQ0K3JzcF0KKwlsZWEJcjEyZCxbKCgtODk5NDk3NTE0KSkrcjEyKjErcmR4XQorCXhvcgllYXgsZWRpCisJYWRkCXIxMmQsZWN4CisJcm9sCWVzaSwzMAorCWFkZAlyMTJkLGVheAorCXJvbAllYnAsMQorCXhvcglyMTRkLERXT1JEWzE2K3JzcF0KKwltb3YJZWF4LHIxM2QKKwltb3YJRFdPUkRbMTIrcnNwXSxlYnAKKwltb3YJZWN4LHIxMmQKKwl4b3IJcjE0ZCxEV09SRFsyNCtyc3BdCisJeG9yCWVheCxlZGkKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFs0OCtyc3BdCisJbGVhCXIxMWQsWygoLTg5OTQ5NzUxNCkpK3IxMSoxK3JicF0KKwl4b3IJZWF4LGVzaQorCWFkZAlyMTFkLGVjeAorCXJvbAlyMTNkLDMwCisJYWRkCXIxMWQsZWF4CisJcm9sCXIxNGQsMQorCXhvcgllZHgsRFdPUkRbMjArcnNwXQorCW1vdgllYXgscjEyZAorCW1vdglEV09SRFsxNityc3BdLHIxNGQKKwltb3YJZWN4LHIxMWQKKwl4b3IJZWR4LERXT1JEWzI4K3JzcF0KKwl4b3IJZWF4LGVzaQorCXJvbAllY3gsNQorCXhvcgllZHgsRFdPUkRbNTIrcnNwXQorCWxlYQllZGksWygoLTg5OTQ5NzUxNCkpK3JkaSoxK3IxNF0KKwl4b3IJZWF4LHIxM2QKKwlhZGQJZWRpLGVjeAorCXJvbAlyMTJkLDMwCisJYWRkCWVkaSxlYXgKKwlyb2wJZWR4LDEKKwl4b3IJZWJwLERXT1JEWzI0K3JzcF0KKwltb3YJZWF4LHIxMWQKKwltb3YJRFdPUkRbMjArcnNwXSxlZHgKKwltb3YJZWN4LGVkaQorCXhvcgllYnAsRFdPUkRbMzIrcnNwXQorCXhvcgllYXgscjEzZAorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbNTYrcnNwXQorCWxlYQllc2ksWygoLTg5OTQ5NzUxNCkpK3JzaSoxK3JkeF0KKwl4b3IJZWF4LHIxMmQKKwlhZGQJZXNpLGVjeAorCXJvbAlyMTFkLDMwCisJYWRkCWVzaSxlYXgKKwlyb2wJZWJwLDEKKwl4b3IJcjE0ZCxEV09SRFsyOCtyc3BdCisJbW92CWVheCxlZGkKKwltb3YJRFdPUkRbMjQrcnNwXSxlYnAKKwltb3YJZWN4LGVzaQorCXhvcglyMTRkLERXT1JEWzM2K3JzcF0KKwl4b3IJZWF4LHIxMmQKKwlyb2wJZWN4LDUKKwl4b3IJcjE0ZCxEV09SRFs2MCtyc3BdCisJbGVhCXIxM2QsWygoLTg5OTQ5NzUxNCkpK3IxMyoxK3JicF0KKwl4b3IJZWF4LHIxMWQKKwlhZGQJcjEzZCxlY3gKKwlyb2wJZWRpLDMwCisJYWRkCXIxM2QsZWF4CisJcm9sCXIxNGQsMQorCXhvcgllZHgsRFdPUkRbMzIrcnNwXQorCW1vdgllYXgsZXNpCisJbW92CURXT1JEWzI4K3JzcF0scjE0ZAorCW1vdgllY3gscjEzZAorCXhvcgllZHgsRFdPUkRbNDArcnNwXQorCXhvcgllYXgscjExZAorCXJvbAllY3gsNQorCXhvcgllZHgsRFdPUkRbcnNwXQorCWxlYQlyMTJkLFsoKC04OTk0OTc1MTQpKStyMTIqMStyMTRdCisJeG9yCWVheCxlZGkKKwlhZGQJcjEyZCxlY3gKKwlyb2wJZXNpLDMwCisJYWRkCXIxMmQsZWF4CisJcm9sCWVkeCwxCisJeG9yCWVicCxEV09SRFszNityc3BdCisJbW92CWVheCxyMTNkCisKKwltb3YJZWN4LHIxMmQKKwl4b3IJZWJwLERXT1JEWzQ0K3JzcF0KKwl4b3IJZWF4LGVkaQorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbNCtyc3BdCisJbGVhCXIxMWQsWygoLTg5OTQ5NzUxNCkpK3IxMSoxK3JkeF0KKwl4b3IJZWF4LGVzaQorCWFkZAlyMTFkLGVjeAorCXJvbAlyMTNkLDMwCisJYWRkCXIxMWQsZWF4CisJcm9sCWVicCwxCisJeG9yCXIxNGQsRFdPUkRbNDArcnNwXQorCW1vdgllYXgscjEyZAorCisJbW92CWVjeCxyMTFkCisJeG9yCXIxNGQsRFdPUkRbNDgrcnNwXQorCXhvcgllYXgsZXNpCisJcm9sCWVjeCw1CisJeG9yCXIxNGQsRFdPUkRbOCtyc3BdCisJbGVhCWVkaSxbKCgtODk5NDk3NTE0KSkrcmRpKjErcmJwXQorCXhvcgllYXgscjEzZAorCWFkZAllZGksZWN4CisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVheAorCXJvbAlyMTRkLDEKKwl4b3IJZWR4LERXT1JEWzQ0K3JzcF0KKwltb3YJZWF4LHIxMWQKKworCW1vdgllY3gsZWRpCisJeG9yCWVkeCxEV09SRFs1Mityc3BdCisJeG9yCWVheCxyMTNkCisJcm9sCWVjeCw1CisJeG9yCWVkeCxEV09SRFsxMityc3BdCisJbGVhCWVzaSxbKCgtODk5NDk3NTE0KSkrcnNpKjErcjE0XQorCXhvcgllYXgscjEyZAorCWFkZAllc2ksZWN4CisJcm9sCXIxMWQsMzAKKwlhZGQJZXNpLGVheAorCXJvbAllZHgsMQorCXhvcgllYnAsRFdPUkRbNDgrcnNwXQorCW1vdgllYXgsZWRpCisKKwltb3YJZWN4LGVzaQorCXhvcgllYnAsRFdPUkRbNTYrcnNwXQorCXhvcgllYXgscjEyZAorCXJvbAllY3gsNQorCXhvcgllYnAsRFdPUkRbMTYrcnNwXQorCWxlYQlyMTNkLFsoKC04OTk0OTc1MTQpKStyMTMqMStyZHhdCisJeG9yCWVheCxyMTFkCisJYWRkCXIxM2QsZWN4CisJcm9sCWVkaSwzMAorCWFkZAlyMTNkLGVheAorCXJvbAllYnAsMQorCXhvcglyMTRkLERXT1JEWzUyK3JzcF0KKwltb3YJZWF4LGVzaQorCisJbW92CWVjeCxyMTNkCisJeG9yCXIxNGQsRFdPUkRbNjArcnNwXQorCXhvcgllYXgscjExZAorCXJvbAllY3gsNQorCXhvcglyMTRkLERXT1JEWzIwK3JzcF0KKwlsZWEJcjEyZCxbKCgtODk5NDk3NTE0KSkrcjEyKjErcmJwXQorCXhvcgllYXgsZWRpCisJYWRkCXIxMmQsZWN4CisJcm9sCWVzaSwzMAorCWFkZAlyMTJkLGVheAorCXJvbAlyMTRkLDEKKwl4b3IJZWR4LERXT1JEWzU2K3JzcF0KKwltb3YJZWF4LHIxM2QKKworCW1vdgllY3gscjEyZAorCXhvcgllZHgsRFdPUkRbcnNwXQorCXhvcgllYXgsZWRpCisJcm9sCWVjeCw1CisJeG9yCWVkeCxEV09SRFsyNCtyc3BdCisJbGVhCXIxMWQsWygoLTg5OTQ5NzUxNCkpK3IxMSoxK3IxNF0KKwl4b3IJZWF4LGVzaQorCWFkZAlyMTFkLGVjeAorCXJvbAlyMTNkLDMwCisJYWRkCXIxMWQsZWF4CisJcm9sCWVkeCwxCisJeG9yCWVicCxEV09SRFs2MCtyc3BdCisJbW92CWVheCxyMTJkCisKKwltb3YJZWN4LHIxMWQKKwl4b3IJZWJwLERXT1JEWzQrcnNwXQorCXhvcgllYXgsZXNpCisJcm9sCWVjeCw1CisJeG9yCWVicCxEV09SRFsyOCtyc3BdCisJbGVhCWVkaSxbKCgtODk5NDk3NTE0KSkrcmRpKjErcmR4XQorCXhvcgllYXgscjEzZAorCWFkZAllZGksZWN4CisJcm9sCXIxMmQsMzAKKwlhZGQJZWRpLGVheAorCXJvbAllYnAsMQorCW1vdgllYXgscjExZAorCW1vdgllY3gsZWRpCisJeG9yCWVheCxyMTNkCisJbGVhCWVzaSxbKCgtODk5NDk3NTE0KSkrcnNpKjErcmJwXQorCXJvbAllY3gsNQorCXhvcgllYXgscjEyZAorCWFkZAllc2ksZWN4CisJcm9sCXIxMWQsMzAKKwlhZGQJZXNpLGVheAorCWFkZAllc2ksRFdPUkRbcjhdCisJYWRkCWVkaSxEV09SRFs0K3I4XQorCWFkZAlyMTFkLERXT1JEWzgrcjhdCisJYWRkCXIxMmQsRFdPUkRbMTIrcjhdCisJYWRkCXIxM2QsRFdPUkRbMTYrcjhdCisJbW92CURXT1JEW3I4XSxlc2kKKwltb3YJRFdPUkRbNCtyOF0sZWRpCisJbW92CURXT1JEWzgrcjhdLHIxMWQKKwltb3YJRFdPUkRbMTIrcjhdLHIxMmQKKwltb3YJRFdPUkRbMTYrcjhdLHIxM2QKKworCXN1YglyMTAsMQorCWxlYQlyOSxbNjQrcjldCisJam56CU5FQVIgJEwkbG9vcAorCisJbW92CXJzaSxRV09SRFs2NCtyc3BdCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRlcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9zaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisKK0FMSUdOCTE2CitzaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTM6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTM6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCitfc3NzZTNfc2hvcnRjdXQ6CisKKwltb3YJcjExLHJzcAorCisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlsZWEJcnNwLFsoKC0xNjApKStyc3BdCisJbW92YXBzCVhNTVdPUkRbKC00MC05NikrcjExXSx4bW02CisJbW92YXBzCVhNTVdPUkRbKC00MC04MCkrcjExXSx4bW03CisJbW92YXBzCVhNTVdPUkRbKC00MC02NCkrcjExXSx4bW04CisJbW92YXBzCVhNTVdPUkRbKC00MC00OCkrcjExXSx4bW05CisJbW92YXBzCVhNTVdPUkRbKC00MC0zMikrcjExXSx4bW0xMAorCW1vdmFwcwlYTU1XT1JEWygtNDAtMTYpK3IxMV0seG1tMTEKKyRMJHByb2xvZ3VlX3Nzc2UzOgorCWFuZAlyc3AsLTY0CisJbW92CXI4LHJkaQorCW1vdglyOSxyc2kKKwltb3YJcjEwLHJkeAorCisJc2hsCXIxMCw2CisJYWRkCXIxMCxyOQorCWxlYQlyMTQsWygoS19YWF9YWCs2NCkpXQorCisJbW92CWVheCxEV09SRFtyOF0KKwltb3YJZWJ4LERXT1JEWzQrcjhdCisJbW92CWVjeCxEV09SRFs4K3I4XQorCW1vdgllZHgsRFdPUkRbMTIrcjhdCisJbW92CWVzaSxlYngKKwltb3YJZWJwLERXT1JEWzE2K3I4XQorCW1vdgllZGksZWN4CisJeG9yCWVkaSxlZHgKKwlhbmQJZXNpLGVkaQorCisJbW92ZHFhCXhtbTYsWE1NV09SRFs2NCtyMTRdCisJbW92ZHFhCXhtbTksWE1NV09SRFsoKC02NCkpK3IxNF0KKwltb3ZkcXUJeG1tMCxYTU1XT1JEW3I5XQorCW1vdmRxdQl4bW0xLFhNTVdPUkRbMTYrcjldCisJbW92ZHF1CXhtbTIsWE1NV09SRFszMityOV0KKwltb3ZkcXUJeG1tMyxYTU1XT1JEWzQ4K3I5XQorREIJMTAyLDE1LDU2LDAsMTk4CitEQgkxMDIsMTUsNTYsMCwyMDYKK0RCCTEwMiwxNSw1NiwwLDIxNAorCWFkZAlyOSw2NAorCXBhZGRkCXhtbTAseG1tOQorREIJMTAyLDE1LDU2LDAsMjIyCisJcGFkZGQJeG1tMSx4bW05CisJcGFkZGQJeG1tMix4bW05CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW0wCisJcHN1YmQJeG1tMCx4bW05CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0xCisJcHN1YmQJeG1tMSx4bW05CisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0yCisJcHN1YmQJeG1tMix4bW05CisJam1wCU5FQVIgJEwkb29wX3Nzc2UzCitBTElHTgkxNgorJEwkb29wX3Nzc2UzOgorCXJvcgllYngsMgorCXBzaHVmZAl4bW00LHhtbTAsMjM4CisJeG9yCWVzaSxlZHgKKwltb3ZkcWEJeG1tOCx4bW0zCisJcGFkZGQJeG1tOSx4bW0zCisJbW92CWVkaSxlYXgKKwlhZGQJZWJwLERXT1JEW3JzcF0KKwlwdW5wY2tscWRxCXhtbTQseG1tMQorCXhvcgllYngsZWN4CisJcm9sCWVheCw1CisJYWRkCWVicCxlc2kKKwlwc3JsZHEJeG1tOCw0CisJYW5kCWVkaSxlYngKKwl4b3IJZWJ4LGVjeAorCXB4b3IJeG1tNCx4bW0wCisJYWRkCWVicCxlYXgKKwlyb3IJZWF4LDcKKwlweG9yCXhtbTgseG1tMgorCXhvcgllZGksZWN4CisJbW92CWVzaSxlYnAKKwlhZGQJZWR4LERXT1JEWzQrcnNwXQorCXB4b3IJeG1tNCx4bW04CisJeG9yCWVheCxlYngKKwlyb2wJZWJwLDUKKwltb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTkKKwlhZGQJZWR4LGVkaQorCWFuZAllc2ksZWF4CisJbW92ZHFhCXhtbTEwLHhtbTQKKwl4b3IJZWF4LGVieAorCWFkZAllZHgsZWJwCisJcm9yCWVicCw3CisJbW92ZHFhCXhtbTgseG1tNAorCXhvcgllc2ksZWJ4CisJcHNsbGRxCXhtbTEwLDEyCisJcGFkZGQJeG1tNCx4bW00CisJbW92CWVkaSxlZHgKKwlhZGQJZWN4LERXT1JEWzgrcnNwXQorCXBzcmxkCXhtbTgsMzEKKwl4b3IJZWJwLGVheAorCXJvbAllZHgsNQorCWFkZAllY3gsZXNpCisJbW92ZHFhCXhtbTkseG1tMTAKKwlhbmQJZWRpLGVicAorCXhvcgllYnAsZWF4CisJcHNybGQJeG1tMTAsMzAKKwlhZGQJZWN4LGVkeAorCXJvcgllZHgsNworCXBvcgl4bW00LHhtbTgKKwl4b3IJZWRpLGVheAorCW1vdgllc2ksZWN4CisJYWRkCWVieCxEV09SRFsxMityc3BdCisJcHNsbGQJeG1tOSwyCisJcHhvcgl4bW00LHhtbTEwCisJeG9yCWVkeCxlYnAKKwltb3ZkcWEJeG1tMTAsWE1NV09SRFsoKC02NCkpK3IxNF0KKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVkaQorCWFuZAllc2ksZWR4CisJcHhvcgl4bW00LHhtbTkKKwl4b3IJZWR4LGVicAorCWFkZAllYngsZWN4CisJcm9yCWVjeCw3CisJcHNodWZkCXhtbTUseG1tMSwyMzgKKwl4b3IJZXNpLGVicAorCW1vdmRxYQl4bW05LHhtbTQKKwlwYWRkZAl4bW0xMCx4bW00CisJbW92CWVkaSxlYngKKwlhZGQJZWF4LERXT1JEWzE2K3JzcF0KKwlwdW5wY2tscWRxCXhtbTUseG1tMgorCXhvcgllY3gsZWR4CisJcm9sCWVieCw1CisJYWRkCWVheCxlc2kKKwlwc3JsZHEJeG1tOSw0CisJYW5kCWVkaSxlY3gKKwl4b3IJZWN4LGVkeAorCXB4b3IJeG1tNSx4bW0xCisJYWRkCWVheCxlYngKKwlyb3IJZWJ4LDcKKwlweG9yCXhtbTkseG1tMworCXhvcgllZGksZWR4CisJbW92CWVzaSxlYXgKKwlhZGQJZWJwLERXT1JEWzIwK3JzcF0KKwlweG9yCXhtbTUseG1tOQorCXhvcgllYngsZWN4CisJcm9sCWVheCw1CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW0xMAorCWFkZAllYnAsZWRpCisJYW5kCWVzaSxlYngKKwltb3ZkcWEJeG1tOCx4bW01CisJeG9yCWVieCxlY3gKKwlhZGQJZWJwLGVheAorCXJvcgllYXgsNworCW1vdmRxYQl4bW05LHhtbTUKKwl4b3IJZXNpLGVjeAorCXBzbGxkcQl4bW04LDEyCisJcGFkZGQJeG1tNSx4bW01CisJbW92CWVkaSxlYnAKKwlhZGQJZWR4LERXT1JEWzI0K3JzcF0KKwlwc3JsZAl4bW05LDMxCisJeG9yCWVheCxlYngKKwlyb2wJZWJwLDUKKwlhZGQJZWR4LGVzaQorCW1vdmRxYQl4bW0xMCx4bW04CisJYW5kCWVkaSxlYXgKKwl4b3IJZWF4LGVieAorCXBzcmxkCXhtbTgsMzAKKwlhZGQJZWR4LGVicAorCXJvcgllYnAsNworCXBvcgl4bW01LHhtbTkKKwl4b3IJZWRpLGVieAorCW1vdgllc2ksZWR4CisJYWRkCWVjeCxEV09SRFsyOCtyc3BdCisJcHNsbGQJeG1tMTAsMgorCXB4b3IJeG1tNSx4bW04CisJeG9yCWVicCxlYXgKKwltb3ZkcWEJeG1tOCxYTU1XT1JEWygoLTMyKSkrcjE0XQorCXJvbAllZHgsNQorCWFkZAllY3gsZWRpCisJYW5kCWVzaSxlYnAKKwlweG9yCXhtbTUseG1tMTAKKwl4b3IJZWJwLGVheAorCWFkZAllY3gsZWR4CisJcm9yCWVkeCw3CisJcHNodWZkCXhtbTYseG1tMiwyMzgKKwl4b3IJZXNpLGVheAorCW1vdmRxYQl4bW0xMCx4bW01CisJcGFkZGQJeG1tOCx4bW01CisJbW92CWVkaSxlY3gKKwlhZGQJZWJ4LERXT1JEWzMyK3JzcF0KKwlwdW5wY2tscWRxCXhtbTYseG1tMworCXhvcgllZHgsZWJwCisJcm9sCWVjeCw1CisJYWRkCWVieCxlc2kKKwlwc3JsZHEJeG1tMTAsNAorCWFuZAllZGksZWR4CisJeG9yCWVkeCxlYnAKKwlweG9yCXhtbTYseG1tMgorCWFkZAllYngsZWN4CisJcm9yCWVjeCw3CisJcHhvcgl4bW0xMCx4bW00CisJeG9yCWVkaSxlYnAKKwltb3YJZXNpLGVieAorCWFkZAllYXgsRFdPUkRbMzYrcnNwXQorCXB4b3IJeG1tNix4bW0xMAorCXhvcgllY3gsZWR4CisJcm9sCWVieCw1CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW04CisJYWRkCWVheCxlZGkKKwlhbmQJZXNpLGVjeAorCW1vdmRxYQl4bW05LHhtbTYKKwl4b3IJZWN4LGVkeAorCWFkZAllYXgsZWJ4CisJcm9yCWVieCw3CisJbW92ZHFhCXhtbTEwLHhtbTYKKwl4b3IJZXNpLGVkeAorCXBzbGxkcQl4bW05LDEyCisJcGFkZGQJeG1tNix4bW02CisJbW92CWVkaSxlYXgKKwlhZGQJZWJwLERXT1JEWzQwK3JzcF0KKwlwc3JsZAl4bW0xMCwzMQorCXhvcgllYngsZWN4CisJcm9sCWVheCw1CisJYWRkCWVicCxlc2kKKwltb3ZkcWEJeG1tOCx4bW05CisJYW5kCWVkaSxlYngKKwl4b3IJZWJ4LGVjeAorCXBzcmxkCXhtbTksMzAKKwlhZGQJZWJwLGVheAorCXJvcgllYXgsNworCXBvcgl4bW02LHhtbTEwCisJeG9yCWVkaSxlY3gKKwltb3YJZXNpLGVicAorCWFkZAllZHgsRFdPUkRbNDQrcnNwXQorCXBzbGxkCXhtbTgsMgorCXB4b3IJeG1tNix4bW05CisJeG9yCWVheCxlYngKKwltb3ZkcWEJeG1tOSxYTU1XT1JEWygoLTMyKSkrcjE0XQorCXJvbAllYnAsNQorCWFkZAllZHgsZWRpCisJYW5kCWVzaSxlYXgKKwlweG9yCXhtbTYseG1tOAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlyb3IJZWJwLDcKKwlwc2h1ZmQJeG1tNyx4bW0zLDIzOAorCXhvcgllc2ksZWJ4CisJbW92ZHFhCXhtbTgseG1tNgorCXBhZGRkCXhtbTkseG1tNgorCW1vdgllZGksZWR4CisJYWRkCWVjeCxEV09SRFs0OCtyc3BdCisJcHVucGNrbHFkcQl4bW03LHhtbTQKKwl4b3IJZWJwLGVheAorCXJvbAllZHgsNQorCWFkZAllY3gsZXNpCisJcHNybGRxCXhtbTgsNAorCWFuZAllZGksZWJwCisJeG9yCWVicCxlYXgKKwlweG9yCXhtbTcseG1tMworCWFkZAllY3gsZWR4CisJcm9yCWVkeCw3CisJcHhvcgl4bW04LHhtbTUKKwl4b3IJZWRpLGVheAorCW1vdgllc2ksZWN4CisJYWRkCWVieCxEV09SRFs1Mityc3BdCisJcHhvcgl4bW03LHhtbTgKKwl4b3IJZWR4LGVicAorCXJvbAllY3gsNQorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tOQorCWFkZAllYngsZWRpCisJYW5kCWVzaSxlZHgKKwltb3ZkcWEJeG1tMTAseG1tNworCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwlyb3IJZWN4LDcKKwltb3ZkcWEJeG1tOCx4bW03CisJeG9yCWVzaSxlYnAKKwlwc2xsZHEJeG1tMTAsMTIKKwlwYWRkZAl4bW03LHhtbTcKKwltb3YJZWRpLGVieAorCWFkZAllYXgsRFdPUkRbNTYrcnNwXQorCXBzcmxkCXhtbTgsMzEKKwl4b3IJZWN4LGVkeAorCXJvbAllYngsNQorCWFkZAllYXgsZXNpCisJbW92ZHFhCXhtbTkseG1tMTAKKwlhbmQJZWRpLGVjeAorCXhvcgllY3gsZWR4CisJcHNybGQJeG1tMTAsMzAKKwlhZGQJZWF4LGVieAorCXJvcgllYngsNworCXBvcgl4bW03LHhtbTgKKwl4b3IJZWRpLGVkeAorCW1vdgllc2ksZWF4CisJYWRkCWVicCxEV09SRFs2MCtyc3BdCisJcHNsbGQJeG1tOSwyCisJcHhvcgl4bW03LHhtbTEwCisJeG9yCWVieCxlY3gKKwltb3ZkcWEJeG1tMTAsWE1NV09SRFsoKC0zMikpK3IxNF0KKwlyb2wJZWF4LDUKKwlhZGQJZWJwLGVkaQorCWFuZAllc2ksZWJ4CisJcHhvcgl4bW03LHhtbTkKKwlwc2h1ZmQJeG1tOSx4bW02LDIzOAorCXhvcgllYngsZWN4CisJYWRkCWVicCxlYXgKKwlyb3IJZWF4LDcKKwlweG9yCXhtbTAseG1tNAorCXhvcgllc2ksZWN4CisJbW92CWVkaSxlYnAKKwlhZGQJZWR4LERXT1JEW3JzcF0KKwlwdW5wY2tscWRxCXhtbTkseG1tNworCXhvcgllYXgsZWJ4CisJcm9sCWVicCw1CisJcHhvcgl4bW0wLHhtbTEKKwlhZGQJZWR4LGVzaQorCWFuZAllZGksZWF4CisJbW92ZHFhCXhtbTgseG1tMTAKKwl4b3IJZWF4LGVieAorCXBhZGRkCXhtbTEwLHhtbTcKKwlhZGQJZWR4LGVicAorCXB4b3IJeG1tMCx4bW05CisJcm9yCWVicCw3CisJeG9yCWVkaSxlYngKKwltb3YJZXNpLGVkeAorCWFkZAllY3gsRFdPUkRbNCtyc3BdCisJbW92ZHFhCXhtbTkseG1tMAorCXhvcgllYnAsZWF4CisJcm9sCWVkeCw1CisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0xMAorCWFkZAllY3gsZWRpCisJYW5kCWVzaSxlYnAKKwl4b3IJZWJwLGVheAorCXBzbGxkCXhtbTAsMgorCWFkZAllY3gsZWR4CisJcm9yCWVkeCw3CisJcHNybGQJeG1tOSwzMAorCXhvcgllc2ksZWF4CisJbW92CWVkaSxlY3gKKwlhZGQJZWJ4LERXT1JEWzgrcnNwXQorCXBvcgl4bW0wLHhtbTkKKwl4b3IJZWR4LGVicAorCXJvbAllY3gsNQorCXBzaHVmZAl4bW0xMCx4bW03LDIzOAorCWFkZAllYngsZXNpCisJYW5kCWVkaSxlZHgKKwl4b3IJZWR4LGVicAorCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFsxMityc3BdCisJeG9yCWVkaSxlYnAKKwltb3YJZXNpLGVieAorCXJvbAllYngsNQorCWFkZAllYXgsZWRpCisJeG9yCWVzaSxlZHgKKwlyb3IJZWN4LDcKKwlhZGQJZWF4LGVieAorCXB4b3IJeG1tMSx4bW01CisJYWRkCWVicCxEV09SRFsxNityc3BdCisJeG9yCWVzaSxlY3gKKwlwdW5wY2tscWRxCXhtbTEwLHhtbTAKKwltb3YJZWRpLGVheAorCXJvbAllYXgsNQorCXB4b3IJeG1tMSx4bW0yCisJYWRkCWVicCxlc2kKKwl4b3IJZWRpLGVjeAorCW1vdmRxYQl4bW05LHhtbTgKKwlyb3IJZWJ4LDcKKwlwYWRkZAl4bW04LHhtbTAKKwlhZGQJZWJwLGVheAorCXB4b3IJeG1tMSx4bW0xMAorCWFkZAllZHgsRFdPUkRbMjArcnNwXQorCXhvcgllZGksZWJ4CisJbW92CWVzaSxlYnAKKwlyb2wJZWJwLDUKKwltb3ZkcWEJeG1tMTAseG1tMQorCWFkZAllZHgsZWRpCisJeG9yCWVzaSxlYngKKwltb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTgKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVicAorCWFkZAllY3gsRFdPUkRbMjQrcnNwXQorCXBzbGxkCXhtbTEsMgorCXhvcgllc2ksZWF4CisJbW92CWVkaSxlZHgKKwlwc3JsZAl4bW0xMCwzMAorCXJvbAllZHgsNQorCWFkZAllY3gsZXNpCisJeG9yCWVkaSxlYXgKKwlyb3IJZWJwLDcKKwlwb3IJeG1tMSx4bW0xMAorCWFkZAllY3gsZWR4CisJYWRkCWVieCxEV09SRFsyOCtyc3BdCisJcHNodWZkCXhtbTgseG1tMCwyMzgKKwl4b3IJZWRpLGVicAorCW1vdgllc2ksZWN4CisJcm9sCWVjeCw1CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVicAorCXJvcgllZHgsNworCWFkZAllYngsZWN4CisJcHhvcgl4bW0yLHhtbTYKKwlhZGQJZWF4LERXT1JEWzMyK3JzcF0KKwl4b3IJZXNpLGVkeAorCXB1bnBja2xxZHEJeG1tOCx4bW0xCisJbW92CWVkaSxlYngKKwlyb2wJZWJ4LDUKKwlweG9yCXhtbTIseG1tMworCWFkZAllYXgsZXNpCisJeG9yCWVkaSxlZHgKKwltb3ZkcWEJeG1tMTAsWE1NV09SRFtyMTRdCisJcm9yCWVjeCw3CisJcGFkZGQJeG1tOSx4bW0xCisJYWRkCWVheCxlYngKKwlweG9yCXhtbTIseG1tOAorCWFkZAllYnAsRFdPUkRbMzYrcnNwXQorCXhvcgllZGksZWN4CisJbW92CWVzaSxlYXgKKwlyb2wJZWF4LDUKKwltb3ZkcWEJeG1tOCx4bW0yCisJYWRkCWVicCxlZGkKKwl4b3IJZXNpLGVjeAorCW1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tOQorCXJvcgllYngsNworCWFkZAllYnAsZWF4CisJYWRkCWVkeCxEV09SRFs0MCtyc3BdCisJcHNsbGQJeG1tMiwyCisJeG9yCWVzaSxlYngKKwltb3YJZWRpLGVicAorCXBzcmxkCXhtbTgsMzAKKwlyb2wJZWJwLDUKKwlhZGQJZWR4LGVzaQorCXhvcgllZGksZWJ4CisJcm9yCWVheCw3CisJcG9yCXhtbTIseG1tOAorCWFkZAllZHgsZWJwCisJYWRkCWVjeCxEV09SRFs0NCtyc3BdCisJcHNodWZkCXhtbTkseG1tMSwyMzgKKwl4b3IJZWRpLGVheAorCW1vdgllc2ksZWR4CisJcm9sCWVkeCw1CisJYWRkCWVjeCxlZGkKKwl4b3IJZXNpLGVheAorCXJvcgllYnAsNworCWFkZAllY3gsZWR4CisJcHhvcgl4bW0zLHhtbTcKKwlhZGQJZWJ4LERXT1JEWzQ4K3JzcF0KKwl4b3IJZXNpLGVicAorCXB1bnBja2xxZHEJeG1tOSx4bW0yCisJbW92CWVkaSxlY3gKKwlyb2wJZWN4LDUKKwlweG9yCXhtbTMseG1tNAorCWFkZAllYngsZXNpCisJeG9yCWVkaSxlYnAKKwltb3ZkcWEJeG1tOCx4bW0xMAorCXJvcgllZHgsNworCXBhZGRkCXhtbTEwLHhtbTIKKwlhZGQJZWJ4LGVjeAorCXB4b3IJeG1tMyx4bW05CisJYWRkCWVheCxEV09SRFs1Mityc3BdCisJeG9yCWVkaSxlZHgKKwltb3YJZXNpLGVieAorCXJvbAllYngsNQorCW1vdmRxYQl4bW05LHhtbTMKKwlhZGQJZWF4LGVkaQorCXhvcgllc2ksZWR4CisJbW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0xMAorCXJvcgllY3gsNworCWFkZAllYXgsZWJ4CisJYWRkCWVicCxEV09SRFs1Nityc3BdCisJcHNsbGQJeG1tMywyCisJeG9yCWVzaSxlY3gKKwltb3YJZWRpLGVheAorCXBzcmxkCXhtbTksMzAKKwlyb2wJZWF4LDUKKwlhZGQJZWJwLGVzaQorCXhvcgllZGksZWN4CisJcm9yCWVieCw3CisJcG9yCXhtbTMseG1tOQorCWFkZAllYnAsZWF4CisJYWRkCWVkeCxEV09SRFs2MCtyc3BdCisJcHNodWZkCXhtbTEwLHhtbTIsMjM4CisJeG9yCWVkaSxlYngKKwltb3YJZXNpLGVicAorCXJvbAllYnAsNQorCWFkZAllZHgsZWRpCisJeG9yCWVzaSxlYngKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVicAorCXB4b3IJeG1tNCx4bW0wCisJYWRkCWVjeCxEV09SRFtyc3BdCisJeG9yCWVzaSxlYXgKKwlwdW5wY2tscWRxCXhtbTEwLHhtbTMKKwltb3YJZWRpLGVkeAorCXJvbAllZHgsNQorCXB4b3IJeG1tNCx4bW01CisJYWRkCWVjeCxlc2kKKwl4b3IJZWRpLGVheAorCW1vdmRxYQl4bW05LHhtbTgKKwlyb3IJZWJwLDcKKwlwYWRkZAl4bW04LHhtbTMKKwlhZGQJZWN4LGVkeAorCXB4b3IJeG1tNCx4bW0xMAorCWFkZAllYngsRFdPUkRbNCtyc3BdCisJeG9yCWVkaSxlYnAKKwltb3YJZXNpLGVjeAorCXJvbAllY3gsNQorCW1vdmRxYQl4bW0xMCx4bW00CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVicAorCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tOAorCXJvcgllZHgsNworCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFs4K3JzcF0KKwlwc2xsZAl4bW00LDIKKwl4b3IJZXNpLGVkeAorCW1vdgllZGksZWJ4CisJcHNybGQJeG1tMTAsMzAKKwlyb2wJZWJ4LDUKKwlhZGQJZWF4LGVzaQorCXhvcgllZGksZWR4CisJcm9yCWVjeCw3CisJcG9yCXhtbTQseG1tMTAKKwlhZGQJZWF4LGVieAorCWFkZAllYnAsRFdPUkRbMTIrcnNwXQorCXBzaHVmZAl4bW04LHhtbTMsMjM4CisJeG9yCWVkaSxlY3gKKwltb3YJZXNpLGVheAorCXJvbAllYXgsNQorCWFkZAllYnAsZWRpCisJeG9yCWVzaSxlY3gKKwlyb3IJZWJ4LDcKKwlhZGQJZWJwLGVheAorCXB4b3IJeG1tNSx4bW0xCisJYWRkCWVkeCxEV09SRFsxNityc3BdCisJeG9yCWVzaSxlYngKKwlwdW5wY2tscWRxCXhtbTgseG1tNAorCW1vdgllZGksZWJwCisJcm9sCWVicCw1CisJcHhvcgl4bW01LHhtbTYKKwlhZGQJZWR4LGVzaQorCXhvcgllZGksZWJ4CisJbW92ZHFhCXhtbTEwLHhtbTkKKwlyb3IJZWF4LDcKKwlwYWRkZAl4bW05LHhtbTQKKwlhZGQJZWR4LGVicAorCXB4b3IJeG1tNSx4bW04CisJYWRkCWVjeCxEV09SRFsyMCtyc3BdCisJeG9yCWVkaSxlYXgKKwltb3YJZXNpLGVkeAorCXJvbAllZHgsNQorCW1vdmRxYQl4bW04LHhtbTUKKwlhZGQJZWN4LGVkaQorCXhvcgllc2ksZWF4CisJbW92ZHFhCVhNTVdPUkRbcnNwXSx4bW05CisJcm9yCWVicCw3CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEWzI0K3JzcF0KKwlwc2xsZAl4bW01LDIKKwl4b3IJZXNpLGVicAorCW1vdgllZGksZWN4CisJcHNybGQJeG1tOCwzMAorCXJvbAllY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVkaSxlYnAKKwlyb3IJZWR4LDcKKwlwb3IJeG1tNSx4bW04CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzI4K3JzcF0KKwlwc2h1ZmQJeG1tOSx4bW00LDIzOAorCXJvcgllY3gsNworCW1vdgllc2ksZWJ4CisJeG9yCWVkaSxlZHgKKwlyb2wJZWJ4LDUKKwlhZGQJZWF4LGVkaQorCXhvcgllc2ksZWN4CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCXB4b3IJeG1tNix4bW0yCisJYWRkCWVicCxEV09SRFszMityc3BdCisJYW5kCWVzaSxlY3gKKwl4b3IJZWN4LGVkeAorCXJvcgllYngsNworCXB1bnBja2xxZHEJeG1tOSx4bW01CisJbW92CWVkaSxlYXgKKwl4b3IJZXNpLGVjeAorCXB4b3IJeG1tNix4bW03CisJcm9sCWVheCw1CisJYWRkCWVicCxlc2kKKwltb3ZkcWEJeG1tOCx4bW0xMAorCXhvcgllZGksZWJ4CisJcGFkZGQJeG1tMTAseG1tNQorCXhvcgllYngsZWN4CisJcHhvcgl4bW02LHhtbTkKKwlhZGQJZWJwLGVheAorCWFkZAllZHgsRFdPUkRbMzYrcnNwXQorCWFuZAllZGksZWJ4CisJeG9yCWVieCxlY3gKKwlyb3IJZWF4LDcKKwltb3ZkcWEJeG1tOSx4bW02CisJbW92CWVzaSxlYnAKKwl4b3IJZWRpLGVieAorCW1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tMTAKKwlyb2wJZWJwLDUKKwlhZGQJZWR4LGVkaQorCXhvcgllc2ksZWF4CisJcHNsbGQJeG1tNiwyCisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVicAorCXBzcmxkCXhtbTksMzAKKwlhZGQJZWN4LERXT1JEWzQwK3JzcF0KKwlhbmQJZXNpLGVheAorCXhvcgllYXgsZWJ4CisJcG9yCXhtbTYseG1tOQorCXJvcgllYnAsNworCW1vdgllZGksZWR4CisJeG9yCWVzaSxlYXgKKwlyb2wJZWR4LDUKKwlwc2h1ZmQJeG1tMTAseG1tNSwyMzgKKwlhZGQJZWN4LGVzaQorCXhvcgllZGksZWJwCisJeG9yCWVicCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkRbNDQrcnNwXQorCWFuZAllZGksZWJwCisJeG9yCWVicCxlYXgKKwlyb3IJZWR4LDcKKwltb3YJZXNpLGVjeAorCXhvcgllZGksZWJwCisJcm9sCWVjeCw1CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVkeAorCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwlweG9yCXhtbTcseG1tMworCWFkZAllYXgsRFdPUkRbNDgrcnNwXQorCWFuZAllc2ksZWR4CisJeG9yCWVkeCxlYnAKKwlyb3IJZWN4LDcKKwlwdW5wY2tscWRxCXhtbTEwLHhtbTYKKwltb3YJZWRpLGVieAorCXhvcgllc2ksZWR4CisJcHhvcgl4bW03LHhtbTAKKwlyb2wJZWJ4LDUKKwlhZGQJZWF4LGVzaQorCW1vdmRxYQl4bW05LFhNTVdPUkRbMzIrcjE0XQorCXhvcgllZGksZWN4CisJcGFkZGQJeG1tOCx4bW02CisJeG9yCWVjeCxlZHgKKwlweG9yCXhtbTcseG1tMTAKKwlhZGQJZWF4LGVieAorCWFkZAllYnAsRFdPUkRbNTIrcnNwXQorCWFuZAllZGksZWN4CisJeG9yCWVjeCxlZHgKKwlyb3IJZWJ4LDcKKwltb3ZkcWEJeG1tMTAseG1tNworCW1vdgllc2ksZWF4CisJeG9yCWVkaSxlY3gKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTgKKwlyb2wJZWF4LDUKKwlhZGQJZWJwLGVkaQorCXhvcgllc2ksZWJ4CisJcHNsbGQJeG1tNywyCisJeG9yCWVieCxlY3gKKwlhZGQJZWJwLGVheAorCXBzcmxkCXhtbTEwLDMwCisJYWRkCWVkeCxEV09SRFs1Nityc3BdCisJYW5kCWVzaSxlYngKKwl4b3IJZWJ4LGVjeAorCXBvcgl4bW03LHhtbTEwCisJcm9yCWVheCw3CisJbW92CWVkaSxlYnAKKwl4b3IJZXNpLGVieAorCXJvbAllYnAsNQorCXBzaHVmZAl4bW04LHhtbTYsMjM4CisJYWRkCWVkeCxlc2kKKwl4b3IJZWRpLGVheAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlhZGQJZWN4LERXT1JEWzYwK3JzcF0KKwlhbmQJZWRpLGVheAorCXhvcgllYXgsZWJ4CisJcm9yCWVicCw3CisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVheAorCXJvbAllZHgsNQorCWFkZAllY3gsZWRpCisJeG9yCWVzaSxlYnAKKwl4b3IJZWJwLGVheAorCWFkZAllY3gsZWR4CisJcHhvcgl4bW0wLHhtbTQKKwlhZGQJZWJ4LERXT1JEW3JzcF0KKwlhbmQJZXNpLGVicAorCXhvcgllYnAsZWF4CisJcm9yCWVkeCw3CisJcHVucGNrbHFkcQl4bW04LHhtbTcKKwltb3YJZWRpLGVjeAorCXhvcgllc2ksZWJwCisJcHhvcgl4bW0wLHhtbTEKKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVzaQorCW1vdmRxYQl4bW0xMCx4bW05CisJeG9yCWVkaSxlZHgKKwlwYWRkZAl4bW05LHhtbTcKKwl4b3IJZWR4LGVicAorCXB4b3IJeG1tMCx4bW04CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzQrcnNwXQorCWFuZAllZGksZWR4CisJeG9yCWVkeCxlYnAKKwlyb3IJZWN4LDcKKwltb3ZkcWEJeG1tOCx4bW0wCisJbW92CWVzaSxlYngKKwl4b3IJZWRpLGVkeAorCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tOQorCXJvbAllYngsNQorCWFkZAllYXgsZWRpCisJeG9yCWVzaSxlY3gKKwlwc2xsZAl4bW0wLDIKKwl4b3IJZWN4LGVkeAorCWFkZAllYXgsZWJ4CisJcHNybGQJeG1tOCwzMAorCWFkZAllYnAsRFdPUkRbOCtyc3BdCisJYW5kCWVzaSxlY3gKKwl4b3IJZWN4LGVkeAorCXBvcgl4bW0wLHhtbTgKKwlyb3IJZWJ4LDcKKwltb3YJZWRpLGVheAorCXhvcgllc2ksZWN4CisJcm9sCWVheCw1CisJcHNodWZkCXhtbTkseG1tNywyMzgKKwlhZGQJZWJwLGVzaQorCXhvcgllZGksZWJ4CisJeG9yCWVieCxlY3gKKwlhZGQJZWJwLGVheAorCWFkZAllZHgsRFdPUkRbMTIrcnNwXQorCWFuZAllZGksZWJ4CisJeG9yCWVieCxlY3gKKwlyb3IJZWF4LDcKKwltb3YJZXNpLGVicAorCXhvcgllZGksZWJ4CisJcm9sCWVicCw1CisJYWRkCWVkeCxlZGkKKwl4b3IJZXNpLGVheAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlweG9yCXhtbTEseG1tNQorCWFkZAllY3gsRFdPUkRbMTYrcnNwXQorCWFuZAllc2ksZWF4CisJeG9yCWVheCxlYngKKwlyb3IJZWJwLDcKKwlwdW5wY2tscWRxCXhtbTkseG1tMAorCW1vdgllZGksZWR4CisJeG9yCWVzaSxlYXgKKwlweG9yCXhtbTEseG1tMgorCXJvbAllZHgsNQorCWFkZAllY3gsZXNpCisJbW92ZHFhCXhtbTgseG1tMTAKKwl4b3IJZWRpLGVicAorCXBhZGRkCXhtbTEwLHhtbTAKKwl4b3IJZWJwLGVheAorCXB4b3IJeG1tMSx4bW05CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEWzIwK3JzcF0KKwlhbmQJZWRpLGVicAorCXhvcgllYnAsZWF4CisJcm9yCWVkeCw3CisJbW92ZHFhCXhtbTkseG1tMQorCW1vdgllc2ksZWN4CisJeG9yCWVkaSxlYnAKKwltb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTEwCisJcm9sCWVjeCw1CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVkeAorCXBzbGxkCXhtbTEsMgorCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwlwc3JsZAl4bW05LDMwCisJYWRkCWVheCxEV09SRFsyNCtyc3BdCisJYW5kCWVzaSxlZHgKKwl4b3IJZWR4LGVicAorCXBvcgl4bW0xLHhtbTkKKwlyb3IJZWN4LDcKKwltb3YJZWRpLGVieAorCXhvcgllc2ksZWR4CisJcm9sCWVieCw1CisJcHNodWZkCXhtbTEwLHhtbTAsMjM4CisJYWRkCWVheCxlc2kKKwl4b3IJZWRpLGVjeAorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzI4K3JzcF0KKwlhbmQJZWRpLGVjeAorCXhvcgllY3gsZWR4CisJcm9yCWVieCw3CisJbW92CWVzaSxlYXgKKwl4b3IJZWRpLGVjeAorCXJvbAllYXgsNQorCWFkZAllYnAsZWRpCisJeG9yCWVzaSxlYngKKwl4b3IJZWJ4LGVjeAorCWFkZAllYnAsZWF4CisJcHhvcgl4bW0yLHhtbTYKKwlhZGQJZWR4LERXT1JEWzMyK3JzcF0KKwlhbmQJZXNpLGVieAorCXhvcgllYngsZWN4CisJcm9yCWVheCw3CisJcHVucGNrbHFkcQl4bW0xMCx4bW0xCisJbW92CWVkaSxlYnAKKwl4b3IJZXNpLGVieAorCXB4b3IJeG1tMix4bW0zCisJcm9sCWVicCw1CisJYWRkCWVkeCxlc2kKKwltb3ZkcWEJeG1tOSx4bW04CisJeG9yCWVkaSxlYXgKKwlwYWRkZAl4bW04LHhtbTEKKwl4b3IJZWF4LGVieAorCXB4b3IJeG1tMix4bW0xMAorCWFkZAllZHgsZWJwCisJYWRkCWVjeCxEV09SRFszNityc3BdCisJYW5kCWVkaSxlYXgKKwl4b3IJZWF4LGVieAorCXJvcgllYnAsNworCW1vdmRxYQl4bW0xMCx4bW0yCisJbW92CWVzaSxlZHgKKwl4b3IJZWRpLGVheAorCW1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tOAorCXJvbAllZHgsNQorCWFkZAllY3gsZWRpCisJeG9yCWVzaSxlYnAKKwlwc2xsZAl4bW0yLDIKKwl4b3IJZWJwLGVheAorCWFkZAllY3gsZWR4CisJcHNybGQJeG1tMTAsMzAKKwlhZGQJZWJ4LERXT1JEWzQwK3JzcF0KKwlhbmQJZXNpLGVicAorCXhvcgllYnAsZWF4CisJcG9yCXhtbTIseG1tMTAKKwlyb3IJZWR4LDcKKwltb3YJZWRpLGVjeAorCXhvcgllc2ksZWJwCisJcm9sCWVjeCw1CisJcHNodWZkCXhtbTgseG1tMSwyMzgKKwlhZGQJZWJ4LGVzaQorCXhvcgllZGksZWR4CisJeG9yCWVkeCxlYnAKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkRbNDQrcnNwXQorCWFuZAllZGksZWR4CisJeG9yCWVkeCxlYnAKKwlyb3IJZWN4LDcKKwltb3YJZXNpLGVieAorCXhvcgllZGksZWR4CisJcm9sCWVieCw1CisJYWRkCWVheCxlZGkKKwl4b3IJZXNpLGVkeAorCWFkZAllYXgsZWJ4CisJcHhvcgl4bW0zLHhtbTcKKwlhZGQJZWJwLERXT1JEWzQ4K3JzcF0KKwl4b3IJZXNpLGVjeAorCXB1bnBja2xxZHEJeG1tOCx4bW0yCisJbW92CWVkaSxlYXgKKwlyb2wJZWF4LDUKKwlweG9yCXhtbTMseG1tNAorCWFkZAllYnAsZXNpCisJeG9yCWVkaSxlY3gKKwltb3ZkcWEJeG1tMTAseG1tOQorCXJvcgllYngsNworCXBhZGRkCXhtbTkseG1tMgorCWFkZAllYnAsZWF4CisJcHhvcgl4bW0zLHhtbTgKKwlhZGQJZWR4LERXT1JEWzUyK3JzcF0KKwl4b3IJZWRpLGVieAorCW1vdgllc2ksZWJwCisJcm9sCWVicCw1CisJbW92ZHFhCXhtbTgseG1tMworCWFkZAllZHgsZWRpCisJeG9yCWVzaSxlYngKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTkKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVicAorCWFkZAllY3gsRFdPUkRbNTYrcnNwXQorCXBzbGxkCXhtbTMsMgorCXhvcgllc2ksZWF4CisJbW92CWVkaSxlZHgKKwlwc3JsZAl4bW04LDMwCisJcm9sCWVkeCw1CisJYWRkCWVjeCxlc2kKKwl4b3IJZWRpLGVheAorCXJvcgllYnAsNworCXBvcgl4bW0zLHhtbTgKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkRbNjArcnNwXQorCXhvcgllZGksZWJwCisJbW92CWVzaSxlY3gKKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVkaQorCXhvcgllc2ksZWJwCisJcm9yCWVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEW3JzcF0KKwl4b3IJZXNpLGVkeAorCW1vdgllZGksZWJ4CisJcm9sCWVieCw1CisJcGFkZGQJeG1tMTAseG1tMworCWFkZAllYXgsZXNpCisJeG9yCWVkaSxlZHgKKwltb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTEwCisJcm9yCWVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzQrcnNwXQorCXhvcgllZGksZWN4CisJbW92CWVzaSxlYXgKKwlyb2wJZWF4LDUKKwlhZGQJZWJwLGVkaQorCXhvcgllc2ksZWN4CisJcm9yCWVieCw3CisJYWRkCWVicCxlYXgKKwlhZGQJZWR4LERXT1JEWzgrcnNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVkaSxlYnAKKwlyb2wJZWJwLDUKKwlhZGQJZWR4LGVzaQorCXhvcgllZGksZWJ4CisJcm9yCWVheCw3CisJYWRkCWVkeCxlYnAKKwlhZGQJZWN4LERXT1JEWzEyK3JzcF0KKwl4b3IJZWRpLGVheAorCW1vdgllc2ksZWR4CisJcm9sCWVkeCw1CisJYWRkCWVjeCxlZGkKKwl4b3IJZXNpLGVheAorCXJvcgllYnAsNworCWFkZAllY3gsZWR4CisJY21wCXI5LHIxMAorCWplCU5FQVIgJEwkZG9uZV9zc3NlMworCW1vdmRxYQl4bW02LFhNTVdPUkRbNjQrcjE0XQorCW1vdmRxYQl4bW05LFhNTVdPUkRbKCgtNjQpKStyMTRdCisJbW92ZHF1CXhtbTAsWE1NV09SRFtyOV0KKwltb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3I5XQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcjldCisJbW92ZHF1CXhtbTMsWE1NV09SRFs0OCtyOV0KK0RCCTEwMiwxNSw1NiwwLDE5OAorCWFkZAlyOSw2NAorCWFkZAllYngsRFdPUkRbMTYrcnNwXQorCXhvcgllc2ksZWJwCisJbW92CWVkaSxlY3gKK0RCCTEwMiwxNSw1NiwwLDIwNgorCXJvbAllY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVkaSxlYnAKKwlyb3IJZWR4LDcKKwlwYWRkZAl4bW0wLHhtbTkKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkRbMjArcnNwXQorCXhvcgllZGksZWR4CisJbW92CWVzaSxlYngKKwltb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTAKKwlyb2wJZWJ4LDUKKwlhZGQJZWF4LGVkaQorCXhvcgllc2ksZWR4CisJcm9yCWVjeCw3CisJcHN1YmQJeG1tMCx4bW05CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzI0K3JzcF0KKwl4b3IJZXNpLGVjeAorCW1vdgllZGksZWF4CisJcm9sCWVheCw1CisJYWRkCWVicCxlc2kKKwl4b3IJZWRpLGVjeAorCXJvcgllYngsNworCWFkZAllYnAsZWF4CisJYWRkCWVkeCxEV09SRFsyOCtyc3BdCisJeG9yCWVkaSxlYngKKwltb3YJZXNpLGVicAorCXJvbAllYnAsNQorCWFkZAllZHgsZWRpCisJeG9yCWVzaSxlYngKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVicAorCWFkZAllY3gsRFdPUkRbMzIrcnNwXQorCXhvcgllc2ksZWF4CisJbW92CWVkaSxlZHgKK0RCCTEwMiwxNSw1NiwwLDIxNAorCXJvbAllZHgsNQorCWFkZAllY3gsZXNpCisJeG9yCWVkaSxlYXgKKwlyb3IJZWJwLDcKKwlwYWRkZAl4bW0xLHhtbTkKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkRbMzYrcnNwXQorCXhvcgllZGksZWJwCisJbW92CWVzaSxlY3gKKwltb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTEKKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVkaQorCXhvcgllc2ksZWJwCisJcm9yCWVkeCw3CisJcHN1YmQJeG1tMSx4bW05CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzQwK3JzcF0KKwl4b3IJZXNpLGVkeAorCW1vdgllZGksZWJ4CisJcm9sCWVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWRpLGVkeAorCXJvcgllY3gsNworCWFkZAllYXgsZWJ4CisJYWRkCWVicCxEV09SRFs0NCtyc3BdCisJeG9yCWVkaSxlY3gKKwltb3YJZXNpLGVheAorCXJvbAllYXgsNQorCWFkZAllYnAsZWRpCisJeG9yCWVzaSxlY3gKKwlyb3IJZWJ4LDcKKwlhZGQJZWJwLGVheAorCWFkZAllZHgsRFdPUkRbNDgrcnNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVkaSxlYnAKK0RCCTEwMiwxNSw1NiwwLDIyMgorCXJvbAllYnAsNQorCWFkZAllZHgsZXNpCisJeG9yCWVkaSxlYngKKwlyb3IJZWF4LDcKKwlwYWRkZAl4bW0yLHhtbTkKKwlhZGQJZWR4LGVicAorCWFkZAllY3gsRFdPUkRbNTIrcnNwXQorCXhvcgllZGksZWF4CisJbW92CWVzaSxlZHgKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTIKKwlyb2wJZWR4LDUKKwlhZGQJZWN4LGVkaQorCXhvcgllc2ksZWF4CisJcm9yCWVicCw3CisJcHN1YmQJeG1tMix4bW05CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEWzU2K3JzcF0KKwl4b3IJZXNpLGVicAorCW1vdgllZGksZWN4CisJcm9sCWVjeCw1CisJYWRkCWVieCxlc2kKKwl4b3IJZWRpLGVicAorCXJvcgllZHgsNworCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFs2MCtyc3BdCisJeG9yCWVkaSxlZHgKKwltb3YJZXNpLGVieAorCXJvbAllYngsNQorCWFkZAllYXgsZWRpCisJcm9yCWVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWF4LERXT1JEW3I4XQorCWFkZAllc2ksRFdPUkRbNCtyOF0KKwlhZGQJZWN4LERXT1JEWzgrcjhdCisJYWRkCWVkeCxEV09SRFsxMityOF0KKwltb3YJRFdPUkRbcjhdLGVheAorCWFkZAllYnAsRFdPUkRbMTYrcjhdCisJbW92CURXT1JEWzQrcjhdLGVzaQorCW1vdgllYngsZXNpCisJbW92CURXT1JEWzgrcjhdLGVjeAorCW1vdgllZGksZWN4CisJbW92CURXT1JEWzEyK3I4XSxlZHgKKwl4b3IJZWRpLGVkeAorCW1vdglEV09SRFsxNityOF0sZWJwCisJYW5kCWVzaSxlZGkKKwlqbXAJTkVBUiAkTCRvb3Bfc3NzZTMKKworQUxJR04JMTYKKyRMJGRvbmVfc3NzZTM6CisJYWRkCWVieCxEV09SRFsxNityc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJZWRpLGVjeAorCXJvbAllY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVkaSxlYnAKKwlyb3IJZWR4LDcKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkRbMjArcnNwXQorCXhvcgllZGksZWR4CisJbW92CWVzaSxlYngKKwlyb2wJZWJ4LDUKKwlhZGQJZWF4LGVkaQorCXhvcgllc2ksZWR4CisJcm9yCWVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzI0K3JzcF0KKwl4b3IJZXNpLGVjeAorCW1vdgllZGksZWF4CisJcm9sCWVheCw1CisJYWRkCWVicCxlc2kKKwl4b3IJZWRpLGVjeAorCXJvcgllYngsNworCWFkZAllYnAsZWF4CisJYWRkCWVkeCxEV09SRFsyOCtyc3BdCisJeG9yCWVkaSxlYngKKwltb3YJZXNpLGVicAorCXJvbAllYnAsNQorCWFkZAllZHgsZWRpCisJeG9yCWVzaSxlYngKKwlyb3IJZWF4LDcKKwlhZGQJZWR4LGVicAorCWFkZAllY3gsRFdPUkRbMzIrcnNwXQorCXhvcgllc2ksZWF4CisJbW92CWVkaSxlZHgKKwlyb2wJZWR4LDUKKwlhZGQJZWN4LGVzaQorCXhvcgllZGksZWF4CisJcm9yCWVicCw3CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEWzM2K3JzcF0KKwl4b3IJZWRpLGVicAorCW1vdgllc2ksZWN4CisJcm9sCWVjeCw1CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVicAorCXJvcgllZHgsNworCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFs0MCtyc3BdCisJeG9yCWVzaSxlZHgKKwltb3YJZWRpLGVieAorCXJvbAllYngsNQorCWFkZAllYXgsZXNpCisJeG9yCWVkaSxlZHgKKwlyb3IJZWN4LDcKKwlhZGQJZWF4LGVieAorCWFkZAllYnAsRFdPUkRbNDQrcnNwXQorCXhvcgllZGksZWN4CisJbW92CWVzaSxlYXgKKwlyb2wJZWF4LDUKKwlhZGQJZWJwLGVkaQorCXhvcgllc2ksZWN4CisJcm9yCWVieCw3CisJYWRkCWVicCxlYXgKKwlhZGQJZWR4LERXT1JEWzQ4K3JzcF0KKwl4b3IJZXNpLGVieAorCW1vdgllZGksZWJwCisJcm9sCWVicCw1CisJYWRkCWVkeCxlc2kKKwl4b3IJZWRpLGVieAorCXJvcgllYXgsNworCWFkZAllZHgsZWJwCisJYWRkCWVjeCxEV09SRFs1Mityc3BdCisJeG9yCWVkaSxlYXgKKwltb3YJZXNpLGVkeAorCXJvbAllZHgsNQorCWFkZAllY3gsZWRpCisJeG9yCWVzaSxlYXgKKwlyb3IJZWJwLDcKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkRbNTYrcnNwXQorCXhvcgllc2ksZWJwCisJbW92CWVkaSxlY3gKKwlyb2wJZWN4LDUKKwlhZGQJZWJ4LGVzaQorCXhvcgllZGksZWJwCisJcm9yCWVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzYwK3JzcF0KKwl4b3IJZWRpLGVkeAorCW1vdgllc2ksZWJ4CisJcm9sCWVieCw1CisJYWRkCWVheCxlZGkKKwlyb3IJZWN4LDcKKwlhZGQJZWF4LGVieAorCWFkZAllYXgsRFdPUkRbcjhdCisJYWRkCWVzaSxEV09SRFs0K3I4XQorCWFkZAllY3gsRFdPUkRbOCtyOF0KKwltb3YJRFdPUkRbcjhdLGVheAorCWFkZAllZHgsRFdPUkRbMTIrcjhdCisJbW92CURXT1JEWzQrcjhdLGVzaQorCWFkZAllYnAsRFdPUkRbMTYrcjhdCisJbW92CURXT1JEWzgrcjhdLGVjeAorCW1vdglEV09SRFsxMityOF0sZWR4CisJbW92CURXT1JEWzE2K3I4XSxlYnAKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTQwLTk2KSkrcjExXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbKCgtNDAtODApKStyMTFdCisJbW92YXBzCXhtbTgsWE1NV09SRFsoKC00MC02NCkpK3IxMV0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTQwLTQ4KSkrcjExXQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWygoLTQwLTMyKSkrcjExXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWygoLTQwLTE2KSkrcjExXQorCW1vdglyMTQsUVdPUkRbKCgtNDApKStyMTFdCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcjExXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3IxMV0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyMTFdCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyMTFdCisKKwlsZWEJcnNwLFtyMTFdCisKKyRMJGVwaWxvZ3VlX3Nzc2UzOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMzoKKworQUxJR04JMTYKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcl9hdng6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworX2F2eF9zaG9ydGN1dDoKKworCW1vdglyMTEscnNwCisKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCWxlYQlyc3AsWygoLTE2MCkpK3JzcF0KKwl2emVyb3VwcGVyCisJdm1vdmFwcwlYTU1XT1JEWygtNDAtOTYpK3IxMV0seG1tNgorCXZtb3ZhcHMJWE1NV09SRFsoLTQwLTgwKStyMTFdLHhtbTcKKwl2bW92YXBzCVhNTVdPUkRbKC00MC02NCkrcjExXSx4bW04CisJdm1vdmFwcwlYTU1XT1JEWygtNDAtNDgpK3IxMV0seG1tOQorCXZtb3ZhcHMJWE1NV09SRFsoLTQwLTMyKStyMTFdLHhtbTEwCisJdm1vdmFwcwlYTU1XT1JEWygtNDAtMTYpK3IxMV0seG1tMTEKKyRMJHByb2xvZ3VlX2F2eDoKKwlhbmQJcnNwLC02NAorCW1vdglyOCxyZGkKKwltb3YJcjkscnNpCisJbW92CXIxMCxyZHgKKworCXNobAlyMTAsNgorCWFkZAlyMTAscjkKKwlsZWEJcjE0LFsoKEtfWFhfWFgrNjQpKV0KKworCW1vdgllYXgsRFdPUkRbcjhdCisJbW92CWVieCxEV09SRFs0K3I4XQorCW1vdgllY3gsRFdPUkRbOCtyOF0KKwltb3YJZWR4LERXT1JEWzEyK3I4XQorCW1vdgllc2ksZWJ4CisJbW92CWVicCxEV09SRFsxNityOF0KKwltb3YJZWRpLGVjeAorCXhvcgllZGksZWR4CisJYW5kCWVzaSxlZGkKKworCXZtb3ZkcWEJeG1tNixYTU1XT1JEWzY0K3IxNF0KKwl2bW92ZHFhCXhtbTExLFhNTVdPUkRbKCgtNjQpKStyMTRdCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbcjldCisJdm1vdmRxdQl4bW0xLFhNTVdPUkRbMTYrcjldCisJdm1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcjldCisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbNDgrcjldCisJdnBzaHVmYgl4bW0wLHhtbTAseG1tNgorCWFkZAlyOSw2NAorCXZwc2h1ZmIJeG1tMSx4bW0xLHhtbTYKKwl2cHNodWZiCXhtbTIseG1tMix4bW02CisJdnBzaHVmYgl4bW0zLHhtbTMseG1tNgorCXZwYWRkZAl4bW00LHhtbTAseG1tMTEKKwl2cGFkZGQJeG1tNSx4bW0xLHhtbTExCisJdnBhZGRkCXhtbTYseG1tMix4bW0xMQorCXZtb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTQKKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW01CisJdm1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tNgorCWptcAlORUFSICRMJG9vcF9hdngKK0FMSUdOCTE2CiskTCRvb3BfYXZ4OgorCXNocmQJZWJ4LGVieCwyCisJeG9yCWVzaSxlZHgKKwl2cGFsaWducgl4bW00LHhtbTEseG1tMCw4CisJbW92CWVkaSxlYXgKKwlhZGQJZWJwLERXT1JEW3JzcF0KKwl2cGFkZGQJeG1tOSx4bW0xMSx4bW0zCisJeG9yCWVieCxlY3gKKwlzaGxkCWVheCxlYXgsNQorCXZwc3JsZHEJeG1tOCx4bW0zLDQKKwlhZGQJZWJwLGVzaQorCWFuZAllZGksZWJ4CisJdnB4b3IJeG1tNCx4bW00LHhtbTAKKwl4b3IJZWJ4LGVjeAorCWFkZAllYnAsZWF4CisJdnB4b3IJeG1tOCx4bW04LHhtbTIKKwlzaHJkCWVheCxlYXgsNworCXhvcgllZGksZWN4CisJbW92CWVzaSxlYnAKKwlhZGQJZWR4LERXT1JEWzQrcnNwXQorCXZweG9yCXhtbTQseG1tNCx4bW04CisJeG9yCWVheCxlYngKKwlzaGxkCWVicCxlYnAsNQorCXZtb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTkKKwlhZGQJZWR4LGVkaQorCWFuZAllc2ksZWF4CisJdnBzcmxkCXhtbTgseG1tNCwzMQorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlzaHJkCWVicCxlYnAsNworCXhvcgllc2ksZWJ4CisJdnBzbGxkcQl4bW0xMCx4bW00LDEyCisJdnBhZGRkCXhtbTQseG1tNCx4bW00CisJbW92CWVkaSxlZHgKKwlhZGQJZWN4LERXT1JEWzgrcnNwXQorCXhvcgllYnAsZWF4CisJc2hsZAllZHgsZWR4LDUKKwl2cHNybGQJeG1tOSx4bW0xMCwzMAorCXZwb3IJeG1tNCx4bW00LHhtbTgKKwlhZGQJZWN4LGVzaQorCWFuZAllZGksZWJwCisJeG9yCWVicCxlYXgKKwlhZGQJZWN4LGVkeAorCXZwc2xsZAl4bW0xMCx4bW0xMCwyCisJdnB4b3IJeG1tNCx4bW00LHhtbTkKKwlzaHJkCWVkeCxlZHgsNworCXhvcgllZGksZWF4CisJbW92CWVzaSxlY3gKKwlhZGQJZWJ4LERXT1JEWzEyK3JzcF0KKwl2cHhvcgl4bW00LHhtbTQseG1tMTAKKwl4b3IJZWR4LGVicAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlZGkKKwlhbmQJZXNpLGVkeAorCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwlzaHJkCWVjeCxlY3gsNworCXhvcgllc2ksZWJwCisJdnBhbGlnbnIJeG1tNSx4bW0yLHhtbTEsOAorCW1vdgllZGksZWJ4CisJYWRkCWVheCxEV09SRFsxNityc3BdCisJdnBhZGRkCXhtbTkseG1tMTEseG1tNAorCXhvcgllY3gsZWR4CisJc2hsZAllYngsZWJ4LDUKKwl2cHNybGRxCXhtbTgseG1tNCw0CisJYWRkCWVheCxlc2kKKwlhbmQJZWRpLGVjeAorCXZweG9yCXhtbTUseG1tNSx4bW0xCisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCXZweG9yCXhtbTgseG1tOCx4bW0zCisJc2hyZAllYngsZWJ4LDcKKwl4b3IJZWRpLGVkeAorCW1vdgllc2ksZWF4CisJYWRkCWVicCxEV09SRFsyMCtyc3BdCisJdnB4b3IJeG1tNSx4bW01LHhtbTgKKwl4b3IJZWJ4LGVjeAorCXNobGQJZWF4LGVheCw1CisJdm1vdmRxYQlYTU1XT1JEW3JzcF0seG1tOQorCWFkZAllYnAsZWRpCisJYW5kCWVzaSxlYngKKwl2cHNybGQJeG1tOCx4bW01LDMxCisJeG9yCWVieCxlY3gKKwlhZGQJZWJwLGVheAorCXNocmQJZWF4LGVheCw3CisJeG9yCWVzaSxlY3gKKwl2cHNsbGRxCXhtbTEwLHhtbTUsMTIKKwl2cGFkZGQJeG1tNSx4bW01LHhtbTUKKwltb3YJZWRpLGVicAorCWFkZAllZHgsRFdPUkRbMjQrcnNwXQorCXhvcgllYXgsZWJ4CisJc2hsZAllYnAsZWJwLDUKKwl2cHNybGQJeG1tOSx4bW0xMCwzMAorCXZwb3IJeG1tNSx4bW01LHhtbTgKKwlhZGQJZWR4LGVzaQorCWFuZAllZGksZWF4CisJeG9yCWVheCxlYngKKwlhZGQJZWR4LGVicAorCXZwc2xsZAl4bW0xMCx4bW0xMCwyCisJdnB4b3IJeG1tNSx4bW01LHhtbTkKKwlzaHJkCWVicCxlYnAsNworCXhvcgllZGksZWJ4CisJbW92CWVzaSxlZHgKKwlhZGQJZWN4LERXT1JEWzI4K3JzcF0KKwl2cHhvcgl4bW01LHhtbTUseG1tMTAKKwl4b3IJZWJwLGVheAorCXNobGQJZWR4LGVkeCw1CisJdm1vdmRxYQl4bW0xMSxYTU1XT1JEWygoLTMyKSkrcjE0XQorCWFkZAllY3gsZWRpCisJYW5kCWVzaSxlYnAKKwl4b3IJZWJwLGVheAorCWFkZAllY3gsZWR4CisJc2hyZAllZHgsZWR4LDcKKwl4b3IJZXNpLGVheAorCXZwYWxpZ25yCXhtbTYseG1tMyx4bW0yLDgKKwltb3YJZWRpLGVjeAorCWFkZAllYngsRFdPUkRbMzIrcnNwXQorCXZwYWRkZAl4bW05LHhtbTExLHhtbTUKKwl4b3IJZWR4LGVicAorCXNobGQJZWN4LGVjeCw1CisJdnBzcmxkcQl4bW04LHhtbTUsNAorCWFkZAllYngsZXNpCisJYW5kCWVkaSxlZHgKKwl2cHhvcgl4bW02LHhtbTYseG1tMgorCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwl2cHhvcgl4bW04LHhtbTgseG1tNAorCXNocmQJZWN4LGVjeCw3CisJeG9yCWVkaSxlYnAKKwltb3YJZXNpLGVieAorCWFkZAllYXgsRFdPUkRbMzYrcnNwXQorCXZweG9yCXhtbTYseG1tNix4bW04CisJeG9yCWVjeCxlZHgKKwlzaGxkCWVieCxlYngsNQorCXZtb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTkKKwlhZGQJZWF4LGVkaQorCWFuZAllc2ksZWN4CisJdnBzcmxkCXhtbTgseG1tNiwzMQorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwlzaHJkCWVieCxlYngsNworCXhvcgllc2ksZWR4CisJdnBzbGxkcQl4bW0xMCx4bW02LDEyCisJdnBhZGRkCXhtbTYseG1tNix4bW02CisJbW92CWVkaSxlYXgKKwlhZGQJZWJwLERXT1JEWzQwK3JzcF0KKwl4b3IJZWJ4LGVjeAorCXNobGQJZWF4LGVheCw1CisJdnBzcmxkCXhtbTkseG1tMTAsMzAKKwl2cG9yCXhtbTYseG1tNix4bW04CisJYWRkCWVicCxlc2kKKwlhbmQJZWRpLGVieAorCXhvcgllYngsZWN4CisJYWRkCWVicCxlYXgKKwl2cHNsbGQJeG1tMTAseG1tMTAsMgorCXZweG9yCXhtbTYseG1tNix4bW05CisJc2hyZAllYXgsZWF4LDcKKwl4b3IJZWRpLGVjeAorCW1vdgllc2ksZWJwCisJYWRkCWVkeCxEV09SRFs0NCtyc3BdCisJdnB4b3IJeG1tNix4bW02LHhtbTEwCisJeG9yCWVheCxlYngKKwlzaGxkCWVicCxlYnAsNQorCWFkZAllZHgsZWRpCisJYW5kCWVzaSxlYXgKKwl4b3IJZWF4LGVieAorCWFkZAllZHgsZWJwCisJc2hyZAllYnAsZWJwLDcKKwl4b3IJZXNpLGVieAorCXZwYWxpZ25yCXhtbTcseG1tNCx4bW0zLDgKKwltb3YJZWRpLGVkeAorCWFkZAllY3gsRFdPUkRbNDgrcnNwXQorCXZwYWRkZAl4bW05LHhtbTExLHhtbTYKKwl4b3IJZWJwLGVheAorCXNobGQJZWR4LGVkeCw1CisJdnBzcmxkcQl4bW04LHhtbTYsNAorCWFkZAllY3gsZXNpCisJYW5kCWVkaSxlYnAKKwl2cHhvcgl4bW03LHhtbTcseG1tMworCXhvcgllYnAsZWF4CisJYWRkCWVjeCxlZHgKKwl2cHhvcgl4bW04LHhtbTgseG1tNQorCXNocmQJZWR4LGVkeCw3CisJeG9yCWVkaSxlYXgKKwltb3YJZXNpLGVjeAorCWFkZAllYngsRFdPUkRbNTIrcnNwXQorCXZweG9yCXhtbTcseG1tNyx4bW04CisJeG9yCWVkeCxlYnAKKwlzaGxkCWVjeCxlY3gsNQorCXZtb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTkKKwlhZGQJZWJ4LGVkaQorCWFuZAllc2ksZWR4CisJdnBzcmxkCXhtbTgseG1tNywzMQorCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwlzaHJkCWVjeCxlY3gsNworCXhvcgllc2ksZWJwCisJdnBzbGxkcQl4bW0xMCx4bW03LDEyCisJdnBhZGRkCXhtbTcseG1tNyx4bW03CisJbW92CWVkaSxlYngKKwlhZGQJZWF4LERXT1JEWzU2K3JzcF0KKwl4b3IJZWN4LGVkeAorCXNobGQJZWJ4LGVieCw1CisJdnBzcmxkCXhtbTkseG1tMTAsMzAKKwl2cG9yCXhtbTcseG1tNyx4bW04CisJYWRkCWVheCxlc2kKKwlhbmQJZWRpLGVjeAorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwl2cHNsbGQJeG1tMTAseG1tMTAsMgorCXZweG9yCXhtbTcseG1tNyx4bW05CisJc2hyZAllYngsZWJ4LDcKKwl4b3IJZWRpLGVkeAorCW1vdgllc2ksZWF4CisJYWRkCWVicCxEV09SRFs2MCtyc3BdCisJdnB4b3IJeG1tNyx4bW03LHhtbTEwCisJeG9yCWVieCxlY3gKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllYnAsZWRpCisJYW5kCWVzaSxlYngKKwl4b3IJZWJ4LGVjeAorCWFkZAllYnAsZWF4CisJdnBhbGlnbnIJeG1tOCx4bW03LHhtbTYsOAorCXZweG9yCXhtbTAseG1tMCx4bW00CisJc2hyZAllYXgsZWF4LDcKKwl4b3IJZXNpLGVjeAorCW1vdgllZGksZWJwCisJYWRkCWVkeCxEV09SRFtyc3BdCisJdnB4b3IJeG1tMCx4bW0wLHhtbTEKKwl4b3IJZWF4LGVieAorCXNobGQJZWJwLGVicCw1CisJdnBhZGRkCXhtbTkseG1tMTEseG1tNworCWFkZAllZHgsZXNpCisJYW5kCWVkaSxlYXgKKwl2cHhvcgl4bW0wLHhtbTAseG1tOAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlzaHJkCWVicCxlYnAsNworCXhvcgllZGksZWJ4CisJdnBzcmxkCXhtbTgseG1tMCwzMAorCXZtb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTkKKwltb3YJZXNpLGVkeAorCWFkZAllY3gsRFdPUkRbNCtyc3BdCisJeG9yCWVicCxlYXgKKwlzaGxkCWVkeCxlZHgsNQorCXZwc2xsZAl4bW0wLHhtbTAsMgorCWFkZAllY3gsZWRpCisJYW5kCWVzaSxlYnAKKwl4b3IJZWJwLGVheAorCWFkZAllY3gsZWR4CisJc2hyZAllZHgsZWR4LDcKKwl4b3IJZXNpLGVheAorCW1vdgllZGksZWN4CisJYWRkCWVieCxEV09SRFs4K3JzcF0KKwl2cG9yCXhtbTAseG1tMCx4bW04CisJeG9yCWVkeCxlYnAKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZXNpCisJYW5kCWVkaSxlZHgKKwl4b3IJZWR4LGVicAorCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFsxMityc3BdCisJeG9yCWVkaSxlYnAKKwltb3YJZXNpLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlZGkKKwl4b3IJZXNpLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwl2cGFsaWducgl4bW04LHhtbTAseG1tNyw4CisJdnB4b3IJeG1tMSx4bW0xLHhtbTUKKwlhZGQJZWJwLERXT1JEWzE2K3JzcF0KKwl4b3IJZXNpLGVjeAorCW1vdgllZGksZWF4CisJc2hsZAllYXgsZWF4LDUKKwl2cHhvcgl4bW0xLHhtbTEseG1tMgorCWFkZAllYnAsZXNpCisJeG9yCWVkaSxlY3gKKwl2cGFkZGQJeG1tOSx4bW0xMSx4bW0wCisJc2hyZAllYngsZWJ4LDcKKwlhZGQJZWJwLGVheAorCXZweG9yCXhtbTEseG1tMSx4bW04CisJYWRkCWVkeCxEV09SRFsyMCtyc3BdCisJeG9yCWVkaSxlYngKKwltb3YJZXNpLGVicAorCXNobGQJZWJwLGVicCw1CisJdnBzcmxkCXhtbTgseG1tMSwzMAorCXZtb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTkKKwlhZGQJZWR4LGVkaQorCXhvcgllc2ksZWJ4CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVicAorCXZwc2xsZAl4bW0xLHhtbTEsMgorCWFkZAllY3gsRFdPUkRbMjQrcnNwXQorCXhvcgllc2ksZWF4CisJbW92CWVkaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCWFkZAllY3gsZXNpCisJeG9yCWVkaSxlYXgKKwlzaHJkCWVicCxlYnAsNworCWFkZAllY3gsZWR4CisJdnBvcgl4bW0xLHhtbTEseG1tOAorCWFkZAllYngsRFdPUkRbMjgrcnNwXQorCXhvcgllZGksZWJwCisJbW92CWVzaSxlY3gKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZWRpCisJeG9yCWVzaSxlYnAKKwlzaHJkCWVkeCxlZHgsNworCWFkZAllYngsZWN4CisJdnBhbGlnbnIJeG1tOCx4bW0xLHhtbTAsOAorCXZweG9yCXhtbTIseG1tMix4bW02CisJYWRkCWVheCxEV09SRFszMityc3BdCisJeG9yCWVzaSxlZHgKKwltb3YJZWRpLGVieAorCXNobGQJZWJ4LGVieCw1CisJdnB4b3IJeG1tMix4bW0yLHhtbTMKKwlhZGQJZWF4LGVzaQorCXhvcgllZGksZWR4CisJdnBhZGRkCXhtbTkseG1tMTEseG1tMQorCXZtb3ZkcWEJeG1tMTEsWE1NV09SRFtyMTRdCisJc2hyZAllY3gsZWN4LDcKKwlhZGQJZWF4LGVieAorCXZweG9yCXhtbTIseG1tMix4bW04CisJYWRkCWVicCxEV09SRFszNityc3BdCisJeG9yCWVkaSxlY3gKKwltb3YJZXNpLGVheAorCXNobGQJZWF4LGVheCw1CisJdnBzcmxkCXhtbTgseG1tMiwzMAorCXZtb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTkKKwlhZGQJZWJwLGVkaQorCXhvcgllc2ksZWN4CisJc2hyZAllYngsZWJ4LDcKKwlhZGQJZWJwLGVheAorCXZwc2xsZAl4bW0yLHhtbTIsMgorCWFkZAllZHgsRFdPUkRbNDArcnNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVkaSxlYnAKKwlzaGxkCWVicCxlYnAsNQorCWFkZAllZHgsZXNpCisJeG9yCWVkaSxlYngKKwlzaHJkCWVheCxlYXgsNworCWFkZAllZHgsZWJwCisJdnBvcgl4bW0yLHhtbTIseG1tOAorCWFkZAllY3gsRFdPUkRbNDQrcnNwXQorCXhvcgllZGksZWF4CisJbW92CWVzaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCWFkZAllY3gsZWRpCisJeG9yCWVzaSxlYXgKKwlzaHJkCWVicCxlYnAsNworCWFkZAllY3gsZWR4CisJdnBhbGlnbnIJeG1tOCx4bW0yLHhtbTEsOAorCXZweG9yCXhtbTMseG1tMyx4bW03CisJYWRkCWVieCxEV09SRFs0OCtyc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJZWRpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwlhZGQJZWJ4LGVzaQorCXhvcgllZGksZWJwCisJdnBhZGRkCXhtbTkseG1tMTEseG1tMgorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwl2cHhvcgl4bW0zLHhtbTMseG1tOAorCWFkZAllYXgsRFdPUkRbNTIrcnNwXQorCXhvcgllZGksZWR4CisJbW92CWVzaSxlYngKKwlzaGxkCWVieCxlYngsNQorCXZwc3JsZAl4bW04LHhtbTMsMzAKKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW05CisJYWRkCWVheCxlZGkKKwl4b3IJZXNpLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwl2cHNsbGQJeG1tMyx4bW0zLDIKKwlhZGQJZWJwLERXT1JEWzU2K3JzcF0KKwl4b3IJZXNpLGVjeAorCW1vdgllZGksZWF4CisJc2hsZAllYXgsZWF4LDUKKwlhZGQJZWJwLGVzaQorCXhvcgllZGksZWN4CisJc2hyZAllYngsZWJ4LDcKKwlhZGQJZWJwLGVheAorCXZwb3IJeG1tMyx4bW0zLHhtbTgKKwlhZGQJZWR4LERXT1JEWzYwK3JzcF0KKwl4b3IJZWRpLGVieAorCW1vdgllc2ksZWJwCisJc2hsZAllYnAsZWJwLDUKKwlhZGQJZWR4LGVkaQorCXhvcgllc2ksZWJ4CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVicAorCXZwYWxpZ25yCXhtbTgseG1tMyx4bW0yLDgKKwl2cHhvcgl4bW00LHhtbTQseG1tMAorCWFkZAllY3gsRFdPUkRbcnNwXQorCXhvcgllc2ksZWF4CisJbW92CWVkaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCXZweG9yCXhtbTQseG1tNCx4bW01CisJYWRkCWVjeCxlc2kKKwl4b3IJZWRpLGVheAorCXZwYWRkZAl4bW05LHhtbTExLHhtbTMKKwlzaHJkCWVicCxlYnAsNworCWFkZAllY3gsZWR4CisJdnB4b3IJeG1tNCx4bW00LHhtbTgKKwlhZGQJZWJ4LERXT1JEWzQrcnNwXQorCXhvcgllZGksZWJwCisJbW92CWVzaSxlY3gKKwlzaGxkCWVjeCxlY3gsNQorCXZwc3JsZAl4bW04LHhtbTQsMzAKKwl2bW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW05CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVicAorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwl2cHNsbGQJeG1tNCx4bW00LDIKKwlhZGQJZWF4LERXT1JEWzgrcnNwXQorCXhvcgllc2ksZWR4CisJbW92CWVkaSxlYngKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZXNpCisJeG9yCWVkaSxlZHgKKwlzaHJkCWVjeCxlY3gsNworCWFkZAllYXgsZWJ4CisJdnBvcgl4bW00LHhtbTQseG1tOAorCWFkZAllYnAsRFdPUkRbMTIrcnNwXQorCXhvcgllZGksZWN4CisJbW92CWVzaSxlYXgKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllYnAsZWRpCisJeG9yCWVzaSxlY3gKKwlzaHJkCWVieCxlYngsNworCWFkZAllYnAsZWF4CisJdnBhbGlnbnIJeG1tOCx4bW00LHhtbTMsOAorCXZweG9yCXhtbTUseG1tNSx4bW0xCisJYWRkCWVkeCxEV09SRFsxNityc3BdCisJeG9yCWVzaSxlYngKKwltb3YJZWRpLGVicAorCXNobGQJZWJwLGVicCw1CisJdnB4b3IJeG1tNSx4bW01LHhtbTYKKwlhZGQJZWR4LGVzaQorCXhvcgllZGksZWJ4CisJdnBhZGRkCXhtbTkseG1tMTEseG1tNAorCXNocmQJZWF4LGVheCw3CisJYWRkCWVkeCxlYnAKKwl2cHhvcgl4bW01LHhtbTUseG1tOAorCWFkZAllY3gsRFdPUkRbMjArcnNwXQorCXhvcgllZGksZWF4CisJbW92CWVzaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCXZwc3JsZAl4bW04LHhtbTUsMzAKKwl2bW92ZHFhCVhNTVdPUkRbcnNwXSx4bW05CisJYWRkCWVjeCxlZGkKKwl4b3IJZXNpLGVheAorCXNocmQJZWJwLGVicCw3CisJYWRkCWVjeCxlZHgKKwl2cHNsbGQJeG1tNSx4bW01LDIKKwlhZGQJZWJ4LERXT1JEWzI0K3JzcF0KKwl4b3IJZXNpLGVicAorCW1vdgllZGksZWN4CisJc2hsZAllY3gsZWN4LDUKKwlhZGQJZWJ4LGVzaQorCXhvcgllZGksZWJwCisJc2hyZAllZHgsZWR4LDcKKwlhZGQJZWJ4LGVjeAorCXZwb3IJeG1tNSx4bW01LHhtbTgKKwlhZGQJZWF4LERXT1JEWzI4K3JzcF0KKwlzaHJkCWVjeCxlY3gsNworCW1vdgllc2ksZWJ4CisJeG9yCWVkaSxlZHgKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZWRpCisJeG9yCWVzaSxlY3gKKwl4b3IJZWN4LGVkeAorCWFkZAllYXgsZWJ4CisJdnBhbGlnbnIJeG1tOCx4bW01LHhtbTQsOAorCXZweG9yCXhtbTYseG1tNix4bW0yCisJYWRkCWVicCxEV09SRFszMityc3BdCisJYW5kCWVzaSxlY3gKKwl4b3IJZWN4LGVkeAorCXNocmQJZWJ4LGVieCw3CisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwltb3YJZWRpLGVheAorCXhvcgllc2ksZWN4CisJdnBhZGRkCXhtbTkseG1tMTEseG1tNQorCXNobGQJZWF4LGVheCw1CisJYWRkCWVicCxlc2kKKwl2cHhvcgl4bW02LHhtbTYseG1tOAorCXhvcgllZGksZWJ4CisJeG9yCWVieCxlY3gKKwlhZGQJZWJwLGVheAorCWFkZAllZHgsRFdPUkRbMzYrcnNwXQorCXZwc3JsZAl4bW04LHhtbTYsMzAKKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW05CisJYW5kCWVkaSxlYngKKwl4b3IJZWJ4LGVjeAorCXNocmQJZWF4LGVheCw3CisJbW92CWVzaSxlYnAKKwl2cHNsbGQJeG1tNix4bW02LDIKKwl4b3IJZWRpLGVieAorCXNobGQJZWJwLGVicCw1CisJYWRkCWVkeCxlZGkKKwl4b3IJZXNpLGVheAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlhZGQJZWN4LERXT1JEWzQwK3JzcF0KKwlhbmQJZXNpLGVheAorCXZwb3IJeG1tNix4bW02LHhtbTgKKwl4b3IJZWF4LGVieAorCXNocmQJZWJwLGVicCw3CisJbW92CWVkaSxlZHgKKwl4b3IJZXNpLGVheAorCXNobGQJZWR4LGVkeCw1CisJYWRkCWVjeCxlc2kKKwl4b3IJZWRpLGVicAorCXhvcgllYnAsZWF4CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEWzQ0K3JzcF0KKwlhbmQJZWRpLGVicAorCXhvcgllYnAsZWF4CisJc2hyZAllZHgsZWR4LDcKKwltb3YJZXNpLGVjeAorCXhvcgllZGksZWJwCisJc2hsZAllY3gsZWN4LDUKKwlhZGQJZWJ4LGVkaQorCXhvcgllc2ksZWR4CisJeG9yCWVkeCxlYnAKKwlhZGQJZWJ4LGVjeAorCXZwYWxpZ25yCXhtbTgseG1tNix4bW01LDgKKwl2cHhvcgl4bW03LHhtbTcseG1tMworCWFkZAllYXgsRFdPUkRbNDgrcnNwXQorCWFuZAllc2ksZWR4CisJeG9yCWVkeCxlYnAKKwlzaHJkCWVjeCxlY3gsNworCXZweG9yCXhtbTcseG1tNyx4bW0wCisJbW92CWVkaSxlYngKKwl4b3IJZXNpLGVkeAorCXZwYWRkZAl4bW05LHhtbTExLHhtbTYKKwl2bW92ZHFhCXhtbTExLFhNTVdPUkRbMzIrcjE0XQorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlc2kKKwl2cHhvcgl4bW03LHhtbTcseG1tOAorCXhvcgllZGksZWN4CisJeG9yCWVjeCxlZHgKKwlhZGQJZWF4LGVieAorCWFkZAllYnAsRFdPUkRbNTIrcnNwXQorCXZwc3JsZAl4bW04LHhtbTcsMzAKKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW05CisJYW5kCWVkaSxlY3gKKwl4b3IJZWN4LGVkeAorCXNocmQJZWJ4LGVieCw3CisJbW92CWVzaSxlYXgKKwl2cHNsbGQJeG1tNyx4bW03LDIKKwl4b3IJZWRpLGVjeAorCXNobGQJZWF4LGVheCw1CisJYWRkCWVicCxlZGkKKwl4b3IJZXNpLGVieAorCXhvcgllYngsZWN4CisJYWRkCWVicCxlYXgKKwlhZGQJZWR4LERXT1JEWzU2K3JzcF0KKwlhbmQJZXNpLGVieAorCXZwb3IJeG1tNyx4bW03LHhtbTgKKwl4b3IJZWJ4LGVjeAorCXNocmQJZWF4LGVheCw3CisJbW92CWVkaSxlYnAKKwl4b3IJZXNpLGVieAorCXNobGQJZWJwLGVicCw1CisJYWRkCWVkeCxlc2kKKwl4b3IJZWRpLGVheAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlhZGQJZWN4LERXT1JEWzYwK3JzcF0KKwlhbmQJZWRpLGVheAorCXhvcgllYXgsZWJ4CisJc2hyZAllYnAsZWJwLDcKKwltb3YJZXNpLGVkeAorCXhvcgllZGksZWF4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVkaQorCXhvcgllc2ksZWJwCisJeG9yCWVicCxlYXgKKwlhZGQJZWN4LGVkeAorCXZwYWxpZ25yCXhtbTgseG1tNyx4bW02LDgKKwl2cHhvcgl4bW0wLHhtbTAseG1tNAorCWFkZAllYngsRFdPUkRbcnNwXQorCWFuZAllc2ksZWJwCisJeG9yCWVicCxlYXgKKwlzaHJkCWVkeCxlZHgsNworCXZweG9yCXhtbTAseG1tMCx4bW0xCisJbW92CWVkaSxlY3gKKwl4b3IJZXNpLGVicAorCXZwYWRkZAl4bW05LHhtbTExLHhtbTcKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZXNpCisJdnB4b3IJeG1tMCx4bW0wLHhtbTgKKwl4b3IJZWRpLGVkeAorCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzQrcnNwXQorCXZwc3JsZAl4bW04LHhtbTAsMzAKKwl2bW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW05CisJYW5kCWVkaSxlZHgKKwl4b3IJZWR4LGVicAorCXNocmQJZWN4LGVjeCw3CisJbW92CWVzaSxlYngKKwl2cHNsbGQJeG1tMCx4bW0wLDIKKwl4b3IJZWRpLGVkeAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlZGkKKwl4b3IJZXNpLGVjeAorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzgrcnNwXQorCWFuZAllc2ksZWN4CisJdnBvcgl4bW0wLHhtbTAseG1tOAorCXhvcgllY3gsZWR4CisJc2hyZAllYngsZWJ4LDcKKwltb3YJZWRpLGVheAorCXhvcgllc2ksZWN4CisJc2hsZAllYXgsZWF4LDUKKwlhZGQJZWJwLGVzaQorCXhvcgllZGksZWJ4CisJeG9yCWVieCxlY3gKKwlhZGQJZWJwLGVheAorCWFkZAllZHgsRFdPUkRbMTIrcnNwXQorCWFuZAllZGksZWJ4CisJeG9yCWVieCxlY3gKKwlzaHJkCWVheCxlYXgsNworCW1vdgllc2ksZWJwCisJeG9yCWVkaSxlYngKKwlzaGxkCWVicCxlYnAsNQorCWFkZAllZHgsZWRpCisJeG9yCWVzaSxlYXgKKwl4b3IJZWF4LGVieAorCWFkZAllZHgsZWJwCisJdnBhbGlnbnIJeG1tOCx4bW0wLHhtbTcsOAorCXZweG9yCXhtbTEseG1tMSx4bW01CisJYWRkCWVjeCxEV09SRFsxNityc3BdCisJYW5kCWVzaSxlYXgKKwl4b3IJZWF4LGVieAorCXNocmQJZWJwLGVicCw3CisJdnB4b3IJeG1tMSx4bW0xLHhtbTIKKwltb3YJZWRpLGVkeAorCXhvcgllc2ksZWF4CisJdnBhZGRkCXhtbTkseG1tMTEseG1tMAorCXNobGQJZWR4LGVkeCw1CisJYWRkCWVjeCxlc2kKKwl2cHhvcgl4bW0xLHhtbTEseG1tOAorCXhvcgllZGksZWJwCisJeG9yCWVicCxlYXgKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkRbMjArcnNwXQorCXZwc3JsZAl4bW04LHhtbTEsMzAKKwl2bW92ZHFhCVhNTVdPUkRbcnNwXSx4bW05CisJYW5kCWVkaSxlYnAKKwl4b3IJZWJwLGVheAorCXNocmQJZWR4LGVkeCw3CisJbW92CWVzaSxlY3gKKwl2cHNsbGQJeG1tMSx4bW0xLDIKKwl4b3IJZWRpLGVicAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVkeAorCXhvcgllZHgsZWJwCisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzI0K3JzcF0KKwlhbmQJZXNpLGVkeAorCXZwb3IJeG1tMSx4bW0xLHhtbTgKKwl4b3IJZWR4LGVicAorCXNocmQJZWN4LGVjeCw3CisJbW92CWVkaSxlYngKKwl4b3IJZXNpLGVkeAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWRpLGVjeAorCXhvcgllY3gsZWR4CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzI4K3JzcF0KKwlhbmQJZWRpLGVjeAorCXhvcgllY3gsZWR4CisJc2hyZAllYngsZWJ4LDcKKwltb3YJZXNpLGVheAorCXhvcgllZGksZWN4CisJc2hsZAllYXgsZWF4LDUKKwlhZGQJZWJwLGVkaQorCXhvcgllc2ksZWJ4CisJeG9yCWVieCxlY3gKKwlhZGQJZWJwLGVheAorCXZwYWxpZ25yCXhtbTgseG1tMSx4bW0wLDgKKwl2cHhvcgl4bW0yLHhtbTIseG1tNgorCWFkZAllZHgsRFdPUkRbMzIrcnNwXQorCWFuZAllc2ksZWJ4CisJeG9yCWVieCxlY3gKKwlzaHJkCWVheCxlYXgsNworCXZweG9yCXhtbTIseG1tMix4bW0zCisJbW92CWVkaSxlYnAKKwl4b3IJZXNpLGVieAorCXZwYWRkZAl4bW05LHhtbTExLHhtbTEKKwlzaGxkCWVicCxlYnAsNQorCWFkZAllZHgsZXNpCisJdnB4b3IJeG1tMix4bW0yLHhtbTgKKwl4b3IJZWRpLGVheAorCXhvcgllYXgsZWJ4CisJYWRkCWVkeCxlYnAKKwlhZGQJZWN4LERXT1JEWzM2K3JzcF0KKwl2cHNybGQJeG1tOCx4bW0yLDMwCisJdm1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tOQorCWFuZAllZGksZWF4CisJeG9yCWVheCxlYngKKwlzaHJkCWVicCxlYnAsNworCW1vdgllc2ksZWR4CisJdnBzbGxkCXhtbTIseG1tMiwyCisJeG9yCWVkaSxlYXgKKwlzaGxkCWVkeCxlZHgsNQorCWFkZAllY3gsZWRpCisJeG9yCWVzaSxlYnAKKwl4b3IJZWJwLGVheAorCWFkZAllY3gsZWR4CisJYWRkCWVieCxEV09SRFs0MCtyc3BdCisJYW5kCWVzaSxlYnAKKwl2cG9yCXhtbTIseG1tMix4bW04CisJeG9yCWVicCxlYXgKKwlzaHJkCWVkeCxlZHgsNworCW1vdgllZGksZWN4CisJeG9yCWVzaSxlYnAKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVkaSxlZHgKKwl4b3IJZWR4LGVicAorCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFs0NCtyc3BdCisJYW5kCWVkaSxlZHgKKwl4b3IJZWR4LGVicAorCXNocmQJZWN4LGVjeCw3CisJbW92CWVzaSxlYngKKwl4b3IJZWRpLGVkeAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlZGkKKwl4b3IJZXNpLGVkeAorCWFkZAllYXgsZWJ4CisJdnBhbGlnbnIJeG1tOCx4bW0yLHhtbTEsOAorCXZweG9yCXhtbTMseG1tMyx4bW03CisJYWRkCWVicCxEV09SRFs0OCtyc3BdCisJeG9yCWVzaSxlY3gKKwltb3YJZWRpLGVheAorCXNobGQJZWF4LGVheCw1CisJdnB4b3IJeG1tMyx4bW0zLHhtbTQKKwlhZGQJZWJwLGVzaQorCXhvcgllZGksZWN4CisJdnBhZGRkCXhtbTkseG1tMTEseG1tMgorCXNocmQJZWJ4LGVieCw3CisJYWRkCWVicCxlYXgKKwl2cHhvcgl4bW0zLHhtbTMseG1tOAorCWFkZAllZHgsRFdPUkRbNTIrcnNwXQorCXhvcgllZGksZWJ4CisJbW92CWVzaSxlYnAKKwlzaGxkCWVicCxlYnAsNQorCXZwc3JsZAl4bW04LHhtbTMsMzAKKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW05CisJYWRkCWVkeCxlZGkKKwl4b3IJZXNpLGVieAorCXNocmQJZWF4LGVheCw3CisJYWRkCWVkeCxlYnAKKwl2cHNsbGQJeG1tMyx4bW0zLDIKKwlhZGQJZWN4LERXT1JEWzU2K3JzcF0KKwl4b3IJZXNpLGVheAorCW1vdgllZGksZWR4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVzaQorCXhvcgllZGksZWF4CisJc2hyZAllYnAsZWJwLDcKKwlhZGQJZWN4LGVkeAorCXZwb3IJeG1tMyx4bW0zLHhtbTgKKwlhZGQJZWJ4LERXT1JEWzYwK3JzcF0KKwl4b3IJZWRpLGVicAorCW1vdgllc2ksZWN4CisJc2hsZAllY3gsZWN4LDUKKwlhZGQJZWJ4LGVkaQorCXhvcgllc2ksZWJwCisJc2hyZAllZHgsZWR4LDcKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkRbcnNwXQorCXZwYWRkZAl4bW05LHhtbTExLHhtbTMKKwl4b3IJZXNpLGVkeAorCW1vdgllZGksZWJ4CisJc2hsZAllYngsZWJ4LDUKKwlhZGQJZWF4LGVzaQorCXZtb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTkKKwl4b3IJZWRpLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzQrcnNwXQorCXhvcgllZGksZWN4CisJbW92CWVzaSxlYXgKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllYnAsZWRpCisJeG9yCWVzaSxlY3gKKwlzaHJkCWVieCxlYngsNworCWFkZAllYnAsZWF4CisJYWRkCWVkeCxEV09SRFs4K3JzcF0KKwl4b3IJZXNpLGVieAorCW1vdgllZGksZWJwCisJc2hsZAllYnAsZWJwLDUKKwlhZGQJZWR4LGVzaQorCXhvcgllZGksZWJ4CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVicAorCWFkZAllY3gsRFdPUkRbMTIrcnNwXQorCXhvcgllZGksZWF4CisJbW92CWVzaSxlZHgKKwlzaGxkCWVkeCxlZHgsNQorCWFkZAllY3gsZWRpCisJeG9yCWVzaSxlYXgKKwlzaHJkCWVicCxlYnAsNworCWFkZAllY3gsZWR4CisJY21wCXI5LHIxMAorCWplCU5FQVIgJEwkZG9uZV9hdngKKwl2bW92ZHFhCXhtbTYsWE1NV09SRFs2NCtyMTRdCisJdm1vdmRxYQl4bW0xMSxYTU1XT1JEWygoLTY0KSkrcjE0XQorCXZtb3ZkcXUJeG1tMCxYTU1XT1JEW3I5XQorCXZtb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3I5XQorCXZtb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3I5XQorCXZtb3ZkcXUJeG1tMyxYTU1XT1JEWzQ4K3I5XQorCXZwc2h1ZmIJeG1tMCx4bW0wLHhtbTYKKwlhZGQJcjksNjQKKwlhZGQJZWJ4LERXT1JEWzE2K3JzcF0KKwl4b3IJZXNpLGVicAorCXZwc2h1ZmIJeG1tMSx4bW0xLHhtbTYKKwltb3YJZWRpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJdnBhZGRkCXhtbTQseG1tMCx4bW0xMQorCWFkZAllYngsZXNpCisJeG9yCWVkaSxlYnAKKwlzaHJkCWVkeCxlZHgsNworCWFkZAllYngsZWN4CisJdm1vdmRxYQlYTU1XT1JEW3JzcF0seG1tNAorCWFkZAllYXgsRFdPUkRbMjArcnNwXQorCXhvcgllZGksZWR4CisJbW92CWVzaSxlYngKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZWRpCisJeG9yCWVzaSxlZHgKKwlzaHJkCWVjeCxlY3gsNworCWFkZAllYXgsZWJ4CisJYWRkCWVicCxEV09SRFsyNCtyc3BdCisJeG9yCWVzaSxlY3gKKwltb3YJZWRpLGVheAorCXNobGQJZWF4LGVheCw1CisJYWRkCWVicCxlc2kKKwl4b3IJZWRpLGVjeAorCXNocmQJZWJ4LGVieCw3CisJYWRkCWVicCxlYXgKKwlhZGQJZWR4LERXT1JEWzI4K3JzcF0KKwl4b3IJZWRpLGVieAorCW1vdgllc2ksZWJwCisJc2hsZAllYnAsZWJwLDUKKwlhZGQJZWR4LGVkaQorCXhvcgllc2ksZWJ4CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVicAorCWFkZAllY3gsRFdPUkRbMzIrcnNwXQorCXhvcgllc2ksZWF4CisJdnBzaHVmYgl4bW0yLHhtbTIseG1tNgorCW1vdgllZGksZWR4CisJc2hsZAllZHgsZWR4LDUKKwl2cGFkZGQJeG1tNSx4bW0xLHhtbTExCisJYWRkCWVjeCxlc2kKKwl4b3IJZWRpLGVheAorCXNocmQJZWJwLGVicCw3CisJYWRkCWVjeCxlZHgKKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW01CisJYWRkCWVieCxEV09SRFszNityc3BdCisJeG9yCWVkaSxlYnAKKwltb3YJZXNpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlZGkKKwl4b3IJZXNpLGVicAorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzQwK3JzcF0KKwl4b3IJZXNpLGVkeAorCW1vdgllZGksZWJ4CisJc2hsZAllYngsZWJ4LDUKKwlhZGQJZWF4LGVzaQorCXhvcgllZGksZWR4CisJc2hyZAllY3gsZWN4LDcKKwlhZGQJZWF4LGVieAorCWFkZAllYnAsRFdPUkRbNDQrcnNwXQorCXhvcgllZGksZWN4CisJbW92CWVzaSxlYXgKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllYnAsZWRpCisJeG9yCWVzaSxlY3gKKwlzaHJkCWVieCxlYngsNworCWFkZAllYnAsZWF4CisJYWRkCWVkeCxEV09SRFs0OCtyc3BdCisJeG9yCWVzaSxlYngKKwl2cHNodWZiCXhtbTMseG1tMyx4bW02CisJbW92CWVkaSxlYnAKKwlzaGxkCWVicCxlYnAsNQorCXZwYWRkZAl4bW02LHhtbTIseG1tMTEKKwlhZGQJZWR4LGVzaQorCXhvcgllZGksZWJ4CisJc2hyZAllYXgsZWF4LDcKKwlhZGQJZWR4LGVicAorCXZtb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTYKKwlhZGQJZWN4LERXT1JEWzUyK3JzcF0KKwl4b3IJZWRpLGVheAorCW1vdgllc2ksZWR4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVkaQorCXhvcgllc2ksZWF4CisJc2hyZAllYnAsZWJwLDcKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkRbNTYrcnNwXQorCXhvcgllc2ksZWJwCisJbW92CWVkaSxlY3gKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZXNpCisJeG9yCWVkaSxlYnAKKwlzaHJkCWVkeCxlZHgsNworCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFs2MCtyc3BdCisJeG9yCWVkaSxlZHgKKwltb3YJZXNpLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlZGkKKwlzaHJkCWVjeCxlY3gsNworCWFkZAllYXgsZWJ4CisJYWRkCWVheCxEV09SRFtyOF0KKwlhZGQJZXNpLERXT1JEWzQrcjhdCisJYWRkCWVjeCxEV09SRFs4K3I4XQorCWFkZAllZHgsRFdPUkRbMTIrcjhdCisJbW92CURXT1JEW3I4XSxlYXgKKwlhZGQJZWJwLERXT1JEWzE2K3I4XQorCW1vdglEV09SRFs0K3I4XSxlc2kKKwltb3YJZWJ4LGVzaQorCW1vdglEV09SRFs4K3I4XSxlY3gKKwltb3YJZWRpLGVjeAorCW1vdglEV09SRFsxMityOF0sZWR4CisJeG9yCWVkaSxlZHgKKwltb3YJRFdPUkRbMTYrcjhdLGVicAorCWFuZAllc2ksZWRpCisJam1wCU5FQVIgJEwkb29wX2F2eAorCitBTElHTgkxNgorJEwkZG9uZV9hdng6CisJYWRkCWVieCxEV09SRFsxNityc3BdCisJeG9yCWVzaSxlYnAKKwltb3YJZWRpLGVjeAorCXNobGQJZWN4LGVjeCw1CisJYWRkCWVieCxlc2kKKwl4b3IJZWRpLGVicAorCXNocmQJZWR4LGVkeCw3CisJYWRkCWVieCxlY3gKKwlhZGQJZWF4LERXT1JEWzIwK3JzcF0KKwl4b3IJZWRpLGVkeAorCW1vdgllc2ksZWJ4CisJc2hsZAllYngsZWJ4LDUKKwlhZGQJZWF4LGVkaQorCXhvcgllc2ksZWR4CisJc2hyZAllY3gsZWN4LDcKKwlhZGQJZWF4LGVieAorCWFkZAllYnAsRFdPUkRbMjQrcnNwXQorCXhvcgllc2ksZWN4CisJbW92CWVkaSxlYXgKKwlzaGxkCWVheCxlYXgsNQorCWFkZAllYnAsZXNpCisJeG9yCWVkaSxlY3gKKwlzaHJkCWVieCxlYngsNworCWFkZAllYnAsZWF4CisJYWRkCWVkeCxEV09SRFsyOCtyc3BdCisJeG9yCWVkaSxlYngKKwltb3YJZXNpLGVicAorCXNobGQJZWJwLGVicCw1CisJYWRkCWVkeCxlZGkKKwl4b3IJZXNpLGVieAorCXNocmQJZWF4LGVheCw3CisJYWRkCWVkeCxlYnAKKwlhZGQJZWN4LERXT1JEWzMyK3JzcF0KKwl4b3IJZXNpLGVheAorCW1vdgllZGksZWR4CisJc2hsZAllZHgsZWR4LDUKKwlhZGQJZWN4LGVzaQorCXhvcgllZGksZWF4CisJc2hyZAllYnAsZWJwLDcKKwlhZGQJZWN4LGVkeAorCWFkZAllYngsRFdPUkRbMzYrcnNwXQorCXhvcgllZGksZWJwCisJbW92CWVzaSxlY3gKKwlzaGxkCWVjeCxlY3gsNQorCWFkZAllYngsZWRpCisJeG9yCWVzaSxlYnAKKwlzaHJkCWVkeCxlZHgsNworCWFkZAllYngsZWN4CisJYWRkCWVheCxEV09SRFs0MCtyc3BdCisJeG9yCWVzaSxlZHgKKwltb3YJZWRpLGVieAorCXNobGQJZWJ4LGVieCw1CisJYWRkCWVheCxlc2kKKwl4b3IJZWRpLGVkeAorCXNocmQJZWN4LGVjeCw3CisJYWRkCWVheCxlYngKKwlhZGQJZWJwLERXT1JEWzQ0K3JzcF0KKwl4b3IJZWRpLGVjeAorCW1vdgllc2ksZWF4CisJc2hsZAllYXgsZWF4LDUKKwlhZGQJZWJwLGVkaQorCXhvcgllc2ksZWN4CisJc2hyZAllYngsZWJ4LDcKKwlhZGQJZWJwLGVheAorCWFkZAllZHgsRFdPUkRbNDgrcnNwXQorCXhvcgllc2ksZWJ4CisJbW92CWVkaSxlYnAKKwlzaGxkCWVicCxlYnAsNQorCWFkZAllZHgsZXNpCisJeG9yCWVkaSxlYngKKwlzaHJkCWVheCxlYXgsNworCWFkZAllZHgsZWJwCisJYWRkCWVjeCxEV09SRFs1Mityc3BdCisJeG9yCWVkaSxlYXgKKwltb3YJZXNpLGVkeAorCXNobGQJZWR4LGVkeCw1CisJYWRkCWVjeCxlZGkKKwl4b3IJZXNpLGVheAorCXNocmQJZWJwLGVicCw3CisJYWRkCWVjeCxlZHgKKwlhZGQJZWJ4LERXT1JEWzU2K3JzcF0KKwl4b3IJZXNpLGVicAorCW1vdgllZGksZWN4CisJc2hsZAllY3gsZWN4LDUKKwlhZGQJZWJ4LGVzaQorCXhvcgllZGksZWJwCisJc2hyZAllZHgsZWR4LDcKKwlhZGQJZWJ4LGVjeAorCWFkZAllYXgsRFdPUkRbNjArcnNwXQorCXhvcgllZGksZWR4CisJbW92CWVzaSxlYngKKwlzaGxkCWVieCxlYngsNQorCWFkZAllYXgsZWRpCisJc2hyZAllY3gsZWN4LDcKKwlhZGQJZWF4LGVieAorCXZ6ZXJvdXBwZXIKKworCWFkZAllYXgsRFdPUkRbcjhdCisJYWRkCWVzaSxEV09SRFs0K3I4XQorCWFkZAllY3gsRFdPUkRbOCtyOF0KKwltb3YJRFdPUkRbcjhdLGVheAorCWFkZAllZHgsRFdPUkRbMTIrcjhdCisJbW92CURXT1JEWzQrcjhdLGVzaQorCWFkZAllYnAsRFdPUkRbMTYrcjhdCisJbW92CURXT1JEWzgrcjhdLGVjeAorCW1vdglEV09SRFsxMityOF0sZWR4CisJbW92CURXT1JEWzE2K3I4XSxlYnAKKwltb3ZhcHMJeG1tNixYTU1XT1JEWygoLTQwLTk2KSkrcjExXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbKCgtNDAtODApKStyMTFdCisJbW92YXBzCXhtbTgsWE1NV09SRFsoKC00MC02NCkpK3IxMV0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWygoLTQwLTQ4KSkrcjExXQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWygoLTQwLTMyKSkrcjExXQorCW1vdmFwcwl4bW0xMSxYTU1XT1JEWygoLTQwLTE2KSkrcjExXQorCW1vdglyMTQsUVdPUkRbKCgtNDApKStyMTFdCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcjExXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3IxMV0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyMTFdCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyMTFdCisKKwlsZWEJcnNwLFtyMTFdCisKKyRMJGVwaWxvZ3VlX2F2eDoKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorQUxJR04JNjQKK0tfWFhfWFg6CisJREQJMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTksMHg1YTgyNzk5OQorCURECTB4NWE4Mjc5OTksMHg1YTgyNzk5OSwweDVhODI3OTk5LDB4NWE4Mjc5OTkKKwlERAkweDZlZDllYmExLDB4NmVkOWViYTEsMHg2ZWQ5ZWJhMSwweDZlZDllYmExCisJREQJMHg2ZWQ5ZWJhMSwweDZlZDllYmExLDB4NmVkOWViYTEsMHg2ZWQ5ZWJhMQorCURECTB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjLDB4OGYxYmJjZGMKKwlERAkweDhmMWJiY2RjLDB4OGYxYmJjZGMsMHg4ZjFiYmNkYywweDhmMWJiY2RjCisJREQJMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYsMHhjYTYyYzFkNgorCURECTB4Y2E2MmMxZDYsMHhjYTYyYzFkNiwweGNhNjJjMWQ2LDB4Y2E2MmMxZDYKKwlERAkweDAwMDEwMjAzLDB4MDQwNTA2MDcsMHgwODA5MGEwYiwweDBjMGQwZTBmCisJREQJMHgwMDAxMDIwMywweDA0MDUwNjA3LDB4MDgwOTBhMGIsMHgwYzBkMGUwZgorREIJMHhmLDB4ZSwweGQsMHhjLDB4YiwweGEsMHg5LDB4OCwweDcsMHg2LDB4NSwweDQsMHgzLDB4MiwweDEsMHgwCitEQgk4Myw3Miw2NSw0OSwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3LDExMCwxMTUKK0RCCTEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQsNTIsNDQKK0RCCTMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMSwzMiw2MAorREIJOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NiwxMTEsMTE0CitEQgkxMDMsNjIsMAorQUxJR04JNjQKK0VYVEVSTglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisKK0FMSUdOCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCWxlYQlyMTAsWyRMJHByb2xvZ3VlXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbGVhCXIxMCxbJEwkZXBpbG9ndWVdCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyYXgsUVdPUkRbNjQrcmF4XQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcmF4XQorCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyYXhdCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisKKwlqbXAJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCitBTElHTgkxNgorc3NzZTNfaGFuZGxlcjoKKwlwdXNoCXJzaQorCXB1c2gJcmRpCisJcHVzaAlyYngKKwlwdXNoCXJicAorCXB1c2gJcjEyCisJcHVzaAlyMTMKKwlwdXNoCXIxNAorCXB1c2gJcjE1CisJcHVzaGZxCisJc3ViCXJzcCw2NAorCisJbW92CXJheCxRV09SRFsxMjArcjhdCisJbW92CXJieCxRV09SRFsyNDgrcjhdCisKKwltb3YJcnNpLFFXT1JEWzgrcjldCisJbW92CXIxMSxRV09SRFs1NityOV0KKworCW1vdglyMTBkLERXT1JEW3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbW92CXJheCxRV09SRFsyMDgrcjhdCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCWxlYQlyc2ksWygoLTQwLTk2KSkrcmF4XQorCWxlYQlyZGksWzUxMityOF0KKwltb3YJZWN4LDEyCisJREQJMHhhNTQ4ZjNmYworCisJbW92CXJieCxRV09SRFsoKC04KSkrcmF4XQorCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyYXhdCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JheF0KKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcmF4XQorCW1vdglyMTQsUVdPUkRbKCgtNDApKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisKKyRMJGNvbW1vbl9zZWhfdGFpbDoKKwltb3YJcmRpLFFXT1JEWzgrcmF4XQorCW1vdglyc2ksUVdPUkRbMTYrcmF4XQorCW1vdglRV09SRFsxNTIrcjhdLHJheAorCW1vdglRV09SRFsxNjgrcjhdLHJzaQorCW1vdglRV09SRFsxNzYrcjhdLHJkaQorCisJbW92CXJkaSxRV09SRFs0MCtyOV0KKwltb3YJcnNpLHI4CisJbW92CWVjeCwxNTQKKwlERAkweGE1NDhmM2ZjCisKKwltb3YJcnNpLHI5CisJeG9yCXJjeCxyY3gKKwltb3YJcmR4LFFXT1JEWzgrcnNpXQorCW1vdglyOCxRV09SRFtyc2ldCisJbW92CXI5LFFXT1JEWzE2K3JzaV0KKwltb3YJcjEwLFFXT1JEWzQwK3JzaV0KKwlsZWEJcjExLFs1Nityc2ldCisJbGVhCXIxMixbMjQrcnNpXQorCW1vdglRV09SRFszMityc3BdLHIxMAorCW1vdglRV09SRFs0MCtyc3BdLHIxMQorCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCW1vdglRV09SRFs1Nityc3BdLHJjeAorCWNhbGwJUVdPUkRbX19pbXBfUnRsVmlydHVhbFVud2luZF0KKworCW1vdgllYXgsMQorCWFkZAlyc3AsNjQKKwlwb3BmcQorCXBvcAlyMTUKKwlwb3AJcjE0CisJcG9wCXIxMworCXBvcAlyMTIKKwlwb3AJcmJwCisJcG9wCXJieAorCXBvcAlyZGkKKwlwb3AJcnNpCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworc2VjdGlvbgkucGRhdGEgcmRhdGEgYWxpZ249NAorQUxJR04JNAorCURECSRMJFNFSF9iZWdpbl9zaGExX2Jsb2NrX2RhdGFfb3JkZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9zaGExX2Jsb2NrX2RhdGFfb3JkZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fc2hhMV9ibG9ja19kYXRhX29yZGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9iZWdpbl9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fc2hhMV9ibG9ja19kYXRhX29yZGVyX3Nzc2UzIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9iZWdpbl9zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfc2hhMV9ibG9ja19kYXRhX29yZGVyX2F2eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4IHdydCAuLmltYWdlYmFzZQorc2VjdGlvbgkueGRhdGEgcmRhdGEgYWxpZ249OAorQUxJR04JOAorJEwkU0VIX2luZm9fc2hhMV9ibG9ja19kYXRhX29yZGVyOgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCiskTCRTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTM6CitEQgk5LDAsMCwwCisJREQJc3NzZTNfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRwcm9sb2d1ZV9zc3NlMyB3cnQgLi5pbWFnZWJhc2UsJEwkZXBpbG9ndWVfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlCiskTCRTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorREIJOSwwLDAsMAorCURECXNzc2UzX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcHJvbG9ndWVfYXZ4IHdydCAuLmltYWdlYmFzZSwkTCRlcGlsb2d1ZV9hdnggd3J0IC4uaW1hZ2ViYXNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LXg4Nl82NC5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhMjU2LXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4ZmY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGEyNTYteDg2XzY0LmFzbQpAQCAtMCwwICsxLDQxMzUgQEAKK2RlZmF1bHQJcmVsCislZGVmaW5lIFhNTVdPUkQKKyVkZWZpbmUgWU1NV09SRAorJWRlZmluZSBaTU1XT1JECitzZWN0aW9uCS50ZXh0IGNvZGUgYWxpZ249NjQKKworCitFWFRFUk4JT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorCitBTElHTgkxNgorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworCWxlYQlyMTEsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyOWQsRFdPUkRbcjExXQorCW1vdglyMTBkLERXT1JEWzQrcjExXQorCW1vdglyMTFkLERXT1JEWzgrcjExXQorCWFuZAlyOWQsMTA3Mzc0MTgyNAorCWFuZAlyMTBkLDI2ODQzNTk2OAorCW9yCXIxMGQscjlkCisJY21wCXIxMGQsMTM0MjE3Nzc5MgorCWplCU5FQVIgJEwkYXZ4X3Nob3J0Y3V0CisJdGVzdAlyMTBkLDUxMgorCWpueglORUFSICRMJHNzc2UzX3Nob3J0Y3V0CisJbW92CXJheCxyc3AKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXNobAlyZHgsNAorCXN1Yglyc3AsMTYqNCs0KjgKKwlsZWEJcmR4LFtyZHgqNCtyc2ldCisJYW5kCXJzcCwtNjQKKwltb3YJUVdPUkRbKCg2NCswKSkrcnNwXSxyZGkKKwltb3YJUVdPUkRbKCg2NCs4KSkrcnNwXSxyc2kKKwltb3YJUVdPUkRbKCg2NCsxNikpK3JzcF0scmR4CisJbW92CVFXT1JEWzg4K3JzcF0scmF4CisKKyRMJHByb2xvZ3VlOgorCisJbW92CWVheCxEV09SRFtyZGldCisJbW92CWVieCxEV09SRFs0K3JkaV0KKwltb3YJZWN4LERXT1JEWzgrcmRpXQorCW1vdgllZHgsRFdPUkRbMTIrcmRpXQorCW1vdglyOGQsRFdPUkRbMTYrcmRpXQorCW1vdglyOWQsRFdPUkRbMjArcmRpXQorCW1vdglyMTBkLERXT1JEWzI0K3JkaV0KKwltb3YJcjExZCxEV09SRFsyOCtyZGldCisJam1wCU5FQVIgJEwkbG9vcAorCitBTElHTgkxNgorJEwkbG9vcDoKKwltb3YJZWRpLGVieAorCWxlYQlyYnAsW0syNTZdCisJeG9yCWVkaSxlY3gKKwltb3YJcjEyZCxEV09SRFtyc2ldCisJbW92CXIxM2QscjhkCisJbW92CXIxNGQsZWF4CisJYnN3YXAJcjEyZAorCXJvcglyMTNkLDE0CisJbW92CXIxNWQscjlkCisKKwl4b3IJcjEzZCxyOGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQscjEwZAorCisJbW92CURXT1JEW3JzcF0scjEyZAorCXhvcglyMTRkLGVheAorCWFuZAlyMTVkLHI4ZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHIxMWQKKwl4b3IJcjE1ZCxyMTBkCisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLHI4ZAorCWFkZAlyMTJkLHIxNWQKKworCW1vdglyMTVkLGVheAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlYXgKKworCXhvcglyMTVkLGVieAorCXJvcglyMTNkLDYKKwltb3YJcjExZCxlYngKKworCWFuZAllZGkscjE1ZAorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjExZCxlZGkKKwlhZGQJZWR4LHIxMmQKKwlhZGQJcjExZCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwlhZGQJcjExZCxyMTRkCisJbW92CXIxMmQsRFdPUkRbNCtyc2ldCisJbW92CXIxM2QsZWR4CisJbW92CXIxNGQscjExZAorCWJzd2FwCXIxMmQKKwlyb3IJcjEzZCwxNAorCW1vdgllZGkscjhkCisKKwl4b3IJcjEzZCxlZHgKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxyOWQKKworCW1vdglEV09SRFs0K3JzcF0scjEyZAorCXhvcglyMTRkLHIxMWQKKwlhbmQJZWRpLGVkeAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHIxMGQKKwl4b3IJZWRpLHI5ZAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxlZHgKKwlhZGQJcjEyZCxlZGkKKworCW1vdgllZGkscjExZAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxyMTFkCisKKwl4b3IJZWRpLGVheAorCXJvcglyMTNkLDYKKwltb3YJcjEwZCxlYXgKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjEwZCxyMTVkCisJYWRkCWVjeCxyMTJkCisJYWRkCXIxMGQscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJYWRkCXIxMGQscjE0ZAorCW1vdglyMTJkLERXT1JEWzgrcnNpXQorCW1vdglyMTNkLGVjeAorCW1vdglyMTRkLHIxMGQKKwlic3dhcAlyMTJkCisJcm9yCXIxM2QsMTQKKwltb3YJcjE1ZCxlZHgKKworCXhvcglyMTNkLGVjeAorCXJvcglyMTRkLDkKKwl4b3IJcjE1ZCxyOGQKKworCW1vdglEV09SRFs4K3JzcF0scjEyZAorCXhvcglyMTRkLHIxMGQKKwlhbmQJcjE1ZCxlY3gKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxyOWQKKwl4b3IJcjE1ZCxyOGQKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QsZWN4CisJYWRkCXIxMmQscjE1ZAorCisJbW92CXIxNWQscjEwZAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxyMTBkCisKKwl4b3IJcjE1ZCxyMTFkCisJcm9yCXIxM2QsNgorCW1vdglyOWQscjExZAorCisJYW5kCWVkaSxyMTVkCisJcm9yCXIxNGQsMgorCWFkZAlyMTJkLHIxM2QKKworCXhvcglyOWQsZWRpCisJYWRkCWVieCxyMTJkCisJYWRkCXI5ZCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwlhZGQJcjlkLHIxNGQKKwltb3YJcjEyZCxEV09SRFsxMityc2ldCisJbW92CXIxM2QsZWJ4CisJbW92CXIxNGQscjlkCisJYnN3YXAJcjEyZAorCXJvcglyMTNkLDE0CisJbW92CWVkaSxlY3gKKworCXhvcglyMTNkLGVieAorCXJvcglyMTRkLDkKKwl4b3IJZWRpLGVkeAorCisJbW92CURXT1JEWzEyK3JzcF0scjEyZAorCXhvcglyMTRkLHI5ZAorCWFuZAllZGksZWJ4CisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQscjhkCisJeG9yCWVkaSxlZHgKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QsZWJ4CisJYWRkCXIxMmQsZWRpCisKKwltb3YJZWRpLHI5ZAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxyOWQKKworCXhvcgllZGkscjEwZAorCXJvcglyMTNkLDYKKwltb3YJcjhkLHIxMGQKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjhkLHIxNWQKKwlhZGQJZWF4LHIxMmQKKwlhZGQJcjhkLHIxMmQKKworCWxlYQlyYnAsWzIwK3JicF0KKwlhZGQJcjhkLHIxNGQKKwltb3YJcjEyZCxEV09SRFsxNityc2ldCisJbW92CXIxM2QsZWF4CisJbW92CXIxNGQscjhkCisJYnN3YXAJcjEyZAorCXJvcglyMTNkLDE0CisJbW92CXIxNWQsZWJ4CisKKwl4b3IJcjEzZCxlYXgKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQsZWN4CisKKwltb3YJRFdPUkRbMTYrcnNwXSxyMTJkCisJeG9yCXIxNGQscjhkCisJYW5kCXIxNWQsZWF4CisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQsZWR4CisJeG9yCXIxNWQsZWN4CisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLGVheAorCWFkZAlyMTJkLHIxNWQKKworCW1vdglyMTVkLHI4ZAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxyOGQKKworCXhvcglyMTVkLHI5ZAorCXJvcglyMTNkLDYKKwltb3YJZWR4LHI5ZAorCisJYW5kCWVkaSxyMTVkCisJcm9yCXIxNGQsMgorCWFkZAlyMTJkLHIxM2QKKworCXhvcgllZHgsZWRpCisJYWRkCXIxMWQscjEyZAorCWFkZAllZHgscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJYWRkCWVkeCxyMTRkCisJbW92CXIxMmQsRFdPUkRbMjArcnNpXQorCW1vdglyMTNkLHIxMWQKKwltb3YJcjE0ZCxlZHgKKwlic3dhcAlyMTJkCisJcm9yCXIxM2QsMTQKKwltb3YJZWRpLGVheAorCisJeG9yCXIxM2QscjExZAorCXJvcglyMTRkLDkKKwl4b3IJZWRpLGVieAorCisJbW92CURXT1JEWzIwK3JzcF0scjEyZAorCXhvcglyMTRkLGVkeAorCWFuZAllZGkscjExZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLGVjeAorCXhvcgllZGksZWJ4CisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLHIxMWQKKwlhZGQJcjEyZCxlZGkKKworCW1vdgllZGksZWR4CisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLGVkeAorCisJeG9yCWVkaSxyOGQKKwlyb3IJcjEzZCw2CisJbW92CWVjeCxyOGQKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJZWN4LHIxNWQKKwlhZGQJcjEwZCxyMTJkCisJYWRkCWVjeCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwlhZGQJZWN4LHIxNGQKKwltb3YJcjEyZCxEV09SRFsyNCtyc2ldCisJbW92CXIxM2QscjEwZAorCW1vdglyMTRkLGVjeAorCWJzd2FwCXIxMmQKKwlyb3IJcjEzZCwxNAorCW1vdglyMTVkLHIxMWQKKworCXhvcglyMTNkLHIxMGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQsZWF4CisKKwltb3YJRFdPUkRbMjQrcnNwXSxyMTJkCisJeG9yCXIxNGQsZWN4CisJYW5kCXIxNWQscjEwZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLGVieAorCXhvcglyMTVkLGVheAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxyMTBkCisJYWRkCXIxMmQscjE1ZAorCisJbW92CXIxNWQsZWN4CisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLGVjeAorCisJeG9yCXIxNWQsZWR4CisJcm9yCXIxM2QsNgorCW1vdgllYngsZWR4CisKKwlhbmQJZWRpLHIxNWQKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCWVieCxlZGkKKwlhZGQJcjlkLHIxMmQKKwlhZGQJZWJ4LHIxMmQKKworCWxlYQlyYnAsWzQrcmJwXQorCWFkZAllYngscjE0ZAorCW1vdglyMTJkLERXT1JEWzI4K3JzaV0KKwltb3YJcjEzZCxyOWQKKwltb3YJcjE0ZCxlYngKKwlic3dhcAlyMTJkCisJcm9yCXIxM2QsMTQKKwltb3YJZWRpLHIxMGQKKworCXhvcglyMTNkLHI5ZAorCXJvcglyMTRkLDkKKwl4b3IJZWRpLHIxMWQKKworCW1vdglEV09SRFsyOCtyc3BdLHIxMmQKKwl4b3IJcjE0ZCxlYngKKwlhbmQJZWRpLHI5ZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLGVheAorCXhvcgllZGkscjExZAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxyOWQKKwlhZGQJcjEyZCxlZGkKKworCW1vdgllZGksZWJ4CisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLGVieAorCisJeG9yCWVkaSxlY3gKKwlyb3IJcjEzZCw2CisJbW92CWVheCxlY3gKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJZWF4LHIxNWQKKwlhZGQJcjhkLHIxMmQKKwlhZGQJZWF4LHIxMmQKKworCWxlYQlyYnAsWzIwK3JicF0KKwlhZGQJZWF4LHIxNGQKKwltb3YJcjEyZCxEV09SRFszMityc2ldCisJbW92CXIxM2QscjhkCisJbW92CXIxNGQsZWF4CisJYnN3YXAJcjEyZAorCXJvcglyMTNkLDE0CisJbW92CXIxNWQscjlkCisKKwl4b3IJcjEzZCxyOGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQscjEwZAorCisJbW92CURXT1JEWzMyK3JzcF0scjEyZAorCXhvcglyMTRkLGVheAorCWFuZAlyMTVkLHI4ZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHIxMWQKKwl4b3IJcjE1ZCxyMTBkCisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLHI4ZAorCWFkZAlyMTJkLHIxNWQKKworCW1vdglyMTVkLGVheAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlYXgKKworCXhvcglyMTVkLGVieAorCXJvcglyMTNkLDYKKwltb3YJcjExZCxlYngKKworCWFuZAllZGkscjE1ZAorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjExZCxlZGkKKwlhZGQJZWR4LHIxMmQKKwlhZGQJcjExZCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwlhZGQJcjExZCxyMTRkCisJbW92CXIxMmQsRFdPUkRbMzYrcnNpXQorCW1vdglyMTNkLGVkeAorCW1vdglyMTRkLHIxMWQKKwlic3dhcAlyMTJkCisJcm9yCXIxM2QsMTQKKwltb3YJZWRpLHI4ZAorCisJeG9yCXIxM2QsZWR4CisJcm9yCXIxNGQsOQorCXhvcgllZGkscjlkCisKKwltb3YJRFdPUkRbMzYrcnNwXSxyMTJkCisJeG9yCXIxNGQscjExZAorCWFuZAllZGksZWR4CisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQscjEwZAorCXhvcgllZGkscjlkCisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLGVkeAorCWFkZAlyMTJkLGVkaQorCisJbW92CWVkaSxyMTFkCisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLHIxMWQKKworCXhvcgllZGksZWF4CisJcm9yCXIxM2QsNgorCW1vdglyMTBkLGVheAorCisJYW5kCXIxNWQsZWRpCisJcm9yCXIxNGQsMgorCWFkZAlyMTJkLHIxM2QKKworCXhvcglyMTBkLHIxNWQKKwlhZGQJZWN4LHIxMmQKKwlhZGQJcjEwZCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwlhZGQJcjEwZCxyMTRkCisJbW92CXIxMmQsRFdPUkRbNDArcnNpXQorCW1vdglyMTNkLGVjeAorCW1vdglyMTRkLHIxMGQKKwlic3dhcAlyMTJkCisJcm9yCXIxM2QsMTQKKwltb3YJcjE1ZCxlZHgKKworCXhvcglyMTNkLGVjeAorCXJvcglyMTRkLDkKKwl4b3IJcjE1ZCxyOGQKKworCW1vdglEV09SRFs0MCtyc3BdLHIxMmQKKwl4b3IJcjE0ZCxyMTBkCisJYW5kCXIxNWQsZWN4CisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQscjlkCisJeG9yCXIxNWQscjhkCisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLGVjeAorCWFkZAlyMTJkLHIxNWQKKworCW1vdglyMTVkLHIxMGQKKwlhZGQJcjEyZCxEV09SRFtyYnBdCisJeG9yCXIxNGQscjEwZAorCisJeG9yCXIxNWQscjExZAorCXJvcglyMTNkLDYKKwltb3YJcjlkLHIxMWQKKworCWFuZAllZGkscjE1ZAorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjlkLGVkaQorCWFkZAllYngscjEyZAorCWFkZAlyOWQscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJYWRkCXI5ZCxyMTRkCisJbW92CXIxMmQsRFdPUkRbNDQrcnNpXQorCW1vdglyMTNkLGVieAorCW1vdglyMTRkLHI5ZAorCWJzd2FwCXIxMmQKKwlyb3IJcjEzZCwxNAorCW1vdgllZGksZWN4CisKKwl4b3IJcjEzZCxlYngKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxlZHgKKworCW1vdglEV09SRFs0NCtyc3BdLHIxMmQKKwl4b3IJcjE0ZCxyOWQKKwlhbmQJZWRpLGVieAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHI4ZAorCXhvcgllZGksZWR4CisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLGVieAorCWFkZAlyMTJkLGVkaQorCisJbW92CWVkaSxyOWQKKwlhZGQJcjEyZCxEV09SRFtyYnBdCisJeG9yCXIxNGQscjlkCisKKwl4b3IJZWRpLHIxMGQKKwlyb3IJcjEzZCw2CisJbW92CXI4ZCxyMTBkCisKKwlhbmQJcjE1ZCxlZGkKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCXI4ZCxyMTVkCisJYWRkCWVheCxyMTJkCisJYWRkCXI4ZCxyMTJkCisKKwlsZWEJcmJwLFsyMCtyYnBdCisJYWRkCXI4ZCxyMTRkCisJbW92CXIxMmQsRFdPUkRbNDgrcnNpXQorCW1vdglyMTNkLGVheAorCW1vdglyMTRkLHI4ZAorCWJzd2FwCXIxMmQKKwlyb3IJcjEzZCwxNAorCW1vdglyMTVkLGVieAorCisJeG9yCXIxM2QsZWF4CisJcm9yCXIxNGQsOQorCXhvcglyMTVkLGVjeAorCisJbW92CURXT1JEWzQ4K3JzcF0scjEyZAorCXhvcglyMTRkLHI4ZAorCWFuZAlyMTVkLGVheAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLGVkeAorCXhvcglyMTVkLGVjeAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxlYXgKKwlhZGQJcjEyZCxyMTVkCisKKwltb3YJcjE1ZCxyOGQKKwlhZGQJcjEyZCxEV09SRFtyYnBdCisJeG9yCXIxNGQscjhkCisKKwl4b3IJcjE1ZCxyOWQKKwlyb3IJcjEzZCw2CisJbW92CWVkeCxyOWQKKworCWFuZAllZGkscjE1ZAorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJZWR4LGVkaQorCWFkZAlyMTFkLHIxMmQKKwlhZGQJZWR4LHIxMmQKKworCWxlYQlyYnAsWzQrcmJwXQorCWFkZAllZHgscjE0ZAorCW1vdglyMTJkLERXT1JEWzUyK3JzaV0KKwltb3YJcjEzZCxyMTFkCisJbW92CXIxNGQsZWR4CisJYnN3YXAJcjEyZAorCXJvcglyMTNkLDE0CisJbW92CWVkaSxlYXgKKworCXhvcglyMTNkLHIxMWQKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxlYngKKworCW1vdglEV09SRFs1Mityc3BdLHIxMmQKKwl4b3IJcjE0ZCxlZHgKKwlhbmQJZWRpLHIxMWQKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxlY3gKKwl4b3IJZWRpLGVieAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxyMTFkCisJYWRkCXIxMmQsZWRpCisKKwltb3YJZWRpLGVkeAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlZHgKKworCXhvcgllZGkscjhkCisJcm9yCXIxM2QsNgorCW1vdgllY3gscjhkCisKKwlhbmQJcjE1ZCxlZGkKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCWVjeCxyMTVkCisJYWRkCXIxMGQscjEyZAorCWFkZAllY3gscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJYWRkCWVjeCxyMTRkCisJbW92CXIxMmQsRFdPUkRbNTYrcnNpXQorCW1vdglyMTNkLHIxMGQKKwltb3YJcjE0ZCxlY3gKKwlic3dhcAlyMTJkCisJcm9yCXIxM2QsMTQKKwltb3YJcjE1ZCxyMTFkCisKKwl4b3IJcjEzZCxyMTBkCisJcm9yCXIxNGQsOQorCXhvcglyMTVkLGVheAorCisJbW92CURXT1JEWzU2K3JzcF0scjEyZAorCXhvcglyMTRkLGVjeAorCWFuZAlyMTVkLHIxMGQKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxlYngKKwl4b3IJcjE1ZCxlYXgKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QscjEwZAorCWFkZAlyMTJkLHIxNWQKKworCW1vdglyMTVkLGVjeAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlY3gKKworCXhvcglyMTVkLGVkeAorCXJvcglyMTNkLDYKKwltb3YJZWJ4LGVkeAorCisJYW5kCWVkaSxyMTVkCisJcm9yCXIxNGQsMgorCWFkZAlyMTJkLHIxM2QKKworCXhvcgllYngsZWRpCisJYWRkCXI5ZCxyMTJkCisJYWRkCWVieCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwlhZGQJZWJ4LHIxNGQKKwltb3YJcjEyZCxEV09SRFs2MCtyc2ldCisJbW92CXIxM2QscjlkCisJbW92CXIxNGQsZWJ4CisJYnN3YXAJcjEyZAorCXJvcglyMTNkLDE0CisJbW92CWVkaSxyMTBkCisKKwl4b3IJcjEzZCxyOWQKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxyMTFkCisKKwltb3YJRFdPUkRbNjArcnNwXSxyMTJkCisJeG9yCXIxNGQsZWJ4CisJYW5kCWVkaSxyOWQKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxlYXgKKwl4b3IJZWRpLHIxMWQKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QscjlkCisJYWRkCXIxMmQsZWRpCisKKwltb3YJZWRpLGVieAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlYngKKworCXhvcgllZGksZWN4CisJcm9yCXIxM2QsNgorCW1vdgllYXgsZWN4CisKKwlhbmQJcjE1ZCxlZGkKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCWVheCxyMTVkCisJYWRkCXI4ZCxyMTJkCisJYWRkCWVheCxyMTJkCisKKwlsZWEJcmJwLFsyMCtyYnBdCisJam1wCU5FQVIgJEwkcm91bmRzXzE2X3h4CitBTElHTgkxNgorJEwkcm91bmRzXzE2X3h4OgorCW1vdglyMTNkLERXT1JEWzQrcnNwXQorCW1vdglyMTVkLERXT1JEWzU2K3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAllYXgscjE0ZAorCW1vdglyMTRkLHIxNWQKKwlyb3IJcjE1ZCwyCisKKwl4b3IJcjEzZCxyMTJkCisJc2hyCXIxMmQsMworCXJvcglyMTNkLDcKKwl4b3IJcjE1ZCxyMTRkCisJc2hyCXIxNGQsMTAKKworCXJvcglyMTVkLDE3CisJeG9yCXIxMmQscjEzZAorCXhvcglyMTVkLHIxNGQKKwlhZGQJcjEyZCxEV09SRFszNityc3BdCisKKwlhZGQJcjEyZCxEV09SRFtyc3BdCisJbW92CXIxM2QscjhkCisJYWRkCXIxMmQscjE1ZAorCW1vdglyMTRkLGVheAorCXJvcglyMTNkLDE0CisJbW92CXIxNWQscjlkCisKKwl4b3IJcjEzZCxyOGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQscjEwZAorCisJbW92CURXT1JEW3JzcF0scjEyZAorCXhvcglyMTRkLGVheAorCWFuZAlyMTVkLHI4ZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHIxMWQKKwl4b3IJcjE1ZCxyMTBkCisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLHI4ZAorCWFkZAlyMTJkLHIxNWQKKworCW1vdglyMTVkLGVheAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlYXgKKworCXhvcglyMTVkLGVieAorCXJvcglyMTNkLDYKKwltb3YJcjExZCxlYngKKworCWFuZAllZGkscjE1ZAorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjExZCxlZGkKKwlhZGQJZWR4LHIxMmQKKwlhZGQJcjExZCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwltb3YJcjEzZCxEV09SRFs4K3JzcF0KKwltb3YJZWRpLERXT1JEWzYwK3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAlyMTFkLHIxNGQKKwltb3YJcjE0ZCxlZGkKKwlyb3IJZWRpLDIKKworCXhvcglyMTNkLHIxMmQKKwlzaHIJcjEyZCwzCisJcm9yCXIxM2QsNworCXhvcgllZGkscjE0ZAorCXNocglyMTRkLDEwCisKKwlyb3IJZWRpLDE3CisJeG9yCXIxMmQscjEzZAorCXhvcgllZGkscjE0ZAorCWFkZAlyMTJkLERXT1JEWzQwK3JzcF0KKworCWFkZAlyMTJkLERXT1JEWzQrcnNwXQorCW1vdglyMTNkLGVkeAorCWFkZAlyMTJkLGVkaQorCW1vdglyMTRkLHIxMWQKKwlyb3IJcjEzZCwxNAorCW1vdgllZGkscjhkCisKKwl4b3IJcjEzZCxlZHgKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxyOWQKKworCW1vdglEV09SRFs0K3JzcF0scjEyZAorCXhvcglyMTRkLHIxMWQKKwlhbmQJZWRpLGVkeAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHIxMGQKKwl4b3IJZWRpLHI5ZAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxlZHgKKwlhZGQJcjEyZCxlZGkKKworCW1vdgllZGkscjExZAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxyMTFkCisKKwl4b3IJZWRpLGVheAorCXJvcglyMTNkLDYKKwltb3YJcjEwZCxlYXgKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjEwZCxyMTVkCisJYWRkCWVjeCxyMTJkCisJYWRkCXIxMGQscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJbW92CXIxM2QsRFdPUkRbMTIrcnNwXQorCW1vdglyMTVkLERXT1JEW3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAlyMTBkLHIxNGQKKwltb3YJcjE0ZCxyMTVkCisJcm9yCXIxNWQsMgorCisJeG9yCXIxM2QscjEyZAorCXNocglyMTJkLDMKKwlyb3IJcjEzZCw3CisJeG9yCXIxNWQscjE0ZAorCXNocglyMTRkLDEwCisKKwlyb3IJcjE1ZCwxNworCXhvcglyMTJkLHIxM2QKKwl4b3IJcjE1ZCxyMTRkCisJYWRkCXIxMmQsRFdPUkRbNDQrcnNwXQorCisJYWRkCXIxMmQsRFdPUkRbOCtyc3BdCisJbW92CXIxM2QsZWN4CisJYWRkCXIxMmQscjE1ZAorCW1vdglyMTRkLHIxMGQKKwlyb3IJcjEzZCwxNAorCW1vdglyMTVkLGVkeAorCisJeG9yCXIxM2QsZWN4CisJcm9yCXIxNGQsOQorCXhvcglyMTVkLHI4ZAorCisJbW92CURXT1JEWzgrcnNwXSxyMTJkCisJeG9yCXIxNGQscjEwZAorCWFuZAlyMTVkLGVjeAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHI5ZAorCXhvcglyMTVkLHI4ZAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxlY3gKKwlhZGQJcjEyZCxyMTVkCisKKwltb3YJcjE1ZCxyMTBkCisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLHIxMGQKKworCXhvcglyMTVkLHIxMWQKKwlyb3IJcjEzZCw2CisJbW92CXI5ZCxyMTFkCisKKwlhbmQJZWRpLHIxNWQKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCXI5ZCxlZGkKKwlhZGQJZWJ4LHIxMmQKKwlhZGQJcjlkLHIxMmQKKworCWxlYQlyYnAsWzQrcmJwXQorCW1vdglyMTNkLERXT1JEWzE2K3JzcF0KKwltb3YJZWRpLERXT1JEWzQrcnNwXQorCisJbW92CXIxMmQscjEzZAorCXJvcglyMTNkLDExCisJYWRkCXI5ZCxyMTRkCisJbW92CXIxNGQsZWRpCisJcm9yCWVkaSwyCisKKwl4b3IJcjEzZCxyMTJkCisJc2hyCXIxMmQsMworCXJvcglyMTNkLDcKKwl4b3IJZWRpLHIxNGQKKwlzaHIJcjE0ZCwxMAorCisJcm9yCWVkaSwxNworCXhvcglyMTJkLHIxM2QKKwl4b3IJZWRpLHIxNGQKKwlhZGQJcjEyZCxEV09SRFs0OCtyc3BdCisKKwlhZGQJcjEyZCxEV09SRFsxMityc3BdCisJbW92CXIxM2QsZWJ4CisJYWRkCXIxMmQsZWRpCisJbW92CXIxNGQscjlkCisJcm9yCXIxM2QsMTQKKwltb3YJZWRpLGVjeAorCisJeG9yCXIxM2QsZWJ4CisJcm9yCXIxNGQsOQorCXhvcgllZGksZWR4CisKKwltb3YJRFdPUkRbMTIrcnNwXSxyMTJkCisJeG9yCXIxNGQscjlkCisJYW5kCWVkaSxlYngKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxyOGQKKwl4b3IJZWRpLGVkeAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxlYngKKwlhZGQJcjEyZCxlZGkKKworCW1vdgllZGkscjlkCisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLHI5ZAorCisJeG9yCWVkaSxyMTBkCisJcm9yCXIxM2QsNgorCW1vdglyOGQscjEwZAorCisJYW5kCXIxNWQsZWRpCisJcm9yCXIxNGQsMgorCWFkZAlyMTJkLHIxM2QKKworCXhvcglyOGQscjE1ZAorCWFkZAllYXgscjEyZAorCWFkZAlyOGQscjEyZAorCisJbGVhCXJicCxbMjArcmJwXQorCW1vdglyMTNkLERXT1JEWzIwK3JzcF0KKwltb3YJcjE1ZCxEV09SRFs4K3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAlyOGQscjE0ZAorCW1vdglyMTRkLHIxNWQKKwlyb3IJcjE1ZCwyCisKKwl4b3IJcjEzZCxyMTJkCisJc2hyCXIxMmQsMworCXJvcglyMTNkLDcKKwl4b3IJcjE1ZCxyMTRkCisJc2hyCXIxNGQsMTAKKworCXJvcglyMTVkLDE3CisJeG9yCXIxMmQscjEzZAorCXhvcglyMTVkLHIxNGQKKwlhZGQJcjEyZCxEV09SRFs1Mityc3BdCisKKwlhZGQJcjEyZCxEV09SRFsxNityc3BdCisJbW92CXIxM2QsZWF4CisJYWRkCXIxMmQscjE1ZAorCW1vdglyMTRkLHI4ZAorCXJvcglyMTNkLDE0CisJbW92CXIxNWQsZWJ4CisKKwl4b3IJcjEzZCxlYXgKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQsZWN4CisKKwltb3YJRFdPUkRbMTYrcnNwXSxyMTJkCisJeG9yCXIxNGQscjhkCisJYW5kCXIxNWQsZWF4CisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQsZWR4CisJeG9yCXIxNWQsZWN4CisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLGVheAorCWFkZAlyMTJkLHIxNWQKKworCW1vdglyMTVkLHI4ZAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxyOGQKKworCXhvcglyMTVkLHI5ZAorCXJvcglyMTNkLDYKKwltb3YJZWR4LHI5ZAorCisJYW5kCWVkaSxyMTVkCisJcm9yCXIxNGQsMgorCWFkZAlyMTJkLHIxM2QKKworCXhvcgllZHgsZWRpCisJYWRkCXIxMWQscjEyZAorCWFkZAllZHgscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJbW92CXIxM2QsRFdPUkRbMjQrcnNwXQorCW1vdgllZGksRFdPUkRbMTIrcnNwXQorCisJbW92CXIxMmQscjEzZAorCXJvcglyMTNkLDExCisJYWRkCWVkeCxyMTRkCisJbW92CXIxNGQsZWRpCisJcm9yCWVkaSwyCisKKwl4b3IJcjEzZCxyMTJkCisJc2hyCXIxMmQsMworCXJvcglyMTNkLDcKKwl4b3IJZWRpLHIxNGQKKwlzaHIJcjE0ZCwxMAorCisJcm9yCWVkaSwxNworCXhvcglyMTJkLHIxM2QKKwl4b3IJZWRpLHIxNGQKKwlhZGQJcjEyZCxEV09SRFs1Nityc3BdCisKKwlhZGQJcjEyZCxEV09SRFsyMCtyc3BdCisJbW92CXIxM2QscjExZAorCWFkZAlyMTJkLGVkaQorCW1vdglyMTRkLGVkeAorCXJvcglyMTNkLDE0CisJbW92CWVkaSxlYXgKKworCXhvcglyMTNkLHIxMWQKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxlYngKKworCW1vdglEV09SRFsyMCtyc3BdLHIxMmQKKwl4b3IJcjE0ZCxlZHgKKwlhbmQJZWRpLHIxMWQKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxlY3gKKwl4b3IJZWRpLGVieAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxyMTFkCisJYWRkCXIxMmQsZWRpCisKKwltb3YJZWRpLGVkeAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlZHgKKworCXhvcgllZGkscjhkCisJcm9yCXIxM2QsNgorCW1vdgllY3gscjhkCisKKwlhbmQJcjE1ZCxlZGkKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCWVjeCxyMTVkCisJYWRkCXIxMGQscjEyZAorCWFkZAllY3gscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJbW92CXIxM2QsRFdPUkRbMjgrcnNwXQorCW1vdglyMTVkLERXT1JEWzE2K3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAllY3gscjE0ZAorCW1vdglyMTRkLHIxNWQKKwlyb3IJcjE1ZCwyCisKKwl4b3IJcjEzZCxyMTJkCisJc2hyCXIxMmQsMworCXJvcglyMTNkLDcKKwl4b3IJcjE1ZCxyMTRkCisJc2hyCXIxNGQsMTAKKworCXJvcglyMTVkLDE3CisJeG9yCXIxMmQscjEzZAorCXhvcglyMTVkLHIxNGQKKwlhZGQJcjEyZCxEV09SRFs2MCtyc3BdCisKKwlhZGQJcjEyZCxEV09SRFsyNCtyc3BdCisJbW92CXIxM2QscjEwZAorCWFkZAlyMTJkLHIxNWQKKwltb3YJcjE0ZCxlY3gKKwlyb3IJcjEzZCwxNAorCW1vdglyMTVkLHIxMWQKKworCXhvcglyMTNkLHIxMGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQsZWF4CisKKwltb3YJRFdPUkRbMjQrcnNwXSxyMTJkCisJeG9yCXIxNGQsZWN4CisJYW5kCXIxNWQscjEwZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLGVieAorCXhvcglyMTVkLGVheAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxyMTBkCisJYWRkCXIxMmQscjE1ZAorCisJbW92CXIxNWQsZWN4CisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLGVjeAorCisJeG9yCXIxNWQsZWR4CisJcm9yCXIxM2QsNgorCW1vdgllYngsZWR4CisKKwlhbmQJZWRpLHIxNWQKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCWVieCxlZGkKKwlhZGQJcjlkLHIxMmQKKwlhZGQJZWJ4LHIxMmQKKworCWxlYQlyYnAsWzQrcmJwXQorCW1vdglyMTNkLERXT1JEWzMyK3JzcF0KKwltb3YJZWRpLERXT1JEWzIwK3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAllYngscjE0ZAorCW1vdglyMTRkLGVkaQorCXJvcgllZGksMgorCisJeG9yCXIxM2QscjEyZAorCXNocglyMTJkLDMKKwlyb3IJcjEzZCw3CisJeG9yCWVkaSxyMTRkCisJc2hyCXIxNGQsMTAKKworCXJvcgllZGksMTcKKwl4b3IJcjEyZCxyMTNkCisJeG9yCWVkaSxyMTRkCisJYWRkCXIxMmQsRFdPUkRbcnNwXQorCisJYWRkCXIxMmQsRFdPUkRbMjgrcnNwXQorCW1vdglyMTNkLHI5ZAorCWFkZAlyMTJkLGVkaQorCW1vdglyMTRkLGVieAorCXJvcglyMTNkLDE0CisJbW92CWVkaSxyMTBkCisKKwl4b3IJcjEzZCxyOWQKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxyMTFkCisKKwltb3YJRFdPUkRbMjgrcnNwXSxyMTJkCisJeG9yCXIxNGQsZWJ4CisJYW5kCWVkaSxyOWQKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxlYXgKKwl4b3IJZWRpLHIxMWQKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QscjlkCisJYWRkCXIxMmQsZWRpCisKKwltb3YJZWRpLGVieAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxlYngKKworCXhvcgllZGksZWN4CisJcm9yCXIxM2QsNgorCW1vdgllYXgsZWN4CisKKwlhbmQJcjE1ZCxlZGkKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCWVheCxyMTVkCisJYWRkCXI4ZCxyMTJkCisJYWRkCWVheCxyMTJkCisKKwlsZWEJcmJwLFsyMCtyYnBdCisJbW92CXIxM2QsRFdPUkRbMzYrcnNwXQorCW1vdglyMTVkLERXT1JEWzI0K3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAllYXgscjE0ZAorCW1vdglyMTRkLHIxNWQKKwlyb3IJcjE1ZCwyCisKKwl4b3IJcjEzZCxyMTJkCisJc2hyCXIxMmQsMworCXJvcglyMTNkLDcKKwl4b3IJcjE1ZCxyMTRkCisJc2hyCXIxNGQsMTAKKworCXJvcglyMTVkLDE3CisJeG9yCXIxMmQscjEzZAorCXhvcglyMTVkLHIxNGQKKwlhZGQJcjEyZCxEV09SRFs0K3JzcF0KKworCWFkZAlyMTJkLERXT1JEWzMyK3JzcF0KKwltb3YJcjEzZCxyOGQKKwlhZGQJcjEyZCxyMTVkCisJbW92CXIxNGQsZWF4CisJcm9yCXIxM2QsMTQKKwltb3YJcjE1ZCxyOWQKKworCXhvcglyMTNkLHI4ZAorCXJvcglyMTRkLDkKKwl4b3IJcjE1ZCxyMTBkCisKKwltb3YJRFdPUkRbMzIrcnNwXSxyMTJkCisJeG9yCXIxNGQsZWF4CisJYW5kCXIxNWQscjhkCisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQscjExZAorCXhvcglyMTVkLHIxMGQKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QscjhkCisJYWRkCXIxMmQscjE1ZAorCisJbW92CXIxNWQsZWF4CisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLGVheAorCisJeG9yCXIxNWQsZWJ4CisJcm9yCXIxM2QsNgorCW1vdglyMTFkLGVieAorCisJYW5kCWVkaSxyMTVkCisJcm9yCXIxNGQsMgorCWFkZAlyMTJkLHIxM2QKKworCXhvcglyMTFkLGVkaQorCWFkZAllZHgscjEyZAorCWFkZAlyMTFkLHIxMmQKKworCWxlYQlyYnAsWzQrcmJwXQorCW1vdglyMTNkLERXT1JEWzQwK3JzcF0KKwltb3YJZWRpLERXT1JEWzI4K3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAlyMTFkLHIxNGQKKwltb3YJcjE0ZCxlZGkKKwlyb3IJZWRpLDIKKworCXhvcglyMTNkLHIxMmQKKwlzaHIJcjEyZCwzCisJcm9yCXIxM2QsNworCXhvcgllZGkscjE0ZAorCXNocglyMTRkLDEwCisKKwlyb3IJZWRpLDE3CisJeG9yCXIxMmQscjEzZAorCXhvcgllZGkscjE0ZAorCWFkZAlyMTJkLERXT1JEWzgrcnNwXQorCisJYWRkCXIxMmQsRFdPUkRbMzYrcnNwXQorCW1vdglyMTNkLGVkeAorCWFkZAlyMTJkLGVkaQorCW1vdglyMTRkLHIxMWQKKwlyb3IJcjEzZCwxNAorCW1vdgllZGkscjhkCisKKwl4b3IJcjEzZCxlZHgKKwlyb3IJcjE0ZCw5CisJeG9yCWVkaSxyOWQKKworCW1vdglEV09SRFszNityc3BdLHIxMmQKKwl4b3IJcjE0ZCxyMTFkCisJYW5kCWVkaSxlZHgKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxyMTBkCisJeG9yCWVkaSxyOWQKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QsZWR4CisJYWRkCXIxMmQsZWRpCisKKwltb3YJZWRpLHIxMWQKKwlhZGQJcjEyZCxEV09SRFtyYnBdCisJeG9yCXIxNGQscjExZAorCisJeG9yCWVkaSxlYXgKKwlyb3IJcjEzZCw2CisJbW92CXIxMGQsZWF4CisKKwlhbmQJcjE1ZCxlZGkKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCXIxMGQscjE1ZAorCWFkZAllY3gscjEyZAorCWFkZAlyMTBkLHIxMmQKKworCWxlYQlyYnAsWzQrcmJwXQorCW1vdglyMTNkLERXT1JEWzQ0K3JzcF0KKwltb3YJcjE1ZCxEV09SRFszMityc3BdCisKKwltb3YJcjEyZCxyMTNkCisJcm9yCXIxM2QsMTEKKwlhZGQJcjEwZCxyMTRkCisJbW92CXIxNGQscjE1ZAorCXJvcglyMTVkLDIKKworCXhvcglyMTNkLHIxMmQKKwlzaHIJcjEyZCwzCisJcm9yCXIxM2QsNworCXhvcglyMTVkLHIxNGQKKwlzaHIJcjE0ZCwxMAorCisJcm9yCXIxNWQsMTcKKwl4b3IJcjEyZCxyMTNkCisJeG9yCXIxNWQscjE0ZAorCWFkZAlyMTJkLERXT1JEWzEyK3JzcF0KKworCWFkZAlyMTJkLERXT1JEWzQwK3JzcF0KKwltb3YJcjEzZCxlY3gKKwlhZGQJcjEyZCxyMTVkCisJbW92CXIxNGQscjEwZAorCXJvcglyMTNkLDE0CisJbW92CXIxNWQsZWR4CisKKwl4b3IJcjEzZCxlY3gKKwlyb3IJcjE0ZCw5CisJeG9yCXIxNWQscjhkCisKKwltb3YJRFdPUkRbNDArcnNwXSxyMTJkCisJeG9yCXIxNGQscjEwZAorCWFuZAlyMTVkLGVjeAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLHI5ZAorCXhvcglyMTVkLHI4ZAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxlY3gKKwlhZGQJcjEyZCxyMTVkCisKKwltb3YJcjE1ZCxyMTBkCisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLHIxMGQKKworCXhvcglyMTVkLHIxMWQKKwlyb3IJcjEzZCw2CisJbW92CXI5ZCxyMTFkCisKKwlhbmQJZWRpLHIxNWQKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCXI5ZCxlZGkKKwlhZGQJZWJ4LHIxMmQKKwlhZGQJcjlkLHIxMmQKKworCWxlYQlyYnAsWzQrcmJwXQorCW1vdglyMTNkLERXT1JEWzQ4K3JzcF0KKwltb3YJZWRpLERXT1JEWzM2K3JzcF0KKworCW1vdglyMTJkLHIxM2QKKwlyb3IJcjEzZCwxMQorCWFkZAlyOWQscjE0ZAorCW1vdglyMTRkLGVkaQorCXJvcgllZGksMgorCisJeG9yCXIxM2QscjEyZAorCXNocglyMTJkLDMKKwlyb3IJcjEzZCw3CisJeG9yCWVkaSxyMTRkCisJc2hyCXIxNGQsMTAKKworCXJvcgllZGksMTcKKwl4b3IJcjEyZCxyMTNkCisJeG9yCWVkaSxyMTRkCisJYWRkCXIxMmQsRFdPUkRbMTYrcnNwXQorCisJYWRkCXIxMmQsRFdPUkRbNDQrcnNwXQorCW1vdglyMTNkLGVieAorCWFkZAlyMTJkLGVkaQorCW1vdglyMTRkLHI5ZAorCXJvcglyMTNkLDE0CisJbW92CWVkaSxlY3gKKworCXhvcglyMTNkLGVieAorCXJvcglyMTRkLDkKKwl4b3IJZWRpLGVkeAorCisJbW92CURXT1JEWzQ0K3JzcF0scjEyZAorCXhvcglyMTRkLHI5ZAorCWFuZAllZGksZWJ4CisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQscjhkCisJeG9yCWVkaSxlZHgKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QsZWJ4CisJYWRkCXIxMmQsZWRpCisKKwltb3YJZWRpLHI5ZAorCWFkZAlyMTJkLERXT1JEW3JicF0KKwl4b3IJcjE0ZCxyOWQKKworCXhvcgllZGkscjEwZAorCXJvcglyMTNkLDYKKwltb3YJcjhkLHIxMGQKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJcjhkLHIxNWQKKwlhZGQJZWF4LHIxMmQKKwlhZGQJcjhkLHIxMmQKKworCWxlYQlyYnAsWzIwK3JicF0KKwltb3YJcjEzZCxEV09SRFs1Mityc3BdCisJbW92CXIxNWQsRFdPUkRbNDArcnNwXQorCisJbW92CXIxMmQscjEzZAorCXJvcglyMTNkLDExCisJYWRkCXI4ZCxyMTRkCisJbW92CXIxNGQscjE1ZAorCXJvcglyMTVkLDIKKworCXhvcglyMTNkLHIxMmQKKwlzaHIJcjEyZCwzCisJcm9yCXIxM2QsNworCXhvcglyMTVkLHIxNGQKKwlzaHIJcjE0ZCwxMAorCisJcm9yCXIxNWQsMTcKKwl4b3IJcjEyZCxyMTNkCisJeG9yCXIxNWQscjE0ZAorCWFkZAlyMTJkLERXT1JEWzIwK3JzcF0KKworCWFkZAlyMTJkLERXT1JEWzQ4K3JzcF0KKwltb3YJcjEzZCxlYXgKKwlhZGQJcjEyZCxyMTVkCisJbW92CXIxNGQscjhkCisJcm9yCXIxM2QsMTQKKwltb3YJcjE1ZCxlYngKKworCXhvcglyMTNkLGVheAorCXJvcglyMTRkLDkKKwl4b3IJcjE1ZCxlY3gKKworCW1vdglEV09SRFs0OCtyc3BdLHIxMmQKKwl4b3IJcjE0ZCxyOGQKKwlhbmQJcjE1ZCxlYXgKKworCXJvcglyMTNkLDUKKwlhZGQJcjEyZCxlZHgKKwl4b3IJcjE1ZCxlY3gKKworCXJvcglyMTRkLDExCisJeG9yCXIxM2QsZWF4CisJYWRkCXIxMmQscjE1ZAorCisJbW92CXIxNWQscjhkCisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLHI4ZAorCisJeG9yCXIxNWQscjlkCisJcm9yCXIxM2QsNgorCW1vdgllZHgscjlkCisKKwlhbmQJZWRpLHIxNWQKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMmQscjEzZAorCisJeG9yCWVkeCxlZGkKKwlhZGQJcjExZCxyMTJkCisJYWRkCWVkeCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwltb3YJcjEzZCxEV09SRFs1Nityc3BdCisJbW92CWVkaSxEV09SRFs0NCtyc3BdCisKKwltb3YJcjEyZCxyMTNkCisJcm9yCXIxM2QsMTEKKwlhZGQJZWR4LHIxNGQKKwltb3YJcjE0ZCxlZGkKKwlyb3IJZWRpLDIKKworCXhvcglyMTNkLHIxMmQKKwlzaHIJcjEyZCwzCisJcm9yCXIxM2QsNworCXhvcgllZGkscjE0ZAorCXNocglyMTRkLDEwCisKKwlyb3IJZWRpLDE3CisJeG9yCXIxMmQscjEzZAorCXhvcgllZGkscjE0ZAorCWFkZAlyMTJkLERXT1JEWzI0K3JzcF0KKworCWFkZAlyMTJkLERXT1JEWzUyK3JzcF0KKwltb3YJcjEzZCxyMTFkCisJYWRkCXIxMmQsZWRpCisJbW92CXIxNGQsZWR4CisJcm9yCXIxM2QsMTQKKwltb3YJZWRpLGVheAorCisJeG9yCXIxM2QscjExZAorCXJvcglyMTRkLDkKKwl4b3IJZWRpLGVieAorCisJbW92CURXT1JEWzUyK3JzcF0scjEyZAorCXhvcglyMTRkLGVkeAorCWFuZAllZGkscjExZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLGVjeAorCXhvcgllZGksZWJ4CisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLHIxMWQKKwlhZGQJcjEyZCxlZGkKKworCW1vdgllZGksZWR4CisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLGVkeAorCisJeG9yCWVkaSxyOGQKKwlyb3IJcjEzZCw2CisJbW92CWVjeCxyOGQKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJZWN4LHIxNWQKKwlhZGQJcjEwZCxyMTJkCisJYWRkCWVjeCxyMTJkCisKKwlsZWEJcmJwLFs0K3JicF0KKwltb3YJcjEzZCxEV09SRFs2MCtyc3BdCisJbW92CXIxNWQsRFdPUkRbNDgrcnNwXQorCisJbW92CXIxMmQscjEzZAorCXJvcglyMTNkLDExCisJYWRkCWVjeCxyMTRkCisJbW92CXIxNGQscjE1ZAorCXJvcglyMTVkLDIKKworCXhvcglyMTNkLHIxMmQKKwlzaHIJcjEyZCwzCisJcm9yCXIxM2QsNworCXhvcglyMTVkLHIxNGQKKwlzaHIJcjE0ZCwxMAorCisJcm9yCXIxNWQsMTcKKwl4b3IJcjEyZCxyMTNkCisJeG9yCXIxNWQscjE0ZAorCWFkZAlyMTJkLERXT1JEWzI4K3JzcF0KKworCWFkZAlyMTJkLERXT1JEWzU2K3JzcF0KKwltb3YJcjEzZCxyMTBkCisJYWRkCXIxMmQscjE1ZAorCW1vdglyMTRkLGVjeAorCXJvcglyMTNkLDE0CisJbW92CXIxNWQscjExZAorCisJeG9yCXIxM2QscjEwZAorCXJvcglyMTRkLDkKKwl4b3IJcjE1ZCxlYXgKKworCW1vdglEV09SRFs1Nityc3BdLHIxMmQKKwl4b3IJcjE0ZCxlY3gKKwlhbmQJcjE1ZCxyMTBkCisKKwlyb3IJcjEzZCw1CisJYWRkCXIxMmQsZWJ4CisJeG9yCXIxNWQsZWF4CisKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTNkLHIxMGQKKwlhZGQJcjEyZCxyMTVkCisKKwltb3YJcjE1ZCxlY3gKKwlhZGQJcjEyZCxEV09SRFtyYnBdCisJeG9yCXIxNGQsZWN4CisKKwl4b3IJcjE1ZCxlZHgKKwlyb3IJcjEzZCw2CisJbW92CWVieCxlZHgKKworCWFuZAllZGkscjE1ZAorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJZWJ4LGVkaQorCWFkZAlyOWQscjEyZAorCWFkZAllYngscjEyZAorCisJbGVhCXJicCxbNCtyYnBdCisJbW92CXIxM2QsRFdPUkRbcnNwXQorCW1vdgllZGksRFdPUkRbNTIrcnNwXQorCisJbW92CXIxMmQscjEzZAorCXJvcglyMTNkLDExCisJYWRkCWVieCxyMTRkCisJbW92CXIxNGQsZWRpCisJcm9yCWVkaSwyCisKKwl4b3IJcjEzZCxyMTJkCisJc2hyCXIxMmQsMworCXJvcglyMTNkLDcKKwl4b3IJZWRpLHIxNGQKKwlzaHIJcjE0ZCwxMAorCisJcm9yCWVkaSwxNworCXhvcglyMTJkLHIxM2QKKwl4b3IJZWRpLHIxNGQKKwlhZGQJcjEyZCxEV09SRFszMityc3BdCisKKwlhZGQJcjEyZCxEV09SRFs2MCtyc3BdCisJbW92CXIxM2QscjlkCisJYWRkCXIxMmQsZWRpCisJbW92CXIxNGQsZWJ4CisJcm9yCXIxM2QsMTQKKwltb3YJZWRpLHIxMGQKKworCXhvcglyMTNkLHI5ZAorCXJvcglyMTRkLDkKKwl4b3IJZWRpLHIxMWQKKworCW1vdglEV09SRFs2MCtyc3BdLHIxMmQKKwl4b3IJcjE0ZCxlYngKKwlhbmQJZWRpLHI5ZAorCisJcm9yCXIxM2QsNQorCWFkZAlyMTJkLGVheAorCXhvcgllZGkscjExZAorCisJcm9yCXIxNGQsMTEKKwl4b3IJcjEzZCxyOWQKKwlhZGQJcjEyZCxlZGkKKworCW1vdgllZGksZWJ4CisJYWRkCXIxMmQsRFdPUkRbcmJwXQorCXhvcglyMTRkLGVieAorCisJeG9yCWVkaSxlY3gKKwlyb3IJcjEzZCw2CisJbW92CWVheCxlY3gKKworCWFuZAlyMTVkLGVkaQorCXJvcglyMTRkLDIKKwlhZGQJcjEyZCxyMTNkCisKKwl4b3IJZWF4LHIxNWQKKwlhZGQJcjhkLHIxMmQKKwlhZGQJZWF4LHIxMmQKKworCWxlYQlyYnAsWzIwK3JicF0KKwljbXAJQllURVszK3JicF0sMAorCWpueglORUFSICRMJHJvdW5kc18xNl94eAorCisJbW92CXJkaSxRV09SRFsoKDY0KzApKStyc3BdCisJYWRkCWVheCxyMTRkCisJbGVhCXJzaSxbNjQrcnNpXQorCisJYWRkCWVheCxEV09SRFtyZGldCisJYWRkCWVieCxEV09SRFs0K3JkaV0KKwlhZGQJZWN4LERXT1JEWzgrcmRpXQorCWFkZAllZHgsRFdPUkRbMTIrcmRpXQorCWFkZAlyOGQsRFdPUkRbMTYrcmRpXQorCWFkZAlyOWQsRFdPUkRbMjArcmRpXQorCWFkZAlyMTBkLERXT1JEWzI0K3JkaV0KKwlhZGQJcjExZCxEV09SRFsyOCtyZGldCisKKwljbXAJcnNpLFFXT1JEWygoNjQrMTYpKStyc3BdCisKKwltb3YJRFdPUkRbcmRpXSxlYXgKKwltb3YJRFdPUkRbNCtyZGldLGVieAorCW1vdglEV09SRFs4K3JkaV0sZWN4CisJbW92CURXT1JEWzEyK3JkaV0sZWR4CisJbW92CURXT1JEWzE2K3JkaV0scjhkCisJbW92CURXT1JEWzIwK3JkaV0scjlkCisJbW92CURXT1JEWzI0K3JkaV0scjEwZAorCW1vdglEV09SRFsyOCtyZGldLHIxMWQKKwlqYglORUFSICRMJGxvb3AKKworCW1vdglyc2ksUVdPUkRbODgrcnNwXQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJGVwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyOgorQUxJR04JNjQKKworSzI1NjoKKwlERAkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisJREQJMHg0MjhhMmY5OCwweDcxMzc0NDkxLDB4YjVjMGZiY2YsMHhlOWI1ZGJhNQorCURECTB4Mzk1NmMyNWIsMHg1OWYxMTFmMSwweDkyM2Y4MmE0LDB4YWIxYzVlZDUKKwlERAkweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1CisJREQJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworCURECTB4ZDgwN2FhOTgsMHgxMjgzNWIwMSwweDI0MzE4NWJlLDB4NTUwYzdkYzMKKwlERAkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisJREQJMHg3MmJlNWQ3NCwweDgwZGViMWZlLDB4OWJkYzA2YTcsMHhjMTliZjE3NAorCURECTB4ZTQ5YjY5YzEsMHhlZmJlNDc4NiwweDBmYzE5ZGM2LDB4MjQwY2ExY2MKKwlERAkweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjCisJREQJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorCURECTB4MmRlOTJjNmYsMHg0YTc0ODRhYSwweDVjYjBhOWRjLDB4NzZmOTg4ZGEKKwlERAkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisJREQJMHg5ODNlNTE1MiwweGE4MzFjNjZkLDB4YjAwMzI3YzgsMHhiZjU5N2ZjNworCURECTB4YzZlMDBiZjMsMHhkNWE3OTE0NywweDA2Y2E2MzUxLDB4MTQyOTI5NjcKKwlERAkweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3CisJREQJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworCURECTB4MjdiNzBhODUsMHgyZTFiMjEzOCwweDRkMmM2ZGZjLDB4NTMzODBkMTMKKwlERAkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisJREQJMHg2NTBhNzM1NCwweDc2NmEwYWJiLDB4ODFjMmM5MmUsMHg5MjcyMmM4NQorCURECTB4YTJiZmU4YTEsMHhhODFhNjY0YiwweGMyNGI4YjcwLDB4Yzc2YzUxYTMKKwlERAkweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzCisJREQJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorCURECTB4ZDE5MmU4MTksMHhkNjk5MDYyNCwweGY0MGUzNTg1LDB4MTA2YWEwNzAKKwlERAkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisJREQJMHgxOWE0YzExNiwweDFlMzc2YzA4LDB4Mjc0ODc3NGMsMHgzNGIwYmNiNQorCURECTB4MzkxYzBjYjMsMHg0ZWQ4YWE0YSwweDViOWNjYTRmLDB4NjgyZTZmZjMKKwlERAkweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzCisJREQJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorCURECTB4NzQ4ZjgyZWUsMHg3OGE1NjM2ZiwweDg0Yzg3ODE0LDB4OGNjNzAyMDgKKwlERAkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisJREQJMHg5MGJlZmZmYSwweGE0NTA2Y2ViLDB4YmVmOWEzZjcsMHhjNjcxNzhmMgorCisJREQJMHgwMDAxMDIwMywweDA0MDUwNjA3LDB4MDgwOTBhMGIsMHgwYzBkMGUwZgorCURECTB4MDAwMTAyMDMsMHgwNDA1MDYwNywweDA4MDkwYTBiLDB4MGMwZDBlMGYKKwlERAkweDAzMDIwMTAwLDB4MGIwYTA5MDgsMHhmZmZmZmZmZiwweGZmZmZmZmZmCisJREQJMHgwMzAyMDEwMCwweDBiMGEwOTA4LDB4ZmZmZmZmZmYsMHhmZmZmZmZmZgorCURECTB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweDAzMDIwMTAwLDB4MGIwYTA5MDgKKwlERAkweGZmZmZmZmZmLDB4ZmZmZmZmZmYsMHgwMzAyMDEwMCwweDBiMGEwOTA4CitEQgk4Myw3Miw2NSw1MCw1Myw1NCwzMiw5OCwxMDgsMTExLDk5LDEwNywzMiwxMTYsMTE0LDk3CitEQgkxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwzMiwxMDIsMTExLDExNCwzMiwxMjAsNTYsNTQsOTUsNTQKK0RCCTUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5LDcxLDY1LDc3LDgzLDMyLDk4LDEyMQorREIJMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMSwxMTIsMTAxLDExMCwxMTUsMTE1LDEwOCw0NgorREIJMTExLDExNCwxMDMsNjIsMAorCitBTElHTgk2NAorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTM6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMzoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworJEwkc3NzZTNfc2hvcnRjdXQ6CisJbW92CXJheCxyc3AKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXNobAlyZHgsNAorCXN1Yglyc3AsMTYwCisJbGVhCXJkeCxbcmR4KjQrcnNpXQorCWFuZAlyc3AsLTY0CisJbW92CVFXT1JEWygoNjQrMCkpK3JzcF0scmRpCisJbW92CVFXT1JEWygoNjQrOCkpK3JzcF0scnNpCisJbW92CVFXT1JEWygoNjQrMTYpKStyc3BdLHJkeAorCW1vdglRV09SRFs4OCtyc3BdLHJheAorCisJbW92YXBzCVhNTVdPUkRbKDY0KzMyKStyc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFsoNjQrNDgpK3JzcF0seG1tNworCW1vdmFwcwlYTU1XT1JEWyg2NCs2NCkrcnNwXSx4bW04CisJbW92YXBzCVhNTVdPUkRbKDY0KzgwKStyc3BdLHhtbTkKKyRMJHByb2xvZ3VlX3Nzc2UzOgorCisJbW92CWVheCxEV09SRFtyZGldCisJbW92CWVieCxEV09SRFs0K3JkaV0KKwltb3YJZWN4LERXT1JEWzgrcmRpXQorCW1vdgllZHgsRFdPUkRbMTIrcmRpXQorCW1vdglyOGQsRFdPUkRbMTYrcmRpXQorCW1vdglyOWQsRFdPUkRbMjArcmRpXQorCW1vdglyMTBkLERXT1JEWzI0K3JkaV0KKwltb3YJcjExZCxEV09SRFsyOCtyZGldCisKKworCWptcAlORUFSICRMJGxvb3Bfc3NzZTMKK0FMSUdOCTE2CiskTCRsb29wX3Nzc2UzOgorCW1vdmRxYQl4bW03LFhNTVdPUkRbKChLMjU2KzUxMikpXQorCW1vdmRxdQl4bW0wLFhNTVdPUkRbcnNpXQorCW1vdmRxdQl4bW0xLFhNTVdPUkRbMTYrcnNpXQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcnNpXQorREIJMTAyLDE1LDU2LDAsMTk5CisJbW92ZHF1CXhtbTMsWE1NV09SRFs0OCtyc2ldCisJbGVhCXJicCxbSzI1Nl0KK0RCCTEwMiwxNSw1NiwwLDIwNworCW1vdmRxYQl4bW00LFhNTVdPUkRbcmJwXQorCW1vdmRxYQl4bW01LFhNTVdPUkRbMzIrcmJwXQorREIJMTAyLDE1LDU2LDAsMjE1CisJcGFkZGQJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTYsWE1NV09SRFs2NCtyYnBdCitEQgkxMDIsMTUsNTYsMCwyMjMKKwltb3ZkcWEJeG1tNyxYTU1XT1JEWzk2K3JicF0KKwlwYWRkZAl4bW01LHhtbTEKKwlwYWRkZAl4bW02LHhtbTIKKwlwYWRkZAl4bW03LHhtbTMKKwltb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTQKKwltb3YJcjE0ZCxlYXgKKwltb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTUKKwltb3YJZWRpLGVieAorCW1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tNgorCXhvcgllZGksZWN4CisJbW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW03CisJbW92CXIxM2QscjhkCisJam1wCU5FQVIgJEwkc3NzZTNfMDBfNDcKKworQUxJR04JMTYKKyRMJHNzc2UzXzAwXzQ3OgorCXN1YglyYnAsLTEyOAorCXJvcglyMTNkLDE0CisJbW92ZHFhCXhtbTQseG1tMQorCW1vdgllYXgscjE0ZAorCW1vdglyMTJkLHI5ZAorCW1vdmRxYQl4bW03LHhtbTMKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QscjhkCisJeG9yCXIxMmQscjEwZAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxlYXgKK0RCCTEwMiwxNSw1OCwxNSwyMjQsNAorCWFuZAlyMTJkLHI4ZAorCXhvcglyMTNkLHI4ZAorREIJMTAyLDE1LDU4LDE1LDI1MCw0CisJYWRkCXIxMWQsRFdPUkRbcnNwXQorCW1vdglyMTVkLGVheAorCXhvcglyMTJkLHIxMGQKKwlyb3IJcjE0ZCwxMQorCW1vdmRxYQl4bW01LHhtbTQKKwl4b3IJcjE1ZCxlYngKKwlhZGQJcjExZCxyMTJkCisJbW92ZHFhCXhtbTYseG1tNAorCXJvcglyMTNkLDYKKwlhbmQJZWRpLHIxNWQKKwlwc3JsZAl4bW00LDMKKwl4b3IJcjE0ZCxlYXgKKwlhZGQJcjExZCxyMTNkCisJeG9yCWVkaSxlYngKKwlwYWRkZAl4bW0wLHhtbTcKKwlyb3IJcjE0ZCwyCisJYWRkCWVkeCxyMTFkCisJcHNybGQJeG1tNiw3CisJYWRkCXIxMWQsZWRpCisJbW92CXIxM2QsZWR4CisJcHNodWZkCXhtbTcseG1tMywyNTAKKwlhZGQJcjE0ZCxyMTFkCisJcm9yCXIxM2QsMTQKKwlwc2xsZAl4bW01LDE0CisJbW92CXIxMWQscjE0ZAorCW1vdglyMTJkLHI4ZAorCXB4b3IJeG1tNCx4bW02CisJcm9yCXIxNGQsOQorCXhvcglyMTNkLGVkeAorCXhvcglyMTJkLHI5ZAorCXJvcglyMTNkLDUKKwlwc3JsZAl4bW02LDExCisJeG9yCXIxNGQscjExZAorCXB4b3IJeG1tNCx4bW01CisJYW5kCXIxMmQsZWR4CisJeG9yCXIxM2QsZWR4CisJcHNsbGQJeG1tNSwxMQorCWFkZAlyMTBkLERXT1JEWzQrcnNwXQorCW1vdgllZGkscjExZAorCXB4b3IJeG1tNCx4bW02CisJeG9yCXIxMmQscjlkCisJcm9yCXIxNGQsMTEKKwltb3ZkcWEJeG1tNix4bW03CisJeG9yCWVkaSxlYXgKKwlhZGQJcjEwZCxyMTJkCisJcHhvcgl4bW00LHhtbTUKKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQscjExZAorCXBzcmxkCXhtbTcsMTAKKwlhZGQJcjEwZCxyMTNkCisJeG9yCXIxNWQsZWF4CisJcGFkZGQJeG1tMCx4bW00CisJcm9yCXIxNGQsMgorCWFkZAllY3gscjEwZAorCXBzcmxxCXhtbTYsMTcKKwlhZGQJcjEwZCxyMTVkCisJbW92CXIxM2QsZWN4CisJYWRkCXIxNGQscjEwZAorCXB4b3IJeG1tNyx4bW02CisJcm9yCXIxM2QsMTQKKwltb3YJcjEwZCxyMTRkCisJbW92CXIxMmQsZWR4CisJcm9yCXIxNGQsOQorCXBzcmxxCXhtbTYsMgorCXhvcglyMTNkLGVjeAorCXhvcglyMTJkLHI4ZAorCXB4b3IJeG1tNyx4bW02CisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHIxMGQKKwlhbmQJcjEyZCxlY3gKKwlwc2h1ZmQJeG1tNyx4bW03LDEyOAorCXhvcglyMTNkLGVjeAorCWFkZAlyOWQsRFdPUkRbOCtyc3BdCisJbW92CXIxNWQscjEwZAorCXBzcmxkcQl4bW03LDgKKwl4b3IJcjEyZCxyOGQKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTVkLHIxMWQKKwlhZGQJcjlkLHIxMmQKKwlyb3IJcjEzZCw2CisJcGFkZGQJeG1tMCx4bW03CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQscjEwZAorCWFkZAlyOWQscjEzZAorCXBzaHVmZAl4bW03LHhtbTAsODAKKwl4b3IJZWRpLHIxMWQKKwlyb3IJcjE0ZCwyCisJYWRkCWVieCxyOWQKKwltb3ZkcWEJeG1tNix4bW03CisJYWRkCXI5ZCxlZGkKKwltb3YJcjEzZCxlYngKKwlwc3JsZAl4bW03LDEwCisJYWRkCXIxNGQscjlkCisJcm9yCXIxM2QsMTQKKwlwc3JscQl4bW02LDE3CisJbW92CXI5ZCxyMTRkCisJbW92CXIxMmQsZWN4CisJcHhvcgl4bW03LHhtbTYKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QsZWJ4CisJeG9yCXIxMmQsZWR4CisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHI5ZAorCXBzcmxxCXhtbTYsMgorCWFuZAlyMTJkLGVieAorCXhvcglyMTNkLGVieAorCWFkZAlyOGQsRFdPUkRbMTIrcnNwXQorCXB4b3IJeG1tNyx4bW02CisJbW92CWVkaSxyOWQKKwl4b3IJcjEyZCxlZHgKKwlyb3IJcjE0ZCwxMQorCXBzaHVmZAl4bW03LHhtbTcsOAorCXhvcgllZGkscjEwZAorCWFkZAlyOGQscjEyZAorCW1vdmRxYQl4bW02LFhNTVdPUkRbcmJwXQorCXJvcglyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwlwc2xsZHEJeG1tNyw4CisJeG9yCXIxNGQscjlkCisJYWRkCXI4ZCxyMTNkCisJeG9yCXIxNWQscjEwZAorCXBhZGRkCXhtbTAseG1tNworCXJvcglyMTRkLDIKKwlhZGQJZWF4LHI4ZAorCWFkZAlyOGQscjE1ZAorCXBhZGRkCXhtbTYseG1tMAorCW1vdglyMTNkLGVheAorCWFkZAlyMTRkLHI4ZAorCW1vdmRxYQlYTU1XT1JEW3JzcF0seG1tNgorCXJvcglyMTNkLDE0CisJbW92ZHFhCXhtbTQseG1tMgorCW1vdglyOGQscjE0ZAorCW1vdglyMTJkLGVieAorCW1vdmRxYQl4bW03LHhtbTAKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QsZWF4CisJeG9yCXIxMmQsZWN4CisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHI4ZAorREIJMTAyLDE1LDU4LDE1LDIyNSw0CisJYW5kCXIxMmQsZWF4CisJeG9yCXIxM2QsZWF4CitEQgkxMDIsMTUsNTgsMTUsMjUxLDQKKwlhZGQJZWR4LERXT1JEWzE2K3JzcF0KKwltb3YJcjE1ZCxyOGQKKwl4b3IJcjEyZCxlY3gKKwlyb3IJcjE0ZCwxMQorCW1vdmRxYQl4bW01LHhtbTQKKwl4b3IJcjE1ZCxyOWQKKwlhZGQJZWR4LHIxMmQKKwltb3ZkcWEJeG1tNix4bW00CisJcm9yCXIxM2QsNgorCWFuZAllZGkscjE1ZAorCXBzcmxkCXhtbTQsMworCXhvcglyMTRkLHI4ZAorCWFkZAllZHgscjEzZAorCXhvcgllZGkscjlkCisJcGFkZGQJeG1tMSx4bW03CisJcm9yCXIxNGQsMgorCWFkZAlyMTFkLGVkeAorCXBzcmxkCXhtbTYsNworCWFkZAllZHgsZWRpCisJbW92CXIxM2QscjExZAorCXBzaHVmZAl4bW03LHhtbTAsMjUwCisJYWRkCXIxNGQsZWR4CisJcm9yCXIxM2QsMTQKKwlwc2xsZAl4bW01LDE0CisJbW92CWVkeCxyMTRkCisJbW92CXIxMmQsZWF4CisJcHhvcgl4bW00LHhtbTYKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QscjExZAorCXhvcglyMTJkLGVieAorCXJvcglyMTNkLDUKKwlwc3JsZAl4bW02LDExCisJeG9yCXIxNGQsZWR4CisJcHhvcgl4bW00LHhtbTUKKwlhbmQJcjEyZCxyMTFkCisJeG9yCXIxM2QscjExZAorCXBzbGxkCXhtbTUsMTEKKwlhZGQJZWN4LERXT1JEWzIwK3JzcF0KKwltb3YJZWRpLGVkeAorCXB4b3IJeG1tNCx4bW02CisJeG9yCXIxMmQsZWJ4CisJcm9yCXIxNGQsMTEKKwltb3ZkcWEJeG1tNix4bW03CisJeG9yCWVkaSxyOGQKKwlhZGQJZWN4LHIxMmQKKwlweG9yCXhtbTQseG1tNQorCXJvcglyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxlZHgKKwlwc3JsZAl4bW03LDEwCisJYWRkCWVjeCxyMTNkCisJeG9yCXIxNWQscjhkCisJcGFkZGQJeG1tMSx4bW00CisJcm9yCXIxNGQsMgorCWFkZAlyMTBkLGVjeAorCXBzcmxxCXhtbTYsMTcKKwlhZGQJZWN4LHIxNWQKKwltb3YJcjEzZCxyMTBkCisJYWRkCXIxNGQsZWN4CisJcHhvcgl4bW03LHhtbTYKKwlyb3IJcjEzZCwxNAorCW1vdgllY3gscjE0ZAorCW1vdglyMTJkLHIxMWQKKwlyb3IJcjE0ZCw5CisJcHNybHEJeG1tNiwyCisJeG9yCXIxM2QscjEwZAorCXhvcglyMTJkLGVheAorCXB4b3IJeG1tNyx4bW02CisJcm9yCXIxM2QsNQorCXhvcglyMTRkLGVjeAorCWFuZAlyMTJkLHIxMGQKKwlwc2h1ZmQJeG1tNyx4bW03LDEyOAorCXhvcglyMTNkLHIxMGQKKwlhZGQJZWJ4LERXT1JEWzI0K3JzcF0KKwltb3YJcjE1ZCxlY3gKKwlwc3JsZHEJeG1tNyw4CisJeG9yCXIxMmQsZWF4CisJcm9yCXIxNGQsMTEKKwl4b3IJcjE1ZCxlZHgKKwlhZGQJZWJ4LHIxMmQKKwlyb3IJcjEzZCw2CisJcGFkZGQJeG1tMSx4bW03CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQsZWN4CisJYWRkCWVieCxyMTNkCisJcHNodWZkCXhtbTcseG1tMSw4MAorCXhvcgllZGksZWR4CisJcm9yCXIxNGQsMgorCWFkZAlyOWQsZWJ4CisJbW92ZHFhCXhtbTYseG1tNworCWFkZAllYngsZWRpCisJbW92CXIxM2QscjlkCisJcHNybGQJeG1tNywxMAorCWFkZAlyMTRkLGVieAorCXJvcglyMTNkLDE0CisJcHNybHEJeG1tNiwxNworCW1vdgllYngscjE0ZAorCW1vdglyMTJkLHIxMGQKKwlweG9yCXhtbTcseG1tNgorCXJvcglyMTRkLDkKKwl4b3IJcjEzZCxyOWQKKwl4b3IJcjEyZCxyMTFkCisJcm9yCXIxM2QsNQorCXhvcglyMTRkLGVieAorCXBzcmxxCXhtbTYsMgorCWFuZAlyMTJkLHI5ZAorCXhvcglyMTNkLHI5ZAorCWFkZAllYXgsRFdPUkRbMjgrcnNwXQorCXB4b3IJeG1tNyx4bW02CisJbW92CWVkaSxlYngKKwl4b3IJcjEyZCxyMTFkCisJcm9yCXIxNGQsMTEKKwlwc2h1ZmQJeG1tNyx4bW03LDgKKwl4b3IJZWRpLGVjeAorCWFkZAllYXgscjEyZAorCW1vdmRxYQl4bW02LFhNTVdPUkRbMzIrcmJwXQorCXJvcglyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwlwc2xsZHEJeG1tNyw4CisJeG9yCXIxNGQsZWJ4CisJYWRkCWVheCxyMTNkCisJeG9yCXIxNWQsZWN4CisJcGFkZGQJeG1tMSx4bW03CisJcm9yCXIxNGQsMgorCWFkZAlyOGQsZWF4CisJYWRkCWVheCxyMTVkCisJcGFkZGQJeG1tNix4bW0xCisJbW92CXIxM2QscjhkCisJYWRkCXIxNGQsZWF4CisJbW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW02CisJcm9yCXIxM2QsMTQKKwltb3ZkcWEJeG1tNCx4bW0zCisJbW92CWVheCxyMTRkCisJbW92CXIxMmQscjlkCisJbW92ZHFhCXhtbTcseG1tMQorCXJvcglyMTRkLDkKKwl4b3IJcjEzZCxyOGQKKwl4b3IJcjEyZCxyMTBkCisJcm9yCXIxM2QsNQorCXhvcglyMTRkLGVheAorREIJMTAyLDE1LDU4LDE1LDIyNiw0CisJYW5kCXIxMmQscjhkCisJeG9yCXIxM2QscjhkCitEQgkxMDIsMTUsNTgsMTUsMjQ4LDQKKwlhZGQJcjExZCxEV09SRFszMityc3BdCisJbW92CXIxNWQsZWF4CisJeG9yCXIxMmQscjEwZAorCXJvcglyMTRkLDExCisJbW92ZHFhCXhtbTUseG1tNAorCXhvcglyMTVkLGVieAorCWFkZAlyMTFkLHIxMmQKKwltb3ZkcWEJeG1tNix4bW00CisJcm9yCXIxM2QsNgorCWFuZAllZGkscjE1ZAorCXBzcmxkCXhtbTQsMworCXhvcglyMTRkLGVheAorCWFkZAlyMTFkLHIxM2QKKwl4b3IJZWRpLGVieAorCXBhZGRkCXhtbTIseG1tNworCXJvcglyMTRkLDIKKwlhZGQJZWR4LHIxMWQKKwlwc3JsZAl4bW02LDcKKwlhZGQJcjExZCxlZGkKKwltb3YJcjEzZCxlZHgKKwlwc2h1ZmQJeG1tNyx4bW0xLDI1MAorCWFkZAlyMTRkLHIxMWQKKwlyb3IJcjEzZCwxNAorCXBzbGxkCXhtbTUsMTQKKwltb3YJcjExZCxyMTRkCisJbW92CXIxMmQscjhkCisJcHhvcgl4bW00LHhtbTYKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QsZWR4CisJeG9yCXIxMmQscjlkCisJcm9yCXIxM2QsNQorCXBzcmxkCXhtbTYsMTEKKwl4b3IJcjE0ZCxyMTFkCisJcHhvcgl4bW00LHhtbTUKKwlhbmQJcjEyZCxlZHgKKwl4b3IJcjEzZCxlZHgKKwlwc2xsZAl4bW01LDExCisJYWRkCXIxMGQsRFdPUkRbMzYrcnNwXQorCW1vdgllZGkscjExZAorCXB4b3IJeG1tNCx4bW02CisJeG9yCXIxMmQscjlkCisJcm9yCXIxNGQsMTEKKwltb3ZkcWEJeG1tNix4bW03CisJeG9yCWVkaSxlYXgKKwlhZGQJcjEwZCxyMTJkCisJcHhvcgl4bW00LHhtbTUKKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQscjExZAorCXBzcmxkCXhtbTcsMTAKKwlhZGQJcjEwZCxyMTNkCisJeG9yCXIxNWQsZWF4CisJcGFkZGQJeG1tMix4bW00CisJcm9yCXIxNGQsMgorCWFkZAllY3gscjEwZAorCXBzcmxxCXhtbTYsMTcKKwlhZGQJcjEwZCxyMTVkCisJbW92CXIxM2QsZWN4CisJYWRkCXIxNGQscjEwZAorCXB4b3IJeG1tNyx4bW02CisJcm9yCXIxM2QsMTQKKwltb3YJcjEwZCxyMTRkCisJbW92CXIxMmQsZWR4CisJcm9yCXIxNGQsOQorCXBzcmxxCXhtbTYsMgorCXhvcglyMTNkLGVjeAorCXhvcglyMTJkLHI4ZAorCXB4b3IJeG1tNyx4bW02CisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHIxMGQKKwlhbmQJcjEyZCxlY3gKKwlwc2h1ZmQJeG1tNyx4bW03LDEyOAorCXhvcglyMTNkLGVjeAorCWFkZAlyOWQsRFdPUkRbNDArcnNwXQorCW1vdglyMTVkLHIxMGQKKwlwc3JsZHEJeG1tNyw4CisJeG9yCXIxMmQscjhkCisJcm9yCXIxNGQsMTEKKwl4b3IJcjE1ZCxyMTFkCisJYWRkCXI5ZCxyMTJkCisJcm9yCXIxM2QsNgorCXBhZGRkCXhtbTIseG1tNworCWFuZAllZGkscjE1ZAorCXhvcglyMTRkLHIxMGQKKwlhZGQJcjlkLHIxM2QKKwlwc2h1ZmQJeG1tNyx4bW0yLDgwCisJeG9yCWVkaSxyMTFkCisJcm9yCXIxNGQsMgorCWFkZAllYngscjlkCisJbW92ZHFhCXhtbTYseG1tNworCWFkZAlyOWQsZWRpCisJbW92CXIxM2QsZWJ4CisJcHNybGQJeG1tNywxMAorCWFkZAlyMTRkLHI5ZAorCXJvcglyMTNkLDE0CisJcHNybHEJeG1tNiwxNworCW1vdglyOWQscjE0ZAorCW1vdglyMTJkLGVjeAorCXB4b3IJeG1tNyx4bW02CisJcm9yCXIxNGQsOQorCXhvcglyMTNkLGVieAorCXhvcglyMTJkLGVkeAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxyOWQKKwlwc3JscQl4bW02LDIKKwlhbmQJcjEyZCxlYngKKwl4b3IJcjEzZCxlYngKKwlhZGQJcjhkLERXT1JEWzQ0K3JzcF0KKwlweG9yCXhtbTcseG1tNgorCW1vdgllZGkscjlkCisJeG9yCXIxMmQsZWR4CisJcm9yCXIxNGQsMTEKKwlwc2h1ZmQJeG1tNyx4bW03LDgKKwl4b3IJZWRpLHIxMGQKKwlhZGQJcjhkLHIxMmQKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzY0K3JicF0KKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJcHNsbGRxCXhtbTcsOAorCXhvcglyMTRkLHI5ZAorCWFkZAlyOGQscjEzZAorCXhvcglyMTVkLHIxMGQKKwlwYWRkZAl4bW0yLHhtbTcKKwlyb3IJcjE0ZCwyCisJYWRkCWVheCxyOGQKKwlhZGQJcjhkLHIxNWQKKwlwYWRkZAl4bW02LHhtbTIKKwltb3YJcjEzZCxlYXgKKwlhZGQJcjE0ZCxyOGQKKwltb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTYKKwlyb3IJcjEzZCwxNAorCW1vdmRxYQl4bW00LHhtbTAKKwltb3YJcjhkLHIxNGQKKwltb3YJcjEyZCxlYngKKwltb3ZkcWEJeG1tNyx4bW0yCisJcm9yCXIxNGQsOQorCXhvcglyMTNkLGVheAorCXhvcglyMTJkLGVjeAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxyOGQKK0RCCTEwMiwxNSw1OCwxNSwyMjcsNAorCWFuZAlyMTJkLGVheAorCXhvcglyMTNkLGVheAorREIJMTAyLDE1LDU4LDE1LDI0OSw0CisJYWRkCWVkeCxEV09SRFs0OCtyc3BdCisJbW92CXIxNWQscjhkCisJeG9yCXIxMmQsZWN4CisJcm9yCXIxNGQsMTEKKwltb3ZkcWEJeG1tNSx4bW00CisJeG9yCXIxNWQscjlkCisJYWRkCWVkeCxyMTJkCisJbW92ZHFhCXhtbTYseG1tNAorCXJvcglyMTNkLDYKKwlhbmQJZWRpLHIxNWQKKwlwc3JsZAl4bW00LDMKKwl4b3IJcjE0ZCxyOGQKKwlhZGQJZWR4LHIxM2QKKwl4b3IJZWRpLHI5ZAorCXBhZGRkCXhtbTMseG1tNworCXJvcglyMTRkLDIKKwlhZGQJcjExZCxlZHgKKwlwc3JsZAl4bW02LDcKKwlhZGQJZWR4LGVkaQorCW1vdglyMTNkLHIxMWQKKwlwc2h1ZmQJeG1tNyx4bW0yLDI1MAorCWFkZAlyMTRkLGVkeAorCXJvcglyMTNkLDE0CisJcHNsbGQJeG1tNSwxNAorCW1vdgllZHgscjE0ZAorCW1vdglyMTJkLGVheAorCXB4b3IJeG1tNCx4bW02CisJcm9yCXIxNGQsOQorCXhvcglyMTNkLHIxMWQKKwl4b3IJcjEyZCxlYngKKwlyb3IJcjEzZCw1CisJcHNybGQJeG1tNiwxMQorCXhvcglyMTRkLGVkeAorCXB4b3IJeG1tNCx4bW01CisJYW5kCXIxMmQscjExZAorCXhvcglyMTNkLHIxMWQKKwlwc2xsZAl4bW01LDExCisJYWRkCWVjeCxEV09SRFs1Mityc3BdCisJbW92CWVkaSxlZHgKKwlweG9yCXhtbTQseG1tNgorCXhvcglyMTJkLGVieAorCXJvcglyMTRkLDExCisJbW92ZHFhCXhtbTYseG1tNworCXhvcgllZGkscjhkCisJYWRkCWVjeCxyMTJkCisJcHhvcgl4bW00LHhtbTUKKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQsZWR4CisJcHNybGQJeG1tNywxMAorCWFkZAllY3gscjEzZAorCXhvcglyMTVkLHI4ZAorCXBhZGRkCXhtbTMseG1tNAorCXJvcglyMTRkLDIKKwlhZGQJcjEwZCxlY3gKKwlwc3JscQl4bW02LDE3CisJYWRkCWVjeCxyMTVkCisJbW92CXIxM2QscjEwZAorCWFkZAlyMTRkLGVjeAorCXB4b3IJeG1tNyx4bW02CisJcm9yCXIxM2QsMTQKKwltb3YJZWN4LHIxNGQKKwltb3YJcjEyZCxyMTFkCisJcm9yCXIxNGQsOQorCXBzcmxxCXhtbTYsMgorCXhvcglyMTNkLHIxMGQKKwl4b3IJcjEyZCxlYXgKKwlweG9yCXhtbTcseG1tNgorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxlY3gKKwlhbmQJcjEyZCxyMTBkCisJcHNodWZkCXhtbTcseG1tNywxMjgKKwl4b3IJcjEzZCxyMTBkCisJYWRkCWVieCxEV09SRFs1Nityc3BdCisJbW92CXIxNWQsZWN4CisJcHNybGRxCXhtbTcsOAorCXhvcglyMTJkLGVheAorCXJvcglyMTRkLDExCisJeG9yCXIxNWQsZWR4CisJYWRkCWVieCxyMTJkCisJcm9yCXIxM2QsNgorCXBhZGRkCXhtbTMseG1tNworCWFuZAllZGkscjE1ZAorCXhvcglyMTRkLGVjeAorCWFkZAllYngscjEzZAorCXBzaHVmZAl4bW03LHhtbTMsODAKKwl4b3IJZWRpLGVkeAorCXJvcglyMTRkLDIKKwlhZGQJcjlkLGVieAorCW1vdmRxYQl4bW02LHhtbTcKKwlhZGQJZWJ4LGVkaQorCW1vdglyMTNkLHI5ZAorCXBzcmxkCXhtbTcsMTAKKwlhZGQJcjE0ZCxlYngKKwlyb3IJcjEzZCwxNAorCXBzcmxxCXhtbTYsMTcKKwltb3YJZWJ4LHIxNGQKKwltb3YJcjEyZCxyMTBkCisJcHhvcgl4bW03LHhtbTYKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QscjlkCisJeG9yCXIxMmQscjExZAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxlYngKKwlwc3JscQl4bW02LDIKKwlhbmQJcjEyZCxyOWQKKwl4b3IJcjEzZCxyOWQKKwlhZGQJZWF4LERXT1JEWzYwK3JzcF0KKwlweG9yCXhtbTcseG1tNgorCW1vdgllZGksZWJ4CisJeG9yCXIxMmQscjExZAorCXJvcglyMTRkLDExCisJcHNodWZkCXhtbTcseG1tNyw4CisJeG9yCWVkaSxlY3gKKwlhZGQJZWF4LHIxMmQKKwltb3ZkcWEJeG1tNixYTU1XT1JEWzk2K3JicF0KKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJcHNsbGRxCXhtbTcsOAorCXhvcglyMTRkLGVieAorCWFkZAllYXgscjEzZAorCXhvcglyMTVkLGVjeAorCXBhZGRkCXhtbTMseG1tNworCXJvcglyMTRkLDIKKwlhZGQJcjhkLGVheAorCWFkZAllYXgscjE1ZAorCXBhZGRkCXhtbTYseG1tMworCW1vdglyMTNkLHI4ZAorCWFkZAlyMTRkLGVheAorCW1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tNgorCWNtcAlCWVRFWzEzMStyYnBdLDAKKwlqbmUJTkVBUiAkTCRzc3NlM18wMF80NworCXJvcglyMTNkLDE0CisJbW92CWVheCxyMTRkCisJbW92CXIxMmQscjlkCisJcm9yCXIxNGQsOQorCXhvcglyMTNkLHI4ZAorCXhvcglyMTJkLHIxMGQKKwlyb3IJcjEzZCw1CisJeG9yCXIxNGQsZWF4CisJYW5kCXIxMmQscjhkCisJeG9yCXIxM2QscjhkCisJYWRkCXIxMWQsRFdPUkRbcnNwXQorCW1vdglyMTVkLGVheAorCXhvcglyMTJkLHIxMGQKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTVkLGVieAorCWFkZAlyMTFkLHIxMmQKKwlyb3IJcjEzZCw2CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQsZWF4CisJYWRkCXIxMWQscjEzZAorCXhvcgllZGksZWJ4CisJcm9yCXIxNGQsMgorCWFkZAllZHgscjExZAorCWFkZAlyMTFkLGVkaQorCW1vdglyMTNkLGVkeAorCWFkZAlyMTRkLHIxMWQKKwlyb3IJcjEzZCwxNAorCW1vdglyMTFkLHIxNGQKKwltb3YJcjEyZCxyOGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QsZWR4CisJeG9yCXIxMmQscjlkCisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHIxMWQKKwlhbmQJcjEyZCxlZHgKKwl4b3IJcjEzZCxlZHgKKwlhZGQJcjEwZCxEV09SRFs0K3JzcF0KKwltb3YJZWRpLHIxMWQKKwl4b3IJcjEyZCxyOWQKKwlyb3IJcjE0ZCwxMQorCXhvcgllZGksZWF4CisJYWRkCXIxMGQscjEyZAorCXJvcglyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxyMTFkCisJYWRkCXIxMGQscjEzZAorCXhvcglyMTVkLGVheAorCXJvcglyMTRkLDIKKwlhZGQJZWN4LHIxMGQKKwlhZGQJcjEwZCxyMTVkCisJbW92CXIxM2QsZWN4CisJYWRkCXIxNGQscjEwZAorCXJvcglyMTNkLDE0CisJbW92CXIxMGQscjE0ZAorCW1vdglyMTJkLGVkeAorCXJvcglyMTRkLDkKKwl4b3IJcjEzZCxlY3gKKwl4b3IJcjEyZCxyOGQKKwlyb3IJcjEzZCw1CisJeG9yCXIxNGQscjEwZAorCWFuZAlyMTJkLGVjeAorCXhvcglyMTNkLGVjeAorCWFkZAlyOWQsRFdPUkRbOCtyc3BdCisJbW92CXIxNWQscjEwZAorCXhvcglyMTJkLHI4ZAorCXJvcglyMTRkLDExCisJeG9yCXIxNWQscjExZAorCWFkZAlyOWQscjEyZAorCXJvcglyMTNkLDYKKwlhbmQJZWRpLHIxNWQKKwl4b3IJcjE0ZCxyMTBkCisJYWRkCXI5ZCxyMTNkCisJeG9yCWVkaSxyMTFkCisJcm9yCXIxNGQsMgorCWFkZAllYngscjlkCisJYWRkCXI5ZCxlZGkKKwltb3YJcjEzZCxlYngKKwlhZGQJcjE0ZCxyOWQKKwlyb3IJcjEzZCwxNAorCW1vdglyOWQscjE0ZAorCW1vdglyMTJkLGVjeAorCXJvcglyMTRkLDkKKwl4b3IJcjEzZCxlYngKKwl4b3IJcjEyZCxlZHgKKwlyb3IJcjEzZCw1CisJeG9yCXIxNGQscjlkCisJYW5kCXIxMmQsZWJ4CisJeG9yCXIxM2QsZWJ4CisJYWRkCXI4ZCxEV09SRFsxMityc3BdCisJbW92CWVkaSxyOWQKKwl4b3IJcjEyZCxlZHgKKwlyb3IJcjE0ZCwxMQorCXhvcgllZGkscjEwZAorCWFkZAlyOGQscjEyZAorCXJvcglyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxyOWQKKwlhZGQJcjhkLHIxM2QKKwl4b3IJcjE1ZCxyMTBkCisJcm9yCXIxNGQsMgorCWFkZAllYXgscjhkCisJYWRkCXI4ZCxyMTVkCisJbW92CXIxM2QsZWF4CisJYWRkCXIxNGQscjhkCisJcm9yCXIxM2QsMTQKKwltb3YJcjhkLHIxNGQKKwltb3YJcjEyZCxlYngKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QsZWF4CisJeG9yCXIxMmQsZWN4CisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHI4ZAorCWFuZAlyMTJkLGVheAorCXhvcglyMTNkLGVheAorCWFkZAllZHgsRFdPUkRbMTYrcnNwXQorCW1vdglyMTVkLHI4ZAorCXhvcglyMTJkLGVjeAorCXJvcglyMTRkLDExCisJeG9yCXIxNWQscjlkCisJYWRkCWVkeCxyMTJkCisJcm9yCXIxM2QsNgorCWFuZAllZGkscjE1ZAorCXhvcglyMTRkLHI4ZAorCWFkZAllZHgscjEzZAorCXhvcgllZGkscjlkCisJcm9yCXIxNGQsMgorCWFkZAlyMTFkLGVkeAorCWFkZAllZHgsZWRpCisJbW92CXIxM2QscjExZAorCWFkZAlyMTRkLGVkeAorCXJvcglyMTNkLDE0CisJbW92CWVkeCxyMTRkCisJbW92CXIxMmQsZWF4CisJcm9yCXIxNGQsOQorCXhvcglyMTNkLHIxMWQKKwl4b3IJcjEyZCxlYngKKwlyb3IJcjEzZCw1CisJeG9yCXIxNGQsZWR4CisJYW5kCXIxMmQscjExZAorCXhvcglyMTNkLHIxMWQKKwlhZGQJZWN4LERXT1JEWzIwK3JzcF0KKwltb3YJZWRpLGVkeAorCXhvcglyMTJkLGVieAorCXJvcglyMTRkLDExCisJeG9yCWVkaSxyOGQKKwlhZGQJZWN4LHIxMmQKKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQsZWR4CisJYWRkCWVjeCxyMTNkCisJeG9yCXIxNWQscjhkCisJcm9yCXIxNGQsMgorCWFkZAlyMTBkLGVjeAorCWFkZAllY3gscjE1ZAorCW1vdglyMTNkLHIxMGQKKwlhZGQJcjE0ZCxlY3gKKwlyb3IJcjEzZCwxNAorCW1vdgllY3gscjE0ZAorCW1vdglyMTJkLHIxMWQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QscjEwZAorCXhvcglyMTJkLGVheAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxlY3gKKwlhbmQJcjEyZCxyMTBkCisJeG9yCXIxM2QscjEwZAorCWFkZAllYngsRFdPUkRbMjQrcnNwXQorCW1vdglyMTVkLGVjeAorCXhvcglyMTJkLGVheAorCXJvcglyMTRkLDExCisJeG9yCXIxNWQsZWR4CisJYWRkCWVieCxyMTJkCisJcm9yCXIxM2QsNgorCWFuZAllZGkscjE1ZAorCXhvcglyMTRkLGVjeAorCWFkZAllYngscjEzZAorCXhvcgllZGksZWR4CisJcm9yCXIxNGQsMgorCWFkZAlyOWQsZWJ4CisJYWRkCWVieCxlZGkKKwltb3YJcjEzZCxyOWQKKwlhZGQJcjE0ZCxlYngKKwlyb3IJcjEzZCwxNAorCW1vdgllYngscjE0ZAorCW1vdglyMTJkLHIxMGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QscjlkCisJeG9yCXIxMmQscjExZAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxlYngKKwlhbmQJcjEyZCxyOWQKKwl4b3IJcjEzZCxyOWQKKwlhZGQJZWF4LERXT1JEWzI4K3JzcF0KKwltb3YJZWRpLGVieAorCXhvcglyMTJkLHIxMWQKKwlyb3IJcjE0ZCwxMQorCXhvcgllZGksZWN4CisJYWRkCWVheCxyMTJkCisJcm9yCXIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLGVieAorCWFkZAllYXgscjEzZAorCXhvcglyMTVkLGVjeAorCXJvcglyMTRkLDIKKwlhZGQJcjhkLGVheAorCWFkZAllYXgscjE1ZAorCW1vdglyMTNkLHI4ZAorCWFkZAlyMTRkLGVheAorCXJvcglyMTNkLDE0CisJbW92CWVheCxyMTRkCisJbW92CXIxMmQscjlkCisJcm9yCXIxNGQsOQorCXhvcglyMTNkLHI4ZAorCXhvcglyMTJkLHIxMGQKKwlyb3IJcjEzZCw1CisJeG9yCXIxNGQsZWF4CisJYW5kCXIxMmQscjhkCisJeG9yCXIxM2QscjhkCisJYWRkCXIxMWQsRFdPUkRbMzIrcnNwXQorCW1vdglyMTVkLGVheAorCXhvcglyMTJkLHIxMGQKKwlyb3IJcjE0ZCwxMQorCXhvcglyMTVkLGVieAorCWFkZAlyMTFkLHIxMmQKKwlyb3IJcjEzZCw2CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQsZWF4CisJYWRkCXIxMWQscjEzZAorCXhvcgllZGksZWJ4CisJcm9yCXIxNGQsMgorCWFkZAllZHgscjExZAorCWFkZAlyMTFkLGVkaQorCW1vdglyMTNkLGVkeAorCWFkZAlyMTRkLHIxMWQKKwlyb3IJcjEzZCwxNAorCW1vdglyMTFkLHIxNGQKKwltb3YJcjEyZCxyOGQKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QsZWR4CisJeG9yCXIxMmQscjlkCisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHIxMWQKKwlhbmQJcjEyZCxlZHgKKwl4b3IJcjEzZCxlZHgKKwlhZGQJcjEwZCxEV09SRFszNityc3BdCisJbW92CWVkaSxyMTFkCisJeG9yCXIxMmQscjlkCisJcm9yCXIxNGQsMTEKKwl4b3IJZWRpLGVheAorCWFkZAlyMTBkLHIxMmQKKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQscjExZAorCWFkZAlyMTBkLHIxM2QKKwl4b3IJcjE1ZCxlYXgKKwlyb3IJcjE0ZCwyCisJYWRkCWVjeCxyMTBkCisJYWRkCXIxMGQscjE1ZAorCW1vdglyMTNkLGVjeAorCWFkZAlyMTRkLHIxMGQKKwlyb3IJcjEzZCwxNAorCW1vdglyMTBkLHIxNGQKKwltb3YJcjEyZCxlZHgKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QsZWN4CisJeG9yCXIxMmQscjhkCisJcm9yCXIxM2QsNQorCXhvcglyMTRkLHIxMGQKKwlhbmQJcjEyZCxlY3gKKwl4b3IJcjEzZCxlY3gKKwlhZGQJcjlkLERXT1JEWzQwK3JzcF0KKwltb3YJcjE1ZCxyMTBkCisJeG9yCXIxMmQscjhkCisJcm9yCXIxNGQsMTEKKwl4b3IJcjE1ZCxyMTFkCisJYWRkCXI5ZCxyMTJkCisJcm9yCXIxM2QsNgorCWFuZAllZGkscjE1ZAorCXhvcglyMTRkLHIxMGQKKwlhZGQJcjlkLHIxM2QKKwl4b3IJZWRpLHIxMWQKKwlyb3IJcjE0ZCwyCisJYWRkCWVieCxyOWQKKwlhZGQJcjlkLGVkaQorCW1vdglyMTNkLGVieAorCWFkZAlyMTRkLHI5ZAorCXJvcglyMTNkLDE0CisJbW92CXI5ZCxyMTRkCisJbW92CXIxMmQsZWN4CisJcm9yCXIxNGQsOQorCXhvcglyMTNkLGVieAorCXhvcglyMTJkLGVkeAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxyOWQKKwlhbmQJcjEyZCxlYngKKwl4b3IJcjEzZCxlYngKKwlhZGQJcjhkLERXT1JEWzQ0K3JzcF0KKwltb3YJZWRpLHI5ZAorCXhvcglyMTJkLGVkeAorCXJvcglyMTRkLDExCisJeG9yCWVkaSxyMTBkCisJYWRkCXI4ZCxyMTJkCisJcm9yCXIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLHI5ZAorCWFkZAlyOGQscjEzZAorCXhvcglyMTVkLHIxMGQKKwlyb3IJcjE0ZCwyCisJYWRkCWVheCxyOGQKKwlhZGQJcjhkLHIxNWQKKwltb3YJcjEzZCxlYXgKKwlhZGQJcjE0ZCxyOGQKKwlyb3IJcjEzZCwxNAorCW1vdglyOGQscjE0ZAorCW1vdglyMTJkLGVieAorCXJvcglyMTRkLDkKKwl4b3IJcjEzZCxlYXgKKwl4b3IJcjEyZCxlY3gKKwlyb3IJcjEzZCw1CisJeG9yCXIxNGQscjhkCisJYW5kCXIxMmQsZWF4CisJeG9yCXIxM2QsZWF4CisJYWRkCWVkeCxEV09SRFs0OCtyc3BdCisJbW92CXIxNWQscjhkCisJeG9yCXIxMmQsZWN4CisJcm9yCXIxNGQsMTEKKwl4b3IJcjE1ZCxyOWQKKwlhZGQJZWR4LHIxMmQKKwlyb3IJcjEzZCw2CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQscjhkCisJYWRkCWVkeCxyMTNkCisJeG9yCWVkaSxyOWQKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMWQsZWR4CisJYWRkCWVkeCxlZGkKKwltb3YJcjEzZCxyMTFkCisJYWRkCXIxNGQsZWR4CisJcm9yCXIxM2QsMTQKKwltb3YJZWR4LHIxNGQKKwltb3YJcjEyZCxlYXgKKwlyb3IJcjE0ZCw5CisJeG9yCXIxM2QscjExZAorCXhvcglyMTJkLGVieAorCXJvcglyMTNkLDUKKwl4b3IJcjE0ZCxlZHgKKwlhbmQJcjEyZCxyMTFkCisJeG9yCXIxM2QscjExZAorCWFkZAllY3gsRFdPUkRbNTIrcnNwXQorCW1vdgllZGksZWR4CisJeG9yCXIxMmQsZWJ4CisJcm9yCXIxNGQsMTEKKwl4b3IJZWRpLHI4ZAorCWFkZAllY3gscjEyZAorCXJvcglyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxlZHgKKwlhZGQJZWN4LHIxM2QKKwl4b3IJcjE1ZCxyOGQKKwlyb3IJcjE0ZCwyCisJYWRkCXIxMGQsZWN4CisJYWRkCWVjeCxyMTVkCisJbW92CXIxM2QscjEwZAorCWFkZAlyMTRkLGVjeAorCXJvcglyMTNkLDE0CisJbW92CWVjeCxyMTRkCisJbW92CXIxMmQscjExZAorCXJvcglyMTRkLDkKKwl4b3IJcjEzZCxyMTBkCisJeG9yCXIxMmQsZWF4CisJcm9yCXIxM2QsNQorCXhvcglyMTRkLGVjeAorCWFuZAlyMTJkLHIxMGQKKwl4b3IJcjEzZCxyMTBkCisJYWRkCWVieCxEV09SRFs1Nityc3BdCisJbW92CXIxNWQsZWN4CisJeG9yCXIxMmQsZWF4CisJcm9yCXIxNGQsMTEKKwl4b3IJcjE1ZCxlZHgKKwlhZGQJZWJ4LHIxMmQKKwlyb3IJcjEzZCw2CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQsZWN4CisJYWRkCWVieCxyMTNkCisJeG9yCWVkaSxlZHgKKwlyb3IJcjE0ZCwyCisJYWRkCXI5ZCxlYngKKwlhZGQJZWJ4LGVkaQorCW1vdglyMTNkLHI5ZAorCWFkZAlyMTRkLGVieAorCXJvcglyMTNkLDE0CisJbW92CWVieCxyMTRkCisJbW92CXIxMmQscjEwZAorCXJvcglyMTRkLDkKKwl4b3IJcjEzZCxyOWQKKwl4b3IJcjEyZCxyMTFkCisJcm9yCXIxM2QsNQorCXhvcglyMTRkLGVieAorCWFuZAlyMTJkLHI5ZAorCXhvcglyMTNkLHI5ZAorCWFkZAllYXgsRFdPUkRbNjArcnNwXQorCW1vdgllZGksZWJ4CisJeG9yCXIxMmQscjExZAorCXJvcglyMTRkLDExCisJeG9yCWVkaSxlY3gKKwlhZGQJZWF4LHIxMmQKKwlyb3IJcjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQsZWJ4CisJYWRkCWVheCxyMTNkCisJeG9yCXIxNWQsZWN4CisJcm9yCXIxNGQsMgorCWFkZAlyOGQsZWF4CisJYWRkCWVheCxyMTVkCisJbW92CXIxM2QscjhkCisJYWRkCXIxNGQsZWF4CisJbW92CXJkaSxRV09SRFsoKDY0KzApKStyc3BdCisJbW92CWVheCxyMTRkCisKKwlhZGQJZWF4LERXT1JEW3JkaV0KKwlsZWEJcnNpLFs2NCtyc2ldCisJYWRkCWVieCxEV09SRFs0K3JkaV0KKwlhZGQJZWN4LERXT1JEWzgrcmRpXQorCWFkZAllZHgsRFdPUkRbMTIrcmRpXQorCWFkZAlyOGQsRFdPUkRbMTYrcmRpXQorCWFkZAlyOWQsRFdPUkRbMjArcmRpXQorCWFkZAlyMTBkLERXT1JEWzI0K3JkaV0KKwlhZGQJcjExZCxEV09SRFsyOCtyZGldCisKKwljbXAJcnNpLFFXT1JEWygoNjQrMTYpKStyc3BdCisKKwltb3YJRFdPUkRbcmRpXSxlYXgKKwltb3YJRFdPUkRbNCtyZGldLGVieAorCW1vdglEV09SRFs4K3JkaV0sZWN4CisJbW92CURXT1JEWzEyK3JkaV0sZWR4CisJbW92CURXT1JEWzE2K3JkaV0scjhkCisJbW92CURXT1JEWzIwK3JkaV0scjlkCisJbW92CURXT1JEWzI0K3JkaV0scjEwZAorCW1vdglEV09SRFsyOCtyZGldLHIxMWQKKwlqYglORUFSICRMJGxvb3Bfc3NzZTMKKworCW1vdglyc2ksUVdPUkRbODgrcnNwXQorCisJbW92YXBzCXhtbTYsWE1NV09SRFsoKDY0KzMyKSkrcnNwXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbKCg2NCs0OCkpK3JzcF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoNjQrNjQpKStyc3BdCisJbW92YXBzCXhtbTksWE1NV09SRFsoKDY0KzgwKSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRlcGlsb2d1ZV9zc3NlMzoKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9zc3NlMzoKKworQUxJR04JNjQKK3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworJEwkYXZ4X3Nob3J0Y3V0OgorCW1vdglyYXgscnNwCisKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKwlzaGwJcmR4LDQKKwlzdWIJcnNwLDE2MAorCWxlYQlyZHgsW3JkeCo0K3JzaV0KKwlhbmQJcnNwLC02NAorCW1vdglRV09SRFsoKDY0KzApKStyc3BdLHJkaQorCW1vdglRV09SRFsoKDY0KzgpKStyc3BdLHJzaQorCW1vdglRV09SRFsoKDY0KzE2KSkrcnNwXSxyZHgKKwltb3YJUVdPUkRbODgrcnNwXSxyYXgKKworCW1vdmFwcwlYTU1XT1JEWyg2NCszMikrcnNwXSx4bW02CisJbW92YXBzCVhNTVdPUkRbKDY0KzQ4KStyc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFsoNjQrNjQpK3JzcF0seG1tOAorCW1vdmFwcwlYTU1XT1JEWyg2NCs4MCkrcnNwXSx4bW05CiskTCRwcm9sb2d1ZV9hdng6CisKKwl2emVyb3VwcGVyCisJbW92CWVheCxEV09SRFtyZGldCisJbW92CWVieCxEV09SRFs0K3JkaV0KKwltb3YJZWN4LERXT1JEWzgrcmRpXQorCW1vdgllZHgsRFdPUkRbMTIrcmRpXQorCW1vdglyOGQsRFdPUkRbMTYrcmRpXQorCW1vdglyOWQsRFdPUkRbMjArcmRpXQorCW1vdglyMTBkLERXT1JEWzI0K3JkaV0KKwltb3YJcjExZCxEV09SRFsyOCtyZGldCisJdm1vdmRxYQl4bW04LFhNTVdPUkRbKChLMjU2KzUxMiszMikpXQorCXZtb3ZkcWEJeG1tOSxYTU1XT1JEWygoSzI1Nis1MTIrNjQpKV0KKwlqbXAJTkVBUiAkTCRsb29wX2F2eAorQUxJR04JMTYKKyRMJGxvb3BfYXZ4OgorCXZtb3ZkcWEJeG1tNyxYTU1XT1JEWygoSzI1Nis1MTIpKV0KKwl2bW92ZHF1CXhtbTAsWE1NV09SRFtyc2ldCisJdm1vdmRxdQl4bW0xLFhNTVdPUkRbMTYrcnNpXQorCXZtb3ZkcXUJeG1tMixYTU1XT1JEWzMyK3JzaV0KKwl2bW92ZHF1CXhtbTMsWE1NV09SRFs0OCtyc2ldCisJdnBzaHVmYgl4bW0wLHhtbTAseG1tNworCWxlYQlyYnAsW0syNTZdCisJdnBzaHVmYgl4bW0xLHhtbTEseG1tNworCXZwc2h1ZmIJeG1tMix4bW0yLHhtbTcKKwl2cGFkZGQJeG1tNCx4bW0wLFhNTVdPUkRbcmJwXQorCXZwc2h1ZmIJeG1tMyx4bW0zLHhtbTcKKwl2cGFkZGQJeG1tNSx4bW0xLFhNTVdPUkRbMzIrcmJwXQorCXZwYWRkZAl4bW02LHhtbTIsWE1NV09SRFs2NCtyYnBdCisJdnBhZGRkCXhtbTcseG1tMyxYTU1XT1JEWzk2K3JicF0KKwl2bW92ZHFhCVhNTVdPUkRbcnNwXSx4bW00CisJbW92CXIxNGQsZWF4CisJdm1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tNQorCW1vdgllZGksZWJ4CisJdm1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tNgorCXhvcgllZGksZWN4CisJdm1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tNworCW1vdglyMTNkLHI4ZAorCWptcAlORUFSICRMJGF2eF8wMF80NworCitBTElHTgkxNgorJEwkYXZ4XzAwXzQ3OgorCXN1YglyYnAsLTEyOAorCXZwYWxpZ25yCXhtbTQseG1tMSx4bW0wLDQKKwlzaHJkCXIxM2QscjEzZCwxNAorCW1vdgllYXgscjE0ZAorCW1vdglyMTJkLHI5ZAorCXZwYWxpZ25yCXhtbTcseG1tMyx4bW0yLDQKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QscjhkCisJeG9yCXIxMmQscjEwZAorCXZwc3JsZAl4bW02LHhtbTQsNworCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxlYXgKKwlhbmQJcjEyZCxyOGQKKwl2cGFkZGQJeG1tMCx4bW0wLHhtbTcKKwl4b3IJcjEzZCxyOGQKKwlhZGQJcjExZCxEV09SRFtyc3BdCisJbW92CXIxNWQsZWF4CisJdnBzcmxkCXhtbTcseG1tNCwzCisJeG9yCXIxMmQscjEwZAorCXNocmQJcjE0ZCxyMTRkLDExCisJeG9yCXIxNWQsZWJ4CisJdnBzbGxkCXhtbTUseG1tNCwxNAorCWFkZAlyMTFkLHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCWVkaSxyMTVkCisJdnB4b3IJeG1tNCx4bW03LHhtbTYKKwl4b3IJcjE0ZCxlYXgKKwlhZGQJcjExZCxyMTNkCisJeG9yCWVkaSxlYngKKwl2cHNodWZkCXhtbTcseG1tMywyNTAKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCWVkeCxyMTFkCisJYWRkCXIxMWQsZWRpCisJdnBzcmxkCXhtbTYseG1tNiwxMQorCW1vdglyMTNkLGVkeAorCWFkZAlyMTRkLHIxMWQKKwlzaHJkCXIxM2QscjEzZCwxNAorCXZweG9yCXhtbTQseG1tNCx4bW01CisJbW92CXIxMWQscjE0ZAorCW1vdglyMTJkLHI4ZAorCXNocmQJcjE0ZCxyMTRkLDkKKwl2cHNsbGQJeG1tNSx4bW01LDExCisJeG9yCXIxM2QsZWR4CisJeG9yCXIxMmQscjlkCisJc2hyZAlyMTNkLHIxM2QsNQorCXZweG9yCXhtbTQseG1tNCx4bW02CisJeG9yCXIxNGQscjExZAorCWFuZAlyMTJkLGVkeAorCXhvcglyMTNkLGVkeAorCXZwc3JsZAl4bW02LHhtbTcsMTAKKwlhZGQJcjEwZCxEV09SRFs0K3JzcF0KKwltb3YJZWRpLHIxMWQKKwl4b3IJcjEyZCxyOWQKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCXNocmQJcjE0ZCxyMTRkLDExCisJeG9yCWVkaSxlYXgKKwlhZGQJcjEwZCxyMTJkCisJdnBzcmxxCXhtbTcseG1tNywxNworCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxyMTFkCisJdnBhZGRkCXhtbTAseG1tMCx4bW00CisJYWRkCXIxMGQscjEzZAorCXhvcglyMTVkLGVheAorCXNocmQJcjE0ZCxyMTRkLDIKKwl2cHhvcgl4bW02LHhtbTYseG1tNworCWFkZAllY3gscjEwZAorCWFkZAlyMTBkLHIxNWQKKwltb3YJcjEzZCxlY3gKKwl2cHNybHEJeG1tNyx4bW03LDIKKwlhZGQJcjE0ZCxyMTBkCisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJcjEwZCxyMTRkCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwltb3YJcjEyZCxlZHgKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QsZWN4CisJdnBzaHVmYgl4bW02LHhtbTYseG1tOAorCXhvcglyMTJkLHI4ZAorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyMTBkCisJdnBhZGRkCXhtbTAseG1tMCx4bW02CisJYW5kCXIxMmQsZWN4CisJeG9yCXIxM2QsZWN4CisJYWRkCXI5ZCxEV09SRFs4K3JzcF0KKwl2cHNodWZkCXhtbTcseG1tMCw4MAorCW1vdglyMTVkLHIxMGQKKwl4b3IJcjEyZCxyOGQKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXZwc3JsZAl4bW02LHhtbTcsMTAKKwl4b3IJcjE1ZCxyMTFkCisJYWRkCXI5ZCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCXZwc3JscQl4bW03LHhtbTcsMTcKKwlhbmQJZWRpLHIxNWQKKwl4b3IJcjE0ZCxyMTBkCisJYWRkCXI5ZCxyMTNkCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwl4b3IJZWRpLHIxMWQKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCWVieCxyOWQKKwl2cHNybHEJeG1tNyx4bW03LDIKKwlhZGQJcjlkLGVkaQorCW1vdglyMTNkLGVieAorCWFkZAlyMTRkLHI5ZAorCXZweG9yCXhtbTYseG1tNix4bW03CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJcjlkLHIxNGQKKwltb3YJcjEyZCxlY3gKKwl2cHNodWZiCXhtbTYseG1tNix4bW05CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLGVieAorCXhvcglyMTJkLGVkeAorCXZwYWRkZAl4bW0wLHhtbTAseG1tNgorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyOWQKKwlhbmQJcjEyZCxlYngKKwl2cGFkZGQJeG1tNix4bW0wLFhNTVdPUkRbcmJwXQorCXhvcglyMTNkLGVieAorCWFkZAlyOGQsRFdPUkRbMTIrcnNwXQorCW1vdgllZGkscjlkCisJeG9yCXIxMmQsZWR4CisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJZWRpLHIxMGQKKwlhZGQJcjhkLHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQscjlkCisJYWRkCXI4ZCxyMTNkCisJeG9yCXIxNWQscjEwZAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJZWF4LHI4ZAorCWFkZAlyOGQscjE1ZAorCW1vdglyMTNkLGVheAorCWFkZAlyMTRkLHI4ZAorCXZtb3ZkcWEJWE1NV09SRFtyc3BdLHhtbTYKKwl2cGFsaWducgl4bW00LHhtbTIseG1tMSw0CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJcjhkLHIxNGQKKwltb3YJcjEyZCxlYngKKwl2cGFsaWducgl4bW03LHhtbTAseG1tMyw0CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLGVheAorCXhvcglyMTJkLGVjeAorCXZwc3JsZAl4bW02LHhtbTQsNworCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyOGQKKwlhbmQJcjEyZCxlYXgKKwl2cGFkZGQJeG1tMSx4bW0xLHhtbTcKKwl4b3IJcjEzZCxlYXgKKwlhZGQJZWR4LERXT1JEWzE2K3JzcF0KKwltb3YJcjE1ZCxyOGQKKwl2cHNybGQJeG1tNyx4bW00LDMKKwl4b3IJcjEyZCxlY3gKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcglyMTVkLHI5ZAorCXZwc2xsZAl4bW01LHhtbTQsMTQKKwlhZGQJZWR4LHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCWVkaSxyMTVkCisJdnB4b3IJeG1tNCx4bW03LHhtbTYKKwl4b3IJcjE0ZCxyOGQKKwlhZGQJZWR4LHIxM2QKKwl4b3IJZWRpLHI5ZAorCXZwc2h1ZmQJeG1tNyx4bW0wLDI1MAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjExZCxlZHgKKwlhZGQJZWR4LGVkaQorCXZwc3JsZAl4bW02LHhtbTYsMTEKKwltb3YJcjEzZCxyMTFkCisJYWRkCXIxNGQsZWR4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCW1vdgllZHgscjE0ZAorCW1vdglyMTJkLGVheAorCXNocmQJcjE0ZCxyMTRkLDkKKwl2cHNsbGQJeG1tNSx4bW01LDExCisJeG9yCXIxM2QscjExZAorCXhvcglyMTJkLGVieAorCXNocmQJcjEzZCxyMTNkLDUKKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXhvcglyMTRkLGVkeAorCWFuZAlyMTJkLHIxMWQKKwl4b3IJcjEzZCxyMTFkCisJdnBzcmxkCXhtbTYseG1tNywxMAorCWFkZAllY3gsRFdPUkRbMjArcnNwXQorCW1vdgllZGksZWR4CisJeG9yCXIxMmQsZWJ4CisJdnB4b3IJeG1tNCx4bW00LHhtbTUKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcgllZGkscjhkCisJYWRkCWVjeCxyMTJkCisJdnBzcmxxCXhtbTcseG1tNywxNworCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxlZHgKKwl2cGFkZGQJeG1tMSx4bW0xLHhtbTQKKwlhZGQJZWN4LHIxM2QKKwl4b3IJcjE1ZCxyOGQKKwlzaHJkCXIxNGQscjE0ZCwyCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwlhZGQJcjEwZCxlY3gKKwlhZGQJZWN4LHIxNWQKKwltb3YJcjEzZCxyMTBkCisJdnBzcmxxCXhtbTcseG1tNywyCisJYWRkCXIxNGQsZWN4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWN4LHIxNGQKKwl2cHhvcgl4bW02LHhtbTYseG1tNworCW1vdglyMTJkLHIxMWQKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QscjEwZAorCXZwc2h1ZmIJeG1tNix4bW02LHhtbTgKKwl4b3IJcjEyZCxlYXgKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQsZWN4CisJdnBhZGRkCXhtbTEseG1tMSx4bW02CisJYW5kCXIxMmQscjEwZAorCXhvcglyMTNkLHIxMGQKKwlhZGQJZWJ4LERXT1JEWzI0K3JzcF0KKwl2cHNodWZkCXhtbTcseG1tMSw4MAorCW1vdglyMTVkLGVjeAorCXhvcglyMTJkLGVheAorCXNocmQJcjE0ZCxyMTRkLDExCisJdnBzcmxkCXhtbTYseG1tNywxMAorCXhvcglyMTVkLGVkeAorCWFkZAllYngscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwl2cHNybHEJeG1tNyx4bW03LDE3CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQsZWN4CisJYWRkCWVieCxyMTNkCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwl4b3IJZWRpLGVkeAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjlkLGVieAorCXZwc3JscQl4bW03LHhtbTcsMgorCWFkZAllYngsZWRpCisJbW92CXIxM2QscjlkCisJYWRkCXIxNGQsZWJ4CisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwlzaHJkCXIxM2QscjEzZCwxNAorCW1vdgllYngscjE0ZAorCW1vdglyMTJkLHIxMGQKKwl2cHNodWZiCXhtbTYseG1tNix4bW05CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLHI5ZAorCXhvcglyMTJkLHIxMWQKKwl2cGFkZGQJeG1tMSx4bW0xLHhtbTYKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQsZWJ4CisJYW5kCXIxMmQscjlkCisJdnBhZGRkCXhtbTYseG1tMSxYTU1XT1JEWzMyK3JicF0KKwl4b3IJcjEzZCxyOWQKKwlhZGQJZWF4LERXT1JEWzI4K3JzcF0KKwltb3YJZWRpLGVieAorCXhvcglyMTJkLHIxMWQKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcgllZGksZWN4CisJYWRkCWVheCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLGVieAorCWFkZAllYXgscjEzZAorCXhvcglyMTVkLGVjeAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjhkLGVheAorCWFkZAllYXgscjE1ZAorCW1vdglyMTNkLHI4ZAorCWFkZAlyMTRkLGVheAorCXZtb3ZkcWEJWE1NV09SRFsxNityc3BdLHhtbTYKKwl2cGFsaWducgl4bW00LHhtbTMseG1tMiw0CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWF4LHIxNGQKKwltb3YJcjEyZCxyOWQKKwl2cGFsaWducgl4bW03LHhtbTEseG1tMCw0CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLHI4ZAorCXhvcglyMTJkLHIxMGQKKwl2cHNybGQJeG1tNix4bW00LDcKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQsZWF4CisJYW5kCXIxMmQscjhkCisJdnBhZGRkCXhtbTIseG1tMix4bW03CisJeG9yCXIxM2QscjhkCisJYWRkCXIxMWQsRFdPUkRbMzIrcnNwXQorCW1vdglyMTVkLGVheAorCXZwc3JsZAl4bW03LHhtbTQsMworCXhvcglyMTJkLHIxMGQKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcglyMTVkLGVieAorCXZwc2xsZAl4bW01LHhtbTQsMTQKKwlhZGQJcjExZCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAllZGkscjE1ZAorCXZweG9yCXhtbTQseG1tNyx4bW02CisJeG9yCXIxNGQsZWF4CisJYWRkCXIxMWQscjEzZAorCXhvcgllZGksZWJ4CisJdnBzaHVmZAl4bW03LHhtbTEsMjUwCisJc2hyZAlyMTRkLHIxNGQsMgorCWFkZAllZHgscjExZAorCWFkZAlyMTFkLGVkaQorCXZwc3JsZAl4bW02LHhtbTYsMTEKKwltb3YJcjEzZCxlZHgKKwlhZGQJcjE0ZCxyMTFkCisJc2hyZAlyMTNkLHIxM2QsMTQKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCW1vdglyMTFkLHIxNGQKKwltb3YJcjEyZCxyOGQKKwlzaHJkCXIxNGQscjE0ZCw5CisJdnBzbGxkCXhtbTUseG1tNSwxMQorCXhvcglyMTNkLGVkeAorCXhvcglyMTJkLHI5ZAorCXNocmQJcjEzZCxyMTNkLDUKKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXhvcglyMTRkLHIxMWQKKwlhbmQJcjEyZCxlZHgKKwl4b3IJcjEzZCxlZHgKKwl2cHNybGQJeG1tNix4bW03LDEwCisJYWRkCXIxMGQsRFdPUkRbMzYrcnNwXQorCW1vdgllZGkscjExZAorCXhvcglyMTJkLHI5ZAorCXZweG9yCXhtbTQseG1tNCx4bW01CisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJZWRpLGVheAorCWFkZAlyMTBkLHIxMmQKKwl2cHNybHEJeG1tNyx4bW03LDE3CisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLHIxMWQKKwl2cGFkZGQJeG1tMix4bW0yLHhtbTQKKwlhZGQJcjEwZCxyMTNkCisJeG9yCXIxNWQsZWF4CisJc2hyZAlyMTRkLHIxNGQsMgorCXZweG9yCXhtbTYseG1tNix4bW03CisJYWRkCWVjeCxyMTBkCisJYWRkCXIxMGQscjE1ZAorCW1vdglyMTNkLGVjeAorCXZwc3JscQl4bW03LHhtbTcsMgorCWFkZAlyMTRkLHIxMGQKKwlzaHJkCXIxM2QscjEzZCwxNAorCW1vdglyMTBkLHIxNGQKKwl2cHhvcgl4bW02LHhtbTYseG1tNworCW1vdglyMTJkLGVkeAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxlY3gKKwl2cHNodWZiCXhtbTYseG1tNix4bW04CisJeG9yCXIxMmQscjhkCisJc2hyZAlyMTNkLHIxM2QsNQorCXhvcglyMTRkLHIxMGQKKwl2cGFkZGQJeG1tMix4bW0yLHhtbTYKKwlhbmQJcjEyZCxlY3gKKwl4b3IJcjEzZCxlY3gKKwlhZGQJcjlkLERXT1JEWzQwK3JzcF0KKwl2cHNodWZkCXhtbTcseG1tMiw4MAorCW1vdglyMTVkLHIxMGQKKwl4b3IJcjEyZCxyOGQKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXZwc3JsZAl4bW02LHhtbTcsMTAKKwl4b3IJcjE1ZCxyMTFkCisJYWRkCXI5ZCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCXZwc3JscQl4bW03LHhtbTcsMTcKKwlhbmQJZWRpLHIxNWQKKwl4b3IJcjE0ZCxyMTBkCisJYWRkCXI5ZCxyMTNkCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwl4b3IJZWRpLHIxMWQKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCWVieCxyOWQKKwl2cHNybHEJeG1tNyx4bW03LDIKKwlhZGQJcjlkLGVkaQorCW1vdglyMTNkLGVieAorCWFkZAlyMTRkLHI5ZAorCXZweG9yCXhtbTYseG1tNix4bW03CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJcjlkLHIxNGQKKwltb3YJcjEyZCxlY3gKKwl2cHNodWZiCXhtbTYseG1tNix4bW05CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLGVieAorCXhvcglyMTJkLGVkeAorCXZwYWRkZAl4bW0yLHhtbTIseG1tNgorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyOWQKKwlhbmQJcjEyZCxlYngKKwl2cGFkZGQJeG1tNix4bW0yLFhNTVdPUkRbNjQrcmJwXQorCXhvcglyMTNkLGVieAorCWFkZAlyOGQsRFdPUkRbNDQrcnNwXQorCW1vdgllZGkscjlkCisJeG9yCXIxMmQsZWR4CisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJZWRpLHIxMGQKKwlhZGQJcjhkLHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQscjlkCisJYWRkCXI4ZCxyMTNkCisJeG9yCXIxNWQscjEwZAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJZWF4LHI4ZAorCWFkZAlyOGQscjE1ZAorCW1vdglyMTNkLGVheAorCWFkZAlyMTRkLHI4ZAorCXZtb3ZkcWEJWE1NV09SRFszMityc3BdLHhtbTYKKwl2cGFsaWducgl4bW00LHhtbTAseG1tMyw0CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJcjhkLHIxNGQKKwltb3YJcjEyZCxlYngKKwl2cGFsaWducgl4bW03LHhtbTIseG1tMSw0CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLGVheAorCXhvcglyMTJkLGVjeAorCXZwc3JsZAl4bW02LHhtbTQsNworCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyOGQKKwlhbmQJcjEyZCxlYXgKKwl2cGFkZGQJeG1tMyx4bW0zLHhtbTcKKwl4b3IJcjEzZCxlYXgKKwlhZGQJZWR4LERXT1JEWzQ4K3JzcF0KKwltb3YJcjE1ZCxyOGQKKwl2cHNybGQJeG1tNyx4bW00LDMKKwl4b3IJcjEyZCxlY3gKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcglyMTVkLHI5ZAorCXZwc2xsZAl4bW01LHhtbTQsMTQKKwlhZGQJZWR4LHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCWVkaSxyMTVkCisJdnB4b3IJeG1tNCx4bW03LHhtbTYKKwl4b3IJcjE0ZCxyOGQKKwlhZGQJZWR4LHIxM2QKKwl4b3IJZWRpLHI5ZAorCXZwc2h1ZmQJeG1tNyx4bW0yLDI1MAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjExZCxlZHgKKwlhZGQJZWR4LGVkaQorCXZwc3JsZAl4bW02LHhtbTYsMTEKKwltb3YJcjEzZCxyMTFkCisJYWRkCXIxNGQsZWR4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwl2cHhvcgl4bW00LHhtbTQseG1tNQorCW1vdgllZHgscjE0ZAorCW1vdglyMTJkLGVheAorCXNocmQJcjE0ZCxyMTRkLDkKKwl2cHNsbGQJeG1tNSx4bW01LDExCisJeG9yCXIxM2QscjExZAorCXhvcglyMTJkLGVieAorCXNocmQJcjEzZCxyMTNkLDUKKwl2cHhvcgl4bW00LHhtbTQseG1tNgorCXhvcglyMTRkLGVkeAorCWFuZAlyMTJkLHIxMWQKKwl4b3IJcjEzZCxyMTFkCisJdnBzcmxkCXhtbTYseG1tNywxMAorCWFkZAllY3gsRFdPUkRbNTIrcnNwXQorCW1vdgllZGksZWR4CisJeG9yCXIxMmQsZWJ4CisJdnB4b3IJeG1tNCx4bW00LHhtbTUKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcgllZGkscjhkCisJYWRkCWVjeCxyMTJkCisJdnBzcmxxCXhtbTcseG1tNywxNworCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxlZHgKKwl2cGFkZGQJeG1tMyx4bW0zLHhtbTQKKwlhZGQJZWN4LHIxM2QKKwl4b3IJcjE1ZCxyOGQKKwlzaHJkCXIxNGQscjE0ZCwyCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwlhZGQJcjEwZCxlY3gKKwlhZGQJZWN4LHIxNWQKKwltb3YJcjEzZCxyMTBkCisJdnBzcmxxCXhtbTcseG1tNywyCisJYWRkCXIxNGQsZWN4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWN4LHIxNGQKKwl2cHhvcgl4bW02LHhtbTYseG1tNworCW1vdglyMTJkLHIxMWQKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QscjEwZAorCXZwc2h1ZmIJeG1tNix4bW02LHhtbTgKKwl4b3IJcjEyZCxlYXgKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQsZWN4CisJdnBhZGRkCXhtbTMseG1tMyx4bW02CisJYW5kCXIxMmQscjEwZAorCXhvcglyMTNkLHIxMGQKKwlhZGQJZWJ4LERXT1JEWzU2K3JzcF0KKwl2cHNodWZkCXhtbTcseG1tMyw4MAorCW1vdglyMTVkLGVjeAorCXhvcglyMTJkLGVheAorCXNocmQJcjE0ZCxyMTRkLDExCisJdnBzcmxkCXhtbTYseG1tNywxMAorCXhvcglyMTVkLGVkeAorCWFkZAllYngscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwl2cHNybHEJeG1tNyx4bW03LDE3CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQsZWN4CisJYWRkCWVieCxyMTNkCisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwl4b3IJZWRpLGVkeAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjlkLGVieAorCXZwc3JscQl4bW03LHhtbTcsMgorCWFkZAllYngsZWRpCisJbW92CXIxM2QscjlkCisJYWRkCXIxNGQsZWJ4CisJdnB4b3IJeG1tNix4bW02LHhtbTcKKwlzaHJkCXIxM2QscjEzZCwxNAorCW1vdgllYngscjE0ZAorCW1vdglyMTJkLHIxMGQKKwl2cHNodWZiCXhtbTYseG1tNix4bW05CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLHI5ZAorCXhvcglyMTJkLHIxMWQKKwl2cGFkZGQJeG1tMyx4bW0zLHhtbTYKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQsZWJ4CisJYW5kCXIxMmQscjlkCisJdnBhZGRkCXhtbTYseG1tMyxYTU1XT1JEWzk2K3JicF0KKwl4b3IJcjEzZCxyOWQKKwlhZGQJZWF4LERXT1JEWzYwK3JzcF0KKwltb3YJZWRpLGVieAorCXhvcglyMTJkLHIxMWQKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcgllZGksZWN4CisJYWRkCWVheCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLGVieAorCWFkZAllYXgscjEzZAorCXhvcglyMTVkLGVjeAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjhkLGVheAorCWFkZAllYXgscjE1ZAorCW1vdglyMTNkLHI4ZAorCWFkZAlyMTRkLGVheAorCXZtb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTYKKwljbXAJQllURVsxMzErcmJwXSwwCisJam5lCU5FQVIgJEwkYXZ4XzAwXzQ3CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWF4LHIxNGQKKwltb3YJcjEyZCxyOWQKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QscjhkCisJeG9yCXIxMmQscjEwZAorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxlYXgKKwlhbmQJcjEyZCxyOGQKKwl4b3IJcjEzZCxyOGQKKwlhZGQJcjExZCxEV09SRFtyc3BdCisJbW92CXIxNWQsZWF4CisJeG9yCXIxMmQscjEwZAorCXNocmQJcjE0ZCxyMTRkLDExCisJeG9yCXIxNWQsZWJ4CisJYWRkCXIxMWQscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJZWRpLHIxNWQKKwl4b3IJcjE0ZCxlYXgKKwlhZGQJcjExZCxyMTNkCisJeG9yCWVkaSxlYngKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCWVkeCxyMTFkCisJYWRkCXIxMWQsZWRpCisJbW92CXIxM2QsZWR4CisJYWRkCXIxNGQscjExZAorCXNocmQJcjEzZCxyMTNkLDE0CisJbW92CXIxMWQscjE0ZAorCW1vdglyMTJkLHI4ZAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxlZHgKKwl4b3IJcjEyZCxyOWQKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQscjExZAorCWFuZAlyMTJkLGVkeAorCXhvcglyMTNkLGVkeAorCWFkZAlyMTBkLERXT1JEWzQrcnNwXQorCW1vdgllZGkscjExZAorCXhvcglyMTJkLHI5ZAorCXNocmQJcjE0ZCxyMTRkLDExCisJeG9yCWVkaSxlYXgKKwlhZGQJcjEwZCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLHIxMWQKKwlhZGQJcjEwZCxyMTNkCisJeG9yCXIxNWQsZWF4CisJc2hyZAlyMTRkLHIxNGQsMgorCWFkZAllY3gscjEwZAorCWFkZAlyMTBkLHIxNWQKKwltb3YJcjEzZCxlY3gKKwlhZGQJcjE0ZCxyMTBkCisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJcjEwZCxyMTRkCisJbW92CXIxMmQsZWR4CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLGVjeAorCXhvcglyMTJkLHI4ZAorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyMTBkCisJYW5kCXIxMmQsZWN4CisJeG9yCXIxM2QsZWN4CisJYWRkCXI5ZCxEV09SRFs4K3JzcF0KKwltb3YJcjE1ZCxyMTBkCisJeG9yCXIxMmQscjhkCisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJcjE1ZCxyMTFkCisJYWRkCXI5ZCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAllZGkscjE1ZAorCXhvcglyMTRkLHIxMGQKKwlhZGQJcjlkLHIxM2QKKwl4b3IJZWRpLHIxMWQKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCWVieCxyOWQKKwlhZGQJcjlkLGVkaQorCW1vdglyMTNkLGVieAorCWFkZAlyMTRkLHI5ZAorCXNocmQJcjEzZCxyMTNkLDE0CisJbW92CXI5ZCxyMTRkCisJbW92CXIxMmQsZWN4CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLGVieAorCXhvcglyMTJkLGVkeAorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyOWQKKwlhbmQJcjEyZCxlYngKKwl4b3IJcjEzZCxlYngKKwlhZGQJcjhkLERXT1JEWzEyK3JzcF0KKwltb3YJZWRpLHI5ZAorCXhvcglyMTJkLGVkeAorCXNocmQJcjE0ZCxyMTRkLDExCisJeG9yCWVkaSxyMTBkCisJYWRkCXI4ZCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLHI5ZAorCWFkZAlyOGQscjEzZAorCXhvcglyMTVkLHIxMGQKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCWVheCxyOGQKKwlhZGQJcjhkLHIxNWQKKwltb3YJcjEzZCxlYXgKKwlhZGQJcjE0ZCxyOGQKKwlzaHJkCXIxM2QscjEzZCwxNAorCW1vdglyOGQscjE0ZAorCW1vdglyMTJkLGVieAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxlYXgKKwl4b3IJcjEyZCxlY3gKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQscjhkCisJYW5kCXIxMmQsZWF4CisJeG9yCXIxM2QsZWF4CisJYWRkCWVkeCxEV09SRFsxNityc3BdCisJbW92CXIxNWQscjhkCisJeG9yCXIxMmQsZWN4CisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJcjE1ZCxyOWQKKwlhZGQJZWR4LHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQscjhkCisJYWRkCWVkeCxyMTNkCisJeG9yCWVkaSxyOWQKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCXIxMWQsZWR4CisJYWRkCWVkeCxlZGkKKwltb3YJcjEzZCxyMTFkCisJYWRkCXIxNGQsZWR4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWR4LHIxNGQKKwltb3YJcjEyZCxlYXgKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QscjExZAorCXhvcglyMTJkLGVieAorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxlZHgKKwlhbmQJcjEyZCxyMTFkCisJeG9yCXIxM2QscjExZAorCWFkZAllY3gsRFdPUkRbMjArcnNwXQorCW1vdgllZGksZWR4CisJeG9yCXIxMmQsZWJ4CisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJZWRpLHI4ZAorCWFkZAllY3gscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxlZHgKKwlhZGQJZWN4LHIxM2QKKwl4b3IJcjE1ZCxyOGQKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCXIxMGQsZWN4CisJYWRkCWVjeCxyMTVkCisJbW92CXIxM2QscjEwZAorCWFkZAlyMTRkLGVjeAorCXNocmQJcjEzZCxyMTNkLDE0CisJbW92CWVjeCxyMTRkCisJbW92CXIxMmQscjExZAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxyMTBkCisJeG9yCXIxMmQsZWF4CisJc2hyZAlyMTNkLHIxM2QsNQorCXhvcglyMTRkLGVjeAorCWFuZAlyMTJkLHIxMGQKKwl4b3IJcjEzZCxyMTBkCisJYWRkCWVieCxEV09SRFsyNCtyc3BdCisJbW92CXIxNWQsZWN4CisJeG9yCXIxMmQsZWF4CisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJcjE1ZCxlZHgKKwlhZGQJZWJ4LHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQsZWN4CisJYWRkCWVieCxyMTNkCisJeG9yCWVkaSxlZHgKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCXI5ZCxlYngKKwlhZGQJZWJ4LGVkaQorCW1vdglyMTNkLHI5ZAorCWFkZAlyMTRkLGVieAorCXNocmQJcjEzZCxyMTNkLDE0CisJbW92CWVieCxyMTRkCisJbW92CXIxMmQscjEwZAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxyOWQKKwl4b3IJcjEyZCxyMTFkCisJc2hyZAlyMTNkLHIxM2QsNQorCXhvcglyMTRkLGVieAorCWFuZAlyMTJkLHI5ZAorCXhvcglyMTNkLHI5ZAorCWFkZAllYXgsRFdPUkRbMjgrcnNwXQorCW1vdgllZGksZWJ4CisJeG9yCXIxMmQscjExZAorCXNocmQJcjE0ZCxyMTRkLDExCisJeG9yCWVkaSxlY3gKKwlhZGQJZWF4LHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQsZWJ4CisJYWRkCWVheCxyMTNkCisJeG9yCXIxNWQsZWN4CisJc2hyZAlyMTRkLHIxNGQsMgorCWFkZAlyOGQsZWF4CisJYWRkCWVheCxyMTVkCisJbW92CXIxM2QscjhkCisJYWRkCXIxNGQsZWF4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWF4LHIxNGQKKwltb3YJcjEyZCxyOWQKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QscjhkCisJeG9yCXIxMmQscjEwZAorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxlYXgKKwlhbmQJcjEyZCxyOGQKKwl4b3IJcjEzZCxyOGQKKwlhZGQJcjExZCxEV09SRFszMityc3BdCisJbW92CXIxNWQsZWF4CisJeG9yCXIxMmQscjEwZAorCXNocmQJcjE0ZCxyMTRkLDExCisJeG9yCXIxNWQsZWJ4CisJYWRkCXIxMWQscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJZWRpLHIxNWQKKwl4b3IJcjE0ZCxlYXgKKwlhZGQJcjExZCxyMTNkCisJeG9yCWVkaSxlYngKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCWVkeCxyMTFkCisJYWRkCXIxMWQsZWRpCisJbW92CXIxM2QsZWR4CisJYWRkCXIxNGQscjExZAorCXNocmQJcjEzZCxyMTNkLDE0CisJbW92CXIxMWQscjE0ZAorCW1vdglyMTJkLHI4ZAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxlZHgKKwl4b3IJcjEyZCxyOWQKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQscjExZAorCWFuZAlyMTJkLGVkeAorCXhvcglyMTNkLGVkeAorCWFkZAlyMTBkLERXT1JEWzM2K3JzcF0KKwltb3YJZWRpLHIxMWQKKwl4b3IJcjEyZCxyOWQKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcgllZGksZWF4CisJYWRkCXIxMGQscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxyMTFkCisJYWRkCXIxMGQscjEzZAorCXhvcglyMTVkLGVheAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJZWN4LHIxMGQKKwlhZGQJcjEwZCxyMTVkCisJbW92CXIxM2QsZWN4CisJYWRkCXIxNGQscjEwZAorCXNocmQJcjEzZCxyMTNkLDE0CisJbW92CXIxMGQscjE0ZAorCW1vdglyMTJkLGVkeAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxlY3gKKwl4b3IJcjEyZCxyOGQKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQscjEwZAorCWFuZAlyMTJkLGVjeAorCXhvcglyMTNkLGVjeAorCWFkZAlyOWQsRFdPUkRbNDArcnNwXQorCW1vdglyMTVkLHIxMGQKKwl4b3IJcjEyZCxyOGQKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcglyMTVkLHIxMWQKKwlhZGQJcjlkLHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCWVkaSxyMTVkCisJeG9yCXIxNGQscjEwZAorCWFkZAlyOWQscjEzZAorCXhvcgllZGkscjExZAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJZWJ4LHI5ZAorCWFkZAlyOWQsZWRpCisJbW92CXIxM2QsZWJ4CisJYWRkCXIxNGQscjlkCisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJcjlkLHIxNGQKKwltb3YJcjEyZCxlY3gKKwlzaHJkCXIxNGQscjE0ZCw5CisJeG9yCXIxM2QsZWJ4CisJeG9yCXIxMmQsZWR4CisJc2hyZAlyMTNkLHIxM2QsNQorCXhvcglyMTRkLHI5ZAorCWFuZAlyMTJkLGVieAorCXhvcglyMTNkLGVieAorCWFkZAlyOGQsRFdPUkRbNDQrcnNwXQorCW1vdgllZGkscjlkCisJeG9yCXIxMmQsZWR4CisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJZWRpLHIxMGQKKwlhZGQJcjhkLHIxMmQKKwlzaHJkCXIxM2QscjEzZCw2CisJYW5kCXIxNWQsZWRpCisJeG9yCXIxNGQscjlkCisJYWRkCXI4ZCxyMTNkCisJeG9yCXIxNWQscjEwZAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJZWF4LHI4ZAorCWFkZAlyOGQscjE1ZAorCW1vdglyMTNkLGVheAorCWFkZAlyMTRkLHI4ZAorCXNocmQJcjEzZCxyMTNkLDE0CisJbW92CXI4ZCxyMTRkCisJbW92CXIxMmQsZWJ4CisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLGVheAorCXhvcglyMTJkLGVjeAorCXNocmQJcjEzZCxyMTNkLDUKKwl4b3IJcjE0ZCxyOGQKKwlhbmQJcjEyZCxlYXgKKwl4b3IJcjEzZCxlYXgKKwlhZGQJZWR4LERXT1JEWzQ4K3JzcF0KKwltb3YJcjE1ZCxyOGQKKwl4b3IJcjEyZCxlY3gKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcglyMTVkLHI5ZAorCWFkZAllZHgscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJZWRpLHIxNWQKKwl4b3IJcjE0ZCxyOGQKKwlhZGQJZWR4LHIxM2QKKwl4b3IJZWRpLHI5ZAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjExZCxlZHgKKwlhZGQJZWR4LGVkaQorCW1vdglyMTNkLHIxMWQKKwlhZGQJcjE0ZCxlZHgKKwlzaHJkCXIxM2QscjEzZCwxNAorCW1vdgllZHgscjE0ZAorCW1vdglyMTJkLGVheAorCXNocmQJcjE0ZCxyMTRkLDkKKwl4b3IJcjEzZCxyMTFkCisJeG9yCXIxMmQsZWJ4CisJc2hyZAlyMTNkLHIxM2QsNQorCXhvcglyMTRkLGVkeAorCWFuZAlyMTJkLHIxMWQKKwl4b3IJcjEzZCxyMTFkCisJYWRkCWVjeCxEV09SRFs1Mityc3BdCisJbW92CWVkaSxlZHgKKwl4b3IJcjEyZCxlYngKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcgllZGkscjhkCisJYWRkCWVjeCxyMTJkCisJc2hyZAlyMTNkLHIxM2QsNgorCWFuZAlyMTVkLGVkaQorCXhvcglyMTRkLGVkeAorCWFkZAllY3gscjEzZAorCXhvcglyMTVkLHI4ZAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjEwZCxlY3gKKwlhZGQJZWN4LHIxNWQKKwltb3YJcjEzZCxyMTBkCisJYWRkCXIxNGQsZWN4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWN4LHIxNGQKKwltb3YJcjEyZCxyMTFkCisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLHIxMGQKKwl4b3IJcjEyZCxlYXgKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQsZWN4CisJYW5kCXIxMmQscjEwZAorCXhvcglyMTNkLHIxMGQKKwlhZGQJZWJ4LERXT1JEWzU2K3JzcF0KKwltb3YJcjE1ZCxlY3gKKwl4b3IJcjEyZCxlYXgKKwlzaHJkCXIxNGQscjE0ZCwxMQorCXhvcglyMTVkLGVkeAorCWFkZAllYngscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJZWRpLHIxNWQKKwl4b3IJcjE0ZCxlY3gKKwlhZGQJZWJ4LHIxM2QKKwl4b3IJZWRpLGVkeAorCXNocmQJcjE0ZCxyMTRkLDIKKwlhZGQJcjlkLGVieAorCWFkZAllYngsZWRpCisJbW92CXIxM2QscjlkCisJYWRkCXIxNGQsZWJ4CisJc2hyZAlyMTNkLHIxM2QsMTQKKwltb3YJZWJ4LHIxNGQKKwltb3YJcjEyZCxyMTBkCisJc2hyZAlyMTRkLHIxNGQsOQorCXhvcglyMTNkLHI5ZAorCXhvcglyMTJkLHIxMWQKKwlzaHJkCXIxM2QscjEzZCw1CisJeG9yCXIxNGQsZWJ4CisJYW5kCXIxMmQscjlkCisJeG9yCXIxM2QscjlkCisJYWRkCWVheCxEV09SRFs2MCtyc3BdCisJbW92CWVkaSxlYngKKwl4b3IJcjEyZCxyMTFkCisJc2hyZAlyMTRkLHIxNGQsMTEKKwl4b3IJZWRpLGVjeAorCWFkZAllYXgscjEyZAorCXNocmQJcjEzZCxyMTNkLDYKKwlhbmQJcjE1ZCxlZGkKKwl4b3IJcjE0ZCxlYngKKwlhZGQJZWF4LHIxM2QKKwl4b3IJcjE1ZCxlY3gKKwlzaHJkCXIxNGQscjE0ZCwyCisJYWRkCXI4ZCxlYXgKKwlhZGQJZWF4LHIxNWQKKwltb3YJcjEzZCxyOGQKKwlhZGQJcjE0ZCxlYXgKKwltb3YJcmRpLFFXT1JEWygoNjQrMCkpK3JzcF0KKwltb3YJZWF4LHIxNGQKKworCWFkZAllYXgsRFdPUkRbcmRpXQorCWxlYQlyc2ksWzY0K3JzaV0KKwlhZGQJZWJ4LERXT1JEWzQrcmRpXQorCWFkZAllY3gsRFdPUkRbOCtyZGldCisJYWRkCWVkeCxEV09SRFsxMityZGldCisJYWRkCXI4ZCxEV09SRFsxNityZGldCisJYWRkCXI5ZCxEV09SRFsyMCtyZGldCisJYWRkCXIxMGQsRFdPUkRbMjQrcmRpXQorCWFkZAlyMTFkLERXT1JEWzI4K3JkaV0KKworCWNtcAlyc2ksUVdPUkRbKCg2NCsxNikpK3JzcF0KKworCW1vdglEV09SRFtyZGldLGVheAorCW1vdglEV09SRFs0K3JkaV0sZWJ4CisJbW92CURXT1JEWzgrcmRpXSxlY3gKKwltb3YJRFdPUkRbMTIrcmRpXSxlZHgKKwltb3YJRFdPUkRbMTYrcmRpXSxyOGQKKwltb3YJRFdPUkRbMjArcmRpXSxyOWQKKwltb3YJRFdPUkRbMjQrcmRpXSxyMTBkCisJbW92CURXT1JEWzI4K3JkaV0scjExZAorCWpiCU5FQVIgJEwkbG9vcF9hdngKKworCW1vdglyc2ksUVdPUkRbODgrcnNwXQorCisJdnplcm91cHBlcgorCW1vdmFwcwl4bW02LFhNTVdPUkRbKCg2NCszMikpK3JzcF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWygoNjQrNDgpKStyc3BdCisJbW92YXBzCXhtbTgsWE1NV09SRFsoKDY0KzY0KSkrcnNwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbKCg2NCs4MCkpK3JzcF0KKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcnNpXQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JzaV0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyc2ldCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcnNpXQorCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JzaV0KKworCWxlYQlyc3AsW3JzaV0KKworJEwkZXBpbG9ndWVfYXZ4OgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eDoKK0VYVEVSTglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisKK0FMSUdOCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCW1vdglyc2ksUVdPUkRbOCtyOV0KKwltb3YJcjExLFFXT1JEWzU2K3I5XQorCisJbW92CXIxMGQsRFdPUkRbcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fcHJvbG9ndWUKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkaW5fcHJvbG9ndWUKKwltb3YJcnNpLHJheAorCW1vdglyYXgsUVdPUkRbKCg2NCsyNCkpK3JheF0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JheF0KKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisKKwlsZWEJcjEwLFskTCRlcGlsb2d1ZV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fcHJvbG9ndWUKKworCWxlYQlyc2ksWygoNjQrMzIpKStyc2ldCisJbGVhCXJkaSxbNTEyK3I4XQorCW1vdgllY3gsOAorCURECTB4YTU0OGYzZmMKKworJEwkaW5fcHJvbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JheF0KKwltb3YJcnNpLFFXT1JEWzE2K3JheF0KKwltb3YJUVdPUkRbMTUyK3I4XSxyYXgKKwltb3YJUVdPUkRbMTY4K3I4XSxyc2kKKwltb3YJUVdPUkRbMTc2K3I4XSxyZGkKKworCW1vdglyZGksUVdPUkRbNDArcjldCisJbW92CXJzaSxyOAorCW1vdgllY3gsMTU0CisJREQJMHhhNTQ4ZjNmYworCisJbW92CXJzaSxyOQorCXhvcglyY3gscmN4CisJbW92CXJkeCxRV09SRFs4K3JzaV0KKwltb3YJcjgsUVdPUkRbcnNpXQorCW1vdglyOSxRV09SRFsxNityc2ldCisJbW92CXIxMCxRV09SRFs0MCtyc2ldCisJbGVhCXIxMSxbNTYrcnNpXQorCWxlYQlyMTIsWzI0K3JzaV0KKwltb3YJUVdPUkRbMzIrcnNwXSxyMTAKKwltb3YJUVdPUkRbNDArcnNwXSxyMTEKKwltb3YJUVdPUkRbNDgrcnNwXSxyMTIKKwltb3YJUVdPUkRbNTYrcnNwXSxyY3gKKwljYWxsCVFXT1JEW19faW1wX1J0bFZpcnR1YWxVbndpbmRdCisKKwltb3YJZWF4LDEKKwlhZGQJcnNwLDY0CisJcG9wZnEKKwlwb3AJcjE1CisJcG9wCXIxNAorCXBvcAlyMTMKKwlwb3AJcjEyCisJcG9wCXJicAorCXBvcAlyYngKKwlwb3AJcmRpCisJcG9wCXJzaQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCitzZWN0aW9uCS5wZGF0YSByZGF0YSBhbGlnbj00CitBTElHTgk0CisJREQJJEwkU0VIX2JlZ2luX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2JlZ2luX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX3Nzc2UzIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2JlZ2luX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2F2eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9hdnggd3J0IC4uaW1hZ2ViYXNlCitzZWN0aW9uCS54ZGF0YSByZGF0YSBhbGlnbj04CitBTElHTgk4CiskTCRTRUhfaW5mb19zaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKK0RCCTksMCwwLDAKKwlERAlzZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJHByb2xvZ3VlIHdydCAuLmltYWdlYmFzZSwkTCRlcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX3Nzc2UzOgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcHJvbG9ndWVfc3NzZTMgd3J0IC4uaW1hZ2ViYXNlLCRMJGVwaWxvZ3VlX3Nzc2UzIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcHJvbG9ndWVfYXZ4IHdydCAuLmltYWdlYmFzZSwkTCRlcGlsb2d1ZV9hdnggd3J0IC4uaW1hZ2ViYXNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLXg4Nl82NC5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUvc2hhNTEyLXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0NTczMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS9zaGE1MTIteDg2XzY0LmFzbQpAQCAtMCwwICsxLDQyNjUgQEAKK2RlZmF1bHQJcmVsCislZGVmaW5lIFhNTVdPUkQKKyVkZWZpbmUgWU1NV09SRAorJWRlZmluZSBaTU1XT1JECitzZWN0aW9uCS50ZXh0IGNvZGUgYWxpZ249NjQKKworCitFWFRFUk4JT1BFTlNTTF9pYTMyY2FwX1AKK2dsb2JhbAlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorCitBTElHTgkxNgorc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXI6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcjoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKworCWxlYQlyMTEsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyOWQsRFdPUkRbcjExXQorCW1vdglyMTBkLERXT1JEWzQrcjExXQorCW1vdglyMTFkLERXT1JEWzgrcjExXQorCXRlc3QJcjEwZCwyMDQ4CisJam56CU5FQVIgJEwkeG9wX3Nob3J0Y3V0CisJYW5kCXI5ZCwxMDczNzQxODI0CisJYW5kCXIxMGQsMjY4NDM1OTY4CisJb3IJcjEwZCxyOWQKKwljbXAJcjEwZCwxMzQyMTc3NzkyCisJamUJTkVBUiAkTCRhdnhfc2hvcnRjdXQKKwltb3YJcmF4LHJzcAorCisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJc2hsCXJkeCw0CisJc3ViCXJzcCwxNio4KzQqOAorCWxlYQlyZHgsW3JkeCo4K3JzaV0KKwlhbmQJcnNwLC02NAorCW1vdglRV09SRFsoKDEyOCswKSkrcnNwXSxyZGkKKwltb3YJUVdPUkRbKCgxMjgrOCkpK3JzcF0scnNpCisJbW92CVFXT1JEWygoMTI4KzE2KSkrcnNwXSxyZHgKKwltb3YJUVdPUkRbMTUyK3JzcF0scmF4CisKKyRMJHByb2xvZ3VlOgorCisJbW92CXJheCxRV09SRFtyZGldCisJbW92CXJieCxRV09SRFs4K3JkaV0KKwltb3YJcmN4LFFXT1JEWzE2K3JkaV0KKwltb3YJcmR4LFFXT1JEWzI0K3JkaV0KKwltb3YJcjgsUVdPUkRbMzIrcmRpXQorCW1vdglyOSxRV09SRFs0MCtyZGldCisJbW92CXIxMCxRV09SRFs0OCtyZGldCisJbW92CXIxMSxRV09SRFs1NityZGldCisJam1wCU5FQVIgJEwkbG9vcAorCitBTElHTgkxNgorJEwkbG9vcDoKKwltb3YJcmRpLHJieAorCWxlYQlyYnAsW0s1MTJdCisJeG9yCXJkaSxyY3gKKwltb3YJcjEyLFFXT1JEW3JzaV0KKwltb3YJcjEzLHI4CisJbW92CXIxNCxyYXgKKwlic3dhcAlyMTIKKwlyb3IJcjEzLDIzCisJbW92CXIxNSxyOQorCisJeG9yCXIxMyxyOAorCXJvcglyMTQsNQorCXhvcglyMTUscjEwCisKKwltb3YJUVdPUkRbcnNwXSxyMTIKKwl4b3IJcjE0LHJheAorCWFuZAlyMTUscjgKKworCXJvcglyMTMsNAorCWFkZAlyMTIscjExCisJeG9yCXIxNSxyMTAKKworCXJvcglyMTQsNgorCXhvcglyMTMscjgKKwlhZGQJcjEyLHIxNQorCisJbW92CXIxNSxyYXgKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHJheAorCisJeG9yCXIxNSxyYngKKwlyb3IJcjEzLDE0CisJbW92CXIxMSxyYngKKworCWFuZAlyZGkscjE1CisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcjExLHJkaQorCWFkZAlyZHgscjEyCisJYWRkCXIxMSxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCWFkZAlyMTEscjE0CisJbW92CXIxMixRV09SRFs4K3JzaV0KKwltb3YJcjEzLHJkeAorCW1vdglyMTQscjExCisJYnN3YXAJcjEyCisJcm9yCXIxMywyMworCW1vdglyZGkscjgKKworCXhvcglyMTMscmR4CisJcm9yCXIxNCw1CisJeG9yCXJkaSxyOQorCisJbW92CVFXT1JEWzgrcnNwXSxyMTIKKwl4b3IJcjE0LHIxMQorCWFuZAlyZGkscmR4CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHIxMAorCXhvcglyZGkscjkKKworCXJvcglyMTQsNgorCXhvcglyMTMscmR4CisJYWRkCXIxMixyZGkKKworCW1vdglyZGkscjExCisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyMTEKKworCXhvcglyZGkscmF4CisJcm9yCXIxMywxNAorCW1vdglyMTAscmF4CisKKwlhbmQJcjE1LHJkaQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXIxMCxyMTUKKwlhZGQJcmN4LHIxMgorCWFkZAlyMTAscjEyCisKKwlsZWEJcmJwLFsyNCtyYnBdCisJYWRkCXIxMCxyMTQKKwltb3YJcjEyLFFXT1JEWzE2K3JzaV0KKwltb3YJcjEzLHJjeAorCW1vdglyMTQscjEwCisJYnN3YXAJcjEyCisJcm9yCXIxMywyMworCW1vdglyMTUscmR4CisKKwl4b3IJcjEzLHJjeAorCXJvcglyMTQsNQorCXhvcglyMTUscjgKKworCW1vdglRV09SRFsxNityc3BdLHIxMgorCXhvcglyMTQscjEwCisJYW5kCXIxNSxyY3gKKworCXJvcglyMTMsNAorCWFkZAlyMTIscjkKKwl4b3IJcjE1LHI4CisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHJjeAorCWFkZAlyMTIscjE1CisKKwltb3YJcjE1LHIxMAorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscjEwCisKKwl4b3IJcjE1LHIxMQorCXJvcglyMTMsMTQKKwltb3YJcjkscjExCisKKwlhbmQJcmRpLHIxNQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXI5LHJkaQorCWFkZAlyYngscjEyCisJYWRkCXI5LHIxMgorCisJbGVhCXJicCxbOCtyYnBdCisJYWRkCXI5LHIxNAorCW1vdglyMTIsUVdPUkRbMjQrcnNpXQorCW1vdglyMTMscmJ4CisJbW92CXIxNCxyOQorCWJzd2FwCXIxMgorCXJvcglyMTMsMjMKKwltb3YJcmRpLHJjeAorCisJeG9yCXIxMyxyYngKKwlyb3IJcjE0LDUKKwl4b3IJcmRpLHJkeAorCisJbW92CVFXT1JEWzI0K3JzcF0scjEyCisJeG9yCXIxNCxyOQorCWFuZAlyZGkscmJ4CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHI4CisJeG9yCXJkaSxyZHgKKworCXJvcglyMTQsNgorCXhvcglyMTMscmJ4CisJYWRkCXIxMixyZGkKKworCW1vdglyZGkscjkKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHI5CisKKwl4b3IJcmRpLHIxMAorCXJvcglyMTMsMTQKKwltb3YJcjgscjEwCisKKwlhbmQJcjE1LHJkaQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXI4LHIxNQorCWFkZAlyYXgscjEyCisJYWRkCXI4LHIxMgorCisJbGVhCXJicCxbMjQrcmJwXQorCWFkZAlyOCxyMTQKKwltb3YJcjEyLFFXT1JEWzMyK3JzaV0KKwltb3YJcjEzLHJheAorCW1vdglyMTQscjgKKwlic3dhcAlyMTIKKwlyb3IJcjEzLDIzCisJbW92CXIxNSxyYngKKworCXhvcglyMTMscmF4CisJcm9yCXIxNCw1CisJeG9yCXIxNSxyY3gKKworCW1vdglRV09SRFszMityc3BdLHIxMgorCXhvcglyMTQscjgKKwlhbmQJcjE1LHJheAorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyZHgKKwl4b3IJcjE1LHJjeAorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyYXgKKwlhZGQJcjEyLHIxNQorCisJbW92CXIxNSxyOAorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscjgKKworCXhvcglyMTUscjkKKwlyb3IJcjEzLDE0CisJbW92CXJkeCxyOQorCisJYW5kCXJkaSxyMTUKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyZHgscmRpCisJYWRkCXIxMSxyMTIKKwlhZGQJcmR4LHIxMgorCisJbGVhCXJicCxbOCtyYnBdCisJYWRkCXJkeCxyMTQKKwltb3YJcjEyLFFXT1JEWzQwK3JzaV0KKwltb3YJcjEzLHIxMQorCW1vdglyMTQscmR4CisJYnN3YXAJcjEyCisJcm9yCXIxMywyMworCW1vdglyZGkscmF4CisKKwl4b3IJcjEzLHIxMQorCXJvcglyMTQsNQorCXhvcglyZGkscmJ4CisKKwltb3YJUVdPUkRbNDArcnNwXSxyMTIKKwl4b3IJcjE0LHJkeAorCWFuZAlyZGkscjExCisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHJjeAorCXhvcglyZGkscmJ4CisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHIxMQorCWFkZAlyMTIscmRpCisKKwltb3YJcmRpLHJkeAorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscmR4CisKKwl4b3IJcmRpLHI4CisJcm9yCXIxMywxNAorCW1vdglyY3gscjgKKworCWFuZAlyMTUscmRpCisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcmN4LHIxNQorCWFkZAlyMTAscjEyCisJYWRkCXJjeCxyMTIKKworCWxlYQlyYnAsWzI0K3JicF0KKwlhZGQJcmN4LHIxNAorCW1vdglyMTIsUVdPUkRbNDgrcnNpXQorCW1vdglyMTMscjEwCisJbW92CXIxNCxyY3gKKwlic3dhcAlyMTIKKwlyb3IJcjEzLDIzCisJbW92CXIxNSxyMTEKKworCXhvcglyMTMscjEwCisJcm9yCXIxNCw1CisJeG9yCXIxNSxyYXgKKworCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCXhvcglyMTQscmN4CisJYW5kCXIxNSxyMTAKKworCXJvcglyMTMsNAorCWFkZAlyMTIscmJ4CisJeG9yCXIxNSxyYXgKKworCXJvcglyMTQsNgorCXhvcglyMTMscjEwCisJYWRkCXIxMixyMTUKKworCW1vdglyMTUscmN4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyY3gKKworCXhvcglyMTUscmR4CisJcm9yCXIxMywxNAorCW1vdglyYngscmR4CisKKwlhbmQJcmRpLHIxNQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJieCxyZGkKKwlhZGQJcjkscjEyCisJYWRkCXJieCxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCWFkZAlyYngscjE0CisJbW92CXIxMixRV09SRFs1Nityc2ldCisJbW92CXIxMyxyOQorCW1vdglyMTQscmJ4CisJYnN3YXAJcjEyCisJcm9yCXIxMywyMworCW1vdglyZGkscjEwCisKKwl4b3IJcjEzLHI5CisJcm9yCXIxNCw1CisJeG9yCXJkaSxyMTEKKworCW1vdglRV09SRFs1Nityc3BdLHIxMgorCXhvcglyMTQscmJ4CisJYW5kCXJkaSxyOQorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyYXgKKwl4b3IJcmRpLHIxMQorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyOQorCWFkZAlyMTIscmRpCisKKwltb3YJcmRpLHJieAorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscmJ4CisKKwl4b3IJcmRpLHJjeAorCXJvcglyMTMsMTQKKwltb3YJcmF4LHJjeAorCisJYW5kCXIxNSxyZGkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyYXgscjE1CisJYWRkCXI4LHIxMgorCWFkZAlyYXgscjEyCisKKwlsZWEJcmJwLFsyNCtyYnBdCisJYWRkCXJheCxyMTQKKwltb3YJcjEyLFFXT1JEWzY0K3JzaV0KKwltb3YJcjEzLHI4CisJbW92CXIxNCxyYXgKKwlic3dhcAlyMTIKKwlyb3IJcjEzLDIzCisJbW92CXIxNSxyOQorCisJeG9yCXIxMyxyOAorCXJvcglyMTQsNQorCXhvcglyMTUscjEwCisKKwltb3YJUVdPUkRbNjQrcnNwXSxyMTIKKwl4b3IJcjE0LHJheAorCWFuZAlyMTUscjgKKworCXJvcglyMTMsNAorCWFkZAlyMTIscjExCisJeG9yCXIxNSxyMTAKKworCXJvcglyMTQsNgorCXhvcglyMTMscjgKKwlhZGQJcjEyLHIxNQorCisJbW92CXIxNSxyYXgKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHJheAorCisJeG9yCXIxNSxyYngKKwlyb3IJcjEzLDE0CisJbW92CXIxMSxyYngKKworCWFuZAlyZGkscjE1CisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcjExLHJkaQorCWFkZAlyZHgscjEyCisJYWRkCXIxMSxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCWFkZAlyMTEscjE0CisJbW92CXIxMixRV09SRFs3Mityc2ldCisJbW92CXIxMyxyZHgKKwltb3YJcjE0LHIxMQorCWJzd2FwCXIxMgorCXJvcglyMTMsMjMKKwltb3YJcmRpLHI4CisKKwl4b3IJcjEzLHJkeAorCXJvcglyMTQsNQorCXhvcglyZGkscjkKKworCW1vdglRV09SRFs3Mityc3BdLHIxMgorCXhvcglyMTQscjExCisJYW5kCXJkaSxyZHgKKworCXJvcglyMTMsNAorCWFkZAlyMTIscjEwCisJeG9yCXJkaSxyOQorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyZHgKKwlhZGQJcjEyLHJkaQorCisJbW92CXJkaSxyMTEKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHIxMQorCisJeG9yCXJkaSxyYXgKKwlyb3IJcjEzLDE0CisJbW92CXIxMCxyYXgKKworCWFuZAlyMTUscmRpCisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcjEwLHIxNQorCWFkZAlyY3gscjEyCisJYWRkCXIxMCxyMTIKKworCWxlYQlyYnAsWzI0K3JicF0KKwlhZGQJcjEwLHIxNAorCW1vdglyMTIsUVdPUkRbODArcnNpXQorCW1vdglyMTMscmN4CisJbW92CXIxNCxyMTAKKwlic3dhcAlyMTIKKwlyb3IJcjEzLDIzCisJbW92CXIxNSxyZHgKKworCXhvcglyMTMscmN4CisJcm9yCXIxNCw1CisJeG9yCXIxNSxyOAorCisJbW92CVFXT1JEWzgwK3JzcF0scjEyCisJeG9yCXIxNCxyMTAKKwlhbmQJcjE1LHJjeAorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyOQorCXhvcglyMTUscjgKKworCXJvcglyMTQsNgorCXhvcglyMTMscmN4CisJYWRkCXIxMixyMTUKKworCW1vdglyMTUscjEwCisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyMTAKKworCXhvcglyMTUscjExCisJcm9yCXIxMywxNAorCW1vdglyOSxyMTEKKworCWFuZAlyZGkscjE1CisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcjkscmRpCisJYWRkCXJieCxyMTIKKwlhZGQJcjkscjEyCisKKwlsZWEJcmJwLFs4K3JicF0KKwlhZGQJcjkscjE0CisJbW92CXIxMixRV09SRFs4OCtyc2ldCisJbW92CXIxMyxyYngKKwltb3YJcjE0LHI5CisJYnN3YXAJcjEyCisJcm9yCXIxMywyMworCW1vdglyZGkscmN4CisKKwl4b3IJcjEzLHJieAorCXJvcglyMTQsNQorCXhvcglyZGkscmR4CisKKwltb3YJUVdPUkRbODgrcnNwXSxyMTIKKwl4b3IJcjE0LHI5CisJYW5kCXJkaSxyYngKKworCXJvcglyMTMsNAorCWFkZAlyMTIscjgKKwl4b3IJcmRpLHJkeAorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyYngKKwlhZGQJcjEyLHJkaQorCisJbW92CXJkaSxyOQorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscjkKKworCXhvcglyZGkscjEwCisJcm9yCXIxMywxNAorCW1vdglyOCxyMTAKKworCWFuZAlyMTUscmRpCisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcjgscjE1CisJYWRkCXJheCxyMTIKKwlhZGQJcjgscjEyCisKKwlsZWEJcmJwLFsyNCtyYnBdCisJYWRkCXI4LHIxNAorCW1vdglyMTIsUVdPUkRbOTYrcnNpXQorCW1vdglyMTMscmF4CisJbW92CXIxNCxyOAorCWJzd2FwCXIxMgorCXJvcglyMTMsMjMKKwltb3YJcjE1LHJieAorCisJeG9yCXIxMyxyYXgKKwlyb3IJcjE0LDUKKwl4b3IJcjE1LHJjeAorCisJbW92CVFXT1JEWzk2K3JzcF0scjEyCisJeG9yCXIxNCxyOAorCWFuZAlyMTUscmF4CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHJkeAorCXhvcglyMTUscmN4CisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHJheAorCWFkZAlyMTIscjE1CisKKwltb3YJcjE1LHI4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyOAorCisJeG9yCXIxNSxyOQorCXJvcglyMTMsMTQKKwltb3YJcmR4LHI5CisKKwlhbmQJcmRpLHIxNQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJkeCxyZGkKKwlhZGQJcjExLHIxMgorCWFkZAlyZHgscjEyCisKKwlsZWEJcmJwLFs4K3JicF0KKwlhZGQJcmR4LHIxNAorCW1vdglyMTIsUVdPUkRbMTA0K3JzaV0KKwltb3YJcjEzLHIxMQorCW1vdglyMTQscmR4CisJYnN3YXAJcjEyCisJcm9yCXIxMywyMworCW1vdglyZGkscmF4CisKKwl4b3IJcjEzLHIxMQorCXJvcglyMTQsNQorCXhvcglyZGkscmJ4CisKKwltb3YJUVdPUkRbMTA0K3JzcF0scjEyCisJeG9yCXIxNCxyZHgKKwlhbmQJcmRpLHIxMQorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyY3gKKwl4b3IJcmRpLHJieAorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyMTEKKwlhZGQJcjEyLHJkaQorCisJbW92CXJkaSxyZHgKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHJkeAorCisJeG9yCXJkaSxyOAorCXJvcglyMTMsMTQKKwltb3YJcmN4LHI4CisKKwlhbmQJcjE1LHJkaQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJjeCxyMTUKKwlhZGQJcjEwLHIxMgorCWFkZAlyY3gscjEyCisKKwlsZWEJcmJwLFsyNCtyYnBdCisJYWRkCXJjeCxyMTQKKwltb3YJcjEyLFFXT1JEWzExMityc2ldCisJbW92CXIxMyxyMTAKKwltb3YJcjE0LHJjeAorCWJzd2FwCXIxMgorCXJvcglyMTMsMjMKKwltb3YJcjE1LHIxMQorCisJeG9yCXIxMyxyMTAKKwlyb3IJcjE0LDUKKwl4b3IJcjE1LHJheAorCisJbW92CVFXT1JEWzExMityc3BdLHIxMgorCXhvcglyMTQscmN4CisJYW5kCXIxNSxyMTAKKworCXJvcglyMTMsNAorCWFkZAlyMTIscmJ4CisJeG9yCXIxNSxyYXgKKworCXJvcglyMTQsNgorCXhvcglyMTMscjEwCisJYWRkCXIxMixyMTUKKworCW1vdglyMTUscmN4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyY3gKKworCXhvcglyMTUscmR4CisJcm9yCXIxMywxNAorCW1vdglyYngscmR4CisKKwlhbmQJcmRpLHIxNQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJieCxyZGkKKwlhZGQJcjkscjEyCisJYWRkCXJieCxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCWFkZAlyYngscjE0CisJbW92CXIxMixRV09SRFsxMjArcnNpXQorCW1vdglyMTMscjkKKwltb3YJcjE0LHJieAorCWJzd2FwCXIxMgorCXJvcglyMTMsMjMKKwltb3YJcmRpLHIxMAorCisJeG9yCXIxMyxyOQorCXJvcglyMTQsNQorCXhvcglyZGkscjExCisKKwltb3YJUVdPUkRbMTIwK3JzcF0scjEyCisJeG9yCXIxNCxyYngKKwlhbmQJcmRpLHI5CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHJheAorCXhvcglyZGkscjExCisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHI5CisJYWRkCXIxMixyZGkKKworCW1vdglyZGkscmJ4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyYngKKworCXhvcglyZGkscmN4CisJcm9yCXIxMywxNAorCW1vdglyYXgscmN4CisKKwlhbmQJcjE1LHJkaQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJheCxyMTUKKwlhZGQJcjgscjEyCisJYWRkCXJheCxyMTIKKworCWxlYQlyYnAsWzI0K3JicF0KKwlqbXAJTkVBUiAkTCRyb3VuZHNfMTZfeHgKK0FMSUdOCTE2CiskTCRyb3VuZHNfMTZfeHg6CisJbW92CXIxMyxRV09SRFs4K3JzcF0KKwltb3YJcjE1LFFXT1JEWzExMityc3BdCisKKwltb3YJcjEyLHIxMworCXJvcglyMTMsNworCWFkZAlyYXgscjE0CisJbW92CXIxNCxyMTUKKwlyb3IJcjE1LDQyCisKKwl4b3IJcjEzLHIxMgorCXNocglyMTIsNworCXJvcglyMTMsMQorCXhvcglyMTUscjE0CisJc2hyCXIxNCw2CisKKwlyb3IJcjE1LDE5CisJeG9yCXIxMixyMTMKKwl4b3IJcjE1LHIxNAorCWFkZAlyMTIsUVdPUkRbNzIrcnNwXQorCisJYWRkCXIxMixRV09SRFtyc3BdCisJbW92CXIxMyxyOAorCWFkZAlyMTIscjE1CisJbW92CXIxNCxyYXgKKwlyb3IJcjEzLDIzCisJbW92CXIxNSxyOQorCisJeG9yCXIxMyxyOAorCXJvcglyMTQsNQorCXhvcglyMTUscjEwCisKKwltb3YJUVdPUkRbcnNwXSxyMTIKKwl4b3IJcjE0LHJheAorCWFuZAlyMTUscjgKKworCXJvcglyMTMsNAorCWFkZAlyMTIscjExCisJeG9yCXIxNSxyMTAKKworCXJvcglyMTQsNgorCXhvcglyMTMscjgKKwlhZGQJcjEyLHIxNQorCisJbW92CXIxNSxyYXgKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHJheAorCisJeG9yCXIxNSxyYngKKwlyb3IJcjEzLDE0CisJbW92CXIxMSxyYngKKworCWFuZAlyZGkscjE1CisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcjExLHJkaQorCWFkZAlyZHgscjEyCisJYWRkCXIxMSxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCW1vdglyMTMsUVdPUkRbMTYrcnNwXQorCW1vdglyZGksUVdPUkRbMTIwK3JzcF0KKworCW1vdglyMTIscjEzCisJcm9yCXIxMyw3CisJYWRkCXIxMSxyMTQKKwltb3YJcjE0LHJkaQorCXJvcglyZGksNDIKKworCXhvcglyMTMscjEyCisJc2hyCXIxMiw3CisJcm9yCXIxMywxCisJeG9yCXJkaSxyMTQKKwlzaHIJcjE0LDYKKworCXJvcglyZGksMTkKKwl4b3IJcjEyLHIxMworCXhvcglyZGkscjE0CisJYWRkCXIxMixRV09SRFs4MCtyc3BdCisKKwlhZGQJcjEyLFFXT1JEWzgrcnNwXQorCW1vdglyMTMscmR4CisJYWRkCXIxMixyZGkKKwltb3YJcjE0LHIxMQorCXJvcglyMTMsMjMKKwltb3YJcmRpLHI4CisKKwl4b3IJcjEzLHJkeAorCXJvcglyMTQsNQorCXhvcglyZGkscjkKKworCW1vdglRV09SRFs4K3JzcF0scjEyCisJeG9yCXIxNCxyMTEKKwlhbmQJcmRpLHJkeAorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyMTAKKwl4b3IJcmRpLHI5CisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHJkeAorCWFkZAlyMTIscmRpCisKKwltb3YJcmRpLHIxMQorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscjExCisKKwl4b3IJcmRpLHJheAorCXJvcglyMTMsMTQKKwltb3YJcjEwLHJheAorCisJYW5kCXIxNSxyZGkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyMTAscjE1CisJYWRkCXJjeCxyMTIKKwlhZGQJcjEwLHIxMgorCisJbGVhCXJicCxbMjQrcmJwXQorCW1vdglyMTMsUVdPUkRbMjQrcnNwXQorCW1vdglyMTUsUVdPUkRbcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcjEwLHIxNAorCW1vdglyMTQscjE1CisJcm9yCXIxNSw0MgorCisJeG9yCXIxMyxyMTIKKwlzaHIJcjEyLDcKKwlyb3IJcjEzLDEKKwl4b3IJcjE1LHIxNAorCXNocglyMTQsNgorCisJcm9yCXIxNSwxOQorCXhvcglyMTIscjEzCisJeG9yCXIxNSxyMTQKKwlhZGQJcjEyLFFXT1JEWzg4K3JzcF0KKworCWFkZAlyMTIsUVdPUkRbMTYrcnNwXQorCW1vdglyMTMscmN4CisJYWRkCXIxMixyMTUKKwltb3YJcjE0LHIxMAorCXJvcglyMTMsMjMKKwltb3YJcjE1LHJkeAorCisJeG9yCXIxMyxyY3gKKwlyb3IJcjE0LDUKKwl4b3IJcjE1LHI4CisKKwltb3YJUVdPUkRbMTYrcnNwXSxyMTIKKwl4b3IJcjE0LHIxMAorCWFuZAlyMTUscmN4CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHI5CisJeG9yCXIxNSxyOAorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyY3gKKwlhZGQJcjEyLHIxNQorCisJbW92CXIxNSxyMTAKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHIxMAorCisJeG9yCXIxNSxyMTEKKwlyb3IJcjEzLDE0CisJbW92CXI5LHIxMQorCisJYW5kCXJkaSxyMTUKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyOSxyZGkKKwlhZGQJcmJ4LHIxMgorCWFkZAlyOSxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCW1vdglyMTMsUVdPUkRbMzIrcnNwXQorCW1vdglyZGksUVdPUkRbOCtyc3BdCisKKwltb3YJcjEyLHIxMworCXJvcglyMTMsNworCWFkZAlyOSxyMTQKKwltb3YJcjE0LHJkaQorCXJvcglyZGksNDIKKworCXhvcglyMTMscjEyCisJc2hyCXIxMiw3CisJcm9yCXIxMywxCisJeG9yCXJkaSxyMTQKKwlzaHIJcjE0LDYKKworCXJvcglyZGksMTkKKwl4b3IJcjEyLHIxMworCXhvcglyZGkscjE0CisJYWRkCXIxMixRV09SRFs5Nityc3BdCisKKwlhZGQJcjEyLFFXT1JEWzI0K3JzcF0KKwltb3YJcjEzLHJieAorCWFkZAlyMTIscmRpCisJbW92CXIxNCxyOQorCXJvcglyMTMsMjMKKwltb3YJcmRpLHJjeAorCisJeG9yCXIxMyxyYngKKwlyb3IJcjE0LDUKKwl4b3IJcmRpLHJkeAorCisJbW92CVFXT1JEWzI0K3JzcF0scjEyCisJeG9yCXIxNCxyOQorCWFuZAlyZGkscmJ4CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHI4CisJeG9yCXJkaSxyZHgKKworCXJvcglyMTQsNgorCXhvcglyMTMscmJ4CisJYWRkCXIxMixyZGkKKworCW1vdglyZGkscjkKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHI5CisKKwl4b3IJcmRpLHIxMAorCXJvcglyMTMsMTQKKwltb3YJcjgscjEwCisKKwlhbmQJcjE1LHJkaQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXI4LHIxNQorCWFkZAlyYXgscjEyCisJYWRkCXI4LHIxMgorCisJbGVhCXJicCxbMjQrcmJwXQorCW1vdglyMTMsUVdPUkRbNDArcnNwXQorCW1vdglyMTUsUVdPUkRbMTYrcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcjgscjE0CisJbW92CXIxNCxyMTUKKwlyb3IJcjE1LDQyCisKKwl4b3IJcjEzLHIxMgorCXNocglyMTIsNworCXJvcglyMTMsMQorCXhvcglyMTUscjE0CisJc2hyCXIxNCw2CisKKwlyb3IJcjE1LDE5CisJeG9yCXIxMixyMTMKKwl4b3IJcjE1LHIxNAorCWFkZAlyMTIsUVdPUkRbMTA0K3JzcF0KKworCWFkZAlyMTIsUVdPUkRbMzIrcnNwXQorCW1vdglyMTMscmF4CisJYWRkCXIxMixyMTUKKwltb3YJcjE0LHI4CisJcm9yCXIxMywyMworCW1vdglyMTUscmJ4CisKKwl4b3IJcjEzLHJheAorCXJvcglyMTQsNQorCXhvcglyMTUscmN4CisKKwltb3YJUVdPUkRbMzIrcnNwXSxyMTIKKwl4b3IJcjE0LHI4CisJYW5kCXIxNSxyYXgKKworCXJvcglyMTMsNAorCWFkZAlyMTIscmR4CisJeG9yCXIxNSxyY3gKKworCXJvcglyMTQsNgorCXhvcglyMTMscmF4CisJYWRkCXIxMixyMTUKKworCW1vdglyMTUscjgKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHI4CisKKwl4b3IJcjE1LHI5CisJcm9yCXIxMywxNAorCW1vdglyZHgscjkKKworCWFuZAlyZGkscjE1CisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcmR4LHJkaQorCWFkZAlyMTEscjEyCisJYWRkCXJkeCxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCW1vdglyMTMsUVdPUkRbNDgrcnNwXQorCW1vdglyZGksUVdPUkRbMjQrcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcmR4LHIxNAorCW1vdglyMTQscmRpCisJcm9yCXJkaSw0MgorCisJeG9yCXIxMyxyMTIKKwlzaHIJcjEyLDcKKwlyb3IJcjEzLDEKKwl4b3IJcmRpLHIxNAorCXNocglyMTQsNgorCisJcm9yCXJkaSwxOQorCXhvcglyMTIscjEzCisJeG9yCXJkaSxyMTQKKwlhZGQJcjEyLFFXT1JEWzExMityc3BdCisKKwlhZGQJcjEyLFFXT1JEWzQwK3JzcF0KKwltb3YJcjEzLHIxMQorCWFkZAlyMTIscmRpCisJbW92CXIxNCxyZHgKKwlyb3IJcjEzLDIzCisJbW92CXJkaSxyYXgKKworCXhvcglyMTMscjExCisJcm9yCXIxNCw1CisJeG9yCXJkaSxyYngKKworCW1vdglRV09SRFs0MCtyc3BdLHIxMgorCXhvcglyMTQscmR4CisJYW5kCXJkaSxyMTEKKworCXJvcglyMTMsNAorCWFkZAlyMTIscmN4CisJeG9yCXJkaSxyYngKKworCXJvcglyMTQsNgorCXhvcglyMTMscjExCisJYWRkCXIxMixyZGkKKworCW1vdglyZGkscmR4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyZHgKKworCXhvcglyZGkscjgKKwlyb3IJcjEzLDE0CisJbW92CXJjeCxyOAorCisJYW5kCXIxNSxyZGkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyY3gscjE1CisJYWRkCXIxMCxyMTIKKwlhZGQJcmN4LHIxMgorCisJbGVhCXJicCxbMjQrcmJwXQorCW1vdglyMTMsUVdPUkRbNTYrcnNwXQorCW1vdglyMTUsUVdPUkRbMzIrcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcmN4LHIxNAorCW1vdglyMTQscjE1CisJcm9yCXIxNSw0MgorCisJeG9yCXIxMyxyMTIKKwlzaHIJcjEyLDcKKwlyb3IJcjEzLDEKKwl4b3IJcjE1LHIxNAorCXNocglyMTQsNgorCisJcm9yCXIxNSwxOQorCXhvcglyMTIscjEzCisJeG9yCXIxNSxyMTQKKwlhZGQJcjEyLFFXT1JEWzEyMCtyc3BdCisKKwlhZGQJcjEyLFFXT1JEWzQ4K3JzcF0KKwltb3YJcjEzLHIxMAorCWFkZAlyMTIscjE1CisJbW92CXIxNCxyY3gKKwlyb3IJcjEzLDIzCisJbW92CXIxNSxyMTEKKworCXhvcglyMTMscjEwCisJcm9yCXIxNCw1CisJeG9yCXIxNSxyYXgKKworCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCXhvcglyMTQscmN4CisJYW5kCXIxNSxyMTAKKworCXJvcglyMTMsNAorCWFkZAlyMTIscmJ4CisJeG9yCXIxNSxyYXgKKworCXJvcglyMTQsNgorCXhvcglyMTMscjEwCisJYWRkCXIxMixyMTUKKworCW1vdglyMTUscmN4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyY3gKKworCXhvcglyMTUscmR4CisJcm9yCXIxMywxNAorCW1vdglyYngscmR4CisKKwlhbmQJcmRpLHIxNQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJieCxyZGkKKwlhZGQJcjkscjEyCisJYWRkCXJieCxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCW1vdglyMTMsUVdPUkRbNjQrcnNwXQorCW1vdglyZGksUVdPUkRbNDArcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcmJ4LHIxNAorCW1vdglyMTQscmRpCisJcm9yCXJkaSw0MgorCisJeG9yCXIxMyxyMTIKKwlzaHIJcjEyLDcKKwlyb3IJcjEzLDEKKwl4b3IJcmRpLHIxNAorCXNocglyMTQsNgorCisJcm9yCXJkaSwxOQorCXhvcglyMTIscjEzCisJeG9yCXJkaSxyMTQKKwlhZGQJcjEyLFFXT1JEW3JzcF0KKworCWFkZAlyMTIsUVdPUkRbNTYrcnNwXQorCW1vdglyMTMscjkKKwlhZGQJcjEyLHJkaQorCW1vdglyMTQscmJ4CisJcm9yCXIxMywyMworCW1vdglyZGkscjEwCisKKwl4b3IJcjEzLHI5CisJcm9yCXIxNCw1CisJeG9yCXJkaSxyMTEKKworCW1vdglRV09SRFs1Nityc3BdLHIxMgorCXhvcglyMTQscmJ4CisJYW5kCXJkaSxyOQorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyYXgKKwl4b3IJcmRpLHIxMQorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyOQorCWFkZAlyMTIscmRpCisKKwltb3YJcmRpLHJieAorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscmJ4CisKKwl4b3IJcmRpLHJjeAorCXJvcglyMTMsMTQKKwltb3YJcmF4LHJjeAorCisJYW5kCXIxNSxyZGkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyYXgscjE1CisJYWRkCXI4LHIxMgorCWFkZAlyYXgscjEyCisKKwlsZWEJcmJwLFsyNCtyYnBdCisJbW92CXIxMyxRV09SRFs3Mityc3BdCisJbW92CXIxNSxRV09SRFs0OCtyc3BdCisKKwltb3YJcjEyLHIxMworCXJvcglyMTMsNworCWFkZAlyYXgscjE0CisJbW92CXIxNCxyMTUKKwlyb3IJcjE1LDQyCisKKwl4b3IJcjEzLHIxMgorCXNocglyMTIsNworCXJvcglyMTMsMQorCXhvcglyMTUscjE0CisJc2hyCXIxNCw2CisKKwlyb3IJcjE1LDE5CisJeG9yCXIxMixyMTMKKwl4b3IJcjE1LHIxNAorCWFkZAlyMTIsUVdPUkRbOCtyc3BdCisKKwlhZGQJcjEyLFFXT1JEWzY0K3JzcF0KKwltb3YJcjEzLHI4CisJYWRkCXIxMixyMTUKKwltb3YJcjE0LHJheAorCXJvcglyMTMsMjMKKwltb3YJcjE1LHI5CisKKwl4b3IJcjEzLHI4CisJcm9yCXIxNCw1CisJeG9yCXIxNSxyMTAKKworCW1vdglRV09SRFs2NCtyc3BdLHIxMgorCXhvcglyMTQscmF4CisJYW5kCXIxNSxyOAorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyMTEKKwl4b3IJcjE1LHIxMAorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyOAorCWFkZAlyMTIscjE1CisKKwltb3YJcjE1LHJheAorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscmF4CisKKwl4b3IJcjE1LHJieAorCXJvcglyMTMsMTQKKwltb3YJcjExLHJieAorCisJYW5kCXJkaSxyMTUKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyMTEscmRpCisJYWRkCXJkeCxyMTIKKwlhZGQJcjExLHIxMgorCisJbGVhCXJicCxbOCtyYnBdCisJbW92CXIxMyxRV09SRFs4MCtyc3BdCisJbW92CXJkaSxRV09SRFs1Nityc3BdCisKKwltb3YJcjEyLHIxMworCXJvcglyMTMsNworCWFkZAlyMTEscjE0CisJbW92CXIxNCxyZGkKKwlyb3IJcmRpLDQyCisKKwl4b3IJcjEzLHIxMgorCXNocglyMTIsNworCXJvcglyMTMsMQorCXhvcglyZGkscjE0CisJc2hyCXIxNCw2CisKKwlyb3IJcmRpLDE5CisJeG9yCXIxMixyMTMKKwl4b3IJcmRpLHIxNAorCWFkZAlyMTIsUVdPUkRbMTYrcnNwXQorCisJYWRkCXIxMixRV09SRFs3Mityc3BdCisJbW92CXIxMyxyZHgKKwlhZGQJcjEyLHJkaQorCW1vdglyMTQscjExCisJcm9yCXIxMywyMworCW1vdglyZGkscjgKKworCXhvcglyMTMscmR4CisJcm9yCXIxNCw1CisJeG9yCXJkaSxyOQorCisJbW92CVFXT1JEWzcyK3JzcF0scjEyCisJeG9yCXIxNCxyMTEKKwlhbmQJcmRpLHJkeAorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyMTAKKwl4b3IJcmRpLHI5CisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHJkeAorCWFkZAlyMTIscmRpCisKKwltb3YJcmRpLHIxMQorCWFkZAlyMTIsUVdPUkRbcmJwXQorCXhvcglyMTQscjExCisKKwl4b3IJcmRpLHJheAorCXJvcglyMTMsMTQKKwltb3YJcjEwLHJheAorCisJYW5kCXIxNSxyZGkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyMTAscjE1CisJYWRkCXJjeCxyMTIKKwlhZGQJcjEwLHIxMgorCisJbGVhCXJicCxbMjQrcmJwXQorCW1vdglyMTMsUVdPUkRbODgrcnNwXQorCW1vdglyMTUsUVdPUkRbNjQrcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcjEwLHIxNAorCW1vdglyMTQscjE1CisJcm9yCXIxNSw0MgorCisJeG9yCXIxMyxyMTIKKwlzaHIJcjEyLDcKKwlyb3IJcjEzLDEKKwl4b3IJcjE1LHIxNAorCXNocglyMTQsNgorCisJcm9yCXIxNSwxOQorCXhvcglyMTIscjEzCisJeG9yCXIxNSxyMTQKKwlhZGQJcjEyLFFXT1JEWzI0K3JzcF0KKworCWFkZAlyMTIsUVdPUkRbODArcnNwXQorCW1vdglyMTMscmN4CisJYWRkCXIxMixyMTUKKwltb3YJcjE0LHIxMAorCXJvcglyMTMsMjMKKwltb3YJcjE1LHJkeAorCisJeG9yCXIxMyxyY3gKKwlyb3IJcjE0LDUKKwl4b3IJcjE1LHI4CisKKwltb3YJUVdPUkRbODArcnNwXSxyMTIKKwl4b3IJcjE0LHIxMAorCWFuZAlyMTUscmN4CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHI5CisJeG9yCXIxNSxyOAorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyY3gKKwlhZGQJcjEyLHIxNQorCisJbW92CXIxNSxyMTAKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHIxMAorCisJeG9yCXIxNSxyMTEKKwlyb3IJcjEzLDE0CisJbW92CXI5LHIxMQorCisJYW5kCXJkaSxyMTUKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyOSxyZGkKKwlhZGQJcmJ4LHIxMgorCWFkZAlyOSxyMTIKKworCWxlYQlyYnAsWzgrcmJwXQorCW1vdglyMTMsUVdPUkRbOTYrcnNwXQorCW1vdglyZGksUVdPUkRbNzIrcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcjkscjE0CisJbW92CXIxNCxyZGkKKwlyb3IJcmRpLDQyCisKKwl4b3IJcjEzLHIxMgorCXNocglyMTIsNworCXJvcglyMTMsMQorCXhvcglyZGkscjE0CisJc2hyCXIxNCw2CisKKwlyb3IJcmRpLDE5CisJeG9yCXIxMixyMTMKKwl4b3IJcmRpLHIxNAorCWFkZAlyMTIsUVdPUkRbMzIrcnNwXQorCisJYWRkCXIxMixRV09SRFs4OCtyc3BdCisJbW92CXIxMyxyYngKKwlhZGQJcjEyLHJkaQorCW1vdglyMTQscjkKKwlyb3IJcjEzLDIzCisJbW92CXJkaSxyY3gKKworCXhvcglyMTMscmJ4CisJcm9yCXIxNCw1CisJeG9yCXJkaSxyZHgKKworCW1vdglRV09SRFs4OCtyc3BdLHIxMgorCXhvcglyMTQscjkKKwlhbmQJcmRpLHJieAorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyOAorCXhvcglyZGkscmR4CisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHJieAorCWFkZAlyMTIscmRpCisKKwltb3YJcmRpLHI5CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyOQorCisJeG9yCXJkaSxyMTAKKwlyb3IJcjEzLDE0CisJbW92CXI4LHIxMAorCisJYW5kCXIxNSxyZGkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyOCxyMTUKKwlhZGQJcmF4LHIxMgorCWFkZAlyOCxyMTIKKworCWxlYQlyYnAsWzI0K3JicF0KKwltb3YJcjEzLFFXT1JEWzEwNCtyc3BdCisJbW92CXIxNSxRV09SRFs4MCtyc3BdCisKKwltb3YJcjEyLHIxMworCXJvcglyMTMsNworCWFkZAlyOCxyMTQKKwltb3YJcjE0LHIxNQorCXJvcglyMTUsNDIKKworCXhvcglyMTMscjEyCisJc2hyCXIxMiw3CisJcm9yCXIxMywxCisJeG9yCXIxNSxyMTQKKwlzaHIJcjE0LDYKKworCXJvcglyMTUsMTkKKwl4b3IJcjEyLHIxMworCXhvcglyMTUscjE0CisJYWRkCXIxMixRV09SRFs0MCtyc3BdCisKKwlhZGQJcjEyLFFXT1JEWzk2K3JzcF0KKwltb3YJcjEzLHJheAorCWFkZAlyMTIscjE1CisJbW92CXIxNCxyOAorCXJvcglyMTMsMjMKKwltb3YJcjE1LHJieAorCisJeG9yCXIxMyxyYXgKKwlyb3IJcjE0LDUKKwl4b3IJcjE1LHJjeAorCisJbW92CVFXT1JEWzk2K3JzcF0scjEyCisJeG9yCXIxNCxyOAorCWFuZAlyMTUscmF4CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHJkeAorCXhvcglyMTUscmN4CisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHJheAorCWFkZAlyMTIscjE1CisKKwltb3YJcjE1LHI4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyOAorCisJeG9yCXIxNSxyOQorCXJvcglyMTMsMTQKKwltb3YJcmR4LHI5CisKKwlhbmQJcmRpLHIxNQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJkeCxyZGkKKwlhZGQJcjExLHIxMgorCWFkZAlyZHgscjEyCisKKwlsZWEJcmJwLFs4K3JicF0KKwltb3YJcjEzLFFXT1JEWzExMityc3BdCisJbW92CXJkaSxRV09SRFs4OCtyc3BdCisKKwltb3YJcjEyLHIxMworCXJvcglyMTMsNworCWFkZAlyZHgscjE0CisJbW92CXIxNCxyZGkKKwlyb3IJcmRpLDQyCisKKwl4b3IJcjEzLHIxMgorCXNocglyMTIsNworCXJvcglyMTMsMQorCXhvcglyZGkscjE0CisJc2hyCXIxNCw2CisKKwlyb3IJcmRpLDE5CisJeG9yCXIxMixyMTMKKwl4b3IJcmRpLHIxNAorCWFkZAlyMTIsUVdPUkRbNDgrcnNwXQorCisJYWRkCXIxMixRV09SRFsxMDQrcnNwXQorCW1vdglyMTMscjExCisJYWRkCXIxMixyZGkKKwltb3YJcjE0LHJkeAorCXJvcglyMTMsMjMKKwltb3YJcmRpLHJheAorCisJeG9yCXIxMyxyMTEKKwlyb3IJcjE0LDUKKwl4b3IJcmRpLHJieAorCisJbW92CVFXT1JEWzEwNCtyc3BdLHIxMgorCXhvcglyMTQscmR4CisJYW5kCXJkaSxyMTEKKworCXJvcglyMTMsNAorCWFkZAlyMTIscmN4CisJeG9yCXJkaSxyYngKKworCXJvcglyMTQsNgorCXhvcglyMTMscjExCisJYWRkCXIxMixyZGkKKworCW1vdglyZGkscmR4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyZHgKKworCXhvcglyZGkscjgKKwlyb3IJcjEzLDE0CisJbW92CXJjeCxyOAorCisJYW5kCXIxNSxyZGkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMixyMTMKKworCXhvcglyY3gscjE1CisJYWRkCXIxMCxyMTIKKwlhZGQJcmN4LHIxMgorCisJbGVhCXJicCxbMjQrcmJwXQorCW1vdglyMTMsUVdPUkRbMTIwK3JzcF0KKwltb3YJcjE1LFFXT1JEWzk2K3JzcF0KKworCW1vdglyMTIscjEzCisJcm9yCXIxMyw3CisJYWRkCXJjeCxyMTQKKwltb3YJcjE0LHIxNQorCXJvcglyMTUsNDIKKworCXhvcglyMTMscjEyCisJc2hyCXIxMiw3CisJcm9yCXIxMywxCisJeG9yCXIxNSxyMTQKKwlzaHIJcjE0LDYKKworCXJvcglyMTUsMTkKKwl4b3IJcjEyLHIxMworCXhvcglyMTUscjE0CisJYWRkCXIxMixRV09SRFs1Nityc3BdCisKKwlhZGQJcjEyLFFXT1JEWzExMityc3BdCisJbW92CXIxMyxyMTAKKwlhZGQJcjEyLHIxNQorCW1vdglyMTQscmN4CisJcm9yCXIxMywyMworCW1vdglyMTUscjExCisKKwl4b3IJcjEzLHIxMAorCXJvcglyMTQsNQorCXhvcglyMTUscmF4CisKKwltb3YJUVdPUkRbMTEyK3JzcF0scjEyCisJeG9yCXIxNCxyY3gKKwlhbmQJcjE1LHIxMAorCisJcm9yCXIxMyw0CisJYWRkCXIxMixyYngKKwl4b3IJcjE1LHJheAorCisJcm9yCXIxNCw2CisJeG9yCXIxMyxyMTAKKwlhZGQJcjEyLHIxNQorCisJbW92CXIxNSxyY3gKKwlhZGQJcjEyLFFXT1JEW3JicF0KKwl4b3IJcjE0LHJjeAorCisJeG9yCXIxNSxyZHgKKwlyb3IJcjEzLDE0CisJbW92CXJieCxyZHgKKworCWFuZAlyZGkscjE1CisJcm9yCXIxNCwyOAorCWFkZAlyMTIscjEzCisKKwl4b3IJcmJ4LHJkaQorCWFkZAlyOSxyMTIKKwlhZGQJcmJ4LHIxMgorCisJbGVhCXJicCxbOCtyYnBdCisJbW92CXIxMyxRV09SRFtyc3BdCisJbW92CXJkaSxRV09SRFsxMDQrcnNwXQorCisJbW92CXIxMixyMTMKKwlyb3IJcjEzLDcKKwlhZGQJcmJ4LHIxNAorCW1vdglyMTQscmRpCisJcm9yCXJkaSw0MgorCisJeG9yCXIxMyxyMTIKKwlzaHIJcjEyLDcKKwlyb3IJcjEzLDEKKwl4b3IJcmRpLHIxNAorCXNocglyMTQsNgorCisJcm9yCXJkaSwxOQorCXhvcglyMTIscjEzCisJeG9yCXJkaSxyMTQKKwlhZGQJcjEyLFFXT1JEWzY0K3JzcF0KKworCWFkZAlyMTIsUVdPUkRbMTIwK3JzcF0KKwltb3YJcjEzLHI5CisJYWRkCXIxMixyZGkKKwltb3YJcjE0LHJieAorCXJvcglyMTMsMjMKKwltb3YJcmRpLHIxMAorCisJeG9yCXIxMyxyOQorCXJvcglyMTQsNQorCXhvcglyZGkscjExCisKKwltb3YJUVdPUkRbMTIwK3JzcF0scjEyCisJeG9yCXIxNCxyYngKKwlhbmQJcmRpLHI5CisKKwlyb3IJcjEzLDQKKwlhZGQJcjEyLHJheAorCXhvcglyZGkscjExCisKKwlyb3IJcjE0LDYKKwl4b3IJcjEzLHI5CisJYWRkCXIxMixyZGkKKworCW1vdglyZGkscmJ4CisJYWRkCXIxMixRV09SRFtyYnBdCisJeG9yCXIxNCxyYngKKworCXhvcglyZGkscmN4CisJcm9yCXIxMywxNAorCW1vdglyYXgscmN4CisKKwlhbmQJcjE1LHJkaQorCXJvcglyMTQsMjgKKwlhZGQJcjEyLHIxMworCisJeG9yCXJheCxyMTUKKwlhZGQJcjgscjEyCisJYWRkCXJheCxyMTIKKworCWxlYQlyYnAsWzI0K3JicF0KKwljbXAJQllURVs3K3JicF0sMAorCWpueglORUFSICRMJHJvdW5kc18xNl94eAorCisJbW92CXJkaSxRV09SRFsoKDEyOCswKSkrcnNwXQorCWFkZAlyYXgscjE0CisJbGVhCXJzaSxbMTI4K3JzaV0KKworCWFkZAlyYXgsUVdPUkRbcmRpXQorCWFkZAlyYngsUVdPUkRbOCtyZGldCisJYWRkCXJjeCxRV09SRFsxNityZGldCisJYWRkCXJkeCxRV09SRFsyNCtyZGldCisJYWRkCXI4LFFXT1JEWzMyK3JkaV0KKwlhZGQJcjksUVdPUkRbNDArcmRpXQorCWFkZAlyMTAsUVdPUkRbNDgrcmRpXQorCWFkZAlyMTEsUVdPUkRbNTYrcmRpXQorCisJY21wCXJzaSxRV09SRFsoKDEyOCsxNikpK3JzcF0KKworCW1vdglRV09SRFtyZGldLHJheAorCW1vdglRV09SRFs4K3JkaV0scmJ4CisJbW92CVFXT1JEWzE2K3JkaV0scmN4CisJbW92CVFXT1JEWzI0K3JkaV0scmR4CisJbW92CVFXT1JEWzMyK3JkaV0scjgKKwltb3YJUVdPUkRbNDArcmRpXSxyOQorCW1vdglRV09SRFs0OCtyZGldLHIxMAorCW1vdglRV09SRFs1NityZGldLHIxMQorCWpiCU5FQVIgJEwkbG9vcAorCisJbW92CXJzaSxRV09SRFsxNTIrcnNwXQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJGVwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorQUxJR04JNjQKKworSzUxMjoKKwlEUQkweDQyOGEyZjk4ZDcyOGFlMjIsMHg3MTM3NDQ5MTIzZWY2NWNkCisJRFEJMHg0MjhhMmY5OGQ3MjhhZTIyLDB4NzEzNzQ0OTEyM2VmNjVjZAorCURRCTB4YjVjMGZiY2ZlYzRkM2IyZiwweGU5YjVkYmE1ODE4OWRiYmMKKwlEUQkweGI1YzBmYmNmZWM0ZDNiMmYsMHhlOWI1ZGJhNTgxODlkYmJjCisJRFEJMHgzOTU2YzI1YmYzNDhiNTM4LDB4NTlmMTExZjFiNjA1ZDAxOQorCURRCTB4Mzk1NmMyNWJmMzQ4YjUzOCwweDU5ZjExMWYxYjYwNWQwMTkKKwlEUQkweDkyM2Y4MmE0YWYxOTRmOWIsMHhhYjFjNWVkNWRhNmQ4MTE4CisJRFEJMHg5MjNmODJhNGFmMTk0ZjliLDB4YWIxYzVlZDVkYTZkODExOAorCURRCTB4ZDgwN2FhOThhMzAzMDI0MiwweDEyODM1YjAxNDU3MDZmYmUKKwlEUQkweGQ4MDdhYTk4YTMwMzAyNDIsMHgxMjgzNWIwMTQ1NzA2ZmJlCisJRFEJMHgyNDMxODViZTRlZTRiMjhjLDB4NTUwYzdkYzNkNWZmYjRlMgorCURRCTB4MjQzMTg1YmU0ZWU0YjI4YywweDU1MGM3ZGMzZDVmZmI0ZTIKKwlEUQkweDcyYmU1ZDc0ZjI3Yjg5NmYsMHg4MGRlYjFmZTNiMTY5NmIxCisJRFEJMHg3MmJlNWQ3NGYyN2I4OTZmLDB4ODBkZWIxZmUzYjE2OTZiMQorCURRCTB4OWJkYzA2YTcyNWM3MTIzNSwweGMxOWJmMTc0Y2Y2OTI2OTQKKwlEUQkweDliZGMwNmE3MjVjNzEyMzUsMHhjMTliZjE3NGNmNjkyNjk0CisJRFEJMHhlNDliNjljMTllZjE0YWQyLDB4ZWZiZTQ3ODYzODRmMjVlMworCURRCTB4ZTQ5YjY5YzE5ZWYxNGFkMiwweGVmYmU0Nzg2Mzg0ZjI1ZTMKKwlEUQkweDBmYzE5ZGM2OGI4Y2Q1YjUsMHgyNDBjYTFjYzc3YWM5YzY1CisJRFEJMHgwZmMxOWRjNjhiOGNkNWI1LDB4MjQwY2ExY2M3N2FjOWM2NQorCURRCTB4MmRlOTJjNmY1OTJiMDI3NSwweDRhNzQ4NGFhNmVhNmU0ODMKKwlEUQkweDJkZTkyYzZmNTkyYjAyNzUsMHg0YTc0ODRhYTZlYTZlNDgzCisJRFEJMHg1Y2IwYTlkY2JkNDFmYmQ0LDB4NzZmOTg4ZGE4MzExNTNiNQorCURRCTB4NWNiMGE5ZGNiZDQxZmJkNCwweDc2Zjk4OGRhODMxMTUzYjUKKwlEUQkweDk4M2U1MTUyZWU2NmRmYWIsMHhhODMxYzY2ZDJkYjQzMjEwCisJRFEJMHg5ODNlNTE1MmVlNjZkZmFiLDB4YTgzMWM2NmQyZGI0MzIxMAorCURRCTB4YjAwMzI3Yzg5OGZiMjEzZiwweGJmNTk3ZmM3YmVlZjBlZTQKKwlEUQkweGIwMDMyN2M4OThmYjIxM2YsMHhiZjU5N2ZjN2JlZWYwZWU0CisJRFEJMHhjNmUwMGJmMzNkYTg4ZmMyLDB4ZDVhNzkxNDc5MzBhYTcyNQorCURRCTB4YzZlMDBiZjMzZGE4OGZjMiwweGQ1YTc5MTQ3OTMwYWE3MjUKKwlEUQkweDA2Y2E2MzUxZTAwMzgyNmYsMHgxNDI5Mjk2NzBhMGU2ZTcwCisJRFEJMHgwNmNhNjM1MWUwMDM4MjZmLDB4MTQyOTI5NjcwYTBlNmU3MAorCURRCTB4MjdiNzBhODU0NmQyMmZmYywweDJlMWIyMTM4NWMyNmM5MjYKKwlEUQkweDI3YjcwYTg1NDZkMjJmZmMsMHgyZTFiMjEzODVjMjZjOTI2CisJRFEJMHg0ZDJjNmRmYzVhYzQyYWVkLDB4NTMzODBkMTM5ZDk1YjNkZgorCURRCTB4NGQyYzZkZmM1YWM0MmFlZCwweDUzMzgwZDEzOWQ5NWIzZGYKKwlEUQkweDY1MGE3MzU0OGJhZjYzZGUsMHg3NjZhMGFiYjNjNzdiMmE4CisJRFEJMHg2NTBhNzM1NDhiYWY2M2RlLDB4NzY2YTBhYmIzYzc3YjJhOAorCURRCTB4ODFjMmM5MmU0N2VkYWVlNiwweDkyNzIyYzg1MTQ4MjM1M2IKKwlEUQkweDgxYzJjOTJlNDdlZGFlZTYsMHg5MjcyMmM4NTE0ODIzNTNiCisJRFEJMHhhMmJmZThhMTRjZjEwMzY0LDB4YTgxYTY2NGJiYzQyMzAwMQorCURRCTB4YTJiZmU4YTE0Y2YxMDM2NCwweGE4MWE2NjRiYmM0MjMwMDEKKwlEUQkweGMyNGI4YjcwZDBmODk3OTEsMHhjNzZjNTFhMzA2NTRiZTMwCisJRFEJMHhjMjRiOGI3MGQwZjg5NzkxLDB4Yzc2YzUxYTMwNjU0YmUzMAorCURRCTB4ZDE5MmU4MTlkNmVmNTIxOCwweGQ2OTkwNjI0NTU2NWE5MTAKKwlEUQkweGQxOTJlODE5ZDZlZjUyMTgsMHhkNjk5MDYyNDU1NjVhOTEwCisJRFEJMHhmNDBlMzU4NTU3NzEyMDJhLDB4MTA2YWEwNzAzMmJiZDFiOAorCURRCTB4ZjQwZTM1ODU1NzcxMjAyYSwweDEwNmFhMDcwMzJiYmQxYjgKKwlEUQkweDE5YTRjMTE2YjhkMmQwYzgsMHgxZTM3NmMwODUxNDFhYjUzCisJRFEJMHgxOWE0YzExNmI4ZDJkMGM4LDB4MWUzNzZjMDg1MTQxYWI1MworCURRCTB4Mjc0ODc3NGNkZjhlZWI5OSwweDM0YjBiY2I1ZTE5YjQ4YTgKKwlEUQkweDI3NDg3NzRjZGY4ZWViOTksMHgzNGIwYmNiNWUxOWI0OGE4CisJRFEJMHgzOTFjMGNiM2M1Yzk1YTYzLDB4NGVkOGFhNGFlMzQxOGFjYgorCURRCTB4MzkxYzBjYjNjNWM5NWE2MywweDRlZDhhYTRhZTM0MThhY2IKKwlEUQkweDViOWNjYTRmNzc2M2UzNzMsMHg2ODJlNmZmM2Q2YjJiOGEzCisJRFEJMHg1YjljY2E0Zjc3NjNlMzczLDB4NjgyZTZmZjNkNmIyYjhhMworCURRCTB4NzQ4ZjgyZWU1ZGVmYjJmYywweDc4YTU2MzZmNDMxNzJmNjAKKwlEUQkweDc0OGY4MmVlNWRlZmIyZmMsMHg3OGE1NjM2ZjQzMTcyZjYwCisJRFEJMHg4NGM4NzgxNGExZjBhYjcyLDB4OGNjNzAyMDgxYTY0MzllYworCURRCTB4ODRjODc4MTRhMWYwYWI3MiwweDhjYzcwMjA4MWE2NDM5ZWMKKwlEUQkweDkwYmVmZmZhMjM2MzFlMjgsMHhhNDUwNmNlYmRlODJiZGU5CisJRFEJMHg5MGJlZmZmYTIzNjMxZTI4LDB4YTQ1MDZjZWJkZTgyYmRlOQorCURRCTB4YmVmOWEzZjdiMmM2NzkxNSwweGM2NzE3OGYyZTM3MjUzMmIKKwlEUQkweGJlZjlhM2Y3YjJjNjc5MTUsMHhjNjcxNzhmMmUzNzI1MzJiCisJRFEJMHhjYTI3M2VjZWVhMjY2MTljLDB4ZDE4NmI4YzcyMWMwYzIwNworCURRCTB4Y2EyNzNlY2VlYTI2NjE5YywweGQxODZiOGM3MjFjMGMyMDcKKwlEUQkweGVhZGE3ZGQ2Y2RlMGViMWUsMHhmNTdkNGY3ZmVlNmVkMTc4CisJRFEJMHhlYWRhN2RkNmNkZTBlYjFlLDB4ZjU3ZDRmN2ZlZTZlZDE3OAorCURRCTB4MDZmMDY3YWE3MjE3NmZiYSwweDBhNjM3ZGM1YTJjODk4YTYKKwlEUQkweDA2ZjA2N2FhNzIxNzZmYmEsMHgwYTYzN2RjNWEyYzg5OGE2CisJRFEJMHgxMTNmOTgwNGJlZjkwZGFlLDB4MWI3MTBiMzUxMzFjNDcxYgorCURRCTB4MTEzZjk4MDRiZWY5MGRhZSwweDFiNzEwYjM1MTMxYzQ3MWIKKwlEUQkweDI4ZGI3N2Y1MjMwNDdkODQsMHgzMmNhYWI3YjQwYzcyNDkzCisJRFEJMHgyOGRiNzdmNTIzMDQ3ZDg0LDB4MzJjYWFiN2I0MGM3MjQ5MworCURRCTB4M2M5ZWJlMGExNWM5YmViYywweDQzMWQ2N2M0OWMxMDBkNGMKKwlEUQkweDNjOWViZTBhMTVjOWJlYmMsMHg0MzFkNjdjNDljMTAwZDRjCisJRFEJMHg0Y2M1ZDRiZWNiM2U0MmI2LDB4NTk3ZjI5OWNmYzY1N2UyYQorCURRCTB4NGNjNWQ0YmVjYjNlNDJiNiwweDU5N2YyOTljZmM2NTdlMmEKKwlEUQkweDVmY2I2ZmFiM2FkNmZhZWMsMHg2YzQ0MTk4YzRhNDc1ODE3CisJRFEJMHg1ZmNiNmZhYjNhZDZmYWVjLDB4NmM0NDE5OGM0YTQ3NTgxNworCisJRFEJMHgwMDAxMDIwMzA0MDUwNjA3LDB4MDgwOTBhMGIwYzBkMGUwZgorCURRCTB4MDAwMTAyMDMwNDA1MDYwNywweDA4MDkwYTBiMGMwZDBlMGYKK0RCCTgzLDcyLDY1LDUzLDQ5LDUwLDMyLDk4LDEwOCwxMTEsOTksMTA3LDMyLDExNiwxMTQsOTcKK0RCCTExMCwxMTUsMTAyLDExMSwxMTQsMTA5LDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NAorREIJNTIsNDQsMzIsNjcsODIsODksODAsODQsNzksNzEsNjUsNzcsODMsMzIsOTgsMTIxCitEQgkzMiw2MCw5NywxMTIsMTEyLDExNCwxMTEsNjQsMTExLDExMiwxMDEsMTEwLDExNSwxMTUsMTA4LDQ2CitEQgkxMTEsMTE0LDEwMyw2MiwwCisKK0FMSUdOCTY0CitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl94b3A6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl94b3A6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisKKyRMJHhvcF9zaG9ydGN1dDoKKwltb3YJcmF4LHJzcAorCisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisJc2hsCXJkeCw0CisJc3ViCXJzcCwyNTYKKwlsZWEJcmR4LFtyZHgqOCtyc2ldCisJYW5kCXJzcCwtNjQKKwltb3YJUVdPUkRbKCgxMjgrMCkpK3JzcF0scmRpCisJbW92CVFXT1JEWygoMTI4KzgpKStyc3BdLHJzaQorCW1vdglRV09SRFsoKDEyOCsxNikpK3JzcF0scmR4CisJbW92CVFXT1JEWzE1Mityc3BdLHJheAorCisJbW92YXBzCVhNTVdPUkRbKDEyOCszMikrcnNwXSx4bW02CisJbW92YXBzCVhNTVdPUkRbKDEyOCs0OCkrcnNwXSx4bW03CisJbW92YXBzCVhNTVdPUkRbKDEyOCs2NCkrcnNwXSx4bW04CisJbW92YXBzCVhNTVdPUkRbKDEyOCs4MCkrcnNwXSx4bW05CisJbW92YXBzCVhNTVdPUkRbKDEyOCs5NikrcnNwXSx4bW0xMAorCW1vdmFwcwlYTU1XT1JEWygxMjgrMTEyKStyc3BdLHhtbTExCiskTCRwcm9sb2d1ZV94b3A6CisKKwl2emVyb3VwcGVyCisJbW92CXJheCxRV09SRFtyZGldCisJbW92CXJieCxRV09SRFs4K3JkaV0KKwltb3YJcmN4LFFXT1JEWzE2K3JkaV0KKwltb3YJcmR4LFFXT1JEWzI0K3JkaV0KKwltb3YJcjgsUVdPUkRbMzIrcmRpXQorCW1vdglyOSxRV09SRFs0MCtyZGldCisJbW92CXIxMCxRV09SRFs0OCtyZGldCisJbW92CXIxMSxRV09SRFs1NityZGldCisJam1wCU5FQVIgJEwkbG9vcF94b3AKK0FMSUdOCTE2CiskTCRsb29wX3hvcDoKKwl2bW92ZHFhCXhtbTExLFhNTVdPUkRbKChLNTEyKzEyODApKV0KKwl2bW92ZHF1CXhtbTAsWE1NV09SRFtyc2ldCisJbGVhCXJicCxbKChLNTEyKzEyOCkpXQorCXZtb3ZkcXUJeG1tMSxYTU1XT1JEWzE2K3JzaV0KKwl2bW92ZHF1CXhtbTIsWE1NV09SRFszMityc2ldCisJdnBzaHVmYgl4bW0wLHhtbTAseG1tMTEKKwl2bW92ZHF1CXhtbTMsWE1NV09SRFs0OCtyc2ldCisJdnBzaHVmYgl4bW0xLHhtbTEseG1tMTEKKwl2bW92ZHF1CXhtbTQsWE1NV09SRFs2NCtyc2ldCisJdnBzaHVmYgl4bW0yLHhtbTIseG1tMTEKKwl2bW92ZHF1CXhtbTUsWE1NV09SRFs4MCtyc2ldCisJdnBzaHVmYgl4bW0zLHhtbTMseG1tMTEKKwl2bW92ZHF1CXhtbTYsWE1NV09SRFs5Nityc2ldCisJdnBzaHVmYgl4bW00LHhtbTQseG1tMTEKKwl2bW92ZHF1CXhtbTcsWE1NV09SRFsxMTIrcnNpXQorCXZwc2h1ZmIJeG1tNSx4bW01LHhtbTExCisJdnBhZGRxCXhtbTgseG1tMCxYTU1XT1JEWygoLTEyOCkpK3JicF0KKwl2cHNodWZiCXhtbTYseG1tNix4bW0xMQorCXZwYWRkcQl4bW05LHhtbTEsWE1NV09SRFsoKC05NikpK3JicF0KKwl2cHNodWZiCXhtbTcseG1tNyx4bW0xMQorCXZwYWRkcQl4bW0xMCx4bW0yLFhNTVdPUkRbKCgtNjQpKStyYnBdCisJdnBhZGRxCXhtbTExLHhtbTMsWE1NV09SRFsoKC0zMikpK3JicF0KKwl2bW92ZHFhCVhNTVdPUkRbcnNwXSx4bW04CisJdnBhZGRxCXhtbTgseG1tNCxYTU1XT1JEW3JicF0KKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW05CisJdnBhZGRxCXhtbTkseG1tNSxYTU1XT1JEWzMyK3JicF0KKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0xMAorCXZwYWRkcQl4bW0xMCx4bW02LFhNTVdPUkRbNjQrcmJwXQorCXZtb3ZkcWEJWE1NV09SRFs0OCtyc3BdLHhtbTExCisJdnBhZGRxCXhtbTExLHhtbTcsWE1NV09SRFs5NityYnBdCisJdm1vdmRxYQlYTU1XT1JEWzY0K3JzcF0seG1tOAorCW1vdglyMTQscmF4CisJdm1vdmRxYQlYTU1XT1JEWzgwK3JzcF0seG1tOQorCW1vdglyZGkscmJ4CisJdm1vdmRxYQlYTU1XT1JEWzk2K3JzcF0seG1tMTAKKwl4b3IJcmRpLHJjeAorCXZtb3ZkcWEJWE1NV09SRFsxMTIrcnNwXSx4bW0xMQorCW1vdglyMTMscjgKKwlqbXAJTkVBUiAkTCR4b3BfMDBfNDcKKworQUxJR04JMTYKKyRMJHhvcF8wMF80NzoKKwlhZGQJcmJwLDI1NgorCXZwYWxpZ25yCXhtbTgseG1tMSx4bW0wLDgKKwlyb3IJcjEzLDIzCisJbW92CXJheCxyMTQKKwl2cGFsaWducgl4bW0xMSx4bW01LHhtbTQsOAorCW1vdglyMTIscjkKKwlyb3IJcjE0LDUKK0RCCTE0Myw3MiwxMjAsMTk1LDIwMCw1NgorCXhvcglyMTMscjgKKwl4b3IJcjEyLHIxMAorCXZwc3JscQl4bW04LHhtbTgsNworCXJvcglyMTMsNAorCXhvcglyMTQscmF4CisJdnBhZGRxCXhtbTAseG1tMCx4bW0xMQorCWFuZAlyMTIscjgKKwl4b3IJcjEzLHI4CisJYWRkCXIxMSxRV09SRFtyc3BdCisJbW92CXIxNSxyYXgKK0RCCTE0Myw3MiwxMjAsMTk1LDIwOSw3CisJeG9yCXIxMixyMTAKKwlyb3IJcjE0LDYKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCXhvcglyMTUscmJ4CisJYWRkCXIxMSxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXJkaSxyMTUKK0RCCTE0MywxMDQsMTIwLDE5NSwyMjMsMworCXhvcglyMTQscmF4CisJYWRkCXIxMSxyMTMKKwl2cHhvcgl4bW04LHhtbTgseG1tMTAKKwl4b3IJcmRpLHJieAorCXJvcglyMTQsMjgKKwl2cHNybHEJeG1tMTAseG1tNyw2CisJYWRkCXJkeCxyMTEKKwlhZGQJcjExLHJkaQorCXZwYWRkcQl4bW0wLHhtbTAseG1tOAorCW1vdglyMTMscmR4CisJYWRkCXIxNCxyMTEKK0RCCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcglyMTMsMjMKKwltb3YJcjExLHIxNAorCXZweG9yCXhtbTExLHhtbTExLHhtbTEwCisJbW92CXIxMixyOAorCXJvcglyMTQsNQorCXhvcglyMTMscmR4CisJeG9yCXIxMixyOQorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHIxMQorCWFuZAlyMTIscmR4CisJeG9yCXIxMyxyZHgKKwl2cGFkZHEJeG1tMCx4bW0wLHhtbTExCisJYWRkCXIxMCxRV09SRFs4K3JzcF0KKwltb3YJcmRpLHIxMQorCXhvcglyMTIscjkKKwlyb3IJcjE0LDYKKwl2cGFkZHEJeG1tMTAseG1tMCxYTU1XT1JEWygoLTEyOCkpK3JicF0KKwl4b3IJcmRpLHJheAorCWFkZAlyMTAscjEyCisJcm9yCXIxMywxNAorCWFuZAlyMTUscmRpCisJeG9yCXIxNCxyMTEKKwlhZGQJcjEwLHIxMworCXhvcglyMTUscmF4CisJcm9yCXIxNCwyOAorCWFkZAlyY3gscjEwCisJYWRkCXIxMCxyMTUKKwltb3YJcjEzLHJjeAorCWFkZAlyMTQscjEwCisJdm1vdmRxYQlYTU1XT1JEW3JzcF0seG1tMTAKKwl2cGFsaWducgl4bW04LHhtbTIseG1tMSw4CisJcm9yCXIxMywyMworCW1vdglyMTAscjE0CisJdnBhbGlnbnIJeG1tMTEseG1tNix4bW01LDgKKwltb3YJcjEyLHJkeAorCXJvcglyMTQsNQorREIJMTQzLDcyLDEyMCwxOTUsMjAwLDU2CisJeG9yCXIxMyxyY3gKKwl4b3IJcjEyLHI4CisJdnBzcmxxCXhtbTgseG1tOCw3CisJcm9yCXIxMyw0CisJeG9yCXIxNCxyMTAKKwl2cGFkZHEJeG1tMSx4bW0xLHhtbTExCisJYW5kCXIxMixyY3gKKwl4b3IJcjEzLHJjeAorCWFkZAlyOSxRV09SRFsxNityc3BdCisJbW92CXIxNSxyMTAKK0RCCTE0Myw3MiwxMjAsMTk1LDIwOSw3CisJeG9yCXIxMixyOAorCXJvcglyMTQsNgorCXZweG9yCXhtbTgseG1tOCx4bW05CisJeG9yCXIxNSxyMTEKKwlhZGQJcjkscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CitEQgkxNDMsMTA0LDEyMCwxOTUsMjE2LDMKKwl4b3IJcjE0LHIxMAorCWFkZAlyOSxyMTMKKwl2cHhvcgl4bW04LHhtbTgseG1tMTAKKwl4b3IJcmRpLHIxMQorCXJvcglyMTQsMjgKKwl2cHNybHEJeG1tMTAseG1tMCw2CisJYWRkCXJieCxyOQorCWFkZAlyOSxyZGkKKwl2cGFkZHEJeG1tMSx4bW0xLHhtbTgKKwltb3YJcjEzLHJieAorCWFkZAlyMTQscjkKK0RCCTE0Myw3MiwxMjAsMTk1LDIwMyw0MgorCXJvcglyMTMsMjMKKwltb3YJcjkscjE0CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwltb3YJcjEyLHJjeAorCXJvcglyMTQsNQorCXhvcglyMTMscmJ4CisJeG9yCXIxMixyZHgKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJcm9yCXIxMyw0CisJeG9yCXIxNCxyOQorCWFuZAlyMTIscmJ4CisJeG9yCXIxMyxyYngKKwl2cGFkZHEJeG1tMSx4bW0xLHhtbTExCisJYWRkCXI4LFFXT1JEWzI0K3JzcF0KKwltb3YJcmRpLHI5CisJeG9yCXIxMixyZHgKKwlyb3IJcjE0LDYKKwl2cGFkZHEJeG1tMTAseG1tMSxYTU1XT1JEWygoLTk2KSkrcmJwXQorCXhvcglyZGkscjEwCisJYWRkCXI4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXhvcglyMTQscjkKKwlhZGQJcjgscjEzCisJeG9yCXIxNSxyMTAKKwlyb3IJcjE0LDI4CisJYWRkCXJheCxyOAorCWFkZAlyOCxyMTUKKwltb3YJcjEzLHJheAorCWFkZAlyMTQscjgKKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tMyx4bW0yLDgKKwlyb3IJcjEzLDIzCisJbW92CXI4LHIxNAorCXZwYWxpZ25yCXhtbTExLHhtbTcseG1tNiw4CisJbW92CXIxMixyYngKKwlyb3IJcjE0LDUKK0RCCTE0Myw3MiwxMjAsMTk1LDIwMCw1NgorCXhvcglyMTMscmF4CisJeG9yCXIxMixyY3gKKwl2cHNybHEJeG1tOCx4bW04LDcKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHI4CisJdnBhZGRxCXhtbTIseG1tMix4bW0xMQorCWFuZAlyMTIscmF4CisJeG9yCXIxMyxyYXgKKwlhZGQJcmR4LFFXT1JEWzMyK3JzcF0KKwltb3YJcjE1LHI4CitEQgkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcglyMTIscmN4CisJcm9yCXIxNCw2CisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwl4b3IJcjE1LHI5CisJYWRkCXJkeCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXJkaSxyMTUKK0RCCTE0MywxMDQsMTIwLDE5NSwyMTcsMworCXhvcglyMTQscjgKKwlhZGQJcmR4LHIxMworCXZweG9yCXhtbTgseG1tOCx4bW0xMAorCXhvcglyZGkscjkKKwlyb3IJcjE0LDI4CisJdnBzcmxxCXhtbTEwLHhtbTEsNgorCWFkZAlyMTEscmR4CisJYWRkCXJkeCxyZGkKKwl2cGFkZHEJeG1tMix4bW0yLHhtbTgKKwltb3YJcjEzLHIxMQorCWFkZAlyMTQscmR4CitEQgkxNDMsNzIsMTIwLDE5NSwyMDMsNDIKKwlyb3IJcjEzLDIzCisJbW92CXJkeCxyMTQKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCW1vdglyMTIscmF4CisJcm9yCXIxNCw1CisJeG9yCXIxMyxyMTEKKwl4b3IJcjEyLHJieAorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJkeAorCWFuZAlyMTIscjExCisJeG9yCXIxMyxyMTEKKwl2cGFkZHEJeG1tMix4bW0yLHhtbTExCisJYWRkCXJjeCxRV09SRFs0MCtyc3BdCisJbW92CXJkaSxyZHgKKwl4b3IJcjEyLHJieAorCXJvcglyMTQsNgorCXZwYWRkcQl4bW0xMCx4bW0yLFhNTVdPUkRbKCgtNjQpKStyYnBdCisJeG9yCXJkaSxyOAorCWFkZAlyY3gscjEyCisJcm9yCXIxMywxNAorCWFuZAlyMTUscmRpCisJeG9yCXIxNCxyZHgKKwlhZGQJcmN4LHIxMworCXhvcglyMTUscjgKKwlyb3IJcjE0LDI4CisJYWRkCXIxMCxyY3gKKwlhZGQJcmN4LHIxNQorCW1vdglyMTMscjEwCisJYWRkCXIxNCxyY3gKKwl2bW92ZHFhCVhNTVdPUkRbMzIrcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tNCx4bW0zLDgKKwlyb3IJcjEzLDIzCisJbW92CXJjeCxyMTQKKwl2cGFsaWducgl4bW0xMSx4bW0wLHhtbTcsOAorCW1vdglyMTIscjExCisJcm9yCXIxNCw1CitEQgkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3IJcjEzLHIxMAorCXhvcglyMTIscmF4CisJdnBzcmxxCXhtbTgseG1tOCw3CisJcm9yCXIxMyw0CisJeG9yCXIxNCxyY3gKKwl2cGFkZHEJeG1tMyx4bW0zLHhtbTExCisJYW5kCXIxMixyMTAKKwl4b3IJcjEzLHIxMAorCWFkZAlyYngsUVdPUkRbNDgrcnNwXQorCW1vdglyMTUscmN4CitEQgkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcglyMTIscmF4CisJcm9yCXIxNCw2CisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwl4b3IJcjE1LHJkeAorCWFkZAlyYngscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CitEQgkxNDMsMTA0LDEyMCwxOTUsMjE4LDMKKwl4b3IJcjE0LHJjeAorCWFkZAlyYngscjEzCisJdnB4b3IJeG1tOCx4bW04LHhtbTEwCisJeG9yCXJkaSxyZHgKKwlyb3IJcjE0LDI4CisJdnBzcmxxCXhtbTEwLHhtbTIsNgorCWFkZAlyOSxyYngKKwlhZGQJcmJ4LHJkaQorCXZwYWRkcQl4bW0zLHhtbTMseG1tOAorCW1vdglyMTMscjkKKwlhZGQJcjE0LHJieAorREIJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9yCXIxMywyMworCW1vdglyYngscjE0CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwltb3YJcjEyLHIxMAorCXJvcglyMTQsNQorCXhvcglyMTMscjkKKwl4b3IJcjEyLHIxMQorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJieAorCWFuZAlyMTIscjkKKwl4b3IJcjEzLHI5CisJdnBhZGRxCXhtbTMseG1tMyx4bW0xMQorCWFkZAlyYXgsUVdPUkRbNTYrcnNwXQorCW1vdglyZGkscmJ4CisJeG9yCXIxMixyMTEKKwlyb3IJcjE0LDYKKwl2cGFkZHEJeG1tMTAseG1tMyxYTU1XT1JEWygoLTMyKSkrcmJwXQorCXhvcglyZGkscmN4CisJYWRkCXJheCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHJieAorCWFkZAlyYXgscjEzCisJeG9yCXIxNSxyY3gKKwlyb3IJcjE0LDI4CisJYWRkCXI4LHJheAorCWFkZAlyYXgscjE1CisJbW92CXIxMyxyOAorCWFkZAlyMTQscmF4CisJdm1vdmRxYQlYTU1XT1JEWzQ4K3JzcF0seG1tMTAKKwl2cGFsaWducgl4bW04LHhtbTUseG1tNCw4CisJcm9yCXIxMywyMworCW1vdglyYXgscjE0CisJdnBhbGlnbnIJeG1tMTEseG1tMSx4bW0wLDgKKwltb3YJcjEyLHI5CisJcm9yCXIxNCw1CitEQgkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3IJcjEzLHI4CisJeG9yCXIxMixyMTAKKwl2cHNybHEJeG1tOCx4bW04LDcKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJheAorCXZwYWRkcQl4bW00LHhtbTQseG1tMTEKKwlhbmQJcjEyLHI4CisJeG9yCXIxMyxyOAorCWFkZAlyMTEsUVdPUkRbNjQrcnNwXQorCW1vdglyMTUscmF4CitEQgkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcglyMTIscjEwCisJcm9yCXIxNCw2CisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwl4b3IJcjE1LHJieAorCWFkZAlyMTEscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CitEQgkxNDMsMTA0LDEyMCwxOTUsMjE5LDMKKwl4b3IJcjE0LHJheAorCWFkZAlyMTEscjEzCisJdnB4b3IJeG1tOCx4bW04LHhtbTEwCisJeG9yCXJkaSxyYngKKwlyb3IJcjE0LDI4CisJdnBzcmxxCXhtbTEwLHhtbTMsNgorCWFkZAlyZHgscjExCisJYWRkCXIxMSxyZGkKKwl2cGFkZHEJeG1tNCx4bW00LHhtbTgKKwltb3YJcjEzLHJkeAorCWFkZAlyMTQscjExCitEQgkxNDMsNzIsMTIwLDE5NSwyMDMsNDIKKwlyb3IJcjEzLDIzCisJbW92CXIxMSxyMTQKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCW1vdglyMTIscjgKKwlyb3IJcjE0LDUKKwl4b3IJcjEzLHJkeAorCXhvcglyMTIscjkKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJcm9yCXIxMyw0CisJeG9yCXIxNCxyMTEKKwlhbmQJcjEyLHJkeAorCXhvcglyMTMscmR4CisJdnBhZGRxCXhtbTQseG1tNCx4bW0xMQorCWFkZAlyMTAsUVdPUkRbNzIrcnNwXQorCW1vdglyZGkscjExCisJeG9yCXIxMixyOQorCXJvcglyMTQsNgorCXZwYWRkcQl4bW0xMCx4bW00LFhNTVdPUkRbcmJwXQorCXhvcglyZGkscmF4CisJYWRkCXIxMCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHIxMQorCWFkZAlyMTAscjEzCisJeG9yCXIxNSxyYXgKKwlyb3IJcjE0LDI4CisJYWRkCXJjeCxyMTAKKwlhZGQJcjEwLHIxNQorCW1vdglyMTMscmN4CisJYWRkCXIxNCxyMTAKKwl2bW92ZHFhCVhNTVdPUkRbNjQrcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tNix4bW01LDgKKwlyb3IJcjEzLDIzCisJbW92CXIxMCxyMTQKKwl2cGFsaWducgl4bW0xMSx4bW0yLHhtbTEsOAorCW1vdglyMTIscmR4CisJcm9yCXIxNCw1CitEQgkxNDMsNzIsMTIwLDE5NSwyMDAsNTYKKwl4b3IJcjEzLHJjeAorCXhvcglyMTIscjgKKwl2cHNybHEJeG1tOCx4bW04LDcKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHIxMAorCXZwYWRkcQl4bW01LHhtbTUseG1tMTEKKwlhbmQJcjEyLHJjeAorCXhvcglyMTMscmN4CisJYWRkCXI5LFFXT1JEWzgwK3JzcF0KKwltb3YJcjE1LHIxMAorREIJMTQzLDcyLDEyMCwxOTUsMjA5LDcKKwl4b3IJcjEyLHI4CisJcm9yCXIxNCw2CisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwl4b3IJcjE1LHIxMQorCWFkZAlyOSxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXJkaSxyMTUKK0RCCTE0MywxMDQsMTIwLDE5NSwyMjAsMworCXhvcglyMTQscjEwCisJYWRkCXI5LHIxMworCXZweG9yCXhtbTgseG1tOCx4bW0xMAorCXhvcglyZGkscjExCisJcm9yCXIxNCwyOAorCXZwc3JscQl4bW0xMCx4bW00LDYKKwlhZGQJcmJ4LHI5CisJYWRkCXI5LHJkaQorCXZwYWRkcQl4bW01LHhtbTUseG1tOAorCW1vdglyMTMscmJ4CisJYWRkCXIxNCxyOQorREIJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9yCXIxMywyMworCW1vdglyOSxyMTQKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCW1vdglyMTIscmN4CisJcm9yCXIxNCw1CisJeG9yCXIxMyxyYngKKwl4b3IJcjEyLHJkeAorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHI5CisJYW5kCXIxMixyYngKKwl4b3IJcjEzLHJieAorCXZwYWRkcQl4bW01LHhtbTUseG1tMTEKKwlhZGQJcjgsUVdPUkRbODgrcnNwXQorCW1vdglyZGkscjkKKwl4b3IJcjEyLHJkeAorCXJvcglyMTQsNgorCXZwYWRkcQl4bW0xMCx4bW01LFhNTVdPUkRbMzIrcmJwXQorCXhvcglyZGkscjEwCisJYWRkCXI4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXhvcglyMTQscjkKKwlhZGQJcjgscjEzCisJeG9yCXIxNSxyMTAKKwlyb3IJcjE0LDI4CisJYWRkCXJheCxyOAorCWFkZAlyOCxyMTUKKwltb3YJcjEzLHJheAorCWFkZAlyMTQscjgKKwl2bW92ZHFhCVhNTVdPUkRbODArcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tNyx4bW02LDgKKwlyb3IJcjEzLDIzCisJbW92CXI4LHIxNAorCXZwYWxpZ25yCXhtbTExLHhtbTMseG1tMiw4CisJbW92CXIxMixyYngKKwlyb3IJcjE0LDUKK0RCCTE0Myw3MiwxMjAsMTk1LDIwMCw1NgorCXhvcglyMTMscmF4CisJeG9yCXIxMixyY3gKKwl2cHNybHEJeG1tOCx4bW04LDcKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHI4CisJdnBhZGRxCXhtbTYseG1tNix4bW0xMQorCWFuZAlyMTIscmF4CisJeG9yCXIxMyxyYXgKKwlhZGQJcmR4LFFXT1JEWzk2K3JzcF0KKwltb3YJcjE1LHI4CitEQgkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcglyMTIscmN4CisJcm9yCXIxNCw2CisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwl4b3IJcjE1LHI5CisJYWRkCXJkeCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXJkaSxyMTUKK0RCCTE0MywxMDQsMTIwLDE5NSwyMjEsMworCXhvcglyMTQscjgKKwlhZGQJcmR4LHIxMworCXZweG9yCXhtbTgseG1tOCx4bW0xMAorCXhvcglyZGkscjkKKwlyb3IJcjE0LDI4CisJdnBzcmxxCXhtbTEwLHhtbTUsNgorCWFkZAlyMTEscmR4CisJYWRkCXJkeCxyZGkKKwl2cGFkZHEJeG1tNix4bW02LHhtbTgKKwltb3YJcjEzLHIxMQorCWFkZAlyMTQscmR4CitEQgkxNDMsNzIsMTIwLDE5NSwyMDMsNDIKKwlyb3IJcjEzLDIzCisJbW92CXJkeCxyMTQKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCW1vdglyMTIscmF4CisJcm9yCXIxNCw1CisJeG9yCXIxMyxyMTEKKwl4b3IJcjEyLHJieAorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJkeAorCWFuZAlyMTIscjExCisJeG9yCXIxMyxyMTEKKwl2cGFkZHEJeG1tNix4bW02LHhtbTExCisJYWRkCXJjeCxRV09SRFsxMDQrcnNwXQorCW1vdglyZGkscmR4CisJeG9yCXIxMixyYngKKwlyb3IJcjE0LDYKKwl2cGFkZHEJeG1tMTAseG1tNixYTU1XT1JEWzY0K3JicF0KKwl4b3IJcmRpLHI4CisJYWRkCXJjeCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHJkeAorCWFkZAlyY3gscjEzCisJeG9yCXIxNSxyOAorCXJvcglyMTQsMjgKKwlhZGQJcjEwLHJjeAorCWFkZAlyY3gscjE1CisJbW92CXIxMyxyMTAKKwlhZGQJcjE0LHJjeAorCXZtb3ZkcWEJWE1NV09SRFs5Nityc3BdLHhtbTEwCisJdnBhbGlnbnIJeG1tOCx4bW0wLHhtbTcsOAorCXJvcglyMTMsMjMKKwltb3YJcmN4LHIxNAorCXZwYWxpZ25yCXhtbTExLHhtbTQseG1tMyw4CisJbW92CXIxMixyMTEKKwlyb3IJcjE0LDUKK0RCCTE0Myw3MiwxMjAsMTk1LDIwMCw1NgorCXhvcglyMTMscjEwCisJeG9yCXIxMixyYXgKKwl2cHNybHEJeG1tOCx4bW04LDcKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJjeAorCXZwYWRkcQl4bW03LHhtbTcseG1tMTEKKwlhbmQJcjEyLHIxMAorCXhvcglyMTMscjEwCisJYWRkCXJieCxRV09SRFsxMTIrcnNwXQorCW1vdglyMTUscmN4CitEQgkxNDMsNzIsMTIwLDE5NSwyMDksNworCXhvcglyMTIscmF4CisJcm9yCXIxNCw2CisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwl4b3IJcjE1LHJkeAorCWFkZAlyYngscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CitEQgkxNDMsMTA0LDEyMCwxOTUsMjIyLDMKKwl4b3IJcjE0LHJjeAorCWFkZAlyYngscjEzCisJdnB4b3IJeG1tOCx4bW04LHhtbTEwCisJeG9yCXJkaSxyZHgKKwlyb3IJcjE0LDI4CisJdnBzcmxxCXhtbTEwLHhtbTYsNgorCWFkZAlyOSxyYngKKwlhZGQJcmJ4LHJkaQorCXZwYWRkcQl4bW03LHhtbTcseG1tOAorCW1vdglyMTMscjkKKwlhZGQJcjE0LHJieAorREIJMTQzLDcyLDEyMCwxOTUsMjAzLDQyCisJcm9yCXIxMywyMworCW1vdglyYngscjE0CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwltb3YJcjEyLHIxMAorCXJvcglyMTQsNQorCXhvcglyMTMscjkKKwl4b3IJcjEyLHIxMQorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJieAorCWFuZAlyMTIscjkKKwl4b3IJcjEzLHI5CisJdnBhZGRxCXhtbTcseG1tNyx4bW0xMQorCWFkZAlyYXgsUVdPUkRbMTIwK3JzcF0KKwltb3YJcmRpLHJieAorCXhvcglyMTIscjExCisJcm9yCXIxNCw2CisJdnBhZGRxCXhtbTEwLHhtbTcsWE1NV09SRFs5NityYnBdCisJeG9yCXJkaSxyY3gKKwlhZGQJcmF4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXhvcglyMTQscmJ4CisJYWRkCXJheCxyMTMKKwl4b3IJcjE1LHJjeAorCXJvcglyMTQsMjgKKwlhZGQJcjgscmF4CisJYWRkCXJheCxyMTUKKwltb3YJcjEzLHI4CisJYWRkCXIxNCxyYXgKKwl2bW92ZHFhCVhNTVdPUkRbMTEyK3JzcF0seG1tMTAKKwljbXAJQllURVsxMzUrcmJwXSwwCisJam5lCU5FQVIgJEwkeG9wXzAwXzQ3CisJcm9yCXIxMywyMworCW1vdglyYXgscjE0CisJbW92CXIxMixyOQorCXJvcglyMTQsNQorCXhvcglyMTMscjgKKwl4b3IJcjEyLHIxMAorCXJvcglyMTMsNAorCXhvcglyMTQscmF4CisJYW5kCXIxMixyOAorCXhvcglyMTMscjgKKwlhZGQJcjExLFFXT1JEW3JzcF0KKwltb3YJcjE1LHJheAorCXhvcglyMTIscjEwCisJcm9yCXIxNCw2CisJeG9yCXIxNSxyYngKKwlhZGQJcjExLHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscmF4CisJYWRkCXIxMSxyMTMKKwl4b3IJcmRpLHJieAorCXJvcglyMTQsMjgKKwlhZGQJcmR4LHIxMQorCWFkZAlyMTEscmRpCisJbW92CXIxMyxyZHgKKwlhZGQJcjE0LHIxMQorCXJvcglyMTMsMjMKKwltb3YJcjExLHIxNAorCW1vdglyMTIscjgKKwlyb3IJcjE0LDUKKwl4b3IJcjEzLHJkeAorCXhvcglyMTIscjkKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHIxMQorCWFuZAlyMTIscmR4CisJeG9yCXIxMyxyZHgKKwlhZGQJcjEwLFFXT1JEWzgrcnNwXQorCW1vdglyZGkscjExCisJeG9yCXIxMixyOQorCXJvcglyMTQsNgorCXhvcglyZGkscmF4CisJYWRkCXIxMCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHIxMQorCWFkZAlyMTAscjEzCisJeG9yCXIxNSxyYXgKKwlyb3IJcjE0LDI4CisJYWRkCXJjeCxyMTAKKwlhZGQJcjEwLHIxNQorCW1vdglyMTMscmN4CisJYWRkCXIxNCxyMTAKKwlyb3IJcjEzLDIzCisJbW92CXIxMCxyMTQKKwltb3YJcjEyLHJkeAorCXJvcglyMTQsNQorCXhvcglyMTMscmN4CisJeG9yCXIxMixyOAorCXJvcglyMTMsNAorCXhvcglyMTQscjEwCisJYW5kCXIxMixyY3gKKwl4b3IJcjEzLHJjeAorCWFkZAlyOSxRV09SRFsxNityc3BdCisJbW92CXIxNSxyMTAKKwl4b3IJcjEyLHI4CisJcm9yCXIxNCw2CisJeG9yCXIxNSxyMTEKKwlhZGQJcjkscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CisJeG9yCXIxNCxyMTAKKwlhZGQJcjkscjEzCisJeG9yCXJkaSxyMTEKKwlyb3IJcjE0LDI4CisJYWRkCXJieCxyOQorCWFkZAlyOSxyZGkKKwltb3YJcjEzLHJieAorCWFkZAlyMTQscjkKKwlyb3IJcjEzLDIzCisJbW92CXI5LHIxNAorCW1vdglyMTIscmN4CisJcm9yCXIxNCw1CisJeG9yCXIxMyxyYngKKwl4b3IJcjEyLHJkeAorCXJvcglyMTMsNAorCXhvcglyMTQscjkKKwlhbmQJcjEyLHJieAorCXhvcglyMTMscmJ4CisJYWRkCXI4LFFXT1JEWzI0K3JzcF0KKwltb3YJcmRpLHI5CisJeG9yCXIxMixyZHgKKwlyb3IJcjE0LDYKKwl4b3IJcmRpLHIxMAorCWFkZAlyOCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHI5CisJYWRkCXI4LHIxMworCXhvcglyMTUscjEwCisJcm9yCXIxNCwyOAorCWFkZAlyYXgscjgKKwlhZGQJcjgscjE1CisJbW92CXIxMyxyYXgKKwlhZGQJcjE0LHI4CisJcm9yCXIxMywyMworCW1vdglyOCxyMTQKKwltb3YJcjEyLHJieAorCXJvcglyMTQsNQorCXhvcglyMTMscmF4CisJeG9yCXIxMixyY3gKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHI4CisJYW5kCXIxMixyYXgKKwl4b3IJcjEzLHJheAorCWFkZAlyZHgsUVdPUkRbMzIrcnNwXQorCW1vdglyMTUscjgKKwl4b3IJcjEyLHJjeAorCXJvcglyMTQsNgorCXhvcglyMTUscjkKKwlhZGQJcmR4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscjgKKwlhZGQJcmR4LHIxMworCXhvcglyZGkscjkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMSxyZHgKKwlhZGQJcmR4LHJkaQorCW1vdglyMTMscjExCisJYWRkCXIxNCxyZHgKKwlyb3IJcjEzLDIzCisJbW92CXJkeCxyMTQKKwltb3YJcjEyLHJheAorCXJvcglyMTQsNQorCXhvcglyMTMscjExCisJeG9yCXIxMixyYngKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJkeAorCWFuZAlyMTIscjExCisJeG9yCXIxMyxyMTEKKwlhZGQJcmN4LFFXT1JEWzQwK3JzcF0KKwltb3YJcmRpLHJkeAorCXhvcglyMTIscmJ4CisJcm9yCXIxNCw2CisJeG9yCXJkaSxyOAorCWFkZAlyY3gscjEyCisJcm9yCXIxMywxNAorCWFuZAlyMTUscmRpCisJeG9yCXIxNCxyZHgKKwlhZGQJcmN4LHIxMworCXhvcglyMTUscjgKKwlyb3IJcjE0LDI4CisJYWRkCXIxMCxyY3gKKwlhZGQJcmN4LHIxNQorCW1vdglyMTMscjEwCisJYWRkCXIxNCxyY3gKKwlyb3IJcjEzLDIzCisJbW92CXJjeCxyMTQKKwltb3YJcjEyLHIxMQorCXJvcglyMTQsNQorCXhvcglyMTMscjEwCisJeG9yCXIxMixyYXgKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJjeAorCWFuZAlyMTIscjEwCisJeG9yCXIxMyxyMTAKKwlhZGQJcmJ4LFFXT1JEWzQ4K3JzcF0KKwltb3YJcjE1LHJjeAorCXhvcglyMTIscmF4CisJcm9yCXIxNCw2CisJeG9yCXIxNSxyZHgKKwlhZGQJcmJ4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscmN4CisJYWRkCXJieCxyMTMKKwl4b3IJcmRpLHJkeAorCXJvcglyMTQsMjgKKwlhZGQJcjkscmJ4CisJYWRkCXJieCxyZGkKKwltb3YJcjEzLHI5CisJYWRkCXIxNCxyYngKKwlyb3IJcjEzLDIzCisJbW92CXJieCxyMTQKKwltb3YJcjEyLHIxMAorCXJvcglyMTQsNQorCXhvcglyMTMscjkKKwl4b3IJcjEyLHIxMQorCXJvcglyMTMsNAorCXhvcglyMTQscmJ4CisJYW5kCXIxMixyOQorCXhvcglyMTMscjkKKwlhZGQJcmF4LFFXT1JEWzU2K3JzcF0KKwltb3YJcmRpLHJieAorCXhvcglyMTIscjExCisJcm9yCXIxNCw2CisJeG9yCXJkaSxyY3gKKwlhZGQJcmF4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXhvcglyMTQscmJ4CisJYWRkCXJheCxyMTMKKwl4b3IJcjE1LHJjeAorCXJvcglyMTQsMjgKKwlhZGQJcjgscmF4CisJYWRkCXJheCxyMTUKKwltb3YJcjEzLHI4CisJYWRkCXIxNCxyYXgKKwlyb3IJcjEzLDIzCisJbW92CXJheCxyMTQKKwltb3YJcjEyLHI5CisJcm9yCXIxNCw1CisJeG9yCXIxMyxyOAorCXhvcglyMTIscjEwCisJcm9yCXIxMyw0CisJeG9yCXIxNCxyYXgKKwlhbmQJcjEyLHI4CisJeG9yCXIxMyxyOAorCWFkZAlyMTEsUVdPUkRbNjQrcnNwXQorCW1vdglyMTUscmF4CisJeG9yCXIxMixyMTAKKwlyb3IJcjE0LDYKKwl4b3IJcjE1LHJieAorCWFkZAlyMTEscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CisJeG9yCXIxNCxyYXgKKwlhZGQJcjExLHIxMworCXhvcglyZGkscmJ4CisJcm9yCXIxNCwyOAorCWFkZAlyZHgscjExCisJYWRkCXIxMSxyZGkKKwltb3YJcjEzLHJkeAorCWFkZAlyMTQscjExCisJcm9yCXIxMywyMworCW1vdglyMTEscjE0CisJbW92CXIxMixyOAorCXJvcglyMTQsNQorCXhvcglyMTMscmR4CisJeG9yCXIxMixyOQorCXJvcglyMTMsNAorCXhvcglyMTQscjExCisJYW5kCXIxMixyZHgKKwl4b3IJcjEzLHJkeAorCWFkZAlyMTAsUVdPUkRbNzIrcnNwXQorCW1vdglyZGkscjExCisJeG9yCXIxMixyOQorCXJvcglyMTQsNgorCXhvcglyZGkscmF4CisJYWRkCXIxMCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHIxMQorCWFkZAlyMTAscjEzCisJeG9yCXIxNSxyYXgKKwlyb3IJcjE0LDI4CisJYWRkCXJjeCxyMTAKKwlhZGQJcjEwLHIxNQorCW1vdglyMTMscmN4CisJYWRkCXIxNCxyMTAKKwlyb3IJcjEzLDIzCisJbW92CXIxMCxyMTQKKwltb3YJcjEyLHJkeAorCXJvcglyMTQsNQorCXhvcglyMTMscmN4CisJeG9yCXIxMixyOAorCXJvcglyMTMsNAorCXhvcglyMTQscjEwCisJYW5kCXIxMixyY3gKKwl4b3IJcjEzLHJjeAorCWFkZAlyOSxRV09SRFs4MCtyc3BdCisJbW92CXIxNSxyMTAKKwl4b3IJcjEyLHI4CisJcm9yCXIxNCw2CisJeG9yCXIxNSxyMTEKKwlhZGQJcjkscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CisJeG9yCXIxNCxyMTAKKwlhZGQJcjkscjEzCisJeG9yCXJkaSxyMTEKKwlyb3IJcjE0LDI4CisJYWRkCXJieCxyOQorCWFkZAlyOSxyZGkKKwltb3YJcjEzLHJieAorCWFkZAlyMTQscjkKKwlyb3IJcjEzLDIzCisJbW92CXI5LHIxNAorCW1vdglyMTIscmN4CisJcm9yCXIxNCw1CisJeG9yCXIxMyxyYngKKwl4b3IJcjEyLHJkeAorCXJvcglyMTMsNAorCXhvcglyMTQscjkKKwlhbmQJcjEyLHJieAorCXhvcglyMTMscmJ4CisJYWRkCXI4LFFXT1JEWzg4K3JzcF0KKwltb3YJcmRpLHI5CisJeG9yCXIxMixyZHgKKwlyb3IJcjE0LDYKKwl4b3IJcmRpLHIxMAorCWFkZAlyOCxyMTIKKwlyb3IJcjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHI5CisJYWRkCXI4LHIxMworCXhvcglyMTUscjEwCisJcm9yCXIxNCwyOAorCWFkZAlyYXgscjgKKwlhZGQJcjgscjE1CisJbW92CXIxMyxyYXgKKwlhZGQJcjE0LHI4CisJcm9yCXIxMywyMworCW1vdglyOCxyMTQKKwltb3YJcjEyLHJieAorCXJvcglyMTQsNQorCXhvcglyMTMscmF4CisJeG9yCXIxMixyY3gKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHI4CisJYW5kCXIxMixyYXgKKwl4b3IJcjEzLHJheAorCWFkZAlyZHgsUVdPUkRbOTYrcnNwXQorCW1vdglyMTUscjgKKwl4b3IJcjEyLHJjeAorCXJvcglyMTQsNgorCXhvcglyMTUscjkKKwlhZGQJcmR4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscjgKKwlhZGQJcmR4LHIxMworCXhvcglyZGkscjkKKwlyb3IJcjE0LDI4CisJYWRkCXIxMSxyZHgKKwlhZGQJcmR4LHJkaQorCW1vdglyMTMscjExCisJYWRkCXIxNCxyZHgKKwlyb3IJcjEzLDIzCisJbW92CXJkeCxyMTQKKwltb3YJcjEyLHJheAorCXJvcglyMTQsNQorCXhvcglyMTMscjExCisJeG9yCXIxMixyYngKKwlyb3IJcjEzLDQKKwl4b3IJcjE0LHJkeAorCWFuZAlyMTIscjExCisJeG9yCXIxMyxyMTEKKwlhZGQJcmN4LFFXT1JEWzEwNCtyc3BdCisJbW92CXJkaSxyZHgKKwl4b3IJcjEyLHJieAorCXJvcglyMTQsNgorCXhvcglyZGkscjgKKwlhZGQJcmN4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXhvcglyMTQscmR4CisJYWRkCXJjeCxyMTMKKwl4b3IJcjE1LHI4CisJcm9yCXIxNCwyOAorCWFkZAlyMTAscmN4CisJYWRkCXJjeCxyMTUKKwltb3YJcjEzLHIxMAorCWFkZAlyMTQscmN4CisJcm9yCXIxMywyMworCW1vdglyY3gscjE0CisJbW92CXIxMixyMTEKKwlyb3IJcjE0LDUKKwl4b3IJcjEzLHIxMAorCXhvcglyMTIscmF4CisJcm9yCXIxMyw0CisJeG9yCXIxNCxyY3gKKwlhbmQJcjEyLHIxMAorCXhvcglyMTMscjEwCisJYWRkCXJieCxRV09SRFsxMTIrcnNwXQorCW1vdglyMTUscmN4CisJeG9yCXIxMixyYXgKKwlyb3IJcjE0LDYKKwl4b3IJcjE1LHJkeAorCWFkZAlyYngscjEyCisJcm9yCXIxMywxNAorCWFuZAlyZGkscjE1CisJeG9yCXIxNCxyY3gKKwlhZGQJcmJ4LHIxMworCXhvcglyZGkscmR4CisJcm9yCXIxNCwyOAorCWFkZAlyOSxyYngKKwlhZGQJcmJ4LHJkaQorCW1vdglyMTMscjkKKwlhZGQJcjE0LHJieAorCXJvcglyMTMsMjMKKwltb3YJcmJ4LHIxNAorCW1vdglyMTIscjEwCisJcm9yCXIxNCw1CisJeG9yCXIxMyxyOQorCXhvcglyMTIscjExCisJcm9yCXIxMyw0CisJeG9yCXIxNCxyYngKKwlhbmQJcjEyLHI5CisJeG9yCXIxMyxyOQorCWFkZAlyYXgsUVdPUkRbMTIwK3JzcF0KKwltb3YJcmRpLHJieAorCXhvcglyMTIscjExCisJcm9yCXIxNCw2CisJeG9yCXJkaSxyY3gKKwlhZGQJcmF4LHIxMgorCXJvcglyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXhvcglyMTQscmJ4CisJYWRkCXJheCxyMTMKKwl4b3IJcjE1LHJjeAorCXJvcglyMTQsMjgKKwlhZGQJcjgscmF4CisJYWRkCXJheCxyMTUKKwltb3YJcjEzLHI4CisJYWRkCXIxNCxyYXgKKwltb3YJcmRpLFFXT1JEWygoMTI4KzApKStyc3BdCisJbW92CXJheCxyMTQKKworCWFkZAlyYXgsUVdPUkRbcmRpXQorCWxlYQlyc2ksWzEyOCtyc2ldCisJYWRkCXJieCxRV09SRFs4K3JkaV0KKwlhZGQJcmN4LFFXT1JEWzE2K3JkaV0KKwlhZGQJcmR4LFFXT1JEWzI0K3JkaV0KKwlhZGQJcjgsUVdPUkRbMzIrcmRpXQorCWFkZAlyOSxRV09SRFs0MCtyZGldCisJYWRkCXIxMCxRV09SRFs0OCtyZGldCisJYWRkCXIxMSxRV09SRFs1NityZGldCisKKwljbXAJcnNpLFFXT1JEWygoMTI4KzE2KSkrcnNwXQorCisJbW92CVFXT1JEW3JkaV0scmF4CisJbW92CVFXT1JEWzgrcmRpXSxyYngKKwltb3YJUVdPUkRbMTYrcmRpXSxyY3gKKwltb3YJUVdPUkRbMjQrcmRpXSxyZHgKKwltb3YJUVdPUkRbMzIrcmRpXSxyOAorCW1vdglRV09SRFs0MCtyZGldLHI5CisJbW92CVFXT1JEWzQ4K3JkaV0scjEwCisJbW92CVFXT1JEWzU2K3JkaV0scjExCisJamIJTkVBUiAkTCRsb29wX3hvcAorCisJbW92CXJzaSxRV09SRFsxNTIrcnNwXQorCisJdnplcm91cHBlcgorCW1vdmFwcwl4bW02LFhNTVdPUkRbKCgxMjgrMzIpKStyc3BdCisJbW92YXBzCXhtbTcsWE1NV09SRFsoKDEyOCs0OCkpK3JzcF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoMTI4KzY0KSkrcnNwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbKCgxMjgrODApKStyc3BdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbKCgxMjgrOTYpKStyc3BdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbKCgxMjgrMTEyKSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRlcGlsb2d1ZV94b3A6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfeG9wOgorCitBTElHTgk2NAorc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisKKworCiskTCRhdnhfc2hvcnRjdXQ6CisJbW92CXJheCxyc3AKKworCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCXNobAlyZHgsNAorCXN1Yglyc3AsMjU2CisJbGVhCXJkeCxbcmR4KjgrcnNpXQorCWFuZAlyc3AsLTY0CisJbW92CVFXT1JEWygoMTI4KzApKStyc3BdLHJkaQorCW1vdglRV09SRFsoKDEyOCs4KSkrcnNwXSxyc2kKKwltb3YJUVdPUkRbKCgxMjgrMTYpKStyc3BdLHJkeAorCW1vdglRV09SRFsxNTIrcnNwXSxyYXgKKworCW1vdmFwcwlYTU1XT1JEWygxMjgrMzIpK3JzcF0seG1tNgorCW1vdmFwcwlYTU1XT1JEWygxMjgrNDgpK3JzcF0seG1tNworCW1vdmFwcwlYTU1XT1JEWygxMjgrNjQpK3JzcF0seG1tOAorCW1vdmFwcwlYTU1XT1JEWygxMjgrODApK3JzcF0seG1tOQorCW1vdmFwcwlYTU1XT1JEWygxMjgrOTYpK3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFsoMTI4KzExMikrcnNwXSx4bW0xMQorJEwkcHJvbG9ndWVfYXZ4OgorCisJdnplcm91cHBlcgorCW1vdglyYXgsUVdPUkRbcmRpXQorCW1vdglyYngsUVdPUkRbOCtyZGldCisJbW92CXJjeCxRV09SRFsxNityZGldCisJbW92CXJkeCxRV09SRFsyNCtyZGldCisJbW92CXI4LFFXT1JEWzMyK3JkaV0KKwltb3YJcjksUVdPUkRbNDArcmRpXQorCW1vdglyMTAsUVdPUkRbNDgrcmRpXQorCW1vdglyMTEsUVdPUkRbNTYrcmRpXQorCWptcAlORUFSICRMJGxvb3BfYXZ4CitBTElHTgkxNgorJEwkbG9vcF9hdng6CisJdm1vdmRxYQl4bW0xMSxYTU1XT1JEWygoSzUxMisxMjgwKSldCisJdm1vdmRxdQl4bW0wLFhNTVdPUkRbcnNpXQorCWxlYQlyYnAsWygoSzUxMisxMjgpKV0KKwl2bW92ZHF1CXhtbTEsWE1NV09SRFsxNityc2ldCisJdm1vdmRxdQl4bW0yLFhNTVdPUkRbMzIrcnNpXQorCXZwc2h1ZmIJeG1tMCx4bW0wLHhtbTExCisJdm1vdmRxdQl4bW0zLFhNTVdPUkRbNDgrcnNpXQorCXZwc2h1ZmIJeG1tMSx4bW0xLHhtbTExCisJdm1vdmRxdQl4bW00LFhNTVdPUkRbNjQrcnNpXQorCXZwc2h1ZmIJeG1tMix4bW0yLHhtbTExCisJdm1vdmRxdQl4bW01LFhNTVdPUkRbODArcnNpXQorCXZwc2h1ZmIJeG1tMyx4bW0zLHhtbTExCisJdm1vdmRxdQl4bW02LFhNTVdPUkRbOTYrcnNpXQorCXZwc2h1ZmIJeG1tNCx4bW00LHhtbTExCisJdm1vdmRxdQl4bW03LFhNTVdPUkRbMTEyK3JzaV0KKwl2cHNodWZiCXhtbTUseG1tNSx4bW0xMQorCXZwYWRkcQl4bW04LHhtbTAsWE1NV09SRFsoKC0xMjgpKStyYnBdCisJdnBzaHVmYgl4bW02LHhtbTYseG1tMTEKKwl2cGFkZHEJeG1tOSx4bW0xLFhNTVdPUkRbKCgtOTYpKStyYnBdCisJdnBzaHVmYgl4bW03LHhtbTcseG1tMTEKKwl2cGFkZHEJeG1tMTAseG1tMixYTU1XT1JEWygoLTY0KSkrcmJwXQorCXZwYWRkcQl4bW0xMSx4bW0zLFhNTVdPUkRbKCgtMzIpKStyYnBdCisJdm1vdmRxYQlYTU1XT1JEW3JzcF0seG1tOAorCXZwYWRkcQl4bW04LHhtbTQsWE1NV09SRFtyYnBdCisJdm1vdmRxYQlYTU1XT1JEWzE2K3JzcF0seG1tOQorCXZwYWRkcQl4bW05LHhtbTUsWE1NV09SRFszMityYnBdCisJdm1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tMTAKKwl2cGFkZHEJeG1tMTAseG1tNixYTU1XT1JEWzY0K3JicF0KKwl2bW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0xMQorCXZwYWRkcQl4bW0xMSx4bW03LFhNTVdPUkRbOTYrcmJwXQorCXZtb3ZkcWEJWE1NV09SRFs2NCtyc3BdLHhtbTgKKwltb3YJcjE0LHJheAorCXZtb3ZkcWEJWE1NV09SRFs4MCtyc3BdLHhtbTkKKwltb3YJcmRpLHJieAorCXZtb3ZkcWEJWE1NV09SRFs5Nityc3BdLHhtbTEwCisJeG9yCXJkaSxyY3gKKwl2bW92ZHFhCVhNTVdPUkRbMTEyK3JzcF0seG1tMTEKKwltb3YJcjEzLHI4CisJam1wCU5FQVIgJEwkYXZ4XzAwXzQ3CisKK0FMSUdOCTE2CiskTCRhdnhfMDBfNDc6CisJYWRkCXJicCwyNTYKKwl2cGFsaWducgl4bW04LHhtbTEseG1tMCw4CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXJheCxyMTQKKwl2cGFsaWducgl4bW0xMSx4bW01LHhtbTQsOAorCW1vdglyMTIscjkKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW0xMCx4bW04LDEKKwl4b3IJcjEzLHI4CisJeG9yCXIxMixyMTAKKwl2cGFkZHEJeG1tMCx4bW0wLHhtbTExCisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHJheAorCXZwc3JscQl4bW0xMSx4bW04LDcKKwlhbmQJcjEyLHI4CisJeG9yCXIxMyxyOAorCXZwc2xscQl4bW05LHhtbTgsNTYKKwlhZGQJcjExLFFXT1JEW3JzcF0KKwltb3YJcjE1LHJheAorCXZweG9yCXhtbTgseG1tMTEseG1tMTAKKwl4b3IJcjEyLHIxMAorCXNocmQJcjE0LHIxNCw2CisJdnBzcmxxCXhtbTEwLHhtbTEwLDcKKwl4b3IJcjE1LHJieAorCWFkZAlyMTEscjEyCisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXZwc2xscQl4bW05LHhtbTksNworCXhvcglyMTQscmF4CisJYWRkCXIxMSxyMTMKKwl2cHhvcgl4bW04LHhtbTgseG1tMTAKKwl4b3IJcmRpLHJieAorCXNocmQJcjE0LHIxNCwyOAorCXZwc3JscQl4bW0xMSx4bW03LDYKKwlhZGQJcmR4LHIxMQorCWFkZAlyMTEscmRpCisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwltb3YJcjEzLHJkeAorCWFkZAlyMTQscjExCisJdnBzbGxxCXhtbTEwLHhtbTcsMworCXNocmQJcjEzLHIxMywyMworCW1vdglyMTEscjE0CisJdnBhZGRxCXhtbTAseG1tMCx4bW04CisJbW92CXIxMixyOAorCXNocmQJcjE0LHIxNCw1CisJdnBzcmxxCXhtbTkseG1tNywxOQorCXhvcglyMTMscmR4CisJeG9yCXIxMixyOQorCXZweG9yCXhtbTExLHhtbTExLHhtbTEwCisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHIxMQorCXZwc2xscQl4bW0xMCx4bW0xMCw0MgorCWFuZAlyMTIscmR4CisJeG9yCXIxMyxyZHgKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJYWRkCXIxMCxRV09SRFs4K3JzcF0KKwltb3YJcmRpLHIxMQorCXZwc3JscQl4bW05LHhtbTksNDIKKwl4b3IJcjEyLHI5CisJc2hyZAlyMTQscjE0LDYKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCXhvcglyZGkscmF4CisJYWRkCXIxMCxyMTIKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl2cGFkZHEJeG1tMCx4bW0wLHhtbTExCisJeG9yCXIxNCxyMTEKKwlhZGQJcjEwLHIxMworCXZwYWRkcQl4bW0xMCx4bW0wLFhNTVdPUkRbKCgtMTI4KSkrcmJwXQorCXhvcglyMTUscmF4CisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXJjeCxyMTAKKwlhZGQJcjEwLHIxNQorCW1vdglyMTMscmN4CisJYWRkCXIxNCxyMTAKKwl2bW92ZHFhCVhNTVdPUkRbcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tMix4bW0xLDgKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjEwLHIxNAorCXZwYWxpZ25yCXhtbTExLHhtbTYseG1tNSw4CisJbW92CXIxMixyZHgKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW0xMCx4bW04LDEKKwl4b3IJcjEzLHJjeAorCXhvcglyMTIscjgKKwl2cGFkZHEJeG1tMSx4bW0xLHhtbTExCisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHIxMAorCXZwc3JscQl4bW0xMSx4bW04LDcKKwlhbmQJcjEyLHJjeAorCXhvcglyMTMscmN4CisJdnBzbGxxCXhtbTkseG1tOCw1NgorCWFkZAlyOSxRV09SRFsxNityc3BdCisJbW92CXIxNSxyMTAKKwl2cHhvcgl4bW04LHhtbTExLHhtbTEwCisJeG9yCXIxMixyOAorCXNocmQJcjE0LHIxNCw2CisJdnBzcmxxCXhtbTEwLHhtbTEwLDcKKwl4b3IJcjE1LHIxMQorCWFkZAlyOSxyMTIKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyZGkscjE1CisJdnBzbGxxCXhtbTkseG1tOSw3CisJeG9yCXIxNCxyMTAKKwlhZGQJcjkscjEzCisJdnB4b3IJeG1tOCx4bW04LHhtbTEwCisJeG9yCXJkaSxyMTEKKwlzaHJkCXIxNCxyMTQsMjgKKwl2cHNybHEJeG1tMTEseG1tMCw2CisJYWRkCXJieCxyOQorCWFkZAlyOSxyZGkKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCW1vdglyMTMscmJ4CisJYWRkCXIxNCxyOQorCXZwc2xscQl4bW0xMCx4bW0wLDMKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjkscjE0CisJdnBhZGRxCXhtbTEseG1tMSx4bW04CisJbW92CXIxMixyY3gKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW05LHhtbTAsMTkKKwl4b3IJcjEzLHJieAorCXhvcglyMTIscmR4CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjkKKwl2cHNsbHEJeG1tMTAseG1tMTAsNDIKKwlhbmQJcjEyLHJieAorCXhvcglyMTMscmJ4CisJdnB4b3IJeG1tMTEseG1tMTEseG1tOQorCWFkZAlyOCxRV09SRFsyNCtyc3BdCisJbW92CXJkaSxyOQorCXZwc3JscQl4bW05LHhtbTksNDIKKwl4b3IJcjEyLHJkeAorCXNocmQJcjE0LHIxNCw2CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwl4b3IJcmRpLHIxMAorCWFkZAlyOCxyMTIKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl2cGFkZHEJeG1tMSx4bW0xLHhtbTExCisJeG9yCXIxNCxyOQorCWFkZAlyOCxyMTMKKwl2cGFkZHEJeG1tMTAseG1tMSxYTU1XT1JEWygoLTk2KSkrcmJwXQorCXhvcglyMTUscjEwCisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXJheCxyOAorCWFkZAlyOCxyMTUKKwltb3YJcjEzLHJheAorCWFkZAlyMTQscjgKKwl2bW92ZHFhCVhNTVdPUkRbMTYrcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tMyx4bW0yLDgKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjgscjE0CisJdnBhbGlnbnIJeG1tMTEseG1tNyx4bW02LDgKKwltb3YJcjEyLHJieAorCXNocmQJcjE0LHIxNCw1CisJdnBzcmxxCXhtbTEwLHhtbTgsMQorCXhvcglyMTMscmF4CisJeG9yCXIxMixyY3gKKwl2cGFkZHEJeG1tMix4bW0yLHhtbTExCisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHI4CisJdnBzcmxxCXhtbTExLHhtbTgsNworCWFuZAlyMTIscmF4CisJeG9yCXIxMyxyYXgKKwl2cHNsbHEJeG1tOSx4bW04LDU2CisJYWRkCXJkeCxRV09SRFszMityc3BdCisJbW92CXIxNSxyOAorCXZweG9yCXhtbTgseG1tMTEseG1tMTAKKwl4b3IJcjEyLHJjeAorCXNocmQJcjE0LHIxNCw2CisJdnBzcmxxCXhtbTEwLHhtbTEwLDcKKwl4b3IJcjE1LHI5CisJYWRkCXJkeCxyMTIKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyZGkscjE1CisJdnBzbGxxCXhtbTkseG1tOSw3CisJeG9yCXIxNCxyOAorCWFkZAlyZHgscjEzCisJdnB4b3IJeG1tOCx4bW04LHhtbTEwCisJeG9yCXJkaSxyOQorCXNocmQJcjE0LHIxNCwyOAorCXZwc3JscQl4bW0xMSx4bW0xLDYKKwlhZGQJcjExLHJkeAorCWFkZAlyZHgscmRpCisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwltb3YJcjEzLHIxMQorCWFkZAlyMTQscmR4CisJdnBzbGxxCXhtbTEwLHhtbTEsMworCXNocmQJcjEzLHIxMywyMworCW1vdglyZHgscjE0CisJdnBhZGRxCXhtbTIseG1tMix4bW04CisJbW92CXIxMixyYXgKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW05LHhtbTEsMTkKKwl4b3IJcjEzLHIxMQorCXhvcglyMTIscmJ4CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscmR4CisJdnBzbGxxCXhtbTEwLHhtbTEwLDQyCisJYW5kCXIxMixyMTEKKwl4b3IJcjEzLHIxMQorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlhZGQJcmN4LFFXT1JEWzQwK3JzcF0KKwltb3YJcmRpLHJkeAorCXZwc3JscQl4bW05LHhtbTksNDIKKwl4b3IJcjEyLHJieAorCXNocmQJcjE0LHIxNCw2CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwl4b3IJcmRpLHI4CisJYWRkCXJjeCxyMTIKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl2cGFkZHEJeG1tMix4bW0yLHhtbTExCisJeG9yCXIxNCxyZHgKKwlhZGQJcmN4LHIxMworCXZwYWRkcQl4bW0xMCx4bW0yLFhNTVdPUkRbKCgtNjQpKStyYnBdCisJeG9yCXIxNSxyOAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyMTAscmN4CisJYWRkCXJjeCxyMTUKKwltb3YJcjEzLHIxMAorCWFkZAlyMTQscmN4CisJdm1vdmRxYQlYTU1XT1JEWzMyK3JzcF0seG1tMTAKKwl2cGFsaWducgl4bW04LHhtbTQseG1tMyw4CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXJjeCxyMTQKKwl2cGFsaWducgl4bW0xMSx4bW0wLHhtbTcsOAorCW1vdglyMTIscjExCisJc2hyZAlyMTQscjE0LDUKKwl2cHNybHEJeG1tMTAseG1tOCwxCisJeG9yCXIxMyxyMTAKKwl4b3IJcjEyLHJheAorCXZwYWRkcQl4bW0zLHhtbTMseG1tMTEKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscmN4CisJdnBzcmxxCXhtbTExLHhtbTgsNworCWFuZAlyMTIscjEwCisJeG9yCXIxMyxyMTAKKwl2cHNsbHEJeG1tOSx4bW04LDU2CisJYWRkCXJieCxRV09SRFs0OCtyc3BdCisJbW92CXIxNSxyY3gKKwl2cHhvcgl4bW04LHhtbTExLHhtbTEwCisJeG9yCXIxMixyYXgKKwlzaHJkCXIxNCxyMTQsNgorCXZwc3JscQl4bW0xMCx4bW0xMCw3CisJeG9yCXIxNSxyZHgKKwlhZGQJcmJ4LHIxMgorCXZweG9yCXhtbTgseG1tOCx4bW05CisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXJkaSxyMTUKKwl2cHNsbHEJeG1tOSx4bW05LDcKKwl4b3IJcjE0LHJjeAorCWFkZAlyYngscjEzCisJdnB4b3IJeG1tOCx4bW04LHhtbTEwCisJeG9yCXJkaSxyZHgKKwlzaHJkCXIxNCxyMTQsMjgKKwl2cHNybHEJeG1tMTEseG1tMiw2CisJYWRkCXI5LHJieAorCWFkZAlyYngscmRpCisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwltb3YJcjEzLHI5CisJYWRkCXIxNCxyYngKKwl2cHNsbHEJeG1tMTAseG1tMiwzCisJc2hyZAlyMTMscjEzLDIzCisJbW92CXJieCxyMTQKKwl2cGFkZHEJeG1tMyx4bW0zLHhtbTgKKwltb3YJcjEyLHIxMAorCXNocmQJcjE0LHIxNCw1CisJdnBzcmxxCXhtbTkseG1tMiwxOQorCXhvcglyMTMscjkKKwl4b3IJcjEyLHIxMQorCXZweG9yCXhtbTExLHhtbTExLHhtbTEwCisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHJieAorCXZwc2xscQl4bW0xMCx4bW0xMCw0MgorCWFuZAlyMTIscjkKKwl4b3IJcjEzLHI5CisJdnB4b3IJeG1tMTEseG1tMTEseG1tOQorCWFkZAlyYXgsUVdPUkRbNTYrcnNwXQorCW1vdglyZGkscmJ4CisJdnBzcmxxCXhtbTkseG1tOSw0MgorCXhvcglyMTIscjExCisJc2hyZAlyMTQscjE0LDYKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCXhvcglyZGkscmN4CisJYWRkCXJheCxyMTIKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl2cGFkZHEJeG1tMyx4bW0zLHhtbTExCisJeG9yCXIxNCxyYngKKwlhZGQJcmF4LHIxMworCXZwYWRkcQl4bW0xMCx4bW0zLFhNTVdPUkRbKCgtMzIpKStyYnBdCisJeG9yCXIxNSxyY3gKKwlzaHJkCXIxNCxyMTQsMjgKKwlhZGQJcjgscmF4CisJYWRkCXJheCxyMTUKKwltb3YJcjEzLHI4CisJYWRkCXIxNCxyYXgKKwl2bW92ZHFhCVhNTVdPUkRbNDgrcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tNSx4bW00LDgKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcmF4LHIxNAorCXZwYWxpZ25yCXhtbTExLHhtbTEseG1tMCw4CisJbW92CXIxMixyOQorCXNocmQJcjE0LHIxNCw1CisJdnBzcmxxCXhtbTEwLHhtbTgsMQorCXhvcglyMTMscjgKKwl4b3IJcjEyLHIxMAorCXZwYWRkcQl4bW00LHhtbTQseG1tMTEKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscmF4CisJdnBzcmxxCXhtbTExLHhtbTgsNworCWFuZAlyMTIscjgKKwl4b3IJcjEzLHI4CisJdnBzbGxxCXhtbTkseG1tOCw1NgorCWFkZAlyMTEsUVdPUkRbNjQrcnNwXQorCW1vdglyMTUscmF4CisJdnB4b3IJeG1tOCx4bW0xMSx4bW0xMAorCXhvcglyMTIscjEwCisJc2hyZAlyMTQscjE0LDYKKwl2cHNybHEJeG1tMTAseG1tMTAsNworCXhvcglyMTUscmJ4CisJYWRkCXIxMSxyMTIKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyZGkscjE1CisJdnBzbGxxCXhtbTkseG1tOSw3CisJeG9yCXIxNCxyYXgKKwlhZGQJcjExLHIxMworCXZweG9yCXhtbTgseG1tOCx4bW0xMAorCXhvcglyZGkscmJ4CisJc2hyZAlyMTQscjE0LDI4CisJdnBzcmxxCXhtbTExLHhtbTMsNgorCWFkZAlyZHgscjExCisJYWRkCXIxMSxyZGkKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCW1vdglyMTMscmR4CisJYWRkCXIxNCxyMTEKKwl2cHNsbHEJeG1tMTAseG1tMywzCisJc2hyZAlyMTMscjEzLDIzCisJbW92CXIxMSxyMTQKKwl2cGFkZHEJeG1tNCx4bW00LHhtbTgKKwltb3YJcjEyLHI4CisJc2hyZAlyMTQscjE0LDUKKwl2cHNybHEJeG1tOSx4bW0zLDE5CisJeG9yCXIxMyxyZHgKKwl4b3IJcjEyLHI5CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjExCisJdnBzbGxxCXhtbTEwLHhtbTEwLDQyCisJYW5kCXIxMixyZHgKKwl4b3IJcjEzLHJkeAorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlhZGQJcjEwLFFXT1JEWzcyK3JzcF0KKwltb3YJcmRpLHIxMQorCXZwc3JscQl4bW05LHhtbTksNDIKKwl4b3IJcjEyLHI5CisJc2hyZAlyMTQscjE0LDYKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCXhvcglyZGkscmF4CisJYWRkCXIxMCxyMTIKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl2cGFkZHEJeG1tNCx4bW00LHhtbTExCisJeG9yCXIxNCxyMTEKKwlhZGQJcjEwLHIxMworCXZwYWRkcQl4bW0xMCx4bW00LFhNTVdPUkRbcmJwXQorCXhvcglyMTUscmF4CisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXJjeCxyMTAKKwlhZGQJcjEwLHIxNQorCW1vdglyMTMscmN4CisJYWRkCXIxNCxyMTAKKwl2bW92ZHFhCVhNTVdPUkRbNjQrcnNwXSx4bW0xMAorCXZwYWxpZ25yCXhtbTgseG1tNix4bW01LDgKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjEwLHIxNAorCXZwYWxpZ25yCXhtbTExLHhtbTIseG1tMSw4CisJbW92CXIxMixyZHgKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW0xMCx4bW04LDEKKwl4b3IJcjEzLHJjeAorCXhvcglyMTIscjgKKwl2cGFkZHEJeG1tNSx4bW01LHhtbTExCisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHIxMAorCXZwc3JscQl4bW0xMSx4bW04LDcKKwlhbmQJcjEyLHJjeAorCXhvcglyMTMscmN4CisJdnBzbGxxCXhtbTkseG1tOCw1NgorCWFkZAlyOSxRV09SRFs4MCtyc3BdCisJbW92CXIxNSxyMTAKKwl2cHhvcgl4bW04LHhtbTExLHhtbTEwCisJeG9yCXIxMixyOAorCXNocmQJcjE0LHIxNCw2CisJdnBzcmxxCXhtbTEwLHhtbTEwLDcKKwl4b3IJcjE1LHIxMQorCWFkZAlyOSxyMTIKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyZGkscjE1CisJdnBzbGxxCXhtbTkseG1tOSw3CisJeG9yCXIxNCxyMTAKKwlhZGQJcjkscjEzCisJdnB4b3IJeG1tOCx4bW04LHhtbTEwCisJeG9yCXJkaSxyMTEKKwlzaHJkCXIxNCxyMTQsMjgKKwl2cHNybHEJeG1tMTEseG1tNCw2CisJYWRkCXJieCxyOQorCWFkZAlyOSxyZGkKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCW1vdglyMTMscmJ4CisJYWRkCXIxNCxyOQorCXZwc2xscQl4bW0xMCx4bW00LDMKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjkscjE0CisJdnBhZGRxCXhtbTUseG1tNSx4bW04CisJbW92CXIxMixyY3gKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW05LHhtbTQsMTkKKwl4b3IJcjEzLHJieAorCXhvcglyMTIscmR4CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjkKKwl2cHNsbHEJeG1tMTAseG1tMTAsNDIKKwlhbmQJcjEyLHJieAorCXhvcglyMTMscmJ4CisJdnB4b3IJeG1tMTEseG1tMTEseG1tOQorCWFkZAlyOCxRV09SRFs4OCtyc3BdCisJbW92CXJkaSxyOQorCXZwc3JscQl4bW05LHhtbTksNDIKKwl4b3IJcjEyLHJkeAorCXNocmQJcjE0LHIxNCw2CisJdnB4b3IJeG1tMTEseG1tMTEseG1tMTAKKwl4b3IJcmRpLHIxMAorCWFkZAlyOCxyMTIKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl2cGFkZHEJeG1tNSx4bW01LHhtbTExCisJeG9yCXIxNCxyOQorCWFkZAlyOCxyMTMKKwl2cGFkZHEJeG1tMTAseG1tNSxYTU1XT1JEWzMyK3JicF0KKwl4b3IJcjE1LHIxMAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyYXgscjgKKwlhZGQJcjgscjE1CisJbW92CXIxMyxyYXgKKwlhZGQJcjE0LHI4CisJdm1vdmRxYQlYTU1XT1JEWzgwK3JzcF0seG1tMTAKKwl2cGFsaWducgl4bW04LHhtbTcseG1tNiw4CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXI4LHIxNAorCXZwYWxpZ25yCXhtbTExLHhtbTMseG1tMiw4CisJbW92CXIxMixyYngKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW0xMCx4bW04LDEKKwl4b3IJcjEzLHJheAorCXhvcglyMTIscmN4CisJdnBhZGRxCXhtbTYseG1tNix4bW0xMQorCXNocmQJcjEzLHIxMyw0CisJeG9yCXIxNCxyOAorCXZwc3JscQl4bW0xMSx4bW04LDcKKwlhbmQJcjEyLHJheAorCXhvcglyMTMscmF4CisJdnBzbGxxCXhtbTkseG1tOCw1NgorCWFkZAlyZHgsUVdPUkRbOTYrcnNwXQorCW1vdglyMTUscjgKKwl2cHhvcgl4bW04LHhtbTExLHhtbTEwCisJeG9yCXIxMixyY3gKKwlzaHJkCXIxNCxyMTQsNgorCXZwc3JscQl4bW0xMCx4bW0xMCw3CisJeG9yCXIxNSxyOQorCWFkZAlyZHgscjEyCisJdnB4b3IJeG1tOCx4bW04LHhtbTkKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXZwc2xscQl4bW05LHhtbTksNworCXhvcglyMTQscjgKKwlhZGQJcmR4LHIxMworCXZweG9yCXhtbTgseG1tOCx4bW0xMAorCXhvcglyZGkscjkKKwlzaHJkCXIxNCxyMTQsMjgKKwl2cHNybHEJeG1tMTEseG1tNSw2CisJYWRkCXIxMSxyZHgKKwlhZGQJcmR4LHJkaQorCXZweG9yCXhtbTgseG1tOCx4bW05CisJbW92CXIxMyxyMTEKKwlhZGQJcjE0LHJkeAorCXZwc2xscQl4bW0xMCx4bW01LDMKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcmR4LHIxNAorCXZwYWRkcQl4bW02LHhtbTYseG1tOAorCW1vdglyMTIscmF4CisJc2hyZAlyMTQscjE0LDUKKwl2cHNybHEJeG1tOSx4bW01LDE5CisJeG9yCXIxMyxyMTEKKwl4b3IJcjEyLHJieAorCXZweG9yCXhtbTExLHhtbTExLHhtbTEwCisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHJkeAorCXZwc2xscQl4bW0xMCx4bW0xMCw0MgorCWFuZAlyMTIscjExCisJeG9yCXIxMyxyMTEKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW05CisJYWRkCXJjeCxRV09SRFsxMDQrcnNwXQorCW1vdglyZGkscmR4CisJdnBzcmxxCXhtbTkseG1tOSw0MgorCXhvcglyMTIscmJ4CisJc2hyZAlyMTQscjE0LDYKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCXhvcglyZGkscjgKKwlhZGQJcmN4LHIxMgorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXZwYWRkcQl4bW02LHhtbTYseG1tMTEKKwl4b3IJcjE0LHJkeAorCWFkZAlyY3gscjEzCisJdnBhZGRxCXhtbTEwLHhtbTYsWE1NV09SRFs2NCtyYnBdCisJeG9yCXIxNSxyOAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyMTAscmN4CisJYWRkCXJjeCxyMTUKKwltb3YJcjEzLHIxMAorCWFkZAlyMTQscmN4CisJdm1vdmRxYQlYTU1XT1JEWzk2K3JzcF0seG1tMTAKKwl2cGFsaWducgl4bW04LHhtbTAseG1tNyw4CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXJjeCxyMTQKKwl2cGFsaWducgl4bW0xMSx4bW00LHhtbTMsOAorCW1vdglyMTIscjExCisJc2hyZAlyMTQscjE0LDUKKwl2cHNybHEJeG1tMTAseG1tOCwxCisJeG9yCXIxMyxyMTAKKwl4b3IJcjEyLHJheAorCXZwYWRkcQl4bW03LHhtbTcseG1tMTEKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscmN4CisJdnBzcmxxCXhtbTExLHhtbTgsNworCWFuZAlyMTIscjEwCisJeG9yCXIxMyxyMTAKKwl2cHNsbHEJeG1tOSx4bW04LDU2CisJYWRkCXJieCxRV09SRFsxMTIrcnNwXQorCW1vdglyMTUscmN4CisJdnB4b3IJeG1tOCx4bW0xMSx4bW0xMAorCXhvcglyMTIscmF4CisJc2hyZAlyMTQscjE0LDYKKwl2cHNybHEJeG1tMTAseG1tMTAsNworCXhvcglyMTUscmR4CisJYWRkCXJieCxyMTIKKwl2cHhvcgl4bW04LHhtbTgseG1tOQorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyZGkscjE1CisJdnBzbGxxCXhtbTkseG1tOSw3CisJeG9yCXIxNCxyY3gKKwlhZGQJcmJ4LHIxMworCXZweG9yCXhtbTgseG1tOCx4bW0xMAorCXhvcglyZGkscmR4CisJc2hyZAlyMTQscjE0LDI4CisJdnBzcmxxCXhtbTExLHhtbTYsNgorCWFkZAlyOSxyYngKKwlhZGQJcmJ4LHJkaQorCXZweG9yCXhtbTgseG1tOCx4bW05CisJbW92CXIxMyxyOQorCWFkZAlyMTQscmJ4CisJdnBzbGxxCXhtbTEwLHhtbTYsMworCXNocmQJcjEzLHIxMywyMworCW1vdglyYngscjE0CisJdnBhZGRxCXhtbTcseG1tNyx4bW04CisJbW92CXIxMixyMTAKKwlzaHJkCXIxNCxyMTQsNQorCXZwc3JscQl4bW05LHhtbTYsMTkKKwl4b3IJcjEzLHI5CisJeG9yCXIxMixyMTEKKwl2cHhvcgl4bW0xMSx4bW0xMSx4bW0xMAorCXNocmQJcjEzLHIxMyw0CisJeG9yCXIxNCxyYngKKwl2cHNsbHEJeG1tMTAseG1tMTAsNDIKKwlhbmQJcjEyLHI5CisJeG9yCXIxMyxyOQorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlhZGQJcmF4LFFXT1JEWzEyMCtyc3BdCisJbW92CXJkaSxyYngKKwl2cHNybHEJeG1tOSx4bW05LDQyCisJeG9yCXIxMixyMTEKKwlzaHJkCXIxNCxyMTQsNgorCXZweG9yCXhtbTExLHhtbTExLHhtbTEwCisJeG9yCXJkaSxyY3gKKwlhZGQJcmF4LHIxMgorCXZweG9yCXhtbTExLHhtbTExLHhtbTkKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXZwYWRkcQl4bW03LHhtbTcseG1tMTEKKwl4b3IJcjE0LHJieAorCWFkZAlyYXgscjEzCisJdnBhZGRxCXhtbTEwLHhtbTcsWE1NV09SRFs5NityYnBdCisJeG9yCXIxNSxyY3gKKwlzaHJkCXIxNCxyMTQsMjgKKwlhZGQJcjgscmF4CisJYWRkCXJheCxyMTUKKwltb3YJcjEzLHI4CisJYWRkCXIxNCxyYXgKKwl2bW92ZHFhCVhNTVdPUkRbMTEyK3JzcF0seG1tMTAKKwljbXAJQllURVsxMzUrcmJwXSwwCisJam5lCU5FQVIgJEwkYXZ4XzAwXzQ3CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXJheCxyMTQKKwltb3YJcjEyLHI5CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHI4CisJeG9yCXIxMixyMTAKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscmF4CisJYW5kCXIxMixyOAorCXhvcglyMTMscjgKKwlhZGQJcjExLFFXT1JEW3JzcF0KKwltb3YJcjE1LHJheAorCXhvcglyMTIscjEwCisJc2hyZAlyMTQscjE0LDYKKwl4b3IJcjE1LHJieAorCWFkZAlyMTEscjEyCisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXJkaSxyMTUKKwl4b3IJcjE0LHJheAorCWFkZAlyMTEscjEzCisJeG9yCXJkaSxyYngKKwlzaHJkCXIxNCxyMTQsMjgKKwlhZGQJcmR4LHIxMQorCWFkZAlyMTEscmRpCisJbW92CXIxMyxyZHgKKwlhZGQJcjE0LHIxMQorCXNocmQJcjEzLHIxMywyMworCW1vdglyMTEscjE0CisJbW92CXIxMixyOAorCXNocmQJcjE0LHIxNCw1CisJeG9yCXIxMyxyZHgKKwl4b3IJcjEyLHI5CisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHIxMQorCWFuZAlyMTIscmR4CisJeG9yCXIxMyxyZHgKKwlhZGQJcjEwLFFXT1JEWzgrcnNwXQorCW1vdglyZGkscjExCisJeG9yCXIxMixyOQorCXNocmQJcjE0LHIxNCw2CisJeG9yCXJkaSxyYXgKKwlhZGQJcjEwLHIxMgorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyMTUscmRpCisJeG9yCXIxNCxyMTEKKwlhZGQJcjEwLHIxMworCXhvcglyMTUscmF4CisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXJjeCxyMTAKKwlhZGQJcjEwLHIxNQorCW1vdglyMTMscmN4CisJYWRkCXIxNCxyMTAKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjEwLHIxNAorCW1vdglyMTIscmR4CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHJjeAorCXhvcglyMTIscjgKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjEwCisJYW5kCXIxMixyY3gKKwl4b3IJcjEzLHJjeAorCWFkZAlyOSxRV09SRFsxNityc3BdCisJbW92CXIxNSxyMTAKKwl4b3IJcjEyLHI4CisJc2hyZAlyMTQscjE0LDYKKwl4b3IJcjE1LHIxMQorCWFkZAlyOSxyMTIKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscjEwCisJYWRkCXI5LHIxMworCXhvcglyZGkscjExCisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXJieCxyOQorCWFkZAlyOSxyZGkKKwltb3YJcjEzLHJieAorCWFkZAlyMTQscjkKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjkscjE0CisJbW92CXIxMixyY3gKKwlzaHJkCXIxNCxyMTQsNQorCXhvcglyMTMscmJ4CisJeG9yCXIxMixyZHgKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjkKKwlhbmQJcjEyLHJieAorCXhvcglyMTMscmJ4CisJYWRkCXI4LFFXT1JEWzI0K3JzcF0KKwltb3YJcmRpLHI5CisJeG9yCXIxMixyZHgKKwlzaHJkCXIxNCxyMTQsNgorCXhvcglyZGkscjEwCisJYWRkCXI4LHIxMgorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyMTUscmRpCisJeG9yCXIxNCxyOQorCWFkZAlyOCxyMTMKKwl4b3IJcjE1LHIxMAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyYXgscjgKKwlhZGQJcjgscjE1CisJbW92CXIxMyxyYXgKKwlhZGQJcjE0LHI4CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXI4LHIxNAorCW1vdglyMTIscmJ4CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHJheAorCXhvcglyMTIscmN4CisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHI4CisJYW5kCXIxMixyYXgKKwl4b3IJcjEzLHJheAorCWFkZAlyZHgsUVdPUkRbMzIrcnNwXQorCW1vdglyMTUscjgKKwl4b3IJcjEyLHJjeAorCXNocmQJcjE0LHIxNCw2CisJeG9yCXIxNSxyOQorCWFkZAlyZHgscjEyCisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXJkaSxyMTUKKwl4b3IJcjE0LHI4CisJYWRkCXJkeCxyMTMKKwl4b3IJcmRpLHI5CisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXIxMSxyZHgKKwlhZGQJcmR4LHJkaQorCW1vdglyMTMscjExCisJYWRkCXIxNCxyZHgKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcmR4LHIxNAorCW1vdglyMTIscmF4CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHIxMQorCXhvcglyMTIscmJ4CisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHJkeAorCWFuZAlyMTIscjExCisJeG9yCXIxMyxyMTEKKwlhZGQJcmN4LFFXT1JEWzQwK3JzcF0KKwltb3YJcmRpLHJkeAorCXhvcglyMTIscmJ4CisJc2hyZAlyMTQscjE0LDYKKwl4b3IJcmRpLHI4CisJYWRkCXJjeCxyMTIKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcjE1LHJkaQorCXhvcglyMTQscmR4CisJYWRkCXJjeCxyMTMKKwl4b3IJcjE1LHI4CisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXIxMCxyY3gKKwlhZGQJcmN4LHIxNQorCW1vdglyMTMscjEwCisJYWRkCXIxNCxyY3gKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcmN4LHIxNAorCW1vdglyMTIscjExCisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHIxMAorCXhvcglyMTIscmF4CisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHJjeAorCWFuZAlyMTIscjEwCisJeG9yCXIxMyxyMTAKKwlhZGQJcmJ4LFFXT1JEWzQ4K3JzcF0KKwltb3YJcjE1LHJjeAorCXhvcglyMTIscmF4CisJc2hyZAlyMTQscjE0LDYKKwl4b3IJcjE1LHJkeAorCWFkZAlyYngscjEyCisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXJkaSxyMTUKKwl4b3IJcjE0LHJjeAorCWFkZAlyYngscjEzCisJeG9yCXJkaSxyZHgKKwlzaHJkCXIxNCxyMTQsMjgKKwlhZGQJcjkscmJ4CisJYWRkCXJieCxyZGkKKwltb3YJcjEzLHI5CisJYWRkCXIxNCxyYngKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcmJ4LHIxNAorCW1vdglyMTIscjEwCisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHI5CisJeG9yCXIxMixyMTEKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscmJ4CisJYW5kCXIxMixyOQorCXhvcglyMTMscjkKKwlhZGQJcmF4LFFXT1JEWzU2K3JzcF0KKwltb3YJcmRpLHJieAorCXhvcglyMTIscjExCisJc2hyZAlyMTQscjE0LDYKKwl4b3IJcmRpLHJjeAorCWFkZAlyYXgscjEyCisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHJieAorCWFkZAlyYXgscjEzCisJeG9yCXIxNSxyY3gKKwlzaHJkCXIxNCxyMTQsMjgKKwlhZGQJcjgscmF4CisJYWRkCXJheCxyMTUKKwltb3YJcjEzLHI4CisJYWRkCXIxNCxyYXgKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcmF4LHIxNAorCW1vdglyMTIscjkKKwlzaHJkCXIxNCxyMTQsNQorCXhvcglyMTMscjgKKwl4b3IJcjEyLHIxMAorCXNocmQJcjEzLHIxMyw0CisJeG9yCXIxNCxyYXgKKwlhbmQJcjEyLHI4CisJeG9yCXIxMyxyOAorCWFkZAlyMTEsUVdPUkRbNjQrcnNwXQorCW1vdglyMTUscmF4CisJeG9yCXIxMixyMTAKKwlzaHJkCXIxNCxyMTQsNgorCXhvcglyMTUscmJ4CisJYWRkCXIxMSxyMTIKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscmF4CisJYWRkCXIxMSxyMTMKKwl4b3IJcmRpLHJieAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyZHgscjExCisJYWRkCXIxMSxyZGkKKwltb3YJcjEzLHJkeAorCWFkZAlyMTQscjExCisJc2hyZAlyMTMscjEzLDIzCisJbW92CXIxMSxyMTQKKwltb3YJcjEyLHI4CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHJkeAorCXhvcglyMTIscjkKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjExCisJYW5kCXIxMixyZHgKKwl4b3IJcjEzLHJkeAorCWFkZAlyMTAsUVdPUkRbNzIrcnNwXQorCW1vdglyZGkscjExCisJeG9yCXIxMixyOQorCXNocmQJcjE0LHIxNCw2CisJeG9yCXJkaSxyYXgKKwlhZGQJcjEwLHIxMgorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyMTUscmRpCisJeG9yCXIxNCxyMTEKKwlhZGQJcjEwLHIxMworCXhvcglyMTUscmF4CisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXJjeCxyMTAKKwlhZGQJcjEwLHIxNQorCW1vdglyMTMscmN4CisJYWRkCXIxNCxyMTAKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjEwLHIxNAorCW1vdglyMTIscmR4CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHJjeAorCXhvcglyMTIscjgKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjEwCisJYW5kCXIxMixyY3gKKwl4b3IJcjEzLHJjeAorCWFkZAlyOSxRV09SRFs4MCtyc3BdCisJbW92CXIxNSxyMTAKKwl4b3IJcjEyLHI4CisJc2hyZAlyMTQscjE0LDYKKwl4b3IJcjE1LHIxMQorCWFkZAlyOSxyMTIKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscjEwCisJYWRkCXI5LHIxMworCXhvcglyZGkscjExCisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXJieCxyOQorCWFkZAlyOSxyZGkKKwltb3YJcjEzLHJieAorCWFkZAlyMTQscjkKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcjkscjE0CisJbW92CXIxMixyY3gKKwlzaHJkCXIxNCxyMTQsNQorCXhvcglyMTMscmJ4CisJeG9yCXIxMixyZHgKKwlzaHJkCXIxMyxyMTMsNAorCXhvcglyMTQscjkKKwlhbmQJcjEyLHJieAorCXhvcglyMTMscmJ4CisJYWRkCXI4LFFXT1JEWzg4K3JzcF0KKwltb3YJcmRpLHI5CisJeG9yCXIxMixyZHgKKwlzaHJkCXIxNCxyMTQsNgorCXhvcglyZGkscjEwCisJYWRkCXI4LHIxMgorCXNocmQJcjEzLHIxMywxNAorCWFuZAlyMTUscmRpCisJeG9yCXIxNCxyOQorCWFkZAlyOCxyMTMKKwl4b3IJcjE1LHIxMAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyYXgscjgKKwlhZGQJcjgscjE1CisJbW92CXIxMyxyYXgKKwlhZGQJcjE0LHI4CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXI4LHIxNAorCW1vdglyMTIscmJ4CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHJheAorCXhvcglyMTIscmN4CisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHI4CisJYW5kCXIxMixyYXgKKwl4b3IJcjEzLHJheAorCWFkZAlyZHgsUVdPUkRbOTYrcnNwXQorCW1vdglyMTUscjgKKwl4b3IJcjEyLHJjeAorCXNocmQJcjE0LHIxNCw2CisJeG9yCXIxNSxyOQorCWFkZAlyZHgscjEyCisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXJkaSxyMTUKKwl4b3IJcjE0LHI4CisJYWRkCXJkeCxyMTMKKwl4b3IJcmRpLHI5CisJc2hyZAlyMTQscjE0LDI4CisJYWRkCXIxMSxyZHgKKwlhZGQJcmR4LHJkaQorCW1vdglyMTMscjExCisJYWRkCXIxNCxyZHgKKwlzaHJkCXIxMyxyMTMsMjMKKwltb3YJcmR4LHIxNAorCW1vdglyMTIscmF4CisJc2hyZAlyMTQscjE0LDUKKwl4b3IJcjEzLHIxMQorCXhvcglyMTIscmJ4CisJc2hyZAlyMTMscjEzLDQKKwl4b3IJcjE0LHJkeAorCWFuZAlyMTIscjExCisJeG9yCXIxMyxyMTEKKwlhZGQJcmN4LFFXT1JEWzEwNCtyc3BdCisJbW92CXJkaSxyZHgKKwl4b3IJcjEyLHJieAorCXNocmQJcjE0LHIxNCw2CisJeG9yCXJkaSxyOAorCWFkZAlyY3gscjEyCisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHJkeAorCWFkZAlyY3gscjEzCisJeG9yCXIxNSxyOAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyMTAscmN4CisJYWRkCXJjeCxyMTUKKwltb3YJcjEzLHIxMAorCWFkZAlyMTQscmN4CisJc2hyZAlyMTMscjEzLDIzCisJbW92CXJjeCxyMTQKKwltb3YJcjEyLHIxMQorCXNocmQJcjE0LHIxNCw1CisJeG9yCXIxMyxyMTAKKwl4b3IJcjEyLHJheAorCXNocmQJcjEzLHIxMyw0CisJeG9yCXIxNCxyY3gKKwlhbmQJcjEyLHIxMAorCXhvcglyMTMscjEwCisJYWRkCXJieCxRV09SRFsxMTIrcnNwXQorCW1vdglyMTUscmN4CisJeG9yCXIxMixyYXgKKwlzaHJkCXIxNCxyMTQsNgorCXhvcglyMTUscmR4CisJYWRkCXJieCxyMTIKKwlzaHJkCXIxMyxyMTMsMTQKKwlhbmQJcmRpLHIxNQorCXhvcglyMTQscmN4CisJYWRkCXJieCxyMTMKKwl4b3IJcmRpLHJkeAorCXNocmQJcjE0LHIxNCwyOAorCWFkZAlyOSxyYngKKwlhZGQJcmJ4LHJkaQorCW1vdglyMTMscjkKKwlhZGQJcjE0LHJieAorCXNocmQJcjEzLHIxMywyMworCW1vdglyYngscjE0CisJbW92CXIxMixyMTAKKwlzaHJkCXIxNCxyMTQsNQorCXhvcglyMTMscjkKKwl4b3IJcjEyLHIxMQorCXNocmQJcjEzLHIxMyw0CisJeG9yCXIxNCxyYngKKwlhbmQJcjEyLHI5CisJeG9yCXIxMyxyOQorCWFkZAlyYXgsUVdPUkRbMTIwK3JzcF0KKwltb3YJcmRpLHJieAorCXhvcglyMTIscjExCisJc2hyZAlyMTQscjE0LDYKKwl4b3IJcmRpLHJjeAorCWFkZAlyYXgscjEyCisJc2hyZAlyMTMscjEzLDE0CisJYW5kCXIxNSxyZGkKKwl4b3IJcjE0LHJieAorCWFkZAlyYXgscjEzCisJeG9yCXIxNSxyY3gKKwlzaHJkCXIxNCxyMTQsMjgKKwlhZGQJcjgscmF4CisJYWRkCXJheCxyMTUKKwltb3YJcjEzLHI4CisJYWRkCXIxNCxyYXgKKwltb3YJcmRpLFFXT1JEWygoMTI4KzApKStyc3BdCisJbW92CXJheCxyMTQKKworCWFkZAlyYXgsUVdPUkRbcmRpXQorCWxlYQlyc2ksWzEyOCtyc2ldCisJYWRkCXJieCxRV09SRFs4K3JkaV0KKwlhZGQJcmN4LFFXT1JEWzE2K3JkaV0KKwlhZGQJcmR4LFFXT1JEWzI0K3JkaV0KKwlhZGQJcjgsUVdPUkRbMzIrcmRpXQorCWFkZAlyOSxRV09SRFs0MCtyZGldCisJYWRkCXIxMCxRV09SRFs0OCtyZGldCisJYWRkCXIxMSxRV09SRFs1NityZGldCisKKwljbXAJcnNpLFFXT1JEWygoMTI4KzE2KSkrcnNwXQorCisJbW92CVFXT1JEW3JkaV0scmF4CisJbW92CVFXT1JEWzgrcmRpXSxyYngKKwltb3YJUVdPUkRbMTYrcmRpXSxyY3gKKwltb3YJUVdPUkRbMjQrcmRpXSxyZHgKKwltb3YJUVdPUkRbMzIrcmRpXSxyOAorCW1vdglRV09SRFs0MCtyZGldLHI5CisJbW92CVFXT1JEWzQ4K3JkaV0scjEwCisJbW92CVFXT1JEWzU2K3JkaV0scjExCisJamIJTkVBUiAkTCRsb29wX2F2eAorCisJbW92CXJzaSxRV09SRFsxNTIrcnNwXQorCisJdnplcm91cHBlcgorCW1vdmFwcwl4bW02LFhNTVdPUkRbKCgxMjgrMzIpKStyc3BdCisJbW92YXBzCXhtbTcsWE1NV09SRFsoKDEyOCs0OCkpK3JzcF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWygoMTI4KzY0KSkrcnNwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbKCgxMjgrODApKStyc3BdCisJbW92YXBzCXhtbTEwLFhNTVdPUkRbKCgxMjgrOTYpKStyc3BdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbKCgxMjgrMTEyKSkrcnNwXQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRlcGlsb2d1ZV9hdng6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4OgorRVhURVJOCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKworQUxJR04JMTYKK3NlX2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTIwK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbW92CXJzaSxRV09SRFs4K3I5XQorCW1vdglyMTEsUVdPUkRbNTYrcjldCisKKwltb3YJcjEwZCxEV09SRFtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRpbl9wcm9sb2d1ZQorCisJbW92CXJheCxRV09SRFsxNTIrcjhdCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRpbl9wcm9sb2d1ZQorCW1vdglyc2kscmF4CisJbW92CXJheCxRV09SRFsoKDEyOCsyNCkpK3JheF0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JheF0KKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisKKwlsZWEJcjEwLFskTCRlcGlsb2d1ZV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkaW5fcHJvbG9ndWUKKworCWxlYQlyc2ksWygoMTI4KzMyKSkrcnNpXQorCWxlYQlyZGksWzUxMityOF0KKwltb3YJZWN4LDEyCisJREQJMHhhNTQ4ZjNmYworCiskTCRpbl9wcm9sb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcmF4XQorCW1vdglyc2ksUVdPUkRbMTYrcmF4XQorCW1vdglRV09SRFsxNTIrcjhdLHJheAorCW1vdglRV09SRFsxNjgrcjhdLHJzaQorCW1vdglRV09SRFsxNzYrcjhdLHJkaQorCisJbW92CXJkaSxRV09SRFs0MCtyOV0KKwltb3YJcnNpLHI4CisJbW92CWVjeCwxNTQKKwlERAkweGE1NDhmM2ZjCisKKwltb3YJcnNpLHI5CisJeG9yCXJjeCxyY3gKKwltb3YJcmR4LFFXT1JEWzgrcnNpXQorCW1vdglyOCxRV09SRFtyc2ldCisJbW92CXI5LFFXT1JEWzE2K3JzaV0KKwltb3YJcjEwLFFXT1JEWzQwK3JzaV0KKwlsZWEJcjExLFs1Nityc2ldCisJbGVhCXIxMixbMjQrcnNpXQorCW1vdglRV09SRFszMityc3BdLHIxMAorCW1vdglRV09SRFs0MCtyc3BdLHIxMQorCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCW1vdglRV09SRFs1Nityc3BdLHJjeAorCWNhbGwJUVdPUkRbX19pbXBfUnRsVmlydHVhbFVud2luZF0KKworCW1vdgllYXgsMQorCWFkZAlyc3AsNjQKKwlwb3BmcQorCXBvcAlyMTUKKwlwb3AJcjE0CisJcG9wCXIxMworCXBvcAlyMTIKKwlwb3AJcmJwCisJcG9wCXJieAorCXBvcAlyZGkKKwlwb3AJcnNpCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK3NlY3Rpb24JLnBkYXRhIHJkYXRhIGFsaWduPTQKK0FMSUdOCTQKKwlERAkkTCRTRUhfYmVnaW5fc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9zaGE1MTJfYmxvY2tfZGF0YV9vcmRlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19zaGE1MTJfYmxvY2tfZGF0YV9vcmRlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfYmVnaW5fc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfeG9wIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfeG9wIHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyX3hvcCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfYmVnaW5fc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfYXZ4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyX2F2eCB3cnQgLi5pbWFnZWJhc2UKK3NlY3Rpb24JLnhkYXRhIHJkYXRhIGFsaWduPTgKK0FMSUdOCTgKKyRMJFNFSF9pbmZvX3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcHJvbG9ndWUgd3J0IC4uaW1hZ2ViYXNlLCRMJGVwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXJfeG9wOgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkcHJvbG9ndWVfeG9wIHdydCAuLmltYWdlYmFzZSwkTCRlcGlsb2d1ZV94b3Agd3J0IC4uaW1hZ2ViYXNlCiskTCRTRUhfaW5mb19zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcl9hdng6CitEQgk5LDAsMCwwCisJREQJc2VfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRwcm9sb2d1ZV9hdnggd3J0IC4uaW1hZ2ViYXNlLCRMJGVwaWxvZ3VlX2F2eCB3cnQgLi5pbWFnZWJhc2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS92cGFlcy14ODZfNjQuYXNtIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3ZwYWVzLXg4Nl82NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZGU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS92cGFlcy14ODZfNjQuYXNtCkBAIC0wLDAgKzEsMTEzNyBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworQUxJR04JMTYKK192cGFlc19lbmNyeXB0X2NvcmU6CisJbW92CXI5LHJkeAorCW1vdglyMTEsMTYKKwltb3YJZWF4LERXT1JEWzI0MCtyZHhdCisJbW92ZHFhCXhtbTEseG1tOQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbJEwka19pcHRdCisJcGFuZG4JeG1tMSx4bW0wCisJbW92ZHF1CXhtbTUsWE1NV09SRFtyOV0KKwlwc3JsZAl4bW0xLDQKKwlwYW5kCXhtbTAseG1tOQorREIJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCXhtbTAsWE1NV09SRFsoKCRMJGtfaXB0KzE2KSldCitEQgkxMDIsMTUsNTYsMCwxOTMKKwlweG9yCXhtbTIseG1tNQorCWFkZAlyOSwxNgorCXB4b3IJeG1tMCx4bW0yCisJbGVhCXIxMCxbJEwka19tY19iYWNrd2FyZF0KKwlqbXAJTkVBUiAkTCRlbmNfZW50cnkKKworQUxJR04JMTYKKyRMJGVuY19sb29wOgorCisJbW92ZHFhCXhtbTQseG1tMTMKKwltb3ZkcWEJeG1tMCx4bW0xMgorREIJMTAyLDE1LDU2LDAsMjI2CitEQgkxMDIsMTUsNTYsMCwxOTUKKwlweG9yCXhtbTQseG1tNQorCW1vdmRxYQl4bW01LHhtbTE1CisJcHhvcgl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tMSxYTU1XT1JEWygoLTY0KSkrcjEwKjErcjExXQorREIJMTAyLDE1LDU2LDAsMjM0CisJbW92ZHFhCXhtbTQsWE1NV09SRFtyMTAqMStyMTFdCisJbW92ZHFhCXhtbTIseG1tMTQKK0RCCTEwMiwxNSw1NiwwLDIxMQorCW1vdmRxYQl4bW0zLHhtbTAKKwlweG9yCXhtbTIseG1tNQorREIJMTAyLDE1LDU2LDAsMTkzCisJYWRkCXI5LDE2CisJcHhvcgl4bW0wLHhtbTIKK0RCCTEwMiwxNSw1NiwwLDIyMAorCWFkZAlyMTEsMTYKKwlweG9yCXhtbTMseG1tMAorREIJMTAyLDE1LDU2LDAsMTkzCisJYW5kCXIxMSwweDMwCisJc3ViCXJheCwxCisJcHhvcgl4bW0wLHhtbTMKKworJEwkZW5jX2VudHJ5OgorCisJbW92ZHFhCXhtbTEseG1tOQorCW1vdmRxYQl4bW01LHhtbTExCisJcGFuZG4JeG1tMSx4bW0wCisJcHNybGQJeG1tMSw0CisJcGFuZAl4bW0wLHhtbTkKK0RCCTEwMiwxNSw1NiwwLDIzMgorCW1vdmRxYQl4bW0zLHhtbTEwCisJcHhvcgl4bW0wLHhtbTEKK0RCCTEwMiwxNSw1NiwwLDIxNworCW1vdmRxYQl4bW00LHhtbTEwCisJcHhvcgl4bW0zLHhtbTUKK0RCCTEwMiwxNSw1NiwwLDIyNAorCW1vdmRxYQl4bW0yLHhtbTEwCisJcHhvcgl4bW00LHhtbTUKK0RCCTEwMiwxNSw1NiwwLDIxMQorCW1vdmRxYQl4bW0zLHhtbTEwCisJcHhvcgl4bW0yLHhtbTAKK0RCCTEwMiwxNSw1NiwwLDIyMAorCW1vdmRxdQl4bW01LFhNTVdPUkRbcjldCisJcHhvcgl4bW0zLHhtbTEKKwlqbnoJTkVBUiAkTCRlbmNfbG9vcAorCisKKwltb3ZkcWEJeG1tNCxYTU1XT1JEWygoLTk2KSkrcjEwXQorCW1vdmRxYQl4bW0wLFhNTVdPUkRbKCgtODApKStyMTBdCitEQgkxMDIsMTUsNTYsMCwyMjYKKwlweG9yCXhtbTQseG1tNQorREIJMTAyLDE1LDU2LDAsMTk1CisJbW92ZHFhCXhtbTEsWE1NV09SRFs2NCtyMTAqMStyMTFdCisJcHhvcgl4bW0wLHhtbTQKK0RCCTEwMiwxNSw1NiwwLDE5MworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworCisKKworCisKK0FMSUdOCTE2CitfdnBhZXNfZGVjcnlwdF9jb3JlOgorCW1vdglyOSxyZHgKKwltb3YJZWF4LERXT1JEWzI0MCtyZHhdCisJbW92ZHFhCXhtbTEseG1tOQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbJEwka19kaXB0XQorCXBhbmRuCXhtbTEseG1tMAorCW1vdglyMTEscmF4CisJcHNybGQJeG1tMSw0CisJbW92ZHF1CXhtbTUsWE1NV09SRFtyOV0KKwlzaGwJcjExLDQKKwlwYW5kCXhtbTAseG1tOQorREIJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCXhtbTAsWE1NV09SRFsoKCRMJGtfZGlwdCsxNikpXQorCXhvcglyMTEsMHgzMAorCWxlYQlyMTAsWyRMJGtfZHNiZF0KK0RCCTEwMiwxNSw1NiwwLDE5MworCWFuZAlyMTEsMHgzMAorCXB4b3IJeG1tMix4bW01CisJbW92ZHFhCXhtbTUsWE1NV09SRFsoKCRMJGtfbWNfZm9yd2FyZCs0OCkpXQorCXB4b3IJeG1tMCx4bW0yCisJYWRkCXI5LDE2CisJYWRkCXIxMSxyMTAKKwlqbXAJTkVBUiAkTCRkZWNfZW50cnkKKworQUxJR04JMTYKKyRMJGRlY19sb29wOgorCisKKworCW1vdmRxYQl4bW00LFhNTVdPUkRbKCgtMzIpKStyMTBdCisJbW92ZHFhCXhtbTEsWE1NV09SRFsoKC0xNikpK3IxMF0KK0RCCTEwMiwxNSw1NiwwLDIyNgorREIJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tNCxYTU1XT1JEW3IxMF0KKwlweG9yCXhtbTAseG1tMQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbMTYrcjEwXQorCitEQgkxMDIsMTUsNTYsMCwyMjYKK0RCCTEwMiwxNSw1NiwwLDE5NworREIJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tNCxYTU1XT1JEWzMyK3IxMF0KKwlweG9yCXhtbTAseG1tMQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbNDgrcjEwXQorCitEQgkxMDIsMTUsNTYsMCwyMjYKK0RCCTEwMiwxNSw1NiwwLDE5NworREIJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgl4bW0wLHhtbTQKKwltb3ZkcWEJeG1tNCxYTU1XT1JEWzY0K3IxMF0KKwlweG9yCXhtbTAseG1tMQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbODArcjEwXQorCitEQgkxMDIsMTUsNTYsMCwyMjYKK0RCCTEwMiwxNSw1NiwwLDE5NworREIJMTAyLDE1LDU2LDAsMjAzCisJcHhvcgl4bW0wLHhtbTQKKwlhZGQJcjksMTYKK0RCCTEwMiwxNSw1OCwxNSwyMzcsMTIKKwlweG9yCXhtbTAseG1tMQorCXN1YglyYXgsMQorCiskTCRkZWNfZW50cnk6CisKKwltb3ZkcWEJeG1tMSx4bW05CisJcGFuZG4JeG1tMSx4bW0wCisJbW92ZHFhCXhtbTIseG1tMTEKKwlwc3JsZAl4bW0xLDQKKwlwYW5kCXhtbTAseG1tOQorREIJMTAyLDE1LDU2LDAsMjA4CisJbW92ZHFhCXhtbTMseG1tMTAKKwlweG9yCXhtbTAseG1tMQorREIJMTAyLDE1LDU2LDAsMjE3CisJbW92ZHFhCXhtbTQseG1tMTAKKwlweG9yCXhtbTMseG1tMgorREIJMTAyLDE1LDU2LDAsMjI0CisJcHhvcgl4bW00LHhtbTIKKwltb3ZkcWEJeG1tMix4bW0xMAorREIJMTAyLDE1LDU2LDAsMjExCisJbW92ZHFhCXhtbTMseG1tMTAKKwlweG9yCXhtbTIseG1tMAorREIJMTAyLDE1LDU2LDAsMjIwCisJbW92ZHF1CXhtbTAsWE1NV09SRFtyOV0KKwlweG9yCXhtbTMseG1tMQorCWpueglORUFSICRMJGRlY19sb29wCisKKworCW1vdmRxYQl4bW00LFhNTVdPUkRbOTYrcjEwXQorREIJMTAyLDE1LDU2LDAsMjI2CisJcHhvcgl4bW00LHhtbTAKKwltb3ZkcWEJeG1tMCxYTU1XT1JEWzExMityMTBdCisJbW92ZHFhCXhtbTIsWE1NV09SRFsoKC0zNTIpKStyMTFdCitEQgkxMDIsMTUsNTYsMCwxOTUKKwlweG9yCXhtbTAseG1tNAorREIJMTAyLDE1LDU2LDAsMTk0CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCisKKworCisKKworQUxJR04JMTYKK192cGFlc19zY2hlZHVsZV9jb3JlOgorCisKKworCisKKwljYWxsCV92cGFlc19wcmVoZWF0CisJbW92ZHFhCXhtbTgsWE1NV09SRFskTCRrX3Jjb25dCisJbW92ZHF1CXhtbTAsWE1NV09SRFtyZGldCisKKworCW1vdmRxYQl4bW0zLHhtbTAKKwlsZWEJcjExLFskTCRrX2lwdF0KKwljYWxsCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcWEJeG1tNyx4bW0wCisKKwlsZWEJcjEwLFskTCRrX3NyXQorCXRlc3QJcmN4LHJjeAorCWpueglORUFSICRMJHNjaGVkdWxlX2FtX2RlY3J5cHRpbmcKKworCisJbW92ZHF1CVhNTVdPUkRbcmR4XSx4bW0wCisJam1wCU5FQVIgJEwkc2NoZWR1bGVfZ28KKworJEwkc2NoZWR1bGVfYW1fZGVjcnlwdGluZzoKKworCW1vdmRxYQl4bW0xLFhNTVdPUkRbcjEwKjErcjhdCitEQgkxMDIsMTUsNTYsMCwyMTcKKwltb3ZkcXUJWE1NV09SRFtyZHhdLHhtbTMKKwl4b3IJcjgsMHgzMAorCiskTCRzY2hlZHVsZV9nbzoKKwljbXAJZXNpLDE5MgorCWphCU5FQVIgJEwkc2NoZWR1bGVfMjU2CisJamUJTkVBUiAkTCRzY2hlZHVsZV8xOTIKKworCisKKworCisKKworCisKKworJEwkc2NoZWR1bGVfMTI4OgorCW1vdgllc2ksMTAKKworJEwkb29wX3NjaGVkdWxlXzEyODoKKwljYWxsCV92cGFlc19zY2hlZHVsZV9yb3VuZAorCWRlYwlyc2kKKwlqeglORUFSICRMJHNjaGVkdWxlX21hbmdsZV9sYXN0CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJam1wCU5FQVIgJEwkb29wX3NjaGVkdWxlXzEyOAorCisKKworCisKKworCisKKworCisKKworCisKKworCitBTElHTgkxNgorJEwkc2NoZWR1bGVfMTkyOgorCW1vdmRxdQl4bW0wLFhNTVdPUkRbOCtyZGldCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfdHJhbnNmb3JtCisJbW92ZHFhCXhtbTYseG1tMAorCXB4b3IJeG1tNCx4bW00CisJbW92aGxwcwl4bW02LHhtbTQKKwltb3YJZXNpLDQKKworJEwkb29wX3NjaGVkdWxlXzE5MjoKKwljYWxsCV92cGFlc19zY2hlZHVsZV9yb3VuZAorREIJMTAyLDE1LDU4LDE1LDE5OCw4CisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfbWFuZ2xlCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWMJcnNpCisJanoJTkVBUiAkTCRzY2hlZHVsZV9tYW5nbGVfbGFzdAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlXzE5Ml9zbWVhcgorCWptcAlORUFSICRMJG9vcF9zY2hlZHVsZV8xOTIKKworCisKKworCisKKworCisKKworCitBTElHTgkxNgorJEwkc2NoZWR1bGVfMjU2OgorCW1vdmRxdQl4bW0wLFhNTVdPUkRbMTYrcmRpXQorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybQorCW1vdgllc2ksNworCiskTCRvb3Bfc2NoZWR1bGVfMjU2OgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCW1vdmRxYQl4bW02LHhtbTAKKworCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfcm91bmQKKwlkZWMJcnNpCisJanoJTkVBUiAkTCRzY2hlZHVsZV9tYW5nbGVfbGFzdAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX21hbmdsZQorCisKKwlwc2h1ZmQJeG1tMCx4bW0wLDB4RkYKKwltb3ZkcWEJeG1tNSx4bW03CisJbW92ZHFhCXhtbTcseG1tNgorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX2xvd19yb3VuZAorCW1vdmRxYQl4bW03LHhtbTUKKworCWptcAlORUFSICRMJG9vcF9zY2hlZHVsZV8yNTYKKworCisKKworCisKKworCisKKworCisKK0FMSUdOCTE2CiskTCRzY2hlZHVsZV9tYW5nbGVfbGFzdDoKKworCWxlYQlyMTEsWyRMJGtfZGVza2V3XQorCXRlc3QJcmN4LHJjeAorCWpueglORUFSICRMJHNjaGVkdWxlX21hbmdsZV9sYXN0X2RlYworCisKKwltb3ZkcWEJeG1tMSxYTU1XT1JEW3IxMCoxK3I4XQorREIJMTAyLDE1LDU2LDAsMTkzCisJbGVhCXIxMSxbJEwka19vcHRdCisJYWRkCXJkeCwzMgorCiskTCRzY2hlZHVsZV9tYW5nbGVfbGFzdF9kZWM6CisJYWRkCXJkeCwtMTYKKwlweG9yCXhtbTAsWE1NV09SRFskTCRrX3M2M10KKwljYWxsCV92cGFlc19zY2hlZHVsZV90cmFuc2Zvcm0KKwltb3ZkcXUJWE1NV09SRFtyZHhdLHhtbTAKKworCisJcHhvcgl4bW0wLHhtbTAKKwlweG9yCXhtbTEseG1tMQorCXB4b3IJeG1tMix4bW0yCisJcHhvcgl4bW0zLHhtbTMKKwlweG9yCXhtbTQseG1tNAorCXB4b3IJeG1tNSx4bW01CisJcHhvcgl4bW02LHhtbTYKKwlweG9yCXhtbTcseG1tNworCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKK0FMSUdOCTE2CitfdnBhZXNfc2NoZWR1bGVfMTkyX3NtZWFyOgorCXBzaHVmZAl4bW0xLHhtbTYsMHg4MAorCXBzaHVmZAl4bW0wLHhtbTcsMHhGRQorCXB4b3IJeG1tNix4bW0xCisJcHhvcgl4bW0xLHhtbTEKKwlweG9yCXhtbTYseG1tMAorCW1vdmRxYQl4bW0wLHhtbTYKKwltb3ZobHBzCXhtbTYseG1tMQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworQUxJR04JMTYKK192cGFlc19zY2hlZHVsZV9yb3VuZDoKKworCXB4b3IJeG1tMSx4bW0xCitEQgkxMDIsNjUsMTUsNTgsMTUsMjAwLDE1CitEQgkxMDIsNjksMTUsNTgsMTUsMTkyLDE1CisJcHhvcgl4bW03LHhtbTEKKworCisJcHNodWZkCXhtbTAseG1tMCwweEZGCitEQgkxMDIsMTUsNTgsMTUsMTkyLDEKKworCisKKworX3ZwYWVzX3NjaGVkdWxlX2xvd19yb3VuZDoKKworCW1vdmRxYQl4bW0xLHhtbTcKKwlwc2xsZHEJeG1tNyw0CisJcHhvcgl4bW03LHhtbTEKKwltb3ZkcWEJeG1tMSx4bW03CisJcHNsbGRxCXhtbTcsOAorCXB4b3IJeG1tNyx4bW0xCisJcHhvcgl4bW03LFhNTVdPUkRbJEwka19zNjNdCisKKworCW1vdmRxYQl4bW0xLHhtbTkKKwlwYW5kbgl4bW0xLHhtbTAKKwlwc3JsZAl4bW0xLDQKKwlwYW5kCXhtbTAseG1tOQorCW1vdmRxYQl4bW0yLHhtbTExCitEQgkxMDIsMTUsNTYsMCwyMDgKKwlweG9yCXhtbTAseG1tMQorCW1vdmRxYQl4bW0zLHhtbTEwCitEQgkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCXhtbTMseG1tMgorCW1vdmRxYQl4bW00LHhtbTEwCitEQgkxMDIsMTUsNTYsMCwyMjQKKwlweG9yCXhtbTQseG1tMgorCW1vdmRxYQl4bW0yLHhtbTEwCitEQgkxMDIsMTUsNTYsMCwyMTEKKwlweG9yCXhtbTIseG1tMAorCW1vdmRxYQl4bW0zLHhtbTEwCitEQgkxMDIsMTUsNTYsMCwyMjAKKwlweG9yCXhtbTMseG1tMQorCW1vdmRxYQl4bW00LHhtbTEzCitEQgkxMDIsMTUsNTYsMCwyMjYKKwltb3ZkcWEJeG1tMCx4bW0xMgorREIJMTAyLDE1LDU2LDAsMTk1CisJcHhvcgl4bW0wLHhtbTQKKworCisJcHhvcgl4bW0wLHhtbTcKKwltb3ZkcWEJeG1tNyx4bW0wCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworCisKKworCisKKworCisKKworCitBTElHTgkxNgorX3ZwYWVzX3NjaGVkdWxlX3RyYW5zZm9ybToKKwltb3ZkcWEJeG1tMSx4bW05CisJcGFuZG4JeG1tMSx4bW0wCisJcHNybGQJeG1tMSw0CisJcGFuZAl4bW0wLHhtbTkKKwltb3ZkcWEJeG1tMixYTU1XT1JEW3IxMV0KK0RCCTEwMiwxNSw1NiwwLDIwOAorCW1vdmRxYQl4bW0wLFhNTVdPUkRbMTYrcjExXQorREIJMTAyLDE1LDU2LDAsMTkzCisJcHhvcgl4bW0wLHhtbTIKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitBTElHTgkxNgorX3ZwYWVzX3NjaGVkdWxlX21hbmdsZToKKwltb3ZkcWEJeG1tNCx4bW0wCisJbW92ZHFhCXhtbTUsWE1NV09SRFskTCRrX21jX2ZvcndhcmRdCisJdGVzdAlyY3gscmN4CisJam56CU5FQVIgJEwkc2NoZWR1bGVfbWFuZ2xlX2RlYworCisKKwlhZGQJcmR4LDE2CisJcHhvcgl4bW00LFhNTVdPUkRbJEwka19zNjNdCitEQgkxMDIsMTUsNTYsMCwyMjkKKwltb3ZkcWEJeG1tMyx4bW00CitEQgkxMDIsMTUsNTYsMCwyMjkKKwlweG9yCXhtbTMseG1tNAorREIJMTAyLDE1LDU2LDAsMjI5CisJcHhvcgl4bW0zLHhtbTQKKworCWptcAlORUFSICRMJHNjaGVkdWxlX21hbmdsZV9ib3RoCitBTElHTgkxNgorJEwkc2NoZWR1bGVfbWFuZ2xlX2RlYzoKKworCWxlYQlyMTEsWyRMJGtfZGtzZF0KKwltb3ZkcWEJeG1tMSx4bW05CisJcGFuZG4JeG1tMSx4bW00CisJcHNybGQJeG1tMSw0CisJcGFuZAl4bW00LHhtbTkKKworCW1vdmRxYQl4bW0yLFhNTVdPUkRbcjExXQorREIJMTAyLDE1LDU2LDAsMjEyCisJbW92ZHFhCXhtbTMsWE1NV09SRFsxNityMTFdCitEQgkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCXhtbTMseG1tMgorREIJMTAyLDE1LDU2LDAsMjIxCisKKwltb3ZkcWEJeG1tMixYTU1XT1JEWzMyK3IxMV0KK0RCCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJeG1tMix4bW0zCisJbW92ZHFhCXhtbTMsWE1NV09SRFs0OCtyMTFdCitEQgkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCXhtbTMseG1tMgorREIJMTAyLDE1LDU2LDAsMjIxCisKKwltb3ZkcWEJeG1tMixYTU1XT1JEWzY0K3IxMV0KK0RCCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJeG1tMix4bW0zCisJbW92ZHFhCXhtbTMsWE1NV09SRFs4MCtyMTFdCitEQgkxMDIsMTUsNTYsMCwyMTcKKwlweG9yCXhtbTMseG1tMgorREIJMTAyLDE1LDU2LDAsMjIxCisKKwltb3ZkcWEJeG1tMixYTU1XT1JEWzk2K3IxMV0KK0RCCTEwMiwxNSw1NiwwLDIxMgorCXB4b3IJeG1tMix4bW0zCisJbW92ZHFhCXhtbTMsWE1NV09SRFsxMTIrcjExXQorREIJMTAyLDE1LDU2LDAsMjE3CisJcHhvcgl4bW0zLHhtbTIKKworCWFkZAlyZHgsLTE2CisKKyRMJHNjaGVkdWxlX21hbmdsZV9ib3RoOgorCW1vdmRxYQl4bW0xLFhNTVdPUkRbcjEwKjErcjhdCitEQgkxMDIsMTUsNTYsMCwyMTcKKwlhZGQJcjgsLTE2CisJYW5kCXI4LDB4MzAKKwltb3ZkcXUJWE1NV09SRFtyZHhdLHhtbTMKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKKworCitnbG9iYWwJdnBhZXNfc2V0X2VuY3J5cHRfa2V5CisKK0FMSUdOCTE2Cit2cGFlc19zZXRfZW5jcnlwdF9rZXk6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl92cGFlc19zZXRfZW5jcnlwdF9rZXk6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisJbGVhCXJzcCxbKCgtMTg0KSkrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzE2K3JzcF0seG1tNgorCW1vdmFwcwlYTU1XT1JEWzMyK3JzcF0seG1tNworCW1vdmFwcwlYTU1XT1JEWzQ4K3JzcF0seG1tOAorCW1vdmFwcwlYTU1XT1JEWzY0K3JzcF0seG1tOQorCW1vdmFwcwlYTU1XT1JEWzgwK3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTExCisJbW92YXBzCVhNTVdPUkRbMTEyK3JzcF0seG1tMTIKKwltb3ZhcHMJWE1NV09SRFsxMjgrcnNwXSx4bW0xMworCW1vdmFwcwlYTU1XT1JEWzE0NCtyc3BdLHhtbTE0CisJbW92YXBzCVhNTVdPUkRbMTYwK3JzcF0seG1tMTUKKyRMJGVuY19rZXlfYm9keToKKwltb3YJZWF4LGVzaQorCXNocgllYXgsNQorCWFkZAllYXgsNQorCW1vdglEV09SRFsyNDArcmR4XSxlYXgKKworCW1vdgllY3gsMAorCW1vdglyOGQsMHgzMAorCWNhbGwJX3ZwYWVzX3NjaGVkdWxlX2NvcmUKKwltb3ZhcHMJeG1tNixYTU1XT1JEWzE2K3JzcF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWzMyK3JzcF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWzY0K3JzcF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFs4MCtyc3BdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbOTYrcnNwXQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWzExMityc3BdCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTI4K3JzcF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxNDQrcnNwXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzE2MCtyc3BdCisJbGVhCXJzcCxbMTg0K3JzcF0KKyRMJGVuY19rZXlfZXBpbG9ndWU6CisJeG9yCWVheCxlYXgKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKyRMJFNFSF9lbmRfdnBhZXNfc2V0X2VuY3J5cHRfa2V5OgorCitnbG9iYWwJdnBhZXNfc2V0X2RlY3J5cHRfa2V5CisKK0FMSUdOCTE2Cit2cGFlc19zZXRfZGVjcnlwdF9rZXk6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl92cGFlc19zZXRfZGVjcnlwdF9rZXk6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisJbGVhCXJzcCxbKCgtMTg0KSkrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzE2K3JzcF0seG1tNgorCW1vdmFwcwlYTU1XT1JEWzMyK3JzcF0seG1tNworCW1vdmFwcwlYTU1XT1JEWzQ4K3JzcF0seG1tOAorCW1vdmFwcwlYTU1XT1JEWzY0K3JzcF0seG1tOQorCW1vdmFwcwlYTU1XT1JEWzgwK3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTExCisJbW92YXBzCVhNTVdPUkRbMTEyK3JzcF0seG1tMTIKKwltb3ZhcHMJWE1NV09SRFsxMjgrcnNwXSx4bW0xMworCW1vdmFwcwlYTU1XT1JEWzE0NCtyc3BdLHhtbTE0CisJbW92YXBzCVhNTVdPUkRbMTYwK3JzcF0seG1tMTUKKyRMJGRlY19rZXlfYm9keToKKwltb3YJZWF4LGVzaQorCXNocgllYXgsNQorCWFkZAllYXgsNQorCW1vdglEV09SRFsyNDArcmR4XSxlYXgKKwlzaGwJZWF4LDQKKwlsZWEJcmR4LFsxNityYXgqMStyZHhdCisKKwltb3YJZWN4LDEKKwltb3YJcjhkLGVzaQorCXNocglyOGQsMQorCWFuZAlyOGQsMzIKKwl4b3IJcjhkLDMyCisJY2FsbAlfdnBhZXNfc2NoZWR1bGVfY29yZQorCW1vdmFwcwl4bW02LFhNTVdPUkRbMTYrcnNwXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbMzIrcnNwXQorCW1vdmFwcwl4bW04LFhNTVdPUkRbNDgrcnNwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJeG1tMTEsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWzE0NCtyc3BdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbMTYwK3JzcF0KKwlsZWEJcnNwLFsxODQrcnNwXQorJEwkZGVjX2tleV9lcGlsb2d1ZToKKwl4b3IJZWF4LGVheAorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF92cGFlc19zZXRfZGVjcnlwdF9rZXk6CisKK2dsb2JhbAl2cGFlc19lbmNyeXB0CisKK0FMSUdOCTE2Cit2cGFlc19lbmNyeXB0OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fdnBhZXNfZW5jcnlwdDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCisKKwlsZWEJcnNwLFsoKC0xODQpKStyc3BdCisJbW92YXBzCVhNTVdPUkRbMTYrcnNwXSx4bW02CisJbW92YXBzCVhNTVdPUkRbMzIrcnNwXSx4bW03CisJbW92YXBzCVhNTVdPUkRbNDgrcnNwXSx4bW04CisJbW92YXBzCVhNTVdPUkRbNjQrcnNwXSx4bW05CisJbW92YXBzCVhNTVdPUkRbODArcnNwXSx4bW0xMAorCW1vdmFwcwlYTU1XT1JEWzk2K3JzcF0seG1tMTEKKwltb3ZhcHMJWE1NV09SRFsxMTIrcnNwXSx4bW0xMgorCW1vdmFwcwlYTU1XT1JEWzEyOCtyc3BdLHhtbTEzCisJbW92YXBzCVhNTVdPUkRbMTQ0K3JzcF0seG1tMTQKKwltb3ZhcHMJWE1NV09SRFsxNjArcnNwXSx4bW0xNQorJEwkZW5jX2JvZHk6CisJbW92ZHF1CXhtbTAsWE1NV09SRFtyZGldCisJY2FsbAlfdnBhZXNfcHJlaGVhdAorCWNhbGwJX3ZwYWVzX2VuY3J5cHRfY29yZQorCW1vdmRxdQlYTU1XT1JEW3JzaV0seG1tMAorCW1vdmFwcwl4bW02LFhNTVdPUkRbMTYrcnNwXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbMzIrcnNwXQorCW1vdmFwcwl4bW04LFhNTVdPUkRbNDgrcnNwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJeG1tMTEsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWzE0NCtyc3BdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbMTYwK3JzcF0KKwlsZWEJcnNwLFsxODQrcnNwXQorJEwkZW5jX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF92cGFlc19lbmNyeXB0OgorCitnbG9iYWwJdnBhZXNfZGVjcnlwdAorCitBTElHTgkxNgordnBhZXNfZGVjcnlwdDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX3ZwYWVzX2RlY3J5cHQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKworCisJbGVhCXJzcCxbKCgtMTg0KSkrcnNwXQorCW1vdmFwcwlYTU1XT1JEWzE2K3JzcF0seG1tNgorCW1vdmFwcwlYTU1XT1JEWzMyK3JzcF0seG1tNworCW1vdmFwcwlYTU1XT1JEWzQ4K3JzcF0seG1tOAorCW1vdmFwcwlYTU1XT1JEWzY0K3JzcF0seG1tOQorCW1vdmFwcwlYTU1XT1JEWzgwK3JzcF0seG1tMTAKKwltb3ZhcHMJWE1NV09SRFs5Nityc3BdLHhtbTExCisJbW92YXBzCVhNTVdPUkRbMTEyK3JzcF0seG1tMTIKKwltb3ZhcHMJWE1NV09SRFsxMjgrcnNwXSx4bW0xMworCW1vdmFwcwlYTU1XT1JEWzE0NCtyc3BdLHhtbTE0CisJbW92YXBzCVhNTVdPUkRbMTYwK3JzcF0seG1tMTUKKyRMJGRlY19ib2R5OgorCW1vdmRxdQl4bW0wLFhNTVdPUkRbcmRpXQorCWNhbGwJX3ZwYWVzX3ByZWhlYXQKKwljYWxsCV92cGFlc19kZWNyeXB0X2NvcmUKKwltb3ZkcXUJWE1NV09SRFtyc2ldLHhtbTAKKwltb3ZhcHMJeG1tNixYTU1XT1JEWzE2K3JzcF0KKwltb3ZhcHMJeG1tNyxYTU1XT1JEWzMyK3JzcF0KKwltb3ZhcHMJeG1tOCxYTU1XT1JEWzQ4K3JzcF0KKwltb3ZhcHMJeG1tOSxYTU1XT1JEWzY0K3JzcF0KKwltb3ZhcHMJeG1tMTAsWE1NV09SRFs4MCtyc3BdCisJbW92YXBzCXhtbTExLFhNTVdPUkRbOTYrcnNwXQorCW1vdmFwcwl4bW0xMixYTU1XT1JEWzExMityc3BdCisJbW92YXBzCXhtbTEzLFhNTVdPUkRbMTI4K3JzcF0KKwltb3ZhcHMJeG1tMTQsWE1NV09SRFsxNDQrcnNwXQorCW1vdmFwcwl4bW0xNSxYTU1XT1JEWzE2MCtyc3BdCisJbGVhCXJzcCxbMTg0K3JzcF0KKyRMJGRlY19lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKyRMJFNFSF9lbmRfdnBhZXNfZGVjcnlwdDoKK2dsb2JhbAl2cGFlc19jYmNfZW5jcnlwdAorCitBTElHTgkxNgordnBhZXNfY2JjX2VuY3J5cHQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl92cGFlc19jYmNfZW5jcnlwdDoKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCW1vdglyOSxRV09SRFs0OCtyc3BdCisKKworCXhjaGcJcmR4LHJjeAorCXN1YglyY3gsMTYKKwlqYwlORUFSICRMJGNiY19hYm9ydAorCWxlYQlyc3AsWygoLTE4NCkpK3JzcF0KKwltb3ZhcHMJWE1NV09SRFsxNityc3BdLHhtbTYKKwltb3ZhcHMJWE1NV09SRFszMityc3BdLHhtbTcKKwltb3ZhcHMJWE1NV09SRFs0OCtyc3BdLHhtbTgKKwltb3ZhcHMJWE1NV09SRFs2NCtyc3BdLHhtbTkKKwltb3ZhcHMJWE1NV09SRFs4MCtyc3BdLHhtbTEwCisJbW92YXBzCVhNTVdPUkRbOTYrcnNwXSx4bW0xMQorCW1vdmFwcwlYTU1XT1JEWzExMityc3BdLHhtbTEyCisJbW92YXBzCVhNTVdPUkRbMTI4K3JzcF0seG1tMTMKKwltb3ZhcHMJWE1NV09SRFsxNDQrcnNwXSx4bW0xNAorCW1vdmFwcwlYTU1XT1JEWzE2MCtyc3BdLHhtbTE1CiskTCRjYmNfYm9keToKKwltb3ZkcXUJeG1tNixYTU1XT1JEW3I4XQorCXN1Yglyc2kscmRpCisJY2FsbAlfdnBhZXNfcHJlaGVhdAorCWNtcAlyOWQsMAorCWplCU5FQVIgJEwkY2JjX2RlY19sb29wCisJam1wCU5FQVIgJEwkY2JjX2VuY19sb29wCitBTElHTgkxNgorJEwkY2JjX2VuY19sb29wOgorCW1vdmRxdQl4bW0wLFhNTVdPUkRbcmRpXQorCXB4b3IJeG1tMCx4bW02CisJY2FsbAlfdnBhZXNfZW5jcnlwdF9jb3JlCisJbW92ZHFhCXhtbTYseG1tMAorCW1vdmRxdQlYTU1XT1JEW3JkaSoxK3JzaV0seG1tMAorCWxlYQlyZGksWzE2K3JkaV0KKwlzdWIJcmN4LDE2CisJam5jCU5FQVIgJEwkY2JjX2VuY19sb29wCisJam1wCU5FQVIgJEwkY2JjX2RvbmUKK0FMSUdOCTE2CiskTCRjYmNfZGVjX2xvb3A6CisJbW92ZHF1CXhtbTAsWE1NV09SRFtyZGldCisJbW92ZHFhCXhtbTcseG1tMAorCWNhbGwJX3ZwYWVzX2RlY3J5cHRfY29yZQorCXB4b3IJeG1tMCx4bW02CisJbW92ZHFhCXhtbTYseG1tNworCW1vdmRxdQlYTU1XT1JEW3JkaSoxK3JzaV0seG1tMAorCWxlYQlyZGksWzE2K3JkaV0KKwlzdWIJcmN4LDE2CisJam5jCU5FQVIgJEwkY2JjX2RlY19sb29wCiskTCRjYmNfZG9uZToKKwltb3ZkcXUJWE1NV09SRFtyOF0seG1tNgorCW1vdmFwcwl4bW02LFhNTVdPUkRbMTYrcnNwXQorCW1vdmFwcwl4bW03LFhNTVdPUkRbMzIrcnNwXQorCW1vdmFwcwl4bW04LFhNTVdPUkRbNDgrcnNwXQorCW1vdmFwcwl4bW05LFhNTVdPUkRbNjQrcnNwXQorCW1vdmFwcwl4bW0xMCxYTU1XT1JEWzgwK3JzcF0KKwltb3ZhcHMJeG1tMTEsWE1NV09SRFs5Nityc3BdCisJbW92YXBzCXhtbTEyLFhNTVdPUkRbMTEyK3JzcF0KKwltb3ZhcHMJeG1tMTMsWE1NV09SRFsxMjgrcnNwXQorCW1vdmFwcwl4bW0xNCxYTU1XT1JEWzE0NCtyc3BdCisJbW92YXBzCXhtbTE1LFhNTVdPUkRbMTYwK3JzcF0KKwlsZWEJcnNwLFsxODQrcnNwXQorJEwkY2JjX2VwaWxvZ3VlOgorJEwkY2JjX2Fib3J0OgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF92cGFlc19jYmNfZW5jcnlwdDoKKworCisKKworCisKKworQUxJR04JMTYKK192cGFlc19wcmVoZWF0OgorCWxlYQlyMTAsWyRMJGtfczBGXQorCW1vdmRxYQl4bW0xMCxYTU1XT1JEWygoLTMyKSkrcjEwXQorCW1vdmRxYQl4bW0xMSxYTU1XT1JEWygoLTE2KSkrcjEwXQorCW1vdmRxYQl4bW05LFhNTVdPUkRbcjEwXQorCW1vdmRxYQl4bW0xMyxYTU1XT1JEWzQ4K3IxMF0KKwltb3ZkcWEJeG1tMTIsWE1NV09SRFs2NCtyMTBdCisJbW92ZHFhCXhtbTE1LFhNTVdPUkRbODArcjEwXQorCW1vdmRxYQl4bW0xNCxYTU1XT1JEWzk2K3IxMF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCisKKworCisKKworQUxJR04JNjQKK192cGFlc19jb25zdHM6CiskTCRrX2ludjoKKwlEUQkweDBFMDUwNjBGMEQwODAxODAsMHgwNDA3MDMwOTBBMEIwQzAyCisJRFEJMHgwMTA0MEEwNjBGMEIwNzgwLDB4MDMwRDBFMEMwMjA1MDgwOQorCiskTCRrX3MwRjoKKwlEUQkweDBGMEYwRjBGMEYwRjBGMEYsMHgwRjBGMEYwRjBGMEYwRjBGCisKKyRMJGtfaXB0OgorCURRCTB4QzJCMkU4OTg1QTJBNzAwMCwweENBQkFFMDkwNTIyMjc4MDgKKwlEUQkweDRDMDEzMDdEMzE3QzREMDAsMHhDRDgwQjFGQ0IwRkRDQzgxCisKKyRMJGtfc2IxOgorCURRCTB4QjE5QkUxOEZDQjUwM0UwMCwweEE1REY3QTZFMTQyQUY1NDQKKwlEUQkweDM2MThENDE1RkFFMjIzMDAsMHgzQkY3Q0NDMTBEMkVEOUVGCiskTCRrX3NiMjoKKwlEUQkweEUyN0E5M0M2MEI3MTI0MDAsMHg1RUI3RTk1NUJDOTgyRkNECisJRFEJMHg2OUVCODg0MDBBRTEyOTAwLDB4QzJBMTYzQzhBQjgyMjM0QQorJEwka19zYm86CisJRFEJMHhEMEQyNkQxNzZGQkRDNzAwLDB4MTVBQUJGN0FDNTAyQTg3OAorCURRCTB4Q0ZFNDc0QTU1RkJCNkEwMCwweDhFMUU5MEQxNDEyQjM1RkEKKworJEwka19tY19mb3J3YXJkOgorCURRCTB4MDQwNzA2MDUwMDAzMDIwMSwweDBDMEYwRTBEMDgwQjBBMDkKKwlEUQkweDA4MEIwQTA5MDQwNzA2MDUsMHgwMDAzMDIwMTBDMEYwRTBECisJRFEJMHgwQzBGMEUwRDA4MEIwQTA5LDB4MDQwNzA2MDUwMDAzMDIwMQorCURRCTB4MDAwMzAyMDEwQzBGMEUwRCwweDA4MEIwQTA5MDQwNzA2MDUKKworJEwka19tY19iYWNrd2FyZDoKKwlEUQkweDA2MDUwNDA3MDIwMTAwMDMsMHgwRTBEMEMwRjBBMDkwODBCCisJRFEJMHgwMjAxMDAwMzBFMEQwQzBGLDB4MEEwOTA4MEIwNjA1MDQwNworCURRCTB4MEUwRDBDMEYwQTA5MDgwQiwweDA2MDUwNDA3MDIwMTAwMDMKKwlEUQkweDBBMDkwODBCMDYwNTA0MDcsMHgwMjAxMDAwMzBFMEQwQzBGCisKKyRMJGtfc3I6CisJRFEJMHgwNzA2MDUwNDAzMDIwMTAwLDB4MEYwRTBEMEMwQjBBMDkwOAorCURRCTB4MDMwRTA5MDQwRjBBMDUwMCwweDBCMDYwMTBDMDcwMjBEMDgKKwlEUQkweDBGMDYwRDA0MEIwMjA5MDAsMHgwNzBFMDUwQzAzMEEwMTA4CisJRFEJMHgwQjBFMDEwNDA3MEEwRDAwLDB4MDMwNjA5MEMwRjAyMDUwOAorCiskTCRrX3Jjb246CisJRFEJMHgxRjgzOTFCOUFGOURFRUI2LDB4NzAyQTk4MDg0RDdDN0Q4MQorCiskTCRrX3M2MzoKKwlEUQkweDVCNUI1QjVCNUI1QjVCNUIsMHg1QjVCNUI1QjVCNUI1QjVCCisKKyRMJGtfb3B0OgorCURRCTB4RkY5RjQ5MjlENkI2NjAwMCwweEY3OTc0MTIxREVCRTY4MDgKKwlEUQkweDAxRURCRDUxNTBCQ0VDMDAsMHhFMTBENURCMUIwNUMwQ0UwCisKKyRMJGtfZGVza2V3OgorCURRCTB4MDdFNEEzNDA0N0E0RTMwMCwweDFERkVCOTVBNURCRUY5MUEKKwlEUQkweDVGMzZCNURDODNFQTY5MDAsMHgyODQxQzJBQkY0OUQxRTc3CisKKworCisKKworJEwka19ka3NkOgorCURRCTB4RkVCOTFBNURBM0U0NDcwMCwweDA3NDBFM0E0NUExREJFRjkKKwlEUQkweDQxQzI3N0Y0QjUzNjgzMDAsMHg1RkRDNjlFQUFCMjg5RDFFCiskTCRrX2Rrc2I6CisJRFEJMHg5QTRGQ0ExRjg1NTBENTAwLDB4MDNENjUzODYxQ0M5NEM5OQorCURRCTB4MTE1QkVEQTdCNkZDNEEwMCwweEQ5OTMyNTZGN0UzNDgyQzgKKyRMJGtfZGtzZToKKwlEUQkweEQ1MDMxQ0NBMUZDOUQ2MDAsMHg1Mzg1OUE0Qzk5NEY1MDg2CisJRFEJMHhBMjMxOTYwNTRGREM3QkU4LDB4Q0Q1RUY5NkEyMEIzMTQ4NworJEwka19ka3M5OgorCURRCTB4QjYxMTZGQzg3RUQ5QTcwMCwweDRBRUQ5MzM0ODIyNTVCRkMKKwlEUQkweDQ1NzY1MTYyMjcxNDMzMDAsMHg4QkI4OUZBQ0U5REFGRENFCisKKworCisKKworJEwka19kaXB0OgorCURRCTB4MEY1MDVCMDQwQjU0NUYwMCwweDE1NEE0MTFFMTE0RTQ1MUEKKwlEUQkweDg2RTM4M0U2NjAwNTY1MDAsMHgxMjc3MTc3MkY0OTFGMTk0CisKKyRMJGtfZHNiOToKKwlEUQkweDg1MUMwMzUzOUE4NkQ2MDAsMHhDQUQ1MUY1MDRGOTk0Q0M5CisJRFEJMHhDMDNCMTc4OUVDRDc0OTAwLDB4NzI1RTJDOUVCMkZCQTU2NQorJEwka19kc2JkOgorCURRCTB4N0Q1N0NDREZFNkIxQTIwMCwweEY1NkU5QjEzODgyQTQ0MzkKKwlEUQkweDNDRTJGQUY3MjRDNkNCMDAsMHgyOTMxMTgwRDE1REVFRkQzCiskTCRrX2RzYmI6CisJRFEJMHhEMDIyNjQ5Mjk2QjQ0MjAwLDB4NjAyNjQ2RjZCMEYyRDQwNAorCURRCTB4QzE5NDk4QTZDRDU5NjcwMCwweEYzRkYwQzNFMzI1NUFBNkIKKyRMJGtfZHNiZToKKwlEUQkweDQ2RjI5Mjk2MjZENEQwMDAsMHgyMjQyNjAwNDY0QjRGNkIwCisJRFEJMHgwQzU1QTZDREZGQUFDMTAwLDB4OTQ2N0YzNkI5ODU5M0UzMgorJEwka19kc2JvOgorCURRCTB4MTM4N0VBNTM3RUY5NDAwMCwweEM3QUE2REI5RDQ5NDNFMkQKKwlEUQkweDEyRDc1NjBGOTM0NDFEMDAsMHhDQTRCODE1OUQ4QzU4RTlDCitEQgk4NiwxMDEsOTksMTE2LDExMSwxMTQsMzIsODAsMTAxLDExNCwxMDksMTE3LDExNiw5NywxMTYsMTA1CitEQgkxMTEsMTEwLDMyLDY1LDY5LDgzLDMyLDEwMiwxMTEsMTE0LDMyLDEyMCw1Niw1NCw5NSw1NAorREIJNTIsNDcsODMsODMsODMsNjksNTEsNDQsMzIsNzcsMTA1LDEwNywxMDEsMzIsNzIsOTcKK0RCCTEwOSw5OCwxMTcsMTE0LDEwMywzMiw0MCw4MywxMTYsOTcsMTEwLDEwMiwxMTEsMTE0LDEwMCwzMgorREIJODUsMTEwLDEwNSwxMTgsMTAxLDExNCwxMTUsMTA1LDExNiwxMjEsNDEsMAorQUxJR04JNjQKKworRVhURVJOCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKworQUxJR04JMTYKK3NlX2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTIwK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbW92CXJzaSxRV09SRFs4K3I5XQorCW1vdglyMTEsUVdPUkRbNTYrcjldCisKKwltb3YJcjEwZCxEV09SRFtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRpbl9wcm9sb2d1ZQorCisJbW92CXJheCxRV09SRFsxNTIrcjhdCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRpbl9wcm9sb2d1ZQorCisJbGVhCXJzaSxbMTYrcmF4XQorCWxlYQlyZGksWzUxMityOF0KKwltb3YJZWN4LDIwCisJREQJMHhhNTQ4ZjNmYworCWxlYQlyYXgsWzE4NCtyYXhdCisKKyRMJGluX3Byb2xvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyYXhdCisJbW92CXJzaSxRV09SRFsxNityYXhdCisJbW92CVFXT1JEWzE1MityOF0scmF4CisJbW92CVFXT1JEWzE2OCtyOF0scnNpCisJbW92CVFXT1JEWzE3NityOF0scmRpCisKKwltb3YJcmRpLFFXT1JEWzQwK3I5XQorCW1vdglyc2kscjgKKwltb3YJZWN4LDE1NAorCURECTB4YTU0OGYzZmMKKworCW1vdglyc2kscjkKKwl4b3IJcmN4LHJjeAorCW1vdglyZHgsUVdPUkRbOCtyc2ldCisJbW92CXI4LFFXT1JEW3JzaV0KKwltb3YJcjksUVdPUkRbMTYrcnNpXQorCW1vdglyMTAsUVdPUkRbNDArcnNpXQorCWxlYQlyMTEsWzU2K3JzaV0KKwlsZWEJcjEyLFsyNCtyc2ldCisJbW92CVFXT1JEWzMyK3JzcF0scjEwCisJbW92CVFXT1JEWzQwK3JzcF0scjExCisJbW92CVFXT1JEWzQ4K3JzcF0scjEyCisJbW92CVFXT1JEWzU2K3JzcF0scmN4CisJY2FsbAlRV09SRFtfX2ltcF9SdGxWaXJ0dWFsVW53aW5kXQorCisJbW92CWVheCwxCisJYWRkCXJzcCw2NAorCXBvcGZxCisJcG9wCXIxNQorCXBvcAlyMTQKKwlwb3AJcjEzCisJcG9wCXIxMgorCXBvcAlyYnAKKwlwb3AJcmJ4CisJcG9wCXJkaQorCXBvcAlyc2kKKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworCitzZWN0aW9uCS5wZGF0YSByZGF0YSBhbGlnbj00CitBTElHTgk0CisJREQJJEwkU0VIX2JlZ2luX3ZwYWVzX3NldF9lbmNyeXB0X2tleSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX3ZwYWVzX3NldF9lbmNyeXB0X2tleSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb192cGFlc19zZXRfZW5jcnlwdF9rZXkgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fdnBhZXNfc2V0X2RlY3J5cHRfa2V5IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfdnBhZXNfc2V0X2RlY3J5cHRfa2V5IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX3ZwYWVzX3NldF9kZWNyeXB0X2tleSB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl92cGFlc19lbmNyeXB0IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfdnBhZXNfZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb192cGFlc19lbmNyeXB0IHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX3ZwYWVzX2RlY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF92cGFlc19kZWNyeXB0IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX3ZwYWVzX2RlY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fdnBhZXNfY2JjX2VuY3J5cHQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF92cGFlc19jYmNfZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb192cGFlc19jYmNfZW5jcnlwdCB3cnQgLi5pbWFnZWJhc2UKKworc2VjdGlvbgkueGRhdGEgcmRhdGEgYWxpZ249OAorQUxJR04JOAorJEwkU0VIX2luZm9fdnBhZXNfc2V0X2VuY3J5cHRfa2V5OgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkZW5jX2tleV9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRlbmNfa2V5X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fdnBhZXNfc2V0X2RlY3J5cHRfa2V5OgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkZGVjX2tleV9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRkZWNfa2V5X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fdnBhZXNfZW5jcnlwdDoKK0RCCTksMCwwLDAKKwlERAlzZV9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGVuY19ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRlbmNfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCiskTCRTRUhfaW5mb192cGFlc19kZWNyeXB0OgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkZGVjX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJGRlY19lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX3ZwYWVzX2NiY19lbmNyeXB0OgorREIJOSwwLDAsMAorCURECXNlX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkY2JjX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJGNiY19lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvd2luLXg4Nl82NC9jcnlwdG8vZmlwc21vZHVsZS94ODZfNjQtbW9udC5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODVlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQuYXNtCkBAIC0wLDAgKzEsMTQ3NCBAQAorZGVmYXVsdAlyZWwKKyVkZWZpbmUgWE1NV09SRAorJWRlZmluZSBZTU1XT1JECislZGVmaW5lIFpNTVdPUkQKK3NlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NAorCisKK0VYVEVSTglPUEVOU1NMX2lhMzJjYXBfUAorCitnbG9iYWwJYm5fbXVsX21vbnQKKworQUxJR04JMTYKK2JuX211bF9tb250OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYm5fbXVsX21vbnQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKwltb3YJcjksUVdPUkRbNDgrcnNwXQorCisKKworCW1vdglyOWQscjlkCisJbW92CXJheCxyc3AKKworCXRlc3QJcjlkLDMKKwlqbnoJTkVBUiAkTCRtdWxfZW50ZXIKKwljbXAJcjlkLDgKKwlqYglORUFSICRMJG11bF9lbnRlcgorCWxlYQlyMTEsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyMTFkLERXT1JEWzgrcjExXQorCWNtcAlyZHgscnNpCisJam5lCU5FQVIgJEwkbXVsNHhfZW50ZXIKKwl0ZXN0CXI5ZCw3CisJanoJTkVBUiAkTCRzcXI4eF9lbnRlcgorCWptcAlORUFSICRMJG11bDR4X2VudGVyCisKK0FMSUdOCTE2CiskTCRtdWxfZW50ZXI6CisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCisKKwluZWcJcjkKKwltb3YJcjExLHJzcAorCWxlYQlyMTAsWygoLTE2KSkrcjkqOCtyc3BdCisJbmVnCXI5CisJYW5kCXIxMCwtMTAyNAorCisKKworCisKKworCisKKworCXN1YglyMTEscjEwCisJYW5kCXIxMSwtNDA5NgorCWxlYQlyc3AsW3IxMSoxK3IxMF0KKwltb3YJcjExLFFXT1JEW3JzcF0KKwljbXAJcnNwLHIxMAorCWphCU5FQVIgJEwkbXVsX3BhZ2Vfd2FsaworCWptcAlORUFSICRMJG11bF9wYWdlX3dhbGtfZG9uZQorCitBTElHTgkxNgorJEwkbXVsX3BhZ2Vfd2FsazoKKwlsZWEJcnNwLFsoKC00MDk2KSkrcnNwXQorCW1vdglyMTEsUVdPUkRbcnNwXQorCWNtcAlyc3AscjEwCisJamEJTkVBUiAkTCRtdWxfcGFnZV93YWxrCiskTCRtdWxfcGFnZV93YWxrX2RvbmU6CisKKwltb3YJUVdPUkRbOCtyOSo4K3JzcF0scmF4CisKKyRMJG11bF9ib2R5OgorCW1vdglyMTIscmR4CisJbW92CXI4LFFXT1JEW3I4XQorCW1vdglyYngsUVdPUkRbcjEyXQorCW1vdglyYXgsUVdPUkRbcnNpXQorCisJeG9yCXIxNCxyMTQKKwl4b3IJcjE1LHIxNQorCisJbW92CXJicCxyOAorCW11bAlyYngKKwltb3YJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbcmN4XQorCisJaW11bAlyYnAscjEwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbOCtyc2ldCisJYWRjCXJkeCwwCisJbW92CXIxMyxyZHgKKworCWxlYQlyMTUsWzErcjE1XQorCWptcAlORUFSICRMJDFzdF9lbnRlcgorCitBTElHTgkxNgorJEwkMXN0OgorCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFtyMTUqOCtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTEKKwltb3YJcjExLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0xNikpK3IxNSo4K3JzcF0scjEzCisJbW92CXIxMyxyZHgKKworJEwkMXN0X2VudGVyOgorCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbcjE1KjgrcmN4XQorCWFkYwlyZHgsMAorCWxlYQlyMTUsWzErcjE1XQorCW1vdglyMTAscmR4CisKKwltdWwJcmJwCisJY21wCXIxNSxyOQorCWpuZQlORUFSICRMJDFzdAorCisJYWRkCXIxMyxyYXgKKwltb3YJcmF4LFFXT1JEW3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMQorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0xNikpK3IxNSo4K3JzcF0scjEzCisJbW92CXIxMyxyZHgKKwltb3YJcjExLHIxMAorCisJeG9yCXJkeCxyZHgKKwlhZGQJcjEzLHIxMQorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC04KSkrcjkqOCtyc3BdLHIxMworCW1vdglRV09SRFtyOSo4K3JzcF0scmR4CisKKwlsZWEJcjE0LFsxK3IxNF0KKwlqbXAJTkVBUiAkTCRvdXRlcgorQUxJR04JMTYKKyRMJG91dGVyOgorCW1vdglyYngsUVdPUkRbcjE0KjgrcjEyXQorCXhvcglyMTUscjE1CisJbW92CXJicCxyOAorCW1vdglyMTAsUVdPUkRbcnNwXQorCW11bAlyYngKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbcmN4XQorCWFkYwlyZHgsMAorCisJaW11bAlyYnAscjEwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbOCtyc2ldCisJYWRjCXJkeCwwCisJbW92CXIxMCxRV09SRFs4K3JzcF0KKwltb3YJcjEzLHJkeAorCisJbGVhCXIxNSxbMStyMTVdCisJam1wCU5FQVIgJEwkaW5uZXJfZW50ZXIKKworQUxJR04JMTYKKyRMJGlubmVyOgorCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFtyMTUqOCtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwltb3YJcjEwLFFXT1JEW3IxNSo4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTUqOCtyc3BdLHIxMworCW1vdglyMTMscmR4CisKKyRMJGlubmVyX2VudGVyOgorCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbcjE1KjgrcmN4XQorCWFkYwlyZHgsMAorCWFkZAlyMTAscjExCisJbW92CXIxMSxyZHgKKwlhZGMJcjExLDAKKwlsZWEJcjE1LFsxK3IxNV0KKworCW11bAlyYnAKKwljbXAJcjE1LHI5CisJam5lCU5FQVIgJEwkaW5uZXIKKworCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwltb3YJcjEwLFFXT1JEW3IxNSo4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTUqOCtyc3BdLHIxMworCW1vdglyMTMscmR4CisKKwl4b3IJcmR4LHJkeAorCWFkZAlyMTMscjExCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtOCkpK3I5KjgrcnNwXSxyMTMKKwltb3YJUVdPUkRbcjkqOCtyc3BdLHJkeAorCisJbGVhCXIxNCxbMStyMTRdCisJY21wCXIxNCxyOQorCWpiCU5FQVIgJEwkb3V0ZXIKKworCXhvcglyMTQscjE0CisJbW92CXJheCxRV09SRFtyc3BdCisJbW92CXIxNSxyOQorCitBTElHTgkxNgorJEwkc3ViOglzYmIJcmF4LFFXT1JEW3IxNCo4K3JjeF0KKwltb3YJUVdPUkRbcjE0KjgrcmRpXSxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcjE0KjgrcnNwXQorCWxlYQlyMTQsWzErcjE0XQorCWRlYwlyMTUKKwlqbnoJTkVBUiAkTCRzdWIKKworCXNiYglyYXgsMAorCW1vdglyYngsLTEKKwl4b3IJcmJ4LHJheAorCXhvcglyMTQscjE0CisJbW92CXIxNSxyOQorCiskTCRjb3B5OgorCW1vdglyY3gsUVdPUkRbcjE0KjgrcmRpXQorCW1vdglyZHgsUVdPUkRbcjE0KjgrcnNwXQorCWFuZAlyY3gscmJ4CisJYW5kCXJkeCxyYXgKKwltb3YJUVdPUkRbcjE0KjgrcnNwXSxyOQorCW9yCXJkeCxyY3gKKwltb3YJUVdPUkRbcjE0KjgrcmRpXSxyZHgKKwlsZWEJcjE0LFsxK3IxNF0KKwlzdWIJcjE1LDEKKwlqbnoJTkVBUiAkTCRjb3B5CisKKwltb3YJcnNpLFFXT1JEWzgrcjkqOCtyc3BdCisKKwltb3YJcmF4LDEKKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcnNpXQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JzaV0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyc2ldCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcnNpXQorCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JzaV0KKworCWxlYQlyc3AsW3JzaV0KKworJEwkbXVsX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2JuX211bF9tb250OgorCitBTElHTgkxNgorYm5fbXVsNHhfbW9udDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2JuX211bDR4X21vbnQ6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKwltb3YJcjksUVdPUkRbNDgrcnNwXQorCisKKworCW1vdglyOWQscjlkCisJbW92CXJheCxyc3AKKworJEwkbXVsNHhfZW50ZXI6CisJYW5kCXIxMWQsMHg4MDEwMAorCWNtcAlyMTFkLDB4ODAxMDAKKwlqZQlORUFSICRMJG11bHg0eF9lbnRlcgorCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworCisJbmVnCXI5CisJbW92CXIxMSxyc3AKKwlsZWEJcjEwLFsoKC0zMikpK3I5KjgrcnNwXQorCW5lZwlyOQorCWFuZAlyMTAsLTEwMjQKKworCXN1YglyMTEscjEwCisJYW5kCXIxMSwtNDA5NgorCWxlYQlyc3AsW3IxMSoxK3IxMF0KKwltb3YJcjExLFFXT1JEW3JzcF0KKwljbXAJcnNwLHIxMAorCWphCU5FQVIgJEwkbXVsNHhfcGFnZV93YWxrCisJam1wCU5FQVIgJEwkbXVsNHhfcGFnZV93YWxrX2RvbmUKKworJEwkbXVsNHhfcGFnZV93YWxrOgorCWxlYQlyc3AsWygoLTQwOTYpKStyc3BdCisJbW92CXIxMSxRV09SRFtyc3BdCisJY21wCXJzcCxyMTAKKwlqYQlORUFSICRMJG11bDR4X3BhZ2Vfd2FsaworJEwkbXVsNHhfcGFnZV93YWxrX2RvbmU6CisKKwltb3YJUVdPUkRbOCtyOSo4K3JzcF0scmF4CisKKyRMJG11bDR4X2JvZHk6CisJbW92CVFXT1JEWzE2K3I5KjgrcnNwXSxyZGkKKwltb3YJcjEyLHJkeAorCW1vdglyOCxRV09SRFtyOF0KKwltb3YJcmJ4LFFXT1JEW3IxMl0KKwltb3YJcmF4LFFXT1JEW3JzaV0KKworCXhvcglyMTQscjE0CisJeG9yCXIxNSxyMTUKKworCW1vdglyYnAscjgKKwltdWwJcmJ4CisJbW92CXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEW3JjeF0KKworCWltdWwJcmJwLHIxMAorCW1vdglyMTEscmR4CisKKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcnNpXQorCWFkYwlyZHgsMAorCW1vdglyZGkscmR4CisKKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcmN4XQorCWFkYwlyZHgsMAorCW1vdglyMTAscmR4CisKKwltdWwJcmJwCisJYWRkCXJkaSxyYXgKKwltb3YJcmF4LFFXT1JEWzE2K3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcmRpLHIxMQorCWxlYQlyMTUsWzQrcjE1XQorCWFkYwlyZHgsMAorCW1vdglRV09SRFtyc3BdLHJkaQorCW1vdglyMTMscmR4CisJam1wCU5FQVIgJEwkMXN0NHgKK0FMSUdOCTE2CiskTCQxc3Q0eDoKKwltdWwJcmJ4CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEWygoLTE2KSkrcjE1KjgrcmN4XQorCWFkYwlyZHgsMAorCW1vdglyMTEscmR4CisKKwltdWwJcmJwCisJYWRkCXIxMyxyYXgKKwltb3YJcmF4LFFXT1JEWygoLTgpKStyMTUqOCtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMjQpKStyMTUqOCtyc3BdLHIxMworCW1vdglyZGkscmR4CisKKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LFFXT1JEWygoLTgpKStyMTUqOCtyY3hdCisJYWRjCXJkeCwwCisJbW92CXIxMCxyZHgKKworCW11bAlyYnAKKwlhZGQJcmRpLHJheAorCW1vdglyYXgsUVdPUkRbcjE1KjgrcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyZGkscjExCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTE2KSkrcjE1KjgrcnNwXSxyZGkKKwltb3YJcjEzLHJkeAorCisJbXVsCXJieAorCWFkZAlyMTAscmF4CisJbW92CXJheCxRV09SRFtyMTUqOCtyY3hdCisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbOCtyMTUqOCtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtOCkpK3IxNSo4K3JzcF0scjEzCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbOCtyMTUqOCtyY3hdCisJYWRjCXJkeCwwCisJbGVhCXIxNSxbNCtyMTVdCisJbW92CXIxMCxyZHgKKworCW11bAlyYnAKKwlhZGQJcmRpLHJheAorCW1vdglyYXgsUVdPUkRbKCgtMTYpKStyMTUqOCtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMzIpKStyMTUqOCtyc3BdLHJkaQorCW1vdglyMTMscmR4CisJY21wCXIxNSxyOQorCWpiCU5FQVIgJEwkMXN0NHgKKworCW11bAlyYngKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbKCgtMTYpKStyMTUqOCtyY3hdCisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3IxNSo4K3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0yNCkpK3IxNSo4K3JzcF0scjEzCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3IxNSo4K3JjeF0KKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTUqOCtyc3BdLHJkaQorCW1vdglyMTMscmR4CisKKwl4b3IJcmRpLHJkaQorCWFkZAlyMTMscjEwCisJYWRjCXJkaSwwCisJbW92CVFXT1JEWygoLTgpKStyMTUqOCtyc3BdLHIxMworCW1vdglRV09SRFtyMTUqOCtyc3BdLHJkaQorCisJbGVhCXIxNCxbMStyMTRdCitBTElHTgk0CiskTCRvdXRlcjR4OgorCW1vdglyYngsUVdPUkRbcjE0KjgrcjEyXQorCXhvcglyMTUscjE1CisJbW92CXIxMCxRV09SRFtyc3BdCisJbW92CXJicCxyOAorCW11bAlyYngKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbcmN4XQorCWFkYwlyZHgsMAorCisJaW11bAlyYnAscjEwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbOCtyc2ldCisJYWRjCXJkeCwwCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbOCtyY3hdCisJYWRjCXJkeCwwCisJYWRkCXIxMSxRV09SRFs4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFsxNityc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlsZWEJcjE1LFs0K3IxNV0KKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbcnNwXSxyZGkKKwltb3YJcjEzLHJkeAorCWptcAlORUFSICRMJGlubmVyNHgKK0FMSUdOCTE2CiskTCRpbm5lcjR4OgorCW11bAlyYngKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbKCgtMTYpKStyMTUqOCtyY3hdCisJYWRjCXJkeCwwCisJYWRkCXIxMCxRV09SRFsoKC0xNikpK3IxNSo4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJcjExLHJkeAorCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFsoKC04KSkrcjE1KjgrcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyMTMscjEwCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTI0KSkrcjE1KjgrcnNwXSxyMTMKKwltb3YJcmRpLHJkeAorCisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJbW92CXJheCxRV09SRFsoKC04KSkrcjE1KjgrcmN4XQorCWFkYwlyZHgsMAorCWFkZAlyMTEsUVdPUkRbKCgtOCkpK3IxNSo4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFtyMTUqOCtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTUqOCtyc3BdLHJkaQorCW1vdglyMTMscmR4CisKKwltdWwJcmJ4CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEW3IxNSo4K3JjeF0KKwlhZGMJcmR4LDAKKwlhZGQJcjEwLFFXT1JEW3IxNSo4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJcjExLHJkeAorCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFs4K3IxNSo4K3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC04KSkrcjE1KjgrcnNwXSxyMTMKKwltb3YJcmRpLHJkeAorCisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJbW92CXJheCxRV09SRFs4K3IxNSo4K3JjeF0KKwlhZGMJcmR4LDAKKwlhZGQJcjExLFFXT1JEWzgrcjE1KjgrcnNwXQorCWFkYwlyZHgsMAorCWxlYQlyMTUsWzQrcjE1XQorCW1vdglyMTAscmR4CisKKwltdWwJcmJwCisJYWRkCXJkaSxyYXgKKwltb3YJcmF4LFFXT1JEWygoLTE2KSkrcjE1KjgrcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyZGkscjExCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTMyKSkrcjE1KjgrcnNwXSxyZGkKKwltb3YJcjEzLHJkeAorCWNtcAlyMTUscjkKKwlqYglORUFSICRMJGlubmVyNHgKKworCW11bAlyYngKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbKCgtMTYpKStyMTUqOCtyY3hdCisJYWRjCXJkeCwwCisJYWRkCXIxMCxRV09SRFsoKC0xNikpK3IxNSo4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJcjExLHJkeAorCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFsoKC04KSkrcjE1KjgrcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyMTMscjEwCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTI0KSkrcjE1KjgrcnNwXSxyMTMKKwltb3YJcmRpLHJkeAorCisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJbW92CXJheCxRV09SRFsoKC04KSkrcjE1KjgrcmN4XQorCWFkYwlyZHgsMAorCWFkZAlyMTEsUVdPUkRbKCgtOCkpK3IxNSo4K3JzcF0KKwlhZGMJcmR4LDAKKwlsZWEJcjE0LFsxK3IxNF0KKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFtyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTUqOCtyc3BdLHJkaQorCW1vdglyMTMscmR4CisKKwl4b3IJcmRpLHJkaQorCWFkZAlyMTMscjEwCisJYWRjCXJkaSwwCisJYWRkCXIxMyxRV09SRFtyOSo4K3JzcF0KKwlhZGMJcmRpLDAKKwltb3YJUVdPUkRbKCgtOCkpK3IxNSo4K3JzcF0scjEzCisJbW92CVFXT1JEW3IxNSo4K3JzcF0scmRpCisKKwljbXAJcjE0LHI5CisJamIJTkVBUiAkTCRvdXRlcjR4CisJbW92CXJkaSxRV09SRFsxNityOSo4K3JzcF0KKwlsZWEJcjE1LFsoKC00KSkrcjldCisJbW92CXJheCxRV09SRFtyc3BdCisJbW92CXJkeCxRV09SRFs4K3JzcF0KKwlzaHIJcjE1LDIKKwlsZWEJcnNpLFtyc3BdCisJeG9yCXIxNCxyMTQKKworCXN1YglyYXgsUVdPUkRbcmN4XQorCW1vdglyYngsUVdPUkRbMTYrcnNpXQorCW1vdglyYnAsUVdPUkRbMjQrcnNpXQorCXNiYglyZHgsUVdPUkRbOCtyY3hdCisKKyRMJHN1YjR4OgorCW1vdglRV09SRFtyMTQqOCtyZGldLHJheAorCW1vdglRV09SRFs4K3IxNCo4K3JkaV0scmR4CisJc2JiCXJieCxRV09SRFsxNityMTQqOCtyY3hdCisJbW92CXJheCxRV09SRFszMityMTQqOCtyc2ldCisJbW92CXJkeCxRV09SRFs0MCtyMTQqOCtyc2ldCisJc2JiCXJicCxRV09SRFsyNCtyMTQqOCtyY3hdCisJbW92CVFXT1JEWzE2K3IxNCo4K3JkaV0scmJ4CisJbW92CVFXT1JEWzI0K3IxNCo4K3JkaV0scmJwCisJc2JiCXJheCxRV09SRFszMityMTQqOCtyY3hdCisJbW92CXJieCxRV09SRFs0OCtyMTQqOCtyc2ldCisJbW92CXJicCxRV09SRFs1NityMTQqOCtyc2ldCisJc2JiCXJkeCxRV09SRFs0MCtyMTQqOCtyY3hdCisJbGVhCXIxNCxbNCtyMTRdCisJZGVjCXIxNQorCWpueglORUFSICRMJHN1YjR4CisKKwltb3YJUVdPUkRbcjE0KjgrcmRpXSxyYXgKKwltb3YJcmF4LFFXT1JEWzMyK3IxNCo4K3JzaV0KKwlzYmIJcmJ4LFFXT1JEWzE2K3IxNCo4K3JjeF0KKwltb3YJUVdPUkRbOCtyMTQqOCtyZGldLHJkeAorCXNiYglyYnAsUVdPUkRbMjQrcjE0KjgrcmN4XQorCW1vdglRV09SRFsxNityMTQqOCtyZGldLHJieAorCisJc2JiCXJheCwwCisJbW92CVFXT1JEWzI0K3IxNCo4K3JkaV0scmJwCisJcHhvcgl4bW0wLHhtbTAKK0RCCTEwMiw3MiwxNSwxMTAsMjI0CisJcGNtcGVxZAl4bW01LHhtbTUKKwlwc2h1ZmQJeG1tNCx4bW00LDAKKwltb3YJcjE1LHI5CisJcHhvcgl4bW01LHhtbTQKKwlzaHIJcjE1LDIKKwl4b3IJZWF4LGVheAorCisJam1wCU5FQVIgJEwkY29weTR4CitBTElHTgkxNgorJEwkY29weTR4OgorCW1vdmRxYQl4bW0xLFhNTVdPUkRbcmF4KjErcnNwXQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbcmF4KjErcmRpXQorCXBhbmQJeG1tMSx4bW00CisJcGFuZAl4bW0yLHhtbTUKKwltb3ZkcWEJeG1tMyxYTU1XT1JEWzE2K3JheCoxK3JzcF0KKwltb3ZkcWEJWE1NV09SRFtyYXgqMStyc3BdLHhtbTAKKwlwb3IJeG1tMSx4bW0yCisJbW92ZHF1CXhtbTIsWE1NV09SRFsxNityYXgqMStyZGldCisJbW92ZHF1CVhNTVdPUkRbcmF4KjErcmRpXSx4bW0xCisJcGFuZAl4bW0zLHhtbTQKKwlwYW5kCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWzE2K3JheCoxK3JzcF0seG1tMAorCXBvcgl4bW0zLHhtbTIKKwltb3ZkcXUJWE1NV09SRFsxNityYXgqMStyZGldLHhtbTMKKwlsZWEJcmF4LFszMityYXhdCisJZGVjCXIxNQorCWpueglORUFSICRMJGNvcHk0eAorCW1vdglyc2ksUVdPUkRbOCtyOSo4K3JzcF0KKworCW1vdglyYXgsMQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRtdWw0eF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9ibl9tdWw0eF9tb250OgorRVhURVJOCWJuX3Nxcng4eF9pbnRlcm5hbAorRVhURVJOCWJuX3Nxcjh4X2ludGVybmFsCisKKworQUxJR04JMzIKK2JuX3Nxcjh4X21vbnQ6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9ibl9zcXI4eF9tb250OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisKKwltb3YJcmF4LHJzcAorCiskTCRzcXI4eF9lbnRlcjoKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKyRMJHNxcjh4X3Byb2xvZ3VlOgorCisJbW92CXIxMGQscjlkCisJc2hsCXI5ZCwzCisJc2hsCXIxMCwzKzIKKwluZWcJcjkKKworCisKKworCisKKwlsZWEJcjExLFsoKC02NCkpK3I5KjIrcnNwXQorCW1vdglyYnAscnNwCisJbW92CXI4LFFXT1JEW3I4XQorCXN1YglyMTEscnNpCisJYW5kCXIxMSw0MDk1CisJY21wCXIxMCxyMTEKKwlqYglORUFSICRMJHNxcjh4X3NwX2FsdAorCXN1YglyYnAscjExCisJbGVhCXJicCxbKCgtNjQpKStyOSoyK3JicF0KKwlqbXAJTkVBUiAkTCRzcXI4eF9zcF9kb25lCisKK0FMSUdOCTMyCiskTCRzcXI4eF9zcF9hbHQ6CisJbGVhCXIxMCxbKCg0MDk2LTY0KSkrcjkqMl0KKwlsZWEJcmJwLFsoKC02NCkpK3I5KjIrcmJwXQorCXN1YglyMTEscjEwCisJbW92CXIxMCwwCisJY21vdmMJcjExLHIxMAorCXN1YglyYnAscjExCiskTCRzcXI4eF9zcF9kb25lOgorCWFuZAlyYnAsLTY0CisJbW92CXIxMSxyc3AKKwlzdWIJcjExLHJicAorCWFuZAlyMTEsLTQwOTYKKwlsZWEJcnNwLFtyYnAqMStyMTFdCisJbW92CXIxMCxRV09SRFtyc3BdCisJY21wCXJzcCxyYnAKKwlqYQlORUFSICRMJHNxcjh4X3BhZ2Vfd2FsaworCWptcAlORUFSICRMJHNxcjh4X3BhZ2Vfd2Fsa19kb25lCisKK0FMSUdOCTE2CiskTCRzcXI4eF9wYWdlX3dhbGs6CisJbGVhCXJzcCxbKCgtNDA5NikpK3JzcF0KKwltb3YJcjEwLFFXT1JEW3JzcF0KKwljbXAJcnNwLHJicAorCWphCU5FQVIgJEwkc3FyOHhfcGFnZV93YWxrCiskTCRzcXI4eF9wYWdlX3dhbGtfZG9uZToKKworCW1vdglyMTAscjkKKwluZWcJcjkKKworCW1vdglRV09SRFszMityc3BdLHI4CisJbW92CVFXT1JEWzQwK3JzcF0scmF4CisKKyRMJHNxcjh4X2JvZHk6CisKK0RCCTEwMiw3MiwxNSwxMTAsMjA5CisJcHhvcgl4bW0wLHhtbTAKK0RCCTEwMiw3MiwxNSwxMTAsMjA3CitEQgkxMDIsNzMsMTUsMTEwLDIxOAorCWxlYQlyYXgsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdgllYXgsRFdPUkRbOCtyYXhdCisJYW5kCWVheCwweDgwMTAwCisJY21wCWVheCwweDgwMTAwCisJam5lCU5FQVIgJEwkc3FyOHhfbm94CisKKwljYWxsCWJuX3Nxcng4eF9pbnRlcm5hbAorCisKKworCisJbGVhCXJieCxbcmN4KjErcjhdCisJbW92CXI5LHJjeAorCW1vdglyZHgscmN4CitEQgkxMDIsNzIsMTUsMTI2LDIwNworCXNhcglyY3gsMysyCisJam1wCU5FQVIgJEwkc3FyOHhfc3ViCisKK0FMSUdOCTMyCiskTCRzcXI4eF9ub3g6CisJY2FsbAlibl9zcXI4eF9pbnRlcm5hbAorCisKKworCisJbGVhCXJieCxbcjkqMStyZGldCisJbW92CXJjeCxyOQorCW1vdglyZHgscjkKK0RCCTEwMiw3MiwxNSwxMjYsMjA3CisJc2FyCXJjeCwzKzIKKwlqbXAJTkVBUiAkTCRzcXI4eF9zdWIKKworQUxJR04JMzIKKyRMJHNxcjh4X3N1YjoKKwltb3YJcjEyLFFXT1JEW3JieF0KKwltb3YJcjEzLFFXT1JEWzgrcmJ4XQorCW1vdglyMTQsUVdPUkRbMTYrcmJ4XQorCW1vdglyMTUsUVdPUkRbMjQrcmJ4XQorCWxlYQlyYngsWzMyK3JieF0KKwlzYmIJcjEyLFFXT1JEW3JicF0KKwlzYmIJcjEzLFFXT1JEWzgrcmJwXQorCXNiYglyMTQsUVdPUkRbMTYrcmJwXQorCXNiYglyMTUsUVdPUkRbMjQrcmJwXQorCWxlYQlyYnAsWzMyK3JicF0KKwltb3YJUVdPUkRbcmRpXSxyMTIKKwltb3YJUVdPUkRbOCtyZGldLHIxMworCW1vdglRV09SRFsxNityZGldLHIxNAorCW1vdglRV09SRFsyNCtyZGldLHIxNQorCWxlYQlyZGksWzMyK3JkaV0KKwlpbmMJcmN4CisJam56CU5FQVIgJEwkc3FyOHhfc3ViCisKKwlzYmIJcmF4LDAKKwlsZWEJcmJ4LFtyOSoxK3JieF0KKwlsZWEJcmRpLFtyOSoxK3JkaV0KKworREIJMTAyLDcyLDE1LDExMCwyMDAKKwlweG9yCXhtbTAseG1tMAorCXBzaHVmZAl4bW0xLHhtbTEsMAorCW1vdglyc2ksUVdPUkRbNDArcnNwXQorCisJam1wCU5FQVIgJEwkc3FyOHhfY29uZF9jb3B5CisKK0FMSUdOCTMyCiskTCRzcXI4eF9jb25kX2NvcHk6CisJbW92ZHFhCXhtbTIsWE1NV09SRFtyYnhdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsxNityYnhdCisJbGVhCXJieCxbMzIrcmJ4XQorCW1vdmRxdQl4bW00LFhNTVdPUkRbcmRpXQorCW1vdmRxdQl4bW01LFhNTVdPUkRbMTYrcmRpXQorCWxlYQlyZGksWzMyK3JkaV0KKwltb3ZkcWEJWE1NV09SRFsoLTMyKStyYnhdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsoLTE2KStyYnhdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsoLTMyKStyZHgqMStyYnhdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsoLTE2KStyZHgqMStyYnhdLHhtbTAKKwlwY21wZXFkCXhtbTAseG1tMQorCXBhbmQJeG1tMix4bW0xCisJcGFuZAl4bW0zLHhtbTEKKwlwYW5kCXhtbTQseG1tMAorCXBhbmQJeG1tNSx4bW0wCisJcHhvcgl4bW0wLHhtbTAKKwlwb3IJeG1tNCx4bW0yCisJcG9yCXhtbTUseG1tMworCW1vdmRxdQlYTU1XT1JEWygtMzIpK3JkaV0seG1tNAorCW1vdmRxdQlYTU1XT1JEWygtMTYpK3JkaV0seG1tNQorCWFkZAlyOSwzMgorCWpueglORUFSICRMJHNxcjh4X2NvbmRfY29weQorCisJbW92CXJheCwxCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJHNxcjh4X2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2JuX3Nxcjh4X21vbnQ6CisKK0FMSUdOCTMyCitibl9tdWx4NHhfbW9udDoKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2JuX211bHg0eF9tb250OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisKKwltb3YJcmF4LHJzcAorCiskTCRtdWx4NHhfZW50ZXI6CisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCiskTCRtdWx4NHhfcHJvbG9ndWU6CisKKwlzaGwJcjlkLDMKKwl4b3IJcjEwLHIxMAorCXN1YglyMTAscjkKKwltb3YJcjgsUVdPUkRbcjhdCisJbGVhCXJicCxbKCgtNzIpKStyMTAqMStyc3BdCisJYW5kCXJicCwtMTI4CisJbW92CXIxMSxyc3AKKwlzdWIJcjExLHJicAorCWFuZAlyMTEsLTQwOTYKKwlsZWEJcnNwLFtyYnAqMStyMTFdCisJbW92CXIxMCxRV09SRFtyc3BdCisJY21wCXJzcCxyYnAKKwlqYQlORUFSICRMJG11bHg0eF9wYWdlX3dhbGsKKwlqbXAJTkVBUiAkTCRtdWx4NHhfcGFnZV93YWxrX2RvbmUKKworQUxJR04JMTYKKyRMJG11bHg0eF9wYWdlX3dhbGs6CisJbGVhCXJzcCxbKCgtNDA5NikpK3JzcF0KKwltb3YJcjEwLFFXT1JEW3JzcF0KKwljbXAJcnNwLHJicAorCWphCU5FQVIgJEwkbXVseDR4X3BhZ2Vfd2FsaworJEwkbXVseDR4X3BhZ2Vfd2Fsa19kb25lOgorCisJbGVhCXIxMCxbcjkqMStyZHhdCisKKworCisKKworCisKKworCisKKworCisJbW92CVFXT1JEW3JzcF0scjkKKwlzaHIJcjksNQorCW1vdglRV09SRFsxNityc3BdLHIxMAorCXN1YglyOSwxCisJbW92CVFXT1JEWzI0K3JzcF0scjgKKwltb3YJUVdPUkRbMzIrcnNwXSxyZGkKKwltb3YJUVdPUkRbNDArcnNwXSxyYXgKKworCW1vdglRV09SRFs0OCtyc3BdLHI5CisJam1wCU5FQVIgJEwkbXVseDR4X2JvZHkKKworQUxJR04JMzIKKyRMJG11bHg0eF9ib2R5OgorCWxlYQlyZGksWzgrcmR4XQorCW1vdglyZHgsUVdPUkRbcmR4XQorCWxlYQlyYngsWygoNjQrMzIpKStyc3BdCisJbW92CXI5LHJkeAorCisJbXVseAlyYXgscjgsUVdPUkRbcnNpXQorCW11bHgJcjE0LHIxMSxRV09SRFs4K3JzaV0KKwlhZGQJcjExLHJheAorCW1vdglRV09SRFs4K3JzcF0scmRpCisJbXVseAlyMTMscjEyLFFXT1JEWzE2K3JzaV0KKwlhZGMJcjEyLHIxNAorCWFkYwlyMTMsMAorCisJbW92CXJkaSxyOAorCWltdWwJcjgsUVdPUkRbMjQrcnNwXQorCXhvcglyYnAscmJwCisKKwltdWx4CXIxNCxyYXgsUVdPUkRbMjQrcnNpXQorCW1vdglyZHgscjgKKwlsZWEJcnNpLFszMityc2ldCisJYWRjeAlyMTMscmF4CisJYWRjeAlyMTQscmJwCisKKwltdWx4CXIxMCxyYXgsUVdPUkRbcmN4XQorCWFkY3gJcmRpLHJheAorCWFkb3gJcjEwLHIxMQorCW11bHgJcjExLHJheCxRV09SRFs4K3JjeF0KKwlhZGN4CXIxMCxyYXgKKwlhZG94CXIxMSxyMTIKK0RCCTB4YzQsMHg2MiwweGZiLDB4ZjYsMHhhMSwweDEwLDB4MDAsMHgwMCwweDAwCisJbW92CXJkaSxRV09SRFs0OCtyc3BdCisJbW92CVFXT1JEWygoLTMyKSkrcmJ4XSxyMTAKKwlhZGN4CXIxMSxyYXgKKwlhZG94CXIxMixyMTMKKwltdWx4CXIxNSxyYXgsUVdPUkRbMjQrcmN4XQorCW1vdglyZHgscjkKKwltb3YJUVdPUkRbKCgtMjQpKStyYnhdLHIxMQorCWFkY3gJcjEyLHJheAorCWFkb3gJcjE1LHJicAorCWxlYQlyY3gsWzMyK3JjeF0KKwltb3YJUVdPUkRbKCgtMTYpKStyYnhdLHIxMgorCisJam1wCU5FQVIgJEwkbXVseDR4XzFzdAorCitBTElHTgkzMgorJEwkbXVseDR4XzFzdDoKKwlhZGN4CXIxNSxyYnAKKwltdWx4CXJheCxyMTAsUVdPUkRbcnNpXQorCWFkY3gJcjEwLHIxNAorCW11bHgJcjE0LHIxMSxRV09SRFs4K3JzaV0KKwlhZGN4CXIxMSxyYXgKKwltdWx4CXJheCxyMTIsUVdPUkRbMTYrcnNpXQorCWFkY3gJcjEyLHIxNAorCW11bHgJcjE0LHIxMyxRV09SRFsyNCtyc2ldCitEQgkweDY3LDB4NjcKKwltb3YJcmR4LHI4CisJYWRjeAlyMTMscmF4CisJYWRjeAlyMTQscmJwCisJbGVhCXJzaSxbMzIrcnNpXQorCWxlYQlyYngsWzMyK3JieF0KKworCWFkb3gJcjEwLHIxNQorCW11bHgJcjE1LHJheCxRV09SRFtyY3hdCisJYWRjeAlyMTAscmF4CisJYWRveAlyMTEscjE1CisJbXVseAlyMTUscmF4LFFXT1JEWzgrcmN4XQorCWFkY3gJcjExLHJheAorCWFkb3gJcjEyLHIxNQorCW11bHgJcjE1LHJheCxRV09SRFsxNityY3hdCisJbW92CVFXT1JEWygoLTQwKSkrcmJ4XSxyMTAKKwlhZGN4CXIxMixyYXgKKwltb3YJUVdPUkRbKCgtMzIpKStyYnhdLHIxMQorCWFkb3gJcjEzLHIxNQorCW11bHgJcjE1LHJheCxRV09SRFsyNCtyY3hdCisJbW92CXJkeCxyOQorCW1vdglRV09SRFsoKC0yNCkpK3JieF0scjEyCisJYWRjeAlyMTMscmF4CisJYWRveAlyMTUscmJwCisJbGVhCXJjeCxbMzIrcmN4XQorCW1vdglRV09SRFsoKC0xNikpK3JieF0scjEzCisKKwlkZWMJcmRpCisJam56CU5FQVIgJEwkbXVseDR4XzFzdAorCisJbW92CXJheCxRV09SRFtyc3BdCisJbW92CXJkaSxRV09SRFs4K3JzcF0KKwlhZGMJcjE1LHJicAorCWFkZAlyMTQscjE1CisJc2JiCXIxNSxyMTUKKwltb3YJUVdPUkRbKCgtOCkpK3JieF0scjE0CisJam1wCU5FQVIgJEwkbXVseDR4X291dGVyCisKK0FMSUdOCTMyCiskTCRtdWx4NHhfb3V0ZXI6CisJbW92CXJkeCxRV09SRFtyZGldCisJbGVhCXJkaSxbOCtyZGldCisJc3ViCXJzaSxyYXgKKwltb3YJUVdPUkRbcmJ4XSxyMTUKKwlsZWEJcmJ4LFsoKDY0KzMyKSkrcnNwXQorCXN1YglyY3gscmF4CisKKwltdWx4CXIxMSxyOCxRV09SRFtyc2ldCisJeG9yCWVicCxlYnAKKwltb3YJcjkscmR4CisJbXVseAlyMTIscjE0LFFXT1JEWzgrcnNpXQorCWFkb3gJcjgsUVdPUkRbKCgtMzIpKStyYnhdCisJYWRjeAlyMTEscjE0CisJbXVseAlyMTMscjE1LFFXT1JEWzE2K3JzaV0KKwlhZG94CXIxMSxRV09SRFsoKC0yNCkpK3JieF0KKwlhZGN4CXIxMixyMTUKKwlhZG94CXIxMixRV09SRFsoKC0xNikpK3JieF0KKwlhZGN4CXIxMyxyYnAKKwlhZG94CXIxMyxyYnAKKworCW1vdglRV09SRFs4K3JzcF0scmRpCisJbW92CXIxNSxyOAorCWltdWwJcjgsUVdPUkRbMjQrcnNwXQorCXhvcgllYnAsZWJwCisKKwltdWx4CXIxNCxyYXgsUVdPUkRbMjQrcnNpXQorCW1vdglyZHgscjgKKwlhZGN4CXIxMyxyYXgKKwlhZG94CXIxMyxRV09SRFsoKC04KSkrcmJ4XQorCWFkY3gJcjE0LHJicAorCWxlYQlyc2ksWzMyK3JzaV0KKwlhZG94CXIxNCxyYnAKKworCW11bHgJcjEwLHJheCxRV09SRFtyY3hdCisJYWRjeAlyMTUscmF4CisJYWRveAlyMTAscjExCisJbXVseAlyMTEscmF4LFFXT1JEWzgrcmN4XQorCWFkY3gJcjEwLHJheAorCWFkb3gJcjExLHIxMgorCW11bHgJcjEyLHJheCxRV09SRFsxNityY3hdCisJbW92CVFXT1JEWygoLTMyKSkrcmJ4XSxyMTAKKwlhZGN4CXIxMSxyYXgKKwlhZG94CXIxMixyMTMKKwltdWx4CXIxNSxyYXgsUVdPUkRbMjQrcmN4XQorCW1vdglyZHgscjkKKwltb3YJUVdPUkRbKCgtMjQpKStyYnhdLHIxMQorCWxlYQlyY3gsWzMyK3JjeF0KKwlhZGN4CXIxMixyYXgKKwlhZG94CXIxNSxyYnAKKwltb3YJcmRpLFFXT1JEWzQ4K3JzcF0KKwltb3YJUVdPUkRbKCgtMTYpKStyYnhdLHIxMgorCisJam1wCU5FQVIgJEwkbXVseDR4X2lubmVyCisKK0FMSUdOCTMyCiskTCRtdWx4NHhfaW5uZXI6CisJbXVseAlyYXgscjEwLFFXT1JEW3JzaV0KKwlhZGN4CXIxNSxyYnAKKwlhZG94CXIxMCxyMTQKKwltdWx4CXIxNCxyMTEsUVdPUkRbOCtyc2ldCisJYWRjeAlyMTAsUVdPUkRbcmJ4XQorCWFkb3gJcjExLHJheAorCW11bHgJcmF4LHIxMixRV09SRFsxNityc2ldCisJYWRjeAlyMTEsUVdPUkRbOCtyYnhdCisJYWRveAlyMTIscjE0CisJbXVseAlyMTQscjEzLFFXT1JEWzI0K3JzaV0KKwltb3YJcmR4LHI4CisJYWRjeAlyMTIsUVdPUkRbMTYrcmJ4XQorCWFkb3gJcjEzLHJheAorCWFkY3gJcjEzLFFXT1JEWzI0K3JieF0KKwlhZG94CXIxNCxyYnAKKwlsZWEJcnNpLFszMityc2ldCisJbGVhCXJieCxbMzIrcmJ4XQorCWFkY3gJcjE0LHJicAorCisJYWRveAlyMTAscjE1CisJbXVseAlyMTUscmF4LFFXT1JEW3JjeF0KKwlhZGN4CXIxMCxyYXgKKwlhZG94CXIxMSxyMTUKKwltdWx4CXIxNSxyYXgsUVdPUkRbOCtyY3hdCisJYWRjeAlyMTEscmF4CisJYWRveAlyMTIscjE1CisJbXVseAlyMTUscmF4LFFXT1JEWzE2K3JjeF0KKwltb3YJUVdPUkRbKCgtNDApKStyYnhdLHIxMAorCWFkY3gJcjEyLHJheAorCWFkb3gJcjEzLHIxNQorCW11bHgJcjE1LHJheCxRV09SRFsyNCtyY3hdCisJbW92CXJkeCxyOQorCW1vdglRV09SRFsoKC0zMikpK3JieF0scjExCisJbW92CVFXT1JEWygoLTI0KSkrcmJ4XSxyMTIKKwlhZGN4CXIxMyxyYXgKKwlhZG94CXIxNSxyYnAKKwlsZWEJcmN4LFszMityY3hdCisJbW92CVFXT1JEWygoLTE2KSkrcmJ4XSxyMTMKKworCWRlYwlyZGkKKwlqbnoJTkVBUiAkTCRtdWx4NHhfaW5uZXIKKworCW1vdglyYXgsUVdPUkRbcnNwXQorCW1vdglyZGksUVdPUkRbOCtyc3BdCisJYWRjCXIxNSxyYnAKKwlzdWIJcmJwLFFXT1JEW3JieF0KKwlhZGMJcjE0LHIxNQorCXNiYglyMTUscjE1CisJbW92CVFXT1JEWygoLTgpKStyYnhdLHIxNAorCisJY21wCXJkaSxRV09SRFsxNityc3BdCisJam5lCU5FQVIgJEwkbXVseDR4X291dGVyCisKKwlsZWEJcmJ4LFs2NCtyc3BdCisJc3ViCXJjeCxyYXgKKwluZWcJcjE1CisJbW92CXJkeCxyYXgKKwlzaHIJcmF4LDMrMgorCW1vdglyZGksUVdPUkRbMzIrcnNwXQorCWptcAlORUFSICRMJG11bHg0eF9zdWIKKworQUxJR04JMzIKKyRMJG11bHg0eF9zdWI6CisJbW92CXIxMSxRV09SRFtyYnhdCisJbW92CXIxMixRV09SRFs4K3JieF0KKwltb3YJcjEzLFFXT1JEWzE2K3JieF0KKwltb3YJcjE0LFFXT1JEWzI0K3JieF0KKwlsZWEJcmJ4LFszMityYnhdCisJc2JiCXIxMSxRV09SRFtyY3hdCisJc2JiCXIxMixRV09SRFs4K3JjeF0KKwlzYmIJcjEzLFFXT1JEWzE2K3JjeF0KKwlzYmIJcjE0LFFXT1JEWzI0K3JjeF0KKwlsZWEJcmN4LFszMityY3hdCisJbW92CVFXT1JEW3JkaV0scjExCisJbW92CVFXT1JEWzgrcmRpXSxyMTIKKwltb3YJUVdPUkRbMTYrcmRpXSxyMTMKKwltb3YJUVdPUkRbMjQrcmRpXSxyMTQKKwlsZWEJcmRpLFszMityZGldCisJZGVjCXJheAorCWpueglORUFSICRMJG11bHg0eF9zdWIKKworCXNiYglyMTUsMAorCWxlYQlyYngsWzY0K3JzcF0KKwlzdWIJcmRpLHJkeAorCitEQgkxMDIsNzMsMTUsMTEwLDIwNworCXB4b3IJeG1tMCx4bW0wCisJcHNodWZkCXhtbTEseG1tMSwwCisJbW92CXJzaSxRV09SRFs0MCtyc3BdCisKKwlqbXAJTkVBUiAkTCRtdWx4NHhfY29uZF9jb3B5CisKK0FMSUdOCTMyCiskTCRtdWx4NHhfY29uZF9jb3B5OgorCW1vdmRxYQl4bW0yLFhNTVdPUkRbcmJ4XQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbMTYrcmJ4XQorCWxlYQlyYngsWzMyK3JieF0KKwltb3ZkcXUJeG1tNCxYTU1XT1JEW3JkaV0KKwltb3ZkcXUJeG1tNSxYTU1XT1JEWzE2K3JkaV0KKwlsZWEJcmRpLFszMityZGldCisJbW92ZHFhCVhNTVdPUkRbKC0zMikrcmJ4XSx4bW0wCisJbW92ZHFhCVhNTVdPUkRbKC0xNikrcmJ4XSx4bW0wCisJcGNtcGVxZAl4bW0wLHhtbTEKKwlwYW5kCXhtbTIseG1tMQorCXBhbmQJeG1tMyx4bW0xCisJcGFuZAl4bW00LHhtbTAKKwlwYW5kCXhtbTUseG1tMAorCXB4b3IJeG1tMCx4bW0wCisJcG9yCXhtbTQseG1tMgorCXBvcgl4bW01LHhtbTMKKwltb3ZkcXUJWE1NV09SRFsoLTMyKStyZGldLHhtbTQKKwltb3ZkcXUJWE1NV09SRFsoLTE2KStyZGldLHhtbTUKKwlzdWIJcmR4LDMyCisJam56CU5FQVIgJEwkbXVseDR4X2NvbmRfY29weQorCisJbW92CVFXT1JEW3JieF0scmR4CisKKwltb3YJcmF4LDEKKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcnNpXQorCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JzaV0KKworCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyc2ldCisKKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcnNpXQorCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JzaV0KKworCW1vdglyYngsUVdPUkRbKCgtOCkpK3JzaV0KKworCWxlYQlyc3AsW3JzaV0KKworJEwkbXVseDR4X2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2JuX211bHg0eF9tb250OgorREIJNzcsMTExLDExMCwxMTYsMTAzLDExMSwxMDksMTAxLDExNCwxMjEsMzIsNzcsMTE3LDEwOCwxMTYsMTA1CitEQgkxMTIsMTA4LDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTAyLDExMSwxMTQsMzIsMTIwLDU2CitEQgk1NCw5NSw1NCw1Miw0NCwzMiw2Nyw4Miw4OSw4MCw4NCw3OSw3MSw2NSw3Nyw4MworREIJMzIsOTgsMTIxLDMyLDYwLDk3LDExMiwxMTIsMTE0LDExMSw2NCwxMTEsMTEyLDEwMSwxMTAsMTE1CitEQgkxMTUsMTA4LDQ2LDExMSwxMTQsMTAzLDYyLDAKK0FMSUdOCTE2CitFWFRFUk4JX19pbXBfUnRsVmlydHVhbFVud2luZAorCitBTElHTgkxNgorbXVsX2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTIwK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbW92CXJzaSxRV09SRFs4K3I5XQorCW1vdglyMTEsUVdPUkRbNTYrcjldCisKKwltb3YJcjEwZCxEV09SRFtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyYXgsUVdPUkRbMTUyK3I4XQorCisJbW92CXIxMGQsRFdPUkRbNCtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamFlCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcjEwLFFXT1JEWzE5MityOF0KKwltb3YJcmF4LFFXT1JEWzgrcjEwKjgrcmF4XQorCisJam1wCU5FQVIgJEwkY29tbW9uX3BvcF9yZWdzCisKKworCitBTElHTgkxNgorc3FyX2hhbmRsZXI6CisJcHVzaAlyc2kKKwlwdXNoCXJkaQorCXB1c2gJcmJ4CisJcHVzaAlyYnAKKwlwdXNoCXIxMgorCXB1c2gJcjEzCisJcHVzaAlyMTQKKwlwdXNoCXIxNQorCXB1c2hmcQorCXN1Yglyc3AsNjQKKworCW1vdglyYXgsUVdPUkRbMTIwK3I4XQorCW1vdglyYngsUVdPUkRbMjQ4K3I4XQorCisJbW92CXJzaSxRV09SRFs4K3I5XQorCW1vdglyMTEsUVdPUkRbNTYrcjldCisKKwltb3YJcjEwZCxEV09SRFtyMTFdCisJbGVhCXIxMCxbcjEwKjErcnNpXQorCWNtcAlyYngscjEwCisJamIJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCW1vdglyMTBkLERXT1JEWzQrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkY29tbW9uX3BvcF9yZWdzCisKKwltb3YJcmF4LFFXT1JEWzE1MityOF0KKworCW1vdglyMTBkLERXT1JEWzgrcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWphZQlORUFSICRMJGNvbW1vbl9zZWhfdGFpbAorCisJbW92CXJheCxRV09SRFs0MCtyYXhdCisKKyRMJGNvbW1vbl9wb3BfcmVnczoKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYXhdCisJbW92CXJicCxRV09SRFsoKC0xNikpK3JheF0KKwltb3YJcjEyLFFXT1JEWygoLTI0KSkrcmF4XQorCW1vdglyMTMsUVdPUkRbKCgtMzIpKStyYXhdCisJbW92CXIxNCxRV09SRFsoKC00MCkpK3JheF0KKwltb3YJcjE1LFFXT1JEWygoLTQ4KSkrcmF4XQorCW1vdglRV09SRFsxNDQrcjhdLHJieAorCW1vdglRV09SRFsxNjArcjhdLHJicAorCW1vdglRV09SRFsyMTYrcjhdLHIxMgorCW1vdglRV09SRFsyMjQrcjhdLHIxMworCW1vdglRV09SRFsyMzIrcjhdLHIxNAorCW1vdglRV09SRFsyNDArcjhdLHIxNQorCiskTCRjb21tb25fc2VoX3RhaWw6CisJbW92CXJkaSxRV09SRFs4K3JheF0KKwltb3YJcnNpLFFXT1JEWzE2K3JheF0KKwltb3YJUVdPUkRbMTUyK3I4XSxyYXgKKwltb3YJUVdPUkRbMTY4K3I4XSxyc2kKKwltb3YJUVdPUkRbMTc2K3I4XSxyZGkKKworCW1vdglyZGksUVdPUkRbNDArcjldCisJbW92CXJzaSxyOAorCW1vdgllY3gsMTU0CisJREQJMHhhNTQ4ZjNmYworCisJbW92CXJzaSxyOQorCXhvcglyY3gscmN4CisJbW92CXJkeCxRV09SRFs4K3JzaV0KKwltb3YJcjgsUVdPUkRbcnNpXQorCW1vdglyOSxRV09SRFsxNityc2ldCisJbW92CXIxMCxRV09SRFs0MCtyc2ldCisJbGVhCXIxMSxbNTYrcnNpXQorCWxlYQlyMTIsWzI0K3JzaV0KKwltb3YJUVdPUkRbMzIrcnNwXSxyMTAKKwltb3YJUVdPUkRbNDArcnNwXSxyMTEKKwltb3YJUVdPUkRbNDgrcnNwXSxyMTIKKwltb3YJUVdPUkRbNTYrcnNwXSxyY3gKKwljYWxsCVFXT1JEW19faW1wX1J0bFZpcnR1YWxVbndpbmRdCisKKwltb3YJZWF4LDEKKwlhZGQJcnNwLDY0CisJcG9wZnEKKwlwb3AJcjE1CisJcG9wCXIxNAorCXBvcAlyMTMKKwlwb3AJcjEyCisJcG9wCXJicAorCXBvcAlyYngKKwlwb3AJcmRpCisJcG9wCXJzaQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK3NlY3Rpb24JLnBkYXRhIHJkYXRhIGFsaWduPTQKK0FMSUdOCTQKKwlERAkkTCRTRUhfYmVnaW5fYm5fbXVsX21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9ibl9tdWxfbW9udCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19ibl9tdWxfbW9udCB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9ibl9tdWw0eF9tb250IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfYm5fbXVsNHhfbW9udCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19ibl9tdWw0eF9tb250IHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2JuX3Nxcjh4X21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9ibl9zcXI4eF9tb250IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2JuX3Nxcjh4X21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2JlZ2luX2JuX211bHg0eF9tb250IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfYm5fbXVseDR4X21vbnQgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2luZm9fYm5fbXVseDR4X21vbnQgd3J0IC4uaW1hZ2ViYXNlCitzZWN0aW9uCS54ZGF0YSByZGF0YSBhbGlnbj04CitBTElHTgk4CiskTCRTRUhfaW5mb19ibl9tdWxfbW9udDoKK0RCCTksMCwwLDAKKwlERAltdWxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRtdWxfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkbXVsX2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorJEwkU0VIX2luZm9fYm5fbXVsNHhfbW9udDoKK0RCCTksMCwwLDAKKwlERAltdWxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRtdWw0eF9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRtdWw0eF9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKKyRMJFNFSF9pbmZvX2JuX3Nxcjh4X21vbnQ6CitEQgk5LDAsMCwwCisJREQJc3FyX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkc3FyOHhfcHJvbG9ndWUgd3J0IC4uaW1hZ2ViYXNlLCRMJHNxcjh4X2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJHNxcjh4X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorQUxJR04JOAorJEwkU0VIX2luZm9fYm5fbXVseDR4X21vbnQ6CitEQgk5LDAsMCwwCisJREQJc3FyX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkbXVseDR4X3Byb2xvZ3VlIHdydCAuLmltYWdlYmFzZSwkTCRtdWx4NHhfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkbXVseDR4X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorQUxJR04JOApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3g4Nl82NC1tb250NS5hc20gYi9zcmMvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3dpbi14ODZfNjQvY3J5cHRvL2ZpcHNtb2R1bGUveDg2XzY0LW1vbnQ1LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTAyYTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC93aW4teDg2XzY0L2NyeXB0by9maXBzbW9kdWxlL3g4Nl82NC1tb250NS5hc20KQEAgLTAsMCArMSw0MDA4IEBACitkZWZhdWx0CXJlbAorJWRlZmluZSBYTU1XT1JECislZGVmaW5lIFlNTVdPUkQKKyVkZWZpbmUgWk1NV09SRAorc2VjdGlvbgkudGV4dCBjb2RlIGFsaWduPTY0CisKKworRVhURVJOCU9QRU5TU0xfaWEzMmNhcF9QCisKK2dsb2JhbAlibl9tdWxfbW9udF9nYXRoZXI1CisKK0FMSUdOCTY0Citibl9tdWxfbW9udF9nYXRoZXI1OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYm5fbXVsX21vbnRfZ2F0aGVyNToKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCW1vdglyOSxRV09SRFs0OCtyc3BdCisKKworCisJbW92CXI5ZCxyOWQKKwltb3YJcmF4LHJzcAorCisJdGVzdAlyOWQsNworCWpueglORUFSICRMJG11bF9lbnRlcgorCWxlYQlyMTEsW09QRU5TU0xfaWEzMmNhcF9QXQorCW1vdglyMTFkLERXT1JEWzgrcjExXQorCWptcAlORUFSICRMJG11bDR4X2VudGVyCisKK0FMSUdOCTE2CiskTCRtdWxfZW50ZXI6CisJbW92ZAl4bW01LERXT1JEWzU2K3JzcF0KKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKworCW5lZwlyOQorCW1vdglyMTEscnNwCisJbGVhCXIxMCxbKCgtMjgwKSkrcjkqOCtyc3BdCisJbmVnCXI5CisJYW5kCXIxMCwtMTAyNAorCisKKworCisKKworCisKKworCXN1YglyMTEscjEwCisJYW5kCXIxMSwtNDA5NgorCWxlYQlyc3AsW3IxMSoxK3IxMF0KKwltb3YJcjExLFFXT1JEW3JzcF0KKwljbXAJcnNwLHIxMAorCWphCU5FQVIgJEwkbXVsX3BhZ2Vfd2FsaworCWptcAlORUFSICRMJG11bF9wYWdlX3dhbGtfZG9uZQorCiskTCRtdWxfcGFnZV93YWxrOgorCWxlYQlyc3AsWygoLTQwOTYpKStyc3BdCisJbW92CXIxMSxRV09SRFtyc3BdCisJY21wCXJzcCxyMTAKKwlqYQlORUFSICRMJG11bF9wYWdlX3dhbGsKKyRMJG11bF9wYWdlX3dhbGtfZG9uZToKKworCWxlYQlyMTAsWyRMJGluY10KKwltb3YJUVdPUkRbOCtyOSo4K3JzcF0scmF4CisKKyRMJG11bF9ib2R5OgorCisJbGVhCXIxMixbMTI4K3JkeF0KKwltb3ZkcWEJeG1tMCxYTU1XT1JEW3IxMF0KKwltb3ZkcWEJeG1tMSxYTU1XT1JEWzE2K3IxMF0KKwlsZWEJcjEwLFsoKDI0LTExMikpK3I5KjgrcnNwXQorCWFuZAlyMTAsLTE2CisKKwlwc2h1ZmQJeG1tNSx4bW01LDAKKwltb3ZkcWEJeG1tNCx4bW0xCisJbW92ZHFhCXhtbTIseG1tMQorCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CitEQgkweDY3CisJbW92ZHFhCXhtbTMseG1tNAorCXBhZGRkCXhtbTIseG1tMQorCXBjbXBlcWQJeG1tMSx4bW01CisJbW92ZHFhCVhNTVdPUkRbMTEyK3IxMF0seG1tMAorCW1vdmRxYQl4bW0wLHhtbTQKKworCXBhZGRkCXhtbTMseG1tMgorCXBjbXBlcWQJeG1tMix4bW01CisJbW92ZHFhCVhNTVdPUkRbMTI4K3IxMF0seG1tMQorCW1vdmRxYQl4bW0xLHhtbTQKKworCXBhZGRkCXhtbTAseG1tMworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbMTQ0K3IxMF0seG1tMgorCW1vdmRxYQl4bW0yLHhtbTQKKworCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CisJbW92ZHFhCVhNTVdPUkRbMTYwK3IxMF0seG1tMworCW1vdmRxYQl4bW0zLHhtbTQKKwlwYWRkZAl4bW0yLHhtbTEKKwlwY21wZXFkCXhtbTEseG1tNQorCW1vdmRxYQlYTU1XT1JEWzE3NityMTBdLHhtbTAKKwltb3ZkcWEJeG1tMCx4bW00CisKKwlwYWRkZAl4bW0zLHhtbTIKKwlwY21wZXFkCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWzE5MityMTBdLHhtbTEKKwltb3ZkcWEJeG1tMSx4bW00CisKKwlwYWRkZAl4bW0wLHhtbTMKKwlwY21wZXFkCXhtbTMseG1tNQorCW1vdmRxYQlYTU1XT1JEWzIwOCtyMTBdLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisKKwlwYWRkZAl4bW0xLHhtbTAKKwlwY21wZXFkCXhtbTAseG1tNQorCW1vdmRxYQlYTU1XT1JEWzIyNCtyMTBdLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CisJcGFkZGQJeG1tMix4bW0xCisJcGNtcGVxZAl4bW0xLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyNDArcjEwXSx4bW0wCisJbW92ZHFhCXhtbTAseG1tNAorCisJcGFkZGQJeG1tMyx4bW0yCisJcGNtcGVxZAl4bW0yLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyNTYrcjEwXSx4bW0xCisJbW92ZHFhCXhtbTEseG1tNAorCisJcGFkZGQJeG1tMCx4bW0zCisJcGNtcGVxZAl4bW0zLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyNzIrcjEwXSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNAorCisJcGFkZGQJeG1tMSx4bW0wCisJcGNtcGVxZAl4bW0wLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyODgrcjEwXSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhZGRkCXhtbTIseG1tMQorCXBjbXBlcWQJeG1tMSx4bW01CisJbW92ZHFhCVhNTVdPUkRbMzA0K3IxMF0seG1tMAorCisJcGFkZGQJeG1tMyx4bW0yCitEQgkweDY3CisJcGNtcGVxZAl4bW0yLHhtbTUKKwltb3ZkcWEJWE1NV09SRFszMjArcjEwXSx4bW0xCisKKwlwY21wZXFkCXhtbTMseG1tNQorCW1vdmRxYQlYTU1XT1JEWzMzNityMTBdLHhtbTIKKwlwYW5kCXhtbTAsWE1NV09SRFs2NCtyMTJdCisKKwlwYW5kCXhtbTEsWE1NV09SRFs4MCtyMTJdCisJcGFuZAl4bW0yLFhNTVdPUkRbOTYrcjEyXQorCW1vdmRxYQlYTU1XT1JEWzM1MityMTBdLHhtbTMKKwlwYW5kCXhtbTMsWE1NV09SRFsxMTIrcjEyXQorCXBvcgl4bW0wLHhtbTIKKwlwb3IJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTQsWE1NV09SRFsoKC0xMjgpKStyMTJdCisJbW92ZHFhCXhtbTUsWE1NV09SRFsoKC0xMTIpKStyMTJdCisJbW92ZHFhCXhtbTIsWE1NV09SRFsoKC05NikpK3IxMl0KKwlwYW5kCXhtbTQsWE1NV09SRFsxMTIrcjEwXQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbKCgtODApKStyMTJdCisJcGFuZAl4bW01LFhNTVdPUkRbMTI4K3IxMF0KKwlwb3IJeG1tMCx4bW00CisJcGFuZAl4bW0yLFhNTVdPUkRbMTQ0K3IxMF0KKwlwb3IJeG1tMSx4bW01CisJcGFuZAl4bW0zLFhNTVdPUkRbMTYwK3IxMF0KKwlwb3IJeG1tMCx4bW0yCisJcG9yCXhtbTEseG1tMworCW1vdmRxYQl4bW00LFhNTVdPUkRbKCgtNjQpKStyMTJdCisJbW92ZHFhCXhtbTUsWE1NV09SRFsoKC00OCkpK3IxMl0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWygoLTMyKSkrcjEyXQorCXBhbmQJeG1tNCxYTU1XT1JEWzE3NityMTBdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsoKC0xNikpK3IxMl0KKwlwYW5kCXhtbTUsWE1NV09SRFsxOTIrcjEwXQorCXBvcgl4bW0wLHhtbTQKKwlwYW5kCXhtbTIsWE1NV09SRFsyMDgrcjEwXQorCXBvcgl4bW0xLHhtbTUKKwlwYW5kCXhtbTMsWE1NV09SRFsyMjQrcjEwXQorCXBvcgl4bW0wLHhtbTIKKwlwb3IJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTQsWE1NV09SRFtyMTJdCisJbW92ZHFhCXhtbTUsWE1NV09SRFsxNityMTJdCisJbW92ZHFhCXhtbTIsWE1NV09SRFszMityMTJdCisJcGFuZAl4bW00LFhNTVdPUkRbMjQwK3IxMF0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWzQ4K3IxMl0KKwlwYW5kCXhtbTUsWE1NV09SRFsyNTYrcjEwXQorCXBvcgl4bW0wLHhtbTQKKwlwYW5kCXhtbTIsWE1NV09SRFsyNzIrcjEwXQorCXBvcgl4bW0xLHhtbTUKKwlwYW5kCXhtbTMsWE1NV09SRFsyODgrcjEwXQorCXBvcgl4bW0wLHhtbTIKKwlwb3IJeG1tMSx4bW0zCisJcG9yCXhtbTAseG1tMQorCXBzaHVmZAl4bW0xLHhtbTAsMHg0ZQorCXBvcgl4bW0wLHhtbTEKKwlsZWEJcjEyLFsyNTYrcjEyXQorREIJMTAyLDcyLDE1LDEyNiwxOTUKKworCW1vdglyOCxRV09SRFtyOF0KKwltb3YJcmF4LFFXT1JEW3JzaV0KKworCXhvcglyMTQscjE0CisJeG9yCXIxNSxyMTUKKworCW1vdglyYnAscjgKKwltdWwJcmJ4CisJbW92CXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEW3JjeF0KKworCWltdWwJcmJwLHIxMAorCW1vdglyMTEscmR4CisKKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcnNpXQorCWFkYwlyZHgsMAorCW1vdglyMTMscmR4CisKKwlsZWEJcjE1LFsxK3IxNV0KKwlqbXAJTkVBUiAkTCQxc3RfZW50ZXIKKworQUxJR04JMTYKKyRMJDFzdDoKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbcjE1KjgrcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyMTMscjExCisJbW92CXIxMSxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTUqOCtyc3BdLHIxMworCW1vdglyMTMscmR4CisKKyRMJDFzdF9lbnRlcjoKKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LFFXT1JEW3IxNSo4K3JjeF0KKwlhZGMJcmR4LDAKKwlsZWEJcjE1LFsxK3IxNV0KKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWNtcAlyMTUscjkKKwlqbmUJTkVBUiAkTCQxc3QKKworCisJYWRkCXIxMyxyYXgKKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMQorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0xNikpK3I5KjgrcnNwXSxyMTMKKwltb3YJcjEzLHJkeAorCW1vdglyMTEscjEwCisKKwl4b3IJcmR4LHJkeAorCWFkZAlyMTMscjExCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTgpKStyOSo4K3JzcF0scjEzCisJbW92CVFXT1JEW3I5KjgrcnNwXSxyZHgKKworCWxlYQlyMTQsWzErcjE0XQorCWptcAlORUFSICRMJG91dGVyCitBTElHTgkxNgorJEwkb3V0ZXI6CisJbGVhCXJkeCxbKCgyNCsxMjgpKStyOSo4K3JzcF0KKwlhbmQJcmR4LC0xNgorCXB4b3IJeG1tNCx4bW00CisJcHhvcgl4bW01LHhtbTUKKwltb3ZkcWEJeG1tMCxYTU1XT1JEWygoLTEyOCkpK3IxMl0KKwltb3ZkcWEJeG1tMSxYTU1XT1JEWygoLTExMikpK3IxMl0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWygoLTk2KSkrcjEyXQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbKCgtODApKStyMTJdCisJcGFuZAl4bW0wLFhNTVdPUkRbKCgtMTI4KSkrcmR4XQorCXBhbmQJeG1tMSxYTU1XT1JEWygoLTExMikpK3JkeF0KKwlwb3IJeG1tNCx4bW0wCisJcGFuZAl4bW0yLFhNTVdPUkRbKCgtOTYpKStyZHhdCisJcG9yCXhtbTUseG1tMQorCXBhbmQJeG1tMyxYTU1XT1JEWygoLTgwKSkrcmR4XQorCXBvcgl4bW00LHhtbTIKKwlwb3IJeG1tNSx4bW0zCisJbW92ZHFhCXhtbTAsWE1NV09SRFsoKC02NCkpK3IxMl0KKwltb3ZkcWEJeG1tMSxYTU1XT1JEWygoLTQ4KSkrcjEyXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbKCgtMzIpKStyMTJdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsoKC0xNikpK3IxMl0KKwlwYW5kCXhtbTAsWE1NV09SRFsoKC02NCkpK3JkeF0KKwlwYW5kCXhtbTEsWE1NV09SRFsoKC00OCkpK3JkeF0KKwlwb3IJeG1tNCx4bW0wCisJcGFuZAl4bW0yLFhNTVdPUkRbKCgtMzIpKStyZHhdCisJcG9yCXhtbTUseG1tMQorCXBhbmQJeG1tMyxYTU1XT1JEWygoLTE2KSkrcmR4XQorCXBvcgl4bW00LHhtbTIKKwlwb3IJeG1tNSx4bW0zCisJbW92ZHFhCXhtbTAsWE1NV09SRFtyMTJdCisJbW92ZHFhCXhtbTEsWE1NV09SRFsxNityMTJdCisJbW92ZHFhCXhtbTIsWE1NV09SRFszMityMTJdCisJbW92ZHFhCXhtbTMsWE1NV09SRFs0OCtyMTJdCisJcGFuZAl4bW0wLFhNTVdPUkRbcmR4XQorCXBhbmQJeG1tMSxYTU1XT1JEWzE2K3JkeF0KKwlwb3IJeG1tNCx4bW0wCisJcGFuZAl4bW0yLFhNTVdPUkRbMzIrcmR4XQorCXBvcgl4bW01LHhtbTEKKwlwYW5kCXhtbTMsWE1NV09SRFs0OCtyZHhdCisJcG9yCXhtbTQseG1tMgorCXBvcgl4bW01LHhtbTMKKwltb3ZkcWEJeG1tMCxYTU1XT1JEWzY0K3IxMl0KKwltb3ZkcWEJeG1tMSxYTU1XT1JEWzgwK3IxMl0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWzk2K3IxMl0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWzExMityMTJdCisJcGFuZAl4bW0wLFhNTVdPUkRbNjQrcmR4XQorCXBhbmQJeG1tMSxYTU1XT1JEWzgwK3JkeF0KKwlwb3IJeG1tNCx4bW0wCisJcGFuZAl4bW0yLFhNTVdPUkRbOTYrcmR4XQorCXBvcgl4bW01LHhtbTEKKwlwYW5kCXhtbTMsWE1NV09SRFsxMTIrcmR4XQorCXBvcgl4bW00LHhtbTIKKwlwb3IJeG1tNSx4bW0zCisJcG9yCXhtbTQseG1tNQorCXBzaHVmZAl4bW0wLHhtbTQsMHg0ZQorCXBvcgl4bW0wLHhtbTQKKwlsZWEJcjEyLFsyNTYrcjEyXQorCisJbW92CXJheCxRV09SRFtyc2ldCitEQgkxMDIsNzIsMTUsMTI2LDE5NQorCisJeG9yCXIxNSxyMTUKKwltb3YJcmJwLHI4CisJbW92CXIxMCxRV09SRFtyc3BdCisKKwltdWwJcmJ4CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEW3JjeF0KKwlhZGMJcmR4LDAKKworCWltdWwJcmJwLHIxMAorCW1vdglyMTEscmR4CisKKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcnNpXQorCWFkYwlyZHgsMAorCW1vdglyMTAsUVdPUkRbOCtyc3BdCisJbW92CXIxMyxyZHgKKworCWxlYQlyMTUsWzErcjE1XQorCWptcAlORUFSICRMJGlubmVyX2VudGVyCisKK0FMSUdOCTE2CiskTCRpbm5lcjoKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbcjE1KjgrcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyMTMscjEwCisJbW92CXIxMCxRV09SRFtyMTUqOCtyc3BdCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTE2KSkrcjE1KjgrcnNwXSxyMTMKKwltb3YJcjEzLHJkeAorCiskTCRpbm5lcl9lbnRlcjoKKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LFFXT1JEW3IxNSo4K3JjeF0KKwlhZGMJcmR4LDAKKwlhZGQJcjEwLHIxMQorCW1vdglyMTEscmR4CisJYWRjCXIxMSwwCisJbGVhCXIxNSxbMStyMTVdCisKKwltdWwJcmJwCisJY21wCXIxNSxyOQorCWpuZQlORUFSICRMJGlubmVyCisKKwlhZGQJcjEzLHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTMscjEwCisJbW92CXIxMCxRV09SRFtyOSo4K3JzcF0KKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyOSo4K3JzcF0scjEzCisJbW92CXIxMyxyZHgKKworCXhvcglyZHgscmR4CisJYWRkCXIxMyxyMTEKKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC04KSkrcjkqOCtyc3BdLHIxMworCW1vdglRV09SRFtyOSo4K3JzcF0scmR4CisKKwlsZWEJcjE0LFsxK3IxNF0KKwljbXAJcjE0LHI5CisJamIJTkVBUiAkTCRvdXRlcgorCisJeG9yCXIxNCxyMTQKKwltb3YJcmF4LFFXT1JEW3JzcF0KKwlsZWEJcnNpLFtyc3BdCisJbW92CXIxNSxyOQorCWptcAlORUFSICRMJHN1YgorQUxJR04JMTYKKyRMJHN1YjoJc2JiCXJheCxRV09SRFtyMTQqOCtyY3hdCisJbW92CVFXT1JEW3IxNCo4K3JkaV0scmF4CisJbW92CXJheCxRV09SRFs4K3IxNCo4K3JzaV0KKwlsZWEJcjE0LFsxK3IxNF0KKwlkZWMJcjE1CisJam56CU5FQVIgJEwkc3ViCisKKwlzYmIJcmF4LDAKKwltb3YJcmJ4LC0xCisJeG9yCXJieCxyYXgKKwl4b3IJcjE0LHIxNAorCW1vdglyMTUscjkKKworJEwkY29weToKKwltb3YJcmN4LFFXT1JEW3IxNCo4K3JkaV0KKwltb3YJcmR4LFFXT1JEW3IxNCo4K3JzcF0KKwlhbmQJcmN4LHJieAorCWFuZAlyZHgscmF4CisJbW92CVFXT1JEW3IxNCo4K3JzcF0scjE0CisJb3IJcmR4LHJjeAorCW1vdglRV09SRFtyMTQqOCtyZGldLHJkeAorCWxlYQlyMTQsWzErcjE0XQorCXN1YglyMTUsMQorCWpueglORUFSICRMJGNvcHkKKworCW1vdglyc2ksUVdPUkRbOCtyOSo4K3JzcF0KKworCW1vdglyYXgsMQorCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJG11bF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9ibl9tdWxfbW9udF9nYXRoZXI1OgorCitBTElHTgkzMgorYm5fbXVsNHhfbW9udF9nYXRoZXI1OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYm5fbXVsNHhfbW9udF9nYXRoZXI1OgorCW1vdglyZGkscmN4CisJbW92CXJzaSxyZHgKKwltb3YJcmR4LHI4CisJbW92CXJjeCxyOQorCW1vdglyOCxRV09SRFs0MCtyc3BdCisJbW92CXI5LFFXT1JEWzQ4K3JzcF0KKworCisKK0RCCTB4NjcKKwltb3YJcmF4LHJzcAorCiskTCRtdWw0eF9lbnRlcjoKKwlhbmQJcjExZCwweDgwMTA4CisJY21wCXIxMWQsMHg4MDEwOAorCWplCU5FQVIgJEwkbXVseDR4X2VudGVyCisJcHVzaAlyYngKKworCXB1c2gJcmJwCisKKwlwdXNoCXIxMgorCisJcHVzaAlyMTMKKworCXB1c2gJcjE0CisKKwlwdXNoCXIxNQorCiskTCRtdWw0eF9wcm9sb2d1ZToKKworREIJMHg2NworCXNobAlyOWQsMworCWxlYQlyMTAsW3I5KjIrcjldCisJbmVnCXI5CisKKworCisKKworCisKKworCisKKwlsZWEJcjExLFsoKC0zMjApKStyOSoyK3JzcF0KKwltb3YJcmJwLHJzcAorCXN1YglyMTEscmRpCisJYW5kCXIxMSw0MDk1CisJY21wCXIxMCxyMTEKKwlqYglORUFSICRMJG11bDR4c3BfYWx0CisJc3ViCXJicCxyMTEKKwlsZWEJcmJwLFsoKC0zMjApKStyOSoyK3JicF0KKwlqbXAJTkVBUiAkTCRtdWw0eHNwX2RvbmUKKworQUxJR04JMzIKKyRMJG11bDR4c3BfYWx0OgorCWxlYQlyMTAsWygoNDA5Ni0zMjApKStyOSoyXQorCWxlYQlyYnAsWygoLTMyMCkpK3I5KjIrcmJwXQorCXN1YglyMTEscjEwCisJbW92CXIxMCwwCisJY21vdmMJcjExLHIxMAorCXN1YglyYnAscjExCiskTCRtdWw0eHNwX2RvbmU6CisJYW5kCXJicCwtNjQKKwltb3YJcjExLHJzcAorCXN1YglyMTEscmJwCisJYW5kCXIxMSwtNDA5NgorCWxlYQlyc3AsW3JicCoxK3IxMV0KKwltb3YJcjEwLFFXT1JEW3JzcF0KKwljbXAJcnNwLHJicAorCWphCU5FQVIgJEwkbXVsNHhfcGFnZV93YWxrCisJam1wCU5FQVIgJEwkbXVsNHhfcGFnZV93YWxrX2RvbmUKKworJEwkbXVsNHhfcGFnZV93YWxrOgorCWxlYQlyc3AsWygoLTQwOTYpKStyc3BdCisJbW92CXIxMCxRV09SRFtyc3BdCisJY21wCXJzcCxyYnAKKwlqYQlORUFSICRMJG11bDR4X3BhZ2Vfd2FsaworJEwkbXVsNHhfcGFnZV93YWxrX2RvbmU6CisKKwluZWcJcjkKKworCW1vdglRV09SRFs0MCtyc3BdLHJheAorCiskTCRtdWw0eF9ib2R5OgorCisJY2FsbAltdWw0eF9pbnRlcm5hbAorCisJbW92CXJzaSxRV09SRFs0MCtyc3BdCisKKwltb3YJcmF4LDEKKworCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRtdWw0eF9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9ibl9tdWw0eF9tb250X2dhdGhlcjU6CisKKworQUxJR04JMzIKK211bDR4X2ludGVybmFsOgorCXNobAlyOSw1CisJbW92ZAl4bW01LERXT1JEWzU2K3JheF0KKwlsZWEJcmF4LFskTCRpbmNdCisJbGVhCXIxMyxbMTI4K3I5KjErcmR4XQorCXNocglyOSw1CisJbW92ZHFhCXhtbTAsWE1NV09SRFtyYXhdCisJbW92ZHFhCXhtbTEsWE1NV09SRFsxNityYXhdCisJbGVhCXIxMCxbKCg4OC0xMTIpKStyOSoxK3JzcF0KKwlsZWEJcjEyLFsxMjgrcmR4XQorCisJcHNodWZkCXhtbTUseG1tNSwwCisJbW92ZHFhCXhtbTQseG1tMQorREIJMHg2NywweDY3CisJbW92ZHFhCXhtbTIseG1tMQorCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CitEQgkweDY3CisJbW92ZHFhCXhtbTMseG1tNAorCXBhZGRkCXhtbTIseG1tMQorCXBjbXBlcWQJeG1tMSx4bW01CisJbW92ZHFhCVhNTVdPUkRbMTEyK3IxMF0seG1tMAorCW1vdmRxYQl4bW0wLHhtbTQKKworCXBhZGRkCXhtbTMseG1tMgorCXBjbXBlcWQJeG1tMix4bW01CisJbW92ZHFhCVhNTVdPUkRbMTI4K3IxMF0seG1tMQorCW1vdmRxYQl4bW0xLHhtbTQKKworCXBhZGRkCXhtbTAseG1tMworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbMTQ0K3IxMF0seG1tMgorCW1vdmRxYQl4bW0yLHhtbTQKKworCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CisJbW92ZHFhCVhNTVdPUkRbMTYwK3IxMF0seG1tMworCW1vdmRxYQl4bW0zLHhtbTQKKwlwYWRkZAl4bW0yLHhtbTEKKwlwY21wZXFkCXhtbTEseG1tNQorCW1vdmRxYQlYTU1XT1JEWzE3NityMTBdLHhtbTAKKwltb3ZkcWEJeG1tMCx4bW00CisKKwlwYWRkZAl4bW0zLHhtbTIKKwlwY21wZXFkCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWzE5MityMTBdLHhtbTEKKwltb3ZkcWEJeG1tMSx4bW00CisKKwlwYWRkZAl4bW0wLHhtbTMKKwlwY21wZXFkCXhtbTMseG1tNQorCW1vdmRxYQlYTU1XT1JEWzIwOCtyMTBdLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisKKwlwYWRkZAl4bW0xLHhtbTAKKwlwY21wZXFkCXhtbTAseG1tNQorCW1vdmRxYQlYTU1XT1JEWzIyNCtyMTBdLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CisJcGFkZGQJeG1tMix4bW0xCisJcGNtcGVxZAl4bW0xLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyNDArcjEwXSx4bW0wCisJbW92ZHFhCXhtbTAseG1tNAorCisJcGFkZGQJeG1tMyx4bW0yCisJcGNtcGVxZAl4bW0yLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyNTYrcjEwXSx4bW0xCisJbW92ZHFhCXhtbTEseG1tNAorCisJcGFkZGQJeG1tMCx4bW0zCisJcGNtcGVxZAl4bW0zLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyNzIrcjEwXSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNAorCisJcGFkZGQJeG1tMSx4bW0wCisJcGNtcGVxZAl4bW0wLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsyODgrcjEwXSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhZGRkCXhtbTIseG1tMQorCXBjbXBlcWQJeG1tMSx4bW01CisJbW92ZHFhCVhNTVdPUkRbMzA0K3IxMF0seG1tMAorCisJcGFkZGQJeG1tMyx4bW0yCitEQgkweDY3CisJcGNtcGVxZAl4bW0yLHhtbTUKKwltb3ZkcWEJWE1NV09SRFszMjArcjEwXSx4bW0xCisKKwlwY21wZXFkCXhtbTMseG1tNQorCW1vdmRxYQlYTU1XT1JEWzMzNityMTBdLHhtbTIKKwlwYW5kCXhtbTAsWE1NV09SRFs2NCtyMTJdCisKKwlwYW5kCXhtbTEsWE1NV09SRFs4MCtyMTJdCisJcGFuZAl4bW0yLFhNTVdPUkRbOTYrcjEyXQorCW1vdmRxYQlYTU1XT1JEWzM1MityMTBdLHhtbTMKKwlwYW5kCXhtbTMsWE1NV09SRFsxMTIrcjEyXQorCXBvcgl4bW0wLHhtbTIKKwlwb3IJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTQsWE1NV09SRFsoKC0xMjgpKStyMTJdCisJbW92ZHFhCXhtbTUsWE1NV09SRFsoKC0xMTIpKStyMTJdCisJbW92ZHFhCXhtbTIsWE1NV09SRFsoKC05NikpK3IxMl0KKwlwYW5kCXhtbTQsWE1NV09SRFsxMTIrcjEwXQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbKCgtODApKStyMTJdCisJcGFuZAl4bW01LFhNTVdPUkRbMTI4K3IxMF0KKwlwb3IJeG1tMCx4bW00CisJcGFuZAl4bW0yLFhNTVdPUkRbMTQ0K3IxMF0KKwlwb3IJeG1tMSx4bW01CisJcGFuZAl4bW0zLFhNTVdPUkRbMTYwK3IxMF0KKwlwb3IJeG1tMCx4bW0yCisJcG9yCXhtbTEseG1tMworCW1vdmRxYQl4bW00LFhNTVdPUkRbKCgtNjQpKStyMTJdCisJbW92ZHFhCXhtbTUsWE1NV09SRFsoKC00OCkpK3IxMl0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWygoLTMyKSkrcjEyXQorCXBhbmQJeG1tNCxYTU1XT1JEWzE3NityMTBdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsoKC0xNikpK3IxMl0KKwlwYW5kCXhtbTUsWE1NV09SRFsxOTIrcjEwXQorCXBvcgl4bW0wLHhtbTQKKwlwYW5kCXhtbTIsWE1NV09SRFsyMDgrcjEwXQorCXBvcgl4bW0xLHhtbTUKKwlwYW5kCXhtbTMsWE1NV09SRFsyMjQrcjEwXQorCXBvcgl4bW0wLHhtbTIKKwlwb3IJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTQsWE1NV09SRFtyMTJdCisJbW92ZHFhCXhtbTUsWE1NV09SRFsxNityMTJdCisJbW92ZHFhCXhtbTIsWE1NV09SRFszMityMTJdCisJcGFuZAl4bW00LFhNTVdPUkRbMjQwK3IxMF0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWzQ4K3IxMl0KKwlwYW5kCXhtbTUsWE1NV09SRFsyNTYrcjEwXQorCXBvcgl4bW0wLHhtbTQKKwlwYW5kCXhtbTIsWE1NV09SRFsyNzIrcjEwXQorCXBvcgl4bW0xLHhtbTUKKwlwYW5kCXhtbTMsWE1NV09SRFsyODgrcjEwXQorCXBvcgl4bW0wLHhtbTIKKwlwb3IJeG1tMSx4bW0zCisJcG9yCXhtbTAseG1tMQorCXBzaHVmZAl4bW0xLHhtbTAsMHg0ZQorCXBvcgl4bW0wLHhtbTEKKwlsZWEJcjEyLFsyNTYrcjEyXQorREIJMTAyLDcyLDE1LDEyNiwxOTUKKworCW1vdglRV09SRFsoKDE2KzgpKStyc3BdLHIxMworCW1vdglRV09SRFsoKDU2KzgpKStyc3BdLHJkaQorCisJbW92CXI4LFFXT1JEW3I4XQorCW1vdglyYXgsUVdPUkRbcnNpXQorCWxlYQlyc2ksW3I5KjErcnNpXQorCW5lZwlyOQorCisJbW92CXJicCxyOAorCW11bAlyYngKKwltb3YJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbcmN4XQorCisJaW11bAlyYnAscjEwCisJbGVhCXIxNCxbKCg2NCs4KSkrcnNwXQorCW1vdglyMTEscmR4CisKKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcjkqMStyc2ldCisJYWRjCXJkeCwwCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbOCtyY3hdCisJYWRjCXJkeCwwCisJbW92CXIxMCxyZHgKKworCW11bAlyYnAKKwlhZGQJcmRpLHJheAorCW1vdglyYXgsUVdPUkRbMTYrcjkqMStyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlsZWEJcjE1LFszMityOV0KKwlsZWEJcmN4LFszMityY3hdCisJYWRjCXJkeCwwCisJbW92CVFXT1JEW3IxNF0scmRpCisJbW92CXIxMyxyZHgKKwlqbXAJTkVBUiAkTCQxc3Q0eAorCitBTElHTgkzMgorJEwkMXN0NHg6CisJbXVsCXJieAorCWFkZAlyMTAscmF4CisJbW92CXJheCxRV09SRFsoKC0xNikpK3JjeF0KKwlsZWEJcjE0LFszMityMTRdCisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3IxNSoxK3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0yNCkpK3IxNF0scjEzCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3JjeF0KKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFtyMTUqMStyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTRdLHJkaQorCW1vdglyMTMscmR4CisKKwltdWwJcmJ4CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEW3JjeF0KKwlhZGMJcmR4LDAKKwltb3YJcjExLHJkeAorCisJbXVsCXJicAorCWFkZAlyMTMscmF4CisJbW92CXJheCxRV09SRFs4K3IxNSoxK3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC04KSkrcjE0XSxyMTMKKwltb3YJcmRpLHJkeAorCisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJbW92CXJheCxRV09SRFs4K3JjeF0KKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFsxNityMTUqMStyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlsZWEJcmN4LFszMityY3hdCisJYWRjCXJkeCwwCisJbW92CVFXT1JEW3IxNF0scmRpCisJbW92CXIxMyxyZHgKKworCWFkZAlyMTUsMzIKKwlqbnoJTkVBUiAkTCQxc3Q0eAorCisJbXVsCXJieAorCWFkZAlyMTAscmF4CisJbW92CXJheCxRV09SRFsoKC0xNikpK3JjeF0KKwlsZWEJcjE0LFszMityMTRdCisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0yNCkpK3IxNF0scjEzCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3JjeF0KKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFtyOSoxK3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcmRpLHIxMQorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0xNikpK3IxNF0scmRpCisJbW92CXIxMyxyZHgKKworCWxlYQlyY3gsW3I5KjErcmN4XQorCisJeG9yCXJkaSxyZGkKKwlhZGQJcjEzLHIxMAorCWFkYwlyZGksMAorCW1vdglRV09SRFsoKC04KSkrcjE0XSxyMTMKKworCWptcAlORUFSICRMJG91dGVyNHgKKworQUxJR04JMzIKKyRMJG91dGVyNHg6CisJbGVhCXJkeCxbKCgxNisxMjgpKStyMTRdCisJcHhvcgl4bW00LHhtbTQKKwlweG9yCXhtbTUseG1tNQorCW1vdmRxYQl4bW0wLFhNTVdPUkRbKCgtMTI4KSkrcjEyXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbKCgtMTEyKSkrcjEyXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbKCgtOTYpKStyMTJdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsoKC04MCkpK3IxMl0KKwlwYW5kCXhtbTAsWE1NV09SRFsoKC0xMjgpKStyZHhdCisJcGFuZAl4bW0xLFhNTVdPUkRbKCgtMTEyKSkrcmR4XQorCXBvcgl4bW00LHhtbTAKKwlwYW5kCXhtbTIsWE1NV09SRFsoKC05NikpK3JkeF0KKwlwb3IJeG1tNSx4bW0xCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgtODApKStyZHhdCisJcG9yCXhtbTQseG1tMgorCXBvcgl4bW01LHhtbTMKKwltb3ZkcWEJeG1tMCxYTU1XT1JEWygoLTY0KSkrcjEyXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbKCgtNDgpKStyMTJdCisJbW92ZHFhCXhtbTIsWE1NV09SRFsoKC0zMikpK3IxMl0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWygoLTE2KSkrcjEyXQorCXBhbmQJeG1tMCxYTU1XT1JEWygoLTY0KSkrcmR4XQorCXBhbmQJeG1tMSxYTU1XT1JEWygoLTQ4KSkrcmR4XQorCXBvcgl4bW00LHhtbTAKKwlwYW5kCXhtbTIsWE1NV09SRFsoKC0zMikpK3JkeF0KKwlwb3IJeG1tNSx4bW0xCisJcGFuZAl4bW0zLFhNTVdPUkRbKCgtMTYpKStyZHhdCisJcG9yCXhtbTQseG1tMgorCXBvcgl4bW01LHhtbTMKKwltb3ZkcWEJeG1tMCxYTU1XT1JEW3IxMl0KKwltb3ZkcWEJeG1tMSxYTU1XT1JEWzE2K3IxMl0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWzMyK3IxMl0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWzQ4K3IxMl0KKwlwYW5kCXhtbTAsWE1NV09SRFtyZHhdCisJcGFuZAl4bW0xLFhNTVdPUkRbMTYrcmR4XQorCXBvcgl4bW00LHhtbTAKKwlwYW5kCXhtbTIsWE1NV09SRFszMityZHhdCisJcG9yCXhtbTUseG1tMQorCXBhbmQJeG1tMyxYTU1XT1JEWzQ4K3JkeF0KKwlwb3IJeG1tNCx4bW0yCisJcG9yCXhtbTUseG1tMworCW1vdmRxYQl4bW0wLFhNTVdPUkRbNjQrcjEyXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbODArcjEyXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbOTYrcjEyXQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbMTEyK3IxMl0KKwlwYW5kCXhtbTAsWE1NV09SRFs2NCtyZHhdCisJcGFuZAl4bW0xLFhNTVdPUkRbODArcmR4XQorCXBvcgl4bW00LHhtbTAKKwlwYW5kCXhtbTIsWE1NV09SRFs5NityZHhdCisJcG9yCXhtbTUseG1tMQorCXBhbmQJeG1tMyxYTU1XT1JEWzExMityZHhdCisJcG9yCXhtbTQseG1tMgorCXBvcgl4bW01LHhtbTMKKwlwb3IJeG1tNCx4bW01CisJcHNodWZkCXhtbTAseG1tNCwweDRlCisJcG9yCXhtbTAseG1tNAorCWxlYQlyMTIsWzI1NityMTJdCitEQgkxMDIsNzIsMTUsMTI2LDE5NQorCisJbW92CXIxMCxRV09SRFtyOSoxK3IxNF0KKwltb3YJcmJwLHI4CisJbXVsCXJieAorCWFkZAlyMTAscmF4CisJbW92CXJheCxRV09SRFtyY3hdCisJYWRjCXJkeCwwCisKKwlpbXVsCXJicCxyMTAKKwltb3YJcjExLHJkeAorCW1vdglRV09SRFtyMTRdLHJkaQorCisJbGVhCXIxNCxbcjkqMStyMTRdCisKKwltdWwJcmJwCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcjkqMStyc2ldCisJYWRjCXJkeCwwCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbOCtyY3hdCisJYWRjCXJkeCwwCisJYWRkCXIxMSxRV09SRFs4K3IxNF0KKwlhZGMJcmR4LDAKKwltb3YJcjEwLHJkeAorCisJbXVsCXJicAorCWFkZAlyZGkscmF4CisJbW92CXJheCxRV09SRFsxNityOSoxK3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcmRpLHIxMQorCWxlYQlyMTUsWzMyK3I5XQorCWxlYQlyY3gsWzMyK3JjeF0KKwlhZGMJcmR4LDAKKwltb3YJcjEzLHJkeAorCWptcAlORUFSICRMJGlubmVyNHgKKworQUxJR04JMzIKKyRMJGlubmVyNHg6CisJbXVsCXJieAorCWFkZAlyMTAscmF4CisJbW92CXJheCxRV09SRFsoKC0xNikpK3JjeF0KKwlhZGMJcmR4LDAKKwlhZGQJcjEwLFFXT1JEWzE2K3IxNF0KKwlsZWEJcjE0LFszMityMTRdCisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3IxNSoxK3JzaV0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0zMikpK3IxNF0scmRpCisJbW92CXJkaSxyZHgKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3JjeF0KKwlhZGMJcmR4LDAKKwlhZGQJcjExLFFXT1JEWygoLTgpKStyMTRdCisJYWRjCXJkeCwwCisJbW92CXIxMCxyZHgKKworCW11bAlyYnAKKwlhZGQJcmRpLHJheAorCW1vdglyYXgsUVdPUkRbcjE1KjErcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyZGkscjExCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTI0KSkrcjE0XSxyMTMKKwltb3YJcjEzLHJkeAorCisJbXVsCXJieAorCWFkZAlyMTAscmF4CisJbW92CXJheCxRV09SRFtyY3hdCisJYWRjCXJkeCwwCisJYWRkCXIxMCxRV09SRFtyMTRdCisJYWRjCXJkeCwwCisJbW92CXIxMSxyZHgKKworCW11bAlyYnAKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbOCtyMTUqMStyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMTYpKStyMTRdLHJkaQorCW1vdglyZGkscmR4CisKKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LFFXT1JEWzgrcmN4XQorCWFkYwlyZHgsMAorCWFkZAlyMTEsUVdPUkRbOCtyMTRdCisJYWRjCXJkeCwwCisJbW92CXIxMCxyZHgKKworCW11bAlyYnAKKwlhZGQJcmRpLHJheAorCW1vdglyYXgsUVdPUkRbMTYrcjE1KjErcnNpXQorCWFkYwlyZHgsMAorCWFkZAlyZGkscjExCisJbGVhCXJjeCxbMzIrcmN4XQorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC04KSkrcjE0XSxyMTMKKwltb3YJcjEzLHJkeAorCisJYWRkCXIxNSwzMgorCWpueglORUFSICRMJGlubmVyNHgKKworCW11bAlyYngKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbKCgtMTYpKStyY3hdCisJYWRjCXJkeCwwCisJYWRkCXIxMCxRV09SRFsxNityMTRdCisJbGVhCXIxNCxbMzIrcjE0XQorCWFkYwlyZHgsMAorCW1vdglyMTEscmR4CisKKwltdWwJcmJwCisJYWRkCXIxMyxyYXgKKwltb3YJcmF4LFFXT1JEWygoLTgpKStyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTAKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMzIpKStyMTRdLHJkaQorCW1vdglyZGkscmR4CisKKwltdWwJcmJ4CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LHJicAorCW1vdglyYnAsUVdPUkRbKCgtOCkpK3JjeF0KKwlhZGMJcmR4LDAKKwlhZGQJcjExLFFXT1JEWygoLTgpKStyMTRdCisJYWRjCXJkeCwwCisJbW92CXIxMCxyZHgKKworCW11bAlyYnAKKwlhZGQJcmRpLHJheAorCW1vdglyYXgsUVdPUkRbcjkqMStyc2ldCisJYWRjCXJkeCwwCisJYWRkCXJkaSxyMTEKKwlhZGMJcmR4LDAKKwltb3YJUVdPUkRbKCgtMjQpKStyMTRdLHIxMworCW1vdglyMTMscmR4CisKKwltb3YJUVdPUkRbKCgtMTYpKStyMTRdLHJkaQorCWxlYQlyY3gsW3I5KjErcmN4XQorCisJeG9yCXJkaSxyZGkKKwlhZGQJcjEzLHIxMAorCWFkYwlyZGksMAorCWFkZAlyMTMsUVdPUkRbcjE0XQorCWFkYwlyZGksMAorCW1vdglRV09SRFsoKC04KSkrcjE0XSxyMTMKKworCWNtcAlyMTIsUVdPUkRbKCgxNis4KSkrcnNwXQorCWpiCU5FQVIgJEwkb3V0ZXI0eAorCXhvcglyYXgscmF4CisJc3ViCXJicCxyMTMKKwlhZGMJcjE1LHIxNQorCW9yCXJkaSxyMTUKKwlzdWIJcmF4LHJkaQorCWxlYQlyYngsW3I5KjErcjE0XQorCW1vdglyMTIsUVdPUkRbcmN4XQorCWxlYQlyYnAsW3JjeF0KKwltb3YJcmN4LHI5CisJc2FyCXJjeCwzKzIKKwltb3YJcmRpLFFXT1JEWygoNTYrOCkpK3JzcF0KKwlkZWMJcjEyCisJeG9yCXIxMCxyMTAKKwltb3YJcjEzLFFXT1JEWzgrcmJwXQorCW1vdglyMTQsUVdPUkRbMTYrcmJwXQorCW1vdglyMTUsUVdPUkRbMjQrcmJwXQorCWptcAlORUFSICRMJHNxcjR4X3N1Yl9lbnRyeQorCitnbG9iYWwJYm5fcG93ZXI1CisKK0FMSUdOCTMyCitibl9wb3dlcjU6CisJbW92CVFXT1JEWzgrcnNwXSxyZGkJO1dJTjY0IHByb2xvZ3VlCisJbW92CVFXT1JEWzE2K3JzcF0scnNpCisJbW92CXJheCxyc3AKKyRMJFNFSF9iZWdpbl9ibl9wb3dlcjU6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKwltb3YJcjksUVdPUkRbNDgrcnNwXQorCisKKworCW1vdglyYXgscnNwCisKKwlsZWEJcjExLFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJcjExZCxEV09SRFs4K3IxMV0KKwlhbmQJcjExZCwweDgwMTA4CisJY21wCXIxMWQsMHg4MDEwOAorCWplCU5FQVIgJEwkcG93ZXJ4NV9lbnRlcgorCXB1c2gJcmJ4CisKKwlwdXNoCXJicAorCisJcHVzaAlyMTIKKworCXB1c2gJcjEzCisKKwlwdXNoCXIxNAorCisJcHVzaAlyMTUKKworJEwkcG93ZXI1X3Byb2xvZ3VlOgorCisJc2hsCXI5ZCwzCisJbGVhCXIxMGQsW3I5KjIrcjldCisJbmVnCXI5CisJbW92CXI4LFFXT1JEW3I4XQorCisKKworCisKKworCisKKwlsZWEJcjExLFsoKC0zMjApKStyOSoyK3JzcF0KKwltb3YJcmJwLHJzcAorCXN1YglyMTEscmRpCisJYW5kCXIxMSw0MDk1CisJY21wCXIxMCxyMTEKKwlqYglORUFSICRMJHB3cl9zcF9hbHQKKwlzdWIJcmJwLHIxMQorCWxlYQlyYnAsWygoLTMyMCkpK3I5KjIrcmJwXQorCWptcAlORUFSICRMJHB3cl9zcF9kb25lCisKK0FMSUdOCTMyCiskTCRwd3Jfc3BfYWx0OgorCWxlYQlyMTAsWygoNDA5Ni0zMjApKStyOSoyXQorCWxlYQlyYnAsWygoLTMyMCkpK3I5KjIrcmJwXQorCXN1YglyMTEscjEwCisJbW92CXIxMCwwCisJY21vdmMJcjExLHIxMAorCXN1YglyYnAscjExCiskTCRwd3Jfc3BfZG9uZToKKwlhbmQJcmJwLC02NAorCW1vdglyMTEscnNwCisJc3ViCXIxMSxyYnAKKwlhbmQJcjExLC00MDk2CisJbGVhCXJzcCxbcmJwKjErcjExXQorCW1vdglyMTAsUVdPUkRbcnNwXQorCWNtcAlyc3AscmJwCisJamEJTkVBUiAkTCRwd3JfcGFnZV93YWxrCisJam1wCU5FQVIgJEwkcHdyX3BhZ2Vfd2Fsa19kb25lCisKKyRMJHB3cl9wYWdlX3dhbGs6CisJbGVhCXJzcCxbKCgtNDA5NikpK3JzcF0KKwltb3YJcjEwLFFXT1JEW3JzcF0KKwljbXAJcnNwLHJicAorCWphCU5FQVIgJEwkcHdyX3BhZ2Vfd2FsaworJEwkcHdyX3BhZ2Vfd2Fsa19kb25lOgorCisJbW92CXIxMCxyOQorCW5lZwlyOQorCisKKworCisKKworCisKKworCisJbW92CVFXT1JEWzMyK3JzcF0scjgKKwltb3YJUVdPUkRbNDArcnNwXSxyYXgKKworJEwkcG93ZXI1X2JvZHk6CitEQgkxMDIsNzIsMTUsMTEwLDIwNworREIJMTAyLDcyLDE1LDExMCwyMDkKK0RCCTEwMiw3MywxNSwxMTAsMjE4CitEQgkxMDIsNzIsMTUsMTEwLDIyNgorCisJY2FsbAlfX2JuX3Nxcjh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3Q0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9wb3N0NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyOHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fcG9zdDR4X2ludGVybmFsCisJY2FsbAlfX2JuX3Nxcjh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3Q0eF9pbnRlcm5hbAorCWNhbGwJX19ibl9zcXI4eF9pbnRlcm5hbAorCWNhbGwJX19ibl9wb3N0NHhfaW50ZXJuYWwKKworREIJMTAyLDcyLDE1LDEyNiwyMDkKK0RCCTEwMiw3MiwxNSwxMjYsMjI2CisJbW92CXJkaSxyc2kKKwltb3YJcmF4LFFXT1JEWzQwK3JzcF0KKwlsZWEJcjgsWzMyK3JzcF0KKworCWNhbGwJbXVsNHhfaW50ZXJuYWwKKworCW1vdglyc2ksUVdPUkRbNDArcnNwXQorCisJbW92CXJheCwxCisJbW92CXIxNSxRV09SRFsoKC00OCkpK3JzaV0KKworCW1vdglyMTQsUVdPUkRbKCgtNDApKStyc2ldCisKKwltb3YJcjEzLFFXT1JEWygoLTMyKSkrcnNpXQorCisJbW92CXIxMixRV09SRFsoKC0yNCkpK3JzaV0KKworCW1vdglyYnAsUVdPUkRbKCgtMTYpKStyc2ldCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyc2ldCisKKwlsZWEJcnNwLFtyc2ldCisKKyRMJHBvd2VyNV9lcGlsb2d1ZToKKwltb3YJcmRpLFFXT1JEWzgrcnNwXQk7V0lONjQgZXBpbG9ndWUKKwltb3YJcnNpLFFXT1JEWzE2K3JzcF0KKwlEQgkwRjNoLDBDM2gJCTtyZXByZXQKKworJEwkU0VIX2VuZF9ibl9wb3dlcjU6CisKK2dsb2JhbAlibl9zcXI4eF9pbnRlcm5hbAorCisKK0FMSUdOCTMyCitibl9zcXI4eF9pbnRlcm5hbDoKK19fYm5fc3FyOHhfaW50ZXJuYWw6CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwlsZWEJcmJwLFszMityMTBdCisJbGVhCXJzaSxbcjkqMStyc2ldCisKKwltb3YJcmN4LHI5CisKKworCW1vdglyMTQsUVdPUkRbKCgtMzIpKStyYnAqMStyc2ldCisJbGVhCXJkaSxbKCg0OCs4KSkrcjkqMityc3BdCisJbW92CXJheCxRV09SRFsoKC0yNCkpK3JicCoxK3JzaV0KKwlsZWEJcmRpLFsoKC0zMikpK3JicCoxK3JkaV0KKwltb3YJcmJ4LFFXT1JEWygoLTE2KSkrcmJwKjErcnNpXQorCW1vdglyMTUscmF4CisKKwltdWwJcjE0CisJbW92CXIxMCxyYXgKKwltb3YJcmF4LHJieAorCW1vdglyMTEscmR4CisJbW92CVFXT1JEWygoLTI0KSkrcmJwKjErcmRpXSxyMTAKKworCW11bAlyMTQKKwlhZGQJcjExLHJheAorCW1vdglyYXgscmJ4CisJYWRjCXJkeCwwCisJbW92CVFXT1JEWygoLTE2KSkrcmJwKjErcmRpXSxyMTEKKwltb3YJcjEwLHJkeAorCisKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyYnAqMStyc2ldCisJbXVsCXIxNQorCW1vdglyMTIscmF4CisJbW92CXJheCxyYngKKwltb3YJcjEzLHJkeAorCisJbGVhCXJjeCxbcmJwXQorCW11bAlyMTQKKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmJ4CisJbW92CXIxMSxyZHgKKwlhZGMJcjExLDAKKwlhZGQJcjEwLHIxMgorCWFkYwlyMTEsMAorCW1vdglRV09SRFsoKC04KSkrcmN4KjErcmRpXSxyMTAKKwlqbXAJTkVBUiAkTCRzcXI0eF8xc3QKKworQUxJR04JMzIKKyRMJHNxcjR4XzFzdDoKKwltb3YJcmJ4LFFXT1JEW3JjeCoxK3JzaV0KKwltdWwJcjE1CisJYWRkCXIxMyxyYXgKKwltb3YJcmF4LHJieAorCW1vdglyMTIscmR4CisJYWRjCXIxMiwwCisKKwltdWwJcjE0CisJYWRkCXIxMSxyYXgKKwltb3YJcmF4LHJieAorCW1vdglyYngsUVdPUkRbOCtyY3gqMStyc2ldCisJbW92CXIxMCxyZHgKKwlhZGMJcjEwLDAKKwlhZGQJcjExLHIxMworCWFkYwlyMTAsMAorCisKKwltdWwJcjE1CisJYWRkCXIxMixyYXgKKwltb3YJcmF4LHJieAorCW1vdglRV09SRFtyY3gqMStyZGldLHIxMQorCW1vdglyMTMscmR4CisJYWRjCXIxMywwCisKKwltdWwJcjE0CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHJieAorCW1vdglyYngsUVdPUkRbMTYrcmN4KjErcnNpXQorCW1vdglyMTEscmR4CisJYWRjCXIxMSwwCisJYWRkCXIxMCxyMTIKKwlhZGMJcjExLDAKKworCW11bAlyMTUKKwlhZGQJcjEzLHJheAorCW1vdglyYXgscmJ4CisJbW92CVFXT1JEWzgrcmN4KjErcmRpXSxyMTAKKwltb3YJcjEyLHJkeAorCWFkYwlyMTIsMAorCisJbXVsCXIxNAorCWFkZAlyMTEscmF4CisJbW92CXJheCxyYngKKwltb3YJcmJ4LFFXT1JEWzI0K3JjeCoxK3JzaV0KKwltb3YJcjEwLHJkeAorCWFkYwlyMTAsMAorCWFkZAlyMTEscjEzCisJYWRjCXIxMCwwCisKKworCW11bAlyMTUKKwlhZGQJcjEyLHJheAorCW1vdglyYXgscmJ4CisJbW92CVFXT1JEWzE2K3JjeCoxK3JkaV0scjExCisJbW92CXIxMyxyZHgKKwlhZGMJcjEzLDAKKwlsZWEJcmN4LFszMityY3hdCisKKwltdWwJcjE0CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHJieAorCW1vdglyMTEscmR4CisJYWRjCXIxMSwwCisJYWRkCXIxMCxyMTIKKwlhZGMJcjExLDAKKwltb3YJUVdPUkRbKCgtOCkpK3JjeCoxK3JkaV0scjEwCisKKwljbXAJcmN4LDAKKwlqbmUJTkVBUiAkTCRzcXI0eF8xc3QKKworCW11bAlyMTUKKwlhZGQJcjEzLHJheAorCWxlYQlyYnAsWzE2K3JicF0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxMQorCWFkYwlyZHgsMAorCisJbW92CVFXT1JEW3JkaV0scjEzCisJbW92CXIxMixyZHgKKwltb3YJUVdPUkRbOCtyZGldLHJkeAorCWptcAlORUFSICRMJHNxcjR4X291dGVyCisKK0FMSUdOCTMyCiskTCRzcXI0eF9vdXRlcjoKKwltb3YJcjE0LFFXT1JEWygoLTMyKSkrcmJwKjErcnNpXQorCWxlYQlyZGksWygoNDgrOCkpK3I5KjIrcnNwXQorCW1vdglyYXgsUVdPUkRbKCgtMjQpKStyYnAqMStyc2ldCisJbGVhCXJkaSxbKCgtMzIpKStyYnAqMStyZGldCisJbW92CXJieCxRV09SRFsoKC0xNikpK3JicCoxK3JzaV0KKwltb3YJcjE1LHJheAorCisJbXVsCXIxNAorCW1vdglyMTAsUVdPUkRbKCgtMjQpKStyYnAqMStyZGldCisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHJieAorCWFkYwlyZHgsMAorCW1vdglRV09SRFsoKC0yNCkpK3JicCoxK3JkaV0scjEwCisJbW92CXIxMSxyZHgKKworCW11bAlyMTQKKwlhZGQJcjExLHJheAorCW1vdglyYXgscmJ4CisJYWRjCXJkeCwwCisJYWRkCXIxMSxRV09SRFsoKC0xNikpK3JicCoxK3JkaV0KKwltb3YJcjEwLHJkeAorCWFkYwlyMTAsMAorCW1vdglRV09SRFsoKC0xNikpK3JicCoxK3JkaV0scjExCisKKwl4b3IJcjEyLHIxMgorCisJbW92CXJieCxRV09SRFsoKC04KSkrcmJwKjErcnNpXQorCW11bAlyMTUKKwlhZGQJcjEyLHJheAorCW1vdglyYXgscmJ4CisJYWRjCXJkeCwwCisJYWRkCXIxMixRV09SRFsoKC04KSkrcmJwKjErcmRpXQorCW1vdglyMTMscmR4CisJYWRjCXIxMywwCisKKwltdWwJcjE0CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHJieAorCWFkYwlyZHgsMAorCWFkZAlyMTAscjEyCisJbW92CXIxMSxyZHgKKwlhZGMJcjExLDAKKwltb3YJUVdPUkRbKCgtOCkpK3JicCoxK3JkaV0scjEwCisKKwlsZWEJcmN4LFtyYnBdCisJam1wCU5FQVIgJEwkc3FyNHhfaW5uZXIKKworQUxJR04JMzIKKyRMJHNxcjR4X2lubmVyOgorCW1vdglyYngsUVdPUkRbcmN4KjErcnNpXQorCW11bAlyMTUKKwlhZGQJcjEzLHJheAorCW1vdglyYXgscmJ4CisJbW92CXIxMixyZHgKKwlhZGMJcjEyLDAKKwlhZGQJcjEzLFFXT1JEW3JjeCoxK3JkaV0KKwlhZGMJcjEyLDAKKworREIJMHg2NworCW11bAlyMTQKKwlhZGQJcjExLHJheAorCW1vdglyYXgscmJ4CisJbW92CXJieCxRV09SRFs4K3JjeCoxK3JzaV0KKwltb3YJcjEwLHJkeAorCWFkYwlyMTAsMAorCWFkZAlyMTEscjEzCisJYWRjCXIxMCwwCisKKwltdWwJcjE1CisJYWRkCXIxMixyYXgKKwltb3YJUVdPUkRbcmN4KjErcmRpXSxyMTEKKwltb3YJcmF4LHJieAorCW1vdglyMTMscmR4CisJYWRjCXIxMywwCisJYWRkCXIxMixRV09SRFs4K3JjeCoxK3JkaV0KKwlsZWEJcmN4LFsxNityY3hdCisJYWRjCXIxMywwCisKKwltdWwJcjE0CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LHJieAorCWFkYwlyZHgsMAorCWFkZAlyMTAscjEyCisJbW92CXIxMSxyZHgKKwlhZGMJcjExLDAKKwltb3YJUVdPUkRbKCgtOCkpK3JjeCoxK3JkaV0scjEwCisKKwljbXAJcmN4LDAKKwlqbmUJTkVBUiAkTCRzcXI0eF9pbm5lcgorCitEQgkweDY3CisJbXVsCXIxNQorCWFkZAlyMTMscmF4CisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTEKKwlhZGMJcmR4LDAKKworCW1vdglRV09SRFtyZGldLHIxMworCW1vdglyMTIscmR4CisJbW92CVFXT1JEWzgrcmRpXSxyZHgKKworCWFkZAlyYnAsMTYKKwlqbnoJTkVBUiAkTCRzcXI0eF9vdXRlcgorCisKKwltb3YJcjE0LFFXT1JEWygoLTMyKSkrcnNpXQorCWxlYQlyZGksWygoNDgrOCkpK3I5KjIrcnNwXQorCW1vdglyYXgsUVdPUkRbKCgtMjQpKStyc2ldCisJbGVhCXJkaSxbKCgtMzIpKStyYnAqMStyZGldCisJbW92CXJieCxRV09SRFsoKC0xNikpK3JzaV0KKwltb3YJcjE1LHJheAorCisJbXVsCXIxNAorCWFkZAlyMTAscmF4CisJbW92CXJheCxyYngKKwltb3YJcjExLHJkeAorCWFkYwlyMTEsMAorCisJbXVsCXIxNAorCWFkZAlyMTEscmF4CisJbW92CXJheCxyYngKKwltb3YJUVdPUkRbKCgtMjQpKStyZGldLHIxMAorCW1vdglyMTAscmR4CisJYWRjCXIxMCwwCisJYWRkCXIxMSxyMTMKKwltb3YJcmJ4LFFXT1JEWygoLTgpKStyc2ldCisJYWRjCXIxMCwwCisKKwltdWwJcjE1CisJYWRkCXIxMixyYXgKKwltb3YJcmF4LHJieAorCW1vdglRV09SRFsoKC0xNikpK3JkaV0scjExCisJbW92CXIxMyxyZHgKKwlhZGMJcjEzLDAKKworCW11bAlyMTQKKwlhZGQJcjEwLHJheAorCW1vdglyYXgscmJ4CisJbW92CXIxMSxyZHgKKwlhZGMJcjExLDAKKwlhZGQJcjEwLHIxMgorCWFkYwlyMTEsMAorCW1vdglRV09SRFsoKC04KSkrcmRpXSxyMTAKKworCW11bAlyMTUKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbKCgtMTYpKStyc2ldCisJYWRjCXJkeCwwCisJYWRkCXIxMyxyMTEKKwlhZGMJcmR4LDAKKworCW1vdglRV09SRFtyZGldLHIxMworCW1vdglyMTIscmR4CisJbW92CVFXT1JEWzgrcmRpXSxyZHgKKworCW11bAlyYngKKwlhZGQJcmJwLDE2CisJeG9yCXIxNCxyMTQKKwlzdWIJcmJwLHI5CisJeG9yCXIxNSxyMTUKKworCWFkZAlyYXgscjEyCisJYWRjCXJkeCwwCisJbW92CVFXT1JEWzgrcmRpXSxyYXgKKwltb3YJUVdPUkRbMTYrcmRpXSxyZHgKKwltb3YJUVdPUkRbMjQrcmRpXSxyMTUKKworCW1vdglyYXgsUVdPUkRbKCgtMTYpKStyYnAqMStyc2ldCisJbGVhCXJkaSxbKCg0OCs4KSkrcnNwXQorCXhvcglyMTAscjEwCisJbW92CXIxMSxRV09SRFs4K3JkaV0KKworCWxlYQlyMTIsW3IxMCoyK3IxNF0KKwlzaHIJcjEwLDYzCisJbGVhCXIxMyxbcjExKjIrcmN4XQorCXNocglyMTEsNjMKKwlvcglyMTMscjEwCisJbW92CXIxMCxRV09SRFsxNityZGldCisJbW92CXIxNCxyMTEKKwltdWwJcmF4CisJbmVnCXIxNQorCW1vdglyMTEsUVdPUkRbMjQrcmRpXQorCWFkYwlyMTIscmF4CisJbW92CXJheCxRV09SRFsoKC04KSkrcmJwKjErcnNpXQorCW1vdglRV09SRFtyZGldLHIxMgorCWFkYwlyMTMscmR4CisKKwlsZWEJcmJ4LFtyMTAqMityMTRdCisJbW92CVFXT1JEWzgrcmRpXSxyMTMKKwlzYmIJcjE1LHIxNQorCXNocglyMTAsNjMKKwlsZWEJcjgsW3IxMSoyK3JjeF0KKwlzaHIJcjExLDYzCisJb3IJcjgscjEwCisJbW92CXIxMCxRV09SRFszMityZGldCisJbW92CXIxNCxyMTEKKwltdWwJcmF4CisJbmVnCXIxNQorCW1vdglyMTEsUVdPUkRbNDArcmRpXQorCWFkYwlyYngscmF4CisJbW92CXJheCxRV09SRFtyYnAqMStyc2ldCisJbW92CVFXT1JEWzE2K3JkaV0scmJ4CisJYWRjCXI4LHJkeAorCWxlYQlyYnAsWzE2K3JicF0KKwltb3YJUVdPUkRbMjQrcmRpXSxyOAorCXNiYglyMTUscjE1CisJbGVhCXJkaSxbNjQrcmRpXQorCWptcAlORUFSICRMJHNxcjR4X3NoaWZ0X25fYWRkCisKK0FMSUdOCTMyCiskTCRzcXI0eF9zaGlmdF9uX2FkZDoKKwlsZWEJcjEyLFtyMTAqMityMTRdCisJc2hyCXIxMCw2MworCWxlYQlyMTMsW3IxMSoyK3JjeF0KKwlzaHIJcjExLDYzCisJb3IJcjEzLHIxMAorCW1vdglyMTAsUVdPUkRbKCgtMTYpKStyZGldCisJbW92CXIxNCxyMTEKKwltdWwJcmF4CisJbmVnCXIxNQorCW1vdglyMTEsUVdPUkRbKCgtOCkpK3JkaV0KKwlhZGMJcjEyLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3JicCoxK3JzaV0KKwltb3YJUVdPUkRbKCgtMzIpKStyZGldLHIxMgorCWFkYwlyMTMscmR4CisKKwlsZWEJcmJ4LFtyMTAqMityMTRdCisJbW92CVFXT1JEWygoLTI0KSkrcmRpXSxyMTMKKwlzYmIJcjE1LHIxNQorCXNocglyMTAsNjMKKwlsZWEJcjgsW3IxMSoyK3JjeF0KKwlzaHIJcjExLDYzCisJb3IJcjgscjEwCisJbW92CXIxMCxRV09SRFtyZGldCisJbW92CXIxNCxyMTEKKwltdWwJcmF4CisJbmVnCXIxNQorCW1vdglyMTEsUVdPUkRbOCtyZGldCisJYWRjCXJieCxyYXgKKwltb3YJcmF4LFFXT1JEW3JicCoxK3JzaV0KKwltb3YJUVdPUkRbKCgtMTYpKStyZGldLHJieAorCWFkYwlyOCxyZHgKKworCWxlYQlyMTIsW3IxMCoyK3IxNF0KKwltb3YJUVdPUkRbKCgtOCkpK3JkaV0scjgKKwlzYmIJcjE1LHIxNQorCXNocglyMTAsNjMKKwlsZWEJcjEzLFtyMTEqMityY3hdCisJc2hyCXIxMSw2MworCW9yCXIxMyxyMTAKKwltb3YJcjEwLFFXT1JEWzE2K3JkaV0KKwltb3YJcjE0LHIxMQorCW11bAlyYXgKKwluZWcJcjE1CisJbW92CXIxMSxRV09SRFsyNCtyZGldCisJYWRjCXIxMixyYXgKKwltb3YJcmF4LFFXT1JEWzgrcmJwKjErcnNpXQorCW1vdglRV09SRFtyZGldLHIxMgorCWFkYwlyMTMscmR4CisKKwlsZWEJcmJ4LFtyMTAqMityMTRdCisJbW92CVFXT1JEWzgrcmRpXSxyMTMKKwlzYmIJcjE1LHIxNQorCXNocglyMTAsNjMKKwlsZWEJcjgsW3IxMSoyK3JjeF0KKwlzaHIJcjExLDYzCisJb3IJcjgscjEwCisJbW92CXIxMCxRV09SRFszMityZGldCisJbW92CXIxNCxyMTEKKwltdWwJcmF4CisJbmVnCXIxNQorCW1vdglyMTEsUVdPUkRbNDArcmRpXQorCWFkYwlyYngscmF4CisJbW92CXJheCxRV09SRFsxNityYnAqMStyc2ldCisJbW92CVFXT1JEWzE2K3JkaV0scmJ4CisJYWRjCXI4LHJkeAorCW1vdglRV09SRFsyNCtyZGldLHI4CisJc2JiCXIxNSxyMTUKKwlsZWEJcmRpLFs2NCtyZGldCisJYWRkCXJicCwzMgorCWpueglORUFSICRMJHNxcjR4X3NoaWZ0X25fYWRkCisKKwlsZWEJcjEyLFtyMTAqMityMTRdCitEQgkweDY3CisJc2hyCXIxMCw2MworCWxlYQlyMTMsW3IxMSoyK3JjeF0KKwlzaHIJcjExLDYzCisJb3IJcjEzLHIxMAorCW1vdglyMTAsUVdPUkRbKCgtMTYpKStyZGldCisJbW92CXIxNCxyMTEKKwltdWwJcmF4CisJbmVnCXIxNQorCW1vdglyMTEsUVdPUkRbKCgtOCkpK3JkaV0KKwlhZGMJcjEyLHJheAorCW1vdglyYXgsUVdPUkRbKCgtOCkpK3JzaV0KKwltb3YJUVdPUkRbKCgtMzIpKStyZGldLHIxMgorCWFkYwlyMTMscmR4CisKKwlsZWEJcmJ4LFtyMTAqMityMTRdCisJbW92CVFXT1JEWygoLTI0KSkrcmRpXSxyMTMKKwlzYmIJcjE1LHIxNQorCXNocglyMTAsNjMKKwlsZWEJcjgsW3IxMSoyK3JjeF0KKwlzaHIJcjExLDYzCisJb3IJcjgscjEwCisJbXVsCXJheAorCW5lZwlyMTUKKwlhZGMJcmJ4LHJheAorCWFkYwlyOCxyZHgKKwltb3YJUVdPUkRbKCgtMTYpKStyZGldLHJieAorCW1vdglRV09SRFsoKC04KSkrcmRpXSxyOAorREIJMTAyLDcyLDE1LDEyNiwyMTMKK19fYm5fc3FyOHhfcmVkdWN0aW9uOgorCXhvcglyYXgscmF4CisJbGVhCXJjeCxbcmJwKjErcjldCisJbGVhCXJkeCxbKCg0OCs4KSkrcjkqMityc3BdCisJbW92CVFXT1JEWygoMCs4KSkrcnNwXSxyY3gKKwlsZWEJcmRpLFsoKDQ4KzgpKStyOSoxK3JzcF0KKwltb3YJUVdPUkRbKCg4KzgpKStyc3BdLHJkeAorCW5lZwlyOQorCWptcAlORUFSICRMJDh4X3JlZHVjdGlvbl9sb29wCisKK0FMSUdOCTMyCiskTCQ4eF9yZWR1Y3Rpb25fbG9vcDoKKwlsZWEJcmRpLFtyOSoxK3JkaV0KK0RCCTB4NjYKKwltb3YJcmJ4LFFXT1JEW3JkaV0KKwltb3YJcjksUVdPUkRbOCtyZGldCisJbW92CXIxMCxRV09SRFsxNityZGldCisJbW92CXIxMSxRV09SRFsyNCtyZGldCisJbW92CXIxMixRV09SRFszMityZGldCisJbW92CXIxMyxRV09SRFs0MCtyZGldCisJbW92CXIxNCxRV09SRFs0OCtyZGldCisJbW92CXIxNSxRV09SRFs1NityZGldCisJbW92CVFXT1JEW3JkeF0scmF4CisJbGVhCXJkaSxbNjQrcmRpXQorCitEQgkweDY3CisJbW92CXI4LHJieAorCWltdWwJcmJ4LFFXT1JEWygoMzIrOCkpK3JzcF0KKwltb3YJcmF4LFFXT1JEW3JicF0KKwltb3YJZWN4LDgKKwlqbXAJTkVBUiAkTCQ4eF9yZWR1Y2UKKworQUxJR04JMzIKKyRMJDh4X3JlZHVjZToKKwltdWwJcmJ4CisJbW92CXJheCxRV09SRFs4K3JicF0KKwluZWcJcjgKKwltb3YJcjgscmR4CisJYWRjCXI4LDAKKworCW11bAlyYngKKwlhZGQJcjkscmF4CisJbW92CXJheCxRV09SRFsxNityYnBdCisJYWRjCXJkeCwwCisJYWRkCXI4LHI5CisJbW92CVFXT1JEWygoNDgtOCs4KSkrcmN4KjgrcnNwXSxyYngKKwltb3YJcjkscmR4CisJYWRjCXI5LDAKKworCW11bAlyYngKKwlhZGQJcjEwLHJheAorCW1vdglyYXgsUVdPUkRbMjQrcmJwXQorCWFkYwlyZHgsMAorCWFkZAlyOSxyMTAKKwltb3YJcnNpLFFXT1JEWygoMzIrOCkpK3JzcF0KKwltb3YJcjEwLHJkeAorCWFkYwlyMTAsMAorCisJbXVsCXJieAorCWFkZAlyMTEscmF4CisJbW92CXJheCxRV09SRFszMityYnBdCisJYWRjCXJkeCwwCisJaW11bAlyc2kscjgKKwlhZGQJcjEwLHIxMQorCW1vdglyMTEscmR4CisJYWRjCXIxMSwwCisKKwltdWwJcmJ4CisJYWRkCXIxMixyYXgKKwltb3YJcmF4LFFXT1JEWzQwK3JicF0KKwlhZGMJcmR4LDAKKwlhZGQJcjExLHIxMgorCW1vdglyMTIscmR4CisJYWRjCXIxMiwwCisKKwltdWwJcmJ4CisJYWRkCXIxMyxyYXgKKwltb3YJcmF4LFFXT1JEWzQ4K3JicF0KKwlhZGMJcmR4LDAKKwlhZGQJcjEyLHIxMworCW1vdglyMTMscmR4CisJYWRjCXIxMywwCisKKwltdWwJcmJ4CisJYWRkCXIxNCxyYXgKKwltb3YJcmF4LFFXT1JEWzU2K3JicF0KKwlhZGMJcmR4LDAKKwlhZGQJcjEzLHIxNAorCW1vdglyMTQscmR4CisJYWRjCXIxNCwwCisKKwltdWwJcmJ4CisJbW92CXJieCxyc2kKKwlhZGQJcjE1LHJheAorCW1vdglyYXgsUVdPUkRbcmJwXQorCWFkYwlyZHgsMAorCWFkZAlyMTQscjE1CisJbW92CXIxNSxyZHgKKwlhZGMJcjE1LDAKKworCWRlYwllY3gKKwlqbnoJTkVBUiAkTCQ4eF9yZWR1Y2UKKworCWxlYQlyYnAsWzY0K3JicF0KKwl4b3IJcmF4LHJheAorCW1vdglyZHgsUVdPUkRbKCg4KzgpKStyc3BdCisJY21wCXJicCxRV09SRFsoKDArOCkpK3JzcF0KKwlqYWUJTkVBUiAkTCQ4eF9ub190YWlsCisKK0RCCTB4NjYKKwlhZGQJcjgsUVdPUkRbcmRpXQorCWFkYwlyOSxRV09SRFs4K3JkaV0KKwlhZGMJcjEwLFFXT1JEWzE2K3JkaV0KKwlhZGMJcjExLFFXT1JEWzI0K3JkaV0KKwlhZGMJcjEyLFFXT1JEWzMyK3JkaV0KKwlhZGMJcjEzLFFXT1JEWzQwK3JkaV0KKwlhZGMJcjE0LFFXT1JEWzQ4K3JkaV0KKwlhZGMJcjE1LFFXT1JEWzU2K3JkaV0KKwlzYmIJcnNpLHJzaQorCisJbW92CXJieCxRV09SRFsoKDQ4KzU2KzgpKStyc3BdCisJbW92CWVjeCw4CisJbW92CXJheCxRV09SRFtyYnBdCisJam1wCU5FQVIgJEwkOHhfdGFpbAorCitBTElHTgkzMgorJEwkOHhfdGFpbDoKKwltdWwJcmJ4CisJYWRkCXI4LHJheAorCW1vdglyYXgsUVdPUkRbOCtyYnBdCisJbW92CVFXT1JEW3JkaV0scjgKKwltb3YJcjgscmR4CisJYWRjCXI4LDAKKworCW11bAlyYngKKwlhZGQJcjkscmF4CisJbW92CXJheCxRV09SRFsxNityYnBdCisJYWRjCXJkeCwwCisJYWRkCXI4LHI5CisJbGVhCXJkaSxbOCtyZGldCisJbW92CXI5LHJkeAorCWFkYwlyOSwwCisKKwltdWwJcmJ4CisJYWRkCXIxMCxyYXgKKwltb3YJcmF4LFFXT1JEWzI0K3JicF0KKwlhZGMJcmR4LDAKKwlhZGQJcjkscjEwCisJbW92CXIxMCxyZHgKKwlhZGMJcjEwLDAKKworCW11bAlyYngKKwlhZGQJcjExLHJheAorCW1vdglyYXgsUVdPUkRbMzIrcmJwXQorCWFkYwlyZHgsMAorCWFkZAlyMTAscjExCisJbW92CXIxMSxyZHgKKwlhZGMJcjExLDAKKworCW11bAlyYngKKwlhZGQJcjEyLHJheAorCW1vdglyYXgsUVdPUkRbNDArcmJwXQorCWFkYwlyZHgsMAorCWFkZAlyMTEscjEyCisJbW92CXIxMixyZHgKKwlhZGMJcjEyLDAKKworCW11bAlyYngKKwlhZGQJcjEzLHJheAorCW1vdglyYXgsUVdPUkRbNDgrcmJwXQorCWFkYwlyZHgsMAorCWFkZAlyMTIscjEzCisJbW92CXIxMyxyZHgKKwlhZGMJcjEzLDAKKworCW11bAlyYngKKwlhZGQJcjE0LHJheAorCW1vdglyYXgsUVdPUkRbNTYrcmJwXQorCWFkYwlyZHgsMAorCWFkZAlyMTMscjE0CisJbW92CXIxNCxyZHgKKwlhZGMJcjE0LDAKKworCW11bAlyYngKKwltb3YJcmJ4LFFXT1JEWygoNDgtMTYrOCkpK3JjeCo4K3JzcF0KKwlhZGQJcjE1LHJheAorCWFkYwlyZHgsMAorCWFkZAlyMTQscjE1CisJbW92CXJheCxRV09SRFtyYnBdCisJbW92CXIxNSxyZHgKKwlhZGMJcjE1LDAKKworCWRlYwllY3gKKwlqbnoJTkVBUiAkTCQ4eF90YWlsCisKKwlsZWEJcmJwLFs2NCtyYnBdCisJbW92CXJkeCxRV09SRFsoKDgrOCkpK3JzcF0KKwljbXAJcmJwLFFXT1JEWygoMCs4KSkrcnNwXQorCWphZQlORUFSICRMJDh4X3RhaWxfZG9uZQorCisJbW92CXJieCxRV09SRFsoKDQ4KzU2KzgpKStyc3BdCisJbmVnCXJzaQorCW1vdglyYXgsUVdPUkRbcmJwXQorCWFkYwlyOCxRV09SRFtyZGldCisJYWRjCXI5LFFXT1JEWzgrcmRpXQorCWFkYwlyMTAsUVdPUkRbMTYrcmRpXQorCWFkYwlyMTEsUVdPUkRbMjQrcmRpXQorCWFkYwlyMTIsUVdPUkRbMzIrcmRpXQorCWFkYwlyMTMsUVdPUkRbNDArcmRpXQorCWFkYwlyMTQsUVdPUkRbNDgrcmRpXQorCWFkYwlyMTUsUVdPUkRbNTYrcmRpXQorCXNiYglyc2kscnNpCisKKwltb3YJZWN4LDgKKwlqbXAJTkVBUiAkTCQ4eF90YWlsCisKK0FMSUdOCTMyCiskTCQ4eF90YWlsX2RvbmU6CisJeG9yCXJheCxyYXgKKwlhZGQJcjgsUVdPUkRbcmR4XQorCWFkYwlyOSwwCisJYWRjCXIxMCwwCisJYWRjCXIxMSwwCisJYWRjCXIxMiwwCisJYWRjCXIxMywwCisJYWRjCXIxNCwwCisJYWRjCXIxNSwwCisJYWRjCXJheCwwCisKKwluZWcJcnNpCiskTCQ4eF9ub190YWlsOgorCWFkYwlyOCxRV09SRFtyZGldCisJYWRjCXI5LFFXT1JEWzgrcmRpXQorCWFkYwlyMTAsUVdPUkRbMTYrcmRpXQorCWFkYwlyMTEsUVdPUkRbMjQrcmRpXQorCWFkYwlyMTIsUVdPUkRbMzIrcmRpXQorCWFkYwlyMTMsUVdPUkRbNDArcmRpXQorCWFkYwlyMTQsUVdPUkRbNDgrcmRpXQorCWFkYwlyMTUsUVdPUkRbNTYrcmRpXQorCWFkYwlyYXgsMAorCW1vdglyY3gsUVdPUkRbKCgtOCkpK3JicF0KKwl4b3IJcnNpLHJzaQorCitEQgkxMDIsNzIsMTUsMTI2LDIxMworCisJbW92CVFXT1JEW3JkaV0scjgKKwltb3YJUVdPUkRbOCtyZGldLHI5CitEQgkxMDIsNzMsMTUsMTI2LDIxNworCW1vdglRV09SRFsxNityZGldLHIxMAorCW1vdglRV09SRFsyNCtyZGldLHIxMQorCW1vdglRV09SRFszMityZGldLHIxMgorCW1vdglRV09SRFs0MCtyZGldLHIxMworCW1vdglRV09SRFs0OCtyZGldLHIxNAorCW1vdglRV09SRFs1NityZGldLHIxNQorCWxlYQlyZGksWzY0K3JkaV0KKworCWNtcAlyZGkscmR4CisJamIJTkVBUiAkTCQ4eF9yZWR1Y3Rpb25fbG9vcAorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKK0FMSUdOCTMyCitfX2JuX3Bvc3Q0eF9pbnRlcm5hbDoKKwltb3YJcjEyLFFXT1JEW3JicF0KKwlsZWEJcmJ4LFtyOSoxK3JkaV0KKwltb3YJcmN4LHI5CitEQgkxMDIsNzIsMTUsMTI2LDIwNworCW5lZwlyYXgKK0RCCTEwMiw3MiwxNSwxMjYsMjA2CisJc2FyCXJjeCwzKzIKKwlkZWMJcjEyCisJeG9yCXIxMCxyMTAKKwltb3YJcjEzLFFXT1JEWzgrcmJwXQorCW1vdglyMTQsUVdPUkRbMTYrcmJwXQorCW1vdglyMTUsUVdPUkRbMjQrcmJwXQorCWptcAlORUFSICRMJHNxcjR4X3N1Yl9lbnRyeQorCitBTElHTgkxNgorJEwkc3FyNHhfc3ViOgorCW1vdglyMTIsUVdPUkRbcmJwXQorCW1vdglyMTMsUVdPUkRbOCtyYnBdCisJbW92CXIxNCxRV09SRFsxNityYnBdCisJbW92CXIxNSxRV09SRFsyNCtyYnBdCiskTCRzcXI0eF9zdWJfZW50cnk6CisJbGVhCXJicCxbMzIrcmJwXQorCW5vdAlyMTIKKwlub3QJcjEzCisJbm90CXIxNAorCW5vdAlyMTUKKwlhbmQJcjEyLHJheAorCWFuZAlyMTMscmF4CisJYW5kCXIxNCxyYXgKKwlhbmQJcjE1LHJheAorCisJbmVnCXIxMAorCWFkYwlyMTIsUVdPUkRbcmJ4XQorCWFkYwlyMTMsUVdPUkRbOCtyYnhdCisJYWRjCXIxNCxRV09SRFsxNityYnhdCisJYWRjCXIxNSxRV09SRFsyNCtyYnhdCisJbW92CVFXT1JEW3JkaV0scjEyCisJbGVhCXJieCxbMzIrcmJ4XQorCW1vdglRV09SRFs4K3JkaV0scjEzCisJc2JiCXIxMCxyMTAKKwltb3YJUVdPUkRbMTYrcmRpXSxyMTQKKwltb3YJUVdPUkRbMjQrcmRpXSxyMTUKKwlsZWEJcmRpLFszMityZGldCisKKwlpbmMJcmN4CisJam56CU5FQVIgJEwkc3FyNHhfc3ViCisKKwltb3YJcjEwLHI5CisJbmVnCXI5CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK2dsb2JhbAlibl9mcm9tX21vbnRnb21lcnkKKworQUxJR04JMzIKK2JuX2Zyb21fbW9udGdvbWVyeToKKwl0ZXN0CURXT1JEWzQ4K3JzcF0sNworCWp6CU5FQVIgYm5fZnJvbV9tb250OHgKKwl4b3IJZWF4LGVheAorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCisKKworQUxJR04JMzIKK2JuX2Zyb21fbW9udDh4OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYm5fZnJvbV9tb250OHg6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKwltb3YJcjksUVdPUkRbNDgrcnNwXQorCisKKworREIJMHg2NworCW1vdglyYXgscnNwCisKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKyRMJGZyb21fcHJvbG9ndWU6CisKKwlzaGwJcjlkLDMKKwlsZWEJcjEwLFtyOSoyK3I5XQorCW5lZwlyOQorCW1vdglyOCxRV09SRFtyOF0KKworCisKKworCisKKworCisJbGVhCXIxMSxbKCgtMzIwKSkrcjkqMityc3BdCisJbW92CXJicCxyc3AKKwlzdWIJcjExLHJkaQorCWFuZAlyMTEsNDA5NQorCWNtcAlyMTAscjExCisJamIJTkVBUiAkTCRmcm9tX3NwX2FsdAorCXN1YglyYnAscjExCisJbGVhCXJicCxbKCgtMzIwKSkrcjkqMityYnBdCisJam1wCU5FQVIgJEwkZnJvbV9zcF9kb25lCisKK0FMSUdOCTMyCiskTCRmcm9tX3NwX2FsdDoKKwlsZWEJcjEwLFsoKDQwOTYtMzIwKSkrcjkqMl0KKwlsZWEJcmJwLFsoKC0zMjApKStyOSoyK3JicF0KKwlzdWIJcjExLHIxMAorCW1vdglyMTAsMAorCWNtb3ZjCXIxMSxyMTAKKwlzdWIJcmJwLHIxMQorJEwkZnJvbV9zcF9kb25lOgorCWFuZAlyYnAsLTY0CisJbW92CXIxMSxyc3AKKwlzdWIJcjExLHJicAorCWFuZAlyMTEsLTQwOTYKKwlsZWEJcnNwLFtyYnAqMStyMTFdCisJbW92CXIxMCxRV09SRFtyc3BdCisJY21wCXJzcCxyYnAKKwlqYQlORUFSICRMJGZyb21fcGFnZV93YWxrCisJam1wCU5FQVIgJEwkZnJvbV9wYWdlX3dhbGtfZG9uZQorCiskTCRmcm9tX3BhZ2Vfd2FsazoKKwlsZWEJcnNwLFsoKC00MDk2KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbcnNwXQorCWNtcAlyc3AscmJwCisJamEJTkVBUiAkTCRmcm9tX3BhZ2Vfd2FsaworJEwkZnJvbV9wYWdlX3dhbGtfZG9uZToKKworCW1vdglyMTAscjkKKwluZWcJcjkKKworCisKKworCisKKworCisKKworCW1vdglRV09SRFszMityc3BdLHI4CisJbW92CVFXT1JEWzQwK3JzcF0scmF4CisKKyRMJGZyb21fYm9keToKKwltb3YJcjExLHI5CisJbGVhCXJheCxbNDgrcnNwXQorCXB4b3IJeG1tMCx4bW0wCisJam1wCU5FQVIgJEwkbXVsX2J5XzEKKworQUxJR04JMzIKKyRMJG11bF9ieV8xOgorCW1vdmRxdQl4bW0xLFhNTVdPUkRbcnNpXQorCW1vdmRxdQl4bW0yLFhNTVdPUkRbMTYrcnNpXQorCW1vdmRxdQl4bW0zLFhNTVdPUkRbMzIrcnNpXQorCW1vdmRxYQlYTU1XT1JEW3I5KjErcmF4XSx4bW0wCisJbW92ZHF1CXhtbTQsWE1NV09SRFs0OCtyc2ldCisJbW92ZHFhCVhNTVdPUkRbMTYrcjkqMStyYXhdLHhtbTAKK0RCCTB4NDgsMHg4ZCwweGI2LDB4NDAsMHgwMCwweDAwLDB4MDAKKwltb3ZkcWEJWE1NV09SRFtyYXhdLHhtbTEKKwltb3ZkcWEJWE1NV09SRFszMityOSoxK3JheF0seG1tMAorCW1vdmRxYQlYTU1XT1JEWzE2K3JheF0seG1tMgorCW1vdmRxYQlYTU1XT1JEWzQ4K3I5KjErcmF4XSx4bW0wCisJbW92ZHFhCVhNTVdPUkRbMzIrcmF4XSx4bW0zCisJbW92ZHFhCVhNTVdPUkRbNDgrcmF4XSx4bW00CisJbGVhCXJheCxbNjQrcmF4XQorCXN1YglyMTEsNjQKKwlqbnoJTkVBUiAkTCRtdWxfYnlfMQorCitEQgkxMDIsNzIsMTUsMTEwLDIwNworREIJMTAyLDcyLDE1LDExMCwyMDkKK0RCCTB4NjcKKwltb3YJcmJwLHJjeAorREIJMTAyLDczLDE1LDExMCwyMTgKKwlsZWEJcjExLFtPUEVOU1NMX2lhMzJjYXBfUF0KKwltb3YJcjExZCxEV09SRFs4K3IxMV0KKwlhbmQJcjExZCwweDgwMTA4CisJY21wCXIxMWQsMHg4MDEwOAorCWpuZQlORUFSICRMJGZyb21fbW9udF9ub3gKKworCWxlYQlyZGksW3I5KjErcmF4XQorCWNhbGwJX19ibl9zcXJ4OHhfcmVkdWN0aW9uCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKworCXB4b3IJeG1tMCx4bW0wCisJbGVhCXJheCxbNDgrcnNwXQorCWptcAlORUFSICRMJGZyb21fbW9udF96ZXJvCisKK0FMSUdOCTMyCiskTCRmcm9tX21vbnRfbm94OgorCWNhbGwJX19ibl9zcXI4eF9yZWR1Y3Rpb24KKwljYWxsCV9fYm5fcG9zdDR4X2ludGVybmFsCisKKwlweG9yCXhtbTAseG1tMAorCWxlYQlyYXgsWzQ4K3JzcF0KKwlqbXAJTkVBUiAkTCRmcm9tX21vbnRfemVybworCitBTElHTgkzMgorJEwkZnJvbV9tb250X3plcm86CisJbW92CXJzaSxRV09SRFs0MCtyc3BdCisKKwltb3ZkcWEJWE1NV09SRFtyYXhdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsxNityYXhdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFszMityYXhdLHhtbTAKKwltb3ZkcWEJWE1NV09SRFs0OCtyYXhdLHhtbTAKKwlsZWEJcmF4LFs2NCtyYXhdCisJc3ViCXI5LDMyCisJam56CU5FQVIgJEwkZnJvbV9tb250X3plcm8KKworCW1vdglyYXgsMQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRmcm9tX2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2JuX2Zyb21fbW9udDh4OgorCitBTElHTgkzMgorYm5fbXVseDR4X21vbnRfZ2F0aGVyNToKKwltb3YJUVdPUkRbOCtyc3BdLHJkaQk7V0lONjQgcHJvbG9ndWUKKwltb3YJUVdPUkRbMTYrcnNwXSxyc2kKKwltb3YJcmF4LHJzcAorJEwkU0VIX2JlZ2luX2JuX211bHg0eF9tb250X2dhdGhlcjU6CisJbW92CXJkaSxyY3gKKwltb3YJcnNpLHJkeAorCW1vdglyZHgscjgKKwltb3YJcmN4LHI5CisJbW92CXI4LFFXT1JEWzQwK3JzcF0KKwltb3YJcjksUVdPUkRbNDgrcnNwXQorCisKKworCW1vdglyYXgscnNwCisKKyRMJG11bHg0eF9lbnRlcjoKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKyRMJG11bHg0eF9wcm9sb2d1ZToKKworCXNobAlyOWQsMworCWxlYQlyMTAsW3I5KjIrcjldCisJbmVnCXI5CisJbW92CXI4LFFXT1JEW3I4XQorCisKKworCisKKworCisKKworCisJbGVhCXIxMSxbKCgtMzIwKSkrcjkqMityc3BdCisJbW92CXJicCxyc3AKKwlzdWIJcjExLHJkaQorCWFuZAlyMTEsNDA5NQorCWNtcAlyMTAscjExCisJamIJTkVBUiAkTCRtdWx4NHhzcF9hbHQKKwlzdWIJcmJwLHIxMQorCWxlYQlyYnAsWygoLTMyMCkpK3I5KjIrcmJwXQorCWptcAlORUFSICRMJG11bHg0eHNwX2RvbmUKKworJEwkbXVseDR4c3BfYWx0OgorCWxlYQlyMTAsWygoNDA5Ni0zMjApKStyOSoyXQorCWxlYQlyYnAsWygoLTMyMCkpK3I5KjIrcmJwXQorCXN1YglyMTEscjEwCisJbW92CXIxMCwwCisJY21vdmMJcjExLHIxMAorCXN1YglyYnAscjExCiskTCRtdWx4NHhzcF9kb25lOgorCWFuZAlyYnAsLTY0CisJbW92CXIxMSxyc3AKKwlzdWIJcjExLHJicAorCWFuZAlyMTEsLTQwOTYKKwlsZWEJcnNwLFtyYnAqMStyMTFdCisJbW92CXIxMCxRV09SRFtyc3BdCisJY21wCXJzcCxyYnAKKwlqYQlORUFSICRMJG11bHg0eF9wYWdlX3dhbGsKKwlqbXAJTkVBUiAkTCRtdWx4NHhfcGFnZV93YWxrX2RvbmUKKworJEwkbXVseDR4X3BhZ2Vfd2FsazoKKwlsZWEJcnNwLFsoKC00MDk2KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbcnNwXQorCWNtcAlyc3AscmJwCisJamEJTkVBUiAkTCRtdWx4NHhfcGFnZV93YWxrCiskTCRtdWx4NHhfcGFnZV93YWxrX2RvbmU6CisKKworCisKKworCisKKworCisKKworCisKKwltb3YJUVdPUkRbMzIrcnNwXSxyOAorCW1vdglRV09SRFs0MCtyc3BdLHJheAorCiskTCRtdWx4NHhfYm9keToKKwljYWxsCW11bHg0eF9pbnRlcm5hbAorCisJbW92CXJzaSxRV09SRFs0MCtyc3BdCisKKwltb3YJcmF4LDEKKworCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRtdWx4NHhfZXBpbG9ndWU6CisJbW92CXJkaSxRV09SRFs4K3JzcF0JO1dJTjY0IGVwaWxvZ3VlCisJbW92CXJzaSxRV09SRFsxNityc3BdCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKyRMJFNFSF9lbmRfYm5fbXVseDR4X21vbnRfZ2F0aGVyNToKKworCitBTElHTgkzMgorbXVseDR4X2ludGVybmFsOgorCW1vdglRV09SRFs4K3JzcF0scjkKKwltb3YJcjEwLHI5CisJbmVnCXI5CisJc2hsCXI5LDUKKwluZWcJcjEwCisJbGVhCXIxMyxbMTI4K3I5KjErcmR4XQorCXNocglyOSw1KzUKKwltb3ZkCXhtbTUsRFdPUkRbNTYrcmF4XQorCXN1YglyOSwxCisJbGVhCXJheCxbJEwkaW5jXQorCW1vdglRV09SRFsoKDE2KzgpKStyc3BdLHIxMworCW1vdglRV09SRFsoKDI0KzgpKStyc3BdLHI5CisJbW92CVFXT1JEWygoNTYrOCkpK3JzcF0scmRpCisJbW92ZHFhCXhtbTAsWE1NV09SRFtyYXhdCisJbW92ZHFhCXhtbTEsWE1NV09SRFsxNityYXhdCisJbGVhCXIxMCxbKCg4OC0xMTIpKStyMTAqMStyc3BdCisJbGVhCXJkaSxbMTI4K3JkeF0KKworCXBzaHVmZAl4bW01LHhtbTUsMAorCW1vdmRxYQl4bW00LHhtbTEKK0RCCTB4NjcKKwltb3ZkcWEJeG1tMix4bW0xCitEQgkweDY3CisJcGFkZGQJeG1tMSx4bW0wCisJcGNtcGVxZAl4bW0wLHhtbTUKKwltb3ZkcWEJeG1tMyx4bW00CisJcGFkZGQJeG1tMix4bW0xCisJcGNtcGVxZAl4bW0xLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsxMTIrcjEwXSx4bW0wCisJbW92ZHFhCXhtbTAseG1tNAorCisJcGFkZGQJeG1tMyx4bW0yCisJcGNtcGVxZAl4bW0yLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsxMjgrcjEwXSx4bW0xCisJbW92ZHFhCXhtbTEseG1tNAorCisJcGFkZGQJeG1tMCx4bW0zCisJcGNtcGVxZAl4bW0zLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsxNDQrcjEwXSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNAorCisJcGFkZGQJeG1tMSx4bW0wCisJcGNtcGVxZAl4bW0wLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsxNjArcjEwXSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCXBhZGRkCXhtbTIseG1tMQorCXBjbXBlcWQJeG1tMSx4bW01CisJbW92ZHFhCVhNTVdPUkRbMTc2K3IxMF0seG1tMAorCW1vdmRxYQl4bW0wLHhtbTQKKworCXBhZGRkCXhtbTMseG1tMgorCXBjbXBlcWQJeG1tMix4bW01CisJbW92ZHFhCVhNTVdPUkRbMTkyK3IxMF0seG1tMQorCW1vdmRxYQl4bW0xLHhtbTQKKworCXBhZGRkCXhtbTAseG1tMworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbMjA4K3IxMF0seG1tMgorCW1vdmRxYQl4bW0yLHhtbTQKKworCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CisJbW92ZHFhCVhNTVdPUkRbMjI0K3IxMF0seG1tMworCW1vdmRxYQl4bW0zLHhtbTQKKwlwYWRkZAl4bW0yLHhtbTEKKwlwY21wZXFkCXhtbTEseG1tNQorCW1vdmRxYQlYTU1XT1JEWzI0MCtyMTBdLHhtbTAKKwltb3ZkcWEJeG1tMCx4bW00CisKKwlwYWRkZAl4bW0zLHhtbTIKKwlwY21wZXFkCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWzI1NityMTBdLHhtbTEKKwltb3ZkcWEJeG1tMSx4bW00CisKKwlwYWRkZAl4bW0wLHhtbTMKKwlwY21wZXFkCXhtbTMseG1tNQorCW1vdmRxYQlYTU1XT1JEWzI3MityMTBdLHhtbTIKKwltb3ZkcWEJeG1tMix4bW00CisKKwlwYWRkZAl4bW0xLHhtbTAKKwlwY21wZXFkCXhtbTAseG1tNQorCW1vdmRxYQlYTU1XT1JEWzI4OCtyMTBdLHhtbTMKKwltb3ZkcWEJeG1tMyx4bW00CitEQgkweDY3CisJcGFkZGQJeG1tMix4bW0xCisJcGNtcGVxZAl4bW0xLHhtbTUKKwltb3ZkcWEJWE1NV09SRFszMDQrcjEwXSx4bW0wCisKKwlwYWRkZAl4bW0zLHhtbTIKKwlwY21wZXFkCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWzMyMCtyMTBdLHhtbTEKKworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbMzM2K3IxMF0seG1tMgorCisJcGFuZAl4bW0wLFhNTVdPUkRbNjQrcmRpXQorCXBhbmQJeG1tMSxYTU1XT1JEWzgwK3JkaV0KKwlwYW5kCXhtbTIsWE1NV09SRFs5NityZGldCisJbW92ZHFhCVhNTVdPUkRbMzUyK3IxMF0seG1tMworCXBhbmQJeG1tMyxYTU1XT1JEWzExMityZGldCisJcG9yCXhtbTAseG1tMgorCXBvcgl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tNCxYTU1XT1JEWygoLTEyOCkpK3JkaV0KKwltb3ZkcWEJeG1tNSxYTU1XT1JEWygoLTExMikpK3JkaV0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWygoLTk2KSkrcmRpXQorCXBhbmQJeG1tNCxYTU1XT1JEWzExMityMTBdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsoKC04MCkpK3JkaV0KKwlwYW5kCXhtbTUsWE1NV09SRFsxMjgrcjEwXQorCXBvcgl4bW0wLHhtbTQKKwlwYW5kCXhtbTIsWE1NV09SRFsxNDQrcjEwXQorCXBvcgl4bW0xLHhtbTUKKwlwYW5kCXhtbTMsWE1NV09SRFsxNjArcjEwXQorCXBvcgl4bW0wLHhtbTIKKwlwb3IJeG1tMSx4bW0zCisJbW92ZHFhCXhtbTQsWE1NV09SRFsoKC02NCkpK3JkaV0KKwltb3ZkcWEJeG1tNSxYTU1XT1JEWygoLTQ4KSkrcmRpXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbKCgtMzIpKStyZGldCisJcGFuZAl4bW00LFhNTVdPUkRbMTc2K3IxMF0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWygoLTE2KSkrcmRpXQorCXBhbmQJeG1tNSxYTU1XT1JEWzE5MityMTBdCisJcG9yCXhtbTAseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzIwOCtyMTBdCisJcG9yCXhtbTEseG1tNQorCXBhbmQJeG1tMyxYTU1XT1JEWzIyNCtyMTBdCisJcG9yCXhtbTAseG1tMgorCXBvcgl4bW0xLHhtbTMKKwltb3ZkcWEJeG1tNCxYTU1XT1JEW3JkaV0KKwltb3ZkcWEJeG1tNSxYTU1XT1JEWzE2K3JkaV0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWzMyK3JkaV0KKwlwYW5kCXhtbTQsWE1NV09SRFsyNDArcjEwXQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbNDgrcmRpXQorCXBhbmQJeG1tNSxYTU1XT1JEWzI1NityMTBdCisJcG9yCXhtbTAseG1tNAorCXBhbmQJeG1tMixYTU1XT1JEWzI3MityMTBdCisJcG9yCXhtbTEseG1tNQorCXBhbmQJeG1tMyxYTU1XT1JEWzI4OCtyMTBdCisJcG9yCXhtbTAseG1tMgorCXBvcgl4bW0xLHhtbTMKKwlweG9yCXhtbTAseG1tMQorCXBzaHVmZAl4bW0xLHhtbTAsMHg0ZQorCXBvcgl4bW0wLHhtbTEKKwlsZWEJcmRpLFsyNTYrcmRpXQorREIJMTAyLDcyLDE1LDEyNiwxOTQKKwlsZWEJcmJ4LFsoKDY0KzMyKzgpKStyc3BdCisKKwltb3YJcjkscmR4CisJbXVseAlyYXgscjgsUVdPUkRbcnNpXQorCW11bHgJcjEyLHIxMSxRV09SRFs4K3JzaV0KKwlhZGQJcjExLHJheAorCW11bHgJcjEzLHJheCxRV09SRFsxNityc2ldCisJYWRjCXIxMixyYXgKKwlhZGMJcjEzLDAKKwltdWx4CXIxNCxyYXgsUVdPUkRbMjQrcnNpXQorCisJbW92CXIxNSxyOAorCWltdWwJcjgsUVdPUkRbKCgzMis4KSkrcnNwXQorCXhvcglyYnAscmJwCisJbW92CXJkeCxyOAorCisJbW92CVFXT1JEWygoOCs4KSkrcnNwXSxyZGkKKworCWxlYQlyc2ksWzMyK3JzaV0KKwlhZGN4CXIxMyxyYXgKKwlhZGN4CXIxNCxyYnAKKworCW11bHgJcjEwLHJheCxRV09SRFtyY3hdCisJYWRjeAlyMTUscmF4CisJYWRveAlyMTAscjExCisJbXVseAlyMTEscmF4LFFXT1JEWzgrcmN4XQorCWFkY3gJcjEwLHJheAorCWFkb3gJcjExLHIxMgorCW11bHgJcjEyLHJheCxRV09SRFsxNityY3hdCisJbW92CXJkaSxRV09SRFsoKDI0KzgpKStyc3BdCisJbW92CVFXT1JEWygoLTMyKSkrcmJ4XSxyMTAKKwlhZGN4CXIxMSxyYXgKKwlhZG94CXIxMixyMTMKKwltdWx4CXIxNSxyYXgsUVdPUkRbMjQrcmN4XQorCW1vdglyZHgscjkKKwltb3YJUVdPUkRbKCgtMjQpKStyYnhdLHIxMQorCWFkY3gJcjEyLHJheAorCWFkb3gJcjE1LHJicAorCWxlYQlyY3gsWzMyK3JjeF0KKwltb3YJUVdPUkRbKCgtMTYpKStyYnhdLHIxMgorCWptcAlORUFSICRMJG11bHg0eF8xc3QKKworQUxJR04JMzIKKyRMJG11bHg0eF8xc3Q6CisJYWRjeAlyMTUscmJwCisJbXVseAlyYXgscjEwLFFXT1JEW3JzaV0KKwlhZGN4CXIxMCxyMTQKKwltdWx4CXIxNCxyMTEsUVdPUkRbOCtyc2ldCisJYWRjeAlyMTEscmF4CisJbXVseAlyYXgscjEyLFFXT1JEWzE2K3JzaV0KKwlhZGN4CXIxMixyMTQKKwltdWx4CXIxNCxyMTMsUVdPUkRbMjQrcnNpXQorREIJMHg2NywweDY3CisJbW92CXJkeCxyOAorCWFkY3gJcjEzLHJheAorCWFkY3gJcjE0LHJicAorCWxlYQlyc2ksWzMyK3JzaV0KKwlsZWEJcmJ4LFszMityYnhdCisKKwlhZG94CXIxMCxyMTUKKwltdWx4CXIxNSxyYXgsUVdPUkRbcmN4XQorCWFkY3gJcjEwLHJheAorCWFkb3gJcjExLHIxNQorCW11bHgJcjE1LHJheCxRV09SRFs4K3JjeF0KKwlhZGN4CXIxMSxyYXgKKwlhZG94CXIxMixyMTUKKwltdWx4CXIxNSxyYXgsUVdPUkRbMTYrcmN4XQorCW1vdglRV09SRFsoKC00MCkpK3JieF0scjEwCisJYWRjeAlyMTIscmF4CisJbW92CVFXT1JEWygoLTMyKSkrcmJ4XSxyMTEKKwlhZG94CXIxMyxyMTUKKwltdWx4CXIxNSxyYXgsUVdPUkRbMjQrcmN4XQorCW1vdglyZHgscjkKKwltb3YJUVdPUkRbKCgtMjQpKStyYnhdLHIxMgorCWFkY3gJcjEzLHJheAorCWFkb3gJcjE1LHJicAorCWxlYQlyY3gsWzMyK3JjeF0KKwltb3YJUVdPUkRbKCgtMTYpKStyYnhdLHIxMworCisJZGVjCXJkaQorCWpueglORUFSICRMJG11bHg0eF8xc3QKKworCW1vdglyYXgsUVdPUkRbOCtyc3BdCisJYWRjCXIxNSxyYnAKKwlsZWEJcnNpLFtyYXgqMStyc2ldCisJYWRkCXIxNCxyMTUKKwltb3YJcmRpLFFXT1JEWygoOCs4KSkrcnNwXQorCWFkYwlyYnAscmJwCisJbW92CVFXT1JEWygoLTgpKStyYnhdLHIxNAorCWptcAlORUFSICRMJG11bHg0eF9vdXRlcgorCitBTElHTgkzMgorJEwkbXVseDR4X291dGVyOgorCWxlYQlyMTAsWygoMTYtMjU2KSkrcmJ4XQorCXB4b3IJeG1tNCx4bW00CitEQgkweDY3LDB4NjcKKwlweG9yCXhtbTUseG1tNQorCW1vdmRxYQl4bW0wLFhNTVdPUkRbKCgtMTI4KSkrcmRpXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbKCgtMTEyKSkrcmRpXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbKCgtOTYpKStyZGldCisJcGFuZAl4bW0wLFhNTVdPUkRbMjU2K3IxMF0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWygoLTgwKSkrcmRpXQorCXBhbmQJeG1tMSxYTU1XT1JEWzI3MityMTBdCisJcG9yCXhtbTQseG1tMAorCXBhbmQJeG1tMixYTU1XT1JEWzI4OCtyMTBdCisJcG9yCXhtbTUseG1tMQorCXBhbmQJeG1tMyxYTU1XT1JEWzMwNCtyMTBdCisJcG9yCXhtbTQseG1tMgorCXBvcgl4bW01LHhtbTMKKwltb3ZkcWEJeG1tMCxYTU1XT1JEWygoLTY0KSkrcmRpXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbKCgtNDgpKStyZGldCisJbW92ZHFhCXhtbTIsWE1NV09SRFsoKC0zMikpK3JkaV0KKwlwYW5kCXhtbTAsWE1NV09SRFszMjArcjEwXQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbKCgtMTYpKStyZGldCisJcGFuZAl4bW0xLFhNTVdPUkRbMzM2K3IxMF0KKwlwb3IJeG1tNCx4bW0wCisJcGFuZAl4bW0yLFhNTVdPUkRbMzUyK3IxMF0KKwlwb3IJeG1tNSx4bW0xCisJcGFuZAl4bW0zLFhNTVdPUkRbMzY4K3IxMF0KKwlwb3IJeG1tNCx4bW0yCisJcG9yCXhtbTUseG1tMworCW1vdmRxYQl4bW0wLFhNTVdPUkRbcmRpXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbMTYrcmRpXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbMzIrcmRpXQorCXBhbmQJeG1tMCxYTU1XT1JEWzM4NCtyMTBdCisJbW92ZHFhCXhtbTMsWE1NV09SRFs0OCtyZGldCisJcGFuZAl4bW0xLFhNTVdPUkRbNDAwK3IxMF0KKwlwb3IJeG1tNCx4bW0wCisJcGFuZAl4bW0yLFhNTVdPUkRbNDE2K3IxMF0KKwlwb3IJeG1tNSx4bW0xCisJcGFuZAl4bW0zLFhNTVdPUkRbNDMyK3IxMF0KKwlwb3IJeG1tNCx4bW0yCisJcG9yCXhtbTUseG1tMworCW1vdmRxYQl4bW0wLFhNTVdPUkRbNjQrcmRpXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbODArcmRpXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbOTYrcmRpXQorCXBhbmQJeG1tMCxYTU1XT1JEWzQ0OCtyMTBdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsxMTIrcmRpXQorCXBhbmQJeG1tMSxYTU1XT1JEWzQ2NCtyMTBdCisJcG9yCXhtbTQseG1tMAorCXBhbmQJeG1tMixYTU1XT1JEWzQ4MCtyMTBdCisJcG9yCXhtbTUseG1tMQorCXBhbmQJeG1tMyxYTU1XT1JEWzQ5NityMTBdCisJcG9yCXhtbTQseG1tMgorCXBvcgl4bW01LHhtbTMKKwlwb3IJeG1tNCx4bW01CisJcHNodWZkCXhtbTAseG1tNCwweDRlCisJcG9yCXhtbTAseG1tNAorCWxlYQlyZGksWzI1NityZGldCitEQgkxMDIsNzIsMTUsMTI2LDE5NAorCisJbW92CVFXT1JEW3JieF0scmJwCisJbGVhCXJieCxbMzIrcmF4KjErcmJ4XQorCW11bHgJcjExLHI4LFFXT1JEW3JzaV0KKwl4b3IJcmJwLHJicAorCW1vdglyOSxyZHgKKwltdWx4CXIxMixyMTQsUVdPUkRbOCtyc2ldCisJYWRveAlyOCxRV09SRFsoKC0zMikpK3JieF0KKwlhZGN4CXIxMSxyMTQKKwltdWx4CXIxMyxyMTUsUVdPUkRbMTYrcnNpXQorCWFkb3gJcjExLFFXT1JEWygoLTI0KSkrcmJ4XQorCWFkY3gJcjEyLHIxNQorCW11bHgJcjE0LHJkeCxRV09SRFsyNCtyc2ldCisJYWRveAlyMTIsUVdPUkRbKCgtMTYpKStyYnhdCisJYWRjeAlyMTMscmR4CisJbGVhCXJjeCxbcmF4KjErcmN4XQorCWxlYQlyc2ksWzMyK3JzaV0KKwlhZG94CXIxMyxRV09SRFsoKC04KSkrcmJ4XQorCWFkY3gJcjE0LHJicAorCWFkb3gJcjE0LHJicAorCisJbW92CXIxNSxyOAorCWltdWwJcjgsUVdPUkRbKCgzMis4KSkrcnNwXQorCisJbW92CXJkeCxyOAorCXhvcglyYnAscmJwCisJbW92CVFXT1JEWygoOCs4KSkrcnNwXSxyZGkKKworCW11bHgJcjEwLHJheCxRV09SRFtyY3hdCisJYWRjeAlyMTUscmF4CisJYWRveAlyMTAscjExCisJbXVseAlyMTEscmF4LFFXT1JEWzgrcmN4XQorCWFkY3gJcjEwLHJheAorCWFkb3gJcjExLHIxMgorCW11bHgJcjEyLHJheCxRV09SRFsxNityY3hdCisJYWRjeAlyMTEscmF4CisJYWRveAlyMTIscjEzCisJbXVseAlyMTUscmF4LFFXT1JEWzI0K3JjeF0KKwltb3YJcmR4LHI5CisJbW92CXJkaSxRV09SRFsoKDI0KzgpKStyc3BdCisJbW92CVFXT1JEWygoLTMyKSkrcmJ4XSxyMTAKKwlhZGN4CXIxMixyYXgKKwltb3YJUVdPUkRbKCgtMjQpKStyYnhdLHIxMQorCWFkb3gJcjE1LHJicAorCW1vdglRV09SRFsoKC0xNikpK3JieF0scjEyCisJbGVhCXJjeCxbMzIrcmN4XQorCWptcAlORUFSICRMJG11bHg0eF9pbm5lcgorCitBTElHTgkzMgorJEwkbXVseDR4X2lubmVyOgorCW11bHgJcmF4LHIxMCxRV09SRFtyc2ldCisJYWRjeAlyMTUscmJwCisJYWRveAlyMTAscjE0CisJbXVseAlyMTQscjExLFFXT1JEWzgrcnNpXQorCWFkY3gJcjEwLFFXT1JEW3JieF0KKwlhZG94CXIxMSxyYXgKKwltdWx4CXJheCxyMTIsUVdPUkRbMTYrcnNpXQorCWFkY3gJcjExLFFXT1JEWzgrcmJ4XQorCWFkb3gJcjEyLHIxNAorCW11bHgJcjE0LHIxMyxRV09SRFsyNCtyc2ldCisJbW92CXJkeCxyOAorCWFkY3gJcjEyLFFXT1JEWzE2K3JieF0KKwlhZG94CXIxMyxyYXgKKwlhZGN4CXIxMyxRV09SRFsyNCtyYnhdCisJYWRveAlyMTQscmJwCisJbGVhCXJzaSxbMzIrcnNpXQorCWxlYQlyYngsWzMyK3JieF0KKwlhZGN4CXIxNCxyYnAKKworCWFkb3gJcjEwLHIxNQorCW11bHgJcjE1LHJheCxRV09SRFtyY3hdCisJYWRjeAlyMTAscmF4CisJYWRveAlyMTEscjE1CisJbXVseAlyMTUscmF4LFFXT1JEWzgrcmN4XQorCWFkY3gJcjExLHJheAorCWFkb3gJcjEyLHIxNQorCW11bHgJcjE1LHJheCxRV09SRFsxNityY3hdCisJbW92CVFXT1JEWygoLTQwKSkrcmJ4XSxyMTAKKwlhZGN4CXIxMixyYXgKKwlhZG94CXIxMyxyMTUKKwltb3YJUVdPUkRbKCgtMzIpKStyYnhdLHIxMQorCW11bHgJcjE1LHJheCxRV09SRFsyNCtyY3hdCisJbW92CXJkeCxyOQorCWxlYQlyY3gsWzMyK3JjeF0KKwltb3YJUVdPUkRbKCgtMjQpKStyYnhdLHIxMgorCWFkY3gJcjEzLHJheAorCWFkb3gJcjE1LHJicAorCW1vdglRV09SRFsoKC0xNikpK3JieF0scjEzCisKKwlkZWMJcmRpCisJam56CU5FQVIgJEwkbXVseDR4X2lubmVyCisKKwltb3YJcmF4LFFXT1JEWygoMCs4KSkrcnNwXQorCWFkYwlyMTUscmJwCisJc3ViCXJkaSxRV09SRFtyYnhdCisJbW92CXJkaSxRV09SRFsoKDgrOCkpK3JzcF0KKwltb3YJcjEwLFFXT1JEWygoMTYrOCkpK3JzcF0KKwlhZGMJcjE0LHIxNQorCWxlYQlyc2ksW3JheCoxK3JzaV0KKwlhZGMJcmJwLHJicAorCW1vdglRV09SRFsoKC04KSkrcmJ4XSxyMTQKKworCWNtcAlyZGkscjEwCisJamIJTkVBUiAkTCRtdWx4NHhfb3V0ZXIKKworCW1vdglyMTAsUVdPUkRbKCgtOCkpK3JjeF0KKwltb3YJcjgscmJwCisJbW92CXIxMixRV09SRFtyYXgqMStyY3hdCisJbGVhCXJicCxbcmF4KjErcmN4XQorCW1vdglyY3gscmF4CisJbGVhCXJkaSxbcmF4KjErcmJ4XQorCXhvcgllYXgsZWF4CisJeG9yCXIxNSxyMTUKKwlzdWIJcjEwLHIxNAorCWFkYwlyMTUscjE1CisJb3IJcjgscjE1CisJc2FyCXJjeCwzKzIKKwlzdWIJcmF4LHI4CisJbW92CXJkeCxRV09SRFsoKDU2KzgpKStyc3BdCisJZGVjCXIxMgorCW1vdglyMTMsUVdPUkRbOCtyYnBdCisJeG9yCXI4LHI4CisJbW92CXIxNCxRV09SRFsxNityYnBdCisJbW92CXIxNSxRV09SRFsyNCtyYnBdCisJam1wCU5FQVIgJEwkc3FyeDR4X3N1Yl9lbnRyeQorCisKK0FMSUdOCTMyCitibl9wb3dlcng1OgorCW1vdglRV09SRFs4K3JzcF0scmRpCTtXSU42NCBwcm9sb2d1ZQorCW1vdglRV09SRFsxNityc3BdLHJzaQorCW1vdglyYXgscnNwCiskTCRTRUhfYmVnaW5fYm5fcG93ZXJ4NToKKwltb3YJcmRpLHJjeAorCW1vdglyc2kscmR4CisJbW92CXJkeCxyOAorCW1vdglyY3gscjkKKwltb3YJcjgsUVdPUkRbNDArcnNwXQorCW1vdglyOSxRV09SRFs0OCtyc3BdCisKKworCisJbW92CXJheCxyc3AKKworJEwkcG93ZXJ4NV9lbnRlcjoKKwlwdXNoCXJieAorCisJcHVzaAlyYnAKKworCXB1c2gJcjEyCisKKwlwdXNoCXIxMworCisJcHVzaAlyMTQKKworCXB1c2gJcjE1CisKKyRMJHBvd2VyeDVfcHJvbG9ndWU6CisKKwlzaGwJcjlkLDMKKwlsZWEJcjEwLFtyOSoyK3I5XQorCW5lZwlyOQorCW1vdglyOCxRV09SRFtyOF0KKworCisKKworCisKKworCisJbGVhCXIxMSxbKCgtMzIwKSkrcjkqMityc3BdCisJbW92CXJicCxyc3AKKwlzdWIJcjExLHJkaQorCWFuZAlyMTEsNDA5NQorCWNtcAlyMTAscjExCisJamIJTkVBUiAkTCRwd3J4X3NwX2FsdAorCXN1YglyYnAscjExCisJbGVhCXJicCxbKCgtMzIwKSkrcjkqMityYnBdCisJam1wCU5FQVIgJEwkcHdyeF9zcF9kb25lCisKK0FMSUdOCTMyCiskTCRwd3J4X3NwX2FsdDoKKwlsZWEJcjEwLFsoKDQwOTYtMzIwKSkrcjkqMl0KKwlsZWEJcmJwLFsoKC0zMjApKStyOSoyK3JicF0KKwlzdWIJcjExLHIxMAorCW1vdglyMTAsMAorCWNtb3ZjCXIxMSxyMTAKKwlzdWIJcmJwLHIxMQorJEwkcHdyeF9zcF9kb25lOgorCWFuZAlyYnAsLTY0CisJbW92CXIxMSxyc3AKKwlzdWIJcjExLHJicAorCWFuZAlyMTEsLTQwOTYKKwlsZWEJcnNwLFtyYnAqMStyMTFdCisJbW92CXIxMCxRV09SRFtyc3BdCisJY21wCXJzcCxyYnAKKwlqYQlORUFSICRMJHB3cnhfcGFnZV93YWxrCisJam1wCU5FQVIgJEwkcHdyeF9wYWdlX3dhbGtfZG9uZQorCiskTCRwd3J4X3BhZ2Vfd2FsazoKKwlsZWEJcnNwLFsoKC00MDk2KSkrcnNwXQorCW1vdglyMTAsUVdPUkRbcnNwXQorCWNtcAlyc3AscmJwCisJamEJTkVBUiAkTCRwd3J4X3BhZ2Vfd2FsaworJEwkcHdyeF9wYWdlX3dhbGtfZG9uZToKKworCW1vdglyMTAscjkKKwluZWcJcjkKKworCisKKworCisKKworCisKKworCisKKwlweG9yCXhtbTAseG1tMAorREIJMTAyLDcyLDE1LDExMCwyMDcKK0RCCTEwMiw3MiwxNSwxMTAsMjA5CitEQgkxMDIsNzMsMTUsMTEwLDIxOAorREIJMTAyLDcyLDE1LDExMCwyMjYKKwltb3YJUVdPUkRbMzIrcnNwXSxyOAorCW1vdglRV09SRFs0MCtyc3BdLHJheAorCiskTCRwb3dlcng1X2JvZHk6CisKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKwljYWxsCV9fYm5fc3FyeDh4X2ludGVybmFsCisJY2FsbAlfX2JuX3Bvc3R4NHhfaW50ZXJuYWwKKworCW1vdglyOSxyMTAKKwltb3YJcmRpLHJzaQorREIJMTAyLDcyLDE1LDEyNiwyMDkKK0RCCTEwMiw3MiwxNSwxMjYsMjI2CisJbW92CXJheCxRV09SRFs0MCtyc3BdCisKKwljYWxsCW11bHg0eF9pbnRlcm5hbAorCisJbW92CXJzaSxRV09SRFs0MCtyc3BdCisKKwltb3YJcmF4LDEKKworCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyc2ldCisKKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcnNpXQorCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JzaV0KKworCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyc2ldCisKKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcnNpXQorCisJbW92CXJieCxRV09SRFsoKC04KSkrcnNpXQorCisJbGVhCXJzcCxbcnNpXQorCiskTCRwb3dlcng1X2VwaWxvZ3VlOgorCW1vdglyZGksUVdPUkRbOCtyc3BdCTtXSU42NCBlcGlsb2d1ZQorCW1vdglyc2ksUVdPUkRbMTYrcnNwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorCiskTCRTRUhfZW5kX2JuX3Bvd2VyeDU6CisKK2dsb2JhbAlibl9zcXJ4OHhfaW50ZXJuYWwKKworCitBTElHTgkzMgorYm5fc3FyeDh4X2ludGVybmFsOgorX19ibl9zcXJ4OHhfaW50ZXJuYWw6CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwlsZWEJcmRpLFsoKDQ4KzgpKStyc3BdCisJbGVhCXJicCxbcjkqMStyc2ldCisJbW92CVFXT1JEWygoMCs4KSkrcnNwXSxyOQorCW1vdglRV09SRFsoKDgrOCkpK3JzcF0scmJwCisJam1wCU5FQVIgJEwkc3FyOHhfemVyb19zdGFydAorCitBTElHTgkzMgorREIJMHg2NiwweDY2LDB4NjYsMHgyZSwweDBmLDB4MWYsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKyRMJHNxcng4eF96ZXJvOgorREIJMHgzZQorCW1vdmRxYQlYTU1XT1JEW3JkaV0seG1tMAorCW1vdmRxYQlYTU1XT1JEWzE2K3JkaV0seG1tMAorCW1vdmRxYQlYTU1XT1JEWzMyK3JkaV0seG1tMAorCW1vdmRxYQlYTU1XT1JEWzQ4K3JkaV0seG1tMAorJEwkc3FyOHhfemVyb19zdGFydDoKKwltb3ZkcWEJWE1NV09SRFs2NCtyZGldLHhtbTAKKwltb3ZkcWEJWE1NV09SRFs4MCtyZGldLHhtbTAKKwltb3ZkcWEJWE1NV09SRFs5NityZGldLHhtbTAKKwltb3ZkcWEJWE1NV09SRFsxMTIrcmRpXSx4bW0wCisJbGVhCXJkaSxbMTI4K3JkaV0KKwlzdWIJcjksNjQKKwlqbnoJTkVBUiAkTCRzcXJ4OHhfemVybworCisJbW92CXJkeCxRV09SRFtyc2ldCisKKwl4b3IJcjEwLHIxMAorCXhvcglyMTEscjExCisJeG9yCXIxMixyMTIKKwl4b3IJcjEzLHIxMworCXhvcglyMTQscjE0CisJeG9yCXIxNSxyMTUKKwlsZWEJcmRpLFsoKDQ4KzgpKStyc3BdCisJeG9yCXJicCxyYnAKKwlqbXAJTkVBUiAkTCRzcXJ4OHhfb3V0ZXJfbG9vcAorCitBTElHTgkzMgorJEwkc3FyeDh4X291dGVyX2xvb3A6CisJbXVseAlyYXgscjgsUVdPUkRbOCtyc2ldCisJYWRjeAlyOCxyOQorCWFkb3gJcjEwLHJheAorCW11bHgJcmF4LHI5LFFXT1JEWzE2K3JzaV0KKwlhZGN4CXI5LHIxMAorCWFkb3gJcjExLHJheAorREIJMHhjNCwweGUyLDB4YWIsMHhmNiwweDg2LDB4MTgsMHgwMCwweDAwLDB4MDAKKwlhZGN4CXIxMCxyMTEKKwlhZG94CXIxMixyYXgKK0RCCTB4YzQsMHhlMiwweGEzLDB4ZjYsMHg4NiwweDIwLDB4MDAsMHgwMCwweDAwCisJYWRjeAlyMTEscjEyCisJYWRveAlyMTMscmF4CisJbXVseAlyYXgscjEyLFFXT1JEWzQwK3JzaV0KKwlhZGN4CXIxMixyMTMKKwlhZG94CXIxNCxyYXgKKwltdWx4CXJheCxyMTMsUVdPUkRbNDgrcnNpXQorCWFkY3gJcjEzLHIxNAorCWFkb3gJcmF4LHIxNQorCW11bHgJcjE1LHIxNCxRV09SRFs1Nityc2ldCisJbW92CXJkeCxRV09SRFs4K3JzaV0KKwlhZGN4CXIxNCxyYXgKKwlhZG94CXIxNSxyYnAKKwlhZGMJcjE1LFFXT1JEWzY0K3JkaV0KKwltb3YJUVdPUkRbOCtyZGldLHI4CisJbW92CVFXT1JEWzE2K3JkaV0scjkKKwlzYmIJcmN4LHJjeAorCXhvcglyYnAscmJwCisKKworCW11bHgJcmJ4LHI4LFFXT1JEWzE2K3JzaV0KKwltdWx4CXJheCxyOSxRV09SRFsyNCtyc2ldCisJYWRjeAlyOCxyMTAKKwlhZG94CXI5LHJieAorCW11bHgJcmJ4LHIxMCxRV09SRFszMityc2ldCisJYWRjeAlyOSxyMTEKKwlhZG94CXIxMCxyYXgKK0RCCTB4YzQsMHhlMiwweGEzLDB4ZjYsMHg4NiwweDI4LDB4MDAsMHgwMCwweDAwCisJYWRjeAlyMTAscjEyCisJYWRveAlyMTEscmJ4CitEQgkweGM0LDB4ZTIsMHg5YiwweGY2LDB4OWUsMHgzMCwweDAwLDB4MDAsMHgwMAorCWFkY3gJcjExLHIxMworCWFkb3gJcjEyLHIxNAorREIJMHhjNCwweDYyLDB4OTMsMHhmNiwweGI2LDB4MzgsMHgwMCwweDAwLDB4MDAKKwltb3YJcmR4LFFXT1JEWzE2K3JzaV0KKwlhZGN4CXIxMixyYXgKKwlhZG94CXIxMyxyYngKKwlhZGN4CXIxMyxyMTUKKwlhZG94CXIxNCxyYnAKKwlhZGN4CXIxNCxyYnAKKworCW1vdglRV09SRFsyNCtyZGldLHI4CisJbW92CVFXT1JEWzMyK3JkaV0scjkKKworCW11bHgJcmJ4LHI4LFFXT1JEWzI0K3JzaV0KKwltdWx4CXJheCxyOSxRV09SRFszMityc2ldCisJYWRjeAlyOCxyMTAKKwlhZG94CXI5LHJieAorCW11bHgJcmJ4LHIxMCxRV09SRFs0MCtyc2ldCisJYWRjeAlyOSxyMTEKKwlhZG94CXIxMCxyYXgKK0RCCTB4YzQsMHhlMiwweGEzLDB4ZjYsMHg4NiwweDMwLDB4MDAsMHgwMCwweDAwCisJYWRjeAlyMTAscjEyCisJYWRveAlyMTEscjEzCitEQgkweGM0LDB4NjIsMHg5YiwweGY2LDB4YWUsMHgzOCwweDAwLDB4MDAsMHgwMAorREIJMHgzZQorCW1vdglyZHgsUVdPUkRbMjQrcnNpXQorCWFkY3gJcjExLHJieAorCWFkb3gJcjEyLHJheAorCWFkY3gJcjEyLHIxNAorCW1vdglRV09SRFs0MCtyZGldLHI4CisJbW92CVFXT1JEWzQ4K3JkaV0scjkKKwltdWx4CXJheCxyOCxRV09SRFszMityc2ldCisJYWRveAlyMTMscmJwCisJYWRjeAlyMTMscmJwCisKKwltdWx4CXJieCxyOSxRV09SRFs0MCtyc2ldCisJYWRjeAlyOCxyMTAKKwlhZG94CXI5LHJheAorCW11bHgJcmF4LHIxMCxRV09SRFs0OCtyc2ldCisJYWRjeAlyOSxyMTEKKwlhZG94CXIxMCxyMTIKKwltdWx4CXIxMixyMTEsUVdPUkRbNTYrcnNpXQorCW1vdglyZHgsUVdPUkRbMzIrcnNpXQorCW1vdglyMTQsUVdPUkRbNDArcnNpXQorCWFkY3gJcjEwLHJieAorCWFkb3gJcjExLHJheAorCW1vdglyMTUsUVdPUkRbNDgrcnNpXQorCWFkY3gJcjExLHIxMworCWFkb3gJcjEyLHJicAorCWFkY3gJcjEyLHJicAorCisJbW92CVFXT1JEWzU2K3JkaV0scjgKKwltb3YJUVdPUkRbNjQrcmRpXSxyOQorCisJbXVseAlyYXgscjkscjE0CisJbW92CXI4LFFXT1JEWzU2K3JzaV0KKwlhZGN4CXI5LHIxMAorCW11bHgJcmJ4LHIxMCxyMTUKKwlhZG94CXIxMCxyYXgKKwlhZGN4CXIxMCxyMTEKKwltdWx4CXJheCxyMTEscjgKKwltb3YJcmR4LHIxNAorCWFkb3gJcjExLHJieAorCWFkY3gJcjExLHIxMgorCisJYWRjeAlyYXgscmJwCisKKwltdWx4CXJieCxyMTQscjE1CisJbXVseAlyMTMscjEyLHI4CisJbW92CXJkeCxyMTUKKwlsZWEJcnNpLFs2NCtyc2ldCisJYWRjeAlyMTEscjE0CisJYWRveAlyMTIscmJ4CisJYWRjeAlyMTIscmF4CisJYWRveAlyMTMscmJwCisKK0RCCTB4NjcsMHg2NworCW11bHgJcjE0LHI4LHI4CisJYWRjeAlyMTMscjgKKwlhZGN4CXIxNCxyYnAKKworCWNtcAlyc2ksUVdPUkRbKCg4KzgpKStyc3BdCisJamUJTkVBUiAkTCRzcXJ4OHhfb3V0ZXJfYnJlYWsKKworCW5lZwlyY3gKKwltb3YJcmN4LC04CisJbW92CXIxNSxyYnAKKwltb3YJcjgsUVdPUkRbNjQrcmRpXQorCWFkY3gJcjksUVdPUkRbNzIrcmRpXQorCWFkY3gJcjEwLFFXT1JEWzgwK3JkaV0KKwlhZGN4CXIxMSxRV09SRFs4OCtyZGldCisJYWRjCXIxMixRV09SRFs5NityZGldCisJYWRjCXIxMyxRV09SRFsxMDQrcmRpXQorCWFkYwlyMTQsUVdPUkRbMTEyK3JkaV0KKwlhZGMJcjE1LFFXT1JEWzEyMCtyZGldCisJbGVhCXJicCxbcnNpXQorCWxlYQlyZGksWzEyOCtyZGldCisJc2JiCXJheCxyYXgKKworCW1vdglyZHgsUVdPUkRbKCgtNjQpKStyc2ldCisJbW92CVFXT1JEWygoMTYrOCkpK3JzcF0scmF4CisJbW92CVFXT1JEWygoMjQrOCkpK3JzcF0scmRpCisKKworCXhvcgllYXgsZWF4CisJam1wCU5FQVIgJEwkc3FyeDh4X2xvb3AKKworQUxJR04JMzIKKyRMJHNxcng4eF9sb29wOgorCW1vdglyYngscjgKKwltdWx4CXI4LHJheCxRV09SRFtyYnBdCisJYWRjeAlyYngscmF4CisJYWRveAlyOCxyOQorCisJbXVseAlyOSxyYXgsUVdPUkRbOCtyYnBdCisJYWRjeAlyOCxyYXgKKwlhZG94CXI5LHIxMAorCisJbXVseAlyMTAscmF4LFFXT1JEWzE2K3JicF0KKwlhZGN4CXI5LHJheAorCWFkb3gJcjEwLHIxMQorCisJbXVseAlyMTEscmF4LFFXT1JEWzI0K3JicF0KKwlhZGN4CXIxMCxyYXgKKwlhZG94CXIxMSxyMTIKKworREIJMHhjNCwweDYyLDB4ZmIsMHhmNiwweGE1LDB4MjAsMHgwMCwweDAwLDB4MDAKKwlhZGN4CXIxMSxyYXgKKwlhZG94CXIxMixyMTMKKworCW11bHgJcjEzLHJheCxRV09SRFs0MCtyYnBdCisJYWRjeAlyMTIscmF4CisJYWRveAlyMTMscjE0CisKKwltdWx4CXIxNCxyYXgsUVdPUkRbNDgrcmJwXQorCW1vdglRV09SRFtyY3gqOCtyZGldLHJieAorCW1vdgllYngsMAorCWFkY3gJcjEzLHJheAorCWFkb3gJcjE0LHIxNQorCitEQgkweGM0LDB4NjIsMHhmYiwweGY2LDB4YmQsMHgzOCwweDAwLDB4MDAsMHgwMAorCW1vdglyZHgsUVdPUkRbOCtyY3gqOCtyc2ldCisJYWRjeAlyMTQscmF4CisJYWRveAlyMTUscmJ4CisJYWRjeAlyMTUscmJ4CisKK0RCCTB4NjcKKwlpbmMJcmN4CisJam56CU5FQVIgJEwkc3FyeDh4X2xvb3AKKworCWxlYQlyYnAsWzY0K3JicF0KKwltb3YJcmN4LC04CisJY21wCXJicCxRV09SRFsoKDgrOCkpK3JzcF0KKwlqZQlORUFSICRMJHNxcng4eF9icmVhaworCisJc3ViCXJieCxRV09SRFsoKDE2KzgpKStyc3BdCitEQgkweDY2CisJbW92CXJkeCxRV09SRFsoKC02NCkpK3JzaV0KKwlhZGN4CXI4LFFXT1JEW3JkaV0KKwlhZGN4CXI5LFFXT1JEWzgrcmRpXQorCWFkYwlyMTAsUVdPUkRbMTYrcmRpXQorCWFkYwlyMTEsUVdPUkRbMjQrcmRpXQorCWFkYwlyMTIsUVdPUkRbMzIrcmRpXQorCWFkYwlyMTMsUVdPUkRbNDArcmRpXQorCWFkYwlyMTQsUVdPUkRbNDgrcmRpXQorCWFkYwlyMTUsUVdPUkRbNTYrcmRpXQorCWxlYQlyZGksWzY0K3JkaV0KK0RCCTB4NjcKKwlzYmIJcmF4LHJheAorCXhvcgllYngsZWJ4CisJbW92CVFXT1JEWygoMTYrOCkpK3JzcF0scmF4CisJam1wCU5FQVIgJEwkc3FyeDh4X2xvb3AKKworQUxJR04JMzIKKyRMJHNxcng4eF9icmVhazoKKwl4b3IJcmJwLHJicAorCXN1YglyYngsUVdPUkRbKCgxNis4KSkrcnNwXQorCWFkY3gJcjgscmJwCisJbW92CXJjeCxRV09SRFsoKDI0KzgpKStyc3BdCisJYWRjeAlyOSxyYnAKKwltb3YJcmR4LFFXT1JEW3JzaV0KKwlhZGMJcjEwLDAKKwltb3YJUVdPUkRbcmRpXSxyOAorCWFkYwlyMTEsMAorCWFkYwlyMTIsMAorCWFkYwlyMTMsMAorCWFkYwlyMTQsMAorCWFkYwlyMTUsMAorCWNtcAlyZGkscmN4CisJamUJTkVBUiAkTCRzcXJ4OHhfb3V0ZXJfbG9vcAorCisJbW92CVFXT1JEWzgrcmRpXSxyOQorCW1vdglyOSxRV09SRFs4K3JjeF0KKwltb3YJUVdPUkRbMTYrcmRpXSxyMTAKKwltb3YJcjEwLFFXT1JEWzE2K3JjeF0KKwltb3YJUVdPUkRbMjQrcmRpXSxyMTEKKwltb3YJcjExLFFXT1JEWzI0K3JjeF0KKwltb3YJUVdPUkRbMzIrcmRpXSxyMTIKKwltb3YJcjEyLFFXT1JEWzMyK3JjeF0KKwltb3YJUVdPUkRbNDArcmRpXSxyMTMKKwltb3YJcjEzLFFXT1JEWzQwK3JjeF0KKwltb3YJUVdPUkRbNDgrcmRpXSxyMTQKKwltb3YJcjE0LFFXT1JEWzQ4K3JjeF0KKwltb3YJUVdPUkRbNTYrcmRpXSxyMTUKKwltb3YJcjE1LFFXT1JEWzU2K3JjeF0KKwltb3YJcmRpLHJjeAorCWptcAlORUFSICRMJHNxcng4eF9vdXRlcl9sb29wCisKK0FMSUdOCTMyCiskTCRzcXJ4OHhfb3V0ZXJfYnJlYWs6CisJbW92CVFXT1JEWzcyK3JkaV0scjkKK0RCCTEwMiw3MiwxNSwxMjYsMjE3CisJbW92CVFXT1JEWzgwK3JkaV0scjEwCisJbW92CVFXT1JEWzg4K3JkaV0scjExCisJbW92CVFXT1JEWzk2K3JkaV0scjEyCisJbW92CVFXT1JEWzEwNCtyZGldLHIxMworCW1vdglRV09SRFsxMTIrcmRpXSxyMTQKKwlsZWEJcmRpLFsoKDQ4KzgpKStyc3BdCisJbW92CXJkeCxRV09SRFtyY3gqMStyc2ldCisKKwltb3YJcjExLFFXT1JEWzgrcmRpXQorCXhvcglyMTAscjEwCisJbW92CXI5LFFXT1JEWygoMCs4KSkrcnNwXQorCWFkb3gJcjExLHIxMQorCW1vdglyMTIsUVdPUkRbMTYrcmRpXQorCW1vdglyMTMsUVdPUkRbMjQrcmRpXQorCisKK0FMSUdOCTMyCiskTCRzcXJ4NHhfc2hpZnRfbl9hZGQ6CisJbXVseAlyYngscmF4LHJkeAorCWFkb3gJcjEyLHIxMgorCWFkY3gJcmF4LHIxMAorREIJMHg0OCwweDhiLDB4OTQsMHgwZSwweDA4LDB4MDAsMHgwMCwweDAwCitEQgkweDRjLDB4OGIsMHg5NywweDIwLDB4MDAsMHgwMCwweDAwCisJYWRveAlyMTMscjEzCisJYWRjeAlyYngscjExCisJbW92CXIxMSxRV09SRFs0MCtyZGldCisJbW92CVFXT1JEW3JkaV0scmF4CisJbW92CVFXT1JEWzgrcmRpXSxyYngKKworCW11bHgJcmJ4LHJheCxyZHgKKwlhZG94CXIxMCxyMTAKKwlhZGN4CXJheCxyMTIKKwltb3YJcmR4LFFXT1JEWzE2K3JjeCoxK3JzaV0KKwltb3YJcjEyLFFXT1JEWzQ4K3JkaV0KKwlhZG94CXIxMSxyMTEKKwlhZGN4CXJieCxyMTMKKwltb3YJcjEzLFFXT1JEWzU2K3JkaV0KKwltb3YJUVdPUkRbMTYrcmRpXSxyYXgKKwltb3YJUVdPUkRbMjQrcmRpXSxyYngKKworCW11bHgJcmJ4LHJheCxyZHgKKwlhZG94CXIxMixyMTIKKwlhZGN4CXJheCxyMTAKKwltb3YJcmR4LFFXT1JEWzI0K3JjeCoxK3JzaV0KKwlsZWEJcmN4LFszMityY3hdCisJbW92CXIxMCxRV09SRFs2NCtyZGldCisJYWRveAlyMTMscjEzCisJYWRjeAlyYngscjExCisJbW92CXIxMSxRV09SRFs3MityZGldCisJbW92CVFXT1JEWzMyK3JkaV0scmF4CisJbW92CVFXT1JEWzQwK3JkaV0scmJ4CisKKwltdWx4CXJieCxyYXgscmR4CisJYWRveAlyMTAscjEwCisJYWRjeAlyYXgscjEyCisJanJjeHoJJEwkc3FyeDR4X3NoaWZ0X25fYWRkX2JyZWFrCitEQgkweDQ4LDB4OGIsMHg5NCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAKKwlhZG94CXIxMSxyMTEKKwlhZGN4CXJieCxyMTMKKwltb3YJcjEyLFFXT1JEWzgwK3JkaV0KKwltb3YJcjEzLFFXT1JEWzg4K3JkaV0KKwltb3YJUVdPUkRbNDgrcmRpXSxyYXgKKwltb3YJUVdPUkRbNTYrcmRpXSxyYngKKwlsZWEJcmRpLFs2NCtyZGldCisJbm9wCisJam1wCU5FQVIgJEwkc3FyeDR4X3NoaWZ0X25fYWRkCisKK0FMSUdOCTMyCiskTCRzcXJ4NHhfc2hpZnRfbl9hZGRfYnJlYWs6CisJYWRjeAlyYngscjEzCisJbW92CVFXT1JEWzQ4K3JkaV0scmF4CisJbW92CVFXT1JEWzU2K3JkaV0scmJ4CisJbGVhCXJkaSxbNjQrcmRpXQorREIJMTAyLDcyLDE1LDEyNiwyMTMKK19fYm5fc3FyeDh4X3JlZHVjdGlvbjoKKwl4b3IJZWF4LGVheAorCW1vdglyYngsUVdPUkRbKCgzMis4KSkrcnNwXQorCW1vdglyZHgsUVdPUkRbKCg0OCs4KSkrcnNwXQorCWxlYQlyY3gsWygoLTY0KSkrcjkqMStyYnBdCisKKwltb3YJUVdPUkRbKCgwKzgpKStyc3BdLHJjeAorCW1vdglRV09SRFsoKDgrOCkpK3JzcF0scmRpCisKKwlsZWEJcmRpLFsoKDQ4KzgpKStyc3BdCisJam1wCU5FQVIgJEwkc3FyeDh4X3JlZHVjdGlvbl9sb29wCisKK0FMSUdOCTMyCiskTCRzcXJ4OHhfcmVkdWN0aW9uX2xvb3A6CisJbW92CXI5LFFXT1JEWzgrcmRpXQorCW1vdglyMTAsUVdPUkRbMTYrcmRpXQorCW1vdglyMTEsUVdPUkRbMjQrcmRpXQorCW1vdglyMTIsUVdPUkRbMzIrcmRpXQorCW1vdglyOCxyZHgKKwlpbXVsCXJkeCxyYngKKwltb3YJcjEzLFFXT1JEWzQwK3JkaV0KKwltb3YJcjE0LFFXT1JEWzQ4K3JkaV0KKwltb3YJcjE1LFFXT1JEWzU2K3JkaV0KKwltb3YJUVdPUkRbKCgyNCs4KSkrcnNwXSxyYXgKKworCWxlYQlyZGksWzY0K3JkaV0KKwl4b3IJcnNpLHJzaQorCW1vdglyY3gsLTgKKwlqbXAJTkVBUiAkTCRzcXJ4OHhfcmVkdWNlCisKK0FMSUdOCTMyCiskTCRzcXJ4OHhfcmVkdWNlOgorCW1vdglyYngscjgKKwltdWx4CXI4LHJheCxRV09SRFtyYnBdCisJYWRjeAlyYXgscmJ4CisJYWRveAlyOCxyOQorCisJbXVseAlyOSxyYngsUVdPUkRbOCtyYnBdCisJYWRjeAlyOCxyYngKKwlhZG94CXI5LHIxMAorCisJbXVseAlyMTAscmJ4LFFXT1JEWzE2K3JicF0KKwlhZGN4CXI5LHJieAorCWFkb3gJcjEwLHIxMQorCisJbXVseAlyMTEscmJ4LFFXT1JEWzI0K3JicF0KKwlhZGN4CXIxMCxyYngKKwlhZG94CXIxMSxyMTIKKworREIJMHhjNCwweDYyLDB4ZTMsMHhmNiwweGE1LDB4MjAsMHgwMCwweDAwLDB4MDAKKwltb3YJcmF4LHJkeAorCW1vdglyZHgscjgKKwlhZGN4CXIxMSxyYngKKwlhZG94CXIxMixyMTMKKworCW11bHgJcmR4LHJieCxRV09SRFsoKDMyKzgpKStyc3BdCisJbW92CXJkeCxyYXgKKwltb3YJUVdPUkRbKCg2NCs0OCs4KSkrcmN4KjgrcnNwXSxyYXgKKworCW11bHgJcjEzLHJheCxRV09SRFs0MCtyYnBdCisJYWRjeAlyMTIscmF4CisJYWRveAlyMTMscjE0CisKKwltdWx4CXIxNCxyYXgsUVdPUkRbNDgrcmJwXQorCWFkY3gJcjEzLHJheAorCWFkb3gJcjE0LHIxNQorCisJbXVseAlyMTUscmF4LFFXT1JEWzU2K3JicF0KKwltb3YJcmR4LHJieAorCWFkY3gJcjE0LHJheAorCWFkb3gJcjE1LHJzaQorCWFkY3gJcjE1LHJzaQorCitEQgkweDY3LDB4NjcsMHg2NworCWluYwlyY3gKKwlqbnoJTkVBUiAkTCRzcXJ4OHhfcmVkdWNlCisKKwltb3YJcmF4LHJzaQorCWNtcAlyYnAsUVdPUkRbKCgwKzgpKStyc3BdCisJamFlCU5FQVIgJEwkc3FyeDh4X25vX3RhaWwKKworCW1vdglyZHgsUVdPUkRbKCg0OCs4KSkrcnNwXQorCWFkZAlyOCxRV09SRFtyZGldCisJbGVhCXJicCxbNjQrcmJwXQorCW1vdglyY3gsLTgKKwlhZGN4CXI5LFFXT1JEWzgrcmRpXQorCWFkY3gJcjEwLFFXT1JEWzE2K3JkaV0KKwlhZGMJcjExLFFXT1JEWzI0K3JkaV0KKwlhZGMJcjEyLFFXT1JEWzMyK3JkaV0KKwlhZGMJcjEzLFFXT1JEWzQwK3JkaV0KKwlhZGMJcjE0LFFXT1JEWzQ4K3JkaV0KKwlhZGMJcjE1LFFXT1JEWzU2K3JkaV0KKwlsZWEJcmRpLFs2NCtyZGldCisJc2JiCXJheCxyYXgKKworCXhvcglyc2kscnNpCisJbW92CVFXT1JEWygoMTYrOCkpK3JzcF0scmF4CisJam1wCU5FQVIgJEwkc3FyeDh4X3RhaWwKKworQUxJR04JMzIKKyRMJHNxcng4eF90YWlsOgorCW1vdglyYngscjgKKwltdWx4CXI4LHJheCxRV09SRFtyYnBdCisJYWRjeAlyYngscmF4CisJYWRveAlyOCxyOQorCisJbXVseAlyOSxyYXgsUVdPUkRbOCtyYnBdCisJYWRjeAlyOCxyYXgKKwlhZG94CXI5LHIxMAorCisJbXVseAlyMTAscmF4LFFXT1JEWzE2K3JicF0KKwlhZGN4CXI5LHJheAorCWFkb3gJcjEwLHIxMQorCisJbXVseAlyMTEscmF4LFFXT1JEWzI0K3JicF0KKwlhZGN4CXIxMCxyYXgKKwlhZG94CXIxMSxyMTIKKworREIJMHhjNCwweDYyLDB4ZmIsMHhmNiwweGE1LDB4MjAsMHgwMCwweDAwLDB4MDAKKwlhZGN4CXIxMSxyYXgKKwlhZG94CXIxMixyMTMKKworCW11bHgJcjEzLHJheCxRV09SRFs0MCtyYnBdCisJYWRjeAlyMTIscmF4CisJYWRveAlyMTMscjE0CisKKwltdWx4CXIxNCxyYXgsUVdPUkRbNDgrcmJwXQorCWFkY3gJcjEzLHJheAorCWFkb3gJcjE0LHIxNQorCisJbXVseAlyMTUscmF4LFFXT1JEWzU2K3JicF0KKwltb3YJcmR4LFFXT1JEWygoNzIrNDgrOCkpK3JjeCo4K3JzcF0KKwlhZGN4CXIxNCxyYXgKKwlhZG94CXIxNSxyc2kKKwltb3YJUVdPUkRbcmN4KjgrcmRpXSxyYngKKwltb3YJcmJ4LHI4CisJYWRjeAlyMTUscnNpCisKKwlpbmMJcmN4CisJam56CU5FQVIgJEwkc3FyeDh4X3RhaWwKKworCWNtcAlyYnAsUVdPUkRbKCgwKzgpKStyc3BdCisJamFlCU5FQVIgJEwkc3FyeDh4X3RhaWxfZG9uZQorCisJc3ViCXJzaSxRV09SRFsoKDE2KzgpKStyc3BdCisJbW92CXJkeCxRV09SRFsoKDQ4KzgpKStyc3BdCisJbGVhCXJicCxbNjQrcmJwXQorCWFkYwlyOCxRV09SRFtyZGldCisJYWRjCXI5LFFXT1JEWzgrcmRpXQorCWFkYwlyMTAsUVdPUkRbMTYrcmRpXQorCWFkYwlyMTEsUVdPUkRbMjQrcmRpXQorCWFkYwlyMTIsUVdPUkRbMzIrcmRpXQorCWFkYwlyMTMsUVdPUkRbNDArcmRpXQorCWFkYwlyMTQsUVdPUkRbNDgrcmRpXQorCWFkYwlyMTUsUVdPUkRbNTYrcmRpXQorCWxlYQlyZGksWzY0K3JkaV0KKwlzYmIJcmF4LHJheAorCXN1YglyY3gsOAorCisJeG9yCXJzaSxyc2kKKwltb3YJUVdPUkRbKCgxNis4KSkrcnNwXSxyYXgKKwlqbXAJTkVBUiAkTCRzcXJ4OHhfdGFpbAorCitBTElHTgkzMgorJEwkc3FyeDh4X3RhaWxfZG9uZToKKwl4b3IJcmF4LHJheAorCWFkZAlyOCxRV09SRFsoKDI0KzgpKStyc3BdCisJYWRjCXI5LDAKKwlhZGMJcjEwLDAKKwlhZGMJcjExLDAKKwlhZGMJcjEyLDAKKwlhZGMJcjEzLDAKKwlhZGMJcjE0LDAKKwlhZGMJcjE1LDAKKwlhZGMJcmF4LDAKKworCXN1Yglyc2ksUVdPUkRbKCgxNis4KSkrcnNwXQorJEwkc3FyeDh4X25vX3RhaWw6CisJYWRjCXI4LFFXT1JEW3JkaV0KK0RCCTEwMiw3MiwxNSwxMjYsMjE3CisJYWRjCXI5LFFXT1JEWzgrcmRpXQorCW1vdglyc2ksUVdPUkRbNTYrcmJwXQorREIJMTAyLDcyLDE1LDEyNiwyMTMKKwlhZGMJcjEwLFFXT1JEWzE2K3JkaV0KKwlhZGMJcjExLFFXT1JEWzI0K3JkaV0KKwlhZGMJcjEyLFFXT1JEWzMyK3JkaV0KKwlhZGMJcjEzLFFXT1JEWzQwK3JkaV0KKwlhZGMJcjE0LFFXT1JEWzQ4K3JkaV0KKwlhZGMJcjE1LFFXT1JEWzU2K3JkaV0KKwlhZGMJcmF4LDAKKworCW1vdglyYngsUVdPUkRbKCgzMis4KSkrcnNwXQorCW1vdglyZHgsUVdPUkRbNjQrcmN4KjErcmRpXQorCisJbW92CVFXT1JEW3JkaV0scjgKKwlsZWEJcjgsWzY0K3JkaV0KKwltb3YJUVdPUkRbOCtyZGldLHI5CisJbW92CVFXT1JEWzE2K3JkaV0scjEwCisJbW92CVFXT1JEWzI0K3JkaV0scjExCisJbW92CVFXT1JEWzMyK3JkaV0scjEyCisJbW92CVFXT1JEWzQwK3JkaV0scjEzCisJbW92CVFXT1JEWzQ4K3JkaV0scjE0CisJbW92CVFXT1JEWzU2K3JkaV0scjE1CisKKwlsZWEJcmRpLFs2NCtyY3gqMStyZGldCisJY21wCXI4LFFXT1JEWygoOCs4KSkrcnNwXQorCWpiCU5FQVIgJEwkc3FyeDh4X3JlZHVjdGlvbl9sb29wCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK0FMSUdOCTMyCitfX2JuX3Bvc3R4NHhfaW50ZXJuYWw6CisJbW92CXIxMixRV09SRFtyYnBdCisJbW92CXIxMCxyY3gKKwltb3YJcjkscmN4CisJbmVnCXJheAorCXNhcglyY3gsMysyCisKK0RCCTEwMiw3MiwxNSwxMjYsMjAyCitEQgkxMDIsNzIsMTUsMTI2LDIwNgorCWRlYwlyMTIKKwltb3YJcjEzLFFXT1JEWzgrcmJwXQorCXhvcglyOCxyOAorCW1vdglyMTQsUVdPUkRbMTYrcmJwXQorCW1vdglyMTUsUVdPUkRbMjQrcmJwXQorCWptcAlORUFSICRMJHNxcng0eF9zdWJfZW50cnkKKworQUxJR04JMTYKKyRMJHNxcng0eF9zdWI6CisJbW92CXIxMixRV09SRFtyYnBdCisJbW92CXIxMyxRV09SRFs4K3JicF0KKwltb3YJcjE0LFFXT1JEWzE2K3JicF0KKwltb3YJcjE1LFFXT1JEWzI0K3JicF0KKyRMJHNxcng0eF9zdWJfZW50cnk6CisJYW5kbglyMTIscjEyLHJheAorCWxlYQlyYnAsWzMyK3JicF0KKwlhbmRuCXIxMyxyMTMscmF4CisJYW5kbglyMTQscjE0LHJheAorCWFuZG4JcjE1LHIxNSxyYXgKKworCW5lZwlyOAorCWFkYwlyMTIsUVdPUkRbcmRpXQorCWFkYwlyMTMsUVdPUkRbOCtyZGldCisJYWRjCXIxNCxRV09SRFsxNityZGldCisJYWRjCXIxNSxRV09SRFsyNCtyZGldCisJbW92CVFXT1JEW3JkeF0scjEyCisJbGVhCXJkaSxbMzIrcmRpXQorCW1vdglRV09SRFs4K3JkeF0scjEzCisJc2JiCXI4LHI4CisJbW92CVFXT1JEWzE2K3JkeF0scjE0CisJbW92CVFXT1JEWzI0K3JkeF0scjE1CisJbGVhCXJkeCxbMzIrcmR4XQorCisJaW5jCXJjeAorCWpueglORUFSICRMJHNxcng0eF9zdWIKKworCW5lZwlyOQorCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKK2dsb2JhbAlibl9zY2F0dGVyNQorCitBTElHTgkxNgorYm5fc2NhdHRlcjU6CisJY21wCWVkeCwwCisJanoJTkVBUiAkTCRzY2F0dGVyX2VwaWxvZ3VlCisJbGVhCXI4LFtyOSo4K3I4XQorJEwkc2NhdHRlcjoKKwltb3YJcmF4LFFXT1JEW3JjeF0KKwlsZWEJcmN4LFs4K3JjeF0KKwltb3YJUVdPUkRbcjhdLHJheAorCWxlYQlyOCxbMjU2K3I4XQorCXN1YgllZHgsMQorCWpueglORUFSICRMJHNjYXR0ZXIKKyRMJHNjYXR0ZXJfZXBpbG9ndWU6CisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworZ2xvYmFsCWJuX2dhdGhlcjUKKworQUxJR04JMzIKK2JuX2dhdGhlcjU6CiskTCRTRUhfYmVnaW5fYm5fZ2F0aGVyNToKKworREIJMHg0YywweDhkLDB4MTQsMHgyNAorREIJMHg0OCwweDgxLDB4ZWMsMHgwOCwweDAxLDB4MDAsMHgwMAorCWxlYQlyYXgsWyRMJGluY10KKwlhbmQJcnNwLC0xNgorCisJbW92ZAl4bW01LHI5ZAorCW1vdmRxYQl4bW0wLFhNTVdPUkRbcmF4XQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbMTYrcmF4XQorCWxlYQlyMTEsWzEyOCtyOF0KKwlsZWEJcmF4LFsxMjgrcnNwXQorCisJcHNodWZkCXhtbTUseG1tNSwwCisJbW92ZHFhCXhtbTQseG1tMQorCW1vdmRxYQl4bW0yLHhtbTEKKwlwYWRkZAl4bW0xLHhtbTAKKwlwY21wZXFkCXhtbTAseG1tNQorCW1vdmRxYQl4bW0zLHhtbTQKKworCXBhZGRkCXhtbTIseG1tMQorCXBjbXBlcWQJeG1tMSx4bW01CisJbW92ZHFhCVhNTVdPUkRbKC0xMjgpK3JheF0seG1tMAorCW1vdmRxYQl4bW0wLHhtbTQKKworCXBhZGRkCXhtbTMseG1tMgorCXBjbXBlcWQJeG1tMix4bW01CisJbW92ZHFhCVhNTVdPUkRbKC0xMTIpK3JheF0seG1tMQorCW1vdmRxYQl4bW0xLHhtbTQKKworCXBhZGRkCXhtbTAseG1tMworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbKC05NikrcmF4XSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNAorCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CisJbW92ZHFhCVhNTVdPUkRbKC04MCkrcmF4XSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCisJcGFkZGQJeG1tMix4bW0xCisJcGNtcGVxZAl4bW0xLHhtbTUKKwltb3ZkcWEJWE1NV09SRFsoLTY0KStyYXhdLHhtbTAKKwltb3ZkcWEJeG1tMCx4bW00CisKKwlwYWRkZAl4bW0zLHhtbTIKKwlwY21wZXFkCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWygtNDgpK3JheF0seG1tMQorCW1vdmRxYQl4bW0xLHhtbTQKKworCXBhZGRkCXhtbTAseG1tMworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbKC0zMikrcmF4XSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNAorCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CisJbW92ZHFhCVhNTVdPUkRbKC0xNikrcmF4XSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCisJcGFkZGQJeG1tMix4bW0xCisJcGNtcGVxZAl4bW0xLHhtbTUKKwltb3ZkcWEJWE1NV09SRFtyYXhdLHhtbTAKKwltb3ZkcWEJeG1tMCx4bW00CisKKwlwYWRkZAl4bW0zLHhtbTIKKwlwY21wZXFkCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWzE2K3JheF0seG1tMQorCW1vdmRxYQl4bW0xLHhtbTQKKworCXBhZGRkCXhtbTAseG1tMworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbMzIrcmF4XSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNAorCXBhZGRkCXhtbTEseG1tMAorCXBjbXBlcWQJeG1tMCx4bW01CisJbW92ZHFhCVhNTVdPUkRbNDgrcmF4XSx4bW0zCisJbW92ZHFhCXhtbTMseG1tNAorCisJcGFkZGQJeG1tMix4bW0xCisJcGNtcGVxZAl4bW0xLHhtbTUKKwltb3ZkcWEJWE1NV09SRFs2NCtyYXhdLHhtbTAKKwltb3ZkcWEJeG1tMCx4bW00CisKKwlwYWRkZAl4bW0zLHhtbTIKKwlwY21wZXFkCXhtbTIseG1tNQorCW1vdmRxYQlYTU1XT1JEWzgwK3JheF0seG1tMQorCW1vdmRxYQl4bW0xLHhtbTQKKworCXBhZGRkCXhtbTAseG1tMworCXBjbXBlcWQJeG1tMyx4bW01CisJbW92ZHFhCVhNTVdPUkRbOTYrcmF4XSx4bW0yCisJbW92ZHFhCXhtbTIseG1tNAorCW1vdmRxYQlYTU1XT1JEWzExMityYXhdLHhtbTMKKwlqbXAJTkVBUiAkTCRnYXRoZXIKKworQUxJR04JMzIKKyRMJGdhdGhlcjoKKwlweG9yCXhtbTQseG1tNAorCXB4b3IJeG1tNSx4bW01CisJbW92ZHFhCXhtbTAsWE1NV09SRFsoKC0xMjgpKStyMTFdCisJbW92ZHFhCXhtbTEsWE1NV09SRFsoKC0xMTIpKStyMTFdCisJbW92ZHFhCXhtbTIsWE1NV09SRFsoKC05NikpK3IxMV0KKwlwYW5kCXhtbTAsWE1NV09SRFsoKC0xMjgpKStyYXhdCisJbW92ZHFhCXhtbTMsWE1NV09SRFsoKC04MCkpK3IxMV0KKwlwYW5kCXhtbTEsWE1NV09SRFsoKC0xMTIpKStyYXhdCisJcG9yCXhtbTQseG1tMAorCXBhbmQJeG1tMixYTU1XT1JEWygoLTk2KSkrcmF4XQorCXBvcgl4bW01LHhtbTEKKwlwYW5kCXhtbTMsWE1NV09SRFsoKC04MCkpK3JheF0KKwlwb3IJeG1tNCx4bW0yCisJcG9yCXhtbTUseG1tMworCW1vdmRxYQl4bW0wLFhNTVdPUkRbKCgtNjQpKStyMTFdCisJbW92ZHFhCXhtbTEsWE1NV09SRFsoKC00OCkpK3IxMV0KKwltb3ZkcWEJeG1tMixYTU1XT1JEWygoLTMyKSkrcjExXQorCXBhbmQJeG1tMCxYTU1XT1JEWygoLTY0KSkrcmF4XQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbKCgtMTYpKStyMTFdCisJcGFuZAl4bW0xLFhNTVdPUkRbKCgtNDgpKStyYXhdCisJcG9yCXhtbTQseG1tMAorCXBhbmQJeG1tMixYTU1XT1JEWygoLTMyKSkrcmF4XQorCXBvcgl4bW01LHhtbTEKKwlwYW5kCXhtbTMsWE1NV09SRFsoKC0xNikpK3JheF0KKwlwb3IJeG1tNCx4bW0yCisJcG9yCXhtbTUseG1tMworCW1vdmRxYQl4bW0wLFhNTVdPUkRbcjExXQorCW1vdmRxYQl4bW0xLFhNTVdPUkRbMTYrcjExXQorCW1vdmRxYQl4bW0yLFhNTVdPUkRbMzIrcjExXQorCXBhbmQJeG1tMCxYTU1XT1JEW3JheF0KKwltb3ZkcWEJeG1tMyxYTU1XT1JEWzQ4K3IxMV0KKwlwYW5kCXhtbTEsWE1NV09SRFsxNityYXhdCisJcG9yCXhtbTQseG1tMAorCXBhbmQJeG1tMixYTU1XT1JEWzMyK3JheF0KKwlwb3IJeG1tNSx4bW0xCisJcGFuZAl4bW0zLFhNTVdPUkRbNDgrcmF4XQorCXBvcgl4bW00LHhtbTIKKwlwb3IJeG1tNSx4bW0zCisJbW92ZHFhCXhtbTAsWE1NV09SRFs2NCtyMTFdCisJbW92ZHFhCXhtbTEsWE1NV09SRFs4MCtyMTFdCisJbW92ZHFhCXhtbTIsWE1NV09SRFs5NityMTFdCisJcGFuZAl4bW0wLFhNTVdPUkRbNjQrcmF4XQorCW1vdmRxYQl4bW0zLFhNTVdPUkRbMTEyK3IxMV0KKwlwYW5kCXhtbTEsWE1NV09SRFs4MCtyYXhdCisJcG9yCXhtbTQseG1tMAorCXBhbmQJeG1tMixYTU1XT1JEWzk2K3JheF0KKwlwb3IJeG1tNSx4bW0xCisJcGFuZAl4bW0zLFhNTVdPUkRbMTEyK3JheF0KKwlwb3IJeG1tNCx4bW0yCisJcG9yCXhtbTUseG1tMworCXBvcgl4bW00LHhtbTUKKwlsZWEJcjExLFsyNTYrcjExXQorCXBzaHVmZAl4bW0wLHhtbTQsMHg0ZQorCXBvcgl4bW0wLHhtbTQKKwltb3ZxCVFXT1JEW3JjeF0seG1tMAorCWxlYQlyY3gsWzgrcmN4XQorCXN1YgllZHgsMQorCWpueglORUFSICRMJGdhdGhlcgorCisJbGVhCXJzcCxbcjEwXQorCURCCTBGM2gsMEMzaAkJO3JlcHJldAorJEwkU0VIX2VuZF9ibl9nYXRoZXI1OgorCitBTElHTgk2NAorJEwkaW5jOgorCURECTAsMCwxLDEKKwlERAkyLDIsMiwyCitEQgk3NywxMTEsMTEwLDExNiwxMDMsMTExLDEwOSwxMDEsMTE0LDEyMSwzMiw3NywxMTcsMTA4LDExNiwxMDUKK0RCCTExMiwxMDgsMTA1LDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE1CitEQgk5OSw5NywxMTYsMTE2LDEwMSwxMTQsNDcsMTAzLDk3LDExNiwxMDQsMTAxLDExNCwzMiwxMDIsMTExCitEQgkxMTQsMzIsMTIwLDU2LDU0LDk1LDU0LDUyLDQ0LDMyLDY3LDgyLDg5LDgwLDg0LDc5CitEQgk3MSw2NSw3Nyw4MywzMiw5OCwxMjEsMzIsNjAsOTcsMTEyLDExMiwxMTQsMTExLDY0LDExMQorREIJMTEyLDEwMSwxMTAsMTE1LDExNSwxMDgsNDYsMTExLDExNCwxMDMsNjIsMAorRVhURVJOCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKworQUxJR04JMTYKK211bF9oYW5kbGVyOgorCXB1c2gJcnNpCisJcHVzaAlyZGkKKwlwdXNoCXJieAorCXB1c2gJcmJwCisJcHVzaAlyMTIKKwlwdXNoCXIxMworCXB1c2gJcjE0CisJcHVzaAlyMTUKKwlwdXNoZnEKKwlzdWIJcnNwLDY0CisKKwltb3YJcmF4LFFXT1JEWzEyMCtyOF0KKwltb3YJcmJ4LFFXT1JEWzI0OCtyOF0KKworCW1vdglyc2ksUVdPUkRbOCtyOV0KKwltb3YJcjExLFFXT1JEWzU2K3I5XQorCisJbW92CXIxMGQsRFdPUkRbcjExXQorCWxlYQlyMTAsW3IxMCoxK3JzaV0KKwljbXAJcmJ4LHIxMAorCWpiCU5FQVIgJEwkY29tbW9uX3NlaF90YWlsCisKKwltb3YJcjEwZCxEV09SRFs0K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYglORUFSICRMJGNvbW1vbl9wb3BfcmVncworCisJbW92CXJheCxRV09SRFsxNTIrcjhdCisKKwltb3YJcjEwZCxEV09SRFs4K3IxMV0KKwlsZWEJcjEwLFtyMTAqMStyc2ldCisJY21wCXJieCxyMTAKKwlqYWUJTkVBUiAkTCRjb21tb25fc2VoX3RhaWwKKworCWxlYQlyMTAsWyRMJG11bF9lcGlsb2d1ZV0KKwljbXAJcmJ4LHIxMAorCWphCU5FQVIgJEwkYm9keV80MAorCisJbW92CXIxMCxRV09SRFsxOTIrcjhdCisJbW92CXJheCxRV09SRFs4K3IxMCo4K3JheF0KKworCWptcAlORUFSICRMJGNvbW1vbl9wb3BfcmVncworCiskTCRib2R5XzQwOgorCW1vdglyYXgsUVdPUkRbNDArcmF4XQorJEwkY29tbW9uX3BvcF9yZWdzOgorCW1vdglyYngsUVdPUkRbKCgtOCkpK3JheF0KKwltb3YJcmJwLFFXT1JEWygoLTE2KSkrcmF4XQorCW1vdglyMTIsUVdPUkRbKCgtMjQpKStyYXhdCisJbW92CXIxMyxRV09SRFsoKC0zMikpK3JheF0KKwltb3YJcjE0LFFXT1JEWygoLTQwKSkrcmF4XQorCW1vdglyMTUsUVdPUkRbKCgtNDgpKStyYXhdCisJbW92CVFXT1JEWzE0NCtyOF0scmJ4CisJbW92CVFXT1JEWzE2MCtyOF0scmJwCisJbW92CVFXT1JEWzIxNityOF0scjEyCisJbW92CVFXT1JEWzIyNCtyOF0scjEzCisJbW92CVFXT1JEWzIzMityOF0scjE0CisJbW92CVFXT1JEWzI0MCtyOF0scjE1CisKKyRMJGNvbW1vbl9zZWhfdGFpbDoKKwltb3YJcmRpLFFXT1JEWzgrcmF4XQorCW1vdglyc2ksUVdPUkRbMTYrcmF4XQorCW1vdglRV09SRFsxNTIrcjhdLHJheAorCW1vdglRV09SRFsxNjgrcjhdLHJzaQorCW1vdglRV09SRFsxNzYrcjhdLHJkaQorCisJbW92CXJkaSxRV09SRFs0MCtyOV0KKwltb3YJcnNpLHI4CisJbW92CWVjeCwxNTQKKwlERAkweGE1NDhmM2ZjCisKKwltb3YJcnNpLHI5CisJeG9yCXJjeCxyY3gKKwltb3YJcmR4LFFXT1JEWzgrcnNpXQorCW1vdglyOCxRV09SRFtyc2ldCisJbW92CXI5LFFXT1JEWzE2K3JzaV0KKwltb3YJcjEwLFFXT1JEWzQwK3JzaV0KKwlsZWEJcjExLFs1Nityc2ldCisJbGVhCXIxMixbMjQrcnNpXQorCW1vdglRV09SRFszMityc3BdLHIxMAorCW1vdglRV09SRFs0MCtyc3BdLHIxMQorCW1vdglRV09SRFs0OCtyc3BdLHIxMgorCW1vdglRV09SRFs1Nityc3BdLHJjeAorCWNhbGwJUVdPUkRbX19pbXBfUnRsVmlydHVhbFVud2luZF0KKworCW1vdgllYXgsMQorCWFkZAlyc3AsNjQKKwlwb3BmcQorCXBvcAlyMTUKKwlwb3AJcjE0CisJcG9wCXIxMworCXBvcAlyMTIKKwlwb3AJcmJwCisJcG9wCXJieAorCXBvcAlyZGkKKwlwb3AJcnNpCisJREIJMEYzaCwwQzNoCQk7cmVwcmV0CisKKworc2VjdGlvbgkucGRhdGEgcmRhdGEgYWxpZ249NAorQUxJR04JNAorCURECSRMJFNFSF9iZWdpbl9ibl9tdWxfbW9udF9nYXRoZXI1IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfYm5fbXVsX21vbnRfZ2F0aGVyNSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19ibl9tdWxfbW9udF9nYXRoZXI1IHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2JuX211bDR4X21vbnRfZ2F0aGVyNSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2JuX211bDR4X21vbnRfZ2F0aGVyNSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19ibl9tdWw0eF9tb250X2dhdGhlcjUgd3J0IC4uaW1hZ2ViYXNlCisKKwlERAkkTCRTRUhfYmVnaW5fYm5fcG93ZXI1IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfYm5fcG93ZXI1IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2JuX3Bvd2VyNSB3cnQgLi5pbWFnZWJhc2UKKworCURECSRMJFNFSF9iZWdpbl9ibl9mcm9tX21vbnQ4eCB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfZW5kX2JuX2Zyb21fbW9udDh4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2JuX2Zyb21fbW9udDh4IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9iZWdpbl9ibl9tdWx4NHhfbW9udF9nYXRoZXI1IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9lbmRfYm5fbXVseDR4X21vbnRfZ2F0aGVyNSB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRTRUhfaW5mb19ibl9tdWx4NHhfbW9udF9nYXRoZXI1IHdydCAuLmltYWdlYmFzZQorCisJREQJJEwkU0VIX2JlZ2luX2JuX3Bvd2VyeDUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9ibl9wb3dlcng1IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2JuX3Bvd2VyeDUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2JlZ2luX2JuX2dhdGhlcjUgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkU0VIX2VuZF9ibl9nYXRoZXI1IHdydCAuLmltYWdlYmFzZQorCURECSRMJFNFSF9pbmZvX2JuX2dhdGhlcjUgd3J0IC4uaW1hZ2ViYXNlCisKK3NlY3Rpb24JLnhkYXRhIHJkYXRhIGFsaWduPTgKK0FMSUdOCTgKKyRMJFNFSF9pbmZvX2JuX211bF9tb250X2dhdGhlcjU6CitEQgk5LDAsMCwwCisJREQJbXVsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkbXVsX2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJG11bF9ib2R5IHdydCAuLmltYWdlYmFzZSwkTCRtdWxfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCitBTElHTgk4CiskTCRTRUhfaW5mb19ibl9tdWw0eF9tb250X2dhdGhlcjU6CitEQgk5LDAsMCwwCisJREQJbXVsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkbXVsNHhfcHJvbG9ndWUgd3J0IC4uaW1hZ2ViYXNlLCRMJG11bDR4X2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJG11bDR4X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorQUxJR04JOAorJEwkU0VIX2luZm9fYm5fcG93ZXI1OgorREIJOSwwLDAsMAorCURECW11bF9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJHBvd2VyNV9wcm9sb2d1ZSB3cnQgLi5pbWFnZWJhc2UsJEwkcG93ZXI1X2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJHBvd2VyNV9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKK0FMSUdOCTgKKyRMJFNFSF9pbmZvX2JuX2Zyb21fbW9udDh4OgorREIJOSwwLDAsMAorCURECW11bF9oYW5kbGVyIHdydCAuLmltYWdlYmFzZQorCURECSRMJGZyb21fcHJvbG9ndWUgd3J0IC4uaW1hZ2ViYXNlLCRMJGZyb21fYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkZnJvbV9lcGlsb2d1ZSB3cnQgLi5pbWFnZWJhc2UKK0FMSUdOCTgKKyRMJFNFSF9pbmZvX2JuX211bHg0eF9tb250X2dhdGhlcjU6CitEQgk5LDAsMCwwCisJREQJbXVsX2hhbmRsZXIgd3J0IC4uaW1hZ2ViYXNlCisJREQJJEwkbXVseDR4X3Byb2xvZ3VlIHdydCAuLmltYWdlYmFzZSwkTCRtdWx4NHhfYm9keSB3cnQgLi5pbWFnZWJhc2UsJEwkbXVseDR4X2VwaWxvZ3VlIHdydCAuLmltYWdlYmFzZQorQUxJR04JOAorJEwkU0VIX2luZm9fYm5fcG93ZXJ4NToKK0RCCTksMCwwLDAKKwlERAltdWxfaGFuZGxlciB3cnQgLi5pbWFnZWJhc2UKKwlERAkkTCRwb3dlcng1X3Byb2xvZ3VlIHdydCAuLmltYWdlYmFzZSwkTCRwb3dlcng1X2JvZHkgd3J0IC4uaW1hZ2ViYXNlLCRMJHBvd2VyeDVfZXBpbG9ndWUgd3J0IC4uaW1hZ2ViYXNlCitBTElHTgk4CiskTCRTRUhfaW5mb19ibl9nYXRoZXI1OgorREIJMHgwMSwweDBiLDB4MDMsMHgwYQorREIJMHgwYiwweDAxLDB4MjEsMHgwMAorREIJMHgwNCwweGEzLDB4MDAsMHgwMAorQUxJR04JOApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L211c2wvbXVzbC5neXAgYi9zcmMvdGhpcmRfcGFydHkvbXVzbC9tdXNsLmd5cAppbmRleCBhMzlkYWZmLi5mOGQyMTc1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbXVzbC9tdXNsLmd5cAorKysgYi9zcmMvdGhpcmRfcGFydHkvbXVzbC9tdXNsLmd5cApAQCAtMTA0LDYgKzEwNCwxNyBAQAogICAgICAgICAgICAgJ3NyYy9zdHJpbmcvbWVtc2V0LmMnLAogICAgICAgICAgIF0sCiAgICAgICAgIH1dLAorICAgICAgICAjIEV4Y2x1ZGVkIGFzIHRoZXkgY3Jhc2ggb24gQ29iYWx0IEV2ZXJncmVlbi4KKyAgICAgICAgWydzYl9ldmVyZ3JlZW4gIT0gMScsIHsKKyAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICdzcmMvc3RyaW5nL21lbWNoci5jJywKKyAgICAgICAgICAgICdzcmMvc3RyaW5nL3N0cmNoci5jJywKKyAgICAgICAgICAgICdzcmMvc3RyaW5nL3N0cmNocm51bC5jJywKKyAgICAgICAgICAgICdzcmMvc3RyaW5nL3N0cmNzcG4uYycsCisgICAgICAgICAgICAnc3JjL3N0cmluZy9zdHJsZW4uYycsCisgICAgICAgICAgICAnc3JjL3N0cmluZy9zdHBuY3B5LmMnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAogICAgICAgXSwKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnc3JjL2N0eXBlL19fY3R5cGVfYl9sb2MuYycsCkBAIC0zNjYsNyArMzc3LDYgQEAKICAgICAgICAgJ3NyYy9zdHJpbmcvZXhwbGljaXRfYnplcm8uYycsCiAgICAgICAgICdzcmMvc3RyaW5nL2luZGV4LmMnLAogICAgICAgICAnc3JjL3N0cmluZy9tZW1jY3B5LmMnLAotICAgICAgICAnc3JjL3N0cmluZy9tZW1jaHIuYycsCiAgICAgICAgICdzcmMvc3RyaW5nL21lbWNtcC5jJywKICAgICAgICAgJ3NyYy9zdHJpbmcvbWVtY3B5LmMnLAogICAgICAgICAnc3JjL3N0cmluZy9tZW1tZW0uYycsCkBAIC0zNzYsMTYgKzM4NiwxMSBAQAogICAgICAgICAnc3JjL3N0cmluZy9tZW1zZXQuYycsCiAgICAgICAgICdzcmMvc3RyaW5nL3JpbmRleC5jJywKICAgICAgICAgJ3NyYy9zdHJpbmcvc3RwY3B5LmMnLAotICAgICAgICAnc3JjL3N0cmluZy9zdHBuY3B5LmMnLAogICAgICAgICAnc3JjL3N0cmluZy9zdHJjYXQuYycsCi0gICAgICAgICdzcmMvc3RyaW5nL3N0cmNoci5jJywKLSAgICAgICAgJ3NyYy9zdHJpbmcvc3RyY2hybnVsLmMnLAogICAgICAgICAnc3JjL3N0cmluZy9zdHJjbXAuYycsCiAgICAgICAgICdzcmMvc3RyaW5nL3N0cmNweS5jJywKLSAgICAgICAgJ3NyYy9zdHJpbmcvc3RyY3Nwbi5jJywKICAgICAgICAgJ3NyYy9zdHJpbmcvc3RybGNhdC5jJywKICAgICAgICAgJ3NyYy9zdHJpbmcvc3RybGNweS5jJywKLSAgICAgICAgJ3NyYy9zdHJpbmcvc3RybGVuLmMnLAogICAgICAgICAnc3JjL3N0cmluZy9zdHJuY2F0LmMnLAogICAgICAgICAnc3JjL3N0cmluZy9zdHJuY21wLmMnLAogICAgICAgICAnc3JjL3N0cmluZy9zdHJuY3B5LmMnLApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L29wdXMvb3B1cy5neXAgYi9zcmMvdGhpcmRfcGFydHkvb3B1cy9vcHVzLmd5cAppbmRleCA0NjM1YWMyLi4xOWM4NDViIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvb3B1cy9vcHVzLmd5cAorKysgYi9zcmMvdGhpcmRfcGFydHkvb3B1cy9vcHVzLmd5cApAQCAtMTg0LDcgKzE4NCw2IEBACiAgICAgICAgICdzcmMvbWxwLmMnLAogICAgICAgICAnc3JjL21scF9kYXRhLmMnLAogICAgICAgICAnc3JjL29wdXMuYycsCi0gICAgICAgICdzcmMvb3B1c19jb21wYXJlLmMnLAogICAgICAgICAnc3JjL29wdXNfZGVjb2Rlci5jJywKICAgICAgICAgJ3NyYy9vcHVzX2VuY29kZXIuYycsCiAgICAgICAgICdzcmMvb3B1c19tdWx0aXN0cmVhbS5jJywKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL0NPTlRSSUJVVE9SUyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL0NPTlRSSUJVVE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBiNTdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvQ09OVFJJQlVUT1JTCkBAIC0wLDAgKzEsOSBAQAorIyBUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIHBlb3BsZSB3aG8ndmUgbWFkZSBub24tdHJpdmlhbCBjb250cmlidXRpb25zIHRvCisjIHRoZSBTZWN1cmVNZXNzYWdlIHByb2plY3QuCisKKyMgT3JpZ2luYWwgRGVzaWduCitTaGFic2kgV2FsZmlzaAorCisjIEMrKyBJbXBsZW1lbnRhdGlvbgorQWxleGVpIEN6ZXNraXMKK05pY2sgU2FseXp5bgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWEyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9SRUFETUUubWQKQEAgLTAsMCArMSwxMjggQEAKKyMgU3VtbWFyeQorVGhpcyBpcyBhICoqcG9ydGFibGUgY3J5cHRvIGxpYnJhcnkqKiB0aGF0IGV4cG9zZXMgYSByZXN0cmljdGVkIEFQSSB0aGF0IGlzCisqKnNlY3VyZSBieSBkZXNpZ24qKiwgZm9yIHVzZSBhcyBhIGJsYWNrLWJveCBidWlsZGluZyBibG9jayBpbiBjcnlwdG9ncmFwaGljCitwcm90b2NvbHMuICBTZWN1cml0eSBhbmQgcG9ydGFiaWxpdHkgYXJlIGVtcGhhc2l6ZWQgb3ZlciBlZmZpY2llbnQgKGNvbXBhY3QpCitlbmNvZGluZ3MsIGJ1dCBrZWVwaW5nIHRoZSBjcnlwdG8gb3ZlcmhlYWQgcmVhc29uYWJseSBtaW5pbWFsIGlzIHN0aWxsIGEKK3JlcXVpcmVtZW50LiBUaGUgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgYmVzdAorcHJhY3RpY2VzLCBhbmQgcmVkdWNlIHRoZSBsaWtlbGlob29kIG9mIGNvbW1vbiBwcm90b2NvbCBkZXNpZ24gZXJyb3JzLgorCisjIE92ZXJ2aWV3CitFeGlzdGluZyBjcnlwdG9ncmFwaGljIGxpYnJhcmllcyBhdmFpbGFibGUgaW4gbW9zdCBsYW5ndWFnZXMgdHlwaWNhbGx5IGV4cG9zZQorcmF3IGNyeXB0byBwcmltaXRpdmVzIChlLmcuLCBibG9jayBjaXBoZXJzIHdpdGggbW9kZXMgb2Ygb3BlcmF0aW9uLCBITUFDcywKK2RpZ2l0YWwgc2lnbmF0dXJlcykgdGhhdCBhcmUgb2Z0ZW4gYXBwbGllZCBpbmNvcnJlY3RseSBpbiBwcm90b2NvbCBkZXNpZ24uCitXaGlsZSB0aGVzZSBsaWJyYXJpZXMgYXJlICJzdGFuZGFyZHMgY29tcGxpYW50IiwgdGhleSBkbyBsaXR0bGUgb3Igbm90aGluZyB0bworZ3VpZGUgdGhlIHByb3RvY29sIGRlc2lnbmVyIHRvIHByb2R1Y2Ugc2VjdXJlIHByb3RvY29sIGRlc2lnbnMuIFdvcnNlIHN0aWxsLAordGhleSBsZWF2ZSBhbXBsZSByb29tIGZvciBpbXBsZW1lbnRhdGlvbnMgdG8gaW50cm9kdWNlIHN1YnRsZSBzZWN1cml0eSBidWdzCitzdWNoIGFzIHRpbWluZyBhdHRhY2tzLgorCitUaGUgU2VjdXJlTWVzc2FnZSBsaWJyYXJ5IGxldmVyYWdlcyBHb29nbGUncyBwcm90b2J1ZmZlciB0ZWNobm9sb2d5IHRvIHByb3ZpZGUKK2Egc2ltcGxlIGFuZCBwb3J0YWJsZSBlbmNvZGluZyBmb3IgcHVibGljIGtleXMgYW5kIHNpZ25lZC9lbmNyeXB0ZWQgZGF0YS4gVGhlCitleHBvc2VkIEFQSSBjb25zaXN0cyBvZiB0d28gbWFpbiBjbGFzc2VzLCBhbmQgdHdvIHN1cHBvcnRpbmcgY2xhc3Nlcy4KKworVGhlIG1haW4gY2xhc3NlcyBhcmU6CisKKyogU2VjdXJlIE1lc3NhZ2UgQnVpbGRlciAtLSB1c2VkIHRvIGNyYWZ0IFNlY3VyZU1lc3NhZ2UgcHJvdG9zIGZyb20gdGhlIGlucHV0CisgIGRhdGEsIG1ldGFkYXRhLCBhbmQga2V5cworCisqIFNlY3VyZSBNZXNzYWdlIFBhcnNlciAtLSB1c2VkIHRvIGV4dHJhY3QgdGhlIG9yaWdpbmFsIGlucHV0IGRhdGEgYW5kIG1ldGFkYXRhCisgIGZyb20gYSBTZWN1cmVNZXNzYWdlIHByb3RvLCB3aGlsZSBwZXJmb3JtaW5nIGFsbCBuZWNlc3NhcnkgdmVyaWZpY2F0aW9uLAorICBkZWNyeXB0aW9uLCBhbmQgc2FuaXR5IGNoZWNraW5nIGluIGEgc2VjdXJlIGZhc2hpb24KKworVGhlIHN1cHBvcnRpbmcgY2xhc3NlcyBhcmU6CisKKyogUHVibGljS2V5UHJvdG9VdGlsIC0tIHByb3ZpZGVzIHNpbXBsZSBwcm90b2J1ZiBiYXNlZCBlbmNvZGluZy9kZWNvZGluZyBmb3IKKyAgcHVibGljIGtleXMgKGVpdGhlciBFQyBvciBSU0EpLCBpbmNsdWRpbmcgYXBwcm9wcmlhdGUgc2VjdXJpdHkgY2hlY2tzIHRvCisgIHJlamVjdCBtYWxpY2lvdXNseSBjcmFmdGVkIGlucHV0cyAoZS5nLiwgRUMgcHVibGljIGtleXMgdGhhdCBhcmUgbm90IG9uIHRoZQorICBjdXJ2ZSkuIEFsc28gYXNzaXN0cyB3aXRoIGtleSBnZW5lcmF0aW9uLgorCisKKyogQ3J5cHRvT3BzIC0tIHByb3ZpZGVzIGNsZWFuIGFic3RyYWN0aW9ucyBmb3IgdmFyaW91cyBsb3ctbGV2ZWwgY3J5cHRvZ3JhcGhpYworICBvcGVyYXRpb25zLCBtYWtpbmcgaXQgZWFzaWVyIHRvIHBvcnQgdGhlIGxpYnJhcnkgdG8gbmV3IGNyeXB0byBwcm92aWRlcnMgKGFuZAorICBpbiB0aGUgY2FzZSBvZiBIS0RGLCBwcm92aWRpbmcgY2xpZW50cyBvZiB0aGUgbGlicmFyeSB3aXRoIGFjY2VzcyBhIHBvcnRhYmxlCisgIEFQSSBmb3IgdGhhdCBwcmltaXRpdmUgdG9vLCBzaW5jZSBpdCBpcyBub3QgY29tbW9ubHkgYXZhaWxhYmxlKS4KKworSW4gYWxsIGNhc2VzLCBleHBvc2VkIEFQSXMgYXJlIGNhcmVmdWxseSB0aG91Z2h0IG91dCwgaW4gb3JkZXIgdG8gZW5jb3VyYWdlCitzYWZlIHVzZSBhbmQgcHJldmVudCB1bnNhZmUgdXNlLiBGb3IgZXhhbXBsZSwgdGhlIFNlY3VyZU1lc3NhZ2VQYXJzZXIgQVBJIHdpbGwKK25vdCByZXR1cm4gdGhlIG9yaWdpbmFsIGlucHV0IGRhdGEgdW5sZXNzIHRoZSBzaWduYXR1cmUgb24gaXQgaGFzIGJlZW4gdmVyaWZpZWQKK2ZpcnN0LiBJdCBhbHNvIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSBleGFjdGx5IHdoaWNoIHNpZ25hdHVyZSBhbGdvcml0aG0KK2lzIGV4cGVjdGVkIHRvIGJlIHVzZWQsIHRvIHByZXZlbnQgY2FsbGVycyBmcm9tIGFjY2lkZW50YWxseSBjb25zdW1pbmcgbWVzc2FnZXMKK3NlbnQgdXNpbmcgYW55IG90aGVyIChwb3RlbnRpYWxseSBkZXByZWNhdGVkIC8gaW5zZWN1cmUpIHNpZ25hdHVyZSBhbGdvcml0aG1zLgorCitDdXJyZW50bHkgc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zIGFyZToKKworKiBFQyBEU0Egb24gdGhlIE5JU1QgUC0yNTYgY3VydmUsIHVzaW5nIGEgU0hBLTI1NiBkaWdlc3QgKEFOU0kgWDkuNjIpCisqIDIwNDgtYml0IFJTQSBzaWduYXR1cmVzIHVzaW5nIGEgU0hBLTI1NiBkaWdlc3QgKFBLQ1MjMSkKKyogSE1BQyB3aXRoIFNIQS0yNTYgZm9yICJzeW1tZXRyaWMga2V5IHNpZ25hdHVyZSIgKFJGQyAyMTA0KQorCitDdXJyZW50bHkgc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtcyBhcmU6CisKKyogQUVTLTI1NiBpbiBDQkMgbW9kZSBmb3Igc3ltbWV0cmljIGtleSBlbmNyeXB0aW9uCisKKyMgRmVhdHVyZXMgYW5kIEFQSQorVGhlIGJhc2ljIEFQSSBmb3IgU2VjdXJlTWVzc2FnZSBjb25zaXN0cyBvZiB0d28gY2xhc3Nlcywgb25lIG9mIHdoaWNoIGNyZWF0ZXMKK1NlY3VyZU1lc3NhZ2VzLCB3aGVyZWFzIHRoZSBvdGhlciBwYXJzZXMgdGhlbS4gIFRoZXJlIGFyZSB0d28gYmFzaWMgdHlwZXMgb2YKK1NlY3VyZU1lc3NhZ2Ugd2hpY2ggdGhlc2UgY2xhc3NlcyBtYW5pcHVsYXRlOgorCisqIFNpZ25lZCBDbGVhcnRleHQgLSBUaGlzIGlzIHVzZWQgZm9yIG1lc3NhZ2VzIHRoYXQgZG8gbm90IHJlcXVpcmUgYW55IHByaXZhY3kKKyAgZ3VhcmFudGVlLCBidXQgd2hpY2ggbmVlZCB0byBiZSBhdXRoZW50aWNhdGVkLiBJbiBwYXJ0aWN1bGFyLCB0aGUgInNpZ25hdHVyZSIKKyAgbWF5IGJlIGVpdGhlciBhIGRpZ2l0YWwgc2lnbmF0dXJlLCBvciBhIE1BQy4KKworKiBTaWduY3J5cHRlZCAtIFRoaXMgaXMgdXNlZCB3aGVuIGJvdGggcHJpdmFjeSBhbmQgYXV0aGVudGljaXR5IGFyZSByZXF1aXJlZC4KKyAgVGhlIGJvZHkgZGF0YSB3aWxsIGZpcnN0IGJlIGVuY3J5cHRlZCwgYW5kIHRoZW4gInNpZ25lZCIuIChTcGVjaWFsIG1lYXN1cmVzCisgIGFyZSB0YWtlbiB0byBlbnN1cmUgdGhhdCB0aGUgb3JpZ2luYWwgc2lnbmF0dXJlIGNhbm5vdCBiZSBzdHJpcHBlZCBvZmYgb2YgdGhlCisgIGVuY3J5cHRlZCBkYXRhIGFuZCByZXBsYWNlZCBieSBhbm90aGVyIHNpZ25hdHVyZSBmcm9tIGEgZGlmZmVyZW50IHNpZ25lci4pCisKK05vdGUgdGhhdCB3ZSB1c2UgdGhlIHRlcm0gInNpZ25hdHVyZSIgaW4gYSBnZW5lcmljIHNlbnNlLCB0byByZWZlciB0byBlaXRoZXIKK2RpZ2l0YWwgc2lnbmF0dXJlcyAodXNpbmcgYXN5bW1ldHJpYyBrZXlzKSBvciBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIENvZGVzCisodXNpbmcgc3ltbWV0cmljIGtleXMpLiBDdXJyZW50bHksIHRoZSBlbmNyeXB0aW9uIGNvbXBvbmVudCBvZiBzaWduY3J5cHRlZAorbWVzc2FnZXMgb25seSBzdXBwb3J0cyBzeW1tZXRyaWMga2V5IGVuY3J5cHRpb24gc2NoZW1lcywgYnV0IHRoaXMgbWF5IGNoYW5nZSBpbgordGhlIGZ1dHVyZS4KKworRWFjaCBTZWN1cmVNZXNzYWdlIGNvbnNpc3RzIG9mIHR3byBwcmltYXJ5IGNvbXBvbmVudHM6IGEgaGVhZGVyIGFuZCBhIGJvZHkuCitUaGUgaGVhZGVyIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBTZWN1cmVNZXNzYWdlIGFzIHdlbGwgYXMgcHJvdmlkaW5nIGEKK2NvbnZlbmllbnQgbG9jYXRpb24gZm9yIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIGJvZHkuIFRoZSBib2R5IG9mIHRoZQorU2VjdXJlTWVzc2FnZSB3aWxsIGNvbnRhaW4gdGhlIHByaW1hcnkgcGF5bG9hZC4gUmF0aGVyIHRoYW4gdXNpbmcgdGhlIHByb3RvYnVmCitBUElzIHRvIHJldHJpZXZlIHRoZXNlIGNvbXBvbmVudHMgZnJvbSBhIFNlY3VyZU1lc3NhZ2UsIHRoZSBTZWN1cmVNZXNzYWdlUGFyc2VyCittdXN0IGJlIHVzZWQuIFRoZSBoZWFkZXIgY29tcG9uZW50IGlzIGFsd2F5cyBzZW50IGluIHRoZSBjbGVhciwgYW5kIGNhbiBiZQorZXh0cmFjdGVkIGZyb20gdGhlIFNlY3VyZU1lc3NhZ2UgYnkgY2FsbGluZyBTZWN1cmVNZXNzYWdlUGFyc2VyJ3MKK2dldFVudmVyaWZpZWRIZWFkZXIoKSBtZXRob2Qgd2l0aG91dCB0aGUgdXNlIG9mIGFueSBjcnlwdG9ncmFwaGljIGtleXMuIFRodXMsCitpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIGhlYWRlciBjb250ZW50cyB0byBkZXRlcm1pbmUgd2hpY2gga2V5KHMpIG11c3QgYmUKK3VzZWQgdG8gdmVyaWZ5IChhbmQgcG9zc2libHkgZGVjcnlwdCkgdGhlIGJvZHkuICBJbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgYm9keQorY29tcG9uZW50LCBhbiBhcHByb3ByaWF0ZSBjYWxsIG11c3QgYmUgbWFkZSB0byBTZWN1cmVNZXNzYWdlUGFyc2VyJ3MKK3BhcnNlU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZSgpIG9yIHBhcnNlU2lnbmNyeXB0ZWRNZXNzYWdlKCkgbWV0aG9kLCBkZXBlbmRpbmcgb24KK3doaWNoIG9mIHRoZSB0d28gbWVzc2FnZSB0eXBlcyB3YXMgc2VudC4KKworVG8gcHJvdmlkZSBiZXR0ZXIgc3VwcG9ydCBmb3IgYnVpbGRpbmcgY3J5cHRvZ3JhcGhpYyBwcm90b2NvbHMsIHdlIGFsc28gcHJvdmlkZQorYSB1dGlsaXR5IGNsYXNzIGNhbGxlZCBQdWJsaWNLZXlQcm90b1V0aWwgdGhhdCBhc3Npc3RzIHdpdGggZW5jb2RpbmcgYW5kCitwYXJzaW5nIHB1YmxpYyBrZXlzIGluIGEgc2ltcGxlIHdpcmUgZm9ybWF0LCBhcyB3ZWxsIGFzIGdlbmVyYXRpbmcgbmV3IGtleQorcGFpcnMuIEluIHBhcnRpY3VsYXIsIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZHJhbWF0aWNhbGx5IHNpbXBsaWZ5CitEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2VzLgorCisjIENhdmVhdHMKK1RoZXJlIGlzIGEgc29tZSBleGNlc3Mgb3ZlcmhlYWQgaW5jdXJyZWQgZm9yIHVzaW5nIHRoaXMgbGlicmFyeSwgYXMgY29tcGFyZWQgdG8KK2EgbW9yZSAiZGlyZWN0IiBpbXBsZW1lbnRhdGlvbiBvZiBhbG1vc3QgYW55IG9mIHRoZSBvZmZlcmVkIGZ1bmN0aW9uYWxpdHkuIFRoZQorZXhjZXNzIG92ZXJoZWFkIGlzIHRoZSBwcmljZSBiZWluZyBwYWlkIGZvciBzaW1wbGljaXR5IGFuZCByb2J1c3RuZXNzLCBib3RoIGluCit0aGUgQVBJIGFuZCBpbiB0aGUgaW1wbGVtZW50YXRpb24uIElmIHNhdmluZyBldmVyeSBDUFUgY3ljbGUgb3IgZXZlcnkgYml0IG9mCitiYW5kd2lkdGggaXMgb2YgY3J1Y2lhbCBpbXBvcnRhbmNlIHRvIHlvdSwgZG8gbm90IHVzZSB0aGlzIGxpYnJhcnkgKGZvcgorZXhhbXBsZSwgaXQgd291bGQgbm90IG1ha2UgZm9yIGEgZ29vZCBTU0wgcmVwbGFjZW1lbnQgZm9yIGhpZ2ggdm9sdW1lIHRyYWZmaWMpLgorVG8gZ2V0IGEgc2Vuc2UgZm9yIG1hZ25pdHVkZSBvZiB0aGUgU2VjdXJlTWVzc2FnZSBvdmVyaGVhZCwgYSBzeW1tZXRyaWMga2V5CitiYXNlZCBITUFDIFNIQS0yNTYgYW5kIEFFUy0yNTYgQ0JDIG1vZGUgYXV0aGVudGljYXRlZCBlbmNyeXB0aW9uIGluY3VycyBhCittYXhpbXVtIG9mIGFib3V0IDgwIGJ5dGVzIG9mIG92ZXJoZWFkIHdpdGggU2VjdXJlTWVzc2FnZSwgYXMgb3Bwb3NlZCB0byBhCittYXhpbXVtIG9mIGFib3V0IDY0IGJ5dGVzIG9mIG92ZXJoZWFkIHVzaW5nIGEgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzYW1lCit0aGluZy4KKworRW5jcnlwdGlvbiB3aXRob3V0IHNpZ25hdHVyZSBpcyBpbnRlbnRpb25hbGx5IHVuc3VwcG9ydGVkLiBIaXN0b3JpY2FsbHksCitvZmZlcmluZyBlbmNyeXB0aW9uLW9ubHkgQVBJcyBoYXMgbGVhZCB0byBhIHBsZXRob3JhIG9mIG1pc3Rha2VzIGluIHByb3RvY29sCitkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCBzaW5jZSBpdCBpcyBmcmVxdWVudGx5IGFzc3VtZWQgdGhhdCBlbmNyeXB0ZWQgZGF0YQorY2Fubm90IGJlIHRhbXBlcmVkIHdpdGggKGJ1dCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiBwcmFjdGljZSkuCisKK1N1cHBvcnQgZm9yIHB1YmxpYyBrZXkgZW5jcnlwdGlvbiBpcyBub3QgeWV0IGF2YWlsYWJsZSwgYWx0aG91Z2ggaXQgbWF5IGJlCithZGRlZCBpbiB0aGUgZnV0dXJlLiBJbnN0ZWFkLCB3ZSByZWNvbW1lbmQgdG8gZGVzaWduIHByb3RvY29scyB0aGF0IHVzZQorKEVDKURpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZXMsIGFuZCB0aGVuIHVzZWQgdGhlIGV4Y2hhbmdlZCBzeW1tZXRyaWMga2V5IGZvcgorZW5jcnlwdGlvbi4gRm9yIGluc3RhbmNlLCB0aGlzIGFwcHJvYWNoIGNhbiBvZmZlciBmb3J3YXJkIHNlY3JlY3ksIGFuZAoraW5jcmVhc2VkIGVmZmljaWVuY3kgd2hlbiBtdWx0aXBsZSBtZXNzYWdlcyBhcmUgY29uY2VybmVkLiAgTm90ZSB0aGF0IGl0IGlzCitlYXN5IHRvIGF1dGhlbnRpY2F0ZSB0aGUgRGlmZmllLUhlbGxtYW4ga2V5cyB1c2luZyBhIHNpZ25hdHVyZS1vbmx5CitTZWN1cmVNZXNzYWdlIHdyYXBwaW5nIHdpdGggYSBwdWJsaWMga2V5IHNpZ25hdHVyZSBzY2hlbWUuCisKKyMgQ29tcGlsYXRpb24gYW5kIFVzZQorU2VlIGxhbmd1YWdlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGRpcmVjdG9yaWVzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvTElDRU5TRSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvTElDRU5TRQpAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9NYWtlZmlsZSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDc5NzYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTc5IEBACisjIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitQUk9UT0JVRl9ESVI9dGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wLworUFJPVE9CVUZfSERSUz10aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvaW5jbHVkZS8KK1BST1RPQlVGX0xJQlM9dGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL2xpYi8KK1BST1RPQz10aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvYmluL3Byb3RvYworR1RFU1RfRElSPXRoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC8KK0dURVNUX0hEUlM9dGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUKK0dURVNUX0xJQlM9dGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0LworR1RFU1RfTUFJTj10aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0X21haW4uY2MKK1NNX1NSQz1zcmMvc2VjdXJlbWVzc2FnZS8KK1NNX1RFU1Q9dGVzdC9zZWN1cmVtZXNzYWdlLworQ0M9ZysrCisKK1RFU1RfU1RERVJSPXRlc3Rfc3RkZXJyLmxvZworCisjIFRPRE86IHJlbW92ZSB0aGUgZGVidWcgYW5kIG9wdGltaXphdGlvbiBmbGFncyB3aGVuIHJlYWR5IGZvciBkZXBsb3ltZW50CitDRkxBR1M9LXN0ZD1nbnUrKzB4IC1XYWxsIC1XbmFycm93aW5nIC1XZXh0cmEgLVdlcnJvciAtcHRocmVhZCAtZlBJQyAtZyAtTzAgLUkgaW5jbHVkZSAtSSAuCisKK0lOQ19QQVRIID0gaW5jbHVkZS9zZWN1cmVtZXNzYWdlCisKK1BST0pfQkFTRV9PQkpFQ1RfRklMRVMgPSBcCisgIGJ5dGVfYnVmZmVyLm8gXAorICBjcnlwdG9fb3BzLm8gXAorICBwdWJsaWNfa2V5X3Byb3RvX3V0aWwubyBcCisgIHNlY3VyZW1lc3NhZ2UucGIubyBcCisgIHJhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIubyBcCisgIHNlY3VyZV9tZXNzYWdlX2J1aWxkZXIubyBcCisgIHNlY3VyZV9tZXNzYWdlX3BhcnNlci5vIFwKKyAgc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5vIFwKKyAgdXRpbC5vCisKK1BST0pfT1BFTlNTTF9PQkpFQ1RfRklMRVMgPSBcCisgICQoUFJPSl9CQVNFX09CSkVDVF9GSUxFUykgXAorICBjcnlwdG9fb3BzX29wZW5zc2wubworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBOb3RlLCBydW4KKyMgIG1ha2UgZGVwcworIworIyBiZWZvcmUgcnVubmluZyBhbnl0aGluZyBlbHNlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMaWJyYXJ5IC0tIHdlIGNhbiBidWlsZCBzZWN1cmVtZXNzYWdlIHdpdGggYSB2YXJpZXR5IG9mIGJhY2tlbmRzCitsaWJzZWN1cmVtZXNzYWdlLW9wZW5zc2wuc286ICR7UFJPSl9PUEVOU1NMX09CSkVDVF9GSUxFU30KKwkke0NDfSAtbyAkQCAtc2hhcmVkICReIC1sY3J5cHRvCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJ1bm5pbmcgdGVzdHMKK3J1bl90ZXN0czogcnVuX3BhcnNlcl90ZXN0cyBydW5fcHJvdG9fdXRpbF90ZXN0cyBydW5fb3BlbnNzbF90ZXN0CisKK3J1bl9wYXJzZXJfdGVzdHM6IHNlY3VyZV9tZXNzYWdlX3BhcnNlcl9vcGVuc3NsX3Rlc3QKKwlleHBvcnQgTERfTElCUkFSWV9QQVRIPSR7UFJPVE9CVUZfTElCU306JHtMRF9MSUJSQVJZX1BBVEh9OyAuL3NlY3VyZV9tZXNzYWdlX3BhcnNlcl9vcGVuc3NsX3Rlc3QgMj4gJHtURVNUX1NUREVSUn0KKworcnVuX3Byb3RvX3V0aWxfdGVzdHM6IHB1YmxpY19rZXlfcHJvdG9fdXRpbF9vcGVuc3NsX3Rlc3QKKwlleHBvcnQgTERfTElCUkFSWV9QQVRIPSR7UFJPVE9CVUZfTElCU306JHtMRF9MSUJSQVJZX1BBVEh9OyAuL3B1YmxpY19rZXlfcHJvdG9fdXRpbF9vcGVuc3NsX3Rlc3QgMj4gJHtURVNUX1NUREVSUn0KKworcnVuX29wZW5zc2xfdGVzdDogY3J5cHRvX29wc19vcGVuc3NsX3Rlc3QKKwlleHBvcnQgTERfTElCUkFSWV9QQVRIPSR7UFJPVE9CVUZfTElCU306JHtMRF9MSUJSQVJZX1BBVEh9OyAuL2NyeXB0b19vcHNfb3BlbnNzbF90ZXN0IDI+ICR7VEVTVF9TVERFUlJ9CisKK3J1bl9idWlsZGVyX29wZW5zc2xfdGVzdDogYnVpbGRlcl9vcGVuc3NsX3Rlc3QKKwlleHBvcnQgTERfTElCUkFSWV9QQVRIPSR7UFJPVE9CVUZfTElCU306JHtMRF9MSUJSQVJZX1BBVEh9OyAuL2J1aWxkZXJfb3BlbnNzbF90ZXN0IDI+ICR7VEVTVF9TVERFUlJ9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFV0aWxpdGllcwordXRpbC5vOiAke1NNX1NSQ30vdXRpbC5jYyAke0lOQ19QQVRIfS91dGlsLmgKKwkke0NDfSAke0NGTEFHU30gLWMgJDwKKworYnl0ZV9idWZmZXIubzogJHtTTV9TUkN9L2J5dGVfYnVmZmVyLmNjICR7SU5DX1BBVEh9L2J5dGVfYnVmZmVyLmgKKwkke0NDfSAke0NGTEFHU30gLWMgJDwKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ3J5cHRvIE9wZXJhdGlvbnMKK2NyeXB0b19vcHMubzogJHtTTV9TUkN9L2NyeXB0b19vcHMuY2MgJHtJTkNfUEFUSH0vY3J5cHRvX29wcy5oICR7SU5DX1BBVEh9L2J5dGVfYnVmZmVyLmggJHtJTkNfUEFUSH0vY29tbW9uLmggJHtJTkNfUEFUSH0vc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5oCisJJHtDQ30gJHtDRkxBR1N9IC1JICR7UFJPVE9CVUZfSERSU30gLWMgJDwKKworY3J5cHRvX29wc19vcGVuc3NsLm86ICR7U01fU1JDfS9jcnlwdG9fb3BzX29wZW5zc2wuY2MgJHtJTkNfUEFUSH0vY3J5cHRvX29wcy5oICR7SU5DX1BBVEh9L2J5dGVfYnVmZmVyLmggJHtJTkNfUEFUSH0vdXRpbC5oCisJJHtDQ30gJHtDRkxBR1N9IC1jICQ8CisKK2NyeXB0b19vcHNfdGVzdC5vOiAke1NNX1RFU1R9L2NyeXB0b19vcHNfdGVzdC5jYyBjcnlwdG9fb3BzLm8KKwkke0NDfSAke0NGTEFHU30gLUkgJHtHVEVTVF9IRFJTfSAtYyAkPAorCitjcnlwdG9fb3BzX29wZW5zc2xfdGVzdDogY3J5cHRvX29wc190ZXN0Lm8gJHtQUk9KX09QRU5TU0xfT0JKRUNUX0ZJTEVTfSAke0dURVNUX01BSU59CisJJHtDQ30gJHtDRkxBR1N9IC1JICR7R1RFU1RfSERSU30gLUwgJHtQUk9UT0JVRl9MSUJTfSAtTCAke0dURVNUX0xJQlN9IC1vICRAICReIC1sZ3Rlc3QgLWxjcnlwdG8gLWxwcm90b2J1ZgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgcGFyc2VyCitzZWN1cmVfbWVzc2FnZV9wYXJzZXIubzogJHtTTV9TUkN9L3NlY3VyZV9tZXNzYWdlX3BhcnNlci5jYyAke0lOQ19QQVRIfS9zZWN1cmVfbWVzc2FnZV9wYXJzZXIuaCBzZWN1cmVtZXNzYWdlLnBiLmggJHtJTkNfUEFUSH0vY29tbW9uLmggJHtJTkNfUEFUSH0vY3J5cHRvX29wcy5oICR7SU5DX1BBVEh9L3Jhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIuaAorCSR7Q0N9ICR7Q0ZMQUdTfSAtSSAke1BST1RPQlVGX0hEUlN9IC1jICQ8CisKK3Jhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIubzogJHtTTV9TUkN9L3Jhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIuY2MgJHtJTkNfUEFUSH0vcmF3X3NlY3VyZV9tZXNzYWdlX3BhcnNlci5oICR7SU5DX1BBVEh9L2NyeXB0b19vcHMuaCAke0lOQ19QQVRIfS9jb21tb24uaCAke0lOQ19QQVRIfS9zZWN1cmVfbWVzc2FnZV93cmFwcGVyLmgKKwkke0NDfSAke0NGTEFHU30gLWMgJDwKKworc2VjdXJlX21lc3NhZ2VfcGFyc2VyX29wZW5zc2xfdGVzdDogJHtTTV9URVNUfS9zZWN1cmVfbWVzc2FnZV9wYXJzZXJfdGVzdC5jYyAke1BST0pfT1BFTlNTTF9PQkpFQ1RfRklMRVN9ICR7R1RFU1RfTUFJTn0KKwkke0NDfSAke0NGTEFHU30gLUkgJHtQUk9UT0JVRl9IRFJTfSAtTCAke1BST1RPQlVGX0xJQlN9IC1JICR7R1RFU1RfSERSU30gLUwgJHtHVEVTVF9MSUJTfSAtbyAkQCAkXiAtbHByb3RvYnVmIC1sZ3Rlc3QgLWxjcnlwdG8KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGJ1aWxkZXIKK3NlY3VyZV9tZXNzYWdlX2J1aWxkZXIubzogJHtTTV9TUkN9L3NlY3VyZV9tZXNzYWdlX2J1aWxkZXIuY2MgJHtJTkNfUEFUSH0vc2VjdXJlX21lc3NhZ2VfYnVpbGRlci5oIHNlY3VyZW1lc3NhZ2UucGIuaCAke0lOQ19QQVRIfS9ieXRlX2J1ZmZlci5oICR7SU5DX1BBVEh9L2NvbW1vbi5oICR7SU5DX1BBVEh9L2NyeXB0b19vcHMuaCAke0lOQ19QQVRIfS9zZWN1cmVfbWVzc2FnZV93cmFwcGVyLmgKKwkke0NDfSAke0NGTEFHU30gLUkgJHtQUk9UT0JVRl9IRFJTfSAtYyAkPAorCitidWlsZGVyX3BhcnNlcl90ZXN0Lm86ICR7U01fVEVTVH0vYnVpbGRlcl9wYXJzZXJfdGVzdC5jYyAke0lOQ19QQVRIfS9zZWN1cmVfbWVzc2FnZV9idWlsZGVyLmgKKwkke0NDfSAke0NGTEFHU30gLUkgJHtQUk9UT0JVRl9IRFJTfSAtSSAke0dURVNUX0hEUlN9IC1jICQ8CisKK2J1aWxkZXJfb3BlbnNzbF90ZXN0OiBidWlsZGVyX3BhcnNlcl90ZXN0Lm8gJHtQUk9KX09QRU5TU0xfT0JKRUNUX0ZJTEVTfSAke0dURVNUX01BSU59CisJJHtDQ30gJHtDRkxBR1N9IC1JICR7UFJPVE9CVUZfSERSU30gLUwgJHtQUk9UT0JVRl9MSUJTfSAtSSAke0dURVNUX0hEUlN9IC1MICR7R1RFU1RfTElCU30gLW8gJEAgJF4gLWxwcm90b2J1ZiAtbGd0ZXN0IC1sY3J5cHRvCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoZSBwcm90b2J1ZiBkZWZpbnRpb24KK3NlY3VyZW1lc3NhZ2UucGIubzogc2VjdXJlbWVzc2FnZS5wYi5jYyBzZWN1cmVtZXNzYWdlLnBiLmgKKwkke0NDfSAke0NGTEFHU30gLUkgJHtQUk9UT0JVRl9IRFJTfSAtTCAke1BST1RPQlVGX0xJQlN9IC1jICQ8IC1scHJvdG9idWYKKworc2VjdXJlbWVzc2FnZS5wYi5jYzogc2VjdXJlbWVzc2FnZS5wcm90bworCSR7UFJPVE9DfSAtLWNwcF9vdXQ9LiAkPAorCitzZWN1cmVtZXNzYWdlLnBiLmg6IHNlY3VyZW1lc3NhZ2UucHJvdG8KKwkke1BST1RPQ30gLS1jcHBfb3V0PS4gJDwKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoZSBQcm90byBVdGlscworc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5vOiAke1NNX1NSQ30vc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5jYyAke0lOQ19QQVRIfS9zZWN1cmVfbWVzc2FnZV93cmFwcGVyLmggJHtJTkNfUEFUSH0vY3J5cHRvX29wcy5oICR7SU5DX1BBVEh9L2NvbW1vbi5oIHNlY3VyZW1lc3NhZ2UucGIuaAorCSR7Q0N9ICR7Q0ZMQUdTfSAtSSAke1BST1RPQlVGX0hEUlN9IC1jICQ8CisKK3B1YmxpY19rZXlfcHJvdG9fdXRpbC5vOiAke1NNX1NSQ30vcHVibGljX2tleV9wcm90b191dGlsLmNjICR7SU5DX1BBVEh9L3B1YmxpY19rZXlfcHJvdG9fdXRpbC5oICR7SU5DX1BBVEh9L2NvbW1vbi5oICR7SU5DX1BBVEh9L3NlY3VyZV9tZXNzYWdlX3dyYXBwZXIuaCAgc2VjdXJlbWVzc2FnZS5wYi5oCisJJHtDQ30gJHtDRkxBR1N9IC1JICR7UFJPVE9CVUZfSERSU30gLWMgJDwKKworcHVibGljX2tleV9wcm90b191dGlsX29wZW5zc2xfdGVzdDogJHtTTV9URVNUfS9wdWJsaWNfa2V5X3Byb3RvX3V0aWxfdGVzdC5jYyAke1BST0pfT1BFTlNTTF9PQkpFQ1RfRklMRVN9ICR7R1RFU1RfTUFJTn0KKwkke0NDfSAke0NGTEFHU30gLUkgJHtQUk9UT0JVRl9IRFJTfSAtTCAke1BST1RPQlVGX0xJQlN9IC1JICR7R1RFU1RfSERSU30gLUwgJHtHVEVTVF9MSUJTfSAtbyAkQCAkXiAtbHByb3RvYnVmIC1sZ3Rlc3QgLWxjcnlwdG8KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXJkIFBhcnR5IERlcGVuZGVuY2lkZXMKK2RlcHM6IHByb3RvYnVmIGd0ZXN0CisKK3Byb3RvYnVmOgorCWNkICR7UFJPVE9CVUZfRElSfTsgLi9jb25maWd1cmUgLS1wcmVmaXg9YHB3ZGAvLi4vCisJbWFrZSAtQyAke1BST1RPQlVGX0RJUn0KKwltYWtlIC1DICR7UFJPVE9CVUZfRElSfSBjaGVjaworCW1ha2UgLUMgJHtQUk9UT0JVRl9ESVJ9IGluc3RhbGwKKworZ3Rlc3Q6CisJJHtDQ30gLWlzeXN0ZW0gJHtHVEVTVF9ESVJ9L2luY2x1ZGUgLUkgJHtHVEVTVF9ESVJ9IC1wdGhyZWFkIC1jICR7R1RFU1RfRElSfS9zcmMvZ3Rlc3QtYWxsLmNjCisJYXIgLXJ2IGxpYmd0ZXN0LmEgZ3Rlc3QtYWxsLm8KKwltdiBsaWJndGVzdC5hIGd0ZXN0LWFsbC5vICR7R1RFU1RfTElCU30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENsZWFuIHVwCitjbGVhbjoKKwlybSAtZiAqLm8KKwlybSAtZiBzZWN1cmVtZXNzYWdlLnBiLioKKwlybSAtcmYgKl90ZXN0CisJcm0gLWYgY29yZQorCXJtIC1mICouc28KKworcmVhbGNsZWFuOiBjbGVhbgorCW1ha2UgLUMgJHtQUk9UT0JVRl9ESVJ9IGNsZWFuCisJcm0gLXJmICR7UFJPVE9CVUZfRElSfS4uL3tiaW4saW5jbHVkZSxsaWJ9CisJcm0gLWYgJHtHVEVTVF9ESVJ9Ly4uLyoue2Esb30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGE4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjAgQEAKKyMgQ29tcGlsYXRpb24KK0NvbXBpbGUgdGhlIGRlcGVuZGVuY2llcyBmaXJzdDoKKworYGBgJCBtYWtlIGRlcHNgYGAKKworVGhlbiBtYWtlIGV2ZXJ5dGhpbmc6CisKK2BgYCQgbWFrZWBgYAorCisjIFJ1bm5pbmcgdGVzdHMKK1RvIHJ1biB0ZXN0cyBkbzoKKworYGBgJCBtYWtlIHJ1bl90ZXN0c2BgYAorCisjIExhbmd1YWdlIHNwZWNpZmljIGRldGFpbHMKK1RoaXMgbGlicmFyeSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJ1biBvbiBhIG51bWJlciBvZiBzeXN0ZW1zLiAgU3BlY2lmaWNhbGx5LAorbGF5ZXJzIG9mIGluZGlyZWN0aW9uIHdlcmUgYnVpbHQgc3VjaCB0aGF0IGl0IGlzIGFibGUgdG8gYmUgcnVuIG9uIHN5c3RlbXMgc3VjaAorYXMgaU9TIChieSBzaW1wbHkgcmVwbGFjaW5nIHRoZSB3cmFwcGVyIGNsYXNzZXMpIGFuZCBvbiBzeXN0ZW1zIHdpdGgKK2N1c3RvbS9ub24tb3BlbnNzbCBpbXBsZW1lbnRhdGlvbnMgKGJ5IHByb3ZpZGluZyBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZSBjb2RlIGluIGBgYGNyeXB0b19vcHNfb3BlbnNzbC5jY2BgYCkuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL2J5dGVfYnVmZmVyLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL2J5dGVfYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllYzE1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2UvYnl0ZV9idWZmZXIuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8KKy8vIEEgdXRpbGl0eSBjbGFzcyBmb3IgaGVscGluZyB0byBpbnRlcmFjdCB3aXRoIGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbnMgaW4gYQorLy8gd2F5IHRoYXQncyBib3RoIGMrKyBmcmllbmRseSBhbmQgd29ya3Mgd2l0aCBPcGVuU1NMJ3MgbGVnYWN5IEMgcmVxdWlyZW1lbnRzLgorLy8KKy8vIFdpbGwgc2VjdXJlbHkgZGVzdHJveSBlbmNsb3NlZCBkYXRhIHdoZW4gZGVhbGxvY2F0ZWQKKy8vCisKKyNpZm5kZWYgU0VDVVJFTUVTU0FHRV9CWVRFX0JVRkZFUl9IXworI2RlZmluZSBTRUNVUkVNRVNTQUdFX0JZVEVfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL2NvbW1vbi5oIgorCituYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZSB7CisKK2NsYXNzIEJ5dGVCdWZmZXIgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGFuIGVtcHR5IGJ5dGUgYnVmZmVyCisgIEJ5dGVCdWZmZXIoKTsKKworICAvLyBDcmVhdGUgYSBidWZmZXIgb2YgYSBjZXJ0YWluIHNpemUuIEJ1ZmZlciB3aWxsIGJlIGZpbGxlZCB3aXRoIHplcm9zLgorICBleHBsaWNpdCBCeXRlQnVmZmVyKHNpemVfdCBzaXplKTsKKworICAvLyBDcmVhdGUgYSBidWZmZXIgaW5pdGlhbGl6ZWQgd2l0aCBieXRlcyBmcm9tIGEgc3RyaW5nCisgIGV4cGxpY2l0IEJ5dGVCdWZmZXIoY29uc3Qgc3RyaW5nJiBzb3VyY2VfZGF0YSk7CisKKyAgLy8gQ3JlYXRlIGEgYnVmZmVyIGluaXRpYWxpemVkIHdpdGggZGF0YSBmcm9tIGEgY29uc3QgY2hhciogYW5kIGEgbGVuZ3RoCisgIGV4cGxpY2l0IEJ5dGVCdWZmZXIoY29uc3QgY2hhciogc291cmNlX2RhdGEsIHNpemVfdCBsZW5ndGgpOworCisgIC8vIENyZWF0ZSBhIGJ1ZmZlciBpbml0aWFsaXplZCB3aXRoIGRhdGEgZnJvbSBhIGNvbnN0IGNoYXIqIChhc3N1bWVzIG51bGwKKyAgLy8gdGVybWluYXRpb24pCisgIGV4cGxpY2l0IEJ5dGVCdWZmZXIoY29uc3QgY2hhciogc291cmNlX2RhdGEpOworCisgIC8vIENyZWF0ZSBhIGJ1ZmZlciBpbml0aWFsaXplZCB3aXRoIGRhdGEgZnJvbSBhIHVpbnQ4X3QKKyAgZXhwbGljaXQgQnl0ZUJ1ZmZlcihjb25zdCB1aW50OF90KiBzb3VyY2VfZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKyAgLy8gRmlsbCB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YS4gIEFueSBvbGQgZGF0YSBpcyBkaXNjYXJkZWQKKyAgdm9pZCBTZXREYXRhKGNvbnN0IHVpbnQ4X3QqIHNvdXJjZV9kYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAvLyBBcHBlbmRzIG51bV9ieXRlcyBvZiB2YWx1ZSBieXRlIHRvIHRoZSBlbmQgb2YgdGhlIGV4aXN0aW5nIGRhdGEKKyAgLy8gQ3VycmVudGx5IG1heSB2aW9sYXRlIHNlY3VyZSBtZW1vcnkgZ3VhcmFudGVlcyBieSBsZWFraW5nIHNvbWUgZGF0YSBvbiB0aGUKKyAgLy8gaGVhcAorICB2b2lkIEFwcGVuZChzaXplX3QgbnVtX2J5dGVzLCBjb25zdCB1aW50OF90IGJ5dGUpOworCisgIC8vIFByZXBlbmRzIGEgc3RyaW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBCeXRlQnVmZmVyCisgIC8vIEN1cnJlbnRseSBtYXkgdmlvbGF0ZSBzZWN1cmUgbWVtb3J5IGd1YXJhbnRlZXMgYnkgbGVha2luZyBzb21lIGRhdGEgb24gdGhlCisgIC8vIGhlYXAKKyAgdm9pZCBQcmVwZW5kKGNvbnN0IHN0cmluZyYgc3RyKTsKKworICAvLyBDb25jYXRlbmF0ZXMgdHdvIGJ5dGUgYnVmZmVycy4gIFBsYWNpbmcgYSBiZWZvcmUgYi4gIElmIGEgaXMgZW1wdHksIHRoZW4KKyAgLy8gdGhlIHJlc3VsdCB3aWxsIGJlIGIuICBJZiBiIGlzIGVtcHR5LCB0aGUgcmVzdWx0IHdpbGwgYmUgYS4gIElmIGJvdGggYXJlCisgIC8vIGVtcHR5LCB0aGUgcmVzdWx0IHdpbGwgYmUgYW4gZW1wdHkgYnl0ZSBidWZmZXIuCisgIHN0YXRpYyBCeXRlQnVmZmVyIENvbmNhdChjb25zdCBCeXRlQnVmZmVyJiBhLCBjb25zdCBCeXRlQnVmZmVyJiBiKTsKKworICAvLyBHZXQgc2l6ZSBvZiBpbnRlcm5hbCBidWZmZXIKKyAgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgdW5pcXVlIHBvaW50ZXIgdG8gbmV3IEJ5dGVCdWZmZXIgb2YgYSBnaXZlbiBsZW5ndGggc3RhcnRpbmcgZnJvbQorICAvLyBhIGdpdmVuIG9mZnNldC4KKyAgLy8gUmV0dXJucyBhIHVuaXF1ZSBwb2ludGVyIHRvIGFuIGVtcHR5IEJ5dGVCdWZmZXIgaWYgbGVuZ3RoIGlzIDAuCisgIC8vIFJldHVybnMgYSBudWxscHRyIGlmIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KKyAgLy8gTm90ZSB0aGF0IHZhbGlkIG9mZnNldCBiZWdpbnMgYXQgMAorICBzdGQ6OnVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gU3ViQXJyYXkoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgY29uc3Q7CisKKyAgLy8gR2V0IG11dGFibGUgbWVtb3J5IGFzIHVuc2lnbmVkIGNoYXIqCisgIHVuc2lnbmVkIGNoYXIqIE11dGFibGVVQ2hhcigpOworCisgIC8vIEdldCBpbW11dGFibGUgbWVtb3J5IGFzIHVuc2lnbmVkIGNoYXIqCisgIHVuc2lnbmVkIGNvbnN0IGNoYXIqIEltbXV0YWJsZVVDaGFyKCkgY29uc3Q7CisKKyAgLy8gR2V0IG11dGFibGUgbWVtb3J5IGFzIHVpbnQ4X3QqCisgIHVpbnQ4X3QqIE11dGFibGVVSW50OCgpOworCisgIC8vIEdldCBpbW11dGFibGUgbWVtb3J5IGFzIHVpbnQ4X3QqCisgIGNvbnN0IHVpbnQ4X3QqIEltbXV0YWJsZVVJbnQ4KCkgY29uc3Q7CisKKyAgLy8gR2V0IGEgY29weSBvZiB0aGUgbWVtb3J5IGluIGEgQysrIHN0cmluZworICBzdHJpbmcgU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gR2V0IGEgY29weSBvZiB0aGUgbWVtb3J5IGluIGEgQysrIHZlY3RvcgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBWZWN0b3IoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJ5dGVzIGluIHRoZSBvdGhlciBidWZmZXIgYXJlIHRoZSBzYW1lIGFzIGluIHRoaXMKKyAgLy8gYnVmZmVyLCBmYWxzZSBvdGhlcndpc2UuIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgcGVyZm9ybSBhbiBlYXJseSBleGl0CisgIC8vIHdoZW4gaXQgZW5jb3VudGVycyBhIG1pc21hdGNoaW5nIGVsZW1lbnQgaW4gb3JkZXIgdG8gZ3VhcmQgYWdhaW5zdCB0aW1pbmcKKyAgLy8gYXR0YWNrcy4KKyAgYm9vbCBFcXVhbHMoY29uc3QgQnl0ZUJ1ZmZlciYgb3RoZXIpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBkYXRhIGFzIGEgcHJpbnRhYmxlIGhleCBzdHJpbmcgLS0gZm9yIGVhc3kgZGVidWdnaW5nCisgIHN0cmluZyBBc0RlYnVnSGV4U3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gU2VjdXJlbHkgcmVzZXRzIHRoZSBCeXRlQnVmZmVyIGJ5IHNlY3VyZWx5IGRlbGV0aW5nIGFueSBzdG9yZWQgZGF0YS4KKyAgdm9pZCBDbGVhcigpOworCisgIC8vIFNlY3VyZWx5IGRlc3Ryb3lzIHRoZSBCeXRlQnVmZmVyCisgIH5CeXRlQnVmZmVyKCk7CisKKyBwcml2YXRlOgorICAvLyBXZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdmVjdG9ycyBhcmUgZ3VhcmFudGVlZCB0byB1c2UgY29udGlndW91cyBtZW1vcnkKKyAgLy8gZm9yIHN0b3JpbmcgZWxlbWVudHMuCisgIC8vIFRPRE8oYWN6ZXNraXMpOiBkZWZpbmUgYSBjdXN0b20gdmVyc2lvbiBvZiB2ZWN0b3IgdGhhdCBoYXMgYSB3aXBpbmcKKyAgLy8gZGVhbGxvY2F0b3IuCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfOworCisgIC8vIE92ZXJ3cml0ZXMgYWxsIGVsZW1lbnRzIGluIGRhdGEgdmVjdG9yIG9uZSB0aW1lLiAgRG9lcyBub3QgcmVzaXplIGRhdGEKKyAgLy8gdmVjdG9yLgorICB2b2lkIFdpcGUoKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gd2lwZSBhIHNwZWNpZmllZCBidWZmZXIuCisgIHZvaWQgV2lwZUJ1ZmZlcih1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKKyNlbmRpZiAgLy8gU0VDVVJFTUVTU0FHRV9CWVRFX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL2luY2x1ZGUvc2VjdXJlbWVzc2FnZS9jb21tb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2UvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4YThkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2UvY29tbW9uLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRUNVUkVNRVNTQUdFX0NPTU1PTl9IXworI2RlZmluZSBTRUNVUkVNRVNTQUdFX0NPTU1PTl9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworI2VuZGlmICAvLyBTRUNVUkVNRVNTQUdFX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL2luY2x1ZGUvc2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL2NyeXB0b19vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE0NWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL2luY2x1ZGUvc2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzLmgKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0VDVVJFTUVTU0FHRV9DUllQVE9fT1BTX0hfCisjZGVmaW5lIFNFQ1VSRU1FU1NBR0VfQ1JZUFRPX09QU19IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9ieXRlX2J1ZmZlci5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvY29tbW9uLmgiCisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKKworLy8KKy8vIEVuY2Fwc3VsYXRlcyB0aGUgY3J5cHRvZ3JhcGhpYyBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIHtAY29kZSBTZWN1cmVNZXNzYWdlKn0KKy8vIGNsYXNzZXMuCisvLworY2xhc3MgQ3J5cHRvT3BzIHsKKyBwdWJsaWM6CisgIC8vCisgIC8vIEVudW0gb2Ygc3VwcG9ydGVkIHNpZ25hdHVyZSBzY2hlbWVzLgorICAvLworICBlbnVtIFNpZ1R5cGUgeworICAgIEhNQUNfU0hBMjU2LAorICAgIEVDRFNBX1AyNTZfU0hBMjU2LAorICAgIFJTQTIwNDhfU0hBMjU2LAorICAgIFNJR19UWVBFX0VORCAgLy8gdXNlZCBmb3IgdGVzdGluZworICB9OworCisgIC8vCisgIC8vIEVudW0gb2Ygc3VwcG9ydGVkIGVuY3J5cHRpb24gdHlwZXMKKyAgLy8KKyAgZW51bSBFbmNUeXBlIHsKKyAgICBOT05FLAorICAgIEFFU18yNTZfQ0JDLAorICAgIEVOQ19UWVBFX0VORCAgLy8gdXNlZCBmb3IgdGVzdGluZworICB9OworCisgIC8vCisgIC8vIEtleSBBbGdvcml0aG1zIHdlIHN1cHBvcnQKKyAgLy8KKyAgZW51bSBLZXlBbGdvcml0aG0geworICAgIEFFU18yNTZfS0VZLAorICAgIEVDRFNBX0tFWSwKKyAgICBSU0FfS0VZCisgIH07CisKKyAgLy8KKyAgLy8gS2V5IFR5cGVzIHdlIGJlbGlldmUgdG8gZXhpc3QKKyAgLy8KKyAgZW51bSBLZXlUeXBlIHsKKyAgICBQVUJMSUMsCisgICAgUFJJVkFURSwKKyAgICBTRUNSRVQKKyAgfTsKKworICAvLworICAvLyBSZXByZXNlbnRzIGEgYmFzZSBrZXkgY2xhc3MsIFNlY3JldEtleSBhbmQgUHVibGljS2V5IGFyZSBkZXJpdmVkIGZyb20gdGhpcworICAvLyBjbGFzcworICAvLworICBjbGFzcyBLZXkgeworICAgcHVibGljOgorICAgIC8vCisgICAgLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgZGVsZXRlZCBzbyB0aGF0IGNsYXNzIGNvbnN1bWVycyBjYW5ub3QgY3JlYXRlCisgICAgLy8gYSBnZW5lcmljIGtleSBjbGFzcy4gIFRoZXkgbXVzdCB1c2UgYSBwYXJ0aWN1bGFyIGtleSB0eXBlIGNsYXNzLgorICAgIC8vCisgICAgS2V5KCkgPSBkZWxldGU7CisKKyAgICBCeXRlQnVmZmVyIGRhdGEoKSB7IHJldHVybiBkYXRhXzsgfQorICAgIGNvbnN0IEJ5dGVCdWZmZXImIGRhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQorICAgIEtleUFsZ29yaXRobSBhbGdvcml0aG0oKSBjb25zdCB7IHJldHVybiBhbGdvcml0aG1fOyB9CisgICAgS2V5VHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICAgcHJvdGVjdGVkOgorICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBzbyB0aGF0IGNvbnN1bWVycyBjYW4ndCBzaW1wbHkgY3JlYXRlIGEKKyAgICAvLyBnZW5lcmljIGtleS4gIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgYSBwYXJ0aWN1bGFyIGtleSB0eXBlIGNsYXNzLgorICAgIC8vCisgICAgS2V5KGNvbnN0IEJ5dGVCdWZmZXImIGRhdGEsIEtleUFsZ29yaXRobSBhbGdvcml0aG0sIEtleVR5cGUgdHlwZSkgeworICAgICAgZGF0YV8gPSBkYXRhOworICAgICAgYWxnb3JpdGhtXyA9IGFsZ29yaXRobTsKKyAgICAgIHR5cGVfID0gdHlwZTsKKyAgICB9CisKKyAgICBCeXRlQnVmZmVyIGRhdGFfOworICAgIEtleUFsZ29yaXRobSBhbGdvcml0aG1fOworICAgIEtleVR5cGUgdHlwZV87CisgIH07CisKKyAgLy8KKyAgLy8gV2UgaGF2ZSB0aHJlZSBrZXkgdHlwZXM6IFB1YmxpYywgUHJpdmF0ZSwgYW5kIFNlY3JldCAoc3ltbWV0cmljKQorICAvLworICBjbGFzcyBQdWJsaWNLZXkgOiBwdWJsaWMgS2V5IHsKKyAgIHB1YmxpYzoKKyAgICBQdWJsaWNLZXkoY29uc3Qgc3RyaW5nJiBkYXRhLCBLZXlBbGdvcml0aG0gYWxnb3JpdGhtKQorICAgICAgICA6IEtleShCeXRlQnVmZmVyKGRhdGEpLCBhbGdvcml0aG0sIFBVQkxJQykge30KKyAgICBQdWJsaWNLZXkoY29uc3QgQnl0ZUJ1ZmZlciYgZGF0YSwgS2V5QWxnb3JpdGhtIGFsZ29yaXRobSkKKyAgICAgICAgOiBLZXkoZGF0YSwgYWxnb3JpdGhtLCBQVUJMSUMpIHt9CisgIH07CisKKyAgY2xhc3MgUHJpdmF0ZUtleSA6IHB1YmxpYyBLZXkgeworICAgcHVibGljOgorICAgIFByaXZhdGVLZXkoY29uc3Qgc3RyaW5nJiBkYXRhLCBLZXlBbGdvcml0aG0gYWxnb3JpdGhtKQorICAgICAgICA6IEtleShCeXRlQnVmZmVyKGRhdGEpLCBhbGdvcml0aG0sIFBSSVZBVEUpIHt9CisgICAgUHJpdmF0ZUtleShjb25zdCBCeXRlQnVmZmVyJiBkYXRhLCBLZXlBbGdvcml0aG0gYWxnb3JpdGhtKQorICAgICAgICA6IEtleShkYXRhLCBhbGdvcml0aG0sIFBSSVZBVEUpIHt9CisgIH07CisKKyAgY2xhc3MgU2VjcmV0S2V5IDogcHVibGljIEtleSB7CisgICBwdWJsaWM6CisgICAgU2VjcmV0S2V5KGNvbnN0IHN0cmluZyYgZGF0YSwgS2V5QWxnb3JpdGhtIGFsZ29yaXRobSkKKyAgICAgICAgOiBLZXkoQnl0ZUJ1ZmZlcihkYXRhKSwgYWxnb3JpdGhtLCBTRUNSRVQpIHt9CisgICAgU2VjcmV0S2V5KGNvbnN0IEJ5dGVCdWZmZXImIGRhdGEsIEtleUFsZ29yaXRobSBhbGdvcml0aG0pCisgICAgICAgIDogS2V5KGRhdGEsIGFsZ29yaXRobSwgU0VDUkVUKSB7fQorICB9OworCisgIHN0cnVjdCBLZXlQYWlyIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJpdmF0ZUtleT4gcHJpdmF0ZV9rZXk7CisgICAgc3RkOjp1bmlxdWVfcHRyPFB1YmxpY0tleT4gcHVibGljX2tleTsKKworICAgIEtleVBhaXIoc3RkOjp1bmlxdWVfcHRyPFB1YmxpY0tleT4gcHViLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFByaXZhdGVLZXk+IHByaXYpIHsKKyAgICAgIHB1YmxpY19rZXkgPSBzdGQ6Om1vdmUocHViKTsKKyAgICAgIHByaXZhdGVfa2V5ID0gc3RkOjptb3ZlKHByaXYpOworICAgIH0KKyAgfTsKKworICAvLworICAvLyBJbXBsZW1lbnRzIEhLREYgKFJGQyA1ODY5KSB3aXRoIHRoZSBTSEEtMjU2IGhhc2ggYW5kIGEgMjU2LWJpdCBvdXRwdXQga2V5CisgIC8vIGxlbmd0aC4KKyAgLy8KKyAgLy8gQHBhcmFtIGlucHV0S2V5TWF0ZXJpYWwgbWFzdGVyIGtleSBmcm9tIHdoaWNoIHRvIGRlcml2ZSBzdWIta2V5cworICAvLyBAcGFyYW0gc2FsdCBhIChwdWJsaWMpIHJhbmRvbWx5IGdlbmVyYXRlZCAyNTYtYml0IGlucHV0IHRoYXQgY2FuIGJlIHJlLXVzZWQKKyAgLy8gQHBhcmFtIGluZm8gYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHRoYXQgaXMgYm91bmQgdG8gdGhlIGRlcml2ZWQga2V5IChpLmUuLAorICAvLyB1c2VkIGluIGl0cyBjcmVhdGlvbikKKyAgLy8gQHJldHVybiBhIHN0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IGhvbGRpbmcgdGhlIGRlcml2ZWQga2V5IGJ5dGVzID0KKyAgLy8gSEtERi1TSEEyNTYoaW5wdXRLZXlNYXRlcmlhbCwgc2FsdCwgaW5mbykgb24gc3VjY2VzcyBvciBudWxscHRyIG9uIGVycm9yCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBIa2RmKGNvbnN0IHN0cmluZyYgaW5wdXRLZXlNYXRlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGluZm8pOworCisgIC8vCisgIC8vIEEga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gc3BlY2lmaWMgdG8gdGhpcyBsaWJyYXJ5LCB3aGljaCBhY2NlcHRzIGEge0Bjb2RlCisgIC8vIG1hc3RlcktleX0gYW5kIGFuIGFyYml0cmFyeSB7QGNvZGUgcHVycG9zZX0gZGVzY3JpYmluZyB0aGUgaW50ZW5kZWQKKyAgLy8gYXBwbGljYXRpb24gb2YgdGhlIGRlcml2ZWQgc3ViLWtleSwgYW5kIHByb2R1Y2VzIGEgZGVyaXZlZCBBRVMgLSAyNTYga2V5CisgIC8vIHNhZmUgdG8gdXNlIGFzIGlmIGl0IHdlcmUgaW5kZXBlbmRlbnQgb2YgYW55IG90aGVyIGRlcml2ZWQga2V5IHdoaWNoIHVzZWQKKyAgLy8gYSBkaWZmZXJlbnQge0Bjb2RlIHB1cnBvc2V9LgorICAvLworICAvLyBAcGFyYW0gbWFzdGVyS2V5IGFueSBrZXkgc3VpdGFibGUgZm9yIHVzZSB3aXRoIEhtYWNTSEEyNTYKKyAgLy8gQHBhcmFtIHB1cnBvc2UgYSBVVEYtOCBlbmNvZGVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mCisgIC8vIGRlcml2ZWQga2V5CisgIC8vIEByZXR1cm4gYSBkZXJpdmVkIEtleSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggQUVTLTI1NgorICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNlY3JldEtleT4gRGVyaXZlQWVzMjU2S2V5Rm9yKAorICAgICAgY29uc3QgU2VjcmV0S2V5JiBtYXN0ZXJLZXksIGNvbnN0IHN0cmluZyYgcHVycG9zZSk7CisKKyAgLy8KKyAgLy8gU0hBIDI1NiBsZW5ndGgsIGluIGJ5dGVzCisgIC8vCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga1NoYTI1NkRpZ2VzdFNpemUgPSAzMjsKKworICAvLworICAvLyBTYWx0IGxlbmd0aCwgaW4gYnl0ZXMKKyAgLy8KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrU2FsdFNpemUgPSAzMjsKKworICAvLyBBRVMgMjU2IGtleSBsZW5ndGgsIGluIGJ5dGVzCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga0Flc0tleVNpemUgPSAzMjsKKworICAvLworICAvLyBUcnVuY2F0ZWQgaGFzaCBvdXRwdXQgbGVuZ3RoLCBpbiBieXRlcy4KKyAgLy8KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrRGlnZXN0TGVuZ3RoID0gMjA7CisKKyAgLy8KKyAgLy8gQ29tcHV0ZXMgYSBjb2xsaXNpb24tcmVzaXN0YW50IGhhc2ggb2Yge0BsaW5rICNrRGlnZXN0TGVuZ3RofSBieXRlcworICAvLyAodXNpbmcgYSB0cnVuY2F0ZWQgU0hBLTI1NiBvdXRwdXQpLgorICAvLworICAvLyBAcmV0dXJuIGEgc3RkOjp1bmlxdWVfcHRyIGhvbGRpbmcgdGhlIGRpZ2VzdCBvciBhIG51bGxwdHIgb24gZXJyb3IKKyAgLy8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IERpZ2VzdChjb25zdCBzdHJpbmcmIGRhdGEpOworCisgIC8vCisgIC8vIERlY3J5cHRzIHtAY29kZSBjaXBoZXJ0ZXh0fSB1c2luZyB0aGUgYWxnb3JpdGhtIHNwZWNpZmllZCBpbiB7QGNvZGUKKyAgLy8gZW5jVHlwZX0sIHdpdGggdGhlIHNwZWNpZmllZCB7QGNvZGUgaXZ9IGFuZCB7QGNvZGUgZGVjcnlwdGlvbktleX0uCisgIC8vCisgIC8vIEByZXR1cm4gYSBzdGQ6OnVuaXF1ZV9wdHIgaG9sZGluZyB0aGUgZGVjcnlwdGVkIGRhdGEgb3IgYSBudWxscHRyIG9uIGVycm9yCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBEZWNyeXB0KGNvbnN0IFNlY3JldEtleSYgZGVjcnlwdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jVHlwZSBlbmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNpcGhlcnRleHQpOworCisgIC8vCisgIC8vIEVuY3J5cHRzIHtAY29kZSBwbGFpbnRleHR9IHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGluIHtAY29kZQorICAvLyBlbmNUeXBlfSwgd2l0aCB0aGUgc3BlY2lmaWVkICoge0Bjb2RlIGl2fSBhbmQge0Bjb2RlIGVuY3J5cHRpb25LZXl9LgorICAvLworICAvLyBAcGFyYW0gcm5nIHNvdXJjZSBvZiByYW5kb21uZXNzIHRvIGJlIHVzZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGNpcGhlciwgaWYKKyAgLy8gbmVjZXNzYXJ5CisgIC8vIEByZXR1cm4gYSBzdGQ6OnVuaXF1ZV9wdHIgaG9sZGluZyB0aGUgZW5jcnlwdGVkIGRhdGEgb3IgbnVsbHB0ciBvbiBlcnJvcgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4gRW5jcnlwdChjb25zdCBTZWNyZXRLZXkmIGVuY3J5cHRpb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1R5cGUgZW5jVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwbGFpbnRleHQpOworCisgIC8vCisgIC8vIFJ1bnMgdGhlIERpZmZpZS1IZWxsbWFuIGFsZ29yaXRobS4KKyAgLy8KKyAgLy8gQHBhcmFtIHByaXZhdGVfa2V5IG11c3QgaGF2ZSB0aGUgc2FtZSBhbGdvcml0aG0gYXMgdGhlIHBlZXJfa2V5CisgIC8vIEBwYXJhbSBwZWVyX2tleSBtdXN0IGJlIHRoZSBtYXRjaGluZyBwdWJsaWMga2V5CisgIC8vIEByZXR1cm4gYW4gQUVTIHNlY3JldCBrZXkgY3JlYXRlZCBmcm9tIHRoZSBTSEEtMjU2IG9mIHRoZSBzZWNyZXQgY3JlYXRlZAorICAvLyBoZXJlIG9yIG51bGxwdHIgb24gZXJyb3IuCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U2VjcmV0S2V5PiBLZXlBZ3JlZW1lbnRTaGEyNTYoCisgICAgICBjb25zdCBQcml2YXRlS2V5JiBwcml2YXRlX2tleSwKKyAgICAgIGNvbnN0IFB1YmxpY0tleSYgcGVlcl9rZXkpOworCisgIC8vCisgIC8vIEdlbmVyYXRlIGEgcmFuZG9tIElWIGFwcHJvcHJpYXRlIGZvciB1c2Ugd2l0aCB0aGUgYWxnb3JpdGhtIHNwZWNpZmllZCBpbgorICAvLyB7QGNvZGUgZW5jVHlwZX0uCisgIC8vCisgIC8vIEByZXR1cm4gYSBmcmVzaGx5IGdlbmVyYXRlZCBJViAoYSByYW5kb20gYnl0ZSBzZXF1ZW5jZSBvZiBhcHByb3ByaWF0ZQorICAvLyBsZW5ndGgpCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBHZW5lcmF0ZUl2KEVuY1R5cGUgZW5jVHlwZSk7CisKKyAgLy8KKyAgLy8gU2lnbnMge0Bjb2RlIGRhdGF9IHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IHtAY29kZSBzaWdUeXBlfSB3aXRoCisgIC8vIHtAY29kZSBzaWduaW5nS2V5fS4KKyAgLy8KKyAgLy8gQHBhcmFtIHJuZyBpcyByZXF1aXJlZCBmb3IgcHVibGljIGtleSBzaWduYXR1cmUgc2NoZW1lcworICAvLyBAcmV0dXJuIGEgc3RkOjp1bmlxdWVfcHRyIGhvbGRpbmcgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSByYXcKKyAgLy8gc2lnbmF0dXJlIG9yIGEgbnVsbHB0ciBvbiBlcnJvcgorICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4gU2lnbihTaWdUeXBlIHNpZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleSYgc2lnbmluZ0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkYXRhKTsKKworICAvLworICAvLyBWZXJpZmllcyB0aGUge0Bjb2RlIHNpZ25hdHVyZX0gb24ge0Bjb2RlIGRhdGF9IHVzaW5nIHRoZSBhbGdvcml0aG0KKyAgLy8gc3BlY2lmaWVkIGJ5IHtAY29kZSBzaWdUeXBlfSB3aXRoIHtAY29kZSB2ZXJpZmljYXRpb25LZXl9LgorICAvLworICAvLyBAcmV0dXJuIHRydWUgaWZmIHRoZSBzaWduYXR1cmUgaXMgdmVyaWZpZWQKKyAgLy8KKyAgc3RhdGljIGJvb2wgVmVyaWZ5KFNpZ1R5cGUgc2lnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleSYgdmVyaWZpY2F0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRhdGEpOworCisgIC8vCisgIC8vIEltcG9ydHMgYSBQMjU2IEVDIFB1YmxpYyBLZXkgdXNpbmcgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnZlLgorICAvLworICAvLyBAcmV0dXJuIG51bGxwdHIgaWYgdGhlIHBvaW50IGlzIGludmFsaWQKKyAgLy8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQdWJsaWNLZXk+IEltcG9ydEVjUDI1NktleShjb25zdCBzdHJpbmcmIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB5KTsKKworICAvLworICAvLyBFeHBvcnRzIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgUDI1NiBFQyBQdWJsaWMgS2V5LgorICAvLworICAvLyBAcmV0dXJuIGZhbHNlIGlmZiB0aGUga2V5IGNhbm5vdCBiZSBleHBvcnRlZCAoZm9yIGV4YW1wbGUsIGluY29ycmVjdCB0eXBlKQorICAvLworICBzdGF0aWMgYm9vbCBFeHBvcnRFY1AyNTZLZXkoY29uc3QgUHVibGljS2V5JiBrZXksIHN0cmluZyAqeCwgc3RyaW5nICp5KTsKKworICAvLworICAvLyBJbXBvcnRzIGEgMjA0OCBiaXQgUlNBIFB1YmxpYyBLZXkgdXNpbmcgdGhlIG1vZHVsdXMge0Bjb2RlIG59IGFuZCBleHBvbmVudAorICAvLyB7QGNvZGUgZX0uCisgIC8vCisgIC8vIEByZXR1cm4gbnVsbHB0ciBpZiB0aGUgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFB1YmxpY0tleT4gSW1wb3J0UnNhMjA0OEtleShjb25zdCBzdHJpbmcmIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZSk7CisKKyAgLy8KKyAgLy8gRXhwb3J0cyB0aGUgbW9kdWx1cyBhbmQgZXhwb25lbnQgb2YgYSAyMDQ4IGJpdCBSU0EgUHVibGljIEtleS4KKyAgLy8KKyAgLy8gQHJldHVybiBmYWxzZSBpZmYgdGhlIGtleSBjYW5ub3QgYmUgZXhwb3J0ZWQgKGZvciBleGFtcGxlLCBpbmNvcnJlY3QgdHlwZSkKKyAgLy8KKyAgc3RhdGljIGJvb2wgRXhwb3J0UnNhMjA0OEtleShjb25zdCBQdWJsaWNLZXkmIGtleSwgc3RyaW5nKiBuLCBpbnQzMl90KiBlKTsKKworICAvLworICAvLyBSZXR1cm5zIHRydWUgaWYgYSBzaWdUeXBlIGlzIGEgcHVibGljIGtleSBzY2hlbWUKKyAgLy8KKyAgc3RhdGljIGJvb2wgSXNQdWJsaWNLZXlTY2hlbWUoU2lnVHlwZSBzaWdUeXBlKTsKKworICAvLworICAvLyBJbmRpY2F0ZXMgd2hldGhlciBhICJ0YWciIGlzIG5lZWRlZCBuZXh0IHRvIHRoZSBwbGFpbnRleHQgYm9keSBpbnNpZGUgdGhlCisgIC8vIGNpcGhlcnRleHQsIHRvIHByZXZlbnQgdGhlIHNhbWUgY2lwaGVydGV4dCBmcm9tIGJlaW5nIHJldXNlZCB3aXRoIHNvbWVvbmUKKyAgLy8gZWxzZSdzIHNpZ25hdHVyZSBvbiBpdC4KKyAgLy8KKyAgc3RhdGljIGJvb2wgVGFnZ2VkUGxhaW50ZXh0UmVxdWlyZWQoY29uc3QgS2V5JiBzaWduaW5nX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnVHlwZSBzaWdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBlbmNyeXB0aW9uX2tleSk7CisKKyAgLy8gR2VuZXJhdGVzIGEgMjU2IGJpdCBBRVMgc2VjcmV0IGtleQorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNlY3JldEtleT4gR2VuZXJhdGVBZXMyNTZTZWNyZXRLZXkoKTsKKworICAvLyBHZW5lcmF0ZXMgYSBQMjU2IEVDIGtleSBwYWlyCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8S2V5UGFpcj4gR2VuZXJhdGVFY1AyNTZLZXlQYWlyKCk7CisKKyAgLy8gR2VuZXJhdGVzIGEgMjA0OCBiaXQgUlNBIGtleSBwYWlyCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8S2V5UGFpcj4gR2VuZXJhdGVSc2EyMDQ4S2V5UGFpcigpOworCisgcHJpdmF0ZToKKyAgLy8KKyAgLy8gQHJldHVybiBTSEEtMjU2KFVURi04IGVuY29kZWQgaW5wdXQpCisgIC8vCisgIC8vIFdpbGwgcmV0dXJuIGEgMzIgYnl0ZSBCeXRlQnVmZmVyIHJlcHJlc2VudGluZyB0aGUgU0hBMjU2IG9mIHRoZSBpbnB1dCBieXRlcworICAvLyBXaWxsIHJldHVybiBhIG51bGxwdHIgaWYgYW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJzCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gU2hhMjU2KGNvbnN0IEJ5dGVCdWZmZXImIG1lc3NhZ2UpOworCisgIC8vCisgIC8vIEByZXR1cm4gU0hBMjU2SE1BQyBvZiBzcGVjaWZpZWQgbWVzc2FnZSB1c2luZyBwcm92aWRlZCBrZXkgb3IgbnVsbHB0ciBvbgorICAvLyBlcnJvcgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IFNoYTI1NmhtYWMoY29uc3QgQnl0ZUJ1ZmZlciYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgbWVzc2FnZSk7CisKKyAgLy8KKyAgLy8gQSBzYWx0IHZhbHVlIHNwZWNpZmljIHRvIHRoaXMgbGlicmFyeSwgZ2VuZXJhdGVkIGFzCisgIC8vIFNIQS0yNTYoIlNlY3VyZU1lc3NhZ2UiKQorICAvLworICAvLyBXZSBoYXZlIHRvIGluaXRpYWxpemUgc2FsdCBpbiBjcnlwdG9fb3BzLmNjIGJlY2F1c2UgQysrIGRvZXNuJ3QgYWxsb3cKKyAgLy8gaW5pdGlhbGl6YXRpb24gYW5kIGRlY2xhcmF0aW9uIGluIHRoZSBzYW1lIHBsYWNlLgorICAvLworICBzdGF0aWMgY29uc3QgdWludDhfdCBrU2FsdFtrU2FsdFNpemVdOworCisgIC8vCisgIC8vIFRoZSBIS0RGIChSRkMgNTg2OSkgZXh0cmFjdGlvbiBmdW5jdGlvbiwgdXNpbmcgdGhlIFNIQS0yNTYgaGFzaAorICAvLyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByZS1wcm9jZXNzIHRoZSBpbnB1dEtleU1hdGVyaWFsIGFuZCBtaXgKKyAgLy8gaXQgd2l0aCB0aGUgc2FsdCwgcHJvZHVjaW5nIG91dHB1dCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggSEtERiBleHBhbnNpb24KKyAgLy8gZnVuY3Rpb24gKHdoaWNoIHByb2R1Y2VzIHRoZSBhY3R1YWwgZGVyaXZlZCBrZXkpLgorICAvLworICAvLyBAc2VlICNoa2RmU2hhMjU2RXhwYW5kKEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIpCisgIC8vIEByZXR1cm4gYSBzdGQ6OnVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gd2l0aCBITUFDLVNIQTI1NihzYWx0LAorICAvLyBpbnB1dEtleU1hdGVyaWFsKSAoc2FsdCBpcyB0aGUgImtleSIgZm9yIHRoZSBITUFDKSBvbiBzdWNjZXNzIG9yIGEgbnVsbHB0cgorICAvLyBvbiBlcnJvcgorICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IEhrZGZTaGEyNTZFeHRyYWN0KAorICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgaW5wdXRLZXlNYXRlcmlhbCwgY29uc3QgQnl0ZUJ1ZmZlciYgc2FsdCk7CisKKyAgLy8KKyAgLy8gU3BlY2lhbCBjYXNlIG9mIEhLREYgKFJGQyA1ODY5KSBleHBhbnNpb24gZnVuY3Rpb24sIHVzaW5nIHRoZSBTSEEtMjU2CisgIC8vIGhhc2ggZnVuY3Rpb24gYW5kIGFsbG93aW5nIGZvciBhIG1heGltdW0gb3V0cHV0IGxlbmd0aCBvZiAyNTYgYml0cy4KKyAgLy8KKyAgLy8gQHBhcmFtIHBzZXVkb1JhbmRvbUtleSBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5CisgIC8vICAgICAgICB7QGxpbmsgI2hrZGZTaGEyNTZFeHBhbmQoQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcn0KKyAgLy8gQHBhcmFtIGluZm8gYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHRoZSBkZXJpdmVkIGtleSBzaG91bGQgYmUgYm91bmQgdG8KKyAgLy8gQHJldHVybiBhIHN0ZDo6dW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBob2xkaW5nIGRlcml2ZWQga2V5IGJ5dGVzID0KKyAgLy8gSE1BQy1TSEEyNTYocHNldWRvUmFuZG9tS2V5LCBpbmZvIHwgMHgwMSkgb24gc3VjY2VzcyBvciBhIG51bGxwdHIgb24KKyAgLy8gZXJyb3IKKyAgLy8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBIa2RmU2hhMjU2RXhwYW5kKAorICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgcHNldWRvUmFuZG9tS2V5LCBjb25zdCBCeXRlQnVmZmVyJiBpbmZvKTsKKworICAvLworICAvLyBQZXJmb3JtcyBBRVMgMjU2IENCQyBkZWNyeXB0aW9uIG9mIHtAY29kZSBjaXBoZXJ0ZXh0fSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8ge0Bjb2RlIGl2fSBhbmQge0Bjb2RlIGRlY3J5cHRpb25LZXl9LiAgQXNzdW1lcyBQS0NTIzUgcGFkZGluZyBpcyB1c2VkCisgIC8vCisgIC8vIEByZXR1cm4gYSBzdGQ6OnVuaXF1ZV9wdHIgaG9sZGluZyB0aGUgcGxhaW50ZXh0IChkZWNyeXB0ZWQpIGRhdGEgb3IgYQorICAvLyBudWxscHRyIG9uIGVycm9yCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gQWVzMjU2Q0JDRGVjcnlwdCgKKyAgICAgIGNvbnN0IFNlY3JldEtleSYgZGVjcnlwdGlvbktleSwKKyAgICAgIGNvbnN0IEJ5dGVCdWZmZXImIGl2LAorICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgY2lwaGVydGV4dCk7CisKKyAgLy8KKyAgLy8gUGVyZm9ybXMgQUVTIDI1NiBDQkMgZW5jcnlwdGlvbiBvZiB7QGNvZGUgcGxhaW50ZXh0fSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8ge0Bjb2RlIGl2fSBhbmQge0Bjb2RlIGVuY3J5cHRpb25LZXl9LiAgUEtDUyM1IGlzIHVzZWQuCisgIC8vCisgIC8vIEByZXR1cm4gYSBzdGQ6OnVuaXF1ZV9wdHIgaG9sZGluZyB0aGUgY2lwaGVydGV4dCAoZW5jcnlwdGVkKSBkYXRhIG9yIGEKKyAgLy8gbnVsbHB0ciBvbiBlcnJvcgorICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IEFlczI1NkNCQ0VuY3J5cHQoCisgICAgICBjb25zdCBTZWNyZXRLZXkmIGVuY3J5cHRpb25LZXksCisgICAgICBjb25zdCBCeXRlQnVmZmVyJiBpdiwKKyAgICAgIGNvbnN0IEJ5dGVCdWZmZXImIGNpcGhlcnRleHQpOworCisgIC8vCisgIC8vIEdldCB0aGUgcHVycG9zZSBvZiBhbiBlbmNyeXB0aW9uIHNjaGVtZS4gIEJhc2ljYWxseSBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAvLyBvZiB0aGUgZW51bS4KKyAgLy8KKyAgc3RhdGljIHN0cmluZyBHZXRQdXJwb3NlKEVuY1R5cGUgZW5jVHlwZSk7CisKKyAgLy8KKyAgLy8gR2V0IHRoZSBwdXJwb3NlIG9mIGEgc2lnbmF0dXJlIHNjaGVtZS4gIEJhc2ljYWxseSBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAvLyBvZiB0aGUgZW51bS4KKyAgLy8KKyAgc3RhdGljIHN0cmluZyBHZXRQdXJwb3NlKFNpZ1R5cGUgc2lnVHlwZSk7CisKKyAgLy8gQ29tcHV0ZXMgdGhlIEVDRFNBIFAyNTYgU0hBIDI1NiBNQUMKKyAgLy8KKyAgLy8gQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gYmUgc2lnbmVkCisgIC8vIEBwYXJhbSBzaWduaW5nS2V5IHRoZSBFQ0RTQSBwcml2YXRlIGtleSB1c2VkIGZvciBzaWduaW5nLgorICAvLyBAcmV0dXJuIHN0ZDo6dW5pcXVlX3B0ciBob2xkaW5nIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIE1BQyBvciBudWxscHRyCisgIC8vIG9uIGVycm9yCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gRWNkc2FQMjU2U2hhMjU2U2lnbigKKyAgICAgIGNvbnN0IFByaXZhdGVLZXkmIHByaXZhdGVfa2V5LAorICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgZGF0YSk7CisKKyAgLy8gVmVyaWZpZXMgdGhlIEVDRFNBIFAyNTYgU0hBIDI1NiBzaWduYXR1cmUKKyAgLy8KKyAgLy8gQHBhcmFtIHNpZ25hdHVyZSB0byBiZSB2ZXJpZmllZAorICAvLyBAcGFyYW0gZGF0YSB0aGUgZGF0YSBvdmVyIHdoaWNoIHRoZSBzaWduYXR1cmUgd2FzIGNvbXB1dGVkCisgIC8vIEBwYXJhbSB2ZXJpZmljYXRpb25LZXkgdGhlIEVDRFNBIHB1YmxpYyBrZXkgdXNlZCBmb3IgdmVyaWZpY2F0aW9uLgorICAvLyBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZQorICAvLworICBzdGF0aWMgYm9vbCBFY2RzYVAyNTZTaGEyNTZWZXJpZnkoY29uc3QgUHVibGljS2V5JiBwdWJsaWNfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgZGF0YSk7CisKKyAgLy8KKyAgLy8gUnVucyB0aGUgRWxsaXB0aWMgQ3VydmUgdmFyaWFudCBvZiB0aGUgRGlmZmllLUhlbGxtYW4gYWxnb3JpdGhtLgorICAvLworICAvLyBAcGFyYW0gcHJpdmF0ZV9rZXkgbXVzdCBoYXZlIHRoZSBhbGdvcml0aG0gRUNEU0FfS0VZCisgIC8vIEBwYXJhbSBwZWVyX2tleSBtdXN0IGhhdmUgdGhlIGFsZ29yaXRobSBFQ0RTQV9LRVkKKyAgLy8gQHJldHVybiBhbiBBRVMgc2VjcmV0IGtleSBjcmVhdGVkIGZyb20gdGhlIFNIQS0yNTYgb2YgdGhlIHNlY3JldCBjcmVhdGVkCisgIC8vIGJ5IGFwcGx5aW5nIEVDREggdG8gdGhlIHByaXZhdGVfa2V5IGFuZCB0aGUgcGVlcl9rZXkuCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gRWNkaEtleUFncmVlbWVudCgKKyAgICAgIGNvbnN0IFByaXZhdGVLZXkmIHByaXZhdGVfa2V5LAorICAgICAgY29uc3QgUHVibGljS2V5JiBwZWVyX2tleSk7CisKKworICAvLyBDb21wdXRlcyB0aGUgUlNBIDIwNDggU0hBIDI1NiBzaWduYXR1cmUKKyAgLy8KKyAgLy8gQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gYmUgc2lnbmVkCisgIC8vIEBwYXJhbSBzaWduaW5nS2V5IHRoZSBSU0EgUHJpdmF0ZSBrZXkgdXNlZCB0byBzaWduIHRoZSBkYXRhLiAgVGhlIGtleQorICAvLyBzaG91bGQgYmUgaW4gREVSIGZvcm0uCisgIC8vIEByZXR1cm4gc3RkOjp1bmlxdWVfcHRyIGhvbGRpbmcgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgTUFDIG9yIG51bGxwdHIKKyAgLy8gb24gZXJyb3IKKyAgLy8KKyAgLy8gVE9ETyhhY3plc2tpcyk6IHJlZmFjdG9yIHNpZ24gYW5kIHZlcmlmeSB0byBiZSB2aXJ0dWFsIGZ1bmN0aW9ucyBvZiBrZXkKKyAgLy8gb2JqZWN0cworICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IFJzYTIwNDhTaGEyNTZTaWduKAorICAgICAgY29uc3QgUHJpdmF0ZUtleSYgcHJpdmF0ZV9rZXksIGNvbnN0IEJ5dGVCdWZmZXImIGRhdGEpOworCisgIC8vIFZlcmlmaWVzIHRoZSBSU0EgMjA0OCBTSEEgMjU2IE1BQworICAvLworICAvLyBAcGFyYW0gc2lnbmF0dXJlIHRvIGJlIHZlcmlmaWVkCisgIC8vIEBwYXJhbSBkYXRhIHRoZSBkYXRhIG92ZXIgd2hpY2ggdGhlIHNpZ25hdHVyZSB3YXMgY29tcHV0ZWQKKyAgLy8gQHBhcmFtIHZlcmlmaWNhdGlvbktleSB0aGUgUlNBIHB1YmxpYyBrZXkgdXNlZCBmb3IgdmVyaWZpY2F0aW9uCisgIC8vIEByZXR1cm4gYm9vbCB0cnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlCisgIC8vCisgIHN0YXRpYyBib29sIFJzYTIwNDhTaGEyNTZWZXJpZnkoY29uc3QgUHVibGljS2V5JiBwdWJsaWNfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVCdWZmZXImIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlQnVmZmVyJiBkYXRhKTsKKworICBzdGF0aWMgYm9vbCBJc1ZhbGlkRWNQMjU2Q29vcmRpbmF0ZUVuY29kaW5nKGNvbnN0IHN0cmluZyYgYnl0ZXMpOworCisgIHN0YXRpYyBib29sIElzVmFsaWRSc2EyMDQ4TW9kdWx1c0VuY29kaW5nKGNvbnN0IHN0cmluZyYgYnl0ZXMpOworCisgIC8vCisgIC8vIENvbnZlcnRzIGludDMyIHZhbHVlIHRvIGFuIGFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLiBUaGUKKyAgLy8gYnl0ZXMgYXJlIGluIGJpZy1lbmRpYW4gb3JkZXIuCisgIC8vCisgIHN0YXRpYyBzdHJpbmcgSW50MzJCeXRlc1RvU3RyaW5nKGludDMyX3QgdmFsdWUpOworCisgIC8vCisgIC8vIENvbnZlcnRzIGEgc3RyaW5nIG9mIGJ5dGVzIHRvIGFuIGludDMyIHZhbHVlLiBGYWlscyBpZiB0aGUgYnl0ZXMgZG8gbm90IGZpdAorICAvLyBpbiB0aGUgaW50MzIgdHlwZS4gVGhlIGJ5dGVzIGFyZSBpbiBiaWctZW5kaWFuIG9yZGVyLgorICAvLworICBzdGF0aWMgYm9vbCBTdHJpbmdUb0ludDMyQnl0ZXMoY29uc3Qgc3RyaW5nJiB2YWx1ZSwgaW50MzJfdCogcmVzdWx0KTsKKworICAvLyBGb3IgdGVzdGluZyBwcml2YXRlIGhlbHBlciBmdW5jdGlvbnMKKyAgZnJpZW5kIGNsYXNzIENyeXB0b09wc1Rlc3Q7CisKKyAgdmlydHVhbCB+Q3J5cHRvT3BzKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZQorI2VuZGlmICAvLyBTRUNVUkVNRVNTQUdFX0NSWVBUT19PUFNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2UvcHVibGljX2tleV9wcm90b191dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3B1YmxpY19rZXlfcHJvdG9fdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZGYzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3B1YmxpY19rZXlfcHJvdG9fdXRpbC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0VDVVJFTUVTU0FHRV9QVUJMSUNfS0VZX1BST1RPX1VUSUxfSF8KKyNkZWZpbmUgU0VDVVJFTUVTU0FHRV9QVUJMSUNfS0VZX1BST1RPX1VUSUxfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL2NvbW1vbi5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvY3J5cHRvX29wcy5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UucGIuaCIKKworbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UgeworCitjbGFzcyBQdWJsaWNLZXlQcm90b1V0aWwgeworIHB1YmxpYzoKKyAgLy8KKyAgLy8gRW5jb2RlcyB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFB1YmxpY0tleSBpbnRvIHRoZSBhcHByb3ByaWF0ZQorICAvLyBwcm90b2J1ZiBmb3JtYXQuCisgIC8vCisgIC8vIEByZXR1cm4gbnVsbHB0ciBpZiB0aGUgUHVibGljS2V5IGlzIG5vdCBzdXBwb3J0ZWQKKyAgLy8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBFbmNvZGVQdWJsaWNLZXkoCisgICAgICBjb25zdCBDcnlwdG9PcHM6OlB1YmxpY0tleSYga2V5KTsKKworICAvLworICAvLyBUcmFuc2Zvcm1zIHRoZSBwcm90b2J1ZiBmb3JtYXQgaW50byBhIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEKKyAgLy8gUHVibGljS2V5LgorICAvLworICAvLyBAcmV0dXJuIG51bGxwdHIgaWYgdGhlIEdlbmVyaWNQdWJsaWNLZXkgcHJvdG9idWYgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpQdWJsaWNLZXk+IFBhcnNlUHVibGljS2V5KAorICAgICAgY29uc3QgR2VuZXJpY1B1YmxpY0tleSYga2V5KTsKKworIHByaXZhdGU6CisgIHZpcnR1YWwgflB1YmxpY0tleVByb3RvVXRpbCgpIHt9CisKKyAgLy8gQHJldHVybiBudWxscHRyIGlmIHRoZSBQdWJsaWNLZXkgaXMgbm90IHN1cHBvcnRlZAorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEVjUDI1NlB1YmxpY0tleT4gRW5jb2RlRWNQdWJsaWNLZXkoCisgICAgICBjb25zdCBDcnlwdG9PcHM6OlB1YmxpY0tleSYga2V5KTsKKworICAvLyBAcmV0dXJuIG51bGxwdHIgaWYgdGhlIEVjUDI1NlB1YmxpY0tleSBpcyBpbnZhbGlkCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpQdWJsaWNLZXk+IFBhcnNlRWNQdWJsaWNLZXkoCisgICAgICBjb25zdCBFY1AyNTZQdWJsaWNLZXkmIGtleSk7CisKKyAgLy8gQHJldHVybiBudWxscHRyIGlmIHRoZSBQdWJsaWNLZXkgaXMgbm90IHN1cHBvcnRlZAorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNpbXBsZVJzYVB1YmxpY0tleT4gRW5jb2RlUnNhUHVibGljS2V5KAorICAgICAgY29uc3QgQ3J5cHRvT3BzOjpQdWJsaWNLZXkmIGtleSk7CisKKyAgLy8gQHJldHVybiBudWxscHRyIGlmIHRoZSBTaW1wbGVSc2FQdWJsaWNLZXkgaXMgaW52YWxpZAorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiBQYXJzZVJzYVB1YmxpY0tleSgKKyAgICAgIGNvbnN0IFNpbXBsZVJzYVB1YmxpY0tleSYga2V5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCisjZW5kaWYgIC8vIFNFQ1VSRU1FU1NBR0VfUFVCTElDX0tFWV9QUk9UT19VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3Jhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2UvcmF3X3NlY3VyZV9tZXNzYWdlX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjRiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3Jhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNFQ1VSRU1FU1NBR0VfUkFXX1NFQ1VSRV9NRVNTQUdFX1BBUlNFUl9IXworI2RlZmluZSBTRUNVUkVNRVNTQUdFX1JBV19TRUNVUkVfTUVTU0FHRV9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvY29tbW9uLmgiCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzLmgiCisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKKworLy8gVXRpbGl0eSBjbGFzcyB0byBwYXJzZSBhbmQgdmVyaWZ5IHJhdyBieXRlIHtAbGluayBTZWN1cmVNZXNzYWdlfSBwcm90b3MuCisvLyBWZXJpZmllcyB0aGUgc2lnbmF0dXJlIG9uIHRoZSBtZXNzYWdlLCBhbmQgZGVjcnlwdHMgInNpZ25jcnlwdGVkIiBtZXNzYWdlcworLy8gKHdoaWxlIHNpbXVsdGFuZW91c2x5IHZlcmlmeWluZyB0aGUgc2lnbmF0dXJlKS4KKy8vCisvLyBAc2VlIFJhd1NlY3VyZU1lc3NhZ2VCdWlsZGVyCitjbGFzcyBSYXdTZWN1cmVNZXNzYWdlUGFyc2VyIHsKKyBwdWJsaWM6CisgIC8vCisgIC8vIFBhcnNlcyBhIHJhdyB7QGxpbmsgU2VjdXJlTWVzc2FnZX0gdGhhdCBpcyBhbHJlYWR5IHNlcGFyYXRlZCBvdXQgaW50bworICAvLyBzaWduYXR1cmUgYW5kIGhlYWRlckFuZEJvZHksIGNvbnRhaW5pbmcgYSBjbGVhcnRleHQgcGF5bG9hZCBib2R5LCBhbmQKKyAgLy8gdmVyaWZpZXMgdGhlIHNpZ25hdHVyZS4KKyAgLy8KKyAgLy8gQHBhcmFtIGFzc29jaWF0ZWRfZGF0YSBvcHRpb25hbCBhc3NvY2lhdGVkIGRhdGEgYm91bmQgdG8gdGhlIHNpZ25hdHVyZSAoYnV0CisgIC8vIG5vdCBpbiB0aGUgbWVzc2FnZSkuICBTZW5kIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vdCB1c2luZy4KKyAgLy8gQHJldHVybiBhIHN0cmluZyB0byB0aGUgcmF3IHtAbGluayBIZWFkZXJBbmRCb2R5fSBwYWlyICh3aGljaAorICAvLyBpcyBmdWxseSB2ZXJpZmllZCkgb3IgYSBudWxscHRyIG9uIGVycm9yIEBzZWUKKyAgLy8gU2VjdXJlTWVzc2FnZUJ1aWxkZXIjQnVpbGRTaWduZWRDbGVhcnRleHRNZXNzYWdlCisgIC8vCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBQYXJzZVNpZ25lZENsZWFydGV4dE1lc3NhZ2UoCisgICAgICBjb25zdCBzdHJpbmcmIHNpZ25hdHVyZSwKKyAgICAgIGNvbnN0IHN0cmluZyYgaGVhZGVyX2FuZF9ib2R5LAorICAgICAgY29uc3QgQ3J5cHRvT3BzOjpLZXkmIHZlcmlmaWNhdGlvbl9rZXksCisgICAgICBDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUsCisgICAgICBjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSk7CisKKyAgLy8KKyAgLy8gUGFyc2VzIGEgcmF3IHtAbGluayBTZWN1cmVNZXNzYWdlfSB0aGF0IGlzIGFscmVhZHkgc2VwYXJhdGVkIG91dCBpbnRvCisgIC8vIHNpZ25hdHVyZSBhbmQgaGVhZGVyQW5kQm9keSwgY29udGFpbmluZyBhbiBlbmNyeXB0ZWQgcGF5bG9hZCBib2R5LAorICAvLyBleHRyYWN0aW5nIGEgZGVjcnlwdGlvbiBvZiB0aGUgcGF5bG9hZCBib2R5IGFuZCB2ZXJpZnlpbmcgdGhlIHNpZ25hdHVyZS4KKyAgLy8KKyAgLy8gQHJldHVybiBhIHN0cmluZyB0byB0aGUgdGhlIHJhdyB7QGxpbmsgSGVhZGVyQW5kQm9keX0gcGFpcgorICAvLyAod2hpY2ggaXMgZnVsbHkgdmVyaWZpZWQgYW5kIGRlY3J5cHRlZCBvciBhIG51bGxwdHIgb24gZXJyb3IKKyAgLy8gQHNlZSBTZWN1cmVNZXNzYWdlQnVpbGRlciNCdWlsZFNpZ25DcnlwdGVkTWVzc2FnZQorICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4gUGFyc2VTaWduQ3J5cHRlZE1lc3NhZ2UoCisgICAgICBjb25zdCBzdHJpbmcmIHNpZ25hdHVyZSwKKyAgICAgIGNvbnN0IHN0cmluZyYgaGVhZGVyX2FuZF9ib2R5LAorICAgICAgY29uc3QgQ3J5cHRvT3BzOjpLZXkmIHZlcmlmaWNhdGlvbl9rZXksCisgICAgICBDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUsCisgICAgICBjb25zdCBDcnlwdG9PcHM6OlNlY3JldEtleSYgZGVjcnlwdGlvbl9rZXksCisgICAgICBDcnlwdG9PcHM6OkVuY1R5cGUgZW5jX3R5cGUsCisgICAgICBjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSk7CisKKyBwcml2YXRlOgorICBSYXdTZWN1cmVNZXNzYWdlUGFyc2VyKCk7ICAvLyBEbyBub3QgaW5zdGFudGlhdGUKKyAgflJhd1NlY3VyZU1lc3NhZ2VQYXJzZXIoKTsKKworICAvLworICAvLyBWZXJpZmllcyB0aGUgY29tcG9uZW50cyBvZiBhIHJhdyB7QGxpbmsgSGVhZGVyQW5kQm9keX0uCisgIC8vCisgIC8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaGVhZGVyX2FuZF9ib2R5IGNhbiBiZSB2ZXJpZmllZC4KKyAgLy8KKyAgc3RhdGljIGJvb2wgVmVyaWZ5SGVhZGVyQW5kQm9keSgKKyAgICAgIGNvbnN0IHN0cmluZyYgc2lnbmF0dXJlLAorICAgICAgY29uc3Qgc3RyaW5nJiBoZWFkZXJfYW5kX2JvZHksCisgICAgICBjb25zdCBDcnlwdG9PcHM6OktleSYgdmVyaWZpY2F0aW9uX2tleSwKKyAgICAgIENyeXB0b09wczo6U2lnVHlwZSBzaWdfdHlwZSwKKyAgICAgIENyeXB0b09wczo6RW5jVHlwZSBlbmNfdHlwZSwKKyAgICAgIGNvbnN0IHN0cmluZyYgYXNzb2NpYXRlZF9kYXRhLAorICAgICAgYm9vbCBzdXBwcmVzc19hc3NvY2lhdGVkX2RhdGEpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKKyNlbmRpZiAgLy8gU0VDVVJFTUVTU0FHRV9SQVdfU0VDVVJFX01FU1NBR0VfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX2J1aWxkZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2VfYnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2UyODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX2J1aWxkZXIuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRUNVUkVNRVNTQUdFX1NFQ1VSRV9NRVNTQUdFX0JVSUxERVJfSF8KKyNkZWZpbmUgU0VDVVJFTUVTU0FHRV9TRUNVUkVfTUVTU0FHRV9CVUlMREVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlLnBiLmgiCisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL2J5dGVfYnVmZmVyLmgiCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9jb21tb24uaCIKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL2NyeXB0b19vcHMuaCIKKworbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UgeworCisvLworLy8gQnVpbGRlciBmb3Ige0BsaW5rIFNlY3VyZU1lc3NhZ2V9IHByb3Rvcy4gQ2FuIGJlIHVzZWQgdG8gY3JlYXRlIGVpdGhlciBzaWduZWQKKy8vIG1lc3NhZ2VzLCBvciAic2lnbmNyeXB0ZWQiIChlbmNyeXB0ZWQgdGhlbiBzaWduZWQpIG1lc3NhZ2VzIHRoYXQgaW5jbHVkZSBhCisvLyB0aWdodCBiaW5kaW5nIGJldHdlZW4gdGhlIGNpcGhlcnRleHQgcG9ydGlvbiBhbmQgYSB2ZXJpZmljYXRpb24ga2V5IGlkZW50aXR5LgorLy8KKy8vIEFsbCB0aGUgbGFuZ3VhZ2Ugbm9uLXNwZWNpZmljIHdvcmsgaXMgZG9uZSBmcm9tIHdpdGhpbiB0aGUKKy8vIHtAbGluayBSYXdTZWN1cmVNZXNzYWdlQnVpbGRlcn0gY2xhc3MuCisvLworLy8gQHNlZSBTZWN1cmVNZXNzYWdlUGFyc2VyCisvLyBAc2VlIFJhd1NlY3VyZU1lc3NhZ2VCdWlsZGVyCisvLworY2xhc3MgU2VjdXJlTWVzc2FnZUJ1aWxkZXIgeworIHB1YmxpYzoKKyAgU2VjdXJlTWVzc2FnZUJ1aWxkZXIoKTsKKworICB2aXJ0dWFsIH5TZWN1cmVNZXNzYWdlQnVpbGRlcigpOworCisgIC8vCisgIC8vIFJlc2V0cyB0aGlzIHtAbGluayBTZWN1cmVNZXNzYWdlQnVpbGRlcn0gaW5zdGFuY2UgdG8gYSBibGFuayBjb25maWd1cmF0aW9uCisgIC8vIChhbmQgcmV0dXJucyBpdCkuCisgIC8vCisgIFNlY3VyZU1lc3NhZ2VCdWlsZGVyKiBSZXNldCgpOworCisgIC8vCisgIC8vIE9wdGlvbmFsIG1ldGFkYXRhIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGluIHRoaXMKKyAgLy8ge0BsaW5rIFNlY3VyZU1lc3NhZ2V9LgorICAvLyA8cD4KKyAgLy8gTm90ZSB0aGF0IHRoaXMgdmFsdWUgd2lsbCBiZSBzZW50IDxlbT5VTkVOQ1JZUFRFRDwvZW0+IGluIGFsbCBjYXNlcy4KKyAgLy8gPHA+CisgIC8vIENhbiBiZSB1c2VkIHdpdGggZWl0aGVyIGNsZWFydGV4dCBvciBzaWduY3J5cHRlZCBtZXNzYWdlcywgYnV0IGlzIGludGVuZGVkCisgIC8vIHByaW1hcmlseSBmb3IgdXNlIHdpdGggc2lnbmNyeXB0ZWQgbWVzc2FnZXMuCisgIC8vCisgIFNlY3VyZU1lc3NhZ2VCdWlsZGVyKiBTZXRQdWJsaWNNZXRhZGF0YShjb25zdCBzdHJpbmcmIHB1YmxpY19tZXRhZGF0YSk7CisKKyAgLy8KKyAgLy8gVGhlIHJlY2lwaWVudCBvZiB0aGUge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5CisgIC8vIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZXJpZmljYXRpb24ga2V5LCBnaXZlbiBvbmx5IHRoaXMgdmFsdWUuCisgIC8vIDxwPgorICAvLyBDYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBjbGVhcnRleHQgb3Igc2lnbmNyeXB0ZWQgbWVzc2FnZXMuIFNldHRpbmcgdGhpcyBpcworICAvLyBtYW5kYXRvcnkgZm9yIHNpZ25jcnlwdGVkIG1lc3NhZ2VzIHVzaW5nIGEgcHVibGljIGtleSBDcnlwdG9PcHM6OlNpZ1R5cGUsCisgIC8vIGluIG9yZGVyIHRvIGJpbmQgdGhlIGVuY3J5cHRlZCBib2R5IHRvIGEgc3BlY2lmaWMgdmVyaWZpY2F0aW9uIGtleS4KKyAgLy8gPHA+CisgIC8vIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGlzIHNlbnQgPGVtPlVORU5DUllQVEVEPC9lbT4gaW4gYWxsIGNhc2VzLgorICAvLworICBTZWN1cmVNZXNzYWdlQnVpbGRlciogU2V0VmVyaWZpY2F0aW9uS2V5SWQoY29uc3Qgc3RyaW5nJiB2ZXJpZmljYXRpb25fa2V5X2lkKTsKKworICAvLworICAvLyBUbyBiZSB1c2VkIG9ubHkgd2l0aCB7QGxpbmsgI0J1aWxkU2lnbkNyeXB0ZWRNZXNzYWdlKENyeXB0b09wczo6S2V5LAorICAvLyBDcnlwdG9PcHM6OlNpZ1R5cGUsIENyeXB0b09wczo6S2V5LCBDcnlwdG9PcHM6OkVuY1R5cGUsIHN0cmluZyl9LAorICAvLyB0aGlzIHZhbHVlIGlzIHNlbnQgPGVtPlVORU5DUllQVEVEPC9lbT4gYXMgcGFydCBvZiB0aGUgaGVhZGVyLiBJdCBzaG91bGQgYmUKKyAgLy8gdXNlZCBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSB7QGxpbmsgU2VjdXJlTWVzc2FnZX0gdG8gaWRlbnRpZnkgYW4KKyAgLy8gYXBwcm9wcmlhdGUga2V5IHRvIHVzZSBmb3IgZGVjcnlwdGluZyB0aGUgbWVzc2FnZSBib2R5LgorICAvLworICBTZWN1cmVNZXNzYWdlQnVpbGRlciogU2V0RGVjcnlwdGlvbktleUlkKGNvbnN0IHN0cmluZyYgZGVjcnlwdGlvbl9rZXlfaWQpOworCisgIC8vCisgIC8vIEFkZGl0aW9uYWwgZGF0YSBpcyAiYXNzb2NpYXRlZCIgd2l0aCB0aGlzIHtAbGluayBTZWN1cmVNZXNzYWdlfSwgYnV0IHdpbGwKKyAgLy8gbm90IGJlIHNlbnQgYXMgcGFydCBvZiBpdC4gVGhlIHJlY2lwaWVudCBvZiB0aGUge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IHdpbGwKKyAgLy8gbmVlZCB0byBwcm92aWRlIHRoZSBzYW1lIGRhdGEgaW4gb3JkZXIgdG8gdmVyaWZ5IHRoZSBtZXNzYWdlIGJvZHkuIFNldHRpbmcKKyAgLy8gdGhpcyB0byB7QGNvZGUgbnVsbH0gaXMgZXF1aXZhbGVudCB0byB1c2luZyBhbiBlbXB0eSBhcnJheSAodW5saWtlIHRoZQorICAvLyBiZWhhdmlvciBvZiB7QGNvZGUgVmVyaWZpY2F0aW9uS2V5SWR9IGFuZCB7QGNvZGUgRGVjcnlwdGlvbktleUlkfSkuCisgIC8vIDxwPgorICAvLyBOb3RlIHRoYXQgdGhlIDxlbT5zaXplPC9lbT4gKGxlbmd0aCBpbiBieXRlcykgb2YgdGhlIGFzc29jaWF0ZWQgZGF0YSB3aWxsCisgIC8vIGJlIHNlbnQgaW4gdGhlIDxlbT5VTkVOQ1JZUFRFRDwvZW0+IGhlYWRlciBpbmZvcm1hdGlvbiwgZXZlbiBpZiB5b3UgYXJlCisgIC8vIHVzaW5nIGVuY3J5cHRpb24uCisgIC8vIDxwPgorICAvLyBJZiB5b3Ugd2lsbCBiZSB1c2luZyB7QGxpbmsgI0J1aWxkU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZShDcnlwdG9PcHM6OktleSwKKyAgLy8gQ3J5cHRvT3BzOjpTaWdUeXBlLCBzdHJpbmcpfSwgdGhlbiBhbnlvbmUgb2JzZXJ2aW5nIHRoZQorICAvLyB7QGxpbmsgU2VjdXJlTWVzc2FnZX0gbWF5IGJlIGFibGUgdG8gaW5mZXIgdGhpcyBhc3NvY2lhdGVkIGRhdGEgdmlhIGFuCisgIC8vICJvZmZsaW5lIGRpY3Rpb25hcnkgYXR0YWNrIi4gVGhhdCBpcywgd2hlbiBubyBlbmNyeXB0aW9uIGlzIHVzZWQsIHlvdSB3aWxsCisgIC8vIG5vdCBiZSBoaWRpbmcgdGhpcyBkYXRhIHNpbXBseSBiZWNhdXNlIGl0IGlzIG5vdCBiZWluZyBzZW50IG92ZXIgdGhlIHdpcmUuCisgIC8vCisgIFNlY3VyZU1lc3NhZ2VCdWlsZGVyKiBTZXRBc3NvY2lhdGVkRGF0YShjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSk7CisKKyAgLy8KKyAgLy8gR2VuZXJhdGVzIGEgc2lnbmVkIHtAbGluayBTZWN1cmVNZXNzYWdlfSB3aXRoIHRoZSBwYXlsb2FkIHtAY29kZSBib2R5fSBsZWZ0CisgIC8vIDxlbT5VTkVOQ1JZUFRFRDwvZW0+LgorICAvLyA8cD4KKyAgLy8gTm90ZSB0aGF0IGlmIHlvdSBoYXZlIHVzZWQge0BsaW5rICNTZXRBc3NvY2lhdGVkRGF0YShzdHJpbmcpfSwgdGhlCisgIC8vIGFzc29jaWF0ZWQgZGF0YSB3aWxsCisgIC8vIGJlIHN1YmplY3QgdG8gb2ZmbGluZSBkaWN0aW9uYXJ5IGF0dGFja3MgaWYgeW91IHVzZSBhIHB1YmxpYyBrZXkge0BsaW5rCisgIC8vIENyeXB0b09wczo6U2lnVHlwZX0uCisgIC8vIDxwPgorICAvLyBEb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0IHN5bW1ldHJpYyBrZXlzIHN0b3JlZCBpbiBhIFRQTQorICAvLyA8cD4KKyAgLy8gQ2FuIHJldHVybiBudWxscHRyIG9uIGVycm9yCisgIC8vCisgIC8vIEBzZWUgU2VjdXJlTWVzc2FnZVBhcnNlciNQYXJzZVNpZ25lZENsZWFydGV4dE1lc3NhZ2UKKyAgLy8KKyAgc3RkOjp1bmlxdWVfcHRyPFNlY3VyZU1lc3NhZ2U+IEJ1aWxkU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZSgKKyAgICAgIGNvbnN0IENyeXB0b09wczo6S2V5JiBzaWduaW5nX2tleSwgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLAorICAgICAgY29uc3Qgc3RyaW5nJiBib2R5KTsKKworICAvLworICAvLyBHZW5lcmF0ZXMgYSBzaWduZWQgYW5kIGVuY3J5cHRlZCB7QGxpbmsgU2VjdXJlTWVzc2FnZX0uIElmIHRoZSBzaWduYXR1cmUKKyAgLy8gdHlwZSByZXF1aXJlcyBhIHB1YmxpYyBrZXksIHN1Y2ggYXMgd2l0aCBFQ0RTQV9QMjU2X1NIQTI1NiwgdGhlbiB0aGUgY2FsbGVyCisgIC8vIDxlbT5tdXN0PC9lbT4gc2V0IGEgdmVyaWZpY2F0aW9uIGlkIHVzaW5nIHRoZQorICAvLyB7QGxpbmsgI1NldFZlcmlmaWNhdGlvbktleUlkKHN0cmluZyl9IG1ldGhvZC4gVGhlIHZlcmlmaWNhdGlvbiBrZXkKKyAgLy8gaWQgd2lsbCBiZSBib3VuZCB0byB0aGUgZW5jcnlwdGVkIHtAY29kZSBib2R5fSwgcHJldmVudGluZyBhdHRhY2tzIHRoYXQKKyAgLy8gaW52b2x2ZSBzdHJpcHBpbmcgdGhlIHNpZ25hdHVyZSBhbmQgdGhlbiByZS1zaWduaW5nIHRoZSBlbmNyeXB0ZWQKKyAgLy8ge0Bjb2RlIGJvZHl9IGFzIGlmIGl0IHdhcyBvcmlnaW5hbGx5IHNlbnQgYnkgdGhlIGF0dGFja2VyLgorICAvLworICAvLyA8cD4gSXQgaXMgc2FmZSB0byByZS11c2Ugb25lIHtAbGluayBTZWNyZXRLZXl9IGFzIGJvdGgKKyAgLy8ge0Bjb2RlIHNpZ25pbmdLZXl9IGFuZCB7QGNvZGUgZW5jcnlwdGlvbktleX0sIGV2ZW4gaWYgdGhhdCBrZXkgaXMgYWxzbyB1c2VkCisgIC8vIGZvciB7QGxpbmsgI2J1aWxkU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZShLZXksIFNpZ1R5cGUsIGJ5dGVbXSl9LiBJbiBmYWN0LAorICAvLyB0aGUgcmVzdWx0aW5nIG91dHB1dCBlbmNvZGluZyB3aWxsIGJlIG1vcmUgY29tcGFjdCB3aGVuIHRoZSBzYW1lIHN5bW1ldHJpYworICAvLyBrZXkgaXMgdXNlZCBmb3IgYm90aC4KKyAgLy8KKyAgLy8gPHA+IE5vdGUgdGhhdCBQdWJsaWNNZXRhZGF0YSBhbmQgb3RoZXIgaGVhZGVyIGZpZWxkcyBhcmUgbGVmdAorICAvLyA8ZW0+VU5FTkNSWVBURUQ8L2VtPi4KKyAgLy8KKyAgLy8gPHA+IERvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgc3ltbWV0cmljIGtleXMgc3RvcmVkIGluIGEgVFBNCisgIC8vCisgIC8vIDxwPiBDYW4gcmV0dXJuIG51bGxwdHIgb24gZXJyb3IKKyAgLy8KKyAgLy8gQHBhcmFtIGVuY1R5cGUgPGVtPm11c3Qgbm90PC9lbT4gYmUgc2V0IHRvIHtAbGluayBFbmNUeXBlI05PTkV9CisgIC8vIEBzZWUgU2VjdXJlTWVzc2FnZVBhcnNlciNwYXJzZVNpZ25DcnlwdGVkTWVzc2FnZShTZWN1cmVNZXNzYWdlLAorICAvLyAgICAgIENyeXB0b09wczo6S2V5LCBDcnlwdG9PcHM6OlNpZ1R5cGUsIENyeXB0b09wczo6S2V5LAorICAvLyBDcnlwdG9PcHM6OkVuY1R5cGUpCisgIC8vCisgIHN0ZDo6dW5pcXVlX3B0cjxTZWN1cmVNZXNzYWdlPiBCdWlsZFNpZ25DcnlwdGVkTWVzc2FnZSgKKyAgICAgIGNvbnN0IENyeXB0b09wczo6S2V5JiBzaWduaW5nX2tleSwgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLAorICAgICAgY29uc3QgQ3J5cHRvT3BzOjpTZWNyZXRLZXkmIGVuY3J5cHRpb25fa2V5LCBDcnlwdG9PcHM6OkVuY1R5cGUgZW5jX3R5cGUsCisgICAgICBjb25zdCBzdHJpbmcmIGJvZHkpOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHB1YmxpY19tZXRhZGF0YV87CisgIHN0ZDo6dW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBkZWNyeXB0aW9uX2tleV9pZF87CisgIHN0ZDo6dW5pcXVlX3B0cjxCeXRlQnVmZmVyPiB2ZXJpZmljYXRpb25fa2V5X2lkXzsKKyAgc3RkOjp1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGFzc29jaWF0ZWRfZGF0YV87CisKKyAgLy8gQHBhcmFtIGl2IElWIG9yIHtAY29kZSBudWxsfSBpZiBJViB0byBiZSBsZWZ0IHVuc2V0IGluIHRoZSBIZWFkZXIKKyAgc3RkOjp1bmlxdWVfcHRyPEhlYWRlcj4gQnVpbGRIZWFkZXIoQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVuY1R5cGUgZW5jX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+JiBpdik7CisKKyAgQnl0ZUJ1ZmZlciBTZXJpYWxpemVIZWFkZXJBbmRCb2R5KGNvbnN0IHN0cmluZyYgaGVhZGVyLCBjb25zdCBzdHJpbmcmIGJvZHkpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxTZWN1cmVNZXNzYWdlPiBDcmVhdGVTaWduZWRSZXN1bHQoCisgICAgICBjb25zdCBDcnlwdG9PcHM6OktleSYgc2lnbmluZ19rZXksIGNvbnN0IENyeXB0b09wczo6U2lnVHlwZSYgc2lnX3R5cGUsCisgICAgICBjb25zdCBCeXRlQnVmZmVyJiBoZWFkZXJfYW5kX2JvZHksIGNvbnN0IEJ5dGVCdWZmZXImIGFzc29jaWF0ZWRfZGF0YSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZQorI2VuZGlmICAvLyBTRUNVUkVNRVNTQUdFX1NFQ1VSRV9NRVNTQUdFX0JVSUxERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2VfcGFyc2VyLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxN2NlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3BhcnNlci5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0VDVVJFTUVTU0FHRV9TRUNVUkVfTUVTU0FHRV9QQVJTRVJfSF8KKyNkZWZpbmUgU0VDVVJFTUVTU0FHRV9TRUNVUkVfTUVTU0FHRV9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UucGIuaCIKKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvY29tbW9uLmgiCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzLmgiCisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKKworLy8gVGhpcyBpcyBhIGxpZ2h0IHdyYXBwZXIgb24ge0BsaW5rIFJhd1NlY3VyZU1lc3NhZ2VQYXJzZXJ9IHRoYXQgYmluZHMgdG8KKy8vIHRoZSBjKysgcHJvdG9idWYgaW1wbGVtZW50YXRpb24uCisvLyBVdGlsaXR5IGNsYXNzIHRvIHBhcnNlIGFuZCB2ZXJpZnkge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IHByb3Rvcy4gVmVyaWZpZXMgdGhlCisvLyBzaWduYXR1cmUgb24gdGhlIG1lc3NhZ2UsIGFuZCBkZWNyeXB0cyAic2lnbmNyeXB0ZWQiIG1lc3NhZ2VzICh3aGlsZQorLy8gc2ltdWx0YW5lb3VzbHkgdmVyaWZ5aW5nIHRoZSBzaWduYXR1cmUpLgorLy8KKy8vIEBzZWUgU2VjdXJlTWVzc2FnZUJ1aWxkZXIKK2NsYXNzIFNlY3VyZU1lc3NhZ2VQYXJzZXIgeworIHB1YmxpYzoKKyAgLy8gRXh0cmFjdHMgdGhlIHtAbGluayBIZWFkZXJ9IGNvbXBvbmVudCBmcm9tIGEge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IGJ1dAorICAvLyA8ZW0+RE9FUyBOT1QgVkVSSUZZPC9lbT4gdGhlIHNpZ25hdHVyZSB3aGVuIGRvaW5nIHNvLiBDYWxsZXJzIHNob3VsZCBub3QKKyAgLy8gdHJ1c3QgdGhlIHJlc3VsdGluZyBvdXRwdXQgdW50aWwgYWZ0ZXIgYSBzdWJzZXF1ZW50IHtAY29kZSBwYXJzZSooKX0gY2FsbAorICAvLyBoYXMgc3VjY2VlZGVkLgorICAvLworICAvLyA8cD5UaGUgaW50ZW50aW9uIGlzIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZQorICAvLyBwcm90b2NvbCBtZXNzYWdlIGFuZCB3aGljaCBrZXlzIGFyZSBpbiB1c2UsIHByaW9yIHRvIGF0dGVtcHRpbmcgdG8gdmVyaWZ5CisgIC8vIChhbmQgcG9zc2libHkgZGVjcnlwdCkgdGhlIHBheWxvYWQgYm9keS4KKyAgLy8KKyAgLy8gPHA+VGhlIGNhbGwgd2lsbCByZXR1cm4gYSBzdGQ6OnVuaXF1ZV9wdHIgb24gc3VjY2VzcyBhbmQgYSBudWxscHRyIG9uIGVycm9yCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SGVhZGVyPiBHZXRVbnZlcmlmaWVkSGVhZGVyKAorICAgICAgY29uc3QgU2VjdXJlTWVzc2FnZSYgc2VjbXNnKTsKKworICAvLworICAvLyBQYXJzZXMgYSB7QGxpbmsgU2VjdXJlTWVzc2FnZX0gY29udGFpbmluZyBhIGNsZWFydGV4dCBwYXlsb2FkIGJvZHksIGFuZAorICAvLyB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlLgorICAvLworICAvLyBAcmV0dXJuIGEgc3RkOjp1bmlxdWVfcHRyIHRvIHRoZSBwYXJzZWQge0BsaW5rIEhlYWRlckFuZEJvZHl9IHBhaXIgKHdoaWNoCisgIC8vIGlzIGZ1bGx5IHZlcmlmaWVkKSBvciBhIG51bGxwdHIgb24gZXJyb3IgQHNlZQorICAvLyBTZWN1cmVNZXNzYWdlQnVpbGRlciNCdWlsZFNpZ25lZENsZWFydGV4dE1lc3NhZ2UKKyAgLy8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxIZWFkZXJBbmRCb2R5PiBQYXJzZVNpZ25lZENsZWFydGV4dE1lc3NhZ2UoCisgICAgICBjb25zdCBTZWN1cmVNZXNzYWdlJiBzZWNtc2csIGNvbnN0IENyeXB0b09wczo6S2V5JiB2ZXJpZmljYXRpb25fa2V5LAorICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlKTsKKworICAvLworICAvLyBQYXJzZXMgYSB7QGxpbmsgU2VjdXJlTWVzc2FnZX0gY29udGFpbmluZyBhIGNsZWFydGV4dCBwYXlsb2FkIGJvZHksIGFuZAorICAvLyB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlLgorICAvLworICAvLyBAcGFyYW0gYXNzb2NhaXRlZF9kYXRhIG9wdGlvbmFsIGFzc29jaWF0ZWQgZGF0YSBib3VuZCB0byB0aGUgc2lnbmF0dXJlIChidXQKKyAgLy8gbm90IGluIHRoZSBtZXNzYWdlKS4gIFBhc3MgYW4gZW1wdHkgc3RyaW5nIHdoZW4gbm90IHVzaW5nLgorICAvLyBAcmV0dXJuIGEgc3RkOjp1bmlxdWVfcHRyIHRvIHRoZSBwYXJzZWQge0BsaW5rIEhlYWRlckFuZEJvZHl9IHBhaXIgKHdoaWNoCisgIC8vIGlzIGZ1bGx5IHZlcmlmaWVkKSBvciBhIG51bGxwdHIgb24gZXJyb3IgQHNlZQorICAvLyBTZWN1cmVNZXNzYWdlQnVpbGRlciNCdWlsZFNpZ25lZENsZWFydGV4dE1lc3NhZ2UKKyAgLy8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxIZWFkZXJBbmRCb2R5PiBQYXJzZVNpZ25lZENsZWFydGV4dE1lc3NhZ2UoCisgICAgICBjb25zdCBTZWN1cmVNZXNzYWdlJiBzZWNtc2csIGNvbnN0IENyeXB0b09wczo6S2V5JiB2ZXJpZmljYXRpb25fa2V5LAorICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLCBjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSk7CisKKyAgLy8KKyAgLy8gUGFyc2VzIGEge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IGNvbnRhaW5pbmcgYW4gZW5jcnlwdGVkIHBheWxvYWQgYm9keSwKKyAgLy8gZXh0cmFjdGluZyBhIGRlY3J5cHRpb24gb2YgdGhlIHBheWxvYWQgYm9keSBhbmQgdmVyaWZ5aW5nIHRoZSBzaWduYXR1cmUuCisgIC8vCisgIC8vIEBwYXJhbSBhc3NvY2lhdGVkX2RhdGEgb3B0aW9uYWwgYXNzb2NpYXRlZCBkYXRhIGJvdW5kIHRvIHRoZSBzaWduYXR1cmUKKyAgLy8gKGJ1dCBub3QgaW4gdGhlIG1lc3NhZ2UpLiAgUGFzcyBhbiBlbXB0eSBzdHJpbmcgd2hlbiBub3QgdXNpbmcuCisgIC8vIEByZXR1cm4gYSBzdGQ6OnVuaXF1ZV9wdHIgdG8gdGhlIHRoZSBwYXJzZWQge0BsaW5rIEhlYWRlckFuZEJvZHl9IHBhaXIKKyAgLy8gKHdoaWNoIGlzIGZ1bGx5IHZlcmlmaWVkIGFuZCBkZWNyeXB0ZWQgb3IgYSBudWxscHRyIG9uIGVycm9yCisgIC8vIEBzZWUgU2VjdXJlTWVzc2FnZUJ1aWxkZXIjQnVpbGRTaWduQ3J5cHRlZE1lc3NhZ2UKKyAgLy8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxIZWFkZXJBbmRCb2R5PiBQYXJzZVNpZ25DcnlwdGVkTWVzc2FnZSgKKyAgICAgIGNvbnN0IFNlY3VyZU1lc3NhZ2UmIHNlY21zZywgY29uc3QgQ3J5cHRvT3BzOjpLZXkmIHZlcmlmaWNhdGlvbl9rZXksCisgICAgICBDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUsIGNvbnN0IENyeXB0b09wczo6U2VjcmV0S2V5JiBkZWNyeXB0aW9uX2tleSwKKyAgICAgIENyeXB0b09wczo6RW5jVHlwZSBlbmNfdHlwZSwgY29uc3Qgc3RyaW5nJiBhc3NvY2lhdGVkX2RhdGEpOworCisgcHJpdmF0ZToKKyAgU2VjdXJlTWVzc2FnZVBhcnNlcigpOyAgLy8gRG8gbm90IGluc3RhbnRpYXRlCisKKyAgflNlY3VyZU1lc3NhZ2VQYXJzZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCisjZW5kaWYgIC8vIFNFQ1VSRU1FU1NBR0VfU0VDVVJFX01FU1NBR0VfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3dyYXBwZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9pbmNsdWRlL3NlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZGYyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3dyYXBwZXIuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRUNVUkVNRVNTQUdFX1NFQ1VSRV9NRVNTQUdFX1dSQVBQRVJfSF8KKyNkZWZpbmUgU0VDVVJFTUVTU0FHRV9TRUNVUkVfTUVTU0FHRV9XUkFQUEVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL2NvbW1vbi5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvY3J5cHRvX29wcy5oIgorCituYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZSB7CisKKy8vIFV0aWxpdHkgY2xhc3MgdG8gYWxsb3cgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2VjdXJlbWVzc2FnZQorLy8gcHJvdG9idWYgdG8gYmUgdXNlZCAoZm9yIGV4YW1wbGUsIGFuIG9iamVjdGl2ZS1jIGltcGxlbWVudGF0aW9uKS4KKy8vCisvLyBAc2VlIFNlY3VyZU1lc3NhZ2UKK2NsYXNzIFNlY3VyZU1lc3NhZ2VXcmFwcGVyIHsKKyBwdWJsaWM6CisgIC8vIFRha2VzIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgSGVhZGVyQW5kQm9keX0gYW5kIHJldHVybnMKKyAgLy8gdGhlIGl2IGZpZWxkIGZyb20gdGhlIHtAbGluayBIZWFkZXJ9LiBJZiB0aGlzIGRvZXMgbm90IGV4aXN0LCB0aGlzCisgIC8vIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGxwdHIuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBQYXJzZUhlYWRlckl2KAorICAgICAgY29uc3Qgc3RyaW5nJiBoZWFkZXJfYW5kX2JvZHlfYnl0ZXMpOworCisgIC8vIFRha2VzIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgSGVhZGVyQW5kQm9keX0gYW5kIHJldHVybnMgdGhlCisgIC8vIGJ5dGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBIZWFkZXJ9LiBJZiB0aGlzIGRvZXMgbm90IGV4aXN0LCB0aGlzCisgIC8vIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGxwdHIuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBQYXJzZUhlYWRlcigKKyAgICAgIGNvbnN0IHN0cmluZyYgaGVhZGVyX2FuZF9ib2R5X2J5dGVzKTsKKworICAvLyBUYWtlcyB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIEhlYWRlckFuZEJvZHlJbnRlcm5hbH0gYW5kCisgIC8vIHJldHVybnMgdGhlIGJ5dGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBIZWFkZXJ9LiBJZiB0aGlzIGRvZXMgbm90CisgIC8vIGV4aXN0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGxwdHIuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBQYXJzZUludGVybmFsSGVhZGVyKAorICAgICAgY29uc3Qgc3RyaW5nJiBoZWFkZXJfYW5kX2JvZHlfYnl0ZXMpOworCisgIC8vIFRha2VzIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgSGVhZGVyQW5kQm9keX0gYW5kIHJldHVybnMKKyAgLy8gdGhlIHtAbGluayBCb2R5fS4gSWYgdGhpcyBkb2VzIG5vdCBleGlzdCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybgorICAvLyBudWxscHRyLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4gUGFyc2VCb2R5KGNvbnN0IHN0cmluZyYgaGVhZGVyX2FuZF9ib2R5X2J5dGVzKTsKKworICAvLyBUYWtlcyB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIEhlYWRlcn0gYW5kIHtAbGluayBCb2R5fSBhbmQKKyAgLy8gcmV0dXJucyB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgSGVhZGVyQW5kQm9keX0uCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPiBCdWlsZEhlYWRlckFuZEJvZHkoCisgICAgICBjb25zdCBzdHJpbmcmIGhlYWRlcl9ieXRlcywgY29uc3Qgc3RyaW5nJiBib2R5X2J5dGVzKTsKKworICAvLyBUYWtlcyB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaGVhZGVyIGFuZCByZXR1cm5zIHRoZSBpbnQgdmFsdWUKKyAgLy8gZm9yIHRoZSBTaWdTY2hlbWUgZW51bQorICBzdGF0aWMgaW50IEdldFNpZ25hdHVyZVNjaGVtZShjb25zdCBzdHJpbmcmIGhlYWRlcl9ieXRlcyk7CisKKyAgLy8gVGFrZXMgdGhlIGJ5dGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGhlYWRlciBhbmQgcmV0dXJucyB0aGUgaW50IHZhbHVlCisgIC8vIGZvciB0aGUgRW5jU2NoZW1lIGVudW0KKyAgc3RhdGljIGludCBHZXRFbmNyeXB0aW9uU2NoZW1lKGNvbnN0IHN0cmluZyYgaGVhZGVyX2J5dGVzKTsKKworICAvLyBUYWtlcyB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaGVhZGVyIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIGFzc29jaWF0ZWQgZGF0YSBzdG9yZWQgaW4gdGhlIGhlYWRlcgorICBzdGF0aWMgdWludDMyX3QgR2V0QXNzb2NpYXRlZERhdGFMZW5ndGgoY29uc3Qgc3RyaW5nJiBoZWFkZXJfYnl0ZXMpOworCisgIC8vIFRlc3RzIGlmIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBoZWFkZXIgaGFzIGEgZGVjcnlwdGlvbiBrZXkgaWQKKyAgc3RhdGljIGJvb2wgSGFzRGVjcnlwdGlvbktleUlkKGNvbnN0IHN0cmluZyYgaGVhZGVyX2J5dGVzKTsKKworICAvLyBUZXN0cyBpZiB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaGVhZGVyIGhhcyBhIHZlcmlmaWNhdGlvbiBrZXkgaWQKKyAgc3RhdGljIGJvb2wgSGFzVmVyaWZpY2F0aW9uS2V5SWQoY29uc3Qgc3RyaW5nJiBoZWFkZXJfYnl0ZXMpOworCisgIC8vCisgIC8vIFJldHVybnMgdGhlIGNvbnN0YW50IGV4cG9zZWQgZW51bXMgdGhhdCBhcmUgZm91bmQgaW4gdGhlCisgIC8vIHtAbGluayBTZWN1cmVNZXNzYWdlfSBwcm90b2J1Zi4KKyAgLy8KKyAgLy8gQSByZXR1cm4gdmFsdWUgb2YgMCB3b3VsZCBiZSBjb25zaWRlcmVkIGFuIGVycm9yLgorICAvLworICAvLyBAc2VlIFNpZ1NjaGVtZQorICBzdGF0aWMgaW50IEdldFNpZ1NjaGVtZShDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUpOworCisgIC8vCisgIC8vIFJldHVybnMgdGhlIGNvbnN0YW50IGV4cG9zZWQgZW51bXMgdGhhdCBhcmUgZm91bmQgaW4gdGhlCisgIC8vIHtAbGluayBTZWN1cmVNZXNzYWdlfSBwcm90b2J1Zi4KKyAgLy8KKyAgLy8gQSByZXR1cm4gdmFsdWUgb2YgMCB3b3VsZCBiZSBjb25zaWRlcmVkIGFuIGVycm9yLgorICAvLworICAvLyBAc2VlIEVuY1NjaGVtZQorICBzdGF0aWMgaW50IEdldEVuY1NjaGVtZShDcnlwdG9PcHM6OkVuY1R5cGUgZW5jX3R5cGUpOworCisgcHJpdmF0ZToKKyAgU2VjdXJlTWVzc2FnZVdyYXBwZXIoKTsgIC8vIERvIG5vdCBpbnN0YW50aWF0ZQorICB+U2VjdXJlTWVzc2FnZVdyYXBwZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCisjZW5kaWYgIC8vIFNFQ1VSRU1FU1NBR0VfU0VDVVJFX01FU1NBR0VfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL2luY2x1ZGUvc2VjdXJlbWVzc2FnZS91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvaW5jbHVkZS9zZWN1cmVtZXNzYWdlL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA1NTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL2luY2x1ZGUvc2VjdXJlbWVzc2FnZS91dGlsLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRUNVUkVNRVNTQUdFX1VUSUxfSF8KKyNkZWZpbmUgU0VDVVJFTUVTU0FHRV9VVElMX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9jb21tb24uaCIKKworbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UgeworCitjbGFzcyBVdGlsIHsKKyBwdWJsaWM6CisgIC8vCisgIC8vIE1ha2VzIGEgbmV3IHN0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IGJ5IHRha2luZyBpbnB1dCBkYXRhIGFuZCBhIGxlbmd0aAorICAvLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4gTWFrZVVuaXF1ZVB0clN0cmluZyhjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKworICAvLworICAvLyBQcm92aWRpbmcgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiB3aGVuIGxvZ2dpbmcgZXJyb3IgbWVzc2FnZS4gIFRoZSBpZGVhCisgIC8vIGJlaW5nIHRoYXQgdGhpcyBjYW4gYmUgc3dhcHBlZCBvdXQgaW4gcGxhdGZvcm1zIHRoYXQgbG9nIGVycm9yIG1lc3NhZ2VzIGluCisgIC8vIHNvbWUgbW9yZSB1c2VmdWwgd2F5LgorICAvLworICBzdGF0aWMgdm9pZCBMb2dFcnJvcihjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UpOworCisgIC8vCisgIC8vIFByb3ZpZGVzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIG1hbmFnaW5nIHJlYWxseSBiYWQgZXJyb3JzLiAgQSBjYWxsIG9mCisgIC8vIHRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoYXQgYW4gdW5yZWNvdmVyYWJsZSBlcnJvciBoYXBwZW5lZCAtLSBwZXJoYXBzCisgIC8vIGJlY2F1c2Ugb2YgYW4gYXR0YWNrIG9yIGEgYnVnIGluIGFuIHVuZGVybHlpbmcgY3J5cHRvIHByb3ZpZGVyLiAgVGhlCisgIC8vIGludm9jYXRpb24gb2YgdGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgdGhhdCBhbnkgc3Vic2VxdWVudCBiZWhhdmlvciB3aWxsIGJlCisgIC8vIHVuZGVmaW5lZC4gIFRoaXMgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gaXMgbWVhbnQgdG8gbGV0IHVzZXJzIG9mIHRoaXMgbGlicmFyeQorICAvLyBmaWd1cmUgb3V0IGhvdyB0aGV5IHdhbnQgdG8gZGVhbCB3aXRoIHN1Y2ggYmFkIGVycm9ycy4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgcmV0dXJuLgorICAvLworICBzdGF0aWMgdm9pZCBMb2dFcnJvckFuZEFib3J0W1tub3JldHVybl1dKGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZSk7CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIH5VdGlsKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZQorCisjZW5kaWYgIC8vIFNFQ1VSRU1FU1NBR0VfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NlY3VyZW1lc3NhZ2UucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc2VjdXJlbWVzc2FnZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmEyOTYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NlY3VyZW1lc3NhZ2UucHJvdG8KQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFByb3RvIGRlZmluaXRpb25zIGZvciBTZWN1cmVNZXNzYWdlIGZvcm1hdAorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBzZWN1cmVtZXNzYWdlOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZSI7CitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlNlY3VyZU1lc3NhZ2VQcm90byI7CisKK21lc3NhZ2UgU2VjdXJlTWVzc2FnZSB7CisgIC8vIE11c3QgY29udGFpbiBhIEhlYWRlckFuZEJvZHkgbWVzc2FnZQorICByZXF1aXJlZCBieXRlcyBoZWFkZXJfYW5kX2JvZHkgPSAxOworICAvLyBTaWduYXR1cmUgb2YgaGVhZGVyX2FuZF9ib2R5CisgIHJlcXVpcmVkIGJ5dGVzIHNpZ25hdHVyZSA9IDI7Cit9CisKKy8vIFN1cHBvcnRlZCAic2lnbmF0dXJlIiBzY2hlbWVzIChib3RoIHN5bW1ldHJpYyBrZXkgYW5kIHB1YmxpYyBrZXkgYmFzZWQpCitlbnVtIFNpZ1NjaGVtZSB7CisgIEhNQUNfU0hBMjU2ID0gMTsKKyAgRUNEU0FfUDI1Nl9TSEEyNTYgPSAyOworICAvLyBOb3QgcmVjb21tZW5kZWQgLS0gdXNlIEVDRFNBX1AyNTZfU0hBMjU2IGluc3RlYWQKKyAgUlNBMjA0OF9TSEEyNTYgPSAzOworfQorCisvLyBTdXBwb3J0ZWQgZW5jcnlwdGlvbiBzY2hlbWVzCitlbnVtIEVuY1NjaGVtZSB7CisgIC8vIE5vIGVuY3J5cHRpb24KKyAgTk9ORSA9IDE7CisgIEFFU18yNTZfQ0JDID0gMjsKK30KKworbWVzc2FnZSBIZWFkZXIgeworICByZXF1aXJlZCBTaWdTY2hlbWUgc2lnbmF0dXJlX3NjaGVtZSA9IDE7CisgIHJlcXVpcmVkIEVuY1NjaGVtZSBlbmNyeXB0aW9uX3NjaGVtZSA9IDI7CisgIC8vIElkZW50aWZpZXMgdGhlIHZlcmlmaWNhdGlvbiBrZXkKKyAgb3B0aW9uYWwgYnl0ZXMgdmVyaWZpY2F0aW9uX2tleV9pZCA9IDM7CisgIC8vIElkZW50aWZpZXMgdGhlIGRlY3J5cHRpb24ga2V5CisgIG9wdGlvbmFsIGJ5dGVzIGRlY3J5cHRpb25fa2V5X2lkID0gNDsKKyAgLy8gRW5jcnlwdGlvbiBtYXkgdXNlIGFuIElWCisgIG9wdGlvbmFsIGJ5dGVzIGl2ID0gNTsKKyAgLy8gQXJiaXRyYXJ5IHBlci1wcm90b2NvbCBwdWJsaWMgZGF0YSwgdG8gYmUgc2VudCB3aXRoIHRoZSBwbGFpbi10ZXh0IGhlYWRlcgorICBvcHRpb25hbCBieXRlcyBwdWJsaWNfbWV0YWRhdGEgPSA2OworICAvLyBUaGUgbGVuZ3RoIG9mIHNvbWUgYXNzb2NpYXRlZCBkYXRhIHRoaXMgaXMgbm90IHNlbnQgaW4gdGhpcyBTZWN1cmVNZXNzYWdlLAorICAvLyBidXQgd2hpY2ggd2lsbCBiZSBib3VuZCB0byB0aGUgc2lnbmF0dXJlLgorICBvcHRpb25hbCB1aW50MzIgYXNzb2NpYXRlZF9kYXRhX2xlbmd0aCA9IDcgWyBkZWZhdWx0ID0gMCBdOworfQorCittZXNzYWdlIEhlYWRlckFuZEJvZHkgeworICAvLyBQdWJsaWMgZGF0YSBhYm91dCB0aGlzIG1lc3NhZ2UgKHRvIGJlIGJvdW5kIGluIHRoZSBzaWduYXR1cmUpCisgIHJlcXVpcmVkIEhlYWRlciBoZWFkZXIgPSAxOworICAvLyBQYXlsb2FkIGRhdGEKKyAgcmVxdWlyZWQgYnl0ZXMgYm9keSA9IDI7Cit9CisKKy8vIE11c3QgYmUga2VwdCB3aXJlLWZvcm1hdCBjb21wYXRpYmxlIHdpdGggSGVhZGVyQW5kQm9keS4gUHJvdmlkZXMgdGhlCisvLyBTZWN1cmVNZXNzYWdlIGNvZGUgd2l0aCBhIGNvbnNpc3RlbnQgd2lyZS1mb3JtYXQgcmVwcmVzZW50YXRpb24gdGhhdAorLy8gcmVtYWlucyBzdGFibGUgaXJyZXNwZWN0aXZlIG9mIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIGNob2ljZXMuIFRoaXMKKy8vIGxvdy1sZXZlbCByZXByZXNlbnRhdGlvbiBvZiBhIEhlYWRlckFuZEJvZHkgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5CisvLyBhbnkgY29kZSBvdXRzaWRlIG9mIHRoZSBTZWN1cmVNZXNzYWdlIGxpYnJhcnkgaW1wbGVtZW50YXRpb24vdGVzdHMuCittZXNzYWdlIEhlYWRlckFuZEJvZHlJbnRlcm5hbCB7CisgIC8vIEEgcmF3ICh3aXJlLWZvcm1hdCkgYnl0ZSBlbmNvZGluZyBvZiBhIEhlYWRlciwgc3VpdGFibGUgZm9yIGhhc2hpbmcKKyAgcmVxdWlyZWQgYnl0ZXMgaGVhZGVyID0gMTsKKyAgLy8gUGF5bG9hZCBkYXRhCisgIHJlcXVpcmVkIGJ5dGVzIGJvZHkgPSAyOworfQorCisvLyAtLS0tLS0tCisvLyBUaGUgcmVtYWluZGVyIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGhlcmUgYXJlIHByb3ZpZGVkIG9ubHkgZm9yCisvLyBjb252ZW5pZW5jZS4gVGhleSBhcmUgbm90IG5lZWRlZCBmb3IgU2VjdXJlTWVzc2FnZSBwcm9wZXIsIGJ1dCBhcmUKKy8vIGNvbW1vbmx5IHVzZWZ1bCB3aGVyZXZlciBTZWN1cmVNZXNzYWdlIG1pZ2h0IGJlIGFwcGxpZWQuCisvLyAtLS0tLS0tCisKKy8vIEEgbGlzdCBvZiBzdXBwb3J0ZWQgcHVibGljIGtleSB0eXBlcworZW51bSBQdWJsaWNLZXlUeXBlIHsKKyAgRUNfUDI1NiA9IDE7CisgIFJTQTIwNDggPSAyOworICAvLyAyMDQ4LWJpdCBNT0RQIGdyb3VwIDE0LCBmcm9tIFJGQyAzNTI2CisgIERIMjA0OF9NT0RQID0gMzsKK30KKworLy8gQSBjb252ZW5pZW5jZSBwcm90byBmb3IgZW5jb2RpbmcgTklTVCBQLTI1NiBlbGxpcHRpYyBjdXJ2ZSBwdWJsaWMga2V5cworbWVzc2FnZSBFY1AyNTZQdWJsaWNLZXkgeworICAvLyB4IGFuZCB5IGFyZSBlbmNvZGVkIGluIGJpZy1lbmRpYW4gdHdvJ3MgY29tcGxlbWVudCAoc2xpZ2h0bHkgd2FzdGVmdWwpCisgIC8vIENsaWVudCBNVVNUIHZlcmlmeSAoeCx5KSBpcyBhIHZhbGlkIHBvaW50IG9uIE5JU1QgUDI1NgorICByZXF1aXJlZCBieXRlcyB4ID0gMTsKKyAgcmVxdWlyZWQgYnl0ZXMgeSA9IDI7Cit9CisKKy8vIEEgY29udmVuaWVuY2UgcHJvdG8gZm9yIGVuY29kaW5nIFJTQSBwdWJsaWMga2V5cyB3aXRoIHNtYWxsIGV4cG9uZW50cworbWVzc2FnZSBTaW1wbGVSc2FQdWJsaWNLZXkgeworICAvLyBFbmNvZGVkIGluIGJpZy1lbmRpYW4gdHdvJ3MgY29tcGxlbWVudAorICByZXF1aXJlZCBieXRlcyBuID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgZSA9IDIgW2RlZmF1bHQgPSA2NTUzN107Cit9CisKKy8vIEEgY29udmVuaWVuY2UgcHJvdG8gZm9yIGVuY29kaW5nIERpZmZpZS1IZWxsbWFuIHB1YmxpYyBrZXlzLAorLy8gZm9yIHVzZSBvbmx5IHdoZW4gRWxsaXB0aWMgQ3VydmUgYmFzZWQga2V5IGV4Y2hhbmdlcyBhcmUgbm90IHBvc3NpYmxlLgorLy8gKE5vdGUgdGhhdCB0aGUgZ3JvdXAgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBzZXBhcmF0ZWx5KQorbWVzc2FnZSBEaFB1YmxpY0tleSB7CisgIC8vIEJpZy1lbmRpYW4gdHdvJ3MgY29tcGxlbWVudCBlbmNvZGVkIGdyb3VwIGVsZW1lbnQKKyAgcmVxdWlyZWQgYnl0ZXMgeSA9IDE7Cit9CisKK21lc3NhZ2UgR2VuZXJpY1B1YmxpY0tleSB7CisgIHJlcXVpcmVkIFB1YmxpY0tleVR5cGUgdHlwZSA9IDE7CisgIG9wdGlvbmFsIEVjUDI1NlB1YmxpY0tleSBlY19wMjU2X3B1YmxpY19rZXkgPSAyOworICBvcHRpb25hbCBTaW1wbGVSc2FQdWJsaWNLZXkgcnNhMjA0OF9wdWJsaWNfa2V5ID0gMzsKKyAgLy8gVXNlIG9ubHkgYXMgYSBsYXN0IHJlc29ydAorICBvcHRpb25hbCBEaFB1YmxpY0tleSBkaDIwNDhfcHVibGljX2tleSA9IDQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL2J5dGVfYnVmZmVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL2J5dGVfYnVmZmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjM2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2UvYnl0ZV9idWZmZXIuY2MKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL2J5dGVfYnVmZmVyLmgiCisKKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZSB7CisKK0J5dGVCdWZmZXI6OkJ5dGVCdWZmZXIoKSB7CisgIC8vIERvIG5vdGhpbmcKK30KKworQnl0ZUJ1ZmZlcjo6fkJ5dGVCdWZmZXIoKSB7IFdpcGUoKTsgfQorCitCeXRlQnVmZmVyOjpCeXRlQnVmZmVyKGNvbnN0IHNpemVfdCBzaXplKSB7CisgIC8vIEZpbGxzIHRoZSBkYXRhIGJ1ZmZlciB3aXRoIHNpemUgbnVtYmVyIG9mIHplcm9zCisgIGRhdGFfLnJlc2l6ZShzaXplLCAwKTsKK30KKwordm9pZCBCeXRlQnVmZmVyOjpTZXREYXRhKGNvbnN0IHVpbnQ4X3QqIHNvdXJjZV9kYXRhLCBjb25zdCBzaXplX3QgbGVuZ3RoKSB7CisgIC8vIHJlc2VydmUoKSBtaWdodCBjYXVzZSByZS1hbGxvY2F0aW9uLCBzbyB3ZSB3aXBlIGZpcnN0LgorICBXaXBlKCk7CisgIGRhdGFfLmNsZWFyKCk7CisKKyAgZGF0YV8ucmVzaXplKGxlbmd0aCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICBkYXRhX1tpXSA9IHNvdXJjZV9kYXRhW2ldOworICB9Cit9CisKK3ZvaWQgQnl0ZUJ1ZmZlcjo6QXBwZW5kKGNvbnN0IHNpemVfdCBudW1fYnl0ZXMsIGNvbnN0IHVpbnQ4X3QgYnl0ZSkgeworICAvLyBoYXJtbGVzcyBvbiBzaXplX3Qgb3ZlcmZsb3csIGJ1dCBtaWdodCBjYXVzZSByZWFsbG9jYXRpb24gd2hpY2ggbWlnaHQgbGVhaworICAvLyBkYXRhIG9uIHRoZSBoZWFwCisgIGRhdGFfLnJlc2VydmUoZGF0YV8uc2l6ZSgpICsgbnVtX2J5dGVzKTsKKyAgZGF0YV8uaW5zZXJ0KGRhdGFfLmVuZCgpLCBudW1fYnl0ZXMsIGJ5dGUpOworfQorCit2b2lkIEJ5dGVCdWZmZXI6OlByZXBlbmQoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgLy8gbWlnaHQgY2F1c2UgcmVhbGxvY2F0aW9uIHdoaWNoIG1pZ2h0IGxlYWsgZGF0YSBvbiB0aGUgaGVhcAorICBkYXRhXy5pbnNlcnQoZGF0YV8uYmVnaW4oKSwgc3RyLmJlZ2luKCksIHN0ci5lbmQoKSk7Cit9CisKK0J5dGVCdWZmZXIgQnl0ZUJ1ZmZlcjo6Q29uY2F0KGNvbnN0IEJ5dGVCdWZmZXImIGEsIGNvbnN0IEJ5dGVCdWZmZXImIGIpIHsKKyAgLy8gV2UgYXNzdW1lIGNvbXBpbGVyIGltcGxlbWVudHMgTlJWTyBoZXJlLiAgV2UgYXZvaWQgaW5pdGlhbGl6aW5nCisgIC8vIHJldHVybl92YWx1ZSB2aWEgYS5Db3B5KCkgYmVjYXVzZSByZXNlcnZlKCkgbWF5IHJlc3VsdCBpbiBhbm90aGVyCisgIC8vIGRhdGEgY29weSwgd2hpY2ggd2UgYXJlIHRyeWluZyB0byBlbGltaW5hdGUgaW4gdGhlIGZpcnN0IHBsYWNlLgorICBCeXRlQnVmZmVyIHJldHVybl92YWx1ZTsKKworICByZXR1cm5fdmFsdWUuZGF0YV8ucmVzZXJ2ZShhLnNpemUoKSArIGIuc2l6ZSgpKTsgIC8vIGhhcm1sZXNzIG9uIG92ZXJmbG93CisgIHJldHVybl92YWx1ZS5kYXRhXy5pbnNlcnQocmV0dXJuX3ZhbHVlLmRhdGFfLmVuZCgpLCBhLmRhdGFfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5kYXRhXy5lbmQoKSk7CisgIHJldHVybl92YWx1ZS5kYXRhXy5pbnNlcnQocmV0dXJuX3ZhbHVlLmRhdGFfLmVuZCgpLCBiLmRhdGFfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5kYXRhXy5lbmQoKSk7CisgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKy8vIEdDQyBiZWZvcmUgNC43IGRvZXNuJ3Qgc3VwcG9ydCBkZWxlZ2F0ZWQgY29uc3RydWN0b3JzLCBzbyB3ZSBjYW4ndCBiZSBhcworLy8gZWxlZ2FudCBhcyB3ZSBjb3VsZCBvdGhlcndpc2UuCitCeXRlQnVmZmVyOjpCeXRlQnVmZmVyKGNvbnN0IHVpbnQ4X3QqIHNvdXJjZV9kYXRhLCBjb25zdCBzaXplX3QgbGVuZ3RoKSB7CisgIFNldERhdGEoc291cmNlX2RhdGEsIGxlbmd0aCk7Cit9CisKK0J5dGVCdWZmZXI6OkJ5dGVCdWZmZXIoY29uc3QgY2hhciogc291cmNlX2RhdGEpIHsKKyAgU2V0RGF0YShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzb3VyY2VfZGF0YSksIHN0cmxlbihzb3VyY2VfZGF0YSkpOworfQorCitCeXRlQnVmZmVyOjpCeXRlQnVmZmVyKGNvbnN0IGNoYXIqIHNvdXJjZV9kYXRhLCBjb25zdCBzaXplX3QgbGVuZ3RoKSB7CisgIFNldERhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc291cmNlX2RhdGEpLCBsZW5ndGgpOworfQorCitCeXRlQnVmZmVyOjpCeXRlQnVmZmVyKGNvbnN0IHN0cmluZyYgc291cmNlX2RhdGEpIHsKKyAgU2V0RGF0YShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzb3VyY2VfZGF0YS5jX3N0cigpKSwKKyAgICAgICAgICBzb3VyY2VfZGF0YS5sZW5ndGgoKSk7Cit9CisKK3NpemVfdCBCeXRlQnVmZmVyOjpzaXplKCkgY29uc3QgeyByZXR1cm4gZGF0YV8uc2l6ZSgpOyB9CisKK3N0ZDo6dW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBCeXRlQnVmZmVyOjpTdWJBcnJheShjb25zdCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBsZW5ndGgpIGNvbnN0IHsKKyAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxCeXRlQnVmZmVyPihuZXcgQnl0ZUJ1ZmZlcigpKTsKKyAgfQorCisgIC8vIE92ZXJmbG93IGNoZWNrCisgIGlmIChsZW5ndGggPiBVSU5UX01BWCAtIG9mZnNldCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQm91bmRzIGNoZWNrCisgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBzaXplKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4oCisgICAgICBuZXcgQnl0ZUJ1ZmZlcihJbW11dGFibGVVQ2hhcigpICsgb2Zmc2V0LCBsZW5ndGgpKTsKK30KKwordW5zaWduZWQgY2hhciogQnl0ZUJ1ZmZlcjo6TXV0YWJsZVVDaGFyKCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oTXV0YWJsZVVJbnQ4KCkpOworfQorCit1bnNpZ25lZCBjb25zdCBjaGFyKiBCeXRlQnVmZmVyOjpJbW11dGFibGVVQ2hhcigpIGNvbnN0IHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY29uc3QgY2hhcio+KGRhdGFfLmRhdGEoKSk7Cit9CisKK3VpbnQ4X3QqIEJ5dGVCdWZmZXI6Ok11dGFibGVVSW50OCgpIHsgcmV0dXJuIGRhdGFfLmRhdGEoKTsgfQorCitjb25zdCB1aW50OF90KiBCeXRlQnVmZmVyOjpJbW11dGFibGVVSW50OCgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGFfLmRhdGEoKSk7Cit9CisKK3N0cmluZyBCeXRlQnVmZmVyOjpTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YV8uZGF0YSgpKSwgZGF0YV8uc2l6ZSgpKTsKK30KKwordmVjdG9yPHVpbnQ4X3Q+IEJ5dGVCdWZmZXI6OlZlY3RvcigpIGNvbnN0IHsgcmV0dXJuIHZlY3Rvcjx1aW50OF90PihkYXRhXyk7IH0KKworYm9vbCBCeXRlQnVmZmVyOjpFcXVhbHMoY29uc3QgQnl0ZUJ1ZmZlciYgb3RoZXIpIGNvbnN0IHsKKyAgaWYgKG90aGVyLnNpemUoKSAhPSBzaXplKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdG8gYWx3YXlzIGl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgdG8gZGVmZWF0IHRpbWluZyBhdHRhY2tzCisgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgcmVzdWx0IHw9IGRhdGFfW2ldIF4gb3RoZXIuSW1tdXRhYmxlVUludDgoKVtpXTsKKyAgfQorCisgIHJldHVybiAocmVzdWx0ID09IDApOworfQorCitzdHJpbmcgQnl0ZUJ1ZmZlcjo6QXNEZWJ1Z0hleFN0cmluZygpIGNvbnN0IHsKKyAgaWYgKGRhdGFfLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuIHN0cmluZygpOworICB9CisKKyAgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygiMHgiKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGFfLnNpemUoKTsgaSsrKSB7CisgICAgcmVzdWx0LnB1c2hfYmFjayhoZXhbMHhmICYgKGRhdGFfW2ldID4+IDQpXSk7CisgICAgcmVzdWx0LnB1c2hfYmFjayhoZXhbMHhmICYgZGF0YV9baV1dKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQnl0ZUJ1ZmZlcjo6Q2xlYXIoKSB7CisgIFdpcGUoKTsKKyAgZGF0YV8uY2xlYXIoKTsKK30KKwordm9pZCBCeXRlQnVmZmVyOjpXaXBlKCkgeyBXaXBlQnVmZmVyKGRhdGFfLmRhdGEoKSwgZGF0YV8uc2l6ZSgpKTsgfQorCit2b2lkIEJ5dGVCdWZmZXI6OldpcGVCdWZmZXIodWludDhfdCogYnVmZmVyLCBjb25zdCBzaXplX3QgbGVuZ3RoKSB7CisgIHZvbGF0aWxlIHVpbnQ4X3QqIGJ5dGVfdG9fd2lwZSA9IGJ1ZmZlcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgIGJ5dGVfdG9fd2lwZVtpXSA9IDA7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL2NyeXB0b19vcHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0NGY3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzLmNjCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLworLy8gVGhpcyBmaWxlIGlzIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ3J5cHRvT3BzIGNsYXNzLiAgVGhlIHJlbWFpbmluZworLy8gZnVuY3Rpb25zIGFyZSBzcGVjaWZpZWQgaW4gYSBjcnlwdG8tbGlicmFyeSBzcGVjaWZpYyBjb250aW51YXRpb24gKGUuZy4sIHRoZQorLy8gT3BlblNTTCB2ZXJzaW9ucyBhcmUgaW4gY3J5dG9fb3BzX29wZW5zc2wuY2MKKy8vCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvY3J5cHRvX29wcy5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvdXRpbC5oIgorCit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKKy8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgMidzIGNvbXBsZW1lbnQgZW5jb2Rpbmcgb2YgYSBOSVNUIFAtMjU2IGVsbGlwdGljCisvLyBjdXJ2ZSBwb2ludC4KK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFAyNTZFbmNvZGluZ0J5dGVzID0gMzM7CisKKy8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgMidzIGNvbXBsZW1lbnQgZW5jb2Rpbmcgb2YgYSAyMDQ4IGJpdCBSU0EKKy8vIGtleSBtb2R1bHVzLgorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UnNhMjA0OE1vZHVsdXNFbmNvZGluZ0J5dGVzID0gMjU3OworCisvLyBUaGUgZXhwZWN0ZWQgYnl0ZSBzaXplIG9mIGEgMjA0OCBiaXQgUlNBIGtleSBtb2R1bHVzLiBUaGUgbW9kdWx1cyBiaXQgc2l6ZQorLy8gaXMgOCAqIHxrUnNhMjA0OE1vZHVsdXNCeXRlU2l6ZXwuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtSc2EyMDQ4TW9kdWx1c0J5dGVTaXplID0gMjU2OworCisvLyBUT0RPKGFjemVza2lzKTogZ2V0IHJpZCBvZiBhcyBtYW55IHVzZXMgb2Ygc3RyaW5nIGFzIHBvc3NpYmxlIGFuZCBtb3ZlIHRvCisvLyB1c2luZyBCeXRlQnVmZmVyIGJlY2F1c2Ugb2Ygc2VjdXJlIHdpcGUuIElmIGVhc2llciBhbmQgbGVzcyByZWZhY3RvcmluZywKKy8vIG1ha2UgYSBjdXN0b20gc3RyaW5nIHRoYXQgd2lwZXMgbWVtb3J5IG9uIGRlYWxsb2NhdGlvbgorbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UgeworCisvLyBXZSBoYXZlIHRvIGluaXRpYWxpemUgc2FsdCB0aGlzIHdheSBiZWNhdXNlIEMrKyBkb2Vzbid0IGFsbG93IGluaXRpYWxpemF0aW9uCisvLyBhbmQgZGVjbGFyYXRpb24gaW4gdGhlIHNhbWUgcGxhY2UuLi4gR28gZmlndXJlLgorLy8gVGhlIHZhbHVlIGJlbG93IGlzIFNIQTI1NigiU2VjdXJlTWVzc2FnZSIpLiAgVGhpcyBpcyB0ZXN0ZWQgaW4gdGhlIFRlc3RTYWx0CisvLyB0ZXN0IGluIGNyeXB0b19vcHNfdGVzdAorY29uc3QgdWludDhfdCBDcnlwdG9PcHM6OmtTYWx0W2tTYWx0U2l6ZV0gPSB7CisgICAgMHhiZiwgMHg5ZCwgMHgyYSwgMHg1MywgMHhjNiwgMHgzNiwgMHgxNiwgMHhkNywgMHg1ZCwgMHhiMCwgMHhhNywKKyAgICAweDE2LCAweDViLCAweDkxLCAweGMxLCAweGVmLCAweDczLCAweGU1LCAweDM3LCAweGYyLCAweDQyLCAweDc0LAorICAgIDB4MDUsIDB4ZmEsIDB4MjMsIDB4NjEsIDB4MGEsIDB4NGIsIDB4ZTYsIDB4NTcsIDB4NjQsIDB4MmV9OworCit1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IENyeXB0b09wczo6SGtkZlNoYTI1NkV4dHJhY3QoCisgICAgY29uc3QgQnl0ZUJ1ZmZlciYgaW5wdXRLZXlNYXRlcmlhbCwKKyAgICBjb25zdCBCeXRlQnVmZmVyJiBzYWx0KSB7CisgIC8vIENvbXB1dGVzIGFuIEhNQUMgb2YgdGhlIGlucHV0S2V5TWF0ZXJpYWwga2V5ZWQgd2l0aCB0aGUgc2FsdAorICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHJlc3VsdCA9IFNoYTI1NmhtYWMoc2FsdCwgaW5wdXRLZXlNYXRlcmlhbCk7CisKKyAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkhNQUMgcmV0dXJuZWQgbnVsbCIpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBDcnlwdG9PcHM6OkhrZGZTaGEyNTZFeHBhbmQoCisgICAgY29uc3QgQnl0ZUJ1ZmZlciYgcHNldWRvUmFuZG9tS2V5LAorICAgIGNvbnN0IEJ5dGVCdWZmZXImIGluZm8pIHsKKyAgaWYgKHBzZXVkb1JhbmRvbUtleS5zaXplKCkgPT0gMCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJsZW5ndGggb2YgUHNldWRvUmFuZG9tS2V5IGlzIHplcm8iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENvbXB1dGVzIGFuIEhNQUMgb2YgaW5mbyB8fCAweDAxICh3aGVyZSB8fCBpcyBjb25jYXRlbmF0aW9uKQorICBCeXRlQnVmZmVyIGV4dGVuZGVkSW5mbyA9IGluZm87CisgIGV4dGVuZGVkSW5mby5BcHBlbmQoc3RhdGljX2Nhc3Q8c2l6ZV90PigxKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oMHgwMSkpOworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHJlc3VsdCA9IFNoYTI1NmhtYWMocHNldWRvUmFuZG9tS2V5LCBleHRlbmRlZEluZm8pOworCisgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJITUFDIHJldHVybmVkIG51bGwiKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VuaXF1ZV9wdHI8c3RyaW5nPiBDcnlwdG9PcHM6OkhrZGYoY29uc3Qgc3RyaW5nJiBpbnB1dEtleU1hdGVyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHNhbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaW5mbykgeworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGV4dHJhY3RlZF9yZXN1bHQgPQorICAgICAgSGtkZlNoYTI1NkV4dHJhY3QoQnl0ZUJ1ZmZlcihpbnB1dEtleU1hdGVyaWFsKSwgQnl0ZUJ1ZmZlcihzYWx0KSk7CisgIGlmIChleHRyYWN0ZWRfcmVzdWx0ID09IG51bGxwdHIgfHwgZXh0cmFjdGVkX3Jlc3VsdC0+c2l6ZSgpID09IDApIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiSEtERl9FeHRyYWN0IHJldHVybmVkIGFuIGludmFsaWQgcmVzdWx0Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGV4cGFuZGVkX3Jlc3VsdCA9CisgICAgICBIa2RmU2hhMjU2RXhwYW5kKCpleHRyYWN0ZWRfcmVzdWx0LCBCeXRlQnVmZmVyKGluZm8pKTsKKworICBpZiAoZXhwYW5kZWRfcmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiSGtkZlNoYTI1NkV4cGFuZCByZXR1cm4gYW4gaW52YWxpZCByZXN1bHQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiB1bmlxdWVfcHRyPHN0cmluZz4obmV3IHN0cmluZyhleHBhbmRlZF9yZXN1bHQtPlN0cmluZygpKSk7Cit9CisKK3VuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpTZWNyZXRLZXk+IENyeXB0b09wczo6RGVyaXZlQWVzMjU2S2V5Rm9yKAorICAgIGNvbnN0IENyeXB0b09wczo6U2VjcmV0S2V5JiBtYXN0ZXJLZXksIGNvbnN0IHN0cmluZyYgcHVycG9zZSkgeworICBzdHJpbmcga2V5X3N0cmluZyhtYXN0ZXJLZXkuZGF0YSgpLlN0cmluZygpKTsKKyAgc3RyaW5nIHNhbHRfc3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGtTYWx0KSwga1NhbHRTaXplKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGtleV9kYXRhID0gSGtkZihrZXlfc3RyaW5nLCBzYWx0X3N0cmluZywgcHVycG9zZSk7CisKKyAgaWYgKGtleV9kYXRhID09IG51bGxwdHIgfHwga2V5X2RhdGEtPnNpemUoKSAhPSBrQWVzS2V5U2l6ZSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJIS0RGIHJldHVybmVkIGludmFsaWQga2V5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPENyeXB0b09wczo6U2VjcmV0S2V5PiBkZXJpdmVkX2tleSA9CisgICAgICB1bmlxdWVfcHRyPENyeXB0b09wczo6U2VjcmV0S2V5PigKKyAgICAgICAgICBuZXcgQ3J5cHRvT3BzOjpTZWNyZXRLZXkoKmtleV9kYXRhLCBDcnlwdG9PcHM6OkFFU18yNTZfS0VZKSk7CisgIHJldHVybiBkZXJpdmVkX2tleTsKK30KKwordW5pcXVlX3B0cjxzdHJpbmc+IENyeXB0b09wczo6RGlnZXN0KGNvbnN0IHN0cmluZyYgZGF0YSkgeworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGZ1bGxfZGlnZXN0ID0gU2hhMjU2KEJ5dGVCdWZmZXIoZGF0YSkpOworCisgIGlmIChmdWxsX2RpZ2VzdCA9PSBudWxscHRyIHx8IGZ1bGxfZGlnZXN0LT5zaXplKCkgIT0ga1NoYTI1NkRpZ2VzdFNpemUpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiB1bmlxdWVfcHRyPHN0cmluZz4oCisgICAgICBuZXcgc3RyaW5nKGZ1bGxfZGlnZXN0LT5TdWJBcnJheSgwLCBrRGlnZXN0TGVuZ3RoKS0+U3RyaW5nKCkpKTsKK30KKwordW5pcXVlX3B0cjxzdHJpbmc+IENyeXB0b09wczo6RGVjcnlwdChjb25zdCBDcnlwdG9PcHM6OlNlY3JldEtleSYgZGVjcnlwdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpFbmNUeXBlIGVuY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2lwaGVydGV4dCkgeworICBpZiAoY2lwaGVydGV4dC5lbXB0eSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkNhbm5vdCBkZWNyeXB0IGVtcHR5IGNpcGhlcnRleHQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoZGVjcnlwdGlvbktleS5kYXRhKCkuc2l6ZSgpID09IDApIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiQ2Fubm90IGRlY3J5cHQgdXNpbmcgZW1wdHkgZGVjcnlwdGlvbiBrZXkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoaXYuZW1wdHkoKSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDYW5ub3QgZGVjcnlwdCB3aXRoIGVtcHR5IGl2Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHBsYWludGV4dCA9IG51bGxwdHI7CisKKyAgc3dpdGNoIChlbmNUeXBlKSB7CisgICAgY2FzZSBOT05FOiB7CisgICAgICBwbGFpbnRleHQgPSBudWxscHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQUVTXzI1Nl9DQkM6IHsKKyAgICAgIHVuaXF1ZV9wdHI8U2VjcmV0S2V5PiBkZXJpdmVkX2tleSA9CisgICAgICAgICAgQ3J5cHRvT3BzOjpEZXJpdmVBZXMyNTZLZXlGb3IoZGVjcnlwdGlvbktleSwgR2V0UHVycG9zZShlbmNUeXBlKSk7CisgICAgICBwbGFpbnRleHQgPSBBZXMyNTZDQkNEZWNyeXB0KCpkZXJpdmVkX2tleSwgQnl0ZUJ1ZmZlcihpdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIoY2lwaGVydGV4dCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYW5kIG1pZ2h0IGluZGljYXRlIGFuIGF0dGFjaworICAgICAgVXRpbDo6TG9nRXJyb3IoIkludmFsaWQgZW5jcnlwdGlvbiB0eXBlIik7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGlmIChwbGFpbnRleHQgPT0gbnVsbHB0cikgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDb3VsZCBub3QgZGVjcnlwdCBjaXBoZXJ0ZXh0Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gdW5pcXVlX3B0cjxzdHJpbmc+KG5ldyBzdHJpbmcocGxhaW50ZXh0LT5TdHJpbmcoKSkpOworfQorCit1bmlxdWVfcHRyPHN0cmluZz4gQ3J5cHRvT3BzOjpFbmNyeXB0KGNvbnN0IENyeXB0b09wczo6U2VjcmV0S2V5JiBlbmNyeXB0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVuY1R5cGUgZW5jVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwbGFpbnRleHQpIHsKKyAgaWYgKGVuY3J5cHRpb25LZXkuZGF0YSgpLnNpemUoKSA9PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkNhbm5vdCBlbmNyeXB0IHVzaW5nIGVtcHR5IGVuY3J5cHRpb24ga2V5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGNpcGhlcnRleHQgPSBudWxscHRyOworCisgIHN3aXRjaCAoZW5jVHlwZSkgeworICAgIGNhc2UgTk9ORTogeworICAgICAgY2lwaGVydGV4dCA9IG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBRVNfMjU2X0NCQzogeworICAgICAgdW5pcXVlX3B0cjxTZWNyZXRLZXk+IGRlcml2ZWRfa2V5ID0KKyAgICAgICAgICBDcnlwdG9PcHM6OkRlcml2ZUFlczI1NktleUZvcihlbmNyeXB0aW9uS2V5LCBHZXRQdXJwb3NlKGVuY1R5cGUpKTsKKyAgICAgIGNpcGhlcnRleHQgPQorICAgICAgICAgIEFlczI1NkNCQ0VuY3J5cHQoKmRlcml2ZWRfa2V5LCBCeXRlQnVmZmVyKGl2KSwgQnl0ZUJ1ZmZlcihwbGFpbnRleHQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFuZCBtaWdodCBpbmRpY2F0ZSBhbiBhdHRhY2sKKyAgICAgIFV0aWw6OkxvZ0Vycm9yKCJJbnZhbGlkIGVuY3J5cHRpb24gdHlwZSIpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAoY2lwaGVydGV4dCA9PSBudWxscHRyKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkNvdWxkIG5vdCBlbmNyeXB0IHBsYWludGV4dCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHVuaXF1ZV9wdHI8c3RyaW5nPihuZXcgc3RyaW5nKGNpcGhlcnRleHQtPlN0cmluZygpKSk7Cit9CisKK3VuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpTZWNyZXRLZXk+IENyeXB0b09wczo6S2V5QWdyZWVtZW50U2hhMjU2KAorICAgIGNvbnN0IFByaXZhdGVLZXkmIHByaXZhdGVfa2V5LAorICAgIGNvbnN0IFB1YmxpY0tleSYgcGVlcl9rZXkpIHsKKyAgaWYgKHByaXZhdGVfa2V5LmFsZ29yaXRobSgpICE9IHBlZXJfa2V5LmFsZ29yaXRobSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkFsZ29yaXRobXMgZm9yIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXkgbXVzdCBtYXRjaCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChwcml2YXRlX2tleS5hbGdvcml0aG0oKSAhPSBFQ0RTQV9LRVkpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiT25seSBFQ0RTQSBhbGdvcml0aG1zIGFyZSBzdXBwb3J0ZWQgZm9yIEtleSBhZ3JlZW1lbnRzIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHNlY3JldCA9IEVjZGhLZXlBZ3JlZW1lbnQocHJpdmF0ZV9rZXksIHBlZXJfa2V5KTsKKyAgaWYgKHNlY3JldCA9PSBudWxscHRyKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkVycm9yIGNvbXB1dGluZyBrZXkgYWdyZWVtZW50Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHNlY3JldF9kaWdlc3QgPSBTaGEyNTYoKnNlY3JldCk7CisgIGlmIChzZWNyZXRfZGlnZXN0ID09IG51bGxwdHIpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiRXJyb3IgY29tcHV0aW5nIFNoYTI1NiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHVuaXF1ZV9wdHI8U2VjcmV0S2V5PihuZXcgU2VjcmV0S2V5KCpzZWNyZXRfZGlnZXN0LCBBRVNfMjU2X0tFWSkpOworfQorCitzdHJpbmcgQ3J5cHRvT3BzOjpHZXRQdXJwb3NlKEVuY1R5cGUgZW5jVHlwZSkgeworICByZXR1cm4gIkVOQzoiICsKKyAgICAgIHN0ZDo6dG9fc3RyaW5nKFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpHZXRFbmNTY2hlbWUoZW5jVHlwZSkpOworfQorCitzdHJpbmcgQ3J5cHRvT3BzOjpHZXRQdXJwb3NlKFNpZ1R5cGUgc2lnVHlwZSkgeworICByZXR1cm4gIlNJRzoiICsKKyAgICAgIHN0ZDo6dG9fc3RyaW5nKFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpHZXRTaWdTY2hlbWUoc2lnVHlwZSkpOworfQorCitib29sIENyeXB0b09wczo6SXNQdWJsaWNLZXlTY2hlbWUoU2lnVHlwZSBzaWdUeXBlKSB7CisgIHN3aXRjaCAoc2lnVHlwZSkgeworICAgIGNhc2UgSE1BQ19TSEEyNTY6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBFQ0RTQV9QMjU2X1NIQTI1NjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgUlNBMjA0OF9TSEEyNTY6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIFNJR19UWVBFX0VORDoKKyAgICAgIC8vIEV4aXN0cyBvbmx5IGZvciB0ZXN0aW5nLCBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgYmUgY2FsbGVkLgorICAgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgid3Jvbmcgc2lndHlwZSIpOworICB9CisKKyAgLy8gQ29udHJvbCBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSwgdGhpcyBpcyBoZXJlIHRvIG1ha2UgdGhlIGNvbXBpbGVyIGhhcHB5CisgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIndyb25nIHNpZ3R5cGUiKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit1bmlxdWVfcHRyPHN0cmluZz4gQ3J5cHRvT3BzOjpTaWduKFNpZ1R5cGUgc2lnVHlwZSwgY29uc3QgS2V5JiBzaWduaW5nS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRhdGEpIHsKKyAgaWYgKHNpZ25pbmdLZXkuZGF0YSgpLnNpemUoKSA9PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIlNpZ25pbmcgS2V5IGNhbm5vdCBiZSBlbXB0eSEiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoZGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkNhbm5vdCBzaWduIGVtcHR5IGRhdGEiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gc2lnbmF0dXJlID0gbnVsbHB0cjsKKyAgc3dpdGNoIChzaWdUeXBlKSB7CisgICAgY2FzZSBITUFDX1NIQTI1NjogeworICAgICAgaWYgKHNpZ25pbmdLZXkudHlwZSgpICE9IFNFQ1JFVCkgeworICAgICAgICBVdGlsOjpMb2dFcnJvcigiSW52YWxpZCBzaWduaW5nIGtleSB0eXBlIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgdW5pcXVlX3B0cjxTZWNyZXRLZXk+IGRlcml2ZWRfa2V5ID0gRGVyaXZlQWVzMjU2S2V5Rm9yKAorICAgICAgICAgIFNlY3JldEtleShzaWduaW5nS2V5LmRhdGEoKSwgc2lnbmluZ0tleS5hbGdvcml0aG0oKSksCisgICAgICAgICAgR2V0UHVycG9zZShzaWdUeXBlKSk7CisgICAgICBpZiAoZGVyaXZlZF9rZXkgPT0gbnVsbHB0cikgeworICAgICAgICBVdGlsOjpMb2dFcnJvcigiSW52YWxpZCBkZXJpdmVkIGtleSIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIHNpZ25hdHVyZSA9IFNoYTI1NmhtYWMoZGVyaXZlZF9rZXktPmRhdGEoKSwgQnl0ZUJ1ZmZlcihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFQ0RTQV9QMjU2X1NIQTI1NjogeworICAgICAgaWYgKHNpZ25pbmdLZXkudHlwZSgpICE9IFBSSVZBVEUpIHsKKyAgICAgICAgVXRpbDo6TG9nRXJyb3IoIkV4cGVjdGVkIGEgcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBzaWduYXR1cmUgPSBFY2RzYVAyNTZTaGEyNTZTaWduKAorICAgICAgICAgIFByaXZhdGVLZXkoc2lnbmluZ0tleS5kYXRhKCksIHNpZ25pbmdLZXkuYWxnb3JpdGhtKCkpLAorICAgICAgICAgIEJ5dGVCdWZmZXIoZGF0YSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUlNBMjA0OF9TSEEyNTY6IHsKKyAgICAgIGlmIChzaWduaW5nS2V5LnR5cGUoKSAhPSBQUklWQVRFKSB7CisgICAgICAgIFV0aWw6OkxvZ0Vycm9yKCJFeHBlY3RlZCBhIHByaXZhdGUga2V5Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgc2lnbmF0dXJlID0gUnNhMjA0OFNoYTI1NlNpZ24oCisgICAgICAgICAgUHJpdmF0ZUtleShzaWduaW5nS2V5LmRhdGEoKSwgc2lnbmluZ0tleS5hbGdvcml0aG0oKSksCisgICAgICAgICAgQnl0ZUJ1ZmZlcihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBTSUdfVFlQRV9FTkQ6CisgICAgICAvLyBDYXNlIG9ubHkgZXhpc3RzIGZvciB0ZXN0aW5nIGFuZCBpcyBuZXZlciBleHBlY3RlZCB0byBhY3R1YWxseSBiZQorICAgICAgLy8gY2FsbGVkLgorICAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJ3cm9uZyBzaWd0eXBlIik7CisgIH0KKworICBpZiAoc2lnbmF0dXJlID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdW5pcXVlX3B0cjxzdHJpbmc+KG5ldyBzdHJpbmcoc2lnbmF0dXJlLT5TdHJpbmcoKSkpOworICB9Cit9CisKK2Jvb2wgQ3J5cHRvT3BzOjpWZXJpZnkoU2lnVHlwZSBzaWdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXkmIHZlcmlmaWNhdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGF0YSkgeworICAvLyBEbyBzb21lIGJhc2ljIGNoZWNrcworICBpZiAodmVyaWZpY2F0aW9uS2V5LmRhdGEoKS5zaXplKCkgPT0gMCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJWZXJpZmljYXRpb24gS2V5IGNhbm5vdCBiZSBlbXB0eSEiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHNpZ25hdHVyZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIlNpZ25hdHVyZSBjYW5ub3QgYmUgZW1wdHkiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGRhdGEubGVuZ3RoKCkgPT0gMCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDYW5ub3QgdmVyaWZ5IHNpZ25hdHVyZSBvdmVyIGVtcHR5IGRhdGEiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBEZWNpZGUgd2hhdCB0byBkbyBiYXNlZCBvbiB0aGUgc2lnbmF0dXJlIHR5cGUKKyAgc3dpdGNoIChzaWdUeXBlKSB7CisgICAgY2FzZSBITUFDX1NIQTI1NjogeworICAgICAgaWYgKHZlcmlmaWNhdGlvbktleS50eXBlKCkgIT0gU0VDUkVUKSB7CisgICAgICAgIFV0aWw6OkxvZ0Vycm9yKCJJbnZhbGlkIHNpZ25pbmcga2V5IHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICAvLyBDb21wdXRlIGV4cGVjdGVkIHNpZ25hdHVyZQorICAgICAgdW5pcXVlX3B0cjxTZWNyZXRLZXk+IGRlcml2ZWRfa2V5ID0gRGVyaXZlQWVzMjU2S2V5Rm9yKAorICAgICAgICAgIFNlY3JldEtleSh2ZXJpZmljYXRpb25LZXkuZGF0YSgpLCB2ZXJpZmljYXRpb25LZXkuYWxnb3JpdGhtKCkpLAorICAgICAgICAgIEdldFB1cnBvc2Uoc2lnVHlwZSkpOworICAgICAgaWYgKGRlcml2ZWRfa2V5ID09IG51bGxwdHIpIHsKKyAgICAgICAgVXRpbDo6TG9nRXJyb3IoIkludmFsaWQgZGVyaXZlZCBrZXkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBleHBlY3RlZF9zaWduYXR1cmUgPQorICAgICAgICAgIFNoYTI1NmhtYWMoQnl0ZUJ1ZmZlcihkZXJpdmVkX2tleS0+ZGF0YSgpKSwgQnl0ZUJ1ZmZlcihkYXRhKSk7CisgICAgICBpZiAoZXhwZWN0ZWRfc2lnbmF0dXJlID09IG51bGxwdHIpIHsKKyAgICAgICAgVXRpbDo6TG9nRXJyb3IoIkludmFsaWQgZXhwZWN0ZWQgc2lnbmF0dXJlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gQ29uc3RhbnQgdGltZSBhcnJheSBjb21wYXJpc29uCisgICAgICByZXR1cm4gZXhwZWN0ZWRfc2lnbmF0dXJlLT5FcXVhbHMoQnl0ZUJ1ZmZlcihzaWduYXR1cmUpKTsKKyAgICB9CisKKyAgICBjYXNlIEVDRFNBX1AyNTZfU0hBMjU2OiB7CisgICAgICBpZiAodmVyaWZpY2F0aW9uS2V5LnR5cGUoKSAhPSBQVUJMSUMpIHsKKyAgICAgICAgVXRpbDo6TG9nRXJyb3IoIkV4cGVjdGVkIGEgcHVibGljIGtleSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAodmVyaWZpY2F0aW9uS2V5LmFsZ29yaXRobSgpICE9IEtleUFsZ29yaXRobTo6RUNEU0FfS0VZKSB7CisgICAgICAgIFV0aWw6OkxvZ0Vycm9yKCJXcm9uZyBrZXkgdHlwZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiBFY2RzYVAyNTZTaGEyNTZWZXJpZnkoCisgICAgICAgICAgUHVibGljS2V5KHZlcmlmaWNhdGlvbktleS5kYXRhKCksIHZlcmlmaWNhdGlvbktleS5hbGdvcml0aG0oKSksCisgICAgICAgICAgQnl0ZUJ1ZmZlcihzaWduYXR1cmUpLCBCeXRlQnVmZmVyKGRhdGEpKTsKKyAgICB9CisKKyAgICBjYXNlIFJTQTIwNDhfU0hBMjU2OiB7CisgICAgICBpZiAodmVyaWZpY2F0aW9uS2V5LnR5cGUoKSAhPSBQVUJMSUMpIHsKKyAgICAgICAgVXRpbDo6TG9nRXJyb3IoIkV4cGVjdGVkIGEgcHVibGljIGtleSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAodmVyaWZpY2F0aW9uS2V5LmFsZ29yaXRobSgpICE9IEtleUFsZ29yaXRobTo6UlNBX0tFWSkgeworICAgICAgICBVdGlsOjpMb2dFcnJvcigiV3Jvbmcga2V5IHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gUnNhMjA0OFNoYTI1NlZlcmlmeSgKKyAgICAgICAgICBQdWJsaWNLZXkodmVyaWZpY2F0aW9uS2V5LmRhdGEoKSwgdmVyaWZpY2F0aW9uS2V5LmFsZ29yaXRobSgpKSwKKyAgICAgICAgICBCeXRlQnVmZmVyKHNpZ25hdHVyZSksIEJ5dGVCdWZmZXIoZGF0YSkpOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBDcnlwdG9PcHM6OlRhZ2dlZFBsYWludGV4dFJlcXVpcmVkKGNvbnN0IEtleSYgc2lnbmluZ19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnVHlwZSBzaWdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXkmIGVuY3J5cHRpb25fa2V5KSB7CisgIC8vIFdlIG5lZWQgYSB0YWcgaWYgZGlmZmVyZW50IGtleXMgYXJlIGJlaW5nIHVzZWQgdG8gInNpZ24iIHZzLiBlbmNyeXB0CisgIHJldHVybiBJc1B1YmxpY0tleVNjaGVtZShzaWdfdHlwZSkgfHwKKyAgICAgICFzaWduaW5nX2tleS5kYXRhKCkuRXF1YWxzKGVuY3J5cHRpb25fa2V5LmRhdGEoKSk7Cit9CisKK2Jvb2wgQ3J5cHRvT3BzOjpJc1ZhbGlkRWNQMjU2Q29vcmRpbmF0ZUVuY29kaW5nKGNvbnN0IHN0cmluZyYgYnl0ZXMpIHsKKyAgLy8gVGhlIGJ5dGVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCBNYXggUDI1NiBlbmNvZGluZyBieXRlcywgaW5jbHVzaXZlLiBJZgorICAvLyB0aGUgYnl0ZXMgYXJlIGZ1bGwsIHRoZW4gdGhlIGZpcnN0IGJ5dGUgbXVzdCBub3QgYmUgMC4KKyAgcmV0dXJuICEoCisgICAgICAoYnl0ZXMuc2l6ZSgpID09IDApIHx8CisgICAgICAoYnl0ZXMuc2l6ZSgpID4ga01heFAyNTZFbmNvZGluZ0J5dGVzKSB8fAorICAgICAgKGJ5dGVzLnNpemUoKSA9PSBrTWF4UDI1NkVuY29kaW5nQnl0ZXMgJiYgYnl0ZXMuZGF0YSgpWzBdICE9IDApKTsKK30KKworYm9vbCBDcnlwdG9PcHM6OklzVmFsaWRSc2EyMDQ4TW9kdWx1c0VuY29kaW5nKGNvbnN0IHN0cmluZyYgYnl0ZXMpIHsKKyAgaWYgKGJ5dGVzLnNpemUoKSA+IGtNYXhSc2EyMDQ4TW9kdWx1c0VuY29kaW5nQnl0ZXMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChieXRlcy5zaXplKCkgPCBrUnNhMjA0OE1vZHVsdXNCeXRlU2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG5vbi16ZXJvIGJ5dGUgaW4gfGJ5dGVzfCBzaG91bGQgYmUuCisgIGNvbnN0IHNpemVfdCBsZWFkaW5nX2J5dGVfaW5kZXggPSBieXRlcy5zaXplKCkgLSBrUnNhMjA0OE1vZHVsdXNCeXRlU2l6ZTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZWFkaW5nX2J5dGVfaW5kZXg7ICsraSkgeworICAgIGlmIChieXRlc1tpXSAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IG5vbi16ZXJvIGJ5dGUgaGFzIGxlYWRpbmcgMS4KKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJ5dGVzW2xlYWRpbmdfYnl0ZV9pbmRleF0pICYgMHg4MDsKK30KKworc3RyaW5nIENyeXB0b09wczo6SW50MzJCeXRlc1RvU3RyaW5nKGludDMyX3QgdmFsdWUpIHsKKyAgc3RyaW5nIHJlc3VsdChzaXplb2YodmFsdWUpLCAnXDAnKTsKKyAgZm9yIChzaXplX3QgaSA9IHNpemVvZih2YWx1ZSk7IGkgPiAwICYmIHZhbHVlICE9IDA7IC0taSkgeworICAgIHJlc3VsdFtpIC0gMV0gPSBzdGF0aWNfY2FzdDxjaGFyPih2YWx1ZSAmIDB4RkYpOworICAgIHZhbHVlID4+PSA4OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgQ3J5cHRvT3BzOjpTdHJpbmdUb0ludDMyQnl0ZXMoY29uc3Qgc3RyaW5nJiB2YWx1ZSwgaW50MzJfdCogcmVzdWx0KSB7CisgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IHNpemVvZigqcmVzdWx0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKnJlc3VsdCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7ICsraSkgeworICAgICpyZXN1bHQgPDw9IDg7CisgICAgKnJlc3VsdCB8PSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YWx1ZVtpXSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK0NyeXB0b09wczo6fkNyeXB0b09wcygpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2UvY3J5cHRvX29wc19vcGVuc3NsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL2NyeXB0b19vcHNfb3BlbnNzbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGIzYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL2NyeXB0b19vcHNfb3BlbnNzbC5jYwpAQCAtMCwwICsxLDExMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmpfbWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvYnl0ZV9idWZmZXIuaCIKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL2NyeXB0b19vcHMuaCIKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL3V0aWwuaCIKKwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOworCitjbGFzcyBFdnBLZXlQdHIgOiBwdWJsaWMgc3RkOjp1bmlxdWVfcHRyPEVWUF9QS0VZLCB2b2lkICgqKShFVlBfUEtFWSAqKT4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXZwS2V5UHRyKEVWUF9QS0VZICpwa3ApCisgICAgICA6IHN0ZDo6dW5pcXVlX3B0cjxFVlBfUEtFWSwgdm9pZCAoKikoRVZQX1BLRVkgKik+KHBrcCwgRVZQX1BLRVlfZnJlZSkge30KK307CisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKKworc3RhdGljIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gUHVibGljS2V5VG9CeXRlcyhFQ19LRVkgKmVja2V5KSB7CisgIGludCBwdWJfa2V5X2xlbiA9IGkyZF9FQ19QVUJLRVkoZWNrZXksIE5VTEwpOworICBpZiAocHViX2tleV9sZW4gPD0gMCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJVbmV4cGVjdGVkIHB1YiBrZXkgbGVuZ3RoIGZvciBnZW5lcmF0ZWQga2V5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bnNpZ25lZCBjaGFyICpwdWJfa2V5X2J1ZmZlciA9IE5VTEw7CisgIGludCByZXR1cm5fY29kZSA9IGkyZF9FQ19QVUJLRVkoZWNrZXksICZwdWJfa2V5X2J1ZmZlcik7CisgIGlmIChyZXR1cm5fY29kZSAhPSBwdWJfa2V5X2xlbikgeworICAgIGlmIChwdWJfa2V5X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICBmcmVlKHB1Yl9rZXlfYnVmZmVyKTsKKyAgICB9CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiaTJkX0VDX1BVQktFWSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHZhbHVlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBhdXRvIHB1YmxpY19rZXlfYnl0ZXMgPSB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+KG5ldyBCeXRlQnVmZmVyKAorICAgICAgcHViX2tleV9idWZmZXIsIHB1Yl9rZXlfbGVuKSk7CisgIGZyZWUocHViX2tleV9idWZmZXIpOworICByZXR1cm4gcHVibGljX2tleV9ieXRlczsKK30KKworLy8gQ3JlYXRlIGFuIEVWUF9QS0VZIHN0cnVjdHVyZSB1c2luZyBleHBvcnRlZCBkYXRhIGZvciBhIHByaXZhdGUga2V5Lgorc3RhdGljIEV2cEtleVB0ciBDcmVhdGVFdnBQcml2YXRlS2V5KGNvbnN0IENyeXB0b09wczo6UHJpdmF0ZUtleSYga2V5KSB7CisgIC8vIEV4dHJhY3Qga2V5IGZyb20gc3RvcmFnZS4KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RvcmVkX3ByaXZfa2V5ID0ga2V5LmRhdGEoKS5JbW11dGFibGVVQ2hhcigpOworICBQS0NTOF9QUklWX0tFWV9JTkZPICpleHRyYWN0ZWRfcGtjczggPQorICAgICAgZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8oTlVMTCwgJnN0b3JlZF9wcml2X2tleSwga2V5LmRhdGEoKS5zaXplKCkpOworICBpZiAoZXh0cmFjdGVkX3BrY3M4ID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiY291bGQgbm90IGV4dHJhY3QgcGtjczgga2V5Iik7CisgICAgcmV0dXJuIEV2cEtleVB0cihOVUxMKTsKKyAgfQorCisgIC8vIFB1dCBpdCBpbnRvIGFuIEVWUCBzdHJ1Y3R1cmUuCisgIEV2cEtleVB0ciBleHRyYWN0ZWRfZXZwa2V5KEVWUF9QS0NTODJQS0VZKGV4dHJhY3RlZF9wa2NzOCkpOworICAvLyBDYXJlZnVsIHRvIGZyZWUgdGhpcyBiZWZvcmUgd2UgcmV0dXJuIG51bGwgYW55d2hlcmUuCisgIFBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShleHRyYWN0ZWRfcGtjczgpOworCisgIGlmIChleHRyYWN0ZWRfZXZwa2V5LmdldCgpID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiY291bGQgbm90IHN0dWZmIGV4dHJhY3RlZCBrZXkgaW50byBldnAgc3RydWN0dXJlIik7CisgICAgcmV0dXJuIEV2cEtleVB0cihOVUxMKTsKKyAgfQorCisgIHJldHVybiBleHRyYWN0ZWRfZXZwa2V5OworfQorCisvLyBDcmVhdGUgYW4gRVZQX1BLRVkgc3RydWN0dXJlIHVzaW5nIGV4cG9ydGVkIGRhdGEgZm9yIGEgcHVibGljIGtleS4KK3N0YXRpYyBFdnBLZXlQdHIgQ3JlYXRlRXZwUHVibGljS2V5KGNvbnN0IENyeXB0b09wczo6UHVibGljS2V5JiBrZXkpIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcHViX2tleV9wdHIgPSBrZXkuZGF0YSgpLkltbXV0YWJsZVVDaGFyKCk7CisgIEV2cEtleVB0ciBleHRyYWN0ZWRfcHVibGljX2V2cGtleSgKKyAgICAgIGQyaV9QVUJLRVkoTlVMTCwgJnB1Yl9rZXlfcHRyLCBrZXkuZGF0YSgpLnNpemUoKSkpOworCisgIGlmIChleHRyYWN0ZWRfcHVibGljX2V2cGtleSA9PSBudWxscHRyKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoImNvdWxkIG5vdCBpbXBvcnQgcHVibGljIGtleSIpOworICAgIHJldHVybiBFdnBLZXlQdHIoTlVMTCk7CisgIH0KKworICByZXR1cm4gZXh0cmFjdGVkX3B1YmxpY19ldnBrZXk7Cit9CisKK3VuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gQ3J5cHRvT3BzOjpTaGEyNTYoY29uc3QgQnl0ZUJ1ZmZlciYgbWVzc2FnZSkgeworICBpZiAobWVzc2FnZS5zaXplKCkgPT0gMCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJNZXNzYWdlIHRvbyBzaG9ydCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ3JlYXRlIGFuIGVtcHR5IGRpZ2VzdCB3aXRoIGVub3VnaCBzcGFjZS4gT3BlblNTTCB3aWxsIHRlbGwgdXMgaG93IG11Y2ggaXQKKyAgLy8gYWN0dWFsbHkgd3JvdGUuCisgIHVpbnQ4X3QgbWRfdmFsdWVbRVZQX01BWF9NRF9TSVpFXTsKKyAgdW5zaWduZWQgaW50IG1kX2xlbmd0aCA9IDA7CisgIGludCByZXR1cm5fY29kZTsKKworICAvLyBDcmVhdGUgYSBuZXcgbWVzc2FnZSBkaWdlc3QgY29udGV4dCBhbmQgaW5pdGlhbGl6ZSBpdAorICB1bmlxdWVfcHRyPEVWUF9NRF9DVFgsIHZvaWQgKCopKEVWUF9NRF9DVFggKik+IG1kY3R4KEVWUF9NRF9DVFhfY3JlYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX01EX0NUWF9kZXN0cm95KTsKKworICAvLyBJbml0aWFsaXplIHRoZSBkaWdlc3QgY29udGV4dAorICByZXR1cm5fY29kZSA9IEVWUF9EaWdlc3RJbml0X2V4KG1kY3R4LmdldCgpLCBFVlBfc2hhMjU2KCksIE5VTEwpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBpbml0aWFsaXplIFNIQTI1NiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gU2V0IHRoZSBtZXNzYWdlCisgIHJldHVybl9jb2RlID0gRVZQX0RpZ2VzdFVwZGF0ZShtZGN0eC5nZXQoKSwgbWVzc2FnZS5JbW11dGFibGVVSW50OCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaXplKCkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBzZXQgbWVzc2FnZSB0byBoYXNoIGluIFNIQTI1NiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gRXhlY3V0ZSB0aGUgZGlnZXN0CisgIHJldHVybl9jb2RlID0gRVZQX0RpZ2VzdEZpbmFsX2V4KG1kY3R4LmdldCgpLCBtZF92YWx1ZSwgJm1kX2xlbmd0aCk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiQ291bGQgbm90IHNldCBleGVjdXRlIFNIQTI1NiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4obmV3IEJ5dGVCdWZmZXIobWRfdmFsdWUsIG1kX2xlbmd0aCkpOworfQorCit1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IENyeXB0b09wczo6U2hhMjU2aG1hYyhjb25zdCBCeXRlQnVmZmVyJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlQnVmZmVyJiBtZXNzYWdlKSB7CisgIC8vIFNhbml0eSBjaGVjaworICBpZiAoa2V5LnNpemUoKSA9PSAwIHx8IG1lc3NhZ2Uuc2l6ZSgpID09IDApIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiSG1hYyBrZXkgb3IgbWVzc2FnZSB0b28gc2hvcnQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIE92ZXJmbG93IGNoZWNrIGJlY2F1c2Ugb2YgRVZQX1BLRVlfbmV3X21hY19rZXkgZnVuY3Rpb24gc2lnbmF0dXJlCisgIGlmIChrZXkuc2l6ZSgpID4gSU5UX01BWCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJLZXkgdG9vIGJpZyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ3JlYXRlIGFuIGVtcHR5IGRpZ2VzdCB3aXRoIGVub3VnaCBzcGFjZS4gT3BlblNTTCB3aWxsIHRlbGwgdXMgaG93IG11Y2ggaXQKKyAgLy8gYWN0dWFsbHkgd3JvdGUuCisgIHVpbnQ4X3QgbWRfdmFsdWVba1NoYTI1NkRpZ2VzdFNpemVdOworICBzaXplX3QgbWRfbGVuZ3RoID0gMDsKKworICBpbnQgcmV0dXJuX2NvZGU7ICAvLyBVc2VkIHRvIGNoZWNrIGFsbCBvZiBPcGVuU1NMJ3MgcmV0dXJuIGNvZGVzCisKKyAgLy8gQ3JlYXRlIHRoZSBITUFDIGtleSBzdHJ1Y3R1cmUKKyAgRXZwS2V5UHRyIGhtYWNLZXkoCisgICAgICBFVlBfUEtFWV9uZXdfbWFjX2tleShFVlBfUEtFWV9ITUFDLCBOVUxMLCBrZXkuSW1tdXRhYmxlVUludDgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oa2V5LnNpemUoKSkpKTsKKyAgaWYgKGhtYWNLZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBjcmVhdGUgSE1BQyBQS0VZIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBDcmVhdGUgYSBuZXcgbWVzc2FnZSBkaWdlc3QgY29udGV4dCBhbmQgaW5pdGlhbGl6ZSBpdAorICB1bmlxdWVfcHRyPEVWUF9NRF9DVFgsIHZvaWQgKCopKEVWUF9NRF9DVFggKik+IG1kY3R4KEVWUF9NRF9DVFhfY3JlYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX01EX0NUWF9kZXN0cm95KTsKKyAgcmV0dXJuX2NvZGUgPQorICAgICAgRVZQX0RpZ2VzdFNpZ25Jbml0KG1kY3R4LmdldCgpLCBOVUxMLCBFVlBfc2hhMjU2KCksIE5VTEwsIGhtYWNLZXkuZ2V0KCkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBpbml0aWFsaXplIEhNQUMiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIFNldCB0aGUgbWVzc2FnZSB0byBkaWdlc3QKKyAgcmV0dXJuX2NvZGUgPSBFVlBfRGlnZXN0U2lnblVwZGF0ZShtZGN0eC5nZXQoKSwgbWVzc2FnZS5JbW11dGFibGVVSW50OCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSgpKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJDb3VsZCBub3Qgc2V0IGRhdGEgdG8gSE1BQyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ29tcHV0ZSB0aGUgZGlnZXN0IGxlbmd0aCBhbmQgcG9wdWxhdGUgdGhlIG1kX2xlbmd0aCB2YWx1ZS4gIFRoaXMgbGV0cyB1cworICAvLyBzYW5pdHkgY2hlY2sgdGhlIGV4cGVjdGVkIGRpZ2VzdCBsZW5ndGguCisgIHJldHVybl9jb2RlID0gRVZQX0RpZ2VzdFNpZ25GaW5hbChtZGN0eC5nZXQoKSwgTlVMTCwgJm1kX2xlbmd0aCk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiQ291bGQgbm90IGRldGVybWluZSBITUFDIGxlbmd0aCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChtZF9sZW5ndGggIT0ga1NoYTI1NkRpZ2VzdFNpemUpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJITUFDIHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgcmVzdWx0Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBGaW5hbGx5LCBjb21wdXRlIHRoZSBkaWdlc3QuCisgIHJldHVybl9jb2RlID0gRVZQX0RpZ2VzdFNpZ25GaW5hbChtZGN0eC5nZXQoKSwgbWRfdmFsdWUsICZtZF9sZW5ndGgpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBleGVjdXRlIEhNQUMiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+KG5ldyBCeXRlQnVmZmVyKG1kX3ZhbHVlLCBrU2hhMjU2RGlnZXN0U2l6ZSkpOworfQorCit1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IENyeXB0b09wczo6QWVzMjU2Q0JDRGVjcnlwdCgKKyAgICBjb25zdCBDcnlwdG9PcHM6OlNlY3JldEtleSYgZGVjcnlwdGlvbktleSwKKyAgICBjb25zdCBCeXRlQnVmZmVyJiBpdiwKKyAgICBjb25zdCBCeXRlQnVmZmVyJiBjaXBoZXJ0ZXh0KSB7CisgIGlmIChkZWNyeXB0aW9uS2V5LnR5cGUoKSAhPSBTRUNSRVQpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiQUVTIERlY3J5cHQgb25seSB3b3JrcyB3aXRoIFNFQ1JFVCBrZXlzIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKGRlY3J5cHRpb25LZXkuYWxnb3JpdGhtKCkgIT0gQUVTXzI1Nl9LRVkpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiQUVTIERlY3J5cHQgb25seSB3b3JrcyB3aXRoIEFFUyAyNTYga2V5cyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChkZWNyeXB0aW9uS2V5LmRhdGEoKS5zaXplKCkgIT0ga0Flc0tleVNpemUpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiQUVTIDI1NiBrZXkgc2hvdWxkIGJlIDMyIGJ5dGVzIGxvbmciKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoaXYuc2l6ZSgpICE9IEFFU19CTE9DS19TSVpFKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkluY29ycmVjdCBJViBzaXplIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKGNpcGhlcnRleHQuc2l6ZSgpID4gSU5UX01BWCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDaXBoZXJ0ZXh0IHRvbyBsYXJnZSB0byBkZWNyeXB0Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBCeXRlQnVmZmVyIHBsYWludGV4dChjaXBoZXJ0ZXh0LnNpemUoKSk7ICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgcGxhaW50ZXh0CisgIGludCByZXR1cm5fY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5TU0wgZXJyb3IgY2hlY2tpbmcKKworICAvLyBJbml0aWFsaXplIHRoZSBjaXBoZXIgY29udGV4dAorICBFVlBfQ0lQSEVSX0NUWCBjdHg7CisgIEVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisgIHJldHVybl9jb2RlID0gRVZQX0RlY3J5cHRJbml0X2V4KCZjdHgsIEVWUF9hZXNfMjU2X2NiYygpLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0aW9uS2V5LmRhdGEoKS5JbW11dGFibGVVSW50OCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdi5JbW11dGFibGVVSW50OCgpKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBBRVMgZGVjcnlwdGlvbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gRGVjcnlwdCBkYXRhCisgIGludCBwbGFpbnRleHRfYnl0ZXNfd3JpdHRlbiA9IDA7CisgIHJldHVybl9jb2RlID0KKyAgICAgIEVWUF9EZWNyeXB0VXBkYXRlKCZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbnRleHQuTXV0YWJsZVVJbnQ4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAmcGxhaW50ZXh0X2J5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0LkltbXV0YWJsZVVJbnQ4KCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNpcGhlcnRleHQuc2l6ZSgpKSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkNvdWxkIG5vdCBkZWNyeXB0IGRhdGEgdXNpbmcgQUVTIik7CisgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIEhhbmRsZSB0aGUgbGFzdCBibG9jayBhbmQgcGFkZGluZworICBpbnQgbGFzdF9ibG9ja19ieXRlc193cml0dGVuID0gMDsKKyAgcmV0dXJuX2NvZGUgPSBFVlBfRGVjcnlwdEZpbmFsX2V4KAorICAgICAgJmN0eCwgcGxhaW50ZXh0Lk11dGFibGVVSW50OCgpICsgcGxhaW50ZXh0X2J5dGVzX3dyaXR0ZW4sCisgICAgICAmbGFzdF9ibG9ja19ieXRlc193cml0dGVuKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiQ291bGQgbm90IGRlY3J5cHQgZGF0YSB1c2luZyBBRVM7IGxpa2VseSBhIHBhZGRpbmcgZXJyb3IiKTsKKyAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgd2VyZSB3cml0dGVuCisgIGlmIChwbGFpbnRleHRfYnl0ZXNfd3JpdHRlbiA+IElOVF9NQVggLSBsYXN0X2Jsb2NrX2J5dGVzX3dyaXR0ZW4gfHwKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocGxhaW50ZXh0X2J5dGVzX3dyaXR0ZW4gKyBsYXN0X2Jsb2NrX2J5dGVzX3dyaXR0ZW4pID4KKyAgICAgICAgICBwbGFpbnRleHQuc2l6ZSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiVW5leHBlY3RlZCBhbW91bnQgb2YgYnl0ZXMgd3JpdHRlbiBieSBBRVMgRW5jcnlwdCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ2xlYW51cAorICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCisgIHJldHVybiB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+KAorICAgICAgbmV3IEJ5dGVCdWZmZXIocGxhaW50ZXh0LkltbXV0YWJsZVVJbnQ4KCksCisgICAgICAgICAgICAgICAgICAgICBwbGFpbnRleHRfYnl0ZXNfd3JpdHRlbiArIGxhc3RfYmxvY2tfYnl0ZXNfd3JpdHRlbikpOworfQorCit1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IENyeXB0b09wczo6QWVzMjU2Q0JDRW5jcnlwdCgKKyAgICBjb25zdCBDcnlwdG9PcHM6OlNlY3JldEtleSYgZW5jcnlwdGlvbktleSwKKyAgICBjb25zdCBCeXRlQnVmZmVyJiBpdiwKKyAgICBjb25zdCBCeXRlQnVmZmVyJiBwbGFpbnRleHQpIHsKKyAgaWYgKGVuY3J5cHRpb25LZXkudHlwZSgpICE9IFNFQ1JFVCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJBRVMgRW5jcnlwdCBvbmx5IHdvcmtzIHdpdGggU0VDUkVUIGtleXMiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoZW5jcnlwdGlvbktleS5hbGdvcml0aG0oKSAhPSBBRVNfMjU2X0tFWSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJBRVMgRW5jcnlwdCBvbmx5IHdvcmtzIHdpdGggQUVTIDI1NiBrZXlzIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKGVuY3J5cHRpb25LZXkuZGF0YSgpLnNpemUoKSAhPSBrQWVzS2V5U2l6ZSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJBRVMgMjU2IGtleSBzaG91bGQgYmUgMzIgYnl0ZXMgbG9uZyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChpdi5zaXplKCkgIT0gQUVTX0JMT0NLX1NJWkUpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiSW5jb3JyZWN0IElWIHNpemUiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENhbGN1bGF0ZSBQS0NTICM1IHBhZGRpbmcgc2l6ZQorICBzaXplX3QgcGFkZGluZ19zaXplID0gQUVTX0JMT0NLX1NJWkUgLSAocGxhaW50ZXh0LnNpemUoKSAlIEFFU19CTE9DS19TSVpFKTsKKworICAvLyBQYXJhbm9pZCBib3VuZHMgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN0YXRpY19jYXN0PGludD4gZm9yCisgIC8vIEVWUF9FbmNyeXB0VXBkYXRlIGRvZXNuJ3QgY2F1c2UgYW4gb3ZlcmZsb3cKKyAgaWYgKHBsYWludGV4dC5zaXplKCkgPiBJTlRfTUFYKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIlBsYWludGV4dCBpcyB0b28gbGFyZ2UiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgY2lwaGVydGV4dAorICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGNpcGhlcnRleHQoCisgICAgICBuZXcgQnl0ZUJ1ZmZlcihwbGFpbnRleHQuc2l6ZSgpICsgcGFkZGluZ19zaXplKSk7CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgY2lwaGVyIGNvbnRleHQKKyAgRVZQX0NJUEhFUl9DVFggY3R4OworICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworICBpbnQgcmV0dXJuX2NvZGUgPSBFVlBfRW5jcnlwdEluaXRfZXgoJmN0eCwgRVZQX2Flc18yNTZfY2JjKCksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LmRhdGEoKS5JbW11dGFibGVVSW50OCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYuSW1tdXRhYmxlVUludDgoKSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiQ291bGQgbm90IGluaXRpYWxpemUgZW5jcnlwdGlvbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gRW5jcnlwdCBkYXRhCisgIGludCBmdWxsX2Jsb2NrX2J5dGVzX3dyaXR0ZW4gPSAwOworICBpbnQgbGFzdF9ibG9ja19ieXRlc193cml0dGVuID0gMDsKKyAgcmV0dXJuX2NvZGUgPSBFVlBfRW5jcnlwdFVwZGF0ZSgKKyAgICAgICZjdHgsIGNpcGhlcnRleHQtPk11dGFibGVVSW50OCgpLCAmZnVsbF9ibG9ja19ieXRlc193cml0dGVuLAorICAgICAgcGxhaW50ZXh0LkltbXV0YWJsZVVJbnQ4KCksIHN0YXRpY19jYXN0PGludD4ocGxhaW50ZXh0LnNpemUoKSkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkVycm9yIGR1cmluZyBlbmNyeXB0aW9uIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm5fY29kZSA9IEVWUF9FbmNyeXB0RmluYWxfZXgoCisgICAgICAmY3R4LCBjaXBoZXJ0ZXh0LT5NdXRhYmxlVUludDgoKSArIGZ1bGxfYmxvY2tfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICZsYXN0X2Jsb2NrX2J5dGVzX3dyaXR0ZW4pOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkVycm9yIGR1cmluZyBlbmNyeXB0aW9uIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBDaGVjayB0aGF0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBieXRlcyB3ZXJlIHdyaXR0ZW4KKyAgaWYgKGZ1bGxfYmxvY2tfYnl0ZXNfd3JpdHRlbiA+IElOVF9NQVggLSBsYXN0X2Jsb2NrX2J5dGVzX3dyaXR0ZW4gfHwKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oZnVsbF9ibG9ja19ieXRlc193cml0dGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9ibG9ja19ieXRlc193cml0dGVuKSAhPSBjaXBoZXJ0ZXh0LT5zaXplKCkpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJVbmV4cGVjdGVkIGFtb3VudCBvZiBieXRlcyB3cml0dGVuIGJ5IEFFUyBFbmNyeXB0Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBDbGVhbnVwCisgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisKKyAgcmV0dXJuIGNpcGhlcnRleHQ7Cit9CisKK3VuaXF1ZV9wdHI8c3RyaW5nPiBDcnlwdG9PcHM6OkdlbmVyYXRlSXYoRW5jVHlwZSBlbmNUeXBlKSB7CisgIHVuaXF1ZV9wdHI8c3RyaW5nPiBpdiA9IG51bGxwdHI7CisKKyAgc3dpdGNoIChlbmNUeXBlKSB7CisgICAgY2FzZSBOT05FOgorICAgICAgaXYgPSBudWxscHRyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFFU18yNTZfQ0JDOgorICAgICAgdW5zaWduZWQgY2hhciBpdl9ieXRlc1tBRVNfQkxPQ0tfU0laRV07CisKKyAgICAgIGlmIChSQU5EX2J5dGVzKGl2X2J5dGVzLCBBRVNfQkxPQ0tfU0laRSkgIT0gMSkgeworICAgICAgICBVdGlsOjpMb2dFcnJvcigiT3BlblNTTCBjb3VsZCBub3QgZ2VuZXJhdGUgcmFuZG9tIGJ5dGVzIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgaXYgPSBVdGlsOjpNYWtlVW5pcXVlUHRyU3RyaW5nKGl2X2J5dGVzLCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJJbnZhbGlkIGVuY3J5cHRpb24gdHlwZSIpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gaXY7Cit9CisKK3VuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gQ3J5cHRvT3BzOjpFY2RzYVAyNTZTaGEyNTZTaWduKAorICAgIGNvbnN0IFByaXZhdGVLZXkgJnByaXZhdGVfa2V5LCBjb25zdCBCeXRlQnVmZmVyICZkYXRhKSB7CisgIGlmIChwcml2YXRlX2tleS5hbGdvcml0aG0oKSAhPSBLZXlBbGdvcml0aG06OkVDRFNBX0tFWSB8fAorICAgICAgcHJpdmF0ZV9rZXkuZGF0YSgpLnNpemUoKSA9PSAwIHx8IGRhdGEuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyBFVlBfU2lnblVwZGF0ZQorICBpZiAoZGF0YS5zaXplKCkgPiBVSU5UX01BWCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJEYXRhIHRvbyBiaWcgdG8gc2lnbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgRXZwS2V5UHRyIGV4dHJhY3RlZF9ldnBrZXkgPSBDcmVhdGVFdnBQcml2YXRlS2V5KHByaXZhdGVfa2V5KTsKKyAgaWYgKGV4dHJhY3RlZF9ldnBrZXkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ3JlYXRlIGFuIGVtcHR5IHNpZ25hdHVyZSBidWZmZXIgd2l0aCBlbm91Z2ggc3BhY2UuIE9wZW5TU0wgd2lsbCB0ZWxsIHVzCisgIC8vIGhvdyBtdWNoIGl0IGFjdHVhbGx5IHdyb3RlLgorICBpbnQgbWF4aW11bV9zaXplID0gRVZQX1BLRVlfc2l6ZShleHRyYWN0ZWRfZXZwa2V5LmdldCgpKTsKKyAgaWYgKG1heGltdW1fc2l6ZSA8PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgidW5leHBlY3RlZCBtYXggc2l6ZSB3aGVuIGNvbXB1dGluZyBldnAga2V5IHNpemUiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIEJ5dGVCdWZmZXIgc2lnbmF0dXJlX2J1ZmZlcihtYXhpbXVtX3NpemUpOworICB1bnNpZ25lZCBpbnQgc2lnbmF0dXJlX2xlbmd0aCA9IDA7CisKKyAgLy8gQ3JlYXRlIGEgbmV3IG1lc3NhZ2UgZGlnZXN0IGNvbnRleHQgYW5kIGluaXRpYWxpemUgaXQuCisgIHVuaXF1ZV9wdHI8RVZQX01EX0NUWCwgdm9pZCAoKikoRVZQX01EX0NUWCAqKT4gbWRjdHgoRVZQX01EX0NUWF9jcmVhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfTURfQ1RYX2Rlc3Ryb3kpOworICBFVlBfTURfQ1RYX2luaXQobWRjdHguZ2V0KCkpOworICBpbnQgcmV0dXJuX2NvZGUgPSBFVlBfU2lnbkluaXRfZXgobWRjdHguZ2V0KCksIEVWUF9zaGEyNTYoKSwgTlVMTCk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiY291bGQgbm90IGluaXRpYWxpemUgZGlnZXN0IGNvbnRleHQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIE9uIHB1YmxpYyBzaWduYXR1cmUgdHlwZXMsIHdlIGFkZCBzYWx0LgorICByZXR1cm5fY29kZSA9IEVWUF9TaWduVXBkYXRlKG1kY3R4LmdldCgpLCBrU2FsdCwgc2l6ZW9mKGtTYWx0KSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiY291bGQgbm90IGFkZCBzYWx0Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBTZXQgdGhlIG1lc3NhZ2UgdG8gc2lnbi4KKyAgcmV0dXJuX2NvZGUgPSBFVlBfU2lnblVwZGF0ZShtZGN0eC5nZXQoKSwgZGF0YS5JbW11dGFibGVVQ2hhcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZCBub3Qgc2V0IGRhdGEgdG8gc2lnbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ29tcHV0ZSB0aGUgc2lnbmF0dXJlLgorICByZXR1cm5fY29kZSA9IEVWUF9TaWduRmluYWwobWRjdHguZ2V0KCksIHNpZ25hdHVyZV9idWZmZXIuTXV0YWJsZVVDaGFyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmF0dXJlX2xlbmd0aCwgZXh0cmFjdGVkX2V2cGtleS5nZXQoKSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiY291bGQgbm90IGV4ZWN1dGUgc2lnbmF0dXJlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBWZXJpZnkgd2UgZ290IGEgc2lnbmF0dXJlLgorICBpZiAoc2lnbmF0dXJlX2xlbmd0aCA8PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgic2lnbmF0dXJlIGxlbmd0aCBpcyB0b28gc21hbGwiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIFZlcmlmeSB0aGUgc2lnbmF0dXJlIGZpdHMgaW4gdGhlIGJ1ZmZlci4KKyAgaWYgKHNpZ25hdHVyZV9sZW5ndGggPiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KG1heGltdW1fc2l6ZSkpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJzaWduYXR1cmUgYnVmZmVyIGlzIHRvbyBzbWFsbCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4oCisgICAgICBuZXcgQnl0ZUJ1ZmZlcihzaWduYXR1cmVfYnVmZmVyLkltbXV0YWJsZVVDaGFyKCksIHNpZ25hdHVyZV9sZW5ndGgpKTsKK30KKworYm9vbCBDcnlwdG9PcHM6OkVjZHNhUDI1NlNoYTI1NlZlcmlmeShjb25zdCBQdWJsaWNLZXkmIHB1YmxpY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVCdWZmZXImIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZUJ1ZmZlciYgZGF0YSkgeworICBpZiAocHVibGljX2tleS5hbGdvcml0aG0oKSAhPSBLZXlBbGdvcml0aG06OkVDRFNBX0tFWSB8fAorICAgICAgcHVibGljX2tleS5kYXRhKCkuc2l6ZSgpID09IDAgfHwgZGF0YS5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyBFVlBfVmVyaWZ5VXBkYXRlCisgIGlmIChkYXRhLnNpemUoKSA+IFVJTlRfTUFYKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkRhdGEgdG9vIGJpZyB0byB2ZXJpZnkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIEV2cEtleVB0ciBleHRyYWN0ZWRfcHVibGljX2V2cGtleSA9IENyZWF0ZUV2cFB1YmxpY0tleShwdWJsaWNfa2V5KTsKKyAgaWYgKGV4dHJhY3RlZF9wdWJsaWNfZXZwa2V5ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDcmVhdGUgYSB2ZXJpZnkgZGlnZXN0IGNvbnRleHQgYW5kIGluaXRpYWxpemUgaXQKKyAgdW5pcXVlX3B0cjxFVlBfTURfQ1RYLCB2b2lkICgqKShFVlBfTURfQ1RYICopPiB2ZXJpZnljdHgoRVZQX01EX0NUWF9jcmVhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX01EX0NUWF9kZXN0cm95KTsKKyAgRVZQX01EX0NUWF9pbml0KHZlcmlmeWN0eC5nZXQoKSk7CisgIGludCByZXR1cm5fY29kZSA9IEVWUF9WZXJpZnlJbml0X2V4KHZlcmlmeWN0eC5nZXQoKSwgRVZQX3NoYTI1NigpLCBOVUxMKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZCBub3QgaW5pdGlhbGl6ZSB2ZXJpZnkgZGlnZXN0IGNvbnRleHQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBPbiBwdWJsaWMgc2lnbmF0dXJlcywgd2UgYWRkZWQgc2FsdCB0byB0aGUgc2lnbmF0dXJlLgorICByZXR1cm5fY29kZSA9IEVWUF9WZXJpZnlVcGRhdGUodmVyaWZ5Y3R4LmdldCgpLCBrU2FsdCwgc2l6ZW9mKGtTYWx0KSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiY291bGQgbm90IGFkZCBzYWx0IHRvIHZlcmlmeSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFNldCB0aGUgbWVzc2FnZSB0byB2ZXJpZnkKKyAgcmV0dXJuX2NvZGUgPQorICAgICAgRVZQX1ZlcmlmeVVwZGF0ZSh2ZXJpZnljdHguZ2V0KCksIGRhdGEuSW1tdXRhYmxlVUNoYXIoKSwgZGF0YS5zaXplKCkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImNvdWxkIG5vdCBzZXQgZGF0YSB0byB2ZXJpZnkiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBWZXJpZnkgdGhlIHNpZ25hdHVyZQorICByZXR1cm5fY29kZSA9CisgICAgICBFVlBfVmVyaWZ5RmluYWwodmVyaWZ5Y3R4LmdldCgpLCBzaWduYXR1cmUuSW1tdXRhYmxlVUNoYXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHNpZ25hdHVyZS5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZF9wdWJsaWNfZXZwa2V5LmdldCgpKTsKKworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJjb3VsZCBub3QgdmVyaWZ5IHNpZ25hdHVyZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IENyeXB0b09wczo6RWNkaEtleUFncmVlbWVudCgKKyAgICBjb25zdCBQcml2YXRlS2V5JiBwcml2YXRlX2tleSwKKyAgICBjb25zdCBQdWJsaWNLZXkmIHBlZXJfa2V5KSB7CisgIC8vIFNoYXJlZCByZXR1cm4gY29kZS4KKyAgaW50IHJldHVybl9jb2RlOworCisgIC8vIENyZWF0ZSB0aGUgcHJpdmF0ZSBrZXkgZnJvbSB0aGUgZGF0YS4KKyAgRXZwS2V5UHRyIGV2cF9wcml2YXRlX2tleSA9IENyZWF0ZUV2cFByaXZhdGVLZXkocHJpdmF0ZV9rZXkpOworICBpZiAoZXZwX3ByaXZhdGVfa2V5ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgcHVibGljIGtleSBmcm9tIHRoZSBkYXRhLgorICBFdnBLZXlQdHIgZXZwX3BlZXJfa2V5ID0gQ3JlYXRlRXZwUHVibGljS2V5KHBlZXJfa2V5KTsKKyAgaWYgKGV2cF9wZWVyX2tleSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBDcmVhdGUgdGhlIGNvbnRleHQgZm9yIHRoZSBzaGFyZWQgc2VjcmV0IGRlcml2YXRpb24uCisgIHVuaXF1ZV9wdHI8RVZQX1BLRVlfQ1RYLCB2b2lkICgqKShFVlBfUEtFWV9DVFggKik+IGN0eCgKKyAgICAgIEVWUF9QS0VZX0NUWF9uZXcoZXZwX3ByaXZhdGVfa2V5LmdldCgpLCBOVUxMKSwgRVZQX1BLRVlfQ1RYX2ZyZWUpOworICBpZiAoY3R4ID09IG51bGxwdHIpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZCBub3QgY3JlYXRlIEVDREggY29udGV4dCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZS4KKyAgcmV0dXJuX2NvZGUgPSBFVlBfUEtFWV9kZXJpdmVfaW5pdChjdHguZ2V0KCkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImNvdWxkIG5vdCBpbml0aWFsaXplIGNvbnRleHQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIFByb3ZpZGUgdGhlIHBlZXIgcHVibGljIGtleS4KKyAgcmV0dXJuX2NvZGUgPSBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIoY3R4LmdldCgpLCBldnBfcGVlcl9rZXkuZ2V0KCkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImNvdWxkIG5vdCBzZXQgcGVlciIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gRGV0ZXJtaW5lIGJ1ZmZlciBsZW5ndGggZm9yIHNoYXJlZCBzZWNyZXQuCisgIHNpemVfdCBzZWNyZXRfbGVuOworICByZXR1cm5fY29kZSA9IEVWUF9QS0VZX2Rlcml2ZShjdHguZ2V0KCksIE5VTEwsICZzZWNyZXRfbGVuKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZCBub3QgZGV0ZXJtaW5lIHNlY3JldCBsZW5ndGgiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgYnVmZmVyLgorICBhdXRvIHNlY3JldCA9IHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4obmV3IEJ5dGVCdWZmZXIoc2VjcmV0X2xlbikpOworCisgIC8vIERlcml2ZSB0aGUgc2hhcmVkIHNlY3JldC4KKyAgcmV0dXJuX2NvZGUgPSBFVlBfUEtFWV9kZXJpdmUoY3R4LmdldCgpLCBzZWNyZXQtPk11dGFibGVVQ2hhcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VjcmV0X2xlbik7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxIHx8IHNlY3JldF9sZW4gIT0gc2VjcmV0LT5zaXplKCkpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZCBub3QgZGVyaXZlIHNlY3JldCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHNlY3JldDsKK30KKwordW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBDcnlwdG9PcHM6OlJzYTIwNDhTaGEyNTZTaWduKAorICAgIGNvbnN0IFByaXZhdGVLZXkgJnByaXZhdGVfa2V5LCBjb25zdCBCeXRlQnVmZmVyICZkYXRhKSB7CisgIGlmIChwcml2YXRlX2tleS5hbGdvcml0aG0oKSAhPSBLZXlBbGdvcml0aG06OlJTQV9LRVkgfHwKKyAgICAgIHByaXZhdGVfa2V5LmRhdGEoKS5zaXplKCkgPT0gMCB8fCBkYXRhLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBPdmVyZmxvdyBjaGVjayB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgRVZQX1NpZ25VcGRhdGUKKyAgaWYgKGRhdGEuc2l6ZSgpID4gVUlOVF9NQVgpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiRGF0YSB0b28gbGFyZ2UgdG8gc2lnbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaW50IHJldHVybl9jb2RlOworICBjb25zdCB1aW50OF90ICprZXlfZGF0YSA9IHByaXZhdGVfa2V5LmRhdGEoKS5JbW11dGFibGVVSW50OCgpOworCisgIC8vIEltcG9ydCBieXRlcyBpbnRvIGFuIFJTQSBrZXkgc3RydWN0dXJlCisgIHVuaXF1ZV9wdHI8UlNBLCB2b2lkICgqKShSU0EgKik+IHJzYV9rZXkoCisgICAgICBkMmlfUlNBUHJpdmF0ZUtleShOVUxMLCAma2V5X2RhdGEsIHByaXZhdGVfa2V5LmRhdGEoKS5zaXplKCkpLCBSU0FfZnJlZSk7CisKKyAgaWYgKHJzYV9rZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJjb3VsZCBub3QgcmUtY3JlYXRlIHJzYSBrZXkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENyZWF0ZSBhbiBFVlAga2V5IHN0cnVjdHVyZQorICBFdnBLZXlQdHIgcnNhX3BrZXkoRVZQX1BLRVlfbmV3KCkpOworICBpZiAocnNhX3BrZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBjcmVhdGUgbmV3IEVWUF9QS0VZIHN0cnVjdHVyZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gUGxhY2UgdGhlIFJTQSBrZXkgaW50byB0aGUgRVZQIHN0cnVjdHVyZQorICByZXR1cm5fY29kZSA9IEVWUF9QS0VZX3NldDFfUlNBKHJzYV9wa2V5LmdldCgpLCByc2Ffa2V5LmdldCgpKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJDb3VsZCBub3Qgc2V0IHJzYSBrZXkgaW50byBwa2V5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBTZXQgdXAgYSBuZXcgc2lnbmF0dXJlIGNvbnRleHQKKyAgdW5pcXVlX3B0cjxFVlBfTURfQ1RYLCB2b2lkICgqKShFVlBfTURfQ1RYICopPiBjdHgoRVZQX01EX0NUWF9jcmVhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX01EX0NUWF9kZXN0cm95KTsKKyAgaWYgKGN0eC5nZXQoKSA9PSBOVUxMKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiQ291bGQgbm90IGNyZWF0ZSBzaWduYXR1cmUgY29udGV4dCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBpdAorICByZXR1cm5fY29kZSA9IEVWUF9TaWduSW5pdChjdHguZ2V0KCksIEVWUF9zaGEyNTYoKSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiQ291bGQgbm90IGluaXRpYWxpemUgY29udGV4dCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gT24gcHVibGljIHNpZ25hdHVyZSB0eXBlcywgd2UgYWRkIHNhbHQuCisgIHJldHVybl9jb2RlID0gRVZQX1NpZ25VcGRhdGUoY3R4LmdldCgpLCBrU2FsdCwgc2l6ZW9mKGtTYWx0KSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiY291bGQgbm90IGFkZCBzYWx0Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBTZXQgdGhlIG1lc3NhZ2UgdG8gc2lnbgorICByZXR1cm5fY29kZSA9IEVWUF9TaWduVXBkYXRlKGN0eC5nZXQoKSwgZGF0YS5JbW11dGFibGVVQ2hhcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZCBub3Qgc2V0IGRhdGEgdG8gc2lnbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gTWFrZSBzcGFjZSBmb3IgdGhlIHNpZ25hdHVyZQorICBzaXplX3Qgc2lnbmF0dXJlX3NpemUgPSBFVlBfUEtFWV9zaXplKHJzYV9wa2V5LmdldCgpKTsKKyAgaWYgKHNpZ25hdHVyZV9zaXplID09IDApIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJJbnZhbGlkIHNpZ25hdHVyZSBzaXplIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgQnl0ZUJ1ZmZlciBzaWduYXR1cmUoc2lnbmF0dXJlX3NpemUpOworCisgIC8vIFBlcmZvcm0gdGhlIHNpZ25hdHVyZQorICB1bnNpZ25lZCBpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisgIHJldHVybl9jb2RlID0gRVZQX1NpZ25GaW5hbChjdHguZ2V0KCksIHNpZ25hdHVyZS5NdXRhYmxlVUludDgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuLCByc2FfcGtleS5nZXQoKSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiRXJyb3Igd2hpbGUgc2lnbmluZyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4oCisgICAgICBuZXcgQnl0ZUJ1ZmZlcihzaWduYXR1cmUuSW1tdXRhYmxlVUludDgoKSwgYnl0ZXNfd3JpdHRlbikpOworfQorCitib29sIENyeXB0b09wczo6UnNhMjA0OFNoYTI1NlZlcmlmeShjb25zdCBQdWJsaWNLZXkmIHB1YmxpY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlQnVmZmVyJiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlQnVmZmVyJiBkYXRhKSB7CisgIGlmIChwdWJsaWNfa2V5LmFsZ29yaXRobSgpICE9IEtleUFsZ29yaXRobTo6UlNBX0tFWSB8fAorICAgICAgcHVibGljX2tleS5kYXRhKCkuc2l6ZSgpID09IDAgfHwgZGF0YS5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IEVWUF9WZXJpZnlVcGRhdGUKKyAgaWYgKGRhdGEuc2l6ZSgpID4gVUlOVF9NQVgpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiRGF0YSB0b28gYmlnIHRvIHZlcmlmeSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaW50IHJldHVybl9jb2RlOworICBjb25zdCB1aW50OF90ICprZXlfZGF0YSA9IHB1YmxpY19rZXkuZGF0YSgpLkltbXV0YWJsZVVJbnQ4KCk7CisKKyAgLy8gSW1wb3J0IGJ5dGVzIGludG8gYW4gUlNBIGtleSBzdHJ1Y3R1cmUKKyAgdW5pcXVlX3B0cjxSU0EsIHZvaWQgKCopKFJTQSAqKT4gcnNhX3B1YmxpY19rZXkoCisgICAgICBkMmlfUlNBX1BVQktFWShOVUxMLCAma2V5X2RhdGEsIHB1YmxpY19rZXkuZGF0YSgpLnNpemUoKSksIFJTQV9mcmVlKTsKKyAgaWYgKHJzYV9wdWJsaWNfa2V5LmdldCgpID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KAorICAgICAgICAiY291bGQgbm90IGltcG9ydCBieXRlcyBpbnRvIFJTQSBrZXkgb2JqZWN0IGZvciBwdWJsaWMga2V5Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ3JlYXRlIGFuIEVWUCBrZXkgc3RydWN0dXJlCisgIEV2cEtleVB0ciByc2FfcHVibGljX3BrZXkoRVZQX1BLRVlfbmV3KCkpOworICBpZiAocnNhX3B1YmxpY19wa2V5LmdldCgpID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KAorICAgICAgICAiY291bGQgbm90IGNyZWF0ZSBFVlAgc3RydWN0dXJlIGZvciBzdG9yaW5nIHB1YmxpYyBSU0Ega2V5Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gUGxhY2UgdGhlIFJTQSBrZXkgaW50byB0aGUgRVZQIHN0cnVjdHVyZQorICByZXR1cm5fY29kZSA9IEVWUF9QS0VZX3NldDFfUlNBKHJzYV9wdWJsaWNfcGtleS5nZXQoKSwgcnNhX3B1YmxpY19rZXkuZ2V0KCkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImNvdWxkIG5vdCBzZXQgUlNBIHB1YmxpYyBrZXkgaW50byBFVlAgc3RydWN0dXJlIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ3JlYXRlIHZlcmlmaWNhdGlvbiBjb250ZXh0CisgIHVuaXF1ZV9wdHI8RVZQX01EX0NUWCwgdm9pZCAoKikoRVZQX01EX0NUWCAqKT4gdmVyaWZ5Y3R4KEVWUF9NRF9DVFhfY3JlYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9NRF9DVFhfZGVzdHJveSk7CisgIEVWUF9NRF9DVFhfaW5pdCh2ZXJpZnljdHguZ2V0KCkpOworCisgIC8vIEluaXRpYWxpemUgaXQKKyAgcmV0dXJuX2NvZGUgPSBFVlBfVmVyaWZ5SW5pdF9leCh2ZXJpZnljdHguZ2V0KCksIEVWUF9zaGEyNTYoKSwgTlVMTCk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiY291bGQgbm90IGluaXRpYWxpemUgdmVyaWZ5IGRpZ2VzdCBjb250ZXh0Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gT24gcHVibGljIHNpZ25hdHVyZXMsIHdlIGFkZGVkIHNhbHQgdG8gdGhlIHNpZ25hdHVyZS4KKyAgcmV0dXJuX2NvZGUgPSBFVlBfVmVyaWZ5VXBkYXRlKHZlcmlmeWN0eC5nZXQoKSwga1NhbHQsIHNpemVvZihrU2FsdCkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImNvdWxkIG5vdCBhZGQgc2FsdCB0byB2ZXJpZnkiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBTZXQgdGhlIG1lc3NhZ2UgdG8gdmVyaWZ5CisgIHJldHVybl9jb2RlID0KKyAgICAgIEVWUF9WZXJpZnlVcGRhdGUodmVyaWZ5Y3R4LmdldCgpLCBkYXRhLkltbXV0YWJsZVVDaGFyKCksIGRhdGEuc2l6ZSgpKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZCBub3Qgc2V0IGRhdGEgdG8gdmVyaWZ5Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVmVyaWZ5IHRoZSBzaWduYXR1cmUKKyAgcmV0dXJuX2NvZGUgPSBFVlBfVmVyaWZ5RmluYWwodmVyaWZ5Y3R4LmdldCgpLCBzaWduYXR1cmUuSW1tdXRhYmxlVUNoYXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihzaWduYXR1cmUuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNhX3B1YmxpY19wa2V5LmdldCgpKTsKKworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJjb3VsZCBub3QgdmVyaWZ5IHNpZ25hdHVyZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiBDcnlwdG9PcHM6OkltcG9ydEVjUDI1NktleShjb25zdCBzdHJpbmcmIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHkpIHsKKyAgaW50IHJldHVybl9jb2RlOyAgLy8gVXNlZCB0byBjaGVjayBhbGwgb2YgT3BlblNTTCdzIHJldHVybiBjb2RlcworCisgIGlmICghSXNWYWxpZEVjUDI1NkNvb3JkaW5hdGVFbmNvZGluZyh4KSB8fAorICAgICAgIUlzVmFsaWRFY1AyNTZDb29yZGluYXRlRW5jb2RpbmcoeSkpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiZXJyb3IsIGludmFsaWQga2V5IGZvcm1hdCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gR2VuZXJhdGUgbmV3IGVjIGtleSBzdHJ1Y3R1cmUgZm9yIHRoZSBQMjU2IGN1cnZlCisgIHVuaXF1ZV9wdHI8RUNfS0VZLCB2b2lkICgqKShFQ19LRVkgKik+IGVja2V5KAorICAgICAgRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKE5JRF9YOV82Ml9wcmltZTI1NnYxKSwKKyAgICAgIEVDX0tFWV9mcmVlKTsKKyAgaWYgKGVja2V5LmdldCgpID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJlcnJvciwgY291bGRuJ3QgY3JlYXRlIG5ldyBrZXkgc3RydWN0dXJlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBhdXRvIHhfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPih4LmRhdGEoKSk7CisgIGF1dG8geV9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KHkuZGF0YSgpKTsKKworICB1bmlxdWVfcHRyPEJJR05VTSwgdm9pZCAoKikoQklHTlVNICopPiB4X3ZhbHVlKAorICAgICAgQk5fYmluMmJuKHhfZGF0YSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih4Lmxlbmd0aCgpKSwgTlVMTCksCisgICAgICBCTl9mcmVlKTsKKyAgdW5pcXVlX3B0cjxCSUdOVU0sIHZvaWQgKCopKEJJR05VTSAqKT4geV92YWx1ZSgKKyAgICAgIEJOX2JpbjJibih5X2RhdGEsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oeS5sZW5ndGgoKSksIE5VTEwpLAorICAgICAgQk5fZnJlZSk7CisKKyAgcmV0dXJuX2NvZGUgPSBFQ19LRVlfc2V0X3B1YmxpY19rZXlfYWZmaW5lX2Nvb3JkaW5hdGVzKGVja2V5LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF92YWx1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfdmFsdWUuZ2V0KCkpOworCisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoImVycm9yLCBjb3VsZG4ndCBzZXQgcHVibGljIGtleSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBwdWJsaWNfa2V5X2J5dGVzID0gUHVibGljS2V5VG9CeXRlcyhlY2tleS5nZXQoKSk7CisgIGlmIChwdWJsaWNfa2V5X2J5dGVzID09IG51bGxwdHIpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJlcnJvciwgY291bGRuJ3QgdW53cmFwIHB1YmxpYyBrZXkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiB1bmlxdWVfcHRyPFB1YmxpY0tleT4oCisgICAgICBuZXcgUHVibGljS2V5KCpwdWJsaWNfa2V5X2J5dGVzLCBLZXlBbGdvcml0aG06OkVDRFNBX0tFWSkpOworfQorCitib29sIENyeXB0b09wczo6RXhwb3J0RWNQMjU2S2V5KGNvbnN0IENyeXB0b09wczo6UHVibGljS2V5JiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyAqeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICp5KSB7CisgIGludCByZXR1cm5fY29kZTsgIC8vIFVzZWQgdG8gY2hlY2sgYWxsIG9mIE9wZW5TU0wncyByZXR1cm4gY29kZXMKKworICBpZiAoa2V5LmFsZ29yaXRobSgpICE9IEVDRFNBX0tFWSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJlcnJvciwgaW52YWxpZCBrZXkgdHlwZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB1Yl9rZXlfYnVmZmVyID0ga2V5LmRhdGEoKS5JbW11dGFibGVVQ2hhcigpOworICB1bmlxdWVfcHRyPEVDX0tFWSwgdm9pZCAoKikoRUNfS0VZICopPiBlY2tleSgKKyAgICAgIGQyaV9FQ19QVUJLRVkoTlVMTCwgJnB1Yl9rZXlfYnVmZmVyLCBrZXkuZGF0YSgpLnNpemUoKSksCisgICAgICBFQ19LRVlfZnJlZSk7CisKKyAgaWYgKGVja2V5LmdldCgpID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiZXJyb3IsIGNvdWxkbid0IGltcG9ydCBuZXcga2V5IHN0cnVjdHVyZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IEVDX1BPSU5UICplY3BvaW50ID0gRUNfS0VZX2dldDBfcHVibGljX2tleShlY2tleS5nZXQoKSk7CisgIGNvbnN0IEVDX0dST1VQICplY2dyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkuZ2V0KCkpOworCisgIGlmIChlY3BvaW50ID09IE5VTEwgfHwgZWNncm91cCA9PSBOVUxMKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiZXJyb3IsIGNvdWxkbid0IGdldCB0aGUgcHVibGljIGtleSBkZXRhaWxzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdW5pcXVlX3B0cjxCSUdOVU0sIHZvaWQgKCopKEJJR05VTSAqKT4geF92YWx1ZSgKKyAgICAgIEJOX25ldygpLAorICAgICAgQk5fZnJlZSk7CisgIHVuaXF1ZV9wdHI8QklHTlVNLCB2b2lkICgqKShCSUdOVU0gKik+IHlfdmFsdWUoCisgICAgICBCTl9uZXcoKSwKKyAgICAgIEJOX2ZyZWUpOworCisgIHJldHVybl9jb2RlID0gRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZWNncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfdmFsdWUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV92YWx1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImVycm9yLCBjb3VsZCBub3QgY2FwdHVyZSBjb29yZGluYXRlcyBvZiBrZXkiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBCeXRlQnVmZmVyIHhfYnl0ZXMoQk5fbnVtX2J5dGVzKHhfdmFsdWUuZ2V0KCkpKTsKKyAgQnl0ZUJ1ZmZlciB5X2J5dGVzKEJOX251bV9ieXRlcyh5X3ZhbHVlLmdldCgpKSk7CisgIEJOX2JuMmJpbih4X3ZhbHVlLmdldCgpLCB4X2J5dGVzLk11dGFibGVVQ2hhcigpKTsKKyAgQk5fYm4yYmluKHlfdmFsdWUuZ2V0KCksIHlfYnl0ZXMuTXV0YWJsZVVDaGFyKCkpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgYnl0ZSBmb3JtYXQgaXMgaW4gdHdvJ3MgY29tcGxlbWVudCBieSBhZGRpbmcgYSBieXRlIG9mIDAncy4KKyAgeF9ieXRlcy5QcmVwZW5kKHN0cmluZygxLCAnXHgwMCcpKTsKKyAgeV9ieXRlcy5QcmVwZW5kKHN0cmluZygxLCAnXHgwMCcpKTsKKworICBpZiAoeCAhPSBOVUxMKSB7CisgICAgeC0+YXNzaWduKHhfYnl0ZXMuU3RyaW5nKCkpOworICB9CisgIGlmICh5ICE9IE5VTEwpIHsKKyAgICB5LT5hc3NpZ24oeV9ieXRlcy5TdHJpbmcoKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3VuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpQdWJsaWNLZXk+IENyeXB0b09wczo6SW1wb3J0UnNhMjA0OEtleShjb25zdCBzdHJpbmcmIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlKSB7CisgIGlmICghSXNWYWxpZFJzYTIwNDhNb2R1bHVzRW5jb2RpbmcobikpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiZXJyb3IsIGludmFsaWQga2V5IGVuY29kaW5nIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPFJTQSwgdm9pZCAoKikoUlNBICopPiByc2EoUlNBX25ldygpLCBSU0FfZnJlZSk7CisgIGlmIChyc2EuZ2V0KCkgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImVycm9yLCBjb3VsZG4ndCBjcmVhdGUgbmV3IGtleSBzdHJ1Y3R1cmUiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGF1dG8gbl9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KG4uZGF0YSgpKTsKKworICBzdHJpbmcgZV9zdHIgPSBJbnQzMkJ5dGVzVG9TdHJpbmcoZSk7CisgIGF1dG8gZV9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KGVfc3RyLmRhdGEoKSk7CisKKyAgdW5pcXVlX3B0cjxCSUdOVU0sIHZvaWQgKCopKEJJR05VTSAqKT4gbl92YWx1ZSgKKyAgICAgIEJOX2JpbjJibihuX2RhdGEsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4obi5sZW5ndGgoKSksIE5VTEwpLAorICAgICAgQk5fZnJlZSk7CisgIHVuaXF1ZV9wdHI8QklHTlVNLCB2b2lkICgqKShCSUdOVU0gKik+IGVfdmFsdWUoCisgICAgICBCTl9iaW4yYm4oZV9kYXRhLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGVfc3RyLmxlbmd0aCgpKSwgTlVMTCksCisgICAgICBCTl9mcmVlKTsKKworICByc2EtPm4gPSBuX3ZhbHVlLnJlbGVhc2UoKTsKKyAgcnNhLT5lID0gZV92YWx1ZS5yZWxlYXNlKCk7CisKKyAgdW5zaWduZWQgY2hhciAqcHVibGljX2tleV9idWZmZXIgPSBOVUxMOworICBpbnQgcHVibGljX2tleV9sZW4gPSBpMmRfUlNBX1BVQktFWShyc2EuZ2V0KCksICZwdWJsaWNfa2V5X2J1ZmZlcik7CisKKyAgaWYgKHB1YmxpY19rZXlfbGVuIDw9IDApIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJpbnZhbGlkIHB1YmxpYyBrZXkgbGVuZ3RoIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAocHVibGljX2tleV9idWZmZXIgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImNvdWxkbid0IGFsbG9jYXRlIHB1YmxpYyBrZXkgYnVmZmVyIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBCeXRlQnVmZmVyIHB1YmxpY19rZXlfYnl0ZXMocHVibGljX2tleV9idWZmZXIsIHB1YmxpY19rZXlfbGVuKTsKKyAgZnJlZShwdWJsaWNfa2V5X2J1ZmZlcik7CisKKyAgcmV0dXJuIHVuaXF1ZV9wdHI8UHVibGljS2V5PigKKyAgICAgIG5ldyBQdWJsaWNLZXkocHVibGljX2tleV9ieXRlcywgS2V5QWxnb3JpdGhtOjpSU0FfS0VZKSk7Cit9CisKK2Jvb2wgQ3J5cHRvT3BzOjpFeHBvcnRSc2EyMDQ4S2V5KGNvbnN0IENyeXB0b09wczo6UHVibGljS2V5JiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICplKSB7CisgIGlmIChrZXkuYWxnb3JpdGhtKCkgIT0gUlNBX0tFWSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJlcnJvciwgaW52YWxpZCBrZXkgdHlwZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB1Yl9rZXlfYnVmZmVyID0ga2V5LmRhdGEoKS5JbW11dGFibGVVQ2hhcigpOworICB1bmlxdWVfcHRyPFJTQSwgdm9pZCAoKikoUlNBICopPiByc2EoCisgICAgICBkMmlfUlNBX1BVQktFWShOVUxMLCAmcHViX2tleV9idWZmZXIsIGtleS5kYXRhKCkuc2l6ZSgpKSwKKyAgICAgIFJTQV9mcmVlKTsKKworICBpZiAocnNhLmdldCgpID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiZXJyb3IsIGNvdWxkbid0IGltcG9ydCBuZXcga2V5IHN0cnVjdHVyZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChyc2EtPm4gPT0gTlVMTCB8fCByc2EtPmUgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoImVycm9yLCBjb3VsZG4ndCBnZXQgdGhlIHB1YmxpYyBrZXkgZGV0YWlscyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KEJOX251bV9ieXRlcyhyc2EtPmUpKSA+IHNpemVvZigqZSkpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJlcnJvciwgaW52YWxpZCBleHBvbmVudCBzaXplIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQnl0ZUJ1ZmZlciBuX2J5dGVzKEJOX251bV9ieXRlcyhyc2EtPm4pKTsKKyAgQnl0ZUJ1ZmZlciBlX2J5dGVzKEJOX251bV9ieXRlcyhyc2EtPmUpKTsKKworICBCTl9ibjJiaW4ocnNhLT5uLCBuX2J5dGVzLk11dGFibGVVQ2hhcigpKTsKKyAgQk5fYm4yYmluKHJzYS0+ZSwgZV9ieXRlcy5NdXRhYmxlVUNoYXIoKSk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBtb2R1bHVzIGJ5dGVzIGFyZSBpbiB0d28ncyBjb21wbGVtZW50IGJ5IGVuc3VyaW5nIHRoZQorICAvLyBsZWFkaW5nIGJpdCBpcyBub3QgMS4KKyAgbl9ieXRlcy5QcmVwZW5kKHN0cmluZygxLCAnXHgwMCcpKTsKKworICBpbnQzMl90IGVfaW50MzIgPSAwOworICBpZiAoIVN0cmluZ1RvSW50MzJCeXRlcyhlX2J5dGVzLlN0cmluZygpLCAmZV9pbnQzMikpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJlcnJvciwgaW52YWxpZCBleHBvbmVudCBieXRlcyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChuICE9IE5VTEwpIHsKKyAgICBuLT5hc3NpZ24obl9ieXRlcy5TdHJpbmcoKSk7CisgIH0KKworICBpZiAoZSAhPSBOVUxMKSB7CisgICAgKmUgPSBlX2ludDMyOworICB9CisgIHJldHVybiB0cnVlOworfQorCit1bmlxdWVfcHRyPENyeXB0b09wczo6U2VjcmV0S2V5PiBDcnlwdG9PcHM6OkdlbmVyYXRlQWVzMjU2U2VjcmV0S2V5KCkgeworICBzaXplX3Qga2V5X3NpemVfaW5fYnl0ZXMgPSBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoRVZQX2Flc18yNTZfY2JjKCkpOworICBCeXRlQnVmZmVyIGtleShrZXlfc2l6ZV9pbl9ieXRlcyk7CisKKyAgaWYgKFJBTkRfYnl0ZXMoa2V5Lk11dGFibGVVSW50OCgpLAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtleV9zaXplX2luX2J5dGVzKSkgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKAorICAgICAgICAiQ291bGQgbm90IGdldCBlbm91Z2ggY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGJ5dGVzIGZvciBrZXkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiB1bmlxdWVfcHRyPFNlY3JldEtleT4oCisgICAgICBuZXcgU2VjcmV0S2V5KGtleS5TdHJpbmcoKSwgS2V5QWxnb3JpdGhtOjpBRVNfMjU2X0tFWSkpOworfQorCit1bmlxdWVfcHRyPENyeXB0b09wczo6S2V5UGFpcj4gQ3J5cHRvT3BzOjpHZW5lcmF0ZUVjUDI1NktleVBhaXIoKSB7CisgIGludCByZXR1cm5fY29kZTsgIC8vIFVzZWQgdG8gY2hlY2sgYWxsIG9mIE9wZW5TU0wncyByZXR1cm4gY29kZXMKKworICAvLyBDcmVhdGUgYSBuZXcgRVZQIGtleSBzdHJ1Y3R1cmUgZm9yIHRoZSBFQyBrZXkKKyAgRXZwS2V5UHRyIGVjcGtleShFVlBfUEtFWV9uZXcoKSk7CisgIGlmIChlY3BrZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBjcmVhdGUgRVZQIFBLRVkgc3RydWN0dXJlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBHZW5lcmF0ZSBuZXcgZWMga2V5IHN0cnVjdHVyZSBmb3IgdGhlIFAyNTYgY3VydmUKKyAgRUNfS0VZICplY2tleSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShOSURfWDlfNjJfcHJpbWUyNTZ2MSk7CisgIGlmIChlY2tleSA9PSBOVUxMKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiZXJyb3IsIGNvdWxkbid0IGNyZWF0ZSBuZXcga2V5IHN0cnVjdHVyZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gR2VuZXJhdGUgYSBuZXcga2V5IGFuZCBzdGljayBpdCBpbiB0aGUgc3RydWN0dXJlCisgIHJldHVybl9jb2RlID0gRUNfS0VZX2dlbmVyYXRlX2tleShlY2tleSk7CisgIGlmIChyZXR1cm5fY29kZSAhPSAxKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiQ291bGRuJ3QgZ2VuZXJhdGUgbmV3IGtleSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQXNzaWduIHRoZSBFQyBLZXkgdG8gYSBFVlAgUEtFWSBzdHJ1Y3R1cmUKKyAgcmV0dXJuX2NvZGUgPSBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKGVjcGtleS5nZXQoKSwgZWNrZXkpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBhc3NpZ24gRUMga2V5IHRvIEVWUCBzdHJ1Y3R1cmUiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENvbnZlcnQgcHVibGljIGtleSB0byBieXRlcworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHB1YmxpY19rZXlfYnl0ZXMgPSBQdWJsaWNLZXlUb0J5dGVzKGVja2V5KTsKKyAgaWYgKHB1YmxpY19rZXlfYnl0ZXMgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ29udmVydCBwcml2YXRlIGtleSB0byBieXRlcworICB1bmlxdWVfcHRyPFBLQ1M4X1BSSVZfS0VZX0lORk8sIHZvaWQgKCopKFBLQ1M4X1BSSVZfS0VZX0lORk8gKik+IHBrY3M4KAorICAgICAgRVZQX1BLRVkyUEtDUzgoZWNwa2V5LmdldCgpKSwgUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKTsKKworICBpZiAocGtjczguZ2V0KCkgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJjb3VsZCBub3QgY29udmVydCBldnAga2V5IGludG8gcGtjczgga2V5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaW50IHByaXZfa2V5X2xlbiA9IGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPKHBrY3M4LmdldCgpLCBOVUxMKTsKKyAgaWYgKHByaXZfa2V5X2xlbiA8PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgidW5leHBlY3RlZCBwcml2YXRlIGtleSBsZW5ndGggcmV0dXJuZWQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICB1bnNpZ25lZCBjaGFyICpwcml2X2tleV9idWZmZXIgPSBOVUxMOworICByZXR1cm5fY29kZSA9IGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPKHBrY3M4LmdldCgpLCAmcHJpdl9rZXlfYnVmZmVyKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IHByaXZfa2V5X2xlbikgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIndyb3RlIGFuIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIHByaXZhdGUga2V5IGJ5dGVzIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgQnl0ZUJ1ZmZlciBwcml2YXRlX2tleV9ieXRlcyhwcml2X2tleV9idWZmZXIsIHByaXZfa2V5X2xlbik7CisgIGZyZWUocHJpdl9rZXlfYnVmZmVyKTsKKworICByZXR1cm4gdW5pcXVlX3B0cjxLZXlQYWlyPigKKyAgICAgIG5ldyBLZXlQYWlyKHVuaXF1ZV9wdHI8UHVibGljS2V5PihuZXcgUHVibGljS2V5KAorICAgICAgICAgICAgICAgICAgICAgICpwdWJsaWNfa2V5X2J5dGVzLCBLZXlBbGdvcml0aG06OkVDRFNBX0tFWSkpLAorICAgICAgICAgICAgICAgICAgdW5pcXVlX3B0cjxQcml2YXRlS2V5PihuZXcgUHJpdmF0ZUtleSgKKyAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlX2tleV9ieXRlcywgS2V5QWxnb3JpdGhtOjpFQ0RTQV9LRVkpKSkpOworfQorCit1bmlxdWVfcHRyPENyeXB0b09wczo6S2V5UGFpcj4gQ3J5cHRvT3BzOjpHZW5lcmF0ZVJzYTIwNDhLZXlQYWlyKCkgeworICAvLyBDcmVhdGUgdGhlIGV4cG9uZW50CisgIHVuaXF1ZV9wdHI8QklHTlVNLCB2b2lkICgqKShCSUdOVU0gKik+IGV4cChCTl9uZXcoKSwgQk5fY2xlYXJfZnJlZSk7CisgIGlmIChleHAuZ2V0KCkgPT0gTlVMTCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkNvdWxkIG5vdCBjcmVhdGUgbmV3IGJpZ251bSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaW50IHJldHVybl9jb2RlID0gQk5fc2V0X3dvcmQoZXhwLmdldCgpLCBSU0FfRjQpOworICBpZiAocmV0dXJuX2NvZGUgIT0gMSkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIkVycm9yIHNldHRpbmcgZXhwb25lbnQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGEga2V5CisgIHVuaXF1ZV9wdHI8UlNBLCB2b2lkICgqKShSU0EgKik+IHJzYShSU0FfbmV3KCksIFJTQV9mcmVlKTsKKyAgaWYgKHJzYS5nZXQoKSA9PSBOVUxMKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiRXJyb3IgY3JlYXRpbmcgUlNBIHN0cnVjdHVyZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuX2NvZGUgPSBSU0FfZ2VuZXJhdGVfa2V5X2V4KHJzYS5nZXQoKSwgMjA0OCwgZXhwLmdldCgpLCBOVUxMKTsKKyAgaWYgKHJldHVybl9jb2RlICE9IDEpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJFcnJvciBnZW5lcmF0aW5nIFJTQSBrZXkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIFN0b3JlIHByaXZhdGUga2V5CisgIHVuc2lnbmVkIGNoYXIgKnByaXZhdGVfa2V5X2J1ZmZlciA9IE5VTEw7CisgIGludCBwcml2YXRlX2tleV9sZW4gPSBpMmRfUlNBUHJpdmF0ZUtleShyc2EuZ2V0KCksICZwcml2YXRlX2tleV9idWZmZXIpOworICBpZiAocHJpdmF0ZV9rZXlfYnVmZmVyID09IE5VTEwpIHsKKyAgICBVdGlsOjpMb2dFcnJvckFuZEFib3J0KCJjb3VsZG4ndCBhbGxvY2F0ZSBwcml2YXRlIGtleSBidWZmZXIiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGlmIChwcml2YXRlX2tleV9sZW4gPD0gMCkgeworICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoCisgICAgICAgICJpbnZhbGlkIHByaXZhdGUga2V5IGxlbmd0aCBlbmNvdW50ZXJlZCBkdXJpbmcga2V5IGdlbmVyYXRpb24iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBCeXRlQnVmZmVyIHByaXZhdGVfa2V5KHByaXZhdGVfa2V5X2J1ZmZlciwgcHJpdmF0ZV9rZXlfbGVuKTsKKyAgZnJlZShwcml2YXRlX2tleV9idWZmZXIpOworCisgIC8vIFN0b3JlIHB1YmxpYyBrZXkKKyAgdW5zaWduZWQgY2hhciAqcHVibGljX2tleV9idWZmZXIgPSBOVUxMOworICBpbnQgcHVibGljX2tleV9sZW4gPSBpMmRfUlNBX1BVQktFWShyc2EuZ2V0KCksICZwdWJsaWNfa2V5X2J1ZmZlcik7CisgIGlmIChwdWJsaWNfa2V5X2J1ZmZlciA9PSBOVUxMKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiY291bGRuJ3QgYWxsb2NhdGUgcHVibGljIGtleSBidWZmZXIiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGlmIChwdWJsaWNfa2V5X2xlbiA8PSAwKSB7CisgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgiaW52YWxpZCBwdWJsaWMga2V5IGxlbmd0aCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIEJ5dGVCdWZmZXIgcHVibGljX2tleShwdWJsaWNfa2V5X2J1ZmZlciwgcHVibGljX2tleV9sZW4pOworICBmcmVlKHB1YmxpY19rZXlfYnVmZmVyKTsKKworICByZXR1cm4gdW5pcXVlX3B0cjxLZXlQYWlyPihuZXcgS2V5UGFpcigKKyAgICAgIHVuaXF1ZV9wdHI8UHVibGljS2V5PihuZXcgUHVibGljS2V5KHB1YmxpY19rZXksIEtleUFsZ29yaXRobTo6UlNBX0tFWSkpLAorICAgICAgdW5pcXVlX3B0cjxQcml2YXRlS2V5PigKKyAgICAgICAgICBuZXcgUHJpdmF0ZUtleShwcml2YXRlX2tleSwgS2V5QWxnb3JpdGhtOjpSU0FfS0VZKSkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9wdWJsaWNfa2V5X3Byb3RvX3V0aWwuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2UvcHVibGljX2tleV9wcm90b191dGlsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTdlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2UvcHVibGljX2tleV9wcm90b191dGlsLmNjCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9wdWJsaWNfa2V5X3Byb3RvX3V0aWwuaCIKKwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOworCituYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZSB7CisKK3VuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4gUHVibGljS2V5UHJvdG9VdGlsOjpFbmNvZGVQdWJsaWNLZXkoCisgICAgY29uc3QgQ3J5cHRvT3BzOjpQdWJsaWNLZXkmIGtleSkgeworICBzd2l0Y2ggKGtleS5hbGdvcml0aG0oKSkgeworICAgIGNhc2UgQ3J5cHRvT3BzOjpLZXlBbGdvcml0aG06OkVDRFNBX0tFWTogeworICAgICAgdW5pcXVlX3B0cjxFY1AyNTZQdWJsaWNLZXk+IGVjX2tleSA9IEVuY29kZUVjUHVibGljS2V5KGtleSk7CisgICAgICBpZiAoZWNfa2V5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisKKyAgICAgIHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4gcmVzdWx0KG5ldyBHZW5lcmljUHVibGljS2V5KCkpOworICAgICAgcmVzdWx0LT5zZXRfdHlwZShQdWJsaWNLZXlUeXBlOjpFQ19QMjU2KTsKKyAgICAgIHJlc3VsdC0+bXV0YWJsZV9lY19wMjU2X3B1YmxpY19rZXkoKS0+Q29weUZyb20oKmVjX2tleSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBjYXNlIENyeXB0b09wczo6S2V5QWxnb3JpdGhtOjpSU0FfS0VZOiB7CisgICAgICB1bmlxdWVfcHRyPFNpbXBsZVJzYVB1YmxpY0tleT4gcnNhX2tleSA9IEVuY29kZVJzYVB1YmxpY0tleShrZXkpOworICAgICAgaWYgKHJzYV9rZXkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKworICAgICAgdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiByZXN1bHQobmV3IEdlbmVyaWNQdWJsaWNLZXkoKSk7CisgICAgICByZXN1bHQtPnNldF90eXBlKFB1YmxpY0tleVR5cGU6OlJTQTIwNDgpOworICAgICAgcmVzdWx0LT5tdXRhYmxlX3JzYTIwNDhfcHVibGljX2tleSgpLT5Db3B5RnJvbSgqcnNhX2tleSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKwordW5pcXVlX3B0cjxFY1AyNTZQdWJsaWNLZXk+IFB1YmxpY0tleVByb3RvVXRpbDo6RW5jb2RlRWNQdWJsaWNLZXkoCisgICAgY29uc3QgQ3J5cHRvT3BzOjpQdWJsaWNLZXkmIGtleSkgeworICBzdHJpbmcgeDsKKyAgc3RyaW5nIHk7CisgIGlmICghQ3J5cHRvT3BzOjpFeHBvcnRFY1AyNTZLZXkoa2V5LCAmeCwgJnkpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBhdXRvIHJlc3VsdCA9IHVuaXF1ZV9wdHI8RWNQMjU2UHVibGljS2V5PihuZXcgRWNQMjU2UHVibGljS2V5KCkpOworICByZXN1bHQtPnNldF94KHgpOworICByZXN1bHQtPnNldF95KHkpOworICByZXR1cm4gcmVzdWx0OworfQorCit1bmlxdWVfcHRyPFNpbXBsZVJzYVB1YmxpY0tleT4gUHVibGljS2V5UHJvdG9VdGlsOjpFbmNvZGVSc2FQdWJsaWNLZXkoCisgICAgY29uc3QgQ3J5cHRvT3BzOjpQdWJsaWNLZXkmIGtleSkgeworICBzdHJpbmcgbjsKKyAgaW50MzJfdCBlOworICBpZiAoIUNyeXB0b09wczo6RXhwb3J0UnNhMjA0OEtleShrZXksICZuLCAmZSkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGF1dG8gcmVzdWx0ID0gdW5pcXVlX3B0cjxTaW1wbGVSc2FQdWJsaWNLZXk+KG5ldyBTaW1wbGVSc2FQdWJsaWNLZXkoKSk7CisgIHJlc3VsdC0+c2V0X24obik7CisgIHJlc3VsdC0+c2V0X2UoZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpQdWJsaWNLZXk+IFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoCisgICAgY29uc3QgR2VuZXJpY1B1YmxpY0tleSYga2V5KSB7CisgIHN3aXRjaCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgRUNfUDI1NjogeworICAgICAgaWYgKCFrZXkuaGFzX2VjX3AyNTZfcHVibGljX2tleSgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgcmV0dXJuIFBhcnNlRWNQdWJsaWNLZXkoa2V5LmVjX3AyNTZfcHVibGljX2tleSgpKTsKKyAgICB9CisgICAgY2FzZSBSU0EyMDQ4OiB7CisgICAgICBpZiAoIWtleS5oYXNfcnNhMjA0OF9wdWJsaWNfa2V5KCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICByZXR1cm4gUGFyc2VSc2FQdWJsaWNLZXkoa2V5LnJzYTIwNDhfcHVibGljX2tleSgpKTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKK3VuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpQdWJsaWNLZXk+IFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VFY1B1YmxpY0tleSgKKyAgICBjb25zdCBFY1AyNTZQdWJsaWNLZXkmIGtleSkgeworICByZXR1cm4gQ3J5cHRvT3BzOjpJbXBvcnRFY1AyNTZLZXkoa2V5LngoKSwga2V5LnkoKSk7Cit9CisKK3VuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpQdWJsaWNLZXk+IFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VSc2FQdWJsaWNLZXkoCisgICAgY29uc3QgU2ltcGxlUnNhUHVibGljS2V5JiBrZXkpIHsKKyAgcmV0dXJuIENyeXB0b09wczo6SW1wb3J0UnNhMjA0OEtleShrZXkubigpLCBrZXkuZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9yYXdfc2VjdXJlX21lc3NhZ2VfcGFyc2VyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL3Jhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwODhjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9yYXdfc2VjdXJlX21lc3NhZ2VfcGFyc2VyLmNjCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVdGlsaXR5IGNsYXNzIHRvIHBhcnNlIGFuZCB2ZXJpZnkgcmF3IHtAbGluayBTZWN1cmVNZXNzYWdlfSBwcm90b3MuCisvLyBWZXJpZmllcyB0aGUgc2lnbmF0dXJlIG9uIHRoZSBtZXNzYWdlLCBhbmQgZGVjcnlwdHMgInNpZ25jcnlwdGVkIiBtZXNzYWdlcworLy8gKHdoaWxlIHNpbXVsdGFuZW91c2x5IHZlcmlmeWluZyB0aGUgc2lnbmF0dXJlKS4KKy8vCisvLyBAc2VlIFJhd1NlY3VyZU1lc3NhZ2VCdWlsZGVyCisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL3Jhd19zZWN1cmVfbWVzc2FnZV9wYXJzZXIuaCIKKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvdXRpbC5oIgorCit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKKwordW5pcXVlX3B0cjxzdHJpbmc+IFJhd1NlY3VyZU1lc3NhZ2VQYXJzZXI6OlBhcnNlU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZSgKKyAgICBjb25zdCBzdHJpbmcmIHNpZ25hdHVyZSwKKyAgICBjb25zdCBzdHJpbmcmIGhlYWRlcl9hbmRfYm9keSwKKyAgICBjb25zdCBDcnlwdG9PcHM6OktleSYgdmVyaWZpY2F0aW9uX2tleSwKKyAgICBDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBhc3NvY2lhdGVkX2RhdGEpIHsKKworICAvLyBzdXBwcmVzc19hc3NvY2lhdGVkX2RhdGEgaXMgYWx3YXlzIGZhbHNlIHNpZ25lZCBjbGVhcnRleHQKKyAgaWYgKFZlcmlmeUhlYWRlckFuZEJvZHkoc2lnbmF0dXJlLCBoZWFkZXJfYW5kX2JvZHksIHZlcmlmaWNhdGlvbl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ190eXBlLCBDcnlwdG9PcHM6OkVuY1R5cGU6Ok5PTkUsIGFzc29jaWF0ZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgcmV0dXJuIHVuaXF1ZV9wdHI8c3RyaW5nPihuZXcgc3RyaW5nKGhlYWRlcl9hbmRfYm9keSkpOworICB9IGVsc2UgeworICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKK3VuaXF1ZV9wdHI8c3RyaW5nPiBSYXdTZWN1cmVNZXNzYWdlUGFyc2VyOjpQYXJzZVNpZ25DcnlwdGVkTWVzc2FnZSgKKyAgICBjb25zdCBzdHJpbmcmIHNpZ25hdHVyZSwKKyAgICBjb25zdCBzdHJpbmcmIGhlYWRlcl9hbmRfYm9keSwKKyAgICBjb25zdCBDcnlwdG9PcHM6OktleSYgdmVyaWZpY2F0aW9uX2tleSwKKyAgICBDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUsCisgICAgY29uc3QgQ3J5cHRvT3BzOjpTZWNyZXRLZXkmIGRlY3J5cHRpb25fa2V5LAorICAgIENyeXB0b09wczo6RW5jVHlwZSBlbmNfdHlwZSwKKyAgICBjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSkgeworICBpZiAoZW5jX3R5cGUgPT0gQ3J5cHRvT3BzOjpFbmNUeXBlOjpOT05FKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIk5vdCBhIHNpZ25jcnlwdGVkIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgdGFnUmVxdWlyZWQgPSBDcnlwdG9PcHM6OlRhZ2dlZFBsYWludGV4dFJlcXVpcmVkKAorICAgICAgdmVyaWZpY2F0aW9uX2tleSwgc2lnX3R5cGUsIGRlY3J5cHRpb25fa2V5KTsKKyAgaWYgKCFWZXJpZnlIZWFkZXJBbmRCb2R5KHNpZ25hdHVyZSwgaGVhZGVyX2FuZF9ib2R5LCB2ZXJpZmljYXRpb25fa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3R5cGUsIGVuY190eXBlLCBhc3NvY2lhdGVkX2RhdGEsIHRhZ1JlcXVpcmVkKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGhlYWRlciA9CisgICAgICBTZWN1cmVNZXNzYWdlV3JhcHBlcjo6UGFyc2VJbnRlcm5hbEhlYWRlcihoZWFkZXJfYW5kX2JvZHkpOworICB1bmlxdWVfcHRyPHN0cmluZz4gaXYgPQorICAgICAgU2VjdXJlTWVzc2FnZVdyYXBwZXI6OlBhcnNlSGVhZGVySXYoaGVhZGVyX2FuZF9ib2R5KTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGJvZHkgPQorICAgICAgU2VjdXJlTWVzc2FnZVdyYXBwZXI6OlBhcnNlQm9keShoZWFkZXJfYW5kX2JvZHkpOworCisgIGlmIChoZWFkZXIgPT0gbnVsbHB0ciB8fCBpdiA9PSBudWxscHRyIHx8IGJvZHkgPT0gbnVsbHB0cikgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJIZWFkZXIgYW5kIGJvZHkgbWlzc2luZyBzb21lIGZpZWxkcyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IHJhd19kZWNyeXB0ZWRfYm9keSA9CisgICAgICBDcnlwdG9PcHM6OkRlY3J5cHQoZGVjcnlwdGlvbl9rZXksIGVuY190eXBlLCAqaXYsICpib2R5KTsKKworICBpZiAocmF3X2RlY3J5cHRlZF9ib2R5ID09IG51bGxwdHIpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiRmFpbGVkIHRvIGRlY3J5cHQgYm9keSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKCF0YWdSZXF1aXJlZCkgeworICAgIC8vIE5vIHRhZyBleHBlY3RlZCwgc28gd2UncmUgYWxsIGRvbmUKKyAgICByZXR1cm4gU2VjdXJlTWVzc2FnZVdyYXBwZXI6OkJ1aWxkSGVhZGVyQW5kQm9keSgqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyYXdfZGVjcnlwdGVkX2JvZHkpOworICB9CisKKyAgLy8gVmVyaWZ5IHRoZSB0YWcgdGhhdCBiaW5kcyB0aGUgY2lwaGVydGV4dCB0byB0aGUgaGVhZGVyLCBhbmQgcmVtb3ZlIGl0CisgIGJvb2wgYmluZGluZ19pc192ZXJpZmllZCA9IGZhbHNlOworICB1bmlxdWVfcHRyPHN0cmluZz4gZXhwZWN0ZWRfdGFnID0KKyAgICAgIENyeXB0b09wczo6RGlnZXN0KCpoZWFkZXIgKyBhc3NvY2lhdGVkX2RhdGEpOworICBpZiAoZXhwZWN0ZWRfdGFnID09IG51bGxwdHIpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiRXJyb3IgY29tcHV0aW5nIGV4cGVjdGVkIHRhZyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKHJhd19kZWNyeXB0ZWRfYm9keS0+bGVuZ3RoKCkgPj0gQ3J5cHRvT3BzOjprRGlnZXN0TGVuZ3RoKSB7CisgICAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBhY3R1YWxfdGFnID0KKyAgICAgICAgQnl0ZUJ1ZmZlcigqcmF3X2RlY3J5cHRlZF9ib2R5KS5TdWJBcnJheSgwLCBDcnlwdG9PcHM6OmtEaWdlc3RMZW5ndGgpOworCisgICAgaWYgKGFjdHVhbF90YWcgIT0gbnVsbHB0ciAmJiBhY3R1YWxfdGFnLT5FcXVhbHMoQnl0ZUJ1ZmZlcigqZXhwZWN0ZWRfdGFnKSkpIHsKKyAgICAgIGJpbmRpbmdfaXNfdmVyaWZpZWQgPSB0cnVlOworICAgIH0KKyAgfQorICBpZiAoIWJpbmRpbmdfaXNfdmVyaWZpZWQpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiU2lnbmF0dXJlIGV4Y2VwdGlvbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdW5zaWduZWQgaW50IGJvZHlfbGVuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyYXdfZGVjcnlwdGVkX2JvZHktPnNpemUoKSkKKyAgICAgIC0gQ3J5cHRvT3BzOjprRGlnZXN0TGVuZ3RoOworCisgIC8vIFJlbW92ZSB0aGUgdGFnLgorICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGJvZHlfYnl0ZXMgPQorICAgICAgQnl0ZUJ1ZmZlcigqcmF3X2RlY3J5cHRlZF9ib2R5KS5TdWJBcnJheShDcnlwdG9PcHM6OmtEaWdlc3RMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuKTsKKworICBpZiAoYm9keV9ieXRlcyA9PSBudWxscHRyKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkludmFsaWQgYm9keSBsZW5ndGgiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiBTZWN1cmVNZXNzYWdlV3JhcHBlcjo6QnVpbGRIZWFkZXJBbmRCb2R5KCpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfYnl0ZXMtPlN0cmluZygpKTsKK30KKworYm9vbCBSYXdTZWN1cmVNZXNzYWdlUGFyc2VyOjpWZXJpZnlIZWFkZXJBbmRCb2R5KAorICAgIGNvbnN0IHN0cmluZyYgc2lnbmF0dXJlLAorICAgIGNvbnN0IHN0cmluZyYgaGVhZGVyX2FuZF9ib2R5LAorICAgIGNvbnN0IENyeXB0b09wczo6S2V5JiB2ZXJpZmljYXRpb25fa2V5LAorICAgIENyeXB0b09wczo6U2lnVHlwZSBzaWdfdHlwZSwKKyAgICBDcnlwdG9PcHM6OkVuY1R5cGUgZW5jX3R5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBhc3NvY2lhdGVkX2RhdGEsCisgICAgYm9vbCBzdXBwcmVzc19hc3NvY2lhdGVkX2RhdGEgLyogaW4gY2FzZSBpdCBpcyBpbiB0aGUgdGFnIGluc3RlYWQgKi8pIHsKKworICBzdHJpbmcgc2lnbmVkX2RhdGEgPSBoZWFkZXJfYW5kX2JvZHk7CisgIGlmICghc3VwcHJlc3NfYXNzb2NpYXRlZF9kYXRhKSB7CisgICAgc2lnbmVkX2RhdGEuYXBwZW5kKGFzc29jaWF0ZWRfZGF0YSk7CisgIH0KKyAgYm9vbCB2ZXJpZmllZCA9CisgICAgICBDcnlwdG9PcHM6OlZlcmlmeShzaWdfdHlwZSwgdmVyaWZpY2F0aW9uX2tleSwgc2lnbmF0dXJlLCBzaWduZWRfZGF0YSk7CisKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGhlYWRlciA9CisgICAgICBTZWN1cmVNZXNzYWdlV3JhcHBlcjo6UGFyc2VIZWFkZXIoaGVhZGVyX2FuZF9ib2R5KTsKKworICBpZiAoaGVhZGVyID09IG51bGxwdHIpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigibWVzc2FnZSBtdXN0IGhhdmUgaGVhZGVyIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBEb2VzIG5vdCByZXR1cm4gZWFybHkgaW4gb3JkZXIgdG8gYXZvaWQgdGltaW5nIGF0dGFja3MKKyAgdmVyaWZpZWQgJj0gU2VjdXJlTWVzc2FnZVdyYXBwZXI6OkdldFNpZ1NjaGVtZShzaWdfdHlwZSkgPT0KKyAgICAgICAgICAgICAgU2VjdXJlTWVzc2FnZVdyYXBwZXI6OkdldFNpZ25hdHVyZVNjaGVtZSgqaGVhZGVyKTsKKyAgdmVyaWZpZWQgJj0gU2VjdXJlTWVzc2FnZVdyYXBwZXI6OkdldEVuY1NjaGVtZShlbmNfdHlwZSkgPT0KKyAgICAgICAgICAgICAgU2VjdXJlTWVzc2FnZVdyYXBwZXI6OkdldEVuY3J5cHRpb25TY2hlbWUoKmhlYWRlcik7CisgIHZlcmlmaWVkICY9IGFzc29jaWF0ZWRfZGF0YS5sZW5ndGgoKSA9PQorICAgICAgICAgICAgICBTZWN1cmVNZXNzYWdlV3JhcHBlcjo6R2V0QXNzb2NpYXRlZERhdGFMZW5ndGgoKmhlYWRlcik7CisKKyAgLy8gQ2hlY2sgdGhhdCBlaXRoZXIgYSBkZWNyeXB0aW9uIG9wZXJhdGlvbiBpcyBleHBlY3RlZCwgb3Igbm8gRGVjcnlwdGlvbktleUlkCisgIC8vIGlzIHNldC4KKyAgdmVyaWZpZWQgJj0gZW5jX3R5cGUgIT0gQ3J5cHRvT3BzOjpFbmNUeXBlOjpOT05FIHx8CisgICAgICAgICAgICAgICFTZWN1cmVNZXNzYWdlV3JhcHBlcjo6SGFzRGVjcnlwdGlvbktleUlkKCpoZWFkZXIpOworCisgIC8vIElmIGVuY3J5cHRpb24gd2FzIHVzZWQsIGNoZWNrIHRoYXQgZWl0aGVyIHdlIGFyZSBub3QgdXNpbmcgYSBwdWJsaWMga2V5CisgIC8vIHNpZ25hdHVyZSBvciBhIFZlcmlmaWNhdGlvbktleUlkIHdhcyBzZXQgKGFzIGlzIHJlcXVpcmVkIGZvciBwdWJsaWMga2V5CisgIC8vIGJhc2VkIHNpZ25hdHVyZSArIGVuY3J5cHRpb24pLgorICB2ZXJpZmllZCAmPSBlbmNfdHlwZSAhPSBDcnlwdG9PcHM6OkVuY1R5cGU6Ok5PTkUgfHwKKyAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpJc1B1YmxpY0tleVNjaGVtZShzaWdfdHlwZSkgfHwKKyAgICAgICAgICAgICAgIVNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpIYXNWZXJpZmljYXRpb25LZXlJZCgqaGVhZGVyKTsKKworICByZXR1cm4gdmVyaWZpZWQ7Cit9CisKKy8vIENvbnN0cnVjdG9yIGFuZCBEZXN0cnVjdG9yIGFyZSBuZXZlciB1c2VkCitSYXdTZWN1cmVNZXNzYWdlUGFyc2VyOjpSYXdTZWN1cmVNZXNzYWdlUGFyc2VyKCkge30KK1Jhd1NlY3VyZU1lc3NhZ2VQYXJzZXI6On5SYXdTZWN1cmVNZXNzYWdlUGFyc2VyKCkge30KKworfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9idWlsZGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX2J1aWxkZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1MTNjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9idWlsZGVyLmNjCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9idWlsZGVyLmgiCisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL3V0aWwuaCIKKwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOworCituYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZSB7CisKK1NlY3VyZU1lc3NhZ2VCdWlsZGVyOjpTZWN1cmVNZXNzYWdlQnVpbGRlcigpIHsKKyAgUmVzZXQoKTsKK30KKworU2VjdXJlTWVzc2FnZUJ1aWxkZXI6On5TZWN1cmVNZXNzYWdlQnVpbGRlcigpIHt9CisKK1NlY3VyZU1lc3NhZ2VCdWlsZGVyKiBTZWN1cmVNZXNzYWdlQnVpbGRlcjo6UmVzZXQoKSB7CisgIHB1YmxpY19tZXRhZGF0YV8gPSBudWxscHRyOworICBkZWNyeXB0aW9uX2tleV9pZF8gPSBudWxscHRyOworICB2ZXJpZmljYXRpb25fa2V5X2lkXyA9IG51bGxwdHI7CisgIGFzc29jaWF0ZWRfZGF0YV8gPSBudWxscHRyOworICByZXR1cm4gdGhpczsKK30KKworU2VjdXJlTWVzc2FnZUJ1aWxkZXIqIFNlY3VyZU1lc3NhZ2VCdWlsZGVyOjpTZXRQdWJsaWNNZXRhZGF0YSgKKyAgICBjb25zdCBzdHJpbmcmIHB1YmxpY19tZXRhZGF0YSkgeworICBwdWJsaWNfbWV0YWRhdGFfID0gdW5pcXVlX3B0cjxCeXRlQnVmZmVyPihuZXcgQnl0ZUJ1ZmZlcihwdWJsaWNfbWV0YWRhdGEpKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK1NlY3VyZU1lc3NhZ2VCdWlsZGVyKiBTZWN1cmVNZXNzYWdlQnVpbGRlcjo6U2V0VmVyaWZpY2F0aW9uS2V5SWQoCisgICAgY29uc3Qgc3RyaW5nJiB2ZXJpZmljYXRpb25fa2V5X2lkKSB7CisgIHZlcmlmaWNhdGlvbl9rZXlfaWRfID0KKyAgICAgIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4obmV3IEJ5dGVCdWZmZXIodmVyaWZpY2F0aW9uX2tleV9pZCkpOworICByZXR1cm4gdGhpczsKK30KKworU2VjdXJlTWVzc2FnZUJ1aWxkZXIqIFNlY3VyZU1lc3NhZ2VCdWlsZGVyOjpTZXREZWNyeXB0aW9uS2V5SWQoCisgICAgY29uc3Qgc3RyaW5nJiBkZWNyeXB0aW9uX2tleV9pZCkgeworICBkZWNyeXB0aW9uX2tleV9pZF8gPQorICAgICAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPihuZXcgQnl0ZUJ1ZmZlcihkZWNyeXB0aW9uX2tleV9pZCkpOworICByZXR1cm4gdGhpczsKK30KKworU2VjdXJlTWVzc2FnZUJ1aWxkZXIqIFNlY3VyZU1lc3NhZ2VCdWlsZGVyOjpTZXRBc3NvY2lhdGVkRGF0YSgKKyAgICBjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSkgeworICBpZiAoYXNzb2NpYXRlZF9kYXRhLmxlbmd0aCgpID4gMCkgeworICAgIGFzc29jaWF0ZWRfZGF0YV8gPSB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+KG5ldyBCeXRlQnVmZmVyKGFzc29jaWF0ZWRfZGF0YSkpOworICB9IGVsc2UgeworICAgIGFzc29jaWF0ZWRfZGF0YV8gPSBudWxscHRyOworICB9CisgIHJldHVybiB0aGlzOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8U2VjdXJlTWVzc2FnZT4KK1NlY3VyZU1lc3NhZ2VCdWlsZGVyOjpCdWlsZFNpZ25lZENsZWFydGV4dE1lc3NhZ2UoCisgICAgY29uc3QgQ3J5cHRvT3BzOjpLZXkmIHNpZ25pbmdfa2V5LCBDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBib2R5KSB7CisKKyAgaWYgKGJvZHkubGVuZ3RoKCkgPT0gMCkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDYW5ub3QgYnVpbGQgYSBzZWN1cmUgbWVzc2FnZSB3aXRoIGFuIGVtcHR5IGJvZHkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGlmIChkZWNyeXB0aW9uX2tleV9pZF8gIT0gbnVsbHB0cikgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDYW5ub3Qgc2V0IGRlY3J5cHRpb24ga2V5IGlkIGZvciBhIGNsZWFydGV4dCBtZXNzYWdlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBCeXRlQnVmZmVyIGFzc29jaWF0ZWRfZGF0YTsKKyAgaWYgKGFzc29jaWF0ZWRfZGF0YV8gIT0gbnVsbHB0cikgeworICAgIGFzc29jaWF0ZWRfZGF0YSA9ICphc3NvY2lhdGVkX2RhdGFfOworICB9CisKKyAgdW5pcXVlX3B0cjxIZWFkZXI+IGhlYWRlciA9CisgICAgICBCdWlsZEhlYWRlcihzaWdfdHlwZSwgQ3J5cHRvT3BzOjpFbmNUeXBlOjpOT05FLCBudWxscHRyKTsKKworICBCeXRlQnVmZmVyIGhlYWRlcl9hbmRfYm9keSA9CisgICAgICBTZXJpYWxpemVIZWFkZXJBbmRCb2R5KGhlYWRlci0+U2VyaWFsaXplQXNTdHJpbmcoKSwgYm9keSk7CisKKyAgcmV0dXJuIENyZWF0ZVNpZ25lZFJlc3VsdChzaWduaW5nX2tleSwgc2lnX3R5cGUsIGhlYWRlcl9hbmRfYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkX2RhdGEpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8U2VjdXJlTWVzc2FnZT4gU2VjdXJlTWVzc2FnZUJ1aWxkZXI6OkJ1aWxkU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgIGNvbnN0IENyeXB0b09wczo6S2V5JiBzaWduaW5nX2tleSwgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLAorICAgIGNvbnN0IENyeXB0b09wczo6U2VjcmV0S2V5JiBlbmNyeXB0aW9uX2tleSwgQ3J5cHRvT3BzOjpFbmNUeXBlIGVuY190eXBlLAorICAgIGNvbnN0IHN0cmluZyYgYm9keSkgeworCisgIGlmIChib2R5Lmxlbmd0aCgpID09IDApIHsKKyAgICBVdGlsOjpMb2dFcnJvcigiQ2Fubm90IGJ1aWxkIGEgc2VjdXJlIG1lc3NhZ2Ugd2l0aCBhbiBlbXB0eSBib2R5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAoZW5jX3R5cGUgPT0gQ3J5cHRvT3BzOjpFbmNUeXBlOjpOT05FKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIk5PTkUgdHlwZSBub3Qgc3VwcG9ydGVkIGZvciBlbmNyeXB0ZWQgbWVzc2FnZXMiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGlmIChDcnlwdG9PcHM6OklzUHVibGljS2V5U2NoZW1lKHNpZ190eXBlKSAmJgorICAgICAgdmVyaWZpY2F0aW9uX2tleV9pZF8gPT0gbnVsbHB0cikgeworICAgIFV0aWw6OkxvZ0Vycm9yKAorICAgICAgICAiTXVzdCBzZXQgYSB2ZXJpZmljYXRpb24ga2V5IGlkIHdoZW4gdXNpbmcgcHVibGljIGtleSBzaWduYXR1cmUiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHVuaXF1ZV9wdHI8c3RyaW5nPiBpdiA9IENyeXB0b09wczo6R2VuZXJhdGVJdihlbmNfdHlwZSk7CisgIGlmIChpdiA9PSBudWxscHRyKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkNvdWxkIG5vdCBnZW5lcmF0ZSBJViBmb3IgZ2l2ZW4gZW5jcnlwdGlvbiB0eXBlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1bmlxdWVfcHRyPEhlYWRlcj4gaGVhZGVyID0gQnVpbGRIZWFkZXIoc2lnX3R5cGUsIGVuY190eXBlLCBpdik7CisgIGlmIChoZWFkZXIgPT0gbnVsbHB0cikgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDb3VsZCBub3QgYnVpbGQgaGVhZGVyIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBXZSBtYXkgb3IgbWF5IG5vdCBuZWVkIGFuIGV4dHJhIHRhZyBpbiBmcm9udCBvZiB0aGUgcGxhaW50ZXh0IGJvZHkKKyAgQnl0ZUJ1ZmZlciB0YWdnZWRfYm9keTsKKyAgQnl0ZUJ1ZmZlciBhc3NvY2lhdGVkX2RhdGFfdG9fYmVfc2lnbmVkOworICBzdHJpbmcgaGVhZGVyX2J5dGVzID0gaGVhZGVyLT5TZXJpYWxpemVBc1N0cmluZygpOworCisgIGlmIChDcnlwdG9PcHM6OlRhZ2dlZFBsYWludGV4dFJlcXVpcmVkKHNpZ25pbmdfa2V5LCBzaWdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbl9rZXkpKSB7CisgICAgLy8gUGxhY2UgYSAidGFnIiBpbiBmcm9udCBvZiB0aGUgdGhlIHBsYWludGV4dCBtZXNzYWdlIGNvbnRhaW5pbmcgYQorICAgIC8vIGRpZ2VzdCBvZiB0aGUgaGVhZGVyCisgICAgc3RyaW5nIHRvX2RpZ2VzdCA9IGhlYWRlcl9ieXRlczsKKyAgICBpZiAoYXNzb2NpYXRlZF9kYXRhXyAhPSBudWxscHRyKSB7CisgICAgICB0b19kaWdlc3QgKz0gYXNzb2NpYXRlZF9kYXRhXy0+U3RyaW5nKCk7CisgICAgfQorCisgICAgdW5pcXVlX3B0cjxzdHJpbmc+IGRpZ2VzdCA9IENyeXB0b09wczo6RGlnZXN0KHRvX2RpZ2VzdCk7CisgICAgaWYgKGRpZ2VzdCA9PSBudWxscHRyKSB7CisgICAgICBVdGlsOjpMb2dFcnJvcigiRXJyb3IgY29tcHV0aW5nIGRpZ2VzdCIpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdGFnZ2VkX2JvZHkgPSBCeXRlQnVmZmVyOjpDb25jYXQoCisgICAgICAgIEJ5dGVCdWZmZXIoKmRpZ2VzdCksCisgICAgICAgIEJ5dGVCdWZmZXIoYm9keSkpOworICB9IGVsc2UgeworICAgIHRhZ2dlZF9ib2R5ID0gQnl0ZUJ1ZmZlcihib2R5KTsKKworICAgIGlmIChhc3NvY2lhdGVkX2RhdGFfICE9IG51bGxwdHIpIHsKKyAgICAgIGFzc29jaWF0ZWRfZGF0YV90b19iZV9zaWduZWQgPSAqYXNzb2NpYXRlZF9kYXRhXzsKKyAgICB9CisgIH0KKworICAvLyBDb21wdXRlIHRoZSBlbmNyeXB0ZWQgYm9keSwgd2hpY2ggYmluZHMgdGhlIHRhZyB0byB0aGUgbWVzc2FnZSBpbnNpZGUgdGhlCisgIC8vIGNpcGhlcnRleHQKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGVuY3J5cHRlZF9ib2R5ID0KKyAgICAgIENyeXB0b09wczo6RW5jcnlwdChlbmNyeXB0aW9uX2tleSwgZW5jX3R5cGUsICppdiwgdGFnZ2VkX2JvZHkuU3RyaW5nKCkpOworICBpZiAoZW5jcnlwdGVkX2JvZHkgPT0gbnVsbHB0cikgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJDb3VsZCBub3QgZW5jcnlwdCBib2R5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBCeXRlQnVmZmVyIGhlYWRlcl9hbmRfYm9keSA9CisgICAgICBTZXJpYWxpemVIZWFkZXJBbmRCb2R5KGhlYWRlcl9ieXRlcywgKmVuY3J5cHRlZF9ib2R5KTsKKworICByZXR1cm4gQ3JlYXRlU2lnbmVkUmVzdWx0KHNpZ25pbmdfa2V5LCBzaWdfdHlwZSwgaGVhZGVyX2FuZF9ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWRfZGF0YV90b19iZV9zaWduZWQpOworfQorCit1bmlxdWVfcHRyPEhlYWRlcj4gU2VjdXJlTWVzc2FnZUJ1aWxkZXI6OkJ1aWxkSGVhZGVyKAorICAgIENyeXB0b09wczo6U2lnVHlwZSBzaWdfdHlwZSwgQ3J5cHRvT3BzOjpFbmNUeXBlIGVuY190eXBlLAorICAgIGNvbnN0IHVuaXF1ZV9wdHI8c3RyaW5nPiYgaXYpIHsKKyAgaW50IHNpZ19zY2hlbWUgPSBTZWN1cmVNZXNzYWdlV3JhcHBlcjo6R2V0U2lnU2NoZW1lKHNpZ190eXBlKTsKKyAgaW50IGVuY19zY2hlbWUgPSBTZWN1cmVNZXNzYWdlV3JhcHBlcjo6R2V0RW5jU2NoZW1lKGVuY190eXBlKTsKKyAgaWYgKCFzaWdfc2NoZW1lIHx8ICFlbmNfc2NoZW1lKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB1bmlxdWVfcHRyPEhlYWRlcj4gcmVzdWx0KG5ldyBIZWFkZXIoKSk7CisgIHJlc3VsdC0+c2V0X3NpZ25hdHVyZV9zY2hlbWUoc3RhdGljX2Nhc3Q8U2lnU2NoZW1lPihzaWdfc2NoZW1lKSk7CisgIHJlc3VsdC0+c2V0X2VuY3J5cHRpb25fc2NoZW1lKHN0YXRpY19jYXN0PEVuY1NjaGVtZT4oZW5jX3NjaGVtZSkpOworCisgIC8vIElmIHdlIG5lZWQgdG8sIHNldCB0aGUgcmVzdAorICBpZiAodmVyaWZpY2F0aW9uX2tleV9pZF8gIT0gbnVsbHB0cikgeworICAgIHJlc3VsdC0+c2V0X3ZlcmlmaWNhdGlvbl9rZXlfaWQodmVyaWZpY2F0aW9uX2tleV9pZF8tPkltbXV0YWJsZVVJbnQ4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fa2V5X2lkXy0+c2l6ZSgpKTsKKyAgfQorICBpZiAoZGVjcnlwdGlvbl9rZXlfaWRfICE9IG51bGxwdHIpIHsKKyAgICByZXN1bHQtPnNldF9kZWNyeXB0aW9uX2tleV9pZChkZWNyeXB0aW9uX2tleV9pZF8tPkltbXV0YWJsZVVJbnQ4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGlvbl9rZXlfaWRfLT5zaXplKCkpOworICB9CisgIGlmIChwdWJsaWNfbWV0YWRhdGFfICE9IG51bGxwdHIpIHsKKyAgICByZXN1bHQtPnNldF9wdWJsaWNfbWV0YWRhdGEocHVibGljX21ldGFkYXRhXy0+SW1tdXRhYmxlVUludDgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX21ldGFkYXRhXy0+c2l6ZSgpKTsKKyAgfQorICBpZiAoYXNzb2NpYXRlZF9kYXRhXyAhPSBudWxscHRyKSB7CisgICAgcmVzdWx0LT5zZXRfYXNzb2NpYXRlZF9kYXRhX2xlbmd0aChhc3NvY2lhdGVkX2RhdGFfLT5zaXplKCkpOworICB9CisgIGlmIChpdiAhPSBudWxscHRyKSB7CisgICAgcmVzdWx0LT5zZXRfaXYoKml2KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0J5dGVCdWZmZXIgU2VjdXJlTWVzc2FnZUJ1aWxkZXI6OlNlcmlhbGl6ZUhlYWRlckFuZEJvZHkoY29uc3Qgc3RyaW5nJiBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgYm9keSkgeworICBIZWFkZXJBbmRCb2R5SW50ZXJuYWwgaGVhZGVyX2FuZF9ib2R5X2ludGVybmFsOworICBoZWFkZXJfYW5kX2JvZHlfaW50ZXJuYWwuc2V0X2hlYWRlcihoZWFkZXIpOworICBoZWFkZXJfYW5kX2JvZHlfaW50ZXJuYWwuc2V0X2JvZHkoYm9keSk7CisKKyAgcmV0dXJuIEJ5dGVCdWZmZXIoaGVhZGVyX2FuZF9ib2R5X2ludGVybmFsLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8U2VjdXJlTWVzc2FnZT4gU2VjdXJlTWVzc2FnZUJ1aWxkZXI6OkNyZWF0ZVNpZ25lZFJlc3VsdCgKKyAgICBjb25zdCBDcnlwdG9PcHM6OktleSYgc2lnbmluZ19rZXksIGNvbnN0IENyeXB0b09wczo6U2lnVHlwZSYgc2lnX3R5cGUsCisgICAgY29uc3QgQnl0ZUJ1ZmZlciYgaGVhZGVyX2FuZF9ib2R5LCBjb25zdCBCeXRlQnVmZmVyJiBhc3NvY2lhdGVkX2RhdGEpIHsKKyAgQnl0ZUJ1ZmZlciBoZWFkZXJfYW5kX2JvZHlfd2l0aF9hc3NvY2lhdGVkX2RhdGEgPQorICAgICAgQnl0ZUJ1ZmZlcjo6Q29uY2F0KGhlYWRlcl9hbmRfYm9keSwgYXNzb2NpYXRlZF9kYXRhKTsKKworICB1bmlxdWVfcHRyPHN0cmluZz4gc2lnbmF0dXJlID0KKyAgICAgIENyeXB0b09wczo6U2lnbihzaWdfdHlwZSwgc2lnbmluZ19rZXksCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2FuZF9ib2R5X3dpdGhfYXNzb2NpYXRlZF9kYXRhLlN0cmluZygpKTsKKworICAvLyBSZXR1cm4gbnVsbHB0ciBpZiBhbiBlcnJvciBvY2N1cnJlZAorICBpZiAoc2lnbmF0dXJlID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHVuaXF1ZV9wdHI8U2VjdXJlTWVzc2FnZT4gcmVzdWx0KG5ldyBTZWN1cmVNZXNzYWdlKCkpOworICByZXN1bHQtPnNldF9oZWFkZXJfYW5kX2JvZHkoaGVhZGVyX2FuZF9ib2R5LlN0cmluZygpKTsKKyAgcmVzdWx0LT5zZXRfc2lnbmF0dXJlKCpzaWduYXR1cmUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2VfcGFyc2VyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3BhcnNlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNhN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3BhcnNlci5jYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVXRpbGl0eSBjbGFzcyB0byBwYXJzZSBhbmQgdmVyaWZ5IHtAbGluayBTZWN1cmVNZXNzYWdlfSBwcm90b3MuIFZlcmlmaWVzIHRoZQorLy8gc2lnbmF0dXJlIG9uIHRoZSBtZXNzYWdlLCBhbmQgZGVjcnlwdHMgInNpZ25jcnlwdGVkIiBtZXNzYWdlcyAod2hpbGUKKy8vIHNpbXVsdGFuZW91c2x5IHZlcmlmeWluZyB0aGUgc2lnbmF0dXJlKS4KKy8vCisvLyBAc2VlIFNlY3VyZU1lc3NhZ2VCdWlsZGVyCisKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3BhcnNlci5oIgorCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9yYXdfc2VjdXJlX21lc3NhZ2VfcGFyc2VyLmgiCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS91dGlsLmgiCisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKKworc3RkOjp1bmlxdWVfcHRyPEhlYWRlcj4gU2VjdXJlTWVzc2FnZVBhcnNlcjo6R2V0VW52ZXJpZmllZEhlYWRlcigKKyAgICBjb25zdCBTZWN1cmVNZXNzYWdlJiBzZWNtc2cpIHsKKyAgaWYgKCFzZWNtc2cuaGFzX2hlYWRlcl9hbmRfYm9keSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIm1lc3NhZ2UgbXVzdCBoYXZlIGhlYWRlciBhbmQgYm9keSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgSGVhZGVyQW5kQm9keSBoZWFkZXJfYW5kX2JvZHk7CisgIGlmICghaGVhZGVyX2FuZF9ib2R5LlBhcnNlRnJvbVN0cmluZyhzZWNtc2cuaGVhZGVyX2FuZF9ib2R5KCkpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkludmFsaWQgaGVhZGVyIGFuZCBib2R5IHN0cmluZyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmICghaGVhZGVyX2FuZF9ib2R5LklzSW5pdGlhbGl6ZWQoKSB8fCAhaGVhZGVyX2FuZF9ib2R5Lmhhc19oZWFkZXIoKSkgeworICAgIFV0aWw6OkxvZ0Vycm9yKCJIZWFkZXIgbWlzc2luZyBmcm9tIGhlYWRlciBhbmQgYm9keSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxIZWFkZXI+IGhlYWRlcihuZXcgSGVhZGVyKGhlYWRlcl9hbmRfYm9keS5oZWFkZXIoKSkpOworCisgIGlmICghaGVhZGVyLT5oYXNfc2lnbmF0dXJlX3NjaGVtZSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkhlYWRlciBtdXN0IGhhdmUgYSB2YWxpZCBzaWduYXR1cmUgc2NoZW1lIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFoZWFkZXItPmhhc19lbmNyeXB0aW9uX3NjaGVtZSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIkhlYWRlciBtdXN0IGhhdmUgYSB2YWxpZCBlbmNyeXB0aW9uIHNjaGVtZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIGhlYWRlcjsKK30KKworc3RkOjp1bmlxdWVfcHRyPEhlYWRlckFuZEJvZHk+IFNlY3VyZU1lc3NhZ2VQYXJzZXI6OlBhcnNlU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZSgKKyAgICBjb25zdCBTZWN1cmVNZXNzYWdlJiBzZWNtc2csIGNvbnN0IENyeXB0b09wczo6S2V5JiB2ZXJpZmljYXRpb25fa2V5LAorICAgIENyeXB0b09wczo6U2lnVHlwZSBzaWdfdHlwZSkgeworICAvLyBhc3NvY2lhdGVkX2RhdGEgaXMgbm90IHVzZWQgaGVyZSwgc28gd2UgcGFzcyBpbiBhbiBlbXB0eSBzdHJpbmcKKyAgcmV0dXJuIFBhcnNlU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZShzZWNtc2csIHZlcmlmaWNhdGlvbl9rZXksIHNpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygpKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEhlYWRlckFuZEJvZHk+IFNlY3VyZU1lc3NhZ2VQYXJzZXI6OlBhcnNlU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZSgKKyAgICAgICAgY29uc3QgU2VjdXJlTWVzc2FnZSYgc2VjbXNnLCBjb25zdCBDcnlwdG9PcHM6OktleSYgdmVyaWZpY2F0aW9uX2tleSwKKyAgICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLCBjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSkgeworICBpZiAoIXNlY21zZy5oYXNfaGVhZGVyX2FuZF9ib2R5KCkpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigibWVzc2FnZSBtdXN0IGhhdmUgaGVhZGVyIGFuZCBib2R5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFzZWNtc2cuaGFzX3NpZ25hdHVyZSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIm1lc3NhZ2UgbXVzdCBoYXZlIHNpZ25hdHVyZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IGhlYWRlcl9hbmRfYm9keV9ieXRlcyA9CisgICAgICBSYXdTZWN1cmVNZXNzYWdlUGFyc2VyOjpQYXJzZVNpZ25lZENsZWFydGV4dE1lc3NhZ2UoCisgICAgICAgICAgc2VjbXNnLnNpZ25hdHVyZSgpLCBzZWNtc2cuaGVhZGVyX2FuZF9ib2R5KCksCisgICAgICAgICAgdmVyaWZpY2F0aW9uX2tleSwgc2lnX3R5cGUsIGFzc29jaWF0ZWRfZGF0YSk7CisKKyAgaWYgKGhlYWRlcl9hbmRfYm9keV9ieXRlcyAhPSBudWxscHRyKSB7CisgICAgSGVhZGVyQW5kQm9keSAqaGVhZGVyX2FuZF9ib2R5ID0gbmV3IEhlYWRlckFuZEJvZHkoKTsKKyAgICBoZWFkZXJfYW5kX2JvZHktPlBhcnNlRnJvbVN0cmluZygqaGVhZGVyX2FuZF9ib2R5X2J5dGVzKTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEhlYWRlckFuZEJvZHk+KGhlYWRlcl9hbmRfYm9keSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEhlYWRlckFuZEJvZHk+IFNlY3VyZU1lc3NhZ2VQYXJzZXI6OlBhcnNlU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgIGNvbnN0IFNlY3VyZU1lc3NhZ2UmIHNlY21zZywgY29uc3QgQ3J5cHRvT3BzOjpLZXkmIHZlcmlmaWNhdGlvbl9rZXksCisgICAgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLCBjb25zdCBDcnlwdG9PcHM6OlNlY3JldEtleSYgZGVjcnlwdGlvbl9rZXksCisgICAgQ3J5cHRvT3BzOjpFbmNUeXBlIGVuY190eXBlLCBjb25zdCBzdHJpbmcmIGFzc29jaWF0ZWRfZGF0YSkgeworICBpZiAoIXNlY21zZy5oYXNfaGVhZGVyX2FuZF9ib2R5KCkpIHsKKyAgICBVdGlsOjpMb2dFcnJvcigibWVzc2FnZSBtdXN0IGhhdmUgaGVhZGVyIGFuZCBib2R5Iik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFzZWNtc2cuaGFzX3NpZ25hdHVyZSgpKSB7CisgICAgVXRpbDo6TG9nRXJyb3IoIm1lc3NhZ2UgbXVzdCBoYXZlIHNpZ25hdHVyZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4gaGVhZGVyX2FuZF9ib2R5X2J5dGVzID0KKyAgICAgIFJhd1NlY3VyZU1lc3NhZ2VQYXJzZXI6OlBhcnNlU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgICAgICAgIHNlY21zZy5zaWduYXR1cmUoKSwgc2VjbXNnLmhlYWRlcl9hbmRfYm9keSgpLAorICAgICAgICAgIHZlcmlmaWNhdGlvbl9rZXksIHNpZ190eXBlLCBkZWNyeXB0aW9uX2tleSwgZW5jX3R5cGUsCisgICAgICAgICAgYXNzb2NpYXRlZF9kYXRhKTsKKworICBpZiAoaGVhZGVyX2FuZF9ib2R5X2J5dGVzICE9IG51bGxwdHIpIHsKKyAgICBIZWFkZXJBbmRCb2R5ICpoZWFkZXJfYW5kX2JvZHkgPSBuZXcgSGVhZGVyQW5kQm9keSgpOworICAgIGhlYWRlcl9hbmRfYm9keS0+UGFyc2VGcm9tU3RyaW5nKCpoZWFkZXJfYW5kX2JvZHlfYnl0ZXMpOworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8SGVhZGVyQW5kQm9keT4oaGVhZGVyX2FuZF9ib2R5KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCisvLyBDb25zdHJ1Y3RvciBhbmQgRGVzdHJ1Y3RvciBhcmUgbmV2ZXIgdXNlZAorU2VjdXJlTWVzc2FnZVBhcnNlcjo6U2VjdXJlTWVzc2FnZVBhcnNlcigpIHt9CitTZWN1cmVNZXNzYWdlUGFyc2VyOjp+U2VjdXJlTWVzc2FnZVBhcnNlcigpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC9zcmMvc2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV93cmFwcGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDAxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5jYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2Uvc2VjdXJlX21lc3NhZ2Vfd3JhcHBlci5oIgorCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS5wYi5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvdXRpbC5oIgorCituYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZSB7CisKK3N0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpQYXJzZUhlYWRlckl2KAorICAgIGNvbnN0IHN0cmluZyYgaGVhZGVyX2FuZF9ib2R5X2J5dGVzKSB7CisgIEhlYWRlckFuZEJvZHkgaGVhZGVyX2FuZF9ib2R5OworICBoZWFkZXJfYW5kX2JvZHkuUGFyc2VGcm9tU3RyaW5nKGhlYWRlcl9hbmRfYm9keV9ieXRlcyk7CisgIGlmIChoZWFkZXJfYW5kX2JvZHkuaGFzX2hlYWRlcigpICYmIGhlYWRlcl9hbmRfYm9keS5oZWFkZXIoKS5oYXNfaXYoKSkgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPihuZXcgc3RyaW5nKAorICAgICAgICBoZWFkZXJfYW5kX2JvZHkuaGVhZGVyKCkuaXYoKSkpOworICB9IGVsc2UgeworICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpQYXJzZUhlYWRlcigKKyAgICBjb25zdCBzdHJpbmcmIGhlYWRlcl9hbmRfYm9keV9ieXRlcykgeworICBIZWFkZXJBbmRCb2R5IGhlYWRlcl9hbmRfYm9keTsKKyAgaGVhZGVyX2FuZF9ib2R5LlBhcnNlRnJvbVN0cmluZyhoZWFkZXJfYW5kX2JvZHlfYnl0ZXMpOworICBpZiAoaGVhZGVyX2FuZF9ib2R5Lmhhc19oZWFkZXIoKSkgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPihuZXcgc3RyaW5nKAorICAgICAgICBoZWFkZXJfYW5kX2JvZHkuaGVhZGVyKCkuU2VyaWFsaXplQXNTdHJpbmcoKSkpOworICB9IGVsc2UgeworICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpQYXJzZUludGVybmFsSGVhZGVyKAorICAgIGNvbnN0IHN0cmluZyYgaGVhZGVyX2FuZF9ib2R5X2J5dGVzKSB7CisgIEhlYWRlckFuZEJvZHlJbnRlcm5hbCBoZWFkZXJfYW5kX2JvZHk7CisgIGhlYWRlcl9hbmRfYm9keS5QYXJzZUZyb21TdHJpbmcoaGVhZGVyX2FuZF9ib2R5X2J5dGVzKTsKKyAgaWYgKGhlYWRlcl9hbmRfYm9keS5oYXNfaGVhZGVyKCkpIHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4oCisgICAgICAgIG5ldyBzdHJpbmcoaGVhZGVyX2FuZF9ib2R5LmhlYWRlcigpKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4gU2VjdXJlTWVzc2FnZVdyYXBwZXI6OlBhcnNlQm9keSgKKyAgICBjb25zdCBzdHJpbmcmIGhlYWRlcl9hbmRfYm9keV9ieXRlcykgeworICBIZWFkZXJBbmRCb2R5IGhlYWRlcl9hbmRfYm9keTsKKyAgaGVhZGVyX2FuZF9ib2R5LlBhcnNlRnJvbVN0cmluZyhoZWFkZXJfYW5kX2JvZHlfYnl0ZXMpOworICBpZiAoaGVhZGVyX2FuZF9ib2R5Lmhhc19ib2R5KCkpIHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPHN0cmluZz4obmV3IHN0cmluZygKKyAgICAgICAgaGVhZGVyX2FuZF9ib2R5LmJvZHkoKSkpOworICB9IGVsc2UgeworICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxzdHJpbmc+IFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpCdWlsZEhlYWRlckFuZEJvZHkoCisgICAgY29uc3Qgc3RyaW5nJiBoZWFkZXJfYnl0ZXMsIGNvbnN0IHN0cmluZyYgYm9keV9ieXRlcykgeworICBIZWFkZXJBbmRCb2R5IGhlYWRlcl9hbmRfYm9keTsKKyAgSGVhZGVyKiBoZWFkZXIgPSBoZWFkZXJfYW5kX2JvZHkubXV0YWJsZV9oZWFkZXIoKTsKKyAgaGVhZGVyLT5QYXJzZUZyb21TdHJpbmcoaGVhZGVyX2J5dGVzKTsKKyAgaGVhZGVyX2FuZF9ib2R5LnNldF9ib2R5KGJvZHlfYnl0ZXMpOworCisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8c3RyaW5nPihuZXcgc3RyaW5nKAorICAgICAgaGVhZGVyX2FuZF9ib2R5LlNlcmlhbGl6ZUFzU3RyaW5nKCkpKTsKK30KKworaW50IFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpHZXRTaWduYXR1cmVTY2hlbWUoY29uc3Qgc3RyaW5nJiBoZWFkZXJfYnl0ZXMpIHsKKyAgSGVhZGVyIGhlYWRlcjsKKyAgaGVhZGVyLlBhcnNlRnJvbVN0cmluZyhoZWFkZXJfYnl0ZXMpOworICByZXR1cm4gaGVhZGVyLnNpZ25hdHVyZV9zY2hlbWUoKTsKK30KKworaW50IFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpHZXRFbmNyeXB0aW9uU2NoZW1lKGNvbnN0IHN0cmluZyYgaGVhZGVyX2J5dGVzKSB7CisgIEhlYWRlciBoZWFkZXI7CisgIGhlYWRlci5QYXJzZUZyb21TdHJpbmcoaGVhZGVyX2J5dGVzKTsKKyAgcmV0dXJuIGhlYWRlci5lbmNyeXB0aW9uX3NjaGVtZSgpOworfQorCitib29sIFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpIYXNEZWNyeXB0aW9uS2V5SWQoY29uc3Qgc3RyaW5nJiBoZWFkZXJfYnl0ZXMpIHsKKyAgSGVhZGVyIGhlYWRlcjsKKyAgaGVhZGVyLlBhcnNlRnJvbVN0cmluZyhoZWFkZXJfYnl0ZXMpOworICByZXR1cm4gaGVhZGVyLmhhc19kZWNyeXB0aW9uX2tleV9pZCgpOworfQorCitib29sIFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpIYXNWZXJpZmljYXRpb25LZXlJZChjb25zdCBzdHJpbmcmIGhlYWRlcl9ieXRlcykgeworICBIZWFkZXIgaGVhZGVyOworICBoZWFkZXIuUGFyc2VGcm9tU3RyaW5nKGhlYWRlcl9ieXRlcyk7CisgIHJldHVybiBoZWFkZXIuaGFzX3ZlcmlmaWNhdGlvbl9rZXlfaWQoKTsKK30KKwordWludDMyX3QgU2VjdXJlTWVzc2FnZVdyYXBwZXI6OkdldEFzc29jaWF0ZWREYXRhTGVuZ3RoKAorICAgIGNvbnN0IHN0cmluZyYgaGVhZGVyX2J5dGVzKSB7CisgIEhlYWRlciBoZWFkZXI7CisgIGhlYWRlci5QYXJzZUZyb21TdHJpbmcoaGVhZGVyX2J5dGVzKTsKKyAgcmV0dXJuIGhlYWRlci5hc3NvY2lhdGVkX2RhdGFfbGVuZ3RoKCk7Cit9CisKK2ludCBTZWN1cmVNZXNzYWdlV3JhcHBlcjo6R2V0U2lnU2NoZW1lKENyeXB0b09wczo6U2lnVHlwZSBzaWdfdHlwZSkgeworICBzd2l0Y2ggKHNpZ190eXBlKSB7CisgICAgY2FzZSBDcnlwdG9PcHM6OlNpZ1R5cGU6OkVDRFNBX1AyNTZfU0hBMjU2OgorICAgICAgcmV0dXJuIHNlY3VyZW1lc3NhZ2U6OkVDRFNBX1AyNTZfU0hBMjU2OworICAgIGNhc2UgQ3J5cHRvT3BzOjpTaWdUeXBlOjpITUFDX1NIQTI1NjoKKyAgICAgIHJldHVybiBzZWN1cmVtZXNzYWdlOjpITUFDX1NIQTI1NjsKKyAgICBjYXNlIENyeXB0b09wczo6U2lnVHlwZTo6UlNBMjA0OF9TSEEyNTY6CisgICAgICByZXR1cm4gc2VjdXJlbWVzc2FnZTo6UlNBMjA0OF9TSEEyNTY7CisgICAgY2FzZSBDcnlwdG9PcHM6OlNpZ1R5cGU6OlNJR19UWVBFX0VORDoKKyAgICAgIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoIndyb25nIHNpZ3R5cGUiKTsKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFuZCBpcyB1bmRlZmluZWQgYmVoYXZpb3IgaWYgaXQgZG9lcy4KKyAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgid3Jvbmcgc2lndHlwZSIpOworICByZXR1cm4gMDsKK30KKworaW50IFNlY3VyZU1lc3NhZ2VXcmFwcGVyOjpHZXRFbmNTY2hlbWUoQ3J5cHRvT3BzOjpFbmNUeXBlIGVuY190eXBlKSB7CisgIHN3aXRjaCAoZW5jX3R5cGUpIHsKKyAgICBjYXNlIENyeXB0b09wczo6RW5jVHlwZTo6QUVTXzI1Nl9DQkM6CisgICAgICByZXR1cm4gc2VjdXJlbWVzc2FnZTo6QUVTXzI1Nl9DQkM7CisgICAgY2FzZSBDcnlwdG9PcHM6OkVuY1R5cGU6Ok5PTkU6CisgICAgICByZXR1cm4gc2VjdXJlbWVzc2FnZTo6Tk9ORTsKKyAgICBjYXNlIENyeXB0b09wczo6RW5jVHlwZTo6RU5DX1RZUEVfRU5EOgorICAgICAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgid3JvbmcgZW5jdHlwZSIpOworICB9CisKKyAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFuZCBpcyB1bmRlZmluZWQgYmVoYXZpb3IgaWYgaXQgZG9lcy4KKyAgVXRpbDo6TG9nRXJyb3JBbmRBYm9ydCgid3JvbmcgZW5jdHlwZSIpOworICBhYm9ydCgpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL3V0aWwuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvc3JjL3NlY3VyZW1lc3NhZ2UvdXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTgxNzFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3NyYy9zZWN1cmVtZXNzYWdlL3V0aWwuY2MKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS91dGlsLmgiCisKK3VzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKKworbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UgeworCit1bmlxdWVfcHRyPHN0cmluZz4gVXRpbDo6TWFrZVVuaXF1ZVB0clN0cmluZyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CisgIHJldHVybiB1bmlxdWVfcHRyPHN0cmluZz4obmV3IHN0cmluZygoY29uc3QgY2hhciopZGF0YSwgbGVuZ3RoKSk7Cit9CisKK3ZvaWQgVXRpbDo6TG9nRXJyb3IoY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlKSB7CisgIHN0ZDo6Y2VyciA8PCAiW0VSUk9SXSAiIDw8IGVycm9yX21lc3NhZ2UgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFV0aWw6OkxvZ0Vycm9yQW5kQWJvcnQoY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlKSB7CisgIExvZ0Vycm9yKGVycm9yX21lc3NhZ2UpOworICBhYm9ydCgpOworfQorCitVdGlsOjp+VXRpbCgpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGVzdC9zZWN1cmVtZXNzYWdlL2J1aWxkZXJfcGFyc2VyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGVzdC9zZWN1cmVtZXNzYWdlL2J1aWxkZXJfcGFyc2VyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxOGY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90ZXN0L3NlY3VyZW1lc3NhZ2UvYnVpbGRlcl9wYXJzZXJfdGVzdC5jYwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9ieXRlX2J1ZmZlci5oIgorI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvcHVibGljX2tleV9wcm90b191dGlsLmgiCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9idWlsZGVyLmgiCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9wYXJzZXIuaCIKKyNpbmNsdWRlICJzZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3dyYXBwZXIuaCIKKworCit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIga1ZlcmlmaWNhdGlvbktleUlkWzJdID0gezB4MDAsIDB4MDV9OworY29uc3QgdW5zaWduZWQgY2hhciBrRGVjcnlwdGlvbktleUlkWzIyXSA9IHswLCAxLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwfTsKKworY2xhc3MgU2VjdXJlTWVzc2FnZUJ1aWxkZXJQYXJzZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBtZXNzYWdlXzsKKyAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBtZXRhZGF0YV87CisKKyAgLy8gS2V5IElkcworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHZlcmlmaWNhdGlvbl9rZXlfaWRfOworICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IGRlY3J5cHRpb25fa2V5X2lkXzsKKworICAvLyBLZXlzCisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpLZXlQYWlyPiBlY19rZXlfOworICB1bmlxdWVfcHRyPENyeXB0b09wczo6S2V5UGFpcj4gcnNhX2tleV87CisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpTZWNyZXRLZXk+IGFlc19lbmNyeXB0aW9uX2tleV87CisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpTZWNyZXRLZXk+IGhtYWNfa2V5XzsKKworICAvLyBPcHRpb25hbCBBc3NvY2lhdGVkIERhdGEKKyAgc3RyaW5nIGFzc29jaWF0ZWRfZGF0YV87CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIG1lc3NhZ2VfLnJlc2V0KG5ldyBCeXRlQnVmZmVyKCJUZXN0aW5nIDEgMiAzLi4uIikpOworICAgIG1ldGFkYXRhXy5yZXNldChuZXcgQnl0ZUJ1ZmZlcigiVGVzdCBwcm90b2NvbCIpKTsKKworICAgIHZlcmlmaWNhdGlvbl9rZXlfaWRfLnJlc2V0KG5ldyBCeXRlQnVmZmVyKGtWZXJpZmljYXRpb25LZXlJZCwgMikpOworICAgIGRlY3J5cHRpb25fa2V5X2lkXy5yZXNldChuZXcgQnl0ZUJ1ZmZlcihrRGVjcnlwdGlvbktleUlkLCAyMikpOworICAgIGFzc29jaWF0ZWRfZGF0YV8gPSBzdHJpbmcoKTsKKworICAgIGVjX2tleV8gPSBDcnlwdG9PcHM6OkdlbmVyYXRlRWNQMjU2S2V5UGFpcigpOworICAgIHJzYV9rZXlfID0gQ3J5cHRvT3BzOjpHZW5lcmF0ZVJzYTIwNDhLZXlQYWlyKCk7CisgICAgYWVzX2VuY3J5cHRpb25fa2V5XyA9IENyeXB0b09wczo6R2VuZXJhdGVBZXMyNTZTZWNyZXRLZXkoKTsKKyAgICBobWFjX2tleV8gPSBDcnlwdG9PcHM6OkdlbmVyYXRlQWVzMjU2U2VjcmV0S2V5KCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorCisgIC8vIFByb2R1Y2UgYSBTaWduZWQgU2VjdXJlTWVzc2FnZQorICB1bmlxdWVfcHRyPFNlY3VyZU1lc3NhZ2U+IFNpZ24oQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlKSB7CisgICAgdW5pcXVlX3B0cjxTZWN1cmVNZXNzYWdlQnVpbGRlcj4gYnVpbGRlciA9IEdldFByZWNvbmZpZ3VyZWRCdWlsZGVyKCk7CisKKyAgICBDcnlwdG9PcHM6OktleSogc2lnbmluZ19rZXkgPSBHZXRTaWduaW5nS2V5Rm9yKHNpZ190eXBlKTsKKworICAgIGlmIChzaWduaW5nX2tleSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRlci0+QnVpbGRTaWduZWRDbGVhcnRleHRNZXNzYWdlKCpzaWduaW5nX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV8tPlN0cmluZygpKTsKKyAgfQorCisgIC8vIFByb2R1Y2UgYSBTaWduZWQvRW5jcnlwdGVkIFNlY3VyZU1lc3NhZ2UKKyAgdW5pcXVlX3B0cjxTZWN1cmVNZXNzYWdlPiBTaWduQ3J5cHQoQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVuY1R5cGUgZW5jX3R5cGUpIHsKKyAgICB1bmlxdWVfcHRyPFNlY3VyZU1lc3NhZ2VCdWlsZGVyPiBidWlsZGVyID0gR2V0UHJlY29uZmlndXJlZEJ1aWxkZXIoKTsKKyAgICBDcnlwdG9PcHM6OktleSogc2lnbmluZ19rZXkgPSBHZXRTaWduaW5nS2V5Rm9yKHNpZ190eXBlKTsKKworICAgIGlmIChzaWduaW5nX2tleSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRlci0+QnVpbGRTaWduQ3J5cHRlZE1lc3NhZ2UoKnNpZ25pbmdfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFlc19lbmNyeXB0aW9uX2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlXy0+U3RyaW5nKCkpOworICB9CisKKyAgdm9pZCBWZXJpZnlEZWNyeXB0KGNvbnN0IFNlY3VyZU1lc3NhZ2UmIGVuY3J5cHRlZF9hbmRfc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpFbmNUeXBlIGVuY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRfZmFpbCkgeworICAgIENyeXB0b09wczo6S2V5KiB2ZXJpZmljYXRpb25fa2V5ID0gR2V0VmVyaWZpY2F0aW9uS2V5Rm9yKHNpZ190eXBlKTsKKworICAgIHVuaXF1ZV9wdHI8SGVhZGVyQW5kQm9keT4gaGVhZGVyX2FuZF9ib2R5ID0KKyAgICAgICAgU2VjdXJlTWVzc2FnZVBhcnNlcjo6UGFyc2VTaWduQ3J5cHRlZE1lc3NhZ2UoCisgICAgICAgICAgICBlbmNyeXB0ZWRfYW5kX3NpZ25lZCwgKnZlcmlmaWNhdGlvbl9rZXksIHNpZ190eXBlLAorICAgICAgICAgICAgKmFlc19lbmNyeXB0aW9uX2tleV8sIGVuY190eXBlLCBhc3NvY2lhdGVkX2RhdGFfKTsKKworICAgIGlmICghc2hvdWxkX2ZhaWwpIHsKKyAgICAgIEFTU0VSVF9ORShoZWFkZXJfYW5kX2JvZHksIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfRVEoaGVhZGVyX2FuZF9ib2R5LCBudWxscHRyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ29uc2lzdGVuY3lDaGVjayhlbmNyeXB0ZWRfYW5kX3NpZ25lZCwgKmhlYWRlcl9hbmRfYm9keSwgc2lnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBlbmNfdHlwZSk7CisgIH0KKworICAvLyBSZXR1cm5zIGlmIHRoZSBoZWFkZXIgYW5kIGJvZHkgb2YgYSBnaXZlbiBzZWN1cmUgbWVzc2FnZSBsb29rIHNhbmUKKyAgdm9pZCBDb25zaXN0ZW5jeUNoZWNrKGNvbnN0IFNlY3VyZU1lc3NhZ2UmIHNlY3VyZV9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGVhZGVyQW5kQm9keSYgaGVhZGVyX2FuZF9ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpFbmNUeXBlIGVuY190eXBlKSB7CisgICAgdW5pcXVlX3B0cjxIZWFkZXI+IGhlYWRlciA9CisgICAgICAgIFNlY3VyZU1lc3NhZ2VQYXJzZXI6OkdldFVudmVyaWZpZWRIZWFkZXIoc2VjdXJlX21lc3NhZ2UpOworCisgICAgQVNTRVJUX1RSVUUoaGVhZGVyICE9IG51bGxwdHIpOworICAgIENoZWNrSGVhZGVyKCpoZWFkZXIsIHNpZ190eXBlLCBlbmNfdHlwZSk7CisgICAgQ2hlY2tIZWFkZXJBbmRCb2R5KCpoZWFkZXIsIGhlYWRlcl9hbmRfYm9keSk7CisgIH0KKworICAvLyBSZXR1cm5zIGlmIHRoZSBoZWFkZXIgY2hlY2tzIG91dCBvciBjYXVzZXMgYW5kIGVycm9yIG90aGVyd2lzZQorICB2b2lkIENoZWNrSGVhZGVyKGNvbnN0IEhlYWRlciYgaGVhZGVyLCBDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVuY1R5cGUgZW5jX3R5cGUpIHsKKyAgICBBU1NFUlRfRVEoU2VjdXJlTWVzc2FnZVdyYXBwZXI6OkdldFNpZ1NjaGVtZShzaWdfdHlwZSksCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oaGVhZGVyLnNpZ25hdHVyZV9zY2hlbWUoKSkpOworICAgIEFTU0VSVF9FUShTZWN1cmVNZXNzYWdlV3JhcHBlcjo6R2V0RW5jU2NoZW1lKGVuY190eXBlKSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihoZWFkZXIuZW5jcnlwdGlvbl9zY2hlbWUoKSkpOworICAgIENoZWNrS2V5SWRzQW5kTWV0YWRhdGEodmVyaWZpY2F0aW9uX2tleV9pZF8sIGRlY3J5cHRpb25fa2V5X2lkXywgbWV0YWRhdGFfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKKyAgfQorCisgIC8vIFJldHVybnMgaWYgaGVhZGVyIGFuZCBib2R5IGNoZWNrIG91dCwgZXJyb3JzIG90aGVyd2lzZQorICB2b2lkIENoZWNrSGVhZGVyQW5kQm9keShjb25zdCBIZWFkZXImIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGVhZGVyQW5kQm9keSYgaGVhZGVyX2FuZF9ib2R5KSB7CisgICAgQVNTRVJUX0VRKGhlYWRlci5TZXJpYWxpemVBc1N0cmluZygpLAorICAgICAgICAgICAgICBoZWFkZXJfYW5kX2JvZHkuaGVhZGVyKCkuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgICAgQVNTRVJUX0VRKG1lc3NhZ2VfLT5TdHJpbmcoKSwgaGVhZGVyX2FuZF9ib2R5LmJvZHkoKSk7CisgIH0KKworICAvLyBSZXR1cm5zIGlmIGtleSBpZHMgYW5kIG1ldGFkYXRhIGNoZWNrLCBlcnJvcnMgb3RoZXJ3aXNlCisgIHZvaWQgQ2hlY2tLZXlJZHNBbmRNZXRhZGF0YShjb25zdCB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+JiB2ZXJpZmljYXRpb25fa2V5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiYgZGVjcnlwdGlvbl9rZXlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+JiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhlYWRlciYgaGVhZGVyKSB7CisgICAgaWYgKHZlcmlmaWNhdGlvbl9rZXlfaWQgPT0gbnVsbHB0cikgeworICAgICAgQVNTRVJUX0ZBTFNFKGhlYWRlci5oYXNfdmVyaWZpY2F0aW9uX2tleV9pZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgQVNTRVJUX1RSVUUodmVyaWZpY2F0aW9uX2tleV9pZC0+RXF1YWxzKAorICAgICAgICAgIEJ5dGVCdWZmZXIoaGVhZGVyLnZlcmlmaWNhdGlvbl9rZXlfaWQoKSkpKTsKKyAgICB9CisgICAgaWYgKGRlY3J5cHRpb25fa2V5X2lkID09IG51bGxwdHIpIHsKKyAgICAgIEFTU0VSVF9GQUxTRShoZWFkZXIuaGFzX2RlY3J5cHRpb25fa2V5X2lkKCkpOworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICBkZWNyeXB0aW9uX2tleV9pZC0+RXF1YWxzKEJ5dGVCdWZmZXIoaGVhZGVyLmRlY3J5cHRpb25fa2V5X2lkKCkpKSk7CisgICAgfQorICAgIGlmIChtZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICBBU1NFUlRfRkFMU0UoaGVhZGVyLmhhc19wdWJsaWNfbWV0YWRhdGEoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9UUlVFKG1ldGFkYXRhLT5FcXVhbHMoQnl0ZUJ1ZmZlcihoZWFkZXIucHVibGljX21ldGFkYXRhKCkpKSk7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIHRoZSBjb3JyZWN0IHNpZ25pbmcga2V5IGZvciBhIHNpZ25hdHVyZSB0eXBlCisgIENyeXB0b09wczo6S2V5KiBHZXRTaWduaW5nS2V5Rm9yKENyeXB0b09wczo6U2lnVHlwZSBzaWdfdHlwZSkgeworICAgIGlmIChzaWdfdHlwZSA9PSBDcnlwdG9PcHM6OlNpZ1R5cGU6OkVDRFNBX1AyNTZfU0hBMjU2KSB7CisgICAgICByZXR1cm4gZWNfa2V5Xy0+cHJpdmF0ZV9rZXkuZ2V0KCk7CisgICAgfQorICAgIGlmIChzaWdfdHlwZSA9PSBDcnlwdG9PcHM6OlNpZ1R5cGU6OlJTQTIwNDhfU0hBMjU2KSB7CisgICAgICByZXR1cm4gcnNhX2tleV8tPnByaXZhdGVfa2V5LmdldCgpOworICAgIH0KKyAgICBpZiAoc2lnX3R5cGUgPT0gQ3J5cHRvT3BzOjpTaWdUeXBlOjpITUFDX1NIQTI1NikgeworICAgICAgcmV0dXJuIGhtYWNfa2V5Xy5nZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7ICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisgIH0KKworICAvLyBSZXR1cm4gdGhlIGNvcnJlY3QgdmVyaWZpY2F0aW9uIGtleSBmb3Igc2lnbmF0dXJlIHR5cGUKKyAgQ3J5cHRvT3BzOjpLZXkqIEdldFZlcmlmaWNhdGlvbktleUZvcihDcnlwdG9PcHM6OlNpZ1R5cGUgc2lnX3R5cGUpIHsKKyAgICBpZiAoQ3J5cHRvT3BzOjpJc1B1YmxpY0tleVNjaGVtZShzaWdfdHlwZSkpIHsKKyAgICAgIGlmIChzaWdfdHlwZSA9PSBDcnlwdG9PcHM6OlNpZ1R5cGU6OkVDRFNBX1AyNTZfU0hBMjU2KSB7CisgICAgICAgIHJldHVybiBlY19rZXlfLT5wdWJsaWNfa2V5LmdldCgpOworICAgICAgfSBlbHNlIGlmIChzaWdfdHlwZSA9PSBDcnlwdG9PcHM6OlNpZ1R5cGU6OlJTQTIwNDhfU0hBMjU2KSB7CisgICAgICAgIHJldHVybiByc2Ffa2V5Xy0+cHVibGljX2tleS5nZXQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOyAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgorICAgICAgfQorICAgIH0KKworICAgIC8vIEZvciBzeW1tZXRyaWMga2V5IHNjaGVtZXMKKyAgICByZXR1cm4gR2V0U2lnbmluZ0tleUZvcihzaWdfdHlwZSk7CisgIH0KKworICAvLyBQcm9kdWNlIGEgcHJlY29uZmlndXJlZCBidWlsZGVyIHdpdGggc2V2ZXJhbCBmaWVsZHMgYWxyZWFkeSBzZXQKKyAgdW5pcXVlX3B0cjxTZWN1cmVNZXNzYWdlQnVpbGRlcj4gR2V0UHJlY29uZmlndXJlZEJ1aWxkZXIoKSB7CisgICAgdW5pcXVlX3B0cjxTZWN1cmVNZXNzYWdlQnVpbGRlcj4gYnVpbGRlcihuZXcgU2VjdXJlTWVzc2FnZUJ1aWxkZXIoKSk7CisKKyAgICBpZiAoZGVjcnlwdGlvbl9rZXlfaWRfICE9IG51bGxwdHIpIHsKKyAgICAgIGJ1aWxkZXItPlNldERlY3J5cHRpb25LZXlJZChkZWNyeXB0aW9uX2tleV9pZF8tPlN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKHZlcmlmaWNhdGlvbl9rZXlfaWRfICE9IG51bGxwdHIpIHsKKyAgICAgIGJ1aWxkZXItPlNldFZlcmlmaWNhdGlvbktleUlkKHZlcmlmaWNhdGlvbl9rZXlfaWRfLT5TdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChtZXRhZGF0YV8gIT0gbnVsbHB0cikgeworICAgICAgYnVpbGRlci0+U2V0UHVibGljTWV0YWRhdGEobWV0YWRhdGFfLT5TdHJpbmcoKSk7CisgICAgfQorICAgIGJ1aWxkZXItPlNldEFzc29jaWF0ZWREYXRhKGFzc29jaWF0ZWRfZGF0YV8pOworCisgICAgcmV0dXJuIGJ1aWxkZXI7CisgIH0KK307CisKK1RFU1RfRihTZWN1cmVNZXNzYWdlQnVpbGRlclBhcnNlclRlc3QsCisgICAgICAgVGVzdEVuY3J5cHRlZEFuZEVjZHNhU2lnbmVkVXNpbmdQdWJsaWNLZXlQcm90bykgeworICAvLyBTYWZlc3QgdXNhZ2Ugb2YgU2lnbkNyeXB0aW9uIGlzIHRvIHNldCB0aGUgVmVyaWZpY2F0aW9uS2V5SWQgdG8gYW4gYWN0dWFsCisgIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZXJpZmljYXRpb24ga2V5LgorICB2ZXJpZmljYXRpb25fa2V5X2lkXy5yZXNldCgKKyAgICAgIG5ldyBCeXRlQnVmZmVyKFB1YmxpY0tleVByb3RvVXRpbDo6RW5jb2RlUHVibGljS2V5KCooZWNfa2V5Xy0+cHVibGljX2tleSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5TZXJpYWxpemVBc1N0cmluZygpKSk7CisKKyAgdW5pcXVlX3B0cjxTZWN1cmVNZXNzYWdlPiBlbmNyeXB0ZWRfYW5kX3NpZ25lZCA9IFNpZ25DcnlwdCgKKyAgICAgIENyeXB0b09wczo6U2lnVHlwZTo6RUNEU0FfUDI1Nl9TSEEyNTYsIENyeXB0b09wczo6RW5jVHlwZTo6QUVTXzI1Nl9DQkMpOworCisgIC8vIFNpbXVsYXRlIGV4dHJhY3RpbmcgdGhlIHZlcmlmaWNhdGlvbiBrZXkgSUQgZnJvbSB0aGUgU2VjdXJlTWVzc2FnZQorICAvLyAobm9uLXN0YW5kYXJkIHVzYWdlKQorICBzdHJpbmcgdmVyaWZpY2F0aW9uX2lkID0gU2VjdXJlTWVzc2FnZVBhcnNlcjo6R2V0VW52ZXJpZmllZEhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZW5jcnlwdGVkX2FuZF9zaWduZWQpLT52ZXJpZmljYXRpb25fa2V5X2lkKCk7CisgIHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4gZ2VuZXJpY19rZXkobmV3IEdlbmVyaWNQdWJsaWNLZXkoKSk7CisgIGdlbmVyaWNfa2V5LT5QYXJzZUZyb21TdHJpbmcodmVyaWZpY2F0aW9uX2lkKTsKKworICAvLyBWZXJpZnkgYmVsb3cgaXMgbm93IGZvcmNlZCB0byB1c2UgdGhlIHB1YmxpYyBrZXkgcGFyc2VkIG91dCBvZiB0aGUKKyAgLy8gdmVyaWZpY2F0aW9uIGlkCisgIGVjX2tleV8tPnB1YmxpY19rZXkgPSBQdWJsaWNLZXlQcm90b1V0aWw6OlBhcnNlUHVibGljS2V5KCpnZW5lcmljX2tleSk7CisKKyAgVmVyaWZ5RGVjcnlwdCgqZW5jcnlwdGVkX2FuZF9zaWduZWQsIENyeXB0b09wczo6U2lnVHlwZTo6RUNEU0FfUDI1Nl9TSEEyNTYsCisgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpFbmNUeXBlOjpBRVNfMjU2X0NCQywgZmFsc2UpOworfQorCitURVNUX0YoU2VjdXJlTWVzc2FnZUJ1aWxkZXJQYXJzZXJUZXN0LAorICAgICAgIFRlc3RFbmNyeXB0ZWRBbmRFY2RzYVNpZ25lZFVzaW5nUHVibGljS2V5UHJvdG9XaXRoQXNzb2NpYXRlZERhdGEpIHsKKyAgLy8gU2FmZXN0IHVzYWdlIG9mIFNpZ25DcnlwdGlvbiBpcyB0byBzZXQgdGhlIFZlcmlmaWNhdGlvbktleUlkIHRvIGFuIGFjdHVhbAorICAvLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyaWZpY2F0aW9uIGtleS4KKyAgdmVyaWZpY2F0aW9uX2tleV9pZF8ucmVzZXQoCisgICAgICBuZXcgQnl0ZUJ1ZmZlcihQdWJsaWNLZXlQcm90b1V0aWw6OkVuY29kZVB1YmxpY0tleSgqKGVjX2tleV8tPnB1YmxpY19rZXkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+U2VyaWFsaXplQXNTdHJpbmcoKSkpOworICBhc3NvY2lhdGVkX2RhdGFfID0gInRlc3QgYXNzb2NpYXRlZCBkYXRhIjsKKworICB1bmlxdWVfcHRyPFNlY3VyZU1lc3NhZ2U+IGVuY3J5cHRlZF9hbmRfc2lnbmVkID0gU2lnbkNyeXB0KAorICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlOjpFQ0RTQV9QMjU2X1NIQTI1NiwgQ3J5cHRvT3BzOjpFbmNUeXBlOjpBRVNfMjU2X0NCQyk7CisKKyAgLy8gU2ltdWxhdGUgZXh0cmFjdGluZyB0aGUgdmVyaWZpY2F0aW9uIGtleSBJRCBmcm9tIHRoZSBTZWN1cmVNZXNzYWdlCisgIC8vIChub24tc3RhbmRhcmQgdXNhZ2UpCisgIHN0cmluZyB2ZXJpZmljYXRpb25faWQgPSBTZWN1cmVNZXNzYWdlUGFyc2VyOjpHZXRVbnZlcmlmaWVkSGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbmNyeXB0ZWRfYW5kX3NpZ25lZCktPnZlcmlmaWNhdGlvbl9rZXlfaWQoKTsKKyAgdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBnZW5lcmljX2tleShuZXcgR2VuZXJpY1B1YmxpY0tleSgpKTsKKyAgZ2VuZXJpY19rZXktPlBhcnNlRnJvbVN0cmluZyh2ZXJpZmljYXRpb25faWQpOworCisgIC8vIFZlcmlmeSBiZWxvdyBpcyBub3cgZm9yY2VkIHRvIHVzZSB0aGUgcHVibGljIGtleSBwYXJzZWQgb3V0IG9mIHRoZQorICAvLyB2ZXJpZmljYXRpb24gaWQKKyAgZWNfa2V5Xy0+cHVibGljX2tleSA9IFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmdlbmVyaWNfa2V5KTsKKworICBWZXJpZnlEZWNyeXB0KCplbmNyeXB0ZWRfYW5kX3NpZ25lZCwgQ3J5cHRvT3BzOjpTaWdUeXBlOjpFQ0RTQV9QMjU2X1NIQTI1NiwKKyAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVuY1R5cGU6OkFFU18yNTZfQ0JDLCBmYWxzZSk7CisKKyAgLy8gU2FtZSBsZW5ndGggYXNzb2NpYXRlZCBkYXRhLCBidXQgZGlmZmVyZW50IGNvbnRlbnQgc2hvdWxkIGZhaWwKKyAgYXNzb2NpYXRlZF9kYXRhXyA9ICJ0ZXN0IGFzc29jaWF0ZWQgZGF0NCI7CisgIFZlcmlmeURlY3J5cHQoKmVuY3J5cHRlZF9hbmRfc2lnbmVkLCBDcnlwdG9PcHM6OlNpZ1R5cGU6OkVDRFNBX1AyNTZfU0hBMjU2LAorICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpFbmNUeXBlOjpBRVNfMjU2X0NCQywgdHJ1ZSk7CisKKyAgLy8gQmxhbmsgYXNzb2NpYXRlZCBkYXRhIHNob3VsZCBhbHNvIGZhaWwKKyAgYXNzb2NpYXRlZF9kYXRhXyA9ICIiOworICBWZXJpZnlEZWNyeXB0KCplbmNyeXB0ZWRfYW5kX3NpZ25lZCwgQ3J5cHRvT3BzOjpTaWdUeXBlOjpFQ0RTQV9QMjU2X1NIQTI1NiwKKyAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVuY1R5cGU6OkFFU18yNTZfQ0JDLCB0cnVlKTsKK30KKworVEVTVF9GKFNlY3VyZU1lc3NhZ2VCdWlsZGVyUGFyc2VyVGVzdCwKKyAgICAgICBUZXN0RW5jcnlwdGVkQW5kUnNhU2lnbmVkVXNpbmdQdWJsaWNLZXlQcm90bykgeworICB2ZXJpZmljYXRpb25fa2V5X2lkXy5yZXNldChuZXcgQnl0ZUJ1ZmZlcigicmVwbGFjZSBtZSIpKTsKKworICAvLyBUT0RPKGFjemVza2lzKTogVXNlIHRoaXMgd2hlbiBFbmNvZGVQdWJsaWNLZXkoKSBjYW4gaGFuZGxlIFJTQSBrZXlzCisgIC8vIHZlcmlmaWNhdGlvbl9rZXlfaWRfLnJlc2V0KAorICAvLyAgICBuZXcgQnl0ZUJ1ZmZlcihQdWJsaWNLZXlQcm90b1V0aWw6OkVuY29kZVB1YmxpY0tleSgKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICoocnNhX2tleV8tPnB1YmxpY19rZXkpKS0+U2VyaWFsaXplQXNTdHJpbmcoKSkpOworCisgIHVuaXF1ZV9wdHI8U2VjdXJlTWVzc2FnZT4gZW5jcnlwdGVkX2FuZF9zaWduZWQgPSBTaWduQ3J5cHQoCisgICAgICBDcnlwdG9PcHM6OlNpZ1R5cGU6OlJTQTIwNDhfU0hBMjU2LCBDcnlwdG9PcHM6OkVuY1R5cGU6OkFFU18yNTZfQ0JDKTsKKworICAvLyBUT0RPKGFjemVza2lzKTogVXNlIHRoaXMgd2hlbiBFbmNvZGVQdWJsaWNLZXkgYW5kIFBhcnNlUHVibGljS2V5IHdvcmsKKyAgLy8gU2ltdWxhdGUgZXh0cmFjdGluZyB0aGUgdmVyaWZpY2F0aW9uIGtleSBJRCBmcm9tIHRoZSBTZWN1cmVNZXNzYWdlCisgIC8vIChub24tc3RhbmRhcmQgdXNhZ2UpCisgIC8vIHN0cmluZyB2ZXJpZmljYXRpb25faWQgPSBTZWN1cmVNZXNzYWdlUGFyc2VyOjpHZXRVbnZlcmlmaWVkSGVhZGVyKAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVuY3J5cHRlZF9hbmRfc2lnbmVkKS0+dmVyaWZpY2F0aW9uX2tleV9pZCgpOworICAvLyB1bmlxdWVfcHRyPEdlbmVyaWNQdWJsaWNLZXk+IGdlbmVyaWNfa2V5KG5ldyBHZW5lcmljUHVibGljS2V5KCkpOworICAvLyBnZW5lcmljX2tleS0+UGFyc2VGcm9tU3RyaW5nKHZlcmlmaWNhdGlvbl9pZCk7CisKKyAgLy8gVE9ETyhhY3plc2tpcyk6IFVuY29tbWVudCB0aGlzIHdoZW4gUGFyc2VQdWJsaWNLZXkoKSBjYW4gaGFuZGxlIFJTQSBrZXlzCisgIC8vIFZlcmlmeSBiZWxvdyBpcyBub3cgZm9yY2VkIHRvIHVzZSB0aGUgcHVibGljIGtleSBwYXJzZWQgb3V0IG9mIHRoZQorICAvLyB2ZXJpZmljYXRpb24gaWQKKyAgLy8gcnNhX2tleV8tPnB1YmxpY19rZXkgPSBQdWJsaWNLZXlQcm90b1V0aWw6OlBhcnNlUHVibGljS2V5KCpnZW5lcmljX2tleSk7CisKKyAgVmVyaWZ5RGVjcnlwdCgqZW5jcnlwdGVkX2FuZF9zaWduZWQsIENyeXB0b09wczo6U2lnVHlwZTo6UlNBMjA0OF9TSEEyNTYsCisgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpFbmNUeXBlOjpBRVNfMjU2X0NCQywgZmFsc2UpOworfQorCisKK1RFU1RfRihTZWN1cmVNZXNzYWdlQnVpbGRlclBhcnNlclRlc3QsCisgICAgICAgVGVzdEVuY3J5cHRlZEFuZFJzYVNpZ25lZFVzaW5nUHVibGljS2V5UHJvdG9XaXRoQXNzb2NpYXRlZERhdGEpIHsKKyAgdmVyaWZpY2F0aW9uX2tleV9pZF8ucmVzZXQobmV3IEJ5dGVCdWZmZXIoInJlcGxhY2UgbWUiKSk7CisKKyAgLy8gVE9ETyhhY3plc2tpcyk6IFVzZSB0aGlzIHdoZW4gRW5jb2RlUHVibGljS2V5KCkgY2FuIGhhbmRsZSBSU0Ega2V5cworICAvLyB2ZXJpZmljYXRpb25fa2V5X2lkXy5yZXNldCgKKyAgLy8gICAgbmV3IEJ5dGVCdWZmZXIoUHVibGljS2V5UHJvdG9VdGlsOjpFbmNvZGVQdWJsaWNLZXkoCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAqKHJzYV9rZXlfLT5wdWJsaWNfa2V5KSktPlNlcmlhbGl6ZUFzU3RyaW5nKCkpKTsKKworICBhc3NvY2lhdGVkX2RhdGFfID0gInRlc3QgYXNzb2NpYXRlZCBkYXRhIjsKKworICB1bmlxdWVfcHRyPFNlY3VyZU1lc3NhZ2U+IGVuY3J5cHRlZF9hbmRfc2lnbmVkID0gU2lnbkNyeXB0KAorICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlOjpSU0EyMDQ4X1NIQTI1NiwgQ3J5cHRvT3BzOjpFbmNUeXBlOjpBRVNfMjU2X0NCQyk7CisKKyAgLy8gVE9ETyhhY3plc2tpcyk6IFVzZSB0aGlzIHdoZW4gRW5jb2RlUHVibGljS2V5IGFuZCBQYXJzZVB1YmxpY0tleSB3b3JrCisgIC8vIFNpbXVsYXRlIGV4dHJhY3RpbmcgdGhlIHZlcmlmaWNhdGlvbiBrZXkgSUQgZnJvbSB0aGUgU2VjdXJlTWVzc2FnZQorICAvLyAobm9uLXN0YW5kYXJkIHVzYWdlKQorICAvLyBzdHJpbmcgdmVyaWZpY2F0aW9uX2lkID0gU2VjdXJlTWVzc2FnZVBhcnNlcjo6R2V0VW52ZXJpZmllZEhlYWRlcigKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbmNyeXB0ZWRfYW5kX3NpZ25lZCktPnZlcmlmaWNhdGlvbl9rZXlfaWQoKTsKKyAgLy8gdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBnZW5lcmljX2tleShuZXcgR2VuZXJpY1B1YmxpY0tleSgpKTsKKyAgLy8gZ2VuZXJpY19rZXktPlBhcnNlRnJvbVN0cmluZyh2ZXJpZmljYXRpb25faWQpOworCisgIC8vIFRPRE8oYWN6ZXNraXMpOiBVbmNvbW1lbnQgdGhpcyB3aGVuIFBhcnNlUHVibGljS2V5KCkgY2FuIGhhbmRsZSBSU0Ega2V5cworICAvLyBWZXJpZnkgYmVsb3cgaXMgbm93IGZvcmNlZCB0byB1c2UgdGhlIHB1YmxpYyBrZXkgcGFyc2VkIG91dCBvZiB0aGUKKyAgLy8gdmVyaWZpY2F0aW9uIGlkCisgIC8vIHJzYV9rZXlfLT5wdWJsaWNfa2V5ID0gUHVibGljS2V5UHJvdG9VdGlsOjpQYXJzZVB1YmxpY0tleSgqZ2VuZXJpY19rZXkpOworCisgIFZlcmlmeURlY3J5cHQoKmVuY3J5cHRlZF9hbmRfc2lnbmVkLCBDcnlwdG9PcHM6OlNpZ1R5cGU6OlJTQTIwNDhfU0hBMjU2LAorICAgICAgICAgICAgICAgIENyeXB0b09wczo6RW5jVHlwZTo6QUVTXzI1Nl9DQkMsIGZhbHNlKTsKKworICAvLyBTYW1lIGxlbmd0aCBhc3NvY2lhdGVkIGRhdGEsIGJ1dCBkaWZmZXJlbnQgY29udGVudCBzaG91bGQgZmFpbAorICBhc3NvY2lhdGVkX2RhdGFfID0gInRlc3QgYXNzb2NpYXRlZCBkYXQ0IjsKKyAgVmVyaWZ5RGVjcnlwdCgqZW5jcnlwdGVkX2FuZF9zaWduZWQsIENyeXB0b09wczo6U2lnVHlwZTo6UlNBMjA0OF9TSEEyNTYsCisgICAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVuY1R5cGU6OkFFU18yNTZfQ0JDLCB0cnVlKTsKKworICAvLyBCbGFuayBhc3NvY2lhdGVkIGRhdGEgc2hvdWxkIGFsc28gZmFpbAorICBhc3NvY2lhdGVkX2RhdGFfID0gIiI7CisgIFZlcmlmeURlY3J5cHQoKmVuY3J5cHRlZF9hbmRfc2lnbmVkLCBDcnlwdG9PcHM6OlNpZ1R5cGU6OlJTQTIwNDhfU0hBMjU2LAorICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpFbmNUeXBlOjpBRVNfMjU2X0NCQywgdHJ1ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90ZXN0L3NlY3VyZW1lc3NhZ2UvY3J5cHRvX29wc190ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3Rlc3Qvc2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzYTRlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90ZXN0L3NlY3VyZW1lc3NhZ2UvY3J5cHRvX29wc190ZXN0LmNjCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9jcnlwdG9fb3BzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKKworLy8KKy8vICBDbGFzcyBmb3IgZXhwb3NpbmcgQ3J5cHRPcHMgcHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisvLworY2xhc3MgQ3J5cHRvT3BzVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgdWludDhfdCogU2FsdCgpIHsgcmV0dXJuIENyeXB0b09wczo6a1NhbHQ7IH0KKworICBzdGF0aWMgdW5zaWduZWQgaW50IFNhbHRTaXplKCkgeyByZXR1cm4gQ3J5cHRvT3BzOjprU2FsdFNpemU7IH0KKworICBzdGF0aWMgdW5zaWduZWQgaW50IEFlc0tleVNpemUoKSB7IHJldHVybiBDcnlwdG9PcHM6OmtBZXNLZXlTaXplOyB9CisKKyAgc3RhdGljIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gU2hhMjU2KEJ5dGVCdWZmZXIgbWVzc2FnZSkgeworICAgIHJldHVybiBDcnlwdG9PcHM6OlNoYTI1NihtZXNzYWdlKTsKKyAgfQorCisgIHN0YXRpYyB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IEhrZGZTaGEyNTZFeHRyYWN0KEJ5dGVCdWZmZXIga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHNhbHQpIHsKKyAgICByZXR1cm4gQ3J5cHRvT3BzOjpIa2RmU2hhMjU2RXh0cmFjdChrZXksIHNhbHQpOworICB9CisKKyAgc3RhdGljIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gQWVzMjU2Q0JDRGVjcnlwdCgKKyAgICAgIENyeXB0b09wczo6U2VjcmV0S2V5IGRlY3J5cHRpb25LZXksIEJ5dGVCdWZmZXIgaXYsCisgICAgICBCeXRlQnVmZmVyIGNpcGhlcnRleHQpIHsKKyAgICByZXR1cm4gQ3J5cHRvT3BzOjpBZXMyNTZDQkNEZWNyeXB0KGRlY3J5cHRpb25LZXksIGl2LCBjaXBoZXJ0ZXh0KTsKKyAgfQorCisgIHN0YXRpYyB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IEFlczI1NkNCQ0VuY3J5cHQoCisgICAgICBDcnlwdG9PcHM6OlNlY3JldEtleSBlbmNyeXB0aW9uS2V5LCBCeXRlQnVmZmVyIGl2LCBCeXRlQnVmZmVyIHBsYWludGV4dCkgeworICAgIHJldHVybiBDcnlwdG9PcHM6OkFlczI1NkNCQ0VuY3J5cHQoZW5jcnlwdGlvbktleSwgaXYsIHBsYWludGV4dCk7CisgIH0KKworICBzdGF0aWMgc3RyaW5nIEdldFB1cnBvc2UoQ3J5cHRvT3BzOjpTaWdUeXBlIHNpZ1R5cGUpIHsKKyAgICByZXR1cm4gQ3J5cHRvT3BzOjpHZXRQdXJwb3NlKHNpZ1R5cGUpOworICB9CisKKyAgc3RhdGljIHN0cmluZyBHZXRQdXJwb3NlKENyeXB0b09wczo6RW5jVHlwZSBlbmNUeXBlKSB7CisgICAgcmV0dXJuIENyeXB0b09wczo6R2V0UHVycG9zZShlbmNUeXBlKTsKKyAgfQorCisgIHN0YXRpYyBzdHJpbmcgSW50MzJCeXRlc1RvU3RyaW5nKGludDMyX3QgdmFsdWUpIHsKKyAgICByZXR1cm4gQ3J5cHRvT3BzOjpJbnQzMkJ5dGVzVG9TdHJpbmcodmFsdWUpOworICB9CisKKyAgc3RhdGljIGJvb2wgU3RyaW5nVG9JbnQzMkJ5dGVzKGNvbnN0IHN0cmluZyYgdmFsdWUsIGludDMyX3QqIHJlc3VsdCkgeworICAgIHJldHVybiBDcnlwdG9PcHM6OlN0cmluZ1RvSW50MzJCeXRlcyh2YWx1ZSwgcmVzdWx0KTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKK25hbWVzcGFjZSB1bml0dGVzdGluZyB7CituYW1lc3BhY2UgeworCisvLyBIS0RGIFRlc3QgQ2FzZSAxIElLTSBmcm9tIFJGQyA1ODY5CitzdGF0aWMgdW5zaWduZWQgY29uc3QgaW50IGtIa2RmQ2FzZTFJa21MZW5ndGggPSAyMjsKK3N0YXRpYyB1bnNpZ25lZCBjb25zdCBjaGFyIGtIa2RmQ2FzZTFJa21ba0hrZGZDYXNlMUlrbUxlbmd0aF0gPSB7CisgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKyAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBifTsKKworLy8gSEtERiBUZXN0IENhc2UgMSBzYWx0IGZyb20gUkZDIDU4NjkKK3N0YXRpYyB1bnNpZ25lZCBjb25zdCBpbnQga0hrZGZDYXNlMVNhbHRMZW5ndGggPSAxMzsKK3N0YXRpYyB1bnNpZ25lZCBjb25zdCBjaGFyIGtIa2RmQ2FzZTFTYWx0W2tIa2RmQ2FzZTFTYWx0TGVuZ3RoXSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAorICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGN9OworCisvLyBIS0RGIFRlc3QgQ2FzZSAxIGluZm8gZnJvbSBSRkMgNTg2OQorc3RhdGljIHVuc2lnbmVkIGNvbnN0IGludCBrSGtkZkNhc2UxSW5mb0xlbmd0aCA9IDEwOworc3RhdGljIHVuc2lnbmVkIGNvbnN0IGNoYXIga0hrZGZDYXNlMUluZm9ba0hrZGZDYXNlMUluZm9MZW5ndGhdID0geworICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4Zjl9OworCisvLyBGaXJzdCAzMiBieXRlcyBvZiBIS0RGIFRlc3QgQ2FzZSAxIE9LTSAob3V0cHV0KSBmcm9tIFJGQyA1ODY5CitzdGF0aWMgdW5zaWduZWQgY29uc3QgaW50IGtIa2RmQ2FzZTFPa21MZW5ndGggPSAzMjsKK3N0YXRpYyB1bnNpZ25lZCBjb25zdCBjaGFyIGtIa2RmQ2FzZTFPa21ba0hrZGZDYXNlMU9rbUxlbmd0aF0gPSB7CisgICAgMHgzYywgMHhiMiwgMHg1ZiwgMHgyNSwgMHhmYSwgMHhhYywgMHhkNSwgMHg3YSwgMHg5MCwgMHg0MywgMHg0ZiwKKyAgICAweDY0LCAweGQwLCAweDM2LCAweDJmLCAweDJhLCAweDJkLCAweDJkLCAweDBhLCAweDkwLCAweGNmLCAweDFhLAorICAgIDB4NWEsIDB4NGMsIDB4NWQsIDB4YjAsIDB4MmQsIDB4NTYsIDB4ZWMsIDB4YzQsIDB4YzUsIDB4YmZ9OworCisvLyBFeHBlY3RlZCByZXN1bHRzIChiYXNlZCBvbiBKYXZhIFNlY3VyZU1lc3NhZ2UgY29kZWJhc2UpCitzdGF0aWMgdW5zaWduZWQgY29uc3QgaW50IGtIa2RmRXh0cmFjdEV4cGVjdGVkTGVuZ3RoID0gMzI7CitzdGF0aWMgdW5zaWduZWQgY29uc3QgY2hhciBrSGtkZkV4dHJhY3RFeHBlY3RlZFtrSGtkZkV4dHJhY3RFeHBlY3RlZExlbmd0aF0gPSB7CisgICAgMHgwNywgMHg3NywgMHgwOSwgMHgzNiwgMHgyYywgMHgyZSwgMHgzMiwgMHhkZiwgMHgwZCwgMHhkYywgMHgzZiwKKyAgICAweDBkLCAweGM0LCAweDdiLCAweGJhLCAweDYzLCAweDkwLCAweGI2LCAweGM3LCAweDNiLCAweGI1LCAweDBmLAorICAgIDB4OWMsIDB4MzEsIDB4MjIsIDB4ZWMsIDB4ODQsIDB4NGEsIDB4ZDcsIDB4YzIsIDB4YjMsIDB4ZTV9OworCisvLyBBRVMgVGVzdCBWZWN0b3JzCitzdGF0aWMgdW5zaWduZWQgY29uc3QgY2hhciBrQWVzQ2lwaGVydGV4dFszMl0gPSB7CisgICAgMHhmNSwgMHg4YywgMHg0YywgMHgwNCwgMHhkNiwgMHhlNSwgMHhmMSwgMHhiYSwgMHg3NywgMHg5ZSwgMHhhYiwKKyAgICAweGZiLCAweDVmLCAweDdiLCAweGZiLCAweGQ2LCAweDQ4LCAweDVhLCAweDVjLCAweDgxLCAweDUxLCAweDljLAorICAgIDB4ZjMsIDB4NzgsIDB4ZmEsIDB4MzYsIDB4ZDQsIDB4MmIsIDB4ODUsIDB4NDcsIDB4ZWQsIDB4YzB9OworCitzdGF0aWMgdW5zaWduZWQgY29uc3QgY2hhciBrQWVzUGxhaW50ZXh0WzE2XSA9IHsKKyAgICAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmF9OworCitzdGF0aWMgdW5zaWduZWQgY29uc3QgaW50IGtBZXNJdkxlbmd0aCA9IDE2Oworc3RhdGljIHVuc2lnbmVkIGNvbnN0IGNoYXIgS0Flc0l2W2tBZXNJdkxlbmd0aF0gPSB7CisgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGfTsKKworc3RhdGljIHVuc2lnbmVkIGNvbnN0IGNoYXIga0Flc0tleVszMl0gPSB7CisgICAgMHg2MCwgMHgzZCwgMHhlYiwgMHgxMCwgMHgxNSwgMHhjYSwgMHg3MSwgMHhiZSwgMHgyYiwgMHg3MywgMHhhZSwKKyAgICAweGYwLCAweDg1LCAweDdkLCAweDc3LCAweDgxLCAweDFmLCAweDM1LCAweDJjLCAweDA3LCAweDNiLCAweDYxLAorICAgIDB4MDgsIDB4ZDcsIDB4MmQsIDB4OTgsIDB4MTAsIDB4YTMsIDB4MDksIDB4MTQsIDB4ZGYsIDB4ZjR9OworCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3RTYWx0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHNhbHQgPSBDcnlwdG9PcHNUZXN0OjpTYWx0KCk7CisgIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gZXhwZWN0ZWRfc2FsdCA9CisgICAgICBDcnlwdG9PcHNUZXN0OjpTaGEyNTYoQnl0ZUJ1ZmZlcigiU2VjdXJlTWVzc2FnZSIpKTsKKworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc2FsdC0+c2l6ZSgpLCBDcnlwdG9PcHNUZXN0OjpTYWx0U2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoZXhwZWN0ZWRfc2FsdC0+RXF1YWxzKEJ5dGVCdWZmZXIoc2FsdCwgQ3J5cHRvT3BzVGVzdDo6U2FsdFNpemUoKSkpKTsKK30KKworVEVTVChDcnlwdG9PcHNUZXN0LCBUZXN0SGtkZkV4dHJhY3QpIHsKKyAgRVhQRUNUX0VRKGtIa2RmQ2FzZTFJa21MZW5ndGgsIHNpemVvZihrSGtkZkNhc2UxSWttKSk7CisgIEVYUEVDVF9FUShrSGtkZkNhc2UxU2FsdExlbmd0aCwgc2l6ZW9mKGtIa2RmQ2FzZTFTYWx0KSk7CisKKyAgQnl0ZUJ1ZmZlciBrZXlfZGF0YShrSGtkZkNhc2UxSWttLCBrSGtkZkNhc2UxSWttTGVuZ3RoKTsKKyAgQnl0ZUJ1ZmZlciBzYWx0KGtIa2RmQ2FzZTFTYWx0LCBrSGtkZkNhc2UxU2FsdExlbmd0aCk7CisKKyAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiByZXN1bHQgPQorICAgICAgQ3J5cHRvT3BzVGVzdDo6SGtkZlNoYTI1NkV4dHJhY3Qoa2V5X2RhdGEsIHNhbHQpOworCisgIEVYUEVDVF9ORShudWxscHRyLCByZXN1bHQpOworICBFWFBFQ1RfRVEoa0hrZGZFeHRyYWN0RXhwZWN0ZWRMZW5ndGgsIHJlc3VsdC0+c2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0LT5FcXVhbHMoCisgICAgICBCeXRlQnVmZmVyKGtIa2RmRXh0cmFjdEV4cGVjdGVkLCBrSGtkZkV4dHJhY3RFeHBlY3RlZExlbmd0aCkpKTsKK30KKworVEVTVChDcnlwdG9PcHNUZXN0LCBUZXN0SGtkZikgeworICBFWFBFQ1RfRVEoa0hrZGZDYXNlMUlrbUxlbmd0aCwgc2l6ZW9mKGtIa2RmQ2FzZTFJa20pKTsKKyAgRVhQRUNUX0VRKGtIa2RmQ2FzZTFTYWx0TGVuZ3RoLCBzaXplb2Yoa0hrZGZDYXNlMVNhbHQpKTsKKyAgRVhQRUNUX0VRKGtIa2RmQ2FzZTFJbmZvTGVuZ3RoLCBzaXplb2Yoa0hrZGZDYXNlMUluZm8pKTsKKworICBCeXRlQnVmZmVyIGtleV9kYXRhKGtIa2RmQ2FzZTFJa20sIGtIa2RmQ2FzZTFJa21MZW5ndGgpOworICBCeXRlQnVmZmVyIHNhbHQoa0hrZGZDYXNlMVNhbHQsIGtIa2RmQ2FzZTFTYWx0TGVuZ3RoKTsKKyAgQnl0ZUJ1ZmZlciBpbmZvKGtIa2RmQ2FzZTFJbmZvLCBrSGtkZkNhc2UxSW5mb0xlbmd0aCk7CisKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IHJlc3VsdCA9CisgICAgICBDcnlwdG9PcHM6OkhrZGYoa2V5X2RhdGEuU3RyaW5nKCksIHNhbHQuU3RyaW5nKCksIGluZm8uU3RyaW5nKCkpOworCisgIEVYUEVDVF9ORShudWxscHRyLCByZXN1bHQpOworICBFWFBFQ1RfRVEoa0hrZGZDYXNlMU9rbUxlbmd0aCwgcmVzdWx0LT5sZW5ndGgoKSk7CisgIEVYUEVDVF9UUlVFKEJ5dGVCdWZmZXIoa0hrZGZDYXNlMU9rbSwga0hrZGZDYXNlMU9rbUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgIC5FcXVhbHMoQnl0ZUJ1ZmZlcigqcmVzdWx0KSkpOworfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3REZXJpdmVBZXMyNTZLZXlGb3IpIHsKKyAgQ3J5cHRvT3BzOjpTZWNyZXRLZXkgYWVzS2V5MSgKKyAgICAgIHN0cmluZyhDcnlwdG9PcHNUZXN0OjpBZXNLZXlTaXplKCksIHN0YXRpY19jYXN0PGNoYXI+KDEpKSwKKyAgICAgIENyeXB0b09wczo6QUVTXzI1Nl9LRVkpOworICBDcnlwdG9PcHM6OlNlY3JldEtleSBhZXNLZXkyKAorICAgICAgc3RyaW5nKENyeXB0b09wc1Rlc3Q6OkFlc0tleVNpemUoKSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMikpLAorICAgICAgQ3J5cHRvT3BzOjpBRVNfMjU2X0tFWSk7CisKKyAgLy8gVGVzdCB0aGF0IGRlcml2aW5nIHdpdGggdGhlIHNhbWUga2V5IGFuZCBwdXJwb3NlIHR3aWNlIGlzIGRldGVybWluaXN0aWMKKyAgRVhQRUNUX0VRKENyeXB0b09wczo6RGVyaXZlQWVzMjU2S2V5Rm9yKGFlc0tleTEsICJBIiktPmRhdGEoKS5TdHJpbmcoKSwKKyAgICAgICAgICAgIENyeXB0b09wczo6RGVyaXZlQWVzMjU2S2V5Rm9yKGFlc0tleTEsICJBIiktPmRhdGEoKS5TdHJpbmcoKSk7CisKKyAgLy8gVGVzdCB0aGF0IGRlcml2ZWQga2V5cyB3aXRoIGRpZmZlcmVudCBwdXJwb3NlcyBkaWZmZXIKKyAgRVhQRUNUX05FKENyeXB0b09wczo6RGVyaXZlQWVzMjU2S2V5Rm9yKGFlc0tleTEsICJBIiktPmRhdGEoKS5TdHJpbmcoKSwKKyAgICAgICAgICAgIENyeXB0b09wczo6RGVyaXZlQWVzMjU2S2V5Rm9yKGFlc0tleTEsICJCIiktPmRhdGEoKS5TdHJpbmcoKSk7CisKKyAgLy8gVGVzdCB0aGF0IGRlcml2ZWQga2V5cyB3aXRoIHRoZSBzYW1lIHB1cnBvc2UgYnV0IGRpZmZlcmVudCBtYXN0ZXIga2V5cworICAvLyBkaWZmZXIKKyAgRVhQRUNUX05FKENyeXB0b09wczo6RGVyaXZlQWVzMjU2S2V5Rm9yKGFlc0tleTEsICJBIiktPmRhdGEoKS5TdHJpbmcoKSwKKyAgICAgICAgICAgIENyeXB0b09wczo6RGVyaXZlQWVzMjU2S2V5Rm9yKGFlc0tleTIsICJBIiktPmRhdGEoKS5TdHJpbmcoKSk7Cit9CisKK1RFU1QoQ3J5cHRvT3BzVGVzdCwgVGVzdEFlczI1NkNiY0VuY3J5cHREZWNyeXB0KSB7CisgIHN0cmluZyBwbGFpbnRleHQoMTYsIHN0YXRpY19jYXN0PGNoYXI+KDEpKTsKKyAgc3RyaW5nIGl2KDE2LCBzdGF0aWNfY2FzdDxjaGFyPigyKSk7CisgIHN0cmluZyBrZXkoMzIsIHN0YXRpY19jYXN0PGNoYXI+KDMpKTsKKyAgQ3J5cHRvT3BzOjpTZWNyZXRLZXkgYWVzS2V5KGtleSwgQ3J5cHRvT3BzOjpBRVNfMjU2X0tFWSk7CisKKyAgdW5pcXVlX3B0cjxCeXRlQnVmZmVyPiBjaXBoZXJ0ZXh0X3B0ciA9IENyeXB0b09wc1Rlc3Q6OkFlczI1NkNCQ0VuY3J5cHQoCisgICAgICBhZXNLZXksIEJ5dGVCdWZmZXIoaXYpLCBCeXRlQnVmZmVyKHBsYWludGV4dCkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgY2lwaGVydGV4dF9wdHIpOworICBFWFBFQ1RfTkUoY2lwaGVydGV4dF9wdHItPlN0cmluZygpLCBwbGFpbnRleHQpOworCisgIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gcGxhaW50ZXh0X3B0ciA9CisgICAgICBDcnlwdG9PcHNUZXN0OjpBZXMyNTZDQkNEZWNyeXB0KGFlc0tleSwgQnl0ZUJ1ZmZlcihpdiksICpjaXBoZXJ0ZXh0X3B0cik7CisgIEVYUEVDVF9ORShudWxscHRyLCBwbGFpbnRleHRfcHRyKTsKKyAgRVhQRUNUX0VRKHBsYWludGV4dCwgcGxhaW50ZXh0X3B0ci0+U3RyaW5nKCkpOworfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3RBZXMyNTZDYmNFbmNyeXB0RGVjcnlwdDIpIHsKKyAgLy8gRmlyc3QgdGVzdCB0aGUgZW5jcnlwdCBwb3J0aW9uIHVzaW5nIGtub3duIHZlY3RvcnMKKyAgQnl0ZUJ1ZmZlciBwbGFpbnRleHRfc3RyaW5nKGtBZXNQbGFpbnRleHQsIHNpemVvZihrQWVzUGxhaW50ZXh0KSk7CisgIEJ5dGVCdWZmZXIgaXZfc3RyaW5nKEtBZXNJdiwgc2l6ZW9mKEtBZXNJdikpOworICBCeXRlQnVmZmVyIGtleV9zdHJpbmcoa0Flc0tleSwgc2l6ZW9mKGtBZXNLZXkpKTsKKyAgQ3J5cHRvT3BzOjpTZWNyZXRLZXkgYWVzS2V5KGtleV9zdHJpbmcuU3RyaW5nKCksIENyeXB0b09wczo6QUVTXzI1Nl9LRVkpOworCisgIHVuaXF1ZV9wdHI8Qnl0ZUJ1ZmZlcj4gY2lwaGVydGV4dF9zdHJpbmcgPQorICAgICAgQ3J5cHRvT3BzVGVzdDo6QWVzMjU2Q0JDRW5jcnlwdChhZXNLZXksIGl2X3N0cmluZywgcGxhaW50ZXh0X3N0cmluZyk7CisKKyAgRVhQRUNUX05FKG51bGxwdHIsIGNpcGhlcnRleHRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoQnl0ZUJ1ZmZlcihrQWVzQ2lwaGVydGV4dCwgc2l6ZW9mKGtBZXNDaXBoZXJ0ZXh0KSkKKyAgICAgICAgICAgICAgICAgIC5FcXVhbHMoKmNpcGhlcnRleHRfc3RyaW5nKSk7CisKKyAgLy8gTm93IHRlc3QgdGhlIGRlY3J5cHQgcG9ydGlvbgorICB1bmlxdWVfcHRyPEJ5dGVCdWZmZXI+IHBsYWludGV4dF9wdHIgPQorICAgICAgQ3J5cHRvT3BzVGVzdDo6QWVzMjU2Q0JDRGVjcnlwdChhZXNLZXksIGl2X3N0cmluZywgKmNpcGhlcnRleHRfc3RyaW5nKTsKKworICBFWFBFQ1RfTkUobnVsbHB0ciwgcGxhaW50ZXh0X3B0cik7CisgIEVYUEVDVF9UUlVFKAorICAgICAgcGxhaW50ZXh0X3B0ci0+RXF1YWxzKEJ5dGVCdWZmZXIoa0Flc1BsYWludGV4dCwgc2l6ZW9mKGtBZXNQbGFpbnRleHQpKSkpOworfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3RFbmNyeXB0RGVjcnlwdCkgeworICBCeXRlQnVmZmVyIHBsYWludGV4dCgiSGVsbG8gV29ybGQhIik7CisgIEJ5dGVCdWZmZXIga2V5KCI1dXBlciA1ZWNyZXQiKTsKKworICAvLyBDcmVhdGUgYSBib2d1cyBpdiB3aXRoIDE2IGJ5dGVzIG9mIHRoZSBudW1iZXIgNDIuCisgIEJ5dGVCdWZmZXIgaXYoc3RyaW5nKDE2LCBzdGF0aWNfY2FzdDxjaGFyPig0MikpKTsKKworICBDcnlwdG9PcHM6OlNlY3JldEtleSBhZXNLZXkoa2V5LlN0cmluZygpLCBDcnlwdG9PcHM6OkFFU18yNTZfS0VZKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGNpcGhlcnRleHRfcHRyID0gQ3J5cHRvT3BzOjpFbmNyeXB0KAorICAgICAgYWVzS2V5LCBDcnlwdG9PcHM6OkFFU18yNTZfQ0JDLCBpdi5TdHJpbmcoKSwgcGxhaW50ZXh0LlN0cmluZygpKTsKKworICBFWFBFQ1RfTkUobnVsbHB0ciwgY2lwaGVydGV4dF9wdHIpOworICBFWFBFQ1RfTkUocGxhaW50ZXh0LlN0cmluZygpLCAqY2lwaGVydGV4dF9wdHIpOworCisgIGl2ID0gQnl0ZUJ1ZmZlcihzdHJpbmcoMTYsIDQyKSk7CisgIHVuaXF1ZV9wdHI8c3RyaW5nPiBwbGFpbnRleHRfcHRyID0gQ3J5cHRvT3BzOjpEZWNyeXB0KAorICAgICAgYWVzS2V5LCBDcnlwdG9PcHM6OkFFU18yNTZfQ0JDLCBpdi5TdHJpbmcoKSwgKmNpcGhlcnRleHRfcHRyKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBsYWludGV4dF9wdHIpOworICBFWFBFQ1RfRVEocGxhaW50ZXh0LlN0cmluZygpLCAqcGxhaW50ZXh0X3B0cik7Cit9CisKK1RFU1QoQ3J5cHRvT3BzVGVzdCwgVGVzdEVuY3J5cHREZWNyeXB0RW1wdHkpIHsKKyAgQnl0ZUJ1ZmZlciBwbGFpbnRleHQ7CisgIEJ5dGVCdWZmZXIga2V5KCI1dXBlciA1ZWNyZXQiKTsKKyAgQnl0ZUJ1ZmZlciBpdihzdHJpbmcoa0Flc0l2TGVuZ3RoLCBzdGF0aWNfY2FzdDxjaGFyPig0MikpKTsKKworICBDcnlwdG9PcHM6OlNlY3JldEtleSBhZXNLZXkoa2V5LlN0cmluZygpLCBDcnlwdG9PcHM6OkFFU18yNTZfS0VZKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGNpcGhlcnRleHRfcHRyID0gQ3J5cHRvT3BzOjpFbmNyeXB0KAorICAgICAgYWVzS2V5LCBDcnlwdG9PcHM6OkFFU18yNTZfQ0JDLCBpdi5TdHJpbmcoKSwgcGxhaW50ZXh0LlN0cmluZygpKTsKKworICBFWFBFQ1RfTkUobnVsbHB0ciwgY2lwaGVydGV4dF9wdHIpOworICBFWFBFQ1RfTkUocGxhaW50ZXh0LlN0cmluZygpLCAqY2lwaGVydGV4dF9wdHIpOworCisgIGl2ID0gQnl0ZUJ1ZmZlcihzdHJpbmcoa0Flc0l2TGVuZ3RoLCBzdGF0aWNfY2FzdDxjaGFyPig0MikpKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IHBsYWludGV4dF9wdHIgPSBDcnlwdG9PcHM6OkRlY3J5cHQoCisgICAgICBhZXNLZXksIENyeXB0b09wczo6QUVTXzI1Nl9DQkMsIGl2LlN0cmluZygpLCAqY2lwaGVydGV4dF9wdHIpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgcGxhaW50ZXh0X3B0cik7CisgIEVYUEVDVF9FUSgoc2l6ZV90KTAsIHBsYWludGV4dF9wdHItPnNpemUoKSk7Cit9CisKK1RFU1QoQ3J5cHRvT3BzVGVzdCwgVGVzdEdlbmVyYXRlSVYpIHsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGl2MSA9IENyeXB0b09wczo6R2VuZXJhdGVJdihDcnlwdG9PcHM6OkFFU18yNTZfQ0JDKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGl2MiA9IENyeXB0b09wczo6R2VuZXJhdGVJdihDcnlwdG9PcHM6OkFFU18yNTZfQ0JDKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IGl2MyA9IENyeXB0b09wczo6R2VuZXJhdGVJdihDcnlwdG9PcHM6Ok5PTkUpOworCisgIEVYUEVDVF9ORShudWxscHRyLCBpdjEpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgaXYyKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGl2Myk7CisKKyAgRVhQRUNUX0VRKGtBZXNJdkxlbmd0aCwgaXYxLT5sZW5ndGgoKSk7CisgIEVYUEVDVF9FUShrQWVzSXZMZW5ndGgsIGl2Mi0+bGVuZ3RoKCkpOworCisgIEVYUEVDVF9ORSgwLCBpdjEtPmNvbXBhcmUoKml2MikpOworfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3ROb1B1cnBvc2VDb25mbGljdHMpIHsKKyAgLy8gRW5zdXJlIHRoYXQgc2lnbmF0dXJlIGFsZ29yaXRobXMgYW5kIGVuY3J5cHRpb24gYWxnb3JpdGhtcyBhcmUgbm90IGdpdmVuCisgIC8vIGlkZW50aWNhbCBwdXJwb3NlcyAodGhpcyBwcmV2ZW50cyBjb25mdXNpb24gb2YgZGVyaXZlZCBrZXlzKS4KKyAgZm9yIChpbnQgc2lnX3R5cGUgPSAwOyBzaWdfdHlwZSA8IENyeXB0b09wczo6U2lnVHlwZTo6U0lHX1RZUEVfRU5EOworICAgICAgIHNpZ190eXBlKyspIHsKKyAgICBmb3IgKGludCBlbmNfdHlwZSA9IDA7IGVuY190eXBlIDwgQ3J5cHRvT3BzOjpFbmNUeXBlOjpFTkNfVFlQRV9FTkQ7CisgICAgICAgICBlbmNfdHlwZSsrKSB7CisgICAgICBFWFBFQ1RfRkFMU0UoQ3J5cHRvT3BzVGVzdDo6R2V0UHVycG9zZSgoQ3J5cHRvT3BzOjpTaWdUeXBlKXNpZ190eXBlKSA9PQorICAgICAgICAgICAgICAgICAgIENyeXB0b09wc1Rlc3Q6OkdldFB1cnBvc2UoKENyeXB0b09wczo6RW5jVHlwZSllbmNfdHlwZSkpOworICAgIH0KKyAgfQorfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3RTaWduVmVyaWZ5SG1hY1NoYTI1NikgeworICAvLyBUZXN0IENhc2UgMSBmcm9tIFJGQzQyMzEKKyAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGp1c3QgdXNlIHRoZSBzdGFuZGFyZCBleHBlY3RlZCBzaWduYXR1cmUgc2luY2Ugb3VyCisgIC8vIHNpZ24oKSBmdW5jdGlvbiBpbnRlcm5hbGx5IGRlcml2ZXMgYSBrZXkgZnJvbSB0aGUgb3JpZ2luYWwga2V5LiAgU28KKyAgLy8gaW5zdGVhZCwgd2UncmUgdGVzdGluZyB0aGUgb3V0cHV0IGFnYWluc3QgYSBrbm93biBnb29kIG91dHB1dCBmcm9tIHRoZQorICAvLyBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHNlY3VyZW1lc3NhZ2UuCisgIHN0cmluZyBrZXlfc3RyaW5nKDIwLCBzdGF0aWNfY2FzdDxjaGFyPigweDBiKSk7CisgIHN0cmluZyBkYXRhX3N0cmluZygiSGkgVGhlcmUiKTsKKyAgdW5zaWduZWQgY2hhciBleHBlY3RlZF9zaWduYXR1cmVbMzJdID0geworICAgICAgMHgzYiwgMHgxNCwgMHg3YiwgMHgwZiwgMHhlNiwgMHg2YSwgMHgwMCwgMHg0NywgMHhhMiwgMHg2MCwgMHg0YywKKyAgICAgIDB4ZjIsIDB4NjQsIDB4MjksIDB4YWQsIDB4MDcsIDB4NWQsIDB4ODYsIDB4OGIsIDB4MDEsIDB4ZGIsIDB4MTEsCisgICAgICAweGVmLCAweDZmLCAweDRlLCAweGMyLCAweDJkLCAweDhiLCAweGRiLCAweDY2LCAweGYxLCAweDhjfTsKKyAgQ3J5cHRvT3BzOjpTZWNyZXRLZXkgc2VjcmV0X2tleShrZXlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b09wczo6S2V5QWxnb3JpdGhtOjpBRVNfMjU2X0tFWSk7CisgIHVuaXF1ZV9wdHI8c3RyaW5nPiBzaWduYXR1cmUgPQorICAgICAgQ3J5cHRvT3BzOjpTaWduKENyeXB0b09wczo6U2lnVHlwZTo6SE1BQ19TSEEyNTYsIHNlY3JldF9rZXksIGRhdGFfc3RyaW5nKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNpZ25hdHVyZSk7CisgIEVYUEVDVF9FUSgoc2l6ZV90KTMyLCBzaWduYXR1cmUtPmxlbmd0aCgpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBCeXRlQnVmZmVyKGV4cGVjdGVkX3NpZ25hdHVyZSwgMzIpLkVxdWFscyhCeXRlQnVmZmVyKCpzaWduYXR1cmUpKSk7CisKKyAgRVhQRUNUX1RSVUUoQ3J5cHRvT3BzOjpWZXJpZnkoQ3J5cHRvT3BzOjpTaWdUeXBlOjpITUFDX1NIQTI1Niwgc2VjcmV0X2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hdHVyZSwgZGF0YV9zdHJpbmcpKTsKK30KKworVEVTVChDcnlwdG9PcHNUZXN0LCBUZXN0U2lnblZlcmlmeUVjZHNhUDI1NnNoYTI1NikgeworICAvLyBXZSBkb24ndCByZWFsbHkgdGVzdCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc2lnbmF0dXJlIGlzIGdlbmVyYXRlZAorICAvLyBhbmQgdmVyaWZpZWQgd2l0aCBubyBlcnJvcnMKKyAgLy8gV2UgdXNlIHNhbXBsZSBwcmVnZW5lcmF0ZWQga2V5cy4gIEJlbG93IGFyZSB0aGVpciBieXRlIHJlcHJlc2VudGF0aW9ucyBpbgorICAvLyBQS0NTOCBmb3JtYXQKKyAgdW5zaWduZWQgY29uc3QgY2hhciBwdWJsaWNfa2V5X2J5dGVzWzMzNV0gPSB7CisgICAgICAweDMwLCAweDgyLCAweDAxLCAweDRiLCAweDMwLCAweDgyLCAweDAxLCAweDAzLCAweDA2LCAweDA3LCAweDJhLCAweDg2LAorICAgICAgMHg0OCwgMHhjZSwgMHgzZCwgMHgwMiwgMHgwMSwgMHgzMCwgMHg4MSwgMHhmNywgMHgwMiwgMHgwMSwgMHgwMSwgMHgzMCwKKyAgICAgIDB4MmMsIDB4MDYsIDB4MDcsIDB4MmEsIDB4ODYsIDB4NDgsIDB4Y2UsIDB4M2QsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjEsCisgICAgICAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzAsIDB4NWIsIDB4MDQsCisgICAgICAweDIwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmMsIDB4MDQsIDB4MjAsIDB4NWEsCisgICAgICAweGM2LCAweDM1LCAweGQ4LCAweGFhLCAweDNhLCAweDkzLCAweGU3LCAweGIzLCAweGViLCAweGJkLCAweDU1LCAweDc2LAorICAgICAgMHg5OCwgMHg4NiwgMHhiYywgMHg2NSwgMHgxZCwgMHgwNiwgMHhiMCwgMHhjYywgMHg1MywgMHhiMCwgMHhmNiwgMHgzYiwKKyAgICAgIDB4Y2UsIDB4M2MsIDB4M2UsIDB4MjcsIDB4ZDIsIDB4NjAsIDB4NGIsIDB4MDMsIDB4MTUsIDB4MDAsIDB4YzQsIDB4OWQsCisgICAgICAweDM2LCAweDA4LCAweDg2LCAweGU3LCAweDA0LCAweDkzLCAweDZhLCAweDY2LCAweDc4LCAweGUxLCAweDEzLCAweDlkLAorICAgICAgMHgyNiwgMHhiNywgMHg4MSwgMHg5ZiwgMHg3ZSwgMHg5MCwgMHgwNCwgMHg0MSwgMHgwNCwgMHg2YiwgMHgxNywgMHhkMSwKKyAgICAgIDB4ZjIsIDB4ZTEsIDB4MmMsIDB4NDIsIDB4NDcsIDB4ZjgsIDB4YmMsIDB4ZTYsIDB4ZTUsIDB4NjMsIDB4YTQsIDB4NDAsCisgICAgICAweGYyLCAweDc3LCAweDAzLCAweDdkLCAweDgxLCAweDJkLCAweGViLCAweDMzLCAweGEwLCAweGY0LCAweGExLCAweDM5LAorICAgICAgMHg0NSwgMHhkOCwgMHg5OCwgMHhjMiwgMHg5NiwgMHg0ZiwgMHhlMywgMHg0MiwgMHhlMiwgMHhmZSwgMHgxYSwgMHg3ZiwKKyAgICAgIDB4OWIsIDB4OGUsIDB4ZTcsIDB4ZWIsIDB4NGEsIDB4N2MsIDB4MGYsIDB4OWUsIDB4MTYsIDB4MmIsIDB4Y2UsIDB4MzMsCisgICAgICAweDU3LCAweDZiLCAweDMxLCAweDVlLCAweGNlLCAweGNiLCAweGI2LCAweDQwLCAweDY4LCAweDM3LCAweGJmLCAweDUxLAorICAgICAgMHhmNSwgMHgwMiwgMHgyMSwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YmMsIDB4ZTYsIDB4ZmEsIDB4YWQsCisgICAgICAweGE3LCAweDE3LCAweDllLCAweDg0LCAweGYzLCAweGI5LCAweGNhLCAweGMyLCAweGZjLCAweDYzLCAweDI1LCAweDUxLAorICAgICAgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMywgMHg0MiwgMHgwMCwgMHgwNCwgMHhhOSwgMHhhMywgMHg3NiwgMHhjMiwgMHhiMCwKKyAgICAgIDB4MGQsIDB4YTEsIDB4NGEsIDB4ZTgsIDB4NjAsIDB4MWYsIDB4MTksIDB4YzcsIDB4YmYsIDB4MWYsIDB4NmMsIDB4MzQsCisgICAgICAweGZkLCAweDdiLCAweGUxLCAweDIwLCAweDM3LCAweDQ5LCAweDIwLCAweDRhLCAweGNkLCAweGVjLCAweDFkLCAweDRhLAorICAgICAgMHhjMywgMHg3MSwgMHhhMSwgMHhiYiwgMHgyZiwgMHhkZiwgMHg1ZCwgMHgwMywgMHhjZCwgMHhlNCwgMHgyNSwgMHgzMywKKyAgICAgIDB4ZDMsIDB4NmUsIDB4YzMsIDB4ZjksIDB4ZTQsIDB4OTIsIDB4ZjUsIDB4MjEsIDB4OWIsIDB4NDEsIDB4ZjEsIDB4YjMsCisgICAgICAweDYxLCAweDVhLCAweGEwLCAweGM0LCAweGU4LCAweGY3LCAweDY3LCAweDIyLCAweGFjLCAweDQ0LCAweGNifTsKKworICB1bnNpZ25lZCBjb25zdCBjaGFyIHByaXZhdGVfa2V5X2J5dGVzWzM4MV0gPSB7CisgICAgICAweDMwLCAweDgyLCAweDAxLCAweDc5LCAweDAyLCAweDAxLCAweDAwLCAweDMwLCAweDgyLCAweDAxLCAweDAzLCAweDA2LAorICAgICAgMHgwNywgMHgyYSwgMHg4NiwgMHg0OCwgMHhjZSwgMHgzZCwgMHgwMiwgMHgwMSwgMHgzMCwgMHg4MSwgMHhmNywgMHgwMiwKKyAgICAgIDB4MDEsIDB4MDEsIDB4MzAsIDB4MmMsIDB4MDYsIDB4MDcsIDB4MmEsIDB4ODYsIDB4NDgsIDB4Y2UsIDB4M2QsIDB4MDEsCisgICAgICAweDAxLCAweDAyLCAweDIxLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgICAweDMwLCAweDViLCAweDA0LCAweDIwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmMsCisgICAgICAweDA0LCAweDIwLCAweDVhLCAweGM2LCAweDM1LCAweGQ4LCAweGFhLCAweDNhLCAweDkzLCAweGU3LCAweGIzLCAweGViLAorICAgICAgMHhiZCwgMHg1NSwgMHg3NiwgMHg5OCwgMHg4NiwgMHhiYywgMHg2NSwgMHgxZCwgMHgwNiwgMHhiMCwgMHhjYywgMHg1MywKKyAgICAgIDB4YjAsIDB4ZjYsIDB4M2IsIDB4Y2UsIDB4M2MsIDB4M2UsIDB4MjcsIDB4ZDIsIDB4NjAsIDB4NGIsIDB4MDMsIDB4MTUsCisgICAgICAweDAwLCAweGM0LCAweDlkLCAweDM2LCAweDA4LCAweDg2LCAweGU3LCAweDA0LCAweDkzLCAweDZhLCAweDY2LCAweDc4LAorICAgICAgMHhlMSwgMHgxMywgMHg5ZCwgMHgyNiwgMHhiNywgMHg4MSwgMHg5ZiwgMHg3ZSwgMHg5MCwgMHgwNCwgMHg0MSwgMHgwNCwKKyAgICAgIDB4NmIsIDB4MTcsIDB4ZDEsIDB4ZjIsIDB4ZTEsIDB4MmMsIDB4NDIsIDB4NDcsIDB4ZjgsIDB4YmMsIDB4ZTYsIDB4ZTUsCisgICAgICAweDYzLCAweGE0LCAweDQwLCAweGYyLCAweDc3LCAweDAzLCAweDdkLCAweDgxLCAweDJkLCAweGViLCAweDMzLCAweGEwLAorICAgICAgMHhmNCwgMHhhMSwgMHgzOSwgMHg0NSwgMHhkOCwgMHg5OCwgMHhjMiwgMHg5NiwgMHg0ZiwgMHhlMywgMHg0MiwgMHhlMiwKKyAgICAgIDB4ZmUsIDB4MWEsIDB4N2YsIDB4OWIsIDB4OGUsIDB4ZTcsIDB4ZWIsIDB4NGEsIDB4N2MsIDB4MGYsIDB4OWUsIDB4MTYsCisgICAgICAweDJiLCAweGNlLCAweDMzLCAweDU3LCAweDZiLCAweDMxLCAweDVlLCAweGNlLCAweGNiLCAweGI2LCAweDQwLCAweDY4LAorICAgICAgMHgzNywgMHhiZiwgMHg1MSwgMHhmNSwgMHgwMiwgMHgyMSwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YmMsCisgICAgICAweGU2LCAweGZhLCAweGFkLCAweGE3LCAweDE3LCAweDllLCAweDg0LCAweGYzLCAweGI5LCAweGNhLCAweGMyLCAweGZjLAorICAgICAgMHg2MywgMHgyNSwgMHg1MSwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwNCwgMHg2ZCwgMHgzMCwgMHg2YiwgMHgwMiwgMHgwMSwKKyAgICAgIDB4MDEsIDB4MDQsIDB4MjAsIDB4MWEsIDB4ZjQsIDB4MzksIDB4ODgsIDB4NzUsIDB4NjYsIDB4OTEsIDB4ZWYsIDB4YmUsCisgICAgICAweDU3LCAweGZhLCAweGY1LCAweDc1LCAweGQ0LCAweGMxLCAweGM4LCAweGJiLCAweDhlLCAweGIyLCAweDBhLCAweDU5LAorICAgICAgMHhjMywgMHg4OSwgMHhkMSwgMHg4YiwgMHhjNiwgMHgyYiwgMHhhNSwgMHgwYywgMHg5OCwgMHhjNywgMHg0OCwgMHhhMSwKKyAgICAgIDB4NDQsIDB4MDMsIDB4NDIsIDB4MDAsIDB4MDQsIDB4YTksIDB4YTMsIDB4NzYsIDB4YzIsIDB4YjAsIDB4MGQsIDB4YTEsCisgICAgICAweDRhLCAweGU4LCAweDYwLCAweDFmLCAweDE5LCAweGM3LCAweGJmLCAweDFmLCAweDZjLCAweDM0LCAweGZkLCAweDdiLAorICAgICAgMHhlMSwgMHgyMCwgMHgzNywgMHg0OSwgMHgyMCwgMHg0YSwgMHhjZCwgMHhlYywgMHgxZCwgMHg0YSwgMHhjMywgMHg3MSwKKyAgICAgIDB4YTEsIDB4YmIsIDB4MmYsIDB4ZGYsIDB4NWQsIDB4MDMsIDB4Y2QsIDB4ZTQsIDB4MjUsIDB4MzMsIDB4ZDMsIDB4NmUsCisgICAgICAweGMzLCAweGY5LCAweGU0LCAweDkyLCAweGY1LCAweDIxLCAweDliLCAweDQxLCAweGYxLCAweGIzLCAweDYxLCAweDVhLAorICAgICAgMHhhMCwgMHhjNCwgMHhlOCwgMHhmNywgMHg2NywgMHgyMiwgMHhhYywgMHg0NCwgMHhjYn07CisKKyAgc3RyaW5nIGRhdGFfc3RyaW5nKCJIaSBUaGVyZSIpOworCisgIC8vIFRlc3QgU2lnbmluZworICBDcnlwdG9PcHM6OlByaXZhdGVLZXkgcHJpdmF0ZV9rZXkoc3RyaW5nKChjb25zdCBjaGFyKilwcml2YXRlX2tleV9ieXRlcywgMzgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b09wczo6S2V5QWxnb3JpdGhtOjpFQ0RTQV9LRVkpOworICB1bmlxdWVfcHRyPHN0cmluZz4gc2lnbmF0dXJlID0gQ3J5cHRvT3BzOjpTaWduKAorICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlOjpFQ0RTQV9QMjU2X1NIQTI1NiwgcHJpdmF0ZV9rZXksIGRhdGFfc3RyaW5nKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNpZ25hdHVyZSk7CisKKyAgLy8gVGVzdCBWZXJpZnlpbmcKKyAgQ3J5cHRvT3BzOjpQdWJsaWNLZXkgcHVibGljX2tleShzdHJpbmcoKGNvbnN0IGNoYXIqKXB1YmxpY19rZXlfYnl0ZXMsIDMzNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpLZXlBbGdvcml0aG06OkVDRFNBX0tFWSk7CisgIGJvb2wgc2lnbmF0dXJlX3ZlcmlmaWVzID0KKyAgICAgIENyeXB0b09wczo6VmVyaWZ5KENyeXB0b09wczo6U2lnVHlwZTo6RUNEU0FfUDI1Nl9TSEEyNTYsIHB1YmxpY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLCBkYXRhX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHNpZ25hdHVyZV92ZXJpZmllcyk7Cit9CisKK1RFU1QoQ3J5cHRvT3BzVGVzdCwgVGVzdFNpZ25WZXJpZnlSc2EyMDQ4U2hhMjU2KSB7CisgIC8vIFdlIGRvbid0IHJlYWxseSB0ZXN0IGFueXRoaW5nIG90aGVyIHRoYW4gYSBzaWduYXR1cmUgaXMgZ2VuZXJhdGVkCisgIC8vIGFuZCBubyBlcnJvciBvY2N1cnMKKworICAvLyBXZSB1c2UgYSB2YWxpZCBwcmUtY29tcHV0ZWQga2V5cworICBjb25zdCB1aW50OF90IHByaXZhdGVfa2V5X2J5dGVzWzExOTNdID0geworICAgICAgMHgzMCwgMHg4MiwgMHgwNCwgMHhhNSwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMiwgMHg4MiwgMHgwMSwgMHgwMSwgMHgwMCwKKyAgICAgIDB4OTksIDB4YTUsIDB4NDgsIDB4MTYsIDB4NDAsIDB4MTksIDB4MWUsIDB4Y2MsIDB4NzgsIDB4Y2YsIDB4NTMsIDB4ZDAsCisgICAgICAweDYxLCAweDgzLCAweDNiLCAweGZjLCAweDVkLCAweGI5LCAweDJlLCAweDlhLCAweGZhLCAweDA0LCAweDEwLCAweGZiLAorICAgICAgMHg2NSwgMHhkMSwgMHhlZiwgMHg3YiwgMHgyYywgMHg3NCwgMHgyNSwgMHhmMywgMHg3OSwgMHg2YSwgMHhmNiwgMHgzZiwKKyAgICAgIDB4ZTcsIDB4MzYsIDB4YmQsIDB4NTUsIDB4YjQsIDB4OTYsIDB4MGIsIDB4OTUsIDB4OGUsIDB4MDcsIDB4MWEsIDB4YmQsCisgICAgICAweDM1LCAweDQ0LCAweGU1LCAweGY4LCAweDZmLCAweGQ1LCAweGE3LCAweDg1LCAweDc3LCAweDQzLCAweGY5LCAweGE0LAorICAgICAgMHgxYSwgMHg3OCwgMHhiOCwgMHhjZiwgMHg2MiwgMHhjOCwgMHgyYSwgMHg4OCwgMHg0NywgMHgzYSwgMHg0ZiwgMHhkNiwKKyAgICAgIDB4M2IsIDB4MjEsIDB4MmIsIDB4YjIsIDB4NmUsIDB4ZWEsIDB4MTMsIDB4ZGQsIDB4ZGUsIDB4ZjQsIDB4NTUsIDB4ZjQsCisgICAgICAweDRiLCAweDU3LCAweDExLCAweGYzLCAweGIzLCAweDkyLCAweGQ2LCAweGNlLCAweDU3LCAweDI4LCAweDllLCAweDg1LAorICAgICAgMHhiYSwgMHg3OSwgMHgzYiwgMHhiYiwgMHgwYiwgMHgzNSwgMHg3YSwgMHhhNCwgMHg2OSwgMHg4NCwgMHgxZiwgMHhiZSwKKyAgICAgIDB4ODksIDB4MzUsIDB4YmQsIDB4MDIsIDB4MjUsIDB4MjgsIDB4ZWMsIDB4NmYsIDB4ZWIsIDB4M2QsIDB4MGEsIDB4YjAsCisgICAgICAweDAyLCAweDZiLCAweDRiLCAweGRiLCAweGQyLCAweDdjLCAweDRlLCAweGVkLCAweDQ0LCAweDRmLCAweGExLCAweGU2LAorICAgICAgMHhkOSwgMHhjNCwgMHhmNywgMHhlNywgMHg3ZCwgMHg2ZCwgMHgwNiwgMHhmOSwgMHg1YSwgMHg2YywgMHhmMCwgMHg0OCwKKyAgICAgIDB4YzQsIDB4MWQsIDB4ZjksIDB4ZTcsIDB4MjgsIDB4YzcsIDB4NzUsIDB4YTIsIDB4NGEsIDB4YTEsIDB4MzUsIDB4NWEsCisgICAgICAweGFkLCAweDBmLCAweDFhLCAweDljLCAweDcwLCAweDk4LCAweGNiLCAweGZjLCAweDQ4LCAweGFiLCAweGY1LCAweGM2LAorICAgICAgMHhhNCwgMHg5NCwgMHhhNiwgMHg5YiwgMHg2NCwgMHgwNiwgMHgwZSwgMHhiOSwgMHgzOCwgMHhhOSwgMHg4NCwgMHgzMiwKKyAgICAgIDB4MzgsIDB4MTMsIDB4ODQsIDB4NzAsIDB4OTksIDB4NzksIDB4MjUsIDB4ZmUsIDB4MmMsIDB4YzAsIDB4ZGUsIDB4ZWMsCisgICAgICAweDlmLCAweDk5LCAweDUxLCAweDRmLCAweGZjLCAweGFjLCAweGU4LCAweDBkLCAweDg3LCAweDZkLCAweDQzLCAweDhiLAorICAgICAgMHgyNSwgMHhhNywgMHg1NCwgMHg0NywgMHg0MiwgMHhmZSwgMHhlMiwgMHg2NywgMHhmZiwgMHhjMiwgMHg4ZiwgMHgxYiwKKyAgICAgIDB4MGUsIDB4MWEsIDB4MjQsIDB4ZGYsIDB4YTcsIDB4NDAsIDB4Y2QsIDB4YTQsIDB4YTIsIDB4YjQsIDB4YWQsIDB4NDMsCisgICAgICAweDcyLCAweGJjLCAweDhkLCAweGMwLCAweDFkLCAweGUwLCAweDc3LCAweDc2LCAweDRiLCAweGUwLCAweGMyLCAweDMyLAorICAgICAgMHg3YSwgMHg1NywgMHgzMywgMHhlZSwgMHhhOCwgMHg5YywgMHhmYSwgMHg0OSwgMHg2NywgMHg0MiwgMHgxNSwgMHgzMSwKKyAgICAgIDB4MGUsIDB4ZDAsIDB4YzIsIDB4N2IsIDB4MDIsIDB4MDMsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDIsIDB4ODIsIDB4MDEsCisgICAgICAweDAxLCAweDAwLCAweDkwLCAweDIxLCAweDMxLCAweGZjLCAweDVkLCAweDY4LCAweGIzLCAweDMxLCAweDkwLCAweDZhLAorICAgICAgMHhiYywgMHhlZiwgMHgwZiwgMHg2YSwgMHg3MiwgMHg0ZCwgMHgwZCwgMHgwNiwgMHg3OCwgMHgyNywgMHhiZCwgMHgzZCwKKyAgICAgIDB4MmYsIDB4NDksIDB4MDUsIDB4N2MsIDB4ZTgsIDB4MzAsIDB4MWQsIDB4YzUsIDB4NWYsIDB4MGMsIDB4ODQsIDB4ZWIsCisgICAgICAweGM3LCAweGQwLCAweGFlLCAweDZlLCAweGY1LCAweDMxLCAweDdlLCAweGQzLCAweGZhLCAweDRkLCAweGYzLCAweDBiLAorICAgICAgMHhjYiwgMHgxMywgMHg4ZSwgMHhmMiwgMHhmMCwgMHhlMCwgMHgxYSwgMHhkOCwgMHhjYiwgMHhlYiwgMHgzMSwgMHhiNCwKKyAgICAgIDB4M2MsIDB4NmMsIDB4YWEsIDB4YzAsIDB4NzAsIDB4NmQsIDB4NmEsIDB4ZjYsIDB4ZTYsIDB4OWYsIDB4MmMsIDB4NjIsCisgICAgICAweDExLCAweDFlLCAweGEwLCAweDFkLCAweDNmLCAweGM2LCAweDg0LCAweGIxLCAweDY0LCAweGFkLCAweDhmLCAweDQ2LAorICAgICAgMHg5OSwgMHg5MywgMHgyZiwgMHg1MSwgMHhhMCwgMHg2ZiwgMHg4MiwgMHgxNiwgMHhjZiwgMHgxNiwgMHg4NSwgMHg0MCwKKyAgICAgIDB4N2YsIDB4NjQsIDB4NjcsIDB4NDYsIDB4ZWUsIDB4YjcsIDB4NDksIDB4OGUsIDB4ODMsIDB4NWIsIDB4ZDMsIDB4ZjcsCisgICAgICAweGIzLCAweDY3LCAweGEzLCAweDgzLCAweDFiLCAweGE4LCAweGY1LCAweDdlLCAweGVjLCAweDNkLCAweDE4LCAweGU5LAorICAgICAgMHgwYywgMHgyYiwgMHg4YywgMHgzOSwgMHg2NiwgMHhkMSwgMHhmMSwgMHgyMywgMHhkNywgMHg0YywgMHhkYiwgMHhjMCwKKyAgICAgIDB4NzksIDB4YjEsIDB4MjEsIDB4ODAsIDB4ZTYsIDB4ZDIsIDB4NTcsIDB4YjcsIDB4ZGIsIDB4MTcsIDB4ZDgsIDB4YzAsCisgICAgICAweGYxLCAweDM4LCAweDRkLCAweDY5LCAweGY3LCAweDhjLCAweGI4LCAweGI4LCAweGM5LCAweDA2LCAweGMyLCAweDAxLAorICAgICAgMHg3MiwgMHg5NywgMHhmMSwgMHg1ZiwgMHg2OSwgMHgzYSwgMHgyOSwgMHg3YSwgMHhlOSwgMHg0NCwgMHhmMiwgMHg4OCwKKyAgICAgIDB4YzksIDB4ODEsIDB4NDIsIDB4MTQsIDB4M2YsIDB4MDYsIDB4MmYsIDB4M2UsIDB4YzAsIDB4Y2EsIDB4NGMsIDB4YzgsCisgICAgICAweGNjLCAweGNhLCAweGExLCAweGY3LCAweDI5LCAweDA1LCAweDNiLCAweGY1LCAweDA1LCAweDNmLCAweDNkLCAweGRlLAorICAgICAgMHhiYSwgMHgxMCwgMHg1NSwgMHgyOSwgMHhiZSwgMHgyYSwgMHhlZiwgMHgxYywgMHg3ZCwgMHhhYSwgMHhmZiwgMHg5OCwKKyAgICAgIDB4MWEsIDB4N2QsIDB4ZjUsIDB4YjQsIDB4MWMsIDB4ZTYsIDB4MWEsIDB4MzAsIDB4OTcsIDB4MzUsIDB4MDQsIDB4MDMsCisgICAgICAweDVjLCAweDM2LCAweGNhLCAweDEwLCAweDJhLCAweGJmLCAweDZjLCAweGJjLCAweGJkLCAweDQ0LCAweGI4LCAweDI4LAorICAgICAgMHhlNSwgMHgyMSwgMHg0MiwgMHhmNiwgMHg0YSwgMHgxNywgMHhhNywgMHg4NSwgMHgzNywgMHg3NiwgMHhjMywgMHg4YSwKKyAgICAgIDB4MDUsIDB4NzksIDB4NmYsIDB4NWQsIDB4ODksIDB4OGQsIDB4ZDQsIDB4MTIsIDB4YTQsIDB4NTUsIDB4YzEsIDB4NzAsCisgICAgICAweGUyLCAweDNjLCAweDNhLCAweDhlLCAweDdhLCAweDUxLCAweDAyLCAweDgxLCAweDgxLCAweDAwLCAweGNiLCAweDVkLAorICAgICAgMHhmZiwgMHhkMywgMHg3ZCwgMHhjNSwgMHgzMywgMHg1NywgMHg3MSwgMHhlOSwgMHhkNSwgMHg5OSwgMHhiNSwgMHg2YywKKyAgICAgIDB4NTQsIDB4NWUsIDB4OWYsIDB4ZjIsIDB4MDEsIDB4OGUsIDB4MDEsIDB4MjIsIDB4NDIsIDB4M2MsIDB4MzIsIDB4MDcsCisgICAgICAweDRiLCAweDg1LCAweDhhLCAweGNlLCAweDIyLCAweGRjLCAweDIxLCAweDBkLCAweDAxLCAweDQ4LCAweGVhLCAweDNiLAorICAgICAgMHg0NCwgMHhhNiwgMHg0MSwgMHg0MiwgMHhkMywgMHgwOSwgMHhhYywgMHg5OCwgMHhkZSwgMHg3OCwgMHgzZSwgMHg4NSwKKyAgICAgIDB4MzMsIDB4MzIsIDB4ZGEsIDB4YTIsIDB4ZDksIDB4YzksIDB4YzAsIDB4MjMsIDB4OTksIDB4MjYsIDB4ZTQsIDB4ZmIsCisgICAgICAweGMyLCAweDRkLCAweGI5LCAweDdhLCAweGFiLCAweDA4LCAweDA3LCAweGIxLCAweGUwLCAweDZiLCAweGRlLCAweGQ1LAorICAgICAgMHgzOSwgMHgxNywgMHhiMCwgMHgyNywgMHgwOSwgMHhkNCwgMHg1YiwgMHhiMiwgMHg5MSwgMHhkNSwgMHhmYSwgMHg2ZSwKKyAgICAgIDB4ZTcsIDB4N2MsIDB4YTQsIDB4ZjYsIDB4MmYsIDB4NTMsIDB4NDUsIDB4ZDMsIDB4YjgsIDB4MWYsIDB4MzEsIDB4OWQsCisgICAgICAweGE4LCAweDk2LCAweDAxLCAweGM4LCAweDU3LCAweDZkLCAweDIxLCAweDNhLCAweGY4LCAweDZiLCAweGZlLCAweGNlLAorICAgICAgMHhiZiwgMHhjMCwgMHgxYywgMHhkOSwgMHg0NywgMHg1NywgMHg3YSwgMHg4NCwgMHgxOSwgMHhkNCwgMHhmMCwgMHhkNiwKKyAgICAgIDB4ODgsIDB4YjIsIDB4MGEsIDB4YzEsIDB4MGYsIDB4YTUsIDB4MDIsIDB4ODEsIDB4ODEsIDB4MDAsIDB4YzEsIDB4NjksCisgICAgICAweDAwLCAweGQ1LCAweGQ3LCAweGFhLCAweDA0LCAweGZlLCAweDFkLCAweGM2LCAweDdkLCAweDUxLCAweGNkLCAweGMxLAorICAgICAgMHhkOSwgMHgxNCwgMHg3NiwgMHg2NSwgMHgxMCwgMHg2OSwgMHhmMSwgMHg3ZiwgMHg1ZCwgMHhlYywgMHhhNiwgMHg3NiwKKyAgICAgIDB4NmUsIDB4Y2YsIDB4YTksIDB4OGUsIDB4NWUsIDB4MGUsIDB4NmYsIDB4MzgsIDB4ZDQsIDB4ZTcsIDB4M2MsIDB4ZDYsCisgICAgICAweDRiLCAweGFhLCAweDAxLCAweDJjLCAweDhmLCAweGMyLCAweDY0LCAweGMzLCAweGYxLCAweDY5LCAweGNkLCAweGJiLAorICAgICAgMHgzZCwgMHhkMSwgMHhmMCwgMHg5ZiwgMHhmYiwgMHhiNSwgMHg1MywgMHhkZCwgMHg5YywgMHg2OSwgMHhkZSwgMHg0ZCwKKyAgICAgIDB4NGYsIDB4YTgsIDB4ZTMsIDB4M2EsIDB4YzIsIDB4OGIsIDB4NGIsIDB4MTYsIDB4OGEsIDB4ZmEsIDB4MzQsIDB4ZjUsCisgICAgICAweGY5LCAweDVhLCAweDVkLCAweDg4LCAweDQ2LCAweDY4LCAweGE1LCAweGEwLCAweGEzLCAweGRjLCAweGI4LCAweDMyLAorICAgICAgMHhhYSwgMHg3NywgMHg2NiwgMHg3YywgMHhmNSwgMHg4NiwgMHg2YiwgMHg3MywgMHhkYSwgMHhkNywgMHhkNywgMHhkYSwKKyAgICAgIDB4NWIsIDB4ZDYsIDB4ZjAsIDB4YWYsIDB4NjYsIDB4N2UsIDB4OWUsIDB4YWYsIDB4MmQsIDB4ODYsIDB4MjksIDB4NzQsCisgICAgICAweGFkLCAweDc5LCAweGZmLCAweGE3LCAweDdhLCAweDVkLCAweDI0LCAweDdjLCAweDA3LCAweGM5LCAweDhiLCAweDUyLAorICAgICAgMHgzOSwgMHg2MiwgMHg3NCwgMHg4OSwgMHhlZiwgMHg5ZiwgMHgwMiwgMHg4MSwgMHg4MSwgMHgwMCwgMHhhNSwgMHg1OCwKKyAgICAgIDB4NTMsIDB4YmIsIDB4N2MsIDB4MzIsIDB4NmQsIDB4M2YsIDB4ZDcsIDB4OWEsIDB4MmEsIDB4ZDQsIDB4YzIsIDB4MzAsCisgICAgICAweGM1LCAweDk3LCAweGY5LCAweGFiLCAweDI1LCAweGEwLCAweDczLCAweDQzLCAweDhiLCAweDVlLCAweGFkLCAweGJlLAorICAgICAgMHg0OCwgMHhhNCwgMHhkNiwgMHhlYSwgMHgyYSwgMHg2NSwgMHg5NywgMHg2OSwgMHg5ZiwgMHg3NSwgMHhjZCwgMHgxYiwKKyAgICAgIDB4NGIsIDB4MDEsIDB4NzEsIDB4NjYsIDB4MDcsIDB4NzcsIDB4ODIsIDB4MjAsIDB4ZjgsIDB4MjAsIDB4MDMsIDB4OTUsCisgICAgICAweDAwLCAweGJmLCAweDg0LCAweDBiLCAweDhiLCAweGNmLCAweDAwLCAweGFjLCAweGYwLCAweGM0LCAweDMyLCAweGMwLAorICAgICAgMHg4ZSwgMHg4NSwgMHhlYiwgMHgxYiwgMHhkNSwgMHgxYSwgMHhiZSwgMHg0NiwgMHhkZCwgMHgxNCwgMHg1NywgMHgyNCwKKyAgICAgIDB4M2QsIDB4M2IsIDB4MDksIDB4MzksIDB4NzQsIDB4NDAsIDB4NzgsIDB4MWQsIDB4ODMsIDB4N2MsIDB4ZGEsIDB4MTQsCisgICAgICAweDc5LCAweDk5LCAweDU5LCAweGY1LCAweGRmLCAweDFjLCAweDcxLCAweDU1LCAweDY2LCAweDA5LCAweGQ2LCAweGE5LAorICAgICAgMHgzYywgMHg3YywgMHg1YSwgMHgwZSwgMHhhZCwgMHgyNiwgMHg0OSwgMHgzMiwgMHg0YywgMHhmMCwgMHg2MSwgMHg0NywKKyAgICAgIDB4NmYsIDB4OTcsIDB4OWUsIDB4ZGMsIDB4ZjksIDB4YTgsIDB4MjIsIDB4MzAsIDB4NmQsIDB4NjAsIDB4MzgsIDB4M2YsCisgICAgICAweGY0LCAweGZiLCAweGVjLCAweGNhLCAweDczLCAweDExLCAweDAyLCAweDgxLCAweDgxLCAweDAwLCAweGE1LCAweDk0LAorICAgICAgMHhhYSwgMHhjNSwgMHg2OCwgMHhhNCwgMHg0MywgMHgyZiwgMHhmNiwgMHhmNywgMHhkNiwgMHg5NCwgMHgzMSwgMHgyZSwKKyAgICAgIDB4MzMsIDB4MTUsIDB4YzQsIDB4YTIsIDB4OTMsIDB4NjEsIDB4ZDAsIDB4MDEsIDB4YjUsIDB4YmMsIDB4ODMsIDB4NmEsCisgICAgICAweGMzLCAweDQ1LCAweDdmLCAweGE4LCAweGM1LCAweGI3LCAweDVmLCAweGRhLCAweGVjLCAweGQyLCAweGE3LCAweDBmLAorICAgICAgMHhlMywgMHhhOSwgMHg0MCwgMHhlNiwgMHgxMCwgMHg5MSwgMHg2MSwgMHg0OSwgMHgyYiwgMHgyNSwgMHhlNCwgMHg5ZSwKKyAgICAgIDB4ZDcsIDB4YjcsIDB4MjMsIDB4NjUsIDB4MjMsIDB4Y2UsIDB4NDIsIDB4NjUsIDB4NjgsIDB4YTIsIDB4NmUsIDB4NTIsCisgICAgICAweDBiLCAweGNmLCAweGNmLCAweGYxLCAweDlmLCAweDVhLCAweDM3LCAweDQ3LCAweGFlLCAweDY1LCAweGI0LCAweGVmLAorICAgICAgMHg5YywgMHhiMSwgMHg5MywgMHg3ZiwgMHhiNiwgMHg5ZiwgMHhhMiwgMHhhNCwgMHg5YiwgMHg4NCwgMHhiYywgMHgyMSwKKyAgICAgIDB4OGMsIDB4MzUsIDB4M2EsIDB4ODUsIDB4ZTIsIDB4ODEsIDB4NTgsIDB4ZmUsIDB4Y2YsIDB4YWQsIDB4OTgsIDB4M2IsCisgICAgICAweDc2LCAweDAyLCAweGQ2LCAweGZkLCAweGEzLCAweDI2LCAweGU1LCAweGRkLCAweDlkLCAweDgwLCAweGNkLCAweDdlLAorICAgICAgMHhmOSwgMHg4MSwgMHg4NywgMHhiMCwgMHhhZiwgMHgxZSwgMHg4YywgMHhiYywgMHhhZSwgMHhjMiwgMHgwYSwgMHg0NywKKyAgICAgIDB4YjMsIDB4OWYsIDB4MjksIDB4OWMsIDB4NjksIDB4OGIsIDB4MDIsIDB4ODEsIDB4ODAsIDB4NmYsIDB4YTEsIDB4YjksCisgICAgICAweGViLCAweDNjLCAweGVhLCAweGVkLCAweDMwLCAweDFmLCAweDM5LCAweDNiLCAweDM2LCAweDM4LCAweDQxLCAweDc0LAorICAgICAgMHhhZCwgMHhhZSwgMHg5ZSwgMHg0MCwgMHgzZSwgMHg0NSwgMHhjMiwgMHg0YSwgMHg0NywgMHg5YiwgMHg3MSwgMHg1YSwKKyAgICAgIDB4YWIsIDB4YjAsIDB4OTcsIDB4OTgsIDB4OTAsIDB4MjIsIDB4MzUsIDB4ODcsIDB4NTYsIDB4Y2YsIDB4MGEsIDB4ZjksCisgICAgICAweDUyLCAweDRiLCAweDMwLCAweDkwLCAweDAzLCAweDc3LCAweDVjLCAweDZjLCAweDlhLCAweDllLCAweDc3LCAweGY5LAorICAgICAgMHg2ZSwgMHg4NywgMHgzYSwgMHhiNSwgMHgxOCwgMHgyMywgMHhjYiwgMHhkZSwgMHhlYywgMHhlMywgMHhhMiwgMHhiMywKKyAgICAgIDB4NTcsIDB4YjcsIDB4ZDEsIDB4ZDEsIDB4YjksIDB4M2QsIDB4YWEsIDB4MzMsIDB4ZWUsIDB4MzgsIDB4ODgsIDB4ZjUsCisgICAgICAweDAzLCAweDQ3LCAweGRlLCAweDU3LCAweGQ3LCAweDQzLCAweGE4LCAweDI4LCAweDI0LCAweGQ1LCAweGFiLCAweDE5LAorICAgICAgMHhmMSwgMHg4MCwgMHhmOSwgMHg4NCwgMHg0MiwgMHhjOCwgMHhhNywgMHhlOSwgMHhkMCwgMHhmMywgMHhiMCwgMHg0ZCwKKyAgICAgIDB4ZDQsIDB4MDYsIDB4YjksIDB4Y2IsIDB4MjIsIDB4MmEsIDB4MzcsIDB4OTgsIDB4YzAsIDB4NDAsIDB4MmIsIDB4NmIsCisgICAgICAweDNiLCAweGVmLCAweDg2LCAweGNjLCAweDMwLCAweDJkLCAweGJjLCAweGFlLCAweDRjLCAweDgyLCAweDZmLCAweGQyLAorICAgICAgMHgyOCwgMHg0YiwgMHhiYSwgMHhiNCwgMHhmYn07CisKKyAgY29uc3QgdWludDhfdCBwdWJsaWNfa2V5X2J5dGVzWzI5NF0gPSB7CisgICAgICAweDMwLCAweDgyLCAweDAxLCAweDIyLCAweDMwLCAweDBkLCAweDA2LCAweDA5LCAweDJhLCAweDg2LCAweDQ4LCAweDg2LAorICAgICAgMHhmNywgMHgwZCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwNSwgMHgwMCwgMHgwMywgMHg4MiwgMHgwMSwgMHgwZiwgMHgwMCwKKyAgICAgIDB4MzAsIDB4ODIsIDB4MDEsIDB4MGEsIDB4MDIsIDB4ODIsIDB4MDEsIDB4MDEsIDB4MDAsIDB4OTksIDB4YTUsIDB4NDgsCisgICAgICAweDE2LCAweDQwLCAweDE5LCAweDFlLCAweGNjLCAweDc4LCAweGNmLCAweDUzLCAweGQwLCAweDYxLCAweDgzLCAweDNiLAorICAgICAgMHhmYywgMHg1ZCwgMHhiOSwgMHgyZSwgMHg5YSwgMHhmYSwgMHgwNCwgMHgxMCwgMHhmYiwgMHg2NSwgMHhkMSwgMHhlZiwKKyAgICAgIDB4N2IsIDB4MmMsIDB4NzQsIDB4MjUsIDB4ZjMsIDB4NzksIDB4NmEsIDB4ZjYsIDB4M2YsIDB4ZTcsIDB4MzYsIDB4YmQsCisgICAgICAweDU1LCAweGI0LCAweDk2LCAweDBiLCAweDk1LCAweDhlLCAweDA3LCAweDFhLCAweGJkLCAweDM1LCAweDQ0LCAweGU1LAorICAgICAgMHhmOCwgMHg2ZiwgMHhkNSwgMHhhNywgMHg4NSwgMHg3NywgMHg0MywgMHhmOSwgMHhhNCwgMHgxYSwgMHg3OCwgMHhiOCwKKyAgICAgIDB4Y2YsIDB4NjIsIDB4YzgsIDB4MmEsIDB4ODgsIDB4NDcsIDB4M2EsIDB4NGYsIDB4ZDYsIDB4M2IsIDB4MjEsIDB4MmIsCisgICAgICAweGIyLCAweDZlLCAweGVhLCAweDEzLCAweGRkLCAweGRlLCAweGY0LCAweDU1LCAweGY0LCAweDRiLCAweDU3LCAweDExLAorICAgICAgMHhmMywgMHhiMywgMHg5MiwgMHhkNiwgMHhjZSwgMHg1NywgMHgyOCwgMHg5ZSwgMHg4NSwgMHhiYSwgMHg3OSwgMHgzYiwKKyAgICAgIDB4YmIsIDB4MGIsIDB4MzUsIDB4N2EsIDB4YTQsIDB4NjksIDB4ODQsIDB4MWYsIDB4YmUsIDB4ODksIDB4MzUsIDB4YmQsCisgICAgICAweDAyLCAweDI1LCAweDI4LCAweGVjLCAweDZmLCAweGViLCAweDNkLCAweDBhLCAweGIwLCAweDAyLCAweDZiLCAweDRiLAorICAgICAgMHhkYiwgMHhkMiwgMHg3YywgMHg0ZSwgMHhlZCwgMHg0NCwgMHg0ZiwgMHhhMSwgMHhlNiwgMHhkOSwgMHhjNCwgMHhmNywKKyAgICAgIDB4ZTcsIDB4N2QsIDB4NmQsIDB4MDYsIDB4ZjksIDB4NWEsIDB4NmMsIDB4ZjAsIDB4NDgsIDB4YzQsIDB4MWQsIDB4ZjksCisgICAgICAweGU3LCAweDI4LCAweGM3LCAweDc1LCAweGEyLCAweDRhLCAweGExLCAweDM1LCAweDVhLCAweGFkLCAweDBmLCAweDFhLAorICAgICAgMHg5YywgMHg3MCwgMHg5OCwgMHhjYiwgMHhmYywgMHg0OCwgMHhhYiwgMHhmNSwgMHhjNiwgMHhhNCwgMHg5NCwgMHhhNiwKKyAgICAgIDB4OWIsIDB4NjQsIDB4MDYsIDB4MGUsIDB4YjksIDB4MzgsIDB4YTksIDB4ODQsIDB4MzIsIDB4MzgsIDB4MTMsIDB4ODQsCisgICAgICAweDcwLCAweDk5LCAweDc5LCAweDI1LCAweGZlLCAweDJjLCAweGMwLCAweGRlLCAweGVjLCAweDlmLCAweDk5LCAweDUxLAorICAgICAgMHg0ZiwgMHhmYywgMHhhYywgMHhlOCwgMHgwZCwgMHg4NywgMHg2ZCwgMHg0MywgMHg4YiwgMHgyNSwgMHhhNywgMHg1NCwKKyAgICAgIDB4NDcsIDB4NDIsIDB4ZmUsIDB4ZTIsIDB4NjcsIDB4ZmYsIDB4YzIsIDB4OGYsIDB4MWIsIDB4MGUsIDB4MWEsIDB4MjQsCisgICAgICAweGRmLCAweGE3LCAweDQwLCAweGNkLCAweGE0LCAweGEyLCAweGI0LCAweGFkLCAweDQzLCAweDcyLCAweGJjLCAweDhkLAorICAgICAgMHhjMCwgMHgxZCwgMHhlMCwgMHg3NywgMHg3NiwgMHg0YiwgMHhlMCwgMHhjMiwgMHgzMiwgMHg3YSwgMHg1NywgMHgzMywKKyAgICAgIDB4ZWUsIDB4YTgsIDB4OWMsIDB4ZmEsIDB4NDksIDB4NjcsIDB4NDIsIDB4MTUsIDB4MzEsIDB4MGUsIDB4ZDAsIDB4YzIsCisgICAgICAweDdiLCAweDAyLCAweDAzLCAweDAxLCAweDAwLCAweDAxfTsKKworICBzdHJpbmcgZGF0YV9zdHJpbmcoIkhpIFRoZXJlIik7CisKKyAgLy8gVGVzdCBTaWduaW5nCisgIENyeXB0b09wczo6UHJpdmF0ZUtleSBwcml2YXRlX2tleSgKKyAgICAgIEJ5dGVCdWZmZXIocHJpdmF0ZV9rZXlfYnl0ZXMsIDExOTMpLlN0cmluZygpLAorICAgICAgQ3J5cHRvT3BzOjpLZXlBbGdvcml0aG06OlJTQV9LRVkpOworICB1bmlxdWVfcHRyPHN0cmluZz4gc2lnbmF0dXJlID0gQ3J5cHRvT3BzOjpTaWduKAorICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlOjpSU0EyMDQ4X1NIQTI1NiwgcHJpdmF0ZV9rZXksIGRhdGFfc3RyaW5nKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHNpZ25hdHVyZSk7CisKKyAgLy8gVGVzdCBWZXJpZnlpbmcKKyAgQ3J5cHRvT3BzOjpQdWJsaWNLZXkgcHVibGljX2tleShCeXRlQnVmZmVyKHB1YmxpY19rZXlfYnl0ZXMsIDI5NCkuU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpLZXlBbGdvcml0aG06OlJTQV9LRVkpOworICBib29sIHNpZ25hdHVyZV92ZXJpZmllcyA9IENyeXB0b09wczo6VmVyaWZ5KAorICAgICAgQ3J5cHRvT3BzOjpTaWdUeXBlOjpSU0EyMDQ4X1NIQTI1NiwgcHVibGljX2tleSwgKnNpZ25hdHVyZSwgZGF0YV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShzaWduYXR1cmVfdmVyaWZpZXMpOworfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3RFY0tleUFncmVlbWVudCkgeworICB1bmlxdWVfcHRyPENyeXB0b09wczo6S2V5UGFpcj4gY2xpZW50X2tleV9wYWlyID0KKyAgICAgIENyeXB0b09wczo6R2VuZXJhdGVFY1AyNTZLZXlQYWlyKCk7CisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpLZXlQYWlyPiBzZXJ2ZXJfa2V5X3BhaXIgPQorICAgICAgQ3J5cHRvT3BzOjpHZW5lcmF0ZUVjUDI1NktleVBhaXIoKTsKKworICBzdHJpbmcgY2xpZW50X3ksIHNlcnZlcl95OworICBib29sIHN1Y2Nlc3M7CisgIHN1Y2Nlc3MgPSBDcnlwdG9PcHM6OkV4cG9ydEVjUDI1NktleSgqKGNsaWVudF9rZXlfcGFpci0+cHVibGljX2tleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmY2xpZW50X3kpOworICBBU1NFUlRfVFJVRShzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IENyeXB0b09wczo6RXhwb3J0RWNQMjU2S2V5KCooc2VydmVyX2tleV9wYWlyLT5wdWJsaWNfa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzZXJ2ZXJfeSk7CisgIEFTU0VSVF9UUlVFKHN1Y2Nlc3MpOworICAvLyBQdWJsaWMgS2V5cyBzaG91bGQgbm90IGJlIGVxdWFsLgorICBBU1NFUlRfTkUoY2xpZW50X3ksIHNlcnZlcl95KTsKKworICAvLyBSdW4gY2xpZW50IHNpZGUgb2YgdGhlIGtleSBleGNoYW5nZQorICB1bmlxdWVfcHRyPENyeXB0b09wczo6U2VjcmV0S2V5PiBjbGllbnRfc2VjcmV0ID0KKyAgICAgIENyeXB0b09wczo6S2V5QWdyZWVtZW50U2hhMjU2KCooY2xpZW50X2tleV9wYWlyLT5wcml2YXRlX2tleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHNlcnZlcl9rZXlfcGFpci0+cHVibGljX2tleSkpOworICBBU1NFUlRfTkUoY2xpZW50X3NlY3JldCwgbnVsbHB0cik7CisKKyAgLy8gUnVuIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUga2V5IGV4Y2hhbmdlCisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpTZWNyZXRLZXk+IHNlcnZlcl9zZWNyZXQgPQorICAgICAgQ3J5cHRvT3BzOjpLZXlBZ3JlZW1lbnRTaGEyNTYoKihzZXJ2ZXJfa2V5X3BhaXItPnByaXZhdGVfa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooY2xpZW50X2tleV9wYWlyLT5wdWJsaWNfa2V5KSk7CisgIEFTU0VSVF9ORShzZXJ2ZXJfc2VjcmV0LCBudWxscHRyKTsKKworICBBU1NFUlRfVFJVRShjbGllbnRfc2VjcmV0LT5kYXRhKCkuRXF1YWxzKHNlcnZlcl9zZWNyZXQtPmRhdGEoKSkpOworfQorCisKK1RFU1QoQ3J5cHRvT3BzVGVzdCwgVGVzdEdlbmVyYXRlQWVzMjU2U2VjcmV0S2V5KSB7CisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpTZWNyZXRLZXk+IGtleSA9IENyeXB0b09wczo6R2VuZXJhdGVBZXMyNTZTZWNyZXRLZXkoKTsKKyAgRVhQRUNUX05FKGtleSwgbnVsbHB0cik7CisgIEVYUEVDVF9FUShDcnlwdG9PcHNUZXN0OjpBZXNLZXlTaXplKCksIGtleS0+ZGF0YSgpLnNpemUoKSk7Cit9CisKK1RFU1QoQ3J5cHRvT3BzVGVzdCwgVGVzdEdlbmVyYXRlRWNQMjU2S2V5UGFpcikgeworICB1bmlxdWVfcHRyPENyeXB0b09wczo6S2V5UGFpcj4ga2V5X3BhaXIgPSBDcnlwdG9PcHM6OkdlbmVyYXRlRWNQMjU2S2V5UGFpcigpOworICBFWFBFQ1RfTkUoa2V5X3BhaXIsIG51bGxwdHIpOworICBFWFBFQ1RfR1Qoa2V5X3BhaXItPnByaXZhdGVfa2V5LT5kYXRhKCkuc2l6ZSgpLCAwVSk7CisgIEVYUEVDVF9HVChrZXlfcGFpci0+cHVibGljX2tleS0+ZGF0YSgpLnNpemUoKSwgMFUpOworfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3RHZW5lcmF0ZVJzYTIwNDhLZXlQYWlyKSB7CisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpLZXlQYWlyPiBrZXlfcGFpciA9IENyeXB0b09wczo6R2VuZXJhdGVSc2EyMDQ4S2V5UGFpcigpOworICBFWFBFQ1RfTkUoa2V5X3BhaXIsIG51bGxwdHIpOworICBFWFBFQ1RfR1Qoa2V5X3BhaXItPnByaXZhdGVfa2V5LT5kYXRhKCkuc2l6ZSgpLCAwVSk7CisgIEVYUEVDVF9HVChrZXlfcGFpci0+cHVibGljX2tleS0+ZGF0YSgpLnNpemUoKSwgMFUpOworfQorCitURVNUKENyeXB0b09wc1Rlc3QsIFRlc3RJbnQzMkJ5dGVzVG9TdHJpbmcpIHsKKyAgRVhQRUNUX0VRKHN0cmluZygiXHgwNVx4RjJceDIzXHgwMCIsIDQpLAorICAgICAgICAgICAgQ3J5cHRvT3BzVGVzdDo6SW50MzJCeXRlc1RvU3RyaW5nKDB4MDVGMjIzMDApKTsKKworICAvLyBBbGwgemVybyBieXRlcy4KKyAgRVhQRUNUX0VRKHN0cmluZygiXHgwXHgwXHgwXHgwIiwgNCksIENyeXB0b09wc1Rlc3Q6OkludDMyQnl0ZXNUb1N0cmluZygwKSk7CisKKyAgLy8gTGVhZGluZyAwIGJ5dGUuCisgIEVYUEVDVF9FUShzdHJpbmcoIlx4MDBceDAwXHg5M1x4MDYiLCA0KSwKKyAgICAgICAgICAgIENyeXB0b09wc1Rlc3Q6OkludDMyQnl0ZXNUb1N0cmluZygweDAwMDA5MzA2KSk7CisKKyAgLy8gTmVnYXRpdmUgdmFsdWUuCisgIEVYUEVDVF9FUShzdHJpbmcoIlx4RTBceDAwXHgwMFx4MDAiLCA0KSwKKyAgICAgICAgICAgICAgICAgICBDcnlwdG9PcHNUZXN0OjpJbnQzMkJ5dGVzVG9TdHJpbmcoMHhFMDAwMDAwMCkpOworCisgIC8vIE5lZ2F0aXZlIG5vbi1sZWFkaW5nIGJ5dGVzLgorICBFWFBFQ1RfRVEoc3RyaW5nKCJceDBGXHg4MVx4QTNceDk5IiwgNCksCisgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzVGVzdDo6SW50MzJCeXRlc1RvU3RyaW5nKDB4MEY4MUEzOTkpKTsKK30KKworVEVTVChDcnlwdG9PcHNUZXN0LCBUZXN0U3RyaW5nVG9JbnQzMkJ5dGVzKSB7CisgIC8vIEluaXRpYWxseSBzZXQgdG8gYW4gYXJiaXRyYXJ5IHZhbHVlOworICBpbnQzMl90IHJlc3VsdCA9IDB4MzRGNEVFMjE7CisKKyAgLy8gRW1wdHkgc3RyaW5nLgorICBFWFBFQ1RfVFJVRShDcnlwdG9PcHNUZXN0OjpTdHJpbmdUb0ludDMyQnl0ZXMoc3RyaW5nKCksICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDAsIHJlc3VsdCk7CisKKyAgLy8gQWxsIHplcm8gYnl0ZXMuCisgIEVYUEVDVF9UUlVFKENyeXB0b09wc1Rlc3Q6OlN0cmluZ1RvSW50MzJCeXRlcyhzdHJpbmcoIlx4MDBceDAwXHgwMFx4MDAiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDAsIHJlc3VsdCk7CisKKyAgLy8gUG9zaXRpdmUgdmFsdWUuCisgIEVYUEVDVF9UUlVFKENyeXB0b09wc1Rlc3Q6OlN0cmluZ1RvSW50MzJCeXRlcyhzdHJpbmcoIlx4MDVceEYyXHgyM1x4MDAiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDB4MDVGMjIzMDAsIHJlc3VsdCk7CisKKyAgLy8gTGVhZGluZyAwIGJ5dGUuCisgIEVYUEVDVF9UUlVFKENyeXB0b09wc1Rlc3Q6OlN0cmluZ1RvSW50MzJCeXRlcyhzdHJpbmcoIlx4MDBceDAwXHg5M1x4MDYiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDB4MDAwMDkzMDYsIHJlc3VsdCk7CisKKyAgLy8gTmVnYXRpdmUgdmFsdWUuCisgIEVYUEVDVF9UUlVFKENyeXB0b09wc1Rlc3Q6OlN0cmluZ1RvSW50MzJCeXRlcyhzdHJpbmcoIlx4RTBceDAwXHgwMFx4MDAiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDB4RTAwMDAwMDAsIHJlc3VsdCk7CisKKyAgLy8gTmVnYXRpdmUgbm9uLWxlYWRpbmcgYnl0ZXMuCisgIEVYUEVDVF9UUlVFKENyeXB0b09wc1Rlc3Q6OlN0cmluZ1RvSW50MzJCeXRlcyhzdHJpbmcoIlx4MEZceDgxXHhBM1x4OTkiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDB4MEY4MUEzOTksIHJlc3VsdCk7CisKKyAgLy8gU3RyaW5nIHNob3J0ZXIgdGhhbiA0IGJ5dGVzLgorICBFWFBFQ1RfVFJVRShDcnlwdG9PcHNUZXN0OjpTdHJpbmdUb0ludDMyQnl0ZXMoc3RyaW5nKCJceDgxXHhBM1x4OTkiLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDB4MDA4MUEzOTksIHJlc3VsdCk7CisKKyAgLy8gU3RyaW5nIGxvbmdlciB0aGFuIDQgYnl0ZXMgKGludmFsaWQgdmFsdWUpLgorICBFWFBFQ1RfRkFMU0UoCisgICAgICBDcnlwdG9PcHNUZXN0OjpTdHJpbmdUb0ludDMyQnl0ZXMoc3RyaW5nKCJceDAwXHgwMFx4ODFceEEzXHg5OSIsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdW5pdHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGVzdC9zZWN1cmVtZXNzYWdlL3B1YmxpY19rZXlfcHJvdG9fdXRpbF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3Rlc3Qvc2VjdXJlbWVzc2FnZS9wdWJsaWNfa2V5X3Byb3RvX3V0aWxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJlNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3Rlc3Qvc2VjdXJlbWVzc2FnZS9wdWJsaWNfa2V5X3Byb3RvX3V0aWxfdGVzdC5jYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInNlY3VyZW1lc3NhZ2UvcHVibGljX2tleV9wcm90b191dGlsLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIFB1YmxpY0tleVByb3RvVXRpbFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiBwdWJsaWNfa2V5XzsKKworICAvLyBBIGJ5dGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgemVybyBieXRlLgorICBzdHJpbmcgemVyb19ieXRlXzsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRFY1AyNTZQdWJsaWNLZXkoKSB7CisgICAgdGVzdGluZzo6VGVzdDo6U2V0VXAoKTsKKworICAgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpLZXlQYWlyPiBrZXlfcGFpciA9CisgICAgICAgIENyeXB0b09wczo6R2VuZXJhdGVFY1AyNTZLZXlQYWlyKCk7CisgICAgcHVibGljX2tleV8gPSB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PihuZXcgQ3J5cHRvT3BzOjpQdWJsaWNLZXkoCisgICAgICAgIGtleV9wYWlyLT5wdWJsaWNfa2V5LT5kYXRhKCksIGtleV9wYWlyLT5wdWJsaWNfa2V5LT5hbGdvcml0aG0oKSkpOworICAgIHplcm9fYnl0ZV8gPSBzdHJpbmcoIiIsIDEpOworICB9CisKKyAgdm9pZCBTZXRSc2EyMDQ4UHVibGljS2V5KCkgeworICAgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpLZXlQYWlyPiBrZXlfcGFpciA9CisgICAgICAgIENyeXB0b09wczo6R2VuZXJhdGVSc2EyMDQ4S2V5UGFpcigpOworICAgIHB1YmxpY19rZXlfID0gdW5pcXVlX3B0cjxDcnlwdG9PcHM6OlB1YmxpY0tleT4obmV3IENyeXB0b09wczo6UHVibGljS2V5KAorICAgICAgICBrZXlfcGFpci0+cHVibGljX2tleS0+ZGF0YSgpLCBrZXlfcGFpci0+cHVibGljX2tleS0+YWxnb3JpdGhtKCkpKTsKKyAgICB6ZXJvX2J5dGVfID0gc3RyaW5nKCIiLCAxKTsKKyAgfQorCisgIHZvaWQgQXNzZXJ0S2V5SGFzU2ltcGxlUnNhU3RydWN0dXJlKGNvbnN0IHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4mIGtleSkgeworICAgIEFTU0VSVF9ORShudWxscHRyLCBrZXkpOworICAgIEFTU0VSVF9FUShrZXktPnR5cGUoKSwgUHVibGljS2V5VHlwZTo6UlNBMjA0OCk7CisgICAgQVNTRVJUX0ZBTFNFKGtleS0+cnNhMjA0OF9wdWJsaWNfa2V5KCkubigpLmVtcHR5KCkpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCisKK25hbWVzcGFjZSBzZWN1cmVtZXNzYWdlIHsKK25hbWVzcGFjZSB1bml0dGVzdGluZyB7CituYW1lc3BhY2UgeworCitURVNUX0YoUHVibGljS2V5UHJvdG9VdGlsVGVzdCwgRW5jb2RlQW5kUGFyc2VFY1AyNTYpIHsKKyAgU2V0RWNQMjU2UHVibGljS2V5KCk7CisKKyAgdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBnZW5lcmljX2tleSA9CisgICAgICBQdWJsaWNLZXlQcm90b1V0aWw6OkVuY29kZVB1YmxpY0tleSgqcHVibGljX2tleV8pOworCisgIEFTU0VSVF9ORShudWxscHRyLCBnZW5lcmljX2tleSk7CisgIEFTU0VSVF9FUShnZW5lcmljX2tleS0+dHlwZSgpLCBQdWJsaWNLZXlUeXBlOjpFQ19QMjU2KTsKKworICBBU1NFUlRfRkFMU0UoZ2VuZXJpY19rZXktPmVjX3AyNTZfcHVibGljX2tleSgpLngoKS5lbXB0eSgpKTsKKyAgQVNTRVJUX0ZBTFNFKGdlbmVyaWNfa2V5LT5lY19wMjU2X3B1YmxpY19rZXkoKS55KCkuZW1wdHkoKSk7CisKKyAgLy8gRW5zdXJlIHRoZSBoaWdoZXN0IGJpdCBpcyBub3Qgc2V0LgorICBjaGFyIHhfaGlnaGVzdF9ieXRlID0gZ2VuZXJpY19rZXktPmVjX3AyNTZfcHVibGljX2tleSgpLngoKVswXTsKKyAgY2hhciB5X2hpZ2hlc3RfYnl0ZSA9IGdlbmVyaWNfa2V5LT5lY19wMjU2X3B1YmxpY19rZXkoKS55KClbMF07CisgIEFTU0VSVF9GQUxTRSh4X2hpZ2hlc3RfYnl0ZSAmIDB4ODApOworICBBU1NFUlRfRkFMU0UoeV9oaWdoZXN0X2J5dGUgJiAweDgwKTsKKworICB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiByZXN0b3JlZF9wdWJsaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmdlbmVyaWNfa2V5KTsKKworICBBU1NFUlRfTkUobnVsbHB0ciwgcmVzdG9yZWRfcHVibGljX2tleSk7CisKKyAgQVNTRVJUX0VRKHJlc3RvcmVkX3B1YmxpY19rZXktPmFsZ29yaXRobSgpLAorICAgICAgICAgICAgQ3J5cHRvT3BzOjpLZXlBbGdvcml0aG06OkVDRFNBX0tFWSk7CisgIEFTU0VSVF9FUShwdWJsaWNfa2V5Xy0+ZGF0YSgpLlN0cmluZygpLCByZXN0b3JlZF9wdWJsaWNfa2V5LT5kYXRhKCkuU3RyaW5nKCkpOworfQorCitURVNUX0YoUHVibGljS2V5UHJvdG9VdGlsVGVzdCwgSW52YWxpZEVuY29kaW5nRWNQMjU2KSB7CisgIFNldEVjUDI1NlB1YmxpY0tleSgpOworCisgIHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4gaW52YWxpZF9wcm90bzsKKyAgdW5pcXVlX3B0cjxDcnlwdG9PcHM6OlB1YmxpY0tleT4gcmVzdG9yZWRfcHVibGljX2tleTsKKworICB1bmlxdWVfcHRyPEdlbmVyaWNQdWJsaWNLZXk+IHZhbGlkX3Byb3RvID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6RW5jb2RlUHVibGljS2V5KCpwdWJsaWNfa2V5Xyk7CisgIEFTU0VSVF9ORShudWxscHRyLCB2YWxpZF9wcm90byk7CisKKyAgLy8gTWVzcyB1cCB0aGUgWCBjb29yZGluYXRlIGJ5IHJlcGVhdGluZyBpdCB0d2ljZQorICBpbnZhbGlkX3Byb3RvID0gdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PigKKyAgICAgIG5ldyBHZW5lcmljUHVibGljS2V5KCp2YWxpZF9wcm90bykpOworICBzdHJpbmcgbmV3X3ggPSB2YWxpZF9wcm90by0+ZWNfcDI1Nl9wdWJsaWNfa2V5KCkueCgpOworICBuZXdfeCArPSBuZXdfeDsKKyAgaW52YWxpZF9wcm90by0+bXV0YWJsZV9lY19wMjU2X3B1YmxpY19rZXkoKS0+c2V0X3gobmV3X3gpOworICByZXN0b3JlZF9wdWJsaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmludmFsaWRfcHJvdG8pOworICBBU1NFUlRfRVEobnVsbHB0ciwgcmVzdG9yZWRfcHVibGljX2tleSk7CisKKyAgLy8gTWVzcyB1cCB0aGUgWSBjb29yZGluYXRlIGJ5IGVyYXNpbmcgaXQKKyAgaW52YWxpZF9wcm90byA9IHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4oCisgICAgICBuZXcgR2VuZXJpY1B1YmxpY0tleSgqdmFsaWRfcHJvdG8pKTsKKyAgaW52YWxpZF9wcm90by0+bXV0YWJsZV9lY19wMjU2X3B1YmxpY19rZXkoKS0+c2V0X3koemVyb19ieXRlXyk7CisgIHJlc3RvcmVkX3B1YmxpY19rZXkgPQorICAgICAgUHVibGljS2V5UHJvdG9VdGlsOjpQYXJzZVB1YmxpY0tleSgqaW52YWxpZF9wcm90byk7CisgIEFTU0VSVF9FUShudWxscHRyLCByZXN0b3JlZF9wdWJsaWNfa2V5KTsKKworICAvLyBQaWNrIGEgcG9pbnQgdGhhdCBpcyBsaWtlbHkgbm90IG9uIHRoZSBjdXJ2ZSBieSBjb3B5aW5nIFggb3ZlciBZCisgIGludmFsaWRfcHJvdG8gPSB1bmlxdWVfcHRyPEdlbmVyaWNQdWJsaWNLZXk+KAorICAgICAgbmV3IEdlbmVyaWNQdWJsaWNLZXkoKnZhbGlkX3Byb3RvKSk7CisgIGludmFsaWRfcHJvdG8tPm11dGFibGVfZWNfcDI1Nl9wdWJsaWNfa2V5KCktPnNldF95KAorICAgICAgdmFsaWRfcHJvdG8tPmVjX3AyNTZfcHVibGljX2tleSgpLngoKSk7CisgIHJlc3RvcmVkX3B1YmxpY19rZXkgPQorICAgICAgUHVibGljS2V5UHJvdG9VdGlsOjpQYXJzZVB1YmxpY0tleSgqaW52YWxpZF9wcm90byk7CisgIEFTU0VSVF9FUShudWxscHRyLCByZXN0b3JlZF9wdWJsaWNfa2V5KTsKKworICAvLyBUcnkgdGhlIHBvaW50ICgwLCAwKQorICBpbnZhbGlkX3Byb3RvID0gdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PigKKyAgICAgIG5ldyBHZW5lcmljUHVibGljS2V5KCp2YWxpZF9wcm90bykpOworICBpbnZhbGlkX3Byb3RvLT5tdXRhYmxlX2VjX3AyNTZfcHVibGljX2tleSgpLT5zZXRfeCh6ZXJvX2J5dGVfKTsKKyAgaW52YWxpZF9wcm90by0+bXV0YWJsZV9lY19wMjU2X3B1YmxpY19rZXkoKS0+c2V0X3koemVyb19ieXRlXyk7CisgIHJlc3RvcmVkX3B1YmxpY19rZXkgPQorICAgICAgUHVibGljS2V5UHJvdG9VdGlsOjpQYXJzZVB1YmxpY0tleSgqaW52YWxpZF9wcm90byk7CisgIEFTU0VSVF9FUShudWxscHRyLCByZXN0b3JlZF9wdWJsaWNfa2V5KTsKK30KKworVEVTVF9GKFB1YmxpY0tleVByb3RvVXRpbFRlc3QsIEVuY29kZUFuZFBhcnNlUnNhMjA0OCkgeworICBTZXRSc2EyMDQ4UHVibGljS2V5KCk7CisKKyAgdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBnZW5lcmljX2tleSA9CisgICAgICBQdWJsaWNLZXlQcm90b1V0aWw6OkVuY29kZVB1YmxpY0tleSgqcHVibGljX2tleV8pOworCisgIEFzc2VydEtleUhhc1NpbXBsZVJzYVN0cnVjdHVyZShnZW5lcmljX2tleSk7CisKKyAgLy8gRW5zdXJlIHRoZSBoaWdoZXN0IG1vZHVsdXMgYml0IGlzIG5vdCBzZXQuCisgIGNoYXIgbl9oaWdoZXN0X2J5dGUgPSBnZW5lcmljX2tleS0+cnNhMjA0OF9wdWJsaWNfa2V5KCkubigpWzBdOworICBBU1NFUlRfRkFMU0Uobl9oaWdoZXN0X2J5dGUgJiAweDgwKTsKKworICB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiByZXN0b3JlZF9wdWJsaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmdlbmVyaWNfa2V5KTsKKworICBBU1NFUlRfTkUobnVsbHB0ciwgcmVzdG9yZWRfcHVibGljX2tleSk7CisKKyAgQVNTRVJUX0VRKHJlc3RvcmVkX3B1YmxpY19rZXktPmFsZ29yaXRobSgpLAorICAgICAgICAgICAgQ3J5cHRvT3BzOjpLZXlBbGdvcml0aG06OlJTQV9LRVkpOworICBBU1NFUlRfRVEocHVibGljX2tleV8tPmRhdGEoKS5TdHJpbmcoKSwgcmVzdG9yZWRfcHVibGljX2tleS0+ZGF0YSgpLlN0cmluZygpKTsKK30KKworVEVTVF9GKFB1YmxpY0tleVByb3RvVXRpbFRlc3QsIFBhcnNlSW52YWxpZEVuY29kaW5nUnNhMjA0OF9FbXB0eU1vZHVsdXMpIHsKKyAgU2V0UnNhMjA0OFB1YmxpY0tleSgpOworCisgIHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4gZ2VuZXJpY19rZXkgPQorICAgICAgUHVibGljS2V5UHJvdG9VdGlsOjpFbmNvZGVQdWJsaWNLZXkoKnB1YmxpY19rZXlfKTsKKworICBBc3NlcnRLZXlIYXNTaW1wbGVSc2FTdHJ1Y3R1cmUoZ2VuZXJpY19rZXkpOworCisgIGdlbmVyaWNfa2V5LT5tdXRhYmxlX3JzYTIwNDhfcHVibGljX2tleSgpLT5jbGVhcl9uKCk7CisKKyAgdW5pcXVlX3B0cjxDcnlwdG9PcHM6OlB1YmxpY0tleT4gcmVzdG9yZWRfcHVibGljX2tleSA9CisgICAgICBQdWJsaWNLZXlQcm90b1V0aWw6OlBhcnNlUHVibGljS2V5KCpnZW5lcmljX2tleSk7CisKKyAgQVNTRVJUX0VRKG51bGxwdHIsIHJlc3RvcmVkX3B1YmxpY19rZXkpOworfQorCitURVNUX0YoUHVibGljS2V5UHJvdG9VdGlsVGVzdCwgUGFyc2VJbnZhbGlkRW5jb2RpbmdSc2EyMDQ4X01vZHVsdXNUb29TaG9ydCkgeworICBTZXRSc2EyMDQ4UHVibGljS2V5KCk7CisKKyAgdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBnZW5lcmljX2tleSA9CisgICAgICBQdWJsaWNLZXlQcm90b1V0aWw6OkVuY29kZVB1YmxpY0tleSgqcHVibGljX2tleV8pOworCisgIEFzc2VydEtleUhhc1NpbXBsZVJzYVN0cnVjdHVyZShnZW5lcmljX2tleSk7CisKKyAgZ2VuZXJpY19rZXktPm11dGFibGVfcnNhMjA0OF9wdWJsaWNfa2V5KCktPnNldF9uKCJceDEwXHgwMFx4MTAiKTsKKworICB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiByZXN0b3JlZF9wdWJsaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmdlbmVyaWNfa2V5KTsKKworICBBU1NFUlRfRVEobnVsbHB0ciwgcmVzdG9yZWRfcHVibGljX2tleSk7Cit9CisKK1RFU1RfRihQdWJsaWNLZXlQcm90b1V0aWxUZXN0LAorICAgICAgIFBhcnNlSW52YWxpZEVuY29kaW5nUnNhMjA0OF9Nb2R1bHVzRW5jb2RpbmdUb29Mb25nKSB7CisgIFNldFJzYTIwNDhQdWJsaWNLZXkoKTsKKworICB1bmlxdWVfcHRyPEdlbmVyaWNQdWJsaWNLZXk+IGdlbmVyaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6RW5jb2RlUHVibGljS2V5KCpwdWJsaWNfa2V5Xyk7CisKKyAgQXNzZXJ0S2V5SGFzU2ltcGxlUnNhU3RydWN0dXJlKGdlbmVyaWNfa2V5KTsKKworICBnZW5lcmljX2tleS0+bXV0YWJsZV9yc2EyMDQ4X3B1YmxpY19rZXkoKS0+c2V0X24oCisgICAgICBzdHJpbmcoIlx4MDBceDAwXHg4MCIsIDMpLmFwcGVuZChzdHJpbmcoMjU1LCAnMCcpKSk7CisKKyAgdW5pcXVlX3B0cjxDcnlwdG9PcHM6OlB1YmxpY0tleT4gcmVzdG9yZWRfcHVibGljX2tleSA9CisgICAgICBQdWJsaWNLZXlQcm90b1V0aWw6OlBhcnNlUHVibGljS2V5KCpnZW5lcmljX2tleSk7CisKKyAgQVNTRVJUX0VRKG51bGxwdHIsIHJlc3RvcmVkX3B1YmxpY19rZXkpOworfQorCitURVNUX0YoUHVibGljS2V5UHJvdG9VdGlsVGVzdCwgUGFyc2VJbnZhbGlkRW5jb2RpbmdSc2EyMDQ4X01vZHVsdXNOb3QyMDQ4Yml0KSB7CisgIFNldFJzYTIwNDhQdWJsaWNLZXkoKTsKKworICB1bmlxdWVfcHRyPEdlbmVyaWNQdWJsaWNLZXk+IGdlbmVyaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6RW5jb2RlUHVibGljS2V5KCpwdWJsaWNfa2V5Xyk7CisKKyAgQXNzZXJ0S2V5SGFzU2ltcGxlUnNhU3RydWN0dXJlKGdlbmVyaWNfa2V5KTsKKworICBnZW5lcmljX2tleS0+bXV0YWJsZV9yc2EyMDQ4X3B1YmxpY19rZXkoKS0+c2V0X24oCisgICAgICBzdHJpbmcoIlx4N0YiKS5hcHBlbmQoc3RyaW5nKDI1NSwgJzAnKSkpOworCisgIHVuaXF1ZV9wdHI8Q3J5cHRvT3BzOjpQdWJsaWNLZXk+IHJlc3RvcmVkX3B1YmxpY19rZXkgPQorICAgICAgUHVibGljS2V5UHJvdG9VdGlsOjpQYXJzZVB1YmxpY0tleSgqZ2VuZXJpY19rZXkpOworCisgIEFTU0VSVF9FUShudWxscHRyLCByZXN0b3JlZF9wdWJsaWNfa2V5KTsKK30KKworVEVTVF9GKFB1YmxpY0tleVByb3RvVXRpbFRlc3QsIFBhcnNlSW52YWxpZEVuY29kaW5nUnNhMjA0OF9Eb3VibGVNb2R1bHVzU2l6ZSkgeworICBTZXRSc2EyMDQ4UHVibGljS2V5KCk7CisKKyAgdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBnZW5lcmljX2tleSA9CisgICAgICBQdWJsaWNLZXlQcm90b1V0aWw6OkVuY29kZVB1YmxpY0tleSgqcHVibGljX2tleV8pOworCisgIEFzc2VydEtleUhhc1NpbXBsZVJzYVN0cnVjdHVyZShnZW5lcmljX2tleSk7CisKKyAgZ2VuZXJpY19rZXktPm11dGFibGVfcnNhMjA0OF9wdWJsaWNfa2V5KCktPm11dGFibGVfbigpLT5hcHBlbmQoCisgICAgICBnZW5lcmljX2tleS0+cnNhMjA0OF9wdWJsaWNfa2V5KCkubigpKTsKKworICB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiByZXN0b3JlZF9wdWJsaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmdlbmVyaWNfa2V5KTsKKworICBBU1NFUlRfRVEobnVsbHB0ciwgcmVzdG9yZWRfcHVibGljX2tleSk7Cit9CisKK1RFU1RfRihQdWJsaWNLZXlQcm90b1V0aWxUZXN0LCBQYXJzZUludmFsaWRLZXlUeXBlRm9yUnNhMjA0OCkgeworICBTZXRSc2EyMDQ4UHVibGljS2V5KCk7CisKKyAgdW5pcXVlX3B0cjxHZW5lcmljUHVibGljS2V5PiBnZW5lcmljX2tleSA9CisgICAgICBQdWJsaWNLZXlQcm90b1V0aWw6OkVuY29kZVB1YmxpY0tleSgqcHVibGljX2tleV8pOworCisgIEFzc2VydEtleUhhc1NpbXBsZVJzYVN0cnVjdHVyZShnZW5lcmljX2tleSk7CisgIGdlbmVyaWNfa2V5LT5zZXRfdHlwZShQdWJsaWNLZXlUeXBlOjpFQ19QMjU2KTsKKworICB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiByZXN0b3JlZF9wdWJsaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmdlbmVyaWNfa2V5KTsKKworICBBU1NFUlRfRVEobnVsbHB0ciwgcmVzdG9yZWRfcHVibGljX2tleSk7Cit9CisKK1RFU1RfRihQdWJsaWNLZXlQcm90b1V0aWxUZXN0LCBQYXJzZUludmFsaWRLZXlUeXBlRm9yRWNQMjU2KSB7CisgIFNldEVjUDI1NlB1YmxpY0tleSgpOworCisgIHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4gZ2VuZXJpY19rZXkgPQorICAgICAgUHVibGljS2V5UHJvdG9VdGlsOjpFbmNvZGVQdWJsaWNLZXkoKnB1YmxpY19rZXlfKTsKKworICBBU1NFUlRfTkUobnVsbHB0ciwgZ2VuZXJpY19rZXkpOworICBBU1NFUlRfRVEoZ2VuZXJpY19rZXktPnR5cGUoKSwgUHVibGljS2V5VHlwZTo6RUNfUDI1Nik7CisgIGdlbmVyaWNfa2V5LT5zZXRfdHlwZShQdWJsaWNLZXlUeXBlOjpSU0EyMDQ4KTsKKworICB1bmlxdWVfcHRyPENyeXB0b09wczo6UHVibGljS2V5PiByZXN0b3JlZF9wdWJsaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6UGFyc2VQdWJsaWNLZXkoKmdlbmVyaWNfa2V5KTsKKworICBBU1NFUlRfRVEobnVsbHB0ciwgcmVzdG9yZWRfcHVibGljX2tleSk7Cit9CisKK1RFU1RfRihQdWJsaWNLZXlQcm90b1V0aWxUZXN0LCBFbmNvZGVJbnZhbGlkS2V5VHlwZUZvclJzYTIwNDgpIHsKKyAgU2V0UnNhMjA0OFB1YmxpY0tleSgpOworCisgIHVuaXF1ZV9wdHI8R2VuZXJpY1B1YmxpY0tleT4gZ2VuZXJpY19rZXkgPQorICAgICAgUHVibGljS2V5UHJvdG9VdGlsOjpFbmNvZGVQdWJsaWNLZXkoCisgICAgICAgICAgQ3J5cHRvT3BzOjpQdWJsaWNLZXkocHVibGljX2tleV8tPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcnlwdG9PcHM6OkVDRFNBX0tFWSkpOworCisgIEFTU0VSVF9FUShudWxscHRyLCBnZW5lcmljX2tleSk7Cit9CisKK1RFU1RfRihQdWJsaWNLZXlQcm90b1V0aWxUZXN0LCBFbmNvZGVJbnZhbGlkS2V5VHlwZUZvckVjUDI1NikgeworICBTZXRFY1AyNTZQdWJsaWNLZXkoKTsKKworICB1bmlxdWVfcHRyPEdlbmVyaWNQdWJsaWNLZXk+IGdlbmVyaWNfa2V5ID0KKyAgICAgIFB1YmxpY0tleVByb3RvVXRpbDo6RW5jb2RlUHVibGljS2V5KAorICAgICAgICAgIENyeXB0b09wczo6UHVibGljS2V5KHB1YmxpY19rZXlfLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvT3BzOjpSU0FfS0VZKSk7CisKKyAgQVNTRVJUX0VRKG51bGxwdHIsIGdlbmVyaWNfa2V5KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdW5pdHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBzZWN1cmVtZXNzYWdlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGVzdC9zZWN1cmVtZXNzYWdlL3NlY3VyZV9tZXNzYWdlX3BhcnNlcl90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3Rlc3Qvc2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9wYXJzZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWYyYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3Rlc3Qvc2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9wYXJzZXJfdGVzdC5jYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAic2VjdXJlbWVzc2FnZS9zZWN1cmVfbWVzc2FnZV9wYXJzZXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCitzdGF0aWMgY29uc3QgY2hhcioga1ZlcmlmaWNhdGlvbktleUlkID0gInRlc3QgdmVyaWZpY2F0aW9uIGtleSBpZCI7CitzdGF0aWMgY29uc3QgY2hhcioga0RlY3J5cHRpb25LZXlJZCA9ICJ0ZXN0IGRlY3J5cHRpb24ga2V5IGlkIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrSVYgPSAidGVzdCBpdiI7CitzdGF0aWMgY29uc3QgY2hhcioga1B1YmxpY01ldGFEYXRhID0gInRlc3QgbWV0YWRhdGEiOworc3RhdGljIGNvbnN0IGNoYXIqIGtTaWduYXR1cmUgPSAidGVzdCBzaWduYXR1cmUiOworc3RhdGljIGNvbnN0IGNoYXIqIGtCb2R5ID0gInRlc3QgYm9keSI7CitzdGF0aWMgY29uc3QgY2hhcioga0Fzc29jaWF0ZWREYXRhID0gInRlc3QgYXNzb2NpYXRlZCBkYXRhIjsKKwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOworCituYW1lc3BhY2Ugc2VjdXJlbWVzc2FnZSB7CituYW1lc3BhY2UgeworCitzdGF0aWMgU2lnU2NoZW1lIGtTaWdTY2hlbWUgPSBITUFDX1NIQTI1NjsKK3N0YXRpYyBFbmNTY2hlbWUga0VuY1NjaGVtZSA9IEFFU18yNTZfQ0JDOworCitjbGFzcyBTZWN1cmVNZXNzYWdlUGFyc2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHVuaXF1ZV9wdHI8SGVhZGVyPiBoZWFkZXJfOworICB1bmlxdWVfcHRyPEhlYWRlckFuZEJvZHk+IGhlYWRlcl9hbmRfYm9keV87CisgIHVuaXF1ZV9wdHI8U2VjdXJlTWVzc2FnZT4gc2VjdXJlX21lc3NhZ2VfOworCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBoZWFkZXJfLnJlc2V0KG5ldyBIZWFkZXIoKSk7CisgICAgaGVhZGVyXy0+c2V0X3ZlcmlmaWNhdGlvbl9rZXlfaWQoa1ZlcmlmaWNhdGlvbktleUlkKTsKKyAgICBoZWFkZXJfLT5zZXRfZGVjcnlwdGlvbl9rZXlfaWQoa0RlY3J5cHRpb25LZXlJZCk7CisgICAgaGVhZGVyXy0+c2V0X2l2KGtJVik7CisgICAgaGVhZGVyXy0+c2V0X3B1YmxpY19tZXRhZGF0YShrUHVibGljTWV0YURhdGEpOworICAgIGhlYWRlcl8tPnNldF9zaWduYXR1cmVfc2NoZW1lKGtTaWdTY2hlbWUpOworICAgIGhlYWRlcl8tPnNldF9lbmNyeXB0aW9uX3NjaGVtZShrRW5jU2NoZW1lKTsKKyAgICBoZWFkZXJfLT5zZXRfYXNzb2NpYXRlZF9kYXRhX2xlbmd0aChzdHJsZW4oa0Fzc29jaWF0ZWREYXRhKSk7CisKKyAgICBoZWFkZXJfYW5kX2JvZHlfLnJlc2V0KG5ldyBIZWFkZXJBbmRCb2R5KCkpOworICAgIGhlYWRlcl9hbmRfYm9keV8tPnNldF9hbGxvY2F0ZWRfaGVhZGVyKG5ldyBIZWFkZXIoKmhlYWRlcl8pKTsKKyAgICBoZWFkZXJfYW5kX2JvZHlfLT5zZXRfYm9keShrQm9keSk7CisKKyAgICBzZWN1cmVfbWVzc2FnZV8ucmVzZXQobmV3IFNlY3VyZU1lc3NhZ2UoKSk7CisgICAgc2VjdXJlX21lc3NhZ2VfLT5zZXRfaGVhZGVyX2FuZF9ib2R5KGhlYWRlcl9hbmRfYm9keV8tPlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICAgIHNlY3VyZV9tZXNzYWdlXy0+c2V0X3NpZ25hdHVyZShrU2lnbmF0dXJlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBoZWFkZXJfLT5DbGVhcigpOworICAgIGhlYWRlcl9hbmRfYm9keV8tPkNsZWFyKCk7CisgICAgc2VjdXJlX21lc3NhZ2VfLT5DbGVhcigpOworICB9Cit9OworCitURVNUX0YoU2VjdXJlTWVzc2FnZVBhcnNlclRlc3QsIEdldFVudmVyaWZpZWRIZWFkZXIpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEhlYWRlcj4gdGVzdF9oZWFkZXIgPQorICAgICAgU2VjdXJlTWVzc2FnZVBhcnNlcjo6R2V0VW52ZXJpZmllZEhlYWRlcigqc2VjdXJlX21lc3NhZ2VfKTsKKworICBFWFBFQ1RfTkUobnVsbHB0ciwgdGVzdF9oZWFkZXIpOworICBFWFBFQ1RfRVEoa1ZlcmlmaWNhdGlvbktleUlkLCB0ZXN0X2hlYWRlci0+dmVyaWZpY2F0aW9uX2tleV9pZCgpKTsKKyAgRVhQRUNUX0VRKGtEZWNyeXB0aW9uS2V5SWQsIHRlc3RfaGVhZGVyLT5kZWNyeXB0aW9uX2tleV9pZCgpKTsKKyAgRVhQRUNUX0VRKGtJViwgdGVzdF9oZWFkZXItPml2KCkpOworICBFWFBFQ1RfRVEoa1B1YmxpY01ldGFEYXRhLCB0ZXN0X2hlYWRlci0+cHVibGljX21ldGFkYXRhKCkpOworICBFWFBFQ1RfRVEoSE1BQ19TSEEyNTYsIHRlc3RfaGVhZGVyLT5zaWduYXR1cmVfc2NoZW1lKCkpOworICBFWFBFQ1RfRVEoQUVTXzI1Nl9DQkMsIHRlc3RfaGVhZGVyLT5lbmNyeXB0aW9uX3NjaGVtZSgpKTsKKyAgRVhQRUNUX0VRKHN0cmxlbihrQXNzb2NpYXRlZERhdGEpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90Pih0ZXN0X2hlYWRlci0+YXNzb2NpYXRlZF9kYXRhX2xlbmd0aCgpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHNlY3VyZW1lc3NhZ2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvQ0hBTkdFUyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvQ0hBTkdFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTUyMTMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9DSEFOR0VTCkBAIC0wLDAgKzEsMTU3IEBACitDaGFuZ2VzIGZvciAxLjcuMDoKKworKiBOZXcgZmVhdHVyZTogZGVhdGggdGVzdHMgYXJlIHN1cHBvcnRlZCBvbiBPcGVuQlNEIGFuZCBpbiBpT1MKKyAgc2ltdWxhdG9yIG5vdy4KKyogTmV3IGZlYXR1cmU6IEdvb2dsZSBUZXN0IG5vdyBpbXBsZW1lbnRzIGEgcHJvdG9jb2wgdG8gYWxsb3cKKyAgYSB0ZXN0IHJ1bm5lciB0byBkZXRlY3QgdGhhdCBhIHRlc3QgcHJvZ3JhbSBoYXMgZXhpdGVkCisgIHByZW1hdHVyZWx5IGFuZCByZXBvcnQgaXQgYXMgYSBmYWlsdXJlIChiZWZvcmUgaXQgd291bGQgYmUKKyAgZmFsc2VseSByZXBvcnRlZCBhcyBhIHN1Y2Nlc3MgaWYgdGhlIGV4aXQgY29kZSBpcyAwKS4KKyogTmV3IGZlYXR1cmU6IFRlc3Q6OlJlY29yZFByb3BlcnR5KCkgY2FuIG5vdyBiZSB1c2VkIG91dHNpZGUgb2YgdGhlCisgIGxpZmVzcGFuIG9mIGEgdGVzdCBtZXRob2QsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBhdHRyaWJ1dGVkIHRvCisgIHRoZSBjdXJyZW50IHRlc3QgY2FzZSBvciB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBYTUwgcmVwb3J0LgorKiBOZXcgZmVhdHVyZSAocG90ZW50aWFsbHkgYnJlYWtpbmcpOiAtLWd0ZXN0X2xpc3RfdGVzdHMgbm93IHByaW50cworICB0aGUgdHlwZSBwYXJhbWV0ZXJzIGFuZCB2YWx1ZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHRlc3QuCisqIEltcHJvdmVtZW50OiBjaGFyIHBvaW50ZXJzIGFuZCBjaGFyIGFycmF5cyBhcmUgbm93IGVzY2FwZWQgcHJvcGVybHkKKyAgaW4gZmFpbHVyZSBtZXNzYWdlcy4KKyogSW1wcm92ZW1lbnQ6IGZhaWx1cmUgc3VtbWFyeSBpbiBYTUwgcmVwb3J0cyBub3cgaW5jbHVkZXMgZmlsZSBhbmQKKyAgbGluZSBpbmZvcm1hdGlvbi4KKyogSW1wcm92ZW1lbnQ6IHRoZSA8dGVzdHN1aXRlcz4gWE1MIGVsZW1lbnQgbm93IGhhcyBhIHRpbWVzdGFtcCBhdHRyaWJ1dGUuCisqIEltcHJvdmVtZW50OiBXaGVuIC0tZ3Rlc3RfZmlsdGVyIGlzIHNwZWNpZmllZCwgWE1MIHJlcG9ydCBub3cgZG9lc24ndAorICBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzIHRoYXQgYXJlIGZpbHRlcmVkIG91dC4KKyogRml4ZWQgdGhlIGJ1ZyB3aGVyZSBsb25nIC0tZ3Rlc3RfZmlsdGVyIGZsYWcgdmFsdWVzIGFyZSB0cnVuY2F0ZWQgaW4KKyAgZGVhdGggdGVzdHMuCisqIFBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZTogUlVOX0FMTF9URVNUUygpIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhCisgIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBtYWNybyBpbiBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIENsYW5nLgorKiBDb21wYXRpYmlsaXR5IGZpeGVzIHdpdGggQysrIDExIGFuZCB2YXJpb3VzIHBsYXRmb3Jtcy4KKyogQnVnL3dhcm5pbmcgZml4ZXMuCisKK0NoYW5nZXMgZm9yIDEuNi4wOgorCisqIE5ldyBmZWF0dXJlOiBBRERfRkFJTFVSRV9BVCgpIGZvciByZXBvcnRpbmcgYSB0ZXN0IGZhaWx1cmUgYXQgdGhlCisgIGdpdmVuIHNvdXJjZSBsb2NhdGlvbiAtLSB1c2VmdWwgZm9yIHdyaXRpbmcgdGVzdGluZyB1dGlsaXRpZXMuCisqIE5ldyBmZWF0dXJlOiB0aGUgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgaXMgbW92ZWQgZnJvbSBHb29nbGUgTW9jaworICB0byBHb29nbGUgVGVzdC4KKyogTmV3IGZlYXR1cmU6IHR5cGUgcGFyYW1ldGVycyBhbmQgdmFsdWUgcGFyYW1ldGVycyBhcmUgcmVwb3J0ZWQgaW4KKyAgdGhlIFhNTCByZXBvcnQgbm93LgorKiBBIGd0ZXN0X2Rpc2FibGVfcHRocmVhZHMgQ01ha2Ugb3B0aW9uLgorKiBDb2xvcmVkIG91dHB1dCB3b3JrcyBpbiBHTlUgU2NyZWVuIHNlc3Npb25zIG5vdy4KKyogUGFyYW1ldGVycyBvZiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBub3cgcHJpbnRlZCBpbiB0aGUKKyAgdGV4dHVhbCBvdXRwdXQuCisqIEZhaWx1cmVzIGZyb20gYWQgaG9jIHRlc3QgYXNzZXJ0aW9ucyBydW4gYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBhcmUKKyAgbm93IGNvcnJlY3RseSByZXBvcnRlZC4KKyogQXJndW1lbnRzIG9mIEFTU0VSVF9YWSBhbmQgRVhQRUNUX1hZIG5vIGxvbmdlciBuZWVkIHRvIHN1cHBvcnQgPDwgdG8KKyAgb3N0cmVhbS4KKyogTW9yZSBjb21wbGV0ZSBoYW5kbGluZyBvZiBleGNlcHRpb25zLgorKiBHVEVTVF9BU1NFUlRfWFkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBBU1NFUlRfWFkgaW4gY2FzZSB0aGUgbGF0dGVyCisgIG5hbWUgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgbGlicmFyeS4KKyogLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIGlzIG5vdyB0cnVlIGJ5IGRlZmF1bHQsIGFsbG93aW5nIGEgdGVzdAorICBwcm9ncmFtIHRvIGNvbnRpbnVlIGFmdGVyIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisqIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlcyBjYW4gbm93IGRlcml2ZSBmcm9tIFRlc3QgYW5kCisgIFdpdGhQYXJhbUludGVyZmFjZTxUPiBzZXBhcmF0ZWx5LCBlYXNpbmcgY29udmVyc2lvbiBvZiBsZWdhY3kgdGVzdHMuCisqIERlYXRoIHRlc3QgbWVzc2FnZXMgYXJlIGNsZWFybHkgbWFya2VkIHRvIG1ha2UgdGhlbSBtb3JlCisgIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIG90aGVyIG1lc3NhZ2VzLgorKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBBbmRyb2lkLCBHb29nbGUgTmF0aXZlIENsaWVudCwgTWluR1csIEhQIFVYLAorICBQb3dlclBDLCBMdWNpZCBhdXRvdG9vbHMsIGxpYkNTdGQsIFN1biBDKyssIEJvcmxhbmQgQysrIEJ1aWxkZXIgKENvZGUgR2VhciksCisgIElCTSBYTCBDKysgKFZpc3VhbCBBZ2UgQysrKSwgYW5kIEMrKzB4LgorKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKyogUG90ZW50aWFsbHkgaW5jb21wYXRpYmxlIGNoYW5nZXM6IGRpc2FibGVzIHRoZSBoYXJtZnVsICdtYWtlIGluc3RhbGwnCisgIGNvbW1hbmQgaW4gYXV0b3Rvb2xzLgorCitDaGFuZ2VzIGZvciAxLjUuMDoKKworICogTmV3IGZlYXR1cmU6IGFzc2VydGlvbnMgY2FuIGJlIHNhZmVseSBjYWxsZWQgaW4gbXVsdGlwbGUgdGhyZWFkcworICAgd2hlcmUgdGhlIHB0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlLgorICogTmV3IGZlYXR1cmU6IHByZWRpY2F0ZXMgdXNlZCBpbnNpZGUgRVhQRUNUX1RSVUUoKSBhbmQgZnJpZW5kcworICAgY2FuIG5vdyBnZW5lcmF0ZSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlcy4KKyAqIE5ldyBmZWF0dXJlOiBHb29nbGUgVGVzdCBjYW4gbm93IGJlIGNvbXBpbGVkIGFzIGEgRExMLgorICogTmV3IGZlYXR1cmU6IGZ1c2VkIHNvdXJjZSBmaWxlcyBhcmUgaW5jbHVkZWQuCisgKiBOZXcgZmVhdHVyZTogcHJpbnRzIGhlbHAgd2hlbiBlbmNvdW50ZXJpbmcgdW5yZWNvZ25pemVkIEdvb2dsZSBUZXN0IGZsYWdzLgorICogRXhwZXJpbWVudGFsIGZlYXR1cmU6IENNYWtlIGJ1aWxkIHNjcmlwdCAocmVxdWlyZXMgQ01ha2UgMi42LjQrKS4KKyAqIEV4cGVyaW1lbnRhbCBmZWF0dXJlOiB0aGUgUHVtcCBzY3JpcHQgZm9yIG1ldGEgcHJvZ3JhbW1pbmcuCisgKiBkb3VibGUgdmFsdWVzIHN0cmVhbWVkIHRvIGFuIGFzc2VydGlvbiBhcmUgcHJpbnRlZCB3aXRoIGVub3VnaCBwcmVjaXNpb24KKyAgIHRvIGRpZmZlcmVudGlhdGUgYW55IHR3byBkaWZmZXJlbnQgdmFsdWVzLgorICogR29vZ2xlIFRlc3Qgbm93IHdvcmtzIG9uIFNvbGFyaXMgYW5kIEFJWC4KKyAqIEJ1aWxkIGFuZCB0ZXN0IHNjcmlwdCBpbXByb3ZlbWVudHMuCisgKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKworIFBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZXM6CisKKyAqIFN0b3BwZWQgc3VwcG9ydGluZyBWQysrIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisgKiBEcm9wcGVkIHN1cHBvcnQgZm9yICdtYWtlIGluc3RhbGwnLgorCitDaGFuZ2VzIGZvciAxLjQuMDoKKworICogTmV3IGZlYXR1cmU6IHRoZSBldmVudCBsaXN0ZW5lciBBUEkKKyAqIE5ldyBmZWF0dXJlOiB0ZXN0IHNodWZmbGluZworICogTmV3IGZlYXR1cmU6IHRoZSBYTUwgcmVwb3J0IGZvcm1hdCBpcyBjbG9zZXIgdG8ganVuaXRyZXBvcnQgYW5kIGNhbgorICAgYmUgcGFyc2VkIGJ5IEh1ZHNvbiBub3cuCisgKiBOZXcgZmVhdHVyZTogd2hlbiBhIHRlc3QgcnVucyB1bmRlciBWaXN1YWwgU3R1ZGlvLCBpdHMgZmFpbHVyZXMgYXJlCisgICBpbnRlZ3JhdGVkIGluIHRoZSBJREUuCisgKiBOZXcgZmVhdHVyZTogL01EKGQpIHZlcnNpb25zIG9mIFZDKysgcHJvamVjdHMuCisgKiBOZXcgZmVhdHVyZTogZWxhcHNlZCB0aW1lIGZvciB0aGUgdGVzdHMgaXMgcHJpbnRlZCBieSBkZWZhdWx0LgorICogTmV3IGZlYXR1cmU6IGNvbWVzIHdpdGggYSBUUjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc3VjaCB0aGF0IEJvb3N0CisgICBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBDb21iaW5lKCkuCisgKiBOZXcgZmVhdHVyZTogRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBtYWNybyBhbmQgZnJpZW5kcy4KKyAqIE5ldyBmZWF0dXJlOiB0aGUgWGNvZGUgcHJvamVjdCBjYW4gbm93IHByb2R1Y2Ugc3RhdGljIGd0ZXN0CisgICBsaWJyYXJpZXMgaW4gYWRkaXRpb24gdG8gYSBmcmFtZXdvcmsuCisgKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBTb2xhcmlzLCBDeWd3aW4sIG1pbkdXLCBXaW5kb3dzIE1vYmlsZSwKKyAgIFN5bWJpYW4sIGdjYywgYW5kIEMrK0J1aWxkZXIuCisgKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKworQ2hhbmdlcyBmb3IgMS4zLjA6CisKKyAqIE5ldyBmZWF0dXJlOiBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLCBDeWd3aW4sIGFuZCBNYWMuCisgKiBOZXcgZmVhdHVyZTogYWJpbGl0eSB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbiBvdGhlciB0ZXN0aW5nCisgICBmcmFtZXdvcmtzLgorICogTmV3IGZlYXR1cmU6IGFiaWxpdHkgdG8gcnVuIGRpc2FibGVkIHRlc3QgdmlhCisgICAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzLgorICogTmV3IGZlYXR1cmU6IHRoZSAtLWhlbHAgZmxhZyBmb3IgcHJpbnRpbmcgdGhlIHVzYWdlLgorICogTmV3IGZlYXR1cmU6IGFjY2VzcyB0byBHb29nbGUgVGVzdCBmbGFnIHZhbHVlcyBpbiB1c2VyIGNvZGUuCisgKiBOZXcgZmVhdHVyZTogYSBzY3JpcHQgdGhhdCBwYWNrcyBHb29nbGUgVGVzdCBpbnRvIG9uZSAuaCBhbmQgb25lCisgICAuY2MgZmlsZSBmb3IgZWFzeSBkZXBsb3ltZW50LgorICogTmV3IGZlYXR1cmU6IHN1cHBvcnQgZm9yIGRpc3RyaWJ1dGluZyB0ZXN0IGZ1bmN0aW9ucyB0byBtdWx0aXBsZQorICAgbWFjaGluZXMgKHJlcXVpcmVzIHN1cHBvcnQgZnJvbSB0aGUgdGVzdCBydW5uZXIpLgorICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKK0NoYW5nZXMgZm9yIDEuMi4xOgorCisgKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBMaW51eCBJQS02NCBhbmQgSUJNIHovT1MuCisgKiBBZGRlZCBzdXBwb3J0IGZvciB1c2luZyBCb29zdCBhbmQgb3RoZXIgVFIxIGltcGxlbWVudGF0aW9ucy4KKyAqIENoYW5nZXMgdG8gdGhlIGJ1aWxkIHNjcmlwdHMgdG8gc3VwcG9ydCB1cGNvbWluZyByZWxlYXNlIG9mIEdvb2dsZSBDKysKKyAgIE1vY2tpbmcgRnJhbWV3b3JrLgorICogQWRkZWQgTWFrZWZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBwYWNrYWdlLgorICogSW1wcm92ZWQgYnVpbGQgaW5zdHJ1Y3Rpb25zIGluIFJFQURNRS4KKworQ2hhbmdlcyBmb3IgMS4yLjA6CisKKyAqIE5ldyBmZWF0dXJlOiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorICogTmV3IGZlYXR1cmU6IHRoZSBBU1NFUlQvRVhQRUNUXyhOT04pRkFUQUxfRkFJTFVSRShfT05fQUxMX1RIUkVBRFMpCisgICBtYWNyb3MuCisgKiBDaGFuZ2VkIHRoZSBYTUwgcmVwb3J0IGZvcm1hdCB0byBtYXRjaCBKVW5pdC9BbnQncy4KKyAqIEFkZGVkIHRlc3RzIHRvIHRoZSBYY29kZSBwcm9qZWN0LgorICogQWRkZWQgc2NvbnMvU0NvbnNjcmlwdCBmb3IgYnVpbGRpbmcgd2l0aCBTQ29ucy4KKyAqIEFkZGVkIHNyYy9ndGVzdC1hbGwuY2MgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0IGZyb20gYSBzaW5nbGUgZmlsZS4KKyAqIEZpeGVkIGNvbXBhdGliaWxpdHkgd2l0aCBTb2xhcmlzIGFuZCB6L09TLgorICogRW5hYmxlZCBydW5uaW5nIFB5dGhvbiB0ZXN0cyBvbiBzeXN0ZW1zIHdpdGggcHl0aG9uIDIuMyBpbnN0YWxsZWQsCisgICBlLmcuIE1hYyBPUyBYIDEwLjQuCisgKiBCdWcgZml4ZXMuCisKK0NoYW5nZXMgZm9yIDEuMS4wOgorCisgKiBOZXcgZmVhdHVyZTogdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorICogTmV3IGZlYXR1cmU6IGV4Y2VwdGlvbiBhc3NlcnRpb25zLgorICogTmV3IGZlYXR1cmU6IHByaW50aW5nIGVsYXBzZWQgdGltZSBvZiB0ZXN0cy4KKyAqIEltcHJvdmVkIHRoZSByb2J1c3RuZXNzIG9mIGRlYXRoIHRlc3RzLgorICogQWRkZWQgYW4gWGNvZGUgcHJvamVjdCBhbmQgc2FtcGxlcy4KKyAqIEFkanVzdGVkIHRoZSBvdXRwdXQgZm9ybWF0IG9uIFdpbmRvd3MgdG8gYmUgdW5kZXJzdGFuZGFibGUgYnkgVmlzdWFsIFN0dWRpby4KKyAqIE1pbm9yIGJ1ZyBmaXhlcy4KKworQ2hhbmdlcyBmb3IgMS4wLjE6CisKKyAqIEFkZGVkIHByb2plY3QgZmlsZXMgZm9yIFZpc3VhbCBTdHVkaW8gNy4xLgorICogRml4ZWQgaXNzdWVzIHdpdGggY29tcGlsaW5nIG9uIE1hYyBPUyBYLgorICogRml4ZWQgaXNzdWVzIHdpdGggY29tcGlsaW5nIG9uIEN5Z3dpbi4KKworQ2hhbmdlcyBmb3IgMS4wLjA6CisKKyAqIEluaXRpYWwgT3BlbiBTb3VyY2UgcmVsZWFzZSBvZiBHb29nbGUgVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0NzBjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNTIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDTWFrZSBidWlsZCBzY3JpcHQgZm9yIEdvb2dsZSBUZXN0LgorIworIyBUbyBydW4gdGhlIHRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYgb24gTGludXgsIHVzZSAnbWFrZSB0ZXN0JyBvcgorIyBjdGVzdC4gIFlvdSBjYW4gc2VsZWN0IHdoaWNoIHRlc3RzIHRvIHJ1biB1c2luZyAnY3Rlc3QgLVIgcmVnZXgnLgorIyBGb3IgbW9yZSBvcHRpb25zLCBydW4gJ2N0ZXN0IC0taGVscCcuCisKKyMgQlVJTERfU0hBUkVEX0xJQlMgaXMgYSBzdGFuZGFyZCBDTWFrZSB2YXJpYWJsZSwgYnV0IHdlIGRlY2xhcmUgaXQgaGVyZSB0bworIyBtYWtlIGl0IHByb21pbmVudCBpbiB0aGUgR1VJLgorb3B0aW9uKEJVSUxEX1NIQVJFRF9MSUJTICJCdWlsZCBzaGFyZWQgbGlicmFyaWVzIChETExzKS4iIE9GRikKKworIyBXaGVuIG90aGVyIGxpYnJhcmllcyBhcmUgdXNpbmcgYSBzaGFyZWQgdmVyc2lvbiBvZiBydW50aW1lIGxpYnJhcmllcywKKyMgR29vZ2xlIFRlc3QgYWxzbyBoYXMgdG8gdXNlIG9uZS4KK29wdGlvbigKKyAgZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydAorICAiVXNlIHNoYXJlZCAoRExMKSBydW4tdGltZSBsaWIgZXZlbiB3aGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIHN0YXRpYyBsaWIuIgorICBPRkYpCisKK29wdGlvbihndGVzdF9idWlsZF90ZXN0cyAiQnVpbGQgYWxsIG9mIGd0ZXN0J3Mgb3duIHRlc3RzLiIgT0ZGKQorCitvcHRpb24oZ3Rlc3RfYnVpbGRfc2FtcGxlcyAiQnVpbGQgZ3Rlc3QncyBzYW1wbGUgcHJvZ3JhbXMuIiBPRkYpCisKK29wdGlvbihndGVzdF9kaXNhYmxlX3B0aHJlYWRzICJEaXNhYmxlIHVzZXMgb2YgcHRocmVhZHMgaW4gZ3Rlc3QuIiBPRkYpCisKKyMgRGVmaW5lcyBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKSBhbmQgc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkuCitpbmNsdWRlKGNtYWtlL2hlcm1ldGljX2J1aWxkLmNtYWtlIE9QVElPTkFMKQorCitpZiAoQ09NTUFORCBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQpCisgIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCgpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQcm9qZWN0LXdpZGUgc2V0dGluZ3MKKworIyBOYW1lIG9mIHRoZSBwcm9qZWN0LgorIworIyBDTWFrZSBmaWxlcyBpbiB0aGlzIHByb2plY3QgY2FuIHJlZmVyIHRvIHRoZSByb290IHNvdXJjZSBkaXJlY3RvcnkKKyMgYXMgJHtndGVzdF9TT1VSQ0VfRElSfSBhbmQgdG8gdGhlIHJvb3QgYmluYXJ5IGRpcmVjdG9yeSBhcworIyAke2d0ZXN0X0JJTkFSWV9ESVJ9LgorIyBMYW5ndWFnZSAiQyIgaXMgcmVxdWlyZWQgZm9yIGZpbmRfcGFja2FnZShUaHJlYWRzKS4KK3Byb2plY3QoZ3Rlc3QgQ1hYIEMpCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42LjIpCisKK2lmIChDT01NQU5EIHNldF91cF9oZXJtZXRpY19idWlsZCkKKyAgc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkKK2VuZGlmKCkKKworIyBEZWZpbmUgaGVscGVyIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWQgYnkgR29vZ2xlIFRlc3QuCitpbmNsdWRlKGNtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlKQorCitjb25maWdfY29tcGlsZXJfYW5kX2xpbmtlcigpICAjIERlZmluZWQgaW4gaW50ZXJuYWxfdXRpbHMuY21ha2UuCisKKyMgV2hlcmUgR29vZ2xlIFRlc3QncyAuaCBmaWxlcyBjYW4gYmUgZm91bmQuCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAke2d0ZXN0X1NPVVJDRV9ESVJ9L2luY2x1ZGUKKyAgJHtndGVzdF9TT1VSQ0VfRElSfSkKKworIyBXaGVyZSBHb29nbGUgVGVzdCdzIGxpYnJhcmllcyBjYW4gYmUgZm91bmQuCitsaW5rX2RpcmVjdG9yaWVzKCR7Z3Rlc3RfQklOQVJZX0RJUn0vc3JjKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRGVmaW5lcyB0aGUgZ3Rlc3QgJiBndGVzdF9tYWluIGxpYnJhcmllcy4gIFVzZXIgdGVzdHMgc2hvdWxkIGxpbmsKKyMgd2l0aCBvbmUgb2YgdGhlbS4KKworIyBHb29nbGUgVGVzdCBsaWJyYXJpZXMuICBXZSBidWlsZCB0aGVtIHVzaW5nIG1vcmUgc3RyaWN0IHdhcm5pbmdzIHRoYW4gd2hhdAorIyBhcmUgdXNlZCBmb3Igb3RoZXIgdGFyZ2V0cywgdG8gZW5zdXJlIHRoYXQgZ3Rlc3QgY2FuIGJlIGNvbXBpbGVkIGJ5IGEgdXNlcgorIyBhZ2dyZXNzaXZlIGFib3V0IHdhcm5pbmdzLgorY3h4X2xpYnJhcnkoZ3Rlc3QgIiR7Y3h4X3N0cmljdH0iIHNyYy9ndGVzdC1hbGwuY2MpCitjeHhfbGlicmFyeShndGVzdF9tYWluICIke2N4eF9zdHJpY3R9IiBzcmMvZ3Rlc3RfbWFpbi5jYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhndGVzdF9tYWluIGd0ZXN0KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU2FtcGxlcyBvbiBob3cgdG8gbGluayB1c2VyIHRlc3RzIHdpdGggZ3Rlc3Qgb3IgZ3Rlc3RfbWFpbi4KKyMKKyMgVGhleSBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuICBUbyBidWlsZCB0aGVtLCBzZXQgdGhlCisjIGd0ZXN0X2J1aWxkX3NhbXBsZXMgb3B0aW9uIHRvIE9OLiAgWW91IGNhbiBkbyBpdCBieSBydW5uaW5nIGNjbWFrZQorIyBvciBzcGVjaWZ5aW5nIHRoZSAtRGd0ZXN0X2J1aWxkX3NhbXBsZXM9T04gZmxhZyB3aGVuIHJ1bm5pbmcgY21ha2UuCisKK2lmIChndGVzdF9idWlsZF9zYW1wbGVzKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGUxX3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTEuY2MpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTJfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluIHNhbXBsZXMvc2FtcGxlMi5jYykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlM191bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4pCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTRfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluIHNhbXBsZXMvc2FtcGxlNC5jYykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlNV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4gc2FtcGxlcy9zYW1wbGUxLmNjKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU2X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbikKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlN191bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4pCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZThfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU5X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3QpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTEwX3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3QpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBHb29nbGUgVGVzdCdzIG93biB0ZXN0cy4KKyMKKyMgWW91IGNhbiBza2lwIHRoaXMgc2VjdGlvbiBpZiB5b3UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGVzdGluZworIyBHb29nbGUgVGVzdCBpdHNlbGYuCisjCisjIFRoZSB0ZXN0cyBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuICBUbyBidWlsZCB0aGVtLCBzZXQgdGhlCisjIGd0ZXN0X2J1aWxkX3Rlc3RzIG9wdGlvbiB0byBPTi4gIFlvdSBjYW4gZG8gaXQgYnkgcnVubmluZyBjY21ha2UKKyMgb3Igc3BlY2lmeWluZyB0aGUgLURndGVzdF9idWlsZF90ZXN0cz1PTiBmbGFnIHdoZW4gcnVubmluZyBjbWFrZS4KKworaWYgKGd0ZXN0X2J1aWxkX3Rlc3RzKQorICAjIFRoaXMgbXVzdCBiZSBzZXQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGZvciB0aGUgdGVzdHMgdG8gYmUgcnVuIGJ5CisgICMgJ21ha2UgdGVzdCcgb3IgY3Rlc3QuCisgIGVuYWJsZV90ZXN0aW5nKCkKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyBDKysgdGVzdHMgYnVpbHQgd2l0aCBzdGFuZGFyZCBjb21waWxlciBmbGFncy4KKworICBjeHhfdGVzdChndGVzdC1kZWF0aC10ZXN0X3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3QtZmlsZXBhdGhfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC1saW5rZWRfcHRyX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtbGlzdGVuZXJfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF9tYWluX3VuaXR0ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0LW1lc3NhZ2VfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF9ub190ZXN0X3VuaXR0ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdC1vcHRpb25zX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0IGd0ZXN0CisgICAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjKQorICBjeHhfdGVzdChndGVzdC1wb3J0X3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QgZ3Rlc3QKKyAgICB0ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MpCisgIGN4eF90ZXN0KGd0ZXN0LXByaW50ZXJzX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfcHJvZF90ZXN0IGd0ZXN0X21haW4KKyAgICB0ZXN0L3Byb2R1Y3Rpb24uY2MpCisgIGN4eF90ZXN0KGd0ZXN0X3JlcGVhdF90ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdF9zb2xlX2hlYWRlcl90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3N0cmVzc190ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdC10ZXN0LXBhcnRfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QgZ3Rlc3QpCisgIGN4eF90ZXN0KGd0ZXN0LXR5cGVkLXRlc3RfdGVzdCBndGVzdF9tYWluCisgICAgdGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjKQorICBjeHhfdGVzdChndGVzdF91bml0dGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC11bml0dGVzdC1hcGlfdGVzdCBndGVzdCkKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyBDKysgdGVzdHMgYnVpbHQgd2l0aCBub24tc3RhbmRhcmQgY29tcGlsZXIgZmxhZ3MuCisKKyAgIyBNU1ZDIDcuMSBkb2VzIG5vdCBzdXBwb3J0IFNUTCB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisgIGlmIChOT1QgTVNWQyBPUiBNU1ZDX1ZFUlNJT04gR1JFQVRFUiAxMzEwKQorICAgIGN4eF9saWJyYXJ5KGd0ZXN0X25vX2V4Y2VwdGlvbiAiJHtjeHhfbm9fZXhjZXB0aW9ufSIKKyAgICAgIHNyYy9ndGVzdC1hbGwuY2MpCisgICAgY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbl9ub19leGNlcHRpb24gIiR7Y3h4X25vX2V4Y2VwdGlvbn0iCisgICAgICBzcmMvZ3Rlc3QtYWxsLmNjIHNyYy9ndGVzdF9tYWluLmNjKQorICBlbmRpZigpCisgIGN4eF9saWJyYXJ5KGd0ZXN0X21haW5fbm9fcnR0aSAiJHtjeHhfbm9fcnR0aX0iCisgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKKworICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0LWRlYXRoLXRlc3RfZXhfbm9jYXRjaF90ZXN0CisgICAgIiR7Y3h4X2V4Y2VwdGlvbn0gLURHVEVTVF9FTkFCTEVfQ0FUQ0hfRVhDRVBUSU9OU189MCIKKyAgICBndGVzdCB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYykKKyAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdC1kZWF0aC10ZXN0X2V4X2NhdGNoX3Rlc3QKKyAgICAiJHtjeHhfZXhjZXB0aW9ufSAtREdURVNUX0VOQUJMRV9DQVRDSF9FWENFUFRJT05TXz0xIgorICAgIGd0ZXN0IHRlc3QvZ3Rlc3QtZGVhdGgtdGVzdF9leF90ZXN0LmNjKQorCisgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3Rfbm9fcnR0aV91bml0dGVzdCAiJHtjeHhfbm9fcnR0aX0iCisgICAgZ3Rlc3RfbWFpbl9ub19ydHRpIHRlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MpCisKKyAgY3h4X3NoYXJlZF9saWJyYXJ5KGd0ZXN0X2RsbCAiJHtjeHhfZGVmYXVsdH0iCisgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKKworICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKGd0ZXN0X2RsbF90ZXN0XyAiJHtjeHhfZGVmYXVsdH0iCisgICAgZ3Rlc3RfZGxsIHRlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhndGVzdF9kbGxfdGVzdF8KKyAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikKKworICBpZiAoTk9UIE1TVkMgT1IgTk9UIE1TVkNfVkVSU0lPTiBFUVVBTCAxNjAwKQorICAgICMgVGhlIEMrKyBTdGFuZGFyZCBzcGVjaWZpZXMgdHVwbGVfZWxlbWVudDxpbnQsIGNsYXNzPi4KKyAgICAjIFlldCBNU1ZDIDEwJ3MgPHV0aWxpdHk+IGRlY2xhcmVzIHR1cGxlX2VsZW1lbnQ8c2l6ZV90LCBjbGFzcz4uCisgICAgIyBUaGF0IGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3aXRoIG91ciBvd24gc3RhbmRhcmQtY29uZm9ybWluZworICAgICMgdHVwbGUgaW1wbGVtZW50YXRpb24uICBUaGVyZWZvcmUgdXNpbmcgb3VyIG93biB0dXBsZSB3aXRoCisgICAgIyBNU1ZDIDEwIGRvZXNuJ3QgY29tcGlsZS4KKyAgICBjeHhfbGlicmFyeShndGVzdF9tYWluX3VzZV9vd25fdHVwbGUgIiR7Y3h4X3VzZV9vd25fdHVwbGV9IgorICAgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKKworICAgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3QtdHVwbGVfdGVzdCAiJHtjeHhfdXNlX293bl90dXBsZX0iCisgICAgICBndGVzdF9tYWluX3VzZV9vd25fdHVwbGUgdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjKQorCisgICAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdF91c2Vfb3duX3R1cGxlX3Rlc3QgIiR7Y3h4X3VzZV9vd25fdHVwbGV9IgorICAgICAgZ3Rlc3RfbWFpbl91c2Vfb3duX3R1cGxlCisgICAgICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MpCisgIGVuZGlmKCkKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyBQeXRob24gdGVzdHMuCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0KQorCisgICMgTVNWQyA3LjEgZG9lcyBub3Qgc3VwcG9ydCBTVEwgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIEdSRUFURVIgMTMxMCkKKyAgICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKAorICAgICAgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19ub19leF90ZXN0XworICAgICAgIiR7Y3h4X25vX2V4Y2VwdGlvbn0iCisgICAgICBndGVzdF9tYWluX25vX2V4Y2VwdGlvbgorICAgICAgdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjKQorICBlbmRpZigpCisKKyAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygKKyAgICBndGVzdF9jYXRjaF9leGNlcHRpb25zX2V4X3Rlc3RfCisgICAgIiR7Y3h4X2V4Y2VwdGlvbn0iCisgICAgZ3Rlc3RfbWFpbgorICAgIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0Xy5jYykKKyAgcHlfdGVzdChndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfY29sb3JfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9jb2xvcl90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2Vudl92YXJfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9lbnZfdmFyX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X2ZpbHRlcl91bml0dGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9oZWxwX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgcHlfdGVzdChndGVzdF9oZWxwX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X291dHB1dF90ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X291dHB1dF90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3NodWZmbGVfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9zaHVmZmxlX3Rlc3QpCisKKyAgIyBNU1ZDIDcuMSBkb2VzIG5vdCBzdXBwb3J0IFNUTCB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisgIGlmIChOT1QgTVNWQyBPUiBNU1ZDX1ZFUlNJT04gR1JFQVRFUiAxMzEwKQorICAgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8gdGVzdCBndGVzdF9ub19leGNlcHRpb24pCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8KKyAgICAgIFBST1BFUlRJRVMKKyAgICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X25vX2V4Y2VwdGlvbn0iKQorICAgIHB5X3Rlc3QoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0KQorICBlbmRpZigpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8gdGVzdCBndGVzdF9tYWluKQorICBjeHhfZXhlY3V0YWJsZShndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8gdGVzdCBndGVzdF9tYWluKQorICBweV90ZXN0KGd0ZXN0X3htbF9vdXRmaWxlc190ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvQ09OVFJJQlVUT1JTIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9DT05UUklCVVRPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhZTJmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvQ09OVFJJQlVUT1JTCkBAIC0wLDAgKzEsMzcgQEAKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBwZW9wbGUgd2hvJ3ZlIG1hZGUgbm9uLXRyaXZpYWwKKyMgY29udHJpYnV0aW9uIHRvIHRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIHByb2plY3QuICBQZW9wbGUKKyMgd2hvIGNvbW1pdCBjb2RlIHRvIHRoZSBwcm9qZWN0IGFyZSBlbmNvdXJhZ2VkIHRvIGFkZCB0aGVpciBuYW1lcworIyBoZXJlLiAgUGxlYXNlIGtlZXAgdGhlIGxpc3Qgc29ydGVkIGJ5IGZpcnN0IG5hbWVzLgorCitBamF5IEpvc2hpIDxqYWpAZ29vZ2xlLmNvbT4KK0JhbMOhenMgRMOhbiA8YmFsYXpzLmRhbkBnbWFpbC5jb20+CitCaGFyYXQgTWVkaXJhdHRhIDxiaGFyYXRAbWVuYWx0by5jb20+CitDaGFuZGxlciBDYXJydXRoIDxjaGFuZGxlcmNAZ29vZ2xlLmNvbT4KK0NocmlzIFByaW5jZSA8Y3ByaW5jZUBnb29nbGUuY29tPgorQ2hyaXMgVGF5bG9yIDx0YXlsb3JjQGdvb2dsZS5jb20+CitEYW4gRWdub3IgPGVnbm9yQGdvb2dsZS5jb20+CitFcmljIFJvbWFuIDxlcm9tYW5AY2hyb21pdW0ub3JnPgorSGFkeSBaYWxlayA8aGFkeS56YWxla0BnbWFpbC5jb20+CitKZWZmcmV5IFlhc3NraW4gPGp5YXNza2luQGdvb2dsZS5jb20+CitKw7NpIFNpZ3Vyw7Bzc29uIDxqb2lAZ29vZ2xlLmNvbT4KK0tlaXIgTWllcmxlIDxtaWVybGVAZ21haWwuY29tPgorS2VpdGggUmF5IDxrZWl0aC5yYXlAZ21haWwuY29tPgorS2VudG9uIFZhcmRhIDxrZW50b25AZ29vZ2xlLmNvbT4KK01hbnVlbCBLbGltZWsgPGtsaW1la0Bnb29nbGUuY29tPgorTWFya3VzIEhldWxlIDxtYXJrdXMuaGV1bGVAZ21haWwuY29tPgorTWlrYSBSYWVudG8gPG1pa2llQGlraS5maT4KK01pa2zDs3MgRmF6ZWthcyA8bWZhemVrYXNAc3plbWFmb3IuY29tPgorUGFzaSBWYWxtaW5lbiA8cGFzaS52YWxtaW5lbkBnbWFpbC5jb20+CitQYXRyaWNrIEhhbm5hIDxwaGFubmFAZ29vZ2xlLmNvbT4KK1BhdHJpY2sgUmlsZXkgPHBmckBnb29nbGUuY29tPgorUGV0ZXIgS2FtaW5za2kgPHBpb3Rya0Bnb29nbGUuY29tPgorUHJlc3RvbiBKYWNrc29uIDxwcmVzdG9uLmEuamFja3NvbkBnbWFpbC5jb20+CitSYWluZXIgS2xhZmZlbmJvZWNrIDxyYWluZXIua2xhZmZlbmJvZWNrQGR5bmF0cmFjZS5jb20+CitSdXNzIENveCA8cnNjQGdvb2dsZS5jb20+CitSdXNzIFJ1ZmVyIDxydXNzQHBlbnRhZC5jb20+CitTZWFuIE1jYWZlZSA8ZWVmYWNtQGdtYWlsLmNvbT4KK1NpZ3Vyw7B1ciDDgXNnZWlyc3NvbiA8c2lnZ2lAZ29vZ2xlLmNvbT4KK1RyYWN5IEJpYWxpayA8dHJhY3lAcGVudGFkLmNvbT4KK1ZhZGltIEJlcm1hbiA8dmFkaW1iQGdvb2dsZS5jb20+CitWbGFkIExvc2V2IDx2bGFkbEBnb29nbGUuY29tPgorWmhhbnlvbmcgV2FuIDx3YW5AZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvTElDRU5TRSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQxYTExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9MSUNFTlNFCkBAIC0wLDAgKzEsMjggQEAKK0NvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTZiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzA2IEBACisjIEF1dG9tYWtlIGZpbGUKKworQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKKworIyBOb25zdGFuZGFyZCBwYWNrYWdlIGZpbGVzIGZvciBkaXN0cmlidXRpb24KK0VYVFJBX0RJU1QgPSBcCisgIENIQU5HRVMgXAorICBDT05UUklCVVRPUlMgXAorICBMSUNFTlNFIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oLnB1bXAgXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgXAorICBtYWtlL01ha2VmaWxlIFwKKyAgc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5IFwKKyAgc2NyaXB0cy9nZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IFwKKyAgc2NyaXB0cy9wdW1wLnB5IFwKKyAgc2NyaXB0cy90ZXN0L01ha2VmaWxlCisKKyMgZ3Rlc3Qgc291cmNlIGZpbGVzIHRoYXQgd2UgZG9uJ3QgY29tcGlsZSBkaXJlY3RseS4gIFRoZXkgYXJlCisjICNpbmNsdWRlZCBieSBndGVzdC1hbGwuY2MuCitHVEVTVF9TUkMgPSBcCisgIHNyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIFwKKyAgc3JjL2d0ZXN0LWZpbGVwYXRoLmNjIFwKKyAgc3JjL2d0ZXN0LWludGVybmFsLWlubC5oIFwKKyAgc3JjL2d0ZXN0LXBvcnQuY2MgXAorICBzcmMvZ3Rlc3QtcHJpbnRlcnMuY2MgXAorICBzcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjIFwKKyAgc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MgXAorICBzcmMvZ3Rlc3QuY2MKKworRVhUUkFfRElTVCArPSAkKEdURVNUX1NSQykKKworIyBTYW1wbGUgZmlsZXMgdGhhdCB3ZSBkb24ndCBjb21waWxlLgorRVhUUkFfRElTVCArPSBcCisgIHNhbXBsZXMvcHJpbWVfdGFibGVzLmggXAorICBzYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTVfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MgXAorICBzYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MKKworIyBDKysgdGVzdCBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgZGlyZWN0bHkuCitFWFRSQV9ESVNUICs9IFwKKyAgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1tZXNzYWdlX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIFwKKyAgdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oIFwKKyAgdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X2NvbG9yX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9lbnZpcm9ubWVudF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9oZWxwX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfbWFpbl91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3N0cmVzc190ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjIFwKKyAgdGVzdC9wcm9kdWN0aW9uLmNjIFwKKyAgdGVzdC9wcm9kdWN0aW9uLmgKKworIyBQeXRob24gdGVzdHMgdGhhdCB3ZSBkb24ndCBydW4uCitFWFRSQV9ESVNUICs9IFwKKyAgdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2NvbG9yX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3QucHkgXAorICB0ZXN0L2d0ZXN0X291dHB1dF90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dCBcCisgIHRlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF90ZXN0X3V0aWxzLnB5IFwKKyAgdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3htbF90ZXN0X3V0aWxzLnB5CisKKyMgQ01ha2Ugc2NyaXB0CitFWFRSQV9ESVNUICs9IFwKKyAgQ01ha2VMaXN0cy50eHQgXAorICBjbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQorCisjIE1TVkMgcHJvamVjdCBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIG1zdmMvZ3Rlc3QtbWQuc2xuIFwKKyAgbXN2Yy9ndGVzdC1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0LnNsbiBcCisgIG1zdmMvZ3Rlc3QudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvaiBcCisgIG1zdmMvZ3Rlc3RfbWFpbi52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3Byb2RfdGVzdC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvaiBcCisgIG1zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qCisKKyMgeGNvZGUgcHJvamVjdCBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIHhjb2RlL0NvbmZpZy9EZWJ1Z1Byb2plY3QueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvUmVsZWFzZVByb2plY3QueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyBcCisgIHhjb2RlL0NvbmZpZy9UZXN0VGFyZ2V0LnhjY29uZmlnIFwKKyAgeGNvZGUvUmVzb3VyY2VzL0luZm8ucGxpc3QgXAorICB4Y29kZS9TY3JpcHRzL3J1bnRlc3RzLnNoIFwKKyAgeGNvZGUvU2NyaXB0cy92ZXJzaW9uZ2VuZXJhdGUucHkgXAorICB4Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisKKyMgeGNvZGUgc2FtcGxlIGZpbGVzCitFWFRSQV9ESVNUICs9IFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdCBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL1dpZGdldEZyYW1ld29yay54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvcnVudGVzdHMuc2ggXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MgXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuaCBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCisKKyMgQysrQnVpbGRlciBwcm9qZWN0IGZpbGVzCitFWFRSQV9ESVNUICs9IFwKKyAgY29kZWdlYXIvZ3Rlc3QuY2Jwcm9qIFwKKyAgY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qIFwKKyAgY29kZWdlYXIvZ3Rlc3RfYWxsLmNjIFwKKyAgY29kZWdlYXIvZ3Rlc3RfbGluay5jYyBcCisgIGNvZGVnZWFyL2d0ZXN0X21haW4uY2Jwcm9qIFwKKyAgY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qCisKKyMgRGlzdHJpYnV0ZSBhbmQgaW5zdGFsbCBNNCBtYWNybworbTRkYXRhZGlyID0gJChkYXRhZGlyKS9hY2xvY2FsCittNGRhdGFfREFUQSA9IG00L2d0ZXN0Lm00CitFWFRSQV9ESVNUICs9ICQobTRkYXRhX0RBVEEpCisKKyMgV2UgZGVmaW5lIHRoZSBnbG9iYWwgQU1fQ1BQRkxBR1MgYXMgZXZlcnl0aGluZyB3ZSBjb21waWxlIGluY2x1ZGVzIGZyb20gdGhlc2UKKyMgZGlyZWN0b3JpZXMuCitBTV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpIC1JJChzcmNkaXIpL2luY2x1ZGUKKworIyBNb2RpZmllcyBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGZvciBwdGhyZWFkcyBjb21wYXRpYmlsaXR5LgoraWYgSEFWRV9QVEhSRUFEUworICBBTV9DWFhGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AgLURHVEVTVF9IQVNfUFRIUkVBRD0xCisgIEFNX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorZWxzZQorICBBTV9DWFhGTEFHUyA9IC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAorZW5kaWYKKworIyBCdWlsZCBydWxlcyBmb3IgbGlicmFyaWVzLgorbGliX0xUTElCUkFSSUVTID0gbGliL2xpYmd0ZXN0LmxhIGxpYi9saWJndGVzdF9tYWluLmxhCisKK2xpYl9saWJndGVzdF9sYV9TT1VSQ0VTID0gc3JjL2d0ZXN0LWFsbC5jYworCitwa2dpbmNsdWRlX0hFQURFUlMgPSBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKKworcGtnaW5jbHVkZV9pbnRlcm5hbGRpciA9ICQocGtnaW5jbHVkZWRpcikvaW50ZXJuYWwKK3BrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUyA9IFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaAorCitsaWJfbGliZ3Rlc3RfbWFpbl9sYV9TT1VSQ0VTID0gc3JjL2d0ZXN0X21haW4uY2MKK2xpYl9saWJndGVzdF9tYWluX2xhX0xJQkFERCA9IGxpYi9saWJndGVzdC5sYQorCisjIEJ1bGlkIHJ1bGVzIGZvciBzYW1wbGVzIGFuZCB0ZXN0cy4gQXV0b21ha2UncyBuYW1pbmcgZm9yIHNvbWUgb2YKKyMgdGhlc2UgdmFyaWFibGVzIGlzbid0IHRlcnJpYmx5IG9idmlvdXMsIHNvIHRoaXMgaXMgYSBicmllZgorIyByZWZlcmVuY2U6CisjCisjIFRFU1RTIC0tIFByb2dyYW1zIHJ1biBhdXRvbWF0aWNhbGx5IGJ5ICJtYWtlIGNoZWNrIgorIyBjaGVja19QUk9HUkFNUyAtLSBQcm9ncmFtcyBidWlsdCBieSAibWFrZSBjaGVjayIgYnV0IG5vdCBuZWNlc3NhcmlseSBydW4KKworbm9pbnN0X0xUTElCUkFSSUVTID0gc2FtcGxlcy9saWJzYW1wbGVzLmxhCisKK3NhbXBsZXNfbGlic2FtcGxlc19sYV9TT1VSQ0VTID0gXAorICBzYW1wbGVzL3NhbXBsZTEuY2MgXAorICBzYW1wbGVzL3NhbXBsZTEuaCBcCisgIHNhbXBsZXMvc2FtcGxlMi5jYyBcCisgIHNhbXBsZXMvc2FtcGxlMi5oIFwKKyAgc2FtcGxlcy9zYW1wbGUzLWlubC5oIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmgKKworVEVTVFM9CitURVNUU19FTlZJUk9OTUVOVCA9IEdURVNUX1NPVVJDRV9ESVI9IiQoc3JjZGlyKS90ZXN0IiBcCisgICAgICAgICAgICAgICAgICAgIEdURVNUX0JVSUxEX0RJUj0iJCh0b3BfYnVpbGRkaXIpL3Rlc3QiCitjaGVja19QUk9HUkFNUz0KKworIyBBIHNpbXBsZSBzYW1wbGUgb24gdXNpbmcgZ3Rlc3QuCitURVNUUyArPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QKK2NoZWNrX1BST0dSQU1TICs9IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdAorc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X1NPVVJDRVMgPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKK3NhbXBsZXNfc2FtcGxlMV91bml0dGVzdF9MREFERCA9IGxpYi9saWJndGVzdF9tYWluLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYi9saWJndGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzL2xpYnNhbXBsZXMubGEKKworIyBBbm90aGVyIHNhbXBsZS4gIEl0IGFsc28gdmVyaWZpZXMgdGhhdCBsaWJndGVzdCB3b3Jrcy4KK1RFU1RTICs9IHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QKK2NoZWNrX1BST0dSQU1TICs9IHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QKK3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfU09VUkNFUyA9IHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuY2MKK3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfTERBREQgPSBsaWIvbGliZ3Rlc3QubGEKKworIyBUaGlzIHRlc3RzIG1vc3QgY29uc3RydWN0cyBvZiBndGVzdCBhbmQgdmVyaWZpZXMgdGhhdCBsaWJndGVzdF9tYWluCisjIGFuZCBsaWJndGVzdCB3b3JrLgorVEVTVFMgKz0gdGVzdC9ndGVzdF9hbGxfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gdGVzdC9ndGVzdF9hbGxfdGVzdAordGVzdF9ndGVzdF9hbGxfdGVzdF9TT1VSQ0VTID0gdGVzdC9ndGVzdF9hbGxfdGVzdC5jYwordGVzdF9ndGVzdF9hbGxfdGVzdF9MREFERCA9IGxpYi9saWJndGVzdF9tYWluLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWIvbGliZ3Rlc3QubGEKKworIyBUZXN0cyB0aGF0IGZ1c2VkIGd0ZXN0IGZpbGVzIGNvbXBpbGUgYW5kIHdvcmsuCitGVVNFRF9HVEVTVF9TUkMgPSBcCisgIGZ1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MgXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCBcCisgIGZ1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjCisKK2lmIEhBVkVfUFlUSE9OCitURVNUUyArPSB0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QKK2NoZWNrX1BST0dSQU1TICs9IHRlc3QvZnVzZWRfZ3Rlc3RfdGVzdAordGVzdF9mdXNlZF9ndGVzdF90ZXN0X1NPVVJDRVMgPSAkKEZVU0VEX0dURVNUX1NSQykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzL3NhbXBsZTEuY2Mgc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjCit0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MgPSAtSSIkKHNyY2RpcikvZnVzZWQtc3JjIgorCisjIEJ1aWxkIHJ1bGVzIGZvciBwdXR0aW5nIGZ1c2VkIEdvb2dsZSBUZXN0IGZpbGVzIGludG8gdGhlIGRpc3RyaWJ1dGlvbgorIyBwYWNrYWdlLiBUaGUgdXNlciBjYW4gYWxzbyBjcmVhdGUgdGhvc2UgZmlsZXMgYnkgbWFudWFsbHkgcnVubmluZworIyBzY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkuCiskKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9TT1VSQ0VTKTogZnVzZWQtZ3Rlc3QKKworZnVzZWQtZ3Rlc3Q6ICQocGtnaW5jbHVkZV9IRUFERVJTKSAkKHBrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUykgXAorICAgICAgICAgICAgICQoR1RFU1RfU1JDKSBzcmMvZ3Rlc3QtYWxsLmNjIHNyYy9ndGVzdF9tYWluLmNjIFwKKyAgICAgICAgICAgICBzY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkKKwlta2RpciAtcCAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKwljaG1vZCAtUiB1K3cgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCisJcm0gLWYgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjIgorCXJtIC1mICIkKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmgiCisJIiQoc3JjZGlyKS9zY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkiICIkKHNyY2RpcikvZnVzZWQtc3JjIgorCWNwIC1mICIkKHNyY2Rpcikvc3JjL2d0ZXN0X21haW4uY2MiICIkKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0LyIKKworbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKKwlybSAtcmYgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCitlbmRpZgorCisjIERlYXRoIHRlc3RzIG1heSBwcm9kdWNlIGNvcmUgZHVtcHMgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4gSW4gY2FzZQorIyB0aGlzIGhhcHBlbnMsIGNsZWFuIHRoZW0gdG8ga2VlcCBkaXN0Y2xlYW5jaGVjayBoYXBweS4KK0NMRUFORklMRVMgPSBjb3JlCisKKyMgRGlzYWJsZXMgJ21ha2UgaW5zdGFsbCcgYXMgaW5zdGFsbGluZyBhIGNvbXBpbGVkIHZlcnNpb24gb2YgR29vZ2xlCisjIFRlc3QgY2FuIGxlYWQgdG8gdW5kZWZpbmVkIGJlaGF2aW9yIGR1ZSB0byB2aW9sYXRpb24gb2YgdGhlCisjIE9uZS1EZWZpbml0aW9uIFJ1bGUuCisKK2luc3RhbGwtZXhlYy1sb2NhbDoKKwllY2hvICInbWFrZSBpbnN0YWxsJyBpcyBkYW5nZXJvdXMgYW5kIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIHNlZSBSRUFETUUgZm9yIGhvdyB0byBpbnRlZ3JhdGUgR29vZ2xlIFRlc3QgaW50byB5b3VyIGJ1aWxkIHN5c3RlbS4iCisJZmFsc2UKKworaW5zdGFsbC1kYXRhLWxvY2FsOgorCWVjaG8gIidtYWtlIGluc3RhbGwnIGlzIGRhbmdlcm91cyBhbmQgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgc2VlIFJFQURNRSBmb3IgaG93IHRvIGludGVncmF0ZSBHb29nbGUgVGVzdCBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtLiIKKwlmYWxzZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9NYWtlZmlsZS5pbiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0ZGU3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxMzYwIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjMgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKyMgQXV0b21ha2UgZmlsZQorCisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorVEVTVFMgPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QkKEVYRUVYVCkgXAorCXNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QkKEVYRUVYVCkgXAorCXRlc3QvZ3Rlc3RfYWxsX3Rlc3QkKEVYRUVYVCkgJChhbV9fRVhFRVhUXzEpCitjaGVja19QUk9HUkFNUyA9IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdCQoRVhFRVhUKSBcCisJc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdCQoRVhFRVhUKSBcCisJdGVzdC9ndGVzdF9hbGxfdGVzdCQoRVhFRVhUKSAkKGFtX19FWEVFWFRfMSkKK0BIQVZFX1BZVEhPTl9UUlVFQGFtX19hcHBlbmRfMSA9IHRlc3QvZnVzZWRfZ3Rlc3RfdGVzdAorQEhBVkVfUFlUSE9OX1RSVUVAYW1fX2FwcGVuZF8yID0gdGVzdC9mdXNlZF9ndGVzdF90ZXN0CitzdWJkaXIgPSAuCitESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChwa2dpbmNsdWRlX0hFQURFUlMpIFwKKwkkKHBrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3Bfc3JjZGlyKS9idWlsZC1hdXgvY29uZmlnLmguaW4gXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlICQodG9wX3NyY2Rpcikvc2NyaXB0cy9ndGVzdC1jb25maWcuaW4gXAorCWJ1aWxkLWF1eC9jb25maWcuZ3Vlc3MgYnVpbGQtYXV4L2NvbmZpZy5zdWIgYnVpbGQtYXV4L2RlcGNvbXAgXAorCWJ1aWxkLWF1eC9pbnN0YWxsLXNoIGJ1aWxkLWF1eC9sdG1haW4uc2ggYnVpbGQtYXV4L21pc3NpbmcKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRvcHRpb25zLm00ICQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHZlcnNpb24ubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9hY3hfcHRocmVhZC5tNCAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCithbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAorIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlnLnN0YXR1cy5saW5lbm8KK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2J1aWxkLWF1eC9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0gc2NyaXB0cy9ndGVzdC1jb25maWcKK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyID0geyBcCisgIHRlc3QgLXogIiQkZmlsZXMiIFwKKyAgICB8fCB7IHRlc3QgISAtZCAiJCRkaXIiICYmIHRlc3QgISAtZiAiJCRkaXIiICYmIHRlc3QgISAtciAiJCRkaXIiOyB9IFwKKyAgICB8fCB7IGVjaG8gIiAoIGNkICckJGRpcicgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisgICAgICAgICAkKGFtX19jZCkgIiQkZGlyIiAmJiBybSAtZiAkJGZpbGVzOyB9OyBcCisgIH0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChsaWJkaXIpIiAiJChERVNURElSKSQobTRkYXRhZGlyKSIgXAorCSIkKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKSIgXAorCSIkKERFU1RESVIpJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSIKK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpICQobm9pbnN0X0xUTElCUkFSSUVTKQorbGliX2xpYmd0ZXN0X2xhX0xJQkFERCA9CithbV9fZGlyc3RhbXAgPSAkKGFtX19sZWFkaW5nX2RvdClkaXJzdGFtcAorYW1fbGliX2xpYmd0ZXN0X2xhX09CSkVDVFMgPSBzcmMvZ3Rlc3QtYWxsLmxvCitsaWJfbGliZ3Rlc3RfbGFfT0JKRUNUUyA9ICQoYW1fbGliX2xpYmd0ZXN0X2xhX09CSkVDVFMpCitsaWJfbGliZ3Rlc3RfbWFpbl9sYV9ERVBFTkRFTkNJRVMgPSBsaWIvbGliZ3Rlc3QubGEKK2FtX2xpYl9saWJndGVzdF9tYWluX2xhX09CSkVDVFMgPSBzcmMvZ3Rlc3RfbWFpbi5sbworbGliX2xpYmd0ZXN0X21haW5fbGFfT0JKRUNUUyA9ICQoYW1fbGliX2xpYmd0ZXN0X21haW5fbGFfT0JKRUNUUykKK3NhbXBsZXNfbGlic2FtcGxlc19sYV9MSUJBREQgPQorYW1fc2FtcGxlc19saWJzYW1wbGVzX2xhX09CSkVDVFMgPSBzYW1wbGVzL3NhbXBsZTEubG8gXAorCXNhbXBsZXMvc2FtcGxlMi5sbyBzYW1wbGVzL3NhbXBsZTQubG8KK3NhbXBsZXNfbGlic2FtcGxlc19sYV9PQkpFQ1RTID0gJChhbV9zYW1wbGVzX2xpYnNhbXBsZXNfbGFfT0JKRUNUUykKK0BIQVZFX1BZVEhPTl9UUlVFQGFtX19FWEVFWFRfMSA9IHRlc3QvZnVzZWRfZ3Rlc3RfdGVzdCQoRVhFRVhUKQorYW1fc2FtcGxlc19zYW1wbGUxMF91bml0dGVzdF9PQkpFQ1RTID0gIFwKKwlzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LiQoT0JKRVhUKQorc2FtcGxlc19zYW1wbGUxMF91bml0dGVzdF9PQkpFQ1RTID0gIFwKKwkkKGFtX3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfT0JKRUNUUykKK3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfREVQRU5ERU5DSUVTID0gbGliL2xpYmd0ZXN0LmxhCithbV9zYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfT0JKRUNUUyA9ICBcCisJc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LiQoT0JKRVhUKQorc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X09CSkVDVFMgPSAgXAorCSQoYW1fc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X09CSkVDVFMpCitzYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfREVQRU5ERU5DSUVTID0gbGliL2xpYmd0ZXN0X21haW4ubGEgXAorCWxpYi9saWJndGVzdC5sYSBzYW1wbGVzL2xpYnNhbXBsZXMubGEKK2FtX190ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFU19ESVNUID0gZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyBcCisJZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmggZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MgXAorCXNhbXBsZXMvc2FtcGxlMS5jYyBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKK2FtX19vYmplY3RzXzEgPSAgXAorCWZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLiQoT0JKRVhUKSBcCisJZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLiQoT0JKRVhUKQorQEhBVkVfUFlUSE9OX1RSVUVAYW1fdGVzdF9mdXNlZF9ndGVzdF90ZXN0X09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzEpIFwKK0BIQVZFX1BZVEhPTl9UUlVFQAlzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLiQoT0JKRVhUKSBcCitASEFWRV9QWVRIT05fVFJVRUAJc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC4kKE9CSkVYVCkKK3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9PQkpFQ1RTID0gJChhbV90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfT0JKRUNUUykKK3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9MREFERCA9ICQoTERBREQpCithbV90ZXN0X2d0ZXN0X2FsbF90ZXN0X09CSkVDVFMgPSB0ZXN0L2d0ZXN0X2FsbF90ZXN0LiQoT0JKRVhUKQordGVzdF9ndGVzdF9hbGxfdGVzdF9PQkpFQ1RTID0gJChhbV90ZXN0X2d0ZXN0X2FsbF90ZXN0X09CSkVDVFMpCit0ZXN0X2d0ZXN0X2FsbF90ZXN0X0RFUEVOREVOQ0lFUyA9IGxpYi9saWJndGVzdF9tYWluLmxhIFwKKwlsaWIvbGliZ3Rlc3QubGEKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL2J1aWxkLWF1eAorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvYnVpbGQtYXV4L2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitMVENYWENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorQ1hYTEQgPSAkKENYWCkKK0NYWExJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGliX2xpYmd0ZXN0X2xhX1NPVVJDRVMpICQobGliX2xpYmd0ZXN0X21haW5fbGFfU09VUkNFUykgXAorCSQoc2FtcGxlc19saWJzYW1wbGVzX2xhX1NPVVJDRVMpIFwKKwkkKHNhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfU09VUkNFUykgXAorCSQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X1NPVVJDRVMpIFwKKwkkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9TT1VSQ0VTKSBcCisJJCh0ZXN0X2d0ZXN0X2FsbF90ZXN0X1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGxpYl9saWJndGVzdF9sYV9TT1VSQ0VTKSBcCisJJChsaWJfbGliZ3Rlc3RfbWFpbl9sYV9TT1VSQ0VTKSBcCisJJChzYW1wbGVzX2xpYnNhbXBsZXNfbGFfU09VUkNFUykgXAorCSQoc2FtcGxlc19zYW1wbGUxMF91bml0dGVzdF9TT1VSQ0VTKSBcCisJJChzYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfU09VUkNFUykgXAorCSQoYW1fX3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9TT1VSQ0VTX0RJU1QpIFwKKwkkKHRlc3RfZ3Rlc3RfYWxsX3Rlc3RfU09VUkNFUykKK0RBVEEgPSAkKG00ZGF0YV9EQVRBKQorSEVBREVSUyA9ICQocGtnaW5jbHVkZV9IRUFERVJTKSAkKHBrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK2FtX190dHlfY29sb3JzID0gXAorcmVkPTsgZ3JuPTsgbGduPTsgYmx1PTsgc3RkPQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK2Rpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKK3RvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQorYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAorICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpIjsgdGhlbiBcCisgICAgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC0yMDAgLWV4ZWMgY2htb2QgdSt3IHt9ICc7JyBcCisgICAgICAmJiBybSAtcmYgIiQoZGlzdGRpcikiIFwKKyAgICAgIHx8IHsgc2xlZXAgNSAmJiBybSAtcmYgIiQoZGlzdGRpcikiOyB9OyBcCisgIGVsc2UgOjsgZmkKK0RJU1RfQVJDSElWRVMgPSAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpLnRhci5iejIgJChkaXN0ZGlyKS56aXAKK0daSVBfRU5WID0gLS1iZXN0CitkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CithbV9fZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9ICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgXAorICB8IHNlZCAnc3xeXC4vfCQocHJlZml4KS98JyB8IGdyZXAgLXYgJyQoaW5mb2RpcikvZGlyJCQnCitkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIUkVBRF9DQyA9IEBQVEhSRUFEX0NDQAorUFRIUkVBRF9DRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NACitQVEhSRUFEX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorUFlUSE9OID0gQFBZVEhPTkAKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQVIgPSBAYWNfY3RfQVJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithY3hfcHRocmVhZF9jb25maWcgPSBAYWN4X3B0aHJlYWRfY29uZmlnQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAorCisjIE5vbnN0YW5kYXJkIHBhY2thZ2UgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbgorCisjIFNhbXBsZSBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUuCisKKyMgQysrIHRlc3QgZmlsZXMgdGhhdCB3ZSBkb24ndCBjb21waWxlIGRpcmVjdGx5LgorCisjIFB5dGhvbiB0ZXN0cyB0aGF0IHdlIGRvbid0IHJ1bi4KKworIyBDTWFrZSBzY3JpcHQKKworIyBNU1ZDIHByb2plY3QgZmlsZXMKKworIyB4Y29kZSBwcm9qZWN0IGZpbGVzCisKKyMgeGNvZGUgc2FtcGxlIGZpbGVzCisKKyMgQysrQnVpbGRlciBwcm9qZWN0IGZpbGVzCitFWFRSQV9ESVNUID0gQ0hBTkdFUyBDT05UUklCVVRPUlMgTElDRU5TRSBcCisJaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcCBcCisJaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAgXAorCWluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wIFwKKwlpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgbWFrZS9NYWtlZmlsZSBcCisJc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5IHNjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSBcCisJc2NyaXB0cy9wdW1wLnB5IHNjcmlwdHMvdGVzdC9NYWtlZmlsZSAkKEdURVNUX1NSQykgXAorCXNhbXBsZXMvcHJpbWVfdGFibGVzLmggc2FtcGxlcy9zYW1wbGUyX3VuaXR0ZXN0LmNjIFwKKwlzYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2Mgc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjIFwKKwlzYW1wbGVzL3NhbXBsZTVfdW5pdHRlc3QuY2Mgc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjIFwKKwlzYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2Mgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjIFwKKwlzYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjIHRlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyBcCisJdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MgdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYyB0ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyBcCisJdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYyBcCisJdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmggdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3RfcHJlbWF0dXJlX2V4aXRfdGVzdC5jYyB0ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MgdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MgdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmggdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYyBcCisJdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYyBcCisJdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjIHRlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYyB0ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0Xy5jYyB0ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8uY2MgdGVzdC9ndGVzdF9tYWluX3VuaXR0ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MgdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIHRlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjIHRlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0Xy5jYyBcCisJdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjIHRlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYyB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjIFwKKwl0ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYyBcCisJdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYyB0ZXN0L3Byb2R1Y3Rpb24uY2MgXAorCXRlc3QvcHJvZHVjdGlvbi5oIHRlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weSBcCisJdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weSB0ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weSBcCisJdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkgdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X291dHB1dF90ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0IFwKKwl0ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weSB0ZXN0L2d0ZXN0X3Rlc3RfdXRpbHMucHkgXAorCXRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weSBcCisJdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weSBcCisJdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0LnB5IHRlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkgXAorCUNNYWtlTGlzdHMudHh0IGNtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlIG1zdmMvZ3Rlc3QtbWQuc2xuIFwKKwltc3ZjL2d0ZXN0LW1kLnZjcHJvaiBtc3ZjL2d0ZXN0LnNsbiBtc3ZjL2d0ZXN0LnZjcHJvaiBcCisJbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvaiBtc3ZjL2d0ZXN0X21haW4udmNwcm9qIFwKKwltc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2ogbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qIFwKKwltc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvaiBtc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvaiBcCisJeGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZyBcCisJeGNvZGUvQ29uZmlnL0ZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyBcCisJeGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcgXAorCXhjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZyBcCisJeGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgXAorCXhjb2RlL0NvbmZpZy9UZXN0VGFyZ2V0LnhjY29uZmlnIHhjb2RlL1Jlc291cmNlcy9JbmZvLnBsaXN0IFwKKwl4Y29kZS9TY3JpcHRzL3J1bnRlc3RzLnNoIHhjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IFwKKwl4Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIFwKKwl4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0IFwKKwl4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBcCisJeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvcnVudGVzdHMuc2ggXAorCXhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYyBcCisJeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmggXAorCXhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjIFwKKwljb2RlZ2Vhci9ndGVzdC5jYnByb2ogY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qIFwKKwljb2RlZ2Vhci9ndGVzdF9hbGwuY2MgY29kZWdlYXIvZ3Rlc3RfbGluay5jYyBcCisJY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2ogY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIFwKKwkkKG00ZGF0YV9EQVRBKQorCisjIGd0ZXN0IHNvdXJjZSBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgZGlyZWN0bHkuICBUaGV5IGFyZQorIyAjaW5jbHVkZWQgYnkgZ3Rlc3QtYWxsLmNjLgorR1RFU1RfU1JDID0gXAorICBzcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBcCisgIHNyYy9ndGVzdC1maWxlcGF0aC5jYyBcCisgIHNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCBcCisgIHNyYy9ndGVzdC1wb3J0LmNjIFwKKyAgc3JjL2d0ZXN0LXByaW50ZXJzLmNjIFwKKyAgc3JjL2d0ZXN0LXRlc3QtcGFydC5jYyBcCisgIHNyYy9ndGVzdC10eXBlZC10ZXN0LmNjIFwKKyAgc3JjL2d0ZXN0LmNjCisKKworIyBEaXN0cmlidXRlIGFuZCBpbnN0YWxsIE00IG1hY3JvCittNGRhdGFkaXIgPSAkKGRhdGFkaXIpL2FjbG9jYWwKK200ZGF0YV9EQVRBID0gbTQvZ3Rlc3QubTQKKworIyBXZSBkZWZpbmUgdGhlIGdsb2JhbCBBTV9DUFBGTEFHUyBhcyBldmVyeXRoaW5nIHdlIGNvbXBpbGUgaW5jbHVkZXMgZnJvbSB0aGVzZQorIyBkaXJlY3Rvcmllcy4KK0FNX0NQUEZMQUdTID0gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvaW5jbHVkZQorQEhBVkVfUFRIUkVBRFNfRkFMU0VAQU1fQ1hYRkxBR1MgPSAtREdURVNUX0hBU19QVEhSRUFEPTAKKworIyBNb2RpZmllcyBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGZvciBwdGhyZWFkcyBjb21wYXRpYmlsaXR5LgorQEhBVkVfUFRIUkVBRFNfVFJVRUBBTV9DWFhGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AgLURHVEVTVF9IQVNfUFRIUkVBRD0xCitASEFWRV9QVEhSRUFEU19UUlVFQEFNX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorCisjIEJ1aWxkIHJ1bGVzIGZvciBsaWJyYXJpZXMuCitsaWJfTFRMSUJSQVJJRVMgPSBsaWIvbGliZ3Rlc3QubGEgbGliL2xpYmd0ZXN0X21haW4ubGEKK2xpYl9saWJndGVzdF9sYV9TT1VSQ0VTID0gc3JjL2d0ZXN0LWFsbC5jYworcGtnaW5jbHVkZV9IRUFERVJTID0gXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCisKK3BrZ2luY2x1ZGVfaW50ZXJuYWxkaXIgPSAkKHBrZ2luY2x1ZGVkaXIpL2ludGVybmFsCitwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMgPSBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKKworbGliX2xpYmd0ZXN0X21haW5fbGFfU09VUkNFUyA9IHNyYy9ndGVzdF9tYWluLmNjCitsaWJfbGliZ3Rlc3RfbWFpbl9sYV9MSUJBREQgPSBsaWIvbGliZ3Rlc3QubGEKKworIyBCdWxpZCBydWxlcyBmb3Igc2FtcGxlcyBhbmQgdGVzdHMuIEF1dG9tYWtlJ3MgbmFtaW5nIGZvciBzb21lIG9mCisjIHRoZXNlIHZhcmlhYmxlcyBpc24ndCB0ZXJyaWJseSBvYnZpb3VzLCBzbyB0aGlzIGlzIGEgYnJpZWYKKyMgcmVmZXJlbmNlOgorIworIyBURVNUUyAtLSBQcm9ncmFtcyBydW4gYXV0b21hdGljYWxseSBieSAibWFrZSBjaGVjayIKKyMgY2hlY2tfUFJPR1JBTVMgLS0gUHJvZ3JhbXMgYnVpbHQgYnkgIm1ha2UgY2hlY2siIGJ1dCBub3QgbmVjZXNzYXJpbHkgcnVuCitub2luc3RfTFRMSUJSQVJJRVMgPSBzYW1wbGVzL2xpYnNhbXBsZXMubGEKK3NhbXBsZXNfbGlic2FtcGxlc19sYV9TT1VSQ0VTID0gXAorICBzYW1wbGVzL3NhbXBsZTEuY2MgXAorICBzYW1wbGVzL3NhbXBsZTEuaCBcCisgIHNhbXBsZXMvc2FtcGxlMi5jYyBcCisgIHNhbXBsZXMvc2FtcGxlMi5oIFwKKyAgc2FtcGxlcy9zYW1wbGUzLWlubC5oIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmgKKworVEVTVFNfRU5WSVJPTk1FTlQgPSBHVEVTVF9TT1VSQ0VfRElSPSIkKHNyY2RpcikvdGVzdCIgXAorICAgICAgICAgICAgICAgICAgICBHVEVTVF9CVUlMRF9ESVI9IiQodG9wX2J1aWxkZGlyKS90ZXN0IgorCitzYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfU09VUkNFUyA9IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYworc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0X21haW4ubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliL2xpYmd0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvbGlic2FtcGxlcy5sYQorCitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X1NPVVJDRVMgPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0LmxhCit0ZXN0X2d0ZXN0X2FsbF90ZXN0X1NPVVJDRVMgPSB0ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjCit0ZXN0X2d0ZXN0X2FsbF90ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0X21haW4ubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYi9saWJndGVzdC5sYQorCisKKyMgVGVzdHMgdGhhdCBmdXNlZCBndGVzdCBmaWxlcyBjb21waWxlIGFuZCB3b3JrLgorRlVTRURfR1RFU1RfU1JDID0gXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjIFwKKyAgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmggXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYworCitASEFWRV9QWVRIT05fVFJVRUB0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFUyA9ICQoRlVTRURfR1RFU1RfU1JDKSBcCitASEFWRV9QWVRIT05fVFJVRUAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvc2FtcGxlMS5jYyBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKKworQEhBVkVfUFlUSE9OX1RSVUVAdGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTID0gLUkiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKworIyBEZWF0aCB0ZXN0cyBtYXkgcHJvZHVjZSBjb3JlIGR1bXBzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuIEluIGNhc2UKKyMgdGhpcyBoYXBwZW5zLCBjbGVhbiB0aGVtIHRvIGtlZXAgZGlzdGNsZWFuY2hlY2sgaGFwcHkuCitDTEVBTkZJTEVTID0gY29yZQorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuY2MgLmxvIC5vIC5vYmoKK2FtLS1yZWZyZXNoOiBNYWtlZmlsZQorCUA6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduJzsgXAorCSAgICAgICQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduIE1ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgZWNobyAnICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyc7IFwKKwkgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCiskKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCSQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK2J1aWxkLWF1eC9jb25maWcuaDogYnVpbGQtYXV4L3N0YW1wLWgxCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBybSAtZiBidWlsZC1hdXgvc3RhbXAtaDE7IGVsc2UgOjsgZmkKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGJ1aWxkLWF1eC9zdGFtcC1oMTsgZWxzZSA6OyBmaQorCitidWlsZC1hdXgvc3RhbXAtaDE6ICQodG9wX3NyY2RpcikvYnVpbGQtYXV4L2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQHJtIC1mIGJ1aWxkLWF1eC9zdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgYnVpbGQtYXV4L2NvbmZpZy5oCiskKHRvcF9zcmNkaXIpL2J1aWxkLWF1eC9jb25maWcuaC5pbjogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKKwkoJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKSkKKwlybSAtZiBidWlsZC1hdXgvc3RhbXAtaDEKKwl0b3VjaCAkQAorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBidWlsZC1hdXgvY29uZmlnLmggYnVpbGQtYXV4L3N0YW1wLWgxCitzY3JpcHRzL2d0ZXN0LWNvbmZpZzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS9zY3JpcHRzL2d0ZXN0LWNvbmZpZy5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK2luc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobGliZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobGliZGlyKSIKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCisJICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lOyBcCisJdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCisJICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgJyQoREVTVERJUikkKGxpYmRpciknIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgIiQoREVTVERJUikkKGxpYmRpcikiOyBcCisJfQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgJChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJyQoREVTVERJUikkKGxpYmRpcikvJCRmJyI7IFwKKwkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICIkKERFU1RESVIpJChsaWJkaXIpLyQkZiI7IFwKKwlkb25lCisKK2NsZWFuLWxpYkxUTElCUkFSSUVTOgorCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGRpcj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfC9bXi9dKiQkfHwnYCI7IFwKKwkgIHRlc3QgIiQkZGlyIiAhPSAiJCRwIiB8fCBkaXI9LjsgXAorCSAgZWNobyAicm0gLWYgXCIkJHtkaXJ9L3NvX2xvY2F0aW9uc1wiIjsgXAorCSAgcm0gLWYgIiQke2Rpcn0vc29fbG9jYXRpb25zIjsgXAorCWRvbmUKKworY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobm9pbnN0X0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorc3JjLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMKKwlAOiA+IHNyYy8kKGFtX19kaXJzdGFtcCkKK3NyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy8kKERFUERJUikKKwlAOiA+IHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvZ3Rlc3QtYWxsLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitsaWIvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGxpYgorCUA6ID4gbGliLyQoYW1fX2RpcnN0YW1wKQorbGliL2xpYmd0ZXN0LmxhOiAkKGxpYl9saWJndGVzdF9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGliX2xpYmd0ZXN0X2xhX0RFUEVOREVOQ0lFUykgbGliLyQoYW1fX2RpcnN0YW1wKQorCSQoQ1hYTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYl9saWJndGVzdF9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9sYV9MSUJBREQpICQoTElCUykKK3NyYy9ndGVzdF9tYWluLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitsaWIvbGliZ3Rlc3RfbWFpbi5sYTogJChsaWJfbGliZ3Rlc3RfbWFpbl9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9tYWluX2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9saWJfbGliZ3Rlc3RfbWFpbl9sYV9ERVBFTkRFTkNJRVMpIGxpYi8kKGFtX19kaXJzdGFtcCkKKwkkKENYWExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJfbGliZ3Rlc3RfbWFpbl9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9tYWluX2xhX0xJQkFERCkgJChMSUJTKQorc2FtcGxlcy8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc2FtcGxlcworCUA6ID4gc2FtcGxlcy8kKGFtX19kaXJzdGFtcCkKK3NhbXBsZXMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzYW1wbGVzLyQoREVQRElSKQorCUA6ID4gc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL3NhbXBsZTEubG86IHNhbXBsZXMvJChhbV9fZGlyc3RhbXApIFwKKwlzYW1wbGVzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NhbXBsZXMvc2FtcGxlMi5sbzogc2FtcGxlcy8kKGFtX19kaXJzdGFtcCkgXAorCXNhbXBsZXMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc2FtcGxlcy9zYW1wbGU0LmxvOiBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKSBcCisJc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL2xpYnNhbXBsZXMubGE6ICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX09CSkVDVFMpICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9zYW1wbGVzX2xpYnNhbXBsZXNfbGFfREVQRU5ERU5DSUVTKSBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKQorCSQoQ1hYTElOSykgICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX09CSkVDVFMpICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX0xJQkFERCkgJChMSUJTKQorCitjbGVhbi1jaGVja1BST0dSQU1TOgorCUBsaXN0PSckKGNoZWNrX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC4kKE9CSkVYVCk6IHNhbXBsZXMvJChhbV9fZGlyc3RhbXApIFwKKwlzYW1wbGVzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QkKEVYRUVYVCk6ICQoc2FtcGxlc19zYW1wbGUxMF91bml0dGVzdF9PQkpFQ1RTKSAkKHNhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfREVQRU5ERU5DSUVTKSBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0JChFWEVFWFQpCisJJChDWFhMSU5LKSAkKHNhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfT0JKRUNUUykgJChzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X0xEQUREKSAkKExJQlMpCitzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuJChPQkpFWFQpOiBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKSBcCisJc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QkKEVYRUVYVCk6ICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X09CSkVDVFMpICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9zYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfREVQRU5ERU5DSUVTKSBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QkKEVYRUVYVCkKKwkkKENYWExJTkspICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X09CSkVDVFMpICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0xEQUREKSAkKExJQlMpCitmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGZ1c2VkLXNyYy9ndGVzdAorCUA6ID4gZnVzZWQtc3JjL2d0ZXN0LyQoYW1fX2RpcnN0YW1wKQorZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKQorCUA6ID4gZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2Z1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLiQoT0JKRVhUKTogIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLiQoT0JKRVhUKTogIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS4kKE9CSkVYVCk6ICBcCisJc2FtcGxlcy8kKGFtX19kaXJzdGFtcCkgc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKSBzYW1wbGVzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3Rlc3QvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHRlc3QKKwlAOiA+IHRlc3QvJChhbV9fZGlyc3RhbXApCit0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QkKEVYRUVYVCk6ICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X09CSkVDVFMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfREVQRU5ERU5DSUVTKSB0ZXN0LyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiB0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QkKEVYRUVYVCkKKwkkKENYWExJTkspICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X09CSkVDVFMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0xEQUREKSAkKExJQlMpCit0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgdGVzdC8kKERFUERJUikKKwlAOiA+IHRlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQordGVzdC9ndGVzdF9hbGxfdGVzdC4kKE9CSkVYVCk6IHRlc3QvJChhbV9fZGlyc3RhbXApIFwKKwl0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3Rlc3QvZ3Rlc3RfYWxsX3Rlc3QkKEVYRUVYVCk6ICQodGVzdF9ndGVzdF9hbGxfdGVzdF9PQkpFQ1RTKSAkKHRlc3RfZ3Rlc3RfYWxsX3Rlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3Rlc3RfZ3Rlc3RfYWxsX3Rlc3RfREVQRU5ERU5DSUVTKSB0ZXN0LyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiB0ZXN0L2d0ZXN0X2FsbF90ZXN0JChFWEVFWFQpCisJJChDWFhMSU5LKSAkKHRlc3RfZ3Rlc3RfYWxsX3Rlc3RfT0JKRUNUUykgJCh0ZXN0X2d0ZXN0X2FsbF90ZXN0X0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisJLXJtIC1mIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLiQoT0JKRVhUKQorCS1ybSAtZiBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0X21haW4uJChPQkpFWFQpCisJLXJtIC1mIHNhbXBsZXMvc2FtcGxlMS4kKE9CSkVYVCkKKwktcm0gLWYgc2FtcGxlcy9zYW1wbGUxLmxvCisJLXJtIC1mIHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuJChPQkpFWFQpCisJLXJtIC1mIHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC4kKE9CSkVYVCkKKwktcm0gLWYgc2FtcGxlcy9zYW1wbGUyLiQoT0JKRVhUKQorCS1ybSAtZiBzYW1wbGVzL3NhbXBsZTIubG8KKwktcm0gLWYgc2FtcGxlcy9zYW1wbGU0LiQoT0JKRVhUKQorCS1ybSAtZiBzYW1wbGVzL3NhbXBsZTQubG8KKwktcm0gLWYgc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS4kKE9CSkVYVCkKKwktcm0gLWYgc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2d0ZXN0LWFsbC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2d0ZXN0LWFsbC5sbworCS1ybSAtZiBzcmMvZ3Rlc3RfbWFpbi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2d0ZXN0X21haW4ubG8KKwktcm0gLWYgdGVzdC9ndGVzdF9hbGxfdGVzdC4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc2FtcGxlcy8kKERFUERJUikvc2FtcGxlMS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNhbXBsZXMvJChERVBESVIpL3NhbXBsZTEwX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzYW1wbGVzLyQoREVQRElSKS9zYW1wbGUxX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzYW1wbGVzLyQoREVQRElSKS9zYW1wbGUyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc2FtcGxlcy8kKERFUERJUikvc2FtcGxlNC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzYW1wbGVzLyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjLyQoREVQRElSKS9ndGVzdC1hbGwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvJChERVBESVIpL2d0ZXN0X21haW4uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUB0ZXN0LyQoREVQRElSKS9ndGVzdF9hbGxfdGVzdC5Qb0BhbV9fcXVvdGVACisKKy5jYy5vOgorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACWRlcGJhc2U9YGVjaG8gJEAgfCBzZWQgJ3N8W14vXSokJHwkKERFUERJUikvJnw7c3xcLm8kJHx8J2A7XAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgJDwgJiZcCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgJDwKKworLmNjLm9iajoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5vYmokJHx8J2A7XAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYCAmJlwKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJCRkZXBiYXNlLlRwbyAkJGRlcGJhc2UuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jYy5sbzoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5sbyQkfHwnYDtcCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMVENYWENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkJGRlcGJhc2UuVHBvIC1jIC1vICRAICQ8ICYmXAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkJGRlcGJhc2UuVHBvICQkZGVwYmFzZS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTFRDWFhDT01QSUxFKSAtYyAtbyAkQCAkPAorCitmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vOiBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLm8gLU1EIC1NUCAtTUYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLlRwbyAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vIGB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpIGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5UcG8gZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYycgb2JqZWN0PSdmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vIGB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCisKK2Z1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLm9iajogZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vYmogLU1EIC1NUCAtTUYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLlRwbyAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vYmogYGlmIHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdC1hbGwuVHBvIGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MnIG9iamVjdD0nZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdC1hbGwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vYmogYGlmIHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGZpYAorCitmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0X21haW4ubzogZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm8gLU1EIC1NUCAtTUYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5UcG8gLWMgLW8gZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm8gYHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLlRwbyBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MnIG9iamVjdD0nZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5vIGB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKKworZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm9iajogZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm9iaiAtTUQgLU1QIC1NRiBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLlRwbyAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0X21haW4ub2JqIGBpZiB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5UcG8gZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJyBvYmplY3Q9J2Z1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5vYmogYGlmIHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyc7IGZpYAorCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm86IHNhbXBsZXMvc2FtcGxlMS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm8gLU1EIC1NUCAtTUYgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEuVHBvIC1jIC1vIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEubyBgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzYW1wbGVzL3NhbXBsZTEuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEuVHBvIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nc2FtcGxlcy9zYW1wbGUxLmNjJyBvYmplY3Q9J3NhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS5vIGB0ZXN0IC1mICdzYW1wbGVzL3NhbXBsZTEuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNhbXBsZXMvc2FtcGxlMS5jYworCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm9iajogc2FtcGxlcy9zYW1wbGUxLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEub2JqIC1NRCAtTVAgLU1GIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlRwbyAtYyAtbyBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm9iaiBgaWYgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NhbXBsZXMvc2FtcGxlMS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2FtcGxlcy9zYW1wbGUxLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlRwbyBzYW1wbGVzLyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J3NhbXBsZXMvc2FtcGxlMS5jYycgb2JqZWN0PSdzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS5vYmogYGlmIHRlc3QgLWYgJ3NhbXBsZXMvc2FtcGxlMS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzYW1wbGVzL3NhbXBsZTEuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NhbXBsZXMvc2FtcGxlMS5jYyc7IGZpYAorCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm86IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QuVHBvIC1jIC1vIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QubyBgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QuVHBvIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3NhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5vIGB0ZXN0IC1mICdzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYworCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm9iajogc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LlRwbyAtYyAtbyBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LlRwbyBzYW1wbGVzLyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYycgb2JqZWN0PSdzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyc7IGZpYAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCS1ybSAtcmYgbGliLy5saWJzIGxpYi9fbGlicworCS1ybSAtcmYgc2FtcGxlcy8ubGlicyBzYW1wbGVzL19saWJzCisJLXJtIC1yZiBzcmMvLmxpYnMgc3JjL19saWJzCisJLXJtIC1yZiB0ZXN0Ly5saWJzIHRlc3QvX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wgY29uZmlnLmx0CitpbnN0YWxsLW00ZGF0YURBVEE6ICQobTRkYXRhX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChtNGRhdGFkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtNGRhdGFkaXIpIgorCUBsaXN0PSckKG00ZGF0YV9EQVRBKSc7IHRlc3QgLW4gIiQobTRkYXRhZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChtNGRhdGFkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChtNGRhdGFkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLW00ZGF0YURBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtNGRhdGFfREFUQSknOyB0ZXN0IC1uICIkKG00ZGF0YWRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwlkaXI9JyQoREVTVERJUikkKG00ZGF0YWRpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCitpbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTOiAkKHBrZ2luY2x1ZGVfSEVBREVSUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHBrZ2luY2x1ZGVkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKSIKKwlAbGlzdD0nJChwa2dpbmNsdWRlX0hFQURFUlMpJzsgdGVzdCAtbiAiJChwa2dpbmNsdWRlZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgJyQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQocGtnaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQocGtnaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwlkaXI9JyQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQoraW5zdGFsbC1wa2dpbmNsdWRlX2ludGVybmFsSEVBREVSUzogJChwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocGtnaW5jbHVkZV9pbnRlcm5hbGRpcikiCisJQGxpc3Q9JyQocGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTKSc7IHRlc3QgLW4gIiQocGtnaW5jbHVkZV9pbnRlcm5hbGRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgXAorCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICckKERFU1RESVIpJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSciOyBcCisJICAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICIkKERFU1RESVIpJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSIgfHwgZXhpdCAkJD87IFwKKwlkb25lCisKK3VuaW5zdGFsbC1wa2dpbmNsdWRlX2ludGVybmFsSEVBREVSUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHBrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUyknOyB0ZXN0IC1uICIkKHBrZ2luY2x1ZGVfaW50ZXJuYWxkaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCisJZGlyPSckKERFU1RESVIpJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworY2hlY2stVEVTVFM6ICQoVEVTVFMpCisJQGZhaWxlZD0wOyBhbGw9MDsgeGZhaWw9MDsgeHBhc3M9MDsgc2tpcD0wOyBcCisJc3JjZGlyPSQoc3JjZGlyKTsgZXhwb3J0IHNyY2RpcjsgXAorCWxpc3Q9JyAkKFRFU1RTKSAnOyBcCisJJChhbV9fdHR5X2NvbG9ycyk7IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKKwkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKKwkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKKwkJeHBhc3M9YGV4cHIgJCR4cGFzcyArIDFgOyBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPVhQQVNTOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJY29sPSQkZ3JuOyByZXM9UEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICBlc2FjOyBcCisJICAgIGVsaWYgdGVzdCAkJD8gLW5lIDc3OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhmYWlsPWBleHByICQkeGZhaWwgKyAxYDsgXAorCQljb2w9JCRsZ247IHJlcz1YRkFJTDsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPUZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbHNlIFwKKwkgICAgICBza2lwPWBleHByICQkc2tpcCArIDFgOyBcCisJICAgICAgY29sPSQkYmx1OyByZXM9U0tJUDsgXAorCSAgICBmaTsgXAorCSAgICBlY2hvICIkJHtjb2x9JCRyZXMkJHtzdGR9OiAkJHRzdCI7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIHRlc3QgIiQkYWxsIiAtZXEgMTsgdGhlbiBcCisJICAgIHRlc3RzPSJ0ZXN0IjsgXAorCSAgICBBbGw9IiI7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0cz0idGVzdHMiOyBcCisJICAgIEFsbD0iQWxsICI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAorCSAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMDsgdGhlbiBcCisJICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgcGFzc2VkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMTsgdGhlbiBmYWlsdXJlcz1mYWlsdXJlOyBlbHNlIGZhaWx1cmVzPWZhaWx1cmVzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIGJlaGF2ZWQgYXMgZXhwZWN0ZWQgKCQkeGZhaWwgZXhwZWN0ZWQgJCRmYWlsdXJlcykiOyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBmYWlsZWQiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAxOyB0aGVuIHBhc3Nlcz1wYXNzOyBlbHNlIHBhc3Nlcz1wYXNzZXM7IGZpOyBcCisJICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgJCRwYXNzZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwkgIGRhc2hlcz0iJCRiYW5uZXIiOyBcCisJICBza2lwcGVkPSIiOyBcCisJICBpZiB0ZXN0ICIkJHNraXAiIC1uZSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCRza2lwIiAtZXEgMTsgdGhlbiBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0IHdhcyBub3QgcnVuKSI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0cyB3ZXJlIG5vdCBydW4pIjsgXAorCSAgICBmaTsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHNraXBwZWQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKKwkgICAgICBkYXNoZXM9IiQkc2tpcHBlZCI7IFwKKwkgIGZpOyBcCisJICByZXBvcnQ9IiI7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtbmUgMCAmJiB0ZXN0IC1uICIkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IHRoZW4gXAorCSAgICByZXBvcnQ9IlBsZWFzZSByZXBvcnQgdG8gJChQQUNLQUdFX0JVR1JFUE9SVCkiOyBcCisJICAgIHRlc3QgYGVjaG8gIiQkcmVwb3J0IiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHJlcG9ydCI7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9YGVjaG8gIiQkZGFzaGVzIiB8IHNlZCBzLy4vPS9nYDsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgY29sPSIkJGdybiI7IFwKKwkgIGVsc2UgXAorCSAgICBjb2w9IiQkcmVkIjsgXAorCSAgZmk7IFwKKwkgIGVjaG8gIiQke2NvbH0kJGRhc2hlcyQke3N0ZH0iOyBcCisJICBlY2hvICIkJHtjb2x9JCRiYW5uZXIkJHtzdGR9IjsgXAorCSAgdGVzdCAteiAiJCRza2lwcGVkIiB8fCBlY2hvICIkJHtjb2x9JCRza2lwcGVkJCR7c3RkfSI7IFwKKwkgIHRlc3QgLXogIiQkcmVwb3J0IiB8fCBlY2hvICIkJHtjb2x9JCRyZXBvcnQkJHtzdGR9IjsgXAorCSAgZWNobyAiJCR7Y29sfSQkZGFzaGVzJCR7c3RkfSI7IFwKKwkgIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgXAorCWVsc2UgOjsgZmkKKworZGlzdGRpcjogJChESVNURklMRVMpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJdGVzdCAtZCAiJChkaXN0ZGlyKSIgfHwgbWtkaXIgIiQoZGlzdGRpcikiCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJLXRlc3QgLW4gIiQoYW1fX3NraXBfbW9kZV9maXgpIiBcCisJfHwgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC03NTUgXAorCQktZXhlYyBjaG1vZCB1K3J3eCxnbytyeCB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKKwl8fCBjaG1vZCAtUiBhK3IgIiQoZGlzdGRpcikiCitkaXN0LWd6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorZGlzdC1iemlwMjogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBCWklQMj0kJHtCWklQMi0tOX0gYnppcDIgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWx6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgbHppcCAtYyAkJHtMWklQX09QVC0tOX0gPiQoZGlzdGRpcikudGFyLmx6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtbHptYTogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBsem1hIC05IC1jID4kKGRpc3RkaXIpLnRhci5sem1hCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QteHo6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgWFpfT1BUPSQke1haX09QVC0tZX0geHogLWMgPiQoZGlzdGRpcikudGFyLnh6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtdGFyWjogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBjb21wcmVzcyAtYyA+JChkaXN0ZGlyKS50YXIuWgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXNoYXI6IGRpc3RkaXIKKwlzaGFyICQoZGlzdGRpcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikuc2hhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorZGlzdC16aXA6IGRpc3RkaXIKKwktcm0gLWYgJChkaXN0ZGlyKS56aXAKKwl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdCBkaXN0LWFsbDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEJaSVAyPSQke0JaSVAyLS05fSBiemlwMiAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCisJLXJtIC1mICQoZGlzdGRpcikuemlwCisJemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKKyMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KKyMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKKyMgdGFyZmlsZS4KK2Rpc3RjaGVjazogZGlzdAorCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKKwkqLnRhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCisJKi50YXIuYnoyKikgXAorCSAgYnppcDIgLWRjICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5sem1hKikgXAorCSAgbHptYSAtZGMgJChkaXN0ZGlyKS50YXIubHptYSB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5seiopIFwKKwkgIGx6aXAgLWRjICQoZGlzdGRpcikudGFyLmx6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLnh6KikgXAorCSAgeHogLWRjICQoZGlzdGRpcikudGFyLnh6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLloqKSBcCisJICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCisJKi5zaGFyLmd6KikgXAorCSAgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1kYyAkKGRpc3RkaXIpLnNoYXIuZ3ogfCB1bnNoYXIgOztcCisJKi56aXAqKSBcCisJICB1bnppcCAkKGRpc3RkaXIpLnppcCA7O1wKKwllc2FjCisJY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIGErdyAkKGRpc3RkaXIpCisJbWtkaXIgJChkaXN0ZGlyKS9fYnVpbGQKKwlta2RpciAkKGRpc3RkaXIpL19pbnN0CisJY2htb2QgYS13ICQoZGlzdGRpcikKKwl0ZXN0IC1kICQoZGlzdGRpcikvX2J1aWxkIHx8IGV4aXQgMDsgXAorCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAorCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCisJICAmJiBhbV9fY3dkPWBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKGRpc3RkaXIpL19idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICQoQU1fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgXAorCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCisJICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAmJiAoeyBcCisJICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKKwkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAorCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAorCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAorCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sgXAorCSAgJiYgY2QgIiQkYW1fX2N3ZCIgXAorCSAgfHwgZXhpdCAxCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKKwkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKKwkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JworZGlzdHVuaW5zdGFsbGNoZWNrOgorCUB0ZXN0IC1uICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyB8fCB7IFwKKwkgIGVjaG8gJ0VSUk9SOiB0cnlpbmcgdG8gcnVuICRAIHdpdGggYW4gZW1wdHknIFwKKwkgICAgICAgJyQkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyA+JjI7IFwKKwkgIGV4aXQgMTsgXAorCX07IFwKKwkkKGFtX19jZCkgJyQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknIHx8IHsgXAorCSAgZWNobyAnRVJST1I6IGNhbm5vdCBjaGRpciBpbnRvICQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknID4mMjsgXAorCSAgZXhpdCAxOyBcCisJfTsgXAorCXRlc3QgYCQoYW1fX2Rpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKKwkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAorCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAorCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAorCSAgICAgICAgZmkgOyBcCisJICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICAgZXhpdCAxOyB9ID4mMgorZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgorCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAorCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCisJICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKKwkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICBleGl0IDE7IH0gPiYyCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJChjaGVja19QUk9HUkFNUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1URVNUUworY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpICQoREFUQSkgJChIRUFERVJTKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKG00ZGF0YWRpcikiICIkKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKSIgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVfaW50ZXJuYWxkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgICAgIGluc3RhbGw7IFwKKwllbHNlIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAorCWZpCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCS1ybSAtZiBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGxpYi8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNhbXBsZXMvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgdGVzdC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHRlc3QvJChhbV9fZGlyc3RhbXApCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorQEhBVkVfUFlUSE9OX0ZBTFNFQG1haW50YWluZXItY2xlYW4tbG9jYWw6CitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMVExJQlJBUklFUyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQorCS1ybSAtcmYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKSBzYW1wbGVzLyQoREVQRElSKSBzcmMvJChERVBESVIpIHRlc3QvJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtbTRkYXRhREFUQSBcCisJaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUyBpbnN0YWxsLXBrZ2luY2x1ZGVfaW50ZXJuYWxIRUFERVJTCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1saWJMVExJQlJBUklFUworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKKwktcm0gLXJmIGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikgc2FtcGxlcy8kKERFUERJUikgc3JjLyQoREVQRElSKSB0ZXN0LyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCisJbWFpbnRhaW5lci1jbGVhbi1sb2NhbAorCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLW00ZGF0YURBVEEgXAorCXVuaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUyBcCisJdW5pbnN0YWxsLXBrZ2luY2x1ZGVfaW50ZXJuYWxIRUFERVJTCisKKy5NQUtFOiBjaGVjay1hbSBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGFtLS1yZWZyZXNoIGNoZWNrIGNoZWNrLVRFU1RTIGNoZWNrLWFtIFwKKwljbGVhbiBjbGVhbi1jaGVja1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY3RhZ3MgZGlzdCBkaXN0LWFsbCBcCisJZGlzdC1iemlwMiBkaXN0LWd6aXAgZGlzdC1semlwIGRpc3QtbHptYSBkaXN0LXNoYXIgZGlzdC10YXJaIFwKKwlkaXN0LXh6IGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAorCWluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCisJaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW00ZGF0YURBVEEgaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMgXAorCWluc3RhbGwtcGtnaW5jbHVkZV9pbnRlcm5hbEhFQURFUlMgaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKKwltYWludGFpbmVyLWNsZWFuLWxvY2FsIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKKwl1bmluc3RhbGwtbTRkYXRhREFUQSB1bmluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMgXAorCXVuaW5zdGFsbC1wa2dpbmNsdWRlX2ludGVybmFsSEVBREVSUworCisKKyMgQnVpbGQgcnVsZXMgZm9yIHB1dHRpbmcgZnVzZWQgR29vZ2xlIFRlc3QgZmlsZXMgaW50byB0aGUgZGlzdHJpYnV0aW9uCisjIHBhY2thZ2UuIFRoZSB1c2VyIGNhbiBhbHNvIGNyZWF0ZSB0aG9zZSBmaWxlcyBieSBtYW51YWxseSBydW5uaW5nCisjIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weS4KK0BIQVZFX1BZVEhPTl9UUlVFQCQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X1NPVVJDRVMpOiBmdXNlZC1ndGVzdAorCitASEFWRV9QWVRIT05fVFJVRUBmdXNlZC1ndGVzdDogJChwa2dpbmNsdWRlX0hFQURFUlMpICQocGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTKSBcCitASEFWRV9QWVRIT05fVFJVRUAgICAgICAgICAgICAgJChHVEVTVF9TUkMpIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MgXAorQEhBVkVfUFlUSE9OX1RSVUVAICAgICAgICAgICAgIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weQorQEhBVkVfUFlUSE9OX1RSVUVACW1rZGlyIC1wICIkKHNyY2RpcikvZnVzZWQtc3JjIgorQEhBVkVfUFlUSE9OX1RSVUVACWNobW9kIC1SIHUrdyAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKK0BIQVZFX1BZVEhPTl9UUlVFQAlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MiCitASEFWRV9QWVRIT05fVFJVRUAJcm0gLWYgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCIKK0BIQVZFX1BZVEhPTl9UUlVFQAkiJChzcmNkaXIpL3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSIgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCitASEFWRV9QWVRIT05fVFJVRUAJY3AgLWYgIiQoc3JjZGlyKS9zcmMvZ3Rlc3RfbWFpbi5jYyIgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvIgorCitASEFWRV9QWVRIT05fVFJVRUBtYWludGFpbmVyLWNsZWFuLWxvY2FsOgorQEhBVkVfUFlUSE9OX1RSVUVACXJtIC1yZiAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKworIyBEaXNhYmxlcyAnbWFrZSBpbnN0YWxsJyBhcyBpbnN0YWxsaW5nIGEgY29tcGlsZWQgdmVyc2lvbiBvZiBHb29nbGUKKyMgVGVzdCBjYW4gbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3IgZHVlIHRvIHZpb2xhdGlvbiBvZiB0aGUKKyMgT25lLURlZmluaXRpb24gUnVsZS4KKworaW5zdGFsbC1leGVjLWxvY2FsOgorCWVjaG8gIidtYWtlIGluc3RhbGwnIGlzIGRhbmdlcm91cyBhbmQgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgc2VlIFJFQURNRSBmb3IgaG93IHRvIGludGVncmF0ZSBHb29nbGUgVGVzdCBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtLiIKKwlmYWxzZQorCitpbnN0YWxsLWRhdGEtbG9jYWw6CisJZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0IGludG8geW91ciBidWlsZCBzeXN0ZW0uIgorCWZhbHNlCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvUkVBRE1FIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmMzVhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvUkVBRE1FCkBAIC0wLDAgKzEsNDM1IEBACitHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LworCitPdmVydmlldworLS0tLS0tLS0KKworR29vZ2xlJ3MgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyB0ZXN0cyBvbiBhIHZhcmlldHkgb2YgcGxhdGZvcm1zCisoTGludXgsIE1hYyBPUyBYLCBXaW5kb3dzLCBXaW5kb3dzIENFLCBTeW1iaWFuLCBldGMpLiAgQmFzZWQgb24gdGhlCit4VW5pdCBhcmNoaXRlY3R1cmUuICBTdXBwb3J0cyBhdXRvbWF0aWMgdGVzdCBkaXNjb3ZlcnksIGEgcmljaCBzZXQgb2YKK2Fzc2VydGlvbnMsIHVzZXItZGVmaW5lZCBhc3NlcnRpb25zLCBkZWF0aCB0ZXN0cywgZmF0YWwgYW5kIG5vbi1mYXRhbAorZmFpbHVyZXMsIHZhcmlvdXMgb3B0aW9ucyBmb3IgcnVubmluZyB0aGUgdGVzdHMsIGFuZCBYTUwgdGVzdCByZXBvcnQKK2dlbmVyYXRpb24uCisKK1BsZWFzZSBzZWUgdGhlIHByb2plY3QgcGFnZSBhYm92ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHRoZQorbWFpbGluZyBsaXN0IGZvciBxdWVzdGlvbnMsIGRpc2N1c3Npb25zLCBhbmQgZGV2ZWxvcG1lbnQuICBUaGVyZSBpcworYWxzbyBhbiBJUkMgY2hhbm5lbCBvbiBPRlRDIChpcmMub2Z0Yy5uZXQpICNndGVzdCBhdmFpbGFibGUuICBQbGVhc2UKK2pvaW4gdXMhCisKK1JlcXVpcmVtZW50cyBmb3IgRW5kIFVzZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHb29nbGUgVGVzdCBpcyBkZXNpZ25lZCB0byBoYXZlIGZhaXJseSBtaW5pbWFsIHJlcXVpcmVtZW50cyB0byBidWlsZAorYW5kIHVzZSB3aXRoIHlvdXIgcHJvamVjdHMsIGJ1dCB0aGVyZSBhcmUgc29tZS4gIEN1cnJlbnRseSwgd2Ugc3VwcG9ydAorTGludXgsIFdpbmRvd3MsIE1hYyBPUyBYLCBhbmQgQ3lnd2luLiAgV2Ugd2lsbCBhbHNvIG1ha2Ugb3VyIGJlc3QKK2VmZm9ydCB0byBzdXBwb3J0IG90aGVyIHBsYXRmb3JtcyAoZS5nLiBTb2xhcmlzLCBBSVgsIGFuZCB6L09TKS4KK0hvd2V2ZXIsIHNpbmNlIGNvcmUgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgcHJvamVjdCBoYXZlIG5vIGFjY2VzcwordG8gdGhlc2UgcGxhdGZvcm1zLCBHb29nbGUgVGVzdCBtYXkgaGF2ZSBvdXRzdGFuZGluZyBpc3N1ZXMgdGhlcmUuICBJZgoreW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQorZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLiAgUGF0Y2hlcyBmb3IgZml4aW5nIHRoZW0gYXJlCitldmVuIG1vcmUgd2VsY29tZSEKKworIyMjIExpbnV4IFJlcXVpcmVtZW50cyAjIyMKKworVGhlc2UgYXJlIHRoZSBiYXNlIHJlcXVpcmVtZW50cyB0byBidWlsZCBhbmQgdXNlIEdvb2dsZSBUZXN0IGZyb20gYSBzb3VyY2UKK3BhY2thZ2UgKGFzIGRlc2NyaWJlZCBiZWxvdyk6CisgICogR05VLWNvbXBhdGlibGUgTWFrZSBvciBnbWFrZQorICAqIFBPU0lYLXN0YW5kYXJkIHNoZWxsCisgICogUE9TSVgoLTIpIFJlZ3VsYXIgRXhwcmVzc2lvbnMgKHJlZ2V4LmgpCisgICogQSBDKys5OC1zdGFuZGFyZC1jb21wbGlhbnQgY29tcGlsZXIKKworIyMjIFdpbmRvd3MgUmVxdWlyZW1lbnRzICMjIworCisgICogTWljcm9zb2Z0IFZpc3VhbCBDKysgNy4xIG9yIG5ld2VyCisKKyMjIyBDeWd3aW4gUmVxdWlyZW1lbnRzICMjIworCisgICogQ3lnd2luIDEuNS4yNS0xNCBvciBuZXdlcgorCisjIyMgTWFjIE9TIFggUmVxdWlyZW1lbnRzICMjIworCisgICogTWFjIE9TIFggMTAuNCBUaWdlciBvciBuZXdlcgorICAqIERldmVsb3BlciBUb29scyBJbnN0YWxsZWQKKworQWxzbywgeW91J2xsIG5lZWQgQ01ha2UgMi42LjQgb3IgaGlnaGVyIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZQorc2FtcGxlcyB1c2luZyB0aGUgcHJvdmlkZWQgQ01ha2Ugc2NyaXB0LCByZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybS4KKworUmVxdWlyZW1lbnRzIGZvciBDb250cmlidXRvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4gIElmIHlvdSBwbGFuIHRvIGNvbnRyaWJ1dGUgYSBwYXRjaCwgeW91IG5lZWQgdG8KK2J1aWxkIEdvb2dsZSBUZXN0IGFuZCBpdHMgb3duIHRlc3RzIGZyb20gYW4gU1ZOIGNoZWNrb3V0IChkZXNjcmliZWQKK2JlbG93KSwgd2hpY2ggaGFzIGZ1cnRoZXIgcmVxdWlyZW1lbnRzOgorCisgICogUHl0aG9uIHZlcnNpb24gMi4zIG9yIG5ld2VyIChmb3IgcnVubmluZyBzb21lIG9mIHRoZSB0ZXN0cyBhbmQKKyAgICByZS1nZW5lcmF0aW5nIGNlcnRhaW4gc291cmNlIGZpbGVzIGZyb20gdGVtcGxhdGVzKQorICAqIENNYWtlIDIuNi40IG9yIG5ld2VyCisKK0dldHRpbmcgdGhlIFNvdXJjZQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSB0d28gcHJpbWFyeSB3YXlzIG9mIGdldHRpbmcgR29vZ2xlIFRlc3QncyBzb3VyY2UgY29kZTogeW91CitjYW4gZG93bmxvYWQgYSBzdGFibGUgc291cmNlIHJlbGVhc2UgaW4geW91ciBwcmVmZXJyZWQgYXJjaGl2ZSBmb3JtYXQsCitvciBkaXJlY3RseSBjaGVjayBvdXQgdGhlIHNvdXJjZSBmcm9tIG91ciBTdWJ2ZXJzaW9uIChTVk4pIHJlcG9zaXRhcnkuCitUaGUgU1ZOIGNoZWNrb3V0IHJlcXVpcmVzIGEgZmV3IGV4dHJhIHN0ZXBzIGFuZCBzb21lIGV4dHJhIHNvZnR3YXJlCitwYWNrYWdlcyBvbiB5b3VyIHN5c3RlbSwgYnV0IGxldHMgeW91IHRyYWNrIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgYW5kCittYWtlIHBhdGNoZXMgbXVjaCBtb3JlIGVhc2lseSwgc28gd2UgaGlnaGx5IGVuY291cmFnZSBpdC4KKworIyMjIFNvdXJjZSBQYWNrYWdlICMjIworCitHb29nbGUgVGVzdCBpcyByZWxlYXNlZCBpbiB2ZXJzaW9uZWQgc291cmNlIHBhY2thZ2VzIHdoaWNoIGNhbiBiZQorZG93bmxvYWRlZCBmcm9tIHRoZSBkb3dubG9hZCBwYWdlIFsxXS4gIFNldmVyYWwgZGlmZmVyZW50IGFyY2hpdmUKK2Zvcm1hdHMgYXJlIHByb3ZpZGVkLCBidXQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgdG9vbHMgdXNlZCB0bworbWFuaXB1bGF0ZSB0aGVtLCBhbmQgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBmaWxlLiAgRG93bmxvYWQKK3doaWNoZXZlciB5b3UgYXJlIG1vc3QgY29tZm9ydGFibGUgd2l0aC4KKworICBbMV0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvZG93bmxvYWRzL2xpc3QKKworT25jZSB0aGUgcGFja2FnZSBpcyBkb3dubG9hZGVkLCBleHBhbmQgaXQgdXNpbmcgd2hpY2hldmVyIHRvb2xzIHlvdQorcHJlZmVyIGZvciB0aGF0IHR5cGUuICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZQorbmFtZSAiZ3Rlc3QtWC5ZLloiIHdoaWNoIGNvbnRhaW5zIGFsbCBvZiB0aGUgc291cmNlIGNvZGUuICBIZXJlIGFyZQorc29tZSBleGFtcGxlcyBvbiBMaW51eDoKKworICB0YXIgLXh2emYgZ3Rlc3QtWC5ZLloudGFyLmd6CisgIHRhciAteHZqZiBndGVzdC1YLlkuWi50YXIuYnoyCisgIHVuemlwIGd0ZXN0LVguWS5aLnppcAorCisjIyMgU1ZOIENoZWNrb3V0ICMjIworCitUbyBjaGVjayBvdXQgdGhlIG1haW4gYnJhbmNoIChhbHNvIGtub3duIGFzIHRoZSAidHJ1bmsiKSBvZiBHb29nbGUKK1Rlc3QsIHJ1biB0aGUgZm9sbG93aW5nIFN1YnZlcnNpb24gY29tbWFuZDoKKworICBzdm4gY2hlY2tvdXQgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLyBndGVzdC1zdm4KKworU2V0dGluZyB1cCB0aGUgQnVpbGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGJ1aWxkIEdvb2dsZSBUZXN0IGFuZCB5b3VyIHRlc3RzIHRoYXQgdXNlIGl0LCB5b3UgbmVlZCB0byB0ZWxsIHlvdXIKK2J1aWxkIHN5c3RlbSB3aGVyZSB0byBmaW5kIGl0cyBoZWFkZXJzIGFuZCBzb3VyY2UgZmlsZXMuICBUaGUgZXhhY3QKK3dheSB0byBkbyBpdCBkZXBlbmRzIG9uIHdoaWNoIGJ1aWxkIHN5c3RlbSB5b3UgdXNlLCBhbmQgaXMgdXN1YWxseQorc3RyYWlnaHRmb3J3YXJkLgorCisjIyMgR2VuZXJpYyBCdWlsZCBJbnN0cnVjdGlvbnMgIyMjCisKK1N1cHBvc2UgeW91IHB1dCBHb29nbGUgVGVzdCBpbiBkaXJlY3RvcnkgJHtHVEVTVF9ESVJ9LiAgVG8gYnVpbGQgaXQsCitjcmVhdGUgYSBsaWJyYXJ5IGJ1aWxkIHRhcmdldCAob3IgYSBwcm9qZWN0IGFzIGNhbGxlZCBieSBWaXN1YWwgU3R1ZGlvCithbmQgWGNvZGUpIHRvIGNvbXBpbGUKKworICAke0dURVNUX0RJUn0vc3JjL2d0ZXN0LWFsbC5jYworCit3aXRoICR7R1RFU1RfRElSfS9pbmNsdWRlIGluIHRoZSBzeXN0ZW0gaGVhZGVyIHNlYXJjaCBwYXRoIGFuZCAke0dURVNUX0RJUn0KK2luIHRoZSBub3JtYWwgaGVhZGVyIHNlYXJjaCBwYXRoLiAgQXNzdW1pbmcgYSBMaW51eC1saWtlIHN5c3RlbSBhbmQgZ2NjLAorc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyB3aWxsIGRvOgorCisgIGcrKyAtaXN5c3RlbSAke0dURVNUX0RJUn0vaW5jbHVkZSAtSSR7R1RFU1RfRElSfSBcCisgICAgICAtcHRocmVhZCAtYyAke0dURVNUX0RJUn0vc3JjL2d0ZXN0LWFsbC5jYworICBhciAtcnYgbGliZ3Rlc3QuYSBndGVzdC1hbGwubworCisoV2UgbmVlZCAtcHRocmVhZCBhcyBHb29nbGUgVGVzdCB1c2VzIHRocmVhZHMuKQorCitOZXh0LCB5b3Ugc2hvdWxkIGNvbXBpbGUgeW91ciB0ZXN0IHNvdXJjZSBmaWxlIHdpdGgKKyR7R1RFU1RfRElSfS9pbmNsdWRlIGluIHRoZSBzeXN0ZW0gaGVhZGVyIHNlYXJjaCBwYXRoLCBhbmQgbGluayBpdAord2l0aCBndGVzdCBhbmQgYW55IG90aGVyIG5lY2Vzc2FyeSBsaWJyYXJpZXM6CisKKyAgZysrIC1pc3lzdGVtICR7R1RFU1RfRElSfS9pbmNsdWRlIC1wdGhyZWFkIHBhdGgvdG8veW91cl90ZXN0LmNjIGxpYmd0ZXN0LmEgXAorICAgICAgLW8geW91cl90ZXN0CisKK0FzIGFuIGV4YW1wbGUsIHRoZSBtYWtlLyBkaXJlY3RvcnkgY29udGFpbnMgYSBNYWtlZmlsZSB0aGF0IHlvdSBjYW4KK3VzZSB0byBidWlsZCBHb29nbGUgVGVzdCBvbiBzeXN0ZW1zIHdoZXJlIEdOVSBtYWtlIGlzIGF2YWlsYWJsZQorKGUuZy4gTGludXgsIE1hYyBPUyBYLCBhbmQgQ3lnd2luKS4gIEl0IGRvZXNuJ3QgdHJ5IHRvIGJ1aWxkIEdvb2dsZQorVGVzdCdzIG93biB0ZXN0cy4gIEluc3RlYWQsIGl0IGp1c3QgYnVpbGRzIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5IGFuZAorYSBzYW1wbGUgdGVzdC4gIFlvdSBjYW4gdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgb3duIGJ1aWxkCitzY3JpcHQuCisKK0lmIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSBjb3JyZWN0IGZvciB5b3VyIGVudmlyb25tZW50LCB0aGUKK2ZvbGxvd2luZyBjb21tYW5kcyBzaG91bGQgc3VjY2VlZDoKKworICBjZCAke0dURVNUX0RJUn0vbWFrZQorICBtYWtlCisgIC4vc2FtcGxlMV91bml0dGVzdAorCitJZiB5b3Ugc2VlIGVycm9ycywgdHJ5IHRvIHR3ZWFrIHRoZSBjb250ZW50cyBvZiBtYWtlL01ha2VmaWxlIHRvIG1ha2UKK3RoZW0gZ28gYXdheS4gIFRoZXJlIGFyZSBpbnN0cnVjdGlvbnMgaW4gbWFrZS9NYWtlZmlsZSBvbiBob3cgdG8gZG8KK2l0LgorCisjIyMgVXNpbmcgQ01ha2UgIyMjCisKK0dvb2dsZSBUZXN0IGNvbWVzIHdpdGggYSBDTWFrZSBidWlsZCBzY3JpcHQgKENNYWtlTGlzdHMudHh0KSB0aGF0IGNhbgorYmUgdXNlZCBvbiBhIHdpZGUgcmFuZ2Ugb2YgcGxhdGZvcm1zICgiQyIgc3RhbmRzIGZvciBjcm9zcy1wbGF0b2ZybS4pLgorSWYgeW91IGRvbid0IGhhdmUgQ01ha2UgaW5zdGFsbGVkIGFscmVhZHksIHlvdSBjYW4gZG93bmxvYWQgaXQgZm9yCitmcmVlIGZyb20gaHR0cDovL3d3dy5jbWFrZS5vcmcvLgorCitDTWFrZSB3b3JrcyBieSBnZW5lcmF0aW5nIG5hdGl2ZSBtYWtlZmlsZXMgb3IgYnVpbGQgcHJvamVjdHMgdGhhdCBjYW4KK2JlIHVzZWQgaW4gdGhlIGNvbXBpbGVyIGVudmlyb25tZW50IG9mIHlvdXIgY2hvaWNlLiAgVGhlIHR5cGljYWwKK3dvcmtmbG93IHN0YXJ0cyB3aXRoOgorCisgIG1rZGlyIG15YnVpbGQgICAgICAgIyBDcmVhdGUgYSBkaXJlY3RvcnkgdG8gaG9sZCB0aGUgYnVpbGQgb3V0cHV0LgorICBjZCBteWJ1aWxkCisgIGNtYWtlICR7R1RFU1RfRElSfSAgIyBHZW5lcmF0ZSBuYXRpdmUgYnVpbGQgc2NyaXB0cy4KKworSWYgeW91IHdhbnQgdG8gYnVpbGQgR29vZ2xlIFRlc3QncyBzYW1wbGVzLCB5b3Ugc2hvdWxkIHJlcGxhY2UgdGhlCitsYXN0IGNvbW1hbmQgd2l0aAorCisgIGNtYWtlIC1EZ3Rlc3RfYnVpbGRfc2FtcGxlcz1PTiAke0dURVNUX0RJUn0KKworSWYgeW91IGFyZSBvbiBhICpuaXggc3lzdGVtLCB5b3Ugc2hvdWxkIG5vdyBzZWUgYSBNYWtlZmlsZSBpbiB0aGUKK2N1cnJlbnQgZGlyZWN0b3J5LiAgSnVzdCB0eXBlICdtYWtlJyB0byBidWlsZCBndGVzdC4KKworSWYgeW91IHVzZSBXaW5kb3dzIGFuZCBoYXZlIFZpc3R1YWwgU3R1ZGlvIGluc3RhbGxlZCwgYSBndGVzdC5zbG4gZmlsZQorYW5kIHNldmVyYWwgLnZjcHJvaiBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQuICBZb3UgY2FuIHRoZW4gYnVpbGQgdGhlbQordXNpbmcgVmlzdWFsIFN0dWRpby4KKworT24gTWFjIE9TIFggd2l0aCBYY29kZSBpbnN0YWxsZWQsIGEgLnhjb2RlcHJvaiBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLgorCisjIyMgTGVnYWN5IEJ1aWxkIFNjcmlwdHMgIyMjCisKK0JlZm9yZSBzZXR0bGluZyBvbiBDTWFrZSwgd2UgaGF2ZSBiZWVuIHByb3ZpZGluZyBoYW5kLW1haW50YWluZWQgYnVpbGQKK3Byb2plY3RzL3NjcmlwdHMgZm9yIFZpc3VhbCBTdHVkaW8sIFhjb2RlLCBhbmQgQXV0b3Rvb2xzLiAgV2hpbGUgd2UKK2NvbnRpbnVlIHRvIHByb3ZpZGUgdGhlbSBmb3IgY29udmVuaWVuY2UsIHRoZXkgYXJlIG5vdCBhY3RpdmVseQorbWFpbnRhaW5lZCBhbnkgbW9yZS4gIFdlIGhpZ2hseSByZWNvbW1lbmQgdGhhdCB5b3UgZm9sbG93IHRoZQoraW5zdHJ1Y3Rpb25zIGluIHRoZSBwcmV2aW91cyB0d28gc2VjdGlvbnMgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0Cit3aXRoIHlvdXIgZXhpc3RpbmcgYnVpbGQgc3lzdGVtLgorCitJZiB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgdGhlIGxlZ2FjeSBidWlsZCBzY3JpcHRzLCBoZXJlJ3MgaG93OgorCitUaGUgbXN2Y1wgZm9sZGVyIGNvbnRhaW5zIHR3byBzb2x1dGlvbnMgd2l0aCBWaXN1YWwgQysrIHByb2plY3RzLgorT3BlbiB0aGUgZ3Rlc3Quc2xuIG9yIGd0ZXN0LW1kLnNsbiBmaWxlIHVzaW5nIFZpc3VhbCBTdHVkaW8sIGFuZCB5b3UKK2FyZSByZWFkeSB0byBidWlsZCBHb29nbGUgVGVzdCB0aGUgc2FtZSB3YXkgeW91IGJ1aWxkIGFueSBWaXN1YWwKK1N0dWRpbyBwcm9qZWN0LiAgRmlsZXMgdGhhdCBoYXZlIG5hbWVzIGVuZGluZyB3aXRoIC1tZCB1c2UgRExMCit2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgcnVudGltZSBsaWJyYXJpZXMgKHRoZSAvTUQgb3IgdGhlIC9NRGQgY29tcGlsZXIKK29wdGlvbikuICBGaWxlcyB3aXRob3V0IHRoYXQgc3VmZml4IHVzZSBzdGF0aWMgdmVyc2lvbnMgb2YgdGhlIHJ1bnRpbWUKK2xpYnJhcmllcyAodGhlIC9NVCBvciB0aGUgL01UZCBvcHRpb24pLiAgUGxlYXNlIG5vdGUgdGhhdCBvbmUgbXVzdCB1c2UKK3RoZSBzYW1lIG9wdGlvbiB0byBjb21waWxlIGJvdGggZ3Rlc3QgYW5kIHRoZSB0ZXN0IGNvZGUuICBJZiB5b3UgdXNlCitWaXN1YWwgU3R1ZGlvIDIwMDUgb3IgYWJvdmUsIHdlIHJlY29tbWVuZCB0aGUgLW1kIHZlcnNpb24gYXMgL01EIGlzCit0aGUgZGVmYXVsdCBmb3IgbmV3IHByb2plY3RzIGluIHRoZXNlIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8uCisKK09uIE1hYyBPUyBYLCBvcGVuIHRoZSBndGVzdC54Y29kZXByb2ogaW4gdGhlIHhjb2RlLyBmb2xkZXIgdXNpbmcKK1hjb2RlLiAgQnVpbGQgdGhlICJndGVzdCIgdGFyZ2V0LiAgVGhlIHVuaXZlcnNhbCBiaW5hcnkgZnJhbWV3b3JrIHdpbGwKK2VuZCB1cCBpbiB5b3VyIHNlbGVjdGVkIGJ1aWxkIGRpcmVjdG9yeSAoc2VsZWN0ZWQgaW4gdGhlIFhjb2RlCisiUHJlZmVyZW5jZXMuLi4iIC0+ICJCdWlsZGluZyIgcGFuZSBhbmQgZGVmYXVsdHMgdG8geGNvZGUvYnVpbGQpLgorQWx0ZXJuYXRpdmVseSwgYXQgdGhlIGNvbW1hbmQgbGluZSwgZW50ZXI6CisKKyAgeGNvZGVidWlsZAorCitUaGlzIHdpbGwgYnVpbGQgdGhlICJSZWxlYXNlIiBjb25maWd1cmF0aW9uIG9mIGd0ZXN0LmZyYW1ld29yayBpbiB5b3VyCitkZWZhdWx0IGJ1aWxkIGxvY2F0aW9uLiAgU2VlIHRoZSAieGNvZGVidWlsZCIgbWFuIHBhZ2UgZm9yIG1vcmUKK2luZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhbmQgYnVpbGRpbmcgaW4KK2RpZmZlcmVudCBsb2NhdGlvbnMuCisKK0lmIHlvdSB3aXNoIHRvIHVzZSB0aGUgR29vZ2xlIFRlc3QgWGNvZGUgcHJvamVjdCB3aXRoIFhjb2RlIDQueCBhbmQKK2Fib3ZlLCB5b3UgbmVlZCB0byBlaXRoZXI6CisgKiB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4geGNvZGUvQ29uZmlnL0dlbmVyYWwueGNvbmZpZy4KKyAgIENvbW1lbnQgb3B0aW9ucyBTREtST09ULCBNQUNPU19ERVBMT1lNRU5UX1RBUkdFVCwgYW5kIEdDQ19WRVJTSU9OLiBJZgorICAgeW91IGNob29zZSB0aGlzIHJvdXRlIHlvdSBsb3NlIHRoZSBhYmlsaXR5IHRvIHRhcmdldCBlYXJsaWVyIHZlcnNpb25zCisgICBvZiBNYWNPUyBYLgorICogSW5zdGFsbCBhbiBTREsgZm9yIGFuIGVhcmxpZXIgdmVyc2lvbi4gVGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZQorICAgc3VwcG9ydGVkIGJ5IEFwcGxlLCBidXQgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gd29yaworICAgKGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTM3ODUxOCkuCisKK1R3ZWFraW5nIEdvb2dsZSBUZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHb29nbGUgVGVzdCBjYW4gYmUgdXNlZCBpbiBkaXZlcnNlIGVudmlyb25tZW50cy4gIFRoZSBkZWZhdWx0Citjb25maWd1cmF0aW9uIG1heSBub3Qgd29yayAob3IgbWF5IG5vdCB3b3JrIHdlbGwpIG91dCBvZiB0aGUgYm94IGluCitzb21lIGVudmlyb25tZW50cy4gIEhvd2V2ZXIsIHlvdSBjYW4gZWFzaWx5IHR3ZWFrIEdvb2dsZSBUZXN0IGJ5CitkZWZpbmluZyBjb250cm9sIG1hY3JvcyBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lLiAgR2VuZXJhbGx5LAordGhlc2UgbWFjcm9zIGFyZSBuYW1lZCBsaWtlIEdURVNUX1hZWiBhbmQgeW91IGRlZmluZSB0aGVtIHRvIGVpdGhlciAxCitvciAwIHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgY2VydGFpbiBmZWF0dXJlLgorCitXZSBsaXN0IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBtYWNyb3MgYmVsb3cuICBGb3IgYSBjb21wbGV0ZSBsaXN0LAorc2VlIGZpbGUgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmguCisKKyMjIyBDaG9vc2luZyBhIFRSMSBUdXBsZSBMaWJyYXJ5ICMjIworCitTb21lIEdvb2dsZSBUZXN0IGZlYXR1cmVzIHJlcXVpcmUgdGhlIEMrKyBUZWNobmljYWwgUmVwb3J0IDEgKFRSMSkKK3R1cGxlIGxpYnJhcnksIHdoaWNoIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIHdpdGggYWxsIGNvbXBpbGVycy4gIFRoZQorZ29vZCBuZXdzIGlzIHRoYXQgR29vZ2xlIFRlc3QgaW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgdGhhdCdzCitlbm91Z2ggZm9yIGl0cyBvd24gbmVlZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB1c2UgdGhpcyB3aGVuIHRoZQorY29tcGlsZXIgZG9lc24ndCBwcm92aWRlIFRSMSB0dXBsZS4KKworVXN1YWxseSB5b3UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHdoaWNoIHR1cGxlIGxpYnJhcnkgR29vZ2xlIFRlc3QKK3VzZXMuICBIb3dldmVyLCBpZiB5b3VyIHByb2plY3QgYWxyZWFkeSB1c2VzIFRSMSB0dXBsZSwgeW91IG5lZWQgdG8KK3RlbGwgR29vZ2xlIFRlc3QgdG8gdXNlIHRoZSBzYW1lIFRSMSB0dXBsZSBsaWJyYXJ5IHRoZSByZXN0IG9mIHlvdXIKK3Byb2plY3QgdXNlcywgb3IgdGhlIHR3byB0dXBsZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBjbGFzaC4gIFRvIGRvCit0aGF0LCBhZGQKKworICAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTAKKwordG8gdGhlIGNvbXBpbGVyIGZsYWdzIHdoaWxlIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhbmQgeW91ciB0ZXN0cy4gIElmCit5b3Ugd2FudCB0byBmb3JjZSBHb29nbGUgVGVzdCB0byB1c2UgaXRzIG93biB0dXBsZSBsaWJyYXJ5LCBqdXN0IGFkZAorCisgIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MgaW5zdGVhZC4KKworSWYgeW91IGRvbid0IHdhbnQgR29vZ2xlIFRlc3QgdG8gdXNlIHR1cGxlIGF0IGFsbCwgYWRkCisKKyAgLURHVEVTVF9IQVNfVFIxX1RVUExFPTAKKworYW5kIGFsbCBmZWF0dXJlcyB1c2luZyB0dXBsZSB3aWxsIGJlIGRpc2FibGVkLgorCisjIyMgTXVsdGktdGhyZWFkZWQgVGVzdHMgIyMjCisKK0dvb2dsZSBUZXN0IGlzIHRocmVhZC1zYWZlIHdoZXJlIHRoZSBwdGhyZWFkIGxpYnJhcnkgaXMgYXZhaWxhYmxlLgorQWZ0ZXIgI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiLCB5b3UgY2FuIGNoZWNrIHRoZSBHVEVTVF9JU19USFJFQURTQUZFCittYWNybyB0byBzZWUgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlICh5ZXMgaWYgdGhlIG1hY3JvIGlzICNkZWZpbmVkIHRvCisxLCBubyBpZiBpdCdzIHVuZGVmaW5lZC4pLgorCitJZiBHb29nbGUgVGVzdCBkb2Vzbid0IGNvcnJlY3RseSBkZXRlY3Qgd2hldGhlciBwdGhyZWFkIGlzIGF2YWlsYWJsZQoraW4geW91ciBlbnZpcm9ubWVudCwgeW91IGNhbiBmb3JjZSBpdCB3aXRoCisKKyAgLURHVEVTVF9IQVNfUFRIUkVBRD0xCisKK29yCisKKyAgLURHVEVTVF9IQVNfUFRIUkVBRD0wCisKK1doZW4gR29vZ2xlIFRlc3QgdXNlcyBwdGhyZWFkLCB5b3UgbWF5IG5lZWQgdG8gYWRkIGZsYWdzIHRvIHlvdXIKK2NvbXBpbGVyIGFuZC9vciBsaW5rZXIgdG8gc2VsZWN0IHRoZSBwdGhyZWFkIGxpYnJhcnksIG9yIHlvdSdsbCBnZXQKK2xpbmsgZXJyb3JzLiAgSWYgeW91IHVzZSB0aGUgQ01ha2Ugc2NyaXB0IG9yIHRoZSBkZXByZWNhdGVkIEF1dG90b29scworc2NyaXB0LCB0aGlzIGlzIHRha2VuIGNhcmUgb2YgZm9yIHlvdS4gIElmIHlvdSB1c2UgeW91ciBvd24gYnVpbGQKK3NjcmlwdCwgeW91J2xsIG5lZWQgdG8gcmVhZCB5b3VyIGNvbXBpbGVyIGFuZCBsaW5rZXIncyBtYW51YWwgdG8KK2ZpZ3VyZSBvdXQgd2hhdCBmbGFncyB0byBhZGQuCisKKyMjIyBBcyBhIFNoYXJlZCBMaWJyYXJ5IChETEwpICMjIworCitHb29nbGUgVGVzdCBpcyBjb21wYWN0LCBzbyBtb3N0IHVzZXJzIGNhbiBidWlsZCBhbmQgbGluayBpdCBhcyBhCitzdGF0aWMgbGlicmFyeSBmb3IgdGhlIHNpbXBsaWNpdHkuICBZb3UgY2FuIGNob29zZSB0byB1c2UgR29vZ2xlIFRlc3QKK2FzIGEgc2hhcmVkIGxpYnJhcnkgKGtub3duIGFzIGEgRExMIG9uIFdpbmRvd3MpIGlmIHlvdSBwcmVmZXIuCisKK1RvIGNvbXBpbGUgKmd0ZXN0KiBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBhZGQKKworICAtREdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWT0xCisKK3RvIHRoZSBjb21waWxlciBmbGFncy4gIFlvdSdsbCBhbHNvIG5lZWQgdG8gdGVsbCB0aGUgbGlua2VyIHRvIHByb2R1Y2UKK2Egc2hhcmVkIGxpYnJhcnkgaW5zdGVhZCAtIGNvbnN1bHQgeW91ciBsaW5rZXIncyBtYW51YWwgZm9yIGhvdyB0byBkbworaXQuCisKK1RvIGNvbXBpbGUgeW91ciAqdGVzdHMqIHRoYXQgdXNlIHRoZSBndGVzdCBzaGFyZWQgbGlicmFyeSwgYWRkCisKKyAgLURHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MuCisKK05vdGU6IHdoaWxlIHRoZSBhYm92ZSBzdGVwcyBhcmVuJ3QgdGVjaG5pY2FsbHkgbmVjZXNzYXJ5IHRvZGF5IHdoZW4KK3VzaW5nIHNvbWUgY29tcGlsZXJzIChlLmcuIEdDQyksIHRoZXkgbWF5IGJlY29tZSBuZWNlc3NhcnkgaW4gdGhlCitmdXR1cmUsIGlmIHdlIGRlY2lkZSB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBsb2FkaW5nIHRoZSBsaWJyYXJ5IChzZWUKK2h0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIGRldGFpbHMpLiAgVGhlcmVmb3JlIHlvdSBhcmUKK3JlY29tbWVuZGVkIHRvIGFsd2F5cyBhZGQgdGhlIGFib3ZlIGZsYWdzIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYQorc2hhcmVkIGxpYnJhcnkuICBPdGhlcndpc2UgYSBmdXR1cmUgcmVsZWFzZSBvZiBHb29nbGUgVGVzdCBtYXkgYnJlYWsKK3lvdXIgYnVpbGQgc2NyaXB0LgorCisjIyMgQXZvaWRpbmcgTWFjcm8gTmFtZSBDbGFzaGVzICMjIworCitJbiBDKyssIG1hY3JvcyBkb24ndCBvYmV5IG5hbWVzcGFjZXMuICBUaGVyZWZvcmUgdHdvIGxpYnJhcmllcyB0aGF0Citib3RoIGRlZmluZSBhIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgd2lsbCBjbGFzaCBpZiB5b3UgI2luY2x1ZGUgYm90aAorZGVmaW5pdGlvbnMuICBJbiBjYXNlIGEgR29vZ2xlIFRlc3QgbWFjcm8gY2xhc2hlcyB3aXRoIGFub3RoZXIKK2xpYnJhcnksIHlvdSBjYW4gZm9yY2UgR29vZ2xlIFRlc3QgdG8gcmVuYW1lIGl0cyBtYWNybyB0byBhdm9pZCB0aGUKK2NvbmZsaWN0LgorCitTcGVjaWZpY2FsbHksIGlmIGJvdGggR29vZ2xlIFRlc3QgYW5kIHNvbWUgb3RoZXIgY29kZSBkZWZpbmUgbWFjcm8KK0ZPTywgeW91IGNhbiBhZGQKKworICAtREdURVNUX0RPTlRfREVGSU5FX0ZPTz0xCisKK3RvIHRoZSBjb21waWxlciBmbGFncyB0byB0ZWxsIEdvb2dsZSBUZXN0IHRvIGNoYW5nZSB0aGUgbWFjcm8ncyBuYW1lCitmcm9tIEZPTyB0byBHVEVTVF9GT08uICBDdXJyZW50bHkgRk9PIGNhbiBiZSBGQUlMLCBTVUNDRUVELCBvciBURVNULgorRm9yIGV4YW1wbGUsIHdpdGggLURHVEVTVF9ET05UX0RFRklORV9URVNUPTEsIHlvdSdsbCBuZWVkIHRvIHdyaXRlCisKKyAgR1RFU1RfVEVTVChTb21lVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KKworaW5zdGVhZCBvZgorCisgIFRFU1QoU29tZVRlc3QsIERvZXNUaGlzKSB7IC4uLiB9CisKK2luIG9yZGVyIHRvIGRlZmluZSBhIHRlc3QuCisKK1VwZ3JhdGluZyBmcm9tIGFuIEVhcmxpZXIgVmVyc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHN0cml2ZSB0byBrZWVwIEdvb2dsZSBUZXN0IHJlbGVhc2VzIGJhY2t3YXJkIGNvbXBhdGlibGUuCitTb21ldGltZXMsIHRob3VnaCwgd2UgaGF2ZSB0byBtYWtlIHNvbWUgYnJlYWtpbmcgY2hhbmdlcyBmb3IgdGhlCit1c2VycycgbG9uZy10ZXJtIGJlbmVmaXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB3aGF0IHlvdSdsbCBuZWVkIHRvCitkbyBpZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBHb29nbGUgVGVzdC4KKworIyMjIFVwZ3JhZGluZyBmcm9tIDEuMy4wIG9yIEVhcmxpZXIgIyMjCisKK1lvdSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IGVuYWJsZSBvciBkaXNhYmxlIEdvb2dsZSBUZXN0J3Mgb3duIFRSMQordHVwbGUgbGlicmFyeS4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHNlY3Rpb24gIkNob29zaW5nIGEgVFIxIFR1cGxlCitMaWJyYXJ5Ii4KKworIyMjIFVwZ3JhZGluZyBmcm9tIDEuNC4wIG9yIEVhcmxpZXIgIyMjCisKK1RoZSBBdXRvdG9vbHMgYnVpbGQgc2NyaXB0IChjb25maWd1cmUgKyBtYWtlKSBpcyBubyBsb25nZXIgb2ZmaWNpYWxseQorc3VwcG9ydHRlZC4gIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHlvdXIgb3duIGJ1aWxkIHN5c3RlbSBvcgordXNlIENNYWtlLiAgSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIEF1dG90b29scywgeW91IGNhbiBmaW5kCitpbnN0cnVjdGlvbnMgaW4gdGhlIFJFQURNRSBmaWxlIGZyb20gR29vZ2xlIFRlc3QgMS40LjAuCisKK09uIHBsYXRmb3JtcyB3aGVyZSB0aGUgcHRocmVhZCBsaWJyYXJ5IGlzIGF2YWlsYWJsZSwgR29vZ2xlIFRlc3QgdXNlcworaXQgaW4gb3JkZXIgdG8gYmUgdGhyZWFkLXNhZmUuICBTZWUgdGhlICJNdWx0aS10aHJlYWRlZCBUZXN0cyIgc2VjdGlvbgorZm9yIHdoYXQgdGhpcyBtZWFucyB0byB5b3VyIGJ1aWxkIHNjcmlwdC4KKworSWYgeW91IHVzZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLCBHb29nbGUKK1Rlc3Qgd2lsbCBubyBsb25nZXIgY29tcGlsZS4gIFRoaXMgc2hvdWxkIGFmZmVjdCB2ZXJ5IGZldyBwZW9wbGUsIGFzIGEKK2xhcmdlIHBvcnRpb24gb2YgU1RMIChpbmNsdWRpbmcgPHN0cmluZz4pIGRvZXNuJ3QgY29tcGlsZSBpbiB0aGlzIG1vZGUKK2FueXdheS4gIFdlIGRlY2lkZWQgdG8gc3RvcCBzdXBwb3J0aW5nIGl0IGluIG9yZGVyIHRvIGdyZWF0bHkgc2ltcGxpZnkKK0dvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb24uCisKK0RldmVsb3BpbmcgR29vZ2xlIFRlc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGRpc2N1c3NlcyBob3cgdG8gbWFrZSB5b3VyIG93biBjaGFuZ2VzIHRvIEdvb2dsZSBUZXN0LgorCisjIyMgVGVzdGluZyBHb29nbGUgVGVzdCBJdHNlbGYgIyMjCisKK1RvIG1ha2Ugc3VyZSB5b3VyIGNoYW5nZXMgd29yayBhcyBpbnRlbmRlZCBhbmQgZG9uJ3QgYnJlYWsgZXhpc3RpbmcKK2Z1bmN0aW9uYWxpdHksIHlvdSdsbCB3YW50IHRvIGNvbXBpbGUgYW5kIHJ1biBHb29nbGUgVGVzdCdzIG93biB0ZXN0cy4KK0ZvciB0aGF0IHlvdSBjYW4gdXNlIENNYWtlOgorCisgIG1rZGlyIG15YnVpbGQKKyAgY2QgbXlidWlsZAorICBjbWFrZSAtRGd0ZXN0X2J1aWxkX3Rlc3RzPU9OICR7R1RFU1RfRElSfQorCitNYWtlIHN1cmUgeW91IGhhdmUgUHl0aG9uIGluc3RhbGxlZCwgYXMgc29tZSBvZiBHb29nbGUgVGVzdCdzIHRlc3RzCithcmUgd3JpdHRlbiBpbiBQeXRob24uICBJZiB0aGUgY21ha2UgY29tbWFuZCBjb21wbGFpbnMgYWJvdXQgbm90IGJlaW5nCithYmxlIHRvIGZpbmQgUHl0aG9uICgiQ291bGQgTk9UIGZpbmQgUHl0aG9uSW50ZXJwIChtaXNzaW5nOgorUFlUSE9OX0VYRUNVVEFCTEUpIiksIHRyeSB0ZWxsaW5nIGl0IGV4cGxpY2l0bHkgd2hlcmUgeW91ciBQeXRob24KK2V4ZWN1dGFibGUgY2FuIGJlIGZvdW5kOgorCisgIGNtYWtlIC1EUFlUSE9OX0VYRUNVVEFCTEU9cGF0aC90by9weXRob24gLURndGVzdF9idWlsZF90ZXN0cz1PTiAke0dURVNUX0RJUn0KKworTmV4dCwgeW91IGNhbiBidWlsZCBHb29nbGUgVGVzdCBhbmQgYWxsIG9mIGl0cyBvd24gdGVzdHMuICBPbiAqbml4LAordGhpcyBpcyB1c3VhbGx5IGRvbmUgYnkgJ21ha2UnLiAgVG8gcnVuIHRoZSB0ZXN0cywgZG8KKworICBtYWtlIHRlc3QKKworQWxsIHRlc3RzIHNob3VsZCBwYXNzLgorCisjIyMgUmVnZW5lcmF0aW5nIFNvdXJjZSBGaWxlcyAjIyMKKworU29tZSBvZiBHb29nbGUgVGVzdCdzIHNvdXJjZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGVzIChub3QKK2luIHRoZSBDKysgc2Vuc2UpIHVzaW5nIGEgc2NyaXB0LiAgQSB0ZW1wbGF0ZSBmaWxlIGlzIG5hbWVkIEZPTy5wdW1wLAord2hlcmUgRk9PIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGl0IHdpbGwgZ2VuZXJhdGUuICBGb3IgZXhhbXBsZSwgdGhlCitmaWxlIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcCBpcyB1c2VkIHRvIGdlbmVyYXRlCitndGVzdC10eXBlLXV0aWwuaCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisKK05vcm1hbGx5IHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlZ2VuZXJhdGluZyB0aGUgc291cmNlIGZpbGVzLAordW5sZXNzIHlvdSBuZWVkIHRvIG1vZGlmeSB0aGVtLiAgSW4gdGhhdCBjYXNlLCB5b3Ugc2hvdWxkIG1vZGlmeSB0aGUKK2NvcnJlc3BvbmRpbmcgLnB1bXAgZmlsZXMgaW5zdGVhZCBhbmQgcnVuIHRoZSBwdW1wLnB5IFB5dGhvbiBzY3JpcHQgdG8KK3JlZ2VuZXJhdGUgdGhlbS4gIFlvdSBjYW4gZmluZCBwdW1wLnB5IGluIHRoZSBzY3JpcHRzLyBkaXJlY3RvcnkuCitSZWFkIHRoZSBQdW1wIG1hbnVhbCBbMl0gZm9yIGhvdyB0byB1c2UgaXQuCisKKyAgWzJdIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvUHVtcE1hbnVhbAorCisjIyMgQ29udHJpYnV0aW5nIGEgUGF0Y2ggIyMjCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4gIFBsZWFzZSByZWFkIHRoZSBHb29nbGUgVGVzdCBkZXZlbG9wZXIncyBndWlkZSBbM10KK2ZvciBob3cgeW91IGNhbiBjb250cmlidXRlLiAgSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHlvdSBoYXZlIHNpZ25lZAordGhlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50LCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIGFjY2VwdCB0aGUKK3BhdGNoLgorCisgIFszXSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3REZXZHdWlkZQorCitIYXBweSB0ZXN0aW5nIQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9hY2xvY2FsLm00IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZGY5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2FjbG9jYWwubTQKQEAgLTAsMCArMSwxMTk4IEBACisjIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMS4zIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCisjIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK200X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCisgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKK200X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNjhdLCwKK1ttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42OC4KK1lvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIEl0IG1heSB3b3JrLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8uCitJZiB5b3UgaGF2ZSBwcm9ibGVtcywgeW91IG1heSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS4KK1RvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgYGF1dG9yZWNvbmYnLl0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTEgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMQorCisjIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KKyMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCisjIChUaGlzIHByaXZhdGUgbWFjcm8gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGlzIGZpbGUuKQorQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLAorW2FtX19hcGlfdmVyc2lvbj0nMS4xMScKK2RubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KK2RubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCittNF9pZihbJDFdLCBbMS4xMS4zXSwgW10sCisgICAgICBbQUNfRkFUQUwoW0RvIG5vdCBjYWxsICQwLCB1c2UgQU1fSU5JVF9BVVRPTUFLRShbJDFdKS5dKV0pZG5sCitdKQorCisjIF9BTV9BVVRPQ09ORl9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGFjbG9jYWwgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZmluZCB0aGUgQXV0b2NvbmYgdmVyc2lvbi4KKyMgVGhpcyBpcyBhIHByaXZhdGUgbWFjcm8gdG9vLiAgVXNpbmcgbTRfZGVmaW5lIHNpbXBsaWZpZXMKKyMgdGhlIGxvZ2ljIGluIGFjbG9jYWwsIHdoaWNoIGNhbiBzaW1wbHkgaWdub3JlIHRoaXMgZGVmaW5pdGlvbi4KK200X2RlZmluZShbX0FNX0FVVE9DT05GX1ZFUlNJT05dLCBbXSkKKworIyBBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIHRoZXkgY2FuIGJlIHRyYWNlZC4KKyMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBTV9JTklUX0FVVE9NQUtFLgorQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAorW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTEuM10pZG5sCittNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAorICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCitfQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSkpXSkKKworIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxCisKKyMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cworIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bworIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgorIworIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCisjIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCisjIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAorIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKKyMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKKyMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCisjIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCisjCisjICRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQorIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAorIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAorIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCisjCisjIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCisjIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5CisjIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQorIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgorIworIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKKyMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6CisjICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCisjIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcworIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQorIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgorIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCisjIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KKyMKKyMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCisjIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKKyMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgorCitBQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAorW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCitBQ19QUkVSRVEoWzIuNTBdKWRubAorIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorXSkKKworIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA5CisKKyMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBhIGNvbmRpdGlvbmFsLgorQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKK1tBQ19QUkVSRVEoMi41MilkbmwKKyBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAorCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKK0FDX1NVQlNUKFskMV9UUlVFXSlkbmwKK0FDX1NVQlNUKFskMV9GQUxTRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAorbTRfZGVmaW5lKFtfQU1fQ09ORF9WQUxVRV8kMV0sIFskMl0pZG5sCitpZiAkMjsgdGhlbgorICAkMV9UUlVFPQorICAkMV9GQUxTRT0nIycKK2Vsc2UKKyAgJDFfVFJVRT0nIycKKyAgJDFfRkFMU0U9CitmaQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKK1tpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQorZmldKV0pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA5LAorIyAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEyCisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgorIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgorIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgorIworIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKKyMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKKyMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAorIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KK0FDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKK0FDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKK0FDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCitBQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAorCitpZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKKworQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKKyAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCitbaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKKyAgZmkKKyAgYW1fX3VuaXZlcnNhbD1mYWxzZQorICBtNF9jYXNlKFskMV0sIFtDQ10sCisgICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjXSwKKyAgICBbQ1hYXSwKKyAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCisgICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7CisgICAgIGVzYWNdKQorCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgZ2NjKQorICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KKyAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCisgICAgICA7OworICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorXSkKK0FDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQorQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKK10pCisKKworIyBBTV9TRVRfREVQRElSCisjIC0tLS0tLS0tLS0tLS0KKyMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCisjIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUworQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCitBQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCitdKQorCisKKyMgQU1fREVQX1RSQUNLCisjIC0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sCitbQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAorWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAorICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKKyAgQU1ERVBCQUNLU0xBU0g9J1wnCisgIGFtX19ub2RlcD0nX25vJworZmkKK0FNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQorQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCitBQ19TVUJTVChbYW1fX25vZGVwXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFthbV9fbm9kZXBdKWRubAorXSkKKworIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjc2VyaWFsIDUKKworIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1t7CisgICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCisgICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKKyAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCisgIGNhc2UgJENPTkZJR19GSUxFUyBpbgorICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OworICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKKyAgZXNhYworICBzaGlmdAorICBmb3IgbWYKKyAgZG8KKyAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCisgICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0CisgICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCisgICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCisgICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCisgICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQorICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgorICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0CisgICAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKKyAgICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAgICMgZXhwYW5zaW9uLgorICAgIGZvciBmaWxlIGluIGBzZWQgLW4gIgorICAgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisJIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbworICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKKyAgICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKKyAgICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKKyAgICBkb25lCisgIGRvbmUKK30KK10pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKworCisjIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KKyMKKyMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZworIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCisjIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCitBQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAorICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKKyAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQorXSkKKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyMgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxNgorCisjIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgorIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorCisjIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCisjIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKKyMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQorIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KKyMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KKyMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCisjIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCisjIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKKyMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KK0FDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKK1tBQ19QUkVSRVEoWzIuNjJdKWRubAorZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKK2RubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgorbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCisgICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0CisgICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKKyAgQUNfU1VCU1QoW2FtX19pc3JjXSwgWycgLUkkKHNyY2RpciknXSlfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKWRubAorICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCisgIGZpCitmaQorCisjIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKK2lmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCisgIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKKyAgZWxzZQorICAgIENZR1BBVEhfVz1lY2hvCisgIGZpCitmaQorQUNfU1VCU1QoW0NZR1BBVEhfV10pCisKKyMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KK2RubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgorbTRfaWZ2YWwoWyQyXSwKK1ttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKKyBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCisgQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCitbX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCitkbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KK200X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAorICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKKworX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCitbQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQorIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKK0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAorQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCisJICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCisJCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCitfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKKwkJCSAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCisJCQkgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfT0JKQ10sCisJCQkgIGRlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldKV0pZG5sCitdKQorX0FNX0lGX09QVElPTihbc2lsZW50LXJ1bGVzXSwgW0FDX1JFUVVJUkUoW0FNX1NJTEVOVF9SVUxFU10pXSlkbmwKK2RubCBUaGUgYHBhcmFsbGVsLXRlc3RzJyBkcml2ZXIgbWF5IG5lZWQgdG8ga25vdyBhYm91dCBFWEVFWFQsIHNvIGFkZCB0aGUKK2RubCBgYW1fX0VYRUVYVCcgY29uZGl0aW9uYWwgaWYgX0FNX0NPTVBJTEVSX0VYRUVYVCB3YXMgc2Vlbi4gIFRoaXMgbWFjcm8KK2RubCBpcyBob29rZWQgb250byBfQUNfQ09NUElMRVJfRVhFRVhUIGVhcmx5LCBzZWUgYmVsb3cuCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKGRubAorW200X3Byb3ZpZGVfaWYoW19BTV9DT01QSUxFUl9FWEVFWFRdLAorICBbQU1fQ09ORElUSU9OQUwoW2FtX19FWEVFWFRdLCBbdGVzdCAtbiAiJEVYRUVYVCJdKV0pXSlkbmwKK10pCisKK2RubCBIb29rIGludG8gYF9BQ19DT01QSUxFUl9FWEVFWFQnIGVhcmx5IHRvIGxlYXJuIGl0cyBleHBhbnNpb24uICBEbyBub3QKK2RubCBhZGQgdGhlIGNvbmRpdGlvbmFsIHJpZ2h0IGhlcmUsIGFzIF9BQ19DT01QSUxFUl9FWEVFWFQgbWF5IGJlIGZ1cnRoZXIKK2RubCBtYW5nbGVkIGJ5IEF1dG9jb25mIGFuZCBydW4gaW4gYSBzaGVsbCBjb25kaXRpb25hbCBzdGF0ZW1lbnQuCittNF9kZWZpbmUoW19BQ19DT01QSUxFUl9FWEVFWFRdLAorbTRfZGVmbihbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW200X3Byb3ZpZGUoW19BTV9DT01QSUxFUl9FWEVFWFRdKV0pCisKKworIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKKyMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgorCisjIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCisjIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKKyMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgorQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAorWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9JDEKK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBBTV9QUk9HX0lOU1RBTExfU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSAkaW5zdGFsbF9zaC4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK2lmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKKyAgKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKKyAgZXNhYworZmkKK0FDX1NVQlNUKGluc3RhbGxfc2gpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcworIyB3aXRoIGEgbGVhZGluZyBkb3QuICBGb3IgaW5zdGFuY2UgTVMtRE9TIGRvZXNuJ3QuCitBQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwKK1tybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKKworIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKK0FDX1NVQlNUKFthbV9fcXVvdGVdKQorQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQorcm0gLWYgY29uZmluYyBjb25mbWYKK10pCisKKyMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNgorCisjIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAorW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCiskMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KK0FDX1NVQlNUKCQxKV0pCisKKworIyBBTV9NSVNTSU5HX0hBU19SVU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KKyMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgorQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAorQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCitpZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7CisgICopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7CisgIGVzYWMKK2ZpCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQorZmkKK10pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBBTV9QUk9HX01LRElSX1AKKyMgLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBgbWtkaXIgLXAnLgorQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sCitbQUNfUFJFUkVRKFsyLjYwXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCitkbmwgQXV0b21ha2UgMS44IHRvIDEuOS42IHVzZWQgdG8gZGVmaW5lIG1rZGlyX3AuICBXZSBub3cgdXNlIE1LRElSX1AsCitkbmwgd2hpbGUga2VlcGluZyBhIGRlZmluaXRpb24gb2YgbWtkaXJfcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK2RubCBATUtESVJfUEAgaXMgbWFnaWM6IEFDX09VVFBVVCBhZGp1c3RzIGl0cyB2YWx1ZSBmb3IgZWFjaCBNYWtlZmlsZS4KK2RubCBIb3dldmVyIHdlIGNhbm5vdCBkZWZpbmUgbWtkaXJfcCBhcyAkKE1LRElSX1ApIGZvciB0aGUgc2FrZSBvZgorZG5sIE1ha2VmaWxlLmlucyB0aGF0IGRvIG5vdCBkZWZpbmUgTUtESVJfUCwgc28gd2UgZG8gb3VyIG93bgorZG5sIGFkanVzdG1lbnQgdXNpbmcgdG9wX2J1aWxkZGlyICh3aGljaCBpcyBkZWZpbmVkIG1vcmUgb2Z0ZW4gdGhhbgorZG5sIE1LRElSX1ApLgorQUNfU1VCU1QoW21rZGlyX3BdLCBbIiRNS0RJUl9QIl0pZG5sCitjYXNlICRta2Rpcl9wIGluCisgIFtbXFwvJF1dKiB8ID86W1tcXC9dXSopIDs7CisgICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKK2VzYWMKK10pCisKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDgsIDIwMTAgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAorW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKyMgX0FNX1NFVF9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IG9wdGlvbiBOQU1FLiAgUHJlc2VudGx5IHRoYXQgb25seSBtZWFucyBkZWZpbmluZyBhIGZsYWcgZm9yIHRoaXMgb3B0aW9uLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIDEpXSkKKworIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCitbbTRfZm9yZWFjaF93KFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQorCisjIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK0FDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKK1ttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOCwgMjAwOSwKKyMgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgQU1fUEFUSF9QWVRIT04oW01JTklNVU0tVkVSU0lPTl0sIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRzIHN1cHBvcnQgZm9yIGRpc3RyaWJ1dGluZyBQeXRob24gbW9kdWxlcyBhbmQgcGFja2FnZXMuICBUbworIyBpbnN0YWxsIG1vZHVsZXMsIGNvcHkgdGhlbSB0byAkKHB5dGhvbmRpciksIHVzaW5nIHRoZSBweXRob25fUFlUSE9OCisjIGF1dG9tYWtlIHZhcmlhYmxlLiAgVG8gaW5zdGFsbCBhIHBhY2thZ2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZQorIyBhdXRvbWFrZSBwYWNrYWdlLCBpbnN0YWxsIHRvICQocGtncHl0aG9uZGlyKSwgb3IgdXNlIHRoZQorIyBwa2dweXRob25fUFlUSE9OIGF1dG9tYWtlIHZhcmlhYmxlLgorIworIyBUaGUgdmFyaWFibGVzICQocHlleGVjZGlyKSBhbmQgJChwa2dweWV4ZWNkaXIpIGFyZSBwcm92aWRlZCBhcworIyBsb2NhdGlvbnMgdG8gaW5zdGFsbCBweXRob24gZXh0ZW5zaW9uIG1vZHVsZXMgKHNoYXJlZCBsaWJyYXJpZXMpLgorIyBBbm90aGVyIG1hY3JvIGlzIHJlcXVpcmVkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIHRvIGNvbXBpbGUKKyMgZXh0ZW5zaW9uIG1vZHVsZXMuCisjCisjIElmIHlvdXIgcGFja2FnZSBpcyBjb25maWd1cmVkIHdpdGggYSBkaWZmZXJlbnQgcHJlZml4IHRvIHB5dGhvbiwKKyMgdXNlcnMgd2lsbCBoYXZlIHRvIGFkZCB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgdG8gdGhlIFBZVEhPTlBBVEgKKyMgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGNyZWF0ZSBhIC5wdGggZmlsZSAoc2VlIHRoZSBweXRob24KKyMgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscykuCisjCisjIElmIHRoZSBNSU5JTVVNLVZFUlNJT04gYXJndW1lbnQgaXMgcGFzc2VkLCBBTV9QQVRIX1BZVEhPTiB3aWxsCisjIGNhdXNlIGFuIGVycm9yIGlmIHRoZSB2ZXJzaW9uIG9mIHB5dGhvbiBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbQorIyBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVtZW50LiAgTUlOSU1VTS1WRVJTSU9OIHNob3VsZCBjb25zaXN0IG9mCisjIG51bWJlcnMgYW5kIGRvdHMgb25seS4KK0FDX0RFRlVOKFtBTV9QQVRIX1BZVEhPTl0sCisgWworICBkbmwgRmluZCBhIFB5dGhvbiBpbnRlcnByZXRlci4gIFB5dGhvbiB2ZXJzaW9ucyBwcmlvciB0byAyLjAgYXJlIG5vdAorICBkbmwgc3VwcG9ydGVkLiAoMi4wIHdhcyByZWxlYXNlZCBvbiBPY3RvYmVyIDE2LCAyMDAwKS4KKyAgbTRfZGVmaW5lX2RlZmF1bHQoW19BTV9QWVRIT05fSU5URVJQUkVURVJfTElTVF0sCitbcHl0aG9uIHB5dGhvbjIgcHl0aG9uMyBweXRob24zLjIgcHl0aG9uMy4xIHB5dGhvbjMuMCBweXRob24yLjcgZG5sCisgcHl0aG9uMi42IHB5dGhvbjIuNSBweXRob24yLjQgcHl0aG9uMi4zIHB5dGhvbjIuMiBweXRob24yLjEgcHl0aG9uMi4wXSkKKworICBBQ19BUkdfVkFSKFtQWVRIT05dLCBbdGhlIFB5dGhvbiBpbnRlcnByZXRlcl0pCisKKyAgbTRfaWYoWyQxXSxbXSxbCisgICAgZG5sIE5vIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLgorICAgICMgRmluZCBhbnkgUHl0aG9uIGludGVycHJldGVyLgorICAgIGlmIHRlc3QgLXogIiRQWVRIT04iOyB0aGVuCisgICAgICBBQ19QQVRIX1BST0dTKFtQWVRIT05dLCBfQU1fUFlUSE9OX0lOVEVSUFJFVEVSX0xJU1QsIDopCisgICAgZmkKKyAgICBhbV9kaXNwbGF5X1BZVEhPTj1weXRob24KKyAgXSwgWworICAgIGRubCBBIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLgorICAgIGlmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCisgICAgICAjIElmIHRoZSB1c2VyIHNldCAkUFlUSE9OLCB1c2UgaXQgYW5kIGRvbid0IHNlYXJjaCBzb21ldGhpbmcgZWxzZS4KKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAkUFlUSE9OIHZlcnNpb24gPj0gJDFdKQorICAgICAgQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oWyRQWVRIT05dLCBbJDFdLAorCQkJICAgICAgW0FDX01TR19SRVNVTFQoeWVzKV0sCisJCQkgICAgICBbQUNfTVNHX0VSUk9SKHRvbyBvbGQpXSkKKyAgICAgIGFtX2Rpc3BsYXlfUFlUSE9OPSRQWVRIT04KKyAgICBlbHNlCisgICAgICAjIE90aGVyd2lzZSwgdHJ5IGVhY2ggaW50ZXJwcmV0ZXIgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBzYXRpc2ZpZXMKKyAgICAgICMgVkVSU0lPTi4KKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgYSBQeXRob24gaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uID49ICQxXSwKKwlbYW1fY3ZfcGF0aGxlc3NfUFlUSE9OXSxbCisJZm9yIGFtX2N2X3BhdGhsZXNzX1BZVEhPTiBpbiBfQU1fUFlUSE9OX0lOVEVSUFJFVEVSX0xJU1Qgbm9uZTsgZG8KKwkgIHRlc3QgIiRhbV9jdl9wYXRobGVzc19QWVRIT04iID0gbm9uZSAmJiBicmVhaworCSAgQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oWyRhbV9jdl9wYXRobGVzc19QWVRIT05dLCBbJDFdLCBbYnJlYWtdKQorCWRvbmVdKQorICAgICAgIyBTZXQgJFBZVEhPTiB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiAkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OLgorICAgICAgaWYgdGVzdCAiJGFtX2N2X3BhdGhsZXNzX1BZVEhPTiIgPSBub25lOyB0aGVuCisJUFlUSE9OPToKKyAgICAgIGVsc2UKKyAgICAgICAgQUNfUEFUSF9QUk9HKFtQWVRIT05dLCBbJGFtX2N2X3BhdGhsZXNzX1BZVEhPTl0pCisgICAgICBmaQorICAgICAgYW1fZGlzcGxheV9QWVRIT049JGFtX2N2X3BhdGhsZXNzX1BZVEhPTgorICAgIGZpCisgIF0pCisKKyAgaWYgdGVzdCAiJFBZVEhPTiIgPSA6OyB0aGVuCisgIGRubCBSdW4gYW55IHVzZXItc3BlY2lmaWVkIGFjdGlvbiwgb3IgYWJvcnQuCisgICAgbTRfZGVmYXVsdChbJDNdLCBbQUNfTVNHX0VSUk9SKFtubyBzdWl0YWJsZSBQeXRob24gaW50ZXJwcmV0ZXIgZm91bmRdKV0pCisgIGVsc2UKKworICBkbmwgUXVlcnkgUHl0aG9uIGZvciBpdHMgdmVyc2lvbiBudW1iZXIuICBHZXR0aW5nIFs6M10gc2VlbXMgdG8gYmUKKyAgZG5sIHRoZSBiZXN0IHdheSB0byBkbyB0aGlzOyBpdCdzIHdoYXQgInNpdGUucHkiIGRvZXMgaW4gdGhlIHN0YW5kYXJkCisgIGRubCBsaWJyYXJ5LgorCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHZlcnNpb25dLCBbYW1fY3ZfcHl0aG9uX3ZlcnNpb25dLAorICAgIFthbV9jdl9weXRob25fdmVyc2lvbj1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZShzeXMudmVyc2lvbltbOjNdXSkiYF0pCisgIEFDX1NVQlNUKFtQWVRIT05fVkVSU0lPTl0sIFskYW1fY3ZfcHl0aG9uX3ZlcnNpb25dKQorCisgIGRubCBVc2UgdGhlIHZhbHVlcyBvZiAkcHJlZml4IGFuZCAkZXhlY19wcmVmaXggZm9yIHRoZSBjb3JyZXNwb25kaW5nCisgIGRubCB2YWx1ZXMgb2YgUFlUSE9OX1BSRUZJWCBhbmQgUFlUSE9OX0VYRUNfUFJFRklYLiAgVGhlc2UgYXJlIG1hZGUKKyAgZG5sIGRpc3RpbmN0IHZhcmlhYmxlcyBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWQgYmUuICBIb3dldmVyLAorICBkbmwgZ2VuZXJhbCBjb25zZW5zdXMgaXMgdGhhdCB5b3Ugc2hvdWxkbid0IG5lZWQgdGhpcyBhYmlsaXR5LgorCisgIEFDX1NVQlNUKFtQWVRIT05fUFJFRklYXSwgWycke3ByZWZpeH0nXSkKKyAgQUNfU1VCU1QoW1BZVEhPTl9FWEVDX1BSRUZJWF0sIFsnJHtleGVjX3ByZWZpeH0nXSkKKworICBkbmwgQXQgdGltZXMgKGxpa2Ugd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzKSB5b3UgbWF5IHdhbnQKKyAgZG5sIHRvIGtub3cgd2hpY2ggT1MgcGxhdGZvcm0gUHl0aG9uIHRoaW5rcyB0aGlzIGlzLgorCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHBsYXRmb3JtXSwgW2FtX2N2X3B5dGhvbl9wbGF0Zm9ybV0sCisgICAgW2FtX2N2X3B5dGhvbl9wbGF0Zm9ybT1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZShzeXMucGxhdGZvcm0pImBdKQorICBBQ19TVUJTVChbUFlUSE9OX1BMQVRGT1JNXSwgWyRhbV9jdl9weXRob25fcGxhdGZvcm1dKQorCisKKyAgZG5sIFNldCB1cCA0IGRpcmVjdG9yaWVzOgorCisgIGRubCBweXRob25kaXIgLS0gd2hlcmUgdG8gaW5zdGFsbCBweXRob24gc2NyaXB0cy4gIFRoaXMgaXMgdGhlCisgIGRubCAgIHNpdGUtcGFja2FnZXMgZGlyZWN0b3J5LCBub3QgdGhlIHB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5CisgIGRubCAgIGRpcmVjdG9yeSBsaWtlIGluIHByZXZpb3VzIGF1dG9tYWtlIGJldGFzLiAgVGhpcyBiZWhhdmlvcgorICBkbmwgICBpcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCBsaXNwZGlyLm00IGZvciBleGFtcGxlLgorICBkbmwgUXVlcnkgZGlzdHV0aWxzIGZvciB0aGlzIGRpcmVjdG9yeS4KKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYW1fZGlzcGxheV9QWVRIT04gc2NyaXB0IGRpcmVjdG9yeV0sCisgICAgW2FtX2N2X3B5dGhvbl9weXRob25kaXJdLAorICAgIFtpZiB0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORQorICAgICB0aGVuCisgICAgICAgYW1fcHlfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorICAgICBlbHNlCisgICAgICAgYW1fcHlfcHJlZml4PSRwcmVmaXgKKyAgICAgZmkKKyAgICAgYW1fY3ZfcHl0aG9uX3B5dGhvbmRpcj1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZzsgc3lzLnN0ZG91dC53cml0ZShzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoMCwwLHByZWZpeD0nJGFtX3B5X3ByZWZpeCcpKSIgMj4vZGV2L251bGxgCisgICAgIGNhc2UgJGFtX2N2X3B5dGhvbl9weXRob25kaXIgaW4KKyAgICAgJGFtX3B5X3ByZWZpeCopCisgICAgICAgYW1fX3N0cmlwX3ByZWZpeD1gZWNobyAiJGFtX3B5X3ByZWZpeCIgfCBzZWQgJ3N8LnwufGcnYAorICAgICAgIGFtX2N2X3B5dGhvbl9weXRob25kaXI9YGVjaG8gIiRhbV9jdl9weXRob25fcHl0aG9uZGlyIiB8IHNlZCAicyxeJGFtX19zdHJpcF9wcmVmaXgsJFBZVEhPTl9QUkVGSVgsImAKKyAgICAgICA7OworICAgICAqKQorICAgICAgIGNhc2UgJGFtX3B5X3ByZWZpeCBpbgorICAgICAgICAgL3VzcnwvU3lzdGVtKikgOzsKKyAgICAgICAgICopCisJICBhbV9jdl9weXRob25fcHl0aG9uZGlyPSRQWVRIT05fUFJFRklYL2xpYi9weXRob24kUFlUSE9OX1ZFUlNJT04vc2l0ZS1wYWNrYWdlcworCSAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgZXNhYworICAgIF0pCisgIEFDX1NVQlNUKFtweXRob25kaXJdLCBbJGFtX2N2X3B5dGhvbl9weXRob25kaXJdKQorCisgIGRubCBwa2dweXRob25kaXIgLS0gJFBBQ0tBR0UgZGlyZWN0b3J5IHVuZGVyIHB5dGhvbmRpci4gIFdhcworICBkbmwgICBQWVRIT05fU0lURV9QQUNLQUdFIGluIHByZXZpb3VzIGJldGFzLCBidXQgdGhpcyBuYW1pbmcgaXMKKyAgZG5sICAgbW9yZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgYXV0b21ha2UuCisKKyAgQUNfU1VCU1QoW3BrZ3B5dGhvbmRpcl0sIFtcJHtweXRob25kaXJ9LyRQQUNLQUdFXSkKKworICBkbmwgcHlleGVjZGlyIC0tIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBweXRob24gZXh0ZW5zaW9uIG1vZHVsZXMKKyAgZG5sICAgKHNoYXJlZCBsaWJyYXJpZXMpCisgIGRubCBRdWVyeSBkaXN0dXRpbHMgZm9yIHRoaXMgZGlyZWN0b3J5LgorICBBQ19DQUNIRV9DSEVDSyhbZm9yICRhbV9kaXNwbGF5X1BZVEhPTiBleHRlbnNpb24gbW9kdWxlIGRpcmVjdG9yeV0sCisgICAgW2FtX2N2X3B5dGhvbl9weWV4ZWNkaXJdLAorICAgIFtpZiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FCisgICAgIHRoZW4KKyAgICAgICBhbV9weV9leGVjX3ByZWZpeD0kYW1fcHlfcHJlZml4CisgICAgIGVsc2UKKyAgICAgICBhbV9weV9leGVjX3ByZWZpeD0kZXhlY19wcmVmaXgKKyAgICAgZmkKKyAgICAgYW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcj1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZzsgc3lzLnN0ZG91dC53cml0ZShzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoMSwwLHByZWZpeD0nJGFtX3B5X2V4ZWNfcHJlZml4JykpIiAyPi9kZXYvbnVsbGAKKyAgICAgY2FzZSAkYW1fY3ZfcHl0aG9uX3B5ZXhlY2RpciBpbgorICAgICAkYW1fcHlfZXhlY19wcmVmaXgqKQorICAgICAgIGFtX19zdHJpcF9wcmVmaXg9YGVjaG8gIiRhbV9weV9leGVjX3ByZWZpeCIgfCBzZWQgJ3N8LnwufGcnYAorICAgICAgIGFtX2N2X3B5dGhvbl9weWV4ZWNkaXI9YGVjaG8gIiRhbV9jdl9weXRob25fcHlleGVjZGlyIiB8IHNlZCAicyxeJGFtX19zdHJpcF9wcmVmaXgsJFBZVEhPTl9FWEVDX1BSRUZJWCwiYAorICAgICAgIDs7CisgICAgICopCisgICAgICAgY2FzZSAkYW1fcHlfZXhlY19wcmVmaXggaW4KKyAgICAgICAgIC91c3J8L1N5c3RlbSopIDs7CisgICAgICAgICAqKQorCSAgIGFtX2N2X3B5dGhvbl9weWV4ZWNkaXI9JFBZVEhPTl9FWEVDX1BSRUZJWC9saWIvcHl0aG9uJFBZVEhPTl9WRVJTSU9OL3NpdGUtcGFja2FnZXMKKwkgICA7OworICAgICAgIGVzYWMKKyAgICAgICA7OworICAgICBlc2FjCisgICAgXSkKKyAgQUNfU1VCU1QoW3B5ZXhlY2Rpcl0sIFskYW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcl0pCisKKyAgZG5sIHBrZ3B5ZXhlY2RpciAtLSAkKHB5ZXhlY2RpcikvJChQQUNLQUdFKQorCisgIEFDX1NVQlNUKFtwa2dweWV4ZWNkaXJdLCBbXCR7cHlleGVjZGlyfS8kUEFDS0FHRV0pCisKKyAgZG5sIFJ1biBhbnkgdXNlci1zcGVjaWZpZWQgYWN0aW9uLgorICAkMgorICBmaQorCitdKQorCisKKyMgQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oUFJPRywgVkVSU0lPTiwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSdW4gQUNUSU9OLUlGLVRSVUUgaWYgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBQUk9HIGhhcyB2ZXJzaW9uID49IFZFUlNJT04uCisjIFJ1biBBQ1RJT04tSUYtRkFMU0Ugb3RoZXJ3aXNlLgorIyBUaGlzIHRlc3QgdXNlcyBzeXMuaGV4dmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBzdHJpbmcgZXF1aXZhbGVudCAoZmlyc3QKKyMgd29yZCBvZiBzeXMudmVyc2lvbiksIGluIG9yZGVyIHRvIGNvcGUgd2l0aCB2ZXJzaW9ucyBzdWNoIGFzIDIuMmMxLgorIyBUaGlzIHN1cHBvcnRzIFB5dGhvbiAyLjAgb3IgaGlnaGVyLiAoMi4wIHdhcyByZWxlYXNlZCBvbiBPY3RvYmVyIDE2LCAyMDAwKS4KK0FDX0RFRlVOKFtBTV9QWVRIT05fQ0hFQ0tfVkVSU0lPTl0sCisgW3Byb2c9ImltcG9ydCBzeXMKKyMgc3BsaXQgc3RyaW5ncyBieSAnLicgYW5kIGNvbnZlcnQgdG8gbnVtZXJpYy4gIEFwcGVuZCBzb21lIHplcm9zCisjIGJlY2F1c2Ugd2UgbmVlZCBhdCBsZWFzdCA0IGRpZ2l0cyBmb3IgdGhlIGhleCBjb252ZXJzaW9uLgorIyBtYXAgcmV0dXJucyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy4wIGFuZCBhIGxpc3QgaW4gMi54CittaW52ZXIgPSBsaXN0KG1hcChpbnQsICckMicuc3BsaXQoJy4nKSkpICsgW1swLCAwLCAwXV0KK21pbnZlcmhleCA9IDAKKyMgeHJhbmdlIGlzIG5vdCBwcmVzZW50IGluIFB5dGhvbiAzLjAgYW5kIHJhbmdlIHJldHVybnMgYW4gaXRlcmF0b3IKK2ZvciBpIGluIGxpc3QocmFuZ2UoMCwgNCkpOiBtaW52ZXJoZXggPSAobWludmVyaGV4IDw8IDgpICsgbWludmVyW1tpXV0KK3N5cy5leGl0KHN5cy5oZXh2ZXJzaW9uIDwgbWludmVyaGV4KSIKKyAgQVNfSUYoW0FNX1JVTl9MT0coWyQxIC1jICIkcHJvZyJdKV0sIFskM10sIFskNF0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMQorCisjIEFNX1JVTl9MT0coQ09NTUFORCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSdW4gQ09NTUFORCwgc2F2ZSB0aGUgZXhpdCBzdGF0dXMgaW4gYWNfc3RhdHVzLCBhbmQgbG9nIGl0LgorIyAoVGhpcyBoYXMgYmVlbiBhZGFwdGVkIGZyb20gQXV0b2NvbmYncyBfQUNfUlVOX0xPRyBtYWNyby4pCitBQ19ERUZVTihbQU1fUlVOX0xPR10sCitbeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJDEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICgkMSkgPiZBU19NRVNTQUdFX0xPR19GRCAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgYWNfc3RhdHVzPSQ/CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgKGV4aXQgJGFjX3N0YXR1cyk7IH1dKQorCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworIyBBTV9TQU5JVFlfQ0hFQ0sKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCisjIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQorIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgorYW1fbGY9JworJworY2FzZSBgcHdkYCBpbgorICAqW1tcXFwiXCNcJFwmXCdcYCRhbV9sZl1dKikKKyAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lXSk7OworZXNhYworY2FzZSAkc3JjZGlyIGluCisgICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXCBcCV1dKikKKyAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBzcmNkaXIgdmFsdWU6IGAkc3JjZGlyJ10pOzsKK2VzYWMKKworIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiRbKl0iICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKKyAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCisgICBmaQorCisgICB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQorZmkKK0FDX01TR19SRVNVTFQoeWVzKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAorIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKKyMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCisjIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKKyMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQorIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCitbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2RubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKK0FDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDMKKworIyBfQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByZXZlbnQgQXV0b21ha2UgZnJvbSBvdXRwdXR0aW5nIFZBUklBQkxFID0gQFZBUklBQkxFQCBpbiBNYWtlZmlsZS5pbi4KKyMgVGhpcyBtYWNybyBpcyB0cmFjZWQgYnkgQXV0b21ha2UuCitBQ19ERUZVTihbX0FNX1NVQlNUX05PVE1BS0VdKQorCisjIEFNX1NVQlNUX05PVE1BS0UoVkFSSUFCTEUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFB1YmxpYyBzaXN0ZXIgb2YgX0FNX1NVQlNUX05PVE1BS0UuCitBQ19ERUZVTihbQU1fU1VCU1RfTk9UTUFLRV0sIFtfQU1fU1VCU1RfTk9UTUFLRSgkQCldKQorCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBfQU1fUFJPR19UQVIoRk9STUFUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgorIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKKyMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKKyMgJHRhcmRpci4KKyMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAorIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgorIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgorQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCitbIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgWWVzLCBpdCdzIHN0aWxsIHVzZWQKKyMgaW4gdGhlIHdpbGQgOi0oICBXZSBzaG91bGQgZmluZCBhIHByb3BlciB3YXkgdG8gZGVwcmVjYXRlIGl0IC4uLgorQUNfU1VCU1QoW0FNVEFSXSwgWyckJHtUQVItdGFyfSddKQorbTRfaWYoWyQxXSwgW3Y3XSwKKyAgICAgW2FtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nXSwKKyAgICAgW200X2Nhc2UoWyQxXSwgW3VzdGFyXSwsIFtwYXhdLCwKKyAgICAgICAgICAgICAgW200X2ZhdGFsKFtVbmtub3duIHRhciBmb3JtYXRdKV0pCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCisjIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCitfYW1fdG9vbHM9J2dudXRhciBtNF9pZihbJDFdLCBbdXN0YXJdLCBbcGxhaW50YXJdKSBwYXggY3BpbyBub25lJworX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KKyMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAorIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgorZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKK2RvCisgIGNhc2UgJF9hbV90b29sIGluCisgIGdudXRhcikKKyAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7CisgICAgZG8KKyAgICAgIEFNX1JVTl9MT0coWyRfYW1fdGFyIC0tdmVyc2lvbl0pICYmIGJyZWFrCisgICAgZG9uZQorICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJworICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0iJF9hbV90YXIgLXhmIC0iCisgICAgOzsKKyAgcGxhaW50YXIpCisgICAgIyBNdXN0IHNraXAgR05VIHRhcjogaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCAtLWZvcm1hdD0gaXQgZG9lc24ndCBjcmVhdGUKKyAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgorICAgICh0YXIgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjEgJiYgY29udGludWUKKyAgICBhbV9fdGFyPSd0YXIgY2hmIC0gIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9J3RhciB4ZiAtJworICAgIDs7CisgIHBheCkKKyAgICBhbV9fdGFyPSdwYXggLUwgLXggJDEgLXcgIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0ncGF4IC1MIC14ICQxIC13ICIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9J3BheCAtcicKKyAgICA7OworICBjcGlvKQorICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJworICAgIGFtX190YXJfPSdmaW5kICIkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJworICAgIGFtX191bnRhcj0nY3BpbyAtaSAtSCAkMSAtZCcKKyAgICA7OworICBub25lKQorICAgIGFtX190YXI9ZmFsc2UKKyAgICBhbV9fdGFyXz1mYWxzZQorICAgIGFtX191bnRhcj1mYWxzZQorICAgIDs7CisgIGVzYWMKKworICAjIElmIHRoZSB2YWx1ZSB3YXMgY2FjaGVkLCBzdG9wIG5vdy4gIFdlIGp1c3Qgd2FudGVkIHRvIGhhdmUgYW1fX3RhcgorICAjIGFuZCBhbV9fdW50YXIgc2V0LgorICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKKworICAjIHRhci91bnRhciBhIGR1bW15IGRpcmVjdG9yeSwgYW5kIHN0b3AgaWYgdGhlIGNvbW1hbmQgd29ya3MKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQorICBBTV9SVU5fTE9HKFt0YXJkaXI9Y29uZnRlc3QuZGlyICYmIGV2YWwgJGFtX190YXJfID5jb25mdGVzdC50YXJdKQorICBybSAtcmYgY29uZnRlc3QuZGlyCisgIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCisgICAgQU1fUlVOX0xPRyhbJGFtX191bnRhciA8Y29uZnRlc3QudGFyXSkKKyAgICBncmVwIEdyZXBNZSBjb25mdGVzdC5kaXIvZmlsZSA+L2Rldi9udWxsIDI+JjEgJiYgYnJlYWsKKyAgZmkKK2RvbmUKK3JtIC1yZiBjb25mdGVzdC5kaXIKKworQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm9nX3Rhcl8kMV0sIFthbV9jdl9wcm9nX3Rhcl8kMT0kX2FtX3Rvb2xdKQorQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQorQUNfU1VCU1QoW2FtX190YXJdKQorQUNfU1VCU1QoW2FtX191bnRhcl0pCitdKSAjIF9BTV9QUk9HX1RBUgorCittNF9pbmNsdWRlKFttNC9saWJ0b29sLm00XSkKK200X2luY2x1ZGUoW200L2x0b3B0aW9ucy5tNF0pCittNF9pbmNsdWRlKFttNC9sdHN1Z2FyLm00XSkKK200X2luY2x1ZGUoW200L2x0dmVyc2lvbi5tNF0pCittNF9pbmNsdWRlKFttNC9sdH5vYnNvbGV0ZS5tNF0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2J1aWxkLWF1eC9jb25maWcuZ3Vlc3MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2J1aWxkLWF1eC9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYyMmE0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE1MzAgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKyMgICAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMTItMDItMTAnCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAgUGxlYXNlIHNlbmQgcGF0Y2hlcyAoY29udGV4dAorIyBkaWZmIGZvcm1hdCkgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGFuZCBpbmNsdWRlIGEgQ2hhbmdlTG9nCisjIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMgorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCAtcSBfX0VMRl9fCisJCXRoZW4KKwkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KKwkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPworCQkgICAgb3M9bmV0YnNkCisJCWVsc2UKKwkJICAgIG9zPW5ldGJzZGVsZgorCQlmaQorCQk7OworCSAgICAqKQorCQlvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJIyBSZXNldCBFWElUIHRyYXAgYmVmb3JlIGV4aXRpbmcgdG8gYXZvaWQgc3B1cmlvdXMgbm9uLXplcm8gZXhpdCBjb2RlLgorCWV4aXRjb2RlPSQ/CisJdHJhcCAnJyAwCisJZXhpdCAkZXhpdGNvZGUgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorCWVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtOnJpc2NvczoqOip8YXJtOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOkF1cm9yYVVYOjUuKjoqIHwgaTg2eGVuOkF1cm9yYVVYOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1hdXJvcmF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCVNVTl9BUkNIPSJpMzg2IgorCSMgSWYgdGhlcmUgaXMgYSBjb21waWxlciwgc2VlIGlmIGl0IGlzIGNvbmZpZ3VyZWQgZm9yIDY0LWJpdCBvYmplY3RzLgorCSMgTm90ZSB0aGF0IHRoZSBTdW4gY2MgZG9lcyBub3QgdHVybiBfX0xQNjRfXyBpbnRvIDEgbGlrZSBnY2MgZG9lcy4KKwkjIFRoaXMgdGVzdCB3b3JrcyBmb3IgYm90aCBjb21waWxlcnMuCisJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJICAgIGlmIChlY2hvICcjaWZkZWYgX19hbWQ2NCc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCWdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJU1VOX0FSQ0g9Ing4Nl82NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtTVU5fQVJDSH0tcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKwllY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorCWVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKwllY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorCSMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCA7OworICAgICo6QUlYOio6WzQ1NjddKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKwkJICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorCQkgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisJCSAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorCQkgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKwkJICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisJCQljYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKwkJCSAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworCQkJICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKwkJCWVzYWMgOzsKKwkJICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKworCQkjZGVmaW5lIF9IUFVYX1NPVVJDRQorCQkjaW5jbHVkZSA8c3RkbGliLmg+CisJCSNpbmNsdWRlIDx1bmlzdGQuaD4KKworCQlpbnQgbWFpbiAoKQorCQl7CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKwkJI2VuZGlmCisJCSAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisJCSAgICBzd2l0Y2ggKGNwdSkKKwkJCXsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworCQkJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMl8wOgorCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisJCQkgICAgc3dpdGNoIChiaXRzKQorCQkJCXsKKwkJCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisJCQkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworCQkJCX0gYnJlYWs7CisJCSNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisJCQkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCSNlbmRpZgorCQkJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQl9CisJCSAgICBleGl0ICgwKTsKKwkJfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCAtcSBfX0xQNjRfXworCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisJRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKwllY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwljYXNlICR7VU5BTUVfUFJPQ0VTU09SfSBpbgorCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICAqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOk1TWVMqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zeXMKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIGF1dGhlbnRpY2FtZCB8IGdlbnVpbmVpbnRlbCB8IEVNNjRUKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgSUE2NCkKKwkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCWVzYWMgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgODY2NDpXaW5kb3dzX05UOiopCisJZWNobyB4ODZfNjQtcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhYXJjaDY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYWFyY2g2NF9iZTpMaW51eDoqOiopCisJVU5BTUVfTUFDSElORT1hYXJjaDY0X2JlCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisJZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJaWYgZWNobyBfX0FSTV9FQUJJX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCSAgICB8IGdyZXAgLXEgX19BUk1fRUFCSV9fCisJdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwllbHNlCisJICAgIGlmIGVjaG8gX19BUk1fUENTX1ZGUCB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCXwgZ3JlcCAtcSBfX0FSTV9QQ1NfVkZQCisJICAgIHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQorCSAgICBlbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmloZgorCSAgICBmaQorCWZpCisJZXhpdCA7OworICAgIGF2cjMyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzdjMyOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgZnJ2OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaGV4YWdvbjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCUxJQkM9Z251CisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeTElCQydgCisJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IgorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiogfCBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPSR7VU5BTUVfTUFDSElORX0KKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeQ1BVJ2AKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQorCSMgTG9vayBmb3IgQ1BVIGxldmVsCisJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KKwkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKKwllc2FjCisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHRpbGUqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4dGVuc2EqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisJIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorCSMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKwkjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorCSMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisJIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKwkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKQkjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorCQkJIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorCWVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCQllY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIGkzODYpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJCSAgdGhlbgorCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKKwkJICBmaQorCQlmaSA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBORU8tPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuZW8tdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisJZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKwlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7CisgICAgaSo4NjpBUk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYXJvcworCWV4aXQgOzsKKyAgICB4ODZfNjQ6Vk1rZXJuZWw6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVzeAorCWV4aXQgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKwkiNCIKKyNlbHNlCisJIiIKKyNlbmRpZgorCSk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2NvbmZpZy5oLmluIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9idWlsZC1hdXgvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzYjViMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGJ1aWxkLWF1eC9jb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0RMRkNOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBIQVZFX1BUSFJFQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLgorICAgKi8KKyN1bmRlZiBMVF9PQkpESVIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9OQU1FCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1NUUklORworCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9VUkwKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KKworLyogRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudCB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24KKyAgIHlvdXIgc3lzdGVtLiAqLworI3VuZGVmIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjdW5kZWYgVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9idWlsZC1hdXgvY29uZmlnLnN1YiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzg5NGRhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNzczIEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKyMgICAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMTItMDItMTAnCisKKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBHTlUgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsCisyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCA7OworCisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitjYXNlICQjIGluCisgMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgorICAgIGV4aXQgMTs7CisgMSkgOzsKKyAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1hbmRyb2lkKiB8IGxpbnV4LWRpZXRsaWJjIHwgbGludXgtbmV3bGliKiB8IFwKKyAgbGludXgtdWNsaWJjKiB8IHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwgXAorICBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICBhbmRyb2lkLWxpbnV4KQorICAgIG9zPS1saW51eC1hbmRyb2lkCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AtdW5rbm93bgorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1ibHVlZ2VuZSopCisJCW9zPS1jbmsKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c3JkYikKKwkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhYXJjaDY0IHwgYWFyY2g2NF9iZSBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisgICAgICAgIHwgYmUzMiB8IGJlNjQgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBlcGlwaGFueSBcCisJfCBmaWRvIHwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaGV4YWdvbiBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbGUzMiB8IGxlNjQgXAorCXwgbG0zMiBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCB8IG1ldGFnIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NG9jdGVvbiB8IG1pcHM2NG9jdGVvbmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjRyNTkwMCB8IG1pcHM2NHI1OTAwZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmRzMzIgfCBuZHMzMmxlIHwgbmRzMzJiZSBcCisJfCBuaW9zIHwgbmlvczIgXAorCXwgbnMxNmsgfCBuczMyayBcCisJfCBvcGVuOCBcCisJfCBvcjMyIFwKKwl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCisJfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgXAorCXwgcHlyYW1pZCBcCisJfCBybDc4IHwgcnggXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSBcCisJfCB0YWhvZSB8IHRpYzR4IHwgdGljNTR4IHwgdGljNTV4IHwgdGljNnggfCB0aWM4MCB8IHRyb24gXAorCXwgdWJpY29tMzIgXAorCXwgdjg1MCB8IHY4NTBlIHwgdjg1MGUxIHwgdjg1MGUyIHwgdjg1MGVzIHwgdjg1MGUydjMgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwljNTR4KQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCTs7CisJYzU1eCkKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQk7OworCWM2eCkKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCTs7CisJbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyIHwgbTY4aGNzMTJ4IHwgcGljb2NoaXApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKKwlzdHJvbmdhcm0gfCB0aHVtYiB8IHhzY2FsZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQk7OworCXhnYXRlKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwl4c2NhbGVlYikKKwkJYmFzaWNfbWFjaGluZT1hcm1lYi11bmtub3duCisJCTs7CisKKwl4c2NhbGVlbCkKKwkJYmFzaWNfbWFjaGluZT1hcm1lbC11bmtub3duCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWFyY2g2NC0qIHwgYWFyY2g2NF9iZS0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKKwl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCisJfCBhdnItKiB8IGF2cjMyLSogXAorCXwgYmUzMi0qIHwgYmU2NC0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBoZXhhZ29uLSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IGxlMzItKiB8IGxlNjQtKiBcCisJfCBsbTMyLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiB8IG1ldGFnLSogfCBtaWNyb2JsYXplLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NG9jdGVvbi0qIHwgbWlwczY0b2N0ZW9uZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHI1OTAwLSogfCBtaXBzNjRyNTkwMGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuZHMzMi0qIHwgbmRzMzJsZS0qIHwgbmRzMzJiZS0qIFwKKwl8IG5pb3MtKiB8IG5pb3MyLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCisJfCBvcGVuOC0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcmw3OC0qIHwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjRdYS0qIHwgc2hbMjRdYWViLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdjEtKiB8IHN4Py0qIFwKKwl8IHRhaG9lLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdGlsZSotKiBcCisJfCB0cm9uLSogXAorCXwgdWJpY29tMzItKiBcCisJfCB2ODUwLSogfCB2ODUwZS0qIHwgdjg1MGUxLSogfCB2ODUwZXMtKiB8IHY4NTBlMi0qIHwgdjg1MGUydjMtKiBcCisJfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EqLSogXAorCXwgeW1wLSogXAorCXwgejhrLSogfCB6ODAtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXJvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1hcm9zCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwlibGFja2ZpbikKKwkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJYmxhY2tmaW4tKikKKwkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCWJsdWVnZW5lKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tY25rCisJCTs7CisJYzU0eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM1NXgtKikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljNngtKikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY2VnY2MpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LWNlZ2NjCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTYgfCBjcjE2LSopCisJCWJhc2ljX21hY2hpbmU9Y3IxNi11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRpY29zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LWRpY29zCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW02OGtub21tdSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJbTY4a25vbW11LSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaWNyb2JsYXplKQorCQliYXNpY19tYWNoaW5lPW1pY3JvYmxhemUteGlsaW54CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluZ3czMmNlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1taW5ndzMyY2UKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW9uaXRvcikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCW1vcnBob3MpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCW9zPS1tb3JwaG9zCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltczEtKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAorCQk7OworCW1zeXMpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXN5cworCQk7OworCW12cykKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisJbmFjbCkKKwkJYmFzaWNfbWFjaGluZT1sZTMyLXVua25vd24KKwkJb3M9LW5hY2wKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW5lby10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bmVvLXRhbmRlbQorCQk7OworCW5zZS10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNlLXRhbmRlbQorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcGVucmlzYyB8IG9wZW5yaXNjLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCTs7CisJb3M0MDApCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LW9zNDAwCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGFyaXNjKQorCQliYXNpY19tYWNoaW5lPWhwcGEtdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlwYXJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKwlwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwYzk4KQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJOzsKKwlwYzk4LSopCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bTQpCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtNC0qKQorCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQorCQk7OworCXBwYyB8IHBwY2JlKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qIHwgcHBjYmUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkJOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCisJCTs7CisJcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KKwkJOzsKKwlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcmRvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNkZSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCisJCW9zPS1lbGYKKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDVlbCkKKwkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN0cm9uZ2FybS0qIHwgdGh1bWItKikKKwkJYmFzaWNfbWFjaGluZT1hcm0tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWxlKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eeHNjYWxlL2FybS8nYAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisJIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKwkjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1hdXJvcmF1eCkKKwkJb3M9LWF1cm9yYXV4CisJCTs7CisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1jbmsqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1hdXJvcmF1eCogfCAtc29sYXJpcyogXAorCSAgICAgIHwgLXN5bSogfCAta29wZW5zb2xhcmlzKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiB8IC1hcm9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCisJICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIHwgLWNlZ2NjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1tc3lzKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtbGludXgtYW5kcm9pZCogXAorCSAgICAgIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyogfCAtZXMqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIHwgLWhhaWt1KiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisJLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworCS10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLWRpY29zKikKKwkJb3M9LWRpY29zCisJCTs7CisJLW5hY2wqKQorCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJc2NvcmUtKikKKwkJb3M9LWVsZgorCQk7OworCXNwdS0qKQorCQlvcz0tZWxmCisJCTs7CisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotcmViZWwpCisJCW9zPS1saW51eAorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKwljNHgtKiB8IHRpYzR4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTR4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTV4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNngtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLWtudXRoKQorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWNuayp8LWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2J1aWxkLWF1eC9kZXBjb21wIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9idWlsZC1hdXgvZGVwY29tcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDBhYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9idWlsZC1hdXgvZGVwY29tcApAQCAtMCwwICsxLDY4OCBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAxMS0xMi0wNC4xMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsCisjIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0dGluZyBkZXBlbmRlbmNpZXMuCisgIGxpYnRvb2wgICAgIFdoZXRoZXIgbGlidG9vbCBpcyB1c2VkICh5ZXMvbm8pLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgorRU9GCisgICAgZXhpdCAkPworICAgIDs7CisgIC12IHwgLS12KikKKyAgICBlY2hvICJkZXBjb21wICRzY3JpcHR2ZXJzaW9uIgorICAgIGV4aXQgJD8KKyAgICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KKyAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCitkZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAorICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KK3RtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9CisKK3JtIC1mICIkdG1wZGVwZmlsZSIKKworIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCisjIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAorIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQorIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCisgICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgorICBnY2NmbGFnPS1NCisgIGRlcG1vZGU9Z2NjCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KKyAgIGRhc2htZmxhZz0teE0KKyAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKK2ZpCisKK2N5Z3BhdGhfdT0iY3lncGF0aCAtdSAtZiAtIgoraWYgdGVzdCAiJGRlcG1vZGUiID0gbXN2Y21zeXM7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgbXN2aXN1YWxjcHAgYnV0IHcvbyBjeWdwYXRoIHRyYW5zbGF0aW9uLgorICAgIyBKdXN0IGNvbnZlcnQgdGhlIGJhY2tzbGFzaC1lc2NhcGVkIGJhY2tzbGFzaGVzIHRvIHNpbmdsZSBmb3J3YXJkCisgICAjIHNsYXNoZXMgdG8gc2F0aXNmeSBkZXBlbmQubTQKKyAgIGN5Z3BhdGhfdT0nc2VkIHMsXFxcXCwvLGcnCisgICBkZXBtb2RlPW1zdmlzdWFsY3BwCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjN21zeXM7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgbXN2YzcgYnV0IHcvbyBjeWdwYXRoIHRyYW5zbGF0aW9uLgorICAgIyBKdXN0IGNvbnZlcnQgdGhlIGJhY2tzbGFzaC1lc2NhcGVkIGJhY2tzbGFzaGVzIHRvIHNpbmdsZSBmb3J3YXJkCisgICAjIHNsYXNoZXMgdG8gc2F0aXNmeSBkZXBlbmQubTQKKyAgIGN5Z3BhdGhfdT0nc2VkIHMsXFxcXCwvLGcnCisgICBkZXBtb2RlPW1zdmM3CitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyMjIFVuZm9ydHVuYXRlbHksIEZyZWVCU0QgYzg5IGFjY2VwdGFuY2Ugb2YgZmxhZ3MgZGVwZW5kcyB1cG9uCisjIyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG9yZGVyOyBzbyBhZGQgdGhlIGZsYWdzIHdoZXJlIHRoZXkKKyMjIGFwcGVhciBpbiBkZXBlbmQyLmFtLiAgTm90ZSB0aGF0IHRoZSBzbG93ZG93biBpbmN1cnJlZCBoZXJlCisjIyBhZmZlY3RzIG9ubHkgY29uZmlndXJlOiBpbiBtYWtlZmlsZXMsICVGQVNUREVQJSBzaG9ydGN1dHMgdGhpcy4KKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1jKSBzZXQgZm5vcmQgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIgIiRhcmciIDs7CisgICAgKikgIHNldCBmbm9yZCAiJEAiICIkYXJnIiA7OworICAgIGVzYWMKKyAgICBzaGlmdCAjIGZub3JkCisgICAgc2hpZnQgIyAkYXJnCisgIGRvbmUKKyAgIiRAIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCisjIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKKyMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCisjIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCisjIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQorIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKKyMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgorIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQorIyMgICB0aGFuIHJlbmFtaW5nKS4KKyAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCisgICAgZ2NjZmxhZz0tTUQsCisgIGZpCisgICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisjIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCisgIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAorICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCisjIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQorIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCisjIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZworIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbworIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8CisjIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKKyMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcworIyMgd2VsbC4gIGhwIGRlcG1vZGUgYWxzbyBhZGRzIHRoYXQgc3BhY2UsIGJ1dCBhbHNvIHByZWZpeGVzIHRoZSBWUEFUSAorIyMgdG8gdGhlIG9iamVjdC4gIFRha2UgY2FyZSB0byBub3QgcmVwZWF0IGl0IGluIHRoZSBvdXRwdXQuCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICJzfC4qJG9iamVjdCR8fCIgLWUgJy86JC9kJyBcCisgICAgICB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcworICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKKyAgICB0ciAnCisnICcgJyA+PiAiJGRlcGZpbGUiCisgICAgZWNobyA+PiAiJGRlcGZpbGUiCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2FpeCkKKyAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcworICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQorICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCisgICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgorICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2UudQorICAgICIkQCIgLVdjLC1NCisgIGVsc2UKKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLnUKKyAgICAiJEAiIC1NCisgIGZpCisgIHN0YXQ9JD8KKworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCisgICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCisgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitpY2MpCisgICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgorICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKKyAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCisgICMgICAgZm9vLm86IHN1Yi9mb28uYworICAjICAgIGZvby5vOiBzdWIvZm9vLmgKKyAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6CisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAorICAjICAgIHN1Yi9mb28uYzoKKyAgIyAgICBzdWIvZm9vLmg6CisgICMgSUNDIDcuMSB3aWxsIG91dHB1dAorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCisgICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKKyAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCisgICMgICAgIC4uLgorCisgICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAorICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgorICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAorICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwMikKKyAgIyBUaGUgImhwIiBzdGFuemEgYWJvdmUgZG9lcyBub3Qgd29yayB3aXRoIGFDQyAoQysrKSBhbmQgSFAncyBpYTY0CisgICMgY29tcGlsZXJzLCB3aGljaCBoYXZlIGludGVncmF0ZWQgcHJlcHJvY2Vzc29ycy4gIFRoZSBjb3JyZWN0IG9wdGlvbgorICAjIHRvIHVzZSB3aXRoIHRoZXNlIGlzICtNYWtlZDsgaXQgd3JpdGVzIGRlcGVuZGVuY2llcyB0byBhIGZpbGUgbmFtZWQKKyAgIyAnZm9vLmQnLCB3aGljaCBsYW5kcyBuZXh0IHRvIHRoZSBvYmplY3QgZmlsZSwgd2hlcmV2ZXIgdGhhdAorICAjIGhhcHBlbnMgdG8gYmUuCisgICMgTXVjaCBvZiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRydTY0IGNhc2U7IHNlZSBjb21tZW50cyB0aGVyZS4KKyAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKKyAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2UuZAorICAgICIkQCIgLVdjLCtNYWtlZAorICBlbHNlCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICIkQCIgK01ha2VkCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgIyBBZGQgYGRlcGVuZGVudC5oOicgbGluZXMuCisgICAgc2VkIC1uZSAnMiwkeworCSAgICAgICBzL14gKi8vCisJICAgICAgIHMvIFxcKiQvLworCSAgICAgICBzLyQvOi8KKwkgICAgICAgcAorCSAgICAgfScgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZTIiCisgIDs7CisKK3RydTY0KQorICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQorICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgorICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisKKyAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQorICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCisgICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgorICAgICAgIworICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKKyAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCisgICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCisgICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCisgICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcworICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgorICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40CisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAorICAgICAgIiRAIiAtTUQKKyAgIGZpCisKKyAgIHN0YXQ9JD8KKyAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICAgZWxzZQorICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgICAgIGV4aXQgJHN0YXQKKyAgIGZpCisKKyAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICBkbworICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgIGRvbmUKKyAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICAgZWxzZQorICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgIGZpCisgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICA7OworCittc3ZjNykKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgc2hvd0luY2x1ZGVzPS1XYywtc2hvd0luY2x1ZGVzCisgIGVsc2UKKyAgICBzaG93SW5jbHVkZXM9LXNob3dJbmNsdWRlcworICBmaQorICAiJEAiICRzaG93SW5jbHVkZXMgPiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgZ3JlcCAtdiAnXk5vdGU6IGluY2x1ZGluZyBmaWxlOiAnICIkdG1wZGVwZmlsZSIKKyAgaWYgdGVzdCAiJHN0YXQiID0gMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgICMgVGhlIGZpcnN0IHNlZCBwcm9ncmFtIGJlbG93IGV4dHJhY3RzIHRoZSBmaWxlIG5hbWVzIGFuZCBlc2NhcGVzCisgICMgYmFja3NsYXNoZXMgZm9yIGN5Z3BhdGguICBUaGUgc2Vjb25kIHNlZCBwcm9ncmFtIG91dHB1dHMgdGhlIGZpbGUKKyAgIyBuYW1lIHdoZW4gcmVhZGluZywgYnV0IGFsc28gYWNjdW11bGF0ZXMgYWxsIGluY2x1ZGUgZmlsZXMgaW4gdGhlCisgICMgaG9sZCBidWZmZXIgaW4gb3JkZXIgdG8gb3V0cHV0IHRoZW0gYWdhaW4gYXQgdGhlIGVuZC4gIFRoaXMgb25seQorICAjIHdvcmtzIHdpdGggc2VkIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBoYW5kbGUgbGFyZ2UgYnVmZmVycy4KKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAnCisvXk5vdGU6IGluY2x1ZGluZyBmaWxlOiAgKlwoLipcKS8geworICBzLy9cMS8KKyAgcy9cXC9cXFxcL2cKKyAgcAorfScgfCAkY3lncGF0aF91IHwgc29ydCAtdSB8IHNlZCAtbiAnCitzLyAvXFwgL2cKK3MvXCguKlwpLwlcMSBcXC9wCitzLy5cKC4qXCkgXFwvXDE6LworSAorJCB7CisgIHMvLiovCS8KKyAgRworICBwCit9JyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2Yzdtc3lzKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworI25vc2lkZWVmZmVjdCkKKyAgIyBUaGlzIGNvbW1lbnQgYWJvdmUgaXMgdXNlZCBieSBhdXRvbWFrZSB0byB0ZWxsIHNpZGUtZWZmZWN0CisgICMgZGVwZW5kZW5jeSB0cmFja2luZyBtZWNoYW5pc21zIGZyb20gc2xvd2VyIG9uZXMuCisKK2Rhc2htc3Rkb3V0KQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dCwgcmVnYXJkbGVzcyBvZiAtby4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKKyAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgorICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgorICAiJEAiICRkYXNobWZsYWcgfAorICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2Rhc2hYbXN0ZG91dCkKKyAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQorICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KKyAgZXhpdCAxCisgIDs7CisKK21ha2VkZXBlbmQpCisgICIkQCIgfHwgZXhpdCAkPworICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgIlgkMSIgIT0gJ1gtLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorICAjIFggbWFrZWRlcGVuZAorICBzaGlmdAorICBjbGVhcmVkPW5vIGVhdD1ubworICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkY2xlYXJlZCBpbgorICAgIG5vKQorICAgICAgc2V0ICIiOyBzaGlmdAorICAgICAgY2xlYXJlZD15ZXMgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAkZWF0ID0geWVzOyB0aGVuCisgICAgICBlYXQ9bm8KKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1EKnwtSSopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgIyBTdHJpcCBhbnkgb3B0aW9uIHRoYXQgbWFrZWRlcGVuZCBtYXkgbm90IHVuZGVyc3RhbmQuICBSZW1vdmUKKyAgICAjIHRoZSBvYmplY3QgdG9vLCBvdGhlcndpc2UgbWFrZWRlcGVuZCB3aWxsIHBhcnNlIGl0IGFzIGEgc291cmNlIGZpbGUuCisgICAgLWFyY2gpCisgICAgICBlYXQ9eWVzIDs7CisgICAgLSp8JG9iamVjdCkKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgb2JqX3N1ZmZpeD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXi4qXC4vLi8nYAorICB0b3VjaCAiJHRtcGRlcGZpbGUiCisgICR7TUFLRURFUEVORC1tYWtlZGVwZW5kfSAtbyIkb2JqX3N1ZmZpeCIgLWYiJHRtcGRlcGZpbGUiICIkQCIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICAjIG1ha2VkZXBlbmQgbWF5IHByZXBlbmQgdGhlIFZQQVRIIGZyb20gdGhlIHNvdXJjZSBmaWxlIG5hbWUgdG8gdGhlIG9iamVjdC4KKyAgIyBObyBuZWVkIHRvIHJlZ2V4LWVzY2FwZSAkb2JqZWN0LCBleGNlc3MgbWF0Y2hpbmcgb2YgJy4nIGlzIGhhcm1sZXNzLgorICBzZWQgInN8Xi4qXCgkb2JqZWN0ICo6XCl8XDF8IiAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICBzZWQgJzEsMmQnICIkdG1wZGVwZmlsZSIgfCB0ciAnICcgJworJyB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZSIuYmFrCisgIDs7CisKK2NwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQuCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgIlgkMSIgIT0gJ1gtLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICIkQCIgLUUgfAorICAgIHNlZCAtbiAtZSAnL14jIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyBcCisgICAgICAgLWUgJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIHwKKyAgICBzZWQgJyQgczogXFwkOjonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICBzZWQgPCAiJHRtcGRlcGZpbGUiICcvXiQvZDtzL14gLy87cy8gXFwkLy87cy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK21zdmlzdWFsY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAiLUdtInwiL0dtInwiLUdpInwiL0dpInwiLVpJInwiL1pJIikKKwlzZXQgZm5vcmQgIiRAIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgICopCisJc2V0IGZub3JkICIkQCIgIiRhcmciCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgZXNhYworICBkb25lCisgICIkQCIgLUUgMj4vZGV2L251bGwgfAorICBzZWQgLW4gJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIvIHM6OlwxOnAnIHwgJGN5Z3BhdGhfdSB8IHNvcnQgLXUgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgorICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgLW4gLWUgJ3MlICVcXCAlZycgLWUgJy9eXCguKlwpJC8gczo6XDFcOjpwJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2Y21zeXMpCisgICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQorICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCisgICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGV4aXQgMQorICA7OworCitub25lKQorICBleGVjICIkQCIKKyAgOzsKKworKikKKyAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2luc3RhbGwtc2ggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2J1aWxkLWF1eC9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MjQ0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2J1aWxkLWF1eC9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsNTI3IEBACisjIS9iaW4vc2gKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisKK3NjcmlwdHZlcnNpb249MjAxMS0wMS0xOS4yMTsgIyBVVEMKKworIyBUaGlzIG9yaWdpbmF0ZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKSwgd2hpY2ggd2FzCisjIGxhdGVyIHJlbGVhc2VkIGluIFgxMVI2ICh4Yy9jb25maWcvdXRpbC9pbnN0YWxsLnNoKSB3aXRoIHRoZQorIyBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBsaWNlbnNlLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgWCBDb25zb3J0aXVtCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisjIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisjIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorIyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyMgWCBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUMtCisjIFRJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisjIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBYIENvbnNvcnRpdW0gc2hhbGwgbm90CisjIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsLQorIyBpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgWCBDb25zb3ItCisjIHRpdW0uCisjCisjCisjIEZTRiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLgorCitubD0nCisnCitJRlM9IiAiIgkkbmwiCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSR7RE9JVFBST0ctfQoraWYgdGVzdCAteiAiJGRvaXQiOyB0aGVuCisgIGRvaXRfZXhlYz1leGVjCitlbHNlCisgIGRvaXRfZXhlYz0kZG9pdAorZmkKKworIyBQdXQgaW4gYWJzb2x1dGUgZmlsZSBuYW1lcyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsKKyMgb3IgdXNlIGVudmlyb25tZW50IHZhcnMuCisKK2NoZ3JwcHJvZz0ke0NIR1JQUFJPRy1jaGdycH0KK2NobW9kcHJvZz0ke0NITU9EUFJPRy1jaG1vZH0KK2Nob3ducHJvZz0ke0NIT1dOUFJPRy1jaG93bn0KK2NtcHByb2c9JHtDTVBQUk9HLWNtcH0KK2NwcHJvZz0ke0NQUFJPRy1jcH0KK21rZGlycHJvZz0ke01LRElSUFJPRy1ta2Rpcn0KK212cHJvZz0ke01WUFJPRy1tdn0KK3JtcHJvZz0ke1JNUFJPRy1ybX0KK3N0cmlwcHJvZz0ke1NUUklQUFJPRy1zdHJpcH0KKworcG9zaXhfZ2xvYj0nPycKK2luaXRpYWxpemVfcG9zaXhfZ2xvYj0nCisgIHRlc3QgIiRwb3NpeF9nbG9iIiAhPSAiPyIgfHwgeworICAgIGlmIChzZXQgLWYpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICBwb3NpeF9nbG9iPQorICAgIGVsc2UKKyAgICAgIHBvc2l4X2dsb2I9OgorICAgIGZpCisgIH0KKycKKworcG9zaXhfbWtkaXI9CisKKyMgRGVzaXJlZCBtb2RlIG9mIGluc3RhbGxlZCBmaWxlLgorbW9kZT0wNzU1CisKK2NoZ3JwY21kPQorY2htb2RjbWQ9JGNobW9kcHJvZworY2hvd25jbWQ9CittdmNtZD0kbXZwcm9nCitybWNtZD0iJHJtcHJvZyAtZiIKK3N0cmlwY21kPQorCitzcmM9Citkc3Q9CitkaXJfYXJnPQorZHN0X2FyZz0KKworY29weV9vbl9jaGFuZ2U9ZmFsc2UKK25vX3RhcmdldF9kaXJlY3Rvcnk9CisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0uLi4gWy1UXSBTUkNGSUxFIERTVEZJTEUKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiBTUkNGSUxFUy4uLiBESVJFQ1RPUlkKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtdCBESVJFQ1RPUlkgU1JDRklMRVMuLi4KKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtZCBESVJFQ1RPUklFUy4uLgorCitJbiB0aGUgMXN0IGZvcm0sIGNvcHkgU1JDRklMRSB0byBEU1RGSUxFLgorSW4gdGhlIDJuZCBhbmQgM3JkLCBjb3B5IGFsbCBTUkNGSUxFUyB0byBESVJFQ1RPUlkuCitJbiB0aGUgNHRoLCBjcmVhdGUgRElSRUNUT1JJRVMuCisKK09wdGlvbnM6CisgICAgIC0taGVscCAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQuCisgICAgIC0tdmVyc2lvbiAgZGlzcGxheSB2ZXJzaW9uIGluZm8gYW5kIGV4aXQuCisKKyAgLWMgICAgICAgICAgICAoaWdub3JlZCkKKyAgLUMgICAgICAgICAgICBpbnN0YWxsIG9ubHkgaWYgZGlmZmVyZW50IChwcmVzZXJ2ZSB0aGUgbGFzdCBkYXRhIG1vZGlmaWNhdGlvbiB0aW1lKQorICAtZCAgICAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCisgIC1nIEdST1VQICAgICAgJGNoZ3JwcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gR1JPVVAuCisgIC1tIE1PREUgICAgICAgJGNobW9kcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gTU9ERS4KKyAgLW8gVVNFUiAgICAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgorICAtcyAgICAgICAgICAgICRzdHJpcHByb2cgaW5zdGFsbGVkIGZpbGVzLgorICAtdCBESVJFQ1RPUlkgIGluc3RhbGwgaW50byBESVJFQ1RPUlkuCisgIC1UICAgICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlcyBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb21tYW5kczoKKyAgQ0hHUlBQUk9HIENITU9EUFJPRyBDSE9XTlBST0cgQ01QUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRworICBSTVBST0cgU1RSSVBQUk9HCisiCisKK3doaWxlIHRlc3QgJCMgLW5lIDA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtYykgOzsKKworICAgIC1DKSBjb3B5X29uX2NoYW5nZT10cnVlOzsKKworICAgIC1kKSBkaXJfYXJnPXRydWU7OworCisgICAgLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgorCXNoaWZ0OzsKKworICAgIC0taGVscCkgZWNobyAiJHVzYWdlIjsgZXhpdCAkPzs7CisKKyAgICAtbSkgbW9kZT0kMgorCWNhc2UgJG1vZGUgaW4KKwkgIConICcqIHwgKicJJyogfCAqJworJyoJICB8IConKicqIHwgKic/JyogfCAqJ1snKikKKwkgICAgZWNobyAiJDA6IGludmFsaWQgbW9kZTogJG1vZGUiID4mMgorCSAgICBleGl0IDE7OworCWVzYWMKKwlzaGlmdDs7CisKKyAgICAtbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisJc2hpZnQ7OworCisgICAgLXMpIHN0cmlwY21kPSRzdHJpcHByb2c7OworCisgICAgLXQpIGRzdF9hcmc9JDIKKwkjIFByb3RlY3QgbmFtZXMgcHJvYmxlbWF0aWMgZm9yIGB0ZXN0JyBhbmQgb3RoZXIgdXRpbGl0aWVzLgorCWNhc2UgJGRzdF9hcmcgaW4KKwkgIC0qIHwgWz1cKFwpIV0pIGRzdF9hcmc9Li8kZHN0X2FyZzs7CisJZXNhYworCXNoaWZ0OzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWU7OworCisgICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworCisgICAgLS0pCXNoaWZ0CisJYnJlYWs7OworCisgICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgorCWV4aXQgMTs7CisKKyAgICAqKSAgYnJlYWs7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0X2FyZyI7IHRoZW4KKyAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisgICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCisgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KKyAgZm9yIGFyZworICBkbworICAgIGlmIHRlc3QgLW4gIiRkc3RfYXJnIjsgdGhlbgorICAgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdF9hcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgZmkKKyAgICBzaGlmdCAjIGFyZworICAgIGRzdF9hcmc9JGFyZworICAgICMgUHJvdGVjdCBuYW1lcyBwcm9ibGVtYXRpYyBmb3IgYHRlc3QnIGFuZCBvdGhlciB1dGlsaXRpZXMuCisgICAgY2FzZSAkZHN0X2FyZyBpbgorICAgICAgLSogfCBbPVwoXCkhXSkgZHN0X2FyZz0uLyRkc3RfYXJnOzsKKyAgICBlc2FjCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCisgICAgZWNobyAiJDA6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLiIgPiYyCisgICAgZXhpdCAxCisgIGZpCisgICMgSXQncyBPSyB0byBjYWxsIGBpbnN0YWxsLXNoIC1kJyB3aXRob3V0IGFyZ3VtZW50LgorICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbmFsIGRpcmVjdG9yaWVzLgorICBleGl0IDAKK2ZpCisKK2lmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICBkb19leGl0PScoZXhpdCAkcmV0KTsgZXhpdCAkcmV0JworICB0cmFwICJyZXQ9MTI5OyAkZG9fZXhpdCIgMQorICB0cmFwICJyZXQ9MTMwOyAkZG9fZXhpdCIgMgorICB0cmFwICJyZXQ9MTQxOyAkZG9fZXhpdCIgMTMKKyAgdHJhcCAicmV0PTE0MzsgJGRvX2V4aXQiIDE1CisKKyAgIyBTZXQgdW1hc2sgc28gYXMgbm90IHRvIGNyZWF0ZSB0ZW1wcyB3aXRoIHRvby1nZW5lcm91cyBtb2Rlcy4KKyAgIyBIb3dldmVyLCAnc3RyaXAnIHJlcXVpcmVzIGJvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvIHRlbXBzLgorICBjYXNlICRtb2RlIGluCisgICAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCisgICAgKjY0NCkgY3BfdW1hc2s9MTMzOzsKKyAgICAqNzU1KSBjcF91bWFzaz0yMjs7CisKKyAgICAqWzAtN10pCisgICAgICBpZiB0ZXN0IC16ICIkc3RyaXBjbWQiOyB0aGVuCisJdV9wbHVzX3J3PQorICAgICAgZWxzZQorCXVfcGx1c19ydz0nJSAyMDAnCisgICAgICBmaQorICAgICAgY3BfdW1hc2s9YGV4cHIgJygnIDc3NyAtICRtb2RlICUgMTAwMCAnKScgJHVfcGx1c19yd2A7OworICAgICopCisgICAgICBpZiB0ZXN0IC16ICIkc3RyaXBjbWQiOyB0aGVuCisJdV9wbHVzX3J3PQorICAgICAgZWxzZQorCXVfcGx1c19ydz0sdStydworICAgICAgZmkKKyAgICAgIGNwX3VtYXNrPSRtb2RlJHVfcGx1c19ydzs7CisgIGVzYWMKK2ZpCisKK2ZvciBzcmMKK2RvCisgICMgUHJvdGVjdCBuYW1lcyBwcm9ibGVtYXRpYyBmb3IgYHRlc3QnIGFuZCBvdGhlciB1dGlsaXRpZXMuCisgIGNhc2UgJHNyYyBpbgorICAgIC0qIHwgWz1cKFwpIV0pIHNyYz0uLyRzcmM7OworICBlc2FjCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgZHN0PSRzcmMKKyAgICBkc3RkaXI9JGRzdAorICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgZHN0ZGlyX3N0YXR1cz0kPworICBlbHNlCisKKyAgICAjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZAorICAgICMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQKKyAgICAjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKyAgICBpZiB0ZXN0ICEgLWYgIiRzcmMiICYmIHRlc3QgISAtZCAiJHNyYyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiAkc3JjIGRvZXMgbm90IGV4aXN0LiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGRzdF9hcmciOyB0aGVuCisgICAgICBlY2hvICIkMDogbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkLiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorICAgIGRzdD0kZHN0X2FyZworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGRzdGRpcj0kZHN0CisgICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAorICAgICAgZHN0ZGlyX3N0YXR1cz0wCisgICAgZWxzZQorICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KKyAgICAgIGRzdGRpcj1gCisJKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAorCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKwllY2hvIFgiJGRzdCIgfAorCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXClbXi9dLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXCkkL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cKS4qL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIHMvLiovLi87IHEnCisgICAgICBgCisKKyAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgICBkc3RkaXJfc3RhdHVzPSQ/CisgICAgZmkKKyAgZmkKKworICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCisKKyAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCisgICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KKyAgICAgICcnKQorCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KKwkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgorCXVtYXNrPWB1bWFza2AKKwljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KKwkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKKwkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKKworCSAgKlswLTddKQorCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCisJICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKKwkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKKwkgICAgYDs7CisJICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7CisJZXNhYworCisJIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KKwkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCisJaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisJICBta2Rpcl9tb2RlPS1tJG1vZGUKKwllbHNlCisJICBta2Rpcl9tb2RlPQorCWZpCisKKwlwb3NpeF9ta2Rpcj1mYWxzZQorCWNhc2UgJHVtYXNrIGluCisJICAqWzEyMzU2N11bMC03XVswLTddKQorCSAgICAjIFBPU0lYIG1rZGlyIC1wIHNldHMgdSt3eCBiaXRzIHJlZ2FyZGxlc3Mgb2YgdW1hc2ssIHdoaWNoCisJICAgICMgaXMgaW5jb21wYXRpYmxlIHdpdGggRnJlZUJTRCAnaW5zdGFsbCcgd2hlbiAodW1hc2sgJiAzMDApICE9IDAuCisJICAgIDs7CisJICAqKQorCSAgICB0bXBkaXI9JHtUTVBESVItL3RtcH0vaW5zJFJBTkRPTS0kJAorCSAgICB0cmFwICdyZXQ9JD87IHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIiAyPi9kZXYvbnVsbDsgZXhpdCAkcmV0JyAwCisKKwkgICAgaWYgKHVtYXNrICRta2Rpcl91bWFzayAmJgorCQlleGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiR0bXBkaXIvZCIpID4vZGV2L251bGwgMj4mMQorCSAgICB0aGVuCisJICAgICAgaWYgdGVzdCAteiAiJGRpcl9hcmciIHx8IHsKKwkJICAgIyBDaGVjayBmb3IgUE9TSVggaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAtbS4KKwkJICAgIyBIUC1VWCAxMS4yMyBhbmQgSVJJWCA2LjUgbWtkaXIgLW0gLXAgc2V0cyBncm91cC0gb3IKKwkJICAgIyBvdGhlci13cml0ZWFibGUgYml0IG9mIHBhcmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBzaG91bGRuJ3QuCisJCSAgICMgRnJlZUJTRCA2LjEgbWtkaXIgLW0gLXAgc2V0cyBtb2RlIG9mIGV4aXN0aW5nIGRpcmVjdG9yeS4KKwkJICAgbHNfbGRfdG1wZGlyPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICBjYXNlICRsc19sZF90bXBkaXIgaW4KKwkJICAgICBkPz8/Py0/ci0qKSBkaWZmZXJlbnRfbW9kZT03MDA7OworCQkgICAgIGQ/Pz8/LT8tLSopIGRpZmZlcmVudF9tb2RlPTc1NTs7CisJCSAgICAgKikgZmFsc2U7OworCQkgICBlc2FjICYmCisJCSAgICRta2RpcnByb2cgLW0kZGlmZmVyZW50X21vZGUgLXAgLS0gIiR0bXBkaXIiICYmIHsKKwkJICAgICBsc19sZF90bXBkaXJfMT1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgICB0ZXN0ICIkbHNfbGRfdG1wZGlyIiA9ICIkbHNfbGRfdG1wZGlyXzEiCisJCSAgIH0KKwkJIH0KKwkgICAgICB0aGVuIHBvc2l4X21rZGlyPToKKwkgICAgICBmaQorCSAgICAgIHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBSZW1vdmUgYW55IGRpcnMgbGVmdCBiZWhpbmQgYnkgYW5jaWVudCBta2RpciBpbXBsZW1lbnRhdGlvbnMuCisJICAgICAgcm1kaXIgLi8kbWtkaXJfbW9kZSAuLy1wIC4vLS0gMj4vZGV2L251bGwKKwkgICAgZmkKKwkgICAgdHJhcCAnJyAwOzsKKwllc2FjOzsKKyAgICBlc2FjCisKKyAgICBpZgorICAgICAgJHBvc2l4X21rZGlyICYmICgKKwl1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiCisgICAgICApCisgICAgdGhlbiA6CisgICAgZWxzZQorCisgICAgICAjIFRoZSB1bWFzayBpcyByaWRpY3Vsb3VzLCBvciBta2RpciBkb2VzIG5vdCBjb25mb3JtIHRvIFBPU0lYLAorICAgICAgIyBvciBpdCBmYWlsZWQgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uICBDcmVhdGUgdGhlCisgICAgICAjIGRpcmVjdG9yeSB0aGUgc2xvdyB3YXksIHN0ZXAgYnkgc3RlcCwgY2hlY2tpbmcgZm9yIHJhY2VzIGFzIHdlIGdvLgorCisgICAgICBjYXNlICRkc3RkaXIgaW4KKwkvKikgcHJlZml4PScvJzs7CisJWy09XChcKSFdKikgcHJlZml4PScuLyc7OworCSopICBwcmVmaXg9Jyc7OworICAgICAgZXNhYworCisgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIgorCisgICAgICBvSUZTPSRJRlMKKyAgICAgIElGUz0vCisgICAgICAkcG9zaXhfZ2xvYiBzZXQgLWYKKyAgICAgIHNldCBmbm9yZCAkZHN0ZGlyCisgICAgICBzaGlmdAorICAgICAgJHBvc2l4X2dsb2Igc2V0ICtmCisgICAgICBJRlM9JG9JRlMKKworICAgICAgcHJlZml4ZXM9CisKKyAgICAgIGZvciBkCisgICAgICBkbworCXRlc3QgWCIkZCIgPSBYICYmIGNvbnRpbnVlCisKKwlwcmVmaXg9JHByZWZpeCRkCisJaWYgdGVzdCAtZCAiJHByZWZpeCI7IHRoZW4KKwkgIHByZWZpeGVzPQorCWVsc2UKKwkgIGlmICRwb3NpeF9ta2RpcjsgdGhlbgorCSAgICAodW1hc2s9JG1rZGlyX3VtYXNrICYmCisJICAgICAkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiKSAmJiBicmVhaworCSAgICAjIERvbid0IGZhaWwgaWYgdHdvIGluc3RhbmNlcyBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCisJICAgIHRlc3QgLWQgIiRwcmVmaXgiIHx8IGV4aXQgMQorCSAgZWxzZQorCSAgICBjYXNlICRwcmVmaXggaW4KKwkgICAgICAqXCcqKSBxcHJlZml4PWBlY2hvICIkcHJlZml4IiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisJICAgICAgKikgcXByZWZpeD0kcHJlZml4OzsKKwkgICAgZXNhYworCSAgICBwcmVmaXhlcz0iJHByZWZpeGVzICckcXByZWZpeCciCisJICBmaQorCWZpCisJcHJlZml4PSRwcmVmaXgvCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwcmVmaXhlcyI7IHRoZW4KKwkjIERvbid0IGZhaWwgaWYgdHdvIGluc3RhbmNlcyBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCisJKHVtYXNrICRta2Rpcl91bWFzayAmJgorCSBldmFsICJcJGRvaXRfZXhlYyBcJG1rZGlycHJvZyAkcHJlZml4ZXMiKSB8fAorCSAgdGVzdCAtZCAiJGRzdGRpciIgfHwgZXhpdCAxCisJb2Jzb2xldGVfbWtkaXJfdXNlZD10cnVlCisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAiJG9ic29sZXRlX21rZGlyX3VzZWQkY2hvd25jbWQkY2hncnBjbWQiID0gZmFsc2UgfHwKKyAgICAgIHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICRtb2RlICIkZHN0IjsgfSB8fCBleGl0IDEKKyAgZWxzZQorCisgICAgIyBNYWtlIGEgY291cGxlIG9mIHRlbXAgZmlsZSBuYW1lcyBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKyAgICBkc3R0bXA9JGRzdGRpci9faW5zdC4kJF8KKyAgICBybXRtcD0kZHN0ZGlyL19ybS4kJF8KKworICAgICMgVHJhcCB0byBjbGVhbiB1cCB0aG9zZSB0ZW1wIGZpbGVzIGF0IGV4aXQuCisgICAgdHJhcCAncmV0PSQ/OyBybSAtZiAiJGRzdHRtcCIgIiRybXRtcCIgJiYgZXhpdCAkcmV0JyAwCisKKyAgICAjIENvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lLgorICAgICh1bWFzayAkY3BfdW1hc2sgJiYgJGRvaXRfZXhlYyAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIpICYmCisKKyAgICAjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMuCisgICAgIworICAgICMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyAgICAjIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKKyAgICAjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGNwcHJvZyAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCisgICAgIworICAgIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3R0bXAiOyB9ICYmCisKKyAgICAjIElmIC1DLCBkb24ndCBib3RoZXIgdG8gY29weSBpZiBpdCB3b3VsZG4ndCBjaGFuZ2UgdGhlIGZpbGUuCisgICAgaWYgJGNvcHlfb25fY2hhbmdlICYmCisgICAgICAgb2xkPWBMQ19BTEw9QyBscyAtZGxMICIkZHN0IgkyPi9kZXYvbnVsbGAgJiYKKyAgICAgICBuZXc9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3R0bXAiCTI+L2Rldi9udWxsYCAmJgorCisgICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIgJiYKKyAgICAgICAkcG9zaXhfZ2xvYiBzZXQgLWYgJiYKKyAgICAgICBzZXQgWCAkb2xkICYmIG9sZD06JDI6JDQ6JDU6JDYgJiYKKyAgICAgICBzZXQgWCAkbmV3ICYmIG5ldz06JDI6JDQ6JDU6JDYgJiYKKyAgICAgICAkcG9zaXhfZ2xvYiBzZXQgK2YgJiYKKworICAgICAgIHRlc3QgIiRvbGQiID0gIiRuZXciICYmCisgICAgICAgJGNtcHByb2cgIiRkc3QiICIkZHN0dG1wIiA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuCisgICAgICBybSAtZiAiJGRzdHRtcCIKKyAgICBlbHNlCisgICAgICAjIFJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICAgICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3QiIDI+L2Rldi9udWxsIHx8CisKKyAgICAgICMgVGhlIHJlbmFtZSBmYWlsZWQsIHBlcmhhcHMgYmVjYXVzZSBtdiBjYW4ndCByZW5hbWUgc29tZXRoaW5nIGVsc2UKKyAgICAgICMgdG8gaXRzZWxmLCBvciBwZXJoYXBzIGJlY2F1c2UgbXYgaXMgc28gYW5jaWVudCB0aGF0IGl0IGRvZXMgbm90CisgICAgICAjIHN1cHBvcnQgLWYuCisgICAgICB7CisJIyBOb3cgcmVtb3ZlIG9yIG1vdmUgYXNpZGUgYW55IG9sZCBmaWxlIGF0IGRlc3RpbmF0aW9uIGxvY2F0aW9uLgorCSMgV2UgdHJ5IHRoaXMgdHdvIHdheXMgc2luY2Ugcm0gY2FuJ3QgdW5saW5rIGl0c2VsZiBvbiBzb21lCisJIyBzeXN0ZW1zIGFuZCB0aGUgZGVzdGluYXRpb24gZmlsZSBtaWdodCBiZSBidXN5IGZvciBvdGhlcgorCSMgcmVhc29ucy4gIEluIHRoaXMgY2FzZSwgdGhlIGZpbmFsIGNsZWFudXAgbWlnaHQgZmFpbCBidXQgdGhlIG5ldworCSMgZmlsZSBzaG91bGQgc3RpbGwgaW5zdGFsbCBzdWNjZXNzZnVsbHkuCisJeworCSAgdGVzdCAhIC1mICIkZHN0IiB8fAorCSAgJGRvaXQgJHJtY21kIC1mICIkZHN0IiAyPi9kZXYvbnVsbCB8fAorCSAgeyAkZG9pdCAkbXZjbWQgLWYgIiRkc3QiICIkcm10bXAiIDI+L2Rldi9udWxsICYmCisJICAgIHsgJGRvaXQgJHJtY21kIC1mICIkcm10bXAiIDI+L2Rldi9udWxsOyA6OyB9CisJICB9IHx8CisJICB7IGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0IiA+JjIKKwkgICAgKGV4aXQgMSk7IGV4aXQgMQorCSAgfQorCX0gJiYKKworCSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKwkkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0IgorICAgICAgfQorICAgIGZpIHx8IGV4aXQgMQorCisgICAgdHJhcCAnJyAwCisgIGZpCitkb25lCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2x0bWFpbi5zaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg1MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9idWlsZC1hdXgvbHRtYWluLnNoCkBAIC0wLDAgKzEsOTY2MSBAQAorCisjIGxpYnRvb2wgKEdOVSBsaWJ0b29sKSAyLjQuMgorIyBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwKKyMgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KKyMgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKKyMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KKyMKKyMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjCisjICAgICAgIC0tY29uZmlnICAgICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisjICAgICAgIC0tZGVidWcgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKKyMgICAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyMgICAgICAgLS1mZWF0dXJlcyAgICAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisjICAgICAgIC0tbW9kZT1NT0RFICAgICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFCisjICAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKyMgICAgICAgLS1xdWlldCwgLS1zaWxlbnQgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworIyAgICAgICAtLW5vLXF1aWV0LCAtLW5vLXNpbGVudAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIChkZWZhdWx0KQorIyAgICAgICAtLW5vLXdhcm4gICAgICAgICAgICBkb24ndCBkaXNwbGF5IHdhcm5pbmcgbWVzc2FnZXMKKyMgICAgICAgLS10YWc9VEFHICAgICAgICAgICAgdXNlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZyb20gdGFnIFRBRworIyAgIC12LCAtLXZlcmJvc2UgICAgICAgICAgICBwcmludCBtb3JlIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhbiBkZWZhdWx0CisjICAgICAgIC0tbm8tdmVyYm9zZSAgICAgICAgIGRvbid0IHByaW50IHRoZSBleHRyYSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisjICAgICAgIC0tdmVyc2lvbiAgICAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KKyMgICAtaCwgLS1oZWxwLCAtLWhlbHAtYWxsICAgcHJpbnQgc2hvcnQsIGxvbmcsIG9yIGRldGFpbGVkIGhlbHAgbWVzc2FnZQorIworIyBNT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisjCisjICAgICAgICAgY2xlYW4gICAgICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKKyMgICAgICAgICBjb21waWxlICAgICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAorIyAgICAgICAgIGV4ZWN1dGUgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorIyAgICAgICAgIGZpbmlzaCAgICAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisjICAgICAgICAgaW5zdGFsbCAgICAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCisjICAgICAgICAgbGluayAgICAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorIyAgICAgICAgIHVuaW5zdGFsbCAgICAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorIworIyBNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBXaGVuIHBhc3NlZCBhcyBmaXJzdCBvcHRpb24sCisjIGAtLW1vZGU9TU9ERScgbWF5IGJlIGFiYnJldmlhdGVkIGFzIGBNT0RFJyBvciBhIHVuaXF1ZSBhYmJyZXZpYXRpb24gb2YgdGhhdC4KKyMgVHJ5IGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuCisjCisjIFdoZW4gcmVwb3J0aW5nIGEgYnVnLCBwbGVhc2UgZGVzY3JpYmUgYSB0ZXN0IGNhc2UgdG8gcmVwcm9kdWNlIGl0IGFuZAorIyBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisjCisjICAgICAgICAgaG9zdC10cmlwbGV0OgkkaG9zdAorIyAgICAgICAgIHNoZWxsOgkJJFNIRUxMCisjICAgICAgICAgY29tcGlsZXI6CQkkTFRDQworIyAgICAgICAgIGNvbXBpbGVyIGZsYWdzOgkJJExUQ0ZMQUdTCisjICAgICAgICAgbGlua2VyOgkJJExEIChnbnU/ICR3aXRoX2dudV9sZCkKKyMgICAgICAgICAkcHJvZ25hbWU6CShHTlUgbGlidG9vbCkgMi40LjIgRGViaWFuLTIuNC4yLTF1YnVudHUxCisjICAgICAgICAgYXV0b21ha2U6CSRhdXRvbWFrZV92ZXJzaW9uCisjICAgICAgICAgYXV0b2NvbmY6CSRhdXRvY29uZl92ZXJzaW9uCisjCisjIFJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4KKyMgR05VIGxpYnRvb2wgaG9tZSBwYWdlOiA8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYnRvb2wvPi4KKyMgR2VuZXJhbCBoZWxwIHVzaW5nIEdOVSBzb2Z0d2FyZTogPGh0dHA6Ly93d3cuZ251Lm9yZy9nZXRoZWxwLz4uCisKK1BST0dSQU09bGlidG9vbAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPSIyLjQuMiBEZWJpYW4tMi40LjItMXVidW50dTEiCitUSU1FU1RBTVA9IiIKK3BhY2thZ2VfcmV2aXNpb249MS4zMzM3CisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorJDEKK19MVEVDSE9fRU9GJworfQorCisjIE5MUyBudWlzYW5jZXM6IFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgorbHRfdXNlcl9sb2NhbGU9CitsdF9zYWZlX2xvY2FsZT0KK2ZvciBsdF92YXIgaW4gTEFORyBMQU5HVUFHRSBMQ19BTEwgTENfQ1RZUEUgTENfQ09MTEFURSBMQ19NRVNTQUdFUworZG8KKyAgZXZhbCAiaWYgdGVzdCBcIlwkeyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCisgICAgICAgICAgc2F2ZV8kbHRfdmFyPVwkJGx0X3ZhcgorICAgICAgICAgICRsdF92YXI9QworCSAgZXhwb3J0ICRsdF92YXIKKwkgIGx0X3VzZXJfbG9jYWxlPVwiJGx0X3Zhcj1cXFwkc2F2ZV9cJGx0X3ZhcjsgXCRsdF91c2VyX2xvY2FsZVwiCisJICBsdF9zYWZlX2xvY2FsZT1cIiRsdF92YXI9QzsgXCRsdF9zYWZlX2xvY2FsZVwiCisJZmkiCitkb25lCitMQ19BTEw9QworTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFIExDX0FMTAorCiskbHRfdW5zZXQgQ0RQQVRICisKKworIyBXb3JrIGFyb3VuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlIG9uIElSSVggNi41LiBPbiBJUklYIDYuNCssIHNoCisjIGlzIGtzaCBidXQgd2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCBhcyAic2giIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZgorIyB0aGUgX1hQRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gMSAob25lKSwgdGhlIHNwZWNpYWwKKyMgcG9zaXRpb25hbCBwYXJhbWV0ZXIgJDAsIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwsIGlzIHRoZSBuYW1lIG9mIHRoZQorIyBmdW5jdGlvbi4KK3Byb2dwYXRoPSIkMCIKKworCisKKzogJHtDUD0iY3AgLWYifQordGVzdCAiJHtFQ0hPK3NldH0iID0gc2V0IHx8IEVDSE89JHthc19lY2hvLSdwcmludGYgJXNcbid9Cis6ICR7TUFLRT0ibWFrZSJ9Cis6ICR7TUtESVI9Im1rZGlyIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9Cis6ICR7U0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9In0KKzogJHtYc2VkPSIkU0VEIC1lIDFzL15YLy8ifQorCisjIEdsb2JhbCB2YXJpYWJsZXM6CitFWElUX1NVQ0NFU1M9MAorRVhJVF9GQUlMVVJFPTEKK0VYSVRfTUlTTUFUQ0g9NjMgICMgJD8gPSA2MyBpcyB1c2VkIHRvIGluZGljYXRlIHZlcnNpb24gbWlzbWF0Y2ggdG8gbWlzc2luZy4KK0VYSVRfU0tJUD03NwkgICMgJD8gPSA3NyBpcyB1c2VkIHRvIGluZGljYXRlIGEgc2tpcHBlZCB0ZXN0IHRvIGF1dG9tYWtlLgorCitleGl0X3N0YXR1cz0kRVhJVF9TVUNDRVNTCisKKyMgTWFrZSBzdXJlIElGUyBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0CitsdF9ubD0nCisnCitJRlM9IiAJJGx0X25sIgorCitkaXJuYW1lPSJzLC9bXi9dKiQsLCIKK2Jhc2VuYW1lPSJzLF4uKi8sLCIKKworIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCisjIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KK2Z1bmNfZGlybmFtZSAoKQoreworICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRkaXJuYW1lImAKKyAgICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgICAgZmkKK30gIyBmdW5jX2Rpcm5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2Jhc2VuYW1lIGZpbGUKK2Z1bmNfYmFzZW5hbWUgKCkKK3sKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGJhc2VuYW1lImAKK30gIyBmdW5jX2Jhc2VuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KKyMgY2FsbDoKKyMgICBkaXJuYW1lOiAgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksCisjICAgICAgICAgICAgIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIHNldCByZXN1bHQKKyMgICAgICAgICAgICAgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisjICAgYmFzZW5hbWU6IENvbXB1dGUgZmlsZW5hbWUgb2YgRklMRS4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dW5lZCBpbiAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorIyBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggZnVuY19kaXJuYW1lCisjIGFuZCBmdW5jX2Jhc2VuYW1lLiBGb3IgZWZmaWNpZW5jeSwgd2UgZG8gbm90IGRlbGVnYXRlIHRvCisjIHRob3NlIGZ1bmN0aW9ucyBidXQgaW5zdGVhZCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgaGVyZS4KK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkKK3sKKyAgICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgLWUgIiRkaXJuYW1lImAKKyAgICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgICAgZmkKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAtZSAiJGJhc2VuYW1lImAKK30gIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorIyBmdW5jX3N0cmlwX3N1ZmZpeCBwcmVmaXggbmFtZQorZnVuY19zdHJpcG5hbWUgKCkKK3sKKyAgICBjYXNlICR7Mn0gaW4KKyAgICAgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyVcXFxcJHsyfVwkJSUiYDs7CisgICAgICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlJHsyfVwkJSUiYDs7CisgICAgZXNhYworfSAjIGZ1bmNfc3RyaXBuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgVGhlc2UgU0VEIHNjcmlwdHMgcHJlc3VwcG9zZSBhbiBhYnNvbHV0ZSBwYXRoIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KK3BhdGhjYXI9J3MsXi9cKFteL10qXCkuKiQsXDEsJworcGF0aGNkcj0ncyxeL1teL10qLCwnCityZW1vdmVkb3RwYXJ0cz0nOmRvdHNsCisJCXNAL1wuL0AvQGcKKwkJdCBkb3RzbAorCQlzLC9cLiQsLywnCitjb2xsYXBzZXNsYXNoZXM9J3NAL1x7MSxcfUAvQGcnCitmaW5hbHNsYXNoPSdzLC8qJCwvLCcKKworIyBmdW5jX25vcm1hbF9hYnNwYXRoIFBBVEgKKyMgUmVtb3ZlIGRvdWJsZWQtdXAgYW5kIHRyYWlsaW5nIHNsYXNoZXMsICIuIiBwYXRoIGNvbXBvbmVudHMsCisjIGFuZCBjYW5jZWwgb3V0IGFueSAiLi4iIHBhdGggY29tcG9uZW50cyBpbiBQQVRIIGFmdGVyIG1ha2luZworIyBpdCBhbiBhYnNvbHV0ZSBwYXRoLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IgorZnVuY19ub3JtYWxfYWJzcGF0aCAoKQoreworICAjIFN0YXJ0IGZyb20gcm9vdCBkaXIgYW5kIHJlYXNzZW1ibGUgdGhlIHBhdGguCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PQorICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPSQxCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfYWx0bmFtZXNwYWNlPQorICBjYXNlICRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIGluCisgICAgIiIpCisgICAgICAjIEVtcHR5IHBhdGgsIHRoYXQganVzdCBtZWFucyAkY3dkLgorICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICJgcHdkYCIKKyAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICAgIHJldHVybgorICAgIDs7CisgICAgIyBUaGUgbmV4dCB0aHJlZSBlbnRyaWVzIGFyZSB1c2VkIHRvIHNwb3QgYSBydW4gb2YgcHJlY2lzZWx5CisgICAgIyB0d28gbGVhZGluZyBzbGFzaGVzIHdpdGhvdXQgdXNpbmcgbmVnYXRlZCBjaGFyYWN0ZXIgY2xhc3NlczsKKyAgICAjIHdlIHRha2UgYWR2YW50YWdlIG9mIGNhc2UncyBmaXJzdC1tYXRjaCBiZWhhdmlvdXIuCisgICAgLy8vKikKKyAgICAgICMgVW51c3VhbCBmb3JtIG9mIGFic29sdXRlIHBhdGgsIGRvIG5vdGhpbmcuCisgICAgOzsKKyAgICAvLyopCisgICAgICAjIE5vdCBuZWNlc3NhcmlseSBhbiBvcmRpbmFyeSBwYXRoOyBQT1NJWCByZXNlcnZlcyBsZWFkaW5nICcvLycKKyAgICAgICMgYW5kIGZvciBleGFtcGxlIEN5Z3dpbiB1c2VzIGl0IHRvIGFjY2VzcyByZW1vdGUgZmlsZSBzaGFyZXMKKyAgICAgICMgb3ZlciBDSUZTL1NNQiwgc28gd2UgY29uc2VydmUgYSBsZWFkaW5nIGRvdWJsZSBzbGFzaCBpZiBmb3VuZC4KKyAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfYWx0bmFtZXNwYWNlPS8KKyAgICA7OworICAgIC8qKQorICAgICAgIyBBYnNvbHV0ZSBwYXRoLCBkbyBub3RoaW5nLgorICAgIDs7CisgICAgKikKKyAgICAgICMgUmVsYXRpdmUgcGF0aCwgcHJlcGVuZCAkY3dkLgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD1gcHdkYC8kZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aAorICAgIDs7CisgIGVzYWMKKyAgIyBDYW5jZWwgb3V0IGFsbCB0aGUgc2ltcGxlIHN0dWZmIHRvIHNhdmUgaXRlcmF0aW9ucy4gIFdlIGFsc28gd2FudAorICAjIHRoZSBwYXRoIHRvIGVuZCB3aXRoIGEgc2xhc2ggZm9yIGVhc2Ugb2YgcGFyc2luZywgc28gbWFrZSBzdXJlCisgICMgdGhlcmUgaXMgb25lIChhbmQgb25seSBvbmUpIGhlcmUuCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKKyAgICAgICAgLWUgIiRyZW1vdmVkb3RwYXJ0cyIgLWUgIiRjb2xsYXBzZXNsYXNoZXMiIC1lICIkZmluYWxzbGFzaCJgCisgIHdoaWxlIDo7IGRvCisgICAgIyBQcm9jZXNzZWQgaXQgYWxsIHlldD8KKyAgICBpZiB0ZXN0ICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgPSAvIDsgdGhlbgorICAgICAgIyBJZiB3ZSBhc2NlbmRlZCB0byB0aGUgcm9vdCB1c2luZyAiLi4iIHRoZSByZXN1bHQgbWF5IGJlIGVtcHR5IG5vdy4KKyAgICAgIGlmIHRlc3QgLXogIiRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdCIgOyB0aGVuCisgICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PS8KKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgICAgZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50PWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCisgICAgICAgIC1lICIkcGF0aGNhciJgCisgICAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAorICAgICAgICAtZSAiJHBhdGhjZHIiYAorICAgICMgRmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggaXQKKyAgICBjYXNlICRmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQgaW4KKyAgICAgICIiKQorICAgICAgICAjIFRyYWlsaW5nIGVtcHR5IHBhdGggY29tcG9uZW50LCBpZ25vcmUgaXQuCisgICAgICA7OworICAgICAgLi4pCisgICAgICAgICMgUGFyZW50IGRpcjsgc3RyaXAgbGFzdCBhc3NlbWJsZWQgY29tcG9uZW50IGZyb20gcmVzdWx0LgorICAgICAgICBmdW5jX2Rpcm5hbWUgIiRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdCIKKyAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKyAgICAgIDs7CisgICAgICAqKQorICAgICAgICAjIEFjdHVhbCBwYXRoIGNvbXBvbmVudCwgYXBwZW5kIGl0LgorICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQvJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudAorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIyBSZXN0b3JlIGxlYWRpbmcgZG91YmxlLXNsYXNoIGlmIG9uZSB3YXMgZm91bmQgb24gZW50cnkuCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAorfQorCisjIGZ1bmNfcmVsYXRpdmVfcGF0aCBTUkNESVIgRFNURElSCisjIGdlbmVyYXRlcyBhIHJlbGF0aXZlIHBhdGggZnJvbSBTUkNESVIgdG8gRFNURElSLCB3aXRoIGEgdHJhaWxpbmcKKyMgc2xhc2ggaWYgbm9uLWVtcHR5LCBzdWl0YWJsZSBmb3IgaW1tZWRpYXRlbHkgYXBwZW5kaW5nIGEgZmlsZW5hbWUKKyMgd2l0aG91dCBuZWVkaW5nIHRvIGFwcGVuZCBhIHNlcGFyYXRvci4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IgorZnVuY19yZWxhdGl2ZV9wYXRoICgpCit7CisgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9CisgIGZ1bmNfbm9ybWFsX2Fic3BhdGggIiQxIgorICBmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcj0kZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKKyAgZnVuY19ub3JtYWxfYWJzcGF0aCAiJDIiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyPSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAorCisgICMgQXNjZW5kIHRoZSB0cmVlIHN0YXJ0aW5nIGZyb20gbGliZGlyCisgIHdoaWxlIDo7IGRvCisgICAgIyBjaGVjayBpZiB3ZSBoYXZlIGZvdW5kIGEgcHJlZml4IG9mIGJpbmRpcgorICAgIGNhc2UgJGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyIGluCisgICAgICAkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIpCisgICAgICAgICMgZm91bmQgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9CisgICAgICAgIGJyZWFrCisgICAgICAgIDs7CisgICAgICAkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIqKQorICAgICAgICAjIGZvdW5kIGEgbWF0Y2hpbmcgcHJlZml4CisgICAgICAgIGZ1bmNfc3RyaXBuYW1lICIkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIiICcnICIkZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXIiCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiOyB0aGVuCisgICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX2Rpcm5hbWUgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyPSR7ZnVuY19kaXJuYW1lX3Jlc3VsdH0KKyAgICAgICAgaWYgdGVzdCAieCRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciIgPSB4IDsgdGhlbgorICAgICAgICAgICMgSGF2ZSB0byBkZXNjZW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IQorICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9Li4vJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQKKyAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0kZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXIKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4uLyRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0CisgICAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIyBOb3cgY2FsY3VsYXRlIHBhdGg7IHRha2UgY2FyZSB0byBhdm9pZCBkb3VibGluZy11cCBzbGFzaGVzLgorICBmdW5jX3N0cmlwbmFtZSAnJyAnLycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IgorICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgZnVuY19zdHJpcG5hbWUgJy8nICcvJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkIgorICBpZiB0ZXN0ICJ4JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIgIT0geCA7IHRoZW4KKyAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PSR7ZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdH0vJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9CisgIGZpCisKKyAgIyBOb3JtYWxpc2F0aW9uLiBJZiBiaW5kaXIgaXMgbGliZGlyLCByZXR1cm4gZW1wdHkgc3RyaW5nLAorICAjIGVsc2UgcmVsYXRpdmUgcGF0aCBlbmRpbmcgd2l0aCBhIHNsYXNoOyBlaXRoZXIgd2F5LCB0YXJnZXQKKyAgIyBmaWxlIG5hbWUgY2FuIGJlIGRpcmVjdGx5IGFwcGVuZGVkLgorICBpZiB0ZXN0ICEgLXogIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IjsgdGhlbgorICAgIGZ1bmNfc3RyaXBuYW1lICcuLycgJycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0LyIKKyAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgZmkKK30KKworIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW06CitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkcHJvZ3BhdGgiCitwcm9nbmFtZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKKworIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBwYXRoIGZvciByZWV4ZWN1dGlvbjoKK2Nhc2UgJHByb2dwYXRoIGluCisgIFtcXC9dKnxbQS1aYS16XTpcXCopIDs7CisgICpbXFwvXSopCisgICAgIHByb2dkaXI9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKyAgICAgcHJvZ2Rpcj1gY2QgIiRwcm9nZGlyIiAmJiBwd2RgCisgICAgIHByb2dwYXRoPSIkcHJvZ2Rpci8kcHJvZ25hbWUiCisgICAgIDs7CisgICopCisgICAgIHNhdmVfSUZTPSIkSUZTIgorICAgICBJRlM9JHtQQVRIX1NFUEFSQVRPUi06fQorICAgICBmb3IgcHJvZ2RpciBpbiAkUEFUSDsgZG8KKyAgICAgICBJRlM9IiRzYXZlX0lGUyIKKyAgICAgICB0ZXN0IC14ICIkcHJvZ2Rpci8kcHJvZ25hbWUiICYmIGJyZWFrCisgICAgIGRvbmUKKyAgICAgSUZTPSIkc2F2ZV9JRlMiCisgICAgIHRlc3QgLW4gIiRwcm9nZGlyIiB8fCBwcm9nZGlyPWBwd2RgCisgICAgIHByb2dwYXRoPSIkcHJvZ2Rpci8kcHJvZ25hbWUiCisgICAgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSIke1NFRH0iJyAtZSAxcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW2AiJFxcXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbImBcXF1cKS9cXFwxL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IHR1cm5zIGEgc3RyaW5nIGludG8gYSByZWdleCBtYXRjaGluZyBmb3IgdGhlCisjIHN0cmluZyBsaXRlcmFsbHkuCitzZWRfbWFrZV9saXRlcmFsX3JlZ2V4PSdzLFtdLlteJFxcKlwvXSxcXCYsZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgY29udmVydHMgYSB3MzIgZmlsZSBuYW1lIG9yIHBhdGgKKyMgd2hpY2ggY29udGFpbnMgZm9yd2FyZCBzbGFzaGVzLCBpbnRvIG9uZSB0aGF0IGNvbnRhaW5zCisjIChlc2NhcGVkKSBiYWNrc2xhc2hlcy4gIEEgdmVyeSBuYWl2ZSBpbXBsZW1lbnRhdGlvbi4KK2x0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnk9J3N8XFxcXCp8XFx8ZztzfC98XFx8ZztzfFxcfFxcXFx8ZycKKworIyBSZS1gXCcgcGFyYW1ldGVyIGV4cGFuc2lvbnMgaW4gb3V0cHV0IG9mIGRvdWJsZV9xdW90ZV9zdWJzdCB0aGF0IHdlcmUKKyMgYFwnLWVkIGluIGlucHV0IHRvIHRoZSBzYW1lLiAgSWYgYW4gb2RkIG51bWJlciBvZiBgXCcgcHJlY2VkZWQgYSAnJCcKKyMgaW4gaW5wdXQgdG8gZG91YmxlX3F1b3RlX3N1YnN0LCB0aGF0ICckJyB3YXMgcHJvdGVjdGVkIGZyb20gZXhwYW5zaW9uLgorIyBTaW5jZSBlYWNoIGlucHV0IGBcJyBpcyBub3cgdHdvIGBcJ3MsIGxvb2sgZm9yIGFueSBudW1iZXIgb2YgcnVucyBvZgorIyBmb3VyIGBcJ3MgZm9sbG93ZWQgYnkgdHdvIGBcJ3MgYW5kIHRoZW4gYSAnJCcuICBgXCcgdGhhdCAnJCcuCiticz0nXFwnCiticzI9J1xcXFwnCiticzQ9J1xcXFxcXFxcJworZG9sbGFyPSdcJCcKK3NlZF9kb3VibGVfYmFja3NsYXNoPSJcCisgIHMvJGJzNC8mXFwKKy9nCisgIHMvXiRiczIkZG9sbGFyLyRicyYvCisgIHMvXFwoW14kYnNdXFwpJGJzMiRkb2xsYXIvXFwxJGJzMiRicyRkb2xsYXIvZworICBzL1xuLy9nIgorCisjIFN0YW5kYXJkIG9wdGlvbnM6CitvcHRfZHJ5X3J1bj1mYWxzZQorb3B0X2hlbHA9ZmFsc2UKK29wdF9xdWlldD1mYWxzZQorb3B0X3ZlcmJvc2U9ZmFsc2UKK29wdF93YXJuaW5nPToKKworIyBmdW5jX2VjaG8gYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UsIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgbW9kZQorIyBuYW1lIGlmIGl0IGhhcyBiZWVuIHNldCB5ZXQuCitmdW5jX2VjaG8gKCkKK3sKKyAgICAkRUNITyAiJHByb2duYW1lOiAke29wdF9tb2RlKyRvcHRfbW9kZTogfSQqIgorfQorCisjIGZ1bmNfdmVyYm9zZSBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSBpbiB2ZXJib3NlIG1vZGUgb25seS4KK2Z1bmNfdmVyYm9zZSAoKQoreworICAgICRvcHRfdmVyYm9zZSAmJiBmdW5jX2VjaG8gJHsxKyIkQCJ9CisKKyAgICAjIEEgYnVnIGluIGJhc2ggaGFsdHMgdGhlIHNjcmlwdCBpZiB0aGUgbGFzdCBsaW5lIG9mIGEgZnVuY3Rpb24KKyAgICAjIGZhaWxzIHdoZW4gc2V0IC1lIGlzIGluIGZvcmNlLCBzbyB3ZSBuZWVkIGFub3RoZXIgY29tbWFuZCB0bworICAgICMgd29yayBhcm91bmQgdGhhdDoKKyAgICA6Cit9CisKKyMgZnVuY19lY2hvX2FsbCBhcmcuLi4KKyMgSW52b2tlICRFQ0hPIHdpdGggYWxsIGFyZ3MsIHNwYWNlLXNlcGFyYXRlZC4KK2Z1bmNfZWNob19hbGwgKCkKK3sKKyAgICAkRUNITyAiJCoiCit9CisKKyMgZnVuY19lcnJvciBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KK2Z1bmNfZXJyb3IgKCkKK3sKKyAgICAkRUNITyAiJHByb2duYW1lOiAke29wdF9tb2RlKyRvcHRfbW9kZTogfSIkezErIiRAIn0gMT4mMgorfQorCisjIGZ1bmNfd2FybmluZyBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgd2FybmluZyBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgorZnVuY193YXJuaW5nICgpCit7CisgICAgJG9wdF93YXJuaW5nICYmICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9d2FybmluZzogIiR7MSsiJEAifSAxPiYyCisKKyAgICAjIGJhc2ggYnVnIGFnYWluOgorICAgIDoKK30KKworIyBmdW5jX2ZhdGFsX2Vycm9yIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfZXJyb3IgKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorfQorCisjIGZ1bmNfZmF0YWxfaGVscCBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKKyMgYSBoZWxwIGhpbnQsIGFuZCBleGl0LgorZnVuY19mYXRhbF9oZWxwICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBmdW5jX2ZhdGFsX2Vycm9yICIkaGVscCIKK30KK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgICMjIGRlZmF1bHQKKworCisjIGZ1bmNfZ3JlcCBleHByZXNzaW9uIGZpbGVuYW1lCisjIENoZWNrIHdoZXRoZXIgRVhQUkVTU0lPTiBtYXRjaGVzIGFueSBsaW5lIG9mIEZJTEVOQU1FLCB3aXRob3V0IG91dHB1dC4KK2Z1bmNfZ3JlcCAoKQoreworICAgICRHUkVQICIkMSIgIiQyIiA+L2Rldi9udWxsIDI+JjEKK30KKworCisjIGZ1bmNfbWtkaXJfcCBkaXJlY3RvcnktcGF0aAorIyBNYWtlIHN1cmUgdGhlIGVudGlyZSBwYXRoIHRvIERJUkVDVE9SWS1QQVRIIGlzIGF2YWlsYWJsZS4KK2Z1bmNfbWtkaXJfcCAoKQoreworICAgIG15X2RpcmVjdG9yeV9wYXRoPSIkMSIKKyAgICBteV9kaXJfbGlzdD0KKworICAgIGlmIHRlc3QgLW4gIiRteV9kaXJlY3RvcnlfcGF0aCIgJiYgdGVzdCAiJG9wdF9kcnlfcnVuIiAhPSAiOiI7IHRoZW4KKworICAgICAgIyBQcm90ZWN0IGRpcmVjdG9yeSBuYW1lcyBzdGFydGluZyB3aXRoIGAtJworICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4KKyAgICAgICAgLSopIG15X2RpcmVjdG9yeV9wYXRoPSIuLyRteV9kaXJlY3RvcnlfcGF0aCIgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBXaGlsZSBzb21lIHBvcnRpb24gb2YgRElSIGRvZXMgbm90IHlldCBleGlzdC4uLgorICAgICAgd2hpbGUgdGVzdCAhIC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiOyBkbworICAgICAgICAjIC4uLm1ha2UgYSBsaXN0IGluIHRvcG1vc3QgZmlyc3Qgb3JkZXIuICBVc2UgYSBjb2xvbiBkZWxpbWl0ZWQKKwkjIGxpc3QgaW5jYXNlIHNvbWUgcG9ydGlvbiBvZiBwYXRoIGNvbnRhaW5zIHdoaXRlc3BhY2UuCisgICAgICAgIG15X2Rpcl9saXN0PSIkbXlfZGlyZWN0b3J5X3BhdGg6JG15X2Rpcl9saXN0IgorCisgICAgICAgICMgSWYgdGhlIGxhc3QgcG9ydGlvbiBhZGRlZCBoYXMgbm8gc2xhc2ggaW4gaXQsIHRoZSBsaXN0IGlzIGRvbmUKKyAgICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4gKi8qKSA7OyAqKSBicmVhayA7OyBlc2FjCisKKyAgICAgICAgIyAuLi5vdGhlcndpc2UgdGhyb3cgYXdheSB0aGUgY2hpbGQgZGlyZWN0b3J5IGFuZCBsb29wCisgICAgICAgIG15X2RpcmVjdG9yeV9wYXRoPWAkRUNITyAiJG15X2RpcmVjdG9yeV9wYXRoIiB8ICRTRUQgLWUgIiRkaXJuYW1lImAKKyAgICAgIGRvbmUKKyAgICAgIG15X2Rpcl9saXN0PWAkRUNITyAiJG15X2Rpcl9saXN0IiB8ICRTRUQgJ3MsOiokLCwnYAorCisgICAgICBzYXZlX21rZGlyX3BfSUZTPSIkSUZTIjsgSUZTPSc6JworICAgICAgZm9yIG15X2RpciBpbiAkbXlfZGlyX2xpc3Q7IGRvCisJSUZTPSIkc2F2ZV9ta2Rpcl9wX0lGUyIKKyAgICAgICAgIyBta2RpciBjYW4gZmFpbCB3aXRoIGEgYEZpbGUgZXhpc3QnIGVycm9yIGlmIHR3byBwcm9jZXNzZXMKKyAgICAgICAgIyB0cnkgdG8gY3JlYXRlIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgY29uY3VycmVudGx5LiAgRG9uJ3QKKyAgICAgICAgIyBzdG9wIGluIHRoYXQgY2FzZSEKKyAgICAgICAgJE1LRElSICIkbXlfZGlyIiAyPi9kZXYvbnVsbCB8fCA6CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgorCisgICAgICAjIEJhaWwgb3V0IGlmIHdlIChvciBzb21lIG90aGVyIHByb2Nlc3MpIGZhaWxlZCB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisgICAgICB0ZXN0IC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiIHx8IFwKKyAgICAgICAgZnVuY19mYXRhbF9lcnJvciAiRmFpbGVkIHRvIGNyZWF0ZSBcYCQxJyIKKyAgICBmaQorfQorCisKKyMgZnVuY19ta3RlbXBkaXIgW3N0cmluZ10KKyMgTWFrZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3b24ndCBjbGFzaCB3aXRoIG90aGVyIHJ1bm5pbmcKKyMgbGlidG9vbCBwcm9jZXNzZXMsIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGlmIHBvc3NpYmxlLiAgSWYKKyMgZ2l2ZW4sIFNUUklORyBpcyB0aGUgYmFzZW5hbWUgZm9yIHRoYXQgZGlyZWN0b3J5LgorZnVuY19ta3RlbXBkaXIgKCkKK3sKKyAgICBteV90ZW1wbGF0ZT0iJHtUTVBESVItL3RtcH0vJHsxLSRwcm9nbmFtZX0iCisKKyAgICBpZiB0ZXN0ICIkb3B0X2RyeV9ydW4iID0gIjoiOyB0aGVuCisgICAgICAjIFJldHVybiBhIGRpcmVjdG9yeSBuYW1lLCBidXQgZG9uJ3QgY3JlYXRlIGl0IGluIGRyeS1ydW4gbW9kZQorICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0kJCIKKyAgICBlbHNlCisKKyAgICAgICMgSWYgbWt0ZW1wIHdvcmtzLCB1c2UgdGhhdCBmaXJzdCBhbmQgZm9yZW1vc3QKKyAgICAgIG15X3RtcGRpcj1gbWt0ZW1wIC1kICIke215X3RlbXBsYXRlfS1YWFhYWFhYWCIgMj4vZGV2L251bGxgCisKKyAgICAgIGlmIHRlc3QgISAtZCAiJG15X3RtcGRpciI7IHRoZW4KKyAgICAgICAgIyBGYWlsaW5nIHRoYXQsIGF0IGxlYXN0IHRyeSBhbmQgdXNlICRSQU5ET00gdG8gYXZvaWQgYSByYWNlCisgICAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJHtSQU5ET00tMH0kJCIKKworICAgICAgICBzYXZlX21rdGVtcGRpcl91bWFzaz1gdW1hc2tgCisgICAgICAgIHVtYXNrIDAwNzcKKyAgICAgICAgJE1LRElSICIkbXlfdG1wZGlyIgorICAgICAgICB1bWFzayAkc2F2ZV9ta3RlbXBkaXJfdW1hc2sKKyAgICAgIGZpCisKKyAgICAgICMgSWYgd2UncmUgbm90IGluIGRyeS1ydW4gbW9kZSwgYm9tYiBvdXQgb24gZmFpbHVyZQorICAgICAgdGVzdCAtZCAiJG15X3RtcGRpciIgfHwgXAorICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkbXlfdG1wZGlyJyIKKyAgICBmaQorCisgICAgJEVDSE8gIiRteV90bXBkaXIiCit9CisKKworIyBmdW5jX3F1b3RlX2Zvcl9ldmFsIGFyZworIyBBZXN0aGV0aWNhbGx5IHF1b3RlIEFSRyB0byBiZSBldmFsZWQgbGF0ZXIuCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzOiBGVU5DX1FVT1RFX0ZPUl9FVkFMX1JFU1VMVAorIyBpcyBkb3VibGUtcXVvdGVkLCBzdWl0YWJsZSBmb3IgYSBzdWJzZXF1ZW50IGV2YWwsIHdoZXJlYXMKKyMgRlVOQ19RVU9URV9GT1JfRVZBTF9VTlFVT1RFRF9SRVNVTFQgaGFzIG1lcmVseSBhbGwgY2hhcmFjdGVycworIyB3aGljaCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUgcXVvdGVzIGJhY2tzbGFzaGlmaWVkLgorZnVuY19xdW90ZV9mb3JfZXZhbCAoKQoreworICAgIGNhc2UgJDEgaW4KKyAgICAgICpbXFxcYFwiXCRdKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD1gJEVDSE8gIiQxIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYCA7OworICAgICAgKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9IiQxIiA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IGluCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gZGVsYXkKKyAgICAgICMgd29yZCBzcGxpdHRpbmcsIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGFuZCBhbmQgdmFyaWFibGUKKyAgICAgICMgZXhwYW5zaW9uIGZvciBhIHN1YnNlcXVlbnQgZXZhbC4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisgICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0PSJcIiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdFwiIgorICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdCIKKyAgICBlc2FjCit9CisKKworIyBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgYXJnCisjIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlcjsgc2FtZSBhcyBhYm92ZSwKKyMgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZnVuY19xdW90ZV9mb3JfZXhwYW5kICgpCit7CisgICAgY2FzZSAkMSBpbgorICAgICAgKltcXFxgXCJdKikKKwlteV9hcmc9YCRFQ0hPICIkMSIgfCAkU0VEIFwKKwkgICAgLWUgIiRkb3VibGVfcXVvdGVfc3Vic3QiIC1lICIkc2VkX2RvdWJsZV9iYWNrc2xhc2giYCA7OworICAgICAgKikKKyAgICAgICAgbXlfYXJnPSIkMSIgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRteV9hcmcgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQorICAgICAgIyB3b3JkIHNwbGl0dGluZyBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgICAgbXlfYXJnPSJcIiRteV9hcmdcIiIKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0PSIkbXlfYXJnIgorfQorCisKKyMgZnVuY19zaG93X2V2YWwgY21kIFtmYWlsX2V4cF0KKyMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcworIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKKyMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuCitmdW5jX3Nob3dfZXZhbCAoKQoreworICAgIG15X2NtZD0iJDEiCisgICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKKworICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgeworICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgorICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorICAgIH0KKworICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKKyAgICAgIGV2YWwgIiRteV9jbWQiCisgICAgICBteV9zdGF0dXM9JD8KKyAgICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1lcSAwOyB0aGVuIDo7IGVsc2UKKwlldmFsICIoZXhpdCAkbXlfc3RhdHVzKTsgJG15X2ZhaWxfZXhwIgorICAgICAgZmkKKyAgICBmaQorfQorCisKKyMgZnVuY19zaG93X2V2YWxfbG9jYWxlIGNtZCBbZmFpbF9leHBdCisjIFVubGVzcyBvcHRfc2lsZW50IGlzIHRydWUsIHRoZW4gb3V0cHV0IENNRC4gIFRoZW4sIGlmIG9wdF9kcnlydW4gaXMKKyMgbm90IHRydWUsIGV2YWx1YXRlIENNRC4gIElmIHRoZSBldmFsdWF0aW9uIG9mIENNRCBmYWlscywgYW5kIEZBSUxfRVhQCisjIGlzIGdpdmVuLCB0aGVuIGV2YWx1YXRlIGl0LiAgVXNlIHRoZSBzYXZlZCBsb2NhbGUgZm9yIGV2YWx1YXRpb24uCitmdW5jX3Nob3dfZXZhbF9sb2NhbGUgKCkKK3sKKyAgICBteV9jbWQ9IiQxIgorICAgIG15X2ZhaWxfZXhwPSIkezItOn0iCisKKyAgICAke29wdF9zaWxlbnQtZmFsc2V9IHx8IHsKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJG15X2NtZCIKKyAgICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKyAgICB9CisKKyAgICBpZiAke29wdF9kcnlfcnVuLWZhbHNlfTsgdGhlbiA6OyBlbHNlCisgICAgICBldmFsICIkbHRfdXNlcl9sb2NhbGUKKwkgICAgJG15X2NtZCIKKyAgICAgIG15X3N0YXR1cz0kPworICAgICAgZXZhbCAiJGx0X3NhZmVfbG9jYWxlIgorICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQorCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCisgICAgICBmaQorICAgIGZpCit9CisKKyMgZnVuY190cl9zaAorIyBUdXJuICQxIGludG8gYSBzdHJpbmcgc3VpdGFibGUgZm9yIGEgc2hlbGwgdmFyaWFibGUgbmFtZS4KKyMgUmVzdWx0IGlzIHN0b3JlZCBpbiAkZnVuY190cl9zaF9yZXN1bHQuICBBbGwgY2hhcmFjdGVycworIyBub3QgaW4gdGhlIHNldCBhLXpBLVowLTlfIGFyZSByZXBsYWNlZCB3aXRoICdfJy4gRnVydGhlciwKKyMgaWYgJDEgYmVnaW5zIHdpdGggYSBkaWdpdCwgYSAnXycgaXMgcHJlcGVuZGVkIGFzIHdlbGwuCitmdW5jX3RyX3NoICgpCit7CisgIGNhc2UgJDEgaW4KKyAgWzAtOV0qIHwgKlshYS16QS1aMC05X10qKQorICAgIGZ1bmNfdHJfc2hfcmVzdWx0PWAkRUNITyAiJDEiIHwgJFNFRCAncy9eXChbMC05XVwpL19cMS87IHMvW15hLXpBLVowLTlfXS9fL2cnYAorICAgIDs7CisgICogKQorICAgIGZ1bmNfdHJfc2hfcmVzdWx0PSQxCisgICAgOzsKKyAgZXNhYworfQorCisKKyMgZnVuY192ZXJzaW9uCisjIEVjaG8gdmVyc2lvbiBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfdmVyc2lvbiAoKQoreworICAgICRvcHRfZGVidWcKKworICAgICRTRUQgLW4gJy8oQykvIWIgZ28KKwk6bW9yZQorCS9cLi8heworCSAgTgorCSAgcy9cbiMgLyAvCisJICBiIG1vcmUKKwl9CisJOmdvCisJL14jICckUFJPR1JBTScgKEdOVSAvLC8jIHdhcnJhbnR5OyAvIHsKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworICAgICAgICBzL1woKEMpXClbIDAtOSwtXSpcKCBbMS05XVswLTldKlwpL1wxXDIvCisgICAgICAgIHAKKyAgICAgfScgPCAiJHByb2dwYXRoIgorICAgICBleGl0ICQ/Cit9CisKKyMgZnVuY191c2FnZQorIyBFY2hvIHNob3J0IGhlbHAgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCitmdW5jX3VzYWdlICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sL14jICAqLiotLWhlbHAvIHsKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworCXMvXCRwcm9nbmFtZS8nJHByb2duYW1lJy8KKwlwCisgICAgfScgPCAiJHByb2dwYXRoIgorICAgIGVjaG8KKyAgICAkRUNITyAicnVuIFxgJHByb2duYW1lIC0taGVscCB8IG1vcmUnIGZvciBmdWxsIHVzYWdlIgorICAgIGV4aXQgJD8KK30KKworIyBmdW5jX2hlbHAgW05PRVhJVF0KKyMgRWNobyBsb25nIGhlbHAgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQsCisjIHVubGVzcyAnbm9leGl0JyBpcyBwYXNzZWQgYXMgYXJndW1lbnQuCitmdW5jX2hlbHAgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvIyBSZXBvcnQgYnVncyB0by8geworCTpwcmludAorICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisJcypcJHByb2duYW1lKickcHJvZ25hbWUnKgorCXMqXCRob3N0KiciJGhvc3QiJyoKKwlzKlwkU0hFTEwqJyIkU0hFTEwiJyoKKwlzKlwkTFRDQyonIiRMVENDIicqCisJcypcJExUQ0ZMQUdTKiciJExUQ0ZMQUdTIicqCisJcypcJExEKiciJExEIicqCisJcy9cJHdpdGhfZ251X2xkLyciJHdpdGhfZ251X2xkIicvCisJcy9cJGF1dG9tYWtlX3ZlcnNpb24vJyJgKCR7QVVUT01BS0UtYXV0b21ha2V9IC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcy9cJGF1dG9jb25mX3ZlcnNpb24vJyJgKCR7QVVUT0NPTkYtYXV0b2NvbmZ9IC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcAorCWQKKyAgICAgfQorICAgICAvXiMgLiogaG9tZSBwYWdlOi9iIHByaW50CisgICAgIC9eIyBHZW5lcmFsIGhlbHAgdXNpbmcvYiBwcmludAorICAgICAnIDwgIiRwcm9ncGF0aCIKKyAgICByZXQ9JD8KKyAgICBpZiB0ZXN0IC16ICIkMSI7IHRoZW4KKyAgICAgIGV4aXQgJHJldAorICAgIGZpCit9CisKKyMgZnVuY19taXNzaW5nX2FyZyBhcmduYW1lCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IgYW5kIHNldCBnbG9iYWwKKyMgZXhpdF9jbWQuCitmdW5jX21pc3NpbmdfYXJnICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgZnVuY19lcnJvciAibWlzc2luZyBhcmd1bWVudCBmb3IgJDEuIgorICAgIGV4aXRfY21kPWV4aXQKK30KKworCisjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IHNob3J0b3B0CisjIFNldCBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lIGFuZCBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmcgc2hlbGwKKyMgdmFyaWFibGVzIGFmdGVyIHNwbGl0dGluZyBTSE9SVE9QVCBhZnRlciB0aGUgMm5kIGNoYXJhY3Rlci4KK2Z1bmNfc3BsaXRfc2hvcnRfb3B0ICgpCit7CisgICAgbXlfc2VkX3Nob3J0X29wdD0nMXMvXlwoLi5cKS4qJC9cMS87cScKKyAgICBteV9zZWRfc2hvcnRfcmVzdD0nMXMvXi4uXCguKlwpJC9cMS87cScKKworICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWU9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX3Nob3J0X29wdCJgCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9zaG9ydF9yZXN0ImAKK30gIyBmdW5jX3NwbGl0X3Nob3J0X29wdCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgbG9uZ29wdAorIyBTZXQgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lIGFuZCBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZyBzaGVsbAorIyB2YXJpYWJsZXMgYWZ0ZXIgc3BsaXR0aW5nIExPTkdPUFQgYXQgdGhlIGA9JyBzaWduLgorZnVuY19zcGxpdF9sb25nX29wdCAoKQoreworICAgIG15X3NlZF9sb25nX29wdD0nMXMvXlwoLS1bXj1dKlwpPS4qL1wxLztxJworICAgIG15X3NlZF9sb25nX2FyZz0nMXMvXi0tW149XSo9Ly8nCisKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX2xvbmdfb3B0ImAKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfbG9uZ19hcmciYAorfSAjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKK2V4aXRfY21kPToKKworCisKKworCittYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCittYWdpY19leGU9IiUlJU1BR0lDIEVYRSB2YXJpYWJsZSUlJSIKKworIyBHbG9iYWwgdmFyaWFibGVzLgorbm9ub3B0PQorcHJlc2VydmVfYXJncz0KK2xvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKK28ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKK2V4dHJhY3RlZF9hcmNoaXZlcz0KK2V4dHJhY3RlZF9zZXJpYWw9MAorCisjIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKKyMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZworIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgorZXhlY19jbWQ9CisKKyMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCisjIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KK2Z1bmNfYXBwZW5kICgpCit7CisgICAgZXZhbCAiJHsxfT1cJCR7MX1cJHsyfSIKK30gIyBmdW5jX2FwcGVuZCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworIyBmdW5jX2FwcGVuZF9xdW90ZWQgdmFyIHZhbHVlCisjIFF1b3RlIFZBTFVFIGFuZCBhcHBlbmQgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIsIHNlcGFyYXRlZAorIyBieSBhIHNwYWNlLgorZnVuY19hcHBlbmRfcXVvdGVkICgpCit7CisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHsyfSIKKyAgICBldmFsICIkezF9PVwkJHsxfVxcIFwkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCit9ICMgZnVuY19hcHBlbmRfcXVvdGVkIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KK2Z1bmNfYXJpdGggKCkKK3sKKyAgICBmdW5jX2FyaXRoX3Jlc3VsdD1gZXhwciAiJHtAfSJgCit9ICMgZnVuY19hcml0aCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfbGVuIHN0cmluZworIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgorZnVuY19sZW4gKCkKK3sKKyAgICBmdW5jX2xlbl9yZXN1bHQ9YGV4cHIgIiR7MX0iIDogIi4qIiAyPi9kZXYvbnVsbCB8fCBlY2hvICRtYXhfY21kX2xlbmAKK30gIyBmdW5jX2xlbiBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfbG8ybyBvYmplY3QKK2Z1bmNfbG8ybyAoKQoreworICAgIGZ1bmNfbG8yb19yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRsbzJvImAKK30gIyBmdW5jX2xvMm8gbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKK2Z1bmNfeGZvcm0gKCkKK3sKKyAgICBmdW5jX3hmb3JtX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAncy9cLlteLl0qJC8ubG8vJ2AKK30gIyBmdW5jX3hmb3JtIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQorIyBhIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBoaW50LCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZnVuY19lcnJvciAiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiIKK30KKworCisjIGZ1bmNfY29uZmlnCisjIERpc3BsYXkgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCB0aGUgdGFncyBpbiB0aGlzIHNjcmlwdC4KK2Z1bmNfY29uZmlnICgpCit7CisgICAgcmVfYmVnaW5jZj0nXiMgIyMjIEJFR0lOIExJQlRPT0wnCisgICAgcmVfZW5kY2Y9J14jICMjIyBFTkQgTElCVE9PTCcKKworICAgICMgRGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICRTRUQgIjEsLyRyZV9iZWdpbmNmIENPTkZJRy9kOy8kcmVfZW5kY2YgQ09ORklHLyxcJGQiIDwgIiRwcm9ncGF0aCIKKworICAgICMgTm93IHByaW50IHRoZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHRhZ3MuCisgICAgZm9yIHRhZ25hbWUgaW4gJHRhZ2xpc3Q7IGRvCisgICAgICAkU0VEIC1uICIvJHJlX2JlZ2luY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC8sLyRyZV9lbmRjZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkL3AiIDwgIiRwcm9ncGF0aCIKKyAgICBkb25lCisKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19mZWF0dXJlcworIyBEaXNwbGF5IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCitmdW5jX2ZlYXR1cmVzICgpCit7CisgICAgZWNobyAiaG9zdDogJGhvc3QiCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfZW5hYmxlX3RhZyB0YWduYW1lCisjIFZlcmlmeSB0aGF0IFRBR05BTUUgaXMgdmFsaWQsIGFuZCBlaXRoZXIgZmxhZyBhbiBlcnJvciBhbmQgZXhpdCwgb3IKKyMgZW5hYmxlIHRoZSBUQUdOQU1FIHRhZy4gIFdlIGFsc28gYWRkIFRBR05BTUUgdG8gdGhlIGdsb2JhbCAkdGFnbGlzdAorIyB2YXJpYWJsZSBoZXJlLgorZnVuY19lbmFibGVfdGFnICgpCit7CisgICMgR2xvYmFsIHZhcmlhYmxlOgorICB0YWduYW1lPSIkMSIKKworICByZV9iZWdpbmNmPSJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgorICByZV9lbmRjZj0iXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHNlZF9leHRyYWN0Y2Y9Ii8kcmVfYmVnaW5jZi8sLyRyZV9lbmRjZi9wIgorCisgICMgVmFsaWRhdGUgdGFnbmFtZS4KKyAgY2FzZSAkdGFnbmFtZSBpbgorICAgICpbIS1fQS1aYS16MC05LC9dKikKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIgorICAgICAgOzsKKyAgZXNhYworCisgICMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdyBpdCdzCisgICMgdGhlcmUgYnV0IG5vdCBzcGVjaWFsbHkgbWFya2VkLgorICBjYXNlICR0YWduYW1lIGluCisgICAgQ0MpIDs7CisgICAgKikKKyAgICAgIGlmICRHUkVQICIkcmVfYmVnaW5jZiIgIiRwcm9ncGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCisKKwkjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLiAgQmUgY2FyZWZ1bCB0byBxdW90ZSB0aGUgcGF0aAorCSMgYW5kIHRoZSBzZWQgc2NyaXB0LCB0byBhdm9pZCBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSwgYnV0CisJIyBhbHNvIGRvbid0IHVzZSBub24tcG9ydGFibGUgcXVvdGVzIHdpdGhpbiBiYWNrcXVvdGVzIHdpdGhpbgorCSMgcXVvdGVzIHdlIGhhdmUgdG8gZG8gaXQgaW4gMiBzdGVwczoKKwlleHRyYWN0ZWRjZj1gJFNFRCAtbiAtZSAiJHNlZF9leHRyYWN0Y2YiIDwgIiRwcm9ncGF0aCJgCisJZXZhbCAiJGV4dHJhY3RlZGNmIgorICAgICAgZWxzZQorCWZ1bmNfZXJyb3IgImlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIgorICAgICAgZmkKKyAgICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2gKKyMgRW5zdXJlIHRoYXQgd2UgYXJlIHVzaW5nIG00IG1hY3JvcywgYW5kIGxpYnRvb2wgc2NyaXB0IGZyb20gdGhlIHNhbWUKKyMgcmVsZWFzZSBvZiBsaWJ0b29sLgorZnVuY19jaGVja192ZXJzaW9uX21hdGNoICgpCit7CisgIGlmIHRlc3QgIiRwYWNrYWdlX3JldmlzaW9uIiAhPSAiJG1hY3JvX3JldmlzaW9uIjsgdGhlbgorICAgIGlmIHRlc3QgIiRWRVJTSU9OIiAhPSAiJG1hY3JvX3ZlcnNpb24iOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KKyAgICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKKyRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIGJ1dCB0aGUKKyRwcm9nbmFtZTogZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSBhbiBvbGRlciByZWxlYXNlLgorJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSAkUEFDS0FHRSAkVkVSU0lPTgorJHByb2duYW1lOiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgorX0xUX0VPRgorICAgICAgZWxzZQorICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQorJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tICRQQUNLQUdFICRtYWNyb192ZXJzaW9uLgorJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSAkUEFDS0FHRSAkVkVSU0lPTgorJHByb2duYW1lOiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgorX0xUX0VPRgorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24sCiskcHJvZ25hbWU6IGJ1dCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSByZXZpc2lvbiAkbWFjcm9fcmV2aXNpb24uCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tIHJldmlzaW9uICRwYWNrYWdlX3JldmlzaW9uCiskcHJvZ25hbWU6IG9mICRQQUNLQUdFICRWRVJTSU9OIGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgZmkKKworICAgIGV4aXQgJEVYSVRfTUlTTUFUQ0gKKyAgZmkKK30KKworCisjIFNob3J0aGFuZCBmb3IgLS1tb2RlPWZvbywgb25seSB2YWxpZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKK2Nhc2UgJDEgaW4KK2NsZWFufGNsZWF8Y2xlfGNsKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBjbGVhbiAkezErIiRAIn07IHNoaWZ0CisgIDs7Citjb21waWxlfGNvbXBpbHxjb21waXxjb21wfGNvbXxjb3xjKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBjb21waWxlICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2V4ZWN1dGV8ZXhlY3V0fGV4ZWN1fGV4ZWN8ZXhlfGV4fGUpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGV4ZWN1dGUgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworZmluaXNofGZpbmlzfGZpbml8ZmlufGZpfGYpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGZpbmlzaCAkezErIiRAIn07IHNoaWZ0CisgIDs7CitpbnN0YWxsfGluc3RhbHxpbnN0YXxpbnN0fGluc3xpbnxpKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBpbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2xpbmt8bGlufGxpfGwpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGxpbmsgJHsxKyIkQCJ9OyBzaGlmdAorICA7OwordW5pbnN0YWxsfHVuaW5zdGFsfHVuaW5zdGF8dW5pbnN0fHVuaW5zfHVuaW58dW5pfHVufHUpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIHVuaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0CisgIDs7Citlc2FjCisKKworCisjIE9wdGlvbiBkZWZhdWx0czoKK29wdF9kZWJ1Zz06CitvcHRfZHJ5X3J1bj1mYWxzZQorb3B0X2NvbmZpZz1mYWxzZQorb3B0X3ByZXNlcnZlX2R1cF9kZXBzPWZhbHNlCitvcHRfZmVhdHVyZXM9ZmFsc2UKK29wdF9maW5pc2g9ZmFsc2UKK29wdF9oZWxwPWZhbHNlCitvcHRfaGVscF9hbGw9ZmFsc2UKK29wdF9zaWxlbnQ9Ogorb3B0X3dhcm5pbmc9Ogorb3B0X3ZlcmJvc2U9Ogorb3B0X3NpbGVudD1mYWxzZQorb3B0X3ZlcmJvc2U9ZmFsc2UKKworCisjIFBhcnNlIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4gIFRoaXMgY29tZXMgYXMgc29vbiBhcyBwb3NzaWJsZSBpbiB0aGUKKyMgc2NyaXB0IHRvIG1ha2UgdGhpbmdzIGxpa2UgYC0tdmVyc2lvbicgaGFwcGVuIGFzIHF1aWNrbHkgYXMgd2UgY2FuLgoreworICAjIHRoaXMganVzdCBlYXNlcyBleGl0IGhhbmRsaW5nCisgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgICAgb3B0PSIkMSIKKyAgICBzaGlmdAorICAgIGNhc2UgJG9wdCBpbgorICAgICAgLS1kZWJ1Z3wteCkJb3B0X2RlYnVnPSdzZXQgLXgnCisJCQlmdW5jX2VjaG8gImVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCisJCQkkb3B0X2RlYnVnCisJCQk7OworICAgICAgLS1kcnktcnVufC0tZHJ5cnVufC1uKQorCQkJb3B0X2RyeV9ydW49OgorCQkJOzsKKyAgICAgIC0tY29uZmlnKQorCQkJb3B0X2NvbmZpZz06CitmdW5jX2NvbmZpZworCQkJOzsKKyAgICAgIC0tZGxvcGVufC1kbG9wZW4pCisJCQlvcHRhcmc9IiQxIgorCQkJb3B0X2Rsb3Blbj0iJHtvcHRfZGxvcGVuKyRvcHRfZGxvcGVuCit9JG9wdGFyZyIKKwkJCXNoaWZ0CisJCQk7OworICAgICAgLS1wcmVzZXJ2ZS1kdXAtZGVwcykKKwkJCW9wdF9wcmVzZXJ2ZV9kdXBfZGVwcz06CisJCQk7OworICAgICAgLS1mZWF0dXJlcykKKwkJCW9wdF9mZWF0dXJlcz06CitmdW5jX2ZlYXR1cmVzCisJCQk7OworICAgICAgLS1maW5pc2gpCisJCQlvcHRfZmluaXNoPToKK3NldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKKwkJCTs7CisgICAgICAtLWhlbHApCisJCQlvcHRfaGVscD06CisJCQk7OworICAgICAgLS1oZWxwLWFsbCkKKwkJCW9wdF9oZWxwX2FsbD06CitvcHRfaGVscD0nOiBoZWxwLWFsbCcKKwkJCTs7CisgICAgICAtLW1vZGUpCisJCQl0ZXN0ICQjID0gMCAmJiBmdW5jX21pc3NpbmdfYXJnICRvcHQgJiYgYnJlYWsKKwkJCW9wdGFyZz0iJDEiCisJCQlvcHRfbW9kZT0iJG9wdGFyZyIKK2Nhc2UgJG9wdGFyZyBpbgorICAjIFZhbGlkIG1vZGUgYXJndW1lbnRzOgorICBjbGVhbnxjb21waWxlfGV4ZWN1dGV8ZmluaXNofGluc3RhbGx8bGlua3xyZWxpbmt8dW5pbnN0YWxsKSA7OworCisgICMgQ2F0Y2ggYW55dGhpbmcgZWxzZSBhcyBhbiBlcnJvcgorICAqKSBmdW5jX2Vycm9yICJpbnZhbGlkIGFyZ3VtZW50IGZvciAkb3B0IgorICAgICBleGl0X2NtZD1leGl0CisgICAgIGJyZWFrCisgICAgIDs7Citlc2FjCisJCQlzaGlmdAorCQkJOzsKKyAgICAgIC0tbm8tc2lsZW50fC0tbm8tcXVpZXQpCisJCQlvcHRfc2lsZW50PWZhbHNlCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKwkJCTs7CisgICAgICAtLW5vLXdhcm5pbmd8LS1uby13YXJuKQorCQkJb3B0X3dhcm5pbmc9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tbm8tdmVyYm9zZSkKKwkJCW9wdF92ZXJib3NlPWZhbHNlCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKwkJCTs7CisgICAgICAtLXNpbGVudHwtLXF1aWV0KQorCQkJb3B0X3NpbGVudD06CitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKyAgICAgICAgb3B0X3ZlcmJvc2U9ZmFsc2UKKwkJCTs7CisgICAgICAtLXZlcmJvc2V8LXYpCisJCQlvcHRfdmVyYm9zZT06CitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKK29wdF9zaWxlbnQ9ZmFsc2UKKwkJCTs7CisgICAgICAtLXRhZykKKwkJCXRlc3QgJCMgPSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgJG9wdCAmJiBicmVhaworCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF90YWc9IiRvcHRhcmciCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCAkb3B0YXJnIgorZnVuY19lbmFibGVfdGFnICIkb3B0YXJnIgorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC1cP3wtaCkJCWZ1bmNfdXNhZ2UJCQkJOzsKKyAgICAgIC0taGVscCkJCWZ1bmNfaGVscAkJCQk7OworICAgICAgLS12ZXJzaW9uKQlmdW5jX3ZlcnNpb24JCQkJOzsKKworICAgICAgIyBTZXBhcmF0ZSBvcHRhcmdzIHRvIGxvbmcgb3B0aW9uczoKKyAgICAgIC0tKj0qKQorCQkJZnVuY19zcGxpdF9sb25nX29wdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZSIgIiRmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZyIgJHsxKyIkQCJ9CisJCQlzaGlmdAorCQkJOzsKKworICAgICAgIyBTZXBhcmF0ZSBub24tYXJndW1lbnQgc2hvcnQgb3B0aW9uczoKKyAgICAgIC1cPyp8LWgqfC1uKnwtdiopCisJCQlmdW5jX3NwbGl0X3Nob3J0X29wdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWUiICItJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyIgJHsxKyIkQCJ9CisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLS0pCQlicmVhawkJCQkJOzsKKyAgICAgIC0qKQkJZnVuY19mYXRhbF9oZWxwICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdCciIDs7CisgICAgICAqKQkJc2V0IGR1bW15ICIkb3B0IiAkezErIiRAIn07CXNoaWZ0OyBicmVhayAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIFZhbGlkYXRlIG9wdGlvbnM6CisKKyAgIyBzYXZlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQKKyAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisgICAgbm9ub3B0PSIkb3B0IgorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBwcmVzZXJ2ZSAtLWRlYnVnCisgIHRlc3QgIiRvcHRfZGVidWciID0gOiB8fCBmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgLS1kZWJ1ZyIKKworICBjYXNlICRob3N0IGluCisgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKnB3MzIqIHwgKmNlZ2NjKikKKyAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCisgICAgICBvcHRfZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPToKKyAgICAgIDs7CisgICAgKikKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcworICAgICAgOzsKKyAgZXNhYworCisgICRvcHRfaGVscCB8fCB7CisgICAgIyBTYW5pdHkgY2hlY2tzIGZpcnN0OgorICAgIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIm5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiCisgICAgZmkKKworICAgICMgRGFyd2luIHN1Y2tzCisgICAgZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKKworICAgICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCisgICAgaWYgdGVzdCAtbiAiJG9wdF9kbG9wZW4iICYmIHRlc3QgIiRvcHRfbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgICAgZnVuY19lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIgorICAgICAgJEVDSE8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgorICAgIGdlbmVyaWNfaGVscD0iJGhlbHAiCisgICAgaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCAtLW1vZGU9JG9wdF9tb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgIH0KKworCisgICMgQmFpbCBpZiB0aGUgb3B0aW9ucyB3ZXJlIHNjcmV3ZWQKKyAgJGV4aXRfY21kICRFWElUX0ZBSUxVUkUKK30KKworCisKKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjICAgIE1haW4uICAgICMjCisjIyAtLS0tLS0tLS0tLSAjIworCisjIGZ1bmNfbGFsaWJfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sYWxpYl9wICgpCit7CisgICAgdGVzdCAtZiAiJDEiICYmCisgICAgICAkU0VEIC1lIDRxICIkMSIgMj4vZGV2L251bGwgXAorICAgICAgICB8ICRHUkVQICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIgPiAvZGV2L251bGwgMj4mMQorfQorCisjIGZ1bmNfbGFsaWJfdW5zYWZlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCBgLmxhJyBsaWJyYXJ5IG9yIGAubG8nIG9iamVjdCBmaWxlLgorIyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNhbWUgY2hlY2sgYXMgZnVuY19sYWxpYl9wIHdpdGhvdXQKKyMgcmVzb3J0aW5nIHRvIGV4dGVybmFsIHByb2dyYW1zLiAgVG8gdGhpcyBlbmQsIGl0IHJlZGlyZWN0cyBzdGRpbiBhbmQKKyMgY2xvc2VzIGl0IGFmdGVyd2FyZHMsIHdpdGhvdXQgc2F2aW5nIHRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IuCisjIEFzIGEgc2FmZXR5IG1lYXN1cmUsIHVzZSBpdCBvbmx5IHdoZXJlIGEgbmVnYXRpdmUgcmVzdWx0IHdvdWxkIGJlCisjIGZhdGFsIGFueXdheS4gIFdvcmtzIGlmIGBmaWxlJyBkb2VzIG5vdCBleGlzdC4KK2Z1bmNfbGFsaWJfdW5zYWZlX3AgKCkKK3sKKyAgICBsYWxpYl9wPW5vCisgICAgaWYgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXIgIiQxIiAmJiBleGVjIDU8JjAgPCIkMSI7IHRoZW4KKwlmb3IgbGFsaWJfcF9sIGluIDEgMiAzIDQKKwlkbworCSAgICByZWFkIGxhbGliX3BfbGluZQorCSAgICBjYXNlICIkbGFsaWJfcF9saW5lIiBpbgorCQlcI1wgR2VuZXJhdGVkXCBieVwgKiRQQUNLQUdFKiApIGxhbGliX3A9eWVzOyBicmVhazs7CisJICAgIGVzYWMKKwlkb25lCisJZXhlYyAwPCY1IDU8Ji0KKyAgICBmaQorICAgIHRlc3QgIiRsYWxpYl9wIiA9IHllcworfQorCisjIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAoKQoreworICAgIGZ1bmNfbGFsaWJfcCAiJDEiCit9CisKKyMgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBleGVjdXRhYmxlCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9CisgICAgY2FzZSAkMSBpbgorICAgICouZXhlKSA7OworICAgICopIGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4PS5leGUgOzsKKyAgICBlc2FjCisgICAgJEdSRVAgIiRtYWdpY19leGUiICIkMSRmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeCIgPi9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSBmaWxlCisjIEFzc3VtZXMgZmlsZSBpcyBhbiBsdHdyYXBwZXJfZXhlY3V0YWJsZQorIyB1c2VzICRmaWxlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZmlsZW5hbWUgZm9yIGEKKyMgdGVtcG9yYXJ5IGx0d3JhcHBlcl9zY3JpcHQuCitmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICgpCit7CisgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgorICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb3Igd3JhcHBlciBleGVjdXRhYmxlCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sdHdyYXBwZXJfcCAoKQoreworICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkMSIgfHwgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkMSIKK30KKworCisjIGZ1bmNfZXhlY3V0ZV9jbWRzIGNvbW1hbmRzIGZhaWxfY21kCisjIEV4ZWN1dGUgdGlsZGUtZGVsaW1pdGVkIENPTU1BTkRTLgorIyBJZiBGQUlMX0NNRCBpcyBnaXZlbiwgZXZhbCB0aGF0IHVwb24gZmFpbHVyZS4KKyMgRkFJTF9DTUQgbWF5IHJlYWQtYWNjZXNzIHRoZSBjdXJyZW50IGNvbW1hbmQgaW4gdmFyaWFibGUgQ01EIQorZnVuY19leGVjdXRlX2NtZHMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgc2F2ZV9pZnM9JElGUzsgSUZTPSd+JworICAgIGZvciBjbWQgaW4gJDE7IGRvCisgICAgICBJRlM9JHNhdmVfaWZzCisgICAgICBldmFsIGNtZD1cIiRjbWRcIgorICAgICAgZnVuY19zaG93X2V2YWwgIiRjbWQiICIkezItOn0iCisgICAgZG9uZQorICAgIElGUz0kc2F2ZV9pZnMKK30KKworCisjIGZ1bmNfc291cmNlIGZpbGUKKyMgU291cmNlIEZJTEUsIGFkZGluZyBkaXJlY3RvcnkgY29tcG9uZW50IGlmIG5lY2Vzc2FyeS4KKyMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bworIyBGSUxFIGV2ZW4gaWYgYm90aCBGSUxFIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCisjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKKyMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KK2Z1bmNfc291cmNlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgJDEgaW4KKyAgICAqLyogfCAqXFwqKQkuICIkMSIgOzsKKyAgICAqKQkJLiAiLi8kMSIgOzsKKyAgICBlc2FjCit9CisKKworIyBmdW5jX3Jlc29sdmVfc3lzcm9vdCBQQVRICisjIFJlcGxhY2UgYSBsZWFkaW5nID0gaW4gUEFUSCB3aXRoIGEgc3lzcm9vdC4gIFN0b3JlIHRoZSByZXN1bHQgaW50bworIyBmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKK2Z1bmNfcmVzb2x2ZV9zeXNyb290ICgpCit7CisgIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdD0kMQorICBjYXNlICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQgaW4KKyAgPSopCisgICAgZnVuY19zdHJpcG5hbWUgJz0nICcnICIkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdD0kbHRfc3lzcm9vdCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICA7OworICBlc2FjCit9CisKKyMgZnVuY19yZXBsYWNlX3N5c3Jvb3QgUEFUSAorIyBJZiBQQVRIIGJlZ2lucyB3aXRoIHRoZSBzeXNyb290LCByZXBsYWNlIGl0IHdpdGggPSBhbmQKKyMgc3RvcmUgdGhlIHJlc3VsdCBpbnRvIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdC4KK2Z1bmNfcmVwbGFjZV9zeXNyb290ICgpCit7CisgIGNhc2UgIiRsdF9zeXNyb290OiQxIiBpbgorICA/KjoiJGx0X3N5c3Jvb3QiKikKKyAgICBmdW5jX3N0cmlwbmFtZSAiJGx0X3N5c3Jvb3QiICcnICIkMSIKKyAgICBmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQ9Ij0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorICAgIDs7CisgICopCisgICAgIyBJbmNsdWRpbmcgbm8gc3lzcm9vdC4KKyAgICBmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQ9JDEKKyAgICA7OworICBlc2FjCit9CisKKyMgZnVuY19pbmZlcl90YWcgYXJnCisjIEluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiBhbnkgYXJlIGF2YWlsYWJsZSBhbmQKKyMgaWYgb25lIHdhc24ndCBjaG9zZW4gdmlhIHRoZSAiLS10YWciIGNvbW1hbmQgbGluZSBvcHRpb24uCisjIE9ubHkgYXR0ZW1wdCB0aGlzIGlmIHRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlCisjIGNvbW1hbmQgZG9lc24ndCBtYXRjaCB0aGUgZGVmYXVsdCBjb21waWxlci4KKyMgYXJnIGlzIHVzdWFsbHkgb2YgdGhlIGZvcm0gJ2djYyAuLi4nCitmdW5jX2luZmVyX3RhZyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorICAgICAgQ0NfcXVvdGVkPQorICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJZnVuY19hcHBlbmRfcXVvdGVkIENDX3F1b3RlZCAiJGFyZyIKKyAgICAgIGRvbmUKKyAgICAgIENDX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ2AKKyAgICAgIENDX3F1b3RlZF9leHBhbmRlZD1gZnVuY19lY2hvX2FsbCAkQ0NfcXVvdGVkYAorICAgICAgY2FzZSAkQCBpbgorICAgICAgIyBCbGFua3MgaW4gdGhlIGNvbW1hbmQgbWF5IGhhdmUgYmVlbiBzdHJpcHBlZCBieSB0aGUgY2FsbGluZyBzaGVsbCwKKyAgICAgICMgYnV0IG5vdCBmcm9tIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuLgorICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiAkQ0NfZXhwYW5kZWQgIiogfCAiJENDX2V4cGFuZGVkICIqIHwgXAorICAgICAgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgJENDX3F1b3RlZF9leHBhbmRlZCAiKiB8ICIkQ0NfcXVvdGVkX2V4cGFuZGVkICIqKSA7OworICAgICAgIyBCbGFua3MgYXQgdGhlIHN0YXJ0IG9mICRiYXNlX2NvbXBpbGUgd2lsbCBjYXVzZSB0aGlzIHRvIGZhaWwKKyAgICAgICMgaWYgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0gYXMgd2VsbC4KKyAgICAgICopCisJZm9yIHogaW4gJGF2YWlsYWJsZV90YWdzOyBkbworCSAgaWYgJEdSRVAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR6JCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgorCSAgICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvcCcgPCAkcHJvZ3BhdGhgIgorCSAgICBDQ19xdW90ZWQ9CisJICAgIGZvciBhcmcgaW4gJENDOyBkbworCSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICAgICBmdW5jX2FwcGVuZF9xdW90ZWQgQ0NfcXVvdGVkICIkYXJnIgorCSAgICBkb25lCisJICAgIENDX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ2AKKwkgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCisJICAgIGNhc2UgIiRAICIgaW4KKwkgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiAkQ0NfZXhwYW5kZWQgIiogfCAiJENDX2V4cGFuZGVkICIqIHwgXAorCSAgICAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiAkQ0NfcXVvdGVkX2V4cGFuZGVkICIqIHwgIiRDQ19xdW90ZWRfZXhwYW5kZWQgIiopCisJICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKKwkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgorCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCisJICAgICAgdGFnbmFtZT0kegorCSAgICAgIGJyZWFrCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKwlkb25lCisJIyBJZiAkdGFnbmFtZSBzdGlsbCBpc24ndCBzZXQsIHRoZW4gbm8gdGFnZ2VkIGNvbmZpZ3VyYXRpb24KKwkjIHdhcyBmb3VuZCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCB0aGUgIi0tdGFnIiBjb21tYW5kCisJIyBsaW5lIG9wdGlvbiBtdXN0IGJlIHVzZWQuCisJaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisJICBmdW5jX2VjaG8gInVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgInNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIKKyMJZWxzZQorIwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGZpCit9CisKKworCisjIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3Qgb3V0cHV0X25hbWUgcGljX25hbWUgbm9ucGljX25hbWUKKyMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCisjIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgorZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAoKQoreworICAgIHdyaXRlX2xpYm9iaj0kezF9CisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHdyaXRlX2xvYmo9XCckezJ9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9sb2JqPW5vbmUKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfb2xkb2JqPVwnJHszfVwnCisgICAgZWxzZQorICAgICAgd3JpdGVfb2xkb2JqPW5vbmUKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8IHsKKyAgICAgIGNhdCA+JHt3cml0ZV9saWJvYmp9VCA8PEVPRgorIyAkd3JpdGVfbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KK3BpY19vYmplY3Q9JHdyaXRlX2xvYmoKKworIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdAorbm9uX3BpY19vYmplY3Q9JHdyaXRlX29sZG9iagorCitFT0YKKyAgICAgICRNViAiJHt3cml0ZV9saWJvYmp9VCIgIiR7d3JpdGVfbGlib2JqfSIKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRklMRSBOQU1FIEFORCBQQVRIIENPTlZFUlNJT04gSEVMUEVSIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgQVJHCisjIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyB3aGVuICRidWlsZCBpcyAqbml4LAorIyBhbmQgJGhvc3QgaXMgbWluZ3csIGN5Z3dpbiwgb3Igc29tZSBvdGhlciB3MzIgZW52aXJvbm1lbnQuIFJlbGllcyBvbiBhCisjIGNvcnJlY3RseSBjb25maWd1cmVkIHdpbmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlLCB3aXRoIHRoZSB3aW5lcGF0aCBwcm9ncmFtCisjIGluICRidWlsZCdzICRQQVRILgorIworIyBBUkcgaXMgdGhlICRidWlsZCBmaWxlIG5hbWUgdG8gYmUgY29udmVydGVkIHRvIHczMiBmb3JtYXQuCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gJGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0LCBhbmQgd2lsbAorIyBiZSBlbXB0eSBvbiBlcnJvciAob3Igd2hlbiBBUkcgaXMgZW1wdHkpCitmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXMgbm90IGV4aXQgd2l0aCBhIG5vbi16ZXJvIGVycm9yIGNvZGUsIHNvIHdlCisgICAgIyBhcmUgZm9yY2VkIHRvIGNoZWNrIHRoZSBjb250ZW50cyBvZiBzdGRvdXQuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgICAjIGNvbW1hbmQgaXMgbm90IGZvdW5kLCB0aGUgc2hlbGwgd2lsbCBzZXQgYW4gZXhpdCBjb2RlIG9mIDEyNyBhbmQgcHJpbnQKKyAgICAjICphbiBlcnJvciBtZXNzYWdlKiB0byBzdGRvdXQuIFNvIHdlIG11c3QgY2hlY2sgZm9yIGJvdGggZXJyb3IgY29kZSBvZgorICAgICMgemVybyBBTkQgbm9uLWVtcHR5IHN0ZG91dCwgd2hpY2ggZXhwbGFpbnMgdGhlIG9kZCBjb25zdHJ1Y3Rpb246CisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXA9YHdpbmVwYXRoIC13ICIkMSIgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAiJD8iIC1lcSAwICYmIHRlc3QgLW4gIiR7ZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXB9IjsgdGhlbgorICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9YCRFQ0hPICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXAiIHwKKyAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAorICAgIGVsc2UKKyAgICAgIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0PQorICAgIGZpCisgIGZpCit9CisjIGVuZDogZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiBBUkcKKyMgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9ucyB3aGVuICRidWlsZCBpcyAqbml4LCBhbmQKKyMgJGhvc3QgaXMgbWluZ3csIGN5Z3dpbiwgb3Igc29tZSBvdGhlciB3MzIgZW52aXJvbm1lbnQuIFJlbGllcyBvbiBhIGNvcnJlY3RseQorIyBjb25maWd1cmVkIHdpbmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlLCB3aXRoIHRoZSB3aW5lcGF0aCBwcm9ncmFtIGluICRidWlsZCdzCisjICRQQVRILiBBc3N1bWVzIEFSRyBoYXMgbm8gbGVhZGluZyBvciB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzLgorIworIyBBUkcgaXMgcGF0aCB0byBiZSBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgZm9ybWF0IHRvIHdpbjMyLgorIyBSZXN1bHQgaXMgYXZhaWxhYmxlIGluICRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdC4KKyMgVW5jb252ZXJ0aWJsZSBmaWxlIChkaXJlY3RvcnkpIG5hbWVzIGluIEFSRyBhcmUgc2tpcHBlZDsgaWYgbm8gZGlyZWN0b3J5IG5hbWVzCisjIGFyZSBjb252ZXJ0aWJsZSwgdGhlbiB0aGUgcmVzdWx0IG1heSBiZSBlbXB0eS4KK2Z1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAjIHVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXNuJ3QgY29udmVydCBwYXRocywgb25seSBmaWxlIG5hbWVzCisgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0PSIiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgIG9sZElGUz0kSUZTCisgICAgSUZTPToKKyAgICBmb3IgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9mIGluICQxOyBkbworICAgICAgSUZTPSRvbGRJRlMKKyAgICAgIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX2YiCisgICAgICBpZiB0ZXN0IC1uICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiIDsgdGhlbgorICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQiOyB0aGVuCisgICAgICAgICAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZ1bmNfYXBwZW5kIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0ICI7JGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0IgorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSRvbGRJRlMKKyAgZmkKK30KKyMgZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyCisKKworIyBmdW5jX2N5Z3BhdGggQVJHUy4uLgorIyBXcmFwcGVyIGFyb3VuZCBjYWxsaW5nIHRoZSBjeWdwYXRoIHByb2dyYW0gdmlhIExUX0NZR1BBVEguIFRoaXMgaXMgdXNlZCB3aGVuCisjIHdoZW4gKDEpICRidWlsZCBpcyAqbml4IGFuZCBDeWd3aW4gaXMgaG9zdGVkIHZpYSBhIHdpbmUgZW52aXJvbm1lbnQ7IG9yICgyKQorIyAkYnVpbGQgaXMgTVNZUyBhbmQgJGhvc3QgaXMgQ3lnd2luLCBvciAoMykgJGJ1aWxkIGlzIEN5Z3dpbi4gSW4gY2FzZSAoMSkgb3IKKyMgKDIpLCByZXR1cm5zIHRoZSBDeWd3aW4gZmlsZSBuYW1lIG9yIHBhdGggaW4gZnVuY19jeWdwYXRoX3Jlc3VsdCAoaW5wdXQKKyMgZmlsZSBuYW1lIG9yIHBhdGggaXMgYXNzdW1lZCB0byBiZSBpbiB3MzIgZm9ybWF0LCBhcyBwcmV2aW91c2x5IGNvbnZlcnRlZAorIyBmcm9tICRidWlsZCdzICpuaXggb3IgTVNZUyBmb3JtYXQpLiBJbiBjYXNlICgzKSwgcmV0dXJucyB0aGUgdzMyIGZpbGUgbmFtZQorIyBvciBwYXRoIGluIGZ1bmNfY3lncGF0aF9yZXN1bHQgKGlucHV0IGZpbGUgbmFtZSBvciBwYXRoIGlzIGFzc3VtZWQgdG8gYmUgaW4KKyMgQ3lnd2luIGZvcm1hdCkuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGVycm9yLgorIworIyBBUkdTIGFyZSBwYXNzZWQgdG8gY3lncGF0aCwgd2l0aCB0aGUgbGFzdCBvbmUgYmVpbmcgdGhlIGZpbGUgbmFtZSBvciBwYXRoIHRvCisjIGJlIGNvbnZlcnRlZC4KKyMKKyMgU3BlY2lmeSB0aGUgYWJzb2x1dGUgKm5peCAob3IgdzMyKSBuYW1lIHRvIGN5Z3BhdGggaW4gdGhlIExUX0NZR1BBVEgKKyMgZW52aXJvbm1lbnQgdmFyaWFibGU7IGRvIG5vdCBwdXQgaXQgaW4gJFBBVEguCitmdW5jX2N5Z3BhdGggKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC1uICIkTFRfQ1lHUEFUSCIgJiYgdGVzdCAtZiAiJExUX0NZR1BBVEgiOyB0aGVuCisgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD1gJExUX0NZR1BBVEggIiRAIiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICIkPyIgLW5lIDA7IHRoZW4KKyAgICAgICMgb24gZmFpbHVyZSwgZW5zdXJlIHJlc3VsdCBpcyBlbXB0eQorICAgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD0KKyAgICBmaQorICBlbHNlCisgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD0KKyAgICBmdW5jX2Vycm9yICJMVF9DWUdQQVRIIGlzIGVtcHR5IG9yIHNwZWNpZmllcyBub24tZXhpc3RlbnQgZmlsZTogXGAkTFRfQ1lHUEFUSCciCisgIGZpCit9CisjZW5kOiBmdW5jX2N5Z3BhdGgKKworCisjIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBvciBwYXRoIEFSRyBmcm9tIE1TWVMgZm9ybWF0IHRvIHczMiBmb3JtYXQuICBSZXR1cm4KKyMgcmVzdWx0IGluIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgIyBhd2t3YXJkOiBjbWQgYXBwZW5kcyBzcGFjZXMgdG8gcmVzdWx0CisgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdD1gKCBjbWQgLy9jIGVjaG8gIiQxIiApIDI+L2Rldi9udWxsIHwKKyAgICAkU0VEIC1lICdzL1sgXSokLy8nIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCit9CisjZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgQVJHMSBBUkcyCisjIFZlcmlmeSB0aGF0IEFSRzEgKGEgZmlsZSBuYW1lIGluICRidWlsZCBmb3JtYXQpIHdhcyBjb252ZXJ0ZWQgdG8gJGhvc3QKKyMgZm9ybWF0IGluIEFSRzIuIE90aGVyd2lzZSwgZW1pdCBhbiBlcnJvciBtZXNzYWdlLCBidXQgY29udGludWUgKHJlc2V0dGluZworIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQgdG8gQVJHMSkuCitmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiQyIiAmJiB0ZXN0IC1uICIkMSIgOyB0aGVuCisgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSBob3N0IGZpbGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIgorICAgIGZ1bmNfZXJyb3IgIiAgXGAkMSciCisgICAgZnVuY19lcnJvciAiQ29udGludWluZywgYnV0IHVuaW5zdGFsbGVkIGV4ZWN1dGFibGVzIG1heSBub3Qgd29yay4iCisgICAgIyBGYWxsYmFjazoKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIEZST01fUEFUSFNFUCBUT19QQVRIU0VQIEZST01fUEFUSCBUT19QQVRICisjIFZlcmlmeSB0aGF0IEZST01fUEFUSCAoYSBwYXRoIGluICRidWlsZCBmb3JtYXQpIHdhcyBjb252ZXJ0ZWQgdG8gJGhvc3QKKyMgZm9ybWF0IGluIFRPX1BBVEguIE90aGVyd2lzZSwgZW1pdCBhbiBlcnJvciBtZXNzYWdlLCBidXQgY29udGludWUsIHJlc2V0dGluZworIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQgdG8gYSBzaW1wbGlzdGljIGZhbGxiYWNrIHZhbHVlIChzZWUgYmVsb3cpLgorZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC16ICIkNCIgJiYgdGVzdCAtbiAiJDMiOyB0aGVuCisgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSB0aGUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgZnVuY19lcnJvciAiICBcYCQzJyIKKyAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKKyAgICAjIEZhbGxiYWNrLiAgVGhpcyBpcyBhIGRlbGliZXJhdGVseSBzaW1wbGlzdGljICJjb252ZXJzaW9uIiBhbmQKKyAgICAjIHNob3VsZCBub3QgYmUgImltcHJvdmVkIi4gIFNlZSBsaWJ0b29sLmluZm8uCisgICAgaWYgdGVzdCAieCQxIiAhPSAieCQyIjsgdGhlbgorICAgICAgbHRfcmVwbGFjZV9wYXRoc2VwX2NoYXJzPSJzfCQxfCQyfGciCisgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiQzIiB8CisgICAgICAgICRTRUQgLWUgIiRsdF9yZXBsYWNlX3BhdGhzZXBfY2hhcnMiYAorICAgIGVsc2UKKyAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDMiCisgICAgZmkKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgRlJPTlRQQVQgQkFDS1BBVCBSRVBMIE9SSUcKKyMgTW9kaWZpZXMgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IGJ5IHByZXBlbmRpbmcgUkVQTCBpZiBPUklHIG1hdGNoZXMgRlJPTlRQQVQKKyMgYW5kIGFwcGVuZGluZyBSRVBMIGlmIE9SSUcgbWF0Y2hlcyBCQUNLUEFULgorZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICgpCit7CisgICRvcHRfZGVidWcKKyAgY2FzZSAkNCBpbgorICAkMSApIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDMkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIDs7CisgIGVzYWMKKyAgY2FzZSAkNCBpbgorICAkMiApIGZ1bmNfYXBwZW5kIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCAiJDMiCisgICAgOzsKKyAgZXNhYworfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgJGJ1aWxkIHRvICRob3N0IEZJTEUgTkFNRSBDT05WRVJTSU9OIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpbnZva2VkIHZpYSBgJHRvX2hvc3RfZmlsZV9jbWQgQVJHJworIworIyBJbiBlYWNoIGNhc2UsIEFSRyBpcyB0aGUgcGF0aCB0byBiZSBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgdG8gJGhvc3QgZm9ybWF0LgorIyBSZXN1bHQgd2lsbCBiZSBhdmFpbGFibGUgaW4gJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KKworCisjIGZ1bmNfdG9faG9zdF9maWxlIEFSRworIyBDb252ZXJ0cyB0aGUgZmlsZSBuYW1lIEFSRyBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiBSZXR1cm4gcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfdG9faG9zdF9maWxlICgpCit7CisgICRvcHRfZGVidWcKKyAgJHRvX2hvc3RfZmlsZV9jbWQgIiQxIgorfQorIyBlbmQgZnVuY190b19ob3N0X2ZpbGUKKworCisjIGZ1bmNfdG9fdG9vbF9maWxlIEFSRyBMQVpZCisjIGNvbnZlcnRzIHRoZSBmaWxlIG5hbWUgQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byB0b29sY2hhaW4gZm9ybWF0LiBSZXR1cm4KKyMgcmVzdWx0IGluIGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdC4gIElmIHRoZSBjb252ZXJzaW9uIGluIHVzZSBpcyBsaXN0ZWQKKyMgaW4gKHRoZSBjb21tYSBzZXBhcmF0ZWQpIExBWlksIG5vIGNvbnZlcnNpb24gdGFrZXMgcGxhY2UuCitmdW5jX3RvX3Rvb2xfZmlsZSAoKQoreworICAkb3B0X2RlYnVnCisgIGNhc2UgLCQyLCBpbgorICAgICosIiR0b190b29sX2ZpbGVfY21kIiwqKQorICAgICAgZnVuY190b190b29sX2ZpbGVfcmVzdWx0PSQxCisgICAgICA7OworICAgICopCisgICAgICAkdG9fdG9vbF9maWxlX2NtZCAiJDEiCisgICAgICBmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQ9JGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdAorICAgICAgOzsKKyAgZXNhYworfQorIyBlbmQgZnVuY190b190b29sX2ZpbGUKKworCisjIGZ1bmNfY29udmVydF9maWxlX25vb3AgQVJHCisjIENvcHkgQVJHIHRvIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25vb3AgKCkKK3sKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25vb3AKKworCisjIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBBUkcgZnJvbSAobWluZ3cpIE1TWVMgdG8gKG1pbmd3KSB3MzIgZm9ybWF0OyBhdXRvbWF0aWMKKyMgY29udmVyc2lvbiB0byB3MzIgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGN3cmFwcGVyLiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJDEiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tIEN5Z3dpbiB0byB3MzIgZm9ybWF0LiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgYmVjYXVzZSAkYnVpbGQgaXMgY3lnd2luLCB3ZSBjYWxsICJ0aGUiIGN5Z3BhdGggaW4gJFBBVEg7IG5vIG5lZWQgdG8gdXNlCisgICAgIyBMVF9DWUdQQVRIIGluIHRoaXMgY2FzZS4KKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9YGN5Z3BhdGggLW0gIiQxImAKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX25peF90b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tICpuaXggdG8gdzMyIGZvcm1hdC4gIFJlcXVpcmVzIGEgd2luZSBlbnZpcm9ubWVudAorIyBhbmQgYSB3b3JraW5nIHdpbmVwYXRoLiBSZXR1cm5zIHJlc3VsdCBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJDEiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gTVNZUyB0byBDeWd3aW4gZm9ybWF0LiAgUmVxdWlyZXMgTFRfQ1lHUEFUSCBzZXQuCisjIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiQxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAiJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4KKworCisjIGZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4gQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tICpuaXggdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIEN5Z3dpbiBpbnN0YWxsZWQKKyMgaW4gYSB3aW5lIGVudmlyb25tZW50LCB3b3JraW5nIHdpbmVwYXRoLCBhbmQgTFRfQ1lHUEFUSCBzZXQuICBSZXR1cm5zIHJlc3VsdAorIyBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBjb252ZXJ0IGZyb20gKm5peCB0byB3MzIsIHRoZW4gdXNlIGN5Z3BhdGggdG8gY29udmVydCBmcm9tIHczMiB0byBjeWd3aW4uCisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJDEiCisgICAgZnVuY19jeWdwYXRoIC11ICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jeWdwYXRoX3Jlc3VsdCIKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgJGJ1aWxkIHRvICRob3N0IFBBVEggQ09OVkVSU0lPTiBGVU5DVElPTlMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGludm9rZWQgdmlhIGAkdG9faG9zdF9wYXRoX2NtZCBBUkcnCisjCisjIEluIGVhY2ggY2FzZSwgQVJHIGlzIHRoZSBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCB0byAkaG9zdCBmb3JtYXQuCisjIFRoZSByZXN1bHQgd2lsbCBiZSBhdmFpbGFibGUgaW4gJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KKyMKKyMgUGF0aCBzZXBhcmF0b3JzIGFyZSBhbHNvIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiAgSWYKKyMgQVJHIGJlZ2lucyBvciBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIsIGl0IGlzIHByZXNlcnZlZCAoYnV0CisjIGNvbnZlcnRlZCB0byAkaG9zdCBmb3JtYXQpIG9uIG91dHB1dC4KKyMKKyMgQWxsIHBhdGggY29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIG5hbWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbjoKKyMgICBmaWxlIG5hbWUgY29udmVyc2lvbiBmdW5jdGlvbiAgICA6IGZ1bmNfY29udmVydF9maWxlX1hfdG9fWSAoKQorIyAgIHBhdGggY29udmVyc2lvbiBmdW5jdGlvbiAgICAgICAgIDogZnVuY19jb252ZXJ0X3BhdGhfWF90b19ZICgpCisjIHdoZXJlLCBmb3IgYW55IGdpdmVuICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbiB0aGUgJ1hfdG9fWScgdmFsdWUgaXMgdGhlCisjIHNhbWUuICBJZiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgYWRkZWQgZm9yIG5ldyAkYnVpbGQvJGhvc3QgY29tYmluYXRpb25zLAorIyB0aGUgdHdvIG5ldyBmdW5jdGlvbnMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuLCBvciBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorIyB3aWxsIGJyZWFrLgorCisKKyMgZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQKKyMgRW5zdXJlcyB0aGF0IGZ1bmN0aW9uICJwb2ludGVyIiB2YXJpYWJsZSAkdG9faG9zdF9wYXRoX2NtZCBpcyBzZXQgdG8gdGhlCisjIGFwcHJvcHJpYXRlIHZhbHVlLCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgJHRvX2hvc3RfZmlsZV9jbWQuCit0b19ob3N0X3BhdGhfY21kPQorZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC16ICIkdG9faG9zdF9wYXRoX2NtZCI7IHRoZW4KKyAgICBmdW5jX3N0cmlwbmFtZSAnZnVuY19jb252ZXJ0X2ZpbGVfJyAnJyAiJHRvX2hvc3RfZmlsZV9jbWQiCisgICAgdG9faG9zdF9wYXRoX2NtZD0iZnVuY19jb252ZXJ0X3BhdGhfJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9IgorICBmaQorfQorCisKKyMgZnVuY190b19ob3N0X3BhdGggQVJHCisjIENvbnZlcnRzIHRoZSBwYXRoIEFSRyBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiBSZXR1cm4gcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfdG9faG9zdF9wYXRoICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQKKyAgJHRvX2hvc3RfcGF0aF9jbWQgIiQxIgorfQorIyBlbmQgZnVuY190b19ob3N0X3BhdGgKKworCisjIGZ1bmNfY29udmVydF9wYXRoX25vb3AgQVJHCisjIENvcHkgQVJHIHRvIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25vb3AgKCkKK3sKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX25vb3AKKworCisjIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IHBhdGggQVJHIGZyb20gKG1pbmd3KSBNU1lTIHRvIChtaW5ndykgdzMyIGZvcm1hdDsgYXV0b21hdGljCisjIGNvbnZlcnNpb24gdG8gdzMyIGlzIG5vdCBhdmFpbGFibGUgaW5zaWRlIHRoZSBjd3JhcHBlci4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tIEFSRy4gIE1TWVMKKyAgICAjIGJlaGF2aW9yIGlzIGluY29uc2lzdGVudCBoZXJlOyBjeWdwYXRoIHR1cm5zIHRoZW0gaW50byAnLjsnIGFuZCAnOy4nOworICAgICMgYW5kIHdpbmVwYXRoIGlnbm9yZXMgdGhlbSBjb21wbGV0ZWx5LgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6ICI7IiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgIjsiICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9jeWd3aW5fdG9fdzMyIEFSRworIyBDb252ZXJ0IHBhdGggQVJHIGZyb20gQ3lnd2luIHRvIHczMiBmb3JtYXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9jeWd3aW5fdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBTZWUgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzI6CisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGN5Z3BhdGggLW0gLXAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxImAKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6ICI7IiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgIjsiICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIKKworCisjIGZ1bmNfY29udmVydF9wYXRoX25peF90b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAqbml4IHRvIHczMiBmb3JtYXQuICBSZXF1aXJlcyBhIHdpbmUgZW52aXJvbm1lbnQgYW5kCisjIGEgd29ya2luZyB3aW5lcGF0aC4gIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25peF90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4gQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSBNU1lTIHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBMVF9DWUdQQVRIIHNldC4KKyMgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgLXAgIiRmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jeWdwYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6IDogXAorICAgICAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgIjoqIiAiKjoiIDogIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4KKworCisjIGZ1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4gQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAqbml4IHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBDeWd3aW4gaW5zdGFsbGVkIGluIGEKKyMgYSB3aW5lIGVudmlyb25tZW50LCB3b3JraW5nIHdpbmVwYXRoLCBhbmQgTFRfQ1lHUEFUSCBzZXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tCisgICAgIyBBUkcuIG1zeXMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmUsIGN5Z3BhdGggdHVybnMgdGhlbQorICAgICMgaW50byAnLjsnIGFuZCAnOy4nLCBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgLXAgIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogOiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgOiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fY3lnd2luCisKKworIyBmdW5jX21vZGVfY29tcGlsZSBhcmcuLi4KK2Z1bmNfbW9kZV9jb21waWxlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKKyAgICBzdXBwcmVzc19vcHQ9eWVzCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorICAgIGFyZ19tb2RlPW5vcm1hbAorICAgIGxpYm9iaj0KKyAgICBsYXRlcj0KKyAgICBwaWVfZmxhZz0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnX21vZGUgaW4KKyAgICAgIGFyZyAgKQorCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKKwlsYXN0YXJnPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCTs7CisKKyAgICAgIHRhcmdldCApCisJbGlib2JqPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCWNvbnRpbnVlCisJOzsKKworICAgICAgbm9ybWFsICkKKwkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisJY2FzZSAkYXJnIGluCisJLW8pCisJICB0ZXN0IC1uICIkbGlib2JqIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIKKwkgIGFyZ19tb2RlPXRhcmdldAorCSAgY29udGludWUKKwkgIDs7CisKKwktcGllIHwgLWZwaWUgfCAtZlBJRSkKKyAgICAgICAgICBmdW5jX2FwcGVuZCBwaWVfZmxhZyAiICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1zaGFyZWQgfCAtc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCisJICBmdW5jX2FwcGVuZCBsYXRlciAiICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1uby1zdXBwcmVzcykKKwkgIHN1cHByZXNzX29wdD1ubworCSAgY29udGludWUKKwkgIDs7CisKKwktWGNvbXBpbGVyKQorCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAorCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKKwkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCisKKwktV2MsKikKKwkgIGZ1bmNfc3RyaXBuYW1lICctV2MsJyAnJyAiJGFyZyIKKwkgIGFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgbGFzdGFyZz0KKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBsYXN0YXJnICIkYXJnIgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRsYXN0YXJnIgorCSAgbGFzdGFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgorCSAgZnVuY19hcHBlbmQgYmFzZV9jb21waWxlICIgJGxhc3RhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCSopCisJICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCisJICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KKwkgICMKKwkgIGxhc3Rhcmc9IiRzcmNmaWxlIgorCSAgc3JjZmlsZT0iJGFyZyIKKwkgIDs7CisJZXNhYyAgIyAgY2FzZSAkYXJnCisJOzsKKyAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKyAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBiYXNlX2NvbXBpbGUgIiRsYXN0YXJnIgorICAgIGRvbmUgIyBmb3IgYXJnCisKKyAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgIGFyZykKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBtdXN0IHNwZWNpZnkgYW4gYXJndW1lbnQgZm9yIC1YY29tcGlsZSIKKyAgICAgIDs7CisgICAgdGFyZ2V0KQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIgorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgeworCWZ1bmNfYmFzZW5hbWUgIiRzcmNmaWxlIgorCWxpYm9iaj0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgICAgfQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5bY0NGU2lmbXNvXSB8IFwKKyAgICAqLmFkYSB8ICouYWRiIHwgKi5hZHMgfCAqLmFzbSB8IFwKKyAgICAqLmMrKyB8ICouY2MgfCAqLmlpIHwgKi5jbGFzcyB8ICouY3BwIHwgKi5jeHggfCBcCisgICAgKi5bZkZdWzA5XT8gfCAqLmZvciB8ICouamF2YSB8ICouZ28gfCAqLm9iaiB8ICouc3ggfCAqLmN1IHwgKi5jdXApCisgICAgICBmdW5jX3hmb3JtICIkbGlib2JqIgorICAgICAgbGlib2JqPSRmdW5jX3hmb3JtX3Jlc3VsdAorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLmxvKSBmdW5jX2xvMm8gIiRsaWJvYmoiOyBvYmo9JGZ1bmNfbG8yb19yZXN1bHQgOzsKKyAgICAqKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgZm9yIGFyZyBpbiAkbGF0ZXI7IGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zaGFyZWQpCisJdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgorCWJ1aWxkX29sZF9saWJzPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtc3RhdGljKQorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1waWMpCisJcGljX21vZGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLW5vbi1waWMpCisJcGljX21vZGU9bm8KKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxpYm9iaiIKKyAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiIFwKKyAgICAgICYmICRFQ0hPICJYJGxpYm9iaiIgfCAkR1JFUCAnW11+I14qe307PD4/IiciJyInCSAmKCl8YCRbXScgXAorICAgICAgJiYgZnVuY193YXJuaW5nICJsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgorICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvYmoiICIvIiAiIgorICAgIG9iam5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCisKKyAgICB0ZXN0IC16ICIkYmFzZV9jb21waWxlIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIgorCisgICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICByZW1vdmVsaXN0PSIkb2JqICRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBlbHNlCisgICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCisgICAgZmkKKworICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisgICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICBmaQorCisgICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKKyAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKKyAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCisgICAgICBvdXRwdXRfb2JqPWAkRUNITyAiJHNyY2ZpbGUiIHwgJFNFRCAncyVeLiovJSU7IHMlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQorICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCisgICAgZWxzZQorICAgICAgb3V0cHV0X29iaj0KKyAgICAgIG5lZWRfbG9ja3M9bm8KKyAgICAgIGxvY2tmaWxlPQorICAgIGZpCisKKyAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAorICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KKyAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKyAgICAgIGZ1bmNfYXBwZW5kIHJlbW92ZWxpc3QgIiAkb3V0cHV0X29iaiIKKyAgICAgICRFQ0hPICIkc3JjZmlsZSIgPiAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRsb2NrZmlsZSIKKyAgICB0cmFwICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnIDEgMiAxNQorCisgICAgZnVuY190b190b29sX2ZpbGUgIiRzcmNmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgIHNyY2ZpbGU9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRzcmNmaWxlIgorICAgIHFzcmNmaWxlPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdAorCisgICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCisgICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKKworICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKKyAgICAgIGVsc2UKKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCisgICAgICBmaQorCisgICAgICBmdW5jX21rZGlyX3AgIiR4ZGlyJG9iamRpciIKKworICAgICAgaWYgdGVzdCAteiAiJG91dHB1dF9vYmoiOyB0aGVuCisJIyBQbGFjZSBQSUMgb2JqZWN0cyBpbiAkb2JqZGlyCisJZnVuY19hcHBlbmQgY29tbWFuZCAiIC1vICRsb2JqIgorICAgICAgZmkKKworICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIJXAorICAgICAgICAgICd0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRsb2JqIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICckTVYgIiRvdXRwdXRfb2JqIiAiJGxvYmoiJyBcCisJICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJworICAgICAgZmkKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgaWYgdGVzdCAiJHN1cHByZXNzX29wdCIgPSB5ZXM7IHRoZW4KKwlzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUkcGllX2ZsYWciCisgICAgICBlbHNlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJZnVuY19hcHBlbmQgY29tbWFuZCAiIC1vICRvYmoiCisgICAgICBmaQorCisgICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KKyAgICAgIGZ1bmNfYXBwZW5kIGNvbW1hbmQgIiRzdXBwcmVzc19vdXRwdXQiCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIiBcCisgICAgICAgICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkb2JqIicgXAorCSAgJ2Vycm9yPSQ/OyAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRlcnJvcicKKyAgICAgIGZpCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCB7CisgICAgICBmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICIkbGlib2JqIiAiJG9iamRpci8kb2JqbmFtZSIgIiRvYmpuYW1lIgorCisgICAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKwlyZW1vdmVsaXN0PSRsb2NrZmlsZQorICAgICAgICAkUk0gIiRsb2NrZmlsZSIKKyAgICAgIGZpCisgICAgfQorCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKKyRvcHRfaGVscCB8fCB7CisgIHRlc3QgIiRvcHRfbW9kZSIgPSBjb21waWxlICYmIGZ1bmNfbW9kZV9jb21waWxlICR7MSsiJEAifQorfQorCitmdW5jX21vZGVfaGVscCAoKQoreworICAgICMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgorICAgIGNhc2UgJG9wdF9tb2RlIGluCisgICAgICAiIikKKyAgICAgICAgIyBHZW5lcmljIGhlbHAgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVzYWdlIGNvbW1lbnRzCisgICAgICAgICMgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZmlsZS4KKyAgICAgICAgZnVuY19oZWxwCisgICAgICAgIDs7CisKKyAgICAgIGNsZWFuKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCit3aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgICAgICAgIDs7CisKKyAgICAgIGNvbXBpbGUpCisgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQorCitDb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQorICAtbm8tc3VwcHJlc3MgICAgICBkbyBub3Qgc3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGZvciBtdWx0aXBsZSBwYXNzZXMKKyAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkIFBJQyBvYmplY3RzIG9ubHkKKyAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1zaGFyZWQgICAgICAgICAgIGRvIG5vdCBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisgIC1zdGF0aWMgICAgICAgICAgIG9ubHkgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZworICAtV2MsRkxBRyAgICAgICAgICBwYXNzIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGNvbXBpbGVyCisKK0NPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCitmcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgorCitUaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KK1NPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQorbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgorICAgICAgICA7OworCisgICAgICBleGVjdXRlKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgorCitBdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKKworVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJworZmxhZ3MuCisKK0lmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKK2ludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQorZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCisKK1RoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgorICAgICAgICA7OworCisgICAgICBmaW5pc2gpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KKworQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KKworRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KKworVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCit0aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKKyAgICAgICAgOzsKKworICAgICAgaW5zdGFsbCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCisKK0luc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgorCitJTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKK2VpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgSU5TVEFMTC1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtaW5zdC1wcmVmaXgtZGlyIFBSRUZJWC1ESVIgIFVzZSBQUkVGSVgtRElSIGFzIGEgc3RhZ2luZyBhcmVhIGZvciBpbnN0YWxsYXRpb24KKworVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKK0JTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgorICAgICAgICA7OworCisgICAgICBsaW5rKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KKworTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bworY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCithIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCisgIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQorICAtYmluZGlyIEJJTkRJUiAgICBzcGVjaWZ5IHBhdGggdG8gYmluYXJpZXMgZGlyZWN0b3J5IChmb3Igc3lzdGVtcyB3aGVyZQorICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgbXVzdCBiZSBmb3VuZCBpbiB0aGUgUEFUSCBzZXR0aW5nIGF0IHJ1bnRpbWUpCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scworICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQorICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQorICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKKyAgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IFJFR0VYCisgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAorICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCisgIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCisgIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAorICAtbm8tZmFzdC1pbnN0YWxsICBkaXNhYmxlIHRoZSBmYXN0LWluc3RhbGwgbW9kZQorICAtbm8taW5zdGFsbCAgICAgICBsaW5rIGEgbm90LWluc3RhbGxhYmxlIGV4ZWN1dGFibGUKKyAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCisgIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cworICAtb2JqZWN0bGlzdCBGSUxFICBVc2UgYSBsaXN0IG9mIG9iamVjdCBmaWxlcyBmb3VuZCBpbiBGSUxFIHRvIHNwZWNpZnkgb2JqZWN0cworICAtcHJlY2lvdXMtZmlsZXMtcmVnZXggUkVHRVgKKyAgICAgICAgICAgICAgICAgICAgZG9uJ3QgcmVtb3ZlIG91dHB1dCBmaWxlcyBtYXRjaGluZyBSRUdFWAorICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgorICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCisgIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCisgIC1zaGFyZWQgICAgICAgICAgIG9ubHkgZG8gZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC1zaHJleHQgU1VGRklYICAgIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBzaGFyZWQgbGlicmFyeSBmaWxlIGV4dGVuc2lvbgorICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAtc3RhdGljLWxpYnRvb2wtbGlicworICAgICAgICAgICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcworICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCisgIC13ZWFrIExJQk5BTUUgICAgIGRlY2xhcmUgdGhhdCB0aGUgdGFyZ2V0IHByb3ZpZGVzIHRoZSBMSUJOQU1FIGludGVyZmFjZQorICAtV2MsRkxBRworICAtWGNvbXBpbGVyIEZMQUcgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBjb21waWxlcgorICAtV2wsRkxBRworICAtWGxpbmtlciBGTEFHICAgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBsaW5rZXIKKyAgLVhDQ2xpbmtlciBGTEFHICAgcGFzcyBsaW5rLXNwZWNpZmljIEZMQUcgdG8gdGhlIGNvbXBpbGVyIGRyaXZlciAoQ0MpCisKK0FsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCisKK0V2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCit0cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQorb2JqZWN0IGZpbGVzLgorCitJZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKK29ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKK3JlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAordXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCitpcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgorICAgICAgICA7OworCisgICAgICB1bmluc3RhbGwpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCitPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgIGZ1bmNfZmF0YWxfaGVscCAiaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRvcHRfbW9kZSciCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgZWNobworICAgICRFQ0hPICJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCit9CisKKyMgTm93IHRoYXQgd2UndmUgY29sbGVjdGVkIGEgcG9zc2libGUgLS1tb2RlIGFyZywgc2hvdyBoZWxwIGlmIG5lY2Vzc2FyeQoraWYgJG9wdF9oZWxwOyB0aGVuCisgIGlmIHRlc3QgIiRvcHRfaGVscCIgPSA6OyB0aGVuCisgICAgZnVuY19tb2RlX2hlbHAKKyAgZWxzZQorICAgIHsKKyAgICAgIGZ1bmNfaGVscCBub2V4aXQKKyAgICAgIGZvciBvcHRfbW9kZSBpbiBjb21waWxlIGxpbmsgZXhlY3V0ZSBpbnN0YWxsIGZpbmlzaCB1bmluc3RhbGwgY2xlYW47IGRvCisJZnVuY19tb2RlX2hlbHAKKyAgICAgIGRvbmUKKyAgICB9IHwgc2VkIC1uICcxcDsgMiwkcy9eVXNhZ2U6LyAgb3I6IC9wJworICAgIHsKKyAgICAgIGZ1bmNfaGVscCBub2V4aXQKKyAgICAgIGZvciBvcHRfbW9kZSBpbiBjb21waWxlIGxpbmsgZXhlY3V0ZSBpbnN0YWxsIGZpbmlzaCB1bmluc3RhbGwgY2xlYW47IGRvCisJZWNobworCWZ1bmNfbW9kZV9oZWxwCisgICAgICBkb25lCisgICAgfSB8CisgICAgc2VkICcxZAorICAgICAgL15XaGVuIHJlcG9ydGluZy8sL15SZXBvcnQveworCUgKKwlkCisgICAgICB9CisgICAgICAkeAorICAgICAgL2luZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzL2QKKyAgICAgIC9tb3JlIGRldGFpbGVkIC4qTU9ERS9kCisgICAgICBzL15Vc2FnZTouKi0tbW9kZT1cKFteIF0qXCkgLiovRGVzY3JpcHRpb24gb2YgXDEgbW9kZTovJworICBmaQorICBleGl0ICQ/CitmaQorCisKKyMgZnVuY19tb2RlX2V4ZWN1dGUgYXJnLi4uCitmdW5jX21vZGVfZXhlY3V0ZSAoKQoreworICAgICRvcHRfZGVidWcKKyAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgorICAgIGNtZD0iJG5vbm9wdCIKKyAgICB0ZXN0IC16ICIkY21kIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIgorCisgICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KKyAgICBmb3IgZmlsZSBpbiAkb3B0X2Rsb3BlbjsgZG8KKyAgICAgIHRlc3QgLWYgIiRmaWxlIiBcCisJfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSBmaWxlIgorCisgICAgICBkaXI9CisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLmxhKQorCWZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZmlsZSIKKwlmaWxlPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KKwlkbG5hbWU9CisJbGlicmFyeV9uYW1lcz0KKwlmdW5jX3NvdXJjZSAiJGZpbGUiCisKKwkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmIFwKKwkgICAgZnVuY193YXJuaW5nICJcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKKwkgIGNvbnRpbnVlCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIGRpciAiLyRvYmpkaXIiCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkZGlyLyRkbG5hbWUiOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciCisJICBmaQorCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCisJZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKwk7OworCisgICAgICAqKQorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCisgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisgICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCisKKyAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCisgICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKKyAgICAgIGVsc2UKKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCisgICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgorCisgICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgorICAgIGFyZ3M9CisgICAgZm9yIGZpbGUKKyAgICBkbworICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgLSogfCAqLmxhIHwgKi5sbyApIDs7CisgICAgICAqKQorCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJGZpbGUiOyB0aGVuCisJICBmdW5jX3NvdXJjZSAiJGZpbGUiCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZWxpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCisJICBmdW5jX3NvdXJjZSAiJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0IgorCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCisgICAgICBmdW5jX2FwcGVuZF9xdW90ZWQgYXJncyAiJGZpbGUiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiWCRvcHRfZHJ5X3J1biIgPSBYZmFsc2U7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCSMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgorCWV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisKKyAgICAgICMgUmVzdG9yZSBzYXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgIGZvciBsdF92YXIgaW4gTEFORyBMQU5HVUFHRSBMQ19BTEwgTENfQ1RZUEUgTENfQ09MTEFURSBMQ19NRVNTQUdFUworICAgICAgZG8KKwlldmFsICJpZiB0ZXN0IFwiXCR7c2F2ZV8kbHRfdmFyK3NldH1cIiA9IHNldDsgdGhlbgorICAgICAgICAgICAgICAgICRsdF92YXI9XCRzYXZlXyRsdF92YXI7IGV4cG9ydCAkbHRfdmFyCisJICAgICAgZWxzZQorCQkkbHRfdW5zZXQgJGx0X3ZhcgorCSAgICAgIGZpIgorICAgICAgZG9uZQorCisgICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCisgICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKKyAgICBlbHNlCisgICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZXZhbCAiXCRFQ0hPIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKwllY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorICAgICAgJEVDSE8gIiRjbWQkYXJncyIKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIGZpCit9CisKK3Rlc3QgIiRvcHRfbW9kZSIgPSBleGVjdXRlICYmIGZ1bmNfbW9kZV9leGVjdXRlICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2ZpbmlzaCBhcmcuLi4KK2Z1bmNfbW9kZV9maW5pc2ggKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbGlicz0KKyAgICBsaWJkaXJzPQorICAgIGFkbWluY21kcz0KKworICAgIGZvciBvcHQgaW4gIiRub25vcHQiICR7MSsiJEAifQorICAgIGRvCisgICAgICBpZiB0ZXN0IC1kICIkb3B0IjsgdGhlbgorCWZ1bmNfYXBwZW5kIGxpYmRpcnMgIiAkb3B0IgorCisgICAgICBlbGlmIHRlc3QgLWYgIiRvcHQiOyB0aGVuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJG9wdCI7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIGxpYnMgIiAkb3B0IgorCWVsc2UKKwkgIGZ1bmNfd2FybmluZyAiXGAkb3B0JyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJZmkKKworICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgYXJndW1lbnQgXGAkb3B0JyIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGxpYnMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkbHRfc3lzcm9vdCI7IHRoZW4KKyAgICAgICAgc3lzcm9vdF9yZWdleD1gJEVDSE8gIiRsdF9zeXNyb290IiB8ICRTRUQgIiRzZWRfbWFrZV9saXRlcmFsX3JlZ2V4ImAKKyAgICAgICAgc3lzcm9vdF9jbWQ9InMvXChbICddXCkkc3lzcm9vdF9yZWdleC9cMS9nOyIKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzcm9vdF9jbWQ9CisgICAgICBmaQorCisgICAgICAjIFJlbW92ZSBzeXNyb290IHJlZmVyZW5jZXMKKyAgICAgIGlmICRvcHRfZHJ5X3J1bjsgdGhlbgorICAgICAgICBmb3IgbGliIGluICRsaWJzOyBkbworICAgICAgICAgIGVjaG8gInJlbW92aW5nIHJlZmVyZW5jZXMgdG8gJGx0X3N5c3Jvb3QgYW5kIFxgPScgcHJlZml4ZXMgZnJvbSAkbGliIgorICAgICAgICBkb25lCisgICAgICBlbHNlCisgICAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisgICAgICAgIGZvciBsaWIgaW4gJGxpYnM7IGRvCisJICBzZWQgLWUgIiR7c3lzcm9vdF9jbWR9IHMvXChbICddLVtMUl1cKT0vXDEvZzsgcy9cKFsgJ11cKT0vXDEvZyIgJGxpYiBcCisJICAgID4gJHRtcGRpci90bXAtbGEKKwkgIG12IC1mICR0bXBkaXIvdG1wLWxhICRsaWIKKwlkb25lCisgICAgICAgICR7Uk19ciAiJHRtcGRpciIKKyAgICAgIGZpCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJGZpbmlzaF9jbWRzIiAnYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisnIiRjbWQiJyInCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCisJICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWRzIiB8fCBmdW5jX2FwcGVuZCBhZG1pbmNtZHMgIgorICAgICAgICRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgorICAgICRvcHRfc2lsZW50ICYmIGV4aXQgJEVYSVRfU1VDQ0VTUworCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICBlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCSRFQ0hPICIgICAkbGliZGlyIgorICAgICAgZG9uZQorICAgICAgZWNobworICAgICAgZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCisgICAgICBlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKKyAgICAgIGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCisgICAgICBlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwllY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorCWVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisJZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwlsaWJkaXI9TElCRElSCisJZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisJJEVDSE8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgorCSRFQ0hPICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorCWVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgorICAgICAgZmkKKyAgICAgIGVjaG8KKworICAgICAgZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCisgICAgICBjYXNlICRob3N0IGluCisJc29sYXJpczIuWzY3ODldfHNvbGFyaXMyLjFbMC05XSkKKwkgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpLCBjcmxlKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwiCisJICBlY2hvICJwYWdlcy4iCisJICA7OworCSopCisJICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKKwkgIDs7CisgICAgICBlc2FjCisgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgIGZpCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKK3Rlc3QgIiRvcHRfbW9kZSIgPSBmaW5pc2ggJiYgZnVuY19tb2RlX2ZpbmlzaCAkezErIiRAIn0KKworCisjIGZ1bmNfbW9kZV9pbnN0YWxsIGFyZy4uLgorZnVuY19tb2RlX2luc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgorICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoIHx8CisgICAgICAgIyBBbGxvdyB0aGUgdXNlIG9mIEdOVSBzaHRvb2wncyBpbnN0YWxsIGNvbW1hbmQuCisgICAgICAgY2FzZSAkbm9ub3B0IGluICpzaHRvb2wqKSA6OzsgKikgZmFsc2U7OyBlc2FjOyB0aGVuCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbm9ub3B0IgorICAgICAgaW5zdGFsbF9wcm9nPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQgIgorICAgICAgYXJnPSQxCisgICAgICBzaGlmdAorICAgIGVsc2UKKyAgICAgIGluc3RhbGxfcHJvZz0KKyAgICAgIGFyZz0kbm9ub3B0CisgICAgZmkKKworICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KKyAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKyAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3Byb2cgIiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICBpbnN0YWxsX3NoYXJlZF9wcm9nPSRpbnN0YWxsX3Byb2cKKyAgICBjYXNlICIgJGluc3RhbGxfcHJvZyAiIGluCisgICAgICAqW1xcXCAvXWNwXCAqKSBpbnN0YWxsX2NwPTogOzsKKyAgICAgICopIGluc3RhbGxfY3A9ZmFsc2UgOzsKKyAgICBlc2FjCisKKyAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCisgICAgZGVzdD0KKyAgICBmaWxlcz0KKyAgICBvcHRzPQorICAgIHByZXY9CisgICAgaW5zdGFsbF90eXBlPQorICAgIGlzZGlyPW5vCisgICAgc3RyaXBtZT0KKyAgICBub19tb2RlPToKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGFyZzI9CisgICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KKwlmdW5jX2FwcGVuZCBmaWxlcyAiICRkZXN0IgorCWRlc3Q9JGFyZworCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKKyAgICAgIC1mKQorCWlmICRpbnN0YWxsX2NwOyB0aGVuIDo7IGVsc2UKKwkgIHByZXY9JGFyZworCWZpCisJOzsKKyAgICAgIC1nIHwgLW0gfCAtbykKKwlwcmV2PSRhcmcKKwk7OworICAgICAgLXMpCisJc3RyaXBtZT0iIC1zIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIC0qKQorCTs7CisgICAgICAqKQorCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KKwlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwkgIGlmIHRlc3QgIngkcHJldiIgPSB4LW0gJiYgdGVzdCAtbiAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSI7IHRoZW4KKwkgICAgYXJnMj0kaW5zdGFsbF9vdmVycmlkZV9tb2RlCisJICAgIG5vX21vZGU9ZmFsc2UKKwkgIGZpCisJICBwcmV2PQorCWVsc2UKKwkgIGRlc3Q9JGFyZworCSAgY29udGludWUKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgICAgZnVuY19hcHBlbmQgaW5zdGFsbF9wcm9nICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgICAgaWYgdGVzdCAtbiAiJGFyZzIiOyB0aGVuCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZzIiCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgaW5zdGFsbF9zaGFyZWRfcHJvZyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICBkb25lCisKKyAgICB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIgorCisgICAgdGVzdCAtbiAiJHByZXYiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKKworICAgIGlmIHRlc3QgLW4gIiRpbnN0YWxsX292ZXJyaWRlX21vZGUiICYmICRub19tb2RlOyB0aGVuCisgICAgICBpZiAkaW5zdGFsbF9jcDsgdGhlbiA6OyBlbHNlCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSIKKwlmdW5jX2FwcGVuZCBpbnN0YWxsX3NoYXJlZF9wcm9nICIgLW0gJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCisJZnVuY19mYXRhbF9oZWxwICJubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKKyAgICAgIGVsc2UKKwlmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiJGRlc3QiCisgICAgZGVzdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkZGVzdCIgIiIgIi4iCisgICAgICBkZXN0ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICAgIGRlc3RuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKyAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KKyAgICAgIHNldCBkdW1teSAkZmlsZXM7IHNoaWZ0CisgICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAorCWZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IgorICAgIGZpCisgICAgY2FzZSAkZGVzdGRpciBpbgorICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKyAgICAqKQorICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCWNhc2UgJGZpbGUgaW4KKwkqLmxvKSA7OworCSopCisJICBmdW5jX2ZhdGFsX2hlbHAgIlxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLiRsaWJleHQpCisJIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKwlmdW5jX2FwcGVuZCBzdGF0aWNsaWJzICIgJGZpbGUiCisJOzsKKworICAgICAgKi5sYSkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZpbGUiCisJZmlsZT0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRmaWxlIiBcCisJICB8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKworCWxpYnJhcnlfbmFtZXM9CisJb2xkX2xpYnJhcnk9CisJcmVsaW5rX2NvbW1hbmQ9CisJZnVuY19zb3VyY2UgIiRmaWxlIgorCisJIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgorCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCisJICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBjdXJyZW50X2xpYmRpcnMgIiAkbGliZGlyIiA7OworCSAgZXNhYworCWVsc2UKKwkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KKwkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZnV0dXJlX2xpYmRpcnMgIiAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisKKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiLyIgIiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCWZ1bmNfYXBwZW5kIGRpciAiJG9iamRpciIKKworCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCisJICBpbnN0X3ByZWZpeF9kaXI9YCRFQ0hPICIkZGVzdGRpciIgfCAkU0VEIC1lICJzJSRsaWJkaXJcJCUlImAKKworCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAorCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAorCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KKwkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCisJICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KKwkgIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiBjYW5ub3QgaW5zdGFsbCBcYCRmaWxlJyB0byBhIGRpcmVjdG9yeSBub3QgZW5kaW5nIGluICRsaWJkaXIiCisKKwkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKKwkgIGVsc2UKKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKKwkgIGZpCisKKwkgIGZ1bmNfd2FybmluZyAicmVsaW5raW5nIFxgJGZpbGUnIgorCSAgZnVuY19zaG93X2V2YWwgIiRyZWxpbmtfY29tbWFuZCIgXAorCSAgICAnZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJ1wnJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IicKKwlmaQorCisJIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXM7IHNoaWZ0CisJaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisJICByZWFsbmFtZT0iJDEiCisJICBzaGlmdAorCisJICBzcmNuYW1lPSIkcmVhbG5hbWUiCisJICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCisKKwkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9zaGFyZWRfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgXAorCSAgICAgICdleGl0ICQ/JworCSAgdHN0cmlwbWU9IiRzdHJpcG1lIgorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorCSAgICBjYXNlICRyZWFsbmFtZSBpbgorCSAgICAqLmRsbC5hKQorCSAgICAgIHRzdHJpcG1lPSIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAtbiAiJHRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCisJICAgIGZ1bmNfc2hvd19ldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiAnZXhpdCAkPycKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgorCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgorCSAgICAjIFRyeSBgbG4gLXNmJyBmaXJzdCwgYmVjYXVzZSB0aGUgYGxuJyBiaW5hcnkgbWlnaHQgZGVwZW5kIG9uCisJICAgICMgdGhlIHN5bWxpbmsgd2UgcmVwbGFjZSEgIFNvbGFyaXMgL2Jpbi9sbiBkb2VzIG5vdCB1bmRlcnN0YW5kIC1mLAorCSAgICAjIHNvIHdlIGFsc28gbmVlZCB0byB0cnkgcm0gJiYgbG4gLXMuCisJICAgIGZvciBsaW5rbmFtZQorCSAgICBkbworCSAgICAgIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSIgXAorCQkmJiBmdW5jX3Nob3dfZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRSTSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCisJICAgIGRvbmUKKwkgIGZpCisKKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKwkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKKwlmaQorCisJIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCisJZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKKwlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiICdleGl0ICQ/JworCisJIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgZnVuY19hcHBlbmQgc3RhdGljbGlicyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCTs7CisKKyAgICAgICoubG8pCisJIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCisKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwkgIGRlc3RmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCWNhc2UgJGRlc3RmaWxlIGluCisJKi5sbykKKwkgIGZ1bmNfbG8ybyAiJGRlc3RmaWxlIgorCSAgc3RhdGljZGVzdD0kZnVuY19sbzJvX3Jlc3VsdAorCSAgOzsKKwkqLiRvYmpleHQpCisJICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCisJICBkZXN0ZmlsZT0KKwkgIDs7CisJKikKKwkgIGZ1bmNfZmF0YWxfaGVscCAiY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciCisJICA7OworCWVzYWMKKworCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgorCXRlc3QgLW4gIiRkZXN0ZmlsZSIgJiYgXAorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiAnZXhpdCAkPycKKworCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgorCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJICBmdW5jX2xvMm8gIiRmaWxlIgorCSAgc3RhdGljb2JqPSRmdW5jX2xvMm9fcmVzdWx0CisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiICdleGl0ICQ/JworCWZpCisJZXhpdCAkRVhJVF9TVUNDRVNTCisJOzsKKworICAgICAgKikKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwkgIGRlc3RmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIGFuZCB0aGVyZSBpcyBhIC5leGUgb24gdGhlIGVuZCwgc3RyaXAgaXQKKwkjIGJlY2F1c2UgaXQgaXMgbW9zdCBsaWtlbHkgYSBsaWJ0b29sIHNjcmlwdCB3ZSBhY3R1YWxseSB3YW50IHRvCisJIyBpbnN0YWxsCisJc3RyaXBwZWRfZXh0PSIiCisJY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCisJICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgICBmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgICBzdHJpcHBlZF9leHQ9Ii5leGUiCisJICAgIGZpCisJICAgIDs7CisJZXNhYworCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWNhc2UgJGhvc3QgaW4KKwkqY3lnd2luKiB8ICptaW5ndyopCisJICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCisJICAgICAgd3JhcHBlcj0kZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgICAgd3JhcHBlcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIGZpCisJICAgIDs7CisJKikKKwkgICAgd3JhcHBlcj0kZmlsZQorCSAgICA7OworCWVzYWMKKwlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJHdyYXBwZXIiOyB0aGVuCisJICBub3RpbnN0X2RlcGxpYnM9CisJICByZWxpbmtfY29tbWFuZD0KKworCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgorCisJICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KKwkgIHRlc3QgLXogIiRnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCR3cmFwcGVyJyIKKworCSAgZmluYWxpemU9eWVzCisJICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCisJICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KKwkgICAgbGliZGlyPQorCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCSAgICAgIGZ1bmNfc291cmNlICIkbGliIgorCSAgICBmaQorCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJEVDSE8gIiRsaWIiIHwgJFNFRCAncyVeLiovJSVnJ2AgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCisJICAgICAgZnVuY193YXJuaW5nICJcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIKKwkgICAgICBmaW5hbGl6ZT1ubworCSAgICBmaQorCSAgZG9uZQorCisJICByZWxpbmtfY29tbWFuZD0KKwkgIGZ1bmNfc291cmNlICIkd3JhcHBlciIKKworCSAgb3V0cHV0bmFtZT0KKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KKwkgICAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisJCWZ1bmNfYmFzZW5hbWUgIiRmaWxlJHN0cmlwcGVkX2V4dCIKKwkJZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKKwkgICAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwkgICAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAorCisJICAgICAgICAkb3B0X3NpbGVudCB8fCB7CisJICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJHJlbGlua19jb21tYW5kIgorCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKwkgICAgICAgIH0KKwkgICAgICAgIGlmIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgorCSAgICAgICAgICBlbHNlCisJCSAgZnVuY19lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IgorCQkgICRvcHRfZHJ5X3J1biB8fCAke1JNfXIgIiR0bXBkaXIiCisJCSAgY29udGludWUKKwkgICAgICAgIGZpCisJICAgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKKwkgICAgICBlbHNlCisJICAgICAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCByZWxpbmsgXGAkZmlsZSciCisJICAgICAgZmkKKwkgICAgfQorCSAgZWxzZQorCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCisJICAgIGZpbGU9YCRFQ0hPICIkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFNFRCAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKKwkgIGZpCisJZmkKKworCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgorCSMgb25lIGFueXdheQorCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgorCSovdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKKwkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCisJICAqLmV4ZToqLmV4ZSkKKwkgICAgIyB0aGlzIGlzIG9rCisJICAgIDs7CisJICAqLmV4ZToqKQorCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCisJICAgIDs7CisJICAqOiouZXhlKQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRkZXN0ZmlsZSIKKwkgICAgZGVzdGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiICdleGl0ICQ/JworCSRvcHRfZHJ5X3J1biB8fCBpZiB0ZXN0IC1uICIkb3V0cHV0bmFtZSI7IHRoZW4KKwkgICR7Uk19ciAiJHRtcGRpciIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCisgICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKyAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgorICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2xkbGliIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgdG9vbF9vbGRsaWI9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiICdleGl0ICQ/JworCisgICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAiJG9sZF9zdHJpcGxpYiAkdG9vbF9vbGRsaWIiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgJ2V4aXQgJD8nCisgICAgZG9uZQorCisgICAgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIiAmJiBcCisgICAgICBmdW5jX3dhcm5pbmcgInJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgICRvcHRfZHJ5X3J1biAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjX2NtZD0nJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCisgICAgZWxzZQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGluc3RhbGwgJiYgZnVuY19tb2RlX2luc3RhbGwgJHsxKyIkQCJ9CisKKworIyBmdW5jX2dlbmVyYXRlX2Rsc3ltcyBvdXRwdXRuYW1lIG9yaWdpbmF0b3IgcGljX3AKKyMgRXh0cmFjdCBzeW1ib2xzIGZyb20gZGxwcmVmaWxlcyBhbmQgY3JlYXRlICR7b3V0cHV0bmFtZX1TLm8gd2l0aAorIyBhIGRscHJlb3BlbiBzeW1ib2wgdGFibGUuCitmdW5jX2dlbmVyYXRlX2Rsc3ltcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9vdXRwdXRuYW1lPSIkMSIKKyAgICBteV9vcmlnaW5hdG9yPSIkMiIKKyAgICBteV9waWNfcD0iJHszLW5vfSIKKyAgICBteV9wcmVmaXg9YCRFQ0hPICIkbXlfb3JpZ2luYXRvciIgfCBzZWQgJ3MlW15hLXpBLVowLTldJV8lZydgCisgICAgbXlfZGxzeW1zPQorCisgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwlteV9kbHN5bXM9IiR7bXlfb3V0cHV0bmFtZX1TLmMiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAibm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJG15X2Rsc3ltcyI7IHRoZW4KKyAgICAgIGNhc2UgJG15X2Rsc3ltcyBpbgorICAgICAgIiIpIDs7CisgICAgICAqLmMpCisJIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKwlubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfS5ubSIKKworCWZ1bmNfc2hvd19ldmFsICIkUk0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisKKwkjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgorCWZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKworCSRvcHRfZHJ5X3J1biB8fCAkRUNITyA+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorLyogJG15X2Rsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRteV9vdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIFwiQ1wiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDQpKSB8fCAoX19HTlVDX18gPiA0KSkKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCBcIi1Xc3RyaWN0LXByb3RvdHlwZXNcIgorI2VuZGlmCisKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwlpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAkb3B0X2RyeV9ydW4gfHwgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwkgIHByb2dmaWxlcz1gJEVDSE8gIiRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwkgIGZvciBwcm9nZmlsZSBpbiAkcHJvZ2ZpbGVzOyBkbworCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHByb2dmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCciCisJICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkTk0gJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgfQorCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICB9CisJICBmaQorCisJICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCSAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisgICAgICAgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZWxzZQorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgIiR7U0VEfSAtZSAncy9cKFtdLlsqXiRdXCkvXFxcXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJworCSAgICAgIGV2YWwgJyRHUkVQIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkgICAgICAgICAgZXZhbCAnY2F0ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZmkKKwlmaQorCisJZm9yIGRscHJlZmlsZSBpbiAkZGxwcmVmaWxlczsgZG8KKwkgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkZGxwcmVmaWxlJyIKKwkgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGUiCisJICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAjIGlmIGFuIGltcG9ydCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIG9idGFpbiBkbG5hbWUKKwkgICAgICBpZiBmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCAiJGRscHJlZmlsZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfdHJfc2ggIiRkbHByZWZpbGUiCisJICAgICAgICBldmFsICJjdXJyX2xhZmlsZT1cJGxpYmZpbGVfJGZ1bmNfdHJfc2hfcmVzdWx0IgorCSAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9IiIKKwkgICAgICAgIGlmIHRlc3QgLW4gIiRjdXJyX2xhZmlsZSIgJiYgZnVuY19sYWxpYl9wICIkY3Vycl9sYWZpbGUiOyB0aGVuCisJICAgICAgICAgICMgVXNlIHN1YnNoZWxsLCB0byBhdm9pZCBjbG9iYmVyaW5nIGN1cnJlbnQgdmFyaWFibGUgdmFsdWVzCisJICAgICAgICAgIGRscHJlZmlsZV9kbG5hbWU9YHNvdXJjZSAiJGN1cnJfbGFmaWxlIiAmJiBlY2hvICIkZGxuYW1lImAKKwkgICAgICAgICAgaWYgdGVzdCAtbiAiJGRscHJlZmlsZV9kbG5hbWUiIDsgdGhlbgorCSAgICAgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGVfZGxuYW1lIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICAjIG5vIGxhZmlsZS4gdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCAtZGxwcmVvcGVuIDxpbXBvcnQgbGlicmFyeT4uCisJICAgICAgICAgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kICIkZGxwcmVmaWxlIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorCSAgICAgICAgICBmaQorCSAgICAgICAgZmkKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbHByZWZpbGVfZGxiYXNlbmFtZSIgOyB0aGVuCisJICAgICAgICAgICAgZXZhbCAnJEVDSE8gIjogJGRscHJlZmlsZV9kbGJhc2VuYW1lIiA+PiAiJG5saXN0IicKKwkgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgIGZ1bmNfd2FybmluZyAiQ291bGQgbm90IGNvbXB1dGUgRExMIG5hbWUgZnJvbSAkbmFtZSIKKwkgICAgICAgICAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAgICAgICBmaQorCSAgICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgICAgZXZhbCAiJE5NIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8CisJICAgICAgICAgICAgJFNFRCAtZSAnL0kgX19pbXAvZCcgLWUgJ3MvSSBfX25tXy9EIC87cy9fbm1fXy8vJyA+PiAnJG5saXN0JyIKKwkgICAgICAgIH0KKwkgICAgICBlbHNlICMgbm90IGFuIGltcG9ydCBsaWIKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgICBldmFsICIkTk0gXCIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICAgICAgfQorCSAgICAgIGZpCisJICAgIDs7CisJICAgICopCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgIGV2YWwgIiROTSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgICAgfQorCSAgICA7OworICAgICAgICAgIGVzYWMKKwlkb25lCisKKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgorCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKKwkgICAgJE1WICIkbmxpc3QiVCAiJG5saXN0IgorCSAgZmkKKworCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKwkgIGlmICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgfAorCSAgICAgIGlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzb3J0IC1rIDMKKwkgICAgICBlbHNlCisJCXNvcnQgKzIKKwkgICAgICBmaSB8CisJICAgICAgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiJworCSAgZWxzZQorCSAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgIGZpCisKKwkgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAqYWRkcmVzczsKK30gbHRfZGxzeW1saXN0OworZXh0ZXJuIExUX0RMU1lNX0NPTlNUIGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdOworTFRfRExTWU1fQ09OU1QgbHRfZGxzeW1saXN0CitsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW10gPQore1wKKyAgeyBcIiRteV9vcmlnaW5hdG9yXCIsICh2b2lkICopIDAgfSwiCisKKwkgIGNhc2UgJG5lZWRfbGliX3ByZWZpeCBpbgorCSAgbm8pCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgICA7OworCSAgKikKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZlwKKyIKKwl9ICMgISRvcHRfZHJ5X3J1bgorCisJcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQorCWNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgorCSoiIC1zdGF0aWMgIiopIDs7CisJKikKKwkgIGNhc2UgJGhvc3QgaW4KKwkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAorCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCisJICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCisJICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KKwkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCisJICAqLSotZnJlZWJzZDIuKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQorCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURGUkVFQlNEX1dPUktBUk9VTkQiIDs7CisJICAqLSotaHB1eCopCisJICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICJYJG15X3BpY19wIiAhPSBYbm87IHRoZW4KKwkgICAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwlzeW10YWJfY2ZsYWdzPQorCWZvciBhcmcgaW4gJExUQ0ZMQUdTOyBkbworCSAgY2FzZSAkYXJnIGluCisJICAtcGllIHwgLWZwaWUgfCAtZlBJRSkgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHN5bXRhYl9jZmxhZ3MgIiAkYXJnIiA7OworCSAgZXNhYworCWRvbmUKKworCSMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJZnVuY19zaG93X2V2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyRzeW10YWJfY2ZsYWdzIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRteV9kbHN5bXMiKScgJ2V4aXQgJD8nCisKKwkjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCInCisKKwkjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorCXN5bWZpbGVvYmo9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX1TLiRvYmpleHQiCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmIjsgdGhlbgorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICBlbHNlCisJICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaQorCSAgOzsKKwkqKQorCSAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlmdW5jX2ZhdGFsX2Vycm9yICJ1bmtub3duIHN1ZmZpeCBmb3IgXGAkbXlfZGxzeW1zJyIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisgICAgICAjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisgICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKyAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJSBAU1lNRklMRUAlJSJgCisgICAgZmkKK30KKworIyBmdW5jX3dpbjMyX2xpYmlkIGFyZworIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCisjCisjIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKKyMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50CisjIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KKyMgRGVzcGl0ZSB0aGUgbmFtZSwgYWxzbyBkZWFsIHdpdGggNjQgYml0IGJpbmFyaWVzLgorZnVuY193aW4zMl9saWJpZCAoKQoreworICAkb3B0X2RlYnVnCisgIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCisgIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCisgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KKyAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0CisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgorICAgIDs7CisgICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKKyAgICAjIEtlZXAgdGhlIGVncmVwIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gX0xUX0NIRUNLX01BR0lDX01FVEhPRC4KKyAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8CisgICAgICAgJEVHUkVQICdmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiB8CisJJFNFRCAtbiAtZSAnCisJICAgIDEsMTAweworCQkvIEkgL3sKKwkJICAgIHMsLiosaW1wb3J0LAorCQkgICAgcAorCQkgICAgcQorCQl9CisJICAgIH0nYAorICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KKyAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKKyAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgICpETEwqKQorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgOzsKKyAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCisgICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKKyAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICRFQ0hPICIkd2luMzJfbGliaWRfdHlwZSIKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIgQVJHCisjCisjIFBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCisjIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorIyBpbXBvcnQgbGlicmFyeSBBUkcuCisjIEludm9rZWQgYnkgZXZhbCdpbmcgdGhlIGxpYnRvb2wgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gdGhlIHZhcmlhYmxlCisjICAgICRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliICgpCit7CisgICRvcHRfZGVidWcKKyAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9YCRETExUT09MIC0taWRlbnRpZnktc3RyaWN0IC0taWRlbnRpZnkgIiQxImAKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSBTRUNUSU9OX05BTUUgTElCTkFNRXMKKyMKKyMgVGhlIGlzIHRoZSBjb3JlIG9mIGEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYQorIyBwbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBleHRyYWN0IHRoZSBuYW1lIG9mIHRoZQorIyBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgaW1wb3J0IGxpYnJhcnkgTElCTkFNRS4KKyMKKyMgU0VDVElPTl9OQU1FIGlzIGVpdGhlciAuaWRhdGEkNiBvciAuaWRhdGEkNywgZGVwZW5kaW5nCisjIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY29tcGlsZXIgdGhhdCBjcmVhdGVkIHRoZSBpbXBsaWIuCisjCisjIEVjaG9zIHRoZSBuYW1lIG9mIHRoZSBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZQorIyBzcGVjaWZpZWQgaW1wb3J0IGxpYnJhcnkuCitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSAoKQoreworICAkb3B0X2RlYnVnCisgIG1hdGNoX2xpdGVyYWw9YCRFQ0hPICIkMSIgfCAkU0VEICIkc2VkX21ha2VfbGl0ZXJhbF9yZWdleCJgCisgICRPQkpEVU1QIC1zIC0tc2VjdGlvbiAiJDEiICIkMiIgMj4vZGV2L251bGwgfAorICAgICRTRUQgJy9eQ29udGVudHMgb2Ygc2VjdGlvbiAnIiRtYXRjaF9saXRlcmFsIic6L3sKKyAgICAgICMgUGxhY2UgbWFya2VyIGF0IGJlZ2lubmluZyBvZiBhcmNoaXZlIG1lbWJlciBkbGxuYW1lIHNlY3Rpb24KKyAgICAgIHMvLiovPT09PU1BUks9PT09LworICAgICAgcAorICAgICAgZAorICAgIH0KKyAgICAjIFRoZXNlIGxpbmVzIGNhbiBzb21ldGltZXMgYmUgbG9uZ2VyIHRoYW4gNDMgY2hhcmFjdGVycywgYnV0CisgICAgIyBhcmUgYWx3YXlzIHVuaW50ZXJlc3RpbmcKKyAgICAvOlsJIF0qZmlsZSBmb3JtYXQgcGVbaV1ceywxXH0tL2QKKyAgICAvXkluIGFyY2hpdmUgW146XSo6L2QKKyAgICAjIEVuc3VyZSBtYXJrZXIgaXMgcHJpbnRlZAorICAgIC9ePT09PU1BUks9PT09L3AKKyAgICAjIFJlbW92ZSBhbGwgbGluZXMgd2l0aCBsZXNzIHRoYW4gNDMgY2hhcmFjdGVycworICAgIC9eLlx7NDNcfS8hZAorICAgICMgRnJvbSByZW1haW5pbmcgbGluZXMsIHJlbW92ZSBmaXJzdCA0MyBjaGFyYWN0ZXJzCisgICAgcy9eLlx7NDNcfS8vJyB8CisgICAgJFNFRCAtbiAnCisgICAgICAjIEpvaW4gbWFya2VyIGFuZCBhbGwgbGluZXMgdW50aWwgbmV4dCBtYXJrZXIgaW50byBhIHNpbmdsZSBsaW5lCisgICAgICAvXj09PT1NQVJLPT09PS8gYiBwYXJhCisgICAgICBICisgICAgICAkIGIgcGFyYQorICAgICAgYgorICAgICAgOnBhcmEKKyAgICAgIHgKKyAgICAgIHMvXG4vL2cKKyAgICAgICMgUmVtb3ZlIHRoZSBtYXJrZXIKKyAgICAgIHMvXj09PT1NQVJLPT09PS8vCisgICAgICAjIFJlbW92ZSB0cmFpbGluZyBkb3RzIGFuZCB3aGl0ZXNwYWNlCisgICAgICBzL1tcLiBcdF0qJC8vCisgICAgICAjIFByaW50CisgICAgICAvLi9wJyB8CisgICAgIyB3ZSBub3cgaGF2ZSBhIGxpc3QsIG9uZSBlbnRyeSBwZXIgbGluZSwgb2YgdGhlIHN0cmluZ2lmaWVkCisgICAgIyBjb250ZW50cyBvZiB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbiBvZiBhbGwgbWVtYmVycyBvZiB0aGUKKyAgICAjIGFyY2hpdmUgd2hpY2ggcG9zc2VzcyB0aGF0IHNlY3Rpb24uIEhldXJpc3RpYzogZWxpbWluYXRlCisgICAgIyBhbGwgdGhvc2Ugd2hpY2ggaGF2ZSBhIGZpcnN0IG9yIHNlY29uZCBjaGFyYWN0ZXIgdGhhdCBpcworICAgICMgYSAnLicgKHRoYXQgaXMsIG9iamR1bXAncyByZXByZXNlbnRhdGlvbiBvZiBhbiB1bnByaW50YWJsZQorICAgICMgY2hhcmFjdGVyLikgVGhpcyBzaG91bGQgd29yayBmb3IgYWxsIGFyY2hpdmVzIHdpdGggbGVzcyB0aGFuCisgICAgIyAweDMwMmYgZXhwb3J0cyAtLSBidXQgd2lsbCBmYWlsIGZvciBETExzIHdob3NlIG5hbWUgYWN0dWFsbHkKKyAgICAjIGJlZ2lucyB3aXRoIGEgbGl0ZXJhbCAnLicgb3IgYSBzaW5nbGUgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5CisgICAgIyBhICcuJy4KKyAgICAjCisgICAgIyBPZiB0aG9zZSB0aGF0IHJlbWFpbiwgcHJpbnQgdGhlIGZpcnN0IG9uZS4KKyAgICAkU0VEIC1lICcvXlwuL2Q7L14uXC4vZDtxJworfQorCisjIGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3AgQVJHCisjIFRoaXMgcHJlZGljYXRlIHJldHVybnMgd2l0aCB6ZXJvIHN0YXR1cyAoVFJVRSkgaWYKKyMgQVJHIGlzIGEgR05VL2JpbnV0aWxzLXN0eWxlIGltcG9ydCBsaWJyYXJ5LiBSZXR1cm5zCisjIHdpdGggbm9uemVybyBzdGF0dXMgKEZBTFNFKSBvdGhlcndpc2UuCitmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl9wICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b190b29sX2ZpbGUgIiQxIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICBmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl90bXA9YCROTSAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgfCBldmFsICIkZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRFR1JFUCAnIChfaGVhZF9bQS1aYS16MC05X10rX1thZF1sKnxbQS1aYS16MC05X10rX1thZF1sKl9pbmFtZSkkJ2AKKyAgdGVzdCAtbiAiJGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3RtcCIKK30KKworIyBmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3AgQVJHCisjIFRoaXMgcHJlZGljYXRlIHJldHVybnMgd2l0aCB6ZXJvIHN0YXR1cyAoVFJVRSkgaWYKKyMgQVJHIGlzIGFuIE1TLXN0eWxlIGltcG9ydCBsaWJyYXJ5LiBSZXR1cm5zCisjIHdpdGggbm9uemVybyBzdGF0dXMgKEZBTFNFKSBvdGhlcndpc2UuCitmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3AgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX3Rvb2xfZmlsZSAiJDEiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfdG1wPWAkTk0gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiIHwgZXZhbCAiJGdsb2JhbF9zeW1ib2xfcGlwZSIgfCAkR1JFUCAnX05VTExfSU1QT1JUX0RFU0NSSVBUT1InYAorICB0ZXN0IC1uICIkZnVuY19jeWdtaW5nX21zX2ltcGxpYl90bXAiCit9CisKKyMgZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrIEFSRworIyBQbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBleHRyYWN0IHRoZQorIyBuYW1lIG9mIHRoZSBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyMgaW1wb3J0IGxpYnJhcnkgQVJHLgorIworIyBUaGlzIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGlzIGZvciB1c2Ugd2hlbiAkRExMVE9PTAorIyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAtLWlkZW50aWZ5LXN0cmljdCBvcHRpb24uCisjIEludm9rZWQgYnkgZXZhbCdpbmcgdGhlIGxpYnRvb2wgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gdGhlIHZhcmlhYmxlCisjICAgICRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrICgpCit7CisgICRvcHRfZGVidWcKKyAgaWYgZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfcCAiJDEiIDsgdGhlbgorICAgICMgYmludXRpbHMgaW1wb3J0IGxpYnJhcnkKKyAgICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrX2NvcmUgJy5pZGF0YSQ3JyAiJDEiYAorICBlbGlmIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfcCAiJDEiIDsgdGhlbgorICAgICMgbXMtZ2VuZXJhdGVkIGltcG9ydCBsaWJyYXJ5CisgICAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9YGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlICcuaWRhdGEkNicgIiQxImAKKyAgZWxzZQorICAgICMgdW5rbm93bgorICAgIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0PSIiCisgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCitmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAorICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKKyAgICBpZiB0ZXN0ICIkbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uIiA9IHllczsgdGhlbgorICAgICAgbG9ja2ZpbGU9JGZfZXhfYW5fYXJfb2xkbGliLmxvY2sKKyAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBmaQorICAgIGZ1bmNfc2hvd19ldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcIlwkZl9leF9hbl9hcl9vbGRsaWJcIikiIFwKKwkJICAgJ3N0YXQ9JD87IHJtIC1mICIkbG9ja2ZpbGUiOyBleGl0ICRzdGF0JworICAgIGlmIHRlc3QgIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iID0geWVzOyB0aGVuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgcm0gLWYgIiRsb2NrZmlsZSIKKyAgICBmaQorICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgIDoKKyAgICBlbHNlCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJvYmplY3QgbmFtZSBjb25mbGljdHMgaW4gYXJjaGl2ZTogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIKKyAgICBmaQorfQorCisKKyMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCitmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0CisgICAgbXlfb2xkbGlicz0kezErIiRAIn0KKyAgICBteV9vbGRvYmpzPSIiCisgICAgbXlfeGxpYj0iIgorICAgIG15X3hhYnM9IiIKKyAgICBteV94ZGlyPSIiCisKKyAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KKyAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKyAgICAgIGNhc2UgJG15X3hsaWIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OworCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OworICAgICAgZXNhYworICAgICAgZnVuY19iYXNlbmFtZSAiJG15X3hsaWIiCisgICAgICBteV94bGliPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICBteV94bGliX3U9JG15X3hsaWIKKyAgICAgIHdoaWxlIDo7IGRvCisgICAgICAgIGNhc2UgIiAkZXh0cmFjdGVkX2FyY2hpdmVzICIgaW4KKwkqIiAkbXlfeGxpYl91ICIqKQorCSAgZnVuY19hcml0aCAkZXh0cmFjdGVkX3NlcmlhbCArIDEKKwkgIGV4dHJhY3RlZF9zZXJpYWw9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICBteV94bGliX3U9bHQkZXh0cmFjdGVkX3NlcmlhbC0kbXlfeGxpYiA7OworCSopIGJyZWFrIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZXh0cmFjdGVkX2FyY2hpdmVzPSIkZXh0cmFjdGVkX2FyY2hpdmVzICRteV94bGliX3UiCisgICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliX3UiCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJG15X3hkaXIiCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotZGFyd2luKikKKwlmdW5jX3ZlcmJvc2UgIkV4dHJhY3RpbmcgJG15X3hhYnMiCisJIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCisJJG9wdF9kcnlfcnVuIHx8IHsKKwkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAorCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPworCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKKwkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKKwkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YGJhc2VuYW1lICIkZGFyd2luX2FyY2hpdmUiYAorCSAgZGFyd2luX2FyY2hlcz1gJExJUE8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsIHx8IHRydWVgCisJICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4KKwkgICAgZGFyd2luX2FyY2hlcz1gJEVDSE8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAorCSAgICBkYXJ3aW5fYXJjaD0KKwkgICAgZnVuY192ZXJib3NlICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKKwkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCisJICAgICAgZnVuY19ta2Rpcl9wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgICRMSVBPIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKKwkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKKwkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKKwkgICAgICAkUk0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKKwkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCisgICAgICAgICAgICAjIyBPa2F5IG5vdyB3ZSd2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKKwkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJFNFRCAtZSAiJGJhc2VuYW1lIiB8IHNvcnQgLXVgCisJICAgIGRhcndpbl9maWxlPQorCSAgICBkYXJ3aW5fZmlsZXM9CisJICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbworCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgc29ydCB8ICROTDJTUGAKKwkgICAgICAkTElQTyAtY3JlYXRlIC1vdXRwdXQgIiRkYXJ3aW5fZmlsZSIgJGRhcndpbl9maWxlcworCSAgICBkb25lICMgJGRhcndpbl9maWxlbGlzdAorCSAgICAkUk0gLXJmIHVuZmF0LSQkCisJICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgorCSAgZWxzZQorCSAgICBjZCAkZGFyd2luX29yaWdfZGlyCisJICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorCSAgZmkgIyAkZGFyd2luX2FyY2hlcworCX0gIyAhJG9wdF9kcnlfcnVuCisJOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorCTs7CisgICAgICBlc2FjCisgICAgICBteV9vbGRvYmpzPSIkbXlfb2xkb2JqcyAiYGZpbmQgJG15X3hkaXIgLW5hbWUgXCouJG9iamV4dCAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgc29ydCB8ICROTDJTUGAKKyAgICBkb25lCisKKyAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0PSIkbXlfb2xkb2JqcyIKK30KKworCisjIGZ1bmNfZW1pdF93cmFwcGVyIFthcmc9bm9dCisjCisjIEVtaXQgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndworIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCisjIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZXMKKyMgc2V0IHRoZXJlaW4uCisjCisjIEFSRyBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVIKKyMgdmFyaWFibGUgd2lsbCB0YWtlLiAgSWYgJ3llcycsIHRoZW4gdGhlIGVtaXR0ZWQgc2NyaXB0CisjIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBpcyBzdG9yZWQgaXMKKyMgdGhlICRvYmpkaXIgZGlyZWN0b3J5LiAgVGhpcyBpcyBhIGN5Z3dpbi9taW5ndy1zcGVjaWZpYworIyBiZWhhdmlvci4KK2Z1bmNfZW1pdF93cmFwcGVyICgpCit7CisJZnVuY19lbWl0X3dyYXBwZXJfYXJnMT0kezEtbm99CisKKwkkRUNITyAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKK2ZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KK2lmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgorICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKyAgZ2VuZXJhdGVkX2J5X2xpYnRvb2xfdmVyc2lvbj0nJG1hY3JvX3ZlcnNpb24nCisgIG5vdGluc3RfZGVwbGlicz0nJG5vdGluc3RfZGVwbGlicycKK2Vsc2UKKyAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJEVDSE8gYXJlIGFscmVhZHkgc2V0LgorICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgZmlsZT1cIlwkMFwiIgorCisgICAgcUVDSE89YCRFQ0hPICIkRUNITyIgfCAkU0VEICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAkRUNITyAiXAorCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisgICAgRUNITz1cIiRxRUNIT1wiCisgIGZpCisKKyMgVmVyeSBiYXNpYyBvcHRpb24gcGFyc2luZy4gVGhlc2Ugb3B0aW9ucyBhcmUgKGEpIHNwZWNpZmljIHRvCisjIHRoZSBsaWJ0b29sIHdyYXBwZXIsIChiKSBhcmUgaWRlbnRpY2FsIGJldHdlZW4gdGhlIHdyYXBwZXIKKyMgL3NjcmlwdC8gYW5kIHRoZSB3cmFwcGVyIC9leGVjdXRhYmxlLyB3aGljaCBpcyB1c2VkIG9ubHkgb24KKyMgd2luZG93cyBwbGF0Zm9ybXMsIGFuZCAoYykgYWxsIGJlZ2luIHdpdGggdGhlIHN0cmluZyAiLS1sdC0iCisjIChhcHBsaWNhdGlvbiBwcm9ncmFtcyBhcmUgdW5saWtlbHkgdG8gaGF2ZSBvcHRpb25zIHdoaWNoIG1hdGNoCisjIHRoaXMgcGF0dGVybikuCisjCisjIFRoZXJlIGFyZSBvbmx5IHR3byBzdXBwb3J0ZWQgb3B0aW9uczogLS1sdC1kZWJ1ZyBhbmQKKyMgLS1sdC1kdW1wLXNjcmlwdC4gVGhlcmUgaXMsIGRlbGliZXJhdGVseSwgbm8gLS1sdC1oZWxwLgorIworIyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhpcyBwYXJzaW5nIGZ1bmN0aW9uIHNob3VsZCBiZSB0aGUKKyMgc2NyaXB0J3MgJDAgdmFsdWUsIGZvbGxvd2VkIGJ5ICIkQCIuCitsdF9vcHRpb25fZGVidWc9CitmdW5jX3BhcnNlX2x0X29wdGlvbnMgKCkKK3sKKyAgbHRfc2NyaXB0X2FyZzA9XCQwCisgIHNoaWZ0CisgIGZvciBsdF9vcHQKKyAgZG8KKyAgICBjYXNlIFwiXCRsdF9vcHRcIiBpbgorICAgIC0tbHQtZGVidWcpIGx0X29wdGlvbl9kZWJ1Zz0xIDs7CisgICAgLS1sdC1kdW1wLXNjcmlwdCkKKyAgICAgICAgbHRfZHVtcF9EPVxgXCRFQ0hPIFwiWFwkbHRfc2NyaXB0X2FyZzBcIiB8ICRTRUQgLWUgJ3MvXlgvLycgLWUgJ3MlL1teL10qJCUlJ1xgCisgICAgICAgIHRlc3QgXCJYXCRsdF9kdW1wX0RcIiA9IFwiWFwkbHRfc2NyaXB0X2FyZzBcIiAmJiBsdF9kdW1wX0Q9LgorICAgICAgICBsdF9kdW1wX0Y9XGBcJEVDSE8gXCJYXCRsdF9zY3JpcHRfYXJnMFwiIHwgJFNFRCAtZSAncy9eWC8vJyAtZSAncyVeLiovJSUnXGAKKyAgICAgICAgY2F0IFwiXCRsdF9kdW1wX0QvXCRsdF9kdW1wX0ZcIgorICAgICAgICBleGl0IDAKKyAgICAgIDs7CisgICAgLS1sdC0qKQorICAgICAgICBcJEVDSE8gXCJVbnJlY29nbml6ZWQgLS1sdC0gb3B0aW9uOiAnXCRsdF9vcHQnXCIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIyBQcmludCB0aGUgZGVidWcgYmFubmVyIGltbWVkaWF0ZWx5OgorICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgIGVjaG8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBsaWJ0b29sIHdyYXBwZXIgKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OXCIgMT4mMgorICBmaQorfQorCisjIFVzZWQgd2hlbiAtLWx0LWRlYnVnLiBQcmludHMgaXRzIGFyZ3VtZW50cyB0byBzdGRvdXQKKyMgKHJlZGlyZWN0aW9uIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyKQorZnVuY19sdF9kdW1wX2FyZ3MgKCkKK3sKKyAgbHRfZHVtcF9hcmdzX049MTsKKyAgZm9yIGx0X2FyZworICBkbworICAgIFwkRUNITyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IG5ld2FyZ3ZbXCRsdF9kdW1wX2FyZ3NfTl06IFwkbHRfYXJnXCIKKyAgICBsdF9kdW1wX2FyZ3NfTj1cYGV4cHIgXCRsdF9kdW1wX2FyZ3NfTiArIDFcYAorICBkb25lCit9CisKKyMgQ29yZSBmdW5jdGlvbiBmb3IgbGF1bmNoaW5nIHRoZSB0YXJnZXQgYXBwbGljYXRpb24KK2Z1bmNfZXhlY19wcm9ncmFtX2NvcmUgKCkKK3sKKyIKKyAgY2FzZSAkaG9zdCBpbgorICAjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKyAgKi0qLW1pbmd3IHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKyAgICAkRUNITyAiXAorICAgICAgaWYgdGVzdCAtbiBcIlwkbHRfb3B0aW9uX2RlYnVnXCI7IHRoZW4KKyAgICAgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndlswXTogXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIDE+JjIKKyAgICAgICAgZnVuY19sdF9kdW1wX2FyZ3MgXCR7MStcIlwkQFwifSAxPiYyCisgICAgICBmaQorICAgICAgZXhlYyBcIlwkcHJvZ2RpclxcXFxcJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisgICAgOzsKKworICAqKQorICAgICRFQ0hPICJcCisgICAgICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgICAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2WzBdOiBcJHByb2dkaXIvXCRwcm9ncmFtXCIgMT4mMgorICAgICAgICBmdW5jX2x0X2R1bXBfYXJncyBcJHsxK1wiXCRAXCJ9IDE+JjIKKyAgICAgIGZpCisgICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKyAgICA7OworICBlc2FjCisgICRFQ0hPICJcCisgICAgICBcJEVDSE8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJCpcIiAxPiYyCisgICAgICBleGl0IDEKK30KKworIyBBIGZ1bmN0aW9uIHRvIGVuY2Fwc3VsYXRlIGxhdW5jaGluZyB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCisjIFN0cmlwcyBvcHRpb25zIGluIHRoZSAtLWx0LSogbmFtZXNwYWNlIGZyb20gXCRAIGFuZAorIyBsYXVuY2hlcyB0YXJnZXQgYXBwbGljYXRpb24gd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy4KK2Z1bmNfZXhlY19wcm9ncmFtICgpCit7CisgIGNhc2UgXCIgXCQqIFwiIGluCisgICpcXCAtLWx0LSopCisgICAgZm9yIGx0X3dyX2FyZworICAgIGRvCisgICAgICBjYXNlIFwkbHRfd3JfYXJnIGluCisgICAgICAtLWx0LSopIDs7CisgICAgICAqKSBzZXQgeCBcIlwkQFwiIFwiXCRsdF93cl9hcmdcIjsgc2hpZnQ7OworICAgICAgZXNhYworICAgICAgc2hpZnQKKyAgICBkb25lIDs7CisgIGVzYWMKKyAgZnVuY19leGVjX3Byb2dyYW1fY29yZSBcJHsxK1wiXCRAXCJ9Cit9CisKKyAgIyBQYXJzZSBvcHRpb25zCisgIGZ1bmNfcGFyc2VfbHRfb3B0aW9ucyBcIlwkMFwiIFwkezErXCJcJEBcIn0KKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRFQ0hPIFwiXCRmaWxlXCIgfCAkU0VEICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICRTRUQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbworICAgIGRlc3RkaXI9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlL1teL10qXCQlJSdcYAorCisgICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgorICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KKyAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgorICAgICAgW1xcXFwvXSogfCBbQS1aYS16XTpbXFxcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7CisgICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7CisgICAgICBlc2FjCisgICAgZmkKKworICAgIGZpbGU9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlXi4qLyUlJ1xgCisgICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICRTRUQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVXN1YWxseSAnbm8nLCBleGNlcHQgb24gY3lnd2luL21pbmd3IHdoZW4gZW1iZWRkZWQgaW50bworICAjIHRoZSBjd3JhcHBlci4KKyAgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVI9JGZ1bmNfZW1pdF93cmFwcGVyX2FyZzEKKyAgaWYgdGVzdCBcIlwkV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVJcIiA9IFwieWVzXCI7IHRoZW4KKyAgICAjIHNwZWNpYWwgY2FzZSBmb3IgJy4nCisgICAgaWYgdGVzdCBcIlwkdGhpc2RpclwiID0gXCIuXCI7IHRoZW4KKyAgICAgIHRoaXNkaXI9XGBwd2RcYAorICAgIGZpCisgICAgIyByZW1vdmUgLmxpYnMgZnJvbSB0aGlzZGlyCisgICAgY2FzZSBcIlwkdGhpc2RpclwiIGluCisgICAgKltcXFxcL10kb2JqZGlyICkgdGhpc2Rpcj1cYFwkRUNITyBcIlwkdGhpc2RpclwiIHwgJFNFRCAncyVbXFxcXC9dW15cXFxcL10qJCUlJ1xgIDs7CisgICAgJG9iamRpciApICAgdGhpc2Rpcj0uIDs7CisgICAgZXNhYworICBmaQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKyIKKworCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAkRUNITyAiXAorICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0CisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisKKyAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8CisgICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKKyAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgorCisgICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKKworICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCisgICAgICAkTUtESVIgXCJcJHByb2dkaXJcIgorICAgIGVsc2UKKyAgICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICAgIGZpIgorCisJICAkRUNITyAiXAorCisgICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKKyAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCisgICAgICBpZiByZWxpbmtfY29tbWFuZF9vdXRwdXQ9XGBldmFsIFwkcmVsaW5rX2NvbW1hbmQgMj4mMVxgOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkRUNITyBcIlwkcmVsaW5rX2NvbW1hbmRfb3V0cHV0XCIgPiYyCisJJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisJZXhpdCAxCisgICAgICBmaQorICAgIGZpCisKKyAgICAkTVYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKKyAgICB7ICRSTSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKKyAgICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQorICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICBmaSIKKwllbHNlCisJICAkRUNITyAiXAorICBwcm9ncmFtPSckb3V0cHV0bmFtZScKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyIKKwlmaQorCisJJEVDSE8gIlwKKworICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgorCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwkjCisJIyBGaXggdGhlIERMTCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uICBEbyB0aGlzIGJlZm9yZSBwcmVwZW5kaW5nCisJIyB0byBzaGxpYnBhdGgsIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCBhcmUgUEFUSCBhbmQgdW5pbnN0YWxsZWQKKwkjIGxpYnJhcmllcyBtdXN0IGNvbWUgZmlyc3QuCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICisgICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKKyIKKwlmaQorCisJIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisJaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorCSAgJEVDSE8gIlwKKyAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgorICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKKworICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgorICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCisgICAgJHNobGlicGF0aF92YXI9XGBcJEVDSE8gXCJcJCRzaGxpYnBhdGhfdmFyXCIgfCAkU0VEICdzLzo6KlwkLy8nXGAKKworICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgorIgorCWZpCisKKwkkRUNITyAiXAorICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCisgICAgICBmdW5jX2V4ZWNfcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJEVDSE8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCisgICAgXCRFQ0hPIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCisgICAgXCRFQ0hPIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpXAorIgorfQorCisKKyMgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworIyBlbWl0IHRoZSBzb3VyY2UgY29kZSBmb3IgYSB3cmFwcGVyIGV4ZWN1dGFibGUgb24gc3Rkb3V0CisjIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gZnVuY19tb2RlX2xpbmsgYmVjYXVzZQorIyBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlIHNldCB0aGVyZWluLgorZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyAoKQoreworCWNhdCA8PEVPRgorCisvKiAkY3dyYXBwZXJzb3VyY2UgLSB0ZW1wb3Jhcnkgd3JhcHBlciBleGVjdXRhYmxlIGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisgICBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisKKyAgIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorICAgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgorCisgICBUaGlzIHdyYXBwZXIgZXhlY3V0YWJsZSBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisgICBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisqLworRU9GCisJICAgIGNhdCA8PCJFT0YiCisjaWZkZWYgX01TQ19WRVIKKyMgZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxwcm9jZXNzLmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGlmZGVmIF9fQ1lHV0lOX18KKyMgIGluY2x1ZGUgPGlvLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisvKiBkZWNsYXJhdGlvbnMgb2Ygbm9uLUFOU0kgZnVuY3Rpb25zICovCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitpbnQgX3B1dGVudiAoY29uc3QgY2hhciAqKTsKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitjaGFyICpyZWFscGF0aCAoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50IHB1dGVudiAoY2hhciAqKTsKK2ludCBzZXRlbnYgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworIyBlbmRpZgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCisvKiBwb3J0YWJpbGl0eSBkZWZpbmVzLCBleGNsdWRpbmcgcGF0aCBoYW5kbGluZyBtYWNyb3MgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCisjIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorIyAgZGVmaW5lIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgaW50cHRyX3QgaW50CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBIQVZFX1NFVEVOVgorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQVRIX01BWCkKKyMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKKyMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgorI2Vsc2UKKyMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAorI2VuZGlmCisKKyNpZm5kZWYgU19JWE9USAorIyBkZWZpbmUgU19JWE9USCAwCisjZW5kaWYKKyNpZm5kZWYgU19JWEdSUAorIyBkZWZpbmUgU19JWEdSUCAwCisjZW5kaWYKKworLyogcGF0aCBoYW5kbGluZyBwb3J0YWJpbGl0eSBtYWNyb3MgKi8KKyNpZm5kZWYgRElSX1NFUEFSQVRPUgorIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCisgIGRlZmluZWQgKF9fT1MyX18pCisjIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKKyMgZW5kaWYKKyMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQorI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCisJKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCisjZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SKQorI2Vsc2UgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCisjZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworCisjaWZuZGVmIEZPUEVOX1dCCisjIGRlZmluZSBGT1BFTl9XQiAidyIKKyNlbmRpZgorI2lmbmRlZiBfT19CSU5BUlkKKyMgZGVmaW5lIF9PX0JJTkFSWSAwCisjZW5kaWYKKworI2RlZmluZSBYTUFMTE9DKHR5cGUsIG51bSkgICAgICAoKHR5cGUgKikgeG1hbGxvYyAoKG51bSkgKiBzaXplb2YodHlwZSkpKQorI2RlZmluZSBYRlJFRShzdGFsZSkgZG8geyBcCisgIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCit9IHdoaWxlICgwKQorCisjaWYgZGVmaW5lZChMVF9ERUJVR1dSQVBQRVIpCitzdGF0aWMgaW50IGx0X2RlYnVnID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGx0X2RlYnVnID0gMDsKKyNlbmRpZgorCitjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSAibGlidG9vbC13cmFwcGVyIjsgLyogaW4gY2FzZSB4c3RyZHVwIGZhaWxzICovCisKK3ZvaWQgKnhtYWxsb2MgKHNpemVfdCBudW0pOworY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKTsKK2NvbnN0IGNoYXIgKmJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7CitjaGFyICpmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpOworY2hhciAqY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKTsKK2ludCBtYWtlX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGNoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworY2hhciAqc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCk7Cit2b2lkIGx0X2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7CitzdGF0aWMgY29uc3QgY2hhciAqbm9ubnVsbCAoY29uc3QgY2hhciAqcyk7CitzdGF0aWMgY29uc3QgY2hhciAqbm9uZW1wdHkgKGNvbnN0IGNoYXIgKnMpOwordm9pZCBsdF9zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2NoYXIgKmx0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCk7Cit2b2lkIGx0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwordm9pZCBsdF91cGRhdGVfbGliX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2NoYXIgKipwcmVwYXJlX3NwYXduIChjaGFyICoqYXJndik7Cit2b2lkIGx0X2R1bXBfc2NyaXB0IChGSUxFICpmKTsKK0VPRgorCisJICAgIGNhdCA8PEVPRgordm9sYXRpbGUgY29uc3QgY2hhciAqIE1BR0lDX0VYRSA9ICIkbWFnaWNfZXhlIjsKK2NvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQVJOQU1FID0gIiRzaGxpYnBhdGhfdmFyIjsKK0VPRgorCisJICAgIGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiR0ZW1wX3JwYXRoIgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIiOworRU9GCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoICIkZGxsc2VhcmNocGF0aDoiCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICJQQVRIIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiOworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDwiRU9GIgorY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIFRBUkdFVF9QUk9HUkFNX05BTUUgPSAibHQtJG91dHB1dG5hbWUiOyAvKiBob3BlZnVsbHksIG5vIC5leGUgKi8KK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICIkb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGZpCisKKworCSAgICBjYXQgPDwiRU9GIgorCisjZGVmaW5lIExUV1JBUFBFUl9PUFRJT05fUFJFRklYICAgICAgICAgIi0tbHQtIgorCitzdGF0aWMgY29uc3QgY2hhciAqbHR3cmFwcGVyX29wdGlvbl9wcmVmaXggPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWDsKK3N0YXRpYyBjb25zdCBjaGFyICpkdW1wc2NyaXB0X29wdCAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkdW1wLXNjcmlwdCI7CitzdGF0aWMgY29uc3QgY2hhciAqZGVidWdfb3B0ICAgICAgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZGVidWciOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgKipuZXdhcmd6OworICBpbnQgIG5ld2FyZ2M7CisgIGNoYXIgKnRtcF9wYXRoc3BlYzsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX3BhdGg7CisgIGNoYXIgKmFjdHVhbF9jd3JhcHBlcl9uYW1lOworICBjaGFyICp0YXJnZXRfbmFtZTsKKyAgY2hhciAqbHRfYXJndl96ZXJvOworICBpbnRwdHJfdCBydmFsID0gMTI3OworCisgIGludCBpOworCisgIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKGJhc2VfbmFtZSAoYXJndlswXSkpOworICBuZXdhcmd6ID0gWE1BTExPQyAoY2hhciAqLCBhcmdjICsgMSk7CisKKyAgLyogdmVyeSBzaW1wbGUgYXJnIHBhcnNpbmc7IGRvbid0IHdhbnQgdG8gcmVseSBvbiBnZXRvcHQKKyAgICogYWxzbywgY29weSBhbGwgbm9uIGN3cmFwcGVyIG9wdGlvbnMgdG8gbmV3YXJneiwgZXhjZXB0CisgICAqIGFyZ3pbMF0sIHdoaWNoIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkKKyAgICovCisgIG5ld2FyZ2M9MDsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkdW1wc2NyaXB0X29wdCkgPT0gMCkKKwl7CitFT0YKKwkgICAgY2FzZSAiJGhvc3QiIGluCisJICAgICAgKm1pbmd3KiB8ICpjeWd3aW4qICkKKwkJIyBtYWtlIHN0ZG91dCB1c2UgInVuaXgiIGxpbmUgZW5kaW5ncworCQllY2hvICIgICAgICAgICAgc2V0bW9kZSgxLF9PX0JJTkFSWSk7IgorCQk7OworCSAgICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorCSAgbHRfZHVtcF9zY3JpcHQgKHN0ZG91dCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkZWJ1Z19vcHQpID09IDApCisJeworICAgICAgICAgIGx0X2RlYnVnID0gMTsKKyAgICAgICAgICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGhvd2V2ZXIsIGlmIHRoZXJlIGlzIGFuIG9wdGlvbiBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UsIGJ1dCBpdCBpcyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGtub3cgYWJvdXQgYW5kCisgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGRlYWx0IHdpdGgsIGFib3ZlIChpbmx1ZGluZyBkdW1wLXNjcmlwdCksIHRoZW4KKyAgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IuIE90aGVyd2lzZSwgdGFyZ2V0cyBtaWdodCBiZWdpbiB0byBiZWxpZXZlCisgICAgICAgICAgICAgdGhleSBhcmUgYWxsb3dlZCB0byB1c2Ugb3B0aW9ucyBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UuIFRoZSBmaXJzdCB0aW1lIGFueSB1c2VyIGNvbXBsYWlucyBhYm91dCB0aGlzLCB3ZSdsbAorICAgICAgICAgICAgIG5lZWQgdG8gbWFrZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCBhIGNvbmZpZ3VyZS10aW1lIG9wdGlvbgorICAgICAgICAgICAgIG9yIGEgY29uZmlndXJlLmFjLXNldHRhYmxlIHZhbHVlLgorICAgICAgICAgICAqLworICAgICAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAidW5yZWNvZ25pemVkICVzIG9wdGlvbjogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlIC4uLiAqLworICAgICAgbmV3YXJnelsrK25ld2FyZ2NdID0geHN0cmR1cCAoYXJndltpXSk7CisgICAgfQorICBuZXdhcmd6WysrbmV3YXJnY10gPSBOVUxMOworCitFT0YKKwkgICAgY2F0IDw8RU9GCisgIC8qIFRoZSBHTlUgYmFubmVyIG11c3QgYmUgdGhlIGZpcnN0IG5vbi1lcnJvciBkZWJ1ZyBtZXNzYWdlICovCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICJsaWJ0b29sIHdyYXBwZXIgKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OXG4iKTsKK0VPRgorCSAgICBjYXQgPDwiRU9GIgorICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIGFyZ3ZbMF06ICVzXG4iLCBhcmd2WzBdKTsKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBwcm9ncmFtX25hbWU6ICVzXG4iLCBwcm9ncmFtX25hbWUpOworCisgIHRtcF9wYXRoc3BlYyA9IGZpbmRfZXhlY3V0YWJsZSAoYXJndlswXSk7CisgIGlmICh0bXBfcGF0aHNwZWMgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiY291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIihtYWluKSBmb3VuZCBleGUgKGJlZm9yZSBzeW1saW5rIGNoYXNlKSBhdDogJXNcbiIsCisJCSAgdG1wX3BhdGhzcGVjKTsKKworICBhY3R1YWxfY3dyYXBwZXJfcGF0aCA9IGNoYXNlX3N5bWxpbmtzICh0bXBfcGF0aHNwZWMpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIihtYWluKSBmb3VuZCBleGUgKGFmdGVyIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0geHN0cmR1cCAoYmFzZV9uYW1lIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9wYXRoLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogd3JhcHBlciBuYW1lIHRyYW5zZm9ybXMgKi8KKyAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAoYWN0dWFsX2N3cmFwcGVyX25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIC8qIHRhcmdldF9uYW1lIHRyYW5zZm9ybXMgLS0gdXNlIGFjdHVhbCB0YXJnZXQgcHJvZ3JhbSBuYW1lOyBtaWdodCBoYXZlIGx0LSBwcmVmaXggKi8KKyAgdGFyZ2V0X25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKFRBUkdFVF9QUk9HUkFNX05BTUUpKTsKKyAgc3RyZW5kemFwICh0YXJnZXRfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAodGFyZ2V0X25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIHRhcmdldF9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihtYWluKSBsaWJ0b29sIHRhcmdldCBuYW1lOiAlc1xuIiwKKwkJICB0YXJnZXRfbmFtZSk7CitFT0YKKworCSAgICBjYXQgPDxFT0YKKyAgbmV3YXJnelswXSA9CisgICAgWE1BTExPQyAoY2hhciwgKHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpICsKKwkJICAgIHN0cmxlbiAoIiRvYmpkaXIiKSArIDEgKyBzdHJsZW4gKGFjdHVhbF9jd3JhcHBlcl9uYW1lKSArIDEpKTsKKyAgc3RyY3B5IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIHN0cmNhdCAobmV3YXJnelswXSwgIiRvYmpkaXIiKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiLyIpOworRU9GCisKKwkgICAgY2F0IDw8IkVPRiIKKyAgLyogc3RvcCBoZXJlLCBhbmQgY29weSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMgdHdpY2UgKi8KKyAgdG1wX3BhdGhzcGVjID0geHN0cmR1cCAobmV3YXJnelswXSk7CisKKyAgLyogZG8gTk9UIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSwgc28gdXNlIGFjdHVhbF9jd3JhcHBlcl9uYW1lICovCisgIHN0cmNhdCAobmV3YXJnelswXSwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIC8qIERPIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSBpZiBpdCBleGlzdHMsIHNvIHVzZSB0YXJnZXRfbmFtZSAqLworICBsdF9hcmd2X3plcm8gPSBsdF9leHRlbmRfc3RyICh0bXBfcGF0aHNwZWMsIHRhcmdldF9uYW1lLCAxKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisgIHRtcF9wYXRoc3BlYyA9IE5VTEw7CitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCSAgICBjYXQgPDwiRU9GIgorICB7CisgICAgY2hhciogcDsKKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIgKG5ld2FyZ3pbMF0sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICAgIHdoaWxlICgocCA9IHN0cmNociAobHRfYXJndl96ZXJvLCAnXFwnKSkgIT0gTlVMTCkKKyAgICAgIHsKKwkqcCA9ICcvJzsKKyAgICAgIH0KKyAgfQorRU9GCisJICAgIDs7CisJICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorICBYRlJFRSAodGFyZ2V0X25hbWUpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIGx0X3NldGVudiAoIkJJTl9TSCIsICJ4cGc0Iik7IC8qIGZvciBUcnU2NCAqLworICBsdF9zZXRlbnYgKCJEVUFMQ0FTRSIsICIxIik7ICAvKiBmb3IgTVNLIHNoICovCisgIC8qIFVwZGF0ZSB0aGUgRExMIHNlYXJjaHBhdGguICBFWEVfUEFUSF9WQUxVRSAoJGRsbHNlYXJjaHBhdGgpIG11c3QKKyAgICAgYmUgcHJlcGVuZGVkIGJlZm9yZSAodGhhdCBpcywgYXBwZWFyIGFmdGVyKSBMSUJfUEFUSF9WQUxVRSAoJHRlbXBfcnBhdGgpCisgICAgIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCAqX1ZBUk5BTUVzIGFyZSBQQVRIIGJ1dCB1bmluc3RhbGxlZAorICAgICBsaWJyYXJpZXMgbXVzdCBjb21lIGZpcnN0LiAqLworICBsdF91cGRhdGVfZXhlX3BhdGggKEVYRV9QQVRIX1ZBUk5BTUUsIEVYRV9QQVRIX1ZBTFVFKTsKKyAgbHRfdXBkYXRlX2xpYl9wYXRoIChMSUJfUEFUSF9WQVJOQU1FLCBMSUJfUEFUSF9WQUxVRSk7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBsdF9hcmd2X3plcm86ICVzXG4iLAorCQkgIG5vbm51bGwgKGx0X2FyZ3ZfemVybykpOworICBmb3IgKGkgPSAwOyBpIDwgbmV3YXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgbmV3YXJnelslZF06ICVzXG4iLAorCQkgICAgICBpLCBub25udWxsIChuZXdhcmd6W2ldKSk7CisgICAgfQorCitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCQljYXQgPDwiRU9GIgorICAvKiBleGVjdiBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgb24gbWluZ3cgYXMgZXhwZWN0ZWQgb24gdW5peCAqLworICBuZXdhcmd6ID0gcHJlcGFyZV9zcGF3biAobmV3YXJneik7CisgIHJ2YWwgPSBfc3Bhd252IChfUF9XQUlULCBsdF9hcmd2X3plcm8sIChjb25zdCBjaGFyICogY29uc3QgKikgbmV3YXJneik7CisgIGlmIChydmFsID09IC0xKQorICAgIHsKKyAgICAgIC8qIGZhaWxlZCB0byBzdGFydCBwcm9jZXNzICovCisgICAgICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgICAiKG1haW4pIGZhaWxlZCB0byBsYXVuY2ggdGFyZ2V0IFwiJXNcIjogJXNcbiIsCisJCSAgICAgIGx0X2FyZ3ZfemVybywgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworICAgICAgcmV0dXJuIDEyNzsKKyAgICB9CisgIHJldHVybiBydmFsOworRU9GCisJCTs7CisJICAgICAgKikKKwkJY2F0IDw8IkVPRiIKKyAgZXhlY3YgKGx0X2FyZ3ZfemVybywgbmV3YXJneik7CisgIHJldHVybiBydmFsOyAvKiA9MTI3LCBidXQgYXZvaWRzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nICovCitFT0YKKwkJOzsKKwkgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCit9CisKK3ZvaWQgKgoreG1hbGxvYyAoc2l6ZV90IG51bSkKK3sKKyAgdm9pZCAqcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKKyAgaWYgKCFwKQorICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJtZW1vcnkgZXhoYXVzdGVkIik7CisKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgoreHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwKKwkJCSAgc3RyaW5nKSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKgorYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpiYXNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIoY2hlY2tfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHBhdGgpKTsKKyAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChzdGF0IChwYXRoLCAmc3QpID49IDApCisgICAgICAmJiAoc3Quc3RfbW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK21ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgaW50IHJ2YWwgPSAwOworICBzdHJ1Y3Qgc3RhdCBzdDsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1ha2VfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHBhdGgpKTsKKyAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICB7CisgICAgICBydmFsID0gY2htb2QgKHBhdGgsIHN0LnN0X21vZGUgfCBTX0lYT1RIIHwgU19JWEdSUCB8IFNfSVhVU1IpOworICAgIH0KKyAgcmV0dXJuIHJ2YWw7Cit9CisKKy8qIFNlYXJjaGVzIGZvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSB3cmFwcGVyLiAgUmV0dXJucworICAgbmV3bHkgYWxsb2NhdGVkIGZ1bGwgcGF0aCBuYW1lIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZQorICAgRG9lcyBub3QgY2hhc2Ugc3ltbGlua3MsIGV2ZW4gb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGVtLgorKi8KK2NoYXIgKgorZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKQoreworICBpbnQgaGFzX3NsYXNoID0gMDsKKyAgY29uc3QgY2hhciAqcDsKKyAgY29uc3QgY2hhciAqcF9uZXh0OworICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KKyAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOworICBpbnQgdG1wX2xlbjsKKyAgY2hhciAqY29uY2F0X25hbWU7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihmaW5kX2V4ZWN1dGFibGUpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbmVtcHR5ICh3cmFwcGVyKSk7CisKKyAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBBYnNvbHV0ZSBwYXRoPyAqLworI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIHdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQorICAgIHsKKyAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7CisgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorCXJldHVybiBjb25jYXRfbmFtZTsKKyAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgeworI2VuZGlmCisgICAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAod3JhcHBlclswXSkpCisJeworCSAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKwkgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJICAgIHJldHVybiBjb25jYXRfbmFtZTsKKwkgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJfQorI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICAgIH0KKyNlbmRpZgorCisgIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCisgICAgaWYgKCpwID09ICcvJykKKyAgICAgIHsKKwloYXNfc2xhc2ggPSAxOworCWJyZWFrOworICAgICAgfQorICBpZiAoIWhhc19zbGFzaCkKKyAgICB7CisgICAgICAvKiBubyBzbGFzaGVzOyBzZWFyY2ggUEFUSCAqLworICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKKyAgICAgIGlmIChwYXRoICE9IE5VTEwpCisJeworCSAgZm9yIChwID0gcGF0aDsgKnA7IHAgPSBwX25leHQpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpxOworCSAgICAgIHNpemVfdCBwX2xlbjsKKwkgICAgICBmb3IgKHEgPSBwOyAqcTsgcSsrKQorCQlpZiAoSVNfUEFUSF9TRVBBUkFUT1IgKCpxKSkKKwkJICBicmVhazsKKwkgICAgICBwX2xlbiA9IHEgLSBwOworCSAgICAgIHBfbmV4dCA9ICgqcSA9PSAnXDAnID8gcSA6IHEgKyAxKTsKKwkgICAgICBpZiAocF9sZW4gPT0gMCkKKwkJeworCQkgIC8qIGVtcHR5IHBhdGg6IGN1cnJlbnQgZGlyZWN0b3J5ICovCisJCSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQorCQkgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgImdldGN3ZCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKKwkJICB0bXBfbGVuID0gc3RybGVuICh0bXApOworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisJCSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKKwkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisJCSAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkJcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJICAgIH0KKwl9CisgICAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLworICAgIH0KKyAgLyogUmVsYXRpdmUgcGF0aCB8IG5vdCBmb3VuZCBpbiBwYXRoOiBwcmVwZW5kIGN3ZCAqLworICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgImdldGN3ZCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworICB0bXBfbGVuID0gc3RybGVuICh0bXApOworICBjb25jYXRfbmFtZSA9IFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOworICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKyAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKworICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKgorY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKQoreworI2lmbmRlZiBTX0lTTE5LCisgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7CisjZWxzZQorICBjaGFyIGJ1ZltMVF9QQVRITUFYXTsKKyAgc3RydWN0IHN0YXQgczsKKyAgY2hhciAqdG1wX3BhdGhzcGVjID0geHN0cmR1cCAocGF0aHNwZWMpOworICBjaGFyICpwOworICBpbnQgaGFzX3N5bWxpbmtzID0gMDsKKyAgd2hpbGUgKHN0cmxlbiAodG1wX3BhdGhzcGVjKSAmJiAhaGFzX3N5bWxpbmtzKQorICAgIHsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICJjaGVja2luZyBwYXRoIGNvbXBvbmVudCBmb3Igc3ltbGlua3M6ICVzXG4iLAorCQkgICAgICB0bXBfcGF0aHNwZWMpOworICAgICAgaWYgKGxzdGF0ICh0bXBfcGF0aHNwZWMsICZzKSA9PSAwKQorCXsKKwkgIGlmIChTX0lTTE5LIChzLnN0X21vZGUpICE9IDApCisJICAgIHsKKwkgICAgICBoYXNfc3ltbGlua3MgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIHNlYXJjaCBiYWNrd2FyZHMgZm9yIGxhc3QgRElSX1NFUEFSQVRPUiAqLworCSAgcCA9IHRtcF9wYXRoc3BlYyArIHN0cmxlbiAodG1wX3BhdGhzcGVjKSAtIDE7CisJICB3aGlsZSAoKHAgPiB0bXBfcGF0aHNwZWMpICYmICghSVNfRElSX1NFUEFSQVRPUiAoKnApKSkKKwkgICAgcC0tOworCSAgaWYgKChwID09IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQorCSAgICB7CisJICAgICAgLyogbm8gbW9yZSBESVJfU0VQQVJBVE9SUyBsZWZ0ICovCisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICpwID0gJ1wwJzsKKwl9CisgICAgICBlbHNlCisJeworCSAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICJlcnJvciBhY2Nlc3NpbmcgZmlsZSBcIiVzXCI6ICVzIiwKKwkJICAgIHRtcF9wYXRoc3BlYywgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworCX0KKyAgICB9CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGlmICghaGFzX3N5bWxpbmtzKQorICAgIHsKKyAgICAgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7CisgICAgfQorCisgIHRtcF9wYXRoc3BlYyA9IHJlYWxwYXRoIChwYXRoc3BlYywgYnVmKTsKKyAgaWYgKHRtcF9wYXRoc3BlYyA9PSAwKQorICAgIHsKKyAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSJjb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKKyAgICB9CisgIHJldHVybiB4c3RyZHVwICh0bXBfcGF0aHNwZWMpOworI2VuZGlmCit9CisKK2NoYXIgKgorc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgc2l6ZV90IGxlbiwgcGF0bGVuOworCisgIGFzc2VydCAoc3RyICE9IE5VTEwpOworICBhc3NlcnQgKHBhdCAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIHBhdGxlbiA9IHN0cmxlbiAocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgICB7CisgICAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOworICAgICAgaWYgKHN0cmNtcCAoc3RyLCBwYXQpID09IDApCisJKnN0ciA9ICdcMCc7CisgICAgfQorICByZXR1cm4gc3RyOworfQorCit2b2lkCitsdF9kZWJ1Z3ByaW50ZiAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGlmIChsdF9kZWJ1ZykKKyAgICB7CisgICAgICAodm9pZCkgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6JWQ6ICIsIHByb2dyYW1fbmFtZSwgZmlsZSwgbGluZSk7CisgICAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICAgICh2b2lkKSB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOworICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsdF9lcnJvcl9jb3JlIChpbnQgZXhpdF9zdGF0dXMsIGNvbnN0IGNoYXIgKmZpbGUsCisJICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICptb2RlLAorCSAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczolczolZDogJXM6ICIsIHByb2dyYW1fbmFtZSwgZmlsZSwgbGluZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKKyAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCBmaWxlLCBsaW5lLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZCAoYXApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitub25udWxsIChjb25zdCBjaGFyICpzKQoreworICByZXR1cm4gcyA/IHMgOiAiKG51bGwpIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorbm9uZW1wdHkgKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiAocyAmJiAhKnMpID8gIihlbXB0eSkiIDogbm9ubnVsbCAocyk7Cit9CisKK3ZvaWQKK2x0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihsdF9zZXRlbnYpIHNldHRpbmcgJyVzJyB0byAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisgIHsKKyNpZmRlZiBIQVZFX1NFVEVOVgorICAgIC8qIGFsd2F5cyBtYWtlIGEgY29weSwgZm9yIGNvbnNpc3RlbmN5IHdpdGggIUhBVkVfU0VURU5WICovCisgICAgY2hhciAqc3RyID0geHN0cmR1cCAodmFsdWUpOworICAgIHNldGVudiAobmFtZSwgc3RyLCAxKTsKKyNlbHNlCisgICAgaW50IGxlbiA9IHN0cmxlbiAobmFtZSkgKyAxICsgc3RybGVuICh2YWx1ZSkgKyAxOworICAgIGNoYXIgKnN0ciA9IFhNQUxMT0MgKGNoYXIsIGxlbik7CisgICAgc3ByaW50ZiAoc3RyLCAiJXM9JXMiLCBuYW1lLCB2YWx1ZSk7CisgICAgaWYgKHB1dGVudiAoc3RyKSAhPSBFWElUX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgIFhGUkVFIChzdHIpOworICAgICAgfQorI2VuZGlmCisgIH0KK30KKworY2hhciAqCitsdF9leHRlbmRfc3RyIChjb25zdCBjaGFyICpvcmlnX3ZhbHVlLCBjb25zdCBjaGFyICphZGQsIGludCB0b19lbmQpCit7CisgIGNoYXIgKm5ld192YWx1ZTsKKyAgaWYgKG9yaWdfdmFsdWUgJiYgKm9yaWdfdmFsdWUpCisgICAgeworICAgICAgaW50IG9yaWdfdmFsdWVfbGVuID0gc3RybGVuIChvcmlnX3ZhbHVlKTsKKyAgICAgIGludCBhZGRfbGVuID0gc3RybGVuIChhZGQpOworICAgICAgbmV3X3ZhbHVlID0gWE1BTExPQyAoY2hhciwgYWRkX2xlbiArIG9yaWdfdmFsdWVfbGVuICsgMSk7CisgICAgICBpZiAodG9fZW5kKQorICAgICAgICB7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUsIG9yaWdfdmFsdWUpOworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlICsgb3JpZ192YWx1ZV9sZW4sIGFkZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlLCBhZGQpOworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlICsgYWRkX2xlbiwgb3JpZ192YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuZXdfdmFsdWUgPSB4c3RyZHVwIChhZGQpOworICAgIH0KKyAgcmV0dXJuIG5ld192YWx1ZTsKK30KKwordm9pZAorbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3VwZGF0ZV9leGVfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisKKyAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQorICAgIHsKKyAgICAgIGNoYXIgKm5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKKyAgICAgIC8qIHNvbWUgc3lzdGVtcyBjYW4ndCBjb3BlIHdpdGggYSAnOictdGVybWluYXRlZCBwYXRoICMnICovCisgICAgICBpbnQgbGVuID0gc3RybGVuIChuZXdfdmFsdWUpOworICAgICAgd2hpbGUgKCgobGVuID0gc3RybGVuIChuZXdfdmFsdWUpKSA+IDApICYmIElTX1BBVEhfU0VQQVJBVE9SIChuZXdfdmFsdWVbbGVuLTFdKSkKKyAgICAgICAgeworICAgICAgICAgIG5ld192YWx1ZVtsZW4tMV0gPSAnXDAnOworICAgICAgICB9CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQKK2x0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihsdF91cGRhdGVfbGliX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbm51bGwgKG5hbWUpLCBub25udWxsICh2YWx1ZSkpOworCisgIGlmIChuYW1lICYmICpuYW1lICYmIHZhbHVlICYmICp2YWx1ZSkKKyAgICB7CisgICAgICBjaGFyICpuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKK0VPRgorCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCQljYXQgPDwiRU9GIgorCisvKiBQcmVwYXJlcyBhbiBhcmd1bWVudCB2ZWN0b3IgYmVmb3JlIGNhbGxpbmcgc3Bhd24oKS4KKyAgIE5vdGUgdGhhdCBzcGF3bigpIGRvZXMgbm90IGJ5IGl0c2VsZiBjYWxsIHRoZSBjb21tYW5kIGludGVycHJldGVyCisgICAgIChnZXRlbnYgKCJDT01TUEVDIikgIT0gTlVMTCA/IGdldGVudiAoIkNPTVNQRUMiKSA6CisgICAgICAoeyBPU1ZFUlNJT05JTkZPIHY7IHYuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihPU1ZFUlNJT05JTkZPKTsKKyAgICAgICAgIEdldFZlcnNpb25FeCgmdik7CisgICAgICAgICB2LmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQ7CisgICAgICB9KSA/ICJjbWQuZXhlIiA6ICJjb21tYW5kLmNvbSIpLgorICAgSW5zdGVhZCBpdCBzaW1wbHkgY29uY2F0ZW5hdGVzIHRoZSBhcmd1bWVudHMsIHNlcGFyYXRlZCBieSAnICcsIGFuZCBjYWxscworICAgQ3JlYXRlUHJvY2VzcygpLiAgV2UgbXVzdCBxdW90ZSB0aGUgYXJndW1lbnRzIHNpbmNlIFdpbjMyIENyZWF0ZVByb2Nlc3MoKQorICAgaW50ZXJwcmV0cyBjaGFyYWN0ZXJzIGxpa2UgJyAnLCAnXHQnLCAnXFwnLCAnIicgKGJ1dCBub3QgJzwnIGFuZCAnPicpIGluIGEKKyAgIHNwZWNpYWwgd2F5OgorICAgLSBTcGFjZSBhbmQgdGFiIGFyZSBpbnRlcnByZXRlZCBhcyBkZWxpbWl0ZXJzLiBUaGV5IGFyZSBub3QgdHJlYXRlZCBhcworICAgICBkZWxpbWl0ZXJzIGlmIHRoZXkgYXJlIHN1cnJvdW5kZWQgYnkgZG91YmxlIHF1b3RlczogIi4uLiIuCisgICAtIFVuZXNjYXBlZCBkb3VibGUgcXVvdGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGlucHV0LiBUaGVpciBvbmx5IGVmZmVjdCBpcworICAgICB0aGF0IHdpdGhpbiBkb3VibGUgcXVvdGVzLCBzcGFjZSBhbmQgdGFiIGFyZSB0cmVhdGVkIGxpa2Ugbm9ybWFsCisgICAgIGNoYXJhY3RlcnMuCisgICAtIEJhY2tzbGFzaGVzIG5vdCBmb2xsb3dlZCBieSBkb3VibGUgcXVvdGVzIGFyZSBub3Qgc3BlY2lhbC4KKyAgIC0gQnV0IDIqbisxIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlIGJlY29tZQorICAgICBuIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlIChuID49IDApOgorICAgICAgIFwiIC0+ICIKKyAgICAgICBcXFwiIC0+IFwiCisgICAgICAgXFxcXFwiIC0+IFxcIgorICovCisjZGVmaW5lIFNIRUxMX1NQRUNJQUxfQ0hBUlMgIlwiXFwgXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyIKKyNkZWZpbmUgU0hFTExfU1BBQ0VfQ0hBUlMgIiBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3IgorY2hhciAqKgorcHJlcGFyZV9zcGF3biAoY2hhciAqKmFyZ3YpCit7CisgIHNpemVfdCBhcmdjOworICBjaGFyICoqbmV3X2FyZ3Y7CisgIHNpemVfdCBpOworCisgIC8qIENvdW50IG51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKykKKyAgICA7CisKKyAgLyogQWxsb2NhdGUgbmV3IGFyZ3VtZW50IHZlY3Rvci4gICovCisgIG5ld19hcmd2ID0gWE1BTExPQyAoY2hhciAqLCBhcmdjICsgMSk7CisKKyAgLyogUHV0IHF1b3RlZCBhcmd1bWVudHMgaW50byB0aGUgbmV3IGFyZ3VtZW50IHZlY3Rvci4gICovCisgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqc3RyaW5nID0gYXJndltpXTsKKworICAgICAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKQorCW5ld19hcmd2W2ldID0geHN0cmR1cCAoIlwiXCIiKTsKKyAgICAgIGVsc2UgaWYgKHN0cnBicmsgKHN0cmluZywgU0hFTExfU1BFQ0lBTF9DSEFSUykgIT0gTlVMTCkKKwl7CisJICBpbnQgcXVvdGVfYXJvdW5kID0gKHN0cnBicmsgKHN0cmluZywgU0hFTExfU1BBQ0VfQ0hBUlMpICE9IE5VTEwpOworCSAgc2l6ZV90IGxlbmd0aDsKKwkgIHVuc2lnbmVkIGludCBiYWNrc2xhc2hlczsKKwkgIGNvbnN0IGNoYXIgKnM7CisJICBjaGFyICpxdW90ZWRfc3RyaW5nOworCSAgY2hhciAqcDsKKworCSAgbGVuZ3RoID0gMDsKKwkgIGJhY2tzbGFzaGVzID0gMDsKKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgIGxlbmd0aCsrOworCSAgZm9yIChzID0gc3RyaW5nOyAqcyAhPSAnXDAnOyBzKyspCisJICAgIHsKKwkgICAgICBjaGFyIGMgPSAqczsKKwkgICAgICBpZiAoYyA9PSAnIicpCisJCWxlbmd0aCArPSBiYWNrc2xhc2hlcyArIDE7CisJICAgICAgbGVuZ3RoKys7CisJICAgICAgaWYgKGMgPT0gJ1xcJykKKwkJYmFja3NsYXNoZXMrKzsKKwkgICAgICBlbHNlCisJCWJhY2tzbGFzaGVzID0gMDsKKwkgICAgfQorCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgbGVuZ3RoICs9IGJhY2tzbGFzaGVzICsgMTsKKworCSAgcXVvdGVkX3N0cmluZyA9IFhNQUxMT0MgKGNoYXIsIGxlbmd0aCArIDEpOworCisJICBwID0gcXVvdGVkX3N0cmluZzsKKwkgIGJhY2tzbGFzaGVzID0gMDsKKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgICpwKysgPSAnIic7CisJICBmb3IgKHMgPSBzdHJpbmc7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGNoYXIgYyA9ICpzOworCSAgICAgIGlmIChjID09ICciJykKKwkJeworCQkgIHVuc2lnbmVkIGludCBqOworCQkgIGZvciAoaiA9IGJhY2tzbGFzaGVzICsgMTsgaiA+IDA7IGotLSkKKwkJICAgICpwKysgPSAnXFwnOworCQl9CisJICAgICAgKnArKyA9IGM7CisJICAgICAgaWYgKGMgPT0gJ1xcJykKKwkJYmFja3NsYXNoZXMrKzsKKwkgICAgICBlbHNlCisJCWJhY2tzbGFzaGVzID0gMDsKKwkgICAgfQorCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBqOworCSAgICAgIGZvciAoaiA9IGJhY2tzbGFzaGVzOyBqID4gMDsgai0tKQorCQkqcCsrID0gJ1xcJzsKKwkgICAgICAqcCsrID0gJyInOworCSAgICB9CisJICAqcCA9ICdcMCc7CisKKwkgIG5ld19hcmd2W2ldID0gcXVvdGVkX3N0cmluZzsKKwl9CisgICAgICBlbHNlCisJbmV3X2FyZ3ZbaV0gPSAoY2hhciAqKSBzdHJpbmc7CisgICAgfQorICBuZXdfYXJndlthcmdjXSA9IE5VTEw7CisKKyAgcmV0dXJuIG5ld19hcmd2OworfQorRU9GCisJCTs7CisJICAgIGVzYWMKKworICAgICAgICAgICAgY2F0IDw8IkVPRiIKK3ZvaWQgbHRfZHVtcF9zY3JpcHQgKEZJTEUqIGYpCit7CitFT0YKKwkgICAgZnVuY19lbWl0X3dyYXBwZXIgeWVzIHwKKwkgICAgICAkU0VEIC1uIC1lICcKK3MvXlwoLlx7NzlcfVwpXCguLipcKS9cMVwKK1wyLworaAorcy9cKFtcXCJdXCkvXFxcMS9nCitzLyQvXFxuLworcy9cKFteXG5dKlwpLiovICBmcHV0cyAoIlwxIiwgZik7L3AKK2cKK0QnCisgICAgICAgICAgICBjYXQgPDwiRU9GIgorfQorRU9GCit9CisjIGVuZDogZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworCisjIGZ1bmNfd2luMzJfaW1wb3J0X2xpYl9wIEFSRworIyBUcnVlIGlmIEFSRyBpcyBhbiBpbXBvcnQgbGliLCBhcyBpbmRpY2F0ZWQgYnkgJGZpbGVfbWFnaWNfY21kCitmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBjYXNlIGBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkMVwiIDI+L2Rldi9udWxsIHwgJFNFRCAtZSAxMHFgIGluCisgICAgKmltcG9ydCopIDogOzsKKyAgICAqKSBmYWxzZSA7OworICAgIGVzYWMKK30KKworIyBmdW5jX21vZGVfbGluayBhcmcuLi4KK2Z1bmNfbW9kZV9saW5rICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgJGhvc3QgaW4KKyAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAorICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAorICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQorICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCisgICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubworCisgICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKKyAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90CisgICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQorICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCisgICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICBlc2FjCisgICAgbGlidG9vbF9hcmdzPSRub25vcHQKKyAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCisgICAgY29tcGlsZV9jb21tYW5kPSRub25vcHQKKyAgICBmaW5hbGl6ZV9jb21tYW5kPSRub25vcHQKKworICAgIGNvbXBpbGVfcnBhdGg9CisgICAgZmluYWxpemVfcnBhdGg9CisgICAgY29tcGlsZV9zaGxpYnBhdGg9CisgICAgZmluYWxpemVfc2hsaWJwYXRoPQorICAgIGNvbnZlbmllbmNlPQorICAgIG9sZF9jb252ZW5pZW5jZT0KKyAgICBkZXBsaWJzPQorICAgIG9sZF9kZXBsaWJzPQorICAgIGNvbXBpbGVyX2ZsYWdzPQorICAgIGxpbmtlcl9mbGFncz0KKyAgICBkbGxzZWFyY2hwYXRoPQorICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAorICAgIGluc3RfcHJlZml4X2Rpcj0KKyAgICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KKworICAgIGF2b2lkX3ZlcnNpb249bm8KKyAgICBiaW5kaXI9CisgICAgZGxmaWxlcz0KKyAgICBkbHByZWZpbGVzPQorICAgIGRsc2VsZj1ubworICAgIGV4cG9ydF9keW5hbWljPW5vCisgICAgZXhwb3J0X3N5bWJvbHM9CisgICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9CisgICAgZ2VuZXJhdGVkPQorICAgIGxpYm9ianM9CisgICAgbHRsaWJzPQorICAgIG1vZHVsZT1ubworICAgIG5vX2luc3RhbGw9bm8KKyAgICBvYmpzPQorICAgIG5vbl9waWNfb2JqZWN0cz0KKyAgICBwcmVjaW91c19maWxlc19yZWdleD0KKyAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KKyAgICBwcmVsb2FkPW5vCisgICAgcHJldj0KKyAgICBwcmV2YXJnPQorICAgIHJlbGVhc2U9CisgICAgcnBhdGg9CisgICAgeHJwYXRoPQorICAgIHBlcm1fcnBhdGg9CisgICAgdGVtcF9ycGF0aD0KKyAgICB0aHJlYWRfc2FmZT1ubworICAgIHZpbmZvPQorICAgIHZpbmZvX251bWJlcj1ubworICAgIHdlYWtfbGlicz0KKyAgICBzaW5nbGVfbW9kdWxlPSIke3dsfS1zaW5nbGVfbW9kdWxlIgorICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKKworICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLXNoYXJlZCkKKwl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCisJYnVpbGRfb2xkX2xpYnM9bm8KKwlicmVhaworCTs7CisgICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMgfCAtc3RhdGljLWxpYnRvb2wtbGlicykKKwljYXNlICRhcmcgaW4KKwktYWxsLXN0YXRpYykKKwkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIgorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCSAgOzsKKwktc3RhdGljKQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz1idWlsdAorCSAgOzsKKwktc3RhdGljLWxpYnRvb2wtbGlicykKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJICA7OworCWVzYWMKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwlicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKyAgICAgIHFhcmc9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0CisgICAgICBmdW5jX2FwcGVuZCBsaWJ0b29sX2FyZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisKKyAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJY2FzZSAkcHJldiBpbgorCW91dHB1dCkKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBPVVRQVVRAIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBPVVRQVVRAIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRwcmV2IGluCisJYmluZGlyKQorCSAgYmluZGlyPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWRsZmlsZXN8ZGxwcmVmaWxlcykKKwkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgcHJlbG9hZD15ZXMKKwkgIGZpCisJICBjYXNlICRhcmcgaW4KKwkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCisJICBmb3JjZSkKKwkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbHNlCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRhcmciCisJICAgIGVsc2UKKwkgICAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGFyZyIKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXhwc3ltcykKKwkgIGV4cG9ydF9zeW1ib2xzPSIkYXJnIgorCSAgdGVzdCAtZiAiJGFyZyIgXAorCSAgICB8fCBmdW5jX2ZhdGFsX2Vycm9yICJzeW1ib2wgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWV4cHN5bXNfcmVnZXgpCisJICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlmcmFtZXdvcmspCisJICBjYXNlICRob3N0IGluCisJICAgICotKi1kYXJ3aW4qKQorCSAgICAgIGNhc2UgIiRkZXBsaWJzICIgaW4KKwkJKiIgJHFhcmcubHRmcmFtZXdvcmsgIiopIDs7CisJCSopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkcWFyZy5sdGZyYW1ld29yayIgIyB0aGlzIGlzIGZpeGVkIGxhdGVyCisJCSAgIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICBlc2FjCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJaW5zdF9wcmVmaXgpCisJICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJb2JqZWN0bGlzdCkKKwkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCisJICAgIHNhdmVfYXJnPSRhcmcKKwkgICAgbW9yZWFyZ3M9CisJICAgIGZvciBmaWwgaW4gYGNhdCAiJHNhdmVfYXJnImAKKwkgICAgZG8KKyMJICAgICAgZnVuY19hcHBlbmQgbW9yZWFyZ3MgIiAkZmlsIgorCSAgICAgIGFyZz0kZmlsCisJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJICAgICAgaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkJcGljX29iamVjdD0KKwkJbm9uX3BpY19vYmplY3Q9CisKKwkJIyBSZWFkIHRoZSAubG8gZmlsZQorCQlmdW5jX3NvdXJjZSAiJGFyZyIKKworCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmCisJCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJCWZpCisKKwkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCisKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCSAgICAgIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkcGljX29iamVjdCIKKwkJICAgICAgcHJldj0KKwkJICAgICAgY29udGludWUKKwkJICAgIGVsc2UKKwkJICAgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkJICAgICAgcHJldj1kbHByZWZpbGVzCisJCSAgICBmaQorCQkgIGZpCisKKwkJICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQorCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkJICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkJICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkcGljX29iamVjdCIKKwkJICAgIHByZXY9CisJCSAgZmkKKworCQkgICMgQSBQSUMgb2JqZWN0LgorCQkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkJICBhcmc9IiRwaWNfb2JqZWN0IgorCQlmaQorCisJCSMgTm9uLVBJQyBvYmplY3QuCisJCWlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJCSAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0CisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCQkgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJCSAgZmkKKwkJZWxzZQorCQkgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkJICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCisJCSAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkJZmkKKwkgICAgICBlbHNlCisJCSMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCQlpZiAkb3B0X2RyeV9ydW47IHRoZW4KKwkJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCQkgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJCSAgeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkJICBmdW5jX2xvMm8gIiRhcmciCisJCSAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkJICBub25fcGljX29iamVjdD0keGRpciRmdW5jX2xvMm9fcmVzdWx0CisJCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgICAgICAgIGVsc2UKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IgorCQlmaQorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAibGluayBpbnB1dCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICBmaQorCSAgYXJnPSRzYXZlX2FyZworCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXByZWNpb3VzX3JlZ2V4KQorCSAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcmVsZWFzZSkKKwkgIHJlbGVhc2U9Ii0kYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJwYXRoIHwgeHJwYXRoKQorCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJICBjYXNlICRhcmcgaW4KKwkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkgICopCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIgorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJHByZXYiID0gcnBhdGg7IHRoZW4KKwkgICAgY2FzZSAiJHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgcnBhdGggIiAkYXJnIiA7OworCSAgICBlc2FjCisJICBlbHNlCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkYXJnIiA7OworCSAgICBlc2FjCisJICBmaQorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXNocmV4dCkKKwkgIHNocmV4dF9jbWRzPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXdlYWspCisJICBmdW5jX2FwcGVuZCB3ZWFrX2xpYnMgIiAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhjY2xpbmtlcikKKwkgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIHByZXY9CisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhjb21waWxlcikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4bGlua2VyKQorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICR3bCRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICR3bCRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR3bCRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJKikKKwkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwllc2FjCisgICAgICBmaSAjIHRlc3QgLW4gIiRwcmV2IgorCisgICAgICBwcmV2YXJnPSIkYXJnIgorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1hbGwtc3RhdGljKQorCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgIyBTZWUgY29tbWVudCBmb3IgLXN0YXRpYyBmbGFnIGJlbG93LCBmb3IgbW9yZSBkZXRhaWxzLgorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1hbGxvdy11bmRlZmluZWQpCisJIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgorCWZ1bmNfZmF0YWxfZXJyb3IgIlxgLWFsbG93LXVuZGVmaW5lZCcgbXVzdCBub3QgYmUgdXNlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IgorCTs7CisKKyAgICAgIC1hdm9pZC12ZXJzaW9uKQorCWF2b2lkX3ZlcnNpb249eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtYmluZGlyKQorCXByZXY9YmluZGlyCisJY29udGludWUKKwk7OworCisgICAgICAtZGxvcGVuKQorCXByZXY9ZGxmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRscHJlb3BlbikKKwlwcmV2PWRscHJlZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtZHluYW1pYykKKwlleHBvcnRfZHluYW1pYz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIm1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCisJZmkKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KKwkgIHByZXY9ZXhwc3ltcworCWVsc2UKKwkgIHByZXY9ZXhwc3ltc19yZWdleAorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAtZnJhbWV3b3JrKQorCXByZXY9ZnJhbWV3b3JrCisJY29udGludWUKKwk7OworCisgICAgICAtaW5zdC1wcmVmaXgtZGlyKQorCXByZXY9aW5zdF9wcmVmaXgKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgVGhlIG5hdGl2ZSBJUklYIGxpbmtlciB1bmRlcnN0YW5kcyAtTEFORzoqLCAtTElTVDoqIGFuZCAtTE5POioKKyAgICAgICMgc28sIGlmIHdlIHNlZSB0aGVzZSBmbGFncyBiZSBjYXJlZnVsIG5vdCB0byB0cmVhdCB0aGVtIGxpa2UgLUwKKyAgICAgIC1MW0EtWl1bQS1aXSo6KikKKwljYXNlICR3aXRoX2djYy8kaG9zdCBpbgorCW5vLyotKi1pcml4KiB8IC8qLSotaXJpeCopCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1MKikKKwlmdW5jX3N0cmlwbmFtZSAiLUwiICcnICIkYXJnIgorCWlmIHRlc3QgLXogIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiOyB0aGVuCisJICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAicmVxdWlyZSBubyBzcGFjZSBiZXR3ZWVuIFxgLUwnIGFuZCBcYCQxJyIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAibmVlZCBwYXRoIGZvciBcYC1MJyBvcHRpb24iCisJICBmaQorCWZpCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJZGlyPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJKikKKwkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkgIHRlc3QgLXogIiRhYnNkaXIiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIgorCSAgZGlyPSIkYWJzZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAiJGRlcGxpYnMgIiBpbgorCSoiIC1MJGRpciAiKiB8ICoiICRhcmcgIiopCisJICAjIFdpbGwgb25seSBoYXBwZW4gZm9yIGFic29sdXRlIG9yIHN5c3Jvb3QgYXJndW1lbnRzCisJICA7OworCSopCisJICAjIFByZXNlcnZlIHN5c3Jvb3QsIGJ1dCBuZXZlciBpbmNsdWRlIHJlbGF0aXZlIGRpcmVjdG9yaWVzCisJICBjYXNlICRkaXIgaW4KKwkgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qIHwgPSopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIiA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBkZXBsaWJzICIgLUwkZGlyIiA7OworCSAgZXNhYworCSAgZnVuY19hcHBlbmQgbGliX3NlYXJjaF9wYXRoICIgJGRpciIKKwkgIDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJEVDSE8gIiRkaXIiIHwgJFNFRCAncyovbGliJCovYmluKidgCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRkaXI6IiopIDs7CisJICA6OikgZGxsc2VhcmNocGF0aD0kZGlyOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JHRlc3RiaW5kaXI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiR0ZXN0YmluZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1sKikKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKiB8ICotKi1oYWlrdSopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBvciBtYXRoIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3MyKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGFuZCBtYXRoIGxpYnJhcmllcyBhcmUgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZnVuY19hcHBlbmQgZGVwbGlicyAiIFN5c3RlbS5sdGZyYW1ld29yayIKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQorCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCWVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KKwkgY2FzZSAkaG9zdCBpbgorCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAjIERvIG5vdCBpbmNsdWRlIGxpYmNfciBkaXJlY3RseSwgdXNlIC1wdGhyZWFkIGZsYWcuCisJICAgY29udGludWUKKwkgICA7OworCSBlc2FjCisJZmkKKwlmdW5jX2FwcGVuZCBkZXBsaWJzICIgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJbW9kdWxlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKworICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgIyBEYXJ3aW4gdXNlcyB0aGUgLWFyY2ggZmxhZyB0byBkZXRlcm1pbmUgb3V0cHV0IGFyY2hpdGVjdHVyZS4KKyAgICAgIC1tb2RlbHwtYXJjaHwtaXN5c3Jvb3R8LS1zeXNyb290KQorCWZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlIFwKKyAgICAgIHwtdGhyZWFkc3wtZm9wZW5tcHwtb3Blbm1wfC1tcHwteG9wZW5tcHwtb21wfC1xc21wPSopCisJZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGFyZyIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbXVsdGlfbW9kdWxlKQorCXNpbmdsZV9tb2R1bGU9IiR7d2x9LW11bHRpX21vZHVsZSIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotZGFyd2luKiB8ICotY2VnY2MqKQorCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCisJICAjIGFuZCBEYXJ3aW4gaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgIGZ1bmNfd2FybmluZyAiXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiCisJICBmdW5jX3dhcm5pbmcgImFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtb2JqZWN0bGlzdCkKKwlwcmV2PW9iamVjdGxpc3QKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCisJcHJldj1wcmVjaW91c19yZWdleAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkYXJnIgorCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCT0qKQorCSAgZnVuY19zdHJpcG5hbWUgJz0nICcnICIkZGlyIgorCSAgZGlyPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCisJICA7OworCWVzYWMKKwljYXNlICIkeHJwYXRoICIgaW4KKwkqIiAkZGlyICIqKSA7OworCSopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNoYXJlZCkKKwkjIFRoZSBlZmZlY3RzIG9mIC1zaGFyZWQgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNocmV4dCkKKwlwcmV2PXNocmV4dAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLW51bWJlcikKKwlwcmV2PXZpbmZvCisJdmluZm9fbnVtYmVyPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXdlYWspCisgICAgICAgIHByZXY9d2VhaworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgZnVuY19hcHBlbmQgYXJnICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKKwlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCTs7CisKKyAgICAgIC1XbCwqKQorCWZ1bmNfc3RyaXBuYW1lICctV2wsJyAnJyAiJGFyZyIKKwlhcmdzPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlhcmc9CisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGFyZyAiICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YQ0NsaW5rZXIpCisJcHJldj14Y2NsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgLW1zZ18qIGZvciBvc2YgY2MKKyAgICAgIC1tc2dfKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICMgRmxhZ3MgdG8gYmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLCB3aXRoIHJhdGlvbmFsZToKKyAgICAgICMgLTY0LCAtbWlwc1swLTldICAgICAgZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC1yWzAtOV1bMC05XSogICAgICAgIHNwZWNpZnkgcHJvY2Vzc29yIGZvciB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC14YXJjaD0qLCAteHRhcmdldD0qIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIFN1biBjb21waWxlcgorICAgICAgIyArREEqLCArREQqICAgICAgICAgICBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBIUCBjb21waWxlcgorICAgICAgIyAtcSogICAgICAgICAgICAgICAgICBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCisgICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmbGFncyBmb3IgR0NDCisgICAgICAjIC1GL3BhdGggICAgICAgICAgICAgIHBhdGggdG8gdW5pbnN0YWxsZWQgZnJhbWV3b3JrcywgZ2NjIG9uIGRhcndpbgorICAgICAgIyAtcCwgLXBnLCAtLWNvdmVyYWdlLCAtZnByb2ZpbGUtKiAgcHJvZmlsaW5nIGZsYWdzIGZvciBHQ0MKKyAgICAgICMgQGZpbGUgICAgICAgICAgICAgICAgR0NDIHJlc3BvbnNlIGZpbGVzCisgICAgICAjIC10cD0qICAgICAgICAgICAgICAgIFBvcnRsYW5kIHBnY2MgdGFyZ2V0IHByb2Nlc3NvciBzZWxlY3Rpb24KKyAgICAgICMgLS1zeXNyb290PSogICAgICAgICAgZm9yIHN5c3Jvb3Qgc3VwcG9ydAorICAgICAgIyAtTyosIC1mbHRvKiwgLWZ3aG9wciosIC1mdXNlLWxpbmtlci1wbHVnaW4gR0NDIGxpbmstdGltZSBvcHRpbWl6YXRpb24KKyAgICAgIC02NHwtbWlwc1swLTldfC1yWzAtOV1bMC05XSp8LXhhcmNoPSp8LXh0YXJnZXQ9KnwrREEqfCtERCp8LXEqfC1tKnwgXAorICAgICAgLXRbNDVdKnwtdHhzY2FsZSp8LXB8LXBnfC0tY292ZXJhZ2V8LWZwcm9maWxlLSp8LUYqfEAqfC10cD0qfC0tc3lzcm9vdD0qfCBcCisgICAgICAtTyp8LWZsdG8qfC1md2hvcHIqfC1mdXNlLWxpbmtlci1wbHVnaW4pCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworCisgICAgICAqLiRvYmpleHQpCisJIyBBIHN0YW5kYXJkIG9iamVjdC4KKwlmdW5jX2FwcGVuZCBvYmpzICIgJGFyZyIKKwk7OworCisgICAgICAqLmxvKQorCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgorCWlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRhcmciOyB0aGVuCisJICBwaWNfb2JqZWN0PQorCSAgbm9uX3BpY19vYmplY3Q9CisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICIkYXJnIgorCisJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYKKwkgICAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIgorCSAgZmkKKworCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCQlmdW5jX2FwcGVuZCBkbGZpbGVzICIgJHBpY19vYmplY3QiCisJCXByZXY9CisJCWNvbnRpbnVlCisJICAgICAgZWxzZQorCQkjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQlwcmV2PWRscHJlZmlsZXMKKwkgICAgICBmaQorCSAgICBmaQorCisJICAgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJICAgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRwaWNfb2JqZWN0IgorCSAgICAgIHByZXY9CisJICAgIGZpCisKKwkgICAgIyBBIFBJQyBvYmplY3QuCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWVsc2UKKwkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICAgIGZ1bmNfbG8ybyAiJGFyZyIKKwkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIG9sZF9kZXBsaWJzICIgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgICoubGEpCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgorCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRhcmciCisJaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisJICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIHByZXY9CisJZWxpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgorCSAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICBwcmV2PQorCWVsc2UKKwkgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCisgICAgICAqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworICAgICAgZXNhYyAjIGFyZworCisgICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCisJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICAgIGZpCisgICAgZG9uZSAjIGFyZ3VtZW50IHBhcnNpbmcgbG9vcAorCisgICAgdGVzdCAtbiAiJHByZXYiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKKworICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisgICAgZmkKKworICAgIG9sZGxpYnM9CisgICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQorICAgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisgICAgb3V0cHV0bmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCisKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKKyAgICAgIGV2YWwgc2hsaWJfc2VhcmNoX3BhdGg9XGBcJEVDSE8gXCJcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFNFRCBcJ3MvOi8gL2dcJ1xgCisgICAgZWxzZQorICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9CisgICAgZmkKKyAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKKyAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCisKKyAgICBmdW5jX2Rpcm5hbWUgIiRvdXRwdXQiICIvIiAiIgorICAgIG91dHB1dF9vYmpkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JG9iamRpciIKKyAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dF9vYmpkaXIvIgorICAgIHRvb2xfb3V0cHV0X29iamRpcj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgZnVuY19ta2Rpcl9wICIkb3V0cHV0X29iamRpciIKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIgorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCWNhc2UgIiRsaWJzICIgaW4KKwkqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYnMgIiAkZGVwbGliIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgorCisgICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcworICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQorICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM7IHRoZW4KKwlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KKwkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KKwkgICoiICRwcmVfcG9zdF9kZXAgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJHByZV9wb3N0X2RlcHMiIDs7CisJICBlc2FjCisJICBmdW5jX2FwcGVuZCBwcmVfcG9zdF9kZXBzICIgJHByZV9wb3N0X2RlcCIKKwlkb25lCisgICAgICBmaQorICAgICAgcHJlX3Bvc3RfZGVwcz0KKyAgICBmaQorCisgICAgZGVwbGlicz0KKyAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisgICAgbmV3bGliX3NlYXJjaF9wYXRoPQorICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIGxpYikKKwlwYXNzZXM9ImNvbnYgZGxwcmVvcGVuIGxpbmsiCisJZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCisJICBjYXNlICRmaWxlIGluCisJICAqLmxhKSA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9oZWxwICJsaWJyYXJpZXMgY2FuIFxgLWRsb3Blbicgb25seSBsaWJ0b29sIGxpYnJhcmllczogJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJZG9uZQorCTs7CisgICAgcHJvZykKKwljb21waWxlX2RlcGxpYnM9CisJZmluYWxpemVfZGVwbGlicz0KKwlhbGxkZXBsaWJzPW5vCisJbmV3ZGxmaWxlcz0KKwluZXdkbHByZWZpbGVzPQorCXBhc3Nlcz0iY29udiBzY2FuIGRsb3BlbiBkbHByZW9wZW4gbGluayIKKwk7OworICAgICopICBwYXNzZXM9ImNvbnYiCisJOzsKKyAgICBlc2FjCisKKyAgICBmb3IgcGFzcyBpbiAkcGFzc2VzOyBkbworICAgICAgIyBUaGUgcHJlb3BlbiBwYXNzIGluIGxpYiBtb2RlIHJldmVyc2VzICRkZXBsaWJzOyBwdXQgaXQgYmFjayBoZXJlCisgICAgICAjIHNvIHRoYXQgLUwgY29tZXMgYmVmb3JlIGxpYnMgdGhhdCBuZWVkIGl0IGZvciBpbnN0YW5jZS4uLgorICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayI7IHRoZW4KKwkjIyBGSVhNRTogRmluZCB0aGUgcGxhY2Ugd2hlcmUgdGhlIGxpc3QgaXMgcmVidWlsdCBpbiB0aGUgd3JvbmcKKwkjIyAgICAgICAgb3JkZXIsIGFuZCBmaXggaXQgdGhlcmUgcHJvcGVybHkKKyAgICAgICAgdG1wX2RlcGxpYnM9CisJZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgIHRtcF9kZXBsaWJzPSIkZGVwbGliICR0bXBfZGVwbGlicyIKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iOyB0aGVuCisJbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCWNhc2UgJHBhc3MgaW4KKwlkbG9wZW4pIGxpYnM9IiRkbGZpbGVzIiA7OworCWRscHJlb3BlbikgbGlicz0iJGRscHJlZmlsZXMiIDs7CisJbGluaykKKwkgIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSIKKwkgIHRlc3QgIlgkbGlua19hbGxfZGVwbGlicyIgIT0gWG5vICYmIGxpYnM9IiRsaWJzICRkZXBlbmRlbmN5X2xpYnMiCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixkbHByZW9wZW4iOyB0aGVuCisJIyBDb2xsZWN0IGFuZCBmb3J3YXJkIGRlcGxpYnMgb2YgcHJlb3BlbmVkIGxpYnRvb2wgbGlicworCWZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCisJICAjIElnbm9yZSBub24tbGlidG9vbC1saWJzCisJICBkZXBlbmRlbmN5X2xpYnM9CisJICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGxpYiIKKwkgIGNhc2UgJGxpYiBpbgorCSAgKi5sYSkJZnVuY19zb3VyY2UgIiRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiIDs7CisJICBlc2FjCisKKwkgICMgQ29sbGVjdCBwcmVvcGVuZWQgbGlidG9vbCBkZXBsaWJzLCBleGNlcHQgYW55IHRoaXMgbGlicmFyeQorCSAgIyBoYXMgZGVjbGFyZWQgYXMgd2VhayBsaWJzCisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisgICAgICAgICAgICBkZXBsaWJfYmFzZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKKwkgICAgY2FzZSAiICR3ZWFrX2xpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliX2Jhc2UgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZG9uZQorCWxpYnM9IiRkbHByZWZpbGVzIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgorCSMgQ29sbGVjdCBkbHByZW9wZW5lZCBsaWJyYXJpZXMKKwlzYXZlX2RlcGxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorCisgICAgICBmb3IgZGVwbGliIGluICRsaWJzOyBkbworCWxpYj0KKwlmb3VuZD1ubworCWNhc2UgJGRlcGxpYiBpbgorCS1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUgXAorICAgICAgICB8LXRocmVhZHN8LWZvcGVubXB8LW9wZW5tcHwtbXB8LXhvcGVubXB8LW9tcHwtcXNtcD0qKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRkZXBsaWIiCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCisJCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJCSAgICAqIiAkZGVwbGliICIqKSA7OworCQkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCS1sKikKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZzsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgIlxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiCisJICAgIGNvbnRpbnVlCisJICBmaQorCSAgZnVuY19zdHJpcG5hbWUgJy1sJyAnJyAiJGRlcGxpYiIKKwkgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCisJICBlbHNlCisJICAgIHNlYXJjaGRpcnM9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCisJICBmaQorCSAgZm9yIHNlYXJjaGRpciBpbiAkc2VhcmNoZGlyczsgZG8KKwkgICAgZm9yIHNlYXJjaF9leHQgaW4gLmxhICRzdGRfc2hyZXh0IC5zbyAuYTsgZG8KKwkgICAgICAjIFNlYXJjaCB0aGUgbGlidG9vbCBsaWJyYXJ5CisJICAgICAgbGliPSIkc2VhcmNoZGlyL2xpYiR7bmFtZX0ke3NlYXJjaF9leHR9IgorCSAgICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJCWlmIHRlc3QgIiRzZWFyY2hfZXh0IiA9ICIubGEiOyB0aGVuCisJCSAgZm91bmQ9eWVzCisJCWVsc2UKKwkJICBmb3VuZD1ubworCQlmaQorCQlicmVhayAyCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZG9uZQorCSAgaWYgdGVzdCAiJGZvdW5kIiAhPSB5ZXM7IHRoZW4KKwkgICAgIyBkZXBsaWIgZG9lc24ndCBzZWVtIHRvIGJlIGEgbGlidG9vbCBsaWJyYXJ5CisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICBlbHNlICMgZGVwbGliIGlzIGEgbGlidG9vbCBsaWJyYXJ5CisJICAgICMgSWYgJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyAmJiAkZGVwbGliIGlzIGEgc3RkbGliLAorCSAgICAjIFdlIG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIHRoaW5ncyBoZXJlLCBhbmQgbm90IGxhdGVyLgorCSAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikKKwkJaWYgZnVuY19sYWxpYl9wICIkbGliIjsgdGhlbgorCQkgIGxpYnJhcnlfbmFtZXM9CisJCSAgb2xkX2xpYnJhcnk9CisJCSAgZnVuY19zb3VyY2UgIiRsaWIiCisJCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCQkgICAgbGw9IiRsIgorCQkgIGRvbmUKKwkJICBpZiB0ZXN0ICJYJGxsIiA9ICJYJG9sZF9saWJyYXJ5IiA7IHRoZW4gIyBvbmx5IHN0YXRpYyB2ZXJzaW9uIGF2YWlsYWJsZQorCQkgICAgZm91bmQ9bm8KKwkJICAgIGZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCisJCSAgICBsYWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQorCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCQkgICAgZWxzZQorCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCQkgICAgZmkKKwkJICAgIGNvbnRpbnVlCisJCSAgZmkKKwkJZmkKKwkJOzsKKwkgICAgICAqKSA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGZpCisJICA7OyAjIC1sCisJKi5sdGZyYW1ld29yaykKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiA7IHRoZW4KKwkJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkJICAgICoiICRkZXBsaWIgIiopIDs7CisJCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkZGVwbGliIiA7OworCQllc2FjCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJLUwqKQorCSAgY2FzZSAkbGlua21vZGUgaW4KKwkgIGxpYikKKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgdGVzdCAiJHBhc3MiID0gY29udiAmJiBjb250aW51ZQorCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKwkgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBjb250aW51ZQorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgICA7OworCSAgKikKKwkgICAgZnVuY193YXJuaW5nICJcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICBjb250aW51ZQorCSAgOzsgIyAtTAorCS1SKikKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwkgICAgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGRlcGxpYiIKKwkgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGRpcj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkZGlyIiA7OworCSAgICBlc2FjCisJICBmaQorCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgIGNvbnRpbnVlCisJICA7OworCSoubGEpCisJICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIKKwkgIGxpYj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJICA7OworCSouJGxpYmV4dCkKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICAjIExpbmtpbmcgY29udmVuaWVuY2UgbW9kdWxlcyBpbnRvIHNoYXJlZCBsaWJyYXJpZXMgaXMgYWxsb3dlZCwKKwkgICAgIyBidXQgbGlua2luZyBvdGhlciBzdGF0aWMgbGlicmFyaWVzIGlzIG5vbi1wb3J0YWJsZS4KKwkgICAgY2FzZSAiICRkbHByZWNvbnZlbmllbmNlbGlicyAiIGluCisJICAgICoiICRkZXBsaWIgIiopIDs7CisJICAgICopCisJICAgICAgdmFsaWRfYV9saWI9bm8KKwkgICAgICBjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCQltYXRjaF9wYXR0ZXJuKikKKwkJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAorCQkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkJICBpZiBldmFsICJcJEVDSE8gXCIkZGVwbGliXCIiIDI+L2Rldi9udWxsIHwgJFNFRCAxMHEgXAorCQkgICAgfCAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkgICAgdmFsaWRfYV9saWI9eWVzCisJCSAgZmkKKwkJOzsKKwkJcGFzc19hbGwpCisJCSAgdmFsaWRfYV9saWI9eWVzCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBUcnlpbmcgdG8gbGluayB3aXRoIHN0YXRpYyBsaWIgYXJjaGl2ZSAkZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKKwkJZWNobyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZSBoZXJlLiIKKwkgICAgICBlbHNlCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgorCQkkRUNITyAiKioqIHN0YXRpYyBsaWJyYXJ5ICRkZXBsaWIgaXMgbm90IHBvcnRhYmxlISIKKwkJZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIHByb2cpCisJICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIDs7ICMgKi4kbGliZXh0CisJKi5sbyB8ICouJG9iamV4dCkKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgIGVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuIHx8IHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcgc3RhdGljYWxseSwKKwkgICAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRlcGxpYiIKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICRkZXBsaWIiCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJJURFUExJQlMlKQorCSAgYWxsZGVwbGlicz15ZXMKKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMgIyBjYXNlICRkZXBsaWIKKworCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGxpYiIgXAorCSAgfHwgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCWxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9CisJIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKKwkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlcyBpbnN0YWxsZWQsIG9yIHNob3VsZG5vdGxpbmsKKwlpbnN0YWxsZWQ9eWVzCisJc2hvdWxkbm90bGluaz1ubworCWF2b2lkdGVtcHJwYXRoPQorCisKKwkjIFJlYWQgdGhlIC5sYSBmaWxlCisJZnVuY19zb3VyY2UgIiRsaWIiCisKKwkjIENvbnZlcnQgIi1mcmFtZXdvcmsgZm9vIiB0byAiZm9vLmx0ZnJhbWV3b3JrIgorCWlmIHRlc3QgLW4gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIjsgdGhlbgorCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICIkaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzLy1mcmFtZXdvcmsgXChbXiAkXSpcKS9cMS5sdGZyYW1ld29yay9nJ2AKKwkgIGZvciB0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIGluICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnczsgZG8KKwkgICAgY2FzZSAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJICAgICAgKiIgJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyI7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlkZXBlbmRlbmN5X2xpYnM9YCRFQ0hPICIgJGRlcGVuZGVuY3lfbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJICAgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iIHx8CisJICAgeyB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IH07IHRoZW4KKwkgIHRlc3QgLW4gIiRkbG9wZW4iICYmIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkZGxvcGVuIgorCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRkbHByZW9wZW4iCisJZmkKKworCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgorCSAgICBmaQorCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCisJICAgIGZ1bmNfYXBwZW5kIGNvbnZlbmllbmNlICIgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICBmdW5jX2FwcGVuZCBvbGRfY29udmVuaWVuY2UgIiAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIHRtcF9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCQljYXNlICIkdG1wX2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIKKwkgICAgZG9uZQorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IgorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGNvbnYKKworCisJIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorCWxpbmtsaWI9CisJaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJgorCSAgIHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQsbm8iOyB9OyB0aGVuCisJICBsaW5rbGliPSRvbGRfbGlicmFyeQorCWVsc2UKKwkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkgICAgbGlua2xpYj0iJGwiCisJICBkb25lCisJZmkKKwlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgorCSAgZWxzZQorCSAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGxpYiIKKwkgIGZpCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBkbG9wZW4KKworCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGxhZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNfbGFkaXI9IiRsYWRpciIgOzsKKwkqKQorCSAgYWJzX2xhZGlyPWBjZCAiJGxhZGlyIiAmJiBwd2RgCisJICBpZiB0ZXN0IC16ICIkYWJzX2xhZGlyIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkbGFkaXInIgorCSAgICBmdW5jX3dhcm5pbmcgInBhc3NpbmcgaXQgbGl0ZXJhbGx5IHRvIHRoZSBsaW5rZXIsIGFsdGhvdWdoIGl0IG1pZ2h0IGZhaWwiCisJICAgIGFic19sYWRpcj0iJGxhZGlyIgorCSAgZmkKKwkgIDs7CisJZXNhYworCWZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJbGFuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKwkjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KKwlpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCisJICBpZiB0ZXN0ICEgLWYgIiRsdF9zeXNyb290JGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIKKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgorCSAgZWxzZQorCSAgICBkaXI9IiRsdF9zeXNyb290JGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbHRfc3lzcm9vdCRsaWJkaXIiCisJICBmaQorCSAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gWHllcyAmJiBhdm9pZHRlbXBycGF0aD15ZXMKKwllbHNlCisJICBpZiB0ZXN0ICEgLWYgIiRsYWRpci8kb2JqZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCisJICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfcGF0aCAiICRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgorCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCisJICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfcGF0aCAiICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkbGFuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIiAmJiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGxpYnJhcmllcyBtYXkgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCisJICBmaQorCSAgY2FzZSAiJGhvc3QiIGluCisJICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgcGxhdGZvcm1zIHdpdGggUEUtRExMcy4KKwkgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICAgICAgIyBMaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyeSBpZiBib3RoCisJICAgICAgIyBzdGF0aWMgYW5kIHNoYXJlZCBhcmUgcHJlc2VudC4gIFRoZXJlZm9yZSwgZW5zdXJlIHdlIGV4dHJhY3QKKwkgICAgICAjIHN5bWJvbHMgZnJvbSB0aGUgaW1wb3J0IGxpYnJhcnkgaWYgYSBzaGFyZWQgbGlicmFyeSBpcyBwcmVzZW50CisJICAgICAgIyAob3RoZXJ3aXNlLCB0aGUgZGxvcGVuIG1vZHVsZSBuYW1lIHdpbGwgYmUgaW5jb3JyZWN0KS4gIFdlIGRvCisJICAgICAgIyB0aGlzIGJ5IHB1dHRpbmcgdGhlIGltcG9ydCBsaWJyYXJ5IG5hbWUgaW50byAkbmV3ZGxwcmVmaWxlcy4KKwkgICAgICAjIFdlIHJlY292ZXIgdGhlIGRsb3BlbiBtb2R1bGUgbmFtZSBieSAnc2F2aW5nJyB0aGUgbGEgZmlsZQorCSAgICAgICMgbmFtZSBpbiBhIHNwZWNpYWwgcHVycG9zZSB2YXJpYWJsZSwgYW5kIChsYXRlcikgZXh0cmFjdGluZyB0aGUKKwkgICAgICAjIGRsbmFtZSBmcm9tIHRoZSBsYSBmaWxlLgorCSAgICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgICBmdW5jX3RyX3NoICIkZGlyLyRsaW5rbGliIgorCSAgICAgICAgZXZhbCAibGliZmlsZV8kZnVuY190cl9zaF9yZXN1bHQ9XCRhYnNfbGFkaXIvXCRsYW5hbWUiCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kbGlua2xpYiIKKwkgICAgICBlbHNlCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgICAjIEtlZXAgYSBsaXN0IG9mIHByZW9wZW5lZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMgdG8gY2hlY2sKKwkgICAgICAgICMgdGhhdCB0aGV5IGFyZSBiZWluZyB1c2VkIGNvcnJlY3RseSBpbiB0aGUgbGluayBwYXNzLgorCSAgICAgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCSAgICAgICAgICBmdW5jX2FwcGVuZCBkbHByZWNvbnZlbmllbmNlbGlicyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgIGZpCisJICAgIDs7CisJICAgICogKQorCSAgICAgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scworCSAgICAgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgorCSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCisJICAgICAgICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJICAgICAgICAgIGZ1bmNfYXBwZW5kIGRscHJlY29udmVuaWVuY2VsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgICAgICBlbGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kZGxuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJZmkgIyAkcGFzcyA9IGRscHJlb3BlbgorCisJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICMgTGluayB0aGUgY29udmVuaWVuY2UgbGlicmFyeQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKKwkgIGVsaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiICMgdXNlZCBmb3IgcHJvZyxzY2FuIHBhc3MKKwkgIGZpCisJICBjb250aW51ZQorCWZpCisKKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nICYmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCisJICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkbGFkaXIiCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCisJICBsaW5rYWxsZGVwbGlicz1ubworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKKwkgIGZpCisKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICAgICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJCSA7OworCSAgICBlc2FjCisJICAgICMgTmVlZCB0byBsaW5rIGFnYWluc3QgYWxsIGRlcGVuZGVuY3lfbGlicz8KKwkgICAgaWYgdGVzdCAiJGxpbmthbGxkZXBsaWJzIiA9IHllczsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICAjIE5lZWQgdG8gaGFyZGNvZGUgc2hhcmVkIGxpYnJhcnkgcGF0aHMKKwkgICAgICAjIG9yL2FuZCBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcworCSAgICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIgorCSAgZG9uZSAjIGZvciBkZXBsaWIKKwkgIGNvbnRpbnVlCisJZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgICAgeyB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwKKwkgICAgICAgICB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzLCRpbnN0YWxsZWQiID0gImJ1aWx0LHllcyI7IH0gfHwKKwkgICAgICAgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgorCSAgICAjIFdlIG5lZWQgdG8gaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aAorCSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAteiAiJGF2b2lkdGVtcHJwYXRoIiA7IHRoZW4KKwkgICAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgICAgY2FzZSAiJHRlbXBfcnBhdGg6IiBpbgorCSAgICAgICoiJGFic2RpcjoiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0ZW1wX3JwYXRoICIkYWJzZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisKKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBjb21waWxlX3JwYXRoICIgJGFic2RpciIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KKworCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCisJICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAorCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCisJCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KKwkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCisJICAgIGNvbnRpbnVlCisJICBmaQorCWZpCisKKwlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisJdXNlX3N0YXRpY19saWJzPSRwcmVmZXJfc3RhdGljX2xpYnMKKwlpZiB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IGJ1aWx0ICYmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCisJICB1c2Vfc3RhdGljX2xpYnM9bm8KKwlmaQorCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgIHsgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqKQorCSAgICAgICMgTm8gcG9pbnQgaW4gcmVsaW5raW5nIERMTHMgYmVjYXVzZSBwYXRocyBhcmUgbm90IGVuY29kZWQKKwkgICAgICBmdW5jX2FwcGVuZCBub3RpbnN0X2RlcGxpYnMgIiAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPW5vCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgbm90aW5zdF9kZXBsaWJzICIgJGxpYiIKKwkgICAgICBuZWVkX3JlbGluaz15ZXMKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwkgICMgVGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5CisKKwkgICMgV2FybiBhYm91dCBwb3J0YWJpbGl0eSwgY2FuJ3QgbGluayBhZ2FpbnN0IC1tb2R1bGUncyBvbiBzb21lCisJICAjIHN5c3RlbXMgKGRhcndpbikuICBEb24ndCBibGVhdCBhYm91dCBkbG9wZW5lZCBtb2R1bGVzIHRob3VnaCEKKwkgIGRsb3Blbm1vZHVsZT0iIgorCSAgZm9yIGRscHJlbW9kdWxldGVzdCBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgaWYgdGVzdCAiWCRkbHByZW1vZHVsZXRlc3QiID0gIlgkbGliIjsgdGhlbgorCSAgICAgIGRsb3Blbm1vZHVsZT0iJGRscHJlbW9kdWxldGVzdCIKKwkgICAgICBicmVhaworCSAgICBmaQorCSAgZG9uZQorCSAgaWYgdGVzdCAteiAiJGRsb3Blbm1vZHVsZSIgJiYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwkgICAgZWNobworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgZXhlY3V0YWJsZSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZWxzZQorCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCisJICAgIGZpCisJICAgICRFQ0hPICIqKiogJGxpbmtsaWIgaXMgbm90IHBvcnRhYmxlISIKKwkgIGZpCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmCisJICAgICB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgorCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCisJICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKKwkgICAgIyBzZWFyY2ggcGF0aC4KKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfcnBhdGggIiAkYWJzZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCisJICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCisJICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCSAgICBzaGlmdAorCSAgICByZWFsbmFtZT0iJDEiCisJICAgIHNoaWZ0CisJICAgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCSAgICAjIHVzZSBkbG5hbWUgaWYgd2UgZ290IGl0LiBpdCdzIHBlcmZlY3RseSBnb29kLCBubz8KKwkgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICBzb25hbWU9IiRkbG5hbWUiCisJICAgIGVsaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgICAgICMgYmxlaCB3aW5kb3dzCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICpjeWd3aW4qIHwgbWluZ3cqIHwgKmNlZ2NjKikKKwkgICAgICAgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJCW1ham9yPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQl2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKwkgICAgZWxzZQorCSAgICAgIHNvbmFtZT0iJHJlYWxuYW1lIgorCSAgICBmaQorCisJICAgICMgTWFrZSBhIG5ldyBuYW1lIGZvciB0aGUgZXh0cmFjdF9leHBzeW1zX2NtZHMgdG8gdXNlCisJICAgIHNvcm9vdD0iJHNvbmFtZSIKKwkgICAgZnVuY19iYXNlbmFtZSAiJHNvcm9vdCIKKwkgICAgc29uYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGZ1bmNfc3RyaXBuYW1lICdsaWInICcuZGxsJyAiJHNvbmFtZSIKKwkgICAgbmV3bGliPWxpYmltcC0kZnVuY19zdHJpcG5hbWVfcmVzdWx0LmEKKworCSAgICAjIElmIHRoZSBsaWJyYXJ5IGhhcyBubyBleHBvcnQgbGlzdCwgdGhlbiBjcmVhdGUgb25lIG5vdworCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiI7IHRoZW4gOgorCSAgICBlbHNlCisJICAgICAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gXGAkc29uYW1lJyIKKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJGV4dHJhY3RfZXhwc3ltc19jbWRzIiAnZXhpdCAkPycKKwkgICAgZmkKKworCSAgICAjIENyZWF0ZSAkbmV3bGliCisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKKwkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgaW1wb3J0IGxpYnJhcnkgZm9yIFxgJHNvbmFtZSciCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIgJ2V4aXQgJD8nCisJICAgIGZpCisJICAgICMgbWFrZSBzdXJlIHRoZSBsaWJyYXJ5IHZhcmlhYmxlcyBhcmUgcG9pbnRpbmcgdG8gdGhlIG5ldyBsaWJyYXJ5CisJICAgIGRpcj0kb3V0cHV0X29iamRpcgorCSAgICBsaW5rbGliPSRuZXdsaWIKKwkgIGZpICMgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIgorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkJY2FzZSAkaG9zdCBpbgorCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCisJCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1kYXJ3aW4qICkKKwkJICAgICMgaWYgdGhlIGxpYiBpcyBhIChub24tZGxvcGVuZWQpIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QKKwkJICAgICMgbGluayBhZ2FpbnN0IGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBlYXJsaWVyIHdhcm5pbmdzCisJCSAgICBpZiAvdXNyL2Jpbi9maWxlIC1MICRhZGQgMj4gL2Rldi9udWxsIHwKKwkJCSAkR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCisJCSAgICAgIGlmIHRlc3QgIlgkZGxvcGVubW9kdWxlIiAhPSAiWCRsaWIiOyB0aGVuCisJCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCisJCQlpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgorCQkJICBlY2hvCisJCQkgIGVjaG8gIioqKiBBbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc3RhdGljIGFyY2hpdmUgYXZhaWxhYmxlIgorCQkJICBlY2hvICIqKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKKwkJCWVsc2UKKwkJCSAgYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJCWZpCisJCSAgICAgIGVsaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCQkJYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJICAgICAgZmkKKwkJICAgIGZpCisJCWVzYWMKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKKwkJZXNhYworCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIHJlbGluaykKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICAgIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJCWFkZF9kaXI9Ii1MJGFic2RpciIKKwkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQkgIGNhc2UgJGxpYmRpciBpbgorCQkgICAgW1xcL10qKQorCQkgICAgICBmdW5jX2FwcGVuZCBhZGRfZGlyICIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgICAgOzsKKwkJICBlc2FjCisJCWZpCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7CisJICAgIGVzYWMKKworCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCisJICAgICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJ1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgorCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBjb21waWxlX3NobGlicGF0aCAiJGFkZF9zaGxpYnBhdGg6IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmCisJCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmCisJCSB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkJY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkJKiI6JGxpYmRpcjoiKikgOzsKKwkJKikgZnVuY19hcHBlbmQgZmluYWxpemVfc2hsaWJwYXRoICIkbGliZGlyOiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJICAgIGFkZF9zaGxpYnBhdGg9CisJICAgIGFkZF9kaXI9CisJICAgIGFkZD0KKwkgICAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KKwkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXMgJiYKKwkgICAgICAgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSIgPSBubzsgdGhlbgorCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGxpYmRpcjoiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9zaGxpYnBhdGggIiRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgorCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgorCQlhZGQ9IiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkJYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJY2FzZSAkbGliZGlyIGluCisJCSAgW1xcL10qKQorCQkgICAgZnVuY19hcHBlbmQgYWRkX2RpciAiIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCisJCSAgICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZF9kaXIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZCAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgorCSAgICBmaQorCSAgZmkKKwllbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCisJICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKKwkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KKwkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCisJICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgY29tcGlsZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkZmluYWxpemVfZGVwbGlicyIKKwkgIGZpCisJZWxpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBOb3QgYSBzaGFyZWQgbGlicmFyeQorCSAgaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorCSAgICAjIFdlJ3JlIHRyeWluZyBsaW5rIGEgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBhIHN0YXRpYyBvbmUKKwkgICAgIyBidXQgdGhlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQuCisKKwkgICAgIyBKdXN0IHByaW50IGEgd2FybmluZyBhbmQgYWRkIHRoZSBsaWJyYXJ5IHRvIGRlcGVuZGVuY3lfbGlicyBzbworCSAgICAjIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBzdGF0aWMgbGlicmFyeS4KKwkgICAgZWNobworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCisJICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgZWNobyAiKioqIEJ1dCBhcyB5b3UgdHJ5IHRvIGJ1aWxkIGEgbW9kdWxlIGxpYnJhcnksIGxpYnRvb2wgd2lsbCBzdGlsbCBjcmVhdGUgIgorCSAgICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIgorCSAgICAgIGVjaG8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKKwkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCQllY2hvCisJCWVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCQllY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCQllY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJCWVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKKwkgICAgbGlua19zdGF0aWM9eWVzCisJICBmaQorCWZpICMgbGluayBzaGFyZWQvc3RhdGljIGxpYnJhcnk/CisKKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZGVwZW5kZW5jeV9saWJzIiAmJgorCSAgICAgeyB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwKKwkgICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkbGlua19zdGF0aWMiID0geWVzOyB9OyB0aGVuCisJICAgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicworCSAgICB0ZW1wX2RlcGxpYnM9CisJICAgIGZvciBsaWJkaXIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRsaWJkaXIgaW4KKwkgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRsaWJkaXIiCisJICAgICAgICAgICB0ZW1wX3hycGF0aD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KKwkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OworCQkgICAqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgZnVuY19hcHBlbmQgdGVtcF9kZXBsaWJzICIgJGxpYmRpciI7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCisJICBmaQorCisJICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkYWJzZGlyIgorCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5CisJICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGNhc2UgJGRlcGxpYiBpbgorICAgICAgICAgICAgICAtTCopIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisgICAgICAgICAgICAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiOzsKKyAgICAgICAgICAgICAgKikgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiIDs7CisgICAgICAgICAgICBlc2FjCisJICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0ICIqKQorICAgICAgICAgICAgICAgIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzZWFyY2ggcGF0aHMgb2YgYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzCisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBwYXRoPQorCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKKwkgICAgICAqLmxhKQorCSAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiCisJICAgICAgICBkZXBsaWI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSAgICAgICAgZnVuY19kaXJuYW1lICIkZGVwbGliIiAiIiAiLiIKKwkJZGlyPSRmdW5jX2Rpcm5hbWVfcmVzdWx0CisJCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCQljYXNlICRkaXIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNkaXI9IiRkaXIiIDs7CisJCSopCisJCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKKwkJICAgIGFic2Rpcj0iJGRpciIKKwkJICBmaQorCQkgIDs7CisJCWVzYWMKKwkJaWYgJEdSRVAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotZGFyd2luKikKKwkJICBkZXBkZXBsPQorCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCisJCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KKwkJICAgICAgZGVwZGVwbD0kdG1wCisJCSAgICBkb25lCisJCSAgICBpZiB0ZXN0IC1mICIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiIDsgdGhlbgorCQkgICAgICBkZXBkZXBsPSIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiCisJCSAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0x9IC1MICRkZXBkZXBsIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRkYXJ3aW5faW5zdGFsbF9uYW1lIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWAke09UT09MNjR9IC1MICRkZXBkZXBsICB8IGF3ayAne2lmIChOUiA9PSAyKSB7cHJpbnQgJDE7ZXhpdH19J2AKKyAgICAgICAgICAgICAgICAgICAgICBmaQorCQkgICAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICR7d2x9LWR5bGliX2ZpbGUgJHt3bH0ke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiIC1keWxpYl9maWxlICR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKKwkJICAgICAgcGF0aD0KKwkJICAgIGZpCisJCSAgZmkKKwkJICA7OworCQkqKQorCQkgIHBhdGg9Ii1MJGFic2Rpci8kb2JqZGlyIgorCQkgIDs7CisJCWVzYWMKKwkJZWxzZQorCQkgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCSAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJCSAgdGVzdCAiJGFic2RpciIgIT0gIiRsaWJkaXIiICYmIFwKKwkJICAgIGZ1bmNfd2FybmluZyAiXGAkZGVwbGliJyBzZWVtcyB0byBiZSBtb3ZlZCIKKworCQkgIHBhdGg9Ii1MJGFic2RpciIKKwkJZmkKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgY2FzZSAiICRkZXBsaWJzICIgaW4KKwkgICAgICAqIiAkcGF0aCAiKikgOzsKKwkgICAgICAqKSBkZXBsaWJzPSIkcGF0aCAkZGVwbGlicyIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgIGZpICMgbGlua19hbGxfZGVwbGlicyAhPSBubworCWZpICMgbGlua21vZGUgPSBsaWIKKyAgICAgIGRvbmUgIyBmb3IgZGVwbGliIGluICRsaWJzCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9ICJwcm9nIjsgdGhlbgorCSAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGNvbXBpbGVfZGVwbGlicyIKKwkgIGZpbmFsaXplX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkZmluYWxpemVfZGVwbGlicyIKKwllbHNlCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICJgJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlmaQorICAgICAgZmkKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCisJaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KKwkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgIGxpYl9zZWFyY2hfcGF0aD0KKwkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KKwkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGxpYl9zZWFyY2hfcGF0aCAiICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKwlmaQorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgdmFycz0iZGVwbGlicyIKKwllbHNlCisJICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKKwlmaQorCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbworCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgorCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCisJICBuZXdfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbworCSAgICAjIEZJWE1FOiBQZWRhbnRpY2FsbHksIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBzbworCSAgICAjICAgICAgICB0aGF0IHNvbWUgbmFzdHkgZGVwZW5kZW5jeSBsb29wIGlzbid0IGFjY2lkZW50YWxseQorCSAgICAjICAgICAgICBicm9rZW46CisJICAgICNuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiCisJICAgICMgUHJhZ21hdGljYWxseSwgdGhpcyBzZWVtcyB0byBjYXVzZSB2ZXJ5IGZldyBwcm9ibGVtcyBpbgorCSAgICAjIHByYWN0aWNlOgorCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgIC1SKikgOzsKKwkgICAgKikKKwkgICAgICAjIEFuZCBoZXJlIGlzIHRoZSByZWFzb246IHdoZW4gYSBsaWJyYXJ5IGFwcGVhcnMgbW9yZQorCSAgICAgICMgdGhhbiBvbmNlIGFzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY2Ugb2YgYSBsaWJyYXJ5LCBvcgorCSAgICAgICMgaXMgaW1wbGljaXRseSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UgYnkgdGhlCisJICAgICAgIyBjb21waWxlciwgaXQgaXMgY29uc2lkZXJlZCBzcGVjaWFsLCBhbmQgbXVsdGlwbGUKKwkgICAgICAjIG9jY3VycmVuY2VzIHRoZXJlb2YgYXJlIG5vdCByZW1vdmVkLiAgQ29tcGFyZSB0aGlzCisJICAgICAgIyB3aXRoIGhhdmluZyB0aGUgc2FtZSBsaWJyYXJ5IGJlaW5nIGxpc3RlZCBhcyBhCisJICAgICAgIyBkZXBlbmRlbmN5IG9mIG11bHRpcGxlIG90aGVyIGxpYnJhcmllczogaW4gdGhpcyBjYXNlLAorCSAgICAgICMgd2Uga25vdyAocGVkYW50aWNhbGx5LCB3ZSBhc3N1bWUpIHRoZSBsaWJyYXJ5IGRvZXMgbm90CisJICAgICAgIyBuZWVkIHRvIGJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSwgc28gd2Uga2VlcCBvbmx5IHRoZQorCSAgICAgICMgbGFzdCBjb3B5LiAgVGhpcyBpcyBub3QgYWx3YXlzIHJpZ2h0LCBidXQgaXQgaXMgcmFyZQorCSAgICAgICMgZW5vdWdoIHRoYXQgd2UgcmVxdWlyZSB1c2VycyB0aGF0IHJlYWxseSBtZWFuIHRvIHBsYXkKKwkgICAgICAjIHN1Y2ggdW5wb3J0YWJsZSBsaW5raW5nIHRyaWNrcyB0byBsaW5rIHRoZSBsaWJyYXJ5CisJICAgICAgIyB1c2luZyAtV2wsLWxuYW1lLCBzbyB0aGF0IGxpYnRvb2wgZG9lcyBub3QgY29uc2lkZXIgaXQKKwkgICAgICAjIGZvciBkdXBsaWNhdGUgcmVtb3ZhbC4KKwkgICAgICBjYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgICAgKikKKwkJY2FzZSAiICRuZXdfbGlicyAiIGluCisJCSoiICRkZXBsaWIgIiopIDs7CisJCSopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkJZXNhYworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJG5ld19saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKQorCSAgICAgIGNhc2UgIiAkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICAqKSBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIGV2YWwgJHZhcj1cIiR0bXBfbGlic1wiCisJZG9uZSAjIGZvciB2YXIKKyAgICAgIGZpCisgICAgICAjIExhc3Qgc3RlcDogcmVtb3ZlIHJ1bnRpbWUgbGlicyBmcm9tIGRlcGVuZGVuY3lfbGlicworICAgICAgIyAodGhleSBzdGF5IGluIGRlcGxpYnMpCisgICAgICB0bXBfbGlicz0KKyAgICAgIGZvciBpIGluICRkZXBlbmRlbmN5X2xpYnMgOyBkbworCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAiIGluCisJKiIgJGkgIiopCisJICBpPSIiCisJICA7OworCWVzYWMKKwlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRpIgorCWZpCisgICAgICBkb25lCisgICAgICBkZXBlbmRlbmN5X2xpYnM9JHRtcF9saWJzCisgICAgZG9uZSAjIGZvciBwYXNzCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKyAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisgICAgZmkKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgb2xkbGliKQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisgICAgICBmaQorCisgICAgICBjYXNlICIgJGRlcGxpYnMiIGluCisgICAgICAqXCAtbCogfCAqXCAtTCopCisJZnVuY193YXJuaW5nICJcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiA7OworICAgICAgZXNhYworCisgICAgICB0ZXN0IC1uICIkcnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisgICAgICBvbGRsaWJzPSIkb3V0cHV0IgorICAgICAgZnVuY19hcHBlbmQgb2JqcyAiJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRvdXRwdXRuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJOzsKKyAgICAgICopCisJdGVzdCAiJG1vZHVsZSIgPSBubyAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgImxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciCisKKwlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgorCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJZWxzZQorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbGlibmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIKKwllbHNlCisJICBlY2hvCisJICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbm9uLWxpYnRvb2wiCisJICAkRUNITyAiKioqIG9iamVjdHMgJG9ianMgaXMgbm90IHBvcnRhYmxlISIKKwkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkb2JqcyIKKwlmaQorICAgICAgZmkKKworICAgICAgdGVzdCAiJGRsc2VsZiIgIT0gbm8gJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIgorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBzaGlmdAorICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKKwlmdW5jX3dhcm5pbmcgImlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IgorCisgICAgICBpbnN0YWxsX2xpYmRpcj0iJDEiCisKKyAgICAgIG9sZGxpYnM9CisgICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCisJICAjIFNvbWUgY29tcGlsZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBhIGAuYWwnIGV4dGVuc2lvbiBzbworCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZXh0ZW5zaW9uIGFuCisJICAjIGFyY2hpdmUgbm9ybWFsbHkgd291bGQuCisJICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCisJICBidWlsZF9vbGRfbGlicz15ZXMKKwlmaQorCisJdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKworCXRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKyAgICAgIGVsc2UKKworCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCisJc2V0IGR1bW15ICR2aW5mbyAwIDAgMAorCXNoaWZ0CisJSUZTPSIkc2F2ZV9pZnMiCisKKwl0ZXN0IC1uICIkNyIgJiYgXAorCSAgZnVuY19mYXRhbF9oZWxwICJ0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciCisKKwkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcworCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCisJIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKKworCWNhc2UgJHZpbmZvX251bWJlciBpbgorCXllcykKKwkgIG51bWJlcl9tYWpvcj0iJDEiCisJICBudW1iZXJfbWlub3I9IiQyIgorCSAgbnVtYmVyX3JldmlzaW9uPSIkMyIKKwkgICMKKwkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0CisJICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgorCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKKwkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKKwkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCisJICAjCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgICMgY29ycmVjdCBsaW51eCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorCSAgZGFyd2lufGxpbnV4fG9zZnx3aW5kb3dzfG5vbmUpCisJICAgIGZ1bmNfYXJpdGggJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3IKKwkgICAgY3VycmVudD0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKKwkgICAgOzsKKwkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxxbnh8c3Vub3MpCisJICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBhZ2U9IjAiCisJICAgIDs7CisJICBpcml4fG5vbnN0b3B1eCkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBsdF9pcml4X2luY3JlbWVudD1ubworCSAgICA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJbm8pCisJICBjdXJyZW50PSIkMSIKKwkgIHJldmlzaW9uPSIkMiIKKwkgIGFnZT0iJDMiCisJICA7OworCWVzYWMKKworCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCisJY2FzZSAkY3VycmVudCBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiQ1VSUkVOVCBcYCRjdXJyZW50JyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcmV2aXNpb24gaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIlJFVklTSU9OIFxgJHJldmlzaW9uJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkYWdlIGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJBR0UgXGAkYWdlJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGFnZSIgLWd0ICIkY3VycmVudCI7IHRoZW4KKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCWZpCisKKwkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCisJbWFqb3I9CisJdmVyc3VmZml4PQorCXZlcnN0cmluZz0KKwljYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwlub25lKSA7OworCisJZGFyd2luKQorCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgorCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgKyAxCisJICBtaW5vcl9jdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgeGxjdmVyc3RyaW5nPSIke3dsfS1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudCAke3dsfS1jdXJyZW50X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudC4kcmV2aXNpb24iCisJICB2ZXJzdHJpbmc9Ii1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJG1pbm9yX2N1cnJlbnQgLWN1cnJlbnRfdmVyc2lvbiAkbWlub3JfY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJZnJlZWJzZC1hb3V0KQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7CisJICA7OworCisJZnJlZWJzZC1lbGYpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCisJICA7OworCisJaXJpeCB8IG5vbnN0b3B1eCkKKwkgIGlmIHRlc3QgIlgkbHRfaXJpeF9pbmNyZW1lbnQiID0gIlhubyI7IHRoZW4KKwkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIGVsc2UKKwkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UgKyAxCisJICBmaQorCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisKKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgICBub25zdG9wdXgpIHZlcnN0cmluZ19wcmVmaXg9bm9uc3RvcHV4IDs7CisJICAgICopICAgICAgICAgdmVyc3RyaW5nX3ByZWZpeD1zZ2kgOzsKKwkgIGVzYWMKKwkgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kcmV2aXNpb24KKwkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KKwkgICAgZnVuY19hcml0aCAkcmV2aXNpb24gLSAkbG9vcAorCSAgICBpZmFjZT0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgZnVuY19hcml0aCAkbG9vcCAtIDEKKwkgICAgbG9vcD0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKKwkgIGRvbmUKKworCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgorCSAgbWFqb3I9LiRtYWpvcgorCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgorCSAgOzsKKworCWxpbnV4KSAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJICBtYWpvcj0uJGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlvc2YpCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisJICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kYWdlCisJICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCisJICAgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkbG9vcAorCSAgICBpZmFjZT0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgZnVuY19hcml0aCAkbG9vcCAtIDEKKwkgICAgbG9vcD0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCisJICBkb25lCisKKwkgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KKwkgIGZ1bmNfYXBwZW5kIHZlcnN0cmluZyAiOiR7Y3VycmVudH0uMCIKKwkgIDs7CisKKwlxbngpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCisJICA7OworCisJc3Vub3MpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgorCSAgOzsKKworCXdpbmRvd3MpCisJICAjIFVzZSAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgb25lCisJICAjIGV4dGVuc2lvbiBvbiBET1MgOC4zIGZpbGVzeXN0ZW1zLgorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSItJG1ham9yIgorCSAgOzsKKworCSopCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIKKwkgIDs7CisJZXNhYworCisJIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KKwlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSAgbWFqb3I9CisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbikKKwkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCisJICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKKwkgICAgdmVyc3RyaW5nPQorCSAgICA7OworCSAgKikKKwkgICAgdmVyc3RyaW5nPSIwLjAiCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICAgIHZlcnN1ZmZpeD0KKwkgIGVsc2UKKwkgICAgdmVyc3VmZml4PSIuMC4wIgorCSAgZmkKKwlmaQorCisJIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCisJaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgIG1ham9yPQorCSAgdmVyc3VmZml4PQorCSAgdmVyc3RyaW5nPSIiCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KKwlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAidW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIKKwkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgZmkKKwllbHNlCisJICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKwlmaQorCisgICAgICBmaQorCisgICAgICBmdW5jX2dlbmVyYXRlX2Rsc3ltcyAiJGxpYm5hbWUiICIkbGlibmFtZSIgInllcyIKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkc3ltZmlsZW9iaiIKKyAgICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKyAgICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKKwkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KKwlyZW1vdmVsaXN0PQorCXRlbXByZW1vdmVsaXN0PWAkRUNITyAiJG91dHB1dF9vYmpkaXIvKiJgCisJZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbworCSAgY2FzZSAkcCBpbgorCSAgICAqLiRvYmpleHQgfCAqLmdjbm8pCisJICAgICAgIDs7CisJICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCisJICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgorCQkgaWYgJEVDSE8gIiRwIiB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKKwkJIHRoZW4KKwkJICAgY29udGludWUKKwkJIGZpCisJICAgICAgIGZpCisJICAgICAgIGZ1bmNfYXBwZW5kIHJlbW92ZWxpc3QgIiAkcCIKKwkgICAgICAgOzsKKwkgICAgKikgOzsKKwkgIGVzYWMKKwlkb25lCisJdGVzdCAtbiAiJHJlbW92ZWxpc3QiICYmIFwKKwkgIGZ1bmNfc2hvd19ldmFsICIke1JNfXIgXCRyZW1vdmVsaXN0IgorICAgICAgZmkKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgorCWZ1bmNfYXBwZW5kIG9sZGxpYnMgIiAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCisJIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgorCW9sZG9ianM9IiRvYmpzICJgJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIi9cLiR7bGliZXh0fSQvZDsgJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgICNmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworICAgICAgIwlsaWJfc2VhcmNoX3BhdGg9YCRFQ0hPICIkbGliX3NlYXJjaF9wYXRoICIgfCAkU0VEICJzJSAkcGF0aCAlICVnImAKKyAgICAgICMJZGVwbGlicz1gJEVDSE8gIiRkZXBsaWJzICIgfCAkU0VEICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgIwlkZXBlbmRlbmN5X2xpYnM9YCRFQ0hPICIkZGVwZW5kZW5jeV9saWJzICIgfCAkU0VEICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgI2RvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJdGVtcF94cnBhdGg9CisJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbworCSAgZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRsaWJkaXIiCisJICBmdW5jX2FwcGVuZCB0ZW1wX3hycGF0aCAiIC1SJGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdCIKKwkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgZXNhYworCWRvbmUKKwlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF94cnBhdGggJGRlcGVuZGVuY3lfbGlicyIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgZGxmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcyB0aGF0IHdvbid0IGJlIGRscHJlb3BlbmVkCisgICAgICBvbGRfZGxmaWxlcz0iJGRsZmlsZXMiCisgICAgICBkbGZpbGVzPQorICAgICAgZm9yIGxpYiBpbiAkb2xkX2RsZmlsZXM7IGRvCisJY2FzZSAiICRkbHByZWZpbGVzICRkbGZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcworICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbworCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqIHwgKi0qLWhhaWt1KikKKwkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICA7OworCSAgKi0qLW5ldGJzZCopCisJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICA7OworCSAgKikKKwkgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zIGlmIG5lY2Vzc2FyeS4KKwkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbmVlZF9sYyIgPSAieWVzIjsgdGhlbgorCSAgICAgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAtbGMiCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJZmkKKworCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KKwluYW1lX3NhdmU9JG5hbWUKKwlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKKwlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKKwl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4CisJbWFqb3Jfc2F2ZT0kbWFqb3IKKwkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluaworCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bworCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PworCXJlbGVhc2U9IiIKKwl2ZXJzdWZmaXg9IiIKKwltYWpvcj0iIgorCW5ld2RlcGxpYnM9CisJZHJvcHBlZGRlcHM9bm8KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCXBhc3NfYWxsKQorCSAgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCisJICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCisJICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCisJICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKKwkgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW9yLgorCSAgbmV3ZGVwbGlicz0kZGVwbGlicworCSAgOzsKKwl0ZXN0X2NvbXBpbGUpCisJICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cworCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKKwkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCisJICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KKwkgICRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QuYworCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKKwkgICRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QKKwkgIGlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRkZXBsaWJzOyB0aGVuCisJICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgY2FzZSAkaSBpbgorCSAgICAgIC1sKikKKwkJZnVuY19zdHJpcG5hbWUgLWwgJycgIiRpIgorCQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQkgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICoiICRpICIqKQorCQkgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgICAgaT0iIgorCQkgICAgOzsKKwkJICBlc2FjCisJCWZpCisJCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkJICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCAiXFwkRUNITyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcIiJgCisJCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKKwkJICBkZXBsaWJfbWF0Y2g9JDEKKwkJICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICBlY2hvCisJCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggSSBiZWxpZXZlIHlvdSBkbyBub3QgaGF2ZSIKKwkJICAgIGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIGl0IGZvciIKKwkJICAgIGVjaG8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICBmaQorCQlmaQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgIyBFcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlCisJICAgICMgdGhlIHNpdHVhdGlvbjogQ29tcGlsZSBhIHNlcGFyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgY2FzZSAkaSBpbgorCSAgICAgIC1sKikKKwkJZnVuY19zdHJpcG5hbWUgLWwgJycgIiRpIgorCQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAorCQlpZiAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaTsgdGhlbgorCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCSAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJICAgICoiICRpICIqKQorCQkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgICAgIGk9IiIKKwkJICAgICAgOzsKKwkJICAgIGVzYWMKKwkJICBmaQorCQkgIGlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkJICAgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQkgICAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAorCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKKwkJICAgIGRlcGxpYl9tYXRjaD0kMQorCQkgICAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgICBlbHNlCisJCSAgICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgICBlY2hvCisJCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKKwkJICAgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQkgICAgICBlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKKwkJICAgICAgZWNobyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgICAgZmkKKwkJICBmaQorCQllbHNlCisJCSAgZHJvcHBlZGRlcHM9eWVzCisJCSAgZWNobworCQkgICRFQ0hPICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCisJCSAgZWNobyAiKioqIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgorCQkgIGVjaG8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCisJCSAgZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKKwkJZmkKKwkJOzsKKwkgICAgICAqKQorCQlmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaQorCSAgOzsKKwlmaWxlX21hZ2ljKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIGNhc2UgJGFfZGVwbGliIGluCisJICAgIC1sKikKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgorCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkgIGFfZGVwbGliPSIiCisJCSAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCWlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX2dsb2IiOyB0aGVuCisJCSAgbGlibmFtZWdsb2I9YGZ1bmNfZWNob19hbGwgIiRsaWJuYW1lIiB8ICRTRUQgLWUgJGZpbGVfbWFnaWNfZ2xvYmAKKwkJZWxzZQorCQkgIGxpYm5hbWVnbG9iPSRsaWJuYW1lCisJCWZpCisJCXRlc3QgIiR3YW50X25vY2FzZWdsb2IiID0geWVzICYmIG5vY2FzZWdsb2I9YHNob3B0IC1wIG5vY2FzZWdsb2JgCisJCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCQkgIGlmIHRlc3QgIiR3YW50X25vY2FzZWdsb2IiID0geWVzOyB0aGVuCisJCSAgICBzaG9wdCAtcyBub2Nhc2VnbG9iCisJCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVnbG9iWy4tXSogMj4vZGV2L251bGxgCisJCSAgICAkbm9jYXNlZ2xvYgorCQkgIGVsc2UKKwkJICAgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZWdsb2JbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmaQorCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KKwkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIHwKKwkJCSAkR1JFUCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgorCQkJY29udGludWUKKwkJICAgICAgZmkKKwkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCisJCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KKwkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluaworCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCisJCSAgICAgICMgYnV0IHNvIHdoYXQ/CisJCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCisJCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbworCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAorCQkJY2FzZSAkcG90bGlibGluayBpbgorCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7CisJCQkqKSBwb3RsaWI9YCRFQ0hPICIkcG90bGliIiB8ICRTRUQgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OworCQkJZXNhYworCQkgICAgICBkb25lCisJCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCB8CisJCQkgJFNFRCAtZSAxMHEgfAorCQkJICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCQlmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgorCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciBmaWxlIG1hZ2ljIHRlc3QpIgorCQllbHNlCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCisJCSAgJEVDSE8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgorCQlmaQorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbWF0Y2hfcGF0dGVybiopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAorCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBjYXNlICRhX2RlcGxpYiBpbgorCSAgICAtbCopCisJICAgICAgZnVuY19zdHJpcG5hbWUgLWwgJycgIiRhX2RlcGxpYiIKKwkgICAgICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkqIiAkYV9kZXBsaWIgIiopCisJCSAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAorCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiJHBvdGVudF9saWJcIiIgMj4vZGV2L251bGwgfCAkU0VEIDEwcSB8IFwKKwkJICAgICAgICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCSAgICAgIGFfZGVwbGliPSIiCisJCSAgICAgIGJyZWFrIDIKKwkJICAgIGZpCisJCSAgZG9uZQorCQlkb25lCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlkcm9wcGVkZGVwcz15ZXMKKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKKwkJZWxzZQorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRFQ0hPICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW5vbmUgfCB1bmtub3duIHwgKikKKwkgIG5ld2RlcGxpYnM9IiIKKwkgIHRtcF9kZXBsaWJzPWAkRUNITyAiICRkZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyQvLzsgcy8gLVtMUl1bXiBdKi8vZydgCisJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCisJICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJworCSAgICAgIHRtcF9kZXBsaWJzPWAkRUNITyAiICR0bXBfZGVwbGlicyIgfCAkU0VEICJzLCRpLCwiYAorCSAgICBkb25lCisJICBmaQorCSAgY2FzZSAkdG1wX2RlcGxpYnMgaW4KKwkgICpbIVwJXCBdKikKKwkgICAgZWNobworCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgorCSAgICBmaQorCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKKwkgICAgZHJvcHBlZGRlcHM9eWVzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSB3aXRoIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICBuZXdkZXBsaWJzPWAkRUNITyAiICRuZXdkZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgZWNobworCSAgICBlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKKwkgICAgJEVDSE8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgorCSAgICBlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyIKKwkgICAgZWNobyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgICAgIGVjaG8KKwkgICAgICBlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKKwkgICAgICBlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCSAgICAgIGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkgICAgICBlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJICAgICAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJICAgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgIGVsc2UKKwkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKKwkgICAgZWNobyAiKioqIG9yIGlzIGRlY2xhcmVkIHRvIC1kbG9wZW4gaXQuIgorCisJICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0gbm87IHRoZW4KKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKKwkgICAgICBlY2hvICIqKiogYmVjYXVzZSBlaXRoZXIgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlbSBvciIKKwkgICAgICBlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCWZpCisJIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCisJZGVwbGlicz0kbmV3ZGVwbGlicworICAgICAgZmkKKyAgICAgICMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKKyAgICAgIGNhc2UgJGhvc3QgaW4KKwkqLSotZGFyd2luKikKKwkgIG5ld2RlcGxpYnM9YCRFQ0hPICIgJG5ld2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPWAkRUNITyAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCSAgZGVwbGlicz1gJEVDSE8gIiAkZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCSAgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRkZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJY2FzZSAkZGVwbGliIGluCisJLUwqKQorCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCisJICAqIiAkZGVwbGliICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OworCSAgZXNhYworCSAgOzsKKwkqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZGVwbGlicz0iJG5ld19saWJzIgorCisgICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCisgICAgICBsaWJyYXJ5X25hbWVzPQorICAgICAgb2xkX2xpYnJhcnk9CisgICAgICBkbG5hbWU9CisKKyAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJIyBSZW1vdmUgJHt3bH0gaW5zdGFuY2VzIHdoZW4gbGlua2luZyB3aXRoIGxkLgorCSMgRklYTUU6IHNob3VsZCB0ZXN0IHRoZSByaWdodCBfY21kcyB2YXJpYWJsZS4KKwljYXNlICRhcmNoaXZlX2NtZHMgaW4KKwkgICpcJExEXCAqKSB3bD0gOzsKKyAgICAgICAgZXNhYworCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKKwkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRsaWJkaXIiCisJCWxpYmRpcj0kZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0CisJCWlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJCWVsc2UKKwkJICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJCSAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkJICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCSAgICA7OworCQkgICopCisJCSAgICBmdW5jX2FwcGVuZCBoYXJkY29kZV9saWJkaXJzICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZnVuY19hcHBlbmQgZGVwX3JwYXRoICIgJGZsYWciCisJICAgICAgZmkKKwkgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGV2YWwgImRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIiCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgICAgcnBhdGg9CisJICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgICBkb25lCisJICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgorCSAgZmkKKwkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCisJZmkKKworCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKKwl0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCisJaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KKwkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKwlmaQorCisJIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwlzaGlmdAorCXJlYWxuYW1lPSIkMSIKKwlzaGlmdAorCisJaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCWVsc2UKKwkgIHNvbmFtZT0iJHJlYWxuYW1lIgorCWZpCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgIGRsbmFtZT0kc29uYW1lCisJZmkKKworCWxpYj0iJG91dHB1dF9vYmpkaXIvJHJlYWxuYW1lIgorCWxpbmtuYW1lcz0KKwlmb3IgbGluaworCWRvCisJICBmdW5jX2FwcGVuZCBsaW5rbmFtZXMgIiAkbGluayIKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwl0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCisJZGVsZmlsZXM9CisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgJG9wdF9kcnlfcnVuIHx8IGNwICIkZXhwb3J0X3N5bWJvbHMiICIkb3V0cHV0X29iamRpci8kbGlibmFtZS51ZXhwIgorCSAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRleHBvcnRfc3ltYm9scyIKKwlmaQorCisJb3JpZ19leHBvcnRfc3ltYm9scz0KKwljYXNlICRob3N0X29zIGluCisJY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAjIGV4cG9ydGluZyB1c2luZyB1c2VyIHN1cHBsaWVkIHN5bWZpbGUKKwkgICAgaWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiICE9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgIyBhbmQgaXQncyBOT1QgYWxyZWFkeSBhIC5kZWYgZmlsZS4gTXVzdCBmaWd1cmUgb3V0CisJICAgICAgIyB3aGljaCBvZiB0aGUgZ2l2ZW4gc3ltYm9scyBhcmUgZGF0YSBzeW1ib2xzIGFuZCB0YWcKKwkgICAgICAjIHRoZW0gYXMgc3VjaC4gU28sIHRyaWdnZXIgdXNlIG9mIGV4cG9ydF9zeW1ib2xzX2NtZHMuCisJICAgICAgIyBleHBvcnRfc3ltYm9scyBnZXRzIHJlYXNzaWduZWQgaW5zaWRlIHRoZSAicHJlcGFyZQorCSAgICAgICMgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scyIgaWYgc3RhdGVtZW50LCBzbyB0aGUKKwkgICAgICAjIGluY2x1ZGVfZXhwc3ltcyBsb2dpYyBzdGlsbCB3b3Jrcy4KKwkgICAgICBvcmlnX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICAgICAgZXhwb3J0X3N5bWJvbHM9CisJICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCSAgICBmaQorCSAgZmkKKwkgIDs7CisJZXNhYworCisJIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCisJICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCisJICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQxIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICMgVGFrZSB0aGUgbm9ybWFsIGJyYW5jaCBpZiB0aGUgbm1fZmlsZV9saXN0X3NwZWMgYnJhbmNoCisJICAgICAgIyBkb2Vzbid0IHdvcmsgb3IgaWYgdG9vbCBjb252ZXJzaW9uIGlzIG5vdCBuZWVkZWQuCisJICAgICAgY2FzZSAkbm1fZmlsZV9saXN0X3NwZWN+JHRvX3Rvb2xfZmlsZV9jbWQgaW4KKwkJKn5mdW5jX2NvbnZlcnRfZmlsZV9ub29wIHwgKn5mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMiB8IH4qKQorCQkgIHRyeV9ub3JtYWxfYnJhbmNoPXllcworCQkgIGV2YWwgY21kPVwiJGNtZDFcIgorCQkgIGZ1bmNfbGVuICIgJGNtZCIKKwkJICBsZW49JGZ1bmNfbGVuX3Jlc3VsdAorCQkgIDs7CisJCSopCisJCSAgdHJ5X25vcm1hbF9icmFuY2g9bm8KKwkJICA7OworCSAgICAgIGVzYWMKKwkgICAgICBpZiB0ZXN0ICIkdHJ5X25vcm1hbF9icmFuY2giID0geWVzIFwKKwkJICYmIHsgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIFwKKwkJICAgICAgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IH0KKwkgICAgICB0aGVuCisJCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKKwkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKKwkgICAgICBlbGlmIHRlc3QgLW4gIiRubV9maWxlX2xpc3Rfc3BlYyI7IHRoZW4KKwkJZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKwkJb3V0cHV0X2xhPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCQlzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkJc2F2ZV9vdXRwdXQ9JG91dHB1dAorCQlvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubm0KKwkJZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJCWxpYm9ianM9JG5tX2ZpbGVfbGlzdF9zcGVjJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCQlmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRvdXRwdXQiCisJCWZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJE5NIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkJZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzOyBkbworCQkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2JqIgorCQkgICRFQ0hPICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IgorCQlkb25lID4gIiRvdXRwdXQiCisJCWV2YWwgY21kPVwiJGNtZDFcIgorCQlmdW5jX3Nob3dfZXZhbCAiJGNtZCIgJ2V4aXQgJD8nCisJCW91dHB1dD0kc2F2ZV9vdXRwdXQKKwkJbGlib2Jqcz0kc2F2ZV9saWJvYmpzCisJCXNraXBwZWRfZXhwb3J0PWZhbHNlCisJICAgICAgZWxzZQorCQkjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KKwkJZnVuY192ZXJib3NlICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKKwkJc2tpcHBlZF9leHBvcnQ9OgorCQkjIEJyZWFrIG91dCBlYXJseSwgb3RoZXJ3aXNlIHNraXBwZWRfZXhwb3J0IG1heSBiZQorCQkjIHNldCB0byBmYWxzZSBieSBhIGxhdGVyIGJ1dCBzaG9ydGVyIGNtZC4KKwkJYnJlYWsKKwkgICAgICBmaQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgIHRtcF9leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgorCSAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICMgVGhlIGdpdmVuIGV4cG9ydHNfc3ltYm9scyBmaWxlIGhhcyB0byBiZSBmaWx0ZXJlZCwgc28gZmlsdGVyIGl0LgorCSAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgIyAncycgY29tbWFuZHMgd2hpY2ggbm90IGFsbCBzZWRzIGNhbiBoYW5kbGUuIEdOVSBzZWQgc2hvdWxkIGJlIGZpbmUKKwkgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICMgaXNuJ3QgYSBibGVzc2VkIHRvb2wuCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgorCSAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwlmaQorCisJdG1wX2RlcGxpYnM9CisJZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCisJICAqIiAkdGVzdF9kZXBsaWIgIiopIDs7CisJICAqKQorCSAgICBmdW5jX2FwcGVuZCB0bXBfZGVwbGlicyAiICR0ZXN0X2RlcGxpYiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorCisJaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiAmJgorCSAgICB0ZXN0ICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiA9IHllcyAmJgorCSAgICB0ZXN0IC16ICIkbGlib2JqcyI7IHRoZW4KKwkgICAgIyBleHRyYWN0IHRoZSBhcmNoaXZlcywgc28gd2UgaGF2ZSBvYmplY3RzIHRvIGxpc3QuCisJICAgICMgVE9ETzogY291bGQgb3B0aW1pemUgdGhpcyB0byBqdXN0IGV4dHJhY3Qgb25lIGFyY2hpdmUuCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZWxzZQorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKKwkgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiICRmbGFnIgorCWZpCisKKwkjIE1ha2UgYSBiYWNrdXAgb2YgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgd2hlbiByZWxpbmtpbmcKKwlpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVUgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/CisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgIGVsc2UKKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgZmkKKwllbHNlCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKKwkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYKKwkgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiICYmCisJICAgbGVuPSRmdW5jX2xlbl9yZXN1bHQgJiYKKwkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIDoKKwllbHNlCisJICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UKKwkgICMgb3IsIGlmIHVzaW5nIEdOVSBsZCBhbmQgc2tpcHBlZF9leHBvcnQgaXMgbm90IDosIHVzZSBhIGxpbmtlcgorCSAgIyBzY3JpcHQuCisKKwkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCisJICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKKwkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKKwkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0CisJICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgorCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQorCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZworCSAgIyB0aGUgc3BlYy4KKwkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgIGZpCisJICBzYXZlX291dHB1dD0kb3V0cHV0CisJICBmdW5jX2Jhc2VuYW1lICIkb3V0cHV0IgorCSAgb3V0cHV0X2xhPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCisJICAjIENsZWFyIHRoZSByZWxvYWRhYmxlIG9iamVjdCBjcmVhdGlvbiBjb21tYW5kIHF1ZXVlIGFuZAorCSAgIyBpbml0aWFsaXplIGsgdG8gb25lLgorCSAgdGVzdF9jbWRzPQorCSAgY29uY2F0X2NtZHM9CisJICBvYmpsaXN0PQorCSAgbGFzdF9yb2JqPQorCSAgaz0xCisKKwkgIGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rc2NyaXB0CisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgR05VIGxkIHNjcmlwdDogJG91dHB1dCIKKwkgICAgZWNobyAnSU5QVVQgKCcgPiAkb3V0cHV0CisJICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcworCSAgICBkbworCSAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2JqIgorCSAgICAgICRFQ0hPICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiA+PiAkb3V0cHV0CisJICAgIGRvbmUKKwkgICAgZWNobyAnKScgPj4gJG91dHB1dAorCSAgICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRvdXRwdXQiCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgICBvdXRwdXQ9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCSAgZWxpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIlgkZmlsZV9saXN0X3NwZWMiICE9IFg7IHRoZW4KKwkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9LmxuaworCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIGxpbmtlciBpbnB1dCBmaWxlIGxpc3Q6ICRvdXRwdXQiCisJICAgIDogPiAkb3V0cHV0CisJICAgIHNldCB4ICRzYXZlX2xpYm9ianMKKwkgICAgc2hpZnQKKwkgICAgZmlyc3RvYmo9CisJICAgIGlmIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzOyB0aGVuCisJICAgICAgZmlyc3RvYmo9IiQxICIKKwkgICAgICBzaGlmdAorCSAgICBmaQorCSAgICBmb3Igb2JqCisJICAgIGRvCisJICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRvdXRwdXQiCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgICBvdXRwdXQ9JGZpcnN0b2JqXCIkZmlsZV9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIKKwkgIGVsc2UKKwkgICAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyI7IHRoZW4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLi4uIgorCSAgICAgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCSAgICAgIGV2YWwgdGVzdF9jbWRzPVwiJHJlbG9hZF9jbWRzXCIKKwkgICAgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiCisJICAgICAgbGVuMD0kZnVuY19sZW5fcmVzdWx0CisJICAgICAgbGVuPSRsZW4wCisKKwkgICAgICAjIExvb3Agb3ZlciB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGxpbmtlZC4KKwkgICAgICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKKwkgICAgICBkbworCQlmdW5jX2xlbiAiICRvYmoiCisJCWZ1bmNfYXJpdGggJGxlbiArICRmdW5jX2xlbl9yZXN1bHQKKwkJbGVuPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQlpZiB0ZXN0ICJYJG9iamxpc3QiID0gWCB8fAorCQkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkJICBmdW5jX2FwcGVuZCBvYmpsaXN0ICIgJG9iaiIKKwkJZWxzZQorCQkgICMgVGhlIGNvbW1hbmQgJHRlc3RfY21kcyBpcyBhbG1vc3QgdG9vIGxvbmcsIGFkZCBhCisJCSAgIyBjb21tYW5kIHRvIHRoZSBxdWV1ZS4KKwkJICBpZiB0ZXN0ICIkayIgLWVxIDEgOyB0aGVuCisJCSAgICAjIFRoZSBmaXJzdCBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgdG8gYWRkLgorCQkgICAgcmVsb2FkX29ianM9JG9iamxpc3QKKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgorCQkgIGVsc2UKKwkJICAgICMgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMgd2lsbCBsaW5rIGluCisJCSAgICAjIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgorCQkgICAgcmVsb2FkX29ianM9IiRvYmpsaXN0ICRsYXN0X3JvYmoiCisJCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kcmVsb2FkX2NtZHN+XCRSTSAkbGFzdF9yb2JqXCIKKwkJICBmaQorCQkgIGxhc3Rfcm9iaj0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIGZ1bmNfYXJpdGggJGsgKyAxCisJCSAgaz0kZnVuY19hcml0aF9yZXN1bHQKKwkJICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkJICBvYmpsaXN0PSIgJG9iaiIKKwkJICBmdW5jX2xlbiAiICRsYXN0X3JvYmoiCisJCSAgZnVuY19hcml0aCAkbGVuMCArICRmdW5jX2xlbl9yZXN1bHQKKwkJICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJCWZpCisJICAgICAgZG9uZQorCSAgICAgICMgSGFuZGxlIHRoZSByZW1haW5pbmcgb2JqZWN0cyBieSBjcmVhdGluZyBvbmUgbGFzdAorCSAgICAgICMgcmVsb2FkYWJsZSBvYmplY3QgZmlsZS4gIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0CisJICAgICAgIyBmaWxlcyB3aWxsIGxpbmsgaW4gdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgcmVsb2FkX29ianM9IiRvYmpsaXN0ICRsYXN0X3JvYmoiCisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kc1wiCisJICAgICAgaWYgdGVzdCAtbiAiJGxhc3Rfcm9iaiI7IHRoZW4KKwkgICAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc31+XCRSTSAkbGFzdF9yb2JqXCIKKwkgICAgICBmaQorCSAgICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKworCSAgICBlbHNlCisJICAgICAgb3V0cHV0PQorCSAgICBmaQorCisJICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCisJICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgorCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgbGlib2Jqcz0kb3V0cHV0CisJICAgICAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBleHBvcnQgZmlsZS4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kcyRleHBvcnRfc3ltYm9sc19jbWRzXCIKKwkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgorCQlldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc35cJFJNICRsYXN0X3JvYmpcIgorCSAgICAgIGZpCisJICAgIGZpCisKKwkgICAgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYKKwkgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIGEgdGVtcG9yYXJ5IHJlbG9hZGFibGUgb2JqZWN0IGZpbGU6ICRvdXRwdXQiCisKKwkgICAgIyBMb29wIHRocm91Z2ggdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBhYm92ZSBhbmQgZXhlY3V0ZSB0aGVtLgorCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY29uY2F0X2NtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgJG9wdF9zaWxlbnQgfHwgeworCQkgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKKwkJICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisJICAgICAgfQorCSAgICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kIiB8fCB7CisJCWx0X2V4aXQ9JD8KKworCQkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKKwkJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgdGhlbgorCQkgICggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiBcCisJCSAgICAkUk0gIiR7cmVhbG5hbWV9VCIgJiYgXAorCQkgICAgJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkJZmkKKworCQlleGl0ICRsdF9leGl0CisJICAgICAgfQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisKKyAgICAgICAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICAgICAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICIkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgICAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICAgICAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAgICAgIyBGSVhNRTogJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIHBvdGVudGlhbGx5IGNvbnRhaW5zIGxvdHMgb2YKKwkgICAgICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgICAgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgICAgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5CisJICAgICAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgICAgICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCisJICAgICAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwkgICAgZmkKKwkgIGZpCisKKwkgIGxpYm9ianM9JG91dHB1dAorCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCisJICBvdXRwdXQ9JHNhdmVfb3V0cHV0CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQorCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCisKKwkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgICAgZWxzZQorCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICAgIGZpCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kYXJjaGl2ZV9jbWRzCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZGVsZmlsZXMiOyB0aGVuCisJICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIHRvICRjbWRzLgorCSAgZXZhbCBjbWRzPVwiXCRjbWRzflwkUk0gJGRlbGZpbGVzXCIKKwlmaQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKworCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGRscHJlZmlsZXMKKwkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJZmkKKworCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGV2YWwgY21kPVwiJGNtZFwiCisJICAkb3B0X3NpbGVudCB8fCB7CisJICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKKwkgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgfQorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkgICAgbHRfZXhpdD0kPworCisJICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICBpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJICAgICAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKKwkgICAgICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCisJCSRNViAiJHtyZWFsbmFtZX1VIiAiJHJlYWxuYW1lIiApCisJICAgIGZpCisKKwkgICAgZXhpdCAkbHRfZXhpdAorCSAgfQorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKworCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VCAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkTVYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgICAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCisJICAgIGZpCisJICBmaQorCisJICBleGl0ICRFWElUX1NVQ0NFU1MKKwlmaQorCisJIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KKwlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KKwkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KKwkgICAgZnVuY19zaG93X2V2YWwgJyhjZCAiJG91dHB1dF9vYmpkaXIiICYmICRSTSAiJGxpbmtuYW1lIiAmJiAkTE5fUyAiJHJlYWxuYW1lIiAiJGxpbmtuYW1lIiknICdleGl0ICQ/JworCSAgZmkKKwlkb25lCisKKwkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KKwkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgorCSAgZGxuYW1lPSIkc29uYW1lIgorCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9iaikKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisgICAgICBmaQorCisgICAgICBjYXNlICIgJGRlcGxpYnMiIGluCisgICAgICAqXCAtbCogfCAqXCAtTCopCisJZnVuY193YXJuaW5nICJcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIG9iamVjdHMiIDs7CisgICAgICBlc2FjCisKKyAgICAgIHRlc3QgLW4gIiRycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgY2FzZSAkb3V0cHV0IGluCisgICAgICAqLmxvKQorCXRlc3QgLW4gIiRvYmpzJG9sZF9kZXBsaWJzIiAmJiBcCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiCisKKwlsaWJvYmo9JG91dHB1dAorCWZ1bmNfbG8ybyAiJGxpYm9iaiIKKwlvYmo9JGZ1bmNfbG8yb19yZXN1bHQKKwk7OworICAgICAgKikKKwlsaWJvYmo9CisJb2JqPSIkb3V0cHV0IgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJG9iaiAkbGlib2JqCisKKyAgICAgICMgT2JqZWN0cyBmcm9tIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFRoaXMgYXNzdW1lcworICAgICAgIyBzaW5nbGUtdmVyc2lvbiBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBXaGVuZXZlciB3ZSBjcmVhdGUKKyAgICAgICMgZGlmZmVyZW50IG9uZXMgZm9yIFBJQy9ub24tUElDLCB0aGlzIHdlJ2xsIGhhdmUgdG8gZHVwbGljYXRlCisgICAgICAjIHRoZSBleHRyYWN0aW9uLgorICAgICAgcmVsb2FkX2NvbnZfb2Jqcz0KKyAgICAgIGdlbnRvcD0KKyAgICAgICMgcmVsb2FkX2NtZHMgcnVucyAkTEQgZGlyZWN0bHksIHNvIGxldCB1cyBnZXQgcmlkIG9mCisgICAgICAjIC1XbCBmcm9tIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGFuZCBob3BlIHdlIGNhbiBnZXQgYnkgd2l0aAorICAgICAgIyB0dXJuaW5nIGNvbW1hIGludG8gc3BhY2UuLgorICAgICAgd2w9CisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzPVwiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgIHJlbG9hZF9jb252X29ianM9JHJlbG9hZF9vYmpzXCBgJEVDSE8gIiR0bXBfd2hvbGVfYXJjaGl2ZV9mbGFncyIgfCAkU0VEICdzfCx8IHxnJ2AKKwllbHNlCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b2JqfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgYnVpbGRpbmcgc2hhcmVkLCB3ZSBuZWVkIHRvIHVzZSBub25fcGljX29ianMKKyAgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBsaWJvYmpzPSIkbm9uX3BpY19vYmplY3RzIgorCisgICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKyAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRFQ0hPICIkbGlib2JqcyIgfCAkU1AyTkwgfCAkU0VEICIvXC4ke2xpYmV4dH0kL2Q7IC9cLmxpYiQvZDsgJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCisgICAgICBvdXRwdXQ9IiRvYmoiCisgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJHJlbG9hZF9jbWRzIiAnZXhpdCAkPycKKworICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCisgICAgICBpZiB0ZXN0IC16ICIkbGlib2JqIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCisJZmkKKworCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0CisJIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKwkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJIyAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/CisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgorCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCisJcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgorCW91dHB1dD0iJGxpYm9iaiIKKwlmdW5jX2V4ZWN1dGVfY21kcyAiJHJlbG9hZF9jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCisgICAgICBmaQorCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisKKyAgICBwcm9nKQorICAgICAgY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qKSBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXQiCisJICAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0LmV4ZTs7CisgICAgICBlc2FjCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAiJHByZWxvYWQiID0geWVzIFwKKyAgICAgICAgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duIFwKKwkmJiB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd24gJiYgXAorCSAgZnVuY193YXJuaW5nICJcYExUX0lOSVQoW2Rsb3Blbl0pJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgorCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwljb21waWxlX2RlcGxpYnM9YCRFQ0hPICIgJGNvbXBpbGVfZGVwbGlicyIgfCAkU0VEICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJZmluYWxpemVfZGVwbGlicz1gJEVDSE8gIiAkZmluYWxpemVfZGVwbGlicyIgfCAkU0VEICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLWRhcndpbiopCisJIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycworCSMgQnV0IGlzIHN1cHBvc2VkbHkgZml4ZWQgb24gMTAuNCBvciBsYXRlciAoeWF5ISkuCisJaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorCSAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSBpbgorCSAgICAxMC5bMDEyM10pCisJICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHt3bH0tYmluZF9hdF9sb2FkIgorCSAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgIDs7CisJICBlc2FjCisJZmkKKwkjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisJY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiICRjb21waWxlX2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJOzsKKyAgICAgIGVzYWMKKworCisgICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKKyAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0CisgICAgICBuZXdfbGlicz0KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJY2FzZSAiICRuZXdfbGlicyAiIGluCisJKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OworCSopCisJICBjYXNlICIgJGNvbXBpbGVfZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRjb21waWxlX2RlcGxpYnM7IGRvCisJY2FzZSAkZGVwbGliIGluCisJLUwqKQorCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCisJICAqIiAkZGVwbGliICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OworCSAgZXNhYworCSAgOzsKKwkqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2xpYnMiCisKKworICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGNvbXBpbGVfZGVwbGlicyIKKyAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkZmluYWxpemVfZGVwbGlicyIKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KKwkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KKwkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgZXNhYworCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKwkgIHRlc3RiaW5kaXI9YCR7RUNIT30gIiRsaWJkaXIiIHwgJHtTRUR9IC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGxpYmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRsaWJkaXI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiRsaWJkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQlmdW5jX2FwcGVuZCBoYXJkY29kZV9saWJkaXJzICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCTs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZWxzZQorCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIGZ1bmNfYXBwZW5kIHJwYXRoICIgJGZsYWciCisJICBmaQorCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3Blcm1fcnBhdGggIiAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKKworICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCisJY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkU0VEICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkb3V0cHV0bmFtZSIgIkBQUk9HUkFNQCIgIm5vIgorCisgICAgICAjIHRlbXBsYXRlIHByZWxpbmtpbmcgc3RlcAorICAgICAgaWYgdGVzdCAtbiAiJHByZWxpbmtfY21kcyI7IHRoZW4KKwlmdW5jX2V4ZWN1dGVfY21kcyAiJHByZWxpbmtfY21kcyIgJ2V4aXQgJD8nCisgICAgICBmaQorCisgICAgICB3cmFwcGVyc19yZXF1aXJlZD15ZXMKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICpjZWdjYyogfCAqbWluZ3czMmNlKikKKyAgICAgICAgIyBEaXNhYmxlIHdyYXBwZXJzIGZvciBjZWdjYyBhbmQgbWluZ3czMmNlIGhvc3RzLCB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIGFueXdheS4KKyAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgOzsKKyAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCisgICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgIiR3cmFwcGVyc19yZXF1aXJlZCIgPSBubzsgdGhlbgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisKKwkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KKwlleGl0X3N0YXR1cz0wCisJZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0X3N0YXR1cz0kPycKKworCWlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICBwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RsaW5rX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorCWlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICckUk0gIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSInCisJZmkKKworCWV4aXQgJGV4aXRfc3RhdHVzCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCisgICAgICBmaQorCisgICAgICBjb21waWxlX3Zhcj0KKyAgICAgIGZpbmFsaXplX3Zhcj0KKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgIGZ1bmNfYXBwZW5kIHJwYXRoICIkZGlyOiIKKwkgIGRvbmUKKwkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgZG9uZQorCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5vX2luc3RhbGwiID0geWVzOyB0aGVuCisJIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc2NyaXB0LgorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwlsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKKwkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisKKwlpZiB0ZXN0IC1uICIkcG9zdGxpbmtfY21kcyI7IHRoZW4KKwkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgcG9zdGxpbmtfY21kcz1gZnVuY19lY2hvX2FsbCAiJHBvc3RsaW5rX2NtZHMiIHwgJFNFRCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJyAtZSAncyVAVE9PTF9PVVRQVVRAJSciJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCInJWcnYAorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKwlmaQorCisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwlmdW5jX3dhcm5pbmcgInRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIgorCWZ1bmNfd2FybmluZyAiXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkU0VEICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCisJICBlbHNlCisJICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcworCSAgICByZWxpbmtfY29tbWFuZD0KKwkgIGZpCisJZWxzZQorCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCWZpCisgICAgICBmaQorCisgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisgICAgICBsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAorCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQorCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCWZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSIKKwlwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJyAtZSAncyVAVE9PTF9PVVRQVVRAJSciJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCInJWcnYAorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGxpbmtfY21kcyIgJ2V4aXQgJD8nCisgICAgICBmaQorCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBmaQorCWRvbmUKKwlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgorCXJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZmkKKworICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBub3QgaW4gZHJ5IHJ1biBtb2RlLgorICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKKwkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgorCWNhc2UgJG91dHB1dCBpbgorCSAgKi5leGUpIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICBvdXRwdXQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworCWVzYWMKKwkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKKwljYXNlICRob3N0IGluCisJICAqY3lnd2luKikKKwkgICAgZXhlZXh0PS5leGUKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0bmFtZSIKKwkgICAgb3V0cHV0bmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJICAqKSBleGVleHQ9IDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiApCisJICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvdXRwdXQiICIiICIuIgorCSAgICBvdXRwdXRfbmFtZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKKwkgICAgb3V0cHV0X3BhdGg9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKwkgICAgY3dyYXBwZXJzb3VyY2U9IiRvdXRwdXRfcGF0aC8kb2JqZGlyL2x0LSRvdXRwdXRfbmFtZS5jIgorCSAgICBjd3JhcHBlcj0iJG91dHB1dF9wYXRoLyRvdXRwdXRfbmFtZS5leGUiCisJICAgICRSTSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyCisJICAgIHRyYXAgIiRSTSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyOyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQorCisJICAgIGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMgPiAkY3dyYXBwZXJzb3VyY2UKKworCSAgICAjIFRoZSB3cmFwcGVyIGV4ZWN1dGFibGUgaXMgYnVpbHQgdXNpbmcgdGhlICRob3N0IGNvbXBpbGVyLAorCSAgICAjIGJlY2F1c2UgaXQgY29udGFpbnMgJGhvc3QgcGF0aHMgYW5kIGZpbGVzLiBJZiBjcm9zcy0KKwkgICAgIyBjb21waWxpbmcsIGl0LCBsaWtlIHRoZSB0YXJnZXQgZXhlY3V0YWJsZSwgbXVzdCBiZQorCSAgICAjIGV4ZWN1dGVkIG9uIHRoZSAkaG9zdCBvciB1bmRlciBhbiBlbXVsYXRpb24gZW52aXJvbm1lbnQuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1vICRjd3JhcHBlciAkY3dyYXBwZXJzb3VyY2UKKwkgICAgICAkU1RSSVAgJGN3cmFwcGVyCisJICAgIH0KKworCSAgICAjIE5vdywgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdCBmb3IgZnVuY19zb3VyY2UgdXNlOgorCSAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICRjd3JhcHBlcgorCSAgICAkUk0gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgIHRyYXAgIiRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgIyBub3RlOiB0aGlzIHNjcmlwdCB3aWxsIG5vdCBiZSBleGVjdXRlZCwgc28gZG8gbm90IGNobW9kLgorCSAgICAgIGlmIHRlc3QgIngkYnVpbGQiID0gIngkaG9zdCIgOyB0aGVuCisJCSRjd3JhcHBlciAtLWx0LWR1bXAtc2NyaXB0ID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZWxzZQorCQlmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIGZpCisJICAgIH0KKwkgIDs7CisJICAqICkKKwkgICAgJFJNICRvdXRwdXQKKwkgICAgdHJhcCAiJFJNICRvdXRwdXQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X3dyYXBwZXIgbm8gPiAkb3V0cHV0CisJICAgIGNobW9kICt4ICRvdXRwdXQKKwkgIDs7CisJZXNhYworICAgICAgfQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgorICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KKwlvbGRvYmpzPSIkbGlib2Jqc19zYXZlICRzeW1maWxlb2JqIgorCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgorCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWVsc2UKKwkgIG9sZG9ianM9IiRvbGRfZGVwbGlicyAkbm9uX3BpY19vYmplY3RzIgorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzICYmIHRlc3QgLWYgIiRzeW1maWxlb2JqIjsgdGhlbgorCSAgICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJHN5bWZpbGVvYmoiCisJICBmaQorCWZpCisJYWRkbGlicz0iJG9sZF9jb252ZW5pZW5jZSIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRhZGRsaWJzIjsgdGhlbgorCWdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKworCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCisJZnVuY19hcHBlbmQgb2xkb2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwljbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisgICAgICBlbHNlCisKKwkjIEFkZCBhbnkgb2JqZWN0cyBmcm9tIHByZWxvYWRlZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwlpZiB0ZXN0IC1uICIkZGxwcmVmaWxlcyI7IHRoZW4KKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcworCSAgZnVuY19hcHBlbmQgb2xkb2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCWZpCisKKwkjIFBPU0lYIGRlbWFuZHMgbm8gcGF0aHMgdG8gYmUgZW5jb2RlZCBpbiBhcmNoaXZlcy4gIFdlIGhhdmUKKwkjIHRvIGF2b2lkIGNyZWF0aW5nIGFyY2hpdmVzIHdpdGggZHVwbGljYXRlIGJhc2VuYW1lcyBpZiB3ZQorCSMgbWlnaHQgaGF2ZSB0byBleHRyYWN0IHRoZW0gYWZ0ZXJ3YXJkcywgZS5nLiwgd2hlbiBjcmVhdGluZyBhCisJIyBzdGF0aWMgYXJjaGl2ZSBvdXQgb2YgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvciB3aGVuIGxpbmtpbmcKKwkjIHRoZSBlbnRpcmV0eSBvZiBhIGxpYnRvb2wgYXJjaGl2ZSBpbnRvIGFub3RoZXIgKGN1cnJlbnRseQorCSMgbm90IHN1cHBvcnRlZCBieSBsaWJ0b29sKS4KKwlpZiAoZm9yIG9iaiBpbiAkb2xkb2JqcworCSAgICBkbworCSAgICAgIGZ1bmNfYmFzZW5hbWUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgZG9uZSB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisJICA6CisJZWxzZQorCSAgZWNobyAiY29weWluZyBzZWxlY3RlZCBvYmplY3QgZmlsZXMgdG8gYXZvaWQgYmFzZW5hbWUgY29uZmxpY3RzLi4uIgorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisJICBmdW5jX21rZGlyX3AgIiRnZW50b3AiCisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICBjb3VudGVyPTEKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgb2JqYmFzZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgorCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OworCSAgICAqW1wgL10iJG9iamJhc2UgIiopCisJICAgICAgd2hpbGUgOjsgZG8KKwkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KKwkJIyBvdmVybGFwcy4KKwkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKKwkJZnVuY19hcml0aCAkY291bnRlciArIDEKKwkJY291bnRlcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJY2FzZSAiICRvbGRvYmpzICIgaW4KKwkJKltcIC9dIiRuZXdvYmogIiopIDs7CisJCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKKwkJZXNhYworCSAgICAgIGRvbmUKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgZnVuY19hcHBlbmQgb2xkb2JqcyAiICRnZW50b3AvJG5ld29iaiIKKwkgICAgICA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJG9iaiIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJZnVuY190b190b29sX2ZpbGUgIiRvbGRsaWIiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJdG9vbF9vbGRsaWI9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKworCWZ1bmNfbGVuICIgJGNtZHMiCisJbGVuPSRmdW5jX2xlbl9yZXN1bHQKKwlpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbGlmIHRlc3QgLW4gIiRhcmNoaXZlcl9saXN0X3NwZWMiOyB0aGVuCisJICBmdW5jX3ZlcmJvc2UgInVzaW5nIGNvbW1hbmQgZmlsZSBhcmNoaXZlIGxpbmtpbmcuLi4iCisJICBmb3Igb2JqIGluICRvbGRvYmpzCisJICBkbworCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG9iaiIKKwkgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJICBkb25lID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUubGliY21kCisJICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUubGliY21kIgorCSAgb2xkb2Jqcz0iICRhcmNoaXZlcl9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IgorCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcworCWVsc2UKKwkgICMgdGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIGluIHBhcnRzCisJICBmdW5jX3ZlcmJvc2UgInVzaW5nIHBpZWNld2lzZSBhcmNoaXZlIGxpbmtpbmcuLi4iCisJICBzYXZlX1JBTkxJQj0kUkFOTElCCisJICBSQU5MSUI9OgorCSAgb2JqbGlzdD0KKwkgIGNvbmNhdF9jbWRzPQorCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCisJICBvbGRvYmpzPQorCSAgIyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZmluZGluZyB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3Q/CisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGxhc3Rfb2xkb2JqPSRvYmoKKwkgIGRvbmUKKwkgIGV2YWwgdGVzdF9jbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIgorCSAgbGVuMD0kZnVuY19sZW5fcmVzdWx0CisJICBsZW49JGxlbjAKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY19sZW4gIiAkb2JqIgorCSAgICBmdW5jX2FyaXRoICRsZW4gKyAkZnVuY19sZW5fcmVzdWx0CisJICAgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgZnVuY19hcHBlbmQgb2JqbGlzdCAiICRvYmoiCisJICAgIGlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgorCSAgICAgIDoKKwkgICAgZWxzZQorCSAgICAgICMgdGhlIGFib3ZlIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGl0IGdldHMgdG9vIGxvbmcKKwkgICAgICBvbGRvYmpzPSRvYmpsaXN0CisJICAgICAgaWYgdGVzdCAiJG9iaiIgPSAiJGxhc3Rfb2xkb2JqIiA7IHRoZW4KKwkJUkFOTElCPSRzYXZlX1JBTkxJQgorCSAgICAgIGZpCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgICAgICBvYmpsaXN0PQorCSAgICAgIGxlbj0kbGVuMAorCSAgICBmaQorCSAgZG9uZQorCSAgUkFOTElCPSRzYXZlX1JBTkxJQgorCSAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgaWYgdGVzdCAiWCRvbGRvYmpzIiA9ICJYIiA7IHRoZW4KKwkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc1wiCisJICBlbHNlCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHN+XCRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZpCisJZmkKKyAgICAgIGZpCisgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJGNtZHMiICdleGl0ICQ/JworICAgIGRvbmUKKworICAgIHRlc3QgLW4gIiRnZW5lcmF0ZWQiICYmIFwKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIke1JNfXIkZ2VuZXJhdGVkIgorCisgICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgKi5sYSkKKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKKyAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCAkbHRfdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgorCWVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWVsc2UKKwkgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICByZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyBAaW5zdF9wcmVmaXhfZGlyQCkiCisgICAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgorCXJlbGlua19jb21tYW5kPQorICAgICAgZmkKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbworCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQorCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgICoubGEpCisJCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHRgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgLUwqKQorCQlmdW5jX3N0cmlwbmFtZSAtTCAnJyAiJGRlcGxpYiIKKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiIC1MJGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdCIKKwkJOzsKKwkgICAgICAtUiopCisJCWZ1bmNfc3RyaXBuYW1lIC1SICcnICIkZGVwbGliIgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgLVIkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgbmV3ZGxmaWxlcz0KKworCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJICAgICAgICBmdW5jX2Jhc2VuYW1lICIkbGliIgorCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICR7bHRfc3lzcm9vdDorPX0kbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkgICAgICAqLmxhKQorCQkjIE9ubHkgcGFzcyBwcmVvcGVuZWQgZmlsZXMgdG8gdGhlIHBzZXVkby1hcmNoaXZlIChmb3IKKwkJIyBldmVudHVhbCBsaW5raW5nIHdpdGggdGhlIGFwcC4gdGhhdCBsaW5rcyBpdCkgaWYgd2UKKwkJIyBkaWRuJ3QgYWxyZWFkeSBsaW5rIHRoZSBwcmVvcGVuZWQgb2JqZWN0cyBkaXJlY3RseSBpbnRvCisJCSMgdGhlIGxpYnJhcnk6CisJCWZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CisJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRhYnMiCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBmaQorCSAgJFJNICRvdXRwdXQKKwkgICMgcGxhY2UgZGxuYW1lIGluIGNvcnJlY3QgcG9zaXRpb24gZm9yIGN5Z3dpbgorCSAgIyBJbiBmYWN0LCBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSB0aGlzIGNvZGUgZm9yIGFsbCB0YXJnZXQKKwkgICMgc3lzdGVtcyB0aGF0IGNhbid0IGhhcmQtY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gdGhlaXIgZXhlY3V0YWJsZXMKKwkgICMgYW5kIHRoYXQgaGF2ZSBubyBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlIGluZGVwZW5kZW50IG9mIFBBVEgsCisJICAjIGJ1dCBpdCB0dXJucyBvdXQgd2UgY2FuJ3QgZWFzaWx5IGRldGVybWluZSB0aGF0IGZyb20gaW5zcGVjdGluZworCSAgIyBsaWJ0b29sIHZhcmlhYmxlcywgc28gd2UgaGF2ZSB0byBoYXJkLWNvZGUgdGhlIE9TcyB0byB3aGljaCBpdAorCSAgIyBhcHBsaWVzIGhlcmU7IGF0IHRoZSBtb21lbnQsIHRoYXQgbWVhbnMgcGxhdGZvcm1zIHRoYXQgdXNlIHRoZSBQRQorCSAgIyBvYmplY3QgZm9ybWF0IHdpdGggRExMIGZpbGVzLiAgU2VlIHRoZSBsb25nIGNvbW1lbnQgYXQgdGhlIHRvcCBvZgorCSAgIyB0ZXN0cy9iaW5kaXIuYXQgZm9yIGZ1bGwgZGV0YWlscy4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCB8ICpjZWdjYyosKmxhaSx5ZXMsbm8sKi5kbGwpCisJICAgICAgIyBJZiBhIC1iaW5kaXIgYXJndW1lbnQgd2FzIHN1cHBsaWVkLCBwbGFjZSB0aGUgZGxsIHRoZXJlLgorCSAgICAgIGlmIHRlc3QgIngkYmluZGlyIiAhPSB4IDsKKwkgICAgICB0aGVuCisJCWZ1bmNfcmVsYXRpdmVfcGF0aCAiJGluc3RhbGxfbGliZGlyIiAiJGJpbmRpciIKKwkJdGRsbmFtZT0kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCRkbG5hbWUKKwkgICAgICBlbHNlCisJCSMgT3RoZXJ3aXNlIGZhbGwgYmFjayBvbiBoZXVyaXN0aWMuCisJCXRkbG5hbWU9Li4vYmluLyRkbG5hbWUKKwkgICAgICBmaQorCSAgICAgIDs7CisJICBlc2FjCisJICAkRUNITyA+ICRvdXRwdXQgIlwKKyMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckdGRsbmFtZScKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JworCisjIExpbmtlciBmbGFncyB0aGF0IGNhbiBub3QgZ28gaW4gZGVwZW5kZW5jeV9saWJzLgoraW5oZXJpdGVkX2xpbmtlcl9mbGFncz0nJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKKworIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQord2Vha19saWJyYXJ5X25hbWVzPSckd2Vha19saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD0kaW5zdGFsbGVkCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPSRtb2R1bGUKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JyRkbGZpbGVzJworZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0geWVzOyB0aGVuCisJICAgICRFQ0hPID4+ICRvdXRwdXQgIlwKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCisJICBmaQorCWRvbmUKKyAgICAgIH0KKworICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgorICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KKyAgICAgIGZ1bmNfc2hvd19ldmFsICcoIGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkb3V0cHV0bmFtZSIgJiYgJExOX1MgIi4uLyRvdXRwdXRuYW1lIiAiJG91dHB1dG5hbWUiICknICdleGl0ICQ/JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKK3sgdGVzdCAiJG9wdF9tb2RlIiA9IGxpbmsgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgfSAmJgorICAgIGZ1bmNfbW9kZV9saW5rICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX3VuaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV91bmluc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgUk09IiRub25vcHQiCisgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZikgZnVuY19hcHBlbmQgUk0gIiAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKKyAgICAgIC0qKSBmdW5jX2FwcGVuZCBSTSAiICRhcmciIDs7CisgICAgICAqKSBmdW5jX2FwcGVuZCBmaWxlcyAiICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJFJNIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIKKworICAgIHJtZGlycz0KKworICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgIGZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorICAgICAgZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICAgIGlmIHRlc3QgIlgkZGlyIiA9IFguOyB0aGVuCisJb2Rpcj0iJG9iamRpciIKKyAgICAgIGVsc2UKKwlvZGlyPSIkZGlyLyRvYmpkaXIiCisgICAgICBmaQorICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisgICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsICYmIG9kaXI9IiRkaXIiCisKKyAgICAgICMgUmVtZW1iZXIgb2RpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2RpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHJtZGlycyAiICRvZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiB7IHRlc3QgLUwgIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgeyB0ZXN0IC1oICIkZmlsZSI7IH0gPi9kZXYvbnVsbCAyPiYxIHx8CisJIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCToKKyAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisJZXhpdF9zdGF0dXM9MQorCWNvbnRpbnVlCisgICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAkbmFtZSBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG4iCisJICBkb25lCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kb2xkX2xpYnJhcnkiCisKKwkgIGNhc2UgIiRvcHRfbW9kZSIgaW4KKwkgIGNsZWFuKQorCSAgICBjYXNlICIgJGxpYnJhcnlfbmFtZXMgIiBpbgorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSB0ZXN0IC1uICIkZGxuYW1lIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJGRsbmFtZSIgOzsKKwkgICAgZXNhYworCSAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfWkiCisJICAgIDs7CisJICB1bmluc3RhbGwpCisJICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKKwkgICAgZmkKKwkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCisJICAgIDs7CisJICBlc2FjCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgorCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqKQorCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbiA7IHRoZW4KKwkgIG5vZXhlbmFtZT0kbmFtZQorCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRuYW1lIgorCSAgICBub2V4ZW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCisJICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQorCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmIGZ1bmNfbHR3cmFwcGVyX3AgIiRmaWxlIjsgdGhlbgorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAgIGVsc2UKKwkgICAgICByZWxpbmtfY29tbWFuZD0KKwkgICAgICBmdW5jX3NvdXJjZSAkZGlyLyRub2V4ZW5hbWUKKwkgICAgZmkKKworCSAgICAjIG5vdGUgJG5hbWUgc3RpbGwgY29udGFpbnMgLmV4ZSBpZiBpdCB3YXMgaW4gJGZpbGUgb3JpZ2luYWxseQorCSAgICAjIGFzIGRvZXMgdGhlIHZlcnNpb24gb2YgJGZpbGUgdGhhdCB3YXMgYWRkZWQgaW50byAkcm1maWxlcworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfVMuJHtvYmpleHR9IgorCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllcyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSR7bm9leGVuYW1lfS5jIgorCSAgICBmaQorCSAgZmkKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJFJNICRybWZpbGVzIiAnZXhpdF9zdGF0dXM9MScKKyAgICBkb25lCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICJybWRpciAkZGlyID4vZGV2L251bGwgMj4mMSIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKK30KKworeyB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbjsgfSAmJgorICAgIGZ1bmNfbW9kZV91bmluc3RhbGwgJHsxKyIkQCJ9CisKK3Rlc3QgLXogIiRvcHRfbW9kZSIgJiYgeworICBoZWxwPSIkZ2VuZXJpY19oZWxwIgorICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgorfQorCit0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKKyAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG9wdF9tb2RlJyIKKworaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgorICBldmFsIGV4ZWMgIiRleGVjX2NtZCIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCitleGl0ICRleGl0X3N0YXR1cworCisKKyMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCisjIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZworIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKKyMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCisjIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAorIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAorIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCisjIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCisjIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5CisjIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAorYnVpbGRfbGlidG9vbF9saWJzPW5vCitidWlsZF9vbGRfbGlicz15ZXMKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKK2J1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSBlY2hvIG5vOzsgKikgZWNobyB5ZXM7OyBlc2FjYAorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgorIyB2aTpzdz0yCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvYnVpbGQtYXV4L21pc3NpbmcgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2J1aWxkLWF1eC9taXNzaW5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2YThmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2J1aWxkLWF1eC9taXNzaW5nCkBAIC0wLDAgKzEsMzMxIEBACisjISAvYmluL3NoCisjIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgorCitzY3JpcHR2ZXJzaW9uPTIwMTItMDEtMDYuMTM7ICMgVVRDCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorIyAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgZXhpdCAxCitmaQorCitydW49Ogorc2VkX291dHB1dD0ncy8uKiAtLW91dHB1dFsgPV1cKFteIF0qXCkuKi9cMS9wJworc2VkX21pbnVzbz0ncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJworCisjIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCisjIHNyY2RpciBhbHJlYWR5LgoraWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KKyAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYworZWxzZQorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCitmaQorCittc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCisKK2Nhc2UgJDEgaW4KKy0tcnVuKQorICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCisgIHJ1bj0KKyAgc2hpZnQKKyAgIiRAIiAmJiBleGl0IDAKKyAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucworICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCisgICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKKyAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgorICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KKyAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCisgICAgcnVuPToKKyAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCisgIGZpCisgIDs7CisKKyAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorICAgIGVjaG8gIlwKKyQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgorCitIYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCitlcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCisKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCisKK1N1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKKyAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JworICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKKyAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKKyAgYXV0b200dGUgICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZSwgb3IgY3JlYXRlIGEgc3R1YiBvbmUKKyAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcworICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisgIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisKK1ZlcnNpb24gc3VmZml4ZXMgdG8gUFJPR1JBTSBhcyB3ZWxsIGFzIHRoZSBwcmVmaXhlcyBcYGdudS0nLCBcYGdudScsIGFuZAorXGBnJyBhcmUgaWdub3JlZCB3aGVuIGNoZWNraW5nIHRoZSBuYW1lLgorCitTZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCitlc2FjCisKKyMgbm9ybWFsaXplIHByb2dyYW0gbmFtZSB0byBjaGVjayBmb3IuCitwcm9ncmFtPWBlY2hvICIkMSIgfCBzZWQgJworICBzL15nbnUtLy87IHQKKyAgcy9eZ251Ly87IHQKKyAgcy9eZy8vOyB0J2AKKworIyBOb3cgZXhpdCBpZiB3ZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLiAgQWxzbyBleGl0IG5vdyBpZiB3ZQorIyBkb24ndCBoYXZlIGl0IGFuZCAtLXZlcnNpb24gd2FzIHBhc3NlZCAobW9zdCBsaWtlbHkgdG8gZGV0ZWN0CisjIHRoZSBwcm9ncmFtKS4gIFRoaXMgaXMgYWJvdXQgbm9uLUdOVSBwcm9ncmFtcywgc28gdXNlICQxIG5vdAorIyAkcHJvZ3JhbS4KK2Nhc2UgJDEgaW4KKyAgbGV4Knx5YWNjKikKKyAgICAjIE5vdCBHTlUgcHJvZ3JhbXMsIHRoZXkgZG9uJ3QgaGF2ZSAtLXZlcnNpb24uCisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICAjIENvdWxkIG5vdCBydW4gLS12ZXJzaW9uIG9yIC0taGVscC4gIFRoaXMgaXMgcHJvYmFibHkgc29tZW9uZQorICAgICAgICMgcnVubmluZyBgJFRPT0wgLS12ZXJzaW9uJyBvciBgJFRPT0wgLS1oZWxwJyB0byBjaGVjayB3aGV0aGVyCisgICAgICAgIyAkVE9PTCBleGlzdHMgYW5kIG5vdCBrbm93aW5nICRUT09MIHVzZXMgbWlzc2luZy4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7Citlc2FjCisKKyMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCisjIHRyeSB0byBlbXVsYXRlIGl0LgorY2FzZSAkcHJvZ3JhbSBpbgorICBhY2xvY2FsKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQorICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHRvdWNoIGFjbG9jYWwubTQKKyAgICA7OworCisgIGF1dG9jb25mKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQorICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKKyAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKKyAgICB0b3VjaF9maWxlcz0KKyAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAorCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKKyAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgICAgdG91Y2ggJHRvdWNoX2ZpbGVzCisgICAgOzsKKworICBhdXRvbWFrZSopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KKyAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgorICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8CisJICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKKwkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKKyAgICA7OworCisgIGF1dG9tNHRlKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCisgICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIjISAvYmluL3NoIgorCWVjaG8gIiMgQ3JlYXRlZCBieSBHTlUgQXV0b21ha2UgbWlzc2luZyBhcyBhIHJlcGxhY2VtZW50IG9mIgorCWVjaG8gIiMgICQgJEAiCisJZWNobyAiZXhpdCAwIgorCWNobW9kICt4ICRmaWxlCisJZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgIGJpc29uKnx5YWNjKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCisgICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9XCR7JCN9CisJY2FzZSAkTEFTVEFSRyBpbgorCSoueSkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgorCWVjaG8gPnkudGFiLmgKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleCp8ZmxleCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiBsZXgueXkuYworICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPVwkeyQjfQorCWNhc2UgJExBU1RBUkcgaW4KKwkqLmwpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKKwkgICAgZmkKKwkgIDs7CisJZXNhYworICAgIGZpCisgICAgaWYgdGVzdCAhIC1mIGxleC55eS5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYworICAgIGZpCisgICAgOzsKKworICBoZWxwMm1hbiopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKwkgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSBvZiBhIG1hbnVhbCBwYWdlLiAgWW91IG1heSBuZWVkIHRoZQorCSBcYEhlbHAybWFuJyBwYWNrYWdlIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UKKwkgZWZmZWN0LiAgWW91IGNhbiBnZXQgXGBIZWxwMm1hbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKKwlleGl0ICQ/CisgICAgZmkKKyAgICA7OworCisgIG1ha2VpbmZvKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKKyAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cworICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKKyAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgorICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICAjIFRoZSBmaWxlIHRvIHRvdWNoIGlzIHRoYXQgc3BlY2lmaWVkIHdpdGggLW8gLi4uCisgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCisgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorICAgICAgIyAuLi4gb3IgaXQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgd2l0aCBAc2V0ZmlsZW5hbWUgLi4uCisgICAgICBpbmZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKKyAgICAgIGZpbGU9YHNlZCAtbiAnCisJL15Ac2V0ZmlsZW5hbWUveworCSAgcy8uKiBcKFteIF0qXCkgKiQvXDEvCisJICBwCisJICBxCisJfScgJGluZmlsZWAKKyAgICAgICMgLi4uIG9yIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIG5hbWUgKGRpci9mLnRleGkgYmVjb21lcyBmLmluZm8pCisgICAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJGluZmlsZSIgfCBzZWQgJ3MsLiovLCw7cywuW14uXSokLCwnYC5pbmZvCisgICAgZmkKKyAgICAjIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgdXNlciByZWFsbHkgbmVlZHMgbWFrZWluZm87CisgICAgIyBsZXQncyBmYWlsIHdpdGhvdXQgdG91Y2hpbmcgYW55dGhpbmcuCisgICAgdGVzdCAtZiAkZmlsZSB8fCBleGl0IDEKKyAgICB0b3VjaCAkZmlsZQorICAgIDs7CisKKyAgKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCisgICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCisgICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQorICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2IyMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQpAQCAtMCwwICsxLDIyNyBAQAorIyBEZWZpbmVzIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWZ1bCBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QgYW5kCisjIEdvb2dsZSBNb2NrLgorIworIyBOb3RlOgorIworIyAtIFRoaXMgZmlsZSB3aWxsIGJlIHJ1biB0d2ljZSB3aGVuIGJ1aWxkaW5nIEdvb2dsZSBNb2NrIChvbmNlIHZpYQorIyAgIEdvb2dsZSBUZXN0J3MgQ01ha2VMaXN0cy50eHQsIGFuZCBvbmNlIHZpYSBHb29nbGUgTW9jaydzKS4KKyMgICBUaGVyZWZvcmUgaXQgc2hvdWxkbid0IGhhdmUgYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIGRlZmluaW5nCisjICAgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLgorIworIyAtIFRoZSBmdW5jdGlvbnMvbWFjcm9zIGRlZmluZWQgaW4gdGhpcyBmaWxlIG1heSBkZXBlbmQgb24gR29vZ2xlCisjICAgVGVzdCBhbmQgR29vZ2xlIE1vY2sncyBvcHRpb24oKSBkZWZpbml0aW9ucywgYW5kIHRodXMgbXVzdCBiZQorIyAgIGNhbGxlZCAqYWZ0ZXIqIHRoZSBvcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLgorCisjIFR3ZWFrcyBDTWFrZSdzIGRlZmF1bHQgY29tcGlsZXIvbGlua2VyIHNldHRpbmdzIHRvIHN1aXQgR29vZ2xlIFRlc3QncyBuZWVkcy4KKyMKKyMgVGhpcyBtdXN0IGJlIGEgbWFjcm8oKSwgYXMgaW5zaWRlIGEgZnVuY3Rpb24gc3RyaW5nKCkgY2FuIG9ubHkKKyMgdXBkYXRlIHZhcmlhYmxlcyBpbiB0aGUgZnVuY3Rpb24gc2NvcGUuCittYWNybyhmaXhfZGVmYXVsdF9jb21waWxlcl9zZXR0aW5nc18pCisgIGlmIChNU1ZDKQorICAgICMgRm9yIE1TVkMsIENNYWtlIHNldHMgY2VydGFpbiBmbGFncyB0byBkZWZhdWx0cyB3ZSB3YW50IHRvIG92ZXJyaWRlLgorICAgICMgVGhpcyByZXBsYWNlbWVudCBjb2RlIGlzIHRha2VuIGZyb20gc2FtcGxlIGluIHRoZSBDTWFrZSBXaWtpIGF0CisgICAgIyBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlX0ZBUSNEeW5hbWljX1JlcGxhY2UuCisgICAgZm9yZWFjaCAoZmxhZ192YXIKKyAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1MgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCisgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX01JTlNJWkVSRUwgQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgICAgaWYgKE5PVCBCVUlMRF9TSEFSRURfTElCUyBBTkQgTk9UIGd0ZXN0X2ZvcmNlX3NoYXJlZF9jcnQpCisgICAgICAgICMgV2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBzaG91bGQgYWxzbyB1c2UKKyAgICAgICAgIyBzaGFyZWQgcnVudGltZSBsaWJyYXJpZXMuICBPdGhlcndpc2UsIGl0IG1heSBlbmQgdXAgd2l0aCBtdWx0aXBsZQorICAgICAgICAjIGNvcGllcyBvZiBydW50aW1lIGxpYnJhcnkgZGF0YSBpbiBkaWZmZXJlbnQgbW9kdWxlcywgcmVzdWx0aW5nIGluCisgICAgICAgICMgaGFyZC10by1maW5kIGNyYXNoZXMuIFdoZW4gaXQgaXMgYnVpbHQgYXMgYSBzdGF0aWMgbGlicmFyeSwgaXQgaXMKKyAgICAgICAgIyBwcmVmZXJhYmxlIHRvIHVzZSBDUlQgYXMgc3RhdGljIGxpYnJhcmllcywgYXMgd2UgZG9uJ3QgaGF2ZSB0byByZWx5CisgICAgICAgICMgb24gQ1JUIERMTHMgYmVpbmcgYXZhaWxhYmxlLiBDTWFrZSBhbHdheXMgZGVmYXVsdHMgdG8gdXNpbmcgc2hhcmVkCisgICAgICAgICMgQ1JUIGxpYnJhcmllcywgc28gd2Ugb3ZlcnJpZGUgdGhhdCBkZWZhdWx0IGhlcmUuCisgICAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICItTVQiICR7ZmxhZ192YXJ9ICIkeyR7ZmxhZ192YXJ9fSIpCisgICAgICBlbmRpZigpCisKKyAgICAgICMgV2UgcHJlZmVyIG1vcmUgc3RyaWN0IHdhcm5pbmcgY2hlY2tpbmcgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0LgorICAgICAgIyBSZXBsYWNlcyAvVzMgd2l0aCAvVzQgaW4gZGVmYXVsdHMuCisgICAgICBzdHJpbmcoUkVQTEFDRSAiL1czIiAiLVc0IiAke2ZsYWdfdmFyfSAiJHske2ZsYWdfdmFyfX0iKQorICAgIGVuZGZvcmVhY2goKQorICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgRGVmaW5lcyB0aGUgY29tcGlsZXIvbGlua2VyIGZsYWdzIHVzZWQgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYW5kCisjIEdvb2dsZSBNb2NrLiAgWW91IGNhbiB0d2VhayB0aGVzZSBkZWZpbml0aW9ucyB0byBzdWl0IHlvdXIgbmVlZC4gIEEKKyMgdmFyaWFibGUncyB2YWx1ZSBpcyBlbXB0eSBiZWZvcmUgaXQncyBleHBsaWNpdGx5IGFzc2lnbmVkIHRvLgorbWFjcm8oY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIpCisgIGlmIChOT1QgZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcykKKyAgICAjIERlZmluZXMgQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQgYW5kIENNQUtFX1RIUkVBRF9MSUJTX0lOSVQuCisgICAgZmluZF9wYWNrYWdlKFRocmVhZHMpCisgIGVuZGlmKCkKKworICBmaXhfZGVmYXVsdF9jb21waWxlcl9zZXR0aW5nc18oKQorICBpZiAoTVNWQykKKyAgICAjIE5ld2xpbmVzIGluc2lkZSBmbGFncyB2YXJpYWJsZXMgYnJlYWsgQ01ha2UncyBOTWFrZSBnZW5lcmF0b3IuCisgICAgIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBBZGQgLVJUQ3MgYW5kIC1SVEN1IHRvIGRlYnVnIGJ1aWxkcy4KKyAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1HUyAtVzQgLVdYIC13ZDQxMjcgLXdkNDI1MSAtd2Q0Mjc1IC1ub2xvZ28gLUogLVppIikKKyAgICBpZiAoTVNWQ19WRVJTSU9OIExFU1MgMTQwMCkKKyAgICAgICMgU3VwcHJlc3Mgc3B1cmlvdXMgd2FybmluZ3MgTVNWQyA3LjEgc29tZXRpbWVzIGlzc3Vlcy4KKyAgICAgICMgRm9yY2luZyB2YWx1ZSB0byBib29sLgorICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0ODAwIikKKyAgICAgICMgQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLgorICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0NTExIC13ZDQ1MTIiKQorICAgICAgIyBDb21wYXRpYmlsaXR5IHdhcm5pbmdzIG5vdCBhcHBsaWNhYmxlIHRvIEdvb2dsZSBUZXN0LgorICAgICAgIyBSZXNvbHZlZCBvdmVybG9hZCB3YXMgZm91bmQgYnkgYXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cC4KKyAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDY3NSIpCisgICAgZW5kaWYoKQorICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURfVU5JQ09ERSAtRFVOSUNPREUgLURXSU4zMiAtRF9XSU4zMiIpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRFNUUklDVCAtRFdJTjMyX0xFQU5fQU5EX01FQU4iKQorICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItRUhzYyAtRF9IQVNfRVhDRVBUSU9OUz0xIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLURfSEFTX0VYQ0VQVElPTlM9MCIpCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItR1ItIikKKyAgZWxzZWlmIChDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItV2FsbCAtV3NoYWRvdyIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZXhjZXB0aW9ucyIpCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1mbm8tZXhjZXB0aW9ucyIpCisgICAgIyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBHQ0MgZG9lc24ndCBkZWZpbmUgYSBtYWNybyB0byBpbmRpY2F0ZQorICAgICMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQuICBUaGVyZWZvcmUgd2UgZGVmaW5lIEdURVNUX0hBU19SVFRJCisgICAgIyBleHBsaWNpdGx5LgorICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLWZuby1ydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCisgICAgc2V0KGN4eF9zdHJpY3RfZmxhZ3MKKyAgICAgICItV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIikKKyAgZWxzZWlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIlN1blBybyIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZWF0dXJlcz1leGNlcHQiKQorICAgICMgU3VuIFBybyBkb2Vzbid0IHByb3ZpZGUgbWFjcm9zIHRvIGluZGljYXRlIHdoZXRoZXIgZXhjZXB0aW9ucyBhbmQKKyAgICAjIFJUVEkgYXJlIGVuYWJsZWQsIHNvIHdlIGRlZmluZSBHVEVTVF9IQVNfKiBleHBsaWNpdGx5LgorICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItZmVhdHVyZXM9bm8lZXhjZXB0IC1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MCIpCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItZmVhdHVyZXM9bm8lcnR0aSAtREdURVNUX0hBU19SVFRJPTAiKQorICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiVmlzdWFsQWdlIiBPUgorICAgICAgQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJYTCIpCisgICAgIyBDTWFrZSAyLjggY2hhbmdlcyBWaXN1YWwgQWdlJ3MgY29tcGlsZXIgSUQgdG8gIlhMIi4KKyAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLXFlaCIpCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1xbm9laCIpCisgICAgIyBVbnRpbCB2ZXJzaW9uIDkuMCwgVmlzdWFsIEFnZSBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIHRvIGluZGljYXRlCisgICAgIyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZC4gIFRoZXJlZm9yZSB3ZSBkZWZpbmUgR1RFU1RfSEFTX1JUVEkKKyAgICAjIGV4cGxpY2l0bHkuCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItcW5vcnR0aSAtREdURVNUX0hBU19SVFRJPTAiKQorICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiSFAiKQorICAgIHNldChjeHhfYmFzZV9mbGFncyAiLUFBIC1tdCIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MSIpCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIitub2VoIC1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MCIpCisgICAgIyBSVFRJIGNhbiBub3QgYmUgZGlzYWJsZWQgaW4gSFAgYUNDIGNvbXBpbGVyLgorICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiIikKKyAgZW5kaWYoKQorCisgIGlmIChDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkgICMgVGhlIHB0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGFuZCBhbGxvd2VkLgorICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURHVEVTVF9IQVNfUFRIUkVBRD0xIikKKyAgZWxzZSgpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtREdURVNUX0hBU19QVEhSRUFEPTAiKQorICBlbmRpZigpCisKKyAgIyBGb3IgYnVpbGRpbmcgZ3Rlc3QncyBvd24gdGVzdHMgYW5kIHNhbXBsZXMuCisgIHNldChjeHhfZXhjZXB0aW9uICIke0NNQUtFX0NYWF9GTEFHU30gJHtjeHhfYmFzZV9mbGFnc30gJHtjeHhfZXhjZXB0aW9uX2ZsYWdzfSIpCisgIHNldChjeHhfbm9fZXhjZXB0aW9uCisgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2N4eF9iYXNlX2ZsYWdzfSAke2N4eF9ub19leGNlcHRpb25fZmxhZ3N9IikKKyAgc2V0KGN4eF9kZWZhdWx0ICIke2N4eF9leGNlcHRpb259IikKKyAgc2V0KGN4eF9ub19ydHRpICIke2N4eF9kZWZhdWx0fSAke2N4eF9ub19ydHRpX2ZsYWdzfSIpCisgIHNldChjeHhfdXNlX293bl90dXBsZSAiJHtjeHhfZGVmYXVsdH0gLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0xIikKKworICAjIEZvciBidWlsZGluZyB0aGUgZ3Rlc3QgbGlicmFyaWVzLgorICBzZXQoY3h4X3N0cmljdCAiJHtjeHhfZGVmYXVsdH0gJHtjeHhfc3RyaWN0X2ZsYWdzfSIpCitlbmRtYWNybygpCisKKyMgRGVmaW5lcyB0aGUgZ3Rlc3QgJiBndGVzdF9tYWluIGxpYnJhcmllcy4gIFVzZXIgdGVzdHMgc2hvdWxkIGxpbmsKKyMgd2l0aCBvbmUgb2YgdGhlbS4KK2Z1bmN0aW9uKGN4eF9saWJyYXJ5X3dpdGhfdHlwZSBuYW1lIHR5cGUgY3h4X2ZsYWdzKQorICAjIHR5cGUgY2FuIGJlIGVpdGhlciBTVEFUSUMgb3IgU0hBUkVEIHRvIGRlbm90ZSBhIHN0YXRpYyBvciBzaGFyZWQgbGlicmFyeS4KKyAgIyBBUkdOIHJlZmVycyB0byBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciAnY3h4X2ZsYWdzJy4KKyAgYWRkX2xpYnJhcnkoJHtuYW1lfSAke3R5cGV9ICR7QVJHTn0pCisgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgUFJPUEVSVElFUworICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpCisgIGlmIChCVUlMRF9TSEFSRURfTElCUyBPUiB0eXBlIFNUUkVRVUFMICJTSEFSRUQiKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlk9MSIpCisgIGVuZGlmKCkKKyAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGJ1aWxkIHRhcmdldHMuCisKK2Z1bmN0aW9uKGN4eF9zaGFyZWRfbGlicmFyeSBuYW1lIGN4eF9mbGFncykKKyAgY3h4X2xpYnJhcnlfd2l0aF90eXBlKCR7bmFtZX0gU0hBUkVEICIke2N4eF9mbGFnc30iICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKGN4eF9saWJyYXJ5IG5hbWUgY3h4X2ZsYWdzKQorICBjeHhfbGlicmFyeV93aXRoX3R5cGUoJHtuYW1lfSAiIiAiJHtjeHhfZmxhZ3N9IiAke0FSR059KQorZW5kZnVuY3Rpb24oKQorCisjIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MobmFtZSBjeHhfZmxhZ3MgbGlicyBzcmNzLi4uKQorIworIyBjcmVhdGVzIGEgbmFtZWQgQysrIGV4ZWN1dGFibGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsaWJyYXJpZXMgYW5kCisjIGlzIGJ1aWx0IGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBjb21waWxlciBmbGFncy4KK2Z1bmN0aW9uKGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MgbmFtZSBjeHhfZmxhZ3MgbGlicykKKyAgYWRkX2V4ZWN1dGFibGUoJHtuYW1lfSAke0FSR059KQorICBpZiAoY3h4X2ZsYWdzKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0ZMQUdTICIke2N4eF9mbGFnc30iKQorICBlbmRpZigpCisgIGlmIChCVUlMRF9TSEFSRURfTElCUykKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfQorICAgICAgUFJPUEVSVElFUworICAgICAgQ09NUElMRV9ERUZJTklUSU9OUyAiR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZPTEiKQorICBlbmRpZigpCisgICMgVG8gc3VwcG9ydCBtaXhpbmcgbGlua2luZyBpbiBzdGF0aWMgYW5kIGR5bmFtaWMgbGlicmFyaWVzLCBsaW5rIGVhY2gKKyAgIyBsaWJyYXJ5IGluIHdpdGggYW4gZXh0cmEgY2FsbCB0byB0YXJnZXRfbGlua19saWJyYXJpZXMuCisgIGZvcmVhY2ggKGxpYiAiJHtsaWJzfSIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtsaWJ9KQorICBlbmRmb3JlYWNoKCkKK2VuZGZ1bmN0aW9uKCkKKworIyBjeHhfZXhlY3V0YWJsZShuYW1lIGRpciBsaWIgc3Jjcy4uLikKKyMKKyMgY3JlYXRlcyBhIG5hbWVkIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzIGJ1aWx0CisjIGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcy4gIGRpci9uYW1lLmNjIGlzIGltcGxpY2l0bHkgaW5jbHVkZWQgaW4KKyMgdGhlIHNvdXJjZSBmaWxlIGxpc3QuCitmdW5jdGlvbihjeHhfZXhlY3V0YWJsZSBuYW1lIGRpciBsaWJzKQorICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKAorICAgICR7bmFtZX0gIiR7Y3h4X2RlZmF1bHR9IiAiJHtsaWJzfSIgIiR7ZGlyfS8ke25hbWV9LmNjIiAke0FSR059KQorZW5kZnVuY3Rpb24oKQorCisjIFNldHMgUFlUSE9OSU5URVJQX0ZPVU5EIGFuZCBQWVRIT05fRVhFQ1VUQUJMRS4KK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnApCisKKyMgY3h4X3Rlc3Rfd2l0aF9mbGFncyhuYW1lIGN4eF9mbGFncyBsaWJzIHNyY3MuLi4pCisjCisjIGNyZWF0ZXMgYSBuYW1lZCBDKysgdGVzdCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzIGJ1aWx0CisjIGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBjb21waWxlciBmbGFncy4KK2Z1bmN0aW9uKGN4eF90ZXN0X3dpdGhfZmxhZ3MgbmFtZSBjeHhfZmxhZ3MgbGlicykKKyAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygke25hbWV9ICIke2N4eF9mbGFnc30iICIke2xpYnN9IiAke0FSR059KQorICBhZGRfdGVzdCgke25hbWV9ICR7bmFtZX0pCitlbmRmdW5jdGlvbigpCisKKyMgY3h4X3Rlc3QobmFtZSBsaWJzIHNyY3MuLi4pCisjCisjIGNyZWF0ZXMgYSBuYW1lZCB0ZXN0IHRhcmdldCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzCisjIGJ1aWx0IGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcy4gIFVubGlrZSBjeHhfdGVzdF93aXRoX2ZsYWdzLAorIyB0ZXN0L25hbWUuY2MgaXMgYWxyZWFkeSBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgZmlsZSBsaXN0LgorZnVuY3Rpb24oY3h4X3Rlc3QgbmFtZSBsaWJzKQorICBjeHhfdGVzdF93aXRoX2ZsYWdzKCIke25hbWV9IiAiJHtjeHhfZGVmYXVsdH0iICIke2xpYnN9IgorICAgICJ0ZXN0LyR7bmFtZX0uY2MiICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKKyMgcHlfdGVzdChuYW1lKQorIworIyBjcmVhdGVzIGEgUHl0aG9uIHRlc3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aG9zZSBtYWluIG1vZHVsZSBpcyBpbgorIyB0ZXN0L25hbWUucHkuICBJdCBkb2VzIG5vdGhpbmcgaWYgUHl0aG9uIGlzIG5vdCBpbnN0YWxsZWQuCitmdW5jdGlvbihweV90ZXN0IG5hbWUpCisgICMgV2UgYXJlIG5vdCBzdXBwb3J0aW5nIFB5dGhvbiB0ZXN0cyBvbiBMaW51eCB5ZXQgYXMgdGhleSBjb25zaWRlcgorICAjIGFsbCBMaW51eCBlbnZpcm9ubWVudHMgdG8gYmUgZ29vZ2xlMyBhbmQgdHJ5IHRvIHVzZSBnb29nbGUzIGZlYXR1cmVzLgorICBpZiAoUFlUSE9OSU5URVJQX0ZPVU5EKQorICAgICMgJHtDTUFLRV9CSU5BUllfRElSfSBpcyBrbm93biBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHNvIHdlIGNhbgorICAgICMgZGlyZWN0bHkgYmluZCBpdCBmcm9tIGNtYWtlLiAke0NURVNUX0NPTkZJR1VSQVRJT05fVFlQRX0gaXMga25vd24KKyAgICAjIG9ubHkgYXQgY3Rlc3QgcnVudGltZSAoYnkgY2FsbGluZyBjdGVzdCAtYyA8Q29uZmlndXJhdGlvbj4pLCBzbworICAgICMgd2UgaGF2ZSB0byBlc2NhcGUgJCB0byBkZWxheSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaGVyZS4KKyAgICBhZGRfdGVzdCgke25hbWV9CisgICAgICAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC8ke25hbWV9LnB5CisgICAgICAgICAgLS1idWlsZF9kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1wke0NURVNUX0NPTkZJR1VSQVRJT05fVFlQRX0pCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvY29kZWdlYXIvZ3Rlc3QuY2Jwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb2RlZ2Vhci9ndGVzdC5jYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YmIyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvY29kZWdlYXIvZ3Rlc3QuY2Jwcm9qCkBAIC0wLDAgKzEsMTM4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcm9qZWN0R3VpZD57YmNhMzdhNzItNWIwNy00NmNmLWI0NGUtODlmOGUwNjQ1MWEyfTwvUHJvamVjdEd1aWQ+CisgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNlJyBvciAnJChCYXNlKSchPScnIj4KKyAgICA8QmFzZT50cnVlPC9CYXNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorICAgIDxCYXNlPnRydWU8L0Jhc2U+CisgICAgPENmZ18xPnRydWU8L0NmZ18xPgorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KKyAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKyAgICA8QkNDX09wdGltaXplRm9yU3BlZWQ+dHJ1ZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+CisgICAgPE91dHB1dEV4dD5saWI8L091dHB1dEV4dD4KKyAgICA8RENDX0NCdWlsZGVyT3V0cHV0PkpQSE5FPC9EQ0NfQ0J1aWxkZXJPdXRwdXQ+CisgICAgPERlZmluZXM+Tk9fU1RSSUNUPC9EZWZpbmVzPgorICAgIDxEeW5hbWljUlRMPnRydWU8L0R5bmFtaWNSVEw+CisgICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPgorICAgIDxQcm9qZWN0VHlwZT5DcHBTdGF0aWNMaWJyYXJ5PC9Qcm9qZWN0VHlwZT4KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+CisgICAgPFBhY2thZ2VJbXBvcnRzPnJ0bC5icGk7dmNsLmJwaTtiY2JpZS5icGk7dmNseC5icGk7dmNsYWN0bmJhbmQuYnBpO3htbHJ0bC5icGk7YmNic21wLmJwaTtkYnJ0bC5icGk7dmNsZGIuYnBpO2JkZXJ0bC5icGk7dmNsZGJ4LmJwaTtkc25hcC5icGk7ZHNuYXBjb24uYnBpO3ZjbGliLmJwaTtpYnhwcmVzcy5icGk7YWRvcnRsLmJwaTtkYnhjZHMuYnBpO2RiZXhwcmVzcy5icGk7RGJ4Q29tbW9uRHJpdmVyLmJwaTt3ZWJzbmFwLmJwaTt2Y2xpZS5icGk7d2ViZHNuYXAuYnBpO2luZXQuYnBpO2luZXRkYmJkZS5icGk7aW5ldGRieHByZXNzLmJwaTtzb2FwcnRsLmJwaTtSYXZlNzVWQ0wuYnBpO3RlZVVJLmJwaTt0ZWUuYnBpO3RlZWRiLmJwaTtJbmR5Q29yZS5icGk7SW5keVN5c3RlbS5icGk7SW5keVByb3RvY29scy5icGk7SW50cmF3ZWJEQl85MF8xMDAuYnBpO0ludHJhd2ViXzkwXzEwMC5icGk7ZGNsWmlwRm9yZ2VkMTEuYnBpO3ZjbFppcEZvcmdlZDExLmJwaTtHUjMyX0JEUzIwMDYuYnBpO0dSMzJfRFNHTl9CRFMyMDA2LmJwaTtKY2wuYnBpO0pjbFZjbC5icGk7SnZDb3JlRDExUi5icGk7SnZTeXN0ZW1EMTFSLmJwaTtKdlN0ZEN0cmxzRDExUi5icGk7SnZBcHBGcm1EMTFSLmJwaTtKdkJhbmRzRDExUi5icGk7SnZEQkQxMVIuYnBpO0p2RGxnc0QxMVIuYnBpO0p2QkRFRDExUi5icGk7SnZDbXBEMTFSLmJwaTtKdkNyeXB0RDExUi5icGk7SnZDdHJsc0QxMVIuYnBpO0p2Q3VzdG9tRDExUi5icGk7SnZEb2NraW5nRDExUi5icGk7SnZEb3ROZXRDdHJsc0QxMVIuYnBpO0p2RURJRDExUi5icGk7SnZHbG9idXNEMTFSLmJwaTtKdkhNSUQxMVIuYnBpO0p2SW50ZXJwcmV0ZXJEMTFSLmJwaTtKdkphbnNEMTFSLmJwaTtKdk1hbmFnZWRUaHJlYWRzRDExUi5icGk7SnZNTUQxMVIuYnBpO0p2TmV0RDExUi5icGk7SnZQYWdlQ29tcHNEMTFSLmJwaTtKdlBsdWdpbkQxMVIuYnBpO0p2UHJpbnRQcmV2aWV3RDExUi5icGk7SnZSdW50aW1lRGVzaWduRDExUi5icGk7SnZUaW1lRnJhbWV3b3JrRDExUi5icGk7SnZWYWxpZGF0b3JzRDExUi5icGk7SnZXaXphcmREMTFSLmJwaTtKdlhQQ3RybHNEMTFSLmJwaTtWY2xTbXAuYnBpO0NFeGNlcHRpb25FeHBlcnQxMS5icGk8L1BhY2thZ2VJbXBvcnRzPgorICAgIDxCQ0Nfd3Bhcj5mYWxzZTwvQkNDX3dwYXI+CisgICAgPEluY2x1ZGVQYXRoPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9JbmNsdWRlUGF0aD4KKyAgICA8QWxsUGFja2FnZUxpYnM+cnRsLmxpYjt2Y2wubGliPC9BbGxQYWNrYWdlTGlicz4KKyAgICA8VExJQl9QYWdlU2l6ZT4zMjwvVExJQl9QYWdlU2l6ZT4KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0lMSU5LX0xpYnJhcnlQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+CisgICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorICAgIDxEQ0NfRGVidWdJbmZvSW5FeGU+dHJ1ZTwvRENDX0RlYnVnSW5mb0luRXhlPgorICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPgorICAgIDxJTElOS19GdWxsRGVidWdJbmZvPnRydWU8L0lMSU5LX0Z1bGxEZWJ1Z0luZm8+CisgICAgPEJDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5mYWxzZTwvQkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPgorICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+CisgICAgPEJDQ19Vc2VSZWdpc3RlclZhcmlhYmxlcz5Ob25lPC9CQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+CisgICAgPERDQ19EZWZpbmU+REVCVUc8L0RDQ19EZWZpbmU+CisgICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPgorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+RGVidWc8L0ludGVybWVkaWF0ZU91dHB1dERpcj4KKyAgICA8VEFTTV9EaXNwbGF5U291cmNlTGluZXM+dHJ1ZTwvVEFTTV9EaXNwbGF5U291cmNlTGluZXM+CisgICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+CisgICAgPEJDQ19EaXNhYmxlT3B0aW1pemF0aW9ucz50cnVlPC9CQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+CisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWJcZGVidWc7JChJTElOS19MaWJyYXJ5UGF0aCk8L0lMSU5LX0xpYnJhcnlQYXRoPgorICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4KKyAgICA8QkNDX1NvdXJjZURlYnVnZ2luZ09uPnRydWU8L0JDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KKyAgICA8RGVmaW5lcz5OREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPlJlbGVhc2U8L0ludGVybWVkaWF0ZU91dHB1dERpcj4KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4KKyAgICA8VEFTTV9EZWJ1Z2dpbmc+Tm9uZTwvVEFTTV9EZWJ1Z2dpbmc+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkNQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisgICAgPEJvcmxhbmQuUHJvamVjdFR5cGU+Q3BwU3RhdGljTGlicmFyeTwvQm9ybGFuZC5Qcm9qZWN0VHlwZT4KKyAgICA8Qm9ybGFuZFByb2plY3Q+Cis8Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPgorICAgICAgCisgICAgICAKKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPgorICAgICAgPEV4Y2x1ZGVkX1BhY2thZ2VzIE5hbWU9IiQoQkRTKVxiaW5cYmNib2ZmaWNleHAxMDAuYnBsIj5Db2RlR2VhciBDKytCdWlsZGVyIE9mZmljZSBYUCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPgorICAgIDwvRXhjbHVkZWRfUGFja2FnZXM+PExpbmtlcj48TGlua2VyIE5hbWU9IkxpYlByZWZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJTdWZmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliVmVyc2lvbiI+PC9MaW5rZXI+PC9MaW5rZXI+PFByb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJBdXRvU2hvd0RlcHMiPkZhbHNlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iTWFuYWdlUGF0aHMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJWZXJpZnlQYWNrYWdlcyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PC9Qcm9qZWN0UHJvcGVydGllcz48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9IkNvdW50Ij4zPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxzcmM7Li5caW5jbHVkZTwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0wIj4zMjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZSBOYW1lPSJJdGVtMSI+MTY8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjwvQ1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcQm9ybGFuZC5DcHAuVGFyZ2V0cyIgLz4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LWRlYXRoLXRlc3QuaCI+CisgICAgICA8QnVpbGRPcmRlcj4zPC9CdWlsZE9yZGVyPgorICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LW1lc3NhZ2UuaCI+CisgICAgICA8QnVpbGRPcmRlcj40PC9CdWlsZE9yZGVyPgorICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXBhcmFtLXRlc3QuaCI+CisgICAgICA8QnVpbGRPcmRlcj41PC9CdWlsZE9yZGVyPgorICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXNwaS5oIj4KKyAgICAgIDxCdWlsZE9yZGVyPjY8L0J1aWxkT3JkZXI+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3QtdGVzdC1wYXJ0LmgiPgorICAgICAgPEJ1aWxkT3JkZXI+NzwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC10eXBlZC10ZXN0LmgiPgorICAgICAgPEJ1aWxkT3JkZXI+ODwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC5oIj4KKyAgICAgIDxCdWlsZE9yZGVyPjA8L0J1aWxkT3JkZXI+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3RfcHJlZF9pbXBsLmgiPgorICAgICAgPEJ1aWxkT3JkZXI+MTwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdF9wcm9kLmgiPgorICAgICAgPEJ1aWxkT3JkZXI+MjwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiPgorICAgICAgPEJ1aWxkT3JkZXI+OTwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1maWxlcGF0aC5oIj4KKyAgICAgIDxCdWlsZE9yZGVyPjEwPC9CdWlsZE9yZGVyPgorICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LWludGVybmFsLmgiPgorICAgICAgPEJ1aWxkT3JkZXI+MTE8L0J1aWxkT3JkZXI+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtbGlua2VkX3B0ci5oIj4KKyAgICAgIDxCdWlsZE9yZGVyPjEyPC9CdWlsZE9yZGVyPgorICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgiPgorICAgICAgPEJ1aWxkT3JkZXI+MTQ8L0J1aWxkT3JkZXI+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtcGFyYW0tdXRpbC5oIj4KKyAgICAgIDxCdWlsZE9yZGVyPjEzPC9CdWlsZE9yZGVyPgorICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBvcnQuaCI+CisgICAgICA8QnVpbGRPcmRlcj4xNTwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1zdHJpbmcuaCI+CisgICAgICA8QnVpbGRPcmRlcj4xNjwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC10eXBlLXV0aWwuaCI+CisgICAgICA8QnVpbGRPcmRlcj4xNzwvQnVpbGRPcmRlcj4KKyAgICA8L05vbmU+CisgICAgPENwcENvbXBpbGUgSW5jbHVkZT0iZ3Rlc3RfYWxsLmNjIj4KKyAgICAgIDxCdWlsZE9yZGVyPjE4PC9CdWlsZE9yZGVyPgorICAgIDwvQ3BwQ29tcGlsZT4KKyAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KKyAgICAgIDxLZXk+Q2ZnXzE8L0tleT4KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KKyAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgorICAgICAgPEtleT5DZmdfMjwvS2V5PgorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvZGVnZWFyL2d0ZXN0Lmdyb3VwcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OWY0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvZGVnZWFyL2d0ZXN0Lmdyb3VwcHJvagpAQCAtMCwwICsxLDU0IEBACivvu788UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByb2plY3RHdWlkPntjMWQ5MjNlMC02Y2JhLTQzMzItOWI2Zi0zNDIwYWNiZjUwOTF9PC9Qcm9qZWN0R3VpZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwIC8+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RzIEluY2x1ZGU9Imd0ZXN0LmNicHJvaiIgLz4KKyAgICA8UHJvamVjdHMgSW5jbHVkZT0iZ3Rlc3RfbWFpbi5jYnByb2oiIC8+CisgICAgPFByb2plY3RzIEluY2x1ZGU9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWZhdWx0LlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorICAgIDxCb3JsYW5kLlByb2plY3RUeXBlIC8+CisgICAgPEJvcmxhbmRQcm9qZWN0PgorPEJvcmxhbmRQcm9qZWN0IHhtbG5zPSIiPjxEZWZhdWx0LlBlcnNvbmFsaXR5PjwvRGVmYXVsdC5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+CisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3QiPgorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdC5jYnByb2oiIFRhcmdldHM9IiIgLz4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3Q6Q2xlYW4iPgorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdC5jYnByb2oiIFRhcmdldHM9IkNsZWFuIiAvPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJndGVzdDpNYWtlIj4KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3QuY2Jwcm9qIiBUYXJnZXRzPSJNYWtlIiAvPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJndGVzdF9tYWluIj4KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfbWFpbi5jYnByb2oiIFRhcmdldHM9IiIgLz4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfbWFpbjpDbGVhbiI+CisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X21haW4uY2Jwcm9qIiBUYXJnZXRzPSJDbGVhbiIgLz4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfbWFpbjpNYWtlIj4KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfbWFpbi5jYnByb2oiIFRhcmdldHM9Ik1ha2UiIC8+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X3VuaXR0ZXN0Ij4KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiBUYXJnZXRzPSIiIC8+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X3VuaXR0ZXN0OkNsZWFuIj4KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiBUYXJnZXRzPSJDbGVhbiIgLz4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfdW5pdHRlc3Q6TWFrZSI+CisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iTWFrZSIgLz4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQnVpbGQiPgorICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9Imd0ZXN0O2d0ZXN0X21haW47Z3Rlc3RfdW5pdHRlc3QiIC8+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkNsZWFuIj4KKyAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJndGVzdDpDbGVhbjtndGVzdF9tYWluOkNsZWFuO2d0ZXN0X3VuaXR0ZXN0OkNsZWFuIiAvPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJNYWtlIj4KKyAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJndGVzdDpNYWtlO2d0ZXN0X21haW46TWFrZTtndGVzdF91bml0dGVzdDpNYWtlIiAvPgorICA8L1RhcmdldD4KKyAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkQmluUGF0aClcQm9ybGFuZC5Hcm91cC5UYXJnZXRzJykiIFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuR3JvdXAuVGFyZ2V0cyIgLz4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvZGVnZWFyL2d0ZXN0X2FsbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvY29kZWdlYXIvZ3Rlc3RfYWxsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2FkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvZGVnZWFyL2d0ZXN0X2FsbC5jYwpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBKb3NoIEtlbGxleSAoam9zaGtlbEBnbWFpbC5jb20pCisvLworLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gQysrQnVpbGRlcidzIElERSBjYW5ub3QgYnVpbGQgYSBzdGF0aWMgbGlicmFyeSBmcm9tIGZpbGVzIHdpdGggaHlwaGVucworLy8gaW4gdGhlaXIgbmFtZS4gIFNlZSBodHRwOi8vcWMuY29kZWdlYXIuY29tL3djL3FjbWFpbi5hc3B4P2Q9NzA5NzcgLgorLy8gVGhpcyBmaWxlIHNlcnZlcyBhcyBhIHdvcmthcm91bmQuCisKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtYWxsLmNjIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb2RlZ2Vhci9ndGVzdF9saW5rLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb2RlZ2Vhci9ndGVzdF9saW5rLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvZGVnZWFyL2d0ZXN0X2xpbmsuY2MKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogSm9zaCBLZWxsZXkgKGpvc2hrZWxAZ21haWwuY29tKQorLy8KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIExpbmtzIGd0ZXN0LmxpYiBhbmQgZ3Rlc3RfbWFpbi5saWIgaW50byB0aGUgY3VycmVudCBwcm9qZWN0IGluIEMrK0J1aWxkZXIuCisvLyBUaGlzIG1lYW5zIHRoYXQgdGhlc2UgbGlicmFyaWVzIGNhbid0IGJlIHJlbmFtZWQsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSB0bworLy8gZW5zdXJlIHRoYXQgRGVidWcgdmVyc3VzIFJlbGVhc2UgdGVzdCBidWlsZHMgYXJlIGxpbmtlZCBhZ2FpbnN0IHRoZQorLy8gYXBwcm9wcmlhdGUgRGVidWcgb3IgUmVsZWFzZSBidWlsZCBvZiB0aGUgbGlicmFyaWVzLgorCisjcHJhZ21hIGxpbmsgImd0ZXN0LmxpYiIKKyNwcmFnbWEgbGluayAiZ3Rlc3RfbWFpbi5saWIiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvZGVnZWFyL2d0ZXN0X21haW4uY2Jwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWUzMmNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvagpAQCAtMCwwICsxLDgyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcm9qZWN0R3VpZD57YmNhMzdhNzItNWIwNy00NmNmLWI0NGUtODlmOGUwNjQ1MWEyfTwvUHJvamVjdEd1aWQ+CisgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNlJyBvciAnJChCYXNlKSchPScnIj4KKyAgICA8QmFzZT50cnVlPC9CYXNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorICAgIDxCYXNlPnRydWU8L0Jhc2U+CisgICAgPENmZ18xPnRydWU8L0NmZ18xPgorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KKyAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKyAgICA8QkNDX09wdGltaXplRm9yU3BlZWQ+dHJ1ZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+CisgICAgPE91dHB1dEV4dD5saWI8L091dHB1dEV4dD4KKyAgICA8RENDX0NCdWlsZGVyT3V0cHV0PkpQSE5FPC9EQ0NfQ0J1aWxkZXJPdXRwdXQ+CisgICAgPERlZmluZXM+Tk9fU1RSSUNUPC9EZWZpbmVzPgorICAgIDxEeW5hbWljUlRMPnRydWU8L0R5bmFtaWNSVEw+CisgICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPgorICAgIDxQcm9qZWN0VHlwZT5DcHBTdGF0aWNMaWJyYXJ5PC9Qcm9qZWN0VHlwZT4KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+CisgICAgPFBhY2thZ2VJbXBvcnRzPnJ0bC5icGk7dmNsLmJwaTtiY2JpZS5icGk7dmNseC5icGk7dmNsYWN0bmJhbmQuYnBpO3htbHJ0bC5icGk7YmNic21wLmJwaTtkYnJ0bC5icGk7dmNsZGIuYnBpO2JkZXJ0bC5icGk7dmNsZGJ4LmJwaTtkc25hcC5icGk7ZHNuYXBjb24uYnBpO3ZjbGliLmJwaTtpYnhwcmVzcy5icGk7YWRvcnRsLmJwaTtkYnhjZHMuYnBpO2RiZXhwcmVzcy5icGk7RGJ4Q29tbW9uRHJpdmVyLmJwaTt3ZWJzbmFwLmJwaTt2Y2xpZS5icGk7d2ViZHNuYXAuYnBpO2luZXQuYnBpO2luZXRkYmJkZS5icGk7aW5ldGRieHByZXNzLmJwaTtzb2FwcnRsLmJwaTtSYXZlNzVWQ0wuYnBpO3RlZVVJLmJwaTt0ZWUuYnBpO3RlZWRiLmJwaTtJbmR5Q29yZS5icGk7SW5keVN5c3RlbS5icGk7SW5keVByb3RvY29scy5icGk7SW50cmF3ZWJEQl85MF8xMDAuYnBpO0ludHJhd2ViXzkwXzEwMC5icGk7ZGNsWmlwRm9yZ2VkMTEuYnBpO3ZjbFppcEZvcmdlZDExLmJwaTtHUjMyX0JEUzIwMDYuYnBpO0dSMzJfRFNHTl9CRFMyMDA2LmJwaTtKY2wuYnBpO0pjbFZjbC5icGk7SnZDb3JlRDExUi5icGk7SnZTeXN0ZW1EMTFSLmJwaTtKdlN0ZEN0cmxzRDExUi5icGk7SnZBcHBGcm1EMTFSLmJwaTtKdkJhbmRzRDExUi5icGk7SnZEQkQxMVIuYnBpO0p2RGxnc0QxMVIuYnBpO0p2QkRFRDExUi5icGk7SnZDbXBEMTFSLmJwaTtKdkNyeXB0RDExUi5icGk7SnZDdHJsc0QxMVIuYnBpO0p2Q3VzdG9tRDExUi5icGk7SnZEb2NraW5nRDExUi5icGk7SnZEb3ROZXRDdHJsc0QxMVIuYnBpO0p2RURJRDExUi5icGk7SnZHbG9idXNEMTFSLmJwaTtKdkhNSUQxMVIuYnBpO0p2SW50ZXJwcmV0ZXJEMTFSLmJwaTtKdkphbnNEMTFSLmJwaTtKdk1hbmFnZWRUaHJlYWRzRDExUi5icGk7SnZNTUQxMVIuYnBpO0p2TmV0RDExUi5icGk7SnZQYWdlQ29tcHNEMTFSLmJwaTtKdlBsdWdpbkQxMVIuYnBpO0p2UHJpbnRQcmV2aWV3RDExUi5icGk7SnZSdW50aW1lRGVzaWduRDExUi5icGk7SnZUaW1lRnJhbWV3b3JrRDExUi5icGk7SnZWYWxpZGF0b3JzRDExUi5icGk7SnZXaXphcmREMTFSLmJwaTtKdlhQQ3RybHNEMTFSLmJwaTtWY2xTbXAuYnBpO0NFeGNlcHRpb25FeHBlcnQxMS5icGk8L1BhY2thZ2VJbXBvcnRzPgorICAgIDxCQ0Nfd3Bhcj5mYWxzZTwvQkNDX3dwYXI+CisgICAgPEluY2x1ZGVQYXRoPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9JbmNsdWRlUGF0aD4KKyAgICA8QWxsUGFja2FnZUxpYnM+cnRsLmxpYjt2Y2wubGliPC9BbGxQYWNrYWdlTGlicz4KKyAgICA8VExJQl9QYWdlU2l6ZT4zMjwvVExJQl9QYWdlU2l6ZT4KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0lMSU5LX0xpYnJhcnlQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+CisgICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorICAgIDxEQ0NfRGVidWdJbmZvSW5FeGU+dHJ1ZTwvRENDX0RlYnVnSW5mb0luRXhlPgorICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPgorICAgIDxJTElOS19GdWxsRGVidWdJbmZvPnRydWU8L0lMSU5LX0Z1bGxEZWJ1Z0luZm8+CisgICAgPEJDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5mYWxzZTwvQkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPgorICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+CisgICAgPEJDQ19Vc2VSZWdpc3RlclZhcmlhYmxlcz5Ob25lPC9CQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+CisgICAgPERDQ19EZWZpbmU+REVCVUc8L0RDQ19EZWZpbmU+CisgICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPgorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+RGVidWc8L0ludGVybWVkaWF0ZU91dHB1dERpcj4KKyAgICA8VEFTTV9EaXNwbGF5U291cmNlTGluZXM+dHJ1ZTwvVEFTTV9EaXNwbGF5U291cmNlTGluZXM+CisgICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+CisgICAgPEJDQ19EaXNhYmxlT3B0aW1pemF0aW9ucz50cnVlPC9CQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+CisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWJcZGVidWc7JChJTElOS19MaWJyYXJ5UGF0aCk8L0lMSU5LX0xpYnJhcnlQYXRoPgorICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4KKyAgICA8QkNDX1NvdXJjZURlYnVnZ2luZ09uPnRydWU8L0JDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KKyAgICA8RGVmaW5lcz5OREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPlJlbGVhc2U8L0ludGVybWVkaWF0ZU91dHB1dERpcj4KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4KKyAgICA8VEFTTV9EZWJ1Z2dpbmc+Tm9uZTwvVEFTTV9EZWJ1Z2dpbmc+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkNQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisgICAgPEJvcmxhbmQuUHJvamVjdFR5cGU+Q3BwU3RhdGljTGlicmFyeTwvQm9ybGFuZC5Qcm9qZWN0VHlwZT4KKyAgICA8Qm9ybGFuZFByb2plY3Q+Cis8Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPgorICAgICAgPEV4Y2x1ZGVkX1BhY2thZ2VzIE5hbWU9IiQoQkRTKVxiaW5cYmNib2ZmaWNlMmsxMDAuYnBsIj5Db2RlR2VhciBDKytCdWlsZGVyIE9mZmljZSAyMDAwIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+CisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2V4cDEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIFhQIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+CisgICAgPC9FeGNsdWRlZF9QYWNrYWdlcz48TGlua2VyPjxMaW5rZXIgTmFtZT0iTGliUHJlZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlN1ZmZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJWZXJzaW9uIj48L0xpbmtlcj48L0xpbmtlcj48UHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IkF1dG9TaG93RGVwcyI+RmFsc2U8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJNYW5hZ2VQYXRocyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IlZlcmlmeVBhY2thZ2VzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48L1Byb2plY3RQcm9wZXJ0aWVzPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iQ291bnQiPjM8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMSI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMiI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXHNyYzsuLlxpbmNsdWRlPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iSXRlbTAiPk5PX1NUUklDVDwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iSXRlbTAiPjMyPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0xIj4xNjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkNwcC5UYXJnZXRzIiAvPgorICA8SXRlbUdyb3VwPgorICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Ii4uXHNyY1xndGVzdF9tYWluLmNjIj4KKyAgICAgIDxCdWlsZE9yZGVyPjA8L0J1aWxkT3JkZXI+CisgICAgPC9DcHBDb21waWxlPgorICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorICAgICAgPEtleT5DZmdfMTwvS2V5PgorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgorICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisgICAgICA8S2V5PkNmZ18yPC9LZXk+CisgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb2RlZ2Vhci9ndGVzdF91bml0dGVzdC5jYnByb2ogYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvZGVnZWFyL2d0ZXN0X3VuaXR0ZXN0LmNicHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Y3MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb2RlZ2Vhci9ndGVzdF91bml0dGVzdC5jYnByb2oKQEAgLTAsMCArMSw4OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJvamVjdEd1aWQ+e2VlYTYzMzkzLTVhYzUtNGI5Yy04OTA5LWQ3NWZlZjJkYWE0MX08L1Byb2plY3RHdWlkPgorICAgIDxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPlJlbGVhc2U8L0NvbmZpZz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzZScgb3IgJyQoQmFzZSknIT0nJyI+CisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKyAgICA8QmFzZT50cnVlPC9CYXNlPgorICAgIDxDZmdfMT50cnVlPC9DZmdfMT4KKyAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorICAgIDxCYXNlPnRydWU8L0Jhc2U+CisgICAgPENmZ18yPnRydWU8L0NmZ18yPgorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisgICAgPE91dHB1dEV4dD5leGU8L091dHB1dEV4dD4KKyAgICA8QkNDX09wdGltaXplRm9yU3BlZWQ+dHJ1ZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+CisgICAgPERlZmluZXM+Tk9fU1RSSUNUPC9EZWZpbmVzPgorICAgIDxEQ0NfQ0J1aWxkZXJPdXRwdXQ+SlBITkU8L0RDQ19DQnVpbGRlck91dHB1dD4KKyAgICA8RHluYW1pY1JUTD50cnVlPC9EeW5hbWljUlRMPgorICAgIDxJTElOS19PYmplY3RTZWFyY2hQYXRoPi4uXHRlc3Q8L0lMSU5LX09iamVjdFNlYXJjaFBhdGg+CisgICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPgorICAgIDxQcm9qZWN0VHlwZT5DcHBDb25zb2xlQXBwbGljYXRpb248L1Byb2plY3RUeXBlPgorICAgIDxOb1ZDTD50cnVlPC9Ob1ZDTD4KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+CisgICAgPFBhY2thZ2VJbXBvcnRzPnJ0bC5icGk7dmNsLmJwaTtiY2JpZS5icGk7dmNseC5icGk7dmNsYWN0bmJhbmQuYnBpO3htbHJ0bC5icGk7YmNic21wLmJwaTtkYnJ0bC5icGk7dmNsZGIuYnBpO2JkZXJ0bC5icGk7dmNsZGJ4LmJwaTtkc25hcC5icGk7ZHNuYXBjb24uYnBpO3ZjbGliLmJwaTtpYnhwcmVzcy5icGk7YWRvcnRsLmJwaTtkYnhjZHMuYnBpO2RiZXhwcmVzcy5icGk7RGJ4Q29tbW9uRHJpdmVyLmJwaTt3ZWJzbmFwLmJwaTt2Y2xpZS5icGk7d2ViZHNuYXAuYnBpO2luZXQuYnBpO2luZXRkYmJkZS5icGk7aW5ldGRieHByZXNzLmJwaTtzb2FwcnRsLmJwaTtSYXZlNzVWQ0wuYnBpO3RlZVVJLmJwaTt0ZWUuYnBpO3RlZWRiLmJwaTtJbmR5Q29yZS5icGk7SW5keVN5c3RlbS5icGk7SW5keVByb3RvY29scy5icGk7SW50cmF3ZWJEQl85MF8xMDAuYnBpO0ludHJhd2ViXzkwXzEwMC5icGk7SmNsLmJwaTtKY2xWY2wuYnBpO0p2Q29yZUQxMVIuYnBpO0p2U3lzdGVtRDExUi5icGk7SnZTdGRDdHJsc0QxMVIuYnBpO0p2QXBwRnJtRDExUi5icGk7SnZCYW5kc0QxMVIuYnBpO0p2REJEMTFSLmJwaTtKdkRsZ3NEMTFSLmJwaTtKdkJERUQxMVIuYnBpO0p2Q21wRDExUi5icGk7SnZDcnlwdEQxMVIuYnBpO0p2Q3RybHNEMTFSLmJwaTtKdkN1c3RvbUQxMVIuYnBpO0p2RG9ja2luZ0QxMVIuYnBpO0p2RG90TmV0Q3RybHNEMTFSLmJwaTtKdkVESUQxMVIuYnBpO0p2R2xvYnVzRDExUi5icGk7SnZITUlEMTFSLmJwaTtKdkludGVycHJldGVyRDExUi5icGk7SnZKYW5zRDExUi5icGk7SnZNYW5hZ2VkVGhyZWFkc0QxMVIuYnBpO0p2TU1EMTFSLmJwaTtKdk5ldEQxMVIuYnBpO0p2UGFnZUNvbXBzRDExUi5icGk7SnZQbHVnaW5EMTFSLmJwaTtKdlByaW50UHJldmlld0QxMVIuYnBpO0p2UnVudGltZURlc2lnbkQxMVIuYnBpO0p2VGltZUZyYW1ld29ya0QxMVIuYnBpO0p2VmFsaWRhdG9yc0QxMVIuYnBpO0p2V2l6YXJkRDExUi5icGk7SnZYUEN0cmxzRDExUi5icGk7VmNsU21wLmJwaTwvUGFja2FnZUltcG9ydHM+CisgICAgPEJDQ193cGFyPmZhbHNlPC9CQ0Nfd3Bhcj4KKyAgICA8SW5jbHVkZVBhdGg+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTsuLlx0ZXN0Oy4uPC9JbmNsdWRlUGF0aD4KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs7Li5cdGVzdDwvSUxJTktfTGlicmFyeVBhdGg+CisgICAgPE11bHRpdGhyZWFkZWQ+dHJ1ZTwvTXVsdGl0aHJlYWRlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KKyAgICA8QkNDX09wdGltaXplRm9yU3BlZWQ+ZmFsc2U8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPgorICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KKyAgICA8RENDX0RlYnVnSW5mb0luRXhlPnRydWU8L0RDQ19EZWJ1Z0luZm9JbkV4ZT4KKyAgICA8RGVmaW5lcz5fREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4KKyAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPgorICAgIDxCQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+ZmFsc2U8L0JDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4KKyAgICA8SUxJTktfRGlzYWJsZUluY3JlbWVudGFsTGlua2luZz50cnVlPC9JTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPgorICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPgorICAgIDxEQ0NfRGVmaW5lPkRFQlVHPC9EQ0NfRGVmaW5lPgorICAgIDxCQ0NfRGVidWdMaW5lTnVtYmVycz50cnVlPC9CQ0NfRGVidWdMaW5lTnVtYmVycz4KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+CisgICAgPFRBU01fRGlzcGxheVNvdXJjZUxpbmVzPnRydWU8L1RBU01fRGlzcGxheVNvdXJjZUxpbmVzPgorICAgIDxCQ0NfU3RhY2tGcmFtZXM+dHJ1ZTwvQkNDX1N0YWNrRnJhbWVzPgorICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPgorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliXGRlYnVnOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4KKyAgICA8VEFTTV9EZWJ1Z2dpbmc+RnVsbDwvVEFTTV9EZWJ1Z2dpbmc+CisgICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+CisgICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+CisgICAgPEludGVybWVkaWF0ZU91dHB1dERpcj5SZWxlYXNlPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+CisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWJccmVsZWFzZTskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+CisgICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorICAgIDxCb3JsYW5kLlByb2plY3RUeXBlPkNwcENvbnNvbGVBcHBsaWNhdGlvbjwvQm9ybGFuZC5Qcm9qZWN0VHlwZT4KKyAgICA8Qm9ybGFuZFByb2plY3Q+Cis8Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPgorICAgICAgCisgICAgICAKKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPgorICAgICAgPEV4Y2x1ZGVkX1BhY2thZ2VzIE5hbWU9IiQoQkRTKVxiaW5cYmNib2ZmaWNleHAxMDAuYnBsIj5Db2RlR2VhciBDKytCdWlsZGVyIE9mZmljZSBYUCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPgorICAgIDwvRXhjbHVkZWRfUGFja2FnZXM+PExpbmtlcj48TGlua2VyIE5hbWU9IkxpYlByZWZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJTdWZmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliVmVyc2lvbiI+PC9MaW5rZXI+PC9MaW5rZXI+PFByb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJBdXRvU2hvd0RlcHMiPkZhbHNlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iTWFuYWdlUGF0aHMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJWZXJpZnlQYWNrYWdlcyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PC9Qcm9qZWN0UHJvcGVydGllcz48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9IkNvdW50Ij4zPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXGluY2x1ZGU7Li5cdGVzdDsuLjwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0xIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxpbmNsdWRlOy4uXHRlc3Q8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMiI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOy4uXHRlc3Q8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMSI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9Ikl0ZW0yIj4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazskKE9VVFBVVERJUik7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcyBOYW1lPSJDb3VudCI+MjwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcyBOYW1lPSJJdGVtMCI+Tk9fU1RSSUNUPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0xIj5TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjwvQ1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcQm9ybGFuZC5DcHAuVGFyZ2V0cyIgLz4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q3BwQ29tcGlsZSBJbmNsdWRlPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4KKyAgICAgIDxCdWlsZE9yZGVyPjA8L0J1aWxkT3JkZXI+CisgICAgPC9DcHBDb21waWxlPgorICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Imd0ZXN0X2xpbmsuY2MiPgorICAgICAgPEJ1aWxkT3JkZXI+MTwvQnVpbGRPcmRlcj4KKyAgICA8L0NwcENvbXBpbGU+CisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisgICAgICA8S2V5PkNmZ18xPC9LZXk+CisgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+CisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KKyAgICAgIDxLZXk+Q2ZnXzI8L0tleT4KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb25maWd1cmUgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODJhOWEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9jb25maWd1cmUKQEAgLTAsMCArMSwxODIyMiBAQAorIyEgL2Jpbi9zaAorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjggZm9yIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgMS43LjAuCisjCisjIFJlcG9ydCBidWdzIHRvIDxnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20+LgorIworIworIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisjIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisKKworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQorCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIGV4aXQgMQorZmkKKworIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgorIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgorIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAorIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KK2ZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKK2RvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCisgICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCisKKyMgQ0RQQVRILgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCisgIGFzX2JvdXJuZV9jb21wYXRpYmxlPSJpZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorIgorICBhc19yZXF1aXJlZD0iYXNfZm5fcmV0dXJuICgpIHsgKGV4aXQgXCQxKTsgfQorYXNfZm5fc3VjY2VzcyAoKSB7IGFzX2ZuX3JldHVybiAwOyB9Cithc19mbl9mYWlsdXJlICgpIHsgYXNfZm5fcmV0dXJuIDE7IH0KK2FzX2ZuX3JldF9zdWNjZXNzICgpIHsgcmV0dXJuIDA7IH0KK2FzX2ZuX3JldF9mYWlsdXJlICgpIHsgcmV0dXJuIDE7IH0KKworZXhpdGNvZGU9MAorYXNfZm5fc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2FzX2ZuX3JldF9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9yZXRfZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQoraWYgKCBzZXQgeDsgYXNfZm5fcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4gOgorCitlbHNlCisgIGV4aXRjb2RlPTE7IGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgorZmkKK3Rlc3QgeFwkZXhpdGNvZGUgPSB4MCB8fCBleGl0IDEiCisgIGFzX3N1Z2dlc3RlZD0iICBhc19saW5lbm9fMT0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzFhPVwkTElORU5PCisgIGFzX2xpbmVub18yPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMmE9XCRMSU5FTk8KKyAgZXZhbCAndGVzdCBcInhcJGFzX2xpbmVub18xJ1wkYXNfcnVuJ1wiICE9IFwieFwkYXNfbGluZW5vXzInXCRhc19ydW4nXCIgJiYKKyAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSdcJGFzX3J1bicgKyAxXGBcIiA9IFwieFwkYXNfbGluZW5vXzInXCRhc19ydW4nXCInIHx8IGV4aXQgMQorCisgIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCR7QkFTSF9WRVJTSU9OK3NldH1cIiB8fCAoCisgICAgRUNITz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCisgICAgRUNITz1cJEVDSE9cJEVDSE9cJEVDSE9cJEVDSE9cJEVDSE8KKyAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITworICAgIFBBVEg9L2VtcHR5IEZQQVRIPS9lbXB0eTsgZXhwb3J0IFBBVEggRlBBVEgKKyAgICB0ZXN0IFwiWFxgcHJpbnRmICVzIFwkRUNIT1xgXCIgPSBcIlhcJEVDSE9cIiBcXAorICAgICAgfHwgdGVzdCBcIlhcYHByaW50IC1yIC0tIFwkRUNIT1xgXCIgPSBcIlhcJEVDSE9cIiApIHx8IGV4aXQgMQordGVzdCBcJCgoIDEgKyAxICkpID0gMiB8fCBleGl0IDEiCisgIGlmIChldmFsICIkYXNfcmVxdWlyZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitlbHNlCisgIGFzX2hhdmVfcmVxdWlyZWQ9bm8KK2ZpCisgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geHllcyAmJiAoZXZhbCAiJGFzX3N1Z2dlc3RlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKworZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCithc19mb3VuZD1mYWxzZQorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBhc19mb3VuZD06CisgIGNhc2UgJGFzX2RpciBpbiAjKAorCSAvKikKKwkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisJICAgICAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCisJICAgICBhc19zaGVsbD0kYXNfZGlyLyRhc19iYXNlCisJICAgICBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRhc19zaGVsbCBhc19oYXZlX3JlcXVpcmVkPXllcworCQkgICBpZiB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19zdWdnZXN0ZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBicmVhayAyCitmaQorZmkKKwkgICBkb25lOzsKKyAgICAgICBlc2FjCisgIGFzX2ZvdW5kPWZhbHNlCitkb25lCiskYXNfZm91bmQgfHwgeyBpZiB7IHRlc3QgLWYgIiRTSEVMTCIgfHwgdGVzdCAtZiAiJFNIRUxMLmV4ZSI7IH0gJiYKKwkgICAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJFNIRUxMIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kU0hFTEwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2ZpOyB9CitJRlM9JGFzX3NhdmVfSUZTCisKKworICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4gOgorICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQorCSMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCisJIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KKwkjIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCisJQkFTSF9FTlY9L2Rldi9udWxsCisJRU5WPS9kZXYvbnVsbAorCSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorCWV4cG9ydCBDT05GSUdfU0hFTEwKKwljYXNlICQtIGluICMgKCgoKAorCSAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CisJICAqdiogKSBhc19vcHRzPS12IDs7CisJICAqeCogKSBhc19vcHRzPS14IDs7CisJICAqICkgYXNfb3B0cz0gOzsKKwllc2FjCisJZXhlYyAiJENPTkZJR19TSEVMTCIgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQorZmkKKworICAgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geG5vOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiQwOiBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIgorICAkYXNfZWNobyAiJDA6IHRoZSBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiIKKyAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KKyAgICAkYXNfZWNobyAiJDA6IEluIHBhcnRpY3VsYXIsIHpzaCAkWlNIX1ZFUlNJT04gaGFzIGJ1Z3MgYW5kIHNob3VsZCIKKyAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCisgIGVsc2UKKyAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFuZAorJDA6IGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBhYm91dCB5b3VyIHN5c3RlbSwKKyQwOiBpbmNsdWRpbmcgYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcworJDA6IG1lc3NhZ2UuIFRoZW4gaW5zdGFsbCBhIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuCiskMDogdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEgc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLiIKKyAgZmkKKyAgZXhpdCAxCitmaQorZmkKK2ZpCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorZXhwb3J0IFNIRUxMCisjIFVuc2V0IG1vcmUgdmFyaWFibGVzIGtub3duIHRvIGludGVyZmVyZSB3aXRoIGJlaGF2aW9yIG9mIGNvbW1vbiB0b29scy4KK0NMSUNPTE9SX0ZPUkNFPSBHUkVQX09QVElPTlM9Cit1bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIFNoZWxsIEZ1bmN0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyBhc19mbl91bnNldCBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tCisjIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisKKyMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgorYXNfZm5fc2V0X3N0YXR1cyAoKQoreworICByZXR1cm4gJDEKK30gIyBhc19mbl9zZXRfc3RhdHVzCisKKyMgYXNfZm5fZXhpdCBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgorYXNfZm5fZXhpdCAoKQoreworICBzZXQgK2UKKyAgYXNfZm5fc2V0X3N0YXR1cyAkMQorICBleGl0ICQxCit9ICMgYXNfZm5fZXhpdAorCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKKyMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKKyMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgorIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQorIyBpbXBsZW1lbnRhdGlvbnMuCitpZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMSs9XCQyCisgIH0nCitlbHNlCisgIGFzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMT1cJCQxXCQyCisgIH0KK2ZpICMgYXNfZm5fYXBwZW5kCisKKyMgYXNfZm5fYXJpdGggQVJHLi4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCisjIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKKyMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCitpZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD0kKCggJCogKSkKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCisgIH0KK2ZpICMgYXNfZm5fYXJpdGgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKworICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KKyAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKKyAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisgIC4gIi4vJGFzX21lLmxpbmVubyIKKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wJworICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9bG4KKyAgZWxzZQorICAgIGFzX2xuX3M9J2NwIC1wJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCisKK3Rlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKK2V4ZWMgNj4mMQorCisjIE5hbWUgb2YgdGhlIGhvc3QuCisjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCisjCisjIEluaXRpYWxpemF0aW9ucy4KKyMKK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKK2FjX2NsZWFuX2ZpbGVzPQorYWNfY29uZmlnX2xpYm9ial9kaXI9LgorTElCT0JKUz0KK2Nyb3NzX2NvbXBpbGluZz1ubworc3ViZGlycz0KK01GTEFHUz0KK01BS0VGTEFHUz0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9J0dvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsnCitQQUNLQUdFX1RBUk5BTUU9J2d0ZXN0JworUEFDS0FHRV9WRVJTSU9OPScxLjcuMCcKK1BBQ0tBR0VfU1RSSU5HPSdHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIDEuNy4wJworUEFDS0FHRV9CVUdSRVBPUlQ9J2dvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbScKK1BBQ0tBR0VfVVJMPScnCisKK2FjX3VuaXF1ZV9maWxlPSIuL0xJQ0VOU0UiCisjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCithY19pbmNsdWRlc19kZWZhdWx0PSJcCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYiCisKK2FjX3N1YnN0X3ZhcnM9J2FtX19FWEVFWFRfRkFMU0UKK2FtX19FWEVFWFRfVFJVRQorTFRMSUJPQkpTCitMSUJPQkpTCitIQVZFX1BUSFJFQURTX0ZBTFNFCitIQVZFX1BUSFJFQURTX1RSVUUKK1BUSFJFQURfQ0ZMQUdTCitQVEhSRUFEX0xJQlMKK1BUSFJFQURfQ0MKK2FjeF9wdGhyZWFkX2NvbmZpZworSEFWRV9QWVRIT05fRkFMU0UKK0hBVkVfUFlUSE9OX1RSVUUKK1BZVEhPTgorQ1hYQ1BQCitDUFAKK09UT09MNjQKK09UT09MCitMSVBPCitOTUVESVQKK0RTWU1VVElMCitNQU5JRkVTVF9UT09MCitSQU5MSUIKK2FjX2N0X0FSCitBUgorRExMVE9PTAorT0JKRFVNUAorTE5fUworTk0KK2FjX2N0X0RVTVBCSU4KK0RVTVBCSU4KK0xECitGR1JFUAorRUdSRVAKK0dSRVAKK1NFRAoraG9zdF9vcworaG9zdF92ZW5kb3IKK2hvc3RfY3B1Citob3N0CitidWlsZF9vcworYnVpbGRfdmVuZG9yCitidWlsZF9jcHUKK2J1aWxkCitMSUJUT09MCithbV9fZmFzdGRlcENYWF9GQUxTRQorYW1fX2Zhc3RkZXBDWFhfVFJVRQorQ1hYREVQTU9ERQorYWNfY3RfQ1hYCitDWFhGTEFHUworQ1hYCithbV9fZmFzdGRlcENDX0ZBTFNFCithbV9fZmFzdGRlcENDX1RSVUUKK0NDREVQTU9ERQorYW1fX25vZGVwCitBTURFUEJBQ0tTTEFTSAorQU1ERVBfRkFMU0UKK0FNREVQX1RSVUUKK2FtX19xdW90ZQorYW1fX2luY2x1ZGUKK0RFUERJUgorT0JKRVhUCitFWEVFWFQKK2FjX2N0X0NDCitDUFBGTEFHUworTERGTEFHUworQ0ZMQUdTCitDQworYW1fX3VudGFyCithbV9fdGFyCitBTVRBUgorYW1fX2xlYWRpbmdfZG90CitTRVRfTUFLRQorQVdLCitta2Rpcl9wCitNS0RJUl9QCitJTlNUQUxMX1NUUklQX1BST0dSQU0KK1NUUklQCitpbnN0YWxsX3NoCitNQUtFSU5GTworQVVUT0hFQURFUgorQVVUT01BS0UKK0FVVE9DT05GCitBQ0xPQ0FMCitWRVJTSU9OCitQQUNLQUdFCitDWUdQQVRIX1cKK2FtX19pc3JjCitJTlNUQUxMX0RBVEEKK0lOU1RBTExfU0NSSVBUCitJTlNUQUxMX1BST0dSQU0KK3RhcmdldF9hbGlhcworaG9zdF9hbGlhcworYnVpbGRfYWxpYXMKK0xJQlMKK0VDSE9fVAorRUNIT19OCitFQ0hPX0MKK0RFRlMKK21hbmRpcgorbG9jYWxlZGlyCitsaWJkaXIKK3BzZGlyCitwZGZkaXIKK2R2aWRpcgoraHRtbGRpcgoraW5mb2RpcgorZG9jZGlyCitvbGRpbmNsdWRlZGlyCitpbmNsdWRlZGlyCitsb2NhbHN0YXRlZGlyCitzaGFyZWRzdGF0ZWRpcgorc3lzY29uZmRpcgorZGF0YWRpcgorZGF0YXJvb3RkaXIKK2xpYmV4ZWNkaXIKK3NiaW5kaXIKK2JpbmRpcgorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorcHJlZml4CitleGVjX3ByZWZpeAorUEFDS0FHRV9VUkwKK1BBQ0tBR0VfQlVHUkVQT1JUCitQQUNLQUdFX1NUUklORworUEFDS0FHRV9WRVJTSU9OCitQQUNLQUdFX1RBUk5BTUUKK1BBQ0tBR0VfTkFNRQorUEFUSF9TRVBBUkFUT1IKK1NIRUxMJworYWNfc3Vic3RfZmlsZXM9JycKK2FjX3VzZXJfb3B0cz0nCitlbmFibGVfb3B0aW9uX2NoZWNraW5nCitlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZworZW5hYmxlX3NoYXJlZAorZW5hYmxlX3N0YXRpYword2l0aF9waWMKK2VuYWJsZV9mYXN0X2luc3RhbGwKK3dpdGhfZ251X2xkCit3aXRoX3N5c3Jvb3QKK2VuYWJsZV9saWJ0b29sX2xvY2sKK3dpdGhfcHRocmVhZHMKKycKKyAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCitob3N0X2FsaWFzCit0YXJnZXRfYWxpYXMKK0NDCitDRkxBR1MKK0xERkxBR1MKK0xJQlMKK0NQUEZMQUdTCitDWFgKK0NYWEZMQUdTCitDQ0MKK0NQUAorQ1hYQ1BQJworCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorYWNfdW5yZWNvZ25pemVkX29wdHM9CithY191bnJlY29nbml6ZWRfc2VwPQorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2NhY2hlX2ZpbGU9L2Rldi9udWxsCitleGVjX3ByZWZpeD1OT05FCitub19jcmVhdGU9Citub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KKyMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJworZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCitpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworaHRtbGRpcj0nJHtkb2NkaXJ9JworZHZpZGlyPScke2RvY2Rpcn0nCitwZGZkaXI9JyR7ZG9jZGlyfScKK3BzZGlyPScke2RvY2Rpcn0nCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2xvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCisKK2FjX3ByZXY9CithY19kYXNoZGFzaD0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAqPT8qKSBhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqPSkgICBhY19vcHRhcmc9IDs7CisgICopICAgIGFjX29wdGFyZz15ZXMgOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCisgIC0tKQorICAgIGFjX2Rhc2hkYXNoPXllcyA7OworCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CisKKyAgLS1jb25maWctY2FjaGUgfCAtQykKKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAorICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKyAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CisgIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisgICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1kaXNhYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKyAgICBhY19wcmV2PWRvY2RpciA7OworICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworCisgIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCisgICAgYWNfcHJldj1kdmlkaXIgOzsKKyAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKKyAgICBkdmlkaXI9JGFjX29wdGFyZyA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKyAgICBhY19pbml0X2hlbHA9bG9uZyA7OworICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCisgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCisgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCisgICAgYWNfcHJldj1odG1sZGlyIDs7CisgIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAorICB8IC0taHQ9KikKKyAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CisgIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCisgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKKyAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKKworICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorICAgIGFjX3ByZXY9cGRmZGlyIDs7CisgIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCisgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQorICAgIGFjX3ByZXY9cHNkaXIgOzsKKyAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCisgICAgcHNkaXI9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGhvdXQtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJGFjX29wdGlvbicKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKKyAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7CisgICAgZXNhYworICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZworICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7CisKKyAgKikKKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAiJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCisgIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KKyAgICBubykgOzsKKyAgICBmYXRhbCkgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiIDs7CisgICAgKikgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMiA7OworICBlc2FjCitmaQorCisjIENoZWNrIGFsbCBkaXJlY3RvcnkgYXJndW1lbnRzIGZvciBjb25zaXN0ZW5jeS4KK2ZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAorCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKwkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAorCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgICovICkKKyAgICAgIGFjX3ZhbD1gZXhwciAiWCRhY192YWwiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRhY192YWwiIDogJ1hcKC4qXCknYAorICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKKyAgZXNhYworICAjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7CisgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworICBlc2FjCisgIGFzX2ZuX2Vycm9yICQ/ICJleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIgorZG9uZQorCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKKworIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgoraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisgICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQiID4mMgorICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPXllcworICBmaQorZmkKKworYWNfdG9vbF9wcmVmaXg9Cit0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKKworCithY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKK2FjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorICBhc19mbl9lcnJvciAkPyAid29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiCit0ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKKyAgYXNfZm5fZXJyb3IgJD8gInB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIKKworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfbXlzZWxmIiB8fAorJGFzX2V4cHIgWCIkYXNfbXlzZWxmIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX215c2VsZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiCitmaQorYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgorYWNfYWJzX2NvbmZkaXI9YCgKKwljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IGFzX2ZuX2Vycm9yICQ/ICIkYWNfbXNnIgorCXB3ZClgCisjIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgoraWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgorICBzcmNkaXI9LgorZmkKKyMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCisjIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KKyMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgorY2FzZSAkc3JjZGlyIGluCisqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKK2VzYWMKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Citkb25lCisKKyMKKyMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KKyMKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCisgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgIGNhdCA8PF9BQ0VPRgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAxLjcuMCB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nIC4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL2d0ZXN0XQorICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1kdmlkaXI9RElSICAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wZGZkaXI9RElSICAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorCitQcm9ncmFtIG5hbWVzOgorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorICBjYXNlICRhY19pbml0X2hlbHAgaW4KKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgMS43LjA6Ijs7CisgICBlc2FjCisgIGNhdCA8PFxfQUNFT0YKKworT3B0aW9uYWwgRmVhdHVyZXM6CisgIC0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcgIGlnbm9yZSB1bnJlY29nbml6ZWQgLS1lbmFibGUvLS13aXRoIG9wdGlvbnMKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKKyAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnMKKyAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCisgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQorICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdCisgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykKKworT3B0aW9uYWwgUGFja2FnZXM6CisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0td2l0aC1waWNbPVBLR1NdICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoXQorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dCisgIC0td2l0aC1zeXNyb290PURJUiBTZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMgd2l0aGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHRoZSBjb21waWxlcidzIHN5c3Jvb3QgaWYgbm90IHNwZWNpZmllZCkuCisgIC0td2l0aC1wdGhyZWFkcyAgICAgICAgIHVzZSBwdGhyZWFkcyAoZGVmYXVsdCBpcyB5ZXMpCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENYWCAgICAgICAgIEMrKyBjb21waWxlciBjb21tYW5kCisgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorICBDWFhDUFAgICAgICBDKysgcHJlcHJvY2Vzc29yCisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIDxnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20+LgorX0FDRU9GCithY19zdGF0dXM9JD8KK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBjb25maWd1cmUgMS43LjAKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OAorCitDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorX0FDRU9GCisgIGV4aXQKK2ZpCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jb21waWxlCisKKyMgYWNfZm5fY3h4X3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2N4eF90cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2xpbmsKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW4KKyMgSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorI2luY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4gY29uZnRlc3QuaSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY3BwCisKKyMgYWNfZm5fY190cnlfcnVuIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcworIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KK2FjX2ZuX2NfdHJ5X3J1biAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisgICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cworZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9ydW4KKworIyBhY19mbl9jX2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBGVU5DIGV4aXN0cywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5CithY19mbl9jX2NoZWNrX2Z1bmMgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfZnVuYworCisjIGFjX2ZuX2N4eF90cnlfY3BwIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY3h4X3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4gY29uZnRlc3QuaSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICAgYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2N4eF90cnlfY3BwCisKKyMgYWNfZm5fY3h4X3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2N4eF90cnlfbGluayAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2N4eF90cnlfbGluaworY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKworSXQgd2FzIGNyZWF0ZWQgYnkgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAkYXNfbWUgMS43LjAsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitfQUNFT0YKK2V4ZWMgNT4+Y29uZmlnLmxvZworeworY2F0IDw8X0FTVU5BTUUKKyMjIC0tLS0tLS0tLSAjIworIyMgUGxhdGZvcm0uICMjCisjIyAtLS0tLS0tLS0gIyMKKworaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAorCisvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisKK19BU1VOQU1FCisKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICAkYXNfZWNobyAiUEFUSDogJGFzX2RpciIKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCit9ID4mNQorCitjYXQgPiY1IDw8X0FDRU9GCisKKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjIENvcmUgdGVzdHMuICMjCisjIyAtLS0tLS0tLS0tLSAjIworCitfQUNFT0YKKworCisjIEtlZXAgYSB0cmFjZSBvZiB0aGUgY29tbWFuZCBsaW5lLgorIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIFN0cmlwIG91dCAtLXNpbGVudCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb3JkIGl0IGZvciBmdXR1cmUgcnVucy4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGEtY2hhcmFjdGVycy4KKyMgTWFrZSB0d28gcGFzc2VzIHRvIGFsbG93IGZvciBwcm9wZXIgZHVwbGljYXRlLWFyZ3VtZW50IHN1cHByZXNzaW9uLgorYWNfY29uZmlndXJlX2FyZ3M9CithY19jb25maWd1cmVfYXJnczA9CithY19jb25maWd1cmVfYXJnczE9CithY19tdXN0X2tlZXBfbmV4dD1mYWxzZQorZm9yIGFjX3Bhc3MgaW4gMSAyCitkbworICBmb3IgYWNfYXJnCisgIGRvCisgICAgY2FzZSAkYWNfYXJnIGluCisgICAgLW5vLWNyZWF0ZSB8IC0tbm8tYyogfCAtbiB8IC1uby1yZWN1cnNpb24gfCAtLW5vLXIqKSBjb250aW51ZSA7OworICAgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgICBjb250aW51ZSA7OworICAgICpcJyopCisgICAgICBhY19hcmc9YCRhc19lY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBjYXNlICRhY19wYXNzIGluCisgICAgMSkgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzMCAiICckYWNfYXJnJyIgOzsKKyAgICAyKQorICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzMSAiICckYWNfYXJnJyIKKyAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgorCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KKyAgICAgIGVsc2UKKwljYXNlICRhY19hcmcgaW4KKwkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAorCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAorCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAorCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCisJICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgorCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorZG9uZQoreyBhY19jb25maWd1cmVfYXJnczA9OyB1bnNldCBhY19jb25maWd1cmVfYXJnczA7fQoreyBhY19jb25maWd1cmVfYXJnczE9OyB1bnNldCBhY19jb25maWd1cmVfYXJnczE7fQorCisjIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCisjIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQorIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCisjIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KKyMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICB7CisgICAgZWNobworCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIENhY2hlIHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgZWNobworICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisgICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9J1wnJyAnXCcnOyBzZXQpIDI+JjFgIGluICMoCisgICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQorICAgICAgc2VkIC1uIFwKKwkicy8nXCcnLydcJydcXFxcJ1wnJydcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1wnJ1xcMidcJycvcCIKKyAgICAgIDs7ICMoCisgICAgKikKKyAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCisgICAgICA7OworICAgIGVzYWMgfAorICAgIHNvcnQKKykKKyAgICBlY2hvCisKKyAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICBlY2hvCisgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycworICAgIGRvCisgICAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICAgIGNhc2UgJGFjX3ZhbCBpbgorICAgICAgKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworICAgICAgZXNhYworICAgICAgJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgIGRvbmUgfCBzb3J0CisgICAgZWNobworCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorICAgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEZpbGUgc3Vic3RpdHV0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgICBlY2hvCisgICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcworICAgICAgZG8KKwlldmFsIGFjX3ZhbD1cJCRhY192YXIKKwljYXNlICRhY192YWwgaW4KKwkqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisJZXNhYworCSRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICAgIGRvbmUgfCBzb3J0CisgICAgICBlY2hvCisgICAgZmkKKworICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgorICAgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tICMjCisjIyBjb25mZGVmcy5oLiAjIworIyMgLS0tLS0tLS0tLS0gIyMiCisgICAgICBlY2hvCisgICAgICBjYXQgY29uZmRlZnMuaAorICAgICAgZWNobworICAgIGZpCisgICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgorICAgICAgJGFzX2VjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgorICAgICRhc19lY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorICB9ID4mNQorICBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogJiYKKyAgICBybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisgIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IGFzX2ZuX2V4aXQgMScgJGFjX3NpZ25hbAorZG9uZQorYWNfc2lnbmFsPTAKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisKKyRhc19lY2hvICIvKiBjb25mZGVmcy5oICovIiA+IGNvbmZkZWZzLmgKKworIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICIkUEFDS0FHRV9OQU1FIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiRQQUNLQUdFX1NUUklORyIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1VSTCAiJFBBQ0tBR0VfVVJMIgorX0FDRU9GCisKKworIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCisjIFByZWZlciBhbiBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgorYWNfc2l0ZV9maWxlMT1OT05FCithY19zaXRlX2ZpbGUyPU5PTkUKK2lmIHRlc3QgLW4gIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgIyBXZSBkbyBub3Qgd2FudCBhIFBBVEggc2VhcmNoIGZvciBjb25maWcuc2l0ZS4KKyAgY2FzZSAkQ09ORklHX1NJVEUgaW4gIygoCisgICAgLSopICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgICAqLyopIGFjX3NpdGVfZmlsZTE9JENPTkZJR19TSVRFOzsKKyAgICAqKSAgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OworICBlc2FjCitlbGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICBhY19zaXRlX2ZpbGUxPSRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorZWxzZQorICBhY19zaXRlX2ZpbGUxPSRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorICBhY19zaXRlX2ZpbGUyPSRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICIkYWNfc2l0ZV9maWxlMSIgIiRhY19zaXRlX2ZpbGUyIgorZG8KKyAgdGVzdCAieCRhY19zaXRlX2ZpbGUiID0geE5PTkUgJiYgY29udGludWUKKyAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRhY19zaXRlX2ZpbGUiICYmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQorICAgIHNlZCAncy9eL3wgLycgIiRhY19zaXRlX2ZpbGUiID4mNQorICAgIC4gIiRhY19zaXRlX2ZpbGUiIFwKKyAgICAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImZhaWxlZCB0byBsb2FkIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbCBmaWxlcworICAjIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4gIERKR1BQIGVtdWxhdGVzIGl0IGFzIGEgcmVndWxhciBmaWxlLgorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKKyAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKKyAgICBlc2FjCisgIGZpCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgID4kY2FjaGVfZmlsZQorZmkKKworIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQorIyB2YWx1ZS4KK2FjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQorZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQorICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCisgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KKyAgICBzZXQsKQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsc2V0KQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICwpOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgorCSMgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSBkbyBub3QgbGVhZCB0byBmYWlsdXJlLgorCWFjX29sZF92YWxfdz1gZWNobyB4ICRhY19vbGRfdmFsYAorCWFjX25ld192YWxfdz1gZWNobyB4ICRhY19uZXdfdmFsYAorCWlmIHRlc3QgIiRhY19vbGRfdmFsX3ciICE9ICIkYWNfbmV3X3ZhbF93IjsgdGhlbgorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKwkgIGFjX2NhY2hlX2NvcnJ1cHRlZD06CisJZWxzZQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKwkgIGV2YWwgJGFjX3Zhcj1cJGFjX29sZF92YWwKKwlmaQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjI7fQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjI7fQorICAgICAgZmk7OworICBlc2FjCisgICMgUGFzcyBwcmVjaW91cyB2YXJpYWJsZXMgdG8gY29uZmlnLnN0YXR1cy4KKyAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCisgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorICAgICpcJyopIGFjX2FyZz0kYWNfdmFyPWAkYXNfZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCisgICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KKyAgICAgICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIgOzsKKyAgICBlc2FjCisgIGZpCitkb25lCitpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIGFzX2ZuX2Vycm9yICQ/ICJydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiAiJExJTkVOTyIgNQorZmkKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWluIGJvZHkgb2Ygc2NyaXB0LiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworIyBQcm92aWRlIHZhcmlvdXMgb3B0aW9ucyB0byBpbml0aWFsaXplIHRoZSBBdXRvY29uZiBhbmQgY29uZmlndXJlIHByb2Nlc3Nlcy4KKworCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGJ1aWxkLWF1eCAiJHNyY2RpciIvYnVpbGQtYXV4OyBkbworICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIGJ1aWxkLWF1eCBcIiRzcmNkaXJcIi9idWlsZC1hdXgiICIkTElORU5PIiA1CitmaQorCisjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKyMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KKyMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQorIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCisKKworYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBidWlsZC1hdXgvY29uZmlnLmgiCisKK2FjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSIKKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIHNjcmlwdHMvZ3Rlc3QtY29uZmlnIgorCisKKyMgSW5pdGlhbGl6ZSBBdXRvbWFrZSB3aXRoIHZhcmlvdXMgb3B0aW9ucy4gV2UgcmVxdWlyZSBhdCBsZWFzdCB2MS45LCBwcmV2ZW50CisjIHBlZGFudGljIGNvbXBsYWludHMgYWJvdXQgcGFja2FnZSBmaWxlcywgYW5kIGVuYWJsZSB2YXJpb3VzIGRpc3RyaWJ1dGlvbgorIyB0YXJnZXRzLgorYW1fX2FwaV92ZXJzaW9uPScxLjExJworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCisjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4gIygoCisgIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bworCSAgICBta2RpciBjb25mdGVzdC5kaXIKKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworCSAgICB0aGVuCisJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICAgIGJyZWFrIDMKKwkgICAgZmkKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKKworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK3JtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAiID4mNjsgfQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBSZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMgaW4gJHNyY2RpciBvciB0aGUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkKKyMgbmFtZS4gIEFjY2VwdCBzcGFjZSBhbmQgdGFiIG9ubHkgaW4gdGhlIGxhdHRlci4KK2FtX2xmPScKKycKK2Nhc2UgYHB3ZGAgaW4KKyAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZl0qKQorICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnNhZmUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZSIgIiRMSU5FTk8iIDU7OworZXNhYworY2FzZSAkc3JjZGlyIGluCisgICpbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXSopCisgICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBzcmNkaXIgdmFsdWU6IFxgJHNyY2RpciciICIkTElORU5PIiA1OzsKK2VzYWMKKworIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKKyAgIGZpCisgICBybSAtZiBjb25mdGVzdC5maWxlCisgICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAiJExJTkVOTyIgNQorICAgZmkKKworICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIGFzX2ZuX2Vycm9yICQ/ICJuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAiJExJTkVOTyIgNQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9Cit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIERvdWJsZSBhbnkgXCBvciAkLgorIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KK2FjX3NjcmlwdD0ncy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLycKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9YCRhc19lY2hvICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgfCBzZWQgIiRhY19zY3JpcHQiYAorCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCisKK2lmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKKyAgKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKKyAgZXNhYworZmkKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiYyO30KK2ZpCisKK2lmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKKyAgKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKKyAgZXNhYworZmkKKworIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCisjIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCisjIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitTVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKKyRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgorICBhY19jdF9TVFJJUD0kU1RSSVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgorICAgIFNUUklQPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFNUUklQPSRhY19jdF9TVFJJUAorICBmaQorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCisgIGlmICR7YWNfY3ZfcGF0aF9ta2Rpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBta2RpciBnbWtkaXI7IGRvCisJIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCSAgIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH0gfHwgY29udGludWUKKwkgICBjYXNlIGAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLS12ZXJzaW9uIDI+JjFgIGluICMoCisJICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChmaWxldXRpbHMpICc0LjEqKQorCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKKwkgICAgICAgYnJlYWsgMzs7CisJICAgZXNhYworCSBkb25lCisgICAgICAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCisKKyAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBNS0RJUl9QPSIkYWNfY3ZfcGF0aF9ta2RpciAtcCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBNS0RJUl9QIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgTUtESVJfUD0iJGFjX2luc3RhbGxfc2ggLWQiCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKKyRhc19lY2hvICIkTUtESVJfUCIgPiY2OyB9CisKK21rZGlyX3A9IiRNS0RJUl9QIgorY2FzZSAkbWtkaXJfcCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSopIDs7CisgICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKK2VzYWMKKworZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKKyRhc19lY2hvICIkQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KK3NldCB4ICR7TUFLRS1tYWtlfQorYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCitpZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKK1NIRUxMID0gL2Jpbi9zaAorYWxsOgorCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2Nhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgorICAqQEBAJSUlPT8qPUBAQCUlJSopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKKyAgKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Citlc2FjCitybSAtZiBjb25mdGVzdC5tYWtlCitmaQoraWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgIFNFVF9NQUtFPQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworcm0gLXJmIC50c3QgMj4vZGV2L251bGwKK21rZGlyIC50c3QgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLnRzdDsgdGhlbgorICBhbV9fbGVhZGluZ19kb3Q9LgorZWxzZQorICBhbV9fbGVhZGluZ19kb3Q9XworZmkKK3JtZGlyIC50c3QgMj4vZGV2L251bGwKKworaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgorICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAorICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCisgIGFtX19pc3JjPScgLUkkKHNyY2RpciknCisgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAorICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKKyAgZmkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCisKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorIFBBQ0tBR0U9J2d0ZXN0JworIFZFUlNJT049JzEuNy4wJworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorX0FDRU9GCisKKyMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KKworQUNMT0NBTD0ke0FDTE9DQUwtIiR7YW1fbWlzc2luZ19ydW59YWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0ifQorCisKK0FVVE9DT05GPSR7QVVUT0NPTkYtIiR7YW1fbWlzc2luZ19ydW59YXV0b2NvbmYifQorCisKK0FVVE9NQUtFPSR7QVVUT01BS0UtIiR7YW1fbWlzc2luZ19ydW59YXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259In0KKworCitBVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KKworCitNQUtFSU5GTz0ke01BS0VJTkZPLSIke2FtX21pc3NpbmdfcnVufW1ha2VpbmZvIn0KKworIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCisjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAorIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCitBTVRBUj0nJCR7VEFSLXRhcn0nCisKK2FtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nCisKKworCisKKworCisjIENoZWNrIGZvciBwcm9ncmFtcyB1c2VkIGluIGJ1aWxkaW5nIEdvb2dsZSBUZXN0LgorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZmkKKworZmkKKworCit0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorZG9uZQorCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEub3V0LmRTWU0gYS5leGUgYi5vdXQiCisjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCisjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCisjIG9mIGV4ZWV4dC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICIgPiY2OyB9CithY19saW5rX2RlZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAorCisjIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CithY19maWxlcz0iYS5vdXQgY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgorCithY19ybWZpbGVzPQorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCitkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OworICBlc2FjCitkb25lCitybSAtZiAkYWNfcm1maWxlcworCitpZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGlua19kZWZhdWx0IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KKyMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCisjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAorIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KKyMgQXV0b2NvbmYuCitmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKK2RvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQorCTs7CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICouKiApCisJaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87CisJdGhlbiA6OyBlbHNlCisJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJZmkKKwkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKwkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKwkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KKwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKKwkjIGFjdHVhbGx5IHdvcmtpbmcuCisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQordGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9CisKK2Vsc2UKKyAgYWNfZmlsZT0nJworZmkKK2lmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgIkMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQorYWNfZXhlZXh0PSRhY19jdl9leGVleHQKKworcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQoraWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitmaQorcm0gLWYgY29uZnRlc3QgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKK0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7CisgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgY29uZnRlc3Qub3V0IgorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgIGlmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICAgZmkKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1CiskYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNvbmZ0ZXN0Lm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfb2JqZXh0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagoraWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7CisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gKSA7OworICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAorICAgICAgIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitmaQorcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9vYmpleHQiID4mNjsgfQorT0JKRVhUPSRhY19jdl9vYmpleHQKK2FjX29iamV4dD0kT0JKRVhUCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQoraWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZworICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY2NfZz1ubworICAgQ0ZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIENGTEFHUz0iIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCisJIENGTEFHUz0iLWciCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfZyIgPiY2OyB9CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jY19jODkrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9wcm9nX2NjX2M4OT1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCitzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CitGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworc3RhdGljIGNoYXIgKmUgKHAsIGkpCisgICAgIGNoYXIgKipwOworICAgICBpbnQgaTsKK3sKKyAgcmV0dXJuIHBbaV07Cit9CitzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCit7CisgIGNoYXIgKnM7CisgIHZhX2xpc3QgdjsKKyAgdmFfc3RhcnQgKHYscCk7CisgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisgIHZhX2VuZCAodik7CisgIHJldHVybiBzOworfQorCisvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCisgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CisgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCisgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLworI2RlZmluZSBGT08oeCkgJ3gnCitpbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKKworaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CitzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKK3N0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OworaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7CitpbnQgYXJnYzsKK2NoYXIgKiphcmd2OworaW50CittYWluICgpCit7CityZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKKwktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorZG8KKyAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCisgIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisjIEFDX0NBQ0hFX1ZBTAorY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KKyAgeCkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorJGFzX2VjaG8gIm5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKKyAgeG5vKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1CiskYXNfZWNobyAidW5zdXBwb3J0ZWQiID4mNjsgfSA7OworICAqKQorICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Citlc2FjCitpZiB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSB4bm87IHRoZW4gOgorCitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitERVBESVI9IiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiCisKK2FjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZXBmaWxlcyIKKworCithbV9tYWtlPSR7TUFLRS1tYWtlfQorY2F0ID4gY29uZmluYyA8PCAnRU5EJworYW1fX2RvaXQ6CisJQGVjaG8gdGhpcyBpcyB0aGUgYW1fX2RvaXQgdGFyZ2V0CisuUEhPTlk6IGFtX19kb2l0CitFTkQKKyMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICIgPiY2OyB9CithbV9faW5jbHVkZT0iIyIKK2FtX19xdW90ZT0KK19hbV9yZXN1bHQ9bm9uZQorIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2VjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKKyMgSWdub3JlIGFsbCBraW5kcyBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcm9tIGBtYWtlJy4KK2Nhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCisqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKKyAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICBhbV9fcXVvdGU9CisgIF9hbV9yZXN1bHQ9R05VCisgIDs7Citlc2FjCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCisgICAqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKKyAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKKyAgICAgYW1fX3F1b3RlPSJcIiIKKyAgICAgX2FtX3Jlc3VsdD1CU0QKKyAgICAgOzsKKyAgIGVzYWMKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRfYW1fcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkX2FtX3Jlc3VsdCIgPiY2OyB9CitybSAtZiBjb25maW5jIGNvbmZtZgorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZzsKK2ZpCisKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKKyAgYW1fX25vZGVwPSdfbm8nCitmaQorIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBBTURFUF9UUlVFPQorICBBTURFUF9GQUxTRT0nIycKK2Vsc2UKKyAgQU1ERVBfVFJVRT0nIycKKyAgQU1ERVBfRkFMU0U9CitmaQorCisKKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCisgIGZpCisgIGFtX191bml2ZXJzYWw9ZmFsc2UKKyAgY2FzZSAiICRkZXBjYyAiIGluICMoCisgICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7CisgICAgIGVzYWMKKworICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLiAgQWxzbywgc29tZSBJbnRlbAorICAgICMgdmVyc2lvbnMgaGFkIHRyb3VibGUgd2l0aCBvdXRwdXQgaW4gc3ViZGlycworICAgIGFtX19vYmo9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99CisgICAgYW1fX21pbnVzX29iaj0iLW8gJGFtX19vYmoiCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIGdjYykKKyAgICAgICMgVGhpcyBkZXBtb2RlIGNhdXNlcyBhIGNvbXBpbGVyIHJhY2UgaW4gdW5pdmVyc2FsIG1vZGUuCisgICAgICB0ZXN0ICIkYW1fX3VuaXZlcnNhbCIgPSBmYWxzZSB8fCBjb250aW51ZQorICAgICAgOzsKKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG1zdmM3IHwgbXN2Yzdtc3lzIHwgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKKyAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rIGAtYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCisgICAgICAjIG5vdCBydW4geWV0LiAgVGhlc2UgZGVwbW9kZXMgYXJlIGxhdGUgZW5vdWdoIGluIHRoZSBnYW1lLCBhbmQKKyAgICAgICMgc28gd2VhayB0aGF0IHRoZWlyIGZ1bmN0aW9uaW5nIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCisgICAgICBhbV9fb2JqPWNvbmZ0ZXN0LiR7T0JKRVhULW99CisgICAgICBhbV9fbWludXNfb2JqPQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PSRhbV9fb2JqIFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jICRhbV9fbWludXNfb2JqIHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgJGFtX19vYmogc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9CitDQ0RFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKKworIGlmCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCisgIGFtX19mYXN0ZGVwQ0NfVFJVRT0KKyAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0nIycKK2Vsc2UKKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPScjJworICBhbV9fZmFzdGRlcENDX0ZBTFNFPQorZmkKKworCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQoraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJENDQyI7IHRoZW4KKyAgICBDWFg9JENDQworICBlbHNlCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQworICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ1hYPSRhY19jdl9wcm9nX0NYWAoraWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDWFgiID4mNQorJGFzX2VjaG8gIiRDWFgiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorICBhY19jdF9DWFg9JENYWAorICBmb3IgYWNfcHJvZyBpbiBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DWFg9JGFjX2N2X3Byb2dfYWNfY3RfQ1hYCitpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DWFgiID0geDsgdGhlbgorICAgIENYWD0iZysrIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENYWD0kYWNfY3RfQ1hYCisgIGZpCitmaQorCisgIGZpCitmaQorIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIHNlZCAnMTBhXAorLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgorICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlci4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jeHhfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jeHhfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNjsgfQoraWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCisgIEdYWD15ZXMKK2Vsc2UKKyAgR1hYPQorZmkKK2FjX3Rlc3RfQ1hYRkxBR1M9JHtDWFhGTEFHUytzZXR9CithY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2N4eF9nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWc9JGFjX2N4eF93ZXJyb3JfZmxhZworICAgYWNfY3h4X3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jeHhfZz1ubworICAgQ1hYRkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKK2Vsc2UKKyAgQ1hYRkxBR1M9IiIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworCSBDWFhGTEFHUz0iLWciCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2N4eF9nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jeHhfZyIgPiY2OyB9CitpZiB0ZXN0ICIkYWNfdGVzdF9DWFhGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ1hYRkxBR1M9JGFjX3NhdmVfQ1hYRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPQorICBmaQorZmkKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCcuCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKKyAgZmkKKyAgYW1fX3VuaXZlcnNhbD1mYWxzZQorICBjYXNlICIgJGRlcGNjICIgaW4gIygKKyAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKKyAgICAgZXNhYworCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgZ2NjKQorICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KKyAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCisgICAgICA7OworICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9CitDWFhERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCisgIGFtX19mYXN0ZGVwQ1hYX1RSVUU9CisgIGFtX19mYXN0ZGVwQ1hYX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENYWF9UUlVFPScjJworICBhbV9fZmFzdGRlcENYWF9GQUxTRT0KK2ZpCisKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworY2FzZSBgcHdkYCBpbgorICAqXCAqIHwgKlwJKikKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IExpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBcYHB3ZFxgIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IExpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBcYHB3ZFxgIiA+JjI7fSA7OworZXNhYworCisKKworbWFjcm9fdmVyc2lvbj0nMi40LjInCittYWNyb19yZXZpc2lvbj0nMS4zMzM3JworCisKKworCisKKworCisKKworCisKKworCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5FTk8iIDUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9idWlsZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKK2FjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQorY2FzZSAkYWNfY3ZfYnVpbGQgaW4KKyotKi0qKSA7OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNTs7Citlc2FjCitidWlsZD0kYWNfY3ZfYnVpbGQKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl9idWlsZAorc2hpZnQKK2J1aWxkX2NwdT0kMQorYnVpbGRfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgorYnVpbGRfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaG9zdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCisgIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCitlbHNlCisgIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxpYXNgIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2hvc3QgaW4KKyotKi0qKSA7OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiICIkTElORU5PIiA1OzsKK2VzYWMKK2hvc3Q9JGFjX2N2X2hvc3QKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl9ob3N0CitzaGlmdAoraG9zdF9jcHU9JDEKK2hvc3RfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgoraG9zdF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCisjIEJhY2tzbGFzaGlmeSBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluCisjIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFsiYCRcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woWyJgXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KK2RlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKK0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHByaW50IHN0cmluZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHByaW50IHN0cmluZ3MuLi4gIiA+JjY7IH0KKyMgVGVzdCBwcmludCBmaXJzdCwgYmVjYXVzZSBpdCB3aWxsIGJlIGEgYnVpbHRpbiBpZiBwcmVzZW50LgoraWYgdGVzdCAiWGAoIHByaW50IC1yIC0tIC1uICkgMj4vZGV2L251bGxgIiA9IFgtbiAmJiBcCisgICB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludCAtciAtLScKK2VsaWYgdGVzdCAiWGBwcmludGYgJXMgJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50ZiAlc1xuJworZWxzZQorICAjIFVzZSB0aGlzIGZ1bmN0aW9uIGFzIGEgZmFsbGJhY2sgdGhhdCBhbHdheXMgd29ya3MuCisgIGZ1bmNfZmFsbGJhY2tfZWNobyAoKQorICB7CisgICAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKKyQxCitfTFRFQ0hPX0VPRicKKyAgfQorICBFQ0hPPSdmdW5jX2ZhbGxiYWNrX2VjaG8nCitmaQorCisjIGZ1bmNfZWNob19hbGwgYXJnLi4uCisjIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCitmdW5jX2VjaG9fYWxsICgpCit7CisgICAgJEVDSE8gIiIKK30KKworY2FzZSAiJEVDSE8iIGluCisgIHByaW50ZiopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBwcmludGYiID4mNQorJGFzX2VjaG8gInByaW50ZiIgPiY2OyB9IDs7CisgIHByaW50KikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHByaW50IC1yIiA+JjUKKyRhc19lY2hvICJwcmludCAtciIgPiY2OyB9IDs7CisgICopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjYXQiID4mNQorJGFzX2VjaG8gImNhdCIgPiY2OyB9IDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfU0VEKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICAgICAgIGFjX3NjcmlwdD1zL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYi8KKyAgICAgZm9yIGFjX2kgaW4gMSAyIDMgNCA1IDYgNzsgZG8KKyAgICAgICBhY19zY3JpcHQ9IiRhY19zY3JpcHQkYXNfbmwkYWNfc2NyaXB0IgorICAgICBkb25lCisgICAgIGVjaG8gIiRhY19zY3JpcHQiIDI+L2Rldi9udWxsIHwgc2VkIDk5cSA+Y29uZnRlc3Quc2VkCisgICAgIHsgYWNfc2NyaXB0PTsgdW5zZXQgYWNfc2NyaXB0O30KKyAgICAgaWYgdGVzdCAteiAiJFNFRCI7IHRoZW4KKyAgYWNfcGF0aF9TRURfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9TRUQ9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX1NFRCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfU0VEIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfU0VEIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9TRUQKK2Nhc2UgYCIkYWNfcGF0aF9TRUQiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9TRUQiIGFjX3BhdGhfU0VEX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICcnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfU0VEIiAtZiBjb25mdGVzdC5zZWQgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX1NFRF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9TRUQ9IiRhY19wYXRoX1NFRCIKKyAgICAgIGFjX3BhdGhfU0VEX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfU0VEX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9TRUQiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgc2VkIGNvdWxkIGJlIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9TRUQ9JFNFRAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9TRUQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX1NFRCIgPiY2OyB9CisgU0VEPSIkYWNfY3ZfcGF0aF9TRUQiCisgIHJtIC1mIGNvbmZ0ZXN0LnNlZAorCit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfR1JFUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgorICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAorY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisgICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9FR1JFUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCisgICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgorICAgZWxzZQorICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCisgIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAorY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCisgICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0VHUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGVncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKK2ZpCisKKyAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9CisgRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBmZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0ZHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyAnYWIqYycgfCAkR1JFUCAtRiAnYWIqYycgPi9kZXYvbnVsbCAyPiYxCisgICB0aGVuIGFjX2N2X3BhdGhfRkdSRVA9IiRHUkVQIC1GIgorICAgZWxzZQorICAgICBpZiB0ZXN0IC16ICIkRkdSRVAiOyB0aGVuCisgIGFjX3BhdGhfRkdSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBmZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfRkdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0ZHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9GR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0ZHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9GR1JFUAorY2FzZSBgIiRhY19wYXRoX0ZHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0ZHUkVQPSIkYWNfcGF0aF9GR1JFUCIgYWNfcGF0aF9GR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnRkdSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfRkdSRVAiIEZHUkVQIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9GR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9GR1JFUD0iJGFjX3BhdGhfRkdSRVAiCisgICAgICBhY19wYXRoX0ZHUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfRkdSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0ZHUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGZncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9GR1JFUD0kRkdSRVAKK2ZpCisKKyAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0ZHUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9GR1JFUCIgPiY2OyB9CisgRkdSRVA9IiRhY19jdl9wYXRoX0ZHUkVQIgorCisKK3Rlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gIiA+JjY7IH0KKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gJEVDSE8gIiRhY19wcm9nInwgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSAkRUNITyAiJGFjX3Byb2ciIHwgJEdSRVAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gJEVDSE8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gIiA+JjY7IH0KK2ZpCitpZiAke2x0X2N2X3BhdGhfTEQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEIiA+JjUKKyRhc19lY2hvICIkTEQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCit0ZXN0IC16ICIkTEQiICYmIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19nbnVfbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfZ251X2xkIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNjsgfQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSkuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9OTSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgorICBmaQorICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKKyAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKwkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKwkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKwljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCSAgYnJlYWsKKwkgIDs7CisJKikKKwkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSAgKi9kZXYvbnVsbCopCisJICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICAgIGJyZWFrCisJICAgIDs7CisJICAqKQorCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgZG9uZQorICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX05NIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcGF0aF9OTSIgPiY2OyB9CitpZiB0ZXN0ICIkbHRfY3ZfcGF0aF9OTSIgIT0gIm5vIjsgdGhlbgorICBOTT0iJGx0X2N2X3BhdGhfTk0iCitlbHNlCisgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgorICBpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4gOgorICAgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBlbHNlCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBkdW1wYmluICJsaW5rIC1kdW1wIgorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19EVU1QQklOKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuCisgIGFjX2N2X3Byb2dfRFVNUEJJTj0iJERVTVBCSU4iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19EVU1QQklOPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitEVU1QQklOPSRhY19jdl9wcm9nX0RVTVBCSU4KK2lmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERVTVBCSU4iID4mNQorJGFzX2VjaG8gIiREVU1QQklOIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkRFVNUEJJTiIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiREVU1QQklOIjsgdGhlbgorICBhY19jdF9EVU1QQklOPSREVU1QQklOCisgIGZvciBhY19wcm9nIGluIGR1bXBiaW4gImxpbmsgLWR1bXAiCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU49IiRhY19jdF9EVU1QQklOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTj0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRFVNUEJJTj0kYWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOCitpZiB0ZXN0IC1uICIkYWNfY3RfRFVNUEJJTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9EVU1QQklOIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRFVNUEJJTiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfRFVNUEJJTiIgPSB4OyB0aGVuCisgICAgRFVNUEJJTj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBEVU1QQklOPSRhY19jdF9EVU1QQklOCisgIGZpCitmaQorCisgICAgY2FzZSBgJERVTVBCSU4gLXN5bWJvbHMgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKyAgICAqQ09GRiopCisgICAgICBEVU1QQklOPSIkRFVNUEJJTiAtc3ltYm9scyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIERVTVBCSU49OgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9ubV9pbnRlcmZhY2UrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkYWNfY29tcGlsZVwiIiA+JjUpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkTk0gXFxcImNvbmZ0ZXN0LiRhY19vYmpleHRcXFwiXCIiID4mNSkKKyAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiBvdXRwdXRcIiIgPiY1KQorICBjYXQgY29uZnRlc3Qub3V0ID4mNQorICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAiID4mNjsgfQorTE5fUz0kYXNfbG5fcworaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKKyRhc19lY2hvICJubywgdXNpbmcgJExOX1MiID4mNjsgfQorZmkKKworIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3N5c19tYXhfY21kX2xlbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG1pbnQqKQorICAgICMgT24gTWlOVCB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3MyKikKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGEgbG9uZyB0aW1lIG9uIE9TLzIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTIKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKlsJIF0vLydgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4CisgICAgZmkKKyAgICA7OworICAqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gKGdldGNvbmYgQVJHX01BWCkgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICBlbHNlCisgICAgICAjIE1ha2UgdGVzdHN0cmluZyBhIGxpdHRsZSBiaWdnZXIgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggaXQuCisgICAgICAjIGEgMUsgc3RyaW5nIHNob3VsZCBiZSBhIHJlYXNvbmFibGUgc3RhcnQuCisgICAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOyBkbworICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQorICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKKyAgICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICAgIHdoaWxlIHsgdGVzdCAiWCJgZW52IGVjaG8gIiR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCisJICAgICAgICAgPSAiWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciOyB9ID4vZGV2L251bGwgMj4mMSAmJgorCSAgICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAorICAgICAgZG8KKyAgICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgIyBPbmx5IGNoZWNrIHRoZSBzdHJpbmcgbGVuZ3RoIG91dHNpZGUgdGhlIGxvb3AuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgCisgICAgICB0ZXN0c3RyaW5nPQorICAgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbgorICAgICAgIyBtYXNzaXZlIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUKKyAgICAgICMgbGlua2VyLiAgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKworZmkKKworaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIiA+JjUKKyRhc19lY2hvICJub25lIiA+JjY7IH0KK2ZpCittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKworCisKKworCis6ICR7Q1A9ImNwIC1mIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgc29tZSBYU0kgY29uc3RydWN0cyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzLi4uICIgPiY2OyB9CisjIFRyeSBzb21lIFhTSSBmZWF0dXJlcworeHNpX3NoZWxsPW5vCisoIF9sdF9kdW1teT0iYS9iL2MiCisgIHRlc3QgIiR7X2x0X2R1bW15IyMqL30sJHtfbHRfZHVtbXklLyp9LCR7X2x0X2R1bW15Iz8/fSIke19sdF9kdW1teSUiJF9sdF9kdW1teSJ9LCBcCisgICAgICA9IGMsYS9iLGIvYywgXAorICAgICYmIGV2YWwgJ3Rlc3QgJCgoIDEgKyAxICkpIC1lcSAyIFwKKyAgICAmJiB0ZXN0ICIkeyNfbHRfZHVtbXl9IiAtZXEgNScgKSA+L2Rldi9udWxsIDI+JjEgXAorICAmJiB4c2lfc2hlbGw9eWVzCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHhzaV9zaGVsbCIgPiY1CiskYXNfZWNobyAiJHhzaV9zaGVsbCIgPiY2OyB9CisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBcIis9XCIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgXCIrPVwiLi4uICIgPiY2OyB9CitsdF9zaGVsbF9hcHBlbmQ9bm8KKyggZm9vPWJhcjsgc2V0IGZvbyBiYXo7IGV2YWwgIiQxKz1cJDIiICYmIHRlc3QgIiRmb28iID0gYmFyYmF6ICkgXAorICAgID4vZGV2L251bGwgMj4mMSBcCisgICYmIGx0X3NoZWxsX2FwcGVuZD15ZXMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfc2hlbGxfYXBwZW5kIiA+JjUKKyRhc19lY2hvICIkbHRfc2hlbGxfYXBwZW5kIiA+JjY7IH0KKworCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgbHRfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgbHRfdW5zZXQ9ZmFsc2UKK2ZpCisKKworCisKKworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJworICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIGx0X1NQMk5MPSd0ciBcMTAwIFxuJworICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl90b19ob3N0X2ZpbGVfY21kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqLSotY3lnd2luKiApCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMgorICAgICAgICA7OworICAgICAgKiApICMgb3RoZXJ3aXNlLCBhc3N1bWUgKm5peAorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25peF90b193MzIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgKi0qLWN5Z3dpbiogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4KKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqICkgIyB1bmhhbmRsZWQgaG9zdHMgKGFuZCAibm9ybWFsIiBuYXRpdmUgYnVpbGRzKQorICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorICAgIDs7Citlc2FjCisKK2ZpCisKK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQiID4mNjsgfQorCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gdG9vbGNoYWluIGZvcm1hdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjYXNzdW1lIG9yZGluYXJ5IGNyb3NzIHRvb2xzLCBvciBuYXRpdmUgYnVpbGQuCitsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKK2Nhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworZXNhYworCitmaQorCit0b190b29sX2ZpbGVfY21kPSRsdF9jdl90b190b29sX2ZpbGVfY21kCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl90b190b29sX2ZpbGVfY21kIiA+JjY7IH0KKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9sZF9yZWxvYWRfZmxhZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnPSctcicKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNjsgfQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPWZhbHNlCisgICAgZmkKKyAgICA7OworICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKKworCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK09CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAoraWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1CiskYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCisgIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAoraWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KKyAgICBPQkpEVU1QPSJmYWxzZSIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCisgIGZpCitlbHNlCisgIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCitmaQorCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXhbNC05XSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpWzQ1XSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKKyAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGFzc3VtZXMgQlNEIG5tLCBzbyBkaXNhbGxvdyBpdCBpZiB1c2luZyBNUyBkdW1wYmluLgorICBpZiAoIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIkJTRCBubSIgJiYgZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgICMgS2VlcCB0aGlzIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gZnVuY193aW4zMl9saWJpZC4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICBmaQorICA7OworCitjZWdjYyopCisgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hhaWt1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKiB8IGhwdXgxMSopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEZbIC1dWzAtOV1bMC05XSkoLWJpdCk/KCBbTE1dU0IpPyBzaGFyZWQgb2JqZWN0KCBmaWxlKT9bLCAtXSogUEEtUklTQyBbMC05XVwuWzAtOV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV1cLlswLTldKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4WzMtOV0qKQorICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK25ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCisqbnRvKiB8ICpxbngqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKwordHBmKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY2OyB9CisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bXDFdXC9bXDFdXC9nOy9nImAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK2ZpCisKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19ETExUT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorRExMVE9PTD0kYWNfY3ZfcHJvZ19ETExUT09MCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRETExUT09MIiA+JjUKKyRhc19lY2hvICIkRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3RfRExMVE9PTD0kRExMVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSIkYWNfY3RfRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRExMVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9ETExUT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0RMTFRPT0wiID0geDsgdGhlbgorICAgIERMTFRPT0w9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERMTFRPT0w9JGFjX2N0X0RMTFRPT0wKKyAgZmkKK2Vsc2UKKyAgRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2ZpCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gYXNzb2NpYXRlIHJ1bnRpbWUgYW5kIGxpbmsgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0ndW5rbm93bicKKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAjIHR3byBkaWZmZXJlbnQgc2hlbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gbHRtYWluLnNoCisgICMgZGVjaWRlIHdoaWNoIHRvIHVzZSBiYXNlZCBvbiBjYXBhYmlsaXRpZXMgb2YgJERMTFRPT0wKKyAgY2FzZSBgJERMTFRPT0wgLS1oZWxwIDI+JjFgIGluCisgICotLWlkZW50aWZ5LXN0cmljdCopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sKKyAgICA7OworICBlc2FjCisgIDs7CisqKQorICAjIGZhbGxiYWNrOiBhc3N1bWUgbGlua2xpYiBJUyBzaGFyZWRsaWIKKyAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9IiRFQ0hPIgorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiA+JjY7IH0KK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAordGVzdCAteiAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiAmJiBzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kRUNITworCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gYXIKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0FSPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitBUj0kYWNfY3ZfcHJvZ19BUgoraWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFSIiA+JjUKKyRhc19lY2hvICIkQVIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRBUiIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRBUiI7IHRoZW4KKyAgYWNfY3RfQVI9JEFSCisgIGZvciBhY19wcm9nIGluIGFyCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9BUj0kYWNfY3ZfcHJvZ19hY19jdF9BUgoraWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQVIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQVIiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9BUiIgPSB4OyB0aGVuCisgICAgQVI9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIEFSPSRhY19jdF9BUgorICBmaQorZmkKKworOiAke0FSPWFyfQorOiAke0FSX0ZMQUdTPWNydX0KKworCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhcmNoaXZlciBARklMRSBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhcmNoaXZlciBARklMRSBzdXBwb3J0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X2FyX2F0X2ZpbGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9hcl9hdF9maWxlPW5vCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBlY2hvIGNvbmZ0ZXN0LiRhY19vYmpleHQgPiBjb25mdGVzdC5sc3QKKyAgICAgIGx0X2FyX3RyeT0nJEFSICRBUl9GTEFHUyBsaWJjb25mdGVzdC5hIEBjb25mdGVzdC5sc3QgPiY1JworICAgICAgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGx0X2FyX3RyeVwiIjsgfSA+JjUKKyAgKGV2YWwgJGx0X2FyX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIGlmIHRlc3QgIiRhY19zdGF0dXMiIC1lcSAwOyB0aGVuCisJIyBFbnN1cmUgdGhlIGFyY2hpdmVyIGZhaWxzIHVwb24gYm9ndXMgZmlsZSBuYW1lcy4KKwlybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGxpYmNvbmZ0ZXN0LmEKKwl7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkbHRfYXJfdHJ5XCIiOyB9ID4mNQorICAoZXZhbCAkbHRfYXJfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorCWlmIHRlc3QgIiRhY19zdGF0dXMiIC1uZSAwOyB0aGVuCisgICAgICAgICAgbHRfY3ZfYXJfYXRfZmlsZT1ACisgICAgICAgIGZpCisgICAgICBmaQorICAgICAgcm0gLWYgY29uZnRlc3QuKiBsaWJjb25mdGVzdC5hCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXJfYXRfZmlsZSIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FyX2F0X2ZpbGUiID4mNjsgfQorCitpZiB0ZXN0ICJ4JGx0X2N2X2FyX2F0X2ZpbGUiID0geG5vOyB0aGVuCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0KK2Vsc2UKKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9jdl9hcl9hdF9maWxlCitmaQorCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQorJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAoraWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCisgICAgU1RSSVA9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgU1RSSVA9JGFjX2N0X1NUUklQCisgIGZpCitlbHNlCisgIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKK2ZpCisKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgorCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1JBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFOTElCIiA+JjUKKyRhc19lY2hvICIkUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCisgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9SQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorICAgIFJBTkxJQj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorICBmaQorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06CisKKworCisKKworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkdG9vbF9vbGRsaWIiCisgICAgOzsKKyAgKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkdG9vbF9vbGRsaWIiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJHRvb2xfb2xkbGliIgorZmkKKworY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj15ZXMgOzsKKyAgKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249bm8gOzsKK2VzYWMKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW0JDREVHUlNUXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW0JDRFRdJworICA7OworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICBzeW1jb2RlPSdbQUJDREdJU1RXXScKKyAgOzsKK2hwdXgqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJworICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbQkNERUdSU1RdJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW0JDREVHUVJTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW0JEUlRdJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbRFRdJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tEVF0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbQUJEVF0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW0RGTlNUVV0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW0FCQ0RHSVJTVFddJyA7OworZXNhYworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCisjIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpWyBdKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpWyBdKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwobGliW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YCRFQ0hPICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJzY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICAgICMgRmFrZSBpdCBmb3IgZHVtcGJpbiBhbmQgc2F5IFQgZm9yIGFueSBub24tc3RhdGljIGZ1bmN0aW9uCisgICAgIyBhbmQgRCBmb3IgYW55IGdsb2JhbCB2YXJpYWJsZS4KKyAgICAjIEFsc28gZmluZCBDKysgYW5kIF9fZmFzdGNhbGwgc3ltYm9scyBmcm9tIE1TVkMrKywKKyAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgJyJcCisiICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKKyIgICAgIC9eQ09GRiBTWU1CT0wgVEFCTEUve2ZvcihpIGluIGhpZGUpIGRlbGV0ZSBoaWRlW2ldfTsiXAorIiAgICAgL1NlY3Rpb24gbGVuZ3RoIC4qI3JlbG9jcy4qKHBpY2sgYW55KS97aGlkZVtsYXN0X3NlY3Rpb25dPTF9OyJcCisiICAgICBcJCAwIX4vRXh0ZXJuYWwgKlx8L3tuZXh0fTsiXAorIiAgICAgLyAwKyBVTkRFRiAve25leHR9OyAvIFVOREVGIFwoW158XVwpKigpL3tuZXh0fTsiXAorIiAgICAge2lmKGhpZGVbc2VjdGlvbl0pIG5leHR9OyJcCisiICAgICB7Zj0wfTsgXCQgMH4vXChcKS4qXHwve2Y9MX07IHtwcmludGYgZiA/IFwiVCBcIiA6IFwiRCBcIn07IlwKKyIgICAgIHtzcGxpdChcJCAwLCBhLCAvXHx8XHIvKTsgc3BsaXQoYVsyXSwgcyl9OyJcCisiICAgICBzWzFdfi9eW0A/XS97cHJpbnQgc1sxXSwgc1sxXTsgbmV4dH07IlwKKyIgICAgIHNbMV1+cHJmeCB7c3BsaXQoc1sxXSx0LFwiQFwiKTsgcHJpbnQgdFsxXSwgc3Vic3RyKHRbMV0sbGVuZ3RoKHByZngpKX0iXAorIiAgICAgJyBwcmZ4PV4kYWNfc3ltcHJmeCIKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbCSBdXCgkc3ltY29kZSRzeW1jb2RlKlwpWwkgXVsJIF0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisgIGZpCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICcvIF9fZ251X2x0by9kJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitfTFRfRU9GCisKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3RcIiI7IH0gPiY1CisgIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgXD4gJG5saXN0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmICRHUkVQICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgJEdSRVAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxfTFRfRU9GID4gY29uZnRlc3QuJGFjX2V4dAorLyogS2VlcCB0aGlzIGNvZGUgaW4gc3luYyBiZXR3ZWVuIGxpYnRvb2wubTQsIGx0bWFpbiwgbHRfc3lzdGVtLmgsIGFuZCB0ZXN0cy4gICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZSBydW50aW1lCisgICByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24gb24gcHNldWRvLXJlbG9jcy4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2VsaWYgZGVmaW5lZChfX29zZl9fKQorLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YS4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2Vsc2UKKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUIGNvbnN0CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfTFRfRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLworTFRfRExTWU1fQ09OU1Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAgICAgICAqYWRkcmVzczsKK30KK2x0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7CisgIHsgIkBQUk9HUkFNQCIsICh2b2lkICopIDAgfSwKK19MVF9FT0YKKwkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sLyIgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKHZvaWQgKikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK19MVF9FT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X2dsb2JzeW1fc2F2ZV9MSUJTPSRMSUJTCisJICBsdF9nbG9ic3ltX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWciCisJICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKwkgICAgcGlwZV93b3Jrcz15ZXMKKwkgIGZpCisJICBMSUJTPSRsdF9nbG9ic3ltX3NhdmVfTElCUworCSAgQ0ZMQUdTPSRsdF9nbG9ic3ltX3NhdmVfQ0ZMQUdTCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1CisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KiBjb25mdHN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCisKK2ZpCisKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KK2ZpCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGZhaWxlZCIgPiY1CiskYXNfZWNobyAiZmFpbGVkIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG9rIiA+JjUKKyRhc19lY2hvICJvayIgPiY2OyB9CitmaQorCisjIFJlc3BvbnNlIGZpbGUgc3VwcG9ydC4KK2lmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZWxpZiAkTk0gLS1oZWxwIDI+L2Rldi9udWxsIHwgZ3JlcCAnW0BdRklMRScgPi9kZXYvbnVsbDsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzeXNyb290IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzeXNyb290Li4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzcm9vdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3lzcm9vdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc3lzcm9vdDsKK2Vsc2UKKyAgd2l0aF9zeXNyb290PW5vCitmaQorCisKK2x0X3N5c3Jvb3Q9CitjYXNlICR7d2l0aF9zeXNyb290fSBpbiAjKAorIHllcykKKyAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgIGx0X3N5c3Jvb3Q9YCRDQyAtLXByaW50LXN5c3Jvb3QgMj4vZGV2L251bGxgCisgICBmaQorICAgOzsgIygKKyAvKikKKyAgIGx0X3N5c3Jvb3Q9YGVjaG8gIiR3aXRoX3N5c3Jvb3QiIHwgc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgIDs7ICMoCisgbm98JycpCisgICA7OyAjKAorICopCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHt3aXRoX3N5c3Jvb3R9IiA+JjUKKyRhc19lY2hvICIke3dpdGhfc3lzcm9vdH0iID4mNjsgfQorICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBzeXNyb290IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC4iICIkTElORU5PIiA1CisgICA7OworZXNhYworCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7bHRfc3lzcm9vdDotbm99IiA+JjUKKyRhc19lY2hvICIke2x0X3N5c3Jvb3Q6LW5vfSIgPiY2OyB9CisKKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2xpYnRvb2xfbG9jazsKK2ZpCisKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAgICpFTEYtMzIqKQorCUhQVVhfSUE2NF9NT0RFPSIzMiIKKwk7OworICAgICAgKkVMRi02NCopCisJSFBVWF9JQTY0X01PREU9IjY0IgorCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJyNsaW5lICckTElORU5PJyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJzbWlwIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYm1pcG4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGY2NGJtaXAiCisJOzsKKyAgICAgIGVzYWMKKyAgICBlbHNlCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTMyIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtNjQiCisJICA7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworeDg2XzY0LSprZnJlZWJzZCotZ251fHg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfCBcCitzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqfHNwYXJjKi0qbGludXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgICAqMzItYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgOzsKKwkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2NjX25lZWRzX2JlbGYrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCitlbHNlCisgIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjY7IH0KKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgorICAgICAgeWVzKikKKyAgICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICBpPzg2LSotc29sYXJpcyopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmMqLSotc29sYXJpcyopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgIyBHTlUgbGQgMi4yMSBpbnRyb2R1Y2VkIF9zb2wyIGVtdWxhdGlvbnMuICBVc2UgdGhlbSBpZiBhdmFpbGFibGUuCisgICAgICAgIGlmICR7TEQtbGR9IC1WIHwgZ3JlcCBfc29sMiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgICBMRD0iJHtMRC1sZH1fc29sMiIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICopCisJaWYgJHtMRC1sZH0gLTY0IC1yIC1vIGNvbmZ0ZXN0Mi5vIGNvbmZ0ZXN0Lm8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7Citlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1tdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1tdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX01BTklGRVNUX1RPT0w9IiRNQU5JRkVTVF9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTD0iJHthY190b29sX3ByZWZpeH1tdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitNQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRNQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdF9NQU5JRkVTVF9UT09MPSRNQU5JRkVTVF9UT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG10OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X01BTklGRVNUX1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTD0iJGFjX2N0X01BTklGRVNUX1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MPSJtdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9NQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9NQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X01BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9NQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfTUFOSUZFU1RfVE9PTCIgPSB4OyB0aGVuCisgICAgTUFOSUZFU1RfVE9PTD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBNQU5JRkVTVF9UT09MPSRhY19jdF9NQU5JRkVTVF9UT09MCisgIGZpCitlbHNlCisgIE1BTklGRVNUX1RPT0w9IiRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wiCitmaQorCit0ZXN0IC16ICIkTUFOSUZFU1RfVE9PTCIgJiYgTUFOSUZFU1RfVE9PTD1tdAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJE1BTklGRVNUX1RPT0wgaXMgYSBtYW5pZmVzdCB0b29sLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogJE1BTklGRVNUX1RPT0wgJy0/JyIgPiY1CisgICRNQU5JRkVTVF9UT09MICctPycgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgaWYgJEdSRVAgJ01hbmlmZXN0IFRvb2wnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD15ZXMKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNjsgfQoraWYgdGVzdCAieCRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiICE9IHh5ZXM7IHRoZW4KKyAgTUFOSUZFU1RfVE9PTD06CitmaQorCisKKworCisKKworICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kc3ltdXRpbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kc3ltdXRpbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfRFNZTVVUSUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N2X3Byb2dfRFNZTVVUSUw9IiREU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RTWU1VVElMPSIke2FjX3Rvb2xfcHJlZml4fWRzeW11dGlsIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0RTWU1VVElMPSRhY19jdl9wcm9nX0RTWU1VVElMCitpZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRFNZTVVUSUwiID4mNQorJGFzX2VjaG8gIiREU1lNVVRJTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N0X0RTWU1VVElMPSREU1lNVVRJTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRzeW11dGlsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBkc3ltdXRpbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUw9IiRhY19jdF9EU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMPSJkc3ltdXRpbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9EU1lNVVRJTD0kYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTAoraWYgdGVzdCAtbiAiJGFjX2N0X0RTWU1VVElMIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RTWU1VVElMIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRFNZTVVUSUwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9EU1lNVVRJTCIgPSB4OyB0aGVuCisgICAgRFNZTVVUSUw9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRFNZTVVUSUw9JGFjX2N0X0RTWU1VVElMCisgIGZpCitlbHNlCisgIERTWU1VVElMPSIkYWNfY3ZfcHJvZ19EU1lNVVRJTCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1ubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19OTUVESVQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk1FRElUIjsgdGhlbgorICBhY19jdl9wcm9nX05NRURJVD0iJE5NRURJVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX05NRURJVD0iJHthY190b29sX3ByZWZpeH1ubWVkaXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorTk1FRElUPSRhY19jdl9wcm9nX05NRURJVAoraWYgdGVzdCAtbiAiJE5NRURJVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICROTUVESVQiID4mNQorJGFzX2VjaG8gIiROTUVESVQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX05NRURJVCI7IHRoZW4KKyAgYWNfY3RfTk1FRElUPSROTUVESVQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG5tZWRpdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTk1FRElUKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X05NRURJVCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9IiRhY19jdF9OTUVESVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9Im5tZWRpdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9OTUVESVQ9JGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUCitpZiB0ZXN0IC1uICIkYWNfY3RfTk1FRElUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X05NRURJVCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X05NRURJVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X05NRURJVCIgPSB4OyB0aGVuCisgICAgTk1FRElUPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE5NRURJVD0kYWNfY3RfTk1FRElUCisgIGZpCitlbHNlCisgIE5NRURJVD0iJGFjX2N2X3Byb2dfTk1FRElUIgorZmkKKworICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWxpcG8iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bGlwbzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTElQTys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRMSVBPIjsgdGhlbgorICBhY19jdl9wcm9nX0xJUE89IiRMSVBPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfTElQTz0iJHthY190b29sX3ByZWZpeH1saXBvIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0xJUE89JGFjX2N2X3Byb2dfTElQTworaWYgdGVzdCAtbiAiJExJUE8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTElQTyIgPiY1CiskYXNfZWNobyAiJExJUE8iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0xJUE8iOyB0aGVuCisgIGFjX2N0X0xJUE89JExJUE8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsaXBvIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsaXBvOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9MSVBPKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTElQTz0iJGFjX2N0X0xJUE8iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9MSVBPPSJsaXBvIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0xJUE89JGFjX2N2X3Byb2dfYWNfY3RfTElQTworaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfTElQTyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0xJUE8iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9MSVBPIiA9IHg7IHRoZW4KKyAgICBMSVBPPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIExJUE89JGFjX2N0X0xJUE8KKyAgZmkKK2Vsc2UKKyAgTElQTz0iJGFjX2N2X3Byb2dfTElQTyIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfT1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfT1RPT0w9IiRPVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX09UT09MPSIke2FjX3Rvb2xfcHJlZml4fW90b29sIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK09UT09MPSRhY19jdl9wcm9nX09UT09MCitpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1RPT0wiID4mNQorJGFzX2VjaG8gIiRPVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT1RPT0wiOyB0aGVuCisgIGFjX2N0X09UT09MPSRPVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w9IiRhY19jdF9PVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09UT09MPSJvdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9PVE9PTAoraWYgdGVzdCAtbiAiJGFjX2N0X09UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT1RPT0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9PVE9PTCIgPSB4OyB0aGVuCisgICAgT1RPT0w9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT1RPT0w9JGFjX2N0X09UT09MCisgIGZpCitlbHNlCisgIE9UT09MPSIkYWNfY3ZfcHJvZ19PVE9PTCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbDY0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW90b29sNjQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX09UT09MNjQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkT1RPT0w2NCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PVE9PTDY0PSIkT1RPT0w2NCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX09UT09MNjQ9IiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w2NCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitPVE9PTDY0PSRhY19jdl9wcm9nX09UT09MNjQKK2lmIHRlc3QgLW4gIiRPVE9PTDY0IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9UT09MNjQiID4mNQorJGFzX2VjaG8gIiRPVE9PTDY0IiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PVE9PTDY0IjsgdGhlbgorICBhY19jdF9PVE9PTDY0PSRPVE9PTDY0CisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib3Rvb2w2NCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb3Rvb2w2NDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0w2NCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09UT09MNjQ9IiRhY19jdF9PVE9PTDY0IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w2ND0ib3Rvb2w2NCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PVE9PTDY0PSRhY19jdl9wcm9nX2FjX2N0X09UT09MNjQKK2lmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MNjQiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PVE9PTDY0IiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfT1RPT0w2NCIgPSB4OyB0aGVuCisgICAgT1RPT0w2ND0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPVE9PTDY0PSRhY19jdF9PVE9PTDY0CisgIGZpCitlbHNlCisgIE9UT09MNjQ9IiRhY19jdl9wcm9nX09UT09MNjQiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubworICAgICAgaWYgdGVzdCAteiAiJHtMVF9NVUxUSV9NT0RVTEV9IjsgdGhlbgorCSMgQnkgZGVmYXVsdCB3ZSB3aWxsIGFkZCB0aGUgLXNpbmdsZV9tb2R1bGUgZmxhZy4gWW91IGNhbiBvdmVycmlkZQorCSMgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExUX01VTFRJX01PRFVMRQorCSMgbm9uLWVtcHR5IGF0IGNvbmZpZ3VyZSB0aW1lLCBvciBieSBhZGRpbmcgLW11bHRpX21vZHVsZSB0byB0aGUKKwkjIGxpbmsgZmxhZ3MuCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCWVjaG8gImludCBmb28odm9pZCl7cmV0dXJuIDE7fSIgPiBjb25mdGVzdC5jCisJZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKy1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIiA+JjUKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCSMgSWYgdGhlcmUgaXMgYSBub24tZW1wdHkgZXJyb3IgbG9nLCBhbmQgInNpbmdsZV9tb2R1bGUiCisJIyBhcHBlYXJzIGluIGl0LCBhc3N1bWUgdGhlIGZsYWcgY2F1c2VkIGEgbGlua2VyIHdhcm5pbmcKKyAgICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgc2luZ2xlX21vZHVsZSBjb25mdGVzdC5lcnI7IHRoZW4KKwkgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisJIyBPdGhlcndpc2UsIGlmIHRoZSBvdXRwdXQgd2FzIGNyZWF0ZWQgd2l0aCBhIDAgZXhpdCBjb2RlIGZyb20KKwkjIHRoZSBjb21waWxlciwgaXQgd29ya2VkLgorCWVsaWYgdGVzdCAtZiBsaWJjb25mdGVzdC5keWxpYiAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwOyB0aGVuCisJICBsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPXllcworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisJZmkKKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJcm0gLWYgY29uZnRlc3QuKgorICAgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA+JjY7IH0KKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD15ZXMKK2Vsc2UKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNjsgfQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX2ZvcmNlX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9sZF9mb3JjZV9sb2FkPW5vCisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBmb3JjZWRfbG9hZGVkKCkgeyByZXR1cm4gMjt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMgMj4mNQorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mNQorICAgICAgJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8gMj4mNQorICAgICAgZWNobyAiJFJBTkxJQiBsaWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiY1CisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBtYWluKCkgeyByZXR1cm4gMDt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEgMj5jb25mdGVzdC5lcnIKKyAgICAgIF9sdF9yZXN1bHQ9JD8KKyAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyICYmICRHUkVQIGZvcmNlX2xvYWQgY29uZnRlc3QuZXJyOyB0aGVuCisJY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgICAgIGVsaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiY1CisgICAgICBmaQorICAgICAgICBybSAtZiBjb25mdGVzdC5lcnIgbGliY29uZnRlc3QuYSBjb25mdGVzdCBjb25mdGVzdC5jCisgICAgICAgIHJtIC1yZiBjb25mdGVzdC5kU1lNCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA+JjY7IH0KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bOTFdKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKwkxMC5bMDEyXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisJMTAuKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKyAgICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCisgICAgZWxzZQorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IiAmJiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAibm8iOyB0aGVuCisgICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JworICAgIGVsc2UKKyAgICAgIF9sdF9kc3ltdXRpbD0KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gZGxmY24uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCitmdW5jX3N0cmlwbmFtZV9jbmYgKCkKK3sKKyAgY2FzZSAkezJ9IGluCisgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyVcXFxcJHsyfVwkJSUiYDs7CisgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKKyAgZXNhYworfSAjIGZ1bmNfc3RyaXBuYW1lX2NuZgorCisKKworCisKKyMgU2V0IG9wdGlvbnMKKworCisKKyAgICAgICAgZW5hYmxlX2Rsb3Blbj1ubworCisKKyAgZW5hYmxlX3dpbjMyX2RsbD1ubworCisKKyAgICAgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpCisKKworCisKKworCisKKworCisgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc3RhdGljOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmkKKworCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3BpYytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcGljOyBsdF9wPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJHdpdGh2YWwgaW4KKyAgICB5ZXN8bm8pIHBpY19tb2RlPSR3aXRodmFsIDs7CisgICAgKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIGx0X3BrZyBpbiAkd2l0aHZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJGx0X3BrZyIgPSAiWCRsdF9wIjsgdGhlbgorCSAgcGljX21vZGU9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIHBpY19tb2RlPWRlZmF1bHQKK2ZpCisKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0CisKKworCisKKworCisKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9mYXN0X2luc3RhbGw7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworZmkKKworCisKKworCisKKworCisKKworCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRsdG1haW4iCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X29iamRpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHJtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1CiskYXNfZWNobyAiJGx0X2N2X29iamRpciIgPiY2OyB9CitvYmpkaXI9JGx0X2N2X29iamRpcgorCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTFRfT0JKRElSICIkbHRfY3Zfb2JqZGlyLyIKK19BQ0VPRgorCisKKworCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBHbG9iYWwgdmFyaWFibGVzOgorb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX01BR0lDX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGU7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0CisKK2x0X3NhdmVfQ0M9IiRDQyIKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0PSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCisKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBudmNjKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1YY29tcGlsZXIgLWZuby1idWlsdGluJyA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCisgICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCisKKworCisKKworICBsdF9wcm9nX2NvbXBpbGVyX3dsPQorbHRfcHJvZ19jb21waWxlcl9waWM9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KKworCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbMy05XSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVhsaW5rZXIgJworICAgICAgaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iLVhjb21waWxlciAkbHRfcHJvZ19jb21waWxlcl9waWMiCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorICAgICAgZWNjKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgaWNjIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorICAgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisgICAgICBpY2MqIHwgaWZvcnQqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBMYWhleSBGb3J0cmFuIDguMS4KKyAgICAgIGxmOTUqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy0tc2hhcmVkJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctLXN0YXRpYycKKwk7OworICAgICAgbmFnZm9yKikKKwkjIE5BRyBGb3J0cmFuIGNvbXBpbGVyCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLC1XbCwsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZwaWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgIHhsKiB8IGJneGwqIHwgYmdmKiB8IG1waXhsKikKKwkjIElCTSBYTCBDIDguMC9Gb3J0cmFuIDEwLjEsIDExLjEgb24gUFBDIGFuZCBCbHVlR2VuZQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1xcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctcXN0YXRpY2xpbmsnCisJOzsKKyAgICAgICopCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQ2VyZXNcIEZvcnRyYW4qIHwgKlN1bipGb3J0cmFuKlwgWzEtN10uKiB8ICpTdW4qRm9ydHJhbipcIDguWzAtM10qKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCSAgbHRfcHJvZ19jb21waWxlcl93bD0nJworCSAgOzsKKwkqU3VuXCBGKiB8ICpTdW4qRm9ydHJhbiopCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCisJICA7OworCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJICA7OworICAgICAgICAqSW50ZWwqXCBbQ0ZdKkNvbXBpbGVyKikKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKwkgIDs7CisJKlBvcnRsYW5kXCBHcm91cCopCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KiB8IHN1bmY3NyogfCBzdW5mOTAqIHwgc3VuZjk1KikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVBJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtjb25mb3JtX3BpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXBpYycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0KKyAgICA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCisgICAgOzsKK2VzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9waWMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYyIgPiY2OyB9CitsdF9wcm9nX2NvbXBpbGVyX3BpYz0kbHRfY3ZfcHJvZ19jb21waWxlcl9waWMKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzPW5vCisgICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KK2ZpCisKK2ZpCisKKworCisKKworCisKKworCisKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNcIgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRFQ0hPICIkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9CitmaQorCisKKworCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289bm8KKyAgICRSTSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjY7IH0KKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNjsgfQorCisKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKKyRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKKworCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorCisgIHJ1bnBhdGhfdmFyPQorICBhbGxvd191bmRlZmluZWRfZmxhZz0KKyAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisgIGFyY2hpdmVfY21kcz0KKyAgYXJjaGl2ZV9leHBzeW1fY21kcz0KKyAgY29tcGlsZXJfbmVlZHNfb2JqZWN0PW5vCisgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9bm8KKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQorICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGhhcmRjb2RlX2F1dG9tYXRpYz1ubworICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPW5vCisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICBpbmhlcml0X3JwYXRoPW5vCisgIGxpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgorICBtb2R1bGVfY21kcz0KKyAgbW9kdWxlX2V4cHN5bV9jbWRzPQorICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPQorICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0KKyAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQorICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBpbmNsdWRlX2V4cHN5bXM9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgZXhjbHVkZV9leHBzeW1zPSdfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICAjIEV4Y2x1ZGUgc2hhcmVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIHN5bWJvbHMuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIGxpbmtfYWxsX2RlcGxpYnM9bm8KKyAgICA7OworICBlc2FjCisKKyAgbGRfc2hsaWJzPXllcworCisgICMgT24gc29tZSB0YXJnZXRzLCBHTlUgbGQgaXMgY29tcGF0aWJsZSBlbm91Z2ggd2l0aCB0aGUgbmF0aXZlIGxpbmtlcgorICAjIHRoYXQgd2UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgbmF0aXZlIGludGVyZmFjZSBmb3IgYm90aC4KKyAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9bm8KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisJIyBUaGUgQUlYIHBvcnQgb2YgR05VIGxkIGhhcyBhbHdheXMgYXNwaXJlZCB0byBjb21wYXRpYmlsaXR5CisJIyB3aXRoIHRoZSBuYXRpdmUgbGlua2VyLiAgSG93ZXZlciwgYXMgdGhlIHdhcm5pbmcgaW4gdGhlIEdOVSBsZAorCSMgYmxvY2sgc2F5cywgdmVyc2lvbnMgYmVmb3JlIDIuMTkuNSogY291bGRuJ3QgcmVhbGx5IGNyZWF0ZSB3b3JraW5nCisJIyBzaGFyZWQgbGlicmFyaWVzLCByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNlZC4KKwljYXNlIGAkTEQgLXYgMj4mMWAgaW4KKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLjE5LjUqKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuWzItOV0qKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIFszLTldKikgOzsKKwkgICopCisJICAgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwk7OworICAgIGVzYWMKKyAgZmkKKworICBpZiB0ZXN0ICIkbHRfdXNlX2dudV9sZF9pbnRlcmZhY2UiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgKkdOVVwgZ29sZCopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXhbMy05XSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuMTksIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBiaW51dGlscworKioqIDIuMjAgb3IgYWJvdmUsIG9yIG1vZGlmeSB5b3VyIFBBVEggc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLgorKioqIFlvdSB3aWxsIHRoZW4gbmVlZCB0byByZXN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCisKK19MVF9FT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCApIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1hbGwtc3ltYm9scycKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU11bIF0vcy8uKlsgXVwoW14gXSpcKS9cMSBEQVRBLztzL14uKlsgXV9fbm1fX1woW14gXSpcKVsgXVteIF0qL1wxIERBVEEvOy9eSVsgXS9kOy9eW0FJVFddWyBdL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgICBleGNsdWRlX2V4cHN5bXM9J1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZScKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBoYWlrdSopCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgdG1wX2RpZXQ9bm8KKyAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQorCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCisJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubworICAgICAgdGhlbgorCXRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJworCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKKwkJCQkJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJbGY5NSopCQkJCSMgTGFoZXkgRm9ydHJhbiA4LjEKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorCSAgdG1wX3NoYXJlZGZsYWc9Jy0tc2hhcmVkJyA7OworCXhsW2NDXSogfCBiZ3hsW2NDXSogfCBtcGl4bFtjQ10qKSAjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCisJICB0bXBfc2hhcmVkZmxhZz0nLXFta3Nocm9iaicKKwkgIHRtcF9hZGRmbGFnPSA7OworCW52Y2MqKQkjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgY29tcGlsZXJfbmVlZHNfb2JqZWN0PXllcworCSAgOzsKKwllc2FjCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCQkJIyBTdW4gQyA1LjkKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgY29tcGlsZXJfbmVlZHNfb2JqZWN0PXllcworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJZXNhYworCWFyY2hpdmVfY21kcz0nJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworICAgICAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKyAgICAgICAgZmkKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJeGxmKiB8IGJnZiogfCBiZ3hsZiogfCBtcGl4bGYqKQorCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAtLW5vLXdob2xlLWFyY2hpdmUnCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgICRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgIGZpCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG5ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8ICRHUkVQICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKQorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cworCSAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKKwkgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisJICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBsZF9zaGxpYnM9bm8KKwkgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXhbNC05XSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCSMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbAorCSMgZGVmaW5lZCBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KKwlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZWxzZQorCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeFs1LTldKikKKwkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKwkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgYnJlYWsKKwkgIGZpCisJICBkb25lCisJICA7OworCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBhcmNoaXZlX2NtZHM9JycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgZmlsZV9saXN0X3NwZWM9JyR7d2x9LWYsJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgIDoKKwkgIGVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorCWxpbmtfYWxsX2RlcGxpYnM9bm8KKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LWJleHBhbGwnCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1iZXJvaycKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisgICAgICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICAgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoXworZmkKKworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIteiBub2RlZnMiCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoXworZmkKKworCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVybm90b2snCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm9rJworCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBlbHNlCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJGNvbnZlbmllbmNlJworCSAgZmkKKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJzZGlbNDVdKikKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY2wqKQorCSMgTmF0aXZlIE1TVkMKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCWZpbGVfbGlzdF9zcGVjPSdAJworCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgIHNlZCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBlbHNlCisJICAgIHNlZCAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBmaX4KKwkgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgIGxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCApPSd0cnVlJworCWVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisJZXhjbHVkZV9leHBzeW1zPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisJZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEsREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV11bIF0vcy8uKlsgXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCSMgRG9uJ3QgdXNlIHJhbmxpYgorCW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKKwlwb3N0bGlua19jbWRzPSdsdF9vdXRwdXRmaWxlPSJAT1VUUFVUQCJ+CisJICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAqLmV4ZXwqLkVYRSkgOzsKKwkgICAgKikKKwkgICAgICBsdF9vdXRwdXRmaWxlPSIkbHRfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICA7OworCSAgZXNhY34KKwkgIGlmIHRlc3QgIiRNQU5JRkVTVF9UT09MIiAhPSAiOiIgJiYgdGVzdCAtZiAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOyB0aGVuCisJICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgZmknCisJOzsKKyAgICAgICopCisJIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZnVuY19lY2hvX2FsbCAiJGRlcGxpYnMiIHwgJFNFRCAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworCSMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisJb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKKwkjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorCW9sZF9hcmNoaXZlX2NtZHM9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKwllbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKworCisgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgIGhhcmRjb2RlX2RpcmVjdD1ubworICBoYXJkY29kZV9hdXRvbWF0aWM9eWVzCisgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKKyAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlICR7d2x9LWZvcmNlX2xvYWQsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAnCisKKyAgZWxzZQorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScnCisgIGZpCisgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisgICAgYXJjaGl2ZV9jbWRzPSJcJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAkX2x0X2Rhcl9zaW5nbGVfbW9kJHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9jbWRzPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9leHBzeW1fY21kcz0ic2VkIC1lICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorCisgIGVsc2UKKyAgbGRfc2hsaWJzPW5vCisgIGZpCisKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMi4qKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisJaGFyZGNvZGVfZGlyZWN0PXllcworCWhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwloYXJkY29kZV9taW51c19MPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCisJICAjIE9sZGVyIHZlcnNpb25zIG9mIHRoZSAxMS4wMCBjb21waWxlciBkbyBub3QgdW5kZXJzdGFuZCAtYiB5ZXQKKwkgICMgKEhQOTI0NTMtMDEgQS4xMS4wMS4yMCBkb2Vzbid0LCBIUDkyNDUzLTAxIEIuMTEuWC4zNTE3NS0zNTE3Ni5HUCBkb2VzKQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0MgdW5kZXJzdGFuZHMgLWIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHVuZGVyc3RhbmRzIC1iLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfX2IrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgLWIiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9fYiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID0geHllczsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCitlbHNlCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworZmkKKworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgaGFyZGNvZGVfZGlyZWN0PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJICA7OworCSopCisJICBoYXJkY29kZV9kaXJlY3Q9eWVzCisJICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGhvc3Rfb3MgbGlua2VyIGFjY2VwdHMgLWV4cG9ydGVkX3N5bWJvbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworaW50IGZvbyAodm9pZCkgeyByZXR1cm4gMDsgfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPXllcworZWxzZQorICBsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sIiA+JjY7IH0KKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAke3dsfS1leHBvcnRzX2ZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBpbmhlcml0X3JwYXRoPXllcworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwloYXJkY29kZV9kaXJlY3Q9eWVzCisJaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCWhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKwlpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisJZWxzZQorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgICA7OworCSAgZXNhYworCWZpCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFyY2hpdmVfY21kcz0nJEVDSE8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz0nbm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nIC16IGRlZnMnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCXdsYXJjPScke3dsfScKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkqIkNvbXBpbGVycyA1LjAiKikKKwkgIHdsYXJjPScnCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwkqKQorCSAgd2xhcmM9JyR7d2x9JworCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJZWxzZQorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCWxkX3NobGlicz15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLlswMjRdKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS16LG5vZGVmcycKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SLCRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IHgkaG9zdF92ZW5kb3IgPSB4c25pOyB0aGVuCisgICAgICBjYXNlICRob3N0IGluCisgICAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlicyIgPiY1CiskYXNfZWNobyAiJGxkX3NobGlicyIgPiY2OyB9Cit0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKword2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCisKKworCisKKworCisKKworCisKKworCisKKworCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kcyBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworCWlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKwkgIHNvbmFtZT1jb25mdGVzdAorCSAgbGliPWNvbmZ0ZXN0CisJICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgIGRlcGxpYnM9CisJICB3bD0kbHRfcHJvZ19jb21waWxlcl93bAorCSAgcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljCisJICBjb21waWxlcl9mbGFncz0tdgorCSAgbGlua2VyX2ZsYWdzPS12CisJICB2ZXJzdHJpbmc9CisJICBvdXRwdXRfb2JqZGlyPS4KKwkgIGxpYm5hbWU9Y29uZnRlc3QKKwkgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0KKwkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1CisgIChldmFsICRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisJICB0aGVuCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPW5vCisJICBlbHNlCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPXllcworCSAgZmkKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisJZmkKKwkkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNjsgfQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9JGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OworICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7CisgIGVzYWMKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VkX3N0cmlwX2VxPSJzLD1cKFtBLVphLXpdOlwpLFwxLGciIDs7CisgICAgKikgbHRfc2VkX3N0cmlwX2VxPSJzLD0vLC8sZyIgOzsKKyAgZXNhYworICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgYXdrICRsdF9hd2tfYXJnIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAkbHRfc2VkX3N0cmlwX2VxYAorICBjYXNlICRsdF9zZWFyY2hfcGF0aF9zcGVjIGluCisgICpcOyopCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICdzLzsvIC9nJ2AKKyAgICA7OworICAqKQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgIDs7CisgIGVzYWMKKyAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKKyAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCisgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQorICBsdF9tdWx0aV9vc19kaXI9YCRDQyAkQ1BQRkxBR1MgJENGTEFHUyAkTERGTEFHUyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5IDI+L2Rldi9udWxsYAorICBmb3IgbHRfc3lzX3BhdGggaW4gJGx0X3NlYXJjaF9wYXRoX3NwZWM7IGRvCisgICAgaWYgdGVzdCAtZCAiJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiOyB0aGVuCisgICAgICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIgorICAgIGVsc2UKKyAgICAgIHRlc3QgLWQgIiRsdF9zeXNfcGF0aCIgJiYgXAorCWx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoIgorICAgIGZpCisgIGRvbmUKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCBhd2sgJworQkVHSU4ge1JTPSIgIjsgRlM9Ii98XG4iO30geworICBsdF9mb289IiI7CisgIGx0X2NvdW50PTA7CisgIGZvciAobHRfaSA9IE5GOyBsdF9pID4gMDsgbHRfaS0tKSB7CisgICAgaWYgKCRsdF9pICE9ICIiICYmICRsdF9pICE9ICIuIikgeworICAgICAgaWYgKCRsdF9pID09ICIuLiIpIHsKKyAgICAgICAgbHRfY291bnQrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsdF9jb3VudCA9PSAwKSB7CisgICAgICAgICAgbHRfZm9vPSIvIiAkbHRfaSBsdF9mb287CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbHRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobHRfZm9vICE9ICIiKSB7IGx0X2ZyZXFbbHRfZm9vXSsrOyB9CisgIGlmIChsdF9mcmVxW2x0X2Zvb10gPT0gMSkgeyBwcmludCBsdF9mb287IH0KK30nYAorICAjIEFXSyBwcm9ncmFtIGFib3ZlIGVycm9uZW91c2x5IHByZXBlbmRzICcvJyB0byBDOi9kb3MvcGF0aHMKKyAgIyBmb3IgdGhlc2UgaG9zdHMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfFwKKyAgICAgICRTRUQgJ3MsL1woW0EtWmEtel06XCksXDEsZydgIDs7CisgIGVzYWMKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJGx0X05MMlNQYAorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXhbNC05XSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkY2NfYmFzZW5hbWUgaW4KKyAgeWVzLCopCisgICAgIyBnY2MKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBpZiB0ZXN0IC1uICdcJyckc3RyaXBtZSdcJycgJiYgdGVzdCAtbiAnXCcnJHN0cmlwbGliJ1wnJzsgdGhlbgorICAgICAgICBldmFsICdcJyckc3RyaXBsaWIgXCRkbGRpci8kZGxuYW1lJ1wnJyB8fCBleGl0IFwkPzsKKyAgICAgIGZpJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9saWIvdzMyYXBpIgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjZWdjYyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworCisgICosY2wqKQorICAgICMgTmF0aXZlIE1TVkMKKyAgICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uZGxsLmxpYicKKworICAgIGNhc2UgJGJ1aWxkX29zIGluCisgICAgbWluZ3cqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPQorICAgICAgbHRfc2F2ZV9pZnM9JElGUworICAgICAgSUZTPSc7JworICAgICAgZm9yIGx0X3BhdGggaW4gJExJQgorICAgICAgZG8KKyAgICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgICAjIExldCBET1MgdmFyaWFibGUgZXhwYW5zaW9uIHByaW50IHRoZSBzaG9ydCA4LjMgc3R5bGUgZmlsZSBuYW1lLgorICAgICAgICBsdF9wYXRoPWBjZCAiJGx0X3BhdGgiIDI+L2Rldi9udWxsICYmIGNtZCAvL0MgImZvciAlaSBpbiAoIi4iKSBkbyBAZWNobyAlfnNpImAKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjICRsdF9wYXRoIgorICAgICAgZG9uZQorICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgIyBDb252ZXJ0IHRvIE1TWVMgc3R5bGUuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IHNlZCAtZSAnc3xcXFxcfC98ZycgLWUgJ3N8IFxcKFthLXpBLVpdXFwpOnwgL1xcMXxnJyAtZSAnc3xeIHx8J2AKKyAgICAgIDs7CisgICAgY3lnd2luKikKKyAgICAgICMgQ29udmVydCB0byB1bml4IGZvcm0sIHRoZW4gdG8gZG9zIGZvcm0sIHRoZW4gYmFjayB0byB1bml4IGZvcm0KKyAgICAgICMgYnV0IHRoaXMgdGltZSBkb3Mgc3R5bGUgKG5vIHNwYWNlcyEpIHNvIHRoYXQgdGhlIHVuaXggZm9ybSBsb29rcworICAgICAgIyBsaWtlIC9jeWdkcml2ZS9jL1BST0dSQX4xOi9jeWdkci4uLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMSUIiYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLWRvcyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgMj4vZGV2L251bGxgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgOzsKKyAgICAqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkTElCIgorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICAjIEZJWE1FOiBmaW5kIHRoZSBzaG9ydCBuYW1lIG9yIHRoZSBwYXRoIGNvbXBvbmVudHMsIGFzIHNwYWNlcyBhcmUKKyAgICAgICMgY29tbW9uLiAoZS5nLiAiUHJvZ3JhbSBGaWxlcyIgLT4gIlBST0dSQX4xIikKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxpbmsuZXhlJworICAgIDs7CisKKyAgKikKKyAgICAjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisgIGVzYWMKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsyM10uKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIuKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKKyAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgKikgIyBmcm9tIDQuNiBvbiwgYW5kIERyYWdvbkZseQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitoYWlrdSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NSwgLi4uCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICAjIG9yIGZhaWxzIG91dHJpZ2h0LCBzbyBvdmVycmlkZSBhdG9taWNhbGx5OgorICBpbnN0YWxsX292ZXJyaWRlX21vZGU9NTU1CisgIDs7CisKK2ludGVyaXhbMy05XSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIGdsaWJjL0VMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgaWYgJHtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICBzYXZlX2xpYmRpcj0kbGliZGlyCisgICAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJGx0X3Byb2dfY29tcGlsZXJfd2xcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIiCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGlmICAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGw7IHRoZW4gOgorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCitmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgICAgbGliZGlyPSRzYXZlX2xpYmRpcgorCitmaQorCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsJIF0qaHdjYXBbCSBdL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7cy8iLy9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2RlbGYqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KK2hhcmRjb2RlX2FjdGlvbj0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiB8fAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQorJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb24iID4mNjsgfQorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluayB8fAorICAgdGVzdCAiJGluaGVyaXRfcnBhdGgiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKworCisKKworICBpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgICA7OworCisgICopCisgICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2hsX2xvYWQiICJhY19jdl9mdW5jX3NobF9sb2FkIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzaGxfbG9hZCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCitlbHNlCisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImRsb3BlbiIgImFjX2N2X2Z1bmNfZGxvcGVuIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbGRfZGxkX2xpbmsrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxkX2xpbmsgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbGRfbGluayAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPXllcworZWxzZQorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9kbG9wZW5fc2VsZis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9CitfTFRfRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mNSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZj1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKKworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjY7IH0KKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKKyAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQoraW50IGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOworI2VuZGlmCisKK2ludCBmbm9yZCAoKSB7IHJldHVybiA0MjsgfQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZQorICAgICAgICB7CisJICBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSAgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAgICAgZWxzZSBwdXRzIChkbGVycm9yICgpKTsKKwl9CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICByZXR1cm4gc3RhdHVzOworfQorX0xUX0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9CisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgZmkKKyAgICA7OworICAqKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgIDs7CisgIGVzYWMKK2ZpCisKKworCisKKworCisKKworCisKKworCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbNC05XSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9CisKKworCisKK2ZpCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCitDQz0iJGx0X3NhdmVfQ0MiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KKyAgaWYgJHthY19jdl9wcm9nX0NYWENQUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCisKK2ZpCisgIENYWENQUD0kYWNfY3ZfcHJvZ19DWFhDUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1hYQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworZWxzZQorICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKK2ZpCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQorYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9Citjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYPW5vCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPQoraGFyZGNvZGVfZGlyZWN0X0NYWD1ubworaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlX0NYWD1ubworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KK2hhcmRjb2RlX21pbnVzX0xfQ1hYPW5vCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAoraGFyZGNvZGVfYXV0b21hdGljX0NYWD1ubworaW5oZXJpdF9ycGF0aF9DWFg9bm8KK21vZHVsZV9jbWRzX0NYWD0KK21vZHVsZV9leHBzeW1fY21kc19DWFg9CitsaW5rX2FsbF9kZXBsaWJzX0NYWD11bmtub3duCitvbGRfYXJjaGl2ZV9jbWRzX0NYWD0kb2xkX2FyY2hpdmVfY21kcworcmVsb2FkX2ZsYWdfQ1hYPSRyZWxvYWRfZmxhZworcmVsb2FkX2NtZHNfQ1hYPSRyZWxvYWRfY21kcworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPQorZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9DWFg9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBDWFggY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW10pIHsgcmV0dXJuKDApOyB9JworCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKworCisKKworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSAtciBjb25mdGVzdCoKKworCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9JENDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgbHRfc2F2ZV9MRD0kTEQKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBHQ0M9JEdYWAorICBsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorICBsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCisgIGZpCisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wYXRoX0xECisgIGZpCisgIHRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCisgIENDPSR7Q1hYLSJjKysifQorICBDRkxBR1M9JENYWEZMQUdTCisgIGNvbXBpbGVyPSRDQworICBjb21waWxlcl9DWFg9JENDCisgIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCisKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisgICAgIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQorICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9JyAtZm5vLWJ1aWx0aW4nCisgICAgZWxzZQorICAgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9CitmaQoraWYgJHtsdF9jdl9wYXRoX0xEKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1CiskYXNfZWNobyAiJExEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQordGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfZ251X2xkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKKworCisKKworCisgICAgICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKKyAgICAgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDICRwaWNfZmxhZyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgICAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8CisJICAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9CisgICAgICAgIGZpCisgICAgICBlbHNlCisgICAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICAgIHdsYXJjPQorCisgICAgICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBmaQorCisgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCisgICAgZWxzZQorICAgICAgR1hYPW5vCisgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgd2xhcmM9CisgICAgZmkKKworICAgICMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworICAgICAgYWl4WzQtOV0qKQorICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeFs1LTldKikKKwkgICAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICAgICAgY2FzZSAkbGRfZmxhZyBpbgorCSAgICAgICotYnJ0bCopCisJICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICAgICAgYnJlYWsKKwkgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIDs7CisgICAgICAgICAgZXNhYworCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICAgIGZpCisKKyAgICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJworICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYPXllcworICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0nOicKKyAgICAgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisgICAgICAgIGZpbGVfbGlzdF9zcGVjX0NYWD0nJHt3bH0tZiwnCisKKyAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKwkgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF9fQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF9fQ1hYIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoX19DWFgiOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWAorZmkKKworICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iLXogbm9kZWZzIgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgICAgICBlbHNlCisJICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisJICAgIGlmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIGlmICR7bHRfY3ZfYWl4X2xpYnBhdGhfX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWCI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF9fQ1hYIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoX19DWFgKK2ZpCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVybm90b2snCisJICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm9rJworCSAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICBlbHNlCisJICAgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSckY29udmVuaWVuY2UnCisJICAgIGZpCisJICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgICAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkCisJICAgICMgbGlicmFyaWVzLgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIDs7CisKKyAgICAgIGJlb3MqKQorCWlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorCSAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWVsc2UKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisKKyAgICAgIGNob3J1cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgKikKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgbGRfc2hsaWJzX0NYWD1ubworCSAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJY2FzZSAkR1hYLCRjY19iYXNlbmFtZSBpbgorCSxjbCogfCBubyxjbCopCisJICAjIE5hdGl2ZSBNU1ZDCisJICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisJICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyAnCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKKwkgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9eWVzCisJICBmaWxlX2xpc3Rfc3BlY19DWFg9J0AnCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCSAgbGliZXh0PWxpYgorCSAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJICBzaHJleHRfY21kcz0iLmRsbCIKKwkgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgJFNFRCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICAgIGVsc2UKKwkgICAgICAkU0VEIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZml+CisJICAgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgICAgbGlua25hbWVzPScKKwkgICMgVGhlIGxpbmtlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgc3RhdGljIGxpYiBpZiB3ZSBidWlsZCBhIERMTC4KKwkgICMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCBDWFgpPSd0cnVlJworCSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9eWVzCisJICAjIERvbid0IHVzZSByYW5saWIKKwkgIG9sZF9wb3N0aW5zdGFsbF9jbWRzX0NYWD0nY2htb2QgNjQ0ICRvbGRsaWInCisJICBwb3N0bGlua19jbWRzX0NYWD0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICAgKikKKwkJbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCQlsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCQk7OworCSAgICBlc2FjfgorCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGx0X291dHB1dGZpbGUifgorCSAgICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICAgIGZpJworCSAgOzsKKwkqKQorCSAgIyBnKysKKwkgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBDWFgpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorCSAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctTCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCisJICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCisJICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD15ZXMKKworCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBlbHNlCisJICAgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgZml+CisJICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgZmkKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorCisKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgaGFyZGNvZGVfYXV0b21hdGljX0NYWD15ZXMKKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKKyAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworCisgIGVsc2UKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JycKKyAgZmkKKyAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorICAgIGFyY2hpdmVfY21kc19DWFg9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgbW9kdWxlX2NtZHNfQ1hYPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgorICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgZmkKKworICBlbHNlCisgIGxkX3NobGlic19DWFg9bm8KKyAgZmkKKworCTs7CisKKyAgICAgIGRndXgqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGVjKysqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZDIuKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQorCSMgc3dpdGNoIHRvIEVMRgorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QtZWxmKikKKyAgICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAgICAgIyBjb252ZW50aW9ucworICAgICAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgICAgICA7OworCisgICAgICBnbnUqKQorICAgICAgICA7OworCisgICAgICBoYWlrdSopCisgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDkqKQorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKyAgICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkgICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKyAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBhQ0MqKQorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBocHV4MTAqfGhwdXgxMSopCisgICAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworICAgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisJICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCisgICAgICAgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9eWVzCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgIGFDQyopCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgaHBwYSo2NCopCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgIGlhNjQqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICBpYTY0KikKKwkgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgICopCisJICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICBlc2FjCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBpbnRlcml4WzMtOV0qKQorCWhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisgICAgICAgIGluaGVyaXRfcnBhdGhfQ1hYPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqICkKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgd2l0aF9nbnVfbGQ9eWVzCisJICAgICMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJICAgICMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJICAgICMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJICAgIGNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSAgICAgICoiVmVyc2lvbiA3LiIqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgICAqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgICAgICAgdG1wX2lkeW49CisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCQkgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkJZXNhYworCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICBlc2FjCisJICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICA7OworICAgICAgICAgIHBnQ0MqIHwgcGdjcHAqKQorICAgICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgY2FzZSBgJENDIC1WYCBpbgorCSAgICAqcGdDQ1wgWzEtNV0uKiB8ICpwZ2NwcFwgWzEtNV0uKikKKwkgICAgICBwcmVsaW5rX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2JqcyAkbGlib2JqcyAkY29tcGlsZV9kZXBsaWJzfgorCQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAiJworCSAgICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2xkb2JqcyRvbGRfZGVwbGlic34KKwkJJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGB+CisJCSRSQU5MSUIgJG9sZGxpYicKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgKikgIyBWZXJzaW9uIDYgYW5kIGFib3ZlIHVzZSB3ZWFrIHN5bWJvbHMKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICBlc2FjCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCisKKwkgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJworCSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkImA7IHRlbXBsaXN0PWBmdW5jX2VjaG9fYWxsICIkdGVtcGxpc3QiIHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisJICB4bCogfCBtcGl4bCogfCBiZ3hsKikKKwkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQywgd2l0aCBHTlUgbGQKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQljYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQkkQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgICAgZmkKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMnCisJICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwkgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgICAgY29tcGlsZXJfbmVlZHNfb2JqZWN0X0NYWD15ZXMKKworCSAgICAgICMgTm90IHN1cmUgd2hldGhlciBzb21ldGhpbmcgYmFzZWQgb24KKwkgICAgICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCisJICAgICAgIyB3b3VsZCBiZSBiZXR0ZXIuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbHlueG9zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisKKyAgICAgIG04OGsqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworCTs7CisKKyAgICAgIG12cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgY3h4KikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKwkgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIG5ldGJzZCopCisgICAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKwkgIHdsYXJjPQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWZpCisJIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKwk7OworCisgICAgICAqbnRvKiB8ICpxbngqKQorICAgICAgICBsZF9zaGxpYnNfQ1hYPXllcworCTs7CisKKyAgICAgIG9wZW5ic2QyKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgorCWxkX3NobGlic19DWFg9bm8KKwk7OworCisgICAgICBvcGVuYnNkKikKKwlpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCSAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYPXllcworCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworCSAgZmkKKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKKwllbHNlCisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworCisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKSBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgICAgKikgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICBlc2FjCisJICAgIDs7CisgICAgICAgICAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICBjeHgqKQorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopCisJICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCQk7OworCSAgICAgICopCisJICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgICAgICAgICAkUk0gJGxpYi5leHAnCisJICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCisJCTs7CisJICAgIGVzYWMKKworCSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICBvc2YzKikKKwkgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgICAqKQorCSAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICBlc2FjCisKKwkgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBwc29zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgICAgOzsKKworICAgICAgc3Vub3M0KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBzb2xhcmlzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyogfCBzdW5DQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgICAgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisJICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJICAgICAgKikKKwkJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4KKwkgICAgICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJICAgICMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0teiAke3dsfWRlZnMnCisJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGVsc2UKKwkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgICAgICMgcGxhdGZvcm0uCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisJICAgICAgZmkKKworCSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SICR3bCRsaWJkaXInCisJICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCQlzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJCSopCisJCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJCSAgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgQ0MqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorCSMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisJIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworCSMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorCSMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKwkjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKwkjIGFzIC16IGRlZnMuCisJbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LHRleHQnCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LG5vZGVmcycKKwlhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SLCRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCisJbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tQmV4cG9ydCcKKwlydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJG9sZG9ianN+CisJICAgICAgJyIkb2xkX2FyY2hpdmVfY21kc19DWFgiCisJICAgIHJlbG9hZF9jbWRzX0NYWD0nJENDIC1UcHJlbGlua19vYmplY3RzICRyZWxvYWRfb2Jqc34KKwkgICAgICAnIiRyZWxvYWRfY21kc19DWFgiCisJICAgIDs7CisJICAqKQorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJZXNhYworICAgICAgOzsKKworICAgICAgdGFuZGVtKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHZ4d29ya3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworICAgIGVzYWMKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1CiskYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQorICAgIHRlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworICAgIEdDQ19DWFg9IiRHWFgiCisgICAgTERfQ1hYPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICAjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorcHJlZGVwX29iamVjdHNfQ1hYPQorcG9zdGRlcF9vYmplY3RzX0NYWD0KK3ByZWRlcHNfQ1hYPQorcG9zdGRlcHNfQ1hYPQorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0KKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK19MVF9FT0YKKworCitfbHRfbGliZGVwc19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitjYXNlICIkQ0MgJENGTEFHUyAiIGluICMoCisqXCAtZmx0bypcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLWx0byIgOzsKKypcIC1md2hvcHIqXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby13aG9wciIgOzsKKypcIC1mdXNlLWxpbmtlci1wbHVnaW4qXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby11c2UtbGlua2VyLXBsdWdpbiIgOzsKK2VzYWMKKworaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHtwcmV2fSR7cH0gaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgIyBFeHBhbmQgdGhlIHN5c3Jvb3QgdG8gZWFzZSBleHRyYWN0aW5nIHRoZSBkaXJlY3RvcmllcyBsYXRlci4KKyAgICAgICBpZiB0ZXN0IC16ICIkcHJldiI7IHRoZW4KKyAgICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWVfY25mICctTCcgJycgIiRwIjsgcHJldj0tTDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLVInICcnICIkcCI7IHByZXY9LVI7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLWwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1sJyAnJyAiJHAiOyBwcmV2PS1sOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBmaQorICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICA9KikgZnVuY19zdHJpcG5hbWVfY25mICc9JyAnJyAiJHAiOyBwPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICR7cHJldn0gaW4KKwkgLUwgfCAtUikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCI7IHRoZW4KKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJHBvc3RkZXBzX0NYWCI7IHRoZW4KKwkgICBwb3N0ZGVwc19DWFg9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgcG9zdGRlcHNfQ1hYPSIke3Bvc3RkZXBzX0NYWH0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICBwcmV2PQorICAgICAgIDs7CisKKyAgICAqLmx0by4kb2JqZXh0KSA7OyAjIElnbm9yZSBHQ0MgTFRPIG9iamVjdHMKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRwcmVkZXBfb2JqZWN0c19DWFgiOyB0aGVuCisJICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcCIKKwkgZWxzZQorCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHByZWRlcF9vYmplY3RzX0NYWCAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRwb3N0ZGVwX29iamVjdHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwIgorCSBlbHNlCisJICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHBvc3RkZXBfb2JqZWN0c19DWFggJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgQ1hYIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRSTSAtZiBjb25mZXN0LiRvYmpleHQKK0NGTEFHUz0kX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1MKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXhbMy05XSopCisgICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KKyAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KKyAgcHJlZGVwX29iamVjdHNfQ1hYPQorICBwb3N0ZGVwX29iamVjdHNfQ1hYPQorICBwb3N0ZGVwc19DWFg9CisgIDs7CisKK2xpbnV4KikKKyAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisgICpTdW5cIEMqKQorICAgICMgU3VuIEMrKyA1LjkKKworICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgcG9zdGRlcHNfQ1hYPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyogfCBzdW5DQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIHBvc3RkZXBzX0NYWD0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworCisKK2Nhc2UgIiAkcG9zdGRlcHNfQ1hYICIgaW4KKyoiIC1sYyAiKikgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vIDs7Citlc2FjCisgY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD0KK2lmIHRlc3QgLW4gIiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0iOyB0aGVuCisgY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD1gZWNobyAiICR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0iIHwgJHtTRUR9IC1lICdzISAtTCEgIWcnIC1lICdzIV4gISEnYAorZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPQorbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorCisKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgIDs7CisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorICAgICAgOzsKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqcW54KiB8ICpudG8qKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeFs0LTldKikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCWVsc2UKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgQ1hYKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisJIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworCSMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctRERMTF9FWFBPUlQnCisJOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKKwk7OworICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCisJICAgIGZpCisJICAgIDs7CisJICBhQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCp8aWE2NCopCisJICAgICAgIyArWiB0aGUgZGVmYXVsdAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgaW50ZXJpeCopCisJIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCisJIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PworCTs7CisgICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgOzsKKwkgIGVjcGMqICkKKwkgICAgIyBvbGQgSW50ZWwgQysrIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgaWNwYyogKQorCSAgICAjIEludGVsIEMrKywgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisJICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyogfCBwZ2NwcCopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mcGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICB4bGMqIHwgeGxDKiB8IGJneGxbY0NdKiB8IG1waXhsW2NDXSopCisJICAgICMgSUJNIFhMIDguMCwgOS4wIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXFwaWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXFzdGF0aWNsaW5rJworCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1Rb3B0aW9uIGxkICcKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubworCTs7CisgICAgZXNhYworICBmaQorCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKKyAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWD0kbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNjsgfQorbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9bm8KKyAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID0geHllczsgdGhlbgorICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIDs7CisgICAgIGVzYWMKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KK2ZpCisKK2ZpCisKKworCisKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWFwiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorZmkKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNjsgfQorCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNjsgfQorCisKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9CisgIGhhcmRfbGlua3M9eWVzCisgICRSTSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CiskYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGV4Y2x1ZGVfZXhwc3ltc19DWFg9J19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKicKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbNC05XSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgICMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbCBkZWZpbmVkCisgICAgIyBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KKyAgICBpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikgfHwgKFwkIDIgPT0gIlciKSkgJiYgKHN1YnN0cihcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSIkbHRkbGxfY21kcyIKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgY2wqKQorICAgICAgZXhjbHVkZV9leHBzeW1zX0NYWD0nX05VTExfSU1QT1JUX0RFU0NSSVBUT1J8X0lNUE9SVF9ERVNDUklQVE9SXy4qJworICAgICAgOzsKKyAgICAqKQorICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxIERBVEEvO3MvXi4qWyBdX19ubV9fXChbXiBdKlwpWyBdW14gXSovXDEgREFUQS87L15JWyBdL2Q7L15bQUlUV11bIF0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIGV4Y2x1ZGVfZXhwc3ltc19DWFg9J1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgKikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgIDs7CisgIGVzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKKyRhc19lY2hvICIkbGRfc2hsaWJzX0NYWCIgPiY2OyB9Cit0ZXN0ICIkbGRfc2hsaWJzX0NYWCIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3dpdGhfZ251X2xkX0NYWD0kd2l0aF9nbnVfbGQKKworCisKKworCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHNfQ1hYIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworCWlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKwkgIHNvbmFtZT1jb25mdGVzdAorCSAgbGliPWNvbmZ0ZXN0CisJICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgIGRlcGxpYnM9CisJICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9DWFgKKwkgIHBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgKKwkgIGNvbXBpbGVyX2ZsYWdzPS12CisJICBsaW5rZXJfZmxhZ3M9LXYKKwkgIHZlcnN0cmluZz0KKwkgIG91dHB1dF9vYmpkaXI9LgorCSAgbGlibmFtZT1jb25mdGVzdAorCSAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9CisJICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kc19DWFggMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisJICB0aGVuCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworCSAgZWxzZQorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCisJICBmaQorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisJZmkKKwkkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY2OyB9CisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9JGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWAorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQorCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeFs0LTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgcG93ZXJwYykKKyAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCisgICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIDs7CisgIG02OGspCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gZnVuY19lY2hvX2FsbCAiJGxpYiIgfCAkU0VEICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJFJNIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICAgIDs7CisgIGVzYWMKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY2VnY2MqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKworICAqLGNsKikKKyAgICAjIE5hdGl2ZSBNU1ZDCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbYS16QS1aXVxcKTp8IC9cXDF8ZycgLWUgJ3N8XiB8fCdgCisgICAgICA7OworICAgIGN5Z3dpbiopCisgICAgICAjIENvbnZlcnQgdG8gdW5peCBmb3JtLCB0aGVuIHRvIGRvcyBmb3JtLCB0aGVuIGJhY2sgdG8gdW5peCBmb3JtCisgICAgICAjIGJ1dCB0aGlzIHRpbWUgZG9zIHN0eWxlIChubyBzcGFjZXMhKSBzbyB0aGF0IHRoZSB1bml4IGZvcm0gbG9va3MKKyAgICAgICMgbGlrZSAvY3lnZHJpdmUvYy9QUk9HUkF+MTovY3lnZHIuLi4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTElCImAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS1kb3MgIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIDI+L2Rldi9udWxsYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJExJQiIKKyAgICAgIGlmICRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRILgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgIyBGSVhNRTogZmluZCB0aGUgc2hvcnQgbmFtZSBvciB0aGUgcGF0aCBjb21wb25lbnRzLCBhcyBzcGFjZXMgYXJlCisgICAgICAjIGNvbW1vbi4gKGUuZy4gIlByb2dyYW0gRmlsZXMiIC0+ICJQUk9HUkF+MSIpCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsaW5rLmV4ZScKKyAgICA7OworCisgICopCisgICAgIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworICBlc2FjCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzIzXS4qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMi4qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hhaWt1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBydW50aW1lX2xvYWRlciIKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvYm9vdC9ob21lL2NvbmZpZy9saWIgL2Jvb3QvY29tbW9uL2xpYiAvYm9vdC9zeXN0ZW0vbGliJworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LCAuLi4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgICMgb3IgZmFpbHMgb3V0cmlnaHQsIHNvIG92ZXJyaWRlIGF0b21pY2FsbHk6CisgIGluc3RhbGxfb3ZlcnJpZGVfbW9kZT01NTUKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBpZiAke2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkbHRfcHJvZ19jb21waWxlcl93bF9DWFhcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWFwiIgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGlmICAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGw7IHRoZW4gOgorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCitmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgICAgbGliZGlyPSRzYXZlX2xpYmRpcgorCitmaQorCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsJIF0qaHdjYXBbCSBdL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7cy8iLy9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2RlbGYqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQoraGFyZGNvZGVfYWN0aW9uX0NYWD0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCIgfHwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3Zhcl9DWFgiIHx8CisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19DWFgiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9DWFgiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIENYWCkiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0NYWCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9DWFg9dW5zdXBwb3J0ZWQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNQorJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjY7IH0KKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID0gcmVsaW5rIHx8CisgICB0ZXN0ICIkaW5oZXJpdF9ycGF0aF9DWFgiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKworCisKKworCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKKyAgTERDWFg9JExECisgIExEPSRsdF9zYXZlX0xECisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKyAgbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorICBsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKKyAgbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitmaSAjIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgICAgIGFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBsaWJ0b29sIgorCisKKworCisjIE9ubHkgZXhwYW5kIG9uY2U6CisKKworCisjIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBDdXJyZW50bHkgd2UgYXJlbid0IHJ1bm5pbmcgdGhlIFB5dGhvbiB0ZXN0cworIyBhZ2FpbnN0IHRoZSBpbnRlcnByZXRlciBkZXRlY3RlZCBieSBBTV9QQVRIX1BZVEhPTiwgYW5kIHNvIHdlIGNvbmRpdGlvbgorIyBIQVZFX1BZVEhPTiBieSByZXF1aXJpbmcgInB5dGhvbiIgdG8gYmUgaW4gdGhlIFBBVEgsIGFuZCB0aGF0IGludGVycHJldGVyJ3MKKyMgdmVyc2lvbiB0byBiZSA+PSAyLjMuIFRoaXMgd2lsbCBhbGxvdyB0aGUgc2NyaXB0cyB0byB1c2UgYSAiL3Vzci9iaW4vZW52IgorIyBoYXNoYmFuZy4KK1BZVEhPTj0gICMgV2UgKmRvIG5vdCogYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHB5dGhvbiBpbnRlcnByZXRlcgorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJweXRob24iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHB5dGhvbjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfUFlUSE9OKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUFlUSE9OIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BZVEhPTj0iJFBZVEhPTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUFlUSE9OPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1BZVEhPTiIgJiYgYWNfY3ZfcGF0aF9QWVRIT049IjoiCisgIDs7Citlc2FjCitmaQorUFlUSE9OPSRhY19jdl9wYXRoX1BZVEhPTgoraWYgdGVzdCAtbiAiJFBZVEhPTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQWVRIT04iID4mNQorJGFzX2VjaG8gIiRQWVRIT04iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworaWYgdGVzdCAiJFBZVEhPTiIgIT0gIjoiOyB0aGVuIDoKKyAgcHJvZz0iaW1wb3J0IHN5cworIyBzcGxpdCBzdHJpbmdzIGJ5ICcuJyBhbmQgY29udmVydCB0byBudW1lcmljLiAgQXBwZW5kIHNvbWUgemVyb3MKKyMgYmVjYXVzZSB3ZSBuZWVkIGF0IGxlYXN0IDQgZGlnaXRzIGZvciB0aGUgaGV4IGNvbnZlcnNpb24uCisjIG1hcCByZXR1cm5zIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLjAgYW5kIGEgbGlzdCBpbiAyLngKK21pbnZlciA9IGxpc3QobWFwKGludCwgJzIuMycuc3BsaXQoJy4nKSkpICsgWzAsIDAsIDBdCittaW52ZXJoZXggPSAwCisjIHhyYW5nZSBpcyBub3QgcHJlc2VudCBpbiBQeXRob24gMy4wIGFuZCByYW5nZSByZXR1cm5zIGFuIGl0ZXJhdG9yCitmb3IgaSBpbiBsaXN0KHJhbmdlKDAsIDQpKTogbWludmVyaGV4ID0gKG1pbnZlcmhleCA8PCA4KSArIG1pbnZlcltpXQorc3lzLmV4aXQoc3lzLmhleHZlcnNpb24gPCBtaW52ZXJoZXgpIgorICBpZiB7IGVjaG8gIiRhc19tZTokTElORU5POiAkUFlUSE9OIC1jICIkcHJvZyIiID4mNQorICAgKCRQWVRIT04gLWMgIiRwcm9nIikgPiY1IDI+JjUKKyAgIGFjX3N0YXR1cz0kPworICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4gOgorICA6CitlbHNlCisgIFBZVEhPTj0iOiIKK2ZpCitmaQorIGlmIHRlc3QgIiRQWVRIT04iICE9ICI6IjsgdGhlbgorICBIQVZFX1BZVEhPTl9UUlVFPQorICBIQVZFX1BZVEhPTl9GQUxTRT0nIycKK2Vsc2UKKyAgSEFWRV9QWVRIT05fVFJVRT0nIycKKyAgSEFWRV9QWVRIT05fRkFMU0U9CitmaQorCisKKyMgQ29uZmlndXJlIHB0aHJlYWRzLgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXB0aHJlYWRzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9wdGhyZWFkcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcHRocmVhZHM7IHdpdGhfcHRocmVhZHM9JHdpdGh2YWwKK2Vsc2UKKyAgd2l0aF9wdGhyZWFkcz1jaGVjaworZmkKKworCitoYXZlX3B0aHJlYWRzPW5vCitpZiB0ZXN0ICJ4JHdpdGhfcHRocmVhZHMiICE9ICJ4bm8iOyB0aGVuIDoKKworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworYWN4X3B0aHJlYWRfb2s9bm8KKworIyBXZSB1c2VkIHRvIGNoZWNrIGZvciBwdGhyZWFkLmggZmlyc3QsIGJ1dCB0aGlzIGZhaWxzIGlmIHB0aHJlYWQuaAorIyByZXF1aXJlcyBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzIChlLmcuIG9uIFRydWU2NCBvciBTZXF1ZW50KS4KKyMgSXQgZ2V0cyBjaGVja2VkIGZvciBpbiB0aGUgbGluayB0ZXN0IGFueXdheS4KKworIyBGaXJzdCBvZiBhbGwsIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzZXQgYW55IG9mIHRoZSBQVEhSRUFEX0xJQlMsCisjIGV0Y2V0ZXJhIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5kIGlmIHRocmVhZHMgbGlua2luZyB3b3JrcyB1c2luZworIyB0aGVtOgoraWYgdGVzdCB4IiRQVEhSRUFEX0xJQlMkUFRIUkVBRF9DRkxBR1MiICE9IHg7IHRoZW4KKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2pvaW4gaW4gTElCUz0kUFRIUkVBRF9MSUJTIHdpdGggQ0ZMQUdTPSRQVEhSRUFEX0NGTEFHUy4uLiAiID4mNjsgfQorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcHRocmVhZF9qb2luICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcHRocmVhZF9qb2luICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjeF9wdGhyZWFkX29rPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWN4X3B0aHJlYWRfb2siID4mNQorJGFzX2VjaG8gIiRhY3hfcHRocmVhZF9vayIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSIiCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKKyAgICAgICAgZmkKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCitmaQorCisjIFdlIG11c3QgY2hlY2sgZm9yIHRoZSB0aHJlYWRzIGxpYnJhcnkgdW5kZXIgYSBudW1iZXIgb2YgZGlmZmVyZW50CisjIG5hbWVzOyB0aGUgb3JkZXJpbmcgaXMgdmVyeSBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHN5c3RlbXMKKyMgKGUuZy4gREVDKSBoYXZlIGJvdGggLWxwdGhyZWFkIGFuZCAtbHB0aHJlYWRzLCB3aGVyZSBvbmUgb2YgdGhlCisjIGxpYnJhcmllcyBpcyBicm9rZW4gKG5vbi1QT1NJWCkuCisKKyMgQ3JlYXRlIGEgbGlzdCBvZiB0aHJlYWQgZmxhZ3MgdG8gdHJ5LiAgSXRlbXMgc3RhcnRpbmcgd2l0aCBhICItIiBhcmUKKyMgQyBjb21waWxlciBmbGFncywgYW5kIG90aGVyIGl0ZW1zIGFyZSBsaWJyYXJ5IG5hbWVzLCBleGNlcHQgZm9yICJub25lIgorIyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSB0cnkgd2l0aG91dCBhbnkgZmxhZ3MgYXQgYWxsLCBhbmQgInB0aHJlYWQtY29uZmlnIgorIyB3aGljaCBpcyBhIHByb2dyYW0gcmV0dXJuaW5nIHRoZSBmbGFncyBmb3IgdGhlIFB0aCBlbXVsYXRpb24gbGlicmFyeS4KKworYWN4X3B0aHJlYWRfZmxhZ3M9InB0aHJlYWRzIG5vbmUgLUt0aHJlYWQgLWt0aHJlYWQgbHRocmVhZCAtcHRocmVhZCAtcHRocmVhZHMgLW10aHJlYWRzIHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQgcHRocmVhZC1jb25maWciCisKKyMgVGhlIG9yZGVyaW5nICppcyogKHNvbWV0aW1lcykgaW1wb3J0YW50LiAgU29tZSBub3RlcyBvbiB0aGUKKyMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisKKyMgcHRocmVhZHM6IEFJWCAobXVzdCBjaGVjayB0aGlzIGJlZm9yZSAtbHB0aHJlYWQpCisjIG5vbmU6IGluIGNhc2UgdGhyZWFkcyBhcmUgaW4gbGliYzsgc2hvdWxkIGJlIHRyaWVkIGJlZm9yZSAtS3RocmVhZCBhbmQKKyMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyMgLUt0aHJlYWQ6IFNlcXVlbnQgKHRocmVhZHMgaW4gbGliYywgYnV0IC1LdGhyZWFkIG5lZWRlZCBmb3IgcHRocmVhZC5oKQorIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorIyBsdGhyZWFkOiBMaW51eFRocmVhZHMgcG9ydCBvbiBGcmVlQlNEIChhbHNvIHByZWZlcnJlZCB0byAtcHRocmVhZCkKKyMgLXB0aHJlYWQ6IExpbnV4L2djYyAoa2VybmVsIHRocmVhZHMpLCBCU0QvZ2NjICh1c2VybGFuZCB0aHJlYWRzKQorIyAtcHRocmVhZHM6IFNvbGFyaXMvZ2NjCisjIC1tdGhyZWFkczogTWluZ3czMi9nY2MsIEx5bngvZ2NjCisjIC1tdDogU3VuIFdvcmtzaG9wIEMgKG1heSBvbmx5IGxpbmsgU3VuT1MgdGhyZWFkcyBbLWx0aHJlYWRdLCBidXQgaXQKKyMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyMgICAgICAuLi4gLW10IGlzIGFsc28gdGhlIHB0aHJlYWRzIGZsYWcgZm9yIEhQL2FDQworIyBwdGhyZWFkOiBMaW51eCwgZXRjZXRlcmEKKyMgLS10aHJlYWQtc2FmZTogS0FJIEMrKworIyBwdGhyZWFkLWNvbmZpZzogdXNlIHB0aHJlYWQtY29uZmlnIHByb2dyYW0gKGZvciBHTlUgUHRoIGxpYnJhcnkpCisKK2Nhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICpzb2xhcmlzKikKKworICAgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAgICMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkcy8tbXQvCisgICAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICAgIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKyAgICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCisgICAgICAgIGFjeF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgcHRocmVhZCAtbXQgLXB0aHJlYWQgJGFjeF9wdGhyZWFkX2ZsYWdzIgorICAgICAgICA7OworZXNhYworCitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorZm9yIGZsYWcgaW4gJGFjeF9wdGhyZWFkX2ZsYWdzOyBkbworCisgICAgICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgICAgICAgICAgICBub25lKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFncy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICAtKikKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRoICRmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRoICRmbGFnLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisKKwkJcHRocmVhZC1jb25maWcpCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicHRocmVhZC1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHB0aHJlYWQtY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWN4X3B0aHJlYWRfY29uZmlnIjsgdGhlbgorICBhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZz0iJGFjeF9wdGhyZWFkX2NvbmZpZyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZz0ieWVzIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZyIgJiYgYWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWc9Im5vIgorZmkKK2ZpCithY3hfcHRocmVhZF9jb25maWc9JGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnCitpZiB0ZXN0IC1uICIkYWN4X3B0aHJlYWRfY29uZmlnIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjeF9wdGhyZWFkX2NvbmZpZyIgPiY1CiskYXNfZWNobyAiJGFjeF9wdGhyZWFkX2NvbmZpZyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisJCWlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfY29uZmlnIiA9IHhubzsgdGhlbiBjb250aW51ZTsgZmkKKwkJUFRIUkVBRF9DRkxBR1M9ImBwdGhyZWFkLWNvbmZpZyAtLWNmbGFnc2AiCisJCVBUSFJFQURfTElCUz0iYHB0aHJlYWQtY29uZmlnIC0tbGRmbGFnc2AgYHB0aHJlYWQtY29uZmlnIC0tbGlic2AiCisJCTs7CisKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWcuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9Ii1sJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCisgICAgICAgICMgQ2hlY2sgZm9yIHZhcmlvdXMgZnVuY3Rpb25zLiAgV2UgbXVzdCBpbmNsdWRlIHB0aHJlYWQuaCwKKyAgICAgICAgIyBzaW5jZSBzb21lIGZ1bmN0aW9ucyBtYXkgYmUgbWFjcm9zLiAgKE9uIHRoZSBTZXF1ZW50LCB3ZQorICAgICAgICAjIG5lZWQgYSBzcGVjaWFsIGZsYWcgLUt0aHJlYWQgdG8gbWFrZSB0aGlzIGhlYWRlciBjb21waWxlLikKKyAgICAgICAgIyBXZSBjaGVjayBmb3IgcHRocmVhZF9qb2luIGJlY2F1c2UgaXQgaXMgaW4gLWxwdGhyZWFkIG9uIElSSVgKKyAgICAgICAgIyB3aGlsZSBwdGhyZWFkX2NyZWF0ZSBpcyBpbiBsaWJjLiAgV2UgY2hlY2sgZm9yIHB0aHJlYWRfYXR0cl9pbml0CisgICAgICAgICMgZHVlIHRvIERFQyBjcmF6aW5lc3Mgd2l0aCAtbHB0aHJlYWRzLiAgV2UgY2hlY2sgZm9yCisgICAgICAgICMgcHRocmVhZF9jbGVhbnVwX3B1c2ggYmVjYXVzZSBpdCBpcyBvbmUgb2YgdGhlIGZldyBwdGhyZWFkCisgICAgICAgICMgZnVuY3Rpb25zIG9uIFNvbGFyaXMgdGhhdCBkb2Vzbid0IGhhdmUgYSBub24tZnVuY3Rpb25hbCBsaWJjIHN0dWIuCisgICAgICAgICMgV2UgdHJ5IHB0aHJlYWRfY3JlYXRlIG9uIGdlbmVyYWwgcHJpbmNpcGxlcy4KKyAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWN4X3B0aHJlYWRfb2s9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjeF9wdGhyZWFkX29rIiA+JjUKKyRhc19lY2hvICIkYWN4X3B0aHJlYWRfb2siID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBEZXRlY3QgQUlYIGxvc3NhZ2U6IEpPSU5BQkxFIGF0dHJpYnV0ZSBpcyBjYWxsZWQgVU5ERVRBQ0hFRC4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igam9pbmFibGUgcHRocmVhZCBhdHRyaWJ1dGUuLi4gIiA+JjY7IH0KKwlhdHRyX25hbWU9dW5rbm93bgorCWZvciBhdHRyIGluIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQ7IGRvCisJICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCBhdHRyPSRhdHRyOyByZXR1cm4gYXR0cjsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhdHRyX25hbWU9JGF0dHI7IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwlkb25lCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXR0cl9uYW1lIiA+JjUKKyRhc19lY2hvICIkYXR0cl9uYW1lIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCAiJGF0dHJfbmFtZSIgIT0gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEU7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSAkYXR0cl9uYW1lCitfQUNFT0YKKworICAgICAgICBmaQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMuLi4gIiA+JjY7IH0KKyAgICAgICAgZmxhZz1ubworICAgICAgICBjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAgICAgKi1haXgqIHwgKi1mcmVlYnNkKiB8ICotZGFyd2luKikgZmxhZz0iLURfVEhSRUFEX1NBRkUiOzsKKyAgICAgICAgICAgICpzb2xhcmlzKiB8ICotb3NmKiB8ICotaHB1eCopIGZsYWc9Ii1EX1JFRU5UUkFOVCI7OworICAgICAgICBlc2FjCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke2ZsYWd9IiA+JjUKKyRhc19lY2hvICIke2ZsYWd9IiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCAieCRmbGFnIiAhPSB4bm87IHRoZW4KKyAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIGZpCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICAgICAgICMgTW9yZSBBSVggbG9zc2FnZTogbXVzdCBjb21waWxlIHdpdGggeGxjX3Igb3IgY2NfcgorCWlmIHRlc3QgeCIkR0NDIiAhPSB4eWVzOyB0aGVuCisgICAgICAgICAgZm9yIGFjX3Byb2cgaW4geGxjX3IgY2NfcgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1BUSFJFQURfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUFRIUkVBRF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19QVEhSRUFEX0NDPSIkUFRIUkVBRF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1BUSFJFQURfQ0M9JGFjX2N2X3Byb2dfUFRIUkVBRF9DQworaWYgdGVzdCAtbiAiJFBUSFJFQURfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUFRIUkVBRF9DQyIgPiY1CiskYXNfZWNobyAiJFBUSFJFQURfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkUFRIUkVBRF9DQyIgJiYgYnJlYWsKK2RvbmUKK3Rlc3QgLW4gIiRQVEhSRUFEX0NDIiB8fCBQVEhSRUFEX0NDPSIke0NDfSIKKworICAgICAgICBlbHNlCisgICAgICAgICAgUFRIUkVBRF9DQz0kQ0MKKwlmaQorCisJIyBUaGUgbmV4dCBwYXJ0IHRyaWVzIHRvIGRldGVjdCBHQ0MgaW5jb25zaXN0ZW5jeSB3aXRoIC1zaGFyZWQgb24gc29tZQorCSMgYXJjaGl0ZWN0dXJlcyBhbmQgc3lzdGVtcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBpbiBjZXJ0YWluCisJIyBjb25maWd1cmF0aW9ucywgd2hlbiAtc2hhcmVkIGlzIHNwZWNpZmllZCwgR0NDICJmb3JnZXRzIiB0bworCSMgaW50ZXJuYWxseSB1c2UgdmFyaW91cyBmbGFncyB3aGljaCBhcmUgc3RpbGwgbmVjZXNzYXJ5LgorCisJIworCSMgUHJlcGFyZSB0aGUgZmxhZ3MKKwkjCisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJc2F2ZV9MSUJTPSIkTElCUyIKKwlzYXZlX0NDPSIkQ0MiCisKKwkjIFRyeSB3aXRoIHRoZSBmbGFncyBkZXRlcm1pbmVkIGJ5IHRoZSBlYXJsaWVyIGNoZWNrcy4KKwkjCisJIyAtV2wsLXosZGVmcyBmb3JjZXMgbGluay10aW1lIHN5bWJvbCByZXNvbHV0aW9uLCBzbyB0aGF0IHRoZQorCSMgbGlua2luZyBjaGVja3Mgd2l0aCAtc2hhcmVkIGFjdHVhbGx5IGhhdmUgYW55IHZhbHVlCisJIworCSMgRklYTUU6IC1mUElDIGlzIHJlcXVpcmVkIGZvciAtc2hhcmVkIG9uIG1hbnkgYXJjaGl0ZWN0dXJlcywKKwkjIHNvIHdlIHNwZWNpZnkgaXQgaGVyZSwgYnV0IHRoZSByaWdodCB3YXkgd291bGQgcHJvYmFibHkgYmUgdG8KKwkjIHByb3Blcmx5IGRldGVjdCB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IHJlcXVpcmVkLgorCUNGTEFHUz0iLXNoYXJlZCAtZlBJQyAtV2wsLXosZGVmcyAkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKwlMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorCUNDPSIkUFRIUkVBRF9DQyIKKworCSMgSW4gb3JkZXIgbm90IHRvIGNyZWF0ZSBzZXZlcmFsIGxldmVscyBvZiBpbmRlbnRhdGlvbiwgd2UgdGVzdAorCSMgdGhlIHZhbHVlIG9mICIkZG9uZSIgdW50aWwgd2UgZmluZCB0aGUgY3VyZSBvciBydW4gb3V0IG9mIGlkZWFzLgorCWRvbmU9Im5vIgorCisJIyBGaXJzdCwgbWFrZSBzdXJlIHRoZSBDRkxBR1Mgd2UgYWRkZWQgYXJlIGFjdHVhbGx5IGFjY2VwdGVkIGJ5IG91cgorCSMgY29tcGlsZXIuICBJZiBub3QgKGFuZCBPUyBYJ3MgbGQsIGZvciBpbnN0YW5jZSwgZG9lcyBub3QgYWNjZXB0IC16KSwKKwkjIHRoZW4gd2UgY2FuJ3QgZG8gdGhpcyB0ZXN0LgorCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gY2hlY2sgZm9yIEdDQyBwdGhyZWFkL3NoYXJlZCBpbmNvbnNpc3RlbmNpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBjaGVjayBmb3IgR0NDIHB0aHJlYWQvc2hhcmVkIGluY29uc2lzdGVuY2llcy4uLiAiID4mNjsgfQorCSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGRvbmU9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzIDsgdGhlbgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSAgIGVsc2UKKwkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCSAgIGZpCisJZmkKKworCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLXB0aHJlYWQgaXMgc3VmZmljaWVudCB3aXRoIC1zaGFyZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtcHRocmVhZCBpcyBzdWZmaWNpZW50IHdpdGggLXNoYXJlZC4uLiAiID4mNjsgfQorCSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisJICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZG9uZT15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCSAgIGVsc2UKKwkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkgICBmaQorCWZpCisKKwkjCisJIyBMaW51eCBnY2Mgb24gc29tZSBhcmNoaXRlY3R1cmVzIHN1Y2ggYXMgbWlwcy9taXBzZWwgZm9yZ2V0cworCSMgYWJvdXQgLWxwdGhyZWFkCisJIworCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxwdGhyZWFkIGZpeGVzIHRoYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbHB0aHJlYWQgZml4ZXMgdGhhdC4uLiAiID4mNjsgfQorCSAgIExJQlM9Ii1scHRocmVhZCAkUFRIUkVBRF9MSUJTICRzYXZlX0xJQlMiCisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBkb25lPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJICAgICAgUFRIUkVBRF9MSUJTPSItbHB0aHJlYWQgJFBUSFJFQURfTElCUyIKKwkgICBlbHNlCisJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJICAgZmkKKwlmaQorCSMKKwkjIEZyZWVCU0QgNC4xMCBnY2MgZm9yZ2V0cyB0byB1c2UgLWxjX3IgaW5zdGVhZCBvZiAtbGMKKwkjCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGNfciBmaXhlcyB0aGF0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjX3IgZml4ZXMgdGhhdC4uLiAiID4mNjsgfQorCSAgIExJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisJICAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBkb25lPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJICAgICAgUFRIUkVBRF9MSUJTPSItbGNfciAkUFRIUkVBRF9MSUJTIgorCSAgIGVsc2UKKwkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkgICBmaQorCWZpCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgICMgT0ssIHdlIGhhdmUgcnVuIG91dCBvZiBpZGVhcworCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogSW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgaG93IHRvIHVzZSBwdGhyZWFkcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogSW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgaG93IHRvIHVzZSBwdGhyZWFkcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMiID4mMjt9CisKKwkgICAjIHNvIGl0J3Mgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UgbWF5IHVzZSBwdGhyZWFkcworCSAgIGFjeF9wdGhyZWFkX29rPW5vCisJZmkKKworCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCUxJQlM9IiRzYXZlX0xJQlMiCisJQ0M9IiRzYXZlX0NDIgorZWxzZQorICAgICAgICBQVEhSRUFEX0NDPSIkQ0MiCitmaQorCisKKworCisKKyMgRmluYWxseSwgZXhlY3V0ZSBBQ1RJT04tSUYtRk9VTkQvQUNUSU9OLUlGLU5PVC1GT1VORDoKK2lmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1BUSFJFQUQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgOgorZWxzZQorICAgICAgICBhY3hfcHRocmVhZF9vaz1ubworICAgICAgICBpZiB0ZXN0ICJ4JHdpdGhfcHRocmVhZHMiICE9ICJ4Y2hlY2siOyB0aGVuIDoKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiLS13aXRoLXB0aHJlYWRzIHdhcyBzcGVjaWZpZWQsIGJ1dCB1bmFibGUgdG8gYmUgdXNlZAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitmaQorYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisgICAgICAgaGF2ZV9wdGhyZWFkcz0iJGFjeF9wdGhyZWFkX29rIgorZmkKKyBpZiB0ZXN0ICJ4JGhhdmVfcHRocmVhZHMiID0gInh5ZXMiOyB0aGVuCisgIEhBVkVfUFRIUkVBRFNfVFJVRT0KKyAgSEFWRV9QVEhSRUFEU19GQUxTRT0nIycKK2Vsc2UKKyAgSEFWRV9QVEhSRUFEU19UUlVFPScjJworICBIQVZFX1BUSFJFQURTX0ZBTFNFPQorZmkKKworCisKKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayBmb3IgdGhlIG5lY2Vzc2FyeSBzeXN0ZW0gaGVhZGVycy4KKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayB0aGUgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBvdGhlciBjb21waWxlcgorIyBhbmQgYXJjaGl0ZWN0dXJlIGNoYXJhY3RlcmlzdGljcy4KKworIyBPdXRwdXQgdGhlIGdlbmVyYXRlZCBmaWxlcy4gTm8gZnVydGhlciBhdXRvY29uZiBtYWNyb3MgbWF5IGJlIHVzZWQuCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAorIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzOiBkb3VibGUtcXVvdGUKKyAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwuCisgICAgICBzZWQgLW4gXAorCSJzLycvJ1xcXFwnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCisgICAgICA7OworICAgIGVzYWMgfAorICAgIHNvcnQKKykgfAorICBzZWQgJworICAgICAvXmFjX2N2X2Vudl8vYiBlbmQKKyAgICAgdCBjbGVhcgorICAgICA6Y2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKyAgICAgOmVuZCcgPj5jb25mY2FjaGUKK2lmIGRpZmYgIiRjYWNoZV9maWxlIiBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KKwljYXQgY29uZmNhY2hlID4iJGNhY2hlX2ZpbGUiCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4gIygKKyAgICAgICAgKi8qIHwgPzoqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIkJCAmJgorCSAgbXYgLWYgIiRjYWNoZV9maWxlIiQkICIkY2FjaGVfZmlsZSIgOzsgIygKKyAgICAgICAgKikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiIDs7CisJZXNhYworICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9CitVPQorZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCisgIGFjX2k9YCRhc19lY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAorICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCisgICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgorICBhc19mbl9hcHBlbmQgYWNfbGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorICBhc19mbl9hcHBlbmQgYWNfbHRsaWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKK2RvbmUKK0xJQk9CSlM9JGFjX2xpYm9ianMKKworTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKKworCisgaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KKyAgYW1fX0VYRUVYVF9UUlVFPQorICBhbV9fRVhFRVhUX0ZBTFNFPScjJworZWxzZQorICBhbV9fRVhFRVhUX1RSVUU9JyMnCisgIGFtX19FWEVFWFRfRkFMU0U9CitmaQorCitpZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDWFhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0hBVkVfUFlUSE9OX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfUFlUSE9OX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9QWVRIT05cIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0hBVkVfUFRIUkVBRFNfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9QVEhSRUFEU19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfUFRIUkVBRFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCisKKzogIiR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9IgorYWNfd3JpdGVfZmFpbD0wCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cithc193cml0ZV9mYWlsPTAKK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCisKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKworIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNj4mMQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTRU9GCit0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrICRhc19tZSAxLjcuMCwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjguICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKyIKKworX0FDRU9GCisKK2Nhc2UgJGFjX2NvbmZpZ19maWxlcyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfZmlsZXM7IHNoaWZ0OyBhY19jb25maWdfZmlsZXM9JCo7OworZXNhYworCitjYXNlICRhY19jb25maWdfaGVhZGVycyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSQqOzsKK2VzYWMKKworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKK2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCitjb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMiCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBhY3Rpb25zCitmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gIFVubGVzcyB0aGUgZmlsZXMKK2FuZCBhY3Rpb25zIGFyZSBzcGVjaWZpZWQgYXMgVEFHcywgYWxsIGFyZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtUQUddLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKKyAgICAgIC0tY29uZmlnICAgICBwcmludCBjb25maWd1cmF0aW9uLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50CisgICAgICAgICAgICAgICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCisgIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisgICAgICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCisgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGhlYWRlcnM6CiskY29uZmlnX2hlYWRlcnMKKworQ29uZmlndXJhdGlvbiBjb21tYW5kczoKKyRjb25maWdfY29tbWFuZHMKKworUmVwb3J0IGJ1Z3MgdG8gPGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbT4uIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKK2FjX2NzX3ZlcnNpb249IlxcCitHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGNvbmZpZy5zdGF0dXMgMS43LjAKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OCwKKyAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCisKK0NvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKworYWNfcHdkPSckYWNfcHdkJworc3JjZGlyPSckc3JjZGlyJworSU5TVEFMTD0nJElOU1RBTEwnCitNS0RJUl9QPSckTUtESVJfUCcKK0FXSz0nJEFXSycKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPT8qKQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtLSo9KQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPQorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAqKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKKyAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKKyAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKKworICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBzZXQgWCAnJFNIRUxMJyAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCisgIHNoaWZ0CisgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisgIENPTkZJR19TSEVMTD0nJFNIRUxMJworICBleHBvcnQgQ09ORklHX1NIRUxMCisgIGV4ZWMgIlwkQCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCisgICRhc19lY2hvICIkYWNfbG9nIgorfSA+JjUKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMKKyMgSU5JVC1DT01NQU5EUworIworQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIgorCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKK2RvdWJsZV9xdW90ZV9zdWJzdD0nJGRvdWJsZV9xdW90ZV9zdWJzdCcKK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSckZGVsYXlfdmFyaWFibGVfc3Vic3QnCittYWNyb192ZXJzaW9uPSdgJEVDSE8gIiRtYWNyb192ZXJzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21hY3JvX3JldmlzaW9uPSdgJEVDSE8gIiRtYWNyb19yZXZpc2lvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfc2hhcmVkPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zdGF0aWM9J2AkRUNITyAiJGVuYWJsZV9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcGljX21vZGU9J2AkRUNITyAiJHBpY19tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9mYXN0X2luc3RhbGw9J2AkRUNITyAiJGVuYWJsZV9mYXN0X2luc3RhbGwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU0hFTEw9J2AkRUNITyAiJFNIRUxMIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0VDSE89J2AkRUNITyAiJEVDSE8iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworUEFUSF9TRVBBUkFUT1I9J2AkRUNITyAiJFBBVEhfU0VQQVJBVE9SIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hvc3RfYWxpYXM9J2AkRUNITyAiJGhvc3RfYWxpYXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaG9zdD0nYCRFQ0hPICIkaG9zdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitob3N0X29zPSdgJEVDSE8gIiRob3N0X29zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2J1aWxkX2FsaWFzPSdgJEVDSE8gIiRidWlsZF9hbGlhcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitidWlsZD0nYCRFQ0hPICIkYnVpbGQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYnVpbGRfb3M9J2AkRUNITyAiJGJ1aWxkX29zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1NFRD0nYCRFQ0hPICIkU0VEIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1hzZWQ9J2AkRUNITyAiJFhzZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworR1JFUD0nYCRFQ0hPICIkR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitFR1JFUD0nYCRFQ0hPICIkRUdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRkdSRVA9J2AkRUNITyAiJEZHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xEPSdgJEVDSE8gIiRMRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitOTT0nYCRFQ0hPICIkTk0iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTE5fUz0nYCRFQ0hPICIkTE5fUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittYXhfY21kX2xlbj0nYCRFQ0hPICIkbWF4X2NtZF9sZW4iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWNfb2JqZXh0PSdgJEVDSE8gIiRhY19vYmpleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhlZXh0PSdgJEVDSE8gIiRleGVleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfdW5zZXQ9J2AkRUNITyAiJGx0X3Vuc2V0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X1NQMk5MPSdgJEVDSE8gIiRsdF9TUDJOTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9OTDJTUD0nYCRFQ0hPICIkbHRfTkwyU1AiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfdG9faG9zdF9maWxlX2NtZD0nYCRFQ0hPICIkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl90b190b29sX2ZpbGVfY21kPSdgJEVDSE8gIiRsdF9jdl90b190b29sX2ZpbGVfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3JlbG9hZF9mbGFnPSdgJEVDSE8gIiRyZWxvYWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCityZWxvYWRfY21kcz0nYCRFQ0hPICIkcmVsb2FkX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT0JKRFVNUD0nYCRFQ0hPICIkT0JKRFVNUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitkZXBsaWJzX2NoZWNrX21ldGhvZD0nYCRFQ0hPICIkZGVwbGlic19jaGVja19tZXRob2QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9tYWdpY19jbWQ9J2AkRUNITyAiJGZpbGVfbWFnaWNfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbWFnaWNfZ2xvYj0nYCRFQ0hPICIkZmlsZV9tYWdpY19nbG9iIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dhbnRfbm9jYXNlZ2xvYj0nYCRFQ0hPICIkd2FudF9ub2Nhc2VnbG9iIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0RMTFRPT0w9J2AkRUNITyAiJERMTFRPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9J2AkRUNITyAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0FSPSdgJEVDSE8gIiRBUiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitBUl9GTEFHUz0nYCRFQ0hPICIkQVJfRkxBR1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZXJfbGlzdF9zcGVjPSdgJEVDSE8gIiRhcmNoaXZlcl9saXN0X3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU1RSSVA9J2AkRUNITyAiJFNUUklQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1JBTkxJQj0nYCRFQ0hPICIkUkFOTElCIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPSdgJEVDSE8gIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQ0M9J2AkRUNITyAiJENDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0NGTEFHUz0nYCRFQ0hPICIkQ0ZMQUdTIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyPSdgJEVDSE8gIiRjb21waWxlciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitHQ0M9J2AkRUNITyAiJEdDQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitubV9maWxlX2xpc3Rfc3BlYz0nYCRFQ0hPICIkbm1fZmlsZV9saXN0X3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfc3lzcm9vdD0nYCRFQ0hPICIkbHRfc3lzcm9vdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvYmpkaXI9J2AkRUNITyAiJG9iamRpciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitNQUdJQ19DTUQ9J2AkRUNITyAiJE1BR0lDX0NNRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9waWM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfcGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfd2w9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfd2wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vPSdgJEVDSE8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCituZWVkX2xvY2tzPSdgJEVDSE8gIiRuZWVkX2xvY2tzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK01BTklGRVNUX1RPT0w9J2AkRUNITyAiJE1BTklGRVNUX1RPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRFNZTVVUSUw9J2AkRUNITyAiJERTWU1VVElMIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK05NRURJVD0nYCRFQ0hPICIkTk1FRElUIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xJUE89J2AkRUNITyAiJExJUE8iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT1RPT0w9J2AkRUNITyAiJE9UT09MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK09UT09MNjQ9J2AkRUNITyAiJE9UT09MNjQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGliZXh0PSdgJEVDSE8gIiRsaWJleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hyZXh0X2NtZHM9J2AkRUNITyAiJHNocmV4dF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4dHJhY3RfZXhwc3ltc19jbWRzPSdgJEVDSE8gIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2NtZHNfbmVlZF9sYz0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX25lZWRfbGMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz0nYCRFQ0hPICIkZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9J2AkRUNITyAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nYCRFQ0hPICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbmVlZHNfb2JqZWN0PSdgJEVDSE8gIiRjb21waWxlcl9uZWVkc19vYmplY3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9jbWRzPSdgJEVDSE8gIiRhcmNoaXZlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9leHBzeW1fY21kcz0nYCRFQ0hPICIkYXJjaGl2ZV9leHBzeW1fY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittb2R1bGVfY21kcz0nYCRFQ0hPICIkbW9kdWxlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbW9kdWxlX2V4cHN5bV9jbWRzPSdgJEVDSE8gIiRtb2R1bGVfZXhwc3ltX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2l0aF9nbnVfbGQ9J2AkRUNITyAiJHdpdGhfZ251X2xkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FsbG93X3VuZGVmaW5lZF9mbGFnPSdgJEVDSE8gIiRhbGxvd191bmRlZmluZWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitub191bmRlZmluZWRfZmxhZz0nYCRFQ0hPICIkbm9fdW5kZWZpbmVkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYCRFQ0hPICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdD0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX21pbnVzX0w9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWM9J2AkRUNITyAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmhlcml0X3JwYXRoPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpbmtfYWxsX2RlcGxpYnM9J2AkRUNITyAiJGxpbmtfYWxsX2RlcGxpYnMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSdgJEVDSE8gIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X3N5bWJvbHNfY21kcz0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGV4Y2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVsaW5rX2NtZHM9J2AkRUNITyAiJHByZWxpbmtfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0bGlua19jbWRzPSdgJEVDSE8gIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRmaWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0nYCRFQ0hPICIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF9saWJfcHJlZml4PSdgJEVDSE8gIiRuZWVkX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF92ZXJzaW9uPSdgJEVDSE8gIiRuZWVkX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwordmVyc2lvbl90eXBlPSdgJEVDSE8gIiR2ZXJzaW9uX3R5cGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcnVucGF0aF92YXI9J2AkRUNITyAiJHJ1bnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NobGlicGF0aF92YXI9J2AkRUNITyAiJHNobGlicGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSdgJEVDSE8gIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlibmFtZV9zcGVjPSdgJEVDSE8gIiRsaWJuYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlicmFyeV9uYW1lc19zcGVjPSdgJEVDSE8gIiRsaWJyYXJ5X25hbWVzX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc29uYW1lX3NwZWM9J2AkRUNITyAiJHNvbmFtZV9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luc3RhbGxfb3ZlcnJpZGVfbW9kZT0nYCRFQ0hPICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRwb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmluaXNoX2NtZHM9J2AkRUNITyAiJGZpbmlzaF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbmlzaF9ldmFsPSdgJEVDSE8gIiRmaW5pc2hfZXZhbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9pbnRvX2xpYnM9J2AkRUNITyAiJGhhcmRjb2RlX2ludG9fbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9J2AkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfYWN0aW9uPSdgJEVDSE8gIiRoYXJkY29kZV9hY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Rsb3Blbj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3BlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGY9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9zdHJpcGxpYj0nYCRFQ0hPICIkb2xkX3N0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N0cmlwbGliPSdgJEVDSE8gIiRzdHJpcGxpYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9J2AkRUNITyAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0cz0nYCRFQ0hPICIkcHJlZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGRlcF9vYmplY3RzPSdgJEVDSE8gIiRwb3N0ZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcHJlZGVwcz0nYCRFQ0hPICIkcHJlZGVwcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwcz0nYCRFQ0hPICIkcG9zdGRlcHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSdgJEVDSE8gIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTERfQ1hYPSdgJEVDSE8gIiRMRF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRyZWxvYWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2NtZHNfQ1hYPSdgJEVDSE8gIiRyZWxvYWRfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfY21kc19DWFg9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dDQ19DWFg9J2AkRUNITyAiJEdDQ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl93bF9DWFg9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD0nYCRFQ0hPICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPSdgJEVDSE8gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nYCRFQ0hPICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX25lZWRzX29iamVjdF9DWFg9J2AkRUNITyAiJGNvbXBpbGVyX25lZWRzX29iamVjdF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFg9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWD0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19DWFg9J2AkRUNITyAiJGFyY2hpdmVfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2AkRUNITyAiJGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9jbWRzX0NYWD0nYCRFQ0hPICIkbW9kdWxlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9leHBzeW1fY21kc19DWFg9J2AkRUNITyAiJG1vZHVsZV9leHBzeW1fY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2l0aF9nbnVfbGRfQ1hYPSdgJEVDSE8gIiR3aXRoX2dudV9sZF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRub191bmRlZmluZWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9kaXJlY3RfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3RfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbWludXNfTF9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0xfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luaGVyaXRfcnBhdGhfQ1hYPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaW5rX2FsbF9kZXBsaWJzX0NYWD0nYCRFQ0hPICIkbGlua19hbGxfZGVwbGlic19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD0nYCRFQ0hPICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhjbHVkZV9leHBzeW1zX0NYWD0nYCRFQ0hPICIkZXhjbHVkZV9leHBzeW1zX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXNfQ1hYPSdgJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWxpbmtfY21kc19DWFg9J2AkRUNITyAiJHByZWxpbmtfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGxpbmtfY21kc19DWFg9J2AkRUNITyAiJHBvc3RsaW5rX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjX0NYWD0nYCRFQ0hPICIkZmlsZV9saXN0X3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2FjdGlvbl9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0c19DWFg9J2AkRUNITyAiJHByZWRlcF9vYmplY3RzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwX29iamVjdHNfQ1hYPSdgJEVDSE8gIiRwb3N0ZGVwX29iamVjdHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWRlcHNfQ1hYPSdgJEVDSE8gIiRwcmVkZXBzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwc19DWFg9J2AkRUNITyAiJHBvc3RkZXBzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPSdgJEVDSE8gIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKKworTFRDQz0nJExUQ0MnCitMVENGTEFHUz0nJExUQ0ZMQUdTJworY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJworCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisKKyMgUXVvdGUgZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIFNIRUxMIFwKK0VDSE8gXAorUEFUSF9TRVBBUkFUT1IgXAorU0VEIFwKK0dSRVAgXAorRUdSRVAgXAorRkdSRVAgXAorTEQgXAorTk0gXAorTE5fUyBcCitsdF9TUDJOTCBcCitsdF9OTDJTUCBcCityZWxvYWRfZmxhZyBcCitPQkpEVU1QIFwKK2RlcGxpYnNfY2hlY2tfbWV0aG9kIFwKK2ZpbGVfbWFnaWNfY21kIFwKK2ZpbGVfbWFnaWNfZ2xvYiBcCit3YW50X25vY2FzZWdsb2IgXAorRExMVE9PTCBcCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCBcCitBUiBcCitBUl9GTEFHUyBcCithcmNoaXZlcl9saXN0X3NwZWMgXAorU1RSSVAgXAorUkFOTElCIFwKK0NDIFwKK0NGTEFHUyBcCitjb21waWxlciBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXggXAorbm1fZmlsZV9saXN0X3NwZWMgXAorbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgXAorbHRfcHJvZ19jb21waWxlcl9waWMgXAorbHRfcHJvZ19jb21waWxlcl93bCBcCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyBcCitsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCituZWVkX2xvY2tzIFwKK01BTklGRVNUX1RPT0wgXAorRFNZTVVUSUwgXAorTk1FRElUIFwKK0xJUE8gXAorT1RPT0wgXAorT1RPT0w2NCBcCitzaHJleHRfY21kcyBcCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgXAorY29tcGlsZXJfbmVlZHNfb2JqZWN0IFwKK3dpdGhfZ251X2xkIFwKK2FsbG93X3VuZGVmaW5lZF9mbGFnIFwKK25vX3VuZGVmaW5lZF9mbGFnIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCitleGNsdWRlX2V4cHN5bXMgXAoraW5jbHVkZV9leHBzeW1zIFwKK2ZpbGVfbGlzdF9zcGVjIFwKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIFwKK2xpYm5hbWVfc3BlYyBcCitsaWJyYXJ5X25hbWVzX3NwZWMgXAorc29uYW1lX3NwZWMgXAoraW5zdGFsbF9vdmVycmlkZV9tb2RlIFwKK2ZpbmlzaF9ldmFsIFwKK29sZF9zdHJpcGxpYiBcCitzdHJpcGxpYiBcCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgXAorcHJlZGVwX29iamVjdHMgXAorcG9zdGRlcF9vYmplY3RzIFwKK3ByZWRlcHMgXAorcG9zdGRlcHMgXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKK0xEX0NYWCBcCityZWxvYWRfZmxhZ19DWFggXAorY29tcGlsZXJfQ1hYIFwKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWCBcCitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAorbHRfcHJvZ19jb21waWxlcl93bF9DWFggXAorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIFwKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCBcCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIFwKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWCBcCitjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYIFwKK3dpdGhfZ251X2xkX0NYWCBcCithbGxvd191bmRlZmluZWRfZmxhZ19DWFggXAorbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIFwKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYIFwKK2V4Y2x1ZGVfZXhwc3ltc19DWFggXAoraW5jbHVkZV9leHBzeW1zX0NYWCBcCitmaWxlX2xpc3Rfc3BlY19DWFggXAorY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCBcCitwcmVkZXBfb2JqZWN0c19DWFggXAorcG9zdGRlcF9vYmplY3RzX0NYWCBcCitwcmVkZXBzX0NYWCBcCitwb3N0ZGVwc19DWFggXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWDsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1xcXFxcXFxgXFwiXFxcJF0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gcmVsb2FkX2NtZHMgXAorb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAorb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCitvbGRfYXJjaGl2ZV9jbWRzIFwKK2V4dHJhY3RfZXhwc3ltc19jbWRzIFwKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorYXJjaGl2ZV9jbWRzIFwKK2FyY2hpdmVfZXhwc3ltX2NtZHMgXAorbW9kdWxlX2NtZHMgXAorbW9kdWxlX2V4cHN5bV9jbWRzIFwKK2V4cG9ydF9zeW1ib2xzX2NtZHMgXAorcHJlbGlua19jbWRzIFwKK3Bvc3RsaW5rX2NtZHMgXAorcG9zdGluc3RhbGxfY21kcyBcCitwb3N0dW5pbnN0YWxsX2NtZHMgXAorZmluaXNoX2NtZHMgXAorc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIFwKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKK3JlbG9hZF9jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAorYXJjaGl2ZV9jbWRzX0NYWCBcCithcmNoaXZlX2V4cHN5bV9jbWRzX0NYWCBcCittb2R1bGVfY21kc19DWFggXAorbW9kdWxlX2V4cHN5bV9jbWRzX0NYWCBcCitleHBvcnRfc3ltYm9sc19jbWRzX0NYWCBcCitwcmVsaW5rX2NtZHNfQ1hYIFwKK3Bvc3RsaW5rX2NtZHNfQ1hYOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInCit4c2lfc2hlbGw9JyR4c2lfc2hlbGwnCitsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnCisKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCisKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJworCisKKworCisKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiYnVpbGQtYXV4L2NvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBidWlsZC1hdXgvY29uZmlnLmgiIDs7CisgICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworICAgICJzY3JpcHRzL2d0ZXN0LWNvbmZpZyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2d0ZXN0LWNvbmZpZyIgOzsKKyAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICAgImxpYnRvb2wiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgbGlidG9vbCIgOzsKKworICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKKyAgZXNhYworZG9uZQorCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKKyMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorJGRlYnVnIHx8Cit7CisgIHRtcD0gYWNfdG1wPQorICB0cmFwICdleGl0X3N0YXR1cz0kPworICA6ICIke2FjX3RtcDo9JHRtcH0iCisgIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorYWNfdG1wPSR0bXAKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgoraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKworCithY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCisjIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCisjIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKKyMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCitpZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KKyAgZXZhbCBhY19jcj1cJFwnXFxyXCcKK2ZpCithY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCitpZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgorICBhY19jc19hd2tfY3I9J1xccicKK2Vsc2UKKyAgYWNfY3NfYXdrX2NyPSRhY19jcgorZmkKKworZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKK19BQ0VPRgorCisKK3sKKyAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKyAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgorICBlY2hvICJfQUNFT0YiCit9ID5jb25mJCRzdWJzLnNoIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK2FjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCisgIC4gLi9jb25mJCRzdWJzLnNoIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCisgIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorcm0gLWYgY29uZiQkc3Vicy5zaAorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKK19BQ0VPRgorc2VkIC1uICcKK2gKK3MvXi9TWyIvOyBzLyEuKi8iXT0vCitwCitnCitzL15bXiFdKiEvLworOnJlcGwKK3QgcmVwbAorcy8nIiRhY19kZWxpbSInJC8vCit0IGRlbGltCis6bmwKK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworcAorbgorYiByZXBsCis6bW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBubAorOmRlbGltCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCitwCitiCis6bW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBkZWxpbQorJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJworL15bXiIiXS97CisgIE4KKyAgcy9cbi8vCit9CisnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCitybSAtZiBjb25mJCRzdWJzLmF3aworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitfQUNBV0sKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCisgIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCisKK30KK3sKKyAgbGluZSA9ICQgMAorICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKKyAgc3Vic3RlZCA9IDAKKyAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQorICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7CisgICAga2V5ID0gZmllbGRbaV0KKyAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQorICAgIGlmIChTX2lzX3NldFtrZXldKSB7CisgICAgICB2YWx1ZSA9IFNba2V5XQorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQorICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKKyAgICAgIHN1YnN0ZWQgPSAxCisgICAgfSBlbHNlCisgICAgICBsZW4gKz0gMSArIGtleWxlbgorICB9CisKKyAgcHJpbnQgbGluZQorfQorCitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQoraWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCitlbHNlCisgIGNhdAorZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorX0FDRU9GCisKKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKK2gKK3MvLy8KK3MvXi86Lworcy9bCSBdKiQvOi8KK3MvOlwkKHNyY2Rpcik6LzovZworcy86XCR7c3JjZGlyfTovOi9nCitzLzpAc3JjZGlyQDovOi9nCitzL146Ki8vCitzLzoqJC8vCit4CitzL1woPVsJIF0qXCkuKi9cMS8KK0cKK3MvXG4vLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCitpZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCitjYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKK0JFR0lOIHsKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bworIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorCisjIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCisjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCisgIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKKyAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCisKKyMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAorIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCisjIG5ld2xpbmUgc2VxdWVuY2VzLgorCithY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorc2VkIC1uICcKK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCByc2V0Cis6cnNldAorcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KK3QgZGVmCitkCis6ZGVmCitzL1xcJC8vCit0IGJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzIi9wCitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAorZAorOmJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCit0IGNvbnQKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCit0IGNvbnQKK2QKKzpjb250CituCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgY2xlYXIKKzpjbGVhcgorcy9cXCQvLwordCBic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCitkCis6YnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAorYiBjb250CisnIDxjb25mZGVmcy5oIHwgc2VkICcKK3MvJyIkYWNfZGVsaW0iJy8iXFxcCisiL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorfQorL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7CisgIGxpbmUgPSBcJCAwCisgIHNwbGl0KGxpbmUsIGFyZywgIiAiKQorICBpZiAoYXJnWzFdID09ICIjIikgeworICAgIGRlZnVuZGVmID0gYXJnWzJdCisgICAgbWFjMSA9IGFyZ1szXQorICB9IGVsc2UgeworICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKKyAgICBtYWMxID0gYXJnWzJdCisgIH0KKyAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQorICBtYWNybyA9IG1hYzJbMV0KKyAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCisgIGlmIChEX2lzX3NldFttYWNyb10pIHsKKyAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgorICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KKyAgICBuZXh0CisgIH0gZWxzZSB7CisgICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAorICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKyAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgeworICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgorICAgICAgbmV4dAorICAgIH0KKyAgfQorfQoreyBwcmludCB9CitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgorCisKK2V2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCitzaGlmdAorZm9yIGFjX3RhZworZG8KKyAgY2FzZSAkYWNfdGFnIGluCisgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworICBlc2FjCisgIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCisgIDpbRkhMXSo6Kik7OworICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKKyAgOltGSF0tKSBhY190YWc9LTotOzsKKyAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKyAgZXNhYworICBhY19zYXZlX0lGUz0kSUZTCisgIElGUz06CisgIHNldCB4ICRhY190YWcKKyAgSUZTPSRhY19zYXZlX0lGUworICBzaGlmdAorICBhY19maWxlPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6TCkgYWNfc291cmNlPSQxOzsKKyAgOltGSF0pCisgICAgYWNfZmlsZV9pbnB1dHM9CisgICAgZm9yIGFjX2YKKyAgICBkbworICAgICAgY2FzZSAkYWNfZiBpbgorICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OworICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKwkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCisJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisJIHRlc3QgLWYgIiRhY19mIiB8fAorCSAgIGNhc2UgJGFjX2YgaW4KKwkgICBbXFwvJF0qKSBmYWxzZTs7CisJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworCSAgIGVzYWMgfHwKKwkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYworICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworCWAnIGJ5IGNvbmZpZ3VyZS4nCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKyAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKKyAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAorICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworICAgIGVzYWMKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworCisgIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisgIGVzYWMKKyAgYWNfTUtESVJfUD0kTUtESVJfUAorICBjYXNlICRNS0RJUl9QIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7CisgIGVzYWMKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCisjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KK2FjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQorYWNfc2VkX2RhdGFyb290PScKKy9kYXRhcm9vdGRpci8geworICBwCisgIHEKK30KKy9AZGF0YWRpckAvcAorL0Bkb2NkaXJAL3AKKy9AaW5mb2RpckAvcAorL0Bsb2NhbGVkaXJAL3AKKy9AbWFuZGlyQC9wJworY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OworKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCisgIHMmQGRvY2RpckAmJGRvY2RpciZnCisgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKKyAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKKyAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKK2VzYWMKK19BQ0VPRgorCisjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKyMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0CitzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CitzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAorcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0CitzJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CitzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0CitzJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0CitzJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0CiskYWNfZGF0YXJvb3RkaXJfaGFjaworIgorZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisKK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKKyAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQorCisgIHJtIC1mICIkYWNfdG1wL3N0ZGluIgorICBjYXNlICRhY19maWxlIGluCisgIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OworICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CisgIGVzYWMgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyA7OworICA6SCkKKyAgIworICAjIENPTkZJR19IRUFERVIKKyAgIworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeworICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKyAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBybSAtZiAiJGFjX2ZpbGUiCisgICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCisJfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CisgIGZpCisjIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9IiRhY19maWxlIgorX2FtX3N0YW1wX2NvdW50PTEKK2ZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbworICBjYXNlICRfYW1faGVhZGVyIGluCisgICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKKyAgICAgIGJyZWFrIDs7CisgICAgKiApCisgICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7CisgIGVzYWMKK2RvbmUKK2VjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gJGFzX2Rpcm5hbWUgLS0gIiRfYW1fYXJnIiB8fAorJGFzX2V4cHIgWCIkX2FtX2FyZyIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRfYW1fYXJnIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKKyA7OworCisgIDpDKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQorIDs7CisgIGVzYWMKKworCisgIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgorICAgICJzY3JpcHRzL2d0ZXN0LWNvbmZpZyI6RikgY2htb2QgK3ggc2NyaXB0cy9ndGVzdC1jb25maWcgOzsKKyAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IHsKKyAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKKyAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAorICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KKyAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCisgICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7CisgICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OworICBlc2FjCisgIHNoaWZ0CisgIGZvciBtZgorICBkbworICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKKyAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KKyAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAorJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkbWYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgIGVsc2UKKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAorICAgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgICAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICAgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgICAjIGV4cGFuc2lvbi4KKyAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8CiskYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyOyBhc19mbl9ta2Rpcl9wCisgICAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgICAgZG9uZQorICBkb25lCit9CisgOzsKKyAgICAibGlidG9vbCI6QykKKworICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgICBmaQorCisgICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgorICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICAgJFJNICIkY2ZnZmlsZSIKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCisjICAgICAgICAgICAgICAgICBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgorIworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgorIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9IkNYWCAiCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkPworbWFjcm9fdmVyc2lvbj0kbWFjcm9fdmVyc2lvbgorbWFjcm9fcmV2aXNpb249JG1hY3JvX3JldmlzaW9uCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkLgorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzLgorRUNITz0kbHRfRUNITworCisjIFRoZSBQQVRIIHNlcGFyYXRvciBmb3IgdGhlIGJ1aWxkIHN5c3RlbS4KK1BBVEhfU0VQQVJBVE9SPSRsdF9QQVRIX1NFUEFSQVRPUgorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEEgc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCitTRUQ9JGx0X1NFRAorCisjIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgorWHNlZD0iXCRTRUQgLWUgMXMvXlgvLyIKKworIyBBIGdyZXAgcHJvZ3JhbSB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcy4KK0dSRVA9JGx0X0dSRVAKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIEEgbGl0ZXJhbCBzdHJpbmcgbWF0Y2hlci4KK0ZHUkVQPSRsdF9GR1JFUAorCisjIEEgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyLgorTk09JGx0X05NCisKKyMgV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbWF4X2NtZF9sZW4KKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9JGFjX29iamV4dAorCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0kZXhlZXh0CisKKyMgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgInVuc2V0Ii4KK2x0X3Vuc2V0PSRsdF91bnNldAorCisjIHR1cm4gc3BhY2VzIGludG8gbmV3bGluZXMuCitTUDJOTD0kbHRfbHRfU1AyTkwKKworIyB0dXJuIG5ld2xpbmVzIGludG8gc3BhY2VzLgorTkwyU1A9JGx0X2x0X05MMlNQCisKKyMgY29udmVydCBcJGJ1aWxkIGZpbGUgbmFtZXMgdG8gXCRob3N0IGZvcm1hdC4KK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKKworIyBjb252ZXJ0IFwkYnVpbGQgZmlsZXMgdG8gdG9vbGNoYWluIGZvcm1hdC4KK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKKworIyBBbiBvYmplY3Qgc3ltYm9sIGR1bXBlci4KK09CSkRVTVA9JGx0X09CSkRVTVAKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyIuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBIb3cgdG8gZmluZCBwb3RlbnRpYWwgZmlsZXMgd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIi4KK2ZpbGVfbWFnaWNfZ2xvYj0kbHRfZmlsZV9tYWdpY19nbG9iCisKKyMgRmluZCBwb3RlbnRpYWwgZmlsZXMgdXNpbmcgbm9jYXNlZ2xvYiB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiLgord2FudF9ub2Nhc2VnbG9iPSRsdF93YW50X25vY2FzZWdsb2IKKworIyBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9JGx0X0RMTFRPT0wKKworIyBDb21tYW5kIHRvIGFzc29jaWF0ZSBzaGFyZWQgYW5kIGxpbmsgbGlicmFyaWVzLgorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCisKKyMgRmxhZ3MgdG8gY3JlYXRlIGFuIGFyY2hpdmUuCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXIuCithcmNoaXZlcl9saXN0X3NwZWM9JGx0X2FyY2hpdmVyX2xpc3Rfc3BlYworCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtLgorU1RSSVA9JGx0X1NUUklQCisKKyMgQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIFdoZXRoZXIgdG8gdXNlIGEgbG9jayBmb3Igb2xkIGFyY2hpdmUgZXh0cmFjdGlvbi4KK2xvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj0kbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0NGTEFHUworCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIuCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkLgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4CisKKyMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzIGZvciBcJE5NLgorbm1fZmlsZV9saXN0X3NwZWM9JGx0X25tX2ZpbGVfbGlzdF9zcGVjCisKKyMgVGhlIHJvb3Qgd2hlcmUgdG8gc2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzLGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuCitsdF9zeXNyb290PSRsdF9zeXNyb290CisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiLgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBNYW5pZmVzdCB0b29sLgorTUFOSUZFU1RfVE9PTD0kbHRfTUFOSUZFU1RfVE9PTAorCisjIFRvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFguCitEU1lNVVRJTD0kbHRfRFNZTVVUSUwKKworIyBUb29sIHRvIGNoYW5nZSBnbG9iYWwgdG8gbG9jYWwgc3ltYm9scyBvbiBNYWMgT1MgWC4KK05NRURJVD0kbHRfTk1FRElUCisKKyMgVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWC4KK0xJUE89JGx0X0xJUE8KKworIyBsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWC4KK09UT09MPSRsdF9PVE9PTAorCisjIGxkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40LgorT1RPT0w2ND0kbHRfT1RPT0w2NAorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0kbGliZXh0CisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0kbHRfc2hyZXh0X2NtZHMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IGxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSRsdF92YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaworCisjIERvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIFNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRQorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIFBlcm1pc3Npb24gbW9kZSBvdmVycmlkZSBmb3IgaW5zdGFsbGF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMuCitpbnN0YWxsX292ZXJyaWRlX21vZGU9JGx0X2luc3RhbGxfb3ZlcnJpZGVfbW9kZQorCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIGluc3RhbGxhdGlvbiBvZiBhIHNoYXJlZCBhcmNoaXZlLgorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIEFzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorIyBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMuCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzLgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRAorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2NfbworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYy4KK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIFdoZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5LgorY29tcGlsZXJfbmVlZHNfb2JqZWN0PSRsdF9jb21waWxlcl9uZWVkc19vYmplY3QKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworIyBhIHNoYXJlZCBhcmNoaXZlLgorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kcworCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUVcJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyMgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyMgImFic29sdXRlIixpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyBcJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyMgbGlicmFyeSBpcyByZWxvY2F0ZWQuCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9JGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZQorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyMgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljCisKKyMgU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyMgdG8gcnVudGltZSBwYXRoIGxpc3QuCitpbmhlcml0X3JwYXRoPSRpbmhlcml0X3JwYXRoCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlicworCisjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcworCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzLgorcHJlbGlua19jbWRzPSRsdF9wcmVsaW5rX2NtZHMKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zLgorcG9zdGxpbmtfY21kcz0kbHRfcG9zdGxpbmtfY21kcworCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcy4KK2ZpbGVfbGlzdF9zcGVjPSRsdF9maWxlX2xpc3Rfc3BlYworCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KKworIyBUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlycworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworIyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0cworcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHMKK3ByZWRlcHM9JGx0X3ByZWRlcHMKK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwcworCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aAorCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX0xUX0VPRgorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK19MVF9FT0YKKyAgICA7OworICBlc2FjCisKKworbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCisKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgaWYgdGVzdCB4IiR4c2lfc2hlbGwiID0geHllczsgdGhlbgorICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lICgpJC8sL159ICMgZnVuY19kaXJuYW1lIC9jXAorZnVuY19kaXJuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfYmFzZW5hbWUgL2NcCitmdW5jX2Jhc2VuYW1lICgpXAore1wKK1wgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Jhc2VuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgL2NcCitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCitcICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3RyaXBuYW1lICgpJC8sL159ICMgZnVuY19zdHJpcG5hbWUgL2NcCitmdW5jX3N0cmlwbmFtZSAoKVwKK3tcCitcICAgICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmVcCitcICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC5cCitcICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9XAorXCAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifVwKK1wgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zdHJpcG5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3NwbGl0X2xvbmdfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9sb25nX29wdCAvY1wKK2Z1bmNfc3BsaXRfbG9uZ19vcHQgKClcCit7XAorXCAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9JHsxJSU9Kn1cCitcICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPSR7MSMqPX1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zcGxpdF9sb25nX29wdCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3BsaXRfc2hvcnRfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9zaG9ydF9vcHQgL2NcCitmdW5jX3NwbGl0X3Nob3J0X29wdCAoKVwKK3tcCitcICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZz0kezEjPz99XAorXCAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19sbzJvICgpJC8sL159ICMgZnVuY19sbzJvIC9jXAorZnVuY19sbzJvICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICoubG8pIGZ1bmNfbG8yb19yZXN1bHQ9JHsxJS5sb30uJHtvYmpleHR9IDs7XAorXCAgICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7O1wKK1wgICAgZXNhY1wKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xvMm8gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3hmb3JtICgpJC8sL159ICMgZnVuY194Zm9ybSAvY1wKK2Z1bmNfeGZvcm0gKClcCit7XAorICAgIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG9cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY194Zm9ybSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfYXJpdGggKCkkLywvXn0gIyBmdW5jX2FyaXRoIC9jXAorZnVuY19hcml0aCAoKVwKK3tcCisgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICQqICkpXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXJpdGggaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2xlbiAoKSQvLC9efSAjIGZ1bmNfbGVuIC9jXAorZnVuY19sZW4gKClcCit7XAorICAgIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xlbiBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCitmaQorCitpZiB0ZXN0IHgiJGx0X3NoZWxsX2FwcGVuZCIgPSB4eWVzOyB0aGVuCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZCAoKSQvLC9efSAjIGZ1bmNfYXBwZW5kIC9jXAorZnVuY19hcHBlbmQgKClcCit7XAorICAgIGV2YWwgIiR7MX0rPVxcJHsyfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZF9xdW90ZWQgKCkkLywvXn0gIyBmdW5jX2FwcGVuZF9xdW90ZWQgL2NcCitmdW5jX2FwcGVuZF9xdW90ZWQgKClcCit7XAorXCAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IlwKK1wgICAgZXZhbCAiJHsxfSs9XFxcXCBcXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmRfcXVvdGVkIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgd2hlcmUgcG9zc2libGUgYnkgZGlyZWN0IHVzZSBvZiAnKz0nCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFthLXpBLVpfXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW2EtekEtWl9dXHsxLFx9XCkgIiVcMT0iJFwxJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitmaQorCitpZiB0ZXN0IHgiJF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWwiID0geCI6IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFVuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogVW5hYmxlIHRvIHN1YnN0aXR1dGUgZXh0ZW5kZWQgc2hlbGwgZnVuY3Rpb25zIGluICRvZmlsZSIgPiYyO30KK2ZpCisKKworICAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCisgIGNobW9kICt4ICIkb2ZpbGUiCisKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRvZmlsZSIKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBDWFgKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xEX0NYWAorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWdfQ1hYCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfQ1hYCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9DWFgKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0NfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9DWFgKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljLgorYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYCisKKyMgV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHkuCitjb21waWxlcl9uZWVkc19vYmplY3Q9JGx0X2NvbXBpbGVyX25lZWRzX29iamVjdF9DWFgKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFgKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfQ1hYCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0NYWAorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgaWYgZGlmZmVyZW50IGZyb20gYnVpbGRpbmcKKyMgYSBzaGFyZWQgYXJjaGl2ZS4KK21vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19DWFgKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX0NYWAorCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZF9DWFgKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKworIyBGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWAorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAiLXJwYXRoIiBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X0NYWAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyMgImFic29sdXRlIixpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyBcJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyMgbGlicmFyeSBpcyByZWxvY2F0ZWQuCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9JGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyMgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0NYWAorCisjIFNldCB0byB5ZXMgaWYgbGlua2VyIGFkZHMgcnVudGltZSBwYXRocyBvZiBkZXBlbmRlbnQgbGlicmFyaWVzCisjIHRvIHJ1bnRpbWUgcGF0aCBsaXN0LgoraW5oZXJpdF9ycGF0aD0kaW5oZXJpdF9ycGF0aF9DWFgKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX0NYWAorCisjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWAorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0NYWAorCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19DWFgKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19DWFgKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgcHJvZ3JhbXMgKGFnYWluc3QgbGlicmFyaWVzKSB3aXRoIHRlbXBsYXRlcy4KK3ByZWxpbmtfY21kcz0kbHRfcHJlbGlua19jbWRzX0NYWAorCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgZmluaXNoaW5nIGxpbmtpbmcgcHJvZ3JhbXMuCitwb3N0bGlua19jbWRzPSRsdF9wb3N0bGlua19jbWRzX0NYWAorCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcy4KK2ZpbGVfbGlzdF9zcGVjPSRsdF9maWxlX2xpc3Rfc3BlY19DWFgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX0NYWAorCisjIFRoZSBkaXJlY3RvcmllcyBzZWFyY2hlZCBieSB0aGlzIGNvbXBpbGVyIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlycz0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWAorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworIyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19DWFgKK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0NYWAorcHJlZGVwcz0kbHRfcHJlZGVwc19DWFgKK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19DWFgKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYCisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IENYWAorX0xUX0VPRgorCisgOzsKKworICBlc2FjCitkb25lICMgZm9yIGFjX3RhZworCisKK2FzX2ZuX2V4aXQgMAorX0FDRU9GCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCit0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAorICBhc19mbl9lcnJvciAkPyAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCisjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKyMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCisjIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisjIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCisjIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgYWNfY3Nfc3VjY2Vzcz06CisgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAxCitmaQoraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9CitmaQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvbmZpZ3VyZS5hYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTkyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDY4IEBACittNF9pbmNsdWRlKG00L2FjeF9wdGhyZWFkLm00KQorCisjIEF0IHRoaXMgcG9pbnQsIHRoZSBYY29kZSBwcm9qZWN0IGFzc3VtZXMgdGhlIHZlcnNpb24gc3RyaW5nIHdpbGwgYmUgdGhyZWUKKyMgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMgYW5kIHN1cnJvdW5kZWQgYnkgc3F1YXJlIGJyYWNrZXRzIChlLmcuCisjICJbMS4wLjFdIikuIEl0IGFsc28gYXN1bWVzIHRoYXQgdGhlcmUgd29uJ3QgYmUgYW55IGNsb3NpbmcgcGFyZW50aGVzaXMKKyMgYmV0d2VlbiAiQUNfSU5JVCgiIGFuZCB0aGUgY2xvc2luZyAiKSIgaW5jbHVkaW5nIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgorQUNfSU5JVChbR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29ya10sCisgICAgICAgIFsxLjcuMF0sCisgICAgICAgIFtnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb21dLAorICAgICAgICBbZ3Rlc3RdKQorCisjIFByb3ZpZGUgdmFyaW91cyBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlIEF1dG9jb25mIGFuZCBjb25maWd1cmUgcHJvY2Vzc2VzLgorQUNfUFJFUkVRKFsyLjU5XSkKK0FDX0NPTkZJR19TUkNESVIoWy4vTElDRU5TRV0pCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCitBQ19DT05GSUdfQVVYX0RJUihbYnVpbGQtYXV4XSkKK0FDX0NPTkZJR19IRUFERVJTKFtidWlsZC1hdXgvY29uZmlnLmhdKQorQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCitBQ19DT05GSUdfRklMRVMoW3NjcmlwdHMvZ3Rlc3QtY29uZmlnXSwgW2NobW9kICt4IHNjcmlwdHMvZ3Rlc3QtY29uZmlnXSkKKworIyBJbml0aWFsaXplIEF1dG9tYWtlIHdpdGggdmFyaW91cyBvcHRpb25zLiBXZSByZXF1aXJlIGF0IGxlYXN0IHYxLjksIHByZXZlbnQKKyMgcGVkYW50aWMgY29tcGxhaW50cyBhYm91dCBwYWNrYWdlIGZpbGVzLCBhbmQgZW5hYmxlIHZhcmlvdXMgZGlzdHJpYnV0aW9uCisjIHRhcmdldHMuCitBTV9JTklUX0FVVE9NQUtFKFsxLjkgZGlzdC1iemlwMiBkaXN0LXppcCBmb3JlaWduIHN1YmRpci1vYmplY3RzXSkKKworIyBDaGVjayBmb3IgcHJvZ3JhbXMgdXNlZCBpbiBidWlsZGluZyBHb29nbGUgVGVzdC4KK0FDX1BST0dfQ0MKK0FDX1BST0dfQ1hYCitBQ19MQU5HKFtDKytdKQorQUNfUFJPR19MSUJUT09MCisKKyMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IEN1cnJlbnRseSB3ZSBhcmVuJ3QgcnVubmluZyB0aGUgUHl0aG9uIHRlc3RzCisjIGFnYWluc3QgdGhlIGludGVycHJldGVyIGRldGVjdGVkIGJ5IEFNX1BBVEhfUFlUSE9OLCBhbmQgc28gd2UgY29uZGl0aW9uCisjIEhBVkVfUFlUSE9OIGJ5IHJlcXVpcmluZyAicHl0aG9uIiB0byBiZSBpbiB0aGUgUEFUSCwgYW5kIHRoYXQgaW50ZXJwcmV0ZXIncworIyB2ZXJzaW9uIHRvIGJlID49IDIuMy4gVGhpcyB3aWxsIGFsbG93IHRoZSBzY3JpcHRzIHRvIHVzZSBhICIvdXNyL2Jpbi9lbnYiCisjIGhhc2hiYW5nLgorUFlUSE9OPSAgIyBXZSAqZG8gbm90KiBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcHl0aG9uIGludGVycHJldGVyCitBQ19QQVRIX1BST0coW1BZVEhPTl0sW3B5dGhvbl0sWzpdKQorQVNfSUYoW3Rlc3QgIiRQWVRIT04iICE9ICI6Il0sCisgICAgICBbQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oWyRQWVRIT05dLFsyLjNdLFs6XSxbUFlUSE9OPSI6Il0pXSkKK0FNX0NPTkRJVElPTkFMKFtIQVZFX1BZVEhPTl0sW3Rlc3QgIiRQWVRIT04iICE9ICI6Il0pCisKKyMgQ29uZmlndXJlIHB0aHJlYWRzLgorQUNfQVJHX1dJVEgoW3B0aHJlYWRzXSwKKyAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXB0aHJlYWRzXSwKKyAgICAgICAgICAgICAgIFt1c2UgcHRocmVhZHMgKGRlZmF1bHQgaXMgeWVzKV0pXSwKKyAgICAgICAgICAgIFt3aXRoX3B0aHJlYWRzPSR3aXRodmFsXSwKKyAgICAgICAgICAgIFt3aXRoX3B0aHJlYWRzPWNoZWNrXSkKKworaGF2ZV9wdGhyZWFkcz1ubworQVNfSUYoW3Rlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhubyJdLAorICAgICAgW0FDWF9QVEhSRUFEKAorICAgICAgICBbXSwKKyAgICAgICAgW0FTX0lGKFt0ZXN0ICJ4JHdpdGhfcHRocmVhZHMiICE9ICJ4Y2hlY2siXSwKKyAgICAgICAgICAgICAgIFtBQ19NU0dfRkFJTFVSRSgKKyAgICAgICAgICAgICAgICAgWy0td2l0aC1wdGhyZWFkcyB3YXMgc3BlY2lmaWVkLCBidXQgdW5hYmxlIHRvIGJlIHVzZWRdKV0pXSkKKyAgICAgICBoYXZlX3B0aHJlYWRzPSIkYWN4X3B0aHJlYWRfb2siXSkKK0FNX0NPTkRJVElPTkFMKFtIQVZFX1BUSFJFQURTXSxbdGVzdCAieCRoYXZlX3B0aHJlYWRzIiA9ICJ4eWVzIl0pCitBQ19TVUJTVChQVEhSRUFEX0NGTEFHUykKK0FDX1NVQlNUKFBUSFJFQURfTElCUykKKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayBmb3IgdGhlIG5lY2Vzc2FyeSBzeXN0ZW0gaGVhZGVycy4KKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayB0aGUgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBvdGhlciBjb21waWxlcgorIyBhbmQgYXJjaGl0ZWN0dXJlIGNoYXJhY3RlcmlzdGljcy4KKworIyBPdXRwdXQgdGhlIGdlbmVyYXRlZCBmaWxlcy4gTm8gZnVydGhlciBhdXRvY29uZiBtYWNyb3MgbWF5IGJlIHVzZWQuCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWEwM2IyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCkBAIC0wLDAgKzEsOTU5MiBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBTb21ldGltZXMgaXQncyBkZXNpcmFibGUgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYnkgY29tcGlsaW5nIGEgc2luZ2xlIGZpbGUuCisvLyBUaGlzIGZpbGUgc2VydmVzIHRoaXMgcHVycG9zZS4KKworLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBndGVzdC5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuCisvLyB3aGVuIGl0J3MgZnVzZWQuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwdWxsIGluIHRoZSByZWFsIGd0ZXN0ICouY2MgZmlsZXMuCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKworLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBVdGlsaXRpZXMgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmIGFuZCBjb2RlIHRoYXQgdXNlcyBHb29nbGUgVGVzdAorLy8gKGUuZy4gZnJhbWV3b3JrcyBidWlsdCBvbiB0b3Agb2YgR29vZ2xlIFRlc3QpLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBjYW4gYmUgdXNlZCB0byBtb2NrIG91dCBHb29nbGUgVGVzdCBmYWlsdXJlIHJlcG9ydGluZworLy8gc28gdGhhdCB3ZSBjYW4gdGVzdCBHb29nbGUgVGVzdCBvciBjb2RlIHRoYXQgYnVpbGRzIG9uIEdvb2dsZSBUZXN0LgorLy8KKy8vIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QgdG8gdGhlCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IG9iamVjdCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3Igd2hlbmV2ZXIgYSBHb29nbGUgVGVzdAorLy8gZmFpbHVyZSBpcyByZXBvcnRlZC4gSXQgY2FuIGVpdGhlciBpbnRlcmNlcHQgb25seSBmYWlsdXJlcyB0aGF0IGFyZQorLy8gZ2VuZXJhdGVkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhpcyBvYmplY3Qgb3IgaXQgY2FuIGludGVyY2VwdAorLy8gYWxsIGdlbmVyYXRlZCBmYWlsdXJlcy4gVGhlIHNjb3BlIG9mIHRoaXMgbW9jayBvYmplY3QgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aAorLy8gdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgdHdvIGFyZ3VtZW50cyBjb25zdHJ1Y3Rvci4KK2NsYXNzIEdURVNUX0FQSV8gU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSB0d28gcG9zc2libGUgbW9ja2luZyBtb2RlcyBvZiB0aGlzIG9iamVjdC4KKyAgZW51bSBJbnRlcmNlcHRNb2RlIHsKKyAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgIC8vIEludGVyY2VwdHMgb25seSB0aHJlYWQgbG9jYWwgZmFpbHVyZXMuCisgICAgSU5URVJDRVBUX0FMTF9USFJFQURTICAgICAgICAgICAvLyBJbnRlcmNlcHRzIGFsbCBmYWlsdXJlcy4KKyAgfTsKKworICAvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkCisgIC8vIGJ5IEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorICAvLyByZXN1bHRzLiBUaGlzIHJlcG9ydGVyIHdpbGwgb25seSBjYXRjaCBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQKKyAgLy8gdGhyZWFkLiBERVBSRUNBVEVECisgIGV4cGxpY2l0IFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHlvdSBjYW4gY2hvb3NlIHRoZSBpbnRlcmNlcHRpb24gc2NvcGUgb2YgdGhpcyBvYmplY3QuCisgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICB2aXJ0dWFsIH5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworCisgIC8vIEFwcGVuZHMgdGhlIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUgVGVzdFBhcnRSZXN1bHRBcnJheQorICAvLyByZWNlaXZlZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UKKyAgLy8gaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgcHJpdmF0ZToKKyAgdm9pZCBJbml0KCk7CisKKyAgY29uc3QgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZV87CisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIG9sZF9yZXBvcnRlcl87CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIGNvbnN0IHJlc3VsdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgYW5kCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpLiAgSXRzIGRlc3RydWN0b3IgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KKy8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgZXhhY3RseSBvbmUgZmFpbHVyZSB0aGF0IGhhcyB0aGUgZ2l2ZW4KKy8vIHR5cGUgYW5kIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuICBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBhCisvLyBub24tZmF0YWwgZmFpbHVyZSB3aWxsIGJlIGdlbmVyYXRlZC4KK2NsYXNzIEdURVNUX0FQSV8gU2luZ2xlRmFpbHVyZUNoZWNrZXIgeworIHB1YmxpYzoKKyAgLy8gVGhlIGNvbnN0cnVjdG9yIHJlbWVtYmVycyB0aGUgYXJndW1lbnRzLgorICBTaW5nbGVGYWlsdXJlQ2hlY2tlcihjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1YnN0cik7CisgIH5TaW5nbGVGYWlsdXJlQ2hlY2tlcigpOworIHByaXZhdGU6CisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIGNvbnN0IHJlc3VsdHNfOworICBjb25zdCBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlXzsKKyAgY29uc3Qgc3RyaW5nIHN1YnN0cl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTaW5nbGVGYWlsdXJlQ2hlY2tlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gQSBzZXQgb2YgbWFjcm9zIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgb3IgY29kZSB0aGF0J3MgZXhwZWN0ZWQKKy8vIHRvIGdlbmVyYXRlIEdvb2dsZSBUZXN0IGZhdGFsIGZhaWx1cmVzLiAgSXQgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KKy8vIHN0YXRlbWVudCB3aWxsIGNhdXNlIGV4YWN0bHkgb25lIGZhdGFsIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2l0aCAnc3Vic3RyJworLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgbWFjcm8uIEVYUEVDVF9GQVRBTF9GQUlMVVJFIG9ubHkKKy8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZAorLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLgorLy8KKy8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudAorLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisvLworLy8gS25vd24gcmVzdHJpY3Rpb25zOgorLy8gICAtICdzdGF0ZW1lbnQnIGNhbm5vdCByZWZlcmVuY2UgbG9jYWwgbm9uLXN0YXRpYyB2YXJpYWJsZXMgb3IKKy8vICAgICBub24tc3RhdGljIG1lbWJlcnMgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgorLy8gICAtICdzdGF0ZW1lbnQnIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS4KKy8vICAgLSBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byB0aGlzIG1hY3JvLgorLy8KKy8vIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvCisvLyBtYWNyb3MgYXJlIG11Y2ggYWxpa2UsIHdlIGNhbm5vdCByZWZhY3RvciB0aGVtIHRvIHVzZSBhIGNvbW1vbgorLy8gaGVscGVyIG1hY3JvLCBkdWUgdG8gc29tZSBwZWN1bGlhcml0eSBpbiBob3cgdGhlIHByZXByb2Nlc3NvcgorLy8gd29ya3MuICBUaGUgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbgorLy8gZ3Rlc3RfdW5pdHRlc3QuY2Mgd2lsbCBmYWlsIHRvIGNvbXBpbGUgaWYgd2UgZG8gdGhhdC4KKyNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8geyBcCisgICAgY2xhc3MgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXIge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9O1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXI6OkV4ZWN1dGUoKTtcCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2RlZmluZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7IFwKKyAgICBjbGFzcyBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlciB7XAorICAgICBwdWJsaWM6XAorICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZSgpIHsgc3RhdGVtZW50OyB9XAorICAgIH07XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKKyAgICAgICAgICBJTlRFUkNFUFRfQUxMX1RIUkVBRFMsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXI6OkV4ZWN1dGUoKTtcCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworLy8gQSBtYWNybyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkIHRvCisvLyBnZW5lcmF0ZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMuICBJdCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuCisvLyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSBleGFjdGx5IG9uZSBub24tZmF0YWwgR29vZ2xlIFRlc3QgZmFpbHVyZSB3aXRoICdzdWJzdHInCisvLyBiZWluZyBwYXJ0IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCisvLworLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhpcyBtYWNyby4gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUgb25seQorLy8gYWZmZWN0cyBhbmQgY29uc2lkZXJzIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgYW5kCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyBkb2VzIHRoZSBzYW1lIGJ1dCBmb3IgYWxsIHRocmVhZHMuCisvLworLy8gJ3N0YXRlbWVudCcgaXMgYWxsb3dlZCB0byByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzIGFuZCBtZW1iZXJzIG9mCisvLyB0aGUgY3VycmVudCBvYmplY3QuCisvLworLy8gVGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIGlzIGRvbmUgY29ycmVjdGx5IGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50CisvLyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9yIGFib3J0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KKy8vCisvLyBLbm93biByZXN0cmljdGlvbnM6CisvLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4KKy8vCisvLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bworLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24KKy8vIGhlbHBlciBtYWNybywgZHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgaW4gaG93IHRoZSBwcmVwcm9jZXNzb3IKKy8vIHdvcmtzLiAgSWYgd2UgZG8gdGhhdCwgdGhlIGNvZGUgd29uJ3QgY29tcGlsZSB3aGVuIHRoZSB1c2VyIGdpdmVzCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGEgc3RhdGVtZW50IHRoYXQgY29udGFpbnMgYSBtYWNybyB0aGF0CisvLyBleHBhbmRzIHRvIGNvZGUgY29udGFpbmluZyBhbiB1bnByb3RlY3RlZCBjb21tYS4gIFRoZQorLy8gQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbiBndGVzdF91bml0dGVzdC5jYworLy8gY2F0Y2hlcyB0aGF0LgorLy8KKy8vIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIGhhdmUgdG8gd3JpdGUKKy8vICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH0KKy8vIGluc3RlYWQgb2YKKy8vICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpCisvLyB0byBhdm9pZCBhbiBNU1ZDIHdhcm5pbmcgb24gdW5yZWFjaGFibGUgY29kZS4KKyNkZWZpbmUgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8ge1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwKKyAgICAgICAgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKKyAgICAgICAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgJmd0ZXN0X2ZhaWx1cmVzKTtcCisgICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjZGVmaW5lIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCBcCisgICAgICAgIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9BTExfVEhSRUFEUywgXAorICAgICAgICAgICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8d2NoYXIuaD4KKyNpbmNsdWRlIDx3Y3R5cGUuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZiBHVEVTVF9PU19MSU5VWAorCisvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YKKy8vIGdldHRpbWVvZmRheSgpLgorIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorCisjIGluY2x1ZGUgPGZjbnRsLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8bGltaXRzLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c2NoZWQuaD4gIC8vIE5PTElOVAorLy8gRGVjbGFyZXMgdnNucHJpbnRmKCkuICBUaGlzIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvbW1hbi5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3RyaW5nPgorCisjZWxpZiBHVEVTVF9PU19TWU1CSUFOCisjIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfWk9TCisjIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKworLy8gT24gei9PUyB3ZSBhZGRpdGlvbmFsbHkgbmVlZCBzdHJpbmdzLmggZm9yIHN0cmNhc2VjbXAuCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UuCisKKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCisKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIHByb3Blci4KKworIyBpbmNsdWRlIDxpby5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90aW1lYi5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBOT0xJTlQKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTX01JTkdXCisvLyBNaW5HVyBoYXMgZ2V0dGltZW9mZGF5KCkgYnV0IG5vdCBfZnRpbWU2NCgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyAgIGdldHRpbWVvZmRheSgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgdGltZSBvbgorLy8gICBXaW5kb3dzLCBsaWtlIEdldFRpY2tDb3VudCgpIG9yIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCkuICBNaW5HVworLy8gICBzdXBwb3J0cyB0aGVzZS4gIGNvbnNpZGVyIHVzaW5nIHRoZW0gaW5zdGVhZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01JTkdXCisKKy8vIGNwcGxpbnQgdGhpbmtzIHRoYXQgdGhlIGhlYWRlciBpcyBhbHJlYWR5IGluY2x1ZGVkLCBzbyB3ZSB3YW50IHRvCisvLyBzaWxlbmNlIGl0LgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKworI2Vsc2UKKworLy8gQXNzdW1lIG90aGVyIHBsYXRmb3JtcyBoYXZlIGdldHRpbWVvZmRheSgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyAgIGdldHRpbWVvZmRheSgpLgorIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorCisvLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bworLy8gc2lsZW5jZSBpdC4KKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAorCisjZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyBpbmNsdWRlIDxzdGRleGNlcHQ+CisjZW5kaWYKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8bmV0ZGIuaD4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIHVzZWQgYnkgdGhlIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBwdXJlbHkgR29vZ2xlIFRlc3QncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbi4gIFBsZWFzZQorLy8gRE8gTk9UICNJTkNMVURFIElUIElOIEEgVVNFUiBQUk9HUkFNLgorCisjaWZuZGVmIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKyNkZWZpbmUgR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXworCisvLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8gaXMgZGVmaW5lZCB0byAxIGlmZiB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiB1bml0IGlzCisvLyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb247IG90aGVyd2lzZSBpdCdzIHVuZGVmaW5lZC4KKyNpZiAhR1RFU1RfSU1QTEVNRU5UQVRJT05fCisvLyBBIHVzZXIgaXMgdHJ5aW5nIHRvIGluY2x1ZGUgdGhpcyBmcm9tIGhpcyBjb2RlIC0ganVzdCBzYXkgbm8uCisjIGVycm9yICJndGVzdC1pbnRlcm5hbC1pbmwuaCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uIgorIyBlcnJvciAiSXQgbXVzdCBub3QgYmUgaW5jbHVkZWQgZXhjZXB0IGJ5IEdvb2dsZSBUZXN0IGl0c2VsZi4iCisjZW5kaWYgIC8vIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyMgaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBzdHJ0b2xsL19zdHJ0b3VsNjQvbWFsbG9jL2ZyZWUuCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBGb3IgbWVtbW92ZS4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVjbGFyZXMgdGhlIGZsYWdzLgorLy8KKy8vIFdlIGRvbid0IHdhbnQgdGhlIHVzZXJzIHRvIG1vZGlmeSB0aGlzIGZsYWcgaW4gdGhlIGNvZGUsIGJ1dCB3YW50CisvLyBHb29nbGUgVGVzdCdzIG93biB1bml0IHRlc3RzIHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0LiBUaGVyZWZvcmUgd2UKKy8vIGRlY2xhcmUgaXQgaGVyZSBhcyBvcHBvc2VkIHRvIGluIGd0ZXN0LmguCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgdmFsdWUgb2YgR2V0VGVzdFR5cGVJZCgpIGFzIHNlZW4gZnJvbSB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0CisvLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLgorR1RFU1RfQVBJXyBleHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0OworCisvLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuCitjb25zdCBjaGFyIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWdbXSA9ICJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyI7Citjb25zdCBjaGFyIGtCcmVha09uRmFpbHVyZUZsYWdbXSA9ICJicmVha19vbl9mYWlsdXJlIjsKK2NvbnN0IGNoYXIga0NhdGNoRXhjZXB0aW9uc0ZsYWdbXSA9ICJjYXRjaF9leGNlcHRpb25zIjsKK2NvbnN0IGNoYXIga0NvbG9yRmxhZ1tdID0gImNvbG9yIjsKK2NvbnN0IGNoYXIga0ZpbHRlckZsYWdbXSA9ICJmaWx0ZXIiOworY29uc3QgY2hhciBrTGlzdFRlc3RzRmxhZ1tdID0gImxpc3RfdGVzdHMiOworY29uc3QgY2hhciBrT3V0cHV0RmxhZ1tdID0gIm91dHB1dCI7Citjb25zdCBjaGFyIGtQcmludFRpbWVGbGFnW10gPSAicHJpbnRfdGltZSI7Citjb25zdCBjaGFyIGtSYW5kb21TZWVkRmxhZ1tdID0gInJhbmRvbV9zZWVkIjsKK2NvbnN0IGNoYXIga1JlcGVhdEZsYWdbXSA9ICJyZXBlYXQiOworY29uc3QgY2hhciBrU2h1ZmZsZUZsYWdbXSA9ICJzaHVmZmxlIjsKK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VEZXB0aEZsYWdbXSA9ICJzdGFja190cmFjZV9kZXB0aCI7Citjb25zdCBjaGFyIGtTdHJlYW1SZXN1bHRUb0ZsYWdbXSA9ICJzdHJlYW1fcmVzdWx0X3RvIjsKK2NvbnN0IGNoYXIga1Rocm93T25GYWlsdXJlRmxhZ1tdID0gInRocm93X29uX2ZhaWx1cmUiOworCisvLyBBIHZhbGlkIHJhbmRvbSBzZWVkIG11c3QgYmUgaW4gWzEsIGtNYXhSYW5kb21TZWVkXS4KK2NvbnN0IGludCBrTWF4UmFuZG9tU2VlZCA9IDk5OTk5OworCisvLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCisvLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGJvb2wgZ19oZWxwX2ZsYWc7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitHVEVTVF9BUElfIFRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorR1RFU1RfQVBJXyBib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSk7CisKKy8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpOworCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYSBkYXRlIHN0cmluZyBpbiB0aGUgSVNPIDg2MDEKKy8vIGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uICBOLkIuOiBkdWUgdG8gdGhlIHVzZSB0aGUKKy8vIG5vbi1yZWVudHJhbnQgbG9jYWx0aW1lKCkgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLiAgRG8KKy8vIG5vdCB1c2UgaXQgaW4gYW55IGNvZGUgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKTsKKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZiAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorR1RFU1RfQVBJXyBib29sIFBhcnNlSW50MzJGbGFnKAorICAgIGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgSW50MzIqIHZhbHVlKTsKKworLy8gUmV0dXJucyBhIHJhbmRvbSBzZWVkIGluIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gYmFzZWQgb24gdGhlCisvLyBnaXZlbiAtLWd0ZXN0X3JhbmRvbV9zZWVkIGZsYWcgdmFsdWUuCitpbmxpbmUgaW50IEdldFJhbmRvbVNlZWRGcm9tRmxhZyhJbnQzMiByYW5kb21fc2VlZF9mbGFnKSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCByYXdfc2VlZCA9IChyYW5kb21fc2VlZF9mbGFnID09IDApID8KKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oR2V0VGltZUluTWlsbGlzKCkpIDoKKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmFuZG9tX3NlZWRfZmxhZyk7CisKKyAgLy8gTm9ybWFsaXplcyB0aGUgYWN0dWFsIHNlZWQgdG8gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBzdWNoIHRoYXQKKyAgLy8gaXQncyBlYXN5IHRvIHR5cGUuCisgIGNvbnN0IGludCBub3JtYWxpemVkX3NlZWQgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50PigocmF3X3NlZWQgLSAxVSkgJQorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtNYXhSYW5kb21TZWVkKSkgKyAxOworICByZXR1cm4gbm9ybWFsaXplZF9zZWVkOworfQorCisvLyBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCByYW5kb20gc2VlZCBhZnRlciAnc2VlZCcuICBUaGUgYmVoYXZpb3IgaXMKKy8vIHVuZGVmaW5lZCBpZiAnc2VlZCcgaXMgaW52YWxpZC4gIFRoZSBzZWVkIGFmdGVyIGtNYXhSYW5kb21TZWVkIGlzCisvLyBjb25zaWRlcmVkIHRvIGJlIDEuCitpbmxpbmUgaW50IEdldE5leHRSYW5kb21TZWVkKGludCBzZWVkKSB7CisgIEdURVNUX0NIRUNLXygxIDw9IHNlZWQgJiYgc2VlZCA8PSBrTWF4UmFuZG9tU2VlZCkKKyAgICAgIDw8ICJJbnZhbGlkIHJhbmRvbSBzZWVkICIgPDwgc2VlZCA8PCAiIC0gbXVzdCBiZSBpbiBbMSwgIgorICAgICAgPDwga01heFJhbmRvbVNlZWQgPDwgIl0uIjsKKyAgY29uc3QgaW50IG5leHRfc2VlZCA9IHNlZWQgKyAxOworICByZXR1cm4gKG5leHRfc2VlZCA+IGtNYXhSYW5kb21TZWVkKSA/IDEgOiBuZXh0X3NlZWQ7Cit9CisKKy8vIFRoaXMgY2xhc3Mgc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gaXRzIGMndG9yLCBhbmQKKy8vIHJlc3RvcmVzIHRoZW0gaW4gaXRzIGQndG9yLgorY2xhc3MgR1Rlc3RGbGFnU2F2ZXIgeworIHB1YmxpYzoKKyAgLy8gVGhlIGMndG9yLgorICBHVGVzdEZsYWdTYXZlcigpIHsKKyAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c18gPSBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKKyAgICBicmVha19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7CisgICAgY2F0Y2hfZXhjZXB0aW9uc18gPSBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOworICAgIGNvbG9yXyA9IEdURVNUX0ZMQUcoY29sb3IpOworICAgIGRlYXRoX3Rlc3Rfc3R5bGVfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKKyAgICBkZWF0aF90ZXN0X3VzZV9mb3JrXyA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisgICAgZmlsdGVyXyA9IEdURVNUX0ZMQUcoZmlsdGVyKTsKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF8gPSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKKyAgICBsaXN0X3Rlc3RzXyA9IEdURVNUX0ZMQUcobGlzdF90ZXN0cyk7CisgICAgb3V0cHV0XyA9IEdURVNUX0ZMQUcob3V0cHV0KTsKKyAgICBwcmludF90aW1lXyA9IEdURVNUX0ZMQUcocHJpbnRfdGltZSk7CisgICAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhyYW5kb21fc2VlZCk7CisgICAgcmVwZWF0XyA9IEdURVNUX0ZMQUcocmVwZWF0KTsKKyAgICBzaHVmZmxlXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSk7CisgICAgc3RhY2tfdHJhY2VfZGVwdGhfID0gR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7CisgICAgc3RyZWFtX3Jlc3VsdF90b18gPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOworICAgIHRocm93X29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgfQorCisgIC8vIFRoZSBkJ3RvciBpcyBub3QgdmlydHVhbC4gIERPIE5PVCBJTkhFUklUIEZST00gVEhJUyBDTEFTUy4KKyAgfkdUZXN0RmxhZ1NhdmVyKCkgeworICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOworICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBicmVha19vbl9mYWlsdXJlXzsKKyAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gY2F0Y2hfZXhjZXB0aW9uc187CisgICAgR1RFU1RfRkxBRyhjb2xvcikgPSBjb2xvcl87CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9IGRlYXRoX3Rlc3Rfc3R5bGVfOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKKyAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSBmaWx0ZXJfOworICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID0gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBsaXN0X3Rlc3RzXzsKKyAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSBvdXRwdXRfOworICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBwcmludF90aW1lXzsKKyAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IHJhbmRvbV9zZWVkXzsKKyAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXRfOworICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBzaHVmZmxlXzsKKyAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IHN0YWNrX3RyYWNlX2RlcHRoXzsKKyAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gc3RyZWFtX3Jlc3VsdF90b187CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRocm93X29uX2ZhaWx1cmVfOworICB9CisKKyBwcml2YXRlOgorICAvLyBGaWVsZHMgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzIG9mIGZsYWdzLgorICBib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKKyAgYm9vbCBicmVha19vbl9mYWlsdXJlXzsKKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKKyAgc3RkOjpzdHJpbmcgY29sb3JfOworICBzdGQ6OnN0cmluZyBkZWF0aF90ZXN0X3N0eWxlXzsKKyAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKKyAgc3RkOjpzdHJpbmcgZmlsdGVyXzsKKyAgc3RkOjpzdHJpbmcgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOworICBib29sIGxpc3RfdGVzdHNfOworICBzdGQ6OnN0cmluZyBvdXRwdXRfOworICBib29sIHByaW50X3RpbWVfOworICBpbnRlcm5hbDo6SW50MzIgcmFuZG9tX3NlZWRfOworICBpbnRlcm5hbDo6SW50MzIgcmVwZWF0XzsKKyAgYm9vbCBzaHVmZmxlXzsKKyAgaW50ZXJuYWw6OkludDMyIHN0YWNrX3RyYWNlX2RlcHRoXzsKKyAgc3RkOjpzdHJpbmcgc3RyZWFtX3Jlc3VsdF90b187CisgIGJvb2wgdGhyb3dfb25fZmFpbHVyZV87Cit9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOworCisvLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQorLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCisvLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgY29udmVydGVkCisvLyB0byAiKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKSIuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIENvZGVQb2ludFRvVXRmOChVSW50MzIgY29kZV9wb2ludCk7CisKKy8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKKy8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKKy8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgorLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKKy8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZworLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KKy8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZworLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCisvLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKTsKKworLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQorLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCisvLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90CisvLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgordm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKKworLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50CisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCisvLyBidXQgaW5jb25zaXN0ZW50IChlLmcuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKKy8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKKy8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKKy8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgorR1RFU1RfQVBJXyBib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7CisKKy8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKKy8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yIGFuZAorLy8gYW5kIGFib3J0cy4KK0dURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogZW52X3ZhciwgSW50MzIgZGVmYXVsdF92YWwpOworCisvLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCisvLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKKy8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0CisvLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgorR1RFU1RfQVBJXyBib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKAorICAgIGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpOworCisvLyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBjb250YWluZXIgdGhhdCBzYXRpc2Z5CisvLyB0aGUgZ2l2ZW4gcHJlZGljYXRlLgordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgUHJlZGljYXRlPgoraW5saW5lIGludCBDb3VudElmKGNvbnN0IENvbnRhaW5lciYgYywgUHJlZGljYXRlIHByZWRpY2F0ZSkgeworICAvLyBJbXBsZW1lbnRlZCBhcyBhbiBleHBsaWNpdCBsb29wIHNpbmNlIHN0ZDo6Y291bnRfaWYoKSBpbiBsaWJDc3RkIG9uCisgIC8vIFNvbGFyaXMgaGFzIGEgbm9uLXN0YW5kYXJkIHNpZ25hdHVyZS4KKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYy5iZWdpbigpOyBpdCAhPSBjLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKHByZWRpY2F0ZSgqaXQpKQorICAgICAgKytjb3VudDsKKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKy8vIEFwcGxpZXMgYSBmdW5jdGlvbi9mdW5jdG9yIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLgordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgRnVuY3Rvcj4KK3ZvaWQgRm9yRWFjaChjb25zdCBDb250YWluZXImIGMsIEZ1bmN0b3IgZnVuY3RvcikgeworICBzdGQ6OmZvcl9lYWNoKGMuYmVnaW4oKSwgYy5lbmQoKSwgZnVuY3Rvcik7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggZWxlbWVudCBvZiB0aGUgdmVjdG9yLCBvciBkZWZhdWx0X3ZhbHVlIGlmIGkgaXMgbm90CisvLyBpbiByYW5nZSBbMCwgdi5zaXplKCkpLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+CitpbmxpbmUgRSBHZXRFbGVtZW50T3IoY29uc3Qgc3RkOjp2ZWN0b3I8RT4mIHYsIGludCBpLCBFIGRlZmF1bHRfdmFsdWUpIHsKKyAgcmV0dXJuIChpIDwgMCB8fCBpID49IHN0YXRpY19jYXN0PGludD4odi5zaXplKCkpKSA/IGRlZmF1bHRfdmFsdWUgOiB2W2ldOworfQorCisvLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIGEgcmFuZ2Ugb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgorLy8gJ2JlZ2luJyBhbmQgJ2VuZCcgYXJlIGVsZW1lbnQgaW5kaWNlcyBhcyBhbiBTVEwtc3R5bGUgcmFuZ2U7CisvLyBpLmUuIFtiZWdpbiwgZW5kKSBhcmUgc2h1ZmZsZWQsIHdoZXJlICdlbmQnID09IHNpemUoKSBtZWFucyB0bworLy8gc2h1ZmZsZSB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK3ZvaWQgU2h1ZmZsZVJhbmdlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgaW50IGJlZ2luLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKKyAgY29uc3QgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSk7CisgIEdURVNUX0NIRUNLXygwIDw9IGJlZ2luICYmIGJlZ2luIDw9IHNpemUpCisgICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0ICIgPDwgYmVnaW4gPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbMCwgIgorICAgICAgPDwgc2l6ZSA8PCAiXS4iOworICBHVEVTVF9DSEVDS18oYmVnaW4gPD0gZW5kICYmIGVuZCA8PSBzaXplKQorICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggIiA8PCBlbmQgPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbIgorICAgICAgPDwgYmVnaW4gPDwgIiwgIiA8PCBzaXplIDw8ICJdLiI7CisKKyAgLy8gRmlzaGVyLVlhdGVzIHNodWZmbGUsIGZyb20KKyAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZQorICBmb3IgKGludCByYW5nZV93aWR0aCA9IGVuZCAtIGJlZ2luOyByYW5nZV93aWR0aCA+PSAyOyByYW5nZV93aWR0aC0tKSB7CisgICAgY29uc3QgaW50IGxhc3RfaW5fcmFuZ2UgPSBiZWdpbiArIHJhbmdlX3dpZHRoIC0gMTsKKyAgICBjb25zdCBpbnQgc2VsZWN0ZWQgPSBiZWdpbiArIHJhbmRvbS0+R2VuZXJhdGUocmFuZ2Vfd2lkdGgpOworICAgIHN0ZDo6c3dhcCgoKnYpW3NlbGVjdGVkXSwgKCp2KVtsYXN0X2luX3JhbmdlXSk7CisgIH0KK30KKworLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK2lubGluZSB2b2lkIFNodWZmbGUoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tLCBzdGQ6OnZlY3RvcjxFPiogdikgeworICBTaHVmZmxlUmFuZ2UocmFuZG9tLCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSksIHYpOworfQorCisvLyBBIGZ1bmN0aW9uIGZvciBkZWxldGluZyBhbiBvYmplY3QuICBIYW5keSBmb3IgYmVpbmcgdXNlZCBhcyBhCisvLyBmdW5jdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBEZWxldGUoVCogeCkgeworICBkZWxldGUgeDsKK30KKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIGtleSBvZiBhIFRlc3RQcm9wZXJ0eSBhZ2FpbnN0IGEga25vd24ga2V5LgorLy8KKy8vIFRlc3RQcm9wZXJ0eUtleUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdFByb3BlcnR5S2V5SXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRlc3RQcm9wZXJ0eUtleUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBUZXN0UHJvcGVydHlLZXlJcyhjb25zdCBzdGQ6OnN0cmluZyYga2V5KSA6IGtleV8oa2V5KSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0IHByb3BlcnR5IG1hdGNoZXMgb24ga2V5Xy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3Byb3BlcnR5LmtleSgpID09IGtleV87CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGtleV87Cit9OworCisvLyBDbGFzcyBVbml0VGVzdE9wdGlvbnMuCisvLworLy8gVGhpcyBjbGFzcyBjb250YWlucyBmdW5jdGlvbnMgZm9yIHByb2Nlc3Npbmcgb3B0aW9ucyB0aGUgdXNlcgorLy8gc3BlY2lmaWVzIHdoZW4gcnVubmluZyB0aGUgdGVzdHMuICBJdCBoYXMgb25seSBzdGF0aWMgbWVtYmVycy4KKy8vCisvLyBJbiBtb3N0IGNhc2VzLCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhbiBvcHRpb24gdXNpbmcgZWl0aGVyIGFuCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhIGNvbW1hbmQgbGluZSBmbGFnLiAgRS5nLiB5b3UgY2FuIHNldCB0aGUKKy8vIHRlc3QgZmlsdGVyIHVzaW5nIGVpdGhlciBHVEVTVF9GSUxURVIgb3IgLS1ndGVzdF9maWx0ZXIuICBJZiBib3RoCisvLyB0aGUgdmFyaWFibGUgYW5kIHRoZSBmbGFnIGFyZSBwcmVzZW50LCB0aGUgbGF0dGVyIG92ZXJyaWRlcyB0aGUKKy8vIGZvcm1lci4KK2NsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RPcHRpb25zIHsKKyBwdWJsaWM6CisgIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCisKKyAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldE91dHB1dEZvcm1hdCgpOworCisgIC8vIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBvdXRwdXQgZmlsZSwgb3IgdGhlCisgIC8vIGRlZmF1bHQgKHRlc3RfZGV0YWlsLnhtbCBpbiB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3RvcnkpIGlmCisgIC8vIG5vbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7CisKKyAgLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9maWx0ZXIgZmxhZy4KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB3aWxkY2FyZCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHN0cmluZy4gIFRoZQorICAvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgorICAvLworICAvLyBUaGlzIHJlY3Vyc2l2ZSBhbGdvcml0aG0gaXNuJ3QgdmVyeSBlZmZpY2llbnQsIGJ1dCBpcyBjbGVhciBhbmQKKyAgLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KKyAgc3RhdGljIGJvb2wgUGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCisgIC8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCisgIHN0YXRpYyBib29sIEZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIEZ1bmN0aW9uIGZvciBzdXBwb3J0aW5nIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb24gZmxhZy4KKworICAvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKKyAgLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KKyAgc3RhdGljIGludCBHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmICJuYW1lIiBtYXRjaGVzIHRoZSAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYi1zdHlsZQorICAvLyBmaWx0ZXJzIGluICJmaWx0ZXIiLgorICBzdGF0aWMgYm9vbCBNYXRjaGVzRmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpOworfTsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKKy8vIGlzIHByZXNlbnQuICBVc2VkIGJ5IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0RmlsZS4KK0dURVNUX0FQSV8gRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCk7CisKKy8vIFRoZSByb2xlIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgT1Mgc3RhY2sgdHJhY2UgYXMgYSBzdHJpbmcuCitjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KKyAgdmlydHVhbCB+T3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLiAgUGFyYW1ldGVyczoKKyAgLy8KKyAgLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAorICAvLyAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UuCisgIC8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50CisgIC8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgorICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCkgPSAwOworCisgIC8vIFVwb25MZWF2aW5nR1Rlc3QoKSBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBHb29nbGUgVGVzdCBjYWxscworICAvLyB1c2VyIGNvZGUuIEl0IHNhdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhY2sgdGhhdAorICAvLyBDdXJyZW50U3RhY2tUcmFjZSgpIHdpbGwgdXNlIHRvIGZpbmQgYW5kIGhpZGUgR29vZ2xlIFRlc3Qgc3RhY2sgZnJhbWVzLgorICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpID0gMDsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKTsKK307CisKKy8vIEEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIGludGVyZmFjZS4KK2NsYXNzIE9zU3RhY2tUcmFjZUdldHRlciA6IHB1YmxpYyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgT3NTdGFja1RyYWNlR2V0dGVyKCkgOiBjYWxsZXJfZnJhbWVfKE5VTEwpIHt9CisKKyAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCkgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBUaGlzIHN0cmluZyBpcyBpbnNlcnRlZCBpbiBwbGFjZSBvZiBzdGFjayBmcmFtZXMgdGhhdCBhcmUgcGFydCBvZgorICAvLyBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uLgorICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0VsaWRlZEZyYW1lc01hcmtlcjsKKworIHByaXZhdGU6CisgIE11dGV4IG11dGV4XzsgIC8vIHByb3RlY3RzIGFsbCBpbnRlcm5hbCBzdGF0ZQorCisgIC8vIFdlIHNhdmUgdGhlIHN0YWNrIGZyYW1lIGJlbG93IHRoZSBmcmFtZSB0aGF0IGNhbGxzIHVzZXIgY29kZS4KKyAgLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBpbW1lZGlhdGVseSBiZWxvdworICAvLyB0aGUgdXNlciBjb2RlIGNoYW5nZXMgYmV0d2VlbiB0aGUgY2FsbCB0byBVcG9uTGVhdmluZ0dUZXN0KCkKKyAgLy8gYW5kIGFueSBjYWxscyB0byBDdXJyZW50U3RhY2tUcmFjZSgpIGZyb20gd2l0aGluIHRoZSB1c2VyIGNvZGUuCisgIHZvaWQqIGNhbGxlcl9mcmFtZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhPc1N0YWNrVHJhY2VHZXR0ZXIpOworfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBHb29nbGUgVGVzdCB0cmFjZSBwb2ludC4KK3N0cnVjdCBUcmFjZUluZm8geworICBjb25zdCBjaGFyKiBmaWxlOworICBpbnQgbGluZTsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKK307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbiBVbml0VGVzdEltcGwuCisvLyBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7CisgIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFJlcG9ydHMgdGhlIHRlc3QgcGFydAorICAvLyByZXN1bHQgaW4gdGhlIGN1cnJlbnQgdGVzdC4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBwZXIgdGhyZWFkIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbgorLy8gVW5pdFRlc3RJbXBsLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsKKyAgLy8gSW1wbGVtZW50cyB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZS4gVGhlIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgLy8gZGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIG9mICp1bml0X3Rlc3RfLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyBwcml2YXRlOgorICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCisvLyBUaGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdFRlc3QgY2xhc3MuICBXZSBkb24ndCBwcm90ZWN0CisvLyB0aGUgbWV0aG9kcyB1bmRlciBhIG11dGV4LCBhcyB0aGlzIGNsYXNzIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IGEKKy8vIHVzZXIgYW5kIHRoZSBVbml0VGVzdCBjbGFzcyB0aGF0IGRlbGVnYXRlcyB3b3JrIHRvIHRoaXMgY2xhc3MgZG9lcworLy8gcHJvcGVyIGxvY2tpbmcuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0SW1wbCB7CisgcHVibGljOgorICBleHBsaWNpdCBVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCk7CisgIHZpcnR1YWwgflVuaXRUZXN0SW1wbCgpOworCisgIC8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gcmVnaXN0ZXIgeW91ciBvd24gVGVzdFBhcnRSZXN1bHRSZXBvcnRlci4KKyAgLy8gWW91IGNhbiByZWdpc3RlciB5b3VyIG93biByZXBvdGVyIHRvIGxpc3RlbiBlaXRoZXIgb25seSBmb3IgdGVzdCByZXN1bHRzCisgIC8vIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIGZvciByZXN1bHRzIGZyb20gYWxsIHRocmVhZHMuCisgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggcGVyLXRocmVhZCB0ZXN0IHJlc3VsdCByZXBvdGVyIGp1c3QgcGFzc2VzIGEgbmV3CisgIC8vIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBnbG9iYWwgdGVzdCByZXN1bHQgcmVwb3J0ZXIsIHdoaWNoIHJlZ2lzdGVycyB0aGUKKyAgLy8gdGVzdCBwYXJ0IHJlc3VsdCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuCisKKyAgLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgdm9pZCBTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOworCisgIC8vIFJldHVybnMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKKworICAvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIHZvaWQgU2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgorICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KKyAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKyAgLy8gdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCisgIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gVU5JWCBlcG9jaC4KKyAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0X3RpbWVzdGFtcF87IH0KKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKyAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeworICAgIHJldHVybiBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgPiAwIHx8IGFkX2hvY190ZXN0X3Jlc3VsdCgpLT5GYWlsZWQoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0IHsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7CisgICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2Nhc2VzX1tpXTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBUZXN0Q2FzZSogR2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKSB7CisgICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baW5kZXhdOworICB9CisKKyAgLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycygpIHsgcmV0dXJuICZsaXN0ZW5lcnNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorICAvLyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0IGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKyAgVGVzdFJlc3VsdCogY3VycmVudF90ZXN0X3Jlc3VsdCgpOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdC4KKyAgY29uc3QgVGVzdFJlc3VsdCogYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJmFkX2hvY190ZXN0X3Jlc3VsdF87IH0KKworICAvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisgIC8vCisgIC8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlcgorICAvLyBhcmUgdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlCisgIC8vIGlucHV0IHRoZSBjdXJyZW50IGdldHRlci4KKyAgdm9pZCBzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBpZiBpdCBpcyBub3QgTlVMTDsKKyAgLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKyAgLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXIoKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorICAvLworICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorICAvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorICAvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKyAgLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisgIC8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisgIC8vIHRyYWNlIGJ1dCBCYXIoKSBhbmQgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0LgorICBzdGQ6OnN0cmluZyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKGludCBza2lwX2NvdW50KSBHVEVTVF9OT19JTkxJTkVfOworCisgIC8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0CisgIC8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0eXBlX3BhcmFtOiAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorICAvLyAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIC8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisgIFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpOworCisgIC8vIEFkZHMgYSBUZXN0SW5mbyB0byB0aGUgdW5pdCB0ZXN0LgorICAvLworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZXN0X2luZm86ICAgIHRoZSBUZXN0SW5mbyBvYmplY3QKKyAgdm9pZCBBZGRUZXN0SW5mbyhUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzLCB3ZSBuZWVkIHRvCisgICAgLy8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIHRlc3QgcHJvZ3JhbQorICAgIC8vIHdhcyBmaXJzdCBpbnZva2VkLiAgV2UgY2Fubm90IGRvIHRoaXMgaW4gUlVOX0FMTF9URVNUUygpLCBhcworICAgIC8vIHRoZSB1c2VyIG1heSBoYXZlIGNoYW5nZWQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBjYWxsaW5nCisgICAgLy8gUlVOX0FMTF9URVNUUygpLiAgVGhlcmVmb3JlIHdlIGNhcHR1cmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluCisgICAgLy8gQWRkVGVzdEluZm8oKSwgd2hpY2ggaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGEgVEVTVCBvciBURVNUX0YKKyAgICAvLyBiZWZvcmUgbWFpbigpIGlzIHJlYWNoZWQuCisgICAgaWYgKG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpIHsKKyAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5TZXQoRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSk7CisgICAgICBHVEVTVF9DSEVDS18oIW9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpCisgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIjsKKyAgICB9CisKKyAgICBHZXRUZXN0Q2FzZSh0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCksCisgICAgICAgICAgICAgICAgdGVzdF9pbmZvLT50eXBlX3BhcmFtKCksCisgICAgICAgICAgICAgICAgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgIHRlYXJfZG93bl90YyktPkFkZFRlc3RJbmZvKHRlc3RfaW5mbyk7CisgIH0KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKSB7CisgICAgcmV0dXJuIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV87CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBTZXRzIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZy4KKyAgdm9pZCBzZXRfY3VycmVudF90ZXN0X2Nhc2UoVGVzdENhc2UqIGFfY3VycmVudF90ZXN0X2Nhc2UpIHsKKyAgICBjdXJyZW50X3Rlc3RfY2FzZV8gPSBhX2N1cnJlbnRfdGVzdF9jYXNlOworICB9CisKKyAgLy8gU2V0cyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuICBJZgorICAvLyBjdXJyZW50X3Rlc3RfaW5mbyBpcyBOVUxMLCB0aGUgYXNzZXJ0aW9uIHJlc3VsdHMgd2lsbCBiZSBzdG9yZWQgaW4KKyAgLy8gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KKyAgdm9pZCBzZXRfY3VycmVudF90ZXN0X2luZm8oVGVzdEluZm8qIGFfY3VycmVudF90ZXN0X2luZm8pIHsKKyAgICBjdXJyZW50X3Rlc3RfaW5mb18gPSBhX2N1cnJlbnRfdGVzdF9pbmZvOworICB9CisKKyAgLy8gUmVnaXN0ZXJzIGFsbCBwYXJhbWV0ZXJpemVkIHRlc3RzIGRlZmluZWQgdXNpbmcgVEVTVF9QIGFuZAorICAvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCwgY3JlYXRpbmcgcmVndWxhciB0ZXN0cyBmb3IgZWFjaCB0ZXN0L3BhcmFtZXRlcgorICAvLyBjb21iaW5hdGlvbi4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZTsgaXQgaGFzIGd1YXJkcworICAvLyBwcm90ZWN0aW5nIGZyb20gcmVnaXN0ZXJpbmcgdGhlIHRlc3RzIG1vcmUgdGhlbiBvbmNlLiAgSWYKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZGlzYWJsZWQsIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzIGlzCisgIC8vIHByZXNlbnQgYnV0IGRvZXMgbm90aGluZy4KKyAgdm9pZCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOworCisgIC8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisgIC8vIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgYXJlIHN1Y2Nlc3NmdWwuICBJZiBhbnkgZXhjZXB0aW9uIGlzCisgIC8vIHRocm93biBkdXJpbmcgYSB0ZXN0LCB0aGlzIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dAorICAvLyB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBzdGlsbCBiZSBydW4uCisgIGJvb2wgUnVuQWxsVGVzdHMoKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzLCBleGNlcHQgdGhlIGFkIGhvYyB0ZXN0cy4KKyAgdm9pZCBDbGVhck5vbkFkSG9jVGVzdFJlc3VsdCgpIHsKKyAgICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZTo6Q2xlYXJUZXN0Q2FzZVJlc3VsdCk7CisgIH0KKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWQtaG9jIHRlc3QgYXNzZXJ0aW9ucy4KKyAgdm9pZCBDbGVhckFkSG9jVGVzdFJlc3VsdCgpIHsKKyAgICBhZF9ob2NfdGVzdF9yZXN1bHRfLkNsZWFyKCk7CisgIH0KKworICAvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBpbiBhCisgIC8vIGNvbnRleHQgb2YgYSB0ZXN0IG9yIGEgdGVzdCBjYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldC4gSWYgdGhlCisgIC8vIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlCisgIC8vIHVwZGF0ZWQuCisgIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKKworICBlbnVtIFJlYWN0aW9uVG9TaGFyZGluZyB7CisgICAgSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsCisgICAgSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MCisgIH07CisKKyAgLy8gTWF0Y2hlcyB0aGUgZnVsbCBuYW1lIG9mIGVhY2ggdGVzdCBhZ2FpbnN0IHRoZSB1c2VyLXNwZWNpZmllZAorICAvLyBmaWx0ZXIgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIHJ1biwgdGhlbiByZWNvcmRzIHRoZQorICAvLyByZXN1bHQgaW4gZWFjaCBUZXN0Q2FzZSBhbmQgVGVzdEluZm8gb2JqZWN0LgorICAvLyBJZiBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCwgZnVydGhlciBmaWx0ZXJzIHRlc3RzCisgIC8vIGJhc2VkIG9uIHNoYXJkaW5nIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQuCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCBGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpOworCisgIC8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KKyAgdm9pZCBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOworCisgIGNvbnN0IFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9jYXNlXzsgfQorICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSB7IHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb187IH0KKyAgY29uc3QgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdmVjdG9yIG9mIGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gYmUgc2V0LXVwL3Rvcm4tZG93bgorICAvLyBiZWZvcmUvYWZ0ZXIgdGhlIHRlc3RzIGFyZSBydW4uCisgIHN0ZDo6dmVjdG9yPEVudmlyb25tZW50Kj4mIGVudmlyb25tZW50cygpIHsgcmV0dXJuIGVudmlyb25tZW50c187IH0KKworICAvLyBHZXR0ZXJzIGZvciB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSB7CisgICAgcmV0dXJuICooZ3Rlc3RfdHJhY2Vfc3RhY2tfLnBvaW50ZXIoKSk7CisgIH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIGd0ZXN0X3RyYWNlX3N0YWNrXy5nZXQoKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgdm9pZCBJbml0RGVhdGhUZXN0U3VicHJvY2Vzc0NvbnRyb2xJbmZvKCkgeworICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLnJlc2V0KFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkpOworICB9CisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdAorICAvLyBmbGFnLCBvciBOVUxMIGlmIHRoYXQgZmxhZyB3YXMgbm90IHNwZWNpZmllZC4KKyAgLy8gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgb25seSBpbiBhIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKyAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBhIGNhbGwgdG8gSW5pdEdvb2dsZVRlc3QuCisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCk7CisgIH0KKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkZWF0aCB0ZXN0IGZhY3RvcnkuCisgIGludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5KiBkZWF0aF90ZXN0X2ZhY3RvcnkoKSB7CisgICAgcmV0dXJuIGRlYXRoX3Rlc3RfZmFjdG9yeV8uZ2V0KCk7CisgIH0KKworICB2b2lkIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7CisKKyAgZnJpZW5kIGNsYXNzIFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5OworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBwZXJmb3JtaW5nIFhNTCBvdXRwdXQgYXMgc3BlY2lmaWVkIGJ5CisgIC8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KKyAgdm9pZCBDb25maWd1cmVYbWxPdXRwdXQoKTsKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyAgLy8gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIHRvIGEgc29ja2V0LgorICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0LgorICB2b2lkIENvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpOworI2VuZGlmCisKKyAgLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorICAvLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50LgorICB2b2lkIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKKworICAvLyBHZXRzIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IGl0ZXJhdGlvbi4KKyAgaW50IHJhbmRvbV9zZWVkKCkgY29uc3QgeyByZXR1cm4gcmFuZG9tX3NlZWRfOyB9CisKKyAgLy8gR2V0cyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIGludGVybmFsOjpSYW5kb20qIHJhbmRvbSgpIHsgcmV0dXJuICZyYW5kb21fOyB9CisKKyAgLy8gU2h1ZmZsZXMgYWxsIHRlc3QgY2FzZXMsIGFuZCB0aGUgdGVzdHMgd2l0aGluIGVhY2ggdGVzdCBjYXNlLAorICAvLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCisgIHZvaWQgU2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KKyAgdm9pZCBVbnNodWZmbGVUZXN0cygpOworCisgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudAorICAvLyBVbml0VGVzdDo6UnVuKCkgc3RhcnRzLgorICBib29sIGNhdGNoX2V4Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiBjYXRjaF9leGNlcHRpb25zXzsgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKKyAgLy8gVXNlZCBieSBVbml0VGVzdDo6UnVuKCkgdG8gY2FwdHVyZSB0aGUgc3RhdGUgb2YKKyAgLy8gR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50IGl0IHN0YXJ0cy4KKyAgdm9pZCBzZXRfY2F0Y2hfZXhjZXB0aW9ucyhib29sIHZhbHVlKSB7IGNhdGNoX2V4Y2VwdGlvbnNfID0gdmFsdWU7IH0KKworICAvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRoYXQgb3ducyB0aGlzIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgVW5pdFRlc3QqIGNvbnN0IHBhcmVudF87CisKKyAgLy8gVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKKyAgLy8gZXhlY3V0ZWQuCisgIGludGVybmFsOjpGaWxlUGF0aCBvcmlnaW5hbF93b3JraW5nX2Rpcl87CisKKyAgLy8gVGhlIGRlZmF1bHQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlcnMuCisgIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworICBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworCisgIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworCisgIC8vIFByb3RlY3RzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uCisgIGludGVybmFsOjpNdXRleCBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl9tdXRleF87CisKKyAgLy8gUG9pbnRzIHRvIChidXQgZG9lc24ndCBvd24pIHRoZSBwZXItdGhyZWFkIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIGludGVybmFsOjpUaHJlYWRMb2NhbDxUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKj4KKyAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87CisKKyAgLy8gVGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KKyAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgorICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+IGVudmlyb25tZW50c187CisKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0Q2FzZXMgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuICBJdCBvd25zIHRoZQorICAvLyBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZSo+IHRlc3RfY2FzZXNfOworCisgIC8vIFByb3ZpZGVzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHRoZSB0ZXN0IGNhc2UgbGlzdCB0byBhbGxvdworICAvLyBlYXN5IHNodWZmbGluZyBhbmQgcmVzdG9yaW5nIHRoZSB0ZXN0IGNhc2Ugb3JkZXIuICBUaGUgaS10aAorICAvLyBlbGVtZW50IG9mIHRoaXMgdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGNhc2UgaW4gdGhlCisgIC8vIHNodWZmbGVkIG9yZGVyLgorICBzdGQ6OnZlY3RvcjxpbnQ+IHRlc3RfY2FzZV9pbmRpY2VzXzsKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFBhcmFtZXRlcml6ZWRUZXN0UmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8gcmVnaXN0ZXIgdmFsdWUtcGFyYW1ldGVyaXplZAorICAvLyB0ZXN0cy4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV87CisKKyAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQgYWxyZWFkeS4KKyAgYm9vbCBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIC8vIEluZGV4IG9mIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZSByZWdpc3RlcmVkLiAgSW5pdGlhbGx5IC0xLgorICBpbnQgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfOworCisgIC8vIFRoaXMgcG9pbnRzIHRvIHRoZSBUZXN0Q2FzZSBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuICBJdAorICAvLyBjaGFuZ2VzIGFzIEdvb2dsZSBUZXN0IGdvZXMgdGhyb3VnaCBvbmUgdGVzdCBjYXNlIGFmdGVyIGFub3RoZXIuCisgIC8vIFdoZW4gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdAorICAvLyBzdG9yZXMgYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgorICBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2VfOworCisgIC8vIFRoaXMgcG9pbnRzIHRvIHRoZSBUZXN0SW5mbyBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuICBJdAorICAvLyBjaGFuZ2VzIGFzIEdvb2dsZSBUZXN0IGdvZXMgdGhyb3VnaCBvbmUgdGVzdCBhZnRlciBhbm90aGVyLiAgV2hlbgorICAvLyBubyB0ZXN0IGlzIHJ1bm5pbmcsIHRoaXMgaXMgc2V0IHRvIE5VTEwgYW5kIEdvb2dsZSBUZXN0IHN0b3JlcworICAvLyBhc3NlcnRpb24gcmVzdWx0cyBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLiAgSW5pdGlhbGx5IE5VTEwuCisgIFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mb187CisKKyAgLy8gTm9ybWFsbHksIGEgdXNlciBvbmx5IHdyaXRlcyBhc3NlcnRpb25zIGluc2lkZSBhIFRFU1Qgb3IgVEVTVF9GLAorICAvLyBvciBpbnNpZGUgYSBmdW5jdGlvbiBjYWxsZWQgYnkgYSBURVNUIG9yIFRFU1RfRi4gIFNpbmNlIEdvb2dsZQorICAvLyBUZXN0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIHRlc3QgaXMgY3VycmVudCBydW5uaW5nLCBpdCBjYW4KKyAgLy8gYXNzb2NpYXRlIHN1Y2ggYW4gYXNzZXJ0aW9uIHdpdGggdGhlIHRlc3QgaXQgYmVsb25ncyB0by4KKyAgLy8KKyAgLy8gSWYgYW4gYXNzZXJ0aW9uIGlzIGVuY291bnRlcmVkIHdoZW4gbm8gVEVTVCBvciBURVNUX0YgaXMgcnVubmluZywKKyAgLy8gR29vZ2xlIFRlc3QgYXR0cmlidXRlcyB0aGUgYXNzZXJ0aW9uIHJlc3VsdCB0byBhbiBpbWFnaW5hcnkgImFkIGhvYyIKKyAgLy8gdGVzdCwgYW5kIHJlY29yZHMgdGhlIHJlc3VsdCBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLgorICBUZXN0UmVzdWx0IGFkX2hvY190ZXN0X3Jlc3VsdF87CisKKyAgLy8gVGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzIGluc2lkZQorICAvLyBHb29nbGUgVGVzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyc187CisKKyAgLy8gVGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4gIFdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBVbml0VGVzdAorICAvLyBvYmplY3QgaXMgZGVzdHJ1Y3RlZC4gIEJ5IGRlZmF1bHQsIGFuIE9zU3RhY2tUcmFjZUdldHRlciBpcyB1c2VkLAorICAvLyBidXQgdGhlIHVzZXIgY2FuIHNldCB0aGlzIGZpZWxkIHRvIHVzZSBhIGN1c3RvbSBnZXR0ZXIgaWYgdGhhdCBpcworICAvLyBkZXNpcmVkLgorICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87CisKKyAgLy8gVHJ1ZSBpZmYgUG9zdEZsYWdQYXJzaW5nSW5pdCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgYm9vbCBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfOworCisgIC8vIFRoZSByYW5kb20gbnVtYmVyIHNlZWQgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0IHJ1bi4KKyAgaW50IHJhbmRvbV9zZWVkXzsKKworICAvLyBPdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIGludGVybmFsOjpSYW5kb20gcmFuZG9tXzsKKworICAvLyBUaGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gVU5JWCBlcG9jaC4KKyAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcF87CisKKyAgLy8gSG93IGxvbmcgdGhlIHRlc3QgdG9vayB0byBydW4sIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAvLyBUaGUgZGVjb21wb3NlZCBjb21wb25lbnRzIG9mIHRoZSBndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLAorICAvLyBwYXJzZWQgd2hlbiBSVU5fQUxMX1RFU1RTIGlzIGNhbGxlZC4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnPiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXzsKKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8aW50ZXJuYWw6OkRlYXRoVGVzdEZhY3Rvcnk+IGRlYXRoX3Rlc3RfZmFjdG9yeV87CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgLy8gQSBwZXItdGhyZWFkIHN0YWNrIG9mIHRyYWNlcyBjcmVhdGVkIGJ5IHRoZSBTQ09QRURfVFJBQ0UoKSBtYWNyby4KKyAgaW50ZXJuYWw6OlRocmVhZExvY2FsPHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4gPiBndGVzdF90cmFjZV9zdGFja187CisKKyAgLy8gVGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBSdW5BbGxUZXN0cygpCisgIC8vIHN0YXJ0cy4KKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0SW1wbCk7Cit9OyAgLy8gY2xhc3MgVW5pdFRlc3RJbXBsCisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcgdGhlIGdsb2JhbCBVbml0VGVzdAorLy8gaW1wbGVtZW50YXRpb24gb2JqZWN0LgoraW5saW5lIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCkgeworICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKTsKK30KKworI2lmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyB0aGUgc2ltcGxlIHJlZ3VsYXIKKy8vIGV4cHJlc3Npb24gbWF0Y2hlci4KK0dURVNUX0FQSV8gYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaURpZ2l0KGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc1JlcGVhdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV2hpdGVTcGFjZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV29yZENoYXIoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNWYWxpZEVzY2FwZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBBdG9tTWF0Y2hlc0NoYXIoYm9vbCBlc2NhcGVkLCBjaGFyIHBhdHRlcm4sIGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBdEhlYWQoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgYm9vbCBlc2NhcGVkLCBjaGFyIGNoLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZWdleEFueXdoZXJlKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKKy8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0LgorR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKK0dURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yLCByZWdhcmRsZXNzIG9mIHRoZQorLy8gcGxhdGZvcm0uCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworLy8gUHJvdmlkZXMgbGVhay1zYWZlIFdpbmRvd3Mga2VybmVsIGhhbmRsZSBvd25lcnNoaXAuCitjbGFzcyBBdXRvSGFuZGxlIHsKKyBwdWJsaWM6CisgIEF1dG9IYW5kbGUoKSA6IGhhbmRsZV8oSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHt9CisgIGV4cGxpY2l0IEF1dG9IYW5kbGUoSEFORExFIGhhbmRsZSkgOiBoYW5kbGVfKGhhbmRsZSkge30KKworICB+QXV0b0hhbmRsZSgpIHsgUmVzZXQoKTsgfQorCisgIEhBTkRMRSBHZXQoKSBjb25zdCB7IHJldHVybiBoYW5kbGVfOyB9CisgIHZvaWQgUmVzZXQoKSB7IFJlc2V0KElOVkFMSURfSEFORExFX1ZBTFVFKTsgfQorICB2b2lkIFJlc2V0KEhBTkRMRSBoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlICE9IGhhbmRsZV8pIHsKKyAgICAgIGlmIChoYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZV8pOworICAgICAgaGFuZGxlXyA9IGhhbmRsZTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIEhBTkRMRSBoYW5kbGVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXV0b0hhbmRsZSk7Cit9OworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBBdHRlbXB0cyB0byBwYXJzZSBhIHN0cmluZyBpbnRvIGEgcG9zaXRpdmUgaW50ZWdlciBwb2ludGVkIHRvIGJ5IHRoZQorLy8gbnVtYmVyIHBhcmFtZXRlci4gIFJldHVybnMgdHJ1ZSBpZiB0aGF0IGlzIHBvc3NpYmxlLgorLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UgY2FuIHVzZQorLy8gaXQgaGVyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRlZ2VyPgorYm9vbCBQYXJzZU5hdHVyYWxOdW1iZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBJbnRlZ2VyKiBudW1iZXIpIHsKKyAgLy8gRmFpbCBmYXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0OworICAvLyB0aGlzIGJ5cGFzc2VzIHN0cnRvWFhYJ3MgIm9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgcGx1cworICAvLyBvciBtaW51cyBzaWduIiBzZW1hbnRpY3MsIHdoaWNoIGFyZSB1bmRlc2lyYWJsZSBoZXJlLgorICBpZiAoc3RyLmVtcHR5KCkgfHwgIUlzRGlnaXQoc3RyWzBdKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBlcnJubyA9IDA7CisKKyAgY2hhciogZW5kOworICAvLyBCaWdnZXN0Q29udmVydGlibGUgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciB0eXBlIHRoYXQgc3lzdGVtLXByb3ZpZGVkCisgIC8vIHN0cmluZy10by1udW1iZXIgY29udmVyc2lvbiByb3V0aW5lcyBjYW4gcmV0dXJuLgorCisjIGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19HTlVDX18pCisKKyAgLy8gTVNWQyBhbmQgQysrIEJ1aWxkZXIgZGVmaW5lIF9faW50NjQgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgbG9uZyBsb25nLgorICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgQmlnZ2VzdENvbnZlcnRpYmxlOworICBjb25zdCBCaWdnZXN0Q29udmVydGlibGUgcGFyc2VkID0gX3N0cnRvdWk2NChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworCisjIGVsc2UKKworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBCaWdnZXN0Q29udmVydGlibGU7ICAvLyBOT0xJTlQKKyAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IHN0cnRvdWxsKHN0ci5jX3N0cigpLCAmZW5kLCAxMCk7CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19HTlVDX18pCisKKyAgY29uc3QgYm9vbCBwYXJzZV9zdWNjZXNzID0gKmVuZCA9PSAnXDAnICYmIGVycm5vID09IDA7CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogQ29udmVydCB0aGlzIHRvIGNvbXBpbGUgdGltZSBhc3NlcnRpb24gd2hlbiBpdCBpcworICAvLyBhdmFpbGFibGUuCisgIEdURVNUX0NIRUNLXyhzaXplb2YoSW50ZWdlcikgPD0gc2l6ZW9mKHBhcnNlZCkpOworCisgIGNvbnN0IEludGVnZXIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50ZWdlcj4ocGFyc2VkKTsKKyAgaWYgKHBhcnNlX3N1Y2Nlc3MgJiYgc3RhdGljX2Nhc3Q8QmlnZ2VzdENvbnZlcnRpYmxlPihyZXN1bHQpID09IHBhcnNlZCkgeworICAgICpudW1iZXIgPSByZXN1bHQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBUZXN0UmVzdWx0IGNvbnRhaW5zIHNvbWUgcHJpdmF0ZSBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGhpZGRlbiBmcm9tCisvLyBHb29nbGUgVGVzdCB1c2VyIGJ1dCBhcmUgcmVxdWlyZWQgZm9yIHRlc3RpbmcuIFRoaXMgY2xhc3MgYWxsb3cgb3VyIHRlc3RzCisvLyB0byBhY2Nlc3MgdGhlbS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHN1cHBsaWVkIG9ubHkgZm9yIHRoZSBwdXJwb3NlIG9mIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24KKy8vIGNvbnN0cnVjdHMuIERvIG5vdCB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBUZXN0UmVzdWx0QWNjZXNzb3IgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSkgeworICAgIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eSh4bWxfZWxlbWVudCwgcHJvcGVydHkpOworICB9CisKKyAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UGFydFJlc3VsdHMoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQpIHsKKyAgICB0ZXN0X3Jlc3VsdC0+Q2xlYXJUZXN0UGFydFJlc3VsdHMoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKAorICAgICAgY29uc3QgVGVzdFJlc3VsdCYgdGVzdF9yZXN1bHQpIHsKKyAgICByZXR1cm4gdGVzdF9yZXN1bHQudGVzdF9wYXJ0X3Jlc3VsdHMoKTsKKyAgfQorfTsKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworLy8gU3RyZWFtcyB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHBvcnQgb24gdGhlIGdpdmVuIGhvc3QgbWFjaGluZS4KK2NsYXNzIFN0cmVhbWluZ0xpc3RlbmVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igd3JpdGluZyBzdHJpbmdzIHRvIGEgc29ja2V0LgorICBjbGFzcyBBYnN0cmFjdFNvY2tldFdyaXRlciB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+QWJzdHJhY3RTb2NrZXRXcml0ZXIoKSB7fQorCisgICAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KKyAgICB2aXJ0dWFsIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpID0gMDsKKworICAgIC8vIENsb3NlcyB0aGUgc29ja2V0LgorICAgIHZpcnR1YWwgdm9pZCBDbG9zZUNvbm5lY3Rpb24oKSB7fQorCisgICAgLy8gU2VuZHMgYSBzdHJpbmcgYW5kIGEgbmV3bGluZSB0byB0aGUgc29ja2V0LgorICAgIHZvaWQgU2VuZExuKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgICAgU2VuZChtZXNzYWdlICsgIlxuIik7CisgICAgfQorICB9OworCisgIC8vIENvbmNyZXRlIGNsYXNzIGZvciBhY3R1YWxseSB3cml0aW5nIHN0cmluZ3MgdG8gYSBzb2NrZXQuCisgIGNsYXNzIFNvY2tldFdyaXRlciA6IHB1YmxpYyBBYnN0cmFjdFNvY2tldFdyaXRlciB7CisgICBwdWJsaWM6CisgICAgU29ja2V0V3JpdGVyKGNvbnN0IHN0cmluZyYgaG9zdCwgY29uc3Qgc3RyaW5nJiBwb3J0KQorICAgICAgICA6IHNvY2tmZF8oLTEpLCBob3N0X25hbWVfKGhvc3QpLCBwb3J0X251bV8ocG9ydCkgeworICAgICAgTWFrZUNvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5Tb2NrZXRXcml0ZXIoKSB7CisgICAgICBpZiAoc29ja2ZkXyAhPSAtMSkKKyAgICAgICAgQ2xvc2VDb25uZWN0aW9uKCk7CisgICAgfQorCisgICAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KKyAgICB2aXJ0dWFsIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICAgIEdURVNUX0NIRUNLXyhzb2NrZmRfICE9IC0xKQorICAgICAgICAgIDw8ICJTZW5kKCkgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uLiI7CisKKyAgICAgIGNvbnN0IGludCBsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2UubGVuZ3RoKCkpOworICAgICAgaWYgKHdyaXRlKHNvY2tmZF8sIG1lc3NhZ2UuY19zdHIoKSwgbGVuKSAhPSBsZW4pIHsKKyAgICAgICAgR1RFU1RfTE9HXyhXQVJOSU5HKQorICAgICAgICAgICAgPDwgInN0cmVhbV9yZXN1bHRfdG86IGZhaWxlZCB0byBzdHJlYW0gdG8gIgorICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOworICAgICAgfQorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICAvLyBDcmVhdGVzIGEgY2xpZW50IHNvY2tldCBhbmQgY29ubmVjdHMgdG8gdGhlIHNlcnZlci4KKyAgICB2b2lkIE1ha2VDb25uZWN0aW9uKCk7CisKKyAgICAvLyBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICB2b2lkIENsb3NlQ29ubmVjdGlvbigpIHsKKyAgICAgIEdURVNUX0NIRUNLXyhzb2NrZmRfICE9IC0xKQorICAgICAgICAgIDw8ICJDbG9zZUNvbm5lY3Rpb24oKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKKworICAgICAgY2xvc2Uoc29ja2ZkXyk7CisgICAgICBzb2NrZmRfID0gLTE7CisgICAgfQorCisgICAgaW50IHNvY2tmZF87ICAvLyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgICAgY29uc3Qgc3RyaW5nIGhvc3RfbmFtZV87CisgICAgY29uc3Qgc3RyaW5nIHBvcnRfbnVtXzsKKworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU29ja2V0V3JpdGVyKTsKKyAgfTsgIC8vIGNsYXNzIFNvY2tldFdyaXRlcgorCisgIC8vIEVzY2FwZXMgJz0nLCAnJicsICclJywgYW5kICdcbicgY2hhcmFjdGVycyBpbiBzdHIgYXMgIiV4eCIuCisgIHN0YXRpYyBzdHJpbmcgVXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cik7CisKKyAgU3RyZWFtaW5nTGlzdGVuZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpCisgICAgICA6IHNvY2tldF93cml0ZXJfKG5ldyBTb2NrZXRXcml0ZXIoaG9zdCwgcG9ydCkpIHsgU3RhcnQoKTsgfQorCisgIGV4cGxpY2l0IFN0cmVhbWluZ0xpc3RlbmVyKEFic3RyYWN0U29ja2V0V3JpdGVyKiBzb2NrZXRfd3JpdGVyKQorICAgICAgOiBzb2NrZXRfd3JpdGVyXyhzb2NrZXRfd3JpdGVyKSB7IFN0YXJ0KCk7IH0KKworICB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovKSB7CisgICAgU2VuZExuKCJldmVudD1UZXN0UHJvZ3JhbVN0YXJ0Iik7CisgIH0KKworICB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICAgIC8vIE5vdGUgdGhhdCBHb29nbGUgVGVzdCBjdXJyZW50IG9ubHkgcmVwb3J0IGVsYXBzZWQgdGltZSBmb3IgZWFjaAorICAgIC8vIHRlc3QgaXRlcmF0aW9uLCBub3QgZm9yIHRoZSBlbnRpcmUgdGVzdCBwcm9ncmFtLgorICAgIFNlbmRMbigiZXZlbnQ9VGVzdFByb2dyYW1FbmQmcGFzc2VkPSIgKyBGb3JtYXRCb29sKHVuaXRfdGVzdC5QYXNzZWQoKSkpOworCisgICAgLy8gTm90aWZ5IHRoZSBzdHJlYW1pbmcgc2VydmVyIHRvIHN0b3AuCisgICAgc29ja2V0X3dyaXRlcl8tPkNsb3NlQ29ubmVjdGlvbigpOworICB9CisKKyAgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovLCBpbnQgaXRlcmF0aW9uKSB7CisgICAgU2VuZExuKCJldmVudD1UZXN0SXRlcmF0aW9uU3RhcnQmaXRlcmF0aW9uPSIgKworICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoaXRlcmF0aW9uKSk7CisgIH0KKworICB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgLyogaXRlcmF0aW9uICovKSB7CisgICAgU2VuZExuKCJldmVudD1UZXN0SXRlcmF0aW9uRW5kJnBhc3NlZD0iICsKKyAgICAgICAgICAgRm9ybWF0Qm9vbCh1bml0X3Rlc3QuUGFzc2VkKCkpICsgIiZlbGFwc2VkX3RpbWU9IiArCisgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpICsgIm1zIik7CisgIH0KKworICB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgICAgU2VuZExuKHN0ZDo6c3RyaW5nKCJldmVudD1UZXN0Q2FzZVN0YXJ0Jm5hbWU9IikgKyB0ZXN0X2Nhc2UubmFtZSgpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgICAgU2VuZExuKCJldmVudD1UZXN0Q2FzZUVuZCZwYXNzZWQ9IiArIEZvcm1hdEJvb2wodGVzdF9jYXNlLlBhc3NlZCgpKQorICAgICAgICAgICArICImZWxhcHNlZF90aW1lPSIgKyBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKQorICAgICAgICAgICArICJtcyIpOworICB9CisKKyAgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgU2VuZExuKHN0ZDo6c3RyaW5nKCJldmVudD1UZXN0U3RhcnQmbmFtZT0iKSArIHRlc3RfaW5mby5uYW1lKCkpOworICB9CisKKyAgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIFNlbmRMbigiZXZlbnQ9VGVzdEVuZCZwYXNzZWQ9IiArCisgICAgICAgICAgIEZvcm1hdEJvb2woKHRlc3RfaW5mby5yZXN1bHQoKSktPlBhc3NlZCgpKSArCisgICAgICAgICAgICImZWxhcHNlZF90aW1lPSIgKworICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoKHRlc3RfaW5mby5yZXN1bHQoKSktPmVsYXBzZWRfdGltZSgpKSArICJtcyIpOworICB9CisKKyAgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgICAgY29uc3QgY2hhciogZmlsZV9uYW1lID0gdGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKTsKKyAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpCisgICAgICBmaWxlX25hbWUgPSAiIjsKKyAgICBTZW5kTG4oImV2ZW50PVRlc3RQYXJ0UmVzdWx0JmZpbGU9IiArIFVybEVuY29kZShmaWxlX25hbWUpICsKKyAgICAgICAgICAgIiZsaW5lPSIgKyBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpKSArCisgICAgICAgICAgICImbWVzc2FnZT0iICsgVXJsRW5jb2RlKHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFNlbmRzIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBhIG5ld2xpbmUgdG8gdGhlIHNvY2tldC4KKyAgdm9pZCBTZW5kTG4oY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7IHNvY2tldF93cml0ZXJfLT5TZW5kTG4obWVzc2FnZSk7IH0KKworICAvLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHN0cmVhbWluZyB0byBub3RpZnkgdGhlIHJlY2VpdmVyIHdoYXQKKyAgLy8gcHJvdG9jb2wgd2UgYXJlIHVzaW5nLgorICB2b2lkIFN0YXJ0KCkgeyBTZW5kTG4oImd0ZXN0X3N0cmVhbWluZ19wcm90b2NvbF92ZXJzaW9uPTEuMCIpOyB9CisKKyAgc3RyaW5nIEZvcm1hdEJvb2woYm9vbCB2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPyAiMSIgOiAiMCI7IH0KKworICBjb25zdCBzY29wZWRfcHRyPEFic3RyYWN0U29ja2V0V3JpdGVyPiBzb2NrZXRfd3JpdGVyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFN0cmVhbWluZ0xpc3RlbmVyKTsKK307ICAvLyBjbGFzcyBTdHJlYW1pbmdMaXN0ZW5lcgorCisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCit1c2luZyBpbnRlcm5hbDo6Q291bnRJZjsKK3VzaW5nIGludGVybmFsOjpGb3JFYWNoOwordXNpbmcgaW50ZXJuYWw6OkdldEVsZW1lbnRPcjsKK3VzaW5nIGludGVybmFsOjpTaHVmZmxlOworCisvLyBDb25zdGFudHMuCisKKy8vIEEgdGVzdCB3aG9zZSB0ZXN0IGNhc2UgbmFtZSBvciB0ZXN0IG5hbWUgbWF0Y2hlcyB0aGlzIGZpbHRlciBpcworLy8gZGlzYWJsZWQgYW5kIG5vdCBydW4uCitzdGF0aWMgY29uc3QgY2hhciBrRGlzYWJsZVRlc3RGaWx0ZXJbXSA9ICJESVNBQkxFRF8qOiovRElTQUJMRURfKiI7CisKKy8vIEEgdGVzdCBjYXNlIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGlzIGZpbHRlciBpcyBjb25zaWRlcmVkIGEgZGVhdGgKKy8vIHRlc3QgY2FzZSBhbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRlc3QgY2FzZXMgd2hvc2UgbmFtZSBkb2Vzbid0CisvLyBtYXRjaCB0aGlzIGZpbHRlci4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RDYXNlRmlsdGVyW10gPSAiKkRlYXRoVGVzdDoqRGVhdGhUZXN0LyoiOworCisvLyBBIHRlc3QgZmlsdGVyIHRoYXQgbWF0Y2hlcyBldmVyeXRoaW5nLgorc3RhdGljIGNvbnN0IGNoYXIga1VuaXZlcnNhbEZpbHRlcltdID0gIioiOworCisvLyBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBmb3IgWE1MIG91dHB1dC4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0T3V0cHV0RmlsZVtdID0gInRlc3RfZGV0YWlsLnhtbCI7CisKKy8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdGVzdCBzaGFyZCBpbmRleC4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0U2hhcmRJbmRleFtdID0gIkdURVNUX1NIQVJEX0lOREVYIjsKKy8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHRlc3Qgc2hhcmRzLgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RUb3RhbFNoYXJkc1tdID0gIkdURVNUX1RPVEFMX1NIQVJEUyI7CisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgc3RhdHVzIGZpbGUuCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkU3RhdHVzRmlsZVtdID0gIkdURVNUX1NIQVJEX1NUQVRVU19GSUxFIjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIHRleHQgdXNlZCBpbiBmYWlsdXJlIG1lc3NhZ2VzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiB0aGUKKy8vIHN0YWNrIHRyYWNlLgorY29uc3QgY2hhciBrU3RhY2tUcmFjZU1hcmtlcltdID0gIlxuU3RhY2sgdHJhY2U6XG4iOworCisvLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCisvLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK2Jvb2wgZ19oZWxwX2ZsYWcgPSBmYWxzZTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK3N0YXRpYyBjb25zdCBjaGFyKiBHZXREZWZhdWx0RmlsdGVyKCkgeworICByZXR1cm4ga1VuaXZlcnNhbEZpbHRlcjsKK30KKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyIsIGZhbHNlKSwKKyAgICAiUnVuIGRpc2FibGVkIHRlc3RzIHRvbywgaW4gYWRkaXRpb24gdG8gdGhlIHRlc3RzIG5vcm1hbGx5IGJlaW5nIHJ1bi4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGJyZWFrX29uX2ZhaWx1cmUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImJyZWFrX29uX2ZhaWx1cmUiLCBmYWxzZSksCisgICAgIlRydWUgaWZmIGEgZmFpbGVkIGFzc2VydGlvbiBzaG91bGQgYmUgYSBkZWJ1Z2dlciBicmVhay1wb2ludC4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGNhdGNoX2V4Y2VwdGlvbnMsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImNhdGNoX2V4Y2VwdGlvbnMiLCB0cnVlKSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXworICAgICIgc2hvdWxkIGNhdGNoIGV4Y2VwdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgdGVzdCBmYWlsdXJlcy4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgY29sb3IsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiY29sb3IiLCAiYXV0byIpLAorICAgICJXaGV0aGVyIHRvIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4gIFZhbGlkIHZhbHVlczogeWVzLCBubywgIgorICAgICJhbmQgYXV0by4gICdhdXRvJyBtZWFucyB0byB1c2UgY29sb3JzIGlmIHRoZSBvdXRwdXQgaXMgIgorICAgICJiZWluZyBzZW50IHRvIGEgdGVybWluYWwgYW5kIHRoZSBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlICIKKyAgICAiaXMgc2V0IHRvIGEgdGVybWluYWwgdHlwZSB0aGF0IHN1cHBvcnRzIGNvbG9ycy4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZmlsdGVyLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImZpbHRlciIsIEdldERlZmF1bHRGaWx0ZXIoKSksCisgICAgIkEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYiAobm90IHJlZ2V4KSBwYXR0ZXJucyAiCisgICAgImZvciBmaWx0ZXJpbmcgdGhlIHRlc3RzIHRvIHJ1biwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICIKKyAgICAiJy0nIGFuZCBhIDogc2VwYXJhdGVkIGxpc3Qgb2YgbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvICIKKyAgICAiZXhjbHVkZSkuICBBIHRlc3QgaXMgcnVuIGlmIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSAiCisgICAgInBhdHRlcm5zIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8obGlzdF90ZXN0cywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIkxpc3QgYWxsIHRlc3RzIHdpdGhvdXQgcnVubmluZyB0aGVtLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBvdXRwdXQsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigib3V0cHV0IiwgIiIpLAorICAgICJBIGZvcm1hdCAoY3VycmVudGx5IG11c3QgYmUgXCJ4bWxcIiksIG9wdGlvbmFsbHkgZm9sbG93ZWQgIgorICAgICJieSBhIGNvbG9uIGFuZCBhbiBvdXRwdXQgZmlsZSBuYW1lIG9yIGRpcmVjdG9yeS4gQSBkaXJlY3RvcnkgIgorICAgICJpcyBpbmRpY2F0ZWQgYnkgYSB0cmFpbGluZyBwYXRobmFtZSBzZXBhcmF0b3IuICIKKyAgICAiRXhhbXBsZXM6IFwieG1sOmZpbGVuYW1lLnhtbFwiLCBcInhtbDo6ZGlyZWN0b3J5bmFtZS9cIi4gIgorICAgICJJZiBhIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQsIG91dHB1dCBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQgIgorICAgICJ3aXRoaW4gdGhhdCBkaXJlY3RvcnksIHdpdGggZmlsZS1uYW1lcyBiYXNlZCBvbiB0aGUgdGVzdCAiCisgICAgImV4ZWN1dGFibGUncyBuYW1lIGFuZCwgaWYgbmVjZXNzYXJ5LCBtYWRlIHVuaXF1ZSBieSBhZGRpbmcgIgorICAgICJkaWdpdHMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBwcmludF90aW1lLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJwcmludF90aW1lIiwgdHJ1ZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCBkaXNwbGF5IGVsYXBzZWQgdGltZSBpbiB0ZXh0IG91dHB1dC4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICByYW5kb21fc2VlZCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInJhbmRvbV9zZWVkIiwgMCksCisgICAgIlJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2Ugd2hlbiBzaHVmZmxpbmcgdGVzdCBvcmRlcnMuICBNdXN0IGJlIGluIHJhbmdlICIKKyAgICAiWzEsIDk5OTk5XSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUuIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgcmVwZWF0LAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmVwZWF0IiwgMSksCisgICAgIkhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCBlYWNoIHRlc3QuICBTcGVjaWZ5IGEgbmVnYXRpdmUgbnVtYmVyICIKKyAgICAiZm9yIHJlcGVhdGluZyBmb3JldmVyLiAgVXNlZnVsIGZvciBzaGFraW5nIG91dCBmbGFreSB0ZXN0cy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzLCBmYWxzZSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXyAiIHNob3VsZCBpbmNsdWRlIGludGVybmFsIHN0YWNrIGZyYW1lcyB3aGVuICIKKyAgICAicHJpbnRpbmcgdGVzdCBmYWlsdXJlIHN0YWNrIHRyYWNlcy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHNodWZmbGUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInNodWZmbGUiLCBmYWxzZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCByYW5kb21pemUgdGVzdHMnIG9yZGVyIG9uIGV2ZXJ5IHJ1bi4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICBzdGFja190cmFjZV9kZXB0aCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInN0YWNrX3RyYWNlX2RlcHRoIiwga01heFN0YWNrVHJhY2VEZXB0aCksCisgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gcHJpbnQgd2hlbiBhbiAiCisgICAgImFzc2VydGlvbiBmYWlscy4gIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRocm91Z2ggMTAwLCBpbmNsdXNpdmUuIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIHN0cmVhbV9yZXN1bHRfdG8sCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigic3RyZWFtX3Jlc3VsdF90byIsICIiKSwKKyAgICAiVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgaG9zdCBuYW1lIGFuZCB0aGUgcG9ydCBudW1iZXIgb24gd2hpY2ggdG8gc3RyZWFtICIKKyAgICAidGVzdCByZXN1bHRzLiBFeGFtcGxlOiBcImxvY2FsaG9zdDo1NTVcIi4gVGhlIGZsYWcgaXMgZWZmZWN0aXZlIG9ubHkgb24gIgorICAgICJMaW51eC4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHRocm93X29uX2ZhaWx1cmUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInRocm93X29uX2ZhaWx1cmUiLCBmYWxzZSksCisgICAgIldoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uICIKKyAgICAiaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBvciBleGl0IHRoZSBwcm9ncmFtIHdpdGggYSBub24temVybyBjb2RlICIKKyAgICAib3RoZXJ3aXNlLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKSwgdXNpbmcgYSBMaW5lYXIKKy8vIENvbmdydWVudGlhbCBHZW5lcmF0b3IgKExDRykuICBDcmFzaGVzIGlmICdyYW5nZScgaXMgMCBvciBncmVhdGVyCisvLyB0aGFuIGtNYXhSYW5nZS4KK1VJbnQzMiBSYW5kb206OkdlbmVyYXRlKFVJbnQzMiByYW5nZSkgeworICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRoZSBzYW1lIGFzIGFyZSB1c2VkIGluIGdsaWJjJ3MgcmFuZCgzKS4KKyAgc3RhdGVfID0gKDExMDM1MTUyNDVVKnN0YXRlXyArIDEyMzQ1VSkgJSBrTWF4UmFuZ2U7CisKKyAgR1RFU1RfQ0hFQ0tfKHJhbmdlID4gMCkKKyAgICAgIDw8ICJDYW5ub3QgZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLCAwKS4iOworICBHVEVTVF9DSEVDS18ocmFuZ2UgPD0ga01heFJhbmdlKQorICAgICAgPDwgIkdlbmVyYXRpb24gb2YgYSBudW1iZXIgaW4gWzAsICIgPDwgcmFuZ2UgPDwgIikgd2FzIHJlcXVlc3RlZCwgIgorICAgICAgPDwgImJ1dCB0aGlzIGNhbiBvbmx5IGdlbmVyYXRlIG51bWJlcnMgaW4gWzAsICIgPDwga01heFJhbmdlIDw8ICIpLiI7CisKKyAgLy8gQ29udmVydGluZyB2aWEgbW9kdWx1cyBpbnRyb2R1Y2VzIGEgYml0IG9mIGRvd253YXJkIGJpYXMsIGJ1dAorICAvLyBpdCdzIHNpbXBsZSwgYW5kIGEgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgaXNuJ3QgdG9vIGdvb2QKKyAgLy8gdG8gYmVnaW4gd2l0aC4KKyAgcmV0dXJuIHN0YXRlXyAlIHJhbmdlOworfQorCisvLyBHVGVzdElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBpbml0aWFsaXplZAorLy8gR29vZ2xlIFRlc3QuICBVc2VmdWwgZm9yIGNhdGNoaW5nIHRoZSB1c2VyIG1pc3Rha2Ugb2Ygbm90IGluaXRpYWxpemluZworLy8gR29vZ2xlIFRlc3QgYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEEgdXNlciBtdXN0IGNhbGwgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKSB0byBpbml0aWFsaXplIEdvb2dsZQorLy8gVGVzdC4gIGdfaW5pdF9ndGVzdF9jb3VudCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0aW1lcworLy8gSW5pdEdvb2dsZVRlc3QoKSBoYXMgYmVlbiBjYWxsZWQuICBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdmFyaWFibGUKKy8vIHVuZGVyIGEgbXV0ZXggYXMgaXQgaXMgb25seSBhY2Nlc3NlZCBpbiB0aGUgbWFpbiB0aHJlYWQuCitHVEVTVF9BUElfIGludCBnX2luaXRfZ3Rlc3RfY291bnQgPSAwOworc3RhdGljIGJvb2wgR1Rlc3RJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gZ19pbml0X2d0ZXN0X2NvdW50ICE9IDA7IH0KKworLy8gSXRlcmF0ZXMgb3ZlciBhIHZlY3RvciBvZiBUZXN0Q2FzZXMsIGtlZXBpbmcgYSBydW5uaW5nIHN1bSBvZiB0aGUKKy8vIHJlc3VsdHMgb2YgY2FsbGluZyBhIGdpdmVuIGludC1yZXR1cm5pbmcgbWV0aG9kIG9uIGVhY2guCisvLyBSZXR1cm5zIHRoZSBzdW0uCitzdGF0aWMgaW50IFN1bU92ZXJUZXN0Q2FzZUxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiYgY2FzZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoVGVzdENhc2U6OiptZXRob2QpKCkgY29uc3QpIHsKKyAgaW50IHN1bSA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FzZV9saXN0LnNpemUoKTsgaSsrKSB7CisgICAgc3VtICs9IChjYXNlX2xpc3RbaV0tPiptZXRob2QpKCk7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KK3N0YXRpYyBib29sIFRlc3RDYXNlUGFzc2VkKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpICYmIHRlc3RfY2FzZS0+UGFzc2VkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZUZhaWxlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPkZhaWxlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3RfY2FzZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGVzdCB0aGF0IHNob3VsZAorLy8gcnVuLgorc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdENhc2UoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCk7Cit9CisKKy8vIEFzc2VydEhlbHBlciBjb25zdHJ1Y3Rvci4KK0Fzc2VydEhlbHBlcjo6QXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKQorICAgIDogZGF0YV8obmV3IEFzc2VydEhlbHBlckRhdGEodHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkpIHsKK30KKworQXNzZXJ0SGVscGVyOjp+QXNzZXJ0SGVscGVyKCkgeworICBkZWxldGUgZGF0YV87Cit9CisKKy8vIE1lc3NhZ2UgYXNzaWdubWVudCwgZm9yIGFzc2VydGlvbiBzdHJlYW1pbmcgc3VwcG9ydC4KK3ZvaWQgQXNzZXJ0SGVscGVyOjpvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+CisgICAgQWRkVGVzdFBhcnRSZXN1bHQoZGF0YV8tPnR5cGUsIGRhdGFfLT5maWxlLCBkYXRhXy0+bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShkYXRhXy0+bWVzc2FnZSwgbWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKQorICAgICAgICAgICAgICAgICAgICAgIC0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKQorICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBmdW5jdGlvbiBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgICAgKTsgIC8vIE5PTElOVAorfQorCisvLyBNdXRleCBmb3IgbGlua2VkIHBvaW50ZXJzLgorR1RFU1RfQVBJXyBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisvLyBBcHBsaWNhdGlvbiBwYXRobmFtZSBnb3R0ZW4gaW4gSW5pdEdvb2dsZVRlc3QuCitzdGQ6OnN0cmluZyBnX2V4ZWN1dGFibGVfcGF0aDsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKKy8vIGlzIHByZXNlbnQuCitGaWxlUGF0aCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSB7CisgIEZpbGVQYXRoIHJlc3VsdDsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmVzdWx0LlNldChGaWxlUGF0aChnX2V4ZWN1dGFibGVfcGF0aCkuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKSk7CisjZWxzZQorICByZXN1bHQuU2V0KEZpbGVQYXRoKGdfZXhlY3V0YWJsZV9wYXRoKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gcmVzdWx0LlJlbW92ZURpcmVjdG9yeU5hbWUoKTsKK30KKworLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9vdXRwdXQgZmxhZy4KKworLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KK3N0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkgcmV0dXJuIHN0ZDo6c3RyaW5nKCIiKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBjb2xvbiA9IHN0cmNocihndGVzdF9vdXRwdXRfZmxhZywgJzonKTsKKyAgcmV0dXJuIChjb2xvbiA9PSBOVUxMKSA/CisgICAgICBzdGQ6OnN0cmluZyhndGVzdF9vdXRwdXRfZmxhZykgOgorICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcsIGNvbG9uIC0gZ3Rlc3Rfb3V0cHV0X2ZsYWcpOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vbmUKKy8vIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KK3N0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkKKyAgICByZXR1cm4gIiI7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIGlmIChjb2xvbiA9PSBOVUxMKQorICAgIHJldHVybiBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoCisgICAgICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChrRGVmYXVsdE91dHB1dEZpbGUpKS5zdHJpbmcoKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggb3V0cHV0X25hbWUoY29sb24gKyAxKTsKKyAgaWYgKCFvdXRwdXRfbmFtZS5Jc0Fic29sdXRlUGF0aCgpKQorICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIFxzb21lXHBhdGggaXMgbm90IGFuIGFic29sdXRlCisgICAgLy8gcGF0aCAoYXMgaXRzIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBkcml2ZSksIHlldCB0aGUKKyAgICAvLyBmb2xsb3dpbmcgbG9naWMgZm9yIHR1cm5pbmcgaXQgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlzIHdyb25nLgorICAgIC8vIEZpeCBpdC4KKyAgICBvdXRwdXRfbmFtZSA9IGludGVybmFsOjpGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChjb2xvbiArIDEpKTsKKworICBpZiAoIW91dHB1dF9uYW1lLklzRGlyZWN0b3J5KCkpCisgICAgcmV0dXJuIG91dHB1dF9uYW1lLnN0cmluZygpOworCisgIGludGVybmFsOjpGaWxlUGF0aCByZXN1bHQoaW50ZXJuYWw6OkZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKAorICAgICAgb3V0cHV0X25hbWUsIGludGVybmFsOjpHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSwKKyAgICAgIEdldE91dHB1dEZvcm1hdCgpLmNfc3RyKCkpKTsKKyAgcmV0dXJuIHJlc3VsdC5zdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKy8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCisvLworLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OlBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyKSB7CisgIHN3aXRjaCAoKnBhdHRlcm4pIHsKKyAgICBjYXNlICdcMCc6CisgICAgY2FzZSAnOic6ICAvLyBFaXRoZXIgJzonIG9yICdcMCcgbWFya3MgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KKyAgICAgIHJldHVybiAqc3RyID09ICdcMCc7CisgICAgY2FzZSAnPyc6ICAvLyBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgICAgY2FzZSAnKic6ICAvLyBNYXRjaGVzIGFueSBzdHJpbmcgKHBvc3NpYmx5IGVtcHR5KSBvZiBjaGFyYWN0ZXJzLgorICAgICAgcmV0dXJuICgqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiwgc3RyICsgMSkpIHx8CisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0cik7CisgICAgZGVmYXVsdDogIC8vIE5vbi1zcGVjaWFsIGNoYXJhY3Rlci4gIE1hdGNoZXMgaXRzZWxmLgorICAgICAgcmV0dXJuICpwYXR0ZXJuID09ICpzdHIgJiYKKyAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgIH0KK30KKworYm9vbCBVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGZpbHRlcikgeworICBjb25zdCBjaGFyICpjdXJfcGF0dGVybiA9IGZpbHRlcjsKKyAgZm9yICg7OykgeworICAgIGlmIChQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjdXJfcGF0dGVybiwgbmFtZS5jX3N0cigpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRmluZHMgdGhlIG5leHQgcGF0dGVybiBpbiB0aGUgZmlsdGVyLgorICAgIGN1cl9wYXR0ZXJuID0gc3RyY2hyKGN1cl9wYXR0ZXJuLCAnOicpOworCisgICAgLy8gUmV0dXJucyBpZiBubyBtb3JlIHBhdHRlcm4gY2FuIGJlIGZvdW5kLgorICAgIGlmIChjdXJfcGF0dGVybiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2tpcHMgdGhlIHBhdHRlcm4gc2VwYXJhdGVyICh0aGUgJzonIGNoYXJhY3RlcikuCisgICAgY3VyX3BhdHRlcm4rKzsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCisvLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9uYW1lKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUgPSB0ZXN0X2Nhc2VfbmFtZSArICIuIiArIHRlc3RfbmFtZS5jX3N0cigpOworCisgIC8vIFNwbGl0IC0tZ3Rlc3RfZmlsdGVyIGF0ICctJywgaWYgdGhlcmUgaXMgb25lLCB0byBzZXBhcmF0ZSBpbnRvCisgIC8vIHBvc2l0aXZlIGZpbHRlciBhbmQgbmVnYXRpdmUgZmlsdGVyIHBvcnRpb25zCisgIGNvbnN0IGNoYXIqIGNvbnN0IHAgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3QgZGFzaCA9IHN0cmNocihwLCAnLScpOworICBzdGQ6OnN0cmluZyBwb3NpdGl2ZTsKKyAgc3RkOjpzdHJpbmcgbmVnYXRpdmU7CisgIGlmIChkYXNoID09IE5VTEwpIHsKKyAgICBwb3NpdGl2ZSA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOyAgLy8gV2hvbGUgc3RyaW5nIGlzIGEgcG9zaXRpdmUgZmlsdGVyCisgICAgbmVnYXRpdmUgPSAiIjsKKyAgfSBlbHNlIHsKKyAgICBwb3NpdGl2ZSA9IHN0ZDo6c3RyaW5nKHAsIGRhc2gpOyAgIC8vIEV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGRhc2gKKyAgICBuZWdhdGl2ZSA9IHN0ZDo6c3RyaW5nKGRhc2ggKyAxKTsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGRhc2gKKyAgICBpZiAocG9zaXRpdmUuZW1wdHkoKSkgeworICAgICAgLy8gVHJlYXQgJy10ZXN0MScgYXMgdGhlIHNhbWUgYXMgJyotdGVzdDEnCisgICAgICBwb3NpdGl2ZSA9IGtVbml2ZXJzYWxGaWx0ZXI7CisgICAgfQorICB9CisKKyAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucy4gIEl0IG1hdGNoZXMgYQorICAvLyB0ZXN0IGlmIGFueSBwYXR0ZXJuIGluIGl0IG1hdGNoZXMgdGhlIHRlc3QuCisgIHJldHVybiAoTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIHBvc2l0aXZlLmNfc3RyKCkpICYmCisgICAgICAgICAgIU1hdGNoZXNGaWx0ZXIoZnVsbF9uYW1lLCBuZWdhdGl2ZS5jX3N0cigpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU0VICisvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKKy8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgorLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgYXMgYW4gX19leGNlcHQgY29uZGl0aW9uLgoraW50IFVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKSB7CisgIC8vIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgYSBTRUggZXhjZXB0aW9uIGlmOgorICAvLyAgIDEuIHRoZSB1c2VyIHdhbnRzIGl0IHRvLCBBTkQKKyAgLy8gICAyLiB0aGlzIGlzIG5vdCBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLCBBTkQKKyAgLy8gICAzLiB0aGlzIGlzIG5vdCBhIEMrKyBleGNlcHRpb24gKFZDKysgaW1wbGVtZW50cyB0aGVtIHZpYSBTRUgsCisgIC8vICAgICAgYXBwYXJlbnRseSkuCisgIC8vCisgIC8vIFNFSCBleGNlcHRpb24gY29kZSBmb3IgQysrIGV4Y2VwdGlvbnMuCisgIC8vIChzZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xODUyOTQgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorICBjb25zdCBEV09SRCBrQ3h4RXhjZXB0aW9uQ29kZSA9IDB4ZTA2ZDczNjM7CisKKyAgYm9vbCBzaG91bGRfaGFuZGxlID0gdHJ1ZTsKKworICBpZiAoIUdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCisgICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOworICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBFWENFUFRJT05fQlJFQUtQT0lOVCkKKyAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7CisgIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IGtDeHhFeGNlcHRpb25Db2RlKQorICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKKworICByZXR1cm4gc2hvdWxkX2hhbmRsZSA/IEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgOiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKy8vIHJlc3VsdHMuIEludGVyY2VwdHMgb25seSBmYWlsdXJlcyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZC4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCisgICAgOiBpbnRlcmNlcHRfbW9kZV8oSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQpLAorICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKKyAgSW5pdCgpOworfQorCisvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKy8vIHJlc3VsdHMuCitTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQorICAgIDogaW50ZXJjZXB0X21vZGVfKGludGVyY2VwdF9tb2RlKSwKKyAgICAgIHJlc3VsdF8ocmVzdWx0KSB7CisgIEluaXQoKTsKK30KKwordm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SW5pdCgpIHsKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKKyAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIodGhpcyk7CisgIH0gZWxzZSB7CisgICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7CisgICAgaW1wbC0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7CisgIH0KK30KKworLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkgR29vZ2xlIFRlc3QKKy8vIGJlZm9yZS4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjp+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7CisgICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihvbGRfcmVwb3J0ZXJfKTsKKyAgfSBlbHNlIHsKKyAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZChvbGRfcmVwb3J0ZXJfKTsKKyAgfQorfQorCisvLyBJbmNyZW1lbnRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IGNvdW50IGFuZCByZW1lbWJlcnMgdGhlIHJlc3VsdC4KKy8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgaW50ZXJmYWNlLgordm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXN1bHRfLT5BcHBlbmQocmVzdWx0KTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBXZSBzaG91bGQgYWx3YXlzIGNhbGwgdGhpcworLy8gaW5zdGVhZCBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKKy8vIHRlc3Rpbmc6OlRlc3QuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbgorLy8gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYSBmcmFtZXdvcmsgb24gTWFjIE9TIFguICBUaGUgYnVnIGNhdXNlcworLy8gR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nCisvLyBvbiB3aGV0aGVyIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3IKKy8vIGZyb20gdXNlciB0ZXN0IGNvZGUuICBHZXRUZXN0VHlwZUlkKCkgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMKKy8vIHJldHVybiB0aGUgc2FtZSB2YWx1ZSwgYXMgaXQgYWx3YXlzIGNhbGxzIEdldFR5cGVJZDw+KCkgZnJvbSB0aGUKKy8vIGd0ZXN0LmNjLCB3aGljaCBpcyB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yay4KK1R5cGVJZCBHZXRUZXN0VHlwZUlkKCkgeworICByZXR1cm4gR2V0VHlwZUlkPFRlc3Q+KCk7Cit9CisKKy8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKKy8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCitleHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0ID0gR2V0VGVzdFR5cGVJZCgpOworCisvLyBUaGlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIgY2hlY2tzIHRoYXQgJ3Jlc3VsdHMnIGNvbnRhaW5zIGEgdGVzdCBwYXJ0CisvLyBmYWlsdXJlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMgdGhlCisvLyBnaXZlbiBzdWJzdHJpbmcuCitBc3NlcnRpb25SZXN1bHQgSGFzT25lRmFpbHVyZShjb25zdCBjaGFyKiAvKiByZXN1bHRzX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB0eXBlX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBzdWJzdHJfZXhwciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkmIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBmYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBub24tZmF0YWwgZmFpbHVyZSIpOworICBNZXNzYWdlIG1zZzsKKyAgaWYgKHJlc3VsdHMuc2l6ZSgpICE9IDEpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgbXNnIDw8ICJcbiIgPDwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICB9CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCYgciA9IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCk7CisgIGlmIChyLnR5cGUoKSAhPSB0eXBlKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIGlmIChzdHJzdHIoci5tZXNzYWdlKCksIHN1YnN0ci5jX3N0cigpKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBjb250YWluaW5nIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3Vic3RyIDw8ICJcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cAorLy8gdGVzdCBwYXJ0IHJlc3VsdHMsIHdoYXQgdHlwZSBvZiBmYWlsdXJlIHdlIGV4cGVjdCwgYW5kIHdoYXQKKy8vIHN1YnN0cmluZyB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBjb250YWluLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpCisgICAgOiByZXN1bHRzXyhyZXN1bHRzKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgc3Vic3RyXyhzdWJzdHIpIHt9CisKKy8vIFRoZSBkZXN0cnVjdG9yIG9mIFNpbmdsZUZhaWx1cmVDaGVja2VyIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCisvLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQorLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCitTaW5nbGVGYWlsdXJlQ2hlY2tlcjo6flNpbmdsZUZhaWx1cmVDaGVja2VyKCkgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKEhhc09uZUZhaWx1cmUsICpyZXN1bHRzXywgdHlwZV8sIHN1YnN0cl8pOworfQorCitEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworICB1bml0X3Rlc3RfLT5saXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKS0+T25UZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCitEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgcmV0dXJuIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworfQorCisvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8gPSByZXBvcnRlcjsKK30KKworLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKK1VuaXRUZXN0SW1wbDo6R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSB7CisgIHJldHVybiBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLmdldCgpOworfQorCisvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKKyAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5zZXQocmVwb3J0ZXIpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZVBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFNob3VsZFJ1blRlc3RDYXNlKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFVuaXRUZXN0SW1wbDo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRlc3RDYXNlOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCitpbnQgVW5pdFRlc3RJbXBsOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnJlcG9ydGFibGVfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorLy8gdHJhY2UgYnV0IEJhcigpIGFuZCBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitzdGQ6OnN0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsKKyAgKHZvaWQpc2tpcF9jb3VudDsKKyAgcmV0dXJuICIiOworfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorVGltZUluTWlsbGlzIEdldFRpbWVJbk1pbGxpcygpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIDE5NzAtMDEtMDEgYW5kIDE2MDEtMDEtMDEgaW4gbWlsbGlzZWNvbmRzLgorICAvLyBodHRwOi8vYW5hbG9nb3VzLmJsb2dzcG90LmNvbS8yMDA1LzA0L2Vwb2NoLmh0bWwKKyAgY29uc3QgVGltZUluTWlsbGlzIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGEgPQorICAgIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4oMTE2NDQ0NzM2VUwpICogMTAwMDAwVUw7CisgIGNvbnN0IERXT1JEIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQgPSAxMDAwMDsKKworICBTWVNURU1USU1FIG5vd19zeXN0aW1lOworICBGSUxFVElNRSBub3dfZmlsZXRpbWU7CisgIFVMQVJHRV9JTlRFR0VSIG5vd19pbnQ2NDsKKyAgLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFNob3VsZG4ndCB0aGlzIGp1c3QgdXNlCisgIC8vICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKT8KKyAgR2V0U3lzdGVtVGltZSgmbm93X3N5c3RpbWUpOworICBpZiAoU3lzdGVtVGltZVRvRmlsZVRpbWUoJm5vd19zeXN0aW1lLCAmbm93X2ZpbGV0aW1lKSkgeworICAgIG5vd19pbnQ2NC5Mb3dQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3TG93RGF0ZVRpbWU7CisgICAgbm93X2ludDY0LkhpZ2hQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3SGlnaERhdGVUaW1lOworICAgIG5vd19pbnQ2NC5RdWFkUGFydCA9IChub3dfaW50NjQuUXVhZFBhcnQgLyBrVGVudGhNaWNyb3NJbk1pbGxpU2Vjb25kKSAtCisgICAgICBrSmF2YUVwb2NoVG9XaW5GaWxlVGltZURlbHRhOworICAgIHJldHVybiBub3dfaW50NjQuUXVhZFBhcnQ7CisgIH0KKyAgcmV0dXJuIDA7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9IQVNfR0VUVElNRU9GREFZXworICBfX3RpbWViNjQgbm93OworCisjIGlmZGVmIF9NU0NfVkVSCisKKyAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgX2Z0aW1lNjQoKSwgc28gd2Ugd2FudCB0byBzdXBwcmVzcyB3YXJuaW5nIDQ5OTYKKyAgLy8gKGRlcHJlY2F0ZWQgZnVuY3Rpb24pIHRoZXJlLgorICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIEdldFRpY2tDb3VudCgpPyAgT3IgdXNlCisgIC8vICAgU3lzdGVtVGltZVRvRmlsZVRpbWUoKQorIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDk5Ni4KKyAgX2Z0aW1lNjQoJm5vdyk7CisjICBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyMgZWxzZQorCisgIF9mdGltZTY0KCZub3cpOworCisjIGVuZGlmICAvLyBfTVNDX1ZFUgorCisgIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50aW1lKSAqIDEwMDAgKyBub3cubWlsbGl0bTsKKyNlbGlmIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCisgIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPihub3cudHZfc2VjKSAqIDEwMDAgKyBub3cudHZfdXNlYyAvIDEwMDA7CisjZWxzZQorIyBlcnJvciAiRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgb24geW91ciBzeXN0ZW0uIgorI2VuZGlmCit9CisKKy8vIFV0aWxpdGllcworCisvLyBjbGFzcyBTdHJpbmcuCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZworLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorLy8gaW5wdXQgaXMgTlVMTC4KK0xQQ1dTVFIgU3RyaW5nOjpBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBhbnNpKSB7CisgIGlmICghYW5zaSkgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYW5zaSk7CisgIGNvbnN0IGludCB1bmljb2RlX2xlbmd0aCA9CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKyAgV0NIQVIqIHVuaWNvZGUgPSBuZXcgV0NIQVJbdW5pY29kZV9sZW5ndGggKyAxXTsKKyAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCB1bmljb2RlX2xlbmd0aCk7CisgIHVuaWNvZGVbdW5pY29kZV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIHVuaWNvZGU7Cit9CisKKy8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKKy8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKy8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKy8vIGlucHV0IGlzIE5VTEwuCitjb25zdCBjaGFyKiBTdHJpbmc6OlV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKSAgeworICBpZiAoIXV0ZjE2X3N0cikgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBhbnNpX2xlbmd0aCA9CisgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgIGNoYXIqIGFuc2kgPSBuZXcgY2hhclthbnNpX2xlbmd0aCArIDFdOworICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICBhbnNpLCBhbnNpX2xlbmd0aCwgTlVMTCwgTlVMTCk7CisgIGFuc2lbYW5zaV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIGFuc2k7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisvLworLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAorLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmICggbGhzID09IE5VTEwgKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKCByaHMgPT0gTlVMTCApIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RyY21wKGxocywgcmhzKSA9PSAwOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBDb252ZXJ0cyBhbiBhcnJheSBvZiB3aWRlIGNoYXJzIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoZSBnaXZlbiBNZXNzYWdlIG9iamVjdC4KK3N0YXRpYyB2b2lkIFN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZShjb25zdCB3Y2hhcl90KiB3c3RyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1zZykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBsZW5ndGg7ICkgeyAgLy8gTk9MSU5UCisgICAgaWYgKHdzdHJbaV0gIT0gTCdcMCcpIHsKKyAgICAgICptc2cgPDwgV2lkZVN0cmluZ1RvVXRmOCh3c3RyICsgaSwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGggLSBpKSk7CisgICAgICB3aGlsZSAoaSAhPSBsZW5ndGggJiYgd3N0cltpXSAhPSBMJ1wwJykKKyAgICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICAqbXNnIDw8ICdcMCc7CisgICAgICBpKys7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBNZXNzYWdlLgorLy8gV2UgYWxsb2NhdGUgdGhlIHN0cmluZ3N0cmVhbSBzZXBhcmF0ZWx5IGJlY2F1c2Ugb3RoZXJ3aXNlIGVhY2ggdXNlIG9mCisvLyBBU1NFUlQvRVhQRUNUIGluIGEgcHJvY2VkdXJlIGFkZHMgb3ZlciAyMDAgYnl0ZXMgdG8gdGhlIHByb2NlZHVyZSdzCisvLyBzdGFjayBmcmFtZSBsZWFkaW5nIHRvIGh1Z2Ugc3RhY2sgZnJhbWVzIGluIHNvbWUgY2FzZXM7IGdjYyBkb2VzIG5vdCByZXVzZQorLy8gdGhlIHN0YWNrIHNwYWNlLgorTWVzc2FnZTo6TWVzc2FnZSgpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7CisgIC8vIEJ5IGRlZmF1bHQsIHdlIHdhbnQgdGhlcmUgdG8gYmUgZW5vdWdoIHByZWNpc2lvbiB3aGVuIHByaW50aW5nCisgIC8vIGEgZG91YmxlIHRvIGEgTWVzc2FnZS4KKyAgKnNzXyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMik7Cit9CisKKy8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKKy8vIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IHdjaGFyX3QqIHdpZGVfY19zdHIpIHsKKyAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKK30KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KHdjaGFyX3QqIHdpZGVfY19zdHIpIHsKKyAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCitNZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCA6OnN0ZDo6d3N0cmluZyYgd3N0cikgeworICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7CisgIHJldHVybiAqdGhpczsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKSB7CisgIGludGVybmFsOjpTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2Uod3N0ci5jX3N0cigpLCB3c3RyLmxlbmd0aCgpLCB0aGlzKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYW4gc3RkOjpzdHJpbmcuCisvLyBFYWNoICdcMCcgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KK3N0ZDo6c3RyaW5nIE1lc3NhZ2U6OkdldFN0cmluZygpIGNvbnN0IHsKKyAgcmV0dXJuIGludGVybmFsOjpTdHJpbmdTdHJlYW1Ub1N0cmluZyhzc18uZ2V0KCkpOworfQorCisvLyBBc3NlcnRpb25SZXN1bHQgY29uc3RydWN0b3JzLgorLy8gVXNlZCBpbiBFWFBFQ1RfVFJVRS9GQUxTRShhc3NlcnRpb25fcmVzdWx0KS4KK0Fzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpCisgICAgOiBzdWNjZXNzXyhvdGhlci5zdWNjZXNzXyksCisgICAgICBtZXNzYWdlXyhvdGhlci5tZXNzYWdlXy5nZXQoKSAhPSBOVUxMID8KKyAgICAgICAgICAgICAgIG5ldyA6OnN0ZDo6c3RyaW5nKCpvdGhlci5tZXNzYWdlXykgOgorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPihOVUxMKSkgeworfQorCisvLyBSZXR1cm5zIHRoZSBhc3NlcnRpb24ncyBuZWdhdGlvbi4gVXNlZCB3aXRoIEVYUEVDVC9BU1NFUlRfRkFMU0UuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uUmVzdWx0OjpvcGVyYXRvciEoKSBjb25zdCB7CisgIEFzc2VydGlvblJlc3VsdCBuZWdhdGlvbighc3VjY2Vzc18pOworICBpZiAobWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCkKKyAgICBuZWdhdGlvbiA8PCAqbWVzc2FnZV87CisgIHJldHVybiBuZWdhdGlvbjsKK30KKworLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpIHsKKyAgcmV0dXJuIEFzc2VydGlvblJlc3VsdCh0cnVlKTsKK30KKworLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCkgeworICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KGZhbHNlKTsKK30KKworLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBmYWlsdXJlIG1lc3NhZ2UuCisvLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2UuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbWVzc2FnZTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgYW4gZXF1YWxpdHkgYXNzZXJ0aW9uCisvLyAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9TVFJFUSwgZXRjKSBmYWlsdXJlLgorLy8KKy8vIFRoZSBmaXJzdCBmb3VyIHBhcmFtZXRlcnMgYXJlIHRoZSBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBhc3NlcnRpb24KKy8vIGFuZCB0aGVpciB2YWx1ZXMsIGFzIHN0cmluZ3MuICBGb3IgZXhhbXBsZSwgZm9yIEFTU0VSVF9FUShmb28sIGJhcikKKy8vIHdoZXJlIGZvbyBpcyA1IGFuZCBiYXIgaXMgNiwgd2UgaGF2ZToKKy8vCisvLyAgIGV4cGVjdGVkX2V4cHJlc3Npb246ICJmb28iCisvLyAgIGFjdHVhbF9leHByZXNzaW9uOiAgICJiYXIiCisvLyAgIGV4cGVjdGVkX3ZhbHVlOiAgICAgICI1IgorLy8gICBhY3R1YWxfdmFsdWU6ICAgICAgICAiNiIKKy8vCisvLyBUaGUgaWdub3JpbmdfY2FzZSBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhCisvLyAqX1NUUkNBU0VFUSouICBXaGVuIGl0J3MgdHJ1ZSwgdGhlIHN0cmluZyAiIChpZ25vcmluZyBjYXNlKSIgd2lsbAorLy8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KK0Fzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFjdHVhbF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGFjdHVhbF9leHByZXNzaW9uOworICBpZiAoYWN0dWFsX3ZhbHVlICE9IGFjdHVhbF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF92YWx1ZTsKKyAgfQorCisgIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9leHByZXNzaW9uOworICBpZiAoaWdub3JpbmdfY2FzZSkgeworICAgIG1zZyA8PCAiIChpZ25vcmluZyBjYXNlKSI7CisgIH0KKyAgaWYgKGV4cGVjdGVkX3ZhbHVlICE9IGV4cGVjdGVkX2V4cHJlc3Npb24pIHsKKyAgICBtc2cgPDwgIlxuV2hpY2ggaXM6ICIgPDwgZXhwZWN0ZWRfdmFsdWU7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1zZzsKK30KKworLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCitzdGQ6OnN0cmluZyBHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoCisgICAgY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBhc3NlcnRpb25fcmVzdWx0LAorICAgIGNvbnN0IGNoYXIqIGV4cHJlc3Npb25fdGV4dCwKKyAgICBjb25zdCBjaGFyKiBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlLAorICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZSkgeworICBjb25zdCBjaGFyKiBhY3R1YWxfbWVzc2FnZSA9IGFzc2VydGlvbl9yZXN1bHQubWVzc2FnZSgpOworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBleHByZXNzaW9uX3RleHQKKyAgICAgIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF9wcmVkaWNhdGVfdmFsdWU7CisgIGlmIChhY3R1YWxfbWVzc2FnZVswXSAhPSAnXDAnKQorICAgIG1zZyA8PCAiICgiIDw8IGFjdHVhbF9tZXNzYWdlIDw8ICIpIjsKKyAgbXNnIDw8ICJcbkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZTsKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCitBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcikgeworICBjb25zdCBkb3VibGUgZGlmZiA9IGZhYnModmFsMSAtIHZhbDIpOworICBpZiAoZGlmZiA8PSBhYnNfZXJyb3IpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgLy8gVE9ETyh3YW4pOiBkbyBub3QgcHJpbnQgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gaWYgaXQncworICAvLyBhbHJlYWR5IGEgbGl0ZXJhbC4KKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIiA8PCBleHByMSA8PCAiIGFuZCAiIDw8IGV4cHIyCisgICAgICA8PCAiIGlzICIgPDwgZGlmZiA8PCAiLCB3aGljaCBleGNlZWRzICIgPDwgYWJzX2Vycm9yX2V4cHIgPDwgIiwgd2hlcmVcbiIKKyAgICAgIDw8IGV4cHIxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMSA8PCAiLFxuIgorICAgICAgPDwgZXhwcjIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwyIDw8ICIsIGFuZFxuIgorICAgICAgPDwgYWJzX2Vycm9yX2V4cHIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCBhYnNfZXJyb3IgPDwgIi4iOworfQorCisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIEZsb2F0TEUoKSBhbmQgRG91YmxlTEUoKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IEZsb2F0aW5nUG9pbnRMRShjb25zdCBjaGFyKiBleHByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgdmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwyKSB7CisgIC8vIFJldHVybnMgc3VjY2VzcyBpZiB2YWwxIGlzIGxlc3MgdGhhbiB2YWwyLAorICBpZiAodmFsMSA8IHZhbDIpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgLy8gb3IgaWYgdmFsMSBpcyBhbG1vc3QgZXF1YWwgdG8gdmFsMi4KKyAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHModmFsMSksIHJocyh2YWwyKTsKKyAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICAvLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHR3byBjaGVja3Mgd2lsbCBib3RoIGZhaWwgaWYgZWl0aGVyIHZhbDEgb3IKKyAgLy8gdmFsMiBpcyBOYU4sIGFzIHRoZSBJRUVFIGZsb2F0aW5nLXBvaW50IHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQKKyAgLy8gYW55IHByZWRpY2F0ZSBpbnZvbHZpbmcgYSBOYU4gbXVzdCByZXR1cm4gZmFsc2UuCisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwxX3NzOworICB2YWwxX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICA8PCB2YWwxOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gdmFsMl9zczsKKyAgdmFsMl9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgPDwgdmFsMjsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpIDw9ICgiIDw8IGV4cHIyIDw8ICIpXG4iCisgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnZhbDFfc3MpIDw8ICIgdnMgIgorICAgICAgPDwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnZhbDJfc3MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitBc3NlcnRpb25SZXN1bHQgRmxvYXRMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdQb2ludExFPGZsb2F0PihleHByMSwgZXhwcjIsIHZhbDEsIHZhbDIpOworfQorCisvLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCisvLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KK0Fzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsIGRvdWJsZSB2YWwyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdQb2ludExFPGRvdWJsZT4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRIHdpdGggaW50IG9yIGVudW0KKy8vIGFyZ3VtZW50cy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpIHsKKyAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShhY3R1YWwsIGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisvLyBBU1NFUlRfPz8gYW5kIEVYUEVDVF8/PyB3aXRoIGludGVnZXIgb3IgZW51bSBhcmd1bWVudHMuICBJdCBpcyBoZXJlCisvLyBqdXN0IHRvIGF2b2lkIGNvcHktYW5kLXBhc3RlIG9mIHNpbWlsYXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhvcF9uYW1lLCBvcClcCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IHZhbDEsIEJpZ2dlc3RJbnQgdmFsMikge1wKKyAgaWYgKHZhbDEgb3AgdmFsMikge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpO1wKKyAgfSBlbHNlIHtcCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSBcCisgICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgIiAjb3AgIiAoIiA8PCBleHByMlwKKyAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMilcCisgICAgICAgIDw8ICIgdnMgIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMiwgdmFsMSk7XAorICB9XAorfQorCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9ORSB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xFIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTEUsIDw9KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMVCwgPCApCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HRSB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdFLCA+PSkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dUIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR1QsID4gKQorCisjdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpIHsKKyAgaWYgKFN0cmluZzo6Q1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpIHsKKyAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIHRydWUpOworfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSTkUuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKSB7CisgIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9IGVsc2UgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpLCBhY3R1YWw6IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczEgPDwgIlwiIHZzIFwiIiA8PCBzMiA8PCAiXCIiOworICB9Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRU5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMikgeworICBpZiAoIVN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhzMSwgczIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpIChpZ25vcmluZyBjYXNlKSwgYWN0dWFsOiBcIiIKKyAgICAgICAgPDwgczEgPDwgIlwiIHZzIFwiIiA8PCBzMiA8PCAiXCIiOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgSXNTdWJTdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKS4KKworLy8gVGhpcyBncm91cCBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSBpZmYgbmVlZGxlIGlzIGEKKy8vIHN1YnN0cmluZyBvZiBoYXlzdGFjay4gIE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYKKy8vIG9ubHkuCisKK2Jvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgaWYgKG5lZWRsZSA9PSBOVUxMIHx8IGhheXN0YWNrID09IE5VTEwpCisgICAgcmV0dXJuIG5lZWRsZSA9PSBoYXlzdGFjazsKKworICByZXR1cm4gc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpICE9IE5VTEw7Cit9CisKK2Jvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKKyAgaWYgKG5lZWRsZSA9PSBOVUxMIHx8IGhheXN0YWNrID09IE5VTEwpCisgICAgcmV0dXJuIG5lZWRsZSA9PSBoYXlzdGFjazsKKworICByZXR1cm4gd2Nzc3RyKGhheXN0YWNrLCBuZWVkbGUpICE9IE5VTEw7Cit9CisKKy8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgZWl0aGVyIDo6c3RkOjpzdHJpbmcgb3IgOjpzdGQ6OndzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK2Jvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IFN0cmluZ1R5cGUmIG5lZWRsZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7CisgIHJldHVybiBoYXlzdGFjay5maW5kKG5lZWRsZSkgIT0gU3RyaW5nVHlwZTo6bnBvczsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGVpdGhlciBJc1N1YnN0cmluZygpIG9yIElzTm90U3Vic3RyaW5nKCksCisvLyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcgcGFyYW1ldGVyLgorLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBjb25zdCBjaGFyKiwgY29uc3Qgd2NoYXJfdCosIDo6c3RkOjpzdHJpbmcsCisvLyBvciA6OnN0ZDo6d3N0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nSW1wbCgKKyAgICBib29sIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZywKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7CisgIGlmIChJc1N1YnN0cmluZ1ByZWQobmVlZGxlLCBoYXlzdGFjaykgPT0gZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nKQorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgY29uc3QgYm9vbCBpc193aWRlX3N0cmluZyA9IHNpemVvZihuZWVkbGVbMF0pID4gMTsKKyAgY29uc3QgY2hhciogY29uc3QgYmVnaW5fc3RyaW5nX3F1b3RlID0gaXNfd2lkZV9zdHJpbmcgPyAiTFwiIiA6ICJcIiI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJWYWx1ZSBvZjogIiA8PCBuZWVkbGVfZXhwciA8PCAiXG4iCisgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IG5lZWRsZSA8PCAiXCJcbiIKKyAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCAoZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nID8gIiIgOiAibm90ICIpCisgICAgICA8PCAiYSBzdWJzdHJpbmcgb2YgIiA8PCBoYXlzdGFja19leHByIDw8ICJcbiIKKyAgICAgIDw8ICJXaGljaCBpczogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgaGF5c3RhY2sgPDwgIlwiIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIElzU3Vic3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkgY2hlY2sgd2hldGhlciBuZWVkbGUgaXMgYQorLy8gc3Vic3RyaW5nIG9mIGhheXN0YWNrIChOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmCisvLyBvbmx5KSwgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhleSBmYWlsLgorCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgSXNIUkVTVUxUe1N1Y2Nlc3NGYWlsdXJlfSBwcmVkaWNhdGVzCitBc3NlcnRpb25SZXN1bHQgSFJFU1VMVEZhaWx1cmVIZWxwZXIoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKSB7ICAvLyBOT0xJTlQKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICAvLyBXaW5kb3dzIENFIGRvZXNuJ3Qgc3VwcG9ydCBGb3JtYXRNZXNzYWdlLgorICBjb25zdCBjaGFyIGVycm9yX3RleHRbXSA9ICIiOworCisjIGVsc2UKKworICAvLyBMb29rcyB1cCB0aGUgaHVtYW4tcmVhZGFibGUgc3lzdGVtIG1lc3NhZ2UgZm9yIHRoZSBIUkVTVUxUIGNvZGUKKyAgLy8gYW5kIHNpbmNlIHdlJ3JlIG5vdCBwYXNzaW5nIGFueSBwYXJhbXMgdG8gRm9ybWF0TWVzc2FnZSwgd2UgZG9uJ3QKKyAgLy8gd2FudCBpbnNlcnRzIGV4cGFuZGVkLgorICBjb25zdCBEV09SRCBrRmxhZ3MgPSBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8CisgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTOworICBjb25zdCBEV09SRCBrQnVmU2l6ZSA9IDQwOTY7CisgIC8vIEdldHMgdGhlIHN5c3RlbSdzIGh1bWFuIHJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGlzIEhSRVNVTFQuCisgIGNoYXIgZXJyb3JfdGV4dFtrQnVmU2l6ZV0gPSB7ICdcMCcgfTsKKyAgRFdPUkQgbWVzc2FnZV9sZW5ndGggPSA6OkZvcm1hdE1lc3NhZ2VBKGtGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBzb3VyY2UsIHdlJ3JlIGFza2luZyBzeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyLCAgLy8gdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gbm8gbGluZSB3aWR0aCByZXN0cmljdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RleHQsICAvLyBvdXRwdXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQnVmU2l6ZSwgIC8vIGJ1ZiBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgIC8vIG5vIGFyZ3VtZW50cyBmb3IgaW5zZXJ0cworICAvLyBUcmltcyB0YWlsaW5nIHdoaXRlIHNwYWNlIChGb3JtYXRNZXNzYWdlIGxlYXZlcyBhIHRyYWlsaW5nIENSLUxGKQorICBmb3IgKDsgbWVzc2FnZV9sZW5ndGggJiYgSXNTcGFjZShlcnJvcl90ZXh0W21lc3NhZ2VfbGVuZ3RoIC0gMV0pOworICAgICAgICAgIC0tbWVzc2FnZV9sZW5ndGgpIHsKKyAgICBlcnJvcl90ZXh0W21lc3NhZ2VfbGVuZ3RoIC0gMV0gPSAnXDAnOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyb3JfaGV4KCIweCIgKyBTdHJpbmc6OkZvcm1hdEhleEludChocikpOworICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHByIDw8ICIgIiA8PCBleHBlY3RlZCA8PCAiLlxuIgorICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IGVycm9yX2hleCA8PCAiICIgPDwgZXJyb3JfdGV4dCA8PCAiXG4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgInN1Y2NlZWRzIiwgaHIpOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLCBsb25nIGhyKSB7ICAvLyBOT0xJTlQKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisgIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAiZmFpbHMiLCBocik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgVW5pY29kZSB0ZXh0ICh3aWRlIHN0cmluZ3MpIGluCisvLyBVVEYtOC4KKworLy8gQSBVbmljb2RlIGNvZGUtcG9pbnQgY2FuIGhhdmUgdXB0byAyMSBiaXRzLCBhbmQgaXMgZW5jb2RlZCBpbiBVVEYtOAorLy8gbGlrZSB0aGlzOgorLy8KKy8vIENvZGUtcG9pbnQgbGVuZ3RoICAgRW5jb2RpbmcKKy8vICAgMCAtICA3IGJpdHMgICAgICAgMHh4eHh4eHgKKy8vICAgOCAtIDExIGJpdHMgICAgICAgMTEweHh4eHggMTB4eHh4eHgKKy8vICAxMiAtIDE2IGJpdHMgICAgICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKy8vICAxNyAtIDIxIGJpdHMgICAgICAgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIG9uZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDEgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAgNykgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgdHdvLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MiA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg1ICsgNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHRocmVlLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MyA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg0ICsgMio2KSkgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgZm91ci1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDQgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoMyArIDMqNikpIC0gMTsKKworLy8gQ2hvcHMgb2ZmIHRoZSBuIGxvd2VzdCBiaXRzIGZyb20gYSBiaXQgcGF0dGVybi4gIFJldHVybnMgdGhlIG4KKy8vIGxvd2VzdCBiaXRzLiAgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIG9yaWdpbmFsIGJpdCBwYXR0ZXJuIHdpbGwgYmUKKy8vIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IG4gYml0cy4KK2lubGluZSBVSW50MzIgQ2hvcExvd0JpdHMoVUludDMyKiBiaXRzLCBpbnQgbikgeworICBjb25zdCBVSW50MzIgbG93X2JpdHMgPSAqYml0cyAmICgoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCBuKSAtIDEpOworICAqYml0cyA+Pj0gbjsKKyAgcmV0dXJuIGxvd19iaXRzOworfQorCisvLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQorLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCisvLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgY29udmVydGVkCisvLyB0byAiKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKSIuCitzdGQ6OnN0cmluZyBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQpIHsKKyAgaWYgKGNvZGVfcG9pbnQgPiBrTWF4Q29kZVBvaW50NCkgeworICAgIHJldHVybiAiKEludmFsaWQgVW5pY29kZSAweCIgKyBTdHJpbmc6OkZvcm1hdEhleEludChjb2RlX3BvaW50KSArICIpIjsKKyAgfQorCisgIGNoYXIgc3RyWzVdOyAgLy8gQmlnIGVub3VnaCBmb3IgdGhlIGxhcmdlc3QgdmFsaWQgY29kZSBwb2ludC4KKyAgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDEpIHsKKyAgICBzdHJbMV0gPSAnXDAnOworICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHh4eHh4eHgKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQyKSB7CisgICAgc3RyWzJdID0gJ1wwJzsKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhDMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTB4eHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDMpIHsKKyAgICBzdHJbM10gPSAnXDAnOworICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhFMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTEweHh4eAorICB9IGVsc2UgeyAgLy8gY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50NAorICAgIHN0cls0XSA9ICdcMCc7CisgICAgc3RyWzNdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhGMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTExMHh4eAorICB9CisgIHJldHVybiBzdHI7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaWYgdGhlIHRoZSBzeXN0ZW0KKy8vIHVzZXMgVVRGLTE2IGZvciB3aWRlIHN0cmluZyBlbmNvZGluZy4gQWxsIHN1cHBvcnRlZCBzeXN0ZW1zCisvLyB3aXRoIDE2IGJpdCB3Y2hhcl90IChXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpIGRvIHVzZSBVVEYtMTYuCisKKy8vIERldGVybWluZXMgaWYgdGhlIGFyZ3VtZW50cyBjb25zdGl0dXRlIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorLy8gYW5kIHRodXMgc2hvdWxkIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgVW5pY29kZSBjb2RlIHBvaW50CisvLyB1c2luZyBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyLgoraW5saW5lIGJvb2wgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwgd2NoYXJfdCBzZWNvbmQpIHsKKyAgcmV0dXJuIHNpemVvZih3Y2hhcl90KSA9PSAyICYmCisgICAgICAoZmlyc3QgJiAweEZDMDApID09IDB4RDgwMCAmJiAoc2Vjb25kICYgMHhGQzAwKSA9PSAweERDMDA7Cit9CisKKy8vIENyZWF0ZXMgYSBVbmljb2RlIGNvZGUgcG9pbnQgZnJvbSBVVEYxNiBzdXJyb2dhdGUgcGFpci4KK2lubGluZSBVSW50MzIgQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgc2Vjb25kKSB7CisgIGNvbnN0IFVJbnQzMiBtYXNrID0gKDEgPDwgMTApIC0gMTsKKyAgcmV0dXJuIChzaXplb2Yod2NoYXJfdCkgPT0gMikgPworICAgICAgKCgoZmlyc3QgJiBtYXNrKSA8PCAxMCkgfCAoc2Vjb25kICYgbWFzaykpICsgMHgxMDAwMCA6CisgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbmRpdGlvbiBpcworICAgICAgLy8gZmFsc2UsIGJ1dCB3ZSBwcm92aWRlIGEgc2Vuc2libGUgZGVmYXVsdCBpbiBjYXNlIGl0IGlzLgorICAgICAgc3RhdGljX2Nhc3Q8VUludDMyPihmaXJzdCk7Cit9CisKKy8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKKy8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKKy8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgorLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKKy8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZworLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KKy8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZworLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCisvLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCitzdGQ6OnN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycykgeworICBpZiAobnVtX2NoYXJzID09IC0xKQorICAgIG51bV9jaGFycyA9IHN0YXRpY19jYXN0PGludD4od2NzbGVuKHN0cikpOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7CisgICAgVUludDMyIHVuaWNvZGVfY29kZV9wb2ludDsKKworICAgIGlmIChzdHJbaV0gPT0gTCdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoaSArIDEgPCBudW1fY2hhcnMgJiYgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLCBzdHJbaSArIDFdKSkgeworICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpICsgMV0pOworICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHN0cltpXSk7CisgICAgfQorCisgICAgc3RyZWFtIDw8IENvZGVQb2ludFRvVXRmOCh1bmljb2RlX2NvZGVfcG9pbnQpOworICB9CisgIHJldHVybiBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGFuIHN0ZDo6c3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KKy8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuCitzdGQ6OnN0cmluZyBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90ICogd2lkZV9jX3N0cikgeworICBpZiAod2lkZV9jX3N0ciA9PSBOVUxMKSAgcmV0dXJuICIobnVsbCkiOworCisgIHJldHVybiBpbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmOCh3aWRlX2Nfc3RyLCAtMSk7Cit9CisKKy8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCisvLyBjb250ZW50LgorLy8KKy8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKKy8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QgKiBsaHMsIGNvbnN0IHdjaGFyX3QgKiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHdjc2NtcChsaHMsIHJocykgPT0gMDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpIHsKKyAgaWYgKCFTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpLCBhY3R1YWw6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBQcmludFRvU3RyaW5nKHMxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCBQcmludFRvU3RyaW5nKHMyKTsKK30KKworLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlCisvLyB0aGUgc2FtZSBjb250ZW50LgorLy8KKy8vIFVubGlrZSBzdHJjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQorLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KK2Jvb2wgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIgKiBsaHMsIGNvbnN0IGNoYXIgKiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKQorICAgIHJldHVybiByaHMgPT0gTlVMTDsKKyAgaWYgKHJocyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHBvc2l4OjpTdHJDYXNlQ21wKGxocywgcmhzKSA9PSAwOworfQorCisgIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQorICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgorICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIHdpZGUgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4KKyAgLy8gT24gd2luZG93cywgdGhpcyBtZXRob2QgdXNlcyBfd2NzaWNtcCB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUKKyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXAKKyAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgLy8gT24gTWFjT1MgWCwgaXQgdXNlcyB0b3dsb3dlciwgd2hpY2ggYWxzbyB1c2VzIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZQorICAvLyBjdXJyZW50IGxvY2FsZS4KK2Jvb2wgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkgcmV0dXJuIHJocyA9PSBOVUxMOworCisgIGlmIChyaHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXR1cm4gX3djc2ljbXAobGhzLCByaHMpID09IDA7CisjZWxpZiBHVEVTVF9PU19MSU5VWCAmJiAhR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorICByZXR1cm4gd2NzY2FzZWNtcChsaHMsIHJocykgPT0gMDsKKyNlbHNlCisgIC8vIEFuZHJvaWQsIE1hYyBPUyBYIGFuZCBDeWd3aW4gZG9uJ3QgZGVmaW5lIHdjc2Nhc2VjbXAuCisgIC8vIE90aGVyIHVua25vd24gT1NlcyBtYXkgbm90IGRlZmluZSBpdCBlaXRoZXIuCisgIHdpbnRfdCBsZWZ0LCByaWdodDsKKyAgZG8geworICAgIGxlZnQgPSB0b3dsb3dlcigqbGhzKyspOworICAgIHJpZ2h0ID0gdG93bG93ZXIoKnJocysrKTsKKyAgfSB3aGlsZSAobGVmdCAmJiBsZWZ0ID09IHJpZ2h0KTsKKyAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7CisjZW5kaWYgIC8vIE9TIHNlbGVjdG9yCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgc3RyIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBpZ25vcmluZyBjYXNlLgorLy8gQW55IHN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGFuIGVtcHR5IHN1ZmZpeC4KK2Jvb2wgU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KSB7CisgIGNvbnN0IHNpemVfdCBzdHJfbGVuID0gc3RyLmxlbmd0aCgpOworICBjb25zdCBzaXplX3Qgc3VmZml4X2xlbiA9IHN1ZmZpeC5sZW5ndGgoKTsKKyAgcmV0dXJuIChzdHJfbGVuID49IHN1ZmZpeF9sZW4pICYmCisgICAgICAgICBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHN0ci5jX3N0cigpICsgc3RyX2xlbiAtIHN1ZmZpeF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeC5jX3N0cigpKTsKK30KKworLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiUwMmQiLgorc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIoaW50IHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikgPDwgdmFsdWU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiVYIi4KK3N0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0SGV4SW50KGludCB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgc3RkOjpoZXggPDwgc3RkOjp1cHBlcmNhc2UgPDwgdmFsdWU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gRm9ybWF0cyBhIGJ5dGUgYXMgIiUwMlgiLgorc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRCeXRlKHVuc2lnbmVkIGNoYXIgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnVwcGVyY2FzZQorICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHZhbHVlKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLyBDb252ZXJ0cyB0aGUgYnVmZmVyIGluIGEgc3RyaW5nc3RyZWFtIHRvIGFuIHN0ZDo6c3RyaW5nLCBjb252ZXJ0aW5nIE5VTAorLy8gYnl0ZXMgdG8gIlxcMCIgYWxvbmcgdGhlIHdheS4KK3N0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHNzKSB7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciA9IHNzLT5zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RhcnQgPSBzdHIuY19zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3RhcnQgKyBzdHIubGVuZ3RoKCk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZSgyICogKGVuZCAtIHN0YXJ0KSk7CisgIGZvciAoY29uc3QgY2hhciogY2ggPSBzdGFydDsgY2ggIT0gZW5kOyArK2NoKSB7CisgICAgaWYgKCpjaCA9PSAnXDAnKSB7CisgICAgICByZXN1bHQgKz0gIlxcMCI7ICAvLyBSZXBsYWNlcyBOVUwgd2l0aCAiXFwwIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICpjaDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorc3RkOjpzdHJpbmcgQXBwZW5kVXNlck1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGd0ZXN0X21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKSB7CisgIC8vIEFwcGVuZHMgdGhlIHVzZXIgbWVzc2FnZSBpZiBpdCdzIG5vbi1lbXB0eS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgdXNlcl9tc2dfc3RyaW5nID0gdXNlcl9tc2cuR2V0U3RyaW5nKCk7CisgIGlmICh1c2VyX21zZ19zdHJpbmcuZW1wdHkoKSkgeworICAgIHJldHVybiBndGVzdF9tc2c7CisgIH0KKworICByZXR1cm4gZ3Rlc3RfbXNnICsgIlxuIiArIHVzZXJfbXNnX3N0cmluZzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RSZXN1bHQKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgorVGVzdFJlc3VsdDo6VGVzdFJlc3VsdCgpCisgICAgOiBkZWF0aF90ZXN0X2NvdW50XygwKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEJ3Rvci4KK1Rlc3RSZXN1bHQ6On5UZXN0UmVzdWx0KCkgeworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbgorLy8gcmFuZ2UgZnJvbSAwIHRvIHRvdGFsX3BhcnRfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsCisvLyBhYm9ydHMgdGhlIHByb2dyYW0uCitjb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0IHsKKyAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxfcGFydF9jb3VudCgpKQorICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXy5hdChpKTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKKy8vIHByb2dyYW0uCitjb25zdCBUZXN0UHJvcGVydHkmIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3QgeworICBpZiAoaSA8IDAgfHwgaSA+PSB0ZXN0X3Byb3BlcnR5X2NvdW50KCkpCisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXy5hdChpKTsKK30KKworLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KK3ZvaWQgVGVzdFJlc3VsdDo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoKSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOworfQorCisvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KK3ZvaWQgVGVzdFJlc3VsdDo6QWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgdGVzdF9wYXJ0X3Jlc3VsdHNfLnB1c2hfYmFjayh0ZXN0X3BhcnRfcmVzdWx0KTsKK30KKworLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIElmIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXkgYXMgdGhlCisvLyBzdXBwbGllZCBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlcHJlc2VudGVkLCB0aGUgdmFsdWUgb2YgdGhpcyB0ZXN0X3Byb3BlcnR5CisvLyByZXBsYWNlcyB0aGUgb2xkIHZhbHVlIGZvciB0aGF0IGtleS4KK3ZvaWQgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKKyAgaWYgKCFWYWxpZGF0ZVRlc3RQcm9wZXJ0eSh4bWxfZWxlbWVudCwgdGVzdF9wcm9wZXJ0eSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZ0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6aXRlcmF0b3IgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPQorICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfcHJvcGVydGllc18uYmVnaW4oKSwgdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdFByb3BlcnR5S2V5SXModGVzdF9wcm9wZXJ0eS5rZXkoKSkpOworICBpZiAocHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPT0gdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSkgeworICAgIHRlc3RfcHJvcGVydGllc18ucHVzaF9iYWNrKHRlc3RfcHJvcGVydHkpOworICAgIHJldHVybjsKKyAgfQorICBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleS0+U2V0VmFsdWUodGVzdF9wcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gVGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgYXR0cmlidXRlcyB1c2VkIGluIHRoZSA8dGVzdHN1aXRlcz4gZWxlbWVudCBvZiBYTUwKKy8vIG91dHB1dC4KK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0U3VpdGVzQXR0cmlidXRlc1tdID0geworICAiZGlzYWJsZWQiLAorICAiZXJyb3JzIiwKKyAgImZhaWx1cmVzIiwKKyAgIm5hbWUiLAorICAicmFuZG9tX3NlZWQiLAorICAidGVzdHMiLAorICAidGltZSIsCisgICJ0aW1lc3RhbXAiCit9OworCisvLyBUaGUgbGlzdCBvZiByZXNlcnZlZCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIDx0ZXN0c3VpdGU+IGVsZW1lbnQgb2YgWE1MCisvLyBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1Jlc2VydmVkVGVzdFN1aXRlQXR0cmlidXRlc1tdID0geworICAiZGlzYWJsZWQiLAorICAiZXJyb3JzIiwKKyAgImZhaWx1cmVzIiwKKyAgIm5hbWUiLAorICAidGVzdHMiLAorICAidGltZSIKK307CisKKy8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RjYXNlPiBlbGVtZW50IG9mIFhNTCBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1Jlc2VydmVkVGVzdENhc2VBdHRyaWJ1dGVzW10gPSB7CisgICJjbGFzc25hbWUiLAorICAibmFtZSIsCisgICJzdGF0dXMiLAorICAidGltZSIsCisgICJ0eXBlX3BhcmFtIiwKKyAgInZhbHVlX3BhcmFtIgorfTsKKwordGVtcGxhdGUgPGludCBrU2l6ZT4KK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcnJheUFzVmVjdG9yKGNvbnN0IGNoYXIqIGNvbnN0ICgmYXJyYXkpW2tTaXplXSkgeworICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KGFycmF5LCBhcnJheSArIGtTaXplKTsKK30KKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRSZXNlcnZlZEF0dHJpYnV0ZXNGb3JFbGVtZW50KAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCkgeworICBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RzdWl0ZXMiKSB7CisgICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdFN1aXRlc0F0dHJpYnV0ZXMpOworICB9IGVsc2UgaWYgKHhtbF9lbGVtZW50ID09ICJ0ZXN0c3VpdGUiKSB7CisgICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdFN1aXRlQXR0cmlidXRlcyk7CisgIH0gZWxzZSBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RjYXNlIikgeworICAgIHJldHVybiBBcnJheUFzVmVjdG9yKGtSZXNlcnZlZFRlc3RDYXNlQXR0cmlidXRlcyk7CisgIH0gZWxzZSB7CisgICAgR1RFU1RfQ0hFQ0tfKGZhbHNlKSA8PCAiVW5yZWNvZ25pemVkIHhtbF9lbGVtZW50IHByb3ZpZGVkOiAiIDw8IHhtbF9lbGVtZW50OworICB9CisgIC8vIFRoaXMgY29kZSBpcyB1bnJlYWNoYWJsZSBidXQgc29tZSBjb21waWxlcnMgbWF5IG5vdCByZWFsaXplcyB0aGF0LgorICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KCk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRXb3JkTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHdvcmRzKSB7CisgIE1lc3NhZ2Ugd29yZF9saXN0OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKGkgPiAwICYmIHdvcmRzLnNpemUoKSA+IDIpIHsKKyAgICAgIHdvcmRfbGlzdCA8PCAiLCAiOworICAgIH0KKyAgICBpZiAoaSA9PSB3b3Jkcy5zaXplKCkgLSAxKSB7CisgICAgICB3b3JkX2xpc3QgPDwgImFuZCAiOworICAgIH0KKyAgICB3b3JkX2xpc3QgPDwgIiciIDw8IHdvcmRzW2ldIDw8ICInIjsKKyAgfQorICByZXR1cm4gd29yZF9saXN0LkdldFN0cmluZygpOworfQorCitib29sIFZhbGlkYXRlVGVzdFByb3BlcnR5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVzZXJ2ZWRfbmFtZXMpIHsKKyAgaWYgKHN0ZDo6ZmluZChyZXNlcnZlZF9uYW1lcy5iZWdpbigpLCByZXNlcnZlZF9uYW1lcy5lbmQoKSwgcHJvcGVydHlfbmFtZSkgIT0KKyAgICAgICAgICByZXNlcnZlZF9uYW1lcy5lbmQoKSkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIlJlc2VydmVkIGtleSB1c2VkIGluIFJlY29yZFByb3BlcnR5KCk6ICIgPDwgcHJvcGVydHlfbmFtZQorICAgICAgICAgICAgICAgICAgPDwgIiAoIiA8PCBGb3JtYXRXb3JkTGlzdChyZXNlcnZlZF9uYW1lcykKKyAgICAgICAgICAgICAgICAgIDw8ICIgYXJlIHJlc2VydmVkIGJ5ICIgPDwgR1RFU1RfTkFNRV8gPDwgIikiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiB0aGUgZWxlbWVudCBuYW1lZAorLy8geG1sX2VsZW1lbnQuICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHZhbGlkLgorYm9vbCBUZXN0UmVzdWx0OjpWYWxpZGF0ZVRlc3RQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgeworICByZXR1cm4gVmFsaWRhdGVUZXN0UHJvcGVydHlOYW1lKHRlc3RfcHJvcGVydHkua2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UmVzZXJ2ZWRBdHRyaWJ1dGVzRm9yRWxlbWVudCh4bWxfZWxlbWVudCkpOworfQorCisvLyBDbGVhcnMgdGhlIG9iamVjdC4KK3ZvaWQgVGVzdFJlc3VsdDo6Q2xlYXIoKSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOworICB0ZXN0X3Byb3BlcnRpZXNfLmNsZWFyKCk7CisgIGRlYXRoX3Rlc3RfY291bnRfID0gMDsKKyAgZWxhcHNlZF90aW1lXyA9IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLgorYm9vbCBUZXN0UmVzdWx0OjpGYWlsZWQoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoR2V0VGVzdFBhcnRSZXN1bHQoaSkuZmFpbGVkKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQuZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzRmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorc3RhdGljIGJvb2wgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmV0dXJuIHJlc3VsdC5ub25mYXRhbGx5X2ZhaWxlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0UmVzdWx0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKSA+IDA7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCisvLyBvZiBzdWNjZXNzZnVsIHRlc3QgcGFydHMgYW5kIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgcGFydHMuCitpbnQgVGVzdFJlc3VsdDo6dG90YWxfcGFydF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wYXJ0X3Jlc3VsdHNfLnNpemUoKSk7Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLgoraW50IFRlc3RSZXN1bHQ6OnRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcHJvcGVydGllc18uc2l6ZSgpKTsKK30KKworLy8gY2xhc3MgVGVzdAorCisvLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCisKKy8vIFRoZSBjJ3RvciBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncy4KK1Rlc3Q6OlRlc3QoKQorICAgIDogZ3Rlc3RfZmxhZ19zYXZlcl8obmV3IGludGVybmFsOjpHVGVzdEZsYWdTYXZlcikgeworfQorCisvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitUZXN0Ojp+VGVzdCgpIHsKKyAgZGVsZXRlIGd0ZXN0X2ZsYWdfc2F2ZXJfOworfQorCisvLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCisvLworLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCit2b2lkIFRlc3Q6OlNldFVwKCkgeworfQorCisvLyBUZWFycyBkb3duIHRoZSB0ZXN0IGZpeHR1cmUuCisvLworLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCit2b2lkIFRlc3Q6OlRlYXJEb3duKCkgeworfQorCisvLyBBbGxvd3MgdXNlciBzdXBwbGllZCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgcmVjb3JkZWQgZm9yIGxhdGVyIG91dHB1dC4KK3ZvaWQgVGVzdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5SZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCB2YWx1ZSkgeworICBNZXNzYWdlIHZhbHVlX21lc3NhZ2U7CisgIHZhbHVlX21lc3NhZ2UgPDwgdmFsdWU7CisgIFJlY29yZFByb3BlcnR5KGtleSwgdmFsdWVfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgZnJpZW5kIG9mIFVuaXRUZXN0IGFuZCBhcyBzdWNoIGhhcyBhY2Nlc3MgdG8KKyAgLy8gQWRkVGVzdFBhcnRSZXN1bHQuCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRUZXN0UGFydFJlc3VsdCgKKyAgICAgIHJlc3VsdF90eXBlLAorICAgICAgTlVMTCwgIC8vIE5vIGluZm8gYWJvdXQgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICAtMSwgICAgLy8gV2UgaGF2ZSBubyBpbmZvIG9uIHdoaWNoIGxpbmUgY2F1c2VkIHRoZSBleGNlcHRpb24uCisgICAgICBtZXNzYWdlLAorICAgICAgIiIpOyAgIC8vIE5vIHN0YWNrIHRyYWNlLCBlaXRoZXIuCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBHb29nbGUgVGVzdCByZXF1aXJlcyBhbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIHRvIHVzZSB0aGUgc2FtZSB0ZXN0CisvLyBmaXh0dXJlIGNsYXNzLiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlCisvLyBzYW1lIGZpeHR1cmUgY2xhc3MgYXMgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLiAgSWYKKy8vIHllcywgaXQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgaXQgZ2VuZXJhdGVzIGEgR29vZ2xlIFRlc3QgZmFpbHVyZSBhbmQKKy8vIHJldHVybnMgZmFsc2UuCitib29sIFRlc3Q6Okhhc1NhbWVGaXh0dXJlQ2xhc3MoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBpbXBsLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworCisgIC8vIEluZm8gYWJvdXQgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgZmlyc3RfdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpWzBdOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpcnN0X2ZpeHR1cmVfaWQgPSBmaXJzdF90ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCBmaXJzdF90ZXN0X25hbWUgPSBmaXJzdF90ZXN0X2luZm8tPm5hbWUoKTsKKworICAvLyBJbmZvIGFib3V0IHRoZSBjdXJyZW50IHRlc3QuCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0aGlzX3Rlc3RfaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludGVybmFsOjpUeXBlSWQgdGhpc19maXh0dXJlX2lkID0gdGhpc190ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCB0aGlzX3Rlc3RfbmFtZSA9IHRoaXNfdGVzdF9pbmZvLT5uYW1lKCk7CisKKyAgaWYgKHRoaXNfZml4dHVyZV9pZCAhPSBmaXJzdF9maXh0dXJlX2lkKSB7CisgICAgLy8gSXMgdGhlIGZpcnN0IHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgZmlyc3RfaXNfVEVTVCA9IGZpcnN0X2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKKyAgICAvLyBJcyB0aGlzIHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgdGhpc19pc19URVNUID0gdGhpc19maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7CisKKyAgICBpZiAoZmlyc3RfaXNfVEVTVCB8fCB0aGlzX2lzX1RFU1QpIHsKKyAgICAgIC8vIFRoZSB1c2VyIG1peGVkIFRFU1QgYW5kIFRFU1RfRiBpbiB0aGlzIHRlc3QgY2FzZSAtIHdlJ2xsIHRlbGwKKyAgICAgIC8vIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKworICAgICAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVEVTVCBhbmQgdGhlIG5hbWUgb2YgdGhlIFRFU1RfRi4gIE5vdGUKKyAgICAgIC8vIHRoYXQgZmlyc3RfaXNfVEVTVCBhbmQgdGhpc19pc19URVNUIGNhbm5vdCBib3RoIGJlIHRydWUsIGFzCisgICAgICAvLyB0aGUgZml4dHVyZSBJRHMgYXJlIGRpZmZlcmVudCBmb3IgdGhlIHR3byB0ZXN0cy4KKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfbmFtZSA9CisgICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IGZpcnN0X3Rlc3RfbmFtZSA6IHRoaXNfdGVzdF9uYW1lOworICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9GX25hbWUgPQorICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyB0aGlzX3Rlc3RfbmFtZSA6IGZpcnN0X3Rlc3RfbmFtZTsKKworICAgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgICAgIDw8ICJjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXNcbiIKKyAgICAgICAgICA8PCAiaWxsZWdhbC4gIEluIHRlc3QgY2FzZSAiIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpCisgICAgICAgICAgPDwgIixcbiIKKyAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfRl9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0XG4iCisgICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHlcbiIKKyAgICAgICAgICA8PCAid2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0XG4iCisgICAgICAgICAgPDwgImNhc2UuIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhlIHVzZXIgZGVmaW5lZCB0d28gZml4dHVyZSBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBpbgorICAgICAgLy8gdHdvIG5hbWVzcGFjZXMgLSB3ZSdsbCB0ZWxsIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKyAgICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKKyAgICAgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIsXG4iCisgICAgICAgICAgPDwgInlvdSBkZWZpbmVkIHRlc3QgIiA8PCBmaXJzdF90ZXN0X25hbWUKKyAgICAgICAgICA8PCAiIGFuZCB0ZXN0ICIgPDwgdGhpc190ZXN0X25hbWUgPDwgIlxuIgorICAgICAgICAgIDw8ICJ1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmXG4iCisgICAgICAgICAgPDwgInRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvblxuIgorICAgICAgICAgIDw8ICJ1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lXG4iCisgICAgICAgICAgPDwgIm9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4iOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEdURVNUX0hBU19TRUgKKworLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LiAgVGhpcworLy8gZnVuY3Rpb24gcmV0dXJucyBpdHMgcmVzdWx0IHZpYSBhbiBvdXRwdXQgcGFyYW1ldGVyIHBvaW50ZXIgYmVjYXVzZSBWQysrCisvLyBwcm9oaWJpdHMgY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucworLy8gdXNpbmcgX190cnkgKHNlZSBlcnJvciBDMjcxMikuCitzdGF0aWMgc3RkOjpzdHJpbmcqIEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoRFdPUkQgZXhjZXB0aW9uX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyAgTWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlIDw8ICJTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweCIgPDwgc3RkOjpzZXRiYXNlKDE2KSA8PAorICAgIGV4Y2VwdGlvbl9jb2RlIDw8IHN0ZDo6c2V0YmFzZSgxMCkgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7CisKKyAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhtZXNzYWdlLkdldFN0cmluZygpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7CisgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgaWYgKGRlc2NyaXB0aW9uICE9IE5VTEwpIHsKKyAgICBtZXNzYWdlIDw8ICJDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gXCIiIDw8IGRlc2NyaXB0aW9uIDw8ICJcIiI7CisgIH0gZWxzZSB7CisgICAgbWVzc2FnZSA8PCAiVW5rbm93biBDKysgZXhjZXB0aW9uIjsKKyAgfQorICBtZXNzYWdlIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOworCisgIHJldHVybiBtZXNzYWdlLkdldFN0cmluZygpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKKworR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb246Okdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBmYWlsdXJlKQorICAgIDogOjpzdGQ6OnJ1bnRpbWVfZXJyb3IoUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKGZhaWx1cmUpLmNfc3RyKCkpIHt9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gV2UgcHV0IHRoZXNlIGhlbHBlciBmdW5jdGlvbnMgaW4gdGhlIGludGVybmFsIG5hbWVzcGFjZSBhcyBJQk0ncyB4bEMKKy8vIGNvbXBpbGVyIHJlamVjdHMgdGhlIGNvZGUgaWYgdGhleSB3ZXJlIGRlY2xhcmVkIHN0YXRpYy4KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBoYW5kbGVzIFNFSCBleGNlcHRpb25zIGl0IHRocm93cywgd2hlbgorLy8gU0VIIGlzIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZSBSZXN1bHQgaW4gY2FzZSBvZiBhbgorLy8gU0VIIGV4Y2VwdGlvbi4gIChNaWNyb3NvZnQgY29tcGlsZXJzIGNhbm5vdCBoYW5kbGUgU0VIIGFuZCBDKysKKy8vIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUaGVyZWZvcmUsIHdlIHByb3ZpZGUgYSBzZXBhcmF0ZQorLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgU0VIIGV4Y2VwdGlvbnMuKQordGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KK1Jlc3VsdCBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyNpZiBHVEVTVF9IQVNfU0VICisgIF9fdHJ5IHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfSBfX2V4Y2VwdCAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKCAgLy8gTk9MSU5UCisgICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7CisgICAgLy8gV2UgY3JlYXRlIHRoZSBleGNlcHRpb24gbWVzc2FnZSBvbiB0aGUgaGVhcCBiZWNhdXNlIFZDKysgcHJvaGliaXRzCisgICAgLy8gY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucyB1c2luZyBfX3RyeQorICAgIC8vIChzZWUgZXJyb3IgQzI3MTIpLgorICAgIHN0ZDo6c3RyaW5nKiBleGNlcHRpb25fbWVzc2FnZSA9IEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoCisgICAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSwgbG9jYXRpb24pOworICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uX21lc3NhZ2UpOworICAgIGRlbGV0ZSBleGNlcHRpb25fbWVzc2FnZTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PigwKTsKKyAgfQorI2Vsc2UKKyAgKHZvaWQpbG9jYXRpb247CisgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICit9CisKKy8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgY2F0Y2hlcyBhbmQgcmVwb3J0cyBDKysgYW5kL29yIFNFSC1zdHlsZQorLy8gZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgc3VwcG9ydGVkOyByZXR1cm5zIHRoZSAwLXZhbHVlIGZvciB0eXBlCisvLyBSZXN1bHQgaW4gY2FzZSBvZiBhbiBTRUggZXhjZXB0aW9uLgordGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KK1Jlc3VsdCBIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyAgLy8gTk9URTogVGhlIHVzZXIgY29kZSBjYW4gYWZmZWN0IHRoZSB3YXkgaW4gd2hpY2ggR29vZ2xlIFRlc3QgaGFuZGxlcworICAvLyBleGNlcHRpb25zIGJ5IHNldHRpbmcgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSwgYnV0IG9ubHkgYmVmb3JlCisgIC8vIFJVTl9BTExfVEVTVFMoKSBzdGFydHMuIEl0IGlzIHRlY2huaWNhbGx5IHBvc3NpYmxlIHRvIGNoZWNrIHRoZSBmbGFnCisgIC8vIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGFuZCBlaXRoZXIgcmVwb3J0IG9yIHJlLXRocm93IHRoZQorICAvLyBleGNlcHRpb24gYmFzZWQgb24gdGhlIGZsYWcncyB2YWx1ZToKKyAgLy8KKyAgLy8gdHJ5IHsKKyAgLy8gICAvLyBQZXJmb3JtIHRoZSB0ZXN0IG1ldGhvZC4KKyAgLy8gfSBjYXRjaCAoLi4uKSB7CisgIC8vICAgaWYgKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCisgIC8vICAgICAvLyBSZXBvcnQgdGhlIGV4Y2VwdGlvbiBhcyBmYWlsdXJlLgorICAvLyAgIGVsc2UKKyAgLy8gICAgIHRocm93OyAgLy8gUmUtdGhyb3dzIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uCisgIC8vIH0KKyAgLy8KKyAgLy8gSG93ZXZlciwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmbGFnIGlzIHRvIGFsbG93IHRoZSBwcm9ncmFtIHRvIGRyb3AgaW50bworICAvLyB0aGUgZGVidWdnZXIgd2hlbiB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gT24gbW9zdCBwbGF0Zm9ybXMsIG9uY2UgdGhlCisgIC8vIGNvbnRyb2wgZW50ZXJzIHRoZSBjYXRjaCBibG9jaywgdGhlIGV4Y2VwdGlvbiBvcmlnaW4gaW5mb3JtYXRpb24gaXMKKyAgLy8gbG9zdCBhbmQgdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCB0aGUgcHJvZ3JhbSBhdCB0aGUgcG9pbnQgb2YgdGhlCisgIC8vIHJlLXRocm93IGluIHRoaXMgZnVuY3Rpb24gLS0gaW5zdGVhZCBvZiBhdCB0aGUgcG9pbnQgb2YgdGhlIG9yaWdpbmFsCisgIC8vIHRocm93IHN0YXRlbWVudCBpbiB0aGUgY29kZSB1bmRlciB0ZXN0LiAgRm9yIHRoaXMgcmVhc29uLCB3ZSBwZXJmb3JtCisgIC8vIHRoZSBjaGVjayBlYXJseSwgc2FjcmlmaWNpbmcgdGhlIGFiaWxpdHkgdG8gYWZmZWN0IEdvb2dsZSBUZXN0J3MKKyAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGluIHRoZSBtZXRob2Qgd2hlcmUgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgIGlmIChpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmNhdGNoX2V4Y2VwdGlvbnMoKSkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZChvYmplY3QsIG1ldGhvZCwgbG9jYXRpb24pOworICAgIH0gY2F0Y2ggKGNvbnN0IGludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiYpIHsgIC8vIE5PTElOVAorICAgICAgLy8gVGhpcyBleGNlcHRpb24gdHlwZSBjYW4gb25seSBiZSB0aHJvd24gYnkgYSBmYWlsZWQgR29vZ2xlCisgICAgICAvLyBUZXN0IGFzc2VydGlvbiB3aXRoIHRoZSBpbnRlbnRpb24gb2YgbGV0dGluZyBhbm90aGVyIHRlc3RpbmcKKyAgICAgIC8vIGZyYW1ld29yayBjYXRjaCBpdC4gIFRoZXJlZm9yZSB3ZSBqdXN0IHJlLXRocm93IGl0LgorICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsgIC8vIE5PTElOVAorICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKKyAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKGUud2hhdCgpLCBsb2NhdGlvbikpOworICAgIH0gY2F0Y2ggKC4uLikgeyAgLy8gTk9MSU5UCisgICAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAorICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoTlVMTCwgbG9jYXRpb24pKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oMCk7CisjZWxzZQorICAgIHJldHVybiBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZChvYmplY3QsIG1ldGhvZCwgbG9jYXRpb24pOworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworICB9IGVsc2UgeworICAgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBSdW5zIHRoZSB0ZXN0IGFuZCB1cGRhdGVzIHRoZSB0ZXN0IHJlc3VsdC4KK3ZvaWQgVGVzdDo6UnVuKCkgeworICBpZiAoIUhhc1NhbWVGaXh0dXJlQ2xhc3MoKSkgcmV0dXJuOworCisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCh0aGlzLCAmVGVzdDo6U2V0VXAsICJTZXRVcCgpIik7CisgIC8vIFdlIHdpbGwgcnVuIHRoZSB0ZXN0IG9ubHkgaWYgU2V0VXAoKSB3YXMgc3VjY2Vzc2Z1bC4KKyAgaWYgKCFIYXNGYXRhbEZhaWx1cmUoKSkgeworICAgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgICAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgICB0aGlzLCAmVGVzdDo6VGVzdEJvZHksICJ0aGUgdGVzdCBib2R5Iik7CisgIH0KKworICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUuICBIZW5jZSB3ZSB3aWxsCisgIC8vIGFsd2F5cyBjYWxsIFRlYXJEb3duKCksIGV2ZW4gaWYgU2V0VXAoKSBvciB0aGUgdGVzdCBib2R5IGhhcworICAvLyBmYWlsZWQuCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0OjpUZWFyRG93biwgIlRlYXJEb3duKCkiKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIGZhdGFsIGZhaWx1cmUuCitib29sIFRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5IYXNGYXRhbEZhaWx1cmUoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSB7CisgIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+CisgICAgICBIYXNOb25mYXRhbEZhaWx1cmUoKTsKK30KKworLy8gY2xhc3MgVGVzdEluZm8KKworLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gSXQgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHRlc3QgZmFjdG9yeQorLy8gb2JqZWN0LgorVGVzdEluZm86OlRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3Rlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpCisgICAgOiB0ZXN0X2Nhc2VfbmFtZV8oYV90ZXN0X2Nhc2VfbmFtZSksCisgICAgICBuYW1lXyhhX25hbWUpLAorICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIHZhbHVlX3BhcmFtXyhhX3ZhbHVlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdmFsdWVfcGFyYW0pIDogTlVMTCksCisgICAgICBmaXh0dXJlX2NsYXNzX2lkXyhmaXh0dXJlX2NsYXNzX2lkKSwKKyAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKKyAgICAgIGlzX2Rpc2FibGVkXyhmYWxzZSksCisgICAgICBtYXRjaGVzX2ZpbHRlcl8oZmFsc2UpLAorICAgICAgZmFjdG9yeV8oZmFjdG9yeSksCisgICAgICByZXN1bHRfKCkge30KKworLy8gRGVzdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LgorVGVzdEluZm86On5UZXN0SW5mbygpIHsgZGVsZXRlIGZhY3RvcnlfOyB9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKKy8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0CisvLyAgIHR5cGVfcGFyYW06ICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICB2YWx1ZV9wYXJhbTogICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAorLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICBmaXh0dXJlX2NsYXNzX2lkOiBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCisvLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisvLyAgIGZhY3Rvcnk6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdGVzdCBvYmplY3QuCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lCisvLyAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCitUZXN0SW5mbyogTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KSB7CisgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICAgbmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLCBuYW1lLCB0eXBlX3BhcmFtLCB2YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBmaXh0dXJlX2NsYXNzX2lkLCBmYWN0b3J5KTsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPkFkZFRlc3RJbmZvKHNldF91cF90YywgdGVhcl9kb3duX3RjLCB0ZXN0X2luZm8pOworICByZXR1cm4gdGVzdF9pbmZvOworfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKK3ZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBNZXNzYWdlIGVycm9yczsKKyAgZXJyb3JzCisgICAgICA8PCAiQXR0ZW1wdGVkIHJlZGVmaW5pdGlvbiBvZiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLlxuIgorICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLCB5b3UgdHJpZWRcbiIKKyAgICAgIDw8ICJ0byBkZWZpbmUgYSB0ZXN0IHVzaW5nIGEgZml4dHVyZSBjbGFzcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lXG4iCisgICAgICA8PCAidXNlZCBlYXJsaWVyLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHR3byBmaXh0dXJlIGNsYXNzZXMgYXJlXG4iCisgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiBZb3Ugc2hvdWxkXG4iCisgICAgICA8PCAicHJvYmFibHkgcmVuYW1lIG9uZSBvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50XG4iCisgICAgICA8PCAidGVzdCBjYXNlcy4iOworCisgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICBlcnJvcnMuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgeworCisvLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgdGVzdCBuYW1lIG9mIGEgVGVzdEluZm8gYWdhaW5zdCBhIGtub3duCisvLyB2YWx1ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZXN0Q2FzZSBjbGFzcyBvbmx5LiAgV2UgcHV0CisvLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKKy8vIG5hbWVzcGFjZS4KKy8vCisvLyBUZXN0TmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdE5hbWVJcyB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgLy8KKyAgLy8gVGVzdE5hbWVJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdE5hbWVJcyhjb25zdCBjaGFyKiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0X2luZm8gbWF0Y2hlcyBuYW1lXy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfaW5mbyAmJiB0ZXN0X2luZm8tPm5hbWUoKSA9PSBuYW1lXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBtZXRob2QgZXhwYW5kcyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyByZWdpc3RlcmVkIHdpdGggbWFjcm9zIFRFU1RfUAorLy8gYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIGludG8gcmVndWxhciB0ZXN0cyBhbmQgcmVnaXN0ZXJzIHRob3NlLgorLy8gVGhpcyB3aWxsIGJlIGRvbmUganVzdCBvbmNlIGR1cmluZyB0aGUgcHJvZ3JhbSBydW50aW1lLgordm9pZCBVbml0VGVzdEltcGw6OlJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgeworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIGlmICghcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXykgeworICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8uUmVnaXN0ZXJUZXN0cygpOworICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8gPSB0cnVlOworICB9CisjZW5kaWYKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCisvLyBkZWxldGVzIGl0Lgordm9pZCBUZXN0SW5mbzo6UnVuKCkgeworICBpZiAoIXNob3VsZF9ydW5fKSByZXR1cm47CisKKyAgLy8gVGVsbHMgVW5pdFRlc3Qgd2hlcmUgdG8gc3RvcmUgdGVzdCByZXN1bHQuCisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfaW5mbyh0aGlzKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkucmVwZWF0ZXIoKTsKKworICAvLyBOb3RpZmllcyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgdGVzdCBpcyBhYm91dCB0byBzdGFydC4KKyAgcmVwZWF0ZXItPk9uVGVzdFN0YXJ0KCp0aGlzKTsKKworICBjb25zdCBUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7CisKKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKworICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdC4KKyAgVGVzdCogY29uc3QgdGVzdCA9IGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIGZhY3RvcnlfLCAmaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZTo6Q3JlYXRlVGVzdCwKKyAgICAgICJ0aGUgdGVzdCBmaXh0dXJlJ3MgY29uc3RydWN0b3IiKTsKKworICAvLyBSdW5zIHRoZSB0ZXN0IG9ubHkgaWYgdGhlIHRlc3Qgb2JqZWN0IHdhcyBjcmVhdGVkIGFuZCBpdHMKKyAgLy8gY29uc3RydWN0b3IgZGlkbid0IGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZS4KKyAgaWYgKCh0ZXN0ICE9IE5VTEwpICYmICFUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgeworICAgIC8vIFRoaXMgZG9lc24ndCB0aHJvdyBhcyBhbGwgdXNlciBjb2RlIHRoYXQgY2FuIHRocm93IGFyZSB3cmFwcGVkIGludG8KKyAgICAvLyBleGNlcHRpb24gaGFuZGxpbmcgY29kZS4KKyAgICB0ZXN0LT5SdW4oKTsKKyAgfQorCisgIC8vIERlbGV0ZXMgdGhlIHRlc3Qgb2JqZWN0LgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0ZXN0LCAmVGVzdDo6RGVsZXRlU2VsZl8sICJ0aGUgdGVzdCBmaXh0dXJlJ3MgZGVzdHJ1Y3RvciIpOworCisgIHJlc3VsdF8uc2V0X2VsYXBzZWRfdGltZShpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydCk7CisKKyAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lciB0aGF0IGEgdGVzdCBoYXMganVzdCBmaW5pc2hlZC4KKyAgcmVwZWF0ZXItPk9uVGVzdEVuZCgqdGhpcyk7CisKKyAgLy8gVGVsbHMgVW5pdFRlc3QgdG8gc3RvcCBhc3NvY2lhdGluZyBhc3NlcnRpb24gcmVzdWx0cyB0byB0aGlzCisgIC8vIHRlc3QuCisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfaW5mbyhOVUxMKTsKK30KKworLy8gY2xhc3MgVGVzdENhc2UKKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCitpbnQgVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0UGFzc2VkKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK2ludCBUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdEZhaWxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCitpbnQgVGVzdENhc2U6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0UmVwb3J0YWJsZURpc2FibGVkKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgoraW50IFRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3REaXNhYmxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFRlc3RDYXNlOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFJlcG9ydGFibGUpOworfQorCisvLyBHZXQgdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBydW4uCitpbnQgVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFNob3VsZFJ1blRlc3QpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgoraW50IFRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2luZm9fbGlzdF8uc2l6ZSgpKTsKK30KKworLy8gQ3JlYXRlcyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgbmFtZTogICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgYV90eXBlX3BhcmFtOiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlJ3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCitUZXN0Q2FzZTo6VGVzdENhc2UoY29uc3QgY2hhciogYV9uYW1lLCBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykKKyAgICA6IG5hbWVfKGFfbmFtZSksCisgICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLAorICAgICAgc2V0X3VwX3RjXyhzZXRfdXBfdGMpLAorICAgICAgdGVhcl9kb3duX3RjXyh0ZWFyX2Rvd25fdGMpLAorICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAorICAgICAgZWxhcHNlZF90aW1lXygwKSB7Cit9CisKKy8vIERlc3RydWN0b3Igb2YgVGVzdENhc2UuCitUZXN0Q2FzZTo6flRlc3RDYXNlKCkgeworICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3QgaW4gdGhlIGNvbGxlY3Rpb24uCisgIEZvckVhY2godGVzdF9pbmZvX2xpc3RfLCBpbnRlcm5hbDo6RGVsZXRlPFRlc3RJbmZvPik7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KK2NvbnN0IFRlc3RJbmZvKiBUZXN0Q2FzZTo6R2V0VGVzdEluZm8oaW50IGkpIGNvbnN0IHsKKyAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKKyAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitUZXN0SW5mbyogVGVzdENhc2U6OkdldE11dGFibGVUZXN0SW5mbyhpbnQgaSkgeworICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9pbmRpY2VzXywgaSwgLTEpOworICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfaW5mb19saXN0X1tpbmRleF07Cit9CisKKy8vIEFkZHMgYSB0ZXN0IHRvIHRoaXMgdGVzdCBjYXNlLiAgV2lsbCBkZWxldGUgdGhlIHRlc3QgdXBvbgorLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIFRlc3RDYXNlIG9iamVjdC4KK3ZvaWQgVGVzdENhc2U6OkFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKSB7CisgIHRlc3RfaW5mb19saXN0Xy5wdXNoX2JhY2sodGVzdF9pbmZvKTsKKyAgdGVzdF9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2luZGljZXNfLnNpemUoKSkpOworfQorCisvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KK3ZvaWQgVGVzdENhc2U6OlJ1bigpIHsKKyAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOworCisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZSh0aGlzKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkucmVwZWF0ZXIoKTsKKworICByZXBlYXRlci0+T25UZXN0Q2FzZVN0YXJ0KCp0aGlzKTsKKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGhpcywgJlRlc3RDYXNlOjpSdW5TZXRVcFRlc3RDYXNlLCAiU2V0VXBUZXN0Q2FzZSgpIik7CisKKyAgY29uc3QgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBzdGFydCA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbF90ZXN0X2NvdW50KCk7IGkrKykgeworICAgIEdldE11dGFibGVUZXN0SW5mbyhpKS0+UnVuKCk7CisgIH0KKyAgZWxhcHNlZF90aW1lXyA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0OworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuVGVhckRvd25UZXN0Q2FzZSwgIlRlYXJEb3duVGVzdENhc2UoKSIpOworCisgIHJlcGVhdGVyLT5PblRlc3RDYXNlRW5kKCp0aGlzKTsKKyAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9jYXNlKE5VTEwpOworfQorCisvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgordm9pZCBUZXN0Q2FzZTo6Q2xlYXJSZXN1bHQoKSB7CisgIGFkX2hvY190ZXN0X3Jlc3VsdF8uQ2xlYXIoKTsKKyAgRm9yRWFjaCh0ZXN0X2luZm9fbGlzdF8sIFRlc3RJbmZvOjpDbGVhclRlc3RSZXN1bHQpOworfQorCisvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCit2b2lkIFRlc3RDYXNlOjpTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKSB7CisgIFNodWZmbGUocmFuZG9tLCAmdGVzdF9pbmRpY2VzXyk7Cit9CisKKy8vIFJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIHRvIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KK3ZvaWQgVGVzdENhc2U6OlVuc2h1ZmZsZVRlc3RzKCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfaW5kaWNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICB0ZXN0X2luZGljZXNfW2ldID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKKyAgfQorfQorCisvLyBGb3JtYXRzIGEgY291bnRhYmxlIG5vdW4uICBEZXBlbmRpbmcgb24gaXRzIHF1YW50aXR5LCBlaXRoZXIgdGhlCisvLyBzaW5ndWxhciBmb3JtIG9yIHRoZSBwbHVyYWwgZm9ybSBpcyB1c2VkLiBlLmcuCisvLworLy8gRm9ybWF0Q291bnRhYmxlTm91bigxLCAiZm9ybXVsYSIsICJmb3JtdWxpIikgcmV0dXJucyAiMSBmb3JtdWxhIi4KKy8vIEZvcm1hdENvdW50YWJsZU5vdW4oNSwgImJvb2siLCAiYm9va3MiKSByZXR1cm5zICI1IGJvb2tzIi4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRDb3VudGFibGVOb3VuKGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBzaW5ndWxhcl9mb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHBsdXJhbF9mb3JtKSB7CisgIHJldHVybiBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKGNvdW50KSArICIgIiArCisgICAgICAoY291bnQgPT0gMSA/IHNpbmd1bGFyX2Zvcm0gOiBwbHVyYWxfZm9ybSk7Cit9CisKKy8vIEZvcm1hdHMgdGhlIGNvdW50IG9mIHRlc3RzLgorc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdFRlc3RDb3VudChpbnQgdGVzdF9jb3VudCkgeworICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2NvdW50LCAidGVzdCIsICJ0ZXN0cyIpOworfQorCisvLyBGb3JtYXRzIHRoZSBjb3VudCBvZiB0ZXN0IGNhc2VzLgorc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdFRlc3RDYXNlQ291bnQoaW50IHRlc3RfY2FzZV9jb3VudCkgeworICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2VfY291bnQsICJ0ZXN0IGNhc2UiLCAidGVzdCBjYXNlcyIpOworfQorCisvLyBDb252ZXJ0cyBhIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGVudW0gdG8gaHVtYW4tZnJpZW5kbHkgc3RyaW5nCisvLyByZXByZXNlbnRhdGlvbi4gIEJvdGgga05vbkZhdGFsRmFpbHVyZSBhbmQga0ZhdGFsRmFpbHVyZSBhcmUgdHJhbnNsYXRlZAorLy8gdG8gIkZhaWx1cmUiLCBhcyB0aGUgdXNlciB1c3VhbGx5IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZGlmZmVyZW5jZQorLy8gYmV0d2VlbiB0aGUgdHdvIHdoZW4gdmlld2luZyB0aGUgdGVzdCByZXN1bHQuCitzdGF0aWMgY29uc3QgY2hhciAqIFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3M6CisgICAgICByZXR1cm4gIlN1Y2Nlc3MiOworCisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZToKKyAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlOgorI2lmZGVmIF9NU0NfVkVSCisgICAgICByZXR1cm4gImVycm9yOiAiOworI2Vsc2UKKyAgICAgIHJldHVybiAiRmFpbHVyZVxuIjsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIlVua25vd24gcmVzdWx0IHR5cGUiOworICB9Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IHRvIGFuIHN0ZDo6c3RyaW5nLgorc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZygKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICByZXR1cm4gKE1lc3NhZ2UoKQorICAgICAgICAgIDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24odGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSkKKyAgICAgICAgICA8PCAiICIgPDwgVGVzdFBhcnRSZXN1bHRUeXBlVG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdC50eXBlKCkpCisgICAgICAgICAgPDwgdGVzdF9wYXJ0X3Jlc3VsdC5tZXNzYWdlKCkpLkdldFN0cmluZygpOworfQorCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdC4KK3N0YXRpYyB2b2lkIFByaW50VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlc3VsdCA9CisgICAgICBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdCk7CisgIHByaW50ZigiJXNcbiIsIHJlc3VsdC5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7CisgIC8vIElmIHRoZSB0ZXN0IHByb2dyYW0gcnVucyBpbiBWaXN1YWwgU3R1ZGlvIG9yIGEgZGVidWdnZXIsIHRoZQorICAvLyBmb2xsb3dpbmcgc3RhdGVtZW50cyBhZGQgdGhlIHRlc3QgcGFydCByZXN1bHQgbWVzc2FnZSB0byB0aGUgT3V0cHV0CisgIC8vIHdpbmRvdyBzdWNoIHRoYXQgdGhlIHVzZXIgY2FuIGRvdWJsZS1jbGljayBvbiBpdCB0byBqdW1wIHRvIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIGxvY2F0aW9uOyBvdGhlcndpc2UgdGhleSBkbyBub3RoaW5nLgorI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdlIGRvbid0IGNhbGwgT3V0cHV0RGVidWdTdHJpbmcqKCkgb24gV2luZG93cyBNb2JpbGUsIGFzIHByaW50aW5nCisgIC8vIHRvIHN0ZG91dCBpcyBkb25lIGJ5IE91dHB1dERlYnVnU3RyaW5nKCkgdGhlcmUgYWxyZWFkeSAtIHdlIGRvbid0CisgIC8vIHdhbnQgdGhlIHNhbWUgbWVzc2FnZSBwcmludGVkIHR3aWNlLgorICA6Ok91dHB1dERlYnVnU3RyaW5nQShyZXN1bHQuY19zdHIoKSk7CisgIDo6T3V0cHV0RGVidWdTdHJpbmdBKCJcbiIpOworI2VuZGlmCit9CisKKy8vIGNsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcgorCitlbnVtIEdUZXN0Q29sb3IgeworICBDT0xPUl9ERUZBVUxULAorICBDT0xPUl9SRUQsCisgIENPTE9SX0dSRUVOLAorICBDT0xPUl9ZRUxMT1cKK307CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gY29sb3IuCitXT1JEIEdldENvbG9yQXR0cmlidXRlKEdUZXN0Q29sb3IgY29sb3IpIHsKKyAgc3dpdGNoIChjb2xvcikgeworICAgIGNhc2UgQ09MT1JfUkVEOiAgICByZXR1cm4gRk9SRUdST1VORF9SRUQ7CisgICAgY2FzZSBDT0xPUl9HUkVFTjogIHJldHVybiBGT1JFR1JPVU5EX0dSRUVOOworICAgIGNhc2UgQ09MT1JfWUVMTE9XOiByZXR1cm4gRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOOworICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisjZWxzZQorCisvLyBSZXR1cm5zIHRoZSBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBjb2xvci4gIENPTE9SX0RFRkFVTFQgaXMKKy8vIGFuIGludmFsaWQgaW5wdXQuCitjb25zdCBjaGFyKiBHZXRBbnNpQ29sb3JDb2RlKEdUZXN0Q29sb3IgY29sb3IpIHsKKyAgc3dpdGNoIChjb2xvcikgeworICAgIGNhc2UgQ09MT1JfUkVEOiAgICAgcmV0dXJuICIxIjsKKyAgICBjYXNlIENPTE9SX0dSRUVOOiAgIHJldHVybiAiMiI7CisgICAgY2FzZSBDT0xPUl9ZRUxMT1c6ICByZXR1cm4gIjMiOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgIH07Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorYm9vbCBTaG91bGRVc2VDb2xvcihib29sIHN0ZG91dF9pc190dHkpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3RfY29sb3IgPSBHVEVTVF9GTEFHKGNvbG9yKS5jX3N0cigpOworCisgIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJhdXRvIikpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgLy8gT24gV2luZG93cyB0aGUgVEVSTSB2YXJpYWJsZSBpcyB1c3VhbGx5IG5vdCBzZXQsIGJ1dCB0aGUKKyAgICAvLyBjb25zb2xlIHRoZXJlIGRvZXMgc3VwcG9ydCBjb2xvcnMuCisgICAgcmV0dXJuIHN0ZG91dF9pc190dHk7CisjZWxzZQorICAgIC8vIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcywgd2UgcmVseSBvbiB0aGUgVEVSTSB2YXJpYWJsZS4KKyAgICBjb25zdCBjaGFyKiBjb25zdCB0ZXJtID0gcG9zaXg6OkdldEVudigiVEVSTSIpOworICAgIGNvbnN0IGJvb2wgdGVybV9zdXBwb3J0c19jb2xvciA9CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0iKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLWNvbG9yIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS0yNTZjb2xvciIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAic2NyZWVuIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4tMjU2Y29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImxpbnV4IikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJjeWd3aW4iKTsKKyAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eSAmJiB0ZXJtX3N1cHBvcnRzX2NvbG9yOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIH0KKworICByZXR1cm4gU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAieWVzIikgfHwKKyAgICAgIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInRydWUiKSB8fAorICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidCIpIHx8CisgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICIxIik7CisgIC8vIFdlIHRha2UgInllcyIsICJ0cnVlIiwgInQiLCBhbmQgIjEiIGFzIG1lYW5pbmcgInllcyIuICBJZiB0aGUKKyAgLy8gdmFsdWUgaXMgbmVpdGhlciBvbmUgb2YgdGhlc2Ugbm9yICJhdXRvIiwgd2UgdHJlYXQgaXQgYXMgIm5vIiB0bworICAvLyBiZSBjb25zZXJ2YXRpdmUuCit9CisKKy8vIEhlbHBlcnMgZm9yIHByaW50aW5nIGNvbG9yZWQgc3RyaW5ncyB0byBzdGRvdXQuIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCB3ZQorLy8gY2Fubm90IHNpbXBseSBlbWl0IHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgaGF2ZSB0aGUgdGVybWluYWwgY2hhbmdlIGNvbG9ycy4KKy8vIFRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5IGVtaXQgdGhlIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gcmV0dXJuIGEgc3RyaW5nCisvLyB0aGF0IHdvdWxkIGJlIGNvbG9yZWQgd2hlbiBwcmludGVkLCBhcyBjYW4gYmUgZG9uZSBvbiBMaW51eC4KK3ZvaWQgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUyB8fCBHVEVTVF9PU19JT1MKKyAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBmYWxzZTsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCBib29sIGluX2NvbG9yX21vZGUgPQorICAgICAgU2hvdWxkVXNlQ29sb3IocG9zaXg6OklzQVRUWShwb3NpeDo6RmlsZU5vKHN0ZG91dCkpICE9IDApOworICBjb25zdCBib29sIHVzZV9jb2xvciA9IGluX2NvbG9yX21vZGUgJiYgKGNvbG9yICE9IENPTE9SX0RFRkFVTFQpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUworICAvLyBUaGUgJyE9IDAnIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgTVNWQyA3LjEuCisKKyAgaWYgKCF1c2VfY29sb3IpIHsKKyAgICB2cHJpbnRmKGZtdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybjsKKyAgfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgY29uc3QgSEFORExFIHN0ZG91dF9oYW5kbGUgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworCisgIC8vIEdldHMgdGhlIGN1cnJlbnQgdGV4dCBjb2xvci4KKyAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gYnVmZmVyX2luZm87CisgIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKHN0ZG91dF9oYW5kbGUsICZidWZmZXJfaW5mbyk7CisgIGNvbnN0IFdPUkQgb2xkX2NvbG9yX2F0dHJzID0gYnVmZmVyX2luZm8ud0F0dHJpYnV0ZXM7CisKKyAgLy8gV2UgbmVlZCB0byBmbHVzaCB0aGUgc3RyZWFtIGJ1ZmZlcnMgaW50byB0aGUgY29uc29sZSBiZWZvcmUgZWFjaAorICAvLyBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSBjYWxsIGxlc3QgaXQgYWZmZWN0IHRoZSB0ZXh0IHRoYXQgaXMgYWxyZWFkeQorICAvLyBwcmludGVkIGJ1dCBoYXMgbm90IHlldCByZWFjaGVkIHRoZSBjb25zb2xlLgorICBmZmx1c2goc3Rkb3V0KTsKKyAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29sb3JBdHRyaWJ1dGUoY29sb3IpIHwgRk9SRUdST1VORF9JTlRFTlNJVFkpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisKKyAgZmZsdXNoKHN0ZG91dCk7CisgIC8vIFJlc3RvcmVzIHRoZSB0ZXh0IGNvbG9yLgorICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLCBvbGRfY29sb3JfYXR0cnMpOworI2Vsc2UKKyAgcHJpbnRmKCJcMDMzWzA7MyVzbSIsIEdldEFuc2lDb2xvckNvZGUoY29sb3IpKTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICBwcmludGYoIlwwMzNbbSIpOyAgLy8gUmVzZXRzIHRoZSB0ZXJtaW5hbCB0byBkZWZhdWx0LgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICB2YV9lbmQoYXJncyk7Cit9CisKKy8vIFRleHQgcHJpbnRlZCBpbiBHb29nbGUgVGVzdCdzIHRleHQgb3V0cHV0IGFuZCAtLWd1bml0X2xpc3RfdGVzdHMKKy8vIG91dHB1dCB0byBsYWJlbCB0aGUgdHlwZSBwYXJhbWV0ZXIgYW5kIHZhbHVlIHBhcmFtZXRlciBmb3IgYSB0ZXN0Lgorc3RhdGljIGNvbnN0IGNoYXIga1R5cGVQYXJhbUxhYmVsW10gPSAiVHlwZVBhcmFtIjsKK3N0YXRpYyBjb25zdCBjaGFyIGtWYWx1ZVBhcmFtTGFiZWxbXSA9ICJHZXRQYXJhbSgpIjsKKwordm9pZCBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfcGFyYW0gPSB0ZXN0X2luZm8udHlwZV9wYXJhbSgpOworICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9wYXJhbSA9IHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpOworCisgIGlmICh0eXBlX3BhcmFtICE9IE5VTEwgfHwgdmFsdWVfcGFyYW0gIT0gTlVMTCkgeworICAgIHByaW50ZigiLCB3aGVyZSAiKTsKKyAgICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICBwcmludGYoIiVzID0gJXMiLCBrVHlwZVBhcmFtTGFiZWwsIHR5cGVfcGFyYW0pOworICAgICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpCisgICAgICAgIHByaW50ZigiIGFuZCAiKTsKKyAgICB9CisgICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKKyAgICAgIHByaW50ZigiJXMgPSAlcyIsIGtWYWx1ZVBhcmFtTGFiZWwsIHZhbHVlX3BhcmFtKTsKKyAgICB9CisgIH0KK30KKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBpbnRlcmZhY2UuCisvLworLy8gQ2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyIGlzIGNvcHlhYmxlLgorY2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcigpIHt9CisgIHN0YXRpYyB2b2lkIFByaW50VGVzdE5hbWUoY29uc3QgY2hhciAqIHRlc3RfY2FzZSwgY29uc3QgY2hhciAqIHRlc3QpIHsKKyAgICBwcmludGYoIiVzLiVzIiwgdGVzdF9jYXNlLCB0ZXN0KTsKKyAgfQorCisgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvdmVycmlkZSB3aGF0J3MgaW4gdGhlIFRlc3RFdmVudExpc3RlbmVyIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgUHJpbnRGYWlsZWRUZXN0cyhjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKK307CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25TdGFydCgKKyAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKSB7CisgIGlmIChHVEVTVF9GTEFHKHJlcGVhdCkgIT0gMSkKKyAgICBwcmludGYoIlxuUmVwZWF0aW5nIGFsbCB0ZXN0cyAoaXRlcmF0aW9uICVkKSAuIC4gLlxuXG4iLCBpdGVyYXRpb24gKyAxKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBmaWx0ZXIgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKKworICAvLyBQcmludHMgdGhlIGZpbHRlciBpZiBpdCdzIG5vdCAqLiAgVGhpcyByZW1pbmRzIHRoZSB1c2VyIHRoYXQgc29tZQorICAvLyB0ZXN0cyBtYXkgYmUgc2tpcHBlZC4KKyAgaWYgKCFTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZmlsdGVyLCBrVW5pdmVyc2FsRmlsdGVyKSkgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAorICAgICAgICAgICAgICAgICAgIk5vdGU6ICVzIGZpbHRlciA9ICVzXG4iLCBHVEVTVF9OQU1FXywgZmlsdGVyKTsKKyAgfQorCisgIGlmIChpbnRlcm5hbDo6U2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LCBmYWxzZSkpIHsKKyAgICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAorICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoaXMgaXMgdGVzdCBzaGFyZCAlZCBvZiAlcy5cbiIsCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNoYXJkX2luZGV4KSArIDEsCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OkdldEVudihrVGVzdFRvdGFsU2hhcmRzKSk7CisgIH0KKworICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAorICAgICAgICAgICAgICAgICAgIk5vdGU6IFJhbmRvbWl6aW5nIHRlc3RzJyBvcmRlcnMgd2l0aCBhIHNlZWQgb2YgJWQgLlxuIiwKKyAgICAgICAgICAgICAgICAgIHVuaXRfdGVzdC5yYW5kb21fc2VlZCgpKTsKKyAgfQorCisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOworICBwcmludGYoIlJ1bm5pbmcgJXMgZnJvbSAlcy5cbiIsCisgICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCisgICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCgKKyAgICBjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlstLS0tLS0tLS0tXSAiKTsKKyAgcHJpbnRmKCJHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBjb3VudHMgPQorICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlstLS0tLS0tLS0tXSAiKTsKKyAgcHJpbnRmKCIlcyBmcm9tICVzIiwgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCkpOworICBpZiAodGVzdF9jYXNlLnR5cGVfcGFyYW0oKSA9PSBOVUxMKSB7CisgICAgcHJpbnRmKCJcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZigiLCB3aGVyZSAlcyA9ICVzXG4iLCBrVHlwZVBhcmFtTGFiZWwsIHRlc3RfY2FzZS50eXBlX3BhcmFtKCkpOworICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgUlVOICAgICAgXSAiKTsKKyAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIHByaW50ZigiXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIENhbGxlZCBhZnRlciBhbiBhc3NlcnRpb24gZmFpbHVyZS4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCisgIGlmIChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKKyAgICByZXR1cm47CisKKyAgLy8gUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGZyb20gdGhlIGFzc2VydGlvbiAoZS5nLiBleHBlY3RlZCB0aGlzIGFuZCBnb3QgdGhhdCkuCisgIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbICAgICAgIE9LIF0gIik7CisgIH0gZWxzZSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7CisgIH0KKyAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIGlmICh0ZXN0X2luZm8ucmVzdWx0KCktPkZhaWxlZCgpKQorICAgIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7CisKKyAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKKyAgICBwcmludGYoIiAoJXMgbXMpXG4iLCBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKAorICAgICAgICAgICB0ZXN0X2luZm8ucmVzdWx0KCktPmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgaWYgKCFHVEVTVF9GTEFHKHByaW50X3RpbWUpKSByZXR1cm47CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyAoJXMgbXMgdG90YWwpXG5cbiIsCisgICAgICAgICBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlLm5hbWUoKSwKKyAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIEludGVybmFsIGhlbHBlciBmb3IgcHJpbnRpbmcgdGhlIGxpc3Qgb2YgZmFpbGVkIHRlc3RzLgordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKGZhaWxlZF90ZXN0X2NvdW50ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisgICAgaWYgKCF0ZXN0X2Nhc2Uuc2hvdWxkX3J1bigpIHx8ICh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSA9PSAwKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytqKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvID0gKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhqKTsKKyAgICAgIGlmICghdGVzdF9pbmZvLnNob3VsZF9ydW4oKSB8fCB0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7CisgICAgICBwcmludGYoIiVzLiVzIiwgdGVzdF9jYXNlLm5hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOworICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsCisgICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCisgICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOworICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgeworICAgIHByaW50ZigiICglcyBtcyB0b3RhbCkiLAorICAgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0KKyAgcHJpbnRmKCJcbiIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgIFBBU1NFRCAgXSAiKTsKKyAgcHJpbnRmKCIlcy5cbiIsIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3Quc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpLmNfc3RyKCkpOworCisgIGludCBudW1fZmFpbHVyZXMgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKCF1bml0X3Rlc3QuUGFzc2VkKCkpIHsKKyAgICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgICJbICBGQUlMRUQgIF0gIik7CisgICAgcHJpbnRmKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsKKyAgICBQcmludEZhaWxlZFRlc3RzKHVuaXRfdGVzdCk7CisgICAgcHJpbnRmKCJcbiUyZCBGQUlMRUQgJXNcbiIsIG51bV9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CisgIH0KKworICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOworICBpZiAobnVtX2Rpc2FibGVkICYmICFHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSkgeworICAgIGlmICghbnVtX2ZhaWx1cmVzKSB7CisgICAgICBwcmludGYoIlxuIik7ICAvLyBBZGQgYSBzcGFjZXIgaWYgbm8gRkFJTFVSRSBiYW5uZXIgaXMgZGlzcGxheWVkLgorICAgIH0KKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICIgIFlPVSBIQVZFICVkIERJU0FCTEVEICVzXG5cbiIsCisgICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQsCisgICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpOworICB9CisgIC8vIEVuc3VyZSB0aGF0IEdvb2dsZSBUZXN0IG91dHB1dCBpcyBwcmludGVkIGJlZm9yZSwgZS5nLiwgaGVhcGNoZWNrZXIgb3V0cHV0LgorICBmZmx1c2goc3Rkb3V0KTsKK30KKworLy8gRW5kIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcgorCisvLyBjbGFzcyBUZXN0RXZlbnRSZXBlYXRlcgorLy8KKy8vIFRoaXMgY2xhc3MgZm9yd2FyZHMgZXZlbnRzIHRvIG90aGVyIGV2ZW50IGxpc3RlbmVycy4KK2NsYXNzIFRlc3RFdmVudFJlcGVhdGVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIFRlc3RFdmVudFJlcGVhdGVyKCkgOiBmb3J3YXJkaW5nX2VuYWJsZWRfKHRydWUpIHt9CisgIHZpcnR1YWwgflRlc3RFdmVudFJlcGVhdGVyKCk7CisgIHZvaWQgQXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcik7CisgIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gbGlzdGVuZXJzXy4gU2V0IHRvIGZhbHNlCisgIC8vIGluIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzc2VzLgorICBib29sIGZvcndhcmRpbmdfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRpbmdfZW5hYmxlZF87IH0KKyAgdm9pZCBzZXRfZm9yd2FyZGluZ19lbmFibGVkKGJvb2wgZW5hYmxlKSB7IGZvcndhcmRpbmdfZW5hYmxlZF8gPSBlbmFibGU7IH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworCisgcHJpdmF0ZToKKyAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gbGlzdGVuZXJzXy4gU2V0IHRvIGZhbHNlCisgIC8vIGluIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzc2VzLgorICBib29sIGZvcndhcmRpbmdfZW5hYmxlZF87CisgIC8vIFRoZSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IHJlY2VpdmUgZXZlbnRzLgorICBzdGQ6OnZlY3RvcjxUZXN0RXZlbnRMaXN0ZW5lcio+IGxpc3RlbmVyc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0RXZlbnRSZXBlYXRlcik7Cit9OworCitUZXN0RXZlbnRSZXBlYXRlcjo6flRlc3RFdmVudFJlcGVhdGVyKCkgeworICBGb3JFYWNoKGxpc3RlbmVyc18sIERlbGV0ZTxUZXN0RXZlbnRMaXN0ZW5lcj4pOworfQorCit2b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgIGxpc3RlbmVyc18ucHVzaF9iYWNrKGxpc3RlbmVyKTsKK30KKworLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogRmFjdG9yIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSBpbnRvIFZlY3Rvcjo6RmluZC4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRSZXBlYXRlcjo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgKytpKSB7CisgICAgaWYgKGxpc3RlbmVyc19baV0gPT0gbGlzdGVuZXIpIHsKKyAgICAgIGxpc3RlbmVyc18uZXJhc2UobGlzdGVuZXJzXy5iZWdpbigpICsgaSk7CisgICAgICByZXR1cm4gbGlzdGVuZXI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFNpbmNlIG1vc3QgbWV0aG9kcyBhcmUgdmVyeSBzaW1pbGFyLCB1c2UgbWFjcm9zIHRvIHJlZHVjZSBib2lsZXJwbGF0ZS4KKy8vIFRoaXMgZGVmaW5lcyBhIG1lbWJlciB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvIGFsbCBsaXN0ZW5lcnMuCisjZGVmaW5lIEdURVNUX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAorICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgaSsrKSB7IFwKKyAgICAgIGxpc3RlbmVyc19baV0tPk5hbWUocGFyYW1ldGVyKTsgXAorICAgIH0gXAorICB9IFwKK30KKy8vIFRoaXMgZGVmaW5lcyBhIG1lbWJlciB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvIGFsbCBsaXN0ZW5lcnMgaW4gcmV2ZXJzZQorLy8gb3JkZXIuCisjZGVmaW5lIEdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcCit2b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpOYW1lKGNvbnN0IFR5cGUmIHBhcmFtZXRlcikgeyBcCisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7IFwKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihsaXN0ZW5lcnNfLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeyBcCisgICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKKyAgICB9IFwKKyAgfSBcCit9CisKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UHJvZ3JhbVN0YXJ0LCBVbml0VGVzdCkKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0LCBVbml0VGVzdCkKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0Q2FzZVN0YXJ0LCBUZXN0Q2FzZSkKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0U3RhcnQsIFRlc3RJbmZvKQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQYXJ0UmVzdWx0LCBUZXN0UGFydFJlc3VsdCkKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0LCBVbml0VGVzdCkKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1NldFVwRW5kLCBVbml0VGVzdCkKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1RlYXJEb3duRW5kLCBVbml0VGVzdCkKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RFbmQsIFRlc3RJbmZvKQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VFbmQsIFRlc3RDYXNlKQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1FbmQsIFVuaXRUZXN0KQorCisjdW5kZWYgR1RFU1RfUkVQRUFURVJfTUVUSE9EXworI3VuZGVmIEdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXworCit2b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgeworICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgeworICAgICAgbGlzdGVuZXJzX1tpXS0+T25UZXN0SXRlcmF0aW9uU3RhcnQodW5pdF90ZXN0LCBpdGVyYXRpb24pOworICAgIH0KKyAgfQorfQorCit2b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7CisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvbkVuZCh1bml0X3Rlc3QsIGl0ZXJhdGlvbik7CisgICAgfQorICB9Cit9CisKKy8vIEVuZCBUZXN0RXZlbnRSZXBlYXRlcgorCisvLyBUaGlzIGNsYXNzIGdlbmVyYXRlcyBhbiBYTUwgb3V0cHV0IGZpbGUuCitjbGFzcyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBleHBsaWNpdCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoY29uc3QgY2hhciogb3V0cHV0X2ZpbGUpOworCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7CisKKyBwcml2YXRlOgorICAvLyBJcyBjIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgdGhhdCBpcyBub3JtYWxpemVkIHRvIGEgc3BhY2UgY2hhcmFjdGVyCisgIC8vIHdoZW4gaXQgYXBwZWFycyBpbiBhbiBYTUwgYXR0cmlidXRlIHZhbHVlPworICBzdGF0aWMgYm9vbCBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoY2hhciBjKSB7CisgICAgcmV0dXJuIGMgPT0gMHg5IHx8IGMgPT0gMHhBIHx8IGMgPT0gMHhEOworICB9CisKKyAgLy8gTWF5IGMgYXBwZWFyIGluIGEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50PworICBzdGF0aWMgYm9vbCBJc1ZhbGlkWG1sQ2hhcmFjdGVyKGNoYXIgYykgeworICAgIHJldHVybiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoYykgfHwgYyA+PSAweDIwOworICB9CisKKyAgLy8gUmV0dXJucyBhbiBYTUwtZXNjYXBlZCBjb3B5IG9mIHRoZSBpbnB1dCBzdHJpbmcgc3RyLiAgSWYKKyAgLy8gaXNfYXR0cmlidXRlIGlzIHRydWUsIHRoZSB0ZXh0IGlzIG1lYW50IHRvIGFwcGVhciBhcyBhbiBhdHRyaWJ1dGUKKyAgLy8gdmFsdWUsIGFuZCBub3JtYWxpemFibGUgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgYnkgcmVwbGFjaW5nIGl0CisgIC8vIHdpdGggY2hhcmFjdGVyIHJlZmVyZW5jZXMuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWwoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBpc19hdHRyaWJ1dGUpOworCisgIC8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgYW4gYXR0cmlidXRlIHZhbHVlLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sQXR0cmlidXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gRXNjYXBlWG1sKHN0ciwgdHJ1ZSk7CisgIH0KKworICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgbm90IGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbFRleHQoY29uc3QgY2hhciogc3RyKSB7CisgICAgcmV0dXJuIEVzY2FwZVhtbChzdHIsIGZhbHNlKTsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIGF0dHJpYnV0ZSBiZWxvbmdzIHRvIHRoZSBnaXZlbiBlbGVtZW50IGFuZAorICAvLyBzdHJlYW1zIHRoZSBhdHRyaWJ1dGUgYXMgWE1MLgorICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisgIC8vIFN0cmVhbXMgYW4gWE1MIENEQVRBIHNlY3Rpb24sIGVzY2FwaW5nIGludmFsaWQgQ0RBVEEgc2VxdWVuY2VzIGFzIG5lZWRlZC4KKyAgc3RhdGljIHZvaWQgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGRhdGEpOworCisgIC8vIFN0cmVhbXMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgorICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisKKyAgLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAorICBzdGF0aWMgdm9pZCBQcmludFhtbFRlc3RDYXNlKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisKKyAgLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KKyAgc3RhdGljIHZvaWQgUHJpbnRYbWxVbml0VGVzdCg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworCisgIC8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCisgIC8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCisgIC8vIFdoZW4gdGhlIHN0ZDo6c3RyaW5nIGlzIG5vdCBlbXB0eSwgaXQgaW5jbHVkZXMgYSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nLAorICAvLyB0byBkZWxpbWl0IHRoaXMgYXR0cmlidXRlIGZyb20gcHJpb3IgYXR0cmlidXRlcy4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCk7CisKKyAgLy8gVGhlIG91dHB1dCBmaWxlLgorICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIpOworfTsKKworLy8gQ3JlYXRlcyBhIG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIuCitYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSkKKyAgICA6IG91dHB1dF9maWxlXyhvdXRwdXRfZmlsZSkgeworICBpZiAob3V0cHV0X2ZpbGVfLmNfc3RyKCkgPT0gTlVMTCB8fCBvdXRwdXRfZmlsZV8uZW1wdHkoKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiWE1MIG91dHB1dCBmaWxlIG1heSBub3QgYmUgbnVsbFxuIik7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9Cit9CisKKy8vIENhbGxlZCBhZnRlciB0aGUgdW5pdCB0ZXN0IGVuZHMuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIEZJTEUqIHhtbG91dCA9IE5VTEw7CisgIEZpbGVQYXRoIG91dHB1dF9maWxlKG91dHB1dF9maWxlXyk7CisgIEZpbGVQYXRoIG91dHB1dF9kaXIob3V0cHV0X2ZpbGUuUmVtb3ZlRmlsZU5hbWUoKSk7CisKKyAgaWYgKG91dHB1dF9kaXIuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKSB7CisgICAgeG1sb3V0ID0gcG9zaXg6OkZPcGVuKG91dHB1dF9maWxlXy5jX3N0cigpLCAidyIpOworICB9CisgIGlmICh4bWxvdXQgPT0gTlVMTCkgeworICAgIC8vIFRPRE8od2FuKTogcmVwb3J0IHRoZSByZWFzb24gb2YgdGhlIGZhaWx1cmUuCisgICAgLy8KKyAgICAvLyBXZSBkb24ndCBkbyBpdCBmb3Igbm93IGFzOgorICAgIC8vCisgICAgLy8gICAxLiBUaGVyZSBpcyBubyB1cmdlbnQgbmVlZCBmb3IgaXQuCisgICAgLy8gICAyLiBJdCdzIGEgYml0IGludm9sdmVkIHRvIG1ha2UgdGhlIGVycm5vIHZhcmlhYmxlIHRocmVhZC1zYWZlIG9uCisgICAgLy8gICAgICBhbGwgdGhyZWUgb3BlcmF0aW5nIHN5c3RlbXMgKExpbnV4LCBXaW5kb3dzLCBhbmQgTWFjIE9TKS4KKyAgICAvLyAgIDMuIFRvIGludGVycHJldCB0aGUgbWVhbmluZyBvZiBlcnJubyBpbiBhIHRocmVhZC1zYWZlIHdheSwKKyAgICAvLyAgICAgIHdlIG5lZWQgdGhlIHN0cmVycm9yX3IoKSBmdW5jdGlvbiwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbgorICAgIC8vICAgICAgV2luZG93cy4KKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwKKyAgICAgICAgICAgIG91dHB1dF9maWxlXy5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBQcmludFhtbFVuaXRUZXN0KCZzdHJlYW0sIHVuaXRfdGVzdCk7CisgIGZwcmludGYoeG1sb3V0LCAiJXMiLCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKS5jX3N0cigpKTsKKyAgZmNsb3NlKHhtbG91dCk7Cit9CisKKy8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmIGlzX2F0dHJpYnV0ZQorLy8gaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgYW5kCisvLyBub3JtYWxpemFibGUgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgYnkgcmVwbGFjaW5nIGl0IHdpdGggY2hhcmFjdGVyCisvLyByZWZlcmVuY2VzLgorLy8KKy8vIEludmFsaWQgWE1MIGNoYXJhY3RlcnMgaW4gc3RyLCBpZiBhbnksIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQuCisvLyBJdCBpcyBleHBlY3RlZCB0aGF0IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRoZSB0ZXh0IHByb2Nlc3NlZCBieSB0aGlzCisvLyBtb2R1bGUgd2lsbCBjb25zaXN0IG9mIG9yZGluYXJ5IEVuZ2xpc2ggdGV4dC4KKy8vIElmIHRoaXMgbW9kdWxlIGlzIGV2ZXIgbW9kaWZpZWQgdG8gcHJvZHVjZSB2ZXJzaW9uIDEuMSBYTUwgb3V0cHV0LAorLy8gbW9zdCBpbnZhbGlkIGNoYXJhY3RlcnMgY2FuIGJlIHJldGFpbmVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLgorLy8gVE9ETyh3YW4pOiBJdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBtaW5pbWFsbHkgaW52YXNpdmUsIGh1bWFuLXJlYWRhYmxlCisvLyBlc2NhcGluZyBzY2hlbWUgZm9yIGludmFsaWQgY2hhcmFjdGVycywgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlbS4KK3N0ZDo6c3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6RXNjYXBlWG1sKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKSB7CisgIE1lc3NhZ2UgbTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IGNoYXIgY2ggPSBzdHJbaV07CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSAnPCc6CisgICAgICAgIG0gPDwgIiZsdDsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICBtIDw8ICImZ3Q7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcmJzoKKyAgICAgICAgbSA8PCAiJmFtcDsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkKKyAgICAgICAgICBtIDw8ICImYXBvczsiOworICAgICAgICBlbHNlCisgICAgICAgICAgbSA8PCAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQorICAgICAgICAgIG0gPDwgIiZxdW90OyI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtIDw8ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcihjaCkpIHsKKyAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlICYmIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjaCkpCisgICAgICAgICAgICBtIDw8ICImI3giIDw8IFN0cmluZzo6Rm9ybWF0Qnl0ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpCisgICAgICAgICAgICAgIDw8ICI7IjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtIDw8IGNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBtLkdldFN0cmluZygpOworfQorCisvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgorLy8gQ3VycmVudGx5IGludmFsaWQgY2hhcmFjdGVycyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBzdHJpbmcuIEFuCisvLyBhbHRlcm5hdGl2ZSBpcyB0byByZXBsYWNlIHRoZW0gd2l0aCBjZXJ0YWluIGNoYXJhY3RlcnMgc3VjaCBhcyAuIG9yID8uCitzdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBvdXRwdXQucmVzZXJ2ZShzdHIuc2l6ZSgpKTsKKyAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHIuYmVnaW4oKTsgaXQgIT0gc3RyLmVuZCgpOyArK2l0KQorICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKCppdCkpCisgICAgICBvdXRwdXQucHVzaF9iYWNrKCppdCk7CisKKyAgcmV0dXJuIG91dHB1dDsKK30KKworLy8gVGhlIGZvbGxvd2luZyByb3V0aW5lcyBnZW5lcmF0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBVbml0VGVzdAorLy8gb2JqZWN0LgorLy8KKy8vIFRoaXMgaXMgaG93IEdvb2dsZSBUZXN0IGNvbmNlcHRzIG1hcCB0byB0aGUgRFREOgorLy8KKy8vIDx0ZXN0c3VpdGVzIG5hbWU9IkFsbFRlc3RzIj4gICAgICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFVuaXRUZXN0IG9iamVjdAorLy8gICA8dGVzdHN1aXRlIG5hbWU9InRlc3RjYXNlLW5hbWUiPiAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdENhc2Ugb2JqZWN0CisvLyAgICAgPHRlc3RjYXNlIG5hbWU9InRlc3QtbmFtZSI+ICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBUZXN0SW5mbyBvYmplY3QKKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLSBpbmRpdmlkdWFsIGFzc2VydGlvbiBmYWlsdXJlcworLy8gICAgIDwvdGVzdGNhc2U+CisvLyAgIDwvdGVzdHN1aXRlPgorLy8gPC90ZXN0c3VpdGVzPgorCisvLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgorc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcykgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBtcy8xMDAwLjA7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIElTTworLy8gODYwMSBmb3JtYXQsIHdpdGhvdXQgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLgorc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKSB7CisgIC8vIFVzaW5nIG5vbi1yZWVudHJhbnQgdmVyc2lvbiBhcyBsb2NhbHRpbWVfciBpcyBub3QgcG9ydGFibGUuCisgIHRpbWVfdCBzZWNvbmRzID0gc3RhdGljX2Nhc3Q8dGltZV90PihtcyAvIDEwMDApOworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDk5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZSkuCisgIGNvbnN0IHN0cnVjdCB0bSogY29uc3QgdGltZV9zdHJ1Y3QgPSBsb2NhbHRpbWUoJnNlY29uZHMpOyAgLy8gTk9MSU5UCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlIGFnYWluLgorI2Vsc2UKKyAgY29uc3Qgc3RydWN0IHRtKiBjb25zdCB0aW1lX3N0cnVjdCA9IGxvY2FsdGltZSgmc2Vjb25kcyk7ICAvLyBOT0xJTlQKKyNlbmRpZgorICBpZiAodGltZV9zdHJ1Y3QgPT0gTlVMTCkKKyAgICByZXR1cm4gIiI7ICAvLyBJbnZhbGlkIG1zIHZhbHVlCisKKyAgLy8gWVlZWS1NTS1ERFRoaDptbTpzcworICByZXR1cm4gU3RyZWFtYWJsZVRvU3RyaW5nKHRpbWVfc3RydWN0LT50bV95ZWFyICsgMTkwMCkgKyAiLSIgKworICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QtPnRtX21vbiArIDEpICsgIi0iICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LT50bV9tZGF5KSArICJUIiArCisgICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC0+dG1faG91cikgKyAiOiIgKworICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QtPnRtX21pbikgKyAiOiIgKworICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QtPnRtX3NlYyk7Cit9CisKKy8vIFN0cmVhbXMgYW4gWE1MIENEQVRBIHNlY3Rpb24sIGVzY2FwaW5nIGludmFsaWQgQ0RBVEEgc2VxdWVuY2VzIGFzIG5lZWRlZC4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxDRGF0YVNlY3Rpb24oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSkgeworICBjb25zdCBjaGFyKiBzZWdtZW50ID0gZGF0YTsKKyAgKnN0cmVhbSA8PCAiPCFbQ0RBVEFbIjsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IG5leHRfc2VnbWVudCA9IHN0cnN0cihzZWdtZW50LCAiXV0+Iik7CisgICAgaWYgKG5leHRfc2VnbWVudCAhPSBOVUxMKSB7CisgICAgICBzdHJlYW0tPndyaXRlKAorICAgICAgICAgIHNlZ21lbnQsIHN0YXRpY19jYXN0PHN0ZDo6c3RyZWFtc2l6ZT4obmV4dF9zZWdtZW50IC0gc2VnbWVudCkpOworICAgICAgKnN0cmVhbSA8PCAiXV0+XV0mZ3Q7PCFbQ0RBVEFbIjsKKyAgICAgIHNlZ21lbnQgPSBuZXh0X3NlZ21lbnQgKyBzdHJsZW4oIl1dPiIpOworICAgIH0gZWxzZSB7CisgICAgICAqc3RyZWFtIDw8IHNlZ21lbnQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgKnN0cmVhbSA8PCAiXV0+IjsKK30KKwordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbEF0dHJpYnV0ZSgKKyAgICBzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFsbG93ZWRfbmFtZXMgPQorICAgICAgR2V0UmVzZXJ2ZWRBdHRyaWJ1dGVzRm9yRWxlbWVudChlbGVtZW50X25hbWUpOworCisgIEdURVNUX0NIRUNLXyhzdGQ6OmZpbmQoYWxsb3dlZF9uYW1lcy5iZWdpbigpLCBhbGxvd2VkX25hbWVzLmVuZCgpLCBuYW1lKSAhPQorICAgICAgICAgICAgICAgICAgIGFsbG93ZWRfbmFtZXMuZW5kKCkpCisgICAgICA8PCAiQXR0cmlidXRlICIgPDwgbmFtZSA8PCAiIGlzIG5vdCBhbGxvd2VkIGZvciBlbGVtZW50IDwiIDw8IGVsZW1lbnRfbmFtZQorICAgICAgPDwgIj4uIjsKKworICAqc3RyZWFtIDw8ICIgIiA8PCBuYW1lIDw8ICI9XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh2YWx1ZSkgPDwgIlwiIjsKK30KKworLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RJbmZvIG9iamVjdC4KKy8vIFRPRE8od2FuKTogVGhlcmUgaXMgYWxzbyB2YWx1ZSBpbiBwcmludGluZyBwcm9wZXJ0aWVzIHdpdGggdGhlIHBsYWluIHByaW50ZXIuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sVGVzdEluZm8oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCA9ICp0ZXN0X2luZm8ucmVzdWx0KCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0Y2FzZSA9ICJ0ZXN0Y2FzZSI7CisKKyAgKnN0cmVhbSA8PCAiICAgIDx0ZXN0Y2FzZSI7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgIm5hbWUiLCB0ZXN0X2luZm8ubmFtZSgpKTsKKworICBpZiAodGVzdF9pbmZvLnZhbHVlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInZhbHVlX3BhcmFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLnZhbHVlX3BhcmFtKCkpOworICB9CisgIGlmICh0ZXN0X2luZm8udHlwZV9wYXJhbSgpICE9IE5VTEwpIHsKKyAgICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJ0eXBlX3BhcmFtIiwgdGVzdF9pbmZvLnR5cGVfcGFyYW0oKSk7CisgIH0KKworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJzdGF0dXMiLAorICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLnNob3VsZF9ydW4oKSA/ICJydW4iIDogIm5vdHJ1biIpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJ0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhyZXN1bHQuZWxhcHNlZF90aW1lKCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAiY2xhc3NuYW1lIiwgdGVzdF9jYXNlX25hbWUpOworICAqc3RyZWFtIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHJlc3VsdCk7CisKKyAgaW50IGZhaWx1cmVzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQudG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcGFydCA9IHJlc3VsdC5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICBpZiAocGFydC5mYWlsZWQoKSkgeworICAgICAgaWYgKCsrZmFpbHVyZXMgPT0gMSkgeworICAgICAgICAqc3RyZWFtIDw8ICI+XG4iOworICAgICAgfQorICAgICAgY29uc3Qgc3RyaW5nIGxvY2F0aW9uID0gaW50ZXJuYWw6OkZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oCisgICAgICAgICAgcGFydC5maWxlX25hbWUoKSwgcGFydC5saW5lX251bWJlcigpKTsKKyAgICAgIGNvbnN0IHN0cmluZyBzdW1tYXJ5ID0gbG9jYXRpb24gKyAiXG4iICsgcGFydC5zdW1tYXJ5KCk7CisgICAgICAqc3RyZWFtIDw8ICIgICAgICA8ZmFpbHVyZSBtZXNzYWdlPVwiIgorICAgICAgICAgICAgICA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUoc3VtbWFyeS5jX3N0cigpKQorICAgICAgICAgICAgICA8PCAiXCIgdHlwZT1cIlwiPiI7CisgICAgICBjb25zdCBzdHJpbmcgZGV0YWlsID0gbG9jYXRpb24gKyAiXG4iICsgcGFydC5tZXNzYWdlKCk7CisgICAgICBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oc3RyZWFtLCBSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhkZXRhaWwpLmNfc3RyKCkpOworICAgICAgKnN0cmVhbSA8PCAiPC9mYWlsdXJlPlxuIjsKKyAgICB9CisgIH0KKworICBpZiAoZmFpbHVyZXMgPT0gMCkKKyAgICAqc3RyZWFtIDw8ICIgLz5cbiI7CisgIGVsc2UKKyAgICAqc3RyZWFtIDw8ICIgICAgPC90ZXN0Y2FzZT5cbiI7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QKK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFRlc3RDYXNlKHN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdHN1aXRlID0gInRlc3RzdWl0ZSI7CisgICpzdHJlYW0gPDwgIiAgPCIgPDwga1Rlc3RzdWl0ZTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgIm5hbWUiLCB0ZXN0X2Nhc2UubmFtZSgpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgInRlc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UucmVwb3J0YWJsZV90ZXN0X2NvdW50KCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgImZhaWx1cmVzIiwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoCisgICAgICBzdHJlYW0sIGtUZXN0c3VpdGUsICJkaXNhYmxlZCIsCisgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJlcnJvcnMiLCAiMCIpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAidGltZSIsCisgICAgICAgICAgICAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKSk7CisgICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXModGVzdF9jYXNlLmFkX2hvY190ZXN0X3Jlc3VsdCgpKQorICAgICAgICAgIDw8ICI+XG4iOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytpKSB7CisgICAgaWYgKHRlc3RfY2FzZS5HZXRUZXN0SW5mbyhpKS0+aXNfcmVwb3J0YWJsZSgpKQorICAgICAgT3V0cHV0WG1sVGVzdEluZm8oc3RyZWFtLCB0ZXN0X2Nhc2UubmFtZSgpLCAqdGVzdF9jYXNlLkdldFRlc3RJbmZvKGkpKTsKKyAgfQorICAqc3RyZWFtIDw8ICIgIDwvIiA8PCBrVGVzdHN1aXRlIDw8ICI+XG4iOworfQorCisvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0Lgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVW5pdFRlc3Qoc3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0c3VpdGVzID0gInRlc3RzdWl0ZXMiOworCisgICpzdHJlYW0gPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKKyAgKnN0cmVhbSA8PCAiPCIgPDwga1Rlc3RzdWl0ZXM7CisKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJ0ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LnJlcG9ydGFibGVfdGVzdF9jb3VudCgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAiZmFpbHVyZXMiLAorICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZSgKKyAgICAgIHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJkaXNhYmxlZCIsCisgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAiZXJyb3JzIiwgIjAiKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKAorICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlcywgInRpbWVzdGFtcCIsCisgICAgICBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSh1bml0X3Rlc3Quc3RhcnRfdGltZXN0YW1wKCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJ0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpKTsKKworICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAicmFuZG9tX3NlZWQiLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpKTsKKyAgfQorCisgICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXModW5pdF90ZXN0LmFkX2hvY190ZXN0X3Jlc3VsdCgpKTsKKworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgIm5hbWUiLCAiQWxsVGVzdHMiKTsKKyAgKnN0cmVhbSA8PCAiPlxuIjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgaWYgKHVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKS0+cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgPiAwKQorICAgICAgUHJpbnRYbWxUZXN0Q2FzZShzdHJlYW0sICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSkpOworICB9CisgICpzdHJlYW0gPDwgIjwvIiA8PCBrVGVzdHN1aXRlcyA8PCAiPlxuIjsKK30KKworLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKKy8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCitzdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKAorICAgIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCkgeworICBNZXNzYWdlIGF0dHJpYnV0ZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSA9IHJlc3VsdC5HZXRUZXN0UHJvcGVydHkoaSk7CisgICAgYXR0cmlidXRlcyA8PCAiICIgPDwgcHJvcGVydHkua2V5KCkgPDwgIj0iCisgICAgICAgIDw8ICJcIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHByb3BlcnR5LnZhbHVlKCkpIDw8ICJcIiI7CisgIH0KKyAgcmV0dXJuIGF0dHJpYnV0ZXMuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEVuZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworLy8gQ2hlY2tzIGlmIHN0ciBjb250YWlucyAnPScsICcmJywgJyUnIG9yICdcbicgY2hhcmFjdGVycy4gSWYgeWVzLAorLy8gcmVwbGFjZXMgdGhlbSBieSAiJXh4IiB3aGVyZSB4eCBpcyB0aGVpciBoZXhhZGVjaW1hbCB2YWx1ZS4gRm9yCisvLyBleGFtcGxlLCByZXBsYWNlcyAiPSIgd2l0aCAiJTNEIi4gIFRoaXMgYWxnb3JpdGhtIGlzIE8oc3RybGVuKHN0cikpCisvLyBpbiBib3RoIHRpbWUgYW5kIHNwYWNlIC0tIGltcG9ydGFudCBhcyB0aGUgaW5wdXQgc3RyIG1heSBjb250YWluIGFuCisvLyBhcmJpdHJhcmlseSBsb25nIHRlc3QgZmFpbHVyZSBtZXNzYWdlIGFuZCBzdGFjayB0cmFjZS4KK3N0cmluZyBTdHJlYW1pbmdMaXN0ZW5lcjo6VXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cikgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShzdHJsZW4oc3RyKSArIDEpOworICBmb3IgKGNoYXIgY2ggPSAqc3RyOyBjaCAhPSAnXDAnOyBjaCA9ICorK3N0cikgeworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgY2FzZSAnPSc6CisgICAgICBjYXNlICcmJzoKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiJSIgKyBTdHJpbmc6OkZvcm1hdEJ5dGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN0cmVhbWluZ0xpc3RlbmVyOjpTb2NrZXRXcml0ZXI6Ok1ha2VDb25uZWN0aW9uKCkgeworICBHVEVTVF9DSEVDS18oc29ja2ZkXyA9PSAtMSkKKyAgICAgIDw8ICJNYWtlQ29ubmVjdGlvbigpIGNhbid0IGJlIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uLiI7CisKKyAgYWRkcmluZm8gaGludHM7CisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7ICAgIC8vIFRvIGFsbG93IGJvdGggSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMuCisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGFkZHJpbmZvKiBzZXJ2aW5mbyA9IE5VTEw7CisKKyAgLy8gVXNlIHRoZSBnZXRhZGRyaW5mbygpIHRvIGdldCBhIGxpbmtlZCBsaXN0IG9mIElQIGFkZHJlc3NlcyBmb3IKKyAgLy8gdGhlIGdpdmVuIGhvc3QgbmFtZS4KKyAgY29uc3QgaW50IGVycm9yX251bSA9IGdldGFkZHJpbmZvKAorICAgICAgaG9zdF9uYW1lXy5jX3N0cigpLCBwb3J0X251bV8uY19zdHIoKSwgJmhpbnRzLCAmc2VydmluZm8pOworICBpZiAoZXJyb3JfbnVtICE9IDApIHsKKyAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBnZXRhZGRyaW5mbygpIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2FpX3N0cmVycm9yKGVycm9yX251bSk7CisgIH0KKworICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByZXN1bHRzIGFuZCBjb25uZWN0IHRvIHRoZSBmaXJzdCB3ZSBjYW4uCisgIGZvciAoYWRkcmluZm8qIGN1cl9hZGRyID0gc2VydmluZm87IHNvY2tmZF8gPT0gLTEgJiYgY3VyX2FkZHIgIT0gTlVMTDsKKyAgICAgICBjdXJfYWRkciA9IGN1cl9hZGRyLT5haV9uZXh0KSB7CisgICAgc29ja2ZkXyA9IHNvY2tldCgKKyAgICAgICAgY3VyX2FkZHItPmFpX2ZhbWlseSwgY3VyX2FkZHItPmFpX3NvY2t0eXBlLCBjdXJfYWRkci0+YWlfcHJvdG9jb2wpOworICAgIGlmIChzb2NrZmRfICE9IC0xKSB7CisgICAgICAvLyBDb25uZWN0IHRoZSBjbGllbnQgc29ja2V0IHRvIHRoZSBzZXJ2ZXIgc29ja2V0LgorICAgICAgaWYgKGNvbm5lY3Qoc29ja2ZkXywgY3VyX2FkZHItPmFpX2FkZHIsIGN1cl9hZGRyLT5haV9hZGRybGVuKSA9PSAtMSkgeworICAgICAgICBjbG9zZShzb2NrZmRfKTsKKyAgICAgICAgc29ja2ZkXyA9IC0xOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZyZWVhZGRyaW5mbyhzZXJ2aW5mbyk7ICAvLyBhbGwgZG9uZSB3aXRoIHRoaXMgc3RydWN0dXJlCisKKyAgaWYgKHNvY2tmZF8gPT0gLTEpIHsKKyAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBmYWlsZWQgdG8gY29ubmVjdCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBob3N0X25hbWVfIDw8ICI6IiA8PCBwb3J0X251bV87CisgIH0KK30KKworLy8gRW5kIG9mIGNsYXNzIFN0cmVhbWluZyBMaXN0ZW5lcgorI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfXworCisvLyBDbGFzcyBTY29wZWRUcmFjZQorCisvLyBQdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8gYSBwZXItdGhyZWFkCisvLyB0cmFjZSBzdGFjayBtYWludGFpbmVkIGJ5IEdvb2dsZSBUZXN0LgorU2NvcGVkVHJhY2U6OlNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKCZVbml0VGVzdDo6bXV0ZXhfKSB7CisgIFRyYWNlSW5mbyB0cmFjZTsKKyAgdHJhY2UuZmlsZSA9IGZpbGU7CisgIHRyYWNlLmxpbmUgPSBsaW5lOworICB0cmFjZS5tZXNzYWdlID0gbWVzc2FnZS5HZXRTdHJpbmcoKTsKKworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UHVzaEdUZXN0VHJhY2UodHJhY2UpOworfQorCisvLyBQb3BzIHRoZSBpbmZvIHB1c2hlZCBieSB0aGUgYyd0b3IuCitTY29wZWRUcmFjZTo6flNjb3BlZFRyYWNlKCkKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4XykgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UG9wR1Rlc3RUcmFjZSgpOworfQorCisKKy8vIGNsYXNzIE9zU3RhY2tUcmFjZUdldHRlcgorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLiAgUGFyYW1ldGVyczoKKy8vCisvLyAgIG1heF9kZXB0aCAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkCisvLyAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UuCisvLyAgIHNraXBfY291bnQgLSB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZDsgZG9lc24ndCBjb3VudAorLy8gICAgICAgICAgICAgICAgYWdhaW5zdCBtYXhfZGVwdGguCisvLworc3RyaW5nIE9zU3RhY2tUcmFjZUdldHRlcjo6Q3VycmVudFN0YWNrVHJhY2UoaW50IC8qIG1heF9kZXB0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBza2lwX2NvdW50ICovKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgT3NTdGFja1RyYWNlR2V0dGVyOjpVcG9uTGVhdmluZ0dUZXN0KCkKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKK30KKworY29uc3QgY2hhciogY29uc3QKK09zU3RhY2tUcmFjZUdldHRlcjo6a0VsaWRlZEZyYW1lc01hcmtlciA9CisgICAgIi4uLiAiIEdURVNUX05BTUVfICIgaW50ZXJuYWwgZnJhbWVzIC4uLiI7CisKKy8vIEEgaGVscGVyIGNsYXNzIHRoYXQgY3JlYXRlcyB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBpbiBpdHMKKy8vIGNvbnN0cnVjdG9yIGFuZCBkZWxldGVzIHRoZSBmaWxlIGluIGl0cyBkZXN0cnVjdG9yLgorY2xhc3MgU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoY29uc3QgY2hhciogcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGgpCisgICAgICA6IHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyhwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCkgeworICAgIC8vIElmIGEgcGF0aCB0byB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBpcyBzcGVjaWZpZWQuLi4KKyAgICBpZiAocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGggIT0gTlVMTCAmJiAqcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGggIT0gJ1wwJykgeworICAgICAgLy8gY3JlYXRlIHRoZSBmaWxlIHdpdGggYSBzaW5nbGUgIjAiIGNoYXJhY3RlciBpbiBpdC4gIEkvTworICAgICAgLy8gZXJyb3JzIGFyZSBpZ25vcmVkIGFzIHRoZXJlJ3Mgbm90aGluZyBiZXR0ZXIgd2UgY2FuIGRvIGFuZCB3ZQorICAgICAgLy8gZG9uJ3Qgd2FudCB0byBmYWlsIHRoZSB0ZXN0IGJlY2F1c2Ugb2YgdGhpcy4KKyAgICAgIEZJTEUqIHBmaWxlID0gcG9zaXg6OkZPcGVuKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoLCAidyIpOworICAgICAgZndyaXRlKCIwIiwgMSwgMSwgcGZpbGUpOworICAgICAgZmNsb3NlKHBmaWxlKTsKKyAgICB9CisgIH0KKworICB+U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoKSB7CisgICAgaWYgKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyAhPSBOVUxMICYmICpwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8gIT0gJ1wwJykgeworICAgICAgcmVtb3ZlKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBjb25zdCBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRQcmVtYXR1cmVFeGl0RmlsZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzCisKK1Rlc3RFdmVudExpc3RlbmVyczo6VGVzdEV2ZW50TGlzdGVuZXJzKCkKKyAgICA6IHJlcGVhdGVyXyhuZXcgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKCkpLAorICAgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8oTlVMTCksCisgICAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKE5VTEwpIHsKK30KKworVGVzdEV2ZW50TGlzdGVuZXJzOjp+VGVzdEV2ZW50TGlzdGVuZXJzKCkgeyBkZWxldGUgcmVwZWF0ZXJfOyB9CisKKy8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCisvLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAorLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAorLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSB1c2VyLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgcmVwZWF0ZXJfLT5BcHBlbmQobGlzdGVuZXIpOworfQorCisvLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgorLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucworLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgorVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudExpc3RlbmVyczo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKQorICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gTlVMTDsKKyAgZWxzZSBpZiAobGlzdGVuZXIgPT0gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXykKKyAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gTlVMTDsKKyAgcmV0dXJuIHJlcGVhdGVyXy0+UmVsZWFzZShsaXN0ZW5lcik7Cit9CisKKy8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCisvLyBzdWJzY3JpYmVycy4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OnJlcGVhdGVyKCkgeyByZXR1cm4gcmVwZWF0ZXJfOyB9CisKKy8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KKy8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworLy8gZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KKy8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyAhPSBsaXN0ZW5lcikgeworICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCisgICAgLy8gbGlzdC4KKyAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyk7CisgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBsaXN0ZW5lcjsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKKyAgICAgIEFwcGVuZChsaXN0ZW5lcik7CisgIH0KK30KKworLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUKKy8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChkZWZhdWx0X3htbF9nZW5lcmF0b3JfICE9IGxpc3RlbmVyKSB7CisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyB0aGlzIG1ldGhvZCBhIGxpc3RlbmVyIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUKKyAgICAvLyBsaXN0LgorICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pOworICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gPSBsaXN0ZW5lcjsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKKyAgICAgIEFwcGVuZChsaXN0ZW5lcik7CisgIH0KK30KKworLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQorLy8gbGlzdGVuZXJzIGluIHRoZSBsaXN0LgorYm9vbCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdCB7CisgIHJldHVybiByZXBlYXRlcl8tPmZvcndhcmRpbmdfZW5hYmxlZCgpOworfQorCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKSB7CisgIHJlcGVhdGVyXy0+c2V0X2ZvcndhcmRpbmdfZW5hYmxlZChmYWxzZSk7Cit9CisKKy8vIGNsYXNzIFVuaXRUZXN0CisKKy8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcworLy8gY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuICBDb25zZWN1dGl2ZQorLy8gY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8gYXMgYSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0bworLy8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkgc3RhcnRzLCBmcm9tIHdoaWNoIHBvaW50IG9uIHRoZSByZXR1cm4KKy8vIHZhbHVlIHdpbGwgbmV2ZXIgY2hhbmdlLgorVW5pdFRlc3QqIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpIHsKKyAgLy8gV2hlbiBjb21waWxlZCB3aXRoIE1TVkMgNy4xIGluIG9wdGltaXplZCBtb2RlLCBkZXN0cm95aW5nIHRoZQorICAvLyBVbml0VGVzdCBvYmplY3QgdXBvbiBleGl0aW5nIHRoZSBwcm9ncmFtIG1lc3NlcyB1cCB0aGUgZXhpdCBjb2RlLAorICAvLyBjYXVzaW5nIHN1Y2Nlc3NmdWwgdGVzdHMgdG8gYXBwZWFyIGZhaWxlZC4gIFdlIGhhdmUgdG8gdXNlIGEKKyAgLy8gZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZSB0byBieXBhc3MgdGhlIGNvbXBpbGVyIGJ1Zy4KKyAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB0aGUgY29tcGlsZXIgaGFwcHksIGF0IHRoZSBjb3N0IG9mCisgIC8vIGxlYWtpbmcgdGhlIFVuaXRUZXN0IG9iamVjdC4KKworICAvLyBDb2RlR2VhciBDKytCdWlsZGVyIGluc2lzdHMgb24gYSBwdWJsaWMgZGVzdHJ1Y3RvciBmb3IgdGhlCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uICBVc2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB0byBrZWVwIGdvb2QgT08KKyAgLy8gZGVzaWduIHdpdGggcHJpdmF0ZSBkZXN0cnVjdG9yLgorCisjaWYgKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIHN0YXRpYyBVbml0VGVzdCogY29uc3QgaW5zdGFuY2UgPSBuZXcgVW5pdFRlc3Q7CisgIHJldHVybiBpbnN0YW5jZTsKKyNlbHNlCisgIHN0YXRpYyBVbml0VGVzdCBpbnN0YW5jZTsKKyAgcmV0dXJuICZpbnN0YW5jZTsKKyNlbmRpZiAgLy8gKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5zdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0Ojp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisvLyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3Q6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnRlc3RfY2FzZV90b19ydW5fY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCitpbnQgVW5pdFRlc3Q6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KK2ludCBVbml0VGVzdDo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3Q6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50ZXN0X3RvX3J1bl9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisvLyBVTklYIGVwb2NoLgoraW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6c3RhcnRfdGltZXN0YW1wKCkgY29uc3QgeworICAgIHJldHVybiBpbXBsKCktPnN0YXJ0X3RpbWVzdGFtcCgpOworfQorCisvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KK2ludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OmVsYXBzZWRfdGltZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+ZWxhcHNlZF90aW1lKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KK2Jvb2wgVW5pdFRlc3Q6OlBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+UGFzc2VkKCk7IH0KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKy8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgorYm9vbCBVbml0VGVzdDo6RmFpbGVkKCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5GYWlsZWQoKTsgfQorCisvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPkdldFRlc3RDYXNlKGkpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gdGVzdCBmYWlsdXJlcyBhbmQKKy8vIHByb3BlcnRpZXMgbG9nZ2VkIG91dHNpZGUgb2YgaW5kaXZpZHVhbCB0ZXN0IGNhc2VzLgorY29uc3QgVGVzdFJlc3VsdCYgVW5pdFRlc3Q6OmFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsKKyAgcmV0dXJuICppbXBsKCktPmFkX2hvY190ZXN0X3Jlc3VsdCgpOworfQorCisvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgeworICByZXR1cm4gaW1wbCgpLT5HZXRNdXRhYmxlVGVzdENhc2UoaSk7Cit9CisKKy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCisvLyBpbnNpZGUgR29vZ2xlIFRlc3QuCitUZXN0RXZlbnRMaXN0ZW5lcnMmIFVuaXRUZXN0OjpsaXN0ZW5lcnMoKSB7CisgIHJldHVybiAqaW1wbCgpLT5saXN0ZW5lcnMoKTsKK30KKworLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAorLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4gdGhlCisvLyBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbSBoYXZlCisvLyBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbiB0aGUKKy8vICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KKy8vCisvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKKy8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgorRW52aXJvbm1lbnQqIFVuaXRUZXN0OjpBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7CisgIGlmIChlbnYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaW1wbF8tPmVudmlyb25tZW50cygpLnB1c2hfYmFjayhlbnYpOworICByZXR1cm4gZW52OworfQorCisvLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwgR29vZ2xlIFRlc3QKKy8vIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKSBldmVudHVhbGx5IGNhbGwKKy8vIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlIHNob3VsZCB1c2UgdGhlCisvLyBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5Lgordm9pZCBVbml0VGVzdDo6QWRkVGVzdFBhcnRSZXN1bHQoCisgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAorICAgIGludCBsaW5lX251bWJlciwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IG1lc3NhZ2U7CisKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICBpZiAoaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkuc2l6ZSgpID4gMCkgeworICAgIG1zZyA8PCAiXG4iIDw8IEdURVNUX05BTUVfIDw8ICIgdHJhY2U6IjsKKworICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSk7CisgICAgICAgICBpID4gMDsgLS1pKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSA9IGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpW2kgLSAxXTsKKyAgICAgIG1zZyA8PCAiXG4iIDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24odHJhY2UuZmlsZSwgdHJhY2UubGluZSkKKyAgICAgICAgICA8PCAiICIgPDwgdHJhY2UubWVzc2FnZTsKKyAgICB9CisgIH0KKworICBpZiAob3Nfc3RhY2tfdHJhY2UuY19zdHIoKSAhPSBOVUxMICYmICFvc19zdGFja190cmFjZS5lbXB0eSgpKSB7CisgICAgbXNnIDw8IGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlciA8PCBvc19zdGFja190cmFjZTsKKyAgfQorCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHJlc3VsdCA9CisgICAgVGVzdFBhcnRSZXN1bHQocmVzdWx0X3R5cGUsIGZpbGVfbmFtZSwgbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICBpbXBsXy0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKS0+CisgICAgICBSZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworCisgIGlmIChyZXN1bHRfdHlwZSAhPSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpIHsKKyAgICAvLyBndGVzdF9icmVha19vbl9mYWlsdXJlIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgorICAgIC8vIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuICBUaGlzIGFsbG93cyBhIHVzZXIgdG8gc2V0IHRoZSBsYXR0ZXIKKyAgICAvLyBpbiB0aGUgY29kZSAocGVyaGFwcyBpbiBvcmRlciB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucworICAgIC8vIHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yaykgYW5kIHNwZWNpZnkgdGhlIGZvcm1lciBvbiB0aGUKKyAgICAvLyBjb21tYW5kIGxpbmUgZm9yIGRlYnVnZ2luZy4KKyAgICBpZiAoR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgICAgIC8vIFVzaW5nIERlYnVnQnJlYWsgb24gV2luZG93cyBhbGxvd3MgZ3Rlc3QgdG8gc3RpbGwgYnJlYWsgaW50byBhIGRlYnVnZ2VyCisgICAgICAvLyB3aGVuIGEgZmFpbHVyZSBoYXBwZW5zIGFuZCBib3RoIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgYW5kCisgICAgICAvLyB0aGUgLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIGZsYWdzIGFyZSBzcGVjaWZpZWQuCisgICAgICBEZWJ1Z0JyZWFrKCk7CisjZWxzZQorICAgICAgLy8gRGVyZWZlcmVuY2UgTlVMTCB0aHJvdWdoIGEgdm9sYXRpbGUgcG9pbnRlciB0byBwcmV2ZW50IHRoZSBjb21waWxlcgorICAgICAgLy8gZnJvbSByZW1vdmluZy4gV2UgdXNlIHRoaXMgcmF0aGVyIHRoYW4gYWJvcnQoKSBvciBfX2J1aWx0aW5fdHJhcCgpIGZvcgorICAgICAgLy8gcG9ydGFiaWxpdHk6IFN5bWJpYW4gZG9lc24ndCBpbXBsZW1lbnQgYWJvcnQoKSB3ZWxsLCBhbmQgc29tZSBkZWJ1Z2dlcnMKKyAgICAgIC8vIGRvbid0IGNvcnJlY3RseSB0cmFwIGFib3J0KCkuCisgICAgICAqc3RhdGljX2Nhc3Q8dm9sYXRpbGUgaW50Kj4oTlVMTCkgPSAxOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgICAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgICAgIHRocm93IGludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihyZXN1bHQpOworI2Vsc2UKKyAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIGFib3J0KCkgYXMgaXQgZ2VuZXJhdGVzIGEgcG9wLXVwIGluIGRlYnVnIG1vZGUKKyAgICAgIC8vIHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgaW4gVkMgNy4xIG9yIGJlbG93LgorICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgIH0KKyAgfQorfQorCisvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBmcm9tCisvLyBpbnNpZGUgYSB0ZXN0LCB0byBjdXJyZW50IFRlc3RDYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0XyB3aGVuIGludm9rZWQKKy8vIGZyb20gU2V0VXBUZXN0Q2FzZSBvciBUZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldAorLy8gd2hlbiBpbnZva2VkIGVsc2V3aGVyZS4gIElmIHRoZSByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGgKKy8vIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4KK3ZvaWQgVW5pdFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgaW1wbF8tPlJlY29yZFByb3BlcnR5KFRlc3RQcm9wZXJ0eShrZXksIHZhbHVlKSk7Cit9CisKKy8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0IGFuZCBwcmludHMgdGhlIHJlc3VsdC4KKy8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KKy8vCisvLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfLCBhcyB3ZSBvbmx5IHN1cHBvcnQgY2FsbGluZyBpdAorLy8gZnJvbSB0aGUgbWFpbiB0aHJlYWQuCitpbnQgVW5pdFRlc3Q6OlJ1bigpIHsKKyAgY29uc3QgYm9vbCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPQorICAgICAgaW50ZXJuYWw6OkdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmxlbmd0aCgpID4gMDsKKworICAvLyBHb29nbGUgVGVzdCBpbXBsZW1lbnRzIHRoaXMgcHJvdG9jb2wgZm9yIGNhdGNoaW5nIHRoYXQgYSB0ZXN0CisgIC8vIHByb2dyYW0gZXhpdHMgYmVmb3JlIHJldHVybmluZyBjb250cm9sIHRvIEdvb2dsZSBUZXN0OgorICAvLworICAvLyAgIDEuIFVwb24gc3RhcnQsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYSBmaWxlIHdob3NlIGFic29sdXRlIHBhdGgKKyAgLy8gICAgICBpcyBzcGVjaWZpZWQgYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgIC8vICAgICAgVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFLgorICAvLyAgIDIuIFdoZW4gR29vZ2xlIFRlc3QgaGFzIGZpbmlzaGVkIGl0cyB3b3JrLCBpdCBkZWxldGVzIHRoZSBmaWxlLgorICAvLworICAvLyBUaGlzIGFsbG93cyBhIHRlc3QgcnVubmVyIHRvIHNldCBURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUgYmVmb3JlCisgIC8vIHJ1bm5pbmcgYSBHb29nbGUtVGVzdC1iYXNlZCB0ZXN0IHByb2dyYW0gYW5kIGNoZWNrIHRoZSBleGlzdGVuY2UKKyAgLy8gb2YgdGhlIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdCBleGVjdXRpb24gdG8gc2VlIGlmIGl0IGhhcworICAvLyBleGl0ZWQgcHJlbWF0dXJlbHkuCisKKyAgLy8gSWYgd2UgYXJlIGluIHRoZSBjaGlsZCBwcm9jZXNzIG9mIGEgZGVhdGggdGVzdCwgZG9uJ3QKKyAgLy8gY3JlYXRlL2RlbGV0ZSB0aGUgcHJlbWF0dXJlIGV4aXQgZmlsZSwgYXMgZG9pbmcgc28gaXMgdW5uZWNlc3NhcnkKKyAgLy8gYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGNyZWF0ZS9kZWxldGUKKyAgLy8gdGhlIGZpbGUgdXBvbiBlbnRlcmluZy9sZWF2aW5nIHRoaXMgZnVuY3Rpb24uICBJZiB0aGUgcHJvZ3JhbQorICAvLyBzb21laG93IGV4aXRzIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGhhcyBhIGNoYW5jZSB0byByZXR1cm4sIHRoZQorICAvLyBwcmVtYXR1cmUtZXhpdCBmaWxlIHdpbGwgYmUgbGVmdCB1bmRlbGV0ZWQsIGNhdXNpbmcgYSB0ZXN0IHJ1bm5lcgorICAvLyB0aGF0IHVuZGVyc3RhbmRzIHRoZSBwcmVtYXR1cmUtZXhpdC1maWxlIHByb3RvY29sIHRvIHJlcG9ydCB0aGUKKyAgLy8gdGVzdCBhcyBoYXZpbmcgZmFpbGVkLgorICBjb25zdCBpbnRlcm5hbDo6U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUgcHJlbWF0dXJlX2V4aXRfZmlsZSgKKyAgICAgIGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcyA/CisgICAgICBOVUxMIDogaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoIlRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSIpKTsKKworICAvLyBDYXB0dXJlcyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKS4gIFRoaXMgdmFsdWUgd2lsbCBiZQorICAvLyB1c2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByb2dyYW0uCisgIGltcGwoKS0+c2V0X2NhdGNoX2V4Y2VwdGlvbnMoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7CisKKyNpZiBHVEVTVF9IQVNfU0VICisgIC8vIEVpdGhlciB0aGUgdXNlciB3YW50cyBHb29nbGUgVGVzdCB0byBjYXRjaCBleGNlcHRpb25zIHRocm93biBieSB0aGUKKyAgLy8gdGVzdHMgb3IgdGhpcyBpcyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgZGVhdGggdGVzdCBjaGlsZAorICAvLyBwcm9jZXNzLiBJbiBlaXRoZXIgY2FzZSB0aGUgdXNlciBkb2VzIG5vdCB3YW50IHRvIHNlZSBwb3AtdXAgZGlhbG9ncworICAvLyBhYm91dCBjcmFzaGVzIC0gdGhleSBhcmUgZXhwZWN0ZWQuCisgIGlmIChpbXBsKCktPmNhdGNoX2V4Y2VwdGlvbnMoKSB8fCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MpIHsKKyMgaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgICAgLy8gU2V0RXJyb3JNb2RlIGRvZXNuJ3QgZXhpc3Qgb24gQ0UuCisgICAgU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgfCBTRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVCB8CisgICAgICAgICAgICAgICAgIFNFTV9OT0dQRkFVTFRFUlJPUkJPWCB8IFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOworIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyMgaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IEdURVNUX09TX1dJTkRPV1NfTUlOR1cpICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIC8vIERlYXRoIHRlc3QgY2hpbGRyZW4gY2FuIGJlIHRlcm1pbmF0ZWQgd2l0aCBfYWJvcnQoKS4gIE9uIFdpbmRvd3MsCisgICAgLy8gX2Fib3J0KCkgY2FuIHNob3cgYSBkaWFsb2cgd2l0aCBhIHdhcm5pbmcgbWVzc2FnZS4gIFRoaXMgZm9yY2VzIHRoZQorICAgIC8vIGFib3J0IG1lc3NhZ2UgdG8gZ28gdG8gc3RkZXJyIGluc3RlYWQuCisgICAgX3NldF9lcnJvcl9tb2RlKF9PVVRfVE9fU1RERVJSKTsKKyMgZW5kaWYKKworIyBpZiBfTVNDX1ZFUiA+PSAxNDAwICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIC8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCBWaXN1YWwgU3R1ZGlvIHBvcHMgdXAgYSBzZXBhcmF0ZSBkaWFsb2cKKyAgICAvLyBvZmZlcmluZyBhIGNob2ljZSB0byBkZWJ1ZyB0aGUgYWJvcnRlZCBwcm9ncmFtLiBXZSBuZWVkIHRvIHN1cHByZXNzCisgICAgLy8gdGhpcyBkaWFsb2cgb3IgaXQgd2lsbCBwb3AgdXAgZm9yIGV2ZXJ5IEVYUEVDVC9BU1NFUlRfREVBVEggc3RhdGVtZW50CisgICAgLy8gZXhlY3V0ZWQuIEdvb2dsZSBUZXN0IHdpbGwgbm90aWZ5IHRoZSB1c2VyIG9mIGFueSB1bmV4cGVjdGVkCisgICAgLy8gZmFpbHVyZSB2aWEgc3RkZXJyLgorICAgIC8vCisgICAgLy8gVkMrKyBkb2Vzbid0IGRlZmluZSBfc2V0X2Fib3J0X2JlaGF2aW9yKCkgcHJpb3IgdG8gdGhlIHZlcnNpb24gOC4wLgorICAgIC8vIFVzZXJzIG9mIHByaW9yIFZDIHZlcnNpb25zIHNoYWxsIHN1ZmZlciB0aGUgYWdvbnkgYW5kIHBhaW4gb2YKKyAgICAvLyBjbGlja2luZyB0aHJvdWdoIHRoZSBjb3VudGxlc3MgZGVidWcgZGlhbG9ncy4KKyAgICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBmaW5kIGEgd2F5IHRvIHN1cHByZXNzIHRoZSBhYm9ydCBkaWFsb2coKSBpbiB0aGUKKyAgICAvLyBkZWJ1ZyBtb2RlIHdoZW4gY29tcGlsZWQgd2l0aCBWQyA3LjEgb3IgbG93ZXIuCisgICAgaWYgKCFHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKQorICAgICAgX3NldF9hYm9ydF9iZWhhdmlvcigKKyAgICAgICAgICAweDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAgICAgICAgICBfV1JJVEVfQUJPUlRfTVNHIHwgX0NBTExfUkVQT1JURkFVTFQpOyAgLy8gcG9wLXVwIHdpbmRvdywgY29yZSBkdW1wLgorIyBlbmRpZgorICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworICByZXR1cm4gaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgaW1wbCgpLAorICAgICAgJmludGVybmFsOjpVbml0VGVzdEltcGw6OlJ1bkFsbFRlc3RzLAorICAgICAgImF1eGlsaWFyeSB0ZXN0IGNvZGUgKGVudmlyb25tZW50cyBvciBldmVudCBsaXN0ZW5lcnMpIikgPyAwIDogMTsKK30KKworLy8gUmV0dXJucyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpIHdhcworLy8gZXhlY3V0ZWQuCitjb25zdCBjaGFyKiBVbml0VGVzdDo6b3JpZ2luYWxfd29ya2luZ19kaXIoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+b3JpZ2luYWxfd29ya2luZ19kaXJfLmNfc3RyKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAorLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCitjb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICByZXR1cm4gaW1wbF8tPmN1cnJlbnRfdGVzdF9jYXNlKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAorLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCitjb25zdCBUZXN0SW5mbyogVW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICByZXR1cm4gaW1wbF8tPmN1cnJlbnRfdGVzdF9pbmZvKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgoraW50IFVuaXRUZXN0OjpyYW5kb21fc2VlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5yYW5kb21fc2VlZCgpOyB9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorLy8gUmV0dXJucyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCisvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KK2ludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYKKyAgICBVbml0VGVzdDo6cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkKKyAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIHJldHVybiBpbXBsXy0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIENyZWF0ZXMgYW4gZW1wdHkgVW5pdFRlc3QuCitVbml0VGVzdDo6VW5pdFRlc3QoKSB7CisgIGltcGxfID0gbmV3IGludGVybmFsOjpVbml0VGVzdEltcGwodGhpcyk7Cit9CisKKy8vIERlc3RydWN0b3Igb2YgVW5pdFRlc3QuCitVbml0VGVzdDo6flVuaXRUZXN0KCkgeworICBkZWxldGUgaW1wbF87Cit9CisKKy8vIFB1c2hlcyBhIHRyYWNlIGRlZmluZWQgYnkgU0NPUEVEX1RSQUNFKCkgb24gdG8gdGhlIHBlci10aHJlYWQKKy8vIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgordm9pZCBVbml0VGVzdDo6UHVzaEdUZXN0VHJhY2UoY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucHVzaF9iYWNrKHRyYWNlKTsKK30KKworLy8gUG9wcyBhIHRyYWNlIGZyb20gdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCit2b2lkIFVuaXRUZXN0OjpQb3BHVGVzdFRyYWNlKCkKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5wb3BfYmFjaygpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitVbml0VGVzdEltcGw6OlVuaXRUZXN0SW1wbChVbml0VGVzdCogcGFyZW50KQorICAgIDogcGFyZW50XyhwYXJlbnQpLAorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgICAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzNTUpICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MzU1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2luZyB0aGlzIGluIGluaXRpYWxpemVyKS4KKyAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUgYWdhaW4uCisjZWxzZQorICAgICAgZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCisgICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCisjZW5kaWYgIC8vIF9NU0NfVkVSCisgICAgICBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXygKKyAgICAgICAgICAmZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLAorICAgICAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXygKKyAgICAgICAgICAmZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAgICAgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XygpLAorICAgICAgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXyhmYWxzZSksCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisgICAgICBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8oLTEpLAorICAgICAgY3VycmVudF90ZXN0X2Nhc2VfKE5VTEwpLAorICAgICAgY3VycmVudF90ZXN0X2luZm9fKE5VTEwpLAorICAgICAgYWRfaG9jX3Rlc3RfcmVzdWx0XygpLAorICAgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyhOVUxMKSwKKyAgICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8oZmFsc2UpLAorICAgICAgcmFuZG9tX3NlZWRfKDApLCAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCisgICAgICByYW5kb21fKDApLCAgLy8gV2lsbCBiZSByZXNlZWRlZCBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgc3RhcnRfdGltZXN0YW1wXygwKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCksCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgICAgIGRlYXRoX3Rlc3RfZmFjdG9yeV8obmV3IERlZmF1bHREZWF0aFRlc3RGYWN0b3J5KSwKKyNlbmRpZgorICAgICAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCisgICAgICBjYXRjaF9leGNlcHRpb25zXyhmYWxzZSkgeworICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIobmV3IFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Cit9CisKK1VuaXRUZXN0SW1wbDo6flVuaXRUZXN0SW1wbCgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0Q2FzZS4KKyAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0Q2FzZT4pOworCisgIC8vIERlbGV0ZXMgZXZlcnkgRW52aXJvbm1lbnQuCisgIEZvckVhY2goZW52aXJvbm1lbnRzXywgaW50ZXJuYWw6OkRlbGV0ZTxFbnZpcm9ubWVudD4pOworCisgIGRlbGV0ZSBvc19zdGFja190cmFjZV9nZXR0ZXJfOworfQorCisvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBpbiBhCisvLyBjb250ZXh0IG9mIGEgdGVzdCwgdG8gY3VycmVudCB0ZXN0IGNhc2UncyBhZF9ob2NfdGVzdF9yZXN1bHQgd2hlbiBpbnZva2UKKy8vIGZyb20gU2V0VXBUZXN0Q2FzZS9UZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldAorLy8gb3RoZXJ3aXNlLiAgSWYgdGhlIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksCisvLyB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgordm9pZCBVbml0VGVzdEltcGw6OlJlY29yZFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgeworICBzdGQ6OnN0cmluZyB4bWxfZWxlbWVudDsKKyAgVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQ7ICAvLyBUZXN0UmVzdWx0IGFwcHJvcHJpYXRlIGZvciBwcm9wZXJ0eSByZWNvcmRpbmcuCisKKyAgaWYgKGN1cnJlbnRfdGVzdF9pbmZvXyAhPSBOVUxMKSB7CisgICAgeG1sX2VsZW1lbnQgPSAidGVzdGNhc2UiOworICAgIHRlc3RfcmVzdWx0ID0gJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pOworICB9IGVsc2UgaWYgKGN1cnJlbnRfdGVzdF9jYXNlXyAhPSBOVUxMKSB7CisgICAgeG1sX2VsZW1lbnQgPSAidGVzdHN1aXRlIjsKKyAgICB0ZXN0X3Jlc3VsdCA9ICYoY3VycmVudF90ZXN0X2Nhc2VfLT5hZF9ob2NfdGVzdF9yZXN1bHRfKTsKKyAgfSBlbHNlIHsKKyAgICB4bWxfZWxlbWVudCA9ICJ0ZXN0c3VpdGVzIjsKKyAgICB0ZXN0X3Jlc3VsdCA9ICZhZF9ob2NfdGVzdF9yZXN1bHRfOworICB9CisgIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eSh4bWxfZWxlbWVudCwgdGVzdF9wcm9wZXJ0eSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorLy8gRGlzYWJsZXMgZXZlbnQgZm9yd2FyZGluZyBpZiB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgaW4gYSBkZWF0aCB0ZXN0CisvLyBzdWJwcm9jZXNzLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OlN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCkgeworICBpZiAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCkKKyAgICBsaXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKKy8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVYbWxPdXRwdXQoKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZm9ybWF0ID0gVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKTsKKyAgaWYgKG91dHB1dF9mb3JtYXQgPT0gInhtbCIpIHsKKyAgICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKAorICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpLmNfc3RyKCkpKTsKKyAgfSBlbHNlIGlmIChvdXRwdXRfZm9ybWF0ICE9ICIiKSB7CisgICAgcHJpbnRmKCJXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3V0cHV0IGZvcm1hdCBcIiVzXCIgaWdub3JlZC5cbiIsCisgICAgICAgICAgIG91dHB1dF9mb3JtYXQuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KK30KKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKy8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyBpbiBzdHJpbmcgZm9ybS4KKy8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6Q29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCkgeworICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0ID0gR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKKyAgaWYgKCF0YXJnZXQuZW1wdHkoKSkgeworICAgIGNvbnN0IHNpemVfdCBwb3MgPSB0YXJnZXQuZmluZCgnOicpOworICAgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGxpc3RlbmVycygpLT5BcHBlbmQobmV3IFN0cmVhbWluZ0xpc3RlbmVyKHRhcmdldC5zdWJzdHIoMCwgcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdWJzdHIocG9zKzEpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIHN0cmVhbWluZyB0YXJnZXQgXCIlc1wiIGlnbm9yZWQuXG4iLAorICAgICAgICAgICAgIHRhcmdldC5jX3N0cigpKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KKyAgfQorfQorI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKKy8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCisvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJcyBjYWxsZWQgZnJvbSBJbml0R29vZ2xlVGVzdCBhZnRlciB0aGUgY2FsbCB0bworLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKy8vIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgaGFzIHRvIGJlIGlkZW1wb3RlbnQuCit2b2lkIFVuaXRUZXN0SW1wbDo6UG9zdEZsYWdQYXJzaW5nSW5pdCgpIHsKKyAgLy8gRW5zdXJlcyB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhlY3V0ZSBtb3JlIHRoYW4gb25jZS4KKyAgaWYgKCFwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKSB7CisgICAgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXyA9IHRydWU7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAgIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKTsKKyAgICBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgICAgLy8gUmVnaXN0ZXJzIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFRoaXMgbWFrZXMgcGFyYW1ldGVyaXplZCB0ZXN0cworICAgIC8vIGF2YWlsYWJsZSB0byB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkgd2l0aG91dCBydW5uaW5nCisgICAgLy8gUlVOX0FMTF9URVNUUy4KKyAgICBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOworCisgICAgLy8gQ29uZmlndXJlcyBsaXN0ZW5lcnMgZm9yIFhNTCBvdXRwdXQuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzCisgICAgLy8gdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQgYmVmb3JlIGludm9raW5nIFJVTl9BTExfVEVTVFMuCisgICAgQ29uZmlndXJlWG1sT3V0cHV0KCk7CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgICAgLy8gQ29uZmlndXJlcyBsaXN0ZW5lcnMgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCisgICAgQ29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCk7CisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyAgfQorfQorCisvLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgbmFtZSBvZiBhIFRlc3RDYXNlIGFnYWluc3QgYSBrbm93bgorLy8gdmFsdWUuCisvLworLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdFRlc3QgY2xhc3Mgb25seS4gIFdlIHB1dAorLy8gaXQgaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UgdG8gcHJldmVudCBwb2xsdXRpbmcgdGhlIG91dGVyCisvLyBuYW1lc3BhY2UuCisvLworLy8gVGVzdENhc2VOYW1lSXMgaXMgY29weWFibGUuCitjbGFzcyBUZXN0Q2FzZU5hbWVJcyB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdENhc2VOYW1lSXMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgICA6IG5hbWVfKG5hbWUpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbmFtZSBvZiB0ZXN0X2Nhc2UgbWF0Y2hlcyBuYW1lXy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9jYXNlICE9IE5VTEwgJiYgc3RyY21wKHRlc3RfY2FzZS0+bmFtZSgpLCBuYW1lXy5jX3N0cigpKSA9PSAwOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lXzsKK307CisKKy8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0CisvLyBleGlzdCwgY3JlYXRlcyBvbmUgYW5kIHJldHVybnMgaXQuICBJdCdzIHRoZSBDQUxMRVInUworLy8gUkVTUE9OU0lCSUxJVFkgdG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBXSEVOIFRIRQorLy8gVEVTVFMgQVJFIE5PVCBTSFVGRkxFRC4KKy8vCisvLyBBcmd1bWVudHM6CisvLworLy8gICB0ZXN0X2Nhc2VfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIHR5cGVfcGFyYW06ICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlJ3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgorLy8gICBzZXRfdXBfdGM6ICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCitUZXN0Q2FzZSogVW5pdFRlc3RJbXBsOjpHZXRUZXN0Q2FzZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpIHsKKyAgLy8gQ2FuIHdlIGZpbmQgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lPworICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZSo+Ojpjb25zdF9pdGVyYXRvciB0ZXN0X2Nhc2UgPQorICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfY2FzZXNfLmJlZ2luKCksIHRlc3RfY2FzZXNfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlTmFtZUlzKHRlc3RfY2FzZV9uYW1lKSk7CisKKyAgaWYgKHRlc3RfY2FzZSAhPSB0ZXN0X2Nhc2VzXy5lbmQoKSkKKyAgICByZXR1cm4gKnRlc3RfY2FzZTsKKworICAvLyBOby4gIExldCdzIGNyZWF0ZSBvbmUuCisgIFRlc3RDYXNlKiBjb25zdCBuZXdfdGVzdF9jYXNlID0KKyAgICAgIG5ldyBUZXN0Q2FzZSh0ZXN0X2Nhc2VfbmFtZSwgdHlwZV9wYXJhbSwgc2V0X3VwX3RjLCB0ZWFyX2Rvd25fdGMpOworCisgIC8vIElzIHRoaXMgYSBkZWF0aCB0ZXN0IGNhc2U/CisgIGlmIChpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVhdGhUZXN0Q2FzZUZpbHRlcikpIHsKKyAgICAvLyBZZXMuICBJbnNlcnRzIHRoZSB0ZXN0IGNhc2UgYWZ0ZXIgdGhlIGxhc3QgZGVhdGggdGVzdCBjYXNlCisgICAgLy8gZGVmaW5lZCBzbyBmYXIuICBUaGlzIG9ubHkgd29ya3Mgd2hlbiB0aGUgdGVzdCBjYXNlcyBoYXZlbid0CisgICAgLy8gYmVlbiBzaHVmZmxlZC4gIE90aGVyd2lzZSB3ZSBtYXkgZW5kIHVwIHJ1bm5pbmcgYSBkZWF0aCB0ZXN0CisgICAgLy8gYWZ0ZXIgYSBub24tZGVhdGggdGVzdC4KKyAgICArK2xhc3RfZGVhdGhfdGVzdF9jYXNlXzsKKyAgICB0ZXN0X2Nhc2VzXy5pbnNlcnQodGVzdF9jYXNlc18uYmVnaW4oKSArIGxhc3RfZGVhdGhfdGVzdF9jYXNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rlc3RfY2FzZSk7CisgIH0gZWxzZSB7CisgICAgLy8gTm8uICBBcHBlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgdGVzdF9jYXNlc18ucHVzaF9iYWNrKG5ld190ZXN0X2Nhc2UpOworICB9CisKKyAgdGVzdF9jYXNlX2luZGljZXNfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZV9pbmRpY2VzXy5zaXplKCkpKTsKKyAgcmV0dXJuIG5ld190ZXN0X2Nhc2U7Cit9CisKKy8vIEhlbHBlcnMgZm9yIHNldHRpbmcgdXAgLyB0ZWFyaW5nIGRvd24gdGhlIGdpdmVuIGVudmlyb25tZW50LiAgVGhleQorLy8gYXJlIGZvciB1c2UgaW4gdGhlIEZvckVhY2goKSBmdW5jdGlvbi4KK3N0YXRpYyB2b2lkIFNldFVwRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeyBlbnYtPlNldFVwKCk7IH0KK3N0YXRpYyB2b2lkIFRlYXJEb3duRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeyBlbnYtPlRlYXJEb3duKCk7IH0KKworLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QsIHByaW50cyB0aGUgcmVzdWx0LCBhbmQKKy8vIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgYXJlIHN1Y2Nlc3NmdWwuICBJZiBhbnkgZXhjZXB0aW9uIGlzCisvLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhlIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dCB0aGUKKy8vIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLgorLy8KKy8vIFdoZW4gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCwgaXQgZXhwYW5kcyBhbmQgcmVnaXN0ZXJzCisvLyBwYXJhbWV0ZXJpemVkIHRlc3RzIGZpcnN0IGluIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkuCisvLyBBbGwgb3RoZXIgZnVuY3Rpb25zIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzKCkgbWF5IHNhZmVseSBhc3N1bWUgdGhhdAorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgcmVhZHkgdG8gYmUgY291bnRlZCBhbmQgcnVuLgorYm9vbCBVbml0VGVzdEltcGw6OlJ1bkFsbFRlc3RzKCkgeworICAvLyBNYWtlcyBzdXJlIEluaXRHb29nbGVUZXN0KCkgd2FzIGNhbGxlZC4KKyAgaWYgKCFHVGVzdElzSW5pdGlhbGl6ZWQoKSkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiXG5UaGlzIHRlc3QgcHJvZ3JhbSBkaWQgTk9UIGNhbGwgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCAiCisgICAgICAgICAgICJiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuICBQbGVhc2UgZml4IGl0LlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRG8gbm90IHJ1biBhbnkgdGVzdCBpZiB0aGUgLS1oZWxwIGZsYWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgKGdfaGVscF9mbGFnKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFJlcGVhdHMgdGhlIGNhbGwgdG8gdGhlIHBvc3QtZmxhZyBwYXJzaW5nIGluaXRpYWxpemF0aW9uIGluIGNhc2UgdGhlCisgIC8vIHVzZXIgZGlkbid0IGNhbGwgSW5pdEdvb2dsZVRlc3QuCisgIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKKworICAvLyBFdmVuIGlmIHNoYXJkaW5nIGlzIG5vdCBvbiwgdGVzdCBydW5uZXJzIG1heSB3YW50IHRvIHVzZSB0aGUKKyAgLy8gR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgdG8gcXVlcnkgd2hldGhlciB0aGUgdGVzdCBzdXBwb3J0cyB0aGUgc2hhcmRpbmcKKyAgLy8gcHJvdG9jb2wuCisgIGludGVybmFsOjpXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKKworICAvLyBUcnVlIGlmZiB3ZSBhcmUgaW4gYSBzdWJwcm9jZXNzIGZvciBydW5uaW5nIGEgdGhyZWFkLXNhZmUtc3R5bGUKKyAgLy8gZGVhdGggdGVzdC4KKyAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gZmFsc2U7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIGNvbnN0IGJvb2wgc2hvdWxkX3NoYXJkID0gU2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOworCisgIC8vIENvbXBhcmVzIHRoZSBmdWxsIHRlc3QgbmFtZXMgd2l0aCB0aGUgZmlsdGVyIHRvIGRlY2lkZSB3aGljaAorICAvLyB0ZXN0cyB0byBydW4uCisgIGNvbnN0IGJvb2wgaGFzX3Rlc3RzX3RvX3J1biA9IEZpbHRlclRlc3RzKHNob3VsZF9zaGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IElHTk9SRV9TSEFSRElOR19QUk9UT0NPTCkgPiAwOworCisgIC8vIExpc3RzIHRoZSB0ZXN0cyBhbmQgZXhpdHMgaWYgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdhcyBzcGVjaWZpZWQuCisgIGlmIChHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB7CisgICAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIEZpbHRlclRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkLgorICAgIExpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByYW5kb21fc2VlZF8gPSBHVEVTVF9GTEFHKHNodWZmbGUpID8KKyAgICAgIEdldFJhbmRvbVNlZWRGcm9tRmxhZyhHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgOiAwOworCisgIC8vIFRydWUgaWZmIGF0IGxlYXN0IG9uZSB0ZXN0IGhhcyBmYWlsZWQuCisgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gbGlzdGVuZXJzKCktPnJlcGVhdGVyKCk7CisKKyAgc3RhcnRfdGltZXN0YW1wXyA9IEdldFRpbWVJbk1pbGxpcygpOworICByZXBlYXRlci0+T25UZXN0UHJvZ3JhbVN0YXJ0KCpwYXJlbnRfKTsKKworICAvLyBIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIHRlc3RzPyAgV2UgZG9uJ3Qgd2FudCB0byByZXBlYXQgdGhlbQorICAvLyB3aGVuIHdlIGFyZSBpbnNpZGUgdGhlIHN1YnByb2Nlc3Mgb2YgYSBkZWF0aCB0ZXN0LgorICBjb25zdCBpbnQgcmVwZWF0ID0gaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA/IDEgOiBHVEVTVF9GTEFHKHJlcGVhdCk7CisgIC8vIFJlcGVhdHMgZm9yZXZlciBpZiB0aGUgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLgorICBjb25zdCBib29sIGZvcmV2ZXIgPSByZXBlYXQgPCAwOworICBmb3IgKGludCBpID0gMDsgZm9yZXZlciB8fCBpICE9IHJlcGVhdDsgaSsrKSB7CisgICAgLy8gV2Ugd2FudCB0byBwcmVzZXJ2ZSBmYWlsdXJlcyBnZW5lcmF0ZWQgYnkgYWQtaG9jIHRlc3QKKyAgICAvLyBhc3NlcnRpb25zIGV4ZWN1dGVkIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkuCisgICAgQ2xlYXJOb25BZEhvY1Rlc3RSZXN1bHQoKTsKKworICAgIGNvbnN0IFRpbWVJbk1pbGxpcyBzdGFydCA9IEdldFRpbWVJbk1pbGxpcygpOworCisgICAgLy8gU2h1ZmZsZXMgdGVzdCBjYXNlcyBhbmQgdGVzdHMgaWYgcmVxdWVzdGVkLgorICAgIGlmIChoYXNfdGVzdHNfdG9fcnVuICYmIEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICAgIHJhbmRvbSgpLT5SZXNlZWQocmFuZG9tX3NlZWRfKTsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgT25UZXN0SXRlcmF0aW9uU3RhcnQoKSwKKyAgICAgIC8vIHN1Y2ggdGhhdCBhIHRlc3QgZXZlbnQgbGlzdGVuZXIgY2FuIHNlZSB0aGUgYWN0dWFsIHRlc3Qgb3JkZXIKKyAgICAgIC8vIGluIHRoZSBldmVudC4KKyAgICAgIFNodWZmbGVUZXN0cygpOworICAgIH0KKworICAgIC8vIFRlbGxzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXJzIHRoYXQgdGhlIHRlc3RzIGFyZSBhYm91dCB0byBzdGFydC4KKyAgICByZXBlYXRlci0+T25UZXN0SXRlcmF0aW9uU3RhcnQoKnBhcmVudF8sIGkpOworCisgICAgLy8gUnVucyBlYWNoIHRlc3QgY2FzZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdGVzdCB0byBydW4uCisgICAgaWYgKGhhc190ZXN0c190b19ydW4pIHsKKyAgICAgIC8vIFNldHMgdXAgYWxsIGVudmlyb25tZW50cyBiZWZvcmVoYW5kLgorICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCgqcGFyZW50Xyk7CisgICAgICBGb3JFYWNoKGVudmlyb25tZW50c18sIFNldFVwRW52aXJvbm1lbnQpOworICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzU2V0VXBFbmQoKnBhcmVudF8pOworCisgICAgICAvLyBSdW5zIHRoZSB0ZXN0cyBvbmx5IGlmIHRoZXJlIHdhcyBubyBmYXRhbCBmYWlsdXJlIGR1cmluZyBnbG9iYWwKKyAgICAgIC8vIHNldC11cC4KKyAgICAgIGlmICghVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAgICAgZm9yIChpbnQgdGVzdF9pbmRleCA9IDA7IHRlc3RfaW5kZXggPCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKKyAgICAgICAgICAgICB0ZXN0X2luZGV4KyspIHsKKyAgICAgICAgICBHZXRNdXRhYmxlVGVzdENhc2UodGVzdF9pbmRleCktPlJ1bigpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRlYXJzIGRvd24gYWxsIGVudmlyb25tZW50cyBpbiByZXZlcnNlIG9yZGVyIGFmdGVyd2FyZHMuCisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KCpwYXJlbnRfKTsKKyAgICAgIHN0ZDo6Zm9yX2VhY2goZW52aXJvbm1lbnRzXy5yYmVnaW4oKSwgZW52aXJvbm1lbnRzXy5yZW5kKCksCisgICAgICAgICAgICAgICAgICAgIFRlYXJEb3duRW52aXJvbm1lbnQpOworICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoKnBhcmVudF8pOworICAgIH0KKworICAgIGVsYXBzZWRfdGltZV8gPSBHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0OworCisgICAgLy8gVGVsbHMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lciB0aGF0IHRoZSB0ZXN0cyBoYXZlIGp1c3QgZmluaXNoZWQuCisgICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvbkVuZCgqcGFyZW50XywgaSk7CisKKyAgICAvLyBHZXRzIHRoZSByZXN1bHQgYW5kIGNsZWFycyBpdC4KKyAgICBpZiAoIVBhc3NlZCgpKSB7CisgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFJlc3RvcmVzIHRoZSBvcmlnaW5hbCB0ZXN0IG9yZGVyIGFmdGVyIHRoZSBpdGVyYXRpb24uICBUaGlzCisgICAgLy8gYWxsb3dzIHRoZSB1c2VyIHRvIHF1aWNrbHkgcmVwcm8gYSBmYWlsdXJlIHRoYXQgaGFwcGVucyBpbiB0aGUKKyAgICAvLyBOLXRoIGl0ZXJhdGlvbiB3aXRob3V0IHJlcGVhdGluZyB0aGUgZmlyc3QgKE4gLSAxKSBpdGVyYXRpb25zLgorICAgIC8vIFRoaXMgaXMgbm90IGVuY2xvc2VkIGluICJpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeyAuLi4gfSIsIGluCisgICAgLy8gY2FzZSB0aGUgdXNlciBzb21laG93IGNoYW5nZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHNvbWV3aGVyZQorICAgIC8vIChpdCdzIGFsd2F5cyBzYWZlIHRvIHVuc2h1ZmZsZSB0aGUgdGVzdHMpLgorICAgIFVuc2h1ZmZsZVRlc3RzKCk7CisKKyAgICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgICAgLy8gUGlja3MgYSBuZXcgcmFuZG9tIHNlZWQgZm9yIGVhY2ggaXRlcmF0aW9uLgorICAgICAgcmFuZG9tX3NlZWRfID0gR2V0TmV4dFJhbmRvbVNlZWQocmFuZG9tX3NlZWRfKTsKKyAgICB9CisgIH0KKworICByZXBlYXRlci0+T25UZXN0UHJvZ3JhbUVuZCgqcGFyZW50Xyk7CisKKyAgcmV0dXJuICFmYWlsZWQ7Cit9CisKKy8vIFJlYWRzIHRoZSBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kIGNyZWF0ZXMgdGhlIGZpbGUKKy8vIGlmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LiBJZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbiwgdGhpcworLy8gZnVuY3Rpb24gd2lsbCB3cml0ZSBvdmVyIGl0LiBJZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudCwgYnV0IHRoZSBmaWxlIGNhbm5vdAorLy8gYmUgY3JlYXRlZCwgcHJpbnRzIGFuIGVycm9yIGFuZCBleGl0cy4KK3ZvaWQgV3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCkgeworICBjb25zdCBjaGFyKiBjb25zdCB0ZXN0X3NoYXJkX2ZpbGUgPSBwb3NpeDo6R2V0RW52KGtUZXN0U2hhcmRTdGF0dXNGaWxlKTsKKyAgaWYgKHRlc3Rfc2hhcmRfZmlsZSAhPSBOVUxMKSB7CisgICAgRklMRSogY29uc3QgZmlsZSA9IHBvc2l4OjpGT3Blbih0ZXN0X3NoYXJkX2ZpbGUsICJ3Iik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gdGhlIHRlc3Qgc2hhcmQgc3RhdHVzIGZpbGUgXCIlc1wiICIKKyAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllZCBieSB0aGUgJXMgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3NoYXJkX2ZpbGUsIGtUZXN0U2hhcmRTdGF0dXNGaWxlKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgICBmY2xvc2UoZmlsZSk7CisgIH0KK30KKworLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50CisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCisvLyBidXQgaW5jb25zaXN0ZW50IChpLmUuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKKy8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKKy8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKKy8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgorYm9vbCBTaG91bGRTaGFyZChjb25zdCBjaGFyKiB0b3RhbF9zaGFyZHNfZW52LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFyZF9pbmRleF9lbnYsCisgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgeworICBpZiAoaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IEludDMyRnJvbUVudk9yRGllKHRvdGFsX3NoYXJkc19lbnYsIC0xKTsKKyAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShzaGFyZF9pbmRleF9lbnYsIC0xKTsKKworICBpZiAodG90YWxfc2hhcmRzID09IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCAhPSAtMSkgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKKyAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiID0gIiA8PCBzaGFyZF9pbmRleAorICAgICAgPDwgIiwgYnV0IGhhdmUgbGVmdCAiIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiB1bnNldC5cbiI7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0gZWxzZSBpZiAodG90YWxfc2hhcmRzICE9IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7CisgICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKKyAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogeW91IGhhdmUgIgorICAgICAgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiID0gIiA8PCB0b3RhbF9zaGFyZHMKKyAgICAgIDw8ICIsIGJ1dCBoYXZlIGxlZnQgIiA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiB1bnNldC5cbiI7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0gZWxzZSBpZiAoc2hhcmRfaW5kZXggPCAwIHx8IHNoYXJkX2luZGV4ID49IHRvdGFsX3NoYXJkcykgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHdlIHJlcXVpcmUgMCA8PSAiCisgICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA8ICIgPDwga1Rlc3RUb3RhbFNoYXJkcworICAgICAgPDwgIiwgYnV0IHlvdSBoYXZlICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICI9IiA8PCBzaGFyZF9pbmRleAorICAgICAgPDwgIiwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICI9IiA8PCB0b3RhbF9zaGFyZHMgPDwgIi5cbiI7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKworICByZXR1cm4gdG90YWxfc2hhcmRzID4gMTsKK30KKworLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YXIgYXMgYW4gSW50MzIuIElmIGl0IGlzIHVuc2V0LAorLy8gcmV0dXJucyBkZWZhdWx0X3ZhbC4gSWYgaXQgaXMgbm90IGFuIEludDMyLCBwcmludHMgYW4gZXJyb3IKKy8vIGFuZCBhYm9ydHMuCitJbnQzMiBJbnQzMkZyb21FbnZPckRpZShjb25zdCBjaGFyKiB2YXIsIEludDMyIGRlZmF1bHRfdmFsKSB7CisgIGNvbnN0IGNoYXIqIHN0cl92YWwgPSBwb3NpeDo6R2V0RW52KHZhcik7CisgIGlmIChzdHJfdmFsID09IE5VTEwpIHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWw7CisgIH0KKworICBJbnQzMiByZXN1bHQ7CisgIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSAiIDw8IHZhciwKKyAgICAgICAgICAgICAgICAgIHN0cl92YWwsICZyZXN1bHQpKSB7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzLCB0aGUgc2hhcmQgaW5kZXgsIGFuZCB0aGUgdGVzdCBpZCwKKy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biBvbiB0aGlzIHNoYXJkLiBUaGUgdGVzdCBpZCBpcworLy8gc29tZSBhcmJpdHJhcnkgYnV0IHVuaXF1ZSBub24tbmVnYXRpdmUgaW50ZWdlciBhc3NpZ25lZCB0byBlYWNoIHRlc3QKKy8vIG1ldGhvZC4gQXNzdW1lcyB0aGF0IDAgPD0gc2hhcmRfaW5kZXggPCB0b3RhbF9zaGFyZHMuCitib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpIHsKKyAgcmV0dXJuICh0ZXN0X2lkICUgdG90YWxfc2hhcmRzKSA9PSBzaGFyZF9pbmRleDsKK30KKworLy8gQ29tcGFyZXMgdGhlIG5hbWUgb2YgZWFjaCB0ZXN0IHdpdGggdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciB0bworLy8gZGVjaWRlIHdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biwgdGhlbiByZWNvcmRzIHRoZSByZXN1bHQgaW4KKy8vIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KKy8vIElmIHNoYXJkX3Rlc3RzID09IHRydWUsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cyBiYXNlZCBvbiBzaGFyZGluZworLy8gdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudCAtIHNlZQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9Hb29nbGVUZXN0QWR2YW5jZWRHdWlkZS4KKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3RJbXBsOjpGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpIHsKKyAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPworICAgICAgSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RUb3RhbFNoYXJkcywgLTEpIDogLTE7CisgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPworICAgICAgSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RTaGFyZEluZGV4LCAtMSkgOiAtMTsKKworICAvLyBudW1fcnVubmFibGVfdGVzdHMgYXJlIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCB3aWxsCisgIC8vIHJ1biBhY3Jvc3MgYWxsIHNoYXJkcyAoaS5lLiwgbWF0Y2ggZmlsdGVyIGFuZCBhcmUgbm90IGRpc2FibGVkKS4KKyAgLy8gbnVtX3NlbGVjdGVkX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHJ1biBvbgorICAvLyB0aGlzIHNoYXJkLgorICBpbnQgbnVtX3J1bm5hYmxlX3Rlc3RzID0gMDsKKyAgaW50IG51bV9zZWxlY3RlZF90ZXN0cyA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gdGVzdF9jYXNlc19baV07CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfY2FzZV9uYW1lID0gdGVzdF9jYXNlLT5uYW1lKCk7CisgICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bihmYWxzZSk7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgeworICAgICAgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRlc3RfbmFtZSh0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICAvLyBBIHRlc3QgaXMgZGlzYWJsZWQgaWYgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMKKyAgICAgIC8vIGtEaXNhYmxlVGVzdEZpbHRlci4KKyAgICAgIGNvbnN0IGJvb2wgaXNfZGlzYWJsZWQgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpIHx8CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpOworICAgICAgdGVzdF9pbmZvLT5pc19kaXNhYmxlZF8gPSBpc19kaXNhYmxlZDsKKworICAgICAgY29uc3QgYm9vbCBtYXRjaGVzX2ZpbHRlciA9CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTsKKyAgICAgIHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfID0gbWF0Y2hlc19maWx0ZXI7CisKKyAgICAgIGNvbnN0IGJvb2wgaXNfcnVubmFibGUgPQorICAgICAgICAgIChHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSB8fCAhaXNfZGlzYWJsZWQpICYmCisgICAgICAgICAgbWF0Y2hlc19maWx0ZXI7CisKKyAgICAgIGNvbnN0IGJvb2wgaXNfc2VsZWN0ZWQgPSBpc19ydW5uYWJsZSAmJgorICAgICAgICAgIChzaGFyZF90ZXN0cyA9PSBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wgfHwKKyAgICAgICAgICAgU2hvdWxkUnVuVGVzdE9uU2hhcmQodG90YWxfc2hhcmRzLCBzaGFyZF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3J1bm5hYmxlX3Rlc3RzKSk7CisKKyAgICAgIG51bV9ydW5uYWJsZV90ZXN0cyArPSBpc19ydW5uYWJsZTsKKyAgICAgIG51bV9zZWxlY3RlZF90ZXN0cyArPSBpc19zZWxlY3RlZDsKKworICAgICAgdGVzdF9pbmZvLT5zaG91bGRfcnVuXyA9IGlzX3NlbGVjdGVkOworICAgICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bih0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSB8fCBpc19zZWxlY3RlZCk7CisgICAgfQorICB9CisgIHJldHVybiBudW1fc2VsZWN0ZWRfdGVzdHM7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gQy1zdHJpbmcgb24gYSBzaW5nbGUgbGluZSBieSByZXBsYWNpbmcgYWxsICdcbicKKy8vIGNoYXJhY3RlcnMgd2l0aCBzdHJpbmcgIlxcbiIuICBJZiB0aGUgb3V0cHV0IHRha2VzIG1vcmUgdGhhbgorLy8gbWF4X2xlbmd0aCBjaGFyYWN0ZXJzLCBvbmx5IHByaW50cyB0aGUgZmlyc3QgbWF4X2xlbmd0aCBjaGFyYWN0ZXJzCisvLyBhbmQgIi4uLiIuCitzdGF0aWMgdm9pZCBQcmludE9uT25lTGluZShjb25zdCBjaGFyKiBzdHIsIGludCBtYXhfbGVuZ3RoKSB7CisgIGlmIChzdHIgIT0gTlVMTCkgeworICAgIGZvciAoaW50IGkgPSAwOyAqc3RyICE9ICdcMCc7ICsrc3RyKSB7CisgICAgICBpZiAoaSA+PSBtYXhfbGVuZ3RoKSB7CisgICAgICAgIHByaW50ZigiLi4uIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCpzdHIgPT0gJ1xuJykgeworICAgICAgICBwcmludGYoIlxcbiIpOworICAgICAgICBpICs9IDI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVjIiwgKnN0cik7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgbWF0Y2hpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBmbGFnLgordm9pZCBVbml0VGVzdEltcGw6Okxpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCkgeworICAvLyBQcmludCBhdCBtb3N0IHRoaXMgbWFueSBjaGFyYWN0ZXJzIGZvciBlYWNoIHR5cGUvdmFsdWUgcGFyYW1ldGVyLgorICBjb25zdCBpbnQga01heFBhcmFtTGVuZ3RoID0gMjUwOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gdGVzdF9jYXNlc19baV07CisgICAgYm9vbCBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgeworICAgICAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgICAgICAgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOworICAgICAgaWYgKHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfKSB7CisgICAgICAgIGlmICghcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSkgeworICAgICAgICAgIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSB0cnVlOworICAgICAgICAgIHByaW50ZigiJXMuIiwgdGVzdF9jYXNlLT5uYW1lKCkpOworICAgICAgICAgIGlmICh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGYoIiAgIyAlcyA9ICIsIGtUeXBlUGFyYW1MYWJlbCk7CisgICAgICAgICAgICAvLyBXZSBwcmludCB0aGUgdHlwZSBwYXJhbWV0ZXIgb24gYSBzaW5nbGUgbGluZSB0byBtYWtlCisgICAgICAgICAgICAvLyB0aGUgb3V0cHV0IGVhc3kgdG8gcGFyc2UgYnkgYSBwcm9ncmFtLgorICAgICAgICAgICAgUHJpbnRPbk9uZUxpbmUodGVzdF9jYXNlLT50eXBlX3BhcmFtKCksIGtNYXhQYXJhbUxlbmd0aCk7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiAgJXMiLCB0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICAgIGlmICh0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgICAgICAgIHByaW50ZigiICAjICVzID0gIiwga1ZhbHVlUGFyYW1MYWJlbCk7CisgICAgICAgICAgLy8gV2UgcHJpbnQgdGhlIHZhbHVlIHBhcmFtZXRlciBvbiBhIHNpbmdsZSBsaW5lIHRvIG1ha2UgdGhlCisgICAgICAgICAgLy8gb3V0cHV0IGVhc3kgdG8gcGFyc2UgYnkgYSBwcm9ncmFtLgorICAgICAgICAgIFByaW50T25PbmVMaW5lKHRlc3RfaW5mby0+dmFsdWVfcGFyYW0oKSwga01heFBhcmFtTGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgICB9CisgICAgfQorICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisvLworLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGFyZQorLy8gdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlIGlucHV0IHRoZQorLy8gY3VycmVudCBnZXR0ZXIuCit2b2lkIFVuaXRUZXN0SW1wbDo6c2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcigKKyAgICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcikgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyAhPSBnZXR0ZXIpIHsKKyAgICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKKyAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gZ2V0dGVyOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOworLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKy8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCitPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIFVuaXRUZXN0SW1wbDo6b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCkgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9PSBOVUxMKSB7CisgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IG5ldyBPc1N0YWNrVHJhY2VHZXR0ZXI7CisgIH0KKworICByZXR1cm4gb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCitUZXN0UmVzdWx0KiBVbml0VGVzdEltcGw6OmN1cnJlbnRfdGVzdF9yZXN1bHQoKSB7CisgIHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb18gPworICAgICAgJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pIDogJmFkX2hvY190ZXN0X3Jlc3VsdF87Cit9CisKKy8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKKy8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTaHVmZmxlVGVzdHMoKSB7CisgIC8vIFNodWZmbGVzIHRoZSBkZWF0aCB0ZXN0IGNhc2VzLgorICBTaHVmZmxlUmFuZ2UocmFuZG9tKCksIDAsIGxhc3RfZGVhdGhfdGVzdF9jYXNlXyArIDEsICZ0ZXN0X2Nhc2VfaW5kaWNlc18pOworCisgIC8vIFNodWZmbGVzIHRoZSBub24tZGVhdGggdGVzdCBjYXNlcy4KKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VzXy5zaXplKCkpLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKKworICAvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW5zaWRlIGVhY2ggdGVzdCBjYXNlLgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgdGVzdF9jYXNlc19baV0tPlNodWZmbGVUZXN0cyhyYW5kb20oKSk7CisgIH0KK30KKworLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpVbnNodWZmbGVUZXN0cygpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIC8vIFVuc2h1ZmZsZXMgdGhlIHRlc3RzIGluIGVhY2ggdGVzdCBjYXNlLgorICAgIHRlc3RfY2FzZXNfW2ldLT5VbnNodWZmbGVUZXN0cygpOworICAgIC8vIFJlc2V0cyB0aGUgaW5kZXggb2YgZWFjaCB0ZXN0IGNhc2UuCisgICAgdGVzdF9jYXNlX2luZGljZXNfW2ldID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorLy8KKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCisvLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitzdGQ6OnN0cmluZyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKFVuaXRUZXN0KiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcF9jb3VudCkgeworICAvLyBXZSBwYXNzIHNraXBfY291bnQgKyAxIHRvIHNraXAgdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGluIGFkZGl0aW9uCisgIC8vIHRvIHdoYXQgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIHRvIHNraXAuCisgIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChza2lwX2NvdW50ICsgMSk7Cit9CisKKy8vIFVzZWQgYnkgdGhlIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18gbWFjcm8gdG8KKy8vIHN1cHByZXNzIHVucmVhY2hhYmxlIGNvZGUgd2FybmluZ3MuCituYW1lc3BhY2UgeworY2xhc3MgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUge307Cit9CisKK2Jvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKSB7IHJldHVybiBjb25kaXRpb247IH0KKworYm9vbCBBbHdheXNUcnVlKCkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgIC8vIFRoaXMgY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZSBzbyBBbHdheXNUcnVlKCkgbmV2ZXIgYWN0dWFsbHkgdGhyb3dzLAorICAvLyBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoYXQgaXQgbWF5IHRocm93LgorICBpZiAoSXNUcnVlKGZhbHNlKSkKKyAgICB0aHJvdyBDbGFzc1VuaXF1ZVRvQWx3YXlzVHJ1ZSgpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKKy8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAorLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgorYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpIHsKKyAgY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgaWYgKHN0cm5jbXAoKnBzdHIsIHByZWZpeCwgcHJlZml4X2xlbikgPT0gMCkgeworICAgICpwc3RyICs9IHByZWZpeF9sZW47CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgYXMgYSBjb21tYW5kIGxpbmUgZmxhZy4gIFRoZSBzdHJpbmcgc2hvdWxkIGhhdmUKKy8vIHRoZSBmb3JtYXQgIi0tZmxhZz12YWx1ZSIuICBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCB0aGUgIj12YWx1ZSIKKy8vIHBhcnQgY2FuIGJlIG9taXR0ZWQuCisvLworLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcsIG9yIE5VTEwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorY29uc3QgY2hhciogUGFyc2VGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmX29wdGlvbmFsKSB7CisgIC8vIHN0ciBhbmQgZmxhZyBtdXN0IG5vdCBiZSBOVUxMLgorICBpZiAoc3RyID09IE5VTEwgfHwgZmxhZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAvLyBUaGUgZmxhZyBtdXN0IHN0YXJ0IHdpdGggIi0tIiBmb2xsb3dlZCBieSBHVEVTVF9GTEFHX1BSRUZJWF8uCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYWdfc3RyID0gc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBmbGFnOworICBjb25zdCBzaXplX3QgZmxhZ19sZW4gPSBmbGFnX3N0ci5sZW5ndGgoKTsKKyAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgLy8gU2tpcHMgdGhlIGZsYWcgbmFtZS4KKyAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsKKworICAvLyBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCBpdCdzIE9LIHRvIG5vdCBoYXZlIGEgIj12YWx1ZSIgcGFydC4KKyAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHsKKyAgICByZXR1cm4gZmxhZ19lbmQ7CisgIH0KKworICAvLyBJZiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG1vcmUgY2hhcmFjdGVycyBhZnRlciB0aGUKKyAgLy8gZmxhZyBuYW1lLCBvciBpZiBkZWZfb3B0aW9uYWwgaXMgZmFsc2UsIHRoZXJlIG11c3QgYmUgYSAnPScgYWZ0ZXIKKyAgLy8gdGhlIGZsYWcgbmFtZS4KKyAgaWYgKGZsYWdfZW5kWzBdICE9ICc9JykgcmV0dXJuIE5VTEw7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4KKyAgcmV0dXJuIGZsYWdfZW5kICsgMTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIGJvb2wgZmxhZywgaW4gdGhlIGZvcm0gb2YgZWl0aGVyCisvLyAiLS1mbGFnPXZhbHVlIiBvciAiLS1mbGFnIi4KKy8vCisvLyBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlIGFzIGxvbmcgYXMgaXQgZG9lcworLy8gbm90IHN0YXJ0IHdpdGggJzAnLCAnZicsIG9yICdGJy4KKy8vCisvLyBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlQm9vbEZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBib29sKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCB0cnVlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgYm9vbC4KKyAgKnZhbHVlID0gISgqdmFsdWVfc3RyID09ICcwJyB8fCAqdmFsdWVfc3RyID09ICdmJyB8fCAqdmFsdWVfc3RyID09ICdGJyk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUludDMyRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIEludDMyKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgorICByZXR1cm4gUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBmbGFnIC0tIiA8PCBmbGFnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHZhbHVlKTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIHN0cmluZyBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VTdHJpbmdGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgICp2YWx1ZSA9IHZhbHVlX3N0cjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBoYXMgYSBwcmVmaXggdGhhdCBHb29nbGUgVGVzdCB1c2VzIGZvciBpdHMKKy8vIGZsYWdzLCBpLmUuLCBzdGFydHMgd2l0aCBHVEVTVF9GTEFHX1BSRUZJWF8gb3IgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8uCisvLyBJZiBHb29nbGUgVGVzdCBkZXRlY3RzIHRoYXQgYSBjb21tYW5kIGxpbmUgZmxhZyBoYXMgaXRzIHByZWZpeCBidXQgaXMgbm90CisvLyByZWNvZ25pemVkLCBpdCB3aWxsIHByaW50IGl0cyBoZWxwIG1lc3NhZ2UuIEZsYWdzIHN0YXJ0aW5nIHdpdGgKKy8vIEdURVNUX0lOVEVSTkFMX1BSRUZJWF8gZm9sbG93ZWQgYnkgImludGVybmFsXyIgYXJlIGNvbnNpZGVyZWQgR29vZ2xlIFRlc3QKKy8vIGludGVybmFsIGZsYWdzIGFuZCBkbyBub3QgdHJpZ2dlciB0aGUgaGVscCBtZXNzYWdlLgorc3RhdGljIGJvb2wgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiAoU2tpcFByZWZpeCgiLS0iLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoIi0iLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoIi8iLCAmc3RyKSkgJiYKKyAgICAgICAgICFTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXyAiaW50ZXJuYWxfIiwgJnN0cikgJiYKKyAgICAgICAgIChTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXywgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLCAmc3RyKSk7Cit9CisKKy8vIFByaW50cyBhIHN0cmluZyBjb250YWluaW5nIGNvZGUtZW5jb2RlZCB0ZXh0LiAgVGhlIGZvbGxvd2luZyBlc2NhcGUKKy8vIHNlcXVlbmNlcyBjYW4gYmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNvbnRyb2wgdGhlIHRleHQgY29sb3I6CisvLworLy8gICBAQCAgICBwcmludHMgYSBzaW5nbGUgJ0AnIGNoYXJhY3Rlci4KKy8vICAgQFIgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gcmVkLgorLy8gICBARyAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byBncmVlbi4KKy8vICAgQFkgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8geWVsbG93LgorLy8gICBARCAgICBjaGFuZ2VzIHRvIHRoZSBkZWZhdWx0IHRlcm1pbmFsIHRleHQgY29sb3IuCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFdyaXRlIHRlc3RzIGZvciB0aGlzIG9uY2Ugd2UgYWRkIHN0ZG91dAorLy8gY2FwdHVyaW5nIHRvIEdvb2dsZSBUZXN0Lgorc3RhdGljIHZvaWQgUHJpbnRDb2xvckVuY29kZWQoY29uc3QgY2hhciogc3RyKSB7CisgIEdUZXN0Q29sb3IgY29sb3IgPSBDT0xPUl9ERUZBVUxUOyAgLy8gVGhlIGN1cnJlbnQgY29sb3IuCisKKyAgLy8gQ29uY2VwdHVhbGx5LCB3ZSBzcGxpdCB0aGUgc3RyaW5nIGludG8gc2VnbWVudHMgZGl2aWRlZCBieSBlc2NhcGUKKyAgLy8gc2VxdWVuY2VzLiAgVGhlbiB3ZSBwcmludCBvbmUgc2VnbWVudCBhdCBhIHRpbWUuICBBdCB0aGUgZW5kIG9mCisgIC8vIGVhY2ggaXRlcmF0aW9uLCB0aGUgc3RyIHBvaW50ZXIgYWR2YW5jZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgLy8gbmV4dCBzZWdtZW50LgorICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciogcCA9IHN0cmNocihzdHIsICdAJyk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiJXMiLCBzdGQ6OnN0cmluZyhzdHIsIHApLmNfc3RyKCkpOworCisgICAgY29uc3QgY2hhciBjaCA9IHBbMV07CisgICAgc3RyID0gcCArIDI7CisgICAgaWYgKGNoID09ICdAJykgeworICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIkAiKTsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdEJykgeworICAgICAgY29sb3IgPSBDT0xPUl9ERUZBVUxUOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1InKSB7CisgICAgICBjb2xvciA9IENPTE9SX1JFRDsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdHJykgeworICAgICAgY29sb3IgPSBDT0xPUl9HUkVFTjsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdZJykgeworICAgICAgY29sb3IgPSBDT0xPUl9ZRUxMT1c7CisgICAgfSBlbHNlIHsKKyAgICAgIC0tc3RyOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciBrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2VbXSA9CisiVGhpcyBwcm9ncmFtIGNvbnRhaW5zIHRlc3RzIHdyaXR0ZW4gdXNpbmcgIiBHVEVTVF9OQU1FXyAiLiBZb3UgY2FuIHVzZSB0aGVcbiIKKyJmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGZsYWdzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yOlxuIgorIlxuIgorIlRlc3QgU2VsZWN0aW9uOlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQERcbiIKKyIgICAgICBMaXN0IHRoZSBuYW1lcyBvZiBhbGwgdGVzdHMgaW5zdGVhZCBvZiBydW5uaW5nIHRoZW0uIFRoZSBuYW1lIG9mXG4iCisiICAgICAgVEVTVChGb28sIEJhcikgaXMgXCJGb28uQmFyXCIuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImZpbHRlcj1AWVBPU1RJVkVfUEFUVEVSTlMiCisgICAgIltARy1AWU5FR0FUSVZFX1BBVFRFUk5TXUBEXG4iCisiICAgICAgUnVuIG9ubHkgdGhlIHRlc3RzIHdob3NlIG5hbWUgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGJ1dFxuIgorIiAgICAgIG5vbmUgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLiAnPycgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlcjsgJyonXG4iCisiICAgICAgbWF0Y2hlcyBhbnkgc3Vic3RyaW5nOyAnOicgc2VwYXJhdGVzIHR3byBwYXR0ZXJucy5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNARFxuIgorIiAgICAgIFJ1biBhbGwgZGlzYWJsZWQgdGVzdHMgdG9vLlxuIgorIlxuIgorIlRlc3QgRXhlY3V0aW9uOlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyZXBlYXQ9QFlbQ09VTlRdQERcbiIKKyIgICAgICBSdW4gdGhlIHRlc3RzIHJlcGVhdGVkbHk7IHVzZSBhIG5lZ2F0aXZlIGNvdW50IHRvIHJlcGVhdCBmb3JldmVyLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzaHVmZmxlQERcbiIKKyIgICAgICBSYW5kb21pemUgdGVzdHMnIG9yZGVycyBvbiBldmVyeSBpdGVyYXRpb24uXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJhbmRvbV9zZWVkPUBZW05VTUJFUl1ARFxuIgorIiAgICAgIFJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2UgZm9yIHNodWZmbGluZyB0ZXN0IG9yZGVycyAoYmV0d2VlbiAxIGFuZFxuIgorIiAgICAgIDk5OTk5LCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSkuXG4iCisiXG4iCisiVGVzdCBPdXRwdXQ6XG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNvbG9yPUBZKEBHeWVzQFl8QEdub0BZfEBHYXV0b0BZKUBEXG4iCisiICAgICAgRW5hYmxlL2Rpc2FibGUgY29sb3JlZCBvdXRwdXQuIFRoZSBkZWZhdWx0IGlzIEBHYXV0b0BELlxuIgorIiAgLUBHLSIgR1RFU1RfRkxBR19QUkVGSVhfICJwcmludF90aW1lPTBARFxuIgorIiAgICAgIERvbid0IHByaW50IHRoZSBlbGFwc2VkIHRpbWUgb2YgZWFjaCB0ZXN0LlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJvdXRwdXQ9eG1sQFlbQEc6QFlESVJFQ1RPUllfUEFUSEBHIgorICAgIEdURVNUX1BBVEhfU0VQXyAiQFl8QEc6QFlGSUxFX1BBVEhdQERcbiIKKyIgICAgICBHZW5lcmF0ZSBhbiBYTUwgcmVwb3J0IGluIHRoZSBnaXZlbiBkaXJlY3Rvcnkgb3Igd2l0aCB0aGUgZ2l2ZW4gZmlsZVxuIgorIiAgICAgIG5hbWUuIEBZRklMRV9QQVRIQEQgZGVmYXVsdHMgdG8gQEd0ZXN0X2RldGFpbHMueG1sQEQuXG4iCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzdHJlYW1fcmVzdWx0X3RvPUBZSE9TVEBHOkBZUE9SVEBEXG4iCisiICAgICAgU3RyZWFtIHRlc3QgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gc2VydmVyLlxuIgorI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisiXG4iCisiQXNzZXJ0aW9uIEJlaGF2aW9yOlxuIgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImRlYXRoX3Rlc3Rfc3R5bGU9QFkoQEdmYXN0QFl8QEd0aHJlYWRzYWZlQFkpQERcbiIKKyIgICAgICBTZXQgdGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS5cbiIKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgJiYgIUdURVNUX09TX1dJTkRPV1MKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYnJlYWtfb25fZmFpbHVyZUBEXG4iCisiICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBkZWJ1Z2dlciBicmVhay1wb2ludHMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInRocm93X29uX2ZhaWx1cmVARFxuIgorIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gQysrIGV4Y2VwdGlvbnMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNhdGNoX2V4Y2VwdGlvbnM9MEBEXG4iCisiICAgICAgRG8gbm90IHJlcG9ydCBleGNlcHRpb25zIGFzIHRlc3QgZmFpbHVyZXMuIEluc3RlYWQsIGFsbG93IHRoZW1cbiIKKyIgICAgICB0byBjcmFzaCB0aGUgcHJvZ3JhbSBvciB0aHJvdyBhIHBvcC11cCAob24gV2luZG93cykuXG4iCisiXG4iCisiRXhjZXB0IGZvciBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImxpc3RfdGVzdHNARCwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHNldCAiCisgICAgInRoZSBjb3JyZXNwb25kaW5nXG4iCisiZW52aXJvbm1lbnQgdmFyaWFibGUgb2YgYSBmbGFnIChhbGwgbGV0dGVycyBpbiB1cHBlci1jYXNlKS4gRm9yIGV4YW1wbGUsIHRvXG4iCisiZGlzYWJsZSBjb2xvcmVkIHRleHQgb3V0cHV0LCB5b3UgY2FuIGVpdGhlciBzcGVjaWZ5IEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXworICAgICJjb2xvcj1ub0BEIG9yIHNldFxuIgorInRoZSBARyIgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJDT0xPUkBEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIEBHbm9ARC5cbiIKKyJcbiIKKyJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgdGhlICIgR1RFU1RfTkFNRV8gIiBkb2N1bWVudGF0aW9uIGF0XG4iCisiQEciIEdURVNUX1BST0pFQ1RfVVJMXyAiQEQuIElmIHlvdSBmaW5kIGEgYnVnIGluICIgR1RFU1RfTkFNRV8gIlxuIgorIihub3Qgb25lIGluIHlvdXIgb3duIGNvZGUgb3IgdGVzdHMpLCBwbGVhc2UgcmVwb3J0IGl0IHRvXG4iCisiQEc8IiBHVEVTVF9ERVZfRU1BSUxfICI+QEQuXG4iOworCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4gIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvciB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgKmFyZ2M7IGkrKykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFyZ19zdHJpbmcgPSBTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSk7CisgICAgY29uc3QgY2hhciogY29uc3QgYXJnID0gYXJnX3N0cmluZy5jX3N0cigpOworCisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlQm9vbEZsYWc7CisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlSW50MzJGbGFnOworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZVN0cmluZ0ZsYWc7CisKKyAgICAvLyBEbyB3ZSBzZWUgYSBHb29nbGUgVGVzdCBmbGFnPworICAgIGlmIChQYXJzZUJvb2xGbGFnKGFyZywga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQnJlYWtPbkZhaWx1cmVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0NhdGNoRXhjZXB0aW9uc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtDb2xvckZsYWcsICZHVEVTVF9GTEFHKGNvbG9yKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0RlYXRoVGVzdFN0eWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0RlYXRoVGVzdFVzZUZvcmssCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtGaWx0ZXJGbGFnLCAmR1RFU1RfRkxBRyhmaWx0ZXIpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0xpc3RUZXN0c0ZsYWcsICZHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrT3V0cHV0RmxhZywgJkdURVNUX0ZMQUcob3V0cHV0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtQcmludFRpbWVGbGFnLCAmR1RFU1RfRkxBRyhwcmludF90aW1lKSkgfHwKKyAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmFuZG9tU2VlZEZsYWcsICZHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgfHwKKyAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmVwZWF0RmxhZywgJkdURVNUX0ZMQUcocmVwZWF0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtTaHVmZmxlRmxhZywgJkdURVNUX0ZMQUcoc2h1ZmZsZSkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1N0YWNrVHJhY2VEZXB0aEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga1N0cmVhbVJlc3VsdFRvRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1Rocm93T25GYWlsdXJlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSkKKyAgICAgICAgKSB7CisgICAgICAvLyBZZXMuICBTaGlmdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmd2IGxpc3QgbGVmdCBieSBvbmUuICBOb3RlCisgICAgICAvLyB0aGF0IGFyZ3YgaGFzICgqYXJnYyArIDEpIGVsZW1lbnRzLCB0aGUgbGFzdCBvbmUgYWx3YXlzIGJlaW5nCisgICAgICAvLyBOVUxMLiAgVGhlIGZvbGxvd2luZyBsb29wIG1vdmVzIHRoZSB0cmFpbGluZyBOVUxMIGVsZW1lbnQgYXMKKyAgICAgIC8vIHdlbGwuCisgICAgICBmb3IgKGludCBqID0gaTsgaiAhPSAqYXJnYzsgaisrKSB7CisgICAgICAgIGFyZ3Zbal0gPSBhcmd2W2ogKyAxXTsKKyAgICAgIH0KKworICAgICAgLy8gRGVjcmVtZW50cyB0aGUgYXJndW1lbnQgY291bnQuCisgICAgICAoKmFyZ2MpLS07CisKKyAgICAgIC8vIFdlIGFsc28gbmVlZCB0byBkZWNyZW1lbnQgdGhlIGl0ZXJhdG9yIGFzIHdlIGp1c3QgcmVtb3ZlZAorICAgICAgLy8gYW4gZWxlbWVudC4KKyAgICAgIGktLTsKKyAgICB9IGVsc2UgaWYgKGFyZ19zdHJpbmcgPT0gIi0taGVscCIgfHwgYXJnX3N0cmluZyA9PSAiLWgiIHx8CisgICAgICAgICAgICAgICBhcmdfc3RyaW5nID09ICItPyIgfHwgYXJnX3N0cmluZyA9PSAiLz8iIHx8CisgICAgICAgICAgICAgICBIYXNHb29nbGVUZXN0RmxhZ1ByZWZpeChhcmcpKSB7CisgICAgICAvLyBCb3RoIGhlbHAgZmxhZyBhbmQgdW5yZWNvZ25pemVkIEdvb2dsZSBUZXN0IGZsYWdzIChleGNsdWRpbmcKKyAgICAgIC8vIGludGVybmFsIG9uZXMpIHRyaWdnZXIgaGVscCBkaXNwbGF5LgorICAgICAgZ19oZWxwX2ZsYWcgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChnX2hlbHBfZmxhZykgeworICAgIC8vIFdlIHByaW50IHRoZSBoZWxwIGhlcmUgaW5zdGVhZCBvZiBpbiBSVU5fQUxMX1RFU1RTKCksIGFzIHRoZQorICAgIC8vIGxhdHRlciBtYXkgbm90IGJlIGNhbGxlZCBhdCBhbGwgaWYgdGhlIHVzZXIgaXMgdXNpbmcgR29vZ2xlCisgICAgLy8gVGVzdCB3aXRoIGFub3RoZXIgdGVzdGluZyBmcmFtZXdvcmsuCisgICAgUHJpbnRDb2xvckVuY29kZWQoa0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlKTsKKyAgfQorfQorCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4KK3ZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChhcmdjLCBhcmd2KTsKK30KK3ZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChhcmdjLCBhcmd2KTsKK30KKworLy8gVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIEluaXRHb29nbGVUZXN0KCkuCisvLworLy8gVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3IKKy8vIHdjaGFyX3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Cit2b2lkIEluaXRHb29nbGVUZXN0SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgeworICBnX2luaXRfZ3Rlc3RfY291bnQrKzsKKworICAvLyBXZSBkb24ndCB3YW50IHRvIHJ1biB0aGUgaW5pdGlhbGl6YXRpb24gY29kZSB0d2ljZS4KKyAgaWYgKGdfaW5pdF9ndGVzdF9jb3VudCAhPSAxKSByZXR1cm47CisKKyAgaWYgKCphcmdjIDw9IDApIHJldHVybjsKKworICBpbnRlcm5hbDo6Z19leGVjdXRhYmxlX3BhdGggPSBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbMF0pOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICBnX2FyZ3ZzLmNsZWFyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpICE9ICphcmdjOyBpKyspIHsKKyAgICBnX2FyZ3ZzLnB1c2hfYmFjayhTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSkpOworICB9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoYXJnYywgYXJndik7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5Qb3N0RmxhZ1BhcnNpbmdJbml0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKKy8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCisvLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKKy8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCisvLworLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCisvLyB1cGRhdGVkLgorLy8KKy8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCit2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgaW50ZXJuYWw6OkluaXRHb29nbGVUZXN0SW1wbChhcmdjLCBhcmd2KTsKK30KKworLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgorLy8gVU5JQ09ERSBtb2RlLgordm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7CisgIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cy4KKworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9PU19NQUMKKyMgIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKKworIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxmY250bC5oPgorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKworIyBpZiBHVEVTVF9PU19MSU5VWAorIyAgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgIGluY2x1ZGUgPHN5cy93YWl0Lmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyMgaWYgR1RFU1RfT1NfUU5YCisjICBpbmNsdWRlIDxzcGF3bi5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIENvbnN0YW50cy4KKworLy8gVGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGVbXSA9ICJmYXN0IjsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZGVhdGhfdGVzdF9zdHlsZSwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3N0eWxlIiwga0RlZmF1bHREZWF0aFRlc3RTdHlsZSksCisgICAgIkluZGljYXRlcyBob3cgdG8gcnVuIGEgZGVhdGggdGVzdCBpbiBhIGZvcmtlZCBjaGlsZCBwcm9jZXNzOiAiCisgICAgIlwidGhyZWFkc2FmZVwiIChjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB0ZXN0IGJpbmFyeSAiCisgICAgImZyb20gdGhlIGJlZ2lubmluZywgcnVubmluZyBvbmx5IHRoZSBzcGVjaWZpYyBkZWF0aCB0ZXN0KSBvciAiCisgICAgIlwiZmFzdFwiIChjaGlsZCBwcm9jZXNzIHJ1bnMgdGhlIGRlYXRoIHRlc3QgaW1tZWRpYXRlbHkgIgorICAgICJhZnRlciBmb3JraW5nKS4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmssCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3RfdXNlX2ZvcmsiLCBmYWxzZSksCisgICAgIkluc3RydWN0cyB0byB1c2UgZm9yaygpL19leGl0KCkgaW5zdGVhZCBvZiBjbG9uZSgpIGluIGRlYXRoIHRlc3RzLiAiCisgICAgIklnbm9yZWQgYW5kIGFsd2F5cyB1c2VzIGZvcmsoKSBvbiBQT1NJWCBzeXN0ZW1zIHdoZXJlIGNsb25lKCkgaXMgbm90ICIKKyAgICAiaW1wbGVtZW50ZWQuIFVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQgb3Igc2ltaWxhciB0b29scyBpZiAiCisgICAgInRob3NlIGRvIG5vdCBzdXBwb3J0IGNsb25lKCkuIFZhbGdyaW5kIDMuMy4xIHdpbGwganVzdCBmYWlsIGlmICIKKyAgICAiaXQgc2VlcyBhbiB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBjbG9uZSgpIGZsYWdzLiAiCisgICAgIkl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmbGFnIHcvbyB2YWxncmluZCB0aG91Z2ggaXQgd2lsbCAiCisgICAgIndvcmsgaW4gOTklIG9mIHRoZSBjYXNlcy4gT25jZSB2YWxncmluZCBpcyBmaXhlZCwgdGhpcyBmbGFnIHdpbGwgIgorICAgICJtb3N0IGxpa2VseSBiZSByZW1vdmVkLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QsICIiLAorICAgICJJbmRpY2F0ZXMgdGhlIGZpbGUsIGxpbmUgbnVtYmVyLCB0ZW1wb3JhbCBpbmRleCBvZiAiCisgICAgInRoZSBzaW5nbGUgZGVhdGggdGVzdCB0byBydW4sIGFuZCBhIGZpbGUgZGVzY3JpcHRvciB0byAiCisgICAgIndoaWNoIGEgc3VjY2VzcyBjb2RlIG1heSBiZSBzZW50LCBhbGwgc2VwYXJhdGVkIGJ5ICIKKyAgICAidGhlICd8JyBjaGFyYWN0ZXJzLiAgVGhpcyBmbGFnIGlzIHNwZWNpZmllZCBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudCAiCisgICAgInByb2Nlc3MgaXMgYSBzdWItcHJvY2VzcyBsYXVuY2hlZCBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlICIKKyAgICAiZGVhdGggdGVzdC4gIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4iKTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVmFsaWQgb25seSBmb3IgZmFzdCBkZWF0aCB0ZXN0cy4gSW5kaWNhdGVzIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gdGhlCisvLyBjaGlsZCBwcm9jZXNzIG9mIGEgZmFzdCBzdHlsZSBkZWF0aCB0ZXN0Lgorc3RhdGljIGJvb2wgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSBmYWxzZTsKKworLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5CisvLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMKKy8vIFZhbGdyaW5kIGhlYXAgY2hlY2tlcnMgbWF5IG5lZWQgdGhpcyB0byBtb2RpZnkgdGhlaXIgYmVoYXZpb3IgaW4gZGVhdGgKKy8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuCitib29sIEluRGVhdGhUZXN0Q2hpbGQoKSB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICAvLyBPbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyBhcmUgdGhyZWFkLXNhZmUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlCisgIC8vIGRlYXRoX3Rlc3Rfc3R5bGUgZmxhZy4KKyAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworCisjIGVsc2UKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpCisgICAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworICBlbHNlCisgICAgcmV0dXJuIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBFeGl0ZWRXaXRoQ29kZSBjb25zdHJ1Y3Rvci4KK0V4aXRlZFdpdGhDb2RlOjpFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKSA6IGV4aXRfY29kZV8oZXhpdF9jb2RlKSB7Cit9CisKKy8vIEV4aXRlZFdpdGhDb2RlIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IuCitib29sIEV4aXRlZFdpdGhDb2RlOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3QgeworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIGV4aXRfc3RhdHVzID09IGV4aXRfY29kZV87CisKKyMgZWxzZQorCisgIHJldHVybiBXSUZFWElURUQoZXhpdF9zdGF0dXMpICYmIFdFWElUU1RBVFVTKGV4aXRfc3RhdHVzKSA9PSBleGl0X2NvZGVfOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIEtpbGxlZEJ5U2lnbmFsIGNvbnN0cnVjdG9yLgorS2lsbGVkQnlTaWduYWw6OktpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pIDogc2lnbnVtXyhzaWdudW0pIHsKK30KKworLy8gS2lsbGVkQnlTaWduYWwgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KK2Jvb2wgS2lsbGVkQnlTaWduYWw6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7CisgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X3N0YXR1cykgJiYgV1RFUk1TSUcoZXhpdF9zdGF0dXMpID09IHNpZ251bV87Cit9CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVdGlsaXRpZXMgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIGV4aXQgY29kZSwgaW4gdGhlIGZvcm1hdAorLy8gc3BlY2lmaWVkIGJ5IHdhaXQoMikuCitzdGF0aWMgc3RkOjpzdHJpbmcgRXhpdFN1bW1hcnkoaW50IGV4aXRfY29kZSkgeworICBNZXNzYWdlIG07CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgZXhpdF9jb2RlOworCisjIGVsc2UKKworICBpZiAoV0lGRVhJVEVEKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7CisgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIlRlcm1pbmF0ZWQgYnkgc2lnbmFsICIgPDwgV1RFUk1TSUcoZXhpdF9jb2RlKTsKKyAgfQorIyAgaWZkZWYgV0NPUkVEVU1QCisgIGlmIChXQ09SRURVTVAoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIiAoY29yZSBkdW1wZWQpIjsKKyAgfQorIyAgZW5kaWYKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cykgeworICByZXR1cm4gIUV4aXRlZFdpdGhDb2RlKDApKGV4aXRfc3RhdHVzKTsKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiBhIGRlYXRoIHRlc3QgZmluZHMgbW9yZSB0aGFuCisvLyBvbmUgdGhyZWFkIHJ1bm5pbmcsIG9yIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBwcmlvcgorLy8gdG8gZXhlY3V0aW5nIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisvLyBjYWxsZXIgbm90IHRvIHBhc3MgYSB0aHJlYWRfY291bnQgb2YgMS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHNpemVfdCB0aHJlYWRfY291bnQpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiRGVhdGggdGVzdHMgdXNlIGZvcmsoKSwgd2hpY2ggaXMgdW5zYWZlIHBhcnRpY3VsYXJseSIKKyAgICAgIDw8ICIgaW4gYSB0aHJlYWRlZCBjb250ZXh0LiBGb3IgdGhpcyB0ZXN0LCAiIDw8IEdURVNUX05BTUVfIDw8ICIgIjsKKyAgaWYgKHRocmVhZF9jb3VudCA9PSAwKQorICAgIG1zZyA8PCAiY291bGRuJ3QgZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iOworICBlbHNlCisgICAgbXNnIDw8ICJkZXRlY3RlZCAiIDw8IHRocmVhZF9jb3VudCA8PCAiIHRocmVhZHMuIjsKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKKy8vIEZsYWcgY2hhcmFjdGVycyBmb3IgcmVwb3J0aW5nIGEgZGVhdGggdGVzdCB0aGF0IGRpZCBub3QgZGllLgorc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdExpdmVkID0gJ0wnOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFJldHVybmVkID0gJ1InOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFRocmV3ID0gJ1QnOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdEludGVybmFsRXJyb3IgPSAnSSc7CisKKy8vIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBwb3NzaWJsZSB3YXlzIHRoYXQgYSBkZWF0aCB0ZXN0IGNhbgorLy8gY29uY2x1ZGUuICBESUVEIG1lYW5zIHRoYXQgdGhlIHByb2Nlc3MgZGllZCB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QKKy8vIGNvZGU7IExJVkVEIG1lYW5zIHRoYXQgcHJvY2VzcyBsaXZlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgdGVzdCBjb2RlOworLy8gUkVUVVJORUQgbWVhbnMgdGhhdCB0aGUgdGVzdCBzdGF0ZW1lbnQgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgYSByZXR1cm4KKy8vIHN0YXRlbWVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQ7IFRIUkVXIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50CisvLyByZXR1cm5lZCBjb250cm9sIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIElOX1BST0dSRVNTIG1lYW5zIHRoZSB0ZXN0CisvLyBoYXMgbm90IHlldCBjb25jbHVkZWQuCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBVbmlmeSBuYW1lcyBhbmQgcG9zc2libHkgdmFsdWVzIGZvcgorLy8gQWJvcnRSZWFzb24sIERlYXRoVGVzdE91dGNvbWUsIGFuZCBmbGFnIGNoYXJhY3RlcnMgYWJvdmUuCitlbnVtIERlYXRoVGVzdE91dGNvbWUgeyBJTl9QUk9HUkVTUywgRElFRCwgTElWRUQsIFJFVFVSTkVELCBUSFJFVyB9OworCisvLyBSb3V0aW5lIGZvciBhYm9ydGluZyB0aGUgcHJvZ3JhbSB3aGljaCBpcyBzYWZlIHRvIGNhbGwgZnJvbSBhbgorLy8gZXhlYy1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yCisvLyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIHRoZQorLy8gbWVzc2FnZSBpcyBzaW1wbHkgcHJpbnRlZCB0byBzdGRlcnIuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHByb2dyYW0KKy8vIHRoZW4gZXhpdHMgd2l0aCBzdGF0dXMgMS4KK3ZvaWQgRGVhdGhUZXN0QWJvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gT24gYSBQT1NJWCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkc2FmZS1zdHlsZQorICAvLyBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIHdoaWNoIG9wZXJhdGVzIG9uIGEgdmVyeSBzbWFsbCBzdGFjay4gIFVzZQorICAvLyB0aGUgaGVhcCBmb3IgYW55IGFkZGl0aW9uYWwgbm9uLW1pbnVzY3VsZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgorICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgR2V0VW5pdFRlc3RJbXBsKCktPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIEZJTEUqIHBhcmVudCA9IHBvc2l4OjpGRE9wZW4oZmxhZy0+d3JpdGVfZmQoKSwgInciKTsKKyAgICBmcHV0YyhrRGVhdGhUZXN0SW50ZXJuYWxFcnJvciwgcGFyZW50KTsKKyAgICBmcHJpbnRmKHBhcmVudCwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgICBmZmx1c2gocGFyZW50KTsKKyAgICBfZXhpdCgxKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorfQorCisvLyBBIHJlcGxhY2VtZW50IGZvciBDSEVDSyB0aGF0IGNhbGxzIERlYXRoVGVzdEFib3J0IGlmIHRoZSBhc3NlcnRpb24KKy8vIGZhaWxzLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXhwcmVzc2lvbikgXAorICBkbyB7IFwKKyAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShleHByZXNzaW9uKSkgeyBcCisgICAgICBEZWF0aFRlc3RBYm9ydCggXAorICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkNIRUNLIGZhaWxlZDogRmlsZSAiKSArIF9fRklMRV9fICsgICIsIGxpbmUgIiBcCisgICAgICAgICAgKyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoX19MSU5FX18pICsgIjogIiBcCisgICAgICAgICAgKyAjZXhwcmVzc2lvbik7IFwKKyAgICB9IFwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworLy8gVGhpcyBtYWNybyBpcyBzaW1pbGFyIHRvIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfLCBidXQgaXQgaXMgbWVhbnQgZm9yCisvLyBldmFsdWF0aW5nIGFueSBzeXN0ZW0gY2FsbCB0aGF0IGZ1bGZpbGxzIHR3byBjb25kaXRpb25zOiBpdCBtdXN0IHJldHVybgorLy8gLTEgb24gZmFpbHVyZSwgYW5kIHNldCBlcnJubyB0byBFSU5UUiB3aGVuIGl0IGlzIGludGVycnVwdGVkIGFuZAorLy8gc2hvdWxkIGJlIHRyaWVkIGFnYWluLiAgVGhlIG1hY3JvIGV4cGFuZHMgdG8gYSBsb29wIHRoYXQgcmVwZWF0ZWRseQorLy8gZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGFzIGxvbmcgYXMgaXQgZXZhbHVhdGVzIHRvIC0xIGFuZCBzZXRzCisvLyBlcnJubyB0byBFSU5UUi4gIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAtMSBidXQgZXJybm8gaXMKKy8vIHNvbWV0aGluZyBvdGhlciB0aGFuIEVJTlRSLCBEZWF0aFRlc3RBYm9ydCBpcyBjYWxsZWQuCisjIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGV4cHJlc3Npb24pIFwKKyAgZG8geyBcCisgICAgaW50IGd0ZXN0X3JldHZhbDsgXAorICAgIGRvIHsgXAorICAgICAgZ3Rlc3RfcmV0dmFsID0gKGV4cHJlc3Npb24pOyBcCisgICAgfSB3aGlsZSAoZ3Rlc3RfcmV0dmFsID09IC0xICYmIGVycm5vID09IEVJTlRSKTsgXAorICAgIGlmIChndGVzdF9yZXR2YWwgPT0gLTEpIHsgXAorICAgICAgRGVhdGhUZXN0QWJvcnQoIFwKKyAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJDSEVDSyBmYWlsZWQ6IEZpbGUgIikgKyBfX0ZJTEVfXyArICIsIGxpbmUgIiBcCisgICAgICAgICAgKyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoX19MSU5FX18pICsgIjogIiBcCisgICAgICAgICAgKyAjZXhwcmVzc2lvbiArICIgIT0gLTEiKTsgXAorICAgIH0gXAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yIGluIGVycm5vLgorc3RkOjpzdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIGVycm5vID09IDAgPyAiIiA6IHBvc2l4OjpTdHJFcnJvcihlcnJubyk7Cit9CisKKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gYSBkZWF0aCB0ZXN0IHBhcmVudCBwcm9jZXNzIHRvIHJlYWQgYSBmYWlsdXJlCisvLyBtZXNzYWdlIGZyb20gdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBhbmQgbG9nIGl0IHdpdGggdGhlIEZBVEFMCisvLyBzZXZlcml0eS4gT24gV2luZG93cywgdGhlIG1lc3NhZ2UgaXMgcmVhZCBmcm9tIGEgcGlwZSBoYW5kbGUuIE9uIG90aGVyCisvLyBwbGF0Zm9ybXMsIGl0IGlzIHJlYWQgZnJvbSBhIGZpbGUgZGVzY3JpcHRvci4KK3N0YXRpYyB2b2lkIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihpbnQgZmQpIHsKKyAgTWVzc2FnZSBlcnJvcjsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgaW50IG51bV9yZWFkOworCisgIGRvIHsKKyAgICB3aGlsZSAoKG51bV9yZWFkID0gcG9zaXg6OlJlYWQoZmQsIGJ1ZmZlciwgMjU1KSkgPiAwKSB7CisgICAgICBidWZmZXJbbnVtX3JlYWRdID0gJ1wwJzsKKyAgICAgIGVycm9yIDw8IGJ1ZmZlcjsKKyAgICB9CisgIH0gd2hpbGUgKG51bV9yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAobnVtX3JlYWQgPT0gMCkgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8IGVycm9yLkdldFN0cmluZygpOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBsYXN0X2Vycm9yID0gZXJybm87CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZGVhdGggdGVzdCBpbnRlcm5hbDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkgPDwgIiBbIiA8PCBsYXN0X2Vycm9yIDw8ICJdIjsKKyAgfQorfQorCisvLyBEZWF0aCB0ZXN0IGNvbnN0cnVjdG9yLiAgSW5jcmVtZW50cyB0aGUgcnVubmluZyBkZWF0aCB0ZXN0IGNvdW50CisvLyBmb3IgdGhlIGN1cnJlbnQgdGVzdC4KK0RlYXRoVGVzdDo6RGVhdGhUZXN0KCkgeworICBUZXN0SW5mbyogY29uc3QgaW5mbyA9IEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIkNhbm5vdCBydW4gYSBkZWF0aCB0ZXN0IG91dHNpZGUgb2YgYSBURVNUIG9yICIKKyAgICAgICAgICAgICAgICAgICAiVEVTVF9GIGNvbnN0cnVjdCIpOworICB9Cit9CisKKy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWF0aCB0ZXN0IGJ5IGRpc3BhdGNoaW5nIHRvIHRoZSBjdXJyZW50CisvLyBkZWF0aCB0ZXN0IGZhY3RvcnkuCitib29sIERlYXRoVGVzdDo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgeworICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPmRlYXRoX3Rlc3RfZmFjdG9yeSgpLT5DcmVhdGUoCisgICAgICBzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lLCB0ZXN0KTsKK30KKworY29uc3QgY2hhciogRGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpIHsKKyAgcmV0dXJuIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXy5jX3N0cigpOworfQorCit2b2lkIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXyA9IG1lc3NhZ2U7Cit9CisKK3N0ZDo6c3RyaW5nIERlYXRoVGVzdDo6bGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfOworCisvLyBQcm92aWRlcyBjcm9zcyBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBmb3Igc29tZSBkZWF0aCBmdW5jdGlvbmFsaXR5LgorY2xhc3MgRGVhdGhUZXN0SW1wbCA6IHB1YmxpYyBEZWF0aFRlc3QgeworIHByb3RlY3RlZDoKKyAgRGVhdGhUZXN0SW1wbChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpCisgICAgICA6IHN0YXRlbWVudF8oYV9zdGF0ZW1lbnQpLAorICAgICAgICByZWdleF8oYV9yZWdleCksCisgICAgICAgIHNwYXduZWRfKGZhbHNlKSwKKyAgICAgICAgc3RhdHVzXygtMSksCisgICAgICAgIG91dGNvbWVfKElOX1BST0dSRVNTKSwKKyAgICAgICAgcmVhZF9mZF8oLTEpLAorICAgICAgICB3cml0ZV9mZF8oLTEpIHt9CisKKyAgLy8gcmVhZF9mZF8gaXMgZXhwZWN0ZWQgdG8gYmUgY2xvc2VkIGFuZCBjbGVhcmVkIGJ5IGEgZGVyaXZlZCBjbGFzcy4KKyAgfkRlYXRoVGVzdEltcGwoKSB7IEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHJlYWRfZmRfID09IC0xKTsgfQorCisgIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKTsKKyAgdmlydHVhbCBib29sIFBhc3NlZChib29sIHN0YXR1c19vayk7CisKKyAgY29uc3QgY2hhciogc3RhdGVtZW50KCkgY29uc3QgeyByZXR1cm4gc3RhdGVtZW50XzsgfQorICBjb25zdCBSRSogcmVnZXgoKSBjb25zdCB7IHJldHVybiByZWdleF87IH0KKyAgYm9vbCBzcGF3bmVkKCkgY29uc3QgeyByZXR1cm4gc3Bhd25lZF87IH0KKyAgdm9pZCBzZXRfc3Bhd25lZChib29sIGlzX3NwYXduZWQpIHsgc3Bhd25lZF8gPSBpc19zcGF3bmVkOyB9CisgIGludCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBzdGF0dXNfOyB9CisgIHZvaWQgc2V0X3N0YXR1cyhpbnQgYV9zdGF0dXMpIHsgc3RhdHVzXyA9IGFfc3RhdHVzOyB9CisgIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZSgpIGNvbnN0IHsgcmV0dXJuIG91dGNvbWVfOyB9CisgIHZvaWQgc2V0X291dGNvbWUoRGVhdGhUZXN0T3V0Y29tZSBhbl9vdXRjb21lKSB7IG91dGNvbWVfID0gYW5fb3V0Y29tZTsgfQorICBpbnQgcmVhZF9mZCgpIGNvbnN0IHsgcmV0dXJuIHJlYWRfZmRfOyB9CisgIHZvaWQgc2V0X3JlYWRfZmQoaW50IGZkKSB7IHJlYWRfZmRfID0gZmQ7IH0KKyAgaW50IHdyaXRlX2ZkKCkgY29uc3QgeyByZXR1cm4gd3JpdGVfZmRfOyB9CisgIHZvaWQgc2V0X3dyaXRlX2ZkKGludCBmZCkgeyB3cml0ZV9mZF8gPSBmZDsgfQorCisgIC8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAorICAvLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfCisgIC8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KKyAgLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgorICB2b2lkIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjb2RlIHRoaXMgb2JqZWN0IGlzIHRlc3RpbmcuICBUaGlzIGNsYXNzCisgIC8vIGRvZXNuJ3Qgb3duIHRoaXMgc3RyaW5nIGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgorICBjb25zdCBjaGFyKiBjb25zdCBzdGF0ZW1lbnRfOworICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIHRlc3Qgb3V0cHV0IG11c3QgbWF0Y2guICBEZWF0aFRlc3RJbXBsCisgIC8vIGRvZXNuJ3Qgb3duIHRoaXMgb2JqZWN0IGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgorICBjb25zdCBSRSogY29uc3QgcmVnZXhfOworICAvLyBUcnVlIGlmIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNwYXduZWQuCisgIGJvb2wgc3Bhd25lZF87CisgIC8vIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4KKyAgaW50IHN0YXR1c187CisgIC8vIEhvdyB0aGUgZGVhdGggdGVzdCBjb25jbHVkZWQuCisgIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZV87CisgIC8vIERlc2NyaXB0b3IgdG8gdGhlIHJlYWQgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLiAgSXQgaXMKKyAgLy8gYWx3YXlzIC0xIGluIHRoZSBjaGlsZCBwcm9jZXNzLiAgVGhlIGNoaWxkIGtlZXBzIGl0cyB3cml0ZSBlbmQgb2YgdGhlCisgIC8vIHBpcGUgaW4gd3JpdGVfZmRfLgorICBpbnQgcmVhZF9mZF87CisgIC8vIERlc2NyaXB0b3IgdG8gdGhlIGNoaWxkJ3Mgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgLy8gSXQgaXMgYWx3YXlzIC0xIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIFRoZSBwYXJlbnQga2VlcHMgaXRzIGVuZCBvZiB0aGUKKyAgLy8gcGlwZSBpbiByZWFkX2ZkXy4KKyAgaW50IHdyaXRlX2ZkXzsKK307CisKKy8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAorLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXworLy8gbWVtYmVyLCBhbmQgY2xvc2VzIHJlYWRfZmRfLiAgT3V0cHV0cyBkaWFnbm9zdGljcyBhbmQgdGVybWluYXRlcyBpbgorLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgordm9pZCBEZWF0aFRlc3RJbXBsOjpSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpIHsKKyAgY2hhciBmbGFnOworICBpbnQgYnl0ZXNfcmVhZDsKKworICAvLyBUaGUgcmVhZCgpIGhlcmUgYmxvY2tzIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlIChzaWduaWZ5aW5nIHRoZQorICAvLyBmYWlsdXJlIG9mIHRoZSBkZWF0aCB0ZXN0KSBvciB1bnRpbCB0aGUgcGlwZSBpcyBjbG9zZWQgKHNpZ25pZnlpbmcKKyAgLy8gaXRzIHN1Y2Nlc3MpLCBzbyBpdCdzIG9rYXkgdG8gY2FsbCB0aGlzIGluIHRoZSBwYXJlbnQgYmVmb3JlCisgIC8vIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBleGl0ZWQuCisgIGRvIHsKKyAgICBieXRlc19yZWFkID0gcG9zaXg6OlJlYWQocmVhZF9mZCgpLCAmZmxhZywgMSk7CisgIH0gd2hpbGUgKGJ5dGVzX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICBzZXRfb3V0Y29tZShESUVEKTsKKyAgfSBlbHNlIGlmIChieXRlc19yZWFkID09IDEpIHsKKyAgICBzd2l0Y2ggKGZsYWcpIHsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdFJldHVybmVkOgorICAgICAgICBzZXRfb3V0Y29tZShSRVRVUk5FRCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0VGhyZXc6CisgICAgICAgIHNldF9vdXRjb21lKFRIUkVXKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGtEZWF0aFRlc3RMaXZlZDoKKyAgICAgICAgc2V0X291dGNvbWUoTElWRUQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdEludGVybmFsRXJyb3I6CisgICAgICAgIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihyZWFkX2ZkKCkpOyAgLy8gRG9lcyBub3QgcmV0dXJuLgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJEZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgcmVwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidW5leHBlY3RlZCBzdGF0dXMgYnl0ZSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGZsYWcpIDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIlJlYWQgZnJvbSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsKKyAgfQorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpDbG9zZShyZWFkX2ZkKCkpKTsKKyAgc2V0X3JlYWRfZmQoLTEpOworfQorCisvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgY29kZSB3aGljaCBzaG91bGQgaGF2ZSBleGl0ZWQsIGRpZG4ndC4KKy8vIFNob3VsZCBiZSBjYWxsZWQgb25seSBpbiBhIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKy8vIFdyaXRlcyBhIHN0YXR1cyBieXRlIHRvIHRoZSBjaGlsZCdzIHN0YXR1cyBmaWxlIGRlc2NyaXB0b3IsIHRoZW4KKy8vIGNhbGxzIF9leGl0KDEpLgordm9pZCBEZWF0aFRlc3RJbXBsOjpBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pIHsKKyAgLy8gVGhlIHBhcmVudCBwcm9jZXNzIGNvbnNpZGVycyB0aGUgZGVhdGggdGVzdCB0byBiZSBhIGZhaWx1cmUgaWYKKyAgLy8gaXQgZmluZHMgYW55IGRhdGEgaW4gb3VyIHBpcGUuICBTbywgaGVyZSB3ZSB3cml0ZSBhIHNpbmdsZSBmbGFnIGJ5dGUKKyAgLy8gdG8gdGhlIHBpcGUsIHRoZW4gZXhpdC4KKyAgY29uc3QgY2hhciBzdGF0dXNfY2ggPQorICAgICAgcmVhc29uID09IFRFU1RfRElEX05PVF9ESUUgPyBrRGVhdGhUZXN0TGl2ZWQgOgorICAgICAgcmVhc29uID09IFRFU1RfVEhSRVdfRVhDRVBUSU9OID8ga0RlYXRoVGVzdFRocmV3IDoga0RlYXRoVGVzdFJldHVybmVkOworCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8ocG9zaXg6OldyaXRlKHdyaXRlX2ZkKCksICZzdGF0dXNfY2gsIDEpKTsKKyAgLy8gV2UgYXJlIGxlYWtpbmcgdGhlIGRlc2NyaXB0b3IgaGVyZSBiZWNhdXNlIG9uIHNvbWUgcGxhdGZvcm1zIChpLmUuLAorICAvLyB3aGVuIGJ1aWx0IGFzIFdpbmRvd3MgRExMKSwgZGVzdHJ1Y3RvcnMgb2YgZ2xvYmFsIG9iamVjdHMgd2lsbCBzdGlsbAorICAvLyBydW4gYWZ0ZXIgY2FsbGluZyBfZXhpdCgpLiBPbiBzdWNoIHN5c3RlbXMsIHdyaXRlX2ZkXyB3aWxsIGJlCisgIC8vIGluZGlyZWN0bHkgY2xvc2VkIGZyb20gdGhlIGRlc3RydWN0b3Igb2YgVW5pdFRlc3RJbXBsLCBjYXVzaW5nIGRvdWJsZQorICAvLyBjbG9zZSBpZiBpdCBpcyBhbHNvIGNsb3NlZCBoZXJlLiBPbiBkZWJ1ZyBjb25maWd1cmF0aW9ucywgZG91YmxlIGNsb3NlCisgIC8vIG1heSBhc3NlcnQuIEFzIHRoZXJlIGFyZSBubyBpbi1wcm9jZXNzIGJ1ZmZlcnMgdG8gZmx1c2ggaGVyZSwgd2UgYXJlCisgIC8vIHJlbHlpbmcgb24gdGhlIE9TIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIGFmdGVyIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMKKyAgLy8gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlIG5vdCBydW4uCisgIF9leGl0KDEpOyAgLy8gRXhpdHMgdy9vIGFueSBub3JtYWwgZXhpdCBob29rcyAod2Ugd2VyZSBzdXBwb3NlZCB0byBjcmFzaCkKK30KKworLy8gUmV0dXJucyBhbiBpbmRlbnRlZCBjb3B5IG9mIHN0ZGVyciBvdXRwdXQgZm9yIGEgZGVhdGggdGVzdC4KKy8vIFRoaXMgbWFrZXMgZGlzdGluZ3Vpc2hpbmcgZGVhdGggdGVzdCBvdXRwdXQgbGluZXMgZnJvbSByZWd1bGFyIGxvZyBsaW5lcworLy8gbXVjaCBlYXNpZXIuCitzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXREZWF0aFRlc3RPdXRwdXQoY29uc3QgOjpzdGQ6OnN0cmluZyYgb3V0cHV0KSB7CisgIDo6c3RkOjpzdHJpbmcgcmV0OworICBmb3IgKHNpemVfdCBhdCA9IDA7IDsgKSB7CisgICAgY29uc3Qgc2l6ZV90IGxpbmVfZW5kID0gb3V0cHV0LmZpbmQoJ1xuJywgYXQpOworICAgIHJldCArPSAiWyAgREVBVEggICBdICI7CisgICAgaWYgKGxpbmVfZW5kID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCArPSBvdXRwdXQuc3Vic3RyKGF0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCwgbGluZV9lbmQgKyAxIC0gYXQpOworICAgIGF0ID0gbGluZV9lbmQgKyAxOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vIEFzc2Vzc2VzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgYSBkZWF0aCB0ZXN0LCB1c2luZyBib3RoIHByaXZhdGUKKy8vIG1lbWJlcnMgd2hpY2ggaGF2ZSBwcmV2aW91c2x5IGJlZW4gc2V0LCBhbmQgb25lIGFyZ3VtZW50OgorLy8KKy8vIFByaXZhdGUgZGF0YSBtZW1iZXJzOgorLy8gICBvdXRjb21lOiAgQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIGRlYXRoIHRlc3QKKy8vICAgICAgICAgICAgIGNvbmNsdWRlZDogRElFRCwgTElWRUQsIFRIUkVXLCBvciBSRVRVUk5FRC4gIFRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBmYWlscyBpbiB0aGUgbGF0dGVyIHRocmVlIGNhc2VzLgorLy8gICBzdGF0dXM6ICAgVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLiBPbiAqbml4LCBpdCBpcyBpbiB0aGUKKy8vICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHdhaXQoMikuIE9uIFdpbmRvd3MsIHRoaXMgaXMgdGhlCisvLyAgICAgICAgICAgICB2YWx1ZSBzdXBwbGllZCB0byB0aGUgRXhpdFByb2Nlc3MoKSBBUEkgb3IgYSBudW1lcmljIGNvZGUKKy8vICAgICAgICAgICAgIG9mIHRoZSBleGNlcHRpb24gdGhhdCB0ZXJtaW5hdGVkIHRoZSBwcm9ncmFtLgorLy8gICByZWdleDogICAgQSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IHRvIGJlIGFwcGxpZWQgdG8KKy8vICAgICAgICAgICAgIHRoZSB0ZXN0J3MgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3Igb3V0cHV0OyB0aGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgZmFpbHMgaWYgaXQgZG9lcyBub3QgbWF0Y2guCisvLworLy8gQXJndW1lbnQ6CisvLyAgIHN0YXR1c19vazogdHJ1ZSBpZiBleGl0X3N0YXR1cyBpcyBhY2NlcHRhYmxlIGluIHRoZSBjb250ZXh0IG9mCisvLyAgICAgICAgICAgICAgdGhpcyBwYXJ0aWN1bGFyIGRlYXRoIHRlc3QsIHdoaWNoIGZhaWxzIGlmIGl0IGlzIGZhbHNlCisvLworLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgYXJlIG1ldC4gIE90aGVyd2lzZSwgdGhlCisvLyBmaXJzdCBmYWlsaW5nIGNvbmRpdGlvbiwgaW4gdGhlIG9yZGVyIGdpdmVuIGFib3ZlLCBpcyB0aGUgb25lIHRoYXQgaXMKKy8vIHJlcG9ydGVkLiBBbHNvIHNldHMgdGhlIGxhc3QgZGVhdGggdGVzdCBtZXNzYWdlIHN0cmluZy4KK2Jvb2wgRGVhdGhUZXN0SW1wbDo6UGFzc2VkKGJvb2wgc3RhdHVzX29rKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKworICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgTWVzc2FnZSBidWZmZXI7CisKKyAgYnVmZmVyIDw8ICJEZWF0aCB0ZXN0OiAiIDw8IHN0YXRlbWVudCgpIDw8ICJcbiI7CisgIHN3aXRjaCAob3V0Y29tZSgpKSB7CisgICAgY2FzZSBMSVZFRDoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZmFpbGVkIHRvIGRpZS5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUSFJFVzoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogdGhyZXcgYW4gZXhjZXB0aW9uLlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFVFVSTkVEOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBpbGxlZ2FsIHJldHVybiBpbiB0ZXN0IHN0YXRlbWVudC5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESUVEOgorICAgICAgaWYgKHN0YXR1c19vaykgeworICAgICAgICBjb25zdCBib29sIG1hdGNoZWQgPSBSRTo6UGFydGlhbE1hdGNoKGVycm9yX21lc3NhZ2UuY19zdHIoKSwgKnJlZ2V4KCkpOworICAgICAgICBpZiAobWF0Y2hlZCkgeworICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXJyb3IuXG4iCisgICAgICAgICAgICAgICAgIDw8ICIgIEV4cGVjdGVkOiAiIDw8IHJlZ2V4KCktPnBhdHRlcm4oKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIgorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICIgPDwgRXhpdFN1bW1hcnkoc3RhdHVzKCkpIDw8ICJcbiIKKyAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElOX1BST0dSRVNTOgorICAgIGRlZmF1bHQ6CisgICAgICBHVEVTVF9MT0dfKEZBVEFMKQorICAgICAgICAgIDw8ICJEZWF0aFRlc3Q6OlBhc3NlZCBzb21laG93IGNhbGxlZCBiZWZvcmUgY29uY2x1c2lvbiBvZiB0ZXN0IjsKKyAgfQorCisgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGJ1ZmZlci5HZXRTdHJpbmcoKSk7CisgIHJldHVybiBzdWNjZXNzOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFdpbmRvd3NEZWF0aFRlc3QgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLiBEdWUgdG8gdGhlCisvLyBzcGVjaWZpY3Mgb2Ygc3RhcnRpbmcgbmV3IHByb2Nlc3NlcyBvbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUKKy8vIGFsd2F5cyB0aHJlYWRzYWZlLCBhbmQgR29vZ2xlIFRlc3QgY29uc2lkZXJzIHRoZQorLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPWZhc3Qgc2V0dGluZyB0byBiZSBlcXVpdmFsZW50IHRvCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9dGhyZWFkc2FmZSB0aGVyZS4KKy8vCisvLyBBIGZldyBpbXBsZW1lbnRhdGlvbiBub3RlczogIExpa2UgdGhlIExpbnV4IHZlcnNpb24sIHRoZSBXaW5kb3dzCisvLyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBpcGVzIGZvciBjaGlsZC10by1wYXJlbnQgY29tbXVuaWNhdGlvbi4gQnV0IGR1ZSB0bworLy8gdGhlIHNwZWNpZmljcyBvZiBwaXBlcyBvbiBXaW5kb3dzLCBzb21lIGV4dHJhIHN0ZXBzIGFyZSByZXF1aXJlZDoKKy8vCisvLyAxLiBUaGUgcGFyZW50IGNyZWF0ZXMgYSBjb21tdW5pY2F0aW9uIHBpcGUgYW5kIHN0b3JlcyBoYW5kbGVzIHRvIGJvdGgKKy8vICAgIGVuZHMgb2YgaXQuCisvLyAyLiBUaGUgcGFyZW50IHN0YXJ0cyB0aGUgY2hpbGQgYW5kIHByb3ZpZGVzIGl0IHdpdGggdGhlIGluZm9ybWF0aW9uCisvLyAgICBuZWNlc3NhcnkgdG8gYWNxdWlyZSB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuCisvLyAzLiBUaGUgY2hpbGQgYWNxdWlyZXMgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBhbmQgc2lnbmFscyB0aGUgcGFyZW50CisvLyAgICB1c2luZyBhIFdpbmRvd3MgZXZlbnQuCisvLyA0LiBOb3cgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9uIGl0cyBzaWRlLiBJZgorLy8gICAgdGhpcyBpcyBkb25lIGJlZm9yZSBzdGVwIDMsIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZ29lcyBkb3duIHRvCisvLyAgICAwIGFuZCBpdCBpcyBkZXN0cm95ZWQsIHByZXZlbnRpbmcgdGhlIGNoaWxkIGZyb20gYWNxdWlyaW5nIGl0LiBUaGUKKy8vICAgIHBhcmVudCBub3cgaGFzIHRvIHJlbGVhc2UgaXQsIG9yIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgcmVhZCBlbmQgb2YKKy8vICAgIHRoZSBwaXBlIHdpbGwgbm90IHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgorLy8gNS4gVGhlIHBhcmVudCByZWFkcyBjaGlsZCdzIG91dHB1dCB0aHJvdWdoIHRoZSBwaXBlIChvdXRjb21lIGNvZGUgYW5kCisvLyAgICBhbnkgcG9zc2libGUgZXJyb3IgbWVzc2FnZXMpIGZyb20gdGhlIHBpcGUsIGFuZCBpdHMgc3RkZXJyIGFuZCB0aGVuCisvLyAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gZmFpbCB0aGUgdGVzdC4KKy8vCisvLyBOb3RlOiB0byBkaXN0aW5ndWlzaCBXaW4zMiBBUEkgY2FsbHMgZnJvbSB0aGUgbG9jYWwgbWV0aG9kIGFuZCBmdW5jdGlvbgorLy8gY2FsbHMsIHRoZSBmb3JtZXIgYXJlIGV4cGxpY2l0bHkgcmVzb2x2ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisvLworY2xhc3MgV2luZG93c0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIFdpbmRvd3NEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUkUqIGFfcmVnZXgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkKKyAgICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7fQorCisgIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgorICB2aXJ0dWFsIGludCBXYWl0KCk7CisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87CisgIC8vIEhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLgorICBBdXRvSGFuZGxlIHdyaXRlX2hhbmRsZV87CisgIC8vIENoaWxkIHByb2Nlc3MgaGFuZGxlLgorICBBdXRvSGFuZGxlIGNoaWxkX2hhbmRsZV87CisgIC8vIEV2ZW50IHRoZSBjaGlsZCBwcm9jZXNzIHVzZXMgdG8gc2lnbmFsIHRoZSBwYXJlbnQgdGhhdCBpdCBoYXMKKyAgLy8gYWNxdWlyZWQgdGhlIGhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLiBBZnRlciBzZWVpbmcgdGhpcworICAvLyBldmVudCB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gaGFuZGxlcyB0byBtYWtlIHN1cmUgaXRzCisgIC8vIFJlYWRGaWxlKCkgY2FsbHMgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCisgIEF1dG9IYW5kbGUgZXZlbnRfaGFuZGxlXzsKK307CisKKy8vIFdhaXRzIGZvciB0aGUgY2hpbGQgaW4gYSBkZWF0aCB0ZXN0IHRvIGV4aXQsIHJldHVybmluZyBpdHMgZXhpdAorLy8gc3RhdHVzLCBvciAwIGlmIG5vIGNoaWxkIHByb2Nlc3MgZXhpc3RzLiAgQXMgYSBzaWRlIGVmZmVjdCwgc2V0cyB0aGUKKy8vIG91dGNvbWUgZGF0YSBtZW1iZXIuCitpbnQgV2luZG93c0RlYXRoVGVzdDo6V2FpdCgpIHsKKyAgaWYgKCFzcGF3bmVkKCkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gV2FpdCB1bnRpbCB0aGUgY2hpbGQgZWl0aGVyIHNpZ25hbHMgdGhhdCBpdCBoYXMgYWNxdWlyZWQgdGhlIHdyaXRlIGVuZAorICAvLyBvZiB0aGUgcGlwZSBvciBpdCBkaWVzLgorICBjb25zdCBIQU5ETEUgd2FpdF9oYW5kbGVzWzJdID0geyBjaGlsZF9oYW5kbGVfLkdldCgpLCBldmVudF9oYW5kbGVfLkdldCgpIH07CisgIHN3aXRjaCAoOjpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBXYWl0cyBmb3IgYW55IG9mIHRoZSBoYW5kbGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpIHsKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzA6CisgICAgY2FzZSBXQUlUX09CSkVDVF8wICsgMToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmYWxzZSk7ICAvLyBTaG91bGQgbm90IGdldCBoZXJlLgorICB9CisKKyAgLy8gVGhlIGNoaWxkIGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9yIGV4aXRlZC4KKyAgLy8gV2UgcmVsZWFzZSB0aGUgaGFuZGxlIG9uIG91ciBzaWRlIGFuZCBjb250aW51ZS4KKyAgd3JpdGVfaGFuZGxlXy5SZXNldCgpOworICBldmVudF9oYW5kbGVfLlJlc2V0KCk7CisKKyAgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKKworICAvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gZXhpdCBpZiBpdCBoYXZlbid0IGFscmVhZHkuIFRoaXMKKyAgLy8gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGUgY2hpbGQgaGFzIGFscmVhZHkgZXhpdGVkLCByZWdhcmRsZXNzIG9mCisgIC8vIHdoZXRoZXIgcHJldmlvdXMgY2FsbHMgdG8gV2FpdEZvck11bHRpcGxlT2JqZWN0cyBzeW5jaHJvbml6ZWQgb24gdGhpcworICAvLyBoYW5kbGUgb3Igbm90LgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIFdBSVRfT0JKRUNUXzAgPT0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGNoaWxkX2hhbmRsZV8uR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpOworICBEV09SRCBzdGF0dXNfY29kZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICA6OkdldEV4aXRDb2RlUHJvY2VzcyhjaGlsZF9oYW5kbGVfLkdldCgpLCAmc3RhdHVzX2NvZGUpICE9IEZBTFNFKTsKKyAgY2hpbGRfaGFuZGxlXy5SZXNldCgpOworICBzZXRfc3RhdHVzKHN0YXRpY19jYXN0PGludD4oc3RhdHVzX2NvZGUpKTsKKyAgcmV0dXJuIHN0YXR1cygpOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIFdpbmRvd3MgZGVhdGggdGVzdC4gIEl0IGNyZWF0ZXMgYSBjaGlsZAorLy8gcHJvY2VzcyB3aXRoIHRoZSBzYW1lIGV4ZWN1dGFibGUgYXMgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBydW4gdGhlCisvLyBkZWF0aCB0ZXN0LiAgVGhlIGNoaWxkIHByb2Nlc3MgaXMgZ2l2ZW4gdGhlIC0tZ3Rlc3RfZmlsdGVyIGFuZAorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFncyBzdWNoIHRoYXQgaXQga25vd3MgdG8gcnVuIHRoZQorLy8gY3VycmVudCBkZWF0aCB0ZXN0IG9ubHkuCitEZWF0aFRlc3Q6OlRlc3RSb2xlIFdpbmRvd3NEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW5mby0+cmVzdWx0KCktPmRlYXRoX3Rlc3RfY291bnQoKTsKKworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgLy8gUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSBoYXMgcGVyZm9ybWVkIGFsbCB0aGUgbmVjZXNzYXJ5CisgICAgLy8gcHJvY2Vzc2luZy4KKyAgICBzZXRfd3JpdGVfZmQoZmxhZy0+d3JpdGVfZmQoKSk7CisgICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsKKyAgfQorCisgIC8vIFdpbmRvd3NEZWF0aFRlc3QgdXNlcyBhbiBhbm9ueW1vdXMgcGlwZSB0byBjb21tdW5pY2F0ZSByZXN1bHRzIG9mCisgIC8vIGEgZGVhdGggdGVzdC4KKyAgU0VDVVJJVFlfQVRUUklCVVRFUyBoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSA9IHsKKyAgICBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUyksIE5VTEwsIFRSVUUgfTsKKyAgSEFORExFIHJlYWRfaGFuZGxlLCB3cml0ZV9oYW5kbGU7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgOjpDcmVhdGVQaXBlKCZyZWFkX2hhbmRsZSwgJndyaXRlX2hhbmRsZSwgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgIDApICAvLyBEZWZhdWx0IGJ1ZmZlciBzaXplLgorICAgICAgIT0gRkFMU0UpOworICBzZXRfcmVhZF9mZCg6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihyZWFkX2hhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZKSk7CisgIHdyaXRlX2hhbmRsZV8uUmVzZXQod3JpdGVfaGFuZGxlKTsKKyAgZXZlbnRfaGFuZGxlXy5SZXNldCg6OkNyZWF0ZUV2ZW50KAorICAgICAgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAorICAgICAgVFJVRSwgICAgLy8gVGhlIGV2ZW50IHdpbGwgYXV0b21hdGljYWxseSByZXNldCB0byBub24tc2lnbmFsZWQgc3RhdGUuCisgICAgICBGQUxTRSwgICAvLyBUaGUgaW5pdGlhbCBzdGF0ZSBpcyBub24tc2lnbmFsbGVkLgorICAgICAgTlVMTCkpOyAgLy8gVGhlIGV2ZW4gaXMgdW5uYW1lZC4KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXZlbnRfaGFuZGxlXy5HZXQoKSAhPSBOVUxMKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IiArCisgICAgICBpbmZvLT50ZXN0X2Nhc2VfbmFtZSgpICsgIi4iICsgaW5mby0+bmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArCisgICAgICAiPSIgKyBmaWxlXyArICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lXykgKyAifCIgKworICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpICsgInwiICsKKyAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDo6R2V0Q3VycmVudFByb2Nlc3NJZCgpKSkgKworICAgICAgLy8gc2l6ZV90IGhhcyB0aGUgc2FtZSB3aWR0aCBhcyBwb2ludGVycyBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0CisgICAgICAvLyBXaW5kb3dzIHBsYXRmb3Jtcy4KKyAgICAgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvdGN4ZjFkdzYuYXNweC4KKyAgICAgICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhyZWludGVycHJldF9jYXN0PHNpemVfdD4od3JpdGVfaGFuZGxlKSkgKworICAgICAgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihldmVudF9oYW5kbGVfLkdldCgpKSk7CisKKyAgY2hhciBleGVjdXRhYmxlX3BhdGhbX01BWF9QQVRIICsgMV07ICAvLyBOT0xJTlQKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICBfTUFYX1BBVEggKyAxICE9IDo6R2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01BWF9QQVRIKSk7CisKKyAgc3RkOjpzdHJpbmcgY29tbWFuZF9saW5lID0KKyAgICAgIHN0ZDo6c3RyaW5nKDo6R2V0Q29tbWFuZExpbmVBKCkpICsgIiAiICsgZmlsdGVyX2ZsYWcgKyAiIFwiIiArCisgICAgICBpbnRlcm5hbF9mbGFnICsgIlwiIjsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICAvLyBGbHVzaCB0aGUgbG9nIGJ1ZmZlcnMgc2luY2UgdGhlIGxvZyBzdHJlYW1zIGFyZSBzaGFyZWQgd2l0aCB0aGUgY2hpbGQuCisgIEZsdXNoSW5mb0xvZygpOworCisgIC8vIFRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgc2hhcmUgdGhlIHN0YW5kYXJkIGhhbmRsZXMgd2l0aCB0aGUgcGFyZW50LgorICBTVEFSVFVQSU5GT0Egc3RhcnR1cF9pbmZvOworICBtZW1zZXQoJnN0YXJ0dXBfaW5mbywgMCwgc2l6ZW9mKFNUQVJUVVBJTkZPKSk7CisgIHN0YXJ0dXBfaW5mby5kd0ZsYWdzID0gU1RBUlRGX1VTRVNUREhBTkRMRVM7CisgIHN0YXJ0dXBfaW5mby5oU3RkSW5wdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKKyAgc3RhcnR1cF9pbmZvLmhTdGRPdXRwdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisgIHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPSA6OkdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKKworICBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NfaW5mbzsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oOjpDcmVhdGVQcm9jZXNzQSgKKyAgICAgIGV4ZWN1dGFibGVfcGF0aCwKKyAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGNvbW1hbmRfbGluZS5jX3N0cigpKSwKKyAgICAgIE5VTEwsICAgLy8gUmV0dW5lZCBwcm9jZXNzIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCisgICAgICBOVUxMLCAgIC8vIFJldHVuZWQgdGhyZWFkIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCisgICAgICBUUlVFLCAgIC8vIENoaWxkIGluaGVyaXRzIGFsbCBpbmhlcml0YWJsZSBoYW5kbGVzIChmb3Igd3JpdGVfaGFuZGxlXykuCisgICAgICAweDAsICAgIC8vIERlZmF1bHQgY3JlYXRpb24gZmxhZ3MuCisgICAgICBOVUxMLCAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGVudmlyb25tZW50LgorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCksCisgICAgICAmc3RhcnR1cF9pbmZvLAorICAgICAgJnByb2Nlc3NfaW5mbykgIT0gRkFMU0UpOworICBjaGlsZF9oYW5kbGVfLlJlc2V0KHByb2Nlc3NfaW5mby5oUHJvY2Vzcyk7CisgIDo6Q2xvc2VIYW5kbGUocHJvY2Vzc19pbmZvLmhUaHJlYWQpOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKyMgZWxzZSAgLy8gV2UgYXJlIG5vdCBvbiBXaW5kb3dzLgorCisvLyBGb3JraW5nRGVhdGhUZXN0IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgbW9zdCBvZiB0aGUgYWJzdHJhY3QKKy8vIG1ldGhvZHMgb2YgdGhlIERlYXRoVGVzdCBpbnRlcmZhY2UuICBPbmx5IHRoZSBBc3N1bWVSb2xlIG1ldGhvZCBpcworLy8gbGVmdCB1bmRlZmluZWQuCitjbGFzcyBGb3JraW5nRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgeworIHB1YmxpYzoKKyAgRm9ya2luZ0RlYXRoVGVzdChjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCk7CisKKyAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCisgIHZpcnR1YWwgaW50IFdhaXQoKTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBzZXRfY2hpbGRfcGlkKHBpZF90IGNoaWxkX3BpZCkgeyBjaGlsZF9waWRfID0gY2hpbGRfcGlkOyB9CisKKyBwcml2YXRlOgorICAvLyBQSUQgb2YgY2hpbGQgcHJvY2VzcyBkdXJpbmcgZGVhdGggdGVzdDsgMCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBpdHNlbGYuCisgIHBpZF90IGNoaWxkX3BpZF87Cit9OworCisvLyBDb25zdHJ1Y3RzIGEgRm9ya2luZ0RlYXRoVGVzdC4KK0ZvcmtpbmdEZWF0aFRlc3Q6OkZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksCisgICAgICBjaGlsZF9waWRfKC0xKSB7fQorCisvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKKy8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCisvLyBvdXRjb21lIGRhdGEgbWVtYmVyLgoraW50IEZvcmtpbmdEZWF0aFRlc3Q6OldhaXQoKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiAwOworCisgIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyAgaW50IHN0YXR1c192YWx1ZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyh3YWl0cGlkKGNoaWxkX3BpZF8sICZzdGF0dXNfdmFsdWUsIDApKTsKKyAgc2V0X3N0YXR1cyhzdGF0dXNfdmFsdWUpOworICByZXR1cm4gc3RhdHVzX3ZhbHVlOworfQorCisvLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcywgdGhlbiBpbW1lZGlhdGVseSBydW5zIHRoZSB0ZXN0CisvLyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KK2NsYXNzIE5vRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIE5vRXhlY0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpIDoKKyAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpIHsgfQorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKK307CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgZm9yay1hbmQtcnVuIGRlYXRoIHRlc3QuICBJdCBpbXBsZW1lbnRzIGEKKy8vIHN0cmFpZ2h0Zm9yd2FyZCBmb3JrLCB3aXRoIGEgc2ltcGxlIHBpcGUgdG8gdHJhbnNtaXQgdGhlIHN0YXR1cyBieXRlLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IHNpemVfdCB0aHJlYWRfY291bnQgPSBHZXRUaHJlYWRDb3VudCgpOworICBpZiAodGhyZWFkX2NvdW50ICE9IDEpIHsKKyAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8IERlYXRoVGVzdFRocmVhZFdhcm5pbmcodGhyZWFkX2NvdW50KTsKKyAgfQorCisgIGludCBwaXBlX2ZkWzJdOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhwaXBlKHBpcGVfZmQpICE9IC0xKTsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gV2hlbiB3ZSBmb3JrIHRoZSBwcm9jZXNzIGJlbG93LCB0aGUgbG9nIGZpbGUgYnVmZmVycyBhcmUgY29waWVkLCBidXQgdGhlCisgIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHNoYXJlZC4gIFdlIGZsdXNoIGFsbCBsb2cgZmlsZXMgaGVyZSBzbyB0aGF0IGNsb3NpbmcKKyAgLy8gdGhlIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lc24ndCB0aHJvdyBvZmYgdGhlCisgIC8vIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgLy8gVGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgZm9yayBhcyBwb3NzaWJsZSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIGNhc2UKKyAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHRocmVhZHMgcnVubmluZyBiZWZvcmUgdGhlIGRlYXRoIHRlc3QsIGFuZCBhbm90aGVyCisgIC8vIHRocmVhZCB3cml0ZXMgdG8gdGhlIGxvZyBmaWxlLgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBmb3JrKCk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7CisgIHNldF9jaGlsZF9waWQoY2hpbGRfcGlkKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzBdKSk7CisgICAgc2V0X3dyaXRlX2ZkKHBpcGVfZmRbMV0pOworICAgIC8vIFJlZGlyZWN0cyBhbGwgbG9nZ2luZyB0byBzdGRlcnIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgdG8gcHJldmVudAorICAgIC8vIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZXMuICBXZSBjYXB0dXJlIHN0ZGVyciBpbiB0aGUgcGFyZW50CisgICAgLy8gcHJvY2VzcyBhbmQgYXBwZW5kIHRoZSBjaGlsZCBwcm9jZXNzJyBvdXRwdXQgdG8gYSBsb2cuCisgICAgTG9nVG9TdGRlcnIoKTsKKyAgICAvLyBFdmVudCBmb3J3YXJkaW5nIHRvIHRoZSBsaXN0ZW5lcnMgb2YgZXZlbnQgbGlzdGVuZXIgQVBJIG11c2ggYmUgc2h1dAorICAgIC8vIGRvd24gaW4gZGVhdGggdGVzdCBzdWJwcm9jZXNzZXMuCisgICAgR2V0VW5pdFRlc3RJbXBsKCktPmxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOworICAgIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkID0gdHJ1ZTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9IGVsc2UgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICAgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICAgIHNldF9zcGF3bmVkKHRydWUpOworICAgIHJldHVybiBPVkVSU0VFX1RFU1Q7CisgIH0KK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MgYW5kIHJlLWV4ZWN1dGVzIHRoZSBtYWluCisvLyBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3Mgc2V0IHRoYXQgY2F1c2UKKy8vIG9ubHkgdGhpcyBzcGVjaWZpYyBkZWF0aCB0ZXN0IHRvIGJlIHJ1bi4KK2NsYXNzIEV4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBFeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgOgorICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisgcHJpdmF0ZToKKyAgc3RhdGljIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4KKyAgR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSB7CisgICAgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBhcmdzID0gR2V0SW5qZWN0YWJsZUFyZ3ZzKCk7CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87Cit9OworCisvLyBVdGlsaXR5IGNsYXNzIGZvciBhY2N1bXVsYXRpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KK2NsYXNzIEFyZ3VtZW50cyB7CisgcHVibGljOgorICBBcmd1bWVudHMoKSB7CisgICAgYXJnc18ucHVzaF9iYWNrKE5VTEwpOworICB9CisKKyAgfkFyZ3VtZW50cygpIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IGFyZ3NfLmJlZ2luKCk7IGkgIT0gYXJnc18uZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGZyZWUoKmkpOworICAgIH0KKyAgfQorICB2b2lkIEFkZEFyZ3VtZW50KGNvbnN0IGNoYXIqIGFyZ3VtZW50KSB7CisgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChhcmd1bWVudCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KKyAgdm9pZCBBZGRBcmd1bWVudHMoY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHI+JiBhcmd1bWVudHMpIHsKKyAgICBmb3IgKHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8U3RyPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3VtZW50cy5iZWdpbigpOworICAgICAgICAgaSAhPSBhcmd1bWVudHMuZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGFyZ3NfLmluc2VydChhcmdzXy5lbmQoKSAtIDEsIHBvc2l4OjpTdHJEdXAoaS0+Y19zdHIoKSkpOworICAgIH0KKyAgfQorICBjaGFyKiBjb25zdCogQXJndigpIHsKKyAgICByZXR1cm4gJmFyZ3NfWzBdOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxjaGFyKj4gYXJnc187Cit9OworCisvLyBBIHN0cnVjdCB0aGF0IGVuY29tcGFzc2VzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNoaWxkIHByb2Nlc3Mgb2YgYQorLy8gdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IHByb2Nlc3MuCitzdHJ1Y3QgRXhlY0RlYXRoVGVzdEFyZ3MgeworICBjaGFyKiBjb25zdCogYXJndjsgIC8vIENvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjaGlsZCdzIGNhbGwgdG8gZXhlYworICBpbnQgY2xvc2VfZmQ7ICAgICAgIC8vIEZpbGUgZGVzY3JpcHRvciB0byBjbG9zZTsgdGhlIHJlYWQgZW5kIG9mIGEgcGlwZQorfTsKKworIyAgaWYgR1RFU1RfT1NfTUFDCitpbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7CisgIC8vIFdoZW4gR29vZ2xlIFRlc3QgaXMgYnVpbHQgYXMgYSBmcmFtZXdvcmsgb24gTWFjT1MgWCwgdGhlIGVudmlyb24gdmFyaWFibGUKKyAgLy8gaXMgdW5hdmFpbGFibGUuIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbiAobWFuIGVudmlyb24pIHJlY29tbWVuZHMgdXNpbmcKKyAgLy8gX05TR2V0RW52aXJvbigpIGluc3RlYWQuCisgIHJldHVybiAqX05TR2V0RW52aXJvbigpOworfQorIyAgZWxzZQorLy8gU29tZSBQT1NJWCBwbGF0Zm9ybXMgZXhwZWN0IHlvdSB0byBkZWNsYXJlIGVudmlyb24uIGV4dGVybiAiQyIgbWFrZXMKKy8vIGl0IHJlc2lkZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK2V4dGVybiAiQyIgY2hhcioqIGVudmlyb247CitpbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7IHJldHVybiBlbnZpcm9uOyB9CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyMgIGlmICFHVEVTVF9PU19RTlgKKy8vIFRoZSBtYWluIGZ1bmN0aW9uIGZvciBhIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgorLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjbG9uZSgpLWVkIHByb2Nlc3MgYW5kIHRodXMgbXVzdCBhdm9pZAorLy8gYW55IHBvdGVudGlhbGx5IHVuc2FmZSBvcGVyYXRpb25zIGxpa2UgbWFsbG9jIG9yIGxpYmMgZnVuY3Rpb25zLgorc3RhdGljIGludCBFeGVjRGVhdGhUZXN0Q2hpbGRNYWluKHZvaWQqIGNoaWxkX2FyZykgeworICBFeGVjRGVhdGhUZXN0QXJncyogY29uc3QgYXJncyA9IHN0YXRpY19jYXN0PEV4ZWNEZWF0aFRlc3RBcmdzKj4oY2hpbGRfYXJnKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShhcmdzLT5jbG9zZV9mZCkpOworCisgIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlCisgIC8vIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQuICBUaGVyZWZvcmUgd2UgY2hhbmdlIHRvIHRoZSBvcmlnaW5hbAorICAvLyB3b3JraW5nIGRpcmVjdG9yeSBmaXJzdC4KKyAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpOworICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgY2hkaXIoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLgorICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImNoZGlyKFwiIikgKyBvcmlnaW5hbF9kaXIgKyAiXCIpIGZhaWxlZDogIiArCisgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBleGVjdmUoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLiAgV2UKKyAgLy8gY2Fubm90IHVzZSBleGVjdnAoKSBhcyBpdCdzIGEgbGliYyBmdW5jdGlvbiBhbmQgdGh1cyBwb3RlbnRpYWxseQorICAvLyB1bnNhZmUuICBTaW5jZSBleGVjdmUoKSBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSCwgdGhlIHVzZXIgbXVzdAorICAvLyBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSB2YWxpZCBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3QKKyAgLy8gb25lIHBhdGggc2VwYXJhdG9yLgorICBleGVjdmUoYXJncy0+YXJndlswXSwgYXJncy0+YXJndiwgR2V0RW52aXJvbigpKTsKKyAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImV4ZWN2ZSgiKSArIGFyZ3MtPmFyZ3ZbMF0gKyAiLCAuLi4pIGluICIgKworICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kaXIgKyAiIGZhaWxlZDogIiArCisgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkpOworICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorIyAgZW5kaWYgIC8vICFHVEVTVF9PU19RTlgKKworLy8gVHdvIHV0aWxpdHkgcm91dGluZXMgdGhhdCB0b2dldGhlciBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiB0aGUgc3RhY2sKKy8vIGdyb3dzLgorLy8gVGhpcyBjb3VsZCBiZSBhY2NvbXBsaXNoZWQgbW9yZSBlbGVnYW50bHkgYnkgYSBzaW5nbGUgcmVjdXJzaXZlCisvLyBmdW5jdGlvbiwgYnV0IHdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgdW5saWtlbHkgcG9zc2liaWxpdHkgb2YKKy8vIGEgc21hcnQgY29tcGlsZXIgb3B0aW1pemluZyB0aGUgcmVjdXJzaW9uIGF3YXkuCisvLworLy8gR1RFU1RfTk9fSU5MSU5FXyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IEdDQyA0LjYgZnJvbSBpbmxpbmluZworLy8gU3RhY2tMb3dlclRoYW5BZGRyZXNzIGludG8gU3RhY2tHcm93c0Rvd24sIHdoaWNoIHRoZW4gZG9lc24ndCBnaXZlCisvLyBjb3JyZWN0IGFuc3dlci4KK3ZvaWQgU3RhY2tMb3dlclRoYW5BZGRyZXNzKGNvbnN0IHZvaWQqIHB0ciwgYm9vbCogcmVzdWx0KSBHVEVTVF9OT19JTkxJTkVfOwordm9pZCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyLCBib29sKiByZXN1bHQpIHsKKyAgaW50IGR1bW15OworICAqcmVzdWx0ID0gKCZkdW1teSA8IHB0cik7Cit9CisKK2Jvb2wgU3RhY2tHcm93c0Rvd24oKSB7CisgIGludCBkdW1teTsKKyAgYm9vbCByZXN1bHQ7CisgIFN0YWNrTG93ZXJUaGFuQWRkcmVzcygmZHVtbXksICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIGluCisvLyBhIHRocmVhZC1zYWZlIG1hbm5lciBhbmQgaW5zdHJ1Y3RzIGl0IHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoZQorLy8gaW1wbGVtZW50YXRpb24gdXNlcyBmb3JrKDIpICsgZXhlYy4gIE9uIHN5c3RlbXMgd2hlcmUgY2xvbmUoMikgaXMKKy8vIGF2YWlsYWJsZSwgaXQgaXMgdXNlZCBpbnN0ZWFkLCBiZWluZyBzbGlnaHRseSBtb3JlIHRocmVhZC1zYWZlLiAgT24gUU5YLAorLy8gZm9yayBzdXBwb3J0cyBvbmx5IHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHNvIHRoaXMgZnVuY3Rpb24gdXNlcworLy8gc3Bhd24oMikgdGhlcmUgaW5zdGVhZC4gIFRoZSBmdW5jdGlvbiBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZgorLy8gYW55dGhpbmcgZ29lcyB3cm9uZy4KK3N0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07CisgIHBpZF90IGNoaWxkX3BpZCA9IC0xOworCisjICBpZiBHVEVTVF9PU19RTlgKKyAgLy8gT2J0YWlucyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNldHMgaXQgdG8gYmUgY2xvc2VkIGluIHRoZSBjaGlsZAorICAvLyBwcm9jZXNzLgorICBjb25zdCBpbnQgY3dkX2ZkID0gb3BlbigiLiIsIE9fUkRPTkxZKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY3dkX2ZkICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjd2RfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpKTsKKyAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKKyAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCisgIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgorICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7CisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCisgIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKKyAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgaW50IGZkX2ZsYWdzOworICAvLyBTZXQgY2xvc2VfZmQgdG8gYmUgY2xvc2VkIGFmdGVyIHNwYXduLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZkX2ZsYWdzID0gZmNudGwoY2xvc2VfZmQsIEZfR0VURkQpKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjbG9zZV9mZCwgRl9TRVRGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9mbGFncyB8IEZEX0NMT0VYRUMpKTsKKyAgc3RydWN0IGluaGVyaXRhbmNlIGluaGVyaXQgPSB7MH07CisgIC8vIHNwYXduIGlzIGEgc3lzdGVtIGNhbGwuCisgIGNoaWxkX3BpZCA9IHNwYXduKGFyZ3MuYXJndlswXSwgMCwgTlVMTCwgJmluaGVyaXQsIGFyZ3MuYXJndiwgR2V0RW52aXJvbigpKTsKKyAgLy8gUmVzdG9yZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZjaGRpcihjd2RfZmQpICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShjd2RfZmQpKTsKKworIyAgZWxzZSAgIC8vIEdURVNUX09TX1FOWAorIyAgIGlmIEdURVNUX09TX0xJTlVYCisgIC8vIFdoZW4gYSBTSUdQUk9GIHNpZ25hbCBpcyByZWNlaXZlZCB3aGlsZSBmb3JrKCkgb3IgY2xvbmUoKSBhcmUgZXhlY3V0aW5nLAorICAvLyB0aGUgcHJvY2VzcyBtYXkgaGFuZy4gVG8gYXZvaWQgdGhpcywgd2UgaWdub3JlIFNJR1BST0YgaGVyZSBhbmQgcmUtZW5hYmxlCisgIC8vIGl0IGFmdGVyIHRoZSBjYWxsIHRvIGZvcmsoKS9jbG9uZSgpIGlzIGNvbXBsZXRlLgorICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhdmVkX3NpZ3Byb2ZfYWN0aW9uOworICBzdHJ1Y3Qgc2lnYWN0aW9uIGlnbm9yZV9zaWdwcm9mX2FjdGlvbjsKKyAgbWVtc2V0KCZpZ25vcmVfc2lncHJvZl9hY3Rpb24sIDAsIHNpemVvZihpZ25vcmVfc2lncHJvZl9hY3Rpb24pKTsKKyAgc2lnZW1wdHlzZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9tYXNrKTsKKyAgaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHNpZ2FjdGlvbigKKyAgICAgIFNJR1BST0YsICZpZ25vcmVfc2lncHJvZl9hY3Rpb24sICZzYXZlZF9zaWdwcm9mX2FjdGlvbikpOworIyAgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjICAgaWYgR1RFU1RfSEFTX0NMT05FCisgIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCisgIGlmICghdXNlX2ZvcmspIHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzdGFja19ncm93c19kb3duID0gU3RhY2tHcm93c0Rvd24oKTsKKyAgICBjb25zdCBzaXplX3Qgc3RhY2tfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgLy8gTU1BUF9BTk9OWU1PVVMgaXMgbm90IGRlZmluZWQgb24gTWFjLCBzbyB3ZSB1c2UgTUFQX0FOT04gaW5zdGVhZC4KKyAgICB2b2lkKiBjb25zdCBzdGFjayA9IG1tYXAoTlVMTCwgc3RhY2tfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT04gfCBNQVBfUFJJVkFURSwgLTEsIDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrICE9IE1BUF9GQUlMRUQpOworCisgICAgLy8gTWF4aW11bSBzdGFjayBhbGlnbm1lbnQgaW4gYnl0ZXM6ICBGb3IgYSBkb3dud2FyZC1ncm93aW5nIHN0YWNrLCB0aGlzCisgICAgLy8gYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSBzaXplIG9mIHRoZSBzdGFjayBzcGFjZSB0byBnZXQgYW4gYWRkcmVzcworICAgIC8vIHRoYXQgaXMgd2l0aGluIHRoZSBzdGFjayBzcGFjZSBhbmQgaXMgYWxpZ25lZCBvbiBhbGwgc3lzdGVtcyB3ZSBjYXJlCisgICAgLy8gYWJvdXQuICBBcyBmYXIgYXMgSSBrbm93IHRoZXJlIGlzIG5vIEFCSSB3aXRoIHN0YWNrIGFsaWdubWVudCBncmVhdGVyCisgICAgLy8gdGhhbiA2NC4gIFdlIGFzc3VtZSBzdGFjayBhbmQgc3RhY2tfc2l6ZSBhbHJlYWR5IGhhdmUgYWxpZ25tZW50IG9mCisgICAgLy8ga01heFN0YWNrQWxpZ25tZW50LgorICAgIGNvbnN0IHNpemVfdCBrTWF4U3RhY2tBbGlnbm1lbnQgPSA2NDsKKyAgICB2b2lkKiBjb25zdCBzdGFja190b3AgPQorICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhY2spICsKKyAgICAgICAgICAgIChzdGFja19ncm93c19kb3duID8gc3RhY2tfc2l6ZSAtIGtNYXhTdGFja0FsaWdubWVudCA6IDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrX3NpemUgPiBrTWF4U3RhY2tBbGlnbm1lbnQgJiYKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oc3RhY2tfdG9wKSAlIGtNYXhTdGFja0FsaWdubWVudCA9PSAwKTsKKworICAgIGNoaWxkX3BpZCA9IGNsb25lKCZFeGVjRGVhdGhUZXN0Q2hpbGRNYWluLCBzdGFja190b3AsIFNJR0NITEQsICZhcmdzKTsKKworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKG11bm1hcChzdGFjaywgc3RhY2tfc2l6ZSkgIT0gLTEpOworICB9CisjICAgZWxzZQorICBjb25zdCBib29sIHVzZV9mb3JrID0gdHJ1ZTsKKyMgICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKyAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKKyAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOworICAgICAgX2V4aXQoMCk7CisgIH0KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19RTlgKKyMgIGlmIEdURVNUX09TX0xJTlVYCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oCisgICAgICBzaWdhY3Rpb24oU0lHUFJPRiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uLCBOVUxMKSk7CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICByZXR1cm4gY2hpbGRfcGlkOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQorLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKKyAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IgorICAgICAgKyBpbmZvLT50ZXN0X2Nhc2VfbmFtZSgpICsgIi4iICsgaW5mby0+bmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArICI9IgorICAgICAgKyBmaWxlXyArICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lXykgKyAifCIKKyAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpICsgInwiCisgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhwaXBlX2ZkWzFdKTsKKyAgQXJndW1lbnRzIGFyZ3M7CisgIGFyZ3MuQWRkQXJndW1lbnRzKEdldEFyZ3ZzRm9yRGVhdGhUZXN0Q2hpbGRQcm9jZXNzKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGZpbHRlcl9mbGFnLmNfc3RyKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gU2VlIHRoZSBjb21tZW50IGluIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSBmb3Igd2h5IHRoZSBuZXh0IGxpbmUKKyAgLy8gaXMgbmVjZXNzYXJ5LgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChhcmdzLkFyZ3YoKSwgcGlwZV9mZFswXSk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKworIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKKworLy8gQ3JlYXRlcyBhIGNvbmNyZXRlIERlYXRoVGVzdC1kZXJpdmVkIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUKKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnLCBhbmQgc2V0cyB0aGUgcG9pbnRlciBwb2ludGVkIHRvCisvLyBieSB0aGUgInRlc3QiIGFyZ3VtZW50IHRvIGl0cyBhZGRyZXNzLiAgSWYgdGhlIHRlc3Qgc2hvdWxkIGJlCisvLyBza2lwcGVkLCBzZXRzIHRoYXQgcG9pbnRlciB0byBOVUxMLiAgUmV0dXJucyB0cnVlLCB1bmxlc3MgdGhlCisvLyBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgorYm9vbCBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKQorICAgICAgLT5pbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICBpZiAoZGVhdGhfdGVzdF9pbmRleCA+IGZsYWctPmluZGV4KCkpIHsKKyAgICAgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKAorICAgICAgICAgICJEZWF0aCB0ZXN0IGNvdW50ICgiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpCisgICAgICAgICAgKyAiKSBzb21laG93IGV4Y2VlZGVkIGV4cGVjdGVkIG1heGltdW0gKCIKKyAgICAgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhmbGFnLT5pbmRleCgpKSArICIpIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCEoZmxhZy0+ZmlsZSgpID09IGZpbGUgJiYgZmxhZy0+bGluZSgpID09IGxpbmUgJiYKKyAgICAgICAgICBmbGFnLT5pbmRleCgpID09IGRlYXRoX3Rlc3RfaW5kZXgpKSB7CisgICAgICAqdGVzdCA9IE5VTEw7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiIHx8CisgICAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IFdpbmRvd3NEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSk7CisgIH0KKworIyBlbHNlCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiKSB7CisgICAgKnRlc3QgPSBuZXcgRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKKyAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IE5vRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4KTsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgZWxzZSB7ICAvLyBOT0xJTlQgLSB0aGlzIGlzIG1vcmUgcmVhZGFibGUgdGhhbiB1bmJhbGFuY2VkIGJyYWNrZXRzIGluc2lkZSAjaWYuCisgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoCisgICAgICAgICJVbmtub3duIGRlYXRoIHRlc3Qgc3R5bGUgXCIiICsgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKQorICAgICAgICArICJcIiBlbmNvdW50ZXJlZCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBTcGxpdHMgYSBnaXZlbiBzdHJpbmcgb24gYSBnaXZlbiBkZWxpbWl0ZXIsIHBvcHVsYXRpbmcgYSBnaXZlbgorLy8gdmVjdG9yIHdpdGggdGhlIGZpZWxkcy4gIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlCisvLyA6OnN0ZDo6c3RyaW5nLCBzbyB3ZSBjYW4gdXNlIGl0IGhlcmUuCitzdGF0aWMgdm9pZCBTcGxpdFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNoYXIgZGVsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4qIGRlc3QpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gcGFyc2VkOworICA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeworICAgIGNvbnN0IDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IHN0ci5maW5kKGRlbGltaXRlciwgcG9zKTsKKyAgICBpZiAoY29sb24gPT0gOjpzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcykpOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MsIGNvbG9uIC0gcG9zKSk7CisgICAgICBwb3MgPSBjb2xvbiArIDE7CisgICAgfQorICB9CisgIGRlc3QtPnN3YXAocGFyc2VkKTsKK30KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBSZWNyZWF0ZXMgdGhlIHBpcGUgYW5kIGV2ZW50IGhhbmRsZXMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycywKKy8vIHNpZ25hbHMgdGhlIGV2ZW50LCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB3cmFwcGVkIGFyb3VuZCB0aGUgcGlwZQorLy8gaGFuZGxlLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBvbmx5LgoraW50IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHVuc2lnbmVkIGludCBwYXJlbnRfcHJvY2Vzc19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCkgeworICBBdXRvSGFuZGxlIHBhcmVudF9wcm9jZXNzX2hhbmRsZSg6Ok9wZW5Qcm9jZXNzKFBST0NFU1NfRFVQX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gTm9uLWluaGVyaXRhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X3Byb2Nlc3NfaWQpKTsKKyAgaWYgKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gb3BlbiBwYXJlbnQgcHJvY2VzcyAiICsKKyAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcocGFyZW50X3Byb2Nlc3NfaWQpKTsKKyAgfQorCisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlcGxhY2UgdGhlIGZvbGxvd2luZyBjaGVjayB3aXRoIGEKKyAgLy8gY29tcGlsZS10aW1lIGFzc2VydGlvbiB3aGVuIGF2YWlsYWJsZS4KKyAgR1RFU1RfQ0hFQ0tfKHNpemVvZihIQU5ETEUpIDw9IHNpemVvZihzaXplX3QpKTsKKworICBjb25zdCBIQU5ETEUgd3JpdGVfaGFuZGxlID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPih3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KTsKKyAgSEFORExFIGR1cF93cml0ZV9oYW5kbGU7CisKKyAgLy8gVGhlIG5ld2x5IGluaXRpYWxpemVkIGhhbmRsZSBpcyBhY2Nlc3NpYmxlIG9ubHkgaW4gaW4gdGhlIHBhcmVudAorICAvLyBwcm9jZXNzLiBUbyBvYnRhaW4gb25lIGFjY2Vzc2libGUgd2l0aGluIHRoZSBjaGlsZCwgd2UgbmVlZCB0byB1c2UKKyAgLy8gRHVwbGljYXRlSGFuZGxlLgorICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgd3JpdGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgJmR1cF93cml0ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAgICAvLyBSZXF1ZXN0ZWQgcHJpdmlsZWdlcyBpZ25vcmVkIHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MgaXMgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIFJlcXVlc3Qgbm9uLWluaGVyaXRhYmxlIGhhbmRsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKSkgeworICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBwaXBlIGhhbmRsZSAiICsKKyAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcod3JpdGVfaGFuZGxlX2FzX3NpemVfdCkgKworICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgIiArCisgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIH0KKworICBjb25zdCBIQU5ETEUgZXZlbnRfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX2V2ZW50X2hhbmRsZTsKKworICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgZXZlbnRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgJmR1cF9ldmVudF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiVW5hYmxlIHRvIGR1cGxpY2F0ZSB0aGUgZXZlbnQgaGFuZGxlICIgKworICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhldmVudF9oYW5kbGVfYXNfc2l6ZV90KSArCisgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAiICsKKyAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcocGFyZW50X3Byb2Nlc3NfaWQpKTsKKyAgfQorCisgIGNvbnN0IGludCB3cml0ZV9mZCA9CisgICAgICA6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihkdXBfd3JpdGVfaGFuZGxlKSwgT19BUFBFTkQpOworICBpZiAod3JpdGVfZmQgPT0gLTEpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiVW5hYmxlIHRvIGNvbnZlcnQgcGlwZSBoYW5kbGUgIiArCisgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHdyaXRlX2hhbmRsZV9hc19zaXplX3QpICsKKyAgICAgICAgICAgICAgICAgICAiIHRvIGEgZmlsZSBkZXNjcmlwdG9yIik7CisgIH0KKworICAvLyBTaWduYWxzIHRoZSBwYXJlbnQgdGhhdCB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIGhhcyBiZWVuIGFjcXVpcmVkCisgIC8vIHNvIHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgaXRzIG93biB3cml0ZSBlbmQuCisgIDo6U2V0RXZlbnQoZHVwX2V2ZW50X2hhbmRsZSk7CisKKyAgcmV0dXJuIHdyaXRlX2ZkOworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzCisvLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmCisvLyB0aGUgZmxhZyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCitJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgeworICBpZiAoR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgPT0gIiIpIHJldHVybiBOVUxMOworCisgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlCisgIC8vIGNhbiB1c2UgaXQgaGVyZS4KKyAgaW50IGxpbmUgPSAtMTsKKyAgaW50IGluZGV4ID0gLTE7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IGZpZWxkczsKKyAgU3BsaXRTdHJpbmcoR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuY19zdHIoKSwgJ3wnLCAmZmllbGRzKTsKKyAgaW50IHdyaXRlX2ZkID0gLTE7CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIHVuc2lnbmVkIGludCBwYXJlbnRfcHJvY2Vzc19pZCA9IDA7CisgIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90ID0gMDsKKyAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QgPSAwOworCisgIGlmIChmaWVsZHMuc2l6ZSgpICE9IDYKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzFdLCAmbGluZSkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzJdLCAmaW5kZXgpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1szXSwgJnBhcmVudF9wcm9jZXNzX2lkKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbNF0sICZ3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbNV0sICZldmVudF9oYW5kbGVfYXNfc2l6ZV90KSkgeworICAgIERlYXRoVGVzdEFib3J0KCJCYWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnOiAiICsKKyAgICAgICAgICAgICAgICAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSk7CisgIH0KKyAgd3JpdGVfZmQgPSBHZXRTdGF0dXNGaWxlRGVzY3JpcHRvcihwYXJlbnRfcHJvY2Vzc19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOworIyBlbHNlCisKKyAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNAorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmd3JpdGVfZmQpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICIKKyAgICAgICAgKyBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSk7CisgIH0KKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIHJldHVybiBuZXcgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGZpZWxkc1swXSwgbGluZSwgaW5kZXgsIHdyaXRlX2ZkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDxkaXJlY3QuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyNlbGlmIEdURVNUX09TX1NZTUJJQU4KKy8vIFN5bWJpYW4gT3BlbkMgaGFzIFBBVEhfTUFYIGluIHN5cy9zeXNsaW1pdHMuaAorIyBpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgaW5jbHVkZSA8Y2xpbWl0cz4gIC8vIFNvbWUgTGludXggZGlzdHJpYnV0aW9ucyBkZWZpbmUgUEFUSF9NQVggaGVyZS4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfTUFYX1BBVEgKKyNlbGlmIGRlZmluZWQoUEFUSF9NQVgpCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoX1hPUEVOX1BBVEhfTUFYKQorIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIF9YT1BFTl9QQVRIX01BWAorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfUE9TSVhfUEFUSF9NQVgKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBPbiBXaW5kb3dzLCAnXFwnIGlzIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciwgYnV0IG1hbnkgdG9vbHMgYW5kIHRoZQorLy8gV2luZG93cyBBUEkgYWxzbyBhY2NlcHQgJy8nIGFzIGFuIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvci4gVW5sZXNzIG90aGVyd2lzZQorLy8gbm90ZWQsIGEgZmlsZSBwYXRoIGNhbiBjb250YWluIGVpdGhlciBraW5kIG9mIHBhdGggc2VwYXJhdG9ycywgb3IgYSBtaXh0dXJlCisvLyBvZiB0aGVtLgorY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICdcXCc7Citjb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yID0gJy8nOworY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIlxcIjsKK2NvbnN0IGNoYXIga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnkuIFlvdSBzaG91bGQgbm90IHVzZQorLy8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluIHRlc3RzIG9uIFdpbmRvd3MgQ0UsIGJ1dCB0aGlzIGF0IGxlYXN0CisvLyBwcm92aWRlcyBhIHJlYXNvbmFibGUgZmFsbGJhY2suCitjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiXFwiOworLy8gV2luZG93cyBDRSBkb2Vzbid0IGRlZmluZSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUworY29uc3QgRFdPUkQga0ludmFsaWRGaWxlQXR0cmlidXRlcyA9IDB4ZmZmZmZmZmY7CisjIGVsc2UKK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuXFwiOworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyNlbHNlCitjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJy8nOworY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIi8iOworY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi4vIjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIHBhdGggc2VwYXJhdG9yLgorc3RhdGljIGJvb2wgSXNQYXRoU2VwYXJhdG9yKGNoYXIgYykgeworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIHJldHVybiAoYyA9PSBrUGF0aFNlcGFyYXRvcikgfHwgKGMgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworI2Vsc2UKKyAgcmV0dXJuIGMgPT0ga1BhdGhTZXBhcmF0b3I7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgorRmlsZVBhdGggRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeSwgc28gd2UganVzdCByZXR1cm4KKyAgLy8gc29tZXRoaW5nIHJlYXNvbmFibGUuCisgIHJldHVybiBGaWxlUGF0aChrQ3VycmVudERpcmVjdG9yeVN0cmluZyk7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgIGNoYXIgY3dkW0dURVNUX1BBVEhfTUFYXyArIDFdID0geyAnXDAnIH07CisgIHJldHVybiBGaWxlUGF0aChfZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7CisjZWxzZQorICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OworICByZXR1cm4gRmlsZVBhdGgoZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucworLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90CisvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZG90X2V4dGVuc2lvbiA9IHN0ZDo6c3RyaW5nKCIuIikgKyBleHRlbnNpb247CisgIGlmIChTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKHBhdGhuYW1lXywgZG90X2V4dGVuc2lvbikpIHsKKyAgICByZXR1cm4gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigKKyAgICAgICAgMCwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gZG90X2V4dGVuc2lvbi5sZW5ndGgoKSkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KKy8vIHRoZSBGaWxlUGF0aC4gT24gV2luZG93cywgZm9yIGV4YW1wbGUsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGgKKy8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCitjb25zdCBjaGFyKiBGaWxlUGF0aDo6RmluZExhc3RQYXRoU2VwYXJhdG9yKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga1BhdGhTZXBhcmF0b3IpOworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3RfYWx0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworICAvLyBDb21wYXJpbmcgdHdvIHBvaW50ZXJzIG9mIHdoaWNoIG9ubHkgb25lIGlzIE5VTEwgaXMgdW5kZWZpbmVkLgorICBpZiAobGFzdF9hbHRfc2VwICE9IE5VTEwgJiYKKyAgICAgIChsYXN0X3NlcCA9PSBOVUxMIHx8IGxhc3RfYWx0X3NlcCA+IGxhc3Rfc2VwKSkgeworICAgIHJldHVybiBsYXN0X2FsdF9zZXA7CisgIH0KKyNlbmRpZgorICByZXR1cm4gbGFzdF9zZXA7Cit9CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBkaXJlY3RvcnkgcGFydCByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCisvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKKy8vIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLiBJZiB0aGVyZSBpcyBubyBmaWxlIHBhcnQgKCJqdXN0X2FfZGlyLyIpIGl0CisvLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7CisgIHJldHVybiBsYXN0X3NlcCA/IEZpbGVQYXRoKGxhc3Rfc2VwICsgMSkgOiAqdGhpczsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KKy8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpIHJldHVybnMgInBhdGgvdG8vIi4KKy8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKKy8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCisvLyBub3QgaGF2ZSBhIGZpbGUsIGxpa2UgImp1c3QvYS9kaXIvIiwgaXQgcmV0dXJucyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRmlsZU5hbWUoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7CisgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgaWYgKGxhc3Rfc2VwKSB7CisgICAgZGlyID0gc3RkOjpzdHJpbmcoY19zdHIoKSwgbGFzdF9zZXAgKyAxIC0gY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgZGlyID0ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmc7CisgIH0KKyAgcmV0dXJuIEZpbGVQYXRoKGRpcik7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KKworLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKKy8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgorLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKKyAgc3RkOjpzdHJpbmcgZmlsZTsKKyAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgZmlsZSA9IGJhc2VfbmFtZS5zdHJpbmcoKSArICIuIiArIGV4dGVuc2lvbjsKKyAgfSBlbHNlIHsKKyAgICBmaWxlID0gYmFzZV9uYW1lLnN0cmluZygpICsgIl8iICsgU3RyZWFtYWJsZVRvU3RyaW5nKG51bWJlcikKKyAgICAgICAgKyAiLiIgKyBleHRlbnNpb247CisgIH0KKyAgcmV0dXJuIENvbmNhdFBhdGhzKGRpcmVjdG9yeSwgRmlsZVBhdGgoZmlsZSkpOworfQorCisvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuCisvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6OkNvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKKyAgaWYgKGRpcmVjdG9yeS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHJlbGF0aXZlX3BhdGg7CisgIGNvbnN0IEZpbGVQYXRoIGRpcihkaXJlY3RvcnkuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworICByZXR1cm4gRmlsZVBhdGgoZGlyLnN0cmluZygpICsga1BhdGhTZXBhcmF0b3IgKyByZWxhdGl2ZV9wYXRoLnN0cmluZygpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBzb21ldGhpbmcgZmluZGFibGUgaW4gdGhlIGZpbGUtc3lzdGVtLAorLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlci4KK2Jvb2wgRmlsZVBhdGg6OkZpbGVPckRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGhuYW1lXy5jX3N0cigpKTsKKyAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOworICBkZWxldGUgW10gdW5pY29kZTsKKyAgcmV0dXJuIGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlczsKKyNlbHNlCisgIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKKyAgcmV0dXJuIHBvc2l4OjpTdGF0KHBhdGhuYW1lXy5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQorLy8gdGhhdCBleGlzdHMuCitib29sIEZpbGVQYXRoOjpEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7CisgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBEb24ndCBzdHJpcCBvZmYgdHJhaWxpbmcgc2VwYXJhdG9yIGlmIHBhdGggaXMgYSByb290IGRpcmVjdG9yeSBvbgorICAvLyBXaW5kb3dzIChsaWtlICJDOlxcIikuCisgIGNvbnN0IEZpbGVQYXRoJiBwYXRoKElzUm9vdERpcmVjdG9yeSgpID8gKnRoaXMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKyNlbHNlCisgIGNvbnN0IEZpbGVQYXRoJiBwYXRoKCp0aGlzKTsKKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRoLmNfc3RyKCkpOworICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7CisgIGRlbGV0ZSBbXSB1bmljb2RlOworICBpZiAoKGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlcykgJiYKKyAgICAgIChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgeworICAgIHJlc3VsdCA9IHRydWU7CisgIH0KKyNlbHNlCisgIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKKyAgcmVzdWx0ID0gcG9zaXg6OlN0YXQocGF0aC5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwICYmCisgICAgICBwb3NpeDo6SXNEaXIoZmlsZV9zdGF0KTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUKKy8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKK2Jvb2wgRmlsZVBhdGg6OklzUm9vdERpcmVjdG9yeSgpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIGEgbmV0d29yayBzaGFyZSBsaWtlCisgIC8vIFxcc2VydmVyXHNoYXJlIGNhbiBiZSBhIHJvb3QgZGlyZWN0b3J5LCBhbHRob3VnaCBpdCBjYW5ub3QgYmUgdGhlCisgIC8vIGN1cnJlbnQgZGlyZWN0b3J5LiAgSGFuZGxlIHRoaXMgcHJvcGVybHkuCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMyAmJiBJc0Fic29sdXRlUGF0aCgpOworI2Vsc2UKKyAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAxICYmIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVswXSk7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgorYm9vbCBGaWxlUGF0aDo6SXNBYnNvbHV0ZVBhdGgoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSBwYXRobmFtZV8uY19zdHIoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPj0gMyAmJgorICAgICAoKG5hbWVbMF0gPj0gJ2EnICYmIG5hbWVbMF0gPD0gJ3onKSB8fAorICAgICAgKG5hbWVbMF0gPj0gJ0EnICYmIG5hbWVbMF0gPD0gJ1onKSkgJiYKKyAgICAgbmFtZVsxXSA9PSAnOicgJiYKKyAgICAgSXNQYXRoU2VwYXJhdG9yKG5hbWVbMl0pOworI2Vsc2UKKyAgcmV0dXJuIElzUGF0aFNlcGFyYXRvcihuYW1lWzBdKTsKKyNlbmRpZgorfQorCisvLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCisvLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCisvLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgorLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCisvLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisvLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgorLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcworLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7CisgIEZpbGVQYXRoIGZ1bGxfcGF0aG5hbWU7CisgIGludCBudW1iZXIgPSAwOworICBkbyB7CisgICAgZnVsbF9wYXRobmFtZS5TZXQoTWFrZUZpbGVOYW1lKGRpcmVjdG9yeSwgYmFzZV9uYW1lLCBudW1iZXIrKywgZXh0ZW5zaW9uKSk7CisgIH0gd2hpbGUgKGZ1bGxfcGF0aG5hbWUuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworICByZXR1cm4gZnVsbF9wYXRobmFtZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorLy8gaXQgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgZGlyZWN0b3J5LiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKy8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgorYm9vbCBGaWxlUGF0aDo6SXNEaXJlY3RvcnkoKSBjb25zdCB7CisgIHJldHVybiAhcGF0aG5hbWVfLmVtcHR5KCkgJiYKKyAgICAgICAgIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVtwYXRobmFtZV8ubGVuZ3RoKCkgLSAxXSk7Cit9CisKKy8vIENyZWF0ZSBkaXJlY3RvcmllcyBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBpZgorLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcmllcworLy8gZm9yIGFueSByZWFzb24uCitib29sIEZpbGVQYXRoOjpDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3QgeworICBpZiAoIXRoaXMtPklzRGlyZWN0b3J5KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAocGF0aG5hbWVfLmxlbmd0aCgpID09IDAgfHwgdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IEZpbGVQYXRoIHBhcmVudCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5SZW1vdmVGaWxlTmFtZSgpKTsKKyAgcmV0dXJuIHBhcmVudC5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgJiYgdGhpcy0+Q3JlYXRlRm9sZGVyKCk7Cit9CisKKy8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yCisvLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCisvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAorLy8gZXhpc3QuIE5vdCBuYW1lZCAiQ3JlYXRlRGlyZWN0b3J5IiBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIG9uIFdpbmRvd3MuCitib29sIEZpbGVQYXRoOjpDcmVhdGVGb2xkZXIoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgRmlsZVBhdGggcmVtb3ZlZF9zZXAodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHJlbW92ZWRfc2VwLmNfc3RyKCkpOworICBpbnQgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5KHVuaWNvZGUsIE5VTEwpID8gMCA6IC0xOworICBkZWxldGUgW10gdW5pY29kZTsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyAgaW50IHJlc3VsdCA9IF9ta2RpcihwYXRobmFtZV8uY19zdHIoKSk7CisjZWxzZQorICBpbnQgcmVzdWx0ID0gbWtkaXIocGF0aG5hbWVfLmNfc3RyKCksIDA3NzcpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICByZXR1cm4gdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCk7ICAvLyBBbiBlcnJvciBpcyBPSyBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgfQorICByZXR1cm4gdHJ1ZTsgIC8vIE5vIGVycm9yLgorfQorCisvLyBJZiBpbnB1dCBuYW1lIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIsIHJlbW92ZSBpdCBhbmQgcmV0dXJuIHRoZQorLy8gbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yLCBvdGhlciBwbGF0Zm9ybXMgdXNlIC8uCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3QgeworICByZXR1cm4gSXNEaXJlY3RvcnkoKQorICAgICAgPyBGaWxlUGF0aChwYXRobmFtZV8uc3Vic3RyKDAsIHBhdGhuYW1lXy5sZW5ndGgoKSAtIDEpKQorICAgICAgOiAqdGhpczsKK30KKworLy8gUmVtb3ZlcyBhbnkgcmVkdW5kYW50IHNlcGFyYXRvcnMgdGhhdCBtaWdodCBiZSBpbiB0aGUgcGF0aG5hbWUuCisvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgorLy8gcmVkdW5kYW5jaWVzIHRoYXQgbWlnaHQgYmUgaW4gYSBwYXRobmFtZSBpbnZvbHZpbmcgIi4iIG9yICIuLiIuCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogaGFuZGxlIFdpbmRvd3MgbmV0d29yayBzaGFyZXMgKGUuZy4gXFxzZXJ2ZXJcc2hhcmUpLgordm9pZCBGaWxlUGF0aDo6Tm9ybWFsaXplKCkgeworICBpZiAocGF0aG5hbWVfLmNfc3RyKCkgPT0gTlVMTCkgeworICAgIHBhdGhuYW1lXyA9ICIiOworICAgIHJldHVybjsKKyAgfQorICBjb25zdCBjaGFyKiBzcmMgPSBwYXRobmFtZV8uY19zdHIoKTsKKyAgY2hhciogY29uc3QgZGVzdCA9IG5ldyBjaGFyW3BhdGhuYW1lXy5sZW5ndGgoKSArIDFdOworICBjaGFyKiBkZXN0X3B0ciA9IGRlc3Q7CisgIG1lbXNldChkZXN0X3B0ciwgMCwgcGF0aG5hbWVfLmxlbmd0aCgpICsgMSk7CisKKyAgd2hpbGUgKCpzcmMgIT0gJ1wwJykgeworICAgICpkZXN0X3B0ciA9ICpzcmM7CisgICAgaWYgKCFJc1BhdGhTZXBhcmF0b3IoKnNyYykpIHsKKyAgICAgIHNyYysrOworICAgIH0gZWxzZSB7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgICAgIGlmICgqZGVzdF9wdHIgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpIHsKKyAgICAgICAgKmRlc3RfcHRyID0ga1BhdGhTZXBhcmF0b3I7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHdoaWxlIChJc1BhdGhTZXBhcmF0b3IoKnNyYykpCisgICAgICAgIHNyYysrOworICAgIH0KKyAgICBkZXN0X3B0cisrOworICB9CisgICpkZXN0X3B0ciA9ICdcMCc7CisgIHBhdGhuYW1lXyA9IGRlc3Q7CisgIGRlbGV0ZVtdIGRlc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBGb3IgVGVybWluYXRlUHJvY2VzcygpCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisjIGluY2x1ZGUgPGlvLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2lmIEdURVNUX09TX01BQworIyBpbmNsdWRlIDxtYWNoL21hY2hfaW5pdC5oPgorIyBpbmNsdWRlIDxtYWNoL3Rhc2suaD4KKyMgaW5jbHVkZSA8bWFjaC92bV9tYXAuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyNpZiBHVEVTVF9PU19RTlgKKyMgaW5jbHVkZSA8ZGV2Y3RsLmg+CisjIGluY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCisKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorLy8gTVNWQyBhbmQgQysrQnVpbGRlciBkbyBub3QgcHJvdmlkZSBhIGRlZmluaXRpb24gb2YgU1RERVJSX0ZJTEVOTy4KK2NvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gMTsKK2NvbnN0IGludCBrU3RkRXJyRmlsZW5vID0gMjsKKyNlbHNlCitjb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IFNURE9VVF9GSUxFTk87Citjb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IFNUREVSUl9GSUxFTk87CisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNpZiBHVEVTVF9PU19NQUMKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0CisvLyB3ZSBjYW5ub3QgZGV0ZWN0IGl0Lgorc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworICBjb25zdCB0YXNrX3QgdGFzayA9IG1hY2hfdGFza19zZWxmKCk7CisgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgdGhyZWFkX2NvdW50OworICB0aHJlYWRfYWN0X2FycmF5X3QgdGhyZWFkX2xpc3Q7CisgIGNvbnN0IGtlcm5fcmV0dXJuX3Qgc3RhdHVzID0gdGFza190aHJlYWRzKHRhc2ssICZ0aHJlYWRfbGlzdCwgJnRocmVhZF9jb3VudCk7CisgIGlmIChzdGF0dXMgPT0gS0VSTl9TVUNDRVNTKSB7CisgICAgLy8gdGFza190aHJlYWRzIGFsbG9jYXRlcyByZXNvdXJjZXMgaW4gdGhyZWFkX2xpc3QgYW5kIHdlIG5lZWQgdG8gZnJlZSB0aGVtCisgICAgLy8gdG8gYXZvaWQgbGVha3MuCisgICAgdm1fZGVhbGxvY2F0ZSh0YXNrLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2bV9hZGRyZXNzX3Q+KHRocmVhZF9saXN0KSwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0aHJlYWRfdCkgKiB0aHJlYWRfY291bnQpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHRocmVhZF9jb3VudCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2VsaWYgR1RFU1RfT1NfUU5YCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgY29uc3QgaW50IGZkID0gb3BlbigiL3Byb2Mvc2VsZi9hcyIsIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHByb2Nmc19pbmZvIHByb2Nlc3NfaW5mbzsKKyAgY29uc3QgaW50IHN0YXR1cyA9CisgICAgICBkZXZjdGwoZmQsIERDTURfUFJPQ19JTkZPLCAmcHJvY2Vzc19pbmZvLCBzaXplb2YocHJvY2Vzc19pbmZvKSwgTlVMTCk7CisgIGNsb3NlKGZkKTsKKyAgaWYgKHN0YXR1cyA9PSBFT0spIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pihwcm9jZXNzX2luZm8ubnVtX3RocmVhZHMpOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKKyNlbHNlCisKK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgLy8gVGhlcmUncyBubyBwb3J0YWJsZSB3YXkgdG8gZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcywgc28gd2UganVzdAorICAvLyByZXR1cm4gMCB0byBpbmRpY2F0ZSB0aGF0IHdlIGNhbm5vdCBkZXRlY3QgaXQuCisgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX01BQworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisvLyBJbXBsZW1lbnRzIFJFLiAgQ3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworUkU6On5SRSgpIHsKKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIC8vIHJlZ2ZyZWUnaW5nIGFuIGludmFsaWQgcmVnZXggbWlnaHQgY3Jhc2ggYmVjYXVzZSB0aGUgY29udGVudAorICAgIC8vIG9mIHRoZSByZWdleCBpcyB1bmRlZmluZWQuIFNpbmNlIHRoZSByZWdleCdzIGFyZSBlc3NlbnRpYWxseQorICAgIC8vIHRoZSBzYW1lLCBvbmUgY2Fubm90IGJlIHZhbGlkIChvciBpbnZhbGlkKSB3aXRob3V0IHRoZSBvdGhlcgorICAgIC8vIGJlaW5nIHNvIHRvby4KKyAgICByZWdmcmVlKCZwYXJ0aWFsX3JlZ2V4Xyk7CisgICAgcmVnZnJlZSgmZnVsbF9yZWdleF8pOworICB9CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KK2Jvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOworCisgIHJlZ21hdGNoX3QgbWF0Y2g7CisgIHJldHVybiByZWdleGVjKCZyZS5mdWxsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7CisKKyAgcmVnbWF0Y2hfdCBtYXRjaDsKKyAgcmV0dXJuIHJlZ2V4ZWMoJnJlLnBhcnRpYWxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKK30KKworLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgordm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgeworICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOworCisgIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQorICAvLyBmdWxsIG1hdGNoLgorICBjb25zdCBzaXplX3QgZnVsbF9yZWdleF9sZW4gPSBzdHJsZW4ocmVnZXgpICsgMTA7CisgIGNoYXIqIGNvbnN0IGZ1bGxfcGF0dGVybiA9IG5ldyBjaGFyW2Z1bGxfcmVnZXhfbGVuXTsKKworICBzbnByaW50ZihmdWxsX3BhdHRlcm4sIGZ1bGxfcmVnZXhfbGVuLCAiXiglcykkIiwgcmVnZXgpOworICBpc192YWxpZF8gPSByZWdjb21wKCZmdWxsX3JlZ2V4XywgZnVsbF9wYXR0ZXJuLCBSRUdfRVhURU5ERUQpID09IDA7CisgIC8vIFdlIHdhbnQgdG8gY2FsbCByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgLi4uKSBldmVuIGlmIHRoZQorICAvLyBwcmV2aW91cyBleHByZXNzaW9uIHJldHVybnMgZmFsc2UuICBPdGhlcndpc2UgcGFydGlhbF9yZWdleF8gbWF5CisgIC8vIG5vdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBjYW4gbWF5IGNhdXNlIHRyb3VibGUgd2hlbiBpdCdzCisgIC8vIGZyZWVkLgorICAvLworICAvLyBTb21lIGltcGxlbWVudGF0aW9uIG9mIFBPU0lYIHJlZ2V4IChlLmcuIG9uIGF0IGxlYXN0IHNvbWUKKyAgLy8gdmVyc2lvbnMgb2YgQ3lnd2luKSBkb2Vzbid0IGFjY2VwdCB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgdmFsaWQKKyAgLy8gcmVnZXguICBXZSBjaGFuZ2UgaXQgdG8gYW4gZXF1aXZhbGVudCBmb3JtICIoKSIgdG8gYmUgc2FmZS4KKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IHBhcnRpYWxfcmVnZXggPSAoKnJlZ2V4ID09ICdcMCcpID8gIigpIiA6IHJlZ2V4OworICAgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCBwYXJ0aWFsX3JlZ2V4LCBSRUdfRVhURU5ERUQpID09IDA7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXNfdmFsaWRfKQorICAgICAgPDwgIlJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXgKKyAgICAgIDw8ICJcIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIjsKKworICBkZWxldGVbXSBmdWxsX3BhdHRlcm47Cit9CisKKyNlbGlmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYXBwZWFycyBhbnl3aGVyZSBpbiBzdHIgKGV4Y2x1ZGluZyB0aGUKKy8vIHRlcm1pbmF0aW5nICdcMCcgY2hhcmFjdGVyKS4KK2Jvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIGNoICE9ICdcMCcgJiYgc3RyY2hyKHN0ciwgY2gpICE9IE5VTEw7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3NpZmljYXRpb24uICBVbmxpa2UKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiwgdGhlc2UgYXJlbid0IGFmZmVjdGVkIGJ5IHRoZQorLy8gY3VycmVudCBsb2NhbGUuCitib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9Citib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKSB7CisgIHJldHVybiBJc0luU2V0KGNoLCAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiIpOworfQorYm9vbCBJc1JlcGVhdChjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiPyorIik7IH0KK2Jvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIiBcZlxuXHJcdFx2Iik7IH0KK2Jvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpIHsKKyAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKKyAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAnXyc7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgIlxcYyIgaXMgYSBzdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlLgorYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgeworICByZXR1cm4gKElzQXNjaWlQdW5jdChjKSB8fCBJc0luU2V0KGMsICJkRGZucnNTdHZ3VyIpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXRvbSAoc3BlY2lmaWVkIGJ5IGVzY2FwZWQgYW5kIHBhdHRlcm4pCisvLyBtYXRjaGVzIGNoLiAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdGhlIGF0b20gaXMgaW52YWxpZC4KK2Jvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuX2NoYXIsIGNoYXIgY2gpIHsKKyAgaWYgKGVzY2FwZWQpIHsgIC8vICJcXHAiIHdoZXJlIHAgaXMgcGF0dGVybl9jaGFyLgorICAgIHN3aXRjaCAocGF0dGVybl9jaGFyKSB7CisgICAgICBjYXNlICdkJzogcmV0dXJuIElzQXNjaWlEaWdpdChjaCk7CisgICAgICBjYXNlICdEJzogcmV0dXJuICFJc0FzY2lpRGlnaXQoY2gpOworICAgICAgY2FzZSAnZic6IHJldHVybiBjaCA9PSAnXGYnOworICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOworICAgICAgY2FzZSAncic6IHJldHVybiBjaCA9PSAnXHInOworICAgICAgY2FzZSAncyc6IHJldHVybiBJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICdTJzogcmV0dXJuICFJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICd0JzogcmV0dXJuIGNoID09ICdcdCc7CisgICAgICBjYXNlICd2JzogcmV0dXJuIGNoID09ICdcdic7CisgICAgICBjYXNlICd3JzogcmV0dXJuIElzQXNjaWlXb3JkQ2hhcihjaCk7CisgICAgICBjYXNlICdXJzogcmV0dXJuICFJc0FzY2lpV29yZENoYXIoY2gpOworICAgIH0KKyAgICByZXR1cm4gSXNBc2NpaVB1bmN0KHBhdHRlcm5fY2hhcikgJiYgcGF0dGVybl9jaGFyID09IGNoOworICB9CisKKyAgcmV0dXJuIChwYXR0ZXJuX2NoYXIgPT0gJy4nICYmIGNoICE9ICdcbicpIHx8IHBhdHRlcm5fY2hhciA9PSBjaDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVmFsaWRhdGVSZWdleCgpIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlcy4KK3N0ZDo6c3RyaW5nIEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IoY29uc3QgY2hhciogcmVnZXgsIGludCBpbmRleCkgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCAiU3ludGF4IGVycm9yIGF0IGluZGV4ICIgPDwgaW5kZXgKKyAgICAgICAgICA8PCAiIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4IDw8ICJcIjogIikuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEdlbmVyYXRlcyBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgcmVnZXggaXMgaW52YWxpZDsKKy8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCitib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgaWYgKHJlZ2V4ID09IE5VTEwpIHsKKyAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZml4IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBpbiB0aGUKKyAgICAvLyBhc3NlcnRpb24gZmFpbHVyZXMgdG8gbWF0Y2ggd2hlcmUgdGhlIHJlZ2V4IGlzIHVzZWQgaW4gdXNlcgorICAgIC8vIGNvZGUuCisgICAgQUREX0ZBSUxVUkUoKSA8PCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc192YWxpZCA9IHRydWU7CisKKyAgLy8gVHJ1ZSBpZmYgPywgKiwgb3IgKyBjYW4gZm9sbG93IHRoZSBwcmV2aW91cyBhdG9tLgorICBib29sIHByZXZfcmVwZWF0YWJsZSA9IGZhbHNlOworICBmb3IgKGludCBpID0gMDsgcmVnZXhbaV07IGkrKykgeworICAgIGlmIChyZWdleFtpXSA9PSAnXFwnKSB7ICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UKKyAgICAgIGkrKzsKKyAgICAgIGlmIChyZWdleFtpXSA9PSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFJc1ZhbGlkRXNjYXBlKHJlZ2V4W2ldKSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcIiA8PCByZWdleFtpXSA8PCAiXCIuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHByZXZfcmVwZWF0YWJsZSA9IHRydWU7CisgICAgfSBlbHNlIHsgIC8vIE5vdCBhbiBlc2NhcGUgc2VxdWVuY2UuCisgICAgICBjb25zdCBjaGFyIGNoID0gcmVnZXhbaV07CisKKyAgICAgIGlmIChjaCA9PSAnXicgJiYgaSA+IDApIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyQnICYmIHJlZ2V4W2kgKyAxXSAhPSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKElzSW5TZXQoY2gsICIoKVtde318IikpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBpcyB1bnN1cHBvcnRlZC4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChJc1JlcGVhdChjaCkgJiYgIXByZXZfcmVwZWF0YWJsZSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4uIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHJldl9yZXBlYXRhYmxlID0gIUlzSW5TZXQoY2gsICJeJD8qKyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpc192YWxpZDsKK30KKworLy8gTWF0Y2hlcyBhIHJlcGVhdGVkIHJlZ2V4IGF0b20gZm9sbG93ZWQgYnkgYSB2YWxpZCBzaW1wbGUgcmVndWxhcgorLy8gZXhwcmVzc2lvbi4gIFRoZSByZWdleCBhdG9tIGlzIGRlZmluZWQgYXMgYyBpZiBlc2NhcGVkIGlzIGZhbHNlLAorLy8gb3IgXGMgb3RoZXJ3aXNlLiAgcmVwZWF0IGlzIHRoZSByZXBldGl0aW9uIG1ldGEgY2hhcmFjdGVyICg/LCAqLAorLy8gb3IgKykuICBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHN0ciBjb250YWlucyB0b28gbWFueQorLy8gY2hhcmFjdGVycyB0byBiZSBpbmRleGFibGUgYnkgc2l6ZV90LCBpbiB3aGljaCBjYXNlIHRoZSB0ZXN0IHdpbGwKKy8vIHByb2JhYmx5IHRpbWUgb3V0IGFueXdheS4gIFdlIGFyZSBmaW5lIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFzCisvLyBzdGQ6OnN0cmluZyBoYXMgaXQgdG9vLgorYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICBib29sIGVzY2FwZWQsIGNoYXIgYywgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LAorICAgIGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBzaXplX3QgbWluX2NvdW50ID0gKHJlcGVhdCA9PSAnKycpID8gMSA6IDA7CisgIGNvbnN0IHNpemVfdCBtYXhfY291bnQgPSAocmVwZWF0ID09ICc/JykgPyAxIDoKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oLTEpIC0gMTsKKyAgLy8gV2UgY2Fubm90IGNhbGwgbnVtZXJpY19saW1pdHM6Om1heCgpIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZQorICAvLyBtYXgoKSBtYWNybyBvbiBXaW5kb3dzLgorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IG1heF9jb3VudDsgKytpKSB7CisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBhdG9tIG1hdGNoZXMgZWFjaCBvZiB0aGUgZmlyc3QgaSBjaGFyYWN0ZXJzIGluIHN0ci4KKyAgICBpZiAoaSA+PSBtaW5fY291bnQgJiYgTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyICsgaSkpIHsKKyAgICAgIC8vIFdlIGhhdmUgZW5vdWdoIG1hdGNoZXMgYXQgdGhlIGhlYWQsIGFuZCB0aGUgdGFpbCBtYXRjaGVzIHRvby4KKyAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCAqd2hldGhlciogdGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHIKKyAgICAgIC8vIChhcyBvcHBvc2VkIHRvICpob3cqIGl0IG1hdGNoZXMpLCB0aGVyZSBpcyBubyBuZWVkIHRvIGZpbmQgYQorICAgICAgLy8gZ3JlZWR5IG1hdGNoLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChzdHJbaV0gPT0gJ1wwJyB8fCAhQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsIGMsIHN0cltpXSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2Ygc3RyLiAgcmVnZXggbXVzdCBiZSBhCisvLyB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBub3Qgc3RhcnQgd2l0aCAiXiIsIG9yIHRoZQorLy8gcmVzdWx0IGlzIHVuZGVmaW5lZC4KK2Jvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7CisgIGlmICgqcmVnZXggPT0gJ1wwJykgIC8vIEFuIGVtcHR5IHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2YgYW55dGhpbmcuCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gIiQiIG9ubHkgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHJlZ2V4IGJlaW5nCisgIC8vIHZhbGlkIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSdzIG5vdGhpbmcgYWZ0ZXIgIiQiIGluIGl0LgorICBpZiAoKnJlZ2V4ID09ICckJykKKyAgICByZXR1cm4gKnN0ciA9PSAnXDAnOworCisgIC8vIElzIHRoZSBmaXJzdCB0aGluZyBpbiByZWdleCBhbiBlc2NhcGUgc2VxdWVuY2U/CisgIGNvbnN0IGJvb2wgZXNjYXBlZCA9ICpyZWdleCA9PSAnXFwnOworICBpZiAoZXNjYXBlZCkKKyAgICArK3JlZ2V4OworICBpZiAoSXNSZXBlYXQocmVnZXhbMV0pKSB7CisgICAgLy8gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoKSBjYWxscyBNYXRjaFJlZ2V4QXRIZWFkKCksIHNvCisgICAgLy8gaGVyZSdzIGFuIGluZGlyZWN0IHJlY3Vyc2lvbi4gIEl0IHRlcm1pbmF0ZXMgYXMgdGhlIHJlZ2V4IGdldHMKKyAgICAvLyBzaG9ydGVyIGluIGVhY2ggcmVjdXJzaW9uLgorICAgIHJldHVybiBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICAgICAgZXNjYXBlZCwgcmVnZXhbMF0sIHJlZ2V4WzFdLCByZWdleCArIDIsIHN0cik7CisgIH0gZWxzZSB7CisgICAgLy8gcmVnZXggaXNuJ3QgZW1wdHksIGlzbid0ICIkIiwgYW5kIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCisgICAgLy8gcmVwZXRpdGlvbi4gIFdlIG1hdGNoIHRoZSBmaXJzdCBhdG9tIG9mIHJlZ2V4IHdpdGggdGhlIGZpcnN0CisgICAgLy8gY2hhcmFjdGVyIG9mIHN0ciBhbmQgcmVjdXJzZS4KKyAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJykgJiYgQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsICpyZWdleCwgKnN0cikgJiYKKyAgICAgICAgTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0ciArIDEpOworICB9Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhbnkgc3Vic3RyaW5nIG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUKKy8vIGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisvLworLy8gVGhlIGFsZ29yaXRobSBpcyByZWN1cnNpdmUsIGJ1dCB0aGUgcmVjdXJzaW9uIGRlcHRoIGRvZXNuJ3QgZXhjZWVkCisvLyB0aGUgcmVnZXggbGVuZ3RoLCBzbyB3ZSB3b24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJ1bm5pbmcgb3V0IG9mCisvLyBzdGFjayBzcGFjZSBub3JtYWxseS4gIEluIHJhcmUgY2FzZXMgdGhlIHRpbWUgY29tcGxleGl0eSBjYW4gYmUKKy8vIGV4cG9uZW50aWFsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVnZXggbGVuZ3RoICsgdGhlIHN0cmluZyBsZW5ndGgsCisvLyBidXQgdXN1YWxseSBpdCdzIG11c3QgZmFzdGVyIChvZnRlbiBjbG9zZSB0byBsaW5lYXIpLgorYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgeworICBpZiAocmVnZXggPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCpyZWdleCA9PSAnXicpCisgICAgcmV0dXJuIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIpOworCisgIC8vIEEgc3VjY2Vzc2Z1bCBtYXRjaCBjYW4gYmUgYW55d2hlcmUgaW4gc3RyLgorICBkbyB7CisgICAgaWYgKE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0cikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfSB3aGlsZSAoKnN0cisrICE9ICdcMCcpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEltcGxlbWVudHMgdGhlIFJFIGNsYXNzLgorCitSRTo6flJFKCkgeworICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhdHRlcm5fKSk7CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZnVsbF9wYXR0ZXJuXykpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgorYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLmZ1bGxfcGF0dGVybl8sIHN0cik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLnBhdHRlcm5fLCBzdHIpOworfQorCisvLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCit2b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIHBhdHRlcm5fID0gZnVsbF9wYXR0ZXJuXyA9IE5VTEw7CisgIGlmIChyZWdleCAhPSBOVUxMKSB7CisgICAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsKKyAgfQorCisgIGlzX3ZhbGlkXyA9IFZhbGlkYXRlUmVnZXgocmVnZXgpOworICBpZiAoIWlzX3ZhbGlkXykgeworICAgIC8vIE5vIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdHRlcm4gd2hlbiB0aGUgcmVnZXggaXMgaW52YWxpZC4KKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKHJlZ2V4KTsKKyAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCisgIC8vIGZ1bGwgbWF0Y2g6IHdlIG5lZWQgc3BhY2UgdG8gcHJlcGVuZCBhICdeJywgYXBwZW5kIGEgJyQnLCBhbmQKKyAgLy8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCAnXDAnLgorICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKGxlbiArIDMpKTsKKyAgZnVsbF9wYXR0ZXJuXyA9IGJ1ZmZlcjsKKworICBpZiAoKnJlZ2V4ICE9ICdeJykKKyAgICAqYnVmZmVyKysgPSAnXic7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gc3RhcnRzIHdpdGggJ14nLgorCisgIC8vIFdlIGRvbid0IHVzZSBzbnByaW50ZiBvciBzdHJuY3B5LCBhcyB0aGV5IHRyaWdnZXIgYSB3YXJuaW5nIHdoZW4KKyAgLy8gY29tcGlsZWQgd2l0aCBWQysrIDguMC4KKyAgbWVtY3B5KGJ1ZmZlciwgcmVnZXgsIGxlbik7CisgIGJ1ZmZlciArPSBsZW47CisKKyAgaWYgKGxlbiA9PSAwIHx8IHJlZ2V4W2xlbiAtIDFdICE9ICckJykKKyAgICAqYnVmZmVyKysgPSAnJCc7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gZW5kcyB3aXRoICckJy4KKworICAqYnVmZmVyID0gJ1wwJzsKK30KKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCisKK2NvbnN0IGNoYXIga1Vua25vd25GaWxlW10gPSAidW5rbm93biBmaWxlIjsKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lKGZpbGUgPT0gTlVMTCA/IGtVbmtub3duRmlsZSA6IGZpbGUpOworCisgIGlmIChsaW5lIDwgMCkgeworICAgIHJldHVybiBmaWxlX25hbWUgKyAiOiI7CisgIH0KKyNpZmRlZiBfTVNDX1ZFUgorICByZXR1cm4gZmlsZV9uYW1lICsgIigiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpICsgIik6IjsKKyNlbHNlCisgIHJldHVybiBmaWxlX25hbWUgKyAiOiIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZSkgKyAiOiI7CisjZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgorLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bworLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgorLy8gTm90ZSB0aGF0IEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oKSBkb2VzIE5PVCBhcHBlbmQgY29sb24KKy8vIHRvIHRoZSBmaWxlIGxvY2F0aW9uIGl0IHByb2R1Y2VzLCB1bmxpa2UgRm9ybWF0RmlsZUxvY2F0aW9uKCkuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKKyAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUoZmlsZSA9PSBOVUxMID8ga1Vua25vd25GaWxlIDogZmlsZSk7CisKKyAgaWYgKGxpbmUgPCAwKQorICAgIHJldHVybiBmaWxlX25hbWU7CisgIGVsc2UKKyAgICByZXR1cm4gZmlsZV9uYW1lICsgIjoiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpOworfQorCisKK0dUZXN0TG9nOjpHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkKKyAgICA6IHNldmVyaXR5XyhzZXZlcml0eSkgeworICBjb25zdCBjaGFyKiBjb25zdCBtYXJrZXIgPQorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfSU5GTyA/ICAgICJbICBJTkZPIF0iIDoKKyAgICAgIHNldmVyaXR5ID09IEdURVNUX1dBUk5JTkcgPyAiW1dBUk5JTkddIiA6CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9FUlJPUiA/ICAgIlsgRVJST1IgXSIgOiAiWyBGQVRBTCBdIjsKKyAgR2V0U3RyZWFtKCkgPDwgOjpzdGQ6OmVuZGwgPDwgbWFya2VyIDw8ICIgIgorICAgICAgICAgICAgICA8PCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSA8PCAiOiAiOworfQorCisvLyBGbHVzaGVzIHRoZSBidWZmZXJzIGFuZCwgaWYgc2V2ZXJpdHkgaXMgR1RFU1RfRkFUQUwsIGFib3J0cyB0aGUgcHJvZ3JhbS4KK0dUZXN0TG9nOjp+R1Rlc3RMb2coKSB7CisgIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsOworICBpZiAoc2V2ZXJpdHlfID09IEdURVNUX0ZBVEFMKSB7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkFib3J0KCk7CisgIH0KK30KKy8vIERpc2FibGUgTWljcm9zb2Z0IGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZvciBQT1NJWCBmdW5jdGlvbnMgY2FsbGVkIGZyb20KKy8vIHRoaXMgY2xhc3MgKGNyZWF0LCBkdXAsIGR1cDIsIGFuZCBjbG9zZSkKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0OTk2KQorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisvLyBPYmplY3QgdGhhdCBjYXB0dXJlcyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KK2NsYXNzIENhcHR1cmVkU3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjdG9yIHJlZGlyZWN0cyB0aGUgc3RyZWFtIHRvIGEgdGVtcG9yYXJ5IGZpbGUuCisgIGV4cGxpY2l0IENhcHR1cmVkU3RyZWFtKGludCBmZCkgOiBmZF8oZmQpLCB1bmNhcHR1cmVkX2ZkXyhkdXAoZmQpKSB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyAgICBjaGFyIHRlbXBfZGlyX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCisgICAgY2hhciB0ZW1wX2ZpbGVfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKKworICAgIDo6R2V0VGVtcFBhdGhBKHNpemVvZih0ZW1wX2Rpcl9wYXRoKSwgdGVtcF9kaXJfcGF0aCk7CisgICAgY29uc3QgVUlOVCBzdWNjZXNzID0gOjpHZXRUZW1wRmlsZU5hbWVBKHRlbXBfZGlyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdF9yZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBHZW5lcmF0ZSB1bmlxdWUgZmlsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfcGF0aCk7CisgICAgR1RFU1RfQ0hFQ0tfKHN1Y2Nlc3MgIT0gMCkKKyAgICAgICAgPDwgIlVuYWJsZSB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiAiIDw8IHRlbXBfZGlyX3BhdGg7CisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gY3JlYXQodGVtcF9maWxlX3BhdGgsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKKyAgICBHVEVTVF9DSEVDS18oY2FwdHVyZWRfZmQgIT0gLTEpIDw8ICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZW1wX2ZpbGVfcGF0aDsKKyAgICBmaWxlbmFtZV8gPSB0ZW1wX2ZpbGVfcGF0aDsKKyMgZWxzZQorICAgIC8vIFRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYSB0ZXN0IGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQKKyAgICAvLyBkaXJlY3RvcnksIHNvIHdlIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIC90bXAgZGlyZWN0b3J5CisgICAgLy8gaW5zdGVhZC4gV2UgdXNlIC90bXAgb24gbW9zdCBzeXN0ZW1zLCBhbmQgL3NkY2FyZCBvbiBBbmRyb2lkLgorICAgIC8vIFRoYXQncyBiZWNhdXNlIEFuZHJvaWQgZG9lc24ndCBoYXZlIC90bXAuCisjICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECisgICAgLy8gTm90ZTogQW5kcm9pZCBhcHBsaWNhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGNhbGwgdGhlIGZyYW1ld29yaydzCisgICAgLy8gQ29udGV4dC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSBtZXRob2QgdGhyb3VnaCBKTkkgdG8gZ2V0CisgICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3b3JsZC13cml0YWJsZSBTRCBDYXJkIGRpcmVjdG9yeS4gSG93ZXZlciwKKyAgICAvLyB0aGlzIHJlcXVpcmVzIGEgQ29udGV4dCBoYW5kbGUsIHdoaWNoIGNhbm5vdCBiZSByZXRyaWV2ZWQKKyAgICAvLyBnbG9iYWxseSBmcm9tIG5hdGl2ZSBjb2RlLiBEb2luZyBzbyBhbHNvIHByZWNsdWRlcyBydW5uaW5nIHRoZQorICAgIC8vIGNvZGUgYXMgcGFydCBvZiBhIHJlZ3VsYXIgc3RhbmRhbG9uZSBleGVjdXRhYmxlLCB3aGljaCBkb2Vzbid0CisgICAgLy8gcnVuIGluIGEgRGFsdmlrIHByb2Nlc3MgKGUuZy4gd2hlbiBydW5uaW5nIGl0IHRocm91Z2ggJ2FkYiBzaGVsbCcpLgorICAgIC8vCisgICAgLy8gVGhlIGxvY2F0aW9uIC9zZGNhcmQgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIG5hdGl2ZSBjb2RlCisgICAgLy8gYW5kIGlzIHRoZSBvbmx5IGxvY2F0aW9uICh1bm9mZmljaWFsbHkpIHN1cHBvcnRlZCBieSB0aGUgQW5kcm9pZAorICAgIC8vIHRlYW0uIEl0J3MgZ2VuZXJhbGx5IGEgc3ltbGluayB0byB0aGUgcmVhbCBTRCBDYXJkIG1vdW50IHBvaW50CisgICAgLy8gd2hpY2ggY2FuIGJlIC9tbnQvc2RjYXJkLCAvbW50L3NkY2FyZDAsIC9zeXN0ZW0vbWVkaWEvc2RjYXJkLCBvcgorICAgIC8vIG90aGVyIE9FTS1jdXN0b21pemVkIGxvY2F0aW9ucy4gTmV2ZXIgcmVseSBvbiB0aGVzZSwgYW5kIGFsd2F5cworICAgIC8vIHVzZSAvc2RjYXJkLgorICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi9zZGNhcmQvZ3Rlc3RfY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7CisjICBlbHNlCisgICAgY2hhciBuYW1lX3RlbXBsYXRlW10gPSAiL3RtcC9jYXB0dXJlZF9zdHJlYW0uWFhYWFhYIjsKKyMgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWF9BTkRST0lECisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gbWtzdGVtcChuYW1lX3RlbXBsYXRlKTsKKyAgICBmaWxlbmFtZV8gPSBuYW1lX3RlbXBsYXRlOworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICAgIGZmbHVzaChOVUxMKTsKKyAgICBkdXAyKGNhcHR1cmVkX2ZkLCBmZF8pOworICAgIGNsb3NlKGNhcHR1cmVkX2ZkKTsKKyAgfQorCisgIH5DYXB0dXJlZFN0cmVhbSgpIHsKKyAgICByZW1vdmUoZmlsZW5hbWVfLmNfc3RyKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdHJpbmcoKSB7CisgICAgaWYgKHVuY2FwdHVyZWRfZmRfICE9IC0xKSB7CisgICAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyZWFtLgorICAgICAgZmZsdXNoKE5VTEwpOworICAgICAgZHVwMih1bmNhcHR1cmVkX2ZkXywgZmRfKTsKKyAgICAgIGNsb3NlKHVuY2FwdHVyZWRfZmRfKTsKKyAgICAgIHVuY2FwdHVyZWRfZmRfID0gLTE7CisgICAgfQorCisgICAgRklMRSogY29uc3QgZmlsZSA9IHBvc2l4OjpGT3BlbihmaWxlbmFtZV8uY19zdHIoKSwgInIiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50ID0gUmVhZEVudGlyZUZpbGUoZmlsZSk7CisgICAgcG9zaXg6OkZDbG9zZShmaWxlKTsKKyAgICByZXR1cm4gY29udGVudDsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgZmlsZSBhcyBhbiBzdGQ6OnN0cmluZy4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpOworCisgIC8vIFJldHVybnMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIGZpbGUuCisgIHN0YXRpYyBzaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSk7CisKKyAgY29uc3QgaW50IGZkXzsgIC8vIEEgc3RyZWFtIHRvIGNhcHR1cmUuCisgIGludCB1bmNhcHR1cmVkX2ZkXzsKKyAgLy8gTmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaG9sZGluZyB0aGUgc3RkZXJyIG91dHB1dC4KKyAgOjpzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhDYXB0dXJlZFN0cmVhbSk7Cit9OworCisvLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgorc2l6ZV90IENhcHR1cmVkU3RyZWFtOjpHZXRGaWxlU2l6ZShGSUxFKiBmaWxlKSB7CisgIGZzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oZnRlbGwoZmlsZSkpOworfQorCisvLyBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBmaWxlIGFzIGEgc3RyaW5nLgorc3RkOjpzdHJpbmcgQ2FwdHVyZWRTdHJlYW06OlJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpIHsKKyAgY29uc3Qgc2l6ZV90IGZpbGVfc2l6ZSA9IEdldEZpbGVTaXplKGZpbGUpOworICBjaGFyKiBjb25zdCBidWZmZXIgPSBuZXcgY2hhcltmaWxlX3NpemVdOworCisgIHNpemVfdCBieXRlc19sYXN0X3JlYWQgPSAwOyAgLy8gIyBvZiBieXRlcyByZWFkIGluIHRoZSBsYXN0IGZyZWFkKCkKKyAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOyAgICAgICAvLyAjIG9mIGJ5dGVzIHJlYWQgc28gZmFyCisKKyAgZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOworCisgIC8vIEtlZXBzIHJlYWRpbmcgdGhlIGZpbGUgdW50aWwgd2UgY2Fubm90IHJlYWQgZnVydGhlciBvciB0aGUKKyAgLy8gcHJlLWRldGVybWluZWQgZmlsZSBzaXplIGlzIHJlYWNoZWQuCisgIGRvIHsKKyAgICBieXRlc19sYXN0X3JlYWQgPSBmcmVhZChidWZmZXIrYnl0ZXNfcmVhZCwgMSwgZmlsZV9zaXplLWJ5dGVzX3JlYWQsIGZpbGUpOworICAgIGJ5dGVzX3JlYWQgKz0gYnl0ZXNfbGFzdF9yZWFkOworICB9IHdoaWxlIChieXRlc19sYXN0X3JlYWQgPiAwICYmIGJ5dGVzX3JlYWQgPCBmaWxlX3NpemUpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQoYnVmZmVyLCBieXRlc19yZWFkKTsKKyAgZGVsZXRlW10gYnVmZmVyOworCisgIHJldHVybiBjb250ZW50OworfQorCisjIGlmZGVmIF9NU0NfVkVSCisjICBwcmFnbWEgd2FybmluZyhwb3ApCisjIGVuZGlmICAvLyBfTVNDX1ZFUgorCitzdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3RkZXJyID0gTlVMTDsKK3N0YXRpYyBDYXB0dXJlZFN0cmVhbSogZ19jYXB0dXJlZF9zdGRvdXQgPSBOVUxMOworCisvLyBTdGFydHMgY2FwdHVyaW5nIGFuIG91dHB1dCBzdHJlYW0gKHN0ZG91dC9zdGRlcnIpLgordm9pZCBDYXB0dXJlU3RyZWFtKGludCBmZCwgY29uc3QgY2hhciogc3RyZWFtX25hbWUsIENhcHR1cmVkU3RyZWFtKiogc3RyZWFtKSB7CisgIGlmICgqc3RyZWFtICE9IE5VTEwpIHsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiT25seSBvbmUgIiA8PCBzdHJlYW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY2FwdHVyZXIgY2FuIGV4aXN0IGF0IGEgdGltZS4iOworICB9CisgICpzdHJlYW0gPSBuZXcgQ2FwdHVyZWRTdHJlYW0oZmQpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgdGhlIG91dHB1dCBzdHJlYW0gYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK3N0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RyZWFtKENhcHR1cmVkU3RyZWFtKiogY2FwdHVyZWRfc3RyZWFtKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSAoKmNhcHR1cmVkX3N0cmVhbSktPkdldENhcHR1cmVkU3RyaW5nKCk7CisKKyAgZGVsZXRlICpjYXB0dXJlZF9zdHJlYW07CisgICpjYXB0dXJlZF9zdHJlYW0gPSBOVUxMOworCisgIHJldHVybiBjb250ZW50OworfQorCisvLyBTdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KK3ZvaWQgQ2FwdHVyZVN0ZG91dCgpIHsKKyAgQ2FwdHVyZVN0cmVhbShrU3RkT3V0RmlsZW5vLCAic3Rkb3V0IiwgJmdfY2FwdHVyZWRfc3Rkb3V0KTsKK30KKworLy8gU3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCit2b2lkIENhcHR1cmVTdGRlcnIoKSB7CisgIENhcHR1cmVTdHJlYW0oa1N0ZEVyckZpbGVubywgInN0ZGVyciIsICZnX2NhcHR1cmVkX3N0ZGVycik7Cit9CisKKy8vIFN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK3N0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCkgeworICByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3Rkb3V0KTsKK30KKworLy8gU3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKSB7CisgIHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRlcnIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEEgY29weSBvZiBhbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNldCBieSBJbml0R29vZ2xlVGVzdCgpLgorOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBnX2FyZ3ZzOworCitzdGF0aWMgY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiogZ19pbmplY3RlZF90ZXN0X2FyZ3ZzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMOyAgLy8gT3duZWQuCisKK3ZvaWQgU2V0SW5qZWN0YWJsZUFyZ3ZzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qIGFyZ3ZzKSB7CisgIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gYXJndnMpCisgICAgZGVsZXRlIGdfaW5qZWN0ZWRfdGVzdF9hcmd2czsKKyAgZ19pbmplY3RlZF90ZXN0X2FyZ3ZzID0gYXJndnM7Cit9CisKK2NvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEluamVjdGFibGVBcmd2cygpIHsKKyAgaWYgKGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyAhPSBOVUxMKSB7CisgICAgcmV0dXJuICpnX2luamVjdGVkX3Rlc3RfYXJndnM7CisgIH0KKyAgcmV0dXJuIGdfYXJndnM7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorbmFtZXNwYWNlIHBvc2l4IHsKK3ZvaWQgQWJvcnQoKSB7CisgIERlYnVnQnJlYWsoKTsKKyAgVGVybWluYXRlUHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAxKTsKK30KK30gIC8vIG5hbWVzcGFjZSBwb3NpeAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorLy8gZ2l2ZW4gZmxhZy4gIEZvciBleGFtcGxlLCBGbGFnVG9FbnZWYXIoImZvbyIpIHdpbGwgcmV0dXJuCisvLyAiR1RFU1RfRk9PIiBpbiB0aGUgb3Blbi1zb3VyY2UgdmVyc2lvbi4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGbGFnVG9FbnZWYXIoY29uc3QgY2hhciogZmxhZykgeworICBjb25zdCBzdGQ6OnN0cmluZyBmdWxsX2ZsYWcgPQorICAgICAgKE1lc3NhZ2UoKSA8PCBHVEVTVF9GTEFHX1BSRUZJWF8gPDwgZmxhZykuR2V0U3RyaW5nKCk7CisKKyAgTWVzc2FnZSBlbnZfdmFyOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBmdWxsX2ZsYWcubGVuZ3RoKCk7IGkrKykgeworICAgIGVudl92YXIgPDwgVG9VcHBlcihmdWxsX2ZsYWcuY19zdHIoKVtpXSk7CisgIH0KKworICByZXR1cm4gZW52X3Zhci5HZXRTdHJpbmcoKTsKK30KKworLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcworLy8gdGhlIHJlc3VsdCB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUKKy8vIHVuY2hhbmdlZCBhbmQgcmV0dXJucyBmYWxzZS4KK2Jvb2wgUGFyc2VJbnQzMihjb25zdCBNZXNzYWdlJiBzcmNfdGV4dCwgY29uc3QgY2hhciogc3RyLCBJbnQzMiogdmFsdWUpIHsKKyAgLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBhIGRlY2ltYWwgaW50ZWdlci4KKyAgY2hhciogZW5kID0gTlVMTDsKKyAgY29uc3QgbG9uZyBsb25nX3ZhbHVlID0gc3RydG9sKHN0ciwgJmVuZCwgMTApOyAgLy8gTk9MSU5UCisKKyAgLy8gSGFzIHN0cnRvbCgpIGNvbnN1bWVkIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmc/CisgIGlmICgqZW5kICE9ICdcMCcpIHsKKyAgICAvLyBObyAtIGFuIGludmFsaWQgY2hhcmFjdGVyIHdhcyBlbmNvdW50ZXJlZC4KKyAgICBNZXNzYWdlIG1zZzsKKyAgICBtc2cgPDwgIldBUk5JTkc6ICIgPDwgc3JjX3RleHQKKyAgICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBidXQgYWN0dWFsbHkiCisgICAgICAgIDw8ICIgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLlxuIjsKKyAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElzIHRoZSBwYXJzZWQgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIGFuIEludDMyPworICBjb25zdCBJbnQzMiByZXN1bHQgPSBzdGF0aWNfY2FzdDxJbnQzMj4obG9uZ192YWx1ZSk7CisgIGlmIChsb25nX3ZhbHVlID09IExPTkdfTUFYIHx8IGxvbmdfdmFsdWUgPT0gTE9OR19NSU4gfHwKKyAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGEgbG9uZy4gIChzdHJ0b2woKSByZXR1cm5zCisgICAgICAvLyBMT05HX01BWCBvciBMT05HX01JTiB3aGVuIHRoZSBpbnB1dCBvdmVyZmxvd3MuKQorICAgICAgcmVzdWx0ICE9IGxvbmdfdmFsdWUKKyAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGFuIEludDMyLgorICAgICAgKSB7CisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0CisgICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgorICAgICAgICA8PCAiIGhhcyB2YWx1ZSAiIDw8IHN0ciA8PCAiLCB3aGljaCBvdmVyZmxvd3MuXG4iOworICAgIHByaW50ZigiJXMiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnZhbHVlID0gcmVzdWx0OworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIEJvb2xlYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bworLy8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0J3Mgbm90IHNldCwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorLy8KKy8vIFRoZSB2YWx1ZSBpcyBjb25zaWRlcmVkIHRydWUgaWZmIGl0J3Mgbm90ICIwIi4KK2Jvb2wgQm9vbEZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBib29sIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICByZXR1cm4gc3RyaW5nX3ZhbHVlID09IE5VTEwgPworICAgICAgZGVmYXVsdF92YWx1ZSA6IHN0cmNtcChzdHJpbmdfdmFsdWUsICIwIikgIT0gMDsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgYSAzMi1iaXQgaW50ZWdlciBzdG9yZWQgaW4gdGhlIGVudmlyb25tZW50CisvLyB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCBpc24ndCBzZXQgb3IKKy8vIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgMzItYml0IGludGVnZXIsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KK0ludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICBpZiAoc3RyaW5nX3ZhbHVlID09IE5VTEwpIHsKKyAgICAvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4KKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIEludDMyIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7CisgIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIkVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSwgJnJlc3VsdCkpIHsKKyAgICBwcmludGYoIlRoZSBkZWZhdWx0IHZhbHVlICVzIGlzIHVzZWQuXG4iLAorICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGRlZmF1bHRfdmFsdWUpLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitjb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOworICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgcmV0dXJuIHZhbHVlID09IE5VTEwgPyBkZWZhdWx0X3ZhbHVlIDogdmFsdWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKKy8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6CisvLworLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7CisvLworLy8gSXQgdXNlcyB0aGUgPDwgb3BlcmF0b3Igd2hlbiBwb3NzaWJsZSwgYW5kIHByaW50cyB0aGUgYnl0ZXMgaW4gdGhlCisvLyBvYmplY3Qgb3RoZXJ3aXNlLiAgQSB1c2VyIGNhbiBvdmVycmlkZSBpdHMgYmVoYXZpb3IgZm9yIGEgY2xhc3MKKy8vIHR5cGUgRm9vIGJ5IGRlZmluaW5nIGVpdGhlciBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiwgY29uc3QgRm9vJikKKy8vIG9yIHZvaWQgUHJpbnRUbyhjb25zdCBGb28mLCA6OnN0ZDo6b3N0cmVhbSopIGluIHRoZSBuYW1lc3BhY2UgdGhhdAorLy8gZGVmaW5lcyBGb28uCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCit1c2luZyA6OnN0ZDo6b3N0cmVhbTsKKworLy8gUHJpbnRzIGEgc2VnbWVudCBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0Lgordm9pZCBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBvc3RyZWFtKiBvcykgeworICBjaGFyIHRleHRbNV0gPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworICAgIGNvbnN0IHNpemVfdCBqID0gc3RhcnQgKyBpOworICAgIGlmIChpICE9IDApIHsKKyAgICAgIC8vIE9yZ2FuaXplcyB0aGUgYnl0ZXMgaW50byBncm91cHMgb2YgMiBmb3IgZWFzeSBwYXJzaW5nIGJ5CisgICAgICAvLyBodW1hbi4KKyAgICAgIGlmICgoaiAlIDIpID09IDApCisgICAgICAgICpvcyA8PCAnICc7CisgICAgICBlbHNlCisgICAgICAgICpvcyA8PCAnLSc7CisgICAgfQorICAgIEdURVNUX1NOUFJJTlRGXyh0ZXh0LCBzaXplb2YodGV4dCksICIlMDJYIiwgb2JqX2J5dGVzW2pdKTsKKyAgICAqb3MgPDwgdGV4dDsKKyAgfQorfQorCisvLyBQcmludHMgdGhlIGJ5dGVzIGluIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4KK3ZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKKyAgLy8gVGVsbHMgdGhlIHVzZXIgaG93IGJpZyB0aGUgb2JqZWN0IGlzLgorICAqb3MgPDwgY291bnQgPDwgIi1ieXRlIG9iamVjdCA8IjsKKworICBjb25zdCBzaXplX3Qga1RocmVzaG9sZCA9IDEzMjsKKyAgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA2NDsKKyAgLy8gSWYgdGhlIG9iamVjdCBzaXplIGlzIGJpZ2dlciB0aGFuIGtUaHJlc2hvbGQsIHdlJ2xsIGhhdmUgdG8gb21pdAorICAvLyBzb21lIGRldGFpbHMgYnkgcHJpbnRpbmcgb25seSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGtDaHVua1NpemUKKyAgLy8gYnl0ZXMuCisgIC8vIFRPRE8od2FuKTogbGV0IHRoZSB1c2VyIGNvbnRyb2wgdGhlIHRocmVzaG9sZCB1c2luZyBhIGZsYWcuCisgIGlmIChjb3VudCA8IGtUaHJlc2hvbGQpIHsKKyAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGNvdW50LCBvcyk7CisgIH0gZWxzZSB7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgKm9zIDw8ICIgLi4uICI7CisgICAgLy8gUm91bmRzIHVwIHRvIDItYnl0ZSBib3VuZGFyeS4KKyAgICBjb25zdCBzaXplX3QgcmVzdW1lX3BvcyA9IChjb3VudCAtIGtDaHVua1NpemUgKyAxKS8yKjI7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCByZXN1bWVfcG9zLCBjb3VudCAtIHJlc3VtZV9wb3MsIG9zKTsKKyAgfQorICAqb3MgPDwgIj4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGludGVybmFsMiB7CisKKy8vIERlbGVnYXRlcyB0byBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwoKSB0byBwcmludCB0aGUgYnl0ZXMgaW4gdGhlCisvLyBnaXZlbiBvYmplY3QuICBUaGUgZGVsZWdhdGlvbiBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKKy8vIHVzZXMgdGhlIDw8IG9wZXJhdG9yIGFuZCB0aHVzIGlzIGVhc2llciBkb25lIG91dHNpZGUgb2YgdGhlCisvLyA6OnRlc3Rpbmc6OmludGVybmFsIG5hbWVzcGFjZSwgd2hpY2ggY29udGFpbnMgYSA8PCBvcGVyYXRvciB0aGF0CisvLyBzb21ldGltZXMgY29uZmxpY3RzIHdpdGggdGhlIG9uZSBpbiBTVEwuCit2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgeworICBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwob2JqX2J5dGVzLCBjb3VudCwgb3MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwyCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYSBjaGFyIChvciB3Y2hhcl90KSwgd2UgcHJpbnQgaXQgaW4gb25lCisvLyBvZiB0aHJlZSBmb3JtYXRzOgorLy8gICAtIGFzIGlzIGlmIGl0J3MgYSBwcmludGFibGUgQVNDSUkgKGUuZy4gJ2EnLCAnMicsICcgJyksCisvLyAgIC0gYXMgYSBoZXhpZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2UgKGUuZy4gJ1x4N0YnKSwgb3IKKy8vICAgLSBhcyBhIHNwZWNpYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdccicsICdcbicpLgorZW51bSBDaGFyRm9ybWF0IHsKKyAga0FzSXMsCisgIGtIZXhFc2NhcGUsCisgIGtTcGVjaWFsRXNjYXBlCit9OworCisvLyBSZXR1cm5zIHRydWUgaWYgYyBpcyBhIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXIuICBXZSB0ZXN0IHRoZQorLy8gdmFsdWUgb2YgYyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgaXNwcmludCgpLCB3aGljaCBpcyBidWdneSBvbgorLy8gV2luZG93cyBNb2JpbGUuCitpbmxpbmUgYm9vbCBJc1ByaW50YWJsZUFzY2lpKHdjaGFyX3QgYykgeworICByZXR1cm4gMHgyMCA8PSBjICYmIGMgPD0gMHg3RTsKK30KKworLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhciBjIGFzIGEgY2hhcmFjdGVyIGxpdGVyYWwgd2l0aG91dCB0aGUKKy8vIHF1b3RlcywgZXNjYXBpbmcgaXQgd2hlbiBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KKy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwKKy8vIHdoaWNoIGlzIHRoZSB0eXBlIG9mIGMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPgorc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc0NoYXJMaXRlcmFsVG8oQ2hhciBjLCBvc3RyZWFtKiBvcykgeworICBzd2l0Y2ggKHN0YXRpY19jYXN0PHdjaGFyX3Q+KGMpKSB7CisgICAgY2FzZSBMJ1wwJzoKKyAgICAgICpvcyA8PCAiXFwwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcJyc6CisgICAgICAqb3MgPDwgIlxcJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXFwnOgorICAgICAgKm9zIDw8ICJcXFxcIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcYSc6CisgICAgICAqb3MgPDwgIlxcYSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGInOgorICAgICAgKm9zIDw8ICJcXGIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xmJzoKKyAgICAgICpvcyA8PCAiXFxmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcbic6CisgICAgICAqb3MgPDwgIlxcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXHInOgorICAgICAgKm9zIDw8ICJcXHIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1x0JzoKKyAgICAgICpvcyA8PCAiXFx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcdic6CisgICAgICAqb3MgPDwgIlxcdiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKElzUHJpbnRhYmxlQXNjaWkoYykpIHsKKyAgICAgICAgKm9zIDw8IHN0YXRpY19jYXN0PGNoYXI+KGMpOworICAgICAgICByZXR1cm4ga0FzSXM7CisgICAgICB9IGVsc2UgeworICAgICAgICAqb3MgPDwgIlxceCIgKyBTdHJpbmc6OkZvcm1hdEhleEludChzdGF0aWNfY2FzdDxVbnNpZ25lZENoYXI+KGMpKTsKKyAgICAgICAgcmV0dXJuIGtIZXhFc2NhcGU7CisgICAgICB9CisgIH0KKyAgcmV0dXJuIGtTcGVjaWFsRXNjYXBlOworfQorCisvLyBQcmludHMgYSB3Y2hhcl90IGMgYXMgaWYgaXQncyBwYXJ0IG9mIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwaW5nIGl0IHdoZW4KKy8vIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgorc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyh3Y2hhcl90IGMsIG9zdHJlYW0qIG9zKSB7CisgIHN3aXRjaCAoYykgeworICAgIGNhc2UgTCdcJyc6CisgICAgICAqb3MgPDwgIiciOworICAgICAgcmV0dXJuIGtBc0lzOworICAgIGNhc2UgTCciJzoKKyAgICAgICpvcyA8PCAiXFxcIiI7CisgICAgICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBQcmludEFzQ2hhckxpdGVyYWxUbzx3Y2hhcl90PihjLCBvcyk7CisgIH0KK30KKworLy8gUHJpbnRzIGEgY2hhciBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuCisvLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNTdHJpbmdMaXRlcmFsVG8oY2hhciBjLCBvc3RyZWFtKiBvcykgeworICByZXR1cm4gUHJpbnRBc1N0cmluZ0xpdGVyYWxUbygKKyAgICAgIHN0YXRpY19jYXN0PHdjaGFyX3Q+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpKSwgb3MpOworfQorCisvLyBQcmludHMgYSB3aWRlIG9yIG5hcnJvdyBjaGFyYWN0ZXIgYyBhbmQgaXRzIGNvZGUuICAnXDAnIGlzIHByaW50ZWQKKy8vIGFzICInXFwwJyIsIG90aGVyIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlIGFsc28gcHJvcGVybHkgZXNjYXBlZAorLy8gdXNpbmcgdGhlIHN0YW5kYXJkIEMrKyBlc2NhcGUgc2VxdWVuY2UuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKKy8vIFVuc2lnbmVkQ2hhciBpcyB0aGUgdW5zaWduZWQgdmVyc2lvbiBvZiBDaGFyLCB3aGljaCBpcyB0aGUgdHlwZSBvZiBjLgordGVtcGxhdGUgPHR5cGVuYW1lIFVuc2lnbmVkQ2hhciwgdHlwZW5hbWUgQ2hhcj4KK3ZvaWQgUHJpbnRDaGFyQW5kQ29kZVRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsKKyAgLy8gRmlyc3QsIHByaW50IGMgYXMgYSBsaXRlcmFsIGluIHRoZSBtb3N0IHJlYWRhYmxlIGZvcm0gd2UgY2FuIGZpbmQuCisgICpvcyA8PCAoKHNpemVvZihjKSA+IDEpID8gIkwnIiA6ICInIik7CisgIGNvbnN0IENoYXJGb3JtYXQgZm9ybWF0ID0gUHJpbnRBc0NoYXJMaXRlcmFsVG88VW5zaWduZWRDaGFyPihjLCBvcyk7CisgICpvcyA8PCAiJyI7CisKKyAgLy8gVG8gYWlkIHVzZXIgZGVidWdnaW5nLCB3ZSBhbHNvIHByaW50IGMncyBjb2RlIGluIGRlY2ltYWwsIHVubGVzcworICAvLyBpdCdzIDAgKGluIHdoaWNoIGNhc2UgYyB3YXMgcHJpbnRlZCBhcyAnXFwwJywgbWFraW5nIHRoZSBjb2RlCisgIC8vIG9idmlvdXMpLgorICBpZiAoYyA9PSAwKQorICAgIHJldHVybjsKKyAgKm9zIDw8ICIgKCIgPDwgc3RhdGljX2Nhc3Q8aW50PihjKTsKKworICAvLyBGb3IgbW9yZSBjb252ZW5pZW5jZSwgd2UgcHJpbnQgYydzIGNvZGUgYWdhaW4gaW4gaGV4aWRlY2ltYWwsCisgIC8vIHVubGVzcyBjIHdhcyBhbHJlYWR5IHByaW50ZWQgaW4gdGhlIGZvcm0gJ1x4IyMnIG9yIHRoZSBjb2RlIGlzIGluCisgIC8vIFsxLCA5XS4KKyAgaWYgKGZvcm1hdCA9PSBrSGV4RXNjYXBlIHx8ICgxIDw9IGMgJiYgYyA8PSA5KSkgeworICAgIC8vIERvIG5vdGhpbmcuCisgIH0gZWxzZSB7CisgICAgKm9zIDw8ICIsIDB4IiA8PCBTdHJpbmc6OkZvcm1hdEhleEludChzdGF0aWNfY2FzdDxVbnNpZ25lZENoYXI+KGMpKTsKKyAgfQorICAqb3MgPDwgIikiOworfQorCit2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKK30KK3ZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKK30KKworLy8gUHJpbnRzIGEgd2NoYXJfdCBhcyBhIHN5bWJvbCBpZiBpdCBpcyBwcmludGFibGUgb3IgYXMgaXRzIGludGVybmFsCisvLyBjb2RlIG90aGVyd2lzZSBhbmQgYWxzbyBhcyBpdHMgY29kZS4gIEwnXDAnIGlzIHByaW50ZWQgYXMgIkwnXFwwJyIuCit2b2lkIFByaW50VG8od2NoYXJfdCB3Yywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHdjaGFyX3Q+KHdjLCBvcyk7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0byB0aGUgb3N0cmVhbS4gIENoYXJUeXBlIG11c3QgYmUgZWl0aGVyCisvLyBjaGFyIG9yIHdjaGFyX3QuCisvLyBUaGUgYXJyYXkgc3RhcnRzIGF0IGJlZ2luLCB0aGUgbGVuZ3RoIGlzIGxlbiwgaXQgbWF5IGluY2x1ZGUgJ1wwJyBjaGFyYWN0ZXJzCisvLyBhbmQgbWF5IG5vdCBiZSBOVUwtdGVybWluYXRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3N0YXRpYyB2b2lkIFByaW50Q2hhcnNBc1N0cmluZ1RvKAorICAgIGNvbnN0IENoYXJUeXBlKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgY29uc3QgY2hhciogY29uc3Qga1F1b3RlQmVnaW4gPSBzaXplb2YoQ2hhclR5cGUpID09IDEgPyAiXCIiIDogIkxcIiI7CisgICpvcyA8PCBrUXVvdGVCZWdpbjsKKyAgYm9vbCBpc19wcmV2aW91c19oZXggPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgKytpbmRleCkgeworICAgIGNvbnN0IENoYXJUeXBlIGN1ciA9IGJlZ2luW2luZGV4XTsKKyAgICBpZiAoaXNfcHJldmlvdXNfaGV4ICYmIElzWERpZ2l0KGN1cikpIHsKKyAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciBpcyBvZiAnXHguLicgZm9ybSBhbmQgdGhpcyBjaGFyYWN0ZXIgY2FuIGJlCisgICAgICAvLyBpbnRlcnByZXRlZCBhcyBhbm90aGVyIGhleGFkZWNpbWFsIGRpZ2l0IGluIGl0cyBudW1iZXIuIEJyZWFrIHN0cmluZyB0bworICAgICAgLy8gZGlzYW1iaWd1YXRlLgorICAgICAgKm9zIDw8ICJcIiAiIDw8IGtRdW90ZUJlZ2luOworICAgIH0KKyAgICBpc19wcmV2aW91c19oZXggPSBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKGN1ciwgb3MpID09IGtIZXhFc2NhcGU7CisgIH0KKyAgKm9zIDw8ICJcIiI7Cit9CisKKy8vIFByaW50cyBhIChjb25zdCkgY2hhci93Y2hhcl90IGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzCisvLyAnYmVnaW4nLiAgQ2hhclR5cGUgbXVzdCBiZSBlaXRoZXIgY2hhciBvciB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgorc3RhdGljIHZvaWQgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoCisgICAgY29uc3QgQ2hhclR5cGUqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICAvLyBUaGUgY29kZQorICAvLyAgIGNvbnN0IGNoYXIga0Zvb1tdID0gImZvbyI7CisgIC8vIGdlbmVyYXRlcyBhbiBhcnJheSBvZiA0LCBub3QgMywgZWxlbWVudHMsIHdpdGggdGhlIGxhc3Qgb25lIGJlaW5nICdcMCcuCisgIC8vCisgIC8vIFRoZXJlZm9yZSB3aGVuIHByaW50aW5nIGEgY2hhciBhcnJheSwgd2UgZG9uJ3QgcHJpbnQgdGhlIGxhc3QgZWxlbWVudCBpZgorICAvLyBpdCdzICdcMCcsIHN1Y2ggdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIHN0cmluZyBsaXRlcmFsIGFzIGl0J3MKKyAgLy8gd3JpdHRlbiBpbiB0aGUgc291cmNlIGNvZGUuCisgIGlmIChsZW4gPiAwICYmIGJlZ2luW2xlbiAtIDFdID09ICdcMCcpIHsKKyAgICBQcmludENoYXJzQXNTdHJpbmdUbyhiZWdpbiwgbGVuIC0gMSwgb3MpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmLCBob3dldmVyLCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBub3QgJ1wwJywgZS5nLgorICAvLyAgICBjb25zdCBjaGFyIGtGb29bXSA9IHsgJ2YnLCAnbycsICdvJyB9OworICAvLyB3ZSBtdXN0IHByaW50IHRoZSBlbnRpcmUgYXJyYXkuICBXZSBhbHNvIHByaW50IGEgbWVzc2FnZSB0byBpbmRpY2F0ZQorICAvLyB0aGF0IHRoZSBhcnJheSBpcyBub3QgTlVMLXRlcm1pbmF0ZWQuCisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4sIG9zKTsKKyAgKm9zIDw8ICIgKG5vIHRlcm1pbmF0aW5nIE5VTCkiOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3ZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBjaGFyKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoYmVnaW4sIGxlbiwgb3MpOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIHdjaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MKKy8vICdiZWdpbicuCit2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3Qgd2NoYXJfdCogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KGJlZ2luLCBsZW4sIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4KK3ZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCBvc3RyZWFtKiBvcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOworICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMsIHN0cmxlbihzKSwgb3MpOworICB9Cit9CisKKy8vIE1TVkMgY29tcGlsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdoYXJfdCBhcyBhIHR5cGVkZWYKKy8vIG9mIHVuc2lnbmVkIHNob3J0LiBEZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3Qgd2NoYXJfdCogaW4gdGhhdCBjYXNlCisvLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsCisvLyBwb3NzaWJseSBhY2Nlc3NpbmcgbW9yZSBtZW1vcnkgdGhhbiBpbnRlbmRlZCBhbmQgY2F1c2luZyBpbnZhbGlkCisvLyBtZW1vcnkgYWNjZXNzZXMuIE1TVkMgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCBzeW1ib2wgd2hlbgorLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorLy8gUHJpbnRzIHRoZSBnaXZlbiB3aWRlIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgordm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIG9zdHJlYW0qIG9zKSB7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICAqb3MgPDwgIk5VTEwiOworICB9IGVsc2UgeworICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7CisgICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocywgd2NzbGVuKHMpLCBvcyk7CisgIH0KK30KKyNlbmRpZiAgLy8gd2NoYXJfdCBpcyBuYXRpdmUKKworLy8gUHJpbnRzIGEgOjpzdHJpbmcgb2JqZWN0LgorI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCit2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCit2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdGQ6OnN0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIDo6d3N0cmluZyBvYmplY3QuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCit2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6d3N0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCit2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCit1c2luZyBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOworCisvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrIHRyYWNlCisvLyBpbiBpdC4KK3N0ZDo6c3RyaW5nIFRlc3RQYXJ0UmVzdWx0OjpFeHRyYWN0U3VtbWFyeShjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YWNrX3RyYWNlID0gc3Ryc3RyKG1lc3NhZ2UsIGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlcik7CisgIHJldHVybiBzdGFja190cmFjZSA9PSBOVUxMID8gbWVzc2FnZSA6CisgICAgICBzdGQ6OnN0cmluZyhtZXNzYWdlLCBzdGFja190cmFjZSk7Cit9CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdC4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiBvcworICAgICAgPDwgcmVzdWx0LmZpbGVfbmFtZSgpIDw8ICI6IiA8PCByZXN1bHQubGluZV9udW1iZXIoKSA8PCAiOiAiCisgICAgICA8PCAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MgPyAiU3VjY2VzcyIgOgorICAgICAgICAgIHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgPyAiRmF0YWwgZmFpbHVyZSIgOgorICAgICAgICAgICJOb24tZmF0YWwgZmFpbHVyZSIpIDw8ICI6XG4iCisgICAgICA8PCByZXN1bHQubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKK30KKworLy8gQXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KK3ZvaWQgVGVzdFBhcnRSZXN1bHRBcnJheTo6QXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgYXJyYXlfLnB1c2hfYmFjayhyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0UGFydFJlc3VsdCBhdCB0aGUgZ2l2ZW4gaW5kZXggKDAtYmFzZWQpLgorY29uc3QgVGVzdFBhcnRSZXN1bHQmIFRlc3RQYXJ0UmVzdWx0QXJyYXk6OkdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3QgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKSkgeworICAgIHByaW50ZigiXG5JbnZhbGlkIGluZGV4ICglZCkgaW50byBUZXN0UGFydFJlc3VsdEFycmF5LlxuIiwgaW5kZXgpOworICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgfQorCisgIHJldHVybiBhcnJheV9baW5kZXhdOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVGVzdFBhcnRSZXN1bHQgb2JqZWN0cyBpbiB0aGUgYXJyYXkuCitpbnQgVGVzdFBhcnRSZXN1bHRBcnJheTo6c2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYXJyYXlfLnNpemUoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK0hhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCkKKyAgICA6IGhhc19uZXdfZmF0YWxfZmFpbHVyZV8oZmFsc2UpLAorICAgICAgb3JpZ2luYWxfcmVwb3J0ZXJfKEdldFVuaXRUZXN0SW1wbCgpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpKSB7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsKK30KKworSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjp+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCkgeworICBHZXRVbml0VGVzdEltcGwoKS0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgICBvcmlnaW5hbF9yZXBvcnRlcl8pOworfQorCit2b2lkIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICBpZiAocmVzdWx0LmZhdGFsbHlfZmFpbGVkKCkpCisgICAgaGFzX25ld19mYXRhbF9mYWlsdXJlXyA9IHRydWU7CisgIG9yaWdpbmFsX3JlcG9ydGVyXy0+UmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGluIHN0ci4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgc3RyCisvLyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KK3N0YXRpYyBjb25zdCBjaGFyKiBTa2lwU3BhY2VzKGNvbnN0IGNoYXIqIHN0cikgeworICB3aGlsZSAoSXNTcGFjZSgqc3RyKSkKKyAgICBzdHIrKzsKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluCisvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKy8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuCitjb25zdCBjaGFyKiBUeXBlZFRlc3RDYXNlUFN0YXRlOjpWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAorICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnNldDxjb25zdCBjaGFyKj46OmNvbnN0X2l0ZXJhdG9yIERlZmluZWRUZXN0SXRlcjsKKyAgcmVnaXN0ZXJlZF8gPSB0cnVlOworCisgIC8vIFNraXAgaW5pdGlhbCB3aGl0ZXNwYWNlIGluIHJlZ2lzdGVyZWRfdGVzdHMgc2luY2Ugc29tZQorICAvLyBwcmVwcm9jZXNzb3JzIHByZWZpeCBzdHJpbmdpemllZCBsaXRlcmFscyB3aXRoIHdoaXRlc3BhY2UuCisgIHJlZ2lzdGVyZWRfdGVzdHMgPSBTa2lwU3BhY2VzKHJlZ2lzdGVyZWRfdGVzdHMpOworCisgIE1lc3NhZ2UgZXJyb3JzOworICA6OnN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0ZXN0czsKKyAgZm9yIChjb25zdCBjaGFyKiBuYW1lcyA9IHJlZ2lzdGVyZWRfdGVzdHM7IG5hbWVzICE9IE5VTEw7CisgICAgICAgbmFtZXMgPSBTa2lwQ29tbWEobmFtZXMpKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9IEdldFByZWZpeFVudGlsQ29tbWEobmFtZXMpOworICAgIGlmICh0ZXN0cy5jb3VudChuYW1lKSAhPSAwKSB7CisgICAgICBlcnJvcnMgPDwgIlRlc3QgIiA8PCBuYW1lIDw8ICIgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLlxuIjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKERlZmluZWRUZXN0SXRlciBpdCA9IGRlZmluZWRfdGVzdF9uYW1lc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGRlZmluZWRfdGVzdF9uYW1lc18uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAobmFtZSA9PSAqaXQpIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmQpIHsKKyAgICAgIHRlc3RzLmluc2VydChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgZXJyb3JzIDw8ICJObyB0ZXN0IG5hbWVkICIgPDwgbmFtZQorICAgICAgICAgICAgIDw8ICIgY2FuIGJlIGZvdW5kIGluIHRoaXMgdGVzdCBjYXNlLlxuIjsKKyAgICB9CisgIH0KKworICBmb3IgKERlZmluZWRUZXN0SXRlciBpdCA9IGRlZmluZWRfdGVzdF9uYW1lc18uYmVnaW4oKTsKKyAgICAgICBpdCAhPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmVuZCgpOworICAgICAgICsraXQpIHsKKyAgICBpZiAodGVzdHMuY291bnQoKml0KSA9PSAwKSB7CisgICAgICBlcnJvcnMgPDwgIllvdSBmb3Jnb3QgdG8gbGlzdCB0ZXN0ICIgPDwgKml0IDw8ICIuXG4iOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcnNfc3RyID0gZXJyb3JzLkdldFN0cmluZygpOworICBpZiAoZXJyb3JzX3N0ciAhPSAiIikgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICAgIGVycm9yc19zdHIuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkFib3J0KCk7CisgIH0KKworICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0czsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzgwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC5oCkBAIC0wLDAgKzEsMjAwNjEgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljIEFQSSBmb3IgR29vZ2xlIFRlc3QuICBJdCBzaG91bGQgYmUKKy8vIGluY2x1ZGVkIGJ5IGFueSB0ZXN0IHByb2dyYW0gdGhhdCB1c2VzIEdvb2dsZSBUZXN0LgorLy8KKy8vIElNUE9SVEFOVCBOT1RFOiBEdWUgdG8gbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlLCB3ZSBoYXZlIHRvCisvLyBsZWF2ZSBzb21lIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaW4gdGhpcyBoZWFkZXIgZmlsZS4KKy8vIFRoZXkgYXJlIGNsZWFybHkgbWFya2VkIGJ5IGNvbW1lbnRzIGxpa2UgdGhpczoKKy8vCisvLyAgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKy8vCisvLyBTdWNoIGNvZGUgaXMgTk9UIG1lYW50IHRvIGJlIHVzZWQgYnkgYSB1c2VyIGRpcmVjdGx5LCBhbmQgaXMgc3ViamVjdAorLy8gdG8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLiAgVGhlcmVmb3JlIERPIE5PVCBERVBFTkQgT04gSVQgaW4gYSB1c2VyCisvLyBwcm9ncmFtIQorLy8KKy8vIEFja25vd2xlZGdtZW50OiBHb29nbGUgVGVzdCBib3Jyb3dlZCB0aGUgaWRlYSBvZiBhdXRvbWF0aWMgdGVzdAorLy8gcmVnaXN0cmF0aW9uIGZyb20gQmFydGhlbGVteSBEYWdlbmFpcycgKGJhcnRoZWxlbXlAcHJvbG9naXF1ZS5jb20pCisvLyBlYXN5VW5pdCBmcmFtZXdvcmsuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXworCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBMb3ctbGV2ZWwgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgcG9ydGluZyBHb29nbGUgVGVzdCB0byB2YXJpb3VzCisvLyBwbGF0Zm9ybXMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIERPIE5PVCBVU0UKKy8vIFRIRU0gSU4gVVNFUiBDT0RFLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBmdW5kYW1lbnRhbCB0byBHb29nbGUgVGVzdC4gIEFsbCBvdGhlciBHb29nbGUgVGVzdCBzb3VyY2UKKy8vIGZpbGVzIGFyZSBleHBlY3RlZCB0byAjaW5jbHVkZSB0aGlzLiAgVGhlcmVmb3JlLCBpdCBjYW5ub3QgI2luY2x1ZGUKKy8vIGFueSBvdGhlciBHb29nbGUgVGVzdCBoZWFkZXIuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXworCisvLyBUaGUgdXNlciBjYW4gZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGluIHRoZSBidWlsZCBzY3JpcHQgdG8KKy8vIGNvbnRyb2wgR29vZ2xlIFRlc3QncyBiZWhhdmlvci4gIElmIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIGEgbWFjcm8KKy8vIGluIHRoaXMgbGlzdCwgR29vZ2xlIFRlc3Qgd2lsbCBkZWZpbmUgaXQuCisvLworLy8gICBHVEVTVF9IQVNfQ0xPTkUgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgY2xvbmUoMikKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfRVhDRVBUSU9OUyAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgZXhjZXB0aW9ucworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW5hYmxlZC4KKy8vICAgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IDo6c3RyaW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZSAoc29tZSBzeXN0ZW1zIGRlZmluZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6c3RyaW5nKS4KKy8vICAgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IDo6c3RyaW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZSAoc29tZSBzeXN0ZW1zIGRlZmluZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OndzdHJpbmcsIHdoaWNoIGlzIGRpZmZlcmVudCB0byBzdGQ6OndzdHJpbmcpLgorLy8gICBHVEVTVF9IQVNfUE9TSVhfUkUgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUE9TSVggcmVndWxhcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucyBhcmUvYXJlbid0IGF2YWlsYWJsZS4KKy8vICAgR1RFU1RfSEFTX1BUSFJFQUQgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IDxwdGhyZWFkLmg+CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZS4KKy8vICAgR1RFU1RfSEFTX1JUVEkgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IFJUVEkgaXMvaXNuJ3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4KKy8vICAgR1RFU1RfSEFTX1NURF9XU1RSSU5HICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyBkb2VzL2RvZXNuJ3Qgd29yayAoR29vZ2xlIFRlc3QgY2FuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgd2hlcmUgc3RkOjp3c3RyaW5nIGlzIHVuYXZhaWxhYmxlKS4KKy8vICAgR1RFU1RfSEFTX1RSMV9UVVBMRSAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0cjE6OnR1cGxlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZS4KKy8vICAgR1RFU1RfSEFTX1NFSCAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlciBzdXBwb3J0cyBNaWNyb3NvZnQncyAiU3RydWN0dXJlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gSGFuZGxpbmciLgorLy8gICBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gc3VwcG9ydHMgSS9PIHN0cmVhbSByZWRpcmVjdGlvbiB1c2luZworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXAoKSBhbmQgZHVwMigpLgorLy8gICBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgR29vZ2xlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3QncyBvd24gdHIxIHR1cGxlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLiAgVW51c2VkIHdoZW4gdGhlIHVzZXIgc2V0cworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9IQVNfVFIxX1RVUExFIHRvIDAuCisvLyAgIEdURVNUX0xBTkdfQ1hYMTEgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBHb29nbGUgVGVzdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBidWlsZGluZyBpbiBDKysxMS9DKys5OCBtb2RlLgorLy8gICBHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgdGVzdHMgdGhhdCB1c2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlIFRlc3QgYXMgYSBzaGFyZWQgbGlicmFyeSAoa25vd24gYXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExMIG9uIFdpbmRvd3MpLgorLy8gICBHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QgaXRzZWxmCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkuCisKKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIGZvbGxvd2luZyB1dGlsaXRpZXM6CisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0gKGRlZmluZWQgdG8gMSBpZiBjb21waWxlZCBvbgorLy8gdGhlIGdpdmVuIHBsYXRmb3JtOyBvdGhlcndpc2UgdW5kZWZpbmVkKToKKy8vICAgR1RFU1RfT1NfQUlYICAgICAgLSBJQk0gQUlYCisvLyAgIEdURVNUX09TX0NZR1dJTiAgIC0gQ3lnd2luCisvLyAgIEdURVNUX09TX0hQVVggICAgIC0gSFAtVVgKKy8vICAgR1RFU1RfT1NfTElOVVggICAgLSBMaW51eAorLy8gICAgIEdURVNUX09TX0xJTlVYX0FORFJPSUQgLSBHb29nbGUgQW5kcm9pZAorLy8gICBHVEVTVF9PU19NQUMgICAgICAtIE1hYyBPUyBYCisvLyAgICAgR1RFU1RfT1NfSU9TICAgIC0gaU9TCisvLyAgICAgICBHVEVTVF9PU19JT1NfU0lNVUxBVE9SIC0gaU9TIHNpbXVsYXRvcgorLy8gICBHVEVTVF9PU19OQUNMICAgICAtIEdvb2dsZSBOYXRpdmUgQ2xpZW50IChOYUNsKQorLy8gICBHVEVTVF9PU19PUEVOQlNEICAtIE9wZW5CU0QKKy8vICAgR1RFU1RfT1NfUU5YICAgICAgLSBRTlgKKy8vICAgR1RFU1RfT1NfU09MQVJJUyAgLSBTdW4gU29sYXJpcworLy8gICBHVEVTVF9PU19TWU1CSUFOICAtIFN5bWJpYW4KKy8vICAgR1RFU1RfT1NfV0lORE9XUyAgLSBXaW5kb3dzIChEZXNrdG9wLCBNaW5HVywgb3IgTW9iaWxlKQorLy8gICAgIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAgLSBXaW5kb3dzIERlc2t0b3AKKy8vICAgICBHVEVTVF9PU19XSU5ET1dTX01JTkdXICAgIC0gTWluR1cKKy8vICAgICBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAgIC0gV2luZG93cyBNb2JpbGUKKy8vICAgR1RFU1RfT1NfWk9TICAgICAgLSB6L09TCisvLworLy8gQW1vbmcgdGhlIHBsYXRmb3JtcywgQ3lnd2luLCBMaW51eCwgTWF4IE9TIFgsIGFuZCBXaW5kb3dzIGhhdmUgdGhlCisvLyBtb3N0IHN0YWJsZSBzdXBwb3J0LiAgU2luY2UgY29yZSBtZW1iZXJzIG9mIHRoZSBHb29nbGUgVGVzdCBwcm9qZWN0CisvLyBkb24ndCBoYXZlIGFjY2VzcyB0byBvdGhlciBwbGF0Zm9ybXMsIHN1cHBvcnQgZm9yIHRoZW0gbWF5IGJlIGxlc3MKKy8vIHN0YWJsZS4gIElmIHlvdSBub3RpY2UgYW55IHByb2JsZW1zIG9uIHlvdXIgcGxhdGZvcm0sIHBsZWFzZSBub3RpZnkKKy8vIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSAocGF0Y2hlcyBmb3IgZml4aW5nIHRoZW0gYXJlCisvLyBldmVuIG1vcmUgd2VsY29tZSEpLgorLy8KKy8vIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vbmUgb2YgdGhlIEdURVNUX09TXyogbWFjcm9zIGFyZSBkZWZpbmVkLgorLy8KKy8vIE1hY3JvcyBpbmRpY2F0aW5nIGF2YWlsYWJsZSBHb29nbGUgVGVzdCBmZWF0dXJlcyAoZGVmaW5lZCB0byAxIGlmCisvLyB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIHVuZGVmaW5lZCk6CisvLyAgIEdURVNUX0hBU19DT01CSU5FICAgICAgLSB0aGUgQ29tYmluZSgpIGZ1bmN0aW9uIChmb3IgdmFsdWUtcGFyYW1ldGVyaXplZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMpCisvLyAgIEdURVNUX0hBU19ERUFUSF9URVNUICAgLSBkZWF0aCB0ZXN0cworLy8gICBHVEVTVF9IQVNfUEFSQU1fVEVTVCAgIC0gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gICBHVEVTVF9IQVNfVFlQRURfVEVTVCAgIC0gdHlwZWQgdGVzdHMKKy8vICAgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAtIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gICBHVEVTVF9VU0VTX1BPU0lYX1JFICAgIC0gZW5oYW5jZWQgUE9TSVggcmVnZXggaXMgdXNlZC4gRG8gbm90IGNvbmZ1c2Ugd2l0aAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfSEFTX1BPU0lYX1JFIChzZWUgYWJvdmUpIHdoaWNoIHVzZXJzIGNhbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIHRoZW1zZWx2ZXMuCisvLyAgIEdURVNUX1VTRVNfU0lNUExFX1JFICAgLSBvdXIgb3duIHNpbXBsZSByZWdleCBpcyB1c2VkOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFib3ZlIHR3byBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorLy8gICBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIC0gYWNjZXB0cyB1bnR5cGVkIE5VTEwgaW4gRVhQRUNUX0VRKCkuCisvLworLy8gTWFjcm9zIGZvciBiYXNpYyBDKysgY29kaW5nOgorLy8gICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyAtIGZvciBkaXNhYmxpbmcgYSBnY2Mgd2FybmluZy4KKy8vICAgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gIC0gZGVjbGFyZXMgdGhhdCBhIGNsYXNzJyBpbnN0YW5jZXMgb3IgYQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBkb24ndCBoYXZlIHRvIGJlIHVzZWQuCisvLyAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8gICAtIGRpc2FibGVzIG9wZXJhdG9yPS4KKy8vICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyAtIGRpc2FibGVzIGNvcHkgY3RvciBhbmQgb3BlcmF0b3I9LgorLy8gICBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfICAgLSBkZWNsYXJlcyB0aGF0IGEgZnVuY3Rpb24ncyByZXN1bHQgbXVzdCBiZSB1c2VkLgorLy8KKy8vIFN5bmNocm9uaXphdGlvbjoKKy8vICAgTXV0ZXgsIE11dGV4TG9jaywgVGhyZWFkTG9jYWwsIEdldFRocmVhZENvdW50KCkKKy8vICAgICAgICAgICAgICAgICAgLSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKy8vICAgR1RFU1RfSVNfVEhSRUFEU0FGRSAtIGRlZmluZWQgdG8gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhYm92ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaGF2ZSByZWFsIGltcGxlbWVudGF0aW9ucworLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEdvb2dsZSBUZXN0IGlzIHRocmVhZC1zYWZlOyBvciAwIG90aGVyd2lzZS4KKy8vCisvLyBUZW1wbGF0ZSBtZXRhIHByb2dyYW1taW5nOgorLy8gICBpc19wb2ludGVyICAgICAtIGFzIGluIFRSMTsgbmVlZGVkIG9uIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBvbmx5LgorLy8gICBJdGVyYXRvclRyYWl0cyAtIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjppdGVyYXRvcl90cmFpdHMsIHdoaWNoCisvLyAgICAgICAgICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZSBpbiBsaWJDc3RkIHdoZW4gY29tcGlsZWQgd2l0aCBTdW4gQysrLgorLy8KKy8vIFNtYXJ0IHBvaW50ZXJzOgorLy8gICBzY29wZWRfcHRyICAgICAtIGFzIGluIFRSMi4KKy8vCisvLyBSZWd1bGFyIGV4cHJlc3Npb25zOgorLy8gICBSRSAgICAgICAgICAgICAtIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjbGFzcyB1c2luZyB0aGUgUE9TSVgKKy8vICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4IG9uIFVOSVgtbGlrZQorLy8gICAgICAgICAgICAgICAgICAgIHBsYXRmb3Jtcywgb3IgYSByZWR1Y2VkIHJlZ3VsYXIgZXhjZXB0aW9uIHN5bnRheCBvbgorLy8gICAgICAgICAgICAgICAgICAgIG90aGVyIHBsYXRmb3JtcywgaW5jbHVkaW5nIFdpbmRvd3MuCisvLworLy8gTG9nZ2luZzoKKy8vICAgR1RFU1RfTE9HXygpICAgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuCisvLyAgIExvZ1RvU3RkZXJyKCkgIC0gZGlyZWN0cyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHN0ZGVyci4KKy8vICAgRmx1c2hJbmZvTG9nKCkgLSBmbHVzaGVzIGluZm9ybWF0aW9uYWwgbG9nIG1lc3NhZ2VzLgorLy8KKy8vIFN0ZG91dCBhbmQgc3RkZXJyIGNhcHR1cmluZzoKKy8vICAgQ2FwdHVyZVN0ZG91dCgpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0LgorLy8gICBHZXRDYXB0dXJlZFN0ZG91dCgpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KKy8vICAgQ2FwdHVyZVN0ZGVycigpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgorLy8gICBHZXRDYXB0dXJlZFN0ZGVycigpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KKy8vCisvLyBJbnRlZ2VyIHR5cGVzOgorLy8gICBUeXBlV2l0aFNpemUgICAtIG1hcHMgYW4gaW50ZWdlciB0byBhIGludCB0eXBlLgorLy8gICBJbnQzMiwgVUludDMyLCBJbnQ2NCwgVUludDY0LCBUaW1lSW5NaWxsaXMKKy8vICAgICAgICAgICAgICAgICAgLSBpbnRlZ2VycyBvZiBrbm93biBzaXplcy4KKy8vICAgQmlnZ2VzdEludCAgICAgLSB0aGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlLgorLy8KKy8vIENvbW1hbmQtbGluZSB1dGlsaXRpZXM6CisvLyAgIEdURVNUX0ZMQUcoKSAgICAgICAtIHJlZmVyZW5jZXMgYSBmbGFnLgorLy8gICBHVEVTVF9ERUNMQVJFXyooKSAgLSBkZWNsYXJlcyBhIGZsYWcuCisvLyAgIEdURVNUX0RFRklORV8qKCkgICAtIGRlZmluZXMgYSBmbGFnLgorLy8gICBHZXRJbmplY3RhYmxlQXJndnMoKSAtIHJldHVybnMgdGhlIGNvbW1hbmQgbGluZSBhcyBhIHZlY3RvciBvZiBzdHJpbmdzLgorLy8KKy8vIEVudmlyb25tZW50IHZhcmlhYmxlIHV0aWxpdGllczoKKy8vICAgR2V0RW52KCkgICAgICAgICAgICAgLSBnZXRzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy8vICAgQm9vbEZyb21HVGVzdEVudigpICAgLSBwYXJzZXMgYSBib29sIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBJbnQzMkZyb21HVGVzdEVudigpICAtIHBhcnNlcyBhbiBJbnQzMiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy8vICAgU3RyaW5nRnJvbUdUZXN0RW52KCkgLSBwYXJzZXMgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyNpbmNsdWRlIDxjdHlwZS5oPiAgIC8vIGZvciBpc3NwYWNlLCBldGMKKyNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIGZvciBwdHJkaWZmX3QKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfV0lOMzJfV0NFCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmICAvLyAhX1dJTjMyX1dDRQorCisjaWYgZGVmaW5lZCBfX0FQUExFX18KKyMgaW5jbHVkZSA8QXZhaWxhYmlsaXR5TWFjcm9zLmg+CisjIGluY2x1ZGUgPFRhcmdldENvbmRpdGlvbmFscy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzdHJpbmc+ICAvLyBOT0xJTlQKKworI2RlZmluZSBHVEVTVF9ERVZfRU1BSUxfICJnb29nbGV0ZXN0ZnJhbWV3b3JrQEBnb29nbGVncm91cHMuY29tIgorI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF8gImd0ZXN0XyIKKyNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8gImd0ZXN0LSIKKyNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJHVEVTVF8iCisjZGVmaW5lIEdURVNUX05BTUVfICJHb29nbGUgVGVzdCIKKyNkZWZpbmUgR1RFU1RfUFJPSkVDVF9VUkxfICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8iCisKKy8vIERldGVybWluZXMgdGhlIHZlcnNpb24gb2YgZ2NjIHRoYXQgaXMgdXNlZCB0byBjb21waWxlIHRoaXMuCisjaWZkZWYgX19HTlVDX18KKy8vIDQwMzAyIG1lYW5zIHZlcnNpb24gNC4zLjIuCisjIGRlZmluZSBHVEVTVF9HQ0NfVkVSXyBcCisgICAgKF9fR05VQ19fKjEwMDAwICsgX19HTlVDX01JTk9SX18qMTAwICsgX19HTlVDX1BBVENITEVWRUxfXykKKyNlbmRpZiAgLy8gX19HTlVDX18KKworLy8gRGV0ZXJtaW5lcyB0aGUgcGxhdGZvcm0gb24gd2hpY2ggR29vZ2xlIFRlc3QgaXMgY29tcGlsZWQuCisjaWZkZWYgX19DWUdXSU5fXworIyBkZWZpbmUgR1RFU1RfT1NfQ1lHV0lOIDEKKyNlbGlmIGRlZmluZWQgX19TWU1CSUFOMzJfXworIyBkZWZpbmUgR1RFU1RfT1NfU1lNQklBTiAxCisjZWxpZiBkZWZpbmVkIF9XSU4zMgorIyBkZWZpbmUgR1RFU1RfT1NfV0lORE9XUyAxCisjIGlmZGVmIF9XSU4zMl9XQ0UKKyMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAxCisjIGVsaWYgZGVmaW5lZChfX01JTkdXX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAxCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgMQorIyBlbmRpZiAgLy8gX1dJTjMyX1dDRQorI2VsaWYgZGVmaW5lZCBfX0FQUExFX18KKyMgZGVmaW5lIEdURVNUX09TX01BQyAxCisjIGlmIFRBUkdFVF9PU19JUEhPTkUKKyMgIGRlZmluZSBHVEVTVF9PU19JT1MgMQorIyAgaWYgVEFSR0VUX0lQSE9ORV9TSU1VTEFUT1IKKyMgICBkZWZpbmUgR1RFU1RfT1NfSU9TX1NJTVVMQVRPUiAxCisjICBlbmRpZgorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX2xpbnV4X18KKyMgZGVmaW5lIEdURVNUX09TX0xJTlVYIDEKKyMgaWYgZGVmaW5lZCBfX0FORFJPSURfXworIyAgZGVmaW5lIEdURVNUX09TX0xJTlVYX0FORFJPSUQgMQorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX01WU19fCisjIGRlZmluZSBHVEVTVF9PU19aT1MgMQorI2VsaWYgZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX1NWUjQpCisjIGRlZmluZSBHVEVTVF9PU19TT0xBUklTIDEKKyNlbGlmIGRlZmluZWQoX0FJWCkKKyMgZGVmaW5lIEdURVNUX09TX0FJWCAxCisjZWxpZiBkZWZpbmVkKF9faHB1eCkKKyMgZGVmaW5lIEdURVNUX09TX0hQVVggMQorI2VsaWYgZGVmaW5lZCBfX25hdGl2ZV9jbGllbnRfXworIyBkZWZpbmUgR1RFU1RfT1NfTkFDTCAxCisjZWxpZiBkZWZpbmVkIF9fT3BlbkJTRF9fCisjIGRlZmluZSBHVEVTVF9PU19PUEVOQlNEIDEKKyNlbGlmIGRlZmluZWQgX19RTlhfXworIyBkZWZpbmUgR1RFU1RfT1NfUU5YIDEKKyNlbmRpZiAgLy8gX19DWUdXSU5fXworCisjaWZuZGVmIEdURVNUX0xBTkdfQ1hYMTEKKy8vIGdjYyBhbmQgY2xhbmcgZGVmaW5lIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fIHdoZW4KKy8vIC1zdGQ9e2MsZ251fSsrezB4LDExfSBpcyBwYXNzZWQuICBUaGUgQysrMTEgc3RhbmRhcmQgc3BlY2lmaWVzIGEKKy8vIHZhbHVlIGZvciBfX2NwbHVzcGx1cywgYW5kIHJlY2VudCB2ZXJzaW9ucyBvZiBjbGFuZywgZ2NjLCBhbmQKKy8vIHByb2JhYmx5IG90aGVyIGNvbXBpbGVycyBzZXQgdGhhdCB0b28gaW4gQysrMTEgbW9kZS4KKyMgaWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorLy8gQ29tcGlsaW5nIGluIGF0IGxlYXN0IEMrKzExIG1vZGUuCisjICBkZWZpbmUgR1RFU1RfTEFOR19DWFgxMSAxCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDAKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBCcmluZ3MgaW4gZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXgKKy8vIG5hbWVzcGFjZSAocmVhZCwgd3JpdGUsIGNsb3NlLCBjaGRpciwgaXNhdHR5LCBzdGF0KS4gV2UgZG8gbm90IGN1cnJlbnRseQorLy8gdXNlIHRoZW0gb24gV2luZG93cyBNb2JpbGUuCisjaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIFRoaXMgYXNzdW1lcyB0aGF0IG5vbi1XaW5kb3dzIE9TZXMgcHJvdmlkZSB1bmlzdGQuaC4gRm9yIE9TZXMgd2hlcmUgdGhpcworLy8gaXMgbm90IHRoZSBjYXNlLCB3ZSBuZWVkIHRvIGluY2x1ZGUgaGVhZGVycyB0aGF0IHByb3ZpZGUgdGhlIGZ1bmN0aW9ucworLy8gbWVudGlvbmVkIGFib3ZlLgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VsaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECisvLyBVc2VkIHRvIGRlZmluZSBfX0FORFJPSURfQVBJX18gbWF0Y2hpbmcgdGhlIHRhcmdldCBOREsgQVBJIGxldmVsLgorIyAgaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIERlZmluZXMgdGhpcyB0byB0cnVlIGlmZiBHb29nbGUgVGVzdCBjYW4gdXNlIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCisjaWZuZGVmIEdURVNUX0hBU19QT1NJWF9SRQorIyBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECisvLyBPbiBBbmRyb2lkLCA8cmVnZXguaD4gaXMgb25seSBhdmFpbGFibGUgc3RhcnRpbmcgd2l0aCBHaW5nZXJicmVhZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfUE9TSVhfUkUgKF9fQU5EUk9JRF9BUElfXyA+PSA5KQorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfSEFTX1BPU0lYX1JFICghR1RFU1RfT1NfV0lORE9XUykKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1BPU0lYX1JFCisKKy8vIE9uIHNvbWUgcGxhdGZvcm1zLCA8cmVnZXguaD4gbmVlZHMgc29tZW9uZSB0byBkZWZpbmUgc2l6ZV90LCBhbmQKKy8vIHdvbid0IGNvbXBpbGUgb3RoZXJ3aXNlLiAgV2UgY2FuICNpbmNsdWRlIGl0IGhlcmUgYXMgd2UgYWxyZWFkeQorLy8gaW5jbHVkZWQgPHN0ZGxpYi5oPiwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBkZWZpbmUgc2l6ZV90IHRocm91Z2gKKy8vIDxzdGRkZWYuaD4uCisjIGluY2x1ZGUgPHJlZ2V4Lmg+ICAvLyBOT0xJTlQKKworIyBkZWZpbmUgR1RFU1RfVVNFU19QT1NJWF9SRSAxCisKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKworLy8gPHJlZ2V4Lmg+IGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4gIFVzZSBvdXIgb3duIHNpbXBsZSByZWdleAorLy8gaW1wbGVtZW50YXRpb24gaW5zdGVhZC4KKyMgZGVmaW5lIEdURVNUX1VTRVNfU0lNUExFX1JFIDEKKworI2Vsc2UKKworLy8gPHJlZ2V4Lmg+IG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICBVc2Ugb3VyIG93bgorLy8gc2ltcGxlIHJlZ2V4IGltcGxlbWVudGF0aW9uIGluc3RlYWQuCisjIGRlZmluZSBHVEVTVF9VU0VTX1NJTVBMRV9SRSAxCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BPU0lYX1JFCisKKyNpZm5kZWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisvLyBNU1ZDJ3MgYW5kIEMrK0J1aWxkZXIncyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFNUTCB1c2UgdGhlIF9IQVNfRVhDRVBUSU9OUworLy8gbWFjcm8gdG8gZW5hYmxlIGV4Y2VwdGlvbnMsIHNvIHdlJ2xsIGRvIHRoZSBzYW1lLgorLy8gQXNzdW1lcyB0aGF0IGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyMgIGlmbmRlZiBfSEFTX0VYQ0VQVElPTlMKKyMgICBkZWZpbmUgX0hBU19FWENFUFRJT05TIDEKKyMgIGVuZGlmICAvLyBfSEFTX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyBfSEFTX0VYQ0VQVElPTlMKKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0VYQ0VQVElPTlMKKy8vIGdjYyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKQorLy8gU3VuIFBybyBDQyBzdXBwb3J0cyBleGNlcHRpb25zLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gY29tcGlsZS10aW1lIHdheSBvZgorLy8gZGV0ZWN0aW5nIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBub3QuICBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGF0CisvLyB0aGV5IGFyZSBlbmFibGVkIHVubGVzcyB0aGUgdXNlciB0ZWxscyB1cyBvdGhlcndpc2UuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbGlmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgX19FWENFUFRJT05TCisvLyB4bEMgZGVmaW5lcyBfX0VYQ0VQVElPTlMgdG8gMSBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKKy8vIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBpbiBlZmZlY3QgYnkgZGVmYXVsdCBpbiBIUCBhQ0MgY29tcGlsZXIuIEl0IGhhcyB0bworLy8gYmUgdHVybmVkIG9mIGJ5ICtub2VoIGNvbXBpbGVyIG9wdGlvbiBpZiBkZXNpcmVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxzZQorLy8gRm9yIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIGV4Y2VwdGlvbnMgYXJlIGRpc2FibGVkIHRvIGJlCisvLyBjb25zZXJ2YXRpdmUuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMAorIyBlbmRpZiAgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKyNpZiAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKKy8vIEV2ZW4gdGhvdWdoIHdlIGRvbid0IHVzZSB0aGlzIG1hY3JvIGFueSBsb25nZXIsIHdlIGtlZXAgaXQgaW4gY2FzZQorLy8gc29tZSBjbGllbnRzIHN0aWxsIGRlcGVuZCBvbiBpdC4KKyMgZGVmaW5lIEdURVNUX0hBU19TVERfU1RSSU5HIDEKKyNlbGlmICFHVEVTVF9IQVNfU1REX1NUUklORworLy8gVGhlIHVzZXIgdG9sZCB1cyB0aGF0IDo6c3RkOjpzdHJpbmcgaXNuJ3QgYXZhaWxhYmxlLgorIyBlcnJvciAiR29vZ2xlIFRlc3QgY2Fubm90IGJlIHVzZWQgd2hlcmUgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuIgorI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKKworI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIDAKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisjaWZuZGVmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0ZDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogdXNlcyBhdXRvY29uZiB0byBkZXRlY3Qgd2hldGhlciA6OnN0ZDo6d3N0cmluZworLy8gICBpcyBhdmFpbGFibGUuCisKKy8vIEN5Z3dpbiAxLjcgYW5kIGJlbG93IGRvZXNuJ3Qgc3VwcG9ydCA6OnN0ZDo6d3N0cmluZy4KKy8vIFNvbGFyaXMnIGxpYmMrKyBkb2Vzbid0IHN1cHBvcnQgaXQgZWl0aGVyLiAgQW5kcm9pZCBoYXMKKy8vIG5vIHN1cHBvcnQgZm9yIGl0IGF0IGxlYXN0IGFzIHJlY2VudCBhcyBGcm95byAoMi4yKS4KKyMgZGVmaW5lIEdURVNUX0hBU19TVERfV1NUUklORyBcCisgICAgKCEoR1RFU1RfT1NfTElOVVhfQU5EUk9JRCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUykpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZm5kZWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisjIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgXAorICAgIChHVEVTVF9IQVNfU1REX1dTVFJJTkcgJiYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcpCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgUlRUSSBpcyBhdmFpbGFibGUuCisjaWZuZGVmIEdURVNUX0hBU19SVFRJCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZCwgc28gd2UgbmVlZCB0bworLy8gZmlndXJlIGl0IG91dC4KKworIyBpZmRlZiBfTVNDX1ZFUgorCisjICBpZmRlZiBfQ1BQUlRUSSAgLy8gTVNWQyBkZWZpbmVzIHRoaXMgbWFjcm8gaWZmIFJUVEkgaXMgZW5hYmxlZC4KKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQorIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjICBlbmRpZgorCisvLyBTdGFydGluZyB3aXRoIHZlcnNpb24gNC4zLjIsIGdjYyBkZWZpbmVzIF9fR1hYX1JUVEkgaWZmIFJUVEkgaXMgZW5hYmxlZC4KKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAzMDIpCisKKyMgIGlmZGVmIF9fR1hYX1JUVEkKKy8vIFdoZW4gYnVpbGRpbmcgYWdhaW5zdCBTVExwb3J0IHdpdGggdGhlIEFuZHJvaWQgTkRLIGFuZCB3aXRoCisvLyAtZnJ0dGkgLWZuby1leGNlcHRpb25zLCB0aGUgYnVpbGQgZmFpbHMgYXQgbGluayB0aW1lIHdpdGggdW5kZWZpbmVkCisvLyByZWZlcmVuY2VzIHRvIF9fY3hhX2JhZF90eXBlaWQuIE5vdGUgc3VyZSBpZiBTVEwgb3IgdG9vbGNoYWluIGJ1ZywKKy8vIHNvIGRpc2FibGUgUlRUSSB3aGVuIGRldGVjdGVkLgorIyAgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgZGVmaW5lZChfU1RMUE9SVF9NQUpPUikgJiYgXAorICAgICAgICFkZWZpbmVkKF9fRVhDRVBUSU9OUykKKyMgICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKKyMgICBlbHNlCisjICAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCisjICAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgX19TVExQT1JUX01BSk9SICYmICFfX0VYQ0VQVElPTlMKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgZW5kaWYgIC8vIF9fR1hYX1JUVEkKKworLy8gQ2xhbmcgZGVmaW5lcyBfX0dYWF9SVFRJIHN0YXJ0aW5nIHdpdGggdmVyc2lvbiAzLjAsIGJ1dCBpdHMgbWFudWFsIHJlY29tbWVuZHMKKy8vIHVzaW5nIGhhc19mZWF0dXJlIGluc3RlYWQuIGhhc19mZWF0dXJlKGN4eF9ydHRpKSBpcyBzdXBwb3J0ZWQgc2luY2UgMi43LCB0aGUKKy8vIGZpcnN0IHZlcnNpb24gd2l0aCBDKysgc3VwcG9ydC4KKyMgZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKKworIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIF9faGFzX2ZlYXR1cmUoY3h4X3J0dGkpCisKKy8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA5LjAgSUJNIFZpc3VhbCBBZ2UgZGVmaW5lcyBfX1JUVElfQUxMX18gdG8gMSBpZgorLy8gYm90aCB0aGUgdHlwZWlkIGFuZCBkeW5hbWljX2Nhc3QgZmVhdHVyZXMgYXJlIHByZXNlbnQuCisjIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA+PSA5MDApCisKKyMgIGlmZGVmIF9fUlRUSV9BTExfXworIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCisjICBlbHNlCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKKyMgIGVuZGlmCisKKyMgZWxzZQorCisvLyBGb3IgYWxsIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIFJUVEkgaXMgZW5hYmxlZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCisKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKKworLy8gSXQncyB0aGlzIGhlYWRlcidzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIDx0eXBlaW5mbz4gd2hlbiBSVFRJCisvLyBpcyBlbmFibGVkLgorI2lmIEdURVNUX0hBU19SVFRJCisjIGluY2x1ZGUgPHR5cGVpbmZvPgorI2VuZGlmCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRoZSBwdGhyZWFkcyBsaWJyYXJ5LgorI2lmbmRlZiBHVEVTVF9IQVNfUFRIUkVBRAorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgZXhwbGljaXRseSwgc28gd2UgYXNzdW1lIHB0aHJlYWRzIHN1cHBvcnQgaXMKKy8vIGF2YWlsYWJsZSBvbiBMaW51eCBhbmQgTWFjLgorLy8KKy8vIFRvIGRpc2FibGUgdGhyZWFkaW5nIHN1cHBvcnQgaW4gR29vZ2xlIFRlc3QsIGFkZCAtREdURVNUX0hBU19QVEhSRUFEPTAKKy8vIHRvIHlvdXIgY29tcGlsZXIgZmxhZ3MuCisjIGRlZmluZSBHVEVTVF9IQVNfUFRIUkVBRCAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX0hQVVggXAorICAgIHx8IEdURVNUX09TX1FOWCkKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworI2lmIEdURVNUX0hBU19QVEhSRUFECisvLyBndGVzdC1wb3J0LmggZ3VhcmFudGVlcyB0byAjaW5jbHVkZSA8cHRocmVhZC5oPiB3aGVuIEdURVNUX0hBU19QVEhSRUFEIGlzCisvLyB0cnVlLgorIyBpbmNsdWRlIDxwdGhyZWFkLmg+ICAvLyBOT0xJTlQKKworLy8gRm9yIHRpbWVzcGVjIGFuZCBuYW5vc2xlZXAsIHVzZWQgYmVsb3cuCisjIGluY2x1ZGUgPHRpbWUuaD4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRyMS90dXBsZS4gIFlvdSBjYW4gZGVmaW5lCisvLyB0aGlzIG1hY3JvIHRvIDAgdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIHVzaW5nIHR1cGxlIChhbnkKKy8vIGZlYXR1cmUgZGVwZW5kaW5nIG9uIHR1cGxlIHdpdGggYmUgZGlzYWJsZWQgaW4gdGhpcyBtb2RlKS4KKyNpZm5kZWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorIyBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lEICYmIGRlZmluZWQoX1NUTFBPUlRfTUFKT1IpCisvLyBTVExwb3J0LCBwcm92aWRlZCB3aXRoIHRoZSBBbmRyb2lkIE5ESywgaGFzIG5laXRoZXIgPHRyMS90dXBsZT4gb3IgPHR1cGxlPi4KKyMgIGRlZmluZSBHVEVTVF9IQVNfVFIxX1RVUExFIDAKKyMgZWxzZQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgbm90IHRvIGRvIGl0LCBzbyB3ZSBhc3N1bWUgaXQncyBPSy4KKyMgIGRlZmluZSBHVEVTVF9IQVNfVFIxX1RVUExFIDEKKyMgZW5kaWYKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgR29vZ2xlIFRlc3QncyBvd24gdHIxIHR1cGxlIGltcGxlbWVudGF0aW9uCisvLyBzaG91bGQgYmUgdXNlZC4KKyNpZm5kZWYgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKy8vIFdlIHVzZSBvdXIgb3duIFRSMSB0dXBsZSBpZiB3ZSBhcmVuJ3Qgc3VyZSB0aGUgdXNlciBoYXMgYW4KKy8vIGltcGxlbWVudGF0aW9uIG9mIGl0IGFscmVhZHkuICBBdCB0aGlzIHRpbWUsIGxpYnN0ZGMrKyA0LjAuMCsgYW5kCisvLyBNU1ZDIDIwMTAgYXJlIHRoZSBvbmx5IG1haW5zdHJlYW0gc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgY29tZQorLy8gd2l0aCBhIFRSMSB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gIE5WSURJQSdzIENVREEgTlZDQyBjb21waWxlcgorLy8gcHJldGVuZHMgdG8gYmUgR0NDIGJ5IGRlZmluaW5nIF9fR05VQ19fIGFuZCBmcmllbmRzLCBidXQgY2Fubm90CisvLyBjb21waWxlIEdDQydzIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgTVNWQyAyMDA4ICg5LjApIHByb3ZpZGVzIFRSMQorLy8gdHVwbGUgaW4gYSAzMjMgTUIgRmVhdHVyZSBQYWNrIGRvd25sb2FkLCB3aGljaCB3ZSBjYW5ub3QgYXNzdW1lIHRoZQorLy8gdXNlciBoYXMuICBRTlgncyBRQ0MgY29tcGlsZXIgaXMgYSBtb2RpZmllZCBHQ0MgYnV0IGl0IGRvZXNuJ3QKKy8vIHN1cHBvcnQgVFIxIHR1cGxlLiAgbGliYysrIG9ubHkgcHJvdmlkZXMgc3RkOjp0dXBsZSwgaW4gQysrMTEgbW9kZSwKKy8vIGFuZCBpdCBjYW4gYmUgdXNlZCB3aXRoIHNvbWUgY29tcGlsZXJzIHRoYXQgZGVmaW5lIF9fR05VQ19fLgorIyBpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19DVURBQ0NfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMDAwKSBcCisgICAgICAmJiAhR1RFU1RfT1NfUU5YICYmICFkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikpIHx8IF9NU0NfVkVSID49IDE2MDAKKyMgIGRlZmluZSBHVEVTVF9FTlZfSEFTX1RSMV9UVVBMRV8gMQorIyBlbmRpZgorCisvLyBDKysxMSBzcGVjaWZpZXMgdGhhdCA8dHVwbGU+IHByb3ZpZGVzIHN0ZDo6dHVwbGUuIFVzZSB0aGF0IGlmIGd0ZXN0IGlzIHVzZWQKKy8vIGluIEMrKzExIG1vZGUgYW5kIGxpYnN0ZGMrKyBpc24ndCB2ZXJ5IG9sZCAoYmluYXJpZXMgdGFyZ2V0aW5nIE9TIFggMTAuNgorLy8gY2FuIGJ1aWxkIHdpdGggY2xhbmcgYnV0IG5lZWQgdG8gdXNlIGdjYzQuMidzIGxpYnN0ZGMrKykuCisjIGlmIEdURVNUX0xBTkdfQ1hYMTEgJiYgKCFkZWZpbmVkKF9fR0xJQkNYWF9fKSB8fCBfX0dMSUJDWFhfXyA+IDIwMTEwMzI1KQorIyAgZGVmaW5lIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXyAxCisjIGVuZGlmCisKKyMgaWYgR1RFU1RfRU5WX0hBU19UUjFfVFVQTEVfIHx8IEdURVNUX0VOVl9IQVNfU1REX1RVUExFXworIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDAKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDEKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorCisvLyBUbyBhdm9pZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBldmVyeXdoZXJlLCB3ZSBtYWtlIGl0CisvLyBndGVzdC1wb3J0LmgncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGltcGxlbWVudGluZworLy8gdHIxL3R1cGxlLgorI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKKworIyBpZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGd0ZXN0LXR1cGxlLmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEltcGxlbWVudHMgYSBzdWJzZXQgb2YgVFIxIHR1cGxlIG5lZWRlZCBieSBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2suCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gRm9yIDo6c3RkOjpwYWlyLgorCisvLyBUaGUgY29tcGlsZXIgdXNlZCBpbiBTeW1iaWFuIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHVzIGZyb20gZGVjbGFyaW5nIHRoZQorLy8gdHVwbGUgdGVtcGxhdGUgYXMgYSBmcmllbmQgKGl0IGNvbXBsYWlucyB0aGF0IHR1cGxlIGlzIHJlZGVmaW5lZCkuICBUaGlzCisvLyBoYWNrIGJ5cGFzc2VzIHRoZSBidWcgYnkgZGVjbGFyaW5nIHRoZSBtZW1iZXJzIHRoYXQgc2hvdWxkIG90aGVyd2lzZSBiZQorLy8gcHJpdmF0ZSBhcyBwdWJsaWMuCisvLyBTdW4gU3R1ZGlvIHZlcnNpb25zIDwgMTIgYWxzbyBoYXZlIHRoZSBhYm92ZSBidWcuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCAoZGVmaW5lZChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDU5MCkKKyMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBwdWJsaWM6CisjZWxzZQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIFwKKyAgICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4gZnJpZW5kIGNsYXNzIHR1cGxlOyBcCisgICBwcml2YXRlOgorI2VuZGlmCisKKy8vIEdURVNUX25fVFVQTEVfKFQpIGlzIHRoZSB0eXBlIG9mIGFuIG4tdHVwbGUuCisjZGVmaW5lIEdURVNUXzBfVFVQTEVfKFQpIHR1cGxlPD4KKyNkZWZpbmUgR1RFU1RfMV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzJfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF8zX1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfNF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzVfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF82X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfN19UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzhfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICBUIyM3LCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF85X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgVCMjNywgVCMjOCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfMTBfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICBUIyM3LCBUIyM4LCBUIyM5PgorCisvLyBHVEVTVF9uX1RZUEVOQU1FU18oVCkgZGVjbGFyZXMgYSBsaXN0IG9mIG4gdHlwZW5hbWVzLgorI2RlZmluZSBHVEVTVF8wX1RZUEVOQU1FU18oVCkKKyNkZWZpbmUgR1RFU1RfMV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAKKyNkZWZpbmUgR1RFU1RfMl9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEKKyNkZWZpbmUgR1RFU1RfM19UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIKKyNkZWZpbmUgR1RFU1RfNF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzCisjZGVmaW5lIEdURVNUXzVfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNAorI2RlZmluZSBHVEVTVF82X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUKKyNkZWZpbmUgR1RFU1RfN19UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2CisjZGVmaW5lIEdURVNUXzhfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgdHlwZW5hbWUgVCMjNworI2RlZmluZSBHVEVTVF85X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIFwKKyAgICB0eXBlbmFtZSBUIyM3LCB0eXBlbmFtZSBUIyM4CisjZGVmaW5lIEdURVNUXzEwX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIFwKKyAgICB0eXBlbmFtZSBUIyM3LCB0eXBlbmFtZSBUIyM4LCB0eXBlbmFtZSBUIyM5CisKKy8vIEluIHRoZW9yeSwgZGVmaW5pbmcgc3R1ZmYgaW4gdGhlIDo6c3RkIG5hbWVzcGFjZSBpcyB1bmRlZmluZWQKKy8vIGJlaGF2aW9yLiAgV2UgY2FuIGRvIHRoaXMgYXMgd2UgYXJlIHBsYXlpbmcgdGhlIHJvbGUgb2YgYSBzdGFuZGFyZAorLy8gbGlicmFyeSB2ZW5kb3IuCituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSB0cjEgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDAgPSB2b2lkLCB0eXBlbmFtZSBUMSA9IHZvaWQsIHR5cGVuYW1lIFQyID0gdm9pZCwKKyAgICB0eXBlbmFtZSBUMyA9IHZvaWQsIHR5cGVuYW1lIFQ0ID0gdm9pZCwgdHlwZW5hbWUgVDUgPSB2b2lkLAorICAgIHR5cGVuYW1lIFQ2ID0gdm9pZCwgdHlwZW5hbWUgVDcgPSB2b2lkLCB0eXBlbmFtZSBUOCA9IHZvaWQsCisgICAgdHlwZW5hbWUgVDkgPSB2b2lkPgorY2xhc3MgdHVwbGU7CisKKy8vIEFueXRoaW5nIGluIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCBpcyBHb29nbGUgVGVzdCdzIElOVEVSTkFMCisvLyBJTVBMRU1FTlRBVElPTiBERVRBSUwgYW5kIE1VU1QgTk9UIEJFIFVTRUQgRElSRUNUTFkgaW4gdXNlciBjb2RlLgorbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworLy8gQnlSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBjb25zdCBUJi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ5UmVmIHsgdHlwZWRlZiBjb25zdCBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeVJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBCeVJlZi4KKyNkZWZpbmUgR1RFU1RfQllfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QnlSZWY8VD46OnR5cGUKKworLy8gQWRkUmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgVCYuICBUaGlzCisvLyBpcyB0aGUgc2FtZSBhcyB0cjE6OmFkZF9yZWZlcmVuY2U8VD46OnR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWYgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBBZGRSZWYuCisjZGVmaW5lIEdURVNUX0FERF9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpBZGRSZWY8VD46OnR5cGUKKworLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyBnZXQ8az4oKS4KK3RlbXBsYXRlIDxpbnQgaz4gY2xhc3MgR2V0OworCisvLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIHR1cGxlX2VsZW1lbnQ8aywgVD4uICBrSW5kZXhWYWxpZCBpcyB0cnVlCisvLyBpZmYgayA8IHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlIHR5cGUgVC4KK3RlbXBsYXRlIDxib29sIGtJbmRleFZhbGlkLCBpbnQga0luZGV4LCBjbGFzcyBUdXBsZT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ7CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAwLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDAgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAxLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDEgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAyLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDIgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAzLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDMgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA0LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDQgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA1LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA2LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDYgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA3LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDcgdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA4LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDggdHlwZTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA5LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVDkgdHlwZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8PgorY2xhc3MgdHVwbGU8PiB7CisgcHVibGljOgorICB0dXBsZSgpIHt9CisgIHR1cGxlKGNvbnN0IHR1cGxlJiAvKiB0ICovKSAge30KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgLyogdCAqLykgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF8xX1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwKSA6IGYwXyhmMCkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF8yX1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEpIDogZjBfKGYwKSwKKyAgICAgIGYxXyhmMSkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgorICB0dXBsZShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSA6IGYwXyhwLmZpcnN0KSwgZjFfKHAuc2Vjb25kKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIHsKKyAgICBmMF8gPSBwLmZpcnN0OworICAgIGYxXyA9IHAuc2Vjb25kOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzNfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMikgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzRfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCisgICAgICBmM18oZjMpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzVfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywKKyAgICAgIEdURVNUX0JZX1JFRl8oVDQpIGY0KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNl9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpLAorICAgICAgZjVfKGY1KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzdfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNikgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLAorICAgICAgZjNfKGYzKSwgZjRfKGY0KSwgZjVfKGY1KSwgZjZfKGY2KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfOF9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDcpIGY3KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCisgICAgICBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIGY3XyA9IHQuZjdfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKKyAgVDcgZjdfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzlfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSwgZjhfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LCBHVEVTVF9CWV9SRUZfKFQ3KSBmNywKKyAgICAgIEdURVNUX0JZX1JFRl8oVDgpIGY4KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCisgICAgICBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpLCBmOF8oZjgpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIGY3XyA9IHQuZjdfOworICAgIGY4XyA9IHQuZjhfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKKyAgVDcgZjdfOworICBUOCBmOF87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIHR1cGxlIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSwgZjhfKCksCisgICAgICBmOV8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAorICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgsIEdURVNUX0JZX1JFRl8oVDkpIGY5KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCisgICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpLCBmOF8oZjgpLCBmOV8oZjkpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksIGY5Xyh0LmY5Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pLAorICAgICAgZjlfKHQuZjlfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICBmN18gPSB0LmY3XzsKKyAgICBmOF8gPSB0LmY4XzsKKyAgICBmOV8gPSB0LmY5XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87CisgIFQ3IGY3XzsKKyAgVDggZjhfOworICBUOSBmOV87Cit9OworCisvLyA2LjEuMy4yIFR1cGxlIGNyZWF0aW9uIGZ1bmN0aW9ucy4KKworLy8gS25vd24gbGltaXRhdGlvbnM6IHdlIGRvbid0IHN1cHBvcnQgcGFzc2luZyBhbgorLy8gc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPFQ+IHRvIG1ha2VfdHVwbGUoKS4gIEFuZCB3ZSBkb24ndAorLy8gaW1wbGVtZW50IHRpZSgpLgorCitpbmxpbmUgdHVwbGU8PiBtYWtlX3R1cGxlKCkgeyByZXR1cm4gdHVwbGU8PigpOyB9CisKK3RlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfMV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjApIHsKKyAgcmV0dXJuIEdURVNUXzFfVFVQTEVfKFQpKGYwKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8yX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxKSB7CisgIHJldHVybiBHVEVTVF8yX1RVUExFXyhUKShmMCwgZjEpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzNfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMikgeworICByZXR1cm4gR1RFU1RfM19UVVBMRV8oVCkoZjAsIGYxLCBmMik7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfNF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMykgeworICByZXR1cm4gR1RFU1RfNF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzVfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCkgeworICByZXR1cm4gR1RFU1RfNV9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF82X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSkgeworICByZXR1cm4gR1RFU1RfNl9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfN19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNikgeworICByZXR1cm4gR1RFU1RfN19UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzhfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNykgeworICByZXR1cm4gR1RFU1RfOF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF85X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcsCisgICAgY29uc3QgVDgmIGY4KSB7CisgIHJldHVybiBHVEVTVF85X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfMTBfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKKyAgICBjb25zdCBUOCYgZjgsIGNvbnN0IFQ5JiBmOSkgeworICByZXR1cm4gR1RFU1RfMTBfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgsIGY5KTsKK30KKworLy8gNi4xLjMuMyBUdXBsZSBoZWxwZXIgY2xhc3Nlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBzdHJ1Y3QgdHVwbGVfc2l6ZTsKKwordGVtcGxhdGUgPEdURVNUXzBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzBfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xX1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDE7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMl9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAyOworfTsKKwordGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzNfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF80X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDQ7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNV9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA1OworfTsKKwordGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzZfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNjsKK307CisKK3RlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF83X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDc7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOF9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA4OworfTsKKwordGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzlfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gOTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTA7Cit9OworCit0ZW1wbGF0ZSA8aW50IGssIGNsYXNzIFR1cGxlPgorc3RydWN0IHR1cGxlX2VsZW1lbnQgeworICB0eXBlZGVmIHR5cGVuYW1lIGd0ZXN0X2ludGVybmFsOjpUdXBsZUVsZW1lbnQ8CisgICAgICBrIDwgKHR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSksIGssIFR1cGxlPjo6dHlwZSB0eXBlOworfTsKKworI2RlZmluZSBHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBUdXBsZSkgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxrLCBUdXBsZSA+Ojp0eXBlCisKKy8vIDYuMS4zLjQgRWxlbWVudCBhY2Nlc3MuCisKK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8MD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMCwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMF87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMCwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwxPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygxLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYxXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygxLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDI+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDIsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjJfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDIsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Mz4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMywgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mM187IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMywgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw0PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg0LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY0XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg0LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDU+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDUsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjVfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDUsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Nj4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNiwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNl87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNiwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw3PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg3LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY3XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg3LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDg+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDgsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjhfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDgsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8OT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDxpbnQgaywgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK0dURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssIEdURVNUXzEwX1RVUExFXyhUKSkpCitnZXQoR1RFU1RfMTBfVFVQTEVfKFQpJiB0KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpGaWVsZCh0KTsKK30KKwordGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCAgR1RFU1RfMTBfVFVQTEVfKFQpKSkKK2dldChjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkNvbnN0RmllbGQodCk7Cit9CisKKy8vIDYuMS4zLjUgUmVsYXRpb25hbCBvcGVyYXRvcnMKKworLy8gV2Ugb25seSBpbXBsZW1lbnQgPT0gYW5kICE9LCBhcyB3ZSBkb24ndCBoYXZlIGEgbmVlZCBmb3IgdGhlIHJlc3QgeWV0LgorCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCisvLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPjo6RXEodDEsIHQyKSByZXR1cm5zIHRydWUgaWYgdGhlCisvLyBmaXJzdCBrIGZpZWxkcyBvZiB0MSBlcXVhbHMgdGhlIGZpcnN0IGsgZmllbGRzIG9mIHQyLgorLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3IoazEsIGsyKSB3b3VsZCBiZSBhIGNvbXBpbGVyIGVycm9yIGlmCisvLyBrMSAhPSBrMi4KK3RlbXBsYXRlIDxpbnQga1NpemUxLCBpbnQga1NpemUyPgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPDAsIDA+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgorICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIC8qIHQxICovLCBjb25zdCBUdXBsZTImIC8qIHQyICovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDxpbnQgaz4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KKyAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiB0MSwgY29uc3QgVHVwbGUyJiB0MikgeworICAgIHJldHVybiBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrIC0gMSwgayAtIDE+OjpFcSh0MSwgdDIpICYmCisgICAgICAgIDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDEpID09IDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDIpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6U2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8CisgICAgICB0dXBsZV9zaXplPEdURVNUXzEwX1RVUExFXyhUKSA+Ojp2YWx1ZSwKKyAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFUpID46OnZhbHVlPjo6RXEodCwgdSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdSkgeyByZXR1cm4gISh0ID09IHUpOyB9CisKKy8vIDYuMS40IFBhaXJzLgorLy8gVW5pbXBsZW1lbnRlZC4KKworfSAgLy8gbmFtZXNwYWNlIHRyMQorfSAgLy8gbmFtZXNwYWNlIHN0ZAorCisjdW5kZWYgR1RFU1RfMF9UVVBMRV8KKyN1bmRlZiBHVEVTVF8xX1RVUExFXworI3VuZGVmIEdURVNUXzJfVFVQTEVfCisjdW5kZWYgR1RFU1RfM19UVVBMRV8KKyN1bmRlZiBHVEVTVF80X1RVUExFXworI3VuZGVmIEdURVNUXzVfVFVQTEVfCisjdW5kZWYgR1RFU1RfNl9UVVBMRV8KKyN1bmRlZiBHVEVTVF83X1RVUExFXworI3VuZGVmIEdURVNUXzhfVFVQTEVfCisjdW5kZWYgR1RFU1RfOV9UVVBMRV8KKyN1bmRlZiBHVEVTVF8xMF9UVVBMRV8KKworI3VuZGVmIEdURVNUXzBfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzFfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzJfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzNfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzRfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzVfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzZfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzdfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzhfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzlfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzEwX1RZUEVOQU1FU18KKworI3VuZGVmIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworI3VuZGVmIEdURVNUX0JZX1JFRl8KKyN1bmRlZiBHVEVTVF9BRERfUkVGXworI3VuZGVmIEdURVNUX1RVUExFX0VMRU1FTlRfCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXworIyBlbGlmIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXworIyAgaW5jbHVkZSA8dHVwbGU+CisvLyBDKysxMSBwdXRzIGl0cyB0dXBsZSBpbnRvIHRoZSA6OnN0ZCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4KKy8vIDo6c3RkOjp0cjEuICBndGVzdCBleHBlY3RzIHR1cGxlIHRvIGxpdmUgaW4gOjpzdGQ6OnRyMSwgc28gcHV0IGl0IHRoZXJlLgorLy8gVGhpcyBjYXVzZXMgdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgc3VwcG9ydGVkIGNvbXBpbGVycyByZWFjdCBpbgorLy8gdGhlIHdheSB3ZSBpbnRlbmQuCituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSB0cjEgewordXNpbmcgOjpzdGQ6OmdldDsKK3VzaW5nIDo6c3RkOjptYWtlX3R1cGxlOwordXNpbmcgOjpzdGQ6OnR1cGxlOwordXNpbmcgOjpzdGQ6OnR1cGxlX2VsZW1lbnQ7Cit1c2luZyA6OnN0ZDo6dHVwbGVfc2l6ZTsKK30KK30KKworIyBlbGlmIEdURVNUX09TX1NZTUJJQU4KKworLy8gT24gU3ltYmlhbiwgQk9PU1RfSEFTX1RSMV9UVVBMRSBjYXVzZXMgQm9vc3QncyBUUjEgdHVwbGUgbGlicmFyeSB0bworLy8gdXNlIFNUTHBvcnQncyB0dXBsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBkb2Vzbid0CisvLyB3b3JrIGFzIHRoZSBjb3B5IG9mIFNUTHBvcnQgZGlzdHJpYnV0ZWQgd2l0aCBTeW1iaWFuIGlzIGluY29tcGxldGUuCisvLyBCeSBtYWtpbmcgc3VyZSBCT09TVF9IQVNfVFIxX1RVUExFIGlzIHVuZGVmaW5lZCwgd2UgZm9yY2UgQm9vc3QgdG8KKy8vIHVzZSBpdHMgb3duIHR1cGxlIGltcGxlbWVudGF0aW9uLgorIyAgaWZkZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQorIyAgIHVuZGVmIEJPT1NUX0hBU19UUjFfVFVQTEUKKyMgIGVuZGlmICAvLyBCT09TVF9IQVNfVFIxX1RVUExFCisKKy8vIFRoaXMgcHJldmVudHMgPGJvb3N0L3RyMS9kZXRhaWwvY29uZmlnLmhwcD4sIHdoaWNoIGRlZmluZXMKKy8vIEJPT1NUX0hBU19UUjFfVFVQTEUsIGZyb20gYmVpbmcgI2luY2x1ZGVkIGJ5IEJvb3N0J3MgPHR1cGxlPi4KKyMgIGRlZmluZSBCT09TVF9UUjFfREVUQUlMX0NPTkZJR19IUFBfSU5DTFVERUQKKyMgIGluY2x1ZGUgPHR1cGxlPgorCisjIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMDAwKQorLy8gR0NDIDQuMCsgaW1wbGVtZW50cyB0cjEvdHVwbGUgaW4gdGhlIDx0cjEvdHVwbGU+IGhlYWRlci4gIFRoaXMgZG9lcworLy8gbm90IGNvbmZvcm0gdG8gdGhlIFRSMSBzcGVjLCB3aGljaCByZXF1aXJlcyB0aGUgaGVhZGVyIHRvIGJlIDx0dXBsZT4uCisKKyMgIGlmICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCisvLyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBnY2MgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIDx0cjEvZnVuY3Rpb25hbD4sCisvLyB3aGljaCBpcyAjaW5jbHVkZWQgYnkgPHRyMS90dXBsZT4sIHRvIG5vdCBjb21waWxlIHdoZW4gUlRUSSBpcworLy8gZGlzYWJsZWQuICBfVFIxX0ZVTkNUSU9OQUwgaXMgdGhlIGhlYWRlciBndWFyZCBmb3IKKy8vIDx0cjEvZnVuY3Rpb25hbD4uICBIZW5jZSB0aGUgZm9sbG93aW5nICNkZWZpbmUgaXMgYSBoYWNrIHRvIHByZXZlbnQKKy8vIDx0cjEvZnVuY3Rpb25hbD4gZnJvbSBiZWluZyBpbmNsdWRlZC4KKyMgICBkZWZpbmUgX1RSMV9GVU5DVElPTkFMIDEKKyMgICBpbmNsdWRlIDx0cjEvdHVwbGU+CisjICAgdW5kZWYgX1RSMV9GVU5DVElPTkFMICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gI2luY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDx0cjEvZnVuY3Rpb25hbD4gaWYgaGUgY2hvb3NlcyB0by4KKyMgIGVsc2UKKyMgICBpbmNsdWRlIDx0cjEvdHVwbGU+ICAvLyBOT0xJTlQKKyMgIGVuZGlmICAvLyAhR1RFU1RfSEFTX1JUVEkgJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDMwMgorCisjIGVsc2UKKy8vIElmIHRoZSBjb21waWxlciBpcyBub3QgR0NDIDQuMCssIHdlIGFzc3VtZSB0aGUgdXNlciBpcyB1c2luZyBhCisvLyBzcGVjLWNvbmZvcm1pbmcgVFIxIGltcGxlbWVudGF0aW9uLgorIyAgaW5jbHVkZSA8dHVwbGU+ICAvLyBOT0xJTlQKKyMgZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgY2xvbmUoMikgaXMgc3VwcG9ydGVkLgorLy8gVXN1YWxseSBpdCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIG9uIExpbnV4LCBleGNsdWRpbmcKKy8vIExpbnV4IG9uIHRoZSBJdGFuaXVtIGFyY2hpdGVjdHVyZS4KKy8vIEFsc28gc2VlIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi8yL2Nsb25lLgorI2lmbmRlZiBHVEVTVF9IQVNfQ0xPTkUKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgaWYgR1RFU1RfT1NfTElOVVggJiYgIWRlZmluZWQoX19pYTY0X18pCisjICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECisvLyBPbiBBbmRyb2lkLCBjbG9uZSgpIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEFSTSBzdGFydGluZyB3aXRoIEdpbmdlcmJyZWFkLgorIyAgICBpZiBkZWZpbmVkKF9fYXJtX18pICYmIF9fQU5EUk9JRF9BUElfXyA+PSA5CisjICAgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDEKKyMgICAgZWxzZQorIyAgICAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAwCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAxCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDAKKyMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYICYmICFkZWZpbmVkKF9faWE2NF9fKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19DTE9ORQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCBzdHJlYW0gcmVkaXJlY3Rpb24uIFRoaXMgaXMgdXNlZCB0byB0ZXN0CisvLyBvdXRwdXQgY29ycmVjdG5lc3MgYW5kIHRvIGltcGxlbWVudCBkZWF0aCB0ZXN0cy4KKyNpZm5kZWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorLy8gQnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgc3RyZWFtIHJlZGlyZWN0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbGwKKy8vIHBsYXRmb3JtcyBleGNlcHQga25vd24gbW9iaWxlIG9uZXMuCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDAKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04gMQorIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19TWU1CSUFOCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgZGVhdGggdGVzdHMuCisvLyBHb29nbGUgVGVzdCBkb2VzIG5vdCBzdXBwb3J0IGRlYXRoIHRlc3RzIGZvciBWQyA3LjEgYW5kIGVhcmxpZXIgYXMKKy8vIGFib3J0KCkgaW4gYSBWQyA3LjEgYXBwbGljYXRpb24gY29tcGlsZWQgYXMgR1VJIGluIGRlYnVnIGNvbmZpZworLy8gcG9wcyB1cCBhIGRpYWxvZyB3aW5kb3cgdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBwcm9ncmFtbWF0aWNhbGx5LgorI2lmIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUyB8fCBcCisgICAgIChHVEVTVF9PU19NQUMgJiYgIUdURVNUX09TX0lPUykgfHwgR1RFU1RfT1NfSU9TX1NJTVVMQVRPUiB8fCBcCisgICAgIChHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgJiYgX01TQ19WRVIgPj0gMTQwMCkgfHwgXAorICAgICBHVEVTVF9PU19XSU5ET1dTX01JTkdXIHx8IEdURVNUX09TX0FJWCB8fCBHVEVTVF9PU19IUFVYIHx8IFwKKyAgICAgR1RFU1RfT1NfT1BFTkJTRCB8fCBHVEVTVF9PU19RTlgpCisjIGRlZmluZSBHVEVTVF9IQVNfREVBVEhfVEVTVCAxCisjIGluY2x1ZGUgPHZlY3Rvcj4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIFdlIGRvbid0IHN1cHBvcnQgTVNWQyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkIG5vdy4gIFRoZXJlZm9yZQorLy8gYWxsIHRoZSBjb21waWxlcnMgd2UgY2FyZSBhYm91dCBhcmUgYWRlcXVhdGUgZm9yIHN1cHBvcnRpbmcKKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisjZGVmaW5lIEdURVNUX0hBU19QQVJBTV9URVNUIDEKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgdHlwZS1kcml2ZW4gdGVzdHMuCisKKy8vIFR5cGVkIHRlc3RzIG5lZWQgPHR5cGVpbmZvPiBhbmQgdmFyaWFkaWMgbWFjcm9zLCB3aGljaCBHQ0MsIFZDKysgOC4wLAorLy8gU3VuIFBybyBDQywgSUJNIFZpc3VhbCBBZ2UsIGFuZCBIUCBhQ0Mgc3VwcG9ydC4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoX01TQ19WRVIgPj0gMTQwMCkgfHwgZGVmaW5lZChfX1NVTlBST19DQykgfHwgXAorICAgIGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX0hQX2FDQykKKyMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUIDEKKyMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUX1AgMQorI2VuZGlmCisKKy8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IENvbWJpbmUoKS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4KKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gZG9lc24ndAorLy8gd29yayBvbiBTdW4gU3R1ZGlvIHNpbmNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0ZW1wbGF0ZWQgY29udmVyc2lvbgorLy8gb3BlcmF0b3JzLgorI2lmIEdURVNUX0hBU19QQVJBTV9URVNUICYmIEdURVNUX0hBU19UUjFfVFVQTEUgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCisjIGRlZmluZSBHVEVTVF9IQVNfQ09NQklORSAxCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzeXN0ZW0gY29tcGlsZXIgdXNlcyBVVEYtMTYgZm9yIGVuY29kaW5nIHdpZGUgc3RyaW5ncy4KKyNkZWZpbmUgR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8gXAorICAgIChHVEVTVF9PU19XSU5ET1dTIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX0FJWCkKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRlc3QgcmVzdWx0cyBjYW4gYmUgc3RyZWFtZWQgdG8gYSBzb2NrZXQuCisjaWYgR1RFU1RfT1NfTElOVVgKKyMgZGVmaW5lIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18gMQorI2VuZGlmCisKKy8vIERlZmluZXMgc29tZSB1dGlsaXR5IG1hY3Jvcy4KKworLy8gVGhlIEdOVSBjb21waWxlciBlbWl0cyBhIHdhcm5pbmcgaWYgbmVzdGVkICJpZiIgc3RhdGVtZW50cyBhcmUgZm9sbG93ZWQgYnkKKy8vIGFuICJlbHNlIiBzdGF0ZW1lbnQgYW5kIGJyYWNlcyBhcmUgbm90IHVzZWQgdG8gZXhwbGljaXRseSBkaXNhbWJpZ3VhdGUgdGhlCisvLyAiZWxzZSIgYmluZGluZy4gIFRoaXMgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBjb2RlIGxpa2U6CisvLworLy8gICBpZiAoZ2F0ZSkKKy8vICAgICBBU1NFUlRfKihjb25kaXRpb24pIDw8ICJTb21lIG1lc3NhZ2UiOworLy8KKy8vIFRoZSAic3dpdGNoICgwKSBjYXNlIDA6IiBpZGlvbSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoaXMuCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorIyBkZWZpbmUgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8KKyNlbHNlCisjIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBzd2l0Y2ggKDApIGNhc2UgMDogZGVmYXVsdDogIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIFVzZSB0aGlzIGFubm90YXRpb24gYXQgdGhlIGVuZCBvZiBhIHN0cnVjdC9jbGFzcyBkZWZpbml0aW9uIHRvCisvLyBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcgYXdheSBpbnN0YW5jZXMgdGhhdCBhcmUgbmV2ZXIKKy8vIHVzZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFsbCBpbnRlcmVzdGluZyBsb2dpYyBoYXBwZW5zIGluc2lkZSB0aGUKKy8vIGMndG9yIGFuZCAvIG9yIGQndG9yLiAgRXhhbXBsZToKKy8vCisvLyAgIHN0cnVjdCBGb28geworLy8gICAgIEZvbygpIHsgLi4uIH0KKy8vICAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKy8vCisvLyBBbHNvIHVzZSBpdCBhZnRlciBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlciBkZWNsYXJhdGlvbiB0byB0ZWxsIHRoZQorLy8gY29tcGlsZXIgdGhlIHZhcmlhYmxlL3BhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQuCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ09NUElMRVJfSUNDKQorIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8KKyNlbmRpZgorCisvLyBBIG1hY3JvIHRvIGRpc2FsbG93IG9wZXJhdG9yPQorLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLgorI2RlZmluZSBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpXAorICB2b2lkIG9wZXJhdG9yPSh0eXBlIGNvbnN0ICYpCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CisvLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCisjZGVmaW5lIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8odHlwZSlcCisgIHR5cGUodHlwZSBjb25zdCAmKTtcCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSkKKworLy8gVGVsbCB0aGUgY29tcGlsZXIgdG8gd2FybiBhYm91dCB1bnVzZWQgcmV0dXJuIHZhbHVlcyBmb3IgZnVuY3Rpb25zIGRlY2xhcmVkCisvLyB3aXRoIHRoaXMgbWFjcm8uICBUaGUgbWFjcm8gc2hvdWxkIGJlIHVzZWQgb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zCisvLyBmb2xsb3dpbmcgdGhlIGFyZ3VtZW50IGxpc3Q6CisvLworLy8gICBTcHJvY2tldCogQWxsb2NhdGVTcHJvY2tldCgpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCisjIGRlZmluZSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8KKyNlbmRpZiAgLy8gX19HTlVDX18gJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhQ09NUElMRVJfSUNDCisKKy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyBNaWNyb3NvZnQncyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbgorLy8gSGFuZGxpbmcuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBzZXZlcmFsIFdpbmRvd3MgY29tcGlsZXJzIGJ1dCBnZW5lcmFsbHkKKy8vIGRvZXMgbm90IGV4aXN0IG9uIGFueSBvdGhlciBzeXN0ZW0uCisjaWZuZGVmIEdURVNUX0hBU19TRUgKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisvLyBUaGVzZSB0d28gY29tcGlsZXJzIGFyZSBrbm93biB0byBzdXBwb3J0IFNFSC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDEKKyMgZWxzZQorLy8gQXNzdW1lIG5vIFNFSC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDAKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyNpZmRlZiBfTVNDX1ZFUgorCisjIGlmIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorIyAgZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjIGVsaWYgR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZCisjICBkZWZpbmUgR1RFU1RfQVBJXyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgZW5kaWYKKworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIEdURVNUX0FQSV8KKyMgZGVmaW5lIEdURVNUX0FQSV8KKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKy8vIEFzayB0aGUgY29tcGlsZXIgdG8gbmV2ZXIgaW5saW5lIGEgZ2l2ZW4gZnVuY3Rpb24uCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfCisjZW5kaWYKKworLy8gX0xJQkNQUF9WRVJTSU9OIGlzIGRlZmluZWQgYnkgdGhlIGxpYmMrKyBsaWJyYXJ5IGZyb20gdGhlIExMVk0gcHJvamVjdC4KKyNpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKSB8fCBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikKKyMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMAorI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBzZWNyZXQgdHlwZSB0aGF0IEdvb2dsZSBUZXN0IHVzZXJzIGRvbid0IGtub3cgYWJvdXQuICBJdCBoYXMgbm8KKy8vIGRlZmluaXRpb24gb24gcHVycG9zZS4gIFRoZXJlZm9yZSBpdCdzIGltcG9zc2libGUgdG8gY3JlYXRlIGEKKy8vIFNlY3JldCBvYmplY3QsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4KK2NsYXNzIFNlY3JldDsKKworLy8gVGhlIEdURVNUX0NPTVBJTEVfQVNTRVJUXyBtYWNybyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNvbXBpbGUgdGltZQorLy8gZXhwcmVzc2lvbiBpcyB0cnVlLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSBpdCB0byB2ZXJpZnkgdGhlCisvLyBzaXplIG9mIGEgc3RhdGljIGFycmF5OgorLy8KKy8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKEFSUkFZU0laRShjb250ZW50X3R5cGVfbmFtZXMpID09IENPTlRFTlRfTlVNX1RZUEVTLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlX25hbWVzX2luY29ycmVjdF9zaXplKTsKKy8vCisvLyBvciB0byBtYWtlIHN1cmUgYSBzdHJ1Y3QgaXMgc21hbGxlciB0aGFuIGEgY2VydGFpbiBzaXplOgorLy8KKy8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsKKy8vCisvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBtYWNybyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIElmCisvLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3IKKy8vIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgorCit0ZW1wbGF0ZSA8Ym9vbD4KK3N0cnVjdCBDb21waWxlQXNzZXJ0IHsKK307CisKKyNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgXAorICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnQ8KHN0YXRpY19jYXN0PGJvb2w+KGV4cHIpKT4gXAorICAgICAgbXNnW3N0YXRpY19jYXN0PGJvb2w+KGV4cHIpID8gMSA6IC0xXSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXworCisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIEdURVNUX0NPTVBJTEVfQVNTRVJUXzoKKy8vCisvLyAtIEdURVNUX0NPTVBJTEVfQVNTRVJUXyB3b3JrcyBieSBkZWZpbmluZyBhbiBhcnJheSB0eXBlIHRoYXQgaGFzIC0xCisvLyAgIGVsZW1lbnRzIChhbmQgdGh1cyBpcyBpbnZhbGlkKSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLgorLy8KKy8vIC0gVGhlIHNpbXBsZXIgZGVmaW5pdGlvbgorLy8KKy8vICAgICNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdCisvLworLy8gICBkb2VzIG5vdCB3b3JrLCBhcyBnY2Mgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyB3aG9zZSBzaXplcworLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0CisvLyAgIG9mIHRoZSBDKysgc3RhbmRhcmQpLiAgQXMgYSByZXN1bHQsIGdjYyBmYWlscyB0byByZWplY3QgdGhlCisvLyAgIGZvbGxvd2luZyBjb2RlIHdpdGggdGhlIHNpbXBsZSBkZWZpbml0aW9uOgorLy8KKy8vICAgICBpbnQgZm9vOworLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhmb28sIG1zZyk7IC8vIG5vdCBzdXBwb3NlZCB0byBjb21waWxlIGFzIGZvbyBpcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KKy8vCisvLyAtIEJ5IHVzaW5nIHRoZSB0eXBlIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiwgd2UgZW5zdXJlcyB0aGF0CisvLyAgIGV4cHIgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuICAoVGVtcGxhdGUgYXJndW1lbnRzIG11c3QgYmUKKy8vICAgZGV0ZXJtaW5lZCBhdCBjb21waWxlLXRpbWUuKQorLy8KKy8vIC0gVGhlIG91dHRlciBwYXJlbnRoZXNlcyBpbiBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gYXJlIG5lY2Vzc2FyeQorLy8gICB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMy40LjQgYW5kIDQuMC4xLiAgSWYgd2UgaGFkIHdyaXR0ZW4KKy8vCisvLyAgICAgQ29tcGlsZUFzc2VydDxib29sKGV4cHIpPgorLy8KKy8vICAgaW5zdGVhZCwgdGhlc2UgY29tcGlsZXJzIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUKKy8vCisvLyAgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKDUgPiAwLCBzb21lX21lc3NhZ2UpOworLy8KKy8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUKKy8vICAgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4pCisvLworLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5CisvLworLy8gICAgICgoZXhwcikgPyAxIDogLTEpLgorLy8KKy8vICAgVGhpcyBpcyB0byBhdm9pZCBydW5uaW5nIGludG8gYSBidWcgaW4gTVMgVkMgNy4xLCB3aGljaAorLy8gICBjYXVzZXMgKCgwLjApID8gMSA6IC0xKSB0byBpbmNvcnJlY3RseSBldmFsdWF0ZSB0byAxLgorCisvLyBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXIgaXMgdXNlZCBieSBTdGF0aWNBc3NlcnRUeXBlRXEgZGVmaW5lZCBpbiBndGVzdC5oLgorLy8KKy8vIFRoaXMgdGVtcGxhdGUgaXMgZGVjbGFyZWQsIGJ1dCBpbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VCwgVD4ge307CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwordHlwZWRlZiA6OnN0cmluZyBzdHJpbmc7CisjZWxzZQordHlwZWRlZiA6OnN0ZDo6c3RyaW5nIHN0cmluZzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwordHlwZWRlZiA6OndzdHJpbmcgd3N0cmluZzsKKyNlbGlmIEdURVNUX0hBU19TVERfV1NUUklORwordHlwZWRlZiA6OnN0ZDo6d3N0cmluZyB3c3RyaW5nOworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gQSBoZWxwZXIgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIGNvbnN0YW50IGNvbmRpdGlvbi4gIEl0IGp1c3QKKy8vIHJldHVybnMgJ2NvbmRpdGlvbicuCitHVEVTVF9BUElfIGJvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKTsKKworLy8gRGVmaW5lcyBzY29wZWRfcHRyLgorCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHNjb3BlZF9wdHIgaXMgUEFSVElBTCAtIGl0IG9ubHkgY29udGFpbnMKKy8vIGVub3VnaCBzdHVmZiB0byBzYXRpc2Z5IEdvb2dsZSBUZXN0J3MgbmVlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3Mgc2NvcGVkX3B0ciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworCisgIGV4cGxpY2l0IHNjb3BlZF9wdHIoVCogcCA9IE5VTEwpIDogcHRyXyhwKSB7fQorICB+c2NvcGVkX3B0cigpIHsgcmVzZXQoKTsgfQorCisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpwdHJfOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKworICBUKiByZWxlYXNlKCkgeworICAgIFQqIGNvbnN0IHB0ciA9IHB0cl87CisgICAgcHRyXyA9IE5VTEw7CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIHZvaWQgcmVzZXQoVCogcCA9IE5VTEwpIHsKKyAgICBpZiAocCAhPSBwdHJfKSB7CisgICAgICBpZiAoSXNUcnVlKHNpemVvZihUKSA+IDApKSB7ICAvLyBNYWtlcyBzdXJlIFQgaXMgYSBjb21wbGV0ZSB0eXBlLgorICAgICAgICBkZWxldGUgcHRyXzsKKyAgICAgIH0KKyAgICAgIHB0cl8gPSBwOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgVCogcHRyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKHNjb3BlZF9wdHIpOworfTsKKworLy8gRGVmaW5lcyBSRS4KKworLy8gQSBzaW1wbGUgQysrIHdyYXBwZXIgZm9yIDxyZWdleC5oPi4gIEl0IHVzZXMgdGhlIFBPU0lYIEV4dGVuZGVkCisvLyBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4LgorY2xhc3MgR1RFU1RfQVBJXyBSRSB7CisgcHVibGljOgorICAvLyBBIGNvcHkgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgYnkgdGhlIFN0YW5kYXJkIHRvIGluaXRpYWxpemUgb2JqZWN0CisgIC8vIHJlZmVyZW5jZXMgZnJvbSByLXZhbHVlcy4KKyAgUkUoY29uc3QgUkUmIG90aGVyKSB7IEluaXQob3RoZXIucGF0dGVybigpKTsgfQorCisgIC8vIENvbnN0cnVjdHMgYW4gUkUgZnJvbSBhIHN0cmluZy4KKyAgUkUoY29uc3QgOjpzdGQ6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IGNoYXIqIHJlZ2V4KSB7IEluaXQocmVnZXgpOyB9ICAvLyBOT0xJTlQKKyAgflJFKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleC4KKyAgY29uc3QgY2hhciogcGF0dGVybigpIGNvbnN0IHsgcmV0dXJuIHBhdHRlcm5fOyB9CisKKyAgLy8gRnVsbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMKKyAgLy8gdGhlIGVudGlyZSBzdHIuCisgIC8vIFBhcnRpYWxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZQorICAvLyBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0ciAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorICAvLworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogbWFrZSBGdWxsTWF0Y2goKSBhbmQgUGFydGlhbE1hdGNoKCkgd29yaworICAvLyB3aGVuIHN0ciBjb250YWlucyBOVUwgY2hhcmFjdGVycy4KKyAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgeworICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisKKyBwcml2YXRlOgorICB2b2lkIEluaXQoY29uc3QgY2hhciogcmVnZXgpOworCisgIC8vIFdlIHVzZSBhIGNvbnN0IGNoYXIqIGluc3RlYWQgb2YgYW4gc3RkOjpzdHJpbmcsIGFzIEdvb2dsZSBUZXN0IHVzZWQgdG8gYmUKKyAgLy8gdXNlZCB3aGVyZSBzdGQ6OnN0cmluZyBpcyBub3QgYXZhaWxhYmxlLiAgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGNoYW5nZSB0bworICAvLyBzdGQ6OnN0cmluZy4KKyAgY29uc3QgY2hhciogcGF0dGVybl87CisgIGJvb2wgaXNfdmFsaWRfOworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisgIHJlZ2V4X3QgZnVsbF9yZWdleF87ICAgICAvLyBGb3IgRnVsbE1hdGNoKCkuCisgIHJlZ2V4X3QgcGFydGlhbF9yZWdleF87ICAvLyBGb3IgUGFydGlhbE1hdGNoKCkuCisKKyNlbHNlICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisgIGNvbnN0IGNoYXIqIGZ1bGxfcGF0dGVybl87ICAvLyBGb3IgRnVsbE1hdGNoKCk7CisKKyNlbmRpZgorCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUkUpOworfTsKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisvLyBGb3JtYXRzIGEgZmlsZSBsb2NhdGlvbiBmb3IgY29tcGlsZXItaW5kZXBlbmRlbnQgWE1MIG91dHB1dC4KKy8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCwgd2UgcHV0IGl0IG5leHQgdG8KKy8vIEZvcm1hdEZpbGVMb2NhdGlvbiBpbiBvcmRlciB0byBjb250cmFzdCB0aGUgdHdvIGZ1bmN0aW9ucy4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7CisKKy8vIERlZmluZXMgbG9nZ2luZyB1dGlsaXRpZXM6CisvLyAgIEdURVNUX0xPR18oc2V2ZXJpdHkpIC0gbG9ncyBtZXNzYWdlcyBhdCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5IGxldmVsLiBUaGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGl0c2VsZiBpcyBzdHJlYW1lZCBpbnRvIHRoZSBtYWNyby4KKy8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCisKK2VudW0gR1Rlc3RMb2dTZXZlcml0eSB7CisgIEdURVNUX0lORk8sCisgIEdURVNUX1dBUk5JTkcsCisgIEdURVNUX0VSUk9SLAorICBHVEVTVF9GQVRBTAorfTsKKworLy8gRm9ybWF0cyBsb2cgZW50cnkgc2V2ZXJpdHksIHByb3ZpZGVzIGEgc3RyZWFtIG9iamVjdCBmb3Igc3RyZWFtaW5nIHRoZQorLy8gbG9nIG1lc3NhZ2UsIGFuZCB0ZXJtaW5hdGVzIHRoZSBtZXNzYWdlIHdpdGggYSBuZXdsaW5lIHdoZW4gZ29pbmcgb3V0IG9mCisvLyBzY29wZS4KK2NsYXNzIEdURVNUX0FQSV8gR1Rlc3RMb2cgeworIHB1YmxpYzoKKyAgR1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisgIC8vIEZsdXNoZXMgdGhlIGJ1ZmZlcnMgYW5kLCBpZiBzZXZlcml0eSBpcyBHVEVTVF9GQVRBTCwgYWJvcnRzIHRoZSBwcm9ncmFtLgorICB+R1Rlc3RMb2coKTsKKworICA6OnN0ZDo6b3N0cmVhbSYgR2V0U3RyZWFtKCkgeyByZXR1cm4gOjpzdGQ6OmNlcnI7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHlfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RMb2cpOworfTsKKworI2RlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RMb2coOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfIyNzZXZlcml0eSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykuR2V0U3RyZWFtKCkKKworaW5saW5lIHZvaWQgTG9nVG9TdGRlcnIoKSB7fQoraW5saW5lIHZvaWQgRmx1c2hJbmZvTG9nKCkgeyBmZmx1c2goTlVMTCk7IH0KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFLgorLy8KKy8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uCisvLyBpcyBub3Qgc2F0aXNmaWVkLgorLy8gIFN5bm9wc3lzOgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsKKy8vICAgICBvcgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKSA8PCAiQWRkaXRpb25hbCBtZXNzYWdlIjsKKy8vCisvLyAgICBUaGlzIGNoZWNrcyB0aGUgY29uZGl0aW9uIGFuZCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKKy8vICAgIGl0IHByaW50cyBtZXNzYWdlIGFib3V0IHRoZSBjb25kaXRpb24gdmlvbGF0aW9uLCBpbmNsdWRpbmcgdGhlCisvLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksCisvLyAgICBhbmQgdGhlbiBpdCBhYm9ydHMgdGhlIHByb2dyYW0uIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpcnJlc3BlY3RpdmUgb2YKKy8vICAgIHdoZXRoZXIgaXQgaXMgYnVpbHQgaW4gdGhlIGRlYnVnIG1vZGUgb3Igbm90LgorI2RlZmluZSBHVEVTVF9DSEVDS18oY29uZGl0aW9uKSBcCisgICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoY29uZGl0aW9uKSkgXAorICAgICAgOyBcCisgICAgZWxzZSBcCisgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiQ29uZGl0aW9uICIgI2NvbmRpdGlvbiAiIGZhaWxlZC4gIgorCisvLyBBbiBhbGwtbW9kZSBhc3NlcnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFBPU0lYLXN0eWxlIGZ1bmN0aW9uCisvLyBjYWxsIHJldHVybnMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKS4gIEtub3duIGxpbWl0YXRpb246IHRoaXMKKy8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvCisvLyBpbiB7fSBpZiB5b3UgbmVlZCB0byB1c2UgaXQgYXMgdGhlIG9ubHkgc3RhdGVtZW50IGluIGFuICdpZicKKy8vIGJyYW5jaC4KKyNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXAorICBpZiAoY29uc3QgaW50IGd0ZXN0X2Vycm9yID0gKHBvc2l4X2NhbGwpKSBcCisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgI3Bvc2l4X2NhbGwgPDwgImZhaWxlZCB3aXRoIGVycm9yICIgXAorICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVXNlIEltcGxpY2l0Q2FzdF8gYXMgYSBzYWZlIHZlcnNpb24gb2Ygc3RhdGljX2Nhc3QgZm9yIHVwY2FzdGluZyBpbgorLy8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuIGNhc3RpbmcgYSBGb28qIHRvIGEgU3VwZXJjbGFzc09mRm9vKiBvciBhCisvLyBjb25zdCBGb28qKS4gIFdoZW4geW91IHVzZSBJbXBsaWNpdENhc3RfLCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQKKy8vIHRoZSBjYXN0IGlzIHNhZmUuICBTdWNoIGV4cGxpY2l0IEltcGxpY2l0Q2FzdF9zIGFyZSBuZWNlc3NhcnkgaW4KKy8vIHN1cnByaXNpbmdseSBtYW55IHNpdHVhdGlvbnMgd2hlcmUgQysrIGRlbWFuZHMgYW4gZXhhY3QgdHlwZSBtYXRjaAorLy8gaW5zdGVhZCBvZiBhbiBhcmd1bWVudCB0eXBlIGNvbnZlcnRhYmxlIHRvIGEgdGFyZ2V0IHR5cGUuCisvLworLy8gVGhlIHN5bnRheCBmb3IgdXNpbmcgSW1wbGljaXRDYXN0XyBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljX2Nhc3Q6CisvLworLy8gICBJbXBsaWNpdENhc3RfPFRvVHlwZT4oZXhwcikKKy8vCisvLyBJbXBsaWNpdENhc3RfIHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwKKy8vIGJ1dCB0aGUgcHJvcG9zYWwgd2FzIHN1Ym1pdHRlZCB0b28gbGF0ZS4gIEl0IHdpbGwgcHJvYmFibHkgbWFrZQorLy8gaXRzIHdheSBpbnRvIHRoZSBsYW5ndWFnZSBpbiB0aGUgZnV0dXJlLgorLy8KKy8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAorLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGltcGxpY2l0X2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbz4KK2lubGluZSBUbyBJbXBsaWNpdENhc3RfKFRvIHgpIHsgcmV0dXJuIHg7IH0KKworLy8gV2hlbiB5b3UgdXBjYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tIHR5cGUgRm9vIHRvIHR5cGUKKy8vIFN1cGVyY2xhc3NPZkZvbyksIGl0J3MgZmluZSB0byB1c2UgSW1wbGljaXRDYXN0Xzw+LCBzaW5jZSB1cGNhc3RzCisvLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tCisvLyB0eXBlIEZvbyB0byB0eXBlIFN1YmNsYXNzT2ZGb28pLCBzdGF0aWNfY2FzdDw+IGlzbid0IHNhZmUsIGJlY2F1c2UKKy8vIGhvdyBkbyB5b3Uga25vdyB0aGUgcG9pbnRlciBpcyByZWFsbHkgb2YgdHlwZSBTdWJjbGFzc09mRm9vPyAgSXQKKy8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsCisvLyB3aGVuIHlvdSBkb3duY2FzdCwgeW91IHNob3VsZCB1c2UgdGhpcyBtYWNyby4gIEluIGRlYnVnIG1vZGUsIHdlCisvLyB1c2UgZHluYW1pY19jYXN0PD4gdG8gZG91YmxlLWNoZWNrIHRoZSBkb3duY2FzdCBpcyBsZWdhbCAod2UgZGllCisvLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+CisvLyBpbnN0ZWFkLiAgVGh1cywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBpbiBkZWJ1ZyBtb2RlIHRvIG1ha2Ugc3VyZQorLy8gdGhlIGNhc3QgaXMgbGVnYWwhCisvLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uCisvLyBJbiBwYXJ0aWN1bGFyLCB5b3UgU0hPVUxETidUIGJlIHVzaW5nIGR5bmFtaWNfY2FzdDw+IGluIG9yZGVyIHRvCisvLyBkbyBSVFRJIChlZyBjb2RlIGxpa2UgdGhpczoKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7CisvLyAgICBpZiAoZHluYW1pY19jYXN0PFN1YmNsYXNzMj4oZm9vKSkgSGFuZGxlQVN1YmNsYXNzMk9iamVjdChmb28pOworLy8gWW91IHNob3VsZCBkZXNpZ24gdGhlIGNvZGUgc29tZSBvdGhlciB3YXkgbm90IHRvIG5lZWQgdGhpcy4KKy8vCisvLyBUaGlzIHJlbGF0aXZlbHkgdWdseSBuYW1lIGlzIGludGVudGlvbmFsLiBJdCBwcmV2ZW50cyBjbGFzaGVzIHdpdGgKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIHVzZXJzIG1heSBoYXZlIChlLmcuLCBkb3duX2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gIC8vIHVzZSBsaWtlIHRoaXM6IERvd25DYXN0XzxUKj4oZm9vKTsKK2lubGluZSBUbyBEb3duQ2FzdF8oRnJvbSogZikgeyAgLy8gc28gd2Ugb25seSBhY2NlcHQgcG9pbnRlcnMKKyAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQorICAvLyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcsIGFuZCBoYXMgbm8gb3ZlcmhlYWQgaW4gYW4KKyAgLy8gb3B0aW1pemVkIGJ1aWxkIGF0IHJ1bi10aW1lLCBhcyBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5CisgIC8vIGNvbXBsZXRlbHkuCisgIGlmIChmYWxzZSkgeworICAgIGNvbnN0IFRvIHRvID0gTlVMTDsKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7CisgIH0KKworI2lmIEdURVNUX0hBU19SVFRJCisgIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKKyAgR1RFU1RfQ0hFQ0tfKGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Cit9CisKKy8vIERvd25jYXN0cyB0aGUgcG9pbnRlciBvZiB0eXBlIEJhc2UgdG8gRGVyaXZlZC4KKy8vIERlcml2ZWQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEJhc2UuIFRoZSBwYXJhbWV0ZXIgTVVTVAorLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuCisvLyBXaGVuIFJUVEkgaXMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgYSBydW50aW1lCisvLyBjaGVjayB0byBlbmZvcmNlIHRoaXMuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4KK0Rlcml2ZWQqIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZShCYXNlKiBiYXNlKSB7CisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBOT0xJTlQKKyNlbHNlCisgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0LgorI2VuZGlmCit9CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoKKy8vICAgQ2FwdHVyZVN0ZG91dCAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KKy8vICAgR2V0Q2FwdHVyZWRTdGRvdXQgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCisvLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorLy8KK0dURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7CitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7CitHVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOworR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0SW5qZWN0YWJsZUFyZ3ZzKCk7Cit2b2lkIFNldEluamVjdGFibGVBcmd2cyhjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYXJndnMpOworCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KK2V4dGVybiA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGdfYXJndnM7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRGVmaW5lcyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKworI2lmIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFNsZWVwcyBmb3IgKHJvdWdobHkpIG4gbWlsbGktc2Vjb25kcy4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IKKy8vIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gIERvbid0IHVzZSBpdCBpbiB1c2VyIHRlc3RzLAorLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitpbmxpbmUgdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbikgeworICBjb25zdCB0aW1lc3BlYyB0aW1lID0geworICAgIDAsICAgICAgICAgICAgICAgICAgLy8gMCBzZWNvbmRzLgorICAgIG4gKiAxMDAwTCAqIDEwMDBMLCAgLy8gQW5kIG4gbXMuCisgIH07CisgIG5hbm9zbGVlcCgmdGltZSwgTlVMTCk7Cit9CisKKy8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCisvLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCisvLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90CisvLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBOb3RpZmljYXRpb24geworIHB1YmxpYzoKKyAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOworICB9CisgIH5Ob3RpZmljYXRpb24oKSB7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pOworICB9CisKKyAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0CisgIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKyAgdm9pZCBOb3RpZnkoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOworICAgIG5vdGlmaWVkXyA9IHRydWU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgIH0KKworICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAorICAvLyB0aHJlYWQuCisgIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7CisgICAgICBjb25zdCBib29sIG5vdGlmaWVkID0gbm90aWZpZWRfOworICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgICAgICBpZiAobm90aWZpZWQpCisgICAgICAgIGJyZWFrOworICAgICAgU2xlZXBNaWxsaXNlY29uZHMoMTApOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKKyAgYm9vbCBub3RpZmllZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOworfTsKKworLy8gQXMgYSBDLWZ1bmN0aW9uLCBUaHJlYWRGdW5jV2l0aENMaW5rYWdlIGNhbm5vdCBiZSB0ZW1wbGF0ZWQgaXRzZWxmLgorLy8gQ29uc2VxdWVudGx5LCBpdCBjYW5ub3Qgc2VsZWN0IGEgY29ycmVjdCBpbnN0YW50aWF0aW9uIG9mIFRocmVhZFdpdGhQYXJhbQorLy8gaW4gb3JkZXIgdG8gY2FsbCBpdHMgUnVuKCkuIEludHJvZHVjaW5nIFRocmVhZFdpdGhQYXJhbUJhc2UgYXMgYQorLy8gbm9uLXRlbXBsYXRlZCBiYXNlIGNsYXNzIGZvciBUaHJlYWRXaXRoUGFyYW0gYWxsb3dzIHVzIHRvIGJ5cGFzcyB0aGlzCisvLyBwcm9ibGVtLgorY2xhc3MgVGhyZWFkV2l0aFBhcmFtQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRXaXRoUGFyYW1CYXNlKCkge30KKyAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKK307CisKKy8vIHB0aHJlYWRfY3JlYXRlKCkgYWNjZXB0cyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0eXBlIHdpdGggdGhlIEMgbGlua2FnZS4KKy8vIEFjY29yZGluZyB0byB0aGUgU3RhbmRhcmQgKDcuNS8xKSwgZnVuY3Rpb24gdHlwZXMgd2l0aCBkaWZmZXJlbnQgbGlua2FnZXMKKy8vIGFyZSBkaWZmZXJlbnQgZXZlbiBpZiB0aGV5IGFyZSBvdGhlcndpc2UgaWRlbnRpY2FsLiAgU29tZSBjb21waWxlcnMgKGZvcgorLy8gZXhhbXBsZSwgU3VuU3R1ZGlvKSB0cmVhdCB0aGVtIGFzIGRpZmZlcmVudCB0eXBlcy4gIFNpbmNlIGNsYXNzIG1ldGhvZHMKKy8vIGNhbm5vdCBiZSBkZWZpbmVkIHdpdGggQy1saW5rYWdlIHdlIG5lZWQgdG8gZGVmaW5lIGEgZnJlZSBDLWZ1bmN0aW9uIHRvCisvLyBwYXNzIGludG8gcHRocmVhZF9jcmVhdGUoKS4KK2V4dGVybiAiQyIgaW5saW5lIHZvaWQqIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2Uodm9pZCogdGhyZWFkKSB7CisgIHN0YXRpY19jYXN0PFRocmVhZFdpdGhQYXJhbUJhc2UqPih0aHJlYWQpLT5SdW4oKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG11bHRpLXRocmVhZGluZyBjb25zdHJ1Y3RzLgorLy8gVG8gdXNlIGl0LCB3cml0ZToKKy8vCisvLyAgIHZvaWQgVGhyZWFkRnVuYyhpbnQgcGFyYW0pIHsgLyogRG8gdGhpbmdzIHdpdGggcGFyYW0gKi8gfQorLy8gICBOb3RpZmljYXRpb24gdGhyZWFkX2Nhbl9zdGFydDsKKy8vICAgLi4uCisvLyAgIC8vIFRoZSB0aHJlYWRfY2FuX3N0YXJ0IHBhcmFtZXRlciBpcyBvcHRpb25hbDsgeW91IGNhbiBzdXBwbHkgTlVMTC4KKy8vICAgVGhyZWFkV2l0aFBhcmFtPGludD4gdGhyZWFkKCZUaHJlYWRGdW5jLCA1LCAmdGhyZWFkX2Nhbl9zdGFydCk7CisvLyAgIHRocmVhZF9jYW5fc3RhcnQuTm90aWZ5KCk7CisvLworLy8gVGhlc2UgY2xhc3NlcyBhcmUgb25seSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiBEbworLy8gbm90IHVzZSB0aGVtIGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUaHJlYWRXaXRoUGFyYW0gOiBwdWJsaWMgVGhyZWFkV2l0aFBhcmFtQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIHZvaWQgKCpVc2VyVGhyZWFkRnVuYykoVCk7CisKKyAgVGhyZWFkV2l0aFBhcmFtKAorICAgICAgVXNlclRocmVhZEZ1bmMgZnVuYywgVCBwYXJhbSwgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KQorICAgICAgOiBmdW5jXyhmdW5jKSwKKyAgICAgICAgcGFyYW1fKHBhcmFtKSwKKyAgICAgICAgdGhyZWFkX2Nhbl9zdGFydF8odGhyZWFkX2Nhbl9zdGFydCksCisgICAgICAgIGZpbmlzaGVkXyhmYWxzZSkgeworICAgIFRocmVhZFdpdGhQYXJhbUJhc2UqIGNvbnN0IGJhc2UgPSB0aGlzOworICAgIC8vIFRoZSB0aHJlYWQgY2FuIGJlIGNyZWF0ZWQgb25seSBhZnRlciBhbGwgZmllbGRzIGV4Y2VwdCB0aHJlYWRfCisgICAgLy8gaGF2ZSBiZWVuIGluaXRpYWxpemVkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkXywgMCwgJlRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UsIGJhc2UpKTsKKyAgfQorICB+VGhyZWFkV2l0aFBhcmFtKCkgeyBKb2luKCk7IH0KKworICB2b2lkIEpvaW4oKSB7CisgICAgaWYgKCFmaW5pc2hlZF8pIHsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfam9pbih0aHJlYWRfLCAwKSk7CisgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBSdW4oKSB7CisgICAgaWYgKHRocmVhZF9jYW5fc3RhcnRfICE9IE5VTEwpCisgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xy0+V2FpdEZvck5vdGlmaWNhdGlvbigpOworICAgIGZ1bmNfKHBhcmFtXyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFVzZXJUaHJlYWRGdW5jIGZ1bmNfOyAgLy8gVXNlci1zdXBwbGllZCB0aHJlYWQgZnVuY3Rpb24uCisgIGNvbnN0IFQgcGFyYW1fOyAgLy8gVXNlci1zdXBwbGllZCBwYXJhbWV0ZXIgdG8gdGhlIHRocmVhZCBmdW5jdGlvbi4KKyAgLy8gV2hlbiBub24tTlVMTCwgdXNlZCB0byBibG9jayBleGVjdXRpb24gdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkCisgIC8vIG5vdGlmaWVzLgorICBOb3RpZmljYXRpb24qIGNvbnN0IHRocmVhZF9jYW5fc3RhcnRfOworICBib29sIGZpbmlzaGVkXzsgIC8vIHRydWUgaWZmIHdlIGtub3cgdGhhdCB0aGUgdGhyZWFkIGZ1bmN0aW9uIGhhcyBmaW5pc2hlZC4KKyAgcHRocmVhZF90IHRocmVhZF87ICAvLyBUaGUgbmF0aXZlIHRocmVhZCBvYmplY3QuCisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRXaXRoUGFyYW0pOworfTsKKworLy8gTXV0ZXhCYXNlIGFuZCBNdXRleCBpbXBsZW1lbnQgbXV0ZXggb24gcHRocmVhZHMtYmFzZWQgcGxhdGZvcm1zLiBUaGV5CisvLyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNsYXNzIE11dGV4TG9jazoKKy8vCisvLyAgIE11dGV4IG11dGV4OworLy8gICAuLi4KKy8vICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4KTsgIC8vIEFjcXVpcmVzIHRoZSBtdXRleCBhbmQgcmVsZWFzZXMgaXQgYXQgdGhlIGVuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgc2NvcGUuCisvLworLy8gTXV0ZXhCYXNlIGltcGxlbWVudHMgYmVoYXZpb3IgZm9yIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkKKy8vIGFsbG9jYXRlZCBtdXRleGVzLiAgRG8gbm90IHVzZSBNdXRleEJhc2UgZGlyZWN0bHkuICBJbnN0ZWFkLCB3cml0ZQorLy8gdGhlIGZvbGxvd2luZyB0byBkZWZpbmUgYSBzdGF0aWMgbXV0ZXg6CisvLworLy8gICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFlvdSBjYW4gZm9yd2FyZCBkZWNsYXJlIGEgc3RhdGljIG11dGV4IGxpa2UgdGhpczoKKy8vCisvLyAgIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFRvIGNyZWF0ZSBhIGR5bmFtaWMgbXV0ZXgsIGp1c3QgZGVmaW5lIGFuIG9iamVjdCBvZiB0eXBlIE11dGV4LgorY2xhc3MgTXV0ZXhCYXNlIHsKKyBwdWJsaWM6CisgIC8vIEFjcXVpcmVzIHRoaXMgbXV0ZXguCisgIHZvaWQgTG9jaygpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm11dGV4XykpOworICAgIG93bmVyXyA9IHB0aHJlYWRfc2VsZigpOworICAgIGhhc19vd25lcl8gPSB0cnVlOworICB9CisKKyAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4KKyAgdm9pZCBVbmxvY2soKSB7CisgICAgLy8gU2luY2UgdGhlIGxvY2sgaXMgYmVpbmcgcmVsZWFzZWQgdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgbm8gbG9uZ2VyIGJlCisgICAgLy8gY29uc2lkZXJlZCB2YWxpZC4gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIGhhc19vd25lcl8gaGVyZSwgYXMgaXQncworICAgIC8vIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCisgICAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KKyAgICBoYXNfb3duZXJfID0gZmFsc2U7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4XykpOworICB9CisKKyAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcworICAvLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsKKyAgICBHVEVTVF9DSEVDS18oaGFzX293bmVyXyAmJiBwdGhyZWFkX2VxdWFsKG93bmVyXywgcHRocmVhZF9zZWxmKCkpKQorICAgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOworICB9CisKKyAgLy8gQSBzdGF0aWMgbXV0ZXggbWF5IGJlIHVzZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLiAgSXQgbWF5IGV2ZW4KKyAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UKKyAgLy8gbXVzdCBiZSBhYmxlIHRvIGluaXRpYWxpemUgYSBzdGF0aWMgbXV0ZXggb2JqZWN0IGF0IGxpbmsgdGltZS4KKyAgLy8gVGhpcyBtZWFucyBNdXRleEJhc2UgaGFzIHRvIGJlIGEgUE9EIGFuZCBpdHMgbWVtYmVyIHZhcmlhYmxlcworICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4KKyBwdWJsaWM6CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87ICAvLyBUaGUgdW5kZXJseWluZyBwdGhyZWFkIG11dGV4LgorICAvLyBoYXNfb3duZXJfIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvd25lcl8gZmllbGQgYmVsb3cgY29udGFpbnMgYSB2YWxpZCB0aHJlYWQKKyAgLy8gSUQgYW5kIGlzIHRoZXJlZm9yZSBzYWZlIHRvIGluc3BlY3QgKGUuZy4sIHRvIHVzZSBpbiBwdGhyZWFkX2VxdWFsKCkpLiBBbGwKKyAgLy8gYWNjZXNzZXMgdG8gdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IGEgY2hlY2sgb2YgdGhpcyBmaWVsZC4KKyAgLy8gQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gbWVtc2V0KCkgb3duZXJfIHRvIGFsbCB6ZXJvcywgYnV0IHRoZXJlJ3Mgbm8KKyAgLy8gZ3VhcmFudGVlIHRoYXQgYSB6ZXJvJ2QgcHRocmVhZF90IGlzIG5lY2Vzc2FyaWx5IGludmFsaWQgb3IgZXZlbiBkaWZmZXJlbnQKKyAgLy8gZnJvbSBwdGhyZWFkX3NlbGYoKS4KKyAgYm9vbCBoYXNfb3duZXJfOworICBwdGhyZWFkX3Qgb3duZXJfOyAgLy8gVGhlIHRocmVhZCBob2xkaW5nIHRoZSBtdXRleC4KK307CisKKy8vIEZvcndhcmQtZGVjbGFyZXMgYSBzdGF0aWMgbXV0ZXguCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4CisKKy8vIERlZmluZXMgYW5kIHN0YXRpY2FsbHkgKGkuZS4gYXQgbGluayB0aW1lKSBpbml0aWFsaXplcyBhIHN0YXRpYyBtdXRleC4KKy8vIFRoZSBpbml0aWFsaXphdGlvbiBsaXN0IGhlcmUgZG9lcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplIGVhY2ggZmllbGQsCisvLyBpbnN0ZWFkIHJlbHlpbmcgb24gZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHVuc3BlY2lmaWVkIGZpZWxkcy4gSW4KKy8vIHBhcnRpY3VsYXIsIHRoZSBvd25lcl8gZmllbGQgKGEgcHRocmVhZF90KSBpcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplZC4KKy8vIFRoaXMgYWxsb3dzIGluaXRpYWxpemF0aW9uIHRvIHdvcmsgd2hldGhlciBwdGhyZWFkX3QgaXMgYSBzY2FsYXIgb3Igc3RydWN0LgorLy8gVGhlIGZsYWcgLVdtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQgZm9yIHRoaXMgdG8gd29yay4KKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4ID0geyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCBmYWxzZSB9CisKKy8vIFRoZSBNdXRleCBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGZvciBtdXRleGVzIGNyZWF0ZWQgYXQgcnVudGltZS4gSXQKKy8vIHNoYXJlcyBpdHMgQVBJIHdpdGggTXV0ZXhCYXNlIG90aGVyd2lzZS4KK2NsYXNzIE11dGV4IDogcHVibGljIE11dGV4QmFzZSB7CisgcHVibGljOgorICBNdXRleCgpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOworICAgIGhhc19vd25lcl8gPSBmYWxzZTsKKyAgfQorICB+TXV0ZXgoKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNdXRleCk7Cit9OworCisvLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBhcyB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAorLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KK2NsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4QmFzZSogbXV0ZXgpCisgICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQorCisgIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXhCYXNlKiBjb25zdCBtdXRleF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdE11dGV4TG9jayk7Cit9OworCit0eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKKworLy8gSGVscGVycyBmb3IgVGhyZWFkTG9jYWwuCisKKy8vIHB0aHJlYWRfa2V5X2NyZWF0ZSgpIHJlcXVpcmVzIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB0byBoYXZlCisvLyBDLWxpbmthZ2UuICBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIHRlbXBsYXRpemVkIHRvIGFjY2VzcworLy8gVGhyZWFkTG9jYWw8VD4uICBIZW5jZSB0aGUgbmVlZCBmb3IgY2xhc3MKKy8vIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlLgorY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UoKSB7fQorfTsKKworLy8gQ2FsbGVkIGJ5IHB0aHJlYWQgdG8gZGVsZXRlIHRocmVhZC1sb2NhbCBkYXRhIHN0b3JlZCBieQorLy8gcHRocmVhZF9zZXRzcGVjaWZpYygpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHZvaWQqIHZhbHVlX2hvbGRlcikgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPih2YWx1ZV9ob2xkZXIpOworfQorCisvLyBJbXBsZW1lbnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlIG9uIHB0aHJlYWRzLWJhc2VkIHN5c3RlbXMuCisvLworLy8gICAvLyBUaHJlYWQgMQorLy8gICBUaHJlYWRMb2NhbDxpbnQ+IHRsKDEwMCk7ICAvLyAxMDAgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorLy8KKy8vICAgLy8gVGhyZWFkIDIKKy8vICAgdGwuc2V0KDE1MCk7ICAvLyBDaGFuZ2VzIHRoZSB2YWx1ZSBmb3IgdGhyZWFkIDIgb25seS4KKy8vICAgRVhQRUNUX0VRKDE1MCwgdGwuZ2V0KCkpOworLy8KKy8vICAgLy8gVGhyZWFkIDEKKy8vICAgRVhQRUNUX0VRKDEwMCwgdGwuZ2V0KCkpOyAgLy8gSW4gdGhyZWFkIDEsIHRsIGhhcyB0aGUgb3JpZ2luYWwgdmFsdWUuCisvLyAgIHRsLnNldCgyMDApOworLy8gICBFWFBFQ1RfRVEoMjAwLCB0bC5nZXQoKSk7CisvLworLy8gVGhlIHRlbXBsYXRlIHR5cGUgYXJndW1lbnQgVCBtdXN0IGhhdmUgYSBwdWJsaWMgY29weSBjb25zdHJ1Y3Rvci4KKy8vIEluIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCBUaHJlYWRMb2NhbCBjb25zdHJ1Y3RvciByZXF1aXJlcyBUIHRvIGhhdmUKKy8vIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuCisvLworLy8gQW4gb2JqZWN0IG1hbmFnZWQgZm9yIGEgdGhyZWFkIGJ5IGEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMgZGVsZXRlZAorLy8gd2hlbiB0aGUgdGhyZWFkIGV4aXRzLiAgT3IsIGlmIHRoZSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBkaWVzIGluCisvLyB0aGF0IHRocmVhZCwgd2hlbiB0aGUgVGhyZWFkTG9jYWwgZGllcy4gIEl0J3MgdGhlIHVzZXIncworLy8gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYWxsIG90aGVyIHRocmVhZHMgdXNpbmcgYSBUaHJlYWRMb2NhbAorLy8gaGF2ZSBleGl0ZWQgd2hlbiBpdCBkaWVzLCBvciB0aGUgcGVyLXRocmVhZCBvYmplY3RzIGZvciB0aG9zZQorLy8gdGhyZWFkcyB3aWxsIG5vdCBiZSBkZWxldGVkLgorLy8KKy8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQorLy8gd2lsbCBkaWUgYWZ0ZXIgbWFpbigpIGhhcyByZXR1cm5lZC4gIFRoZXJlZm9yZSwgbm8gcGVyLXRocmVhZAorLy8gb2JqZWN0IG1hbmFnZWQgYnkgR29vZ2xlIFRlc3Qgd2lsbCBiZSBsZWFrZWQgYXMgbG9uZyBhcyBhbGwgdGhyZWFkcworLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGhyZWFkTG9jYWwgeworIHB1YmxpYzoKKyAgVGhyZWFkTG9jYWwoKSA6IGtleV8oQ3JlYXRlS2V5KCkpLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdF8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiBrZXlfKENyZWF0ZUtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF8odmFsdWUpIHt9CisKKyAgflRocmVhZExvY2FsKCkgeworICAgIC8vIERlc3Ryb3lzIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBpZiBhbnkuCisgICAgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZShwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKworICAgIC8vIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4gIFRoaXMgd2lsbCAqbm90KgorICAgIC8vIGRlbGV0ZSBtYW5hZ2VkIG9iamVjdHMgZm9yIG90aGVyIHRocmVhZHMuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9rZXlfZGVsZXRlKGtleV8pKTsKKyAgfQorCisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KKyAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9CisgIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgLy8gSG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQuCisgIGNsYXNzIFZhbHVlSG9sZGVyIDogcHVibGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyAgICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQorCisgICBwcml2YXRlOgorICAgIFQgdmFsdWVfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOworICB9OworCisgIHN0YXRpYyBwdGhyZWFkX2tleV90IENyZWF0ZUtleSgpIHsKKyAgICBwdGhyZWFkX2tleV90IGtleTsKKyAgICAvLyBXaGVuIGEgdGhyZWFkIGV4aXRzLCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKCkgd2lsbCBiZSBjYWxsZWQgb24KKyAgICAvLyB0aGUgb2JqZWN0IG1hbmFnZWQgZm9yIHRoYXQgdGhyZWFkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmtleSwgJkRlbGV0ZVRocmVhZExvY2FsVmFsdWUpKTsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKyAgICBpZiAoaG9sZGVyICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8VmFsdWVIb2xkZXI+KGhvbGRlciktPnBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBWYWx1ZUhvbGRlciogY29uc3QgbmV3X2hvbGRlciA9IG5ldyBWYWx1ZUhvbGRlcihkZWZhdWx0Xyk7CisgICAgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIGNvbnN0IGhvbGRlcl9iYXNlID0gbmV3X2hvbGRlcjsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX3NldHNwZWNpZmljKGtleV8sIGhvbGRlcl9iYXNlKSk7CisgICAgcmV0dXJuIG5ld19ob2xkZXItPnBvaW50ZXIoKTsKKyAgfQorCisgIC8vIEEga2V5IHB0aHJlYWRzIHVzZXMgZm9yIGxvb2tpbmcgdXAgcGVyLXRocmVhZCB2YWx1ZXMuCisgIGNvbnN0IHB0aHJlYWRfa2V5X3Qga2V5XzsKKyAgY29uc3QgVCBkZWZhdWx0XzsgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4KKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZExvY2FsKTsKK307CisKKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMQorCisjZWxzZSAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAobXV0ZXgsIGxvY2ssCisvLyBhbmQgdGhyZWFkLWxvY2FsIHZhcmlhYmxlKS4gIE5lY2Vzc2FyeSBmb3IgY29tcGlsaW5nIEdvb2dsZSBUZXN0IHdoZXJlCisvLyBtdXRleCBpcyBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgR29vZ2xlIFRlc3QgaW4gbXVsdGlwbGUgdGhyZWFkcyBpcyBub3QKKy8vIHN1cHBvcnRlZCBvbiBzdWNoIHBsYXRmb3Jtcy4KKworY2xhc3MgTXV0ZXggeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7fQorICB2b2lkIExvY2soKSB7fQorICB2b2lkIFVubG9jaygpIHt9CisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHt9Cit9OworCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4CisKKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorCitjbGFzcyBHVGVzdE11dGV4TG9jayB7CisgcHVibGljOgorICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCopIHt9ICAvLyBOT0xJTlQKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgOiB2YWx1ZV8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKworLy8gVGhlIGFib3ZlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGhhdmUgZHVtbXkgaW1wbGVtZW50YXRpb25zLgorLy8gVGhlcmVmb3JlIEdvb2dsZSBUZXN0IGlzIG5vdCB0aHJlYWQtc2FmZS4KKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK0dURVNUX0FQSV8gc2l6ZV90IEdldFRocmVhZENvdW50KCk7CisKKy8vIFBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikgY3Jhc2hlcyB0aGUgQVJNCisvLyBjb21waWxlciBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBpbiBTdW4gU3R1ZGlvLiAgVGhlIE5va2lhIFN5bWJpYW4KKy8vIGFuZCB0aGUgSUJNIFhMIEMvQysrIGNvbXBpbGVyIHRyeSB0byBpbnN0YW50aWF0ZSBhIGNvcHkgY29uc3RydWN0b3IKKy8vIGZvciBvYmplY3RzIHBhc3NlZCB0aHJvdWdoIGVsbGlwc2lzICguLi4pLCBmYWlsaW5nIGZvciB1bmNvcHlhYmxlCisvLyBvYmplY3RzLiAgV2UgZGVmaW5lIHRoaXMgdG8gZW5zdXJlIHRoYXQgb25seSBQT0QgaXMgcGFzc2VkIHRocm91Z2gKKy8vIGVsbGlwc2lzIG9uIHRoZXNlIHN5c3RlbXMuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBXZSBsb3NlIHN1cHBvcnQgZm9yIE5VTEwgZGV0ZWN0aW9uIHdoZXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UKKy8vIHBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikuCisjIGRlZmluZSBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfIDEKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIDEKKyNlbmRpZgorCisvLyBUaGUgTm9raWEgU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIGNvbXBpbGVycyBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKy8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgVGhlc2UgY29tcGlsZXJzCisvLyBfY2FuXyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLAorLy8gc28gYSB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3Jrcy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKKyMgZGVmaW5lIEdURVNUX05FRURTX0lTX1BPSU5URVJfIDEKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPgorc3RydWN0IGJvb2xfY29uc3RhbnQgeworICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT4gdHlwZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBib29sX3ZhbHVlOworfTsKK3RlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+IGNvbnN0IGJvb2wgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPjo6dmFsdWU7CisKK3R5cGVkZWYgYm9vbF9jb25zdGFudDxmYWxzZT4gZmFsc2VfdHlwZTsKK3R5cGVkZWYgYm9vbF9jb25zdGFudDx0cnVlPiB0cnVlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3BvaW50ZXIgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfcG9pbnRlcjxUKj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CitzdHJ1Y3QgSXRlcmF0b3JUcmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIEl0ZXJhdG9yOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJdGVyYXRvclRyYWl0czxUKj4geworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEl0ZXJhdG9yVHJhaXRzPGNvbnN0IFQqPiB7CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiXFwiCisjIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAxCisvLyBUaGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlIHRoZSBjb21waWxlciBzdXBwb3J0cy4KK3R5cGVkZWYgX19pbnQ2NCBCaWdnZXN0SW50OworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiLyIKKyMgZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDAKK3R5cGVkZWYgbG9uZyBsb25nIEJpZ2dlc3RJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXRpZXMgZm9yIGNoYXIuCisKKy8vIGlzc3BhY2UoaW50IGNoKSBhbmQgZnJpZW5kcyBhY2NlcHQgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuICBjaGFyCisvLyBtYXkgYmUgc2lnbmVkLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyIChvciBjb21waWxlciBmbGFncykuCisvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjYXN0IGEgY2hhciB0byB1bnNpZ25lZCBjaGFyIGJlZm9yZSBjYWxsaW5nCisvLyBpc3NwYWNlKCksIGV0Yy4KKworaW5saW5lIGJvb2wgSXNBbHBoYShjaGFyIGNoKSB7CisgIHJldHVybiBpc2FscGhhKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzQWxOdW0oY2hhciBjaCkgeworICByZXR1cm4gaXNhbG51bShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc0RpZ2l0KGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNMb3dlcihjaGFyIGNoKSB7CisgIHJldHVybiBpc2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzU3BhY2UoY2hhciBjaCkgeworICByZXR1cm4gaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc1VwcGVyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQoY2hhciBjaCkgeworICByZXR1cm4gaXN4ZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQod2NoYXJfdCBjaCkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyIGxvd19ieXRlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpOworICByZXR1cm4gY2ggPT0gbG93X2J5dGUgJiYgaXN4ZGlnaXQobG93X2J5dGUpICE9IDA7Cit9CisKK2lubGluZSBjaGFyIFRvTG93ZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG9sb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KK2lubGluZSBjaGFyIFRvVXBwZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG91cHBlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KKworLy8gVGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeCBuYW1lc3BhY2UgaG9sZHMgd3JhcHBlcnMgZm9yIGNvbW1vbgorLy8gUE9TSVggZnVuY3Rpb25zLiAgVGhlc2Ugd3JhcHBlcnMgaGlkZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorLy8gV2luZG93cy9NU1ZDIGFuZCBQT1NJWCBzeXN0ZW1zLiAgU2luY2Ugc29tZSBjb21waWxlcnMgZGVmaW5lIHRoZXNlCisvLyBzdGFuZGFyZCBmdW5jdGlvbnMgYXMgbWFjcm9zLCB0aGUgd3JhcHBlciBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lCisvLyBhcyB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KKworbmFtZXNwYWNlIHBvc2l4IHsKKworLy8gRnVuY3Rpb25zIHdpdGggYSBkaWZmZXJlbnQgbmFtZSBvbiBXaW5kb3dzLgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCit0eXBlZGVmIHN0cnVjdCBfc3RhdCBTdGF0U3RydWN0OworCisjIGlmZGVmIF9fQk9STEFORENfXworaW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBzdHJpY21wKHMxLCBzMik7Cit9CitpbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gc3RyZHVwKHNyYyk7IH0KKyMgZWxzZSAgLy8gIV9fQk9STEFORENfXworIyAgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgSXNBVFRZKGludCAvKiBmZCAqLykgeyByZXR1cm4gMDsgfQorIyAgZWxzZQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBfaXNhdHR5KGZkKTsgfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBfc3RyaWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIF9zdHJkdXAoc3JjKTsgfQorIyBlbmRpZiAgLy8gX19CT1JMQU5EQ19fCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50PihfZmlsZW5vKGZpbGUpKTsgfQorLy8gU3RhdCgpLCBSbURpcigpLCBhbmQgSXNEaXIoKSBhcmUgbm90IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMKKy8vIHRpbWUgYW5kIHRodXMgbm90IGRlZmluZWQgdGhlcmUuCisjIGVsc2UKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIF9maWxlbm8oZmlsZSk7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIF9zdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBfcm1kaXIoZGlyKTsgfQoraW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsKKyAgcmV0dXJuIChfU19JRkRJUiAmIHN0LnN0X21vZGUpICE9IDA7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjZWxzZQorCit0eXBlZGVmIHN0cnVjdCBzdGF0IFN0YXRTdHJ1Y3Q7CisKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIGZpbGVubyhmaWxlKTsgfQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0YXQoY29uc3QgY2hhciogcGF0aCwgU3RhdFN0cnVjdCogYnVmKSB7IHJldHVybiBzdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIHN0cmNhc2VjbXAoczEsIHMyKTsKK30KK2lubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQoraW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIHJtZGlyKGRpcik7IH0KK2lubGluZSBib29sIElzRGlyKGNvbnN0IFN0YXRTdHJ1Y3QmIHN0KSB7IHJldHVybiBTX0lTRElSKHN0LnN0X21vZGUpOyB9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBGdW5jdGlvbnMgZGVwcmVjYXRlZCBieSBNU1ZDIDguMC4KKworI2lmZGVmIF9NU0NfVkVSCisvLyBUZW1wb3JhcmlseSBkaXNhYmxlIHdhcm5pbmcgNDk5NiAoZGVwcmVjYXRlZCBmdW5jdGlvbikuCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCitpbmxpbmUgY29uc3QgY2hhciogU3RyTkNweShjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHNpemVfdCBuKSB7CisgIHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7Cit9CisKKy8vIENoRGlyKCksIEZSZW9wZW4oKSwgRkRPcGVuKCksIFJlYWQoKSwgV3JpdGUoKSwgQ2xvc2UoKSwgYW5kCisvLyBTdHJFcnJvcigpIGFyZW4ndCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzIHRpbWUgYW5kIHRodXMgbm90CisvLyBkZWZpbmVkIHRoZXJlLgorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IENoRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gY2hkaXIoZGlyKTsgfQorI2VuZGlmCitpbmxpbmUgRklMRSogRk9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgeworICByZXR1cm4gZm9wZW4ocGF0aCwgbW9kZSk7Cit9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgRklMRSAqRlJlb3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlLCBGSUxFKiBzdHJlYW0pIHsKKyAgcmV0dXJuIGZyZW9wZW4ocGF0aCwgbW9kZSwgc3RyZWFtKTsKK30KK2lubGluZSBGSUxFKiBGRE9wZW4oaW50IGZkLCBjb25zdCBjaGFyKiBtb2RlKSB7IHJldHVybiBmZG9wZW4oZmQsIG1vZGUpOyB9CisjZW5kaWYKK2lubGluZSBpbnQgRkNsb3NlKEZJTEUqIGZwKSB7IHJldHVybiBmY2xvc2UoZnApOyB9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFJlYWQoaW50IGZkLCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihyZWFkKGZkLCBidWYsIGNvdW50KSk7Cit9CitpbmxpbmUgaW50IFdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4od3JpdGUoZmQsIGJ1ZiwgY291bnQpKTsKK30KK2lubGluZSBpbnQgQ2xvc2UoaW50IGZkKSB7IHJldHVybiBjbG9zZShmZCk7IH0KK2lubGluZSBjb25zdCBjaGFyKiBTdHJFcnJvcihpbnQgZXJybnVtKSB7IHJldHVybiBzdHJlcnJvcihlcnJudW0pOyB9CisjZW5kaWYKK2lubGluZSBjb25zdCBjaGFyKiBHZXRFbnYoY29uc3QgY2hhciogbmFtZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLCB3aGljaCBoYXMgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICByZXR1cm4gTlVMTDsKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQorICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggd2UgcHJvZ3JhbW1hdGljYWxseSBjbGVhciB3aWxsIGJlIHNldCB0byB0aGUKKyAgLy8gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHVuc2V0IChOVUxMKS4gIEhhbmRsZSB0aGF0IGNhc2UuCisgIGNvbnN0IGNoYXIqIGNvbnN0IGVudiA9IGdldGVudihuYW1lKTsKKyAgcmV0dXJuIChlbnYgIT0gTlVMTCAmJiBlbnZbMF0gIT0gJ1wwJykgPyBlbnYgOiBOVUxMOworI2Vsc2UKKyAgcmV0dXJuIGdldGVudihuYW1lKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBXaW5kb3dzIENFIGhhcyBubyBDIGxpYnJhcnkuIFRoZSBhYm9ydCgpIGZ1bmN0aW9uIGlzIHVzZWQgaW4KKy8vIHNldmVyYWwgcGxhY2VzIGluIEdvb2dsZSBUZXN0LiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgcmVhc29uYWJsZQorLy8gaW1pdGF0aW9uIG9mIHN0YW5kYXJkIGJlaGF2aW91ci4KK3ZvaWQgQWJvcnQoKTsKKyNlbHNlCitpbmxpbmUgdm9pZCBBYm9ydCgpIHsgYWJvcnQoKTsgfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCit9ICAvLyBuYW1lc3BhY2UgcG9zaXgKKworLy8gTVNWQyAiZGVwcmVjYXRlcyIgc25wcmludGYgYW5kIGlzc3VlcyB3YXJuaW5ncyB3aGVyZXZlciBpdCBpcyB1c2VkLiAgSW4KKy8vIG9yZGVyIHRvIGF2b2lkIHRoZXNlIHdhcm5pbmdzLCB3ZSBuZWVkIHRvIHVzZSBfc25wcmludGYgb3IgX3NucHJpbnRmX3Mgb24KKy8vIE1TVkMtYmFzZWQgcGxhdGZvcm1zLiAgV2UgbWFwIHRoZSBHVEVTVF9TTlBSSU5URl8gbWFjcm8gdG8gdGhlIGFwcHJvcHJpYXRlCisvLyBmdW5jdGlvbiBpbiBvcmRlciB0byBhY2hpZXZlIHRoYXQuICBXZSB1c2UgbWFjcm8gZGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UKKy8vIHNucHJpbnRmIGlzIGEgdmFyaWFkaWMgZnVuY3Rpb24uCisjaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIE1TVkMgMjAwNSBhbmQgYWJvdmUgc3VwcG9ydCB2YXJpYWRpYyBtYWNyb3MuCisjIGRlZmluZSBHVEVTVF9TTlBSSU5URl8oYnVmZmVyLCBzaXplLCBmb3JtYXQsIC4uLikgXAorICAgICBfc25wcmludGZfcyhidWZmZXIsIHNpemUsIHNpemUsIGZvcm1hdCwgX19WQV9BUkdTX18pCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gV2luZG93cyBDRSBkb2VzIG5vdCBkZWZpbmUgX3NucHJpbnRmX3MgYW5kIE1TVkMgcHJpb3IgdG8gMjAwNSBkb2Vzbid0CisvLyBjb21wbGFpbiBhYm91dCBfc25wcmludGYuCisjIGRlZmluZSBHVEVTVF9TTlBSSU5URl8gX3NucHJpbnRmCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIHNucHJpbnRmCisjZW5kaWYKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIGEgQmlnZ2VzdEludCBjYW4gcmVwcmVzZW50LiAgVGhpcyBkZWZpbml0aW9uCisvLyB3b3JrcyBubyBtYXR0ZXIgQmlnZ2VzdEludCBpcyByZXByZXNlbnRlZCBpbiBvbmUncyBjb21wbGVtZW50IG9yCisvLyB0d28ncyBjb21wbGVtZW50LgorLy8KKy8vIFdlIGNhbm5vdCByZWx5IG9uIG51bWVyaWNfbGltaXRzIGluIFNUTCwgYXMgX19pbnQ2NCBhbmQgbG9uZyBsb25nCisvLyBhcmUgbm90IHBhcnQgb2Ygc3RhbmRhcmQgQysrIGFuZCBudW1lcmljX2xpbWl0cyBkb2Vzbid0IG5lZWQgdG8gYmUKKy8vIGRlZmluZWQgZm9yIHRoZW0uCitjb25zdCBCaWdnZXN0SW50IGtNYXhCaWdnZXN0SW50ID0KKyAgICB+KHN0YXRpY19jYXN0PEJpZ2dlc3RJbnQ+KDEpIDw8ICg4KnNpemVvZihCaWdnZXN0SW50KSAtIDEpKTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBzZXJ2ZXMgYXMgYSBjb21waWxlLXRpbWUgZnVuY3Rpb24gZnJvbSBzaXplIHRvCisvLyB0eXBlLiAgSXQgbWFwcyBhIHNpemUgaW4gYnl0ZXMgdG8gYSBwcmltaXRpdmUgdHlwZSB3aXRoIHRoYXQKKy8vIHNpemUuIGUuZy4KKy8vCisvLyAgIFR5cGVXaXRoU2l6ZTw0Pjo6VUludAorLy8KKy8vIGlzIHR5cGVkZWYtZWQgdG8gYmUgdW5zaWduZWQgaW50ICh1bnNpZ25lZCBpbnRlZ2VyIG1hZGUgdXAgb2YgNAorLy8gYnl0ZXMpLgorLy8KKy8vIFN1Y2ggZnVuY3Rpb25hbGl0eSBzaG91bGQgYmVsb25nIHRvIFNUTCwgYnV0IEkgY2Fubm90IGZpbmQgaXQKKy8vIHRoZXJlLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhpcyBjbGFzcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgZmxvYXRpbmctcG9pbnQKKy8vIGNvbXBhcmlzb24uCisvLworLy8gRm9yIG5vdyBpdCBvbmx5IGhhbmRsZXMgVUludCAodW5zaWduZWQgaW50KSBhcyB0aGF0J3MgYWxsIEdvb2dsZSBUZXN0CisvLyBuZWVkcy4gIE90aGVyIHR5cGVzIGNhbiBiZSBlYXNpbHkgYWRkZWQgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkCisvLyBhcmlzZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IHNpemU+CitjbGFzcyBUeXBlV2l0aFNpemUgeworIHB1YmxpYzoKKyAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIHVzaW5nIFR5cGVXaXRoU2l6ZTxOPiB3aXRoIGluY29ycmVjdAorICAvLyB2YWx1ZXMgb2YgTi4KKyAgdHlwZWRlZiB2b2lkIFVJbnQ7Cit9OworCisvLyBUaGUgc3BlY2lhbGl6YXRpb24gZm9yIHNpemUgNC4KK3RlbXBsYXRlIDw+CitjbGFzcyBUeXBlV2l0aFNpemU8ND4geworIHB1YmxpYzoKKyAgLy8gdW5zaWduZWQgaW50IGhhcyBzaXplIDQgaW4gYm90aCBnY2MgYW5kIE1TVkMuCisgIC8vCisgIC8vIEFzIGJhc2UvYmFzaWN0eXBlcy5oIGRvZXNuJ3QgY29tcGlsZSBvbiBXaW5kb3dzLCB3ZSBjYW5ub3QgdXNlCisgIC8vIHVpbnQzMiwgdWludDY0LCBhbmQgZXRjIGhlcmUuCisgIHR5cGVkZWYgaW50IEludDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUludDsKK307CisKKy8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA4LgordGVtcGxhdGUgPD4KK2NsYXNzIFR5cGVXaXRoU2l6ZTw4PiB7CisgcHVibGljOgorI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgdHlwZWRlZiBfX2ludDY0IEludDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJbnQ7CisjZWxzZQorICB0eXBlZGVmIGxvbmcgbG9uZyBJbnQ7ICAvLyBOT0xJTlQKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDsgIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9OworCisvLyBJbnRlZ2VyIHR5cGVzIG9mIGtub3duIHNpemVzLgordHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OkludCBJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDQ+OjpVSW50IFVJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6VUludCBVSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6SW50IFRpbWVJbk1pbGxpczsgIC8vIFJlcHJlc2VudHMgdGltZSBpbiBtaWxsaXNlY29uZHMuCisKKy8vIFV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIGZsYWdzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKy8vIE1hY3JvIGZvciByZWZlcmVuY2luZyBmbGFncy4KKyNkZWZpbmUgR1RFU1RfRkxBRyhuYW1lKSBGTEFHU19ndGVzdF8jI25hbWUKKworLy8gTWFjcm9zIGZvciBkZWNsYXJpbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkgR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKKyAgICBHVEVTVF9BUElfIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCisgICAgR1RFU1RfQVBJXyBleHRlcm4gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpCisKKy8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyBib29sIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgR1RFU1RfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorCisvLyBUaHJlYWQgYW5ub3RhdGlvbnMKKyNkZWZpbmUgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGxvY2tzKQorI2RlZmluZSBHVEVTVF9MT0NLX0VYQ0xVREVEXyhsb2NrcykKKworLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcyB0aGUgcmVzdWx0CisvLyB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUgdW5jaGFuZ2VkIGFuZCByZXR1cm5zCisvLyBmYWxzZS4KKy8vIFRPRE8oY2hhbmRsZXJjKTogRmluZCBhIGJldHRlciB3YXkgdG8gcmVmYWN0b3IgZmxhZyBhbmQgZW52aXJvbm1lbnQgcGFyc2luZworLy8gb3V0IG9mIGJvdGggZ3Rlc3QtcG9ydC5jYyBhbmQgZ3Rlc3QuY2MgdG8gYXZvaWQgZXhwb3J0aW5nIHRoaXMgdXRpbGl0eQorLy8gZnVuY3Rpb24uCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgYm9vbC9JbnQzMi9zdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbCk7CitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsKTsKK2NvbnN0IGNoYXIqIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbCk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKworI2lmIEdURVNUX09TX0xJTlVYCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyBpbmNsdWRlIDxzdGRleGNlcHQ+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzZXQ+CisKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgTWVzc2FnZSBjbGFzcy4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKworLy8gRW5zdXJlcyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvcGVyYXRvcjw8IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorLy8gU2VlIE1lc3NhZ2UmIG9wZXJhdG9yPDwoLi4uKSBiZWxvdyBmb3Igd2h5Lgordm9pZCBvcGVyYXRvcjw8KGNvbnN0IHRlc3Rpbmc6OmludGVybmFsOjpTZWNyZXQmLCBpbnQpOworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSBNZXNzYWdlIGNsYXNzIHdvcmtzIGxpa2UgYW4gb3N0cmVhbSByZXBlYXRlci4KKy8vCisvLyBUeXBpY2FsIHVzYWdlOgorLy8KKy8vICAgMS4gWW91IHN0cmVhbSBhIGJ1bmNoIG9mIHZhbHVlcyB0byBhIE1lc3NhZ2Ugb2JqZWN0LgorLy8gICAgICBJdCB3aWxsIHJlbWVtYmVyIHRoZSB0ZXh0IGluIGEgc3RyaW5nc3RyZWFtLgorLy8gICAyLiBUaGVuIHlvdSBzdHJlYW0gdGhlIE1lc3NhZ2Ugb2JqZWN0IHRvIGFuIG9zdHJlYW0uCisvLyAgICAgIFRoaXMgY2F1c2VzIHRoZSB0ZXh0IGluIHRoZSBNZXNzYWdlIHRvIGJlIHN0cmVhbWVkCisvLyAgICAgIHRvIHRoZSBvc3RyZWFtLgorLy8KKy8vIEZvciBleGFtcGxlOworLy8KKy8vICAgdGVzdGluZzo6TWVzc2FnZSBmb287CisvLyAgIGZvbyA8PCAxIDw8ICIgIT0gIiA8PCAyOworLy8gICBzdGQ6OmNvdXQgPDwgZm9vOworLy8KKy8vIHdpbGwgcHJpbnQgIjEgIT0gMiIuCisvLworLy8gTWVzc2FnZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5oZXJpdGVkIGZyb20uICBJbiBwYXJ0aWN1bGFyLCBpdHMKKy8vIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCisvLworLy8gTm90ZSB0aGF0IHN0cmluZ3N0cmVhbSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGdjYyBhbmQgaW4gTVNWQy4gIFlvdQorLy8gY2FuIHN0cmVhbSBhIE5VTEwgY2hhciBwb2ludGVyIHRvIGl0IGluIHRoZSBmb3JtZXIsIGJ1dCBub3QgaW4gdGhlCisvLyBsYXR0ZXIgKGl0IGNhdXNlcyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHlvdSBkbykuICBUaGUgTWVzc2FnZQorLy8gY2xhc3MgaGlkZXMgdGhpcyBkaWZmZXJlbmNlIGJ5IHRyZWF0aW5nIGEgTlVMTCBjaGFyIHBvaW50ZXIgYXMKKy8vICIobnVsbCkiLgorY2xhc3MgR1RFU1RfQVBJXyBNZXNzYWdlIHsKKyBwcml2YXRlOgorICAvLyBUaGUgdHlwZSBvZiBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgZm9yCisgIC8vIG5hcnJvdyBzdHJlYW1zLgorICB0eXBlZGVmIHN0ZDo6b3N0cmVhbSYgKCpCYXNpY05hcnJvd0lvTWFuaXApKHN0ZDo6b3N0cmVhbSYpOworCisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCisgIE1lc3NhZ2UoKTsKKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1zZykgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsgIC8vIE5PTElOVAorICAgICpzc18gPDwgbXNnLkdldFN0cmluZygpOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorICBleHBsaWNpdCBNZXNzYWdlKGNvbnN0IGNoYXIqIHN0cikgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsKKyAgICAqc3NfIDw8IHN0cjsKKyAgfQorCisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAvLyBTdHJlYW1zIGEgdmFsdWUgKGVpdGhlciBhIHBvaW50ZXIgb3Igbm90KSB0byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJiB2YWx1ZSkgeworICAgIFN0cmVhbUhlbHBlcih0eXBlbmFtZSBpbnRlcm5hbDo6aXNfcG9pbnRlcjxUPjo6dHlwZSgpLCB2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZWxzZQorICAvLyBTdHJlYW1zIGEgbm9uLXBvaW50ZXIgdmFsdWUgdG8gdGhpcyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsKSB7CisgICAgLy8gU29tZSBsaWJyYXJpZXMgb3ZlcmxvYWQgPDwgZm9yIFNUTCBjb250YWluZXJzLiAgVGhlc2UKKyAgICAvLyBvdmVybG9hZHMgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgaW5zdGVhZCBvZiA6OnN0ZC4KKyAgICAvLworICAgIC8vIEMrKydzIHN5bWJvbCBsb29rdXAgcnVsZSAoaS5lLiBLb2VuaWcgbG9va3VwKSBzYXlzIHRoYXQgdGhlc2UKKyAgICAvLyBvdmVybG9hZHMgYXJlIHZpc2libGUgaW4gZWl0aGVyIHRoZSBzdGQgbmFtZXNwYWNlIG9yIHRoZSBnbG9iYWwKKyAgICAvLyBuYW1lc3BhY2UsIGJ1dCBub3Qgb3RoZXIgbmFtZXNwYWNlcywgaW5jbHVkaW5nIHRoZSB0ZXN0aW5nCisgICAgLy8gbmFtZXNwYWNlIHdoaWNoIEdvb2dsZSBUZXN0J3MgTWVzc2FnZSBjbGFzcyBpcyBpbi4KKyAgICAvLworICAgIC8vIFRvIGFsbG93IFNUTCBjb250YWluZXJzIChhbmQgb3RoZXIgdHlwZXMgdGhhdCBoYXMgYSA8PCBvcGVyYXRvcgorICAgIC8vIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UpIHRvIGJlIHVzZWQgaW4gR29vZ2xlIFRlc3QKKyAgICAvLyBhc3NlcnRpb25zLCB0ZXN0aW5nOjpNZXNzYWdlIG11c3QgYWNjZXNzIHRoZSBjdXN0b20gPDwgb3BlcmF0b3IKKyAgICAvLyBmcm9tIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgV2l0aCB0aGlzIHVzaW5nIGRlY2xhcmF0aW9uLAorICAgIC8vIG92ZXJsb2FkcyBvZiA8PCBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGFuZCB0aG9zZQorICAgIC8vIHZpc2libGUgdmlhIEtvZW5pZyBsb29rdXAgYXJlIGJvdGggZXhwb3NlZCBpbiB0aGlzIGZ1bmN0aW9uLgorICAgIHVzaW5nIDo6b3BlcmF0b3IgPDw7CisgICAgKnNzXyA8PCB2YWw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gU3RyZWFtcyBhIHBvaW50ZXIgdmFsdWUgdG8gdGhpcyBvYmplY3QuCisgIC8vCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYW4gb3ZlcmxvYWQgb2YgdGhlIHByZXZpb3VzIG9uZS4gIFdoZW4geW91CisgIC8vIHN0cmVhbSBhIHBvaW50ZXIgdG8gYSBNZXNzYWdlLCB0aGlzIGRlZmluaXRpb24gd2lsbCBiZSB1c2VkIGFzIGl0CisgIC8vIGlzIG1vcmUgc3BlY2lhbGl6ZWQuICAoVGhlIEMrKyBTdGFuZGFyZCwgc2VjdGlvbgorICAvLyBbdGVtcC5mdW5jLm9yZGVyXS4pICBJZiB5b3Ugc3RyZWFtIGEgbm9uLXBvaW50ZXIsIHRoZW4gdGhlCisgIC8vIHByZXZpb3VzIGRlZmluaXRpb24gd2lsbCBiZSB1c2VkLgorICAvLworICAvLyBUaGUgcmVhc29uIGZvciB0aGlzIG92ZXJsb2FkIGlzIHRoYXQgc3RyZWFtaW5nIGEgTlVMTCBwb2ludGVyIHRvCisgIC8vIG9zdHJlYW0gaXMgdW5kZWZpbmVkIGJlaGF2aW9yLiAgRGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciwgeW91CisgIC8vIG1heSBnZXQgIjAiLCAiKG5pbCkiLCAiKG51bGwpIiwgb3IgYW4gYWNjZXNzIHZpb2xhdGlvbi4gIFRvCisgIC8vIGVuc3VyZSBjb25zaXN0ZW50IHJlc3VsdCBhY3Jvc3MgY29tcGlsZXJzLCB3ZSBhbHdheXMgdHJlYXQgTlVMTAorICAvLyBhcyAiKG51bGwpIi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChUKiBjb25zdCYgcG9pbnRlcikgeyAgLy8gTk9MSU5UCisgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgKnNzXyA8PCAiKG51bGwpIjsKKyAgICB9IGVsc2UgeworICAgICAgKnNzXyA8PCBwb2ludGVyOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgorCisgIC8vIFNpbmNlIHRoZSBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgYXJlIG92ZXJsb2FkZWQgZm9yIGJvdGggbmFycm93CisgIC8vIGFuZCB3aWRlIHN0cmVhbXMsIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGlzIHNwZWNpYWxpemVkIGRlZmluaXRpb24KKyAgLy8gb2Ygb3BlcmF0b3IgPDwsIGV2ZW4gdGhvdWdoIGl0cyBib2R5IGlzIHRoZSBzYW1lIGFzIHRoZQorICAvLyB0ZW1wbGF0aXplZCB2ZXJzaW9uIGFib3ZlLiAgV2l0aG91dCB0aGlzIGRlZmluaXRpb24sIHN0cmVhbWluZworICAvLyBlbmRsIG9yIG90aGVyIGJhc2ljIElPIG1hbmlwdWxhdG9ycyB0byBNZXNzYWdlIHdpbGwgY29uZnVzZSB0aGUKKyAgLy8gY29tcGlsZXIuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KEJhc2ljTmFycm93SW9NYW5pcCB2YWwpIHsKKyAgICAqc3NfIDw8IHZhbDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBJbnN0ZWFkIG9mIDEvMCwgd2Ugd2FudCB0byBzZWUgdHJ1ZS9mYWxzZSBmb3IgYm9vbCB2YWx1ZXMuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGJvb2wgYikgeworICAgIHJldHVybiAqdGhpcyA8PCAoYiA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICB9CisKKyAgLy8gVGhlc2UgdHdvIG92ZXJsb2FkcyBhbGxvdyBzdHJlYW1pbmcgYSB3aWRlIEMgc3RyaW5nIHRvIGEgTWVzc2FnZQorICAvLyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IHdjaGFyX3QqIHdpZGVfY19zdHIpOworICBNZXNzYWdlJiBvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworICAvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorICAvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCA6OnN0ZDo6d3N0cmluZyYgd3N0cik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisgIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisgIC8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6d3N0cmluZyYgd3N0cik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisgIC8vIEdldHMgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3Qgc28gZmFyIGFzIGFuIHN0ZDo6c3RyaW5nLgorICAvLyBFYWNoICdcMCcgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBzdGQ6OnN0cmluZyBHZXRTdHJpbmcoKSBjb25zdDsKKworIHByaXZhdGU6CisKKyNpZiBHVEVTVF9PU19TWU1CSUFOCisgIC8vIFRoZXNlIGFyZSBuZWVkZWQgYXMgdGhlIE5va2lhIFN5bWJpYW4gQ29tcGlsZXIgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCisgIC8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiBUaGUgTm9raWEgY29tcGlsZXIgX2Nhbl8KKyAgLy8gZGVjaWRlIGJldHdlZW4gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBUIGFuZCBUKiwgc28gYQorICAvLyB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3JrcywgYW5kIHdlIGNhbiBvdmVybG9hZCBvbiB0aGF0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgU3RyZWFtSGVscGVyKGludGVybmFsOjp0cnVlX3R5cGUgLyppc19wb2ludGVyKi8sIFQqIHBvaW50ZXIpIHsKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAqc3NfIDw8ICIobnVsbCkiOworICAgIH0gZWxzZSB7CisgICAgICAqc3NfIDw8IHBvaW50ZXI7CisgICAgfQorICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OmZhbHNlX3R5cGUgLyppc19wb2ludGVyKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiB2YWx1ZSkgeworICAgIC8vIFNlZSB0aGUgY29tbWVudHMgaW4gTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYpIGFib3ZlIGZvciB3aHkKKyAgICAvLyB3ZSBuZWVkIHRoaXMgdXNpbmcgc3RhdGVtZW50LgorICAgIHVzaW5nIDo6b3BlcmF0b3IgPDw7CisgICAgKnNzXyA8PCB2YWx1ZTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCisKKyAgLy8gV2UnbGwgaG9sZCB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBoZXJlLgorICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjpzdGQ6OnN0cmluZ3N0cmVhbT4gc3NfOworCisgIC8vIFdlIGRlY2xhcmUgKGJ1dCBkb24ndCBpbXBsZW1lbnQpIHRoaXMgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgLy8gZnJvbSBpbXBsZW1lbnRpbmcgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmKTsKK307CisKKy8vIFN0cmVhbXMgYSBNZXNzYWdlIHRvIGFuIG9zdHJlYW0uCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNZXNzYWdlJiBzYikgeworICByZXR1cm4gb3MgPDwgc2IuR2V0U3RyaW5nKCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENvbnZlcnRzIGEgc3RyZWFtYWJsZSB2YWx1ZSB0byBhbiBzdGQ6OnN0cmluZy4gIEEgTlVMTCBwb2ludGVyIGlzCisvLyBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBXaGVuIHRoZSBpbnB1dCB2YWx1ZSBpcyBhIDo6c3RyaW5nLAorLy8gOjpzdGQ6OnN0cmluZywgOjp3c3RyaW5nLCBvciA6OnN0ZDo6d3N0cmluZyBvYmplY3QsIGVhY2ggTlVMCisvLyBjaGFyYWN0ZXIgaW4gaXQgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKGNvbnN0IFQmIHN0cmVhbWFibGUpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkgPDwgc3RyZWFtYWJsZSkuR2V0U3RyaW5nKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgdGhlIFN0cmluZyBjbGFzcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQorLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gVGhleSBzaG91bGQgbm90IHVzZWQKKy8vIGJ5IGNvZGUgZXh0ZXJuYWwgdG8gR29vZ2xlIFRlc3QuCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBpcyAjaW5jbHVkZWQgYnkgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgorLy8gSXQgc2hvdWxkIG5vdCBiZSAjaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gc3RyaW5nLmggaXMgbm90IGd1YXJhbnRlZWQgdG8gcHJvdmlkZSBzdHJjcHkgb24gQysrIEJ1aWxkZXIuCisjIGluY2x1ZGUgPG1lbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gU3RyaW5nIC0gYW4gYWJzdHJhY3QgY2xhc3MgaG9sZGluZyBzdGF0aWMgc3RyaW5nIHV0aWxpdGllcy4KK2NsYXNzIEdURVNUX0FQSV8gU3RyaW5nIHsKKyBwdWJsaWM6CisgIC8vIFN0YXRpYyB1dGlsaXR5IG1ldGhvZHMKKworICAvLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4gIFRoZQorICAvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4gdmFsdWUgdXNpbmcKKyAgLy8gZGVsZXRlW10uICBSZXR1cm5zIHRoZSBjbG9uZWQgc3RyaW5nLCBvciBOVUxMIGlmIHRoZSBpbnB1dCBpcworICAvLyBOVUxMLgorICAvLworICAvLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHN0cmR1cCgpIGluIHN0cmluZy5oLCB3aGljaCBhbGxvY2F0ZXMKKyAgLy8gbWVtb3J5IHVzaW5nIG1hbGxvYygpLgorICBzdGF0aWMgY29uc3QgY2hhciogQ2xvbmVDU3RyaW5nKGNvbnN0IGNoYXIqIGNfc3RyKTsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdpbmRvd3MgQ0UgZG9lcyBub3QgaGF2ZSB0aGUgJ0FOU0knIHZlcnNpb25zIG9mIFdpbjMyIEFQSXMuIFRvIGJlCisgIC8vIGFibGUgdG8gcGFzcyBzdHJpbmdzIHRvIFdpbjMyIEFQSXMgb24gQ0Ugd2UgbmVlZCB0byBjb252ZXJ0IHRoZW0KKyAgLy8gdG8gJ1VuaWNvZGUnLCBVVEYtMTYuCisKKyAgLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZworICAvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisgIC8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSB3aWRlIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKyAgLy8gaW5wdXQgaXMgTlVMTC4KKyAgLy8KKyAgLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEFOU0kgY29kZXBhZ2UgKENQX0FDUCkgdG8KKyAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlCisgIC8vIEMgcnVudGltZS4KKyAgc3RhdGljIExQQ1dTVFIgQW5zaVRvVXRmMTYoY29uc3QgY2hhciogY19zdHIpOworCisgIC8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKKyAgLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorICAvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgQU5TSSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCisgIC8vIGlucHV0IGlzIE5VTEwuCisgIC8vCisgIC8vIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bworICAvLyBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBTlNJIHZlcnNpb25zIG9mIFdpbjMyIGNhbGxzIGFuZCB0aGUKKyAgLy8gQyBydW50aW1lLgorICBzdGF0aWMgY29uc3QgY2hhciogVXRmMTZUb0Fuc2koTFBDV1NUUiB1dGYxNl9zdHIpOworI2VuZGlmCisKKyAgLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSBzdHJjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCisgIC8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgc3RhdGljIGJvb2wgQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyKiBsaHMsIGNvbnN0IGNoYXIqIHJocyk7CisKKyAgLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KKyAgLy8gTlVMTCB3aWxsIGJlIGNvbnZlcnRlZCB0byAiKG51bGwpIi4gIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZworICAvLyB0aGUgY29udmVyc2lvbiwgIihmYWlsZWQgdG8gY29udmVydCBmcm9tIHdpZGUgc3RyaW5nKSIgaXMKKyAgLy8gcmV0dXJuZWQuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cik7CisKKyAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUKKyAgLy8gY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHdjc2NtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKyAgLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsIGNvbnN0IHdjaGFyX3QqIHJocyk7CisKKyAgLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQorICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSBzdHJjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgorICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgc3RhdGljIGJvb2wgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyKiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzKTsKKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuCisgIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFCisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBPbiBHTlUgcGxhdGZvcm0gdGhpcyBtZXRob2QgdXNlcyB3Y3NjYXNlY21wCisgIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUKKyAgLy8gY3VycmVudCBsb2NhbGUuCisgIHN0YXRpYyBib29sIENhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGlnbm9yaW5nCisgIC8vIGNhc2UuIEFueSBzdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhbiBlbXB0eSBzdWZmaXguCisgIHN0YXRpYyBib29sIEVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCk7CisKKyAgLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiUwMmQiLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0SW50V2lkdGgyKGludCB2YWx1ZSk7ICAvLyAiJTAyZCIgZm9yIHdpZHRoID09IDIKKworICAvLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJVgiLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0SGV4SW50KGludCB2YWx1ZSk7CisKKyAgLy8gRm9ybWF0cyBhIGJ5dGUgYXMgIiUwMlgiLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Qnl0ZSh1bnNpZ25lZCBjaGFyIHZhbHVlKTsKKworIHByaXZhdGU6CisgIFN0cmluZygpOyAgLy8gTm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZC4KK307ICAvLyBjbGFzcyBTdHJpbmcKKworLy8gR2V0cyB0aGUgY29udGVudCBvZiB0aGUgc3RyaW5nc3RyZWFtJ3MgYnVmZmVyIGFzIGFuIHN0ZDo6c3RyaW5nLiAgRWFjaCAnXDAnCisvLyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBTdHJpbmdTdHJlYW1Ub1N0cmluZyg6OnN0ZDo6c3RyaW5nc3RyZWFtKiBzdHJlYW0pOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBHb29nbGUgVGVzdCBmaWxlcGF0aCB1dGlsaXRpZXMKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBpbiA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4uCisvLyBEbyBub3QgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlIHNlcGFyYXRlbHkhCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRmlsZVBhdGggLSBhIGNsYXNzIGZvciBmaWxlIGFuZCBkaXJlY3RvcnkgcGF0aG5hbWUgbWFuaXB1bGF0aW9uIHdoaWNoCisvLyBoYW5kbGVzIHBsYXRmb3JtLXNwZWNpZmljIGNvbnZlbnRpb25zIChsaWtlIHRoZSBwYXRobmFtZSBzZXBhcmF0b3IpLgorLy8gVXNlZCBmb3IgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFtaW5nIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciB4bWwgb3V0cHV0LgorLy8gRXhjZXB0IGZvciBTZXQgbWV0aG9kcywgYWxsIG1ldGhvZHMgYXJlIGNvbnN0IG9yIHN0YXRpYywgd2hpY2ggcHJvdmlkZXMgYW4KKy8vICJpbW11dGFibGUgdmFsdWUgb2JqZWN0IiAtLSB1c2VmdWwgZm9yIHBlYWNlIG9mIG1pbmQuCisvLyBBIEZpbGVQYXRoIHdpdGggYSB2YWx1ZSBlbmRpbmcgaW4gYSBwYXRoIHNlcGFyYXRvciAoImxpa2UvdGhpcy8iKSByZXByZXNlbnRzCisvLyBhIGRpcmVjdG9yeSwgb3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGEgZmlsZS4gSW4gZWl0aGVyIGNhc2UsCisvLyBpdCBtYXkgb3IgbWF5IG5vdCByZXByZXNlbnQgYW4gYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5IGluIHRoZSBmaWxlIHN5c3RlbS4KKy8vIE5hbWVzIGFyZSBOT1QgY2hlY2tlZCBmb3Igc3ludGF4IGNvcnJlY3RuZXNzIC0tIG5vIGNoZWNraW5nIGZvciBpbGxlZ2FsCisvLyBjaGFyYWN0ZXJzLCBtYWxmb3JtZWQgcGF0aHMsIGV0Yy4KKworY2xhc3MgR1RFU1RfQVBJXyBGaWxlUGF0aCB7CisgcHVibGljOgorICBGaWxlUGF0aCgpIDogcGF0aG5hbWVfKCIiKSB7IH0KKyAgRmlsZVBhdGgoY29uc3QgRmlsZVBhdGgmIHJocykgOiBwYXRobmFtZV8ocmhzLnBhdGhuYW1lXykgeyB9CisKKyAgZXhwbGljaXQgRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhuYW1lKSA6IHBhdGhuYW1lXyhwYXRobmFtZSkgeworICAgIE5vcm1hbGl6ZSgpOworICB9CisKKyAgRmlsZVBhdGgmIG9wZXJhdG9yPShjb25zdCBGaWxlUGF0aCYgcmhzKSB7CisgICAgU2V0KHJocyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBTZXQoY29uc3QgRmlsZVBhdGgmIHJocykgeworICAgIHBhdGhuYW1lXyA9IHJocy5wYXRobmFtZV87CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfOyB9CisgIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciAiIiBpZiB1bnN1Y2Nlc3NmdWwuCisgIHN0YXRpYyBGaWxlUGF0aCBHZXRDdXJyZW50RGlyKCk7CisKKyAgLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKKyAgLy8gZXh0ZW5zaW9uID0gInhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuIElmIG51bWJlciBpcyBncmVhdGVyCisgIC8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorICBzdGF0aWMgRmlsZVBhdGggTWFrZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbik7CisKKyAgLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIHJlbGF0aXZlX3BhdGggPSAidGVzdC54bWwiLAorICAvLyByZXR1cm5zICJkaXIvdGVzdC54bWwiLgorICAvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorICBzdGF0aWMgRmlsZVBhdGggQ29uY2F0UGF0aHMoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiByZWxhdGl2ZV9wYXRoKTsKKworICAvLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCisgIC8vIHdpbGwgYmUgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24gb3IKKyAgLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24KKyAgLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCisgIC8vIHRoYXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4KKyAgLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcworICAvLyBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lIC0tIHRoZXkgY291bGQgYm90aCBwaWNrIHRoZSBzYW1lIGZpbGVuYW1lLgorICBzdGF0aWMgRmlsZVBhdGggR2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhdGggaXMgIiIuCisgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXy5lbXB0eSgpOyB9CisKKyAgLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmVzIGl0IGFuZCByZXR1cm5zCisgIC8vIHRoZSBuYW1lLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBuYW1lIHN0cmluZyB1bm1vZGlmaWVkLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgorICBGaWxlUGF0aCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4KKyAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucworICAvLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdAorICAvLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCisgIEZpbGVQYXRoIFJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdDsKKworICAvLyBSZW1vdmVGaWxlTmFtZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCB3aXRoIHRoZSBmaWxlbmFtZSByZW1vdmVkLgorICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCisgIC8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKKyAgLy8gRmlsZVBhdGgoIi4vIikgb3IsIG9uIFdpbmRvd3MsIEZpbGVQYXRoKCIuXFwiKS4gSWYgdGhlIGZpbGVwYXRoIGRvZXMKKyAgLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCisgIEZpbGVQYXRoIFJlbW92ZUZpbGVOYW1lKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIHJlbW92ZWQuCisgIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKKyAgLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90CisgIC8vIGZvdW5kLCByZXR1cm5zIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRmlsZVBhdGguCisgIEZpbGVQYXRoIFJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0OworCisgIC8vIENyZWF0ZXMgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKKyAgLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZQorICAvLyBkaXJlY3RvcmllcyBmb3IgYW55IHJlYXNvbi4gV2lsbCBhbHNvIHJldHVybiBmYWxzZSBpZiB0aGUgRmlsZVBhdGggZG9lcworICAvLyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5ICh0aGF0IGlzLCBpdCBkb2Vzbid0IGVuZCB3aXRoIGEgcGF0aCBzZXBhcmF0b3IpLgorICBib29sIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBjb25zdDsKKworICAvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgorICAvLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCisgIC8vIGRpcmVjdG9yeSBmb3IgYW55IHJlYXNvbiwgaW5jbHVkaW5nIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGRvZXMgbm90CisgIC8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgorICBib29sIENyZWF0ZUZvbGRlcigpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBkZXNjcmliZXMgc29tZXRoaW5nIGluIHRoZSBmaWxlLXN5c3RlbSwKKyAgLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlciwgYW5kIHRoYXQgc29tZXRoaW5nIGV4aXN0cy4KKyAgYm9vbCBGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQorICAvLyB0aGF0IGV4aXN0cy4KKyAgYm9vbCBEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIHdoaWNoIGluZGljYXRlcyB0aGF0CisgIC8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgIC8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgorICBib29sIElzRGlyZWN0b3J5KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCisgIC8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKKyAgYm9vbCBJc1Jvb3REaXJlY3RvcnkoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGFuIGFic29sdXRlIHBhdGguCisgIGJvb2wgSXNBYnNvbHV0ZVBhdGgoKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFJlcGxhY2VzIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3IuCisgIC8vIEZvciBleGFtcGxlLCAiYmFyLy8vZm9vIiBiZWNvbWVzICJiYXIvZm9vIi4gRG9lcyBub3QgZWxpbWluYXRlIG90aGVyCisgIC8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgorICAvLworICAvLyBBIHBhdGhuYW1lIHdpdGggbXVsdGlwbGUgY29uc2VjdXRpdmUgc2VwYXJhdG9ycyBtYXkgb2NjdXIgZWl0aGVyIHRocm91Z2gKKyAgLy8gdXNlciBlcnJvciBvciBhcyBhIHJlc3VsdCBvZiBzb21lIHNjcmlwdHMgb3IgQVBJcyB0aGF0IGdlbmVyYXRlIGEgcGF0aG5hbWUKKyAgLy8gd2l0aCBhIHRyYWlsaW5nIHNlcGFyYXRvci4gT24gb3RoZXIgcGxhdGZvcm1zIHRoZSBzYW1lIEFQSSBvciBzY3JpcHQKKyAgLy8gbWF5IE5PVCBnZW5lcmF0ZSBhIHBhdGhuYW1lIHdpdGggYSB0cmFpbGluZyAiLyIuIFRoZW4gZWxzZXdoZXJlIHRoYXQKKyAgLy8gcGF0aG5hbWUgbWF5IGhhdmUgYW5vdGhlciAiLyIgYW5kIHBhdGhuYW1lIGNvbXBvbmVudHMgYWRkZWQgdG8gaXQsCisgIC8vIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHRoZSBzZXBhcmF0b3IgYWxyZWFkeSBiZWluZyB0aGVyZS4KKyAgLy8gVGhlIHNjcmlwdCBsYW5ndWFnZSBhbmQgb3BlcmF0aW5nIHN5c3RlbSBtYXkgYWxsb3cgcGF0aHMgbGlrZSAiZm9vLy9iYXIiCisgIC8vIGJ1dCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgaW4gRmlsZVBhdGggd2lsbCBub3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LiBJbgorICAvLyBwYXJ0aWN1bGFyLCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBvbmx5IHJlbW92ZXMgb25lIHNlcGFyYXRvciwgYW5kCisgIC8vIGl0IGlzIGNhbGxlZCBpbiBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgYXNzdW1pbmcgdGhhdCBpdCB3aWxsIGNoYW5nZQorICAvLyBhIHBhdGhuYW1lIGZyb20gZGlyZWN0b3J5IHN5bnRheCAodHJhaWxpbmcgc2VwYXJhdG9yKSB0byBmaWxlbmFtZSBzeW50YXguCisgIC8vCisgIC8vIE9uIFdpbmRvd3MgdGhpcyBtZXRob2QgYWxzbyByZXBsYWNlcyB0aGUgYWx0ZXJuYXRlIHBhdGggc2VwYXJhdG9yICcvJyB3aXRoCisgIC8vIHRoZSBwcmltYXJ5IHBhdGggc2VwYXJhdG9yICdcXCcsIHNvIHRoYXQgZm9yIGV4YW1wbGUgImJhclxcL1xcZm9vIiBiZWNvbWVzCisgIC8vICJiYXJcXGZvbyIuCisKKyAgdm9pZCBOb3JtYWxpemUoKTsKKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbgorICAvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCisgIC8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCisgIGNvbnN0IGNoYXIqIEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIHBhdGhuYW1lXzsKK307ICAvLyBjbGFzcyBGaWxlUGF0aAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXworLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGd0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkCisvLyB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgNTAgdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCA1MAorLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIG9uZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgorLy8gUGxlYXNlIGNvbnRhY3QgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBtb3JlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisKKworLy8gI2lmZGVmIF9fR05VQ19fIGlzIHRvbyBnZW5lcmFsIGhlcmUuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZ2NjIHdpdGhvdXQgdXNpbmcKKy8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuCisjIGlmIEdURVNUX0hBU19DWFhBQklfSF8KKyMgIGluY2x1ZGUgPGN4eGFiaS5oPgorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisjICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+CisjIGVuZGlmICAvLyBHVEVTVF9IQVNIX0NYWEFCSV9IXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KKy8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKKy8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSB7CisjIGlmIEdURVNUX0hBU19SVFRJCisKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7CisjICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpCisgIGludCBzdGF0dXMgPSAwOworICAvLyBnY2MncyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlaWQoVCkubmFtZSgpIG1hbmdsZXMgdGhlIHR5cGUgbmFtZSwKKyAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4KKyMgICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCisgIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7CisjICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8KKyAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOworICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lX3N0cihzdGF0dXMgPT0gMCA/IHJlYWRhYmxlX25hbWUgOiBuYW1lKTsKKyAgZnJlZShyZWFkYWJsZV9uYW1lKTsKKyAgcmV0dXJuIG5hbWVfc3RyOworIyAgZWxzZQorICByZXR1cm4gbmFtZTsKKyMgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IF9fSFBfYUNDCisKKyMgZWxzZQorCisgIHJldHVybiAiPHR5cGU+IjsKKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKK30KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUKKy8vIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiB0byBlbnN1cmUgdGhhdAorLy8gdHdvIHR5cGVzIGFyZSBlcXVhbC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBBc3NlcnRUeXBlRXE7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFzc2VydFR5cGVFcTxULCBUPiB7CisgIHR5cGVkZWYgYm9vbCB0eXBlOworfTsKKworLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzCisvLyB0ZW1wbGF0ZSBUeXBlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHZhcmlhZGljIHRlbXBsYXRlcworLy8gKGUuZy4gVHlwZXM8aW50PiwgVHlwZTxpbnQsIGRvdWJsZT4sIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndAorLy8gc3VwcG9ydCBkaXJlY3RseS4KK3N0cnVjdCBOb25lIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KKy8vIHJlcHJlc2VudCB0eXBlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVHlwZXNOPFQxLCBUMiwgLi4uLCBUTj4KKy8vIHJlcHJlc2VudHMgYSB0eXBlIGxpc3Qgd2l0aCBOIHR5cGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKSBpbiBpdC4KKy8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBsaXN0LCBhbmQgVGFpbCBmb3IgdGhlIHJlc3Qgb2YgdGhlCisvLyBsaXN0LgorCisvLyBUaGUgZW1wdHkgdHlwZSBsaXN0Lgorc3RydWN0IFR5cGVzMCB7fTsKKworLy8gVHlwZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitzdHJ1Y3QgVHlwZXMxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXMyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTxUMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorc3RydWN0IFR5cGVzMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI8VDIsIFQzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgorc3RydWN0IFR5cGVzNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM8VDIsIFQzLCBUND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitzdHJ1Y3QgVHlwZXM1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitzdHJ1Y3QgVHlwZXM2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK3N0cnVjdCBUeXBlczcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitzdHJ1Y3QgVHlwZXM4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitzdHJ1Y3QgVHlwZXMxMCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzMTEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgorc3RydWN0IFR5cGVzMTIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczEzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgorc3RydWN0IFR5cGVzMTQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzMTUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK3N0cnVjdCBUeXBlczE2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzMTcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzMTggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK3N0cnVjdCBUeXBlczE5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorc3RydWN0IFR5cGVzMjAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitzdHJ1Y3QgVHlwZXMyMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+CitzdHJ1Y3QgVHlwZXMyMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorc3RydWN0IFR5cGVzMjMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitzdHJ1Y3QgVHlwZXMyNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitzdHJ1Y3QgVHlwZXMyNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjY+CitzdHJ1Y3QgVHlwZXMyNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgorc3RydWN0IFR5cGVzMjcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXMyOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitzdHJ1Y3QgVHlwZXMyOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK3N0cnVjdCBUeXBlczMwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorc3RydWN0IFR5cGVzMzEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorc3RydWN0IFR5cGVzMzIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KK3N0cnVjdCBUeXBlczMzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgorc3RydWN0IFR5cGVzMzQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgorc3RydWN0IFR5cGVzMzUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2Pgorc3RydWN0IFR5cGVzMzYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK3N0cnVjdCBUeXBlczM3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgorc3RydWN0IFR5cGVzMzggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgorc3RydWN0IFR5cGVzMzkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK3N0cnVjdCBUeXBlczQwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitzdHJ1Y3QgVHlwZXM0MSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK3N0cnVjdCBUeXBlczQyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczQzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgorc3RydWN0IFR5cGVzNDQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzNDUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzNDYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK3N0cnVjdCBUeXBlczQ3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgorc3RydWN0IFR5cGVzNDggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzNDkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK3N0cnVjdCBUeXBlczUwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCisvLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCisvLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKKy8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+CisvLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCisvLyBlcnJvcnMpLgorLy8KKy8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCisvLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCisvLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQorLy8gVHlwZXMgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDEzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDE5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDI1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDMxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDM3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0NSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ1MCA9IGludGVybmFsOjpOb25lPgorc3RydWN0IFR5cGVzIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVHlwZXM8aW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3N0cnVjdCBUeXBlczxUMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxPFQxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjxUMSwgVDI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM8VDEsIFQyLCBUMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0Mj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIFQ0OCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCisKKy8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCisvLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKKy8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAorLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQorLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KKy8vCisvLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCisvLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgorc3RydWN0IFRlbXBsYXRlU2VsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBCaW5kIHsKKyAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKKyAgfTsKK307CisKKyMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKKyAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQorCisvLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisvLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKKy8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKKy8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTm9uZVQge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKKy8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKKy8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCisvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgorc3RydWN0IFRlbXBsYXRlczAge307CisKKy8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+CitzdHJ1Y3QgVGVtcGxhdGVzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KK3N0cnVjdCBUZW1wbGF0ZXMyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+CitzdHJ1Y3QgVGVtcGxhdGVzMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzxUMiwgVDMsIFQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+CitzdHJ1Y3QgVGVtcGxhdGVzNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KK3N0cnVjdCBUZW1wbGF0ZXM3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+CitzdHJ1Y3QgVGVtcGxhdGVzOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KK3N0cnVjdCBUZW1wbGF0ZXMxMCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgorc3RydWN0IFRlbXBsYXRlczExIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+CitzdHJ1Y3QgVGVtcGxhdGVzMTIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+CitzdHJ1Y3QgVGVtcGxhdGVzMTMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KK3N0cnVjdCBUZW1wbGF0ZXMxNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgorc3RydWN0IFRlbXBsYXRlczE1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczE2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+CitzdHJ1Y3QgVGVtcGxhdGVzMTcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgorc3RydWN0IFRlbXBsYXRlczE4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzMTkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgorc3RydWN0IFRlbXBsYXRlczIwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgorc3RydWN0IFRlbXBsYXRlczIxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXMyMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KK3N0cnVjdCBUZW1wbGF0ZXMyMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgorc3RydWN0IFRlbXBsYXRlczI0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczI1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+CitzdHJ1Y3QgVGVtcGxhdGVzMjYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgorc3RydWN0IFRlbXBsYXRlczI3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+CitzdHJ1Y3QgVGVtcGxhdGVzMjggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXMyOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzMzAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KK3N0cnVjdCBUZW1wbGF0ZXMzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+CitzdHJ1Y3QgVGVtcGxhdGVzMzIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzMzMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgorc3RydWN0IFRlbXBsYXRlczM0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgorc3RydWN0IFRlbXBsYXRlczM1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzMzYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+CitzdHJ1Y3QgVGVtcGxhdGVzMzcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KK3N0cnVjdCBUZW1wbGF0ZXMzOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzMzkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KK3N0cnVjdCBUZW1wbGF0ZXM0MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+CitzdHJ1Y3QgVGVtcGxhdGVzNDEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+CitzdHJ1Y3QgVGVtcGxhdGVzNDIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0Mj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM0MyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNDQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+CitzdHJ1Y3QgVGVtcGxhdGVzNDUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczQ2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczQ3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+CitzdHJ1Y3QgVGVtcGxhdGVzNDggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzNDkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OSwgR1RFU1RfVEVNUExBVEVfIFQ1MD4KK3N0cnVjdCBUZW1wbGF0ZXM1MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+CisvLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNTAgPSBOb25lVD4KK3N0cnVjdCBUZW1wbGF0ZXMgeworICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUZW1wbGF0ZXM8Tm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTxUMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQxLCBUMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0Mz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCisvLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCisvLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKKy8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVMaXN0IHsKKyAgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK3N0cnVjdCBUeXBlTGlzdDxUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+Ojp0eXBlIHR5cGU7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisKKy8vIER1ZSB0byBDKysgcHJlcHJvY2Vzc29yIHdlaXJkbmVzcywgd2UgbmVlZCBkb3VibGUgaW5kaXJlY3Rpb24gdG8KKy8vIGNvbmNhdGVuYXRlIHR3byB0b2tlbnMgd2hlbiBvbmUgb2YgdGhlbSBpcyBfX0xJTkVfXy4gIFdyaXRpbmcKKy8vCisvLyAgIGZvbyAjIyBfX0xJTkVfXworLy8KKy8vIHdpbGwgcmVzdWx0IGluIHRoZSB0b2tlbiBmb29fX0xJTkVfXywgaW5zdGVhZCBvZiBmb28gZm9sbG93ZWQgYnkKKy8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlCisvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL21pc2MtdGVjaG5pY2FsLWlzc3Vlcy5odG1sI2ZhcS0zOS42CisjZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl8oZm9vLCBiYXIpIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikKKyNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKSBmb28gIyMgYmFyCisKK2NsYXNzIFByb3RvY29sTWVzc2FnZTsKK25hbWVzcGFjZSBwcm90bzIgeyBjbGFzcyBNZXNzYWdlOyB9CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisKK2NsYXNzIEFzc2VydGlvblJlc3VsdDsgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhbiBhc3NlcnRpb24uCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmFpbHVyZSBtZXNzYWdlLgorY2xhc3MgVGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIHRlc3QuCitjbGFzcyBUZXN0SW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QuCitjbGFzcyBUZXN0UGFydFJlc3VsdDsgICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYSB0ZXN0IHBhcnQuCitjbGFzcyBVbml0VGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbGxlY3Rpb24gb2YgdGVzdCBjYXNlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50LgorY2xhc3MgU2NvcGVkVHJhY2U7ICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBzY29wZWQgdHJhY2UuCitjbGFzcyBUZXN0SW5mb0ltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVGVzdEluZm8KK2NsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdAorCisvLyBIb3cgbWFueSB0aW1lcyBJbml0R29vZ2xlVGVzdCgpIGhhcyBiZWVuIGNhbGxlZC4KK0dURVNUX0FQSV8gZXh0ZXJuIGludCBnX2luaXRfZ3Rlc3RfY291bnQ7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXTsKKworLy8gVHdvIG92ZXJsb2FkZWQgaGVscGVycyBmb3IgY2hlY2tpbmcgYXQgY29tcGlsZSB0aW1lIHdoZXRoZXIgYW4KKy8vIGV4cHJlc3Npb24gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbCAoaS5lLiBOVUxMIG9yIGFueSAwLXZhbHVlZAorLy8gY29tcGlsZS10aW1lIGludGVncmFsIGNvbnN0YW50KS4gIFRoZWlyIHJldHVybiB2YWx1ZXMgaGF2ZQorLy8gZGlmZmVyZW50IHNpemVzLCBzbyB3ZSBjYW4gdXNlIHNpemVvZigpIHRvIHRlc3Qgd2hpY2ggdmVyc2lvbiBpcworLy8gcGlja2VkIGJ5IHRoZSBjb21waWxlci4gIFRoZXNlIGhlbHBlcnMgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMsIGFzCisvLyB3ZSBvbmx5IG5lZWQgdGhlaXIgc2lnbmF0dXJlcy4KKy8vCisvLyBHaXZlbiBJc051bGxMaXRlcmFsSGVscGVyKHgpLCB0aGUgY29tcGlsZXIgd2lsbCBwaWNrIHRoZSBmaXJzdAorLy8gdmVyc2lvbiBpZiB4IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBTZWNyZXQqLCBhbmQgcGljayB0aGUKKy8vIHNlY29uZCB2ZXJzaW9uIG90aGVyd2lzZS4gIFNpbmNlIFNlY3JldCBpcyBhIHNlY3JldCBhbmQgaW5jb21wbGV0ZQorLy8gdHlwZSwgdGhlIG9ubHkgZXhwcmVzc2lvbiBhIHVzZXIgY2FuIHdyaXRlIHRoYXQgaGFzIHR5cGUgU2VjcmV0KiBpcworLy8gYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4gIFRoZXJlZm9yZSwgd2Uga25vdyB0aGF0IHggaXMgYSBudWxsCisvLyBwb2ludGVyIGxpdGVyYWwgaWYgYW5kIG9ubHkgaWYgdGhlIGZpcnN0IHZlcnNpb24gaXMgcGlja2VkIGJ5IHRoZQorLy8gY29tcGlsZXIuCitjaGFyIElzTnVsbExpdGVyYWxIZWxwZXIoU2VjcmV0KiBwKTsKK2NoYXIgKCZJc051bGxMaXRlcmFsSGVscGVyKC4uLikpWzJdOyAgLy8gTk9MSU5UCisKKy8vIEEgY29tcGlsZS10aW1lIGJvb2wgY29uc3RhbnQgdGhhdCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHggaXMgYQorLy8gbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQgY29tcGlsZS10aW1lCisvLyBpbnRlZ3JhbCBjb25zdGFudCkuCisjaWZkZWYgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlCisvLyBwYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pLgorIyBkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBmYWxzZQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgXAorICAgIChzaXplb2YoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNOdWxsTGl0ZXJhbEhlbHBlcih4KSkgPT0gMSkKKyNlbmRpZiAgLy8gR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ3Rlc3RfbXNnLCBjb25zdCBNZXNzYWdlJiB1c2VyX21zZyk7CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgKGFuZCBvbmx5IGJ5KSBhIGZhaWxlZCBHb29nbGUgVGVzdAorLy8gYXNzZXJ0aW9uIHdoZW4gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSBpcyB0cnVlIChpZiBleGNlcHRpb25zCisvLyBhcmUgZW5hYmxlZCkuICBXZSBkZXJpdmUgaXQgZnJvbSBzdGQ6OnJ1bnRpbWVfZXJyb3IsIHdoaWNoIGlzIGZvcgorLy8gZXJyb3JzIHByZXN1bWFibHkgZGV0ZWN0YWJsZSBvbmx5IGF0IHJ1biB0aW1lLiAgU2luY2UKKy8vIHN0ZDo6cnVudGltZV9lcnJvciBpbmhlcml0cyBmcm9tIHN0ZDo6ZXhjZXB0aW9uLCBtYW55IHRlc3RpbmcKKy8vIGZyYW1ld29ya3Mga25vdyBob3cgdG8gZXh0cmFjdCBhbmQgcHJpbnQgdGhlIG1lc3NhZ2UgaW5zaWRlIGl0LgorY2xhc3MgR1RFU1RfQVBJXyBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiA6IHB1YmxpYyA6OnN0ZDo6cnVudGltZV9lcnJvciB7CisgcHVibGljOgorICBleHBsaWNpdCBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihjb25zdCBUZXN0UGFydFJlc3VsdCYgZmFpbHVyZSk7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzY29wZWQgdHJhY2VzIGluIHVzZXIgcHJvZ3JhbXMuCitjbGFzcyBHVEVTVF9BUElfIFNjb3BlZFRyYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjJ3RvciBwdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8KKyAgLy8gYSB0cmFjZSBzdGFjayBtYWludGFpbmVkIGJ5IEdvb2dsZSBUZXN0LgorICBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgLy8gVGhlIGQndG9yIHBvcHMgdGhlIGluZm8gcHVzaGVkIGJ5IHRoZSBjJ3Rvci4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoZSBkJ3RvciBpcyBub3QgdmlydHVhbCBpbiBvcmRlciB0byBiZSBlZmZpY2llbnQuCisgIC8vIERvbid0IGluaGVyaXQgZnJvbSBTY29wZWRUcmFjZSEKKyAgflNjb3BlZFRyYWNlKCk7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZFRyYWNlKTsKK30gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87ICAvLyBBIFNjb3BlZFRyYWNlIG9iamVjdCBkb2VzIGl0cyBqb2IgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYyd0b3IgYW5kIGQndG9yLiAgVGhlcmVmb3JlIGl0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHVzZWQgb3RoZXJ3aXNlLgorCisvLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KKy8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCisvLworLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgorLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQorLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgorLy8KKy8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyIKKy8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciIKKy8vICAgZXhwZWN0ZWRfdmFsdWU6ICAgICAgIjUiCisvLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2IgorLy8KKy8vIFRoZSBpZ25vcmluZ19jYXNlIHBhcmFtZXRlciBpcyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEKKy8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsCisvLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKTsKKworLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZSgKKyAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCisgICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LAorICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCisgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyByZXByZXNlbnRzIGFuIElFRUUgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisvLyAoZWl0aGVyIHNpbmdsZS1wcmVjaXNpb24gb3IgZG91YmxlLXByZWNpc2lvbiwgZGVwZW5kaW5nIG9uIHRoZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVycykuCisvLworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBkbyBtb3JlIHNvcGhpc3RpY2F0ZWQgbnVtYmVyCisvLyBjb21wYXJpc29uLiAgKER1ZSB0byByb3VuZC1vZmYgZXJyb3IsIGV0YywgaXQncyB2ZXJ5IHVubGlrZWx5IHRoYXQKKy8vIHR3byBmbG9hdGluZy1wb2ludHMgd2lsbCBiZSBlcXVhbCBleGFjdGx5LiAgSGVuY2UgYSBuYWl2ZQorLy8gY29tcGFyaXNvbiBieSB0aGUgPT0gb3BlcmF0aW9uIG9mdGVuIGRvZXNuJ3Qgd29yay4pCisvLworLy8gRm9ybWF0IG9mIElFRUUgZmxvYXRpbmctcG9pbnQ6CisvLworLy8gICBUaGUgbW9zdC1zaWduaWZpY2FudCBiaXQgYmVpbmcgdGhlIGxlZnRtb3N0LCBhbiBJRUVFCisvLyAgIGZsb2F0aW5nLXBvaW50IGxvb2tzIGxpa2UKKy8vCisvLyAgICAgc2lnbl9iaXQgZXhwb25lbnRfYml0cyBmcmFjdGlvbl9iaXRzCisvLworLy8gICBIZXJlLCBzaWduX2JpdCBpcyBhIHNpbmdsZSBiaXQgdGhhdCBkZXNpZ25hdGVzIHRoZSBzaWduIG9mIHRoZQorLy8gICBudW1iZXIuCisvLworLy8gICBGb3IgZmxvYXQsIHRoZXJlIGFyZSA4IGV4cG9uZW50IGJpdHMgYW5kIDIzIGZyYWN0aW9uIGJpdHMuCisvLworLy8gICBGb3IgZG91YmxlLCB0aGVyZSBhcmUgMTEgZXhwb25lbnQgYml0cyBhbmQgNTIgZnJhY3Rpb24gYml0cy4KKy8vCisvLyAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKKy8vICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JRUVFX2Zsb2F0aW5nLXBvaW50X3N0YW5kYXJkLgorLy8KKy8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKKy8vCisvLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorY2xhc3MgRmxvYXRpbmdQb2ludCB7CisgcHVibGljOgorICAvLyBEZWZpbmVzIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhhdCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKKyAgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVXaXRoU2l6ZTxzaXplb2YoUmF3VHlwZSk+OjpVSW50IEJpdHM7CisKKyAgLy8gQ29uc3RhbnRzLgorCisgIC8vICMgb2YgYml0cyBpbiBhIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrQml0Q291bnQgPSA4KnNpemVvZihSYXdUeXBlKTsKKworICAvLyAjIG9mIGZyYWN0aW9uIGJpdHMgaW4gYSBudW1iZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYWN0aW9uQml0Q291bnQgPQorICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0cyAtIDE7CisKKyAgLy8gIyBvZiBleHBvbmVudCBiaXRzIGluIGEgbnVtYmVyLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtFeHBvbmVudEJpdENvdW50ID0ga0JpdENvdW50IC0gMSAtIGtGcmFjdGlvbkJpdENvdW50OworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgc2lnbiBiaXQuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtTaWduQml0TWFzayA9IHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChrQml0Q291bnQgLSAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGZyYWN0aW9uIGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtGcmFjdGlvbkJpdE1hc2sgPQorICAgIH5zdGF0aWNfY2FzdDxCaXRzPigwKSA+PiAoa0V4cG9uZW50Qml0Q291bnQgKyAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGV4cG9uZW50IGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtFeHBvbmVudEJpdE1hc2sgPSB+KGtTaWduQml0TWFzayB8IGtGcmFjdGlvbkJpdE1hc2spOworCisgIC8vIEhvdyBtYW55IFVMUCdzIChVbml0cyBpbiB0aGUgTGFzdCBQbGFjZSkgd2Ugd2FudCB0byB0b2xlcmF0ZSB3aGVuCisgIC8vIGNvbXBhcmluZyB0d28gbnVtYmVycy4gIFRoZSBsYXJnZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBlcnJvciB3ZQorICAvLyBhbGxvdy4gIEEgMCB2YWx1ZSBtZWFucyB0aGF0IHR3byBudW1iZXJzIG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZQorICAvLyB0byBiZSBjb25zaWRlcmVkIGVxdWFsLgorICAvLworICAvLyBUaGUgbWF4aW11bSBlcnJvciBvZiBhIHNpbmdsZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gaXMgMC41CisgIC8vIHVuaXRzIGluIHRoZSBsYXN0IHBsYWNlLiAgT24gSW50ZWwgQ1BVJ3MsIGFsbCBmbG9hdGluZy1wb2ludAorICAvLyBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgd2l0aCA4MC1iaXQgcHJlY2lzaW9uLCB3aGlsZSBkb3VibGUgaGFzIDY0CisgIC8vIGJpdHMuICBUaGVyZWZvcmUsIDQgc2hvdWxkIGJlIGVub3VnaCBmb3Igb3JkaW5hcnkgdXNlLgorICAvLworICAvLyBTZWUgdGhlIGZvbGxvd2luZyBhcnRpY2xlIGZvciBtb3JlIGRldGFpbHMgb24gVUxQOgorICAvLyBodHRwOi8vcmFuZG9tYXNjaWkud29yZHByZXNzLmNvbS8yMDEyLzAyLzI1L2NvbXBhcmluZy1mbG9hdGluZy1wb2ludC1udW1iZXJzLTIwMTItZWRpdGlvbi8KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VWxwcyA9IDQ7CisKKyAgLy8gQ29uc3RydWN0cyBhIEZsb2F0aW5nUG9pbnQgZnJvbSBhIHJhdyBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIE9uIGFuIEludGVsIENQVSwgcGFzc2luZyBhIG5vbi1ub3JtYWxpemVkIE5BTiAoTm90IGEgTnVtYmVyKQorICAvLyBhcm91bmQgbWF5IGNoYW5nZSBpdHMgYml0cywgYWx0aG91Z2ggdGhlIG5ldyB2YWx1ZSBpcyBndWFyYW50ZWVkCisgIC8vIHRvIGJlIGFsc28gYSBOQU4uICBUaGVyZWZvcmUsIGRvbid0IGV4cGVjdCB0aGlzIGNvbnN0cnVjdG9yIHRvCisgIC8vIHByZXNlcnZlIHRoZSBiaXRzIGluIHggd2hlbiB4IGlzIGEgTkFOLgorICBleHBsaWNpdCBGbG9hdGluZ1BvaW50KGNvbnN0IFJhd1R5cGUmIHgpIHsgdV8udmFsdWVfID0geDsgfQorCisgIC8vIFN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmVpbnRlcnByZXRzIGEgYml0IHBhdHRlcm4gYXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIHRlc3QgdGhlIEFsbW9zdEVxdWFscygpIG1ldGhvZC4KKyAgc3RhdGljIFJhd1R5cGUgUmVpbnRlcnByZXRCaXRzKGNvbnN0IEJpdHMgYml0cykgeworICAgIEZsb2F0aW5nUG9pbnQgZnAoMCk7CisgICAgZnAudV8uYml0c18gPSBiaXRzOworICAgIHJldHVybiBmcC51Xy52YWx1ZV87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdGhhdCByZXByZXNlbnQgcG9zaXRpdmUgaW5maW5pdHkuCisgIHN0YXRpYyBSYXdUeXBlIEluZmluaXR5KCkgeworICAgIHJldHVybiBSZWludGVycHJldEJpdHMoa0V4cG9uZW50Qml0TWFzayk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgc3RhdGljIFJhd1R5cGUgTWF4KCk7CisKKyAgLy8gTm9uLXN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmV0dXJucyB0aGUgYml0cyB0aGF0IHJlcHJlc2VudHMgdGhpcyBudW1iZXIuCisgIGNvbnN0IEJpdHMgJmJpdHMoKSBjb25zdCB7IHJldHVybiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZXhwb25lbnRfYml0cygpIGNvbnN0IHsgcmV0dXJuIGtFeHBvbmVudEJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZnJhY3Rpb25fYml0cygpIGNvbnN0IHsgcmV0dXJuIGtGcmFjdGlvbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoaXMgbnVtYmVyLgorICBCaXRzIHNpZ25fYml0KCkgY29uc3QgeyByZXR1cm4ga1NpZ25CaXRNYXNrICYgdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgTkFOIChub3QgYSBudW1iZXIpLgorICBib29sIGlzX25hbigpIGNvbnN0IHsKKyAgICAvLyBJdCdzIGEgTkFOIGlmIHRoZSBleHBvbmVudCBiaXRzIGFyZSBhbGwgb25lcyBhbmQgdGhlIGZyYWN0aW9uCisgICAgLy8gYml0cyBhcmUgbm90IGVudGlyZWx5IHplcm9zLgorICAgIHJldHVybiAoZXhwb25lbnRfYml0cygpID09IGtFeHBvbmVudEJpdE1hc2spICYmIChmcmFjdGlvbl9iaXRzKCkgIT0gMCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbnVtYmVyIGlzIGF0IG1vc3Qga01heFVscHMgVUxQJ3MgYXdheSBmcm9tCisgIC8vIHJocy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb246CisgIC8vCisgIC8vICAgLSByZXR1cm5zIGZhbHNlIGlmIGVpdGhlciBudW1iZXIgaXMgKG9yIGJvdGggYXJlKSBOQU4uCisgIC8vICAgLSB0cmVhdHMgcmVhbGx5IGxhcmdlIG51bWJlcnMgYXMgYWxtb3N0IGVxdWFsIHRvIGluZmluaXR5LgorICAvLyAgIC0gdGhpbmtzICswLjAgYW5kIC0wLjAgYXJlIDAgRExQJ3MgYXBhcnQuCisgIGJvb2wgQWxtb3N0RXF1YWxzKGNvbnN0IEZsb2F0aW5nUG9pbnQmIHJocykgY29uc3QgeworICAgIC8vIFRoZSBJRUVFIHN0YW5kYXJkIHNheXMgdGhhdCBhbnkgY29tcGFyaXNvbiBvcGVyYXRpb24gaW52b2x2aW5nCisgICAgLy8gYSBOQU4gbXVzdCByZXR1cm4gZmFsc2UuCisgICAgaWYgKGlzX25hbigpIHx8IHJocy5pc19uYW4oKSkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKHVfLmJpdHNfLCByaHMudV8uYml0c18pCisgICAgICAgIDw9IGtNYXhVbHBzOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIHVuaW9uIEZsb2F0aW5nUG9pbnRVbmlvbiB7CisgICAgUmF3VHlwZSB2YWx1ZV87ICAvLyBUaGUgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBCaXRzIGJpdHNfOyAgICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBudW1iZXIuCisgIH07CisKKyAgLy8gQ29udmVydHMgYW4gaW50ZWdlciBmcm9tIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24gdG8KKyAgLy8gdGhlIGJpYXNlZCByZXByZXNlbnRhdGlvbi4gIE1vcmUgcHJlY2lzZWx5LCBsZXQgTiBiZSAyIHRvIHRoZQorICAvLyBwb3dlciBvZiAoa0JpdENvdW50IC0gMSksIGFuIGludGVnZXIgeCBpcyByZXByZXNlbnRlZCBieSB0aGUKKyAgLy8gdW5zaWduZWQgbnVtYmVyIHggKyBOLgorICAvLworICAvLyBGb3IgaW5zdGFuY2UsCisgIC8vCisgIC8vICAgLU4gKyAxICh0aGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZworICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDE7CisgIC8vICAgMCAgICAgIGlzIHJlcHJlc2VudGVkIGJ5IE47IGFuZAorICAvLyAgIE4gLSAxICAodGhlIGJpZ2dlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcKKyAgLy8gICAgICAgICAgc2lnbi1hbmQtbWFnbml0dWRlKSBpcyByZXByZXNlbnRlZCBieSAyTiAtIDEuCisgIC8vCisgIC8vIFJlYWQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduZWRfbnVtYmVyX3JlcHJlc2VudGF0aW9ucworICAvLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNpZ25lZCBudW1iZXIgcmVwcmVzZW50YXRpb25zLgorICBzdGF0aWMgQml0cyBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoY29uc3QgQml0cyAmc2FtKSB7CisgICAgaWYgKGtTaWduQml0TWFzayAmIHNhbSkgeworICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICByZXR1cm4gfnNhbSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHNhbSByZXByZXNlbnRzIGEgcG9zaXRpdmUgbnVtYmVyLgorICAgICAgcmV0dXJuIGtTaWduQml0TWFzayB8IHNhbTsKKyAgICB9CisgIH0KKworICAvLyBHaXZlbiB0d28gbnVtYmVycyBpbiB0aGUgc2lnbi1hbmQtbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uLAorICAvLyByZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gYXMgYW4gdW5zaWduZWQgbnVtYmVyLgorICBzdGF0aWMgQml0cyBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyhjb25zdCBCaXRzICZzYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRzICZzYW0yKSB7CisgICAgY29uc3QgQml0cyBiaWFzZWQxID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTEpOworICAgIGNvbnN0IEJpdHMgYmlhc2VkMiA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0yKTsKKyAgICByZXR1cm4gKGJpYXNlZDEgPj0gYmlhc2VkMikgPyAoYmlhc2VkMSAtIGJpYXNlZDIpIDogKGJpYXNlZDIgLSBiaWFzZWQxKTsKKyAgfQorCisgIEZsb2F0aW5nUG9pbnRVbmlvbiB1XzsKK307CisKKy8vIFdlIGNhbm5vdCB1c2Ugc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgYXMgaXQgY2xhc2hlcyB3aXRoIHRoZSBtYXgoKQorLy8gbWFjcm8gZGVmaW5lZCBieSA8d2luZG93cy5oPi4KK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgRmxvYXRpbmdQb2ludDxmbG9hdD46Ok1heCgpIHsgcmV0dXJuIEZMVF9NQVg7IH0KK3RlbXBsYXRlIDw+CitpbmxpbmUgZG91YmxlIEZsb2F0aW5nUG9pbnQ8ZG91YmxlPjo6TWF4KCkgeyByZXR1cm4gREJMX01BWDsgfQorCisvLyBUeXBlZGVmcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBGbG9hdGluZ1BvaW50IHRlbXBsYXRlIGNsYXNzIHRoYXQgd2UKKy8vIGNhcmUgdG8gdXNlLgordHlwZWRlZiBGbG9hdGluZ1BvaW50PGZsb2F0PiBGbG9hdDsKK3R5cGVkZWYgRmxvYXRpbmdQb2ludDxkb3VibGU+IERvdWJsZTsKKworLy8gSW4gb3JkZXIgdG8gY2F0Y2ggdGhlIG1pc3Rha2Ugb2YgcHV0dGluZyB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQKKy8vIHRlc3QgZml4dHVyZSBjbGFzc2VzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSwgd2UgbmVlZCB0byBhc3NpZ24KKy8vIHVuaXF1ZSBJRHMgdG8gZml4dHVyZSBjbGFzc2VzIGFuZCBjb21wYXJlIHRoZW0uICBUaGUgVHlwZUlkIHR5cGUgaXMKKy8vIHVzZWQgdG8gaG9sZCBzdWNoIElEcy4gIFRoZSB1c2VyIHNob3VsZCB0cmVhdCBUeXBlSWQgYXMgYW4gb3BhcXVlCisvLyB0eXBlOiB0aGUgb25seSBvcGVyYXRpb24gYWxsb3dlZCBvbiBUeXBlSWQgdmFsdWVzIGlzIHRvIGNvbXBhcmUKKy8vIHRoZW0gZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA9PSBvcGVyYXRvci4KK3R5cGVkZWYgY29uc3Qgdm9pZCogVHlwZUlkOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVJZEhlbHBlciB7CisgcHVibGljOgorICAvLyBkdW1teV8gbXVzdCBub3QgaGF2ZSBhIGNvbnN0IHR5cGUuICBPdGhlcndpc2UgYW4gb3Zlcmx5IGVhZ2VyCisgIC8vIGNvbXBpbGVyIChlLmcuIE1TVkMgNy4xICYgOC4wKSBtYXkgdHJ5IHRvIG1lcmdlCisgIC8vIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfIGZvciBkaWZmZXJlbnQgVHMgYXMgYW4gIm9wdGltaXphdGlvbiIuCisgIHN0YXRpYyBib29sIGR1bW15XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyA9IGZhbHNlOworCisvLyBHZXRUeXBlSWQ8VD4oKSByZXR1cm5zIHRoZSBJRCBvZiB0eXBlIFQuICBEaWZmZXJlbnQgdmFsdWVzIHdpbGwgYmUKKy8vIHJldHVybmVkIGZvciBkaWZmZXJlbnQgdHlwZXMuICBDYWxsaW5nIHRoZSBmdW5jdGlvbiB0d2ljZSB3aXRoIHRoZQorLy8gc2FtZSB0eXBlIGFyZ3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIElELgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUeXBlSWQgR2V0VHlwZUlkKCkgeworICAvLyBUaGUgY29tcGlsZXIgaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgYSBkaWZmZXJlbnQKKyAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gdmFyaWFibGUgZm9yIGVhY2ggVCB1c2VkIHRvIGluc3RhbnRpYXRlCisgIC8vIHRoZSB0ZW1wbGF0ZS4gIFRoZXJlZm9yZSwgdGhlIGFkZHJlc3Mgb2YgZHVtbXlfIGlzIGd1YXJhbnRlZWQgdG8KKyAgLy8gYmUgdW5pcXVlLgorICByZXR1cm4gJihUeXBlSWRIZWxwZXI8VD46OmR1bW15Xyk7Cit9CisKKy8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgQWx3YXlzIGNhbGwgdGhpcyBpbnN0ZWFkCisvLyBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKKy8vIDo6dGVzdGluZzo6VGVzdCwgYXMgdGhlIGxhdHRlciBtYXkgZ2l2ZSB0aGUgd3JvbmcgcmVzdWx0IGR1ZSB0byBhCisvLyBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhcyBhIE1hYyBPUyBYCisvLyBmcmFtZXdvcmsuCitHVEVTVF9BUElfIFR5cGVJZCBHZXRUZXN0VHlwZUlkKCk7CisKKy8vIERlZmluZXMgdGhlIGFic3RyYWN0IGZhY3RvcnkgaW50ZXJmYWNlIHRoYXQgY3JlYXRlcyBpbnN0YW5jZXMKKy8vIG9mIGEgVGVzdCBvYmplY3QuCitjbGFzcyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdEZhY3RvcnlCYXNlKCkge30KKworICAvLyBDcmVhdGVzIGEgdGVzdCBpbnN0YW5jZSB0byBydW4uIFRoZSBpbnN0YW5jZSBpcyBib3RoIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZAorICAvLyB3aXRoaW4gVGVzdEluZm9JbXBsOjpSdW4oKQorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIFRlc3RGYWN0b3J5QmFzZSgpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RGYWN0b3J5QmFzZSk7Cit9OworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFRlYXN0RmFjdG9yeUJhc2UgaW50ZXJmYWNlLgorLy8gSXQgaXMgdXNlZCBpbiBURVNUIGFuZCBURVNUX0YgbWFjcm9zLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KK2NsYXNzIFRlc3RGYWN0b3J5SW1wbCA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeyByZXR1cm4gbmV3IFRlc3RDbGFzczsgfQorfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gUHJlZGljYXRlLWZvcm1hdHRlcnMgZm9yIGltcGxlbWVudGluZyB0aGUgSFJFU1VMVCBjaGVja2luZyBtYWNyb3MKKy8vIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfQorLy8gV2UgcGFzcyBhIGxvbmcgaW5zdGVhZCBvZiBIUkVTVUxUIHRvIGF2b2lkIGNhdXNpbmcgYW4KKy8vIGluY2x1ZGUgZGVwZW5kZW5jeSBmb3IgdGhlIEhSRVNVTFQgdHlwZS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFR5cGVzIG9mIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpIGZ1bmN0aW9ucy4KK3R5cGVkZWYgdm9pZCAoKlNldFVwVGVzdENhc2VGdW5jKSgpOwordHlwZWRlZiB2b2lkICgqVGVhckRvd25UZXN0Q2FzZUZ1bmMpKCk7CisKKy8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKKy8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0CisvLyAgIHR5cGVfcGFyYW0gICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICB2YWx1ZV9wYXJhbSAgICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAorLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK0dURVNUX0FQSV8gVGVzdEluZm8qIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKKyAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgVGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7CisKKy8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0CisvLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKKy8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KK0dURVNUX0FQSV8gYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBTdGF0ZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCitjbGFzcyBHVEVTVF9BUElfIFR5cGVkVGVzdENhc2VQU3RhdGUgeworIHB1YmxpYzoKKyAgVHlwZWRUZXN0Q2FzZVBTdGF0ZSgpIDogcmVnaXN0ZXJlZF8oZmFsc2UpIHt9CisKKyAgLy8gQWRkcyB0aGUgZ2l2ZW4gdGVzdCBuYW1lIHRvIGRlZmluZWRfdGVzdF9uYW1lc18gYW5kIHJldHVybiB0cnVlCisgIC8vIGlmIHRoZSB0ZXN0IGNhc2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZDsgb3RoZXJ3aXNlIGFib3J0cyB0aGUKKyAgLy8gcHJvZ3JhbS4KKyAgYm9vbCBBZGRUZXN0TmFtZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZSkgeworICAgIGlmIChyZWdpc3RlcmVkXykgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBUZXN0ICVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgIgorICAgICAgICAgICAgICAiUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoJXMsIC4uLikuXG4iLAorICAgICAgICAgICAgICBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwgdGVzdF9uYW1lLCBjYXNlX25hbWUpOworICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICBwb3NpeDo6QWJvcnQoKTsKKyAgICB9CisgICAgZGVmaW5lZF90ZXN0X25hbWVzXy5pbnNlcnQodGVzdF9uYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgorICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKyAgLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KKyAgY29uc3QgY2hhciogVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsKKworIHByaXZhdGU6CisgIGJvb2wgcmVnaXN0ZXJlZF87CisgIDo6c3RkOjpzZXQ8Y29uc3QgY2hhcio+IGRlZmluZWRfdGVzdF9uYW1lc187Cit9OworCisvLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluICdzdHInOworLy8gcmV0dXJucyBOVUxMIGlmIG5vIGNvbW1hIGlzIGZvdW5kIGluICdzdHInLgoraW5saW5lIGNvbnN0IGNoYXIqIFNraXBDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICBpZiAoY29tbWEgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlIChJc1NwYWNlKCooKytjb21tYSkpKSB7fQorICByZXR1cm4gY29tbWE7Cit9CisKKy8vIFJldHVybnMgdGhlIHByZWZpeCBvZiAnc3RyJyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hIGluIGl0OyByZXR1cm5zCisvLyB0aGUgZW50aXJlIHN0cmluZyBpZiBpdCBjb250YWlucyBubyBjb21tYS4KK2lubGluZSBzdGQ6OnN0cmluZyBHZXRQcmVmaXhVbnRpbENvbW1hKGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihzdHIsICcsJyk7CisgIHJldHVybiBjb21tYSA9PSBOVUxMID8gc3RyIDogc3RkOjpzdHJpbmcoc3RyLCBjb21tYSk7Cit9CisKKy8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlcz46OlJlZ2lzdGVyKCkKKy8vIHJlZ2lzdGVycyBhIGxpc3Qgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QuICBUaGUKKy8vIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcKKy8vIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgorLy8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBHVEVTVF9URU1QTEFURV8gbWFjcm8gZGVjbGFyZXMgYSB0ZW1wbGF0ZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgSXQncyBkZWZpbmVkIGluIGd0ZXN0LXR5cGUtdXRpbC5oLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdCB7CisgcHVibGljOgorICAvLyAnaW5kZXgnIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVzdCBpbiB0aGUgdHlwZSBsaXN0ICdUeXBlcycKKyAgLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgVGVzdENhc2UsCisgIC8vIFR5cGVzKS4gIFZhbGlkIHZhbHVlcyBmb3IgJ2luZGV4JyBhcmUgWzAsIE4gLSAxXSB3aGVyZSBOIGlzIHRoZQorICAvLyBsZW5ndGggb2YgVHlwZXMuCisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWVzLCBpbnQgaW5kZXgpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVzOjpIZWFkIFR5cGU7CisgICAgdHlwZWRlZiBGaXh0dXJlPFR5cGU+IEZpeHR1cmVDbGFzczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEdURVNUX0JJTkRfKFRlc3RTZWwsIFR5cGUpIFRlc3RDbGFzczsKKworICAgIC8vIEZpcnN0LCByZWdpc3RlcnMgdGhlIGZpcnN0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGluIHRoZSB0eXBlCisgICAgLy8gbGlzdC4KKyAgICBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgICAgKHN0ZDo6c3RyaW5nKHByZWZpeCkgKyAocHJlZml4WzBdID09ICdcMCcgPyAiIiA6ICIvIikgKyBjYXNlX25hbWUgKyAiLyIKKyAgICAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKGluZGV4KSkuY19zdHIoKSwKKyAgICAgICAgR2V0UHJlZml4VW50aWxDb21tYSh0ZXN0X25hbWVzKS5jX3N0cigpLAorICAgICAgICBHZXRUeXBlTmFtZTxUeXBlPigpLmNfc3RyKCksCisgICAgICAgIE5VTEwsICAvLyBObyB2YWx1ZSBwYXJhbWV0ZXIuCisgICAgICAgIEdldFR5cGVJZDxGaXh0dXJlQ2xhc3M+KCksCisgICAgICAgIFRlc3RDbGFzczo6U2V0VXBUZXN0Q2FzZSwKKyAgICAgICAgVGVzdENsYXNzOjpUZWFyRG93blRlc3RDYXNlLAorICAgICAgICBuZXcgVGVzdEZhY3RvcnlJbXBsPFRlc3RDbGFzcz4pOworCisgICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdHlwZSBsaXN0LgorICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM6OlRhaWw+CisgICAgICAgIDo6UmVnaXN0ZXIocHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIGluZGV4ICsgMSk7CisgIH0KK307CisKKy8vIFRoZSBiYXNlIGNhc2UgZm9yIHRoZSBjb21waWxlIHRpbWUgcmVjdXJzaW9uLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIFR5cGVzMD4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8sIGludCAvKmluZGV4Ki8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworLy8gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZXN0cywgVHlwZXM+OjpSZWdpc3RlcigpCisvLyByZWdpc3RlcnMgKmFsbCBjb21iaW5hdGlvbnMqIG9mICdUZXN0cycgYW5kICdUeXBlcycgd2l0aCBHb29nbGUKKy8vIFRlc3QuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluc2lnbmlmaWNhbnQgLSB3ZSBqdXN0IG5lZWQgdG8gcmV0dXJuCisvLyBzb21ldGhpbmcgc3VjaCB0aGF0IHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2NvcGUuCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiBjYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZXMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RzOjpIZWFkIEhlYWQ7CisKKyAgICAvLyBGaXJzdCwgcmVnaXN0ZXIgdGhlIGZpcnN0IHRlc3QgaW4gJ1Rlc3QnIGZvciBlYWNoIHR5cGUgaW4gJ1R5cGVzJy4KKyAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgSGVhZCwgVHlwZXM+OjpSZWdpc3RlcigKKyAgICAgICAgcHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIDApOworCisgICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdGVzdCBsaXN0LgorICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzOjpUYWlsLCBUeXBlcz4KKyAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNhc2VfbmFtZSwgU2tpcENvbW1hKHRlc3RfbmFtZXMpKTsKKyAgfQorfTsKKworLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFR5cGVzPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZW1wbGF0ZXMwLCBUeXBlcz4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKC4uLiwgMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4KKy8vIHRoZSB0cmFjZSBidXQgQmFyKCkgYW5kIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgKKyAgICBVbml0VGVzdCogdW5pdF90ZXN0LCBpbnQgc2tpcF9jb3VudCk7CisKKy8vIEhlbHBlcnMgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIHVucmVhY2hhYmxlIGNvZGUgb3IgY29uc3RhbnQKKy8vIGNvbmRpdGlvbi4KKworLy8gQWx3YXlzIHJldHVybnMgdHJ1ZS4KK0dURVNUX0FQSV8gYm9vbCBBbHdheXNUcnVlKCk7CisKKy8vIEFsd2F5cyByZXR1cm5zIGZhbHNlLgoraW5saW5lIGJvb2wgQWx3YXlzRmFsc2UoKSB7IHJldHVybiAhQWx3YXlzVHJ1ZSgpOyB9CisKKy8vIEhlbHBlciBmb3Igc3VwcHJlc3NpbmcgZmFsc2Ugd2FybmluZyBmcm9tIENsYW5nIG9uIGEgY29uc3QgY2hhcioKKy8vIHZhcmlhYmxlIGRlY2xhcmVkIGluIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhbHdheXMgYmVpbmcgTlVMTCBpbgorLy8gdGhlIGVsc2UgYnJhbmNoLgorc3RydWN0IEdURVNUX0FQSV8gQ29uc3RDaGFyUHRyIHsKKyAgQ29uc3RDaGFyUHRyKGNvbnN0IGNoYXIqIHN0cikgOiB2YWx1ZShzdHIpIHt9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGNvbnN0IGNoYXIqIHZhbHVlOworfTsKKworLy8gQSBzaW1wbGUgTGluZWFyIENvbmdydWVudGlhbCBHZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgcmFuZG9tCisvLyBudW1iZXJzIHdpdGggYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbi4gIFVubGlrZSByYW5kKCkgYW5kIHNyYW5kKCksIGl0CisvLyBkb2Vzbid0IHVzZSBnbG9iYWwgc3RhdGUgKGFuZCB0aGVyZWZvcmUgY2FuJ3QgaW50ZXJmZXJlIHdpdGggdXNlcgorLy8gY29kZSkuICBVbmxpa2UgcmFuZF9yKCksIGl0J3MgcG9ydGFibGUuICBBbiBMQ0cgaXNuJ3QgdmVyeSByYW5kb20sCisvLyBidXQgaXQncyBnb29kIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzLgorY2xhc3MgR1RFU1RfQVBJXyBSYW5kb20geworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IFVJbnQzMiBrTWF4UmFuZ2UgPSAxdSA8PCAzMTsKKworICBleHBsaWNpdCBSYW5kb20oVUludDMyIHNlZWQpIDogc3RhdGVfKHNlZWQpIHt9CisKKyAgdm9pZCBSZXNlZWQoVUludDMyIHNlZWQpIHsgc3RhdGVfID0gc2VlZDsgfQorCisgIC8vIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgZnJvbSBbMCwgcmFuZ2UpLiAgQ3Jhc2hlcyBpZiAncmFuZ2UnIGlzCisgIC8vIDAgb3IgZ3JlYXRlciB0aGFuIGtNYXhSYW5nZS4KKyAgVUludDMyIEdlbmVyYXRlKFVJbnQzMiByYW5nZSk7CisKKyBwcml2YXRlOgorICBVSW50MzIgc3RhdGVfOworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJhbmRvbSk7Cit9OworCisvLyBEZWZpbmluZyBhIHZhcmlhYmxlIG9mIHR5cGUgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIFQyPiB3aWxsIGNhdXNlIGEKKy8vIGNvbXBpbGVyIGVycm9yIGlmZiBUMSBhbmQgVDIgYXJlIGRpZmZlcmVudCB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQsIFQ+IHsKK307CisKKy8vIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSBmcm9tIGEgdHlwZSBpZiBpdCBpcyBhIHJlZmVyZW5jZSB0eXBlLAorLy8gb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzCisvLyB0cjE6OnJlbW92ZV9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFJlbW92ZVJlZmVyZW5jZSB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVSZWZlcmVuY2U8VCY+IHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudAorLy8gVCBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpIFwKKyAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVSZWZlcmVuY2U8VD46OnR5cGUKKworLy8gUmVtb3ZlcyBjb25zdCBmcm9tIGEgdHlwZSBpZiBpdCBpcyBhIGNvbnN0IHR5cGUsIG90aGVyd2lzZSBsZWF2ZXMKKy8vIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdHIxOjpyZW1vdmVfY29uc3QsIHdoaWNoIGlzIG5vdAorLy8gd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVDb25zdCB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVDb25zdDxjb25zdCBUPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIE1TVkMgOC4wLCBTdW4gQysrLCBhbmQgSUJNIFhMIEMrKyBoYXZlIGEgYnVnIHdoaWNoIGNhdXNlcyB0aGUgYWJvdmUKKy8vIGRlZmluaXRpb24gdG8gZmFpbCB0byByZW1vdmUgdGhlIGNvbnN0IGluICdjb25zdCBpbnRbM10nIGFuZCAnY29uc3QKKy8vIGNoYXJbM11bNF0nLiAgVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiB3b3JrcyBhcm91bmQgdGhlIGJ1Zy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3N0cnVjdCBSZW1vdmVDb25zdDxjb25zdCBUW05dPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsKK307CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE0MDAKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3BlY2lhbGl6YXRpb24gdGhhdCBhbGxvd3MgVkMrKyA3LjEgdG8gcmVtb3ZlIGNvbnN0IGluCisvLyAnY29uc3QgaW50WzNdIGFuZCAnY29uc3QgaW50WzNdWzRdJy4gIEhvd2V2ZXIsIGl0IGNhdXNlcyB0cm91YmxlIHdpdGggR0NDCisvLyBhbmQgdGh1cyBuZWVkcyB0byBiZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorc3RydWN0IFJlbW92ZUNvbnN0PFRbTl0+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZW1vdmVDb25zdDxUPjo6dHlwZSB0eXBlW05dOworfTsKKyNlbmRpZgorCisvLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIFJlbW92ZUNvbnN0IHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKKy8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfQ09OU1RfKFQpIFwKKyAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVDb25zdDxUPjo6dHlwZQorCisvLyBUdXJucyBjb25zdCBVJiwgVSYsIGNvbnN0IFUsIGFuZCBVIGFsbCBpbnRvIFUuCisjZGVmaW5lIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUKSBcCisgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSkKKworLy8gQWRkcyByZWZlcmVuY2UgdG8gYSB0eXBlIGlmIGl0IGlzIG5vdCBhIHJlZmVyZW5jZSB0eXBlLAorLy8gb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzCisvLyB0cjE6OmFkZF9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZmVyZW5jZSB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIEFkZFJlZmVyZW5jZSB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IFQKKy8vIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfQUREX1JFRkVSRU5DRV8oVCkgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFkZFJlZmVyZW5jZTxUPjo6dHlwZQorCisvLyBBZGRzIGEgcmVmZXJlbmNlIHRvIGNvbnN0IG9uIHRvcCBvZiBUIGFzIG5lY2Vzc2FyeS4gIEZvciBleGFtcGxlLAorLy8gaXQgdHJhbnNmb3JtcworLy8KKy8vICAgY2hhciAgICAgICAgID09PiBjb25zdCBjaGFyJgorLy8gICBjb25zdCBjaGFyICAgPT0+IGNvbnN0IGNoYXImCisvLyAgIGNoYXImICAgICAgICA9PT4gY29uc3QgY2hhciYKKy8vICAgY29uc3QgY2hhciYgID09PiBjb25zdCBjaGFyJgorLy8KKy8vIFRoZSBhcmd1bWVudCBUIG11c3QgZGVwZW5kIG9uIHNvbWUgdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhUKSBcCisgICAgR1RFU1RfQUREX1JFRkVSRU5DRV8oY29uc3QgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCisKKy8vIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxGcm9tLCBUbz46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGJvb2wKKy8vIGNvbnN0YW50IHRoYXQncyB0cnVlIGlmZiB0eXBlIEZyb20gY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCisvLyB0eXBlIFRvLgordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorY2xhc3MgSW1wbGljaXRseUNvbnZlcnRpYmxlIHsKKyBwcml2YXRlOgorICAvLyBXZSBuZWVkIHRoZSBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9ucyBvbmx5IGZvciB0aGVpciB0eXBlcy4KKyAgLy8gVGhleSBoYXZlIG5vIGltcGxlbWVudGF0aW9ucy4KKworICAvLyBNYWtlRnJvbSgpIGlzIGFuIGV4cHJlc3Npb24gd2hvc2UgdHlwZSBpcyBGcm9tLiAgV2UgY2Fubm90IHNpbXBseQorICAvLyB1c2UgRnJvbSgpLCBhcyB0aGUgdHlwZSBGcm9tIG1heSBub3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0CisgIC8vIGNvbnN0cnVjdG9yLgorICBzdGF0aWMgRnJvbSBNYWtlRnJvbSgpOworCisgIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIG92ZXJsb2FkZWQuICBHaXZlbiBhbiBleHByZXNzaW9uCisgIC8vIEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QgdmVyc2lvbiBpZiB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvOyBvdGhlcndpc2UgaXQgd2lsbCBwaWNrIHRoZQorICAvLyBzZWNvbmQgdmVyc2lvbi4KKyAgLy8KKyAgLy8gVGhlIGZpcnN0IHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMSwgYW5kIHRoZSBzZWNvbmQKKyAgLy8gdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAyLiAgVGhlcmVmb3JlLCBieSBjaGVja2luZyB0aGUKKyAgLy8gc2l6ZSBvZiBIZWxwZXIoeCksIHdoaWNoIGNhbiBiZSBkb25lIGF0IGNvbXBpbGUgdGltZSwgd2UgY2FuIHRlbGwKKyAgLy8gd2hpY2ggdmVyc2lvbiBvZiBIZWxwZXIoKSBpcyB1c2VkLCBhbmQgaGVuY2Ugd2hldGhlciB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvLgorICBzdGF0aWMgY2hhciBIZWxwZXIoVG8pOworICBzdGF0aWMgY2hhciAoJkhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAorCisgIC8vIFdlIGhhdmUgdG8gcHV0IHRoZSAncHVibGljJyBzZWN0aW9uIGFmdGVyIHRoZSAncHJpdmF0ZScgc2VjdGlvbiwKKyAgLy8gb3IgTVNWQyByZWZ1c2VzIHRvIGNvbXBpbGUgdGhlIGNvZGUuCisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGltcGxpY2l0bHkgY29udmVydGluZyBmcm9tIGRvdWJsZSB0byBpbnQgZm9yCisgIC8vIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YSwgc28gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZQorICAvLyB3YXJuaW5nLgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDI0NC4KKworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzaXplb2YoSGVscGVyKEltcGxpY2l0bHlDb252ZXJ0aWJsZTo6TWFrZUZyb20oKSkpID09IDE7CisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIC8vIEMrK0J1aWxkZXIgY2Fubm90IHVzZSBtZW1iZXIgb3ZlcmxvYWQgcmVzb2x1dGlvbiBkdXJpbmcgdGVtcGxhdGUKKyAgLy8gaW5zdGFudGlhdGlvbi4gIFRoZSBzaW1wbGVzdCB3b3JrYXJvdW5kIGlzIHRvIHVzZSBpdHMgQysrMHggdHlwZSB0cmFpdHMKKyAgLy8gZnVuY3Rpb25zIChDKytCdWlsZGVyIDIwMDkgYW5kIGFib3ZlIG9ubHkpLgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faXNfY29udmVydGlibGUoRnJvbSwgVG8pOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc2l6ZW9mKEhlbHBlcihJbXBsaWNpdGx5Q29udmVydGlibGU6Ok1ha2VGcm9tKCkpKSA9PSAxOworI2VuZGlmICAvLyBfTVNWX1ZFUgorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK2NvbnN0IGJvb2wgSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWU7CisKKy8vIElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0J3MKKy8vIHRydWUgaWZmIFQgaXMgdHlwZSBQcm90b2NvbE1lc3NhZ2UsIHByb3RvMjo6TWVzc2FnZSwgb3IgYSBzdWJjbGFzcworLy8gb2YgdGhvc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJc0FQcm90b2NvbE1lc3NhZ2UKKyAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PAorICBJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCosIGNvbnN0IDo6UHJvdG9jb2xNZXNzYWdlKj46OnZhbHVlIHx8CisgIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpwcm90bzI6Ok1lc3NhZ2UqPjo6dmFsdWU+IHsKK307CisKKy8vIFdoZW4gdGhlIGNvbXBpbGVyIHNlZXMgZXhwcmVzc2lvbiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCksIGlmIEMgaXMgYW4KKy8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QKKy8vIHdpbGwgYmUgdmlhYmxlIChzaW5jZSBib3RoIEM6Oml0ZXJhdG9yKiBhbmQgQzo6Y29uc3RfaXRlcmF0b3IqIGFyZQorLy8gdmFsaWQgdHlwZXMgYW5kIE5VTEwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHRoZW0pLiAgSXQgd2lsbAorLy8gYmUgcGlja2VkIG92ZXIgdGhlIHNlY29uZCBvdmVybG9hZCBhcyAnaW50JyBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yCisvLyB0aGUgdHlwZSBvZiBhcmd1bWVudCAwLiAgSWYgQzo6aXRlcmF0b3Igb3IgQzo6Y29uc3RfaXRlcmF0b3IgaXMgbm90CisvLyBhIHZhbGlkIHR5cGUsIHRoZSBmaXJzdCBvdmVybG9hZCBpcyBub3QgdmlhYmxlLCBhbmQgdGhlIHNlY29uZAorLy8gb3ZlcmxvYWQgd2lsbCBiZSBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciBDIGlzCisvLyBhIGNvbnRhaW5lciBjbGFzcyBieSBjaGVja2luZyB0aGUgdHlwZSBvZiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCkuCisvLyBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgaW5zaWduaWZpY2FudC4KKy8vCisvLyBOb3RlIHRoYXQgd2UgbG9vayBmb3IgYm90aCBDOjppdGVyYXRvciBhbmQgQzo6Y29uc3RfaXRlcmF0b3IuICBUaGUKKy8vIHJlYXNvbiBpcyB0aGF0IEMrKyBpbmplY3RzIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgYSBtZW1iZXIgb2YgdGhlCisvLyBjbGFzcyBpdHNlbGYgKGUuZy4geW91IGNhbiByZWZlciB0byBjbGFzcyBpdGVyYXRvciBhcyBlaXRoZXIKKy8vICdpdGVyYXRvcicgb3IgJ2l0ZXJhdG9yOjppdGVyYXRvcicpLiAgSWYgd2UgbG9vayBmb3IgQzo6aXRlcmF0b3IKKy8vIG9ubHksIGZvciBleGFtcGxlLCB3ZSB3b3VsZCBtaXN0YWtlbmx5IHRoaW5rIHRoYXQgYSBjbGFzcyBuYW1lZAorLy8gaXRlcmF0b3IgaXMgYW4gU1RMIGNvbnRhaW5lci4KKy8vCisvLyBBbHNvIG5vdGUgdGhhdCB0aGUgc2ltcGxlciBhcHByb2FjaCBvZiBvdmVybG9hZGluZworLy8gSXNDb250YWluZXJUZXN0KHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKikgYW5kCisvLyBJc0NvbnRhaW5lclRlc3QoLi4uKSBkb2Vzbid0IHdvcmsgd2l0aCBWaXN1YWwgQWdlIEMrKyBhbmQgU3VuIEMrKy4KK3R5cGVkZWYgaW50IElzQ29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc0NvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QoaW50IC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yKiAvKiBpdCAqLyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqIC8qIGNvbnN0X2l0ICovID0gTlVMTCkgeworICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBjaGFyIElzTm90Q29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc05vdENvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gJ1wwJzsgfQorCisvLyBFbmFibGVJZjxjb25kaXRpb24+Ojp0eXBlIGlzIHZvaWQgd2hlbiAnQ29uZCcgaXMgdHJ1ZSwgYW5kCisvLyB1bmRlZmluZWQgd2hlbiAnQ29uZCcgaXMgZmFsc2UuICBUbyB1c2UgU0ZJTkFFIHRvIG1ha2UgYSBmdW5jdGlvbgorLy8gb3ZlcmxvYWQgb25seSBhcHBseSB3aGVuIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUsIGFkZAorLy8gInR5cGVuYW1lIEVuYWJsZUlmPGV4cHJlc3Npb24+Ojp0eXBlKiA9IDAiIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KK3RlbXBsYXRlPGJvb2w+IHN0cnVjdCBFbmFibGVJZjsKK3RlbXBsYXRlPD4gc3RydWN0IEVuYWJsZUlmPHRydWU+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gVXRpbGl0aWVzIGZvciBuYXRpdmUgYXJyYXlzLgorCisvLyBBcnJheUVxKCkgY29tcGFyZXMgdHdvIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5cyB1c2luZyB0aGUKKy8vIGVsZW1lbnRzJyBvcGVyYXRvcj09LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzCisvLyAwLCBBcnJheUVxKCkgZGVnZW5lcmF0ZXMgaW50byBjb21wYXJpbmcgYSBzaW5nbGUgcGFpciBvZiB2YWx1ZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBBcnJheUVxKGNvbnN0IFQqIGxocywgc2l6ZV90IHNpemUsIGNvbnN0IFUqIHJocyk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSBib29sIEFycmF5RXEoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIHsgcmV0dXJuIGxocyA9PSByaHM7IH0KKworLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgoraW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUKCZsaHMpW05dLCBjb25zdCBVKCZyaHMpW05dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QXJyYXlFcShsaHMsIE4sIHJocyk7Cit9CisKKy8vIFRoaXMgaGVscGVyIHJlZHVjZXMgY29kZSBibG9hdC4gIElmIHdlIGluc3RlYWQgcHV0IGl0cyBsb2dpYyBpbnNpZGUKKy8vIHRoZSBwcmV2aW91cyBBcnJheUVxKCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcyB3b3VsZAorLy8gbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGlmICghaW50ZXJuYWw6OkFycmF5RXEobGhzW2ldLCByaHNbaV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpIHRoYXQKKy8vIGVxdWFscyBlbGVtLiAgRWxlbWVudCBtYXkgYmUgYSBuYXRpdmUgYXJyYXkgdHlwZSBpdHNlbGYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgRWxlbWVudD4KK0l0ZXIgQXJyYXlBd2FyZUZpbmQoSXRlciBiZWdpbiwgSXRlciBlbmQsIGNvbnN0IEVsZW1lbnQmIGVsZW0pIHsKKyAgZm9yIChJdGVyIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpbnRlcm5hbDo6QXJyYXlFcSgqaXQsIGVsZW0pKQorICAgICAgcmV0dXJuIGl0OworICB9CisgIHJldHVybiBlbmQ7Cit9CisKKy8vIENvcHlBcnJheSgpIGNvcGllcyBhIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5IHVzaW5nIHRoZSBlbGVtZW50cycKKy8vIG9wZXJhdG9yPSwgd2hlcmUgayBjYW4gYmUgYW55IGludGVnZXIgPj0gMC4gIFdoZW4gayBpcyAwLAorLy8gQ29weUFycmF5KCkgZGVnZW5lcmF0ZXMgaW50byBjb3B5aW5nIGEgc2luZ2xlIHZhbHVlLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3ZvaWQgQ29weUFycmF5KGNvbnN0IFQqIGZyb20sIHNpemVfdCBzaXplLCBVKiB0byk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUJiBmcm9tLCBVKiB0bykgeyAqdG8gPSBmcm9tOyB9CisKKy8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUKCZmcm9tKVtOXSwgVSgqdG8pW05dKSB7CisgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbSwgTiwgKnRvKTsKK30KKworLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQorLy8gdGhlIHByZXZpb3VzIENvcHlBcnJheSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMKKy8vIHdvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgdGVtcGxhdGUgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgordm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbVtpXSwgdG8gKyBpKTsKKyAgfQorfQorCisvLyBUaGUgcmVsYXRpb24gYmV0d2VlbiBhbiBOYXRpdmVBcnJheSBvYmplY3QgKHNlZSBiZWxvdykgYW5kIHRoZQorLy8gbmF0aXZlIGFycmF5IGl0IHJlcHJlc2VudHMuCitlbnVtIFJlbGF0aW9uVG9Tb3VyY2UgeworICBrUmVmZXJlbmNlLCAgLy8gVGhlIE5hdGl2ZUFycmF5IHJlZmVyZW5jZXMgdGhlIG5hdGl2ZSBhcnJheS4KKyAga0NvcHkgICAgICAgIC8vIFRoZSBOYXRpdmVBcnJheSBtYWtlcyBhIGNvcHkgb2YgdGhlIG5hdGl2ZSBhcnJheSBhbmQKKyAgICAgICAgICAgICAgIC8vIG93bnMgdGhlIGNvcHkuCit9OworCisvLyBBZGFwdHMgYSBuYXRpdmUgYXJyYXkgdG8gYSByZWFkLW9ubHkgU1RMLXN0eWxlIGNvbnRhaW5lci4gIEluc3RlYWQKKy8vIG9mIHRoZSBjb21wbGV0ZSBTVEwgY29udGFpbmVyIGNvbmNlcHQsIHRoaXMgYWRhcHRvciBvbmx5IGltcGxlbWVudHMKKy8vIG1lbWJlcnMgdXNlZnVsIGZvciBHb29nbGUgTW9jaydzIGNvbnRhaW5lciBtYXRjaGVycy4gIE5ldyBtZW1iZXJzCisvLyBzaG91bGQgYmUgYWRkZWQgYXMgbmVlZGVkLiAgVG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBvbmx5CisvLyBzdXBwb3J0IEVsZW1lbnQgYmVpbmcgYSByYXcgdHlwZSAoaS5lLiBoYXZpbmcgbm8gdG9wLWxldmVsIGNvbnN0IG9yCisvLyByZWZlcmVuY2UgbW9kaWZpZXIpLiAgSXQncyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gc2F0aXNmeQorLy8gdGhpcyByZXF1aXJlbWVudC4gIEVsZW1lbnQgY2FuIGJlIGFuIGFycmF5IHR5cGUgaXRzZWxmIChoZW5jZQorLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBzdXBwb3J0ZWQpLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBOYXRpdmVBcnJheSB7CisgcHVibGljOgorICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIHR5cGVkZWZzLgorICB0eXBlZGVmIEVsZW1lbnQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKKworICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBuYXRpdmUgYXJyYXkuCisgIE5hdGl2ZUFycmF5KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgY291bnQsIFJlbGF0aW9uVG9Tb3VyY2UgcmVsYXRpb24pIHsKKyAgICBJbml0KGFycmF5LCBjb3VudCwgcmVsYXRpb24pOworICB9CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgTmF0aXZlQXJyYXkoY29uc3QgTmF0aXZlQXJyYXkmIHJocykgeworICAgIEluaXQocmhzLmFycmF5XywgcmhzLnNpemVfLCByaHMucmVsYXRpb25fdG9fc291cmNlXyk7CisgIH0KKworICB+TmF0aXZlQXJyYXkoKSB7CisgICAgLy8gRW5zdXJlcyB0aGF0IHRoZSB1c2VyIGRvZXNuJ3QgaW5zdGFudGlhdGUgTmF0aXZlQXJyYXkgd2l0aCBhCisgICAgLy8gY29uc3Qgb3IgcmVmZXJlbmNlIHR5cGUuCisgICAgc3RhdGljX2Nhc3Q8dm9pZD4oU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPEVsZW1lbnQsCisgICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhFbGVtZW50KT4oKSk7CisgICAgaWYgKHJlbGF0aW9uX3RvX3NvdXJjZV8gPT0ga0NvcHkpCisgICAgICBkZWxldGVbXSBhcnJheV87CisgIH0KKworICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIG1ldGhvZHMuCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheV87IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfICsgc2l6ZV87IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZSgpID09IHJocy5zaXplKCkgJiYKKyAgICAgICAgQXJyYXlFcShiZWdpbigpLCBzaXplKCksIHJocy5iZWdpbigpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSW5pdGlhbGl6ZXMgdGhpcyBvYmplY3Q7IG1ha2VzIGEgY29weSBvZiB0aGUgaW5wdXQgYXJyYXkgaWYKKyAgLy8gJ3JlbGF0aW9uJyBpcyBrQ29weS4KKyAgdm9pZCBJbml0KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgYV9zaXplLCBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uKSB7CisgICAgaWYgKHJlbGF0aW9uID09IGtSZWZlcmVuY2UpIHsKKyAgICAgIGFycmF5XyA9IGFycmF5OworICAgIH0gZWxzZSB7CisgICAgICBFbGVtZW50KiBjb25zdCBjb3B5ID0gbmV3IEVsZW1lbnRbYV9zaXplXTsKKyAgICAgIENvcHlBcnJheShhcnJheSwgYV9zaXplLCBjb3B5KTsKKyAgICAgIGFycmF5XyA9IGNvcHk7CisgICAgfQorICAgIHNpemVfID0gYV9zaXplOworICAgIHJlbGF0aW9uX3RvX3NvdXJjZV8gPSByZWxhdGlvbjsKKyAgfQorCisgIGNvbnN0IEVsZW1lbnQqIGFycmF5XzsKKyAgc2l6ZV90IHNpemVfOworICBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uX3RvX3NvdXJjZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhOYXRpdmVBcnJheSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNkZWZpbmUgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgbWVzc2FnZSwgcmVzdWx0X3R5cGUpIFwKKyAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6QXNzZXJ0SGVscGVyKHJlc3VsdF90eXBlLCBmaWxlLCBsaW5lLCBtZXNzYWdlKSBcCisgICAgPSA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorCisjZGVmaW5lIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIHJlc3VsdF90eXBlKSBcCisgIEdURVNUX01FU1NBR0VfQVRfKF9fRklMRV9fLCBfX0xJTkVfXywgbWVzc2FnZSwgcmVzdWx0X3R5cGUpCisKKyNkZWZpbmUgR1RFU1RfRkFUQUxfRkFJTFVSRV8obWVzc2FnZSkgXAorICByZXR1cm4gR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSkKKworI2RlZmluZSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcCisgIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUpCisKKyNkZWZpbmUgR1RFU1RfU1VDQ0VTU18obWVzc2FnZSkgXAorICBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKKworLy8gU3VwcHJlc3NlcyBNU1ZDIHdhcm5pbmdzIDQwNzIgKHVucmVhY2hhYmxlIGNvZGUpIGZvciB0aGUgY29kZSBmb2xsb3dpbmcKKy8vIHN0YXRlbWVudCBpZiBpdCByZXR1cm5zIG9yIHRocm93cyAob3IgZG9lc24ndCByZXR1cm4gb3IgdGhyb3cgaW4gc29tZQorLy8gc2l0dWF0aW9ucykuCisjZGVmaW5lIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KSBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9CisKKyNkZWZpbmUgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29uc3RDaGFyUHRyIGd0ZXN0X21zZyA9ICIiKSB7IFwKKyAgICBib29sIGd0ZXN0X2NhdWdodF9leHBlY3RlZCA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKGV4cGVjdGVkX2V4Y2VwdGlvbiBjb25zdCYpIHsgXAorICAgICAgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ3Rlc3RfbXNnLnZhbHVlID0gXAorICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXAorICAgICAgICAgICNleHBlY3RlZF9leGNlcHRpb24gIi5cbiAgQWN0dWFsOiBpdCB0aHJvd3MgYSBkaWZmZXJlbnQgdHlwZS4iOyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgICAgaWYgKCFndGVzdF9jYXVnaHRfZXhwZWN0ZWQpIHsgXAorICAgICAgZ3Rlc3RfbXNnLnZhbHVlID0gXAorICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXAorICAgICAgICAgICNleHBlY3RlZF9leGNlcHRpb24gIi5cbiAgQWN0dWFsOiBpdCB0aHJvd3Mgbm90aGluZy4iOyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoZ3Rlc3RfbXNnLnZhbHVlKQorCisjZGVmaW5lIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIHRyeSB7IFwKKyAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm90aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uLlxuIiBcCisgICAgICAgICAgICIgIEFjdHVhbDogaXQgdGhyb3dzLiIpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2FueSA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBndGVzdF9jYXVnaHRfYW55ID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2FueSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdGFueXRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuIiBcCisgICAgICAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKQorCisKKy8vIEltcGxlbWVudHMgQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4gZXhwcmVzc2lvbiBjYW4gYmUKKy8vIGVpdGhlciBhIGJvb2xlYW4gZXhwcmVzc2lvbiBvciBhbiBBc3NlcnRpb25SZXN1bHQuIHRleHQgaXMgYSB0ZXh0dWFsCisvLyByZXByZXNlbmF0aW9uIG9mIGV4cHJlc3Npb24gYXMgaXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBFWFBFQ1RfVFJVRS4KKyNkZWZpbmUgR1RFU1RfVEVTVF9CT09MRUFOXyhleHByZXNzaW9uLCB0ZXh0LCBhY3R1YWwsIGV4cGVjdGVkLCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0KGV4cHJlc3Npb24pKSBcCisgICAgOyBcCisgIGVsc2UgXAorICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKFwKKyAgICAgICAgZ3Rlc3RfYXJfLCB0ZXh0LCAjYWN0dWFsLCAjZXhwZWN0ZWQpLmNfc3RyKCkpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIgZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyOyBcCisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgaWYgKGd0ZXN0X2ZhdGFsX2ZhaWx1cmVfY2hlY2tlci5oYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub2ZhdGFsXywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCBnZW5lcmF0ZSBuZXcgZmF0YWwgIiBcCisgICAgICAgICAgICJmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuXG4iIFwKKyAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2VzLiIpCisKKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZ2l2ZW4gdGVzdC4KKyNkZWZpbmUgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKy8vIEhlbHBlciBtYWNybyBmb3IgZGVmaW5pbmcgdGVzdHMuCisjZGVmaW5lIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIHBhcmVudF9jbGFzcywgcGFyZW50X2lkKVwKK2NsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgOiBwdWJsaWMgcGFyZW50X2NsYXNzIHtcCisgcHVibGljOlwKKyAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9XAorIHByaXZhdGU6XAorICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTtcCisgIHN0YXRpYyA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm9fIEdURVNUX0FUVFJJQlVURV9VTlVTRURfO1wKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTtcCit9O1wKK1wKKzo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIDo6dGVzdF9pbmZvXyA9XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKFwKKyAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCAjdGVzdF9uYW1lLCBOVUxMLCBOVUxMLCBcCisgICAgICAgIChwYXJlbnRfaWQpLCBcCisgICAgICAgIHBhcmVudF9jbGFzczo6U2V0VXBUZXN0Q2FzZSwgXAorICAgICAgICBwYXJlbnRfY2xhc3M6OlRlYXJEb3duVGVzdENhc2UsIFwKKyAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RGYWN0b3J5SW1wbDxcCisgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPik7XAordm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXworLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWMgQVBJIGZvciBkZWF0aCB0ZXN0cy4gIEl0IGlzCisvLyAjaW5jbHVkZWQgYnkgZ3Rlc3QuaCBzbyBhIHVzZXIgZG9lc24ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcworLy8gZGlyZWN0bHkuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgaW50ZXJuYWwgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nCisvLyBkZWF0aCB0ZXN0cy4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworR1RFU1RfREVDTEFSRV9zdHJpbmdfKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKKworLy8gTmFtZXMgb2YgdGhlIGZsYWdzIChuZWVkZWQgZm9yIHBhcnNpbmcgR29vZ2xlIFRlc3QgZmxhZ3MpLgorY29uc3QgY2hhciBrRGVhdGhUZXN0U3R5bGVGbGFnW10gPSAiZGVhdGhfdGVzdF9zdHlsZSI7Citjb25zdCBjaGFyIGtEZWF0aFRlc3RVc2VGb3JrW10gPSAiZGVhdGhfdGVzdF91c2VfZm9yayI7Citjb25zdCBjaGFyIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWdbXSA9ICJpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCI7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBEZWF0aFRlc3QgaXMgYSBjbGFzcyB0aGF0IGhpZGVzIG11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlCisvLyBHVEVTVF9ERUFUSF9URVNUXyBtYWNyby4gIEl0IGlzIGFic3RyYWN0OyBpdHMgc3RhdGljIENyZWF0ZSBtZXRob2QKKy8vIHJldHVybnMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGRlcGVuZHMgb24gdGhlIHByZXZhaWxpbmcgZGVhdGggdGVzdAorLy8gc3R5bGUsIGFzIGRlZmluZWQgYnkgdGhlIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBhbmQvb3IKKy8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3MuCisKKy8vIEluIGRlc2NyaWJpbmcgdGhlIHJlc3VsdHMgb2YgZGVhdGggdGVzdHMsIHRoZXNlIHRlcm1zIGFyZSB1c2VkIHdpdGgKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb25zOgorLy8KKy8vIGV4aXQgc3RhdHVzOiAgVGhlIGludGVnZXIgZXhpdCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZAorLy8gICAgICAgICAgICAgICBieSB3YWl0KDIpCisvLyBleGl0IGNvZGU6ICAgIFRoZSBpbnRlZ2VyIGNvZGUgcGFzc2VkIHRvIGV4aXQoMyksIF9leGl0KDIpLCBvcgorLy8gICAgICAgICAgICAgICByZXR1cm5lZCBmcm9tIG1haW4oKQorY2xhc3MgR1RFU1RfQVBJXyBEZWF0aFRlc3QgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIHJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGRldGVybWluaW5nIHRoZQorICAvLyBhcHByb3ByaWF0ZSBhY3Rpb24gdG8gdGFrZSBmb3IgdGhlIGN1cnJlbnQgZGVhdGggdGVzdDsgZm9yIGV4YW1wbGUsCisgIC8vIGlmIHRoZSBndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGZsYWcgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUuCisgIC8vIFRoZSBMYXN0TWVzc2FnZSBtZXRob2Qgd2lsbCByZXR1cm4gYSBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgaW4gdGhhdAorICAvLyBjYXNlLiAgT3RoZXJ3aXNlLCB0aGUgRGVhdGhUZXN0IHBvaW50ZXIgcG9pbnRlZCB0byBieSB0aGUgInRlc3QiCisgIC8vIGFyZ3VtZW50IGlzIHNldC4gIElmIHRoZSBkZWF0aCB0ZXN0IHNob3VsZCBiZSBza2lwcGVkLCB0aGUgcG9pbnRlcgorICAvLyBpcyBzZXQgdG8gTlVMTDsgb3RoZXJ3aXNlLCBpdCBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgYSBuZXcgY29uY3JldGUKKyAgLy8gRGVhdGhUZXN0IG9iamVjdCB0aGF0IGNvbnRyb2xzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGVzdC4KKyAgc3RhdGljIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOworICBEZWF0aFRlc3QoKTsKKyAgdmlydHVhbCB+RGVhdGhUZXN0KCkgeyB9CisKKyAgLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBhYm9ydHMgYSBkZWF0aCB0ZXN0IHdoZW4gaXQncyBkZWxldGVkLgorICBjbGFzcyBSZXR1cm5TZW50aW5lbCB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgUmV0dXJuU2VudGluZWwoRGVhdGhUZXN0KiB0ZXN0KSA6IHRlc3RfKHRlc3QpIHsgfQorICAgIH5SZXR1cm5TZW50aW5lbCgpIHsgdGVzdF8tPkFib3J0KFRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCk7IH0KKyAgIHByaXZhdGU6CisgICAgRGVhdGhUZXN0KiBjb25zdCB0ZXN0XzsKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJldHVyblNlbnRpbmVsKTsKKyAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworICAvLyBBbiBlbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByb2xlcyB0aGF0IG1heSBiZSB0YWtlbiB3aGVuIGEgZGVhdGgKKyAgLy8gdGVzdCBpcyBlbmNvdW50ZXJlZC4gIEVYRUNVVEUgbWVhbnMgdGhhdCB0aGUgZGVhdGggdGVzdCBsb2dpYyBzaG91bGQKKyAgLy8gYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuICBPVkVSU0VFIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gc2hvdWxkIHByZXBhcmUKKyAgLy8gdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IGZvciBhIGNoaWxkIHByb2Nlc3MgdG8gZXhlY3V0ZSB0aGUgZGVhdGgKKyAgLy8gdGVzdCwgdGhlbiB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KKyAgZW51bSBUZXN0Um9sZSB7IE9WRVJTRUVfVEVTVCwgRVhFQ1VURV9URVNUIH07CisKKyAgLy8gQW4gZW51bWVyYXRpb24gb2YgdGhlIHRocmVlIHJlYXNvbnMgdGhhdCBhIHRlc3QgbWlnaHQgYmUgYWJvcnRlZC4KKyAgZW51bSBBYm9ydFJlYXNvbiB7CisgICAgVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULAorICAgIFRFU1RfVEhSRVdfRVhDRVBUSU9OLAorICAgIFRFU1RfRElEX05PVF9ESUUKKyAgfTsKKworICAvLyBBc3N1bWVzIG9uZSBvZiB0aGUgYWJvdmUgcm9sZXMuCisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpID0gMDsKKworICAvLyBXYWl0cyBmb3IgdGhlIGRlYXRoIHRlc3QgdG8gZmluaXNoIGFuZCByZXR1cm5zIGl0cyBzdGF0dXMuCisgIHZpcnR1YWwgaW50IFdhaXQoKSA9IDA7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWF0aCB0ZXN0IHBhc3NlZDsgdGhhdCBpcywgdGhlIHRlc3QgcHJvY2VzcworICAvLyBleGl0ZWQgZHVyaW5nIHRoZSB0ZXN0LCBpdHMgZXhpdCBzdGF0dXMgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQKKyAgLy8gcHJlZGljYXRlLCBhbmQgaXRzIHN0ZGVyciBvdXRwdXQgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQgcmVndWxhcgorICAvLyBleHByZXNzaW9uLgorICAvLyBUaGUgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUgbWF5IGJlIGEgbWFjcm8gZXhwcmVzc2lvbiByYXRoZXIKKyAgLy8gdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgZnVuY3Rvciwgb3IgZWxzZSBXYWl0IGFuZCBQYXNzZWQgY291bGQKKyAgLy8gYmUgY29tYmluZWQuCisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBleGl0X3N0YXR1c19vaykgPSAwOworCisgIC8vIFNpZ25hbHMgdGhhdCB0aGUgZGVhdGggdGVzdCBkaWQgbm90IGRpZSBhcyBleHBlY3RlZC4KKyAgdmlydHVhbCB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgPSAwOworCisgIC8vIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBvdXRjb21lIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBvdXRjb21lIG9mCisgIC8vIHRoZSBsYXN0IGRlYXRoIHRlc3QuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBMYXN0TWVzc2FnZSgpOworCisgIHN0YXRpYyB2b2lkIHNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisKKyBwcml2YXRlOgorICAvLyBBIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIG91dGNvbWUgb2YgdGhlIGxhc3QgZGVhdGggdGVzdC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlYXRoVGVzdCk7Cit9OworCisvLyBGYWN0b3J5IGludGVyZmFjZSBmb3IgZGVhdGggdGVzdHMuICBNYXkgYmUgbW9ja2VkIG91dCBmb3IgdGVzdGluZy4KK2NsYXNzIERlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RGVhdGhUZXN0RmFjdG9yeSgpIHsgfQorICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSA9IDA7Cit9OworCisvLyBBIGNvbmNyZXRlIERlYXRoVGVzdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gZm9yIG5vcm1hbCB1c2UuCitjbGFzcyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSA6IHB1YmxpYyBEZWF0aFRlc3RGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOworfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitHVEVTVF9BUElfIGJvb2wgRXhpdGVkVW5zdWNjZXNzZnVsbHkoaW50IGV4aXRfc3RhdHVzKTsKKworLy8gVHJhcHMgQysrIGV4Y2VwdGlvbnMgZXNjYXBpbmcgc3RhdGVtZW50IGFuZCByZXBvcnRzIHRoZW0gYXMgdGVzdAorLy8gZmFpbHVyZXMuIE5vdGUgdGhhdCB0cmFwcGluZyBTRUggZXhjZXB0aW9ucyBpcyBub3QgaW1wbGVtZW50ZWQgaGVyZS4KKyMgaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGRlYXRoX3Rlc3QpIFwKKyAgdHJ5IHsgXAorICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICB9IGNhdGNoIChjb25zdCA6OnN0ZDo6ZXhjZXB0aW9uJiBndGVzdF9leGNlcHRpb24pIHsgXAorICAgIGZwcmludGYoXAorICAgICAgICBzdGRlcnIsIFwKKyAgICAgICAgIlxuJXM6IENhdWdodCBzdGQ6OmV4Y2VwdGlvbi1kZXJpdmVkIGV4Y2VwdGlvbiBlc2NhcGluZyB0aGUgIiBcCisgICAgICAgICJkZWF0aCB0ZXN0IHN0YXRlbWVudC4gRXhjZXB0aW9uIG1lc3NhZ2U6ICVzXG4iLCBcCisgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLmNfc3RyKCksIFwKKyAgICAgICAgZ3Rlc3RfZXhjZXB0aW9uLndoYXQoKSk7IFwKKyAgICBmZmx1c2goc3RkZXJyKTsgXAorICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcCisgIH0gY2F0Y2ggKC4uLikgeyBcCisgICAgZGVhdGhfdGVzdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX1RIUkVXX0VYQ0VQVElPTik7IFwKKyAgfQorCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGRlYXRoX3Rlc3QpIFwKKyAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpCisKKyMgZW5kaWYKKworLy8gVGhpcyBtYWNybyBpcyBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ERUFUSCosIEVYUEVDVF9ERUFUSCosCisvLyBBU1NFUlRfRVhJVCosIGFuZCBFWFBFQ1RfRVhJVCouCisjIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpSRSYgZ3Rlc3RfcmVnZXggPSAocmVnZXgpOyBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0KiBndGVzdF9kdDsgXAorICAgIGlmICghOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpDcmVhdGUoI3N0YXRlbWVudCwgJmd0ZXN0X3JlZ2V4LCBcCisgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgJmd0ZXN0X2R0KSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgICBpZiAoZ3Rlc3RfZHQgIT0gTlVMTCkgeyBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyPCA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q+IFwKKyAgICAgICAgICBndGVzdF9kdF9wdHIoZ3Rlc3RfZHQpOyBcCisgICAgICBzd2l0Y2ggKGd0ZXN0X2R0LT5Bc3N1bWVSb2xlKCkpIHsgXAorICAgICAgICBjYXNlIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6T1ZFUlNFRV9URVNUOiBcCisgICAgICAgICAgaWYgKCFndGVzdF9kdC0+UGFzc2VkKHByZWRpY2F0ZShndGVzdF9kdC0+V2FpdCgpKSkpIHsgXAorICAgICAgICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcCisgICAgICAgICAgfSBcCisgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVDogeyBcCisgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpSZXR1cm5TZW50aW5lbCBcCisgICAgICAgICAgICAgIGd0ZXN0X3NlbnRpbmVsKGd0ZXN0X2R0KTsgXAorICAgICAgICAgIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZ3Rlc3RfZHQpOyBcCisgICAgICAgICAgZ3Rlc3RfZHQtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9ESURfTk9UX0RJRSk7IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgZGVmYXVsdDogXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6TGFzdE1lc3NhZ2UoKSkKKy8vIFRoZSBzeW1ib2wgImZhaWwiIGhlcmUgZXhwYW5kcyB0byBzb21ldGhpbmcgaW50byB3aGljaCBhIG1lc3NhZ2UKKy8vIGNhbiBiZSBzdHJlYW1lZC4KKworLy8gVGhpcyBtYWNybyBpcyBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVC9FWFBFQ1RfREVCVUdfREVBVEggd2hlbiBjb21waWxlZCBpbgorLy8gTkRFQlVHIG1vZGUuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRoZSBzdGF0ZW1lbnRzIHRvIGJlIGV4ZWN1dGVkLCB0aGUgcmVnZXggaXMKKy8vIGlnbm9yZWQsIGFuZCB0aGUgbWFjcm8gbXVzdCBhY2NlcHQgYSBzdHJlYW1lZCBtZXNzYWdlIGV2ZW4gdGhvdWdoIHRoZSBtZXNzYWdlCisvLyBpcyBuZXZlciBwcmludGVkLgorIyBkZWZpbmUgR1RFU1RfRVhFQ1VURV9TVEFURU1FTlRfKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgIH0gZWxzZSBcCisgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKworLy8gQSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIHBhcnNlZCBjb250ZW50cyBvZiB0aGUKKy8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZywgYXMgaXQgZXhpc3RlZCB3aGVuCisvLyBSVU5fQUxMX1RFU1RTIHdhcyBjYWxsZWQuCitjbGFzcyBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgeworIHB1YmxpYzoKKyAgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfd3JpdGVfZmQpCisgICAgICA6IGZpbGVfKGFfZmlsZSksIGxpbmVfKGFfbGluZSksIGluZGV4Xyhhbl9pbmRleCksCisgICAgICAgIHdyaXRlX2ZkXyhhX3dyaXRlX2ZkKSB7fQorCisgIH5JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgICAgaWYgKHdyaXRlX2ZkXyA+PSAwKQorICAgICAgcG9zaXg6OkNsb3NlKHdyaXRlX2ZkXyk7CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9CisgIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KKyAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gaW5kZXhfOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZmlsZV87CisgIGludCBsaW5lXzsKKyAgaW50IGluZGV4XzsKKyAgaW50IHdyaXRlX2ZkXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyk7Cit9OworCisvLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzCisvLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmCisvLyB0aGUgZmxhZyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCitJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCk7CisKKyNlbHNlICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGltcGxlbWVudGluZyBtYWNyb3Mgc3VjaCBhcworLy8gRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBhbmQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBvbiBzeXN0ZW1zIHdoZXJlCisvLyBkZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhvc2UgbWFjcm9zIG11c3QgY29tcGlsZSBvbiBzdWNoIHN5c3RlbXMKKy8vIGlmZiBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCBjb21waWxlIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBvbgorLy8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgZGVhdGggdGVzdHMuIFRoaXMgYWxsb3dzIG9uZSB0byB3cml0ZSBzdWNoIGEgbWFjcm8KKy8vIG9uIGEgc3lzdGVtIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBhbmQgYmUgc3VyZSB0aGF0IGl0IHdpbGwKKy8vIGNvbXBpbGUgb24gYSBkZWF0aC10ZXN0IHN1cHBvcnRpbmcgc3lzdGVtLgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgIHN0YXRlbWVudCAtICBBIHN0YXRlbWVudCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdGVzdAorLy8gICAgICAgICAgICAgICAgZm9yIHByb2dyYW0gdGVybWluYXRpb24uIFRoaXMgbWFjcm8gaGFzIHRvIG1ha2Ugc3VyZSB0aGlzCisvLyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgaXMgY29tcGlsZWQgYnV0IG5vdCBleGVjdXRlZCwgdG8gZW5zdXJlIHRoYXQKKy8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgY29tcGlsZXMgd2l0aCBhIGNlcnRhaW4KKy8vICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpZmYgRVhQRUNUX0RFQVRIIGNvbXBpbGVzIHdpdGggaXQuCisvLyAgIHJlZ2V4ICAgICAtICBBIHJlZ2V4IHRoYXQgYSBtYWNybyBzdWNoIGFzIEVYUEVDVF9ERUFUSCB3b3VsZCB1c2UgdG8gdGVzdAorLy8gICAgICAgICAgICAgICAgdGhlIG91dHB1dCBvZiBzdGF0ZW1lbnQuICBUaGlzIHBhcmFtZXRlciBoYXMgdG8gYmUKKy8vICAgICAgICAgICAgICAgIGNvbXBpbGVkIGJ1dCBub3QgZXZhbHVhdGVkIGJ5IHRoaXMgbWFjcm8sIHRvIGVuc3VyZSB0aGF0CisvLyAgICAgICAgICAgICAgICB0aGlzIG1hY3JvIG9ubHkgYWNjZXB0cyBleHByZXNzaW9ucyB0aGF0IGEgbWFjcm8gc3VjaCBhcworLy8gICAgICAgICAgICAgICAgRVhQRUNUX0RFQVRIIHdvdWxkIGFjY2VwdC4KKy8vICAgdGVybWluYXRvciAtIE11c3QgYmUgYW4gZW1wdHkgc3RhdGVtZW50IGZvciBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVECisvLyAgICAgICAgICAgICAgICBhbmQgYSByZXR1cm4gc3RhdGVtZW50IGZvciBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVELgorLy8gICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCB3aWxsIG5vdAorLy8gICAgICAgICAgICAgICAgY29tcGlsZSBpbnNpZGUgZnVuY3Rpb25zIHdoZXJlIEFTU0VSVF9ERUFUSCBkb2Vzbid0CisvLyAgICAgICAgICAgICAgICBjb21waWxlLgorLy8KKy8vICBUaGUgYnJhbmNoIHRoYXQgaGFzIGFuIGFsd2F5cyBmYWxzZSBjb25kaXRpb24gaXMgdXNlZCB0byBlbnN1cmUgdGhhdAorLy8gIHN0YXRlbWVudCBhbmQgcmVnZXggYXJlIGNvbXBpbGVkIChhbmQgdGh1cyBzeW50YWN0aWNhbGx5IGNvcnJlY3QpIGJ1dAorLy8gIG5ldmVyIGV4ZWN1dGVkLiBUaGUgdW5yZWFjaGFibGUgY29kZSBtYWNybyBwcm90ZWN0cyB0aGUgdGVybWluYXRvcgorLy8gIHN0YXRlbWVudCBmcm9tIGdlbmVyYXRpbmcgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgaW4gY2FzZQorLy8gIHN0YXRlbWVudCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJucyBvciB0aHJvd3MuIFRoZSBNZXNzYWdlIGNvbnN0cnVjdG9yIGF0CisvLyAgdGhlIGVuZCBhbGxvd3MgdGhlIHN5bnRheCBvZiBzdHJlYW1pbmcgYWRkaXRpb25hbCBtZXNzYWdlcyBpbnRvIHRoZQorLy8gIG1hY3JvLCBmb3IgY29tcGlsYXRpb25hbCBjb21wYXRpYmlsaXR5IHdpdGggRVhQRUNUX0RFQVRIL0FTU0VSVF9ERUFUSC4KKyMgZGVmaW5lIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHRlcm1pbmF0b3IpIFwKKyAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIFwKKyAgICAgICAgICA8PCAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS5cbiIgXAorICAgICAgICAgIDw8ICJTdGF0ZW1lbnQgJyIgI3N0YXRlbWVudCAiJyBjYW5ub3QgYmUgdmVyaWZpZWQuIjsgXAorICAgIH0gZWxzZSBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkgeyBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTo6UGFydGlhbE1hdGNoKCIuKiIsIChyZWdleCkpOyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICAgIHRlcm1pbmF0b3I7IFwKKyAgICB9IGVsc2UgXAorICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBzdHlsZSBvZiBkZWF0aCB0ZXN0cy4gIFZhbGlkIHZhbHVlcyBhcmUgInRocmVhZHNhZmUiLAorLy8gbWVhbmluZyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Mgd2lsbCByZS1leGVjdXRlIHRoZSB0ZXN0IGJpbmFyeQorLy8gZnJvbSB0aGUgc3RhcnQsIHJ1bm5pbmcgb25seSBhIHNpbmdsZSBkZWF0aCB0ZXN0LCBvciAiZmFzdCIsCisvLyBtZWFuaW5nIHRoYXQgdGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBleGVjdXRlIHRoZSB0ZXN0IGxvZ2ljIGltbWVkaWF0ZWx5CisvLyBhZnRlciBmb3JraW5nLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGRlYXRoX3Rlc3Rfc3R5bGUpOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5CisvLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMKKy8vIFZhbGdyaW5kIGhlYXAgY2hlY2tlcnMgbWF5IG5lZWQgdGhpcyB0byBtb2RpZnkgdGhlaXIgYmVoYXZpb3IgaW4gZGVhdGgKKy8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuCitHVEVTVF9BUElfIGJvb2wgSW5EZWF0aFRlc3RDaGlsZCgpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBkZWF0aCB0ZXN0cy4KKworLy8gSGVyZSdzIHdoYXQgaGFwcGVucyB3aGVuIGFuIEFTU0VSVF9ERUFUSCogb3IgRVhQRUNUX0RFQVRIKiBpcworLy8gZXhlY3V0ZWQ6CisvLworLy8gICAxLiBJdCBnZW5lcmF0ZXMgYSB3YXJuaW5nIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYWN0aXZlCisvLyAgIHRocmVhZC4gIFRoaXMgaXMgYmVjYXVzZSBpdCdzIHNhZmUgdG8gZm9yaygpIG9yIGNsb25lKCkgb25seQorLy8gICB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHRocmVhZC4KKy8vCisvLyAgIDIuIFRoZSBwYXJlbnQgcHJvY2VzcyBjbG9uZSgpcyBhIHN1Yi1wcm9jZXNzIGFuZCBydW5zIHRoZSBkZWF0aAorLy8gICB0ZXN0IGluIGl0OyB0aGUgc3ViLXByb2Nlc3MgZXhpdHMgd2l0aCBjb2RlIDAgYXQgdGhlIGVuZCBvZiB0aGUKKy8vICAgZGVhdGggdGVzdCwgaWYgaXQgaGFzbid0IGV4aXRlZCBhbHJlYWR5LgorLy8KKy8vICAgMy4gVGhlIHBhcmVudCBwcm9jZXNzIHdhaXRzIGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlLgorLy8KKy8vICAgNC4gVGhlIHBhcmVudCBwcm9jZXNzIGNoZWNrcyB0aGUgZXhpdCBjb2RlIGFuZCBlcnJvciBtZXNzYWdlIG9mCisvLyAgIHRoZSBzdWItcHJvY2Vzcy4KKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEFTU0VSVF9ERUFUSChzZXJ2ZXIuU2VuZE1lc3NhZ2UoNTYsICJIZWxsbyIpLCAiSW52YWxpZCBwb3J0IG51bWJlciIpOworLy8gICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworLy8gICAgIEVYUEVDVF9ERUFUSChzZXJ2ZXIuUHJvY2Vzc1JlcXVlc3QoaSksCisvLyAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVlc3QgLiogaW4gUHJvY2Vzc1JlcXVlc3QoKSIpCisvLyAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZGllIG9uIHJlcXVlc3QgIiA8PCBpOworLy8gICB9CisvLworLy8gICBBU1NFUlRfRVhJVChzZXJ2ZXIuRXhpdE5vdygpLCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiRXhpdGluZyIpOworLy8KKy8vICAgYm9vbCBLaWxsZWRCeVNJR0hVUChpbnQgZXhpdF9jb2RlKSB7CisvLyAgICAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfY29kZSkgJiYgV1RFUk1TSUcoZXhpdF9jb2RlKSA9PSBTSUdIVVA7CisvLyAgIH0KKy8vCisvLyAgIEFTU0VSVF9FWElUKGNsaWVudC5IYW5nVXBTZXJ2ZXIoKSwgS2lsbGVkQnlTSUdIVVAsICJIYW5naW5nIHVwISIpOworLy8KKy8vIE9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgaW4gZGVhdGggdGVzdHM6CisvLworLy8gICBPbiBQT1NJWC1jb21wbGlhbnQgc3lzdGVtcyAoKm5peCksIHdlIHVzZSB0aGUgPHJlZ2V4Lmg+IGxpYnJhcnksCisvLyAgIHdoaWNoIHVzZXMgdGhlIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IHN5bnRheC4KKy8vCisvLyAgIE9uIG90aGVyIHBsYXRmb3JtcyAoZS5nLiBXaW5kb3dzKSwgd2Ugb25seSBzdXBwb3J0IGEgc2ltcGxlIHJlZ2V4CisvLyAgIHN5bnRheCBpbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIEdvb2dsZSBUZXN0LiAgVGhpcyBsaW1pdGVkCisvLyAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBlbm91Z2ggbW9zdCBvZiB0aGUgdGltZSB3aGVuIHdyaXRpbmcKKy8vICAgZGVhdGggdGVzdHM7IHRob3VnaCBpdCBsYWNrcyBtYW55IGZlYXR1cmVzIHlvdSBjYW4gZmluZCBpbiBQQ1JFCisvLyAgIG9yIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IHN5bnRheC4gIEZvciBleGFtcGxlLCB3ZSBkb24ndCBzdXBwb3J0CisvLyAgIHVuaW9uICgieHx5IiksIGdyb3VwaW5nICgiKHh5KSIpLCBicmFja2V0cyAoIlt4eV0iKSwgYW5kCisvLyAgIHJlcGV0aXRpb24gY291bnQgKCJ4ezUsN30iKSwgYW1vbmcgb3RoZXJzLgorLy8KKy8vICAgQmVsb3cgaXMgdGhlIHN5bnRheCB0aGF0IHdlIGRvIHN1cHBvcnQuICBXZSBjaG9zZSBpdCB0byBiZSBhCisvLyAgIHN1YnNldCBvZiBib3RoIFBDUkUgYW5kIFBPU0lYIGV4dGVuZGVkIHJlZ2V4LCBzbyBpdCdzIGVhc3kgdG8KKy8vICAgbGVhcm4gd2hlcmV2ZXIgeW91IGNvbWUgZnJvbS4gIEluIHRoZSBmb2xsb3dpbmc6ICdBJyBkZW5vdGVzIGEKKy8vICAgbGl0ZXJhbCBjaGFyYWN0ZXIsIHBlcmlvZCAoLiksIG9yIGEgc2luZ2xlIFxcIGVzY2FwZSBzZXF1ZW5jZTsKKy8vICAgJ3gnIGFuZCAneScgZGVub3RlIHJlZ3VsYXIgZXhwcmVzc2lvbnM7ICdtJyBhbmQgJ24nIGFyZSBmb3IKKy8vICAgbmF0dXJhbCBudW1iZXJzLgorLy8KKy8vICAgICBjICAgICBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBjCisvLyAgICAgXFxkICAgbWF0Y2hlcyBhbnkgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcRCAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcZiAgIG1hdGNoZXMgXGYKKy8vICAgICBcXG4gICBtYXRjaGVzIFxuCisvLyAgICAgXFxyICAgbWF0Y2hlcyBccgorLy8gICAgIFxccyAgIG1hdGNoZXMgYW55IEFTQ0lJIHdoaXRlc3BhY2UsIGluY2x1ZGluZyBcbgorLy8gICAgIFxcUyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgd2hpdGVzcGFjZQorLy8gICAgIFxcdCAgIG1hdGNoZXMgXHQKKy8vICAgICBcXHYgICBtYXRjaGVzIFx2CisvLyAgICAgXFx3ICAgbWF0Y2hlcyBhbnkgbGV0dGVyLCBfLCBvciBkZWNpbWFsIGRpZ2l0CisvLyAgICAgXFxXICAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQgXFx3IGRvZXNuJ3QgbWF0Y2gKKy8vICAgICBcXGMgICBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBjLCB3aGljaCBtdXN0IGJlIGEgcHVuY3R1YXRpb24KKy8vICAgICAuICAgICBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBcbgorLy8gICAgIEE/ICAgIG1hdGNoZXMgMCBvciAxIG9jY3VycmVuY2VzIG9mIEEKKy8vICAgICBBKiAgICBtYXRjaGVzIDAgb3IgbWFueSBvY2N1cnJlbmNlcyBvZiBBCisvLyAgICAgQSsgICAgbWF0Y2hlcyAxIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQorLy8gICAgIF4gICAgIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKQorLy8gICAgICQgICAgIG1hdGNoZXMgdGhlIGVuZCBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKQorLy8gICAgIHh5ICAgIG1hdGNoZXMgeCBmb2xsb3dlZCBieSB5CisvLworLy8gICBJZiB5b3UgYWNjaWRlbnRhbGx5IHVzZSBQQ1JFIG9yIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IGZlYXR1cmVzCisvLyAgIG5vdCBpbXBsZW1lbnRlZCBieSB1cywgeW91IHdpbGwgZ2V0IGEgcnVuLXRpbWUgZmFpbHVyZS4gIEluIHRoYXQKKy8vICAgY2FzZSwgcGxlYXNlIHRyeSB0byByZXdyaXRlIHlvdXIgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiB0aGUKKy8vICAgYWJvdmUgc3ludGF4LgorLy8KKy8vICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAqbm90KiBtZWFudCB0byBiZSBhcyBoaWdobHkgdHVuZWQgb3Igcm9idXN0CisvLyAgIGFzIGEgY29tcGlsZWQgcmVnZXggbGlicmFyeSwgYnV0IHNob3VsZCBwZXJmb3JtIHdlbGwgZW5vdWdoIGZvciBhCisvLyAgIGRlYXRoIHRlc3QsIHdoaWNoIGFscmVhZHkgaW5jdXJzIHNpZ25pZmljYW50IG92ZXJoZWFkIGJ5IGxhdW5jaGluZworLy8gICBhIGNoaWxkIHByb2Nlc3MuCisvLworLy8gS25vd24gY2F2ZWF0czoKKy8vCisvLyAgIEEgInRocmVhZHNhZmUiIHN0eWxlIGRlYXRoIHRlc3Qgb2J0YWlucyB0aGUgcGF0aCB0byB0aGUgdGVzdAorLy8gICBwcm9ncmFtIGZyb20gYXJndlswXSBhbmQgcmUtZXhlY3V0ZXMgaXQgaW4gdGhlIHN1Yi1wcm9jZXNzLiAgRm9yCisvLyAgIHNpbXBsaWNpdHksIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRICisvLyAgIHdoZW4gbGF1bmNoaW5nIHRoZSBzdWItcHJvY2Vzcy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBtdXN0CisvLyAgIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUKKy8vICAgcGF0aCBzZXBhcmF0b3IgKGUuZy4gcGF0aC90by9mb29fdGVzdCBhbmQKKy8vICAgL2Fic29sdXRlL3BhdGgvdG8vYmFyX3Rlc3QgYXJlIGZpbmUsIGJ1dCBmb29fdGVzdCBpcyBub3QpLiAgVGhpcworLy8gICBpcyByYXJlbHkgYSBwcm9ibGVtIGFzIHBlb3BsZSB1c3VhbGx5IGRvbid0IHB1dCB0aGUgdGVzdCBiaW5hcnkKKy8vICAgZGlyZWN0b3J5IGluIFBBVEguCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG1ha2UgdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMgc2VhcmNoIHRoZSBQQVRILgorCisvLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIHdpdGggYW4KKy8vIGludGVnZXIgZXhpdCBzdGF0dXMgdGhhdCBzYXRpc2ZpZXMgcHJlZGljYXRlLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0CisvLyB0aGF0IG1hdGNoZXMgcmVnZXguCisjIGRlZmluZSBBU1NFUlRfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKKyAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisvLyBMaWtlIEFTU0VSVF9FWElULCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCisvLyB0ZXN0IGNhc2UsIGlmIGFueToKKyMgZGVmaW5lIEVYUEVDVF9FWElUKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCkgXAorICAgIEdURVNUX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisKKy8vIEFzc2VydHMgdGhhdCBhIGdpdmVuIHN0YXRlbWVudCBjYXVzZXMgdGhlIHByb2dyYW0gdG8gZXhpdCwgZWl0aGVyIGJ5CisvLyBleHBsaWNpdGx5IGV4aXRpbmcgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlIG9yIGJlaW5nIGtpbGxlZCBieSBhCisvLyBzaWduYWwsIGFuZCBlbWl0dGluZyBlcnJvciBvdXRwdXQgdGhhdCBtYXRjaGVzIHJlZ2V4LgorIyBkZWZpbmUgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBBU1NFUlRfRVhJVChzdGF0ZW1lbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4aXRlZFVuc3VjY2Vzc2Z1bGx5LCByZWdleCkKKworLy8gTGlrZSBBU1NFUlRfREVBVEgsIGJ1dCBjb250aW51ZXMgb24gdG8gc3VjY2Vzc2l2ZSB0ZXN0cyBpbiB0aGUKKy8vIHRlc3QgY2FzZSwgaWYgYW55OgorIyBkZWZpbmUgRVhQRUNUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4aXRlZFVuc3VjY2Vzc2Z1bGx5LCByZWdleCkKKworLy8gVHdvIHByZWRpY2F0ZSBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4ge0FTU0VSVCxFWFBFQ1R9X0VYSVQqOgorCisvLyBUZXN0cyB0aGF0IGFuIGV4aXQgY29kZSBkZXNjcmliZXMgYSBub3JtYWwgZXhpdCB3aXRoIGEgZ2l2ZW4gZXhpdCBjb2RlLgorY2xhc3MgR1RFU1RfQVBJXyBFeGl0ZWRXaXRoQ29kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKTsKKyAgYm9vbCBvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3Q7CisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBFeGl0ZWRXaXRoQ29kZSYgb3RoZXIpOworCisgIGNvbnN0IGludCBleGl0X2NvZGVfOworfTsKKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGFuIGV4aXQgZHVlIHRvIHRlcm1pbmF0aW9uIGJ5IGEKKy8vIGdpdmVuIHNpZ25hbC4KK2NsYXNzIEdURVNUX0FQSV8gS2lsbGVkQnlTaWduYWwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgS2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSk7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OworIHByaXZhdGU6CisgIGNvbnN0IGludCBzaWdudW1fOworfTsKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKKy8vIEVYUEVDVF9ERUJVR19ERUFUSCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHN0YXRlbWVudHMgZGllIGluIGRlYnVnIG1vZGUuCisvLyBUaGUgZGVhdGggdGVzdGluZyBmcmFtZXdvcmsgY2F1c2VzIHRoaXMgdG8gaGF2ZSBpbnRlcmVzdGluZyBzZW1hbnRpY3MsCisvLyBzaW5jZSB0aGUgc2lkZWVmZmVjdHMgb2YgdGhlIGNhbGwgYXJlIG9ubHkgdmlzaWJsZSBpbiBvcHQgbW9kZSwgYW5kIG5vdAorLy8gaW4gZGVidWcgbW9kZS4KKy8vCisvLyBJbiBwcmFjdGljZSwgdGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IGZ1bmN0aW9ucyB0aGF0IHV0aWxpemUgdGhlCisvLyBMT0coREZBVEFMKSBtYWNybyB1c2luZyB0aGUgZm9sbG93aW5nIHN0eWxlOgorLy8KKy8vIGludCBEaWVJbkRlYnVnT3IxMihpbnQqIHNpZGVlZmZlY3QpIHsKKy8vICAgaWYgKHNpZGVlZmZlY3QpIHsKKy8vICAgICAqc2lkZWVmZmVjdCA9IDEyOworLy8gICB9CisvLyAgIExPRyhERkFUQUwpIDw8ICJkZWF0aCI7CisvLyAgIHJldHVybiAxMjsKKy8vIH0KKy8vCisvLyBURVNUKFRlc3RDYXNlLCBUZXN0RGllT3IxMldvcmtzSW5EZ2JBbmRPcHQpIHsKKy8vICAgaW50IHNpZGVlZmZlY3QgPSAwOworLy8gICAvLyBPbmx5IGFzc2VydHMgaW4gZGJnLgorLy8gICBFWFBFQ1RfREVCVUdfREVBVEgoRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpLCAiZGVhdGgiKTsKKy8vCisvLyAjaWZkZWYgTkRFQlVHCisvLyAgIC8vIG9wdC1tb2RlIGhhcyBzaWRlZWZmZWN0IHZpc2libGUuCisvLyAgIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7CisvLyAjZWxzZQorLy8gICAvLyBkYmctbW9kZSBubyB2aXNpYmxlIHNpZGVlZmZlY3QuCisvLyAgIEVYUEVDVF9FUSgwLCBzaWRlZWZmZWN0KTsKKy8vICNlbmRpZgorLy8gfQorLy8KKy8vIFRoaXMgd2lsbCBhc3NlcnQgdGhhdCBEaWVJbkRlYnVnUmV0dXJuMTJJbk9wdCgpIGNyYXNoZXMgaW4gZGVidWcKKy8vIG1vZGUsIHVzdWFsbHkgZHVlIHRvIGEgRENIRUNLIG9yIExPRyhERkFUQUwpLCBidXQgcmV0dXJucyB0aGUKKy8vIGFwcHJvcHJpYXRlIGZhbGxiYWNrIHZhbHVlICgxMiBpbiB0aGlzIGNhc2UpIGluIG9wdCBtb2RlLiBJZiB5b3UKKy8vIG5lZWQgdG8gdGVzdCB0aGF0IGEgZnVuY3Rpb24gaGFzIGFwcHJvcHJpYXRlIHNpZGUtZWZmZWN0cyBpbiBvcHQKKy8vIG1vZGUsIGluY2x1ZGUgYXNzZXJ0aW9ucyBhZ2FpbnN0IHRoZSBzaWRlLWVmZmVjdHMuICBBIGdlbmVyYWwKKy8vIHBhdHRlcm4gZm9yIHRoaXMgaXM6CisvLworLy8gRVhQRUNUX0RFQlVHX0RFQVRIKHsKKy8vICAgLy8gU2lkZS1lZmZlY3RzIGhlcmUgd2lsbCBoYXZlIGFuIGVmZmVjdCBhZnRlciB0aGlzIHN0YXRlbWVudCBpbgorLy8gICAvLyBvcHQgbW9kZSwgYnV0IG5vbmUgaW4gZGVidWcgbW9kZS4KKy8vICAgRVhQRUNUX0VRKDEyLCBEaWVJbkRlYnVnT3IxMigmc2lkZWVmZmVjdCkpOworLy8gfSwgImRlYXRoIik7CisvLworIyBpZmRlZiBOREVCVUcKKworIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KQorCisjICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgR1RFU1RfRVhFQ1VURV9TVEFURU1FTlRfKHN0YXRlbWVudCwgcmVnZXgpCisKKyMgZWxzZQorCisjICBkZWZpbmUgRVhQRUNUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgRVhQRUNUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisKKyMgIGRlZmluZSBBU1NFUlRfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBBU1NFUlRfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKworIyBlbmRpZiAgLy8gTkRFQlVHIGZvciBFWFBFQ1RfREVCVUdfREVBVEgKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBhbmQKKy8vIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgZXhwYW5kIHRvIHJlYWwgZGVhdGggdGVzdHMgaWYKKy8vIGRlYXRoIHRlc3RzIGFyZSBzdXBwb3J0ZWQ7IG90aGVyd2lzZSB0aGV5IGp1c3QgaXNzdWUgYSB3YXJuaW5nLiAgVGhpcyBpcworLy8gdXNlZnVsIHdoZW4geW91IGFyZSBjb21iaW5pbmcgZGVhdGggdGVzdCBhc3NlcnRpb25zIHdpdGggbm9ybWFsIHRlc3QKKy8vIGFzc2VydGlvbnMgaW4gb25lIHRlc3QuCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorIyBkZWZpbmUgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisjZWxzZQorIyBkZWZpbmUgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgR1RFU1RfVU5TVVBQT1JURURfREVBVEhfVEVTVF8oc3RhdGVtZW50LCByZWdleCwgKQorIyBkZWZpbmUgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgR1RFU1RfVU5TVVBQT1JURURfREVBVEhfVEVTVF8oc3RhdGVtZW50LCByZWdleCwgcmV0dXJuKQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gTWFjcm9zIGFuZCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzCisvLyBpbiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KKworCisvLyBWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFsbG93IHlvdSB0byB0ZXN0IHlvdXIgY29kZSB3aXRoIGRpZmZlcmVudAorLy8gcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuCisvLworLy8gSGVyZSBpcyBob3cgeW91IHVzZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzOgorCisjaWYgMAorCisvLyBUbyB3cml0ZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCBmaXJzdCB5b3Ugc2hvdWxkIGRlZmluZSBhIGZpeHR1cmUKKy8vIGNsYXNzLiBJdCBpcyB1c3VhbGx5IGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFQ+IChzZWUgYmVsb3cgZm9yCisvLyBhbm90aGVyIGluaGVyaXRhbmNlIHNjaGVtZSB0aGF0J3Mgc29tZXRpbWVzIHVzZWZ1bCBpbiBtb3JlIGNvbXBsaWNhdGVkCisvLyBjbGFzcyBoaWVyYXJjaGllcyksIHdoZXJlIHRoZSB0eXBlIG9mIHlvdXIgcGFyYW1ldGVyIHZhbHVlcy4KKy8vIFRlc3RXaXRoUGFyYW08VD4gaXMgaXRzZWxmIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0LiBUIGNhbiBiZSBhbnkKKy8vIGNvcHlhYmxlIHR5cGUuIElmIGl0J3MgYSByYXcgcG9pbnRlciwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisvLyBsaWZlc3BhbiBvZiB0aGUgcG9pbnRlZCB2YWx1ZXMuCisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7CisgIC8vIFlvdSBjYW4gaW1wbGVtZW50IGFsbCB0aGUgdXN1YWwgY2xhc3MgZml4dHVyZSBtZW1iZXJzIGhlcmUuCit9OworCisvLyBUaGVuLCB1c2UgdGhlIFRFU1RfUCBtYWNybyB0byBkZWZpbmUgYXMgbWFueSBwYXJhbWV0ZXJpemVkIHRlc3RzCisvLyBmb3IgdGhpcyBmaXh0dXJlIGFzIHlvdSB3YW50LiBUaGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIKKy8vIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdSBwcmVmZXIgdG8gdGhpbmsuCisKK1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyIHdpdGggdGhlIEdldFBhcmFtKCkgbWV0aG9kCisgIC8vIG9mIHRoZSBUZXN0V2l0aFBhcmFtPFQ+IGNsYXNzOgorICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7CisgIC4uLgorfQorCitURVNUX1AoRm9vVGVzdCwgSGFzQmxhaEJsYWgpIHsKKyAgLi4uCit9CisKKy8vIEZpbmFsbHksIHlvdSBjYW4gdXNlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0CisvLyBjYXNlIHdpdGggYW55IHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3YW50LiBHb29nbGUgVGVzdCBkZWZpbmVzIGEgbnVtYmVyCisvLyBvZiBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGVzdCBwYXJhbWV0ZXJzLiBUaGV5IHJldHVybiB3aGF0IHdlIGNhbGwKKy8vIChzdXJwcmlzZSEpIHBhcmFtZXRlciBnZW5lcmF0b3JzLiBIZXJlIGlzIGEgIHN1bW1hcnkgb2YgdGhlbSwgd2hpY2gKKy8vIGFyZSBhbGwgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlOgorLy8KKy8vCisvLyAgUmFuZ2UoYmVnaW4sIGVuZCBbLCBzdGVwXSkgLSBZaWVsZHMgdmFsdWVzIHtiZWdpbiwgYmVnaW4rc3RlcCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luK3N0ZXArc3RlcCwgLi4ufS4gVGhlIHZhbHVlcyBkbyBub3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZW5kLiBzdGVwIGRlZmF1bHRzIHRvIDEuCisvLyAgVmFsdWVzKHYxLCB2MiwgLi4uLCB2TikgICAgLSBZaWVsZHMgdmFsdWVzIHt2MSwgdjIsIC4uLiwgdk59LgorLy8gIFZhbHVlc0luKGNvbnRhaW5lcikgICAgICAgIC0gWWllbGRzIHZhbHVlcyBmcm9tIGEgQy1zdHlsZSBhcnJheSwgYW4gU1RMCisvLyAgVmFsdWVzSW4oYmVnaW4sZW5kKSAgICAgICAgICBjb250YWluZXIsIG9yIGFuIGl0ZXJhdG9yIHJhbmdlIFtiZWdpbiwgZW5kKS4KKy8vICBCb29sKCkgICAgICAgICAgICAgICAgICAgICAtIFlpZWxkcyBzZXF1ZW5jZSB7ZmFsc2UsIHRydWV9LgorLy8gIENvbWJpbmUoZzEsIGcyLCAuLi4sIGdOKSAgIC0gWWllbGRzIGFsbCBjb21iaW5hdGlvbnMgKHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtYXRoIHNhdnZ5KSBvZiB0aGUgdmFsdWVzIGdlbmVyYXRlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIE4gZ2VuZXJhdG9ycy4KKy8vCisvLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBiZWxvdworLy8gaW4gdGhpcyBmaWxlLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgZnJvbSB0aGUgRm9vVGVzdCB0ZXN0IGNhc2UKKy8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJtZWVueSIsICJtaW55IiwgYW5kICJtb2UiLgorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvb1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoIm1lZW55IiwgIm1pbnkiLCAibW9lIikpOworCisvLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCAoeWVzLCB5b3UKKy8vIGNhbiBpbnN0YW50aWF0ZSBpdCBtb3JlIHRoZW4gb25jZSkgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQorLy8gYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IgZGlmZmVyZW50CisvLyBpbnN0YW50aWF0aW9ucy4gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlCisvLyB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgIm1lZW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJtaW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzIgZm9yICJtb2UiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgIm1lZW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJtaW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzIgZm9yICJtb2UiCisvLworLy8gWW91IGNhbiB1c2UgdGhlc2UgbmFtZXMgaW4gLS1ndGVzdF9maWx0ZXIuCisvLworLy8gVGhpcyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMgZnJvbSBGb29UZXN0IGFnYWluLCBlYWNoCisvLyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgImNhdCIgYW5kICJkb2ciOgorCitjb25zdCBjaGFyKiBwZXRzW10gPSB7ImNhdCIsICJkb2cifTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZSwgRm9vVGVzdCwgVmFsdWVzSW4ocGV0cykpOworCisvLyBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUgdGhlc2UgbmFtZXM6CisvLworLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAiY2F0IgorLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAiZG9nIgorLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAiY2F0IgorLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAiZG9nIgorLy8KKy8vIFBsZWFzZSBub3RlIHRoYXQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMKKy8vIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UsIHdoZXRoZXIgdGhlaXIgZGVmaW5pdGlvbnMgY29tZSBiZWZvcmUgb3IKKy8vIEFGVEVSIHRoZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBzdGF0ZW1lbnQuCisvLworLy8gUGxlYXNlIGFsc28gbm90ZSB0aGF0IGdlbmVyYXRvciBleHByZXNzaW9ucyAoaW5jbHVkaW5nIHBhcmFtZXRlcnMgdG8gdGhlCisvLyBnZW5lcmF0b3JzKSBhcmUgZXZhbHVhdGVkIGluIEluaXRHb29nbGVUZXN0KCksIGFmdGVyIG1haW4oKSBoYXMgc3RhcnRlZC4KKy8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIG9uIG9uZSBoYW5kLCB0byBhZGp1c3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgaW4gb3JkZXIKKy8vIHRvIGR5bmFtaWNhbGx5IGRldGVybWluZSBhIHNldCBvZiB0ZXN0cyB0byBydW4gYW5kIG9uIHRoZSBvdGhlciBoYW5kLAorLy8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBpbnNwZWN0IHRoZSBnZW5lcmF0ZWQgdGVzdHMgd2l0aCBHb29nbGUgVGVzdAorLy8gcmVmbGVjdGlvbiBBUEkgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBleGVjdXRlZC4KKy8vCisvLyBZb3UgY2FuIHNlZSBzYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgYW5kIHNhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYworLy8gZm9yIG1vcmUgZXhhbXBsZXMuCisvLworLy8gSW4gdGhlIGZ1dHVyZSwgd2UgcGxhbiB0byBwdWJsaXNoIHRoZSBBUEkgZm9yIGRlZmluaW5nIG5ldyBwYXJhbWV0ZXIKKy8vIGdlbmVyYXRvcnMuIEJ1dCBmb3Igbm93IHRoaXMgaW50ZXJmYWNlIHJlbWFpbnMgcGFydCBvZiB0aGUgaW50ZXJuYWwKKy8vIGltcGxlbWVudGF0aW9uIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKy8vCisvLworLy8gQSBwYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0IGFuZCBmcm9tCisvLyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8VD4sIHdoZXJlIFQgaXMgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgorLy8gdmFsdWVzLiBJbmhlcml0aW5nIGZyb20gVGVzdFdpdGhQYXJhbTxUPiBzYXRpc2ZpZXMgdGhhdCByZXF1aXJlbWVudCBiZWNhdXNlCisvLyBUZXN0V2l0aFBhcmFtPFQ+IGluaGVyaXRzIGZyb20gYm90aCBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vcmUKKy8vIGNvbXBsaWNhdGVkIGhpZXJhcmNoaWVzLCBob3dldmVyLCBpdCBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsIHRvIGluaGVyaXQKKy8vIHNlcGFyYXRlbHkgZnJvbSBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEZvciBleGFtcGxlOgorCitjbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAvLyBZb3UgY2FuIGluaGVyaXQgYWxsIHRoZSB1c3VhbCBtZW1iZXJzIGZvciBhIG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QKKyAgLy8gZml4dHVyZSBoZXJlLgorfTsKKworY2xhc3MgRGVyaXZlZFRlc3QgOiBwdWJsaWMgQmFzZVRlc3QsIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQ+IHsKKyAgLy8gVGhlIHVzdWFsIHRlc3QgZml4dHVyZSBtZW1iZXJzIGdvIGhlcmUgdG9vLgorfTsKKworVEVTVF9GKEJhc2VUZXN0LCBIYXNGb28pIHsKKyAgLy8gVGhpcyBpcyBhbiBvcmRpbmFyeSBub24tcGFyYW1ldGVyaXplZCB0ZXN0LgorfQorCitURVNUX1AoRGVyaXZlZFRlc3QsIERvZXNCbGFoKSB7CisgIC8vIEdldFBhcmFtIHdvcmtzIGp1c3QgdGhlIHNhbWUgaGVyZSBhcyBpZiB5b3UgaW5oZXJpdCBmcm9tIFRlc3RXaXRoUGFyYW0uCisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKK30KKworI2VuZGlmICAvLyAwCisKKworI2lmICFHVEVTVF9PU19TWU1CSUFOCisjIGluY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKy8vIENvcHlyaWdodCAyMDAzIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IERhbiBFZ25vciAoZWdub3JAZ29vZ2xlLmNvbSkKKy8vCisvLyBBICJzbWFydCIgcG9pbnRlciB0eXBlIHdpdGggcmVmZXJlbmNlIHRyYWNraW5nLiAgRXZlcnkgcG9pbnRlciB0byBhCisvLyBwYXJ0aWN1bGFyIG9iamVjdCBpcyBrZXB0IG9uIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuICBXaGVuIHRoZSBsYXN0IHBvaW50ZXIKKy8vIHRvIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQgb3IgcmVhc3NpZ25lZCwgdGhlIG9iamVjdCBpcyBkZWxldGVkLgorLy8KKy8vIFVzZWQgcHJvcGVybHksIHRoaXMgZGVsZXRlcyB0aGUgb2JqZWN0IHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGdvZXMgYXdheS4KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIGNhdmVhdHM6CisvLyAtIExpa2UgYWxsIHJlZmVyZW5jZSBjb3VudGluZyBzY2hlbWVzLCBjeWNsZXMgbGVhZCB0byBsZWFrcy4KKy8vIC0gRWFjaCBzbWFydCBwb2ludGVyIGlzIGFjdHVhbGx5IHR3byBwb2ludGVycyAoOCBieXRlcyBpbnN0ZWFkIG9mIDQpLgorLy8gLSBFdmVyeSB0aW1lIGEgcG9pbnRlciBpcyBhc3NpZ25lZCwgdGhlIGVudGlyZSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoYXQKKy8vICAgb2JqZWN0IGlzIHRyYXZlcnNlZC4gIFRoaXMgY2xhc3MgaXMgdGhlcmVmb3JlIE5PVCBTVUlUQUJMRSB3aGVuIHRoZXJlCisvLyAgIHdpbGwgb2Z0ZW4gYmUgbW9yZSB0aGFuIHR3byBvciB0aHJlZSBwb2ludGVycyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0LgorLy8gLSBSZWZlcmVuY2VzIGFyZSBvbmx5IHRyYWNrZWQgYXMgbG9uZyBhcyBsaW5rZWRfcHRyPD4gb2JqZWN0cyBhcmUgY29waWVkLgorLy8gICBJZiBhIGxpbmtlZF9wdHI8PiBpcyBjb252ZXJ0ZWQgdG8gYSByYXcgcG9pbnRlciBhbmQgYmFjaywgQkFEIFRISU5HUworLy8gICB3aWxsIGhhcHBlbiAoZG91YmxlIGRlbGV0aW9uKS4KKy8vCisvLyBBIGdvb2QgdXNlIG9mIHRoaXMgY2xhc3MgaXMgc3RvcmluZyBvYmplY3QgcmVmZXJlbmNlcyBpbiBTVEwgY29udGFpbmVycy4KKy8vIFlvdSBjYW4gc2FmZWx5IHB1dCBsaW5rZWRfcHRyPD4gaW4gYSB2ZWN0b3I8Pi4KKy8vIE90aGVyIHVzZXMgbWF5IG5vdCBiZSBhcyBnb29kLgorLy8KKy8vIE5vdGU6IElmIHlvdSB1c2UgYW4gaW5jb21wbGV0ZSB0eXBlIHdpdGggbGlua2VkX3B0cjw+LCB0aGUgY2xhc3MKKy8vICpjb250YWluaW5nKiBsaW5rZWRfcHRyPD4gbXVzdCBoYXZlIGEgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgKGV2ZW4KKy8vIGlmIHRoZXkgZG8gbm90aGluZyEpLgorLy8KKy8vIEJpbGwgR2liYm9ucyBzdWdnZXN0ZWQgd2UgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCisvLworLy8gVGhyZWFkIFNhZmV0eToKKy8vICAgVW5saWtlIG90aGVyIGxpbmtlZF9wdHIgaW1wbGVtZW50YXRpb25zLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisvLyAgIGEgbGlua2VkX3B0ciBvYmplY3QgaXMgdGhyZWFkLXNhZmUgaW4gdGhlIHNlbnNlIHRoYXQ6CisvLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSBsaW5rZWRfcHRyIG9iamVjdHMgY29uY3VycmVudGx5LAorLy8gICAgIC0gaXQncyBzYWZlIHRvIGNvcHkgKmZyb20qIGEgbGlua2VkX3B0ciBhbmQgcmVhZCBpdHMgdW5kZXJseWluZworLy8gICAgICAgcmF3IHBvaW50ZXIgKGUuZy4gdmlhIGdldCgpKSBjb25jdXJyZW50bHksIGFuZAorLy8gICAgIC0gaXQncyBzYWZlIHRvIHdyaXRlIHRvIHR3byBsaW5rZWRfcHRycyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lCisvLyAgICAgICBzaGFyZWQgb2JqZWN0IGNvbmN1cnJlbnRseS4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZW5hbWUgdGhpcyB0byBzYWZlX2xpbmtlZF9wdHIgdG8gYXZvaWQKKy8vIGNvbmZ1c2lvbiB3aXRoIG5vcm1hbCBsaW5rZWRfcHRyLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFByb3RlY3RzIGNvcHlpbmcgb2YgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4KK0dURVNUX0FQSV8gR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfbGlua2VkX3B0cl9tdXRleCk7CisKKy8vIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGFsbCBpbnN0YW5jZXMgb2YgbGlua2VkX3B0cjw+LiAgSXQgbmVlZHMgdG8gYmUKKy8vIGEgbm9uLXRlbXBsYXRlIGNsYXNzIGJlY2F1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHI8PiBjYW4gcmVmZXIgdG8KKy8vIHRoZSBzYW1lIG9iamVjdCAobGlua2VkX3B0cjxTdXBlcmNsYXNzPihvYmopIHZzIGxpbmtlZF9wdHI8U3ViY2xhc3M+KG9iaikpLgorLy8gU28sIGl0IG5lZWRzIHRvIGJlIHBvc3NpYmxlIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciB0byBwYXJ0aWNpcGF0ZQorLy8gaW4gdGhlIHNhbWUgY2lyY3VsYXIgbGlua2VkIGxpc3QsIHNvIHdlIG5lZWQgYSBzaW5nbGUgY2xhc3MgdHlwZSBoZXJlLgorLy8KKy8vIERPIE5PVCBVU0UgVEhJUyBDTEFTUyBESVJFQ1RMWSBZT1VSU0VMRi4gIFVzZSBsaW5rZWRfcHRyPFQ+LgorY2xhc3MgbGlua2VkX3B0cl9pbnRlcm5hbCB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBuZXcgY2lyY2xlIHRoYXQgaW5jbHVkZXMgb25seSB0aGlzIGluc3RhbmNlLgorICB2b2lkIGpvaW5fbmV3KCkgeworICAgIG5leHRfID0gdGhpczsKKyAgfQorCisgIC8vIE1hbnkgbGlua2VkX3B0ciBvcGVyYXRpb25zIG1heSBjaGFuZ2UgcC5saW5rXyBmb3Igc29tZSBsaW5rZWRfcHRyCisgIC8vIHZhcmlhYmxlIHAgaW4gdGhlIHNhbWUgY2lyY2xlIGFzIHRoaXMgb2JqZWN0LiAgVGhlcmVmb3JlIHdlIG5lZWQKKyAgLy8gdG8gcHJldmVudCB0d28gc3VjaCBvcGVyYXRpb25zIGZyb20gb2NjdXJyaW5nIGNvbmN1cnJlbnRseS4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIG9iamVjdHMgY2FuIGNvZXhpc3QgaW4gYQorICAvLyBjaXJjbGUgKGUuZy4gbGlua2VkX3B0cjxCYXNlPiwgbGlua2VkX3B0cjxEZXJpdmVkMT4sIGFuZAorICAvLyBsaW5rZWRfcHRyPERlcml2ZWQyPikuICBUaGVyZWZvcmUgd2UgbXVzdCB1c2UgYSBzaW5nbGUgbXV0ZXggdG8KKyAgLy8gcHJvdGVjdCBhbGwgbGlua2VkX3B0ciBvYmplY3RzLiAgVGhpcyBjYW4gY3JlYXRlIHNlcmlvdXMKKyAgLy8gY29udGVudGlvbiBpbiBwcm9kdWN0aW9uIGNvZGUsIGJ1dCBpcyBhY2NlcHRhYmxlIGluIGEgdGVzdGluZworICAvLyBmcmFtZXdvcmsuCisKKyAgLy8gSm9pbiBhbiBleGlzdGluZyBjaXJjbGUuCisgIHZvaWQgam9pbihsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwdHIpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2xpbmtlZF9wdHJfbXV0ZXgpIHsKKyAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsKKworICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBwdHI7CisgICAgd2hpbGUgKHAtPm5leHRfICE9IHB0cikgcCA9IHAtPm5leHRfOworICAgIHAtPm5leHRfID0gdGhpczsKKyAgICBuZXh0XyA9IHB0cjsKKyAgfQorCisgIC8vIExlYXZlIHdoYXRldmVyIGNpcmNsZSB3ZSdyZSBwYXJ0IG9mLiAgUmV0dXJucyB0cnVlIGlmIHdlIHdlcmUgdGhlCisgIC8vIGxhc3QgbWVtYmVyIG9mIHRoZSBjaXJjbGUuICBPbmNlIHRoaXMgaXMgZG9uZSwgeW91IGNhbiBqb2luKCkgYW5vdGhlci4KKyAgYm9vbCBkZXBhcnQoKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19saW5rZWRfcHRyX211dGV4KSB7CisgICAgTXV0ZXhMb2NrIGxvY2soJmdfbGlua2VkX3B0cl9tdXRleCk7CisKKyAgICBpZiAobmV4dF8gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgICAgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcCA9IG5leHRfOworICAgIHdoaWxlIChwLT5uZXh0XyAhPSB0aGlzKSBwID0gcC0+bmV4dF87CisgICAgcC0+bmV4dF8gPSBuZXh0XzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworIHByaXZhdGU6CisgIG11dGFibGUgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogbmV4dF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIGxpbmtlZF9wdHIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKworICAvLyBUYWtlIG92ZXIgb3duZXJzaGlwIG9mIGEgcmF3IHBvaW50ZXIuICBUaGlzIHNob3VsZCBoYXBwZW4gYXMgc29vbiBhcworICAvLyBwb3NzaWJsZSBhZnRlciB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuCisgIGV4cGxpY2l0IGxpbmtlZF9wdHIoVCogcHRyID0gTlVMTCkgeyBjYXB0dXJlKHB0cik7IH0KKyAgfmxpbmtlZF9wdHIoKSB7IGRlcGFydCgpOyB9CisKKyAgLy8gQ29weSBhbiBleGlzdGluZyBsaW5rZWRfcHRyPD4sIGFkZGluZyBvdXJzZWx2ZXMgdG8gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGxpbmtlZF9wdHIobGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7IGNvcHkoJnB0cik7IH0KKyAgbGlua2VkX3B0cihsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsgIC8vIE5PTElOVAorICAgIGFzc2VydCgmcHRyICE9IHRoaXMpOworICAgIGNvcHkoJnB0cik7CisgIH0KKworICAvLyBBc3NpZ25tZW50IHJlbGVhc2VzIHRoZSBvbGQgdmFsdWUgYW5kIGFjcXVpcmVzIHRoZSBuZXcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7CisgICAgZGVwYXJ0KCk7CisgICAgY29weSgmcHRyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0ciBjb25zdCYgcHRyKSB7CisgICAgaWYgKCZwdHIgIT0gdGhpcykgeworICAgICAgZGVwYXJ0KCk7CisgICAgICBjb3B5KCZwdHIpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTbWFydCBwb2ludGVyIG1lbWJlcnMuCisgIHZvaWQgcmVzZXQoVCogcHRyID0gTlVMTCkgeworICAgIGRlcGFydCgpOworICAgIGNhcHR1cmUocHRyKTsKKyAgfQorICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqdmFsdWVfOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyA9PSBwOyB9CisgIGJvb2wgb3BlcmF0b3IhPShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gIT0gcDsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvcj09KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gPT0gcHRyLmdldCgpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBib29sIG9wZXJhdG9yIT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyAhPSBwdHIuZ2V0KCk7CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBmcmllbmQgY2xhc3MgbGlua2VkX3B0cjsKKworICBUKiB2YWx1ZV87CisgIGxpbmtlZF9wdHJfaW50ZXJuYWwgbGlua187CisKKyAgdm9pZCBkZXBhcnQoKSB7CisgICAgaWYgKGxpbmtfLmRlcGFydCgpKSBkZWxldGUgdmFsdWVfOworICB9CisKKyAgdm9pZCBjYXB0dXJlKFQqIHB0cikgeworICAgIHZhbHVlXyA9IHB0cjsKKyAgICBsaW5rXy5qb2luX25ldygpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IHZvaWQgY29weShsaW5rZWRfcHRyPFU+IGNvbnN0KiBwdHIpIHsKKyAgICB2YWx1ZV8gPSBwdHItPmdldCgpOworICAgIGlmICh2YWx1ZV8pCisgICAgICBsaW5rXy5qb2luKCZwdHItPmxpbmtfKTsKKyAgICBlbHNlCisgICAgICBsaW5rXy5qb2luX25ldygpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKK2Jvb2wgb3BlcmF0b3I9PShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKKyAgcmV0dXJuIHB0ciA9PSB4LmdldCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKK2Jvb2wgb3BlcmF0b3IhPShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKKyAgcmV0dXJuIHB0ciAhPSB4LmdldCgpOworfQorCisvLyBBIGZ1bmN0aW9uIHRvIGNvbnZlcnQgVCogaW50byBsaW5rZWRfcHRyPFQ+CisvLyBEb2luZyBlLmcuIG1ha2VfbGlua2VkX3B0cihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpIGlzIGEgc2hvcnRlciBub3RhdGlvbgorLy8gZm9yIGxpbmtlZF9wdHI8Rm9vQmFyQmF6PHR5cGU+ID4obmV3IEZvb0JhckJhejx0eXBlPihhcmcpKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitsaW5rZWRfcHRyPFQ+IG1ha2VfbGlua2VkX3B0cihUKiBwdHIpIHsKKyAgcmV0dXJuIGxpbmtlZF9wdHI8VD4ocHRyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIFRlc3QgLSBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgdGhhdCBjYW4gcHJpbnQgYQorLy8gdmFsdWUgb2YgYW55IHR5cGUgVDoKKy8vCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKTsKKy8vCisvLyBBIHVzZXIgY2FuIHRlYWNoIHRoaXMgZnVuY3Rpb24gaG93IHRvIHByaW50IGEgY2xhc3MgdHlwZSBUIGJ5CisvLyBkZWZpbmluZyBlaXRoZXIgb3BlcmF0b3I8PCgpIG9yIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHRoYXQKKy8vIGRlZmluZXMgVC4gIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgRklSU1QgZGVmaW5lZCBmdW5jdGlvbiBpbiB0aGUKKy8vIGZvbGxvd2luZyBsaXN0IHdpbGwgYmUgdXNlZCAoYXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZQorLy8gZm9vKToKKy8vCisvLyAgIDEuIGZvbzo6UHJpbnRUbyhjb25zdCBUJiwgb3N0cmVhbSopCisvLyAgIDIuIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IFQmKSBkZWZpbmVkIGluIGVpdGhlciBmb28gb3IgdGhlCisvLyAgICAgIGdsb2JhbCBuYW1lc3BhY2UuCisvLworLy8gSWYgbm9uZSBvZiB0aGUgYWJvdmUgaXMgZGVmaW5lZCwgaXQgd2lsbCBwcmludCB0aGUgZGVidWcgc3RyaW5nIG9mCisvLyB0aGUgdmFsdWUgaWYgaXQgaXMgYSBwcm90b2NvbCBidWZmZXIsIG9yIHByaW50IHRoZSByYXcgYnl0ZXMgaW4gdGhlCisvLyB2YWx1ZSBvdGhlcndpc2UuCisvLworLy8gVG8gYWlkIGRlYnVnZ2luZzogd2hlbiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSBhZGRyZXNzIG9mIHRoZQorLy8gdmFsdWUgaXMgYWxzbyBwcmludGVkOyB3aGVuIFQgaXMgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgYm90aCB0aGUKKy8vIHBvaW50ZXIgdmFsdWUgYW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaXQgcG9pbnRzIHRvIGFyZQorLy8gcHJpbnRlZC4KKy8vCisvLyBXZSBhbHNvIHByb3ZpZGUgc29tZSBjb252ZW5pZW50IHdyYXBwZXJzOgorLy8KKy8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcuICBGb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyCisvLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzCisvLyAgIC8vIHByaW50ZWQuCisvLyAgIHN0ZDo6c3RyaW5nIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSk7CisvLworLy8gICAvLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQKKy8vICAgLy8gdmFsdWUgKGJ1dCBub3QgdGhlIGFkZHJlc3MpIGlzIHByaW50ZWQ7IGZvciBhIChjb25zdCBvciBub3QpIGNoYXIKKy8vICAgLy8gcG9pbnRlciwgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyAoYnV0IG5vdCB0aGUgcG9pbnRlcikgaXMKKy8vICAgLy8gcHJpbnRlZC4KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50KGNvbnN0IFQmIHZhbHVlLCBvc3RyZWFtKik7CisvLworLy8gICAvLyBQcmludHMgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlIGRpZmZlcmVuY2UKKy8vICAgLy8gZnJvbSBVbml2ZXJzYWxUZXJzZVByaW50KCkgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHByaW50cyBib3RoIHRoZQorLy8gICAvLyBwb2ludGVyIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZvciBhIChjb25zdCBvciBub3QpIGNoYXIgcG9pbnRlci4KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgb3N0cmVhbSopOworLy8KKy8vICAgLy8gUHJpbnRzIHRoZSBmaWVsZHMgb2YgYSB0dXBsZSB0ZXJzZWx5IHRvIGEgc3RyaW5nIHZlY3Rvciwgb25lCisvLyAgIC8vIGVsZW1lbnQgZm9yIGVhY2ggZmllbGQuIFR1cGxlIHN1cHBvcnQgbXVzdCBiZSBlbmFibGVkIGluCisvLyAgIC8vIGd0ZXN0LXBvcnQuaC4KKy8vICAgc3RkOjp2ZWN0b3I8c3RyaW5nPiBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCisvLyAgICAgICBjb25zdCBUdXBsZSYgdmFsdWUpOworLy8KKy8vIEtub3duIGxpbWl0YXRpb246CisvLworLy8gVGhlIHByaW50IHByaW1pdGl2ZXMgcHJpbnQgdGhlIGVsZW1lbnRzIG9mIGFuIFNUTC1zdHlsZSBjb250YWluZXIKKy8vIHVzaW5nIHRoZSBjb21waWxlci1pbmZlcnJlZCB0eXBlIG9mICppdGVyIHdoZXJlIGl0ZXIgaXMgYQorLy8gY29uc3RfaXRlcmF0b3Igb2YgdGhlIGNvbnRhaW5lci4gIFdoZW4gY29uc3RfaXRlcmF0b3IgaXMgYW4gaW5wdXQKKy8vIGl0ZXJhdG9yIGJ1dCBub3QgYSBmb3J3YXJkIGl0ZXJhdG9yLCB0aGlzIGluZmVycmVkIHR5cGUgbWF5IG5vdAorLy8gbWF0Y2ggdmFsdWVfdHlwZSwgYW5kIHRoZSBwcmludCBvdXRwdXQgbWF5IGJlIGluY29ycmVjdC4gIEluCisvLyBwcmFjdGljZSwgdGhpcyBpcyByYXJlbHkgYSBwcm9ibGVtIGFzIGZvciBtb3N0IGNvbnRhaW5lcnMKKy8vIGNvbnN0X2l0ZXJhdG9yIGlzIGEgZm9yd2FyZCBpdGVyYXRvci4gIFdlJ2xsIGZpeCB0aGlzIGlmIHRoZXJlJ3MgYW4KKy8vIGFjdHVhbCBuZWVkIGZvciBpdC4gIE5vdGUgdGhhdCB0aGlzIGZpeCBjYW5ub3QgcmVseSBvbiB2YWx1ZV90eXBlCisvLyBiZWluZyBkZWZpbmVkIGFzIG1hbnkgdXNlci1kZWZpbmVkIGNvbnRhaW5lciB0eXBlcyBkb24ndCBoYXZlCisvLyB2YWx1ZV90eXBlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXworCisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlZmluaXRpb25zIGluIHRoZSAnaW50ZXJuYWwnIGFuZCAnaW50ZXJuYWwyJyBuYW1lIHNwYWNlcyBhcmUKKy8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBUSEVNIElOIFVTRVIgQ09ERSEKK25hbWVzcGFjZSBpbnRlcm5hbDIgeworCisvLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBnaXZlbgorLy8gb3N0cmVhbS4KK0dURVNUX0FQSV8gdm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIEZvciBzZWxlY3Rpbmcgd2hpY2ggcHJpbnRlciB0byB1c2Ugd2hlbiBhIGdpdmVuIHR5cGUgaGFzIG5laXRoZXIgPDwKKy8vIG5vciBQcmludFRvKCkuCitlbnVtIFR5cGVLaW5kIHsKKyAga1Byb3RvYnVmLCAgICAgICAgICAgICAgLy8gYSBwcm90b2J1ZiB0eXBlCisgIGtDb252ZXJ0aWJsZVRvSW50ZWdlciwgIC8vIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYSBuYW1lZCBvciB1bm5hbWVkIGVudW0gdHlwZSkKKyAga090aGVyVHlwZSAgICAgICAgICAgICAgLy8gYW55dGhpbmcgZWxzZQorfTsKKworLy8gVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga1R5cGVLaW5kPjo6UHJpbnRWYWx1ZSh2YWx1ZSwgb3MpIGlzIGNhbGxlZAorLy8gYnkgdGhlIHVuaXZlcnNhbCBwcmludGVyIHRvIHByaW50IGEgdmFsdWUgb2YgdHlwZSBUIHdoZW4gbmVpdGhlcgorLy8gb3BlcmF0b3I8PCBub3IgUHJpbnRUbygpIGlzIGRlZmluZWQgZm9yIFQsIHdoZXJlIGtUeXBlS2luZCBpcyB0aGUKKy8vICJraW5kIiBvZiBUIGFzIGRlZmluZWQgYnkgZW51bSBUeXBlS2luZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBUeXBlS2luZCBrVHlwZUtpbmQ+CitjbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlciB7CisgcHVibGljOgorICAvLyBUaGlzIGRlZmF1bHQgdmVyc2lvbiBpcyBjYWxsZWQgd2hlbiBrVHlwZUtpbmQgaXMga090aGVyVHlwZS4KKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgUHJpbnRCeXRlc0luT2JqZWN0VG8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oJnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWUpLCBvcyk7CisgIH0KK307CisKKy8vIFdlIHByaW50IGEgcHJvdG9idWYgdXNpbmcgaXRzIFNob3J0RGVidWdTdHJpbmcoKSB3aGVuIHRoZSBzdHJpbmcKKy8vIGRvZXNuJ3QgZXhjZWVkIHRoaXMgbWFueSBjaGFyYWN0ZXJzOyBvdGhlcndpc2Ugd2UgcHJpbnQgaXQgdXNpbmcKKy8vIERlYnVnU3RyaW5nKCkgZm9yIGJldHRlciByZWFkYWJpbGl0eS4KK2NvbnN0IHNpemVfdCBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA9IDUwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtQcm90b2J1Zj4geworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHNob3J0X3N0ciA9IHZhbHVlLlNob3J0RGVidWdTdHJpbmcoKTsKKyAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgcHJldHR5X3N0ciA9CisgICAgICAgIHNob3J0X3N0ci5sZW5ndGgoKSA8PSBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA/CisgICAgICAgIHNob3J0X3N0ciA6ICgiXG4iICsgdmFsdWUuRGVidWdTdHJpbmcoKSk7CisgICAgKm9zIDw8ICgiPCIgKyBwcmV0dHlfc3RyICsgIj4iKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrQ29udmVydGlibGVUb0ludGVnZXI+IHsKKyBwdWJsaWM6CisgIC8vIFNpbmNlIFQgaGFzIG5vIDw8IG9wZXJhdG9yIG9yIFByaW50VG8oKSBidXQgY2FuIGJlIGltcGxpY2l0bHkKKyAgLy8gY29udmVydGVkIHRvIEJpZ2dlc3RJbnQsIHdlIHByaW50IGl0IGFzIGEgQmlnZ2VzdEludC4KKyAgLy8KKyAgLy8gTW9zdCBsaWtlbHkgVCBpcyBhbiBlbnVtIHR5cGUgKGVpdGhlciBuYW1lZCBvciB1bm5hbWVkKSwgaW4gd2hpY2gKKyAgLy8gY2FzZSBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBkZXNpcmVkIGJlaGF2aW9yLiAgSW4gY2FzZQorICAvLyBUIGlzIG5vdCBhbiBlbnVtLCBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBiZXN0IHdlIGNhbiBkbworICAvLyBnaXZlbiB0aGF0IGl0IGhhcyBubyB1c2VyLWRlZmluZWQgcHJpbnRlci4KKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgY29uc3QgaW50ZXJuYWw6OkJpZ2dlc3RJbnQga0JpZ0ludCA9IHZhbHVlOworICAgICpvcyA8PCBrQmlnSW50OworICB9Cit9OworCisvLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLiAgSWYgdGhlIHZhbHVlIGlzIGEKKy8vIHByb3RvY29sIG1lc3NhZ2UsIGl0cyBkZWJ1ZyBzdHJpbmcgaXMgcHJpbnRlZDsgaWYgaXQncyBhbiBlbnVtIG9yCisvLyBvZiBhIHR5cGUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LCBpdCdzIHByaW50ZWQgYXMgYW4KKy8vIGludGVnZXI7IG90aGVyd2lzZSB0aGUgYnl0ZXMgaW4gdGhlIHZhbHVlIGFyZSBwcmludGVkLiAgVGhpcyBpcworLy8gd2hhdCBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBpdCBrbm93cyBub3RoaW5nIGFib3V0CisvLyB0eXBlIFQgYW5kIFQgaGFzIG5laXRoZXIgPDwgb3BlcmF0b3Igbm9yIFByaW50VG8oKS4KKy8vCisvLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKKy8vIGEgPDwgb3BlcmF0b3IgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4KKy8vCisvLyBXZSBwdXQgdGhpcyBvcGVyYXRvciBpbiBuYW1lc3BhY2UgJ2ludGVybmFsMicgaW5zdGVhZCBvZiAnaW50ZXJuYWwnCisvLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIGFzIG11Y2ggY29kZSBpbiAnaW50ZXJuYWwnIG5lZWRzIHRvCisvLyB1c2UgPDwgaW4gU1RMLCB3aGljaCB3b3VsZCBjb25mbGljdCB3aXRoIG91ciBvd24gPDwgd2VyZSBpdCBkZWZpbmVkCisvLyBpbiAnaW50ZXJuYWwnLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIG9wZXJhdG9yPDwgdGFrZXMgYSBnZW5lcmljIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLAorLy8gQ2hhclRyYWl0cz4gdHlwZSBpbnN0ZWFkIG9mIHRoZSBtb3JlIHJlc3RyaWN0ZWQgc3RkOjpvc3RyZWFtLiAgSWYKKy8vIHdlIGRlZmluZSBpdCB0byB0YWtlIGFuIHN0ZDo6b3N0cmVhbSBpbnN0ZWFkLCB3ZSdsbCBnZXQgYW4KKy8vICJhbWJpZ3VvdXMgb3ZlcmxvYWRzIiBjb21waWxlciBlcnJvciB3aGVuIHRyeWluZyB0byBwcmludCBhIHR5cGUKKy8vIEZvbyB0aGF0IHN1cHBvcnRzIHN0cmVhbWluZyB0byBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwKKy8vIENoYXJUcmFpdHM+LCBhcyB0aGUgY29tcGlsZXIgY2Fubm90IHRlbGwgd2hldGhlcgorLy8gb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mLCBjb25zdCBUJikgb3IKKy8vIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4sIGNvbnN0IEZvbyYpIGlzIG1vcmUKKy8vIHNwZWNpZmljLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+Cis6OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICA6OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsIGNvbnN0IFQmIHgpIHsKKyAgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwKKyAgICAgIChpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSA/IGtQcm90b2J1ZiA6CisgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUJiwgaW50ZXJuYWw6OkJpZ2dlc3RJbnQ+Ojp2YWx1ZSA/CisgICAgICAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyIDoga090aGVyVHlwZSk+OjpQcmludFZhbHVlKHgsICZvcyk7CisgIHJldHVybiBvczsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gVGhpcyBuYW1lc3BhY2UgTVVTVCBOT1QgQkUgTkVTVEVEIElOIDo6dGVzdGluZywgb3IgdGhlIG5hbWUgbG9vay11cAorLy8gbWFnaWMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgVW5pdmVyc2FsUHJpbnRlciB3b24ndCB3b3JrLgorbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwgeworCisvLyBVc2VkIHRvIHByaW50IGEgdmFsdWUgdGhhdCBpcyBub3QgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZQorLy8gdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludE5vbkNvbnRhaW5lclRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgLy8gV2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCwgZHVyaW5nIHVucXVhbGlmaWVkIG5hbWUgbG9va3VwLAorICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgYXBwZWFycyBhcyBpZiBpdCB3YXMgZGVjbGFyZWQgaW4KKyAgLy8gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGJvdGgKKyAgLy8gOjp0ZXN0aW5nX2ludGVybmFsIGFuZCA6OnRlc3Rpbmc6OmludGVybmFsMiwgaS5lLiB0aGUgZ2xvYmFsCisgIC8vIG5hbWVzcGFjZS4gIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIHRoZSBDKysgU3RhbmRhcmQgc2VjdGlvbgorICAvLyA3LjMuNC0xIFtuYW1lc3BhY2UudWRpcl0uICBUaGlzIGFsbG93cyB1cyB0byBmYWxsIGJhY2sgb250bworICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgaW4gY2FzZSBUIGRvZXNuJ3QgY29tZSB3aXRoIGEgPDwKKyAgLy8gb3BlcmF0b3IuCisgIC8vCisgIC8vIFdlIGNhbm5vdCB3cml0ZSAndXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDw7Jywgd2hpY2gKKyAgLy8gZ2NjIDMuMyBmYWlscyB0byBjb21waWxlIGR1ZSB0byBhIGNvbXBpbGVyIGJ1Zy4KKyAgdXNpbmcgbmFtZXNwYWNlIDo6dGVzdGluZzo6aW50ZXJuYWwyOyAgLy8gTk9MSU5UCisKKyAgLy8gQXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZSBmb28sIGluIHRoZSBuZXh0IHN0YXRlbWVudCwKKyAgLy8gdGhlIGNvbXBpbGVyIHdpbGwgY29uc2lkZXIgYWxsIG9mOgorICAvLworICAvLyAgIDEuIGZvbzo6b3BlcmF0b3I8PCAodGhhbmtzIHRvIEtvZW5pZyBsb29rLXVwKSwKKyAgLy8gICAyLiA6Om9wZXJhdG9yPDwgKGFzIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpcyBlbmNsb3NlZCBpbiA6OiksCisgIC8vICAgMy4gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gdGhlIHVzaW5nIHN0YXRlbWVudCBhYm92ZSkuCisgIC8vCisgIC8vIFRoZSBvcGVyYXRvcjw8IHdob3NlIHR5cGUgbWF0Y2hlcyBUIGJlc3Qgd2lsbCBiZSBwaWNrZWQuCisgIC8vCisgIC8vIFdlIGRlbGliZXJhdGVseSBhbGxvdyAjMiB0byBiZSBhIGNhbmRpZGF0ZSwgYXMgc29tZXRpbWVzIGl0J3MKKyAgLy8gaW1wb3NzaWJsZSB0byBkZWZpbmUgIzEgKGUuZy4gd2hlbiBmb28gaXMgOjpzdGQsIGRlZmluaW5nCisgIC8vIGFueXRoaW5nIGluIGl0IGlzIHVuZGVmaW5lZCBiZWhhdmlvciB1bmxlc3MgeW91IGFyZSBhIGNvbXBpbGVyCisgIC8vIHZlbmRvci4pLgorICAqb3MgPDwgdmFsdWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nX2ludGVybmFsCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cikgcHJpbnRzIHRoZSBnaXZlbgorLy8gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQKKy8vICdvc3RyZWFtX3B0cicgaXMgbm90IE5VTEwsIG9yIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisvLworLy8gV2UgZGVmaW5lIFVuaXZlcnNhbFByaW50ZXIgYXMgYSBjbGFzcyB0ZW1wbGF0ZSAoYXMgb3Bwb3NlZCB0byBhCisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSksIGFzIHdlIG5lZWQgdG8gcGFydGlhbGx5IHNwZWNpYWxpemUgaXQgZm9yCisvLyByZWZlcmVuY2UgdHlwZXMsIHdoaWNoIGNhbm5vdCBiZSBkb25lIHdpdGggZnVuY3Rpb24gdGVtcGxhdGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIFVzZWQgdG8gcHJpbnQgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lCisvLyBhIFByaW50VG8oKSBmb3IgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4KK3ZvaWQgRGVmYXVsdFByaW50VG8oSXNDb250YWluZXIgLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlX3R5cGUgLyogaXMgbm90IGEgcG9pbnRlciAqLywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQyYgY29udGFpbmVyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgY29uc3Qgc2l6ZV90IGtNYXhDb3VudCA9IDMyOyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHByaW50LgorICAqb3MgPDwgJ3snOworICBzaXplX3QgY291bnQgPSAwOworICBmb3IgKHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgaXQgIT0gY29udGFpbmVyLmVuZCgpOyArK2l0LCArK2NvdW50KSB7CisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgKm9zIDw8ICcsJzsKKyAgICAgIGlmIChjb3VudCA9PSBrTWF4Q291bnQpIHsgIC8vIEVub3VnaCBoYXMgYmVlbiBwcmludGVkLgorICAgICAgICAqb3MgPDwgIiAuLi4iOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICcgJzsKKyAgICAvLyBXZSBjYW5ub3QgY2FsbCBQcmludFRvKCppdCwgb3MpIGhlcmUgYXMgUHJpbnRUbygpIGRvZXNuJ3QKKyAgICAvLyBoYW5kbGUgKml0IGJlaW5nIGEgbmF0aXZlIGFycmF5LgorICAgIGludGVybmFsOjpVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsKKyAgfQorCisgIGlmIChjb3VudCA+IDApIHsKKyAgICAqb3MgPDwgJyAnOworICB9CisgICpvcyA8PCAnfSc7Cit9CisKKy8vIFVzZWQgdG8gcHJpbnQgYSBwb2ludGVyIHRoYXQgaXMgbmVpdGhlciBhIGNoYXIgcG9pbnRlciBub3IgYSBtZW1iZXIKKy8vIHBvaW50ZXIsIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4gIChBIG1lbWJlcgorLy8gdmFyaWFibGUgcG9pbnRlciBvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBkb2Vzbid0IHJlYWxseSBwb2ludCB0bworLy8gYSBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4gIFRoZWlyIHJlcHJlc2VudGF0aW9uIGlzCisvLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGhlcmVmb3JlIHRoZXkgd2lsbCBiZSBwcmludGVkIGFzIHJhdworLy8gYnl0ZXMuKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICB0cnVlX3R5cGUgLyogaXMgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBUKiBwLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgICpvcyA8PCAiTlVMTCI7CisgIH0gZWxzZSB7CisgICAgLy8gQysrIGRvZXNuJ3QgYWxsb3cgY2FzdGluZyBmcm9tIGEgZnVuY3Rpb24gcG9pbnRlciB0byBhbnkgb2JqZWN0CisgICAgLy8gcG9pbnRlci4KKyAgICAvLworICAgIC8vIElzVHJ1ZSgpIHNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwKKyAgICAvLyAidW5yZWFjaGFibGUgY29kZSIuCisgICAgaWYgKElzVHJ1ZShJbXBsaWNpdGx5Q29udmVydGlibGU8VCosIGNvbnN0IHZvaWQqPjo6dmFsdWUpKSB7CisgICAgICAvLyBUIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUuICBXZSBqdXN0IGNhbGwgPDwgdG8gcHJpbnQgcCwKKyAgICAgIC8vIHJlbHlpbmcgb24gQURMIHRvIHBpY2sgdXAgdXNlci1kZWZpbmVkIDw8IGZvciB0aGVpciBwb2ludGVyCisgICAgICAvLyB0eXBlcywgaWYgYW55LgorICAgICAgKm9zIDw8IHA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFQgaXMgYSBmdW5jdGlvbiB0eXBlLCBzbyAnKm9zIDw8IHAnIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50CisgICAgICAvLyAoaXQganVzdCBwcmludHMgcCBhcyBib29sKS4gIFdlIHdhbnQgdG8gcHJpbnQgcCBhcyBhIGNvbnN0CisgICAgICAvLyB2b2lkKi4gIEhvd2V2ZXIsIHdlIGNhbm5vdCBjYXN0IGl0IHRvIGNvbnN0IHZvaWQqIGRpcmVjdGx5LAorICAgICAgLy8gZXZlbiB1c2luZyByZWludGVycHJldF9jYXN0LCBhcyBlYXJsaWVyIHZlcnNpb25zIG9mIGdjYworICAgICAgLy8gKGUuZy4gMy40LjUpIGNhbm5vdCBjb21waWxlIHRoZSBjYXN0IHdoZW4gcCBpcyBhIGZ1bmN0aW9uCisgICAgICAvLyBwb2ludGVyLiAgQ2FzdGluZyB0byBVSW50NjQgZmlyc3Qgc29sdmVzIHRoZSBwcm9ibGVtLgorICAgICAgKm9zIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OlVJbnQ2ND4ocCkpOworICAgIH0KKyAgfQorfQorCisvLyBVc2VkIHRvIHByaW50IGEgbm9uLWNvbnRhaW5lciwgbm9uLXBvaW50ZXIgdmFsdWUgd2hlbiB0aGUgdXNlcgorLy8gZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBEZWZhdWx0UHJpbnRUbyhJc05vdENvbnRhaW5lciAvKiBkdW1teSAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIDo6dGVzdGluZ19pbnRlcm5hbDo6RGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8odmFsdWUsIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiB2YWx1ZSB1c2luZyB0aGUgPDwgb3BlcmF0b3IgaWYgaXQgaGFzIG9uZTsKKy8vIG90aGVyd2lzZSBwcmludHMgdGhlIGJ5dGVzIGluIGl0LiAgVGhpcyBpcyB3aGF0CisvLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBQcmludFRvKCkgaXMgbm90IHNwZWNpYWxpemVkCisvLyBvciBvdmVybG9hZGVkIGZvciB0eXBlIFQuCisvLworLy8gQSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGZvciBhIGNsYXNzIHR5cGUgRm9vIGJ5IGRlZmluaW5nCisvLyBhbiBvdmVybG9hZCBvZiBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4gIFdlCisvLyBnaXZlIHRoZSB1c2VyIHRoaXMgb3B0aW9uIGFzIHNvbWV0aW1lcyBkZWZpbmluZyBhIDw8IG9wZXJhdG9yIGZvcgorLy8gRm9vIGlzIG5vdCBkZXNpcmFibGUgKGUuZy4gdGhlIGNvZGluZyBzdHlsZSBtYXkgcHJldmVudCBkb2luZyBpdCwKKy8vIG9yIHRoZXJlIGlzIGFscmVhZHkgYSA8PCBvcGVyYXRvciBidXQgaXQgZG9lc24ndCBkbyB3aGF0IHRoZSB1c2VyCisvLyB3YW50cykuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUbyhjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIERlZmF1bHRQcmludFRvKCkgaXMgb3ZlcmxvYWRlZC4gIFRoZSB0eXBlIG9mIGl0cyBmaXJzdCB0d28KKyAgLy8gYXJndW1lbnRzIGRldGVybWluZSB3aGljaCB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkLiAgSWYgVCBpcyBhbgorICAvLyBTVEwtc3R5bGUgY29udGFpbmVyLCB0aGUgdmVyc2lvbiBmb3IgY29udGFpbmVyIHdpbGwgYmUgY2FsbGVkOyBpZgorICAvLyBUIGlzIGEgcG9pbnRlciwgdGhlIHBvaW50ZXIgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZDsgb3RoZXJ3aXNlIHRoZQorICAvLyBnZW5lcmljIHZlcnNpb24gd2lsbCBiZSBjYWxsZWQuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUsIHByaW9yIHRvIHdlIGNoZWNrCisgIC8vIGZvciBwcm90b2NvbCBtZXNzYWdlIHR5cGVzIGluIG91ciBvcGVyYXRvcjw8LiAgVGhlIHJhdGlvbmFsZSBpczoKKyAgLy8KKyAgLy8gRm9yIHByb3RvY29sIG1lc3NhZ2VzLCB3ZSB3YW50IHRvIGdpdmUgcGVvcGxlIGEgY2hhbmNlIHRvCisgIC8vIG92ZXJyaWRlIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGJ5IGRlZmluaW5nIGEgUHJpbnRUbygpIG9yCisgIC8vIG9wZXJhdG9yPDwuICBGb3IgU1RMIGNvbnRhaW5lcnMsIG90aGVyIGZvcm1hdHMgY2FuIGJlCisgIC8vIGluY29tcGF0aWJsZSB3aXRoIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGZvciB0aGUgY29udGFpbmVyCisgIC8vIGVsZW1lbnRzOyB0aGVyZWZvcmUgd2UgY2hlY2sgZm9yIGNvbnRhaW5lciB0eXBlcyBoZXJlIHRvIGVuc3VyZQorICAvLyB0aGF0IG91ciBmb3JtYXQgaXMgdXNlZC4KKyAgLy8KKyAgLy8gVGhlIHNlY29uZCBhcmd1bWVudCBvZiBEZWZhdWx0UHJpbnRUbygpIGlzIG5lZWRlZCB0byBieXBhc3MgYSBidWcKKyAgLy8gaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciB0aGF0IHByZXZlbnRzIGl0IGZyb20gcGlja2luZyB0aGUgcmlnaHQKKyAgLy8gb3ZlcmxvYWQgYmV0d2VlbjoKKyAgLy8KKyAgLy8gICBQcmludFRvKGNvbnN0IFQmIHgsIC4uLik7CisgIC8vICAgUHJpbnRUbyhUKiB4LCAuLi4pOworICBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lclRlc3Q8VD4oMCksIGlzX3BvaW50ZXI8VD4oKSwgdmFsdWUsIG9zKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyBsaXN0IG9mIFByaW50VG8oKSBvdmVybG9hZHMgdGVsbHMKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgaG93IHRvIHByaW50IHN0YW5kYXJkIHR5cGVzIChidWlsdC1pbgorLy8gdHlwZXMsIHN0cmluZ3MsIHBsYWluIGFycmF5cywgYW5kIHBvaW50ZXJzKS4KKworLy8gT3ZlcmxvYWRzIGZvciB2YXJpb3VzIGNoYXIgdHlwZXMuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBXaGVuIHByaW50aW5nIGEgcGxhaW4gY2hhciwgd2UgYWx3YXlzIHRyZWF0IGl0IGFzIHVuc2lnbmVkLiAgVGhpcworICAvLyB3YXksIHRoZSBvdXRwdXQgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGUgY29tcGlsZXIgdGhpbmtzCisgIC8vIGNoYXIgaXMgc2lnbmVkIG9yIG5vdC4KKyAgUHJpbnRUbyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSwgb3MpOworfQorCisvLyBPdmVybG9hZHMgZm9yIG90aGVyIHNpbXBsZSBidWlsdC1pbiB0eXBlcy4KK2lubGluZSB2b2lkIFByaW50VG8oYm9vbCB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICh4ID8gInRydWUiIDogImZhbHNlIik7Cit9CisKKy8vIE92ZXJsb2FkIGZvciB3Y2hhcl90IHR5cGUuCisvLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwKKy8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBkZWNpbWFsIGNvZGUgKGV4Y2VwdCBmb3IgTCdcMCcpLgorLy8gVGhlIEwnXDAnIGNoYXIgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4gVGhlIGRlY2ltYWwgY29kZSBpcyBwcmludGVkCisvLyBhcyBzaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbXBpbGVyCisvLyBhcyBhIHNpZ25lZCB0eXBlIGFuZCBpcyBwcmludGVkIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgd2hlbiB3Y2hhcl90CisvLyBpcyBpbXBsZW1lbnRlZCBhcyBhbiB1bnNpZ25lZCB0eXBlLgorR1RFU1RfQVBJXyB2b2lkIFByaW50VG8od2NoYXJfdCB3YywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gT3ZlcmxvYWRzIGZvciBDIHN0cmluZ3MuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IGNoYXIqPihzKSwgb3MpOworfQorCisvLyBzaWduZWQvdW5zaWduZWQgY2hhciBpcyBvZnRlbiB1c2VkIGZvciByZXByZXNlbnRpbmcgYmluYXJ5IGRhdGEsIHNvCisvLyB3ZSBwcmludCBwb2ludGVycyB0byBpdCBhcyB2b2lkKiB0byBiZSBzYWZlLgoraW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KK2lubGluZSB2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CisKKy8vIE1TVkMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdjaGFyX3QgYXMgYSB0eXBlZGVmIG9mIHVuc2lnbmVkCisvLyBzaG9ydC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgd2hlbiB3Y2hhcl90IGlzIGEgbmF0aXZlCisvLyB0eXBlLiAgV2hlbiB3Y2hhcl90IGlzIGEgdHlwZWRlZiwgZGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0CisvLyB3Y2hhcl90KiB3b3VsZCBjYXVzZSB1bnNpZ25lZCBzaG9ydCogYmUgcHJpbnRlZCBhcyBhIHdpZGUgc3RyaW5nLAorLy8gcG9zc2libHkgY2F1c2luZyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Nlcy4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKKy8vIE92ZXJsb2FkcyBmb3Igd2lkZSBDIHN0cmluZ3MKK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgd2NoYXJfdCo+KHMpLCBvcyk7Cit9CisjZW5kaWYKKworLy8gT3ZlcmxvYWQgZm9yIEMgYXJyYXlzLiAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBwcmludGVkCisvLyBwcm9wZXJseS4KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXksIHdpdGhvdXQgcHJpbnRpbmcKKy8vIHRoZSBjdXJseSBicmFjZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRSYXdBcnJheVRvKGNvbnN0IFQgYVtdLCBzaXplX3QgY291bnQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxQcmludChhWzBdLCBvcyk7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpICE9IGNvdW50OyBpKyspIHsKKyAgICAqb3MgPDwgIiwgIjsKKyAgICBVbml2ZXJzYWxQcmludChhW2ldLCBvcyk7CisgIH0KK30KKworLy8gT3ZlcmxvYWRzIGZvciA6OnN0cmluZyBhbmQgOjpzdGQ6OnN0cmluZy4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFN0cmluZ1RvKHMsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdGQ6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRTdHJpbmdUbyhzLCBvcyk7Cit9CisKKy8vIE92ZXJsb2FkcyBmb3IgOjp3c3RyaW5nIGFuZCA6OnN0ZDo6d3N0cmluZy4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK0dURVNUX0FQSV8gdm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKKy8vIE92ZXJsb2FkIGZvciA6OnN0ZDo6dHIxOjp0dXBsZS4gIE5lZWRlZCBmb3IgcHJpbnRpbmcgZnVuY3Rpb24gYXJndW1lbnRzLAorLy8gd2hpY2ggYXJlIHBhY2tlZCBhcyB0dXBsZXMuCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSB0dXBsZS4gIFQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gYSB0dXBsZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VHVwbGVUbyhjb25zdCBUJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBPdmVybG9hZGVkIFByaW50VG8oKSBmb3IgdHVwbGVzIG9mIHZhcmlvdXMgYXJpdGllcy4gIFdlIHN1cHBvcnQKKy8vIHR1cGxlcyBvZiB1cC10byAxMCBmaWVsZHMuICBUaGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIHdvcmtzCisvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdHIxOjp0dXBsZSBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUKKy8vIG5vbi1zdGFuZGFyZCB2YXJpYWRpYyB0ZW1wbGF0ZSBmZWF0dXJlIG9yIG5vdC4KKworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTw+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNj4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgordm9pZCBQcmludFRvKAorICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4mIHQsCisgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworLy8gT3ZlcmxvYWQgZm9yIHN0ZDo6cGFpci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnBhaXI8VDEsIFQyPiYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgJygnOworICAvLyBXZSBjYW5ub3QgdXNlIFVuaXZlcnNhbFByaW50KHZhbHVlLmZpcnN0LCBvcykgaGVyZSwgYXMgVDEgbWF5IGJlCisgIC8vIGEgcmVmZXJlbmNlIHR5cGUuICBUaGUgc2FtZSBmb3IgcHJpbnRpbmcgdmFsdWUuc2Vjb25kLgorICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUuZmlyc3QsIG9zKTsKKyAgKm9zIDw8ICIsICI7CisgIFVuaXZlcnNhbFByaW50ZXI8VDI+OjpQcmludCh2YWx1ZS5zZWNvbmQsIG9zKTsKKyAgKm9zIDw8ICcpJzsKK30KKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIGJ5IGxldHRpbmcgdGhlIGNvbXBpbGVyCisvLyBwaWNrIHRoZSByaWdodCBvdmVybG9hZCBvZiBQcmludFRvKCkgZm9yIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXIgeworIHB1YmxpYzoKKyAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCisgIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTgwKSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MTgwLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisgIC8vIE5vdGU6IHdlIGRlbGliZXJhdGVseSBkb24ndCBjYWxsIHRoaXMgUHJpbnRUbygpLCBhcyB0aGF0IG5hbWUKKyAgLy8gY29uZmxpY3RzIHdpdGggOjp0ZXN0aW5nOjppbnRlcm5hbDo6UHJpbnRUbyBpbiB0aGUgYm9keSBvZiB0aGUKKyAgLy8gZnVuY3Rpb24uCisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAvLyBCeSBkZWZhdWx0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvKCkgaXMgdXNlZCBmb3IgcHJpbnRpbmcKKyAgICAvLyB0aGUgdmFsdWUuCisgICAgLy8KKyAgICAvLyBUaGFua3MgdG8gS29lbmlnIGxvb2stdXAsIGlmIFQgaXMgYSBjbGFzcyBhbmQgaGFzIGl0cyBvd24KKyAgICAvLyBQcmludFRvKCkgZnVuY3Rpb24gZGVmaW5lZCBpbiBpdHMgbmFtZXNwYWNlLCB0aGF0IGZ1bmN0aW9uIHdpbGwKKyAgICAvLyBiZSB2aXNpYmxlIGhlcmUuICBTaW5jZSBpdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIGdlbmVyaWMgb25lcworICAgIC8vIGluIDo6dGVzdGluZzo6aW50ZXJuYWwsIGl0IHdpbGwgYmUgcGlja2VkIGJ5IHRoZSBjb21waWxlciBpbiB0aGUKKyAgICAvLyBmb2xsb3dpbmcgc3RhdGVtZW50IC0gZXhhY3RseSB3aGF0IHdlIHdhbnQuCisgICAgUHJpbnRUbyh2YWx1ZSwgb3MpOworICB9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbmRpZiAgLy8gX01TQ19WRVIKK307CisKKy8vIFVuaXZlcnNhbFByaW50QXJyYXkoYmVnaW4sIGxlbiwgb3MpIHByaW50cyBhbiBhcnJheSBvZiAnbGVuJworLy8gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IFQqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgKm9zIDw8ICJ7fSI7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8ICJ7ICI7CisgICAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxODsKKyAgICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDg7CisgICAgLy8gSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4ga1RocmVzaG9sZCBlbGVtZW50cywgd2UnbGwgaGF2ZSB0bworICAgIC8vIG9taXQgc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdAorICAgIC8vIGtDaHVua1NpemUgZWxlbWVudHMuCisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgorICAgIGlmIChsZW4gPD0ga1RocmVzaG9sZCkgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBsZW4sIG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgICAqb3MgPDwgIiwgLi4uLCAiOworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luICsgbGVuIC0ga0NodW5rU2l6ZSwga0NodW5rU2l6ZSwgb3MpOworICAgIH0KKyAgICAqb3MgPDwgIiB9IjsKKyAgfQorfQorLy8gVGhpcyBvdmVybG9hZCBwcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgY29tcGFjdGx5LgorR1RFU1RfQVBJXyB2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoCisgICAgY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IGNvbXBhY3RseS4KK0dURVNUX0FQSV8gdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KAorICAgIGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBJbXBsZW1lbnRzIHByaW50aW5nIGFuIGFycmF5IHR5cGUgVFtOXS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXI8VFtOXT4geworIHB1YmxpYzoKKyAgLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSwgb21pdHRpbmcgc29tZSBlbGVtZW50cyB3aGVuIHRoZXJlIGFyZSB0b28KKyAgLy8gbWFueS4KKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCAoJmEpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludEFycmF5KGEsIE4sIG9zKTsKKyAgfQorfTsKKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIHJlZmVyZW5jZSB0eXBlIFQmLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyPFQmPiB7CisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8KKyAgLy8gZGlzYWJsZSB0aGUgd2FybmluZy4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxODApICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQxODAuCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIC8vIFByaW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUuICBXZSB1c2UgcmVpbnRlcnByZXRfY2FzdCBoZXJlCisgICAgLy8gYXMgc3RhdGljX2Nhc3QgZG9lc24ndCBjb21waWxlIHdoZW4gVCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgKm9zIDw8ICJAIiA8PCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmdmFsdWUpIDw8ICIgIjsKKworICAgIC8vIFRoZW4gcHJpbnRzIHRoZSB2YWx1ZSBpdHNlbGYuCisgICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKKyAgfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYgIC8vIF9NU0NfVkVSCit9OworCisvLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQgdmFsdWUKKy8vIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhlCisvLyBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzIHByaW50ZWQuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VCY+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFRbTl0+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZ2YWx1ZSlbTl0sIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFByaW50ZXI8VFtOXT46OlByaW50KHZhbHVlLCBvcyk7CisgIH0KK307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IGNoYXIqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgKm9zIDw8ICJOVUxMIjsKKyAgICB9IGVsc2UgeworICAgICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nKHN0ciksIG9zKTsKKyAgICB9CisgIH0KK307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNoYXIqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCBjaGFyKj46OlByaW50KHN0ciwgb3MpOworICB9Cit9OworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IHdjaGFyX3QqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCB3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgKm9zIDw8ICJOVUxMIjsKKyAgICB9IGVsc2UgeworICAgICAgVW5pdmVyc2FsUHJpbnQoOjpzdGQ6OndzdHJpbmcoc3RyKSwgb3MpOworICAgIH0KKyAgfQorfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPHdjaGFyX3QqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludCh3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj46OlByaW50KHN0ciwgb3MpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zKTsKK30KKworLy8gUHJpbnRzIGEgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlCisvLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgZm9yIGEKKy8vIChjb25zdCkgY2hhciBwb2ludGVyLCB0aGlzIHByaW50cyBib3RoIHRoZSBwb2ludGVyIGFuZCB0aGUKKy8vIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIEEgd29ya2Fyb25kIGZvciB0aGUgYnVnIGluIFZDKysgNy4xIHRoYXQgcHJldmVudHMgdXMgZnJvbSBpbnN0YW50aWF0aW5nCisgIC8vIFVuaXZlcnNhbFByaW50ZXIgd2l0aCBUIGRpcmVjdGx5LgorICB0eXBlZGVmIFQgVDE7CisgIFVuaXZlcnNhbFByaW50ZXI8VDE+OjpQcmludCh2YWx1ZSwgb3MpOworfQorCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQordHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0cmluZz4gU3RyaW5nczsKKworLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgYWxsb3dzIFByaW50VG8oKSBmb3IgdHVwbGVzIGFuZAorLy8gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKCkgdG8gYmUgZGVmaW5lZCBieQorLy8gaW5kdWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgdHVwbGUgZmllbGRzLiAgVGhlIGlkZWEgaXMgdGhhdAorLy8gVHVwbGVQcmVmaXhQcmludGVyPE4+OjpQcmludFByZWZpeFRvKHQsIG9zKSBwcmludHMgdGhlIGZpcnN0IE4KKy8vIGZpZWxkcyBpbiB0dXBsZSB0LCBhbmQgY2FuIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKKy8vIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT4uCisKKy8vIFRoZSBpbmR1Y3RpdmUgY2FzZS4KK3RlbXBsYXRlIDxzaXplX3QgTj4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXIgeworICAvLyBQcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6UHJpbnRQcmVmaXhUbyh0LCBvcyk7CisgICAgKm9zIDw8ICIsICI7CisgICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PE4gLSAxLCBUdXBsZT46OnR5cGU+CisgICAgICAgIDo6UHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PE4gLSAxPih0KSwgb3MpOworICB9CisKKyAgLy8gVGVyc2VseSBwcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUgdG8gYSBzdHJpbmcgdmVjdG9yLAorICAvLyBvbmUgZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB0LCBTdHJpbmdzKiBzdHJpbmdzKSB7CisgICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6VGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyh0LCBzdHJpbmdzKTsKKyAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PE4gLSAxPih0KSwgJnNzKTsKKyAgICBzdHJpbmdzLT5wdXNoX2JhY2soc3Muc3RyKCkpOworICB9Cit9OworCisvLyBCYXNlIGNhc2VzLgordGVtcGxhdGUgPD4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MD4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmLCA6OnN0ZDo6b3N0cmVhbSopIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiwgU3RyaW5ncyopIHt9Cit9OworLy8gV2UgaGF2ZSB0byBzcGVjaWFsaXplIHRoZSBlbnRpcmUgVHVwbGVQcmVmaXhQcmludGVyPD4gY2xhc3MKKy8vIHRlbXBsYXRlIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mCisvLyBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKCkgaXMgdGhlIHNhbWUgYXMgdGhlIGdlbmVyaWMgdmVyc2lvbiwgYXMKKy8vIEVtYmFyY2FkZXJvIChmb3JtZXJseSBDb2RlR2VhciwgZm9ybWVybHkgQm9ybGFuZCkgQysrIGRvZXNuJ3QKKy8vIHN1cHBvcnQgc3BlY2lhbGl6aW5nIGEgbWV0aG9kIHRlbXBsYXRlIG9mIGEgY2xhc3MgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlcjwxPiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PDAsIFR1cGxlPjo6dHlwZT46OgorICAgICAgICBQcmludCg6OnN0ZDo6dHIxOjpnZXQ8MD4odCksIG9zKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYgdCwgU3RyaW5ncyogc3RyaW5ncykgeworICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgVW5pdmVyc2FsVGVyc2VQcmludCg6OnN0ZDo6dHIxOjpnZXQ8MD4odCksICZzcyk7CisgICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKKyAgfQorfTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoCisvLyBhIHR1cGxlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIigiOworICBUdXBsZVByZWZpeFByaW50ZXI8IDo6c3RkOjp0cjE6OnR1cGxlX3NpemU8VD46OnZhbHVlPjo6CisgICAgICBQcmludFByZWZpeFRvKHQsIG9zKTsKKyAgKm9zIDw8ICIpIjsKK30KKworLy8gUHJpbnRzIHRoZSBmaWVsZHMgb2YgYSB0dXBsZSB0ZXJzZWx5IHRvIGEgc3RyaW5nIHZlY3Rvciwgb25lCisvLyBlbGVtZW50IGZvciBlYWNoIGZpZWxkLiAgU2VlIHRoZSBjb21tZW50IGJlZm9yZQorLy8gVW5pdmVyc2FsVGVyc2VQcmludCgpIGZvciBob3cgd2UgZGVmaW5lICJ0ZXJzZWx5Ii4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KK1N0cmluZ3MgVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB2YWx1ZSkgeworICBTdHJpbmdzIHJlc3VsdDsKKyAgVHVwbGVQcmVmaXhQcmludGVyPCA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU+OjoKKyAgICAgIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModmFsdWUsICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBpbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gT3V0cHV0cyBhIG1lc3NhZ2UgZXhwbGFpbmluZyBpbnZhbGlkIHJlZ2lzdHJhdGlvbiBvZiBkaWZmZXJlbnQKKy8vIGZpeHR1cmUgY2xhc3MgZm9yIHRoZSBzYW1lIHRlc3QgY2FzZS4gVGhpcyBtYXkgaGFwcGVuIHdoZW4KKy8vIFRFU1RfUCBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSB0d28gdGVzdHMgd2l0aCB0aGUgc2FtZSBuYW1lCisvLyBidXQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCitHVEVTVF9BUElfIHZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTsKK3RlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3I7CisKKy8vIEludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgZWxlbWVudHMgcHJvdmlkZWQgYnkgYW4gaW1wbGVtZW50YXRpb24KKy8vIG9mIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflBhcmFtSXRlcmF0b3JJbnRlcmZhY2UoKSB7fQorICAvLyBBIHBvaW50ZXIgdG8gdGhlIGJhc2UgZ2VuZXJhdG9yIGluc3RhbmNlLgorICAvLyBVc2VkIG9ubHkgZm9yIHRoZSBwdXJwb3NlcyBvZiBpdGVyYXRvciBjb21wYXJpc29uCisgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHR3byBpdGVyYXRvcnMgYmVsb25nIHRvIHRoZSBzYW1lIGdlbmVyYXRvci4KKyAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0ID0gMDsKKyAgLy8gQWR2YW5jZXMgaXRlcmF0b3IgdG8gcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudAorICAvLyBwcm92aWRlZCBieSB0aGUgZ2VuZXJhdG9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgIC8vIGZvciBub3QgY2FsbGluZyBBZHZhbmNlKCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8KKyAgLy8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KKyAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSA9IDA7CisgIC8vIENsb25lcyB0aGUgaXRlcmF0b3Igb2JqZWN0LiBVc2VkIGZvciBpbXBsZW1lbnRpbmcgY29weSBzZW1hbnRpY3MKKyAgLy8gb2YgUGFyYW1JdGVyYXRvcjxUPi4KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKiBDbG9uZSgpIGNvbnN0ID0gMDsKKyAgLy8gRGVyZWZlcmVuY2VzIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGFuZCBwcm92aWRlcyAocmVhZC1vbmx5KSBhY2Nlc3MKKyAgLy8gdG8gdGhlIHBvaW50ZWQgdmFsdWUuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSBub3QgdG8gY2FsbAorICAvLyBDdXJyZW50KCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KKyAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvciooKS4KKyAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgPSAwOworICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCBvdGhlciBwb2ludCB0byB0aGUgc2FtZQorICAvLyBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGdlbmVyYXRvci4KKyAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvcj09KCkuCisgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZSYgb3RoZXIpIGNvbnN0ID0gMDsKK307CisKKy8vIENsYXNzIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4gSXQgd3JhcHMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPgorLy8gYW5kIGltcGxlbWVudHMgdGhlIGNvbnN0IGZvcndhcmQgaXRlcmF0b3IgY29uY2VwdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1JdGVyYXRvciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBUJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICAvLyBQYXJhbUl0ZXJhdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBpbXBsXyBwb2ludGVyLgorICBQYXJhbUl0ZXJhdG9yKGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSA6IGltcGxfKG90aGVyLmltcGxfLT5DbG9uZSgpKSB7fQorICBQYXJhbUl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIHsKKyAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgICBpbXBsXy5yZXNldChvdGhlci5pbXBsXy0+Q2xvbmUoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmltcGxfLT5DdXJyZW50KCk7IH0KKyAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5DdXJyZW50KCk7IH0KKyAgLy8gUHJlZml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KKyAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICBpbXBsXy0+QWR2YW5jZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLyBQb3N0Zml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KKyAgUGFyYW1JdGVyYXRvciBvcGVyYXRvcisrKGludCAvKnVudXNlZCovKSB7CisgICAgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogY2xvbmUgPSBpbXBsXy0+Q2xvbmUoKTsKKyAgICBpbXBsXy0+QWR2YW5jZSgpOworICAgIHJldHVybiBQYXJhbUl0ZXJhdG9yKGNsb25lKTsKKyAgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbF8uZ2V0KCkgPT0gb3RoZXIuaW1wbF8uZ2V0KCkgfHwgaW1wbF8tPkVxdWFscygqb3RoZXIuaW1wbF8pOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFBhcmFtR2VuZXJhdG9yPFQ+OworICBleHBsaWNpdCBQYXJhbUl0ZXJhdG9yKFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGltcGwpIDogaW1wbF8oaW1wbCkge30KKyAgc2NvcGVkX3B0cjxQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+ID4gaW1wbF87Cit9OworCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpcyB0aGUgYmluYXJ5IGludGVyZmFjZSB0byBhY2Nlc3MgZ2VuZXJhdG9ycworLy8gZGVmaW5lZCBpbiBvdGhlciB0cmFuc2xhdGlvbiB1bml0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIFBhcmFtVHlwZTsKKworICB2aXJ0dWFsIH5QYXJhbUdlbmVyYXRvckludGVyZmFjZSgpIHt9CisKKyAgLy8gR2VuZXJhdG9yIGludGVyZmFjZSBkZWZpbml0aW9uCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgPSAwOworfTsKKworLy8gV3JhcHMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gYW5kIHByb3ZpZGVzIGdlbmVyYWwgZ2VuZXJhdG9yIHN5bnRheAorLy8gY29tcGF0aWJsZSB3aXRoIHRoZSBTVEwgQ29udGFpbmVyIGNvbmNlcHQuCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgY29weSBpbml0aWFsaXphdGlvbiBzZW1hbnRpY3MgYW5kIHRoZSBjb250YWluZWQKKy8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGluc3RhbmNlIGlzIHNoYXJlZCBhbW9uZyBhbGwgY29waWVzCisvLyBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhhdCBpbnN0YW5jZSBpcyBpbW11dGFibGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1HZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBQYXJhbUl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOworCisgIGV4cGxpY2l0IFBhcmFtR2VuZXJhdG9yKFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisgIFBhcmFtR2VuZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXykge30KKworICBQYXJhbUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgeworICAgIGltcGxfID0gb3RoZXIuaW1wbF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihpbXBsXy0+QmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkVuZCgpKTsgfQorCisgcHJpdmF0ZToKKyAgbGlua2VkX3B0cjxjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOworfTsKKworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcmFuZ2Ugb2YgdHdvIGNvbXBhcmFibGUgdmFsdWVzLiBDYW4gYmUgdXNlZCB0bworLy8gZ2VuZXJhdGUgc2VxdWVuY2VzIG9mIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGltcGxlbWVudCBvcGVyYXRvcisoKSBhbmQKKy8vIG9wZXJhdG9yPCgpLgorLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSBSYW5nZSgpIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+CitjbGFzcyBSYW5nZUdlbmVyYXRvciA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiB7CisgcHVibGljOgorICBSYW5nZUdlbmVyYXRvcihUIGJlZ2luLCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKQorICAgICAgOiBiZWdpbl8oYmVnaW4pLCBlbmRfKGVuZCksCisgICAgICAgIHN0ZXBfKHN0ZXApLCBlbmRfaW5kZXhfKENhbGN1bGF0ZUVuZEluZGV4KGJlZ2luLCBlbmQsIHN0ZXApKSB7fQorICB2aXJ0dWFsIH5SYW5nZUdlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGJlZ2luXywgMCwgc3RlcF8pOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZW5kXywgZW5kX2luZGV4Xywgc3RlcF8pOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwgVCB2YWx1ZSwgaW50IGluZGV4LAorICAgICAgICAgICAgIEluY3JlbWVudFQgc3RlcCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwgdmFsdWVfKHZhbHVlKSwgaW5kZXhfKGluZGV4KSwgc3RlcF8oc3RlcCkge30KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIHZhbHVlXyA9IHZhbHVlXyArIHN0ZXBfOworICAgICAgaW5kZXhfKys7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IGludCBvdGhlcl9pbmRleCA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pbmRleF87CisgICAgICByZXR1cm4gaW5kZXhfID09IG90aGVyX2luZGV4OworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAorICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwgdmFsdWVfKG90aGVyLnZhbHVlXyksIGluZGV4XyhvdGhlci5pbmRleF8pLAorICAgICAgICAgIHN0ZXBfKG90aGVyLnN0ZXBfKSB7fQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogY29uc3QgYmFzZV87CisgICAgVCB2YWx1ZV87CisgICAgaW50IGluZGV4XzsKKyAgICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOworICB9OyAgLy8gY2xhc3MgUmFuZ2VHZW5lcmF0b3I6Okl0ZXJhdG9yCisKKyAgc3RhdGljIGludCBDYWxjdWxhdGVFbmRJbmRleChjb25zdCBUJiBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5jcmVtZW50VCYgc3RlcCkgeworICAgIGludCBlbmRfaW5kZXggPSAwOworICAgIGZvciAoVCBpID0gYmVnaW47IGkgPCBlbmQ7IGkgPSBpICsgc3RlcCkKKyAgICAgIGVuZF9pbmRleCsrOworICAgIHJldHVybiBlbmRfaW5kZXg7CisgIH0KKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJhbmdlR2VuZXJhdG9yJiBvdGhlcik7CisKKyAgY29uc3QgVCBiZWdpbl87CisgIGNvbnN0IFQgZW5kXzsKKyAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKKyAgLy8gVGhlIGluZGV4IGZvciB0aGUgZW5kKCkgaXRlcmF0b3IuIEFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGdlbmVyYXRlZAorICAvLyBzZXF1ZW5jZSBhcmUgaW5kZXhlZCAoMC1iYXNlZCkgdG8gYWlkIGl0ZXJhdG9yIGNvbXBhcmlzb24uCisgIGNvbnN0IGludCBlbmRfaW5kZXhfOworfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yCisKKworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBVc2VkIGluIHRoZQorLy8gVmFsdWVzSW4oKSBmdW5jdGlvbi4gVGhlIGVsZW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgc291cmNlIHJhbmdlCisvLyBzaW5jZSB0aGUgc291cmNlIGNhbiBiZSBsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHRoZSBnZW5lcmF0b3IKKy8vIGlzIGxpa2VseSB0byBwZXJzaXN0IGJleW9uZCB0aGF0IHN0YWNrIGZyYW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KKyAgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkKKyAgICAgIDogY29udGFpbmVyXyhiZWdpbiwgZW5kKSB7fQorICB2aXJ0dWFsIH5WYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBjb250YWluZXJfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxUPiBDb250YWluZXJUeXBlOworCisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLAorICAgICAgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yKQorICAgICAgICA6IGJhc2VfKGJhc2UpLCBpdGVyYXRvcl8oaXRlcmF0b3IpIHt9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICArK2l0ZXJhdG9yXzsKKyAgICAgIHZhbHVlXy5yZXNldCgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIC8vIFdlIG5lZWQgdG8gdXNlIGNhY2hlZCB2YWx1ZSByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yXyBiZWNhdXNlICppdGVyYXRvcl8KKyAgICAvLyBjYW4gcmV0dXJuIGEgdGVtcG9yYXJ5IG9iamVjdCAoYW5kIG9mIHR5cGUgb3RoZXIgdGhlbiBUKSwgc28ganVzdAorICAgIC8vIGhhdmluZyAicmV0dXJuICYqaXRlcmF0b3JfOyIgZG9lc24ndCB3b3JrLgorICAgIC8vIHZhbHVlXyBpcyB1cGRhdGVkIGhlcmUgYW5kIG5vdCBpbiBBZHZhbmNlKCkgYmVjYXVzZSBBZHZhbmNlKCkKKyAgICAvLyBjYW4gYWR2YW5jZSBpdGVyYXRvcl8gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJhbmdlLCBhbmQgd2UgY2Fubm90CisgICAgLy8gZGV0ZWN0IHRoYXQgZmFjdC4gVGhlIGNsaWVudCBjb2RlLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMKKyAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90IGNhbGxpbmcgQ3VycmVudCgpIG9uIGFuIG91dC1vZi1yYW5nZSBpdGVyYXRvci4KKyAgICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCB7CisgICAgICBpZiAodmFsdWVfLmdldCgpID09IE5VTEwpCisgICAgICAgIHZhbHVlXy5yZXNldChuZXcgVCgqaXRlcmF0b3JfKSk7CisgICAgICByZXR1cm4gdmFsdWVfLmdldCgpOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gaXRlcmF0b3JfID09CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pdGVyYXRvcl87CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgICAvLyBUaGUgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCBzdXBwcmVzc2VzIGEgZmFsc2Ugd2FybmluZworICAgICAgICAgIC8vIGVtaXR0ZWQgYnkgZ2NjIHdoZW4gc3VwcGxpZWQgd2l0aCB0aGUgLVdleHRyYSBvcHRpb24uCisgICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAorICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgICBpdGVyYXRvcl8ob3RoZXIuaXRlcmF0b3JfKSB7fQorCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOworICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yXzsKKyAgICAvLyBBIGNhY2hlZCB2YWx1ZSBvZiAqaXRlcmF0b3JfLiBXZSBrZWVwIGl0IGhlcmUgdG8gYWxsb3cgYWNjZXNzIGJ5CisgICAgLy8gcG9pbnRlciBpbiB0aGUgd3JhcHBpbmcgaXRlcmF0b3IncyBvcGVyYXRvci0+KCkuCisgICAgLy8gdmFsdWVfIG5lZWRzIHRvIGJlIG11dGFibGUgdG8gYmUgYWNjZXNzZWQgaW4gQ3VycmVudCgpLgorICAgIC8vIFVzZSBvZiBzY29wZWRfcHRyIGhlbHBzIG1hbmFnZSBjYWNoZWQgdmFsdWUncyBsaWZldGltZSwKKyAgICAvLyB3aGljaCBpcyBib3VuZCBieSB0aGUgbGlmZXNwYW4gb2YgdGhlIGl0ZXJhdG9yIGl0c2VsZi4KKyAgICBtdXRhYmxlIHNjb3BlZF9wdHI8Y29uc3QgVD4gdmFsdWVfOworICB9OyAgLy8gY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yJiBvdGhlcik7CisKKyAgY29uc3QgQ29udGFpbmVyVHlwZSBjb250YWluZXJfOworfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcgorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFN0b3JlcyBhIHBhcmFtZXRlciB2YWx1ZSBhbmQgbGF0ZXIgY3JlYXRlcyB0ZXN0cyBwYXJhbWV0ZXJpemVkIHdpdGggdGhhdAorLy8gdmFsdWUuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5IDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDbGFzczo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKKyAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIDoKKyAgICAgIHBhcmFtZXRlcl8ocGFyYW1ldGVyKSB7fQorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7CisgICAgVGVzdENsYXNzOjpTZXRQYXJhbSgmcGFyYW1ldGVyXyk7CisgICAgcmV0dXJuIG5ldyBUZXN0Q2xhc3MoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgUGFyYW1UeXBlIHBhcmFtZXRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkpOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBUZXN0TWV0YUZhY3RvcnlCYXNlIGlzIGEgYmFzZSBjbGFzcyBmb3IgbWV0YS1mYWN0b3JpZXMgdGhhdCBjcmVhdGUKKy8vIHRlc3QgZmFjdG9yaWVzIGZvciBwYXNzaW5nIGludG8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgorY2xhc3MgVGVzdE1ldGFGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UZXN0TWV0YUZhY3RvcnlCYXNlKCkge30KKworICB2aXJ0dWFsIFRlc3RGYWN0b3J5QmFzZSogQ3JlYXRlVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgPSAwOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBUZXN0TWV0YUZhY3RvcnkgY3JlYXRlcyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvCisvLyBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyBmdW5jdGlvbi4gU2luY2UgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gcmVjZWl2ZXMKKy8vIG93bmVyc2hpcCBvZiB0ZXN0IGZhY3RvcnkgcG9pbnRlciwgc2FtZSBmYWN0b3J5IG9iamVjdCBjYW5ub3QgYmUgcGFzc2VkCisvLyBpbnRvIHRoYXQgbWV0aG9kIHR3aWNlLiBCdXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBpcyBnb2luZyB0byBjYWxsCisvLyBpdCBmb3IgZWFjaCBUZXN0L1BhcmFtZXRlciB2YWx1ZSBjb21iaW5hdGlvbi4gVGh1cyBpdCBuZWVkcyBtZXRhIGZhY3RvcnkKKy8vIGNyZWF0b3IgY2xhc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+CitjbGFzcyBUZXN0TWV0YUZhY3RvcnkKKyAgICA6IHB1YmxpYyBUZXN0TWV0YUZhY3RvcnlCYXNlPHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGU+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZSBQYXJhbVR5cGU7CisKKyAgVGVzdE1ldGFGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIFRlc3RGYWN0b3J5QmFzZSogQ3JlYXRlVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgeworICAgIHJldHVybiBuZXcgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5PFRlc3RDYXNlPihwYXJhbWV0ZXIpOworICB9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RNZXRhRmFjdG9yeSk7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGlzIGEgZ2VuZXJpYyBpbnRlcmZhY2UKKy8vIHRvIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gY2xhc3Nlcy4gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UKKy8vIGFjY3VtdWxhdGVzIHRlc3QgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgVEVTVF9QIG1hY3JvIGludm9jYXRpb25zCisvLyBhbmQgZ2VuZXJhdG9ycyBwcm92aWRlZCBieSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucworLy8gYW5kIHVzZXMgdGhhdCBpbmZvcm1hdGlvbiB0byByZWdpc3RlciBhbGwgcmVzdWx0aW5nIHRlc3QgaW5zdGFuY2VzCisvLyBpbiBSZWdpc3RlclRlc3RzIG1ldGhvZC4gVGhlIFBhcmFtZXRlcml6ZVRlc3RDYXNlUmVnaXN0cnkgY2xhc3MgaG9sZHMKKy8vIGEgY29sbGVjdGlvbiBvZiBwb2ludGVycyB0byB0aGUgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBvYmplY3RzCisvLyBhbmQgY2FsbHMgUmVnaXN0ZXJUZXN0cygpIG9uIGVhY2ggb2YgdGhlbSB3aGVuIGFza2VkLgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UoKSB7fQorCisgIC8vIEJhc2UgcGFydCBvZiB0ZXN0IGNhc2UgbmFtZSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEdldFRlc3RDYXNlTmFtZSgpIGNvbnN0ID0gMDsKKyAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4KKyAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCA9IDA7CisgIC8vIFVuaXRUZXN0IGNsYXNzIGludm9rZXMgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgdGVzdHMgaW4gdGhpcworICAvLyB0ZXN0IGNhc2UgcmlnaHQgYmVmb3JlIHJ1bm5pbmcgdGhlbSBpbiBSVU5fQUxMX1RFU1RTIG1hY3JvLgorICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZSBvbiBhbnkgc2luZ2xlCisgIC8vIGluc3RhbmNlIG9mIGEgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgZGVyaXZlZCBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVGVzdHMoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UpOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGFjY3VtdWxhdGVzIHRlc3RzIG9idGFpbmVkIGZyb20gVEVTVF9QCisvLyBtYWNybyBpbnZvY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZSBhbmQgZ2VuZXJhdG9ycworLy8gb2J0YWluZWQgZnJvbSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucyBmb3IgdGhhdAorLy8gdGVzdCBjYXNlLiBJdCByZWdpc3RlcnMgdGVzdHMgd2l0aCBhbGwgdmFsdWVzIGdlbmVyYXRlZCBieSBhbGwKKy8vIGdlbmVyYXRvcnMgd2hlbiBhc2tlZC4KK3RlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gOiBwdWJsaWMgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgeworIHB1YmxpYzoKKyAgLy8gUGFyYW1UeXBlIGFuZCBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMgYXJlIHByaXZhdGUgdHlwZXMgYnV0IGFyZSByZXF1aXJlZAorICAvLyBmb3IgZGVjbGFyYXRpb25zIG9mIHB1YmxpYyBtZXRob2RzIEFkZFRlc3RQYXR0ZXJuKCkgYW5kCisgIC8vIEFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbigpLgorICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOworICAvLyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhcHByb3ByaWF0ZSBnZW5lcmF0b3IgdHlwZS4KKyAgdHlwZWRlZiBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+KEdlbmVyYXRvckNyZWF0aW9uRnVuYykoKTsKKworICBleHBsaWNpdCBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgICA6IHRlc3RfY2FzZV9uYW1lXyhuYW1lKSB7fQorCisgIC8vIFRlc3QgY2FzZSBiYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCB7IHJldHVybiB0ZXN0X2Nhc2VfbmFtZV87IH0KKyAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4KKyAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCB7IHJldHVybiBHZXRUeXBlSWQ8VGVzdENhc2U+KCk7IH0KKyAgLy8gVEVTVF9QIG1hY3JvIHVzZXMgQWRkVGVzdFBhdHRlcm4oKSB0byByZWNvcmQgaW5mb3JtYXRpb24KKyAgLy8gYWJvdXQgYSBzaW5nbGUgdGVzdCBpbiBhIExvY2FsVGVzdEluZm8gc3RydWN0dXJlLgorICAvLyB0ZXN0X2Nhc2VfbmFtZSBpcyB0aGUgYmFzZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgKHdpdGhvdXQgaW52b2NhdGlvbgorICAvLyBwcmVmaXgpLiB0ZXN0X2Jhc2VfbmFtZSBpcyB0aGUgbmFtZSBvZiBhbiBpbmRpdmlkdWFsIHRlc3Qgd2l0aG91dAorICAvLyBwYXJhbWV0ZXIgaW5kZXguIEZvciB0aGUgdGVzdCBTZXF1ZW5jZUEvRm9vVGVzdC5Eb0Jhci8xIEZvb1Rlc3QgaXMKKyAgLy8gdGVzdCBjYXNlIGJhc2UgbmFtZSBhbmQgRG9CYXIgaXMgdGVzdCBiYXNlIG5hbWUuCisgIHZvaWQgQWRkVGVzdFBhdHRlcm4oY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9iYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgVGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+KiBtZXRhX2ZhY3RvcnkpIHsKKyAgICB0ZXN0c18ucHVzaF9iYWNrKGxpbmtlZF9wdHI8VGVzdEluZm8+KG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2ZhY3RvcnkpKSk7CisgIH0KKyAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gdXNlcyBBZGRHZW5lcmF0b3IoKSB0byByZWNvcmQgaW5mb3JtYXRpb24KKyAgLy8gYWJvdXQgYSBnZW5lcmF0b3IuCisgIGludCBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oY29uc3Qgc3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIGZpbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGxpbmUgKi8pIHsKKyAgICBpbnN0YW50aWF0aW9uc18ucHVzaF9iYWNrKDo6c3RkOjptYWtlX3BhaXIoaW5zdGFudGlhdGlvbl9uYW1lLCBmdW5jKSk7CisgICAgcmV0dXJuIDA7ICAvLyBSZXR1cm4gdmFsdWUgdXNlZCBvbmx5IHRvIHJ1biB0aGlzIG1ldGhvZCBpbiBuYW1lc3BhY2Ugc2NvcGUuCisgIH0KKyAgLy8gVW5pdFRlc3QgY2xhc3MgaW52b2tlcyB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZQorICAvLyB0ZXN0IGNhc2VzIHJpZ2h0IGJlZm9yZSBydW5uaW5nIHRlc3RzIGluIFJVTl9BTExfVEVTVFMgbWFjcm8uCisgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlIG9uIGFueSBzaW5nbGUKKyAgLy8gaW5zdGFuY2Ugb2YgYSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBkZXJpdmVkIGNsYXNzLgorICAvLyBVbml0VGVzdCBoYXMgYSBndWFyZCB0byBwcmV2ZW50IGZyb20gY2FsbGluZyB0aGlzIG1ldGhvZCBtb3JlIHRoZW4gb25jZS4KKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7CisgICAgZm9yICh0eXBlbmFtZSBUZXN0SW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgdGVzdF9pdCA9IHRlc3RzXy5iZWdpbigpOworICAgICAgICAgdGVzdF9pdCAhPSB0ZXN0c18uZW5kKCk7ICsrdGVzdF9pdCkgeworICAgICAgbGlua2VkX3B0cjxUZXN0SW5mbz4gdGVzdF9pbmZvID0gKnRlc3RfaXQ7CisgICAgICBmb3IgKHR5cGVuYW1lIEluc3RhbnRpYXRpb25Db250YWluZXI6Oml0ZXJhdG9yIGdlbl9pdCA9CisgICAgICAgICAgICAgICBpbnN0YW50aWF0aW9uc18uYmVnaW4oKTsgZ2VuX2l0ICE9IGluc3RhbnRpYXRpb25zXy5lbmQoKTsKKyAgICAgICAgICAgICAgICsrZ2VuX2l0KSB7CisgICAgICAgIGNvbnN0IHN0cmluZyYgaW5zdGFudGlhdGlvbl9uYW1lID0gZ2VuX2l0LT5maXJzdDsKKyAgICAgICAgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPiBnZW5lcmF0b3IoKCpnZW5faXQtPnNlY29uZCkoKSk7CisKKyAgICAgICAgc3RyaW5nIHRlc3RfY2FzZV9uYW1lOworICAgICAgICBpZiAoICFpbnN0YW50aWF0aW9uX25hbWUuZW1wdHkoKSApCisgICAgICAgICAgdGVzdF9jYXNlX25hbWUgPSBpbnN0YW50aWF0aW9uX25hbWUgKyAiLyI7CisgICAgICAgIHRlc3RfY2FzZV9uYW1lICs9IHRlc3RfaW5mby0+dGVzdF9jYXNlX2Jhc2VfbmFtZTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAodHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPjo6aXRlcmF0b3IgcGFyYW1faXQgPQorICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgICAgICAgICAgICBwYXJhbV9pdCAhPSBnZW5lcmF0b3IuZW5kKCk7ICsrcGFyYW1faXQsICsraSkgeworICAgICAgICAgIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsKKyAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtIDw8IHRlc3RfaW5mby0+dGVzdF9iYXNlX25hbWUgPDwgIi8iIDw8IGk7CisgICAgICAgICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgIHRlc3RfbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgTlVMTCwgIC8vIE5vIHR5cGUgcGFyYW1ldGVyLgorICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKCpwYXJhbV9pdCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgR2V0VGVzdENhc2VUeXBlSWQoKSwKKyAgICAgICAgICAgICAgVGVzdENhc2U6OlNldFVwVGVzdENhc2UsCisgICAgICAgICAgICAgIFRlc3RDYXNlOjpUZWFyRG93blRlc3RDYXNlLAorICAgICAgICAgICAgICB0ZXN0X2luZm8tPnRlc3RfbWV0YV9mYWN0b3J5LT5DcmVhdGVUZXN0RmFjdG9yeSgqcGFyYW1faXQpKTsKKyAgICAgICAgfSAgLy8gZm9yIHBhcmFtX2l0CisgICAgICB9ICAvLyBmb3IgZ2VuX2l0CisgICAgfSAgLy8gZm9yIHRlc3RfaXQKKyAgfSAgLy8gUmVnaXN0ZXJUZXN0cworCisgcHJpdmF0ZToKKyAgLy8gTG9jYWxUZXN0SW5mbyBzdHJ1Y3R1cmUga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgdGVzdCByZWdpc3RlcmVkCisgIC8vIHdpdGggVEVTVF9QIG1hY3JvLgorICBzdHJ1Y3QgVGVzdEluZm8geworICAgIFRlc3RJbmZvKGNvbnN0IGNoYXIqIGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3Rlc3RfYmFzZV9uYW1lLAorICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogYV90ZXN0X21ldGFfZmFjdG9yeSkgOgorICAgICAgICB0ZXN0X2Nhc2VfYmFzZV9uYW1lKGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSksCisgICAgICAgIHRlc3RfYmFzZV9uYW1lKGFfdGVzdF9iYXNlX25hbWUpLAorICAgICAgICB0ZXN0X21ldGFfZmFjdG9yeShhX3Rlc3RfbWV0YV9mYWN0b3J5KSB7fQorCisgICAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9iYXNlX25hbWU7CisgICAgY29uc3Qgc3RyaW5nIHRlc3RfYmFzZV9uYW1lOworICAgIGNvbnN0IHNjb3BlZF9wdHI8VGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+ID4gdGVzdF9tZXRhX2ZhY3Rvcnk7CisgIH07CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRlc3RJbmZvPiA+IFRlc3RJbmZvQ29udGFpbmVyOworICAvLyBLZWVwcyBwYWlycyBvZiA8SW5zdGFudGlhdGlvbiBuYW1lLCBTZXF1ZW5jZSBnZW5lcmF0b3IgY3JlYXRpb24gZnVuY3Rpb24+CisgIC8vIHJlY2VpdmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm9zLgorICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0cmluZywgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKj4gPgorICAgICAgSW5zdGFudGlhdGlvbkNvbnRhaW5lcjsKKworICBjb25zdCBzdHJpbmcgdGVzdF9jYXNlX25hbWVfOworICBUZXN0SW5mb0NvbnRhaW5lciB0ZXN0c187CisgIEluc3RhbnRpYXRpb25Db250YWluZXIgaW5zdGFudGlhdGlvbnNfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyk7Cit9OyAgLy8gY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnRhaW5zIGEgbWFwIG9mIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlCisvLyBjbGFzc2VzIGFjY2Vzc2VkIGJ5IHRlc3QgY2FzZSBuYW1lcy4gVEVTVF9QIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUAorLy8gbWFjcm9zIHVzZSBpdCB0byBsb2NhdGUgdGhlaXIgY29ycmVzcG9uZGluZyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvCisvLyBkZXNjcmlwdG9ycy4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyBwdWJsaWM6CisgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KCkge30KKyAgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KCkgeworICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIGRlbGV0ZSAqaXQ7CisgICAgfQorICB9CisKKyAgLy8gTG9va3MgdXAgb3IgY3JlYXRlcyBhbmQgcmV0dXJucyBhIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0CisgIC8vIHRlc3RzIGFuZCBpbnN0YW50aWF0aW9ucyBvZiBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+CisgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KiBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXIoCisgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICBpbnQgbGluZSkgeworICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KiB0eXBlZF90ZXN0X2luZm8gPSBOVUxMOworICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VOYW1lKCkgPT0gdGVzdF9jYXNlX25hbWUpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5HZXRUZXN0Q2FzZVR5cGVJZCgpICE9IEdldFR5cGVJZDxUZXN0Q2FzZT4oKSkgeworICAgICAgICAgIC8vIENvbXBsYWluIGFib3V0IGluY29ycmVjdCB1c2FnZSBvZiBHb29nbGUgVGVzdCBmYWNpbGl0aWVzCisgICAgICAgICAgLy8gYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSBzaW5jZSB3ZSBjYW5ub3QgZ3VhcmFudHkgY29ycmVjdAorICAgICAgICAgIC8vIHRlc3QgY2FzZSBzZXR1cCBhbmQgdGVhci1kb3duIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICBSZXBvcnRJbnZhbGlkVGVzdENhc2VUeXBlKHRlc3RfY2FzZV9uYW1lLCAgZmlsZSwgbGluZSk7CisgICAgICAgICAgcG9zaXg6OkFib3J0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBvYmplY3Qgd2UgZm91bmQgaXMgb2YgdGhlIHNhbWUKKyAgICAgICAgICAvLyB0eXBlIHdlIGFyZSBsb29raW5nIGZvciwgc28gd2UgZG93bmNhc3QgaXQgdG8gdGhhdCB0eXBlCisgICAgICAgICAgLy8gd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KKyAgICAgICAgICB0eXBlZF90ZXN0X2luZm8gPSBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8CisgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+ID4oKml0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGVkX3Rlc3RfaW5mbyA9PSBOVUxMKSB7CisgICAgICB0eXBlZF90ZXN0X2luZm8gPSBuZXcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4odGVzdF9jYXNlX25hbWUpOworICAgICAgdGVzdF9jYXNlX2luZm9zXy5wdXNoX2JhY2sodHlwZWRfdGVzdF9pbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVkX3Rlc3RfaW5mbzsKKyAgfQorICB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7CisgICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgeworICAgICAgKCppdCktPlJlZ2lzdGVyVGVzdHMoKTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSo+IFRlc3RDYXNlSW5mb0NvbnRhaW5lcjsKKworICBUZXN0Q2FzZUluZm9Db250YWluZXIgdGVzdF9jYXNlX2luZm9zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgorLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gQ3VycmVudGx5IEdvb2dsZSBUZXN0IHN1cHBvcnRzIGF0IG1vc3QgNTAgYXJndW1lbnRzIGluIFZhbHVlcywKKy8vIGFuZCBhdCBtb3N0IDEwIGFyZ3VtZW50cyBpbiBDb21iaW5lLiBQbGVhc2UgY29udGFjdAorLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkIG1vcmUuCisvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIENvbWJpbmUgaXMgbGltaXRlZAorLy8gYnkgdGhlIG1heGltdW0gYXJpdHkgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRyMTo6dHVwbGUgd2hpY2ggaXMKKy8vIGN1cnJlbnRseSBzZXQgYXQgMTAuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCisKKy8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKKy8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKKy8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIFZhbHVlc0luKCksIHdoaWNoIGlzIGltcGxlbWVudGVkIGluCisvLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSk7CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVzZWQgaW4gdGhlIFZhbHVlcygpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgcG9seW1vcnBoaWMgY2FwYWJpbGl0aWVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorY2xhc3MgVmFsdWVBcnJheTEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVmFsdWVBcnJheTEoVDEgdjEpIDogdjFfKHYxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlc0luKCZ2MV8sICZ2MV8gKyAxKTsgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBWYWx1ZUFycmF5MiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MihUMSB2MSwgVDIgdjIpIDogdjFfKHYxKSwgdjJfKHYyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitjbGFzcyBWYWx1ZUFycmF5MyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MyhUMSB2MSwgVDIgdjIsIFQzIHYzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorY2xhc3MgVmFsdWVBcnJheTQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorY2xhc3MgVmFsdWVBcnJheTUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgVmFsdWVBcnJheTYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NikgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2NsYXNzIFZhbHVlQXJyYXk3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorY2xhc3MgVmFsdWVBcnJheTggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgICBUOCB2OCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5OCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK2NsYXNzIFZhbHVlQXJyYXk5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICAgIFQ5IHY5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2NsYXNzIFZhbHVlQXJyYXkxMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorY2xhc3MgVmFsdWVBcnJheTExIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitjbGFzcyBWYWx1ZUFycmF5MTIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK2NsYXNzIFZhbHVlQXJyYXkxMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK2NsYXNzIFZhbHVlQXJyYXkxNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK2NsYXNzIFZhbHVlQXJyYXkxNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgorY2xhc3MgVmFsdWVBcnJheTE2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNikgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3PgorY2xhc3MgVmFsdWVBcnJheTE3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICAgIFQxNyB2MTcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgorY2xhc3MgVmFsdWVBcnJheTE4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxOCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgorY2xhc3MgVmFsdWVBcnJheTE5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxOSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorY2xhc3MgVmFsdWVBcnJheTIwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxPgorY2xhc3MgVmFsdWVBcnJheTIxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorY2xhc3MgVmFsdWVBcnJheTIyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorY2xhc3MgVmFsdWVBcnJheTIzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK2NsYXNzIFZhbHVlQXJyYXkyNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitjbGFzcyBWYWx1ZUFycmF5MjUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICAgIFQyNSB2MjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjY+CitjbGFzcyBWYWx1ZUFycmF5MjYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitjbGFzcyBWYWx1ZUFycmF5MjcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4PgorY2xhc3MgVmFsdWVBcnJheTI4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyOCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK2NsYXNzIFZhbHVlQXJyYXkyOSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAorICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKKyAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitjbGFzcyBWYWx1ZUFycmF5MzAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorY2xhc3MgVmFsdWVBcnJheTMxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxKSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KK2NsYXNzIFZhbHVlQXJyYXkzMiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMikgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitjbGFzcyBWYWx1ZUFycmF5MzMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgICBUMzMgdjMzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK2NsYXNzIFZhbHVlQXJyYXkzNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1PgorY2xhc3MgVmFsdWVBcnJheTM1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKKyAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCisgICAgICB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLAorICAgICAgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK2NsYXNzIFZhbHVlQXJyYXkzNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKKyAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCisgICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitjbGFzcyBWYWx1ZUFycmF5MzcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK2NsYXNzIFZhbHVlQXJyYXkzOCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgorY2xhc3MgVmFsdWVBcnJheTM5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSkgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzOSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitjbGFzcyBWYWx1ZUFycmF5NDAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAorICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwKKyAgICAgIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksCisgICAgICB2NDBfKHY0MCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK2NsYXNzIFZhbHVlQXJyYXk0MSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsCisgICAgICBUNDEgdjQxKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorY2xhc3MgVmFsdWVBcnJheTQyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+CitjbGFzcyBWYWx1ZUFycmF5NDMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKKyAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCisgICAgICB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLAorICAgICAgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwKKyAgICAgIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KK2NsYXNzIFZhbHVlQXJyYXk0NCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLAorICAgICAgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwKKyAgICAgIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksCisgICAgICB2NDNfKHY0MyksIHY0NF8odjQ0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2NsYXNzIFZhbHVlQXJyYXk0NSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLAorICAgICAgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgorY2xhc3MgVmFsdWVBcnJheTQ2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAorICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+CitjbGFzcyBWYWx1ZUFycmF5NDcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NykgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksCisgICAgICB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLAorICAgICAgdjQ3Xyh2NDcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitjbGFzcyBWYWx1ZUFycmF5NDggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksCisgICAgICB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLAorICAgICAgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwKKyAgICAgIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitjbGFzcyBWYWx1ZUFycmF5NDkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwKKyAgICAgIFQ0OSB2NDkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksCisgICAgICB2NDVfKHY0NSksIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCksIHY0OV8odjQ5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKSwgc3RhdGljX2Nhc3Q8VD4odjQ5Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKKyAgY29uc3QgVDQ5IHY0OV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitjbGFzcyBWYWx1ZUFycmF5NTAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTUwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSwKKyAgICAgIFQ1MCB2NTApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksCisgICAgICB2NDVfKHY0NSksIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCksIHY0OV8odjQ5KSwgdjUwXyh2NTApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0OF8pLCBzdGF0aWNfY2FzdDxUPih2NDlfKSwgc3RhdGljX2Nhc3Q8VD4odjUwXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTUwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKKyAgY29uc3QgVDQ5IHY0OV87CisgIGNvbnN0IFQ1MCB2NTBfOworfTsKKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHZhbHVlcyBwcm9kdWNlZAorLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyKQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MikgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50Ml87CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjImIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMworICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MykKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDRfOworICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50NV87CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNgorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsCisgICAgICAgIFQ2PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNikge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKKyAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDZfOworICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNiYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3CisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICAgIFQ3PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDdfOworICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDg+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKKyAgICAgICAgICBnOF8oZzgpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKKyAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50OF87CisgICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7CisgICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87CisgICAgICAgICsrY3VycmVudDdfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKKyAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCisgICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCisgICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKKyAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCisgICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCisgICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKKyAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksCisgICAgICAgIGJlZ2luOF8ob3RoZXIuYmVnaW44XyksCisgICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwKKyAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18sICpjdXJyZW50OF8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAorICAgICAgICAgIGc5XyhnOSkge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKKyAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywKKyAgICAgICAgZzdfLmJlZ2luKCksIGc4XywgZzhfLmJlZ2luKCksIGc5XywgZzlfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAorICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKKyAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCksCisgICAgICAgICAgYmVnaW45XyhnOS5iZWdpbigpKSwgZW5kOV8oZzkuZW5kKCkpLCBjdXJyZW50OV8oY3VycmVudDkpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDlfOworICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgeworICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOworICAgICAgICArK2N1cnJlbnQ4XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKKyAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKKyAgICAgICAgKytjdXJyZW50N187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7CisgICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187CisgICAgICAgICsrY3VycmVudDZfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKKyAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgorICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCisgICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAorICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAorICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCisgICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAorICAgICAgICAgICAgKmN1cnJlbnQ5Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAorICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XyB8fAorICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XyB8fAorICAgICAgICAgIGN1cnJlbnQ5XyA9PSBlbmQ5XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICAgIFQ3LCBUOCwgVDksIFQxMD4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpLCBnMTBfLCBnMTBfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAorICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpLCBnMTBfLCBnMTBfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiYgZzEwLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3ImIGN1cnJlbnQxMCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAorICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSwKKyAgICAgICAgICBiZWdpbjEwXyhnMTAuYmVnaW4oKSksIGVuZDEwXyhnMTAuZW5kKCkpLCBjdXJyZW50MTBfKGN1cnJlbnQxMCkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50MTBfOworICAgICAgaWYgKGN1cnJlbnQxMF8gPT0gZW5kMTBfKSB7CisgICAgICAgIGN1cnJlbnQxMF8gPSBiZWdpbjEwXzsKKyAgICAgICAgKytjdXJyZW50OV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7CisgICAgICAgIGN1cnJlbnQ5XyA9IGJlZ2luOV87CisgICAgICAgICsrY3VycmVudDhfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8gJiYKKyAgICAgICAgICBjdXJyZW50OV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ5XyAmJgorICAgICAgICAgIGN1cnJlbnQxMF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxMF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAorICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAorICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCisgICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pLAorICAgICAgICBiZWdpbjEwXyhvdGhlci5iZWdpbjEwXyksCisgICAgICAgIGVuZDEwXyhvdGhlci5lbmQxMF8pLAorICAgICAgICBjdXJyZW50MTBfKG90aGVyLmN1cnJlbnQxMF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAorICAgICAgICAgICAgKmN1cnJlbnQ5XywgKmN1cnJlbnQxMF8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKKyAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV8gfHwKKyAgICAgICAgICBjdXJyZW50MTBfID09IGVuZDEwXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGJlZ2luMTBfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGVuZDEwXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBjdXJyZW50MTBfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMDo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4gZzEwXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAKKworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBDb21iaW5lKCkgd2l0aCBwb2x5bW9ycGhpYyBmZWF0dXJlcy4gVGhleSBhbGxvdworLy8gY2FzdGluZyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yTjxUPiB0byBQYXJhbUdlbmVyYXRvcjxVPiBpZiBUIGlzCisvLyBjb252ZXJ0aWJsZSB0byBVLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIyKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjI8VDEsIFQyPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIyJiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyCisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIzKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM8VDEsIFQyLCBUMz4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yND4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNDxUMSwgVDIsIFQzLCBUND4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjU+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1PFQxLCBUMiwgVDMsIFQ0LCBUNT4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNQorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI2KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNj4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNiYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI3IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICBUNz4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNworCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKKyAgICAgICAgICBnOF8oZzgpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsCisgICAgICBUOD4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOAorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjk+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKKyAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgIFQ5PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAorICAgICAgICBUOT4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87CisgIGNvbnN0IEdlbmVyYXRvcjkgZzlfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI5CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjcsCisgICAgY2xhc3MgR2VuZXJhdG9yOCwgY2xhc3MgR2VuZXJhdG9yOSwgY2xhc3MgR2VuZXJhdG9yMTA+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIxMChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LAorICAgIGNvbnN0IEdlbmVyYXRvcjkmIGc5LCBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAorICAgICAgICAgIGc5XyhnOSksIGcxMF8oZzEwKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgIFQ5LCBUMTA+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICAgIFQ5LCBUMTA+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwKKyAgICAgICAgICAgIFQxMD4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ5PiA+KGc5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxMD4gPihnMTBfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKKyAgY29uc3QgR2VuZXJhdG9yOSBnOV87CisgIGNvbnN0IEdlbmVyYXRvcjEwIGcxMF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwCisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZ1bmN0aW9ucyBwcm9kdWNpbmcgcGFyYW1ldGVyIGdlbmVyYXRvcnMuCisvLworLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGVzZSBnZW5lcmF0b3JzIHRvIHByb2R1Y2UgcGFyYW1ldGVycyBmb3IgdmFsdWUtCisvLyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBXaGVuIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgaXMgaW5zdGFudGlhdGVkCisvLyB3aXRoIGEgcGFydGljdWxhciBnZW5lcmF0b3IsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYW5kIHJ1bnMgdGVzdHMKKy8vIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBzYW1wbGUsIHRlc3RzIGZyb20gdGVzdCBjYXNlIEZvb1Rlc3QgYXJlIGluc3RhbnRpYXRlZAorLy8gZWFjaCB0aHJlZSB0aW1lcyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgMywgNSwgYW5kIDg6CisvLworLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geyAuLi4gfTsKKy8vCisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoaXMpIHsKKy8vIH0KKy8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhhdCkgeworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdFNlcXVlbmNlLCBGb29UZXN0LCBWYWx1ZXMoMywgNSwgOCkpOworLy8KKworLy8gUmFuZ2UoKSByZXR1cm5zIGdlbmVyYXRvcnMgcHJvdmlkaW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgaW4gYSByYW5nZS4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFJhbmdlKHN0YXJ0LCBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCsxLAorLy8gICAgIHN0YXJ0KzIsIC4uLiwgfS4KKy8vIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCtzdGVwLAorLy8gICAgIHN0YXJ0K3N0ZXArc3RlcCwgLi4uLCB9LgorLy8gTm90ZXM6CisvLyAgICogVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgbmV2ZXIgaW5jbHVkZSBlbmQuIEZvciBleGFtcGxlLCBSYW5nZSgxLCA1KQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2UgezEsIDIsIDMsIDR9LiBSYW5nZSgxLCA5LCAyKQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHsxLCAzLCA1LCA3fS4KKy8vICAgKiBzdGFydCBhbmQgZW5kIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBUaGF0IHR5cGUgbWF5IGJlIGFueSBpbnRlZ3JhbCBvcgorLy8gICAgIGZsb2F0aW5nLXBvaW50IHR5cGUgb3IgYSB1c2VyIGRlZmluZWQgdHlwZSBzYXRpc2Z5aW5nIHRoZXNlIGNvbmRpdGlvbnM6CisvLyAgICAgKiBJdCBtdXN0IGJlIGFzc2lnbmFibGUgKGhhdmUgb3BlcmF0b3I9KCkgZGVmaW5lZCkuCisvLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3IrKCkgKG9wZXJhdG9yKyhpbnQtY29tcGF0aWJsZSB0eXBlKSBmb3IKKy8vICAgICAgIHR3by1vcGVyYW5kIHZlcnNpb24pLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yPCgpIGRlZmluZWQuCisvLyAgICAgRWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMgd2lsbCBhbHNvIGhhdmUgdGhhdCB0eXBlLgorLy8gICAqIENvbmRpdGlvbiBzdGFydCA8IGVuZCBtdXN0IGJlIHNhdGlzZmllZCBpbiBvcmRlciBmb3IgcmVzdWx0aW5nIHNlcXVlbmNlcworLy8gICAgIHRvIGNvbnRhaW4gYW55IGVsZW1lbnRzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApIHsKKyAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6UmFuZ2VHZW5lcmF0b3I8VCwgSW5jcmVtZW50VD4oc3RhcnQsIGVuZCwgc3RlcCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCkgeworICByZXR1cm4gUmFuZ2Uoc3RhcnQsIGVuZCwgMSk7Cit9CisKKy8vIFZhbHVlc0luKCkgZnVuY3Rpb24gYWxsb3dzIGdlbmVyYXRpb24gb2YgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGNvbWluZyBmcm9tCisvLyBhIGNvbnRhaW5lci4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgQy1zdHlsZSBhcnJheS4KKy8vIFZhbHVlc0luKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhbiBTVEwtc3R5bGUgY29udGFpbmVyLgorLy8gVmFsdWVzSW4oSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYSByYW5nZSBbYmVnaW4sIGVuZCkgZGVmaW5lZCBieSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVGhlc2UKKy8vICAgICBpdGVyYXRvcnMgY2FuIGFsc28gYmUgcGxhaW4gQyBwb2ludGVycy4KKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IFZhbHVlc0luIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lcnMKKy8vIHBhc3NlZCBpbiBhbmQga2VlcHMgdGhlbSB0byBnZW5lcmF0ZSB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTKCkuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RyaW5nVGVzdAorLy8gZWFjaCB3aXRoIEMtc3RyaW5nIHZhbHVlcyBvZiAiZm9vIiwgImJhciIsIGFuZCAiYmF6IjoKKy8vCisvLyBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6In07CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJpbmdTZXF1ZW5jZSwgU3J0aW5nVGVzdCwgVmFsdWVzSW4oc3RyaW5ncykpOworLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0bFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBTVEwgc3RyaW5ncyB3aXRoIHZhbHVlcyAiYSIgYW5kICJiIjoKKy8vCisvLyA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBHZXRQYXJhbWV0ZXJTdHJpbmdzKCkgeworLy8gICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiB2OworLy8gICB2LnB1c2hfYmFjaygiYSIpOworLy8gICB2LnB1c2hfYmFjaygiYiIpOworLy8gICByZXR1cm4gdjsKKy8vIH0KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBTdGxTdHJpbmdUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0UGFyYW1ldGVyU3RyaW5ncygpKSk7CisvLworLy8KKy8vIFRoaXMgd2lsbCBhbHNvIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gQ2hhclRlc3QKKy8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICdhJyBhbmQgJ2InOgorLy8KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IEdldFBhcmFtZXRlckNoYXJzKCkgeworLy8gICA6OnN0ZDo6bGlzdDxjaGFyPiBsaXN0OworLy8gICBsaXN0LnB1c2hfYmFjaygnYScpOworLy8gICBsaXN0LnB1c2hfYmFjaygnYicpOworLy8gICByZXR1cm4gbGlzdDsKKy8vIH0KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IGwgPSBHZXRQYXJhbWV0ZXJDaGFycygpOworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlMiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4obC5iZWdpbigpLCBsLmVuZCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KK1ZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkgeworICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj4KKyAgICAgIDo6dmFsdWVfdHlwZSBQYXJhbVR5cGU7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yPFBhcmFtVHlwZT4oYmVnaW4sIGVuZCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkgeworICByZXR1cm4gVmFsdWVzSW4oYXJyYXksIGFycmF5ICsgTik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgeworICByZXR1cm4gVmFsdWVzSW4oY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Cit9CisKKy8vIFZhbHVlcygpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIGZyb20gZXhwbGljaXRseSBzcGVjaWZpZWQgbGlzdCBvZgorLy8gcGFyYW1ldGVycy4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFZhbHVlcyhUIHYxLCBUIHYyLCAuLi4sIFQgdk4pCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgdjEsIHYyLCAuLi4sIHZOLgorLy8KKy8vIEZvciBleGFtcGxlLCB0aGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXJUZXN0IGVhY2gKKy8vIHdpdGggdmFsdWVzICJvbmUiLCAidHdvIiwgYW5kICJ0aHJlZSI6CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTnVtU2VxdWVuY2UsIEJhclRlc3QsIFZhbHVlcygib25lIiwgInR3byIsICJ0aHJlZSIpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXpUZXN0IGVhY2ggd2l0aCB2YWx1ZXMgMSwgMiwgMy41LgorLy8gVGhlIGV4YWN0IHR5cGUgb2YgdmFsdWVzIHdpbGwgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBpbiBCYXpUZXN0LgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEZsb2F0aW5nTnVtYmVycywgQmF6VGVzdCwgVmFsdWVzKDEsIDIsIDMuNSkpOworLy8KKy8vIEN1cnJlbnRseSwgVmFsdWVzKCkgc3VwcG9ydHMgZnJvbSAxIHRvIDUwIHBhcmFtZXRlcnMuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxPFQxPiBWYWx1ZXMoVDEgdjEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4odjEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4gVmFsdWVzKFQxIHYxLCBUMiB2MikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4odjEsIHYyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzxUMSwgVDIsIFQzPih2MSwgdjIsIHYzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0PFQxLCBUMiwgVDMsIFQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4odjEsIHYyLCB2MywgdjQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTU8VDEsIFQyLCBUMywgVDQsIFQ1Pih2MSwgdjIsIHYzLCB2NCwgdjUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KHYxLCB2MiwgdjMsIHY0LCB2NSwKKyAgICAgIHY2LCB2Nyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KHYxLCB2MiwgdjMsCisgICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFZhbHVlcyhUMSB2MSwKKyAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPih2MSwKKyAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAorICAgIFQxMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsCisgICAgICBUMTE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICBUMTI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICBUMTM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAorICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCisgICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAorICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAorICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAorICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCisgICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCisgICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4odjEsIHYyLAorICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCisgICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVmFsdWVzKFQxIHYxLAorICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKKyAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAorICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAorICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICBUMjY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsCisgICAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICBUMjc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCisgICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgIFQyOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAorICAgICAgdjI4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCisgICAgICB2MjcsIHYyOCwgdjI5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKKyAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAorICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCisgICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitpbnRlcm5hbDo6VmFsdWVBcnJheTMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAorICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCisgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKKyAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKKyAgICBUMzIgdjMyLCBUMzMgdjMzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAorICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCisgICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKKyAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLAorICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksCisgICAgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKKyAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2Pih2MSwgdjIsIHYzLCB2NCwKKyAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+KHYxLCB2MiwgdjMsCisgICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCisgICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywKKyAgICAgIHYzNCwgdjM1LCB2MzYsIHYzNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LAorICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsCisgICAgVDM3IHYzNywgVDM4IHYzOCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4Pih2MSwgdjIsCisgICAgICB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwKKyAgICAgIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLAorICAgICAgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5Pih2MSwKKyAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsCisgICAgICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwKKyAgICAgIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBWYWx1ZXMoVDEgdjEsCisgICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLAorICAgIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksCisgICAgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywKKyAgICBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LAorICAgIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAorICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksCisgICAgICB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgVDQxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwKKyAgICAgIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LAorICAgICAgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgVDQyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0Mj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLAorICAgICAgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsCisgICAgICB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwKKyAgICAgIHY0Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICBUNDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgVDQyIHY0MiwgVDQzIHY0MykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsCisgICAgICB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwKKyAgICAgIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLAorICAgICAgdjQxLCB2NDIsIHY0Myk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAorICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsCisgICAgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwKKyAgICAgIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAorICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAorICAgIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCisgICAgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwKKyAgICBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAorICAgIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCisgICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwKKyAgICAgIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0Nj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCisgICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsCisgICAgICB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCisgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywKKyAgICAgIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0Nyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKKyAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKKyAgICBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LAorICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsCisgICAgVDQ4IHY0OCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywKKyAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLAorICAgICAgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsCisgICAgICB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAorICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAorICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsCisgICAgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwKKyAgICBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LAorICAgIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsCisgICAgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCisgICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLAorICAgICAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsCisgICAgICB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3LCB2NDgsIHY0OSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsCisgICAgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwKKyAgICBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LCBUNTAgdjUwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPih2MSwgdjIsIHYzLCB2NCwKKyAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywKKyAgICAgIHY0OCwgdjQ5LCB2NTApOworfQorCisvLyBCb29sKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGluIGEgc2V0IG9mIChmYWxzZSwgdHJ1ZSkuCisvLworLy8gU3lub3BzaXM6CisvLyBCb29sKCkKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyB7ZmFsc2UsIHRydWV9LgorLy8KKy8vIEl0IGlzIHVzZWZ1bCB3aGVuIHRlc3RpbmcgY29kZSB0aGF0IGRlcGVuZHMgb24gQm9vbGVhbiBmbGFncy4gQ29tYmluYXRpb25zCisvLyBvZiBtdWx0aXBsZSBmbGFncyBjYW4gYmUgdGVzdGVkIHdoZW4gc2V2ZXJhbCBCb29sKCkncyBhcmUgY29tYmluZWQgdXNpbmcKKy8vIENvbWJpbmUoKSBmdW5jdGlvbi4KKy8vCisvLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYWxsIHRlc3RzIGluIHRoZSB0ZXN0IGNhc2UgRmxhZ0RlcGVuZGVudFRlc3QKKy8vIHdpbGwgYmUgaW5zdGFudGlhdGVkIHR3aWNlIHdpdGggcGFyYW1ldGVycyBmYWxzZSBhbmQgdHJ1ZS4KKy8vCisvLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGJvb2w+IHsKKy8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworLy8gICAgIGV4dGVybmFsX2ZsYWcgPSBHZXRQYXJhbSgpOworLy8gICB9CisvLyB9CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChCb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LCBCb29sKCkpOworLy8KK2lubGluZSBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ym9vbD4gQm9vbCgpIHsKKyAgcmV0dXJuIFZhbHVlcyhmYWxzZSwgdHJ1ZSk7Cit9CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIENvbWJpbmUoKSBhbGxvd3MgdGhlIHVzZXIgdG8gY29tYmluZSB0d28gb3IgbW9yZSBzZXF1ZW5jZXMgdG8gcHJvZHVjZQorLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4KKy8vCisvLyBTeW5vcHNpczoKKy8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGNvbWluZyBmcm9tCisvLyAgICAgdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkKKy8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mCisvLyAgICAgdHVwbGU8VDEsIFQyLCAuLi4sIFROPiB3aGVyZSBUMSwgVDIsIC4uLiwgVE4gYXJlIHRoZSB0eXBlcworLy8gICAgIG9mIGVsZW1lbnRzIGZyb20gc2VxdWVuY2VzIHByb2R1Y2VzIGJ5IGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4KKy8vCisvLyBDb21iaW5lIGNhbiBoYXZlIHVwIHRvIDEwIGFyZ3VtZW50cy4gVGhpcyBudW1iZXIgaXMgY3VycmVudGx5IGxpbWl0ZWQKKy8vIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUgaW1wbGVtZW50YXRpb24gdXNlZCBieSBHb29nbGUKKy8vIFRlc3QuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gdGVzdCBjYXNlIEFuaW1hbFRlc3QgZWFjaCBvbmUgd2l0aAorLy8gdGhlIHBhcmFtZXRlciB2YWx1ZXMgdHVwbGUoImNhdCIsIEJMQUNLKSwgdHVwbGUoImNhdCIsIFdISVRFKSwKKy8vIHR1cGxlKCJkb2ciLCBCTEFDSyksIGFuZCB0dXBsZSgiZG9nIiwgV0hJVEUpOgorLy8KKy8vIGVudW0gQ29sb3IgeyBCTEFDSywgR1JBWSwgV0hJVEUgfTsKKy8vIGNsYXNzIEFuaW1hbFRlc3QKKy8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGNvbnN0IGNoYXIqLCBDb2xvcj4gPiB7Li4ufTsKKy8vCisvLyBURVNUX1AoQW5pbWFsVGVzdCwgQW5pbWFsTG9va3NOaWNlKSB7Li4ufQorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFuaW1hbFZhcmlhdGlvbnMsIEFuaW1hbFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKFZhbHVlcygiY2F0IiwgImRvZyIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoQkxBQ0ssIFdISVRFKSkpOworLy8KKy8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiBGbGFnRGVwZW5kZW50VGVzdCB3aXRoIGFsbCB2YXJpYXRpb25zIG9mIHR3bworLy8gQm9vbGVhbiBmbGFnczoKKy8vCisvLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdAorLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Ym9vbCwgYm9vbD4gPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICAvLyBBc3NpZ25zIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIHZhbHVlcyBmcm9tIHRoZSB0dXBsZS4KKy8vICAgICB0aWUoZXh0ZXJuYWxfZmxhZ18xLCBleHRlcm5hbF9mbGFnXzIpID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfTsKKy8vCisvLyBURVNUX1AoRmxhZ0RlcGVuZGVudFRlc3QsIFRlc3RGZWF0dXJlMSkgeworLy8gICAvLyBUZXN0IHlvdXIgY29kZSB1c2luZyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiBoZXJlLgorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVHdvQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoQm9vbCgpLCBCb29sKCkpKTsKKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMj4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMikgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIyPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjI+KAorICAgICAgZzEsIGcyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjM+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjM8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMz4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczKSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjM8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMz4oCisgICAgICBnMSwgZzIsIGczKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yND4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQ+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yND4oCisgICAgICBnMSwgZzIsIGczLCBnNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjU+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjU8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1PigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjY+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI3PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2LAorICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNykgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI3PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3PigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI4PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOD4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2LAorICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOD4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjcsIHR5cGVuYW1lIEdlbmVyYXRvcjgsIHR5cGVuYW1lIEdlbmVyYXRvcjk+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjk8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4LAorICAgIEdlbmVyYXRvcjk+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4LCBHZW5lcmF0b3I5PigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjcsIHR5cGVuYW1lIEdlbmVyYXRvcjgsIHR5cGVuYW1lIEdlbmVyYXRvcjksCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yMTA+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKKyAgICBHZW5lcmF0b3IxMD4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2LAorICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsIGNvbnN0IEdlbmVyYXRvcjkmIGc5LAorICAgICAgICBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4LCBHZW5lcmF0b3I5LAorICAgICAgR2VuZXJhdG9yMTA+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4LCBnOSwgZzEwKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKKworCisjIGRlZmluZSBURVNUX1AodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAorICBjbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgICAgIDogcHVibGljIHRlc3RfY2FzZV9uYW1lIHsgXAorICAgcHVibGljOiBcCisgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9IFwKKyAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAorICAgcHJpdmF0ZTogXAorICAgIHN0YXRpYyBpbnQgQWRkVG9SZWdpc3RyeSgpIHsgXAorICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkuIFwKKyAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwKKyAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18pLT5BZGRUZXN0UGF0dGVybihcCisgICAgICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICN0ZXN0X25hbWUsIFwKKyAgICAgICAgICAgICAgICAgIG5ldyA6OnRlc3Rpbmc6OmludGVybmFsOjpUZXN0TWV0YUZhY3Rvcnk8IFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPigpKTsgXAorICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKyAgICBzdGF0aWMgaW50IGd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XzsgXAorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXAorICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTsgXAorICB9OyBcCisgIGludCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk6Omd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyA9IFwKKyAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OkFkZFRvUmVnaXN0cnkoKTsgXAorICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKKworIyBkZWZpbmUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AocHJlZml4LCB0ZXN0X2Nhc2VfbmFtZSwgZ2VuZXJhdG9yKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKKyAgICAgIGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfKCkgeyByZXR1cm4gZ2VuZXJhdG9yOyB9IFwKKyAgaW50IGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX2R1bW15XyA9IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKFwKKyAgICAgICAgICAgICAgICAgICNwcmVmaXgsIFwKKyAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXywgXAorICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZGVmaW5pdGlvbnMgdXNlZnVsIGluIHByb2R1Y3Rpb24gY29kZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCisKKy8vIFdoZW4geW91IG5lZWQgdG8gdGVzdCB0aGUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgbWVtYmVycyBvZiBhIGNsYXNzLAorLy8gdXNlIHRoZSBGUklFTkRfVEVTVCBtYWNybyB0byBkZWNsYXJlIHlvdXIgdGVzdHMgYXMgZnJpZW5kcyBvZiB0aGUKKy8vIGNsYXNzLiAgRm9yIGV4YW1wbGU6CisvLworLy8gY2xhc3MgTXlDbGFzcyB7CisvLyAgcHJpdmF0ZToKKy8vICAgdm9pZCBNeU1ldGhvZCgpOworLy8gICBGUklFTkRfVEVTVChNeUNsYXNzVGVzdCwgTXlNZXRob2QpOworLy8gfTsKKy8vCisvLyBjbGFzcyBNeUNsYXNzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgLy8gLi4uCisvLyB9OworLy8KKy8vIFRFU1RfRihNeUNsYXNzVGVzdCwgTXlNZXRob2QpIHsKKy8vICAgLy8gQ2FuIGNhbGwgTXlDbGFzczo6TXlNZXRob2QoKSBoZXJlLgorLy8gfQorCisjZGVmaW5lIEZSSUVORF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAorZnJpZW5kIGNsYXNzIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBtaGV1bGVAZ29vZ2xlLmNvbSAoTWFya3VzIEhldWxlKQorLy8KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RFU1RfUEFSVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RFU1RfUEFSVF9IXworCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbgorLy8gYXNzZXJ0aW9uIG9yIGFuIGV4cGxpY2l0IEZBSUwoKSwgQUREX0ZBSUxVUkUoKSwgb3IgU1VDQ0VTUygpKS4KKy8vCisvLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFBhcnRSZXN1bHQgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RQYXJ0UmVzdWx0IHsKKyBwdWJsaWM6CisgIC8vIFRoZSBwb3NzaWJsZSBvdXRjb21lcyBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbiBhc3NlcnRpb24gb3IgYW4KKyAgLy8gZXhwbGljaXQgU1VDQ0VFRCgpLCBGQUlMKCksIG9yIEFERF9GQUlMVVJFKCkpLgorICBlbnVtIFR5cGUgeworICAgIGtTdWNjZXNzLCAgICAgICAgICAvLyBTdWNjZWVkZWQuCisgICAga05vbkZhdGFsRmFpbHVyZSwgIC8vIEZhaWxlZCBidXQgdGhlIHRlc3QgY2FuIGNvbnRpbnVlLgorICAgIGtGYXRhbEZhaWx1cmUgICAgICAvLyBGYWlsZWQgYW5kIHRoZSB0ZXN0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorICB9OworCisgIC8vIEMndG9yLiAgVGVzdFBhcnRSZXN1bHQgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQorICAvLyBUZXN0UGFydFJlc3VsdCBvYmplY3QuCisgIFRlc3RQYXJ0UmVzdWx0KFR5cGUgYV90eXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX2ZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgaW50IGFfbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbWVzc2FnZSkKKyAgICAgIDogdHlwZV8oYV90eXBlKSwKKyAgICAgICAgZmlsZV9uYW1lXyhhX2ZpbGVfbmFtZSA9PSBOVUxMID8gIiIgOiBhX2ZpbGVfbmFtZSksCisgICAgICAgIGxpbmVfbnVtYmVyXyhhX2xpbmVfbnVtYmVyKSwKKyAgICAgICAgc3VtbWFyeV8oRXh0cmFjdFN1bW1hcnkoYV9tZXNzYWdlKSksCisgICAgICAgIG1lc3NhZ2VfKGFfbWVzc2FnZSkgeworICB9CisKKyAgLy8gR2V0cyB0aGUgb3V0Y29tZSBvZiB0aGUgdGVzdCBwYXJ0LgorICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKKyAgLy8gTlVMTCBpZiBpdCdzIHVua25vd24uCisgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmlsZV9uYW1lXy5lbXB0eSgpID8gTlVMTCA6IGZpbGVfbmFtZV8uY19zdHIoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwKKyAgLy8gb3IgLTEgaWYgaXQncyB1bmtub3duLgorICBpbnQgbGluZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBsaW5lX251bWJlcl87IH0KKworICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCisgIGNvbnN0IGNoYXIqIHN1bW1hcnkoKSBjb25zdCB7IHJldHVybiBzdW1tYXJ5Xy5jX3N0cigpOyB9CisKKyAgLy8gR2V0cyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRlc3QgcGFydC4KKyAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgcGFzc2VkLgorICBib29sIHBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtTdWNjZXNzOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhaWxlZC4KKyAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyAhPSBrU3VjY2VzczsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBub24tZmF0YWxseSBmYWlsZWQuCisgIGJvb2wgbm9uZmF0YWxseV9mYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrTm9uRmF0YWxGYWlsdXJlOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhdGFsbHkgZmFpbGVkLgorICBib29sIGZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga0ZhdGFsRmFpbHVyZTsgfQorCisgcHJpdmF0ZToKKyAgVHlwZSB0eXBlXzsKKworICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrCisgIC8vIHRyYWNlIGluIGl0LgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXh0cmFjdFN1bW1hcnkoY29uc3QgY2hhciogbWVzc2FnZSk7CisKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKKyAgLy8gIiIgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIHVua25vd24uCisgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZV87CisgIC8vIFRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yIC0xCisgIC8vIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duLgorICBpbnQgbGluZV9udW1iZXJfOworICBzdGQ6OnN0cmluZyBzdW1tYXJ5XzsgIC8vIFRoZSB0ZXN0IGZhaWx1cmUgc3VtbWFyeS4KKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIG1lc3NhZ2UuCit9OworCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKy8vIEFuIGFycmF5IG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90CisvLyB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdEFycmF5IHsKKyBwdWJsaWM6CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkoKSB7fQorCisgIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KKyAgdm9pZCBBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgorICBpbnQgc2l6ZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IGFycmF5XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOworfTsKKworLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuCitjbGFzcyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSA9IDA7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIGJ5IHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFIHRvIGNoZWNrIGlmIGEKKy8vIHN0YXRlbWVudCBnZW5lcmF0ZXMgbmV3IGZhdGFsIGZhaWx1cmVzLiBUbyBkbyBzbyBpdCByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZQorLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUKKy8vIHJlcG9ydGVkLCBpdCBvbmx5IGRlbGVnYXRlcyB0aGUgcmVwb3J0aW5nIHRvIHRoZSBmb3JtZXIgcmVzdWx0IHJlcG9ydGVyLgorLy8gVGhlIG9yaWdpbmFsIHJlc3VsdCByZXBvcnRlciBpcyByZXN0b3JlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK2NsYXNzIEdURVNUX0FQSV8gSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgdmlydHVhbCB+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7CisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSBjb25zdCB7IHJldHVybiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOyB9CisgcHJpdmF0ZToKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOworICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvcmlnaW5hbF9yZXBvcnRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCisKKy8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgdHlwZWQgdGVzdHMgYW5kIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworLy8gVHlwZWQgKGFrYSB0eXBlLWRyaXZlbikgdGVzdHMgcmVwZWF0IHRoZSBzYW1lIHRlc3QgZm9yIHR5cGVzIGluIGEKKy8vIGxpc3QuICBZb3UgbXVzdCBrbm93IHdoaWNoIHR5cGVzIHlvdSB3YW50IHRvIHRlc3Qgd2l0aCB3aGVuIHdyaXRpbmcKKy8vIHR5cGVkIHRlc3RzLiBIZXJlJ3MgaG93IHlvdSBkbyBpdDoKKworI2lmIDAKKworLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAorLy8gYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gdGVzdGluZzo6VGVzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIC4uLgorICB0eXBlZGVmIHN0ZDo6bGlzdDxUPiBMaXN0OworICBzdGF0aWMgVCBzaGFyZWRfOworICBUIHZhbHVlXzsKK307CisKKy8vIE5leHQsIGFzc29jaWF0ZSBhIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGUgdGVzdCBjYXNlLCB3aGljaCB3aWxsIGJlCisvLyByZXBlYXRlZCBmb3IgZWFjaCB0eXBlIGluIHRoZSBsaXN0LiAgVGhlIHR5cGVkZWYgaXMgbmVjZXNzYXJ5IGZvcgorLy8gdGhlIG1hY3JvIHRvIHBhcnNlIGNvcnJlY3RseS4KK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgTXlUeXBlcyk7CisKKy8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUKKy8vIGRpcmVjdGx5IHdpdGhvdXQgVHlwZXM8Li4uPjoKKy8vICAgVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIGludCk7CisKKy8vIFRoZW4sIHVzZSBUWVBFRF9URVNUKCkgaW5zdGVhZCBvZiBURVNUX0YoKSB0byBkZWZpbmUgYXMgbWFueSB0eXBlZAorLy8gdGVzdHMgZm9yIHRoaXMgdGVzdCBjYXNlIGFzIHlvdSB3YW50LgorVFlQRURfVEVTVChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgLy8gU2luY2Ugd2UgYXJlIGluc2lkZSBhIGRlcml2ZWQgY2xhc3MgdGVtcGxhdGUsIEMrKyByZXF1aXJlcyB1c2UgdG8KKyAgLy8gdmlzaXQgdGhlIG1lbWJlcnMgb2YgRm9vVGVzdCB2aWEgJ3RoaXMnLgorICBUeXBlUGFyYW0gbiA9IHRoaXMtPnZhbHVlXzsKKworICAvLyBUbyB2aXNpdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSwgYWRkIHRoZSBUZXN0Rml4dHVyZTo6CisgIC8vIHByZWZpeC4KKyAgbiArPSBUZXN0Rml4dHVyZTo6c2hhcmVkXzsKKworICAvLyBUbyByZWZlciB0byB0eXBlZGVmcyBpbiB0aGUgZml4dHVyZSwgYWRkIHRoZSAidHlwZW5hbWUKKyAgLy8gVGVzdEZpeHR1cmU6OiIgcHJlZml4LgorICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6TGlzdCB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2sobik7CisgIC4uLgorfQorCitUWVBFRF9URVNUKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorCisjZW5kaWYgIC8vIDAKKworLy8gVHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBhYnN0cmFjdCB0ZXN0IHBhdHRlcm5zIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IGEgdHlwZS4gIENvbXBhcmVkIHdpdGggdHlwZWQgdGVzdHMsIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gYWxsb3cgeW91IHRvIGRlZmluZSB0aGUgdGVzdCBwYXR0ZXJuIHdpdGhvdXQga25vd2luZyB3aGF0IHRoZSB0eXBlCisvLyBwYXJhbWV0ZXJzIGFyZS4gIFRoZSBkZWZpbmVkIHBhdHRlcm4gY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoCisvLyBkaWZmZXJlbnQgdHlwZXMgYW55IG51bWJlciBvZiB0aW1lcywgaW4gYW55IG51bWJlciBvZiB0cmFuc2xhdGlvbgorLy8gdW5pdHMuCisvLworLy8gSWYgeW91IGFyZSBkZXNpZ25pbmcgYW4gaW50ZXJmYWNlIG9yIGNvbmNlcHQsIHlvdSBjYW4gZGVmaW5lIGEKKy8vIHN1aXRlIG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB0byB2ZXJpZnkgcHJvcGVydGllcyB0aGF0IGFueQorLy8gdmFsaWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS9jb25jZXB0IHNob3VsZCBoYXZlLiAgVGhlbiwKKy8vIGVhY2ggaW1wbGVtZW50YXRpb24gY2FuIGVhc2lseSBpbnN0YW50aWF0ZSB0aGUgdGVzdCBzdWl0ZSB0byB2ZXJpZnkKKy8vIHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHJlcXVpcmVtZW50cywgd2l0aG91dCBoYXZpbmcgdG8gd3JpdGUKKy8vIHNpbWlsYXIgdGVzdHMgcmVwZWF0ZWRseS4gIEhlcmUncyBhbiBleGFtcGxlOgorCisjaWYgMAorCisvLyBGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCisvLyBieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSB0ZXN0aW5nOjpUZXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworICAuLi4KK307CisKKy8vIE5leHQsIGRlY2xhcmUgdGhhdCB5b3Ugd2lsbCBkZWZpbmUgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlCisvLyAodGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdQorLy8gcHJlZmVyKToKK1RZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QpOworCisvLyBUaGVuLCB1c2UgVFlQRURfVEVTVF9QKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyBmb3IgdGhpcyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFzIHlvdSB3YW50LgorVFlQRURfVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUgcGFyYW1ldGVyLgorICBUeXBlUGFyYW0gbiA9IDA7CisgIC4uLgorfQorCitUWVBFRF9URVNUX1AoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9CisKKy8vIE5vdyB0aGUgdHJpY2t5IHBhcnQ6IHlvdSBuZWVkIHRvIHJlZ2lzdGVyIGFsbCB0ZXN0IHBhdHRlcm5zIGJlZm9yZQorLy8geW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBtYWNybyBpcyB0aGUKKy8vIHRlc3QgY2FzZSBuYW1lOyB0aGUgcmVzdCBhcmUgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QKKy8vIGNhc2UuCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9lc0JsYWgsIEhhc1Byb3BlcnR5QSk7CisKKy8vIEZpbmFsbHksIHlvdSBhcmUgZnJlZSB0byBpbnN0YW50aWF0ZSB0aGUgcGF0dGVybiB3aXRoIHRoZSB0eXBlcyB5b3UKKy8vIHdhbnQuICBJZiB5b3UgcHV0IHRoZSBhYm92ZSBjb2RlIGluIGEgaGVhZGVyIGZpbGUsIHlvdSBjYW4gI2luY2x1ZGUKKy8vIGl0IGluIG11bHRpcGxlIEMrKyBzb3VyY2UgZmlsZXMgYW5kIGluc3RhbnRpYXRlIGl0IG11bHRpcGxlIHRpbWVzLgorLy8KKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sIHRoZSBmaXJzdAorLy8gYXJndW1lbnQgdG8gdGhlIElOU1RBTlRJQVRFXyogbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkCisvLyB0byB0aGUgYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiAgUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yCisvLyBkaWZmZXJlbnQgaW5zdGFuY2VzLgordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBNeVR5cGVzKTsKKworLy8gSWYgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UgY2FuIHdyaXRlIHRoYXQgdHlwZQorLy8gZGlyZWN0bHkgd2l0aG91dCBUeXBlczwuLi4+OgorLy8gICBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgaW50KTsKKworI2VuZGlmICAvLyAwCisKKworLy8gSW1wbGVtZW50cyB0eXBlZCB0ZXN0cy4KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUKKy8vIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1RZUEVfUEFSQU1TXyhUZXN0Q2FzZU5hbWUpIGd0ZXN0X3R5cGVfcGFyYW1zXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0CisvLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQorLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKKyMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRShDYXNlTmFtZSwgVHlwZXMpIFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZSBcCisgICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpCisKKyMgZGVmaW5lIFRZUEVEX1RFU1QoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgICAgICA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwKKyAgIHByaXZhdGU6IFwKKyAgICB0eXBlZGVmIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IFRlc3RGaXh0dXJlOyBcCisgICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXAorICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCisgIH07IFwKKyAgYm9vbCBndGVzdF8jI0Nhc2VOYW1lIyNfIyNUZXN0TmFtZSMjX3JlZ2lzdGVyZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0PCBcCisgICAgICAgICAgQ2FzZU5hbWUsIFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZVNlbDwgXAorICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk+LCBcCisgICAgICAgICAgR1RFU1RfVFlQRV9QQVJBTVNfKENhc2VOYW1lKT46OlJlZ2lzdGVyKFwKKyAgICAgICAgICAgICAgIiIsICNDYXNlTmFtZSwgI1Rlc3ROYW1lLCAwKTsgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIEltcGxlbWVudHMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWVzcGFjZSBuYW1lIHRoYXQgdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBmb3IKKy8vIHRoZSBnaXZlbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFyZSBkZWZpbmVkIGluLiAgVGhlIGV4YWN0CisvLyBuYW1lIG9mIHRoZSBuYW1lc3BhY2UgaXMgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisjIGRlZmluZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oVGVzdENhc2VOYW1lKSBcCisgIGd0ZXN0X2Nhc2VfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgorLy8gdGhlIGRlZmluZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfdHlwZWRfdGVzdF9jYXNlX3Bfc3RhdGVfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSBESVJFQ1RMWS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgorLy8gdGhlIHJlZ2lzdGVyZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oVGVzdENhc2VOYW1lKSBcCisgIGd0ZXN0X3JlZ2lzdGVyZWRfdGVzdF9uYW1lc18jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBUaGUgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IG1hY3JvcyBhcmUKKy8vIHN0YXRpYyBhcyB0eXBpY2FsbHkgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIGEgLmggZmlsZSB0aGF0IGNhbiBiZQorLy8gI2luY2x1ZGVkIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KKyMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lKSBcCisgIHN0YXRpYyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZFRlc3RDYXNlUFN0YXRlIFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkKKworIyBkZWZpbmUgVFlQRURfVEVTVF9QKENhc2VOYW1lLCBUZXN0TmFtZSkgXAorICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgY2xhc3MgVGVzdE5hbWUgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCisgICBwcml2YXRlOiBcCisgICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAorICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKKyAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAorICB9OyBcCisgIHN0YXRpYyBib29sIGd0ZXN0XyMjVGVzdE5hbWUjI19kZWZpbmVkXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuQWRkVGVzdE5hbWUoXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI0Nhc2VOYW1lLCAjVGVzdE5hbWUpOyBcCisgIH0gXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICB2b2lkIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6OlRlc3ROYW1lPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lLCAuLi4pIFwKKyAgbmFtZXNwYWNlIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSkgeyBcCisgIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVtcGxhdGVzPF9fVkFfQVJHU19fPjo6dHlwZSBndGVzdF9BbGxUZXN0c187IFwKKyAgfSBcCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSA9IFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcyhcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjX19WQV9BUkdTX18pCisKKy8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0CisvLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQorLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgQ2FzZU5hbWUsIFR5cGVzKSBcCisgIGJvb2wgZ3Rlc3RfIyNQcmVmaXgjI18jI0Nhc2VOYW1lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxDYXNlTmFtZSwgXAorICAgICAgICAgIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6Omd0ZXN0X0FsbFRlc3RzXywgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlPjo6UmVnaXN0ZXIoXAorICAgICAgICAgICAgICAjUHJlZml4LCAjQ2FzZU5hbWUsIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oQ2FzZU5hbWUpKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KKworLy8gRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgZGlmZmVyZW50IHN0cmluZyBjbGFzc2VzIGFyZSBhdmFpbGFibGUuCisvLyBPbiBMaW51eCwgaW4gYWRkaXRpb24gdG8gOjpzdGQ6OnN0cmluZywgR29vZ2xlIGFsc28gbWFrZXMgdXNlIG9mCisvLyBjbGFzcyA6OnN0cmluZywgd2hpY2ggaGFzIHRoZSBzYW1lIGludGVyZmFjZSBhcyA6OnN0ZDo6c3RyaW5nLCBidXQKKy8vIGhhcyBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KKy8vCisvLyBUaGUgdXNlciBjYW4gZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIHRvIDEgdG8gaW5kaWNhdGUgdGhhdAorLy8gOjpzdHJpbmcgaXMgYXZhaWxhYmxlIEFORCBpcyBhIGRpc3RpbmN0IHR5cGUgdG8gOjpzdGQ6OnN0cmluZywgb3IKKy8vIGRlZmluZSBpdCB0byAwIHRvIGluZGljYXRlIG90aGVyd2lzZS4KKy8vCisvLyBJZiB0aGUgdXNlcidzIDo6c3RkOjpzdHJpbmcgYW5kIDo6c3RyaW5nIGFyZSB0aGUgc2FtZSBjbGFzcyBkdWUgdG8KKy8vIGFsaWFzaW5nLCBoZSBzaG91bGQgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIHRvIDAuCisvLworLy8gSWYgdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcsIGl0IGlzIGRlZmluZWQKKy8vIGhldXJpc3RpY2FsbHkuCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVjbGFyZXMgdGhlIGZsYWdzLgorCisvLyBUaGlzIGZsYWcgdGVtcG9yYXJ5IGVuYWJsZXMgdGhlIGRpc2FibGVkIHRlc3RzLgorR1RFU1RfREVDTEFSRV9ib29sXyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyk7CisKKy8vIFRoaXMgZmxhZyBicmluZ3MgdGhlIGRlYnVnZ2VyIG9uIGFuIGFzc2VydGlvbiBmYWlsdXJlLgorR1RFU1RfREVDTEFSRV9ib29sXyhicmVha19vbl9mYWlsdXJlKTsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgY2F0Y2hlcyBhbGwgdGVzdC10aHJvd24gZXhjZXB0aW9ucworLy8gYW5kIGxvZ3MgdGhlbSBhcyBmYWlsdXJlcy4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oY2F0Y2hfZXhjZXB0aW9ucyk7CisKKy8vIFRoaXMgZmxhZyBlbmFibGVzIHVzaW5nIGNvbG9ycyBpbiB0ZXJtaW5hbCBvdXRwdXQuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlCisvLyAieWVzIiB0byBlbmFibGUgY29sb3JzLCAibm8iIChkaXNhYmxlIGNvbG9ycyksIG9yICJhdXRvIiAodGhlIGRlZmF1bHQpCisvLyB0byBsZXQgR29vZ2xlIFRlc3QgZGVjaWRlLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGNvbG9yKTsKKworLy8gVGhpcyBmbGFnIHNldHMgdXAgdGhlIGZpbHRlciB0byBzZWxlY3QgYnkgbmFtZSB1c2luZyBhIGdsb2IgcGF0dGVybgorLy8gdGhlIHRlc3RzIHRvIHJ1bi4gSWYgdGhlIGZpbHRlciBpcyBub3QgZ2l2ZW4gYWxsIHRlc3RzIGFyZSBleGVjdXRlZC4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOworCisvLyBUaGlzIGZsYWcgY2F1c2VzIHRoZSBHb29nbGUgVGVzdCB0byBsaXN0IHRlc3RzLiBOb25lIG9mIHRoZSB0ZXN0cyBsaXN0ZWQKKy8vIGFyZSBhY3R1YWxseSBydW4gaWYgdGhlIGZsYWcgaXMgcHJvdmlkZWQuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGxpc3RfdGVzdHMpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBlbWl0cyBhIGRldGFpbGVkIFhNTCByZXBvcnQgdG8gYSBmaWxlCisvLyBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsIHRleHR1YWwgb3V0cHV0LgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKG91dHB1dCk7CisKKy8vIFRoaXMgZmxhZ3MgY29udHJvbCB3aGV0aGVyIEdvb2dsZSBUZXN0IHByaW50cyB0aGUgZWxhcHNlZCB0aW1lIGZvciBlYWNoCisvLyB0ZXN0LgorR1RFU1RfREVDTEFSRV9ib29sXyhwcmludF90aW1lKTsKKworLy8gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgcmFuZG9tIG51bWJlciBzZWVkLgorR1RFU1RfREVDTEFSRV9pbnQzMl8ocmFuZG9tX3NlZWQpOworCisvLyBUaGlzIGZsYWcgc2V0cyBob3cgbWFueSB0aW1lcyB0aGUgdGVzdHMgYXJlIHJlcGVhdGVkLiBUaGUgZGVmYXVsdCB2YWx1ZQorLy8gaXMgMS4gSWYgdGhlIHZhbHVlIGlzIC0xIHRoZSB0ZXN0cyBhcmUgcmVwZWF0aW5nIGZvcmV2ZXIuCitHVEVTVF9ERUNMQVJFX2ludDMyXyhyZXBlYXQpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBpbmNsdWRlcyBHb29nbGUgVGVzdCBpbnRlcm5hbAorLy8gc3RhY2sgZnJhbWVzIGluIGZhaWx1cmUgc3RhY2sgdHJhY2VzLgorR1RFU1RfREVDTEFSRV9ib29sXyhzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcyk7CisKKy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGVzdHMnIG9yZGVyIGlzIHJhbmRvbWl6ZWQgb24gZXZlcnkgaXRlcmF0aW9uLgorR1RFU1RfREVDTEFSRV9ib29sXyhzaHVmZmxlKTsKKworLy8gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlCisvLyBwcmludGVkIGluIGEgZmFpbHVyZSBtZXNzYWdlLgorR1RFU1RfREVDTEFSRV9pbnQzMl8oc3RhY2tfdHJhY2VfZGVwdGgpOworCisvLyBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGEgZmFpbGVkIGFzc2VydGlvbiB3aWxsIHRocm93IGFuCisvLyBleGNlcHRpb24gaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgb3IgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIGEKKy8vIG5vbi16ZXJvIGNvZGUgb3RoZXJ3aXNlLgorR1RFU1RfREVDTEFSRV9ib29sXyh0aHJvd19vbl9mYWlsdXJlKTsKKworLy8gV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHdpdGggYSAiaG9zdDpwb3J0IiBzdHJpbmcsIG9uIHN1cHBvcnRlZAorLy8gcGxhdGZvcm1zIHRlc3QgcmVzdWx0cyBhcmUgc3RyZWFtZWQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IG9uCisvLyB0aGUgc3BlY2lmaWVkIGhvc3QgbWFjaGluZS4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhzdHJlYW1fcmVzdWx0X3RvKTsKKworLy8gVGhlIHVwcGVyIGxpbWl0IGZvciB2YWxpZCBzdGFjayB0cmFjZSBkZXB0aHMuCitjb25zdCBpbnQga01heFN0YWNrVHJhY2VEZXB0aCA9IDEwMDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgQXNzZXJ0SGVscGVyOworY2xhc3MgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7CitjbGFzcyBFeGVjRGVhdGhUZXN0OworY2xhc3MgTm9FeGVjRGVhdGhUZXN0OworY2xhc3MgRmluYWxTdWNjZXNzQ2hlY2tlcjsKK2NsYXNzIEdUZXN0RmxhZ1NhdmVyOworY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXJUZXN0OworY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yOworY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7CitjbGFzcyBUZXN0RXZlbnRSZXBlYXRlcjsKK2NsYXNzIFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyOworY2xhc3MgV2luZG93c0RlYXRoVGVzdDsKK2NsYXNzIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCk7Cit2b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBmcmllbmQgcmVsYXRpb25zaGlwIG9mIHNvbWUgb2YgdGhlc2UgY2xhc3NlcyBpcyBjeWNsaWMuCisvLyBJZiB3ZSBkb24ndCBmb3J3YXJkIGRlY2xhcmUgdGhlbSB0aGUgY29tcGlsZXIgbWlnaHQgY29uZnVzZSB0aGUgY2xhc3NlcworLy8gaW4gZnJpZW5kc2hpcCBjbGF1c2VzIHdpdGggc2FtZSBuYW1lZCBjbGFzc2VzIG9uIHRoZSBzY29wZS4KK2NsYXNzIFRlc3Q7CitjbGFzcyBUZXN0Q2FzZTsKK2NsYXNzIFRlc3RJbmZvOworY2xhc3MgVW5pdFRlc3Q7CisKKy8vIEEgY2xhc3MgZm9yIGluZGljYXRpbmcgd2hldGhlciBhbiBhc3NlcnRpb24gd2FzIHN1Y2Nlc3NmdWwuICBXaGVuCisvLyB0aGUgYXNzZXJ0aW9uIHdhc24ndCBzdWNjZXNzZnVsLCB0aGUgQXNzZXJ0aW9uUmVzdWx0IG9iamVjdAorLy8gcmVtZW1iZXJzIGEgbm9uLWVtcHR5IG1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgaG93IGl0IGZhaWxlZC4KKy8vCisvLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdXNlIG9uZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbnMKKy8vIChBc3NlcnRpb25TdWNjZXNzKCkgYW5kIEFzc2VydGlvbkZhaWx1cmUoKSkuCisvLworLy8gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIHR3byBwdXJwb3NlczoKKy8vICAgMS4gRGVmaW5pbmcgcHJlZGljYXRlIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHdpdGggQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMKKy8vICAgICAgRVhQRUNUX1RSVUUvRVhQRUNUX0ZBTFNFIGFuZCB0aGVpciBBU1NFUlRfIGNvdW50ZXJwYXJ0cworLy8gICAyLiBEZWZpbmluZyBwcmVkaWNhdGUtZm9ybWF0IGZ1bmN0aW9ucyB0byBiZQorLy8gICAgICB1c2VkIHdpdGggcHJlZGljYXRlIGFzc2VydGlvbnMgKEFTU0VSVF9QUkVEX0ZPUk1BVCosIGV0YykuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUgSXNFdmVuIHByZWRpY2F0ZToKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKy8vICAgICBlbHNlCisvLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworLy8gICB9CisvLworLy8gVGhlbiB0aGUgZmFpbGVkIGV4cGVjdGF0aW9uIEVYUEVDVF9UUlVFKElzRXZlbihGaWIoNSkpKQorLy8gd2lsbCBwcmludCB0aGUgbWVzc2FnZQorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCisvLyAgICAgQWN0dWFsOiBmYWxzZSAoNSBpcyBvZGQpCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW5zdGVhZCBvZiBhIG1vcmUgb3BhcXVlCisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkKKy8vICAgICBBY3R1YWw6IGZhbHNlCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW4gY2FzZSBJc0V2ZW4gaXMgYSBzaW1wbGUgQm9vbGVhbiBwcmVkaWNhdGUuCisvLworLy8gSWYgeW91IGV4cGVjdCB5b3VyIHByZWRpY2F0ZSB0byBiZSByZXVzZWQgYW5kIHdhbnQgdG8gc3VwcG9ydCBpbmZvcm1hdGl2ZQorLy8gbWVzc2FnZXMgaW4gRVhQRUNUX0ZBTFNFIGFuZCBBU1NFUlRfRkFMU0UgKG5lZ2F0aXZlIGFzc2VydGlvbnMgc2hvdyB1cAorLy8gYWJvdXQgaGFsZiBhcyBvZnRlbiBhcyBwb3NpdGl2ZSBvbmVzIGluIG91ciB0ZXN0cyksIHN1cHBseSBtZXNzYWdlcyBmb3IKKy8vIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBjYXNlczoKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKSA8PCBuIDw8ICIgaXMgZXZlbiI7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKKy8vICAgfQorLy8KKy8vIFRoZW4gYSBzdGF0ZW1lbnQgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKSB3aWxsIHByaW50CisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig2KSkKKy8vICAgICBBY3R1YWw6IHRydWUgKDggaXMgZXZlbikKKy8vICAgRXhwZWN0ZWQ6IGZhbHNlCisvLworLy8gTkI6IFByZWRpY2F0ZXMgdGhhdCBzdXBwb3J0IG5lZ2F0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucyBoYXZlIHJlZHVjZWQKKy8vIHBlcmZvcm1hbmNlIGluIHBvc2l0aXZlIG9uZXMgc28gYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRoZW0gaW4gdGVzdHMKKy8vIHRoYXQgaGF2ZSBsb3RzICh0ZW5zIG9mIHRob3VzYW5kcykgb2YgcG9zaXRpdmUgQm9vbGVhbiBhc3NlcnRpb25zLgorLy8KKy8vIFRvIHVzZSB0aGlzIGNsYXNzIHdpdGggRVhQRUNUX1BSRURfRk9STUFUIGFzc2VydGlvbnMgc3VjaCBhczoKKy8vCisvLyAgIC8vIFZlcmlmaWVzIHRoYXQgRm9vKCkgcmV0dXJucyBhbiBldmVuIG51bWJlci4KKy8vICAgRVhQRUNUX1BSRURfRk9STUFUMShJc0V2ZW4sIEZvbygpKTsKKy8vCisvLyB5b3UgbmVlZCB0byBkZWZpbmU6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGNvbnN0IGNoYXIqIGV4cHIsIGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorLy8gICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiIGlzIGV2ZW5cbiAgQWN0dWFsOiBpdCdzICIgPDwgbjsKKy8vICAgfQorLy8KKy8vIElmIEZvbygpIHJldHVybnMgNSwgeW91IHdpbGwgc2VlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKKy8vCisvLyAgIEV4cGVjdGVkOiBGb28oKSBpcyBldmVuCisvLyAgICAgQWN0dWFsOiBpdCdzIDUKKy8vCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCB7CisgcHVibGljOgorICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICAvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorICBBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcik7CisgIC8vIFVzZWQgaW4gdGhlIEVYUEVDVF9UUlVFL0ZBTFNFKGJvb2xfZXhwcmVzc2lvbikuCisgIGV4cGxpY2l0IEFzc2VydGlvblJlc3VsdChib29sIHN1Y2Nlc3MpIDogc3VjY2Vzc18oc3VjY2Vzcykge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gc3VjY2VlZGVkLgorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc187IH0gIC8vIE5PTElOVAorCisgIC8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yISgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHRleHQgc3RyZWFtZWQgaW50byB0aGlzIEFzc2VydGlvblJlc3VsdC4gVGVzdCBhc3NlcnRpb25zCisgIC8vIHVzZSBpdCB3aGVuIHRoZXkgZmFpbCAoaS5lLiwgdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUgZG9lc24ndCBtYXRjaCB0aGUKKyAgLy8gYXNzZXJ0aW9uJ3MgZXhwZWN0YXRpb24pLiBXaGVuIG5vdGhpbmcgaGFzIGJlZW4gc3RyZWFtZWQgaW50byB0aGUKKyAgLy8gb2JqZWN0LCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCA/ICBtZXNzYWdlXy0+Y19zdHIoKSA6ICIiOworICB9CisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlbW92ZSB0aGlzIGFmdGVyIG1ha2luZyBzdXJlIG5vIGNsaWVudHMgdXNlIGl0LgorICAvLyBEZXByZWNhdGVkOyBwbGVhc2UgdXNlIG1lc3NhZ2UoKSBpbnN0ZWFkLgorICBjb25zdCBjaGFyKiBmYWlsdXJlX21lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlKCk7IH0KKworICAvLyBTdHJlYW1zIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSBpbnRvIHRoaXMgb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KGNvbnN0IFQmIHZhbHVlKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFsbG93cyBzdHJlYW1pbmcgYmFzaWMgb3V0cHV0IG1hbmlwdWxhdG9ycyBzdWNoIGFzIGVuZGwgb3IgZmx1c2ggaW50bworICAvLyB0aGlzIG9iamVjdC4KKyAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KAorICAgICAgOjpzdGQ6Om9zdHJlYW0mICgqYmFzaWNfbWFuaXB1bGF0b3IpKDo6c3RkOjpvc3RyZWFtJiBzdHJlYW0pKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgYmFzaWNfbWFuaXB1bGF0b3IpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQXBwZW5kcyB0aGUgY29udGVudHMgb2YgbWVzc2FnZSB0byBtZXNzYWdlXy4KKyAgdm9pZCBBcHBlbmRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIGFfbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlXy5nZXQoKSA9PSBOVUxMKQorICAgICAgbWVzc2FnZV8ucmVzZXQobmV3IDo6c3RkOjpzdHJpbmcpOworICAgIG1lc3NhZ2VfLT5hcHBlbmQoYV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOworICB9CisKKyAgLy8gU3RvcmVzIHJlc3VsdCBvZiB0aGUgYXNzZXJ0aW9uIHByZWRpY2F0ZS4KKyAgYm9vbCBzdWNjZXNzXzsKKyAgLy8gU3RvcmVzIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiBpbiBjYXNlIHRoZSBleHBlY3RhdGlvbgorICAvLyBjb25zdHJ1Y3QgaXMgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lLgorICAvLyBSZWZlcmVuY2VkIHZpYSBhIHBvaW50ZXIgdG8gYXZvaWQgdGFraW5nIHRvbyBtdWNoIHN0YWNrIGZyYW1lIHNwYWNlCisgIC8vIHdpdGggdGVzdCBhc3NlcnRpb25zLgorICBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjpzdGQ6OnN0cmluZz4gbWVzc2FnZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBc3NlcnRpb25SZXN1bHQpOworfTsKKworLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgorLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2cuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1zZyk7CisKKy8vIFRoZSBhYnN0cmFjdCBjbGFzcyB0aGF0IGFsbCB0ZXN0cyBpbmhlcml0IGZyb20uCisvLworLy8gSW4gR29vZ2xlIFRlc3QsIGEgdW5pdCB0ZXN0IHByb2dyYW0gY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdENhc2VzLCBhbmQKKy8vIGVhY2ggVGVzdENhc2UgY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdHMuCisvLworLy8gV2hlbiB5b3UgZGVmaW5lIGEgdGVzdCB1c2luZyB0aGUgVEVTVCBtYWNybywgeW91IGRvbid0IG5lZWQgdG8KKy8vIGV4cGxpY2l0bHkgZGVyaXZlIGZyb20gVGVzdCAtIHRoZSBURVNUIG1hY3JvIGF1dG9tYXRpY2FsbHkgZG9lcworLy8gdGhpcyBmb3IgeW91LgorLy8KKy8vIFRoZSBvbmx5IHRpbWUgeW91IGRlcml2ZSBmcm9tIFRlc3QgaXMgd2hlbiBkZWZpbmluZyBhIHRlc3QgZml4dHVyZQorLy8gdG8gYmUgdXNlZCBhIFRFU1RfRi4gIEZvciBleGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgIHByb3RlY3RlZDoKKy8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IC4uLiB9CisvLyAgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyAuLi4gfQorLy8gICAgIC4uLgorLy8gICB9OworLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEJhcikgeyAuLi4gfQorLy8gICBURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisvLworLy8gVGVzdCBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3QgeworIHB1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworCisgIC8vIERlZmluZXMgdHlwZXMgZm9yIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IHNldCB1cCBhbmQgdGVhciBkb3duCisgIC8vIGEgdGVzdCBjYXNlLgorICB0eXBlZGVmIGludGVybmFsOjpTZXRVcFRlc3RDYXNlRnVuYyBTZXRVcFRlc3RDYXNlRnVuYzsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgVGVhckRvd25UZXN0Q2FzZUZ1bmM7CisKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgaW50ZW5kIHRvIGluaGVyaXQgZnJvbSBUZXN0LgorICB2aXJ0dWFsIH5UZXN0KCk7CisKKyAgLy8gU2V0cyB1cCB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6U2V0VXBUZXN0Q2FzZSgpIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdAorICAvLyB0ZXN0IGluIHRlc3QgY2FzZSBGb28uICBIZW5jZSBhIHN1Yi1jbGFzcyBjYW4gZGVmaW5lIGl0cyBvd24KKyAgLy8gU2V0VXBUZXN0Q2FzZSgpIG1ldGhvZCB0byBzaGFkb3cgdGhlIG9uZSBkZWZpbmVkIGluIHRoZSBzdXBlcgorICAvLyBjbGFzcy4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHt9CisKKyAgLy8gVGVhcnMgZG93biB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6VGVhckRvd25UZXN0Q2FzZSgpIGFmdGVyIHJ1bm5pbmcgdGhlIGxhc3QKKyAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCisgIC8vIFRlYXJEb3duVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKKyAgLy8gY2xhc3MuCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorICBzdGF0aWMgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCisgIHN0YXRpYyBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSAoZWl0aGVyIGZhdGFsIG9yCisgIC8vIG5vbi1mYXRhbCkgZmFpbHVyZS4KKyAgc3RhdGljIGJvb2wgSGFzRmFpbHVyZSgpIHsgcmV0dXJuIEhhc0ZhdGFsRmFpbHVyZSgpIHx8IEhhc05vbmZhdGFsRmFpbHVyZSgpOyB9CisKKyAgLy8gTG9ncyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudCB0ZXN0LCB0ZXN0IGNhc2UsIG9yIGZvciB0aGUgZW50aXJlCisgIC8vIGludm9jYXRpb24gb2YgdGhlIHRlc3QgcHJvZ3JhbSB3aGVuIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiBhCisgIC8vIHRlc3QgY2FzZS4gIE9ubHkgdGhlIGxhc3QgdmFsdWUgZm9yIGEgZ2l2ZW4ga2V5IGlzIHJlbWVtYmVyZWQuICBUaGVzZQorICAvLyBhcmUgcHVibGljIHN0YXRpYyBzbyB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZQorICAvLyBub3QgbWVtYmVycyBvZiB0aGUgdGVzdCBmaXh0dXJlLiAgQ2FsbHMgdG8gUmVjb3JkUHJvcGVydHkgbWFkZSBkdXJpbmcKKyAgLy8gbGlmZXNwYW4gb2YgdGhlIHRlc3QgKGZyb20gdGhlIG1vbWVudCBpdHMgY29uc3RydWN0b3Igc3RhcnRzIHRvIHRoZQorICAvLyBtb21lbnQgaXRzIGRlc3RydWN0b3IgZmluaXNoZXMpIHdpbGwgYmUgb3V0cHV0IGluIFhNTCBhcyBhdHRyaWJ1dGVzIG9mCisgIC8vIHRoZSA8dGVzdGNhc2U+IGVsZW1lbnQuICBQcm9wZXJ0aWVzIHJlY29yZGVkIGZyb20gZml4dHVyZSdzCisgIC8vIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSBhcmUgbG9nZ2VkIGFzIGF0dHJpYnV0ZXMgb2YgdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgPHRlc3RzdWl0ZT4gZWxlbWVudC4gIENhbGxzIHRvIFJlY29yZFByb3BlcnR5IG1hZGUgaW4gdGhlCisgIC8vIGdsb2JhbCBjb250ZXh0IChiZWZvcmUgb3IgYWZ0ZXIgaW52b2NhdGlvbiBvZiBSVU5fQUxMX1RFU1RTIGFuZCBmcm9tCisgIC8vIFNldFVwL1RlYXJEb3duIG1ldGhvZCBvZiBFbnZpcm9ubWVudCBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCBHb29nbGUKKyAgLy8gVGVzdCkgd2lsbCBiZSBvdXRwdXQgYXMgYXR0cmlidXRlcyBvZiB0aGUgPHRlc3RzdWl0ZXM+IGVsZW1lbnQuCisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCB2YWx1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIENyZWF0ZXMgYSBUZXN0IG9iamVjdC4KKyAgVGVzdCgpOworCisgIC8vIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisKKyAgLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlIHNhbWUgZml4dHVyZSBjbGFzcyBhcworICAvLyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCisgIHN0YXRpYyBib29sIEhhc1NhbWVGaXh0dXJlQ2xhc3MoKTsKKworICAvLyBSdW5zIHRoZSB0ZXN0IGFmdGVyIHRoZSB0ZXN0IGZpeHR1cmUgaGFzIGJlZW4gc2V0IHVwLgorICAvLworICAvLyBBIHN1Yi1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGUgdGVzdCBsb2dpYy4KKyAgLy8KKyAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgRlVOQ1RJT04gRElSRUNUTFkgSU4gQSBVU0VSIFBST0dSQU0uCisgIC8vIEluc3RlYWQsIHVzZSB0aGUgVEVTVCBvciBURVNUX0YgbWFjcm8uCisgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpID0gMDsKKworICAvLyBTZXRzIHVwLCBleGVjdXRlcywgYW5kIHRlYXJzIGRvd24gdGhlIHRlc3QuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gRGVsZXRlcyBzZWxmLiAgV2UgZGVsaWJlcmF0ZWx5IHBpY2sgYW4gdW51c3VhbCBuYW1lIGZvciB0aGlzCisgIC8vIGludGVybmFsIG1ldGhvZCB0byBhdm9pZCBjbGFzaGluZyB3aXRoIG5hbWVzIHVzZWQgaW4gdXNlciBURVNUcy4KKyAgdm9pZCBEZWxldGVTZWxmXygpIHsgZGVsZXRlIHRoaXM7IH0KKworICAvLyBVc2VzIGEgR1Rlc3RGbGFnU2F2ZXIgdG8gc2F2ZSBhbmQgcmVzdG9yZSBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCisgIGNvbnN0IGludGVybmFsOjpHVGVzdEZsYWdTYXZlciogY29uc3QgZ3Rlc3RfZmxhZ19zYXZlcl87CisKKyAgLy8gT2Z0ZW4gYSB1c2VyIG1pcy1zcGVsbHMgU2V0VXAoKSBhcyBTZXR1cCgpIGFuZCBzcGVuZHMgYSBsb25nIHRpbWUKKyAgLy8gd29uZGVyaW5nIHdoeSBpdCBpcyBuZXZlciBjYWxsZWQgYnkgR29vZ2xlIFRlc3QuICBUaGUgZGVjbGFyYXRpb24gb2YKKyAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgc29sZWx5IGZvciBjYXRjaGluZyBzdWNoIGFuIGVycm9yIGF0CisgIC8vIGNvbXBpbGUgdGltZToKKyAgLy8KKyAgLy8gICAtIFRoZSByZXR1cm4gdHlwZSBpcyBkZWxpYmVyYXRlbHkgY2hvc2VuIHRvIGJlIG5vdCB2b2lkLCBzbyBpdAorICAvLyAgIHdpbGwgYmUgYSBjb25mbGljdCBpZiBhIHVzZXIgZGVjbGFyZXMgdm9pZCBTZXR1cCgpIGluIGhpcyB0ZXN0CisgIC8vICAgZml4dHVyZS4KKyAgLy8KKyAgLy8gICAtIFRoaXMgbWV0aG9kIGlzIHByaXZhdGUsIHNvIGl0IHdpbGwgYmUgYW5vdGhlciBjb21waWxlciBlcnJvcgorICAvLyAgIGlmIGEgdXNlciBjYWxscyBpdCBmcm9tIGhpcyB0ZXN0IGZpeHR1cmUuCisgIC8vCisgIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OLgorICAvLworICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcgorICAvLyBhYm91dCBpdCBiZWluZyBwcml2YXRlLCB5b3UgaGF2ZSBtaXMtc3BlbGxlZCBTZXRVcCgpIGFzIFNldHVwKCkuCisgIHN0cnVjdCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCB7fTsKKyAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0cy4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0KTsKK307CisKK3R5cGVkZWYgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBUaW1lSW5NaWxsaXM7CisKKy8vIEEgY29weWFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHVzZXIgc3BlY2lmaWVkIHRlc3QgcHJvcGVydHkgd2hpY2ggY2FuIGJlCisvLyBvdXRwdXQgYXMgYSBrZXkvdmFsdWUgc3RyaW5nIHBhaXIuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQcm9wZXJ0eSBhcyBpdHMgZGVzdHJ1Y3RvciBpcyBub3QgdmlydHVhbC4KK2NsYXNzIFRlc3RQcm9wZXJ0eSB7CisgcHVibGljOgorICAvLyBDJ3Rvci4gIFRlc3RQcm9wZXJ0eSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgLy8gQWx3YXlzIHVzZSB0aGlzIGNvbnN0cnVjdG9yICh3aXRoIHBhcmFtZXRlcnMpIHRvIGNyZWF0ZSBhCisgIC8vIFRlc3RQcm9wZXJ0eSBvYmplY3QuCisgIFRlc3RQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgYV9rZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3ZhbHVlKSA6CisgICAga2V5XyhhX2tleSksIHZhbHVlXyhhX3ZhbHVlKSB7CisgIH0KKworICAvLyBHZXRzIHRoZSB1c2VyIHN1cHBsaWVkIGtleS4KKyAgY29uc3QgY2hhcioga2V5KCkgY29uc3QgeworICAgIHJldHVybiBrZXlfLmNfc3RyKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSB1c2VyIHN1cHBsaWVkIHZhbHVlLgorICBjb25zdCBjaGFyKiB2YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfLmNfc3RyKCk7CisgIH0KKworICAvLyBTZXRzIGEgbmV3IHZhbHVlLCBvdmVycmlkaW5nIHRoZSBvbmUgc3VwcGxpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICB2b2lkIFNldFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfdmFsdWUpIHsKKyAgICB2YWx1ZV8gPSBuZXdfdmFsdWU7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRoZSBrZXkgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisgIHN0ZDo6c3RyaW5nIGtleV87CisgIC8vIFRoZSB2YWx1ZSBzdXBwbGllZCBieSB0aGUgdXNlci4KKyAgc3RkOjpzdHJpbmcgdmFsdWVfOworfTsKKworLy8gVGhlIHJlc3VsdCBvZiBhIHNpbmdsZSBUZXN0LiAgVGhpcyBpbmNsdWRlcyBhIGxpc3Qgb2YKKy8vIFRlc3RQYXJ0UmVzdWx0cywgYSBsaXN0IG9mIFRlc3RQcm9wZXJ0aWVzLCBhIGNvdW50IG9mIGhvdyBtYW55CisvLyBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUgaW4gdGhlIFRlc3QsIGFuZCBob3cgbXVjaCB0aW1lIGl0IHRvb2sgdG8gcnVuCisvLyB0aGUgVGVzdC4KKy8vCisvLyBUZXN0UmVzdWx0IGlzIG5vdCBjb3B5YWJsZS4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdFJlc3VsdCB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCisgIFRlc3RSZXN1bHQoKTsKKworICAvLyBEJ3Rvci4gIERvIG5vdCBpbmhlcml0IGZyb20gVGVzdFJlc3VsdC4KKyAgflRlc3RSZXN1bHQoKTsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorICAvLyBvZiBzdWNjZXNzZnVsIHRlc3QgcGFydHMgYW5kIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgcGFydHMuCisgIGludCB0b3RhbF9wYXJ0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0ZXN0IHByb3BlcnRpZXMuCisgIGludCB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXNzZWQgKGkuZS4gbm8gdGVzdCBwYXJ0IGZhaWxlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYWlsZWQuCisgIGJvb2wgRmFpbGVkKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuIHJhbmdlCisgIC8vIGZyb20gMCB0byB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMKKyAgLy8gdGhlIHByb2dyYW0uCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzIHRoZQorICAvLyBwcm9ncmFtLgorICBjb25zdCBUZXN0UHJvcGVydHkmIEdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdEluZm87CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIFVuaXRUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkV4ZWNEZWF0aFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdFJlc3VsdEFjY2Vzc29yOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpXaW5kb3dzRGVhdGhUZXN0OworCisgIC8vIEdldHMgdGhlIHZlY3RvciBvZiBUZXN0UGFydFJlc3VsdHMuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiYgdGVzdF9wYXJ0X3Jlc3VsdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXzsKKyAgfQorCisgIC8vIEdldHMgdGhlIHZlY3RvciBvZiBUZXN0UHJvcGVydGllcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiYgdGVzdF9wcm9wZXJ0aWVzKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfOworICB9CisKKyAgLy8gU2V0cyB0aGUgZWxhcHNlZCB0aW1lLgorICB2b2lkIHNldF9lbGFwc2VkX3RpbWUoVGltZUluTWlsbGlzIGVsYXBzZWQpIHsgZWxhcHNlZF90aW1lXyA9IGVsYXBzZWQ7IH0KKworICAvLyBBZGRzIGEgdGVzdCBwcm9wZXJ0eSB0byB0aGUgbGlzdC4gVGhlIHByb3BlcnR5IGlzIHZhbGlkYXRlZCBhbmQgbWF5IGFkZAorICAvLyBhIG5vbi1mYXRhbCBmYWlsdXJlIGlmIGludmFsaWQgKGUuZy4sIGlmIGl0IGNvbmZsaWN0cyB3aXRoIHJlc2VydmVkCisgIC8vIGtleSBuYW1lcykuIElmIGEgcHJvcGVydHkgaXMgYWxyZWFkeSByZWNvcmRlZCBmb3IgdGhlIHNhbWUga2V5LCB0aGUKKyAgLy8gdmFsdWUgd2lsbCBiZSB1cGRhdGVkLCByYXRoZXIgdGhhbiBzdG9yaW5nIG11bHRpcGxlIHZhbHVlcyBmb3IgdGhlIHNhbWUKKyAgLy8ga2V5LiAgeG1sX2VsZW1lbnQgc3BlY2lmaWVzIHRoZSBlbGVtZW50IGZvciB3aGljaCB0aGUgcHJvcGVydHkgaXMgYmVpbmcKKyAgLy8gcmVjb3JkZWQgYW5kIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24uCisgIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7CisKKyAgLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiBHb29nbGUgVGVzdAorICAvLyB0ZXN0Y2FzZSB0YWdzLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4KKyAgLy8gVE9ETyhydXNzcik6IFZhbGlkYXRlIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbGVnYWwgYW5kIGh1bWFuIHJlYWRhYmxlLgorICBzdGF0aWMgYm9vbCBWYWxpZGF0ZVRlc3RQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7CisKKyAgLy8gQWRkcyBhIHRlc3QgcGFydCByZXN1bHQgdG8gdGhlIGxpc3QuCisgIHZvaWQgQWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpOworCisgIC8vIFJldHVybnMgdGhlIGRlYXRoIHRlc3QgY291bnQuCisgIGludCBkZWF0aF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gZGVhdGhfdGVzdF9jb3VudF87IH0KKworICAvLyBJbmNyZW1lbnRzIHRoZSBkZWF0aCB0ZXN0IGNvdW50LCByZXR1cm5pbmcgdGhlIG5ldyBjb3VudC4KKyAgaW50IGluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCkgeyByZXR1cm4gKytkZWF0aF90ZXN0X2NvdW50XzsgfQorCisgIC8vIENsZWFycyB0aGUgdGVzdCBwYXJ0IHJlc3VsdHMuCisgIHZvaWQgQ2xlYXJUZXN0UGFydFJlc3VsdHMoKTsKKworICAvLyBDbGVhcnMgdGhlIG9iamVjdC4KKyAgdm9pZCBDbGVhcigpOworCisgIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgb2YgdGhlIHByb3BlcnR5IHZlY3RvciBhbmQgb2Ygb3duZWQKKyAgLy8gcHJvcGVydGllcywgd2hvc2UgdmFsdWVzIG1heSBiZSB1cGRhdGVkLgorICBpbnRlcm5hbDo6TXV0ZXggdGVzdF9wcm9wZXJpdGVzX211dGV4XzsKKworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RQYXJ0UmVzdWx0cworICBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4gdGVzdF9wYXJ0X3Jlc3VsdHNfOworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RQcm9wZXJ0aWVzCisgIHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4gdGVzdF9wcm9wZXJ0aWVzXzsKKyAgLy8gUnVubmluZyBjb3VudCBvZiBkZWF0aCB0ZXN0cy4KKyAgaW50IGRlYXRoX3Rlc3RfY291bnRfOworICAvLyBUaGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdFJlc3VsdC4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0UmVzdWx0KTsKK307ICAvLyBjbGFzcyBUZXN0UmVzdWx0CisKKy8vIEEgVGVzdEluZm8gb2JqZWN0IHN0b3JlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgdGVzdDoKKy8vCisvLyAgIFRlc3QgY2FzZSBuYW1lCisvLyAgIFRlc3QgbmFtZQorLy8gICBXaGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4KKy8vICAgQSBmdW5jdGlvbiBwb2ludGVyIHRoYXQgY3JlYXRlcyB0aGUgdGVzdCBvYmplY3Qgd2hlbiBpbnZva2VkCisvLyAgIFRlc3QgcmVzdWx0CisvLworLy8gVGhlIGNvbnN0cnVjdG9yIG9mIFRlc3RJbmZvIHJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUgVW5pdFRlc3QKKy8vIHNpbmdsZXRvbiBzdWNoIHRoYXQgdGhlIFJVTl9BTExfVEVTVFMoKSBtYWNybyBrbm93cyB3aGljaCB0ZXN0cyB0bworLy8gcnVuLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0SW5mbyB7CisgcHVibGljOgorICAvLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB2aXJ0dWFsLCBzbworICAvLyBkb24ndCBpbmhlcml0IGZyb20gVGVzdEluZm8uCisgIH5UZXN0SW5mbygpOworCisgIC8vIFJldHVybnMgdGhlIHRlc3QgY2FzZSBuYW1lLgorICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfY2FzZV9uYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBuYW1lLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQKKyAgLy8gb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgY2hhciogdHlwZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIHBhcmFtZXRlciwgb3IgTlVMTCBpZiB0aGlzCisgIC8vIGlzIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0oKSBjb25zdCB7CisgICAgaWYgKHZhbHVlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQorICAgICAgcmV0dXJuIHZhbHVlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1biwgdGhhdCBpcyBpZiB0aGUgdGVzdCBpcyBub3QKKyAgLy8gZGlzYWJsZWQgKG9yIGl0IGlzIGRpc2FibGVkIGJ1dCB0aGUgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZyBoYXMKKyAgLy8gYmVlbiBzcGVjaWZpZWQpIGFuZCBpdHMgZnVsbCBuYW1lIG1hdGNoZXMgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlci4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3QgYWxsb3dzIHRoZSB1c2VyIHRvIGZpbHRlciB0aGUgdGVzdHMgYnkgdGhlaXIgZnVsbCBuYW1lcy4KKyAgLy8gVGhlIGZ1bGwgbmFtZSBvZiBhIHRlc3QgQmFyIGluIHRlc3QgY2FzZSBGb28gaXMgZGVmaW5lZCBhcworICAvLyAiRm9vLkJhciIuICBPbmx5IHRoZSB0ZXN0cyB0aGF0IG1hdGNoIHRoZSBmaWx0ZXIgd2lsbCBydW4uCisgIC8vCisgIC8vIEEgZmlsdGVyIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYiAobm90IHJlZ2V4KSBwYXR0ZXJucywKKyAgLy8gb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICctJyBhbmQgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZgorICAvLyBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gZXhjbHVkZSkuICBBIHRlc3QgaXMgcnVuIGlmIGl0CisgIC8vIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mCisgIC8vIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsICpBKjpGb28uKiBpcyBhIGZpbHRlciB0aGF0IG1hdGNoZXMgYW55IHN0cmluZyB0aGF0CisgIC8vIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXIgJ0EnIG9yIHN0YXJ0cyB3aXRoICJGb28uIi4KKyAgYm9vbCBzaG91bGRfcnVuKCkgY29uc3QgeyByZXR1cm4gc2hvdWxkX3J1bl87IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgdGVzdCB3aWxsIGFwcGVhciBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgYm9vbCBpc19yZXBvcnRhYmxlKCkgY29uc3QgeworICAgIC8vIEZvciBub3csIHRoZSBYTUwgcmVwb3J0IGluY2x1ZGVzIGFsbCB0ZXN0cyBtYXRjaGluZyB0aGUgZmlsdGVyLgorICAgIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSB0cmltIHRlc3RzIHRoYXQgYXJlIGV4Y2x1ZGVkIGJlY2F1c2Ugb2YKKyAgICAvLyBzaGFyZGluZy4KKyAgICByZXR1cm4gbWF0Y2hlc19maWx0ZXJfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0LgorICBjb25zdCBUZXN0UmVzdWx0KiByZXN1bHQoKSBjb25zdCB7IHJldHVybiAmcmVzdWx0XzsgfQorCisgcHJpdmF0ZToKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHREZWF0aFRlc3RGYWN0b3J5OworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7CisgIGZyaWVuZCBUZXN0SW5mbyogaW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7CisKKyAgLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gVGhlIG5ld2x5IGNvbnN0cnVjdGVkIGluc3RhbmNlIGFzc3VtZXMKKyAgLy8gb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KKyAgVGVzdEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLCAgIC8vIE5VTEwgaWYgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QKKyAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwgIC8vIE5VTEwgaWYgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0CisgICAgICAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7CisKKyAgLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGRlYXRoIHRlc3RzIGVuY291bnRlcmVkIGluIHRoaXMgdGVzdCBzbworICAvLyBmYXIuCisgIGludCBpbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpIHsKKyAgICByZXR1cm4gcmVzdWx0Xy5pbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOworICB9CisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QsIHJ1bnMgaXQsIHJlY29yZHMgaXRzIHJlc3VsdCwgYW5kIHRoZW4KKyAgLy8gZGVsZXRlcyBpdC4KKyAgdm9pZCBSdW4oKTsKKworICBzdGF0aWMgdm9pZCBDbGVhclRlc3RSZXN1bHQoVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHRlc3RfaW5mby0+cmVzdWx0Xy5DbGVhcigpOworICB9CisKKyAgLy8gVGhlc2UgZmllbGRzIGFyZSBpbW11dGFibGUgcHJvcGVydGllcyBvZiB0aGUgdGVzdC4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgdGVzdF9jYXNlX25hbWVfOyAgICAgLy8gVGVzdCBjYXNlIG5hbWUKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87ICAgICAgICAgICAgICAgLy8gVGVzdCBuYW1lCisgIC8vIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYQorICAvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbV87CisgIC8vIFRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIHBhcmFtZXRlciwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhCisgIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdmFsdWVfcGFyYW1fOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWRfOyAgIC8vIElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKyAgYm9vbCBzaG91bGRfcnVuXzsgICAgICAgICAgICAgICAgIC8vIFRydWUgaWZmIHRoaXMgdGVzdCBzaG91bGQgcnVuCisgIGJvb2wgaXNfZGlzYWJsZWRfOyAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQKKyAgYm9vbCBtYXRjaGVzX2ZpbHRlcl87ICAgICAgICAgICAgIC8vIFRydWUgaWYgdGhpcyB0ZXN0IG1hdGNoZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyLXNwZWNpZmllZCBmaWx0ZXIuCisgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGNvbnN0IGZhY3RvcnlfOyAgLy8gVGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlc3Qgb2JqZWN0CisKKyAgLy8gVGhpcyBmaWVsZCBpcyBtdXRhYmxlIGFuZCBuZWVkcyB0byBiZSByZXNldCBiZWZvcmUgcnVubmluZyB0aGUKKyAgLy8gdGVzdCBmb3IgdGhlIHNlY29uZCB0aW1lLgorICBUZXN0UmVzdWx0IHJlc3VsdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0SW5mbyk7Cit9OworCisvLyBBIHRlc3QgY2FzZSwgd2hpY2ggY29uc2lzdHMgb2YgYSB2ZWN0b3Igb2YgVGVzdEluZm9zLgorLy8KKy8vIFRlc3RDYXNlIGlzIG5vdCBjb3B5YWJsZS4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdENhc2UgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgIC8vCisgIC8vIFRlc3RDYXNlIGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQWx3YXlzIHVzZSB0aGlzCisgIC8vIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIFRlc3RDYXNlIG9iamVjdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgIC8vICAgYV90eXBlX3BhcmFtOiB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisgIC8vICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICAvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisgIFRlc3RDYXNlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwKKyAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpOworCisgIC8vIERlc3RydWN0b3Igb2YgVGVzdENhc2UuCisgIHZpcnR1YWwgflRlc3RDYXNlKCk7CisKKyAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVGVzdENhc2UuCisgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQorICAvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgorICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtKCkgY29uc3QgeworICAgIGlmICh0eXBlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQorICAgICAgcmV0dXJuIHR5cGVfcGFyYW1fLT5jX3N0cigpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIHNob3VsZCBydW4uCisgIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgorICBpbnQgcmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgorICBpbnQgcmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIGZhaWxlZC4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdCB7IHJldHVybiBmYWlsZWRfdGVzdF9jb3VudCgpID4gMDsgfQorCisgIC8vIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBjb25zdCBUZXN0SW5mbyogR2V0VGVzdEluZm8oaW50IGkpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgdGhhdCBob2xkcyB0ZXN0IHByb3BlcnRpZXMgcmVjb3JkZWQgZHVyaW5nCisgIC8vIGV4ZWN1dGlvbiBvZiBTZXRVcFRlc3RDYXNlIGFuZCBUZWFyRG93blRlc3RDYXNlLgorICBjb25zdCBUZXN0UmVzdWx0JiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiBhZF9ob2NfdGVzdF9yZXN1bHRfOyB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisKKyAgLy8gR2V0cyB0aGUgKG11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSB7IHJldHVybiB0ZXN0X2luZm9fbGlzdF87IH0KKworICAvLyBHZXRzIHRoZSAoaW1tdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2luZm9fbGlzdF87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgVGVzdEluZm8qIEdldE11dGFibGVUZXN0SW5mbyhpbnQgaSk7CisKKyAgLy8gU2V0cyB0aGUgc2hvdWxkX3J1biBtZW1iZXIuCisgIHZvaWQgc2V0X3Nob3VsZF9ydW4oYm9vbCBzaG91bGQpIHsgc2hvdWxkX3J1bl8gPSBzaG91bGQ7IH0KKworICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgVGVzdEluZm8gdXBvbgorICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgVGVzdENhc2Ugb2JqZWN0LgorICB2b2lkIEFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICB2b2lkIENsZWFyUmVzdWx0KCk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgorICBzdGF0aWMgdm9pZCBDbGVhclRlc3RDYXNlUmVzdWx0KFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgICB0ZXN0X2Nhc2UtPkNsZWFyUmVzdWx0KCk7CisgIH0KKworICAvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgdm9pZCBSdW4oKTsKKworICAvLyBSdW5zIFNldFVwVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcyBuZWVkZWQKKyAgLy8gZm9yIGNhdGNoaW5nIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gU2V0VXBUZXN0Q2FzZSgpLgorICB2b2lkIFJ1blNldFVwVGVzdENhc2UoKSB7ICgqc2V0X3VwX3RjXykoKTsgfQorCisgIC8vIFJ1bnMgVGVhckRvd25UZXN0Q2FzZSgpIGZvciB0aGlzIFRlc3RDYXNlLiAgVGhpcyB3cmFwcGVyIGlzCisgIC8vIG5lZWRlZCBmb3IgY2F0Y2hpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBUZWFyRG93blRlc3RDYXNlKCkuCisgIHZvaWQgUnVuVGVhckRvd25UZXN0Q2FzZSgpIHsgKCp0ZWFyX2Rvd25fdGNfKSgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IHBhc3NlZC4KKyAgc3RhdGljIGJvb2wgVGVzdFBhc3NlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPlBhc3NlZCgpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGZhaWxlZC4KKyAgc3RhdGljIGJvb2wgVGVzdEZhaWxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPkZhaWxlZCgpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBpcyBkaXNhYmxlZCBhbmQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MCisgIC8vIHJlcG9ydC4KKyAgc3RhdGljIGJvb2wgVGVzdFJlcG9ydGFibGVEaXNhYmxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfcmVwb3J0YWJsZSgpICYmIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGlzIGRpc2FibGVkLgorICBzdGF0aWMgYm9vbCBUZXN0RGlzYWJsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXzsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyB0ZXN0IHdpbGwgYXBwZWFyIGluIHRoZSBYTUwgcmVwb3J0LgorICBzdGF0aWMgYm9vbCBUZXN0UmVwb3J0YWJsZShjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfcmVwb3J0YWJsZSgpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0ZXN0IHNob3VsZCBydW4uCisgIHN0YXRpYyBib29sIFNob3VsZFJ1blRlc3QoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKTsKKyAgfQorCisgIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgdm9pZCBTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKTsKKworICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCisgIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKKworICAvLyBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UuCisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCisgIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4gdGVzdF9pbmZvX2xpc3RfOworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBsaXN0IHRvIGFsbG93IGVhc3kKKyAgLy8gc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3Qgb3JkZXIuICBUaGUgaS10aCBlbGVtZW50IGluIHRoaXMKKyAgLy8gdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGluIHRoZSBzaHVmZmxlZCB0ZXN0IGxpc3QuCisgIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9pbmRpY2VzXzsKKyAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UuCisgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90Y187CisgIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlLgorICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGNfOworICAvLyBUcnVlIGlmZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW5fOworICAvLyBFbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisgIC8vIEhvbGRzIHRlc3QgcHJvcGVydGllcyByZWNvcmRlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIFNldFVwVGVzdENhc2UgYW5kCisgIC8vIFRlYXJEb3duVGVzdENhc2UuCisgIFRlc3RSZXN1bHQgYWRfaG9jX3Rlc3RfcmVzdWx0XzsKKworICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RDYXNlcy4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0Q2FzZSk7Cit9OworCisvLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgaXMgY2FwYWJsZSBvZiBzZXR0aW5nIHVwIGFuZCB0ZWFyaW5nIGRvd24gYW4KKy8vIGVudmlyb25tZW50LiAgVGhlIHVzZXIgc2hvdWxkIHN1YmNsYXNzIHRoaXMgdG8gZGVmaW5lIGhpcyBvd24KKy8vIGVudmlyb25tZW50KHMpLgorLy8KKy8vIEFuIEVudmlyb25tZW50IG9iamVjdCBkb2VzIHRoZSBzZXQtdXAgYW5kIHRlYXItZG93biBpbiB2aXJ0dWFsCisvLyBtZXRob2RzIFNldFVwKCkgYW5kIFRlYXJEb3duKCkgaW5zdGVhZCBvZiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZQorLy8gZGVzdHJ1Y3RvciwgYXM6CisvLworLy8gICAxLiBZb3UgY2Fubm90IHNhZmVseSB0aHJvdyBmcm9tIGEgZGVzdHJ1Y3Rvci4gIFRoaXMgaXMgYSBwcm9ibGVtCisvLyAgICAgIGFzIGluIHNvbWUgY2FzZXMgR29vZ2xlIFRlc3QgaXMgdXNlZCB3aGVyZSBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBhbmQKKy8vICAgICAgd2UgbWF5IHdhbnQgdG8gaW1wbGVtZW50IEFTU0VSVF8qIHVzaW5nIGV4Y2VwdGlvbnMgd2hlcmUgdGhleSBhcmUKKy8vICAgICAgYXZhaWxhYmxlLgorLy8gICAyLiBZb3UgY2Fubm90IHVzZSBBU1NFUlRfKiBkaXJlY3RseSBpbiBhIGNvbnN0cnVjdG9yIG9yCisvLyAgICAgIGRlc3RydWN0b3IuCitjbGFzcyBFbnZpcm9ubWVudCB7CisgcHVibGljOgorICAvLyBUaGUgZCd0b3IgaXMgdmlydHVhbCBhcyB3ZSBuZWVkIHRvIHN1YmNsYXNzIEVudmlyb25tZW50LgorICB2aXJ0dWFsIH5FbnZpcm9ubWVudCgpIHt9CisKKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CisKKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHRlYXIgZG93biB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9CisgcHJpdmF0ZToKKyAgLy8gSWYgeW91IHNlZSBhbiBlcnJvciBhYm91dCBvdmVycmlkaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gb3IKKyAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLgorICBzdHJ1Y3QgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAge307CisgIHZpcnR1YWwgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAqIFNldHVwKCkgeyByZXR1cm4gTlVMTDsgfQorfTsKKworLy8gVGhlIGludGVyZmFjZSBmb3IgdHJhY2luZyBleGVjdXRpb24gb2YgdGVzdHMuIFRoZSBtZXRob2RzIGFyZSBvcmdhbml6ZWQgaW4KKy8vIHRoZSBvcmRlciB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgYXJlIGZpcmVkLgorY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdEV2ZW50TGlzdGVuZXIoKSB7fQorCisgIC8vIEZpcmVkIGJlZm9yZSBhbnkgdGVzdCBhY3Rpdml0eSBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuICBUaGVyZSBtYXkgYmUgbW9yZSB0aGFuCisgIC8vIG9uZSBpdGVyYXRpb24gaWYgR1RFU1RfRkxBRyhyZXBlYXQpIGlzIHNldC4gaXRlcmF0aW9uIGlzIHRoZSBpdGVyYXRpb24KKyAgLy8gaW5kZXgsIHN0YXJ0aW5nIGZyb20gMC4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVudmlyb25tZW50IHNldC11cCBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSB0aGUgdGVzdCBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgYSBmYWlsZWQgYXNzZXJ0aW9uIG9yIGEgU1VDQ0VFRCgpIGludm9jYXRpb24uCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgdGhlIHRlc3QgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgdGhlIHRlc3QgY2FzZSBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVudmlyb25tZW50IHRlYXItZG93biBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlbnZpcm9ubWVudCB0ZWFyLWRvd24gZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBmaW5pc2hlcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBhbGwgdGVzdCBhY3Rpdml0aWVzIGhhdmUgZW5kZWQuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKK307CisKKy8vIFRoZSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdXNlcnMgd2hvIG5lZWQgdG8gb3ZlcnJpZGUganVzdCBvbmUgb3IgdHdvCisvLyBtZXRob2RzIGFuZCBhcmUgbm90IGNvbmNlcm5lZCB0aGF0IGEgcG9zc2libGUgY2hhbmdlIHRvIGEgc2lnbmF0dXJlIG9mCisvLyB0aGUgbWV0aG9kcyB0aGV5IG92ZXJyaWRlIHdpbGwgbm90IGJlIGNhdWdodCBkdXJpbmcgdGhlIGJ1aWxkLiAgRm9yCisvLyBjb21tZW50cyBhYm91dCBlYWNoIG1ldGhvZCBwbGVhc2Ugc2VlIHRoZSBkZWZpbml0aW9uIG9mIFRlc3RFdmVudExpc3RlbmVyCisvLyBhYm92ZS4KK2NsYXNzIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiAvKnRlc3RfcGFydF9yZXN1bHQqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KK307CisKKy8vIFRlc3RFdmVudExpc3RlbmVycyBsZXRzIHVzZXJzIGFkZCBsaXN0ZW5lcnMgdG8gdHJhY2sgZXZlbnRzIGluIEdvb2dsZSBUZXN0LgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0RXZlbnRMaXN0ZW5lcnMgeworIHB1YmxpYzoKKyAgVGVzdEV2ZW50TGlzdGVuZXJzKCk7CisgIH5UZXN0RXZlbnRMaXN0ZW5lcnMoKTsKKworICAvLyBBcHBlbmRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIEdvb2dsZSBUZXN0IGFzc3VtZXMKKyAgLy8gdGhlIG93bmVyc2hpcCBvZiB0aGUgbGlzdGVuZXIgKGkuZS4gaXQgd2lsbCBkZWxldGUgdGhlIGxpc3RlbmVyIHdoZW4KKyAgLy8gdGhlIHRlc3QgcHJvZ3JhbSBmaW5pc2hlcykuCisgIHZvaWQgQXBwZW5kKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4KKyAgLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucworICAvLyBOVUxMIGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCisgIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IGNvbnNvbGUKKyAgLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQKKyAgLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAorICAvLyB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcworICAvLyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dCB0aW1lLgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgWE1MIG91dHB1dAorICAvLyBjb250cm9sbGVkIGJ5IHRoZSAtLWd0ZXN0X291dHB1dD14bWwgZmxhZy4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlCisgIC8vIGxpc3RlbmVycyBsaXN0IGJ5IHVzZXJzIHdobyB3YW50IHRvIHNodXQgZG93biB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0CisgIC8vIGNvbnRyb2xsZWQgYnkgdGhpcyBmbGFnIGFuZCBzdWJzdGl0dXRlIGl0IHdpdGggY3VzdG9tIG9uZS4gIE5vdGUgdGhhdAorICAvLyByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0IHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzCisgIC8vIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyIGFuZCBtYWtlcyB0aGlzIGZ1bmN0aW9uIHJldHVybiBOVUxMIHRoZSBuZXh0CisgIC8vIHRpbWUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl87CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok5vRXhlY0RlYXRoVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisKKyAgLy8gUmV0dXJucyByZXBlYXRlciB0aGF0IGJyb2FkY2FzdHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGV2ZW50cyB0byBhbGwKKyAgLy8gc3Vic2NyaWJlcnMuCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlcigpOworCisgIC8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KKyAgLy8gVGhlIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisgIC8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisgIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisgIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KKyAgdm9pZCBTZXREZWZhdWx0UmVzdWx0UHJpbnRlcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFNldHMgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLiAgVGhlCisgIC8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisgIC8vIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KKyAgLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKyAgLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgorICB2b2lkIFNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCBieSB0aGUgcmVwZWF0ZXIgdG8gdGhlCisgIC8vIGxpc3RlbmVycyBpbiB0aGUgbGlzdC4KKyAgYm9vbCBFdmVudEZvcndhcmRpbmdFbmFibGVkKCkgY29uc3Q7CisgIHZvaWQgU3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKworICAvLyBUaGUgYWN0dWFsIGxpc3Qgb2YgbGlzdGVuZXJzLgorICBpbnRlcm5hbDo6VGVzdEV2ZW50UmVwZWF0ZXIqIHJlcGVhdGVyXzsKKyAgLy8gTGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBzdGFuZGFyZCByZXN1bHQgb3V0cHV0LgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl87CisgIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFhNTCBvdXRwdXQgZmlsZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0RXZlbnRMaXN0ZW5lcnMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50TGlzdGVuZXJzKTsKK307CisKKy8vIEEgVW5pdFRlc3QgY29uc2lzdHMgb2YgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLgorLy8KKy8vIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MuICBUaGUgb25seSBpbnN0YW5jZSBvZiBVbml0VGVzdCBpcworLy8gY3JlYXRlZCB3aGVuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpIGlzIGZpcnN0IGNhbGxlZC4gIFRoaXMKKy8vIGluc3RhbmNlIGlzIG5ldmVyIGRlbGV0ZWQuCisvLworLy8gVW5pdFRlc3QgaXMgbm90IGNvcHlhYmxlLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUgYXMgbG9uZyBhcyB0aGUgbWV0aG9kcyBhcmUgY2FsbGVkCisvLyBhY2NvcmRpbmcgdG8gdGhlaXIgc3BlY2lmaWNhdGlvbi4KK2NsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3QgeworIHB1YmxpYzoKKyAgLy8gR2V0cyB0aGUgc2luZ2xldG9uIFVuaXRUZXN0IG9iamVjdC4gIFRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kCisgIC8vIGlzIGNhbGxlZCwgYSBVbml0VGVzdCBvYmplY3QgaXMgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLgorICAvLyBDb25zZWN1dGl2ZSBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QuCisgIHN0YXRpYyBVbml0VGVzdCogR2V0SW5zdGFuY2UoKTsKKworICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisgIC8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAvLworICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisgIGludCBSdW4oKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOworCisgIC8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKQorICAvLyB3YXMgZXhlY3V0ZWQuICBUaGUgVW5pdFRlc3Qgb2JqZWN0IG93bnMgdGhlIHN0cmluZy4KKyAgY29uc3QgY2hhciogb3JpZ2luYWxfd29ya2luZ19kaXIoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKyAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIGNvbnN0IFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0CisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAorICAvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKyAgY29uc3QgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gUmV0dXJucyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBydW4uCisgIGludCByYW5kb21fc2VlZCgpIGNvbnN0OworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gUmV0dXJucyB0aGUgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KKyAgaW50IGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCisgIGludCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisgIC8vIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCisgIGludCByZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCisgIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCisgIGludCByZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgorICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgIC8vIFVOSVggZXBvY2guCisgIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXAoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAorICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gdGVzdCBmYWlsdXJlcyBhbmQKKyAgLy8gcHJvcGVydGllcyBsb2dnZWQgb3V0c2lkZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMuCisgIGNvbnN0IFRlc3RSZXN1bHQmIGFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCisgIC8vIGluc2lkZSBHb29nbGUgVGVzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMoKTsKKworIHByaXZhdGU6CisgIC8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QKKyAgLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4KKyAgLy8gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLiAgQWZ0ZXIgYWxsIHRlc3RzIGluIHRoZSBwcm9ncmFtCisgIC8vIGhhdmUgZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4KKyAgLy8gdGhlICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KKyAgLy8KKyAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAvLworICAvLyBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCisgIEVudmlyb25tZW50KiBBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KTsKKworICAvLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwKKyAgLy8gR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIG1hY3JvcyAoZS5nLiBBU1NFUlRfVFJVRSwgRVhQRUNUX0VRLCBldGMpCisgIC8vIGV2ZW50dWFsbHkgY2FsbCB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZQorICAvLyBzaG91bGQgdXNlIHRoZSBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5LgorICB2b2lkIEFkZFRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX3N0YWNrX3RyYWNlKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBmcm9tCisgIC8vIGluc2lkZSBhIHRlc3QsIHRvIGN1cnJlbnQgVGVzdENhc2UncyBhZF9ob2NfdGVzdF9yZXN1bHRfIHdoZW4gaW52b2tlZAorICAvLyBmcm9tIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQKKyAgLy8gd2hlbiBpbnZva2VkIGVsc2V3aGVyZS4gIElmIHRoZSByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGgKKyAgLy8gdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgorICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpOworCisgIC8vIEFjY2Vzc29ycyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9CisgIGNvbnN0IGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQorCisgIC8vIFRoZXNlIGNsYXNzZXMgYW5kIGZ1bmNpb25zIGFyZSBmcmllbmRzIGFzIHRoZXkgbmVlZCB0byBhY2Nlc3MgcHJpdmF0ZQorICAvLyBtZW1iZXJzIG9mIFVuaXRUZXN0LgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBc3NlcnRIZWxwZXI7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U2NvcGVkVHJhY2U7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U3RyZWFtaW5nTGlzdGVuZXJUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyOworICBmcmllbmQgRW52aXJvbm1lbnQqIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KTsKKyAgZnJpZW5kIGludGVybmFsOjpVbml0VGVzdEltcGwqIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgZnJpZW5kIHZvaWQgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKKyAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCisgIC8vIENyZWF0ZXMgYW4gZW1wdHkgVW5pdFRlc3QuCisgIFVuaXRUZXN0KCk7CisKKyAgLy8gRCd0b3IKKyAgdmlydHVhbCB+VW5pdFRlc3QoKTsKKworICAvLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCisgIC8vIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgorICB2b2lkIFB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBQb3BzIGEgdHJhY2UgZnJvbSB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgdm9pZCBQb3BHVGVzdFRyYWNlKCkKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gUHJvdGVjdHMgbXV0YWJsZSBzdGF0ZSBpbiAqaW1wbF8uICBUaGlzIGlzIG11dGFibGUgYXMgc29tZSBjb25zdAorICAvLyBtZXRob2RzIG5lZWQgdG8gbG9jayBpdCB0b28uCisgIG11dGFibGUgaW50ZXJuYWw6Ok11dGV4IG11dGV4XzsKKworICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyBuZXZlciBjaGFuZ2VkIG9uY2UKKyAgLy8gdGhlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZC4gIFdlIGRvbid0IG1hcmsgaXQgYXMgY29uc3QgaGVyZSwgYXMKKyAgLy8gZG9pbmcgc28gd2lsbCBjYXVzZSBhIHdhcm5pbmcgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIFVuaXRUZXN0LgorICAvLyBNdXRhYmxlIHN0YXRlIGluICppbXBsXyBpcyBwcm90ZWN0ZWQgYnkgbXV0ZXhfLgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsXzsKKworICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFVuaXRUZXN0LgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0KTsKK307CisKKy8vIEEgY29udmVuaWVudCB3cmFwcGVyIGZvciBhZGRpbmcgYW4gZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0CisvLyBwcm9ncmFtLgorLy8KKy8vIFlvdSBzaG91bGQgY2FsbCB0aGlzIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgY2FsbGVkLCBwcm9iYWJseSBpbgorLy8gbWFpbigpLiAgSWYgeW91IHVzZSBndGVzdF9tYWluLCB5b3UgbmVlZCB0byBjYWxsIHRoaXMgYmVmb3JlIG1haW4oKQorLy8gc3RhcnRzIGZvciBpdCB0byB0YWtlIGVmZmVjdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBhIGdsb2JhbAorLy8gdmFyaWFibGUgbGlrZSB0aGlzOgorLy8KKy8vICAgdGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGZvb19lbnYgPQorLy8gICAgICAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBGb29FbnZpcm9ubWVudCk7CisvLworLy8gSG93ZXZlciwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSB0byB3cml0ZSB5b3VyIG93biBtYWluKCkgYW5kCisvLyBjYWxsIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpIHRoZXJlLCBhcyByZWx5aW5nIG9uIGluaXRpYWxpemF0aW9uCisvLyBvZiBnbG9iYWwgdmFyaWFibGVzIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkIGFuZCBtYXkgY2F1c2UKKy8vIHByb2JsZW1zIHdoZW4geW91IHJlZ2lzdGVyIG11bHRpcGxlIGVudmlyb25tZW50cyBmcm9tIGRpZmZlcmVudAorLy8gdHJhbnNsYXRpb24gdW5pdHMgYW5kIHRoZSBlbnZpcm9ubWVudHMgaGF2ZSBkZXBlbmRlbmNpZXMgYW1vbmcgdGhlbQorLy8gKHJlbWVtYmVyIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBpbiB3aGljaAorLy8gZ2xvYmFsIHZhcmlhYmxlcyBmcm9tIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBhcmUgaW5pdGlhbGl6ZWQpLgoraW5saW5lIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeworICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPkFkZEVudmlyb25tZW50KGVudik7Cit9CisKKy8vIEluaXRpYWxpemVzIEdvb2dsZSBUZXN0LiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZworLy8gUlVOX0FMTF9URVNUUygpLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUKKy8vIGZsYWdzIHRoYXQgR29vZ2xlIFRlc3QgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIFRlc3QgZmxhZyBpcworLy8gc2VlbiwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KKy8vCisvLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgVGVzdCBmbGFnIHZhcmlhYmxlcyBhcmUKKy8vIHVwZGF0ZWQuCisvLworLy8gQ2FsbGluZyB0aGUgZnVuY3Rpb24gZm9yIHRoZSBzZWNvbmQgdGltZSBoYXMgbm8gdXNlci12aXNpYmxlIGVmZmVjdC4KK0dURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKKworLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgorLy8gVU5JQ09ERSBtb2RlLgorR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBGb3JtYXRGb3JDb21wYXJpc29uPFRvUHJpbnQsIE90aGVyT3BlcmFuZD46OkZvcm1hdCh2YWx1ZSkgZm9ybWF0cyBhCisvLyB2YWx1ZSBvZiB0eXBlIFRvUHJpbnQgdGhhdCBpcyBhbiBvcGVyYW5kIG9mIGEgY29tcGFyaXNvbiBhc3NlcnRpb24KKy8vIChlLmcuIEFTU0VSVF9FUSkuICBPdGhlck9wZXJhbmQgaXMgdGhlIHR5cGUgb2YgdGhlIG90aGVyIG9wZXJhbmQgaW4KKy8vIHRoZSBjb21wYXJpc29uLCBhbmQgaXMgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYmVzdCB3YXkgdG8KKy8vIGZvcm1hdCB0aGUgdmFsdWUuICBJbiBwYXJ0aWN1bGFyLCB3aGVuIHRoZSB2YWx1ZSBpcyBhIEMgc3RyaW5nCisvLyAoY2hhciBwb2ludGVyKSBhbmQgdGhlIG90aGVyIG9wZXJhbmQgaXMgYW4gU1RMIHN0cmluZyBvYmplY3QsIHdlCisvLyB3YW50IHRvIGZvcm1hdCB0aGUgQyBzdHJpbmcgYXMgYSBzdHJpbmcsIHNpbmNlIHdlIGtub3cgaXQgaXMKKy8vIGNvbXBhcmVkIGJ5IHZhbHVlIHdpdGggdGhlIHN0cmluZyBvYmplY3QuICBJZiB0aGUgdmFsdWUgaXMgYSBjaGFyCisvLyBwb2ludGVyIGJ1dCB0aGUgb3RoZXIgb3BlcmFuZCBpcyBub3QgYW4gU1RMIHN0cmluZyBvYmplY3QsIHdlIGRvbid0CisvLyBrbm93IHdoZXRoZXIgdGhlIHBvaW50ZXIgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZAorLy8gc3RyaW5nLCBhbmQgdGh1cyB3YW50IHRvIHByaW50IGl0IGFzIGEgcG9pbnRlciB0byBiZSBzYWZlLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKworLy8gVGhlIGRlZmF1bHQgY2FzZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUb1ByaW50LCB0eXBlbmFtZSBPdGhlck9wZXJhbmQ+CitjbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uIHsKKyBwdWJsaWM6CisgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChjb25zdCBUb1ByaW50JiB2YWx1ZSkgeworICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUpOworICB9Cit9OworCisvLyBBcnJheS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUb1ByaW50LCBzaXplX3QgTiwgdHlwZW5hbWUgT3RoZXJPcGVyYW5kPgorY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbjxUb1ByaW50W05dLCBPdGhlck9wZXJhbmQ+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChjb25zdCBUb1ByaW50KiB2YWx1ZSkgeworICAgIHJldHVybiBGb3JtYXRGb3JDb21wYXJpc29uPGNvbnN0IFRvUHJpbnQqLCBPdGhlck9wZXJhbmQ+OjpGb3JtYXQodmFsdWUpOworICB9Cit9OworCisvLyBCeSBkZWZhdWx0LCBwcmludCBDIHN0cmluZyBhcyBwb2ludGVycyB0byBiZSBzYWZlLCBhcyB3ZSBkb24ndCBrbm93CisvLyB3aGV0aGVyIHRoZXkgYWN0dWFsbHkgcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcuCisKKyNkZWZpbmUgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oQ2hhclR5cGUpICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyT3BlcmFuZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbjxDaGFyVHlwZSosIE90aGVyT3BlcmFuZD4geyAgICAgICAgICAgICAgICAgIFwKKyAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoQ2hhclR5cGUqIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHZhbHVlKSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhjaGFyKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNvbnN0IGNoYXIpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8od2NoYXJfdCk7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhjb25zdCB3Y2hhcl90KTsKKworI3VuZGVmIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfCisKKy8vIElmIGEgQyBzdHJpbmcgaXMgY29tcGFyZWQgd2l0aCBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2Uga25vdyBpdCdzIG1lYW50CisvLyB0byBwb2ludCB0byBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgYW5kIHRodXMgY2FuIHByaW50IGl0IGFzIGEgc3RyaW5nLgorCisjZGVmaW5lIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oQ2hhclR5cGUsIE90aGVyU3RyaW5nVHlwZSkgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uPENoYXJUeXBlKiwgT3RoZXJTdHJpbmdUeXBlPiB7ICAgICAgICAgICAgICAgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChDaGFyVHlwZSogdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY2hhciwgOjpzdGQ6OnN0cmluZyk7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IGNoYXIsIDo6c3RkOjpzdHJpbmcpOworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY2hhciwgOjpzdHJpbmcpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCBjaGFyLCA6OnN0cmluZyk7CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyh3Y2hhcl90LCA6OndzdHJpbmcpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCB3Y2hhcl90LCA6OndzdHJpbmcpOworI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18od2NoYXJfdCwgOjpzdGQ6OndzdHJpbmcpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCB3Y2hhcl90LCA6OnN0ZDo6d3N0cmluZyk7CisjZW5kaWYKKworI3VuZGVmIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18KKworLy8gRm9ybWF0cyBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX0xULCBhbmQgZXRjKQorLy8gb3BlcmFuZCB0byBiZSB1c2VkIGluIGEgZmFpbHVyZSBtZXNzYWdlLiAgVGhlIHR5cGUgKGJ1dCBub3QgdmFsdWUpCisvLyBvZiB0aGUgb3RoZXIgb3BlcmFuZCBtYXkgYWZmZWN0IHRoZSBmb3JtYXQuICBUaGlzIGFsbG93cyB1cyB0bworLy8gcHJpbnQgYSBjaGFyKiBhcyBhIHJhdyBwb2ludGVyIHdoZW4gaXQgaXMgY29tcGFyZWQgYWdhaW5zdCBhbm90aGVyCisvLyBjaGFyKiBvciB2b2lkKiwgYW5kIHByaW50IGl0IGFzIGEgQyBzdHJpbmcgd2hlbiBpdCBpcyBjb21wYXJlZAorLy8gYWdhaW5zdCBhbiBzdGQ6OnN0cmluZyBvYmplY3QsIGZvciBleGFtcGxlLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdGQ6OnN0cmluZyBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoCisgICAgY29uc3QgVDEmIHZhbHVlLCBjb25zdCBUMiYgLyogb3RoZXJfb3BlcmFuZCAqLykgeworICByZXR1cm4gRm9ybWF0Rm9yQ29tcGFyaXNvbjxUMSwgVDI+OjpGb3JtYXQodmFsdWUpOworfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiBhY3R1YWwpIHsKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzODkpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaC4KKyNlbmRpZgorCisgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VuZGlmCisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoYWN0dWFsLCBleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAorLy8gaW4ge0FTU0VSVHxFWFBFQ1R9X0VRIHdoZW4gY29tcGlsZWQgd2l0aCBnY2MgNCwgYXMgYW5vbnltb3VzIGVudW1zCisvLyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGNsYXNzIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKKy8vIGxoc19pc19udWxsX2xpdGVyYWwgaXMgdHJ1ZSBpZmYgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpCisvLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLiAgVGhlIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzCisvLyBmb3IgbGhzX2lzX251bGxfbGl0ZXJhbCBiZWluZyBmYWxzZS4KK3RlbXBsYXRlIDxib29sIGxoc19pc19udWxsX2xpdGVyYWw+CitjbGFzcyBFcUhlbHBlciB7CisgcHVibGljOgorICAvLyBUaGlzIHRlbXBsYXRpemVkIHZlcnNpb24gaXMgZm9yIHRoZSBnZW5lcmFsIGNhc2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgYWN0dWFsKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorCisgIC8vIFdpdGggdGhpcyBvdmVybG9hZGVkIHZlcnNpb24sIHdlIGFsbG93IGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkCisgIC8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cworICAvLyBlbnVtcyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCisgIC8vCisgIC8vIEV2ZW4gdGhvdWdoIGl0cyBib2R5IGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSB2ZXJzaW9uLCB3ZQorICAvLyBjYW5ub3QgbWVyZ2UgdGhlIHR3bywgYXMgaXQgd2lsbCBtYWtlIGFub255bW91cyBlbnVtcyB1bmhhcHB5LgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorfTsKKworLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpCisvLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLCBsaWtlIE5VTEwsIGZhbHNlLCBvciAwLgordGVtcGxhdGUgPD4KK2NsYXNzIEVxSGVscGVyPHRydWU+IHsKKyBwdWJsaWM6CisgIC8vIFdlIGRlZmluZSB0d28gb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBDb21wYXJlKCkuICBUaGUgZmlyc3QKKyAgLy8gdmVyc2lvbiB3aWxsIGJlIHBpY2tlZCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkgaXMKKyAgLy8gTk9UIGEgcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoMCwgQW5JbnRGdW5jdGlvbigpKSBvcgorICAvLyBFWFBFQ1RfRVEoZmFsc2UsIGFfYm9vbCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKKyAgICAgIGNvbnN0IFQyJiBhY3R1YWwsCisgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgcHJldmVudHMgdGhpcyBvdmVybG9hZCBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgaWYgVDIKKyAgICAgIC8vIGlzIG5vdCBhIHBvaW50ZXIgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlIEFTU0VSVF9FUShOVUxMLCBteV9wdHIpCisgICAgICAvLyBleHBhbmRzIHRvIENvbXBhcmUoIiIsICIiLCBOVUxMLCBteV9wdHIpLCB3aGljaCByZXF1aXJlcyBhIGNvbnZlcnNpb24KKyAgICAgIC8vIHRvIG1hdGNoIHRoZSBTZWNyZXQqIGluIHRoZSBvdGhlciBvdmVybG9hZCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIG1ha2UKKyAgICAgIC8vIHRoaXMgdGVtcGxhdGUgbWF0Y2ggYmV0dGVyLgorICAgICAgdHlwZW5hbWUgRW5hYmxlSWY8IWlzX3BvaW50ZXI8VDI+Ojp2YWx1ZT46OnR5cGUqID0gMCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KKworICAvLyBUaGlzIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzIGEKKyAgLy8gcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoTlVMTCwgYV9wb2ludGVyKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgIC8vIFdlIHVzZWQgdG8gaGF2ZSBhIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBTZWNyZXQqLiAgVGhhdAorICAgICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIHdvdWxkIGRlZHVjZSB0byAnbG9uZycsIG1ha2luZyB0aGlzIGEgYmV0dGVyIG1hdGNoCisgICAgICAvLyB0aGFuIHRoZSBmaXJzdCBvdmVybG9hZCBldmVuIHdpdGhvdXQgdGhlIGZpcnN0IG92ZXJsb2FkJ3MgRW5hYmxlSWYuCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBnY2Mgd2l0aCAtV2NvbnZlcnNpb24tbnVsbCB3YXJucyB3aGVuICJwYXNzaW5nIE5VTEwgdG8KKyAgICAgIC8vIG5vbi1wb2ludGVyIGFyZ3VtZW50IiAoZXZlbiBhIGRlZHVjZWQgaW50ZWdyYWwgYXJndW1lbnQpLCBzbyB0aGUgb2xkCisgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBjYXVzZWQgd2FybmluZ3MgaW4gdXNlciBjb2RlLgorICAgICAgU2VjcmV0KiAvKiBleHBlY3RlZCAoTlVMTCkgKi8sCisgICAgICBUKiBhY3R1YWwpIHsKKyAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhhdCAnZXhwZWN0ZWQnIGlzIGEgbnVsbCBwb2ludGVyLgorICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VCo+KE5VTEwpLCBhY3R1YWwpOworICB9Cit9OworCisvLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8uICBJdCBpcyBoZXJlIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUKKy8vIG9mIHNpbWlsYXIgY29kZS4KKy8vCisvLyBGb3IgZWFjaCB0ZW1wbGF0aXplZCBoZWxwZXIgZnVuY3Rpb24sIHdlIGFsc28gZGVmaW5lIGFuIG92ZXJsb2FkZWQKKy8vIHZlcnNpb24gZm9yIEJpZ2dlc3RJbnQgaW4gb3JkZXIgdG8gcmVkdWNlIGNvZGUgYmxvYXQgYW5kIGFsbG93CisvLyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZCB3aXRoIHtBU1NFUlR8RVhQRUNUfV8/PyB3aGVuIGNvbXBpbGVkCisvLyB3aXRoIGdjYyA0LgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyNkZWZpbmUgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhvcF9uYW1lLCBvcClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPlwKK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2YWwxLCBjb25zdCBUMiYgdmFsMikge1wKKyAgaWYgKHZhbDEgb3AgdmFsMikge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpO1wKKyAgfSBlbHNlIHtcCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSBcCisgICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgIiAjb3AgIiAoIiA8PCBleHByMlwKKyAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMilcCisgICAgICAgIDw8ICIgdnMgIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMiwgdmFsMSk7XAorICB9XAorfVwKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShcCisgICAgY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBCaWdnZXN0SW50IHZhbDEsIEJpZ2dlc3RJbnQgdmFsMikKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9ORQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhORSwgIT0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTEUsIDw9KTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xUCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExULCA8KTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdFLCA+PSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HVAorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPik7CisKKyN1bmRlZiBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfCisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJFUS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCk7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKTsKKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUk5FLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMik7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRU5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMik7CisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGFjdHVhbCk7CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJORSBvbiB3aWRlIHN0cmluZ3MuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMyKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIElzU3Vic3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgdGhlCisvLyBmaXJzdCBhcmd1bWVudCB0byB7RVhQRUNULEFTU0VSVH1fUFJFRF9GT1JNQVQyKCksIG5vdCBieQorLy8gdGhlbXNlbHZlcy4gIFRoZXkgY2hlY2sgd2hldGhlciBuZWVkbGUgaXMgYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2sKKy8vIChOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmIG9ubHkpLCBhbmQgcmV0dXJuIGFuCisvLyBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhleSBmYWlsLgorLy8KKy8vIFRoZSB7bmVlZGxlLGhheXN0YWNrfV9leHByIGFyZ3VtZW50cyBhcmUgdGhlIHN0cmluZ2lmaWVkCisvLyBleHByZXNzaW9ucyB0aGF0IGdlbmVyYXRlZCB0aGUgdHdvIHJlYWwgYXJndW1lbnRzLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spOworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgY29tcGFyaW5nIGZsb2F0aW5nLXBvaW50cy4KKy8vCisvLyBUZW1wbGF0ZSBwYXJhbWV0ZXI6CisvLworLy8gICBSYXdUeXBlOiB0aGUgcmF3IGZsb2F0aW5nLXBvaW50IHR5cGUgKGVpdGhlciBmbG9hdCBvciBkb3VibGUpCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRmxvYXRpbmdQb2ludEVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIGFjdHVhbCkgeworICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyhleHBlY3RlZCksIHJocyhhY3R1YWwpOworCisgIGlmIChsaHMuQWxtb3N0RXF1YWxzKHJocykpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBleHBlY3RlZF9zczsKKyAgZXhwZWN0ZWRfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgICAgICA8PCBleHBlY3RlZDsKKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGFjdHVhbF9zczsKKyAgYWN0dWFsX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICAgIDw8IGFjdHVhbDsKKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJmV4cGVjdGVkX3NzKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdTdHJlYW1Ub1N0cmluZygmYWN0dWFsX3NzKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ORUFSLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IERvdWJsZU5lYXJQcmVkRm9ybWF0KGNvbnN0IGNoYXIqIGV4cHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhYnNfZXJyb3JfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzX2Vycm9yKTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vIEEgY2xhc3MgdGhhdCBlbmFibGVzIG9uZSB0byBzdHJlYW0gbWVzc2FnZXMgdG8gYXNzZXJ0aW9uIG1hY3JvcworY2xhc3MgR1RFU1RfQVBJXyBBc3NlcnRIZWxwZXIgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIEFzc2VydEhlbHBlcihUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSk7CisgIH5Bc3NlcnRIZWxwZXIoKTsKKworICAvLyBNZXNzYWdlIGFzc2lnbm1lbnQgaXMgYSBzZW1hbnRpYyB0cmljayB0byBlbmFibGUgYXNzZXJ0aW9uCisgIC8vIHN0cmVhbWluZzsgc2VlIHRoZSBHVEVTVF9NRVNTQUdFXyBtYWNybyBiZWxvdy4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBXZSBwdXQgb3VyIGRhdGEgaW4gYSBzdHJ1Y3Qgc28gdGhhdCB0aGUgc2l6ZSBvZiB0aGUgQXNzZXJ0SGVscGVyIGNsYXNzIGNhbgorICAvLyBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgZ2NjIGlzIGluY2FwYWJsZSBvZgorICAvLyByZS11c2luZyBzdGFjayBzcGFjZSBldmVuIGZvciB0ZW1wb3JhcnkgdmFyaWFibGVzLCBzbyBldmVyeSBFWFBFQ1RfRVEKKyAgLy8gcmVzZXJ2ZXMgc3RhY2sgc3BhY2UgZm9yIGFub3RoZXIgQXNzZXJ0SGVscGVyLgorICBzdHJ1Y3QgQXNzZXJ0SGVscGVyRGF0YSB7CisgICAgQXNzZXJ0SGVscGVyRGF0YShUZXN0UGFydFJlc3VsdDo6VHlwZSB0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3JjZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX251bSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1zZykKKyAgICAgICAgOiB0eXBlKHQpLCBmaWxlKHNyY2ZpbGUpLCBsaW5lKGxpbmVfbnVtKSwgbWVzc2FnZShtc2cpIHsgfQorCisgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgY29uc3QgdHlwZTsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBmaWxlOworICAgIGludCBjb25zdCBsaW5lOworICAgIHN0ZDo6c3RyaW5nIGNvbnN0IG1lc3NhZ2U7CisKKyAgIHByaXZhdGU6CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBc3NlcnRIZWxwZXJEYXRhKTsKKyAgfTsKKworICBBc3NlcnRIZWxwZXJEYXRhKiBjb25zdCBkYXRhXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFzc2VydEhlbHBlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisvLyBUaGUgcHVyZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBhbGwgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbmhlcml0IGZyb20uCisvLyBBIHZhbHVlLXBhcmFtZXRlcml6ZWQgY2xhc3MgbXVzdCBpbmhlcml0IGZyb20gYm90aCA6OnRlc3Rpbmc6OlRlc3QgYW5kCisvLyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9zdCBjYXNlcyB0aGF0IGp1c3QgbWVhbnMgaW5oZXJpdGluZworLy8gZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0sIGJ1dCBtb3JlIGNvbXBsaWNhdGVkIHRlc3QgaGllcmFyY2hpZXMKKy8vIG1heSBuZWVkIHRvIGluaGVyaXQgZnJvbSBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UgYXQgZGlmZmVyZW50IGxldmVscy4KKy8vCisvLyBUaGlzIGludGVyZmFjZSBoYXMgc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSB0ZXN0IHBhcmFtZXRlciB2YWx1ZSB2aWEKKy8vIHRoZSBHZXRQYXJhbSgpIG1ldGhvZC4KKy8vCisvLyBVc2UgaXQgd2l0aCBvbmUgb2YgdGhlIHBhcmFtZXRlciBnZW5lcmF0b3IgZGVmaW5pbmcgZnVuY3Rpb25zLCBsaWtlIFJhbmdlKCksCisvLyBWYWx1ZXMoKSwgVmFsdWVzSW4oKSwgQm9vbCgpLCBhbmQgQ29tYmluZSgpLgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4geworLy8gIHByb3RlY3RlZDoKKy8vICAgRm9vVGVzdCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIH5Gb29UZXN0KCkgeworLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgorLy8gICB9CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIHZvaWQgVGVhckRvd24geworLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgorLy8gICB9CisvLyB9OworLy8gVEVTVF9QKEZvb1Rlc3QsIERvZXNCYXIpIHsKKy8vICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIG1ldGhvZCBoZXJlLgorLy8gICBGb28gZm9vOworLy8gICBBU1NFUlRfVFJVRShmb28uRG9lc0JhcihHZXRQYXJhbSgpKSk7CisvLyB9CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChPbmVUb1RlblJhbmdlLCBGb29UZXN0LCA6OnRlc3Rpbmc6OlJhbmdlKDEsIDEwKSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgV2l0aFBhcmFtSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBQYXJhbVR5cGU7CisgIHZpcnR1YWwgfldpdGhQYXJhbUludGVyZmFjZSgpIHt9CisKKyAgLy8gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHZhbHVlLiBJcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgdGVzdCBmaXh0dXJlJ3MKKyAgLy8gY29uc3RydWN0b3IuIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGlzIG5vbi1zdGF0aWMsIGV2ZW4gdGhvdWdoIGl0IG9ubHkKKyAgLy8gcmVmZXJlbmNlcyBzdGF0aWMgZGF0YSwgdG8gcmVkdWNlIHRoZSBvcHBvcnR1bml0eSBmb3IgaW5jb3JyZWN0IHVzZXMKKyAgLy8gbGlrZSB3cml0aW5nICdXaXRoUGFyYW1JbnRlcmZhY2U8Ym9vbD46OkdldFBhcmFtKCknIGZvciBhIHRlc3QgdGhhdAorICAvLyB1c2VzIGEgZml4dHVyZSB3aG9zZSBwYXJhbWV0ZXIgdHlwZSBpcyBpbnQuCisgIGNvbnN0IFBhcmFtVHlwZSYgR2V0UGFyYW0oKSBjb25zdCB7CisgICAgR1RFU1RfQ0hFQ0tfKHBhcmFtZXRlcl8gIT0gTlVMTCkKKyAgICAgICAgPDwgIkdldFBhcmFtKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdCAiCisgICAgICAgIDw8ICItLSBkaWQgeW91IGludGVuZCB0byB3cml0ZSBURVNUX1AgaW5zdGVhZCBvZiBURVNUX0Y/IjsKKyAgICByZXR1cm4gKnBhcmFtZXRlcl87CisgIH0KKworIHByaXZhdGU6CisgIC8vIFNldHMgcGFyYW1ldGVyIHZhbHVlLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSB0aGUgdmFsdWUKKyAgLy8gcmVtYWlucyBhbGl2ZSBhbmQgdW5jaGFuZ2VkIHRocm91Z2hvdXQgdGhlIGN1cnJlbnQgdGVzdC4KKyAgc3RhdGljIHZvaWQgU2V0UGFyYW0oY29uc3QgUGFyYW1UeXBlKiBwYXJhbWV0ZXIpIHsKKyAgICBwYXJhbWV0ZXJfID0gcGFyYW1ldGVyOworICB9CisKKyAgLy8gU3RhdGljIHZhbHVlIHVzZWQgZm9yIGFjY2Vzc2luZyBwYXJhbWV0ZXIgZHVyaW5nIGEgdGVzdCBsaWZldGltZS4KKyAgc3RhdGljIGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyXzsKKworICAvLyBUZXN0Q2xhc3MgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIFdpdGhQYXJhbUludGVyZmFjZTxUPiBhbmQgVGVzdC4KKyAgdGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4gZnJpZW5kIGNsYXNzIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdEZhY3Rvcnk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFdpdGhQYXJhbUludGVyZmFjZTxUPjo6cGFyYW1ldGVyXyA9IE5VTEw7CisKKy8vIE1vc3QgdmFsdWUtcGFyYW1ldGVyaXplZCBjbGFzc2VzIGNhbiBpZ25vcmUgdGhlIGV4aXN0ZW5jZSBvZgorLy8gV2l0aFBhcmFtSW50ZXJmYWNlLCBhbmQgY2FuIGp1c3QgaW5oZXJpdCBmcm9tIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUZXN0V2l0aFBhcmFtIDogcHVibGljIFRlc3QsIHB1YmxpYyBXaXRoUGFyYW1JbnRlcmZhY2U8VD4geworfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBNYWNyb3MgZm9yIGluZGljYXRpbmcgc3VjY2Vzcy9mYWlsdXJlIGluIHRlc3QgY29kZS4KKworLy8gQUREX0ZBSUxVUkUgdW5jb25kaXRpb25hbGx5IGFkZHMgYSBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCisvLyBTVUNDRUVEIGdlbmVyYXRlcyBhIHN1Y2Nlc3MgLSBpdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUKKy8vIGN1cnJlbnQgdGVzdCBzdWNjZXNzZnVsLCBhcyBhIHRlc3QgaXMgb25seSBzdWNjZXNzZnVsIHdoZW4gaXQgaGFzCisvLyBubyBmYWlsdXJlLgorLy8KKy8vIEVYUEVDVF8qIHZlcmlmaWVzIHRoYXQgYSBjZXJ0YWluIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuICBJZiBub3QsCisvLyBpdCBiZWhhdmVzIGxpa2UgQUREX0ZBSUxVUkUuICBJbiBwYXJ0aWN1bGFyOgorLy8KKy8vICAgRVhQRUNUX1RSVUUgIHZlcmlmaWVzIHRoYXQgYSBCb29sZWFuIGNvbmRpdGlvbiBpcyB0cnVlLgorLy8gICBFWFBFQ1RfRkFMU0UgdmVyaWZpZXMgdGhhdCBhIEJvb2xlYW4gY29uZGl0aW9uIGlzIGZhbHNlLgorLy8KKy8vIEZBSUwgYW5kIEFTU0VSVF8qIGFyZSBzaW1pbGFyIHRvIEFERF9GQUlMVVJFIGFuZCBFWFBFQ1RfKiwgZXhjZXB0CisvLyB0aGF0IHRoZXkgd2lsbCBhbHNvIGFib3J0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9uIGZhaWx1cmUuICBQZW9wbGUKKy8vIHVzdWFsbHkgd2FudCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIEZBSUwgYW5kIEFTU0VSVF8qLCBidXQgdGhvc2UKKy8vIHdyaXRpbmcgZGF0YS1kcml2ZW4gdGVzdHMgb2Z0ZW4gZmluZCB0aGVtc2VsdmVzIHVzaW5nIEFERF9GQUlMVVJFCisvLyBhbmQgRVhQRUNUXyogbW9yZS4KKworLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZSB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBBRERfRkFJTFVSRSgpIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKCJGYWlsZWQiKQorCisvLyBHZW5lcmF0ZXMgYSBub25mYXRhbCBmYWlsdXJlIGF0IHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiB3aXRoCisvLyBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgQUREX0ZBSUxVUkVfQVQoZmlsZSwgbGluZSkgXAorICBHVEVTVF9NRVNTQUdFX0FUXyhmaWxlLCBsaW5lLCAiRmFpbGVkIiwgXAorICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlKQorCisvLyBHZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlIHdpdGggYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEdURVNUX0ZBSUwoKSBHVEVTVF9GQVRBTF9GQUlMVVJFXygiRmFpbGVkIikKKworLy8gRGVmaW5lIHRoaXMgbWFjcm8gdG8gMSB0byBvbWl0IHRoZSBkZWZpbml0aW9uIG9mIEZBSUwoKSwgd2hpY2ggaXMgYQorLy8gZ2VuZXJpYyBuYW1lIGFuZCBjbGFzaGVzIHdpdGggc29tZSBvdGhlciBsaWJyYXJpZXMuCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0ZBSUwKKyMgZGVmaW5lIEZBSUwoKSBHVEVTVF9GQUlMKCkKKyNlbmRpZgorCisvLyBHZW5lcmF0ZXMgYSBzdWNjZXNzIHdpdGggYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEdURVNUX1NVQ0NFRUQoKSBHVEVTVF9TVUNDRVNTXygiU3VjY2VlZGVkIikKKworLy8gRGVmaW5lIHRoaXMgbWFjcm8gdG8gMSB0byBvbWl0IHRoZSBkZWZpbml0aW9uIG9mIFNVQ0NFRUQoKSwgd2hpY2gKKy8vIGlzIGEgZ2VuZXJpYyBuYW1lIGFuZCBjbGFzaGVzIHdpdGggc29tZSBvdGhlciBsaWJyYXJpZXMuCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX1NVQ0NFRUQKKyMgZGVmaW5lIFNVQ0NFRUQoKSBHVEVTVF9TVUNDRUVEKCkKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIHRlc3RpbmcgZXhjZXB0aW9ucy4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbik6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCB0aHJvd3MgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbi4KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05PX1RIUk9XKHN0YXRlbWVudCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCBkb2Vzbid0IHRocm93IGFueSBleGNlcHRpb24uCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9BTllfVEhST1coc3RhdGVtZW50KToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IHRocm93cyBhbiBleGNlcHRpb24uCisKKyNkZWZpbmUgRVhQRUNUX1RIUk9XKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uKSBcCisgIEdURVNUX1RFU1RfVEhST1dfKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX05PX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX05PX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfQU5ZX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1RIUk9XKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uKSBcCisgIEdURVNUX1RFU1RfVEhST1dfKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX05PX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX05PX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfQU5ZX1RIUk9XKHN0YXRlbWVudCkgXAorICBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gQm9vbGVhbiBhc3NlcnRpb25zLiBDb25kaXRpb24gY2FuIGJlIGVpdGhlciBhIEJvb2xlYW4gZXhwcmVzc2lvbiBvciBhbgorLy8gQXNzZXJ0aW9uUmVzdWx0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIEFzc2VydGlvblJlc3VsdCB3aXRoCisvLyB0aGVzZSBtYWNyb3Mgc2VlIGNvbW1lbnRzIG9uIHRoYXQgY2xhc3MuCisjZGVmaW5lIEVYUEVDVF9UUlVFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX0ZBTFNFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1RSVUUoY29uZGl0aW9uKSBcCisgIEdURVNUX1RFU1RfQk9PTEVBTl8oY29uZGl0aW9uLCAjY29uZGl0aW9uLCBmYWxzZSwgdHJ1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfRkFMU0UoY29uZGl0aW9uKSBcCisgIEdURVNUX1RFU1RfQk9PTEVBTl8oIShjb25kaXRpb24pLCAjY29uZGl0aW9uLCB0cnVlLCBmYWxzZSwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisvLyBJbmNsdWRlcyB0aGUgYXV0by1nZW5lcmF0ZWQgaGVhZGVyIHRoYXQgaW1wbGVtZW50cyBhIGZhbWlseSBvZgorLy8gZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIG9uIDEwLzMxLzIwMTEgYnkgY29tbWFuZAorLy8gJ2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgNScuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworCisvLyBNYWtlcyBzdXJlIHRoaXMgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBiZWZvcmUgZ3Rlc3QuaC4KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworIyBlcnJvciBEbyBub3QgaW5jbHVkZSBndGVzdF9wcmVkX2ltcGwuaCBkaXJlY3RseS4gIEluY2x1ZGUgZ3Rlc3QuaCBpbnN0ZWFkLgorI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisKKy8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uCisvLyBtYWNyb3M6CisvLworLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkKKy8vICAgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKQorLy8gICAuLi4KKy8vCisvLyB3aGVyZSBwcmVkX2Zvcm1hdCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCB0YWtlcyBuIChpbiB0aGUKKy8vIGNhc2Ugb2YgQVNTRVJUX1BSRURfRk9STUFUbikgdmFsdWVzIGFuZCB0aGVpciBzb3VyY2UgZXhwcmVzc2lvbgorLy8gdGV4dCwgYW5kIHJldHVybnMgYSB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQuICBTZWUgdGhlIGRlZmluaXRpb24KKy8vIG9mIEFTU0VSVF9FUSBpbiBndGVzdC5oIGZvciBhbiBleGFtcGxlLgorLy8KKy8vIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IGZvcm1hdHRpbmcsIHlvdSBjYW4gdXNlIHRoZSBtb3JlCisvLyByZXN0cmljdGl2ZSB2ZXJzaW9uOgorLy8KKy8vICAgQVNTRVJUX1BSRUQxKHByZWQsIHYxKQorLy8gICBBU1NFUlRfUFJFRDIocHJlZCwgdjEsIHYyKQorLy8gICAuLi4KKy8vCisvLyB3aGVyZSBwcmVkIGlzIGFuIG4tYXJ5IGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCByZXR1cm5zIGJvb2wsCisvLyBhbmQgdGhlIHZhbHVlcyB2MSwgdjIsIC4uLiwgbXVzdCBzdXBwb3J0IHRoZSA8PCBvcGVyYXRvciBmb3IKKy8vIHN0cmVhbWluZyB0byBzdGQ6Om9zdHJlYW0uCisvLworLy8gV2UgYWxzbyBkZWZpbmUgdGhlIEVYUEVDVF8qIHZhcmlhdGlvbnMuCisvLworLy8gRm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQgcHJlZGljYXRlcyB3aG9zZSBhcml0eSBpcyBhdCBtb3N0IDUuCisvLyBQbGVhc2UgZW1haWwgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBzdXBwb3J0IGZvciBoaWdoZXIgYXJpdGllcy4KKworLy8gR1RFU1RfQVNTRVJUXyBpcyB0aGUgYmFzaWMgc3RhdGVtZW50IHRvIHdoaWNoIGFsbCBvZiB0aGUgYXNzZXJ0aW9ucworLy8gaW4gdGhpcyBmaWxlIHJlZHVjZS4gIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKworI2RlZmluZSBHVEVTVF9BU1NFUlRfKGV4cHJlc3Npb24sIG9uX2ZhaWx1cmUpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXIgPSAoZXhwcmVzc2lvbikpIFwKKyAgICA7IFwKKyAgZWxzZSBcCisgICAgb25fZmFpbHVyZShndGVzdF9hci5mYWlsdXJlX21lc3NhZ2UoKSkKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDEuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDE+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDFIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEpIHsKKyAgaWYgKHByZWQodjEpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDEuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsIHYxKSwgXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQxSGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxKSwgb25fZmFpbHVyZSkKKworLy8gVW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCisgIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQxKHByZWQsIHYxKSBcCisgIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCisgIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQxKHByZWQsIHYxKSBcCisgIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDJIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSB7CisgIGlmIChwcmVkKHYxLCB2MikpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDIuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2Miwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsIHYxLCB2MiksIFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMi4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDJIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIpLCBvbl9mYWlsdXJlKQorCisvLyBCaW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDIocHJlZCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiwKKyAgICAgICAgICB0eXBlbmFtZSBUMz4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkM0hlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzKSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjM7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMy4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgdjEsIHYyLCB2MyksIFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQzSGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzKSwgb25fZmFpbHVyZSkKKworLy8gVGVybmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQzKHByZWQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDMocHJlZCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDQuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDMsCisgICAgICAgICAgdHlwZW5hbWUgVDQ+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDRIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIHsKKyAgaWYgKHByZWQodjEsIHYyLCB2MywgdjQpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU0IDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNCA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY0OworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDQuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCAjdjQsIHYxLCB2MiwgdjMsIHY0KSwgXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ0SGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0KSwgb25fZmFpbHVyZSkKKworLy8gNC1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCisgIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDMsCisgICAgICAgICAgdHlwZW5hbWUgVDQsCisgICAgICAgICAgdHlwZW5hbWUgVDU+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDVIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0LCB2NSkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTQgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU1IDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNCA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY1OworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDUuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCAjdjUsIHYxLCB2MiwgdjMsIHY0LCB2NSksIFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDVIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y1LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjUpLCBvbl9mYWlsdXJlKQorCisvLyA1LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUNShwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVENShwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDUocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworCisvLyBNYWNyb3MgZm9yIHRlc3RpbmcgZXF1YWxpdGllcyBhbmQgaW5lcXVhbGl0aWVzLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0VRKGV4cGVjdGVkLCBhY3R1YWwpOiBUZXN0cyB0aGF0IGV4cGVjdGVkID09IGFjdHVhbAorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTkUodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgIT0gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxIDwgdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xFKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxIDw9IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HVCh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA+IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HRSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA+PSB2MgorLy8KKy8vIFdoZW4gdGhleSBhcmUgbm90LCBHb29nbGUgVGVzdCBwcmludHMgYm90aCB0aGUgdGVzdGVkIGV4cHJlc3Npb25zIGFuZAorLy8gdGhlaXIgYWN0dWFsIHZhbHVlcy4gIFRoZSB2YWx1ZXMgbXVzdCBiZSBjb21wYXRpYmxlIGJ1aWx0LWluIHR5cGVzLAorLy8gb3IgeW91IHdpbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IuICBCeSAiY29tcGF0aWJsZSIgd2UgbWVhbiB0aGF0IHRoZQorLy8gdmFsdWVzIGNhbiBiZSBjb21wYXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBvcGVyYXRvci4KKy8vCisvLyBOb3RlOgorLy8KKy8vICAgMS4gSXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHVzZXItZGVmaW5lZCB0eXBlIHdvcmsgd2l0aAorLy8gICB7QVNTRVJUfEVYUEVDVH1fPz8oKSwgYnV0IHRoYXQgcmVxdWlyZXMgb3ZlcmxvYWRpbmcgdGhlCisvLyAgIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFuZCBpcyB0aHVzIGRpc2NvdXJhZ2VkIGJ5IHRoZSBHb29nbGUgQysrCisvLyAgIFVzYWdlIEd1aWRlLiAgVGhlcmVmb3JlLCB5b3UgYXJlIGFkdmlzZWQgdG8gdXNlIHRoZQorLy8gICB7QVNTRVJUfEVYUEVDVH1fVFJVRSgpIG1hY3JvIHRvIGFzc2VydCB0aGF0IHR3byBvYmplY3RzIGFyZQorLy8gICBlcXVhbC4KKy8vCisvLyAgIDIuIFRoZSB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MgZG8gcG9pbnRlciBjb21wYXJpc29ucyBvbgorLy8gICBwb2ludGVycyAoaW4gcGFydGljdWxhciwgQyBzdHJpbmdzKS4gIFRoZXJlZm9yZSwgaWYgeW91IHVzZSBpdAorLy8gICB3aXRoIHR3byBDIHN0cmluZ3MsIHlvdSBhcmUgdGVzdGluZyBob3cgdGhlaXIgbG9jYXRpb25zIGluIG1lbW9yeQorLy8gICBhcmUgcmVsYXRlZCwgbm90IGhvdyB0aGVpciBjb250ZW50IGlzIHJlbGF0ZWQuICBUbyBjb21wYXJlIHR3byBDCisvLyAgIHN0cmluZ3MgYnkgY29udGVudCwgdXNlIHtBU1NFUlR8RVhQRUNUfV9TVFIqKCkuCisvLworLy8gICAzLiB7QVNTRVJUfEVYUEVDVH1fRVEoZXhwZWN0ZWQsIGFjdHVhbCkgaXMgcHJlZmVycmVkIHRvCisvLyAgIHtBU1NFUlR8RVhQRUNUfV9UUlVFKGV4cGVjdGVkID09IGFjdHVhbCksIGFzIHRoZSBmb3JtZXIgdGVsbHMgeW91CisvLyAgIHdoYXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyB3aGVuIGl0IGZhaWxzLCBhbmQgc2ltaWxhcmx5IGZvciB0aGUKKy8vICAgb3RoZXIgY29tcGFyaXNvbnMuCisvLworLy8gICA0LiBEbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB7QVNTRVJUfEVYUEVDVH1fPz8oKQorLy8gICBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMsIHdoaWNoIGlzIHVuZGVmaW5lZC4KKy8vCisvLyAgIDUuIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vICAgRVhQRUNUX05FKDUsIEZvbygpKTsKKy8vICAgRVhQRUNUX0VRKE5VTEwsIGFfcG9pbnRlcik7CisvLyAgIEFTU0VSVF9MVChpLCBhcnJheV9zaXplKTsKKy8vICAgQVNTRVJUX0dUKHJlY29yZHMuc2l6ZSgpLCAwKSA8PCAiVGhlcmUgaXMgbm8gcmVjb3JkIGxlZnQuIjsKKworI2RlZmluZSBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCisgICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhleHBlY3RlZCk+OjpDb21wYXJlLCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX05FKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJORSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX0xFKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgRVhQRUNUX0xUKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikKKyNkZWZpbmUgRVhQRUNUX0dFKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgRVhQRUNUX0dUKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHVCwgdmFsMSwgdmFsMikKKworI2RlZmluZSBHVEVTVF9BU1NFUlRfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCisgICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhleHBlY3RlZCk+OjpDb21wYXJlLCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX05FKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJORSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0xUKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0dFKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHVCwgdmFsMSwgdmFsMikKKworLy8gRGVmaW5lIG1hY3JvIEdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9YWSB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YKKy8vIEFTU0VSVF9YWSgpLCB3aGljaCBjbGFzaGVzIHdpdGggc29tZSB1c2Vycycgb3duIGNvZGUuCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0VRCisjIGRlZmluZSBBU1NFUlRfRVEodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0VRKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTkUKKyMgZGVmaW5lIEFTU0VSVF9ORSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTkUodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9MRQorIyBkZWZpbmUgQVNTRVJUX0xFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9MRSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xUCisjIGRlZmluZSBBU1NFUlRfTFQodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0xUKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfR0UKKyMgZGVmaW5lIEFTU0VSVF9HRSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfR0UodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9HVAorIyBkZWZpbmUgQVNTRVJUX0dUKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HVCh2YWwxLCB2YWwyKQorI2VuZGlmCisKKy8vIEMtc3RyaW5nIENvbXBhcmlzb25zLiAgQWxsIHRlc3RzIHRyZWF0IE5VTEwgYW5kIGFueSBub24tTlVMTCBzdHJpbmcKKy8vIGFzIGRpZmZlcmVudC4gIFR3byBOVUxMcyBhcmUgZXF1YWwuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSRVEoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgPT0gczIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUk5FKHMxLCBzMik6ICAgICBUZXN0cyB0aGF0IHMxICE9IHMyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEoczEsIHMyKTogVGVzdHMgdGhhdCBzMSA9PSBzMiwgaWdub3JpbmcgY2FzZQorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FKHMxLCBzMik6IFRlc3RzIHRoYXQgczEgIT0gczIsIGlnbm9yaW5nIGNhc2UKKy8vCisvLyBGb3Igd2lkZSBvciBuYXJyb3cgc3RyaW5nIG9iamVjdHMsIHlvdSBjYW4gdXNlIHRoZQorLy8ge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zLgorLy8KKy8vIERvbid0IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkLAorLy8gd2hpY2ggaXMgdW5kZWZpbmVkLgorLy8KKy8vIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgorCisjZGVmaW5lIEVYUEVDVF9TVFJFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9TVFJORShzMSwgczIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQorI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9TVFJDQVNFTkUoczEsIHMyKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKKworI2RlZmluZSBBU1NFUlRfU1RSRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBBU1NFUlRfU1RSTkUoczEsIHMyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSTkUsIHMxLCBzMikKKyNkZWZpbmUgQVNTRVJUX1NUUkNBU0VFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBBU1NFUlRfU1RSQ0FTRU5FKHMxLCBzMilcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRU5FLCBzMSwgczIpCisKKy8vIE1hY3JvcyBmb3IgY29tcGFyaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGZsb2F0IHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBkb3VibGUgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORUFSKHYxLCB2MiwgYWJzX2Vycm9yKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB2MSBhbmQgdjIgYXJlIHdpdGhpbiB0aGUgZ2l2ZW4gZGlzdGFuY2UgdG8gZWFjaCBvdGhlci4KKy8vCisvLyBHb29nbGUgVGVzdCB1c2VzIFVMUC1iYXNlZCBjb21wYXJpc29uIHRvIGF1dG9tYXRpY2FsbHkgcGljayBhIGRlZmF1bHQKKy8vIGVycm9yIGJvdW5kIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBvcGVyYW5kcy4gIFNlZSB0aGUKKy8vIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgaW4gZ3Rlc3QtaW50ZXJuYWwuaCBpZiB5b3UgYXJlCisvLyBpbnRlcmVzdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCisjZGVmaW5lIEVYUEVDVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBBU1NFUlRfRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgQVNTRVJUX0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZG91YmxlPiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgRVhQRUNUX05FQVIodmFsMSwgdmFsMiwgYWJzX2Vycm9yKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMyg6OnRlc3Rpbmc6OmludGVybmFsOjpEb3VibGVOZWFyUHJlZEZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikKKworI2RlZmluZSBBU1NFUlRfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQorCisvLyBUaGVzZSBwcmVkaWNhdGUgZm9ybWF0IGZ1bmN0aW9ucyB3b3JrIG9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcywgYW5kCisvLyBjYW4gYmUgdXNlZCBpbiB7QVNTRVJUfEVYUEVDVH1fUFJFRF9GT1JNQVQyKigpLCBlLmcuCisvLworLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OkRvdWJsZUxFLCBGb28oKSwgNS4wKTsKKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMik7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpOworCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKKy8vIE1hY3JvcyB0aGF0IHRlc3QgZm9yIEhSRVNVTFQgZmFpbHVyZSBhbmQgc3VjY2VzcywgdGhlc2UgYXJlIG9ubHkgdXNlZnVsCisvLyBvbiBXaW5kb3dzLCBhbmQgcmVseSBvbiBXaW5kb3dzIFNESyBtYWNyb3MgYW5kIEFQSXMgdG8gY29tcGlsZS4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfShleHByKQorLy8KKy8vIFdoZW4gZXhwciB1bmV4cGVjdGVkbHkgZmFpbHMgb3Igc3VjY2VlZHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUKKy8vIGV4cGVjdGVkIHJlc3VsdCBhbmQgdGhlIGFjdHVhbCByZXN1bHQgd2l0aCBib3RoIGEgaHVtYW4tcmVhZGFibGUKKy8vIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyB0aGUKKy8vIGhleCByZXN1bHQgY29kZS4KKyMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCisgICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCisKKyMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCisgICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCisKKyMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCisgICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCisKKyMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCisgICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBNYWNyb3MgdGhhdCBleGVjdXRlIHN0YXRlbWVudCBhbmQgY2hlY2sgdGhhdCBpdCBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbAorLy8gZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgorLy8KKy8vICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpOworLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKTsKKy8vICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKSA8PCAiUHJvY2VzcygpIGZhaWxlZCI7CisvLworI2RlZmluZSBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpIFwKKyAgICBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAorICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKworLy8gQ2F1c2VzIGEgdHJhY2UgKGluY2x1ZGluZyB0aGUgc291cmNlIGZpbGUgcGF0aCwgdGhlIGN1cnJlbnQgbGluZQorLy8gbnVtYmVyLCBhbmQgdGhlIGdpdmVuIG1lc3NhZ2UpIHRvIGJlIGluY2x1ZGVkIGluIGV2ZXJ5IHRlc3QgZmFpbHVyZQorLy8gbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29kZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIFRoZSBlZmZlY3QgaXMKKy8vIHVuZG9uZSB3aGVuIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgY3VycmVudCBzY29wZS4KKy8vCisvLyBUaGUgbWVzc2FnZSBhcmd1bWVudCBjYW4gYmUgYW55dGhpbmcgc3RyZWFtYWJsZSB0byBzdGQ6Om9zdHJlYW0uCisvLworLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBpbmNsdWRlIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGFzIHBhcnQKKy8vIG9mIHRoZSBkdW1teSB2YXJpYWJsZSBuYW1lLCB0aHVzIGFsbG93aW5nIG11bHRpcGxlIFNDT1BFRF9UUkFDRSgpcworLy8gdG8gYXBwZWFyIGluIHRoZSBzYW1lIGJsb2NrIC0gYXMgbG9uZyBhcyB0aGV5IGFyZSBvbiBkaWZmZXJlbnQKKy8vIGxpbmVzLgorI2RlZmluZSBTQ09QRURfVFJBQ0UobWVzc2FnZSkgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpTY29wZWRUcmFjZSBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X3RyYWNlXywgX19MSU5FX18pKFwKKyAgICBfX0ZJTEVfXywgX19MSU5FX18sIDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8IChtZXNzYWdlKSkKKworLy8gQ29tcGlsZS10aW1lIGFzc2VydGlvbiBmb3IgdHlwZSBlcXVhbGl0eS4KKy8vIFN0YXRpY0Fzc2VydFR5cGVFcTx0eXBlMSwgdHlwZTI+KCkgY29tcGlsZXMgaWZmIHR5cGUxIGFuZCB0eXBlMiBhcmUKKy8vIHRoZSBzYW1lIHR5cGUuICBUaGUgdmFsdWUgaXQgcmV0dXJucyBpcyBub3QgaW50ZXJlc3RpbmcuCisvLworLy8gSW5zdGVhZCBvZiBtYWtpbmcgU3RhdGljQXNzZXJ0VHlwZUVxIGEgY2xhc3MgdGVtcGxhdGUsIHdlIG1ha2UgaXQgYQorLy8gZnVuY3Rpb24gdGVtcGxhdGUgdGhhdCBpbnZva2VzIGEgaGVscGVyIGNsYXNzIHRlbXBsYXRlLiAgVGhpcworLy8gcHJldmVudHMgYSB1c2VyIGZyb20gbWlzdXNpbmcgU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4gYnkKKy8vIGRlZmluaW5nIG9iamVjdHMgb2YgdGhhdCB0eXBlLgorLy8KKy8vIENBVkVBVDoKKy8vCisvLyBXaGVuIHVzZWQgaW5zaWRlIGEgbWV0aG9kIG9mIGEgY2xhc3MgdGVtcGxhdGUsCisvLyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPigpIGlzIGVmZmVjdGl2ZSBPTkxZIElGIHRoZSBtZXRob2QgaXMKKy8vIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoKKy8vCisvLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBGb28geworLy8gICAgcHVibGljOgorLy8gICAgIHZvaWQgQmFyKCkgeyB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBUPigpOyB9CisvLyAgIH07CisvLworLy8gdGhlIGNvZGU6CisvLworLy8gICB2b2lkIFRlc3QxKCkgeyBGb288Ym9vbD4gZm9vOyB9CisvLworLy8gd2lsbCBOT1QgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciwgYXMgRm9vPGJvb2w+OjpCYXIoKSBpcyBuZXZlcgorLy8gYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6CisvLworLy8gICB2b2lkIFRlc3QyKCkgeyBGb288Ym9vbD4gZm9vOyBmb28uQmFyKCk7IH0KKy8vCisvLyB0byBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2Jvb2wgU3RhdGljQXNzZXJ0VHlwZUVxKCkgeworICAodm9pZClpbnRlcm5hbDo6U3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQxLCBUMj4oKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERlZmluZXMgYSB0ZXN0LgorLy8KKy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSwgYW5kIHRoZSBzZWNvbmQKKy8vIHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KKy8vCisvLyBUaGUgY29udmVudGlvbiBpcyB0byBlbmQgdGhlIHRlc3QgY2FzZSBuYW1lIHdpdGggIlRlc3QiLiAgRm9yCisvLyBleGFtcGxlLCBhIHRlc3QgY2FzZSBmb3IgdGhlIEZvbyBjbGFzcyBjYW4gYmUgbmFtZWQgRm9vVGVzdC4KKy8vCisvLyBUaGUgdXNlciBzaG91bGQgcHV0IGhpcyB0ZXN0IGNvZGUgYmV0d2VlbiBicmFjZXMgYWZ0ZXIgdXNpbmcgdGhpcworLy8gbWFjcm8uICBFeGFtcGxlOgorLy8KKy8vICAgVEVTVChGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgeworLy8gICAgIEZvbyBmb287CisvLyAgICAgRVhQRUNUX1RSVUUoZm9vLlN0YXR1c0lzT0soKSk7CisvLyAgIH0KKworLy8gTm90ZSB0aGF0IHdlIGNhbGwgR2V0VGVzdFR5cGVJZCgpIGluc3RlYWQgb2YgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIGhlcmUgdG8gZ2V0IHRoZSB0eXBlIElEIG9mIHRlc3Rpbmc6OlRlc3QuICBUaGlzCisvLyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMKKy8vIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyCisvLyB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yIGZyb20gdXNlciB0ZXN0CisvLyBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZQorLy8gdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlIEdvb2dsZSBUZXN0CisvLyBmcmFtZXdvcmsuCisjZGVmaW5lIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIFwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUZXN0VHlwZUlkKCkpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBURVNUKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9URVNUCisjIGRlZmluZSBURVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkKKyNlbmRpZgorCisvLyBEZWZpbmVzIGEgdGVzdCB0aGF0IHVzZXMgYSB0ZXN0IGZpeHR1cmUuCisvLworLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLCB3aGljaAorLy8gYWxzbyBkb3VibGVzIGFzIHRoZSB0ZXN0IGNhc2UgbmFtZS4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZQorLy8gbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KKy8vCisvLyBBIHRlc3QgZml4dHVyZSBjbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGVhcmxpZXIuICBUaGUgdXNlciBzaG91bGQgcHV0CisvLyBoaXMgdGVzdCBjb2RlIGJldHdlZW4gYnJhY2VzIGFmdGVyIHVzaW5nIHRoaXMgbWFjcm8uICBFeGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgIHByb3RlY3RlZDoKKy8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGJfLkFkZEVsZW1lbnQoMyk7IH0KKy8vCisvLyAgICAgRm9vIGFfOworLy8gICAgIEZvbyBiXzsKKy8vICAgfTsKKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgeworLy8gICAgIEVYUEVDVF9UUlVFKGFfLlN0YXR1c0lzT0soKSk7CisvLyAgIH0KKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBSZXR1cm5zRWxlbWVudENvdW50Q29ycmVjdGx5KSB7CisvLyAgICAgRVhQRUNUX0VRKDAsIGFfLnNpemUoKSk7CisvLyAgICAgRVhQRUNUX0VRKDEsIGJfLnNpemUoKSk7CisvLyAgIH0KKworI2RlZmluZSBURVNUX0YodGVzdF9maXh0dXJlLCB0ZXN0X25hbWUpXAorICBHVEVTVF9URVNUXyh0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSwgdGVzdF9maXh0dXJlLCBcCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFR5cGVJZDx0ZXN0X2ZpeHR1cmU+KCkpCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIFVzZSB0aGlzIGZ1bmN0aW9uIGluIG1haW4oKSB0byBydW4gYWxsIHRlc3RzLiAgSXQgcmV0dXJucyAwIGlmIGFsbAorLy8gdGVzdHMgYXJlIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgorLy8KKy8vIFJVTl9BTExfVEVTVFMoKSBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGhhcyBiZWVuCisvLyBwYXJzZWQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHdhcyBmb3JtZXJseSBhIG1hY3JvOyB0aHVzLCBpdCBpcyBpbiB0aGUgZ2xvYmFsCisvLyBuYW1lc3BhY2UgYW5kIGhhcyBhbiBhbGwtY2FwcyBuYW1lLgoraW50IFJVTl9BTExfVEVTVFMoKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOworCitpbmxpbmUgaW50IFJVTl9BTExfVEVTVFMoKSB7CisgIHJldHVybiA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzAyODIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYwpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworR1RFU1RfQVBJXyBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgcHJpbnRmKCJSdW5uaW5nIG1haW4oKSBmcm9tIGd0ZXN0X21haW4uY2NcbiIpOworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTdhNjljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaApAQCAtMCwwICsxLDI5NCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWMgQVBJIGZvciBkZWF0aCB0ZXN0cy4gIEl0IGlzCisvLyAjaW5jbHVkZWQgYnkgZ3Rlc3QuaCBzbyBhIHVzZXIgZG9lc24ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcworLy8gZGlyZWN0bHkuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB0aGUgc3R5bGUgb2YgZGVhdGggdGVzdHMuICBWYWxpZCB2YWx1ZXMgYXJlICJ0aHJlYWRzYWZlIiwKKy8vIG1lYW5pbmcgdGhhdCB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHdpbGwgcmUtZXhlY3V0ZSB0aGUgdGVzdCBiaW5hcnkKKy8vIGZyb20gdGhlIHN0YXJ0LCBydW5uaW5nIG9ubHkgYSBzaW5nbGUgZGVhdGggdGVzdCwgb3IgImZhc3QiLAorLy8gbWVhbmluZyB0aGF0IHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZXhlY3V0ZSB0aGUgdGVzdCBsb2dpYyBpbW1lZGlhdGVseQorLy8gYWZ0ZXIgZm9ya2luZy4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFJldHVybnMgYSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2FsbGVyIGlzIGN1cnJlbnRseQorLy8gZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuICBUb29scyBzdWNoIGFzCisvLyBWYWxncmluZCBoZWFwIGNoZWNrZXJzIG1heSBuZWVkIHRoaXMgdG8gbW9kaWZ5IHRoZWlyIGJlaGF2aW9yIGluIGRlYXRoCisvLyB0ZXN0cy4gIElNUE9SVEFOVDogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5LiAgVXNpbmcgaXQgbWF5IGJyZWFrIHRoZQorLy8gaW1wbGVtZW50YXRpb24gb2YgZGVhdGggdGVzdHMuICBVc2VyIGNvZGUgTVVTVCBOT1QgdXNlIGl0LgorR1RFU1RfQVBJXyBib29sIEluRGVhdGhUZXN0Q2hpbGQoKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVhdGggdGVzdHMuCisKKy8vIEhlcmUncyB3aGF0IGhhcHBlbnMgd2hlbiBhbiBBU1NFUlRfREVBVEgqIG9yIEVYUEVDVF9ERUFUSCogaXMKKy8vIGV4ZWN1dGVkOgorLy8KKy8vICAgMS4gSXQgZ2VuZXJhdGVzIGEgd2FybmluZyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFjdGl2ZQorLy8gICB0aHJlYWQuICBUaGlzIGlzIGJlY2F1c2UgaXQncyBzYWZlIHRvIGZvcmsoKSBvciBjbG9uZSgpIG9ubHkKKy8vICAgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0aHJlYWQuCisvLworLy8gICAyLiBUaGUgcGFyZW50IHByb2Nlc3MgY2xvbmUoKXMgYSBzdWItcHJvY2VzcyBhbmQgcnVucyB0aGUgZGVhdGgKKy8vICAgdGVzdCBpbiBpdDsgdGhlIHN1Yi1wcm9jZXNzIGV4aXRzIHdpdGggY29kZSAwIGF0IHRoZSBlbmQgb2YgdGhlCisvLyAgIGRlYXRoIHRlc3QsIGlmIGl0IGhhc24ndCBleGl0ZWQgYWxyZWFkeS4KKy8vCisvLyAgIDMuIFRoZSBwYXJlbnQgcHJvY2VzcyB3YWl0cyBmb3IgdGhlIHN1Yi1wcm9jZXNzIHRvIHRlcm1pbmF0ZS4KKy8vCisvLyAgIDQuIFRoZSBwYXJlbnQgcHJvY2VzcyBjaGVja3MgdGhlIGV4aXQgY29kZSBhbmQgZXJyb3IgbWVzc2FnZSBvZgorLy8gICB0aGUgc3ViLXByb2Nlc3MuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBBU1NFUlRfREVBVEgoc2VydmVyLlNlbmRNZXNzYWdlKDU2LCAiSGVsbG8iKSwgIkludmFsaWQgcG9ydCBudW1iZXIiKTsKKy8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKy8vICAgICBFWFBFQ1RfREVBVEgoc2VydmVyLlByb2Nlc3NSZXF1ZXN0KGkpLAorLy8gICAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1ZXN0IC4qIGluIFByb2Nlc3NSZXF1ZXN0KCkiKQorLy8gICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGRpZSBvbiByZXF1ZXN0ICIgPDwgaTsKKy8vICAgfQorLy8KKy8vICAgQVNTRVJUX0VYSVQoc2VydmVyLkV4aXROb3coKSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIkV4aXRpbmciKTsKKy8vCisvLyAgIGJvb2wgS2lsbGVkQnlTSUdIVVAoaW50IGV4aXRfY29kZSkgeworLy8gICAgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X2NvZGUpICYmIFdURVJNU0lHKGV4aXRfY29kZSkgPT0gU0lHSFVQOworLy8gICB9CisvLworLy8gICBBU1NFUlRfRVhJVChjbGllbnQuSGFuZ1VwU2VydmVyKCksIEtpbGxlZEJ5U0lHSFVQLCAiSGFuZ2luZyB1cCEiKTsKKy8vCisvLyBPbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGluIGRlYXRoIHRlc3RzOgorLy8KKy8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LAorLy8gICB3aGljaCB1c2VzIHRoZSBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguCisvLworLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleAorLy8gICBzeW50YXggaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBHb29nbGUgVGVzdC4gIFRoaXMgbGltaXRlZAorLy8gICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZW5vdWdoIG1vc3Qgb2YgdGhlIHRpbWUgd2hlbiB3cml0aW5nCisvLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQorLy8gICBvciBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydAorLy8gICB1bmlvbiAoInh8eSIpLCBncm91cGluZyAoIih4eSkiKSwgYnJhY2tldHMgKCJbeHldIiksIGFuZAorLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4KKy8vCisvLyAgIEJlbG93IGlzIHRoZSBzeW50YXggdGhhdCB3ZSBkbyBzdXBwb3J0LiAgV2UgY2hvc2UgaXQgdG8gYmUgYQorLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvCisvLyAgIGxlYXJuIHdoZXJldmVyIHlvdSBjb21lIGZyb20uICBJbiB0aGUgZm9sbG93aW5nOiAnQScgZGVub3RlcyBhCisvLyAgIGxpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKC4pLCBvciBhIHNpbmdsZSBcXCBlc2NhcGUgc2VxdWVuY2U7CisvLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yCisvLyAgIG5hdHVyYWwgbnVtYmVycy4KKy8vCisvLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYworLy8gICAgIFxcZCAgIG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXEQgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXGYgICBtYXRjaGVzIFxmCisvLyAgICAgXFxuICAgbWF0Y2hlcyBcbgorLy8gICAgIFxcciAgIG1hdGNoZXMgXHIKKy8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4KKy8vICAgICBcXFMgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UKKy8vICAgICBcXHQgICBtYXRjaGVzIFx0CisvLyAgICAgXFx2ICAgbWF0Y2hlcyBcdgorLy8gICAgIFxcdyAgIG1hdGNoZXMgYW55IGxldHRlciwgXywgb3IgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcVyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IFxcdyBkb2Vzbid0IG1hdGNoCisvLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uCisvLyAgICAgLiAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgXG4KKy8vICAgICBBPyAgICBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBBCisvLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQorLy8gICAgIEErICAgIG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIEEKKy8vICAgICBeICAgICBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICB4eSAgICBtYXRjaGVzIHggZm9sbG93ZWQgYnkgeQorLy8KKy8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcworLy8gICBub3QgaW1wbGVtZW50ZWQgYnkgdXMsIHlvdSB3aWxsIGdldCBhIHJ1bi10aW1lIGZhaWx1cmUuICBJbiB0aGF0CisvLyAgIGNhc2UsIHBsZWFzZSB0cnkgdG8gcmV3cml0ZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gdGhlCisvLyAgIGFib3ZlIHN5bnRheC4KKy8vCisvLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgKm5vdCogbWVhbnQgdG8gYmUgYXMgaGlnaGx5IHR1bmVkIG9yIHJvYnVzdAorLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQorLy8gICBkZWF0aCB0ZXN0LCB3aGljaCBhbHJlYWR5IGluY3VycyBzaWduaWZpY2FudCBvdmVyaGVhZCBieSBsYXVuY2hpbmcKKy8vICAgYSBjaGlsZCBwcm9jZXNzLgorLy8KKy8vIEtub3duIGNhdmVhdHM6CisvLworLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QKKy8vICAgcHJvZ3JhbSBmcm9tIGFyZ3ZbMF0gYW5kIHJlLWV4ZWN1dGVzIGl0IGluIHRoZSBzdWItcHJvY2Vzcy4gIEZvcgorLy8gICBzaW1wbGljaXR5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSAorLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdAorLy8gICBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lCisvLyAgIHBhdGggc2VwYXJhdG9yIChlLmcuIHBhdGgvdG8vZm9vX3Rlc3QgYW5kCisvLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMKKy8vICAgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBwZW9wbGUgdXN1YWxseSBkb24ndCBwdXQgdGhlIHRlc3QgYmluYXJ5CisvLyAgIGRpcmVjdG9yeSBpbiBQQVRILgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzIHNlYXJjaCB0aGUgUEFUSC4KKworLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuCisvLyBpbnRlZ2VyIGV4aXQgc3RhdHVzIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dAorLy8gdGhhdCBtYXRjaGVzIHJlZ2V4LgorIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCisgICAgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQorLy8gdGVzdCBjYXNlLCBpZiBhbnk6CisjIGRlZmluZSBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKKyAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIGVpdGhlciBieQorLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQorLy8gc2lnbmFsLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0IHRoYXQgbWF0Y2hlcyByZWdleC4KKyMgZGVmaW5lIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIExpa2UgQVNTRVJUX0RFQVRILCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCisvLyB0ZXN0IGNhc2UsIGlmIGFueToKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIFR3byBwcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHtBU1NFUlQsRVhQRUNUfV9FWElUKjoKKworLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4KK2NsYXNzIEdURVNUX0FQSV8gRXhpdGVkV2l0aENvZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXhpdGVkV2l0aENvZGUmIG90aGVyKTsKKworICBjb25zdCBpbnQgZXhpdF9jb2RlXzsKK307CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHRoYXQgYW4gZXhpdCBjb2RlIGRlc2NyaWJlcyBhbiBleGl0IGR1ZSB0byB0ZXJtaW5hdGlvbiBieSBhCisvLyBnaXZlbiBzaWduYWwuCitjbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEtpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pOworICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsKKyBwcml2YXRlOgorICBjb25zdCBpbnQgc2lnbnVtXzsKK307CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgorLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAorLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKKy8vIGluIGRlYnVnIG1vZGUuCisvLworLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQorLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKKy8vCisvLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7CisvLyAgIGlmIChzaWRlZWZmZWN0KSB7CisvLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKKy8vICAgfQorLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOworLy8gICByZXR1cm4gMTI7CisvLyB9CisvLworLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7CisvLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKKy8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KKy8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7CisvLworLy8gI2lmZGVmIE5ERUJVRworLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgorLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworLy8gI2Vsc2UKKy8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgorLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisvLyAjZW5kaWYKKy8vIH0KKy8vCisvLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCisvLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCisvLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91CisvLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0CisvLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCisvLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgorLy8KKy8vIEVYUEVDVF9ERUJVR19ERUFUSCh7CisvLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KKy8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCisvLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKKy8vIH0sICJkZWF0aCIpOworLy8KKyMgaWZkZWYgTkRFQlVHCisKKyMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBHVEVTVF9FWEVDVVRFX1NUQVRFTUVOVF8oc3RhdGVtZW50LCByZWdleCkKKworIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KQorCisjIGVsc2UKKworIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorCisjICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisKKyMgZW5kaWYgIC8vIE5ERUJVRyBmb3IgRVhQRUNUX0RFQlVHX0RFQVRICisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgYW5kCisvLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmCisvLyBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgdGhleSBqdXN0IGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMKKy8vIHVzZWZ1bCB3aGVuIHlvdSBhcmUgY29tYmluaW5nIGRlYXRoIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIG5vcm1hbCB0ZXN0CisvLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0LgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisjIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorI2Vsc2UKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsICkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4NzliYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgTWVzc2FnZSBjbGFzcy4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKy8vIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3BlcmF0b3I8PCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKy8vIFNlZSBNZXNzYWdlJiBvcGVyYXRvcjw8KC4uLikgYmVsb3cgZm9yIHdoeS4KK3ZvaWQgb3BlcmF0b3I8PChjb25zdCB0ZXN0aW5nOjppbnRlcm5hbDo6U2VjcmV0JiwgaW50KTsKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGUgTWVzc2FnZSBjbGFzcyB3b3JrcyBsaWtlIGFuIG9zdHJlYW0gcmVwZWF0ZXIuCisvLworLy8gVHlwaWNhbCB1c2FnZToKKy8vCisvLyAgIDEuIFlvdSBzdHJlYW0gYSBidW5jaCBvZiB2YWx1ZXMgdG8gYSBNZXNzYWdlIG9iamVjdC4KKy8vICAgICAgSXQgd2lsbCByZW1lbWJlciB0aGUgdGV4dCBpbiBhIHN0cmluZ3N0cmVhbS4KKy8vICAgMi4gVGhlbiB5b3Ugc3RyZWFtIHRoZSBNZXNzYWdlIG9iamVjdCB0byBhbiBvc3RyZWFtLgorLy8gICAgICBUaGlzIGNhdXNlcyB0aGUgdGV4dCBpbiB0aGUgTWVzc2FnZSB0byBiZSBzdHJlYW1lZAorLy8gICAgICB0byB0aGUgb3N0cmVhbS4KKy8vCisvLyBGb3IgZXhhbXBsZTsKKy8vCisvLyAgIHRlc3Rpbmc6Ok1lc3NhZ2UgZm9vOworLy8gICBmb28gPDwgMSA8PCAiICE9ICIgPDwgMjsKKy8vICAgc3RkOjpjb3V0IDw8IGZvbzsKKy8vCisvLyB3aWxsIHByaW50ICIxICE9IDIiLgorLy8KKy8vIE1lc3NhZ2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGluaGVyaXRlZCBmcm9tLiAgSW4gcGFydGljdWxhciwgaXRzCisvLyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgorLy8KKy8vIE5vdGUgdGhhdCBzdHJpbmdzdHJlYW0gYmVoYXZlcyBkaWZmZXJlbnRseSBpbiBnY2MgYW5kIGluIE1TVkMuICBZb3UKKy8vIGNhbiBzdHJlYW0gYSBOVUxMIGNoYXIgcG9pbnRlciB0byBpdCBpbiB0aGUgZm9ybWVyLCBidXQgbm90IGluIHRoZQorLy8gbGF0dGVyIChpdCBjYXVzZXMgYW4gYWNjZXNzIHZpb2xhdGlvbiBpZiB5b3UgZG8pLiAgVGhlIE1lc3NhZ2UKKy8vIGNsYXNzIGhpZGVzIHRoaXMgZGlmZmVyZW5jZSBieSB0cmVhdGluZyBhIE5VTEwgY2hhciBwb2ludGVyIGFzCisvLyAiKG51bGwpIi4KK2NsYXNzIEdURVNUX0FQSV8gTWVzc2FnZSB7CisgcHJpdmF0ZToKKyAgLy8gVGhlIHR5cGUgb2YgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIChlbmRsLCBlbmRzLCBhbmQgZmx1c2gpIGZvcgorICAvLyBuYXJyb3cgc3RyZWFtcy4KKyAgdHlwZWRlZiBzdGQ6Om9zdHJlYW0mICgqQmFzaWNOYXJyb3dJb01hbmlwKShzdGQ6Om9zdHJlYW0mKTsKKworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBNZXNzYWdlLgorICBNZXNzYWdlKCk7CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtc2cpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7ICAvLyBOT0xJTlQKKyAgICAqc3NfIDw8IG1zZy5HZXRTdHJpbmcoKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYSBNZXNzYWdlIGZyb20gYSBDLXN0cmluZy4KKyAgZXhwbGljaXQgTWVzc2FnZShjb25zdCBjaGFyKiBzdHIpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7CisgICAgKnNzXyA8PCBzdHI7CisgIH0KKworI2lmIEdURVNUX09TX1NZTUJJQU4KKyAgLy8gU3RyZWFtcyBhIHZhbHVlIChlaXRoZXIgYSBwb2ludGVyIG9yIG5vdCkgdG8gdGhpcyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsdWUpIHsKKyAgICBTdHJlYW1IZWxwZXIodHlwZW5hbWUgaW50ZXJuYWw6OmlzX3BvaW50ZXI8VD46OnR5cGUoKSwgdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2Vsc2UKKyAgLy8gU3RyZWFtcyBhIG5vbi1wb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmIHZhbCkgeworICAgIC8vIFNvbWUgbGlicmFyaWVzIG92ZXJsb2FkIDw8IGZvciBTVEwgY29udGFpbmVycy4gIFRoZXNlCisgICAgLy8gb3ZlcmxvYWRzIGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGluc3RlYWQgb2YgOjpzdGQuCisgICAgLy8KKyAgICAvLyBDKysncyBzeW1ib2wgbG9va3VwIHJ1bGUgKGkuZS4gS29lbmlnIGxvb2t1cCkgc2F5cyB0aGF0IHRoZXNlCisgICAgLy8gb3ZlcmxvYWRzIGFyZSB2aXNpYmxlIGluIGVpdGhlciB0aGUgc3RkIG5hbWVzcGFjZSBvciB0aGUgZ2xvYmFsCisgICAgLy8gbmFtZXNwYWNlLCBidXQgbm90IG90aGVyIG5hbWVzcGFjZXMsIGluY2x1ZGluZyB0aGUgdGVzdGluZworICAgIC8vIG5hbWVzcGFjZSB3aGljaCBHb29nbGUgVGVzdCdzIE1lc3NhZ2UgY2xhc3MgaXMgaW4uCisgICAgLy8KKyAgICAvLyBUbyBhbGxvdyBTVEwgY29udGFpbmVycyAoYW5kIG90aGVyIHR5cGVzIHRoYXQgaGFzIGEgPDwgb3BlcmF0b3IKKyAgICAvLyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSB0byBiZSB1c2VkIGluIEdvb2dsZSBUZXN0CisgICAgLy8gYXNzZXJ0aW9ucywgdGVzdGluZzo6TWVzc2FnZSBtdXN0IGFjY2VzcyB0aGUgY3VzdG9tIDw8IG9wZXJhdG9yCisgICAgLy8gZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFdpdGggdGhpcyB1c2luZyBkZWNsYXJhdGlvbiwKKyAgICAvLyBvdmVybG9hZHMgb2YgPDwgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBhbmQgdGhvc2UKKyAgICAvLyB2aXNpYmxlIHZpYSBLb2VuaWcgbG9va3VwIGFyZSBib3RoIGV4cG9zZWQgaW4gdGhpcyBmdW5jdGlvbi4KKyAgICB1c2luZyA6Om9wZXJhdG9yIDw8OworICAgICpzc18gPDwgdmFsOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFN0cmVhbXMgYSBwb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0LgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGFuIG92ZXJsb2FkIG9mIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuIHlvdQorICAvLyBzdHJlYW0gYSBwb2ludGVyIHRvIGEgTWVzc2FnZSwgdGhpcyBkZWZpbml0aW9uIHdpbGwgYmUgdXNlZCBhcyBpdAorICAvLyBpcyBtb3JlIHNwZWNpYWxpemVkLiAgKFRoZSBDKysgU3RhbmRhcmQsIHNlY3Rpb24KKyAgLy8gW3RlbXAuZnVuYy5vcmRlcl0uKSAgSWYgeW91IHN0cmVhbSBhIG5vbi1wb2ludGVyLCB0aGVuIHRoZQorICAvLyBwcmV2aW91cyBkZWZpbml0aW9uIHdpbGwgYmUgdXNlZC4KKyAgLy8KKyAgLy8gVGhlIHJlYXNvbiBmb3IgdGhpcyBvdmVybG9hZCBpcyB0aGF0IHN0cmVhbWluZyBhIE5VTEwgcG9pbnRlciB0bworICAvLyBvc3RyZWFtIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4gIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIsIHlvdQorICAvLyBtYXkgZ2V0ICIwIiwgIihuaWwpIiwgIihudWxsKSIsIG9yIGFuIGFjY2VzcyB2aW9sYXRpb24uICBUbworICAvLyBlbnN1cmUgY29uc2lzdGVudCByZXN1bHQgYWNyb3NzIGNvbXBpbGVycywgd2UgYWx3YXlzIHRyZWF0IE5VTEwKKyAgLy8gYXMgIihudWxsKSIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoVCogY29uc3QmIHBvaW50ZXIpIHsgIC8vIE5PTElOVAorICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKKyAgICAgICpzc18gPDwgIihudWxsKSI7CisgICAgfSBlbHNlIHsKKyAgICAgICpzc18gPDwgcG9pbnRlcjsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBTaW5jZSB0aGUgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIGFyZSBvdmVybG9hZGVkIGZvciBib3RoIG5hcnJvdworICAvLyBhbmQgd2lkZSBzdHJlYW1zLCB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyBzcGVjaWFsaXplZCBkZWZpbml0aW9uCisgIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgLy8gdGVtcGxhdGl6ZWQgdmVyc2lvbiBhYm92ZS4gIFdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLCBzdHJlYW1pbmcKKyAgLy8gZW5kbCBvciBvdGhlciBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgdG8gTWVzc2FnZSB3aWxsIGNvbmZ1c2UgdGhlCisgIC8vIGNvbXBpbGVyLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChCYXNpY05hcnJvd0lvTWFuaXAgdmFsKSB7CisgICAgKnNzXyA8PCB2YWw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChib29sIGIpIHsKKyAgICByZXR1cm4gKnRoaXMgPDwgKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorCisgIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKKyAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwod2NoYXJfdCogd2lkZV9jX3N0cik7CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKyAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKyAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworICAvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorICAvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworICAvLyBHZXRzIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IHNvIGZhciBhcyBhbiBzdGQ6OnN0cmluZy4KKyAgLy8gRWFjaCAnXDAnIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisgIC8vCisgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Q7CisKKyBwcml2YXRlOgorCisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAvLyBUaGVzZSBhcmUgbmVlZGVkIGFzIHRoZSBOb2tpYSBTeW1iaWFuIENvbXBpbGVyIGNhbm5vdCBkZWNpZGUgYmV0d2VlbgorICAvLyBjb25zdCBUJiBhbmQgY29uc3QgVCogaW4gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gVGhlIE5va2lhIGNvbXBpbGVyIF9jYW5fCisgIC8vIGRlY2lkZSBiZXR3ZWVuIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgVCBhbmQgVCosIHNvIGEKKyAgLy8gdHIxOjp0eXBlX3RyYWl0cy1saWtlIGlzX3BvaW50ZXIgd29ya3MsIGFuZCB3ZSBjYW4gb3ZlcmxvYWQgb24gdGhhdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6dHJ1ZV90eXBlIC8qaXNfcG9pbnRlciovLCBUKiBwb2ludGVyKSB7CisgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgKnNzXyA8PCAiKG51bGwpIjsKKyAgICB9IGVsc2UgeworICAgICAgKnNzXyA8PCBwb2ludGVyOworICAgIH0KKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgU3RyZWFtSGVscGVyKGludGVybmFsOjpmYWxzZV90eXBlIC8qaXNfcG9pbnRlciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdmFsdWUpIHsKKyAgICAvLyBTZWUgdGhlIGNvbW1lbnRzIGluIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmKSBhYm92ZSBmb3Igd2h5CisgICAgLy8gd2UgbmVlZCB0aGlzIHVzaW5nIHN0YXRlbWVudC4KKyAgICB1c2luZyA6Om9wZXJhdG9yIDw8OworICAgICpzc18gPDwgdmFsdWU7CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgorCisgIC8vIFdlJ2xsIGhvbGQgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3QgaGVyZS4KKyAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmdzdHJlYW0+IHNzXzsKKworICAvLyBXZSBkZWNsYXJlIChidXQgZG9uJ3QgaW1wbGVtZW50KSB0aGlzIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCisgIC8vIGZyb20gaW1wbGVtZW50aW5nIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJik7Cit9OworCisvLyBTdHJlYW1zIGEgTWVzc2FnZSB0byBhbiBvc3RyZWFtLgoraW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTWVzc2FnZSYgc2IpIHsKKyAgcmV0dXJuIG9zIDw8IHNiLkdldFN0cmluZygpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYW4gc3RkOjpzdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIFN0cmVhbWFibGVUb1N0cmluZyhjb25zdCBUJiBzdHJlYW1hYmxlKSB7CisgIHJldHVybiAoTWVzc2FnZSgpIDw8IHN0cmVhbWFibGUpLkdldFN0cmluZygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjcwMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaApAQCAtMCwwICsxLDE0MjEgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC1wYXJhbS10ZXN0LmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworCisKKy8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50CisvLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4KKy8vCisvLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6CisKKyNpZiAwCisKKy8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKKy8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKKy8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgorLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQorLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKy8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KK307CisKKy8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgorLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KKworVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKKyAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6CisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKKyAgLi4uCit9CisKK1RFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgeworICAuLi4KK30KKworLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKKy8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKKy8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAorLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAorLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6CisvLworLy8KKy8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KKy8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCisvLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKKy8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgorLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCisvLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgorLy8KKy8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93CisvLyBpbiB0aGlzIGZpbGUuCisvLworLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQorLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7CisKKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQorLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisvLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKKy8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKKy8vIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKKy8vCisvLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KKy8vCisvLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKKy8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6CisKK2NvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7CisKKy8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cworLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgorLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KKy8vCisvLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKKy8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgorLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgorLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCisvLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0CisvLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgorLy8KKy8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCisvLyBmb3IgbW9yZSBleGFtcGxlcy4KKy8vCisvLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgorLy8KKy8vCisvLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KKy8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisvLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKKy8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQorLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAorLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6CisKK2NsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAorICAvLyBmaXh0dXJlIGhlcmUuCit9OworCitjbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCit9OworCitURVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgeworICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCit9CisKK1RFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworfQorCisjZW5kaWYgIC8vIDAKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmICFHVEVTVF9PU19TWU1CSUFOCisjIGluY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAorLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCisvLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgorLy8KKy8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKKy8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07CisvLworLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7CisvLyB9CisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKKy8vCisKKy8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCisvLworLy8gU3lub3BzaXM6CisvLyBSYW5nZShzdGFydCwgZW5kKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKKy8vICAgICBzdGFydCsyLCAuLi4sIH0uCisvLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKKy8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KKy8vIE5vdGVzOgorLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCisvLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKKy8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgorLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCisvLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KKy8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgorLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KKy8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKKy8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCisgICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKKyAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOworfQorCisvLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQorLy8gYSBjb250YWluZXIuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhIEMtc3R5bGUgYXJyYXkuCisvLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KKy8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCisvLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCisvLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6CisvLworLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0CisvLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6CisvLworLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKKy8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKKy8vICAgdi5wdXNoX2JhY2soImEiKTsKKy8vICAgdi5wdXNoX2JhY2soImIiKTsKKy8vICAgcmV0dXJuIHY7CisvLyB9CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOworLy8KKy8vCisvLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0CisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKKy8vCisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKKy8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKKy8vICAgcmV0dXJuIGxpc3Q7CisvLyB9CisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOworLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+CisgICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOworICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCisgICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKKyAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOworfQorCisvLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKKy8vIHBhcmFtZXRlcnMuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCisvLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KKy8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKKy8vCisvLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byA1MCBwYXJhbWV0ZXJzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4gVmFsdWVzKFQxIHYxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE8VDE+KHYxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+IFZhbHVlcyhUMSB2MSwgVDIgdjIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+KHYxLCB2Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzPFQxLCBUMiwgVDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4odjEsIHYyLCB2Myk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ8VDEsIFQyLCBUMywgVDQ+KHYxLCB2MiwgdjMsIHY0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NTxUMSwgVDIsIFQzLCBUNCwgVDU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4odjEsIHYyLCB2MywgdjQsIHY1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsCisgICAgICB2NiwgdjcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBWYWx1ZXMoVDEgdjEsCisgICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwKKyAgICBUMTE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAorICAgICAgVDExPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgVDEyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgVDEzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAorICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LAorICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCisgICAgICB2MjAsIHYyMSwgdjIyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4odjEsIHYyLCB2MywKKyAgICAgIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+KHYxLCB2MiwKKyAgICAgIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LAorICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFZhbHVlcyhUMSB2MSwKKyAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsCisgICAgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwKKyAgICBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+KHYxLAorICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywKKyAgICAgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgVDI2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAorICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgVDI3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LAorICAgICAgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICBUMjg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywKKyAgICAgIHYyOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LAorICAgICAgdjI3LCB2MjgsIHYyOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCisgICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCisgICAgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCisgICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwKKyAgICAgIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsCisgICAgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsCisgICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwKKyAgICBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLAorICAgIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsCisgICAgICB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwKKyAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsCisgICAgICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCisgICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2LCB2MzcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcsIFQzOCB2MzgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4odjEsIHYyLAorICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCisgICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwKKyAgICAgIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAorICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsCisgICAgICB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVmFsdWVzKFQxIHYxLAorICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKKyAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAorICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsCisgICAgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwKKyAgICBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwKKyAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LAorICAgICAgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgIFQ0MT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCisgICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwKKyAgICAgIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgIFQ0Mj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAorICAgICAgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsCisgICAgICB2NDIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgVDQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCisgICAgICB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwKKyAgICAgIHY0MSwgdjQyLCB2NDMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0ND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKKyAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAorICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksCisgICAgICB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKKyAgICBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsCisgICAgICB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksCisgICAgICB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LAorICAgICAgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCisgICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LAorICAgIFQ0OCB2NDgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKKyAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LAorICAgICAgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsIHY0OCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAorICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCisgICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwKKyAgICBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LAorICAgIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKKyAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LAorICAgICAgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LAorICAgIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsCisgICAgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSwgVDUwIHY1MCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsCisgICAgICB2NDgsIHY0OSwgdjUwKTsKK30KKworLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgorLy8KKy8vIFN5bm9wc2lzOgorLy8gQm9vbCgpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KKy8vCisvLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucworLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCisvLyBDb21iaW5lKCkgZnVuY3Rpb24uCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0CisvLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKKy8vCitpbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7CisgIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisvLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKKy8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCisvLworLy8gU3lub3BzaXM6CisvLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQorLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5CisvLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgorLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKKy8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCisvLworLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAxMCBhcmd1bWVudHMuIFRoaXMgbnVtYmVyIGlzIGN1cnJlbnRseSBsaW1pdGVkCisvLyBieSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHR1cGxlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgR29vZ2xlCisvLyBUZXN0LgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIHRlc3QgY2FzZSBBbmltYWxUZXN0IGVhY2ggb25lIHdpdGgKKy8vIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHR1cGxlKCJjYXQiLCBCTEFDSyksIHR1cGxlKCJjYXQiLCBXSElURSksCisvLyB0dXBsZSgiZG9nIiwgQkxBQ0spLCBhbmQgdHVwbGUoImRvZyIsIFdISVRFKToKKy8vCisvLyBlbnVtIENvbG9yIHsgQkxBQ0ssIEdSQVksIFdISVRFIH07CisvLyBjbGFzcyBBbmltYWxUZXN0CisvLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxjb25zdCBjaGFyKiwgQ29sb3I+ID4gey4uLn07CisvLworLy8gVEVTVF9QKEFuaW1hbFRlc3QsIEFuaW1hbExvb2tzTmljZSkgey4uLn0KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbmltYWxWYXJpYXRpb25zLCBBbmltYWxUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShWYWx1ZXMoImNhdCIsICJkb2ciKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEJMQUNLLCBXSElURSkpKTsKKy8vCisvLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gRmxhZ0RlcGVuZGVudFRlc3Qgd2l0aCBhbGwgdmFyaWF0aW9ucyBvZiB0d28KKy8vIEJvb2xlYW4gZmxhZ3M6CisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QKKy8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGJvb2wsIGJvb2w+ID4geworLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisvLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7CisvLyAgIH0KKy8vIH07CisvLworLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKKy8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjI+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPigKKyAgICAgIGcxLCBnMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMykgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+KAorICAgICAgZzEsIGcyLCBnMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQ+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQ+KAorICAgICAgZzEsIGcyLCBnMywgZzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNz4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwKKyAgICBHZW5lcmF0b3I5PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjEwPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCisgICAgR2VuZXJhdG9yMTA+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKKyAgICAgIEdlbmVyYXRvcjEwPigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisKKworIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKKyAgIHB1YmxpYzogXAorICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgIHByaXZhdGU6IFwKKyAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdFBhdHRlcm4oXAorICAgICAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4oKSk7IFwKKyAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgc3RhdGljIGludCBndGVzdF9yZWdpc3RlcmluZ19kdW1teV87IFwKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKKyAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwKKyAgfTsgXAorICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpBZGRUb1JlZ2lzdHJ5KCk7IFwKKyAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvcikgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCisgICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCisgIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gPSBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCisgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKKyAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzkzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKQEAgLTAsMCArMSw0ODcgQEAKKyQkIC0qLSBtb2RlOiBjKys7IC0qLQorJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIFZhbHVlcyBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgorJHZhciBtYXh0dXBsZSA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiBDb21iaW5lIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworCisKKy8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50CisvLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4KKy8vCisvLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6CisKKyNpZiAwCisKKy8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKKy8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKKy8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgorLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQorLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKy8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KK307CisKKy8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgorLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KKworVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKKyAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6CisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKKyAgLi4uCit9CisKK1RFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgeworICAuLi4KK30KKworLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKKy8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKKy8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAorLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAorLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6CisvLworLy8KKy8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KKy8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCisvLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKKy8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgorLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCisvLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgorLy8KKy8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93CisvLyBpbiB0aGlzIGZpbGUuCisvLworLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQorLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7CisKKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQorLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisvLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKKy8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKKy8vIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKKy8vCisvLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KKy8vCisvLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKKy8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6CisKK2NvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7CisKKy8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cworLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgorLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KKy8vCisvLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKKy8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgorLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgorLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCisvLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0CisvLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgorLy8KKy8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCisvLyBmb3IgbW9yZSBleGFtcGxlcy4KKy8vCisvLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgorLy8KKy8vCisvLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KKy8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisvLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKKy8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQorLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAorLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6CisKK2NsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAorICAvLyBmaXh0dXJlIGhlcmUuCit9OworCitjbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCit9OworCitURVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgeworICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCit9CisKK1RFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworfQorCisjZW5kaWYgIC8vIDAKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmICFHVEVTVF9PU19TWU1CSUFOCisjIGluY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAorLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCisvLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgorLy8KKy8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKKy8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07CisvLworLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7CisvLyB9CisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKKy8vCisKKy8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCisvLworLy8gU3lub3BzaXM6CisvLyBSYW5nZShzdGFydCwgZW5kKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKKy8vICAgICBzdGFydCsyLCAuLi4sIH0uCisvLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKKy8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KKy8vIE5vdGVzOgorLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCisvLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKKy8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgorLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCisvLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KKy8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgorLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KKy8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKKy8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCisgICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKKyAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOworfQorCisvLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQorLy8gYSBjb250YWluZXIuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhIEMtc3R5bGUgYXJyYXkuCisvLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KKy8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCisvLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCisvLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6CisvLworLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0CisvLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6CisvLworLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKKy8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKKy8vICAgdi5wdXNoX2JhY2soImEiKTsKKy8vICAgdi5wdXNoX2JhY2soImIiKTsKKy8vICAgcmV0dXJuIHY7CisvLyB9CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOworLy8KKy8vCisvLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0CisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKKy8vCisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKKy8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKKy8vICAgcmV0dXJuIGxpc3Q7CisvLyB9CisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOworLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+CisgICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOworICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCisgICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKKyAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOworfQorCisvLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKKy8vIHBhcmFtZXRlcnMuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCisvLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KKy8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKKy8vCisvLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byAkbiBwYXJhbWV0ZXJzLgorLy8KKyRyYW5nZSBpIDEuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkkaTwkZm9yIGosIFtbVCRqXV0+IFZhbHVlcygkZm9yIGosIFtbVCRqIHYkal1dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheSRpPCRmb3IgaiwgW1tUJGpdXT4oJGZvciBqLCBbW3Ykal1dKTsKK30KKworXV0KKworLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgorLy8KKy8vIFN5bm9wc2lzOgorLy8gQm9vbCgpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KKy8vCisvLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucworLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCisvLyBDb21iaW5lKCkgZnVuY3Rpb24uCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0CisvLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKKy8vCitpbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7CisgIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisvLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKKy8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCisvLworLy8gU3lub3BzaXM6CisvLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQorLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5CisvLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgorLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKKy8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCisvLworLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAkbWF4dHVwbGUgYXJndW1lbnRzLiBUaGlzIG51bWJlciBpcyBjdXJyZW50bHkgbGltaXRlZAorLy8gYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0dXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEdvb2dsZQorLy8gVGVzdC4KKy8vCisvLyBFeGFtcGxlOgorLy8KKy8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiB0ZXN0IGNhc2UgQW5pbWFsVGVzdCBlYWNoIG9uZSB3aXRoCisvLyB0aGUgcGFyYW1ldGVyIHZhbHVlcyB0dXBsZSgiY2F0IiwgQkxBQ0spLCB0dXBsZSgiY2F0IiwgV0hJVEUpLAorLy8gdHVwbGUoImRvZyIsIEJMQUNLKSwgYW5kIHR1cGxlKCJkb2ciLCBXSElURSk6CisvLworLy8gZW51bSBDb2xvciB7IEJMQUNLLCBHUkFZLCBXSElURSB9OworLy8gY2xhc3MgQW5pbWFsVGVzdAorLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Y29uc3QgY2hhciosIENvbG9yPiA+IHsuLi59OworLy8KKy8vIFRFU1RfUChBbmltYWxUZXN0LCBBbmltYWxMb29rc05pY2UpIHsuLi59CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5pbWFsVmFyaWF0aW9ucywgQW5pbWFsVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoVmFsdWVzKCJjYXQiLCAiZG9nIiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhCTEFDSywgV0hJVEUpKSk7CisvLworLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIEZsYWdEZXBlbmRlbnRUZXN0IHdpdGggYWxsIHZhcmlhdGlvbnMgb2YgdHdvCisvLyBCb29sZWFuIGZsYWdzOgorLy8KKy8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0CisvLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxib29sLCBib29sPiA+IHsKKy8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworLy8gICAgIC8vIEFzc2lnbnMgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgdmFsdWVzIGZyb20gdGhlIHR1cGxlLgorLy8gICAgIHRpZShleHRlcm5hbF9mbGFnXzEsIGV4dGVybmFsX2ZsYWdfMikgPSBHZXRQYXJhbSgpOworLy8gICB9CisvLyB9OworLy8KKy8vIFRFU1RfUChGbGFnRGVwZW5kZW50VGVzdCwgVGVzdEZlYXR1cmUxKSB7CisvLyAgIC8vIFRlc3QgeW91ciBjb2RlIHVzaW5nIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIGhlcmUuCisvLyB9CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUd29Cb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShCb29sKCksIEJvb2woKSkpOworLy8KKyRyYW5nZSBpIDIuLm1heHR1cGxlCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKwordGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBHZW5lcmF0b3Ikal1dPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIkaTwkZm9yIGosIFtbR2VuZXJhdG9yJGpdXT4gQ29tYmluZSgKKyAgICAkZm9yIGosIFtbY29uc3QgR2VuZXJhdG9yJGomIGckal1dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlciRpPCRmb3IgaiwgW1tHZW5lcmF0b3Ikal1dPigKKyAgICAgICRmb3IgaiwgW1tnJGpdXSk7Cit9CisKK11dCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisKKworIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKKyAgIHB1YmxpYzogXAorICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgIHByaXZhdGU6IFwKKyAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdFBhdHRlcm4oXAorICAgICAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4oKSk7IFwKKyAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgc3RhdGljIGludCBndGVzdF9yZWdpc3RlcmluZ19kdW1teV87IFwKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKKyAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwKKyAgfTsgXAorICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpBZGRUb1JlZ2lzdHJ5KCk7IFwKKyAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvcikgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCisgICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCisgIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gPSBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCisgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKKyAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM5ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKQEAgLTAsMCArMSw4NTUgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKKy8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6CisvLworLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7CisvLworLy8gQSB1c2VyIGNhbiB0ZWFjaCB0aGlzIGZ1bmN0aW9uIGhvdyB0byBwcmludCBhIGNsYXNzIHR5cGUgVCBieQorLy8gZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoKSBvciBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB0aGF0CisvLyBkZWZpbmVzIFQuICBNb3JlIHNwZWNpZmljYWxseSwgdGhlIEZJUlNUIGRlZmluZWQgZnVuY3Rpb24gaW4gdGhlCisvLyBmb2xsb3dpbmcgbGlzdCB3aWxsIGJlIHVzZWQgKGFzc3VtaW5nIFQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UKKy8vIGZvbyk6CisvLworLy8gICAxLiBmb286OlByaW50VG8oY29uc3QgVCYsIG9zdHJlYW0qKQorLy8gICAyLiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBUJikgZGVmaW5lZCBpbiBlaXRoZXIgZm9vIG9yIHRoZQorLy8gICAgICBnbG9iYWwgbmFtZXNwYWNlLgorLy8KKy8vIElmIG5vbmUgb2YgdGhlIGFib3ZlIGlzIGRlZmluZWQsIGl0IHdpbGwgcHJpbnQgdGhlIGRlYnVnIHN0cmluZyBvZgorLy8gdGhlIHZhbHVlIGlmIGl0IGlzIGEgcHJvdG9jb2wgYnVmZmVyLCBvciBwcmludCB0aGUgcmF3IGJ5dGVzIGluIHRoZQorLy8gdmFsdWUgb3RoZXJ3aXNlLgorLy8KKy8vIFRvIGFpZCBkZWJ1Z2dpbmc6IHdoZW4gVCBpcyBhIHJlZmVyZW5jZSB0eXBlLCB0aGUgYWRkcmVzcyBvZiB0aGUKKy8vIHZhbHVlIGlzIGFsc28gcHJpbnRlZDsgd2hlbiBUIGlzIGEgKGNvbnN0KSBjaGFyIHBvaW50ZXIsIGJvdGggdGhlCisvLyBwb2ludGVyIHZhbHVlIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGl0IHBvaW50cyB0byBhcmUKKy8vIHByaW50ZWQuCisvLworLy8gV2UgYWxzbyBwcm92aWRlIHNvbWUgY29udmVuaWVudCB3cmFwcGVyczoKKy8vCisvLyAgIC8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nLiAgRm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhcgorLy8gICAvLyBwb2ludGVyLCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcworLy8gICAvLyBwcmludGVkLgorLy8gICBzdGQ6OnN0cmluZyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOworLy8KKy8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkCisvLyAgIC8vIHZhbHVlIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyCisvLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzCisvLyAgIC8vIHByaW50ZWQuCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgb3N0cmVhbSopOworLy8KKy8vICAgLy8gUHJpbnRzIHZhbHVlIHVzaW5nIHRoZSB0eXBlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIFRoZSBkaWZmZXJlbmNlCisvLyAgIC8vIGZyb20gVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBwcmludHMgYm90aCB0aGUKKy8vICAgLy8gcG9pbnRlciBhbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyIHBvaW50ZXIuCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIG9zdHJlYW0qKTsKKy8vCisvLyAgIC8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQorLy8gICAvLyBlbGVtZW50IGZvciBlYWNoIGZpZWxkLiBUdXBsZSBzdXBwb3J0IG11c3QgYmUgZW5hYmxlZCBpbgorLy8gICAvLyBndGVzdC1wb3J0LmguCisvLyAgIHN0ZDo6dmVjdG9yPHN0cmluZz4gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAorLy8gICAgICAgY29uc3QgVHVwbGUmIHZhbHVlKTsKKy8vCisvLyBLbm93biBsaW1pdGF0aW9uOgorLy8KKy8vIFRoZSBwcmludCBwcmltaXRpdmVzIHByaW50IHRoZSBlbGVtZW50cyBvZiBhbiBTVEwtc3R5bGUgY29udGFpbmVyCisvLyB1c2luZyB0aGUgY29tcGlsZXItaW5mZXJyZWQgdHlwZSBvZiAqaXRlciB3aGVyZSBpdGVyIGlzIGEKKy8vIGNvbnN0X2l0ZXJhdG9yIG9mIHRoZSBjb250YWluZXIuICBXaGVuIGNvbnN0X2l0ZXJhdG9yIGlzIGFuIGlucHV0CisvLyBpdGVyYXRvciBidXQgbm90IGEgZm9yd2FyZCBpdGVyYXRvciwgdGhpcyBpbmZlcnJlZCB0eXBlIG1heSBub3QKKy8vIG1hdGNoIHZhbHVlX3R5cGUsIGFuZCB0aGUgcHJpbnQgb3V0cHV0IG1heSBiZSBpbmNvcnJlY3QuICBJbgorLy8gcHJhY3RpY2UsIHRoaXMgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBmb3IgbW9zdCBjb250YWluZXJzCisvLyBjb25zdF9pdGVyYXRvciBpcyBhIGZvcndhcmQgaXRlcmF0b3IuICBXZSdsbCBmaXggdGhpcyBpZiB0aGVyZSdzIGFuCisvLyBhY3R1YWwgbmVlZCBmb3IgaXQuICBOb3RlIHRoYXQgdGhpcyBmaXggY2Fubm90IHJlbHkgb24gdmFsdWVfdHlwZQorLy8gYmVpbmcgZGVmaW5lZCBhcyBtYW55IHVzZXItZGVmaW5lZCBjb250YWluZXIgdHlwZXMgZG9uJ3QgaGF2ZQorLy8gdmFsdWVfdHlwZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KKworI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBEZWZpbml0aW9ucyBpbiB0aGUgJ2ludGVybmFsJyBhbmQgJ2ludGVybmFsMicgbmFtZSBzcGFjZXMgYXJlCisvLyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIERPIE5PVCBVU0UgVEhFTSBJTiBVU0VSIENPREUhCituYW1lc3BhY2UgaW50ZXJuYWwyIHsKKworLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgZ2l2ZW4KKy8vIG9zdHJlYW0uCitHVEVTVF9BUElfIHZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBGb3Igc2VsZWN0aW5nIHdoaWNoIHByaW50ZXIgdG8gdXNlIHdoZW4gYSBnaXZlbiB0eXBlIGhhcyBuZWl0aGVyIDw8CisvLyBub3IgUHJpbnRUbygpLgorZW51bSBUeXBlS2luZCB7CisgIGtQcm90b2J1ZiwgICAgICAgICAgICAgIC8vIGEgcHJvdG9idWYgdHlwZQorICBrQ29udmVydGlibGVUb0ludGVnZXIsICAvLyBhIHR5cGUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGEgbmFtZWQgb3IgdW5uYW1lZCBlbnVtIHR5cGUpCisgIGtPdGhlclR5cGUgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGVsc2UKK307CisKKy8vIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtUeXBlS2luZD46OlByaW50VmFsdWUodmFsdWUsIG9zKSBpcyBjYWxsZWQKKy8vIGJ5IHRoZSB1bml2ZXJzYWwgcHJpbnRlciB0byBwcmludCBhIHZhbHVlIG9mIHR5cGUgVCB3aGVuIG5laXRoZXIKKy8vIG9wZXJhdG9yPDwgbm9yIFByaW50VG8oKSBpcyBkZWZpbmVkIGZvciBULCB3aGVyZSBrVHlwZUtpbmQgaXMgdGhlCisvLyAia2luZCIgb2YgVCBhcyBkZWZpbmVkIGJ5IGVudW0gVHlwZUtpbmQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgVHlwZUtpbmQga1R5cGVLaW5kPgorY2xhc3MgVHlwZVdpdGhvdXRGb3JtYXR0ZXIgeworIHB1YmxpYzoKKyAgLy8gVGhpcyBkZWZhdWx0IHZlcnNpb24gaXMgY2FsbGVkIHdoZW4ga1R5cGVLaW5kIGlzIGtPdGhlclR5cGUuCisgIHN0YXRpYyB2b2lkIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFByaW50Qnl0ZXNJbk9iamVjdFRvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KCZ2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZhbHVlKSwgb3MpOworICB9Cit9OworCisvLyBXZSBwcmludCBhIHByb3RvYnVmIHVzaW5nIGl0cyBTaG9ydERlYnVnU3RyaW5nKCkgd2hlbiB0aGUgc3RyaW5nCisvLyBkb2Vzbid0IGV4Y2VlZCB0aGlzIG1hbnkgY2hhcmFjdGVyczsgb3RoZXJ3aXNlIHdlIHByaW50IGl0IHVzaW5nCisvLyBEZWJ1Z1N0cmluZygpIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkuCitjb25zdCBzaXplX3Qga1Byb3RvYnVmT25lTGluZXJNYXhMZW5ndGggPSA1MDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrUHJvdG9idWY+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBzaG9ydF9zdHIgPSB2YWx1ZS5TaG9ydERlYnVnU3RyaW5nKCk7CisgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHByZXR0eV9zdHIgPQorICAgICAgICBzaG9ydF9zdHIubGVuZ3RoKCkgPD0ga1Byb3RvYnVmT25lTGluZXJNYXhMZW5ndGggPworICAgICAgICBzaG9ydF9zdHIgOiAoIlxuIiArIHZhbHVlLkRlYnVnU3RyaW5nKCkpOworICAgICpvcyA8PCAoIjwiICsgcHJldHR5X3N0ciArICI+Iik7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga0NvbnZlcnRpYmxlVG9JbnRlZ2VyPiB7CisgcHVibGljOgorICAvLyBTaW5jZSBUIGhhcyBubyA8PCBvcGVyYXRvciBvciBQcmludFRvKCkgYnV0IGNhbiBiZSBpbXBsaWNpdGx5CisgIC8vIGNvbnZlcnRlZCB0byBCaWdnZXN0SW50LCB3ZSBwcmludCBpdCBhcyBhIEJpZ2dlc3RJbnQuCisgIC8vCisgIC8vIE1vc3QgbGlrZWx5IFQgaXMgYW4gZW51bSB0eXBlIChlaXRoZXIgbmFtZWQgb3IgdW5uYW1lZCksIGluIHdoaWNoCisgIC8vIGNhc2UgcHJpbnRpbmcgaXQgYXMgYW4gaW50ZWdlciBpcyB0aGUgZGVzaXJlZCBiZWhhdmlvci4gIEluIGNhc2UKKyAgLy8gVCBpcyBub3QgYW4gZW51bSwgcHJpbnRpbmcgaXQgYXMgYW4gaW50ZWdlciBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8KKyAgLy8gZ2l2ZW4gdGhhdCBpdCBoYXMgbm8gdXNlci1kZWZpbmVkIHByaW50ZXIuCisgIHN0YXRpYyB2b2lkIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGNvbnN0IGludGVybmFsOjpCaWdnZXN0SW50IGtCaWdJbnQgPSB2YWx1ZTsKKyAgICAqb3MgPDwga0JpZ0ludDsKKyAgfQorfTsKKworLy8gUHJpbnRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4gIElmIHRoZSB2YWx1ZSBpcyBhCisvLyBwcm90b2NvbCBtZXNzYWdlLCBpdHMgZGVidWcgc3RyaW5nIGlzIHByaW50ZWQ7IGlmIGl0J3MgYW4gZW51bSBvcgorLy8gb2YgYSB0eXBlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludCwgaXQncyBwcmludGVkIGFzIGFuCisvLyBpbnRlZ2VyOyBvdGhlcndpc2UgdGhlIGJ5dGVzIGluIHRoZSB2YWx1ZSBhcmUgcHJpbnRlZC4gIFRoaXMgaXMKKy8vIHdoYXQgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBkb2VzIHdoZW4gaXQga25vd3Mgbm90aGluZyBhYm91dAorLy8gdHlwZSBUIGFuZCBUIGhhcyBuZWl0aGVyIDw8IG9wZXJhdG9yIG5vciBQcmludFRvKCkuCisvLworLy8gQSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGZvciBhIGNsYXNzIHR5cGUgRm9vIGJ5IGRlZmluaW5nCisvLyBhIDw8IG9wZXJhdG9yIGluIHRoZSBuYW1lc3BhY2Ugd2hlcmUgRm9vIGlzIGRlZmluZWQuCisvLworLy8gV2UgcHV0IHRoaXMgb3BlcmF0b3IgaW4gbmFtZXNwYWNlICdpbnRlcm5hbDInIGluc3RlYWQgb2YgJ2ludGVybmFsJworLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCBhcyBtdWNoIGNvZGUgaW4gJ2ludGVybmFsJyBuZWVkcyB0bworLy8gdXNlIDw8IGluIFNUTCwgd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCBvdXIgb3duIDw8IHdlcmUgaXQgZGVmaW5lZAorLy8gaW4gJ2ludGVybmFsJy4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBvcGVyYXRvcjw8IHRha2VzIGEgZ2VuZXJpYyBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwKKy8vIENoYXJUcmFpdHM+IHR5cGUgaW5zdGVhZCBvZiB0aGUgbW9yZSByZXN0cmljdGVkIHN0ZDo6b3N0cmVhbS4gIElmCisvLyB3ZSBkZWZpbmUgaXQgdG8gdGFrZSBhbiBzdGQ6Om9zdHJlYW0gaW5zdGVhZCwgd2UnbGwgZ2V0IGFuCisvLyAiYW1iaWd1b3VzIG92ZXJsb2FkcyIgY29tcGlsZXIgZXJyb3Igd2hlbiB0cnlpbmcgdG8gcHJpbnQgYSB0eXBlCisvLyBGb28gdGhhdCBzdXBwb3J0cyBzdHJlYW1pbmcgdG8gc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsCisvLyBDaGFyVHJhaXRzPiwgYXMgdGhlIGNvbXBpbGVyIGNhbm5vdCB0ZWxsIHdoZXRoZXIKKy8vIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgVCYpIG9yCisvLyBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+LCBjb25zdCBGb28mKSBpcyBtb3JlCisvLyBzcGVjaWZpYy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyVHJhaXRzLCB0eXBlbmFtZSBUPgorOjpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9wZXJhdG9yPDwoCisgICAgOjpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLCBjb25zdCBUJiB4KSB7CisgIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsCisgICAgICAoaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgPyBrUHJvdG9idWYgOgorICAgICAgIGludGVybmFsOjpJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCYsIGludGVybmFsOjpCaWdnZXN0SW50Pjo6dmFsdWUgPworICAgICAgIGtDb252ZXJ0aWJsZVRvSW50ZWdlciA6IGtPdGhlclR5cGUpPjo6UHJpbnRWYWx1ZSh4LCAmb3MpOworICByZXR1cm4gb3M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbDIKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIFRoaXMgbmFtZXNwYWNlIE1VU1QgTk9UIEJFIE5FU1RFRCBJTiA6OnRlc3RpbmcsIG9yIHRoZSBuYW1lIGxvb2stdXAKKy8vIG1hZ2ljIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIFVuaXZlcnNhbFByaW50ZXIgd29uJ3Qgd29yay4KK25hbWVzcGFjZSB0ZXN0aW5nX2ludGVybmFsIHsKKworLy8gVXNlZCB0byBwcmludCBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2hlbiB0aGUKKy8vIHVzZXIgZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBEZWZhdWx0UHJpbnROb25Db250YWluZXJUbyhjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIFdpdGggdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQsIGR1cmluZyB1bnF1YWxpZmllZCBuYW1lIGxvb2t1cCwKKyAgLy8gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8IGFwcGVhcnMgYXMgaWYgaXQgd2FzIGRlY2xhcmVkIGluCisgIC8vIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UgdGhhdCBjb250YWlucyBib3RoCisgIC8vIDo6dGVzdGluZ19pbnRlcm5hbCBhbmQgOjp0ZXN0aW5nOjppbnRlcm5hbDIsIGkuZS4gdGhlIGdsb2JhbAorICAvLyBuYW1lc3BhY2UuICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byB0aGUgQysrIFN0YW5kYXJkIHNlY3Rpb24KKyAgLy8gNy4zLjQtMSBbbmFtZXNwYWNlLnVkaXJdLiAgVGhpcyBhbGxvd3MgdXMgdG8gZmFsbCBiYWNrIG9udG8KKyAgLy8gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8IGluIGNhc2UgVCBkb2Vzbid0IGNvbWUgd2l0aCBhIDw8CisgIC8vIG9wZXJhdG9yLgorICAvLworICAvLyBXZSBjYW5ub3Qgd3JpdGUgJ3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8OycsIHdoaWNoCisgIC8vIGdjYyAzLjMgZmFpbHMgdG8gY29tcGlsZSBkdWUgdG8gYSBjb21waWxlciBidWcuCisgIHVzaW5nIG5hbWVzcGFjZSA6OnRlc3Rpbmc6OmludGVybmFsMjsgIC8vIE5PTElOVAorCisgIC8vIEFzc3VtaW5nIFQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UgZm9vLCBpbiB0aGUgbmV4dCBzdGF0ZW1lbnQsCisgIC8vIHRoZSBjb21waWxlciB3aWxsIGNvbnNpZGVyIGFsbCBvZjoKKyAgLy8KKyAgLy8gICAxLiBmb286Om9wZXJhdG9yPDwgKHRoYW5rcyB0byBLb2VuaWcgbG9vay11cCksCisgIC8vICAgMi4gOjpvcGVyYXRvcjw8IChhcyB0aGUgY3VycmVudCBuYW1lc3BhY2UgaXMgZW5jbG9zZWQgaW4gOjopLAorICAvLyAgIDMuIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCAodGhhbmtzIHRvIHRoZSB1c2luZyBzdGF0ZW1lbnQgYWJvdmUpLgorICAvLworICAvLyBUaGUgb3BlcmF0b3I8PCB3aG9zZSB0eXBlIG1hdGNoZXMgVCBiZXN0IHdpbGwgYmUgcGlja2VkLgorICAvLworICAvLyBXZSBkZWxpYmVyYXRlbHkgYWxsb3cgIzIgdG8gYmUgYSBjYW5kaWRhdGUsIGFzIHNvbWV0aW1lcyBpdCdzCisgIC8vIGltcG9zc2libGUgdG8gZGVmaW5lICMxIChlLmcuIHdoZW4gZm9vIGlzIDo6c3RkLCBkZWZpbmluZworICAvLyBhbnl0aGluZyBpbiBpdCBpcyB1bmRlZmluZWQgYmVoYXZpb3IgdW5sZXNzIHlvdSBhcmUgYSBjb21waWxlcgorICAvLyB2ZW5kb3IuKS4KKyAgKm9zIDw8IHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZ19pbnRlcm5hbAorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpIHByaW50cyB0aGUgZ2l2ZW4KKy8vIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLiAgVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0CisvLyAnb3N0cmVhbV9wdHInIGlzIG5vdCBOVUxMLCBvciB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorLy8KKy8vIFdlIGRlZmluZSBVbml2ZXJzYWxQcmludGVyIGFzIGEgY2xhc3MgdGVtcGxhdGUgKGFzIG9wcG9zZWQgdG8gYQorLy8gZnVuY3Rpb24gdGVtcGxhdGUpLCBhcyB3ZSBuZWVkIHRvIHBhcnRpYWxseSBzcGVjaWFsaXplIGl0IGZvcgorLy8gcmVmZXJlbmNlIHR5cGVzLCB3aGljaCBjYW5ub3QgYmUgZG9uZSB3aXRoIGZ1bmN0aW9uIHRlbXBsYXRlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsUHJpbnRlcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFVuaXZlcnNhbFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBVc2VkIHRvIHByaW50IGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2hlbiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZQorLy8gYSBQcmludFRvKCkgZm9yIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIEM+Cit2b2lkIERlZmF1bHRQcmludFRvKElzQ29udGFpbmVyIC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlIC8qIGlzIG5vdCBhIHBvaW50ZXIgKi8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMmIGNvbnRhaW5lciwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIGNvbnN0IHNpemVfdCBrTWF4Q291bnQgPSAzMjsgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byBwcmludC4KKyAgKm9zIDw8ICd7JzsKKyAgc2l6ZV90IGNvdW50ID0gMDsKKyAgZm9yICh0eXBlbmFtZSBDOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOworICAgICAgIGl0ICE9IGNvbnRhaW5lci5lbmQoKTsgKytpdCwgKytjb3VudCkgeworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICpvcyA8PCAnLCc7CisgICAgICBpZiAoY291bnQgPT0ga01heENvdW50KSB7ICAvLyBFbm91Z2ggaGFzIGJlZW4gcHJpbnRlZC4KKyAgICAgICAgKm9zIDw8ICIgLi4uIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgICpvcyA8PCAnICc7CisgICAgLy8gV2UgY2Fubm90IGNhbGwgUHJpbnRUbygqaXQsIG9zKSBoZXJlIGFzIFByaW50VG8oKSBkb2Vzbid0CisgICAgLy8gaGFuZGxlICppdCBiZWluZyBhIG5hdGl2ZSBhcnJheS4KKyAgICBpbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQoKml0LCBvcyk7CisgIH0KKworICBpZiAoY291bnQgPiAwKSB7CisgICAgKm9zIDw8ICcgJzsKKyAgfQorICAqb3MgPDwgJ30nOworfQorCisvLyBVc2VkIHRvIHByaW50IGEgcG9pbnRlciB0aGF0IGlzIG5laXRoZXIgYSBjaGFyIHBvaW50ZXIgbm9yIGEgbWVtYmVyCisvLyBwb2ludGVyLCB3aGVuIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIFByaW50VG8oKSBmb3IgaXQuICAoQSBtZW1iZXIKKy8vIHZhcmlhYmxlIHBvaW50ZXIgb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgZG9lc24ndCByZWFsbHkgcG9pbnQgdG8KKy8vIGEgbG9jYXRpb24gaW4gdGhlIGFkZHJlc3Mgc3BhY2UuICBUaGVpciByZXByZXNlbnRhdGlvbiBpcworLy8gaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIFRoZXJlZm9yZSB0aGV5IHdpbGwgYmUgcHJpbnRlZCBhcyByYXcKKy8vIGJ5dGVzLikKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBEZWZhdWx0UHJpbnRUbyhJc05vdENvbnRhaW5lciAvKiBkdW1teSAqLywKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZV90eXBlIC8qIGlzIGEgcG9pbnRlciAqLywKKyAgICAgICAgICAgICAgICAgICAgVCogcCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIGlmIChwID09IE5VTEwpIHsKKyAgICAqb3MgPDwgIk5VTEwiOworICB9IGVsc2UgeworICAgIC8vIEMrKyBkb2Vzbid0IGFsbG93IGNhc3RpbmcgZnJvbSBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYW55IG9iamVjdAorICAgIC8vIHBvaW50ZXIuCisgICAgLy8KKyAgICAvLyBJc1RydWUoKSBzaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsCisgICAgLy8gInVucmVhY2hhYmxlIGNvZGUiLgorICAgIGlmIChJc1RydWUoSW1wbGljaXRseUNvbnZlcnRpYmxlPFQqLCBjb25zdCB2b2lkKj46OnZhbHVlKSkgeworICAgICAgLy8gVCBpcyBub3QgYSBmdW5jdGlvbiB0eXBlLiAgV2UganVzdCBjYWxsIDw8IHRvIHByaW50IHAsCisgICAgICAvLyByZWx5aW5nIG9uIEFETCB0byBwaWNrIHVwIHVzZXItZGVmaW5lZCA8PCBmb3IgdGhlaXIgcG9pbnRlcgorICAgICAgLy8gdHlwZXMsIGlmIGFueS4KKyAgICAgICpvcyA8PCBwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUIGlzIGEgZnVuY3Rpb24gdHlwZSwgc28gJypvcyA8PCBwJyBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudAorICAgICAgLy8gKGl0IGp1c3QgcHJpbnRzIHAgYXMgYm9vbCkuICBXZSB3YW50IHRvIHByaW50IHAgYXMgYSBjb25zdAorICAgICAgLy8gdm9pZCouICBIb3dldmVyLCB3ZSBjYW5ub3QgY2FzdCBpdCB0byBjb25zdCB2b2lkKiBkaXJlY3RseSwKKyAgICAgIC8vIGV2ZW4gdXNpbmcgcmVpbnRlcnByZXRfY2FzdCwgYXMgZWFybGllciB2ZXJzaW9ucyBvZiBnY2MKKyAgICAgIC8vIChlLmcuIDMuNC41KSBjYW5ub3QgY29tcGlsZSB0aGUgY2FzdCB3aGVuIHAgaXMgYSBmdW5jdGlvbgorICAgICAgLy8gcG9pbnRlci4gIENhc3RpbmcgdG8gVUludDY0IGZpcnN0IHNvbHZlcyB0aGUgcHJvYmxlbS4KKyAgICAgICpvcyA8PCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGludGVybmFsOjpVSW50NjQ+KHApKTsKKyAgICB9CisgIH0KK30KKworLy8gVXNlZCB0byBwcmludCBhIG5vbi1jb250YWluZXIsIG5vbi1wb2ludGVyIHZhbHVlIHdoZW4gdGhlIHVzZXIKKy8vIGRvZXNuJ3QgZGVmaW5lIFByaW50VG8oKSBmb3IgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgRGVmYXVsdFByaW50VG8oSXNOb3RDb250YWluZXIgLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlX3R5cGUgLyogaXMgbm90IGEgcG9pbnRlciAqLywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICA6OnRlc3RpbmdfaW50ZXJuYWw6OkRlZmF1bHRQcmludE5vbkNvbnRhaW5lclRvKHZhbHVlLCBvcyk7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gdmFsdWUgdXNpbmcgdGhlIDw8IG9wZXJhdG9yIGlmIGl0IGhhcyBvbmU7CisvLyBvdGhlcndpc2UgcHJpbnRzIHRoZSBieXRlcyBpbiBpdC4gIFRoaXMgaXMgd2hhdAorLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBkb2VzIHdoZW4gUHJpbnRUbygpIGlzIG5vdCBzcGVjaWFsaXplZAorLy8gb3Igb3ZlcmxvYWRlZCBmb3IgdHlwZSBULgorLy8KKy8vIEEgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBmb3IgYSBjbGFzcyB0eXBlIEZvbyBieSBkZWZpbmluZworLy8gYW4gb3ZlcmxvYWQgb2YgUHJpbnRUbygpIGluIHRoZSBuYW1lc3BhY2Ugd2hlcmUgRm9vIGlzIGRlZmluZWQuICBXZQorLy8gZ2l2ZSB0aGUgdXNlciB0aGlzIG9wdGlvbiBhcyBzb21ldGltZXMgZGVmaW5pbmcgYSA8PCBvcGVyYXRvciBmb3IKKy8vIEZvbyBpcyBub3QgZGVzaXJhYmxlIChlLmcuIHRoZSBjb2Rpbmcgc3R5bGUgbWF5IHByZXZlbnQgZG9pbmcgaXQsCisvLyBvciB0aGVyZSBpcyBhbHJlYWR5IGEgPDwgb3BlcmF0b3IgYnV0IGl0IGRvZXNuJ3QgZG8gd2hhdCB0aGUgdXNlcgorLy8gd2FudHMpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VG8oY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBEZWZhdWx0UHJpbnRUbygpIGlzIG92ZXJsb2FkZWQuICBUaGUgdHlwZSBvZiBpdHMgZmlyc3QgdHdvCisgIC8vIGFyZ3VtZW50cyBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiB3aWxsIGJlIHBpY2tlZC4gIElmIFQgaXMgYW4KKyAgLy8gU1RMLXN0eWxlIGNvbnRhaW5lciwgdGhlIHZlcnNpb24gZm9yIGNvbnRhaW5lciB3aWxsIGJlIGNhbGxlZDsgaWYKKyAgLy8gVCBpcyBhIHBvaW50ZXIsIHRoZSBwb2ludGVyIHZlcnNpb24gd2lsbCBiZSBjYWxsZWQ7IG90aGVyd2lzZSB0aGUKKyAgLy8gZ2VuZXJpYyB2ZXJzaW9uIHdpbGwgYmUgY2FsbGVkLgorICAvLworICAvLyBOb3RlIHRoYXQgd2UgY2hlY2sgZm9yIGNvbnRhaW5lciB0eXBlcyBoZXJlLCBwcmlvciB0byB3ZSBjaGVjaworICAvLyBmb3IgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcyBpbiBvdXIgb3BlcmF0b3I8PC4gIFRoZSByYXRpb25hbGUgaXM6CisgIC8vCisgIC8vIEZvciBwcm90b2NvbCBtZXNzYWdlcywgd2Ugd2FudCB0byBnaXZlIHBlb3BsZSBhIGNoYW5jZSB0bworICAvLyBvdmVycmlkZSBHb29nbGUgTW9jaydzIGZvcm1hdCBieSBkZWZpbmluZyBhIFByaW50VG8oKSBvcgorICAvLyBvcGVyYXRvcjw8LiAgRm9yIFNUTCBjb250YWluZXJzLCBvdGhlciBmb3JtYXRzIGNhbiBiZQorICAvLyBpbmNvbXBhdGlibGUgd2l0aCBHb29nbGUgTW9jaydzIGZvcm1hdCBmb3IgdGhlIGNvbnRhaW5lcgorICAvLyBlbGVtZW50czsgdGhlcmVmb3JlIHdlIGNoZWNrIGZvciBjb250YWluZXIgdHlwZXMgaGVyZSB0byBlbnN1cmUKKyAgLy8gdGhhdCBvdXIgZm9ybWF0IGlzIHVzZWQuCisgIC8vCisgIC8vIFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgRGVmYXVsdFByaW50VG8oKSBpcyBuZWVkZWQgdG8gYnlwYXNzIGEgYnVnCisgIC8vIGluIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIHBpY2tpbmcgdGhlIHJpZ2h0CisgIC8vIG92ZXJsb2FkIGJldHdlZW46CisgIC8vCisgIC8vICAgUHJpbnRUbyhjb25zdCBUJiB4LCAuLi4pOworICAvLyAgIFByaW50VG8oVCogeCwgLi4uKTsKKyAgRGVmYXVsdFByaW50VG8oSXNDb250YWluZXJUZXN0PFQ+KDApLCBpc19wb2ludGVyPFQ+KCksIHZhbHVlLCBvcyk7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgbGlzdCBvZiBQcmludFRvKCkgb3ZlcmxvYWRzIHRlbGxzCisvLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGhvdyB0byBwcmludCBzdGFuZGFyZCB0eXBlcyAoYnVpbHQtaW4KKy8vIHR5cGVzLCBzdHJpbmdzLCBwbGFpbiBhcnJheXMsIGFuZCBwb2ludGVycykuCisKKy8vIE92ZXJsb2FkcyBmb3IgdmFyaW91cyBjaGFyIHR5cGVzLgorR1RFU1RfQVBJXyB2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworR1RFU1RfQVBJXyB2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgLy8gV2hlbiBwcmludGluZyBhIHBsYWluIGNoYXIsIHdlIGFsd2F5cyB0cmVhdCBpdCBhcyB1bnNpZ25lZC4gIFRoaXMKKyAgLy8gd2F5LCB0aGUgb3V0cHV0IHdvbid0IGJlIGFmZmVjdGVkIGJ5IHdoZXRoZXIgdGhlIGNvbXBpbGVyIHRoaW5rcworICAvLyBjaGFyIGlzIHNpZ25lZCBvciBub3QuCisgIFByaW50VG8oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyksIG9zKTsKK30KKworLy8gT3ZlcmxvYWRzIGZvciBvdGhlciBzaW1wbGUgYnVpbHQtaW4gdHlwZXMuCitpbmxpbmUgdm9pZCBQcmludFRvKGJvb2wgeCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAoeCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCisvLyBPdmVybG9hZCBmb3Igd2NoYXJfdCB0eXBlLgorLy8gUHJpbnRzIGEgd2NoYXJfdCBhcyBhIHN5bWJvbCBpZiBpdCBpcyBwcmludGFibGUgb3IgYXMgaXRzIGludGVybmFsCisvLyBjb2RlIG90aGVyd2lzZSBhbmQgYWxzbyBhcyBpdHMgZGVjaW1hbCBjb2RlIChleGNlcHQgZm9yIEwnXDAnKS4KKy8vIFRoZSBMJ1wwJyBjaGFyIGlzIHByaW50ZWQgYXMgIkwnXFwwJyIuIFRoZSBkZWNpbWFsIGNvZGUgaXMgcHJpbnRlZAorLy8gYXMgc2lnbmVkIGludGVnZXIgd2hlbiB3Y2hhcl90IGlzIGltcGxlbWVudGVkIGJ5IHRoZSBjb21waWxlcgorLy8gYXMgYSBzaWduZWQgdHlwZSBhbmQgaXMgcHJpbnRlZCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdoZW4gd2NoYXJfdAorLy8gaXMgaW1wbGVtZW50ZWQgYXMgYW4gdW5zaWduZWQgdHlwZS4KK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKHdjaGFyX3Qgd2MsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIE92ZXJsb2FkcyBmb3IgQyBzdHJpbmdzLgorR1RFU1RfQVBJXyB2b2lkIFByaW50VG8oY29uc3QgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCBjaGFyKj4ocyksIG9zKTsKK30KKworLy8gc2lnbmVkL3Vuc2lnbmVkIGNoYXIgaXMgb2Z0ZW4gdXNlZCBmb3IgcmVwcmVzZW50aW5nIGJpbmFyeSBkYXRhLCBzbworLy8gd2UgcHJpbnQgcG9pbnRlcnMgdG8gaXQgYXMgdm9pZCogdG8gYmUgc2FmZS4KK2lubGluZSB2b2lkIFByaW50VG8oY29uc3Qgc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBQcmludFRvKHNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOworfQoraW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOworfQoraW5saW5lIHZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOworfQorCisvLyBNU1ZDIGNhbiBiZSBjb25maWd1cmVkIHRvIGRlZmluZSB3Y2hhcl90IGFzIGEgdHlwZWRlZiBvZiB1bnNpZ25lZAorLy8gc2hvcnQuICBJdCBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHdoZW4gd2NoYXJfdCBpcyBhIG5hdGl2ZQorLy8gdHlwZS4gIFdoZW4gd2NoYXJfdCBpcyBhIHR5cGVkZWYsIGRlZmluaW5nIGFuIG92ZXJsb2FkIGZvciBjb25zdAorLy8gd2NoYXJfdCogd291bGQgY2F1c2UgdW5zaWduZWQgc2hvcnQqIGJlIHByaW50ZWQgYXMgYSB3aWRlIHN0cmluZywKKy8vIHBvc3NpYmx5IGNhdXNpbmcgaW52YWxpZCBtZW1vcnkgYWNjZXNzZXMuCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX05BVElWRV9XQ0hBUl9UX0RFRklORUQpCisvLyBPdmVybG9hZHMgZm9yIHdpZGUgQyBzdHJpbmdzCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhjb25zdCB3Y2hhcl90KiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyh3Y2hhcl90KiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHdjaGFyX3QqPihzKSwgb3MpOworfQorI2VuZGlmCisKKy8vIE92ZXJsb2FkIGZvciBDIGFycmF5cy4gIE11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgcHJpbnRlZAorLy8gcHJvcGVybHkuCisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5LCB3aXRob3V0IHByaW50aW5nCisvLyB0aGUgY3VybHkgYnJhY2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50UmF3QXJyYXlUbyhjb25zdCBUIGFbXSwgc2l6ZV90IGNvdW50LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgVW5pdmVyc2FsUHJpbnQoYVswXSwgb3MpOworICBmb3IgKHNpemVfdCBpID0gMTsgaSAhPSBjb3VudDsgaSsrKSB7CisgICAgKm9zIDw8ICIsICI7CisgICAgVW5pdmVyc2FsUHJpbnQoYVtpXSwgb3MpOworICB9Cit9CisKKy8vIE92ZXJsb2FkcyBmb3IgOjpzdHJpbmcgYW5kIDo6c3RkOjpzdHJpbmcuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK0dURVNUX0FQSV8gdm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRTdHJpbmdUbyhzLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKK0dURVNUX0FQSV8gdm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RkOjpzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnN0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50U3RyaW5nVG8ocywgb3MpOworfQorCisvLyBPdmVybG9hZHMgZm9yIDo6d3N0cmluZyBhbmQgOjpzdGQ6OndzdHJpbmcuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCitHVEVTVF9BUElfIHZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjp3c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6d3N0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50V2lkZVN0cmluZ1RvKHMsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK0dURVNUX0FQSV8gdm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OnN0ZDo6d3N0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6d3N0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50V2lkZVN0cmluZ1RvKHMsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCisvLyBPdmVybG9hZCBmb3IgOjpzdGQ6OnRyMTo6dHVwbGUuICBOZWVkZWQgZm9yIHByaW50aW5nIGZ1bmN0aW9uIGFyZ3VtZW50cywKKy8vIHdoaWNoIGFyZSBwYWNrZWQgYXMgdHVwbGVzLgorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHByaW50aW5nIGEgdHVwbGUuICBUIG11c3QgYmUgaW5zdGFudGlhdGVkIHdpdGgKKy8vIGEgdHVwbGUgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQcmludFR1cGxlVG8oY29uc3QgVCYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gT3ZlcmxvYWRlZCBQcmludFRvKCkgZm9yIHR1cGxlcyBvZiB2YXJpb3VzIGFyaXRpZXMuICBXZSBzdXBwb3J0CisvLyB0dXBsZXMgb2YgdXAtdG8gMTAgZmllbGRzLiAgVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiB3b3JrcworLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRyMTo6dHVwbGUgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlCisvLyBub24tc3RhbmRhcmQgdmFyaWFkaWMgdGVtcGxhdGUgZmVhdHVyZSBvciBub3QuCisKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8PiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMT4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4mIHQsCisgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICAgICAgdHlwZW5hbWUgVDY+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4mIHQsCisgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4mIHQsCisgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4mIHQsCisgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK3ZvaWQgUHJpbnRUbygKKyAgICBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+JiB0LAorICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIE92ZXJsb2FkIGZvciBzdGQ6OnBhaXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjpwYWlyPFQxLCBUMj4mIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICcoJzsKKyAgLy8gV2UgY2Fubm90IHVzZSBVbml2ZXJzYWxQcmludCh2YWx1ZS5maXJzdCwgb3MpIGhlcmUsIGFzIFQxIG1heSBiZQorICAvLyBhIHJlZmVyZW5jZSB0eXBlLiAgVGhlIHNhbWUgZm9yIHByaW50aW5nIHZhbHVlLnNlY29uZC4KKyAgVW5pdmVyc2FsUHJpbnRlcjxUMT46OlByaW50KHZhbHVlLmZpcnN0LCBvcyk7CisgICpvcyA8PCAiLCAiOworICBVbml2ZXJzYWxQcmludGVyPFQyPjo6UHJpbnQodmFsdWUuc2Vjb25kLCBvcyk7CisgICpvcyA8PCAnKSc7Cit9CisKKy8vIEltcGxlbWVudHMgcHJpbnRpbmcgYSBub24tcmVmZXJlbmNlIHR5cGUgVCBieSBsZXR0aW5nIHRoZSBjb21waWxlcgorLy8gcGljayB0aGUgcmlnaHQgb3ZlcmxvYWQgb2YgUHJpbnRUbygpIGZvciBULgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyIHsKKyBwdWJsaWM6CisgIC8vIE1TVkMgd2FybnMgYWJvdXQgYWRkaW5nIGNvbnN0IHRvIGEgZnVuY3Rpb24gdHlwZSwgc28gd2Ugd2FudCB0bworICAvLyBkaXNhYmxlIHRoZSB3YXJuaW5nLgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDE4MCkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDE4MC4KKyNlbmRpZiAgLy8gX01TQ19WRVIKKworICAvLyBOb3RlOiB3ZSBkZWxpYmVyYXRlbHkgZG9uJ3QgY2FsbCB0aGlzIFByaW50VG8oKSwgYXMgdGhhdCBuYW1lCisgIC8vIGNvbmZsaWN0cyB3aXRoIDo6dGVzdGluZzo6aW50ZXJuYWw6OlByaW50VG8gaW4gdGhlIGJvZHkgb2YgdGhlCisgIC8vIGZ1bmN0aW9uLgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgLy8gQnkgZGVmYXVsdCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UHJpbnRUbygpIGlzIHVzZWQgZm9yIHByaW50aW5nCisgICAgLy8gdGhlIHZhbHVlLgorICAgIC8vCisgICAgLy8gVGhhbmtzIHRvIEtvZW5pZyBsb29rLXVwLCBpZiBUIGlzIGEgY2xhc3MgYW5kIGhhcyBpdHMgb3duCisgICAgLy8gUHJpbnRUbygpIGZ1bmN0aW9uIGRlZmluZWQgaW4gaXRzIG5hbWVzcGFjZSwgdGhhdCBmdW5jdGlvbiB3aWxsCisgICAgLy8gYmUgdmlzaWJsZSBoZXJlLiAgU2luY2UgaXQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSBnZW5lcmljIG9uZXMKKyAgICAvLyBpbiA6OnRlc3Rpbmc6OmludGVybmFsLCBpdCB3aWxsIGJlIHBpY2tlZCBieSB0aGUgY29tcGlsZXIgaW4gdGhlCisgICAgLy8gZm9sbG93aW5nIHN0YXRlbWVudCAtIGV4YWN0bHkgd2hhdCB3ZSB3YW50LgorICAgIFByaW50VG8odmFsdWUsIG9zKTsKKyAgfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYgIC8vIF9NU0NfVkVSCit9OworCisvLyBVbml2ZXJzYWxQcmludEFycmF5KGJlZ2luLCBsZW4sIG9zKSBwcmludHMgYW4gYXJyYXkgb2YgJ2xlbicKKy8vIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzICdiZWdpbicuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBUKiBiZWdpbiwgc2l6ZV90IGxlbiwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIGlmIChsZW4gPT0gMCkgeworICAgICpvcyA8PCAie30iOworICB9IGVsc2UgeworICAgICpvcyA8PCAieyAiOworICAgIGNvbnN0IHNpemVfdCBrVGhyZXNob2xkID0gMTg7CisgICAgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA4OworICAgIC8vIElmIHRoZSBhcnJheSBoYXMgbW9yZSB0aGFuIGtUaHJlc2hvbGQgZWxlbWVudHMsIHdlJ2xsIGhhdmUgdG8KKyAgICAvLyBvbWl0IHNvbWUgZGV0YWlscyBieSBwcmludGluZyBvbmx5IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QKKyAgICAvLyBrQ2h1bmtTaXplIGVsZW1lbnRzLgorICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBsZXQgdGhlIHVzZXIgY29udHJvbCB0aGUgdGhyZXNob2xkIHVzaW5nIGEgZmxhZy4KKyAgICBpZiAobGVuIDw9IGtUaHJlc2hvbGQpIHsKKyAgICAgIFByaW50UmF3QXJyYXlUbyhiZWdpbiwgbGVuLCBvcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFByaW50UmF3QXJyYXlUbyhiZWdpbiwga0NodW5rU2l6ZSwgb3MpOworICAgICAgKm9zIDw8ICIsIC4uLiwgIjsKKyAgICAgIFByaW50UmF3QXJyYXlUbyhiZWdpbiArIGxlbiAtIGtDaHVua1NpemUsIGtDaHVua1NpemUsIG9zKTsKKyAgICB9CisgICAgKm9zIDw8ICIgfSI7CisgIH0KK30KKy8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSBjaGFyIGFycmF5IGNvbXBhY3RseS4KK0dURVNUX0FQSV8gdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KAorICAgIGNvbnN0IGNoYXIqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBUaGlzIG92ZXJsb2FkIHByaW50cyBhIChjb25zdCkgd2NoYXJfdCBhcnJheSBjb21wYWN0bHkuCitHVEVTVF9BUElfIHZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheSgKKyAgICBjb25zdCB3Y2hhcl90KiBiZWdpbiwgc2l6ZV90IGxlbiwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhbiBhcnJheSB0eXBlIFRbTl0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyPFRbTl0+IHsKKyBwdWJsaWM6CisgIC8vIFByaW50cyB0aGUgZ2l2ZW4gYXJyYXksIG9taXR0aW5nIHNvbWUgZWxlbWVudHMgd2hlbiB0aGVyZSBhcmUgdG9vCisgIC8vIG1hbnkuCisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZhKVtOXSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVW5pdmVyc2FsUHJpbnRBcnJheShhLCBOLCBvcyk7CisgIH0KK307CisKKy8vIEltcGxlbWVudHMgcHJpbnRpbmcgYSByZWZlcmVuY2UgdHlwZSBUJi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsUHJpbnRlcjxUJj4geworIHB1YmxpYzoKKyAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCisgIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTgwKSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MTgwLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAvLyBQcmludHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlLiAgV2UgdXNlIHJlaW50ZXJwcmV0X2Nhc3QgaGVyZQorICAgIC8vIGFzIHN0YXRpY19jYXN0IGRvZXNuJ3QgY29tcGlsZSB3aGVuIFQgaXMgYSBmdW5jdGlvbiB0eXBlLgorICAgICpvcyA8PCAiQCIgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJnZhbHVlKSA8PCAiICI7CisKKyAgICAvLyBUaGVuIHByaW50cyB0aGUgdmFsdWUgaXRzZWxmLgorICAgIFVuaXZlcnNhbFByaW50KHZhbHVlLCBvcyk7CisgIH0KKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorfTsKKworLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkIHZhbHVlCisvLyAoYnV0IG5vdCB0aGUgYWRkcmVzcykgaXMgcHJpbnRlZDsgZm9yIGEgKGNvbnN0KSBjaGFyIHBvaW50ZXIsIHRoZQorLy8gTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcyBwcmludGVkLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlciB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFQmPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUW05dPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUICgmdmFsdWUpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludGVyPFRbTl0+OjpQcmludCh2YWx1ZSwgb3MpOworICB9Cit9OwordGVtcGxhdGUgPD4KK2NsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCBjaGFyKj4geworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgY2hhciogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICpvcyA8PCAiTlVMTCI7CisgICAgfSBlbHNlIHsKKyAgICAgIFVuaXZlcnNhbFByaW50KHN0cmluZyhzdHIpLCBvcyk7CisgICAgfQorICB9Cit9OwordGVtcGxhdGUgPD4KK2NsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjaGFyKj4geworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUHJpbnQoY2hhciogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxUZXJzZVByaW50ZXI8Y29uc3QgY2hhcio+OjpQcmludChzdHIsIG9zKTsKKyAgfQorfTsKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORwordGVtcGxhdGUgPD4KK2NsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj4geworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3Qgd2NoYXJfdCogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICpvcyA8PCAiTlVMTCI7CisgICAgfSBlbHNlIHsKKyAgICAgIFVuaXZlcnNhbFByaW50KDo6c3RkOjp3c3RyaW5nKHN0ciksIG9zKTsKKyAgICB9CisgIH0KK307CisjZW5kaWYKKwordGVtcGxhdGUgPD4KK2NsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjx3Y2hhcl90Kj4geworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUHJpbnQod2NoYXJfdCogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxUZXJzZVByaW50ZXI8Y29uc3Qgd2NoYXJfdCo+OjpQcmludChzdHIsIG9zKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFVuaXZlcnNhbFRlcnNlUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIHZhbHVlIHVzaW5nIHRoZSB0eXBlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIFRoZQorLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBpcyB0aGF0IGZvciBhCisvLyAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhpcyBwcmludHMgYm90aCB0aGUgcG9pbnRlciBhbmQgdGhlCisvLyBOVUwtdGVybWluYXRlZCBzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBBIHdvcmthcm9uZCBmb3IgdGhlIGJ1ZyBpbiBWQysrIDcuMSB0aGF0IHByZXZlbnRzIHVzIGZyb20gaW5zdGFudGlhdGluZworICAvLyBVbml2ZXJzYWxQcmludGVyIHdpdGggVCBkaXJlY3RseS4KKyAgdHlwZWRlZiBUIFQxOworICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUsIG9zKTsKK30KKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKK3R5cGVkZWYgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+IFN0cmluZ3M7CisKKy8vIFRoaXMgaGVscGVyIHRlbXBsYXRlIGFsbG93cyBQcmludFRvKCkgZm9yIHR1cGxlcyBhbmQKKy8vIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygpIHRvIGJlIGRlZmluZWQgYnkKKy8vIGluZHVjdGlvbiBvbiB0aGUgbnVtYmVyIG9mIHR1cGxlIGZpZWxkcy4gIFRoZSBpZGVhIGlzIHRoYXQKKy8vIFR1cGxlUHJlZml4UHJpbnRlcjxOPjo6UHJpbnRQcmVmaXhUbyh0LCBvcykgcHJpbnRzIHRoZSBmaXJzdCBOCisvLyBmaWVsZHMgaW4gdHVwbGUgdCwgYW5kIGNhbiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mCisvLyBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+LgorCisvLyBUaGUgaW5kdWN0aXZlIGNhc2UuCit0ZW1wbGF0ZSA8c2l6ZV90IE4+CitzdHJ1Y3QgVHVwbGVQcmVmaXhQcmludGVyIHsKKyAgLy8gUHJpbnRzIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBhIHR1cGxlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT46OlByaW50UHJlZml4VG8odCwgb3MpOworICAgICpvcyA8PCAiLCAiOworICAgIFVuaXZlcnNhbFByaW50ZXI8dHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxOIC0gMSwgVHVwbGU+Ojp0eXBlPgorICAgICAgICA6OlByaW50KDo6c3RkOjp0cjE6OmdldDxOIC0gMT4odCksIG9zKTsKKyAgfQorCisgIC8vIFRlcnNlbHkgcHJpbnRzIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBhIHR1cGxlIHRvIGEgc3RyaW5nIHZlY3RvciwKKyAgLy8gb25lIGVsZW1lbnQgZm9yIGVhY2ggZmllbGQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYgdCwgU3RyaW5ncyogc3RyaW5ncykgeworICAgIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT46OlRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModCwgc3RyaW5ncyk7CisgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBVbml2ZXJzYWxUZXJzZVByaW50KDo6c3RkOjp0cjE6OmdldDxOIC0gMT4odCksICZzcyk7CisgICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKKyAgfQorfTsKKworLy8gQmFzZSBjYXNlcy4KK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVHVwbGVQcmVmaXhQcmludGVyPDA+IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiwgOjpzdGQ6Om9zdHJlYW0qKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYsIFN0cmluZ3MqKSB7fQorfTsKKy8vIFdlIGhhdmUgdG8gc3BlY2lhbGl6ZSB0aGUgZW50aXJlIFR1cGxlUHJlZml4UHJpbnRlcjw+IGNsYXNzCisvLyB0ZW1wbGF0ZSBoZXJlLCBldmVuIHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZgorLy8gVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncygpIGlzIHRoZSBzYW1lIGFzIHRoZSBnZW5lcmljIHZlcnNpb24sIGFzCisvLyBFbWJhcmNhZGVybyAoZm9ybWVybHkgQ29kZUdlYXIsIGZvcm1lcmx5IEJvcmxhbmQpIEMrKyBkb2Vzbid0CisvLyBzdXBwb3J0IHNwZWNpYWxpemluZyBhIG1ldGhvZCB0ZW1wbGF0ZSBvZiBhIGNsYXNzIHRlbXBsYXRlLgordGVtcGxhdGUgPD4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MT4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFByaW50ZXI8dHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDwwLCBUdXBsZT46OnR5cGU+OjoKKyAgICAgICAgUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PDA+KHQpLCBvcyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3MoY29uc3QgVHVwbGUmIHQsIFN0cmluZ3MqIHN0cmluZ3MpIHsKKyAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PDA+KHQpLCAmc3MpOworICAgIHN0cmluZ3MtPnB1c2hfYmFjayhzcy5zdHIoKSk7CisgIH0KK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSB0dXBsZS4gIFQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gYSB0dXBsZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VHVwbGVUbyhjb25zdCBUJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICIoIjsKKyAgVHVwbGVQcmVmaXhQcmludGVyPCA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPFQ+Ojp2YWx1ZT46OgorICAgICAgUHJpbnRQcmVmaXhUbyh0LCBvcyk7CisgICpvcyA8PCAiKSI7Cit9CisKKy8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQorLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gIFNlZSB0aGUgY29tbWVudCBiZWZvcmUKKy8vIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBmb3IgaG93IHdlIGRlZmluZSAidGVyc2VseSIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CitTdHJpbmdzIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhjb25zdCBUdXBsZSYgdmFsdWUpIHsKKyAgU3RyaW5ncyByZXN1bHQ7CisgIFR1cGxlUHJlZml4UHJpbnRlcjwgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlPjo6CisgICAgICBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKHZhbHVlLCAmcmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgaW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsICZzcyk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzZmE5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaApAQCAtMCwwICsxLDIzMiBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBVdGlsaXRpZXMgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmIGFuZCBjb2RlIHRoYXQgdXNlcyBHb29nbGUgVGVzdAorLy8gKGUuZy4gZnJhbWV3b3JrcyBidWlsdCBvbiB0b3Agb2YgR29vZ2xlIFRlc3QpLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoaXMgaGVscGVyIGNsYXNzIGNhbiBiZSB1c2VkIHRvIG1vY2sgb3V0IEdvb2dsZSBUZXN0IGZhaWx1cmUgcmVwb3J0aW5nCisvLyBzbyB0aGF0IHdlIGNhbiB0ZXN0IEdvb2dsZSBUZXN0IG9yIGNvZGUgdGhhdCBidWlsZHMgb24gR29vZ2xlIFRlc3QuCisvLworLy8gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgYXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUKKy8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgb2JqZWN0IGdpdmVuIGluIHRoZSBjb25zdHJ1Y3RvciB3aGVuZXZlciBhIEdvb2dsZSBUZXN0CisvLyBmYWlsdXJlIGlzIHJlcG9ydGVkLiBJdCBjYW4gZWl0aGVyIGludGVyY2VwdCBvbmx5IGZhaWx1cmVzIHRoYXQgYXJlCisvLyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGlzIG9iamVjdCBvciBpdCBjYW4gaW50ZXJjZXB0CisvLyBhbGwgZ2VuZXJhdGVkIGZhaWx1cmVzLiBUaGUgc2NvcGUgb2YgdGhpcyBtb2NrIG9iamVjdCBjYW4gYmUgY29udHJvbGxlZCB3aXRoCisvLyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSB0d28gYXJndW1lbnRzIGNvbnN0cnVjdG9yLgorY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgorICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgLy8gVGhlIHR3byBwb3NzaWJsZSBtb2NraW5nIG1vZGVzIG9mIHRoaXMgb2JqZWN0LgorICBlbnVtIEludGVyY2VwdE1vZGUgeworICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAgLy8gSW50ZXJjZXB0cyBvbmx5IHRocmVhZCBsb2NhbCBmYWlsdXJlcy4KKyAgICBJTlRFUkNFUFRfQUxMX1RIUkVBRFMgICAgICAgICAgIC8vIEludGVyY2VwdHMgYWxsIGZhaWx1cmVzLgorICB9OworCisgIC8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQKKyAgLy8gYnkgR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCisgIC8vIHJlc3VsdHMuIFRoaXMgcmVwb3J0ZXIgd2lsbCBvbmx5IGNhdGNoIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudAorICAvLyB0aHJlYWQuIERFUFJFQ0FURUQKKyAgZXhwbGljaXQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KTsKKworICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgeW91IGNhbiBjaG9vc2UgdGhlIGludGVyY2VwdGlvbiBzY29wZSBvZiB0aGlzIG9iamVjdC4KKyAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KTsKKworICAvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIHZpcnR1YWwgflNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7CisKKyAgLy8gQXBwZW5kcyB0aGUgVGVzdFBhcnRSZXN1bHQgb2JqZWN0IHRvIHRoZSBUZXN0UGFydFJlc3VsdEFycmF5CisgIC8vIHJlY2VpdmVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZQorICAvLyBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyBwcml2YXRlOgorICB2b2lkIEluaXQoKTsKKworICBjb25zdCBJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlXzsKKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogb2xkX3JlcG9ydGVyXzsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSogY29uc3QgcmVzdWx0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEEgaGVscGVyIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBhbmQKKy8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkuICBJdHMgZGVzdHJ1Y3RvciB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgorLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbgorLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGEKKy8vIG5vbi1mYXRhbCBmYWlsdXJlIHdpbGwgYmUgZ2VuZXJhdGVkLgorY2xhc3MgR1RFU1RfQVBJXyBTaW5nbGVGYWlsdXJlQ2hlY2tlciB7CisgcHVibGljOgorICAvLyBUaGUgY29uc3RydWN0b3IgcmVtZW1iZXJzIHRoZSBhcmd1bWVudHMuCisgIFNpbmdsZUZhaWx1cmVDaGVja2VyKGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKTsKKyAgflNpbmdsZUZhaWx1cmVDaGVja2VyKCk7CisgcHJpdmF0ZToKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogY29uc3QgcmVzdWx0c187CisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGVfOworICBjb25zdCBzdHJpbmcgc3Vic3RyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNpbmdsZUZhaWx1cmVDaGVja2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBBIHNldCBvZiBtYWNyb3MgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBvciBjb2RlIHRoYXQncyBleHBlY3RlZAorLy8gdG8gZ2VuZXJhdGUgR29vZ2xlIFRlc3QgZmF0YWwgZmFpbHVyZXMuICBJdCB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgorLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgZmF0YWwgR29vZ2xlIFRlc3QgZmFpbHVyZSB3aXRoICdzdWJzdHInCisvLyBiZWluZyBwYXJ0IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCisvLworLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhpcyBtYWNyby4gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUgb25seQorLy8gYWZmZWN0cyBhbmQgY29uc2lkZXJzIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgYW5kCisvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyBkb2VzIHRoZSBzYW1lIGJ1dCBmb3IgYWxsIHRocmVhZHMuCisvLworLy8gVGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIGlzIGRvbmUgY29ycmVjdGx5IGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50CisvLyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9yIGFib3J0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KKy8vCisvLyBLbm93biByZXN0cmljdGlvbnM6CisvLyAgIC0gJ3N0YXRlbWVudCcgY2Fubm90IHJlZmVyZW5jZSBsb2NhbCBub24tc3RhdGljIHZhcmlhYmxlcyBvcgorLy8gICAgIG5vbi1zdGF0aWMgbWVtYmVycyBvZiB0aGUgY3VycmVudCBvYmplY3QuCisvLyAgIC0gJ3N0YXRlbWVudCcgY2Fubm90IHJldHVybiBhIHZhbHVlLgorLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uCisvLworLy8gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28KKy8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uCisvLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yCisvLyB3b3Jrcy4gIFRoZSBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSB0ZXN0IGluCisvLyBndGVzdF91bml0dGVzdC5jYyB3aWxsIGZhaWwgdG8gY29tcGlsZSBpZiB3ZSBkbyB0aGF0LgorI2RlZmluZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7IFwKKyAgICBjbGFzcyBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlciB7XAorICAgICBwdWJsaWM6XAorICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZSgpIHsgc3RhdGVtZW50OyB9XAorICAgIH07XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKKyAgICAgICAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgJmd0ZXN0X2ZhaWx1cmVzKTtcCisgICAgICBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlcjo6RXhlY3V0ZSgpO1wKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjZGVmaW5lIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHsgXAorICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcCisgICAgIHB1YmxpYzpcCisgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfTtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAorICAgICAgICAgIElOVEVSQ0VQVF9BTExfVEhSRUFEUywgJmd0ZXN0X2ZhaWx1cmVzKTtcCisgICAgICBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlcjo6RXhlY3V0ZSgpO1wKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBBIG1hY3JvIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgb3IgY29kZSB0aGF0J3MgZXhwZWN0ZWQgdG8KKy8vIGdlbmVyYXRlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcy4gIEl0IGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4KKy8vIHN0YXRlbWVudCB3aWxsIGNhdXNlIGV4YWN0bHkgb25lIG5vbi1mYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicKKy8vIGJlaW5nIHBhcnQgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4KKy8vCisvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSBvbmx5CisvLyBhZmZlY3RzIGFuZCBjb25zaWRlcnMgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBhbmQKKy8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4KKy8vCisvLyAnc3RhdGVtZW50JyBpcyBhbGxvd2VkIHRvIHJlZmVyZW5jZSBsb2NhbCB2YXJpYWJsZXMgYW5kIG1lbWJlcnMgb2YKKy8vIHRoZSBjdXJyZW50IG9iamVjdC4KKy8vCisvLyBUaGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBhc3NlcnRpb24gaXMgZG9uZSBjb3JyZWN0bHkgZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQKKy8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorLy8KKy8vIEtub3duIHJlc3RyaWN0aW9uczoKKy8vICAgLSBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byB0aGlzIG1hY3JvLgorLy8KKy8vIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvCisvLyBtYWNyb3MgYXJlIG11Y2ggYWxpa2UsIHdlIGNhbm5vdCByZWZhY3RvciB0aGVtIHRvIHVzZSBhIGNvbW1vbgorLy8gaGVscGVyIG1hY3JvLCBkdWUgdG8gc29tZSBwZWN1bGlhcml0eSBpbiBob3cgdGhlIHByZXByb2Nlc3NvcgorLy8gd29ya3MuICBJZiB3ZSBkbyB0aGF0LCB0aGUgY29kZSB3b24ndCBjb21waWxlIHdoZW4gdGhlIHVzZXIgZ2l2ZXMKKy8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgYSBzdGF0ZW1lbnQgdGhhdCBjb250YWlucyBhIG1hY3JvIHRoYXQKKy8vIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuIHVucHJvdGVjdGVkIGNvbW1hLiAgVGhlCisvLyBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSB0ZXN0IGluIGd0ZXN0X3VuaXR0ZXN0LmNjCisvLyBjYXRjaGVzIHRoYXQuCisvLworLy8gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2UgaGF2ZSB0byB3cml0ZQorLy8gICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfQorLy8gaW5zdGVhZCBvZgorLy8gICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkKKy8vIHRvIGF2b2lkIGFuIE1TVkMgd2FybmluZyBvbiB1bnJlYWNoYWJsZSBjb2RlLgorI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgXAorICAgICAgICAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAorICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKyNkZWZpbmUgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8ge1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwKKyAgICAgICAgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX0FMTF9USFJFQURTLCBcCisgICAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzKTtcCisgICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlYjg0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaApAQCAtMCwwICsxLDE3OSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbgorLy8gYXNzZXJ0aW9uIG9yIGFuIGV4cGxpY2l0IEZBSUwoKSwgQUREX0ZBSUxVUkUoKSwgb3IgU1VDQ0VTUygpKS4KKy8vCisvLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFBhcnRSZXN1bHQgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RQYXJ0UmVzdWx0IHsKKyBwdWJsaWM6CisgIC8vIFRoZSBwb3NzaWJsZSBvdXRjb21lcyBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbiBhc3NlcnRpb24gb3IgYW4KKyAgLy8gZXhwbGljaXQgU1VDQ0VFRCgpLCBGQUlMKCksIG9yIEFERF9GQUlMVVJFKCkpLgorICBlbnVtIFR5cGUgeworICAgIGtTdWNjZXNzLCAgICAgICAgICAvLyBTdWNjZWVkZWQuCisgICAga05vbkZhdGFsRmFpbHVyZSwgIC8vIEZhaWxlZCBidXQgdGhlIHRlc3QgY2FuIGNvbnRpbnVlLgorICAgIGtGYXRhbEZhaWx1cmUgICAgICAvLyBGYWlsZWQgYW5kIHRoZSB0ZXN0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorICB9OworCisgIC8vIEMndG9yLiAgVGVzdFBhcnRSZXN1bHQgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQorICAvLyBUZXN0UGFydFJlc3VsdCBvYmplY3QuCisgIFRlc3RQYXJ0UmVzdWx0KFR5cGUgYV90eXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX2ZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgaW50IGFfbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbWVzc2FnZSkKKyAgICAgIDogdHlwZV8oYV90eXBlKSwKKyAgICAgICAgZmlsZV9uYW1lXyhhX2ZpbGVfbmFtZSA9PSBOVUxMID8gIiIgOiBhX2ZpbGVfbmFtZSksCisgICAgICAgIGxpbmVfbnVtYmVyXyhhX2xpbmVfbnVtYmVyKSwKKyAgICAgICAgc3VtbWFyeV8oRXh0cmFjdFN1bW1hcnkoYV9tZXNzYWdlKSksCisgICAgICAgIG1lc3NhZ2VfKGFfbWVzc2FnZSkgeworICB9CisKKyAgLy8gR2V0cyB0aGUgb3V0Y29tZSBvZiB0aGUgdGVzdCBwYXJ0LgorICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKKyAgLy8gTlVMTCBpZiBpdCdzIHVua25vd24uCisgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmlsZV9uYW1lXy5lbXB0eSgpID8gTlVMTCA6IGZpbGVfbmFtZV8uY19zdHIoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwKKyAgLy8gb3IgLTEgaWYgaXQncyB1bmtub3duLgorICBpbnQgbGluZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBsaW5lX251bWJlcl87IH0KKworICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCisgIGNvbnN0IGNoYXIqIHN1bW1hcnkoKSBjb25zdCB7IHJldHVybiBzdW1tYXJ5Xy5jX3N0cigpOyB9CisKKyAgLy8gR2V0cyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRlc3QgcGFydC4KKyAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgcGFzc2VkLgorICBib29sIHBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtTdWNjZXNzOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhaWxlZC4KKyAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyAhPSBrU3VjY2VzczsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBub24tZmF0YWxseSBmYWlsZWQuCisgIGJvb2wgbm9uZmF0YWxseV9mYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrTm9uRmF0YWxGYWlsdXJlOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhdGFsbHkgZmFpbGVkLgorICBib29sIGZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga0ZhdGFsRmFpbHVyZTsgfQorCisgcHJpdmF0ZToKKyAgVHlwZSB0eXBlXzsKKworICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrCisgIC8vIHRyYWNlIGluIGl0LgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXh0cmFjdFN1bW1hcnkoY29uc3QgY2hhciogbWVzc2FnZSk7CisKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKKyAgLy8gIiIgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIHVua25vd24uCisgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZV87CisgIC8vIFRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yIC0xCisgIC8vIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duLgorICBpbnQgbGluZV9udW1iZXJfOworICBzdGQ6OnN0cmluZyBzdW1tYXJ5XzsgIC8vIFRoZSB0ZXN0IGZhaWx1cmUgc3VtbWFyeS4KKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIG1lc3NhZ2UuCit9OworCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKy8vIEFuIGFycmF5IG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90CisvLyB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdEFycmF5IHsKKyBwdWJsaWM6CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkoKSB7fQorCisgIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KKyAgdm9pZCBBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgorICBpbnQgc2l6ZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IGFycmF5XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOworfTsKKworLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuCitjbGFzcyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSA9IDA7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIGJ5IHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFIHRvIGNoZWNrIGlmIGEKKy8vIHN0YXRlbWVudCBnZW5lcmF0ZXMgbmV3IGZhdGFsIGZhaWx1cmVzLiBUbyBkbyBzbyBpdCByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZQorLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUKKy8vIHJlcG9ydGVkLCBpdCBvbmx5IGRlbGVnYXRlcyB0aGUgcmVwb3J0aW5nIHRvIHRoZSBmb3JtZXIgcmVzdWx0IHJlcG9ydGVyLgorLy8gVGhlIG9yaWdpbmFsIHJlc3VsdCByZXBvcnRlciBpcyByZXN0b3JlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK2NsYXNzIEdURVNUX0FQSV8gSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgdmlydHVhbCB+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7CisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSBjb25zdCB7IHJldHVybiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOyB9CisgcHJpdmF0ZToKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOworICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvcmlnaW5hbF9yZXBvcnRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWU4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oCkBAIC0wLDAgKzEsMjU5IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIHR5cGVkIHRlc3RzIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKy8vIFR5cGVkIChha2EgdHlwZS1kcml2ZW4pIHRlc3RzIHJlcGVhdCB0aGUgc2FtZSB0ZXN0IGZvciB0eXBlcyBpbiBhCisvLyBsaXN0LiAgWW91IG11c3Qga25vdyB3aGljaCB0eXBlcyB5b3Ugd2FudCB0byB0ZXN0IHdpdGggd2hlbiB3cml0aW5nCisvLyB0eXBlZCB0ZXN0cy4gSGVyZSdzIGhvdyB5b3UgZG8gaXQ6CisKKyNpZiAwCisKKy8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICAuLi4KKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8VD4gTGlzdDsKKyAgc3RhdGljIFQgc2hhcmVkXzsKKyAgVCB2YWx1ZV87Cit9OworCisvLyBOZXh0LCBhc3NvY2lhdGUgYSBsaXN0IG9mIHR5cGVzIHdpdGggdGhlIHRlc3QgY2FzZSwgd2hpY2ggd2lsbCBiZQorLy8gcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBpbiB0aGUgbGlzdC4gIFRoZSB0eXBlZGVmIGlzIG5lY2Vzc2FyeSBmb3IKKy8vIHRoZSBtYWNybyB0byBwYXJzZSBjb3JyZWN0bHkuCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOworVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIE15VHlwZXMpOworCisvLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlCisvLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46CisvLyAgIFRZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBpbnQpOworCisvLyBUaGVuLCB1c2UgVFlQRURfVEVTVCgpIGluc3RlYWQgb2YgVEVTVF9GKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZWQKKy8vIHRlc3RzIGZvciB0aGlzIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1QoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIC8vIFNpbmNlIHdlIGFyZSBpbnNpZGUgYSBkZXJpdmVkIGNsYXNzIHRlbXBsYXRlLCBDKysgcmVxdWlyZXMgdXNlIHRvCisgIC8vIHZpc2l0IHRoZSBtZW1iZXJzIG9mIEZvb1Rlc3QgdmlhICd0aGlzJy4KKyAgVHlwZVBhcmFtIG4gPSB0aGlzLT52YWx1ZV87CisKKyAgLy8gVG8gdmlzaXQgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUsIGFkZCB0aGUgVGVzdEZpeHR1cmU6OgorICAvLyBwcmVmaXguCisgIG4gKz0gVGVzdEZpeHR1cmU6OnNoYXJlZF87CisKKyAgLy8gVG8gcmVmZXIgdG8gdHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUsIGFkZCB0aGUgInR5cGVuYW1lCisgIC8vIFRlc3RGaXh0dXJlOjoiIHByZWZpeC4KKyAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6Okxpc3QgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKG4pOworICAuLi4KK30KKworVFlQRURfVEVTVChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KKworI2VuZGlmICAvLyAwCisKKy8vIFR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgYWJzdHJhY3QgdGVzdCBwYXR0ZXJucyBwYXJhbWV0ZXJpemVkCisvLyBieSBhIHR5cGUuICBDb21wYXJlZCB3aXRoIHR5cGVkIHRlc3RzLCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGFsbG93IHlvdSB0byBkZWZpbmUgdGhlIHRlc3QgcGF0dGVybiB3aXRob3V0IGtub3dpbmcgd2hhdCB0aGUgdHlwZQorLy8gcGFyYW1ldGVycyBhcmUuICBUaGUgZGVmaW5lZCBwYXR0ZXJuIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gZGlmZmVyZW50IHR5cGVzIGFueSBudW1iZXIgb2YgdGltZXMsIGluIGFueSBudW1iZXIgb2YgdHJhbnNsYXRpb24KKy8vIHVuaXRzLgorLy8KKy8vIElmIHlvdSBhcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSBvciBjb25jZXB0LCB5b3UgY2FuIGRlZmluZSBhCisvLyBzdWl0ZSBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgdG8gdmVyaWZ5IHByb3BlcnRpZXMgdGhhdCBhbnkKKy8vIHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UvY29uY2VwdCBzaG91bGQgaGF2ZS4gIFRoZW4sCisvLyBlYWNoIGltcGxlbWVudGF0aW9uIGNhbiBlYXNpbHkgaW5zdGFudGlhdGUgdGhlIHRlc3Qgc3VpdGUgdG8gdmVyaWZ5CisvLyB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSByZXF1aXJlbWVudHMsIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlCisvLyBzaW1pbGFyIHRlc3RzIHJlcGVhdGVkbHkuICBIZXJlJ3MgYW4gZXhhbXBsZToKKworI2lmIDAKKworLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAorLy8gYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gdGVzdGluZzo6VGVzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyAgLi4uCit9OworCisvLyBOZXh0LCBkZWNsYXJlIHRoYXQgeW91IHdpbGwgZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZQorLy8gKHRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UKKy8vIHByZWZlcik6CitUWVBFRF9URVNUX0NBU0VfUChGb29UZXN0KTsKKworLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1RfUCgpIHRvIGRlZmluZSBhcyBtYW55IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gZm9yIHRoaXMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgVHlwZVBhcmFtIG4gPSAwOworICAuLi4KK30KKworVFlQRURfVEVTVF9QKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorCisvLyBOb3cgdGhlIHRyaWNreSBwYXJ0OiB5b3UgbmVlZCB0byByZWdpc3RlciBhbGwgdGVzdCBwYXR0ZXJucyBiZWZvcmUKKy8vIHlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbS4gIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgbWFjcm8gaXMgdGhlCisvLyB0ZXN0IGNhc2UgbmFtZTsgdGhlIHJlc3QgYXJlIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0CisvLyBjYXNlLgorUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvZXNCbGFoLCBIYXNQcm9wZXJ0eUEpOworCisvLyBGaW5hbGx5LCB5b3UgYXJlIGZyZWUgdG8gaW5zdGFudGlhdGUgdGhlIHBhdHRlcm4gd2l0aCB0aGUgdHlwZXMgeW91CisvLyB3YW50LiAgSWYgeW91IHB1dCB0aGUgYWJvdmUgY29kZSBpbiBhIGhlYWRlciBmaWxlLCB5b3UgY2FuICNpbmNsdWRlCisvLyBpdCBpbiBtdWx0aXBsZSBDKysgc291cmNlIGZpbGVzIGFuZCBpbnN0YW50aWF0ZSBpdCBtdWx0aXBsZSB0aW1lcy4KKy8vCisvLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCB0aGUgZmlyc3QKKy8vIGFyZ3VtZW50IHRvIHRoZSBJTlNUQU5USUFURV8qIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZAorLy8gdG8gdGhlIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvcgorLy8gZGlmZmVyZW50IGluc3RhbmNlcy4KK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgTXlUeXBlcyk7CisKKy8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUKKy8vIGRpcmVjdGx5IHdpdGhvdXQgVHlwZXM8Li4uPjoKKy8vICAgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIGludCk7CisKKyNlbmRpZiAgLy8gMAorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIgorCisvLyBJbXBsZW1lbnRzIHR5cGVkIHRlc3RzLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZQorLy8gZ2l2ZW4gdGVzdCBjYXNlLgorIyBkZWZpbmUgR1RFU1RfVFlQRV9QQVJBTVNfKFRlc3RDYXNlTmFtZSkgZ3Rlc3RfdHlwZV9wYXJhbXNfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gVGhlICdUeXBlcycgdGVtcGxhdGUgYXJndW1lbnQgYmVsb3cgbXVzdCBoYXZlIHNwYWNlcyBhcm91bmQgaXQKKy8vIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1heSBjaG9rZSBvbiAnPj4nIHdoZW4gcGFzc2luZyBhIHRlbXBsYXRlCisvLyBpbnN0YW5jZSAoZS5nLiBUeXBlczxpbnQ+KQorIyBkZWZpbmUgVFlQRURfVEVTVF9DQVNFKENhc2VOYW1lLCBUeXBlcykgXAorICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlIFwKKyAgICAgIEdURVNUX1RZUEVfUEFSQU1TXyhDYXNlTmFtZSkKKworIyBkZWZpbmUgVFlQRURfVEVTVChDYXNlTmFtZSwgVGVzdE5hbWUpIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpIFwKKyAgICAgIDogcHVibGljIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IHsgXAorICAgcHJpdmF0ZTogXAorICAgIHR5cGVkZWYgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4gVGVzdEZpeHR1cmU7IFwKKyAgICB0eXBlZGVmIGd0ZXN0X1R5cGVQYXJhbV8gVHlwZVBhcmFtOyBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgfTsgXAorICBib29sIGd0ZXN0XyMjQ2FzZU5hbWUjI18jI1Rlc3ROYW1lIyNfcmVnaXN0ZXJlZF8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlUGFyYW1ldGVyaXplZFRlc3Q8IFwKKyAgICAgICAgICBDYXNlTmFtZSwgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlbXBsYXRlU2VsPCBcCisgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKT4sIFwKKyAgICAgICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpPjo6UmVnaXN0ZXIoXAorICAgICAgICAgICAgICAiIiwgI0Nhc2VOYW1lLCAjVGVzdE5hbWUsIDApOyBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIHZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gSW1wbGVtZW50cyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZXNwYWNlIG5hbWUgdGhhdCB0aGUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGZvcgorLy8gdGhlIGdpdmVuIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgYXJlIGRlZmluZWQgaW4uICBUaGUgZXhhY3QKKy8vIG5hbWUgb2YgdGhlIG5hbWVzcGFjZSBpcyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKyMgZGVmaW5lIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfY2FzZV8jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG5hbWVzIG9mCisvLyB0aGUgZGVmaW5lZCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgorIyBkZWZpbmUgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKFRlc3RDYXNlTmFtZSkgXAorICBndGVzdF90eXBlZF90ZXN0X2Nhc2VfcF9zdGF0ZV8jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFIERJUkVDVExZLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG5hbWVzIG9mCisvLyB0aGUgcmVnaXN0ZXJlZCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgorIyBkZWZpbmUgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfcmVnaXN0ZXJlZF90ZXN0X25hbWVzXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIFRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgbWFjcm9zIGFyZQorLy8gc3RhdGljIGFzIHR5cGljYWxseSB0aGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYSAuaCBmaWxlIHRoYXQgY2FuIGJlCisvLyAjaW5jbHVkZWQgaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorIyBkZWZpbmUgVFlQRURfVEVTVF9DQVNFX1AoQ2FzZU5hbWUpIFwKKyAgc3RhdGljIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVkVGVzdENhc2VQU3RhdGUgXAorICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKQorCisjIGRlZmluZSBUWVBFRF9URVNUX1AoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgIG5hbWVzcGFjZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpIHsgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICBjbGFzcyBUZXN0TmFtZSA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwKKyAgIHByaXZhdGU6IFwKKyAgICB0eXBlZGVmIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IFRlc3RGaXh0dXJlOyBcCisgICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXAorICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCisgIH07IFwKKyAgc3RhdGljIGJvb2wgZ3Rlc3RfIyNUZXN0TmFtZSMjX2RlZmluZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKS5BZGRUZXN0TmFtZShcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjQ2FzZU5hbWUsICNUZXN0TmFtZSk7IFwKKyAgfSBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIHZvaWQgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKTo6VGVzdE5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz46OlRlc3RCb2R5KCkKKworIyBkZWZpbmUgUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoQ2FzZU5hbWUsIC4uLikgXAorICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZXM8X19WQV9BUkdTX18+Ojp0eXBlIGd0ZXN0X0FsbFRlc3RzXzsgXAorICB9IFwKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oQ2FzZU5hbWUpID0gXAorICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKS5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKFwKKyAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNfX1ZBX0FSR1NfXykKKworLy8gVGhlICdUeXBlcycgdGVtcGxhdGUgYXJndW1lbnQgYmVsb3cgbXVzdCBoYXZlIHNwYWNlcyBhcm91bmQgaXQKKy8vIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1heSBjaG9rZSBvbiAnPj4nIHdoZW4gcGFzc2luZyBhIHRlbXBsYXRlCisvLyBpbnN0YW5jZSAoZS5nLiBUeXBlczxpbnQ+KQorIyBkZWZpbmUgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoUHJlZml4LCBDYXNlTmFtZSwgVHlwZXMpIFwKKyAgYm9vbCBndGVzdF8jI1ByZWZpeCMjXyMjQ2FzZU5hbWUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPENhc2VOYW1lLCBcCisgICAgICAgICAgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKTo6Z3Rlc3RfQWxsVGVzdHNfLCBcCisgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZUxpc3Q8IFR5cGVzID46OnR5cGU+OjpSZWdpc3RlcihcCisgICAgICAgICAgICAgICNQcmVmaXgsICNDYXNlTmFtZSwgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEwYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKQEAgLTAsMCArMSwyMjkxIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIEdvb2dsZSBUZXN0LiAgSXQgc2hvdWxkIGJlCisvLyBpbmNsdWRlZCBieSBhbnkgdGVzdCBwcm9ncmFtIHRoYXQgdXNlcyBHb29nbGUgVGVzdC4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKy8vCisvLyBBY2tub3dsZWRnbWVudDogR29vZ2xlIFRlc3QgYm9ycm93ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIHRlc3QKKy8vIHJlZ2lzdHJhdGlvbiBmcm9tIEJhcnRoZWxlbXkgRGFnZW5haXMnIChiYXJ0aGVsZW15QHByb2xvZ2lxdWUuY29tKQorLy8gZWFzeVVuaXQgZnJhbWV3b3JrLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3Byb2QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgiCisKKy8vIERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0sIGRpZmZlcmVudCBzdHJpbmcgY2xhc3NlcyBhcmUgYXZhaWxhYmxlLgorLy8gT24gTGludXgsIGluIGFkZGl0aW9uIHRvIDo6c3RkOjpzdHJpbmcsIEdvb2dsZSBhbHNvIG1ha2VzIHVzZSBvZgorLy8gY2xhc3MgOjpzdHJpbmcsIHdoaWNoIGhhcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgOjpzdGQ6OnN0cmluZywgYnV0CisvLyBoYXMgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCisvLworLy8gVGhlIHVzZXIgY2FuIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyB0byAxIHRvIGluZGljYXRlIHRoYXQKKy8vIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSBBTkQgaXMgYSBkaXN0aW5jdCB0eXBlIHRvIDo6c3RkOjpzdHJpbmcsIG9yCisvLyBkZWZpbmUgaXQgdG8gMCB0byBpbmRpY2F0ZSBvdGhlcndpc2UuCisvLworLy8gSWYgdGhlIHVzZXIncyA6OnN0ZDo6c3RyaW5nIGFuZCA6OnN0cmluZyBhcmUgdGhlIHNhbWUgY2xhc3MgZHVlIHRvCisvLyBhbGlhc2luZywgaGUgc2hvdWxkIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyB0byAwLgorLy8KKy8vIElmIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HLCBpdCBpcyBkZWZpbmVkCisvLyBoZXVyaXN0aWNhbGx5LgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlY2xhcmVzIHRoZSBmbGFncy4KKworLy8gVGhpcyBmbGFnIHRlbXBvcmFyeSBlbmFibGVzIHRoZSBkaXNhYmxlZCB0ZXN0cy4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOworCisvLyBUaGlzIGZsYWcgYnJpbmdzIHRoZSBkZWJ1Z2dlciBvbiBhbiBhc3NlcnRpb24gZmFpbHVyZS4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oYnJlYWtfb25fZmFpbHVyZSk7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhdGNoZXMgYWxsIHRlc3QtdGhyb3duIGV4Y2VwdGlvbnMKKy8vIGFuZCBsb2dzIHRoZW0gYXMgZmFpbHVyZXMuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGNhdGNoX2V4Y2VwdGlvbnMpOworCisvLyBUaGlzIGZsYWcgZW5hYmxlcyB1c2luZyBjb2xvcnMgaW4gdGVybWluYWwgb3V0cHV0LiBBdmFpbGFibGUgdmFsdWVzIGFyZQorLy8gInllcyIgdG8gZW5hYmxlIGNvbG9ycywgIm5vIiAoZGlzYWJsZSBjb2xvcnMpLCBvciAiYXV0byIgKHRoZSBkZWZhdWx0KQorLy8gdG8gbGV0IEdvb2dsZSBUZXN0IGRlY2lkZS4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhjb2xvcik7CisKKy8vIFRoaXMgZmxhZyBzZXRzIHVwIHRoZSBmaWx0ZXIgdG8gc2VsZWN0IGJ5IG5hbWUgdXNpbmcgYSBnbG9iIHBhdHRlcm4KKy8vIHRoZSB0ZXN0cyB0byBydW4uIElmIHRoZSBmaWx0ZXIgaXMgbm90IGdpdmVuIGFsbCB0ZXN0cyBhcmUgZXhlY3V0ZWQuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZmlsdGVyKTsKKworLy8gVGhpcyBmbGFnIGNhdXNlcyB0aGUgR29vZ2xlIFRlc3QgdG8gbGlzdCB0ZXN0cy4gTm9uZSBvZiB0aGUgdGVzdHMgbGlzdGVkCisvLyBhcmUgYWN0dWFsbHkgcnVuIGlmIHRoZSBmbGFnIGlzIHByb3ZpZGVkLgorR1RFU1RfREVDTEFSRV9ib29sXyhsaXN0X3Rlc3RzKTsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgZW1pdHMgYSBkZXRhaWxlZCBYTUwgcmVwb3J0IHRvIGEgZmlsZQorLy8gaW4gYWRkaXRpb24gdG8gaXRzIG5vcm1hbCB0ZXh0dWFsIG91dHB1dC4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhvdXRwdXQpOworCisvLyBUaGlzIGZsYWdzIGNvbnRyb2wgd2hldGhlciBHb29nbGUgVGVzdCBwcmludHMgdGhlIGVsYXBzZWQgdGltZSBmb3IgZWFjaAorLy8gdGVzdC4KK0dURVNUX0RFQ0xBUkVfYm9vbF8ocHJpbnRfdGltZSk7CisKKy8vIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIHJhbmRvbSBudW1iZXIgc2VlZC4KK0dURVNUX0RFQ0xBUkVfaW50MzJfKHJhbmRvbV9zZWVkKTsKKworLy8gVGhpcyBmbGFnIHNldHMgaG93IG1hbnkgdGltZXMgdGhlIHRlc3RzIGFyZSByZXBlYXRlZC4gVGhlIGRlZmF1bHQgdmFsdWUKKy8vIGlzIDEuIElmIHRoZSB2YWx1ZSBpcyAtMSB0aGUgdGVzdHMgYXJlIHJlcGVhdGluZyBmb3JldmVyLgorR1RFU1RfREVDTEFSRV9pbnQzMl8ocmVwZWF0KTsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgaW5jbHVkZXMgR29vZ2xlIFRlc3QgaW50ZXJuYWwKKy8vIHN0YWNrIGZyYW1lcyBpbiBmYWlsdXJlIHN0YWNrIHRyYWNlcy4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMpOworCisvLyBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRlc3RzJyBvcmRlciBpcyByYW5kb21pemVkIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oc2h1ZmZsZSk7CisKKy8vIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZQorLy8gcHJpbnRlZCBpbiBhIGZhaWx1cmUgbWVzc2FnZS4KK0dURVNUX0RFQ0xBUkVfaW50MzJfKHN0YWNrX3RyYWNlX2RlcHRoKTsKKworLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbgorLy8gZXhjZXB0aW9uIGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhCisvLyBub24temVybyBjb2RlIG90aGVyd2lzZS4KK0dURVNUX0RFQ0xBUkVfYm9vbF8odGhyb3dfb25fZmFpbHVyZSk7CisKKy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB3aXRoIGEgImhvc3Q6cG9ydCIgc3RyaW5nLCBvbiBzdXBwb3J0ZWQKKy8vIHBsYXRmb3JtcyB0ZXN0IHJlc3VsdHMgYXJlIHN0cmVhbWVkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBvbgorLy8gdGhlIHNwZWNpZmllZCBob3N0IG1hY2hpbmUuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oc3RyZWFtX3Jlc3VsdF90byk7CisKKy8vIFRoZSB1cHBlciBsaW1pdCBmb3IgdmFsaWQgc3RhY2sgdHJhY2UgZGVwdGhzLgorY29uc3QgaW50IGtNYXhTdGFja1RyYWNlRGVwdGggPSAxMDA7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIEFzc2VydEhlbHBlcjsKK2NsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworY2xhc3MgRXhlY0RlYXRoVGVzdDsKK2NsYXNzIE5vRXhlY0RlYXRoVGVzdDsKK2NsYXNzIEZpbmFsU3VjY2Vzc0NoZWNrZXI7CitjbGFzcyBHVGVzdEZsYWdTYXZlcjsKK2NsYXNzIFN0cmVhbWluZ0xpc3RlbmVyVGVzdDsKK2NsYXNzIFRlc3RSZXN1bHRBY2Nlc3NvcjsKK2NsYXNzIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOworY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXI7CitjbGFzcyBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlcjsKK2NsYXNzIFdpbmRvd3NEZWF0aFRlc3Q7CitjbGFzcyBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpOwordm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGUgZnJpZW5kIHJlbGF0aW9uc2hpcCBvZiBzb21lIG9mIHRoZXNlIGNsYXNzZXMgaXMgY3ljbGljLgorLy8gSWYgd2UgZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIHRoZW0gdGhlIGNvbXBpbGVyIG1pZ2h0IGNvbmZ1c2UgdGhlIGNsYXNzZXMKKy8vIGluIGZyaWVuZHNoaXAgY2xhdXNlcyB3aXRoIHNhbWUgbmFtZWQgY2xhc3NlcyBvbiB0aGUgc2NvcGUuCitjbGFzcyBUZXN0OworY2xhc3MgVGVzdENhc2U7CitjbGFzcyBUZXN0SW5mbzsKK2NsYXNzIFVuaXRUZXN0OworCisvLyBBIGNsYXNzIGZvciBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gYXNzZXJ0aW9uIHdhcyBzdWNjZXNzZnVsLiAgV2hlbgorLy8gdGhlIGFzc2VydGlvbiB3YXNuJ3Qgc3VjY2Vzc2Z1bCwgdGhlIEFzc2VydGlvblJlc3VsdCBvYmplY3QKKy8vIHJlbWVtYmVycyBhIG5vbi1lbXB0eSBtZXNzYWdlIHRoYXQgZGVzY3JpYmVzIGhvdyBpdCBmYWlsZWQuCisvLworLy8gVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHVzZSBvbmUgb2YgdGhlIGZhY3RvcnkgZnVuY3Rpb25zCisvLyAoQXNzZXJ0aW9uU3VjY2VzcygpIGFuZCBBc3NlcnRpb25GYWlsdXJlKCkpLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGZvciB0d28gcHVycG9zZXM6CisvLyAgIDEuIERlZmluaW5nIHByZWRpY2F0ZSBmdW5jdGlvbnMgdG8gYmUgdXNlZCB3aXRoIEJvb2xlYW4gdGVzdCBhc3NlcnRpb25zCisvLyAgICAgIEVYUEVDVF9UUlVFL0VYUEVDVF9GQUxTRSBhbmQgdGhlaXIgQVNTRVJUXyBjb3VudGVycGFydHMKKy8vICAgMi4gRGVmaW5pbmcgcHJlZGljYXRlLWZvcm1hdCBmdW5jdGlvbnMgdG8gYmUKKy8vICAgICAgdXNlZCB3aXRoIHByZWRpY2F0ZSBhc3NlcnRpb25zIChBU1NFUlRfUFJFRF9GT1JNQVQqLCBldGMpLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiB5b3UgZGVmaW5lIElzRXZlbiBwcmVkaWNhdGU6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKKy8vICAgfQorLy8KKy8vIFRoZW4gdGhlIGZhaWxlZCBleHBlY3RhdGlvbiBFWFBFQ1RfVFJVRShJc0V2ZW4oRmliKDUpKSkKKy8vIHdpbGwgcHJpbnQgdGhlIG1lc3NhZ2UKKy8vCisvLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDUpKQorLy8gICAgIEFjdHVhbDogZmFsc2UgKDUgaXMgb2RkKQorLy8gICBFeHBlY3RlZDogdHJ1ZQorLy8KKy8vIGluc3RlYWQgb2YgYSBtb3JlIG9wYXF1ZQorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCisvLyAgICAgQWN0dWFsOiBmYWxzZQorLy8gICBFeHBlY3RlZDogdHJ1ZQorLy8KKy8vIGluIGNhc2UgSXNFdmVuIGlzIGEgc2ltcGxlIEJvb2xlYW4gcHJlZGljYXRlLgorLy8KKy8vIElmIHlvdSBleHBlY3QgeW91ciBwcmVkaWNhdGUgdG8gYmUgcmV1c2VkIGFuZCB3YW50IHRvIHN1cHBvcnQgaW5mb3JtYXRpdmUKKy8vIG1lc3NhZ2VzIGluIEVYUEVDVF9GQUxTRSBhbmQgQVNTRVJUX0ZBTFNFIChuZWdhdGl2ZSBhc3NlcnRpb25zIHNob3cgdXAKKy8vIGFib3V0IGhhbGYgYXMgb2Z0ZW4gYXMgcG9zaXRpdmUgb25lcyBpbiBvdXIgdGVzdHMpLCBzdXBwbHkgbWVzc2FnZXMgZm9yCisvLyBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgY2FzZXM6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOworLy8gICAgIGVsc2UKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7CisvLyAgIH0KKy8vCisvLyBUaGVuIGEgc3RhdGVtZW50IEVYUEVDVF9GQUxTRShJc0V2ZW4oRmliKDYpKSkgd2lsbCBwcmludAorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNikpCisvLyAgICAgQWN0dWFsOiB0cnVlICg4IGlzIGV2ZW4pCisvLyAgIEV4cGVjdGVkOiBmYWxzZQorLy8KKy8vIE5COiBQcmVkaWNhdGVzIHRoYXQgc3VwcG9ydCBuZWdhdGl2ZSBCb29sZWFuIGFzc2VydGlvbnMgaGF2ZSByZWR1Y2VkCisvLyBwZXJmb3JtYW5jZSBpbiBwb3NpdGl2ZSBvbmVzIHNvIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0aGVtIGluIHRlc3RzCisvLyB0aGF0IGhhdmUgbG90cyAodGVucyBvZiB0aG91c2FuZHMpIG9mIHBvc2l0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucy4KKy8vCisvLyBUbyB1c2UgdGhpcyBjbGFzcyB3aXRoIEVYUEVDVF9QUkVEX0ZPUk1BVCBhc3NlcnRpb25zIHN1Y2ggYXM6CisvLworLy8gICAvLyBWZXJpZmllcyB0aGF0IEZvbygpIHJldHVybnMgYW4gZXZlbiBudW1iZXIuCisvLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNFdmVuLCBGb28oKSk7CisvLworLy8geW91IG5lZWQgdG8gZGVmaW5lOgorLy8KKy8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihjb25zdCBjaGFyKiBleHByLCBpbnQgbikgeworLy8gICAgIGlmICgobiAlIDIpID09IDApCisvLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworLy8gICAgIGVsc2UKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKy8vICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cHIgPDwgIiBpcyBldmVuXG4gIEFjdHVhbDogaXQncyAiIDw8IG47CisvLyAgIH0KKy8vCisvLyBJZiBGb28oKSByZXR1cm5zIDUsIHlvdSB3aWxsIHNlZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6CisvLworLy8gICBFeHBlY3RlZDogRm9vKCkgaXMgZXZlbgorLy8gICAgIEFjdHVhbDogaXQncyA1CisvLworY2xhc3MgR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgeworIHB1YmxpYzoKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgLy8gVXNlZCBpbiBFWFBFQ1RfVFJVRS9GQUxTRShhc3NlcnRpb25fcmVzdWx0KS4KKyAgQXNzZXJ0aW9uUmVzdWx0KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpOworICAvLyBVc2VkIGluIHRoZSBFWFBFQ1RfVFJVRS9GQUxTRShib29sX2V4cHJlc3Npb24pLgorICBleHBsaWNpdCBBc3NlcnRpb25SZXN1bHQoYm9vbCBzdWNjZXNzKSA6IHN1Y2Nlc3NfKHN1Y2Nlc3MpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIHN1Y2NlZWRlZC4KKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3NfOyB9ICAvLyBOT0xJTlQKKworICAvLyBSZXR1cm5zIHRoZSBhc3NlcnRpb24ncyBuZWdhdGlvbi4gVXNlZCB3aXRoIEVYUEVDVC9BU1NFUlRfRkFMU0UuCisgIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvciEoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSB0ZXh0IHN0cmVhbWVkIGludG8gdGhpcyBBc3NlcnRpb25SZXN1bHQuIFRlc3QgYXNzZXJ0aW9ucworICAvLyB1c2UgaXQgd2hlbiB0aGV5IGZhaWwgKGkuZS4sIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lIGRvZXNuJ3QgbWF0Y2ggdGhlCisgIC8vIGFzc2VydGlvbidzIGV4cGVjdGF0aW9uKS4gV2hlbiBub3RoaW5nIGhhcyBiZWVuIHN0cmVhbWVkIGludG8gdGhlCisgIC8vIG9iamVjdCwgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPyAgbWVzc2FnZV8tPmNfc3RyKCkgOiAiIjsKKyAgfQorICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZW1vdmUgdGhpcyBhZnRlciBtYWtpbmcgc3VyZSBubyBjbGllbnRzIHVzZSBpdC4KKyAgLy8gRGVwcmVjYXRlZDsgcGxlYXNlIHVzZSBtZXNzYWdlKCkgaW5zdGVhZC4KKyAgY29uc3QgY2hhciogZmFpbHVyZV9tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZSgpOyB9CisKKyAgLy8gU3RyZWFtcyBhIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UgaW50byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I8PChjb25zdCBUJiB2YWx1ZSkgeworICAgIEFwcGVuZE1lc3NhZ2UoTWVzc2FnZSgpIDw8IHZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBBbGxvd3Mgc3RyZWFtaW5nIGJhc2ljIG91dHB1dCBtYW5pcHVsYXRvcnMgc3VjaCBhcyBlbmRsIG9yIGZsdXNoIGludG8KKyAgLy8gdGhpcyBvYmplY3QuCisgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I8PCgKKyAgICAgIDo6c3RkOjpvc3RyZWFtJiAoKmJhc2ljX21hbmlwdWxhdG9yKSg6OnN0ZDo6b3N0cmVhbSYgc3RyZWFtKSkgeworICAgIEFwcGVuZE1lc3NhZ2UoTWVzc2FnZSgpIDw8IGJhc2ljX21hbmlwdWxhdG9yKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIG1lc3NhZ2UgdG8gbWVzc2FnZV8uCisgIHZvaWQgQXBwZW5kTWVzc2FnZShjb25zdCBNZXNzYWdlJiBhX21lc3NhZ2UpIHsKKyAgICBpZiAobWVzc2FnZV8uZ2V0KCkgPT0gTlVMTCkKKyAgICAgIG1lc3NhZ2VfLnJlc2V0KG5ldyA6OnN0ZDo6c3RyaW5nKTsKKyAgICBtZXNzYWdlXy0+YXBwZW5kKGFfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgfQorCisgIC8vIFN0b3JlcyByZXN1bHQgb2YgdGhlIGFzc2VydGlvbiBwcmVkaWNhdGUuCisgIGJvb2wgc3VjY2Vzc187CisgIC8vIFN0b3JlcyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24gaW4gY2FzZSB0aGUgZXhwZWN0YXRpb24KKyAgLy8gY29uc3RydWN0IGlzIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgcHJlZGljYXRlJ3Mgb3V0Y29tZS4KKyAgLy8gUmVmZXJlbmNlZCB2aWEgYSBwb2ludGVyIHRvIGF2b2lkIHRha2luZyB0b28gbXVjaCBzdGFjayBmcmFtZSBzcGFjZQorICAvLyB3aXRoIHRlc3QgYXNzZXJ0aW9ucy4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmc+IG1lc3NhZ2VfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXNzZXJ0aW9uUmVzdWx0KTsKK307CisKKy8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpOworCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpOworCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4KKy8vIERlcHJlY2F0ZWQ7IHVzZSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtc2cpOworCisvLyBUaGUgYWJzdHJhY3QgY2xhc3MgdGhhdCBhbGwgdGVzdHMgaW5oZXJpdCBmcm9tLgorLy8KKy8vIEluIEdvb2dsZSBUZXN0LCBhIHVuaXQgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RDYXNlcywgYW5kCisvLyBlYWNoIFRlc3RDYXNlIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RzLgorLy8KKy8vIFdoZW4geW91IGRlZmluZSBhIHRlc3QgdXNpbmcgdGhlIFRFU1QgbWFjcm8sIHlvdSBkb24ndCBuZWVkIHRvCisvLyBleHBsaWNpdGx5IGRlcml2ZSBmcm9tIFRlc3QgLSB0aGUgVEVTVCBtYWNybyBhdXRvbWF0aWNhbGx5IGRvZXMKKy8vIHRoaXMgZm9yIHlvdS4KKy8vCisvLyBUaGUgb25seSB0aW1lIHlvdSBkZXJpdmUgZnJvbSBUZXN0IGlzIHdoZW4gZGVmaW5pbmcgYSB0ZXN0IGZpeHR1cmUKKy8vIHRvIGJlIHVzZWQgYSBURVNUX0YuICBGb3IgZXhhbXBsZToKKy8vCisvLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisvLyAgICBwcm90ZWN0ZWQ6CisvLyAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyAuLi4gfQorLy8gICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgLi4uIH0KKy8vICAgICAuLi4KKy8vICAgfTsKKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBCYXIpIHsgLi4uIH0KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQorLy8KKy8vIFRlc3QgaXMgbm90IGNvcHlhYmxlLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0IHsKKyBwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKKworICAvLyBEZWZpbmVzIHR5cGVzIGZvciBwb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBzZXQgdXAgYW5kIHRlYXIgZG93bgorICAvLyBhIHRlc3QgY2FzZS4KKyAgdHlwZWRlZiBpbnRlcm5hbDo6U2V0VXBUZXN0Q2FzZUZ1bmMgU2V0VXBUZXN0Q2FzZUZ1bmM7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlRlYXJEb3duVGVzdENhc2VGdW5jIFRlYXJEb3duVGVzdENhc2VGdW5jOworCisgIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIGludGVuZCB0byBpbmhlcml0IGZyb20gVGVzdC4KKyAgdmlydHVhbCB+VGVzdCgpOworCisgIC8vIFNldHMgdXAgdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vCisgIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlNldFVwVGVzdENhc2UoKSBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QKKyAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCisgIC8vIFNldFVwVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKKyAgLy8gY2xhc3MuCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7fQorCisgIC8vIFRlYXJzIGRvd24gdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vCisgIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlRlYXJEb3duVGVzdENhc2UoKSBhZnRlciBydW5uaW5nIHRoZSBsYXN0CisgIC8vIHRlc3QgaW4gdGVzdCBjYXNlIEZvby4gIEhlbmNlIGEgc3ViLWNsYXNzIGNhbiBkZWZpbmUgaXRzIG93bgorICAvLyBUZWFyRG93blRlc3RDYXNlKCkgbWV0aG9kIHRvIHNoYWRvdyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIHN1cGVyCisgIC8vIGNsYXNzLgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgZmF0YWwgZmFpbHVyZS4KKyAgc3RhdGljIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICBzdGF0aWMgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmUoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgKGVpdGhlciBmYXRhbCBvcgorICAvLyBub24tZmF0YWwpIGZhaWx1cmUuCisgIHN0YXRpYyBib29sIEhhc0ZhaWx1cmUoKSB7IHJldHVybiBIYXNGYXRhbEZhaWx1cmUoKSB8fCBIYXNOb25mYXRhbEZhaWx1cmUoKTsgfQorCisgIC8vIExvZ3MgYSBwcm9wZXJ0eSBmb3IgdGhlIGN1cnJlbnQgdGVzdCwgdGVzdCBjYXNlLCBvciBmb3IgdGhlIGVudGlyZQorICAvLyBpbnZvY2F0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW0gd2hlbiB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgYQorICAvLyB0ZXN0IGNhc2UuICBPbmx5IHRoZSBsYXN0IHZhbHVlIGZvciBhIGdpdmVuIGtleSBpcyByZW1lbWJlcmVkLiAgVGhlc2UKKyAgLy8gYXJlIHB1YmxpYyBzdGF0aWMgc28gdGhleSBjYW4gYmUgY2FsbGVkIGZyb20gdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgLy8gbm90IG1lbWJlcnMgb2YgdGhlIHRlc3QgZml4dHVyZS4gIENhbGxzIHRvIFJlY29yZFByb3BlcnR5IG1hZGUgZHVyaW5nCisgIC8vIGxpZmVzcGFuIG9mIHRoZSB0ZXN0IChmcm9tIHRoZSBtb21lbnQgaXRzIGNvbnN0cnVjdG9yIHN0YXJ0cyB0byB0aGUKKyAgLy8gbW9tZW50IGl0cyBkZXN0cnVjdG9yIGZpbmlzaGVzKSB3aWxsIGJlIG91dHB1dCBpbiBYTUwgYXMgYXR0cmlidXRlcyBvZgorICAvLyB0aGUgPHRlc3RjYXNlPiBlbGVtZW50LiAgUHJvcGVydGllcyByZWNvcmRlZCBmcm9tIGZpeHR1cmUncworICAvLyBTZXRVcFRlc3RDYXNlIG9yIFRlYXJEb3duVGVzdENhc2UgYXJlIGxvZ2dlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIDx0ZXN0c3VpdGU+IGVsZW1lbnQuICBDYWxscyB0byBSZWNvcmRQcm9wZXJ0eSBtYWRlIGluIHRoZQorICAvLyBnbG9iYWwgY29udGV4dCAoYmVmb3JlIG9yIGFmdGVyIGludm9jYXRpb24gb2YgUlVOX0FMTF9URVNUUyBhbmQgZnJvbQorICAvLyBTZXRVcC9UZWFyRG93biBtZXRob2Qgb2YgRW52aXJvbm1lbnQgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggR29vZ2xlCisgIC8vIFRlc3QpIHdpbGwgYmUgb3V0cHV0IGFzIGF0dHJpYnV0ZXMgb2YgdGhlIDx0ZXN0c3VpdGVzPiBlbGVtZW50LgorICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpOworCisgcHJvdGVjdGVkOgorICAvLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCisgIFRlc3QoKTsKKworICAvLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOworCisgIC8vIFRlYXJzIGRvd24gdGhlIHRlc3QgZml4dHVyZS4KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7CisKKyBwcml2YXRlOgorICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIHRoZSBzYW1lIGZpeHR1cmUgY2xhc3MgYXMKKyAgLy8gdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgorICBzdGF0aWMgYm9vbCBIYXNTYW1lRml4dHVyZUNsYXNzKCk7CisKKyAgLy8gUnVucyB0aGUgdGVzdCBhZnRlciB0aGUgdGVzdCBmaXh0dXJlIGhhcyBiZWVuIHNldCB1cC4KKyAgLy8KKyAgLy8gQSBzdWItY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhpcyB0byBkZWZpbmUgdGhlIHRlc3QgbG9naWMuCisgIC8vCisgIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OIERJUkVDVExZIElOIEEgVVNFUiBQUk9HUkFNLgorICAvLyBJbnN0ZWFkLCB1c2UgdGhlIFRFU1Qgb3IgVEVTVF9GIG1hY3JvLgorICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKSA9IDA7CisKKyAgLy8gU2V0cyB1cCwgZXhlY3V0ZXMsIGFuZCB0ZWFycyBkb3duIHRoZSB0ZXN0LgorICB2b2lkIFJ1bigpOworCisgIC8vIERlbGV0ZXMgc2VsZi4gIFdlIGRlbGliZXJhdGVseSBwaWNrIGFuIHVudXN1YWwgbmFtZSBmb3IgdGhpcworICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gYXZvaWQgY2xhc2hpbmcgd2l0aCBuYW1lcyB1c2VkIGluIHVzZXIgVEVTVHMuCisgIHZvaWQgRGVsZXRlU2VsZl8oKSB7IGRlbGV0ZSB0aGlzOyB9CisKKyAgLy8gVXNlcyBhIEdUZXN0RmxhZ1NhdmVyIHRvIHNhdmUgYW5kIHJlc3RvcmUgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorICBjb25zdCBpbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIqIGNvbnN0IGd0ZXN0X2ZsYWdfc2F2ZXJfOworCisgIC8vIE9mdGVuIGEgdXNlciBtaXMtc3BlbGxzIFNldFVwKCkgYXMgU2V0dXAoKSBhbmQgc3BlbmRzIGEgbG9uZyB0aW1lCisgIC8vIHdvbmRlcmluZyB3aHkgaXQgaXMgbmV2ZXIgY2FsbGVkIGJ5IEdvb2dsZSBUZXN0LiAgVGhlIGRlY2xhcmF0aW9uIG9mCisgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIHNvbGVseSBmb3IgY2F0Y2hpbmcgc3VjaCBhbiBlcnJvciBhdAorICAvLyBjb21waWxlIHRpbWU6CisgIC8vCisgIC8vICAgLSBUaGUgcmV0dXJuIHR5cGUgaXMgZGVsaWJlcmF0ZWx5IGNob3NlbiB0byBiZSBub3Qgdm9pZCwgc28gaXQKKyAgLy8gICB3aWxsIGJlIGEgY29uZmxpY3QgaWYgYSB1c2VyIGRlY2xhcmVzIHZvaWQgU2V0dXAoKSBpbiBoaXMgdGVzdAorICAvLyAgIGZpeHR1cmUuCisgIC8vCisgIC8vICAgLSBUaGlzIG1ldGhvZCBpcyBwcml2YXRlLCBzbyBpdCB3aWxsIGJlIGFub3RoZXIgY29tcGlsZXIgZXJyb3IKKyAgLy8gICBpZiBhIHVzZXIgY2FsbHMgaXQgZnJvbSBoaXMgdGVzdCBmaXh0dXJlLgorICAvLworICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBGVU5DVElPTi4KKyAgLy8KKyAgLy8gSWYgeW91IHNlZSBhbiBlcnJvciBhYm91dCBvdmVycmlkaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gb3IKKyAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLgorICBzdHJ1Y3QgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAge307CisgIHZpcnR1YWwgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAqIFNldHVwKCkgeyByZXR1cm4gTlVMTDsgfQorCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdHMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdCk7Cit9OworCit0eXBlZGVmIGludGVybmFsOjpUaW1lSW5NaWxsaXMgVGltZUluTWlsbGlzOworCisvLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgYSB1c2VyIHNwZWNpZmllZCB0ZXN0IHByb3BlcnR5IHdoaWNoIGNhbiBiZQorLy8gb3V0cHV0IGFzIGEga2V5L3ZhbHVlIHN0cmluZyBwYWlyLgorLy8KKy8vIERvbid0IGluaGVyaXQgZnJvbSBUZXN0UHJvcGVydHkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCitjbGFzcyBUZXN0UHJvcGVydHkgeworIHB1YmxpYzoKKyAgLy8gQyd0b3IuICBUZXN0UHJvcGVydHkgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQorICAvLyBUZXN0UHJvcGVydHkgb2JqZWN0LgorICBUZXN0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGFfa2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgYV92YWx1ZSkgOgorICAgIGtleV8oYV9rZXkpLCB2YWx1ZV8oYV92YWx1ZSkgeworICB9CisKKyAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCBrZXkuCisgIGNvbnN0IGNoYXIqIGtleSgpIGNvbnN0IHsKKyAgICByZXR1cm4ga2V5Xy5jX3N0cigpOworICB9CisKKyAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCB2YWx1ZS4KKyAgY29uc3QgY2hhciogdmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXy5jX3N0cigpOworICB9CisKKyAgLy8gU2V0cyBhIG5ldyB2YWx1ZSwgb3ZlcnJpZGluZyB0aGUgb25lIHN1cHBsaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBTZXRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgbmV3X3ZhbHVlKSB7CisgICAgdmFsdWVfID0gbmV3X3ZhbHVlOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUga2V5IHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorICBzdGQ6OnN0cmluZyBrZXlfOworICAvLyBUaGUgdmFsdWUgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisgIHN0ZDo6c3RyaW5nIHZhbHVlXzsKK307CisKKy8vIFRoZSByZXN1bHQgb2YgYSBzaW5nbGUgVGVzdC4gIFRoaXMgaW5jbHVkZXMgYSBsaXN0IG9mCisvLyBUZXN0UGFydFJlc3VsdHMsIGEgbGlzdCBvZiBUZXN0UHJvcGVydGllcywgYSBjb3VudCBvZiBob3cgbWFueQorLy8gZGVhdGggdGVzdHMgdGhlcmUgYXJlIGluIHRoZSBUZXN0LCBhbmQgaG93IG11Y2ggdGltZSBpdCB0b29rIHRvIHJ1bgorLy8gdGhlIFRlc3QuCisvLworLy8gVGVzdFJlc3VsdCBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RSZXN1bHQgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgorICBUZXN0UmVzdWx0KCk7CisKKyAgLy8gRCd0b3IuICBEbyBub3QgaW5oZXJpdCBmcm9tIFRlc3RSZXN1bHQuCisgIH5UZXN0UmVzdWx0KCk7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IHBhcnRzLiAgVGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIKKyAgLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgorICBpbnQgdG90YWxfcGFydF9jb3VudCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLgorICBpbnQgdGVzdF9wcm9wZXJ0eV9jb3VudCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFzc2VkIChpLmUuIG5vIHRlc3QgcGFydCBmYWlsZWQpLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLgorICBib29sIEZhaWxlZCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCisgIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbiByYW5nZQorICAvLyBmcm9tIDAgdG8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzCisgIC8vIHRoZSBwcm9ncmFtLgorICBjb25zdCBUZXN0UGFydFJlc3VsdCYgR2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwcm9wZXJ0eS4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKKyAgLy8gcHJvZ3JhbS4KKyAgY29uc3QgVGVzdFByb3BlcnR5JiBHZXRUZXN0UHJvcGVydHkoaW50IGkpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworICBmcmllbmQgY2xhc3MgVGVzdENhc2U7CisgIGZyaWVuZCBjbGFzcyBVbml0VGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpFeGVjRGVhdGhUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRlc3RSZXN1bHRBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6V2luZG93c0RlYXRoVGVzdDsKKworICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3BhcnRfcmVzdWx0c187CisgIH0KKworICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4mIHRlc3RfcHJvcGVydGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXzsKKyAgfQorCisgIC8vIFNldHMgdGhlIGVsYXBzZWQgdGltZS4KKyAgdm9pZCBzZXRfZWxhcHNlZF90aW1lKFRpbWVJbk1pbGxpcyBlbGFwc2VkKSB7IGVsYXBzZWRfdGltZV8gPSBlbGFwc2VkOyB9CisKKyAgLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIFRoZSBwcm9wZXJ0eSBpcyB2YWxpZGF0ZWQgYW5kIG1heSBhZGQKKyAgLy8gYSBub24tZmF0YWwgZmFpbHVyZSBpZiBpbnZhbGlkIChlLmcuLCBpZiBpdCBjb25mbGljdHMgd2l0aCByZXNlcnZlZAorICAvLyBrZXkgbmFtZXMpLiBJZiBhIHByb3BlcnR5IGlzIGFscmVhZHkgcmVjb3JkZWQgZm9yIHRoZSBzYW1lIGtleSwgdGhlCisgIC8vIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCwgcmF0aGVyIHRoYW4gc3RvcmluZyBtdWx0aXBsZSB2YWx1ZXMgZm9yIHRoZSBzYW1lCisgIC8vIGtleS4gIHhtbF9lbGVtZW50IHNwZWNpZmllcyB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdGhlIHByb3BlcnR5IGlzIGJlaW5nCisgIC8vIHJlY29yZGVkIGFuZCBpcyB1c2VkIGZvciB2YWxpZGF0aW9uLgorICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOworCisgIC8vIEFkZHMgYSBmYWlsdXJlIGlmIHRoZSBrZXkgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgb2YgR29vZ2xlIFRlc3QKKyAgLy8gdGVzdGNhc2UgdGFncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCisgIC8vIFRPRE8ocnVzc3IpOiBWYWxpZGF0ZSBhdHRyaWJ1dGUgbmFtZXMgYXJlIGxlZ2FsIGFuZCBodW1hbiByZWFkYWJsZS4KKyAgc3RhdGljIGJvb2wgVmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOworCisgIC8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0LgorICB2b2lkIEFkZFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKKworICAvLyBSZXR1cm5zIHRoZSBkZWF0aCB0ZXN0IGNvdW50LgorICBpbnQgZGVhdGhfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGRlYXRoX3Rlc3RfY291bnRfOyB9CisKKyAgLy8gSW5jcmVtZW50cyB0aGUgZGVhdGggdGVzdCBjb3VudCwgcmV0dXJuaW5nIHRoZSBuZXcgY291bnQuCisgIGludCBpbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpIHsgcmV0dXJuICsrZGVhdGhfdGVzdF9jb3VudF87IH0KKworICAvLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLgorICB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKCk7CisKKyAgLy8gQ2xlYXJzIHRoZSBvYmplY3QuCisgIHZvaWQgQ2xlYXIoKTsKKworICAvLyBQcm90ZWN0cyBtdXRhYmxlIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eSB2ZWN0b3IgYW5kIG9mIG93bmVkCisgIC8vIHByb3BlcnRpZXMsIHdob3NlIHZhbHVlcyBtYXkgYmUgdXBkYXRlZC4KKyAgaW50ZXJuYWw6Ok11dGV4IHRlc3RfcHJvcGVyaXRlc19tdXRleF87CisKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0UGFydFJlc3VsdHMKKyAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IHRlc3RfcGFydF9yZXN1bHRzXzsKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0UHJvcGVydGllcworICBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+IHRlc3RfcHJvcGVydGllc187CisgIC8vIFJ1bm5pbmcgY291bnQgb2YgZGVhdGggdGVzdHMuCisgIGludCBkZWF0aF90ZXN0X2NvdW50XzsKKyAgLy8gVGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsKKworICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RSZXN1bHQuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdFJlc3VsdCk7Cit9OyAgLy8gY2xhc3MgVGVzdFJlc3VsdAorCisvLyBBIFRlc3RJbmZvIG9iamVjdCBzdG9yZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCBhIHRlc3Q6CisvLworLy8gICBUZXN0IGNhc2UgbmFtZQorLy8gICBUZXN0IG5hbWUKKy8vICAgV2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgcnVuCisvLyAgIEEgZnVuY3Rpb24gcG9pbnRlciB0aGF0IGNyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0IHdoZW4gaW52b2tlZAorLy8gICBUZXN0IHJlc3VsdAorLy8KKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBUZXN0SW5mbyByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIFVuaXRUZXN0CisvLyBzaW5nbGV0b24gc3VjaCB0aGF0IHRoZSBSVU5fQUxMX1RFU1RTKCkgbWFjcm8ga25vd3Mgd2hpY2ggdGVzdHMgdG8KKy8vIHJ1bi4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdEluZm8geworIHB1YmxpYzoKKyAgLy8gRGVzdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdmlydHVhbCwgc28KKyAgLy8gZG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RJbmZvLgorICB+VGVzdEluZm8oKTsKKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgbmFtZS4KKyAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUoKSBjb25zdCB7IHJldHVybiB0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIHRlc3QgbmFtZS4KKyAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkCisgIC8vIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0oKSBjb25zdCB7CisgICAgaWYgKHR5cGVfcGFyYW1fLmdldCgpICE9IE5VTEwpCisgICAgICByZXR1cm4gdHlwZV9wYXJhbV8tPmNfc3RyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcworICAvLyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtKCkgY29uc3QgeworICAgIGlmICh2YWx1ZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB2YWx1ZV9wYXJhbV8tPmNfc3RyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0ZXN0IHNob3VsZCBydW4sIHRoYXQgaXMgaWYgdGhlIHRlc3QgaXMgbm90CisgIC8vIGRpc2FibGVkIChvciBpdCBpcyBkaXNhYmxlZCBidXQgdGhlIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgaGFzCisgIC8vIGJlZW4gc3BlY2lmaWVkKSBhbmQgaXRzIGZ1bGwgbmFtZSBtYXRjaGVzIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIuCisgIC8vCisgIC8vIEdvb2dsZSBUZXN0IGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIHRlc3RzIGJ5IHRoZWlyIGZ1bGwgbmFtZXMuCisgIC8vIFRoZSBmdWxsIG5hbWUgb2YgYSB0ZXN0IEJhciBpbiB0ZXN0IGNhc2UgRm9vIGlzIGRlZmluZWQgYXMKKyAgLy8gIkZvby5CYXIiLiAgT25seSB0aGUgdGVzdHMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIHdpbGwgcnVuLgorICAvLworICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMsCisgIC8vIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAnLScgYW5kIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YKKyAgLy8gbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvIGV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdAorICAvLyBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZgorICAvLyB0aGUgbmVnYXRpdmUgcGF0dGVybnMuCisgIC8vCisgIC8vIEZvciBleGFtcGxlLCAqQSo6Rm9vLiogaXMgYSBmaWx0ZXIgdGhhdCBtYXRjaGVzIGFueSBzdHJpbmcgdGhhdAorICAvLyBjb250YWlucyB0aGUgY2hhcmFjdGVyICdBJyBvciBzdGFydHMgd2l0aCAiRm9vLiIuCisgIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHRlc3Qgd2lsbCBhcHBlYXIgaW4gdGhlIFhNTCByZXBvcnQuCisgIGJvb2wgaXNfcmVwb3J0YWJsZSgpIGNvbnN0IHsKKyAgICAvLyBGb3Igbm93LCB0aGUgWE1MIHJlcG9ydCBpbmNsdWRlcyBhbGwgdGVzdHMgbWF0Y2hpbmcgdGhlIGZpbHRlci4KKyAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgdHJpbSB0ZXN0cyB0aGF0IGFyZSBleGNsdWRlZCBiZWNhdXNlIG9mCisgICAgLy8gc2hhcmRpbmcuCisgICAgcmV0dXJuIG1hdGNoZXNfZmlsdGVyXzsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4KKyAgY29uc3QgVGVzdFJlc3VsdCogcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJnJlc3VsdF87IH0KKworIHByaXZhdGU6CisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgZnJpZW5kIGNsYXNzIFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U3RyZWFtaW5nTGlzdGVuZXJUZXN0OworICBmcmllbmQgVGVzdEluZm8qIGludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCisgICAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKKyAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKKyAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOworCisgIC8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIFRoZSBuZXdseSBjb25zdHJ1Y3RlZCBpbnN0YW5jZSBhc3N1bWVzCisgIC8vIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCisgIFRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwgICAvLyBOVUxMIGlmIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0CisgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sICAvLyBOVUxMIGlmIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdAorICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOworCisgIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiBkZWF0aCB0ZXN0cyBlbmNvdW50ZXJlZCBpbiB0aGlzIHRlc3Qgc28KKyAgLy8gZmFyLgorICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7CisgICAgcmV0dXJuIHJlc3VsdF8uaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCisgIC8vIGRlbGV0ZXMgaXQuCisgIHZvaWQgUnVuKCk7CisKKyAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UmVzdWx0KFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICB0ZXN0X2luZm8tPnJlc3VsdF8uQ2xlYXIoKTsKKyAgfQorCisgIC8vIFRoZXNlIGZpZWxkcyBhcmUgaW1tdXRhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHRlc3QuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsgICAgIC8vIFRlc3QgY2FzZSBuYW1lCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOyAgICAgICAgICAgICAgIC8vIFRlc3QgbmFtZQorICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOworICAvLyBUZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHZhbHVlX3BhcmFtXzsKKyAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkXzsgICAvLyBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCisgIGJvb2wgc2hvdWxkX3J1bl87ICAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1bgorICBib29sIGlzX2Rpc2FibGVkXzsgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IGlzIGRpc2FibGVkCisgIGJvb2wgbWF0Y2hlc19maWx0ZXJfOyAgICAgICAgICAgICAvLyBUcnVlIGlmIHRoaXMgdGVzdCBtYXRjaGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBjb25zdCBmYWN0b3J5XzsgIC8vIFRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXN0IG9iamVjdAorCisgIC8vIFRoaXMgZmllbGQgaXMgbXV0YWJsZSBhbmQgbmVlZHMgdG8gYmUgcmVzZXQgYmVmb3JlIHJ1bm5pbmcgdGhlCisgIC8vIHRlc3QgZm9yIHRoZSBzZWNvbmQgdGltZS4KKyAgVGVzdFJlc3VsdCByZXN1bHRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEluZm8pOworfTsKKworLy8gQSB0ZXN0IGNhc2UsIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RJbmZvcy4KKy8vCisvLyBUZXN0Q2FzZSBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLworICAvLyBUZXN0Q2FzZSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIEFsd2F5cyB1c2UgdGhpcworICAvLyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBUZXN0Q2FzZSBvYmplY3QuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICBuYW1lOiAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorICAvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKKworICAvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorICB2aXJ0dWFsIH5UZXN0Q2FzZSgpOworCisgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRlc3RDYXNlLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKyAgY29uc3QgY2hhciogdHlwZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgcGFzc2VkLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkX3Rlc3RfY291bnQoKSA+IDA7IH0KKworICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdEluZm8qIEdldFRlc3RJbmZvKGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IHRoYXQgaG9sZHMgdGVzdCBwcm9wZXJ0aWVzIHJlY29yZGVkIGR1cmluZworICAvLyBleGVjdXRpb24gb2YgU2V0VXBUZXN0Q2FzZSBhbmQgVGVhckRvd25UZXN0Q2FzZS4KKyAgY29uc3QgVGVzdFJlc3VsdCYgYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gYWRfaG9jX3Rlc3RfcmVzdWx0XzsgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworCisgIC8vIEdldHMgdGhlIChtdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuCisgIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgeyByZXR1cm4gdGVzdF9pbmZvX2xpc3RfOyB9CisKKyAgLy8gR2V0cyB0aGUgKGltbXV0YWJsZSkgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGlzIFRlc3RDYXNlLgorICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+JiB0ZXN0X2luZm9fbGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9pbmZvX2xpc3RfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RJbmZvKiBHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpOworCisgIC8vIFNldHMgdGhlIHNob3VsZF9ydW4gbWVtYmVyLgorICB2b2lkIHNldF9zaG91bGRfcnVuKGJvb2wgc2hvdWxkKSB7IHNob3VsZF9ydW5fID0gc2hvdWxkOyB9CisKKyAgLy8gQWRkcyBhIFRlc3RJbmZvIHRvIHRoaXMgdGVzdCBjYXNlLiAgV2lsbCBkZWxldGUgdGhlIFRlc3RJbmZvIHVwb24KKyAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIFRlc3RDYXNlIG9iamVjdC4KKyAgdm9pZCBBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbyk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgdm9pZCBDbGVhclJlc3VsdCgpOworCisgIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0Q2FzZVJlc3VsdChUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgICAgdGVzdF9jYXNlLT5DbGVhclJlc3VsdCgpOworICB9CisKKyAgLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gUnVucyBTZXRVcFRlc3RDYXNlKCkgZm9yIHRoaXMgVGVzdENhc2UuICBUaGlzIHdyYXBwZXIgaXMgbmVlZGVkCisgIC8vIGZvciBjYXRjaGluZyBleGNlcHRpb25zIHRocm93biBmcm9tIFNldFVwVGVzdENhc2UoKS4KKyAgdm9pZCBSdW5TZXRVcFRlc3RDYXNlKCkgeyAoKnNldF91cF90Y18pKCk7IH0KKworICAvLyBSdW5zIFRlYXJEb3duVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcworICAvLyBuZWVkZWQgZm9yIGNhdGNoaW5nIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gVGVhckRvd25UZXN0Q2FzZSgpLgorICB2b2lkIFJ1blRlYXJEb3duVGVzdENhc2UoKSB7ICgqdGVhcl9kb3duX3RjXykoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdCBwYXNzZWQuCisgIHN0YXRpYyBib29sIFRlc3RQYXNzZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2luZm8tPnJlc3VsdCgpLT5QYXNzZWQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdCBmYWlsZWQuCisgIHN0YXRpYyBib29sIFRlc3RGYWlsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2luZm8tPnJlc3VsdCgpLT5GYWlsZWQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaXMgZGlzYWJsZWQgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTAorICAvLyByZXBvcnQuCisgIHN0YXRpYyBib29sIFRlc3RSZXBvcnRhYmxlRGlzYWJsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX3JlcG9ydGFibGUoKSAmJiB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXzsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdCBpcyBkaXNhYmxlZC4KKyAgc3RhdGljIGJvb2wgVGVzdERpc2FibGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5pc19kaXNhYmxlZF87CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgdGVzdCB3aWxsIGFwcGVhciBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgc3RhdGljIGJvb2wgVGVzdFJlcG9ydGFibGUoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX3JlcG9ydGFibGUoKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGVzdCBzaG91bGQgcnVuLgorICBzdGF0aWMgYm9vbCBTaG91bGRSdW5UZXN0KGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCk7CisgIH0KKworICAvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHZvaWQgU2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgorICB2b2lkIFVuc2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gTmFtZSBvZiB0aGUgdGVzdCBjYXNlLgorICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgLy8gTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhCisgIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB0eXBlX3BhcmFtXzsKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuICBJdCBvd25zIHRoZQorICAvLyBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+IHRlc3RfaW5mb19saXN0XzsKKyAgLy8gUHJvdmlkZXMgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3IgdGhlIHRlc3QgbGlzdCB0byBhbGxvdyBlYXN5CisgIC8vIHNodWZmbGluZyBhbmQgcmVzdG9yaW5nIHRoZSB0ZXN0IG9yZGVyLiAgVGhlIGktdGggZWxlbWVudCBpbiB0aGlzCisgIC8vIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBpbiB0aGUgc2h1ZmZsZWQgdGVzdCBsaXN0LgorICBzdGQ6OnZlY3RvcjxpbnQ+IHRlc3RfaW5kaWNlc187CisgIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlLgorICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGNfOworICAvLyBQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZS4KKyAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjXzsKKyAgLy8gVHJ1ZSBpZmYgYW55IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIHJ1bi4KKyAgYm9vbCBzaG91bGRfcnVuXzsKKyAgLy8gRWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworICAvLyBIb2xkcyB0ZXN0IHByb3BlcnRpZXMgcmVjb3JkZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBTZXRVcFRlc3RDYXNlIGFuZAorICAvLyBUZWFyRG93blRlc3RDYXNlLgorICBUZXN0UmVzdWx0IGFkX2hvY190ZXN0X3Jlc3VsdF87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0Q2FzZXMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdENhc2UpOworfTsKKworLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGlzIGNhcGFibGUgb2Ygc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIGFuCisvLyBlbnZpcm9ubWVudC4gIFRoZSB1c2VyIHNob3VsZCBzdWJjbGFzcyB0aGlzIHRvIGRlZmluZSBoaXMgb3duCisvLyBlbnZpcm9ubWVudChzKS4KKy8vCisvLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgZG9lcyB0aGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gaW4gdmlydHVhbAorLy8gbWV0aG9kcyBTZXRVcCgpIGFuZCBUZWFyRG93bigpIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUKKy8vIGRlc3RydWN0b3IsIGFzOgorLy8KKy8vICAgMS4gWW91IGNhbm5vdCBzYWZlbHkgdGhyb3cgZnJvbSBhIGRlc3RydWN0b3IuICBUaGlzIGlzIGEgcHJvYmxlbQorLy8gICAgICBhcyBpbiBzb21lIGNhc2VzIEdvb2dsZSBUZXN0IGlzIHVzZWQgd2hlcmUgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgYW5kCisvLyAgICAgIHdlIG1heSB3YW50IHRvIGltcGxlbWVudCBBU1NFUlRfKiB1c2luZyBleGNlcHRpb25zIHdoZXJlIHRoZXkgYXJlCisvLyAgICAgIGF2YWlsYWJsZS4KKy8vICAgMi4gWW91IGNhbm5vdCB1c2UgQVNTRVJUXyogZGlyZWN0bHkgaW4gYSBjb25zdHJ1Y3RvciBvcgorLy8gICAgICBkZXN0cnVjdG9yLgorY2xhc3MgRW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgbmVlZCB0byBzdWJjbGFzcyBFbnZpcm9ubWVudC4KKyAgdmlydHVhbCB+RW52aXJvbm1lbnQoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byB0ZWFyIGRvd24gdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorIHByaXZhdGU6CisgIC8vIElmIHlvdSBzZWUgYW4gZXJyb3IgYWJvdXQgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG9yCisgIC8vIGFib3V0IGl0IGJlaW5nIHByaXZhdGUsIHlvdSBoYXZlIG1pcy1zcGVsbGVkIFNldFVwKCkgYXMgU2V0dXAoKS4KKyAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9OworICB2aXJ0dWFsIFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwKiBTZXR1cCgpIHsgcmV0dXJuIE5VTEw7IH0KK307CisKKy8vIFRoZSBpbnRlcmZhY2UgZm9yIHRyYWNpbmcgZXhlY3V0aW9uIG9mIHRlc3RzLiBUaGUgbWV0aG9kcyBhcmUgb3JnYW5pemVkIGluCisvLyB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGFyZSBmaXJlZC4KK2NsYXNzIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RFdmVudExpc3RlbmVyKCkge30KKworICAvLyBGaXJlZCBiZWZvcmUgYW55IHRlc3QgYWN0aXZpdHkgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLiAgVGhlcmUgbWF5IGJlIG1vcmUgdGhhbgorICAvLyBvbmUgaXRlcmF0aW9uIGlmIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBzZXQuIGl0ZXJhdGlvbiBpcyB0aGUgaXRlcmF0aW9uCisgIC8vIGluZGV4LCBzdGFydGluZyBmcm9tIDAuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2Ugc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3Qgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCB0ZWFyLWRvd24gZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZmluaXNoZXMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgYWxsIHRlc3QgYWN0aXZpdGllcyBoYXZlIGVuZGVkLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Cit9OworCisvLyBUaGUgY29udmVuaWVuY2UgY2xhc3MgZm9yIHVzZXJzIHdobyBuZWVkIHRvIG92ZXJyaWRlIGp1c3Qgb25lIG9yIHR3bworLy8gbWV0aG9kcyBhbmQgYXJlIG5vdCBjb25jZXJuZWQgdGhhdCBhIHBvc3NpYmxlIGNoYW5nZSB0byBhIHNpZ25hdHVyZSBvZgorLy8gdGhlIG1ldGhvZHMgdGhleSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYXVnaHQgZHVyaW5nIHRoZSBidWlsZC4gIEZvcgorLy8gY29tbWVudHMgYWJvdXQgZWFjaCBtZXRob2QgcGxlYXNlIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiBUZXN0RXZlbnRMaXN0ZW5lcgorLy8gYWJvdmUuCitjbGFzcyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgLyp0ZXN0X3BhcnRfcmVzdWx0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Cit9OworCisvLyBUZXN0RXZlbnRMaXN0ZW5lcnMgbGV0cyB1c2VycyBhZGQgbGlzdGVuZXJzIHRvIHRyYWNrIGV2ZW50cyBpbiBHb29nbGUgVGVzdC4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdEV2ZW50TGlzdGVuZXJzIHsKKyBwdWJsaWM6CisgIFRlc3RFdmVudExpc3RlbmVycygpOworICB+VGVzdEV2ZW50TGlzdGVuZXJzKCk7CisKKyAgLy8gQXBwZW5kcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBHb29nbGUgVGVzdCBhc3N1bWVzCisgIC8vIHRoZSBvd25lcnNoaXAgb2YgdGhlIGxpc3RlbmVyIChpLmUuIGl0IHdpbGwgZGVsZXRlIHRoZSBsaXN0ZW5lciB3aGVuCisgIC8vIHRoZSB0ZXN0IHByb2dyYW0gZmluaXNoZXMpLgorICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBJdCB0aGVuCisgIC8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKKyAgLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCisgIC8vIG91dHB1dC4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3RlbmVycyBsaXN0IHRvIHNodXQgZG93biBkZWZhdWx0CisgIC8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKKyAgLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIgYW5kIG1ha2VzIHRoaXMKKyAgLy8gZnVuY3Rpb24gcmV0dXJuIE5VTEwgdGhlIG5leHQgdGltZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQKKyAgLy8gY29udHJvbGxlZCBieSB0aGUgLS1ndGVzdF9vdXRwdXQ9eG1sIGZsYWcuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQorICAvLyBsaXN0ZW5lcnMgbGlzdCBieSB1c2VycyB3aG8gd2FudCB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dAorICAvLyBjb250cm9sbGVkIGJ5IHRoaXMgZmxhZyBhbmQgc3Vic3RpdHV0ZSBpdCB3aXRoIGN1c3RvbSBvbmUuICBOb3RlIHRoYXQKKyAgLy8gcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdCB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cworICAvLyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dAorICAvLyB0aW1lLgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdENhc2U7CisgIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpOb0V4ZWNEZWF0aFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworCisgIC8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCisgIC8vIHN1YnNjcmliZXJzLgorICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisgIC8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworICAvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCisgIHZvaWQgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4gIFRoZQorICAvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisgIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisgIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KKyAgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQorICAvLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuCisgIGJvb2wgRXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpIGNvbnN0OworICB2b2lkIFN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7CisKKyAgLy8gVGhlIGFjdHVhbCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKiByZXBlYXRlcl87CisgIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgc3RhbmRhcmQgcmVzdWx0IG91dHB1dC4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOworICAvLyBMaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBYTUwgb3V0cHV0IGZpbGUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdEV2ZW50TGlzdGVuZXJzLgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudExpc3RlbmVycyk7Cit9OworCisvLyBBIFVuaXRUZXN0IGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RDYXNlcy4KKy8vCisvLyBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgVW5pdFRlc3QgaXMKKy8vIGNyZWF0ZWQgd2hlbiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSBpcyBmaXJzdCBjYWxsZWQuICBUaGlzCisvLyBpbnN0YW5jZSBpcyBuZXZlciBkZWxldGVkLgorLy8KKy8vIFVuaXRUZXN0IGlzIG5vdCBjb3B5YWJsZS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlIGFzIGxvbmcgYXMgdGhlIG1ldGhvZHMgYXJlIGNhbGxlZAorLy8gYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb24uCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0IHsKKyBwdWJsaWM6CisgIC8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZAorICAvLyBpcyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4KKyAgLy8gQ29uc2VjdXRpdmUgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgorICBzdGF0aWMgVW5pdFRlc3QqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgorICAvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBpbnQgUnVuKCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKKworICAvLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkKKyAgLy8gd2FzIGV4ZWN1dGVkLiAgVGhlIFVuaXRUZXN0IG9iamVjdCBvd25zIHRoZSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIG9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisgIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdAorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKyAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0CisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIC8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgorICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdDsKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFJldHVybnMgdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIC8vCisgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCisgIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgorICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorICAvLyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgorICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgorICBpbnQgcmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgorICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgorICBpbnQgcmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorICAvLyBVTklYIGVwb2NoLgorICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wKCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKyAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCisgIGJvb2wgRmFpbGVkKCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIGNvbnN0IFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIHRlc3QgZmFpbHVyZXMgYW5kCisgIC8vIHByb3BlcnRpZXMgbG9nZ2VkIG91dHNpZGUgb2YgaW5kaXZpZHVhbCB0ZXN0IGNhc2VzLgorICBjb25zdCBUZXN0UmVzdWx0JiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cworICAvLyBpbnNpZGUgR29vZ2xlIFRlc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzKCk7CisKKyBwcml2YXRlOgorICAvLyBSZWdpc3RlcnMgYW5kIHJldHVybnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudC4gIFdoZW4gYSB0ZXN0CisgIC8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluCisgIC8vIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbQorICAvLyBoYXZlIGZpbmlzaGVkLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgdG9ybi1kb3duIGluCisgIC8vIHRoZSAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisgIC8vCisgIC8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICBFbnZpcm9ubWVudCogQWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7CisKKyAgLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsCisgIC8vIEdvb2dsZSBUZXN0IGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKQorICAvLyBldmVudHVhbGx5IGNhbGwgdGhpcyB0byByZXBvcnQgdGhlaXIgcmVzdWx0cy4gIFRoZSB1c2VyIGNvZGUKKyAgLy8gc2hvdWxkIHVzZSB0aGUgYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KKyAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvc19zdGFja190cmFjZSkKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgZnJvbQorICAvLyBpbnNpZGUgYSB0ZXN0LCB0byBjdXJyZW50IFRlc3RDYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0XyB3aGVuIGludm9rZWQKKyAgLy8gZnJvbSBTZXRVcFRlc3RDYXNlIG9yIFRlYXJEb3duVGVzdENhc2UsIG9yIHRvIHRoZSBnbG9iYWwgcHJvcGVydHkgc2V0CisgIC8vIHdoZW4gaW52b2tlZCBlbHNld2hlcmUuICBJZiB0aGUgcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoCisgIC8vIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4KKyAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBUZXN0Q2FzZSogR2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKTsKKworICAvLyBBY2Nlc3NvcnMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGwoKSB7IHJldHVybiBpbXBsXzsgfQorICBjb25zdCBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF87IH0KKworICAvLyBUaGVzZSBjbGFzc2VzIGFuZCBmdW5jaW9ucyBhcmUgZnJpZW5kcyBhcyB0aGV5IG5lZWQgdG8gYWNjZXNzIHByaXZhdGUKKyAgLy8gbWVtYmVycyBvZiBVbml0VGVzdC4KKyAgZnJpZW5kIGNsYXNzIFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6QXNzZXJ0SGVscGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlNjb3BlZFRyYWNlOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlN0cmVhbWluZ0xpc3RlbmVyVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlcjsKKyAgZnJpZW5kIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7CisgIGZyaWVuZCBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGZyaWVuZCB2b2lkIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKworICAvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgorICBVbml0VGVzdCgpOworCisgIC8vIEQndG9yCisgIHZpcnR1YWwgflVuaXRUZXN0KCk7CisKKyAgLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZAorICAvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgdm9pZCBQdXNoR1Rlc3RUcmFjZShjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSkKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gUG9wcyBhIHRyYWNlIGZyb20gdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHZvaWQgUG9wR1Rlc3RUcmFjZSgpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgaW4gKmltcGxfLiAgVGhpcyBpcyBtdXRhYmxlIGFzIHNvbWUgY29uc3QKKyAgLy8gbWV0aG9kcyBuZWVkIHRvIGxvY2sgaXQgdG9vLgorICBtdXRhYmxlIGludGVybmFsOjpNdXRleCBtdXRleF87CisKKyAgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uIG9iamVjdC4gIFRoaXMgZmllbGQgaXMgbmV2ZXIgY2hhbmdlZCBvbmNlCisgIC8vIHRoZSBvYmplY3QgaXMgY29uc3RydWN0ZWQuICBXZSBkb24ndCBtYXJrIGl0IGFzIGNvbnN0IGhlcmUsIGFzCisgIC8vIGRvaW5nIHNvIHdpbGwgY2F1c2UgYSB3YXJuaW5nIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBVbml0VGVzdC4KKyAgLy8gTXV0YWJsZSBzdGF0ZSBpbiAqaW1wbF8gaXMgcHJvdGVjdGVkIGJ5IG11dGV4Xy4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbF87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBVbml0VGVzdC4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdCk7Cit9OworCisvLyBBIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgYWRkaW5nIGFuIGVudmlyb25tZW50IGZvciB0aGUgdGVzdAorLy8gcHJvZ3JhbS4KKy8vCisvLyBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGNhbGxlZCwgcHJvYmFibHkgaW4KKy8vIG1haW4oKS4gIElmIHlvdSB1c2UgZ3Rlc3RfbWFpbiwgeW91IG5lZWQgdG8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkKKy8vIHN0YXJ0cyBmb3IgaXQgdG8gdGFrZSBlZmZlY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgYSBnbG9iYWwKKy8vIHZhcmlhYmxlIGxpa2UgdGhpczoKKy8vCisvLyAgIHRlc3Rpbmc6OkVudmlyb25tZW50KiBjb25zdCBmb29fZW52ID0KKy8vICAgICAgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworLy8KKy8vIEhvd2V2ZXIsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gd3JpdGUgeW91ciBvd24gbWFpbigpIGFuZAorLy8gY2FsbCBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKSB0aGVyZSwgYXMgcmVseWluZyBvbiBpbml0aWFsaXphdGlvbgorLy8gb2YgZ2xvYmFsIHZhcmlhYmxlcyBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZCBhbmQgbWF5IGNhdXNlCisvLyBwcm9ibGVtcyB3aGVuIHlvdSByZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudHMgZnJvbSBkaWZmZXJlbnQKKy8vIHRyYW5zbGF0aW9uIHVuaXRzIGFuZCB0aGUgZW52aXJvbm1lbnRzIGhhdmUgZGVwZW5kZW5jaWVzIGFtb25nIHRoZW0KKy8vIChyZW1lbWJlciB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgaW4gd2hpY2gKKy8vIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgYXJlIGluaXRpYWxpemVkKS4KK2lubGluZSBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsKKyAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRFbnZpcm9ubWVudChlbnYpOworfQorCisvLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKKy8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCisvLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKKy8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCisvLworLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCisvLyB1cGRhdGVkLgorLy8KKy8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCitHVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCBjaGFyKiogYXJndik7CisKKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KKy8vIFVOSUNPREUgbW9kZS4KK0dURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRm9ybWF0Rm9yQ29tcGFyaXNvbjxUb1ByaW50LCBPdGhlck9wZXJhbmQ+OjpGb3JtYXQodmFsdWUpIGZvcm1hdHMgYQorLy8gdmFsdWUgb2YgdHlwZSBUb1ByaW50IHRoYXQgaXMgYW4gb3BlcmFuZCBvZiBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uCisvLyAoZS5nLiBBU1NFUlRfRVEpLiAgT3RoZXJPcGVyYW5kIGlzIHRoZSB0eXBlIG9mIHRoZSBvdGhlciBvcGVyYW5kIGluCisvLyB0aGUgY29tcGFyaXNvbiwgYW5kIGlzIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGJlc3Qgd2F5IHRvCisvLyBmb3JtYXQgdGhlIHZhbHVlLiAgSW4gcGFydGljdWxhciwgd2hlbiB0aGUgdmFsdWUgaXMgYSBDIHN0cmluZworLy8gKGNoYXIgcG9pbnRlcikgYW5kIHRoZSBvdGhlciBvcGVyYW5kIGlzIGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZQorLy8gd2FudCB0byBmb3JtYXQgdGhlIEMgc3RyaW5nIGFzIGEgc3RyaW5nLCBzaW5jZSB3ZSBrbm93IGl0IGlzCisvLyBjb21wYXJlZCBieSB2YWx1ZSB3aXRoIHRoZSBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHZhbHVlIGlzIGEgY2hhcgorLy8gcG9pbnRlciBidXQgdGhlIG90aGVyIG9wZXJhbmQgaXMgbm90IGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZSBkb24ndAorLy8ga25vdyB3aGV0aGVyIHRoZSBwb2ludGVyIGlzIHN1cHBvc2VkIHRvIHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQKKy8vIHN0cmluZywgYW5kIHRodXMgd2FudCB0byBwcmludCBpdCBhcyBhIHBvaW50ZXIgdG8gYmUgc2FmZS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisKKy8vIFRoZSBkZWZhdWx0IGNhc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9QcmludCwgdHlwZW5hbWUgT3RoZXJPcGVyYW5kPgorY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbiB7CisgcHVibGljOgorICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3QgVG9QcmludCYgdmFsdWUpIHsKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsKKyAgfQorfTsKKworLy8gQXJyYXkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9QcmludCwgc2l6ZV90IE4sIHR5cGVuYW1lIE90aGVyT3BlcmFuZD4KK2NsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248VG9QcmludFtOXSwgT3RoZXJPcGVyYW5kPiB7CisgcHVibGljOgorICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3QgVG9QcmludCogdmFsdWUpIHsKKyAgICByZXR1cm4gRm9ybWF0Rm9yQ29tcGFyaXNvbjxjb25zdCBUb1ByaW50KiwgT3RoZXJPcGVyYW5kPjo6Rm9ybWF0KHZhbHVlKTsKKyAgfQorfTsKKworLy8gQnkgZGVmYXVsdCwgcHJpbnQgQyBzdHJpbmcgYXMgcG9pbnRlcnMgdG8gYmUgc2FmZSwgYXMgd2UgZG9uJ3Qga25vdworLy8gd2hldGhlciB0aGV5IGFjdHVhbGx5IHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLgorCisjZGVmaW5lIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKENoYXJUeXBlKSAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlck9wZXJhbmQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248Q2hhclR5cGUqLCBPdGhlck9wZXJhbmQ+IHsgICAgICAgICAgICAgICAgICBcCisgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KENoYXJUeXBlKiB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY2hhcik7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhjb25zdCBjaGFyKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKHdjaGFyX3QpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY29uc3Qgd2NoYXJfdCk7CisKKyN1bmRlZiBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXworCisvLyBJZiBhIEMgc3RyaW5nIGlzIGNvbXBhcmVkIHdpdGggYW4gU1RMIHN0cmluZyBvYmplY3QsIHdlIGtub3cgaXQncyBtZWFudAorLy8gdG8gcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcsIGFuZCB0aHVzIGNhbiBwcmludCBpdCBhcyBhIHN0cmluZy4KKworI2RlZmluZSBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKENoYXJUeXBlLCBPdGhlclN0cmluZ1R5cGUpIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbjxDaGFyVHlwZSosIE90aGVyU3RyaW5nVHlwZT4geyAgICAgICAgICAgICAgIFwKKyAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoQ2hhclR5cGUqIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNoYXIsIDo6c3RkOjpzdHJpbmcpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCBjaGFyLCA6OnN0ZDo6c3RyaW5nKTsKKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNoYXIsIDo6c3RyaW5nKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3QgY2hhciwgOjpzdHJpbmcpOworI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18od2NoYXJfdCwgOjp3c3RyaW5nKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3Qgd2NoYXJfdCwgOjp3c3RyaW5nKTsKKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKHdjaGFyX3QsIDo6c3RkOjp3c3RyaW5nKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3Qgd2NoYXJfdCwgOjpzdGQ6OndzdHJpbmcpOworI2VuZGlmCisKKyN1bmRlZiBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfCisKKy8vIEZvcm1hdHMgYSBjb21wYXJpc29uIGFzc2VydGlvbiAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9MVCwgYW5kIGV0YykKKy8vIG9wZXJhbmQgdG8gYmUgdXNlZCBpbiBhIGZhaWx1cmUgbWVzc2FnZS4gIFRoZSB0eXBlIChidXQgbm90IHZhbHVlKQorLy8gb2YgdGhlIG90aGVyIG9wZXJhbmQgbWF5IGFmZmVjdCB0aGUgZm9ybWF0LiAgVGhpcyBhbGxvd3MgdXMgdG8KKy8vIHByaW50IGEgY2hhciogYXMgYSByYXcgcG9pbnRlciB3aGVuIGl0IGlzIGNvbXBhcmVkIGFnYWluc3QgYW5vdGhlcgorLy8gY2hhciogb3Igdm9pZCosIGFuZCBwcmludCBpdCBhcyBhIEMgc3RyaW5nIHdoZW4gaXQgaXMgY29tcGFyZWQKKy8vIGFnYWluc3QgYW4gc3RkOjpzdHJpbmcgb2JqZWN0LCBmb3IgZXhhbXBsZS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RkOjpzdHJpbmcgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKAorICAgIGNvbnN0IFQxJiB2YWx1ZSwgY29uc3QgVDImIC8qIG90aGVyX29wZXJhbmQgKi8pIHsKKyAgcmV0dXJuIEZvcm1hdEZvckNvbXBhcmlzb248VDEsIFQyPjo6Rm9ybWF0KHZhbHVlKTsKK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgYWN0dWFsKSB7CisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0Mzg5KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2guCisjZW5kaWYKKworICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbmRpZgorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQKKy8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cyBlbnVtcworLy8gY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKTsKKworLy8gVGhlIGhlbHBlciBjbGFzcyBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50CisvLyBsaHNfaXNfbnVsbF9saXRlcmFsIGlzIHRydWUgaWZmIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQorLy8gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4gIFRoZSBmb2xsb3dpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcworLy8gZm9yIGxoc19pc19udWxsX2xpdGVyYWwgYmVpbmcgZmFsc2UuCit0ZW1wbGF0ZSA8Ym9vbCBsaHNfaXNfbnVsbF9saXRlcmFsPgorY2xhc3MgRXFIZWxwZXIgeworIHB1YmxpYzoKKyAgLy8gVGhpcyB0ZW1wbGF0aXplZCB2ZXJzaW9uIGlzIGZvciB0aGUgZ2VuZXJhbCBjYXNlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIGFjdHVhbCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KKworICAvLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAorICAvLyBpbiB7QVNTRVJUfEVYUEVDVH1fRVEgd2hlbiBjb21waWxlZCB3aXRoIGdjYyA0LCBhcyBhbm9ueW1vdXMKKyAgLy8gZW51bXMgY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgorICAvLworICAvLyBFdmVuIHRob3VnaCBpdHMgYm9keSBsb29rcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgdmVyc2lvbiwgd2UKKyAgLy8gY2Fubm90IG1lcmdlIHRoZSB0d28sIGFzIGl0IHdpbGwgbWFrZSBhbm9ueW1vdXMgZW51bXMgdW5oYXBweS4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KK307CisKKy8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQorLy8gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbCwgbGlrZSBOVUxMLCBmYWxzZSwgb3IgMC4KK3RlbXBsYXRlIDw+CitjbGFzcyBFcUhlbHBlcjx0cnVlPiB7CisgcHVibGljOgorICAvLyBXZSBkZWZpbmUgdHdvIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgQ29tcGFyZSgpLiAgVGhlIGZpcnN0CisgIC8vIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzCisgIC8vIE5PVCBhIHBvaW50ZXIsIGUuZy4gQVNTRVJUX0VRKDAsIEFuSW50RnVuY3Rpb24oKSkgb3IKKyAgLy8gRVhQRUNUX0VRKGZhbHNlLCBhX2Jvb2wpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoCisgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCisgICAgICBjb25zdCBUMiYgYWN0dWFsLAorICAgICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIHByZXZlbnRzIHRoaXMgb3ZlcmxvYWQgZnJvbSBiZWluZyBjb25zaWRlcmVkIGlmIFQyCisgICAgICAvLyBpcyBub3QgYSBwb2ludGVyIHR5cGUuICBXZSBuZWVkIHRoaXMgYmVjYXVzZSBBU1NFUlRfRVEoTlVMTCwgbXlfcHRyKQorICAgICAgLy8gZXhwYW5kcyB0byBDb21wYXJlKCIiLCAiIiwgTlVMTCwgbXlfcHRyKSwgd2hpY2ggcmVxdWlyZXMgYSBjb252ZXJzaW9uCisgICAgICAvLyB0byBtYXRjaCB0aGUgU2VjcmV0KiBpbiB0aGUgb3RoZXIgb3ZlcmxvYWQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBtYWtlCisgICAgICAvLyB0aGlzIHRlbXBsYXRlIG1hdGNoIGJldHRlci4KKyAgICAgIHR5cGVuYW1lIEVuYWJsZUlmPCFpc19wb2ludGVyPFQyPjo6dmFsdWU+Ojp0eXBlKiA9IDApIHsKKyAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICB9CisKKyAgLy8gVGhpcyB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKSBpcyBhCisgIC8vIHBvaW50ZXIsIGUuZy4gQVNTRVJUX0VRKE5VTEwsIGFfcG9pbnRlcikuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoCisgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAvLyBXZSB1c2VkIHRvIGhhdmUgYSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyIGluc3RlYWQgb2YgU2VjcmV0Ki4gIFRoYXQKKyAgICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciB3b3VsZCBkZWR1Y2UgdG8gJ2xvbmcnLCBtYWtpbmcgdGhpcyBhIGJldHRlciBtYXRjaAorICAgICAgLy8gdGhhbiB0aGUgZmlyc3Qgb3ZlcmxvYWQgZXZlbiB3aXRob3V0IHRoZSBmaXJzdCBvdmVybG9hZCdzIEVuYWJsZUlmLgorICAgICAgLy8gVW5mb3J0dW5hdGVseSwgZ2NjIHdpdGggLVdjb252ZXJzaW9uLW51bGwgd2FybnMgd2hlbiAicGFzc2luZyBOVUxMIHRvCisgICAgICAvLyBub24tcG9pbnRlciBhcmd1bWVudCIgKGV2ZW4gYSBkZWR1Y2VkIGludGVncmFsIGFyZ3VtZW50KSwgc28gdGhlIG9sZAorICAgICAgLy8gaW1wbGVtZW50YXRpb24gY2F1c2VkIHdhcm5pbmdzIGluIHVzZXIgY29kZS4KKyAgICAgIFNlY3JldCogLyogZXhwZWN0ZWQgKE5VTEwpICovLAorICAgICAgVCogYWN0dWFsKSB7CisgICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoYXQgJ2V4cGVjdGVkJyBpcyBhIG51bGwgcG9pbnRlci4KKyAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFQqPihOVUxMKSwgYWN0dWFsKTsKKyAgfQorfTsKKworLy8gQSBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHRoZSBoZWxwZXIgZnVuY3Rpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKKy8vIEFTU0VSVF8/PyBhbmQgRVhQRUNUXz8/LiAgSXQgaXMgaGVyZSBqdXN0IHRvIGF2b2lkIGNvcHktYW5kLXBhc3RlCisvLyBvZiBzaW1pbGFyIGNvZGUuCisvLworLy8gRm9yIGVhY2ggdGVtcGxhdGl6ZWQgaGVscGVyIGZ1bmN0aW9uLCB3ZSBhbHNvIGRlZmluZSBhbiBvdmVybG9hZGVkCisvLyB2ZXJzaW9uIGZvciBCaWdnZXN0SW50IGluIG9yZGVyIHRvIHJlZHVjZSBjb2RlIGJsb2F0IGFuZCBhbGxvdworLy8gYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQgd2l0aCB7QVNTRVJUfEVYUEVDVH1fPz8gd2hlbiBjb21waWxlZAorLy8gd2l0aCBnY2MgNC4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisjZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj5cCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdmFsMSwgY29uc3QgVDImIHZhbDIpIHtcCisgIGlmICh2YWwxIG9wIHZhbDIpIHtcCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCisgIH0gZWxzZSB7XAorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgXAorICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpICIgI29wICIgKCIgPDwgZXhwcjJcCisgICAgICAgIDw8ICIpLCBhY3R1YWw6ICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDEsIHZhbDIpXAorICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpO1wKKyAgfVwKK31cCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoXAorICAgIGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgQmlnZ2VzdEludCB2YWwxLCBCaWdnZXN0SW50IHZhbDIpCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTkUKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xFCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExFLCA8PSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVAorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMVCwgPCk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HRQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1QKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR1QsID4pOworCisjdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCk7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpOworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZQorLy8gZmlyc3QgYXJndW1lbnQgdG8ge0VYUEVDVCxBU1NFUlR9X1BSRURfRk9STUFUMigpLCBub3QgYnkKKy8vIHRoZW1zZWx2ZXMuICBUaGV5IGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrCisvLyAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZiBvbmx5KSwgYW5kIHJldHVybiBhbgorLy8gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKy8vCisvLyBUaGUge25lZWRsZSxoYXlzdGFja31fZXhwciBhcmd1bWVudHMgYXJlIHRoZSBzdHJpbmdpZmllZAorLy8gZXhwcmVzc2lvbnMgdGhhdCBnZW5lcmF0ZWQgdGhlIHR3byByZWFsIGFyZ3VtZW50cy4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKTsKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBIZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBmbG9hdGluZy1wb2ludHMuCisvLworLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgorLy8KKy8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckZsb2F0aW5nUG9pbnRFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBhY3R1YWwpIHsKKyAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHMoZXhwZWN0ZWQpLCByaHMoYWN0dWFsKTsKKworICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gZXhwZWN0ZWRfc3M7CisgIGV4cGVjdGVkX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICAgICAgPDwgZXhwZWN0ZWQ7CisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBhY3R1YWxfc3M7CisgIGFjdHVhbF9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgICA8PCBhY3R1YWw7CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZleHBlY3RlZF9zcyksCisgICAgICAgICAgICAgICAgICAgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJmFjdHVhbF9zcyksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcik7CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLyBBIGNsYXNzIHRoYXQgZW5hYmxlcyBvbmUgdG8gc3RyZWFtIG1lc3NhZ2VzIHRvIGFzc2VydGlvbiBtYWNyb3MKK2NsYXNzIEdURVNUX0FQSV8gQXNzZXJ0SGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICBBc3NlcnRIZWxwZXIoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICBpbnQgbGluZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworICB+QXNzZXJ0SGVscGVyKCk7CisKKyAgLy8gTWVzc2FnZSBhc3NpZ25tZW50IGlzIGEgc2VtYW50aWMgdHJpY2sgdG8gZW5hYmxlIGFzc2VydGlvbgorICAvLyBzdHJlYW1pbmc7IHNlZSB0aGUgR1RFU1RfTUVTU0FHRV8gbWFjcm8gYmVsb3cuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gV2UgcHV0IG91ciBkYXRhIGluIGEgc3RydWN0IHNvIHRoYXQgdGhlIHNpemUgb2YgdGhlIEFzc2VydEhlbHBlciBjbGFzcyBjYW4KKyAgLy8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGdjYyBpcyBpbmNhcGFibGUgb2YKKyAgLy8gcmUtdXNpbmcgc3RhY2sgc3BhY2UgZXZlbiBmb3IgdGVtcG9yYXJ5IHZhcmlhYmxlcywgc28gZXZlcnkgRVhQRUNUX0VRCisgIC8vIHJlc2VydmVzIHN0YWNrIHNwYWNlIGZvciBhbm90aGVyIEFzc2VydEhlbHBlci4KKyAgc3RydWN0IEFzc2VydEhlbHBlckRhdGEgeworICAgIEFzc2VydEhlbHBlckRhdGEoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyY2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtc2cpCisgICAgICAgIDogdHlwZSh0KSwgZmlsZShzcmNmaWxlKSwgbGluZShsaW5lX251bSksIG1lc3NhZ2UobXNnKSB7IH0KKworICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGNvbnN0IHR5cGU7CisgICAgY29uc3QgY2hhciogY29uc3QgZmlsZTsKKyAgICBpbnQgY29uc3QgbGluZTsKKyAgICBzdGQ6OnN0cmluZyBjb25zdCBtZXNzYWdlOworCisgICBwcml2YXRlOgorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyRGF0YSk7CisgIH07CisKKyAgQXNzZXJ0SGVscGVyRGF0YSogY29uc3QgZGF0YV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBc3NlcnRIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorLy8gVGhlIHB1cmUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgYWxsIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW5oZXJpdCBmcm9tLgorLy8gQSB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzIG11c3QgaW5oZXJpdCBmcm9tIGJvdGggOjp0ZXN0aW5nOjpUZXN0IGFuZAorLy8gOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vc3QgY2FzZXMgdGhhdCBqdXN0IG1lYW5zIGluaGVyaXRpbmcKKy8vIGZyb20gOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtLCBidXQgbW9yZSBjb21wbGljYXRlZCB0ZXN0IGhpZXJhcmNoaWVzCisvLyBtYXkgbmVlZCB0byBpbmhlcml0IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlIGF0IGRpZmZlcmVudCBsZXZlbHMuCisvLworLy8gVGhpcyBpbnRlcmZhY2UgaGFzIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgdmlhCisvLyB0aGUgR2V0UGFyYW0oKSBtZXRob2QuCisvLworLy8gVXNlIGl0IHdpdGggb25lIG9mIHRoZSBwYXJhbWV0ZXIgZ2VuZXJhdG9yIGRlZmluaW5nIGZ1bmN0aW9ucywgbGlrZSBSYW5nZSgpLAorLy8gVmFsdWVzKCksIFZhbHVlc0luKCksIEJvb2woKSwgYW5kIENvbWJpbmUoKS4KKy8vCisvLyBjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKKy8vICBwcm90ZWN0ZWQ6CisvLyAgIEZvb1Rlc3QoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB+Rm9vVGVzdCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB2b2lkIFRlYXJEb3duIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gfTsKKy8vIFRFU1RfUChGb29UZXN0LCBEb2VzQmFyKSB7CisvLyAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBtZXRob2QgaGVyZS4KKy8vICAgRm9vIGZvbzsKKy8vICAgQVNTRVJUX1RSVUUoZm9vLkRvZXNCYXIoR2V0UGFyYW0oKSkpOworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoT25lVG9UZW5SYW5nZSwgRm9vVGVzdCwgOjp0ZXN0aW5nOjpSYW5nZSgxLCAxMCkpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFdpdGhQYXJhbUludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIFQgUGFyYW1UeXBlOworICB2aXJ0dWFsIH5XaXRoUGFyYW1JbnRlcmZhY2UoKSB7fQorCisgIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZS4gSXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHRlc3QgZml4dHVyZSdzCisgIC8vIGNvbnN0cnVjdG9yLiBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBub24tc3RhdGljLCBldmVuIHRob3VnaCBpdCBvbmx5CisgIC8vIHJlZmVyZW5jZXMgc3RhdGljIGRhdGEsIHRvIHJlZHVjZSB0aGUgb3Bwb3J0dW5pdHkgZm9yIGluY29ycmVjdCB1c2VzCisgIC8vIGxpa2Ugd3JpdGluZyAnV2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+OjpHZXRQYXJhbSgpJyBmb3IgYSB0ZXN0IHRoYXQKKyAgLy8gdXNlcyBhIGZpeHR1cmUgd2hvc2UgcGFyYW1ldGVyIHR5cGUgaXMgaW50LgorICBjb25zdCBQYXJhbVR5cGUmIEdldFBhcmFtKCkgY29uc3QgeworICAgIEdURVNUX0NIRUNLXyhwYXJhbWV0ZXJfICE9IE5VTEwpCisgICAgICAgIDw8ICJHZXRQYXJhbSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QgIgorICAgICAgICA8PCAiLS0gZGlkIHlvdSBpbnRlbmQgdG8gd3JpdGUgVEVTVF9QIGluc3RlYWQgb2YgVEVTVF9GPyI7CisgICAgcmV0dXJuICpwYXJhbWV0ZXJfOworICB9CisKKyBwcml2YXRlOgorICAvLyBTZXRzIHBhcmFtZXRlciB2YWx1ZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhlIHZhbHVlCisgIC8vIHJlbWFpbnMgYWxpdmUgYW5kIHVuY2hhbmdlZCB0aHJvdWdob3V0IHRoZSBjdXJyZW50IHRlc3QuCisgIHN0YXRpYyB2b2lkIFNldFBhcmFtKGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyKSB7CisgICAgcGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKKyAgfQorCisgIC8vIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBhY2Nlc3NpbmcgcGFyYW1ldGVyIGR1cmluZyBhIHRlc3QgbGlmZXRpbWUuCisgIHN0YXRpYyBjb25zdCBQYXJhbVR5cGUqIHBhcmFtZXRlcl87CisKKyAgLy8gVGVzdENsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBXaXRoUGFyYW1JbnRlcmZhY2U8VD4gYW5kIFRlc3QuCisgIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+IGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBXaXRoUGFyYW1JbnRlcmZhY2U8VD46OnBhcmFtZXRlcl8gPSBOVUxMOworCisvLyBNb3N0IHZhbHVlLXBhcmFtZXRlcml6ZWQgY2xhc3NlcyBjYW4gaWdub3JlIHRoZSBleGlzdGVuY2Ugb2YKKy8vIFdpdGhQYXJhbUludGVyZmFjZSwgYW5kIGNhbiBqdXN0IGluaGVyaXQgZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGVzdFdpdGhQYXJhbSA6IHB1YmxpYyBUZXN0LCBwdWJsaWMgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IHsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gTWFjcm9zIGZvciBpbmRpY2F0aW5nIHN1Y2Nlc3MvZmFpbHVyZSBpbiB0ZXN0IGNvZGUuCisKKy8vIEFERF9GQUlMVVJFIHVuY29uZGl0aW9uYWxseSBhZGRzIGEgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LgorLy8gU1VDQ0VFRCBnZW5lcmF0ZXMgYSBzdWNjZXNzIC0gaXQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlCisvLyBjdXJyZW50IHRlc3Qgc3VjY2Vzc2Z1bCwgYXMgYSB0ZXN0IGlzIG9ubHkgc3VjY2Vzc2Z1bCB3aGVuIGl0IGhhcworLy8gbm8gZmFpbHVyZS4KKy8vCisvLyBFWFBFQ1RfKiB2ZXJpZmllcyB0aGF0IGEgY2VydGFpbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLiAgSWYgbm90LAorLy8gaXQgYmVoYXZlcyBsaWtlIEFERF9GQUlMVVJFLiAgSW4gcGFydGljdWxhcjoKKy8vCisvLyAgIEVYUEVDVF9UUlVFICB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgdHJ1ZS4KKy8vICAgRVhQRUNUX0ZBTFNFIHZlcmlmaWVzIHRoYXQgYSBCb29sZWFuIGNvbmRpdGlvbiBpcyBmYWxzZS4KKy8vCisvLyBGQUlMIGFuZCBBU1NFUlRfKiBhcmUgc2ltaWxhciB0byBBRERfRkFJTFVSRSBhbmQgRVhQRUNUXyosIGV4Y2VwdAorLy8gdGhhdCB0aGV5IHdpbGwgYWxzbyBhYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbiBvbiBmYWlsdXJlLiAgUGVvcGxlCisvLyB1c3VhbGx5IHdhbnQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBGQUlMIGFuZCBBU1NFUlRfKiwgYnV0IHRob3NlCisvLyB3cml0aW5nIGRhdGEtZHJpdmVuIHRlc3RzIG9mdGVuIGZpbmQgdGhlbXNlbHZlcyB1c2luZyBBRERfRkFJTFVSRQorLy8gYW5kIEVYUEVDVF8qIG1vcmUuCisKKy8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgQUREX0ZBSUxVUkUoKSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXygiRmFpbGVkIikKKworLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZSBhdCB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gd2l0aAorLy8gYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEFERF9GQUlMVVJFX0FUKGZpbGUsIGxpbmUpIFwKKyAgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgIkZhaWxlZCIsIFwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKKworLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9GQUlMKCkgR1RFU1RfRkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBGQUlMKCksIHdoaWNoIGlzIGEKKy8vIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9GQUlMCisjIGRlZmluZSBGQUlMKCkgR1RFU1RfRkFJTCgpCisjZW5kaWYKKworLy8gR2VuZXJhdGVzIGEgc3VjY2VzcyB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9TVUNDRUVEKCkgR1RFU1RfU1VDQ0VTU18oIlN1Y2NlZWRlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBTVUNDRUVEKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9TVUNDRUVECisjIGRlZmluZSBTVUNDRUVEKCkgR1RFU1RfU1VDQ0VFRCgpCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGV4Y2VwdGlvbnMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIHRoZSBleHBlY3RlZCBleGNlcHRpb24uCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9OT19USFJPVyhzdGF0ZW1lbnQpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgZG9lc24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fQU5ZX1RIUk9XKHN0YXRlbWVudCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorCisjZGVmaW5lIEVYUEVDVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKy8vIEJvb2xlYW4gYXNzZXJ0aW9ucy4gQ29uZGl0aW9uIGNhbiBiZSBlaXRoZXIgYSBCb29sZWFuIGV4cHJlc3Npb24gb3IgYW4KKy8vIEFzc2VydGlvblJlc3VsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBBc3NlcnRpb25SZXN1bHQgd2l0aAorLy8gdGhlc2UgbWFjcm9zIHNlZSBjb21tZW50cyBvbiB0aGF0IGNsYXNzLgorI2RlZmluZSBFWFBFQ1RfVFJVRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyhjb25kaXRpb24sICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9GQUxTRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9UUlVFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0ZBTFNFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gSW5jbHVkZXMgdGhlIGF1dG8tZ2VuZXJhdGVkIGhlYWRlciB0aGF0IGltcGxlbWVudHMgYSBmYW1pbHkgb2YKKy8vIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgiCisKKy8vIE1hY3JvcyBmb3IgdGVzdGluZyBlcXVhbGl0aWVzIGFuZCBpbmVxdWFsaXRpZXMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRVEoZXhwZWN0ZWQsIGFjdHVhbCk6IFRlc3RzIHRoYXQgZXhwZWN0ZWQgPT0gYWN0dWFsCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSAhPSB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTFQodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPCB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTEUodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPD0gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxID4gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dFKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxID49IHYyCisvLworLy8gV2hlbiB0aGV5IGFyZSBub3QsIEdvb2dsZSBUZXN0IHByaW50cyBib3RoIHRoZSB0ZXN0ZWQgZXhwcmVzc2lvbnMgYW5kCisvLyB0aGVpciBhY3R1YWwgdmFsdWVzLiAgVGhlIHZhbHVlcyBtdXN0IGJlIGNvbXBhdGlibGUgYnVpbHQtaW4gdHlwZXMsCisvLyBvciB5b3Ugd2lsbCBnZXQgYSBjb21waWxlciBlcnJvci4gIEJ5ICJjb21wYXRpYmxlIiB3ZSBtZWFuIHRoYXQgdGhlCisvLyB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIGJ5IHRoZSByZXNwZWN0aXZlIG9wZXJhdG9yLgorLy8KKy8vIE5vdGU6CisvLworLy8gICAxLiBJdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgdXNlci1kZWZpbmVkIHR5cGUgd29yayB3aXRoCisvLyAgIHtBU1NFUlR8RVhQRUNUfV8/PygpLCBidXQgdGhhdCByZXF1aXJlcyBvdmVybG9hZGluZyB0aGUKKy8vICAgY29tcGFyaXNvbiBvcGVyYXRvcnMgYW5kIGlzIHRodXMgZGlzY291cmFnZWQgYnkgdGhlIEdvb2dsZSBDKysKKy8vICAgVXNhZ2UgR3VpZGUuICBUaGVyZWZvcmUsIHlvdSBhcmUgYWR2aXNlZCB0byB1c2UgdGhlCisvLyAgIHtBU1NFUlR8RVhQRUNUfV9UUlVFKCkgbWFjcm8gdG8gYXNzZXJ0IHRoYXQgdHdvIG9iamVjdHMgYXJlCisvLyAgIGVxdWFsLgorLy8KKy8vICAgMi4gVGhlIHtBU1NFUlR8RVhQRUNUfV8/PygpIG1hY3JvcyBkbyBwb2ludGVyIGNvbXBhcmlzb25zIG9uCisvLyAgIHBvaW50ZXJzIChpbiBwYXJ0aWN1bGFyLCBDIHN0cmluZ3MpLiAgVGhlcmVmb3JlLCBpZiB5b3UgdXNlIGl0CisvLyAgIHdpdGggdHdvIEMgc3RyaW5ncywgeW91IGFyZSB0ZXN0aW5nIGhvdyB0aGVpciBsb2NhdGlvbnMgaW4gbWVtb3J5CisvLyAgIGFyZSByZWxhdGVkLCBub3QgaG93IHRoZWlyIGNvbnRlbnQgaXMgcmVsYXRlZC4gIFRvIGNvbXBhcmUgdHdvIEMKKy8vICAgc3RyaW5ncyBieSBjb250ZW50LCB1c2Uge0FTU0VSVHxFWFBFQ1R9X1NUUiooKS4KKy8vCisvLyAgIDMuIHtBU1NFUlR8RVhQRUNUfV9FUShleHBlY3RlZCwgYWN0dWFsKSBpcyBwcmVmZXJyZWQgdG8KKy8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUoZXhwZWN0ZWQgPT0gYWN0dWFsKSwgYXMgdGhlIGZvcm1lciB0ZWxscyB5b3UKKy8vICAgd2hhdCB0aGUgYWN0dWFsIHZhbHVlIGlzIHdoZW4gaXQgZmFpbHMsIGFuZCBzaW1pbGFybHkgZm9yIHRoZQorLy8gICBvdGhlciBjb21wYXJpc29ucy4KKy8vCisvLyAgIDQuIERvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIGluIHdoaWNoIHtBU1NFUlR8RVhQRUNUfV8/PygpCisvLyAgIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cywgd2hpY2ggaXMgdW5kZWZpbmVkLgorLy8KKy8vICAgNS4gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBFWFBFQ1RfTkUoNSwgRm9vKCkpOworLy8gICBFWFBFQ1RfRVEoTlVMTCwgYV9wb2ludGVyKTsKKy8vICAgQVNTRVJUX0xUKGksIGFycmF5X3NpemUpOworLy8gICBBU1NFUlRfR1QocmVjb3Jkcy5zaXplKCksIDApIDw8ICJUaGVyZSBpcyBubyByZWNvcmQgbGVmdC4iOworCisjZGVmaW5lIEVYUEVDVF9FUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6IFwKKyAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfTkUoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfTEUodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfTFQodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfR0UodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfR1QodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQorCisjZGVmaW5lIEdURVNUX0FTU0VSVF9FUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6IFwKKyAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTkUodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTEUodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfR0UodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfR1QodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQorCisvLyBEZWZpbmUgbWFjcm8gR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX1hZIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZgorLy8gQVNTRVJUX1hZKCksIHdoaWNoIGNsYXNoZXMgd2l0aCBzb21lIHVzZXJzJyBvd24gY29kZS4KKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfRVEKKyMgZGVmaW5lIEFTU0VSVF9FUSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfRVEodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9ORQorIyBkZWZpbmUgQVNTRVJUX05FKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xFCisjIGRlZmluZSBBU1NFUlRfTEUodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTFQKKyMgZGVmaW5lIEFTU0VSVF9MVCh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9HRQorIyBkZWZpbmUgQVNTRVJUX0dFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dUCisjIGRlZmluZSBBU1NFUlRfR1QodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpCisjZW5kaWYKKworLy8gQy1zdHJpbmcgQ29tcGFyaXNvbnMuICBBbGwgdGVzdHMgdHJlYXQgTlVMTCBhbmQgYW55IG5vbi1OVUxMIHN0cmluZworLy8gYXMgZGlmZmVyZW50LiAgVHdvIE5VTExzIGFyZSBlcXVhbC4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJFUShzMSwgczIpOiAgICAgVGVzdHMgdGhhdCBzMSA9PSBzMgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSTkUoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgIT0gczIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUShzMSwgczIpOiBUZXN0cyB0aGF0IHMxID09IHMyLCBpZ25vcmluZyBjYXNlCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUoczEsIHMyKTogVGVzdHMgdGhhdCBzMSAhPSBzMiwgaWdub3JpbmcgY2FzZQorLy8KKy8vIEZvciB3aWRlIG9yIG5hcnJvdyBzdHJpbmcgb2JqZWN0cywgeW91IGNhbiB1c2UgdGhlCisvLyB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MuCisvLworLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQsCisvLyB3aGljaCBpcyB1bmRlZmluZWQuCisvLworLy8gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisKKyNkZWZpbmUgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX1NUUk5FKHMxLCBzMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUk5FLCBzMSwgczIpCisjZGVmaW5lIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX1NUUkNBU0VORShzMSwgczIpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VORSwgczEsIHMyKQorCisjZGVmaW5lIEFTU0VSVF9TVFJFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEFTU0VSVF9TVFJORShzMSwgczIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQorI2RlZmluZSBBU1NFUlRfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEFTU0VSVF9TVFJDQVNFTkUoczEsIHMyKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKKworLy8gTWFjcm9zIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0d28gZmxvYXQgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGRvdWJsZSB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbC4KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05FQVIodjEsIHYyLCBhYnNfZXJyb3IpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHYxIGFuZCB2MiBhcmUgd2l0aGluIHRoZSBnaXZlbiBkaXN0YW5jZSB0byBlYWNoIG90aGVyLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgVUxQLWJhc2VkIGNvbXBhcmlzb24gdG8gYXV0b21hdGljYWxseSBwaWNrIGEgZGVmYXVsdAorLy8gZXJyb3IgYm91bmQgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG9wZXJhbmRzLiAgU2VlIHRoZQorLy8gRmxvYXRpbmdQb2ludCB0ZW1wbGF0ZSBjbGFzcyBpbiBndGVzdC1pbnRlcm5hbC5oIGlmIHlvdSBhcmUKKy8vIGludGVyZXN0ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisKKyNkZWZpbmUgRVhQRUNUX0ZMT0FUX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxmbG9hdD4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEVYUEVDVF9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGRvdWJsZT4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEFTU0VSVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBBU1NFUlRfRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBFWFBFQ1RfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQorCisjZGVmaW5lIEFTU0VSVF9ORUFSKHZhbDEsIHZhbDIsIGFic19lcnJvcilcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RG91YmxlTmVhclByZWRGb3JtYXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCBhYnNfZXJyb3IpCisKKy8vIFRoZXNlIHByZWRpY2F0ZSBmb3JtYXQgZnVuY3Rpb25zIHdvcmsgb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzLCBhbmQKKy8vIGNhbiBiZSB1c2VkIGluIHtBU1NFUlR8RVhQRUNUfV9QUkVEX0ZPUk1BVDIqKCksIGUuZy4KKy8vCisvLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6RG91YmxlTEUsIEZvbygpLCA1LjApOworCisvLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCisvLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMik7CisKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gTWFjcm9zIHRoYXQgdGVzdCBmb3IgSFJFU1VMVCBmYWlsdXJlIGFuZCBzdWNjZXNzLCB0aGVzZSBhcmUgb25seSB1c2VmdWwKKy8vIG9uIFdpbmRvd3MsIGFuZCByZWx5IG9uIFdpbmRvd3MgU0RLIG1hY3JvcyBhbmQgQVBJcyB0byBjb21waWxlLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9KGV4cHIpCisvLworLy8gV2hlbiBleHByIHVuZXhwZWN0ZWRseSBmYWlscyBvciBzdWNjZWVkcywgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZQorLy8gZXhwZWN0ZWQgcmVzdWx0IGFuZCB0aGUgYWN0dWFsIHJlc3VsdCB3aXRoIGJvdGggYSBodW1hbi1yZWFkYWJsZQorLy8gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIHRoZQorLy8gaGV4IHJlc3VsdCBjb2RlLgorIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKKworIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKKworIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKKworIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIE1hY3JvcyB0aGF0IGV4ZWN1dGUgc3RhdGVtZW50IGFuZCBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsCisvLyBmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuCisvLworLy8gICAqIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCk7CisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpOworLy8gICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpIDw8ICJQcm9jZXNzKCkgZmFpbGVkIjsKKy8vCisjZGVmaW5lIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAorICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KSBcCisgICAgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBDYXVzZXMgYSB0cmFjZSAoaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZSBwYXRoLCB0aGUgY3VycmVudCBsaW5lCisvLyBudW1iZXIsIGFuZCB0aGUgZ2l2ZW4gbWVzc2FnZSkgdG8gYmUgaW5jbHVkZWQgaW4gZXZlcnkgdGVzdCBmYWlsdXJlCisvLyBtZXNzYWdlIGdlbmVyYXRlZCBieSBjb2RlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlIGVmZmVjdCBpcworLy8gdW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IHNjb3BlLgorLy8KKy8vIFRoZSBtZXNzYWdlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZyBzdHJlYW1hYmxlIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGluY2x1ZGUgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgYXMgcGFydAorLy8gb2YgdGhlIGR1bW15IHZhcmlhYmxlIG5hbWUsIHRodXMgYWxsb3dpbmcgbXVsdGlwbGUgU0NPUEVEX1RSQUNFKClzCisvLyB0byBhcHBlYXIgaW4gdGhlIHNhbWUgYmxvY2sgLSBhcyBsb25nIGFzIHRoZXkgYXJlIG9uIGRpZmZlcmVudAorLy8gbGluZXMuCisjZGVmaW5lIFNDT1BFRF9UUkFDRShtZXNzYWdlKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNjb3BlZFRyYWNlIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfdHJhY2VfLCBfX0xJTkVfXykoXAorICAgIF9fRklMRV9fLCBfX0xJTkVfXywgOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgKG1lc3NhZ2UpKQorCisvLyBDb21waWxlLXRpbWUgYXNzZXJ0aW9uIGZvciB0eXBlIGVxdWFsaXR5LgorLy8gU3RhdGljQXNzZXJ0VHlwZUVxPHR5cGUxLCB0eXBlMj4oKSBjb21waWxlcyBpZmYgdHlwZTEgYW5kIHR5cGUyIGFyZQorLy8gdGhlIHNhbWUgdHlwZS4gIFRoZSB2YWx1ZSBpdCByZXR1cm5zIGlzIG5vdCBpbnRlcmVzdGluZy4KKy8vCisvLyBJbnN0ZWFkIG9mIG1ha2luZyBTdGF0aWNBc3NlcnRUeXBlRXEgYSBjbGFzcyB0ZW1wbGF0ZSwgd2UgbWFrZSBpdCBhCisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSB0aGF0IGludm9rZXMgYSBoZWxwZXIgY2xhc3MgdGVtcGxhdGUuICBUaGlzCisvLyBwcmV2ZW50cyBhIHVzZXIgZnJvbSBtaXN1c2luZyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPiBieQorLy8gZGVmaW5pbmcgb2JqZWN0cyBvZiB0aGF0IHR5cGUuCisvLworLy8gQ0FWRUFUOgorLy8KKy8vIFdoZW4gdXNlZCBpbnNpZGUgYSBtZXRob2Qgb2YgYSBjbGFzcyB0ZW1wbGF0ZSwKKy8vIFN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+KCkgaXMgZWZmZWN0aXZlIE9OTFkgSUYgdGhlIG1ldGhvZCBpcworLy8gaW5zdGFudGlhdGVkLiAgRm9yIGV4YW1wbGUsIGdpdmVuOgorLy8KKy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvbyB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgdm9pZCBCYXIoKSB7IHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIFQ+KCk7IH0KKy8vICAgfTsKKy8vCisvLyB0aGUgY29kZToKKy8vCisvLyAgIHZvaWQgVGVzdDEoKSB7IEZvbzxib29sPiBmb287IH0KKy8vCisvLyB3aWxsIE5PVCBnZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yLCBhcyBGb288Ym9vbD46OkJhcigpIGlzIG5ldmVyCisvLyBhY3R1YWxseSBpbnN0YW50aWF0ZWQuICBJbnN0ZWFkLCB5b3UgbmVlZDoKKy8vCisvLyAgIHZvaWQgVGVzdDIoKSB7IEZvbzxib29sPiBmb287IGZvby5CYXIoKTsgfQorLy8KKy8vIHRvIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBTdGF0aWNBc3NlcnRUeXBlRXEoKSB7CisgICh2b2lkKWludGVybmFsOjpTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VDEsIFQyPigpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRGVmaW5lcyBhIHRlc3QuCisvLworLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLCBhbmQgdGhlIHNlY29uZAorLy8gcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLgorLy8KKy8vIFRoZSBjb252ZW50aW9uIGlzIHRvIGVuZCB0aGUgdGVzdCBjYXNlIG5hbWUgd2l0aCAiVGVzdCIuICBGb3IKKy8vIGV4YW1wbGUsIGEgdGVzdCBjYXNlIGZvciB0aGUgRm9vIGNsYXNzIGNhbiBiZSBuYW1lZCBGb29UZXN0LgorLy8KKy8vIFRoZSB1c2VyIHNob3VsZCBwdXQgaGlzIHRlc3QgY29kZSBiZXR3ZWVuIGJyYWNlcyBhZnRlciB1c2luZyB0aGlzCisvLyBtYWNyby4gIEV4YW1wbGU6CisvLworLy8gICBURVNUKEZvb1Rlc3QsIEluaXRpYWxpemVzQ29ycmVjdGx5KSB7CisvLyAgICAgRm9vIGZvbzsKKy8vICAgICBFWFBFQ1RfVFJVRShmb28uU3RhdHVzSXNPSygpKTsKKy8vICAgfQorCisvLyBOb3RlIHRoYXQgd2UgY2FsbCBHZXRUZXN0VHlwZUlkKCkgaW5zdGVhZCBvZiBHZXRUeXBlSWQ8CisvLyA6OnRlc3Rpbmc6OlRlc3Q+KCkgaGVyZSB0byBnZXQgdGhlIHR5cGUgSUQgb2YgdGVzdGluZzo6VGVzdC4gIFRoaXMKKy8vIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbiB1c2luZyBHb29nbGUgVGVzdCBhcworLy8gYSBmcmFtZXdvcmsgb24gTWFjIE9TIFguICBUaGUgYnVnIGNhdXNlcyBHZXRUeXBlSWQ8CisvLyA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKy8vIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3IgZnJvbSB1c2VyIHRlc3QKKy8vIGNvZGUuICBHZXRUZXN0VHlwZUlkKCkgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lCisvLyB2YWx1ZSwgYXMgaXQgYWx3YXlzIGNhbGxzIEdldFR5cGVJZDw+KCkgZnJvbSB0aGUgR29vZ2xlIFRlc3QKKy8vIGZyYW1ld29yay4KKyNkZWZpbmUgR1RFU1RfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKKyAgR1RFU1RfVEVTVF8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSwgXAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlRlc3QsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKSkKKworLy8gRGVmaW5lIHRoaXMgbWFjcm8gdG8gMSB0byBvbWl0IHRoZSBkZWZpbml0aW9uIG9mIFRFU1QoKSwgd2hpY2gKKy8vIGlzIGEgZ2VuZXJpYyBuYW1lIGFuZCBjbGFzaGVzIHdpdGggc29tZSBvdGhlciBsaWJyYXJpZXMuCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX1RFU1QKKyMgZGVmaW5lIFRFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgR1RFU1RfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKQorI2VuZGlmCisKKy8vIERlZmluZXMgYSB0ZXN0IHRoYXQgdXNlcyBhIHRlc3QgZml4dHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MsIHdoaWNoCisvLyBhbHNvIGRvdWJsZXMgYXMgdGhlIHRlc3QgY2FzZSBuYW1lLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlCisvLyBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLgorLy8KKy8vIEEgdGVzdCBmaXh0dXJlIGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgZWFybGllci4gIFRoZSB1c2VyIHNob3VsZCBwdXQKKy8vIGhpcyB0ZXN0IGNvZGUgYmV0d2VlbiBicmFjZXMgYWZ0ZXIgdXNpbmcgdGhpcyBtYWNyby4gIEV4YW1wbGU6CisvLworLy8gICBjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworLy8gICAgcHJvdGVjdGVkOgorLy8gICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgYl8uQWRkRWxlbWVudCgzKTsgfQorLy8KKy8vICAgICBGb28gYV87CisvLyAgICAgRm9vIGJfOworLy8gICB9OworLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEluaXRpYWxpemVzQ29ycmVjdGx5KSB7CisvLyAgICAgRVhQRUNUX1RSVUUoYV8uU3RhdHVzSXNPSygpKTsKKy8vICAgfQorLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIFJldHVybnNFbGVtZW50Q291bnRDb3JyZWN0bHkpIHsKKy8vICAgICBFWFBFQ1RfRVEoMCwgYV8uc2l6ZSgpKTsKKy8vICAgICBFWFBFQ1RfRVEoMSwgYl8uc2l6ZSgpKTsKKy8vICAgfQorCisjZGVmaW5lIFRFU1RfRih0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSlcCisgIEdURVNUX1RFU1RfKHRlc3RfZml4dHVyZSwgdGVzdF9uYW1lLCB0ZXN0X2ZpeHR1cmUsIFwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VHlwZUlkPHRlc3RfZml4dHVyZT4oKSkKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gVXNlIHRoaXMgZnVuY3Rpb24gaW4gbWFpbigpIHRvIHJ1biBhbGwgdGVzdHMuICBJdCByZXR1cm5zIDAgaWYgYWxsCisvLyB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gUlVOX0FMTF9URVNUUygpIHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgaGFzIGJlZW4KKy8vIHBhcnNlZCBieSBJbml0R29vZ2xlVGVzdCgpLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gd2FzIGZvcm1lcmx5IGEgbWFjcm87IHRodXMsIGl0IGlzIGluIHRoZSBnbG9iYWwKKy8vIG5hbWVzcGFjZSBhbmQgaGFzIGFuIGFsbC1jYXBzIG5hbWUuCitpbnQgUlVOX0FMTF9URVNUUygpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87CisKK2lubGluZSBpbnQgUlVOX0FMTF9URVNUUygpIHsKKyAgcmV0dXJuIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJ1bigpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFlNzEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oCkBAIC0wLDAgKzEsMzU4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAxMC8zMS8yMDExIGJ5IGNvbW1hbmQKKy8vICdnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IDUnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBJbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKworLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyMgZXJyb3IgRG8gbm90IGluY2x1ZGUgZ3Rlc3RfcHJlZF9pbXBsLmggZGlyZWN0bHkuICBJbmNsdWRlIGd0ZXN0LmggaW5zdGVhZC4KKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbgorLy8gbWFjcm9zOgorLy8KKy8vICAgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZF9mb3JtYXQgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgdGFrZXMgbiAoaW4gdGhlCisvLyBjYXNlIG9mIEFTU0VSVF9QUkVEX0ZPUk1BVG4pIHZhbHVlcyBhbmQgdGhlaXIgc291cmNlIGV4cHJlc3Npb24KKy8vIHRleHQsIGFuZCByZXR1cm5zIGEgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LiAgU2VlIHRoZSBkZWZpbml0aW9uCisvLyBvZiBBU1NFUlRfRVEgaW4gZ3Rlc3QuaCBmb3IgYW4gZXhhbXBsZS4KKy8vCisvLyBJZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBmb3JtYXR0aW5nLCB5b3UgY2FuIHVzZSB0aGUgbW9yZQorLy8gcmVzdHJpY3RpdmUgdmVyc2lvbjoKKy8vCisvLyAgIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkKKy8vICAgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZCBpcyBhbiBuLWFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgcmV0dXJucyBib29sLAorLy8gYW5kIHRoZSB2YWx1ZXMgdjEsIHYyLCAuLi4sIG11c3Qgc3VwcG9ydCB0aGUgPDwgb3BlcmF0b3IgZm9yCisvLyBzdHJlYW1pbmcgdG8gc3RkOjpvc3RyZWFtLgorLy8KKy8vIFdlIGFsc28gZGVmaW5lIHRoZSBFWFBFQ1RfKiB2YXJpYXRpb25zLgorLy8KKy8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHByZWRpY2F0ZXMgd2hvc2UgYXJpdHkgaXMgYXQgbW9zdCA1LgorLy8gUGxlYXNlIGVtYWlsIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAorLy8gc3VwcG9ydCBmb3IgaGlnaGVyIGFyaXRpZXMuCisKKy8vIEdURVNUX0FTU0VSVF8gaXMgdGhlIGJhc2ljIHN0YXRlbWVudCB0byB3aGljaCBhbGwgb2YgdGhlIGFzc2VydGlvbnMKKy8vIGluIHRoaXMgZmlsZSByZWR1Y2UuICBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisKKyNkZWZpbmUgR1RFU1RfQVNTRVJUXyhleHByZXNzaW9uLCBvbl9mYWlsdXJlKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gKGV4cHJlc3Npb24pKSBcCisgICAgOyBcCisgIGVsc2UgXAorICAgIG9uX2ZhaWx1cmUoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQxSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSB7CisgIGlmIChwcmVkKHYxKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQxLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCB2MSksIFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMUhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSksIG9uX2ZhaWx1cmUpCisKKy8vIFVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMShwcmVkLCB2MSkgXAorICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkgXAorICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQySGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgeworICBpZiAocHJlZCh2MSwgdjIpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MjsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQyLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCB2MSwgdjIpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQySGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyKSwgb25fZmFpbHVyZSkKKworLy8gQmluYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQyKHByZWQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDM+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDNIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgeworICBpZiAocHJlZCh2MSwgdjIsIHYzKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDMuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsIHYxLCB2MiwgdjMpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkM0hlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MyksIG9uX2ZhaWx1cmUpCisKKy8vIFRlcm5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDMocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQzKHByZWQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzLAorICAgICAgICAgIHR5cGVuYW1lIFQ0PgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ0SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0KSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNCA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NDsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ0LgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCB2MSwgdjIsIHYzLCB2NCksIFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNEhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCksIG9uX2ZhaWx1cmUpCisKKy8vIDQtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzLAorICAgICAgICAgIHR5cGVuYW1lIFQ0LAorICAgICAgICAgIHR5cGVuYW1lIFQ1PgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ1SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgeworICBpZiAocHJlZCh2MSwgdjIsIHYzLCB2NCwgdjUpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU0IDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTUgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ1LgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsICN2NCwgI3Y1LCB2MSwgdjIsIHYzLCB2NCwgdjUpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ1SGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY1KSwgb25fZmFpbHVyZSkKKworLy8gNS1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDUocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ1KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODBkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBkZWZpbml0aW9ucyB1c2VmdWwgaW4gcHJvZHVjdGlvbiBjb2RlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KKworLy8gV2hlbiB5b3UgbmVlZCB0byB0ZXN0IHRoZSBwcml2YXRlIG9yIHByb3RlY3RlZCBtZW1iZXJzIG9mIGEgY2xhc3MsCisvLyB1c2UgdGhlIEZSSUVORF9URVNUIG1hY3JvIHRvIGRlY2xhcmUgeW91ciB0ZXN0cyBhcyBmcmllbmRzIG9mIHRoZQorLy8gY2xhc3MuICBGb3IgZXhhbXBsZToKKy8vCisvLyBjbGFzcyBNeUNsYXNzIHsKKy8vICBwcml2YXRlOgorLy8gICB2b2lkIE15TWV0aG9kKCk7CisvLyAgIEZSSUVORF9URVNUKE15Q2xhc3NUZXN0LCBNeU1ldGhvZCk7CisvLyB9OworLy8KKy8vIGNsYXNzIE15Q2xhc3NUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworLy8gICAvLyAuLi4KKy8vIH07CisvLworLy8gVEVTVF9GKE15Q2xhc3NUZXN0LCBNeU1ldGhvZCkgeworLy8gICAvLyBDYW4gY2FsbCBNeUNsYXNzOjpNeU1ldGhvZCgpIGhlcmUuCisvLyB9CisKKyNkZWZpbmUgRlJJRU5EX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCitmcmllbmQgY2xhc3MgdGVzdF9jYXNlX25hbWUjI18jI3Rlc3RfbmFtZSMjX1Rlc3QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiM2E3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzE5IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgaW50ZXJuYWwgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nCisvLyBkZWF0aCB0ZXN0cy4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpOworCisvLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuCitjb25zdCBjaGFyIGtEZWF0aFRlc3RTdHlsZUZsYWdbXSA9ICJkZWF0aF90ZXN0X3N0eWxlIjsKK2NvbnN0IGNoYXIga0RlYXRoVGVzdFVzZUZvcmtbXSA9ICJkZWF0aF90ZXN0X3VzZV9mb3JrIjsKK2NvbnN0IGNoYXIga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZ1tdID0gImludGVybmFsX3J1bl9kZWF0aF90ZXN0IjsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIERlYXRoVGVzdCBpcyBhIGNsYXNzIHRoYXQgaGlkZXMgbXVjaCBvZiB0aGUgY29tcGxleGl0eSBvZiB0aGUKKy8vIEdURVNUX0RFQVRIX1RFU1RfIG1hY3JvLiAgSXQgaXMgYWJzdHJhY3Q7IGl0cyBzdGF0aWMgQ3JlYXRlIG1ldGhvZAorLy8gcmV0dXJucyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUgcHJldmFpbGluZyBkZWF0aCB0ZXN0CisvLyBzdHlsZSwgYXMgZGVmaW5lZCBieSB0aGUgLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGFuZC9vcgorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFncy4KKworLy8gSW4gZGVzY3JpYmluZyB0aGUgcmVzdWx0cyBvZiBkZWF0aCB0ZXN0cywgdGhlc2UgdGVybXMgYXJlIHVzZWQgd2l0aAorLy8gdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbnM6CisvLworLy8gZXhpdCBzdGF0dXM6ICBUaGUgaW50ZWdlciBleGl0IGluZm9ybWF0aW9uIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkCisvLyAgICAgICAgICAgICAgIGJ5IHdhaXQoMikKKy8vIGV4aXQgY29kZTogICAgVGhlIGludGVnZXIgY29kZSBwYXNzZWQgdG8gZXhpdCgzKSwgX2V4aXQoMiksIG9yCisvLyAgICAgICAgICAgICAgIHJldHVybmVkIGZyb20gbWFpbigpCitjbGFzcyBHVEVTVF9BUElfIERlYXRoVGVzdCB7CisgcHVibGljOgorICAvLyBDcmVhdGUgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZGV0ZXJtaW5pbmcgdGhlCisgIC8vIGFwcHJvcHJpYXRlIGFjdGlvbiB0byB0YWtlIGZvciB0aGUgY3VycmVudCBkZWF0aCB0ZXN0OyBmb3IgZXhhbXBsZSwKKyAgLy8gaWYgdGhlIGd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgZmxhZyBpcyBzZXQgdG8gYW4gaW52YWxpZCB2YWx1ZS4KKyAgLy8gVGhlIExhc3RNZXNzYWdlIG1ldGhvZCB3aWxsIHJldHVybiBhIG1vcmUgZGV0YWlsZWQgbWVzc2FnZSBpbiB0aGF0CisgIC8vIGNhc2UuICBPdGhlcndpc2UsIHRoZSBEZWF0aFRlc3QgcG9pbnRlciBwb2ludGVkIHRvIGJ5IHRoZSAidGVzdCIKKyAgLy8gYXJndW1lbnQgaXMgc2V0LiAgSWYgdGhlIGRlYXRoIHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQsIHRoZSBwb2ludGVyCisgIC8vIGlzIHNldCB0byBOVUxMOyBvdGhlcndpc2UsIGl0IGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiBhIG5ldyBjb25jcmV0ZQorICAvLyBEZWF0aFRlc3Qgb2JqZWN0IHRoYXQgY29udHJvbHMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCB0ZXN0LgorICBzdGF0aWMgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCk7CisgIERlYXRoVGVzdCgpOworICB2aXJ0dWFsIH5EZWF0aFRlc3QoKSB7IH0KKworICAvLyBBIGhlbHBlciBjbGFzcyB0aGF0IGFib3J0cyBhIGRlYXRoIHRlc3Qgd2hlbiBpdCdzIGRlbGV0ZWQuCisgIGNsYXNzIFJldHVyblNlbnRpbmVsIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBSZXR1cm5TZW50aW5lbChEZWF0aFRlc3QqIHRlc3QpIDogdGVzdF8odGVzdCkgeyB9CisgICAgflJldHVyblNlbnRpbmVsKCkgeyB0ZXN0Xy0+QWJvcnQoVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5UKTsgfQorICAgcHJpdmF0ZToKKyAgICBEZWF0aFRlc3QqIGNvbnN0IHRlc3RfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUmV0dXJuU2VudGluZWwpOworICB9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOworCisgIC8vIEFuIGVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJvbGVzIHRoYXQgbWF5IGJlIHRha2VuIHdoZW4gYSBkZWF0aAorICAvLyB0ZXN0IGlzIGVuY291bnRlcmVkLiAgRVhFQ1VURSBtZWFucyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGxvZ2ljIHNob3VsZAorICAvLyBiZSBleGVjdXRlZCBpbW1lZGlhdGVseS4gIE9WRVJTRUUgbWVhbnMgdGhhdCB0aGUgcHJvZ3JhbSBzaG91bGQgcHJlcGFyZQorICAvLyB0aGUgYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgZm9yIGEgY2hpbGQgcHJvY2VzcyB0byBleGVjdXRlIHRoZSBkZWF0aAorICAvLyB0ZXN0LCB0aGVuIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLgorICBlbnVtIFRlc3RSb2xlIHsgT1ZFUlNFRV9URVNULCBFWEVDVVRFX1RFU1QgfTsKKworICAvLyBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgdGhyZWUgcmVhc29ucyB0aGF0IGEgdGVzdCBtaWdodCBiZSBhYm9ydGVkLgorICBlbnVtIEFib3J0UmVhc29uIHsKKyAgICBURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQsCisgICAgVEVTVF9USFJFV19FWENFUFRJT04sCisgICAgVEVTVF9ESURfTk9UX0RJRQorICB9OworCisgIC8vIEFzc3VtZXMgb25lIG9mIHRoZSBhYm92ZSByb2xlcy4KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCkgPSAwOworCisgIC8vIFdhaXRzIGZvciB0aGUgZGVhdGggdGVzdCB0byBmaW5pc2ggYW5kIHJldHVybnMgaXRzIHN0YXR1cy4KKyAgdmlydHVhbCBpbnQgV2FpdCgpID0gMDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGRlYXRoIHRlc3QgcGFzc2VkOyB0aGF0IGlzLCB0aGUgdGVzdCBwcm9jZXNzCisgIC8vIGV4aXRlZCBkdXJpbmcgdGhlIHRlc3QsIGl0cyBleGl0IHN0YXR1cyBtYXRjaGVzIGEgdXNlci1zdXBwbGllZAorICAvLyBwcmVkaWNhdGUsIGFuZCBpdHMgc3RkZXJyIG91dHB1dCBtYXRjaGVzIGEgdXNlci1zdXBwbGllZCByZWd1bGFyCisgIC8vIGV4cHJlc3Npb24uCisgIC8vIFRoZSB1c2VyLXN1cHBsaWVkIHByZWRpY2F0ZSBtYXkgYmUgYSBtYWNybyBleHByZXNzaW9uIHJhdGhlcgorICAvLyB0aGFuIGEgZnVuY3Rpb24gcG9pbnRlciBvciBmdW5jdG9yLCBvciBlbHNlIFdhaXQgYW5kIFBhc3NlZCBjb3VsZAorICAvLyBiZSBjb21iaW5lZC4KKyAgdmlydHVhbCBib29sIFBhc3NlZChib29sIGV4aXRfc3RhdHVzX29rKSA9IDA7CisKKyAgLy8gU2lnbmFscyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGRpZCBub3QgZGllIGFzIGV4cGVjdGVkLgorICB2aXJ0dWFsIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSA9IDA7CisKKyAgLy8gUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG91dGNvbWUgbWVzc2FnZSByZWdhcmRpbmcgdGhlIG91dGNvbWUgb2YKKyAgLy8gdGhlIGxhc3QgZGVhdGggdGVzdC4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIExhc3RNZXNzYWdlKCk7CisKKyAgc3RhdGljIHZvaWQgc2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKworIHByaXZhdGU6CisgIC8vIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiBvZiB0aGUgb3V0Y29tZSBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0LgorICBzdGF0aWMgc3RkOjpzdHJpbmcgbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVhdGhUZXN0KTsKK307CisKKy8vIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBkZWF0aCB0ZXN0cy4gIE1heSBiZSBtb2NrZWQgb3V0IGZvciB0ZXN0aW5nLgorY2xhc3MgRGVhdGhUZXN0RmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5EZWF0aFRlc3RGYWN0b3J5KCkgeyB9CisgIHZpcnR1YWwgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpID0gMDsKK307CisKKy8vIEEgY29uY3JldGUgRGVhdGhUZXN0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3Igbm9ybWFsIHVzZS4KK2NsYXNzIERlZmF1bHREZWF0aFRlc3RGYWN0b3J5IDogcHVibGljIERlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCk7Cit9OworCisvLyBSZXR1cm5zIHRydWUgaWYgZXhpdF9zdGF0dXMgZGVzY3JpYmVzIGEgcHJvY2VzcyB0aGF0IHdhcyB0ZXJtaW5hdGVkCisvLyBieSBhIHNpZ25hbCwgb3IgZXhpdGVkIG5vcm1hbGx5IHdpdGggYSBub256ZXJvIGV4aXQgY29kZS4KK0dURVNUX0FQSV8gYm9vbCBFeGl0ZWRVbnN1Y2Nlc3NmdWxseShpbnQgZXhpdF9zdGF0dXMpOworCisvLyBUcmFwcyBDKysgZXhjZXB0aW9ucyBlc2NhcGluZyBzdGF0ZW1lbnQgYW5kIHJlcG9ydHMgdGhlbSBhcyB0ZXN0CisvLyBmYWlsdXJlcy4gTm90ZSB0aGF0IHRyYXBwaW5nIFNFSCBleGNlcHRpb25zIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlLgorIyBpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyAgZGVmaW5lIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZGVhdGhfdGVzdCkgXAorICB0cnkgeyBcCisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgIH0gY2F0Y2ggKGNvbnN0IDo6c3RkOjpleGNlcHRpb24mIGd0ZXN0X2V4Y2VwdGlvbikgeyBcCisgICAgZnByaW50ZihcCisgICAgICAgIHN0ZGVyciwgXAorICAgICAgICAiXG4lczogQ2F1Z2h0IHN0ZDo6ZXhjZXB0aW9uLWRlcml2ZWQgZXhjZXB0aW9uIGVzY2FwaW5nIHRoZSAiIFwKKyAgICAgICAgImRlYXRoIHRlc3Qgc3RhdGVtZW50LiBFeGNlcHRpb24gbWVzc2FnZTogJXNcbiIsIFwKKyAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXykuY19zdHIoKSwgXAorICAgICAgICBndGVzdF9leGNlcHRpb24ud2hhdCgpKTsgXAorICAgIGZmbHVzaChzdGRlcnIpOyBcCisgICAgZGVhdGhfdGVzdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX1RIUkVXX0VYQ0VQVElPTik7IFwKKyAgfSBjYXRjaCAoLi4uKSB7IFwKKyAgICBkZWF0aF90ZXN0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfVEhSRVdfRVhDRVBUSU9OKTsgXAorICB9CisKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZGVhdGhfdGVzdCkgXAorICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkKKworIyBlbmRpZgorCisvLyBUaGlzIG1hY3JvIGlzIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX0RFQVRIKiwgRVhQRUNUX0RFQVRIKiwKKy8vIEFTU0VSVF9FWElUKiwgYW5kIEVYUEVDVF9FWElUKi4KKyMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFJiBndGVzdF9yZWdleCA9IChyZWdleCk7IFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3QqIGd0ZXN0X2R0OyBcCisgICAgaWYgKCE6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkNyZWF0ZSgjc3RhdGVtZW50LCAmZ3Rlc3RfcmVnZXgsIFwKKyAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAmZ3Rlc3RfZHQpKSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTsgXAorICAgIH0gXAorICAgIGlmIChndGVzdF9kdCAhPSBOVUxMKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdD4gXAorICAgICAgICAgIGd0ZXN0X2R0X3B0cihndGVzdF9kdCk7IFwKKyAgICAgIHN3aXRjaCAoZ3Rlc3RfZHQtPkFzc3VtZVJvbGUoKSkgeyBcCisgICAgICAgIGNhc2UgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpPVkVSU0VFX1RFU1Q6IFwKKyAgICAgICAgICBpZiAoIWd0ZXN0X2R0LT5QYXNzZWQocHJlZGljYXRlKGd0ZXN0X2R0LT5XYWl0KCkpKSkgeyBcCisgICAgICAgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgICB9IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICBjYXNlIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6RVhFQ1VURV9URVNUOiB7IFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlJldHVyblNlbnRpbmVsIFwKKyAgICAgICAgICAgICAgZ3Rlc3Rfc2VudGluZWwoZ3Rlc3RfZHQpOyBcCisgICAgICAgICAgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBndGVzdF9kdCk7IFwKKyAgICAgICAgICBndGVzdF9kdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX0RJRF9OT1RfRElFKTsgXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIH0gXAorICAgICAgICBkZWZhdWx0OiBcCisgICAgICAgICAgYnJlYWs7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpKQorLy8gVGhlIHN5bWJvbCAiZmFpbCIgaGVyZSBleHBhbmRzIHRvIHNvbWV0aGluZyBpbnRvIHdoaWNoIGEgbWVzc2FnZQorLy8gY2FuIGJlIHN0cmVhbWVkLgorCisvLyBUaGlzIG1hY3JvIGlzIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUL0VYUEVDVF9ERUJVR19ERUFUSCB3aGVuIGNvbXBpbGVkIGluCisvLyBOREVCVUcgbW9kZS4gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdGhlIHN0YXRlbWVudHMgdG8gYmUgZXhlY3V0ZWQsIHRoZSByZWdleCBpcworLy8gaWdub3JlZCwgYW5kIHRoZSBtYWNybyBtdXN0IGFjY2VwdCBhIHN0cmVhbWVkIG1lc3NhZ2UgZXZlbiB0aG91Z2ggdGhlIG1lc3NhZ2UKKy8vIGlzIG5ldmVyIHByaW50ZWQuCisjIGRlZmluZSBHVEVTVF9FWEVDVVRFX1NUQVRFTUVOVF8oc3RhdGVtZW50LCByZWdleCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgfSBlbHNlIFwKKyAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorCisvLyBBIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIGNvbnRlbnRzIG9mIHRoZQorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLCBhcyBpdCBleGlzdGVkIHdoZW4KKy8vIFJVTl9BTExfVEVTVFMgd2FzIGNhbGxlZC4KK2NsYXNzIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyB7CisgcHVibGljOgorICBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoY29uc3Qgc3RkOjpzdHJpbmcmIGFfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYV93cml0ZV9mZCkKKyAgICAgIDogZmlsZV8oYV9maWxlKSwgbGluZV8oYV9saW5lKSwgaW5kZXhfKGFuX2luZGV4KSwKKyAgICAgICAgd3JpdGVfZmRfKGFfd3JpdGVfZmQpIHt9CisKKyAgfkludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIHsKKyAgICBpZiAod3JpdGVfZmRfID49IDApCisgICAgICBwb3NpeDo6Q2xvc2Uod3JpdGVfZmRfKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKCkgY29uc3QgeyByZXR1cm4gZmlsZV87IH0KKyAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQorICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBpbmRleF87IH0KKyAgaW50IHdyaXRlX2ZkKCkgY29uc3QgeyByZXR1cm4gd3JpdGVfZmRfOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBmaWxlXzsKKyAgaW50IGxpbmVfOworICBpbnQgaW5kZXhfOworICBpbnQgd3JpdGVfZmRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKTsKK307CisKKy8vIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyBvYmplY3Qgd2l0aCBmaWVsZHMKKy8vIGluaXRpYWxpemVkIGZyb20gdGhlIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpIGZsYWcgaWYKKy8vIHRoZSBmbGFnIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KK0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKTsKKworI2Vsc2UgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIG1hY3JvcyBzdWNoIGFzCisvLyBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEIGFuZCBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEIG9uIHN5c3RlbXMgd2hlcmUKKy8vIGRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkLiBUaG9zZSBtYWNyb3MgbXVzdCBjb21waWxlIG9uIHN1Y2ggc3lzdGVtcworLy8gaWZmIEVYUEVDVF9ERUFUSCBhbmQgQVNTRVJUX0RFQVRIIGNvbXBpbGUgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIG9uCisvLyBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBkZWF0aCB0ZXN0cy4gVGhpcyBhbGxvd3Mgb25lIHRvIHdyaXRlIHN1Y2ggYSBtYWNybworLy8gb24gYSBzeXN0ZW0gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGRlYXRoIHRlc3RzIGFuZCBiZSBzdXJlIHRoYXQgaXQgd2lsbAorLy8gY29tcGlsZSBvbiBhIGRlYXRoLXRlc3Qgc3VwcG9ydGluZyBzeXN0ZW0uCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAgc3RhdGVtZW50IC0gIEEgc3RhdGVtZW50IHRoYXQgYSBtYWNybyBzdWNoIGFzIEVYUEVDVF9ERUFUSCB3b3VsZCB0ZXN0CisvLyAgICAgICAgICAgICAgICBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGlvbi4gVGhpcyBtYWNybyBoYXMgdG8gbWFrZSBzdXJlIHRoaXMKKy8vICAgICAgICAgICAgICAgIHN0YXRlbWVudCBpcyBjb21waWxlZCBidXQgbm90IGV4ZWN1dGVkLCB0byBlbnN1cmUgdGhhdAorLy8gICAgICAgICAgICAgICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBjb21waWxlcyB3aXRoIGEgY2VydGFpbgorLy8gICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlmZiBFWFBFQ1RfREVBVEggY29tcGlsZXMgd2l0aCBpdC4KKy8vICAgcmVnZXggICAgIC0gIEEgcmVnZXggdGhhdCBhIG1hY3JvIHN1Y2ggYXMgRVhQRUNUX0RFQVRIIHdvdWxkIHVzZSB0byB0ZXN0CisvLyAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IG9mIHN0YXRlbWVudC4gIFRoaXMgcGFyYW1ldGVyIGhhcyB0byBiZQorLy8gICAgICAgICAgICAgICAgY29tcGlsZWQgYnV0IG5vdCBldmFsdWF0ZWQgYnkgdGhpcyBtYWNybywgdG8gZW5zdXJlIHRoYXQKKy8vICAgICAgICAgICAgICAgIHRoaXMgbWFjcm8gb25seSBhY2NlcHRzIGV4cHJlc3Npb25zIHRoYXQgYSBtYWNybyBzdWNoIGFzCisvLyAgICAgICAgICAgICAgICBFWFBFQ1RfREVBVEggd291bGQgYWNjZXB0LgorLy8gICB0ZXJtaW5hdG9yIC0gTXVzdCBiZSBhbiBlbXB0eSBzdGF0ZW1lbnQgZm9yIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQKKy8vICAgICAgICAgICAgICAgIGFuZCBhIHJldHVybiBzdGF0ZW1lbnQgZm9yIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQuCisvLyAgICAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEIHdpbGwgbm90CisvLyAgICAgICAgICAgICAgICBjb21waWxlIGluc2lkZSBmdW5jdGlvbnMgd2hlcmUgQVNTRVJUX0RFQVRIIGRvZXNuJ3QKKy8vICAgICAgICAgICAgICAgIGNvbXBpbGUuCisvLworLy8gIFRoZSBicmFuY2ggdGhhdCBoYXMgYW4gYWx3YXlzIGZhbHNlIGNvbmRpdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0CisvLyAgc3RhdGVtZW50IGFuZCByZWdleCBhcmUgY29tcGlsZWQgKGFuZCB0aHVzIHN5bnRhY3RpY2FsbHkgY29ycmVjdCkgYnV0CisvLyAgbmV2ZXIgZXhlY3V0ZWQuIFRoZSB1bnJlYWNoYWJsZSBjb2RlIG1hY3JvIHByb3RlY3RzIHRoZSB0ZXJtaW5hdG9yCisvLyAgc3RhdGVtZW50IGZyb20gZ2VuZXJhdGluZyBhbiAndW5yZWFjaGFibGUgY29kZScgd2FybmluZyBpbiBjYXNlCisvLyAgc3RhdGVtZW50IHVuY29uZGl0aW9uYWxseSByZXR1cm5zIG9yIHRocm93cy4gVGhlIE1lc3NhZ2UgY29uc3RydWN0b3IgYXQKKy8vICB0aGUgZW5kIGFsbG93cyB0aGUgc3ludGF4IG9mIHN0cmVhbWluZyBhZGRpdGlvbmFsIG1lc3NhZ2VzIGludG8gdGhlCisvLyAgbWFjcm8sIGZvciBjb21waWxhdGlvbmFsIGNvbXBhdGliaWxpdHkgd2l0aCBFWFBFQ1RfREVBVEgvQVNTRVJUX0RFQVRILgorIyBkZWZpbmUgR1RFU1RfVU5TVVBQT1JURURfREVBVEhfVEVTVF8oc3RhdGVtZW50LCByZWdleCwgdGVybWluYXRvcikgXAorICAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICAgIEdURVNUX0xPR18oV0FSTklORykgXAorICAgICAgICAgIDw8ICJEZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLlxuIiBcCisgICAgICAgICAgPDwgIlN0YXRlbWVudCAnIiAjc3RhdGVtZW50ICInIGNhbm5vdCBiZSB2ZXJpZmllZC4iOyBcCisgICAgfSBlbHNlIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFOjpQYXJ0aWFsTWF0Y2goIi4qIiwgKHJlZ2V4KSk7IFwKKyAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICAgICAgdGVybWluYXRvcjsgXAorICAgIH0gZWxzZSBcCisgICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExM2I0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oCkBAIC0wLDAgKzEsMjA2IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisvLworLy8gR29vZ2xlIFRlc3QgZmlsZXBhdGggdXRpbGl0aWVzCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgaW4gPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgorLy8gRG8gbm90IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBzZXBhcmF0ZWx5IQorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEZpbGVQYXRoIC0gYSBjbGFzcyBmb3IgZmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhuYW1lIG1hbmlwdWxhdGlvbiB3aGljaAorLy8gaGFuZGxlcyBwbGF0Zm9ybS1zcGVjaWZpYyBjb252ZW50aW9ucyAobGlrZSB0aGUgcGF0aG5hbWUgc2VwYXJhdG9yKS4KKy8vIFVzZWQgZm9yIGhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KKy8vIEV4Y2VwdCBmb3IgU2V0IG1ldGhvZHMsIGFsbCBtZXRob2RzIGFyZSBjb25zdCBvciBzdGF0aWMsIHdoaWNoIHByb3ZpZGVzIGFuCisvLyAiaW1tdXRhYmxlIHZhbHVlIG9iamVjdCIgLS0gdXNlZnVsIGZvciBwZWFjZSBvZiBtaW5kLgorLy8gQSBGaWxlUGF0aCB3aXRoIGEgdmFsdWUgZW5kaW5nIGluIGEgcGF0aCBzZXBhcmF0b3IgKCJsaWtlL3RoaXMvIikgcmVwcmVzZW50cworLy8gYSBkaXJlY3RvcnksIG90aGVyd2lzZSBpdCBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhIGZpbGUuIEluIGVpdGhlciBjYXNlLAorLy8gaXQgbWF5IG9yIG1heSBub3QgcmVwcmVzZW50IGFuIGFjdHVhbCBmaWxlIG9yIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uCisvLyBOYW1lcyBhcmUgTk9UIGNoZWNrZWQgZm9yIHN5bnRheCBjb3JyZWN0bmVzcyAtLSBubyBjaGVja2luZyBmb3IgaWxsZWdhbAorLy8gY2hhcmFjdGVycywgbWFsZm9ybWVkIHBhdGhzLCBldGMuCisKK2NsYXNzIEdURVNUX0FQSV8gRmlsZVBhdGggeworIHB1YmxpYzoKKyAgRmlsZVBhdGgoKSA6IHBhdGhuYW1lXygiIikgeyB9CisgIEZpbGVQYXRoKGNvbnN0IEZpbGVQYXRoJiByaHMpIDogcGF0aG5hbWVfKHJocy5wYXRobmFtZV8pIHsgfQorCisgIGV4cGxpY2l0IEZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRobmFtZSkgOiBwYXRobmFtZV8ocGF0aG5hbWUpIHsKKyAgICBOb3JtYWxpemUoKTsKKyAgfQorCisgIEZpbGVQYXRoJiBvcGVyYXRvcj0oY29uc3QgRmlsZVBhdGgmIHJocykgeworICAgIFNldChyaHMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgU2V0KGNvbnN0IEZpbGVQYXRoJiByaHMpIHsKKyAgICBwYXRobmFtZV8gPSByaHMucGF0aG5hbWVfOworICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXzsgfQorICBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgorICBzdGF0aWMgRmlsZVBhdGggR2V0Q3VycmVudERpcigpOworCisgIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCisgIC8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgorICAvLyB0aGFuIHplcm8gKGUuZy4sIDEyKSwgcmV0dXJucyAiZGlyL3Rlc3RfMTIueG1sIi4KKyAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KKyAgc3RhdGljIEZpbGVQYXRoIE1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pOworCisgIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwKKyAgLy8gcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4KKyAgLy8gT24gV2luZG93cywgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KKyAgc3RhdGljIEZpbGVQYXRoIENvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCk7CisKKyAgLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQorICAvLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCisgIC8vIGRpcmVjdG9yeS9iYXNlX25hbWVfPG51bWJlcj4uZXh0ZW5zaW9uIGlmIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uCisgIC8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAorICAvLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgIC8vIEV4YW1wbGVzOiAnZGlyL2Zvb190ZXN0LnhtbCcgb3IgJ2Rpci9mb29fdGVzdF8xLnhtbCcuCisgIC8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKKyAgLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KKyAgc3RhdGljIEZpbGVQYXRoIEdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBwYXRoIGlzICIiLgorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV8uZW1wdHkoKTsgfQorCisgIC8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlcyBpdCBhbmQgcmV0dXJucworICAvLyB0aGUgbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KKyAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IsIG90aGVyIHBsYXRmb3JtcyB1c2UgLy4KKyAgRmlsZVBhdGggUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCisgIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucworICAvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKKyAgLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKKyAgLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorICBGaWxlUGF0aCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3Q7CisKKyAgLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KKyAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkgcmV0dXJucyAicGF0aC90by8iLgorICAvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCisgIC8vIG5vdCBoYXZlIGEgZmlsZSwgbGlrZSAianVzdC9hL2Rpci8iLCBpdCByZXR1cm5zIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorICBGaWxlUGF0aCBSZW1vdmVGaWxlTmFtZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgorICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgiZGlyL2ZpbGUuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJFWEUiKSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAorICAvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgorICBGaWxlUGF0aCBSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdDsKKworICAvLyBDcmVhdGVzIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmCisgIC8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUKKyAgLy8gZGlyZWN0b3JpZXMgZm9yIGFueSByZWFzb24uIFdpbGwgYWxzbyByZXR1cm4gZmFsc2UgaWYgdGhlIEZpbGVQYXRoIGRvZXMKKyAgLy8gbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeSAodGhhdCBpcywgaXQgZG9lc24ndCBlbmQgd2l0aCBhIHBhdGggc2VwYXJhdG9yKS4KKyAgYm9vbCBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3Q7CisKKyAgLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IKKyAgLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQorICAvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAorICAvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4KKyAgYm9vbCBDcmVhdGVGb2xkZXIoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZGVzY3JpYmVzIHNvbWV0aGluZyBpbiB0aGUgZmlsZS1zeXN0ZW0sCisgIC8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIsIGFuZCB0aGF0IHNvbWV0aGluZyBleGlzdHMuCisgIGJvb2wgRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KKyAgLy8gdGhhdCBleGlzdHMuCisgIGJvb2wgRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorICAvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KKyAgYm9vbCBJc0RpcmVjdG9yeSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSByb290IGRpcmVjdG9yeS4gKFdpbmRvd3MgaGFzIG9uZQorICAvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCisgIGJvb2wgSXNSb290RGlyZWN0b3J5KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgorICBib29sIElzQWJzb2x1dGVQYXRoKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBSZXBsYWNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIHdpdGggYSBzaW5nbGUgc2VwYXJhdG9yLgorICAvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgorICAvLyByZWR1bmRhbmNpZXMgdGhhdCBtaWdodCBiZSBpbiBhIHBhdGhuYW1lIGludm9sdmluZyAiLiIgb3IgIi4uIi4KKyAgLy8KKyAgLy8gQSBwYXRobmFtZSB3aXRoIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgbWF5IG9jY3VyIGVpdGhlciB0aHJvdWdoCisgIC8vIHVzZXIgZXJyb3Igb3IgYXMgYSByZXN1bHQgb2Ygc29tZSBzY3JpcHRzIG9yIEFQSXMgdGhhdCBnZW5lcmF0ZSBhIHBhdGhuYW1lCisgIC8vIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IuIE9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc2FtZSBBUEkgb3Igc2NyaXB0CisgIC8vIG1heSBOT1QgZ2VuZXJhdGUgYSBwYXRobmFtZSB3aXRoIGEgdHJhaWxpbmcgIi8iLiBUaGVuIGVsc2V3aGVyZSB0aGF0CisgIC8vIHBhdGhuYW1lIG1heSBoYXZlIGFub3RoZXIgIi8iIGFuZCBwYXRobmFtZSBjb21wb25lbnRzIGFkZGVkIHRvIGl0LAorICAvLyB3aXRob3V0IGNoZWNraW5nIGZvciB0aGUgc2VwYXJhdG9yIGFscmVhZHkgYmVpbmcgdGhlcmUuCisgIC8vIFRoZSBzY3JpcHQgbGFuZ3VhZ2UgYW5kIG9wZXJhdGluZyBzeXN0ZW0gbWF5IGFsbG93IHBhdGhzIGxpa2UgImZvby8vYmFyIgorICAvLyBidXQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGluIEZpbGVQYXRoIHdpbGwgbm90IGhhbmRsZSB0aGF0IGNvcnJlY3RseS4gSW4KKyAgLy8gcGFydGljdWxhciwgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgb25seSByZW1vdmVzIG9uZSBzZXBhcmF0b3IsIGFuZAorICAvLyBpdCBpcyBjYWxsZWQgaW4gQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGFzc3VtaW5nIHRoYXQgaXQgd2lsbCBjaGFuZ2UKKyAgLy8gYSBwYXRobmFtZSBmcm9tIGRpcmVjdG9yeSBzeW50YXggKHRyYWlsaW5nIHNlcGFyYXRvcikgdG8gZmlsZW5hbWUgc3ludGF4LgorICAvLworICAvLyBPbiBXaW5kb3dzIHRoaXMgbWV0aG9kIGFsc28gcmVwbGFjZXMgdGhlIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvciAnLycgd2l0aAorICAvLyB0aGUgcHJpbWFyeSBwYXRoIHNlcGFyYXRvciAnXFwnLCBzbyB0aGF0IGZvciBleGFtcGxlICJiYXJcXC9cXGZvbyIgYmVjb21lcworICAvLyAiYmFyXFxmb28iLgorCisgIHZvaWQgTm9ybWFsaXplKCk7CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KKyAgLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAorICAvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgorICBjb25zdCBjaGFyKiBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdDsKKworICBzdGQ6OnN0cmluZyBwYXRobmFtZV87Cit9OyAgLy8gY2xhc3MgRmlsZVBhdGgKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjYzNhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTE1OCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpZiBHVEVTVF9PU19MSU5VWAorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy93YWl0Lmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyMgaW5jbHVkZSA8c3RkZXhjZXB0PgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgiCisKKy8vIER1ZSB0byBDKysgcHJlcHJvY2Vzc29yIHdlaXJkbmVzcywgd2UgbmVlZCBkb3VibGUgaW5kaXJlY3Rpb24gdG8KKy8vIGNvbmNhdGVuYXRlIHR3byB0b2tlbnMgd2hlbiBvbmUgb2YgdGhlbSBpcyBfX0xJTkVfXy4gIFdyaXRpbmcKKy8vCisvLyAgIGZvbyAjIyBfX0xJTkVfXworLy8KKy8vIHdpbGwgcmVzdWx0IGluIHRoZSB0b2tlbiBmb29fX0xJTkVfXywgaW5zdGVhZCBvZiBmb28gZm9sbG93ZWQgYnkKKy8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlCisvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL21pc2MtdGVjaG5pY2FsLWlzc3Vlcy5odG1sI2ZhcS0zOS42CisjZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl8oZm9vLCBiYXIpIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikKKyNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKSBmb28gIyMgYmFyCisKK2NsYXNzIFByb3RvY29sTWVzc2FnZTsKK25hbWVzcGFjZSBwcm90bzIgeyBjbGFzcyBNZXNzYWdlOyB9CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisKK2NsYXNzIEFzc2VydGlvblJlc3VsdDsgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhbiBhc3NlcnRpb24uCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmFpbHVyZSBtZXNzYWdlLgorY2xhc3MgVGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIHRlc3QuCitjbGFzcyBUZXN0SW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QuCitjbGFzcyBUZXN0UGFydFJlc3VsdDsgICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYSB0ZXN0IHBhcnQuCitjbGFzcyBVbml0VGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbGxlY3Rpb24gb2YgdGVzdCBjYXNlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50LgorY2xhc3MgU2NvcGVkVHJhY2U7ICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBzY29wZWQgdHJhY2UuCitjbGFzcyBUZXN0SW5mb0ltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVGVzdEluZm8KK2NsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdAorCisvLyBIb3cgbWFueSB0aW1lcyBJbml0R29vZ2xlVGVzdCgpIGhhcyBiZWVuIGNhbGxlZC4KK0dURVNUX0FQSV8gZXh0ZXJuIGludCBnX2luaXRfZ3Rlc3RfY291bnQ7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXTsKKworLy8gVHdvIG92ZXJsb2FkZWQgaGVscGVycyBmb3IgY2hlY2tpbmcgYXQgY29tcGlsZSB0aW1lIHdoZXRoZXIgYW4KKy8vIGV4cHJlc3Npb24gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbCAoaS5lLiBOVUxMIG9yIGFueSAwLXZhbHVlZAorLy8gY29tcGlsZS10aW1lIGludGVncmFsIGNvbnN0YW50KS4gIFRoZWlyIHJldHVybiB2YWx1ZXMgaGF2ZQorLy8gZGlmZmVyZW50IHNpemVzLCBzbyB3ZSBjYW4gdXNlIHNpemVvZigpIHRvIHRlc3Qgd2hpY2ggdmVyc2lvbiBpcworLy8gcGlja2VkIGJ5IHRoZSBjb21waWxlci4gIFRoZXNlIGhlbHBlcnMgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMsIGFzCisvLyB3ZSBvbmx5IG5lZWQgdGhlaXIgc2lnbmF0dXJlcy4KKy8vCisvLyBHaXZlbiBJc051bGxMaXRlcmFsSGVscGVyKHgpLCB0aGUgY29tcGlsZXIgd2lsbCBwaWNrIHRoZSBmaXJzdAorLy8gdmVyc2lvbiBpZiB4IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBTZWNyZXQqLCBhbmQgcGljayB0aGUKKy8vIHNlY29uZCB2ZXJzaW9uIG90aGVyd2lzZS4gIFNpbmNlIFNlY3JldCBpcyBhIHNlY3JldCBhbmQgaW5jb21wbGV0ZQorLy8gdHlwZSwgdGhlIG9ubHkgZXhwcmVzc2lvbiBhIHVzZXIgY2FuIHdyaXRlIHRoYXQgaGFzIHR5cGUgU2VjcmV0KiBpcworLy8gYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4gIFRoZXJlZm9yZSwgd2Uga25vdyB0aGF0IHggaXMgYSBudWxsCisvLyBwb2ludGVyIGxpdGVyYWwgaWYgYW5kIG9ubHkgaWYgdGhlIGZpcnN0IHZlcnNpb24gaXMgcGlja2VkIGJ5IHRoZQorLy8gY29tcGlsZXIuCitjaGFyIElzTnVsbExpdGVyYWxIZWxwZXIoU2VjcmV0KiBwKTsKK2NoYXIgKCZJc051bGxMaXRlcmFsSGVscGVyKC4uLikpWzJdOyAgLy8gTk9MSU5UCisKKy8vIEEgY29tcGlsZS10aW1lIGJvb2wgY29uc3RhbnQgdGhhdCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHggaXMgYQorLy8gbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQgY29tcGlsZS10aW1lCisvLyBpbnRlZ3JhbCBjb25zdGFudCkuCisjaWZkZWYgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlCisvLyBwYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pLgorIyBkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBmYWxzZQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgXAorICAgIChzaXplb2YoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNOdWxsTGl0ZXJhbEhlbHBlcih4KSkgPT0gMSkKKyNlbmRpZiAgLy8gR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ3Rlc3RfbXNnLCBjb25zdCBNZXNzYWdlJiB1c2VyX21zZyk7CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgKGFuZCBvbmx5IGJ5KSBhIGZhaWxlZCBHb29nbGUgVGVzdAorLy8gYXNzZXJ0aW9uIHdoZW4gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSBpcyB0cnVlIChpZiBleGNlcHRpb25zCisvLyBhcmUgZW5hYmxlZCkuICBXZSBkZXJpdmUgaXQgZnJvbSBzdGQ6OnJ1bnRpbWVfZXJyb3IsIHdoaWNoIGlzIGZvcgorLy8gZXJyb3JzIHByZXN1bWFibHkgZGV0ZWN0YWJsZSBvbmx5IGF0IHJ1biB0aW1lLiAgU2luY2UKKy8vIHN0ZDo6cnVudGltZV9lcnJvciBpbmhlcml0cyBmcm9tIHN0ZDo6ZXhjZXB0aW9uLCBtYW55IHRlc3RpbmcKKy8vIGZyYW1ld29ya3Mga25vdyBob3cgdG8gZXh0cmFjdCBhbmQgcHJpbnQgdGhlIG1lc3NhZ2UgaW5zaWRlIGl0LgorY2xhc3MgR1RFU1RfQVBJXyBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiA6IHB1YmxpYyA6OnN0ZDo6cnVudGltZV9lcnJvciB7CisgcHVibGljOgorICBleHBsaWNpdCBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihjb25zdCBUZXN0UGFydFJlc3VsdCYgZmFpbHVyZSk7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzY29wZWQgdHJhY2VzIGluIHVzZXIgcHJvZ3JhbXMuCitjbGFzcyBHVEVTVF9BUElfIFNjb3BlZFRyYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjJ3RvciBwdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8KKyAgLy8gYSB0cmFjZSBzdGFjayBtYWludGFpbmVkIGJ5IEdvb2dsZSBUZXN0LgorICBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgLy8gVGhlIGQndG9yIHBvcHMgdGhlIGluZm8gcHVzaGVkIGJ5IHRoZSBjJ3Rvci4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoZSBkJ3RvciBpcyBub3QgdmlydHVhbCBpbiBvcmRlciB0byBiZSBlZmZpY2llbnQuCisgIC8vIERvbid0IGluaGVyaXQgZnJvbSBTY29wZWRUcmFjZSEKKyAgflNjb3BlZFRyYWNlKCk7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZFRyYWNlKTsKK30gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87ICAvLyBBIFNjb3BlZFRyYWNlIG9iamVjdCBkb2VzIGl0cyBqb2IgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYyd0b3IgYW5kIGQndG9yLiAgVGhlcmVmb3JlIGl0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHVzZWQgb3RoZXJ3aXNlLgorCisvLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KKy8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCisvLworLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgorLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQorLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgorLy8KKy8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyIKKy8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciIKKy8vICAgZXhwZWN0ZWRfdmFsdWU6ICAgICAgIjUiCisvLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2IgorLy8KKy8vIFRoZSBpZ25vcmluZ19jYXNlIHBhcmFtZXRlciBpcyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEKKy8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsCisvLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKTsKKworLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZSgKKyAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCisgICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LAorICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCisgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyByZXByZXNlbnRzIGFuIElFRUUgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisvLyAoZWl0aGVyIHNpbmdsZS1wcmVjaXNpb24gb3IgZG91YmxlLXByZWNpc2lvbiwgZGVwZW5kaW5nIG9uIHRoZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVycykuCisvLworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBkbyBtb3JlIHNvcGhpc3RpY2F0ZWQgbnVtYmVyCisvLyBjb21wYXJpc29uLiAgKER1ZSB0byByb3VuZC1vZmYgZXJyb3IsIGV0YywgaXQncyB2ZXJ5IHVubGlrZWx5IHRoYXQKKy8vIHR3byBmbG9hdGluZy1wb2ludHMgd2lsbCBiZSBlcXVhbCBleGFjdGx5LiAgSGVuY2UgYSBuYWl2ZQorLy8gY29tcGFyaXNvbiBieSB0aGUgPT0gb3BlcmF0aW9uIG9mdGVuIGRvZXNuJ3Qgd29yay4pCisvLworLy8gRm9ybWF0IG9mIElFRUUgZmxvYXRpbmctcG9pbnQ6CisvLworLy8gICBUaGUgbW9zdC1zaWduaWZpY2FudCBiaXQgYmVpbmcgdGhlIGxlZnRtb3N0LCBhbiBJRUVFCisvLyAgIGZsb2F0aW5nLXBvaW50IGxvb2tzIGxpa2UKKy8vCisvLyAgICAgc2lnbl9iaXQgZXhwb25lbnRfYml0cyBmcmFjdGlvbl9iaXRzCisvLworLy8gICBIZXJlLCBzaWduX2JpdCBpcyBhIHNpbmdsZSBiaXQgdGhhdCBkZXNpZ25hdGVzIHRoZSBzaWduIG9mIHRoZQorLy8gICBudW1iZXIuCisvLworLy8gICBGb3IgZmxvYXQsIHRoZXJlIGFyZSA4IGV4cG9uZW50IGJpdHMgYW5kIDIzIGZyYWN0aW9uIGJpdHMuCisvLworLy8gICBGb3IgZG91YmxlLCB0aGVyZSBhcmUgMTEgZXhwb25lbnQgYml0cyBhbmQgNTIgZnJhY3Rpb24gYml0cy4KKy8vCisvLyAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKKy8vICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JRUVFX2Zsb2F0aW5nLXBvaW50X3N0YW5kYXJkLgorLy8KKy8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKKy8vCisvLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorY2xhc3MgRmxvYXRpbmdQb2ludCB7CisgcHVibGljOgorICAvLyBEZWZpbmVzIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhhdCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKKyAgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVXaXRoU2l6ZTxzaXplb2YoUmF3VHlwZSk+OjpVSW50IEJpdHM7CisKKyAgLy8gQ29uc3RhbnRzLgorCisgIC8vICMgb2YgYml0cyBpbiBhIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrQml0Q291bnQgPSA4KnNpemVvZihSYXdUeXBlKTsKKworICAvLyAjIG9mIGZyYWN0aW9uIGJpdHMgaW4gYSBudW1iZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYWN0aW9uQml0Q291bnQgPQorICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0cyAtIDE7CisKKyAgLy8gIyBvZiBleHBvbmVudCBiaXRzIGluIGEgbnVtYmVyLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtFeHBvbmVudEJpdENvdW50ID0ga0JpdENvdW50IC0gMSAtIGtGcmFjdGlvbkJpdENvdW50OworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgc2lnbiBiaXQuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtTaWduQml0TWFzayA9IHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChrQml0Q291bnQgLSAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGZyYWN0aW9uIGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtGcmFjdGlvbkJpdE1hc2sgPQorICAgIH5zdGF0aWNfY2FzdDxCaXRzPigwKSA+PiAoa0V4cG9uZW50Qml0Q291bnQgKyAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGV4cG9uZW50IGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtFeHBvbmVudEJpdE1hc2sgPSB+KGtTaWduQml0TWFzayB8IGtGcmFjdGlvbkJpdE1hc2spOworCisgIC8vIEhvdyBtYW55IFVMUCdzIChVbml0cyBpbiB0aGUgTGFzdCBQbGFjZSkgd2Ugd2FudCB0byB0b2xlcmF0ZSB3aGVuCisgIC8vIGNvbXBhcmluZyB0d28gbnVtYmVycy4gIFRoZSBsYXJnZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBlcnJvciB3ZQorICAvLyBhbGxvdy4gIEEgMCB2YWx1ZSBtZWFucyB0aGF0IHR3byBudW1iZXJzIG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZQorICAvLyB0byBiZSBjb25zaWRlcmVkIGVxdWFsLgorICAvLworICAvLyBUaGUgbWF4aW11bSBlcnJvciBvZiBhIHNpbmdsZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gaXMgMC41CisgIC8vIHVuaXRzIGluIHRoZSBsYXN0IHBsYWNlLiAgT24gSW50ZWwgQ1BVJ3MsIGFsbCBmbG9hdGluZy1wb2ludAorICAvLyBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgd2l0aCA4MC1iaXQgcHJlY2lzaW9uLCB3aGlsZSBkb3VibGUgaGFzIDY0CisgIC8vIGJpdHMuICBUaGVyZWZvcmUsIDQgc2hvdWxkIGJlIGVub3VnaCBmb3Igb3JkaW5hcnkgdXNlLgorICAvLworICAvLyBTZWUgdGhlIGZvbGxvd2luZyBhcnRpY2xlIGZvciBtb3JlIGRldGFpbHMgb24gVUxQOgorICAvLyBodHRwOi8vcmFuZG9tYXNjaWkud29yZHByZXNzLmNvbS8yMDEyLzAyLzI1L2NvbXBhcmluZy1mbG9hdGluZy1wb2ludC1udW1iZXJzLTIwMTItZWRpdGlvbi8KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VWxwcyA9IDQ7CisKKyAgLy8gQ29uc3RydWN0cyBhIEZsb2F0aW5nUG9pbnQgZnJvbSBhIHJhdyBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIE9uIGFuIEludGVsIENQVSwgcGFzc2luZyBhIG5vbi1ub3JtYWxpemVkIE5BTiAoTm90IGEgTnVtYmVyKQorICAvLyBhcm91bmQgbWF5IGNoYW5nZSBpdHMgYml0cywgYWx0aG91Z2ggdGhlIG5ldyB2YWx1ZSBpcyBndWFyYW50ZWVkCisgIC8vIHRvIGJlIGFsc28gYSBOQU4uICBUaGVyZWZvcmUsIGRvbid0IGV4cGVjdCB0aGlzIGNvbnN0cnVjdG9yIHRvCisgIC8vIHByZXNlcnZlIHRoZSBiaXRzIGluIHggd2hlbiB4IGlzIGEgTkFOLgorICBleHBsaWNpdCBGbG9hdGluZ1BvaW50KGNvbnN0IFJhd1R5cGUmIHgpIHsgdV8udmFsdWVfID0geDsgfQorCisgIC8vIFN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmVpbnRlcnByZXRzIGEgYml0IHBhdHRlcm4gYXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIHRlc3QgdGhlIEFsbW9zdEVxdWFscygpIG1ldGhvZC4KKyAgc3RhdGljIFJhd1R5cGUgUmVpbnRlcnByZXRCaXRzKGNvbnN0IEJpdHMgYml0cykgeworICAgIEZsb2F0aW5nUG9pbnQgZnAoMCk7CisgICAgZnAudV8uYml0c18gPSBiaXRzOworICAgIHJldHVybiBmcC51Xy52YWx1ZV87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdGhhdCByZXByZXNlbnQgcG9zaXRpdmUgaW5maW5pdHkuCisgIHN0YXRpYyBSYXdUeXBlIEluZmluaXR5KCkgeworICAgIHJldHVybiBSZWludGVycHJldEJpdHMoa0V4cG9uZW50Qml0TWFzayk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgc3RhdGljIFJhd1R5cGUgTWF4KCk7CisKKyAgLy8gTm9uLXN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmV0dXJucyB0aGUgYml0cyB0aGF0IHJlcHJlc2VudHMgdGhpcyBudW1iZXIuCisgIGNvbnN0IEJpdHMgJmJpdHMoKSBjb25zdCB7IHJldHVybiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZXhwb25lbnRfYml0cygpIGNvbnN0IHsgcmV0dXJuIGtFeHBvbmVudEJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZnJhY3Rpb25fYml0cygpIGNvbnN0IHsgcmV0dXJuIGtGcmFjdGlvbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoaXMgbnVtYmVyLgorICBCaXRzIHNpZ25fYml0KCkgY29uc3QgeyByZXR1cm4ga1NpZ25CaXRNYXNrICYgdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgTkFOIChub3QgYSBudW1iZXIpLgorICBib29sIGlzX25hbigpIGNvbnN0IHsKKyAgICAvLyBJdCdzIGEgTkFOIGlmIHRoZSBleHBvbmVudCBiaXRzIGFyZSBhbGwgb25lcyBhbmQgdGhlIGZyYWN0aW9uCisgICAgLy8gYml0cyBhcmUgbm90IGVudGlyZWx5IHplcm9zLgorICAgIHJldHVybiAoZXhwb25lbnRfYml0cygpID09IGtFeHBvbmVudEJpdE1hc2spICYmIChmcmFjdGlvbl9iaXRzKCkgIT0gMCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbnVtYmVyIGlzIGF0IG1vc3Qga01heFVscHMgVUxQJ3MgYXdheSBmcm9tCisgIC8vIHJocy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb246CisgIC8vCisgIC8vICAgLSByZXR1cm5zIGZhbHNlIGlmIGVpdGhlciBudW1iZXIgaXMgKG9yIGJvdGggYXJlKSBOQU4uCisgIC8vICAgLSB0cmVhdHMgcmVhbGx5IGxhcmdlIG51bWJlcnMgYXMgYWxtb3N0IGVxdWFsIHRvIGluZmluaXR5LgorICAvLyAgIC0gdGhpbmtzICswLjAgYW5kIC0wLjAgYXJlIDAgRExQJ3MgYXBhcnQuCisgIGJvb2wgQWxtb3N0RXF1YWxzKGNvbnN0IEZsb2F0aW5nUG9pbnQmIHJocykgY29uc3QgeworICAgIC8vIFRoZSBJRUVFIHN0YW5kYXJkIHNheXMgdGhhdCBhbnkgY29tcGFyaXNvbiBvcGVyYXRpb24gaW52b2x2aW5nCisgICAgLy8gYSBOQU4gbXVzdCByZXR1cm4gZmFsc2UuCisgICAgaWYgKGlzX25hbigpIHx8IHJocy5pc19uYW4oKSkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKHVfLmJpdHNfLCByaHMudV8uYml0c18pCisgICAgICAgIDw9IGtNYXhVbHBzOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIHVuaW9uIEZsb2F0aW5nUG9pbnRVbmlvbiB7CisgICAgUmF3VHlwZSB2YWx1ZV87ICAvLyBUaGUgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBCaXRzIGJpdHNfOyAgICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBudW1iZXIuCisgIH07CisKKyAgLy8gQ29udmVydHMgYW4gaW50ZWdlciBmcm9tIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24gdG8KKyAgLy8gdGhlIGJpYXNlZCByZXByZXNlbnRhdGlvbi4gIE1vcmUgcHJlY2lzZWx5LCBsZXQgTiBiZSAyIHRvIHRoZQorICAvLyBwb3dlciBvZiAoa0JpdENvdW50IC0gMSksIGFuIGludGVnZXIgeCBpcyByZXByZXNlbnRlZCBieSB0aGUKKyAgLy8gdW5zaWduZWQgbnVtYmVyIHggKyBOLgorICAvLworICAvLyBGb3IgaW5zdGFuY2UsCisgIC8vCisgIC8vICAgLU4gKyAxICh0aGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZworICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDE7CisgIC8vICAgMCAgICAgIGlzIHJlcHJlc2VudGVkIGJ5IE47IGFuZAorICAvLyAgIE4gLSAxICAodGhlIGJpZ2dlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcKKyAgLy8gICAgICAgICAgc2lnbi1hbmQtbWFnbml0dWRlKSBpcyByZXByZXNlbnRlZCBieSAyTiAtIDEuCisgIC8vCisgIC8vIFJlYWQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduZWRfbnVtYmVyX3JlcHJlc2VudGF0aW9ucworICAvLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNpZ25lZCBudW1iZXIgcmVwcmVzZW50YXRpb25zLgorICBzdGF0aWMgQml0cyBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoY29uc3QgQml0cyAmc2FtKSB7CisgICAgaWYgKGtTaWduQml0TWFzayAmIHNhbSkgeworICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICByZXR1cm4gfnNhbSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHNhbSByZXByZXNlbnRzIGEgcG9zaXRpdmUgbnVtYmVyLgorICAgICAgcmV0dXJuIGtTaWduQml0TWFzayB8IHNhbTsKKyAgICB9CisgIH0KKworICAvLyBHaXZlbiB0d28gbnVtYmVycyBpbiB0aGUgc2lnbi1hbmQtbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uLAorICAvLyByZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gYXMgYW4gdW5zaWduZWQgbnVtYmVyLgorICBzdGF0aWMgQml0cyBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyhjb25zdCBCaXRzICZzYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRzICZzYW0yKSB7CisgICAgY29uc3QgQml0cyBiaWFzZWQxID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTEpOworICAgIGNvbnN0IEJpdHMgYmlhc2VkMiA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0yKTsKKyAgICByZXR1cm4gKGJpYXNlZDEgPj0gYmlhc2VkMikgPyAoYmlhc2VkMSAtIGJpYXNlZDIpIDogKGJpYXNlZDIgLSBiaWFzZWQxKTsKKyAgfQorCisgIEZsb2F0aW5nUG9pbnRVbmlvbiB1XzsKK307CisKKy8vIFdlIGNhbm5vdCB1c2Ugc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgYXMgaXQgY2xhc2hlcyB3aXRoIHRoZSBtYXgoKQorLy8gbWFjcm8gZGVmaW5lZCBieSA8d2luZG93cy5oPi4KK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgRmxvYXRpbmdQb2ludDxmbG9hdD46Ok1heCgpIHsgcmV0dXJuIEZMVF9NQVg7IH0KK3RlbXBsYXRlIDw+CitpbmxpbmUgZG91YmxlIEZsb2F0aW5nUG9pbnQ8ZG91YmxlPjo6TWF4KCkgeyByZXR1cm4gREJMX01BWDsgfQorCisvLyBUeXBlZGVmcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBGbG9hdGluZ1BvaW50IHRlbXBsYXRlIGNsYXNzIHRoYXQgd2UKKy8vIGNhcmUgdG8gdXNlLgordHlwZWRlZiBGbG9hdGluZ1BvaW50PGZsb2F0PiBGbG9hdDsKK3R5cGVkZWYgRmxvYXRpbmdQb2ludDxkb3VibGU+IERvdWJsZTsKKworLy8gSW4gb3JkZXIgdG8gY2F0Y2ggdGhlIG1pc3Rha2Ugb2YgcHV0dGluZyB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQKKy8vIHRlc3QgZml4dHVyZSBjbGFzc2VzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSwgd2UgbmVlZCB0byBhc3NpZ24KKy8vIHVuaXF1ZSBJRHMgdG8gZml4dHVyZSBjbGFzc2VzIGFuZCBjb21wYXJlIHRoZW0uICBUaGUgVHlwZUlkIHR5cGUgaXMKKy8vIHVzZWQgdG8gaG9sZCBzdWNoIElEcy4gIFRoZSB1c2VyIHNob3VsZCB0cmVhdCBUeXBlSWQgYXMgYW4gb3BhcXVlCisvLyB0eXBlOiB0aGUgb25seSBvcGVyYXRpb24gYWxsb3dlZCBvbiBUeXBlSWQgdmFsdWVzIGlzIHRvIGNvbXBhcmUKKy8vIHRoZW0gZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA9PSBvcGVyYXRvci4KK3R5cGVkZWYgY29uc3Qgdm9pZCogVHlwZUlkOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVJZEhlbHBlciB7CisgcHVibGljOgorICAvLyBkdW1teV8gbXVzdCBub3QgaGF2ZSBhIGNvbnN0IHR5cGUuICBPdGhlcndpc2UgYW4gb3Zlcmx5IGVhZ2VyCisgIC8vIGNvbXBpbGVyIChlLmcuIE1TVkMgNy4xICYgOC4wKSBtYXkgdHJ5IHRvIG1lcmdlCisgIC8vIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfIGZvciBkaWZmZXJlbnQgVHMgYXMgYW4gIm9wdGltaXphdGlvbiIuCisgIHN0YXRpYyBib29sIGR1bW15XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyA9IGZhbHNlOworCisvLyBHZXRUeXBlSWQ8VD4oKSByZXR1cm5zIHRoZSBJRCBvZiB0eXBlIFQuICBEaWZmZXJlbnQgdmFsdWVzIHdpbGwgYmUKKy8vIHJldHVybmVkIGZvciBkaWZmZXJlbnQgdHlwZXMuICBDYWxsaW5nIHRoZSBmdW5jdGlvbiB0d2ljZSB3aXRoIHRoZQorLy8gc2FtZSB0eXBlIGFyZ3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIElELgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUeXBlSWQgR2V0VHlwZUlkKCkgeworICAvLyBUaGUgY29tcGlsZXIgaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgYSBkaWZmZXJlbnQKKyAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gdmFyaWFibGUgZm9yIGVhY2ggVCB1c2VkIHRvIGluc3RhbnRpYXRlCisgIC8vIHRoZSB0ZW1wbGF0ZS4gIFRoZXJlZm9yZSwgdGhlIGFkZHJlc3Mgb2YgZHVtbXlfIGlzIGd1YXJhbnRlZWQgdG8KKyAgLy8gYmUgdW5pcXVlLgorICByZXR1cm4gJihUeXBlSWRIZWxwZXI8VD46OmR1bW15Xyk7Cit9CisKKy8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgQWx3YXlzIGNhbGwgdGhpcyBpbnN0ZWFkCisvLyBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKKy8vIDo6dGVzdGluZzo6VGVzdCwgYXMgdGhlIGxhdHRlciBtYXkgZ2l2ZSB0aGUgd3JvbmcgcmVzdWx0IGR1ZSB0byBhCisvLyBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhcyBhIE1hYyBPUyBYCisvLyBmcmFtZXdvcmsuCitHVEVTVF9BUElfIFR5cGVJZCBHZXRUZXN0VHlwZUlkKCk7CisKKy8vIERlZmluZXMgdGhlIGFic3RyYWN0IGZhY3RvcnkgaW50ZXJmYWNlIHRoYXQgY3JlYXRlcyBpbnN0YW5jZXMKKy8vIG9mIGEgVGVzdCBvYmplY3QuCitjbGFzcyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdEZhY3RvcnlCYXNlKCkge30KKworICAvLyBDcmVhdGVzIGEgdGVzdCBpbnN0YW5jZSB0byBydW4uIFRoZSBpbnN0YW5jZSBpcyBib3RoIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZAorICAvLyB3aXRoaW4gVGVzdEluZm9JbXBsOjpSdW4oKQorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIFRlc3RGYWN0b3J5QmFzZSgpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RGYWN0b3J5QmFzZSk7Cit9OworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFRlYXN0RmFjdG9yeUJhc2UgaW50ZXJmYWNlLgorLy8gSXQgaXMgdXNlZCBpbiBURVNUIGFuZCBURVNUX0YgbWFjcm9zLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KK2NsYXNzIFRlc3RGYWN0b3J5SW1wbCA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeyByZXR1cm4gbmV3IFRlc3RDbGFzczsgfQorfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gUHJlZGljYXRlLWZvcm1hdHRlcnMgZm9yIGltcGxlbWVudGluZyB0aGUgSFJFU1VMVCBjaGVja2luZyBtYWNyb3MKKy8vIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfQorLy8gV2UgcGFzcyBhIGxvbmcgaW5zdGVhZCBvZiBIUkVTVUxUIHRvIGF2b2lkIGNhdXNpbmcgYW4KKy8vIGluY2x1ZGUgZGVwZW5kZW5jeSBmb3IgdGhlIEhSRVNVTFQgdHlwZS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFR5cGVzIG9mIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpIGZ1bmN0aW9ucy4KK3R5cGVkZWYgdm9pZCAoKlNldFVwVGVzdENhc2VGdW5jKSgpOwordHlwZWRlZiB2b2lkICgqVGVhckRvd25UZXN0Q2FzZUZ1bmMpKCk7CisKKy8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKKy8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0CisvLyAgIHR5cGVfcGFyYW0gICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICB2YWx1ZV9wYXJhbSAgICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAorLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK0dURVNUX0FQSV8gVGVzdEluZm8qIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKKyAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgVGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7CisKKy8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0CisvLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKKy8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KK0dURVNUX0FQSV8gYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBTdGF0ZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCitjbGFzcyBHVEVTVF9BUElfIFR5cGVkVGVzdENhc2VQU3RhdGUgeworIHB1YmxpYzoKKyAgVHlwZWRUZXN0Q2FzZVBTdGF0ZSgpIDogcmVnaXN0ZXJlZF8oZmFsc2UpIHt9CisKKyAgLy8gQWRkcyB0aGUgZ2l2ZW4gdGVzdCBuYW1lIHRvIGRlZmluZWRfdGVzdF9uYW1lc18gYW5kIHJldHVybiB0cnVlCisgIC8vIGlmIHRoZSB0ZXN0IGNhc2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZDsgb3RoZXJ3aXNlIGFib3J0cyB0aGUKKyAgLy8gcHJvZ3JhbS4KKyAgYm9vbCBBZGRUZXN0TmFtZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZSkgeworICAgIGlmIChyZWdpc3RlcmVkXykgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBUZXN0ICVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgIgorICAgICAgICAgICAgICAiUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoJXMsIC4uLikuXG4iLAorICAgICAgICAgICAgICBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwgdGVzdF9uYW1lLCBjYXNlX25hbWUpOworICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICBwb3NpeDo6QWJvcnQoKTsKKyAgICB9CisgICAgZGVmaW5lZF90ZXN0X25hbWVzXy5pbnNlcnQodGVzdF9uYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgorICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKyAgLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KKyAgY29uc3QgY2hhciogVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsKKworIHByaXZhdGU6CisgIGJvb2wgcmVnaXN0ZXJlZF87CisgIDo6c3RkOjpzZXQ8Y29uc3QgY2hhcio+IGRlZmluZWRfdGVzdF9uYW1lc187Cit9OworCisvLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluICdzdHInOworLy8gcmV0dXJucyBOVUxMIGlmIG5vIGNvbW1hIGlzIGZvdW5kIGluICdzdHInLgoraW5saW5lIGNvbnN0IGNoYXIqIFNraXBDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICBpZiAoY29tbWEgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlIChJc1NwYWNlKCooKytjb21tYSkpKSB7fQorICByZXR1cm4gY29tbWE7Cit9CisKKy8vIFJldHVybnMgdGhlIHByZWZpeCBvZiAnc3RyJyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hIGluIGl0OyByZXR1cm5zCisvLyB0aGUgZW50aXJlIHN0cmluZyBpZiBpdCBjb250YWlucyBubyBjb21tYS4KK2lubGluZSBzdGQ6OnN0cmluZyBHZXRQcmVmaXhVbnRpbENvbW1hKGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihzdHIsICcsJyk7CisgIHJldHVybiBjb21tYSA9PSBOVUxMID8gc3RyIDogc3RkOjpzdHJpbmcoc3RyLCBjb21tYSk7Cit9CisKKy8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlcz46OlJlZ2lzdGVyKCkKKy8vIHJlZ2lzdGVycyBhIGxpc3Qgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QuICBUaGUKKy8vIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcKKy8vIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgorLy8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBHVEVTVF9URU1QTEFURV8gbWFjcm8gZGVjbGFyZXMgYSB0ZW1wbGF0ZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgSXQncyBkZWZpbmVkIGluIGd0ZXN0LXR5cGUtdXRpbC5oLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdCB7CisgcHVibGljOgorICAvLyAnaW5kZXgnIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVzdCBpbiB0aGUgdHlwZSBsaXN0ICdUeXBlcycKKyAgLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgVGVzdENhc2UsCisgIC8vIFR5cGVzKS4gIFZhbGlkIHZhbHVlcyBmb3IgJ2luZGV4JyBhcmUgWzAsIE4gLSAxXSB3aGVyZSBOIGlzIHRoZQorICAvLyBsZW5ndGggb2YgVHlwZXMuCisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWVzLCBpbnQgaW5kZXgpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVzOjpIZWFkIFR5cGU7CisgICAgdHlwZWRlZiBGaXh0dXJlPFR5cGU+IEZpeHR1cmVDbGFzczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEdURVNUX0JJTkRfKFRlc3RTZWwsIFR5cGUpIFRlc3RDbGFzczsKKworICAgIC8vIEZpcnN0LCByZWdpc3RlcnMgdGhlIGZpcnN0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGluIHRoZSB0eXBlCisgICAgLy8gbGlzdC4KKyAgICBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgICAgKHN0ZDo6c3RyaW5nKHByZWZpeCkgKyAocHJlZml4WzBdID09ICdcMCcgPyAiIiA6ICIvIikgKyBjYXNlX25hbWUgKyAiLyIKKyAgICAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKGluZGV4KSkuY19zdHIoKSwKKyAgICAgICAgR2V0UHJlZml4VW50aWxDb21tYSh0ZXN0X25hbWVzKS5jX3N0cigpLAorICAgICAgICBHZXRUeXBlTmFtZTxUeXBlPigpLmNfc3RyKCksCisgICAgICAgIE5VTEwsICAvLyBObyB2YWx1ZSBwYXJhbWV0ZXIuCisgICAgICAgIEdldFR5cGVJZDxGaXh0dXJlQ2xhc3M+KCksCisgICAgICAgIFRlc3RDbGFzczo6U2V0VXBUZXN0Q2FzZSwKKyAgICAgICAgVGVzdENsYXNzOjpUZWFyRG93blRlc3RDYXNlLAorICAgICAgICBuZXcgVGVzdEZhY3RvcnlJbXBsPFRlc3RDbGFzcz4pOworCisgICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdHlwZSBsaXN0LgorICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM6OlRhaWw+CisgICAgICAgIDo6UmVnaXN0ZXIocHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIGluZGV4ICsgMSk7CisgIH0KK307CisKKy8vIFRoZSBiYXNlIGNhc2UgZm9yIHRoZSBjb21waWxlIHRpbWUgcmVjdXJzaW9uLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIFR5cGVzMD4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8sIGludCAvKmluZGV4Ki8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworLy8gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZXN0cywgVHlwZXM+OjpSZWdpc3RlcigpCisvLyByZWdpc3RlcnMgKmFsbCBjb21iaW5hdGlvbnMqIG9mICdUZXN0cycgYW5kICdUeXBlcycgd2l0aCBHb29nbGUKKy8vIFRlc3QuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluc2lnbmlmaWNhbnQgLSB3ZSBqdXN0IG5lZWQgdG8gcmV0dXJuCisvLyBzb21ldGhpbmcgc3VjaCB0aGF0IHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2NvcGUuCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiBjYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZXMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RzOjpIZWFkIEhlYWQ7CisKKyAgICAvLyBGaXJzdCwgcmVnaXN0ZXIgdGhlIGZpcnN0IHRlc3QgaW4gJ1Rlc3QnIGZvciBlYWNoIHR5cGUgaW4gJ1R5cGVzJy4KKyAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgSGVhZCwgVHlwZXM+OjpSZWdpc3RlcigKKyAgICAgICAgcHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIDApOworCisgICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdGVzdCBsaXN0LgorICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzOjpUYWlsLCBUeXBlcz4KKyAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNhc2VfbmFtZSwgU2tpcENvbW1hKHRlc3RfbmFtZXMpKTsKKyAgfQorfTsKKworLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFR5cGVzPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZW1wbGF0ZXMwLCBUeXBlcz4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKC4uLiwgMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4KKy8vIHRoZSB0cmFjZSBidXQgQmFyKCkgYW5kIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgKKyAgICBVbml0VGVzdCogdW5pdF90ZXN0LCBpbnQgc2tpcF9jb3VudCk7CisKKy8vIEhlbHBlcnMgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIHVucmVhY2hhYmxlIGNvZGUgb3IgY29uc3RhbnQKKy8vIGNvbmRpdGlvbi4KKworLy8gQWx3YXlzIHJldHVybnMgdHJ1ZS4KK0dURVNUX0FQSV8gYm9vbCBBbHdheXNUcnVlKCk7CisKKy8vIEFsd2F5cyByZXR1cm5zIGZhbHNlLgoraW5saW5lIGJvb2wgQWx3YXlzRmFsc2UoKSB7IHJldHVybiAhQWx3YXlzVHJ1ZSgpOyB9CisKKy8vIEhlbHBlciBmb3Igc3VwcHJlc3NpbmcgZmFsc2Ugd2FybmluZyBmcm9tIENsYW5nIG9uIGEgY29uc3QgY2hhcioKKy8vIHZhcmlhYmxlIGRlY2xhcmVkIGluIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhbHdheXMgYmVpbmcgTlVMTCBpbgorLy8gdGhlIGVsc2UgYnJhbmNoLgorc3RydWN0IEdURVNUX0FQSV8gQ29uc3RDaGFyUHRyIHsKKyAgQ29uc3RDaGFyUHRyKGNvbnN0IGNoYXIqIHN0cikgOiB2YWx1ZShzdHIpIHt9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGNvbnN0IGNoYXIqIHZhbHVlOworfTsKKworLy8gQSBzaW1wbGUgTGluZWFyIENvbmdydWVudGlhbCBHZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgcmFuZG9tCisvLyBudW1iZXJzIHdpdGggYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbi4gIFVubGlrZSByYW5kKCkgYW5kIHNyYW5kKCksIGl0CisvLyBkb2Vzbid0IHVzZSBnbG9iYWwgc3RhdGUgKGFuZCB0aGVyZWZvcmUgY2FuJ3QgaW50ZXJmZXJlIHdpdGggdXNlcgorLy8gY29kZSkuICBVbmxpa2UgcmFuZF9yKCksIGl0J3MgcG9ydGFibGUuICBBbiBMQ0cgaXNuJ3QgdmVyeSByYW5kb20sCisvLyBidXQgaXQncyBnb29kIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzLgorY2xhc3MgR1RFU1RfQVBJXyBSYW5kb20geworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IFVJbnQzMiBrTWF4UmFuZ2UgPSAxdSA8PCAzMTsKKworICBleHBsaWNpdCBSYW5kb20oVUludDMyIHNlZWQpIDogc3RhdGVfKHNlZWQpIHt9CisKKyAgdm9pZCBSZXNlZWQoVUludDMyIHNlZWQpIHsgc3RhdGVfID0gc2VlZDsgfQorCisgIC8vIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgZnJvbSBbMCwgcmFuZ2UpLiAgQ3Jhc2hlcyBpZiAncmFuZ2UnIGlzCisgIC8vIDAgb3IgZ3JlYXRlciB0aGFuIGtNYXhSYW5nZS4KKyAgVUludDMyIEdlbmVyYXRlKFVJbnQzMiByYW5nZSk7CisKKyBwcml2YXRlOgorICBVSW50MzIgc3RhdGVfOworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJhbmRvbSk7Cit9OworCisvLyBEZWZpbmluZyBhIHZhcmlhYmxlIG9mIHR5cGUgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIFQyPiB3aWxsIGNhdXNlIGEKKy8vIGNvbXBpbGVyIGVycm9yIGlmZiBUMSBhbmQgVDIgYXJlIGRpZmZlcmVudCB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQsIFQ+IHsKK307CisKKy8vIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSBmcm9tIGEgdHlwZSBpZiBpdCBpcyBhIHJlZmVyZW5jZSB0eXBlLAorLy8gb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzCisvLyB0cjE6OnJlbW92ZV9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFJlbW92ZVJlZmVyZW5jZSB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVSZWZlcmVuY2U8VCY+IHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudAorLy8gVCBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpIFwKKyAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVSZWZlcmVuY2U8VD46OnR5cGUKKworLy8gUmVtb3ZlcyBjb25zdCBmcm9tIGEgdHlwZSBpZiBpdCBpcyBhIGNvbnN0IHR5cGUsIG90aGVyd2lzZSBsZWF2ZXMKKy8vIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdHIxOjpyZW1vdmVfY29uc3QsIHdoaWNoIGlzIG5vdAorLy8gd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVDb25zdCB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVDb25zdDxjb25zdCBUPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIE1TVkMgOC4wLCBTdW4gQysrLCBhbmQgSUJNIFhMIEMrKyBoYXZlIGEgYnVnIHdoaWNoIGNhdXNlcyB0aGUgYWJvdmUKKy8vIGRlZmluaXRpb24gdG8gZmFpbCB0byByZW1vdmUgdGhlIGNvbnN0IGluICdjb25zdCBpbnRbM10nIGFuZCAnY29uc3QKKy8vIGNoYXJbM11bNF0nLiAgVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiB3b3JrcyBhcm91bmQgdGhlIGJ1Zy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3N0cnVjdCBSZW1vdmVDb25zdDxjb25zdCBUW05dPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsKK307CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE0MDAKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3BlY2lhbGl6YXRpb24gdGhhdCBhbGxvd3MgVkMrKyA3LjEgdG8gcmVtb3ZlIGNvbnN0IGluCisvLyAnY29uc3QgaW50WzNdIGFuZCAnY29uc3QgaW50WzNdWzRdJy4gIEhvd2V2ZXIsIGl0IGNhdXNlcyB0cm91YmxlIHdpdGggR0NDCisvLyBhbmQgdGh1cyBuZWVkcyB0byBiZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorc3RydWN0IFJlbW92ZUNvbnN0PFRbTl0+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZW1vdmVDb25zdDxUPjo6dHlwZSB0eXBlW05dOworfTsKKyNlbmRpZgorCisvLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIFJlbW92ZUNvbnN0IHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKKy8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfQ09OU1RfKFQpIFwKKyAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVDb25zdDxUPjo6dHlwZQorCisvLyBUdXJucyBjb25zdCBVJiwgVSYsIGNvbnN0IFUsIGFuZCBVIGFsbCBpbnRvIFUuCisjZGVmaW5lIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUKSBcCisgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSkKKworLy8gQWRkcyByZWZlcmVuY2UgdG8gYSB0eXBlIGlmIGl0IGlzIG5vdCBhIHJlZmVyZW5jZSB0eXBlLAorLy8gb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzCisvLyB0cjE6OmFkZF9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZmVyZW5jZSB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIEFkZFJlZmVyZW5jZSB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IFQKKy8vIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfQUREX1JFRkVSRU5DRV8oVCkgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFkZFJlZmVyZW5jZTxUPjo6dHlwZQorCisvLyBBZGRzIGEgcmVmZXJlbmNlIHRvIGNvbnN0IG9uIHRvcCBvZiBUIGFzIG5lY2Vzc2FyeS4gIEZvciBleGFtcGxlLAorLy8gaXQgdHJhbnNmb3JtcworLy8KKy8vICAgY2hhciAgICAgICAgID09PiBjb25zdCBjaGFyJgorLy8gICBjb25zdCBjaGFyICAgPT0+IGNvbnN0IGNoYXImCisvLyAgIGNoYXImICAgICAgICA9PT4gY29uc3QgY2hhciYKKy8vICAgY29uc3QgY2hhciYgID09PiBjb25zdCBjaGFyJgorLy8KKy8vIFRoZSBhcmd1bWVudCBUIG11c3QgZGVwZW5kIG9uIHNvbWUgdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhUKSBcCisgICAgR1RFU1RfQUREX1JFRkVSRU5DRV8oY29uc3QgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCisKKy8vIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxGcm9tLCBUbz46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGJvb2wKKy8vIGNvbnN0YW50IHRoYXQncyB0cnVlIGlmZiB0eXBlIEZyb20gY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCisvLyB0eXBlIFRvLgordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorY2xhc3MgSW1wbGljaXRseUNvbnZlcnRpYmxlIHsKKyBwcml2YXRlOgorICAvLyBXZSBuZWVkIHRoZSBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9ucyBvbmx5IGZvciB0aGVpciB0eXBlcy4KKyAgLy8gVGhleSBoYXZlIG5vIGltcGxlbWVudGF0aW9ucy4KKworICAvLyBNYWtlRnJvbSgpIGlzIGFuIGV4cHJlc3Npb24gd2hvc2UgdHlwZSBpcyBGcm9tLiAgV2UgY2Fubm90IHNpbXBseQorICAvLyB1c2UgRnJvbSgpLCBhcyB0aGUgdHlwZSBGcm9tIG1heSBub3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0CisgIC8vIGNvbnN0cnVjdG9yLgorICBzdGF0aWMgRnJvbSBNYWtlRnJvbSgpOworCisgIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIG92ZXJsb2FkZWQuICBHaXZlbiBhbiBleHByZXNzaW9uCisgIC8vIEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QgdmVyc2lvbiBpZiB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvOyBvdGhlcndpc2UgaXQgd2lsbCBwaWNrIHRoZQorICAvLyBzZWNvbmQgdmVyc2lvbi4KKyAgLy8KKyAgLy8gVGhlIGZpcnN0IHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMSwgYW5kIHRoZSBzZWNvbmQKKyAgLy8gdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAyLiAgVGhlcmVmb3JlLCBieSBjaGVja2luZyB0aGUKKyAgLy8gc2l6ZSBvZiBIZWxwZXIoeCksIHdoaWNoIGNhbiBiZSBkb25lIGF0IGNvbXBpbGUgdGltZSwgd2UgY2FuIHRlbGwKKyAgLy8gd2hpY2ggdmVyc2lvbiBvZiBIZWxwZXIoKSBpcyB1c2VkLCBhbmQgaGVuY2Ugd2hldGhlciB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvLgorICBzdGF0aWMgY2hhciBIZWxwZXIoVG8pOworICBzdGF0aWMgY2hhciAoJkhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAorCisgIC8vIFdlIGhhdmUgdG8gcHV0IHRoZSAncHVibGljJyBzZWN0aW9uIGFmdGVyIHRoZSAncHJpdmF0ZScgc2VjdGlvbiwKKyAgLy8gb3IgTVNWQyByZWZ1c2VzIHRvIGNvbXBpbGUgdGhlIGNvZGUuCisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGltcGxpY2l0bHkgY29udmVydGluZyBmcm9tIGRvdWJsZSB0byBpbnQgZm9yCisgIC8vIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YSwgc28gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZQorICAvLyB3YXJuaW5nLgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDI0NC4KKworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzaXplb2YoSGVscGVyKEltcGxpY2l0bHlDb252ZXJ0aWJsZTo6TWFrZUZyb20oKSkpID09IDE7CisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIC8vIEMrK0J1aWxkZXIgY2Fubm90IHVzZSBtZW1iZXIgb3ZlcmxvYWQgcmVzb2x1dGlvbiBkdXJpbmcgdGVtcGxhdGUKKyAgLy8gaW5zdGFudGlhdGlvbi4gIFRoZSBzaW1wbGVzdCB3b3JrYXJvdW5kIGlzIHRvIHVzZSBpdHMgQysrMHggdHlwZSB0cmFpdHMKKyAgLy8gZnVuY3Rpb25zIChDKytCdWlsZGVyIDIwMDkgYW5kIGFib3ZlIG9ubHkpLgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faXNfY29udmVydGlibGUoRnJvbSwgVG8pOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc2l6ZW9mKEhlbHBlcihJbXBsaWNpdGx5Q29udmVydGlibGU6Ok1ha2VGcm9tKCkpKSA9PSAxOworI2VuZGlmICAvLyBfTVNWX1ZFUgorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK2NvbnN0IGJvb2wgSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWU7CisKKy8vIElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0J3MKKy8vIHRydWUgaWZmIFQgaXMgdHlwZSBQcm90b2NvbE1lc3NhZ2UsIHByb3RvMjo6TWVzc2FnZSwgb3IgYSBzdWJjbGFzcworLy8gb2YgdGhvc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJc0FQcm90b2NvbE1lc3NhZ2UKKyAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PAorICBJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCosIGNvbnN0IDo6UHJvdG9jb2xNZXNzYWdlKj46OnZhbHVlIHx8CisgIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpwcm90bzI6Ok1lc3NhZ2UqPjo6dmFsdWU+IHsKK307CisKKy8vIFdoZW4gdGhlIGNvbXBpbGVyIHNlZXMgZXhwcmVzc2lvbiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCksIGlmIEMgaXMgYW4KKy8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QKKy8vIHdpbGwgYmUgdmlhYmxlIChzaW5jZSBib3RoIEM6Oml0ZXJhdG9yKiBhbmQgQzo6Y29uc3RfaXRlcmF0b3IqIGFyZQorLy8gdmFsaWQgdHlwZXMgYW5kIE5VTEwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHRoZW0pLiAgSXQgd2lsbAorLy8gYmUgcGlja2VkIG92ZXIgdGhlIHNlY29uZCBvdmVybG9hZCBhcyAnaW50JyBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yCisvLyB0aGUgdHlwZSBvZiBhcmd1bWVudCAwLiAgSWYgQzo6aXRlcmF0b3Igb3IgQzo6Y29uc3RfaXRlcmF0b3IgaXMgbm90CisvLyBhIHZhbGlkIHR5cGUsIHRoZSBmaXJzdCBvdmVybG9hZCBpcyBub3QgdmlhYmxlLCBhbmQgdGhlIHNlY29uZAorLy8gb3ZlcmxvYWQgd2lsbCBiZSBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciBDIGlzCisvLyBhIGNvbnRhaW5lciBjbGFzcyBieSBjaGVja2luZyB0aGUgdHlwZSBvZiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCkuCisvLyBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgaW5zaWduaWZpY2FudC4KKy8vCisvLyBOb3RlIHRoYXQgd2UgbG9vayBmb3IgYm90aCBDOjppdGVyYXRvciBhbmQgQzo6Y29uc3RfaXRlcmF0b3IuICBUaGUKKy8vIHJlYXNvbiBpcyB0aGF0IEMrKyBpbmplY3RzIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgYSBtZW1iZXIgb2YgdGhlCisvLyBjbGFzcyBpdHNlbGYgKGUuZy4geW91IGNhbiByZWZlciB0byBjbGFzcyBpdGVyYXRvciBhcyBlaXRoZXIKKy8vICdpdGVyYXRvcicgb3IgJ2l0ZXJhdG9yOjppdGVyYXRvcicpLiAgSWYgd2UgbG9vayBmb3IgQzo6aXRlcmF0b3IKKy8vIG9ubHksIGZvciBleGFtcGxlLCB3ZSB3b3VsZCBtaXN0YWtlbmx5IHRoaW5rIHRoYXQgYSBjbGFzcyBuYW1lZAorLy8gaXRlcmF0b3IgaXMgYW4gU1RMIGNvbnRhaW5lci4KKy8vCisvLyBBbHNvIG5vdGUgdGhhdCB0aGUgc2ltcGxlciBhcHByb2FjaCBvZiBvdmVybG9hZGluZworLy8gSXNDb250YWluZXJUZXN0KHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKikgYW5kCisvLyBJc0NvbnRhaW5lclRlc3QoLi4uKSBkb2Vzbid0IHdvcmsgd2l0aCBWaXN1YWwgQWdlIEMrKyBhbmQgU3VuIEMrKy4KK3R5cGVkZWYgaW50IElzQ29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc0NvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QoaW50IC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yKiAvKiBpdCAqLyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqIC8qIGNvbnN0X2l0ICovID0gTlVMTCkgeworICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBjaGFyIElzTm90Q29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc05vdENvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gJ1wwJzsgfQorCisvLyBFbmFibGVJZjxjb25kaXRpb24+Ojp0eXBlIGlzIHZvaWQgd2hlbiAnQ29uZCcgaXMgdHJ1ZSwgYW5kCisvLyB1bmRlZmluZWQgd2hlbiAnQ29uZCcgaXMgZmFsc2UuICBUbyB1c2UgU0ZJTkFFIHRvIG1ha2UgYSBmdW5jdGlvbgorLy8gb3ZlcmxvYWQgb25seSBhcHBseSB3aGVuIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUsIGFkZAorLy8gInR5cGVuYW1lIEVuYWJsZUlmPGV4cHJlc3Npb24+Ojp0eXBlKiA9IDAiIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KK3RlbXBsYXRlPGJvb2w+IHN0cnVjdCBFbmFibGVJZjsKK3RlbXBsYXRlPD4gc3RydWN0IEVuYWJsZUlmPHRydWU+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gVXRpbGl0aWVzIGZvciBuYXRpdmUgYXJyYXlzLgorCisvLyBBcnJheUVxKCkgY29tcGFyZXMgdHdvIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5cyB1c2luZyB0aGUKKy8vIGVsZW1lbnRzJyBvcGVyYXRvcj09LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzCisvLyAwLCBBcnJheUVxKCkgZGVnZW5lcmF0ZXMgaW50byBjb21wYXJpbmcgYSBzaW5nbGUgcGFpciBvZiB2YWx1ZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBBcnJheUVxKGNvbnN0IFQqIGxocywgc2l6ZV90IHNpemUsIGNvbnN0IFUqIHJocyk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSBib29sIEFycmF5RXEoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIHsgcmV0dXJuIGxocyA9PSByaHM7IH0KKworLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgoraW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUKCZsaHMpW05dLCBjb25zdCBVKCZyaHMpW05dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QXJyYXlFcShsaHMsIE4sIHJocyk7Cit9CisKKy8vIFRoaXMgaGVscGVyIHJlZHVjZXMgY29kZSBibG9hdC4gIElmIHdlIGluc3RlYWQgcHV0IGl0cyBsb2dpYyBpbnNpZGUKKy8vIHRoZSBwcmV2aW91cyBBcnJheUVxKCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcyB3b3VsZAorLy8gbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGlmICghaW50ZXJuYWw6OkFycmF5RXEobGhzW2ldLCByaHNbaV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpIHRoYXQKKy8vIGVxdWFscyBlbGVtLiAgRWxlbWVudCBtYXkgYmUgYSBuYXRpdmUgYXJyYXkgdHlwZSBpdHNlbGYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgRWxlbWVudD4KK0l0ZXIgQXJyYXlBd2FyZUZpbmQoSXRlciBiZWdpbiwgSXRlciBlbmQsIGNvbnN0IEVsZW1lbnQmIGVsZW0pIHsKKyAgZm9yIChJdGVyIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpbnRlcm5hbDo6QXJyYXlFcSgqaXQsIGVsZW0pKQorICAgICAgcmV0dXJuIGl0OworICB9CisgIHJldHVybiBlbmQ7Cit9CisKKy8vIENvcHlBcnJheSgpIGNvcGllcyBhIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5IHVzaW5nIHRoZSBlbGVtZW50cycKKy8vIG9wZXJhdG9yPSwgd2hlcmUgayBjYW4gYmUgYW55IGludGVnZXIgPj0gMC4gIFdoZW4gayBpcyAwLAorLy8gQ29weUFycmF5KCkgZGVnZW5lcmF0ZXMgaW50byBjb3B5aW5nIGEgc2luZ2xlIHZhbHVlLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3ZvaWQgQ29weUFycmF5KGNvbnN0IFQqIGZyb20sIHNpemVfdCBzaXplLCBVKiB0byk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUJiBmcm9tLCBVKiB0bykgeyAqdG8gPSBmcm9tOyB9CisKKy8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUKCZmcm9tKVtOXSwgVSgqdG8pW05dKSB7CisgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbSwgTiwgKnRvKTsKK30KKworLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQorLy8gdGhlIHByZXZpb3VzIENvcHlBcnJheSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMKKy8vIHdvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgdGVtcGxhdGUgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgordm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbVtpXSwgdG8gKyBpKTsKKyAgfQorfQorCisvLyBUaGUgcmVsYXRpb24gYmV0d2VlbiBhbiBOYXRpdmVBcnJheSBvYmplY3QgKHNlZSBiZWxvdykgYW5kIHRoZQorLy8gbmF0aXZlIGFycmF5IGl0IHJlcHJlc2VudHMuCitlbnVtIFJlbGF0aW9uVG9Tb3VyY2UgeworICBrUmVmZXJlbmNlLCAgLy8gVGhlIE5hdGl2ZUFycmF5IHJlZmVyZW5jZXMgdGhlIG5hdGl2ZSBhcnJheS4KKyAga0NvcHkgICAgICAgIC8vIFRoZSBOYXRpdmVBcnJheSBtYWtlcyBhIGNvcHkgb2YgdGhlIG5hdGl2ZSBhcnJheSBhbmQKKyAgICAgICAgICAgICAgIC8vIG93bnMgdGhlIGNvcHkuCit9OworCisvLyBBZGFwdHMgYSBuYXRpdmUgYXJyYXkgdG8gYSByZWFkLW9ubHkgU1RMLXN0eWxlIGNvbnRhaW5lci4gIEluc3RlYWQKKy8vIG9mIHRoZSBjb21wbGV0ZSBTVEwgY29udGFpbmVyIGNvbmNlcHQsIHRoaXMgYWRhcHRvciBvbmx5IGltcGxlbWVudHMKKy8vIG1lbWJlcnMgdXNlZnVsIGZvciBHb29nbGUgTW9jaydzIGNvbnRhaW5lciBtYXRjaGVycy4gIE5ldyBtZW1iZXJzCisvLyBzaG91bGQgYmUgYWRkZWQgYXMgbmVlZGVkLiAgVG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBvbmx5CisvLyBzdXBwb3J0IEVsZW1lbnQgYmVpbmcgYSByYXcgdHlwZSAoaS5lLiBoYXZpbmcgbm8gdG9wLWxldmVsIGNvbnN0IG9yCisvLyByZWZlcmVuY2UgbW9kaWZpZXIpLiAgSXQncyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gc2F0aXNmeQorLy8gdGhpcyByZXF1aXJlbWVudC4gIEVsZW1lbnQgY2FuIGJlIGFuIGFycmF5IHR5cGUgaXRzZWxmIChoZW5jZQorLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBzdXBwb3J0ZWQpLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBOYXRpdmVBcnJheSB7CisgcHVibGljOgorICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIHR5cGVkZWZzLgorICB0eXBlZGVmIEVsZW1lbnQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKKworICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBuYXRpdmUgYXJyYXkuCisgIE5hdGl2ZUFycmF5KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgY291bnQsIFJlbGF0aW9uVG9Tb3VyY2UgcmVsYXRpb24pIHsKKyAgICBJbml0KGFycmF5LCBjb3VudCwgcmVsYXRpb24pOworICB9CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgTmF0aXZlQXJyYXkoY29uc3QgTmF0aXZlQXJyYXkmIHJocykgeworICAgIEluaXQocmhzLmFycmF5XywgcmhzLnNpemVfLCByaHMucmVsYXRpb25fdG9fc291cmNlXyk7CisgIH0KKworICB+TmF0aXZlQXJyYXkoKSB7CisgICAgLy8gRW5zdXJlcyB0aGF0IHRoZSB1c2VyIGRvZXNuJ3QgaW5zdGFudGlhdGUgTmF0aXZlQXJyYXkgd2l0aCBhCisgICAgLy8gY29uc3Qgb3IgcmVmZXJlbmNlIHR5cGUuCisgICAgc3RhdGljX2Nhc3Q8dm9pZD4oU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPEVsZW1lbnQsCisgICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhFbGVtZW50KT4oKSk7CisgICAgaWYgKHJlbGF0aW9uX3RvX3NvdXJjZV8gPT0ga0NvcHkpCisgICAgICBkZWxldGVbXSBhcnJheV87CisgIH0KKworICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIG1ldGhvZHMuCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheV87IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfICsgc2l6ZV87IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZSgpID09IHJocy5zaXplKCkgJiYKKyAgICAgICAgQXJyYXlFcShiZWdpbigpLCBzaXplKCksIHJocy5iZWdpbigpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSW5pdGlhbGl6ZXMgdGhpcyBvYmplY3Q7IG1ha2VzIGEgY29weSBvZiB0aGUgaW5wdXQgYXJyYXkgaWYKKyAgLy8gJ3JlbGF0aW9uJyBpcyBrQ29weS4KKyAgdm9pZCBJbml0KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgYV9zaXplLCBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uKSB7CisgICAgaWYgKHJlbGF0aW9uID09IGtSZWZlcmVuY2UpIHsKKyAgICAgIGFycmF5XyA9IGFycmF5OworICAgIH0gZWxzZSB7CisgICAgICBFbGVtZW50KiBjb25zdCBjb3B5ID0gbmV3IEVsZW1lbnRbYV9zaXplXTsKKyAgICAgIENvcHlBcnJheShhcnJheSwgYV9zaXplLCBjb3B5KTsKKyAgICAgIGFycmF5XyA9IGNvcHk7CisgICAgfQorICAgIHNpemVfID0gYV9zaXplOworICAgIHJlbGF0aW9uX3RvX3NvdXJjZV8gPSByZWxhdGlvbjsKKyAgfQorCisgIGNvbnN0IEVsZW1lbnQqIGFycmF5XzsKKyAgc2l6ZV90IHNpemVfOworICBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uX3RvX3NvdXJjZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhOYXRpdmVBcnJheSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNkZWZpbmUgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgbWVzc2FnZSwgcmVzdWx0X3R5cGUpIFwKKyAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6QXNzZXJ0SGVscGVyKHJlc3VsdF90eXBlLCBmaWxlLCBsaW5lLCBtZXNzYWdlKSBcCisgICAgPSA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorCisjZGVmaW5lIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIHJlc3VsdF90eXBlKSBcCisgIEdURVNUX01FU1NBR0VfQVRfKF9fRklMRV9fLCBfX0xJTkVfXywgbWVzc2FnZSwgcmVzdWx0X3R5cGUpCisKKyNkZWZpbmUgR1RFU1RfRkFUQUxfRkFJTFVSRV8obWVzc2FnZSkgXAorICByZXR1cm4gR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSkKKworI2RlZmluZSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcCisgIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUpCisKKyNkZWZpbmUgR1RFU1RfU1VDQ0VTU18obWVzc2FnZSkgXAorICBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKKworLy8gU3VwcHJlc3NlcyBNU1ZDIHdhcm5pbmdzIDQwNzIgKHVucmVhY2hhYmxlIGNvZGUpIGZvciB0aGUgY29kZSBmb2xsb3dpbmcKKy8vIHN0YXRlbWVudCBpZiBpdCByZXR1cm5zIG9yIHRocm93cyAob3IgZG9lc24ndCByZXR1cm4gb3IgdGhyb3cgaW4gc29tZQorLy8gc2l0dWF0aW9ucykuCisjZGVmaW5lIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KSBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9CisKKyNkZWZpbmUgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29uc3RDaGFyUHRyIGd0ZXN0X21zZyA9ICIiKSB7IFwKKyAgICBib29sIGd0ZXN0X2NhdWdodF9leHBlY3RlZCA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKGV4cGVjdGVkX2V4Y2VwdGlvbiBjb25zdCYpIHsgXAorICAgICAgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ3Rlc3RfbXNnLnZhbHVlID0gXAorICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXAorICAgICAgICAgICNleHBlY3RlZF9leGNlcHRpb24gIi5cbiAgQWN0dWFsOiBpdCB0aHJvd3MgYSBkaWZmZXJlbnQgdHlwZS4iOyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgICAgaWYgKCFndGVzdF9jYXVnaHRfZXhwZWN0ZWQpIHsgXAorICAgICAgZ3Rlc3RfbXNnLnZhbHVlID0gXAorICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXAorICAgICAgICAgICNleHBlY3RlZF9leGNlcHRpb24gIi5cbiAgQWN0dWFsOiBpdCB0aHJvd3Mgbm90aGluZy4iOyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoZ3Rlc3RfbXNnLnZhbHVlKQorCisjZGVmaW5lIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIHRyeSB7IFwKKyAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm90aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uLlxuIiBcCisgICAgICAgICAgICIgIEFjdHVhbDogaXQgdGhyb3dzLiIpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2FueSA9IGZhbHNlOyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBndGVzdF9jYXVnaHRfYW55ID0gdHJ1ZTsgXAorICAgIH0gXAorICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2FueSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdGFueXRocm93XywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuIiBcCisgICAgICAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKQorCisKKy8vIEltcGxlbWVudHMgQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4gZXhwcmVzc2lvbiBjYW4gYmUKKy8vIGVpdGhlciBhIGJvb2xlYW4gZXhwcmVzc2lvbiBvciBhbiBBc3NlcnRpb25SZXN1bHQuIHRleHQgaXMgYSB0ZXh0dWFsCisvLyByZXByZXNlbmF0aW9uIG9mIGV4cHJlc3Npb24gYXMgaXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBFWFBFQ1RfVFJVRS4KKyNkZWZpbmUgR1RFU1RfVEVTVF9CT09MRUFOXyhleHByZXNzaW9uLCB0ZXh0LCBhY3R1YWwsIGV4cGVjdGVkLCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0KGV4cHJlc3Npb24pKSBcCisgICAgOyBcCisgIGVsc2UgXAorICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKFwKKyAgICAgICAgZ3Rlc3RfYXJfLCB0ZXh0LCAjYWN0dWFsLCAjZXhwZWN0ZWQpLmNfc3RyKCkpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIgZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyOyBcCisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgaWYgKGd0ZXN0X2ZhdGFsX2ZhaWx1cmVfY2hlY2tlci5oYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub2ZhdGFsXywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCBnZW5lcmF0ZSBuZXcgZmF0YWwgIiBcCisgICAgICAgICAgICJmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuXG4iIFwKKyAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2VzLiIpCisKKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZ2l2ZW4gdGVzdC4KKyNkZWZpbmUgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKy8vIEhlbHBlciBtYWNybyBmb3IgZGVmaW5pbmcgdGVzdHMuCisjZGVmaW5lIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIHBhcmVudF9jbGFzcywgcGFyZW50X2lkKVwKK2NsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgOiBwdWJsaWMgcGFyZW50X2NsYXNzIHtcCisgcHVibGljOlwKKyAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9XAorIHByaXZhdGU6XAorICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTtcCisgIHN0YXRpYyA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm9fIEdURVNUX0FUVFJJQlVURV9VTlVTRURfO1wKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTtcCit9O1wKK1wKKzo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIDo6dGVzdF9pbmZvXyA9XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKFwKKyAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCAjdGVzdF9uYW1lLCBOVUxMLCBOVUxMLCBcCisgICAgICAgIChwYXJlbnRfaWQpLCBcCisgICAgICAgIHBhcmVudF9jbGFzczo6U2V0VXBUZXN0Q2FzZSwgXAorICAgICAgICBwYXJlbnRfY2xhc3M6OlRlYXJEb3duVGVzdENhc2UsIFwKKyAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RGYWN0b3J5SW1wbDxcCisgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPik7XAordm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzNjJjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8vIENvcHlyaWdodCAyMDAzIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IERhbiBFZ25vciAoZWdub3JAZ29vZ2xlLmNvbSkKKy8vCisvLyBBICJzbWFydCIgcG9pbnRlciB0eXBlIHdpdGggcmVmZXJlbmNlIHRyYWNraW5nLiAgRXZlcnkgcG9pbnRlciB0byBhCisvLyBwYXJ0aWN1bGFyIG9iamVjdCBpcyBrZXB0IG9uIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuICBXaGVuIHRoZSBsYXN0IHBvaW50ZXIKKy8vIHRvIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQgb3IgcmVhc3NpZ25lZCwgdGhlIG9iamVjdCBpcyBkZWxldGVkLgorLy8KKy8vIFVzZWQgcHJvcGVybHksIHRoaXMgZGVsZXRlcyB0aGUgb2JqZWN0IHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGdvZXMgYXdheS4KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIGNhdmVhdHM6CisvLyAtIExpa2UgYWxsIHJlZmVyZW5jZSBjb3VudGluZyBzY2hlbWVzLCBjeWNsZXMgbGVhZCB0byBsZWFrcy4KKy8vIC0gRWFjaCBzbWFydCBwb2ludGVyIGlzIGFjdHVhbGx5IHR3byBwb2ludGVycyAoOCBieXRlcyBpbnN0ZWFkIG9mIDQpLgorLy8gLSBFdmVyeSB0aW1lIGEgcG9pbnRlciBpcyBhc3NpZ25lZCwgdGhlIGVudGlyZSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoYXQKKy8vICAgb2JqZWN0IGlzIHRyYXZlcnNlZC4gIFRoaXMgY2xhc3MgaXMgdGhlcmVmb3JlIE5PVCBTVUlUQUJMRSB3aGVuIHRoZXJlCisvLyAgIHdpbGwgb2Z0ZW4gYmUgbW9yZSB0aGFuIHR3byBvciB0aHJlZSBwb2ludGVycyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0LgorLy8gLSBSZWZlcmVuY2VzIGFyZSBvbmx5IHRyYWNrZWQgYXMgbG9uZyBhcyBsaW5rZWRfcHRyPD4gb2JqZWN0cyBhcmUgY29waWVkLgorLy8gICBJZiBhIGxpbmtlZF9wdHI8PiBpcyBjb252ZXJ0ZWQgdG8gYSByYXcgcG9pbnRlciBhbmQgYmFjaywgQkFEIFRISU5HUworLy8gICB3aWxsIGhhcHBlbiAoZG91YmxlIGRlbGV0aW9uKS4KKy8vCisvLyBBIGdvb2QgdXNlIG9mIHRoaXMgY2xhc3MgaXMgc3RvcmluZyBvYmplY3QgcmVmZXJlbmNlcyBpbiBTVEwgY29udGFpbmVycy4KKy8vIFlvdSBjYW4gc2FmZWx5IHB1dCBsaW5rZWRfcHRyPD4gaW4gYSB2ZWN0b3I8Pi4KKy8vIE90aGVyIHVzZXMgbWF5IG5vdCBiZSBhcyBnb29kLgorLy8KKy8vIE5vdGU6IElmIHlvdSB1c2UgYW4gaW5jb21wbGV0ZSB0eXBlIHdpdGggbGlua2VkX3B0cjw+LCB0aGUgY2xhc3MKKy8vICpjb250YWluaW5nKiBsaW5rZWRfcHRyPD4gbXVzdCBoYXZlIGEgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgKGV2ZW4KKy8vIGlmIHRoZXkgZG8gbm90aGluZyEpLgorLy8KKy8vIEJpbGwgR2liYm9ucyBzdWdnZXN0ZWQgd2UgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCisvLworLy8gVGhyZWFkIFNhZmV0eToKKy8vICAgVW5saWtlIG90aGVyIGxpbmtlZF9wdHIgaW1wbGVtZW50YXRpb25zLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisvLyAgIGEgbGlua2VkX3B0ciBvYmplY3QgaXMgdGhyZWFkLXNhZmUgaW4gdGhlIHNlbnNlIHRoYXQ6CisvLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSBsaW5rZWRfcHRyIG9iamVjdHMgY29uY3VycmVudGx5LAorLy8gICAgIC0gaXQncyBzYWZlIHRvIGNvcHkgKmZyb20qIGEgbGlua2VkX3B0ciBhbmQgcmVhZCBpdHMgdW5kZXJseWluZworLy8gICAgICAgcmF3IHBvaW50ZXIgKGUuZy4gdmlhIGdldCgpKSBjb25jdXJyZW50bHksIGFuZAorLy8gICAgIC0gaXQncyBzYWZlIHRvIHdyaXRlIHRvIHR3byBsaW5rZWRfcHRycyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lCisvLyAgICAgICBzaGFyZWQgb2JqZWN0IGNvbmN1cnJlbnRseS4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZW5hbWUgdGhpcyB0byBzYWZlX2xpbmtlZF9wdHIgdG8gYXZvaWQKKy8vIGNvbmZ1c2lvbiB3aXRoIG5vcm1hbCBsaW5rZWRfcHRyLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcm90ZWN0cyBjb3B5aW5nIG9mIGFsbCBsaW5rZWRfcHRyIG9iamVjdHMuCitHVEVTVF9BUElfIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisvLyBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBhbGwgaW5zdGFuY2VzIG9mIGxpbmtlZF9wdHI8Pi4gIEl0IG5lZWRzIHRvIGJlCisvLyBhIG5vbi10ZW1wbGF0ZSBjbGFzcyBiZWNhdXNlIGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyPD4gY2FuIHJlZmVyIHRvCisvLyB0aGUgc2FtZSBvYmplY3QgKGxpbmtlZF9wdHI8U3VwZXJjbGFzcz4ob2JqKSB2cyBsaW5rZWRfcHRyPFN1YmNsYXNzPihvYmopKS4KKy8vIFNvLCBpdCBuZWVkcyB0byBiZSBwb3NzaWJsZSBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHIgdG8gcGFydGljaXBhdGUKKy8vIGluIHRoZSBzYW1lIGNpcmN1bGFyIGxpbmtlZCBsaXN0LCBzbyB3ZSBuZWVkIGEgc2luZ2xlIGNsYXNzIHR5cGUgaGVyZS4KKy8vCisvLyBETyBOT1QgVVNFIFRISVMgQ0xBU1MgRElSRUNUTFkgWU9VUlNFTEYuICBVc2UgbGlua2VkX3B0cjxUPi4KK2NsYXNzIGxpbmtlZF9wdHJfaW50ZXJuYWwgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgbmV3IGNpcmNsZSB0aGF0IGluY2x1ZGVzIG9ubHkgdGhpcyBpbnN0YW5jZS4KKyAgdm9pZCBqb2luX25ldygpIHsKKyAgICBuZXh0XyA9IHRoaXM7CisgIH0KKworICAvLyBNYW55IGxpbmtlZF9wdHIgb3BlcmF0aW9ucyBtYXkgY2hhbmdlIHAubGlua18gZm9yIHNvbWUgbGlua2VkX3B0cgorICAvLyB2YXJpYWJsZSBwIGluIHRoZSBzYW1lIGNpcmNsZSBhcyB0aGlzIG9iamVjdC4gIFRoZXJlZm9yZSB3ZSBuZWVkCisgIC8vIHRvIHByZXZlbnQgdHdvIHN1Y2ggb3BlcmF0aW9ucyBmcm9tIG9jY3VycmluZyBjb25jdXJyZW50bHkuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciBvYmplY3RzIGNhbiBjb2V4aXN0IGluIGEKKyAgLy8gY2lyY2xlIChlLmcuIGxpbmtlZF9wdHI8QmFzZT4sIGxpbmtlZF9wdHI8RGVyaXZlZDE+LCBhbmQKKyAgLy8gbGlua2VkX3B0cjxEZXJpdmVkMj4pLiAgVGhlcmVmb3JlIHdlIG11c3QgdXNlIGEgc2luZ2xlIG11dGV4IHRvCisgIC8vIHByb3RlY3QgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4gIFRoaXMgY2FuIGNyZWF0ZSBzZXJpb3VzCisgIC8vIGNvbnRlbnRpb24gaW4gcHJvZHVjdGlvbiBjb2RlLCBidXQgaXMgYWNjZXB0YWJsZSBpbiBhIHRlc3RpbmcKKyAgLy8gZnJhbWV3b3JrLgorCisgIC8vIEpvaW4gYW4gZXhpc3RpbmcgY2lyY2xlLgorICB2b2lkIGpvaW4obGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcHRyKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19saW5rZWRfcHRyX211dGV4KSB7CisgICAgTXV0ZXhMb2NrIGxvY2soJmdfbGlua2VkX3B0cl9tdXRleCk7CisKKyAgICBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwID0gcHRyOworICAgIHdoaWxlIChwLT5uZXh0XyAhPSBwdHIpIHAgPSBwLT5uZXh0XzsKKyAgICBwLT5uZXh0XyA9IHRoaXM7CisgICAgbmV4dF8gPSBwdHI7CisgIH0KKworICAvLyBMZWF2ZSB3aGF0ZXZlciBjaXJjbGUgd2UncmUgcGFydCBvZi4gIFJldHVybnMgdHJ1ZSBpZiB3ZSB3ZXJlIHRoZQorICAvLyBsYXN0IG1lbWJlciBvZiB0aGUgY2lyY2xlLiAgT25jZSB0aGlzIGlzIGRvbmUsIHlvdSBjYW4gam9pbigpIGFub3RoZXIuCisgIGJvb2wgZGVwYXJ0KCkKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfbGlua2VkX3B0cl9tdXRleCkgeworICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisgICAgaWYgKG5leHRfID09IHRoaXMpIHJldHVybiB0cnVlOworICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBuZXh0XzsKKyAgICB3aGlsZSAocC0+bmV4dF8gIT0gdGhpcykgcCA9IHAtPm5leHRfOworICAgIHAtPm5leHRfID0gbmV4dF87CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyBwcml2YXRlOgorICBtdXRhYmxlIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIG5leHRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBsaW5rZWRfcHRyIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7CisKKyAgLy8gVGFrZSBvdmVyIG93bmVyc2hpcCBvZiBhIHJhdyBwb2ludGVyLiAgVGhpcyBzaG91bGQgaGFwcGVuIGFzIHNvb24gYXMKKyAgLy8gcG9zc2libGUgYWZ0ZXIgdGhlIG9iamVjdCBpcyBjcmVhdGVkLgorICBleHBsaWNpdCBsaW5rZWRfcHRyKFQqIHB0ciA9IE5VTEwpIHsgY2FwdHVyZShwdHIpOyB9CisgIH5saW5rZWRfcHRyKCkgeyBkZXBhcnQoKTsgfQorCisgIC8vIENvcHkgYW4gZXhpc3RpbmcgbGlua2VkX3B0cjw+LCBhZGRpbmcgb3Vyc2VsdmVzIHRvIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyKGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgeyBjb3B5KCZwdHIpOyB9CisgIGxpbmtlZF9wdHIobGlua2VkX3B0ciBjb25zdCYgcHRyKSB7ICAvLyBOT0xJTlQKKyAgICBhc3NlcnQoJnB0ciAhPSB0aGlzKTsKKyAgICBjb3B5KCZwdHIpOworICB9CisKKyAgLy8gQXNzaWdubWVudCByZWxlYXNlcyB0aGUgb2xkIHZhbHVlIGFuZCBhY3F1aXJlcyB0aGUgbmV3LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gbGlua2VkX3B0ciYgb3BlcmF0b3I9KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgeworICAgIGRlcGFydCgpOworICAgIGNvcHkoJnB0cik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgbGlua2VkX3B0ciYgb3BlcmF0b3I9KGxpbmtlZF9wdHIgY29uc3QmIHB0cikgeworICAgIGlmICgmcHRyICE9IHRoaXMpIHsKKyAgICAgIGRlcGFydCgpOworICAgICAgY29weSgmcHRyKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gU21hcnQgcG9pbnRlciBtZW1iZXJzLgorICB2b2lkIHJlc2V0KFQqIHB0ciA9IE5VTEwpIHsKKyAgICBkZXBhcnQoKTsKKyAgICBjYXB0dXJlKHB0cik7CisgIH0KKyAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnZhbHVlXzsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gPT0gcDsgfQorICBib29sIG9wZXJhdG9yIT0oVCogcCkgY29uc3QgeyByZXR1cm4gdmFsdWVfICE9IHA7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGJvb2wgb3BlcmF0b3I9PShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfID09IHB0ci5nZXQoKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvciE9KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gIT0gcHRyLmdldCgpOworICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgZnJpZW5kIGNsYXNzIGxpbmtlZF9wdHI7CisKKyAgVCogdmFsdWVfOworICBsaW5rZWRfcHRyX2ludGVybmFsIGxpbmtfOworCisgIHZvaWQgZGVwYXJ0KCkgeworICAgIGlmIChsaW5rXy5kZXBhcnQoKSkgZGVsZXRlIHZhbHVlXzsKKyAgfQorCisgIHZvaWQgY2FwdHVyZShUKiBwdHIpIHsKKyAgICB2YWx1ZV8gPSBwdHI7CisgICAgbGlua18uam9pbl9uZXcoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiB2b2lkIGNvcHkobGlua2VkX3B0cjxVPiBjb25zdCogcHRyKSB7CisgICAgdmFsdWVfID0gcHRyLT5nZXQoKTsKKyAgICBpZiAodmFsdWVfKQorICAgICAgbGlua18uam9pbigmcHRyLT5saW5rXyk7CisgICAgZWxzZQorICAgICAgbGlua18uam9pbl9uZXcoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lCitib29sIG9wZXJhdG9yPT0oVCogcHRyLCBjb25zdCBsaW5rZWRfcHRyPFQ+JiB4KSB7CisgIHJldHVybiBwdHIgPT0geC5nZXQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lCitib29sIG9wZXJhdG9yIT0oVCogcHRyLCBjb25zdCBsaW5rZWRfcHRyPFQ+JiB4KSB7CisgIHJldHVybiBwdHIgIT0geC5nZXQoKTsKK30KKworLy8gQSBmdW5jdGlvbiB0byBjb252ZXJ0IFQqIGludG8gbGlua2VkX3B0cjxUPgorLy8gRG9pbmcgZS5nLiBtYWtlX2xpbmtlZF9wdHIobmV3IEZvb0JhckJhejx0eXBlPihhcmcpKSBpcyBhIHNob3J0ZXIgbm90YXRpb24KKy8vIGZvciBsaW5rZWRfcHRyPEZvb0JhckJhejx0eXBlPiA+KG5ldyBGb29CYXJCYXo8dHlwZT4oYXJnKSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorbGlua2VkX3B0cjxUPiBtYWtlX2xpbmtlZF9wdHIoVCogcHRyKSB7CisgIHJldHVybiBsaW5rZWRfcHRyPFQ+KHB0cik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwNTQ4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oCkBAIC0wLDAgKzEsNTE0MyBAQAorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBDdXJyZW50bHkgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgYXQgbW9zdCA1MCBhcmd1bWVudHMgaW4gVmFsdWVzLAorLy8gYW5kIGF0IG1vc3QgMTAgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0CisvLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4KKy8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gQ29tYmluZSBpcyBsaW1pdGVkCisvLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHIxOjp0dXBsZSB3aGljaCBpcworLy8gY3VycmVudGx5IHNldCBhdCAxMC4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBWYWx1ZXNJbigpLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBpbgorLy8gaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmguCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgorVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pOworCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVc2VkIGluIHRoZSBWYWx1ZXMoKSBmdW5jdGlvbiB0byBwcm92aWRlIHBvbHltb3JwaGljIGNhcGFiaWxpdGllcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2NsYXNzIFZhbHVlQXJyYXkxIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlQXJyYXkxKFQxIHYxKSA6IHYxXyh2MSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7IHJldHVybiBWYWx1ZXNJbigmdjFfLCAmdjFfICsgMSk7IH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorY2xhc3MgVmFsdWVBcnJheTIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIoVDEgdjEsIFQyIHYyKSA6IHYxXyh2MSksIHYyXyh2Mikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorY2xhc3MgVmFsdWVBcnJheTMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMoVDEgdjEsIFQyIHYyLCBUMyB2MykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2NsYXNzIFZhbHVlQXJyYXk0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2NsYXNzIFZhbHVlQXJyYXk1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK2NsYXNzIFZhbHVlQXJyYXk2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2Nikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitjbGFzcyBWYWx1ZUFycmF5NyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2NsYXNzIFZhbHVlQXJyYXk4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgICAgVDggdjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitjbGFzcyBWYWx1ZUFycmF5OSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5OShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCisgICAgICBUOSB2OSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5OSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitjbGFzcyBWYWx1ZUFycmF5MTAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK2NsYXNzIFZhbHVlQXJyYXkxMSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTExJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgorY2xhc3MgVmFsdWVBcnJheTEyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitjbGFzcyBWYWx1ZUFycmF5MTMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitjbGFzcyBWYWx1ZUFycmF5MTQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitjbGFzcyBWYWx1ZUFycmF5MTUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK2NsYXNzIFZhbHVlQXJyYXkxNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK2NsYXNzIFZhbHVlQXJyYXkxNyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCisgICAgICBUMTcgdjE3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KK2NsYXNzIFZhbHVlQXJyYXkxOCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK2NsYXNzIFZhbHVlQXJyYXkxOSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCisgICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK2NsYXNzIFZhbHVlQXJyYXkyMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK2NsYXNzIFZhbHVlQXJyYXkyMSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK2NsYXNzIFZhbHVlQXJyYXkyMiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK2NsYXNzIFZhbHVlQXJyYXkyMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitjbGFzcyBWYWx1ZUFycmF5MjQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1PgorY2xhc3MgVmFsdWVBcnJheTI1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCisgICAgICBUMjUgdjI1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2PgorY2xhc3MgVmFsdWVBcnJheTI2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3PgorY2xhc3MgVmFsdWVBcnJheTI3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCisgICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAorICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKKyAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK2NsYXNzIFZhbHVlQXJyYXkyOCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAorICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitjbGFzcyBWYWx1ZUFycmF5MjkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCisgICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgorY2xhc3MgVmFsdWVBcnJheTMwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK2NsYXNzIFZhbHVlQXJyYXkzMSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitjbGFzcyBWYWx1ZUFycmF5MzIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKKyAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCisgICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgorY2xhc3MgVmFsdWVBcnJheTMzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLAorICAgICAgVDMzIHYzMykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitjbGFzcyBWYWx1ZUFycmF5MzQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK2NsYXNzIFZhbHVlQXJyYXkzNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwKKyAgICAgIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitjbGFzcyBWYWx1ZUFycmF5MzYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLAorICAgICAgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3PgorY2xhc3MgVmFsdWVBcnJheTM3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAorICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKKyAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksCisgICAgICB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLAorICAgICAgdjM2Xyh2MzYpLCB2MzdfKHYzNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+CitjbGFzcyBWYWx1ZUFycmF5MzggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KK2NsYXNzIFZhbHVlQXJyYXkzOSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgorY2xhc3MgVmFsdWVBcnJheTQwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksCisgICAgICB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLAorICAgICAgdjQwXyh2NDApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitjbGFzcyBWYWx1ZUFycmF5NDEgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAorICAgICAgVDQxIHY0MSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAorICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK2NsYXNzIFZhbHVlQXJyYXk0MiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0Mikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgorY2xhc3MgVmFsdWVBcnJheTQzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwKKyAgICAgIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksCisgICAgICB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitjbGFzcyBWYWx1ZUFycmF5NDQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAorICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwKKyAgICAgIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksCisgICAgICB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLAorICAgICAgdjQzXyh2NDMpLCB2NDRfKHY0NCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+CitjbGFzcyBWYWx1ZUFycmF5NDUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAorICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKKyAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksCisgICAgICB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLAorICAgICAgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwKKyAgICAgIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0Nj4KK2NsYXNzIFZhbHVlQXJyYXk0NiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwKKyAgICAgIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLCB2NDZfKHY0Nikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgorY2xhc3MgVmFsdWVBcnJheTQ3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAorICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSwKKyAgICAgIHY0N18odjQ3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4PgorY2xhc3MgVmFsdWVBcnJheTQ4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0OChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKKyAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCisgICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLAorICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwKKyAgICAgIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksCisgICAgICB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0OF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0OCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKKyAgY29uc3QgVDQ4IHY0OF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5PgorY2xhc3MgVmFsdWVBcnJheTQ5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0OShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsCisgICAgICBUNDkgdjQ5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLAorICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4XyksIHN0YXRpY19jYXN0PFQ+KHY0OV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0OSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKKyAgY29uc3QgVDQ4IHY0OF87CisgIGNvbnN0IFQ0OSB2NDlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgorY2xhc3MgVmFsdWVBcnJheTUwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk1MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDksCisgICAgICBUNTAgdjUwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLAorICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSksIHY1MF8odjUwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKSwgc3RhdGljX2Nhc3Q8VD4odjQ5XyksIHN0YXRpY19jYXN0PFQ+KHY1MF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk1MCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKKyAgY29uc3QgVDQ4IHY0OF87CisgIGNvbnN0IFQ0OSB2NDlfOworICBjb25zdCBUNTAgdjUwXzsKK307CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB2YWx1ZXMgcHJvZHVjZWQKKy8vIGJ5IHRoZSBhcmd1bWVudCBnZW5lcmF0b3JzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDJfOworICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyJiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMygpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MykgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50M187CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1CisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDVfOworICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjU6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LAorICAgICAgICBUNj4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNworICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNz4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNygpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAorICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKKyAgICAgICAgVDcsIFQ4PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCisgICAgICAgICAgZzhfKGc4KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCisgICAgICAgIGc4Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDhfOworICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjg6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKKyAgICAgICAgVDcsIFQ4LCBUOT4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOShjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAorICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ5XzsKKyAgICAgIGlmIChjdXJyZW50OV8gPT0gZW5kOV8pIHsKKyAgICAgICAgY3VycmVudDlfID0gYmVnaW45XzsKKyAgICAgICAgKytjdXJyZW50OF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7CisgICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87CisgICAgICAgICsrY3VycmVudDdfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKKyAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4XyAmJgorICAgICAgICAgIGN1cnJlbnQ5XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDlfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKKyAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKKyAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAorICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKKyAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKKyAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAorICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKKyAgICAgICAgICAgICpjdXJyZW50OV8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKKyAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+IGc5XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5LCBUMTA+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+JiBnMTApCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSwgZzlfLCBnOV8uYmVnaW4oKSwgZzEwXywgZzEwXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSwgZzEwXywgZzEwXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yJiBjdXJyZW50MTApCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLAorICAgICAgICAgIGJlZ2luOF8oZzguYmVnaW4oKSksIGVuZDhfKGc4LmVuZCgpKSwgY3VycmVudDhfKGN1cnJlbnQ4KSwKKyAgICAgICAgICBiZWdpbjlfKGc5LmJlZ2luKCkpLCBlbmQ5XyhnOS5lbmQoKSksIGN1cnJlbnQ5XyhjdXJyZW50OSksCisgICAgICAgICAgYmVnaW4xMF8oZzEwLmJlZ2luKCkpLCBlbmQxMF8oZzEwLmVuZCgpKSwgY3VycmVudDEwXyhjdXJyZW50MTApICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDEwXzsKKyAgICAgIGlmIChjdXJyZW50MTBfID09IGVuZDEwXykgeworICAgICAgICBjdXJyZW50MTBfID0gYmVnaW4xMF87CisgICAgICAgICsrY3VycmVudDlfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgeworICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOworICAgICAgICArK2N1cnJlbnQ4XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKKyAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKKyAgICAgICAgKytjdXJyZW50N187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7CisgICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187CisgICAgICAgICsrY3VycmVudDZfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKKyAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgorICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCisgICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8gJiYKKyAgICAgICAgICBjdXJyZW50MTBfID09IHR5cGVkX290aGVyLT5jdXJyZW50MTBfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKKyAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKKyAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAorICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKKyAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKKyAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAorICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSwKKyAgICAgICAgYmVnaW4xMF8ob3RoZXIuYmVnaW4xMF8pLAorICAgICAgICBlbmQxMF8ob3RoZXIuZW5kMTBfKSwKKyAgICAgICAgY3VycmVudDEwXyhvdGhlci5jdXJyZW50MTBfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKKyAgICAgICAgICAgICpjdXJyZW50OV8sICpjdXJyZW50MTBfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfIHx8CisgICAgICAgICAgY3VycmVudDlfID09IGVuZDlfIHx8CisgICAgICAgICAgY3VycmVudDEwXyA9PSBlbmQxMF87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBiZWdpbjEwXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBlbmQxMF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3IgY3VycmVudDEwXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+IGcxMF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCisKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cKKy8vIGNhc3RpbmcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvck48VD4gdG8gUGFyYW1HZW5lcmF0b3I8VT4gaWYgVCBpcworLy8gY29udmVydGlibGUgdG8gVS4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMikge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyPFQxLCBUMj4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMiYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMgorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzPFQxLCBUMiwgVDM+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzCisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQ+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ8VDEsIFQyLCBUMywgVDQ+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNAorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI1KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTxUMSwgVDIsIFQzLCBUNCwgVDU+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDY+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjc+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgVDc+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI3JiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKKyAgY29uc3QgR2VuZXJhdG9yNCBnNF87CisgIGNvbnN0IEdlbmVyYXRvcjUgZzVfOworICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKKyAgY29uc3QgR2VuZXJhdG9yNyBnN187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjggeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI4KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCisgICAgICAgICAgZzhfKGc4KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LAorICAgICAgVDg+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI5KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsCisgICAgY29uc3QgR2VuZXJhdG9yOSYgZzkpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICBUOT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgICAgVDk+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDg+ID4oZzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDk+ID4oZzlfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI5JiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKKyAgY29uc3QgR2VuZXJhdG9yNCBnNF87CisgIGNvbnN0IEdlbmVyYXRvcjUgZzVfOworICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKKyAgY29uc3QgR2VuZXJhdG9yNyBnN187CisgIGNvbnN0IEdlbmVyYXRvcjggZzhfOworICBjb25zdCBHZW5lcmF0b3I5IGc5XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOQorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjksIGNsYXNzIEdlbmVyYXRvcjEwPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKKyAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSwgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICBUOSwgVDEwPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAorICAgICAgICBUOSwgVDEwPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksCisgICAgICAgICAgICBUMTA+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMTA+ID4oZzEwXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87CisgIGNvbnN0IEdlbmVyYXRvcjkgZzlfOworICBjb25zdCBHZW5lcmF0b3IxMCBnMTBfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMAorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKQEAgLTAsMCArMSwzMDEgQEAKKyQkIC0qLSBtb2RlOiBjKys7IC0qLQorJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIFZhbHVlcyBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgorJHZhciBtYXh0dXBsZSA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiBDb21iaW5lIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBDdXJyZW50bHkgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgYXQgbW9zdCAkbiBhcmd1bWVudHMgaW4gVmFsdWVzLAorLy8gYW5kIGF0IG1vc3QgJG1heHR1cGxlIGFyZ3VtZW50cyBpbiBDb21iaW5lLiBQbGVhc2UgY29udGFjdAorLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkIG1vcmUuCisvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIENvbWJpbmUgaXMgbGltaXRlZAorLy8gYnkgdGhlIG1heGltdW0gYXJpdHkgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRyMTo6dHVwbGUgd2hpY2ggaXMKKy8vIGN1cnJlbnRseSBzZXQgYXQgJG1heHR1cGxlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIFZhbHVlc0luKCksIHdoaWNoIGlzIGltcGxlbWVudGVkIGluCisvLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSk7CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVzZWQgaW4gdGhlIFZhbHVlcygpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgcG9seW1vcnBoaWMgY2FwYWJpbGl0aWVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorY2xhc3MgVmFsdWVBcnJheTEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVmFsdWVBcnJheTEoVDEgdjEpIDogdjFfKHYxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlc0luKCZ2MV8sICZ2MV8gKyAxKTsgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKK307CisKKyRyYW5nZSBpIDIuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgorY2xhc3MgVmFsdWVBcnJheSRpIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkkaSgkZm9yIGosIFtbVCRqIHYkal1dKSA6ICRmb3IgaiwgW1t2JChqKV8odiRqKV1dIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHskZm9yIGosIFtbc3RhdGljX2Nhc3Q8VD4odiQoailfKV1dfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkkaSYgb3RoZXIpOworCiskZm9yIGogW1sKKworICBjb25zdCBUJGogdiQoailfOworXV0KKworfTsKKworXV0KKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHZhbHVlcyBwcm9kdWNlZAorLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuCisvLworJHJhbmdlIGkgMi4ubWF4dHVwbGUKKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHJhbmdlIGsgMi4uaQorCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaSgkZm9yIGosIFtbY29uc3QgUGFyYW1HZW5lcmF0b3I8VCRqPiYgZyRqXV0pCisgICAgICA6ICRmb3IgaiwgW1tnJChqKV8oZyRqKV1dIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaSgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgJGZvciBqLCBbW2ckKGopXywgZyQoailfLmJlZ2luKCldXSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsICRmb3IgaiwgW1tnJChqKV8sIGckKGopXy5lbmQoKV1dKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLCAkZm9yIGosIFtbCisKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQkaj4mIGckaiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yJiBjdXJyZW50JChqKV1dKQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorJGZvciBqLCBbWworCisgICAgICAgICAgYmVnaW4kKGopXyhnJGouYmVnaW4oKSksIGVuZCQoailfKGckai5lbmQoKSksIGN1cnJlbnQkKGopXyhjdXJyZW50JGopCitdXSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQkKGkpXzsKKworJGZvciBrIFtbCisgICAgICBpZiAoY3VycmVudCQoaSsyLWspXyA9PSBlbmQkKGkrMi1rKV8pIHsKKyAgICAgICAgY3VycmVudCQoaSsyLWspXyA9IGJlZ2luJChpKzItaylfOworICAgICAgICArK2N1cnJlbnQkKGkrMi1rLTEpXzsKKyAgICAgIH0KKworXV0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKCRmb3IgaiAgJiYgW1sKKworICAgICAgICAgIGN1cnJlbnQkKGopXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudCQoailfCitdXSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksICRmb3IgaiwgW1sKKworICAgICAgICBiZWdpbiQoailfKG90aGVyLmJlZ2luJChqKV8pLAorICAgICAgICBlbmQkKGopXyhvdGhlci5lbmQkKGopXyksCisgICAgICAgIGN1cnJlbnQkKGopXyhvdGhlci5jdXJyZW50JChqKV8pCitdXSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgkZm9yIGosIFtbKmN1cnJlbnQkKGopX11dKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCiskZm9yIGogIHx8IFtbCisKKyAgICAgICAgICBjdXJyZW50JChqKV8gPT0gZW5kJChqKV8KK11dOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCiskZm9yIGogW1sKKworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGJlZ2luJChqKV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3IgZW5kJChqKV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3IgY3VycmVudCQoailfOworXV0KKworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaTo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaSYgb3RoZXIpOworCisKKyRmb3IgaiBbWworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUJGo+IGckKGopXzsKKworXV0KK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkKKworCitdXQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBDb21iaW5lKCkgd2l0aCBwb2x5bW9ycGhpYyBmZWF0dXJlcy4gVGhleSBhbGxvdworLy8gY2FzdGluZyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yTjxUPiB0byBQYXJhbUdlbmVyYXRvcjxVPiBpZiBUIGlzCisvLyBjb252ZXJ0aWJsZSB0byBVLgorLy8KKyRyYW5nZSBpIDIuLm1heHR1cGxlCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKwordGVtcGxhdGUgPCRmb3IgaiwgW1tjbGFzcyBHZW5lcmF0b3Ikal1dPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkoJGZvciBqLCBbW2NvbnN0IEdlbmVyYXRvciRqJiBnJGpdXSkKKyAgICAgIDogJGZvciBqLCBbW2ckKGopXyhnJGopXV0ge30KKyAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaTwkZm9yIGosIFtbVCRqXV0+KAorJGZvciBqLFtbCisKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VCRqPiA+KGckKGopXykKK11dKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpJiBvdGhlcik7CisKKworJGZvciBqIFtbCisgIGNvbnN0IEdlbmVyYXRvciRqIGckKGopXzsKKworXV0KK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkKKworXV0KKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vICBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTEwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oCkBAIC0wLDAgKzEsNjE5IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXworCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKKy8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKKy8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIE91dHB1dHMgYSBtZXNzYWdlIGV4cGxhaW5pbmcgaW52YWxpZCByZWdpc3RyYXRpb24gb2YgZGlmZmVyZW50CisvLyBmaXh0dXJlIGNsYXNzIGZvciB0aGUgc2FtZSB0ZXN0IGNhc2UuIFRoaXMgbWF5IGhhcHBlbiB3aGVuCisvLyBURVNUX1AgbWFjcm8gaXMgdXNlZCB0byBkZWZpbmUgdHdvIHRlc3RzIHdpdGggdGhlIHNhbWUgbmFtZQorLy8gYnV0IGluIGRpZmZlcmVudCBuYW1lc3BhY2VzLgorR1RFU1RfQVBJXyB2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U7Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFBhcmFtR2VuZXJhdG9yOworCisvLyBJbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uCisvLyBvZiBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1JdGVyYXRvckludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5QYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKCkge30KKyAgLy8gQSBwb2ludGVyIHRvIHRoZSBiYXNlIGdlbmVyYXRvciBpbnN0YW5jZS4KKyAgLy8gVXNlZCBvbmx5IGZvciB0aGUgcHVycG9zZXMgb2YgaXRlcmF0b3IgY29tcGFyaXNvbgorICAvLyB0byBtYWtlIHN1cmUgdGhhdCB0d28gaXRlcmF0b3JzIGJlbG9uZyB0byB0aGUgc2FtZSBnZW5lcmF0b3IuCisgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCA9IDA7CisgIC8vIEFkdmFuY2VzIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBuZXh0IGVsZW1lbnQKKyAgLy8gcHJvdmlkZWQgYnkgdGhlIGdlbmVyYXRvci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICAvLyBmb3Igbm90IGNhbGxpbmcgQWR2YW5jZSgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvCisgIC8vIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCisgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgPSAwOworICAvLyBDbG9uZXMgdGhlIGl0ZXJhdG9yIG9iamVjdC4gVXNlZCBmb3IgaW1wbGVtZW50aW5nIGNvcHkgc2VtYW50aWNzCisgIC8vIG9mIFBhcmFtSXRlcmF0b3I8VD4uCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZSogQ2xvbmUoKSBjb25zdCA9IDA7CisgIC8vIERlcmVmZXJlbmNlcyB0aGUgY3VycmVudCBpdGVyYXRvciBhbmQgcHJvdmlkZXMgKHJlYWQtb25seSkgYWNjZXNzCisgIC8vIHRvIHRoZSBwb2ludGVkIHZhbHVlLiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgbm90IHRvIGNhbGwKKyAgLy8gQ3VycmVudCgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCisgIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3IqKCkuCisgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0ID0gMDsKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBpdGVyYXRvciBhbmQgb3RoZXIgcG9pbnQgdG8gdGhlIHNhbWUKKyAgLy8gZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IuCisgIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3I9PSgpLgorICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UmIG90aGVyKSBjb25zdCA9IDA7Cit9OworCisvLyBDbGFzcyBpdGVyYXRpbmcgb3ZlciBlbGVtZW50cyBwcm92aWRlZCBieSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uIEl0IHdyYXBzIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4KKy8vIGFuZCBpbXBsZW1lbnRzIHRoZSBjb25zdCBmb3J3YXJkIGl0ZXJhdG9yIGNvbmNlcHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgVCYgcmVmZXJlbmNlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgLy8gUGFyYW1JdGVyYXRvciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgaW1wbF8gcG9pbnRlci4KKyAgUGFyYW1JdGVyYXRvcihjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXy0+Q2xvbmUoKSkge30KKyAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSB7CisgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgaW1wbF8ucmVzZXQob3RoZXIuaW1wbF8tPkNsb25lKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICppbXBsXy0+Q3VycmVudCgpOyB9CisgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Q3VycmVudCgpOyB9CisgIC8vIFByZWZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCisgIFBhcmFtSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgaW1wbF8tPkFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgLy8gUG9zdGZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCisgIFBhcmFtSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQgLyp1bnVzZWQqLykgeworICAgIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGNsb25lID0gaW1wbF8tPkNsb25lKCk7CisgICAgaW1wbF8tPkFkdmFuY2UoKTsKKyAgICByZXR1cm4gUGFyYW1JdGVyYXRvcihjbG9uZSk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGltcGxfLmdldCgpID09IG90aGVyLmltcGxfLmdldCgpIHx8IGltcGxfLT5FcXVhbHMoKm90aGVyLmltcGxfKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQYXJhbUdlbmVyYXRvcjxUPjsKKyAgZXhwbGljaXQgUGFyYW1JdGVyYXRvcihQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisgIHNjb3BlZF9wdHI8UGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOworfTsKKworLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gaXMgdGhlIGJpbmFyeSBpbnRlcmZhY2UgdG8gYWNjZXNzIGdlbmVyYXRvcnMKKy8vIGRlZmluZWQgaW4gb3RoZXIgdHJhbnNsYXRpb24gdW5pdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBQYXJhbVR5cGU7CisKKyAgdmlydHVhbCB+UGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UoKSB7fQorCisgIC8vIEdlbmVyYXRvciBpbnRlcmZhY2UgZGVmaW5pdGlvbgorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0ID0gMDsKK307CisKKy8vIFdyYXBzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGFuZCBwcm92aWRlcyBnZW5lcmFsIGdlbmVyYXRvciBzeW50YXgKKy8vIGNvbXBhdGlibGUgd2l0aCB0aGUgU1RMIENvbnRhaW5lciBjb25jZXB0LgorLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGNvcHkgaW5pdGlhbGl6YXRpb24gc2VtYW50aWNzIGFuZCB0aGUgY29udGFpbmVkCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpbnN0YW5jZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGNvcGllcworLy8gb2YgdGhlIG9yaWdpbmFsIG9iamVjdC4gVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIHRoYXQgaW5zdGFuY2UgaXMgaW1tdXRhYmxlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUGFyYW1JdGVyYXRvcjxUPiBpdGVyYXRvcjsKKworICBleHBsaWNpdCBQYXJhbUdlbmVyYXRvcihQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQorICBQYXJhbUdlbmVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIDogaW1wbF8ob3RoZXIuaW1wbF8pIHt9CisKKyAgUGFyYW1HZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIHsKKyAgICBpbXBsXyA9IG90aGVyLmltcGxfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKGltcGxfLT5FbmQoKSk7IH0KKworIHByaXZhdGU6CisgIGxpbmtlZF9wdHI8Y29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gPiBpbXBsXzsKK307CisKKy8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSBhIHJhbmdlIG9mIHR3byBjb21wYXJhYmxlIHZhbHVlcy4gQ2FuIGJlIHVzZWQgdG8KKy8vIGdlbmVyYXRlIHNlcXVlbmNlcyBvZiB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBpbXBsZW1lbnQgb3BlcmF0b3IrKCkgYW5kCisvLyBvcGVyYXRvcjwoKS4KKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUgUmFuZ2UoKSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgorY2xhc3MgUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4geworIHB1YmxpYzoKKyAgUmFuZ2VHZW5lcmF0b3IoVCBiZWdpbiwgVCBlbmQsIEluY3JlbWVudFQgc3RlcCkKKyAgICAgIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhlbmQpLAorICAgICAgICBzdGVwXyhzdGVwKSwgZW5kX2luZGV4XyhDYWxjdWxhdGVFbmRJbmRleChiZWdpbiwgZW5kLCBzdGVwKSkge30KKyAgdmlydHVhbCB+UmFuZ2VHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBiZWdpbl8sIDAsIHN0ZXBfKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGVuZF8sIGVuZF9pbmRleF8sIHN0ZXBfKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGJhc2UsIFQgdmFsdWUsIGludCBpbmRleCwKKyAgICAgICAgICAgICBJbmNyZW1lbnRUIHN0ZXApCisgICAgICAgIDogYmFzZV8oYmFzZSksIHZhbHVlXyh2YWx1ZSksIGluZGV4XyhpbmRleCksIHN0ZXBfKHN0ZXApIHt9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICB2YWx1ZV8gPSB2YWx1ZV8gKyBzdGVwXzsKKyAgICAgIGluZGV4XysrOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZ2YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBpbnQgb3RoZXJfaW5kZXggPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aW5kZXhfOworICAgICAgcmV0dXJuIGluZGV4XyA9PSBvdGhlcl9pbmRleDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4oKSwKKyAgICAgICAgICBiYXNlXyhvdGhlci5iYXNlXyksIHZhbHVlXyhvdGhlci52YWx1ZV8pLCBpbmRleF8ob3RoZXIuaW5kZXhfKSwKKyAgICAgICAgICBzdGVwXyhvdGhlci5zdGVwXykge30KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOworICAgIFQgdmFsdWVfOworICAgIGludCBpbmRleF87CisgICAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKKyAgfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcgorCisgIHN0YXRpYyBpbnQgQ2FsY3VsYXRlRW5kSW5kZXgoY29uc3QgVCYgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluY3JlbWVudFQmIHN0ZXApIHsKKyAgICBpbnQgZW5kX2luZGV4ID0gMDsKKyAgICBmb3IgKFQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpID0gaSArIHN0ZXApCisgICAgICBlbmRfaW5kZXgrKzsKKyAgICByZXR1cm4gZW5kX2luZGV4OworICB9CisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBSYW5nZUdlbmVyYXRvciYgb3RoZXIpOworCisgIGNvbnN0IFQgYmVnaW5fOworICBjb25zdCBUIGVuZF87CisgIGNvbnN0IEluY3JlbWVudFQgc3RlcF87CisgIC8vIFRoZSBpbmRleCBmb3IgdGhlIGVuZCgpIGl0ZXJhdG9yLiBBbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQKKyAgLy8gc2VxdWVuY2UgYXJlIGluZGV4ZWQgKDAtYmFzZWQpIHRvIGFpZCBpdGVyYXRvciBjb21wYXJpc29uLgorICBjb25zdCBpbnQgZW5kX2luZGV4XzsKK307ICAvLyBjbGFzcyBSYW5nZUdlbmVyYXRvcgorCisKKy8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVXNlZCBpbiB0aGUKKy8vIFZhbHVlc0luKCkgZnVuY3Rpb24uIFRoZSBlbGVtZW50cyBhcmUgY29waWVkIGZyb20gdGhlIHNvdXJjZSByYW5nZQorLy8gc2luY2UgdGhlIHNvdXJjZSBjYW4gYmUgbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB0aGUgZ2VuZXJhdG9yCisvLyBpcyBsaWtlbHkgdG8gcGVyc2lzdCBiZXlvbmQgdGhhdCBzdGFjayBmcmFtZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CisgIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpCisgICAgICA6IGNvbnRhaW5lcl8oYmVnaW4sIGVuZCkge30KKyAgdmlydHVhbCB+VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGNvbnRhaW5lcl8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8VD4gQ29udGFpbmVyVHlwZTsKKworICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwgaXRlcmF0b3JfKGl0ZXJhdG9yKSB7fQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgKytpdGVyYXRvcl87CisgICAgICB2YWx1ZV8ucmVzZXQoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICAvLyBXZSBuZWVkIHRvIHVzZSBjYWNoZWQgdmFsdWUgcmVmZXJlbmNlZCBieSBpdGVyYXRvcl8gYmVjYXVzZSAqaXRlcmF0b3JfCisgICAgLy8gY2FuIHJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QgKGFuZCBvZiB0eXBlIG90aGVyIHRoZW4gVCksIHNvIGp1c3QKKyAgICAvLyBoYXZpbmcgInJldHVybiAmKml0ZXJhdG9yXzsiIGRvZXNuJ3Qgd29yay4KKyAgICAvLyB2YWx1ZV8gaXMgdXBkYXRlZCBoZXJlIGFuZCBub3QgaW4gQWR2YW5jZSgpIGJlY2F1c2UgQWR2YW5jZSgpCisgICAgLy8gY2FuIGFkdmFuY2UgaXRlcmF0b3JfIGJleW9uZCB0aGUgZW5kIG9mIHRoZSByYW5nZSwgYW5kIHdlIGNhbm5vdAorICAgIC8vIGRldGVjdCB0aGF0IGZhY3QuIFRoZSBjbGllbnQgY29kZSwgb24gdGhlIG90aGVyIGhhbmQsIGlzCisgICAgLy8gcmVzcG9uc2libGUgZm9yIG5vdCBjYWxsaW5nIEN1cnJlbnQoKSBvbiBhbiBvdXQtb2YtcmFuZ2UgaXRlcmF0b3IuCisgICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeworICAgICAgaWYgKHZhbHVlXy5nZXQoKSA9PSBOVUxMKQorICAgICAgICB2YWx1ZV8ucmVzZXQobmV3IFQoKml0ZXJhdG9yXykpOworICAgICAgcmV0dXJuIHZhbHVlXy5nZXQoKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGl0ZXJhdG9yXyA9PQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aXRlcmF0b3JfOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgICAgLy8gVGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgc3VwcHJlc3NlcyBhIGZhbHNlIHdhcm5pbmcKKyAgICAgICAgICAvLyBlbWl0dGVkIGJ5IGdjYyB3aGVuIHN1cHBsaWVkIHdpdGggdGhlIC1XZXh0cmEgb3B0aW9uLgorICAgICAgICA6IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4oKSwKKyAgICAgICAgICBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgICAgaXRlcmF0b3JfKG90aGVyLml0ZXJhdG9yXykge30KKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBjb25zdCBiYXNlXzsKKyAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcl87CisgICAgLy8gQSBjYWNoZWQgdmFsdWUgb2YgKml0ZXJhdG9yXy4gV2Uga2VlcCBpdCBoZXJlIHRvIGFsbG93IGFjY2VzcyBieQorICAgIC8vIHBvaW50ZXIgaW4gdGhlIHdyYXBwaW5nIGl0ZXJhdG9yJ3Mgb3BlcmF0b3ItPigpLgorICAgIC8vIHZhbHVlXyBuZWVkcyB0byBiZSBtdXRhYmxlIHRvIGJlIGFjY2Vzc2VkIGluIEN1cnJlbnQoKS4KKyAgICAvLyBVc2Ugb2Ygc2NvcGVkX3B0ciBoZWxwcyBtYW5hZ2UgY2FjaGVkIHZhbHVlJ3MgbGlmZXRpbWUsCisgICAgLy8gd2hpY2ggaXMgYm91bmQgYnkgdGhlIGxpZmVzcGFuIG9mIHRoZSBpdGVyYXRvciBpdHNlbGYuCisgICAgbXV0YWJsZSBzY29wZWRfcHRyPGNvbnN0IFQ+IHZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvciYgb3RoZXIpOworCisgIGNvbnN0IENvbnRhaW5lclR5cGUgY29udGFpbmVyXzsKK307ICAvLyBjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBTdG9yZXMgYSBwYXJhbWV0ZXIgdmFsdWUgYW5kIGxhdGVyIGNyZWF0ZXMgdGVzdHMgcGFyYW1ldGVyaXplZCB3aXRoIHRoYXQKKy8vIHZhbHVlLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeSA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2xhc3M6OlBhcmFtVHlwZSBQYXJhbVR5cGU7CisgIGV4cGxpY2l0IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSA6CisgICAgICBwYXJhbWV0ZXJfKHBhcmFtZXRlcikge30KKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeworICAgIFRlc3RDbGFzczo6U2V0UGFyYW0oJnBhcmFtZXRlcl8pOworICAgIHJldHVybiBuZXcgVGVzdENsYXNzKCk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFBhcmFtVHlwZSBwYXJhbWV0ZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVGVzdE1ldGFGYWN0b3J5QmFzZSBpcyBhIGJhc2UgY2xhc3MgZm9yIG1ldGEtZmFjdG9yaWVzIHRoYXQgY3JlYXRlCisvLyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLgordGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KK2NsYXNzIFRlc3RNZXRhRmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdE1ldGFGYWN0b3J5QmFzZSgpIHt9CisKKyAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpID0gMDsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVGVzdE1ldGFGYWN0b3J5IGNyZWF0ZXMgdGVzdCBmYWN0b3JpZXMgZm9yIHBhc3NpbmcgaW50bworLy8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uIFNpbmNlIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIHJlY2VpdmVzCisvLyBvd25lcnNoaXAgb2YgdGVzdCBmYWN0b3J5IHBvaW50ZXIsIHNhbWUgZmFjdG9yeSBvYmplY3QgY2Fubm90IGJlIHBhc3NlZAorLy8gaW50byB0aGF0IG1ldGhvZCB0d2ljZS4gQnV0IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gaXMgZ29pbmcgdG8gY2FsbAorLy8gaXQgZm9yIGVhY2ggVGVzdC9QYXJhbWV0ZXIgdmFsdWUgY29tYmluYXRpb24uIFRodXMgaXQgbmVlZHMgbWV0YSBmYWN0b3J5CisvLyBjcmVhdG9yIGNsYXNzLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorY2xhc3MgVGVzdE1ldGFGYWN0b3J5CisgICAgOiBwdWJsaWMgVGVzdE1ldGFGYWN0b3J5QmFzZTx0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlPiB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOworCisgIFRlc3RNZXRhRmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIHsKKyAgICByZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeTxUZXN0Q2FzZT4ocGFyYW1ldGVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0TWV0YUZhY3RvcnkpOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlCisvLyB0byBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGNsYXNzZXMuIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlCisvLyBhY2N1bXVsYXRlcyB0ZXN0IGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IFRFU1RfUCBtYWNybyBpbnZvY2F0aW9ucworLy8gYW5kIGdlbmVyYXRvcnMgcHJvdmlkZWQgYnkgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMKKy8vIGFuZCB1c2VzIHRoYXQgaW5mb3JtYXRpb24gdG8gcmVnaXN0ZXIgYWxsIHJlc3VsdGluZyB0ZXN0IGluc3RhbmNlcworLy8gaW4gUmVnaXN0ZXJUZXN0cyBtZXRob2QuIFRoZSBQYXJhbWV0ZXJpemVUZXN0Q2FzZVJlZ2lzdHJ5IGNsYXNzIGhvbGRzCisvLyBhIGNvbGxlY3Rpb24gb2YgcG9pbnRlcnMgdG8gdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gb2JqZWN0cworLy8gYW5kIGNhbGxzIFJlZ2lzdGVyVGVzdHMoKSBvbiBlYWNoIG9mIHRoZW0gd2hlbiBhc2tlZC4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30KKworICAvLyBCYXNlIHBhcnQgb2YgdGVzdCBjYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCA9IDA7CisgIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCisgIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgPSAwOworICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMKKyAgLy8gdGVzdCBjYXNlIHJpZ2h0IGJlZm9yZSBydW5uaW5nIHRoZW0gaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KKyAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQorICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBSZWdpc3RlclRlc3RzKCkgPSAwOworCisgcHJvdGVjdGVkOgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSgpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBhY2N1bXVsYXRlcyB0ZXN0cyBvYnRhaW5lZCBmcm9tIFRFU1RfUAorLy8gbWFjcm8gaW52b2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciB0ZXN0IGNhc2UgYW5kIGdlbmVyYXRvcnMKKy8vIG9idGFpbmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMgZm9yIHRoYXQKKy8vIHRlc3QgY2FzZS4gSXQgcmVnaXN0ZXJzIHRlc3RzIHdpdGggYWxsIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWxsCisvLyBnZW5lcmF0b3JzIHdoZW4gYXNrZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+CitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIDogcHVibGljIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKKyBwdWJsaWM6CisgIC8vIFBhcmFtVHlwZSBhbmQgR2VuZXJhdG9yQ3JlYXRpb25GdW5jIGFyZSBwcml2YXRlIHR5cGVzIGJ1dCBhcmUgcmVxdWlyZWQKKyAgLy8gZm9yIGRlY2xhcmF0aW9ucyBvZiBwdWJsaWMgbWV0aG9kcyBBZGRUZXN0UGF0dGVybigpIGFuZAorICAvLyBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oKS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKKyAgLy8gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYXBwcm9wcmlhdGUgZ2VuZXJhdG9yIHR5cGUuCisgIHR5cGVkZWYgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPihHZW5lcmF0b3JDcmVhdGlvbkZ1bmMpKCk7CisKKyAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyhjb25zdCBjaGFyKiBuYW1lKQorICAgICAgOiB0ZXN0X2Nhc2VfbmFtZV8obmFtZSkge30KKworICAvLyBUZXN0IGNhc2UgYmFzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0VGVzdENhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfOyB9CisgIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCisgIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgeyByZXR1cm4gR2V0VHlwZUlkPFRlc3RDYXNlPigpOyB9CisgIC8vIFRFU1RfUCBtYWNybyB1c2VzIEFkZFRlc3RQYXR0ZXJuKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCisgIC8vIGFib3V0IGEgc2luZ2xlIHRlc3QgaW4gYSBMb2NhbFRlc3RJbmZvIHN0cnVjdHVyZS4KKyAgLy8gdGVzdF9jYXNlX25hbWUgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgdGVzdCBjYXNlICh3aXRob3V0IGludm9jYXRpb24KKyAgLy8gcHJlZml4KS4gdGVzdF9iYXNlX25hbWUgaXMgdGhlIG5hbWUgb2YgYW4gaW5kaXZpZHVhbCB0ZXN0IHdpdGhvdXQKKyAgLy8gcGFyYW1ldGVyIGluZGV4LiBGb3IgdGhlIHRlc3QgU2VxdWVuY2VBL0Zvb1Rlc3QuRG9CYXIvMSBGb29UZXN0IGlzCisgIC8vIHRlc3QgY2FzZSBiYXNlIG5hbWUgYW5kIERvQmFyIGlzIHRlc3QgYmFzZSBuYW1lLgorICB2b2lkIEFkZFRlc3RQYXR0ZXJuKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogbWV0YV9mYWN0b3J5KSB7CisgICAgdGVzdHNfLnB1c2hfYmFjayhsaW5rZWRfcHRyPFRlc3RJbmZvPihuZXcgVGVzdEluZm8odGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9iYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mYWN0b3J5KSkpOworICB9CisgIC8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIHVzZXMgQWRkR2VuZXJhdG9yKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCisgIC8vIGFib3V0IGEgZ2VuZXJhdG9yLgorICBpbnQgQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKGNvbnN0IHN0cmluZyYgaW5zdGFudGlhdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNyZWF0aW9uRnVuYyogZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBmaWxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBsaW5lICovKSB7CisgICAgaW5zdGFudGlhdGlvbnNfLnB1c2hfYmFjayg6OnN0ZDo6bWFrZV9wYWlyKGluc3RhbnRpYXRpb25fbmFtZSwgZnVuYykpOworICAgIHJldHVybiAwOyAgLy8gUmV0dXJuIHZhbHVlIHVzZWQgb25seSB0byBydW4gdGhpcyBtZXRob2QgaW4gbmFtZXNwYWNlIHNjb3BlLgorICB9CisgIC8vIFVuaXRUZXN0IGNsYXNzIGludm9rZXMgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UKKyAgLy8gdGVzdCBjYXNlcyByaWdodCBiZWZvcmUgcnVubmluZyB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTIG1hY3JvLgorICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZSBvbiBhbnkgc2luZ2xlCisgIC8vIGluc3RhbmNlIG9mIGEgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgZGVyaXZlZCBjbGFzcy4KKyAgLy8gVW5pdFRlc3QgaGFzIGEgZ3VhcmQgdG8gcHJldmVudCBmcm9tIGNhbGxpbmcgdGhpcyBtZXRob2QgbW9yZSB0aGVuIG9uY2UuCisgIHZpcnR1YWwgdm9pZCBSZWdpc3RlclRlc3RzKCkgeworICAgIGZvciAodHlwZW5hbWUgVGVzdEluZm9Db250YWluZXI6Oml0ZXJhdG9yIHRlc3RfaXQgPSB0ZXN0c18uYmVnaW4oKTsKKyAgICAgICAgIHRlc3RfaXQgIT0gdGVzdHNfLmVuZCgpOyArK3Rlc3RfaXQpIHsKKyAgICAgIGxpbmtlZF9wdHI8VGVzdEluZm8+IHRlc3RfaW5mbyA9ICp0ZXN0X2l0OworICAgICAgZm9yICh0eXBlbmFtZSBJbnN0YW50aWF0aW9uQ29udGFpbmVyOjppdGVyYXRvciBnZW5faXQgPQorICAgICAgICAgICAgICAgaW5zdGFudGlhdGlvbnNfLmJlZ2luKCk7IGdlbl9pdCAhPSBpbnN0YW50aWF0aW9uc18uZW5kKCk7CisgICAgICAgICAgICAgICArK2dlbl9pdCkgeworICAgICAgICBjb25zdCBzdHJpbmcmIGluc3RhbnRpYXRpb25fbmFtZSA9IGdlbl9pdC0+Zmlyc3Q7CisgICAgICAgIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4gZ2VuZXJhdG9yKCgqZ2VuX2l0LT5zZWNvbmQpKCkpOworCisgICAgICAgIHN0cmluZyB0ZXN0X2Nhc2VfbmFtZTsKKyAgICAgICAgaWYgKCAhaW5zdGFudGlhdGlvbl9uYW1lLmVtcHR5KCkgKQorICAgICAgICAgIHRlc3RfY2FzZV9uYW1lID0gaW5zdGFudGlhdGlvbl9uYW1lICsgIi8iOworICAgICAgICB0ZXN0X2Nhc2VfbmFtZSArPSB0ZXN0X2luZm8tPnRlc3RfY2FzZV9iYXNlX25hbWU7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT46Oml0ZXJhdG9yIHBhcmFtX2l0ID0KKyAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmJlZ2luKCk7CisgICAgICAgICAgICAgcGFyYW1faXQgIT0gZ2VuZXJhdG9yLmVuZCgpOyArK3BhcmFtX2l0LCArK2kpIHsKKyAgICAgICAgICBNZXNzYWdlIHRlc3RfbmFtZV9zdHJlYW07CisgICAgICAgICAgdGVzdF9uYW1lX3N0cmVhbSA8PCB0ZXN0X2luZm8tPnRlc3RfYmFzZV9uYW1lIDw8ICIvIiA8PCBpOworICAgICAgICAgIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgICAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgIE5VTEwsICAvLyBObyB0eXBlIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZygqcGFyYW1faXQpLmNfc3RyKCksCisgICAgICAgICAgICAgIEdldFRlc3RDYXNlVHlwZUlkKCksCisgICAgICAgICAgICAgIFRlc3RDYXNlOjpTZXRVcFRlc3RDYXNlLAorICAgICAgICAgICAgICBUZXN0Q2FzZTo6VGVhckRvd25UZXN0Q2FzZSwKKyAgICAgICAgICAgICAgdGVzdF9pbmZvLT50ZXN0X21ldGFfZmFjdG9yeS0+Q3JlYXRlVGVzdEZhY3RvcnkoKnBhcmFtX2l0KSk7CisgICAgICAgIH0gIC8vIGZvciBwYXJhbV9pdAorICAgICAgfSAgLy8gZm9yIGdlbl9pdAorICAgIH0gIC8vIGZvciB0ZXN0X2l0CisgIH0gIC8vIFJlZ2lzdGVyVGVzdHMKKworIHByaXZhdGU6CisgIC8vIExvY2FsVGVzdEluZm8gc3RydWN0dXJlIGtlZXBzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHRlc3QgcmVnaXN0ZXJlZAorICAvLyB3aXRoIFRFU1RfUCBtYWNyby4KKyAgc3RydWN0IFRlc3RJbmZvIHsKKyAgICBUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9iYXNlX25hbWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogYV90ZXN0X2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICBUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4qIGFfdGVzdF9tZXRhX2ZhY3RvcnkpIDoKKyAgICAgICAgdGVzdF9jYXNlX2Jhc2VfbmFtZShhX3Rlc3RfY2FzZV9iYXNlX25hbWUpLAorICAgICAgICB0ZXN0X2Jhc2VfbmFtZShhX3Rlc3RfYmFzZV9uYW1lKSwKKyAgICAgICAgdGVzdF9tZXRhX2ZhY3RvcnkoYV90ZXN0X21ldGFfZmFjdG9yeSkge30KKworICAgIGNvbnN0IHN0cmluZyB0ZXN0X2Nhc2VfYmFzZV9uYW1lOworICAgIGNvbnN0IHN0cmluZyB0ZXN0X2Jhc2VfbmFtZTsKKyAgICBjb25zdCBzY29wZWRfcHRyPFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiA+IHRlc3RfbWV0YV9mYWN0b3J5OworICB9OworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8bGlua2VkX3B0cjxUZXN0SW5mbz4gPiBUZXN0SW5mb0NvbnRhaW5lcjsKKyAgLy8gS2VlcHMgcGFpcnMgb2YgPEluc3RhbnRpYXRpb24gbmFtZSwgU2VxdWVuY2UgZ2VuZXJhdG9yIGNyZWF0aW9uIGZ1bmN0aW9uPgorICAvLyByZWNlaXZlZCBmcm9tIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3Jvcy4KKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdHJpbmcsIEdlbmVyYXRvckNyZWF0aW9uRnVuYyo+ID4KKyAgICAgIEluc3RhbnRpYXRpb25Db250YWluZXI7CisKKyAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsKKyAgVGVzdEluZm9Db250YWluZXIgdGVzdHNfOworICBJbnN0YW50aWF0aW9uQ29udGFpbmVyIGluc3RhbnRpYXRpb25zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8pOworfTsgIC8vIGNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBjb250YWlucyBhIG1hcCBvZiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQorLy8gY2xhc3NlcyBhY2Nlc3NlZCBieSB0ZXN0IGNhc2UgbmFtZXMuIFRFU1RfUCBhbmQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AKKy8vIG1hY3JvcyB1c2UgaXQgdG8gbG9jYXRlIHRoZWlyIGNvcnJlc3BvbmRpbmcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbworLy8gZGVzY3JpcHRvcnMuCitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSB7CisgcHVibGljOgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHt9CisgIH5QYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICBkZWxldGUgKml0OworICAgIH0KKyAgfQorCisgIC8vIExvb2tzIHVwIG9yIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dAorICAvLyB0ZXN0cyBhbmQgaW5zdGFudGlhdGlvbnMgb2YgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyKAorICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgaW50IGxpbmUpIHsKKyAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogdHlwZWRfdGVzdF9pbmZvID0gTlVMTDsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlTmFtZSgpID09IHRlc3RfY2FzZV9uYW1lKSB7CisgICAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VUeXBlSWQoKSAhPSBHZXRUeXBlSWQ8VGVzdENhc2U+KCkpIHsKKyAgICAgICAgICAvLyBDb21wbGFpbiBhYm91dCBpbmNvcnJlY3QgdXNhZ2Ugb2YgR29vZ2xlIFRlc3QgZmFjaWxpdGllcworICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gc2luY2Ugd2UgY2Fubm90IGd1YXJhbnR5IGNvcnJlY3QKKyAgICAgICAgICAvLyB0ZXN0IGNhc2Ugc2V0dXAgYW5kIHRlYXItZG93biBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZSh0ZXN0X2Nhc2VfbmFtZSwgIGZpbGUsIGxpbmUpOworICAgICAgICAgIHBvc2l4OjpBYm9ydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCB0aGUgb2JqZWN0IHdlIGZvdW5kIGlzIG9mIHRoZSBzYW1lCisgICAgICAgICAgLy8gdHlwZSB3ZSBhcmUgbG9va2luZyBmb3IsIHNvIHdlIGRvd25jYXN0IGl0IHRvIHRoYXQgdHlwZQorICAgICAgICAgIC8vIHdpdGhvdXQgZnVydGhlciBjaGVja3MuCisgICAgICAgICAgdHlwZWRfdGVzdF9pbmZvID0gQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPAorICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiA+KCppdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlZF90ZXN0X2luZm8gPT0gTlVMTCkgeworICAgICAgdHlwZWRfdGVzdF9pbmZvID0gbmV3IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KHRlc3RfY2FzZV9uYW1lKTsKKyAgICAgIHRlc3RfY2FzZV9pbmZvc18ucHVzaF9iYWNrKHR5cGVkX3Rlc3RfaW5mbyk7CisgICAgfQorICAgIHJldHVybiB0eXBlZF90ZXN0X2luZm87CisgIH0KKyAgdm9pZCBSZWdpc3RlclRlc3RzKCkgeworICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKKyAgICAgICgqaXQpLT5SZWdpc3RlclRlc3RzKCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8UGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UqPiBUZXN0Q2FzZUluZm9Db250YWluZXI7CisKKyAgVGVzdENhc2VJbmZvQ29udGFpbmVyIHRlc3RfY2FzZV9pbmZvc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzRmZTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaApAQCAtMCwwICsxLDE5NDcgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIExvdy1sZXZlbCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBwb3J0aW5nIEdvb2dsZSBUZXN0IHRvIHZhcmlvdXMKKy8vIHBsYXRmb3Jtcy4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRQorLy8gVEhFTSBJTiBVU0VSIENPREUuCisvLworLy8gVGhpcyBmaWxlIGlzIGZ1bmRhbWVudGFsIHRvIEdvb2dsZSBUZXN0LiAgQWxsIG90aGVyIEdvb2dsZSBUZXN0IHNvdXJjZQorLy8gZmlsZXMgYXJlIGV4cGVjdGVkIHRvICNpbmNsdWRlIHRoaXMuICBUaGVyZWZvcmUsIGl0IGNhbm5vdCAjaW5jbHVkZQorLy8gYW55IG90aGVyIEdvb2dsZSBUZXN0IGhlYWRlci4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCisKKy8vIFRoZSB1c2VyIGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgaW4gdGhlIGJ1aWxkIHNjcmlwdCB0bworLy8gY29udHJvbCBHb29nbGUgVGVzdCdzIGJlaGF2aW9yLiAgSWYgdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgYSBtYWNybworLy8gaW4gdGhpcyBsaXN0LCBHb29nbGUgVGVzdCB3aWxsIGRlZmluZSBpdC4KKy8vCisvLyAgIEdURVNUX0hBU19DTE9ORSAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBjbG9uZSgyKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19FWENFUFRJT05TICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBleGNlcHRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjpzdHJpbmcpLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6d3N0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6d3N0cmluZykuCisvLyAgIEdURVNUX0hBU19QT1NJWF9SRSAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBQT1NJWCByZWd1bGFyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZS9hcmVuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUFRIUkVBRCAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgPHB0aHJlYWQuaD4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUlRUSSAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUlRUSSBpcy9pc24ndAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfU1REX1dTVFJJTkcgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIGRvZXMvZG9lc24ndCB3b3JrIChHb29nbGUgVGVzdCBjYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB3aGVyZSBzdGQ6OndzdHJpbmcgaXMgdW5hdmFpbGFibGUpLgorLy8gICBHVEVTVF9IQVNfVFIxX1RVUExFICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRyMTo6dHVwbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfU0VIICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzICJTdHJ1Y3R1cmVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBIYW5kbGluZyIuCisvLyAgIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSBzdXBwb3J0cyBJL08gc3RyZWFtIHJlZGlyZWN0aW9uIHVzaW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cCgpIGFuZCBkdXAyKCkuCisvLyAgIEdURVNUX1VTRV9PV05fVFIxX1RVUExFICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciBHb29nbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuICBVbnVzZWQgd2hlbiB0aGUgdXNlciBzZXRzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19UUjFfVFVQTEUgdG8gMC4KKy8vICAgR1RFU1RfTEFOR19DWFgxMSAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IEdvb2dsZSBUZXN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGJ1aWxkaW5nIGluIEMrKzExL0MrKzk4IG1vZGUuCisvLyAgIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyB0ZXN0cyB0aGF0IHVzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGUgVGVzdCBhcyBhIHNoYXJlZCBsaWJyYXJ5IChrbm93biBhcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETEwgb24gV2luZG93cykuCisvLyAgIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBpdHNlbGYKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBzaGFyZWQgbGlicmFyeS4KKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHV0aWxpdGllczoKKy8vCisvLyBNYWNyb3MgaW5kaWNhdGluZyB0aGUgY3VycmVudCBwbGF0Zm9ybSAoZGVmaW5lZCB0byAxIGlmIGNvbXBpbGVkIG9uCisvLyB0aGUgZ2l2ZW4gcGxhdGZvcm07IG90aGVyd2lzZSB1bmRlZmluZWQpOgorLy8gICBHVEVTVF9PU19BSVggICAgICAtIElCTSBBSVgKKy8vICAgR1RFU1RfT1NfQ1lHV0lOICAgLSBDeWd3aW4KKy8vICAgR1RFU1RfT1NfSFBVWCAgICAgLSBIUC1VWAorLy8gICBHVEVTVF9PU19MSU5VWCAgICAtIExpbnV4CisvLyAgICAgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAtIEdvb2dsZSBBbmRyb2lkCisvLyAgIEdURVNUX09TX01BQyAgICAgIC0gTWFjIE9TIFgKKy8vICAgICBHVEVTVF9PU19JT1MgICAgLSBpT1MKKy8vICAgICAgIEdURVNUX09TX0lPU19TSU1VTEFUT1IgLSBpT1Mgc2ltdWxhdG9yCisvLyAgIEdURVNUX09TX05BQ0wgICAgIC0gR29vZ2xlIE5hdGl2ZSBDbGllbnQgKE5hQ2wpCisvLyAgIEdURVNUX09TX09QRU5CU0QgIC0gT3BlbkJTRAorLy8gICBHVEVTVF9PU19RTlggICAgICAtIFFOWAorLy8gICBHVEVTVF9PU19TT0xBUklTICAtIFN1biBTb2xhcmlzCisvLyAgIEdURVNUX09TX1NZTUJJQU4gIC0gU3ltYmlhbgorLy8gICBHVEVTVF9PU19XSU5ET1dTICAtIFdpbmRvd3MgKERlc2t0b3AsIE1pbkdXLCBvciBNb2JpbGUpCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICAtIFdpbmRvd3MgRGVza3RvcAorLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgICAgLSBNaW5HVworLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAgLSBXaW5kb3dzIE1vYmlsZQorLy8gICBHVEVTVF9PU19aT1MgICAgICAtIHovT1MKKy8vCisvLyBBbW9uZyB0aGUgcGxhdGZvcm1zLCBDeWd3aW4sIExpbnV4LCBNYXggT1MgWCwgYW5kIFdpbmRvd3MgaGF2ZSB0aGUKKy8vIG1vc3Qgc3RhYmxlIHN1cHBvcnQuICBTaW5jZSBjb3JlIG1lbWJlcnMgb2YgdGhlIEdvb2dsZSBUZXN0IHByb2plY3QKKy8vIGRvbid0IGhhdmUgYWNjZXNzIHRvIG90aGVyIHBsYXRmb3Jtcywgc3VwcG9ydCBmb3IgdGhlbSBtYXkgYmUgbGVzcworLy8gc3RhYmxlLiAgSWYgeW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQorLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIChwYXRjaGVzIGZvciBmaXhpbmcgdGhlbSBhcmUKKy8vIGV2ZW4gbW9yZSB3ZWxjb21lISkuCisvLworLy8gTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQgbm9uZSBvZiB0aGUgR1RFU1RfT1NfKiBtYWNyb3MgYXJlIGRlZmluZWQuCisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgYXZhaWxhYmxlIEdvb2dsZSBUZXN0IGZlYXR1cmVzIChkZWZpbmVkIHRvIDEgaWYKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgc3VwcG9ydGVkOyBvdGhlcndpc2UgdW5kZWZpbmVkKToKKy8vICAgR1RFU1RfSEFTX0NPTUJJTkUgICAgICAtIHRoZSBDb21iaW5lKCkgZnVuY3Rpb24gKGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKKy8vICAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgICAtIGRlYXRoIHRlc3RzCisvLyAgIEdURVNUX0hBU19QQVJBTV9URVNUICAgLSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX0hBU19UWVBFRF9URVNUICAgLSB0eXBlZCB0ZXN0cworLy8gICBHVEVTVF9IQVNfVFlQRURfVEVTVF9QIC0gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX1VTRVNfUE9TSVhfUkUgICAgLSBlbmhhbmNlZCBQT1NJWCByZWdleCBpcyB1c2VkLiBEbyBub3QgY29uZnVzZSB3aXRoCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9IQVNfUE9TSVhfUkUgKHNlZSBhYm92ZSkgd2hpY2ggdXNlcnMgY2FuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgdGhlbXNlbHZlcy4KKy8vICAgR1RFU1RfVVNFU19TSU1QTEVfUkUgICAtIG91ciBvd24gc2ltcGxlIHJlZ2V4IGlzIHVzZWQ7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWJvdmUgdHdvIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisvLyAgIEdURVNUX0NBTl9DT01QQVJFX05VTEwgLSBhY2NlcHRzIHVudHlwZWQgTlVMTCBpbiBFWFBFQ1RfRVEoKS4KKy8vCisvLyBNYWNyb3MgZm9yIGJhc2ljIEMrKyBjb2Rpbmc6CisvLyAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIC0gZm9yIGRpc2FibGluZyBhIGdjYyB3YXJuaW5nLgorLy8gICBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyAgLSBkZWNsYXJlcyB0aGF0IGEgY2xhc3MnIGluc3RhbmNlcyBvciBhCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGRvbid0IGhhdmUgdG8gYmUgdXNlZC4KKy8vICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyAgIC0gZGlzYWJsZXMgb3BlcmF0b3I9LgorLy8gICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fIC0gZGlzYWJsZXMgY29weSBjdG9yIGFuZCBvcGVyYXRvcj0uCisvLyAgIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gICAtIGRlY2xhcmVzIHRoYXQgYSBmdW5jdGlvbidzIHJlc3VsdCBtdXN0IGJlIHVzZWQuCisvLworLy8gU3luY2hyb25pemF0aW9uOgorLy8gICBNdXRleCwgTXV0ZXhMb2NrLCBUaHJlYWRMb2NhbCwgR2V0VGhyZWFkQ291bnQoKQorLy8gICAgICAgICAgICAgICAgICAtIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgorLy8gICBHVEVTVF9JU19USFJFQURTQUZFIC0gZGVmaW5lZCB0byAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGFib3ZlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBoYXZlIHJlYWwgaW1wbGVtZW50YXRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgR29vZ2xlIFRlc3QgaXMgdGhyZWFkLXNhZmU7IG9yIDAgb3RoZXJ3aXNlLgorLy8KKy8vIFRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmc6CisvLyAgIGlzX3BvaW50ZXIgICAgIC0gYXMgaW4gVFIxOyBuZWVkZWQgb24gU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIG9ubHkuCisvLyAgIEl0ZXJhdG9yVHJhaXRzIC0gcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0cywgd2hpY2gKKy8vICAgICAgICAgICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIGluIGxpYkNzdGQgd2hlbiBjb21waWxlZCB3aXRoIFN1biBDKysuCisvLworLy8gU21hcnQgcG9pbnRlcnM6CisvLyAgIHNjb3BlZF9wdHIgICAgIC0gYXMgaW4gVFIyLgorLy8KKy8vIFJlZ3VsYXIgZXhwcmVzc2lvbnM6CisvLyAgIFJFICAgICAgICAgICAgIC0gYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGNsYXNzIHVzaW5nIHRoZSBQT1NJWAorLy8gICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXggb24gVU5JWC1saWtlCisvLyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zLCBvciBhIHJlZHVjZWQgcmVndWxhciBleGNlcHRpb24gc3ludGF4IG9uCisvLyAgICAgICAgICAgICAgICAgICAgb3RoZXIgcGxhdGZvcm1zLCBpbmNsdWRpbmcgV2luZG93cy4KKy8vCisvLyBMb2dnaW5nOgorLy8gICBHVEVTVF9MT0dfKCkgICAtIGxvZ3MgbWVzc2FnZXMgYXQgdGhlIHNwZWNpZmllZCBzZXZlcml0eSBsZXZlbC4KKy8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCisvLworLy8gU3Rkb3V0IGFuZCBzdGRlcnIgY2FwdHVyaW5nOgorLy8gICBDYXB0dXJlU3Rkb3V0KCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCisvLyAgIEdldENhcHR1cmVkU3Rkb3V0KCkgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgorLy8gICBDYXB0dXJlU3RkZXJyKCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyKCkgLSBzdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgorLy8KKy8vIEludGVnZXIgdHlwZXM6CisvLyAgIFR5cGVXaXRoU2l6ZSAgIC0gbWFwcyBhbiBpbnRlZ2VyIHRvIGEgaW50IHR5cGUuCisvLyAgIEludDMyLCBVSW50MzIsIEludDY0LCBVSW50NjQsIFRpbWVJbk1pbGxpcworLy8gICAgICAgICAgICAgICAgICAtIGludGVnZXJzIG9mIGtub3duIHNpemVzLgorLy8gICBCaWdnZXN0SW50ICAgICAtIHRoZSBiaWdnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuCisvLworLy8gQ29tbWFuZC1saW5lIHV0aWxpdGllczoKKy8vICAgR1RFU1RfRkxBRygpICAgICAgIC0gcmVmZXJlbmNlcyBhIGZsYWcuCisvLyAgIEdURVNUX0RFQ0xBUkVfKigpICAtIGRlY2xhcmVzIGEgZmxhZy4KKy8vICAgR1RFU1RfREVGSU5FXyooKSAgIC0gZGVmaW5lcyBhIGZsYWcuCisvLyAgIEdldEluamVjdGFibGVBcmd2cygpIC0gcmV0dXJucyB0aGUgY29tbWFuZCBsaW5lIGFzIGEgdmVjdG9yIG9mIHN0cmluZ3MuCisvLworLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXRpbGl0aWVzOgorLy8gICBHZXRFbnYoKSAgICAgICAgICAgICAtIGdldHMgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBCb29sRnJvbUdUZXN0RW52KCkgICAtIHBhcnNlcyBhIGJvb2wgZW52aXJvbm1lbnQgdmFyaWFibGUuCisvLyAgIEludDMyRnJvbUdUZXN0RW52KCkgIC0gcGFyc2VzIGFuIEludDMyIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBTdHJpbmdGcm9tR1Rlc3RFbnYoKSAtIHBhcnNlcyBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworI2luY2x1ZGUgPGN0eXBlLmg+ICAgLy8gZm9yIGlzc3BhY2UsIGV0YworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHB0cmRpZmZfdAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisKKyNpZiBkZWZpbmVkIF9fQVBQTEVfXworIyBpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KKyMgaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGlvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN0cmluZz4gIC8vIE5PTElOVAorCisjZGVmaW5lIEdURVNUX0RFVl9FTUFJTF8gImdvb2dsZXRlc3RmcmFtZXdvcmtAQGdvb2dsZWdyb3Vwcy5jb20iCisjZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYXyAiZ3Rlc3RfIgorI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXyAiZ3Rlc3QtIgorI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIkdURVNUXyIKKyNkZWZpbmUgR1RFU1RfTkFNRV8gIkdvb2dsZSBUZXN0IgorI2RlZmluZSBHVEVTVF9QUk9KRUNUX1VSTF8gImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LyIKKworLy8gRGV0ZXJtaW5lcyB0aGUgdmVyc2lvbiBvZiBnY2MgdGhhdCBpcyB1c2VkIHRvIGNvbXBpbGUgdGhpcy4KKyNpZmRlZiBfX0dOVUNfXworLy8gNDAzMDIgbWVhbnMgdmVyc2lvbiA0LjMuMi4KKyMgZGVmaW5lIEdURVNUX0dDQ19WRVJfIFwKKyAgICAoX19HTlVDX18qMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyoxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQorI2VuZGlmICAvLyBfX0dOVUNfXworCisvLyBEZXRlcm1pbmVzIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCBHb29nbGUgVGVzdCBpcyBjb21waWxlZC4KKyNpZmRlZiBfX0NZR1dJTl9fCisjIGRlZmluZSBHVEVTVF9PU19DWUdXSU4gMQorI2VsaWYgZGVmaW5lZCBfX1NZTUJJQU4zMl9fCisjIGRlZmluZSBHVEVTVF9PU19TWU1CSUFOIDEKKyNlbGlmIGRlZmluZWQgX1dJTjMyCisjIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTIDEKKyMgaWZkZWYgX1dJTjMyX1dDRQorIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIDEKKyMgZWxpZiBkZWZpbmVkKF9fTUlOR1dfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX01JTkdXIDEKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAxCisjIGVuZGlmICAvLyBfV0lOMzJfV0NFCisjZWxpZiBkZWZpbmVkIF9fQVBQTEVfXworIyBkZWZpbmUgR1RFU1RfT1NfTUFDIDEKKyMgaWYgVEFSR0VUX09TX0lQSE9ORQorIyAgZGVmaW5lIEdURVNUX09TX0lPUyAxCisjICBpZiBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUgorIyAgIGRlZmluZSBHVEVTVF9PU19JT1NfU0lNVUxBVE9SIDEKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fbGludXhfXworIyBkZWZpbmUgR1RFU1RfT1NfTElOVVggMQorIyBpZiBkZWZpbmVkIF9fQU5EUk9JRF9fCisjICBkZWZpbmUgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAxCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fTVZTX18KKyMgZGVmaW5lIEdURVNUX09TX1pPUyAxCisjZWxpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkKKyMgZGVmaW5lIEdURVNUX09TX1NPTEFSSVMgMQorI2VsaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgR1RFU1RfT1NfQUlYIDEKKyNlbGlmIGRlZmluZWQoX19ocHV4KQorIyBkZWZpbmUgR1RFU1RfT1NfSFBVWCAxCisjZWxpZiBkZWZpbmVkIF9fbmF0aXZlX2NsaWVudF9fCisjIGRlZmluZSBHVEVTVF9PU19OQUNMIDEKKyNlbGlmIGRlZmluZWQgX19PcGVuQlNEX18KKyMgZGVmaW5lIEdURVNUX09TX09QRU5CU0QgMQorI2VsaWYgZGVmaW5lZCBfX1FOWF9fCisjIGRlZmluZSBHVEVTVF9PU19RTlggMQorI2VuZGlmICAvLyBfX0NZR1dJTl9fCisKKyNpZm5kZWYgR1RFU1RfTEFOR19DWFgxMQorLy8gZ2NjIGFuZCBjbGFuZyBkZWZpbmUgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gd2hlbgorLy8gLXN0ZD17YyxnbnV9Kyt7MHgsMTF9IGlzIHBhc3NlZC4gIFRoZSBDKysxMSBzdGFuZGFyZCBzcGVjaWZpZXMgYQorLy8gdmFsdWUgZm9yIF9fY3BsdXNwbHVzLCBhbmQgcmVjZW50IHZlcnNpb25zIG9mIGNsYW5nLCBnY2MsIGFuZAorLy8gcHJvYmFibHkgb3RoZXIgY29tcGlsZXJzIHNldCB0aGF0IHRvbyBpbiBDKysxMSBtb2RlLgorIyBpZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBDb21waWxpbmcgaW4gYXQgbGVhc3QgQysrMTEgbW9kZS4KKyMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDEKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0xBTkdfQ1hYMTEgMAorIyBlbmRpZgorI2VuZGlmCisKKy8vIEJyaW5ncyBpbiBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeAorLy8gbmFtZXNwYWNlIChyZWFkLCB3cml0ZSwgY2xvc2UsIGNoZGlyLCBpc2F0dHksIHN0YXQpLiBXZSBkbyBub3QgY3VycmVudGx5CisvLyB1c2UgdGhlbSBvbiBXaW5kb3dzIE1vYmlsZS4KKyNpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gVGhpcyBhc3N1bWVzIHRoYXQgbm9uLVdpbmRvd3MgT1NlcyBwcm92aWRlIHVuaXN0ZC5oLiBGb3IgT1NlcyB3aGVyZSB0aGlzCisvLyBpcyBub3QgdGhlIGNhc2UsIHdlIG5lZWQgdG8gaW5jbHVkZSBoZWFkZXJzIHRoYXQgcHJvdmlkZSB0aGUgZnVuY3Rpb25zCisvLyBtZW50aW9uZWQgYWJvdmUuCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2lmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKy8vIFVzZWQgdG8gZGVmaW5lIF9fQU5EUk9JRF9BUElfXyBtYXRjaGluZyB0aGUgdGFyZ2V0IE5ESyBBUEkgbGV2ZWwuCisjICBpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gRGVmaW5lcyB0aGlzIHRvIHRydWUgaWZmIEdvb2dsZSBUZXN0IGNhbiB1c2UgUE9TSVggcmVndWxhciBleHByZXNzaW9ucy4KKyNpZm5kZWYgR1RFU1RfSEFTX1BPU0lYX1JFCisjIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKy8vIE9uIEFuZHJvaWQsIDxyZWdleC5oPiBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyB3aXRoIEdpbmdlcmJyZWFkLgorIyAgZGVmaW5lIEdURVNUX0hBU19QT1NJWF9SRSAoX19BTkRST0lEX0FQSV9fID49IDkpCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9IQVNfUE9TSVhfUkUgKCFHVEVTVF9PU19XSU5ET1dTKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfUE9TSVhfUkUKKworLy8gT24gc29tZSBwbGF0Zm9ybXMsIDxyZWdleC5oPiBuZWVkcyBzb21lb25lIHRvIGRlZmluZSBzaXplX3QsIGFuZAorLy8gd29uJ3QgY29tcGlsZSBvdGhlcndpc2UuICBXZSBjYW4gI2luY2x1ZGUgaXQgaGVyZSBhcyB3ZSBhbHJlYWR5CisvLyBpbmNsdWRlZCA8c3RkbGliLmg+LCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGRlZmluZSBzaXplX3QgdGhyb3VnaAorLy8gPHN0ZGRlZi5oPi4KKyMgaW5jbHVkZSA8cmVnZXguaD4gIC8vIE5PTElOVAorCisjIGRlZmluZSBHVEVTVF9VU0VTX1BPU0lYX1JFIDEKKworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyA8cmVnZXguaD4gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLiAgVXNlIG91ciBvd24gc2ltcGxlIHJlZ2V4CisvLyBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgorIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQorCisjZWxzZQorCisvLyA8cmVnZXguaD4gbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4gIFVzZSBvdXIgb3duCisvLyBzaW1wbGUgcmVnZXggaW1wbGVtZW50YXRpb24gaW5zdGVhZC4KKyMgZGVmaW5lIEdURVNUX1VTRVNfU0lNUExFX1JFIDEKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUE9TSVhfUkUKKworI2lmbmRlZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBzbyB3ZSBuZWVkCisvLyB0byBmaWd1cmUgaXQgb3V0LgorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIE1TVkMncyBhbmQgQysrQnVpbGRlcidzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU1RMIHVzZSB0aGUgX0hBU19FWENFUFRJT05TCisvLyBtYWNybyB0byBlbmFibGUgZXhjZXB0aW9ucywgc28gd2UnbGwgZG8gdGhlIHNhbWUuCisvLyBBc3N1bWVzIHRoYXQgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorIyAgaWZuZGVmIF9IQVNfRVhDRVBUSU9OUworIyAgIGRlZmluZSBfSEFTX0VYQ0VQVElPTlMgMQorIyAgZW5kaWYgIC8vIF9IQVNfRVhDRVBUSU9OUworIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIF9IQVNfRVhDRVBUSU9OUworIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fRVhDRVBUSU9OUworLy8gZ2NjIGRlZmluZXMgX19FWENFUFRJT05TIHRvIDEgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBTdW4gUHJvIENDIHN1cHBvcnRzIGV4Y2VwdGlvbnMuICBIb3dldmVyLCB0aGVyZSBpcyBubyBjb21waWxlLXRpbWUgd2F5IG9mCisvLyBkZXRlY3Rpbmcgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG9yIG5vdC4gIFRoZXJlZm9yZSwgd2UgYXNzdW1lIHRoYXQKKy8vIHRoZXkgYXJlIGVuYWJsZWQgdW5sZXNzIHRoZSB1c2VyIHRlbGxzIHVzIG90aGVyd2lzZS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiBfX0VYQ0VQVElPTlMKKy8vIHhsQyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorLy8gRXhjZXB0aW9uIGhhbmRsaW5nIGlzIGluIGVmZmVjdCBieSBkZWZhdWx0IGluIEhQIGFDQyBjb21waWxlci4gSXQgaGFzIHRvCisvLyBiZSB0dXJuZWQgb2YgYnkgK25vZWggY29tcGlsZXIgb3B0aW9uIGlmIGRlc2lyZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbHNlCisvLyBGb3Igb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgdG8gYmUKKy8vIGNvbnNlcnZhdGl2ZS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAwCisjIGVuZGlmICAvLyBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworI2lmICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQorLy8gRXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgbWFjcm8gYW55IGxvbmdlciwgd2Uga2VlcCBpdCBpbiBjYXNlCisvLyBzb21lIGNsaWVudHMgc3RpbGwgZGVwZW5kIG9uIGl0LgorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9TVFJJTkcgMQorI2VsaWYgIUdURVNUX0hBU19TVERfU1RSSU5HCisvLyBUaGUgdXNlciB0b2xkIHVzIHRoYXQgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuCisjIGVycm9yICJHb29nbGUgVGVzdCBjYW5ub3QgYmUgdXNlZCB3aGVyZSA6OnN0ZDo6c3RyaW5nIGlzbid0IGF2YWlsYWJsZS4iCisjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQorCisjaWZuZGVmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKworIyBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyNpZm5kZWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiB1c2VzIGF1dG9jb25mIHRvIGRldGVjdCB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nCisvLyAgIGlzIGF2YWlsYWJsZS4KKworLy8gQ3lnd2luIDEuNyBhbmQgYmVsb3cgZG9lc24ndCBzdXBwb3J0IDo6c3RkOjp3c3RyaW5nLgorLy8gU29sYXJpcycgbGliYysrIGRvZXNuJ3Qgc3VwcG9ydCBpdCBlaXRoZXIuICBBbmRyb2lkIGhhcworLy8gbm8gc3VwcG9ydCBmb3IgaXQgYXQgbGVhc3QgYXMgcmVjZW50IGFzIEZyb3lvICgyLjIpLgorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9XU1RSSU5HIFwKKyAgICAoIShHVEVTVF9PU19MSU5VWF9BTkRST0lEIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTKSkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKyMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyBcCisgICAgKEdURVNUX0hBU19TVERfV1NUUklORyAmJiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORykKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIERldGVybWluZXMgd2hldGhlciBSVFRJIGlzIGF2YWlsYWJsZS4KKyNpZm5kZWYgR1RFU1RfSEFTX1JUVEkKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLCBzbyB3ZSBuZWVkIHRvCisvLyBmaWd1cmUgaXQgb3V0LgorCisjIGlmZGVmIF9NU0NfVkVSCisKKyMgIGlmZGVmIF9DUFBSVFRJICAvLyBNU1ZDIGRlZmluZXMgdGhpcyBtYWNybyBpZmYgUlRUSSBpcyBlbmFibGVkLgorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCisjICBlbHNlCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKKyMgIGVuZGlmCisKKy8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA0LjMuMiwgZ2NjIGRlZmluZXMgX19HWFhfUlRUSSBpZmYgUlRUSSBpcyBlbmFibGVkLgorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDMwMikKKworIyAgaWZkZWYgX19HWFhfUlRUSQorLy8gV2hlbiBidWlsZGluZyBhZ2FpbnN0IFNUTHBvcnQgd2l0aCB0aGUgQW5kcm9pZCBOREsgYW5kIHdpdGgKKy8vIC1mcnR0aSAtZm5vLWV4Y2VwdGlvbnMsIHRoZSBidWlsZCBmYWlscyBhdCBsaW5rIHRpbWUgd2l0aCB1bmRlZmluZWQKKy8vIHJlZmVyZW5jZXMgdG8gX19jeGFfYmFkX3R5cGVpZC4gTm90ZSBzdXJlIGlmIFNUTCBvciB0b29sY2hhaW4gYnVnLAorLy8gc28gZGlzYWJsZSBSVFRJIHdoZW4gZGV0ZWN0ZWQuCisjICAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBkZWZpbmVkKF9TVExQT1JUX01BSk9SKSAmJiBcCisgICAgICAgIWRlZmluZWQoX19FWENFUFRJT05TKQorIyAgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgIGVsc2UKKyMgICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBfX1NUTFBPUlRfTUFKT1IgJiYgIV9fRVhDRVBUSU9OUworIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjICBlbmRpZiAgLy8gX19HWFhfUlRUSQorCisvLyBDbGFuZyBkZWZpbmVzIF9fR1hYX1JUVEkgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuMCwgYnV0IGl0cyBtYW51YWwgcmVjb21tZW5kcworLy8gdXNpbmcgaGFzX2ZlYXR1cmUgaW5zdGVhZC4gaGFzX2ZlYXR1cmUoY3h4X3J0dGkpIGlzIHN1cHBvcnRlZCBzaW5jZSAyLjcsIHRoZQorLy8gZmlyc3QgdmVyc2lvbiB3aXRoIEMrKyBzdXBwb3J0LgorIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorCisjICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgX19oYXNfZmVhdHVyZShjeHhfcnR0aSkKKworLy8gU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDkuMCBJQk0gVmlzdWFsIEFnZSBkZWZpbmVzIF9fUlRUSV9BTExfXyB0byAxIGlmCisvLyBib3RoIHRoZSB0eXBlaWQgYW5kIGR5bmFtaWNfY2FzdCBmZWF0dXJlcyBhcmUgcHJlc2VudC4KKyMgZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDkwMCkKKworIyAgaWZkZWYgX19SVFRJX0FMTF9fCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgZW5kaWYKKworIyBlbHNlCisKKy8vIEZvciBhbGwgb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgUlRUSSBpcyBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKworIyBlbmRpZiAgLy8gX01TQ19WRVIKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQorCisvLyBJdCdzIHRoaXMgaGVhZGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgPHR5cGVpbmZvPiB3aGVuIFJUVEkKKy8vIGlzIGVuYWJsZWQuCisjaWYgR1RFU1RfSEFTX1JUVEkKKyMgaW5jbHVkZSA8dHlwZWluZm8+CisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuCisjaWZuZGVmIEdURVNUX0hBU19QVEhSRUFECisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBleHBsaWNpdGx5LCBzbyB3ZSBhc3N1bWUgcHRocmVhZHMgc3VwcG9ydCBpcworLy8gYXZhaWxhYmxlIG9uIExpbnV4IGFuZCBNYWMuCisvLworLy8gVG8gZGlzYWJsZSB0aHJlYWRpbmcgc3VwcG9ydCBpbiBHb29nbGUgVGVzdCwgYWRkIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAorLy8gdG8geW91ciBjb21waWxlciBmbGFncy4KKyMgZGVmaW5lIEdURVNUX0hBU19QVEhSRUFEIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfSFBVWCBcCisgICAgfHwgR1RFU1RfT1NfUU5YKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUFRIUkVBRAorCisjaWYgR1RFU1RfSEFTX1BUSFJFQUQKKy8vIGd0ZXN0LXBvcnQuaCBndWFyYW50ZWVzIHRvICNpbmNsdWRlIDxwdGhyZWFkLmg+IHdoZW4gR1RFU1RfSEFTX1BUSFJFQUQgaXMKKy8vIHRydWUuCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4gIC8vIE5PTElOVAorCisvLyBGb3IgdGltZXNwZWMgYW5kIG5hbm9zbGVlcCwgdXNlZCBiZWxvdy4KKyMgaW5jbHVkZSA8dGltZS5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdHIxL3R1cGxlLiAgWW91IGNhbiBkZWZpbmUKKy8vIHRoaXMgbWFjcm8gdG8gMCB0byBwcmV2ZW50IEdvb2dsZSBUZXN0IGZyb20gdXNpbmcgdHVwbGUgKGFueQorLy8gZmVhdHVyZSBkZXBlbmRpbmcgb24gdHVwbGUgd2l0aCBiZSBkaXNhYmxlZCBpbiB0aGlzIG1vZGUpLgorI2lmbmRlZiBHVEVTVF9IQVNfVFIxX1RVUExFCisjIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgZGVmaW5lZChfU1RMUE9SVF9NQUpPUikKKy8vIFNUTHBvcnQsIHByb3ZpZGVkIHdpdGggdGhlIEFuZHJvaWQgTkRLLCBoYXMgbmVpdGhlciA8dHIxL3R1cGxlPiBvciA8dHVwbGU+LgorIyAgZGVmaW5lIEdURVNUX0hBU19UUjFfVFVQTEUgMAorIyBlbHNlCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBub3QgdG8gZG8gaXQsIHNvIHdlIGFzc3VtZSBpdCdzIE9LLgorIyAgZGVmaW5lIEdURVNUX0hBU19UUjFfVFVQTEUgMQorIyBlbmRpZgorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24KKy8vIHNob3VsZCBiZSB1c2VkLgorI2lmbmRlZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworLy8gV2UgdXNlIG91ciBvd24gVFIxIHR1cGxlIGlmIHdlIGFyZW4ndCBzdXJlIHRoZSB1c2VyIGhhcyBhbgorLy8gaW1wbGVtZW50YXRpb24gb2YgaXQgYWxyZWFkeS4gIEF0IHRoaXMgdGltZSwgbGlic3RkYysrIDQuMC4wKyBhbmQKKy8vIE1TVkMgMjAxMCBhcmUgdGhlIG9ubHkgbWFpbnN0cmVhbSBzdGFuZGFyZCBsaWJyYXJpZXMgdGhhdCBjb21lCisvLyB3aXRoIGEgVFIxIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgTlZJRElBJ3MgQ1VEQSBOVkNDIGNvbXBpbGVyCisvLyBwcmV0ZW5kcyB0byBiZSBHQ0MgYnkgZGVmaW5pbmcgX19HTlVDX18gYW5kIGZyaWVuZHMsIGJ1dCBjYW5ub3QKKy8vIGNvbXBpbGUgR0NDJ3MgdHVwbGUgaW1wbGVtZW50YXRpb24uICBNU1ZDIDIwMDggKDkuMCkgcHJvdmlkZXMgVFIxCisvLyB0dXBsZSBpbiBhIDMyMyBNQiBGZWF0dXJlIFBhY2sgZG93bmxvYWQsIHdoaWNoIHdlIGNhbm5vdCBhc3N1bWUgdGhlCisvLyB1c2VyIGhhcy4gIFFOWCdzIFFDQyBjb21waWxlciBpcyBhIG1vZGlmaWVkIEdDQyBidXQgaXQgZG9lc24ndAorLy8gc3VwcG9ydCBUUjEgdHVwbGUuICBsaWJjKysgb25seSBwcm92aWRlcyBzdGQ6OnR1cGxlLCBpbiBDKysxMSBtb2RlLAorLy8gYW5kIGl0IGNhbiBiZSB1c2VkIHdpdGggc29tZSBjb21waWxlcnMgdGhhdCBkZWZpbmUgX19HTlVDX18uCisjIGlmIChkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0NVREFDQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApIFwKKyAgICAgICYmICFHVEVTVF9PU19RTlggJiYgIWRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKSkgfHwgX01TQ19WRVIgPj0gMTYwMAorIyAgZGVmaW5lIEdURVNUX0VOVl9IQVNfVFIxX1RVUExFXyAxCisjIGVuZGlmCisKKy8vIEMrKzExIHNwZWNpZmllcyB0aGF0IDx0dXBsZT4gcHJvdmlkZXMgc3RkOjp0dXBsZS4gVXNlIHRoYXQgaWYgZ3Rlc3QgaXMgdXNlZAorLy8gaW4gQysrMTEgbW9kZSBhbmQgbGlic3RkYysrIGlzbid0IHZlcnkgb2xkIChiaW5hcmllcyB0YXJnZXRpbmcgT1MgWCAxMC42CisvLyBjYW4gYnVpbGQgd2l0aCBjbGFuZyBidXQgbmVlZCB0byB1c2UgZ2NjNC4yJ3MgbGlic3RkYysrKS4KKyMgaWYgR1RFU1RfTEFOR19DWFgxMSAmJiAoIWRlZmluZWQoX19HTElCQ1hYX18pIHx8IF9fR0xJQkNYWF9fID4gMjAxMTAzMjUpCisjICBkZWZpbmUgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfIDEKKyMgZW5kaWYKKworIyBpZiBHVEVTVF9FTlZfSEFTX1RSMV9UVVBMRV8gfHwgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfCisjICBkZWZpbmUgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgMAorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgMQorIyBlbmRpZgorCisjZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisKKy8vIFRvIGF2b2lkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGV2ZXJ5d2hlcmUsIHdlIG1ha2UgaXQKKy8vIGd0ZXN0LXBvcnQuaCdzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIHRoZSBoZWFkZXIgaW1wbGVtZW50aW5nCisvLyB0cjEvdHVwbGUuCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorCisjIGlmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisjICBpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIgorIyBlbGlmIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXworIyAgaW5jbHVkZSA8dHVwbGU+CisvLyBDKysxMSBwdXRzIGl0cyB0dXBsZSBpbnRvIHRoZSA6OnN0ZCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4KKy8vIDo6c3RkOjp0cjEuICBndGVzdCBleHBlY3RzIHR1cGxlIHRvIGxpdmUgaW4gOjpzdGQ6OnRyMSwgc28gcHV0IGl0IHRoZXJlLgorLy8gVGhpcyBjYXVzZXMgdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgc3VwcG9ydGVkIGNvbXBpbGVycyByZWFjdCBpbgorLy8gdGhlIHdheSB3ZSBpbnRlbmQuCituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSB0cjEgewordXNpbmcgOjpzdGQ6OmdldDsKK3VzaW5nIDo6c3RkOjptYWtlX3R1cGxlOwordXNpbmcgOjpzdGQ6OnR1cGxlOwordXNpbmcgOjpzdGQ6OnR1cGxlX2VsZW1lbnQ7Cit1c2luZyA6OnN0ZDo6dHVwbGVfc2l6ZTsKK30KK30KKworIyBlbGlmIEdURVNUX09TX1NZTUJJQU4KKworLy8gT24gU3ltYmlhbiwgQk9PU1RfSEFTX1RSMV9UVVBMRSBjYXVzZXMgQm9vc3QncyBUUjEgdHVwbGUgbGlicmFyeSB0bworLy8gdXNlIFNUTHBvcnQncyB0dXBsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBkb2Vzbid0CisvLyB3b3JrIGFzIHRoZSBjb3B5IG9mIFNUTHBvcnQgZGlzdHJpYnV0ZWQgd2l0aCBTeW1iaWFuIGlzIGluY29tcGxldGUuCisvLyBCeSBtYWtpbmcgc3VyZSBCT09TVF9IQVNfVFIxX1RVUExFIGlzIHVuZGVmaW5lZCwgd2UgZm9yY2UgQm9vc3QgdG8KKy8vIHVzZSBpdHMgb3duIHR1cGxlIGltcGxlbWVudGF0aW9uLgorIyAgaWZkZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQorIyAgIHVuZGVmIEJPT1NUX0hBU19UUjFfVFVQTEUKKyMgIGVuZGlmICAvLyBCT09TVF9IQVNfVFIxX1RVUExFCisKKy8vIFRoaXMgcHJldmVudHMgPGJvb3N0L3RyMS9kZXRhaWwvY29uZmlnLmhwcD4sIHdoaWNoIGRlZmluZXMKKy8vIEJPT1NUX0hBU19UUjFfVFVQTEUsIGZyb20gYmVpbmcgI2luY2x1ZGVkIGJ5IEJvb3N0J3MgPHR1cGxlPi4KKyMgIGRlZmluZSBCT09TVF9UUjFfREVUQUlMX0NPTkZJR19IUFBfSU5DTFVERUQKKyMgIGluY2x1ZGUgPHR1cGxlPgorCisjIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMDAwKQorLy8gR0NDIDQuMCsgaW1wbGVtZW50cyB0cjEvdHVwbGUgaW4gdGhlIDx0cjEvdHVwbGU+IGhlYWRlci4gIFRoaXMgZG9lcworLy8gbm90IGNvbmZvcm0gdG8gdGhlIFRSMSBzcGVjLCB3aGljaCByZXF1aXJlcyB0aGUgaGVhZGVyIHRvIGJlIDx0dXBsZT4uCisKKyMgIGlmICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCisvLyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBnY2MgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIDx0cjEvZnVuY3Rpb25hbD4sCisvLyB3aGljaCBpcyAjaW5jbHVkZWQgYnkgPHRyMS90dXBsZT4sIHRvIG5vdCBjb21waWxlIHdoZW4gUlRUSSBpcworLy8gZGlzYWJsZWQuICBfVFIxX0ZVTkNUSU9OQUwgaXMgdGhlIGhlYWRlciBndWFyZCBmb3IKKy8vIDx0cjEvZnVuY3Rpb25hbD4uICBIZW5jZSB0aGUgZm9sbG93aW5nICNkZWZpbmUgaXMgYSBoYWNrIHRvIHByZXZlbnQKKy8vIDx0cjEvZnVuY3Rpb25hbD4gZnJvbSBiZWluZyBpbmNsdWRlZC4KKyMgICBkZWZpbmUgX1RSMV9GVU5DVElPTkFMIDEKKyMgICBpbmNsdWRlIDx0cjEvdHVwbGU+CisjICAgdW5kZWYgX1RSMV9GVU5DVElPTkFMICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gI2luY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDx0cjEvZnVuY3Rpb25hbD4gaWYgaGUgY2hvb3NlcyB0by4KKyMgIGVsc2UKKyMgICBpbmNsdWRlIDx0cjEvdHVwbGU+ICAvLyBOT0xJTlQKKyMgIGVuZGlmICAvLyAhR1RFU1RfSEFTX1JUVEkgJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDMwMgorCisjIGVsc2UKKy8vIElmIHRoZSBjb21waWxlciBpcyBub3QgR0NDIDQuMCssIHdlIGFzc3VtZSB0aGUgdXNlciBpcyB1c2luZyBhCisvLyBzcGVjLWNvbmZvcm1pbmcgVFIxIGltcGxlbWVudGF0aW9uLgorIyAgaW5jbHVkZSA8dHVwbGU+ICAvLyBOT0xJTlQKKyMgZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgY2xvbmUoMikgaXMgc3VwcG9ydGVkLgorLy8gVXN1YWxseSBpdCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIG9uIExpbnV4LCBleGNsdWRpbmcKKy8vIExpbnV4IG9uIHRoZSBJdGFuaXVtIGFyY2hpdGVjdHVyZS4KKy8vIEFsc28gc2VlIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi8yL2Nsb25lLgorI2lmbmRlZiBHVEVTVF9IQVNfQ0xPTkUKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgaWYgR1RFU1RfT1NfTElOVVggJiYgIWRlZmluZWQoX19pYTY0X18pCisjICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECisvLyBPbiBBbmRyb2lkLCBjbG9uZSgpIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEFSTSBzdGFydGluZyB3aXRoIEdpbmdlcmJyZWFkLgorIyAgICBpZiBkZWZpbmVkKF9fYXJtX18pICYmIF9fQU5EUk9JRF9BUElfXyA+PSA5CisjICAgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDEKKyMgICAgZWxzZQorIyAgICAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAwCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAxCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDAKKyMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYICYmICFkZWZpbmVkKF9faWE2NF9fKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19DTE9ORQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCBzdHJlYW0gcmVkaXJlY3Rpb24uIFRoaXMgaXMgdXNlZCB0byB0ZXN0CisvLyBvdXRwdXQgY29ycmVjdG5lc3MgYW5kIHRvIGltcGxlbWVudCBkZWF0aCB0ZXN0cy4KKyNpZm5kZWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorLy8gQnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgc3RyZWFtIHJlZGlyZWN0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbGwKKy8vIHBsYXRmb3JtcyBleGNlcHQga25vd24gbW9iaWxlIG9uZXMuCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDAKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04gMQorIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19TWU1CSUFOCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgZGVhdGggdGVzdHMuCisvLyBHb29nbGUgVGVzdCBkb2VzIG5vdCBzdXBwb3J0IGRlYXRoIHRlc3RzIGZvciBWQyA3LjEgYW5kIGVhcmxpZXIgYXMKKy8vIGFib3J0KCkgaW4gYSBWQyA3LjEgYXBwbGljYXRpb24gY29tcGlsZWQgYXMgR1VJIGluIGRlYnVnIGNvbmZpZworLy8gcG9wcyB1cCBhIGRpYWxvZyB3aW5kb3cgdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBwcm9ncmFtbWF0aWNhbGx5LgorI2lmIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUyB8fCBcCisgICAgIChHVEVTVF9PU19NQUMgJiYgIUdURVNUX09TX0lPUykgfHwgR1RFU1RfT1NfSU9TX1NJTVVMQVRPUiB8fCBcCisgICAgIChHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgJiYgX01TQ19WRVIgPj0gMTQwMCkgfHwgXAorICAgICBHVEVTVF9PU19XSU5ET1dTX01JTkdXIHx8IEdURVNUX09TX0FJWCB8fCBHVEVTVF9PU19IUFVYIHx8IFwKKyAgICAgR1RFU1RfT1NfT1BFTkJTRCB8fCBHVEVTVF9PU19RTlgpCisjIGRlZmluZSBHVEVTVF9IQVNfREVBVEhfVEVTVCAxCisjIGluY2x1ZGUgPHZlY3Rvcj4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIFdlIGRvbid0IHN1cHBvcnQgTVNWQyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkIG5vdy4gIFRoZXJlZm9yZQorLy8gYWxsIHRoZSBjb21waWxlcnMgd2UgY2FyZSBhYm91dCBhcmUgYWRlcXVhdGUgZm9yIHN1cHBvcnRpbmcKKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisjZGVmaW5lIEdURVNUX0hBU19QQVJBTV9URVNUIDEKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgdHlwZS1kcml2ZW4gdGVzdHMuCisKKy8vIFR5cGVkIHRlc3RzIG5lZWQgPHR5cGVpbmZvPiBhbmQgdmFyaWFkaWMgbWFjcm9zLCB3aGljaCBHQ0MsIFZDKysgOC4wLAorLy8gU3VuIFBybyBDQywgSUJNIFZpc3VhbCBBZ2UsIGFuZCBIUCBhQ0Mgc3VwcG9ydC4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoX01TQ19WRVIgPj0gMTQwMCkgfHwgZGVmaW5lZChfX1NVTlBST19DQykgfHwgXAorICAgIGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX0hQX2FDQykKKyMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUIDEKKyMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUX1AgMQorI2VuZGlmCisKKy8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IENvbWJpbmUoKS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4KKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gZG9lc24ndAorLy8gd29yayBvbiBTdW4gU3R1ZGlvIHNpbmNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0ZW1wbGF0ZWQgY29udmVyc2lvbgorLy8gb3BlcmF0b3JzLgorI2lmIEdURVNUX0hBU19QQVJBTV9URVNUICYmIEdURVNUX0hBU19UUjFfVFVQTEUgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCisjIGRlZmluZSBHVEVTVF9IQVNfQ09NQklORSAxCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzeXN0ZW0gY29tcGlsZXIgdXNlcyBVVEYtMTYgZm9yIGVuY29kaW5nIHdpZGUgc3RyaW5ncy4KKyNkZWZpbmUgR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8gXAorICAgIChHVEVTVF9PU19XSU5ET1dTIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX0FJWCkKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRlc3QgcmVzdWx0cyBjYW4gYmUgc3RyZWFtZWQgdG8gYSBzb2NrZXQuCisjaWYgR1RFU1RfT1NfTElOVVgKKyMgZGVmaW5lIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18gMQorI2VuZGlmCisKKy8vIERlZmluZXMgc29tZSB1dGlsaXR5IG1hY3Jvcy4KKworLy8gVGhlIEdOVSBjb21waWxlciBlbWl0cyBhIHdhcm5pbmcgaWYgbmVzdGVkICJpZiIgc3RhdGVtZW50cyBhcmUgZm9sbG93ZWQgYnkKKy8vIGFuICJlbHNlIiBzdGF0ZW1lbnQgYW5kIGJyYWNlcyBhcmUgbm90IHVzZWQgdG8gZXhwbGljaXRseSBkaXNhbWJpZ3VhdGUgdGhlCisvLyAiZWxzZSIgYmluZGluZy4gIFRoaXMgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBjb2RlIGxpa2U6CisvLworLy8gICBpZiAoZ2F0ZSkKKy8vICAgICBBU1NFUlRfKihjb25kaXRpb24pIDw8ICJTb21lIG1lc3NhZ2UiOworLy8KKy8vIFRoZSAic3dpdGNoICgwKSBjYXNlIDA6IiBpZGlvbSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoaXMuCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorIyBkZWZpbmUgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8KKyNlbHNlCisjIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBzd2l0Y2ggKDApIGNhc2UgMDogZGVmYXVsdDogIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIFVzZSB0aGlzIGFubm90YXRpb24gYXQgdGhlIGVuZCBvZiBhIHN0cnVjdC9jbGFzcyBkZWZpbml0aW9uIHRvCisvLyBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcgYXdheSBpbnN0YW5jZXMgdGhhdCBhcmUgbmV2ZXIKKy8vIHVzZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFsbCBpbnRlcmVzdGluZyBsb2dpYyBoYXBwZW5zIGluc2lkZSB0aGUKKy8vIGMndG9yIGFuZCAvIG9yIGQndG9yLiAgRXhhbXBsZToKKy8vCisvLyAgIHN0cnVjdCBGb28geworLy8gICAgIEZvbygpIHsgLi4uIH0KKy8vICAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKy8vCisvLyBBbHNvIHVzZSBpdCBhZnRlciBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlciBkZWNsYXJhdGlvbiB0byB0ZWxsIHRoZQorLy8gY29tcGlsZXIgdGhlIHZhcmlhYmxlL3BhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQuCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ09NUElMRVJfSUNDKQorIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8KKyNlbmRpZgorCisvLyBBIG1hY3JvIHRvIGRpc2FsbG93IG9wZXJhdG9yPQorLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLgorI2RlZmluZSBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpXAorICB2b2lkIG9wZXJhdG9yPSh0eXBlIGNvbnN0ICYpCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CisvLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCisjZGVmaW5lIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8odHlwZSlcCisgIHR5cGUodHlwZSBjb25zdCAmKTtcCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSkKKworLy8gVGVsbCB0aGUgY29tcGlsZXIgdG8gd2FybiBhYm91dCB1bnVzZWQgcmV0dXJuIHZhbHVlcyBmb3IgZnVuY3Rpb25zIGRlY2xhcmVkCisvLyB3aXRoIHRoaXMgbWFjcm8uICBUaGUgbWFjcm8gc2hvdWxkIGJlIHVzZWQgb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zCisvLyBmb2xsb3dpbmcgdGhlIGFyZ3VtZW50IGxpc3Q6CisvLworLy8gICBTcHJvY2tldCogQWxsb2NhdGVTcHJvY2tldCgpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCisjIGRlZmluZSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8KKyNlbmRpZiAgLy8gX19HTlVDX18gJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhQ09NUElMRVJfSUNDCisKKy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyBNaWNyb3NvZnQncyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbgorLy8gSGFuZGxpbmcuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBzZXZlcmFsIFdpbmRvd3MgY29tcGlsZXJzIGJ1dCBnZW5lcmFsbHkKKy8vIGRvZXMgbm90IGV4aXN0IG9uIGFueSBvdGhlciBzeXN0ZW0uCisjaWZuZGVmIEdURVNUX0hBU19TRUgKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisvLyBUaGVzZSB0d28gY29tcGlsZXJzIGFyZSBrbm93biB0byBzdXBwb3J0IFNFSC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDEKKyMgZWxzZQorLy8gQXNzdW1lIG5vIFNFSC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDAKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyNpZmRlZiBfTVNDX1ZFUgorCisjIGlmIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorIyAgZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjIGVsaWYgR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZCisjICBkZWZpbmUgR1RFU1RfQVBJXyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgZW5kaWYKKworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIEdURVNUX0FQSV8KKyMgZGVmaW5lIEdURVNUX0FQSV8KKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKy8vIEFzayB0aGUgY29tcGlsZXIgdG8gbmV2ZXIgaW5saW5lIGEgZ2l2ZW4gZnVuY3Rpb24uCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfCisjZW5kaWYKKworLy8gX0xJQkNQUF9WRVJTSU9OIGlzIGRlZmluZWQgYnkgdGhlIGxpYmMrKyBsaWJyYXJ5IGZyb20gdGhlIExMVk0gcHJvamVjdC4KKyNpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKSB8fCBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikKKyMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMAorI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBzZWNyZXQgdHlwZSB0aGF0IEdvb2dsZSBUZXN0IHVzZXJzIGRvbid0IGtub3cgYWJvdXQuICBJdCBoYXMgbm8KKy8vIGRlZmluaXRpb24gb24gcHVycG9zZS4gIFRoZXJlZm9yZSBpdCdzIGltcG9zc2libGUgdG8gY3JlYXRlIGEKKy8vIFNlY3JldCBvYmplY3QsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4KK2NsYXNzIFNlY3JldDsKKworLy8gVGhlIEdURVNUX0NPTVBJTEVfQVNTRVJUXyBtYWNybyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNvbXBpbGUgdGltZQorLy8gZXhwcmVzc2lvbiBpcyB0cnVlLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSBpdCB0byB2ZXJpZnkgdGhlCisvLyBzaXplIG9mIGEgc3RhdGljIGFycmF5OgorLy8KKy8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKEFSUkFZU0laRShjb250ZW50X3R5cGVfbmFtZXMpID09IENPTlRFTlRfTlVNX1RZUEVTLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlX25hbWVzX2luY29ycmVjdF9zaXplKTsKKy8vCisvLyBvciB0byBtYWtlIHN1cmUgYSBzdHJ1Y3QgaXMgc21hbGxlciB0aGFuIGEgY2VydGFpbiBzaXplOgorLy8KKy8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsKKy8vCisvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBtYWNybyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIElmCisvLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3IKKy8vIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgorCit0ZW1wbGF0ZSA8Ym9vbD4KK3N0cnVjdCBDb21waWxlQXNzZXJ0IHsKK307CisKKyNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgXAorICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnQ8KHN0YXRpY19jYXN0PGJvb2w+KGV4cHIpKT4gXAorICAgICAgbXNnW3N0YXRpY19jYXN0PGJvb2w+KGV4cHIpID8gMSA6IC0xXSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXworCisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIEdURVNUX0NPTVBJTEVfQVNTRVJUXzoKKy8vCisvLyAtIEdURVNUX0NPTVBJTEVfQVNTRVJUXyB3b3JrcyBieSBkZWZpbmluZyBhbiBhcnJheSB0eXBlIHRoYXQgaGFzIC0xCisvLyAgIGVsZW1lbnRzIChhbmQgdGh1cyBpcyBpbnZhbGlkKSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLgorLy8KKy8vIC0gVGhlIHNpbXBsZXIgZGVmaW5pdGlvbgorLy8KKy8vICAgICNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdCisvLworLy8gICBkb2VzIG5vdCB3b3JrLCBhcyBnY2Mgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyB3aG9zZSBzaXplcworLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0CisvLyAgIG9mIHRoZSBDKysgc3RhbmRhcmQpLiAgQXMgYSByZXN1bHQsIGdjYyBmYWlscyB0byByZWplY3QgdGhlCisvLyAgIGZvbGxvd2luZyBjb2RlIHdpdGggdGhlIHNpbXBsZSBkZWZpbml0aW9uOgorLy8KKy8vICAgICBpbnQgZm9vOworLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhmb28sIG1zZyk7IC8vIG5vdCBzdXBwb3NlZCB0byBjb21waWxlIGFzIGZvbyBpcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KKy8vCisvLyAtIEJ5IHVzaW5nIHRoZSB0eXBlIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiwgd2UgZW5zdXJlcyB0aGF0CisvLyAgIGV4cHIgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuICAoVGVtcGxhdGUgYXJndW1lbnRzIG11c3QgYmUKKy8vICAgZGV0ZXJtaW5lZCBhdCBjb21waWxlLXRpbWUuKQorLy8KKy8vIC0gVGhlIG91dHRlciBwYXJlbnRoZXNlcyBpbiBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gYXJlIG5lY2Vzc2FyeQorLy8gICB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMy40LjQgYW5kIDQuMC4xLiAgSWYgd2UgaGFkIHdyaXR0ZW4KKy8vCisvLyAgICAgQ29tcGlsZUFzc2VydDxib29sKGV4cHIpPgorLy8KKy8vICAgaW5zdGVhZCwgdGhlc2UgY29tcGlsZXJzIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUKKy8vCisvLyAgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKDUgPiAwLCBzb21lX21lc3NhZ2UpOworLy8KKy8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUKKy8vICAgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4pCisvLworLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5CisvLworLy8gICAgICgoZXhwcikgPyAxIDogLTEpLgorLy8KKy8vICAgVGhpcyBpcyB0byBhdm9pZCBydW5uaW5nIGludG8gYSBidWcgaW4gTVMgVkMgNy4xLCB3aGljaAorLy8gICBjYXVzZXMgKCgwLjApID8gMSA6IC0xKSB0byBpbmNvcnJlY3RseSBldmFsdWF0ZSB0byAxLgorCisvLyBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXIgaXMgdXNlZCBieSBTdGF0aWNBc3NlcnRUeXBlRXEgZGVmaW5lZCBpbiBndGVzdC5oLgorLy8KKy8vIFRoaXMgdGVtcGxhdGUgaXMgZGVjbGFyZWQsIGJ1dCBpbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VCwgVD4ge307CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwordHlwZWRlZiA6OnN0cmluZyBzdHJpbmc7CisjZWxzZQordHlwZWRlZiA6OnN0ZDo6c3RyaW5nIHN0cmluZzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwordHlwZWRlZiA6OndzdHJpbmcgd3N0cmluZzsKKyNlbGlmIEdURVNUX0hBU19TVERfV1NUUklORwordHlwZWRlZiA6OnN0ZDo6d3N0cmluZyB3c3RyaW5nOworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gQSBoZWxwZXIgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIGNvbnN0YW50IGNvbmRpdGlvbi4gIEl0IGp1c3QKKy8vIHJldHVybnMgJ2NvbmRpdGlvbicuCitHVEVTVF9BUElfIGJvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKTsKKworLy8gRGVmaW5lcyBzY29wZWRfcHRyLgorCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHNjb3BlZF9wdHIgaXMgUEFSVElBTCAtIGl0IG9ubHkgY29udGFpbnMKKy8vIGVub3VnaCBzdHVmZiB0byBzYXRpc2Z5IEdvb2dsZSBUZXN0J3MgbmVlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3Mgc2NvcGVkX3B0ciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworCisgIGV4cGxpY2l0IHNjb3BlZF9wdHIoVCogcCA9IE5VTEwpIDogcHRyXyhwKSB7fQorICB+c2NvcGVkX3B0cigpIHsgcmVzZXQoKTsgfQorCisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpwdHJfOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKworICBUKiByZWxlYXNlKCkgeworICAgIFQqIGNvbnN0IHB0ciA9IHB0cl87CisgICAgcHRyXyA9IE5VTEw7CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIHZvaWQgcmVzZXQoVCogcCA9IE5VTEwpIHsKKyAgICBpZiAocCAhPSBwdHJfKSB7CisgICAgICBpZiAoSXNUcnVlKHNpemVvZihUKSA+IDApKSB7ICAvLyBNYWtlcyBzdXJlIFQgaXMgYSBjb21wbGV0ZSB0eXBlLgorICAgICAgICBkZWxldGUgcHRyXzsKKyAgICAgIH0KKyAgICAgIHB0cl8gPSBwOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgVCogcHRyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKHNjb3BlZF9wdHIpOworfTsKKworLy8gRGVmaW5lcyBSRS4KKworLy8gQSBzaW1wbGUgQysrIHdyYXBwZXIgZm9yIDxyZWdleC5oPi4gIEl0IHVzZXMgdGhlIFBPU0lYIEV4dGVuZGVkCisvLyBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4LgorY2xhc3MgR1RFU1RfQVBJXyBSRSB7CisgcHVibGljOgorICAvLyBBIGNvcHkgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgYnkgdGhlIFN0YW5kYXJkIHRvIGluaXRpYWxpemUgb2JqZWN0CisgIC8vIHJlZmVyZW5jZXMgZnJvbSByLXZhbHVlcy4KKyAgUkUoY29uc3QgUkUmIG90aGVyKSB7IEluaXQob3RoZXIucGF0dGVybigpKTsgfQorCisgIC8vIENvbnN0cnVjdHMgYW4gUkUgZnJvbSBhIHN0cmluZy4KKyAgUkUoY29uc3QgOjpzdGQ6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IGNoYXIqIHJlZ2V4KSB7IEluaXQocmVnZXgpOyB9ICAvLyBOT0xJTlQKKyAgflJFKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleC4KKyAgY29uc3QgY2hhciogcGF0dGVybigpIGNvbnN0IHsgcmV0dXJuIHBhdHRlcm5fOyB9CisKKyAgLy8gRnVsbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMKKyAgLy8gdGhlIGVudGlyZSBzdHIuCisgIC8vIFBhcnRpYWxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZQorICAvLyBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0ciAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorICAvLworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogbWFrZSBGdWxsTWF0Y2goKSBhbmQgUGFydGlhbE1hdGNoKCkgd29yaworICAvLyB3aGVuIHN0ciBjb250YWlucyBOVUwgY2hhcmFjdGVycy4KKyAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgeworICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisKKyBwcml2YXRlOgorICB2b2lkIEluaXQoY29uc3QgY2hhciogcmVnZXgpOworCisgIC8vIFdlIHVzZSBhIGNvbnN0IGNoYXIqIGluc3RlYWQgb2YgYW4gc3RkOjpzdHJpbmcsIGFzIEdvb2dsZSBUZXN0IHVzZWQgdG8gYmUKKyAgLy8gdXNlZCB3aGVyZSBzdGQ6OnN0cmluZyBpcyBub3QgYXZhaWxhYmxlLiAgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGNoYW5nZSB0bworICAvLyBzdGQ6OnN0cmluZy4KKyAgY29uc3QgY2hhciogcGF0dGVybl87CisgIGJvb2wgaXNfdmFsaWRfOworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisgIHJlZ2V4X3QgZnVsbF9yZWdleF87ICAgICAvLyBGb3IgRnVsbE1hdGNoKCkuCisgIHJlZ2V4X3QgcGFydGlhbF9yZWdleF87ICAvLyBGb3IgUGFydGlhbE1hdGNoKCkuCisKKyNlbHNlICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisgIGNvbnN0IGNoYXIqIGZ1bGxfcGF0dGVybl87ICAvLyBGb3IgRnVsbE1hdGNoKCk7CisKKyNlbmRpZgorCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUkUpOworfTsKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisvLyBGb3JtYXRzIGEgZmlsZSBsb2NhdGlvbiBmb3IgY29tcGlsZXItaW5kZXBlbmRlbnQgWE1MIG91dHB1dC4KKy8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCwgd2UgcHV0IGl0IG5leHQgdG8KKy8vIEZvcm1hdEZpbGVMb2NhdGlvbiBpbiBvcmRlciB0byBjb250cmFzdCB0aGUgdHdvIGZ1bmN0aW9ucy4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7CisKKy8vIERlZmluZXMgbG9nZ2luZyB1dGlsaXRpZXM6CisvLyAgIEdURVNUX0xPR18oc2V2ZXJpdHkpIC0gbG9ncyBtZXNzYWdlcyBhdCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5IGxldmVsLiBUaGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGl0c2VsZiBpcyBzdHJlYW1lZCBpbnRvIHRoZSBtYWNyby4KKy8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCisKK2VudW0gR1Rlc3RMb2dTZXZlcml0eSB7CisgIEdURVNUX0lORk8sCisgIEdURVNUX1dBUk5JTkcsCisgIEdURVNUX0VSUk9SLAorICBHVEVTVF9GQVRBTAorfTsKKworLy8gRm9ybWF0cyBsb2cgZW50cnkgc2V2ZXJpdHksIHByb3ZpZGVzIGEgc3RyZWFtIG9iamVjdCBmb3Igc3RyZWFtaW5nIHRoZQorLy8gbG9nIG1lc3NhZ2UsIGFuZCB0ZXJtaW5hdGVzIHRoZSBtZXNzYWdlIHdpdGggYSBuZXdsaW5lIHdoZW4gZ29pbmcgb3V0IG9mCisvLyBzY29wZS4KK2NsYXNzIEdURVNUX0FQSV8gR1Rlc3RMb2cgeworIHB1YmxpYzoKKyAgR1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisgIC8vIEZsdXNoZXMgdGhlIGJ1ZmZlcnMgYW5kLCBpZiBzZXZlcml0eSBpcyBHVEVTVF9GQVRBTCwgYWJvcnRzIHRoZSBwcm9ncmFtLgorICB+R1Rlc3RMb2coKTsKKworICA6OnN0ZDo6b3N0cmVhbSYgR2V0U3RyZWFtKCkgeyByZXR1cm4gOjpzdGQ6OmNlcnI7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHlfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RMb2cpOworfTsKKworI2RlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RMb2coOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfIyNzZXZlcml0eSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykuR2V0U3RyZWFtKCkKKworaW5saW5lIHZvaWQgTG9nVG9TdGRlcnIoKSB7fQoraW5saW5lIHZvaWQgRmx1c2hJbmZvTG9nKCkgeyBmZmx1c2goTlVMTCk7IH0KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFLgorLy8KKy8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uCisvLyBpcyBub3Qgc2F0aXNmaWVkLgorLy8gIFN5bm9wc3lzOgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsKKy8vICAgICBvcgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKSA8PCAiQWRkaXRpb25hbCBtZXNzYWdlIjsKKy8vCisvLyAgICBUaGlzIGNoZWNrcyB0aGUgY29uZGl0aW9uIGFuZCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKKy8vICAgIGl0IHByaW50cyBtZXNzYWdlIGFib3V0IHRoZSBjb25kaXRpb24gdmlvbGF0aW9uLCBpbmNsdWRpbmcgdGhlCisvLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksCisvLyAgICBhbmQgdGhlbiBpdCBhYm9ydHMgdGhlIHByb2dyYW0uIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpcnJlc3BlY3RpdmUgb2YKKy8vICAgIHdoZXRoZXIgaXQgaXMgYnVpbHQgaW4gdGhlIGRlYnVnIG1vZGUgb3Igbm90LgorI2RlZmluZSBHVEVTVF9DSEVDS18oY29uZGl0aW9uKSBcCisgICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoY29uZGl0aW9uKSkgXAorICAgICAgOyBcCisgICAgZWxzZSBcCisgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiQ29uZGl0aW9uICIgI2NvbmRpdGlvbiAiIGZhaWxlZC4gIgorCisvLyBBbiBhbGwtbW9kZSBhc3NlcnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFBPU0lYLXN0eWxlIGZ1bmN0aW9uCisvLyBjYWxsIHJldHVybnMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKS4gIEtub3duIGxpbWl0YXRpb246IHRoaXMKKy8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvCisvLyBpbiB7fSBpZiB5b3UgbmVlZCB0byB1c2UgaXQgYXMgdGhlIG9ubHkgc3RhdGVtZW50IGluIGFuICdpZicKKy8vIGJyYW5jaC4KKyNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXAorICBpZiAoY29uc3QgaW50IGd0ZXN0X2Vycm9yID0gKHBvc2l4X2NhbGwpKSBcCisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgI3Bvc2l4X2NhbGwgPDwgImZhaWxlZCB3aXRoIGVycm9yICIgXAorICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVXNlIEltcGxpY2l0Q2FzdF8gYXMgYSBzYWZlIHZlcnNpb24gb2Ygc3RhdGljX2Nhc3QgZm9yIHVwY2FzdGluZyBpbgorLy8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuIGNhc3RpbmcgYSBGb28qIHRvIGEgU3VwZXJjbGFzc09mRm9vKiBvciBhCisvLyBjb25zdCBGb28qKS4gIFdoZW4geW91IHVzZSBJbXBsaWNpdENhc3RfLCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQKKy8vIHRoZSBjYXN0IGlzIHNhZmUuICBTdWNoIGV4cGxpY2l0IEltcGxpY2l0Q2FzdF9zIGFyZSBuZWNlc3NhcnkgaW4KKy8vIHN1cnByaXNpbmdseSBtYW55IHNpdHVhdGlvbnMgd2hlcmUgQysrIGRlbWFuZHMgYW4gZXhhY3QgdHlwZSBtYXRjaAorLy8gaW5zdGVhZCBvZiBhbiBhcmd1bWVudCB0eXBlIGNvbnZlcnRhYmxlIHRvIGEgdGFyZ2V0IHR5cGUuCisvLworLy8gVGhlIHN5bnRheCBmb3IgdXNpbmcgSW1wbGljaXRDYXN0XyBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljX2Nhc3Q6CisvLworLy8gICBJbXBsaWNpdENhc3RfPFRvVHlwZT4oZXhwcikKKy8vCisvLyBJbXBsaWNpdENhc3RfIHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwKKy8vIGJ1dCB0aGUgcHJvcG9zYWwgd2FzIHN1Ym1pdHRlZCB0b28gbGF0ZS4gIEl0IHdpbGwgcHJvYmFibHkgbWFrZQorLy8gaXRzIHdheSBpbnRvIHRoZSBsYW5ndWFnZSBpbiB0aGUgZnV0dXJlLgorLy8KKy8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAorLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGltcGxpY2l0X2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbz4KK2lubGluZSBUbyBJbXBsaWNpdENhc3RfKFRvIHgpIHsgcmV0dXJuIHg7IH0KKworLy8gV2hlbiB5b3UgdXBjYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tIHR5cGUgRm9vIHRvIHR5cGUKKy8vIFN1cGVyY2xhc3NPZkZvbyksIGl0J3MgZmluZSB0byB1c2UgSW1wbGljaXRDYXN0Xzw+LCBzaW5jZSB1cGNhc3RzCisvLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tCisvLyB0eXBlIEZvbyB0byB0eXBlIFN1YmNsYXNzT2ZGb28pLCBzdGF0aWNfY2FzdDw+IGlzbid0IHNhZmUsIGJlY2F1c2UKKy8vIGhvdyBkbyB5b3Uga25vdyB0aGUgcG9pbnRlciBpcyByZWFsbHkgb2YgdHlwZSBTdWJjbGFzc09mRm9vPyAgSXQKKy8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsCisvLyB3aGVuIHlvdSBkb3duY2FzdCwgeW91IHNob3VsZCB1c2UgdGhpcyBtYWNyby4gIEluIGRlYnVnIG1vZGUsIHdlCisvLyB1c2UgZHluYW1pY19jYXN0PD4gdG8gZG91YmxlLWNoZWNrIHRoZSBkb3duY2FzdCBpcyBsZWdhbCAod2UgZGllCisvLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+CisvLyBpbnN0ZWFkLiAgVGh1cywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBpbiBkZWJ1ZyBtb2RlIHRvIG1ha2Ugc3VyZQorLy8gdGhlIGNhc3QgaXMgbGVnYWwhCisvLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uCisvLyBJbiBwYXJ0aWN1bGFyLCB5b3UgU0hPVUxETidUIGJlIHVzaW5nIGR5bmFtaWNfY2FzdDw+IGluIG9yZGVyIHRvCisvLyBkbyBSVFRJIChlZyBjb2RlIGxpa2UgdGhpczoKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7CisvLyAgICBpZiAoZHluYW1pY19jYXN0PFN1YmNsYXNzMj4oZm9vKSkgSGFuZGxlQVN1YmNsYXNzMk9iamVjdChmb28pOworLy8gWW91IHNob3VsZCBkZXNpZ24gdGhlIGNvZGUgc29tZSBvdGhlciB3YXkgbm90IHRvIG5lZWQgdGhpcy4KKy8vCisvLyBUaGlzIHJlbGF0aXZlbHkgdWdseSBuYW1lIGlzIGludGVudGlvbmFsLiBJdCBwcmV2ZW50cyBjbGFzaGVzIHdpdGgKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIHVzZXJzIG1heSBoYXZlIChlLmcuLCBkb3duX2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gIC8vIHVzZSBsaWtlIHRoaXM6IERvd25DYXN0XzxUKj4oZm9vKTsKK2lubGluZSBUbyBEb3duQ2FzdF8oRnJvbSogZikgeyAgLy8gc28gd2Ugb25seSBhY2NlcHQgcG9pbnRlcnMKKyAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQorICAvLyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcsIGFuZCBoYXMgbm8gb3ZlcmhlYWQgaW4gYW4KKyAgLy8gb3B0aW1pemVkIGJ1aWxkIGF0IHJ1bi10aW1lLCBhcyBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5CisgIC8vIGNvbXBsZXRlbHkuCisgIGlmIChmYWxzZSkgeworICAgIGNvbnN0IFRvIHRvID0gTlVMTDsKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7CisgIH0KKworI2lmIEdURVNUX0hBU19SVFRJCisgIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKKyAgR1RFU1RfQ0hFQ0tfKGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Cit9CisKKy8vIERvd25jYXN0cyB0aGUgcG9pbnRlciBvZiB0eXBlIEJhc2UgdG8gRGVyaXZlZC4KKy8vIERlcml2ZWQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEJhc2UuIFRoZSBwYXJhbWV0ZXIgTVVTVAorLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuCisvLyBXaGVuIFJUVEkgaXMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgYSBydW50aW1lCisvLyBjaGVjayB0byBlbmZvcmNlIHRoaXMuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4KK0Rlcml2ZWQqIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZShCYXNlKiBiYXNlKSB7CisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBOT0xJTlQKKyNlbHNlCisgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0LgorI2VuZGlmCit9CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoKKy8vICAgQ2FwdHVyZVN0ZG91dCAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KKy8vICAgR2V0Q2FwdHVyZWRTdGRvdXQgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCisvLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorLy8KK0dURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7CitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7CitHVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOworR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0SW5qZWN0YWJsZUFyZ3ZzKCk7Cit2b2lkIFNldEluamVjdGFibGVBcmd2cyhjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYXJndnMpOworCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KK2V4dGVybiA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGdfYXJndnM7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRGVmaW5lcyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKworI2lmIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFNsZWVwcyBmb3IgKHJvdWdobHkpIG4gbWlsbGktc2Vjb25kcy4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IKKy8vIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gIERvbid0IHVzZSBpdCBpbiB1c2VyIHRlc3RzLAorLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitpbmxpbmUgdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbikgeworICBjb25zdCB0aW1lc3BlYyB0aW1lID0geworICAgIDAsICAgICAgICAgICAgICAgICAgLy8gMCBzZWNvbmRzLgorICAgIG4gKiAxMDAwTCAqIDEwMDBMLCAgLy8gQW5kIG4gbXMuCisgIH07CisgIG5hbm9zbGVlcCgmdGltZSwgTlVMTCk7Cit9CisKKy8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCisvLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCisvLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90CisvLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBOb3RpZmljYXRpb24geworIHB1YmxpYzoKKyAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOworICB9CisgIH5Ob3RpZmljYXRpb24oKSB7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pOworICB9CisKKyAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0CisgIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKyAgdm9pZCBOb3RpZnkoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOworICAgIG5vdGlmaWVkXyA9IHRydWU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgIH0KKworICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAorICAvLyB0aHJlYWQuCisgIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7CisgICAgICBjb25zdCBib29sIG5vdGlmaWVkID0gbm90aWZpZWRfOworICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgICAgICBpZiAobm90aWZpZWQpCisgICAgICAgIGJyZWFrOworICAgICAgU2xlZXBNaWxsaXNlY29uZHMoMTApOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKKyAgYm9vbCBub3RpZmllZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOworfTsKKworLy8gQXMgYSBDLWZ1bmN0aW9uLCBUaHJlYWRGdW5jV2l0aENMaW5rYWdlIGNhbm5vdCBiZSB0ZW1wbGF0ZWQgaXRzZWxmLgorLy8gQ29uc2VxdWVudGx5LCBpdCBjYW5ub3Qgc2VsZWN0IGEgY29ycmVjdCBpbnN0YW50aWF0aW9uIG9mIFRocmVhZFdpdGhQYXJhbQorLy8gaW4gb3JkZXIgdG8gY2FsbCBpdHMgUnVuKCkuIEludHJvZHVjaW5nIFRocmVhZFdpdGhQYXJhbUJhc2UgYXMgYQorLy8gbm9uLXRlbXBsYXRlZCBiYXNlIGNsYXNzIGZvciBUaHJlYWRXaXRoUGFyYW0gYWxsb3dzIHVzIHRvIGJ5cGFzcyB0aGlzCisvLyBwcm9ibGVtLgorY2xhc3MgVGhyZWFkV2l0aFBhcmFtQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRXaXRoUGFyYW1CYXNlKCkge30KKyAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKK307CisKKy8vIHB0aHJlYWRfY3JlYXRlKCkgYWNjZXB0cyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0eXBlIHdpdGggdGhlIEMgbGlua2FnZS4KKy8vIEFjY29yZGluZyB0byB0aGUgU3RhbmRhcmQgKDcuNS8xKSwgZnVuY3Rpb24gdHlwZXMgd2l0aCBkaWZmZXJlbnQgbGlua2FnZXMKKy8vIGFyZSBkaWZmZXJlbnQgZXZlbiBpZiB0aGV5IGFyZSBvdGhlcndpc2UgaWRlbnRpY2FsLiAgU29tZSBjb21waWxlcnMgKGZvcgorLy8gZXhhbXBsZSwgU3VuU3R1ZGlvKSB0cmVhdCB0aGVtIGFzIGRpZmZlcmVudCB0eXBlcy4gIFNpbmNlIGNsYXNzIG1ldGhvZHMKKy8vIGNhbm5vdCBiZSBkZWZpbmVkIHdpdGggQy1saW5rYWdlIHdlIG5lZWQgdG8gZGVmaW5lIGEgZnJlZSBDLWZ1bmN0aW9uIHRvCisvLyBwYXNzIGludG8gcHRocmVhZF9jcmVhdGUoKS4KK2V4dGVybiAiQyIgaW5saW5lIHZvaWQqIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2Uodm9pZCogdGhyZWFkKSB7CisgIHN0YXRpY19jYXN0PFRocmVhZFdpdGhQYXJhbUJhc2UqPih0aHJlYWQpLT5SdW4oKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG11bHRpLXRocmVhZGluZyBjb25zdHJ1Y3RzLgorLy8gVG8gdXNlIGl0LCB3cml0ZToKKy8vCisvLyAgIHZvaWQgVGhyZWFkRnVuYyhpbnQgcGFyYW0pIHsgLyogRG8gdGhpbmdzIHdpdGggcGFyYW0gKi8gfQorLy8gICBOb3RpZmljYXRpb24gdGhyZWFkX2Nhbl9zdGFydDsKKy8vICAgLi4uCisvLyAgIC8vIFRoZSB0aHJlYWRfY2FuX3N0YXJ0IHBhcmFtZXRlciBpcyBvcHRpb25hbDsgeW91IGNhbiBzdXBwbHkgTlVMTC4KKy8vICAgVGhyZWFkV2l0aFBhcmFtPGludD4gdGhyZWFkKCZUaHJlYWRGdW5jLCA1LCAmdGhyZWFkX2Nhbl9zdGFydCk7CisvLyAgIHRocmVhZF9jYW5fc3RhcnQuTm90aWZ5KCk7CisvLworLy8gVGhlc2UgY2xhc3NlcyBhcmUgb25seSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiBEbworLy8gbm90IHVzZSB0aGVtIGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUaHJlYWRXaXRoUGFyYW0gOiBwdWJsaWMgVGhyZWFkV2l0aFBhcmFtQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIHZvaWQgKCpVc2VyVGhyZWFkRnVuYykoVCk7CisKKyAgVGhyZWFkV2l0aFBhcmFtKAorICAgICAgVXNlclRocmVhZEZ1bmMgZnVuYywgVCBwYXJhbSwgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KQorICAgICAgOiBmdW5jXyhmdW5jKSwKKyAgICAgICAgcGFyYW1fKHBhcmFtKSwKKyAgICAgICAgdGhyZWFkX2Nhbl9zdGFydF8odGhyZWFkX2Nhbl9zdGFydCksCisgICAgICAgIGZpbmlzaGVkXyhmYWxzZSkgeworICAgIFRocmVhZFdpdGhQYXJhbUJhc2UqIGNvbnN0IGJhc2UgPSB0aGlzOworICAgIC8vIFRoZSB0aHJlYWQgY2FuIGJlIGNyZWF0ZWQgb25seSBhZnRlciBhbGwgZmllbGRzIGV4Y2VwdCB0aHJlYWRfCisgICAgLy8gaGF2ZSBiZWVuIGluaXRpYWxpemVkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkXywgMCwgJlRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UsIGJhc2UpKTsKKyAgfQorICB+VGhyZWFkV2l0aFBhcmFtKCkgeyBKb2luKCk7IH0KKworICB2b2lkIEpvaW4oKSB7CisgICAgaWYgKCFmaW5pc2hlZF8pIHsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfam9pbih0aHJlYWRfLCAwKSk7CisgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBSdW4oKSB7CisgICAgaWYgKHRocmVhZF9jYW5fc3RhcnRfICE9IE5VTEwpCisgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xy0+V2FpdEZvck5vdGlmaWNhdGlvbigpOworICAgIGZ1bmNfKHBhcmFtXyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFVzZXJUaHJlYWRGdW5jIGZ1bmNfOyAgLy8gVXNlci1zdXBwbGllZCB0aHJlYWQgZnVuY3Rpb24uCisgIGNvbnN0IFQgcGFyYW1fOyAgLy8gVXNlci1zdXBwbGllZCBwYXJhbWV0ZXIgdG8gdGhlIHRocmVhZCBmdW5jdGlvbi4KKyAgLy8gV2hlbiBub24tTlVMTCwgdXNlZCB0byBibG9jayBleGVjdXRpb24gdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkCisgIC8vIG5vdGlmaWVzLgorICBOb3RpZmljYXRpb24qIGNvbnN0IHRocmVhZF9jYW5fc3RhcnRfOworICBib29sIGZpbmlzaGVkXzsgIC8vIHRydWUgaWZmIHdlIGtub3cgdGhhdCB0aGUgdGhyZWFkIGZ1bmN0aW9uIGhhcyBmaW5pc2hlZC4KKyAgcHRocmVhZF90IHRocmVhZF87ICAvLyBUaGUgbmF0aXZlIHRocmVhZCBvYmplY3QuCisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRXaXRoUGFyYW0pOworfTsKKworLy8gTXV0ZXhCYXNlIGFuZCBNdXRleCBpbXBsZW1lbnQgbXV0ZXggb24gcHRocmVhZHMtYmFzZWQgcGxhdGZvcm1zLiBUaGV5CisvLyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNsYXNzIE11dGV4TG9jazoKKy8vCisvLyAgIE11dGV4IG11dGV4OworLy8gICAuLi4KKy8vICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4KTsgIC8vIEFjcXVpcmVzIHRoZSBtdXRleCBhbmQgcmVsZWFzZXMgaXQgYXQgdGhlIGVuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgc2NvcGUuCisvLworLy8gTXV0ZXhCYXNlIGltcGxlbWVudHMgYmVoYXZpb3IgZm9yIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkKKy8vIGFsbG9jYXRlZCBtdXRleGVzLiAgRG8gbm90IHVzZSBNdXRleEJhc2UgZGlyZWN0bHkuICBJbnN0ZWFkLCB3cml0ZQorLy8gdGhlIGZvbGxvd2luZyB0byBkZWZpbmUgYSBzdGF0aWMgbXV0ZXg6CisvLworLy8gICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFlvdSBjYW4gZm9yd2FyZCBkZWNsYXJlIGEgc3RhdGljIG11dGV4IGxpa2UgdGhpczoKKy8vCisvLyAgIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFRvIGNyZWF0ZSBhIGR5bmFtaWMgbXV0ZXgsIGp1c3QgZGVmaW5lIGFuIG9iamVjdCBvZiB0eXBlIE11dGV4LgorY2xhc3MgTXV0ZXhCYXNlIHsKKyBwdWJsaWM6CisgIC8vIEFjcXVpcmVzIHRoaXMgbXV0ZXguCisgIHZvaWQgTG9jaygpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm11dGV4XykpOworICAgIG93bmVyXyA9IHB0aHJlYWRfc2VsZigpOworICAgIGhhc19vd25lcl8gPSB0cnVlOworICB9CisKKyAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4KKyAgdm9pZCBVbmxvY2soKSB7CisgICAgLy8gU2luY2UgdGhlIGxvY2sgaXMgYmVpbmcgcmVsZWFzZWQgdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgbm8gbG9uZ2VyIGJlCisgICAgLy8gY29uc2lkZXJlZCB2YWxpZC4gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIGhhc19vd25lcl8gaGVyZSwgYXMgaXQncworICAgIC8vIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCisgICAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KKyAgICBoYXNfb3duZXJfID0gZmFsc2U7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4XykpOworICB9CisKKyAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcworICAvLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsKKyAgICBHVEVTVF9DSEVDS18oaGFzX293bmVyXyAmJiBwdGhyZWFkX2VxdWFsKG93bmVyXywgcHRocmVhZF9zZWxmKCkpKQorICAgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOworICB9CisKKyAgLy8gQSBzdGF0aWMgbXV0ZXggbWF5IGJlIHVzZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLiAgSXQgbWF5IGV2ZW4KKyAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UKKyAgLy8gbXVzdCBiZSBhYmxlIHRvIGluaXRpYWxpemUgYSBzdGF0aWMgbXV0ZXggb2JqZWN0IGF0IGxpbmsgdGltZS4KKyAgLy8gVGhpcyBtZWFucyBNdXRleEJhc2UgaGFzIHRvIGJlIGEgUE9EIGFuZCBpdHMgbWVtYmVyIHZhcmlhYmxlcworICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4KKyBwdWJsaWM6CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87ICAvLyBUaGUgdW5kZXJseWluZyBwdGhyZWFkIG11dGV4LgorICAvLyBoYXNfb3duZXJfIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvd25lcl8gZmllbGQgYmVsb3cgY29udGFpbnMgYSB2YWxpZCB0aHJlYWQKKyAgLy8gSUQgYW5kIGlzIHRoZXJlZm9yZSBzYWZlIHRvIGluc3BlY3QgKGUuZy4sIHRvIHVzZSBpbiBwdGhyZWFkX2VxdWFsKCkpLiBBbGwKKyAgLy8gYWNjZXNzZXMgdG8gdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IGEgY2hlY2sgb2YgdGhpcyBmaWVsZC4KKyAgLy8gQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gbWVtc2V0KCkgb3duZXJfIHRvIGFsbCB6ZXJvcywgYnV0IHRoZXJlJ3Mgbm8KKyAgLy8gZ3VhcmFudGVlIHRoYXQgYSB6ZXJvJ2QgcHRocmVhZF90IGlzIG5lY2Vzc2FyaWx5IGludmFsaWQgb3IgZXZlbiBkaWZmZXJlbnQKKyAgLy8gZnJvbSBwdGhyZWFkX3NlbGYoKS4KKyAgYm9vbCBoYXNfb3duZXJfOworICBwdGhyZWFkX3Qgb3duZXJfOyAgLy8gVGhlIHRocmVhZCBob2xkaW5nIHRoZSBtdXRleC4KK307CisKKy8vIEZvcndhcmQtZGVjbGFyZXMgYSBzdGF0aWMgbXV0ZXguCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4CisKKy8vIERlZmluZXMgYW5kIHN0YXRpY2FsbHkgKGkuZS4gYXQgbGluayB0aW1lKSBpbml0aWFsaXplcyBhIHN0YXRpYyBtdXRleC4KKy8vIFRoZSBpbml0aWFsaXphdGlvbiBsaXN0IGhlcmUgZG9lcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplIGVhY2ggZmllbGQsCisvLyBpbnN0ZWFkIHJlbHlpbmcgb24gZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHVuc3BlY2lmaWVkIGZpZWxkcy4gSW4KKy8vIHBhcnRpY3VsYXIsIHRoZSBvd25lcl8gZmllbGQgKGEgcHRocmVhZF90KSBpcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplZC4KKy8vIFRoaXMgYWxsb3dzIGluaXRpYWxpemF0aW9uIHRvIHdvcmsgd2hldGhlciBwdGhyZWFkX3QgaXMgYSBzY2FsYXIgb3Igc3RydWN0LgorLy8gVGhlIGZsYWcgLVdtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQgZm9yIHRoaXMgdG8gd29yay4KKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4ID0geyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCBmYWxzZSB9CisKKy8vIFRoZSBNdXRleCBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGZvciBtdXRleGVzIGNyZWF0ZWQgYXQgcnVudGltZS4gSXQKKy8vIHNoYXJlcyBpdHMgQVBJIHdpdGggTXV0ZXhCYXNlIG90aGVyd2lzZS4KK2NsYXNzIE11dGV4IDogcHVibGljIE11dGV4QmFzZSB7CisgcHVibGljOgorICBNdXRleCgpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOworICAgIGhhc19vd25lcl8gPSBmYWxzZTsKKyAgfQorICB+TXV0ZXgoKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNdXRleCk7Cit9OworCisvLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBhcyB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAorLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KK2NsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4QmFzZSogbXV0ZXgpCisgICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQorCisgIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXhCYXNlKiBjb25zdCBtdXRleF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdE11dGV4TG9jayk7Cit9OworCit0eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKKworLy8gSGVscGVycyBmb3IgVGhyZWFkTG9jYWwuCisKKy8vIHB0aHJlYWRfa2V5X2NyZWF0ZSgpIHJlcXVpcmVzIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB0byBoYXZlCisvLyBDLWxpbmthZ2UuICBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIHRlbXBsYXRpemVkIHRvIGFjY2VzcworLy8gVGhyZWFkTG9jYWw8VD4uICBIZW5jZSB0aGUgbmVlZCBmb3IgY2xhc3MKKy8vIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlLgorY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UoKSB7fQorfTsKKworLy8gQ2FsbGVkIGJ5IHB0aHJlYWQgdG8gZGVsZXRlIHRocmVhZC1sb2NhbCBkYXRhIHN0b3JlZCBieQorLy8gcHRocmVhZF9zZXRzcGVjaWZpYygpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHZvaWQqIHZhbHVlX2hvbGRlcikgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPih2YWx1ZV9ob2xkZXIpOworfQorCisvLyBJbXBsZW1lbnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlIG9uIHB0aHJlYWRzLWJhc2VkIHN5c3RlbXMuCisvLworLy8gICAvLyBUaHJlYWQgMQorLy8gICBUaHJlYWRMb2NhbDxpbnQ+IHRsKDEwMCk7ICAvLyAxMDAgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorLy8KKy8vICAgLy8gVGhyZWFkIDIKKy8vICAgdGwuc2V0KDE1MCk7ICAvLyBDaGFuZ2VzIHRoZSB2YWx1ZSBmb3IgdGhyZWFkIDIgb25seS4KKy8vICAgRVhQRUNUX0VRKDE1MCwgdGwuZ2V0KCkpOworLy8KKy8vICAgLy8gVGhyZWFkIDEKKy8vICAgRVhQRUNUX0VRKDEwMCwgdGwuZ2V0KCkpOyAgLy8gSW4gdGhyZWFkIDEsIHRsIGhhcyB0aGUgb3JpZ2luYWwgdmFsdWUuCisvLyAgIHRsLnNldCgyMDApOworLy8gICBFWFBFQ1RfRVEoMjAwLCB0bC5nZXQoKSk7CisvLworLy8gVGhlIHRlbXBsYXRlIHR5cGUgYXJndW1lbnQgVCBtdXN0IGhhdmUgYSBwdWJsaWMgY29weSBjb25zdHJ1Y3Rvci4KKy8vIEluIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCBUaHJlYWRMb2NhbCBjb25zdHJ1Y3RvciByZXF1aXJlcyBUIHRvIGhhdmUKKy8vIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuCisvLworLy8gQW4gb2JqZWN0IG1hbmFnZWQgZm9yIGEgdGhyZWFkIGJ5IGEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMgZGVsZXRlZAorLy8gd2hlbiB0aGUgdGhyZWFkIGV4aXRzLiAgT3IsIGlmIHRoZSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBkaWVzIGluCisvLyB0aGF0IHRocmVhZCwgd2hlbiB0aGUgVGhyZWFkTG9jYWwgZGllcy4gIEl0J3MgdGhlIHVzZXIncworLy8gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYWxsIG90aGVyIHRocmVhZHMgdXNpbmcgYSBUaHJlYWRMb2NhbAorLy8gaGF2ZSBleGl0ZWQgd2hlbiBpdCBkaWVzLCBvciB0aGUgcGVyLXRocmVhZCBvYmplY3RzIGZvciB0aG9zZQorLy8gdGhyZWFkcyB3aWxsIG5vdCBiZSBkZWxldGVkLgorLy8KKy8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQorLy8gd2lsbCBkaWUgYWZ0ZXIgbWFpbigpIGhhcyByZXR1cm5lZC4gIFRoZXJlZm9yZSwgbm8gcGVyLXRocmVhZAorLy8gb2JqZWN0IG1hbmFnZWQgYnkgR29vZ2xlIFRlc3Qgd2lsbCBiZSBsZWFrZWQgYXMgbG9uZyBhcyBhbGwgdGhyZWFkcworLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGhyZWFkTG9jYWwgeworIHB1YmxpYzoKKyAgVGhyZWFkTG9jYWwoKSA6IGtleV8oQ3JlYXRlS2V5KCkpLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdF8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiBrZXlfKENyZWF0ZUtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF8odmFsdWUpIHt9CisKKyAgflRocmVhZExvY2FsKCkgeworICAgIC8vIERlc3Ryb3lzIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBpZiBhbnkuCisgICAgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZShwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKworICAgIC8vIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4gIFRoaXMgd2lsbCAqbm90KgorICAgIC8vIGRlbGV0ZSBtYW5hZ2VkIG9iamVjdHMgZm9yIG90aGVyIHRocmVhZHMuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9rZXlfZGVsZXRlKGtleV8pKTsKKyAgfQorCisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KKyAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9CisgIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgLy8gSG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQuCisgIGNsYXNzIFZhbHVlSG9sZGVyIDogcHVibGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyAgICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQorCisgICBwcml2YXRlOgorICAgIFQgdmFsdWVfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOworICB9OworCisgIHN0YXRpYyBwdGhyZWFkX2tleV90IENyZWF0ZUtleSgpIHsKKyAgICBwdGhyZWFkX2tleV90IGtleTsKKyAgICAvLyBXaGVuIGEgdGhyZWFkIGV4aXRzLCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKCkgd2lsbCBiZSBjYWxsZWQgb24KKyAgICAvLyB0aGUgb2JqZWN0IG1hbmFnZWQgZm9yIHRoYXQgdGhyZWFkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmtleSwgJkRlbGV0ZVRocmVhZExvY2FsVmFsdWUpKTsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKyAgICBpZiAoaG9sZGVyICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8VmFsdWVIb2xkZXI+KGhvbGRlciktPnBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBWYWx1ZUhvbGRlciogY29uc3QgbmV3X2hvbGRlciA9IG5ldyBWYWx1ZUhvbGRlcihkZWZhdWx0Xyk7CisgICAgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIGNvbnN0IGhvbGRlcl9iYXNlID0gbmV3X2hvbGRlcjsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX3NldHNwZWNpZmljKGtleV8sIGhvbGRlcl9iYXNlKSk7CisgICAgcmV0dXJuIG5ld19ob2xkZXItPnBvaW50ZXIoKTsKKyAgfQorCisgIC8vIEEga2V5IHB0aHJlYWRzIHVzZXMgZm9yIGxvb2tpbmcgdXAgcGVyLXRocmVhZCB2YWx1ZXMuCisgIGNvbnN0IHB0aHJlYWRfa2V5X3Qga2V5XzsKKyAgY29uc3QgVCBkZWZhdWx0XzsgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4KKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZExvY2FsKTsKK307CisKKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMQorCisjZWxzZSAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAobXV0ZXgsIGxvY2ssCisvLyBhbmQgdGhyZWFkLWxvY2FsIHZhcmlhYmxlKS4gIE5lY2Vzc2FyeSBmb3IgY29tcGlsaW5nIEdvb2dsZSBUZXN0IHdoZXJlCisvLyBtdXRleCBpcyBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgR29vZ2xlIFRlc3QgaW4gbXVsdGlwbGUgdGhyZWFkcyBpcyBub3QKKy8vIHN1cHBvcnRlZCBvbiBzdWNoIHBsYXRmb3Jtcy4KKworY2xhc3MgTXV0ZXggeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7fQorICB2b2lkIExvY2soKSB7fQorICB2b2lkIFVubG9jaygpIHt9CisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHt9Cit9OworCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4CisKKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorCitjbGFzcyBHVGVzdE11dGV4TG9jayB7CisgcHVibGljOgorICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCopIHt9ICAvLyBOT0xJTlQKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgOiB2YWx1ZV8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKworLy8gVGhlIGFib3ZlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGhhdmUgZHVtbXkgaW1wbGVtZW50YXRpb25zLgorLy8gVGhlcmVmb3JlIEdvb2dsZSBUZXN0IGlzIG5vdCB0aHJlYWQtc2FmZS4KKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK0dURVNUX0FQSV8gc2l6ZV90IEdldFRocmVhZENvdW50KCk7CisKKy8vIFBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikgY3Jhc2hlcyB0aGUgQVJNCisvLyBjb21waWxlciBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBpbiBTdW4gU3R1ZGlvLiAgVGhlIE5va2lhIFN5bWJpYW4KKy8vIGFuZCB0aGUgSUJNIFhMIEMvQysrIGNvbXBpbGVyIHRyeSB0byBpbnN0YW50aWF0ZSBhIGNvcHkgY29uc3RydWN0b3IKKy8vIGZvciBvYmplY3RzIHBhc3NlZCB0aHJvdWdoIGVsbGlwc2lzICguLi4pLCBmYWlsaW5nIGZvciB1bmNvcHlhYmxlCisvLyBvYmplY3RzLiAgV2UgZGVmaW5lIHRoaXMgdG8gZW5zdXJlIHRoYXQgb25seSBQT0QgaXMgcGFzc2VkIHRocm91Z2gKKy8vIGVsbGlwc2lzIG9uIHRoZXNlIHN5c3RlbXMuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBXZSBsb3NlIHN1cHBvcnQgZm9yIE5VTEwgZGV0ZWN0aW9uIHdoZXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UKKy8vIHBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikuCisjIGRlZmluZSBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfIDEKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIDEKKyNlbmRpZgorCisvLyBUaGUgTm9raWEgU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIGNvbXBpbGVycyBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKy8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgVGhlc2UgY29tcGlsZXJzCisvLyBfY2FuXyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLAorLy8gc28gYSB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3Jrcy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKKyMgZGVmaW5lIEdURVNUX05FRURTX0lTX1BPSU5URVJfIDEKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPgorc3RydWN0IGJvb2xfY29uc3RhbnQgeworICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT4gdHlwZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBib29sX3ZhbHVlOworfTsKK3RlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+IGNvbnN0IGJvb2wgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPjo6dmFsdWU7CisKK3R5cGVkZWYgYm9vbF9jb25zdGFudDxmYWxzZT4gZmFsc2VfdHlwZTsKK3R5cGVkZWYgYm9vbF9jb25zdGFudDx0cnVlPiB0cnVlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3BvaW50ZXIgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfcG9pbnRlcjxUKj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CitzdHJ1Y3QgSXRlcmF0b3JUcmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIEl0ZXJhdG9yOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJdGVyYXRvclRyYWl0czxUKj4geworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEl0ZXJhdG9yVHJhaXRzPGNvbnN0IFQqPiB7CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiXFwiCisjIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAxCisvLyBUaGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlIHRoZSBjb21waWxlciBzdXBwb3J0cy4KK3R5cGVkZWYgX19pbnQ2NCBCaWdnZXN0SW50OworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiLyIKKyMgZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDAKK3R5cGVkZWYgbG9uZyBsb25nIEJpZ2dlc3RJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXRpZXMgZm9yIGNoYXIuCisKKy8vIGlzc3BhY2UoaW50IGNoKSBhbmQgZnJpZW5kcyBhY2NlcHQgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuICBjaGFyCisvLyBtYXkgYmUgc2lnbmVkLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyIChvciBjb21waWxlciBmbGFncykuCisvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjYXN0IGEgY2hhciB0byB1bnNpZ25lZCBjaGFyIGJlZm9yZSBjYWxsaW5nCisvLyBpc3NwYWNlKCksIGV0Yy4KKworaW5saW5lIGJvb2wgSXNBbHBoYShjaGFyIGNoKSB7CisgIHJldHVybiBpc2FscGhhKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzQWxOdW0oY2hhciBjaCkgeworICByZXR1cm4gaXNhbG51bShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc0RpZ2l0KGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNMb3dlcihjaGFyIGNoKSB7CisgIHJldHVybiBpc2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzU3BhY2UoY2hhciBjaCkgeworICByZXR1cm4gaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc1VwcGVyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQoY2hhciBjaCkgeworICByZXR1cm4gaXN4ZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQod2NoYXJfdCBjaCkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyIGxvd19ieXRlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpOworICByZXR1cm4gY2ggPT0gbG93X2J5dGUgJiYgaXN4ZGlnaXQobG93X2J5dGUpICE9IDA7Cit9CisKK2lubGluZSBjaGFyIFRvTG93ZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG9sb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KK2lubGluZSBjaGFyIFRvVXBwZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG91cHBlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KKworLy8gVGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeCBuYW1lc3BhY2UgaG9sZHMgd3JhcHBlcnMgZm9yIGNvbW1vbgorLy8gUE9TSVggZnVuY3Rpb25zLiAgVGhlc2Ugd3JhcHBlcnMgaGlkZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorLy8gV2luZG93cy9NU1ZDIGFuZCBQT1NJWCBzeXN0ZW1zLiAgU2luY2Ugc29tZSBjb21waWxlcnMgZGVmaW5lIHRoZXNlCisvLyBzdGFuZGFyZCBmdW5jdGlvbnMgYXMgbWFjcm9zLCB0aGUgd3JhcHBlciBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lCisvLyBhcyB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KKworbmFtZXNwYWNlIHBvc2l4IHsKKworLy8gRnVuY3Rpb25zIHdpdGggYSBkaWZmZXJlbnQgbmFtZSBvbiBXaW5kb3dzLgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCit0eXBlZGVmIHN0cnVjdCBfc3RhdCBTdGF0U3RydWN0OworCisjIGlmZGVmIF9fQk9STEFORENfXworaW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBzdHJpY21wKHMxLCBzMik7Cit9CitpbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gc3RyZHVwKHNyYyk7IH0KKyMgZWxzZSAgLy8gIV9fQk9STEFORENfXworIyAgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgSXNBVFRZKGludCAvKiBmZCAqLykgeyByZXR1cm4gMDsgfQorIyAgZWxzZQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBfaXNhdHR5KGZkKTsgfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBfc3RyaWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIF9zdHJkdXAoc3JjKTsgfQorIyBlbmRpZiAgLy8gX19CT1JMQU5EQ19fCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50PihfZmlsZW5vKGZpbGUpKTsgfQorLy8gU3RhdCgpLCBSbURpcigpLCBhbmQgSXNEaXIoKSBhcmUgbm90IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMKKy8vIHRpbWUgYW5kIHRodXMgbm90IGRlZmluZWQgdGhlcmUuCisjIGVsc2UKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIF9maWxlbm8oZmlsZSk7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIF9zdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBfcm1kaXIoZGlyKTsgfQoraW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsKKyAgcmV0dXJuIChfU19JRkRJUiAmIHN0LnN0X21vZGUpICE9IDA7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjZWxzZQorCit0eXBlZGVmIHN0cnVjdCBzdGF0IFN0YXRTdHJ1Y3Q7CisKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIGZpbGVubyhmaWxlKTsgfQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0YXQoY29uc3QgY2hhciogcGF0aCwgU3RhdFN0cnVjdCogYnVmKSB7IHJldHVybiBzdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIHN0cmNhc2VjbXAoczEsIHMyKTsKK30KK2lubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQoraW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIHJtZGlyKGRpcik7IH0KK2lubGluZSBib29sIElzRGlyKGNvbnN0IFN0YXRTdHJ1Y3QmIHN0KSB7IHJldHVybiBTX0lTRElSKHN0LnN0X21vZGUpOyB9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBGdW5jdGlvbnMgZGVwcmVjYXRlZCBieSBNU1ZDIDguMC4KKworI2lmZGVmIF9NU0NfVkVSCisvLyBUZW1wb3JhcmlseSBkaXNhYmxlIHdhcm5pbmcgNDk5NiAoZGVwcmVjYXRlZCBmdW5jdGlvbikuCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCitpbmxpbmUgY29uc3QgY2hhciogU3RyTkNweShjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHNpemVfdCBuKSB7CisgIHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7Cit9CisKKy8vIENoRGlyKCksIEZSZW9wZW4oKSwgRkRPcGVuKCksIFJlYWQoKSwgV3JpdGUoKSwgQ2xvc2UoKSwgYW5kCisvLyBTdHJFcnJvcigpIGFyZW4ndCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzIHRpbWUgYW5kIHRodXMgbm90CisvLyBkZWZpbmVkIHRoZXJlLgorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IENoRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gY2hkaXIoZGlyKTsgfQorI2VuZGlmCitpbmxpbmUgRklMRSogRk9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgeworICByZXR1cm4gZm9wZW4ocGF0aCwgbW9kZSk7Cit9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgRklMRSAqRlJlb3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlLCBGSUxFKiBzdHJlYW0pIHsKKyAgcmV0dXJuIGZyZW9wZW4ocGF0aCwgbW9kZSwgc3RyZWFtKTsKK30KK2lubGluZSBGSUxFKiBGRE9wZW4oaW50IGZkLCBjb25zdCBjaGFyKiBtb2RlKSB7IHJldHVybiBmZG9wZW4oZmQsIG1vZGUpOyB9CisjZW5kaWYKK2lubGluZSBpbnQgRkNsb3NlKEZJTEUqIGZwKSB7IHJldHVybiBmY2xvc2UoZnApOyB9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFJlYWQoaW50IGZkLCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihyZWFkKGZkLCBidWYsIGNvdW50KSk7Cit9CitpbmxpbmUgaW50IFdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4od3JpdGUoZmQsIGJ1ZiwgY291bnQpKTsKK30KK2lubGluZSBpbnQgQ2xvc2UoaW50IGZkKSB7IHJldHVybiBjbG9zZShmZCk7IH0KK2lubGluZSBjb25zdCBjaGFyKiBTdHJFcnJvcihpbnQgZXJybnVtKSB7IHJldHVybiBzdHJlcnJvcihlcnJudW0pOyB9CisjZW5kaWYKK2lubGluZSBjb25zdCBjaGFyKiBHZXRFbnYoY29uc3QgY2hhciogbmFtZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLCB3aGljaCBoYXMgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICByZXR1cm4gTlVMTDsKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQorICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggd2UgcHJvZ3JhbW1hdGljYWxseSBjbGVhciB3aWxsIGJlIHNldCB0byB0aGUKKyAgLy8gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHVuc2V0IChOVUxMKS4gIEhhbmRsZSB0aGF0IGNhc2UuCisgIGNvbnN0IGNoYXIqIGNvbnN0IGVudiA9IGdldGVudihuYW1lKTsKKyAgcmV0dXJuIChlbnYgIT0gTlVMTCAmJiBlbnZbMF0gIT0gJ1wwJykgPyBlbnYgOiBOVUxMOworI2Vsc2UKKyAgcmV0dXJuIGdldGVudihuYW1lKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBXaW5kb3dzIENFIGhhcyBubyBDIGxpYnJhcnkuIFRoZSBhYm9ydCgpIGZ1bmN0aW9uIGlzIHVzZWQgaW4KKy8vIHNldmVyYWwgcGxhY2VzIGluIEdvb2dsZSBUZXN0LiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgcmVhc29uYWJsZQorLy8gaW1pdGF0aW9uIG9mIHN0YW5kYXJkIGJlaGF2aW91ci4KK3ZvaWQgQWJvcnQoKTsKKyNlbHNlCitpbmxpbmUgdm9pZCBBYm9ydCgpIHsgYWJvcnQoKTsgfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCit9ICAvLyBuYW1lc3BhY2UgcG9zaXgKKworLy8gTVNWQyAiZGVwcmVjYXRlcyIgc25wcmludGYgYW5kIGlzc3VlcyB3YXJuaW5ncyB3aGVyZXZlciBpdCBpcyB1c2VkLiAgSW4KKy8vIG9yZGVyIHRvIGF2b2lkIHRoZXNlIHdhcm5pbmdzLCB3ZSBuZWVkIHRvIHVzZSBfc25wcmludGYgb3IgX3NucHJpbnRmX3Mgb24KKy8vIE1TVkMtYmFzZWQgcGxhdGZvcm1zLiAgV2UgbWFwIHRoZSBHVEVTVF9TTlBSSU5URl8gbWFjcm8gdG8gdGhlIGFwcHJvcHJpYXRlCisvLyBmdW5jdGlvbiBpbiBvcmRlciB0byBhY2hpZXZlIHRoYXQuICBXZSB1c2UgbWFjcm8gZGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UKKy8vIHNucHJpbnRmIGlzIGEgdmFyaWFkaWMgZnVuY3Rpb24uCisjaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIE1TVkMgMjAwNSBhbmQgYWJvdmUgc3VwcG9ydCB2YXJpYWRpYyBtYWNyb3MuCisjIGRlZmluZSBHVEVTVF9TTlBSSU5URl8oYnVmZmVyLCBzaXplLCBmb3JtYXQsIC4uLikgXAorICAgICBfc25wcmludGZfcyhidWZmZXIsIHNpemUsIHNpemUsIGZvcm1hdCwgX19WQV9BUkdTX18pCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gV2luZG93cyBDRSBkb2VzIG5vdCBkZWZpbmUgX3NucHJpbnRmX3MgYW5kIE1TVkMgcHJpb3IgdG8gMjAwNSBkb2Vzbid0CisvLyBjb21wbGFpbiBhYm91dCBfc25wcmludGYuCisjIGRlZmluZSBHVEVTVF9TTlBSSU5URl8gX3NucHJpbnRmCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIHNucHJpbnRmCisjZW5kaWYKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIGEgQmlnZ2VzdEludCBjYW4gcmVwcmVzZW50LiAgVGhpcyBkZWZpbml0aW9uCisvLyB3b3JrcyBubyBtYXR0ZXIgQmlnZ2VzdEludCBpcyByZXByZXNlbnRlZCBpbiBvbmUncyBjb21wbGVtZW50IG9yCisvLyB0d28ncyBjb21wbGVtZW50LgorLy8KKy8vIFdlIGNhbm5vdCByZWx5IG9uIG51bWVyaWNfbGltaXRzIGluIFNUTCwgYXMgX19pbnQ2NCBhbmQgbG9uZyBsb25nCisvLyBhcmUgbm90IHBhcnQgb2Ygc3RhbmRhcmQgQysrIGFuZCBudW1lcmljX2xpbWl0cyBkb2Vzbid0IG5lZWQgdG8gYmUKKy8vIGRlZmluZWQgZm9yIHRoZW0uCitjb25zdCBCaWdnZXN0SW50IGtNYXhCaWdnZXN0SW50ID0KKyAgICB+KHN0YXRpY19jYXN0PEJpZ2dlc3RJbnQ+KDEpIDw8ICg4KnNpemVvZihCaWdnZXN0SW50KSAtIDEpKTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBzZXJ2ZXMgYXMgYSBjb21waWxlLXRpbWUgZnVuY3Rpb24gZnJvbSBzaXplIHRvCisvLyB0eXBlLiAgSXQgbWFwcyBhIHNpemUgaW4gYnl0ZXMgdG8gYSBwcmltaXRpdmUgdHlwZSB3aXRoIHRoYXQKKy8vIHNpemUuIGUuZy4KKy8vCisvLyAgIFR5cGVXaXRoU2l6ZTw0Pjo6VUludAorLy8KKy8vIGlzIHR5cGVkZWYtZWQgdG8gYmUgdW5zaWduZWQgaW50ICh1bnNpZ25lZCBpbnRlZ2VyIG1hZGUgdXAgb2YgNAorLy8gYnl0ZXMpLgorLy8KKy8vIFN1Y2ggZnVuY3Rpb25hbGl0eSBzaG91bGQgYmVsb25nIHRvIFNUTCwgYnV0IEkgY2Fubm90IGZpbmQgaXQKKy8vIHRoZXJlLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhpcyBjbGFzcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgZmxvYXRpbmctcG9pbnQKKy8vIGNvbXBhcmlzb24uCisvLworLy8gRm9yIG5vdyBpdCBvbmx5IGhhbmRsZXMgVUludCAodW5zaWduZWQgaW50KSBhcyB0aGF0J3MgYWxsIEdvb2dsZSBUZXN0CisvLyBuZWVkcy4gIE90aGVyIHR5cGVzIGNhbiBiZSBlYXNpbHkgYWRkZWQgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkCisvLyBhcmlzZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IHNpemU+CitjbGFzcyBUeXBlV2l0aFNpemUgeworIHB1YmxpYzoKKyAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIHVzaW5nIFR5cGVXaXRoU2l6ZTxOPiB3aXRoIGluY29ycmVjdAorICAvLyB2YWx1ZXMgb2YgTi4KKyAgdHlwZWRlZiB2b2lkIFVJbnQ7Cit9OworCisvLyBUaGUgc3BlY2lhbGl6YXRpb24gZm9yIHNpemUgNC4KK3RlbXBsYXRlIDw+CitjbGFzcyBUeXBlV2l0aFNpemU8ND4geworIHB1YmxpYzoKKyAgLy8gdW5zaWduZWQgaW50IGhhcyBzaXplIDQgaW4gYm90aCBnY2MgYW5kIE1TVkMuCisgIC8vCisgIC8vIEFzIGJhc2UvYmFzaWN0eXBlcy5oIGRvZXNuJ3QgY29tcGlsZSBvbiBXaW5kb3dzLCB3ZSBjYW5ub3QgdXNlCisgIC8vIHVpbnQzMiwgdWludDY0LCBhbmQgZXRjIGhlcmUuCisgIHR5cGVkZWYgaW50IEludDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUludDsKK307CisKKy8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA4LgordGVtcGxhdGUgPD4KK2NsYXNzIFR5cGVXaXRoU2l6ZTw4PiB7CisgcHVibGljOgorI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgdHlwZWRlZiBfX2ludDY0IEludDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJbnQ7CisjZWxzZQorICB0eXBlZGVmIGxvbmcgbG9uZyBJbnQ7ICAvLyBOT0xJTlQKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDsgIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9OworCisvLyBJbnRlZ2VyIHR5cGVzIG9mIGtub3duIHNpemVzLgordHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OkludCBJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDQ+OjpVSW50IFVJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6VUludCBVSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6SW50IFRpbWVJbk1pbGxpczsgIC8vIFJlcHJlc2VudHMgdGltZSBpbiBtaWxsaXNlY29uZHMuCisKKy8vIFV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIGZsYWdzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKy8vIE1hY3JvIGZvciByZWZlcmVuY2luZyBmbGFncy4KKyNkZWZpbmUgR1RFU1RfRkxBRyhuYW1lKSBGTEFHU19ndGVzdF8jI25hbWUKKworLy8gTWFjcm9zIGZvciBkZWNsYXJpbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkgR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKKyAgICBHVEVTVF9BUElfIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCisgICAgR1RFU1RfQVBJXyBleHRlcm4gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpCisKKy8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyBib29sIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgR1RFU1RfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorCisvLyBUaHJlYWQgYW5ub3RhdGlvbnMKKyNkZWZpbmUgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGxvY2tzKQorI2RlZmluZSBHVEVTVF9MT0NLX0VYQ0xVREVEXyhsb2NrcykKKworLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcyB0aGUgcmVzdWx0CisvLyB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUgdW5jaGFuZ2VkIGFuZCByZXR1cm5zCisvLyBmYWxzZS4KKy8vIFRPRE8oY2hhbmRsZXJjKTogRmluZCBhIGJldHRlciB3YXkgdG8gcmVmYWN0b3IgZmxhZyBhbmQgZW52aXJvbm1lbnQgcGFyc2luZworLy8gb3V0IG9mIGJvdGggZ3Rlc3QtcG9ydC5jYyBhbmQgZ3Rlc3QuY2MgdG8gYXZvaWQgZXhwb3J0aW5nIHRoaXMgdXRpbGl0eQorLy8gZnVuY3Rpb24uCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgYm9vbC9JbnQzMi9zdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbCk7CitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsKTsKK2NvbnN0IGNoYXIqIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbCk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YxYTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oCkBAIC0wLDAgKzEsMTY3IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIHRoZSBTdHJpbmcgY2xhc3MgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuIFRoZXkgc2hvdWxkIG5vdCB1c2VkCisvLyBieSBjb2RlIGV4dGVybmFsIHRvIEdvb2dsZSBUZXN0LgorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgaXMgI2luY2x1ZGVkIGJ5IDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPi4KKy8vIEl0IHNob3VsZCBub3QgYmUgI2luY2x1ZGVkIGJ5IG90aGVyIGZpbGVzLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIHN0cmluZy5oIGlzIG5vdCBndWFyYW50ZWVkIHRvIHByb3ZpZGUgc3RyY3B5IG9uIEMrKyBCdWlsZGVyLgorIyBpbmNsdWRlIDxtZW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTdHJpbmcgLSBhbiBhYnN0cmFjdCBjbGFzcyBob2xkaW5nIHN0YXRpYyBzdHJpbmcgdXRpbGl0aWVzLgorY2xhc3MgR1RFU1RfQVBJXyBTdHJpbmcgeworIHB1YmxpYzoKKyAgLy8gU3RhdGljIHV0aWxpdHkgbWV0aG9kcworCisgIC8vIENsb25lcyBhIDAtdGVybWluYXRlZCBDIHN0cmluZywgYWxsb2NhdGluZyBtZW1vcnkgdXNpbmcgbmV3LiAgVGhlCisgIC8vIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybiB2YWx1ZSB1c2luZworICAvLyBkZWxldGVbXS4gIFJldHVybnMgdGhlIGNsb25lZCBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlIGlucHV0IGlzCisgIC8vIE5VTEwuCisgIC8vCisgIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gc3RyZHVwKCkgaW4gc3RyaW5nLmgsIHdoaWNoIGFsbG9jYXRlcworICAvLyBtZW1vcnkgdXNpbmcgbWFsbG9jKCkuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogY19zdHIpOworCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIHRoZSAnQU5TSScgdmVyc2lvbnMgb2YgV2luMzIgQVBJcy4gVG8gYmUKKyAgLy8gYWJsZSB0byBwYXNzIHN0cmluZ3MgdG8gV2luMzIgQVBJcyBvbiBDRSB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlbQorICAvLyB0byAnVW5pY29kZScsIFVURi0xNi4KKworICAvLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nCisgIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKyAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorICAvLyBpbnB1dCBpcyBOVUxMLgorICAvLworICAvLyBUaGUgd2lkZSBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bworICAvLyBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBTlNJIHZlcnNpb25zIG9mIFdpbjMyIGNhbGxzIGFuZCB0aGUKKyAgLy8gQyBydW50aW1lLgorICBzdGF0aWMgTFBDV1NUUiBBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBjX3N0cik7CisKKyAgLy8gQ3JlYXRlcyBhbiBBTlNJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiB3aWRlIHN0cmluZywgYWxsb2NhdGluZworICAvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisgIC8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKyAgLy8gaW5wdXQgaXMgTlVMTC4KKyAgLy8KKyAgLy8gVGhlIHJldHVybmVkIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCisgIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQorICAvLyBDIHJ1bnRpbWUuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBVdGYxNlRvQW5zaShMUENXU1RSIHV0ZjE2X3N0cik7CisjZW5kaWYKKworICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKyAgLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKTsKKworICAvLyBDb252ZXJ0cyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBTdHJpbmcgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICAvLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nCisgIC8vIHRoZSBjb252ZXJzaW9uLCAiKGZhaWxlZCB0byBjb252ZXJ0IGZyb20gd2lkZSBzdHJpbmcpIiBpcworICAvLyByZXR1cm5lZC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQorICAvLyBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQorICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIHN0YXRpYyBib29sIFdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3Qgd2NoYXJfdCogcmhzKTsKKworICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5CisgIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHN0cmNhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCisgIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHMpOworCisgIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQorICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgorICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIHdpZGUgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4KKyAgLy8gT24gd2luZG93cywgdGhpcyBtZXRob2QgdXNlcyBfd2NzaWNtcCB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUKKyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXAKKyAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgLy8gT24gTWFjT1MgWCwgaXQgdXNlcyB0b3dsb3dlciwgd2hpY2ggYWxzbyB1c2VzIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZQorICAvLyBjdXJyZW50IGxvY2FsZS4KKyAgc3RhdGljIGJvb2wgQ2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcKKyAgLy8gY2FzZS4gQW55IHN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGFuIGVtcHR5IHN1ZmZpeC4KKyAgc3RhdGljIGJvb2wgRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKKworICAvLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJTAyZCIuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRJbnRXaWR0aDIoaW50IHZhbHVlKTsgIC8vICIlMDJkIiBmb3Igd2lkdGggPT0gMgorCisgIC8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlWCIuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRIZXhJbnQoaW50IHZhbHVlKTsKKworICAvLyBGb3JtYXRzIGEgYnl0ZSBhcyAiJTAyWCIuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRCeXRlKHVuc2lnbmVkIGNoYXIgdmFsdWUpOworCisgcHJpdmF0ZToKKyAgU3RyaW5nKCk7ICAvLyBOb3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkLgorfTsgIC8vIGNsYXNzIFN0cmluZworCisvLyBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBzdHJpbmdzdHJlYW0ncyBidWZmZXIgYXMgYW4gc3RkOjpzdHJpbmcuICBFYWNoICdcMCcKKy8vIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHN0cmVhbSk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1NUUklOR19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNkZmMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgKQEAgLTAsMCArMSwxMDEyIEBACisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHVwbGUuaC5wdW1wCisvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCisKKy8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCisvLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKKy8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCisvLyBwcml2YXRlIGFzIHB1YmxpYy4KKy8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAorICAgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPiBmcmllbmQgY2xhc3MgdHVwbGU7IFwKKyAgIHByaXZhdGU6CisjZW5kaWYKKworLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KKyNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgorI2RlZmluZSBHVEVTVF8xX1RVUExFXyhUKSB0dXBsZTxUIyMwLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfMl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzNfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF80X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfNV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzZfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF83X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfOF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzlfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICBUIyM3LCBUIyM4LCB2b2lkPgorI2RlZmluZSBHVEVTVF8xMF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIFQjIzgsIFQjIzk+CisKKy8vIEdURVNUX25fVFlQRU5BTUVTXyhUKSBkZWNsYXJlcyBhIGxpc3Qgb2YgbiB0eXBlbmFtZXMuCisjZGVmaW5lIEdURVNUXzBfVFlQRU5BTUVTXyhUKQorI2RlZmluZSBHVEVTVF8xX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMAorI2RlZmluZSBHVEVTVF8yX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMQorI2RlZmluZSBHVEVTVF8zX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMgorI2RlZmluZSBHVEVTVF80X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMKKyNkZWZpbmUgR1RFU1RfNV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0CisjZGVmaW5lIEdURVNUXzZfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNQorI2RlZmluZSBHVEVTVF83X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYKKyNkZWZpbmUgR1RFU1RfOF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCB0eXBlbmFtZSBUIyM3CisjZGVmaW5lIEdURVNUXzlfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAorICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgKKyNkZWZpbmUgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAorICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgsIHR5cGVuYW1lIFQjIzkKKworLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAorLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCisvLyBsaWJyYXJ5IHZlbmRvci4KK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIHRyMSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMCA9IHZvaWQsIHR5cGVuYW1lIFQxID0gdm9pZCwgdHlwZW5hbWUgVDIgPSB2b2lkLAorICAgIHR5cGVuYW1lIFQzID0gdm9pZCwgdHlwZW5hbWUgVDQgPSB2b2lkLCB0eXBlbmFtZSBUNSA9IHZvaWQsCisgICAgdHlwZW5hbWUgVDYgPSB2b2lkLCB0eXBlbmFtZSBUNyA9IHZvaWQsIHR5cGVuYW1lIFQ4ID0gdm9pZCwKKyAgICB0eXBlbmFtZSBUOSA9IHZvaWQ+CitjbGFzcyB0dXBsZTsKKworLy8gQW55dGhpbmcgaW4gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIGlzIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKKy8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCisvLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQnlSZWYgeyB0eXBlZGVmIGNvbnN0IFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLgorI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQorCisvLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMKKy8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4KKyNkZWZpbmUgR1RFU1RfQUREX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkFkZFJlZjxUPjo6dHlwZQorCisvLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLgordGVtcGxhdGUgPGludCBrPiBjbGFzcyBHZXQ7CisKKy8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUKKy8vIGlmZiBrIDwgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUgdHlwZSBULgordGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPgorc3RydWN0IFR1cGxlRWxlbWVudDsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDAsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMCB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDEsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMSB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDIsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMiB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDMsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMyB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDQsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNCB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDUsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNSB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDYsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNiB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDcsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNyB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDgsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUOCB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDksIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUOSB0eXBlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDw+CitjbGFzcyB0dXBsZTw+IHsKKyBwdWJsaWM6CisgIHR1cGxlKCkge30KKyAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzFfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjApIDogZjBfKGYwKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzJfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSkgOiBmMF8oZjApLAorICAgICAgZjFfKGYxKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+CisgIHR1cGxlKGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIDogZjBfKHAuZmlyc3QpLCBmMV8ocC5zZWNvbmQpIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgeworICAgIGYwXyA9IHAuZmlyc3Q7CisgICAgZjFfID0gcC5zZWNvbmQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfM19UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMikge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNF9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMykge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLAorICAgICAgR1RFU1RfQllfUkVGXyhUNCkgZjQpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF82X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCisgICAgICBmNV8oZjUpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfN19UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCisgICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF84X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LAorICAgICAgR1RFU1RfQllfUkVGXyhUNykgZjcpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNykge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfOV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAorICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgZjhfID0gdC5mOF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187CisgIFQ4IGY4XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgdHVwbGUgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSwKKyAgICAgIGY5XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwgR1RFU1RfQllfUkVGXyhUNykgZjcsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ4KSBmOCwgR1RFU1RfQllfUkVGXyhUOSkgZjkpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCksIGY5XyhmOSkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwgZjlfKHQuZjlfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksCisgICAgICBmOV8odC5mOV8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIGY3XyA9IHQuZjdfOworICAgIGY4XyA9IHQuZjhfOworICAgIGY5XyA9IHQuZjlfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKKyAgVDcgZjdfOworICBUOCBmOF87CisgIFQ5IGY5XzsKK307CisKKy8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLgorCisvLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuCisvLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0CisvLyBpbXBsZW1lbnQgdGllKCkuCisKK2lubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0KKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8xX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCkgeworICByZXR1cm4gR1RFU1RfMV9UVVBMRV8oVCkoZjApOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzJfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEpIHsKKyAgcmV0dXJuIEdURVNUXzJfVFVQTEVfKFQpKGYwLCBmMSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfM19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyKSB7CisgIHJldHVybiBHVEVTVF8zX1RVUExFXyhUKShmMCwgZjEsIGYyKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF80X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzKSB7CisgIHJldHVybiBHVEVTVF80X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMyk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfNV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0KSB7CisgIHJldHVybiBHVEVTVF81X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzZfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1KSB7CisgIHJldHVybiBHVEVTVF82X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF83X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2KSB7CisgIHJldHVybiBHVEVTVF83X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNik7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfOF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3KSB7CisgIHJldHVybiBHVEVTVF84X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzlfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKKyAgICBjb25zdCBUOCYgZjgpIHsKKyAgcmV0dXJuIEdURVNUXzlfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8xMF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LAorICAgIGNvbnN0IFQ4JiBmOCwgY29uc3QgVDkmIGY5KSB7CisgIHJldHVybiBHVEVTVF8xMF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCwgZjkpOworfQorCisvLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IHN0cnVjdCB0dXBsZV9zaXplOworCit0ZW1wbGF0ZSA8R1RFU1RfMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMF9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOworfTsKKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzFfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8yX1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDI7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfM19UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAzOworfTsKKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzRfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF81X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNl9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA2OworfTsKKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzdfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF84X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDg7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOV9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA5OworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxMDsKK307CisKK3RlbXBsYXRlIDxpbnQgaywgY2xhc3MgVHVwbGU+CitzdHJ1Y3QgdHVwbGVfZWxlbWVudCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwKKyAgICAgIGsgPCAodHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwgaywgVHVwbGU+Ojp0eXBlIHR5cGU7Cit9OworCisjZGVmaW5lIEdURVNUX1RVUExFX0VMRU1FTlRfKGssIFR1cGxlKSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PGssIFR1cGxlID46OnR5cGUKKworLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4KKworbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwwPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjBfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDE+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMV87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Mj4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYyXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwzPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjNfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDQ+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNF87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8NT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY1XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw2PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjZfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDc+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mN187IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8OD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY4XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw5PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjlfOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfMTBfVFVQTEVfKFQpKSkKK2dldChHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOworfQorCit0ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8xMF9UVVBMRV8oVCkpKQorZ2V0KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKK30KKworLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycworCisvLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCisKK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKy8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKKy8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCisvLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKKy8vIGsxICE9IGsyLgordGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4geworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+CisgIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGludCBrPgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgorICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7CisgICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKKyAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKSwgR1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHUpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwKKyAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpID46OnZhbHVlLAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVSkgPjo6dmFsdWU+OjpFcSh0LCB1KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KKworLy8gNi4xLjQgUGFpcnMuCisvLyBVbmltcGxlbWVudGVkLgorCit9ICAvLyBuYW1lc3BhY2UgdHIxCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBHVEVTVF8wX1RVUExFXworI3VuZGVmIEdURVNUXzFfVFVQTEVfCisjdW5kZWYgR1RFU1RfMl9UVVBMRV8KKyN1bmRlZiBHVEVTVF8zX1RVUExFXworI3VuZGVmIEdURVNUXzRfVFVQTEVfCisjdW5kZWYgR1RFU1RfNV9UVVBMRV8KKyN1bmRlZiBHVEVTVF82X1RVUExFXworI3VuZGVmIEdURVNUXzdfVFVQTEVfCisjdW5kZWYgR1RFU1RfOF9UVVBMRV8KKyN1bmRlZiBHVEVTVF85X1RVUExFXworI3VuZGVmIEdURVNUXzEwX1RVUExFXworCisjdW5kZWYgR1RFU1RfMF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMl9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfM19UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNl9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfN19UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfOF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfOV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMTBfVFlQRU5BTUVTXworCisjdW5kZWYgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisjdW5kZWYgR1RFU1RfQllfUkVGXworI3VuZGVmIEdURVNUX0FERF9SRUZfCisjdW5kZWYgR1RFU1RfVFVQTEVfRUxFTUVOVF8KKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q5ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcApAQCAtMCwwICsxLDMzOSBAQAorJCQgLSotIG1vZGU6IGMrKzsgLSotCiskdmFyIG4gPSAxMCAgJCQgTWF4aW11bSBudW1iZXIgb2YgdHVwbGUgZmllbGRzIHdlIHdhbnQgdG8gc3VwcG9ydC4KKyQkIFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gRW1hY3MuIH19CisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEltcGxlbWVudHMgYSBzdWJzZXQgb2YgVFIxIHR1cGxlIG5lZWRlZCBieSBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2suCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gRm9yIDo6c3RkOjpwYWlyLgorCisvLyBUaGUgY29tcGlsZXIgdXNlZCBpbiBTeW1iaWFuIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHVzIGZyb20gZGVjbGFyaW5nIHRoZQorLy8gdHVwbGUgdGVtcGxhdGUgYXMgYSBmcmllbmQgKGl0IGNvbXBsYWlucyB0aGF0IHR1cGxlIGlzIHJlZGVmaW5lZCkuICBUaGlzCisvLyBoYWNrIGJ5cGFzc2VzIHRoZSBidWcgYnkgZGVjbGFyaW5nIHRoZSBtZW1iZXJzIHRoYXQgc2hvdWxkIG90aGVyd2lzZSBiZQorLy8gcHJpdmF0ZSBhcyBwdWJsaWMuCisvLyBTdW4gU3R1ZGlvIHZlcnNpb25zIDwgMTIgYWxzbyBoYXZlIHRoZSBhYm92ZSBidWcuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCAoZGVmaW5lZChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDU5MCkKKyMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBwdWJsaWM6CisjZWxzZQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIFwKKyAgICB0ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFUpPiBmcmllbmQgY2xhc3MgdHVwbGU7IFwKKyAgIHByaXZhdGU6CisjZW5kaWYKKworCiskcmFuZ2UgaSAwLi5uLTEKKyRyYW5nZSBqIDAuLm4KKyRyYW5nZSBrIDEuLm4KKy8vIEdURVNUX25fVFVQTEVfKFQpIGlzIHRoZSB0eXBlIG9mIGFuIG4tdHVwbGUuCisjZGVmaW5lIEdURVNUXzBfVFVQTEVfKFQpIHR1cGxlPD4KKworJGZvciBrIFtbCiskcmFuZ2UgbSAwLi5rLTEKKyRyYW5nZSBtMiBrLi5uLTEKKyNkZWZpbmUgR1RFU1RfJChrKV9UVVBMRV8oVCkgdHVwbGU8JGZvciBtLCBbW1QjIyRtXV0kZm9yIG0yIFtbLCB2b2lkXV0+CisKK11dCisKKy8vIEdURVNUX25fVFlQRU5BTUVTXyhUKSBkZWNsYXJlcyBhIGxpc3Qgb2YgbiB0eXBlbmFtZXMuCisKKyRmb3IgaiBbWworJHJhbmdlIG0gMC4uai0xCisjZGVmaW5lIEdURVNUXyQoailfVFlQRU5BTUVTXyhUKSAkZm9yIG0sIFtbdHlwZW5hbWUgVCMjJG1dXQorCisKK11dCisKKy8vIEluIHRoZW9yeSwgZGVmaW5pbmcgc3R1ZmYgaW4gdGhlIDo6c3RkIG5hbWVzcGFjZSBpcyB1bmRlZmluZWQKKy8vIGJlaGF2aW9yLiAgV2UgY2FuIGRvIHRoaXMgYXMgd2UgYXJlIHBsYXlpbmcgdGhlIHJvbGUgb2YgYSBzdGFuZGFyZAorLy8gbGlicmFyeSB2ZW5kb3IuCituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSB0cjEgeworCit0ZW1wbGF0ZSA8JGZvciBpLCBbW3R5cGVuYW1lIFQkaSA9IHZvaWRdXT4KK2NsYXNzIHR1cGxlOworCisvLyBBbnl0aGluZyBpbiBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgaXMgR29vZ2xlIFRlc3QncyBJTlRFUk5BTAorLy8gSU1QTEVNRU5UQVRJT04gREVUQUlMIGFuZCBNVVNUIE5PVCBCRSBVU0VEIERJUkVDVExZIGluIHVzZXIgY29kZS4KK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKy8vIEJ5UmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgY29uc3QgVCYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeVJlZiB7IHR5cGVkZWYgY29uc3QgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQnlSZWY8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBmb3IgQnlSZWYuCisjZGVmaW5lIEdURVNUX0JZX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkJ5UmVmPFQ+Ojp0eXBlCisKKy8vIEFkZFJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIFQmLiAgVGhpcworLy8gaXMgdGhlIHNhbWUgYXMgdHIxOjphZGRfcmVmZXJlbmNlPFQ+Ojp0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmIHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWY8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBmb3IgQWRkUmVmLgorI2RlZmluZSBHVEVTVF9BRERfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QWRkUmVmPFQ+Ojp0eXBlCisKKy8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgZ2V0PGs+KCkuCit0ZW1wbGF0ZSA8aW50IGs+IGNsYXNzIEdldDsKKworLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyB0dXBsZV9lbGVtZW50PGssIFQ+LiAga0luZGV4VmFsaWQgaXMgdHJ1ZQorLy8gaWZmIGsgPCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0dXBsZSB0eXBlIFQuCit0ZW1wbGF0ZSA8Ym9vbCBrSW5kZXhWYWxpZCwgaW50IGtJbmRleCwgY2xhc3MgVHVwbGU+CitzdHJ1Y3QgVHVwbGVFbGVtZW50OworCisKKyRmb3IgaSBbWwordGVtcGxhdGUgPEdURVNUXyQobilfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgJGksIEdURVNUXyQobilfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQkaSB0eXBlOworfTsKKworCitdXQorfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDw+CitjbGFzcyB0dXBsZTw+IHsKKyBwdWJsaWM6CisgIHR1cGxlKCkge30KKyAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQorfTsKKworCiskZm9yIGsgW1sKKyRyYW5nZSBtIDAuLmstMQordGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhUKT4KK2NsYXNzICRpZiBrIDwgbiBbW0dURVNUXyQoaylfVFVQTEVfKFQpXV0gJGVsc2UgW1t0dXBsZV1dIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6ICRmb3IgbSwgW1tmJChtKV8oKV1dIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoJGZvciBtLCBbW0dURVNUX0JZX1JFRl8oVCRtKSBmJG1dXSkgOiBbW11dCiskZm9yIG0sIFtbZiQobSlfKGYkbSldXSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6ICRmb3IgbSwgW1tmJChtKV8odC5mJChtKV8pXV0ge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8kKGspX1RVUExFXyhVKSYgdCkgOiAkZm9yIG0sIFtbZiQobSlfKHQuZiQobSlfKV1dIHt9CisKKyRpZiBrID09IDIgW1sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KKyAgdHVwbGUoY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgOiBmMF8ocC5maXJzdCksIGYxXyhwLnNlY29uZCkge30KKworXV0KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfJChrKV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworJGlmIGsgPT0gMiBbWworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIHsKKyAgICBmMF8gPSBwLmZpcnN0OworICAgIGYxXyA9IHAuc2Vjb25kOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitdXQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8kKGspX1RVUExFXyhVKSYgdCkgeworCiskZm9yIG0gW1sKKyAgICBmJChtKV8gPSB0LmYkKG0pXzsKKworXV0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworCiskZm9yIG0gW1sKKyAgVCRtIGYkKG0pXzsKKworXV0KK307CisKKworXV0KKy8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLgorCisvLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuCisvLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0CisvLyBpbXBsZW1lbnQgdGllKCkuCisKK2lubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0KKworJGZvciBrIFtbCiskcmFuZ2UgbSAwLi5rLTEKKwordGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8kKGspX1RVUExFXyhUKSBtYWtlX3R1cGxlKCRmb3IgbSwgW1tjb25zdCBUJG0mIGYkbV1dKSB7CisgIHJldHVybiBHVEVTVF8kKGspX1RVUExFXyhUKSgkZm9yIG0sIFtbZiRtXV0pOworfQorCitdXQorCisvLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IHN0cnVjdCB0dXBsZV9zaXplOworCisKKyRmb3IgaiBbWwordGVtcGxhdGUgPEdURVNUXyQoailfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXyQoailfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gJGo7Cit9OworCisKK11dCit0ZW1wbGF0ZSA8aW50IGssIGNsYXNzIFR1cGxlPgorc3RydWN0IHR1cGxlX2VsZW1lbnQgeworICB0eXBlZGVmIHR5cGVuYW1lIGd0ZXN0X2ludGVybmFsOjpUdXBsZUVsZW1lbnQ8CisgICAgICBrIDwgKHR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSksIGssIFR1cGxlPjo6dHlwZSB0eXBlOworfTsKKworI2RlZmluZSBHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBUdXBsZSkgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxrLCBUdXBsZSA+Ojp0eXBlCisKKy8vIDYuMS4zLjQgRWxlbWVudCBhY2Nlc3MuCisKK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKworJGZvciBpIFtbCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PCRpPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygkaSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mJChpKV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oJGksIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mJChpKV87IH0KK307CisKKworXV0KK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8aW50IGssIEdURVNUXyQobilfVFlQRU5BTUVTXyhUKT4KK0dURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssIEdURVNUXyQobilfVFVQTEVfKFQpKSkKK2dldChHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6RmllbGQodCk7Cit9CisKK3RlbXBsYXRlIDxpbnQgaywgR1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpPgorR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCAgR1RFU1RfJChuKV9UVVBMRV8oVCkpKQorZ2V0KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpDb25zdEZpZWxkKHQpOworfQorCisvLyA2LjEuMy41IFJlbGF0aW9uYWwgb3BlcmF0b3JzCisKKy8vIFdlIG9ubHkgaW1wbGVtZW50ID09IGFuZCAhPSwgYXMgd2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoZSByZXN0IHlldC4KKworbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8aywgaz46OkVxKHQxLCB0MikgcmV0dXJucyB0cnVlIGlmIHRoZQorLy8gZmlyc3QgayBmaWVsZHMgb2YgdDEgZXF1YWxzIHRoZSBmaXJzdCBrIGZpZWxkcyBvZiB0Mi4KKy8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yKGsxLCBrMikgd291bGQgYmUgYSBjb21waWxlciBlcnJvciBpZgorLy8gazEgIT0gazIuCit0ZW1wbGF0ZSA8aW50IGtTaXplMSwgaW50IGtTaXplMj4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwwLCAwPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KKyAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiAvKiB0MSAqLywgY29uc3QgVHVwbGUyJiAvKiB0MiAqLykgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IGs+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8aywgaz4geworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+CisgIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgdDEsIGNvbnN0IFR1cGxlMiYgdDIpIHsKKyAgICByZXR1cm4gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8ayAtIDEsIGsgLSAxPjo6RXEodDEsIHQyKSAmJgorICAgICAgICA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQxKSA9PSA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQyKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCksIEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFUpJiB1KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6U2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8CisgICAgICB0dXBsZV9zaXplPEdURVNUXyQobilfVFVQTEVfKFQpID46OnZhbHVlLAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8kKG4pX1RVUExFXyhVKSA+Ojp2YWx1ZT46OkVxKHQsIHUpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhVKSYgdSkgeyByZXR1cm4gISh0ID09IHUpOyB9CisKKy8vIDYuMS40IFBhaXJzLgorLy8gVW5pbXBsZW1lbnRlZC4KKworfSAgLy8gbmFtZXNwYWNlIHRyMQorfSAgLy8gbmFtZXNwYWNlIHN0ZAorCisKKyRmb3IgaiBbWworI3VuZGVmIEdURVNUXyQoailfVFVQTEVfCisKK11dCisKKworJGZvciBqIFtbCisjdW5kZWYgR1RFU1RfJChqKV9UWVBFTkFNRVNfCisKK11dCisKKyN1bmRlZiBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKyN1bmRlZiBHVEVTVF9CWV9SRUZfCisjdW5kZWYgR1RFU1RfQUREX1JFRl8KKyN1bmRlZiBHVEVTVF9UVVBMRV9FTEVNRU5UXworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZmN2NmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oCkBAIC0wLDAgKzEsMzMzMSBAQAorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGd0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkCisvLyB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgNTAgdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCA1MAorLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIG9uZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgorLy8gUGxlYXNlIGNvbnRhY3QgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBtb3JlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKy8vICNpZmRlZiBfX0dOVUNfXyBpcyB0b28gZ2VuZXJhbCBoZXJlLiAgSXQgaXMgcG9zc2libGUgdG8gdXNlIGdjYyB3aXRob3V0IHVzaW5nCisvLyBsaWJzdGRjKysgKHdoaWNoIGlzIHdoZXJlIGN4eGFiaS5oIGNvbWVzIGZyb20pLgorIyBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCisjICBpbmNsdWRlIDxjeHhhYmkuaD4KKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPgorIyBlbmRpZiAgLy8gR1RFU1RfSEFTSF9DWFhBQklfSF8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuCisvLyBOQjogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgaW4gR29vZ2xlIE1vY2ssIHNvIGRvbid0IG1vdmUgaXQgaW5zaWRlIG9mCisvLyB0aGUgdHlwZWQtdGVzdC1vbmx5IHNlY3Rpb24gYmVsb3cuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgeworIyBpZiBHVEVTVF9IQVNfUlRUSQorCisgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSB0eXBlaWQoVCkubmFtZSgpOworIyAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBkZWZpbmVkKF9fSFBfYUNDKQorICBpbnQgc3RhdHVzID0gMDsKKyAgLy8gZ2NjJ3MgaW1wbGVtZW50YXRpb24gb2YgdHlwZWlkKFQpLm5hbWUoKSBtYW5nbGVzIHRoZSB0eXBlIG5hbWUsCisgIC8vIHNvIHdlIGhhdmUgdG8gZGVtYW5nbGUgaXQuCisjICAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXworICB1c2luZyBhYmk6Ol9fY3hhX2RlbWFuZ2xlOworIyAgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfCisgIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV9zdHIoc3RhdHVzID09IDAgPyByZWFkYWJsZV9uYW1lIDogbmFtZSk7CisgIGZyZWUocmVhZGFibGVfbmFtZSk7CisgIHJldHVybiBuYW1lX3N0cjsKKyMgIGVsc2UKKyAgcmV0dXJuIG5hbWU7CisjICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBfX0hQX2FDQworCisjIGVsc2UKKworICByZXR1cm4gIjx0eXBlPiI7CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCit9CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIEFzc2VydHlUeXBlRXE8VDEsIFQyPjo6dHlwZSBpcyBkZWZpbmVkIGlmZiBUMSBhbmQgVDIgYXJlIHRoZSBzYW1lCisvLyB0eXBlLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gdG8gZW5zdXJlIHRoYXQKKy8vIHR3byB0eXBlcyBhcmUgZXF1YWwuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgQXNzZXJ0VHlwZUVxOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBc3NlcnRUeXBlRXE8VCwgVD4geworICB0eXBlZGVmIGJvb2wgdHlwZTsKK307CisKKy8vIEEgdW5pcXVlIHR5cGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50cyBvZiBjbGFzcworLy8gdGVtcGxhdGUgVHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZSB2YXJpYWRpYyB0ZW1wbGF0ZXMKKy8vIChlLmcuIFR5cGVzPGludD4sIFR5cGU8aW50LCBkb3VibGU+LCBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3QKKy8vIHN1cHBvcnQgZGlyZWN0bHkuCitzdHJ1Y3QgTm9uZSB7fTsKKworLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCisvLyByZXByZXNlbnQgdHlwZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFR5cGVzTjxUMSwgVDIsIC4uLiwgVE4+CisvLyByZXByZXNlbnRzIGEgdHlwZSBsaXN0IHdpdGggTiB0eXBlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikgaW4gaXQuCisvLyBFeGNlcHQgZm9yIFR5cGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6CisvLyBIZWFkIGZvciB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwgZm9yIHRoZSByZXN0IG9mIHRoZQorLy8gbGlzdC4KKworLy8gVGhlIGVtcHR5IHR5cGUgbGlzdC4KK3N0cnVjdCBUeXBlczAge307CisKKy8vIFR5cGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorc3RydWN0IFR5cGVzMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczAgVGFpbDsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IFR5cGVzMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE8VDI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK3N0cnVjdCBUeXBlczMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyPFQyLCBUMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK3N0cnVjdCBUeXBlczQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzPFQyLCBUMywgVDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1Pgorc3RydWN0IFR5cGVzNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ8VDIsIFQzLCBUNCwgVDU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2Pgorc3RydWN0IFR5cGVzNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczU8VDIsIFQzLCBUNCwgVDUsIFQ2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitzdHJ1Y3QgVHlwZXM3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pgorc3RydWN0IFR5cGVzOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgorc3RydWN0IFR5cGVzOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorc3RydWN0IFR5cGVzMTAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK3N0cnVjdCBUeXBlczExIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK3N0cnVjdCBUeXBlczEyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitzdHJ1Y3QgVHlwZXMxMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK3N0cnVjdCBUeXBlczE0IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK3N0cnVjdCBUeXBlczE1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitzdHJ1Y3QgVHlwZXMxNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK3N0cnVjdCBUeXBlczE3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KK3N0cnVjdCBUeXBlczE4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitzdHJ1Y3QgVHlwZXMxOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK3N0cnVjdCBUeXBlczIwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxPgorc3RydWN0IFR5cGVzMjEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorc3RydWN0IFR5cGVzMjIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK3N0cnVjdCBUeXBlczIzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0Pgorc3RydWN0IFR5cGVzMjQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgorc3RydWN0IFR5cGVzMjUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2Pgorc3RydWN0IFR5cGVzMjYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KK3N0cnVjdCBUeXBlczI3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4Pgorc3RydWN0IFR5cGVzMjggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5Pgorc3RydWN0IFR5cGVzMjkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitzdHJ1Y3QgVHlwZXMzMCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK3N0cnVjdCBUeXBlczMxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KK3N0cnVjdCBUeXBlczMyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitzdHJ1Y3QgVHlwZXMzMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK3N0cnVjdCBUeXBlczM0IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK3N0cnVjdCBUeXBlczM1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK3N0cnVjdCBUeXBlczM2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitzdHJ1Y3QgVHlwZXMzNyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK3N0cnVjdCBUeXBlczM4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KK3N0cnVjdCBUeXBlczM5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitzdHJ1Y3QgVHlwZXM0MCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgorc3RydWN0IFR5cGVzNDEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+CitzdHJ1Y3QgVHlwZXM0MiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+CitzdHJ1Y3QgVHlwZXM0MyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KK3N0cnVjdCBUeXBlczQ0IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0ND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK3N0cnVjdCBUeXBlczQ1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0Nj4KK3N0cnVjdCBUeXBlczQ2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+CitzdHJ1Y3QgVHlwZXM0NyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK3N0cnVjdCBUeXBlczQ4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KK3N0cnVjdCBUeXBlczQ5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitzdHJ1Y3QgVHlwZXM1MCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFRhaWw7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBXZSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlIHVzZXJzIHRvIHdyaXRlIFR5cGVzTjwuLi4+IGRpcmVjdGx5LAorLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFR5cGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVHlwZXM8aW50PgorLy8gd2lsbCBhcHBlYXIgYXMgVHlwZXM8aW50LCBOb25lLCBOb25lLCAuLi4sIE5vbmU+IGluIHRoZSBjb21waWxlcgorLy8gZXJyb3JzKS4KKy8vCisvLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQorLy8gdXNlciB3b3VsZCB3cml0ZSBUeXBlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQorLy8gdGhhdCB0byBUeXBlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFR5cGVzIHRlbXBsYXRlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDExID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDE3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDIzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDI5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDM1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0MiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0MyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQ3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0OCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0OSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNTAgPSBpbnRlcm5hbDo6Tm9uZT4KK3N0cnVjdCBUeXBlcyB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFR5cGVzPGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczAgdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitzdHJ1Y3QgVHlwZXM8VDEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTxUMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI8VDEsIFQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzPFQxLCBUMiwgVDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0PFQxLCBUMiwgVDMsIFQ0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczU8VDEsIFQyLCBUMywgVDQsIFQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0Nj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKKyAgICBUNDYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKKyAgICBUNDYsIFQ0NywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBUNDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKKyAgICBUNDYsIFQ0NywgVDQ4LCBUNDksIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiB0eXBlOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworIyBkZWZpbmUgR1RFU1RfVEVNUExBVEVfIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcworCisvLyBUaGUgdGVtcGxhdGUgInNlbGVjdG9yIiBzdHJ1Y3QgVGVtcGxhdGVTZWw8VG1wbD4gaXMgdXNlZCB0bworLy8gcmVwcmVzZW50IFRtcGwsIHdoaWNoIG11c3QgYmUgYSBjbGFzcyB0ZW1wbGF0ZSB3aXRoIG9uZSB0eXBlCisvLyBwYXJhbWV0ZXIsIGFzIGEgdHlwZS4gIFRlbXBsYXRlU2VsPFRtcGw+OjpCaW5kPFQ+Ojp0eXBlIGlzIGRlZmluZWQKKy8vIGFzIHRoZSB0eXBlIFRtcGw8VD4uICBUaGlzIGFsbG93cyB1cyB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSB0aGUKKy8vIHRlbXBsYXRlICJzZWxlY3RlZCIgYnkgVGVtcGxhdGVTZWw8VG1wbD4uCisvLworLy8gVGhpcyB0cmljayBpcyBuZWNlc3NhcnkgZm9yIHNpbXVsYXRpbmcgdHlwZWRlZiBmb3IgY2xhc3MgdGVtcGxhdGVzLAorLy8gd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVG1wbD4KK3N0cnVjdCBUZW1wbGF0ZVNlbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgQmluZCB7CisgICAgdHlwZWRlZiBUbXBsPFQ+IHR5cGU7CisgIH07Cit9OworCisjIGRlZmluZSBHVEVTVF9CSU5EXyhUbXBsU2VsLCBUKSBcCisgIFRtcGxTZWw6OnRlbXBsYXRlIEJpbmQ8VD46OnR5cGUKKworLy8gQSB1bmlxdWUgc3RydWN0IHRlbXBsYXRlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQorLy8gYXJndW1lbnRzIG9mIGNsYXNzIHRlbXBsYXRlIFRlbXBsYXRlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlCisvLyB2YXJpYWRpYyB0ZW1wbGF0ZXMgKGUuZy4gVGVtcGxhdGVzPGludD4sIFRlbXBsYXRlczxpbnQsIGRvdWJsZT4sCisvLyBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IE5vbmVUIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KKy8vIHJlcHJlc2VudCB0ZW1wbGF0ZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFRlbXBsYXRlc048VDEsIFQyLCAuLi4sCisvLyBUTj4gcmVwcmVzZW50cyBhIGxpc3Qgb2YgTiB0ZW1wbGF0ZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pLiAgRXhjZXB0CisvLyBmb3IgVGVtcGxhdGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6CisvLyBIZWFkIGZvciB0aGUgc2VsZWN0b3Igb2YgdGhlIGZpcnN0IHRlbXBsYXRlIGluIHRoZSBsaXN0LCBhbmQgVGFpbAorLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBsaXN0LgorCisvLyBUaGUgZW1wdHkgdGVtcGxhdGUgbGlzdC4KK3N0cnVjdCBUZW1wbGF0ZXMwIHt9OworCisvLyBUZW1wbGF0ZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgorCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgorc3RydWN0IFRlbXBsYXRlczEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczAgVGFpbDsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+CitzdHJ1Y3QgVGVtcGxhdGVzMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTxUMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzPgorc3RydWN0IFRlbXBsYXRlczMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI8VDIsIFQzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgorc3RydWN0IFRlbXBsYXRlczQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM8VDIsIFQzLCBUND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1Pgorc3RydWN0IFRlbXBsYXRlczUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ8VDIsIFQzLCBUNCwgVDU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2Pgorc3RydWN0IFRlbXBsYXRlczYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczU8VDIsIFQzLCBUNCwgVDUsIFQ2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDc+CitzdHJ1Y3QgVGVtcGxhdGVzNyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOD4KK3N0cnVjdCBUZW1wbGF0ZXM4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5Pgorc3RydWN0IFRlbXBsYXRlczkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+CitzdHJ1Y3QgVGVtcGxhdGVzMTAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KK3N0cnVjdCBUZW1wbGF0ZXMxMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgorc3RydWN0IFRlbXBsYXRlczEyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzPgorc3RydWN0IFRlbXBsYXRlczEzIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQ+CitzdHJ1Y3QgVGVtcGxhdGVzMTQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczEzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNT4KK3N0cnVjdCBUZW1wbGF0ZXMxNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNj4KK3N0cnVjdCBUZW1wbGF0ZXMxNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3Pgorc3RydWN0IFRlbXBsYXRlczE3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOD4KK3N0cnVjdCBUZW1wbGF0ZXMxOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5Pgorc3RydWN0IFRlbXBsYXRlczE5IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMD4KK3N0cnVjdCBUZW1wbGF0ZXMyMCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMT4KK3N0cnVjdCBUZW1wbGF0ZXMyMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjI+CitzdHJ1Y3QgVGVtcGxhdGVzMjIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjM+CitzdHJ1Y3QgVGVtcGxhdGVzMjMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczIyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyND4KK3N0cnVjdCBUZW1wbGF0ZXMyNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNT4KK3N0cnVjdCBUZW1wbGF0ZXMyNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2Pgorc3RydWN0IFRlbXBsYXRlczI2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNz4KK3N0cnVjdCBUZW1wbGF0ZXMyNyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgorc3RydWN0IFRlbXBsYXRlczI4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjk+CitzdHJ1Y3QgVGVtcGxhdGVzMjkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwPgorc3RydWN0IFRlbXBsYXRlczMwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzE+CitzdHJ1Y3QgVGVtcGxhdGVzMzEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyPgorc3RydWN0IFRlbXBsYXRlczMyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzPgorc3RydWN0IFRlbXBsYXRlczMzIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzND4KK3N0cnVjdCBUZW1wbGF0ZXMzNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNT4KK3N0cnVjdCBUZW1wbGF0ZXMzNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2Pgorc3RydWN0IFRlbXBsYXRlczM2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3Pgorc3RydWN0IFRlbXBsYXRlczM3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzg+CitzdHJ1Y3QgVGVtcGxhdGVzMzggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5Pgorc3RydWN0IFRlbXBsYXRlczM5IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDA+CitzdHJ1Y3QgVGVtcGxhdGVzNDAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxPgorc3RydWN0IFRlbXBsYXRlczQxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgorc3RydWN0IFRlbXBsYXRlczQyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDM+CitzdHJ1Y3QgVGVtcGxhdGVzNDMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0Pgorc3RydWN0IFRlbXBsYXRlczQ0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgorc3RydWN0IFRlbXBsYXRlczQ1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Nj4KK3N0cnVjdCBUZW1wbGF0ZXM0NiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0Nz4KK3N0cnVjdCBUZW1wbGF0ZXM0NyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgorc3RydWN0IFRlbXBsYXRlczQ4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5Pgorc3RydWN0IFRlbXBsYXRlczQ5IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDksIEdURVNUX1RFTVBMQVRFXyBUNTA+CitzdHJ1Y3QgVGVtcGxhdGVzNTAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFRhaWw7Cit9OworCisKKy8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVGVtcGxhdGVzTjwuLi4+IGRpcmVjdGx5LAorLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFRlbXBsYXRlczwuLi4+IGlzIG11Y2gKKy8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKKy8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQorLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFRlbXBsYXRlczxsaXN0PgorLy8gd2lsbCBhcHBlYXIgYXMgVGVtcGxhdGVzPGxpc3QsIE5vbmVULCBOb25lVCwgLi4uLCBOb25lVD4gaW4gdGhlIGNvbXBpbGVyCisvLyBlcnJvcnMpLgorLy8KKy8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCisvLyB1c2VyIHdvdWxkIHdyaXRlIFRlbXBsYXRlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQorLy8gdGhhdCB0byBUZW1wbGF0ZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKKy8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCisvLyBUZW1wbGF0ZXMgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ2ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUOCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDEwID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDEyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDE0ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDE2ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDE4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDIwID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDIyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDI0ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDI2ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDI4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDMwID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDMyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDM0ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDM2ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDM4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQwID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQ0ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQ2ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQ4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDUwID0gTm9uZVQ+CitzdHJ1Y3QgVGVtcGxhdGVzIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVGVtcGxhdGVzPE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMwIHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE8VDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjxUMSwgVDI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzxUMSwgVDIsIFQzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUND4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0PFQxLCBUMiwgVDMsIFQ0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczU8VDEsIFQyLCBUMywgVDQsIFQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0Mj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0Mj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAorICAgIFQ0NSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Nj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAorICAgIFQ0NSwgVDQ2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0Nz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAorICAgIFQ0NSwgVDQ2LCBUNDcsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAorICAgIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiB0eXBlOworfTsKKworLy8gVGhlIFR5cGVMaXN0IHRlbXBsYXRlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBlaXRoZXIgYSBzaW5nbGUgdHlwZQorLy8gb3IgYSBUeXBlczwuLi4+IGxpc3QgaW4gVFlQRURfVEVTVF9DQVNFKCkgYW5kCisvLyBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUCgpLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBUeXBlTGlzdCB7CisgIHR5cGVkZWYgVHlwZXMxPFQ+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitzdHJ1Y3QgVHlwZUxpc3Q8VHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+ID4geworICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPjo6dHlwZSB0eXBlOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTFmZGYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKQEAgLTAsMCArMSwyOTcgQEAKKyQkIC0qLSBtb2RlOiBjKys7IC0qLQorJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIHR5cGUgbGlzdHMgd2Ugd2FudCB0byBzdXBwb3J0LgorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkCisvLyB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgJG4gdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCAkbgorLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIG9uZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgorLy8gUGxlYXNlIGNvbnRhY3QgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBtb3JlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKy8vICNpZmRlZiBfX0dOVUNfXyBpcyB0b28gZ2VuZXJhbCBoZXJlLiAgSXQgaXMgcG9zc2libGUgdG8gdXNlIGdjYyB3aXRob3V0IHVzaW5nCisvLyBsaWJzdGRjKysgKHdoaWNoIGlzIHdoZXJlIGN4eGFiaS5oIGNvbWVzIGZyb20pLgorIyBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCisjICBpbmNsdWRlIDxjeHhhYmkuaD4KKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPgorIyBlbmRpZiAgLy8gR1RFU1RfSEFTSF9DWFhBQklfSF8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuCisvLyBOQjogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgaW4gR29vZ2xlIE1vY2ssIHNvIGRvbid0IG1vdmUgaXQgaW5zaWRlIG9mCisvLyB0aGUgdHlwZWQtdGVzdC1vbmx5IHNlY3Rpb24gYmVsb3cuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgeworIyBpZiBHVEVTVF9IQVNfUlRUSQorCisgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSB0eXBlaWQoVCkubmFtZSgpOworIyAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBkZWZpbmVkKF9fSFBfYUNDKQorICBpbnQgc3RhdHVzID0gMDsKKyAgLy8gZ2NjJ3MgaW1wbGVtZW50YXRpb24gb2YgdHlwZWlkKFQpLm5hbWUoKSBtYW5nbGVzIHRoZSB0eXBlIG5hbWUsCisgIC8vIHNvIHdlIGhhdmUgdG8gZGVtYW5nbGUgaXQuCisjICAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXworICB1c2luZyBhYmk6Ol9fY3hhX2RlbWFuZ2xlOworIyAgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfCisgIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV9zdHIoc3RhdHVzID09IDAgPyByZWFkYWJsZV9uYW1lIDogbmFtZSk7CisgIGZyZWUocmVhZGFibGVfbmFtZSk7CisgIHJldHVybiBuYW1lX3N0cjsKKyMgIGVsc2UKKyAgcmV0dXJuIG5hbWU7CisjICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBfX0hQX2FDQworCisjIGVsc2UKKworICByZXR1cm4gIjx0eXBlPiI7CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCit9CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIEFzc2VydHlUeXBlRXE8VDEsIFQyPjo6dHlwZSBpcyBkZWZpbmVkIGlmZiBUMSBhbmQgVDIgYXJlIHRoZSBzYW1lCisvLyB0eXBlLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gdG8gZW5zdXJlIHRoYXQKKy8vIHR3byB0eXBlcyBhcmUgZXF1YWwuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgQXNzZXJ0VHlwZUVxOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBc3NlcnRUeXBlRXE8VCwgVD4geworICB0eXBlZGVmIGJvb2wgdHlwZTsKK307CisKKy8vIEEgdW5pcXVlIHR5cGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50cyBvZiBjbGFzcworLy8gdGVtcGxhdGUgVHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZSB2YXJpYWRpYyB0ZW1wbGF0ZXMKKy8vIChlLmcuIFR5cGVzPGludD4sIFR5cGU8aW50LCBkb3VibGU+LCBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3QKKy8vIHN1cHBvcnQgZGlyZWN0bHkuCitzdHJ1Y3QgTm9uZSB7fTsKKworLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCisvLyByZXByZXNlbnQgdHlwZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFR5cGVzTjxUMSwgVDIsIC4uLiwgVE4+CisvLyByZXByZXNlbnRzIGEgdHlwZSBsaXN0IHdpdGggTiB0eXBlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikgaW4gaXQuCisvLyBFeGNlcHQgZm9yIFR5cGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6CisvLyBIZWFkIGZvciB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwgZm9yIHRoZSByZXN0IG9mIHRoZQorLy8gbGlzdC4KKworLy8gVGhlIGVtcHR5IHR5cGUgbGlzdC4KK3N0cnVjdCBUeXBlczAge307CisKKy8vIFR5cGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorc3RydWN0IFR5cGVzMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczAgVGFpbDsKK307CisKKyRyYW5nZSBpIDIuLm4KKworJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCiskcmFuZ2UgayAyLi5pCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgorc3RydWN0IFR5cGVzJGkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMkKGktMSk8JGZvciBrLCBbW1Qka11dPiBUYWlsOworfTsKKworCitdXQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUeXBlc048Li4uPiBkaXJlY3RseSwKKy8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUeXBlczwuLi4+IGlzIG11Y2gKKy8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKKy8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQorLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFR5cGVzPGludD4KKy8vIHdpbGwgYXBwZWFyIGFzIFR5cGVzPGludCwgTm9uZSwgTm9uZSwgLi4uLCBOb25lPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVHlwZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKKy8vIHRoYXQgdG8gVHlwZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKKy8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCisvLyBUeXBlcyB0ZW1wbGF0ZS4KKworJHJhbmdlIGkgMS4ubgordGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGkgPSBpbnRlcm5hbDo6Tm9uZV1dPgorc3RydWN0IFR5cGVzIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMkbjwkZm9yIGksIFtbVCRpXV0+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFR5cGVzPCRmb3IgaSwgW1tpbnRlcm5hbDo6Tm9uZV1dPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOworfTsKKworJHJhbmdlIGkgMS4ubi0xCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKyRyYW5nZSBrIGkrMS4ubgordGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KK3N0cnVjdCBUeXBlczwkZm9yIGosIFtbVCRqXV0kZm9yIGtbWywgaW50ZXJuYWw6Ok5vbmVdXT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlcyRpPCRmb3IgaiwgW1tUJGpdXT4gdHlwZTsKK307CisKK11dCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyMgZGVmaW5lIEdURVNUX1RFTVBMQVRFXyB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MKKworLy8gVGhlIHRlbXBsYXRlICJzZWxlY3RvciIgc3RydWN0IFRlbXBsYXRlU2VsPFRtcGw+IGlzIHVzZWQgdG8KKy8vIHJlcHJlc2VudCBUbXBsLCB3aGljaCBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUgd2l0aCBvbmUgdHlwZQorLy8gcGFyYW1ldGVyLCBhcyBhIHR5cGUuICBUZW1wbGF0ZVNlbDxUbXBsPjo6QmluZDxUPjo6dHlwZSBpcyBkZWZpbmVkCisvLyBhcyB0aGUgdHlwZSBUbXBsPFQ+LiAgVGhpcyBhbGxvd3MgdXMgdG8gYWN0dWFsbHkgaW5zdGFudGlhdGUgdGhlCisvLyB0ZW1wbGF0ZSAic2VsZWN0ZWQiIGJ5IFRlbXBsYXRlU2VsPFRtcGw+LgorLy8KKy8vIFRoaXMgdHJpY2sgaXMgbmVjZXNzYXJ5IGZvciBzaW11bGF0aW5nIHR5cGVkZWYgZm9yIGNsYXNzIHRlbXBsYXRlcywKKy8vIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFRtcGw+CitzdHJ1Y3QgVGVtcGxhdGVTZWwgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RydWN0IEJpbmQgeworICAgIHR5cGVkZWYgVG1wbDxUPiB0eXBlOworICB9OworfTsKKworIyBkZWZpbmUgR1RFU1RfQklORF8oVG1wbFNlbCwgVCkgXAorICBUbXBsU2VsOjp0ZW1wbGF0ZSBCaW5kPFQ+Ojp0eXBlCisKKy8vIEEgdW5pcXVlIHN0cnVjdCB0ZW1wbGF0ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKKy8vIGFyZ3VtZW50cyBvZiBjbGFzcyB0ZW1wbGF0ZSBUZW1wbGF0ZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZQorLy8gdmFyaWFkaWMgdGVtcGxhdGVzIChlLmcuIFRlbXBsYXRlczxpbnQ+LCBUZW1wbGF0ZXM8aW50LCBkb3VibGU+LAorLy8gYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBOb25lVCB7fTsKKworLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCisvLyByZXByZXNlbnQgdGVtcGxhdGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUZW1wbGF0ZXNOPFQxLCBUMiwgLi4uLAorLy8gVE4+IHJlcHJlc2VudHMgYSBsaXN0IG9mIE4gdGVtcGxhdGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKS4gIEV4Y2VwdAorLy8gZm9yIFRlbXBsYXRlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgorLy8gSGVhZCBmb3IgdGhlIHNlbGVjdG9yIG9mIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwKKy8vIGZvciB0aGUgcmVzdCBvZiB0aGUgbGlzdC4KKworLy8gVGhlIGVtcHR5IHRlbXBsYXRlIGxpc3QuCitzdHJ1Y3QgVGVtcGxhdGVzMCB7fTsKKworLy8gVGVtcGxhdGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMT4KK3N0cnVjdCBUZW1wbGF0ZXMxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMwIFRhaWw7Cit9OworCiskcmFuZ2UgaSAyLi5uCisKKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHJhbmdlIGsgMi4uaQordGVtcGxhdGUgPCRmb3IgaiwgW1tHVEVTVF9URU1QTEFURV8gVCRqXV0+CitzdHJ1Y3QgVGVtcGxhdGVzJGkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlcyQoaS0xKTwkZm9yIGssIFtbVCRrXV0+IFRhaWw7Cit9OworCisKK11dCisKKy8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVGVtcGxhdGVzTjwuLi4+IGRpcmVjdGx5LAorLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFRlbXBsYXRlczwuLi4+IGlzIG11Y2gKKy8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKKy8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQorLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFRlbXBsYXRlczxsaXN0PgorLy8gd2lsbCBhcHBlYXIgYXMgVGVtcGxhdGVzPGxpc3QsIE5vbmVULCBOb25lVCwgLi4uLCBOb25lVD4gaW4gdGhlIGNvbXBpbGVyCisvLyBlcnJvcnMpLgorLy8KKy8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCisvLyB1c2VyIHdvdWxkIHdyaXRlIFRlbXBsYXRlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQorLy8gdGhhdCB0byBUZW1wbGF0ZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKKy8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCisvLyBUZW1wbGF0ZXMgdGVtcGxhdGUuCisKKyRyYW5nZSBpIDEuLm4KK3RlbXBsYXRlIDwkZm9yIGksIFtbR1RFU1RfVEVNUExBVEVfIFQkaSA9IE5vbmVUXV0+CitzdHJ1Y3QgVGVtcGxhdGVzIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMkbjwkZm9yIGksIFtbVCRpXV0+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFRlbXBsYXRlczwkZm9yIGksIFtbTm9uZVRdXT4geworICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKK307CisKKyRyYW5nZSBpIDEuLm4tMQorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCiskcmFuZ2UgayBpKzEuLm4KK3RlbXBsYXRlIDwkZm9yIGosIFtbR1RFU1RfVEVNUExBVEVfIFQkal1dPgorc3RydWN0IFRlbXBsYXRlczwkZm9yIGosIFtbVCRqXV0kZm9yIGtbWywgTm9uZVRdXT4geworICB0eXBlZGVmIFRlbXBsYXRlcyRpPCRmb3IgaiwgW1tUJGpdXT4gdHlwZTsKK307CisKK11dCisKKy8vIFRoZSBUeXBlTGlzdCB0ZW1wbGF0ZSBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgZWl0aGVyIGEgc2luZ2xlIHR5cGUKKy8vIG9yIGEgVHlwZXM8Li4uPiBsaXN0IGluIFRZUEVEX1RFU1RfQ0FTRSgpIGFuZAorLy8gSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoKS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVHlwZUxpc3QgeworICB0eXBlZGVmIFR5cGVzMTxUPiB0eXBlOworfTsKKworCiskcmFuZ2UgaSAxLi5uCit0ZW1wbGF0ZSA8JGZvciBpLCBbW3R5cGVuYW1lIFQkaV1dPgorc3RydWN0IFR5cGVMaXN0PFR5cGVzPCRmb3IgaSwgW1tUJGldXT4gPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8JGZvciBpLCBbW1QkaV1dPjo6dHlwZSB0eXBlOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tNC9hY3hfcHRocmVhZC5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbTQvYWN4X3B0aHJlYWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMjBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbTQvYWN4X3B0aHJlYWQubTQKQEAgLTAsMCArMSwzNjMgQEAKKyMgVGhpcyB3YXMgcmV0cmlldmVkIGZyb20KKyMgICAgaHR0cDovL3N2bi4wcG9pbnRlci5kZS92aWV3dmMvdHJ1bmsvY29tbW9uL2FjeF9wdGhyZWFkLm00P3JldmlzaW9uPTEyNzcmcm9vdD1hdmFoaQorIyBTZWUgYWxzbyAocGVyaGFwcyBmb3IgbmV3IHZlcnNpb25zPykKKyMgICAgaHR0cDovL3N2bi4wcG9pbnRlci5kZS92aWV3dmMvdHJ1bmsvY29tbW9uL2FjeF9wdGhyZWFkLm00P3Jvb3Q9YXZhaGkKKyMKKyMgV2UndmUgcmV3cml0dGVuIHRoZSBpbmNvbnNpc3RlbmN5IGNoZWNrIGNvZGUgKGZyb20gYXZhaGkpLCB0byB3b3JrCisjIG1vcmUgYnJvYWRseS4gIEluIHBhcnRpY3VsYXIsIGl0IG5vIGxvbmdlciBhc3N1bWVzIGxkIGFjY2VwdHMgLXpkZWZzLgorIyBUaGlzIGNhdXNlZCBhIHJlc3RydWN0aW5nIG9mIHRoZSBjb2RlLCBidXQgdGhlIGZ1bmN0aW9uYWxpdHkgaGFzIG9ubHkKKyMgY2hhbmdlZCBhIGxpdHRsZS4KKworZG5sIEBzeW5vcHNpcyBBQ1hfUFRIUkVBRChbQUNUSU9OLUlGLUZPVU5EWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dKQorZG5sCitkbmwgQHN1bW1hcnkgZmlndXJlIG91dCBob3cgdG8gYnVpbGQgQyBwcm9ncmFtcyB1c2luZyBQT1NJWCB0aHJlYWRzCitkbmwKK2RubCBUaGlzIG1hY3JvIGZpZ3VyZXMgb3V0IGhvdyB0byBidWlsZCBDIHByb2dyYW1zIHVzaW5nIFBPU0lYIHRocmVhZHMuCitkbmwgSXQgc2V0cyB0aGUgUFRIUkVBRF9MSUJTIG91dHB1dCB2YXJpYWJsZSB0byB0aGUgdGhyZWFkcyBsaWJyYXJ5IGFuZAorZG5sIGxpbmtlciBmbGFncywgYW5kIHRoZSBQVEhSRUFEX0NGTEFHUyBvdXRwdXQgdmFyaWFibGUgdG8gYW55IHNwZWNpYWwKK2RubCBDIGNvbXBpbGVyIGZsYWdzIHRoYXQgYXJlIG5lZWRlZC4gKFRoZSB1c2VyIGNhbiBhbHNvIGZvcmNlIGNlcnRhaW4KK2RubCBjb21waWxlciBmbGFncy9saWJzIHRvIGJlIHRlc3RlZCBieSBzZXR0aW5nIHRoZXNlIGVudmlyb25tZW50CitkbmwgdmFyaWFibGVzLikKK2RubAorZG5sIEFsc28gc2V0cyBQVEhSRUFEX0NDIHRvIGFueSBzcGVjaWFsIEMgY29tcGlsZXIgdGhhdCBpcyBuZWVkZWQgZm9yCitkbmwgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMgKGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBDQyBvdGhlcndpc2UpLgorZG5sIChUaGlzIGlzIG5lY2Vzc2FyeSBvbiBBSVggdG8gdXNlIHRoZSBzcGVjaWFsIGNjX3IgY29tcGlsZXIgYWxpYXMuKQorZG5sCitkbmwgTk9URTogWW91IGFyZSBhc3N1bWVkIHRvIG5vdCBvbmx5IGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggdGhlc2UKK2RubCBmbGFncywgYnV0IGFsc28gbGluayBpdCB3aXRoIHRoZW0gYXMgd2VsbC4gZS5nLiB5b3Ugc2hvdWxkIGxpbmsKK2RubCB3aXRoICRQVEhSRUFEX0NDICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTICRMREZMQUdTIC4uLiAkUFRIUkVBRF9MSUJTCitkbmwgJExJQlMKK2RubAorZG5sIElmIHlvdSBhcmUgb25seSBidWlsZGluZyB0aHJlYWRzIHByb2dyYW1zLCB5b3UgbWF5IHdpc2ggdG8gdXNlCitkbmwgdGhlc2UgdmFyaWFibGVzIGluIHlvdXIgZGVmYXVsdCBMSUJTLCBDRkxBR1MsIGFuZCBDQzoKK2RubAorZG5sICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorZG5sICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorZG5sICAgICAgICBDQz0iJFBUSFJFQURfQ0MiCitkbmwKK2RubCBJbiBhZGRpdGlvbiwgaWYgdGhlIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRocmVhZC1hdHRyaWJ1dGUKK2RubCBjb25zdGFudCBoYXMgYSBub25zdGFuZGFyZCBuYW1lLCBkZWZpbmVzIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRvCitkbmwgdGhhdCBuYW1lIChlLmcuIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQgb24gQUlYKS4KK2RubAorZG5sIEFDVElPTi1JRi1GT1VORCBpcyBhIGxpc3Qgb2Ygc2hlbGwgY29tbWFuZHMgdG8gcnVuIGlmIGEgdGhyZWFkcworZG5sIGxpYnJhcnkgaXMgZm91bmQsIGFuZCBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGEgbGlzdCBvZiBjb21tYW5kcyB0bworZG5sIHJ1biBpdCBpZiBpdCBpcyBub3QgZm91bmQuIElmIEFDVElPTi1JRi1GT1VORCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKK2RubCBkZWZhdWx0IGFjdGlvbiB3aWxsIGRlZmluZSBIQVZFX1BUSFJFQUQuCitkbmwKK2RubCBQbGVhc2UgbGV0IHRoZSBhdXRob3JzIGtub3cgaWYgdGhpcyBtYWNybyBmYWlscyBvbiBhbnkgcGxhdGZvcm0sIG9yCitkbmwgaWYgeW91IGhhdmUgYW55IG90aGVyIHN1Z2dlc3Rpb25zIG9yIGNvbW1lbnRzLiBUaGlzIG1hY3JvIHdhcyBiYXNlZAorZG5sIG9uIHdvcmsgYnkgU0dKIG9uIGF1dG9jb25mIHNjcmlwdHMgZm9yIEZGVFcgKHd3dy5mZnR3Lm9yZykgKHdpdGgKK2RubCBoZWxwIGZyb20gTS4gRnJpZ28pLCBhcyB3ZWxsIGFzIGFjX3B0aHJlYWQgYW5kIGhiX3B0aHJlYWQgbWFjcm9zCitkbmwgcG9zdGVkIGJ5IEFsZWphbmRybyBGb3Jlcm8gQ3VlcnZvIHRvIHRoZSBhdXRvY29uZiBtYWNybyByZXBvc2l0b3J5LgorZG5sIFdlIGFyZSBhbHNvIGdyYXRlZnVsIGZvciB0aGUgaGVscGZ1bCBmZWVkYmFjayBvZiBudW1lcm91cyB1c2Vycy4KK2RubAorZG5sIEBjYXRlZ29yeSBJbnN0YWxsZWRQYWNrYWdlcworZG5sIEBhdXRob3IgU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorZG5sIEB2ZXJzaW9uIDIwMDYtMDUtMjkKK2RubCBAbGljZW5zZSBHUExXaXRoQUNFeGNlcHRpb24KK2RubCAKK2RubCBDaGVja3MgZm9yIEdDQyBzaGFyZWQvcHRocmVhZCBpbmNvbnNpc3RlbmN5IGJhc2VkIG9uIHdvcmsgYnkKK2RubCBNYXJjaW4gT3dzaWFueSA8bWFyY2luQG93c2lhbnkucGw+CisKKworQUNfREVGVU4oW0FDWF9QVEhSRUFEXSwgWworQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKK2FjeF9wdGhyZWFkX29rPW5vCisKKyMgV2UgdXNlZCB0byBjaGVjayBmb3IgcHRocmVhZC5oIGZpcnN0LCBidXQgdGhpcyBmYWlscyBpZiBwdGhyZWFkLmgKKyMgcmVxdWlyZXMgc3BlY2lhbCBjb21waWxlciBmbGFncyAoZS5nLiBvbiBUcnVlNjQgb3IgU2VxdWVudCkuCisjIEl0IGdldHMgY2hlY2tlZCBmb3IgaW4gdGhlIGxpbmsgdGVzdCBhbnl3YXkuCisKKyMgRmlyc3Qgb2YgYWxsLCBjaGVjayBpZiB0aGUgdXNlciBoYXMgc2V0IGFueSBvZiB0aGUgUFRIUkVBRF9MSUJTLAorIyBldGNldGVyYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGFuZCBpZiB0aHJlYWRzIGxpbmtpbmcgd29ya3MgdXNpbmcKKyMgdGhlbToKK2lmIHRlc3QgeCIkUFRIUkVBRF9MSUJTJFBUSFJFQURfQ0ZMQUdTIiAhPSB4OyB0aGVuCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwdGhyZWFkX2pvaW4gaW4gTElCUz0kUFRIUkVBRF9MSUJTIHdpdGggQ0ZMQUdTPSRQVEhSRUFEX0NGTEFHU10pCisgICAgICAgIEFDX1RSWV9MSU5LX0ZVTkMocHRocmVhZF9qb2luLCBhY3hfcHRocmVhZF9vaz15ZXMpCisgICAgICAgIEFDX01TR19SRVNVTFQoJGFjeF9wdGhyZWFkX29rKQorICAgICAgICBpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCisgICAgICAgIGZpCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorZmkKKworIyBXZSBtdXN0IGNoZWNrIGZvciB0aGUgdGhyZWFkcyBsaWJyYXJ5IHVuZGVyIGEgbnVtYmVyIG9mIGRpZmZlcmVudAorIyBuYW1lczsgdGhlIG9yZGVyaW5nIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBzeXN0ZW1zCisjIChlLmcuIERFQykgaGF2ZSBib3RoIC1scHRocmVhZCBhbmQgLWxwdGhyZWFkcywgd2hlcmUgb25lIG9mIHRoZQorIyBsaWJyYXJpZXMgaXMgYnJva2VuIChub24tUE9TSVgpLgorCisjIENyZWF0ZSBhIGxpc3Qgb2YgdGhyZWFkIGZsYWdzIHRvIHRyeS4gIEl0ZW1zIHN0YXJ0aW5nIHdpdGggYSAiLSIgYXJlCisjIEMgY29tcGlsZXIgZmxhZ3MsIGFuZCBvdGhlciBpdGVtcyBhcmUgbGlicmFyeSBuYW1lcywgZXhjZXB0IGZvciAibm9uZSIKKyMgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2UgdHJ5IHdpdGhvdXQgYW55IGZsYWdzIGF0IGFsbCwgYW5kICJwdGhyZWFkLWNvbmZpZyIKKyMgd2hpY2ggaXMgYSBwcm9ncmFtIHJldHVybmluZyB0aGUgZmxhZ3MgZm9yIHRoZSBQdGggZW11bGF0aW9uIGxpYnJhcnkuCisKK2FjeF9wdGhyZWFkX2ZsYWdzPSJwdGhyZWFkcyBub25lIC1LdGhyZWFkIC1rdGhyZWFkIGx0aHJlYWQgLXB0aHJlYWQgLXB0aHJlYWRzIC1tdGhyZWFkcyBwdGhyZWFkIC0tdGhyZWFkLXNhZmUgLW10IHB0aHJlYWQtY29uZmlnIgorCisjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorCisjIHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorIyBub25lOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyMgbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisjIC1wdGhyZWFkOiBMaW51eC9nY2MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL2djYyAodXNlcmxhbmQgdGhyZWFkcykKKyMgLXB0aHJlYWRzOiBTb2xhcmlzL2djYworIyAtbXRocmVhZHM6IE1pbmd3MzIvZ2NjLCBMeW54L2djYworIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworIyAgICAgIGFsc28gZGVmaW5lcyAtRF9SRUVOVFJBTlQpCisjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyMgcHRocmVhZDogTGludXgsIGV0Y2V0ZXJhCisjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyMgcHRocmVhZC1jb25maWc6IHVzZSBwdGhyZWFkLWNvbmZpZyBwcm9ncmFtIChmb3IgR05VIFB0aCBsaWJyYXJ5KQorCitjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAqc29sYXJpcyopCisKKyAgICAgICAgIyBPbiBTb2xhcmlzIChhdCBsZWFzdCwgZm9yIHNvbWUgdmVyc2lvbnMpLCBsaWJjIGNvbnRhaW5zIHN0dWJiZWQKKyAgICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgICAjIC1scHRocmVhZC4pICAoVGhlIHN0dWJzIGFyZSBtaXNzaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLCBvciByYXRoZXIKKyAgICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAgICMgd2UnbGwganVzdCBsb29rIGZvciAtcHRocmVhZHMgYW5kIC1scHRocmVhZCBmaXJzdDoKKworICAgICAgICBhY3hfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIHB0aHJlYWQgLW10IC1wdGhyZWFkICRhY3hfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKK2VzYWMKKworaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KK2ZvciBmbGFnIGluICRhY3hfcHRocmVhZF9mbGFnczsgZG8KKworICAgICAgICBjYXNlICRmbGFnIGluCisgICAgICAgICAgICAgICAgbm9uZSkKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFnc10pCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIC0qKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworCisJCXB0aHJlYWQtY29uZmlnKQorCQlBQ19DSEVDS19QUk9HKGFjeF9wdGhyZWFkX2NvbmZpZywgcHRocmVhZC1jb25maWcsIHllcywgbm8pCisJCWlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfY29uZmlnIiA9IHhubzsgdGhlbiBjb250aW51ZTsgZmkKKwkJUFRIUkVBRF9DRkxBR1M9ImBwdGhyZWFkLWNvbmZpZyAtLWNmbGFnc2AiCisJCVBUSFJFQURfTElCUz0iYHB0aHJlYWQtY29uZmlnIC0tbGRmbGFnc2AgYHB0aHJlYWQtY29uZmlnIC0tbGlic2AiCisJCTs7CisKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iLWwkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBDaGVjayBmb3IgdmFyaW91cyBmdW5jdGlvbnMuICBXZSBtdXN0IGluY2x1ZGUgcHRocmVhZC5oLAorICAgICAgICAjIHNpbmNlIHNvbWUgZnVuY3Rpb25zIG1heSBiZSBtYWNyb3MuICAoT24gdGhlIFNlcXVlbnQsIHdlCisgICAgICAgICMgbmVlZCBhIHNwZWNpYWwgZmxhZyAtS3RocmVhZCB0byBtYWtlIHRoaXMgaGVhZGVyIGNvbXBpbGUuKQorICAgICAgICAjIFdlIGNoZWNrIGZvciBwdGhyZWFkX2pvaW4gYmVjYXVzZSBpdCBpcyBpbiAtbHB0aHJlYWQgb24gSVJJWAorICAgICAgICAjIHdoaWxlIHB0aHJlYWRfY3JlYXRlIGlzIGluIGxpYmMuICBXZSBjaGVjayBmb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgICAgICAgIyBkdWUgdG8gREVDIGNyYXppbmVzcyB3aXRoIC1scHRocmVhZHMuICBXZSBjaGVjayBmb3IKKyAgICAgICAgIyBwdGhyZWFkX2NsZWFudXBfcHVzaCBiZWNhdXNlIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHB0aHJlYWQKKyAgICAgICAgIyBmdW5jdGlvbnMgb24gU29sYXJpcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vbi1mdW5jdGlvbmFsIGxpYmMgc3R1Yi4KKyAgICAgICAgIyBXZSB0cnkgcHRocmVhZF9jcmVhdGUgb24gZ2VuZXJhbCBwcmluY2lwbGVzLgorICAgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgICAgICAgICAgICAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisgICAgICAgICAgICAgICAgICAgIFthY3hfcHRocmVhZF9vaz15ZXNdKQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIEFDX01TR19SRVNVTFQoJGFjeF9wdGhyZWFkX29rKQorICAgICAgICBpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBEZXRlY3QgQUlYIGxvc3NhZ2U6IEpPSU5BQkxFIGF0dHJpYnV0ZSBpcyBjYWxsZWQgVU5ERVRBQ0hFRC4KKwlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZV0pCisJYXR0cl9uYW1lPXVua25vd24KKwlmb3IgYXR0ciBpbiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEOyBkbworCSAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLCBbaW50IGF0dHI9JGF0dHI7IHJldHVybiBhdHRyO10sCisgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cl9uYW1lPSRhdHRyOyBicmVha10pCisJZG9uZQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRhdHRyX25hbWUpCisgICAgICAgIGlmIHRlc3QgIiRhdHRyX25hbWUiICE9IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUsICRhdHRyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lIG9uIHlvdXIgc3lzdGVtLl0pCisgICAgICAgIGZpCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkc10pCisgICAgICAgIGZsYWc9bm8KKyAgICAgICAgY2FzZSAiJHtob3N0X2NwdX0tJHtob3N0X29zfSIgaW4KKyAgICAgICAgICAgICotYWl4KiB8ICotZnJlZWJzZCogfCAqLWRhcndpbiopIGZsYWc9Ii1EX1RIUkVBRF9TQUZFIjs7CisgICAgICAgICAgICAqc29sYXJpcyogfCAqLW9zZiogfCAqLWhwdXgqKSBmbGFnPSItRF9SRUVOVFJBTlQiOzsKKyAgICAgICAgZXNhYworICAgICAgICBBQ19NU0dfUkVTVUxUKCR7ZmxhZ30pCisgICAgICAgIGlmIHRlc3QgIngkZmxhZyIgIT0geG5vOyB0aGVuCisgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWcgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBmaQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICAgICAgICAjIE1vcmUgQUlYIGxvc3NhZ2U6IG11c3QgY29tcGlsZSB3aXRoIHhsY19yIG9yIGNjX3IKKwlpZiB0ZXN0IHgiJEdDQyIgIT0geHllczsgdGhlbgorICAgICAgICAgIEFDX0NIRUNLX1BST0dTKFBUSFJFQURfQ0MsIHhsY19yIGNjX3IsICR7Q0N9KQorICAgICAgICBlbHNlCisgICAgICAgICAgUFRIUkVBRF9DQz0kQ0MKKwlmaQorCisJIyBUaGUgbmV4dCBwYXJ0IHRyaWVzIHRvIGRldGVjdCBHQ0MgaW5jb25zaXN0ZW5jeSB3aXRoIC1zaGFyZWQgb24gc29tZQorCSMgYXJjaGl0ZWN0dXJlcyBhbmQgc3lzdGVtcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBpbiBjZXJ0YWluCisJIyBjb25maWd1cmF0aW9ucywgd2hlbiAtc2hhcmVkIGlzIHNwZWNpZmllZCwgR0NDICJmb3JnZXRzIiB0bworCSMgaW50ZXJuYWxseSB1c2UgdmFyaW91cyBmbGFncyB3aGljaCBhcmUgc3RpbGwgbmVjZXNzYXJ5LgorCQorCSMKKwkjIFByZXBhcmUgdGhlIGZsYWdzCisJIworCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCXNhdmVfTElCUz0iJExJQlMiCisJc2F2ZV9DQz0iJENDIgorCQorCSMgVHJ5IHdpdGggdGhlIGZsYWdzIGRldGVybWluZWQgYnkgdGhlIGVhcmxpZXIgY2hlY2tzLgorCSMKKwkjIC1XbCwteixkZWZzIGZvcmNlcyBsaW5rLXRpbWUgc3ltYm9sIHJlc29sdXRpb24sIHNvIHRoYXQgdGhlCisJIyBsaW5raW5nIGNoZWNrcyB3aXRoIC1zaGFyZWQgYWN0dWFsbHkgaGF2ZSBhbnkgdmFsdWUKKwkjCisJIyBGSVhNRTogLWZQSUMgaXMgcmVxdWlyZWQgZm9yIC1zaGFyZWQgb24gbWFueSBhcmNoaXRlY3R1cmVzLAorCSMgc28gd2Ugc3BlY2lmeSBpdCBoZXJlLCBidXQgdGhlIHJpZ2h0IHdheSB3b3VsZCBwcm9iYWJseSBiZSB0bworCSMgcHJvcGVybHkgZGV0ZWN0IHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgcmVxdWlyZWQuCisJQ0ZMQUdTPSItc2hhcmVkIC1mUElDIC1XbCwteixkZWZzICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCUxJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisJQ0M9IiRQVEhSRUFEX0NDIgorCQorCSMgSW4gb3JkZXIgbm90IHRvIGNyZWF0ZSBzZXZlcmFsIGxldmVscyBvZiBpbmRlbnRhdGlvbiwgd2UgdGVzdAorCSMgdGhlIHZhbHVlIG9mICIkZG9uZSIgdW50aWwgd2UgZmluZCB0aGUgY3VyZSBvciBydW4gb3V0IG9mIGlkZWFzLgorCWRvbmU9Im5vIgorCQorCSMgRmlyc3QsIG1ha2Ugc3VyZSB0aGUgQ0ZMQUdTIHdlIGFkZGVkIGFyZSBhY3R1YWxseSBhY2NlcHRlZCBieSBvdXIKKwkjIGNvbXBpbGVyLiAgSWYgbm90IChhbmQgT1MgWCdzIGxkLCBmb3IgaW5zdGFuY2UsIGRvZXMgbm90IGFjY2VwdCAteiksCisJIyB0aGVuIHdlIGNhbid0IGRvIHRoaXMgdGVzdC4KKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGNoZWNrIGZvciBHQ0MgcHRocmVhZC9zaGFyZWQgaW5jb25zaXN0ZW5jaWVzXSkKKwkgICBBQ19UUllfTElOSygsLCAsIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXMgOyB0aGVuCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgIGZpCisJZmkKKwkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1wdGhyZWFkIGlzIHN1ZmZpY2llbnQgd2l0aCAtc2hhcmVkXSkKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorCSAgICAgIFtkb25lPXllc10pCisJICAgCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgZmkKKwlmaQorCQorCSMKKwkjIExpbnV4IGdjYyBvbiBzb21lIGFyY2hpdGVjdHVyZXMgc3VjaCBhcyBtaXBzL21pcHNlbCBmb3JnZXRzCisJIyBhYm91dCAtbHB0aHJlYWQKKwkjCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbHB0aHJlYWQgZml4ZXMgdGhhdF0pCisJICAgTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorCSAgICAgIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgICAgIFBUSFJFQURfTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMiCisJICAgZWxzZQorCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKwkgICBmaQorCWZpCisJIworCSMgRnJlZUJTRCA0LjEwIGdjYyBmb3JnZXRzIHRvIHVzZSAtbGNfciBpbnN0ZWFkIG9mIC1sYworCSMKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1sY19yIGZpeGVzIHRoYXRdKQorCSAgIExJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisJICAgICAgIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgICAgIFBUSFJFQURfTElCUz0iLWxjX3IgJFBUSFJFQURfTElCUyIKKwkgICBlbHNlCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGZpCisJZmkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgIyBPSywgd2UgaGF2ZSBydW4gb3V0IG9mIGlkZWFzCisJICAgQUNfTVNHX1dBUk4oW0ltcG9zc2libGUgdG8gZGV0ZXJtaW5lIGhvdyB0byB1c2UgcHRocmVhZHMgd2l0aCBzaGFyZWQgbGlicmFyaWVzXSkKKwkKKwkgICAjIHNvIGl0J3Mgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UgbWF5IHVzZSBwdGhyZWFkcworCSAgIGFjeF9wdGhyZWFkX29rPW5vCisJZmkKKwkKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwlMSUJTPSIkc2F2ZV9MSUJTIgorCUNDPSIkc2F2ZV9DQyIKK2Vsc2UKKyAgICAgICAgUFRIUkVBRF9DQz0iJENDIgorZmkKKworQUNfU1VCU1QoUFRIUkVBRF9MSUJTKQorQUNfU1VCU1QoUFRIUkVBRF9DRkxBR1MpCitBQ19TVUJTVChQVEhSRUFEX0NDKQorCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskMV0sLEFDX0RFRklORShIQVZFX1BUSFJFQUQsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuXSksWyQxXSkKKyAgICAgICAgOgorZWxzZQorICAgICAgICBhY3hfcHRocmVhZF9vaz1ubworICAgICAgICAkMgorZmkKK0FDX0xBTkdfUkVTVE9SRQorXSlkbmwgQUNYX1BUSFJFQUQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbTQvZ3Rlc3QubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2d0ZXN0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OThiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2d0ZXN0Lm00CkBAIC0wLDAgKzEsNzQgQEAKK2RubCBHVEVTVF9MSUJfQ0hFQ0soW21pbmltdW0gdmVyc2lvbiBbLAorZG5sICAgICAgICAgICAgICAgICAgYWN0aW9uIGlmIGZvdW5kIFssYWN0aW9uIGlmIG5vdCBmb3VuZF1dXSkKK2RubAorZG5sIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIEdvb2dsZSBUZXN0IGxpYnJhcnksIG9wdGlvbmFsbHkgYXQgYSBtaW5pbXVtCitkbmwgdmVyc2lvbiwgYW5kIGluZGljYXRlIGEgdmlhYmxlIHZlcnNpb24gd2l0aCB0aGUgSEFWRV9HVEVTVCBmbGFnLiBJdCBkZWZpbmVzCitkbmwgc3RhbmRhcmQgdmFyaWFibGVzIGZvciBzdWJzdGl0dXRpb24gaW5jbHVkaW5nIEdURVNUX0NQUEZMQUdTLAorZG5sIEdURVNUX0NYWEZMQUdTLCBHVEVTVF9MREZMQUdTLCBhbmQgR1RFU1RfTElCUy4gSXQgYWxzbyBkZWZpbmVzCitkbmwgR1RFU1RfVkVSU0lPTiBhcyB0aGUgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCBmb3VuZC4gRmluYWxseSwgaXQgcHJvdmlkZXMKK2RubCBvcHRpb25hbCBjdXN0b20gYWN0aW9uIHNsb3RzIGluIHRoZSBldmVudCBHVEVTVCBpcyBmb3VuZCBvciBub3QuCitBQ19ERUZVTihbR1RFU1RfTElCX0NIRUNLXSwKK1sKK2RubCBQcm92aWRlIGEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBHb29nbGUgVGVzdCB1c2FnZS4KK0FDX0FSR19FTkFCTEUoW2d0ZXN0XSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ndGVzdF0sCisgICAgICAgICAgICAgICAgICBbRW5hYmxlIHRlc3RzIHVzaW5nIHRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgorICAgICAgICAgICAgICAgICAgKERlZmF1bHQgaXMgZW5hYmxlZC4pXSldLAorICBbXSwKKyAgW2VuYWJsZV9ndGVzdD1dKQorQUNfQVJHX1ZBUihbR1RFU1RfQ09ORklHXSwKKyAgICAgICAgICAgW1RoZSBleGFjdCBwYXRoIG9mIEdvb2dsZSBUZXN0J3MgJ2d0ZXN0LWNvbmZpZycgc2NyaXB0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9DUFBGTEFHU10sCisgICAgICAgICAgIFtDLWxpa2UgcHJlcHJvY2Vzc29yIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQorQUNfQVJHX1ZBUihbR1RFU1RfQ1hYRkxBR1NdLAorICAgICAgICAgICBbQysrIGNvbXBpbGUgZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9MREZMQUdTXSwKKyAgICAgICAgICAgW0xpbmtlciBwYXRoIGFuZCBvcHRpb24gZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9MSUJTXSwKKyAgICAgICAgICAgW0xpYnJhcnkgbGlua2luZyBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKK0FDX0FSR19WQVIoW0dURVNUX1ZFUlNJT05dLAorICAgICAgICAgICBbVGhlIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QgYXZhaWxhYmxlLl0pCitIQVZFX0dURVNUPSJubyIKK0FTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiAhPSAieG5vIl0sCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAnZ3Rlc3QtY29uZmlnJ10pCisgICBBU19JRihbdGVzdCAieCR7ZW5hYmxlX2d0ZXN0fSIgIT0gInh5ZXMiXSwKKyAgICAgW0FTX0lGKFt0ZXN0IC14ICIke2VuYWJsZV9ndGVzdH0vc2NyaXB0cy9ndGVzdC1jb25maWciXSwKKyAgICAgICAgW0dURVNUX0NPTkZJRz0iJHtlbmFibGVfZ3Rlc3R9L3NjcmlwdHMvZ3Rlc3QtY29uZmlnIl0sCisgICAgICAgIFtHVEVTVF9DT05GSUc9IiR7ZW5hYmxlX2d0ZXN0fS9iaW4vZ3Rlc3QtY29uZmlnIl0pCisgICAgICBBU19JRihbdGVzdCAteCAiJHtHVEVTVF9DT05GSUd9Il0sIFtdLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgQUNfTVNHX0VSUk9SKFtkbmwKK1VuYWJsZSB0byBsb2NhdGUgZWl0aGVyIGEgYnVpbHQgb3IgaW5zdGFsbGVkIEdvb2dsZSBUZXN0LgorVGhlIHNwZWNpZmljIGxvY2F0aW9uICcke2VuYWJsZV9ndGVzdH0nIHdhcyBwcm92aWRlZCBmb3IgYSBidWlsdCBvciBpbnN0YWxsZWQKK0dvb2dsZSBUZXN0LCBidXQgbm8gJ2d0ZXN0LWNvbmZpZycgc2NyaXB0IGNvdWxkIGJlIGZvdW5kIGF0IHRoaXMgbG9jYXRpb24uXSkKKyAgICAgICAgIF0pXSwKKyAgICAgW0FDX1BBVEhfUFJPRyhbR1RFU1RfQ09ORklHXSwgW2d0ZXN0LWNvbmZpZ10pXSkKKyAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwKKyAgICAgW0FDX01TR19SRVNVTFQoWyR7R1RFU1RfQ09ORklHfV0pCisgICAgICBtNF9pZnZhbChbJDFdLAorICAgICAgICBbX2d0ZXN0X21pbl92ZXJzaW9uPSItLW1pbi12ZXJzaW9uPSQxIgorICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR29vZ2xlIFRlc3QgYXQgbGVhc3QgdmVyc2lvbiA+PSAkMV0pXSwKKyAgICAgICAgW19ndGVzdF9taW5fdmVyc2lvbj0iLS1taW4tdmVyc2lvbj0wIgorICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR29vZ2xlIFRlc3RdKV0pCisgICAgICBBU19JRihbJHtHVEVTVF9DT05GSUd9ICR7X2d0ZXN0X21pbl92ZXJzaW9ufV0sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgSEFWRV9HVEVTVD0neWVzJ10sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSldLAorICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICBBU19JRihbdGVzdCAieCR7SEFWRV9HVEVTVH0iID0gInh5ZXMiXSwKKyAgICAgW0dURVNUX0NQUEZMQUdTPWAke0dURVNUX0NPTkZJR30gLS1jcHBmbGFnc2AKKyAgICAgIEdURVNUX0NYWEZMQUdTPWAke0dURVNUX0NPTkZJR30gLS1jeHhmbGFnc2AKKyAgICAgIEdURVNUX0xERkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWxkZmxhZ3NgCisgICAgICBHVEVTVF9MSUJTPWAke0dURVNUX0NPTkZJR30gLS1saWJzYAorICAgICAgR1RFU1RfVkVSU0lPTj1gJHtHVEVTVF9DT05GSUd9IC0tdmVyc2lvbmAKKyAgICAgIEFDX0RFRklORShbSEFWRV9HVEVTVF0sWzFdLFtEZWZpbmVkIHdoZW4gR29vZ2xlIFRlc3QgaXMgYXZhaWxhYmxlLl0pXSwKKyAgICAgW0FTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiA9ICJ4eWVzIl0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW2RubAorR29vZ2xlIFRlc3Qgd2FzIGVuYWJsZWQsIGJ1dCBubyB2aWFibGUgdmVyc2lvbiBjb3VsZCBiZSBmb3VuZC5dKQorICAgICAgICAgXSldKV0pCitBQ19TVUJTVChbSEFWRV9HVEVTVF0pCitBTV9DT05ESVRJT05BTChbSEFWRV9HVEVTVF0sW3Rlc3QgIngkSEFWRV9HVEVTVCIgPSAieHllcyJdKQorQVNfSUYoW3Rlc3QgIngkSEFWRV9HVEVTVCIgPSAieHllcyJdLAorICBbbTRfaWZ2YWwoWyQyXSwgWyQyXSldLAorICBbbTRfaWZ2YWwoWyQzXSwgWyQzXSldKQorXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbTQvbGlidG9vbC5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbTQvbGlidG9vbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjgxMDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tNC9saWJ0b29sLm00CkBAIC0wLDAgKzEsODAwMSBAQAorIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworbTRfZGVmaW5lKFtfTFRfQ09QWUlOR10sIFtkbmwKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wuCisjCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIGlmIHlvdSBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSBvciBsaWJyYXJ5IHRoYXQKKyMgaXMgYnVpbHQgdXNpbmcgR05VIExpYnRvb2wsIHlvdSBtYXkgaW5jbHVkZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisjIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBHTlUgTGlidG9vbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR05VIExpYnRvb2w7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBhIGNvcHkKKyMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwsIG9yCisjIG9idGFpbmVkIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCitdKQorCisjIHNlcmlhbCA1NyBMVF9JTklUCisKKworIyBMVF9QUkVSRVEoVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGFuZCBleGl0IGlmIHRoaXMgbGlidG9vbCB2ZXJzaW9uIGlzIGxlc3MgdGhhdCBWRVJTSU9OLgorbTRfZGVmdW4oW0xUX1BSRVJFUV0sCitbbTRfaWYobTRfdmVyc2lvbl9jb21wYXJlKG00X2RlZm4oW0xUX1BBQ0tBR0VfVkVSU0lPTl0pLCBbJDFdKSwgLTEsCisgICAgICAgW200X2RlZmF1bHQoWyQzXSwKKwkJICAgW200X2ZhdGFsKFtMaWJ0b29sIHZlcnNpb24gJDEgb3IgaGlnaGVyIGlzIHJlcXVpcmVkXSwKKwkJICAgICAgICAgICAgIDYzKV0pXSwKKyAgICAgICBbJDJdKV0pCisKKworIyBfTFRfQ0hFQ0tfQlVJTERESVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGlmIHRoZSBhYnNvbHV0ZSBidWlsZCBkaXJlY3RvcnkgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMKK200X2RlZnVuKFtfTFRfQ0hFQ0tfQlVJTERESVJdLAorW2Nhc2UgYHB3ZGAgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgQUNfTVNHX1dBUk4oW0xpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBgcHdkYF0pIDs7Citlc2FjCitdKQorCisKKyMgTFRfSU5JVChbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0lOSVRdLAorW0FDX1BSRVJFUShbMi41OF0pZG5sIFdlIHVzZSBBQ19JTkNMVURFU19ERUZBVUxUCitBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRfTEFOR10pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xUX09VVFBVVF0pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfQlVJTERESVJdKWRubAorCitkbmwgQXV0b2NvbmYgZG9lc24ndCBjYXRjaCB1bmV4cGFuZGVkIExUXyBtYWNyb3MgYnkgZGVmYXVsdDoKK200X3BhdHRlcm5fZm9yYmlkKFteXz9MVF9bQS1aX10rJF0pZG5sCittNF9wYXR0ZXJuX2FsbG93KFteKF9MVF9FT0Z8TFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PV3xMVF9NVUxUSV9NT0RVTEUpJF0pZG5sCitkbmwgYWNsb2NhbCBkb2Vzbid0IHB1bGwgbHRvcHRpb25zLm00LCBsdHN1Z2FyLm00LCBvciBsdHZlcnNpb24ubTQKK2RubCB1bmxlc3Mgd2UgcmVxdWlyZSBhbiBBQ19ERUZVTmVkIG1hY3JvOgorQUNfUkVRVUlSRShbTFRPUFRJT05TX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRTVUdBUl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUVkVSU0lPTl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUT0JTT0xFVEVfVkVSU0lPTl0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19MVE1BSU5dKWRubAorCitfTFRfU0hFTExfSU5JVChbU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH1dKQorCitkbmwgUGFyc2UgT1BUSU9OUworX0xUX1NFVF9PUFRJT05TKFskMF0sIFskMV0pCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGx0bWFpbiIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworX0xUX1NFVFVQCisKKyMgT25seSBleHBhbmQgb25jZToKK200X2RlZmluZShbTFRfSU5JVF0pCitdKSMgTFRfSU5JVAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBQ19QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitBVV9BTElBUyhbQU1fUFJPR19MSUJUT09MXSwgW0xUX0lOSVRdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgW10pCisKKworIyBfTFRfQ0NfQkFTRU5BTUUoQ0MpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsY3VsYXRlIGNjX2Jhc2VuYW1lLiAgU2tpcCBrbm93biBjb21waWxlciB3cmFwcGVycyBhbmQgY3Jvc3MtcHJlZml4LgorbTRfZGVmdW4oW19MVF9DQ19CQVNFTkFNRV0sCitbZm9yIGNjX3RlbXAgaW4gJDEiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1tcXC9dXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1tcXC9dXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltbXFwvXV1kaXN0Y2MgfCBwdXJpZnkgfCAqW1tcXC9dXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCitdKQorCisKKyMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEl0IGlzIG9rYXkgdG8gdXNlIHRoZXNlIGZpbGUgY29tbWFuZHMgYW5kIGFzc3VtZSB0aGV5IGhhdmUgYmVlbiBzZXQKKyMgc2Vuc2libHkgYWZ0ZXIgYG00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKScuCittNF9kZWZ1bihbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10sCitbOiAke0NQPSJjcCAtZiJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorXSkjIF9MVF9GSUxFVVRJTFNfREVGQVVMVFMKKworCisjIF9MVF9TRVRVUAorIyAtLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfU0VUVVBdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCisKK19MVF9ERUNMKFtdLCBbUEFUSF9TRVBBUkFUT1JdLCBbMV0sIFtUaGUgUEFUSCBzZXBhcmF0b3IgZm9yIHRoZSBidWlsZCBzeXN0ZW1dKWRubAorZG5sCitfTFRfREVDTChbXSwgW2hvc3RfYWxpYXNdLCBbMF0sIFtUaGUgaG9zdCBzeXN0ZW1dKWRubAorX0xUX0RFQ0woW10sIFtob3N0XSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtob3N0X29zXSwgWzBdKWRubAorZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX2FsaWFzXSwgWzBdLCBbVGhlIGJ1aWxkIHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkXSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtidWlsZF9vc10sIFswXSlkbmwKK2RubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgorX0xUX0RFQ0woW10sIFtMTl9TXSwgWzFdLCBbV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rc10pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0xUX0NNRF9NQVhfTEVOXSlkbmwKK19MVF9ERUNMKFtvYmpleHRdLCBbYWNfb2JqZXh0XSwgWzBdLCBbT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXhlZXh0XSwgWzBdLCBbRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpXSlkbmwKK2RubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9SRUxPQURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQl0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX09MRF9BUkNISVZFXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1dJVEhfU1lTUk9PVF0pZG5sCisKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorXSkKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworX0xUX0NIRUNLX09CSkRJUgorCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKKword2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Cit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgX0xUX1BBVEhfTUFHSUMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK0xUX1NVUFBPUlRFRF9UQUcoW0NDXSkKK19MVF9MQU5HX0NfQ09ORklHCitfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworX0xUX0NPTkZJR19DT01NQU5EUworXSkjIF9MVF9TRVRVUAorCisKKyMgX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGEgZmV3IHNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwIHVzIGRvIHJvYnVzdCBxdW90aW5nLgorbTRfZGVmdW4oW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSwKK1sjIEJhY2tzbGFzaGlmeSBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluCisjIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtbImAkXFxdXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbWyJgXFxdXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworXSkKKworIyBfTFRfUFJPR19MVE1BSU4KKyMgLS0tLS0tLS0tLS0tLS0tCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgY2FsbGVkIGJvdGggZnJvbSBgY29uZmlndXJlJywgYW5kIGBjb25maWcuc3RhdHVzJworIyBub3cgdGhhdCB3ZSB1c2UgQUNfQ09ORklHX0NPTU1BTkRTIHRvIGdlbmVyYXRlIGxpYnRvb2wuICBOb3RhYmx5LAorIyBgY29uZmlnLnN0YXR1cycgaGFzIG5vIHZhbHVlIGZvciBhY19hdXhfZGlyIHVubGVzcyB3ZSBhcmUgdXNpbmcgQXV0b21ha2UsCisjIHNvIHdlIHBhc3MgYSBjb3B5IGFsb25nIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBzZW5zaWJsZSB2YWx1ZSBhbnl3YXkuCittNF9kZWZ1bihbX0xUX1BST0dfTFRNQUlOXSwKK1ttNF9pZmRlZihbQUNfUkVRVUlSRV9BVVhfRklMRV0sIFtBQ19SRVFVSVJFX0FVWF9GSUxFKFtsdG1haW4uc2hdKV0pZG5sCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInXSkKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorXSkjIF9MVF9QUk9HX0xUTUFJTgorCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEFjY3VtdWxhdGUgY29kZSBmb3IgY3JlYXRpbmcgbGlidG9vbC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBTbyB0aGF0IHdlIGNhbiByZWNyZWF0ZSBhIGZ1bGwgbGlidG9vbCBzY3JpcHQgaW5jbHVkaW5nIGFkZGl0aW9uYWwKKyMgdGFncywgd2UgYWNjdW11bGF0ZSB0aGUgY2h1bmtzIG9mIGNvZGUgdG8gc2VuZCB0byBBQ19DT05GSUdfQ09NTUFORFMKKyMgaW4gbWFjcm9zIGFuZCB0aGVuIG1ha2UgYSBzaW5nbGUgY2FsbCBhdCB0aGUgZW5kIHVzaW5nIHRoZSBgbGlidG9vbCcKKyMgbGFiZWwuCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbSU5JVC1DT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgSU5JVC1DT01NQU5EUyB0byBiZSBwYXNzZWQgdG8gQUNfQ09ORklHX0NPTU1BTkRTIGxhdGVyLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX0xJQlRPT0xfSU5JVF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9JTklUXSkKKworCisjIF9MVF9DT05GSUdfTElCVE9PTChbQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MXSwKK1ttNF9pZnZhbChbJDFdLAorICAgICAgICAgIFttNF9hcHBlbmQoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10pCisKKworIyBfTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoW0NPTU1BTkRTXSwgW0lOSVRfQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT05GSUdfU0FWRV9DT01NQU5EU10sCitbX0xUX0NPTkZJR19MSUJUT09MKFskMV0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbJDJdKQorXSkKKworCisjIF9MVF9GT1JNQVRfQ09NTUVOVChbQ09NTUVOVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBsZWFkaW5nIGNvbW1lbnQgbWFya3MgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggbGluZSwgYW5kIGEgdHJhaWxpbmcKKyMgZnVsbC1zdG9wIHRvIHRoZSB3aG9sZSBjb21tZW50IGlmIG9uZSBpcyBub3QgcHJlc2VudCBhbHJlYWR5LgorbTRfZGVmaW5lKFtfTFRfRk9STUFUX0NPTU1FTlRdLAorW200X2lmdmFsKFskMV0sIFsKK200X2JwYXRzdWJzdChbbTRfYnBhdHN1YnN0KFskMV0sIFteICpdLCBbIyBdKV0sCisgICAgICAgICAgICAgIFtbJ2AkXF1dLCBbXFxcJl0pXW00X2JtYXRjaChbJDFdLCBbWyE/Ll0kXSwgW10sIFsuXSkKKyldKQorCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGSVhNRTogRWxpbWluYXRlIFZBUk5BTUUgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisKKyMgX0xUX0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSwgW0lTLVRBR0dFRD9dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENPTkZJR05BTUUgaXMgdGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIHZhbHVlIGluIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyMgVkFSTkFNRSBpcyB0aGUgKGJhc2UpIG5hbWUgdXNlZCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KKyMgVkFMVUUgbWF5IGJlIDAsIDEgb3IgMiBmb3IgYSBjb21wdXRlZCBxdW90ZSBlc2NhcGVkIHZhbHVlIGJhc2VkIG9uCisjIFZBUk5BTUUuICBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZSB1c2VkIGRpcmVjdGx5LgorbTRfZGVmaW5lKFtfTFRfREVDTF0sCitbbHRfaWZfYXBwZW5kX3VuaXEoW2x0X2RlY2xfdmFybmFtZXNdLCBbJDJdLCBbLCBdLAorICAgIFtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtsaWJ0b29sX25hbWVdLAorCVttNF9pZnZhbChbJDFdLCBbJDFdLCBbJDJdKV0pCisgICAgbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbdmFsdWVdLCBbJDNdKQorICAgIG00X2lmdmFsKFskNF0sCisJW2x0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW2Rlc2NyaXB0aW9uXSwgWyQ0XSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwKKwlbdGFnZ2VkP10sIFttNF9pZnZhbChbJDVdLCBbeWVzXSwgW25vXSldKV0pCitdKQorCisKKyMgX0xUX1RBR0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR0RFQ0xdLCBbX0xUX0RFQ0woWyQxXSwgWyQyXSwgWyQzXSwgWyQ0XSwgW3llc10pXSkKKworCisjIGx0X2RlY2xfdGFnX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF90YWdfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFt5ZXNdLCAkQCldKQorCisKKyMgX2x0X2RlY2xfZmlsdGVyKFNVQktFWSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfbHRfZGVjbF9maWx0ZXJdLAorW200X2Nhc2UoWyQjXSwKKyAgWzBdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCisgIFsxXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKKyAgWzJdLCBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sIFskMV0sIFskMl0sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFszXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbJDNdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgJEApXSlbXWRubAorXSkKKworCisjIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfcXVvdGVfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdmFsdWVdLCBbMV0sICRAKV0pCisKKworIyBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzJdLCAkQCldKQorCisKKyMgbHRfZGVjbF92YXJuYW1lc190YWdnZWQoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZF0sCitbbTRfYXNzZXJ0KFskIyA8PSAyXSlkbmwKK18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgIG00X2lmdmFsKFskMl0sIFtbJDJdXSwgW200X2RxdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyldKSwKKyAgICBtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfcXVvdGUoX0xUX1RBR1MpKSwgWyBdKSldKQorbTRfZGVmaW5lKFtfbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2lmdmFsKFskM10sIFtsdF9jb21iaW5lKFskMV0sIFskMl0sIFtfXSwgJDMpXSldKQorCisKKyMgbHRfZGVjbF9hbGxfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2FsbF92YXJuYW1lc10sCitbXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCisgICAgIG00X2lmKFskMl0sIFtdLAorCSAgIG00X3F1b3RlKGx0X2RlY2xfdmFybmFtZXMpLAorCW00X3F1b3RlKG00X3NoaWZ0KCRAKSkpKVtdZG5sCitdKQorbTRfZGVmaW5lKFtfbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW2x0X2pvaW4oJEAsIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFskMV0sCisJCQlsdF9kZWNsX3RhZ192YXJuYW1lcyhbWywgXV0sIG00X3NoaWZ0KCRAKSkpKWRubAorXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoW1ZBUk5BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUXVvdGUgYSB2YXJpYWJsZSB2YWx1ZSwgYW5kIGZvcndhcmQgaXQgdG8gYGNvbmZpZy5zdGF0dXMnIHNvIHRoYXQgaXRzCisjIGRlY2xhcmF0aW9uIHRoZXJlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpbiBgY29uZmlndXJlJy4gIFZBUk5BTUUKKyMgbXVzdCBoYXZlIGEgc2luZ2xlIHF1b3RlIGRlbGltaXRlZCB2YWx1ZSBmb3IgdGhpcyB0byB3b3JrLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFXSwKK1skMT0nYCRFQ0hPICIkXVskMSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2UgZGVsaW1pdCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgd2l0aCBzaW5nbGUgcXVvdGVzLCBzbyB3aGVuCisjIHdlIHdyaXRlIHRoZW0gdG8gY29uZmlnLnN0YXR1cywgd2UgaGF2ZSB0byBiZSBzdXJlIHRvIHF1b3RlIGFsbAorIyBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIHByb3Blcmx5LiAgSW4gY29uZmlndXJlLCB0aGlzIG1hY3JvIGV4cGFuZHMKKyMgZWFjaCB2YXJpYWJsZSBkZWNsYXJlZCB3aXRoIF9MVF9ERUNMIChhbmQgX0xUX1RBR0RFQ0wpIGludG86CisjCisjICAgIDx2YXI+PSdgJEVDSE8gIiQ8dmFyPiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittNF9kZWZ1bihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF9hbGxfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdTCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0IGNvbW1lbnQgYW5kIGxpc3Qgb2YgdGFncyBzdXBwb3J0ZWQgYnkgdGhlIHNjcmlwdAorbTRfZGVmdW4oW19MVF9MSUJUT09MX1RBR1NdLAorW19MVF9GT1JNQVRfQ09NTUVOVChbVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0XSlkbmwKK2F2YWlsYWJsZV90YWdzPSJfTFRfVEFHUyJkbmwKK10pCisKKworIyBfTFRfTElCVE9PTF9ERUNMQVJFKFZBUk5BTUUsIFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRyYWN0IHRoZSBkaWN0aW9uYXJ5IHZhbHVlcyBmb3IgVkFSTkFNRSAob3B0aW9uYWxseSB3aXRoIFRBRykgYW5kCisjIGV4cGFuZCB0byBhIGNvbW1lbnRlZCBzaGVsbCB2YXJpYWJsZSBzZXR0aW5nOgorIworIyAgICAjIFNvbWUgY29tbWVudCBhYm91dCB3aGF0IFZBUiBpcyBmb3IuCisjICAgIHZpc2libGVfbmFtZT0kbHRfaW50ZXJuYWxfbmFtZQorbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9ERUNMQVJFXSwKK1tfTFRfRk9STUFUX0NPTU1FTlQobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwKKwkJCQkJICAgW2Rlc2NyaXB0aW9uXSkpKVtdZG5sCittNF9wdXNoZGVmKFtfbGlidG9vbF9uYW1lXSwKKyAgICBtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbbGlidG9vbF9uYW1lXSkpKVtdZG5sCittNF9jYXNlKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pKSwKKyAgICBbMF0sIFtfbGlidG9vbF9uYW1lPVskXSQxXSwKKyAgICBbMV0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbMl0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbX2xpYnRvb2xfbmFtZT1sdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKV0pW11kbmwKK200X2lmdmFsKFskMl0sIFtfJDJdKVtdbTRfcG9wZGVmKFtfbGlidG9vbF9uYW1lXSlbXWRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0NPTkZJR19WQVJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgY29tbWVudGVkIGRlY2xhcmF0aW9ucyBvZiBub24tdGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcworIyBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGluIHRoZSBMSUJUT09MIENPTkZJRyBzZWN0aW9uIG9mIHRoZSBgbGlidG9vbCcKKyMgc2NyaXB0LiAgVGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyAoZXZlbiBmb3IgdGhlIExJQlRPT0wgQ09ORklHCisjIHNlY3Rpb24pIGFyZSBwcm9kdWNlZCBieSBfTFRfTElCVE9PTF9UQUdfVkFSUy4KK200X2RlZnVuKFtfTFRfTElCVE9PTF9DT05GSUdfVkFSU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sCisgICAgbTRfcXVvdGUoX2x0X2RlY2xfZmlsdGVyKFt0YWdnZWQ/XSwgW25vXSwgW10sIGx0X2RlY2xfdmFybmFtZXMpKSwKKyAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyKV0pXSldKQorCisKKyMgX0xUX0xJQlRPT0xfVEFHX1ZBUlMoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9MSUJUT09MX1RBR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIsIFskMV0pXSldKV0pCisKKworIyBfTFRfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdWQVJdLCBbbTRfaWZ2YWwoWyQyXSwgWyQxXyQyXSwgWyQxXSldKQorCisKKyMgX0xUX0NPTkZJR19DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlbmQgYWNjdW11bGF0ZWQgb3V0cHV0IHRvICRDT05GSUdfU1RBVFVTLiAgVGhhbmtzIHRvIHRoZSBsaXN0cyBvZgorIyB2YXJpYWJsZXMgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlIGVzY2FwaW5nIHdlIHNhdmVkIGZyb20gY2FsbHMKKyMgdG8gX0xUX0RFQ0wsIHdlIGNhbiBwdXQgcXVvdGUgZXNjYXBlZCB2YXJpYWJsZXMgZGVjbGFyYXRpb25zCisjIGludG8gYGNvbmZpZy5zdGF0dXMnLCBhbmQgdGhlbiB0aGUgc2hlbGwgY29kZSB0byBxdW90ZSBlc2NhcGUgdGhlbSBpbgorIyBmb3IgbG9vcHMgaW4gYGNvbmZpZy5zdGF0dXMnLiAgRmluYWxseSwgYW55IGFkZGl0aW9uYWwgY29kZSBhY2N1bXVsYXRlZAorIyBmcm9tIGNhbGxzIHRvIF9MVF9DT05GSUdfTElCVE9PTF9JTklUIGlzIGV4cGFuZGVkLgorbTRfZGVmdW4oW19MVF9DT05GSUdfQ09NTUFORFNdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9PVVRQVVRdLAorCWRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaGFzIGJlZW4gcGxhY2VkIGluICRDT05GSUdfTFQsCisJZG5sIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQgYWxsIG92ZXIgYWdhaW4gaW50byBjb25maWcuc3RhdHVzLAorCWRubCB0aGVuIHdlIHdpbGwgaGF2ZSBjb25maWcuc3RhdHVzIHJ1biAkQ09ORklHX0xUIGxhdGVyLCBzbyBpdAorCWRubCBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSBpcyBzdG9yZWQgdGhlcmU6CisgICAgICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICAgICAgWyRTSEVMTCAkQ09ORklHX0xUIHx8IEFTX0VYSVQoMSldLCBbQ09ORklHX0xUPSckQ09ORklHX0xUJ10pXSwKKyAgICBkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGlzIGRlc3RpbmVkIGZvciBjb25maWcuc3RhdHVzLAorICAgIGRubCBleHBhbmQgdGhlIGFjY3VtdWxhdGVkIGNvbW1hbmRzIGFuZCBpbml0IGNvZGUgbm93OgorICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSwgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSldKQorXSkjX0xUX0NPTkZJR19DT01NQU5EUworCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdLAorWworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCitkb3VibGVfcXVvdGVfc3Vic3Q9JyRkb3VibGVfcXVvdGVfc3Vic3QnCitkZWxheV92YXJpYWJsZV9zdWJzdD0nJGRlbGF5X3ZhcmlhYmxlX3N1YnN0JworX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCitMVENDPSckTFRDQycKK0xUQ0ZMQUdTPSckTFRDRkxBR1MnCitjb21waWxlcj0nJGNvbXBpbGVyX0RFRkFVTFQnCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorXCRbXTEKK19MVEVDSE9fRU9GJworfQorCisjIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCitdXSwgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyk7IGRvCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyBcXFxcIiJcXFxcXCRcJHZhciJcXFxcIlxgIGluCisgICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworX0xUX09VVFBVVF9MSUJUT09MX0lOSVQKK10pCisKKyMgX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoRklMRSwgW0NPTU1FTlRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgR2VuZXJhdGUgYSBjaGlsZCBzY3JpcHQgRklMRSB3aXRoIGFsbCBpbml0aWFsaXphdGlvbiBuZWNlc3NhcnkgdG8KKyMgcmV1c2UgdGhlIGVudmlyb25tZW50IGxlYXJuZWQgYnkgdGhlIHBhcmVudCBzY3JpcHQsIGFuZCBtYWtlIHRoZQorIyBmaWxlIGV4ZWN1dGFibGUuICBJZiBDT01NRU5UIGlzIHN1cHBsaWVkLCBpdCBpcyBpbnNlcnRlZCBhZnRlciB0aGUKKyMgYCMhJyBzZXF1ZW5jZSBidXQgYmVmb3JlIGluaXRpYWxpemF0aW9uIHRleHQgYmVnaW5zLiAgQWZ0ZXIgdGhpcworIyBtYWNybywgYWRkaXRpb25hbCB0ZXh0IGNhbiBiZSBhcHBlbmRlZCB0byBGSUxFIHRvIGZvcm0gdGhlIGJvZHkgb2YKKyMgdGhlIGNoaWxkIHNjcmlwdC4gIFRoZSBtYWNybyBlbmRzIHdpdGggbm9uLXplcm8gc3RhdHVzIGlmIHRoZQorIyBmaWxlIGNvdWxkIG5vdCBiZSBmdWxseSB3cml0dGVuIChzdWNoIGFzIGlmIHRoZSBkaXNrIGlzIGZ1bGwpLgorbTRfaWZkZWYoW0FTX0lOSVRfR0VORVJBVEVEXSwKK1ttNF9kZWZ1bihbX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVRdLFtBU19JTklUX0dFTkVSQVRFRCgkQCldKV0sCitbbTRfZGVmdW4oW19MVF9HRU5FUkFURURfRklMRV9JTklUXSwKK1ttNF9yZXF1aXJlKFtBU19QUkVQQVJFXSldZG5sCitbbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV1kbmwKK1tsdF93cml0ZV9mYWlsPTAKK2NhdCA+JDEgPDxfQVNFT0YgfHwgbHRfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyQyCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorZXhwb3J0IFNIRUxMCitfQVNFT0YKK2NhdCA+PiQxIDw8XF9BU0VPRiB8fCBsdF93cml0ZV9mYWlsPTEKK0FTX1NIRUxMX1NBTklUSVpFCitfQVNfUFJFUEFSRQorZXhlYyBBU19NRVNTQUdFX0ZEPiYxCitfQVNFT0YKK3Rlc3QgJGx0X3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICQxW11kbmwKK200X3BvcGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV0pXSkjIF9MVF9HRU5FUkFURURfRklMRV9JTklUCisKKyMgTFRfT1VUUFVUCisjIC0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIGFsbG93cyBlYXJseSBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdCAoYmVmb3JlCisjIEFDX09VVFBVVCBpcyBjYWxsZWQpLCBpbmNhc2UgaXQgaXMgdXNlZCBpbiBjb25maWd1cmUgZm9yIGNvbXBpbGF0aW9uCisjIHRlc3RzLgorQUNfREVGVU4oW0xUX09VVFBVVF0sCitbOiAke0NPTkZJR19MVD0uL2NvbmZpZy5sdH0KK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRDT05GSUdfTFRdKQorX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoWyIkQ09ORklHX0xUIl0sCitbIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIGEgbGlidG9vbCBzdHViIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5dKQorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitsdF9jbF9zaWxlbnQ9ZmFsc2UKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBBU19CT1goW1J1bm5pbmcgJGFzX21lLl0pCit9ID4mQVNfTUVTU0FHRV9MT0dfRkQKKworbHRfY2xfaGVscD0iXAorXGAkYXNfbWUnIGNyZWF0ZXMgYSBsb2NhbCBsaWJ0b29sIHN0dWIgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLAorZm9yIHVzZSBpbiBmdXJ0aGVyIGNvbmZpZ3VyZSB0aW1lIHRlc3RzIGJlZm9yZSB0aGUgcmVhbCBsaWJ0b29sIGlzCitnZW5lcmF0ZWQuCisKK1VzYWdlOiAkWzBdIFtbT1BUSU9OU11dCisKKyAgLWgsIC0taGVscCAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0ICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKKworbHRfY2xfdmVyc2lvbj0iXAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWcubHRbXWRubAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKK2NvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLgorCitDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5sdCBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCit3aGlsZSB0ZXN0ICRbI10gIT0gMAorZG8KKyAgY2FzZSAkWzFdIGluCisgICAgLS12ZXJzaW9uIHwgLS12KiB8IC1WICkKKyAgICAgIGVjaG8gIiRsdF9jbF92ZXJzaW9uIjsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgIGVjaG8gIiRsdF9jbF9oZWxwIjsgZXhpdCAwIDs7CisgICAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgICBkZWJ1Zz06IDs7CisgICAgLS1xdWlldCB8IC0tcSogfCAtLXNpbGVudCB8IC0tcyogfCAtcSApCisgICAgICBsdF9jbF9zaWxlbnQ9OiA7OworCisgICAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisKKyAgICAqKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBhcmd1bWVudDogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgJGx0X2NsX3NpbGVudDsgdGhlbgorICBleGVjIEFTX01FU1NBR0VfRkQ+L2Rldi9udWxsCitmaQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PF9MVEVPRgorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVQKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkb2ZpbGVdKQorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTCitBU19FWElUKDApCitfTFRFT0YKK2NobW9kICt4ICIkQ09ORklHX0xUIgorCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGJ1dCBjb25maWcubHQgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLAorIyBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZywgd2hpY2ggZmFpbHMgb24gRE9TLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQKKyMgb3BlbiBieSBjb25maWd1cmUuICBIZXJlIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwgZWZmZWN0aXZlbHkgY2xvc2luZworIyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gYnkgY29uZmlnLmx0LgorbHRfY2xfc3VjY2Vzcz06Cit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICBsdF9jb25maWdfbHRfYXJncz0iJGx0X2NvbmZpZ19sdF9hcmdzIC0tcXVpZXQiCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPi9kZXYvbnVsbAorJFNIRUxMICIkQ09ORklHX0xUIiAkbHRfY29uZmlnX2x0X2FyZ3MgfHwgbHRfY2xfc3VjY2Vzcz1mYWxzZQorZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZworJGx0X2NsX3N1Y2Nlc3MgfHwgQVNfRVhJVCgxKQorXSkjIExUX09VVFBVVAorCisKKyMgX0xUX0NPTkZJRyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBJZiBUQUcgaXMgdGhlIGJ1aWx0LWluIHRhZywgY3JlYXRlIGFuIGluaXRpYWwgbGlidG9vbCBzY3JpcHQgd2l0aCBhCisjIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB1bnRhZ2dlZCBjb25maWcgdmFycy4gIE90aGVyd2lzZSBhZGQgY29kZQorIyB0byBjb25maWcuc3RhdHVzIGZvciBhcHBlbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZWQgYnkgVEFHIGZyb20gdGhlCisjIG1hdGNoaW5nIHRhZ2dlZCBjb25maWcgdmFycy4KK200X2RlZnVuKFtfTFRfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT05GSUdfU0FWRV9DT01NQU5EUyhbCisgIG00X2RlZmluZShbX0xUX1RBR10sIG00X2lmKFskMV0sIFtdLCBbQ10sIFskMV0pKWRubAorICBtNF9pZihfTFRfVEFHLCBbQ10sIFsKKyAgICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisgICAgIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgICAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgICAgZmkKKworICAgIGNmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgICB0cmFwICIkUk0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAgICRSTSAiJGNmZ2ZpbGUiCisKKyAgICBjYXQgPDxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkRUNITyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkYXNfbWUgKCRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworX0xUX0NPUFlJTkcKK19MVF9MSUJUT09MX1RBR1MKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKK19MVF9MSUJUT09MX0NPTkZJR19WQVJTCitfTFRfTElCVE9PTF9UQUdfVkFSUworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19MVF9FT0YKKworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitfTFRfRU9GCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9QUk9HX0xUTUFJTgorCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisKKyAgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSwKK1tjYXQgPDxfTFRfRU9GID4+ICIkb2ZpbGUiCisKK2RubCBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlICQxIGhlcmUsIHNpbmNlIF9MVF9UQUcgaXMgbm90IGV4cGFuZGVkCitkbmwgaW4gYSBjb21tZW50IChpZSBhZnRlciBhICMpLgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0xJQlRPT0xfVEFHX1ZBUlMoX0xUX1RBRykKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfRU9GCitdKWRubCAvbTRfaWYKK10sCitbbTRfaWYoWyQxXSwgW10sIFsKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJ10sIFtdKQorXSlkbmwgL19MVF9DT05GSUdfU0FWRV9DT01NQU5EUworXSkjIF9MVF9DT05GSUcKKworCisjIExUX1NVUFBPUlRFRF9UQUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJhY2UgdGhpcyBtYWNybyB0byBkaXNjb3ZlciB3aGF0IHRhZ3MgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGlidG9vbAorIyAtLXRhZyBvcHRpb24sIHVzaW5nOgorIyAgICBhdXRvY29uZiAtLXRyYWNlICdMVF9TVVBQT1JURURfVEFHOiQxJworQUNfREVGVU4oW0xUX1NVUFBPUlRFRF9UQUddLCBbXSkKKworCisjIEMgc3VwcG9ydCBpcyBidWlsdC1pbiBmb3Igbm93CittNF9kZWZpbmUoW19MVF9MQU5HX0NfZW5hYmxlZF0sIFtdKQorbTRfZGVmaW5lKFtfTFRfVEFHU10sIFtdKQorCisKKyMgTFRfTEFORyhMQU5HKQorIyAtLS0tLS0tLS0tLS0tCisjIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLgorQUNfREVGVU4oW0xUX0xBTkddLAorW0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK200X2Nhc2UoWyQxXSwKKyAgW0NdLAkJCVtfTFRfTEFORyhDKV0sCisgIFtDKytdLAkJW19MVF9MQU5HKENYWCldLAorICBbR29dLAkJCVtfTFRfTEFORyhHTyldLAorICBbSmF2YV0sCQlbX0xUX0xBTkcoR0NKKV0sCisgIFtGb3J0cmFuIDc3XSwJCVtfTFRfTEFORyhGNzcpXSwKKyAgW0ZvcnRyYW5dLAkJW19MVF9MQU5HKEZDKV0sCisgIFtXaW5kb3dzIFJlc291cmNlXSwJW19MVF9MQU5HKFJDKV0sCisgIFttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19DT05GSUddLAorICAgIFtfTFRfTEFORygkMSldLAorICAgIFttNF9mYXRhbChbJDA6IHVuc3VwcG9ydGVkIGxhbmd1YWdlOiAiJDEiXSldKV0pZG5sCitdKSMgTFRfTEFORworCisKKyMgX0xUX0xBTkcoTEFOR05BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HXSwKK1ttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10sCisgIFtMVF9TVVBQT1JURURfVEFHKFskMV0pZG5sCisgIG00X2FwcGVuZChbX0xUX1RBR1NdLCBbJDEgXSlkbmwKKyAgbTRfZGVmaW5lKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSlkbmwKKyAgX0xUX0xBTkdfJDFfQ09ORklHKCQxKV0pZG5sCitdKSMgX0xUX0xBTkcKKworCittNF9pZm5kZWYoW0FDX1BST0dfR09dLCBbCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9URTogVGhpcyBtYWNybyBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbnRvICAgIworIyAgR05VIEF1dG9jb25mIGFzIEFDX1BST0dfR08uICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICAjCisjICBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXV0b2NvbmYgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzICAgICMKKyMgIG1hY3JvIGFuZCB1c2UgaXQgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCittNF9kZWZ1bihbQUNfUFJPR19HT10sCitbQUNfTEFOR19QVVNIKEdvKWRubAorQUNfQVJHX1ZBUihbR09DXSwgICAgIFtHbyBjb21waWxlciBjb21tYW5kXSlkbmwKK0FDX0FSR19WQVIoW0dPRkxBR1NdLCBbR28gY29tcGlsZXIgZmxhZ3NdKWRubAorX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCitBQ19DSEVDS19UT09MKEdPQywgZ2NjZ28pCitpZiB0ZXN0IC16ICIkR09DIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgQUNfQ0hFQ0tfUFJPRyhHT0MsIFske2FjX3Rvb2xfcHJlZml4fWdjY2dvXSwgWyR7YWNfdG9vbF9wcmVmaXh9Z2NjZ29dKQorICBmaQorZmkKK2lmIHRlc3QgLXogIiRHT0MiOyB0aGVuCisgIEFDX0NIRUNLX1BST0coR09DLCBnY2NnbywgZ2NjZ28sIGZhbHNlKQorZmkKK10pI200X2RlZnVuCitdKSNtNF9pZm5kZWYKKworCisjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkdfREVGQVVMVF9DT05GSUddLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgIFtMVF9MQU5HKENYWCldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbTFRfTEFORyhDWFgpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAorICBbTFRfTEFORyhGNzcpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0xUX0xBTkcoRjc3KV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRkNdLAorICBbTFRfTEFORyhGQyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0ZDXSwgZGVmbihbQUNfUFJPR19GQ10pW0xUX0xBTkcoRkMpXSldKQorCitkbmwgVGhlIGNhbGwgdG8gW0FdW01fUFJPR19HQ0pdIGlzIHF1b3RlZCBsaWtlIHRoYXQgdG8gc3RvcCBhY2xvY2FsCitkbmwgcHVsbGluZyB0aGluZ3MgaW4gbmVlZGxlc3NseS4KK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCisgIFtMVF9MQU5HKEdDSildLAorICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAorICAgIFtMVF9MQU5HKEdDSildLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19HQ0pdLAorICAgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgICBbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbTFRfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0xUX1BST0dfR0NKXSwgZGVmbihbTFRfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pXSldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dPXSwKKyAgW0xUX0xBTkcoR08pXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19HT10sIGRlZm4oW0FDX1BST0dfR09dKVtMVF9MQU5HKEdPKV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfUkNdLAorICBbTFRfTEFORyhSQyldLAorICBbbTRfZGVmaW5lKFtMVF9QUk9HX1JDXSwgZGVmbihbTFRfUFJPR19SQ10pW0xUX0xBTkcoUkMpXSldKQorXSkjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisKKyMgT2Jzb2xldGUgbWFjcm9zOgorQVVfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW0xUX0xBTkcoQysrKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbTFRfTEFORyhGb3J0cmFuIDc3KV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtMVF9MQU5HKEZvcnRyYW4pXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtMVF9MQU5HKEphdmEpXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwgW0xUX0xBTkcoV2luZG93cyBSZXNvdXJjZSldKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbXSkKKworCisjIF9MVF9UQUdfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UQUdfQ09NUElMRVJdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorCitfTFRfREVDTChbTFRDQ10sIFtDQ10sIFsxXSwgW0EgQyBjb21waWxlcl0pZG5sCitfTFRfREVDTChbTFRDRkxBR1NdLCBbQ0ZMQUdTXSwgWzFdLCBbTFRDQyBjb21waWxlciBmbGFnc10pZG5sCitfTFRfVEFHREVDTChbQ0NdLCBbY29tcGlsZXJdLCBbMV0sIFtBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyXSlkbmwKK19MVF9UQUdERUNMKFt3aXRoX2djY10sIFtHQ0NdLCBbMF0sIFtJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj9dKWRubAorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCitdKSMgX0xUX1RBR19DT01QSUxFUgorCisKKyMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gY29uZnRlc3QqCitdKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCitdKSMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIF9MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuX29uY2UoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSxbCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4qKQorICAgIEFDX0NIRUNLX1RPT0woW0RTWU1VVElMXSwgW2RzeW11dGlsXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW05NRURJVF0sIFtubWVkaXRdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTElQT10sIFtsaXBvXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MXSwgW290b29sXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MNjRdLCBbb3Rvb2w2NF0sIFs6XSkKKyAgICBfTFRfREVDTChbXSwgW0RTWU1VVElMXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTk1FRElUXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW0xJUE9dLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTF0sIFsxXSwKKyAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTDY0XSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40XSkKKworICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWddLFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kXSwKKyAgICAgIFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBpZiB0ZXN0IC16ICIke0xUX01VTFRJX01PRFVMRX0iOyB0aGVuCisJIyBCeSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSAtc2luZ2xlX21vZHVsZSBmbGFnLiBZb3UgY2FuIG92ZXJyaWRlCisJIyBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTFRfTVVMVElfTU9EVUxFCisJIyBub24tZW1wdHkgYXQgY29uZmlndXJlIHRpbWUsIG9yIGJ5IGFkZGluZyAtbXVsdGlfbW9kdWxlIHRvIHRoZQorCSMgbGluayBmbGFncy4KKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJZWNobyAiaW50IGZvbyh2b2lkKXtyZXR1cm4gMTt9IiA+IGNvbmZ0ZXN0LmMKKwllY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCSMgSWYgdGhlcmUgaXMgYSBub24tZW1wdHkgZXJyb3IgbG9nLCBhbmQgInNpbmdsZV9tb2R1bGUiCisJIyBhcHBlYXJzIGluIGl0LCBhc3N1bWUgdGhlIGZsYWcgY2F1c2VkIGEgbGlua2VyIHdhcm5pbmcKKyAgICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgc2luZ2xlX21vZHVsZSBjb25mdGVzdC5lcnI7IHRoZW4KKwkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorCSMgT3RoZXJ3aXNlLCBpZiB0aGUgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggYSAwIGV4aXQgY29kZSBmcm9tCisJIyB0aGUgY29tcGlsZXIsIGl0IHdvcmtlZC4KKwllbGlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAkX2x0X3Jlc3VsdCAtZXEgMDsgdGhlbgorCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwlybSAtZiBjb25mdGVzdC4qCisgICAgICBmaV0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWddLAorICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdF0sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9eWVzXSwKKwlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vXSkKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIF0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnXSxbbHRfY3ZfbGRfZm9yY2VfbG9hZF0sCisgICAgICBbbHRfY3ZfbGRfZm9yY2VfbG9hZD1ubworICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgZm9yY2VkX2xvYWRlZCgpIHsgcmV0dXJuIDI7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBlY2hvICIkUkFOTElCIGxpYmNvbmZ0ZXN0LmEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSAyPmNvbmZ0ZXN0LmVycgorICAgICAgX2x0X3Jlc3VsdD0kPworICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgZm9yY2VfbG9hZCBjb25mdGVzdC5lcnI7IHRoZW4KKwljYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGVsaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICAgICAgcm0gLWYgY29uZnRlc3QuZXJyIGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QgY29uZnRlc3QuYworICAgICAgICBybSAtcmYgY29uZnRlc3QuZFNZTQorICAgIF0pCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bWzkxXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworCTEwLltbMDEyXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworCTEwLiopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisgICAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX3NpbmdsZV9tb2Q9JyRzaW5nbGVfbW9kdWxlJworICAgIGZpCisgICAgaWYgdGVzdCAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nICR7d2x9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltJworICAgIGVsc2UKKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9J34kTk1FRElUIC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiIgJiYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gIm5vIjsgdGhlbgorICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKKyAgICBlbHNlCisgICAgICBfbHRfZHN5bXV0aWw9CisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQorCisKKyMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVja3MgZm9yIGxpbmtlciBhbmQgY29tcGlsZXIgZmVhdHVyZXMgb24gZGFyd2luCittNF9kZWZ1bihbX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVNdLAorWworICBtNF9yZXF1aXJlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIGlmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJ5ZXMiOyB0aGVuCisgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSdgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UgJHt3bH0tZm9yY2VfbG9hZCwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCcKKyAgICBtNF9jYXNlKFskMV0sIFtGNzddLCBbX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXNdLAorICAgICAgICAgICAgICAgICAgW0ZDXSwgIFtfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllc10pCisgIGVsc2UKKyAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgZmkKKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbTRfaWYoWyQxXSwgW0NYWF0sCitbICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgZmkKK10sW10pCisgIGVsc2UKKyAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICBmaQorXSkKKworIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KKyMgU3RvcmUgdGhlIHJlc3VsdHMgZnJvbSB0aGUgZGlmZmVyZW50IGNvbXBpbGVycyBmb3IgZWFjaCBUQUdOQU1FLgorIyBBbGxvdyB0byBvdmVycmlkZSB0aGVtIGZvciBhbGwgdGFncyB0aHJvdWdoIGx0X2N2X2FpeF9saWJwYXRoLgorbTRfZGVmdW4oW19MVF9TWVNfTU9EVUxFX1BBVEhfQUlYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAoraWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgQUNfQ0FDSEVfVkFMKFtfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKV0sCisgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNXSxbCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nWworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9XScKKyAgX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSk9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pIjsgdGhlbgorICAgIF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaV0sW10pCisgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKSI7IHRoZW4KKyAgICBfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKT0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKyAgXSkKKyAgYWl4X2xpYnBhdGg9JF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pCitmaQorXSkjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisKKworIyBfTFRfU0hFTExfSU5JVChBUkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1NIRUxMX0lOSVRdLAorW200X2RpdmVydF90ZXh0KFtNNFNILUlOSVRdLCBbJDEKK10pXSkjIF9MVF9TSEVMTF9JTklUCisKKworCisjIF9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgaG93IHdlIGNhbiBmYWtlIGFuIGVjaG8gY29tbWFuZCB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2guCisjIEluIHBhcnRpY3VsYXIsIHdpdGggQXV0b2NvbmYgMi42MCBvciBsYXRlciB3ZSBhZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydAorIyBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBmaW5kIGEgc2hlbGwgd2l0aCBhIGJ1aWx0aW4KKyMgcHJpbnRmICh3aGljaCB3ZSBjYW4gdXNlIGFzIGFuIGVjaG8gY29tbWFuZCkuCittNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAorW0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIHByaW50IHN0cmluZ3NdKQorIyBUZXN0IHByaW50IGZpcnN0LCBiZWNhdXNlIGl0IHdpbGwgYmUgYSBidWlsdGluIGlmIHByZXNlbnQuCitpZiB0ZXN0ICJYYCggcHJpbnQgLXIgLS0gLW4gKSAyPi9kZXYvbnVsbGAiID0gWC1uICYmIFwKKyAgIHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50IC1yIC0tJworZWxpZiB0ZXN0ICJYYHByaW50ZiAlcyAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnRmICVzXG4nCitlbHNlCisgICMgVXNlIHRoaXMgZnVuY3Rpb24gYXMgYSBmYWxsYmFjayB0aGF0IGFsd2F5cyB3b3Jrcy4KKyAgZnVuY19mYWxsYmFja19lY2hvICgpCisgIHsKKyAgICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorJFtdMQorX0xURUNIT19FT0YnCisgIH0KKyAgRUNITz0nZnVuY19mYWxsYmFja19lY2hvJworZmkKKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIgCit9CisKK2Nhc2UgIiRFQ0hPIiBpbgorICBwcmludGYqKSBBQ19NU0dfUkVTVUxUKFtwcmludGZdKSA7OworICBwcmludCopIEFDX01TR19SRVNVTFQoW3ByaW50IC1yXSkgOzsKKyAgKikgQUNfTVNHX1JFU1VMVChbY2F0XSkgOzsKK2VzYWMKKworbTRfaWZkZWYoW19BU19ERVRFQ1RfU1VHR0VTVEVEXSwKK1tfQVNfREVURUNUX1NVR0dFU1RFRChbCisgIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSR7QkFTSF9WRVJTSU9OK3NldH0iIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPYCIgPSAiWCRFQ0hPIiBcCisgICAgICB8fCB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPYCIgPSAiWCRFQ0hPIiApXSldKQorCitfTFRfREVDTChbXSwgW1NIRUxMXSwgWzFdLCBbU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0c10pCitfTFRfREVDTChbXSwgW0VDSE9dLCBbMV0sIFtBbiBlY2hvIHByb2dyYW0gdGhhdCBwcm90ZWN0cyBiYWNrc2xhc2hlc10pCitdKSMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKworCisjIF9MVF9XSVRIX1NZU1JPT1QKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9XSVRIX1NZU1JPT1RdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIHN5c3Jvb3RdKQorQUNfQVJHX1dJVEgoW3N5c3Jvb3RdLAorWyAgLS13aXRoLXN5c3Jvb3RbPURJUl0gU2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzIHdpdGhpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgIChvciB0aGUgY29tcGlsZXIncyBzeXNyb290IGlmIG5vdCBzcGVjaWZpZWQpLl0sCitbXSwgW3dpdGhfc3lzcm9vdD1ub10pCisKK2RubCBsdF9zeXNyb290IHdpbGwgYWx3YXlzIGJlIHBhc3NlZCB1bnF1b3RlZC4gIFdlIHF1b3RlIGl0IGhlcmUKK2RubCBpbiBjYXNlIHRoZSB1c2VyIHBhc3NlZCBhIGRpcmVjdG9yeSBuYW1lLgorbHRfc3lzcm9vdD0KK2Nhc2UgJHt3aXRoX3N5c3Jvb3R9IGluICMoCisgeWVzKQorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgbHRfc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKKyAgIGZpCisgICA7OyAjKAorIC8qKQorICAgbHRfc3lzcm9vdD1gZWNobyAiJHdpdGhfc3lzcm9vdCIgfCBzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgOzsgIygKKyBub3wnJykKKyAgIDs7ICMoCisgKikKKyAgIEFDX01TR19SRVNVTFQoWyR7d2l0aF9zeXNyb290fV0pCisgICBBQ19NU0dfRVJST1IoW1RoZSBzeXNyb290IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC5dKQorICAgOzsKK2VzYWMKKworIEFDX01TR19SRVNVTFQoWyR7bHRfc3lzcm9vdDotbm99XSkKK19MVF9ERUNMKFtdLCBbbHRfc3lzcm9vdF0sIFswXSwgW1RoZSByb290IHdoZXJlIHRvIHNlYXJjaCBmb3IgXWRubAorW2RlcGVuZGVudCBsaWJyYXJpZXMsIGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuXSldKQorCisjIF9MVF9FTkFCTEVfTE9DSworIyAtLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfRU5BQkxFX0xPQ0tdLAorW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCisgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisgICAgW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICAgKkVMRi0zMiopCisJSFBVWF9JQTY0X01PREU9IjMyIgorCTs7CisgICAgICAqRUxGLTY0KikKKwlIUFVYX0lBNjRfTU9ERT0iNjQiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSAnJExJTkVOTycgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtMzIiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwkgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgICAqMzItYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgOzsKKwkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfTEFOR19QVVNIKEMpCisgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSxbW11dKV0sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCisgICAgIEFDX0xBTkdfUE9QXSkKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopCisgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgaT84Ni0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjKi0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgICMgR05VIGxkIDIuMjEgaW50cm9kdWNlZCBfc29sMiBlbXVsYXRpb25zLiAgVXNlIHRoZW0gaWYgYXZhaWxhYmxlLgorICAgICAgICBpZiAke0xELWxkfSAtViB8IGdyZXAgX3NvbDIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgTEQ9IiR7TEQtbGR9X3NvbDIiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKK10pIyBfTFRfRU5BQkxFX0xPQ0sKKworCisjIF9MVF9QUk9HX0FSCisjIC0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BST0dfQVJdLAorW0FDX0NIRUNLX1RPT0xTKEFSLCBbYXJdLCBmYWxzZSkKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CitfTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKK19MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0sIFtGbGFncyB0byBjcmVhdGUgYW4gYXJjaGl2ZV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydF0sIFtsdF9jdl9hcl9hdF9maWxlXSwKKyAgW2x0X2N2X2FyX2F0X2ZpbGU9bm8KKyAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLAorICAgICBbZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCisgICAgICBBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKyAgICAgIGlmIHRlc3QgIiRhY19zdGF0dXMiIC1lcSAwOyB0aGVuCisJIyBFbnN1cmUgdGhlIGFyY2hpdmVyIGZhaWxzIHVwb24gYm9ndXMgZmlsZSBuYW1lcy4KKwlybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGxpYmNvbmZ0ZXN0LmEKKwlBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorICAgICBdKQorICBdKQorCitpZiB0ZXN0ICJ4JGx0X2N2X2FyX2F0X2ZpbGUiID0geG5vOyB0aGVuCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0KK2Vsc2UKKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9jdl9hcl9hdF9maWxlCitmaQorX0xUX0RFQ0woW10sIFthcmNoaXZlcl9saXN0X3NwZWNdLCBbMV0sCisgIFtIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXJdKQorXSkjIF9MVF9QUk9HX0FSCisKKworIyBfTFRfQ01EX09MRF9BUkNISVZFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX09MRF9BUkNISVZFXSwKK1tfTFRfUFJPR19BUgorCitBQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgorX0xUX0RFQ0woW10sIFtTVFJJUF0sIFsxXSwgW0Egc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtXSkKKworQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06CitfTFRfREVDTChbXSwgW1JBTkxJQl0sIFsxXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCR0b29sX29sZGxpYiIKK2ZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249eWVzIDs7CisgICopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPW5vIDs7Citlc2FjCitfTFRfREVDTChbXSwgW29sZF9wb3N0aW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX0RFQ0woW10sIFtvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKK19MVF9ERUNMKFtdLCBbbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uXSwgWzBdLAorICAgIFtXaGV0aGVyIHRvIHVzZSBhIGxvY2sgZm9yIG9sZCBhcmNoaXZlIGV4dHJhY3Rpb25dKQorXSkjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKworCisjIF9MVF9DT01QSUxFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjCQlbT1VUUFVULUZJTEVdLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9DT01QSUxFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgbTRfaWYoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitlbHNlCisgICAgbTRfaWYoWyQ2XSwgLCA6LCBbJDZdKQorZmkKK10pIyBfTFRfQ09NUElMRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbX0xUX0NPTVBJTEVSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW10pCisKKworIyBfTFRfTElOS0VSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmtlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfTElOS0VSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJDMiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAkMj15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgbTRfaWYoWyQ0XSwgLCA6LCBbJDRdKQorZWxzZQorICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKK2ZpCitdKSMgX0xUX0xJTktFUl9PUFRJT04KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbX0xUX0xJTktFUl9PUFRJT05dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbXSkKKworCisjIExUX0NNRF9NQVhfTEVOCisjLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfQ01EX01BWF9MRU5dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworQUNfTVNHX0NIRUNLSU5HKFt0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50c10pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19tYXhfY21kX2xlbl0sIFtkbmwKKyAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG1pbnQqKQorICAgICMgT24gTWlOVCB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3MyKikKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGEgbG9uZyB0aW1lIG9uIE9TLzIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTIKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbCSBdXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgICMgTWFrZSB0ZXN0c3RyaW5nIGEgbGl0dGxlIGJpZ2dlciBiZWZvcmUgd2UgZG8gYW55dGhpbmcgd2l0aCBpdC4KKyAgICAgICMgYSAxSyBzdHJpbmcgc2hvdWxkIGJlIGEgcmVhc29uYWJsZSBzdGFydC4KKyAgICAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA7IGRvCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KKyAgICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCisgICAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgICAgd2hpbGUgeyB0ZXN0ICJYImBlbnYgZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgICBkbworICAgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCisgICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQorICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworXSkKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkbHRfY3Zfc3lzX21heF9jbWRfbGVuKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorX0xUX0RFQ0woW10sIFttYXhfY21kX2xlbl0sIFswXSwKKyAgICBbV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kP10pCitdKSMgTFRfQ01EX01BWF9MRU4KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFtMVF9DTURfTUFYX0xFTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW10pCisKKworIyBfTFRfSEVBREVSX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfSEVBREVSX0RMRkNOXSwKK1tBQ19DSEVDS19IRUFERVJTKFtkbGZjbi5oXSwgW10sIFtdLCBbQUNfSU5DTFVERVNfREVGQVVMVF0pZG5sCitdKSMgX0xUX0hFQURFUl9ETEZDTgorCisKKyMgX0xUX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAorIyAgICAgICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRkFMU0UsIEFDVElPTi1JRi1DUk9TUy1DT01QSUxJTkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfVFJZX0RMT1BFTl9TRUxGXSwKK1ttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgWyQ0XQorZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitbI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9XQorX0xUX0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgJDMKKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCitdKSMgX0xUX1RSWV9ETE9QRU5fU0VMRgorCisKKyMgTFRfU1lTX0RMT1BFTl9TRUxGCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgXSkKKyAgICA7OworCisgICopCisgICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKKyAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSwKKwlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKKwkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKKwkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKKwkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCQkgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCJdLAorCSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCisJCSAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0pCisJICAgICAgXSkKKwkgICAgXSkKKwkgIF0pCisJXSkKKyAgICAgIF0pCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKKyAgICBdKQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMsIFtkbmwKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubywgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcykKKyAgICAgIF0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW2Rsb3Blbl9zdXBwb3J0XSwgW2VuYWJsZV9kbG9wZW5dLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWRdKQorX0xUX0RFQ0woW2Rsb3Blbl9zZWxmXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZfc3RhdGljXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWNdLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQorXSkjIExUX1NZU19ETE9QRU5fU0VMRgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbTFRfU1lTX0RMT1BFTl9TRUxGXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlci4KKyMgVGhpcyBtYWNybyBkb2VzIG5vdCBoYXJkIGNvZGUgdGhlIGNvbXBpbGVyIGxpa2UgQUNfUFJPR19DQ19DX08uCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0NfT10sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCitdKQorX0xUX1RBR0RFQ0woW2NvbXBpbGVyX2Nfb10sIFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFsxXSwKKwlbRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zP10pCitdKSMgX0xUX0NPTVBJTEVSX0NfTworCisKKyMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1NdLAorW200X3JlcXVpcmUoW19MVF9FTkFCTEVfTE9DS10pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT01QSUxFUl9DX08oWyQxXSkKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKK19MVF9ERUNMKFtdLCBbbmVlZF9sb2Nrc10sIFsxXSwgW011c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uP10pCitdKSMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MKKworCisjIF9MVF9DSEVDS19PQkpESVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DSEVDS19PQkpESVJdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCitbcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCitvYmpkaXI9JGx0X2N2X29iamRpcgorX0xUX0RFQ0woW10sIFtvYmpkaXJdLCBbMF0sCisgICAgICAgICBbVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW0xUX09CSkRJUl0pZG5sCitBQ19ERUZJTkVfVU5RVU9URUQoTFRfT0JKRElSLCAiJGx0X2N2X29iamRpci8iLAorICBbRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy5dKQorXSkjIF9MVF9DSEVDS19PQkpESVIKKworCisjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEhdLAorW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCitfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQoraWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fAorICAgdGVzdCAtbiAiJF9MVF9UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwKKyAgIHRlc3QgIlgkX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKSIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCitmaQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQorCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbmsgfHwKKyAgIHRlc3QgIiRfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKSIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2FjdGlvbl0sIFswXSwKKyAgICBbSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGVdKQorXSkjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSAorCisKKyMgX0xUX0NNRF9TVFJJUExJQgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9TVFJJUExJQl0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgOzsKKyAgZXNhYworZmkKK19MVF9ERUNMKFtdLCBbb2xkX3N0cmlwbGliXSwgWzFdLCBbQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3RyaXBsaWJdLCBbMV0pCitdKSMgX0xUX0NNRF9TVFJJUExJQgorCisKKyMgX0xUX1NZU19EWU5BTUlDX0xJTktFUihbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCittNF9pZihbJDFdLAorCVtdLCBbCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OworICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7CisgIGVzYWMKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VkX3N0cmlwX2VxPSJzLD1cKFtbQS1aYS16XV06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAorICAgIDs7CisgICopCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgOzsKKyAgZXNhYworICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtbbHRfZm9vXV0rKzsgfQorICBpZiAobHRfZnJlcVtbbHRfZm9vXV0gPT0gMSkgeyBwcmludCBsdF9mb287IH0KK30nYAorICAjIEFXSyBwcm9ncmFtIGFib3ZlIGVycm9uZW91c2x5IHByZXBlbmRzICcvJyB0byBDOi9kb3MvcGF0aHMKKyAgIyBmb3IgdGhlc2UgaG9zdHMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfFwKKyAgICAgICRTRUQgJ3MsL1woW1tBLVphLXpdXTpcKSxcMSxnJ2AgOzsKKyAgZXNhYworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpXSkKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4W1s0LTldXSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bWzAxXV0gfCBhaXg0LltbMDFdXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8ICRHUkVQIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBjYXNlICRob3N0X2NwdSBpbgorICBwb3dlcnBjKQorICAgICMgU2luY2UgSnVseSAyMDA3IEFtaWdhT1M0IG9mZmljaWFsbHkgc3VwcG9ydHMgLnNvIGxpYnJhcmllcy4KKyAgICAjIFdoZW4gY29tcGlsaW5nIHRoZSBleGVjdXRhYmxlLCBhZGQgLXVzZS1keW5sZCAtTHNvYmpzOiB0byB0aGUgY29tcGlsZWxpbmUuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgOzsKKyAgbTY4aykKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgICAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWBmdW5jX2VjaG9fYWxsICIkbGliIiB8ICRTRUQgJ1wnJ3MlXi4qL1woW1teL11dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKK200X2lmKFskMV0sIFtdLFsKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xpYi93MzJhcGkiXSkKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY2VnY2MqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisKKyAgKixjbCopCisgICAgIyBOYXRpdmUgTVNWQworICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbW2EtekEtWl1dXFwpOnwgL1xcMXxnJyAtZSAnc3xeIHx8J2AKKyAgICAgIDs7CisgICAgY3lnd2luKikKKyAgICAgICMgQ29udmVydCB0byB1bml4IGZvcm0sIHRoZW4gdG8gZG9zIGZvcm0sIHRoZW4gYmFjayB0byB1bml4IGZvcm0KKyAgICAgICMgYnV0IHRoaXMgdGltZSBkb3Mgc3R5bGUgKG5vIHNwYWNlcyEpIHNvIHRoYXQgdGhlIHVuaXggZm9ybSBsb29rcworICAgICAgIyBsaWtlIC9jeWdkcml2ZS9jL1BST0dSQX4xOi9jeWdkci4uLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMSUIiYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLWRvcyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgMj4vZGV2L251bGxgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgOzsKKyAgICAqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkTElCIgorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgWyRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgICMgRklYTUU6IGZpbmQgdGhlIHNob3J0IG5hbWUgb3IgdGhlIHBhdGggY29tcG9uZW50cywgYXMgc3BhY2VzIGFyZQorICAgICAgIyBjb21tb24uIChlLmcuICJQcm9ncmFtIEZpbGVzIiAtPiAiUFJPR1JBfjEiKQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGluay5leGUnCisgICAgOzsKKworICAqKQorICAgICMgQXNzdW1lIE1TVkMgd3JhcHBlcgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworICBlc2FjCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKK200X2lmKFskMV0sIFtdLFsKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIl0pCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbWzIzXV0uKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIuKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzItOV1dKiB8IGZyZWVic2RlbGYzLltbMi05XV0qIHwgXAorICBmcmVlYnNkNC5bWzAtNV1dIHwgZnJlZWJzZGVsZjQuW1swLTVdXSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgKikgIyBmcm9tIDQuNiBvbiwgYW5kIERyYWdvbkZseQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitoYWlrdSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NSwgLi4uCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICAjIG9yIGZhaWxzIG91dHJpZ2h0LCBzbyBvdmVycmlkZSBhdG9taWNhbGx5OgorICBpbnN0YWxsX292ZXJyaWRlX21vZGU9NTU1CisgIDs7CisKK2ludGVyaXhbWzMtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBBQ19DQUNIRV9WQUwoW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sCisgICAgW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSlcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKVwiIgorICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKKyAgICAgIFtBU19JRihbICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbF0sCisJIFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzXSldKQorICAgIExERkxBR1M9JHNhdmVfTERGTEFHUworICAgIGxpYmRpcj0kc2F2ZV9saWJkaXIKKyAgICBdKQorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZGVsZiotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRkeW5hbWljX2xpbmtlcl0pCit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCitfTFRfREVDTChbXSwgW3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rXSwgWzFdLAorICAgIFtWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyAgICByZXN0b3JlZCBhdCBsaW5rIHRpbWVdKQorX0xUX0RFQ0woW10sIFtuZWVkX2xpYl9wcmVmaXhdLCBbMF0sCisgICAgW0RvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz9dKQorX0xUX0RFQ0woW10sIFtuZWVkX3ZlcnNpb25dLCBbMF0sIFtEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzP10pCitfTFRfREVDTChbXSwgW3ZlcnNpb25fdHlwZV0sIFswXSwgW0xpYnJhcnkgdmVyc2lvbmluZyB0eXBlXSkKK19MVF9ERUNMKFtdLCBbcnVucGF0aF92YXJdLCBbMF0sICBbU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX3Zhcl0sIFswXSxbU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZV0pCitfTFRfREVDTChbXSwgW3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sIFswXSwKKyAgICBbSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoP10pCitfTFRfREVDTChbXSwgW2xpYm5hbWVfc3BlY10sIFsxXSwgW0Zvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4XSkKK19MVF9ERUNMKFtdLCBbbGlicmFyeV9uYW1lc19zcGVjXSwgWzFdLAorICAgIFtbTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyAgICBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FXV0pCitfTFRfREVDTChbXSwgW3NvbmFtZV9zcGVjXSwgWzFdLAorICAgIFtbVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWVdXSkKK19MVF9ERUNMKFtdLCBbaW5zdGFsbF9vdmVycmlkZV9tb2RlXSwgWzFdLAorICAgIFtQZXJtaXNzaW9uIG1vZGUgb3ZlcnJpZGUgZm9yIGluc3RhbGxhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbcG9zdGluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5XSkKK19MVF9ERUNMKFtdLCBbZmluaXNoX2V2YWxdLCBbMV0sCisgICAgW1tBcyAiZmluaXNoX2NtZHMiLCBleGNlcHQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQKKyAgICBub3Qgc2hvd25dXSkKK19MVF9ERUNMKFtdLCBbaGFyZGNvZGVfaW50b19saWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY10sIFsyXSwKKyAgICBbUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorXSkjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIKKworCisjIF9MVF9QQVRIX1RPT0xfUFJFRklYKFRPT0wpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyeQorQUNfREVGVU4oW19MVF9QQVRIX1RPT0xfUFJFRklYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9NQUdJQ19DTUQsCitbY2FzZSAkTUFHSUNfQ01EIGluCitbW1xcLypdIHwgID86W1xcL10qXSkKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCitkbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCitkbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgorICBhY19kdW1teT0ibTRfaWYoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjXSkKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK19MVF9ERUNMKFtdLCBbTUFHSUNfQ01EXSwgWzBdLAorCSBbVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyB3aXRoICJmaWxlIl0pZG5sCitdKSMgX0xUX1BBVEhfVE9PTF9QUkVGSVgKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW19MVF9QQVRIX1RPT0xfUFJFRklYXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTUFHSUMKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIGEgc2hhcmVkIGxpYnJhcnkKK200X2RlZnVuKFtfTFRfUEFUSF9NQUdJQ10sCitbX0xUX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQoraWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgX0xUX1BBVEhfVE9PTF9QUkVGSVgoZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorXSkjIF9MVF9QQVRIX01BR0lDCisKKworIyBMVF9QQVRIX0xECisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oW0xUX1BBVEhfTERdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCisKK0FDX0FSR19XSVRIKFtnbnUtbGRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCisJW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCisgICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCisgICAgW3dpdGhfZ251X2xkPW5vXSlkbmwKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCisgICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorX0xUX1BBVEhfTERfR05VCitBQ19TVUJTVChbTERdKQorCitfTFRfVEFHREVDTChbXSwgW0xEXSwgWzFdLCBbVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllc10pCitdKSMgTFRfUEFUSF9MRAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBTV9QUk9HX0xEXSwgW0xUX1BBVEhfTERdKQorQVVfQUxJQVMoW0FDX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX1BST0dfTERdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfUFJPR19MRF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTERfR05VCisjLSAtLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9QQVRIX0xEX0dOVV0sCitbQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCitbIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjXSkKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorXSkjIF9MVF9QQVRIX0xEX0dOVQorCisKKyMgX0xUX0NNRF9SRUxPQUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK200X2RlZnVuKFtfTFRfQ01EX1JFTE9BRF0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAorICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKKyAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPWZhbHNlCisgICAgZmkKKyAgICA7OworICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2ZsYWddLCBbMV0sIFtIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzXSlkbmwKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2NtZHNdLCBbMl0pZG5sCitdKSMgX0xUX0NNRF9SRUxPQUQKKworCisjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gY2hlY2sgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorbTRfcmVxdWlyZShbX0xUX0RFQ0xfT0JKRFVNUF0pCitBQ19DQUNIRV9DSEVDSyhbaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzXSwKK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kLAorW2x0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeFtbNC05XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitiZW9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKKyAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGFzc3VtZXMgQlNEIG5tLCBzbyBkaXNhbGxvdyBpdCBpZiB1c2luZyBNUyBkdW1wYmluLgorICBpZiAoIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIkJTRCBubSIgJiYgZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgICMgS2VlcCB0aGlzIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gZnVuY193aW4zMl9saWJpZC4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICBmaQorICA7OworCitjZWdjYyopCisgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVtbMy05XV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaGFpa3UqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxFTEYtW1swLTldXVtbMC05XV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGWyAtXVswLTldWzAtOV0pKC1iaXQpPyggW0xNXVNCKT8gc2hhcmVkIG9iamVjdCggZmlsZSk/WywgLV0qIFBBLVJJU0MgWzAtOV1cLlswLTldJ10KKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dXC5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4W1szLTldXSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCisqbnRvKiB8ICpxbngqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKwordHBmKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKK10pCisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bW1wxXV1cL1tbXDFdXVwvZzsvZyJgCisgICAgZmkKKyAgICA7OworICBlc2FjCitmaQorCitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCisKK19MVF9ERUNMKFtdLCBbZGVwbGlic19jaGVja19tZXRob2RdLCBbMV0sCisgICAgW01ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzXSkKK19MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19jbWRdLCBbMV0sCisgICAgW0NvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorX0xUX0RFQ0woW10sIFtmaWxlX21hZ2ljX2dsb2JdLCBbMV0sCisgICAgW0hvdyB0byBmaW5kIHBvdGVudGlhbCBmaWxlcyB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiXSkKK19MVF9ERUNMKFtdLCBbd2FudF9ub2Nhc2VnbG9iXSwgWzFdLAorICAgIFtGaW5kIHBvdGVudGlhbCBmaWxlcyB1c2luZyBub2Nhc2VnbG9iIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorXSkjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKworCisjIExUX1BBVEhfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oW0xUX1BBVEhfTk1dLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKV0sIGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIDogJHtsdF9jdl9wYXRoX05NPW5vfQorZmldKQoraWYgdGVzdCAiJGx0X2N2X3BhdGhfTk0iICE9ICJubyI7IHRoZW4KKyAgTk09IiRsdF9jdl9wYXRoX05NIgorZWxzZQorICAjIERpZG4ndCBmaW5kIGFueSBCU0QgY29tcGF0aWJsZSBuYW1lIGxpc3RlciwgbG9vayBmb3IgZHVtcGJpbi4KKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuIDoKKyAgICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgZWxzZQorICAgIEFDX0NIRUNLX1RPT0xTKERVTVBCSU4sIFtkdW1wYmluICJsaW5rIC1kdW1wIl0sIDopCisgICAgY2FzZSBgJERVTVBCSU4gLXN5bWJvbHMgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKyAgICAqQ09GRiopCisgICAgICBEVU1QQklOPSIkRFVNUEJJTiAtc3ltYm9scyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIERVTVBCSU49OgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIEFDX1NVQlNUKFtEVU1QQklOXSkKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCitBQ19TVUJTVChbTk1dKQorX0xUX0RFQ0woW10sIFtOTV0sIFsxXSwgW0EgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyXSlkbmwKKworQUNfQ0FDSEVfQ0hFQ0soW3RoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2VdLCBbbHRfY3Zfbm1faW50ZXJmYWNlXSwKKyAgW2x0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRhY19jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJE5NIFxcXCJjb25mdGVzdC4kYWNfb2JqZXh0XFxcIlwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAoZXZhbCAiJE5NIFwiY29uZnRlc3QuJGFjX29iamV4dFwiIiAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dCkKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiBvdXRwdXRcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgY2F0IGNvbmZ0ZXN0Lm91dCA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgorICBmaQorICBybSAtZiBjb25mdGVzdCpdKQorXSkjIExUX1BBVEhfTk0KKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQU1fUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK0FVX0FMSUFTKFtBQ19QUk9HX05NXSwgW0xUX1BBVEhfTk1dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX05NXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1BST0dfTk1dLCBbXSkKKworIyBfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeQorIyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBsaW5rIGxpYnJhcnkuCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUJdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKQorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRExMVE9PTF0pCitBQ19DQUNIRV9DSEVDSyhbaG93IHRvIGFzc29jaWF0ZSBydW50aW1lIGFuZCBsaW5rIGxpYnJhcmllc10sCitsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCwKK1tsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0ndW5rbm93bicKKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAjIHR3byBkaWZmZXJlbnQgc2hlbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gbHRtYWluLnNoCisgICMgZGVjaWRlIHdoaWNoIHRvIHVzZSBiYXNlZCBvbiBjYXBhYmlsaXRpZXMgb2YgJERMTFRPT0wKKyAgY2FzZSBgJERMTFRPT0wgLS1oZWxwIDI+JjFgIGluCisgICotLWlkZW50aWZ5LXN0cmljdCopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sKKyAgICA7OworICBlc2FjCisgIDs7CisqKQorICAjIGZhbGxiYWNrOiBhc3N1bWUgbGlua2xpYiBJUyBzaGFyZWRsaWIKKyAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9IiRFQ0hPIgorICA7OworZXNhYworXSkKK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAordGVzdCAteiAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiAmJiBzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kRUNITworCitfTFRfREVDTChbXSwgW3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kXSwgWzFdLAorICAgIFtDb21tYW5kIHRvIGFzc29jaWF0ZSBzaGFyZWQgYW5kIGxpbmsgbGlicmFyaWVzXSkKK10pIyBfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQgorCisKKyMgX0xUX1BBVEhfTUFOSUZFU1RfVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGxvY2F0ZSB0aGUgbWFuaWZlc3QgdG9vbAorbTRfZGVmdW4oW19MVF9QQVRIX01BTklGRVNUX1RPT0xdLAorW0FDX0NIRUNLX1RPT0woTUFOSUZFU1RfVE9PTCwgbXQsIDopCit0ZXN0IC16ICIkTUFOSUZFU1RfVE9PTCIgJiYgTUFOSUZFU1RfVE9PTD1tdAorQUNfQ0FDSEVfQ0hFQ0soW2lmICRNQU5JRkVTVF9UT09MIGlzIGEgbWFuaWZlc3QgdG9vbF0sIFtsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2xdLAorICBbbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPW5vCisgIGVjaG8gIiRhc19tZTokTElORU5POiAkTUFOSUZFU1RfVE9PTCAnLT8nIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICRNQU5JRkVTVF9UT09MICctPycgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdNYW5pZmVzdCBUb29sJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9eWVzCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0Kl0pCitpZiB0ZXN0ICJ4JGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCIgIT0geHllczsgdGhlbgorICBNQU5JRkVTVF9UT09MPToKK2ZpCitfTFRfREVDTChbXSwgW01BTklGRVNUX1RPT0xdLCBbMV0sIFtNYW5pZmVzdCB0b29sXSlkbmwKK10pIyBfTFRfUEFUSF9NQU5JRkVTVF9UT09MCisKKworIyBMVF9MSUJfTQorIyAtLS0tLS0tLQorIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihbTFRfTElCX01dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0xJQk09CitjYXNlICRob3N0IGluCisqLSotYmVvcyogfCAqLSotY2VnY2MqIHwgKi0qLWN5Z3dpbiogfCAqLSotaGFpa3UqIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCisgICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAorICA7OworKi1uY3Itc3lzdjQuMyopCisgIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQorICA7OworKikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKKyAgOzsKK2VzYWMKK0FDX1NVQlNUKFtMSUJNXSkKK10pIyBMVF9MSUJfTQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0NIRUNLX0xJQk1dLCBbTFRfTElCX01dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfTk9fUlRUSV0sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgbnZjYyopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLVhjb21waWxlciAtZm5vLWJ1aWx0aW4nIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zLAorICAgIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sCisgICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCitmaQorX0xUX1RBR0RFQ0woW25vX2J1aWx0aW5fZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9uc10pCitdKSMgX0xUX0NPTVBJTEVSX05PX1JUVEkKKworCisjIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK0FDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdF0pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLAorWworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbW0JDRFRdXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKKyAgOzsKK2hwdXgqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCisgIGZpCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW1tCRFJUXV0nCisgIDs7CitzY28zLjJ2NSopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y0LjJ1dzIqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbW0FCRFRdXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbW0RGTlNUVV1dJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2Nhc2UgYCROTSAtViAyPiYxYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJyA7OworZXNhYworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCisjIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXClbWyBdXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKVtbIF1dKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChsaWJbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gJEVDSE8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcnNjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGlmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgICAgIyBGYWtlIGl0IGZvciBkdW1wYmluIGFuZCBzYXkgVCBmb3IgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24KKyAgICAjIGFuZCBEIGZvciBhbnkgZ2xvYmFsIHZhcmlhYmxlLgorICAgICMgQWxzbyBmaW5kIEMrKyBhbmQgX19mYXN0Y2FsbCBzeW1ib2xzIGZyb20gTVNWQysrLAorICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyBbJyJcCisiICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKKyIgICAgIC9eQ09GRiBTWU1CT0wgVEFCTEUve2ZvcihpIGluIGhpZGUpIGRlbGV0ZSBoaWRlW2ldfTsiXAorIiAgICAgL1NlY3Rpb24gbGVuZ3RoIC4qI3JlbG9jcy4qKHBpY2sgYW55KS97aGlkZVtsYXN0X3NlY3Rpb25dPTF9OyJcCisiICAgICBcJCAwIX4vRXh0ZXJuYWwgKlx8L3tuZXh0fTsiXAorIiAgICAgLyAwKyBVTkRFRiAve25leHR9OyAvIFVOREVGIFwoW158XVwpKigpL3tuZXh0fTsiXAorIiAgICAge2lmKGhpZGVbc2VjdGlvbl0pIG5leHR9OyJcCisiICAgICB7Zj0wfTsgXCQgMH4vXChcKS4qXHwve2Y9MX07IHtwcmludGYgZiA/IFwiVCBcIiA6IFwiRCBcIn07IlwKKyIgICAgIHtzcGxpdChcJCAwLCBhLCAvXHx8XHIvKTsgc3BsaXQoYVsyXSwgcyl9OyJcCisiICAgICBzWzFdfi9eW0A/XS97cHJpbnQgc1sxXSwgc1sxXTsgbmV4dH07IlwKKyIgICAgIHNbMV1+cHJmeCB7c3BsaXQoc1sxXSx0LFwiQFwiKTsgcHJpbnQgdFsxXSwgc3Vic3RyKHRbMV0sbGVuZ3RoKHByZngpKX0iXAorIiAgICAgJyBwcmZ4PV4kYWNfc3ltcHJmeF0iCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qW1sJIF1dXCgkc3ltY29kZSRzeW1jb2RlKlwpW1sJIF1dW1sJIF1dKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnLyBfX2dudV9sdG8vZCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKTsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorX0xUX0VPRgorCisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmICRHUkVQICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgJEdSRVAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxfTFRfRU9GID4gY29uZnRlc3QuJGFjX2V4dAorLyogS2VlcCB0aGlzIGNvZGUgaW4gc3luYyBiZXR3ZWVuIGxpYnRvb2wubTQsIGx0bWFpbiwgbHRfc3lzdGVtLmgsIGFuZCB0ZXN0cy4gICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZSBydW50aW1lCisgICByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24gb24gcHNldWRvLXJlbG9jcy4gICovCisjIGRlZmluZSBMVEAmdEBfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRAJnRAX0RMU1lNX0NPTlNUCisjZWxzZQorIyBkZWZpbmUgTFRAJnRAX0RMU1lNX0NPTlNUIGNvbnN0CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfTFRfRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLworTFRAJnRAX0RMU1lNX0NPTlNUIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHZvaWQgICAgICAgKmFkZHJlc3M7Cit9CitsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Cit7CisgIHsgIkBQUk9HUkFNQCIsICh2b2lkICopIDAgfSwKK19MVF9FT0YKKwkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sLyIgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKHZvaWQgKikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK19MVF9FT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X2dsb2JzeW1fc2F2ZV9MSUJTPSRMSUJTCisJICBsdF9nbG9ic3ltX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgorCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9JGx0X2dsb2JzeW1fc2F2ZV9MSUJTCisJICBDRkxBR1M9JGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1MKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KiBjb25mdHN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCitdKQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChvaykKK2ZpCisKKyMgUmVzcG9uc2UgZmlsZSBzdXBwb3J0LgoraWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitlbGlmICROTSAtLWhlbHAgMj4vZGV2L251bGwgfCBncmVwICdbW0BdXUZJTEUnID4vZGV2L251bGw7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitmaQorCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF9waXBlXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLCBbMV0sCisgICAgW1Rha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXNdKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY2RlY2xdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2xdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb25dKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NdLAorICAgIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLAorICAgIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIgd2hlbiBsaWIgcHJlZml4IGlzIG5lZWRlZF0pCitfTFRfREVDTChbXSwgW25tX2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXMgZm9yICROTV0pCitdKSAjIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKKworCisjIF9MVF9DT01QSUxFUl9QSUMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfUElDXSwKK1ttNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPQorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQorCittNF9pZihbJDFdLCBbQ1hYXSwgWworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgIDs7CisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQorICAgICAgOzsKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICpxbngqIHwgKm50byopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4W1s0LTldXSopCisJIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwllbHNlCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKwlmaQorCTs7CisgICAgICBjaG9ydXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJY3hjaDY4KikKKwkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAjIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisJIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworCSMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisJbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCSAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisJOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKKwk7OworICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgIGZpCisJICAgIDs7CisJICBhQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCp8aWE2NCopCisJICAgICAgIyArWiB0aGUgZGVmYXVsdAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgaW50ZXJpeCopCisJIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCisJIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PworCTs7CisgICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgOzsKKwkgIGVjcGMqICkKKwkgICAgIyBvbGQgSW50ZWwgQysrIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgaWNwYyogKQorCSAgICAjIEludGVsIEMrKywgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisJICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyogfCBwZ2NwcCopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICB4bGMqIHwgeGxDKiB8IGJneGxbW2NDXV0qIHwgbXBpeGxbW2NDXV0qKQorCSAgICAjIElCTSBYTCA4LjAsIDkuMCBvbiBQUEMgYW5kIEJsdWVHZW5lCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbHlueG9zKikKKwk7OworICAgICAgbTg4ayopCisJOzsKKyAgICAgIG12cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGN4eCopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorCTs7CisgICAgICAqcW54KiB8ICpudG8qKQorICAgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICA7OworCSAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgcHNvcyopCisJOzsKKyAgICAgIHNvbGFyaXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyogfCBzdW5DQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgICAgOzsKKwkgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzdW5vczQqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCSAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHRhbmRlbSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHZ4d29ya3MqKQorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgZmkKK10sCitbCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBudmNjKikgIyBDdWRhIENvbXBpbGVyIERyaXZlciAyLjIKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctWGxpbmtlciAnCisgICAgICBpZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIjsgdGhlbgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ii1YY29tcGlsZXIgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorICAgICAgZWNjKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgaWNjIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorICAgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisgICAgICBpY2MqIHwgaWZvcnQqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBMYWhleSBGb3J0cmFuIDguMS4KKyAgICAgIGxmOTUqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLS1zaGFyZWQnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctLXN0YXRpYycKKwk7OworICAgICAgbmFnZm9yKikKKwkjIE5BRyBGb3J0cmFuIGNvbXBpbGVyCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwtV2wsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqIHwgYmd4bCogfCBiZ2YqIHwgbXBpeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSwgMTEuMSBvbiBQUEMgYW5kIEJsdWVHZW5lCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDZXJlc1wgRm9ydHJhbiogfCAqU3VuKkZvcnRyYW4qXCBbWzEtN11dLiogfCAqU3VuKkZvcnRyYW4qXCA4LltbMC0zXV0qKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nJworCSAgOzsKKwkqU3VuXCBGKiB8ICpTdW4qRm9ydHJhbiopCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICA7OworCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICA7OworICAgICAgICAqSW50ZWwqXCBbW0NGXV0qQ29tcGlsZXIqKQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgOzsKKwkqUG9ydGxhbmRcIEdyb3VwKikKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICByZG9zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSogfCBzdW5mNzcqIHwgc3VuZjkwKiB8IHN1bmY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitdKQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlAJnRAbTRfaWYoWyQxXSxbXSxbIC1EUElDXSxbbTRfaWYoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKSIKKyAgICA7OworZXNhYworCitBQ19DQUNIRV9DSEVDSyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgJDEpXSwKKyAgICBbJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pXSwgW10sCisgICAgW2Nhc2UgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiIDs7CisgICAgIGVzYWNdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm9dKQorZmkKK19MVF9UQUdERUNMKFtwaWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFsxXSwKKwlbQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzXSkKKworX0xUX1RBR0RFQ0woW3dsXSwgW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbMV0sCisJW0hvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXJdKQorIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCitfTFRfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLAorICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAkMSksCisgICRsdF90bXBfc3RhdGljX2ZsYWcsCisgIFtdLAorICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPV0pCitfTFRfVEFHREVDTChbbGlua19zdGF0aWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZ10pCitdKSMgX0xUX0NPTVBJTEVSX1BJQworCisKKyMgX0xUX0xJTktFUl9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCittNF9kZWZ1bihbX0xUX0xJTktFUl9TSExJQlNdLAorW0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCittNF9yZXF1aXJlKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCittNF9pZihbJDFdLCBbQ1hYXSwgWworICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbWzQtOV1dKikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsIGRlZmluZWQKKyAgICAjIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgorICAgIGlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgY2wqKQorICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT0nX05VTExfSU1QT1JUX0RFU0NSSVBUT1J8X0lNUE9SVF9ERVNDUklQVE9SXy4qJworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS87cy9eLipbWyBdXV9fbm1fX1woW1teIF1dKlwpW1sgXV1bW14gXV0qL1wxIERBVEEvOy9eSVtbIF1dL2Q7L15bW0FJVFddXVtbIF1dL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJ10KKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgIDs7CisgIGVzYWMKK10sIFsKKyAgcnVucGF0aF92YXI9CisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCisgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KKyAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgX0xUX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KK2RubCBOb3RlIGFsc28gYWRqdXN0IGV4Y2x1ZGVfZXhwc3ltcyBmb3IgQysrIGFib3ZlLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBsaW51eCogfCBrKmJzZCotZ251IHwgZ251KikKKyAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT1ubworICAgIDs7CisgIGVzYWMKKworICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworCisgICMgT24gc29tZSB0YXJnZXRzLCBHTlUgbGQgaXMgY29tcGF0aWJsZSBlbm91Z2ggd2l0aCB0aGUgbmF0aXZlIGxpbmtlcgorICAjIHRoYXQgd2UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgbmF0aXZlIGludGVyZmFjZSBmb3IgYm90aC4KKyAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9bm8KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisJIyBUaGUgQUlYIHBvcnQgb2YgR05VIGxkIGhhcyBhbHdheXMgYXNwaXJlZCB0byBjb21wYXRpYmlsaXR5CisJIyB3aXRoIHRoZSBuYXRpdmUgbGlua2VyLiAgSG93ZXZlciwgYXMgdGhlIHdhcm5pbmcgaW4gdGhlIEdOVSBsZAorCSMgYmxvY2sgc2F5cywgdmVyc2lvbnMgYmVmb3JlIDIuMTkuNSogY291bGRuJ3QgcmVhbGx5IGNyZWF0ZSB3b3JraW5nCisJIyBzaGFyZWQgbGlicmFyaWVzLCByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNlZC4KKwljYXNlIGAkTEQgLXYgMj4mMWAgaW4KKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLjE5LjUqKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuW1syLTldXSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgW1szLTldXSopIDs7CisJICAqKQorCSAgICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICopCisJbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgZWxzZQorICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAqR05VXCBnb2xkKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXhbWzMtOV1dKikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuMTksIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBiaW51dGlscworKioqIDIuMjAgb3IgYWJvdmUsIG9yIG1vZGlmeSB5b3VyIFBBVEggc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLgorKioqIFlvdSB3aWxsIHRoZW4gbmVlZCB0byByZXN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCisKK19MVF9FT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1hbGwtc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLztzL14uKltbIF1dX19ubV9fXChbW14gXV0qXClbWyBdXVtbXiBdXSovXDEgREFUQS87L15JW1sgXV0vZDsvXltbQUlUV11dW1sgXV0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydbX10rR0xPQkFMX09GRlNFVF9UQUJMRV98W19dK0dMT0JBTF9fW0ZJRF1fLip8W19dK2hlYWRfW0EtWmEtejAtOV9dK19kbGx8W0EtWmEtejAtOV9dK19kbGxfaW5hbWUnXQorCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgdG1wX2RpZXQ9bm8KKyAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQorCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCisJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubworICAgICAgdGhlbgorCXRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJworCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisJCQkJCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7CisJZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKKwlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgorCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKKwlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorCSAgdG1wX3NoYXJlZGZsYWc9Jy0tc2hhcmVkJyA7OworCXhsW1tjQ11dKiB8IGJneGxbW2NDXV0qIHwgbXBpeGxbW2NDXV0qKSAjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCisJICB0bXBfc2hhcmVkZmxhZz0nLXFta3Nocm9iaicKKwkgIHRtcF9hZGRmbGFnPSA7OworCW52Y2MqKQkjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCisJICA7OworCWVzYWMKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCWVzYWMKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisgICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKyAgICAgICAgZmkKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJeGxmKiB8IGJnZiogfCBiZ3hsZiogfCBtcGl4bGYqKQorCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFtbNC05XV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwkjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwKKwkjIGRlZmluZWQgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisJIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBlbHNlCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgIGZpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVtbNDVdXSopCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjbCopCisJIyBOYXRpdmUgTVNWQworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCV9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPSdAJworCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgc2VkIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGVsc2UKKwkgICAgc2VkIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGZpfgorCSAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgbGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwlfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisJX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEsREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXVtbIF1dL3MvLipbWyBdXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCSMgRG9uJ3QgdXNlIHJhbmxpYgorCV9MVF9UQUdWQVIob2xkX3Bvc3RpbnN0YWxsX2NtZHMsICQxKT0nY2htb2QgNjQ0ICRvbGRsaWInCisJX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICouZXhlfCouRVhFKSA7OworCSAgICAqKQorCSAgICAgIGx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICBsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCSAgICAgIDs7CisJICBlc2FjfgorCSAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICBmaScKKwk7OworICAgICAgKikKKwkjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBmdW5jX2VjaG9fYWxsICIkZGVwbGlicyIgfCAkU0VEICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKwlfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorCV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisJX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyLiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCW00X2lmKCQxLCBbXSwgWworCSAgIyBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgMTEuMDAgY29tcGlsZXIgZG8gbm90IHVuZGVyc3RhbmQgLWIgeWV0CisJICAjIChIUDkyNDUzLTAxIEEuMTEuMDEuMjAgZG9lc24ndCwgSFA5MjQ1My0wMSBCLjExLlguMzUxNzUtMzUxNzYuR1AgZG9lcykKKwkgIF9MVF9MSU5LRVJfT1BUSU9OKFtpZiAkQ0MgdW5kZXJzdGFuZHMgLWJdLAorCSAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfX2IsICQxKSwgWy1iXSwKKwkgICAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJ10sCisJICAgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJ10pXSwKKwkgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyddKQorCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sXSwKKwkgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbF0sCisJICBbc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgQUNfTElOS19JRkVMU0UoCisJICAgICBbQUNfTEFOR19TT1VSQ0UoCisJICAgICAgICBbQUNfTEFOR19DQVNFKFtDXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbQysrXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbRm9ydHJhbiA3N10sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0sCisJCQkgICAgICBbRm9ydHJhbl0sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0pXSldLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXNdLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ub10pCisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiXSkKKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwlpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkqIkNvbXBpbGVycyA1LjAiKikKKwkgIHdsYXJjPScnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCSopCisJICB3bGFyYz0nJHt3bH0nCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworICAgICAgKikKKwkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKKwkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KKwkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwllbHNlCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SLCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgeCRob3N0X3ZlbmRvciA9IHhzbmk7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CbGFyZ2VkeW5zeW0nCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorXSkKK0FDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKK3Rlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworX0xUX1RBR1ZBUih3aXRoX2dudV9sZCwgJDEpPSR3aXRoX2dudV9sZAorCitfTFRfREVDTChbXSwgW2xpYmV4dF0sIFswXSwgW09sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKV0pZG5sCitfTFRfREVDTChbXSwgW3NocmV4dF9jbWRzXSwgWzFdLCBbU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIildKWRubAorX0xUX0RFQ0woW10sIFtleHRyYWN0X2V4cHN5bXNfY21kc10sIFsyXSwKKyAgICBbVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0sCisJW2x0X2N2X11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSksCisJWyRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworCWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB0aGVuCisJICBzb25hbWU9Y29uZnRlc3QKKwkgIGxpYj1jb25mdGVzdAorCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisJICBkZXBsaWJzPQorCSAgd2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCisJICBwaWNfZmxhZz0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisJICBjb21waWxlcl9mbGFncz0tdgorCSAgbGlua2VyX2ZsYWdzPS12CisJICB2ZXJzdHJpbmc9CisJICBvdXRwdXRfb2JqZGlyPS4KKwkgIGxpYm5hbWU9Y29uZnRlc3QKKwkgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorCSAgaWYgQUNfVFJZX0VWQUwoX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkKKwkgIHRoZW4KKwkgICAgbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwkgIGVsc2UKKwkgICAgbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICBmaQorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisJZmkKKwkkUk0gY29uZnRlc3QqCisJXSkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0kbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitfTFRfVEFHREVDTChbYnVpbGRfbGlidG9vbF9uZWVkX2xjXSwgW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFthbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXNdLAorICAgIFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljXSkKK19MVF9UQUdERUNMKFtdLCBbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zXSkKK19MVF9UQUdERUNMKFtdLCBbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlc10pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX25lZWRzX29iamVjdF0sIFsxXSwKKyAgICBbV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHldKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW0NyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfY21kc10sIFsyXSwgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW21vZHVsZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCisgICAgYSBzaGFyZWQgYXJjaGl2ZS5dKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW3dpdGhfZ251X2xkXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIGFyZSBidWlsZGluZyB3aXRoIEdOVSBsZCBvciBub3RdKQorX0xUX1RBR0RFQ0woW10sIFthbGxvd191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHRdKQorX0xUX1RBR0RFQ0woW10sIFtub191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbRmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisgICAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFsxXSwKKyAgICBbV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyAgICAiYWJzb2x1dGUiLCBpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyAke3NobGlicGF0aF92YXJ9IGlmIHRoZQorICAgIGxpYnJhcnkgaXMgcmVsb2NhdGVkXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbWludXNfTF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYXV0b21hdGljXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAorICAgIGFnYWluc3QgaXRdKQorX0xUX1RBR0RFQ0woW10sIFtpbmhlcml0X3JwYXRoXSwgWzBdLAorICAgIFtTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcworICAgIHRvIHJ1bnRpbWUgcGF0aCBsaXN0XSkKK19MVF9UQUdERUNMKFtdLCBbbGlua19hbGxfZGVwbGlic10sIFswXSwKKyAgICBbV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFtdLCBbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWRdKQorX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfc3ltYm9sc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbZXhjbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaW5jbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVsaW5rX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBmaW5pc2hpbmcgbGlua2luZyBwcm9ncmFtc10pCitfTFRfVEFHREVDTChbXSwgW2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXNdKQorZG5sIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCitkbmwgX0xUX1RBR0RFQ0woW10sIFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbMV0sCitkbmwgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkIHNhZmUgb2JqZWN0c10pCitdKSMgX0xUX0xJTktFUl9TSExJQlMKKworCisjIF9MVF9MQU5HX0NfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitsdF9zYXZlX0NDPSIkQ0MiCitBQ19MQU5HX1BVU0goQykKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9JworCitfTFRfVEFHX0NPTVBJTEVSCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorICBMVF9TWVNfRExPUEVOX1NFTEYKKyAgX0xUX0NNRF9TVFJJUExJQgorCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbWzQtOV1dKikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKK0FDX0xBTkdfUE9QCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfQ19DT05GSUcKKworCisjIF9MVF9MQU5HX0NYWF9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDKysgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NYWF9DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfTUFOSUZFU1RfVE9PTF0pZG5sCitpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorICBBQ19QUk9HX0NYWENQUAorZWxzZQorICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKK2ZpCisKK0FDX0xBTkdfUFVTSChDKyspCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWNwcAorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgQ1hYIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltbXV0pIHsgcmV0dXJuKDApOyB9JworCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0kQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBsdF9zYXZlX0xEPSRMRAorICBsdF9zYXZlX0dDQz0kR0NDCisgIEdDQz0kR1hYCisgIGx0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCisgIGx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAorICBpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKKyAgZmkKKyAgdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKKyAgQ0M9JHtDWFgtImMrKyJ9CisgIENGTEFHUz0kQ1hYRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICAjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2hlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKKyAgICAjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisgICAgZmkKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisgICAgICBMVF9QQVRIX0xECisKKyAgICAgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAgICAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkcGljX2ZsYWcgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworICAgICAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgICAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCisgICAgICAgIHdsYXJjPScke3dsfScKKworICAgICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwKKwkgICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgICAgd2xhcmM9CisKKyAgICAgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KKyAgICAgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKKyAgICAgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCisgICAgICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgICAgIGZpCisKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKyAgICBlbHNlCisgICAgICBHWFg9bm8KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICB3bGFyYz0KKyAgICBmaQorCisgICAgIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeFtbNS05XV0qKQorCSAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgICAgICBjYXNlICRsZF9mbGFnIGluCisJICAgICAgKi1icnRsKikKKwkgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgICAgICBicmVhaworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgICAgZmkKKworICAgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgoWyQxXSkKKyAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgICBlbHNlCisgICAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisgICAgICAgICAgZWxzZQorCSAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKwkgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorCSAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKKwkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIGVsc2UKKwkgICAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgICAgZmkKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQKKwkgICAgIyBsaWJyYXJpZXMuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgYmVvcyopCisJaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKworICAgICAgY2hvcnVzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICAqKQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKwljYXNlICRHWFgsJGNjX2Jhc2VuYW1lIGluCisJLGNsKiB8IG5vLGNsKikKKwkgICMgTmF0aXZlIE1TVkMKKwkgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKwkgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nQCcKKwkgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJICBsaWJleHQ9bGliCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwkgIHNocmV4dF9jbWRzPSIuZGxsIgorCSAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAkU0VEIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZWxzZQorCSAgICAgICRTRUQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgICBmaX4KKwkgICAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgICBsaW5rbmFtZXM9JworCSAgIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSAgIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCSAgIyBEb24ndCB1c2UgcmFubGliCisJICBfTFRfVEFHVkFSKG9sZF9wb3N0aW5zdGFsbF9jbWRzLCAkMSk9J2NobW9kIDY0NCAkb2xkbGliJworCSAgX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgICAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAgICouZXhlfCouRVhFKSA7OworCSAgICAgICopCisJCWx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkJbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkJOzsKKwkgICAgZXNhY34KKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRsdF9vdXRwdXRmaWxlIn4KKwkgICAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgICBmaScKKwkgIDs7CisJKikKKwkgICMgZysrCisJICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorCSAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisJICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKworCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBlbHNlCisJICAgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgZml+CisJICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKKwk7OworCisgICAgICBkZ3V4KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBlYysrKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QyLiopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUKKwkjIHN3aXRjaCB0byBFTEYKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkLWVsZiopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCisgICAgICAgICMgY29udmVudGlvbnMKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgZ251KikKKyAgICAgICAgOzsKKworICAgICAgaGFpa3UqKQorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGhwdXg5KikKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJICAgICAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJICAgICAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgYUNDKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkRUdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDEwKnxocHV4MTEqKQorICAgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKyAgICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBmaQorICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBhQ0MqKQorCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICBpYTY0KikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgICAgICBocHBhKjY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgaWE2NCopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICAqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgZXNhYworCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaW50ZXJpeFtbMy05XV0qKQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8ICRHUkVQICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworCSAgaWNwYyogfCBlY3BjKiApCisJICAgICMgSW50ZWwgQysrCisJICAgIHdpdGhfZ251X2xkPXllcworCSAgICAjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scworCSAgICAjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAorCSAgICAjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkgICAgICAqIlZlcnNpb24gNy4iKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgICAgKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKKwkgICAgICAgIHRtcF9pZHluPQorCSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkJICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7CisJCWVzYWMKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgZXNhYworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgOzsKKyAgICAgICAgICBwZ0NDKiB8IHBnY3BwKikKKyAgICAgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIGNhc2UgYCRDQyAtVmAgaW4KKwkgICAgKnBnQ0NcIFtbMS01XV0uKiB8ICpwZ2NwcFwgW1sxLTVdXS4qKQorCSAgICAgIF9MVF9UQUdWQVIocHJlbGlua19jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvYmpzICRsaWJvYmpzICRjb21waWxlX2RlcGxpYnN+CisJCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCInCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvbGRvYmpzJG9sZF9kZXBsaWJzfgorCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYH4KKwkJJFJBTkxJQiAkb2xkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICAqKSAjIFZlcnNpb24gNiBhbmQgYWJvdmUgdXNlIHdlYWsgc3ltYm9scworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICAgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKwkgIHhsKiB8IG1waXhsKiB8IGJneGwqKQorCSAgICAjIElCTSBYTCA4LjAgb24gUFBDLCB3aXRoIEdOVSBsZAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCSRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCSAgICBmaQorCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scycKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCisJICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHNvbWV0aGluZyBiYXNlZCBvbgorCSAgICAgICMgJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEKKwkgICAgICAjIHdvdWxkIGJlIGJldHRlci4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZnVuY19lY2hvX2FsbCcKKworCSAgICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBseW54b3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbTg4ayopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbXZzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBjeHgqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCSAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbmV0YnNkKikKKyAgICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworCSAgd2xhcmM9CisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJZmkKKwkjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworCTs7CisKKyAgICAgICpudG8qIHwgKnFueCopCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisJOzsKKworICAgICAgb3BlbmJzZDIqKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG9wZW5ic2QqKQorCWlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisJICBmaQorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAiJGxpYiIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICAgICopIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgZXNhYworCSAgICA7OworICAgICAgICAgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgY3h4KikKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkJOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CisJICAgICAgICAgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJICAgICAgICAgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICAgICAgICAgJFJNICRsaWIuZXhwJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCQk7OworCSAgICBlc2FjCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCIgfCAkR1JFUCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBmdW5jX2VjaG9fYWxsICIkdGVtcGxpc3QiIHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICAgb3NmMyopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkJICA7OworCSAgICAgICAgKikKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgZXNhYworCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgcHNvcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIHN1bm9zNCopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgc29sYXJpcyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqIHwgc3VuQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgICAgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCSAgICAgICopCisJCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuCisJICAgICAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCQlfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdmdW5jX2VjaG9fYWxsJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKworCSAgICAjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgICAgIGlmICRDQyAtLXZlcnNpb24gfCAkR1JFUCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKwkgICAgICBlbHNlCisJICAgICAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICAgICAjIHBsYXRmb3JtLgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGZpCisKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJworCSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkJc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKwkJKikKKwkJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwkJICA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICBDQyopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisJIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKwkjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisJIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisJIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorCSMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorCSMgYXMgLXogZGVmcy4KKwlfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKwlfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworCXJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkb2xkb2Jqc34KKwkgICAgICAnIiRfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKSIKKwkgICAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJHJlbG9hZF9vYmpzfgorCSAgICAgICciJF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKSIKKwkgICAgOzsKKwkgICopCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgOzsKKwllc2FjCisgICAgICA7OworCisgICAgICB0YW5kZW0qKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgdnh3b3JrcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQorICAgIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKKyAgTERDWFg9JExECisgIExEPSRsdF9zYXZlX0xECisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKyAgbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorICBsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKKyAgbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitmaSAjIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfQ1hYX0NPTkZJRworCisKKyMgX0xUX0ZVTkNfU1RSSVBOQU1FX0NORgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZ1bmNfc3RyaXBuYW1lX2NuZiBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCisjCisjIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSAobm9uLVhTSSkgdmVyc2lvbiBvZiBmdW5jX3N0cmlwbmFtZSwKKyMgZXhjZXB0IHRoaXMgb25lIGNhbiBiZSB1c2VkIGJ5IG00IGNvZGUgdGhhdCBtYXkgYmUgZXhlY3V0ZWQgYnkgY29uZmlndXJlLAorIyByYXRoZXIgdGhhbiB0aGUgbGlidG9vbCBzY3JpcHQuCittNF9kZWZ1bihbX0xUX0ZVTkNfU1RSSVBOQU1FX0NORl0sW2RubAorQUNfUkVRVUlSRShbX0xUX0RFQ0xfU0VEXSkKK0FDX1JFUVVJUkUoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSkKK2Z1bmNfc3RyaXBuYW1lX2NuZiAoKQoreworICBjYXNlICR7Mn0gaW4KKyAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJSR7Mn1cJCUlImA7OworICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWVfY25mCitdKSMgX0xUX0ZVTkNfU1RSSVBOQU1FX0NORgorCisjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlndXJlIG91dCAiaGlkZGVuIiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmcm9tIHZlcmJvc2UKKyMgY29tcGlsZXIgb3V0cHV0IHdoZW4gbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorbTRfZGVmdW4oW19MVF9TWVNfSElEREVOX0xJQkRFUFNdLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorQUNfUkVRVUlSRShbX0xUX0ZVTkNfU1RSSVBOQU1FX0NORl0pZG5sCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KK19MVF9UQUdWQVIocHJlZGVwcywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KKworZG5sIHdlIGNhbid0IHVzZSB0aGUgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIGhlcmUsCitkbmwgYmVjYXVzZSBpdCBjb250YWlucyBjb2RlIGludGVuZGVkIGZvciBhbiBleGVjdXRhYmxlLAorZG5sIG5vdCBhIGxpYnJhcnkuICBJdCdzIHBvc3NpYmxlIHdlIHNob3VsZCBsZXQgZWFjaAorZG5sIHRhZyBkZWZpbmUgYSBuZXcgbHRfPz8/P19saW5rX3Rlc3RfY29kZSB2YXJpYWJsZSwKK2RubCBidXQgaXQncyBvbmx5IHVzZWQgaGVyZS4uLgorbTRfaWYoWyQxXSwgW10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgoraW50IGE7Cit2b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQorX0xUX0VPRgorXSwgWyQxXSwgW0NYWF0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorY2xhc3MgRm9vCit7CitwdWJsaWM6CisgIEZvbyAodm9pZCkgeyBhID0gMDsgfQorcHJpdmF0ZToKKyAgaW50IGE7Cit9OworX0xUX0VPRgorXSwgWyQxXSwgW0Y3N10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIqNCBhCisgICAgICBhPTAKKyAgICAgIHJldHVybgorICAgICAgZW5kCitfTFRfRU9GCitdLCBbJDFdLCBbRkNdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtHQ0pdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3B1YmxpYyBjbGFzcyBmb28geworICBwcml2YXRlIGludCBhOworICBwdWJsaWMgdm9pZCBiYXIgKHZvaWQpIHsKKyAgICBhID0gMDsKKyAgfQorfTsKK19MVF9FT0YKK10sIFskMV0sIFtHT10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorcGFja2FnZSBmb28KK2Z1bmMgZm9vKCkgeworfQorX0xUX0VPRgorXSkKKworX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1M9JENGTEFHUworY2FzZSAiJENDICRDRkxBR1MgIiBpbiAjKAorKlwgLWZsdG8qXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby1sdG8iIDs7CisqXCAtZndob3ByKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8td2hvcHIiIDs7CisqXCAtZnVzZS1saW5rZXItcGx1Z2luKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tdXNlLWxpbmtlci1wbHVnaW4iIDs7Citlc2FjCisKK2RubCBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKK2RubCBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHtwcmV2fSR7cH0gaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgIyBFeHBhbmQgdGhlIHN5c3Jvb3QgdG8gZWFzZSBleHRyYWN0aW5nIHRoZSBkaXJlY3RvcmllcyBsYXRlci4KKyAgICAgICBpZiB0ZXN0IC16ICIkcHJldiI7IHRoZW4KKyAgICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWVfY25mICctTCcgJycgIiRwIjsgcHJldj0tTDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLVInICcnICIkcCI7IHByZXY9LVI7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLWwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1sJyAnJyAiJHAiOyBwcmV2PS1sOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBmaQorICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICA9KikgZnVuY19zdHJpcG5hbWVfY25mICc9JyAnJyAiJHAiOyBwPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICR7cHJldn0gaW4KKwkgLUwgfCAtUikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICBwcmV2PQorICAgICAgIDs7CisKKyAgICAqLmx0by4kb2JqZXh0KSA7OyAjIElnbm9yZSBHQ0MgTFRPIG9iamVjdHMKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgJDEgdGVzdCBwcm9ncmFtIgorZmkKKworJFJNIC1mIGNvbmZlc3QuJG9iamV4dAorQ0ZMQUdTPSRfbHRfbGliZGVwc19zYXZlX0NGTEFHUworCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgorbTRfaWYoWyQxXSwgW0NYWF0sCitbY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeFtbMy05XV0qKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPQorICA7OworCitsaW51eCopCisgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorICAqU3VuXCBDKikKKyAgICAjIFN1biBDKysgNS45CisKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyogfCBzdW5DQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCitdKQorCitjYXNlICIgJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSAiIGluCisqIiAtbGMgIiopIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubyA7OworZXNhYworIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9CitpZiB0ZXN0IC1uICIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IjsgdGhlbgorIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9YGVjaG8gIiAke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IiB8ICR7U0VEfSAtZSAncyEgLUwhICFnJyAtZSAncyFeICEhJ2AKK2ZpCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc10sIFsxXSwKKyAgICBbVGhlIGRpcmVjdG9yaWVzIHNlYXJjaGVkIGJ5IHRoaXMgY29tcGlsZXIgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwX29iamVjdHNdLCBbMV0sCisgICAgW0RlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworICAgIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcF9vYmplY3RzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgWzFdLAorICAgIFtUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworICAgIGEgc2hhcmVkIGxpYnJhcnldKQorXSkjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMKKworCisjIF9MVF9MQU5HX0Y3N19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIDc3IGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GNzdfQ09ORklHXSwKK1tBQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKK2lmIHRlc3QgLXogIiRGNzciIHx8IHRlc3QgIlgkRjc3IiA9ICJYbm8iOyB0aGVuCisgIF9sdF9kaXNhYmxlX0Y3Nz15ZXMKK2ZpCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KK2FjX2V4dD1mCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBGNzcgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBDQz0ke0Y3Ny0iZjc3In0KKyAgQ0ZMQUdTPSRGRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorICBHQ0M9JEc3NworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEc3NyIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9IiRsdF9zYXZlX0NDIgorICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKK2ZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfRjc3X0NPTkZJRworCisKKyMgX0xUX0xBTkdfRkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GQ19DT05GSUddLAorW0FDX0xBTkdfUFVTSChGb3J0cmFuKQorCitpZiB0ZXN0IC16ICIkRkMiIHx8IHRlc3QgIlgkRkMiID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRkM9eWVzCitmaQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGZjIHRlc3Qgc291cmNlcy4KK2FjX2V4dD0ke2FjX2ZjX3NyY2V4dC1mfQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZmMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBGQyBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9kaXNhYmxlX0ZDIiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJcCisgICAgICBzdWJyb3V0aW5lIHQKKyAgICAgIHJldHVybgorICAgICAgZW5kCisiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSJcCisgICAgICBwcm9ncmFtIHQKKyAgICAgIGVuZAorIgorCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0iJENDIgorICBsdF9zYXZlX0dDQz0kR0NDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgQ0M9JHtGQy0iZjk1In0KKyAgQ0ZMQUdTPSRGQ0ZMQUdTCisgIGNvbXBpbGVyPSRDQworICBHQ0M9JGFjX2N2X2ZjX2NvbXBpbGVyX2dudQorCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgICAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisJICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworCWZpCisgICAgICAgIDs7CisgICAgZXNhYworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkYWNfY3ZfZmNfY29tcGlsZXJfZ251IgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX1NZU19ISURERU5fTElCREVQUygkMSkKKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBHQ0M9JGx0X3NhdmVfR0NDCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK2ZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0ZDIiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19GQ19DT05GSUcKKworCisjIF9MVF9MQU5HX0dDSl9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIEdOVSBKYXZhIENvbXBpbGVyIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19HQ0pfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtMVF9QUk9HX0dDSl0pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWphdmEKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge30iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J3B1YmxpYyBjbGFzcyBjb25mdGVzdCB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tbXV0gYXJndikge307IH0nCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0kQ0MKK2x0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz15ZXMKK0NDPSR7R0NKLSJnY2oifQorQ0ZMQUdTPSRHQ0pGTEFHUworY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisKK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgoraWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0FDX0xBTkdfUkVTVE9SRQorCitHQ0M9JGx0X3NhdmVfR0NDCitDQz0kbHRfc2F2ZV9DQworQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworXSkjIF9MVF9MQU5HX0dDSl9DT05GSUcKKworCisjIF9MVF9MQU5HX0dPX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgR05VIEdvIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19HT19DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfR09dKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBHbyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Z28KKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEdvIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0icGFja2FnZSBtYWluOyBmdW5jIG1haW4oKSB7IH0iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J3BhY2thZ2UgbWFpbjsgZnVuYyBtYWluKCkgeyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9eWVzCitDQz0ke0dPQy0iZ2NjZ28ifQorQ0ZMQUdTPSRHT0ZMQUdTCitjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIEdvIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorCitBQ19MQU5HX1JFU1RPUkUKKworR0NDPSRsdF9zYXZlX0dDQworQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK10pIyBfTFRfTEFOR19HT19DT05GSUcKKworCisjIF9MVF9MQU5HX1JDX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19SQ19DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfUkNdKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9cmMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfScKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9CitDQz0ke1JDLSJ3aW5kcmVzIn0KK0NGTEFHUz0KK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcworCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIDoKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK0FDX0xBTkdfUkVTVE9SRQorQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK10pIyBfTFRfTEFOR19SQ19DT05GSUcKKworCisjIExUX1BST0dfR0NKCisjIC0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19HQ0pdLAorW200X2lmZGVmKFtBQ19QUk9HX0dDSl0sIFtBQ19QUk9HX0dDSl0sCisgIFttNF9pZmRlZihbQV1bTV9QUk9HX0dDSl0sIFtBXVtNX1BST0dfR0NKXSwKKyAgICBbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwpCisgICAgICB0ZXN0ICJ4JHtHQ0pGTEFHUytzZXR9IiA9IHhzZXQgfHwgR0NKRkxBR1M9Ii1nIC1PMiIKKyAgICAgIEFDX1NVQlNUKEdDSkZMQUdTKV0pXSlbXWRubAorXSkKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX0dDSl0sIFtMVF9QUk9HX0dDSl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfR0NKXSwgW10pCisKKworIyBMVF9QUk9HX0dPCisjIC0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9QUk9HX0dPXSwKK1tBQ19DSEVDS19UT09MKEdPQywgZ2NjZ28sKQorXSkKKworCisjIExUX1BST0dfUkMKKyMgLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfUkNdLAorW0FDX0NIRUNLX1RPT0woUkMsIHdpbmRyZXMsKQorXSkKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1JDXSwgW0xUX1BST0dfUkNdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwgW10pCisKKworIyBfTFRfREVDTF9FR1JFUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3QgZ3JlcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9FR1JFUF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0ZHUkVQXSlkbmwKK3Rlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKK19MVF9ERUNMKFtdLCBbR1JFUF0sIFsxXSwgW0EgZ3JlcCBwcm9ncmFtIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzXSkKK19MVF9ERUNMKFtdLCBbRUdSRVBdLCBbMV0sIFtBbiBFUkUgbWF0Y2hlcl0pCitfTFRfREVDTChbXSwgW0ZHUkVQXSwgWzFdLCBbQSBsaXRlcmFsIHN0cmluZyBtYXRjaGVyXSkKK2RubCBOb24tYmxlZWRpbmctZWRnZSBhdXRvY29uZiBkb2Vzbid0IHN1YnN0IEdSRVAsIHNvIGRvIGl0IGhlcmUgdG9vCitBQ19TVUJTVChbR1JFUF0pCitdKQorCisKKyMgX0xUX0RFQ0xfT0JKRFVNUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3Qgb2JqZHVtcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9PQkpEVU1QXSwKK1tBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzFdLCBbQW4gb2JqZWN0IHN5bWJvbCBkdW1wZXJdKQorQUNfU1VCU1QoW09CSkRVTVBdKQorXSkKKworIyBfTFRfREVDTF9ETExUT09MCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIERMTFRPT0wgdmFyaWFibGUgaXMgc2V0LgorbTRfZGVmdW4oW19MVF9ERUNMX0RMTFRPT0xdLAorW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCitfTFRfREVDTChbXSwgW0RMTFRPT0xdLCBbMV0sIFtETEwgY3JlYXRpb24gcHJvZ3JhbV0pCitBQ19TVUJTVChbRExMVE9PTF0pCitdKQorCisjIF9MVF9ERUNMX1NFRAorIyAtLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KK200X2RlZnVuKFtfTFRfREVDTF9TRURdLAorW0FDX1BST0dfU0VECit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCitfTFRfREVDTChbXSwgW1NFRF0sIFsxXSwgW0Egc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorX0xUX0RFQ0woW10sIFtYc2VkXSwgWyJcJFNFRCAtZSAxcy9eWC8vIl0sCisgICAgW1NlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uXSkKK10pIyBfTFRfREVDTF9TRUQKKworbTRfaWZuZGVmKFtBQ19QUk9HX1NFRF0sIFsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbTRfZGVmdW4oW0FDX1BST0dfU0VEXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9TRUQsCitbIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCisjIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCitdKQorU0VEPSRsdF9jdl9wYXRoX1NFRAorQUNfU1VCU1QoW1NFRF0pCitBQ19NU0dfUkVTVUxUKFskU0VEXSkKK10pI0FDX1BST0dfU0VECitdKSNtNF9pZm5kZWYKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1NFRF0sIFtBQ19QUk9HX1NFRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSwgW10pCisKKworIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgb3V0IHdoZXRoZXIgdGhlIHNoZWxsIGlzIEJvdXJuZSBvciBYU0kgY29tcGF0aWJsZSwKKyMgb3IgaGFzIHNvbWUgb3RoZXIgdXNlZnVsIGZlYXR1cmVzLgorbTRfZGVmdW4oW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzXSkKKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK0FDX01TR19SRVNVTFQoWyR4c2lfc2hlbGxdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW3hzaV9zaGVsbD0nJHhzaV9zaGVsbCddKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICIrPSJdKQorbHRfc2hlbGxfYXBwZW5kPW5vCisoIGZvbz1iYXI7IHNldCBmb28gYmF6OyBldmFsICIkWzFdKz1cJFsyXSIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworQUNfTVNHX1JFU1VMVChbJGx0X3NoZWxsX2FwcGVuZF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbbHRfc2hlbGxfYXBwZW5kPSckbHRfc2hlbGxfYXBwZW5kJ10pCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKK19MVF9ERUNMKFtdLCBbbHRfdW5zZXRdLCBbMF0sIFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiXSlkbmwKKworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJworICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIGx0X1NQMk5MPSd0ciBcMTAwIFxuJworICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKK19MVF9ERUNMKFtTUDJOTF0sIFtsdF9TUDJOTF0sIFsxXSwgW3R1cm4gc3BhY2VzIGludG8gbmV3bGluZXNdKWRubAorX0xUX0RFQ0woW05MMlNQXSwgW2x0X05MMlNQXSwgWzFdLCBbdHVybiBuZXdsaW5lcyBpbnRvIHNwYWNlc10pZG5sCitdKSMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCisKKworIyBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFIChGVU5DTkFNRSwgUkVQTEFDRU1FTlQtQk9EWSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluIGAkY2ZnZmlsZScsIGxvb2sgZm9yIGZ1bmN0aW9uIEZVTkNOQU1FIGRlbGltaXRlZCBieSBgXkZVTkNOQU1FICgpJCcgYW5kCisjICdefSBGVU5DTkFNRSAnLCBhbmQgcmVwbGFjZSBpdHMgYm9keSB3aXRoIFJFUExBQ0VNRU5ULUJPRFkuCittNF9kZWZ1bihbX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRV0sCitbZG5sIHsKK3NlZCAtZSAnL14kMSAoKSQvLC9efSAjICQxIC9jXAorJDEgKClcCit7XAorbTRfYnBhdHN1YnN0cyhbJDJdLCBbJF0sIFtcXF0sIFteXChbCSBdXCldLCBbXFxcMV0pCit9ICMgRXh0ZW5kZWQtc2hlbGwgJDEgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK10pCisKKworIyBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVwbGFjZSBleGlzdGluZyBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2V2ZXJhbCBzaGVsbCBmdW5jdGlvbnMgd2l0aAorIyBlcXVpdmFsZW50IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aG9zZSBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLi4KK200X2RlZnVuKFtfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TXSwKK1tpZiB0ZXN0IHgiJHhzaV9zaGVsbCIgPSB4eWVzOyB0aGVuCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfZGlybmFtZV0sIFtkbmwKKyAgICBjYXNlICR7MX0gaW4KKyAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19iYXNlbmFtZV0sIFtkbmwKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lXSwgW2RubAorICAgIGNhc2UgJHsxfSBpbgorICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgICBlc2FjCisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zdHJpcG5hbWVdLCBbZG5sCisgICAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQorICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC4KKyAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfQorICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9CisgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfc3BsaXRfbG9uZ19vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lPSR7MSUlPSp9CisgICAgZnVuY19zcGxpdF9sb25nX29wdF9hcmc9JHsxIyo9fV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zcGxpdF9zaG9ydF9vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPSR7MSM/P30KKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2xvMm9dLCBbZG5sCisgICAgY2FzZSAkezF9IGluCisgICAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OworICAgICAgKikgICAgZnVuY19sbzJvX3Jlc3VsdD0kezF9IDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY194Zm9ybV0sIFsgICAgZnVuY194Zm9ybV9yZXN1bHQ9JHsxJS4qfS5sb10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcml0aF0sIFsgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICRbKl0gKSldKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfbGVuXSwgWyAgICBmdW5jX2xlbl9yZXN1bHQ9JHsjMX1dKQorZmkKKworaWYgdGVzdCB4IiRsdF9zaGVsbF9hcHBlbmQiID0geHllczsgdGhlbgorICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FwcGVuZF0sIFsgICAgZXZhbCAiJHsxfSs9XFwkezJ9Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcHBlbmRfcXVvdGVkXSwgW2RubAorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR7Mn0iCitkbmwgbTQgZXhwYW5zaW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHRoZW4gdGhlIHNoZWxsIGV2YWwgdHVybnMgdGhhdCBpbnRvIFwKKyAgICBldmFsICIkezF9Kz1cXFxcIFxcJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0Il0pCisKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIHdoZXJlIHBvc3NpYmxlIGJ5IGRpcmVjdCB1c2Ugb2YgJys9JworICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbW2EtekEtWl9dXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW1thLXpBLVpfXV1cezEsXH1cKSAiJVwxPSIkXDElZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2ZpCisKK2lmIHRlc3QgeCIkX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbCIgPSB4IjoiOyB0aGVuCisgIEFDX01TR19XQVJOKFtVbmFibGUgdG8gc3Vic3RpdHV0ZSBleHRlbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gJG9maWxlXSkKK2ZpCitdKQorCisjIF9MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERldGVybWluZSB3aGljaCBmaWxlIG5hbWUgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgYnkKKyMgZnVuY190b19ob3N0X2ZpbGUgKGFuZCwgaW1wbGljaXRseSwgYnkgZnVuY190b19ob3N0X3BhdGgpLiAgVGhlc2UgYXJlIG5lZWRlZAorIyBmb3IgY2VydGFpbiBjcm9zcy1jb21waWxlIGNvbmZpZ3VyYXRpb25zIGFuZCBuYXRpdmUgbWluZ3cuCittNF9kZWZ1bihbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfdG9faG9zdF9maWxlX2NtZCwKK1tjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKK10pCit0b19ob3N0X2ZpbGVfY21kPSRsdF9jdl90b19ob3N0X2ZpbGVfY21kCitBQ19NU0dfUkVTVUxUKFskbHRfY3ZfdG9faG9zdF9maWxlX2NtZF0pCitfTFRfREVDTChbdG9faG9zdF9maWxlX2NtZF0sIFtsdF9jdl90b19ob3N0X2ZpbGVfY21kXSwKKyAgICAgICAgIFswXSwgW2NvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0XSlkbmwKKworQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl90b190b29sX2ZpbGVfY21kLAorWyNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCitdKQordG9fdG9vbF9maWxlX2NtZD0kbHRfY3ZfdG9fdG9vbF9maWxlX2NtZAorQUNfTVNHX1JFU1VMVChbJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWRdKQorX0xUX0RFQ0woW3RvX3Rvb2xfZmlsZV9jbWRdLCBbbHRfY3ZfdG9fdG9vbF9maWxlX2NtZF0sCisgICAgICAgICBbMF0sIFtjb252ZXJ0ICRidWlsZCBmaWxlcyB0byB0b29sY2hhaW4gZm9ybWF0XSlkbmwKK10pIyBfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tNC9sdG9wdGlvbnMubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2x0b3B0aW9ucy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDlhY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tNC9sdG9wdGlvbnMubTQKQEAgLTAsMCArMSwzODQgQEAKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNyBsdG9wdGlvbnMubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworCisjIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAorW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisKKyMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQorIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQorIyBzYXZlZCBhcyBhIGZsYWcuCittNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCittNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCitdKQorCisKKyMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK200X2RlZmluZShbX0xUX0lGX09QVElPTl0sCitbbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKKworCisjIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCisjIGFyZSBzZXQuCittNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCitbbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisJICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKKwkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAorbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCitdKVtdZG5sCitdKQorCisKKyMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKKyMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKKyMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0CisjIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KK200X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAorWyMgU2V0IG9wdGlvbnMKK200X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAorICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCisKK200X2lmKFskMV0sW0xUX0lOSVRdLFsKKyAgZG5sCisgIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAorICBkbmwgc3BlY2lmaWVkOgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KKyAgXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCisgIF0pCisgIGRubAorICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgorICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgorICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAorICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAorICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCisgIF0pCitdKSMgX0xUX1NFVF9PUFRJT05TCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWNyb3MgdG8gaGFuZGxlIExUX0lOSVQgb3B0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAorW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCisKKworIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAorXSkjIExUX09QVElPTl9ERUZJTkUKKworCisjIGRsb3BlbgorIyAtLS0tLS0KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCitdKQorCitBVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCisKKworIyB3aW4zMi1kbGwKKyMgLS0tLS0tLS0tCisjIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKK1tlbmFibGVfd2luMzJfZGxsPXllcworCitjYXNlICRob3N0IGluCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotY2VnY2MqKQorICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCisgIDs7Citlc2FjCisKK3Rlc3QgLXogIiRBUyIgJiYgQVM9YXMKK19MVF9ERUNMKFtdLCBbQVNdLCAgICAgIFsxXSwgW0Fzc2VtYmxlciBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzFdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKWRubAorCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtPYmplY3QgZHVtcGVyIHByb2dyYW1dKWRubAorXSkjIHdpbjMyLWRsbAorCitBVV9ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgd2luMzItZGxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW10pCisKKworIyBfTFRfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZywgYW5kIHN1cHBvcnRzIHRoZSBgc2hhcmVkJyBhbmQKKyMgYGRpc2FibGUtc2hhcmVkJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3NoYXJlZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc2hhcmVkPV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQorCisgICAgX0xUX0RFQ0woW2J1aWxkX2xpYnRvb2xfbGlic10sIFtlbmFibGVfc2hhcmVkXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NIQVJFRAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3NoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc2hhcmVkXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX1NUQVRJQyhbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBzdGF0aWMnIGFuZAorIyBgZGlzYWJsZS1zdGF0aWMnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ10sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY0A8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3N0YXRpYz1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9vbGRfbGlic10sIFtlbmFibGVfc3RhdGljXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NUQVRJQworCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3N0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc3RhdGljXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NUQVRJQ10sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBmYXN0LWluc3RhbGwnCisjIGFuZCBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbZmFzdC1pbnN0YWxsXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkBdLAorICAgIFtvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX2Zhc3RfaW5zdGFsbD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKKworX0xUX0RFQ0woW2Zhc3RfaW5zdGFsbF0sIFtlbmFibGVfZmFzdF9pbnN0YWxsXSwgWzBdLAorCSBbV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uXSlkbmwKK10pIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQVVfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBmYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK0FVX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Cit0aGUgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKKworCisjIF9MVF9XSVRIX1BJQyhbTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS13aXRoLXBpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHBpYy1vbmx5JyBhbmQgYG5vLXBpYycKKyMgTFRfSU5JVCBvcHRpb25zLgorIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgorbTRfZGVmaW5lKFtfTFRfV0lUSF9QSUNdLAorW0FDX0FSR19XSVRIKFtwaWNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBpY0A8OkA9UEtHU0A6PkBdLAorCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCisgICAgW2x0X3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkd2l0aHZhbCBpbgorICAgIHllc3xubykgcGljX21vZGU9JHdpdGh2YWwgOzsKKyAgICAqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgbHRfcGtnIGluICR3aXRodmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkbHRfcGtnIiA9ICJYJGx0X3AiOyB0aGVuCisJICBwaWNfbW9kZT15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtwaWNfbW9kZT1kZWZhdWx0XSkKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1tNF9kZWZhdWx0KFskMV0sIFtkZWZhdWx0XSkKKworX0xUX0RFQ0woW10sIFtwaWNfbW9kZV0sIFswXSwgW1doYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkXSlkbmwKK10pIyBfTFRfV0lUSF9QSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtwaWMtb25seV0sIFtfTFRfV0lUSF9QSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbbm8tcGljXSwgW19MVF9XSVRIX1BJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWU6CitBVV9ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtwaWMtb25seV0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgcGljLW9ubHknIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwgW10pCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBMVERMX0lOSVQgT3B0aW9ucyAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbbm9ucmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbbm9ucmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3JlY3Vyc2l2ZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3JlY3Vyc2l2ZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtzdWJwcm9qZWN0XSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbc3VicHJvamVjdF0pXSkKKworbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbaW5zdGFsbGFibGVdLAorCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtpbnN0YWxsYWJsZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtjb252ZW5pZW5jZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2NvbnZlbmllbmNlXSldKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tNC9sdHN1Z2FyLm00IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tNC9sdHN1Z2FyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDBhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2x0c3VnYXIubTQKQEAgLTAsMCArMSwxMjMgQEAKKyMgbHRzdWdhci5tNCAtLSBsaWJ0b29sIG00IGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgIC0qLUF1dG9jb25mLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA2IGx0c3VnYXIubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVFNVR0FSX1ZFUlNJT05dLCBbbTRfaWYoWzAuMV0pXSkKKworCisjIGx0X2pvaW4oU0VQLCBBUkcxLCBbQVJHMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgQVJHMVNFUEFSRzIuLi5TRVBBUkduLCBvbWl0dGluZyBbXSBhcmd1bWVudHMgYW5kIHRoZWlyCisjIGFzc29jaWF0ZWQgc2VwYXJhdG9yLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfam9pbiBmcm9tIEF1dG9jb25mIDIuNjIsIHNpbmNlIGFsbCBlYXJsaWVyCisjIHZlcnNpb25zIGluIG00c3VnYXIgaGFkIGJ1Z3MuCittNF9kZWZpbmUoW2x0X2pvaW5dLAorW200X2lmKFskI10sIFsxXSwgW10sCisgICAgICAgWyQjXSwgWzJdLCBbWyQyXV0sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMl1fXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKK200X2RlZmluZShbX2x0X2pvaW5dLAorW200X2lmKFskIyQyXSwgWzJdLCBbXSwKKyAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQxJDJdXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKKworCisjIGx0X2NhcihMSVNUKQorIyBsdF9jZHIoTElTVCkKKyMgLS0tLS0tLS0tLS0tCisjIE1hbmlwdWxhdGUgbTQgbGlzdHMuCisjIFRoZXNlIG1hY3JvcyBhcmUgbmVjZXNzYXJ5IGFzIGxvbmcgYXMgd2lsbCBzdGlsbCBuZWVkIHRvIHN1cHBvcnQKKyMgQXV0b2NvbmYtMi41OSB3aGljaCBxdW90ZXMgZGlmZmVyZW50bHkuCittNF9kZWZpbmUoW2x0X2Nhcl0sIFtbJDFdXSkKK200X2RlZmluZShbbHRfY2RyXSwKK1ttNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzXSldLAorICAgICAgIFskI10sIDEsIFtdLAorICAgICAgIFttNF9kcXVvdGUobTRfc2hpZnQoJEApKV0pXSkKK200X2RlZmluZShbbHRfdW5xdW90ZV0sICQxKQorCisKKyMgbHRfYXBwZW5kKE1BQ1JPLU5BTUUsIFNUUklORywgW1NFUEFSQVRPUl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWRlZmluZSBNQUNSTy1OQU1FIHRvIGhvbGQgaXRzIGZvcm1lciBjb250ZW50IHBsdXMgYFNFUEFSQVRPUidgU1RSSU5HJy4KKyMgTm90ZSB0aGF0IG5laXRoZXIgU0VQQVJBVE9SIG5vciBTVFJJTkcgYXJlIGV4cGFuZGVkOyB0aGV5IGFyZSBhcHBlbmRlZAorIyB0byBNQUNSTy1OQU1FIGFzIGlzIChsZWF2aW5nIHRoZSBleHBhbnNpb24gZm9yIHdoZW4gTUFDUk8tTkFNRSBpcyBpbnZva2VkKS4KKyMgTm8gU0VQQVJBVE9SIGlzIG91dHB1dCBpZiBNQUNSTy1OQU1FIHdhcyBwcmV2aW91c2x5IHVuZGVmaW5lZCAoZGlmZmVyZW50CisjIHRoYW4gZGVmaW5lZCBhbmQgZW1wdHkpLgorIworIyBUaGlzIG1hY3JvIGlzIG5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBBdXRvY29uZiAyLjYyLCBzaW5jZSBlYXJsaWVyCisjIHZlcnNpb25zIG9mIG00c3VnYXIgbWlzdGFrZW5seSBleHBhbmRlZCBTRVBBUkFUT1IgYnV0IG5vdCBTVFJJTkcuCittNF9kZWZpbmUoW2x0X2FwcGVuZF0sCitbbTRfZGVmaW5lKFskMV0sCisJICAgbTRfaWZkZWYoWyQxXSwgW200X2RlZm4oWyQxXSlbJDNdXSlbJDJdKV0pCisKKworCisjIGx0X2NvbWJpbmUoU0VQLCBQUkVGSVgtTElTVCwgSU5GSVgsIFNVRkZJWDEsIFtTVUZGSVgyLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIGEgU0VQIGRlbGltaXRlZCBsaXN0IG9mIGFsbCBwYWlyZWQgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIG9mCisjIFBSRUZJWC1MSVNUIHdpdGggU1VGRklYMSB0aHJvdWdoIFNVRkZJWG4uICBFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QKKyMgaGFzIHRoZSBmb3JtIFBSRUZJWG1JTkZJWFNVRkZJWG4uCisjIE5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBtNF9jb21iaW5lIGFkZGVkIGluIEF1dG9jb25mIDIuNjIuCittNF9kZWZpbmUoW2x0X2NvbWJpbmVdLAorW200X2lmKG00X2V2YWwoWyQjID4gM10pLCBbMV0sCisgICAgICAgW200X3B1c2hkZWYoW19MdF9zZXBdLCBbbTRfZGVmaW5lKFtfTHRfc2VwXSwgbTRfZGVmbihbbHRfY2FyXSkpXSldXWRubAorW1ttNF9mb3JlYWNoKFtfTHRfcHJlZml4XSwgWyQyXSwKKwkgICAgIFttNF9mb3JlYWNoKFtfTHRfc3VmZml4XSwKKwkJXW00X2RxdW90ZShtNF9kcXVvdGUobTRfc2hpZnQobTRfc2hpZnQobTRfc2hpZnQoJEApKSkpKVssCisJW19MdF9zZXAoWyQxXSlbXW00X2RlZm4oW19MdF9wcmVmaXhdKVskM11tNF9kZWZuKFtfTHRfc3VmZml4XSldKV0pXSldKQorCisKKyMgbHRfaWZfYXBwZW5kX3VuaXEoTUFDUk8tTkFNRSwgVkFSTkFNRSwgW1NFUEFSQVRPUl0sIFtVTklRXSwgW05PVC1VTklRXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWZmIE1BQ1JPLU5BTUUgZG9lcyBub3QgeWV0IGNvbnRhaW4gVkFSTkFNRSwgdGhlbiBhcHBlbmQgaXQgKGRlbGltaXRlZAorIyBieSBTRVBBUkFUT1IgaWYgc3VwcGxpZWQpIGFuZCBleHBhbmQgVU5JUSwgZWxzZSBOT1QtVU5JUS4KK200X2RlZmluZShbbHRfaWZfYXBwZW5kX3VuaXFdLAorW200X2lmZGVmKFskMV0sCisJICBbbTRfaWYobTRfaW5kZXgoWyQzXW00X2RlZm4oWyQxXSlbJDNdLCBbJDMkMiQzXSksIFstMV0sCisJCSBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdLAorCQkgWyQ1XSldLAorCSAgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSldKQorCisKKyMgbHRfZGljdF9hZGQoRElDVCwgS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRdLAorW200X2RlZmluZShbJDEoJDIpXSwgWyQzXSldKQorCisKKyMgbHRfZGljdF9hZGRfc3Via2V5KERJQ1QsIEtFWSwgU1VCS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRfc3Via2V5XSwKK1ttNF9kZWZpbmUoWyQxKCQyOiQzKV0sIFskNF0pXSkKKworCisjIGx0X2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZldGNoXSwKK1ttNF9pZnZhbChbJDNdLAorCW00X2lmZGVmKFskMSgkMjokMyldLCBbbTRfZGVmbihbJDEoJDI6JDMpXSldKSwKKyAgICBtNF9pZmRlZihbJDEoJDIpXSwgW200X2RlZm4oWyQxKCQyKV0pXSkpXSkKKworCisjIGx0X2lmX2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSwgVkFMVUUsIElGLVRSVUUsIFtJRi1GQUxTRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2lmX2RpY3RfZmV0Y2hdLAorW200X2lmKGx0X2RpY3RfZmV0Y2goWyQxXSwgWyQyXSwgWyQzXSksIFskNF0sCisJWyQ1XSwKKyAgICBbJDZdKV0pCisKKworIyBsdF9kaWN0X2ZpbHRlcihESUNULCBbU1VCS0VZXSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBLRVksIFsuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZpbHRlcl0sCitbbTRfaWYoWyQ1XSwgW10sIFtdLAorICBbbHRfam9pbihtNF9xdW90ZShtNF9kZWZhdWx0KFskNF0sIFtbLCBdXSkpLAorICAgICAgICAgICBsdF91bnF1b3RlKG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9mb3JlYWNoKF9MdF9rZXksIGx0X2NhcihbbTRfc2hpZnRuKDQsICRAKV0pLAorCQkgICAgICBbbHRfaWZfZGljdF9mZXRjaChbJDFdLCBfTHRfa2V5LCBbJDJdLCBbJDNdLCBbX0x0X2tleSBdKV0pKSkpKV0pW11kbmwKK10pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2x0dmVyc2lvbi5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbTQvbHR2ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTg2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2x0dmVyc2lvbi5tNApAQCAtMCwwICsxLDIzIEBACisjIGx0dmVyc2lvbi5tNCAtLSB2ZXJzaW9uIG51bWJlcnMJCQktKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNAorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBzZXJpYWwgMzMzNyBsdHZlcnNpb24ubTQKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wKKworbTRfZGVmaW5lKFtMVF9QQUNLQUdFX1ZFUlNJT05dLCBbMi40LjJdKQorbTRfZGVmaW5lKFtMVF9QQUNLQUdFX1JFVklTSU9OXSwgWzEuMzMzN10pCisKK0FDX0RFRlVOKFtMVFZFUlNJT05fVkVSU0lPTl0sCitbbWFjcm9fdmVyc2lvbj0nMi40LjInCittYWNyb19yZXZpc2lvbj0nMS4zMzM3JworX0xUX0RFQ0woLCBtYWNyb192ZXJzaW9uLCAwLCBbV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkP10pCitfTFRfREVDTCgsIG1hY3JvX3JldmlzaW9uLCAwKQorXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbTQvbHR+b2Jzb2xldGUubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2x0fm9ic29sZXRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzNkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL200L2x0fm9ic29sZXRlLm00CkBAIC0wLDAgKzEsOTggQEAKKyMgbHR+b2Jzb2xldGUubTQgLS0gYWNsb2NhbCBzYXRpc2Z5aW5nIG9ic29sZXRlIGRlZmluaXRpb25zLiAgICAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQsIDIwMDQuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNSBsdH5vYnNvbGV0ZS5tNAorCisjIFRoZXNlIGV4aXN0IGVudGlyZWx5IHRvIGZvb2wgYWNsb2NhbCB3aGVuIGJvb3RzdHJhcHBpbmcgbGlidG9vbC4KKyMKKyMgSW4gdGhlIHBhc3QgbGlidG9vbC5tNCBoYXMgcHJvdmlkZWQgbWFjcm9zIHZpYSBBQ19ERUZVTiAob3IgQVVfREVGVU4pCisjIHdoaWNoIGhhdmUgbGF0ZXIgYmVlbiBjaGFuZ2VkIHRvIG00X2RlZmluZSBhcyB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZQorIyBleHBvcnRlZCBBUEksIG9yIG1vdmVkIHRvIEF1dG9jb25mIG9yIEF1dG9tYWtlIHdoZXJlIHRoZXkgYmVsb25nLgorIworIyBUaGUgdHJvdWJsZSBpcywgYWNsb2NhbCBpcyBhIGJpdCB0aGljay4gIEl0J2xsIHNlZSB0aGUgb2xkIEFDX0RFRlVOCisjIGluIC91c3Ivc2hhcmUvYWNsb2NhbC9saWJ0b29sLm00IGFuZCByZW1lbWJlciBpdCwgdGhlbiB3aGVuIGl0IHNlZXMgdXMKKyMgdXNpbmcgYSBtYWNybyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gb3VyIGxvY2FsIG00L2xpYnRvb2wubTQgaXQnbGwKKyMgcHVsbCB0aGUgb2xkIGxpYnRvb2wubTQgaW4gKGl0IGRvZXNuJ3Qgc2VlIG91ciBzaGlueSBuZXcgbTRfZGVmaW5lCisjIGFuZCBkb2Vzbid0IGtub3cgYWJvdXQgQXV0b2NvbmYgbWFjcm9zIGF0IGFsbC4pCisjCisjIFNvIHdlIHByb3ZpZGUgdGhpcyBmaWxlLCB3aGljaCBoYXMgYSBzaWxseSBmaWxlbmFtZSBzbyBpdCdzIGFsd2F5cworIyBpbmNsdWRlZCBhZnRlciBldmVyeXRoaW5nIGVsc2UuICBUaGlzIHByb3ZpZGVzIGFjbG9jYWwgd2l0aCB0aGUKKyMgQUNfREVGVU5zIGl0IHdhbnRzLCBidXQgd2hlbiBtNCBwcm9jZXNzZXMgaXQsIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcKKyMgYmVjYXVzZSB0aG9zZSBtYWNyb3MgYWxyZWFkeSBleGlzdCwgb3Igd2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlci4KKyMgV2UgdXNlIEFDX0RFRlVOIG92ZXIgQVVfREVGVU4gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhY2xvY2FsLTEuNi4gCisjCisjIEFueXRpbWUgd2Ugd2l0aGRyYXcgYW4gQUNfREVGVU4gb3IgQVVfREVGVU4sIHJlbWVtYmVyIHRvIGFkZCBpdCBoZXJlLgorIyBZZXMsIHRoYXQgbWVhbnMgZXZlcnkgbmFtZSBvbmNlIHRha2VuIHdpbGwgbmVlZCB0byByZW1haW4gaGVyZSB1bnRpbAorIyB3ZSBnaXZlIHVwIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBiZWZvcmUgMS43LCBhdCB3aGljaCBwb2ludAorIyB3ZSBuZWVkIHRvIGtlZXAgb25seSB0aG9zZSBuYW1lcyB3aGljaCB3ZSBzdGlsbCByZWZlciB0by4KKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9CU09MRVRFX1ZFUlNJT05dLCBbbTRfaWYoWzFdKV0pCisKK200X2lmbmRlZihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dKV0pCittNF9pZm5kZWYoW0FDX1BST0dfRUdSRVBdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0VHUkVQXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCVtBQ19ERUZVTihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdKV0pCittNF9pZm5kZWYoW19MVF9BQ19TSEVMTF9JTklUXSwJCVtBQ19ERUZVTihbX0xUX0FDX1NIRUxMX0lOSVRdKV0pCittNF9pZm5kZWYoW19MVF9BQ19TWVNfTElCUEFUSF9BSVhdLAlbQUNfREVGVU4oW19MVF9BQ19TWVNfTElCUEFUSF9BSVhdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0xUTUFJTl0sCQlbQUNfREVGVU4oW19MVF9QUk9HX0xUTUFJTl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RBR1ZBUl0sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdWQVJdKV0pCittNF9pZm5kZWYoW0FDX0xURExfRU5BQkxFX0lOU1RBTExdLAlbQUNfREVGVU4oW0FDX0xURExfRU5BQkxFX0lOU1RBTExdKV0pCittNF9pZm5kZWYoW0FDX0xURExfUFJFT1BFTl0sCQlbQUNfREVGVU4oW0FDX0xURExfUFJFT1BFTl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NZU19DT01QSUxFUl0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19DT01QSUxFUl0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xPQ0tdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTE9DS10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX09MRF9BUkNISVZFXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSwJW0FDX0RFRlVOKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9PQkpESVJdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX09CSkRJUl0pXSkKK200X2lmbmRlZihbQUNfTFRETF9PQkpESVJdLAkJW0FDX0RFRlVOKFtBQ19MVERMX09CSkRJUl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0pXSkKK200X2lmbmRlZihbQUNfUEFUSF9NQUdJQ10sCQlbQUNfREVGVU4oW0FDX1BBVEhfTUFHSUNdKV0pCittNF9pZm5kZWYoW0FDX1BST0dfTERfR05VXSwJCVtBQ19ERUZVTihbQUNfUFJPR19MRF9HTlVdKV0pCittNF9pZm5kZWYoW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddLAlbQUNfREVGVU4oW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddKV0pCittNF9pZm5kZWYoW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSwJW0FDX0RFRlVOKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0pXSkKK200X2lmbmRlZihbTFRfQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0xUX0FDX1BST0dfRUdSRVBdKV0pCittNF9pZm5kZWYoW0xUX0FDX1BST0dfU0VEXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19TRURdKV0pCittNF9pZm5kZWYoW19MVF9DQ19CQVNFTkFNRV0sCQlbQUNfREVGVU4oW19MVF9DQ19CQVNFTkFNRV0pXSkKK200X2lmbmRlZihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwJW0FDX0RFRlVOKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdKV0pCittNF9pZm5kZWYoW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdKV0pCittNF9pZm5kZWYoW19BQ19QUk9HX0xJQlRPT0xdLAkJW0FDX0RFRlVOKFtfQUNfUFJPR19MSUJUT09MXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NFVFVQXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TRVRVUF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0NIRUNLX0RMRkNOXSwJCVtBQ19ERUZVTihbX0xUX0FDX0NIRUNLX0RMRkNOXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdKV0pCittNF9pZm5kZWYoW19MVF9BQ19UQUdDT05GSUddLAkJW0FDX0RFRlVOKFtfTFRfQUNfVEFHQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NYWF0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfRjc3XSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3XSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19HQ0pdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0NPTkZJR10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfRklMRV9MVERMTF9DXSwJW0FDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSldKQorbTRfaWZuZGVmKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10sCVtBQ19ERUZVTihbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdKV0pCittNF9pZm5kZWYoW19MVF9BQ19QUk9HX0NYWENQUF0sCQlbQUNfREVGVU4oW19MVF9BQ19QUk9HX0NYWENQUF0pXSkKK200X2lmbmRlZihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdLAlbQUNfREVGVU4oW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCVtBQ19ERUZVTihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9QUk9HX0Y3N10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfRkNdLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19GQ10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfQ1hYXSldKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tYWtlL01ha2VmaWxlIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tYWtlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzc0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21ha2UvTWFrZWZpbGUKQEAgLTAsMCArMSw4MiBAQAorIyBBIHNhbXBsZSBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QgYW5kIHVzaW5nIGl0IGluIHVzZXIKKyMgdGVzdHMuICBQbGVhc2UgdHdlYWsgaXQgdG8gc3VpdCB5b3VyIGVudmlyb25tZW50IGFuZCBwcm9qZWN0LiAgWW91CisjIG1heSB3YW50IHRvIG1vdmUgaXQgdG8geW91ciBwcm9qZWN0J3Mgcm9vdCBkaXJlY3RvcnkuCisjCisjIFNZTk9QU0lTOgorIworIyAgIG1ha2UgW2FsbF0gIC0gbWFrZXMgZXZlcnl0aGluZy4KKyMgICBtYWtlIFRBUkdFVCAtIG1ha2VzIHRoZSBnaXZlbiB0YXJnZXQuCisjICAgbWFrZSBjbGVhbiAgLSByZW1vdmVzIGFsbCBmaWxlcyBnZW5lcmF0ZWQgYnkgbWFrZS4KKworIyBQbGVhc2UgdHdlYWsgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBkZWZpbml0aW9ucyBhcyBuZWVkZWQgYnkgeW91cgorIyBwcm9qZWN0LCBleGNlcHQgR1RFU1RfSEVBREVSUywgd2hpY2ggeW91IGNhbiB1c2UgaW4geW91ciBvd24gdGFyZ2V0cworIyBidXQgc2hvdWxkbid0IG1vZGlmeS4KKworIyBQb2ludHMgdG8gdGhlIHJvb3Qgb2YgR29vZ2xlIFRlc3QsIHJlbGF0aXZlIHRvIHdoZXJlIHRoaXMgZmlsZSBpcy4KKyMgUmVtZW1iZXIgdG8gdHdlYWsgdGhpcyBpZiB5b3UgbW92ZSB0aGlzIGZpbGUuCitHVEVTVF9ESVIgPSAuLgorCisjIFdoZXJlIHRvIGZpbmQgdXNlciBjb2RlLgorVVNFUl9ESVIgPSAuLi9zYW1wbGVzCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBwcmVwcm9jZXNzb3IuCisjIFNldCBHb29nbGUgVGVzdCdzIGhlYWRlciBkaXJlY3RvcnkgYXMgYSBzeXN0ZW0gZGlyZWN0b3J5LCBzdWNoIHRoYXQKKyMgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgZ2VuZXJhdGUgd2FybmluZ3MgaW4gR29vZ2xlIFRlc3QgaGVhZGVycy4KK0NQUEZMQUdTICs9IC1pc3lzdGVtICQoR1RFU1RfRElSKS9pbmNsdWRlCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBDKysgY29tcGlsZXIuCitDWFhGTEFHUyArPSAtZyAtV2FsbCAtV2V4dHJhIC1wdGhyZWFkCisKKyMgQWxsIHRlc3RzIHByb2R1Y2VkIGJ5IHRoaXMgTWFrZWZpbGUuICBSZW1lbWJlciB0byBhZGQgbmV3IHRlc3RzIHlvdQorIyBjcmVhdGVkIHRvIHRoZSBsaXN0LgorVEVTVFMgPSBzYW1wbGUxX3VuaXR0ZXN0CisKKyMgQWxsIEdvb2dsZSBUZXN0IGhlYWRlcnMuICBVc3VhbGx5IHlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoaXMKKyMgZGVmaW5pdGlvbi4KK0dURVNUX0hFQURFUlMgPSAkKEdURVNUX0RJUikvaW5jbHVkZS9ndGVzdC8qLmggXAorICAgICAgICAgICAgICAgICQoR1RFU1RfRElSKS9pbmNsdWRlL2d0ZXN0L2ludGVybmFsLyouaAorCisjIEhvdXNlLWtlZXBpbmcgYnVpbGQgdGFyZ2V0cy4KKworYWxsIDogJChURVNUUykKKworY2xlYW4gOgorCXJtIC1mICQoVEVTVFMpIGd0ZXN0LmEgZ3Rlc3RfbWFpbi5hICoubworCisjIEJ1aWxkcyBndGVzdC5hIGFuZCBndGVzdF9tYWluLmEuCisKKyMgVXN1YWxseSB5b3Ugc2hvdWxkbid0IHR3ZWFrIHN1Y2ggaW50ZXJuYWwgdmFyaWFibGVzLCBpbmRpY2F0ZWQgYnkgYQorIyB0cmFpbGluZyBfLgorR1RFU1RfU1JDU18gPSAkKEdURVNUX0RJUikvc3JjLyouY2MgJChHVEVTVF9ESVIpL3NyYy8qLmggJChHVEVTVF9IRUFERVJTKQorCisjIEZvciBzaW1wbGljaXR5IGFuZCB0byBhdm9pZCBkZXBlbmRpbmcgb24gR29vZ2xlIFRlc3QncworIyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCB0aGUgZGVwZW5kZW5jaWVzIHNwZWNpZmllZCBiZWxvdyBhcmUKKyMgY29uc2VydmF0aXZlIGFuZCBub3Qgb3B0aW1pemVkLiAgVGhpcyBpcyBmaW5lIGFzIEdvb2dsZSBUZXN0CisjIGNvbXBpbGVzIGZhc3QgYW5kIGZvciBvcmRpbmFyeSB1c2VycyBpdHMgc291cmNlIHJhcmVseSBjaGFuZ2VzLgorZ3Rlc3QtYWxsLm8gOiAkKEdURVNUX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAkKENYWEZMQUdTKSAtYyBcCisgICAgICAgICAgICAkKEdURVNUX0RJUikvc3JjL2d0ZXN0LWFsbC5jYworCitndGVzdF9tYWluLm8gOiAkKEdURVNUX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAkKENYWEZMQUdTKSAtYyBcCisgICAgICAgICAgICAkKEdURVNUX0RJUikvc3JjL2d0ZXN0X21haW4uY2MKKworZ3Rlc3QuYSA6IGd0ZXN0LWFsbC5vCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitndGVzdF9tYWluLmEgOiBndGVzdC1hbGwubyBndGVzdF9tYWluLm8KKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKKyMgQnVpbGRzIGEgc2FtcGxlIHRlc3QuICBBIHRlc3Qgc2hvdWxkIGxpbmsgd2l0aCBlaXRoZXIgZ3Rlc3QuYSBvcgorIyBndGVzdF9tYWluLmEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGRlZmluZXMgaXRzIG93biBtYWluKCkKKyMgZnVuY3Rpb24uCisKK3NhbXBsZTEubyA6ICQoVVNFUl9ESVIpL3NhbXBsZTEuY2MgJChVU0VSX0RJUikvc2FtcGxlMS5oICQoR1RFU1RfSEVBREVSUykKKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChVU0VSX0RJUikvc2FtcGxlMS5jYworCitzYW1wbGUxX3VuaXR0ZXN0Lm8gOiAkKFVTRVJfRElSKS9zYW1wbGUxX3VuaXR0ZXN0LmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICQoVVNFUl9ESVIpL3NhbXBsZTEuaCAkKEdURVNUX0hFQURFUlMpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoVVNFUl9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MKKworc2FtcGxlMV91bml0dGVzdCA6IHNhbXBsZTEubyBzYW1wbGUxX3VuaXR0ZXN0Lm8gZ3Rlc3RfbWFpbi5hCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1scHRocmVhZCAkXiAtbyAkQApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0LW1kLnNsbiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdC1tZC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc5MDhkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdC1tZC5zbG4KQEAgLTAsMCArMSw0NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOC4wMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3QtbWQiLCAiZ3Rlc3QtbWQudmNwcm9qIiwgIntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfbWFpbi1tZCIsICJndGVzdF9tYWluLW1kLnZjcHJvaiIsICJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3Byb2RfdGVzdC1tZCIsICJndGVzdF9wcm9kX3Rlc3QtbWQudmNwcm9qIiwgInsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfdW5pdHRlc3QtbWQiLCAiZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIiwgIns0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvbikgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWcgPSBEZWJ1Zw0KKwkJUmVsZWFzZSA9IFJlbGVhc2UNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU4fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUEyfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlBZGRJbnMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3QtbWQudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0LW1kLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzM1YzNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0LW1kIg0KKwlQcm9qZWN0R1VJRD0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdGQubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iJnF1b3Q7Li5caW5jbHVkZSZxdW90OzsmcXVvdDsuLiZxdW90OyI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfTElCIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3QubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0LWFsbC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3Quc2xuIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjRiMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0LnNsbgpAQCAtMCwwICsxLDQ1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwDQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdCIsICJndGVzdC52Y3Byb2oiLCAie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdF9tYWluIiwgImd0ZXN0X21haW4udmNwcm9qIiwgInszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfdW5pdHRlc3QiLCAiZ3Rlc3RfdW5pdHRlc3QudmNwcm9qIiwgIns0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfcHJvZF90ZXN0IiwgImd0ZXN0X3Byb2RfdGVzdC52Y3Byb2oiLCAiezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1ZyA9IERlYnVnDQorCQlSZWxlYXNlID0gUmVsZWFzZQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUFkZElucykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdC52Y3Byb2ogYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3QudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4MzczY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3QudmNwcm9qCkBAIC0wLDAgKzEsMTI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3QiDQorCVByb2plY3RHVUlEPSJ7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0xJQiINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0ZC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSImcXVvdDsuLlxpbmNsdWRlJnF1b3Q7OyZxdW90Oy4uJnF1b3Q7Ij4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19MSUIiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ3Rlc3QtYWxsLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNTM3OWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qCkBAIC0wLDAgKzEsMTI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3RfbWFpbi1tZCINCisJUHJvamVjdEdVSUQ9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfTElCIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvJChQcm9qZWN0TmFtZSlkLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiZxdW90Oy4uXGluY2x1ZGUmcXVvdDs7JnF1b3Q7Li4mcXVvdDsiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQorCQkJTmFtZT0iZ3Rlc3QtbWQiLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0X21haW4udmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0X21haW4udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4Yjc2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfbWFpbi52Y3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF9tYWluIg0KKwlQcm9qZWN0R1VJRD0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKWQubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iJnF1b3Q7Li5caW5jbHVkZSZxdW90OzsmcXVvdDsuLiZxdW90OyI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfTElCIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJCTxQcm9qZWN0UmVmZXJlbmNlDQorCQkJUmVmZXJlbmNlZFByb2plY3RJZGVudGlmaWVyPSJ7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fSINCisJCQlOYW1lPSJndGVzdCIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ3Rlc3RfbWFpbi5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdF9wcm9kX3Rlc3QtbWQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YjA1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDE2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3Byb2RfdGVzdC1tZCINCisJUHJvamVjdEdVSUQ9InsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbi1tZCIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3Byb2RfdGVzdC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfcHJvZF90ZXN0LnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkN2EyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfcHJvZF90ZXN0LnZjcHJvagpAQCAtMCwwICsxLDE2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3Byb2RfdGVzdCINCisJUHJvamVjdEdVSUQ9InsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbiIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3Byb2RfdGVzdC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGE1ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDE0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3VuaXR0ZXN0LW1kIg0KKwlQcm9qZWN0R1VJRD0iezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJCTxQcm9qZWN0UmVmZXJlbmNlDQorCQkJUmVmZXJlbmNlZFByb2plY3RJZGVudGlmaWVyPSJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCisJCQlOYW1lPSJndGVzdF9tYWluLW1kIi8+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RcZ3Rlc3RfdW5pdHRlc3QuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjEiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvbXN2Yy9ndGVzdF91bml0dGVzdC52Y3Byb2ogYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiMWY1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL21zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qCkBAIC0wLDAgKzEsMTQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3RfdW5pdHRlc3QiDQorCVByb2plY3RHVUlEPSJ7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwkJPFByb2plY3RSZWZlcmVuY2UNCisJCQlSZWZlcmVuY2VkUHJvamVjdElkZW50aWZpZXI9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9Ig0KKwkJCU5hbWU9Imd0ZXN0X21haW4iLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxndGVzdF91bml0dGVzdC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMSINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3ByaW1lX3RhYmxlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3ByaW1lX3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2UxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvcHJpbWVfdGFibGVzLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBwcm92aWRlcyBpbnRlcmZhY2UgUHJpbWVUYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIG51bWJlciBpcyBhCisvLyBwcmltZSBhbmQgZGV0ZXJtaW5lcyBhIG5leHQgcHJpbWUgbnVtYmVyLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkCisvLyBpbiBHb29nbGUgVGVzdCBzYW1wbGVzIGRlbW9uc3RyYXRpbmcgdXNlIG9mIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKyNpZm5kZWYgR1RFU1RfU0FNUExFU19QUklNRV9UQUJMRVNfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19QUklNRV9UQUJMRVNfSF8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLy8gVGhlIHByaW1lIHRhYmxlIGludGVyZmFjZS4KK2NsYXNzIFByaW1lVGFibGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UHJpbWVUYWJsZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBuIGlzIGEgcHJpbWUgbnVtYmVyLgorICB2aXJ0dWFsIGJvb2wgSXNQcmltZShpbnQgbikgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdGhlIHNtYWxsZXN0IHByaW1lIG51bWJlciBncmVhdGVyIHRoYW4gcDsgb3IgcmV0dXJucyAtMQorICAvLyBpZiB0aGUgbmV4dCBwcmltZSBpcyBiZXlvbmQgdGhlIGNhcGFjaXR5IG9mIHRoZSB0YWJsZS4KKyAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCA9IDA7Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiAjMSBjYWxjdWxhdGVzIHRoZSBwcmltZXMgb24tdGhlLWZseS4KK2NsYXNzIE9uVGhlRmx5UHJpbWVUYWJsZSA6IHB1YmxpYyBQcmltZVRhYmxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCB7CisgICAgaWYgKG4gPD0gMSkgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDI7IGkqaSA8PSBuOyBpKyspIHsKKyAgICAgIC8vIG4gaXMgZGl2aXNpYmxlIGJ5IGFuIGludGVnZXIgb3RoZXIgdGhhbiAxIGFuZCBpdHNlbGYuCisgICAgICBpZiAoKG4gJSBpKSA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2aXJ0dWFsIGludCBHZXROZXh0UHJpbWUoaW50IHApIGNvbnN0IHsKKyAgICBmb3IgKGludCBuID0gcCArIDE7IG4gPiAwOyBuKyspIHsKKyAgICAgIGlmIChJc1ByaW1lKG4pKSByZXR1cm4gbjsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7CisgIH0KK307CisKKy8vIEltcGxlbWVudGF0aW9uICMyIHByZS1jYWxjdWxhdGVzIHRoZSBwcmltZXMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0CisvLyBpbiBhbiBhcnJheS4KK2NsYXNzIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlIDogcHVibGljIFByaW1lVGFibGUgeworIHB1YmxpYzoKKyAgLy8gJ21heCcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciB0aGUgcHJpbWUgdGFibGUgaG9sZHMuCisgIGV4cGxpY2l0IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKGludCBtYXgpCisgICAgICA6IGlzX3ByaW1lX3NpemVfKG1heCArIDEpLCBpc19wcmltZV8obmV3IGJvb2xbbWF4ICsgMV0pIHsKKyAgICBDYWxjdWxhdGVQcmltZXNVcFRvKG1heCk7CisgIH0KKyAgdmlydHVhbCB+UHJlQ2FsY3VsYXRlZFByaW1lVGFibGUoKSB7IGRlbGV0ZVtdIGlzX3ByaW1lXzsgfQorCisgIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCB7CisgICAgcmV0dXJuIDAgPD0gbiAmJiBuIDwgaXNfcHJpbWVfc2l6ZV8gJiYgaXNfcHJpbWVfW25dOworICB9CisKKyAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCB7CisgICAgZm9yIChpbnQgbiA9IHAgKyAxOyBuIDwgaXNfcHJpbWVfc2l6ZV87IG4rKykgeworICAgICAgaWYgKGlzX3ByaW1lX1tuXSkgcmV0dXJuIG47CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIENhbGN1bGF0ZVByaW1lc1VwVG8oaW50IG1heCkgeworICAgIDo6c3RkOjpmaWxsKGlzX3ByaW1lXywgaXNfcHJpbWVfICsgaXNfcHJpbWVfc2l6ZV8sIHRydWUpOworICAgIGlzX3ByaW1lX1swXSA9IGlzX3ByaW1lX1sxXSA9IGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbWF4OyBpKyspIHsKKyAgICAgIGlmICghaXNfcHJpbWVfW2ldKSBjb250aW51ZTsKKworICAgICAgLy8gTWFya3MgYWxsIG11bHRpcGxlcyBvZiBpIChleGNlcHQgaSBpdHNlbGYpIGFzIG5vbi1wcmltZS4KKyAgICAgIGZvciAoaW50IGogPSAyKmk7IGogPD0gbWF4OyBqICs9IGkpIHsKKyAgICAgICAgaXNfcHJpbWVfW2pdID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgY29uc3QgaW50IGlzX3ByaW1lX3NpemVfOworICBib29sKiBjb25zdCBpc19wcmltZV87CisKKyAgLy8gRGlzYWJsZXMgY29tcGlsZXIgd2FybmluZyAiYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLiIKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUmIHJocyk7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfUFJJTUVfVEFCTEVTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUxLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzFlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMS5jYwpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgInNhbXBsZTEuaCIKKworLy8gUmV0dXJucyBuISAodGhlIGZhY3RvcmlhbCBvZiBuKS4gIEZvciBuZWdhdGl2ZSBuLCBuISBpcyBkZWZpbmVkIHRvIGJlIDEuCitpbnQgRmFjdG9yaWFsKGludCBuKSB7CisgIGludCByZXN1bHQgPSAxOworICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKKyAgICByZXN1bHQgKj0gaTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgbiBpcyBhIHByaW1lIG51bWJlci4KK2Jvb2wgSXNQcmltZShpbnQgbikgeworICAvLyBUcml2aWFsIGNhc2UgMTogc21hbGwgbnVtYmVycworICBpZiAobiA8PSAxKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gVHJpdmlhbCBjYXNlIDI6IGV2ZW4gbnVtYmVycworICBpZiAobiAlIDIgPT0gMCkgcmV0dXJuIG4gPT0gMjsKKworICAvLyBOb3csIHdlIGhhdmUgdGhhdCBuIGlzIG9kZCBhbmQgbiA+PSAzLgorCisgIC8vIFRyeSB0byBkaXZpZGUgbiBieSBldmVyeSBvZGQgbnVtYmVyIGksIHN0YXJ0aW5nIGZyb20gMworICBmb3IgKGludCBpID0gMzsgOyBpICs9IDIpIHsKKyAgICAvLyBXZSBvbmx5IGhhdmUgdG8gdHJ5IGkgdXAgdG8gdGhlIHNxdXJlIHJvb3Qgb2YgbgorICAgIGlmIChpID4gbi9pKSBicmVhazsKKworICAgIC8vIE5vdywgd2UgaGF2ZSBpIDw9IG4vaSA8IG4uCisgICAgLy8gSWYgbiBpcyBkaXZpc2libGUgYnkgaSwgbiBpcyBub3QgcHJpbWUuCisgICAgaWYgKG4gJSBpID09IDApIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIG4gaGFzIG5vIGludGVnZXIgZmFjdG9yIGluIHRoZSByYW5nZSAoMSwgbiksIGFuZCB0aHVzIGlzIHByaW1lLgorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUxLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZmViOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFMV9IXworI2RlZmluZSBHVEVTVF9TQU1QTEVTX1NBTVBMRTFfSF8KKworLy8gUmV0dXJucyBuISAodGhlIGZhY3RvcmlhbCBvZiBuKS4gIEZvciBuZWdhdGl2ZSBuLCBuISBpcyBkZWZpbmVkIHRvIGJlIDEuCitpbnQgRmFjdG9yaWFsKGludCBuKTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBuIGlzIGEgcHJpbWUgbnVtYmVyLgorYm9vbCBJc1ByaW1lKGludCBuKTsKKworI2VuZGlmICAvLyBHVEVTVF9TQU1QTEVTX1NBTVBMRTFfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDUxY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHVzZSBHb29nbGUgVGVzdCBsaXN0ZW5lciBBUEkgdG8gaW1wbGVtZW50CisvLyBhIHByaW1pdGl2ZSBsZWFrIGNoZWNrZXIuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdENhc2U7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwordXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKKworbmFtZXNwYWNlIHsKKworLy8gV2Ugd2lsbCB0cmFjayBtZW1vcnkgdXNlZCBieSB0aGlzIGNsYXNzLgorY2xhc3MgV2F0ZXIgeworIHB1YmxpYzoKKyAgLy8gTm9ybWFsIFdhdGVyIGRlY2xhcmF0aW9ucyBnbyBoZXJlLgorCisgIC8vIG9wZXJhdG9yIG5ldyBhbmQgb3BlcmF0b3IgZGVsZXRlIGhlbHAgdXMgY29udHJvbCB3YXRlciBhbGxvY2F0aW9uLgorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IGFsbG9jYXRpb25fc2l6ZSkgeworICAgIGFsbG9jYXRlZF8rKzsKKyAgICByZXR1cm4gbWFsbG9jKGFsbG9jYXRpb25fc2l6ZSk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBibG9jaywgc2l6ZV90IC8qIGFsbG9jYXRpb25fc2l6ZSAqLykgeworICAgIGFsbG9jYXRlZF8tLTsKKyAgICBmcmVlKGJsb2NrKTsKKyAgfQorCisgIHN0YXRpYyBpbnQgYWxsb2NhdGVkKCkgeyByZXR1cm4gYWxsb2NhdGVkXzsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBhbGxvY2F0ZWRfOworfTsKKworaW50IFdhdGVyOjphbGxvY2F0ZWRfID0gMDsKKworLy8gVGhpcyBldmVudCBsaXN0ZW5lciBtb25pdG9ycyBob3cgbWFueSBXYXRlciBvYmplY3RzIGFyZSBjcmVhdGVkIGFuZAorLy8gZGVzdHJveWVkIGJ5IGVhY2ggdGVzdCwgYW5kIHJlcG9ydHMgYSBmYWlsdXJlIGlmIGEgdGVzdCBsZWFrcyBzb21lIFdhdGVyCisvLyBvYmplY3RzLiBJdCBkb2VzIHRoaXMgYnkgY29tcGFyaW5nIHRoZSBudW1iZXIgb2YgbGl2ZSBXYXRlciBvYmplY3RzIGF0CisvLyB0aGUgYmVnaW5uaW5nIG9mIGEgdGVzdCBhbmQgYXQgdGhlIGVuZCBvZiBhIHRlc3QuCitjbGFzcyBMZWFrQ2hlY2tlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwcml2YXRlOgorICAvLyBDYWxsZWQgYmVmb3JlIGEgdGVzdCBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyogdGVzdF9pbmZvICovKSB7CisgICAgaW5pdGlhbGx5X2FsbG9jYXRlZF8gPSBXYXRlcjo6YWxsb2NhdGVkKCk7CisgIH0KKworICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qIHRlc3RfaW5mbyAqLykgeworICAgIGludCBkaWZmZXJlbmNlID0gV2F0ZXI6OmFsbG9jYXRlZCgpIC0gaW5pdGlhbGx5X2FsbG9jYXRlZF87CisKKyAgICAvLyBZb3UgY2FuIGdlbmVyYXRlIGEgZmFpbHVyZSBpbiBhbnkgZXZlbnQgaGFuZGxlciBleGNlcHQKKyAgICAvLyBPblRlc3RQYXJ0UmVzdWx0LiBKdXN0IHVzZSBhbiBhcHByb3ByaWF0ZSBHb29nbGUgVGVzdCBhc3NlcnRpb24gdG8gZG8KKyAgICAvLyBpdC4KKyAgICBFWFBFQ1RfTEUoZGlmZmVyZW5jZSwgMCkgPDwgIkxlYWtlZCAiIDw8IGRpZmZlcmVuY2UgPDwgIiB1bml0KHMpIG9mIFdhdGVyISI7CisgIH0KKworICBpbnQgaW5pdGlhbGx5X2FsbG9jYXRlZF87Cit9OworCitURVNUKExpc3RlbmVyc1Rlc3QsIERvZXNOb3RMZWFrKSB7CisgIFdhdGVyKiB3YXRlciA9IG5ldyBXYXRlcjsKKyAgZGVsZXRlIHdhdGVyOworfQorCisvLyBUaGlzIHNob3VsZCBmYWlsIHdoZW4gdGhlIC0tY2hlY2tfZm9yX2xlYWtzIGNvbW1hbmQgbGluZSBmbGFnIGlzCisvLyBzcGVjaWZpZWQuCitURVNUKExpc3RlbmVyc1Rlc3QsIExlYWtzV2F0ZXIpIHsKKyAgV2F0ZXIqIHdhdGVyID0gbmV3IFdhdGVyOworICBFWFBFQ1RfVFJVRSh3YXRlciAhPSBOVUxMKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgYm9vbCBjaGVja19mb3JfbGVha3MgPSBmYWxzZTsKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLS1jaGVja19mb3JfbGVha3MiKSA9PSAwICkKKyAgICBjaGVja19mb3JfbGVha3MgPSB0cnVlOworICBlbHNlCisgICAgcHJpbnRmKCIlc1xuIiwgIlJ1biB0aGlzIHByb2dyYW0gd2l0aCAtLWNoZWNrX2Zvcl9sZWFrcyB0byBlbmFibGUgIgorICAgICAgICAgICAiY3VzdG9tIGxlYWsgY2hlY2tpbmcgaW4gdGhlIHRlc3RzLiIpOworCisgIC8vIElmIHdlIGFyZSBnaXZlbiB0aGUgLS1jaGVja19mb3JfbGVha3MgY29tbWFuZCBsaW5lIGZsYWcsIGluc3RhbGxzIHRoZQorICAvLyBsZWFrIGNoZWNrZXIuCisgIGlmIChjaGVja19mb3JfbGVha3MpIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKKworICAgIC8vIEFkZHMgdGhlIGxlYWsgY2hlY2tlciB0byB0aGUgZW5kIG9mIHRoZSB0ZXN0IGV2ZW50IGxpc3RlbmVyIGxpc3QsCisgICAgLy8gYWZ0ZXIgdGhlIGRlZmF1bHQgdGV4dCBvdXRwdXQgcHJpbnRlciBhbmQgdGhlIGRlZmF1bHQgWE1MIHJlcG9ydAorICAgIC8vIGdlbmVyYXRvci4KKyAgICAvLworICAgIC8vIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQgLSBpdCBlbnN1cmVzIHRoYXQgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZQorICAgIC8vIGxlYWsgY2hlY2tlcidzIE9uVGVzdEVuZCgpIG1ldGhvZCBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSB0ZXh0IGFuZCBYTUwKKyAgICAvLyBwcmludGVycyAqYmVmb3JlKiB0aGVpciBPblRlc3RFbmQoKSBtZXRob2RzIGFyZSBjYWxsZWQsIHN1Y2ggdGhhdAorICAgIC8vIHRoZXkgYXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHJpZ2h0IHRlc3QuIFJlbWVtYmVyIHRoYXQgYSBsaXN0ZW5lcgorICAgIC8vIHJlY2VpdmVzIGFuIE9uWHl6U3RhcnQgZXZlbnQgKmFmdGVyKiBsaXN0ZW5lcnMgcHJlY2VkaW5nIGl0IGluIHRoZQorICAgIC8vIGxpc3QgcmVjZWl2ZWQgdGhhdCBldmVudCwgYW5kIHJlY2VpdmVzIGFuIE9uWHl6RW5kIGV2ZW50ICpiZWZvcmUqCisgICAgLy8gbGlzdGVuZXJzIHByZWNlZGluZyBpdC4KKyAgICAvLworICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZGVsZXRpbmcgdGhlIG5ldyBsaXN0ZW5lciBsYXRlciwgYXMKKyAgICAvLyBHb29nbGUgVGVzdCB3aWxsIGRvIGl0LgorICAgIGxpc3RlbmVycy5BcHBlbmQobmV3IExlYWtDaGVja2VyKTsKKyAgfQorICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZjNGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB3cml0ZSBhIHNpbXBsZSB1bml0IHRlc3QgZm9yIGEgZnVuY3Rpb24sCisvLyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIFdyaXRpbmcgYSB1bml0IHRlc3QgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yayBpcyBlYXN5IGFzIDEtMi0zOgorCisKKy8vIFN0ZXAgMS4gSW5jbHVkZSBuZWNlc3NhcnkgaGVhZGVyIGZpbGVzIHN1Y2ggdGhhdCB0aGUgc3R1ZmYgeW91cgorLy8gdGVzdCBsb2dpYyBuZWVkcyBpcyBkZWNsYXJlZC4KKy8vCisvLyBEb24ndCBmb3JnZXQgZ3Rlc3QuaCwgd2hpY2ggZGVjbGFyZXMgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAic2FtcGxlMS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKworLy8gU3RlcCAyLiBVc2UgdGhlIFRFU1QgbWFjcm8gdG8gZGVmaW5lIHlvdXIgdGVzdHMuCisvLworLy8gVEVTVCBoYXMgdHdvIHBhcmFtZXRlcnM6IHRoZSB0ZXN0IGNhc2UgbmFtZSBhbmQgdGhlIHRlc3QgbmFtZS4KKy8vIEFmdGVyIHVzaW5nIHRoZSBtYWNybywgeW91IHNob3VsZCBkZWZpbmUgeW91ciB0ZXN0IGxvZ2ljIGJldHdlZW4gYQorLy8gcGFpciBvZiBicmFjZXMuICBZb3UgY2FuIHVzZSBhIGJ1bmNoIG9mIG1hY3JvcyB0byBpbmRpY2F0ZSB0aGUKKy8vIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBhIHRlc3QuICBFWFBFQ1RfVFJVRSBhbmQgRVhQRUNUX0VRIGFyZQorLy8gZXhhbXBsZXMgb2Ygc3VjaCBtYWNyb3MuICBGb3IgYSBjb21wbGV0ZSBsaXN0LCBzZWUgZ3Rlc3QuaC4KKy8vCisvLyA8VGVjaG5pY2FsRGV0YWlscz4KKy8vCisvLyBJbiBHb29nbGUgVGVzdCwgdGVzdHMgYXJlIGdyb3VwZWQgaW50byB0ZXN0IGNhc2VzLiAgVGhpcyBpcyBob3cgd2UKKy8vIGtlZXAgdGVzdCBjb2RlIG9yZ2FuaXplZC4gIFlvdSBzaG91bGQgcHV0IGxvZ2ljYWxseSByZWxhdGVkIHRlc3RzCisvLyBpbnRvIHRoZSBzYW1lIHRlc3QgY2FzZS4KKy8vCisvLyBUaGUgdGVzdCBjYXNlIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUgc2hvdWxkIGJvdGggYmUgdmFsaWQgQysrCisvLyBpZGVudGlmaWVycy4gIEFuZCB5b3Ugc2hvdWxkIG5vdCB1c2UgdW5kZXJzY29yZSAoXykgaW4gdGhlIG5hbWVzLgorLy8KKy8vIEdvb2dsZSBUZXN0IGd1YXJhbnRlZXMgdGhhdCBlYWNoIHRlc3QgeW91IGRlZmluZSBpcyBydW4gZXhhY3RseQorLy8gb25jZSwgYnV0IGl0IG1ha2VzIG5vIGd1YXJhbnRlZSBvbiB0aGUgb3JkZXIgdGhlIHRlc3RzIGFyZQorLy8gZXhlY3V0ZWQuICBUaGVyZWZvcmUsIHlvdSBzaG91bGQgd3JpdGUgeW91ciB0ZXN0cyBpbiBzdWNoIGEgd2F5CisvLyB0aGF0IHRoZWlyIHJlc3VsdHMgZG9uJ3QgZGVwZW5kIG9uIHRoZWlyIG9yZGVyLgorLy8KKy8vIDwvVGVjaG5pY2FsRGV0YWlscz4KKworCisvLyBUZXN0cyBGYWN0b3JpYWwoKS4KKworLy8gVGVzdHMgZmFjdG9yaWFsIG9mIG5lZ2F0aXZlIG51bWJlcnMuCitURVNUKEZhY3RvcmlhbFRlc3QsIE5lZ2F0aXZlKSB7CisgIC8vIFRoaXMgdGVzdCBpcyBuYW1lZCAiTmVnYXRpdmUiLCBhbmQgYmVsb25ncyB0byB0aGUgIkZhY3RvcmlhbFRlc3QiCisgIC8vIHRlc3QgY2FzZS4KKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgtNSkpOworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKC0xKSk7CisgIEVYUEVDVF9HVChGYWN0b3JpYWwoLTEwKSwgMCk7CisKKyAgLy8gPFRlY2huaWNhbERldGFpbHM+CisgIC8vCisgIC8vIEVYUEVDVF9FUShleHBlY3RlZCwgYWN0dWFsKSBpcyB0aGUgc2FtZSBhcworICAvLworICAvLyAgIEVYUEVDVF9UUlVFKChleHBlY3RlZCkgPT0gKGFjdHVhbCkpCisgIC8vCisgIC8vIGV4Y2VwdCB0aGF0IGl0IHdpbGwgcHJpbnQgYm90aCB0aGUgZXhwZWN0ZWQgdmFsdWUgYW5kIHRoZSBhY3R1YWwKKyAgLy8gdmFsdWUgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiAgVGhpcyBpcyB2ZXJ5IGhlbHBmdWwgZm9yCisgIC8vIGRlYnVnZ2luZy4gIFRoZXJlZm9yZSBpbiB0aGlzIGNhc2UgRVhQRUNUX0VRIGlzIHByZWZlcnJlZC4KKyAgLy8KKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIEVYUEVDVF9UUlVFIGFjY2VwdHMgYW55IEJvb2xlYW4gZXhwcmVzc2lvbiwKKyAgLy8gYW5kIGlzIHRodXMgbW9yZSBnZW5lcmFsLgorICAvLworICAvLyA8L1RlY2huaWNhbERldGFpbHM+Cit9CisKKy8vIFRlc3RzIGZhY3RvcmlhbCBvZiAwLgorVEVTVChGYWN0b3JpYWxUZXN0LCBaZXJvKSB7CisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMCkpOworfQorCisvLyBUZXN0cyBmYWN0b3JpYWwgb2YgcG9zaXRpdmUgbnVtYmVycy4KK1RFU1QoRmFjdG9yaWFsVGVzdCwgUG9zaXRpdmUpIHsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgxKSk7CisgIEVYUEVDVF9FUSgyLCBGYWN0b3JpYWwoMikpOworICBFWFBFQ1RfRVEoNiwgRmFjdG9yaWFsKDMpKTsKKyAgRVhQRUNUX0VRKDQwMzIwLCBGYWN0b3JpYWwoOCkpOworfQorCisKKy8vIFRlc3RzIElzUHJpbWUoKQorCisvLyBUZXN0cyBuZWdhdGl2ZSBpbnB1dC4KK1RFU1QoSXNQcmltZVRlc3QsIE5lZ2F0aXZlKSB7CisgIC8vIFRoaXMgdGVzdCBiZWxvbmdzIHRvIHRoZSBJc1ByaW1lVGVzdCB0ZXN0IGNhc2UuCisKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoLTEpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoLTIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoSU5UX01JTikpOworfQorCisvLyBUZXN0cyBzb21lIHRyaXZpYWwgY2FzZXMuCitURVNUKElzUHJpbWVUZXN0LCBUcml2aWFsKSB7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoMSkpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSgzKSk7Cit9CisKKy8vIFRlc3RzIHBvc2l0aXZlIGlucHV0LgorVEVTVChJc1ByaW1lVGVzdCwgUG9zaXRpdmUpIHsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoNCkpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDUpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoNikpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDIzKSk7Cit9CisKKy8vIFN0ZXAgMy4gQ2FsbCBSVU5fQUxMX1RFU1RTKCkgaW4gbWFpbigpLgorLy8KKy8vIFdlIGRvIHRoaXMgYnkgbGlua2luZyBpbiBzcmMvZ3Rlc3RfbWFpbi5jYyBmaWxlLCB3aGljaCBjb25zaXN0cyBvZgorLy8gYSBtYWluKCkgZnVuY3Rpb24gd2hpY2ggY2FsbHMgUlVOX0FMTF9URVNUUygpIGZvciB1cy4KKy8vCisvLyBUaGlzIHJ1bnMgYWxsIHRoZSB0ZXN0cyB5b3UndmUgZGVmaW5lZCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAorLy8gcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgorLy8KKy8vIERpZCB5b3Ugbm90aWNlIHRoYXQgd2UgZGlkbid0IHJlZ2lzdGVyIHRoZSB0ZXN0cz8gIFRoZQorLy8gUlVOX0FMTF9URVNUUygpIG1hY3JvIG1hZ2ljYWxseSBrbm93cyBhYm91dCBhbGwgdGhlIHRlc3RzIHdlCisvLyBkZWZpbmVkLiAgSXNuJ3QgdGhpcyBjb252ZW5pZW50PwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTIuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjc2M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTIuY2MKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJzYW1wbGUyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuCitjb25zdCBjaGFyKiBNeVN0cmluZzo6Q2xvbmVDU3RyaW5nKGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpIHsKKyAgaWYgKGFfY19zdHJpbmcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbihhX2Nfc3RyaW5nKTsKKyAgY2hhciogY29uc3QgY2xvbmUgPSBuZXcgY2hhclsgbGVuICsgMSBdOworICBtZW1jcHkoY2xvbmUsIGFfY19zdHJpbmcsIGxlbiArIDEpOworCisgIHJldHVybiBjbG9uZTsKK30KKworLy8gU2V0cyB0aGUgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoaXMgTXlTdHJpbmcgb2JqZWN0CisvLyByZXByZXNlbnRzLgordm9pZCBNeVN0cmluZzo6U2V0KGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpIHsKKyAgLy8gTWFrZXMgc3VyZSB0aGlzIHdvcmtzIHdoZW4gY19zdHJpbmcgPT0gY19zdHJpbmdfCisgIGNvbnN0IGNoYXIqIGNvbnN0IHRlbXAgPSBNeVN0cmluZzo6Q2xvbmVDU3RyaW5nKGFfY19zdHJpbmcpOworICBkZWxldGVbXSBjX3N0cmluZ187CisgIGNfc3RyaW5nXyA9IHRlbXA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMi5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ4NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTIuaApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1NBTVBMRTJfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEUyX0hfCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvLyBBIHNpbXBsZSBzdHJpbmcgY2xhc3MuCitjbGFzcyBNeVN0cmluZyB7CisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogY19zdHJpbmdfOworICBjb25zdCBNeVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IE15U3RyaW5nJiByaHMpOworCisgcHVibGljOgorICAvLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIENsb25lQ1N0cmluZyhjb25zdCBjaGFyKiBhX2Nfc3RyaW5nKTsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8KKyAgLy8gQyd0b3JzCisKKyAgLy8gVGhlIGRlZmF1bHQgYyd0b3IgY29uc3RydWN0cyBhIE5VTEwgc3RyaW5nLgorICBNeVN0cmluZygpIDogY19zdHJpbmdfKE5VTEwpIHt9CisKKyAgLy8gQ29uc3RydWN0cyBhIE15U3RyaW5nIGJ5IGNsb25pbmcgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcuCisgIGV4cGxpY2l0IE15U3RyaW5nKGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpIDogY19zdHJpbmdfKE5VTEwpIHsKKyAgICBTZXQoYV9jX3N0cmluZyk7CisgIH0KKworICAvLyBDb3B5IGMndG9yCisgIE15U3RyaW5nKGNvbnN0IE15U3RyaW5nJiBzdHJpbmcpIDogY19zdHJpbmdfKE5VTEwpIHsKKyAgICBTZXQoc3RyaW5nLmNfc3RyaW5nXyk7CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8KKyAgLy8gRCd0b3IuICBNeVN0cmluZyBpcyBpbnRlbmRlZCB0byBiZSBhIGZpbmFsIGNsYXNzLCBzbyB0aGUgZCd0b3IKKyAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHZpcnR1YWwuCisgIH5NeVN0cmluZygpIHsgZGVsZXRlW10gY19zdHJpbmdfOyB9CisKKyAgLy8gR2V0cyB0aGUgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoaXMgTXlTdHJpbmcgb2JqZWN0IHJlcHJlc2VudHMuCisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gY19zdHJpbmdfOyB9CisKKyAgc2l6ZV90IExlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY19zdHJpbmdfID09IE5VTEwgPyAwIDogc3RybGVuKGNfc3RyaW5nXyk7CisgIH0KKworICAvLyBTZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBNeVN0cmluZyBvYmplY3QgcmVwcmVzZW50cy4KKyAgdm9pZCBTZXQoY29uc3QgY2hhciogY19zdHJpbmcpOworfTsKKworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFMl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmExOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMDkgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB3cml0ZSBhIG1vcmUgY29tcGxleCB1bml0IHRlc3QgZm9yIGEgY2xhc3MKKy8vIHRoYXQgaGFzIG11bHRpcGxlIG1lbWJlciBmdW5jdGlvbnMuCisvLworLy8gVXN1YWxseSwgaXQncyBhIGdvb2QgaWRlYSB0byBoYXZlIG9uZSB0ZXN0IGZvciBlYWNoIG1ldGhvZCBpbiB5b3VyCisvLyBjbGFzcy4gIFlvdSBkb24ndCBoYXZlIHRvIGRvIHRoYXQgZXhhY3RseSwgYnV0IGl0IGhlbHBzIHRvIGtlZXAKKy8vIHlvdXIgdGVzdHMgb3JnYW5pemVkLiAgWW91IG1heSBhbHNvIHRocm93IGluIGFkZGl0aW9uYWwgdGVzdHMgYXMKKy8vIG5lZWRlZC4KKworI2luY2x1ZGUgInNhbXBsZTIuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBJbiB0aGlzIGV4YW1wbGUsIHdlIHRlc3QgdGhlIE15U3RyaW5nIGNsYXNzIChhIHNpbXBsZSBzdHJpbmcpLgorCisvLyBUZXN0cyB0aGUgZGVmYXVsdCBjJ3Rvci4KK1RFU1QoTXlTdHJpbmcsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICBjb25zdCBNeVN0cmluZyBzOworCisgIC8vIEFzc2VydHMgdGhhdCBzLmNfc3RyaW5nKCkgcmV0dXJucyBOVUxMLgorICAvLworICAvLyA8VGVjaG5pY2FsRGV0YWlscz4KKyAgLy8KKyAgLy8gSWYgd2Ugd3JpdGUgTlVMTCBpbnN0ZWFkIG9mCisgIC8vCisgIC8vICAgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihOVUxMKQorICAvLworICAvLyBpbiB0aGlzIGFzc2VydGlvbiwgaXQgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcgb24gZ2NjIDMuNC4gIFRoZQorICAvLyByZWFzb24gaXMgdGhhdCBFWFBFQ1RfRVEgbmVlZHMgdG8ga25vdyB0aGUgdHlwZXMgb2YgaXRzCisgIC8vIGFyZ3VtZW50cyBpbiBvcmRlciB0byBwcmludCB0aGVtIHdoZW4gaXQgZmFpbHMuICBTaW5jZSBOVUxMIGlzCisgIC8vICNkZWZpbmVkIGFzIDAsIHRoZSBjb21waWxlciB3aWxsIHVzZSB0aGUgZm9ybWF0dGVyIGZ1bmN0aW9uIGZvcgorICAvLyBpbnQgdG8gcHJpbnQgaXQuICBIb3dldmVyLCBnY2MgdGhpbmtzIHRoYXQgTlVMTCBzaG91bGQgYmUgdXNlZCBhcworICAvLyBhIHBvaW50ZXIsIG5vdCBhbiBpbnQsIGFuZCB0aGVyZWZvcmUgY29tcGxhaW5zLgorICAvLworICAvLyBUaGUgcm9vdCBvZiB0aGUgcHJvYmxlbSBpcyBDKysncyBsYWNrIG9mIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlCisgIC8vIGludGVnZXIgbnVtYmVyIDAgYW5kIHRoZSBudWxsIHBvaW50ZXIgY29uc3RhbnQuICBVbmZvcnR1bmF0ZWx5LAorICAvLyB3ZSBoYXZlIHRvIGxpdmUgd2l0aCB0aGlzIGZhY3QuCisgIC8vCisgIC8vIDwvVGVjaG5pY2FsRGV0YWlscz4KKyAgRVhQRUNUX1NUUkVRKE5VTEwsIHMuY19zdHJpbmcoKSk7CisKKyAgRVhQRUNUX0VRKDB1LCBzLkxlbmd0aCgpKTsKK30KKworY29uc3QgY2hhciBrSGVsbG9TdHJpbmdbXSA9ICJIZWxsbywgd29ybGQhIjsKKworLy8gVGVzdHMgdGhlIGMndG9yIHRoYXQgYWNjZXB0cyBhIEMgc3RyaW5nLgorVEVTVChNeVN0cmluZywgQ29uc3RydWN0b3JGcm9tQ1N0cmluZykgeworICBjb25zdCBNeVN0cmluZyBzKGtIZWxsb1N0cmluZyk7CisgIEVYUEVDVF9FUSgwLCBzdHJjbXAocy5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihrSGVsbG9TdHJpbmcpL3NpemVvZihrSGVsbG9TdHJpbmdbMF0pIC0gMSwKKyAgICAgICAgICAgIHMuTGVuZ3RoKCkpOworfQorCisvLyBUZXN0cyB0aGUgY29weSBjJ3Rvci4KK1RFU1QoTXlTdHJpbmcsIENvcHlDb25zdHJ1Y3RvcikgeworICBjb25zdCBNeVN0cmluZyBzMShrSGVsbG9TdHJpbmcpOworICBjb25zdCBNeVN0cmluZyBzMiA9IHMxOworICBFWFBFQ1RfRVEoMCwgc3RyY21wKHMyLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykpOworfQorCisvLyBUZXN0cyB0aGUgU2V0IG1ldGhvZC4KK1RFU1QoTXlTdHJpbmcsIFNldCkgeworICBNeVN0cmluZyBzOworCisgIHMuU2V0KGtIZWxsb1N0cmluZyk7CisgIEVYUEVDVF9FUSgwLCBzdHJjbXAocy5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpKTsKKworICAvLyBTZXQgc2hvdWxkIHdvcmsgd2hlbiB0aGUgaW5wdXQgcG9pbnRlciBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCisgIC8vIGFscmVhZHkgaW4gdGhlIE15U3RyaW5nIG9iamVjdC4KKyAgcy5TZXQocy5jX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDAsIHN0cmNtcChzLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykpOworCisgIC8vIENhbiB3ZSBzZXQgdGhlIE15U3RyaW5nIHRvIE5VTEw/CisgIHMuU2V0KE5VTEwpOworICBFWFBFQ1RfU1RSRVEoTlVMTCwgcy5jX3N0cmluZygpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUzLWlubC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTMtaW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzMDg0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUzLWlubC5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1NBTVBMRTNfSU5MX0hfCisjZGVmaW5lIEdURVNUX1NBTVBMRVNfU0FNUExFM19JTkxfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8vIFF1ZXVlIGlzIGEgc2ltcGxlIHF1ZXVlIGltcGxlbWVudGVkIGFzIGEgc2luZ2xlZC1saW5rZWQgbGlzdC4KKy8vCisvLyBUaGUgZWxlbWVudCB0eXBlIG11c3Qgc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+ICAvLyBFIGlzIHRoZSBlbGVtZW50IHR5cGUKK2NsYXNzIFF1ZXVlOworCisvLyBRdWV1ZU5vZGUgaXMgYSBub2RlIGluIGEgUXVldWUsIHdoaWNoIGNvbnNpc3RzIG9mIGFuIGVsZW1lbnQgb2YKKy8vIHR5cGUgRSBhbmQgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG5vZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4gIC8vIEUgaXMgdGhlIGVsZW1lbnQgdHlwZQorY2xhc3MgUXVldWVOb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFF1ZXVlPEU+OworCisgcHVibGljOgorICAvLyBHZXRzIHRoZSBlbGVtZW50IGluIHRoaXMgbm9kZS4KKyAgY29uc3QgRSYgZWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGVsZW1lbnRfOyB9CisKKyAgLy8gR2V0cyB0aGUgbmV4dCBub2RlIGluIHRoZSBxdWV1ZS4KKyAgUXVldWVOb2RlKiBuZXh0KCkgeyByZXR1cm4gbmV4dF87IH0KKyAgY29uc3QgUXVldWVOb2RlKiBuZXh0KCkgY29uc3QgeyByZXR1cm4gbmV4dF87IH0KKworIHByaXZhdGU6CisgIC8vIENyZWF0ZXMgYSBub2RlIHdpdGggYSBnaXZlbiBlbGVtZW50IHZhbHVlLiAgVGhlIG5leHQgcG9pbnRlciBpcworICAvLyBzZXQgdG8gTlVMTC4KKyAgZXhwbGljaXQgUXVldWVOb2RlKGNvbnN0IEUmIGFuX2VsZW1lbnQpIDogZWxlbWVudF8oYW5fZWxlbWVudCksIG5leHRfKE5VTEwpIHt9CisKKyAgLy8gV2UgZGlzYWJsZSB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IG9wZXJhdG9yIGFuZCBjb3B5IGMndG9yLgorICBjb25zdCBRdWV1ZU5vZGUmIG9wZXJhdG9yID0gKGNvbnN0IFF1ZXVlTm9kZSYpOworICBRdWV1ZU5vZGUoY29uc3QgUXVldWVOb2RlJik7CisKKyAgRSBlbGVtZW50XzsKKyAgUXVldWVOb2RlKiBuZXh0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFPiAgLy8gRSBpcyB0aGUgZWxlbWVudCB0eXBlLgorY2xhc3MgUXVldWUgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBxdWV1ZS4KKyAgUXVldWUoKSA6IGhlYWRfKE5VTEwpLCBsYXN0XyhOVUxMKSwgc2l6ZV8oMCkge30KKworICAvLyBEJ3Rvci4gIENsZWFycyB0aGUgcXVldWUuCisgIH5RdWV1ZSgpIHsgQ2xlYXIoKTsgfQorCisgIC8vIENsZWFycyB0aGUgcXVldWUuCisgIHZvaWQgQ2xlYXIoKSB7CisgICAgaWYgKHNpemVfID4gMCkgeworICAgICAgLy8gMS4gRGVsZXRlcyBldmVyeSBub2RlLgorICAgICAgUXVldWVOb2RlPEU+KiBub2RlID0gaGVhZF87CisgICAgICBRdWV1ZU5vZGU8RT4qIG5leHQgPSBub2RlLT5uZXh0KCk7CisgICAgICBmb3IgKDsgOykgeworICAgICAgICBkZWxldGUgbm9kZTsKKyAgICAgICAgbm9kZSA9IG5leHQ7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpIGJyZWFrOworICAgICAgICBuZXh0ID0gbm9kZS0+bmV4dCgpOworICAgICAgfQorCisgICAgICAvLyAyLiBSZXNldHMgdGhlIG1lbWJlciB2YXJpYWJsZXMuCisgICAgICBoZWFkXyA9IGxhc3RfID0gTlVMTDsKKyAgICAgIHNpemVfID0gMDsKKyAgICB9CisgIH0KKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgIHNpemVfdCBTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworICAvLyBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgIFF1ZXVlTm9kZTxFPiogSGVhZCgpIHsgcmV0dXJuIGhlYWRfOyB9CisgIGNvbnN0IFF1ZXVlTm9kZTxFPiogSGVhZCgpIGNvbnN0IHsgcmV0dXJuIGhlYWRfOyB9CisKKyAgLy8gR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgIFF1ZXVlTm9kZTxFPiogTGFzdCgpIHsgcmV0dXJuIGxhc3RfOyB9CisgIGNvbnN0IFF1ZXVlTm9kZTxFPiogTGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfOyB9CisKKyAgLy8gQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLiAgQSBjb3B5IG9mIHRoZSBlbGVtZW50IGlzCisgIC8vIGNyZWF0ZWQgdXNpbmcgdGhlIGNvcHkgY29uc3RydWN0b3IsIGFuZCB0aGVuIHN0b3JlZCBpbiB0aGUgcXVldWUuCisgIC8vIENoYW5nZXMgbWFkZSB0byB0aGUgZWxlbWVudCBpbiB0aGUgcXVldWUgZG9lc24ndCBhZmZlY3QgdGhlIHNvdXJjZQorICAvLyBvYmplY3QsIGFuZCB2aWNlIHZlcnNhLgorICB2b2lkIEVucXVldWUoY29uc3QgRSYgZWxlbWVudCkgeworICAgIFF1ZXVlTm9kZTxFPiogbmV3X25vZGUgPSBuZXcgUXVldWVOb2RlPEU+KGVsZW1lbnQpOworCisgICAgaWYgKHNpemVfID09IDApIHsKKyAgICAgIGhlYWRfID0gbGFzdF8gPSBuZXdfbm9kZTsKKyAgICAgIHNpemVfID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdF8tPm5leHRfID0gbmV3X25vZGU7CisgICAgICBsYXN0XyA9IG5ld19ub2RlOworICAgICAgc2l6ZV8rKzsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmVzIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJucyBpdC4gIFJldHVybnMgTlVMTCBpZgorICAvLyB0aGUgcXVldWUgaXMgZW1wdHkuCisgIEUqIERlcXVldWUoKSB7CisgICAgaWYgKHNpemVfID09IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IFF1ZXVlTm9kZTxFPiogY29uc3Qgb2xkX2hlYWQgPSBoZWFkXzsKKyAgICBoZWFkXyA9IGhlYWRfLT5uZXh0XzsKKyAgICBzaXplXy0tOworICAgIGlmIChzaXplXyA9PSAwKSB7CisgICAgICBsYXN0XyA9IE5VTEw7CisgICAgfQorCisgICAgRSogZWxlbWVudCA9IG5ldyBFKG9sZF9oZWFkLT5lbGVtZW50KCkpOworICAgIGRlbGV0ZSBvbGRfaGVhZDsKKworICAgIHJldHVybiBlbGVtZW50OworICB9CisKKyAgLy8gQXBwbGllcyBhIGZ1bmN0aW9uL2Z1bmN0b3Igb24gZWFjaCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgYW5kCisgIC8vIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIG5ldyBxdWV1ZS4gIFRoZSBvcmlnaW5hbCBxdWV1ZSBpcyBub3QKKyAgLy8gYWZmZWN0ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBRdWV1ZSogTWFwKEYgZnVuY3Rpb24pIGNvbnN0IHsKKyAgICBRdWV1ZSogbmV3X3F1ZXVlID0gbmV3IFF1ZXVlKCk7CisgICAgZm9yIChjb25zdCBRdWV1ZU5vZGU8RT4qIG5vZGUgPSBoZWFkXzsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dF8pIHsKKyAgICAgIG5ld19xdWV1ZS0+RW5xdWV1ZShmdW5jdGlvbihub2RlLT5lbGVtZW50KCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3X3F1ZXVlOworICB9CisKKyBwcml2YXRlOgorICBRdWV1ZU5vZGU8RT4qIGhlYWRfOyAgLy8gVGhlIGZpcnN0IG5vZGUgb2YgdGhlIHF1ZXVlLgorICBRdWV1ZU5vZGU8RT4qIGxhc3RfOyAgLy8gVGhlIGxhc3Qgbm9kZSBvZiB0aGUgcXVldWUuCisgIHNpemVfdCBzaXplXzsgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLgorCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgYSBxdWV1ZS4KKyAgUXVldWUoY29uc3QgUXVldWUmKTsKKyAgY29uc3QgUXVldWUmIG9wZXJhdG9yID0gKGNvbnN0IFF1ZXVlJik7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFM19JTkxfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzODc3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTUxIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworCisvLyBJbiB0aGlzIGV4YW1wbGUsIHdlIHVzZSBhIG1vcmUgYWR2YW5jZWQgZmVhdHVyZSBvZiBHb29nbGUgVGVzdCBjYWxsZWQKKy8vIHRlc3QgZml4dHVyZS4KKy8vCisvLyBBIHRlc3QgZml4dHVyZSBpcyBhIHBsYWNlIHRvIGhvbGQgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIHNoYXJlZCBieQorLy8gYWxsIHRlc3RzIGluIGEgdGVzdCBjYXNlLiAgVXNpbmcgYSB0ZXN0IGZpeHR1cmUgYXZvaWRzIGR1cGxpY2F0aW5nCisvLyB0aGUgdGVzdCBjb2RlIG5lY2Vzc2FyeSB0byBpbml0aWFsaXplIGFuZCBjbGVhbnVwIHRob3NlIGNvbW1vbgorLy8gb2JqZWN0cyBmb3IgZWFjaCB0ZXN0LiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIGRlZmluaW5nIHN1Yi1yb3V0aW5lcworLy8gdGhhdCB5b3VyIHRlc3RzIG5lZWQgdG8gaW52b2tlIGEgbG90LgorLy8KKy8vIDxUZWNobmljYWxEZXRhaWxzPgorLy8KKy8vIFRoZSB0ZXN0cyBzaGFyZSB0aGUgdGVzdCBmaXh0dXJlIGluIHRoZSBzZW5zZSBvZiBjb2RlIHNoYXJpbmcsIG5vdAorLy8gZGF0YSBzaGFyaW5nLiAgRWFjaCB0ZXN0IGlzIGdpdmVuIGl0cyBvd24gZnJlc2ggY29weSBvZiB0aGUKKy8vIGZpeHR1cmUuICBZb3UgY2Fubm90IGV4cGVjdCB0aGUgZGF0YSBtb2RpZmllZCBieSBvbmUgdGVzdCB0byBiZQorLy8gcGFzc2VkIG9uIHRvIGFub3RoZXIgdGVzdCwgd2hpY2ggaXMgYSBiYWQgaWRlYS4KKy8vCisvLyBUaGUgcmVhc29uIGZvciB0aGlzIGRlc2lnbiBpcyB0aGF0IHRlc3RzIHNob3VsZCBiZSBpbmRlcGVuZGVudCBhbmQKKy8vIHJlcGVhdGFibGUuICBJbiBwYXJ0aWN1bGFyLCBhIHRlc3Qgc2hvdWxkIG5vdCBmYWlsIGFzIHRoZSByZXN1bHQgb2YKKy8vIGFub3RoZXIgdGVzdCdzIGZhaWx1cmUuICBJZiBvbmUgdGVzdCBkZXBlbmRzIG9uIGluZm8gcHJvZHVjZWQgYnkKKy8vIGFub3RoZXIgdGVzdCwgdGhlbiB0aGUgdHdvIHRlc3RzIHNob3VsZCByZWFsbHkgYmUgb25lIGJpZyB0ZXN0LgorLy8KKy8vIFRoZSBtYWNyb3MgZm9yIGluZGljYXRpbmcgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBvZiBhIHRlc3QKKy8vIChFWFBFQ1RfVFJVRSwgRkFJTCwgZXRjKSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgY3VycmVudCB0ZXN0IGlzCisvLyAod2hlbiBHb29nbGUgVGVzdCBwcmludHMgdGhlIHRlc3QgcmVzdWx0LCBpdCB0ZWxscyB5b3Ugd2hpY2ggdGVzdAorLy8gZWFjaCBmYWlsdXJlIGJlbG9uZ3MgdG8pLiAgVGVjaG5pY2FsbHksIHRoZXNlIG1hY3JvcyBpbnZva2UgYQorLy8gbWVtYmVyIGZ1bmN0aW9uIG9mIHRoZSBUZXN0IGNsYXNzLiAgVGhlcmVmb3JlLCB5b3UgY2Fubm90IHVzZSB0aGVtCisvLyBpbiBhIGdsb2JhbCBmdW5jdGlvbi4gIFRoYXQncyB3aHkgeW91IHNob3VsZCBwdXQgdGVzdCBzdWItcm91dGluZXMKKy8vIGluIGEgdGVzdCBmaXh0dXJlLgorLy8KKy8vIDwvVGVjaG5pY2FsRGV0YWlscz4KKworI2luY2x1ZGUgInNhbXBsZTMtaW5sLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVG8gdXNlIGEgdGVzdCBmaXh0dXJlLCBkZXJpdmUgYSBjbGFzcyBmcm9tIHRlc3Rpbmc6OlRlc3QuCitjbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOiAgLy8gWW91IHNob3VsZCBtYWtlIHRoZSBtZW1iZXJzIHByb3RlY3RlZCBzLnQuIHRoZXkgY2FuIGJlCisgICAgICAgICAgICAgLy8gYWNjZXNzZWQgZnJvbSBzdWItY2xhc3Nlcy4KKworICAvLyB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0IGlzIHJ1bi4gIFlvdQorICAvLyBzaG91bGQgZGVmaW5lIGl0IGlmIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIHZhcmFpYmxlcy4KKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIGNhbiBiZSBza2lwcGVkLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcTFfLkVucXVldWUoMSk7CisgICAgcTJfLkVucXVldWUoMik7CisgICAgcTJfLkVucXVldWUoMyk7CisgIH0KKworICAvLyB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB3aWxsIGJlIGNhbGxlZCBhZnRlciBlYWNoIHRlc3QgaXMgcnVuLgorICAvLyBZb3Ugc2hvdWxkIGRlZmluZSBpdCBpZiB0aGVyZSBpcyBjbGVhbnVwIHdvcmsgdG8gZG8uICBPdGhlcndpc2UsCisgIC8vIHlvdSBkb24ndCBoYXZlIHRvIHByb3ZpZGUgaXQuCisgIC8vCisgIC8vIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgLy8gfQorCisgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgc29tZSB0ZXN0IHVzZXMuCisgIHN0YXRpYyBpbnQgRG91YmxlKGludCBuKSB7CisgICAgcmV0dXJuIDIqbjsKKyAgfQorCisgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIFF1ZXVlOjpNYXAoKS4KKyAgdm9pZCBNYXBUZXN0ZXIoY29uc3QgUXVldWU8aW50PiAqIHEpIHsKKyAgICAvLyBDcmVhdGVzIGEgbmV3IHF1ZXVlLCB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgdHdpY2UgYXMgYmlnIGFzIHRoZQorICAgIC8vIGNvcnJlc3BvbmRpbmcgb25lIGluIHEuCisgICAgY29uc3QgUXVldWU8aW50PiAqIGNvbnN0IG5ld19xID0gcS0+TWFwKERvdWJsZSk7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBuZXcgcXVldWUgaGFzIHRoZSBzYW1lIHNpemUgYXMgcS4KKyAgICBBU1NFUlRfRVEocS0+U2l6ZSgpLCBuZXdfcS0+U2l6ZSgpKTsKKworICAgIC8vIFZlcmlmaWVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZWxlbWVudHMgb2YgdGhlIHR3byBxdWV1ZXMuCisgICAgZm9yICggY29uc3QgUXVldWVOb2RlPGludD4gKiBuMSA9IHEtPkhlYWQoKSwgKiBuMiA9IG5ld19xLT5IZWFkKCk7CisgICAgICAgICAgbjEgIT0gTlVMTDsgbjEgPSBuMS0+bmV4dCgpLCBuMiA9IG4yLT5uZXh0KCkgKSB7CisgICAgICBFWFBFQ1RfRVEoMiAqIG4xLT5lbGVtZW50KCksIG4yLT5lbGVtZW50KCkpOworICAgIH0KKworICAgIGRlbGV0ZSBuZXdfcTsKKyAgfQorCisgIC8vIERlY2xhcmVzIHRoZSB2YXJpYWJsZXMgeW91ciB0ZXN0cyB3YW50IHRvIHVzZS4KKyAgUXVldWU8aW50PiBxMF87CisgIFF1ZXVlPGludD4gcTFfOworICBRdWV1ZTxpbnQ+IHEyXzsKK307CisKKy8vIFdoZW4geW91IGhhdmUgYSB0ZXN0IGZpeHR1cmUsIHlvdSBkZWZpbmUgYSB0ZXN0IHVzaW5nIFRFU1RfRgorLy8gaW5zdGVhZCBvZiBURVNULgorCisvLyBUZXN0cyB0aGUgZGVmYXVsdCBjJ3Rvci4KK1RFU1RfRihRdWV1ZVRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICAvLyBZb3UgY2FuIGFjY2VzcyBkYXRhIGluIHRoZSB0ZXN0IGZpeHR1cmUgaGVyZS4KKyAgRVhQRUNUX0VRKDB1LCBxMF8uU2l6ZSgpKTsKK30KKworLy8gVGVzdHMgRGVxdWV1ZSgpLgorVEVTVF9GKFF1ZXVlVGVzdCwgRGVxdWV1ZSkgeworICBpbnQgKiBuID0gcTBfLkRlcXVldWUoKTsKKyAgRVhQRUNUX1RSVUUobiA9PSBOVUxMKTsKKworICBuID0gcTFfLkRlcXVldWUoKTsKKyAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDEsICpuKTsKKyAgRVhQRUNUX0VRKDB1LCBxMV8uU2l6ZSgpKTsKKyAgZGVsZXRlIG47CisKKyAgbiA9IHEyXy5EZXF1ZXVlKCk7CisgIEFTU0VSVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgyLCAqbik7CisgIEVYUEVDVF9FUSgxdSwgcTJfLlNpemUoKSk7CisgIGRlbGV0ZSBuOworfQorCisvLyBUZXN0cyB0aGUgUXVldWU6Ok1hcCgpIGZ1bmN0aW9uLgorVEVTVF9GKFF1ZXVlVGVzdCwgTWFwKSB7CisgIE1hcFRlc3RlcigmcTBfKTsKKyAgTWFwVGVzdGVyKCZxMV8pOworICBNYXBUZXN0ZXIoJnEyXyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlNC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDRiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlNC5jYwpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJzYW1wbGU0LmgiCisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSwgYW5kIGluY3JlbWVudHMgaXQuCitpbnQgQ291bnRlcjo6SW5jcmVtZW50KCkgeworICByZXR1cm4gY291bnRlcl8rKzsKK30KKworLy8gUHJpbnRzIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgdG8gU1RET1VULgordm9pZCBDb3VudGVyOjpQcmludCgpIGNvbnN0IHsKKyAgcHJpbnRmKCIlZCIsIGNvdW50ZXJfKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjBmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlNC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFNF9IXworI2RlZmluZSBHVEVTVF9TQU1QTEVTX1NBTVBMRTRfSF8KKworLy8gQSBzaW1wbGUgbW9ub3RvbmljIGNvdW50ZXIuCitjbGFzcyBDb3VudGVyIHsKKyBwcml2YXRlOgorICBpbnQgY291bnRlcl87CisKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBjb3VudGVyIHRoYXQgc3RhcnRzIGF0IDAuCisgIENvdW50ZXIoKSA6IGNvdW50ZXJfKDApIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLCBhbmQgaW5jcmVtZW50cyBpdC4KKyAgaW50IEluY3JlbWVudCgpOworCisgIC8vIFByaW50cyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlIHRvIFNURE9VVC4KKyAgdm9pZCBQcmludCgpIGNvbnN0OworfTsKKworI2VuZGlmICAvLyBHVEVTVF9TQU1QTEVTX1NBTVBMRTRfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YWZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInNhbXBsZTQuaCIKKworLy8gVGVzdHMgdGhlIEluY3JlbWVudCgpIG1ldGhvZC4KK1RFU1QoQ291bnRlciwgSW5jcmVtZW50KSB7CisgIENvdW50ZXIgYzsKKworICAvLyBFWFBFQ1RfRVEoKSBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UsIHNvIHRoZXkKKyAgLy8gY2FuIGhhdmUgc2lkZSBlZmZlY3RzLgorCisgIEVYUEVDVF9FUSgwLCBjLkluY3JlbWVudCgpKTsKKyAgRVhQRUNUX0VRKDEsIGMuSW5jcmVtZW50KCkpOworICBFWFBFQ1RfRVEoMiwgYy5JbmNyZW1lbnQoKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDhlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE5OSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGhpcyBzYW1wbGUgdGVhY2hlcyBob3cgdG8gcmV1c2UgYSB0ZXN0IGZpeHR1cmUgaW4gbXVsdGlwbGUgdGVzdAorLy8gY2FzZXMgYnkgZGVyaXZpbmcgc3ViLWZpeHR1cmVzIGZyb20gaXQuCisvLworLy8gV2hlbiB5b3UgZGVmaW5lIGEgdGVzdCBmaXh0dXJlLCB5b3Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgdGVzdAorLy8gY2FzZSB0aGF0IHdpbGwgdXNlIHRoaXMgZml4dHVyZS4gIFRoZXJlZm9yZSwgYSB0ZXN0IGZpeHR1cmUgY2FuCisvLyBiZSB1c2VkIGJ5IG9ubHkgb25lIHRlc3QgY2FzZS4KKy8vCisvLyBTb21ldGltZXMsIG1vcmUgdGhhbiBvbmUgdGVzdCBjYXNlcyBtYXkgd2FudCB0byB1c2UgdGhlIHNhbWUgb3IKKy8vIHNsaWdodGx5IGRpZmZlcmVudCB0ZXN0IGZpeHR1cmVzLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkgd2FudCB0bworLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHRlc3RzIGZvciBhIEdVSSBsaWJyYXJ5IGRvbid0IGxlYWsgaW1wb3J0YW50CisvLyBzeXN0ZW0gcmVzb3VyY2VzIGxpa2UgZm9udHMgYW5kIGJydXNoZXMuICBJbiBHb29nbGUgVGVzdCwgeW91IGRvCisvLyB0aGlzIGJ5IHB1dHRpbmcgdGhlIHNoYXJlZCBsb2dpYyBpbiBhIHN1cGVyIChhcyBpbiAic3VwZXIgY2xhc3MiKQorLy8gdGVzdCBmaXh0dXJlLCBhbmQgdGhlbiBoYXZlIGVhY2ggdGVzdCBjYXNlIHVzZSBhIGZpeHR1cmUgZGVyaXZlZAorLy8gZnJvbSB0aGlzIHN1cGVyIGZpeHR1cmUuCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAic2FtcGxlMy1pbmwuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInNhbXBsZTEuaCIKKworLy8gSW4gdGhpcyBzYW1wbGUsIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgZXZlcnkgdGVzdCBmaW5pc2hlcyB3aXRoaW4KKy8vIH41IHNlY29uZHMuICBJZiBhIHRlc3QgdGFrZXMgbG9uZ2VyIHRvIHJ1biwgd2UgY29uc2lkZXIgaXQgYQorLy8gZmFpbHVyZS4KKy8vCisvLyBXZSBwdXQgdGhlIGNvZGUgZm9yIHRpbWluZyBhIHRlc3QgaW4gYSB0ZXN0IGZpeHR1cmUgY2FsbGVkCisvLyAiUXVpY2tUZXN0Ii4gIFF1aWNrVGVzdCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgc3VwZXIgZml4dHVyZSB0aGF0CisvLyBvdGhlciBmaXh0dXJlcyBkZXJpdmUgZnJvbSwgdGhlcmVmb3JlIHRoZXJlIGlzIG5vIHRlc3QgY2FzZSB3aXRoCisvLyB0aGUgbmFtZSAiUXVpY2tUZXN0Ii4gIFRoaXMgaXMgT0suCisvLworLy8gTGF0ZXIsIHdlIHdpbGwgZGVyaXZlIG11bHRpcGxlIHRlc3QgZml4dHVyZXMgZnJvbSBRdWlja1Rlc3QuCitjbGFzcyBRdWlja1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBSZW1lbWJlciB0aGF0IFNldFVwKCkgaXMgcnVuIGltbWVkaWF0ZWx5IGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgorICAvLyBUaGlzIGlzIGEgZ29vZCBwbGFjZSB0byByZWNvcmQgdGhlIHN0YXJ0IHRpbWUuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBzdGFydF90aW1lXyA9IHRpbWUoTlVMTCk7CisgIH0KKworICAvLyBUZWFyRG93bigpIGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSB0ZXN0IGZpbmlzaGVzLiAgSGVyZSB3ZQorICAvLyBjaGVjayBpZiB0aGUgdGVzdCB3YXMgdG9vIHNsb3cuCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBHZXRzIHRoZSB0aW1lIHdoZW4gdGhlIHRlc3QgZmluaXNoZXMKKyAgICBjb25zdCB0aW1lX3QgZW5kX3RpbWUgPSB0aW1lKE5VTEwpOworCisgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSB0ZXN0IHRvb2sgbm8gbW9yZSB0aGFuIH41IHNlY29uZHMuICBEaWQgeW91CisgICAgLy8ga25vdyB0aGF0IHlvdSBjYW4gdXNlIGFzc2VydGlvbnMgaW4gU2V0VXAoKSBhbmQgVGVhckRvd24oKSBhcworICAgIC8vIHdlbGw/CisgICAgRVhQRUNUX1RSVUUoZW5kX3RpbWUgLSBzdGFydF90aW1lXyA8PSA1KSA8PCAiVGhlIHRlc3QgdG9vayB0b28gbG9uZy4iOworICB9CisKKyAgLy8gVGhlIFVUQyB0aW1lIChpbiBzZWNvbmRzKSB3aGVuIHRoZSB0ZXN0IHN0YXJ0cworICB0aW1lX3Qgc3RhcnRfdGltZV87Cit9OworCisKKy8vIFdlIGRlcml2ZSBhIGZpeHR1cmUgbmFtZWQgSW50ZWdlckZ1bmN0aW9uVGVzdCBmcm9tIHRoZSBRdWlja1Rlc3QKKy8vIGZpeHR1cmUuICBBbGwgdGVzdHMgdXNpbmcgdGhpcyBmaXh0dXJlIHdpbGwgYmUgYXV0b21hdGljYWxseQorLy8gcmVxdWlyZWQgdG8gYmUgcXVpY2suCitjbGFzcyBJbnRlZ2VyRnVuY3Rpb25UZXN0IDogcHVibGljIFF1aWNrVGVzdCB7CisgIC8vIFdlIGRvbid0IG5lZWQgYW55IG1vcmUgbG9naWMgdGhhbiBhbHJlYWR5IGluIHRoZSBRdWlja1Rlc3QgZml4dHVyZS4KKyAgLy8gVGhlcmVmb3JlIHRoZSBib2R5IGlzIGVtcHR5LgorfTsKKworCisvLyBOb3cgd2UgY2FuIHdyaXRlIHRlc3RzIGluIHRoZSBJbnRlZ2VyRnVuY3Rpb25UZXN0IHRlc3QgY2FzZS4KKworLy8gVGVzdHMgRmFjdG9yaWFsKCkKK1RFU1RfRihJbnRlZ2VyRnVuY3Rpb25UZXN0LCBGYWN0b3JpYWwpIHsKKyAgLy8gVGVzdHMgZmFjdG9yaWFsIG9mIG5lZ2F0aXZlIG51bWJlcnMuCisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoLTUpKTsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgtMSkpOworICBFWFBFQ1RfR1QoRmFjdG9yaWFsKC0xMCksIDApOworCisgIC8vIFRlc3RzIGZhY3RvcmlhbCBvZiAwLgorICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDApKTsKKworICAvLyBUZXN0cyBmYWN0b3JpYWwgb2YgcG9zaXRpdmUgbnVtYmVycy4KKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgxKSk7CisgIEVYUEVDVF9FUSgyLCBGYWN0b3JpYWwoMikpOworICBFWFBFQ1RfRVEoNiwgRmFjdG9yaWFsKDMpKTsKKyAgRVhQRUNUX0VRKDQwMzIwLCBGYWN0b3JpYWwoOCkpOworfQorCisKKy8vIFRlc3RzIElzUHJpbWUoKQorVEVTVF9GKEludGVnZXJGdW5jdGlvblRlc3QsIElzUHJpbWUpIHsKKyAgLy8gVGVzdHMgbmVnYXRpdmUgaW5wdXQuCisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKC0xKSk7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKC0yKSk7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKElOVF9NSU4pKTsKKworICAvLyBUZXN0cyBzb21lIHRyaXZpYWwgY2FzZXMuCisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoMSkpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSgzKSk7CisKKyAgLy8gVGVzdHMgcG9zaXRpdmUgaW5wdXQuCisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDQpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSg1KSk7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDYpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSgyMykpOworfQorCisKKy8vIFRoZSBuZXh0IHRlc3QgY2FzZSAobmFtZWQgIlF1ZXVlVGVzdCIpIGFsc28gbmVlZHMgdG8gYmUgcXVpY2ssIHNvCisvLyB3ZSBkZXJpdmUgYW5vdGhlciBmaXh0dXJlIGZyb20gUXVpY2tUZXN0LgorLy8KKy8vIFRoZSBRdWV1ZVRlc3QgdGVzdCBmaXh0dXJlIGhhcyBzb21lIGxvZ2ljIGFuZCBzaGFyZWQgb2JqZWN0cyBpbgorLy8gYWRkaXRpb24gdG8gd2hhdCdzIGluIFF1aWNrVGVzdCBhbHJlYWR5LiAgV2UgZGVmaW5lIHRoZSBhZGRpdGlvbmFsCisvLyBzdHVmZiBpbnNpZGUgdGhlIGJvZHkgb2YgdGhlIHRlc3QgZml4dHVyZSwgYXMgdXN1YWwuCitjbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgUXVpY2tUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBzZXQgdXAgdGhlIHN1cGVyIGZpeHR1cmUgKFF1aWNrVGVzdCkuCisgICAgUXVpY2tUZXN0OjpTZXRVcCgpOworCisgICAgLy8gU2Vjb25kLCBzb21lIGFkZGl0aW9uYWwgc2V0dXAgZm9yIHRoaXMgZml4dHVyZS4KKyAgICBxMV8uRW5xdWV1ZSgxKTsKKyAgICBxMl8uRW5xdWV1ZSgyKTsKKyAgICBxMl8uRW5xdWV1ZSgzKTsKKyAgfQorCisgIC8vIEJ5IGRlZmF1bHQsIFRlYXJEb3duKCkgaW5oZXJpdHMgdGhlIGJlaGF2aW9yIG9mCisgIC8vIFF1aWNrVGVzdDo6VGVhckRvd24oKS4gIEFzIHdlIGhhdmUgbm8gYWRkaXRpb25hbCBjbGVhbmluZyB3b3JrCisgIC8vIGZvciBRdWV1ZVRlc3QsIHdlIG9taXQgaXQgaGVyZS4KKyAgLy8KKyAgLy8gdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAvLyAgIFF1aWNrVGVzdDo6VGVhckRvd24oKTsKKyAgLy8gfQorCisgIFF1ZXVlPGludD4gcTBfOworICBRdWV1ZTxpbnQ+IHExXzsKKyAgUXVldWU8aW50PiBxMl87Cit9OworCisKKy8vIE5vdywgbGV0J3Mgd3JpdGUgdGVzdHMgdXNpbmcgdGhlIFF1ZXVlVGVzdCBmaXh0dXJlLgorCisvLyBUZXN0cyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KK1RFU1RfRihRdWV1ZVRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICBFWFBFQ1RfRVEoMHUsIHEwXy5TaXplKCkpOworfQorCisvLyBUZXN0cyBEZXF1ZXVlKCkuCitURVNUX0YoUXVldWVUZXN0LCBEZXF1ZXVlKSB7CisgIGludCogbiA9IHEwXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9UUlVFKG4gPT0gTlVMTCk7CisKKyAgbiA9IHExXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgxLCAqbik7CisgIEVYUEVDVF9FUSgwdSwgcTFfLlNpemUoKSk7CisgIGRlbGV0ZSBuOworCisgIG4gPSBxMl8uRGVxdWV1ZSgpOworICBFWFBFQ1RfVFJVRShuICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMiwgKm4pOworICBFWFBFQ1RfRVEoMXUsIHEyXy5TaXplKCkpOworICBkZWxldGUgbjsKK30KKworLy8gSWYgbmVjZXNzYXJ5LCB5b3UgY2FuIGRlcml2ZSBmdXJ0aGVyIHRlc3QgZml4dHVyZXMgZnJvbSBhIGRlcml2ZWQKKy8vIGZpeHR1cmUgaXRzZWxmLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVyaXZlIGFub3RoZXIgZml4dHVyZSBmcm9tCisvLyBRdWV1ZVRlc3QuICBHb29nbGUgVGVzdCBpbXBvc2VzIG5vIGxpbWl0IG9uIGhvdyBkZWVwIHRoZSBoaWVyYXJjaHkKKy8vIGNhbiBiZS4gIEluIHByYWN0aWNlLCBob3dldmVyLCB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudCBpdCB0byBiZSB0b28KKy8vIGRlZXAgYXMgdG8gYmUgY29uZnVzaW5nLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIwMzZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyMjQgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHRlc3QgY29tbW9uIHByb3BlcnRpZXMgb2YgbXVsdGlwbGUKKy8vIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBpbnRlcmZhY2UgKGFrYSBpbnRlcmZhY2UgdGVzdHMpLgorCisvLyBUaGUgaW50ZXJmYWNlIGFuZCBpdHMgaW1wbGVtZW50YXRpb25zIGFyZSBpbiB0aGlzIGhlYWRlci4KKyNpbmNsdWRlICJwcmltZV90YWJsZXMuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEZpcnN0LCB3ZSBkZWZpbmUgc29tZSBmYWN0b3J5IGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mCisvLyB0aGUgaW1wbGVtZW50YXRpb25zLiAgWW91IG1heSBiZSBhYmxlIHRvIHNraXAgdGhpcyBzdGVwIGlmIGFsbCB5b3VyCisvLyBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIGNvbnN0cnVjdGVkIHRoZSBzYW1lIHdheS4KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitQcmltZVRhYmxlKiBDcmVhdGVQcmltZVRhYmxlKCk7CisKK3RlbXBsYXRlIDw+CitQcmltZVRhYmxlKiBDcmVhdGVQcmltZVRhYmxlPE9uVGhlRmx5UHJpbWVUYWJsZT4oKSB7CisgIHJldHVybiBuZXcgT25UaGVGbHlQcmltZVRhYmxlOworfQorCit0ZW1wbGF0ZSA8PgorUHJpbWVUYWJsZSogQ3JlYXRlUHJpbWVUYWJsZTxQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZT4oKSB7CisgIHJldHVybiBuZXcgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUoMTAwMDApOworfQorCisvLyBUaGVuIHdlIGRlZmluZSBhIHRlc3QgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgUHJpbWVUYWJsZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBUaGUgY3RvciBjYWxscyB0aGUgZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBwcmltZSB0YWJsZQorICAvLyBpbXBsZW1lbnRlZCBieSBULgorICBQcmltZVRhYmxlVGVzdCgpIDogdGFibGVfKENyZWF0ZVByaW1lVGFibGU8VD4oKSkge30KKworICB2aXJ0dWFsIH5QcmltZVRhYmxlVGVzdCgpIHsgZGVsZXRlIHRhYmxlXzsgfQorCisgIC8vIE5vdGUgdGhhdCB3ZSB0ZXN0IGFuIGltcGxlbWVudGF0aW9uIHZpYSB0aGUgYmFzZSBpbnRlcmZhY2UKKyAgLy8gaW5zdGVhZCBvZiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgVGhpcyBpcyBpbXBvcnRhbnQKKyAgLy8gZm9yIGtlZXBpbmcgdGhlIHRlc3RzIGNsb3NlIHRvIHRoZSByZWFsIHdvcmxkIHNjZW5hcmlvLCB3aGVyZSB0aGUKKyAgLy8gaW1wbGVtZW50YXRpb24gaXMgaW52b2tlZCB2aWEgdGhlIGJhc2UgaW50ZXJmYWNlLiAgSXQgYXZvaWRzCisgIC8vIGdvdC15YXMgd2hlcmUgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGhhcyBhIG1ldGhvZCB0aGF0IHNoYWRvd3MKKyAgLy8gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIChidXQgc2xpZ2h0bHkgZGlmZmVyZW50IGFyZ3VtZW50CisgIC8vIHR5cGVzKSBpbiB0aGUgYmFzZSBpbnRlcmZhY2UsIGZvciBleGFtcGxlLgorICBQcmltZVRhYmxlKiBjb25zdCB0YWJsZV87Cit9OworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordXNpbmcgdGVzdGluZzo6VHlwZXM7CisKKy8vIEdvb2dsZSBUZXN0IG9mZmVycyB0d28gd2F5cyBmb3IgcmV1c2luZyB0ZXN0cyBmb3IgZGlmZmVyZW50IHR5cGVzLgorLy8gVGhlIGZpcnN0IGlzIGNhbGxlZCAidHlwZWQgdGVzdHMiLiAgWW91IHNob3VsZCB1c2UgaXQgaWYgeW91CisvLyBhbHJlYWR5IGtub3cgKmFsbCogdGhlIHR5cGVzIHlvdSBhcmUgZ29ubmEgZXhlcmNpc2Ugd2hlbiB5b3Ugd3JpdGUKKy8vIHRoZSB0ZXN0cy4KKworLy8gVG8gd3JpdGUgYSB0eXBlZCB0ZXN0IGNhc2UsIGZpcnN0IHVzZQorLy8KKy8vICAgVFlQRURfVEVTVF9DQVNFKFRlc3RDYXNlTmFtZSwgVHlwZUxpc3QpOworLy8KKy8vIHRvIGRlY2xhcmUgaXQgYW5kIHNwZWNpZnkgdGhlIHR5cGUgcGFyYW1ldGVycy4gIEFzIHdpdGggVEVTVF9GLAorLy8gVGVzdENhc2VOYW1lIG11c3QgbWF0Y2ggdGhlIHRlc3QgZml4dHVyZSBuYW1lLgorCisvLyBUaGUgbGlzdCBvZiB0eXBlcyB3ZSB3YW50IHRvIHRlc3QuCit0eXBlZGVmIFR5cGVzPE9uVGhlRmx5UHJpbWVUYWJsZSwgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGU+IEltcGxlbWVudGF0aW9uczsKKworVFlQRURfVEVTVF9DQVNFKFByaW1lVGFibGVUZXN0LCBJbXBsZW1lbnRhdGlvbnMpOworCisvLyBUaGVuIHVzZSBUWVBFRF9URVNUKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpIHRvIGRlZmluZSBhIHR5cGVkIHRlc3QsCisvLyBzaW1pbGFyIHRvIFRFU1RfRi4KK1RZUEVEX1RFU1QoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgeworICAvLyBJbnNpZGUgdGhlIHRlc3QgYm9keSwgeW91IGNhbiByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIgYnkKKyAgLy8gVHlwZVBhcmFtLCBhbmQgcmVmZXIgdG8gdGhlIGZpeHR1cmUgY2xhc3MgYnkgVGVzdEZpeHR1cmUuICBXZQorICAvLyBkb24ndCBuZWVkIHRoZW0gaW4gdGhpcyBleGFtcGxlLgorCisgIC8vIFNpbmNlIHdlIGFyZSBpbiB0aGUgdGVtcGxhdGUgd29ybGQsIEMrKyByZXF1aXJlcyBleHBsaWNpdGx5CisgIC8vIHdyaXRpbmcgJ3RoaXMtPicgd2hlbiByZWZlcnJpbmcgdG8gbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcy4KKyAgLy8gVGhpcyBpcyBzb21ldGhpbmcgeW91IGhhdmUgdG8gbGVhcm4gdG8gbGl2ZSB3aXRoLgorICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKC01KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg0KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNikpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEwMCkpOworfQorCitUWVBFRF9URVNUKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zVHJ1ZUZvclByaW1lcykgeworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTEpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEzMSkpOworfQorCitUWVBFRF9URVNUKFByaW1lVGFibGVUZXN0LCBDYW5HZXROZXh0UHJpbWUpIHsKKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDApKTsKKyAgRVhQRUNUX0VRKDMsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDIpKTsKKyAgRVhQRUNUX0VRKDUsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDMpKTsKKyAgRVhQRUNUX0VRKDcsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDUpKTsKKyAgRVhQRUNUX0VRKDExLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSg3KSk7CisgIEVYUEVDVF9FUSgxMzEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDEyOCkpOworfQorCisvLyBUaGF0J3MgaXQhICBHb29nbGUgVGVzdCB3aWxsIHJlcGVhdCBlYWNoIFRZUEVEX1RFU1QgZm9yIGVhY2ggdHlwZQorLy8gaW4gdGhlIHR5cGUgbGlzdCBzcGVjaWZpZWQgaW4gVFlQRURfVEVTVF9DQVNFLiAgU2l0IGJhY2sgYW5kIGJlCisvLyBoYXBweSB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRlZmluZSB0aGVtIG11bHRpcGxlIHRpbWVzLgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3VzaW5nIHRlc3Rpbmc6OlR5cGVzOworCisvLyBTb21ldGltZXMsIGhvd2V2ZXIsIHlvdSBkb24ndCB5ZXQga25vdyBhbGwgdGhlIHR5cGVzIHRoYXQgeW91IHdhbnQKKy8vIHRvIHRlc3Qgd2hlbiB5b3Ugd3JpdGUgdGhlIHRlc3RzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdGhlCisvLyBhdXRob3Igb2YgYW4gaW50ZXJmYWNlIGFuZCBleHBlY3Qgb3RoZXIgcGVvcGxlIHRvIGltcGxlbWVudCBpdCwgeW91CisvLyBtaWdodCB3YW50IHRvIHdyaXRlIGEgc2V0IG9mIHRlc3RzIHRvIG1ha2Ugc3VyZSBlYWNoIGltcGxlbWVudGF0aW9uCisvLyBjb25mb3JtcyB0byBzb21lIGJhc2ljIHJlcXVpcmVtZW50cywgYnV0IHlvdSBkb24ndCBrbm93IHdoYXQKKy8vIGltcGxlbWVudGF0aW9ucyB3aWxsIGJlIHdyaXR0ZW4gaW4gdGhlIGZ1dHVyZS4KKy8vCisvLyBIb3cgY2FuIHlvdSB3cml0ZSB0aGUgdGVzdHMgd2l0aG91dCBjb21taXR0aW5nIHRvIHRoZSB0eXBlCisvLyBwYXJhbWV0ZXJzPyAgVGhhdCdzIHdoYXQgInR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyIgY2FuIGRvIGZvciB5b3UuCisvLyBJdCBpcyBhIGJpdCBtb3JlIGludm9sdmVkIHRoYW4gdHlwZWQgdGVzdHMsIGJ1dCBpbiByZXR1cm4geW91IGdldCBhCisvLyB0ZXN0IHBhdHRlcm4gdGhhdCBjYW4gYmUgcmV1c2VkIGluIG1hbnkgY29udGV4dHMsIHdoaWNoIGlzIGEgYmlnCisvLyB3aW4uICBIZXJlJ3MgaG93IHlvdSBkbyBpdDoKKworLy8gRmlyc3QsIGRlZmluZSBhIHRlc3QgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEhlcmUgd2UganVzdCByZXVzZQorLy8gdGhlIFByaW1lVGFibGVUZXN0IGZpeHR1cmUgZGVmaW5lZCBlYXJsaWVyOgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIFByaW1lVGFibGVUZXN0MiA6IHB1YmxpYyBQcmltZVRhYmxlVGVzdDxUPiB7Cit9OworCisvLyBUaGVuLCBkZWNsYXJlIHRoZSB0ZXN0IGNhc2UuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QKKy8vIGZpeHR1cmUsIGFuZCBhbHNvIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgKGFzIHVzdWFsKS4gIFRoZSBfUAorLy8gc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIgb3IgInBhdHRlcm4iLgorVFlQRURfVEVTVF9DQVNFX1AoUHJpbWVUYWJsZVRlc3QyKTsKKworLy8gTmV4dCwgdXNlIFRZUEVEX1RFU1RfUChUZXN0Q2FzZU5hbWUsIFRlc3ROYW1lKSB0byBkZWZpbmUgYSB0ZXN0LAorLy8gc2ltaWxhciB0byB3aGF0IHlvdSBkbyB3aXRoIFRFU1RfRi4KK1RZUEVEX1RFU1RfUChQcmltZVRhYmxlVGVzdDIsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgeworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKC01KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg0KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNikpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEwMCkpOworfQorCitUWVBFRF9URVNUX1AoUHJpbWVUYWJsZVRlc3QyLCBSZXR1cm5zVHJ1ZUZvclByaW1lcykgeworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTEpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEzMSkpOworfQorCitUWVBFRF9URVNUX1AoUHJpbWVUYWJsZVRlc3QyLCBDYW5HZXROZXh0UHJpbWUpIHsKKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDApKTsKKyAgRVhQRUNUX0VRKDMsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDIpKTsKKyAgRVhQRUNUX0VRKDUsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDMpKTsKKyAgRVhQRUNUX0VRKDcsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDUpKTsKKyAgRVhQRUNUX0VRKDExLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSg3KSk7CisgIEVYUEVDVF9FUSgxMzEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDEyOCkpOworfQorCisvLyBUeXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW52b2x2ZSBvbmUgZXh0cmEgc3RlcDogeW91IGhhdmUgdG8KKy8vIGVudW1lcmF0ZSB0aGUgdGVzdHMgeW91IGRlZmluZWQ6CitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCgKKyAgICBQcmltZVRhYmxlVGVzdDIsICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHRlc3QgY2FzZSBuYW1lLgorICAgIC8vIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgYXJlIHRoZSB0ZXN0IG5hbWVzLgorICAgIFJldHVybnNGYWxzZUZvck5vblByaW1lcywgUmV0dXJuc1RydWVGb3JQcmltZXMsIENhbkdldE5leHRQcmltZSk7CisKKy8vIEF0IHRoaXMgcG9pbnQgdGhlIHRlc3QgcGF0dGVybiBpcyBkb25lLiAgSG93ZXZlciwgeW91IGRvbid0IGhhdmUKKy8vIGFueSByZWFsIHRlc3QgeWV0IGFzIHlvdSBoYXZlbid0IHNhaWQgd2hpY2ggdHlwZXMgeW91IHdhbnQgdG8gcnVuCisvLyB0aGUgdGVzdHMgd2l0aC4KKworLy8gVG8gdHVybiB0aGUgYWJzdHJhY3QgdGVzdCBwYXR0ZXJuIGludG8gcmVhbCB0ZXN0cywgeW91IGluc3RhbnRpYXRlCisvLyBpdCB3aXRoIGEgbGlzdCBvZiB0eXBlcy4gIFVzdWFsbHkgdGhlIHRlc3QgcGF0dGVybiB3aWxsIGJlIGRlZmluZWQKKy8vIGluIGEgLmggZmlsZSwgYW5kIGFueW9uZSBjYW4gI2luY2x1ZGUgYW5kIGluc3RhbnRpYXRlIGl0LiAgWW91IGNhbgorLy8gZXZlbiBpbnN0YW50aWF0ZSBpdCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSBwcm9ncmFtLiAgVG8gdGVsbAorLy8gZGlmZmVyZW50IGluc3RhbmNlcyBhcGFydCwgeW91IGdpdmUgZWFjaCBvZiB0aGVtIGEgbmFtZSwgd2hpY2ggd2lsbAorLy8gYmVjb21lIHBhcnQgb2YgdGhlIHRlc3QgY2FzZSBuYW1lIGFuZCBjYW4gYmUgdXNlZCBpbiB0ZXN0IGZpbHRlcnMuCisKKy8vIFRoZSBsaXN0IG9mIHR5cGVzIHdlIHdhbnQgdG8gdGVzdC4gIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUKKy8vIGRlZmluZWQgYXQgdGhlIHRpbWUgd2Ugd3JpdGUgdGhlIFRZUEVEX1RFU1RfUCgpcy4KK3R5cGVkZWYgVHlwZXM8T25UaGVGbHlQcmltZVRhYmxlLCBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZT4KKyAgICBQcmltZVRhYmxlSW1wbGVtZW50YXRpb25zOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoT25UaGVGbHlBbmRQcmVDYWxjdWxhdGVkLCAgICAvLyBJbnN0YW5jZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltZVRhYmxlVGVzdDIsICAgICAgICAgICAgIC8vIFRlc3QgY2FzZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltZVRhYmxlSW1wbGVtZW50YXRpb25zKTsgIC8vIFR5cGUgbGlzdAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2NTFhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB0ZXN0IGNvbW1vbiBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlCisvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYW4gaW50ZXJmYWNlIChha2EgaW50ZXJmYWNlIHRlc3RzKSB1c2luZworLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4gRWFjaCB0ZXN0IGluIHRoZSB0ZXN0IGNhc2UgaGFzCisvLyBhIHBhcmFtZXRlciB0aGF0IGlzIGFuIGludGVyZmFjZSBwb2ludGVyIHRvIGFuIGltcGxlbWVudGF0aW9uCisvLyB0ZXN0ZWQuCisKKy8vIFRoZSBpbnRlcmZhY2UgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIHRoaXMgaGVhZGVyLgorI2luY2x1ZGUgInByaW1lX3RhYmxlcy5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKK3VzaW5nIDo6dGVzdGluZzo6VmFsdWVzOworCisvLyBBcyBhIGdlbmVyYWwgcnVsZSwgdG8gcHJldmVudCBhIHRlc3QgZnJvbSBhZmZlY3RpbmcgdGhlIHRlc3RzIHRoYXQgY29tZQorLy8gYWZ0ZXIgaXQsIHlvdSBzaG91bGQgY3JlYXRlIGFuZCBkZXN0cm95IHRoZSB0ZXN0ZWQgb2JqZWN0cyBmb3IgZWFjaCB0ZXN0CisvLyBpbnN0ZWFkIG9mIHJldXNpbmcgdGhlbS4gIEluIHRoaXMgc2FtcGxlIHdlIHdpbGwgZGVmaW5lIGEgc2ltcGxlIGZhY3RvcnkKKy8vIGZ1bmN0aW9uIGZvciBQcmltZVRhYmxlIG9iamVjdHMuICBXZSB3aWxsIGluc3RhbnRpYXRlIG9iamVjdHMgaW4gdGVzdCdzCisvLyBTZXRVcCgpIG1ldGhvZCBhbmQgZGVsZXRlIHRoZW0gaW4gVGVhckRvd24oKSBtZXRob2QuCit0eXBlZGVmIFByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGVGdW5jKCk7CisKK1ByaW1lVGFibGUqIENyZWF0ZU9uVGhlRmx5UHJpbWVUYWJsZSgpIHsKKyAgcmV0dXJuIG5ldyBPblRoZUZseVByaW1lVGFibGUoKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBtYXhfcHJlY2FsY3VsYXRlZD4KK1ByaW1lVGFibGUqIENyZWF0ZVByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKCkgeworICByZXR1cm4gbmV3IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKG1heF9wcmVjYWxjdWxhdGVkKTsKK30KKworLy8gSW5zaWRlIHRoZSB0ZXN0IGJvZHksIGZpeHR1cmUgY29uc3RydWN0b3IsIFNldFVwKCksIGFuZCBUZWFyRG93bigpIHlvdQorLy8gY2FuIHJlZmVyIHRvIHRoZSB0ZXN0IHBhcmFtZXRlciBieSBHZXRQYXJhbSgpLiAgSW4gdGhpcyBjYXNlLCB0aGUgdGVzdAorLy8gcGFyYW1ldGVyIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCB3ZSBjYWxsIGluIGZpeHR1cmUncyBTZXRVcCgpIHRvCisvLyBjcmVhdGUgYW5kIHN0b3JlIGFuIGluc3RhbmNlIG9mIFByaW1lVGFibGUuCitjbGFzcyBQcmltZVRhYmxlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPENyZWF0ZVByaW1lVGFibGVGdW5jKj4geworIHB1YmxpYzoKKyAgdmlydHVhbCB+UHJpbWVUYWJsZVRlc3QoKSB7IGRlbGV0ZSB0YWJsZV87IH0KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyB0YWJsZV8gPSAoKkdldFBhcmFtKCkpKCk7IH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGRlbGV0ZSB0YWJsZV87CisgICAgdGFibGVfID0gTlVMTDsKKyAgfQorCisgcHJvdGVjdGVkOgorICBQcmltZVRhYmxlKiB0YWJsZV87Cit9OworCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgeworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKC01KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSg0KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoNikpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEwMCkpOworfQorCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgyKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgzKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg1KSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg3KSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgxMSkpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMTMxKSk7Cit9CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgQ2FuR2V0TmV4dFByaW1lKSB7CisgIEVYUEVDVF9FUSgyLCB0YWJsZV8tPkdldE5leHRQcmltZSgwKSk7CisgIEVYUEVDVF9FUSgzLCB0YWJsZV8tPkdldE5leHRQcmltZSgyKSk7CisgIEVYUEVDVF9FUSg1LCB0YWJsZV8tPkdldE5leHRQcmltZSgzKSk7CisgIEVYUEVDVF9FUSg3LCB0YWJsZV8tPkdldE5leHRQcmltZSg1KSk7CisgIEVYUEVDVF9FUSgxMSwgdGFibGVfLT5HZXROZXh0UHJpbWUoNykpOworICBFWFBFQ1RfRVEoMTMxLCB0YWJsZV8tPkdldE5leHRQcmltZSgxMjgpKTsKK30KKworLy8gSW4gb3JkZXIgdG8gcnVuIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIHlvdSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZW0sCisvLyBvciBiaW5kIHRoZW0gdG8gYSBsaXN0IG9mIHZhbHVlcyB3aGljaCB3aWxsIGJlIHVzZWQgYXMgdGVzdCBwYXJhbWV0ZXJzLgorLy8gWW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtIGluIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIG1vZHVsZSwgb3IgZXZlbgorLy8gaW5zdGFudGlhdGUgdGhlbSBzZXZlcmFsIHRpbWVzLgorLy8KKy8vIEhlcmUsIHdlIGluc3RhbnRpYXRlIG91ciB0ZXN0cyB3aXRoIGEgbGlzdCBvZiB0d28gUHJpbWVUYWJsZSBvYmplY3QKKy8vIGZhY3RvcnkgZnVuY3Rpb25zOgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgT25UaGVGbHlBbmRQcmVDYWxjdWxhdGVkLAorICAgIFByaW1lVGFibGVUZXN0LAorICAgIFZhbHVlcygmQ3JlYXRlT25UaGVGbHlQcmltZVRhYmxlLCAmQ3JlYXRlUHJlQ2FsY3VsYXRlZFByaW1lVGFibGU8MTAwMD4pKTsKKworI2Vsc2UKKworLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgd2l0aCBzb21lCisvLyBjb21waWxlcnMuIElmIHdlIHVzZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBjb21waWxlIG91dCBhbGwKKy8vIGNvZGUgcmVmZXJyaW5nIHRvIHRoZSBndGVzdF9tYWluIGxpYnJhcnksIE1TVkMgbGlua2VyIHdpbGwgbm90IGxpbmsKKy8vIHRoYXQgbGlicmFyeSBhdCBhbGwgYW5kIGNvbnNlcXVlbnRseSBjb21wbGFpbiBhYm91dCBtaXNzaW5nIGVudHJ5CisvLyBwb2ludCBkZWZpbmVkIGluIHRoYXQgbGlicmFyeSAoZmF0YWwgZXJyb3IgTE5LMTU2MTogZW50cnkgcG9pbnQKKy8vIG11c3QgYmUgZGVmaW5lZCkuIFRoaXMgZHVtbXkgdGVzdCBrZWVwcyBndGVzdF9tYWluIGxpbmtlZCBpbi4KK1RFU1QoRHVtbXlUZXN0LCBWYWx1ZVBhcmFtZXRlcml6ZWRUZXN0c0FyZU5vdFN1cHBvcnRlZE9uVGhpc1BsYXRmb3JtKSB7fQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDJlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE3MyBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdGVzdCBjb2RlIHJlbHlpbmcgb24gc29tZSBnbG9iYWwgZmxhZyB2YXJpYWJsZXMuCisvLyBDb21iaW5lKCkgaGVscHMgd2l0aCBnZW5lcmF0aW5nIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2Ygc3VjaCBmbGFncywKKy8vIGFuZCBlYWNoIHRlc3QgaXMgZ2l2ZW4gb25lIGNvbWJpbmF0aW9uIGFzIGEgcGFyYW1ldGVyLgorCisvLyBVc2UgY2xhc3MgZGVmaW5pdGlvbnMgdG8gdGVzdCBmcm9tIHRoaXMgaGVhZGVyLgorI2luY2x1ZGUgInByaW1lX3RhYmxlcy5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFN1cHBvc2Ugd2Ugd2FudCB0byBpbnRyb2R1Y2UgYSBuZXcsIGltcHJvdmVkIGltcGxlbWVudGF0aW9uIG9mIFByaW1lVGFibGUKKy8vIHdoaWNoIGNvbWJpbmVzIHNwZWVkIG9mIFByZWNhbGNQcmltZVRhYmxlIGFuZCB2ZXJzYXRpbGl0eSBvZgorLy8gT25UaGVGbHlQcmltZVRhYmxlIChzZWUgcHJpbWVfdGFibGVzLmgpLiBJbnNpZGUgaXQgaW5zdGFudGlhdGVzIGJvdGgKKy8vIFByZWNhbGNQcmltZVRhYmxlIGFuZCBPblRoZUZseVByaW1lVGFibGUgYW5kIHVzZXMgdGhlIG9uZSB0aGF0IGlzIG1vcmUKKy8vIGFwcHJvcHJpYXRlIHVuZGVyIHRoZSBjaXJjdW1zdGFuY2VzLiBCdXQgaW4gbG93IG1lbW9yeSBjb25kaXRpb25zLCBpdCBjYW4gYmUKKy8vIHRvbGQgdG8gaW5zdGFudGlhdGUgd2l0aG91dCBQcmVjYWxjUHJpbWVUYWJsZSBpbnN0YW5jZSBhdCBhbGwgYW5kIHVzZSBvbmx5CisvLyBPblRoZUZseVByaW1lVGFibGUuCitjbGFzcyBIeWJyaWRQcmltZVRhYmxlIDogcHVibGljIFByaW1lVGFibGUgeworIHB1YmxpYzoKKyAgSHlicmlkUHJpbWVUYWJsZShib29sIGZvcmNlX29uX3RoZV9mbHksIGludCBtYXhfcHJlY2FsY3VsYXRlZCkKKyAgICAgIDogb25fdGhlX2ZseV9pbXBsXyhuZXcgT25UaGVGbHlQcmltZVRhYmxlKSwKKyAgICAgICAgcHJlY2FsY19pbXBsXyhmb3JjZV9vbl90aGVfZmx5ID8gTlVMTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZShtYXhfcHJlY2FsY3VsYXRlZCkpLAorICAgICAgICBtYXhfcHJlY2FsY3VsYXRlZF8obWF4X3ByZWNhbGN1bGF0ZWQpIHt9CisgIHZpcnR1YWwgfkh5YnJpZFByaW1lVGFibGUoKSB7CisgICAgZGVsZXRlIG9uX3RoZV9mbHlfaW1wbF87CisgICAgZGVsZXRlIHByZWNhbGNfaW1wbF87CisgIH0KKworICB2aXJ0dWFsIGJvb2wgSXNQcmltZShpbnQgbikgY29uc3QgeworICAgIGlmIChwcmVjYWxjX2ltcGxfICE9IE5VTEwgJiYgbiA8IG1heF9wcmVjYWxjdWxhdGVkXykKKyAgICAgIHJldHVybiBwcmVjYWxjX2ltcGxfLT5Jc1ByaW1lKG4pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBvbl90aGVfZmx5X2ltcGxfLT5Jc1ByaW1lKG4pOworICB9CisKKyAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCB7CisgICAgaW50IG5leHRfcHJpbWUgPSAtMTsKKyAgICBpZiAocHJlY2FsY19pbXBsXyAhPSBOVUxMICYmIHAgPCBtYXhfcHJlY2FsY3VsYXRlZF8pCisgICAgICBuZXh0X3ByaW1lID0gcHJlY2FsY19pbXBsXy0+R2V0TmV4dFByaW1lKHApOworCisgICAgcmV0dXJuIG5leHRfcHJpbWUgIT0gLTEgPyBuZXh0X3ByaW1lIDogb25fdGhlX2ZseV9pbXBsXy0+R2V0TmV4dFByaW1lKHApOworICB9CisKKyBwcml2YXRlOgorICBPblRoZUZseVByaW1lVGFibGUqIG9uX3RoZV9mbHlfaW1wbF87CisgIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKiBwcmVjYWxjX2ltcGxfOworICBpbnQgbWF4X3ByZWNhbGN1bGF0ZWRfOworfTsKKwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtOwordXNpbmcgOjp0ZXN0aW5nOjpCb29sOwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7Cit1c2luZyA6OnRlc3Rpbmc6OkNvbWJpbmU7CisKKy8vIFRvIHRlc3QgYWxsIGNvZGUgcGF0aHMgZm9yIEh5YnJpZFByaW1lVGFibGUgd2UgbXVzdCB0ZXN0IGl0IHdpdGggbnVtYmVycworLy8gYm90aCB3aXRoaW4gYW5kIG91dHNpZGUgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUncyBjYXBhY2l0eSBhbmQgYWxzbyB3aXRoCisvLyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSBkaXNhYmxlZC4gV2UgZG8gdGhpcyBieSBkZWZpbmluZyBmaXh0dXJlIHdoaWNoIHdpbGwKKy8vIGFjY2VwdCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHBhcmFtZXRlcnMgZm9yIGluc3RhbnRpYXRpbmcgYQorLy8gSHlicmlkUHJpbWVUYWJsZSBpbnN0YW5jZS4KK2NsYXNzIFByaW1lVGFibGVUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08IDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGludD4gPiB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gVGhpcyBjYW4gYmUgd3JpdHRlbiBhcworICAgIC8vCisgICAgLy8gYm9vbCBmb3JjZV9vbl90aGVfZmx5OworICAgIC8vIGludCBtYXhfcHJlY2FsY3VsYXRlZDsKKyAgICAvLyB0aWUoZm9yY2Vfb25fdGhlX2ZseSwgbWF4X3ByZWNhbGN1bGF0ZWQpID0gR2V0UGFyYW0oKTsKKyAgICAvLworICAgIC8vIG9uY2UgdGhlIEdvb2dsZSBDKysgU3R5bGUgR3VpZGUgYWxsb3dzIHVzZSBvZiA6OnN0ZDo6dHIxOjp0aWUuCisgICAgLy8KKyAgICBib29sIGZvcmNlX29uX3RoZV9mbHkgPSA6OnN0ZDo6dHIxOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgaW50IG1heF9wcmVjYWxjdWxhdGVkID0gOjpzdGQ6OnRyMTo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgIHRhYmxlXyA9IG5ldyBIeWJyaWRQcmltZVRhYmxlKGZvcmNlX29uX3RoZV9mbHksIG1heF9wcmVjYWxjdWxhdGVkKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgZGVsZXRlIHRhYmxlXzsKKyAgICB0YWJsZV8gPSBOVUxMOworICB9CisgIEh5YnJpZFByaW1lVGFibGUqIHRhYmxlXzsKK307CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzKSB7CisgIC8vIEluc2lkZSB0aGUgdGVzdCBib2R5LCB5b3UgY2FuIHJlZmVyIHRvIHRoZSB0ZXN0IHBhcmFtZXRlciBieSBHZXRQYXJhbSgpLgorICAvLyBJbiB0aGlzIGNhc2UsIHRoZSB0ZXN0IHBhcmFtZXRlciBpcyBhIFByaW1lVGFibGUgaW50ZXJmYWNlIHBvaW50ZXIgd2hpY2gKKyAgLy8gd2UgY2FuIHVzZSBkaXJlY3RseS4KKyAgLy8gUGxlYXNlIG5vdGUgdGhhdCB5b3UgY2FuIGFsc28gc2F2ZSBpdCBpbiB0aGUgZml4dHVyZSdzIFNldFVwKCkgbWV0aG9kCisgIC8vIG9yIGNvbnN0cnVjdG9yIGFuZCB1c2Ugc2F2ZWQgY29weSBpbiB0aGUgdGVzdHMuCisKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgtNSkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoNCkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgxMDApKTsKK30KKworVEVTVF9QKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zVHJ1ZUZvclByaW1lcykgeworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMykpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoNykpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMTEpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDEzMSkpOworfQorCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIENhbkdldE5leHRQcmltZSkgeworICBFWFBFQ1RfRVEoMiwgdGFibGVfLT5HZXROZXh0UHJpbWUoMCkpOworICBFWFBFQ1RfRVEoMywgdGFibGVfLT5HZXROZXh0UHJpbWUoMikpOworICBFWFBFQ1RfRVEoNSwgdGFibGVfLT5HZXROZXh0UHJpbWUoMykpOworICBFWFBFQ1RfRVEoNywgdGFibGVfLT5HZXROZXh0UHJpbWUoNSkpOworICBFWFBFQ1RfRVEoMTEsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDcpKTsKKyAgRVhQRUNUX0VRKDEzMSwgdGFibGVfLT5HZXROZXh0UHJpbWUoMTI4KSk7Cit9CisKKy8vIEluIG9yZGVyIHRvIHJ1biB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCB5b3UgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGVtLAorLy8gb3IgYmluZCB0aGVtIHRvIGEgbGlzdCBvZiB2YWx1ZXMgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRlc3QgcGFyYW1ldGVycy4KKy8vIFlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbSBpbiBhIGRpZmZlcmVudCB0cmFuc2xhdGlvbiBtb2R1bGUsIG9yIGV2ZW4KKy8vIGluc3RhbnRpYXRlIHRoZW0gc2V2ZXJhbCB0aW1lcy4KKy8vCisvLyBIZXJlLCB3ZSBpbnN0YW50aWF0ZSBvdXIgdGVzdHMgd2l0aCBhIGxpc3Qgb2YgcGFyYW1ldGVycy4gV2UgbXVzdCBjb21iaW5lCisvLyBhbGwgdmFyaWF0aW9ucyBvZiB0aGUgYm9vbGVhbiBmbGFnIHN1cHByZXNzaW5nIFByZWNhbGNQcmltZVRhYmxlIGFuZCBzb21lCisvLyBtZWFuaW5nZnVsIHZhbHVlcyBmb3IgdGVzdHMuIFdlIGNob29zZSBhIHNtYWxsIHZhbHVlICgxKSwgYW5kIGEgdmFsdWUgdGhhdAorLy8gd2lsbCBwdXQgc29tZSBvZiB0aGUgdGVzdGVkIG51bWJlcnMgYmV5b25kIHRoZSBjYXBhYmlsaXR5IG9mIHRoZQorLy8gUHJlY2FsY1ByaW1lVGFibGUgaW5zdGFuY2UgYW5kIHNvbWUgaW5zaWRlIGl0ICgxMCkuIENvbWJpbmUgd2lsbCBwcm9kdWNlIGFsbAorLy8gcG9zc2libGUgY29tYmluYXRpb25zLgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVhbmluZ2Z1bFRlc3RQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWVUYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgVmFsdWVzKDEsIDEwKSkpOworCisjZWxzZQorCisvLyBHb29nbGUgVGVzdCBtYXkgbm90IHN1cHBvcnQgQ29tYmluZSgpIHdpdGggc29tZSBjb21waWxlcnMuIElmIHdlCisvLyB1c2UgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gY29tcGlsZSBvdXQgYWxsIGNvZGUgcmVmZXJyaW5nIHRvCisvLyB0aGUgZ3Rlc3RfbWFpbiBsaWJyYXJ5LCBNU1ZDIGxpbmtlciB3aWxsIG5vdCBsaW5rIHRoYXQgbGlicmFyeSBhdAorLy8gYWxsIGFuZCBjb25zZXF1ZW50bHkgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBlbnRyeSBwb2ludCBkZWZpbmVkIGluCisvLyB0aGF0IGxpYnJhcnkgKGZhdGFsIGVycm9yIExOSzE1NjE6IGVudHJ5IHBvaW50IG11c3QgYmUKKy8vIGRlZmluZWQpLiBUaGlzIGR1bW15IHRlc3Qga2VlcHMgZ3Rlc3RfbWFpbiBsaW5rZWQgaW4uCitURVNUKER1bW15VGVzdCwgQ29tYmluZUlzTm90U3VwcG9ydGVkT25UaGlzUGxhdGZvcm0pIHt9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlMjA3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTYwIEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHVzZSBHb29nbGUgVGVzdCBsaXN0ZW5lciBBUEkgdG8gaW1wbGVtZW50CisvLyBhbiBhbHRlcm5hdGl2ZSBjb25zb2xlIG91dHB1dCBhbmQgaG93IHRvIHVzZSB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkKKy8vIHRvIGVudW1lcmF0ZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyBhbmQgdG8gaW5zcGVjdCB0aGVpciByZXN1bHRzLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIDo6dGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RDYXNlOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RJbmZvOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKK25hbWVzcGFjZSB7CisKKy8vIFByb3ZpZGVzIGFsdGVybmF0aXZlIG91dHB1dCBtb2RlIHdoaWNoIHByb2R1Y2VzIG1pbmltYWwgYW1vdW50IG9mCisvLyBpbmZvcm1hdGlvbiBhYm91dCB0ZXN0cy4KK2NsYXNzIFRlcnNlUHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwcml2YXRlOgorICAvLyBDYWxsZWQgYmVmb3JlIGFueSB0ZXN0IGFjdGl2aXR5IHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovKSB7fQorCisgIC8vIENhbGxlZCBhZnRlciBhbGwgdGVzdCBhY3Rpdml0aWVzIGhhdmUgZW5kZWQuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwgIlRFU1QgJXNcbiIsIHVuaXRfdGVzdC5QYXNzZWQoKSA/ICJQQVNTRUQiIDogIkZBSUxFRCIpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9CisKKyAgLy8gQ2FsbGVkIGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIGZwcmludGYoc3Rkb3V0LAorICAgICAgICAgICAgIioqKiBUZXN0ICVzLiVzIHN0YXJ0aW5nLlxuIiwKKyAgICAgICAgICAgIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLAorICAgICAgICAgICAgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KKworICAvLyBDYWxsZWQgYWZ0ZXIgYSBmYWlsZWQgYXNzZXJ0aW9uIG9yIGEgU1VDQ0VFRCgpIGludm9jYXRpb24uCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgICAgZnByaW50ZihzdGRvdXQsCisgICAgICAgICAgICAiJXMgaW4gJXM6JWRcbiVzXG4iLAorICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5mYWlsZWQoKSA/ICIqKiogRmFpbHVyZSIgOiAiU3VjY2VzcyIsCisgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpLAorICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpLAorICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5zdW1tYXJ5KCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9CisKKyAgLy8gQ2FsbGVkIGFmdGVyIGEgdGVzdCBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwKKyAgICAgICAgICAgICIqKiogVGVzdCAlcy4lcyBlbmRpbmcuXG4iLAorICAgICAgICAgICAgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksCisgICAgICAgICAgICB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgfQorfTsgIC8vIGNsYXNzIFRlcnNlUHJpbnRlcgorCitURVNUKEN1c3RvbU91dHB1dFRlc3QsIFByaW50c01lc3NhZ2UpIHsKKyAgcHJpbnRmKCJQcmludGluZyBzb21ldGhpbmcgZnJvbSB0aGUgdGVzdCBib2R5Li4uXG4iKTsKK30KKworVEVTVChDdXN0b21PdXRwdXRUZXN0LCBTdWNjZWVkcykgeworICBTVUNDRUVEKCkgPDwgIlNVQ0NFRUQoKSBoYXMgYmVlbiBpbnZva2VkIGZyb20gaGVyZSI7Cit9CisKK1RFU1QoQ3VzdG9tT3V0cHV0VGVzdCwgRmFpbHMpIHsKKyAgRVhQRUNUX0VRKDEsIDIpCisgICAgICA8PCAiVGhpcyB0ZXN0IGZhaWxzIGluIG9yZGVyIHRvIGRlbW9uc3RyYXRlIGFsdGVybmF0aXZlIGZhaWx1cmUgbWVzc2FnZXMiOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBib29sIHRlcnNlX291dHB1dCA9IGZhbHNlOworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItLXRlcnNlX291dHB1dCIpID09IDAgKQorICAgIHRlcnNlX291dHB1dCA9IHRydWU7CisgIGVsc2UKKyAgICBwcmludGYoIiVzXG4iLCAiUnVuIHRoaXMgcHJvZ3JhbSB3aXRoIC0tdGVyc2Vfb3V0cHV0IHRvIGNoYW5nZSB0aGUgd2F5ICIKKyAgICAgICAgICAgIml0IHByaW50cyBpdHMgb3V0cHV0LiIpOworCisgIFVuaXRUZXN0JiB1bml0X3Rlc3QgPSAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisKKyAgLy8gSWYgd2UgYXJlIGdpdmVuIHRoZSAtLXRlcnNlX291dHB1dCBjb21tYW5kIGxpbmUgZmxhZywgc3VwcHJlc3NlcyB0aGUKKyAgLy8gc3RhbmRhcmQgb3V0cHV0IGFuZCBhdHRhY2hlcyBvd24gcmVzdWx0IHByaW50ZXIuCisgIGlmICh0ZXJzZV9vdXRwdXQpIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9IHVuaXRfdGVzdC5saXN0ZW5lcnMoKTsKKworICAgIC8vIFJlbW92ZXMgdGhlIGRlZmF1bHQgY29uc29sZSBvdXRwdXQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBzbyBpdCB3aWxsCisgICAgLy8gbm90IHJlY2VpdmUgZXZlbnRzIGZyb20gR29vZ2xlIFRlc3QgYW5kIHdvbid0IHByaW50IGFueSBvdXRwdXQuIFNpbmNlCisgICAgLy8gdGhpcyBvcGVyYXRpb24gdHJhbnNmZXJzIG93bmVyc2hpcCBvZiB0aGUgbGlzdGVuZXIgdG8gdGhlIGNhbGxlciB3ZQorICAgIC8vIGhhdmUgdG8gZGVsZXRlIGl0IGFzIHdlbGwuCisgICAgZGVsZXRlIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkpOworCisgICAgLy8gQWRkcyB0aGUgY3VzdG9tIG91dHB1dCBsaXN0ZW5lciB0byB0aGUgbGlzdC4gSXQgd2lsbCBub3cgcmVjZWl2ZQorICAgIC8vIGV2ZW50cyBmcm9tIEdvb2dsZSBUZXN0IGFuZCBwcmludCB0aGUgYWx0ZXJuYXRpdmUgb3V0cHV0LiBXZSBkb24ndAorICAgIC8vIGhhdmUgdG8gd29ycnkgYWJvdXQgZGVsZXRpbmcgaXQgc2luY2UgR29vZ2xlIFRlc3QgYXNzdW1lcyBvd25lcnNoaXAKKyAgICAvLyBvdmVyIGl0IGFmdGVyIGFkZGluZyBpdCB0byB0aGUgbGlzdC4KKyAgICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBUZXJzZVByaW50ZXIpOworICB9CisgIGludCByZXRfdmFsID0gUlVOX0FMTF9URVNUUygpOworCisgIC8vIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkgdG8gaW5zcGVjdCB0ZXN0CisgIC8vIHJlc3VsdHMuIEhlcmUgd2UgZGlzY291bnQgZmFpbHVyZXMgZnJvbSB0aGUgdGVzdHMgd2UgZXhwZWN0ZWQgdG8gZmFpbC4KKyAgaW50IHVuZXhwZWN0ZWRseV9mYWlsZWRfdGVzdHMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2opIHsKKyAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8gPSAqdGVzdF9jYXNlLkdldFRlc3RJbmZvKGopOworICAgICAgLy8gQ291bnRzIGZhaWxlZCB0ZXN0cyB0aGF0IHdlcmUgbm90IG1lYW50IHRvIGZhaWwgKHRob3NlIHdpdGhvdXQKKyAgICAgIC8vICdGYWlscycgaW4gdGhlIG5hbWUpLgorICAgICAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+RmFpbGVkKCkgJiYKKyAgICAgICAgICBzdHJjbXAodGVzdF9pbmZvLm5hbWUoKSwgIkZhaWxzIikgIT0gMCkgeworICAgICAgICB1bmV4cGVjdGVkbHlfZmFpbGVkX3Rlc3RzKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVGVzdCB0aGF0IHdlcmUgbWVhbnQgdG8gZmFpbCBzaG91bGQgbm90IGFmZmVjdCB0aGUgdGVzdCBwcm9ncmFtIG91dGNvbWUuCisgIGlmICh1bmV4cGVjdGVkbHlfZmFpbGVkX3Rlc3RzID09IDApCisgICAgcmV0X3ZhbCA9IDA7CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3ZWY3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weQpAQCAtMCwwICsxLDI1MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiZnVzZV9ndGVzdF9maWxlcy5weSB2MC4yLjAKK0Z1c2VzIEdvb2dsZSBUZXN0IHNvdXJjZSBjb2RlIGludG8gYSAuaCBmaWxlIGFuZCBhIC5jYyBmaWxlLgorCitTWU5PUFNJUworICAgICAgIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgW0dURVNUX1JPT1RfRElSXSBPVVRQVVRfRElSCisKKyAgICAgICBTY2FucyBHVEVTVF9ST09UX0RJUiBmb3IgR29vZ2xlIFRlc3Qgc291cmNlIGNvZGUsIGFuZCBnZW5lcmF0ZXMKKyAgICAgICB0d28gZmlsZXM6IE9VVFBVVF9ESVIvZ3Rlc3QvZ3Rlc3QuaCBhbmQgT1VUUFVUX0RJUi9ndGVzdC9ndGVzdC1hbGwuY2MuCisgICAgICAgVGhlbiB5b3UgY2FuIGJ1aWxkIHlvdXIgdGVzdHMgYnkgYWRkaW5nIE9VVFBVVF9ESVIgdG8gdGhlIGluY2x1ZGUKKyAgICAgICBzZWFyY2ggcGF0aCBhbmQgbGlua2luZyB3aXRoIE9VVFBVVF9ESVIvZ3Rlc3QvZ3Rlc3QtYWxsLmNjLiAgVGhlc2UKKyAgICAgICB0d28gZmlsZXMgY29udGFpbiBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHVzZSBHb29nbGUgVGVzdC4gIEhlbmNlCisgICAgICAgeW91IGNhbiAiaW5zdGFsbCIgR29vZ2xlIFRlc3QgYnkgY29weWluZyB0aGVtIHRvIHdoZXJldmVyIHlvdSB3YW50LgorCisgICAgICAgR1RFU1RfUk9PVF9ESVIgY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIHRoZSBwYXJlbnQKKyAgICAgICBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoaXMgc2NyaXB0LgorCitFWEFNUExFUworICAgICAgIC4vZnVzZV9ndGVzdF9maWxlcy5weSBmdXNlZF9ndGVzdAorICAgICAgIC4vZnVzZV9ndGVzdF9maWxlcy5weSBwYXRoL3RvL3VucGFja2VkL2d0ZXN0IGZ1c2VkX2d0ZXN0CisKK1RoaXMgdG9vbCBpcyBleHBlcmltZW50YWwuICBJbiBwYXJ0aWN1bGFyLCBpdCBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgbm8KK2NvbmRpdGlvbmFsIGluY2x1c2lvbiBvZiBHb29nbGUgVGVzdCBoZWFkZXJzLiAgUGxlYXNlIHJlcG9ydCBhbnkKK3Byb2JsZW1zIHRvIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbS4gIFlvdSBjYW4gcmVhZAoraHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9Hb29nbGVUZXN0QWR2YW5jZWRHdWlkZSBmb3IKK21vcmUgaW5mb3JtYXRpb24uCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzZXRzCitpbXBvcnQgc3lzCisKKyMgV2UgYXNzdW1lIHRoYXQgdGhpcyBmaWxlIGlzIGluIHRoZSBzY3JpcHRzLyBkaXJlY3RvcnkgaW4gdGhlIEdvb2dsZQorIyBUZXN0IHJvb3QgZGlyZWN0b3J5LgorREVGQVVMVF9HVEVTVF9ST09UX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nKQorCisjIFJlZ2V4IGZvciBtYXRjaGluZyAnI2luY2x1ZGUgImd0ZXN0Ly4uLiInLgorSU5DTFVERV9HVEVTVF9GSUxFX1JFR0VYID0gcmUuY29tcGlsZShyJ15ccyojXHMqaW5jbHVkZVxzKiIoZ3Rlc3QvLispIicpCisKKyMgUmVnZXggZm9yIG1hdGNoaW5nICcjaW5jbHVkZSAic3JjLy4uLiInLgorSU5DTFVERV9TUkNfRklMRV9SRUdFWCA9IHJlLmNvbXBpbGUocideXHMqI1xzKmluY2x1ZGVccyoiKHNyYy8uKykiJykKKworIyBXaGVyZSB0byBmaW5kIHRoZSBzb3VyY2Ugc2VlZCBmaWxlcy4KK0dURVNUX0hfU0VFRCA9ICdpbmNsdWRlL2d0ZXN0L2d0ZXN0LmgnCitHVEVTVF9TUElfSF9TRUVEID0gJ2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgnCitHVEVTVF9BTExfQ0NfU0VFRCA9ICdzcmMvZ3Rlc3QtYWxsLmNjJworCisjIFdoZXJlIHRvIHB1dCB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorR1RFU1RfSF9PVVRQVVQgPSAnZ3Rlc3QvZ3Rlc3QuaCcKK0dURVNUX0FMTF9DQ19PVVRQVVQgPSAnZ3Rlc3QvZ3Rlc3QtYWxsLmNjJworCisKK2RlZiBWZXJpZnlGaWxlRXhpc3RzKGRpcmVjdG9yeSwgcmVsYXRpdmVfcGF0aCk6CisgICIiIlZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIGZpbGUgZXhpc3RzOyBhYm9ydHMgb24gZmFpbHVyZS4KKworICByZWxhdGl2ZV9wYXRoIGlzIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAgIiIiCisKKyAgaWYgbm90IG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihkaXJlY3RvcnksIHJlbGF0aXZlX3BhdGgpKToKKyAgICBwcmludCAnRVJST1I6IENhbm5vdCBmaW5kICVzIGluIGRpcmVjdG9yeSAlcy4nICUgKHJlbGF0aXZlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkpCisgICAgcHJpbnQgKCdQbGVhc2UgZWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5ICcKKyAgICAgICAgICAgJ29yIG9taXQgaXQgb24gdGhlIGNvbW1hbmQgbGluZS4nKQorICAgIHN5cy5leGl0KDEpCisKKworZGVmIFZhbGlkYXRlR1Rlc3RSb290RGlyKGd0ZXN0X3Jvb3QpOgorICAiIiJNYWtlcyBzdXJlIGd0ZXN0X3Jvb3QgcG9pbnRzIHRvIGEgdmFsaWQgZ3Rlc3Qgcm9vdCBkaXJlY3RvcnkuCisKKyAgVGhlIGZ1bmN0aW9uIGFib3J0cyB0aGUgcHJvZ3JhbSBvbiBmYWlsdXJlLgorICAiIiIKKworICBWZXJpZnlGaWxlRXhpc3RzKGd0ZXN0X3Jvb3QsIEdURVNUX0hfU0VFRCkKKyAgVmVyaWZ5RmlsZUV4aXN0cyhndGVzdF9yb290LCBHVEVTVF9BTExfQ0NfU0VFRCkKKworCitkZWYgVmVyaWZ5T3V0cHV0RmlsZShvdXRwdXRfZGlyLCByZWxhdGl2ZV9wYXRoKToKKyAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gb3V0cHV0IGZpbGUgcGF0aCBpcyB2YWxpZC4KKworICByZWxhdGl2ZV9wYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXRfZGlyIGRpcmVjdG9yeS4KKyAgIiIiCisKKyAgIyBNYWtlcyBzdXJlIHRoZSBvdXRwdXQgZmlsZSBlaXRoZXIgZG9lc24ndCBleGlzdCBvciBjYW4gYmUgb3ZlcndyaXR0ZW4uCisgIG91dHB1dF9maWxlID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIHJlbGF0aXZlX3BhdGgpCisgIGlmIG9zLnBhdGguZXhpc3RzKG91dHB1dF9maWxlKToKKyAgICAjIFRPRE8od2FuQGdvb2dsZS5jb20pOiBUaGUgZm9sbG93aW5nIHVzZXItaW50ZXJhY3Rpb24gZG9lc24ndAorICAgICMgd29yayB3aXRoIGF1dG9tYXRlZCBwcm9jZXNzZXMuICBXZSBzaG91bGQgcHJvdmlkZSBhIHdheSBmb3IgdGhlCisgICAgIyBNYWtlZmlsZSB0byBmb3JjZSBvdmVyd3JpdGluZyB0aGUgZmlsZXMuCisgICAgcHJpbnQgKCclcyBhbHJlYWR5IGV4aXN0cyBpbiBkaXJlY3RvcnkgJXMgLSBvdmVyd3JpdGUgaXQ/ICh5L04pICcgJQorICAgICAgICAgICAocmVsYXRpdmVfcGF0aCwgb3V0cHV0X2RpcikpCisgICAgYW5zd2VyID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkuc3RyaXAoKQorICAgIGlmIGFuc3dlciBub3QgaW4gWyd5JywgJ1knXToKKyAgICAgIHByaW50ICdBQk9SVEVELicKKyAgICAgIHN5cy5leGl0KDEpCisKKyAgIyBNYWtlcyBzdXJlIHRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgb3V0cHV0IGZpbGUgZXhpc3RzOyBjcmVhdGVzCisgICMgaXQgYW5kIGFsbCBpdHMgYW5jZXN0b3JzIGlmIG5lY2Vzc2FyeS4KKyAgcGFyZW50X2RpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZShvdXRwdXRfZmlsZSkKKyAgaWYgbm90IG9zLnBhdGguaXNkaXIocGFyZW50X2RpcmVjdG9yeSk6CisgICAgb3MubWFrZWRpcnMocGFyZW50X2RpcmVjdG9yeSkKKworCitkZWYgVmFsaWRhdGVPdXRwdXREaXIob3V0cHV0X2Rpcik6CisgICIiIk1ha2VzIHN1cmUgb3V0cHV0X2RpciBwb2ludHMgdG8gYSB2YWxpZCBvdXRwdXQgZGlyZWN0b3J5LgorCisgIFRoZSBmdW5jdGlvbiBhYm9ydHMgdGhlIHByb2dyYW0gb24gZmFpbHVyZS4KKyAgIiIiCisKKyAgVmVyaWZ5T3V0cHV0RmlsZShvdXRwdXRfZGlyLCBHVEVTVF9IX09VVFBVVCkKKyAgVmVyaWZ5T3V0cHV0RmlsZShvdXRwdXRfZGlyLCBHVEVTVF9BTExfQ0NfT1VUUFVUKQorCisKK2RlZiBGdXNlR1Rlc3RIKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpOgorICAiIiJTY2FucyBmb2xkZXIgZ3Rlc3Rfcm9vdCB0byBnZW5lcmF0ZSBndGVzdC9ndGVzdC5oIGluIG91dHB1dF9kaXIuIiIiCisKKyAgb3V0cHV0X2ZpbGUgPSBmaWxlKG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBHVEVTVF9IX09VVFBVVCksICd3JykKKyAgcHJvY2Vzc2VkX2ZpbGVzID0gc2V0cy5TZXQoKSAgIyBIb2xkcyBhbGwgZ3Rlc3QgaGVhZGVycyB3ZSd2ZSBwcm9jZXNzZWQuCisKKyAgZGVmIFByb2Nlc3NGaWxlKGd0ZXN0X2hlYWRlcl9wYXRoKToKKyAgICAiIiJQcm9jZXNzZXMgdGhlIGdpdmVuIGd0ZXN0IGhlYWRlciBmaWxlLiIiIgorCisgICAgIyBXZSBkb24ndCBwcm9jZXNzIHRoZSBzYW1lIGhlYWRlciB0d2ljZS4KKyAgICBpZiBndGVzdF9oZWFkZXJfcGF0aCBpbiBwcm9jZXNzZWRfZmlsZXM6CisgICAgICByZXR1cm4KKworICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoZ3Rlc3RfaGVhZGVyX3BhdGgpCisKKyAgICAjIFJlYWRzIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZ3Rlc3QgaGVhZGVyLgorICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKGd0ZXN0X3Jvb3QsIGd0ZXN0X2hlYWRlcl9wYXRoKSwgJ3InKToKKyAgICAgIG0gPSBJTkNMVURFX0dURVNUX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgIGlmIG06CisgICAgICAgICMgSXQncyAnI2luY2x1ZGUgImd0ZXN0Ly4uLiInIC0gbGV0J3MgcHJvY2VzcyBpdCByZWN1cnNpdmVseS4KKyAgICAgICAgUHJvY2Vzc0ZpbGUoJ2luY2x1ZGUvJyArIG0uZ3JvdXAoMSkpCisgICAgICBlbHNlOgorICAgICAgICAjIE90aGVyd2lzZSB3ZSBjb3B5IHRoZSBsaW5lIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0IGZpbGUuCisgICAgICAgIG91dHB1dF9maWxlLndyaXRlKGxpbmUpCisKKyAgUHJvY2Vzc0ZpbGUoR1RFU1RfSF9TRUVEKQorICBvdXRwdXRfZmlsZS5jbG9zZSgpCisKKworZGVmIEZ1c2VHVGVzdEFsbENjVG9GaWxlKGd0ZXN0X3Jvb3QsIG91dHB1dF9maWxlKToKKyAgIiIiU2NhbnMgZm9sZGVyIGd0ZXN0X3Jvb3QgdG8gZ2VuZXJhdGUgZ3Rlc3QvZ3Rlc3QtYWxsLmNjIGluIG91dHB1dF9maWxlLiIiIgorCisgIHByb2Nlc3NlZF9maWxlcyA9IHNldHMuU2V0KCkKKworICBkZWYgUHJvY2Vzc0ZpbGUoZ3Rlc3Rfc291cmNlX2ZpbGUpOgorICAgICIiIlByb2Nlc3NlcyB0aGUgZ2l2ZW4gZ3Rlc3Qgc291cmNlIGZpbGUuIiIiCisKKyAgICAjIFdlIGRvbid0IHByb2Nlc3MgdGhlIHNhbWUgI2luY2x1ZGVkIGZpbGUgdHdpY2UuCisgICAgaWYgZ3Rlc3Rfc291cmNlX2ZpbGUgaW4gcHJvY2Vzc2VkX2ZpbGVzOgorICAgICAgcmV0dXJuCisKKyAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKGd0ZXN0X3NvdXJjZV9maWxlKQorCisgICAgIyBSZWFkcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGd0ZXN0IHNvdXJjZSBmaWxlLgorICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKGd0ZXN0X3Jvb3QsIGd0ZXN0X3NvdXJjZV9maWxlKSwgJ3InKToKKyAgICAgIG0gPSBJTkNMVURFX0dURVNUX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgIGlmIG06CisgICAgICAgIGlmICdpbmNsdWRlLycgKyBtLmdyb3VwKDEpID09IEdURVNUX1NQSV9IX1NFRUQ6CisgICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiJy4gIFRoaXMgZmlsZSBpcyBub3QKKyAgICAgICAgICAjICNpbmNsdWRlZCBieSAiZ3Rlc3QvZ3Rlc3QuaCIsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyBpdC4KKyAgICAgICAgICBQcm9jZXNzRmlsZShHVEVTVF9TUElfSF9TRUVEKQorICAgICAgICBlbHNlOgorICAgICAgICAgICMgSXQncyAnI2luY2x1ZGUgImd0ZXN0L2Zvby5oIicgd2hlcmUgZm9vIGlzIG5vdCBndGVzdC1zcGkuCisgICAgICAgICAgIyBXZSB0cmVhdCBpdCBhcyAnI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiJywgYXMgYWxsIG90aGVyCisgICAgICAgICAgIyBndGVzdCBoZWFkZXJzIGFyZSBiZWluZyBmdXNlZCBpbnRvIGd0ZXN0LmggYW5kIGNhbm5vdCBiZQorICAgICAgICAgICMgI2luY2x1ZGVkIGRpcmVjdGx5LgorCisgICAgICAgICAgIyBUaGVyZSBpcyBubyBuZWVkIHRvICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIiBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgICBpZiBub3QgR1RFU1RfSF9TRUVEIGluIHByb2Nlc3NlZF9maWxlczoKKyAgICAgICAgICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoR1RFU1RfSF9TRUVEKQorICAgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoJyNpbmNsdWRlICIlcyJcbicgJSAoR1RFU1RfSF9PVVRQVVQsKSkKKyAgICAgIGVsc2U6CisgICAgICAgIG0gPSBJTkNMVURFX1NSQ19GSUxFX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAic3JjL2ZvbyInIC0gbGV0J3MgcHJvY2VzcyBpdCByZWN1cnNpdmVseS4KKyAgICAgICAgICBQcm9jZXNzRmlsZShtLmdyb3VwKDEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgIG91dHB1dF9maWxlLndyaXRlKGxpbmUpCisKKyAgUHJvY2Vzc0ZpbGUoR1RFU1RfQUxMX0NDX1NFRUQpCisKKworZGVmIEZ1c2VHVGVzdEFsbENjKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpOgorICAiIiJTY2FucyBmb2xkZXIgZ3Rlc3Rfcm9vdCB0byBnZW5lcmF0ZSBndGVzdC9ndGVzdC1hbGwuY2MgaW4gb3V0cHV0X2Rpci4iIiIKKworICBvdXRwdXRfZmlsZSA9IGZpbGUob3MucGF0aC5qb2luKG91dHB1dF9kaXIsIEdURVNUX0FMTF9DQ19PVVRQVVQpLCAndycpCisgIEZ1c2VHVGVzdEFsbENjVG9GaWxlKGd0ZXN0X3Jvb3QsIG91dHB1dF9maWxlKQorICBvdXRwdXRfZmlsZS5jbG9zZSgpCisKKworZGVmIEZ1c2VHVGVzdChndGVzdF9yb290LCBvdXRwdXRfZGlyKToKKyAgIiIiRnVzZXMgZ3Rlc3QuaCBhbmQgZ3Rlc3QtYWxsLmNjLiIiIgorCisgIFZhbGlkYXRlR1Rlc3RSb290RGlyKGd0ZXN0X3Jvb3QpCisgIFZhbGlkYXRlT3V0cHV0RGlyKG91dHB1dF9kaXIpCisKKyAgRnVzZUdUZXN0SChndGVzdF9yb290LCBvdXRwdXRfZGlyKQorICBGdXNlR1Rlc3RBbGxDYyhndGVzdF9yb290LCBvdXRwdXRfZGlyKQorCisKK2RlZiBtYWluKCk6CisgIGFyZ2MgPSBsZW4oc3lzLmFyZ3YpCisgIGlmIGFyZ2MgPT0gMjoKKyAgICAjIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgT1VUUFVUX0RJUgorICAgIEZ1c2VHVGVzdChERUZBVUxUX0dURVNUX1JPT1RfRElSLCBzeXMuYXJndlsxXSkKKyAgZWxpZiBhcmdjID09IDM6CisgICAgIyBmdXNlX2d0ZXN0X2ZpbGVzLnB5IEdURVNUX1JPT1RfRElSIE9VVFBVVF9ESVIKKyAgICBGdXNlR1Rlc3Qoc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdKQorICBlbHNlOgorICAgIHByaW50IF9fZG9jX18KKyAgICBzeXMuZXhpdCgxKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zY3JpcHRzL2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTdhYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zY3JpcHRzL2dlbl9ndGVzdF9wcmVkX2ltcGwucHkKQEAgLTAsMCArMSw3MzAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiImdlbl9ndGVzdF9wcmVkX2ltcGwucHkgdjAuMQorCitHZW5lcmF0ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIEdvb2dsZSBUZXN0IHByZWRpY2F0ZSBhc3NlcnRpb25zIGFuZAorYWNjb21wYW55aW5nIHRlc3RzLgorCitVc2FnZToKKworICBnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IE1BWF9BUklUWQorCit3aGVyZSBNQVhfQVJJVFkgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLgorCitUaGUgY29tbWFuZCBnZW5lcmF0ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHVwLXRvIE1BWF9BUklUWS1hcnkKK3ByZWRpY2F0ZSBhc3NlcnRpb25zLCBhbmQgd3JpdGVzIGl0IHRvIGZpbGUgZ3Rlc3RfcHJlZF9pbXBsLmggaW4gdGhlCitkaXJlY3Rvcnkgd2hlcmUgdGhlIHNjcmlwdCBpcy4gIEl0IGFsc28gZ2VuZXJhdGVzIHRoZSBhY2NvbXBhbnlpbmcKK3VuaXQgdGVzdCBpbiBmaWxlIGd0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKKyMgV2hlcmUgdGhpcyBzY3JpcHQgaXMuCitTQ1JJUFRfRElSID0gb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKQorCisjIFdoZXJlIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgaGVhZGVyLgorSEVBREVSID0gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsICcuLi9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oJykKKworIyBXaGVyZSB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIHVuaXQgdGVzdC4KK1VOSVRfVEVTVCA9IG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCAnLi4vdGVzdC9ndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MnKQorCisKK2RlZiBIZWFkZXJQcmVhbWJsZShuKToKKyAgIiIiUmV0dXJucyB0aGUgcHJlYW1ibGUgZm9yIHRoZSBoZWFkZXIgZmlsZS4KKworICBBcmdzOgorICAgIG46ICB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgcHJlZGljYXRlIG1hY3JvcyB0byBiZSBnZW5lcmF0ZWQuCisgICIiIgorCisgICMgQSBtYXAgdGhhdCBkZWZpbmVzIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgcHJlYW1ibGUgdGVtcGxhdGUuCisgIERFRlMgPSB7CisgICAgJ3RvZGF5JyA6IHRpbWUuc3RyZnRpbWUoJyVtLyVkLyVZJyksCisgICAgJ3llYXInIDogdGltZS5zdHJmdGltZSgnJVknKSwKKyAgICAnY29tbWFuZCcgOiAnJXMgJXMnICUgKG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pLCBuKSwKKyAgICAnbicgOiBuCisgICAgfQorCisgIHJldHVybiAoCisiIiIvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAlKHRvZGF5KXMgYnkgY29tbWFuZAorLy8gJyUoY29tbWFuZClzJy4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gSW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCisKKy8vIE1ha2VzIHN1cmUgdGhpcyBoZWFkZXIgaXMgbm90IGluY2x1ZGVkIGJlZm9yZSBndGVzdC5oLgorI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisjIGVycm9yIERvIG5vdCBpbmNsdWRlIGd0ZXN0X3ByZWRfaW1wbC5oIGRpcmVjdGx5LiAgSW5jbHVkZSBndGVzdC5oIGluc3RlYWQuCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKworLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24KKy8vIG1hY3JvczoKKy8vCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKQorLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWRfZm9ybWF0IGlzIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHRha2VzIG4gKGluIHRoZQorLy8gY2FzZSBvZiBBU1NFUlRfUFJFRF9GT1JNQVRuKSB2YWx1ZXMgYW5kIHRoZWlyIHNvdXJjZSBleHByZXNzaW9uCisvLyB0ZXh0LCBhbmQgcmV0dXJucyBhIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdC4gIFNlZSB0aGUgZGVmaW5pdGlvbgorLy8gb2YgQVNTRVJUX0VRIGluIGd0ZXN0LmggZm9yIGFuIGV4YW1wbGUuCisvLworLy8gSWYgeW91IGRvbid0IGNhcmUgYWJvdXQgZm9ybWF0dGluZywgeW91IGNhbiB1c2UgdGhlIG1vcmUKKy8vIHJlc3RyaWN0aXZlIHZlcnNpb246CisvLworLy8gICBBU1NFUlRfUFJFRDEocHJlZCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWQgaXMgYW4gbi1hcnkgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHJldHVybnMgYm9vbCwKKy8vIGFuZCB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uLCBtdXN0IHN1cHBvcnQgdGhlIDw8IG9wZXJhdG9yIGZvcgorLy8gc3RyZWFtaW5nIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBXZSBhbHNvIGRlZmluZSB0aGUgRVhQRUNUXyogdmFyaWF0aW9ucy4KKy8vCisvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBwcmVkaWNhdGVzIHdob3NlIGFyaXR5IGlzIGF0IG1vc3QgJShuKXMuCisvLyBQbGVhc2UgZW1haWwgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBzdXBwb3J0IGZvciBoaWdoZXIgYXJpdGllcy4KKworLy8gR1RFU1RfQVNTRVJUXyBpcyB0aGUgYmFzaWMgc3RhdGVtZW50IHRvIHdoaWNoIGFsbCBvZiB0aGUgYXNzZXJ0aW9ucworLy8gaW4gdGhpcyBmaWxlIHJlZHVjZS4gIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKworI2RlZmluZSBHVEVTVF9BU1NFUlRfKGV4cHJlc3Npb24sIG9uX2ZhaWx1cmUpIFxcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFxcCisgIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hciA9IChleHByZXNzaW9uKSkgXFwKKyAgICA7IFxcCisgIGVsc2UgXFwKKyAgICBvbl9mYWlsdXJlKGd0ZXN0X2FyLmZhaWx1cmVfbWVzc2FnZSgpKQorIiIiICUgREVGUykKKworCitkZWYgQXJpdHkobik6CisgICIiIlJldHVybnMgdGhlIEVuZ2xpc2ggbmFtZSBvZiB0aGUgZ2l2ZW4gYXJpdHkuIiIiCisKKyAgaWYgbiA8IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgZWxpZiBuIDw9IDM6CisgICAgcmV0dXJuIFsnbnVsbGFyeScsICd1bmFyeScsICdiaW5hcnknLCAndGVybmFyeSddW25dCisgIGVsc2U6CisgICAgcmV0dXJuICclcy1hcnknICUgbgorCisKK2RlZiBUaXRsZSh3b3JkKToKKyAgIiIiUmV0dXJucyB0aGUgZ2l2ZW4gd29yZCBpbiB0aXRsZSBjYXNlLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICB0aGlzIGFuZCBzdHJpbmcncyB0aXRsZSgpIG1ldGhvZCBpcyB0aGF0IFRpdGxlKCc0LWFyeScpIGlzICc0LWFyeScKKyAgd2hpbGUgJzQtYXJ5Jy50aXRsZSgpIGlzICc0LUFyeScuIiIiCisKKyAgcmV0dXJuIHdvcmRbMF0udXBwZXIoKSArIHdvcmRbMTpdCisKKworZGVmIE9uZVRvKG4pOgorICAiIiJSZXR1cm5zIHRoZSBsaXN0IFsxLCAyLCAzLCAuLi4sIG5dLiIiIgorCisgIHJldHVybiByYW5nZSgxLCBuICsgMSkKKworCitkZWYgSXRlcihuLCBmb3JtYXQsIHNlcD0nJyk6CisgICIiIkdpdmVuIGEgcG9zaXRpdmUgaW50ZWdlciBuLCBhIGZvcm1hdCBzdHJpbmcgdGhhdCBjb250YWlucyAwIG9yCisgIG1vcmUgJyVzJyBmb3JtYXQgc3BlY3MsIGFuZCBvcHRpb25hbGx5IGEgc2VwYXJhdG9yIHN0cmluZywgcmV0dXJucworICB0aGUgam9pbiBvZiBuIHN0cmluZ3MsIGVhY2ggZm9ybWF0dGVkIHdpdGggdGhlIGZvcm1hdCBzdHJpbmcgb24gYW4KKyAgaXRlcmF0b3IgcmFuZ2VkIGZyb20gMSB0byBuLgorCisgIEV4YW1wbGU6CisKKyAgSXRlcigzLCAndiVzJywgc2VwPScsICcpIHJldHVybnMgJ3YxLCB2MiwgdjMnLgorICAiIiIKKworICAjIEhvdyBtYW55ICclcycgc3BlY3MgYXJlIGluIGZvcm1hdD8KKyAgc3BlY19jb3VudCA9IGxlbihmb3JtYXQuc3BsaXQoJyVzJykpIC0gMQorICByZXR1cm4gc2VwLmpvaW4oW2Zvcm1hdCAlIChzcGVjX2NvdW50ICogKGksKSkgZm9yIGkgaW4gT25lVG8obildKQorCisKK2RlZiBJbXBsZW1lbnRhdGlvbkZvckFyaXR5KG4pOgorICAiIiJSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBuLWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4iIiIKKworICAjIEEgbWFwIHRoZSBkZWZpbmVzIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gdGVtcGxhdGUuCisgIERFRlMgPSB7CisgICAgJ24nIDogc3RyKG4pLAorICAgICd2cycgOiBJdGVyKG4sICd2JXMnLCBzZXA9JywgJyksCisgICAgJ3Z0cycgOiBJdGVyKG4sICcjdiVzJywgc2VwPScsICcpLAorICAgICdhcml0eScgOiBBcml0eShuKSwKKyAgICAnQXJpdHknIDogVGl0bGUoQXJpdHkobikpCisgICAgfQorCisgIGltcGwgPSAiIiIKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQlKG4pcy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCIiIiAlIERFRlMKKworICBpbXBsICs9IEl0ZXIobiwgIiIiLAorICAgICAgICAgIHR5cGVuYW1lIFQlcyIiIikKKworICBpbXBsICs9ICIiIj4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkJShuKXNIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0IiIiICUgREVGUworCisgIGltcGwgKz0gSXRlcihuLCAiIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZSVzIiIiKQorCisgIGltcGwgKz0gIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCIiIgorCisgIGltcGwgKz0gSXRlcihuLCAiIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCVzJiB2JXMiIiIpCisKKyAgaW1wbCArPSAiIiIpIHsKKyAgaWYgKHByZWQoJSh2cylzKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworIiIiICUgREVGUworCisgIGltcGwgKz0gJyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiJworCisgIGltcGwgKz0gSXRlcihuLCAiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlJXMiIiIsIHNlcD0nIDw8ICIsICInKQorCisgIGltcGwgKz0gJyA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIicKKworICBpbXBsICs9IEl0ZXIobiwgIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxcbiIgPDwgZSVzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdiVzIiIiKQorCisgIGltcGwgKz0gIiIiOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVCUobilzLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVCUobilzXyhwcmVkX2Zvcm1hdCwgJSh2cylzLCBvbl9mYWlsdXJlKVxcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoJSh2dHMpcywgJSh2cylzKSwgXFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEJShuKXMuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEJShuKXNfKHByZWQsICUodnMpcywgb25fZmFpbHVyZSlcXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZCUobilzSGVscGVyKCNwcmVkIiIiICUgREVGUworCisgIGltcGwgKz0gSXRlcihuLCAiIiIsIFxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdiVzIiIiKQorCisgIGltcGwgKz0gIiIiLCBcXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCIiIgorCisgIGltcGwgKz0gSXRlcihuLCAiIiIsIFxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2JXMiIiIpCisKKyAgaW1wbCArPSAiIiIpLCBvbl9mYWlsdXJlKQorCisvLyAlKEFyaXR5KXMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVCUobilzKHByZWRfZm9ybWF0LCAlKHZzKXMpIFxcCisgIEdURVNUX1BSRURfRk9STUFUJShuKXNfKHByZWRfZm9ybWF0LCAlKHZzKXMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRCUobilzKHByZWQsICUodnMpcykgXFwKKyAgR1RFU1RfUFJFRCUobilzXyhwcmVkLCAlKHZzKXMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQlKG4pcyhwcmVkX2Zvcm1hdCwgJSh2cylzKSBcXAorICBHVEVTVF9QUkVEX0ZPUk1BVCUobilzXyhwcmVkX2Zvcm1hdCwgJSh2cylzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQlKG4pcyhwcmVkLCAlKHZzKXMpIFxcCisgIEdURVNUX1BSRUQlKG4pc18ocHJlZCwgJSh2cylzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworIiIiICUgREVGUworCisgIHJldHVybiBpbXBsCisKKworZGVmIEhlYWRlclBvc3RhbWJsZSgpOgorICAiIiJSZXR1cm5zIHRoZSBwb3N0YW1ibGUgZm9yIHRoZSBoZWFkZXIgZmlsZS4iIiIKKworICByZXR1cm4gIiIiCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKyIiIgorCisKK2RlZiBHZW5lcmF0ZUZpbGUocGF0aCwgY29udGVudCk6CisgICIiIkdpdmVuIGEgZmlsZSBwYXRoIGFuZCBhIGNvbnRlbnQgc3RyaW5nLCBvdmVyd3JpdGVzIGl0IHdpdGggdGhlCisgIGdpdmVuIGNvbnRlbnQuIiIiCisKKyAgcHJpbnQgJ1VwZGF0aW5nIGZpbGUgJXMgLiAuIC4nICUgcGF0aAorCisgIGYgPSBmaWxlKHBhdGgsICd3KycpCisgIHByaW50ID4+ZiwgY29udGVudCwKKyAgZi5jbG9zZSgpCisKKyAgcHJpbnQgJ0ZpbGUgJXMgaGFzIGJlZW4gdXBkYXRlZC4nICUgcGF0aAorCisKK2RlZiBHZW5lcmF0ZUhlYWRlcihuKToKKyAgIiIiR2l2ZW4gdGhlIG1heGltdW0gYXJpdHkgbiwgdXBkYXRlcyB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbXBsZW1lbnRzCisgIHRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4iIiIKKworICBHZW5lcmF0ZUZpbGUoSEVBREVSLAorICAgICAgICAgICAgICAgSGVhZGVyUHJlYW1ibGUobikKKyAgICAgICAgICAgICAgICsgJycuam9pbihbSW1wbGVtZW50YXRpb25Gb3JBcml0eShpKSBmb3IgaSBpbiBPbmVUbyhuKV0pCisgICAgICAgICAgICAgICArIEhlYWRlclBvc3RhbWJsZSgpKQorCisKK2RlZiBVbml0VGVzdFByZWFtYmxlKCk6CisgICIiIlJldHVybnMgdGhlIHByZWFtYmxlIGZvciB0aGUgdW5pdCB0ZXN0IGZpbGUuIiIiCisKKyAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSBwcmVhbWJsZSB0ZW1wbGF0ZS4KKyAgREVGUyA9IHsKKyAgICAndG9kYXknIDogdGltZS5zdHJmdGltZSgnJW0vJWQvJVknKSwKKyAgICAneWVhcicgOiB0aW1lLnN0cmZ0aW1lKCclWScpLAorICAgICdjb21tYW5kJyA6ICclcyAlcycgJSAob3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSksIHN5cy5hcmd2WzFdKSwKKyAgICB9CisKKyAgcmV0dXJuICgKKyIiIi8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIG9uICUodG9kYXkpcyBieSBjb21tYW5kCisvLyAnJShjb21tYW5kKXMnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBndGVzdF9wcmVkX2ltcGwuaAorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBzY3JpcHQgYW5kIHF1aXRlIGxvbmcuICBJZiB5b3UgaW50ZW5kIHRvCisvLyBsZWFybiBob3cgR29vZ2xlIFRlc3Qgd29ya3MgYnkgcmVhZGluZyBpdHMgdW5pdCB0ZXN0cywgcmVhZAorLy8gZ3Rlc3RfdW5pdHRlc3QuY2MgaW5zdGVhZC4KKy8vCisvLyBUaGlzIGlzIGludGVuZGVkIGFzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgR29vZ2xlIFRlc3QgcHJlZGljYXRlCisvLyBhc3NlcnRpb25zLiAgV2UgY29tcGlsZSBpdCBhcyBwYXJ0IG9mIHRoZSBndGVzdF91bml0dGVzdCB0YXJnZXQKKy8vIG9ubHkgdG8ga2VlcCB0aGUgaW1wbGVtZW50YXRpb24gdGlkeSBhbmQgY29tcGFjdCwgYXMgaXQgaXMgcXVpdGUKKy8vIGludm9sdmVkIHRvIHNldCB1cCB0aGUgc3RhZ2UgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgdXNpbmcgR29vZ2xlCisvLyBUZXN0IGl0c2VsZi4KKy8vCisvLyBDdXJyZW50bHksIGd0ZXN0X3VuaXR0ZXN0IHRha2VzIH4xMSBzZWNvbmRzIHRvIHJ1biBpbiB0aGUgdGVzdGluZworLy8gZGFlbW9uLiAgSW4gdGhlIGZ1dHVyZSwgaWYgaXQgZ3Jvd3MgdG9vIGxhcmdlIGFuZCBuZWVkcyBtdWNoIG1vcmUKKy8vIHRpbWUgdG8gZmluaXNoLCB3ZSBzaG91bGQgY29uc2lkZXIgc2VwYXJhdGluZyB0aGlzIGZpbGUgaW50byBhCisvLyBzdGFuZC1hbG9uZSByZWdyZXNzaW9uIHRlc3QuCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKy8vIEEgdXNlci1kZWZpbmVkIGRhdGEgdHlwZS4KK3N0cnVjdCBCb29sIHsKKyAgZXhwbGljaXQgQm9vbChpbnQgdmFsKSA6IHZhbHVlKHZhbCAhPSAwKSB7fQorCisgIGJvb2wgb3BlcmF0b3I+KGludCBuKSBjb25zdCB7IHJldHVybiB2YWx1ZSA+IEJvb2wobikudmFsdWU7IH0KKworICBCb29sIG9wZXJhdG9yKyhjb25zdCBCb29sJiByaHMpIGNvbnN0IHsgcmV0dXJuIEJvb2wodmFsdWUgKyByaHMudmFsdWUpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gdmFsdWUgPT0gcmhzLnZhbHVlOyB9CisKKyAgYm9vbCB2YWx1ZTsKK307CisKKy8vIEVuYWJsZXMgQm9vbCB0byBiZSB1c2VkIGluIGFzc2VydGlvbnMuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQm9vbCYgeCkgeworICByZXR1cm4gb3MgPDwgKHgudmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKworIiIiICUgREVGUykKKworCitkZWYgVGVzdHNGb3JBcml0eShuKToKKyAgIiIiUmV0dXJucyB0aGUgdGVzdHMgZm9yIG4tYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgICMgQSBtYXAgdGhhdCBkZWZpbmVzIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgdGVtcGxhdGUgZm9yIHRoZSB0ZXN0cy4KKyAgREVGUyA9IHsKKyAgICAnbicgOiBuLAorICAgICdlcycgOiBJdGVyKG4sICdlJXMnLCBzZXA9JywgJyksCisgICAgJ3ZzJyA6IEl0ZXIobiwgJ3YlcycsIHNlcD0nLCAnKSwKKyAgICAndnRzJyA6IEl0ZXIobiwgJyN2JXMnLCBzZXA9JywgJyksCisgICAgJ3R2cycgOiBJdGVyKG4sICdUJXMgdiVzJywgc2VwPScsICcpLAorICAgICdpbnRfdnMnIDogSXRlcihuLCAnaW50IHYlcycsIHNlcD0nLCAnKSwKKyAgICAnQm9vbF92cycgOiBJdGVyKG4sICdCb29sIHYlcycsIHNlcD0nLCAnKSwKKyAgICAndHlwZXMnIDogSXRlcihuLCAndHlwZW5hbWUgVCVzJywgc2VwPScsICcpLAorICAgICd2X3N1bScgOiBJdGVyKG4sICd2JXMnLCBzZXA9JyArICcpLAorICAgICdhcml0eScgOiBBcml0eShuKSwKKyAgICAnQXJpdHknIDogVGl0bGUoQXJpdHkobikpLAorICAgIH0KKworICB0ZXN0cyA9ICgKKyIiIi8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgJShhcml0eSlzIHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8JSh0eXBlcylzPgorYm9vbCBQcmVkRnVuY3Rpb24lKG4pcyglKHR2cylzKSB7CisgIHJldHVybiAlKHZfc3VtKXMgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb24lKG4pc0ludCglKGludF92cylzKSB7CisgIHJldHVybiAlKHZfc3VtKXMgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb24lKG4pc0Jvb2woJShCb29sX3ZzKXMpIHsKKyAgcmV0dXJuICUodl9zdW0pcyA+IDA7Cit9CisiIiIgJSBERUZTKQorCisgIHRlc3RzICs9ICIiIgorLy8gQSAlKGFyaXR5KXMgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3IlKG4pcyB7CisgIHRlbXBsYXRlIDwlKHR5cGVzKXM+CisgIGJvb2wgb3BlcmF0b3IoKSgiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnY29uc3QgVCVzJiB2JXMnLCBzZXA9IiIiLAorICAgICAgICAgICAgICAgICAgIiIiKQorCisgIHRlc3RzICs9ICIiIikgeworICAgIHJldHVybiAlKHZfc3VtKXMgPiAwOworICB9Cit9OworIiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorLy8gQSAlKGFyaXR5KXMgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDwlKHR5cGVzKXM+Cit0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uJShuKXMoIiIiICUgREVGUworCisgIHRlc3RzICs9IEl0ZXIobiwgJ2NvbnN0IGNoYXIqIGUlcycsIHNlcD0iIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgdGVzdHMgKz0gSXRlcihuLCAiIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJXMmIHYlcyIiIikKKworICB0ZXN0cyArPSAiIiIpIHsKKyAgaWYgKFByZWRGdW5jdGlvbiUobilzKCUodnMpcykpCisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnZSVzJywgc2VwPScgPDwgIiArICIgPDwgJykKKworICB0ZXN0cyArPSAiIiIKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgJSh2X3N1bSlzIDw8ICIuIjsKK30KKyIiIiAlIERFRlMKKworICB0ZXN0cyArPSAiIiIKKy8vIEEgJShhcml0eSlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvciUobilzIHsKKyAgdGVtcGxhdGUgPCUodHlwZXMpcz4KKyAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoIiIiICUgREVGUworCisgIHRlc3RzICs9IEl0ZXIobiwgJ2NvbnN0IGNoYXIqIGUlcycsIHNlcD0iIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIikKKworICB0ZXN0cyArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCVzJiB2JXMiIiIpCisKKyAgdGVzdHMgKz0gIiIiKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbiUobilzKCUoZXMpcywgJSh2cylzKTsKKyAgfQorfTsKKyIiIiAlIERFRlMKKworICB0ZXN0cyArPSAiIiIKKy8vIFRlc3RzIGZvciB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQlKG4pcy4KKworY2xhc3MgUHJlZGljYXRlJShuKXNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOworICAgIGZpbmlzaGVkXyA9IGZhbHNlOyIiIiAlIERFRlMKKworICB0ZXN0cyArPSAiIiIKKyAgICAiIiIgKyBJdGVyKG4sICduJXNfID0gJykgKyAiIiIwOworICB9CisiIiIKKworICB0ZXN0cyArPSAiIiIKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIFZlcmlmaWVzIHRoYXQgZWFjaCBvZiB0aGUgcHJlZGljYXRlJ3MgYXJndW1lbnRzIHdhcyBldmFsdWF0ZWQKKyAgICAvLyBleGFjdGx5IG9uY2UuIiIiCisKKyAgdGVzdHMgKz0gJycuam9pbihbIiIiCisgICAgRVhQRUNUX0VRKDEsIG4lc18pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgJXMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7IiIiICUgKGksIGkgKyAxKSBmb3IgaSBpbiBPbmVUbyhuKV0pCisKKyAgdGVzdHMgKz0gIiIiCisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCisgICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOworICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgorICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKKyIiIiAlIERFRlMKKworICB0ZXN0cyArPSBJdGVyKG4sICIiIgorICBzdGF0aWMgaW50IG4lc187IiIiKQorCisgIHRlc3RzICs9ICIiIgorfTsKKworYm9vbCBQcmVkaWNhdGUlKG4pc1Rlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZSUobilzVGVzdDo6ZmluaXNoZWRfOworIiIiICUgREVGUworCisgIHRlc3RzICs9IEl0ZXIobiwgIiIiaW50IFByZWRpY2F0ZSUlKG4pc1Rlc3Q6Om4lc187CisiIiIpICUgREVGUworCisgIHRlc3RzICs9ICIiIgordHlwZWRlZiBQcmVkaWNhdGUlKG4pc1Rlc3QgRVhQRUNUX1BSRURfRk9STUFUJShuKXNUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUlKG4pc1Rlc3QgQVNTRVJUX1BSRURfRk9STUFUJShuKXNUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUlKG4pc1Rlc3QgRVhQRUNUX1BSRUQlKG4pc1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBBU1NFUlRfUFJFRCUobilzVGVzdDsKKyIiIiAlIERFRlMKKworICBkZWYgR2VuVGVzdCh1c2VfZm9ybWF0LCB1c2VfYXNzZXJ0LCBleHBlY3RfZmFpbHVyZSwKKyAgICAgICAgICAgICAgdXNlX2Z1bmN0b3IsIHVzZV91c2VyX3R5cGUpOgorICAgICIiIlJldHVybnMgdGhlIHRlc3QgZm9yIGEgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyby4KKworICAgIEFyZ3M6CisgICAgICB1c2VfZm9ybWF0OiAgICAgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhICpfUFJFRF9GT1JNQVQqLgorICAgICAgdXNlX2Fzc2VydDogICAgIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYSBBU1NFUlRfKi4KKyAgICAgIGV4cGVjdF9mYWlsdXJlOiB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGV4cGVjdGVkIHRvIGZhaWwuCisgICAgICB1c2VfZnVuY3RvcjogICAgdHJ1ZSBpZmYgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBhc3NlcnRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICBhIGZ1bmN0b3IgKGFzIG9wcG9zZWQgdG8gYSBmdW5jdGlvbikKKyAgICAgIHVzZV91c2VyX3R5cGU6ICB0cnVlIGlmZiB0aGUgcHJlZGljYXRlIGZ1bmN0b3IvZnVuY3Rpb24gdGFrZXMKKyAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudChzKSBvZiBhIHVzZXItZGVmaW5lZCB0eXBlLgorCisgICAgRXhhbXBsZToKKworICAgICAgR2VuVGVzdCgxLCAwLCAwLCAxLCAwKSByZXR1cm5zIGEgdGVzdCB0aGF0IHRlc3RzIHRoZSBiZWhhdmlvcgorICAgICAgb2YgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVG4oKSB0aGF0IHRha2VzIGEgZnVuY3RvcgorICAgICAgd2hvc2UgYXJndW1lbnRzIGhhdmUgYnVpbHQtaW4gdHlwZXMuIiIiCisKKyAgICBpZiB1c2VfYXNzZXJ0OgorICAgICAgYXNzcnQgPSAnQVNTRVJUJyAgIyAnYXNzZXJ0JyBpcyByZXNlcnZlZCwgc28gd2UgY2Fubm90IHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGF0IGlkZW50aWZpZXIgaGVyZS4KKyAgICBlbHNlOgorICAgICAgYXNzcnQgPSAnRVhQRUNUJworCisgICAgYXNzZXJ0aW9uID0gYXNzcnQgKyAnX1BSRUQnCisKKyAgICBpZiB1c2VfZm9ybWF0OgorICAgICAgcHJlZF9mb3JtYXQgPSAnUHJlZEZvcm1hdCcKKyAgICAgIGFzc2VydGlvbiArPSAnX0ZPUk1BVCcKKyAgICBlbHNlOgorICAgICAgcHJlZF9mb3JtYXQgPSAnUHJlZCcKKworICAgIGFzc2VydGlvbiArPSAnJShuKXMnICUgREVGUworCisgICAgaWYgdXNlX2Z1bmN0b3I6CisgICAgICBwcmVkX2Zvcm1hdF90eXBlID0gJ2Z1bmN0b3InCisgICAgICBwcmVkX2Zvcm1hdCArPSAnRnVuY3RvciUobilzKCknCisgICAgZWxzZToKKyAgICAgIHByZWRfZm9ybWF0X3R5cGUgPSAnZnVuY3Rpb24nCisgICAgICBwcmVkX2Zvcm1hdCArPSAnRnVuY3Rpb24lKG4pcycKKyAgICAgIGlmIG5vdCB1c2VfZm9ybWF0OgorICAgICAgICBpZiB1c2VfdXNlcl90eXBlOgorICAgICAgICAgIHByZWRfZm9ybWF0ICs9ICdCb29sJworICAgICAgICBlbHNlOgorICAgICAgICAgIHByZWRfZm9ybWF0ICs9ICdJbnQnCisKKyAgICB0ZXN0X25hbWUgPSBwcmVkX2Zvcm1hdF90eXBlLnRpdGxlKCkKKworICAgIGlmIHVzZV91c2VyX3R5cGU6CisgICAgICBhcmdfdHlwZSA9ICd1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCknCisgICAgICB0ZXN0X25hbWUgKz0gJ09uVXNlclR5cGUnCisgICAgICBpZiBleHBlY3RfZmFpbHVyZToKKyAgICAgICAgYXJnID0gJ0Jvb2wobiVzXysrKScKKyAgICAgIGVsc2U6CisgICAgICAgIGFyZyA9ICdCb29sKCsrbiVzXyknCisgICAgZWxzZToKKyAgICAgIGFyZ190eXBlID0gJ2J1aWx0LWluIHR5cGUgKGludCknCisgICAgICB0ZXN0X25hbWUgKz0gJ09uQnVpbHRJblR5cGUnCisgICAgICBpZiBleHBlY3RfZmFpbHVyZToKKyAgICAgICAgYXJnID0gJ24lc18rKycKKyAgICAgIGVsc2U6CisgICAgICAgIGFyZyA9ICcrK24lc18nCisKKyAgICBpZiBleHBlY3RfZmFpbHVyZToKKyAgICAgIHN1Y2Nlc3NmdWxfb3JfZmFpbGVkID0gJ2ZhaWxlZCcKKyAgICAgIGV4cGVjdGVkX29yX25vdCA9ICdleHBlY3RlZC4nCisgICAgICB0ZXN0X25hbWUgKz0gICdGYWlsdXJlJworICAgIGVsc2U6CisgICAgICBzdWNjZXNzZnVsX29yX2ZhaWxlZCA9ICdzdWNjZXNzZnVsJworICAgICAgZXhwZWN0ZWRfb3Jfbm90ID0gJ1VORVhQRUNURUQhJworICAgICAgdGVzdF9uYW1lICs9ICAnU3VjY2VzcycKKworICAgICMgQSBtYXAgdGhhdCBkZWZpbmVzIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgdGVzdCB0ZW1wbGF0ZS4KKyAgICBkZWZzID0gREVGUy5jb3B5KCkKKyAgICBkZWZzLnVwZGF0ZSh7CisgICAgICAnYXNzZXJ0JyA6IGFzc3J0LAorICAgICAgJ2Fzc2VydGlvbicgOiBhc3NlcnRpb24sCisgICAgICAndGVzdF9uYW1lJyA6IHRlc3RfbmFtZSwKKyAgICAgICdwZl90eXBlJyA6IHByZWRfZm9ybWF0X3R5cGUsCisgICAgICAncGYnIDogcHJlZF9mb3JtYXQsCisgICAgICAnYXJnX3R5cGUnIDogYXJnX3R5cGUsCisgICAgICAnYXJnJyA6IGFyZywKKyAgICAgICdzdWNjZXNzZnVsJyA6IHN1Y2Nlc3NmdWxfb3JfZmFpbGVkLAorICAgICAgJ2V4cGVjdGVkJyA6IGV4cGVjdGVkX29yX25vdCwKKyAgICAgIH0pCisKKyAgICB0ZXN0ID0gIiIiCisvLyBUZXN0cyBhICUoc3VjY2Vzc2Z1bClzICUoYXNzZXJ0aW9uKXMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgJShwZl90eXBlKXMgb24gYSAlKGFyZ190eXBlKXMuCitURVNUX0YoJShhc3NlcnRpb24pc1Rlc3QsICUodGVzdF9uYW1lKXMpIHsiIiIgJSBkZWZzCisKKyAgICBpbmRlbnQgPSAobGVuKGFzc2VydGlvbikgKyAzKSonICcKKyAgICBleHRyYV9pbmRlbnQgPSAnJworCisgICAgaWYgZXhwZWN0X2ZhaWx1cmU6CisgICAgICBleHRyYV9pbmRlbnQgPSAnICAnCisgICAgICBpZiB1c2VfYXNzZXJ0OgorICAgICAgICB0ZXN0ICs9ICIiIgorICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVCIiIgorICAgICAgZWxzZToKKyAgICAgICAgdGVzdCArPSAiIiIKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UIiIiCisKKyAgICB0ZXN0ICs9ICdcbicgKyBleHRyYV9pbmRlbnQgKyAiIiIgICUoYXNzZXJ0aW9uKXMoJShwZilzIiIiICUgZGVmcworCisgICAgdGVzdCA9IHRlc3QgJSBkZWZzCisgICAgdGVzdCArPSBJdGVyKG4sICcsXG4nICsgaW5kZW50ICsgZXh0cmFfaW5kZW50ICsgJyUoYXJnKXMnICUgZGVmcykKKyAgICB0ZXN0ICs9ICcpO1xuJyArIGV4dHJhX2luZGVudCArICcgIGZpbmlzaGVkXyA9IHRydWU7XG4nCisKKyAgICBpZiBleHBlY3RfZmFpbHVyZToKKyAgICAgIHRlc3QgKz0gJyAgfSwgIiIpO1xuJworCisgICAgdGVzdCArPSAnfVxuJworICAgIHJldHVybiB0ZXN0CisKKyAgIyBHZW5lcmF0ZXMgdGVzdHMgZm9yIGFsbCAyKio2ID0gNjQgY29tYmluYXRpb25zLgorICB0ZXN0cyArPSAnJy5qb2luKFtHZW5UZXN0KHVzZV9mb3JtYXQsIHVzZV9hc3NlcnQsIGV4cGVjdF9mYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9mdW5jdG9yLCB1c2VfdXNlcl90eXBlKQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX2Zvcm1hdCBpbiBbMCwgMV0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHVzZV9hc3NlcnQgaW4gWzAsIDFdCisgICAgICAgICAgICAgICAgICAgIGZvciBleHBlY3RfZmFpbHVyZSBpbiBbMCwgMV0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHVzZV9mdW5jdG9yIGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX3VzZXJfdHlwZSBpbiBbMCwgMV0KKyAgICAgICAgICAgICAgICAgICAgXSkKKworICByZXR1cm4gdGVzdHMKKworCitkZWYgVW5pdFRlc3RQb3N0YW1ibGUoKToKKyAgIiIiUmV0dXJucyB0aGUgcG9zdGFtYmxlIGZvciB0aGUgdGVzdHMuIiIiCisKKyAgcmV0dXJuICcnCisKKworZGVmIEdlbmVyYXRlVW5pdFRlc3Qobik6CisgICIiIlJldHVybnMgdGhlIHRlc3RzIGZvciB1cC10byBuLWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4iIiIKKworICBHZW5lcmF0ZUZpbGUoVU5JVF9URVNULAorICAgICAgICAgICAgICAgVW5pdFRlc3RQcmVhbWJsZSgpCisgICAgICAgICAgICAgICArICcnLmpvaW4oW1Rlc3RzRm9yQXJpdHkoaSkgZm9yIGkgaW4gT25lVG8obildKQorICAgICAgICAgICAgICAgKyBVbml0VGVzdFBvc3RhbWJsZSgpKQorCisKK2RlZiBfTWFpbigpOgorICAiIiJUaGUgZW50cnkgcG9pbnQgb2YgdGhlIHNjcmlwdC4gIEdlbmVyYXRlcyB0aGUgaGVhZGVyIGZpbGUgYW5kIGl0cworICB1bml0IHRlc3QuIiIiCisKKyAgaWYgbGVuKHN5cy5hcmd2KSAhPSAyOgorICAgIHByaW50IF9fZG9jX18KKyAgICBwcmludCAnQXV0aG9yOiAnICsgX19hdXRob3JfXworICAgIHN5cy5leGl0KDEpCisKKyAgbiA9IGludChzeXMuYXJndlsxXSkKKyAgR2VuZXJhdGVIZWFkZXIobikKKyAgR2VuZXJhdGVVbml0VGVzdChuKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIF9NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2NyaXB0cy9ndGVzdC1jb25maWcuaW4gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4MGY4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluCkBAIC0wLDAgKzEsMjc0IEBACisjIS9iaW4vc2gKKworIyBUaGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZmlsbGVkIGluIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LgorbmFtZT0iQFBBQ0tBR0VfVEFSTkFNRUAiCit2ZXJzaW9uPSJAUEFDS0FHRV9WRVJTSU9OQCIKKworc2hvd191c2FnZSgpCit7CisgIGVjaG8gIlVzYWdlOiBndGVzdC1jb25maWcgW09QVElPTlMuLi5dIgorfQorCitzaG93X2hlbHAoKQoreworICBzaG93X3VzYWdlCisgIGNhdCA8PFxFT0YKKworVGhlIGBndGVzdC1jb25maWcnIHNjcmlwdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG5lY2Vzc2FyeSBjb21waWxlIGFuZCBsaW5raW5nCitmbGFncyB0byBjb25uZWN0IHdpdGggR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaywgYm90aCBpbiBhIGJ1aWxkIHByaW9yIHRvCitpbnN0YWxsYXRpb24sIGFuZCBvbiB0aGUgc3lzdGVtIHByb3BlciBhZnRlciBpbnN0YWxsYXRpb24uIFRoZSBpbnN0YWxsYXRpb24KK292ZXJyaWRlcyBtYXkgYmUgaXNzdWVkIGluIGNvbWJpbmF0aW9uIHdpdGggYW55IG90aGVyIHF1ZXJpZXMsIGJ1dCB3aWxsIG9ubHkKK2FmZmVjdCBpbnN0YWxsYXRpb24gcXVlcmllcyBpZiBjYWxsZWQgb24gYSBidWlsdCBidXQgbm90IGluc3RhbGxlZCBndGVzdC4gVGhlCitpbnN0YWxsYXRpb24gcXVlcmllcyBtYXkgbm90IGJlIGlzc3VlZCB3aXRoIGFueSBvdGhlciB0eXBlcyBvZiBxdWVyaWVzLCBhbmQKK29ubHkgb25lIGluc3RhbGxhdGlvbiBxdWVyeSBtYXkgYmUgbWFkZSBhdCBhIHRpbWUuIFRoZSB2ZXJzaW9uIHF1ZXJpZXMgYW5kCitjb21waWxlciBmbGFnIHF1ZXJpZXMgbWF5IGJlIGNvbWJpbmVkIGFzIGRlc2lyZWQgYnV0IG5vdCBtaXhlZC4gRGlmZmVyZW50Cit2ZXJzaW9uIHF1ZXJpZXMgYXJlIGFsd2F5cyBjb21iaW5lZCB3aXRoIGxvZ2ljYWwgImFuZCIgc2VtYW50aWNzLCBhbmQgb25seSB0aGUKK2xhc3Qgb2YgYW55IHBhcnRpY3VsYXIgcXVlcnkgaXMgdXNlZCB3aGlsZSBhbGwgcHJldmlvdXMgb25lcyBpZ25vcmVkLiBBbGwKK3ZlcnNpb25zIG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcy4KK0NvbXBpbGVyIGZsYWcgcXVlcmllcyBvdXRwdXQgdGhlIHVuaW9uIG9mIHRoZSBzZXRzIG9mIGZsYWdzIHdoZW4gY29tYmluZWQuCisKKyBFeGFtcGxlczoKKyAgZ3Rlc3QtY29uZmlnIC0tbWluLXZlcnNpb249MS4wIHx8IGVjaG8gIkluc3VmZmljaWVudCBHb29nbGUgVGVzdCB2ZXJzaW9uLiIKKworICBnKysgJChndGVzdC1jb25maWcgLS1jcHBmbGFncyAtLWN4eGZsYWdzKSAtbyBmb28ubyAtYyBmb28uY3BwCisgIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWxkZmxhZ3MgLS1saWJzKSAtbyBmb28gZm9vLm8KKworICAjIFdoZW4gdXNpbmcgYSBidWlsdCBidXQgbm90IGluc3RhbGxlZCBHb29nbGUgVGVzdDoKKyAgZysrICQoLi4vLi4vbXlfZ3Rlc3RfYnVpbGQvc2NyaXB0cy9ndGVzdC1jb25maWcgLi4uKSAuLi4KKworICAjIFdoZW4gdXNpbmcgYW4gaW5zdGFsbGVkIEdvb2dsZSBUZXN0LCBidXQgd2l0aCBpbnN0YWxsYXRpb24gb3ZlcnJpZGVzOgorICBleHBvcnQgR1RFU1RfUFJFRklYPSIvb3B0IgorICBnKysgJChndGVzdC1jb25maWcgLS1saWJkaXI9Ii9vcHQvbGliNjQiIC4uLikgLi4uCisKKyBIZWxwOgorICAtLXVzYWdlICAgICAgICAgICAgICAgICAgICBicmllZiB1c2FnZSBpbmZvcm1hdGlvbgorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlCisKKyBJbnN0YWxsYXRpb24gT3ZlcnJpZGVzOgorICAtLXByZWZpeD08ZGlyPiAgICAgICAgICAgICBvdmVycmlkZXMgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1leGVjLXByZWZpeD08ZGlyPiAgICAgICAgb3ZlcnJpZGVzIHRoZSBleGVjdXRhYmxlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1saWJkaXI9PGRpcj4gICAgICAgICAgICAgb3ZlcnJpZGVzIHRoZSBsaWJyYXJ5IGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1pbmNsdWRlZGlyPTxkaXI+ICAgICAgICAgb3ZlcnJpZGVzIHRoZSBoZWFkZXIgZmlsZSBpbnN0YWxsYXRpb24gcHJlZml4CisKKyBJbnN0YWxsYXRpb24gUXVlcmllczoKKyAgLS1wcmVmaXggICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWV4ZWMtcHJlZml4ICAgICAgICAgICAgICBleGVjdXRhYmxlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1saWJkaXIgICAgICAgICAgICAgICAgICAgbGlicmFyeSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5CisgIC0taW5jbHVkZWRpciAgICAgICAgICAgICAgIGhlYWRlciBmaWxlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgdGhlIHZlcnNpb24gb2YgdGhlIEdvb2dsZSBUZXN0IGluc3RhbGxhdGlvbgorCisgVmVyc2lvbiBRdWVyaWVzOgorICAtLW1pbi12ZXJzaW9uPVZFUlNJT04gICAgICByZXR1cm4gMCBpZiB0aGUgdmVyc2lvbiBpcyBhdCBsZWFzdCBWRVJTSU9OCisgIC0tZXhhY3QtdmVyc2lvbj1WRVJTSU9OICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGV4YWN0bHkgVkVSU0lPTgorICAtLW1heC12ZXJzaW9uPVZFUlNJT04gICAgICByZXR1cm4gMCBpZiB0aGUgdmVyc2lvbiBpcyBhdCBtb3N0IFZFUlNJT04KKworIENvbXBpbGF0aW9uIEZsYWcgUXVlcmllczoKKyAgLS1jcHBmbGFncyAgICAgICAgICAgICAgICAgY29tcGlsZSBmbGFncyBzcGVjaWZpYyB0byB0aGUgQy1saWtlIHByZXByb2Nlc3NvcnMKKyAgLS1jeHhmbGFncyAgICAgICAgICAgICAgICAgY29tcGlsZSBmbGFncyBhcHByb3ByaWF0ZSBmb3IgQysrIHByb2dyYW1zCisgIC0tbGRmbGFncyAgICAgICAgICAgICAgICAgIGxpbmtlciBmbGFncworICAtLWxpYnMgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgZm9yIGxpbmtpbmcKKworRU9GCit9CisKKyMgVGhpcyBmdW5jdGlvbiBib3VuZHMgb3VyIHZlcnNpb24gd2l0aCBhIG1pbiBhbmQgYSBtYXguIEl0IHVzZXMgc29tZSBjbGV2ZXIKKyMgUE9TSVgtY29tcGxpYW50IHZhcmlhYmxlIGV4cGFuc2lvbiB0byBwb3J0YWJseSBkbyBhbGwgdGhlIHdvcmsgaW4gdGhlIHNoZWxsCisjIGFuZCBhdm9pZCBhbnkgZGVwZW5kZW5jeSBvbiBhIHBhcnRpY3VsYXIgInNlZCIgb3IgImF3ayIgaW1wbGVtZW50YXRpb24uCisjIE5vdGFibGUgaXMgdGhhdCBpdCB3aWxsIG9ubHkgZXZlciBjb21wYXJlIHRoZSBmaXJzdCAzIGNvbXBvbmVudHMgb2YgdmVyc2lvbnMuCisjIEZ1cnRoZXIgY29tcG9uZW50cyB3aWxsIGJlIGNsZWFubHkgc3RyaXBwZWQgb2ZmLiBBbGwgdmVyc2lvbnMgbXVzdCBiZQorIyB1bmFkb3JuZWQsIHNvICJ2MS4wIiB3aWxsICpub3QqIHdvcmsuIFRoZSBtaW5pbXVtIHZlcnNpb24gbXVzdCBiZSBpbiAkMSwgYW5kCisjIHRoZSBtYXggaW4gJDIuIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBJZiB0aGlzIGV2ZXIgYnJlYWtzLCB3ZSBzaG91bGQKKyMgaW52ZXN0aWdhdGUgZXhwYW5kaW5nIHRoaXMgdmlhIGF1dG9tNHRlIGZyb20gQVNfVkVSU0lPTl9DT01QQVJFIHJhdGhlciB0aGFuCisjIGNvbnRpbnVpbmcgdG8gbWFpbnRhaW4gb3VyIG93biBzaGVsbCB2ZXJzaW9uLgorY2hlY2tfdmVyc2lvbnMoKQoreworICBtYWpvcl92ZXJzaW9uPSR7dmVyc2lvbiUlLip9CisgIG1pbm9yX3ZlcnNpb249IjAiCisgIHBvaW50X3ZlcnNpb249IjAiCisgIGlmIHRlc3QgIiR7dmVyc2lvbiMqLn0iICE9ICIke3ZlcnNpb259IjsgdGhlbgorICAgIG1pbm9yX3ZlcnNpb249JHt2ZXJzaW9uIyoufQorICAgIG1pbm9yX3ZlcnNpb249JHttaW5vcl92ZXJzaW9uJSUuKn0KKyAgZmkKKyAgaWYgdGVzdCAiJHt2ZXJzaW9uIyouKi59IiAhPSAiJHt2ZXJzaW9ufSI7IHRoZW4KKyAgICBwb2ludF92ZXJzaW9uPSR7dmVyc2lvbiMqLioufQorICAgIHBvaW50X3ZlcnNpb249JHtwb2ludF92ZXJzaW9uJSUuKn0KKyAgZmkKKworICBtaW5fdmVyc2lvbj0iJDEiCisgIG1pbl9tYWpvcl92ZXJzaW9uPSR7bWluX3ZlcnNpb24lJS4qfQorICBtaW5fbWlub3JfdmVyc2lvbj0iMCIKKyAgbWluX3BvaW50X3ZlcnNpb249IjAiCisgIGlmIHRlc3QgIiR7bWluX3ZlcnNpb24jKi59IiAhPSAiJHttaW5fdmVyc2lvbn0iOyB0aGVuCisgICAgbWluX21pbm9yX3ZlcnNpb249JHttaW5fdmVyc2lvbiMqLn0KKyAgICBtaW5fbWlub3JfdmVyc2lvbj0ke21pbl9taW5vcl92ZXJzaW9uJSUuKn0KKyAgZmkKKyAgaWYgdGVzdCAiJHttaW5fdmVyc2lvbiMqLioufSIgIT0gIiR7bWluX3ZlcnNpb259IjsgdGhlbgorICAgIG1pbl9wb2ludF92ZXJzaW9uPSR7bWluX3ZlcnNpb24jKi4qLn0KKyAgICBtaW5fcG9pbnRfdmVyc2lvbj0ke21pbl9wb2ludF92ZXJzaW9uJSUuKn0KKyAgZmkKKworICBtYXhfdmVyc2lvbj0iJDIiCisgIG1heF9tYWpvcl92ZXJzaW9uPSR7bWF4X3ZlcnNpb24lJS4qfQorICBtYXhfbWlub3JfdmVyc2lvbj0iMCIKKyAgbWF4X3BvaW50X3ZlcnNpb249IjAiCisgIGlmIHRlc3QgIiR7bWF4X3ZlcnNpb24jKi59IiAhPSAiJHttYXhfdmVyc2lvbn0iOyB0aGVuCisgICAgbWF4X21pbm9yX3ZlcnNpb249JHttYXhfdmVyc2lvbiMqLn0KKyAgICBtYXhfbWlub3JfdmVyc2lvbj0ke21heF9taW5vcl92ZXJzaW9uJSUuKn0KKyAgZmkKKyAgaWYgdGVzdCAiJHttYXhfdmVyc2lvbiMqLioufSIgIT0gIiR7bWF4X3ZlcnNpb259IjsgdGhlbgorICAgIG1heF9wb2ludF92ZXJzaW9uPSR7bWF4X3ZlcnNpb24jKi4qLn0KKyAgICBtYXhfcG9pbnRfdmVyc2lvbj0ke21heF9wb2ludF92ZXJzaW9uJSUuKn0KKyAgZmkKKworICB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fbWFqb3JfdmVyc2lvbikpICYmIGV4aXQgMQorICBpZiB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWVxICQoKCRtaW5fbWFqb3JfdmVyc2lvbikpOyB0aGVuCisgICAgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1sdCAkKCgkbWluX21pbm9yX3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgICBpZiB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWVxICQoKCRtaW5fbWlub3JfdmVyc2lvbikpOyB0aGVuCisgICAgICB0ZXN0ICQoKCRwb2ludF92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fcG9pbnRfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgdGVzdCAkKCgkbWFqb3JfdmVyc2lvbikpIC1ndCAkKCgkbWF4X21ham9yX3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgaWYgdGVzdCAkKCgkbWFqb3JfdmVyc2lvbikpIC1lcSAkKCgkbWF4X21ham9yX3ZlcnNpb24pKTsgdGhlbgorICAgIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtZ3QgJCgoJG1heF9taW5vcl92ZXJzaW9uKSkgJiYgZXhpdCAxCisgICAgaWYgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1lcSAkKCgkbWF4X21pbm9yX3ZlcnNpb24pKTsgdGhlbgorICAgICAgdGVzdCAkKCgkcG9pbnRfdmVyc2lvbikpIC1ndCAkKCgkbWF4X3BvaW50X3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgICBmaQorICBmaQorCisgIGV4aXQgMAorfQorCisjIFNob3cgdGhlIHVzYWdlIGxpbmUgd2hlbiBubyBhcmd1bWVudHMgYXJlIHNwZWNpZmllZC4KK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgc2hvd191c2FnZQorICBleGl0IDEKK2ZpCisKK3doaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXVzYWdlKSAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMDs7CisgICAgLS1oZWxwKSAgICAgICAgICAgc2hvd19oZWxwOyAgICAgICAgICBleGl0IDA7OworCisgICAgIyBJbnN0YWxsYXRpb24gb3ZlcnJpZGVzCisgICAgLS1wcmVmaXg9KikgICAgICAgR1RFU1RfUFJFRklYPSR7MSMtLXByZWZpeD19OzsKKyAgICAtLWV4ZWMtcHJlZml4PSopICBHVEVTVF9FWEVDX1BSRUZJWD0kezEjLS1leGVjLXByZWZpeD19OzsKKyAgICAtLWxpYmRpcj0qKSAgICAgICBHVEVTVF9MSUJESVI9JHsxIy0tbGliZGlyPX07OworICAgIC0taW5jbHVkZWRpcj0qKSAgIEdURVNUX0lOQ0xVREVESVI9JHsxIy0taW5jbHVkZWRpcj19OzsKKworICAgICMgSW5zdGFsbGF0aW9uIHF1ZXJpZXMKKyAgICAtLXByZWZpeHwtLWV4ZWMtcHJlZml4fC0tbGliZGlyfC0taW5jbHVkZWRpcnwtLXZlcnNpb24pCisgICAgICBpZiB0ZXN0IC1uICIke2RvX3F1ZXJ5fSI7IHRoZW4KKyAgICAgICAgc2hvd191c2FnZQorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisgICAgICBkb19xdWVyeT0kezEjLS19CisgICAgICA7OworCisgICAgIyBWZXJzaW9uIGNoZWNraW5nCisgICAgLS1taW4tdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBtaW5fdmVyc2lvbj0kezEjLS1taW4tdmVyc2lvbj19CisgICAgICA7OworICAgIC0tbWF4LXZlcnNpb249KikKKyAgICAgIGRvX2NoZWNrX3ZlcnNpb25zPXllcworICAgICAgbWF4X3ZlcnNpb249JHsxIy0tbWF4LXZlcnNpb249fQorICAgICAgOzsKKyAgICAtLWV4YWN0LXZlcnNpb249KikKKyAgICAgIGRvX2NoZWNrX3ZlcnNpb25zPXllcworICAgICAgZXhhY3RfdmVyc2lvbj0kezEjLS1leGFjdC12ZXJzaW9uPX0KKyAgICAgIDs7CisKKyAgICAjIENvbXBpbGVyIGZsYWcgb3V0cHV0CisgICAgLS1jcHBmbGFncykgICAgICAgZWNob19jcHBmbGFncz15ZXM7OworICAgIC0tY3h4ZmxhZ3MpICAgICAgIGVjaG9fY3h4ZmxhZ3M9eWVzOzsKKyAgICAtLWxkZmxhZ3MpICAgICAgICBlY2hvX2xkZmxhZ3M9eWVzOzsKKyAgICAtLWxpYnMpICAgICAgICAgICBlY2hvX2xpYnM9eWVzOzsKKworICAgICMgRXZlcnl0aGluZyBlbHNlIGlzIGFuIGVycm9yCisgICAgKikgICAgICAgICAgICAgICAgc2hvd191c2FnZTsgICAgICAgICBleGl0IDE7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKKyMgVGhlc2UgaGF2ZSBkZWZhdWx0cyBmaWxsZWQgaW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYnV0IGNhbiBhbHNvIGJlCisjIG92ZXJyaWRkZW4gYnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgorcHJlZml4PSIke0dURVNUX1BSRUZJWDotQHByZWZpeEB9IgorZXhlY19wcmVmaXg9IiR7R1RFU1RfRVhFQ19QUkVGSVg6LUBleGVjX3ByZWZpeEB9IgorbGliZGlyPSIke0dURVNUX0xJQkRJUjotQGxpYmRpckB9IgoraW5jbHVkZWRpcj0iJHtHVEVTVF9JTkNMVURFRElSOi1AaW5jbHVkZWRpckB9IgorCisjIFdlIHRyeSBhbmQgZGV0ZWN0IGlmIG91ciBiaW5hcnkgaXMgbm90IGxvY2F0ZWQgYXQgaXRzIGluc3RhbGxlZCBsb2NhdGlvbi4gSWYKKyMgaXQncyBub3QsIHdlIHByb3ZpZGUgdmFyaWFibGVzIHBvaW50aW5nIHRvIHRoZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWUgcmF0aGVyCisjIHRoYW4gdG8gdGhlIGluc3RhbGwgdHJlZS4gVGhpcyBhbGxvd3MgYnVpbGRpbmcgYWdhaW5zdCBhIGp1c3QtYnVpbHQgZ3Rlc3QKKyMgcmF0aGVyIHRoYW4gYW4gaW5zdGFsbGVkIGd0ZXN0LgorYmluZGlyPSJAYmluZGlyQCIKK3RoaXNfcmVsYXRpdmVfYmluZGlyPWBkaXJuYW1lICQwYAordGhpc19iaW5kaXI9YGNkICR7dGhpc19yZWxhdGl2ZV9iaW5kaXJ9OyBwd2QgLVBgCitpZiB0ZXN0ICIke3RoaXNfYmluZGlyfSIgPSAiJHt0aGlzX2JpbmRpciUke2JpbmRpcn19IjsgdGhlbgorICAjIFRoZSBwYXRoIHRvIHRoZSBzY3JpcHQgZG9lc24ndCBlbmQgaW4gdGhlIGJpbmRpciBzZXF1ZW5jZSBmcm9tIEF1dG9jb25mLAorICAjIGFzc3VtZSB0aGF0IHdlIGFyZSBpbiBhIGJ1aWxkIHRyZWUuCisgIGJ1aWxkX2Rpcj1gZGlybmFtZSAke3RoaXNfYmluZGlyfWAKKyAgc3JjX2Rpcj1gY2QgJHt0aGlzX2JpbmRpcn07IGNkIEB0b3Bfc3JjZGlyQDsgcHdkIC1QYAorCisgICMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IFRoaXMgaXMgYSBkYW5nZXJvdXMgZGVwZW5kZW5jeSBvbiBsaWJ0b29sLCB3ZQorICAjIHNob3VsZCB3b3JrIHRvIHJlbW92ZSBpdCwgYW5kL29yIHJlbW92ZSBsaWJ0b29sIGFsdG9nZXRoZXIsIHJlcGxhY2luZyBpdAorICAjIHdpdGggZGlyZWN0IHJlZmVyZW5jZXMgdG8gdGhlIGxpYnJhcnkgYW5kIGEgbGluayBwYXRoLgorICBndGVzdF9saWJzPSIke2J1aWxkX2Rpcn0vbGliL2xpYmd0ZXN0LmxhIEBQVEhSRUFEX0NGTEFHU0AgQFBUSFJFQURfTElCU0AiCisgIGd0ZXN0X2xkZmxhZ3M9IiIKKworICAjIFdlIHByb3ZpZGUgaG9va3MgdG8gaW5jbHVkZSBmcm9tIGVpdGhlciB0aGUgc291cmNlIG9yIGJ1aWxkIGRpciwgd2hlcmUgdGhlCisgICMgYnVpbGQgZGlyIGlzIGFsd2F5cyBwcmVmZXJyZWQuIFRoaXMgd2lsbCBwb3RlbnRpYWxseSBhbGxvdyB1cyB0byB3cml0ZQorICAjIGJ1aWxkIHJ1bGVzIGZvciBnZW5lcmF0ZWQgaGVhZGVycyBhbmQgaGF2ZSB0aGVtIGF1dG9tYXRpY2FsbHkgYmUgcHJlZmVycmVkCisgICMgb3ZlciBwcm92aWRlZCB2ZXJzaW9ucy4KKyAgZ3Rlc3RfY3BwZmxhZ3M9Ii1JJHtidWlsZF9kaXJ9L2luY2x1ZGUgLUkke3NyY19kaXJ9L2luY2x1ZGUiCisgIGd0ZXN0X2N4eGZsYWdzPSJAUFRIUkVBRF9DRkxBR1NAIgorZWxzZQorICAjIFdlJ3JlIHVzaW5nIGFuIGluc3RhbGxlZCBndGVzdCwgYWx0aG91Z2ggaXQgbWF5IGJlIHN0YWdlZCB1bmRlciBzb21lCisgICMgcHJlZml4LiBBc3N1bWUgKGFzIG91ciBvd24gbGlicmFyaWVzIGRvKSB0aGF0IHdlIGNhbiByZXNvbHZlIHRoZSBwcmVmaXgsCisgICMgYW5kIGFyZSBwcmVzZW50IGluIHRoZSBkeW5hbWljIGxpbmsgcGF0aHMuCisgIGd0ZXN0X2xkZmxhZ3M9Ii1MJHtsaWJkaXJ9IgorICBndGVzdF9saWJzPSItbCR7bmFtZX0gQFBUSFJFQURfQ0ZMQUdTQCBAUFRIUkVBRF9MSUJTQCIKKyAgZ3Rlc3RfY3BwZmxhZ3M9Ii1JJHtpbmNsdWRlZGlyfSIKKyAgZ3Rlc3RfY3h4ZmxhZ3M9IkBQVEhSRUFEX0NGTEFHU0AiCitmaQorCisjIERvIGFuIGluc3RhbGxhdGlvbiBxdWVyeSBpZiByZXF1ZXN0ZWQuCitpZiB0ZXN0IC1uICIkZG9fcXVlcnkiOyB0aGVuCisgIGNhc2UgJGRvX3F1ZXJ5IGluCisgICAgcHJlZml4KSAgICAgICAgICAgZWNobyAkcHJlZml4OyAgICAgICBleGl0IDA7OworICAgIGV4ZWMtcHJlZml4KSAgICAgIGVjaG8gJGV4ZWNfcHJlZml4OyAgZXhpdCAwOzsKKyAgICBsaWJkaXIpICAgICAgICAgICBlY2hvICRsaWJkaXI7ICAgICAgIGV4aXQgMDs7CisgICAgaW5jbHVkZWRpcikgICAgICAgZWNobyAkaW5jbHVkZWRpcjsgICBleGl0IDA7OworICAgIHZlcnNpb24pICAgICAgICAgIGVjaG8gJHZlcnNpb247ICAgICAgZXhpdCAwOzsKKyAgICAqKSAgICAgICAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMTs7CisgIGVzYWMKK2ZpCisKKyMgRG8gYSB2ZXJzaW9uIGNoZWNrIGlmIHJlcXVlc3RlZC4KK2lmIHRlc3QgIiRkb19jaGVja192ZXJzaW9ucyIgPSAieWVzIjsgdGhlbgorICAjIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgcmVjZWl2ZSBhIGJhZCBjb21iaW5hdGlvbiBvZiBwYXJhbWV0ZXJzLgorICB0ZXN0ICIkZWNob19jcHBmbGFncyIgPSAieWVzIiAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQorICB0ZXN0ICIkZWNob19jeHhmbGFncyIgPSAieWVzIiAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQorICB0ZXN0ICIkZWNob19sZGZsYWdzIiA9ICJ5ZXMiICAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQorICB0ZXN0ICIkZWNob19saWJzIiA9ICJ5ZXMiICAgICAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQorCisgIGlmIHRlc3QgIiRleGFjdF92ZXJzaW9uIiAhPSAiIjsgdGhlbgorICAgIGNoZWNrX3ZlcnNpb25zICRleGFjdF92ZXJzaW9uICRleGFjdF92ZXJzaW9uCisgICAgIyB1bnJlYWNoYWJsZQorICBlbHNlCisgICAgY2hlY2tfdmVyc2lvbnMgJHttaW5fdmVyc2lvbjotMC4wLjB9ICR7bWF4X3ZlcnNpb246LTk5OTkuOTk5OS45OTk5fQorICAgICMgdW5yZWFjaGFibGUKKyAgZmkKK2ZpCisKKyMgRG8gdGhlIG91dHB1dCBpbiB0aGUgY29ycmVjdCBvcmRlciBzbyB0aGF0IHRoZXNlIGNhbiBiZSB1c2VkIGluLWxpbmUgb2YKKyMgYSBjb21waWxlciBpbnZvY2F0aW9uLgorb3V0cHV0PSIiCit0ZXN0ICIkZWNob19jcHBmbGFncyIgPSAieWVzIiAmJiBvdXRwdXQ9IiRvdXRwdXQgJGd0ZXN0X2NwcGZsYWdzIgordGVzdCAiJGVjaG9fY3h4ZmxhZ3MiID0gInllcyIgJiYgb3V0cHV0PSIkb3V0cHV0ICRndGVzdF9jeHhmbGFncyIKK3Rlc3QgIiRlY2hvX2xkZmxhZ3MiID0gInllcyIgICYmIG91dHB1dD0iJG91dHB1dCAkZ3Rlc3RfbGRmbGFncyIKK3Rlc3QgIiRlY2hvX2xpYnMiID0gInllcyIgICAgICYmIG91dHB1dD0iJG91dHB1dCAkZ3Rlc3RfbGlicyIKK2VjaG8gJG91dHB1dAorCitleGl0IDAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2NyaXB0cy9wdW1wLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zY3JpcHRzL3B1bXAucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWVmYjY1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2NyaXB0cy9wdW1wLnB5CkBAIC0wLDAgKzEsODU1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJwdW1wIHYwLjIuMCAtIFByZXR0eSBVc2VmdWwgZm9yIE1ldGEgUHJvZ3JhbW1pbmcuCisKK0EgdG9vbCBmb3IgcHJlcHJvY2Vzc29yIG1ldGEgcHJvZ3JhbW1pbmcuICBVc2VmdWwgZm9yIGdlbmVyYXRpbmcKK3JlcGV0aXRpdmUgYm9pbGVycGxhdGUgY29kZS4gIEVzcGVjaWFsbHkgdXNlZnVsIGZvciB3cml0aW5nIEMrKworY2xhc3NlcywgZnVuY3Rpb25zLCBtYWNyb3MsIGFuZCB0ZW1wbGF0ZXMgdGhhdCBuZWVkIHRvIHdvcmsgd2l0aAordmFyaW91cyBudW1iZXIgb2YgYXJndW1lbnRzLgorCitVU0FHRToKKyAgICAgICBwdW1wLnB5IFNPVVJDRV9GSUxFCisKK0VYQU1QTEVTOgorICAgICAgIHB1bXAucHkgZm9vLmNjLnB1bXAKKyAgICAgICAgIENvbnZlcnRzIGZvby5jYy5wdW1wIHRvIGZvby5jYy4KKworR1JBTU1BUjoKKyAgICAgICBDT0RFIDo6PSBBVE9NSUNfQ09ERSoKKyAgICAgICBBVE9NSUNfQ09ERSA6Oj0gJHZhciBJRCA9IEVYUFJFU1NJT04KKyAgICAgICAgICAgfCAkdmFyIElEID0gW1sgQ09ERSBdXQorICAgICAgICAgICB8ICRyYW5nZSBJRCBFWFBSRVNTSU9OLi5FWFBSRVNTSU9OCisgICAgICAgICAgIHwgJGZvciBJRCBTRVBBUkFUT1IgW1sgQ09ERSBdXQorICAgICAgICAgICB8ICQoJCkKKyAgICAgICAgICAgfCAkSUQKKyAgICAgICAgICAgfCAkKEVYUFJFU1NJT04pCisgICAgICAgICAgIHwgJGlmIEVYUFJFU1NJT04gW1sgQ09ERSBdXSBFTFNFX0JSQU5DSAorICAgICAgICAgICB8IFtbIENPREUgXV0KKyAgICAgICAgICAgfCBSQVdfQ09ERQorICAgICAgIFNFUEFSQVRPUiA6Oj0gUkFXX0NPREUgfCBFTVBUWQorICAgICAgIEVMU0VfQlJBTkNIIDo6PSAkZWxzZSBbWyBDT0RFIF1dCisgICAgICAgICAgIHwgJGVsaWYgRVhQUkVTU0lPTiBbWyBDT0RFIF1dIEVMU0VfQlJBTkNICisgICAgICAgICAgIHwgRU1QVFkKKyAgICAgICBFWFBSRVNTSU9OIGhhcyBQeXRob24gc3ludGF4LgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKKworVE9LRU5fVEFCTEUgPSBbCisgICAgKHJlLmNvbXBpbGUocidcJHZhclxzKycpLCAnJHZhcicpLAorICAgIChyZS5jb21waWxlKHInXCRlbGlmXHMrJyksICckZWxpZicpLAorICAgIChyZS5jb21waWxlKHInXCRlbHNlXHMrJyksICckZWxzZScpLAorICAgIChyZS5jb21waWxlKHInXCRmb3JccysnKSwgJyRmb3InKSwKKyAgICAocmUuY29tcGlsZShyJ1wkaWZccysnKSwgJyRpZicpLAorICAgIChyZS5jb21waWxlKHInXCRyYW5nZVxzKycpLCAnJHJhbmdlJyksCisgICAgKHJlLmNvbXBpbGUocidcJFtfQS1aYS16XVx3KicpLCAnJGlkJyksCisgICAgKHJlLmNvbXBpbGUocidcJFwoXCRcKScpLCAnJCgkKScpLAorICAgIChyZS5jb21waWxlKHInXCQnKSwgJyQnKSwKKyAgICAocmUuY29tcGlsZShyJ1xbXFtcbj8nKSwgJ1tbJyksCisgICAgKHJlLmNvbXBpbGUocidcXVxdXG4/JyksICddXScpLAorICAgIF0KKworCitjbGFzcyBDdXJzb3I6CisgICIiIlJlcHJlc2VudHMgYSBwb3NpdGlvbiAobGluZSBhbmQgY29sdW1uKSBpbiBhIHRleHQgZmlsZS4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbGluZT0tMSwgY29sdW1uPS0xKToKKyAgICBzZWxmLmxpbmUgPSBsaW5lCisgICAgc2VsZi5jb2x1bW4gPSBjb2x1bW4KKworICBkZWYgX19lcV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHNlbGYubGluZSA9PSByaHMubGluZSBhbmQgc2VsZi5jb2x1bW4gPT0gcmhzLmNvbHVtbgorCisgIGRlZiBfX25lX18oc2VsZiwgcmhzKToKKyAgICByZXR1cm4gbm90IHNlbGYgPT0gcmhzCisKKyAgZGVmIF9fbHRfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiBzZWxmLmxpbmUgPCByaHMubGluZSBvciAoCisgICAgICAgIHNlbGYubGluZSA9PSByaHMubGluZSBhbmQgc2VsZi5jb2x1bW4gPCByaHMuY29sdW1uKQorCisgIGRlZiBfX2xlX18oc2VsZiwgcmhzKToKKyAgICByZXR1cm4gc2VsZiA8IHJocyBvciBzZWxmID09IHJocworCisgIGRlZiBfX2d0X18oc2VsZiwgcmhzKToKKyAgICByZXR1cm4gcmhzIDwgc2VsZgorCisgIGRlZiBfX2dlX18oc2VsZiwgcmhzKToKKyAgICByZXR1cm4gcmhzIDw9IHNlbGYKKworICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICBpZiBzZWxmID09IEVvZigpOgorICAgICAgcmV0dXJuICdFT0YnCisgICAgZWxzZToKKyAgICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLmxpbmUgKyAxLCBzZWxmLmNvbHVtbikKKworICBkZWYgX19hZGRfXyhzZWxmLCBvZmZzZXQpOgorICAgIHJldHVybiBDdXJzb3Ioc2VsZi5saW5lLCBzZWxmLmNvbHVtbiArIG9mZnNldCkKKworICBkZWYgX19zdWJfXyhzZWxmLCBvZmZzZXQpOgorICAgIHJldHVybiBDdXJzb3Ioc2VsZi5saW5lLCBzZWxmLmNvbHVtbiAtIG9mZnNldCkKKworICBkZWYgQ2xvbmUoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIGNvcHkgb2Ygc2VsZi4iIiIKKworICAgIHJldHVybiBDdXJzb3Ioc2VsZi5saW5lLCBzZWxmLmNvbHVtbikKKworCisjIFNwZWNpYWwgY3Vyc29yIHRvIGluZGljYXRlIHRoZSBlbmQtb2YtZmlsZS4KK2RlZiBFb2YoKToKKyAgIiIiUmV0dXJucyB0aGUgc3BlY2lhbCBjdXJzb3IgdG8gZGVub3RlIHRoZSBlbmQtb2YtZmlsZS4iIiIKKyAgcmV0dXJuIEN1cnNvcigtMSwgLTEpCisKKworY2xhc3MgVG9rZW46CisgICIiIlJlcHJlc2VudHMgYSB0b2tlbiBpbiBhIFB1bXAgc291cmNlIGZpbGUuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lLCB2YWx1ZT1Ob25lLCB0b2tlbl90eXBlPU5vbmUpOgorICAgIGlmIHN0YXJ0IGlzIE5vbmU6CisgICAgICBzZWxmLnN0YXJ0ID0gRW9mKCkKKyAgICBlbHNlOgorICAgICAgc2VsZi5zdGFydCA9IHN0YXJ0CisgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICBzZWxmLmVuZCA9IEVvZigpCisgICAgZWxzZToKKyAgICAgIHNlbGYuZW5kID0gZW5kCisgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgc2VsZi50b2tlbl90eXBlID0gdG9rZW5fdHlwZQorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHJldHVybiAnVG9rZW4gQCVzOiBcJyVzXCcgdHlwZT0lcycgJSAoCisgICAgICAgIHNlbGYuc3RhcnQsIHNlbGYudmFsdWUsIHNlbGYudG9rZW5fdHlwZSkKKworICBkZWYgQ2xvbmUoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIGNvcHkgb2Ygc2VsZi4iIiIKKworICAgIHJldHVybiBUb2tlbihzZWxmLnN0YXJ0LkNsb25lKCksIHNlbGYuZW5kLkNsb25lKCksIHNlbGYudmFsdWUsCisgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5fdHlwZSkKKworCitkZWYgU3RhcnRzV2l0aChsaW5lcywgcG9zLCBzdHJpbmcpOgorICAiIiJSZXR1cm5zIFRydWUgaWZmIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBsaW5lcyBzdGFydHMgd2l0aCAnc3RyaW5nJy4iIiIKKworICByZXR1cm4gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XS5zdGFydHN3aXRoKHN0cmluZykKKworCitkZWYgRmluZEZpcnN0SW5MaW5lKGxpbmUsIHRva2VuX3RhYmxlKToKKyAgYmVzdF9tYXRjaF9zdGFydCA9IC0xCisgIGZvciAocmVnZXgsIHRva2VuX3R5cGUpIGluIHRva2VuX3RhYmxlOgorICAgIG0gPSByZWdleC5zZWFyY2gobGluZSkKKyAgICBpZiBtOgorICAgICAgIyBXZSBmb3VuZCByZWdleCBpbiBsaW5lcworICAgICAgaWYgYmVzdF9tYXRjaF9zdGFydCA8IDAgb3IgbS5zdGFydCgpIDwgYmVzdF9tYXRjaF9zdGFydDoKKyAgICAgICAgYmVzdF9tYXRjaF9zdGFydCA9IG0uc3RhcnQoKQorICAgICAgICBiZXN0X21hdGNoX2xlbmd0aCA9IG0uZW5kKCkgLSBtLnN0YXJ0KCkKKyAgICAgICAgYmVzdF9tYXRjaF90b2tlbl90eXBlID0gdG9rZW5fdHlwZQorCisgIGlmIGJlc3RfbWF0Y2hfc3RhcnQgPCAwOgorICAgIHJldHVybiBOb25lCisKKyAgcmV0dXJuIChiZXN0X21hdGNoX3N0YXJ0LCBiZXN0X21hdGNoX2xlbmd0aCwgYmVzdF9tYXRjaF90b2tlbl90eXBlKQorCisKK2RlZiBGaW5kRmlyc3QobGluZXMsIHRva2VuX3RhYmxlLCBjdXJzb3IpOgorICAiIiJGaW5kcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgc3RyaW5nIGluIHN0cmluZ3MgaW4gbGluZXMuIiIiCisKKyAgc3RhcnQgPSBjdXJzb3IuQ2xvbmUoKQorICBjdXJfbGluZV9udW1iZXIgPSBjdXJzb3IubGluZQorICBmb3IgbGluZSBpbiBsaW5lc1tzdGFydC5saW5lOl06CisgICAgaWYgY3VyX2xpbmVfbnVtYmVyID09IHN0YXJ0LmxpbmU6CisgICAgICBsaW5lID0gbGluZVtzdGFydC5jb2x1bW46XQorICAgIG0gPSBGaW5kRmlyc3RJbkxpbmUobGluZSwgdG9rZW5fdGFibGUpCisgICAgaWYgbToKKyAgICAgICMgV2UgZm91bmQgYSByZWdleCBpbiBsaW5lLgorICAgICAgKHN0YXJ0X2NvbHVtbiwgbGVuZ3RoLCB0b2tlbl90eXBlKSA9IG0KKyAgICAgIGlmIGN1cl9saW5lX251bWJlciA9PSBzdGFydC5saW5lOgorICAgICAgICBzdGFydF9jb2x1bW4gKz0gc3RhcnQuY29sdW1uCisgICAgICBmb3VuZF9zdGFydCA9IEN1cnNvcihjdXJfbGluZV9udW1iZXIsIHN0YXJ0X2NvbHVtbikKKyAgICAgIGZvdW5kX2VuZCA9IGZvdW5kX3N0YXJ0ICsgbGVuZ3RoCisgICAgICByZXR1cm4gTWFrZVRva2VuKGxpbmVzLCBmb3VuZF9zdGFydCwgZm91bmRfZW5kLCB0b2tlbl90eXBlKQorICAgIGN1cl9saW5lX251bWJlciArPSAxCisgICMgV2UgZmFpbGVkIHRvIGZpbmQgc3RyIGluIGxpbmVzCisgIHJldHVybiBOb25lCisKKworZGVmIFN1YlN0cmluZyhsaW5lcywgc3RhcnQsIGVuZCk6CisgICIiIlJldHVybnMgYSBzdWJzdHJpbmcgaW4gbGluZXMuIiIiCisKKyAgaWYgZW5kID09IEVvZigpOgorICAgIGVuZCA9IEN1cnNvcihsZW4obGluZXMpIC0gMSwgbGVuKGxpbmVzWy0xXSkpCisKKyAgaWYgc3RhcnQgPj0gZW5kOgorICAgIHJldHVybiAnJworCisgIGlmIHN0YXJ0LmxpbmUgPT0gZW5kLmxpbmU6CisgICAgcmV0dXJuIGxpbmVzW3N0YXJ0LmxpbmVdW3N0YXJ0LmNvbHVtbjplbmQuY29sdW1uXQorCisgIHJlc3VsdF9saW5lcyA9IChbbGluZXNbc3RhcnQubGluZV1bc3RhcnQuY29sdW1uOl1dICsKKyAgICAgICAgICAgICAgICAgIGxpbmVzW3N0YXJ0LmxpbmUgKyAxOmVuZC5saW5lXSArCisgICAgICAgICAgICAgICAgICBbbGluZXNbZW5kLmxpbmVdWzplbmQuY29sdW1uXV0pCisgIHJldHVybiAnJy5qb2luKHJlc3VsdF9saW5lcykKKworCitkZWYgU3RyaXBNZXRhQ29tbWVudHMoc3RyKToKKyAgIiIiU3RyaXAgbWV0YSBjb21tZW50cyBmcm9tIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiIiIgorCisgICMgRmlyc3QsIGNvbXBsZXRlbHkgcmVtb3ZlIGxpbmVzIGNvbnRhaW5pbmcgbm90aGluZyBidXQgYSBtZXRhCisgICMgY29tbWVudCwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBcbi4KKyAgc3RyID0gcmUuc3ViKHInXlxzKlwkXCQuKlxuJywgJycsIHN0cikKKworICAjIFRoZW4sIHJlbW92ZSBtZXRhIGNvbW1lbnRzIGZyb20gY29udGVudGZ1bCBsaW5lcy4KKyAgcmV0dXJuIHJlLnN1YihyJ1xzKlwkXCQuKicsICcnLCBzdHIpCisKKworZGVmIE1ha2VUb2tlbihsaW5lcywgc3RhcnQsIGVuZCwgdG9rZW5fdHlwZSk6CisgICIiIkNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVG9rZW4uIiIiCisKKyAgcmV0dXJuIFRva2VuKHN0YXJ0LCBlbmQsIFN1YlN0cmluZyhsaW5lcywgc3RhcnQsIGVuZCksIHRva2VuX3R5cGUpCisKKworZGVmIFBhcnNlVG9rZW4obGluZXMsIHBvcywgcmVnZXgsIHRva2VuX3R5cGUpOgorICBsaW5lID0gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XQorICBtID0gcmVnZXguc2VhcmNoKGxpbmUpCisgIGlmIG0gYW5kIG5vdCBtLnN0YXJ0KCk6CisgICAgcmV0dXJuIE1ha2VUb2tlbihsaW5lcywgcG9zLCBwb3MgKyBtLmVuZCgpLCB0b2tlbl90eXBlKQorICBlbHNlOgorICAgIHByaW50ICdFUlJPUjogJXMgZXhwZWN0ZWQgYXQgJXMuJyAlICh0b2tlbl90eXBlLCBwb3MpCisgICAgc3lzLmV4aXQoMSkKKworCitJRF9SRUdFWCA9IHJlLmNvbXBpbGUocidbX0EtWmEtel1cdyonKQorRVFfUkVHRVggPSByZS5jb21waWxlKHInPScpCitSRVNUX09GX0xJTkVfUkVHRVggPSByZS5jb21waWxlKHInLio/KD89JHxcJFwkKScpCitPUFRJT05BTF9XSElURV9TUEFDRVNfUkVHRVggPSByZS5jb21waWxlKHInXHMqJykKK1dISVRFX1NQQUNFX1JFR0VYID0gcmUuY29tcGlsZShyJ1xzJykKK0RPVF9ET1RfUkVHRVggPSByZS5jb21waWxlKHInXC5cLicpCisKKworZGVmIFNraXAobGluZXMsIHBvcywgcmVnZXgpOgorICBsaW5lID0gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XQorICBtID0gcmUuc2VhcmNoKHJlZ2V4LCBsaW5lKQorICBpZiBtIGFuZCBub3QgbS5zdGFydCgpOgorICAgIHJldHVybiBwb3MgKyBtLmVuZCgpCisgIGVsc2U6CisgICAgcmV0dXJuIHBvcworCisKK2RlZiBTa2lwVW50aWwobGluZXMsIHBvcywgcmVnZXgsIHRva2VuX3R5cGUpOgorICBsaW5lID0gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XQorICBtID0gcmUuc2VhcmNoKHJlZ2V4LCBsaW5lKQorICBpZiBtOgorICAgIHJldHVybiBwb3MgKyBtLnN0YXJ0KCkKKyAgZWxzZToKKyAgICBwcmludCAoJ0VSUk9SOiAlcyBleHBlY3RlZCBvbiBsaW5lICVzIGFmdGVyIGNvbHVtbiAlcy4nICUKKyAgICAgICAgICAgKHRva2VuX3R5cGUsIHBvcy5saW5lICsgMSwgcG9zLmNvbHVtbikpCisgICAgc3lzLmV4aXQoMSkKKworCitkZWYgUGFyc2VFeHBUb2tlbkluUGFyZW5zKGxpbmVzLCBwb3MpOgorICBkZWYgUGFyc2VJblBhcmVucyhwb3MpOgorICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgT1BUSU9OQUxfV0hJVEVfU1BBQ0VTX1JFR0VYKQorICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgcidcKCcpCisgICAgcG9zID0gUGFyc2UocG9zKQorICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgcidcKScpCisgICAgcmV0dXJuIHBvcworCisgIGRlZiBQYXJzZShwb3MpOgorICAgIHBvcyA9IFNraXBVbnRpbChsaW5lcywgcG9zLCByJ1wofFwpJywgJyknKQorICAgIGlmIFN1YlN0cmluZyhsaW5lcywgcG9zLCBwb3MgKyAxKSA9PSAnKCc6CisgICAgICBwb3MgPSBQYXJzZShwb3MgKyAxKQorICAgICAgcG9zID0gU2tpcChsaW5lcywgcG9zLCByJ1wpJykKKyAgICAgIHJldHVybiBQYXJzZShwb3MpCisgICAgZWxzZToKKyAgICAgIHJldHVybiBwb3MKKworICBzdGFydCA9IHBvcy5DbG9uZSgpCisgIHBvcyA9IFBhcnNlSW5QYXJlbnMocG9zKQorICByZXR1cm4gTWFrZVRva2VuKGxpbmVzLCBzdGFydCwgcG9zLCAnZXhwJykKKworCitkZWYgUlN0cmlwTmV3TGluZUZyb21Ub2tlbih0b2tlbik6CisgIGlmIHRva2VuLnZhbHVlLmVuZHN3aXRoKCdcbicpOgorICAgIHJldHVybiBUb2tlbih0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCB0b2tlbi52YWx1ZVs6LTFdLCB0b2tlbi50b2tlbl90eXBlKQorICBlbHNlOgorICAgIHJldHVybiB0b2tlbgorCisKK2RlZiBUb2tlbml6ZUxpbmVzKGxpbmVzLCBwb3MpOgorICB3aGlsZSBUcnVlOgorICAgIGZvdW5kID0gRmluZEZpcnN0KGxpbmVzLCBUT0tFTl9UQUJMRSwgcG9zKQorICAgIGlmIG5vdCBmb3VuZDoKKyAgICAgIHlpZWxkIE1ha2VUb2tlbihsaW5lcywgcG9zLCBFb2YoKSwgJ2NvZGUnKQorICAgICAgcmV0dXJuCisKKyAgICBpZiBmb3VuZC5zdGFydCA9PSBwb3M6CisgICAgICBwcmV2X3Rva2VuID0gTm9uZQorICAgICAgcHJldl90b2tlbl9yc3RyaXBwZWQgPSBOb25lCisgICAgZWxzZToKKyAgICAgIHByZXZfdG9rZW4gPSBNYWtlVG9rZW4obGluZXMsIHBvcywgZm91bmQuc3RhcnQsICdjb2RlJykKKyAgICAgIHByZXZfdG9rZW5fcnN0cmlwcGVkID0gUlN0cmlwTmV3TGluZUZyb21Ub2tlbihwcmV2X3Rva2VuKQorCisgICAgaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJHZhcic6CisgICAgICBpZiBwcmV2X3Rva2VuX3JzdHJpcHBlZDoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbl9yc3RyaXBwZWQKKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBpZF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIGZvdW5kLmVuZCwgSURfUkVHRVgsICdpZCcpCisgICAgICB5aWVsZCBpZF90b2tlbgorICAgICAgcG9zID0gU2tpcChsaW5lcywgaWRfdG9rZW4uZW5kLCBPUFRJT05BTF9XSElURV9TUEFDRVNfUkVHRVgpCisKKyAgICAgIGVxX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgcG9zLCBFUV9SRUdFWCwgJz0nKQorICAgICAgeWllbGQgZXFfdG9rZW4KKyAgICAgIHBvcyA9IFNraXAobGluZXMsIGVxX3Rva2VuLmVuZCwgcidccyonKQorCisgICAgICBpZiBTdWJTdHJpbmcobGluZXMsIHBvcywgcG9zICsgMikgIT0gJ1tbJzoKKyAgICAgICAgZXhwX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgcG9zLCBSRVNUX09GX0xJTkVfUkVHRVgsICdleHAnKQorICAgICAgICB5aWVsZCBleHBfdG9rZW4KKyAgICAgICAgcG9zID0gQ3Vyc29yKGV4cF90b2tlbi5lbmQubGluZSArIDEsIDApCisgICAgZWxpZiBmb3VuZC50b2tlbl90eXBlID09ICckZm9yJzoKKyAgICAgIGlmIHByZXZfdG9rZW5fcnN0cmlwcGVkOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuX3JzdHJpcHBlZAorICAgICAgeWllbGQgZm91bmQKKyAgICAgIGlkX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgZm91bmQuZW5kLCBJRF9SRUdFWCwgJ2lkJykKKyAgICAgIHlpZWxkIGlkX3Rva2VuCisgICAgICBwb3MgPSBTa2lwKGxpbmVzLCBpZF90b2tlbi5lbmQsIFdISVRFX1NQQUNFX1JFR0VYKQorICAgIGVsaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJHJhbmdlJzoKKyAgICAgIGlmIHByZXZfdG9rZW5fcnN0cmlwcGVkOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuX3JzdHJpcHBlZAorICAgICAgeWllbGQgZm91bmQKKyAgICAgIGlkX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgZm91bmQuZW5kLCBJRF9SRUdFWCwgJ2lkJykKKyAgICAgIHlpZWxkIGlkX3Rva2VuCisgICAgICBwb3MgPSBTa2lwKGxpbmVzLCBpZF90b2tlbi5lbmQsIE9QVElPTkFMX1dISVRFX1NQQUNFU19SRUdFWCkKKworICAgICAgZG90c19wb3MgPSBTa2lwVW50aWwobGluZXMsIHBvcywgRE9UX0RPVF9SRUdFWCwgJy4uJykKKyAgICAgIHlpZWxkIE1ha2VUb2tlbihsaW5lcywgcG9zLCBkb3RzX3BvcywgJ2V4cCcpCisgICAgICB5aWVsZCBNYWtlVG9rZW4obGluZXMsIGRvdHNfcG9zLCBkb3RzX3BvcyArIDIsICcuLicpCisgICAgICBwb3MgPSBkb3RzX3BvcyArIDIKKyAgICAgIG5ld19wb3MgPSBDdXJzb3IocG9zLmxpbmUgKyAxLCAwKQorICAgICAgeWllbGQgTWFrZVRva2VuKGxpbmVzLCBwb3MsIG5ld19wb3MsICdleHAnKQorICAgICAgcG9zID0gbmV3X3BvcworICAgIGVsaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJCc6CisgICAgICBpZiBwcmV2X3Rva2VuOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgZXhwX3Rva2VuID0gUGFyc2VFeHBUb2tlbkluUGFyZW5zKGxpbmVzLCBmb3VuZC5lbmQpCisgICAgICB5aWVsZCBleHBfdG9rZW4KKyAgICAgIHBvcyA9IGV4cF90b2tlbi5lbmQKKyAgICBlbGlmIChmb3VuZC50b2tlbl90eXBlID09ICddXScgb3IgZm91bmQudG9rZW5fdHlwZSA9PSAnJGlmJyBvcgorICAgICAgICAgIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRlbGlmJyBvciBmb3VuZC50b2tlbl90eXBlID09ICckZWxzZScpOgorICAgICAgaWYgcHJldl90b2tlbl9yc3RyaXBwZWQ6CisgICAgICAgIHlpZWxkIHByZXZfdG9rZW5fcnN0cmlwcGVkCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgcG9zID0gZm91bmQuZW5kCisgICAgZWxzZToKKyAgICAgIGlmIHByZXZfdG9rZW46CisgICAgICAgIHlpZWxkIHByZXZfdG9rZW4KKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBwb3MgPSBmb3VuZC5lbmQKKworCitkZWYgVG9rZW5pemUocyk6CisgICIiIkEgZ2VuZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB0b2tlbnMgaW4gdGhlIGdpdmVuIHN0cmluZy4iIiIKKyAgaWYgcyAhPSAnJzoKKyAgICBsaW5lcyA9IHMuc3BsaXRsaW5lcyhUcnVlKQorICAgIGZvciB0b2tlbiBpbiBUb2tlbml6ZUxpbmVzKGxpbmVzLCBDdXJzb3IoMCwgMCkpOgorICAgICAgeWllbGQgdG9rZW4KKworCitjbGFzcyBDb2RlTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGF0b21pY19jb2RlX2xpc3Q9Tm9uZSk6CisgICAgc2VsZi5hdG9taWNfY29kZSA9IGF0b21pY19jb2RlX2xpc3QKKworCitjbGFzcyBWYXJOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgaWRlbnRpZmllcj1Ob25lLCBhdG9taWNfY29kZT1Ob25lKToKKyAgICBzZWxmLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyCisgICAgc2VsZi5hdG9taWNfY29kZSA9IGF0b21pY19jb2RlCisKKworY2xhc3MgUmFuZ2VOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgaWRlbnRpZmllcj1Ob25lLCBleHAxPU5vbmUsIGV4cDI9Tm9uZSk6CisgICAgc2VsZi5pZGVudGlmaWVyID0gaWRlbnRpZmllcgorICAgIHNlbGYuZXhwMSA9IGV4cDEKKyAgICBzZWxmLmV4cDIgPSBleHAyCisKKworY2xhc3MgRm9yTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGlkZW50aWZpZXI9Tm9uZSwgc2VwPU5vbmUsIGNvZGU9Tm9uZSk6CisgICAgc2VsZi5pZGVudGlmaWVyID0gaWRlbnRpZmllcgorICAgIHNlbGYuc2VwID0gc2VwCisgICAgc2VsZi5jb2RlID0gY29kZQorCisKK2NsYXNzIEVsc2VOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgZWxzZV9icmFuY2g9Tm9uZSk6CisgICAgc2VsZi5lbHNlX2JyYW5jaCA9IGVsc2VfYnJhbmNoCisKKworY2xhc3MgSWZOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgZXhwPU5vbmUsIHRoZW5fYnJhbmNoPU5vbmUsIGVsc2VfYnJhbmNoPU5vbmUpOgorICAgIHNlbGYuZXhwID0gZXhwCisgICAgc2VsZi50aGVuX2JyYW5jaCA9IHRoZW5fYnJhbmNoCisgICAgc2VsZi5lbHNlX2JyYW5jaCA9IGVsc2VfYnJhbmNoCisKKworY2xhc3MgUmF3Q29kZU5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlbj1Ob25lKToKKyAgICBzZWxmLnJhd19jb2RlID0gdG9rZW4KKworCitjbGFzcyBMaXRlcmFsRG9sbGFyTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuKToKKyAgICBzZWxmLnRva2VuID0gdG9rZW4KKworCitjbGFzcyBFeHBOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW4sIHB5dGhvbl9leHApOgorICAgIHNlbGYudG9rZW4gPSB0b2tlbgorICAgIHNlbGYucHl0aG9uX2V4cCA9IHB5dGhvbl9leHAKKworCitkZWYgUG9wRnJvbnQoYV9saXN0KToKKyAgaGVhZCA9IGFfbGlzdFswXQorICBhX2xpc3RbOjFdID0gW10KKyAgcmV0dXJuIGhlYWQKKworCitkZWYgUHVzaEZyb250KGFfbGlzdCwgZWxlbSk6CisgIGFfbGlzdFs6MF0gPSBbZWxlbV0KKworCitkZWYgUG9wVG9rZW4oYV9saXN0LCB0b2tlbl90eXBlPU5vbmUpOgorICB0b2tlbiA9IFBvcEZyb250KGFfbGlzdCkKKyAgaWYgdG9rZW5fdHlwZSBpcyBub3QgTm9uZSBhbmQgdG9rZW4udG9rZW5fdHlwZSAhPSB0b2tlbl90eXBlOgorICAgIHByaW50ICdFUlJPUjogJXMgZXhwZWN0ZWQgYXQgJXMnICUgKHRva2VuX3R5cGUsIHRva2VuLnN0YXJ0KQorICAgIHByaW50ICdFUlJPUjogJXMgZm91bmQgaW5zdGVhZCcgJSAodG9rZW4sKQorICAgIHN5cy5leGl0KDEpCisKKyAgcmV0dXJuIHRva2VuCisKKworZGVmIFBlZWtUb2tlbihhX2xpc3QpOgorICBpZiBub3QgYV9saXN0OgorICAgIHJldHVybiBOb25lCisKKyAgcmV0dXJuIGFfbGlzdFswXQorCisKK2RlZiBQYXJzZUV4cE5vZGUodG9rZW4pOgorICBweXRob25fZXhwID0gcmUuc3ViKHInKFtfQS1aYS16XVx3KiknLCByJ3NlbGYuR2V0VmFsdWUoIlwxIiknLCB0b2tlbi52YWx1ZSkKKyAgcmV0dXJuIEV4cE5vZGUodG9rZW4sIHB5dGhvbl9leHApCisKKworZGVmIFBhcnNlRWxzZU5vZGUodG9rZW5zKToKKyAgZGVmIFBvcCh0b2tlbl90eXBlPU5vbmUpOgorICAgIHJldHVybiBQb3BUb2tlbih0b2tlbnMsIHRva2VuX3R5cGUpCisKKyAgbmV4dCA9IFBlZWtUb2tlbih0b2tlbnMpCisgIGlmIG5vdCBuZXh0OgorICAgIHJldHVybiBOb25lCisgIGlmIG5leHQudG9rZW5fdHlwZSA9PSAnJGVsc2UnOgorICAgIFBvcCgnJGVsc2UnKQorICAgIFBvcCgnW1snKQorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIHJldHVybiBjb2RlX25vZGUKKyAgZWxpZiBuZXh0LnRva2VuX3R5cGUgPT0gJyRlbGlmJzoKKyAgICBQb3AoJyRlbGlmJykKKyAgICBleHAgPSBQb3AoJ2NvZGUnKQorICAgIFBvcCgnW1snKQorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIGlubmVyX2Vsc2Vfbm9kZSA9IFBhcnNlRWxzZU5vZGUodG9rZW5zKQorICAgIHJldHVybiBDb2RlTm9kZShbSWZOb2RlKFBhcnNlRXhwTm9kZShleHApLCBjb2RlX25vZGUsIGlubmVyX2Vsc2Vfbm9kZSldKQorICBlbGlmIG5vdCBuZXh0LnZhbHVlLnN0cmlwKCk6CisgICAgUG9wKCdjb2RlJykKKyAgICByZXR1cm4gUGFyc2VFbHNlTm9kZSh0b2tlbnMpCisgIGVsc2U6CisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgUGFyc2VBdG9taWNDb2RlTm9kZSh0b2tlbnMpOgorICBkZWYgUG9wKHRva2VuX3R5cGU9Tm9uZSk6CisgICAgcmV0dXJuIFBvcFRva2VuKHRva2VucywgdG9rZW5fdHlwZSkKKworICBoZWFkID0gUG9wRnJvbnQodG9rZW5zKQorICB0ID0gaGVhZC50b2tlbl90eXBlCisgIGlmIHQgPT0gJ2NvZGUnOgorICAgIHJldHVybiBSYXdDb2RlTm9kZShoZWFkKQorICBlbGlmIHQgPT0gJyR2YXInOgorICAgIGlkX3Rva2VuID0gUG9wKCdpZCcpCisgICAgUG9wKCc9JykKKyAgICBuZXh0ID0gUGVla1Rva2VuKHRva2VucykKKyAgICBpZiBuZXh0LnRva2VuX3R5cGUgPT0gJ2V4cCc6CisgICAgICBleHBfdG9rZW4gPSBQb3AoKQorICAgICAgcmV0dXJuIFZhck5vZGUoaWRfdG9rZW4sIFBhcnNlRXhwTm9kZShleHBfdG9rZW4pKQorICAgIFBvcCgnW1snKQorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIHJldHVybiBWYXJOb2RlKGlkX3Rva2VuLCBjb2RlX25vZGUpCisgIGVsaWYgdCA9PSAnJGZvcic6CisgICAgaWRfdG9rZW4gPSBQb3AoJ2lkJykKKyAgICBuZXh0X3Rva2VuID0gUGVla1Rva2VuKHRva2VucykKKyAgICBpZiBuZXh0X3Rva2VuLnRva2VuX3R5cGUgPT0gJ2NvZGUnOgorICAgICAgc2VwX3Rva2VuID0gbmV4dF90b2tlbgorICAgICAgUG9wKCdjb2RlJykKKyAgICBlbHNlOgorICAgICAgc2VwX3Rva2VuID0gTm9uZQorICAgIFBvcCgnW1snKQorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIHJldHVybiBGb3JOb2RlKGlkX3Rva2VuLCBzZXBfdG9rZW4sIGNvZGVfbm9kZSkKKyAgZWxpZiB0ID09ICckaWYnOgorICAgIGV4cF90b2tlbiA9IFBvcCgnY29kZScpCisgICAgUG9wKCdbWycpCisgICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgICAgUG9wKCddXScpCisgICAgZWxzZV9ub2RlID0gUGFyc2VFbHNlTm9kZSh0b2tlbnMpCisgICAgcmV0dXJuIElmTm9kZShQYXJzZUV4cE5vZGUoZXhwX3Rva2VuKSwgY29kZV9ub2RlLCBlbHNlX25vZGUpCisgIGVsaWYgdCA9PSAnJHJhbmdlJzoKKyAgICBpZF90b2tlbiA9IFBvcCgnaWQnKQorICAgIGV4cDFfdG9rZW4gPSBQb3AoJ2V4cCcpCisgICAgUG9wKCcuLicpCisgICAgZXhwMl90b2tlbiA9IFBvcCgnZXhwJykKKyAgICByZXR1cm4gUmFuZ2VOb2RlKGlkX3Rva2VuLCBQYXJzZUV4cE5vZGUoZXhwMV90b2tlbiksCisgICAgICAgICAgICAgICAgICAgICBQYXJzZUV4cE5vZGUoZXhwMl90b2tlbikpCisgIGVsaWYgdCA9PSAnJGlkJzoKKyAgICByZXR1cm4gUGFyc2VFeHBOb2RlKFRva2VuKGhlYWQuc3RhcnQgKyAxLCBoZWFkLmVuZCwgaGVhZC52YWx1ZVsxOl0sICdpZCcpKQorICBlbGlmIHQgPT0gJyQoJCknOgorICAgIHJldHVybiBMaXRlcmFsRG9sbGFyTm9kZShoZWFkKQorICBlbGlmIHQgPT0gJyQnOgorICAgIGV4cF90b2tlbiA9IFBvcCgnZXhwJykKKyAgICByZXR1cm4gUGFyc2VFeHBOb2RlKGV4cF90b2tlbikKKyAgZWxpZiB0ID09ICdbWyc6CisgICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgICAgUG9wKCddXScpCisgICAgcmV0dXJuIGNvZGVfbm9kZQorICBlbHNlOgorICAgIFB1c2hGcm9udCh0b2tlbnMsIGhlYWQpCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgUGFyc2VDb2RlTm9kZSh0b2tlbnMpOgorICBhdG9taWNfY29kZV9saXN0ID0gW10KKyAgd2hpbGUgVHJ1ZToKKyAgICBpZiBub3QgdG9rZW5zOgorICAgICAgYnJlYWsKKyAgICBhdG9taWNfY29kZV9ub2RlID0gUGFyc2VBdG9taWNDb2RlTm9kZSh0b2tlbnMpCisgICAgaWYgYXRvbWljX2NvZGVfbm9kZToKKyAgICAgIGF0b21pY19jb2RlX2xpc3QuYXBwZW5kKGF0b21pY19jb2RlX25vZGUpCisgICAgZWxzZToKKyAgICAgIGJyZWFrCisgIHJldHVybiBDb2RlTm9kZShhdG9taWNfY29kZV9saXN0KQorCisKK2RlZiBQYXJzZVRvQVNUKHB1bXBfc3JjX3RleHQpOgorICAiIiJDb252ZXJ0IHRoZSBnaXZlbiBQdW1wIHNvdXJjZSB0ZXh0IGludG8gYW4gQVNULiIiIgorICB0b2tlbnMgPSBsaXN0KFRva2VuaXplKHB1bXBfc3JjX3RleHQpKQorICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgcmV0dXJuIGNvZGVfbm9kZQorCisKK2NsYXNzIEVudjoKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYudmFyaWFibGVzID0gW10KKyAgICBzZWxmLnJhbmdlcyA9IFtdCisKKyAgZGVmIENsb25lKHNlbGYpOgorICAgIGNsb25lID0gRW52KCkKKyAgICBjbG9uZS52YXJpYWJsZXMgPSBzZWxmLnZhcmlhYmxlc1s6XQorICAgIGNsb25lLnJhbmdlcyA9IHNlbGYucmFuZ2VzWzpdCisgICAgcmV0dXJuIGNsb25lCisKKyAgZGVmIFB1c2hWYXJpYWJsZShzZWxmLCB2YXIsIHZhbHVlKToKKyAgICAjIElmIHZhbHVlIGxvb2tzIGxpa2UgYW4gaW50LCBzdG9yZSBpdCBhcyBhbiBpbnQuCisgICAgdHJ5OgorICAgICAgaW50X3ZhbHVlID0gaW50KHZhbHVlKQorICAgICAgaWYgKCclcycgJSBpbnRfdmFsdWUpID09IHZhbHVlOgorICAgICAgICB2YWx1ZSA9IGludF92YWx1ZQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICBwYXNzCisgICAgc2VsZi52YXJpYWJsZXNbOjBdID0gWyh2YXIsIHZhbHVlKV0KKworICBkZWYgUG9wVmFyaWFibGUoc2VsZik6CisgICAgc2VsZi52YXJpYWJsZXNbOjFdID0gW10KKworICBkZWYgUHVzaFJhbmdlKHNlbGYsIHZhciwgbG93ZXIsIHVwcGVyKToKKyAgICBzZWxmLnJhbmdlc1s6MF0gPSBbKHZhciwgbG93ZXIsIHVwcGVyKV0KKworICBkZWYgUG9wUmFuZ2Uoc2VsZik6CisgICAgc2VsZi5yYW5nZXNbOjFdID0gW10KKworICBkZWYgR2V0VmFsdWUoc2VsZiwgaWRlbnRpZmllcik6CisgICAgZm9yICh2YXIsIHZhbHVlKSBpbiBzZWxmLnZhcmlhYmxlczoKKyAgICAgIGlmIGlkZW50aWZpZXIgPT0gdmFyOgorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIHByaW50ICdFUlJPUjogbWV0YSB2YXJpYWJsZSAlcyBpcyB1bmRlZmluZWQuJyAlIChpZGVudGlmaWVyLCkKKyAgICBzeXMuZXhpdCgxKQorCisgIGRlZiBFdmFsRXhwKHNlbGYsIGV4cCk6CisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gZXZhbChleHAucHl0aG9uX2V4cCkKKyAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgcHJpbnQgJ0VSUk9SOiBjYXVnaHQgZXhjZXB0aW9uICVzOiAlcycgJSAoZS5fX2NsYXNzX18uX19uYW1lX18sIGUpCisgICAgICBwcmludCAoJ0VSUk9SOiBmYWlsZWQgdG8gZXZhbHVhdGUgbWV0YSBleHByZXNzaW9uICVzIGF0ICVzJyAlCisgICAgICAgICAgICAgKGV4cC5weXRob25fZXhwLCBleHAudG9rZW4uc3RhcnQpKQorICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIEdldFJhbmdlKHNlbGYsIGlkZW50aWZpZXIpOgorICAgIGZvciAodmFyLCBsb3dlciwgdXBwZXIpIGluIHNlbGYucmFuZ2VzOgorICAgICAgaWYgaWRlbnRpZmllciA9PSB2YXI6CisgICAgICAgIHJldHVybiAobG93ZXIsIHVwcGVyKQorCisgICAgcHJpbnQgJ0VSUk9SOiByYW5nZSAlcyBpcyB1bmRlZmluZWQuJyAlIChpZGVudGlmaWVyLCkKKyAgICBzeXMuZXhpdCgxKQorCisKK2NsYXNzIE91dHB1dDoKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYuc3RyaW5nID0gJycKKworICBkZWYgR2V0TGFzdExpbmUoc2VsZik6CisgICAgaW5kZXggPSBzZWxmLnN0cmluZy5yZmluZCgnXG4nKQorICAgIGlmIGluZGV4IDwgMDoKKyAgICAgIHJldHVybiAnJworCisgICAgcmV0dXJuIHNlbGYuc3RyaW5nW2luZGV4ICsgMTpdCisKKyAgZGVmIEFwcGVuZChzZWxmLCBzKToKKyAgICBzZWxmLnN0cmluZyArPSBzCisKKworZGVmIFJ1bkF0b21pY0NvZGUoZW52LCBub2RlLCBvdXRwdXQpOgorICBpZiBpc2luc3RhbmNlKG5vZGUsIFZhck5vZGUpOgorICAgIGlkZW50aWZpZXIgPSBub2RlLmlkZW50aWZpZXIudmFsdWUuc3RyaXAoKQorICAgIHJlc3VsdCA9IE91dHB1dCgpCisgICAgUnVuQXRvbWljQ29kZShlbnYuQ2xvbmUoKSwgbm9kZS5hdG9taWNfY29kZSwgcmVzdWx0KQorICAgIHZhbHVlID0gcmVzdWx0LnN0cmluZworICAgIGVudi5QdXNoVmFyaWFibGUoaWRlbnRpZmllciwgdmFsdWUpCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBSYW5nZU5vZGUpOgorICAgIGlkZW50aWZpZXIgPSBub2RlLmlkZW50aWZpZXIudmFsdWUuc3RyaXAoKQorICAgIGxvd2VyID0gaW50KGVudi5FdmFsRXhwKG5vZGUuZXhwMSkpCisgICAgdXBwZXIgPSBpbnQoZW52LkV2YWxFeHAobm9kZS5leHAyKSkKKyAgICBlbnYuUHVzaFJhbmdlKGlkZW50aWZpZXIsIGxvd2VyLCB1cHBlcikKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEZvck5vZGUpOgorICAgIGlkZW50aWZpZXIgPSBub2RlLmlkZW50aWZpZXIudmFsdWUuc3RyaXAoKQorICAgIGlmIG5vZGUuc2VwIGlzIE5vbmU6CisgICAgICBzZXAgPSAnJworICAgIGVsc2U6CisgICAgICBzZXAgPSBub2RlLnNlcC52YWx1ZQorICAgIChsb3dlciwgdXBwZXIpID0gZW52LkdldFJhbmdlKGlkZW50aWZpZXIpCisgICAgZm9yIGkgaW4gcmFuZ2UobG93ZXIsIHVwcGVyICsgMSk6CisgICAgICBuZXdfZW52ID0gZW52LkNsb25lKCkKKyAgICAgIG5ld19lbnYuUHVzaFZhcmlhYmxlKGlkZW50aWZpZXIsIGkpCisgICAgICBSdW5Db2RlKG5ld19lbnYsIG5vZGUuY29kZSwgb3V0cHV0KQorICAgICAgaWYgaSAhPSB1cHBlcjoKKyAgICAgICAgb3V0cHV0LkFwcGVuZChzZXApCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBSYXdDb2RlTm9kZSk6CisgICAgb3V0cHV0LkFwcGVuZChub2RlLnJhd19jb2RlLnZhbHVlKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgSWZOb2RlKToKKyAgICBjb25kID0gZW52LkV2YWxFeHAobm9kZS5leHApCisgICAgaWYgY29uZDoKKyAgICAgIFJ1bkNvZGUoZW52LkNsb25lKCksIG5vZGUudGhlbl9icmFuY2gsIG91dHB1dCkKKyAgICBlbGlmIG5vZGUuZWxzZV9icmFuY2ggaXMgbm90IE5vbmU6CisgICAgICBSdW5Db2RlKGVudi5DbG9uZSgpLCBub2RlLmVsc2VfYnJhbmNoLCBvdXRwdXQpCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBFeHBOb2RlKToKKyAgICB2YWx1ZSA9IGVudi5FdmFsRXhwKG5vZGUpCisgICAgb3V0cHV0LkFwcGVuZCgnJXMnICUgKHZhbHVlLCkpCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBMaXRlcmFsRG9sbGFyTm9kZSk6CisgICAgb3V0cHV0LkFwcGVuZCgnJCcpCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBDb2RlTm9kZSk6CisgICAgUnVuQ29kZShlbnYuQ2xvbmUoKSwgbm9kZSwgb3V0cHV0KQorICBlbHNlOgorICAgIHByaW50ICdCQUQnCisgICAgcHJpbnQgbm9kZQorICAgIHN5cy5leGl0KDEpCisKKworZGVmIFJ1bkNvZGUoZW52LCBjb2RlX25vZGUsIG91dHB1dCk6CisgIGZvciBhdG9taWNfY29kZSBpbiBjb2RlX25vZGUuYXRvbWljX2NvZGU6CisgICAgUnVuQXRvbWljQ29kZShlbnYsIGF0b21pY19jb2RlLCBvdXRwdXQpCisKKworZGVmIElzU2luZ2xlTGluZUNvbW1lbnQoY3VyX2xpbmUpOgorICByZXR1cm4gJy8vJyBpbiBjdXJfbGluZQorCisKK2RlZiBJc0luUHJlcHJvY2Vzc29yRGlyZWN0aXZlKHByZXZfbGluZXMsIGN1cl9saW5lKToKKyAgaWYgY3VyX2xpbmUubHN0cmlwKCkuc3RhcnRzd2l0aCgnIycpOgorICAgIHJldHVybiBUcnVlCisgIHJldHVybiBwcmV2X2xpbmVzIGFuZCBwcmV2X2xpbmVzWy0xXS5lbmRzd2l0aCgnXFwnKQorCisKK2RlZiBXcmFwQ29tbWVudChsaW5lLCBvdXRwdXQpOgorICBsb2MgPSBsaW5lLmZpbmQoJy8vJykKKyAgYmVmb3JlX2NvbW1lbnQgPSBsaW5lWzpsb2NdLnJzdHJpcCgpCisgIGlmIGJlZm9yZV9jb21tZW50ID09ICcnOgorICAgIGluZGVudCA9IGxvYworICBlbHNlOgorICAgIG91dHB1dC5hcHBlbmQoYmVmb3JlX2NvbW1lbnQpCisgICAgaW5kZW50ID0gbGVuKGJlZm9yZV9jb21tZW50KSAtIGxlbihiZWZvcmVfY29tbWVudC5sc3RyaXAoKSkKKyAgcHJlZml4ID0gaW5kZW50KicgJyArICcvLyAnCisgIG1heF9sZW4gPSA4MCAtIGxlbihwcmVmaXgpCisgIGNvbW1lbnQgPSBsaW5lW2xvYyArIDI6XS5zdHJpcCgpCisgIHNlZ3MgPSBbc2VnIGZvciBzZWcgaW4gcmUuc3BsaXQocicoXHcrXFcqKScsIGNvbW1lbnQpIGlmIHNlZyAhPSAnJ10KKyAgY3VyX2xpbmUgPSAnJworICBmb3Igc2VnIGluIHNlZ3M6CisgICAgaWYgbGVuKChjdXJfbGluZSArIHNlZykucnN0cmlwKCkpIDwgbWF4X2xlbjoKKyAgICAgIGN1cl9saW5lICs9IHNlZworICAgIGVsc2U6CisgICAgICBpZiBjdXJfbGluZS5zdHJpcCgpICE9ICcnOgorICAgICAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIGN1cl9saW5lLnJzdHJpcCgpKQorICAgICAgY3VyX2xpbmUgPSBzZWcubHN0cmlwKCkKKyAgaWYgY3VyX2xpbmUuc3RyaXAoKSAhPSAnJzoKKyAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIGN1cl9saW5lLnN0cmlwKCkpCisKKworZGVmIFdyYXBDb2RlKGxpbmUsIGxpbmVfY29uY2F0LCBvdXRwdXQpOgorICBpbmRlbnQgPSBsZW4obGluZSkgLSBsZW4obGluZS5sc3RyaXAoKSkKKyAgcHJlZml4ID0gaW5kZW50KicgJyAgIyBQcmVmaXggb2YgdGhlIGN1cnJlbnQgbGluZQorICBtYXhfbGVuID0gODAgLSBpbmRlbnQgLSBsZW4obGluZV9jb25jYXQpICAjIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGxpbmUKKyAgbmV3X3ByZWZpeCA9IHByZWZpeCArIDQqJyAnICAjIFByZWZpeCBvZiBhIGNvbnRpbnVhdGlvbiBsaW5lCisgIG5ld19tYXhfbGVuID0gbWF4X2xlbiAtIDQgICMgTWF4aW11bSBsZW5ndGggb2YgYSBjb250aW51YXRpb24gbGluZQorICAjIFByZWZlcnMgdG8gd3JhcCBhIGxpbmUgYWZ0ZXIgYSAnLCcgb3IgJzsnLgorICBzZWdzID0gW3NlZyBmb3Igc2VnIGluIHJlLnNwbGl0KHInKFteLDtdK1ssO10/KScsIGxpbmUuc3RyaXAoKSkgaWYgc2VnICE9ICcnXQorICBjdXJfbGluZSA9ICcnICAjIFRoZSBjdXJyZW50IGxpbmUgd2l0aG91dCBsZWFkaW5nIHNwYWNlcy4KKyAgZm9yIHNlZyBpbiBzZWdzOgorICAgICMgSWYgdGhlIGxpbmUgaXMgc3RpbGwgdG9vIGxvbmcsIHdyYXAgYXQgYSBzcGFjZS4KKyAgICB3aGlsZSBjdXJfbGluZSA9PSAnJyBhbmQgbGVuKHNlZy5zdHJpcCgpKSA+IG1heF9sZW46CisgICAgICBzZWcgPSBzZWcubHN0cmlwKCkKKyAgICAgIHNwbGl0X2F0ID0gc2VnLnJmaW5kKCcgJywgMCwgbWF4X2xlbikKKyAgICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgc2VnWzpzcGxpdF9hdF0uc3RyaXAoKSArIGxpbmVfY29uY2F0KQorICAgICAgc2VnID0gc2VnW3NwbGl0X2F0ICsgMTpdCisgICAgICBwcmVmaXggPSBuZXdfcHJlZml4CisgICAgICBtYXhfbGVuID0gbmV3X21heF9sZW4KKworICAgIGlmIGxlbigoY3VyX2xpbmUgKyBzZWcpLnJzdHJpcCgpKSA8IG1heF9sZW46CisgICAgICBjdXJfbGluZSA9IChjdXJfbGluZSArIHNlZykubHN0cmlwKCkKKyAgICBlbHNlOgorICAgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBjdXJfbGluZS5yc3RyaXAoKSArIGxpbmVfY29uY2F0KQorICAgICAgcHJlZml4ID0gbmV3X3ByZWZpeAorICAgICAgbWF4X2xlbiA9IG5ld19tYXhfbGVuCisgICAgICBjdXJfbGluZSA9IHNlZy5sc3RyaXAoKQorICBpZiBjdXJfbGluZS5zdHJpcCgpICE9ICcnOgorICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgY3VyX2xpbmUuc3RyaXAoKSkKKworCitkZWYgV3JhcFByZXByb2Nlc3NvckRpcmVjdGl2ZShsaW5lLCBvdXRwdXQpOgorICBXcmFwQ29kZShsaW5lLCAnIFxcJywgb3V0cHV0KQorCisKK2RlZiBXcmFwUGxhaW5Db2RlKGxpbmUsIG91dHB1dCk6CisgIFdyYXBDb2RlKGxpbmUsICcnLCBvdXRwdXQpCisKKworZGVmIElzTXVsdGlMaW5lSVdZVVByYWdtYShsaW5lKToKKyAgcmV0dXJuIHJlLnNlYXJjaChyJy9cKiBJV1lVIHByYWdtYTogJywgbGluZSkKKworCitkZWYgSXNIZWFkZXJHdWFyZEluY2x1ZGVPck9uZUxpbmVJV1lVUHJhZ21hKGxpbmUpOgorICByZXR1cm4gKHJlLm1hdGNoKHInXiMoaWZuZGVmfGRlZmluZXxlbmRpZlxzKi8vKVxzKltcd19dK1xzKiQnLCBsaW5lKSBvcgorICAgICAgICAgIHJlLm1hdGNoKHInXiNpbmNsdWRlXHMnLCBsaW5lKSBvcgorICAgICAgICAgICMgRG9uJ3QgYnJlYWsgSVdZVSBwcmFnbWFzLCBlaXRoZXI7IHRoYXQgY2F1c2VzIGl3eXUucHkgcHJvYmxlbXMuCisgICAgICAgICAgcmUuc2VhcmNoKHInLy8gSVdZVSBwcmFnbWE6ICcsIGxpbmUpKQorCisKK2RlZiBXcmFwTG9uZ0xpbmUobGluZSwgb3V0cHV0KToKKyAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgaWYgbGVuKGxpbmUpIDw9IDgwOgorICAgIG91dHB1dC5hcHBlbmQobGluZSkKKyAgZWxpZiBJc1NpbmdsZUxpbmVDb21tZW50KGxpbmUpOgorICAgIGlmIElzSGVhZGVyR3VhcmRJbmNsdWRlT3JPbmVMaW5lSVdZVVByYWdtYShsaW5lKToKKyAgICAgICMgVGhlIHN0eWxlIGd1aWRlIG1hZGUgYW4gZXhjZXB0aW9uIHRvIGFsbG93IGxvbmcgaGVhZGVyIGd1YXJkIGxpbmVzLAorICAgICAgIyBpbmNsdWRlcyBhbmQgSVdZVSBwcmFnbWFzLgorICAgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorICAgIGVsc2U6CisgICAgICBXcmFwQ29tbWVudChsaW5lLCBvdXRwdXQpCisgIGVsaWYgSXNJblByZXByb2Nlc3NvckRpcmVjdGl2ZShvdXRwdXQsIGxpbmUpOgorICAgIGlmIElzSGVhZGVyR3VhcmRJbmNsdWRlT3JPbmVMaW5lSVdZVVByYWdtYShsaW5lKToKKyAgICAgICMgVGhlIHN0eWxlIGd1aWRlIG1hZGUgYW4gZXhjZXB0aW9uIHRvIGFsbG93IGxvbmcgaGVhZGVyIGd1YXJkIGxpbmVzLAorICAgICAgIyBpbmNsdWRlcyBhbmQgSVdZVSBwcmFnbWFzLgorICAgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorICAgIGVsc2U6CisgICAgICBXcmFwUHJlcHJvY2Vzc29yRGlyZWN0aXZlKGxpbmUsIG91dHB1dCkKKyAgZWxpZiBJc011bHRpTGluZUlXWVVQcmFnbWEobGluZSk6CisgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorICBlbHNlOgorICAgIFdyYXBQbGFpbkNvZGUobGluZSwgb3V0cHV0KQorCisKK2RlZiBCZWF1dGlmeUNvZGUoc3RyaW5nKToKKyAgbGluZXMgPSBzdHJpbmcuc3BsaXRsaW5lcygpCisgIG91dHB1dCA9IFtdCisgIGZvciBsaW5lIGluIGxpbmVzOgorICAgIFdyYXBMb25nTGluZShsaW5lLCBvdXRwdXQpCisgIG91dHB1dDIgPSBbbGluZS5yc3RyaXAoKSBmb3IgbGluZSBpbiBvdXRwdXRdCisgIHJldHVybiAnXG4nLmpvaW4ob3V0cHV0MikgKyAnXG4nCisKKworZGVmIENvbnZlcnRGcm9tUHVtcFNvdXJjZShzcmNfdGV4dCk6CisgICIiIlJldHVybiB0aGUgdGV4dCBnZW5lcmF0ZWQgZnJvbSB0aGUgZ2l2ZW4gUHVtcCBzb3VyY2UgdGV4dC4iIiIKKyAgYXN0ID0gUGFyc2VUb0FTVChTdHJpcE1ldGFDb21tZW50cyhzcmNfdGV4dCkpCisgIG91dHB1dCA9IE91dHB1dCgpCisgIFJ1bkNvZGUoRW52KCksIGFzdCwgb3V0cHV0KQorICByZXR1cm4gQmVhdXRpZnlDb2RlKG91dHB1dC5zdHJpbmcpCisKKworZGVmIG1haW4oYXJndik6CisgIGlmIGxlbihhcmd2KSA9PSAxOgorICAgIHByaW50IF9fZG9jX18KKyAgICBzeXMuZXhpdCgxKQorCisgIGZpbGVfcGF0aCA9IGFyZ3ZbLTFdCisgIG91dHB1dF9zdHIgPSBDb252ZXJ0RnJvbVB1bXBTb3VyY2UoZmlsZShmaWxlX3BhdGgsICdyJykucmVhZCgpKQorICBpZiBmaWxlX3BhdGguZW5kc3dpdGgoJy5wdW1wJyk6CisgICAgb3V0cHV0X2ZpbGVfcGF0aCA9IGZpbGVfcGF0aFs6LTVdCisgIGVsc2U6CisgICAgb3V0cHV0X2ZpbGVfcGF0aCA9ICctJworICBpZiBvdXRwdXRfZmlsZV9wYXRoID09ICctJzoKKyAgICBwcmludCBvdXRwdXRfc3RyLAorICBlbHNlOgorICAgIG91dHB1dF9maWxlID0gZmlsZShvdXRwdXRfZmlsZV9wYXRoLCAndycpCisgICAgb3V0cHV0X2ZpbGUud3JpdGUoJy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6XG4nKQorICAgIG91dHB1dF9maWxlLndyaXRlKCcvLyAgICAgJXMgJXNcbicgJQorICAgICAgICAgICAgICAgICAgICAgIChvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlX3BhdGgpKSkKKyAgICBvdXRwdXRfZmlsZS53cml0ZSgnLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIVxuXG4nKQorICAgIG91dHB1dF9maWxlLndyaXRlKG91dHB1dF9zdHIpCisgICAgb3V0cHV0X2ZpbGUuY2xvc2UoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NjcmlwdHMvdGVzdC9NYWtlZmlsZSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc2NyaXB0cy90ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZmY1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NjcmlwdHMvdGVzdC9NYWtlZmlsZQpAQCAtMCwwICsxLDU5IEBACisjIEEgTWFrZWZpbGUgZm9yIGZ1c2luZyBHb29nbGUgVGVzdCBhbmQgYnVpbGRpbmcgYSBzYW1wbGUgdGVzdCBhZ2FpbnN0IGl0LgorIworIyBTWU5PUFNJUzoKKyMKKyMgICBtYWtlIFthbGxdICAtIG1ha2VzIGV2ZXJ5dGhpbmcuCisjICAgbWFrZSBUQVJHRVQgLSBtYWtlcyB0aGUgZ2l2ZW4gdGFyZ2V0LgorIyAgIG1ha2UgY2hlY2sgIC0gbWFrZXMgZXZlcnl0aGluZyBhbmQgcnVucyB0aGUgYnVpbHQgc2FtcGxlIHRlc3QuCisjICAgbWFrZSBjbGVhbiAgLSByZW1vdmVzIGFsbCBmaWxlcyBnZW5lcmF0ZWQgYnkgbWFrZS4KKworIyBQb2ludHMgdG8gdGhlIHJvb3Qgb2YgZnVzZWQgR29vZ2xlIFRlc3QsIHJlbGF0aXZlIHRvIHdoZXJlIHRoaXMgZmlsZSBpcy4KK0ZVU0VEX0dURVNUX0RJUiA9IG91dHB1dAorCisjIFBhdGhzIHRvIHRoZSBmdXNlZCBndGVzdCBmaWxlcy4KK0ZVU0VEX0dURVNUX0ggPSAkKEZVU0VEX0dURVNUX0RJUikvZ3Rlc3QvZ3Rlc3QuaAorRlVTRURfR1RFU1RfQUxMX0NDID0gJChGVVNFRF9HVEVTVF9ESVIpL2d0ZXN0L2d0ZXN0LWFsbC5jYworCisjIFdoZXJlIHRvIGZpbmQgdGhlIHNhbXBsZSB0ZXN0LgorU0FNUExFX0RJUiA9IC4uLy4uL3NhbXBsZXMKKworIyBXaGVyZSB0byBmaW5kIGd0ZXN0X21haW4uY2MuCitHVEVTVF9NQUlOX0NDID0gLi4vLi4vc3JjL2d0ZXN0X21haW4uY2MKKworIyBGbGFncyBwYXNzZWQgdG8gdGhlIHByZXByb2Nlc3Nvci4KKyMgV2UgaGF2ZSBubyBpZGVhIGhlcmUgd2hldGhlciBwdGhyZWFkcyBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSwgc28KKyMgZGlzYWJsZSBpdHMgdXNlLgorQ1BQRkxBR1MgKz0gLUkkKEZVU0VEX0dURVNUX0RJUikgLURHVEVTVF9IQVNfUFRIUkVBRD0wCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBDKysgY29tcGlsZXIuCitDWFhGTEFHUyArPSAtZworCithbGwgOiBzYW1wbGUxX3VuaXR0ZXN0CisKK2NoZWNrIDogYWxsCisJLi9zYW1wbGUxX3VuaXR0ZXN0CisKK2NsZWFuIDoKKwlybSAtcmYgJChGVVNFRF9HVEVTVF9ESVIpIHNhbXBsZTFfdW5pdHRlc3QgKi5vCisKKyQoRlVTRURfR1RFU1RfSCkgOgorCS4uL2Z1c2VfZ3Rlc3RfZmlsZXMucHkgJChGVVNFRF9HVEVTVF9ESVIpCisKKyQoRlVTRURfR1RFU1RfQUxMX0NDKSA6CisJLi4vZnVzZV9ndGVzdF9maWxlcy5weSAkKEZVU0VEX0dURVNUX0RJUikKKworZ3Rlc3QtYWxsLm8gOiAkKEZVU0VEX0dURVNUX0gpICQoRlVTRURfR1RFU1RfQUxMX0NDKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKEZVU0VEX0dURVNUX0RJUikvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCisKK2d0ZXN0X21haW4ubyA6ICQoRlVTRURfR1RFU1RfSCkgJChHVEVTVF9NQUlOX0NDKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKEdURVNUX01BSU5fQ0MpCisKK3NhbXBsZTEubyA6ICQoU0FNUExFX0RJUikvc2FtcGxlMS5jYyAkKFNBTVBMRV9ESVIpL3NhbXBsZTEuaAorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKFNBTVBMRV9ESVIpL3NhbXBsZTEuY2MKKworc2FtcGxlMV91bml0dGVzdC5vIDogJChTQU1QTEVfRElSKS9zYW1wbGUxX3VuaXR0ZXN0LmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICQoU0FNUExFX0RJUikvc2FtcGxlMS5oICQoRlVTRURfR1RFU1RfSCkKKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChTQU1QTEVfRElSKS9zYW1wbGUxX3VuaXR0ZXN0LmNjCisKK3NhbXBsZTFfdW5pdHRlc3QgOiBzYW1wbGUxLm8gc2FtcGxlMV91bml0dGVzdC5vIGd0ZXN0LWFsbC5vIGd0ZXN0X21haW4ubworCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAkXiAtbyAkQApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QtYWxsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QtYWxsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWNlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1hbGwuY2MKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBTb21ldGltZXMgaXQncyBkZXNpcmFibGUgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYnkgY29tcGlsaW5nIGEgc2luZ2xlIGZpbGUuCisvLyBUaGlzIGZpbGUgc2VydmVzIHRoaXMgcHVycG9zZS4KKworLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBndGVzdC5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuCisvLyB3aGVuIGl0J3MgZnVzZWQuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwdWxsIGluIHRoZSByZWFsIGd0ZXN0ICouY2MgZmlsZXMuCisjaW5jbHVkZSAic3JjL2d0ZXN0LmNjIgorI2luY2x1ZGUgInNyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIgorI2luY2x1ZGUgInNyYy9ndGVzdC1maWxlcGF0aC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtcG9ydC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtcHJpbnRlcnMuY2MiCisjaW5jbHVkZSAic3JjL2d0ZXN0LXRlc3QtcGFydC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCkBAIC0wLDAgKzEsMTM0NCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZGVhdGggdGVzdHMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9PU19NQUMKKyMgIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKKworIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxmY250bC5oPgorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKworIyBpZiBHVEVTVF9PU19MSU5VWAorIyAgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgIGluY2x1ZGUgPHN5cy93YWl0Lmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyMgaWYgR1RFU1RfT1NfUU5YCisjICBpbmNsdWRlIDxzcGF3bi5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gQ29uc3RhbnRzLgorCisvLyBUaGUgZGVmYXVsdCBkZWF0aCB0ZXN0IHN0eWxlLgorc3RhdGljIGNvbnN0IGNoYXIga0RlZmF1bHREZWF0aFRlc3RTdHlsZVtdID0gImZhc3QiOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBkZWF0aF90ZXN0X3N0eWxlLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3Rfc3R5bGUiLCBrRGVmYXVsdERlYXRoVGVzdFN0eWxlKSwKKyAgICAiSW5kaWNhdGVzIGhvdyB0byBydW4gYSBkZWF0aCB0ZXN0IGluIGEgZm9ya2VkIGNoaWxkIHByb2Nlc3M6ICIKKyAgICAiXCJ0aHJlYWRzYWZlXCIgKGNoaWxkIHByb2Nlc3MgcmUtZXhlY3V0ZXMgdGhlIHRlc3QgYmluYXJ5ICIKKyAgICAiZnJvbSB0aGUgYmVnaW5uaW5nLCBydW5uaW5nIG9ubHkgdGhlIHNwZWNpZmljIGRlYXRoIHRlc3QpIG9yICIKKyAgICAiXCJmYXN0XCIgKGNoaWxkIHByb2Nlc3MgcnVucyB0aGUgZGVhdGggdGVzdCBpbW1lZGlhdGVseSAiCisgICAgImFmdGVyIGZvcmtpbmcpLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgZGVhdGhfdGVzdF91c2VfZm9yaywKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiZGVhdGhfdGVzdF91c2VfZm9yayIsIGZhbHNlKSwKKyAgICAiSW5zdHJ1Y3RzIHRvIHVzZSBmb3JrKCkvX2V4aXQoKSBpbnN0ZWFkIG9mIGNsb25lKCkgaW4gZGVhdGggdGVzdHMuICIKKyAgICAiSWdub3JlZCBhbmQgYWx3YXlzIHVzZXMgZm9yaygpIG9uIFBPU0lYIHN5c3RlbXMgd2hlcmUgY2xvbmUoKSBpcyBub3QgIgorICAgICJpbXBsZW1lbnRlZC4gVXNlZnVsIHdoZW4gcnVubmluZyB1bmRlciB2YWxncmluZCBvciBzaW1pbGFyIHRvb2xzIGlmICIKKyAgICAidGhvc2UgZG8gbm90IHN1cHBvcnQgY2xvbmUoKS4gVmFsZ3JpbmQgMy4zLjEgd2lsbCBqdXN0IGZhaWwgaWYgIgorICAgICJpdCBzZWVzIGFuIHVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uIG9mIGNsb25lKCkgZmxhZ3MuICIKKyAgICAiSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIGZsYWcgdy9vIHZhbGdyaW5kIHRob3VnaCBpdCB3aWxsICIKKyAgICAid29yayBpbiA5OSUgb2YgdGhlIGNhc2VzLiBPbmNlIHZhbGdyaW5kIGlzIGZpeGVkLCB0aGlzIGZsYWcgd2lsbCAiCisgICAgIm1vc3QgbGlrZWx5IGJlIHJlbW92ZWQuIik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCwgIiIsCisgICAgIkluZGljYXRlcyB0aGUgZmlsZSwgbGluZSBudW1iZXIsIHRlbXBvcmFsIGluZGV4IG9mICIKKyAgICAidGhlIHNpbmdsZSBkZWF0aCB0ZXN0IHRvIHJ1biwgYW5kIGEgZmlsZSBkZXNjcmlwdG9yIHRvICIKKyAgICAid2hpY2ggYSBzdWNjZXNzIGNvZGUgbWF5IGJlIHNlbnQsIGFsbCBzZXBhcmF0ZWQgYnkgIgorICAgICJ0aGUgJ3wnIGNoYXJhY3RlcnMuICBUaGlzIGZsYWcgaXMgc3BlY2lmaWVkIGlmIGFuZCBvbmx5IGlmIHRoZSBjdXJyZW50ICIKKyAgICAicHJvY2VzcyBpcyBhIHN1Yi1wcm9jZXNzIGxhdW5jaGVkIGZvciBydW5uaW5nIGEgdGhyZWFkLXNhZmUgIgorICAgICJkZWF0aCB0ZXN0LiAgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiIpOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBWYWxpZCBvbmx5IGZvciBmYXN0IGRlYXRoIHRlc3RzLiBJbmRpY2F0ZXMgdGhlIGNvZGUgaXMgcnVubmluZyBpbiB0aGUKKy8vIGNoaWxkIHByb2Nlc3Mgb2YgYSBmYXN0IHN0eWxlIGRlYXRoIHRlc3QuCitzdGF0aWMgYm9vbCBnX2luX2Zhc3RfZGVhdGhfdGVzdF9jaGlsZCA9IGZhbHNlOworCisvLyBSZXR1cm5zIGEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNhbGxlciBpcyBjdXJyZW50bHkKKy8vIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLiAgVG9vbHMgc3VjaCBhcworLy8gVmFsZ3JpbmQgaGVhcCBjaGVja2VycyBtYXkgbmVlZCB0aGlzIHRvIG1vZGlmeSB0aGVpciBiZWhhdmlvciBpbiBkZWF0aAorLy8gdGVzdHMuICBJTVBPUlRBTlQ6IFRoaXMgaXMgYW4gaW50ZXJuYWwgdXRpbGl0eS4gIFVzaW5nIGl0IG1heSBicmVhayB0aGUKKy8vIGltcGxlbWVudGF0aW9uIG9mIGRlYXRoIHRlc3RzLiAgVXNlciBjb2RlIE1VU1QgTk9UIHVzZSBpdC4KK2Jvb2wgSW5EZWF0aFRlc3RDaGlsZCgpIHsKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIC8vIE9uIFdpbmRvd3MsIGRlYXRoIHRlc3RzIGFyZSB0aHJlYWQtc2FmZSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUKKyAgLy8gZGVhdGhfdGVzdF9zdHlsZSBmbGFnLgorICByZXR1cm4gIUdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmVtcHR5KCk7CisKKyMgZWxzZQorCisgIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJ0aHJlYWRzYWZlIikKKyAgICByZXR1cm4gIUdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmVtcHR5KCk7CisgIGVsc2UKKyAgICByZXR1cm4gZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQ7CisjZW5kaWYKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEV4aXRlZFdpdGhDb2RlIGNvbnN0cnVjdG9yLgorRXhpdGVkV2l0aENvZGU6OkV4aXRlZFdpdGhDb2RlKGludCBleGl0X2NvZGUpIDogZXhpdF9jb2RlXyhleGl0X2NvZGUpIHsKK30KKworLy8gRXhpdGVkV2l0aENvZGUgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KK2Jvb2wgRXhpdGVkV2l0aENvZGU6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gZXhpdF9zdGF0dXMgPT0gZXhpdF9jb2RlXzsKKworIyBlbHNlCisKKyAgcmV0dXJuIFdJRkVYSVRFRChleGl0X3N0YXR1cykgJiYgV0VYSVRTVEFUVVMoZXhpdF9zdGF0dXMpID09IGV4aXRfY29kZV87CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gS2lsbGVkQnlTaWduYWwgY29uc3RydWN0b3IuCitLaWxsZWRCeVNpZ25hbDo6S2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSkgOiBzaWdudW1fKHNpZ251bSkgeworfQorCisvLyBLaWxsZWRCeVNpZ25hbCBmdW5jdGlvbi1jYWxsIG9wZXJhdG9yLgorYm9vbCBLaWxsZWRCeVNpZ25hbDo6b3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0IHsKKyAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfc3RhdHVzKSAmJiBXVEVSTVNJRyhleGl0X3N0YXR1cykgPT0gc2lnbnVtXzsKK30KKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFV0aWxpdGllcyBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgorCisvLyBHZW5lcmF0ZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gZXhpdCBjb2RlLCBpbiB0aGUgZm9ybWF0CisvLyBzcGVjaWZpZWQgYnkgd2FpdCgyKS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBFeGl0U3VtbWFyeShpbnQgZXhpdF9jb2RlKSB7CisgIE1lc3NhZ2UgbTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgbSA8PCAiRXhpdGVkIHdpdGggZXhpdCBzdGF0dXMgIiA8PCBleGl0X2NvZGU7CisKKyMgZWxzZQorCisgIGlmIChXSUZFWElURUQoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgV0VYSVRTVEFUVVMoZXhpdF9jb2RlKTsKKyAgfSBlbHNlIGlmIChXSUZTSUdOQUxFRChleGl0X2NvZGUpKSB7CisgICAgbSA8PCAiVGVybWluYXRlZCBieSBzaWduYWwgIiA8PCBXVEVSTVNJRyhleGl0X2NvZGUpOworICB9CisjICBpZmRlZiBXQ09SRURVTVAKKyAgaWYgKFdDT1JFRFVNUChleGl0X2NvZGUpKSB7CisgICAgbSA8PCAiIChjb3JlIGR1bXBlZCkiOworICB9CisjICBlbmRpZgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIHJldHVybiBtLkdldFN0cmluZygpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgZXhpdF9zdGF0dXMgZGVzY3JpYmVzIGEgcHJvY2VzcyB0aGF0IHdhcyB0ZXJtaW5hdGVkCisvLyBieSBhIHNpZ25hbCwgb3IgZXhpdGVkIG5vcm1hbGx5IHdpdGggYSBub256ZXJvIGV4aXQgY29kZS4KK2Jvb2wgRXhpdGVkVW5zdWNjZXNzZnVsbHkoaW50IGV4aXRfc3RhdHVzKSB7CisgIHJldHVybiAhRXhpdGVkV2l0aENvZGUoMCkoZXhpdF9zdGF0dXMpOworfQorCisjIGlmICFHVEVTVF9PU19XSU5ET1dTCisvLyBHZW5lcmF0ZXMgYSB0ZXh0dWFsIGZhaWx1cmUgbWVzc2FnZSB3aGVuIGEgZGVhdGggdGVzdCBmaW5kcyBtb3JlIHRoYW4KKy8vIG9uZSB0aHJlYWQgcnVubmluZywgb3IgY2Fubm90IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMsIHByaW9yCisvLyB0byBleGVjdXRpbmcgdGhlIGdpdmVuIHN0YXRlbWVudC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKKy8vIGNhbGxlciBub3QgdG8gcGFzcyBhIHRocmVhZF9jb3VudCBvZiAxLgorc3RhdGljIHN0ZDo6c3RyaW5nIERlYXRoVGVzdFRocmVhZFdhcm5pbmcoc2l6ZV90IHRocmVhZF9jb3VudCkgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJEZWF0aCB0ZXN0cyB1c2UgZm9yaygpLCB3aGljaCBpcyB1bnNhZmUgcGFydGljdWxhcmx5IgorICAgICAgPDwgIiBpbiBhIHRocmVhZGVkIGNvbnRleHQuIEZvciB0aGlzIHRlc3QsICIgPDwgR1RFU1RfTkFNRV8gPDwgIiAiOworICBpZiAodGhyZWFkX2NvdW50ID09IDApCisgICAgbXNnIDw8ICJjb3VsZG4ndCBkZXRlY3QgdGhlIG51bWJlciBvZiB0aHJlYWRzLiI7CisgIGVsc2UKKyAgICBtc2cgPDwgImRldGVjdGVkICIgPDwgdGhyZWFkX2NvdW50IDw8ICIgdGhyZWFkcy4iOworICByZXR1cm4gbXNnLkdldFN0cmluZygpOworfQorIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKKworLy8gRmxhZyBjaGFyYWN0ZXJzIGZvciByZXBvcnRpbmcgYSBkZWF0aCB0ZXN0IHRoYXQgZGlkIG5vdCBkaWUuCitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0TGl2ZWQgPSAnTCc7CitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0UmV0dXJuZWQgPSAnUic7CitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0VGhyZXcgPSAnVCc7CitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0SW50ZXJuYWxFcnJvciA9ICdJJzsKKworLy8gQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyBhbGwgb2YgdGhlIHBvc3NpYmxlIHdheXMgdGhhdCBhIGRlYXRoIHRlc3QgY2FuCisvLyBjb25jbHVkZS4gIERJRUQgbWVhbnMgdGhhdCB0aGUgcHJvY2VzcyBkaWVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdAorLy8gY29kZTsgTElWRUQgbWVhbnMgdGhhdCBwcm9jZXNzIGxpdmVkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB0ZXN0IGNvZGU7CisvLyBSRVRVUk5FRCBtZWFucyB0aGF0IHRoZSB0ZXN0IHN0YXRlbWVudCBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSBhIHJldHVybgorLy8gc3RhdGVtZW50LCB3aGljaCBpcyBub3QgYWxsb3dlZDsgVEhSRVcgbWVhbnMgdGhhdCB0aGUgdGVzdCBzdGF0ZW1lbnQKKy8vIHJldHVybmVkIGNvbnRyb2wgYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgSU5fUFJPR1JFU1MgbWVhbnMgdGhlIHRlc3QKKy8vIGhhcyBub3QgeWV0IGNvbmNsdWRlZC4KKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFVuaWZ5IG5hbWVzIGFuZCBwb3NzaWJseSB2YWx1ZXMgZm9yCisvLyBBYm9ydFJlYXNvbiwgRGVhdGhUZXN0T3V0Y29tZSwgYW5kIGZsYWcgY2hhcmFjdGVycyBhYm92ZS4KK2VudW0gRGVhdGhUZXN0T3V0Y29tZSB7IElOX1BST0dSRVNTLCBESUVELCBMSVZFRCwgUkVUVVJORUQsIFRIUkVXIH07CisKKy8vIFJvdXRpbmUgZm9yIGFib3J0aW5nIHRoZSBwcm9ncmFtIHdoaWNoIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGFuCisvLyBleGVjLXN0eWxlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcywgaW4gd2hpY2ggY2FzZSB0aGUgZXJyb3IKKy8vIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgdGhlCisvLyBtZXNzYWdlIGlzIHNpbXBseSBwcmludGVkIHRvIHN0ZGVyci4gIEluIGVpdGhlciBjYXNlLCB0aGUgcHJvZ3JhbQorLy8gdGhlbiBleGl0cyB3aXRoIHN0YXR1cyAxLgordm9pZCBEZWF0aFRlc3RBYm9ydChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICAvLyBPbiBhIFBPU0lYIHN5c3RlbSwgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gYSB0aHJlYWRzYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcywgd2hpY2ggb3BlcmF0ZXMgb24gYSB2ZXJ5IHNtYWxsIHN0YWNrLiAgVXNlCisgIC8vIHRoZSBoZWFwIGZvciBhbnkgYWRkaXRpb25hbCBub24tbWludXNjdWxlIG1lbW9yeSByZXF1aXJlbWVudHMuCisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBHZXRVbml0VGVzdEltcGwoKS0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgRklMRSogcGFyZW50ID0gcG9zaXg6OkZET3BlbihmbGFnLT53cml0ZV9mZCgpLCAidyIpOworICAgIGZwdXRjKGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yLCBwYXJlbnQpOworICAgIGZwcmludGYocGFyZW50LCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChwYXJlbnQpOworICAgIF9leGl0KDEpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9Cit9CisKKy8vIEEgcmVwbGFjZW1lbnQgZm9yIENIRUNLIHRoYXQgY2FsbHMgRGVhdGhUZXN0QWJvcnQgaWYgdGhlIGFzc2VydGlvbgorLy8gZmFpbHMuCisjIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhleHByZXNzaW9uKSBcCisgIGRvIHsgXAorICAgIGlmICghOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGV4cHJlc3Npb24pKSB7IFwKKyAgICAgIERlYXRoVGVzdEFib3J0KCBcCisgICAgICAgICAgOjpzdGQ6OnN0cmluZygiQ0hFQ0sgZmFpbGVkOiBGaWxlICIpICsgX19GSUxFX18gKyAgIiwgbGluZSAiIFwKKyAgICAgICAgICArIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhfX0xJTkVfXykgKyAiOiAiIFwKKyAgICAgICAgICArICNleHByZXNzaW9uKTsgXAorICAgIH0gXAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBUaGlzIG1hY3JvIGlzIHNpbWlsYXIgdG8gR1RFU1RfREVBVEhfVEVTVF9DSEVDS18sIGJ1dCBpdCBpcyBtZWFudCBmb3IKKy8vIGV2YWx1YXRpbmcgYW55IHN5c3RlbSBjYWxsIHRoYXQgZnVsZmlsbHMgdHdvIGNvbmRpdGlvbnM6IGl0IG11c3QgcmV0dXJuCisvLyAtMSBvbiBmYWlsdXJlLCBhbmQgc2V0IGVycm5vIHRvIEVJTlRSIHdoZW4gaXQgaXMgaW50ZXJydXB0ZWQgYW5kCisvLyBzaG91bGQgYmUgdHJpZWQgYWdhaW4uICBUaGUgbWFjcm8gZXhwYW5kcyB0byBhIGxvb3AgdGhhdCByZXBlYXRlZGx5CisvLyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYXMgbG9uZyBhcyBpdCBldmFsdWF0ZXMgdG8gLTEgYW5kIHNldHMKKy8vIGVycm5vIHRvIEVJTlRSLiAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIC0xIGJ1dCBlcnJubyBpcworLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gRUlOVFIsIERlYXRoVGVzdEFib3J0IGlzIGNhbGxlZC4KKyMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZXhwcmVzc2lvbikgXAorICBkbyB7IFwKKyAgICBpbnQgZ3Rlc3RfcmV0dmFsOyBcCisgICAgZG8geyBcCisgICAgICBndGVzdF9yZXR2YWwgPSAoZXhwcmVzc2lvbik7IFwKKyAgICB9IHdoaWxlIChndGVzdF9yZXR2YWwgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOyBcCisgICAgaWYgKGd0ZXN0X3JldHZhbCA9PSAtMSkgeyBcCisgICAgICBEZWF0aFRlc3RBYm9ydCggXAorICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkNIRUNLIGZhaWxlZDogRmlsZSAiKSArIF9fRklMRV9fICsgIiwgbGluZSAiIFwKKyAgICAgICAgICArIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhfX0xJTkVfXykgKyAiOiAiIFwKKyAgICAgICAgICArICNleHByZXNzaW9uICsgIiAhPSAtMSIpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaW4gZXJybm8uCitzdGQ6OnN0cmluZyBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpIHsKKyAgICByZXR1cm4gZXJybm8gPT0gMCA/ICIiIDogcG9zaXg6OlN0ckVycm9yKGVycm5vKTsKK30KKworLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIGRlYXRoIHRlc3QgcGFyZW50IHByb2Nlc3MgdG8gcmVhZCBhIGZhaWx1cmUKKy8vIG1lc3NhZ2UgZnJvbSB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGFuZCBsb2cgaXQgd2l0aCB0aGUgRkFUQUwKKy8vIHNldmVyaXR5LiBPbiBXaW5kb3dzLCB0aGUgbWVzc2FnZSBpcyByZWFkIGZyb20gYSBwaXBlIGhhbmRsZS4gT24gb3RoZXIKKy8vIHBsYXRmb3JtcywgaXQgaXMgcmVhZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLgorc3RhdGljIHZvaWQgRmFpbEZyb21JbnRlcm5hbEVycm9yKGludCBmZCkgeworICBNZXNzYWdlIGVycm9yOworICBjaGFyIGJ1ZmZlclsyNTZdOworICBpbnQgbnVtX3JlYWQ7CisKKyAgZG8geworICAgIHdoaWxlICgobnVtX3JlYWQgPSBwb3NpeDo6UmVhZChmZCwgYnVmZmVyLCAyNTUpKSA+IDApIHsKKyAgICAgIGJ1ZmZlcltudW1fcmVhZF0gPSAnXDAnOworICAgICAgZXJyb3IgPDwgYnVmZmVyOworICAgIH0KKyAgfSB3aGlsZSAobnVtX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChudW1fcmVhZCA9PSAwKSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgZXJyb3IuR2V0U3RyaW5nKCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGxhc3RfZXJyb3IgPSBlcnJubzsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWF0aCB0ZXN0IGludGVybmFsOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSA8PCAiIFsiIDw8IGxhc3RfZXJyb3IgPDwgIl0iOworICB9Cit9CisKKy8vIERlYXRoIHRlc3QgY29uc3RydWN0b3IuICBJbmNyZW1lbnRzIHRoZSBydW5uaW5nIGRlYXRoIHRlc3QgY291bnQKKy8vIGZvciB0aGUgY3VycmVudCB0ZXN0LgorRGVhdGhUZXN0OjpEZWF0aFRlc3QoKSB7CisgIFRlc3RJbmZvKiBjb25zdCBpbmZvID0gR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiQ2Fubm90IHJ1biBhIGRlYXRoIHRlc3Qgb3V0c2lkZSBvZiBhIFRFU1Qgb3IgIgorICAgICAgICAgICAgICAgICAgICJURVNUX0YgY29uc3RydWN0Iik7CisgIH0KK30KKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGRlYXRoIHRlc3QgYnkgZGlzcGF0Y2hpbmcgdG8gdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgZmFjdG9yeS4KK2Jvb2wgRGVhdGhUZXN0OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSB7CisgIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+ZGVhdGhfdGVzdF9mYWN0b3J5KCktPkNyZWF0ZSgKKyAgICAgIHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUsIHRlc3QpOworfQorCitjb25zdCBjaGFyKiBEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkgeworICByZXR1cm4gbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfLmNfc3RyKCk7Cit9CisKK3ZvaWQgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfID0gbWVzc2FnZTsKK30KKworc3RkOjpzdHJpbmcgRGVhdGhUZXN0OjpsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV87CisKKy8vIFByb3ZpZGVzIGNyb3NzIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uIGZvciBzb21lIGRlYXRoIGZ1bmN0aW9uYWxpdHkuCitjbGFzcyBEZWF0aFRlc3RJbXBsIDogcHVibGljIERlYXRoVGVzdCB7CisgcHJvdGVjdGVkOgorICBEZWF0aFRlc3RJbXBsKGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkKKyAgICAgIDogc3RhdGVtZW50XyhhX3N0YXRlbWVudCksCisgICAgICAgIHJlZ2V4XyhhX3JlZ2V4KSwKKyAgICAgICAgc3Bhd25lZF8oZmFsc2UpLAorICAgICAgICBzdGF0dXNfKC0xKSwKKyAgICAgICAgb3V0Y29tZV8oSU5fUFJPR1JFU1MpLAorICAgICAgICByZWFkX2ZkXygtMSksCisgICAgICAgIHdyaXRlX2ZkXygtMSkge30KKworICAvLyByZWFkX2ZkXyBpcyBleHBlY3RlZCB0byBiZSBjbG9zZWQgYW5kIGNsZWFyZWQgYnkgYSBkZXJpdmVkIGNsYXNzLgorICB+RGVhdGhUZXN0SW1wbCgpIHsgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocmVhZF9mZF8gPT0gLTEpOyB9CisKKyAgdm9pZCBBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pOworICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgc3RhdHVzX29rKTsKKworICBjb25zdCBjaGFyKiBzdGF0ZW1lbnQoKSBjb25zdCB7IHJldHVybiBzdGF0ZW1lbnRfOyB9CisgIGNvbnN0IFJFKiByZWdleCgpIGNvbnN0IHsgcmV0dXJuIHJlZ2V4XzsgfQorICBib29sIHNwYXduZWQoKSBjb25zdCB7IHJldHVybiBzcGF3bmVkXzsgfQorICB2b2lkIHNldF9zcGF3bmVkKGJvb2wgaXNfc3Bhd25lZCkgeyBzcGF3bmVkXyA9IGlzX3NwYXduZWQ7IH0KKyAgaW50IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIHN0YXR1c187IH0KKyAgdm9pZCBzZXRfc3RhdHVzKGludCBhX3N0YXR1cykgeyBzdGF0dXNfID0gYV9zdGF0dXM7IH0KKyAgRGVhdGhUZXN0T3V0Y29tZSBvdXRjb21lKCkgY29uc3QgeyByZXR1cm4gb3V0Y29tZV87IH0KKyAgdm9pZCBzZXRfb3V0Y29tZShEZWF0aFRlc3RPdXRjb21lIGFuX291dGNvbWUpIHsgb3V0Y29tZV8gPSBhbl9vdXRjb21lOyB9CisgIGludCByZWFkX2ZkKCkgY29uc3QgeyByZXR1cm4gcmVhZF9mZF87IH0KKyAgdm9pZCBzZXRfcmVhZF9mZChpbnQgZmQpIHsgcmVhZF9mZF8gPSBmZDsgfQorICBpbnQgd3JpdGVfZmQoKSBjb25zdCB7IHJldHVybiB3cml0ZV9mZF87IH0KKyAgdm9pZCBzZXRfd3JpdGVfZmQoaW50IGZkKSB7IHdyaXRlX2ZkXyA9IGZkOyB9CisKKyAgLy8gQ2FsbGVkIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBvbmx5LiBSZWFkcyB0aGUgcmVzdWx0IGNvZGUgb2YgdGhlIGRlYXRoCisgIC8vIHRlc3QgY2hpbGQgcHJvY2VzcyB2aWEgYSBwaXBlLCBpbnRlcnByZXRzIGl0IHRvIHNldCB0aGUgb3V0Y29tZV8KKyAgLy8gbWVtYmVyLCBhbmQgY2xvc2VzIHJlYWRfZmRfLiAgT3V0cHV0cyBkaWFnbm9zdGljcyBhbmQgdGVybWluYXRlcyBpbgorICAvLyBjYXNlIG9mIHVuZXhwZWN0ZWQgY29kZXMuCisgIHZvaWQgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKKworIHByaXZhdGU6CisgIC8vIFRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGNvZGUgdGhpcyBvYmplY3QgaXMgdGVzdGluZy4gIFRoaXMgY2xhc3MKKyAgLy8gZG9lc24ndCBvd24gdGhpcyBzdHJpbmcgYW5kIHNob3VsZCBub3QgYXR0ZW1wdCB0byBkZWxldGUgaXQuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXRlbWVudF87CisgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggdGVzdCBvdXRwdXQgbXVzdCBtYXRjaC4gIERlYXRoVGVzdEltcGwKKyAgLy8gZG9lc24ndCBvd24gdGhpcyBvYmplY3QgYW5kIHNob3VsZCBub3QgYXR0ZW1wdCB0byBkZWxldGUgaXQuCisgIGNvbnN0IFJFKiBjb25zdCByZWdleF87CisgIC8vIFRydWUgaWYgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3Bhd25lZC4KKyAgYm9vbCBzcGF3bmVkXzsKKyAgLy8gVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLgorICBpbnQgc3RhdHVzXzsKKyAgLy8gSG93IHRoZSBkZWF0aCB0ZXN0IGNvbmNsdWRlZC4KKyAgRGVhdGhUZXN0T3V0Y29tZSBvdXRjb21lXzsKKyAgLy8gRGVzY3JpcHRvciB0byB0aGUgcmVhZCBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MuICBJdCBpcworICAvLyBhbHdheXMgLTEgaW4gdGhlIGNoaWxkIHByb2Nlc3MuICBUaGUgY2hpbGQga2VlcHMgaXRzIHdyaXRlIGVuZCBvZiB0aGUKKyAgLy8gcGlwZSBpbiB3cml0ZV9mZF8uCisgIGludCByZWFkX2ZkXzsKKyAgLy8gRGVzY3JpcHRvciB0byB0aGUgY2hpbGQncyB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIHBhcmVudCBwcm9jZXNzLgorICAvLyBJdCBpcyBhbHdheXMgLTEgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgVGhlIHBhcmVudCBrZWVwcyBpdHMgZW5kIG9mIHRoZQorICAvLyBwaXBlIGluIHJlYWRfZmRfLgorICBpbnQgd3JpdGVfZmRfOworfTsKKworLy8gQ2FsbGVkIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBvbmx5LiBSZWFkcyB0aGUgcmVzdWx0IGNvZGUgb2YgdGhlIGRlYXRoCisvLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfCisvLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluCisvLyBjYXNlIG9mIHVuZXhwZWN0ZWQgY29kZXMuCit2b2lkIERlYXRoVGVzdEltcGw6OlJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCkgeworICBjaGFyIGZsYWc7CisgIGludCBieXRlc19yZWFkOworCisgIC8vIFRoZSByZWFkKCkgaGVyZSBibG9ja3MgdW50aWwgZGF0YSBpcyBhdmFpbGFibGUgKHNpZ25pZnlpbmcgdGhlCisgIC8vIGZhaWx1cmUgb2YgdGhlIGRlYXRoIHRlc3QpIG9yIHVudGlsIHRoZSBwaXBlIGlzIGNsb3NlZCAoc2lnbmlmeWluZworICAvLyBpdHMgc3VjY2VzcyksIHNvIGl0J3Mgb2theSB0byBjYWxsIHRoaXMgaW4gdGhlIHBhcmVudCBiZWZvcmUKKyAgLy8gdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGV4aXRlZC4KKyAgZG8geworICAgIGJ5dGVzX3JlYWQgPSBwb3NpeDo6UmVhZChyZWFkX2ZkKCksICZmbGFnLCAxKTsKKyAgfSB3aGlsZSAoYnl0ZXNfcmVhZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgeworICAgIHNldF9vdXRjb21lKERJRUQpOworICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMSkgeworICAgIHN3aXRjaCAoZmxhZykgeworICAgICAgY2FzZSBrRGVhdGhUZXN0UmV0dXJuZWQ6CisgICAgICAgIHNldF9vdXRjb21lKFJFVFVSTkVEKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGtEZWF0aFRlc3RUaHJldzoKKyAgICAgICAgc2V0X291dGNvbWUoVEhSRVcpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdExpdmVkOgorICAgICAgICBzZXRfb3V0Y29tZShMSVZFRCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0SW50ZXJuYWxFcnJvcjoKKyAgICAgICAgRmFpbEZyb21JbnRlcm5hbEVycm9yKHJlYWRfZmQoKSk7ICAvLyBEb2VzIG5vdCByZXR1cm4uCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyByZXBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ1bmV4cGVjdGVkIHN0YXR1cyBieXRlICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZmxhZykgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiUmVhZCBmcm9tIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOworICB9CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8ocG9zaXg6OkNsb3NlKHJlYWRfZmQoKSkpOworICBzZXRfcmVhZF9mZCgtMSk7Cit9CisKKy8vIFNpZ25hbHMgdGhhdCB0aGUgZGVhdGggdGVzdCBjb2RlIHdoaWNoIHNob3VsZCBoYXZlIGV4aXRlZCwgZGlkbid0LgorLy8gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGluIGEgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgorLy8gV3JpdGVzIGEgc3RhdHVzIGJ5dGUgdG8gdGhlIGNoaWxkJ3Mgc3RhdHVzIGZpbGUgZGVzY3JpcHRvciwgdGhlbgorLy8gY2FsbHMgX2V4aXQoMSkuCit2b2lkIERlYXRoVGVzdEltcGw6OkFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgeworICAvLyBUaGUgcGFyZW50IHByb2Nlc3MgY29uc2lkZXJzIHRoZSBkZWF0aCB0ZXN0IHRvIGJlIGEgZmFpbHVyZSBpZgorICAvLyBpdCBmaW5kcyBhbnkgZGF0YSBpbiBvdXIgcGlwZS4gIFNvLCBoZXJlIHdlIHdyaXRlIGEgc2luZ2xlIGZsYWcgYnl0ZQorICAvLyB0byB0aGUgcGlwZSwgdGhlbiBleGl0LgorICBjb25zdCBjaGFyIHN0YXR1c19jaCA9CisgICAgICByZWFzb24gPT0gVEVTVF9ESURfTk9UX0RJRSA/IGtEZWF0aFRlc3RMaXZlZCA6CisgICAgICByZWFzb24gPT0gVEVTVF9USFJFV19FWENFUFRJT04gPyBrRGVhdGhUZXN0VGhyZXcgOiBrRGVhdGhUZXN0UmV0dXJuZWQ7CisKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhwb3NpeDo6V3JpdGUod3JpdGVfZmQoKSwgJnN0YXR1c19jaCwgMSkpOworICAvLyBXZSBhcmUgbGVha2luZyB0aGUgZGVzY3JpcHRvciBoZXJlIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMgKGkuZS4sCisgIC8vIHdoZW4gYnVpbHQgYXMgV2luZG93cyBETEwpLCBkZXN0cnVjdG9ycyBvZiBnbG9iYWwgb2JqZWN0cyB3aWxsIHN0aWxsCisgIC8vIHJ1biBhZnRlciBjYWxsaW5nIF9leGl0KCkuIE9uIHN1Y2ggc3lzdGVtcywgd3JpdGVfZmRfIHdpbGwgYmUKKyAgLy8gaW5kaXJlY3RseSBjbG9zZWQgZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBVbml0VGVzdEltcGwsIGNhdXNpbmcgZG91YmxlCisgIC8vIGNsb3NlIGlmIGl0IGlzIGFsc28gY2xvc2VkIGhlcmUuIE9uIGRlYnVnIGNvbmZpZ3VyYXRpb25zLCBkb3VibGUgY2xvc2UKKyAgLy8gbWF5IGFzc2VydC4gQXMgdGhlcmUgYXJlIG5vIGluLXByb2Nlc3MgYnVmZmVycyB0byBmbHVzaCBoZXJlLCB3ZSBhcmUKKyAgLy8gcmVseWluZyBvbiB0aGUgT1MgdG8gY2xvc2UgdGhlIGRlc2NyaXB0b3IgYWZ0ZXIgdGhlIHByb2Nlc3MgdGVybWluYXRlcworICAvLyB3aGVuIHRoZSBkZXN0cnVjdG9ycyBhcmUgbm90IHJ1bi4KKyAgX2V4aXQoMSk7ICAvLyBFeGl0cyB3L28gYW55IG5vcm1hbCBleGl0IGhvb2tzICh3ZSB3ZXJlIHN1cHBvc2VkIHRvIGNyYXNoKQorfQorCisvLyBSZXR1cm5zIGFuIGluZGVudGVkIGNvcHkgb2Ygc3RkZXJyIG91dHB1dCBmb3IgYSBkZWF0aCB0ZXN0LgorLy8gVGhpcyBtYWtlcyBkaXN0aW5ndWlzaGluZyBkZWF0aCB0ZXN0IG91dHB1dCBsaW5lcyBmcm9tIHJlZ3VsYXIgbG9nIGxpbmVzCisvLyBtdWNoIGVhc2llci4KK3N0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdERlYXRoVGVzdE91dHB1dChjb25zdCA6OnN0ZDo6c3RyaW5nJiBvdXRwdXQpIHsKKyAgOjpzdGQ6OnN0cmluZyByZXQ7CisgIGZvciAoc2l6ZV90IGF0ID0gMDsgOyApIHsKKyAgICBjb25zdCBzaXplX3QgbGluZV9lbmQgPSBvdXRwdXQuZmluZCgnXG4nLCBhdCk7CisgICAgcmV0ICs9ICJbICBERUFUSCAgIF0gIjsKKyAgICBpZiAobGluZV9lbmQgPT0gOjpzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0ICs9IG91dHB1dC5zdWJzdHIoYXQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldCArPSBvdXRwdXQuc3Vic3RyKGF0LCBsaW5lX2VuZCArIDEgLSBhdCk7CisgICAgYXQgPSBsaW5lX2VuZCArIDE7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gQXNzZXNzZXMgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBhIGRlYXRoIHRlc3QsIHVzaW5nIGJvdGggcHJpdmF0ZQorLy8gbWVtYmVycyB3aGljaCBoYXZlIHByZXZpb3VzbHkgYmVlbiBzZXQsIGFuZCBvbmUgYXJndW1lbnQ6CisvLworLy8gUHJpdmF0ZSBkYXRhIG1lbWJlcnM6CisvLyAgIG91dGNvbWU6ICBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGhvdyB0aGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgY29uY2x1ZGVkOiBESUVELCBMSVZFRCwgVEhSRVcsIG9yIFJFVFVSTkVELiAgVGhlIGRlYXRoIHRlc3QKKy8vICAgICAgICAgICAgIGZhaWxzIGluIHRoZSBsYXR0ZXIgdGhyZWUgY2FzZXMuCisvLyAgIHN0YXR1czogICBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuIE9uICpuaXgsIGl0IGlzIGluIHRoZQorLy8gICAgICAgICAgICAgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgd2FpdCgyKS4gT24gV2luZG93cywgdGhpcyBpcyB0aGUKKy8vICAgICAgICAgICAgIHZhbHVlIHN1cHBsaWVkIHRvIHRoZSBFeGl0UHJvY2VzcygpIEFQSSBvciBhIG51bWVyaWMgY29kZQorLy8gICAgICAgICAgICAgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IHRlcm1pbmF0ZWQgdGhlIHByb2dyYW0uCisvLyAgIHJlZ2V4OiAgICBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QgdG8gYmUgYXBwbGllZCB0bworLy8gICAgICAgICAgICAgdGhlIHRlc3QncyBjYXB0dXJlZCBzdGFuZGFyZCBlcnJvciBvdXRwdXQ7IHRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBmYWlscyBpZiBpdCBkb2VzIG5vdCBtYXRjaC4KKy8vCisvLyBBcmd1bWVudDoKKy8vICAgc3RhdHVzX29rOiB0cnVlIGlmIGV4aXRfc3RhdHVzIGlzIGFjY2VwdGFibGUgaW4gdGhlIGNvbnRleHQgb2YKKy8vICAgICAgICAgICAgICB0aGlzIHBhcnRpY3VsYXIgZGVhdGggdGVzdCwgd2hpY2ggZmFpbHMgaWYgaXQgaXMgZmFsc2UKKy8vCisvLyBSZXR1cm5zIHRydWUgaWZmIGFsbCBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbWV0LiAgT3RoZXJ3aXNlLCB0aGUKKy8vIGZpcnN0IGZhaWxpbmcgY29uZGl0aW9uLCBpbiB0aGUgb3JkZXIgZ2l2ZW4gYWJvdmUsIGlzIHRoZSBvbmUgdGhhdCBpcworLy8gcmVwb3J0ZWQuIEFsc28gc2V0cyB0aGUgbGFzdCBkZWF0aCB0ZXN0IG1lc3NhZ2Ugc3RyaW5nLgorYm9vbCBEZWF0aFRlc3RJbXBsOjpQYXNzZWQoYm9vbCBzdGF0dXNfb2spIHsKKyAgaWYgKCFzcGF3bmVkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2UgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworCisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICBNZXNzYWdlIGJ1ZmZlcjsKKworICBidWZmZXIgPDwgIkRlYXRoIHRlc3Q6ICIgPDwgc3RhdGVtZW50KCkgPDwgIlxuIjsKKyAgc3dpdGNoIChvdXRjb21lKCkpIHsKKyAgICBjYXNlIExJVkVEOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBmYWlsZWQgdG8gZGllLlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVXOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiB0aHJldyBhbiBleGNlcHRpb24uXG4iCisgICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVUVVJORUQ6CisgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJRUQ6CisgICAgICBpZiAoc3RhdHVzX29rKSB7CisgICAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlZCA9IFJFOjpQYXJ0aWFsTWF0Y2goZXJyb3JfbWVzc2FnZS5jX3N0cigpLCAqcmVnZXgoKSk7CisgICAgICAgIGlmIChtYXRjaGVkKSB7CisgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBlcnJvci5cbiIKKyAgICAgICAgICAgICAgICAgPDwgIiAgRXhwZWN0ZWQ6ICIgPDwgcmVnZXgoKS0+cGF0dGVybigpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBleGl0IGNvZGU6XG4iCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgIiA8PCBFeGl0U3VtbWFyeShzdGF0dXMoKSkgPDwgIlxuIgorICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU5fUFJPR1JFU1M6CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0xPR18oRkFUQUwpCisgICAgICAgICAgPDwgIkRlYXRoVGVzdDo6UGFzc2VkIHNvbWVob3cgY2FsbGVkIGJlZm9yZSBjb25jbHVzaW9uIG9mIHRlc3QiOworICB9CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoYnVmZmVyLkdldFN0cmluZygpKTsKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworLy8gV2luZG93c0RlYXRoVGVzdCBpbXBsZW1lbnRzIGRlYXRoIHRlc3RzIG9uIFdpbmRvd3MuIER1ZSB0byB0aGUKKy8vIHNwZWNpZmljcyBvZiBzdGFydGluZyBuZXcgcHJvY2Vzc2VzIG9uIFdpbmRvd3MsIGRlYXRoIHRlc3RzIHRoZXJlIGFyZQorLy8gYWx3YXlzIHRocmVhZHNhZmUsIGFuZCBHb29nbGUgVGVzdCBjb25zaWRlcnMgdGhlCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9ZmFzdCBzZXR0aW5nIHRvIGJlIGVxdWl2YWxlbnQgdG8KKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT10aHJlYWRzYWZlIHRoZXJlLgorLy8KKy8vIEEgZmV3IGltcGxlbWVudGF0aW9uIG5vdGVzOiAgTGlrZSB0aGUgTGludXggdmVyc2lvbiwgdGhlIFdpbmRvd3MKKy8vIGltcGxlbWVudGF0aW9uIHVzZXMgcGlwZXMgZm9yIGNoaWxkLXRvLXBhcmVudCBjb21tdW5pY2F0aW9uLiBCdXQgZHVlIHRvCisvLyB0aGUgc3BlY2lmaWNzIG9mIHBpcGVzIG9uIFdpbmRvd3MsIHNvbWUgZXh0cmEgc3RlcHMgYXJlIHJlcXVpcmVkOgorLy8KKy8vIDEuIFRoZSBwYXJlbnQgY3JlYXRlcyBhIGNvbW11bmljYXRpb24gcGlwZSBhbmQgc3RvcmVzIGhhbmRsZXMgdG8gYm90aAorLy8gICAgZW5kcyBvZiBpdC4KKy8vIDIuIFRoZSBwYXJlbnQgc3RhcnRzIHRoZSBjaGlsZCBhbmQgcHJvdmlkZXMgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24KKy8vICAgIG5lY2Vzc2FyeSB0byBhY3F1aXJlIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4KKy8vIDMuIFRoZSBjaGlsZCBhY3F1aXJlcyB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIGFuZCBzaWduYWxzIHRoZSBwYXJlbnQKKy8vICAgIHVzaW5nIGEgV2luZG93cyBldmVudC4KKy8vIDQuIE5vdyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb24gaXRzIHNpZGUuIElmCisvLyAgICB0aGlzIGlzIGRvbmUgYmVmb3JlIHN0ZXAgMywgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBnb2VzIGRvd24gdG8KKy8vICAgIDAgYW5kIGl0IGlzIGRlc3Ryb3llZCwgcHJldmVudGluZyB0aGUgY2hpbGQgZnJvbSBhY3F1aXJpbmcgaXQuIFRoZQorLy8gICAgcGFyZW50IG5vdyBoYXMgdG8gcmVsZWFzZSBpdCwgb3IgcmVhZCBvcGVyYXRpb25zIG9uIHRoZSByZWFkIGVuZCBvZgorLy8gICAgdGhlIHBpcGUgd2lsbCBub3QgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCisvLyA1LiBUaGUgcGFyZW50IHJlYWRzIGNoaWxkJ3Mgb3V0cHV0IHRocm91Z2ggdGhlIHBpcGUgKG91dGNvbWUgY29kZSBhbmQKKy8vICAgIGFueSBwb3NzaWJsZSBlcnJvciBtZXNzYWdlcykgZnJvbSB0aGUgcGlwZSwgYW5kIGl0cyBzdGRlcnIgYW5kIHRoZW4KKy8vICAgIGRldGVybWluZXMgd2hldGhlciB0byBmYWlsIHRoZSB0ZXN0LgorLy8KKy8vIE5vdGU6IHRvIGRpc3Rpbmd1aXNoIFdpbjMyIEFQSSBjYWxscyBmcm9tIHRoZSBsb2NhbCBtZXRob2QgYW5kIGZ1bmN0aW9uCisvLyBjYWxscywgdGhlIGZvcm1lciBhcmUgZXhwbGljaXRseSByZXNvbHZlZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKy8vCitjbGFzcyBXaW5kb3dzRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgeworIHB1YmxpYzoKKyAgV2luZG93c0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQorICAgICAgOiBEZWF0aFRlc3RJbXBsKGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHt9CisKKyAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCisgIHZpcnR1YWwgaW50IFdhaXQoKTsKKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKKyAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGludCBsaW5lXzsKKyAgLy8gSGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MuCisgIEF1dG9IYW5kbGUgd3JpdGVfaGFuZGxlXzsKKyAgLy8gQ2hpbGQgcHJvY2VzcyBoYW5kbGUuCisgIEF1dG9IYW5kbGUgY2hpbGRfaGFuZGxlXzsKKyAgLy8gRXZlbnQgdGhlIGNoaWxkIHByb2Nlc3MgdXNlcyB0byBzaWduYWwgdGhlIHBhcmVudCB0aGF0IGl0IGhhcworICAvLyBhY3F1aXJlZCB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuIEFmdGVyIHNlZWluZyB0aGlzCisgIC8vIGV2ZW50IHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgaXRzIG93biBoYW5kbGVzIHRvIG1ha2Ugc3VyZSBpdHMKKyAgLy8gUmVhZEZpbGUoKSBjYWxscyByZXR1cm4gd2hlbiB0aGUgY2hpbGQgdGVybWluYXRlcy4KKyAgQXV0b0hhbmRsZSBldmVudF9oYW5kbGVfOworfTsKKworLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0CisvLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQorLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KK2ludCBXaW5kb3dzRGVhdGhUZXN0OjpXYWl0KCkgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBXYWl0IHVudGlsIHRoZSBjaGlsZCBlaXRoZXIgc2lnbmFscyB0aGF0IGl0IGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kCisgIC8vIG9mIHRoZSBwaXBlIG9yIGl0IGRpZXMuCisgIGNvbnN0IEhBTkRMRSB3YWl0X2hhbmRsZXNbMl0gPSB7IGNoaWxkX2hhbmRsZV8uR2V0KCksIGV2ZW50X2hhbmRsZV8uR2V0KCkgfTsKKyAgc3dpdGNoICg6OldhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9oYW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIFdhaXRzIGZvciBhbnkgb2YgdGhlIGhhbmRsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSkgeworICAgIGNhc2UgV0FJVF9PQkpFQ1RfMDoKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzAgKyAxOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZhbHNlKTsgIC8vIFNob3VsZCBub3QgZ2V0IGhlcmUuCisgIH0KKworICAvLyBUaGUgY2hpbGQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb3IgZXhpdGVkLgorICAvLyBXZSByZWxlYXNlIHRoZSBoYW5kbGUgb24gb3VyIHNpZGUgYW5kIGNvbnRpbnVlLgorICB3cml0ZV9oYW5kbGVfLlJlc2V0KCk7CisgIGV2ZW50X2hhbmRsZV8uUmVzZXQoKTsKKworICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgIC8vIFdhaXRzIGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBleGl0IGlmIGl0IGhhdmVuJ3QgYWxyZWFkeS4gVGhpcworICAvLyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjaGlsZCBoYXMgYWxyZWFkeSBleGl0ZWQsIHJlZ2FyZGxlc3Mgb2YKKyAgLy8gd2hldGhlciBwcmV2aW91cyBjYWxscyB0byBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIHN5bmNocm9uaXplZCBvbiB0aGlzCisgIC8vIGhhbmRsZSBvciBub3QuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgV0FJVF9PQkpFQ1RfMCA9PSA6OldhaXRGb3JTaW5nbGVPYmplY3QoY2hpbGRfaGFuZGxlXy5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSk7CisgIERXT1JEIHN0YXR1c19jb2RlOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIDo6R2V0RXhpdENvZGVQcm9jZXNzKGNoaWxkX2hhbmRsZV8uR2V0KCksICZzdGF0dXNfY29kZSkgIT0gRkFMU0UpOworICBjaGlsZF9oYW5kbGVfLlJlc2V0KCk7CisgIHNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXNfY29kZSkpOworICByZXR1cm4gc3RhdHVzKCk7Cit9CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgV2luZG93cyBkZWF0aCB0ZXN0LiAgSXQgY3JlYXRlcyBhIGNoaWxkCisvLyBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHJ1biB0aGUKKy8vIGRlYXRoIHRlc3QuICBUaGUgY2hpbGQgcHJvY2VzcyBpcyBnaXZlbiB0aGUgLS1ndGVzdF9maWx0ZXIgYW5kCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHN1Y2ggdGhhdCBpdCBrbm93cyB0byBydW4gdGhlCisvLyBjdXJyZW50IGRlYXRoIHRlc3Qgb25seS4KK0RlYXRoVGVzdDo6VGVzdFJvbGUgV2luZG93c0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKKyAgY29uc3QgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICAvLyBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIGhhcyBwZXJmb3JtZWQgYWxsIHRoZSBuZWNlc3NhcnkKKyAgICAvLyBwcm9jZXNzaW5nLgorICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgLy8gV2luZG93c0RlYXRoVGVzdCB1c2VzIGFuIGFub255bW91cyBwaXBlIHRvIGNvbW11bmljYXRlIHJlc3VsdHMgb2YKKyAgLy8gYSBkZWF0aCB0ZXN0LgorICBTRUNVUklUWV9BVFRSSUJVVEVTIGhhbmRsZXNfYXJlX2luaGVyaXRhYmxlID0geworICAgIHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKSwgTlVMTCwgVFJVRSB9OworICBIQU5ETEUgcmVhZF9oYW5kbGUsIHdyaXRlX2hhbmRsZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICA6OkNyZWF0ZVBpcGUoJnJlYWRfaGFuZGxlLCAmd3JpdGVfaGFuZGxlLCAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgMCkgIC8vIERlZmF1bHQgYnVmZmVyIHNpemUuCisgICAgICAhPSBGQUxTRSk7CisgIHNldF9yZWFkX2ZkKDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHJlYWRfaGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRE9OTFkpKTsKKyAgd3JpdGVfaGFuZGxlXy5SZXNldCh3cml0ZV9oYW5kbGUpOworICBldmVudF9oYW5kbGVfLlJlc2V0KDo6Q3JlYXRlRXZlbnQoCisgICAgICAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICBUUlVFLCAgICAvLyBUaGUgZXZlbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIG5vbi1zaWduYWxlZCBzdGF0ZS4KKyAgICAgIEZBTFNFLCAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIGlzIG5vbi1zaWduYWxsZWQuCisgICAgICBOVUxMKSk7ICAvLyBUaGUgZXZlbiBpcyB1bm5hbWVkLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhldmVudF9oYW5kbGVfLkdldCgpICE9IE5VTEwpOworICBjb25zdCBzdGQ6OnN0cmluZyBmaWx0ZXJfZmxhZyA9CisgICAgICBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGtGaWx0ZXJGbGFnICsgIj0iICsKKyAgICAgIGluZm8tPnRlc3RfY2FzZV9uYW1lKCkgKyAiLiIgKyBpbmZvLT5uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGludGVybmFsX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnICsKKyAgICAgICI9IiArIGZpbGVfICsgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmVfKSArICJ8IiArCisgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkgKyAifCIgKworICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oOjpHZXRDdXJyZW50UHJvY2Vzc0lkKCkpKSArCisgICAgICAvLyBzaXplX3QgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIHBvaW50ZXJzIG9uIGJvdGggMzItYml0IGFuZCA2NC1iaXQKKyAgICAgIC8vIFdpbmRvd3MgcGxhdGZvcm1zLgorICAgICAgLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS90Y3hmMWR3Ni5hc3B4LgorICAgICAgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih3cml0ZV9oYW5kbGUpKSArCisgICAgICAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGV2ZW50X2hhbmRsZV8uR2V0KCkpKTsKKworICBjaGFyIGV4ZWN1dGFibGVfcGF0aFtfTUFYX1BBVEggKyAxXTsgIC8vIE5PTElOVAorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIF9NQVhfUEFUSCArIDEgIT0gOjpHZXRNb2R1bGVGaWxlTmFtZUEoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTUFYX1BBVEgpKTsKKworICBzdGQ6OnN0cmluZyBjb21tYW5kX2xpbmUgPQorICAgICAgc3RkOjpzdHJpbmcoOjpHZXRDb21tYW5kTGluZUEoKSkgKyAiICIgKyBmaWx0ZXJfZmxhZyArICIgXCIiICsKKyAgICAgIGludGVybmFsX2ZsYWcgKyAiXCIiOworCisgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIC8vIEZsdXNoIHRoZSBsb2cgYnVmZmVycyBzaW5jZSB0aGUgbG9nIHN0cmVhbXMgYXJlIHNoYXJlZCB3aXRoIHRoZSBjaGlsZC4KKyAgRmx1c2hJbmZvTG9nKCk7CisKKyAgLy8gVGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBzaGFyZSB0aGUgc3RhbmRhcmQgaGFuZGxlcyB3aXRoIHRoZSBwYXJlbnQuCisgIFNUQVJUVVBJTkZPQSBzdGFydHVwX2luZm87CisgIG1lbXNldCgmc3RhcnR1cF9pbmZvLCAwLCBzaXplb2YoU1RBUlRVUElORk8pKTsKKyAgc3RhcnR1cF9pbmZvLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU1RESEFORExFUzsKKyAgc3RhcnR1cF9pbmZvLmhTdGRJbnB1dCA9IDo6R2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOworICBzdGFydHVwX2luZm8uaFN0ZE91dHB1dCA9IDo6R2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKyAgc3RhcnR1cF9pbmZvLmhTdGRFcnJvciA9IDo6R2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOworCisgIFBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc19pbmZvOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyg6OkNyZWF0ZVByb2Nlc3NBKAorICAgICAgZXhlY3V0YWJsZV9wYXRoLAorICAgICAgY29uc3RfY2FzdDxjaGFyKj4oY29tbWFuZF9saW5lLmNfc3RyKCkpLAorICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHByb2Nlc3MgaGFuZGxlIGlzIG5vdCBpbmhlcml0YWJsZS4KKyAgICAgIE5VTEwsICAgLy8gUmV0dW5lZCB0aHJlYWQgaGFuZGxlIGlzIG5vdCBpbmhlcml0YWJsZS4KKyAgICAgIFRSVUUsICAgLy8gQ2hpbGQgaW5oZXJpdHMgYWxsIGluaGVyaXRhYmxlIGhhbmRsZXMgKGZvciB3cml0ZV9oYW5kbGVfKS4KKyAgICAgIDB4MCwgICAgLy8gRGVmYXVsdCBjcmVhdGlvbiBmbGFncy4KKyAgICAgIE5VTEwsICAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZW52aXJvbm1lbnQuCisgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSwKKyAgICAgICZzdGFydHVwX2luZm8sCisgICAgICAmcHJvY2Vzc19pbmZvKSAhPSBGQUxTRSk7CisgIGNoaWxkX2hhbmRsZV8uUmVzZXQocHJvY2Vzc19pbmZvLmhQcm9jZXNzKTsKKyAgOjpDbG9zZUhhbmRsZShwcm9jZXNzX2luZm8uaFRocmVhZCk7CisgIHNldF9zcGF3bmVkKHRydWUpOworICByZXR1cm4gT1ZFUlNFRV9URVNUOworfQorIyBlbHNlICAvLyBXZSBhcmUgbm90IG9uIFdpbmRvd3MuCisKKy8vIEZvcmtpbmdEZWF0aFRlc3QgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciBtb3N0IG9mIHRoZSBhYnN0cmFjdAorLy8gbWV0aG9kcyBvZiB0aGUgRGVhdGhUZXN0IGludGVyZmFjZS4gIE9ubHkgdGhlIEFzc3VtZVJvbGUgbWV0aG9kIGlzCisvLyBsZWZ0IHVuZGVmaW5lZC4KK2NsYXNzIEZvcmtpbmdEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0SW1wbCB7CisgcHVibGljOgorICBGb3JraW5nRGVhdGhUZXN0KGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4KTsKKworICAvLyBBbGwgb2YgdGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIERlYXRoVGVzdC4KKyAgdmlydHVhbCBpbnQgV2FpdCgpOworCisgcHJvdGVjdGVkOgorICB2b2lkIHNldF9jaGlsZF9waWQocGlkX3QgY2hpbGRfcGlkKSB7IGNoaWxkX3BpZF8gPSBjaGlsZF9waWQ7IH0KKworIHByaXZhdGU6CisgIC8vIFBJRCBvZiBjaGlsZCBwcm9jZXNzIGR1cmluZyBkZWF0aCB0ZXN0OyAwIGluIHRoZSBjaGlsZCBwcm9jZXNzIGl0c2VsZi4KKyAgcGlkX3QgY2hpbGRfcGlkXzsKK307CisKKy8vIENvbnN0cnVjdHMgYSBGb3JraW5nRGVhdGhUZXN0LgorRm9ya2luZ0RlYXRoVGVzdDo6Rm9ya2luZ0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpCisgICAgOiBEZWF0aFRlc3RJbXBsKGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwKKyAgICAgIGNoaWxkX3BpZF8oLTEpIHt9CisKKy8vIFdhaXRzIGZvciB0aGUgY2hpbGQgaW4gYSBkZWF0aCB0ZXN0IHRvIGV4aXQsIHJldHVybmluZyBpdHMgZXhpdAorLy8gc3RhdHVzLCBvciAwIGlmIG5vIGNoaWxkIHByb2Nlc3MgZXhpc3RzLiAgQXMgYSBzaWRlIGVmZmVjdCwgc2V0cyB0aGUKKy8vIG91dGNvbWUgZGF0YSBtZW1iZXIuCitpbnQgRm9ya2luZ0RlYXRoVGVzdDo6V2FpdCgpIHsKKyAgaWYgKCFzcGF3bmVkKCkpCisgICAgcmV0dXJuIDA7CisKKyAgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKKworICBpbnQgc3RhdHVzX3ZhbHVlOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHdhaXRwaWQoY2hpbGRfcGlkXywgJnN0YXR1c192YWx1ZSwgMCkpOworICBzZXRfc3RhdHVzKHN0YXR1c192YWx1ZSk7CisgIHJldHVybiBzdGF0dXNfdmFsdWU7Cit9CisKKy8vIEEgY29uY3JldGUgZGVhdGggdGVzdCBjbGFzcyB0aGF0IGZvcmtzLCB0aGVuIGltbWVkaWF0ZWx5IHJ1bnMgdGhlIHRlc3QKKy8vIGluIHRoZSBjaGlsZCBwcm9jZXNzLgorY2xhc3MgTm9FeGVjRGVhdGhUZXN0IDogcHVibGljIEZvcmtpbmdEZWF0aFRlc3QgeworIHB1YmxpYzoKKyAgTm9FeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkgOgorICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCkgeyB9CisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOworfTsKKworLy8gVGhlIEFzc3VtZVJvbGUgcHJvY2VzcyBmb3IgYSBmb3JrLWFuZC1ydW4gZGVhdGggdGVzdC4gIEl0IGltcGxlbWVudHMgYQorLy8gc3RyYWlnaHRmb3J3YXJkIGZvcmssIHdpdGggYSBzaW1wbGUgcGlwZSB0byB0cmFuc21pdCB0aGUgc3RhdHVzIGJ5dGUuCitEZWF0aFRlc3Q6OlRlc3RSb2xlIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKKyAgY29uc3Qgc2l6ZV90IHRocmVhZF9jb3VudCA9IEdldFRocmVhZENvdW50KCk7CisgIGlmICh0aHJlYWRfY291bnQgIT0gMSkgeworICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgRGVhdGhUZXN0VGhyZWFkV2FybmluZyh0aHJlYWRfY291bnQpOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworCisgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICAvLyBXaGVuIHdlIGZvcmsgdGhlIHByb2Nlc3MgYmVsb3csIHRoZSBsb2cgZmlsZSBidWZmZXJzIGFyZSBjb3BpZWQsIGJ1dCB0aGUKKyAgLy8gZmlsZSBkZXNjcmlwdG9ycyBhcmUgc2hhcmVkLiAgV2UgZmx1c2ggYWxsIGxvZyBmaWxlcyBoZXJlIHNvIHRoYXQgY2xvc2luZworICAvLyB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpbiB0aGUgY2hpbGQgcHJvY2VzcyBkb2Vzbid0IHRocm93IG9mZiB0aGUKKyAgLy8gc3luY2hyb25pemF0aW9uIGJldHdlZW4gZGVzY3JpcHRvcnMgYW5kIGJ1ZmZlcnMgaW4gdGhlIHBhcmVudCBwcm9jZXNzLgorICAvLyBUaGlzIGlzIGFzIGNsb3NlIHRvIHRoZSBmb3JrIGFzIHBvc3NpYmxlIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gaW4gY2FzZQorICAvLyB0aGVyZSBhcmUgbXVsdGlwbGUgdGhyZWFkcyBydW5uaW5nIGJlZm9yZSB0aGUgZGVhdGggdGVzdCwgYW5kIGFub3RoZXIKKyAgLy8gdGhyZWFkIHdyaXRlcyB0byB0aGUgbG9nIGZpbGUuCisgIEZsdXNoSW5mb0xvZygpOworCisgIGNvbnN0IHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY2hpbGRfcGlkICE9IC0xKTsKKyAgc2V0X2NoaWxkX3BpZChjaGlsZF9waWQpOworICBpZiAoY2hpbGRfcGlkID09IDApIHsKKyAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKHBpcGVfZmRbMF0pKTsKKyAgICBzZXRfd3JpdGVfZmQocGlwZV9mZFsxXSk7CisgICAgLy8gUmVkaXJlY3RzIGFsbCBsb2dnaW5nIHRvIHN0ZGVyciBpbiB0aGUgY2hpbGQgcHJvY2VzcyB0byBwcmV2ZW50CisgICAgLy8gY29uY3VycmVudCB3cml0ZXMgdG8gdGhlIGxvZyBmaWxlcy4gIFdlIGNhcHR1cmUgc3RkZXJyIGluIHRoZSBwYXJlbnQKKyAgICAvLyBwcm9jZXNzIGFuZCBhcHBlbmQgdGhlIGNoaWxkIHByb2Nlc3MnIG91dHB1dCB0byBhIGxvZy4KKyAgICBMb2dUb1N0ZGVycigpOworICAgIC8vIEV2ZW50IGZvcndhcmRpbmcgdG8gdGhlIGxpc3RlbmVycyBvZiBldmVudCBsaXN0ZW5lciBBUEkgbXVzaCBiZSBzaHV0CisgICAgLy8gZG93biBpbiBkZWF0aCB0ZXN0IHN1YnByb2Nlc3Nlcy4KKyAgICBHZXRVbml0VGVzdEltcGwoKS0+bGlzdGVuZXJzKCktPlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7CisgICAgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSB0cnVlOworICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7CisgIH0gZWxzZSB7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzFdKSk7CisgICAgc2V0X3JlYWRfZmQocGlwZV9mZFswXSk7CisgICAgc2V0X3NwYXduZWQodHJ1ZSk7CisgICAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKKyAgfQorfQorCisvLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcyBhbmQgcmUtZXhlY3V0ZXMgdGhlIG1haW4KKy8vIHByb2dyYW0gZnJvbSB0aGUgYmVnaW5uaW5nLCB3aXRoIGNvbW1hbmQtbGluZSBmbGFncyBzZXQgdGhhdCBjYXVzZQorLy8gb25seSB0aGlzIHNwZWNpZmljIGRlYXRoIHRlc3QgdG8gYmUgcnVuLgorY2xhc3MgRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIEV4ZWNEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSA6CisgICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHsgfQorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKKyBwcml2YXRlOgorICBzdGF0aWMgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPgorICBHZXRBcmd2c0ZvckRlYXRoVGVzdENoaWxkUHJvY2VzcygpIHsKKyAgICA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGFyZ3MgPSBHZXRJbmplY3RhYmxlQXJndnMoKTsKKyAgICByZXR1cm4gYXJnczsKKyAgfQorICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKKyAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGludCBsaW5lXzsKK307CisKKy8vIFV0aWxpdHkgY2xhc3MgZm9yIGFjY3VtdWxhdGluZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorY2xhc3MgQXJndW1lbnRzIHsKKyBwdWJsaWM6CisgIEFyZ3VtZW50cygpIHsKKyAgICBhcmdzXy5wdXNoX2JhY2soTlVMTCk7CisgIH0KKworICB+QXJndW1lbnRzKCkgeworICAgIGZvciAoc3RkOjp2ZWN0b3I8Y2hhcio+OjppdGVyYXRvciBpID0gYXJnc18uYmVnaW4oKTsgaSAhPSBhcmdzXy5lbmQoKTsKKyAgICAgICAgICsraSkgeworICAgICAgZnJlZSgqaSk7CisgICAgfQorICB9CisgIHZvaWQgQWRkQXJndW1lbnQoY29uc3QgY2hhciogYXJndW1lbnQpIHsKKyAgICBhcmdzXy5pbnNlcnQoYXJnc18uZW5kKCkgLSAxLCBwb3NpeDo6U3RyRHVwKGFyZ3VtZW50KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyPgorICB2b2lkIEFkZEFyZ3VtZW50cyhjb25zdCA6OnN0ZDo6dmVjdG9yPFN0cj4mIGFyZ3VtZW50cykgeworICAgIGZvciAodHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxTdHI+Ojpjb25zdF9pdGVyYXRvciBpID0gYXJndW1lbnRzLmJlZ2luKCk7CisgICAgICAgICBpICE9IGFyZ3VtZW50cy5lbmQoKTsKKyAgICAgICAgICsraSkgeworICAgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChpLT5jX3N0cigpKSk7CisgICAgfQorICB9CisgIGNoYXIqIGNvbnN0KiBBcmd2KCkgeworICAgIHJldHVybiAmYXJnc19bMF07CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPGNoYXIqPiBhcmdzXzsKK307CisKKy8vIEEgc3RydWN0IHRoYXQgZW5jb21wYXNzZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhCisvLyB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QgcHJvY2Vzcy4KK3N0cnVjdCBFeGVjRGVhdGhUZXN0QXJncyB7CisgIGNoYXIqIGNvbnN0KiBhcmd2OyAgLy8gQ29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgdGhlIGNoaWxkJ3MgY2FsbCB0byBleGVjCisgIGludCBjbG9zZV9mZDsgICAgICAgLy8gRmlsZSBkZXNjcmlwdG9yIHRvIGNsb3NlOyB0aGUgcmVhZCBlbmQgb2YgYSBwaXBlCit9OworCisjICBpZiBHVEVTVF9PU19NQUMKK2lubGluZSBjaGFyKiogR2V0RW52aXJvbigpIHsKKyAgLy8gV2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBhIGZyYW1ld29yayBvbiBNYWNPUyBYLCB0aGUgZW52aXJvbiB2YXJpYWJsZQorICAvLyBpcyB1bmF2YWlsYWJsZS4gQXBwbGUncyBkb2N1bWVudGF0aW9uIChtYW4gZW52aXJvbikgcmVjb21tZW5kcyB1c2luZworICAvLyBfTlNHZXRFbnZpcm9uKCkgaW5zdGVhZC4KKyAgcmV0dXJuICpfTlNHZXRFbnZpcm9uKCk7Cit9CisjICBlbHNlCisvLyBTb21lIFBPU0lYIHBsYXRmb3JtcyBleHBlY3QgeW91IHRvIGRlY2xhcmUgZW52aXJvbi4gZXh0ZXJuICJDIiBtYWtlcworLy8gaXQgcmVzaWRlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorZXh0ZXJuICJDIiBjaGFyKiogZW52aXJvbjsKK2lubGluZSBjaGFyKiogR2V0RW52aXJvbigpIHsgcmV0dXJuIGVudmlyb247IH0KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKKworIyAgaWYgIUdURVNUX09TX1FOWAorLy8gVGhlIG1haW4gZnVuY3Rpb24gZm9yIGEgdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhIGNsb25lKCktZWQgcHJvY2VzcyBhbmQgdGh1cyBtdXN0IGF2b2lkCisvLyBhbnkgcG90ZW50aWFsbHkgdW5zYWZlIG9wZXJhdGlvbnMgbGlrZSBtYWxsb2Mgb3IgbGliYyBmdW5jdGlvbnMuCitzdGF0aWMgaW50IEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4odm9pZCogY2hpbGRfYXJnKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzKiBjb25zdCBhcmdzID0gc3RhdGljX2Nhc3Q8RXhlY0RlYXRoVGVzdEFyZ3MqPihjaGlsZF9hcmcpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKGFyZ3MtPmNsb3NlX2ZkKSk7CisKKyAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKKyAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCisgIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgorICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7CisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCisgIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKKyAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGV4ZWN2ZSgpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuICBXZQorICAvLyBjYW5ub3QgdXNlIGV4ZWN2cCgpIGFzIGl0J3MgYSBsaWJjIGZ1bmN0aW9uIGFuZCB0aHVzIHBvdGVudGlhbGx5CisgIC8vIHVuc2FmZS4gIFNpbmNlIGV4ZWN2ZSgpIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRILCB0aGUgdXNlciBtdXN0CisgIC8vIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHZhbGlkIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdAorICAvLyBvbmUgcGF0aCBzZXBhcmF0b3IuCisgIGV4ZWN2ZShhcmdzLT5hcmd2WzBdLCBhcmdzLT5hcmd2LCBHZXRFbnZpcm9uKCkpOworICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiZXhlY3ZlKCIpICsgYXJncy0+YXJndlswXSArICIsIC4uLikgaW4gIiArCisgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2RpciArICIgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7CisgIHJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisjICBlbmRpZiAgLy8gIUdURVNUX09TX1FOWAorCisvLyBUd28gdXRpbGl0eSByb3V0aW5lcyB0aGF0IHRvZ2V0aGVyIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIHRoZSBzdGFjaworLy8gZ3Jvd3MuCisvLyBUaGlzIGNvdWxkIGJlIGFjY29tcGxpc2hlZCBtb3JlIGVsZWdhbnRseSBieSBhIHNpbmdsZSByZWN1cnNpdmUKKy8vIGZ1bmN0aW9uLCBidXQgd2Ugd2FudCB0byBndWFyZCBhZ2FpbnN0IHRoZSB1bmxpa2VseSBwb3NzaWJpbGl0eSBvZgorLy8gYSBzbWFydCBjb21waWxlciBvcHRpbWl6aW5nIHRoZSByZWN1cnNpb24gYXdheS4KKy8vCisvLyBHVEVTVF9OT19JTkxJTkVfIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgR0NDIDQuNiBmcm9tIGlubGluaW5nCisvLyBTdGFja0xvd2VyVGhhbkFkZHJlc3MgaW50byBTdGFja0dyb3dzRG93biwgd2hpY2ggdGhlbiBkb2Vzbid0IGdpdmUKKy8vIGNvcnJlY3QgYW5zd2VyLgordm9pZCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyLCBib29sKiByZXN1bHQpIEdURVNUX05PX0lOTElORV87Cit2b2lkIFN0YWNrTG93ZXJUaGFuQWRkcmVzcyhjb25zdCB2b2lkKiBwdHIsIGJvb2wqIHJlc3VsdCkgeworICBpbnQgZHVtbXk7CisgICpyZXN1bHQgPSAoJmR1bW15IDwgcHRyKTsKK30KKworYm9vbCBTdGFja0dyb3dzRG93bigpIHsKKyAgaW50IGR1bW15OworICBib29sIHJlc3VsdDsKKyAgU3RhY2tMb3dlclRoYW5BZGRyZXNzKCZkdW1teSwgJnJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNwYXducyBhIGNoaWxkIHByb2Nlc3Mgd2l0aCB0aGUgc2FtZSBleGVjdXRhYmxlIGFzIHRoZSBjdXJyZW50IHByb2Nlc3MgaW4KKy8vIGEgdGhyZWFkLXNhZmUgbWFubmVyIGFuZCBpbnN0cnVjdHMgaXQgdG8gcnVuIHRoZSBkZWF0aCB0ZXN0LiAgVGhlCisvLyBpbXBsZW1lbnRhdGlvbiB1c2VzIGZvcmsoMikgKyBleGVjLiAgT24gc3lzdGVtcyB3aGVyZSBjbG9uZSgyKSBpcworLy8gYXZhaWxhYmxlLCBpdCBpcyB1c2VkIGluc3RlYWQsIGJlaW5nIHNsaWdodGx5IG1vcmUgdGhyZWFkLXNhZmUuICBPbiBRTlgsCisvLyBmb3JrIHN1cHBvcnRzIG9ubHkgc2luZ2xlLXRocmVhZGVkIGVudmlyb25tZW50cywgc28gdGhpcyBmdW5jdGlvbiB1c2VzCisvLyBzcGF3bigyKSB0aGVyZSBpbnN0ZWFkLiAgVGhlIGZ1bmN0aW9uIGRpZXMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmCisvLyBhbnl0aGluZyBnb2VzIHdyb25nLgorc3RhdGljIHBpZF90IEV4ZWNEZWF0aFRlc3RTcGF3bkNoaWxkKGNoYXIqIGNvbnN0KiBhcmd2LCBpbnQgY2xvc2VfZmQpIHsKKyAgRXhlY0RlYXRoVGVzdEFyZ3MgYXJncyA9IHsgYXJndiwgY2xvc2VfZmQgfTsKKyAgcGlkX3QgY2hpbGRfcGlkID0gLTE7CisKKyMgIGlmIEdURVNUX09TX1FOWAorICAvLyBPYnRhaW5zIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgc2V0cyBpdCB0byBiZSBjbG9zZWQgaW4gdGhlIGNoaWxkCisgIC8vIHByb2Nlc3MuCisgIGNvbnN0IGludCBjd2RfZmQgPSBvcGVuKCIuIiwgT19SRE9OTFkpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjd2RfZmQgIT0gLTEpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZjbnRsKGN3ZF9mZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQykpOworICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIHRlc3QgcHJvZ3JhbSBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCB3aGVyZQorICAvLyBpdCB3YXMgb3JpZ2luYWxseSBpbnZva2VkLiAgVGhlcmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgb3JpZ2luYWwKKyAgLy8gd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuCisgIGNvbnN0IGNoYXIqIGNvbnN0IG9yaWdpbmFsX2RpciA9CisgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKTsKKyAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGNoZGlyKCkgYXMgaXQncyBhIGRpcmVjdCBzeXN0ZW0gY2FsbC4KKyAgaWYgKGNoZGlyKG9yaWdpbmFsX2RpcikgIT0gMCkgeworICAgIERlYXRoVGVzdEFib3J0KHN0ZDo6c3RyaW5nKCJjaGRpcihcIiIpICsgb3JpZ2luYWxfZGlyICsgIlwiKSBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBpbnQgZmRfZmxhZ3M7CisgIC8vIFNldCBjbG9zZV9mZCB0byBiZSBjbG9zZWQgYWZ0ZXIgc3Bhd24uCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZmRfZmxhZ3MgPSBmY250bChjbG9zZV9mZCwgRl9HRVRGRCkpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZjbnRsKGNsb3NlX2ZkLCBGX1NFVEZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX2ZsYWdzIHwgRkRfQ0xPRVhFQykpOworICBzdHJ1Y3QgaW5oZXJpdGFuY2UgaW5oZXJpdCA9IHswfTsKKyAgLy8gc3Bhd24gaXMgYSBzeXN0ZW0gY2FsbC4KKyAgY2hpbGRfcGlkID0gc3Bhd24oYXJncy5hcmd2WzBdLCAwLCBOVUxMLCAmaW5oZXJpdCwgYXJncy5hcmd2LCBHZXRFbnZpcm9uKCkpOworICAvLyBSZXN0b3JlcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZmNoZGlyKGN3ZF9mZCkgIT0gLTEpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKGN3ZF9mZCkpOworCisjICBlbHNlICAgLy8gR1RFU1RfT1NfUU5YCisjICAgaWYgR1RFU1RfT1NfTElOVVgKKyAgLy8gV2hlbiBhIFNJR1BST0Ygc2lnbmFsIGlzIHJlY2VpdmVkIHdoaWxlIGZvcmsoKSBvciBjbG9uZSgpIGFyZSBleGVjdXRpbmcsCisgIC8vIHRoZSBwcm9jZXNzIG1heSBoYW5nLiBUbyBhdm9pZCB0aGlzLCB3ZSBpZ25vcmUgU0lHUFJPRiBoZXJlIGFuZCByZS1lbmFibGUKKyAgLy8gaXQgYWZ0ZXIgdGhlIGNhbGwgdG8gZm9yaygpL2Nsb25lKCkgaXMgY29tcGxldGUuCisgIHN0cnVjdCBzaWdhY3Rpb24gc2F2ZWRfc2lncHJvZl9hY3Rpb247CisgIHN0cnVjdCBzaWdhY3Rpb24gaWdub3JlX3NpZ3Byb2ZfYWN0aW9uOworICBtZW1zZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbiwgMCwgc2l6ZW9mKGlnbm9yZV9zaWdwcm9mX2FjdGlvbikpOworICBzaWdlbXB0eXNldCgmaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLnNhX21hc2spOworICBpZ25vcmVfc2lncHJvZl9hY3Rpb24uc2FfaGFuZGxlciA9IFNJR19JR047CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oc2lnYWN0aW9uKAorICAgICAgU0lHUFJPRiwgJmlnbm9yZV9zaWdwcm9mX2FjdGlvbiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uKSk7CisjICAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyMgICBpZiBHVEVTVF9IQVNfQ0xPTkUKKyAgY29uc3QgYm9vbCB1c2VfZm9yayA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisKKyAgaWYgKCF1c2VfZm9yaykgeworICAgIHN0YXRpYyBjb25zdCBib29sIHN0YWNrX2dyb3dzX2Rvd24gPSBTdGFja0dyb3dzRG93bigpOworICAgIGNvbnN0IHNpemVfdCBzdGFja19zaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICAvLyBNTUFQX0FOT05ZTU9VUyBpcyBub3QgZGVmaW5lZCBvbiBNYWMsIHNvIHdlIHVzZSBNQVBfQU5PTiBpbnN0ZWFkLgorICAgIHZvaWQqIGNvbnN0IHN0YWNrID0gbW1hcChOVUxMLCBzdGFja19zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfQU5PTiB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oc3RhY2sgIT0gTUFQX0ZBSUxFRCk7CisKKyAgICAvLyBNYXhpbXVtIHN0YWNrIGFsaWdubWVudCBpbiBieXRlczogIEZvciBhIGRvd253YXJkLWdyb3dpbmcgc3RhY2ssIHRoaXMKKyAgICAvLyBhbW91bnQgaXMgc3VidHJhY3RlZCBmcm9tIHNpemUgb2YgdGhlIHN0YWNrIHNwYWNlIHRvIGdldCBhbiBhZGRyZXNzCisgICAgLy8gdGhhdCBpcyB3aXRoaW4gdGhlIHN0YWNrIHNwYWNlIGFuZCBpcyBhbGlnbmVkIG9uIGFsbCBzeXN0ZW1zIHdlIGNhcmUKKyAgICAvLyBhYm91dC4gIEFzIGZhciBhcyBJIGtub3cgdGhlcmUgaXMgbm8gQUJJIHdpdGggc3RhY2sgYWxpZ25tZW50IGdyZWF0ZXIKKyAgICAvLyB0aGFuIDY0LiAgV2UgYXNzdW1lIHN0YWNrIGFuZCBzdGFja19zaXplIGFscmVhZHkgaGF2ZSBhbGlnbm1lbnQgb2YKKyAgICAvLyBrTWF4U3RhY2tBbGlnbm1lbnQuCisgICAgY29uc3Qgc2l6ZV90IGtNYXhTdGFja0FsaWdubWVudCA9IDY0OworICAgIHZvaWQqIGNvbnN0IHN0YWNrX3RvcCA9CisgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihzdGFjaykgKworICAgICAgICAgICAgKHN0YWNrX2dyb3dzX2Rvd24gPyBzdGFja19zaXplIC0ga01heFN0YWNrQWxpZ25tZW50IDogMCk7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oc3RhY2tfc2l6ZSA+IGtNYXhTdGFja0FsaWdubWVudCAmJgorICAgICAgICByZWludGVycHJldF9jYXN0PGludHB0cl90PihzdGFja190b3ApICUga01heFN0YWNrQWxpZ25tZW50ID09IDApOworCisgICAgY2hpbGRfcGlkID0gY2xvbmUoJkV4ZWNEZWF0aFRlc3RDaGlsZE1haW4sIHN0YWNrX3RvcCwgU0lHQ0hMRCwgJmFyZ3MpOworCisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18obXVubWFwKHN0YWNrLCBzdGFja19zaXplKSAhPSAtMSk7CisgIH0KKyMgICBlbHNlCisgIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSB0cnVlOworIyAgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ0xPTkUKKworICBpZiAodXNlX2ZvcmsgJiYgKGNoaWxkX3BpZCA9IGZvcmsoKSkgPT0gMCkgeworICAgICAgRXhlY0RlYXRoVGVzdENoaWxkTWFpbigmYXJncyk7CisgICAgICBfZXhpdCgwKTsKKyAgfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX1FOWAorIyAgaWYgR1RFU1RfT1NfTElOVVgKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXygKKyAgICAgIHNpZ2FjdGlvbihTSUdQUk9GLCAmc2F2ZWRfc2lncHJvZl9hY3Rpb24sIE5VTEwpKTsKKyMgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7CisgIHJldHVybiBjaGlsZF9waWQ7Cit9CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgZm9yay1hbmQtZXhlYyBkZWF0aCB0ZXN0LiAgSXQgcmUtZXhlY3V0ZXMgdGhlCisvLyBtYWluIHByb2dyYW0gZnJvbSB0aGUgYmVnaW5uaW5nLCBzZXR0aW5nIHRoZSAtLWd0ZXN0X2ZpbHRlcgorLy8gYW5kIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3MgdG8gY2F1c2Ugb25seSB0aGUgY3VycmVudAorLy8gZGVhdGggdGVzdCB0byBiZSByZS1ydW4uCitEZWF0aFRlc3Q6OlRlc3RSb2xlIEV4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW5mby0+cmVzdWx0KCktPmRlYXRoX3Rlc3RfY291bnQoKTsKKworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgc2V0X3dyaXRlX2ZkKGZsYWctPndyaXRlX2ZkKCkpOworICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7CisgIH0KKworICBpbnQgcGlwZV9mZFsyXTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocGlwZShwaXBlX2ZkKSAhPSAtMSk7CisgIC8vIENsZWFyIHRoZSBjbG9zZS1vbi1leGVjIGZsYWcgb24gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSwgbGVzdAorICAvLyBpdCBiZSBjbG9zZWQgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkb2VzIGFuIGV4ZWM6CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZjbnRsKHBpcGVfZmRbMV0sIEZfU0VURkQsIDApICE9IC0xKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBmaWx0ZXJfZmxhZyA9CisgICAgICBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGtGaWx0ZXJGbGFnICsgIj0iCisgICAgICArIGluZm8tPnRlc3RfY2FzZV9uYW1lKCkgKyAiLiIgKyBpbmZvLT5uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGludGVybmFsX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnICsgIj0iCisgICAgICArIGZpbGVfICsgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmVfKSArICJ8IgorICAgICAgKyBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkgKyAifCIKKyAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKHBpcGVfZmRbMV0pOworICBBcmd1bWVudHMgYXJnczsKKyAgYXJncy5BZGRBcmd1bWVudHMoR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSk7CisgIGFyZ3MuQWRkQXJndW1lbnQoZmlsdGVyX2ZsYWcuY19zdHIoKSk7CisgIGFyZ3MuQWRkQXJndW1lbnQoaW50ZXJuYWxfZmxhZy5jX3N0cigpKTsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICAvLyBTZWUgdGhlIGNvbW1lbnQgaW4gTm9FeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlIGZvciB3aHkgdGhlIG5leHQgbGluZQorICAvLyBpcyBuZWNlc3NhcnkuCisgIEZsdXNoSW5mb0xvZygpOworCisgIGNvbnN0IHBpZF90IGNoaWxkX3BpZCA9IEV4ZWNEZWF0aFRlc3RTcGF3bkNoaWxkKGFyZ3MuQXJndigpLCBwaXBlX2ZkWzBdKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzFdKSk7CisgIHNldF9jaGlsZF9waWQoY2hpbGRfcGlkKTsKKyAgc2V0X3JlYWRfZmQocGlwZV9mZFswXSk7CisgIHNldF9zcGF3bmVkKHRydWUpOworICByZXR1cm4gT1ZFUlNFRV9URVNUOworfQorCisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBDcmVhdGVzIGEgY29uY3JldGUgRGVhdGhUZXN0LWRlcml2ZWQgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZQorLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGZsYWcsIGFuZCBzZXRzIHRoZSBwb2ludGVyIHBvaW50ZWQgdG8KKy8vIGJ5IHRoZSAidGVzdCIgYXJndW1lbnQgdG8gaXRzIGFkZHJlc3MuICBJZiB0aGUgdGVzdCBzaG91bGQgYmUKKy8vIHNraXBwZWQsIHNldHMgdGhhdCBwb2ludGVyIHRvIE5VTEwuICBSZXR1cm5zIHRydWUsIHVubGVzcyB0aGUKKy8vIGZsYWcgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUuCitib29sIERlZmF1bHREZWF0aFRlc3RGYWN0b3J5OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhdGhUZXN0KiogdGVzdCkgeworICBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpCisgICAgICAtPmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIGlmIChkZWF0aF90ZXN0X2luZGV4ID4gZmxhZy0+aW5kZXgoKSkgeworICAgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoCisgICAgICAgICAgIkRlYXRoIHRlc3QgY291bnQgKCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkKKyAgICAgICAgICArICIpIHNvbWVob3cgZXhjZWVkZWQgZXhwZWN0ZWQgbWF4aW11bSAoIgorICAgICAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKGZsYWctPmluZGV4KCkpICsgIikiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIShmbGFnLT5maWxlKCkgPT0gZmlsZSAmJiBmbGFnLT5saW5lKCkgPT0gbGluZSAmJgorICAgICAgICAgIGZsYWctPmluZGV4KCkgPT0gZGVhdGhfdGVzdF9pbmRleCkpIHsKKyAgICAgICp0ZXN0ID0gTlVMTDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIgfHwKKyAgICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7CisgICAgKnRlc3QgPSBuZXcgV2luZG93c0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKKyAgfQorCisjIGVsc2UKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpIHsKKyAgICAqdGVzdCA9IG5ldyBFeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUpOworICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7CisgICAgKnRlc3QgPSBuZXcgTm9FeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgpOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICBlbHNlIHsgIC8vIE5PTElOVCAtIHRoaXMgaXMgbW9yZSByZWFkYWJsZSB0aGFuIHVuYmFsYW5jZWQgYnJhY2tldHMgaW5zaWRlICNpZi4KKyAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgKKyAgICAgICAgIlVua25vd24gZGVhdGggdGVzdCBzdHlsZSBcIiIgKyBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpCisgICAgICAgICsgIlwiIGVuY291bnRlcmVkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBvbiBhIGdpdmVuIGRlbGltaXRlciwgcG9wdWxhdGluZyBhIGdpdmVuCisvLyB2ZWN0b3Igd2l0aCB0aGUgZmllbGRzLiAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUKKy8vIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UgaXQgaGVyZS4KK3N0YXRpYyB2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiogZGVzdCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBwYXJzZWQ7CisgIDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7CisgICAgY29uc3QgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gc3RyLmZpbmQoZGVsaW1pdGVyLCBwb3MpOworICAgIGlmIChjb2xvbiA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zKSk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcywgY29sb24gLSBwb3MpKTsKKyAgICAgIHBvcyA9IGNvbG9uICsgMTsKKyAgICB9CisgIH0KKyAgZGVzdC0+c3dhcChwYXJzZWQpOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFJlY3JlYXRlcyB0aGUgcGlwZSBhbmQgZXZlbnQgaGFuZGxlcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLAorLy8gc2lnbmFscyB0aGUgZXZlbnQsIGFuZCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHdyYXBwZWQgYXJvdW5kIHRoZSBwaXBlCisvLyBoYW5kbGUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBjaGlsZCBwcm9jZXNzIG9ubHkuCitpbnQgR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IodW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90KSB7CisgIEF1dG9IYW5kbGUgcGFyZW50X3Byb2Nlc3NfaGFuZGxlKDo6T3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBOb24taW5oZXJpdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcHJvY2Vzc19pZCkpOworICBpZiAocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBvcGVuIHBhcmVudCBwcm9jZXNzICIgKworICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVwbGFjZSB0aGUgZm9sbG93aW5nIGNoZWNrIHdpdGggYQorICAvLyBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHdoZW4gYXZhaWxhYmxlLgorICBHVEVTVF9DSEVDS18oc2l6ZW9mKEhBTkRMRSkgPD0gc2l6ZW9mKHNpemVfdCkpOworCisgIGNvbnN0IEhBTkRMRSB3cml0ZV9oYW5kbGUgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KHdyaXRlX2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX3dyaXRlX2hhbmRsZTsKKworICAvLyBUaGUgbmV3bHkgaW5pdGlhbGl6ZWQgaGFuZGxlIGlzIGFjY2Vzc2libGUgb25seSBpbiBpbiB0aGUgcGFyZW50CisgIC8vIHByb2Nlc3MuIFRvIG9idGFpbiBvbmUgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIGNoaWxkLCB3ZSBuZWVkIHRvIHVzZQorICAvLyBEdXBsaWNhdGVIYW5kbGUuCisgIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCB3cml0ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX3dyaXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDAsICAgIC8vIFJlcXVlc3RlZCBwcml2aWxlZ2VzIGlnbm9yZWQgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERVUExJQ0FURV9TQU1FX0FDQ0VTUyBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gUmVxdWVzdCBub24taW5oZXJpdGFibGUgaGFuZGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIHBpcGUgaGFuZGxlICIgKworICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KSArCisgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAiICsKKyAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcocGFyZW50X3Byb2Nlc3NfaWQpKTsKKyAgfQorCisgIGNvbnN0IEhBTkRMRSBldmVudF9oYW5kbGUgPSByZWludGVycHJldF9jYXN0PEhBTkRMRT4oZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7CisgIEhBTkRMRSBkdXBfZXZlbnRfaGFuZGxlOworCisgIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCBldmVudF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX2V2ZW50X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKSkgeworICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBldmVudCBoYW5kbGUgIiArCisgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKGV2ZW50X2hhbmRsZV9hc19zaXplX3QpICsKKyAgICAgICAgICAgICAgICAgICAiIGZyb20gdGhlIHBhcmVudCBwcm9jZXNzICIgKworICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgY29uc3QgaW50IHdyaXRlX2ZkID0KKyAgICAgIDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGR1cF93cml0ZV9oYW5kbGUpLCBPX0FQUEVORCk7CisgIGlmICh3cml0ZV9mZCA9PSAtMSkgeworICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gY29udmVydCBwaXBlIGhhbmRsZSAiICsKKyAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcod3JpdGVfaGFuZGxlX2FzX3NpemVfdCkgKworICAgICAgICAgICAgICAgICAgICIgdG8gYSBmaWxlIGRlc2NyaXB0b3IiKTsKKyAgfQorCisgIC8vIFNpZ25hbHMgdGhlIHBhcmVudCB0aGF0IHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgaGFzIGJlZW4gYWNxdWlyZWQKKyAgLy8gc28gdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIHdyaXRlIGVuZC4KKyAgOjpTZXRFdmVudChkdXBfZXZlbnRfaGFuZGxlKTsKKworICByZXR1cm4gd3JpdGVfZmQ7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyBvYmplY3Qgd2l0aCBmaWVsZHMKKy8vIGluaXRpYWxpemVkIGZyb20gdGhlIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpIGZsYWcgaWYKKy8vIHRoZSBmbGFnIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KK0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgIGlmIChHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9PSAiIikgcmV0dXJuIE5VTEw7CisKKyAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UKKyAgLy8gY2FuIHVzZSBpdCBoZXJlLgorICBpbnQgbGluZSA9IC0xOworICBpbnQgaW5kZXggPSAtMTsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gZmllbGRzOworICBTcGxpdFN0cmluZyhHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpLCAnfCcsICZmaWVsZHMpOworICBpbnQgd3JpdGVfZmQgPSAtMTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgdW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkID0gMDsKKyAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QgPSAwOworICBzaXplX3QgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCA9IDA7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNgorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmcGFyZW50X3Byb2Nlc3NfaWQpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s0XSwgJndyaXRlX2hhbmRsZV9hc19zaXplX3QpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s1XSwgJmV2ZW50X2hhbmRsZV9hc19zaXplX3QpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICIgKworICAgICAgICAgICAgICAgICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKTsKKyAgfQorICB3cml0ZV9mZCA9IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7CisjIGVsc2UKKworICBpZiAoZmllbGRzLnNpemUoKSAhPSA0CisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZ3cml0ZV9mZCkpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogIgorICAgICAgICArIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKTsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIG5ldyBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoZmllbGRzWzBdLCBsaW5lLCBpbmRleCwgd3JpdGVfZmQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1maWxlcGF0aC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmU1OGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKQEAgLTAsMCArMSwzODIgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxpZiBHVEVTVF9PU19TWU1CSUFOCisvLyBTeW1iaWFuIE9wZW5DIGhhcyBQQVRIX01BWCBpbiBzeXMvc3lzbGltaXRzLmgKKyMgaW5jbHVkZSA8c3lzL3N5c2xpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjIGluY2x1ZGUgPGNsaW1pdHM+ICAvLyBTb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgZGVmaW5lIFBBVEhfTUFYIGhlcmUuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX01BWF9QQVRICisjZWxpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIFBBVEhfTUFYCisjZWxpZiBkZWZpbmVkKF9YT1BFTl9QQVRIX01BWCkKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfWE9QRU5fUEFUSF9NQVgKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1BPU0lYX1BBVEhfTUFYCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gT24gV2luZG93cywgJ1xcJyBpcyB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IsIGJ1dCBtYW55IHRvb2xzIGFuZCB0aGUKKy8vIFdpbmRvd3MgQVBJIGFsc28gYWNjZXB0ICcvJyBhcyBhbiBhbHRlcm5hdGUgcGF0aCBzZXBhcmF0b3IuIFVubGVzcyBvdGhlcndpc2UKKy8vIG5vdGVkLCBhIGZpbGUgcGF0aCBjYW4gY29udGFpbiBlaXRoZXIga2luZCBvZiBwYXRoIHNlcGFyYXRvcnMsIG9yIGEgbWl4dHVyZQorLy8gb2YgdGhlbS4KK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnXFwnOworY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvciA9ICcvJzsKK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICJcXCI7Citjb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yU3RyaW5nW10gPSAiLyI7CisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgZGlyZWN0b3J5LiBZb3Ugc2hvdWxkIG5vdCB1c2UKKy8vIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiB0ZXN0cyBvbiBXaW5kb3dzIENFLCBidXQgdGhpcyBhdCBsZWFzdAorLy8gcHJvdmlkZXMgYSByZWFzb25hYmxlIGZhbGxiYWNrLgorY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIlxcIjsKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBkZWZpbmUgSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMKK2NvbnN0IERXT1JEIGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMgPSAweGZmZmZmZmZmOworIyBlbHNlCitjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiLlxcIjsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjZWxzZQorY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICcvJzsKK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuLyI7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBwYXRoIHNlcGFyYXRvci4KK3N0YXRpYyBib29sIElzUGF0aFNlcGFyYXRvcihjaGFyIGMpIHsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICByZXR1cm4gKGMgPT0ga1BhdGhTZXBhcmF0b3IpIHx8IChjID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsKKyNlbHNlCisgIHJldHVybiBjID09IGtQYXRoU2VwYXJhdG9yOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuCisgIC8vIHNvbWV0aGluZyByZWFzb25hYmxlLgorICByZXR1cm4gRmlsZVBhdGgoa0N1cnJlbnREaXJlY3RvcnlTdHJpbmcpOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OworICByZXR1cm4gRmlsZVBhdGgoX2dldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOworI2Vsc2UKKyAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKKyAgcmV0dXJuIEZpbGVQYXRoKGdldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorfQorCisvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gcmVtb3ZlZC4KKy8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKKy8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAorLy8gZm91bmQsIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBGaWxlUGF0aC4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdCB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGRvdF9leHRlbnNpb24gPSBzdGQ6OnN0cmluZygiLiIpICsgZXh0ZW5zaW9uOworICBpZiAoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZShwYXRobmFtZV8sIGRvdF9leHRlbnNpb24pKSB7CisgICAgcmV0dXJuIEZpbGVQYXRoKHBhdGhuYW1lXy5zdWJzdHIoCisgICAgICAgIDAsIHBhdGhuYW1lXy5sZW5ndGgoKSAtIGRvdF9leHRlbnNpb24ubGVuZ3RoKCkpKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHZhbGlkIHBhdGggc2VwYXJhdG9yIGluCisvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCisvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgorY29uc3QgY2hhciogRmlsZVBhdGg6OkZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBzdHJyY2hyKGNfc3RyKCksIGtQYXRoU2VwYXJhdG9yKTsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X2FsdF9zZXAgPSBzdHJyY2hyKGNfc3RyKCksIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsKKyAgLy8gQ29tcGFyaW5nIHR3byBwb2ludGVycyBvZiB3aGljaCBvbmx5IG9uZSBpcyBOVUxMIGlzIHVuZGVmaW5lZC4KKyAgaWYgKGxhc3RfYWx0X3NlcCAhPSBOVUxMICYmCisgICAgICAobGFzdF9zZXAgPT0gTlVMTCB8fCBsYXN0X2FsdF9zZXAgPiBsYXN0X3NlcCkpIHsKKyAgICByZXR1cm4gbGFzdF9hbHRfc2VwOworICB9CisjZW5kaWYKKyAgcmV0dXJuIGxhc3Rfc2VwOworfQorCisvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4KKy8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucworLy8gRmlsZVBhdGgoImZpbGUiKS4gSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IHBhcnQgKCJqdXN0X2FfZmlsZSIpLCBpdCByZXR1cm5zCisvLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdAorLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOworICByZXR1cm4gbGFzdF9zZXAgPyBGaWxlUGF0aChsYXN0X3NlcCArIDEpIDogKnRoaXM7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXRoIHdpdGggdGhlIGZpbGVuYW1lIHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCisvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCisvLyBGaWxlUGF0aCgiLi8iKSBvciwgb24gV2luZG93cywgRmlsZVBhdGgoIi5cXCIpLiBJZiB0aGUgZmlsZXBhdGggZG9lcworLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUZpbGVOYW1lKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOworICBzdGQ6OnN0cmluZyBkaXI7CisgIGlmIChsYXN0X3NlcCkgeworICAgIGRpciA9IHN0ZDo6c3RyaW5nKGNfc3RyKCksIGxhc3Rfc2VwICsgMSAtIGNfc3RyKCkpOworICB9IGVsc2UgeworICAgIGRpciA9IGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nOworICB9CisgIHJldHVybiBGaWxlUGF0aChkaXIpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuYW1pbmcgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIHhtbCBvdXRwdXQuCisKKy8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCisvLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXIKKy8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7CisgIHN0ZDo6c3RyaW5nIGZpbGU7CisgIGlmIChudW1iZXIgPT0gMCkgeworICAgIGZpbGUgPSBiYXNlX25hbWUuc3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisgIH0gZWxzZSB7CisgICAgZmlsZSA9IGJhc2VfbmFtZS5zdHJpbmcoKSArICJfIiArIFN0cmVhbWFibGVUb1N0cmluZyhudW1iZXIpCisgICAgICAgICsgIi4iICsgZXh0ZW5zaW9uOworICB9CisgIHJldHVybiBDb25jYXRQYXRocyhkaXJlY3RvcnksIEZpbGVQYXRoKGZpbGUpKTsKK30KKworLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIHJlbGF0aXZlX3BhdGggPSAidGVzdC54bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLgorLy8gT24gV2luZG93cywgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpDb25jYXRQYXRocyhjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiByZWxhdGl2ZV9wYXRoKSB7CisgIGlmIChkaXJlY3RvcnkuSXNFbXB0eSgpKQorICAgIHJldHVybiByZWxhdGl2ZV9wYXRoOworICBjb25zdCBGaWxlUGF0aCBkaXIoZGlyZWN0b3J5LlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKyAgcmV0dXJuIEZpbGVQYXRoKGRpci5zdHJpbmcoKSArIGtQYXRoU2VwYXJhdG9yICsgcmVsYXRpdmVfcGF0aC5zdHJpbmcoKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgc29tZXRoaW5nIGZpbmRhYmxlIGluIHRoZSBmaWxlLXN5c3RlbSwKKy8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIuCitib29sIEZpbGVQYXRoOjpGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRobmFtZV8uY19zdHIoKSk7CisgIGNvbnN0IERXT1JEIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlcyh1bmljb2RlKTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisgIHJldHVybiBhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXM7CisjZWxzZQorICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7CisgIHJldHVybiBwb3NpeDo6U3RhdChwYXRobmFtZV8uY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KKy8vIHRoYXQgZXhpc3RzLgorYm9vbCBGaWxlUGF0aDo6RGlyZWN0b3J5RXhpc3RzKCkgY29uc3QgeworICBib29sIHJlc3VsdCA9IGZhbHNlOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gRG9uJ3Qgc3RyaXAgb2ZmIHRyYWlsaW5nIHNlcGFyYXRvciBpZiBwYXRoIGlzIGEgcm9vdCBkaXJlY3Rvcnkgb24KKyAgLy8gV2luZG93cyAobGlrZSAiQzpcXCIpLgorICBjb25zdCBGaWxlUGF0aCYgcGF0aChJc1Jvb3REaXJlY3RvcnkoKSA/ICp0aGlzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisjZWxzZQorICBjb25zdCBGaWxlUGF0aCYgcGF0aCgqdGhpcyk7CisjZW5kaWYKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aC5jX3N0cigpKTsKKyAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOworICBkZWxldGUgW10gdW5pY29kZTsKKyAgaWYgKChhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMpICYmCisgICAgICAoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpIHsKKyAgICByZXN1bHQgPSB0cnVlOworICB9CisjZWxzZQorICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7CisgIHJlc3VsdCA9IHBvc2l4OjpTdGF0KHBhdGguY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMCAmJgorICAgICAgcG9zaXg6OklzRGlyKGZpbGVfc3RhdCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCisvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCitib29sIEZpbGVQYXRoOjpJc1Jvb3REaXJlY3RvcnkoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBhIG5ldHdvcmsgc2hhcmUgbGlrZQorICAvLyBcXHNlcnZlclxzaGFyZSBjYW4gYmUgYSByb290IGRpcmVjdG9yeSwgYWx0aG91Z2ggaXQgY2Fubm90IGJlIHRoZQorICAvLyBjdXJyZW50IGRpcmVjdG9yeS4gIEhhbmRsZSB0aGlzIHByb3Blcmx5LgorICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID09IDMgJiYgSXNBYnNvbHV0ZVBhdGgoKTsKKyNlbHNlCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMSAmJiBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbMF0pOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYW4gYWJzb2x1dGUgcGF0aC4KK2Jvb2wgRmlsZVBhdGg6OklzQWJzb2x1dGVQYXRoKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gcGF0aG5hbWVfLmNfc3RyKCk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID49IDMgJiYKKyAgICAgKChuYW1lWzBdID49ICdhJyAmJiBuYW1lWzBdIDw9ICd6JykgfHwKKyAgICAgIChuYW1lWzBdID49ICdBJyAmJiBuYW1lWzBdIDw9ICdaJykpICYmCisgICAgIG5hbWVbMV0gPT0gJzonICYmCisgICAgIElzUGF0aFNlcGFyYXRvcihuYW1lWzJdKTsKKyNlbHNlCisgIHJldHVybiBJc1BhdGhTZXBhcmF0b3IobmFtZVswXSk7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQorLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcgorLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24KKy8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAorLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4KKy8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKKy8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuCitGaWxlUGF0aCBGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgeworICBGaWxlUGF0aCBmdWxsX3BhdGhuYW1lOworICBpbnQgbnVtYmVyID0gMDsKKyAgZG8geworICAgIGZ1bGxfcGF0aG5hbWUuU2V0KE1ha2VGaWxlTmFtZShkaXJlY3RvcnksIGJhc2VfbmFtZSwgbnVtYmVyKyssIGV4dGVuc2lvbikpOworICB9IHdoaWxlIChmdWxsX3BhdGhuYW1lLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKKyAgcmV0dXJuIGZ1bGxfcGF0aG5hbWU7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciwgd2hpY2ggaW5kaWNhdGVzIHRoYXQKKy8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KK2Jvb2wgRmlsZVBhdGg6OklzRGlyZWN0b3J5KCkgY29uc3QgeworICByZXR1cm4gIXBhdGhuYW1lXy5lbXB0eSgpICYmCisgICAgICAgICBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbcGF0aG5hbWVfLmxlbmd0aCgpIC0gMV0pOworfQorCisvLyBDcmVhdGUgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKKy8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3JpZXMKKy8vIGZvciBhbnkgcmVhc29uLgorYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGNvbnN0IHsKKyAgaWYgKCF0aGlzLT5Jc0RpcmVjdG9yeSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAwIHx8IHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBGaWxlUGF0aCBwYXJlbnQodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuUmVtb3ZlRmlsZU5hbWUoKSk7CisgIHJldHVybiBwYXJlbnQuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpICYmIHRoaXMtPkNyZWF0ZUZvbGRlcigpOworfQorCisvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgorLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQorLy8gZGlyZWN0b3J5IGZvciBhbnkgcmVhc29uLCBpbmNsdWRpbmcgaWYgdGhlIHBhcmVudCBkaXJlY3RvcnkgZG9lcyBub3QKKy8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgorYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRm9sZGVyKCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIEZpbGVQYXRoIHJlbW92ZWRfc2VwKHRoaXMtPlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihyZW1vdmVkX3NlcC5jX3N0cigpKTsKKyAgaW50IHJlc3VsdCA9IENyZWF0ZURpcmVjdG9yeSh1bmljb2RlLCBOVUxMKSA/IDAgOiAtMTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgIGludCByZXN1bHQgPSBfbWtkaXIocGF0aG5hbWVfLmNfc3RyKCkpOworI2Vsc2UKKyAgaW50IHJlc3VsdCA9IG1rZGlyKHBhdGhuYW1lXy5jX3N0cigpLCAwNzc3KTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgcmV0dXJuIHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpOyAgLy8gQW4gZXJyb3IgaXMgT0sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgIH0KKyAgcmV0dXJuIHRydWU7ICAvLyBObyBlcnJvci4KK30KKworLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmUgaXQgYW5kIHJldHVybiB0aGUKKy8vIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gdGhlIG5hbWUgc3RyaW5nIHVubW9kaWZpZWQuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKKyAgcmV0dXJuIElzRGlyZWN0b3J5KCkKKyAgICAgID8gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigwLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSAxKSkKKyAgICAgIDogKnRoaXM7Cit9CisKKy8vIFJlbW92ZXMgYW55IHJlZHVuZGFudCBzZXBhcmF0b3JzIHRoYXQgbWlnaHQgYmUgaW4gdGhlIHBhdGhuYW1lLgorLy8gRm9yIGV4YW1wbGUsICJiYXIvLy9mb28iIGJlY29tZXMgImJhci9mb28iLiBEb2VzIG5vdCBlbGltaW5hdGUgb3RoZXIKKy8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgorLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGhhbmRsZSBXaW5kb3dzIG5ldHdvcmsgc2hhcmVzIChlLmcuIFxcc2VydmVyXHNoYXJlKS4KK3ZvaWQgRmlsZVBhdGg6Ok5vcm1hbGl6ZSgpIHsKKyAgaWYgKHBhdGhuYW1lXy5jX3N0cigpID09IE5VTEwpIHsKKyAgICBwYXRobmFtZV8gPSAiIjsKKyAgICByZXR1cm47CisgIH0KKyAgY29uc3QgY2hhciogc3JjID0gcGF0aG5hbWVfLmNfc3RyKCk7CisgIGNoYXIqIGNvbnN0IGRlc3QgPSBuZXcgY2hhcltwYXRobmFtZV8ubGVuZ3RoKCkgKyAxXTsKKyAgY2hhciogZGVzdF9wdHIgPSBkZXN0OworICBtZW1zZXQoZGVzdF9wdHIsIDAsIHBhdGhuYW1lXy5sZW5ndGgoKSArIDEpOworCisgIHdoaWxlICgqc3JjICE9ICdcMCcpIHsKKyAgICAqZGVzdF9wdHIgPSAqc3JjOworICAgIGlmICghSXNQYXRoU2VwYXJhdG9yKCpzcmMpKSB7CisgICAgICBzcmMrKzsKKyAgICB9IGVsc2UgeworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgICAgICBpZiAoKmRlc3RfcHRyID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKSB7CisgICAgICAgICpkZXN0X3B0ciA9IGtQYXRoU2VwYXJhdG9yOworICAgICAgfQorI2VuZGlmCisgICAgICB3aGlsZSAoSXNQYXRoU2VwYXJhdG9yKCpzcmMpKQorICAgICAgICBzcmMrKzsKKyAgICB9CisgICAgZGVzdF9wdHIrKzsKKyAgfQorICAqZGVzdF9wdHIgPSAnXDAnOworICBwYXRobmFtZV8gPSBkZXN0OworICBkZWxldGVbXSBkZXN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGYzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaApAQCAtMCwwICsxLDEyMTggQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgdXNlZCBieSB0aGUgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHB1cmVseSBHb29nbGUgVGVzdCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiAgUGxlYXNlCisvLyBETyBOT1QgI0lOQ0xVREUgSVQgSU4gQSBVU0VSIFBST0dSQU0uCisKKyNpZm5kZWYgR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXworI2RlZmluZSBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisKKy8vIEdURVNUX0lNUExFTUVOVEFUSU9OXyBpcyBkZWZpbmVkIHRvIDEgaWZmIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQgaXMKKy8vIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbjsgb3RoZXJ3aXNlIGl0J3MgdW5kZWZpbmVkLgorI2lmICFHVEVTVF9JTVBMRU1FTlRBVElPTl8KKy8vIEEgdXNlciBpcyB0cnlpbmcgdG8gaW5jbHVkZSB0aGlzIGZyb20gaGlzIGNvZGUgLSBqdXN0IHNheSBuby4KKyMgZXJyb3IgImd0ZXN0LWludGVybmFsLWlubC5oIGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbi4iCisjIGVycm9yICJJdCBtdXN0IG5vdCBiZSBpbmNsdWRlZCBleGNlcHQgYnkgR29vZ2xlIFRlc3QgaXRzZWxmLiIKKyNlbmRpZiAgLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZm5kZWYgX1dJTjMyX1dDRQorIyBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmICAvLyAhX1dJTjMyX1dDRQorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIHN0cnRvbGwvX3N0cnRvdWw2NC9tYWxsb2MvZnJlZS4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIEZvciBtZW1tb3ZlLgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIgIC8vIE5PTElOVAorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlY2xhcmVzIHRoZSBmbGFncy4KKy8vCisvLyBXZSBkb24ndCB3YW50IHRoZSB1c2VycyB0byBtb2RpZnkgdGhpcyBmbGFnIGluIHRoZSBjb2RlLCBidXQgd2FudAorLy8gR29vZ2xlIFRlc3QncyBvd24gdW5pdCB0ZXN0cyB0byBiZSBhYmxlIHRvIGFjY2VzcyBpdC4gVGhlcmVmb3JlIHdlCisvLyBkZWNsYXJlIGl0IGhlcmUgYXMgb3Bwb3NlZCB0byBpbiBndGVzdC5oLgorR1RFU1RfREVDTEFSRV9ib29sXyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdAorLy8gbGlicmFyeS4gIFRoaXMgaXMgc29sZWx5IGZvciB0ZXN0aW5nIEdldFRlc3RUeXBlSWQoKS4KK0dURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdDsKKworLy8gTmFtZXMgb2YgdGhlIGZsYWdzIChuZWVkZWQgZm9yIHBhcnNpbmcgR29vZ2xlIFRlc3QgZmxhZ3MpLgorY29uc3QgY2hhciBrQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnW10gPSAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMiOworY29uc3QgY2hhciBrQnJlYWtPbkZhaWx1cmVGbGFnW10gPSAiYnJlYWtfb25fZmFpbHVyZSI7Citjb25zdCBjaGFyIGtDYXRjaEV4Y2VwdGlvbnNGbGFnW10gPSAiY2F0Y2hfZXhjZXB0aW9ucyI7Citjb25zdCBjaGFyIGtDb2xvckZsYWdbXSA9ICJjb2xvciI7Citjb25zdCBjaGFyIGtGaWx0ZXJGbGFnW10gPSAiZmlsdGVyIjsKK2NvbnN0IGNoYXIga0xpc3RUZXN0c0ZsYWdbXSA9ICJsaXN0X3Rlc3RzIjsKK2NvbnN0IGNoYXIga091dHB1dEZsYWdbXSA9ICJvdXRwdXQiOworY29uc3QgY2hhciBrUHJpbnRUaW1lRmxhZ1tdID0gInByaW50X3RpbWUiOworY29uc3QgY2hhciBrUmFuZG9tU2VlZEZsYWdbXSA9ICJyYW5kb21fc2VlZCI7Citjb25zdCBjaGFyIGtSZXBlYXRGbGFnW10gPSAicmVwZWF0IjsKK2NvbnN0IGNoYXIga1NodWZmbGVGbGFnW10gPSAic2h1ZmZsZSI7Citjb25zdCBjaGFyIGtTdGFja1RyYWNlRGVwdGhGbGFnW10gPSAic3RhY2tfdHJhY2VfZGVwdGgiOworY29uc3QgY2hhciBrU3RyZWFtUmVzdWx0VG9GbGFnW10gPSAic3RyZWFtX3Jlc3VsdF90byI7Citjb25zdCBjaGFyIGtUaHJvd09uRmFpbHVyZUZsYWdbXSA9ICJ0aHJvd19vbl9mYWlsdXJlIjsKKworLy8gQSB2YWxpZCByYW5kb20gc2VlZCBtdXN0IGJlIGluIFsxLCBrTWF4UmFuZG9tU2VlZF0uCitjb25zdCBpbnQga01heFJhbmRvbVNlZWQgPSA5OTk5OTsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitHVEVTVF9BUElfIGV4dGVybiBib29sIGdfaGVscF9mbGFnOworCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorR1RFU1RfQVBJXyBUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRVc2VDb2xvcihib29sIHN0ZG91dF9pc190dHkpOworCisvLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoVGltZUluTWlsbGlzIG1zKTsKKworLy8gQ29udmVydHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIElTTyA4NjAxCisvLyBmb3JtYXQsIHdpdGhvdXQgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLiAgTi5CLjogZHVlIHRvIHRoZSB1c2UgdGhlCisvLyBub24tcmVlbnRyYW50IGxvY2FsdGltZSgpIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4gIERvCisvLyBub3QgdXNlIGl0IGluIGFueSBjb2RlIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKFRpbWVJbk1pbGxpcyBtcyk7CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYW4gSW50MzIgZmxhZywgaW4gdGhlIGZvcm0gb2YgIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK0dURVNUX0FQSV8gYm9vbCBQYXJzZUludDMyRmxhZygKKyAgICBjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIEludDMyKiB2YWx1ZSk7CisKKy8vIFJldHVybnMgYSByYW5kb20gc2VlZCBpbiByYW5nZSBbMSwga01heFJhbmRvbVNlZWRdIGJhc2VkIG9uIHRoZQorLy8gZ2l2ZW4gLS1ndGVzdF9yYW5kb21fc2VlZCBmbGFnIHZhbHVlLgoraW5saW5lIGludCBHZXRSYW5kb21TZWVkRnJvbUZsYWcoSW50MzIgcmFuZG9tX3NlZWRfZmxhZykgeworICBjb25zdCB1bnNpZ25lZCBpbnQgcmF3X3NlZWQgPSAocmFuZG9tX3NlZWRfZmxhZyA9PSAwKSA/CisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KEdldFRpbWVJbk1pbGxpcygpKSA6CisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHJhbmRvbV9zZWVkX2ZsYWcpOworCisgIC8vIE5vcm1hbGl6ZXMgdGhlIGFjdHVhbCBzZWVkIHRvIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gc3VjaCB0aGF0CisgIC8vIGl0J3MgZWFzeSB0byB0eXBlLgorICBjb25zdCBpbnQgbm9ybWFsaXplZF9zZWVkID0KKyAgICAgIHN0YXRpY19jYXN0PGludD4oKHJhd19zZWVkIC0gMVUpICUKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihrTWF4UmFuZG9tU2VlZCkpICsgMTsKKyAgcmV0dXJuIG5vcm1hbGl6ZWRfc2VlZDsKK30KKworLy8gUmV0dXJucyB0aGUgZmlyc3QgdmFsaWQgcmFuZG9tIHNlZWQgYWZ0ZXIgJ3NlZWQnLiAgVGhlIGJlaGF2aW9yIGlzCisvLyB1bmRlZmluZWQgaWYgJ3NlZWQnIGlzIGludmFsaWQuICBUaGUgc2VlZCBhZnRlciBrTWF4UmFuZG9tU2VlZCBpcworLy8gY29uc2lkZXJlZCB0byBiZSAxLgoraW5saW5lIGludCBHZXROZXh0UmFuZG9tU2VlZChpbnQgc2VlZCkgeworICBHVEVTVF9DSEVDS18oMSA8PSBzZWVkICYmIHNlZWQgPD0ga01heFJhbmRvbVNlZWQpCisgICAgICA8PCAiSW52YWxpZCByYW5kb20gc2VlZCAiIDw8IHNlZWQgPDwgIiAtIG11c3QgYmUgaW4gWzEsICIKKyAgICAgIDw8IGtNYXhSYW5kb21TZWVkIDw8ICJdLiI7CisgIGNvbnN0IGludCBuZXh0X3NlZWQgPSBzZWVkICsgMTsKKyAgcmV0dXJuIChuZXh0X3NlZWQgPiBrTWF4UmFuZG9tU2VlZCkgPyAxIDogbmV4dF9zZWVkOworfQorCisvLyBUaGlzIGNsYXNzIHNhdmVzIHRoZSB2YWx1ZXMgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzIGluIGl0cyBjJ3RvciwgYW5kCisvLyByZXN0b3JlcyB0aGVtIGluIGl0cyBkJ3Rvci4KK2NsYXNzIEdUZXN0RmxhZ1NhdmVyIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjJ3Rvci4KKyAgR1Rlc3RGbGFnU2F2ZXIoKSB7CisgICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfID0gR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyk7CisgICAgYnJlYWtfb25fZmFpbHVyZV8gPSBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpOworICAgIGNhdGNoX2V4Y2VwdGlvbnNfID0gR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKTsKKyAgICBjb2xvcl8gPSBHVEVTVF9GTEFHKGNvbG9yKTsKKyAgICBkZWF0aF90ZXN0X3N0eWxlXyA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSk7CisgICAgZGVhdGhfdGVzdF91c2VfZm9ya18gPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworICAgIGZpbHRlcl8gPSBHVEVTVF9GTEFHKGZpbHRlcik7CisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfID0gR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCk7CisgICAgbGlzdF90ZXN0c18gPSBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpOworICAgIG91dHB1dF8gPSBHVEVTVF9GTEFHKG91dHB1dCk7CisgICAgcHJpbnRfdGltZV8gPSBHVEVTVF9GTEFHKHByaW50X3RpbWUpOworICAgIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpOworICAgIHJlcGVhdF8gPSBHVEVTVF9GTEFHKHJlcGVhdCk7CisgICAgc2h1ZmZsZV8gPSBHVEVTVF9GTEFHKHNodWZmbGUpOworICAgIHN0YWNrX3RyYWNlX2RlcHRoXyA9IEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOworICAgIHN0cmVhbV9yZXN1bHRfdG9fID0gR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKKyAgICB0aHJvd19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7CisgIH0KKworICAvLyBUaGUgZCd0b3IgaXMgbm90IHZpcnR1YWwuICBETyBOT1QgSU5IRVJJVCBGUk9NIFRISVMgQ0xBU1MuCisgIH5HVGVzdEZsYWdTYXZlcigpIHsKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKKyAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gYnJlYWtfb25fZmFpbHVyZV87CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGNhdGNoX2V4Y2VwdGlvbnNfOworICAgIEdURVNUX0ZMQUcoY29sb3IpID0gY29sb3JfOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSBkZWF0aF90ZXN0X3N0eWxlXzsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gZGVhdGhfdGVzdF91c2VfZm9ya187CisgICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gZmlsdGVyXzsKKyAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9IGludGVybmFsX3J1bl9kZWF0aF90ZXN0XzsKKyAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gbGlzdF90ZXN0c187CisgICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gb3V0cHV0XzsKKyAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gcHJpbnRfdGltZV87CisgICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSByYW5kb21fc2VlZF87CisgICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0XzsKKyAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gc2h1ZmZsZV87CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBzdGFja190cmFjZV9kZXB0aF87CisgICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSA9IHN0cmVhbV9yZXN1bHRfdG9fOworICAgIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSB0aHJvd19vbl9mYWlsdXJlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gRmllbGRzIGZvciBzYXZpbmcgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiBmbGFncy4KKyAgYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187CisgIGJvb2wgYnJlYWtfb25fZmFpbHVyZV87CisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187CisgIHN0ZDo6c3RyaW5nIGNvbG9yXzsKKyAgc3RkOjpzdHJpbmcgZGVhdGhfdGVzdF9zdHlsZV87CisgIGJvb2wgZGVhdGhfdGVzdF91c2VfZm9ya187CisgIHN0ZDo6c3RyaW5nIGZpbHRlcl87CisgIHN0ZDo6c3RyaW5nIGludGVybmFsX3J1bl9kZWF0aF90ZXN0XzsKKyAgYm9vbCBsaXN0X3Rlc3RzXzsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0XzsKKyAgYm9vbCBwcmludF90aW1lXzsKKyAgaW50ZXJuYWw6OkludDMyIHJhbmRvbV9zZWVkXzsKKyAgaW50ZXJuYWw6OkludDMyIHJlcGVhdF87CisgIGJvb2wgc2h1ZmZsZV87CisgIGludGVybmFsOjpJbnQzMiBzdGFja190cmFjZV9kZXB0aF87CisgIHN0ZDo6c3RyaW5nIHN0cmVhbV9yZXN1bHRfdG9fOworICBib29sIHRocm93X29uX2ZhaWx1cmVfOworfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIGNvbnZlcnRlZAorLy8gdG8gIihJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCkiLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQpOworCisvLyBDb252ZXJ0cyBhIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIFRoZSB3aWRlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKKy8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpCisvLyAgIFVURi0zMiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gNCAob24gTGludXgpCisvLyBQYXJhbWV0ZXIgc3RyIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4KKy8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyCisvLyBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLiAtMSBpcyB1c2VkIHdoZW4gdGhlIGVudGlyZSBzdHJpbmcKKy8vIHNob3VsZCBiZSBwcm9jZXNzZWQuCisvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzCisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSB0aGV5IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuIElmIHRoZSBzdHJpbmcgaXMgaW4gVVRGMTYgZW5jb2RpbmcKKy8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycworLy8gd2lsbCBiZSBlbmNvZGVkIGFzIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gQmFzaWMgTm9ybWFsIFBsYW5lLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycyk7CisKKy8vIFJlYWRzIHRoZSBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kIGNyZWF0ZXMgdGhlIGZpbGUKKy8vIGlmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LiBJZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbiwgdGhpcworLy8gZnVuY3Rpb24gd2lsbCB3cml0ZSBvdmVyIGl0LiBJZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudCwgYnV0IHRoZSBmaWxlIGNhbm5vdAorLy8gYmUgY3JlYXRlZCwgcHJpbnRzIGFuIGVycm9yIGFuZCBleGl0cy4KK3ZvaWQgV3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoZS5nLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRTaGFyZChjb25zdCBjaGFyKiB0b3RhbF9zaGFyZHNfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOworCisvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHZhciBhcyBhbiBJbnQzMi4gSWYgaXQgaXMgdW5zZXQsCisvLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvciBhbmQKKy8vIGFuZCBhYm9ydHMuCitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUVudk9yRGllKGNvbnN0IGNoYXIqIGVudl92YXIsIEludDMyIGRlZmF1bHRfdmFsKTsKKworLy8gR2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMsIHRoZSBzaGFyZCBpbmRleCwgYW5kIHRoZSB0ZXN0IGlkLAorLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBzaG91bGQgYmUgcnVuIG9uIHRoaXMgc2hhcmQuIFRoZSB0ZXN0IGlkIGlzCisvLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdAorLy8gbWV0aG9kLiBBc3N1bWVzIHRoYXQgMCA8PSBzaGFyZF9pbmRleCA8IHRvdGFsX3NoYXJkcy4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZCgKKyAgICBpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKTsKKworLy8gU1RMIGNvbnRhaW5lciB1dGlsaXRpZXMuCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyIHRoYXQgc2F0aXNmeQorLy8gdGhlIGdpdmVuIHByZWRpY2F0ZS4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIFByZWRpY2F0ZT4KK2lubGluZSBpbnQgQ291bnRJZihjb25zdCBDb250YWluZXImIGMsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKKyAgLy8gSW1wbGVtZW50ZWQgYXMgYW4gZXhwbGljaXQgbG9vcCBzaW5jZSBzdGQ6OmNvdW50X2lmKCkgaW4gbGliQ3N0ZCBvbgorICAvLyBTb2xhcmlzIGhhcyBhIG5vbi1zdGFuZGFyZCBzaWduYXR1cmUuCisgIGludCBjb3VudCA9IDA7CisgIGZvciAodHlwZW5hbWUgQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IGMuYmVnaW4oKTsgaXQgIT0gYy5lbmQoKTsgKytpdCkgeworICAgIGlmIChwcmVkaWNhdGUoKml0KSkKKyAgICAgICsrY291bnQ7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCisvLyBBcHBsaWVzIGEgZnVuY3Rpb24vZnVuY3RvciB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIEZ1bmN0b3I+Cit2b2lkIEZvckVhY2goY29uc3QgQ29udGFpbmVyJiBjLCBGdW5jdG9yIGZ1bmN0b3IpIHsKKyAgc3RkOjpmb3JfZWFjaChjLmJlZ2luKCksIGMuZW5kKCksIGZ1bmN0b3IpOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIGVsZW1lbnQgb2YgdGhlIHZlY3Rvciwgb3IgZGVmYXVsdF92YWx1ZSBpZiBpIGlzIG5vdAorLy8gaW4gcmFuZ2UgWzAsIHYuc2l6ZSgpKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPgoraW5saW5lIEUgR2V0RWxlbWVudE9yKGNvbnN0IHN0ZDo6dmVjdG9yPEU+JiB2LCBpbnQgaSwgRSBkZWZhdWx0X3ZhbHVlKSB7CisgIHJldHVybiAoaSA8IDAgfHwgaSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHYuc2l6ZSgpKSkgPyBkZWZhdWx0X3ZhbHVlIDogdltpXTsKK30KKworLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiBhIHJhbmdlIG9mIHRoZSB2ZWN0b3IncyBlbGVtZW50cy4KKy8vICdiZWdpbicgYW5kICdlbmQnIGFyZSBlbGVtZW50IGluZGljZXMgYXMgYW4gU1RMLXN0eWxlIHJhbmdlOworLy8gaS5lLiBbYmVnaW4sIGVuZCkgYXJlIHNodWZmbGVkLCB3aGVyZSAnZW5kJyA9PSBzaXplKCkgbWVhbnMgdG8KKy8vIHNodWZmbGUgdG8gdGhlIGVuZCBvZiB0aGUgdmVjdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+Cit2b2lkIFNodWZmbGVSYW5nZShpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20sIGludCBiZWdpbiwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEU+KiB2KSB7CisgIGNvbnN0IGludCBzaXplID0gc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpOworICBHVEVTVF9DSEVDS18oMCA8PSBiZWdpbiAmJiBiZWdpbiA8PSBzaXplKQorICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBzdGFydCAiIDw8IGJlZ2luIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWzAsICIKKyAgICAgIDw8IHNpemUgPDwgIl0uIjsKKyAgR1RFU1RfQ0hFQ0tfKGJlZ2luIDw9IGVuZCAmJiBlbmQgPD0gc2l6ZSkKKyAgICAgIDw8ICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoICIgPDwgZW5kIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWyIKKyAgICAgIDw8IGJlZ2luIDw8ICIsICIgPDwgc2l6ZSA8PCAiXS4iOworCisgIC8vIEZpc2hlci1ZYXRlcyBzaHVmZmxlLCBmcm9tCisgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUKKyAgZm9yIChpbnQgcmFuZ2Vfd2lkdGggPSBlbmQgLSBiZWdpbjsgcmFuZ2Vfd2lkdGggPj0gMjsgcmFuZ2Vfd2lkdGgtLSkgeworICAgIGNvbnN0IGludCBsYXN0X2luX3JhbmdlID0gYmVnaW4gKyByYW5nZV93aWR0aCAtIDE7CisgICAgY29uc3QgaW50IHNlbGVjdGVkID0gYmVnaW4gKyByYW5kb20tPkdlbmVyYXRlKHJhbmdlX3dpZHRoKTsKKyAgICBzdGQ6OnN3YXAoKCp2KVtzZWxlY3RlZF0sICgqdilbbGFzdF9pbl9yYW5nZV0pOworICB9Cit9CisKKy8vIFBlcmZvcm1zIGFuIGluLXBsYWNlIHNodWZmbGUgb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+CitpbmxpbmUgdm9pZCBTaHVmZmxlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSwgMCwgc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpLCB2KTsKK30KKworLy8gQSBmdW5jdGlvbiBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LiAgSGFuZHkgZm9yIGJlaW5nIHVzZWQgYXMgYQorLy8gZnVuY3Rvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgRGVsZXRlKFQqIHgpIHsKKyAgZGVsZXRlIHg7Cit9CisKKy8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBrZXkgb2YgYSBUZXN0UHJvcGVydHkgYWdhaW5zdCBhIGtub3duIGtleS4KKy8vCisvLyBUZXN0UHJvcGVydHlLZXlJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3RQcm9wZXJ0eUtleUlzIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICAvLworICAvLyBUZXN0UHJvcGVydHlLZXlJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdFByb3BlcnR5S2V5SXMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgOiBrZXlfKGtleSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdCBwcm9wZXJ0eSBtYXRjaGVzIG9uIGtleV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9wcm9wZXJ0eS5rZXkoKSA9PSBrZXlfOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBrZXlfOworfTsKKworLy8gQ2xhc3MgVW5pdFRlc3RPcHRpb25zLgorLy8KKy8vIFRoaXMgY2xhc3MgY29udGFpbnMgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIG9wdGlvbnMgdGhlIHVzZXIKKy8vIHNwZWNpZmllcyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLiAgSXQgaGFzIG9ubHkgc3RhdGljIG1lbWJlcnMuCisvLworLy8gSW4gbW9zdCBjYXNlcywgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYW4gb3B0aW9uIHVzaW5nIGVpdGhlciBhbgorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYSBjb21tYW5kIGxpbmUgZmxhZy4gIEUuZy4geW91IGNhbiBzZXQgdGhlCisvLyB0ZXN0IGZpbHRlciB1c2luZyBlaXRoZXIgR1RFU1RfRklMVEVSIG9yIC0tZ3Rlc3RfZmlsdGVyLiAgSWYgYm90aAorLy8gdGhlIHZhcmlhYmxlIGFuZCB0aGUgZmxhZyBhcmUgcHJlc2VudCwgdGhlIGxhdHRlciBvdmVycmlkZXMgdGhlCisvLyBmb3JtZXIuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0T3B0aW9ucyB7CisgcHVibGljOgorICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLgorCisgIC8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRPdXRwdXRGb3JtYXQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZQorICAvLyBkZWZhdWx0ICh0ZXN0X2RldGFpbC54bWwgaW4gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5KSBpZgorICAvLyBub25lIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworCisgIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3RfZmlsdGVyIGZsYWcuCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKyAgLy8gZmlyc3QgJzonIG9yICdcMCcgY2hhcmFjdGVyIGluIHBhdHRlcm4gbWFya3MgdGhlIGVuZCBvZiBpdC4KKyAgLy8KKyAgLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisgIC8vIHdvcmtzIHdlbGwgZW5vdWdoIGZvciBtYXRjaGluZyB0ZXN0IG5hbWVzLCB3aGljaCBhcmUgc2hvcnQuCisgIHN0YXRpYyBib29sIFBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnN0cik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQorICAvLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorICBzdGF0aWMgYm9vbCBGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X25hbWUpOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBGdW5jdGlvbiBmb3Igc3VwcG9ydGluZyB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uIGZsYWcuCisKKyAgLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlCisgIC8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgorICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCisgIHN0YXRpYyBpbnQgR1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiAibmFtZSIgbWF0Y2hlcyB0aGUgJzonIHNlcGFyYXRlZCBsaXN0IG9mIGdsb2Itc3R5bGUKKyAgLy8gZmlsdGVycyBpbiAiZmlsdGVyIi4KKyAgc3RhdGljIGJvb2wgTWF0Y2hlc0ZpbHRlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogZmlsdGVyKTsKK307CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24ncyBuYW1lLCByZW1vdmluZyBkaXJlY3RvcnkgcGF0aCBpZiB0aGF0CisvLyBpcyBwcmVzZW50LiAgVXNlZCBieSBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZpbGUuCitHVEVTVF9BUElfIEZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpOworCisvLyBUaGUgcm9sZSBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIE9TIHN0YWNrIHRyYWNlIGFzIGEgc3RyaW5nLgorY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisgIHZpcnR1YWwgfk9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4gIFBhcmFtZXRlcnM6CisgIC8vCisgIC8vICAgbWF4X2RlcHRoICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQKKyAgLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLgorICAvLyAgIHNraXBfY291bnQgLSB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZDsgZG9lc24ndCBjb3VudAorICAvLyAgICAgICAgICAgICAgICBhZ2FpbnN0IG1heF9kZXB0aC4KKyAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpID0gMDsKKworICAvLyBVcG9uTGVhdmluZ0dUZXN0KCkgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgR29vZ2xlIFRlc3QgY2FsbHMKKyAgLy8gdXNlciBjb2RlLiBJdCBzYXZlcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YWNrIHRoYXQKKyAgLy8gQ3VycmVudFN0YWNrVHJhY2UoKSB3aWxsIHVzZSB0byBmaW5kIGFuZCBoaWRlIEdvb2dsZSBUZXN0IHN0YWNrIGZyYW1lcy4KKyAgdmlydHVhbCB2b2lkIFVwb25MZWF2aW5nR1Rlc3QoKSA9IDA7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSk7Cit9OworCisvLyBBIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSBpbnRlcmZhY2UuCitjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIgOiBwdWJsaWMgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlcigpIDogY2FsbGVyX2ZyYW1lXyhOVUxMKSB7fQorCisgIHZpcnR1YWwgc3RyaW5nIEN1cnJlbnRTdGFja1RyYWNlKGludCBtYXhfZGVwdGgsIGludCBza2lwX2NvdW50KQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gVGhpcyBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2Ygc3RhY2sgZnJhbWVzIHRoYXQgYXJlIHBhcnQgb2YKKyAgLy8gR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbi4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFbGlkZWRGcmFtZXNNYXJrZXI7CisKKyBwcml2YXRlOgorICBNdXRleCBtdXRleF87ICAvLyBwcm90ZWN0cyBhbGwgaW50ZXJuYWwgc3RhdGUKKworICAvLyBXZSBzYXZlIHRoZSBzdGFjayBmcmFtZSBiZWxvdyB0aGUgZnJhbWUgdGhhdCBjYWxscyB1c2VyIGNvZGUuCisgIC8vIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUgaW1tZWRpYXRlbHkgYmVsb3cKKyAgLy8gdGhlIHVzZXIgY29kZSBjaGFuZ2VzIGJldHdlZW4gdGhlIGNhbGwgdG8gVXBvbkxlYXZpbmdHVGVzdCgpCisgIC8vIGFuZCBhbnkgY2FsbHMgdG8gQ3VycmVudFN0YWNrVHJhY2UoKSBmcm9tIHdpdGhpbiB0aGUgdXNlciBjb2RlLgorICB2b2lkKiBjYWxsZXJfZnJhbWVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVyKTsKK307CisKKy8vIEluZm9ybWF0aW9uIGFib3V0IGEgR29vZ2xlIFRlc3QgdHJhY2UgcG9pbnQuCitzdHJ1Y3QgVHJhY2VJbmZvIHsKKyAgY29uc3QgY2hhciogZmlsZTsKKyAgaW50IGxpbmU7CisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7Cit9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4gVW5pdFRlc3RJbXBsLgorLy8gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KK2NsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpOworICAvLyBJbXBsZW1lbnRzIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlLiBSZXBvcnRzIHRoZSB0ZXN0IHBhcnQKKyAgLy8gcmVzdWx0IGluIHRoZSBjdXJyZW50IHRlc3QuCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKworIHByaXZhdGU6CisgIFVuaXRUZXN0SW1wbCogY29uc3QgdW5pdF90ZXN0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKK307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGVyIHRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4KKy8vIFVuaXRUZXN0SW1wbC4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KK2NsYXNzIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7CisgIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBqdXN0CisgIC8vIGRlbGVnYXRlcyB0byB0aGUgY3VycmVudCBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBvZiAqdW5pdF90ZXN0Xy4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworLy8gVGhlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzLiAgV2UgZG9uJ3QgcHJvdGVjdAorLy8gdGhlIG1ldGhvZHMgdW5kZXIgYSBtdXRleCwgYXMgdGhpcyBjbGFzcyBpcyBub3QgYWNjZXNzaWJsZSBieSBhCisvLyB1c2VyIGFuZCB0aGUgVW5pdFRlc3QgY2xhc3MgdGhhdCBkZWxlZ2F0ZXMgd29yayB0byB0aGlzIGNsYXNzIGRvZXMKKy8vIHByb3BlciBsb2NraW5nLgorY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdEltcGwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5pdFRlc3RJbXBsKFVuaXRUZXN0KiBwYXJlbnQpOworICB2aXJ0dWFsIH5Vbml0VGVzdEltcGwoKTsKKworICAvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIHJlZ2lzdGVyIHlvdXIgb3duIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIuCisgIC8vIFlvdSBjYW4gcmVnaXN0ZXIgeW91ciBvd24gcmVwb3RlciB0byBsaXN0ZW4gZWl0aGVyIG9ubHkgZm9yIHRlc3QgcmVzdWx0cworICAvLyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZCBvciBmb3IgcmVzdWx0cyBmcm9tIGFsbCB0aHJlYWRzLgorICAvLyBCeSBkZWZhdWx0LCBlYWNoIHBlci10aHJlYWQgdGVzdCByZXN1bHQgcmVwb3RlciBqdXN0IHBhc3NlcyBhIG5ldworICAvLyBUZXN0UGFydFJlc3VsdCB0byB0aGUgZ2xvYmFsIHRlc3QgcmVzdWx0IHJlcG9ydGVyLCB3aGljaCByZWdpc3RlcnMgdGhlCisgIC8vIHRlc3QgcGFydCByZXN1bHQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LgorCisgIC8vIFJldHVybnMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7CisKKyAgLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIHZvaWQgU2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKTsKKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7CisKKyAgLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICB2b2lkIFNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KKyAgaW50IGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCisgIGludCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisgIC8vIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCisgIGludCByZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCisgIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCisgIGludCByZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgorICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgIC8vIFVOSVggZXBvY2guCisgIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBzdGFydF90aW1lc3RhbXBfOyB9CisKKyAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisgIC8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgorICBib29sIEZhaWxlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpID4gMCB8fCBhZF9ob2NfdGVzdF9yZXN1bHQoKS0+RmFpbGVkKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7CisgICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baV07CisgIH0KKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgeworICAgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2Nhc2VfaW5kaWNlc18sIGksIC0xKTsKKyAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2luZGV4XTsKKyAgfQorCisgIC8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXIgbGlzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMoKSB7IHJldHVybiAmbGlzdGVuZXJzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKKyAgLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIFRlc3RSZXN1bHQqIGN1cnJlbnRfdGVzdF9yZXN1bHQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QuCisgIGNvbnN0IFRlc3RSZXN1bHQqIGFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICZhZF9ob2NfdGVzdF9yZXN1bHRfOyB9CisKKyAgLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgorICAvLworICAvLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGlucHV0IGFuZCB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIKKyAgLy8gYXJlIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZQorICAvLyBpbnB1dCB0aGUgY3VycmVudCBnZXR0ZXIuCisgIHZvaWQgc2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcihPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcik7CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgaWYgaXQgaXMgbm90IE5VTEw7CisgIC8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50CisgIC8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KKyAgLy8KKyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKyAgLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKyAgLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisgIC8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisgIC8vCisgIC8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworICAvLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorICAvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KKyAgc3RkOjpzdHJpbmcgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChpbnQgc2tpcF9jb3VudCkgR1RFU1RfTk9fSU5MSU5FXzsKKworICAvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAorICAvLyBleGlzdCwgY3JlYXRlcyBvbmUgYW5kIHJldHVybnMgaXQuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICB0ZXN0X2Nhc2VfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgIC8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKyAgLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICAvLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZSogR2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKKworICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhlIHVuaXQgdGVzdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVzdF9pbmZvOiAgICB0aGUgVGVzdEluZm8gb2JqZWN0CisgIHZvaWQgQWRkVGVzdEluZm8oVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0cywgd2UgbmVlZCB0bworICAgIC8vIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSB0ZXN0IHByb2dyYW0KKyAgICAvLyB3YXMgZmlyc3QgaW52b2tlZC4gIFdlIGNhbm5vdCBkbyB0aGlzIGluIFJVTl9BTExfVEVTVFMoKSwgYXMKKyAgICAvLyB0aGUgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgY2FsbGluZworICAgIC8vIFJVTl9BTExfVEVTVFMoKS4gIFRoZXJlZm9yZSB3ZSBjYXB0dXJlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbgorICAgIC8vIEFkZFRlc3RJbmZvKCksIHdoaWNoIGlzIGNhbGxlZCB0byByZWdpc3RlciBhIFRFU1Qgb3IgVEVTVF9GCisgICAgLy8gYmVmb3JlIG1haW4oKSBpcyByZWFjaGVkLgorICAgIGlmIChvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKSB7CisgICAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8uU2V0KEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkpOworICAgICAgR1RFU1RfQ0hFQ0tfKCFvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKQorICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiI7CisgICAgfQorCisgICAgR2V0VGVzdENhc2UodGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpLAorICAgICAgICAgICAgICAgIHRlc3RfaW5mby0+dHlwZV9wYXJhbSgpLAorICAgICAgICAgICAgICAgIHNldF91cF90YywKKyAgICAgICAgICAgICAgICB0ZWFyX2Rvd25fdGMpLT5BZGRUZXN0SW5mbyh0ZXN0X2luZm8pOworICB9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkgeworICAgIHJldHVybiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgLy8gU2V0cyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9jYXNlKFRlc3RDYXNlKiBhX2N1cnJlbnRfdGVzdF9jYXNlKSB7CisgICAgY3VycmVudF90ZXN0X2Nhc2VfID0gYV9jdXJyZW50X3Rlc3RfY2FzZTsKKyAgfQorCisgIC8vIFNldHMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLiAgSWYKKyAgLy8gY3VycmVudF90ZXN0X2luZm8gaXMgTlVMTCwgdGhlIGFzc2VydGlvbiByZXN1bHRzIHdpbGwgYmUgc3RvcmVkIGluCisgIC8vIGFkX2hvY190ZXN0X3Jlc3VsdF8uCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9pbmZvKFRlc3RJbmZvKiBhX2N1cnJlbnRfdGVzdF9pbmZvKSB7CisgICAgY3VycmVudF90ZXN0X2luZm9fID0gYV9jdXJyZW50X3Rlc3RfaW5mbzsKKyAgfQorCisgIC8vIFJlZ2lzdGVycyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyBkZWZpbmVkIHVzaW5nIFRFU1RfUCBhbmQKKyAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AsIGNyZWF0aW5nIHJlZ3VsYXIgdGVzdHMgZm9yIGVhY2ggdGVzdC9wYXJhbWV0ZXIKKyAgLy8gY29tYmluYXRpb24uIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2U7IGl0IGhhcyBndWFyZHMKKyAgLy8gcHJvdGVjdGluZyBmcm9tIHJlZ2lzdGVyaW5nIHRoZSB0ZXN0cyBtb3JlIHRoZW4gb25jZS4gIElmCisgIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGRpc2FibGVkLCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cyBpcworICAvLyBwcmVzZW50IGJ1dCBkb2VzIG5vdGhpbmcuCisgIHZvaWQgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKKworICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAorICAvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcworICAvLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhpcyB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQKKyAgLy8gdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLgorICBib29sIFJ1bkFsbFRlc3RzKCk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cywgZXhjZXB0IHRoZSBhZCBob2MgdGVzdHMuCisgIHZvaWQgQ2xlYXJOb25BZEhvY1Rlc3RSZXN1bHQoKSB7CisgICAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgVGVzdENhc2U6OkNsZWFyVGVzdENhc2VSZXN1bHQpOworICB9CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFkLWhvYyB0ZXN0IGFzc2VydGlvbnMuCisgIHZvaWQgQ2xlYXJBZEhvY1Rlc3RSZXN1bHQoKSB7CisgICAgYWRfaG9jX3Rlc3RfcmVzdWx0Xy5DbGVhcigpOworICB9CisKKyAgLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgaW4gYQorICAvLyBjb250ZXh0IG9mIGEgdGVzdCBvciBhIHRlc3QgY2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQuIElmIHRoZQorICAvLyByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZQorICAvLyB1cGRhdGVkLgorICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7CisKKyAgZW51bSBSZWFjdGlvblRvU2hhcmRpbmcgeworICAgIEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLAorICAgIElHTk9SRV9TSEFSRElOR19QUk9UT0NPTAorICB9OworCisgIC8vIE1hdGNoZXMgdGhlIGZ1bGwgbmFtZSBvZiBlYWNoIHRlc3QgYWdhaW5zdCB0aGUgdXNlci1zcGVjaWZpZWQKKyAgLy8gZmlsdGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBydW4sIHRoZW4gcmVjb3JkcyB0aGUKKyAgLy8gcmVzdWx0IGluIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KKyAgLy8gSWYgc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cworICAvLyBiYXNlZCBvbiBzaGFyZGluZyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50LgorICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgRmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKTsKKworICAvLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCisgIHZvaWQgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKKworICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfY2FzZV87IH0KKyAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9CisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KKyAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgorICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+JiBlbnZpcm9ubWVudHMoKSB7IHJldHVybiBlbnZpcm9ubWVudHNfOyB9CisKKyAgLy8gR2V0dGVycyBmb3IgdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgeworICAgIHJldHVybiAqKGd0ZXN0X3RyYWNlX3N0YWNrXy5wb2ludGVyKCkpOworICB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgY29uc3QgeworICAgIHJldHVybiBndGVzdF90cmFjZV9zdGFja18uZ2V0KCk7CisgIH0KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIHZvaWQgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpIHsKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5yZXNldChQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpKTsKKyAgfQorICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QKKyAgLy8gZmxhZywgb3IgTlVMTCBpZiB0aGF0IGZsYWcgd2FzIG5vdCBzcGVjaWZpZWQuCisgIC8vIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisgIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIHRvIEluaXRHb29nbGVUZXN0LgorICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpOworICB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVhdGggdGVzdCBmYWN0b3J5LgorICBpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeSogZGVhdGhfdGVzdF9mYWN0b3J5KCkgeworICAgIHJldHVybiBkZWF0aF90ZXN0X2ZhY3RvcnlfLmdldCgpOworICB9CisKKyAgdm9pZCBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOworCisgIGZyaWVuZCBjbGFzcyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQorICAvLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCisgIHZvaWQgQ29uZmlndXJlWG1sT3V0cHV0KCk7CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byBhIHNvY2tldC4KKyAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KKyAgdm9pZCBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKKyNlbmRpZgorCisgIC8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCisgIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvCisgIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAgLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4KKyAgdm9pZCBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7CisKKyAgLy8gR2V0cyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBpdGVyYXRpb24uCisgIGludCByYW5kb21fc2VlZCgpIGNvbnN0IHsgcmV0dXJuIHJhbmRvbV9zZWVkXzsgfQorCisgIC8vIEdldHMgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICBpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20oKSB7IHJldHVybiAmcmFuZG9tXzsgfQorCisgIC8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKKyAgLy8gbWFraW5nIHN1cmUgdGhhdCBkZWF0aCB0ZXN0cyBhcmUgc3RpbGwgcnVuIGZpcnN0LgorICB2b2lkIFNodWZmbGVUZXN0cygpOworCisgIC8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCisgIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKKworICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQKKyAgLy8gVW5pdFRlc3Q6OlJ1bigpIHN0YXJ0cy4KKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4gY2F0Y2hfZXhjZXB0aW9uc187IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OlVuaXRUZXN0OworCisgIC8vIFVzZWQgYnkgVW5pdFRlc3Q6OlJ1bigpIHRvIGNhcHR1cmUgdGhlIHN0YXRlIG9mCisgIC8vIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBpdCBzdGFydHMuCisgIHZvaWQgc2V0X2NhdGNoX2V4Y2VwdGlvbnMoYm9vbCB2YWx1ZSkgeyBjYXRjaF9leGNlcHRpb25zXyA9IHZhbHVlOyB9CisKKyAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0aGF0IG93bnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCisgIFVuaXRUZXN0KiBjb25zdCBwYXJlbnRfOworCisgIC8vIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCisgIC8vIGV4ZWN1dGVkLgorICBpbnRlcm5hbDo6RmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOworCisgIC8vIFRoZSBkZWZhdWx0IHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXJzLgorICBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKyAgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKworICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKKworICAvLyBQcm90ZWN0cyByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLgorICBpbnRlcm5hbDo6TXV0ZXggZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfOworCisgIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgcGVyLXRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBpbnRlcm5hbDo6VGhyZWFkTG9jYWw8VGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSo+CisgICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCisgIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KKyAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiBlbnZpcm9ubWVudHNfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdENhc2VzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUKKyAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiB0ZXN0X2Nhc2VzXzsKKworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBjYXNlIGxpc3QgdG8gYWxsb3cKKyAgLy8gZWFzeSBzaHVmZmxpbmcgYW5kIHJlc3RvcmluZyB0aGUgdGVzdCBjYXNlIG9yZGVyLiAgVGhlIGktdGgKKyAgLy8gZWxlbWVudCBvZiB0aGlzIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBjYXNlIGluIHRoZQorICAvLyBzaHVmZmxlZCBvcmRlci4KKyAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2Nhc2VfaW5kaWNlc187CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBQYXJhbWV0ZXJpemVkVGVzdFJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIHJlZ2lzdGVyIHZhbHVlLXBhcmFtZXRlcml6ZWQKKyAgLy8gdGVzdHMuCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworCisgIC8vIEluZGljYXRlcyB3aGV0aGVyIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkIGFscmVhZHkuCisgIGJvb2wgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBJbmRleCBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UgcmVnaXN0ZXJlZC4gIEluaXRpYWxseSAtMS4KKyAgaW50IGxhc3RfZGVhdGhfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdENhc2UgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgY2FzZSBhZnRlciBhbm90aGVyLgorICAvLyBXaGVuIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3QKKyAgLy8gc3RvcmVzIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KKyAgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdEluZm8gZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgYWZ0ZXIgYW5vdGhlci4gIFdoZW4KKyAgLy8gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdCBzdG9yZXMKKyAgLy8gYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgorICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm9fOworCisgIC8vIE5vcm1hbGx5LCBhIHVzZXIgb25seSB3cml0ZXMgYXNzZXJ0aW9ucyBpbnNpZGUgYSBURVNUIG9yIFRFU1RfRiwKKyAgLy8gb3IgaW5zaWRlIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IGEgVEVTVCBvciBURVNUX0YuICBTaW5jZSBHb29nbGUKKyAgLy8gVGVzdCBrZWVwcyB0cmFjayBvZiB3aGljaCB0ZXN0IGlzIGN1cnJlbnQgcnVubmluZywgaXQgY2FuCisgIC8vIGFzc29jaWF0ZSBzdWNoIGFuIGFzc2VydGlvbiB3aXRoIHRoZSB0ZXN0IGl0IGJlbG9uZ3MgdG8uCisgIC8vCisgIC8vIElmIGFuIGFzc2VydGlvbiBpcyBlbmNvdW50ZXJlZCB3aGVuIG5vIFRFU1Qgb3IgVEVTVF9GIGlzIHJ1bm5pbmcsCisgIC8vIEdvb2dsZSBUZXN0IGF0dHJpYnV0ZXMgdGhlIGFzc2VydGlvbiByZXN1bHQgdG8gYW4gaW1hZ2luYXJ5ICJhZCBob2MiCisgIC8vIHRlc3QsIGFuZCByZWNvcmRzIHRoZSByZXN1bHQgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KKyAgVGVzdFJlc3VsdCBhZF9ob2NfdGVzdF9yZXN1bHRfOworCisgIC8vIFRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cyBpbnNpZGUKKyAgLy8gR29vZ2xlIFRlc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnNfOworCisgIC8vIFRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuICBXaWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgVW5pdFRlc3QKKyAgLy8gb2JqZWN0IGlzIGRlc3RydWN0ZWQuICBCeSBkZWZhdWx0LCBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIgaXMgdXNlZCwKKyAgLy8gYnV0IHRoZSB1c2VyIGNhbiBzZXQgdGhpcyBmaWVsZCB0byB1c2UgYSBjdXN0b20gZ2V0dGVyIGlmIHRoYXQgaXMKKyAgLy8gZGVzaXJlZC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXJfOworCisgIC8vIFRydWUgaWZmIFBvc3RGbGFnUGFyc2luZ0luaXQoKSBoYXMgYmVlbiBjYWxsZWQuCisgIGJvb2wgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXzsKKworICAvLyBUaGUgcmFuZG9tIG51bWJlciBzZWVkIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVzdCBydW4uCisgIGludCByYW5kb21fc2VlZF87CisKKyAgLy8gT3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICBpbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87CisKKyAgLy8gVGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgIC8vIFVOSVggZXBvY2guCisgIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXBfOworCisgIC8vIEhvdyBsb25nIHRoZSB0ZXN0IHRvb2sgdG8gcnVuLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgLy8gVGhlIGRlY29tcG9zZWQgY29tcG9uZW50cyBvZiB0aGUgZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZywKKyAgLy8gcGFyc2VkIHdoZW4gUlVOX0FMTF9URVNUUyBpcyBjYWxsZWQuCisgIGludGVybmFsOjpzY29wZWRfcHRyPEludGVybmFsUnVuRGVhdGhUZXN0RmxhZz4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ187CisgIGludGVybmFsOjpzY29wZWRfcHRyPGludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5PiBkZWF0aF90ZXN0X2ZhY3RvcnlfOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIC8vIEEgcGVyLXRocmVhZCBzdGFjayBvZiB0cmFjZXMgY3JlYXRlZCBieSB0aGUgU0NPUEVEX1RSQUNFKCkgbWFjcm8uCisgIGludGVybmFsOjpUaHJlYWRMb2NhbDxzdGQ6OnZlY3RvcjxUcmFjZUluZm8+ID4gZ3Rlc3RfdHJhY2Vfc3RhY2tfOworCisgIC8vIFRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQgUnVuQWxsVGVzdHMoKQorICAvLyBzdGFydHMuCisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdEltcGwpOworfTsgIC8vIGNsYXNzIFVuaXRUZXN0SW1wbAorCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWNjZXNzaW5nIHRoZSBnbG9iYWwgVW5pdFRlc3QKKy8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4KK2lubGluZSBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpIHsKKyAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCk7Cit9CisKKyNpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgdGhlIHNpbXBsZSByZWd1bGFyCisvLyBleHByZXNzaW9uIG1hdGNoZXIuCitHVEVTVF9BUElfIGJvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpUHVuY3QoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNSZXBlYXQoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzVmFsaWRFc2NhcGUoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuLCBjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBWYWxpZGF0ZVJlZ2V4KGNvbnN0IGNoYXIqIHJlZ2V4KTsKK0dURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjaCwgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4KK0dURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndik7CitHVEVTVF9BUElfIHZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBsYXN0IHN5c3RlbSBlcnJvciwgcmVnYXJkbGVzcyBvZiB0aGUKKy8vIHBsYXRmb3JtLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFByb3ZpZGVzIGxlYWstc2FmZSBXaW5kb3dzIGtlcm5lbCBoYW5kbGUgb3duZXJzaGlwLgorY2xhc3MgQXV0b0hhbmRsZSB7CisgcHVibGljOgorICBBdXRvSGFuZGxlKCkgOiBoYW5kbGVfKElOVkFMSURfSEFORExFX1ZBTFVFKSB7fQorICBleHBsaWNpdCBBdXRvSGFuZGxlKEhBTkRMRSBoYW5kbGUpIDogaGFuZGxlXyhoYW5kbGUpIHt9CisKKyAgfkF1dG9IYW5kbGUoKSB7IFJlc2V0KCk7IH0KKworICBIQU5ETEUgR2V0KCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQorICB2b2lkIFJlc2V0KCkgeyBSZXNldChJTlZBTElEX0hBTkRMRV9WQUxVRSk7IH0KKyAgdm9pZCBSZXNldChIQU5ETEUgaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSAhPSBoYW5kbGVfKSB7CisgICAgICBpZiAoaGFuZGxlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgOjpDbG9zZUhhbmRsZShoYW5kbGVfKTsKKyAgICAgIGhhbmRsZV8gPSBoYW5kbGU7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBIQU5ETEUgaGFuZGxlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEF1dG9IYW5kbGUpOworfTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gQXR0ZW1wdHMgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBhIHBvc2l0aXZlIGludGVnZXIgcG9pbnRlZCB0byBieSB0aGUKKy8vIG51bWJlciBwYXJhbWV0ZXIuICBSZXR1cm5zIHRydWUgaWYgdGhhdCBpcyBwb3NzaWJsZS4KKy8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UKKy8vIGl0IGhlcmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZWdlcj4KK2Jvb2wgUGFyc2VOYXR1cmFsTnVtYmVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgSW50ZWdlciogbnVtYmVyKSB7CisgIC8vIEZhaWwgZmFzdCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGRvZXMgbm90IGJlZ2luIHdpdGggYSBkaWdpdDsKKyAgLy8gdGhpcyBieXBhc3NlcyBzdHJ0b1hYWCdzICJvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHBsdXMKKyAgLy8gb3IgbWludXMgc2lnbiIgc2VtYW50aWNzLCB3aGljaCBhcmUgdW5kZXNpcmFibGUgaGVyZS4KKyAgaWYgKHN0ci5lbXB0eSgpIHx8ICFJc0RpZ2l0KHN0clswXSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZXJybm8gPSAwOworCisgIGNoYXIqIGVuZDsKKyAgLy8gQmlnZ2VzdENvbnZlcnRpYmxlIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZSB0aGF0IHN5c3RlbS1wcm92aWRlZAorICAvLyBzdHJpbmctdG8tbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMgY2FuIHJldHVybi4KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQorCisgIC8vIE1TVkMgYW5kIEMrKyBCdWlsZGVyIGRlZmluZSBfX2ludDY0IGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGxvbmcgbG9uZy4KKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IEJpZ2dlc3RDb252ZXJ0aWJsZTsKKyAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IF9zdHJ0b3VpNjQoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsKKworIyBlbHNlCisKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdENvbnZlcnRpYmxlOyAgLy8gTk9MSU5UCisgIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBzdHJ0b3VsbChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQorCisgIGNvbnN0IGJvb2wgcGFyc2Vfc3VjY2VzcyA9ICplbmQgPT0gJ1wwJyAmJiBlcnJubyA9PSAwOworCisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IENvbnZlcnQgdGhpcyB0byBjb21waWxlIHRpbWUgYXNzZXJ0aW9uIHdoZW4gaXQgaXMKKyAgLy8gYXZhaWxhYmxlLgorICBHVEVTVF9DSEVDS18oc2l6ZW9mKEludGVnZXIpIDw9IHNpemVvZihwYXJzZWQpKTsKKworICBjb25zdCBJbnRlZ2VyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludGVnZXI+KHBhcnNlZCk7CisgIGlmIChwYXJzZV9zdWNjZXNzICYmIHN0YXRpY19jYXN0PEJpZ2dlc3RDb252ZXJ0aWJsZT4ocmVzdWx0KSA9PSBwYXJzZWQpIHsKKyAgICAqbnVtYmVyID0gcmVzdWx0OworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdFJlc3VsdCBjb250YWlucyBzb21lIHByaXZhdGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gZnJvbQorLy8gR29vZ2xlIFRlc3QgdXNlciBidXQgYXJlIHJlcXVpcmVkIGZvciB0ZXN0aW5nLiBUaGlzIGNsYXNzIGFsbG93IG91ciB0ZXN0cworLy8gdG8gYWNjZXNzIHRoZW0uCisvLworLy8gVGhpcyBjbGFzcyBpcyBzdXBwbGllZCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duCisvLyBjb25zdHJ1Y3RzLiBEbyBub3QgdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkpIHsKKyAgICB0ZXN0X3Jlc3VsdC0+UmVjb3JkUHJvcGVydHkoeG1sX2VsZW1lbnQsIHByb3BlcnR5KTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0KSB7CisgICAgdGVzdF9yZXN1bHQtPkNsZWFyVGVzdFBhcnRSZXN1bHRzKCk7CisgIH0KKworICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygKKyAgICAgIGNvbnN0IFRlc3RSZXN1bHQmIHRlc3RfcmVzdWx0KSB7CisgICAgcmV0dXJuIHRlc3RfcmVzdWx0LnRlc3RfcGFydF9yZXN1bHRzKCk7CisgIH0KK307CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKKy8vIFN0cmVhbXMgdGVzdCByZXN1bHRzIHRvIHRoZSBnaXZlbiBwb3J0IG9uIHRoZSBnaXZlbiBob3N0IG1hY2hpbmUuCitjbGFzcyBTdHJlYW1pbmdMaXN0ZW5lciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIC8vIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHdyaXRpbmcgc3RyaW5ncyB0byBhIHNvY2tldC4KKyAgY2xhc3MgQWJzdHJhY3RTb2NrZXRXcml0ZXIgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkFic3RyYWN0U29ja2V0V3JpdGVyKCkge30KKworICAgIC8vIFNlbmRzIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCisgICAgdmlydHVhbCB2b2lkIFNlbmQoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSA9IDA7CisKKyAgICAvLyBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICB2aXJ0dWFsIHZvaWQgQ2xvc2VDb25uZWN0aW9uKCkge30KKworICAgIC8vIFNlbmRzIGEgc3RyaW5nIGFuZCBhIG5ld2xpbmUgdG8gdGhlIHNvY2tldC4KKyAgICB2b2lkIFNlbmRMbihjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICAgIFNlbmQobWVzc2FnZSArICJcbiIpOworICAgIH0KKyAgfTsKKworICAvLyBDb25jcmV0ZSBjbGFzcyBmb3IgYWN0dWFsbHkgd3JpdGluZyBzdHJpbmdzIHRvIGEgc29ja2V0LgorICBjbGFzcyBTb2NrZXRXcml0ZXIgOiBwdWJsaWMgQWJzdHJhY3RTb2NrZXRXcml0ZXIgeworICAgcHVibGljOgorICAgIFNvY2tldFdyaXRlcihjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IHN0cmluZyYgcG9ydCkKKyAgICAgICAgOiBzb2NrZmRfKC0xKSwgaG9zdF9uYW1lXyhob3N0KSwgcG9ydF9udW1fKHBvcnQpIHsKKyAgICAgIE1ha2VDb25uZWN0aW9uKCk7CisgICAgfQorCisgICAgdmlydHVhbCB+U29ja2V0V3JpdGVyKCkgeworICAgICAgaWYgKHNvY2tmZF8gIT0gLTEpCisgICAgICAgIENsb3NlQ29ubmVjdGlvbigpOworICAgIH0KKworICAgIC8vIFNlbmRzIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCisgICAgdmlydHVhbCB2b2lkIFNlbmQoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKKyAgICAgICAgICA8PCAiU2VuZCgpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOworCisgICAgICBjb25zdCBpbnQgbGVuID0gc3RhdGljX2Nhc3Q8aW50PihtZXNzYWdlLmxlbmd0aCgpKTsKKyAgICAgIGlmICh3cml0ZShzb2NrZmRfLCBtZXNzYWdlLmNfc3RyKCksIGxlbikgIT0gbGVuKSB7CisgICAgICAgIEdURVNUX0xPR18oV0FSTklORykKKyAgICAgICAgICAgIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBmYWlsZWQgdG8gc3RyZWFtIHRvICIKKyAgICAgICAgICAgIDw8IGhvc3RfbmFtZV8gPDwgIjoiIDw8IHBvcnRfbnVtXzsKKyAgICAgIH0KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgLy8gQ3JlYXRlcyBhIGNsaWVudCBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIuCisgICAgdm9pZCBNYWtlQ29ubmVjdGlvbigpOworCisgICAgLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAgdm9pZCBDbG9zZUNvbm5lY3Rpb24oKSB7CisgICAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKKyAgICAgICAgICA8PCAiQ2xvc2VDb25uZWN0aW9uKCkgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uLiI7CisKKyAgICAgIGNsb3NlKHNvY2tmZF8pOworICAgICAgc29ja2ZkXyA9IC0xOworICAgIH0KKworICAgIGludCBzb2NrZmRfOyAgLy8gc29ja2V0IGZpbGUgZGVzY3JpcHRvcgorICAgIGNvbnN0IHN0cmluZyBob3N0X25hbWVfOworICAgIGNvbnN0IHN0cmluZyBwb3J0X251bV87CisKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNvY2tldFdyaXRlcik7CisgIH07ICAvLyBjbGFzcyBTb2NrZXRXcml0ZXIKKworICAvLyBFc2NhcGVzICc9JywgJyYnLCAnJScsIGFuZCAnXG4nIGNoYXJhY3RlcnMgaW4gc3RyIGFzICIleHgiLgorICBzdGF0aWMgc3RyaW5nIFVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpOworCisgIFN0cmVhbWluZ0xpc3RlbmVyKGNvbnN0IHN0cmluZyYgaG9zdCwgY29uc3Qgc3RyaW5nJiBwb3J0KQorICAgICAgOiBzb2NrZXRfd3JpdGVyXyhuZXcgU29ja2V0V3JpdGVyKGhvc3QsIHBvcnQpKSB7IFN0YXJ0KCk7IH0KKworICBleHBsaWNpdCBTdHJlYW1pbmdMaXN0ZW5lcihBYnN0cmFjdFNvY2tldFdyaXRlciogc29ja2V0X3dyaXRlcikKKyAgICAgIDogc29ja2V0X3dyaXRlcl8oc29ja2V0X3dyaXRlcikgeyBTdGFydCgpOyB9CisKKyAgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLykgeworICAgIFNlbmRMbigiZXZlbnQ9VGVzdFByb2dyYW1TdGFydCIpOworICB9CisKKyAgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgICAvLyBOb3RlIHRoYXQgR29vZ2xlIFRlc3QgY3VycmVudCBvbmx5IHJlcG9ydCBlbGFwc2VkIHRpbWUgZm9yIGVhY2gKKyAgICAvLyB0ZXN0IGl0ZXJhdGlvbiwgbm90IGZvciB0aGUgZW50aXJlIHRlc3QgcHJvZ3JhbS4KKyAgICBTZW5kTG4oImV2ZW50PVRlc3RQcm9ncmFtRW5kJnBhc3NlZD0iICsgRm9ybWF0Qm9vbCh1bml0X3Rlc3QuUGFzc2VkKCkpKTsKKworICAgIC8vIE5vdGlmeSB0aGUgc3RyZWFtaW5nIHNlcnZlciB0byBzdG9wLgorICAgIHNvY2tldF93cml0ZXJfLT5DbG9zZUNvbm5lY3Rpb24oKTsKKyAgfQorCisgIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLywgaW50IGl0ZXJhdGlvbikgeworICAgIFNlbmRMbigiZXZlbnQ9VGVzdEl0ZXJhdGlvblN0YXJ0Jml0ZXJhdGlvbj0iICsKKyAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKGl0ZXJhdGlvbikpOworICB9CisKKyAgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IC8qIGl0ZXJhdGlvbiAqLykgeworICAgIFNlbmRMbigiZXZlbnQ9VGVzdEl0ZXJhdGlvbkVuZCZwYXNzZWQ9IiArCisgICAgICAgICAgIEZvcm1hdEJvb2wodW5pdF90ZXN0LlBhc3NlZCgpKSArICImZWxhcHNlZF90aW1lPSIgKworICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKSArICJtcyIpOworICB9CisKKyAgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICAgIFNlbmRMbihzdGQ6OnN0cmluZygiZXZlbnQ9VGVzdENhc2VTdGFydCZuYW1lPSIpICsgdGVzdF9jYXNlLm5hbWUoKSk7CisgIH0KKworICB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICAgIFNlbmRMbigiZXZlbnQ9VGVzdENhc2VFbmQmcGFzc2VkPSIgKyBGb3JtYXRCb29sKHRlc3RfY2FzZS5QYXNzZWQoKSkKKyAgICAgICAgICAgKyAiJmVsYXBzZWRfdGltZT0iICsgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkKKyAgICAgICAgICAgKyAibXMiKTsKKyAgfQorCisgIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIFNlbmRMbihzdGQ6OnN0cmluZygiZXZlbnQ9VGVzdFN0YXJ0Jm5hbWU9IikgKyB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBTZW5kTG4oImV2ZW50PVRlc3RFbmQmcGFzc2VkPSIgKworICAgICAgICAgICBGb3JtYXRCb29sKCh0ZXN0X2luZm8ucmVzdWx0KCkpLT5QYXNzZWQoKSkgKworICAgICAgICAgICAiJmVsYXBzZWRfdGltZT0iICsKKyAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKCh0ZXN0X2luZm8ucmVzdWx0KCkpLT5lbGFwc2VkX3RpbWUoKSkgKyAibXMiKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSA9IHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCk7CisgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKQorICAgICAgZmlsZV9uYW1lID0gIiI7CisgICAgU2VuZExuKCJldmVudD1UZXN0UGFydFJlc3VsdCZmaWxlPSIgKyBVcmxFbmNvZGUoZmlsZV9uYW1lKSArCisgICAgICAgICAgICImbGluZT0iICsgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSkgKworICAgICAgICAgICAiJm1lc3NhZ2U9IiArIFVybEVuY29kZSh0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBTZW5kcyB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBuZXdsaW5lIHRvIHRoZSBzb2NrZXQuCisgIHZvaWQgU2VuZExuKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeyBzb2NrZXRfd3JpdGVyXy0+U2VuZExuKG1lc3NhZ2UpOyB9CisKKyAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBzdHJlYW1pbmcgdG8gbm90aWZ5IHRoZSByZWNlaXZlciB3aGF0CisgIC8vIHByb3RvY29sIHdlIGFyZSB1c2luZy4KKyAgdm9pZCBTdGFydCgpIHsgU2VuZExuKCJndGVzdF9zdHJlYW1pbmdfcHJvdG9jb2xfdmVyc2lvbj0xLjAiKTsgfQorCisgIHN0cmluZyBGb3JtYXRCb29sKGJvb2wgdmFsdWUpIHsgcmV0dXJuIHZhbHVlID8gIjEiIDogIjAiOyB9CisKKyAgY29uc3Qgc2NvcGVkX3B0cjxBYnN0cmFjdFNvY2tldFdyaXRlcj4gc29ja2V0X3dyaXRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJlYW1pbmdMaXN0ZW5lcik7Cit9OyAgLy8gY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXIKKworI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1wb3J0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QtcG9ydC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzRkZjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QtcG9ydC5jYwpAQCAtMCwwICsxLDgwNSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBGb3IgVGVybWluYXRlUHJvY2VzcygpCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisjIGluY2x1ZGUgPGlvLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2lmIEdURVNUX09TX01BQworIyBpbmNsdWRlIDxtYWNoL21hY2hfaW5pdC5oPgorIyBpbmNsdWRlIDxtYWNoL3Rhc2suaD4KKyMgaW5jbHVkZSA8bWFjaC92bV9tYXAuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyNpZiBHVEVTVF9PU19RTlgKKyMgaW5jbHVkZSA8ZGV2Y3RsLmg+CisjIGluY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIE1TVkMgYW5kIEMrK0J1aWxkZXIgZG8gbm90IHByb3ZpZGUgYSBkZWZpbml0aW9uIG9mIFNUREVSUl9GSUxFTk8uCitjb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IDE7Citjb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IDI7CisjZWxzZQorY29uc3QgaW50IGtTdGRPdXRGaWxlbm8gPSBTVERPVVRfRklMRU5POworY29uc3QgaW50IGtTdGRFcnJGaWxlbm8gPSBTVERFUlJfRklMRU5POworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWYgR1RFU1RfT1NfTUFDCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgY29uc3QgdGFza190IHRhc2sgPSBtYWNoX3Rhc2tfc2VsZigpOworICBtYWNoX21zZ190eXBlX251bWJlcl90IHRocmVhZF9jb3VudDsKKyAgdGhyZWFkX2FjdF9hcnJheV90IHRocmVhZF9saXN0OworICBjb25zdCBrZXJuX3JldHVybl90IHN0YXR1cyA9IHRhc2tfdGhyZWFkcyh0YXNrLCAmdGhyZWFkX2xpc3QsICZ0aHJlYWRfY291bnQpOworICBpZiAoc3RhdHVzID09IEtFUk5fU1VDQ0VTUykgeworICAgIC8vIHRhc2tfdGhyZWFkcyBhbGxvY2F0ZXMgcmVzb3VyY2VzIGluIHRocmVhZF9saXN0IGFuZCB3ZSBuZWVkIHRvIGZyZWUgdGhlbQorICAgIC8vIHRvIGF2b2lkIGxlYWtzLgorICAgIHZtX2RlYWxsb2NhdGUodGFzaywKKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm1fYWRkcmVzc190Pih0aHJlYWRfbGlzdCksCisgICAgICAgICAgICAgICAgICBzaXplb2YodGhyZWFkX3QpICogdGhyZWFkX2NvdW50KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0aHJlYWRfY291bnQpOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKKyNlbGlmIEdURVNUX09TX1FOWAorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKKy8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCitzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgIGNvbnN0IGludCBmZCA9IG9wZW4oIi9wcm9jL3NlbGYvYXMiLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwcm9jZnNfaW5mbyBwcm9jZXNzX2luZm87CisgIGNvbnN0IGludCBzdGF0dXMgPQorICAgICAgZGV2Y3RsKGZkLCBEQ01EX1BST0NfSU5GTywgJnByb2Nlc3NfaW5mbywgc2l6ZW9mKHByb2Nlc3NfaW5mbyksIE5VTEwpOworICBjbG9zZShmZCk7CisgIGlmIChzdGF0dXMgPT0gRU9LKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4ocHJvY2Vzc19pbmZvLm51bV90aHJlYWRzKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisjZWxzZQorCitzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgIC8vIFRoZXJlJ3Mgbm8gcG9ydGFibGUgd2F5IHRvIGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMsIHNvIHdlIGp1c3QKKyAgLy8gcmV0dXJuIDAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBjYW5ub3QgZGV0ZWN0IGl0LgorICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2lmIEdURVNUX1VTRVNfUE9TSVhfUkUKKworLy8gSW1wbGVtZW50cyBSRS4gIEN1cnJlbnRseSBvbmx5IG5lZWRlZCBmb3IgZGVhdGggdGVzdHMuCisKK1JFOjp+UkUoKSB7CisgIGlmIChpc192YWxpZF8pIHsKKyAgICAvLyByZWdmcmVlJ2luZyBhbiBpbnZhbGlkIHJlZ2V4IG1pZ2h0IGNyYXNoIGJlY2F1c2UgdGhlIGNvbnRlbnQKKyAgICAvLyBvZiB0aGUgcmVnZXggaXMgdW5kZWZpbmVkLiBTaW5jZSB0aGUgcmVnZXgncyBhcmUgZXNzZW50aWFsbHkKKyAgICAvLyB0aGUgc2FtZSwgb25lIGNhbm5vdCBiZSB2YWxpZCAob3IgaW52YWxpZCkgd2l0aG91dCB0aGUgb3RoZXIKKyAgICAvLyBiZWluZyBzbyB0b28uCisgICAgcmVnZnJlZSgmcGFydGlhbF9yZWdleF8pOworICAgIHJlZ2ZyZWUoJmZ1bGxfcmVnZXhfKTsKKyAgfQorICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhdHRlcm5fKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgdGhlIGVudGlyZSBzdHIuCitib29sIFJFOjpGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgaWYgKCFyZS5pc192YWxpZF8pIHJldHVybiBmYWxzZTsKKworICByZWdtYXRjaF90IG1hdGNoOworICByZXR1cm4gcmVnZXhlYygmcmUuZnVsbF9yZWdleF8sIHN0ciwgMSwgJm1hdGNoLCAwKSA9PSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0cgorLy8gKGluY2x1ZGluZyBzdHIgaXRzZWxmKS4KK2Jvb2wgUkU6OlBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOworCisgIHJlZ21hdGNoX3QgbWF0Y2g7CisgIHJldHVybiByZWdleGVjKCZyZS5wYXJ0aWFsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Cit9CisKKy8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KK3ZvaWQgUkU6OkluaXQoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsKKworICAvLyBSZXNlcnZlcyBlbm91Z2ggYnl0ZXMgdG8gaG9sZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIGEKKyAgLy8gZnVsbCBtYXRjaC4KKyAgY29uc3Qgc2l6ZV90IGZ1bGxfcmVnZXhfbGVuID0gc3RybGVuKHJlZ2V4KSArIDEwOworICBjaGFyKiBjb25zdCBmdWxsX3BhdHRlcm4gPSBuZXcgY2hhcltmdWxsX3JlZ2V4X2xlbl07CisKKyAgc25wcmludGYoZnVsbF9wYXR0ZXJuLCBmdWxsX3JlZ2V4X2xlbiwgIl4oJXMpJCIsIHJlZ2V4KTsKKyAgaXNfdmFsaWRfID0gcmVnY29tcCgmZnVsbF9yZWdleF8sIGZ1bGxfcGF0dGVybiwgUkVHX0VYVEVOREVEKSA9PSAwOworICAvLyBXZSB3YW50IHRvIGNhbGwgcmVnY29tcCgmcGFydGlhbF9yZWdleF8sIC4uLikgZXZlbiBpZiB0aGUKKyAgLy8gcHJldmlvdXMgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlLiAgT3RoZXJ3aXNlIHBhcnRpYWxfcmVnZXhfIG1heQorICAvLyBub3QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgY2FuIG1heSBjYXVzZSB0cm91YmxlIHdoZW4gaXQncworICAvLyBmcmVlZC4KKyAgLy8KKyAgLy8gU29tZSBpbXBsZW1lbnRhdGlvbiBvZiBQT1NJWCByZWdleCAoZS5nLiBvbiBhdCBsZWFzdCBzb21lCisgIC8vIHZlcnNpb25zIG9mIEN5Z3dpbikgZG9lc24ndCBhY2NlcHQgdGhlIGVtcHR5IHN0cmluZyBhcyBhIHZhbGlkCisgIC8vIHJlZ2V4LiAgV2UgY2hhbmdlIGl0IHRvIGFuIGVxdWl2YWxlbnQgZm9ybSAiKCkiIHRvIGJlIHNhZmUuCisgIGlmIChpc192YWxpZF8pIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBwYXJ0aWFsX3JlZ2V4ID0gKCpyZWdleCA9PSAnXDAnKSA/ICIoKSIgOiByZWdleDsKKyAgICBpc192YWxpZF8gPSByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgcGFydGlhbF9yZWdleCwgUkVHX0VYVEVOREVEKSA9PSAwOworICB9CisgIEVYUEVDVF9UUlVFKGlzX3ZhbGlkXykKKyAgICAgIDw8ICJSZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4CisgICAgICA8PCAiXCIgaXMgbm90IGEgdmFsaWQgUE9TSVggRXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uLiI7CisKKyAgZGVsZXRlW10gZnVsbF9wYXR0ZXJuOworfQorCisjZWxpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBSZXR1cm5zIHRydWUgaWZmIGNoIGFwcGVhcnMgYW55d2hlcmUgaW4gc3RyIChleGNsdWRpbmcgdGhlCisvLyB0ZXJtaW5hdGluZyAnXDAnIGNoYXJhY3RlcikuCitib29sIElzSW5TZXQoY2hhciBjaCwgY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiBjaCAhPSAnXDAnICYmIHN0cmNocihzdHIsIGNoKSAhPSBOVUxMOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIGNoIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGNsYXNzaWZpY2F0aW9uLiAgVW5saWtlCisvLyBzaW1pbGFyIGZ1bmN0aW9ucyBpbiA8Y3R5cGUuaD4sIHRoZXNlIGFyZW4ndCBhZmZlY3RlZCBieSB0aGUKKy8vIGN1cnJlbnQgbG9jYWxlLgorYm9vbCBJc0FzY2lpRGlnaXQoY2hhciBjaCkgeyByZXR1cm4gJzAnIDw9IGNoICYmIGNoIDw9ICc5JzsgfQorYm9vbCBJc0FzY2lpUHVuY3QoY2hhciBjaCkgeworICByZXR1cm4gSXNJblNldChjaCwgIl4tIVwiIyQlJicoKSorLC4vOjs8PT4/QFtcXF1fYHt8fX4iKTsKK30KK2Jvb2wgSXNSZXBlYXQoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIj8qKyIpOyB9Citib29sIElzQXNjaWlXaGl0ZVNwYWNlKGNoYXIgY2gpIHsgcmV0dXJuIElzSW5TZXQoY2gsICIgXGZcblxyXHRcdiIpOyB9Citib29sIElzQXNjaWlXb3JkQ2hhcihjaGFyIGNoKSB7CisgIHJldHVybiAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpIHx8CisgICAgICAoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwgY2ggPT0gJ18nOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmICJcXGMiIGlzIGEgc3VwcG9ydGVkIGVzY2FwZSBzZXF1ZW5jZS4KK2Jvb2wgSXNWYWxpZEVzY2FwZShjaGFyIGMpIHsKKyAgcmV0dXJuIChJc0FzY2lpUHVuY3QoYykgfHwgSXNJblNldChjLCAiZERmbnJzU3R2d1ciKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIGF0b20gKHNwZWNpZmllZCBieSBlc2NhcGVkIGFuZCBwYXR0ZXJuKQorLy8gbWF0Y2hlcyBjaC4gIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIHRoZSBhdG9tIGlzIGludmFsaWQuCitib29sIEF0b21NYXRjaGVzQ2hhcihib29sIGVzY2FwZWQsIGNoYXIgcGF0dGVybl9jaGFyLCBjaGFyIGNoKSB7CisgIGlmIChlc2NhcGVkKSB7ICAvLyAiXFxwIiB3aGVyZSBwIGlzIHBhdHRlcm5fY2hhci4KKyAgICBzd2l0Y2ggKHBhdHRlcm5fY2hhcikgeworICAgICAgY2FzZSAnZCc6IHJldHVybiBJc0FzY2lpRGlnaXQoY2gpOworICAgICAgY2FzZSAnRCc6IHJldHVybiAhSXNBc2NpaURpZ2l0KGNoKTsKKyAgICAgIGNhc2UgJ2YnOiByZXR1cm4gY2ggPT0gJ1xmJzsKKyAgICAgIGNhc2UgJ24nOiByZXR1cm4gY2ggPT0gJ1xuJzsKKyAgICAgIGNhc2UgJ3InOiByZXR1cm4gY2ggPT0gJ1xyJzsKKyAgICAgIGNhc2UgJ3MnOiByZXR1cm4gSXNBc2NpaVdoaXRlU3BhY2UoY2gpOworICAgICAgY2FzZSAnUyc6IHJldHVybiAhSXNBc2NpaVdoaXRlU3BhY2UoY2gpOworICAgICAgY2FzZSAndCc6IHJldHVybiBjaCA9PSAnXHQnOworICAgICAgY2FzZSAndic6IHJldHVybiBjaCA9PSAnXHYnOworICAgICAgY2FzZSAndyc6IHJldHVybiBJc0FzY2lpV29yZENoYXIoY2gpOworICAgICAgY2FzZSAnVyc6IHJldHVybiAhSXNBc2NpaVdvcmRDaGFyKGNoKTsKKyAgICB9CisgICAgcmV0dXJuIElzQXNjaWlQdW5jdChwYXR0ZXJuX2NoYXIpICYmIHBhdHRlcm5fY2hhciA9PSBjaDsKKyAgfQorCisgIHJldHVybiAocGF0dGVybl9jaGFyID09ICcuJyAmJiBjaCAhPSAnXG4nKSB8fCBwYXR0ZXJuX2NoYXIgPT0gY2g7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IFZhbGlkYXRlUmVnZXgoKSB0byBmb3JtYXQgZXJyb3IgbWVzc2FnZXMuCitzdGQ6OnN0cmluZyBGb3JtYXRSZWdleFN5bnRheEVycm9yKGNvbnN0IGNoYXIqIHJlZ2V4LCBpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkgPDwgIlN5bnRheCBlcnJvciBhdCBpbmRleCAiIDw8IGluZGV4CisgICAgICAgICAgPDwgIiBpbiBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIFwiIiA8PCByZWdleCA8PCAiXCI6ICIpLkdldFN0cmluZygpOworfQorCisvLyBHZW5lcmF0ZXMgbm9uLWZhdGFsIGZhaWx1cmVzIGFuZCByZXR1cm5zIGZhbHNlIGlmIHJlZ2V4IGlzIGludmFsaWQ7CisvLyBvdGhlcndpc2UgcmV0dXJucyB0cnVlLgorYm9vbCBWYWxpZGF0ZVJlZ2V4KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIGlmIChyZWdleCA9PSBOVUxMKSB7CisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGZpeCB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24gaW4gdGhlCisgICAgLy8gYXNzZXJ0aW9uIGZhaWx1cmVzIHRvIG1hdGNoIHdoZXJlIHRoZSByZWdleCBpcyB1c2VkIGluIHVzZXIKKyAgICAvLyBjb2RlLgorICAgIEFERF9GQUlMVVJFKCkgPDwgIk5VTEwgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNfdmFsaWQgPSB0cnVlOworCisgIC8vIFRydWUgaWZmID8sICosIG9yICsgY2FuIGZvbGxvdyB0aGUgcHJldmlvdXMgYXRvbS4KKyAgYm9vbCBwcmV2X3JlcGVhdGFibGUgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IHJlZ2V4W2ldOyBpKyspIHsKKyAgICBpZiAocmVnZXhbaV0gPT0gJ1xcJykgeyAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlCisgICAgICBpKys7CisgICAgICBpZiAocmVnZXhbaV0gPT0gJ1wwJykgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInXFwnIGNhbm5vdCBhcHBlYXIgYXQgdGhlIGVuZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmICghSXNWYWxpZEVzY2FwZShyZWdleFtpXSkpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXCJcXCIgPDwgcmVnZXhbaV0gPDwgIlwiLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9CisgICAgICBwcmV2X3JlcGVhdGFibGUgPSB0cnVlOworICAgIH0gZWxzZSB7ICAvLyBOb3QgYW4gZXNjYXBlIHNlcXVlbmNlLgorICAgICAgY29uc3QgY2hhciBjaCA9IHJlZ2V4W2ldOworCisgICAgICBpZiAoY2ggPT0gJ14nICYmIGkgPiAwKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJ14nIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGNoID09ICckJyAmJiByZWdleFtpICsgMV0gIT0gJ1wwJykgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIickJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZC4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChJc0luU2V0KGNoLCAiKClbXXt9fCIpKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgY2ggPDwgIicgaXMgdW5zdXBwb3J0ZWQuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoSXNSZXBlYXQoY2gpICYmICFwcmV2X3JlcGVhdGFibGUpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHByZXZfcmVwZWF0YWJsZSA9ICFJc0luU2V0KGNoLCAiXiQ/KisiKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gaXNfdmFsaWQ7Cit9CisKKy8vIE1hdGNoZXMgYSByZXBlYXRlZCByZWdleCBhdG9tIGZvbGxvd2VkIGJ5IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIKKy8vIGV4cHJlc3Npb24uICBUaGUgcmVnZXggYXRvbSBpcyBkZWZpbmVkIGFzIGMgaWYgZXNjYXBlZCBpcyBmYWxzZSwKKy8vIG9yIFxjIG90aGVyd2lzZS4gIHJlcGVhdCBpcyB0aGUgcmVwZXRpdGlvbiBtZXRhIGNoYXJhY3RlciAoPywgKiwKKy8vIG9yICspLiAgVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBzdHIgY29udGFpbnMgdG9vIG1hbnkKKy8vIGNoYXJhY3RlcnMgdG8gYmUgaW5kZXhhYmxlIGJ5IHNpemVfdCwgaW4gd2hpY2ggY2FzZSB0aGUgdGVzdCB3aWxsCisvLyBwcm9iYWJseSB0aW1lIG91dCBhbnl3YXkuICBXZSBhcmUgZmluZSB3aXRoIHRoaXMgbGltaXRhdGlvbiBhcworLy8gc3RkOjpzdHJpbmcgaGFzIGl0IHRvby4KK2Jvb2wgTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgYm9vbCBlc2NhcGVkLCBjaGFyIGMsIGNoYXIgcmVwZWF0LCBjb25zdCBjaGFyKiByZWdleCwKKyAgICBjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3Qgc2l6ZV90IG1pbl9jb3VudCA9IChyZXBlYXQgPT0gJysnKSA/IDEgOiAwOworICBjb25zdCBzaXplX3QgbWF4X2NvdW50ID0gKHJlcGVhdCA9PSAnPycpID8gMSA6CisgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KC0xKSAtIDE7CisgIC8vIFdlIGNhbm5vdCBjYWxsIG51bWVyaWNfbGltaXRzOjptYXgoKSBhcyBpdCBjb25mbGljdHMgd2l0aCB0aGUKKyAgLy8gbWF4KCkgbWFjcm8gb24gV2luZG93cy4KKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSBtYXhfY291bnQ7ICsraSkgeworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgYXRvbSBtYXRjaGVzIGVhY2ggb2YgdGhlIGZpcnN0IGkgY2hhcmFjdGVycyBpbiBzdHIuCisgICAgaWYgKGkgPj0gbWluX2NvdW50ICYmIE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0ciArIGkpKSB7CisgICAgICAvLyBXZSBoYXZlIGVub3VnaCBtYXRjaGVzIGF0IHRoZSBoZWFkLCBhbmQgdGhlIHRhaWwgbWF0Y2hlcyB0b28uCisgICAgICAvLyBTaW5jZSB3ZSBvbmx5IGNhcmUgYWJvdXQgKndoZXRoZXIqIHRoZSBwYXR0ZXJuIG1hdGNoZXMgc3RyCisgICAgICAvLyAoYXMgb3Bwb3NlZCB0byAqaG93KiBpdCBtYXRjaGVzKSwgdGhlcmUgaXMgbm8gbmVlZCB0byBmaW5kIGEKKyAgICAgIC8vIGdyZWVkeSBtYXRjaC4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoc3RyW2ldID09ICdcMCcgfHwgIUF0b21NYXRjaGVzQ2hhcihlc2NhcGVkLCBjLCBzdHJbaV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWdleCBtYXRjaGVzIGEgcHJlZml4IG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUgYQorLy8gdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgbm90IHN0YXJ0IHdpdGggIl4iLCBvciB0aGUKKy8vIHJlc3VsdCBpcyB1bmRlZmluZWQuCitib29sIE1hdGNoUmVnZXhBdEhlYWQoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgeworICBpZiAoKnJlZ2V4ID09ICdcMCcpICAvLyBBbiBlbXB0eSByZWdleCBtYXRjaGVzIGEgcHJlZml4IG9mIGFueXRoaW5nLgorICAgIHJldHVybiB0cnVlOworCisgIC8vICIkIiBvbmx5IG1hdGNoZXMgdGhlIGVuZCBvZiBhIHN0cmluZy4gIE5vdGUgdGhhdCByZWdleCBiZWluZworICAvLyB2YWxpZCBndWFyYW50ZWVzIHRoYXQgdGhlcmUncyBub3RoaW5nIGFmdGVyICIkIiBpbiBpdC4KKyAgaWYgKCpyZWdleCA9PSAnJCcpCisgICAgcmV0dXJuICpzdHIgPT0gJ1wwJzsKKworICAvLyBJcyB0aGUgZmlyc3QgdGhpbmcgaW4gcmVnZXggYW4gZXNjYXBlIHNlcXVlbmNlPworICBjb25zdCBib29sIGVzY2FwZWQgPSAqcmVnZXggPT0gJ1xcJzsKKyAgaWYgKGVzY2FwZWQpCisgICAgKytyZWdleDsKKyAgaWYgKElzUmVwZWF0KHJlZ2V4WzFdKSkgeworICAgIC8vIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKCkgY2FsbHMgTWF0Y2hSZWdleEF0SGVhZCgpLCBzbworICAgIC8vIGhlcmUncyBhbiBpbmRpcmVjdCByZWN1cnNpb24uICBJdCB0ZXJtaW5hdGVzIGFzIHRoZSByZWdleCBnZXRzCisgICAgLy8gc2hvcnRlciBpbiBlYWNoIHJlY3Vyc2lvbi4KKyAgICByZXR1cm4gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgICAgIGVzY2FwZWQsIHJlZ2V4WzBdLCByZWdleFsxXSwgcmVnZXggKyAyLCBzdHIpOworICB9IGVsc2UgeworICAgIC8vIHJlZ2V4IGlzbid0IGVtcHR5LCBpc24ndCAiJCIsIGFuZCBkb2Vzbid0IHN0YXJ0IHdpdGggYQorICAgIC8vIHJlcGV0aXRpb24uICBXZSBtYXRjaCB0aGUgZmlyc3QgYXRvbSBvZiByZWdleCB3aXRoIHRoZSBmaXJzdAorICAgIC8vIGNoYXJhY3RlciBvZiBzdHIgYW5kIHJlY3Vyc2UuCisgICAgcmV0dXJuICgqc3RyICE9ICdcMCcpICYmIEF0b21NYXRjaGVzQ2hhcihlc2NhcGVkLCAqcmVnZXgsICpzdHIpICYmCisgICAgICAgIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIgKyAxKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYW55IHN1YnN0cmluZyBvZiBzdHIuICByZWdleCBtdXN0IGJlCisvLyBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24sIG9yIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorLy8KKy8vIFRoZSBhbGdvcml0aG0gaXMgcmVjdXJzaXZlLCBidXQgdGhlIHJlY3Vyc2lvbiBkZXB0aCBkb2Vzbid0IGV4Y2VlZAorLy8gdGhlIHJlZ2V4IGxlbmd0aCwgc28gd2Ugd29uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBydW5uaW5nIG91dCBvZgorLy8gc3RhY2sgc3BhY2Ugbm9ybWFsbHkuICBJbiByYXJlIGNhc2VzIHRoZSB0aW1lIGNvbXBsZXhpdHkgY2FuIGJlCisvLyBleHBvbmVudGlhbCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlZ2V4IGxlbmd0aCArIHRoZSBzdHJpbmcgbGVuZ3RoLAorLy8gYnV0IHVzdWFsbHkgaXQncyBtdXN0IGZhc3RlciAob2Z0ZW4gY2xvc2UgdG8gbGluZWFyKS4KK2Jvb2wgTWF0Y2hSZWdleEFueXdoZXJlKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKHJlZ2V4ID09IE5VTEwgfHwgc3RyID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgqcmVnZXggPT0gJ14nKQorICAgIHJldHVybiBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4ICsgMSwgc3RyKTsKKworICAvLyBBIHN1Y2Nlc3NmdWwgbWF0Y2ggY2FuIGJlIGFueXdoZXJlIGluIHN0ci4KKyAgZG8geworICAgIGlmIChNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4LCBzdHIpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0gd2hpbGUgKCpzdHIrKyAhPSAnXDAnKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBJbXBsZW1lbnRzIHRoZSBSRSBjbGFzcy4KKworUkU6On5SRSgpIHsKKyAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOworICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KGZ1bGxfcGF0dGVybl8pKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KK2Jvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICByZXR1cm4gcmUuaXNfdmFsaWRfICYmIE1hdGNoUmVnZXhBbnl3aGVyZShyZS5mdWxsX3BhdHRlcm5fLCBzdHIpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0cgorLy8gKGluY2x1ZGluZyBzdHIgaXRzZWxmKS4KK2Jvb2wgUkU6OlBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICByZXR1cm4gcmUuaXNfdmFsaWRfICYmIE1hdGNoUmVnZXhBbnl3aGVyZShyZS5wYXR0ZXJuXywgc3RyKTsKK30KKworLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgordm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgeworICBwYXR0ZXJuXyA9IGZ1bGxfcGF0dGVybl8gPSBOVUxMOworICBpZiAocmVnZXggIT0gTlVMTCkgeworICAgIHBhdHRlcm5fID0gcG9zaXg6OlN0ckR1cChyZWdleCk7CisgIH0KKworICBpc192YWxpZF8gPSBWYWxpZGF0ZVJlZ2V4KHJlZ2V4KTsKKyAgaWYgKCFpc192YWxpZF8pIHsKKyAgICAvLyBObyBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgZnVsbCBwYXR0ZXJuIHdoZW4gdGhlIHJlZ2V4IGlzIGludmFsaWQuCisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbihyZWdleCk7CisgIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQorICAvLyBmdWxsIG1hdGNoOiB3ZSBuZWVkIHNwYWNlIHRvIHByZXBlbmQgYSAnXicsIGFwcGVuZCBhICckJywgYW5kCisgIC8vIHRlcm1pbmF0ZSB0aGUgc3RyaW5nIHdpdGggJ1wwJy4KKyAgY2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1hbGxvYyhsZW4gKyAzKSk7CisgIGZ1bGxfcGF0dGVybl8gPSBidWZmZXI7CisKKyAgaWYgKCpyZWdleCAhPSAnXicpCisgICAgKmJ1ZmZlcisrID0gJ14nOyAgLy8gTWFrZXMgc3VyZSBmdWxsX3BhdHRlcm5fIHN0YXJ0cyB3aXRoICdeJy4KKworICAvLyBXZSBkb24ndCB1c2Ugc25wcmludGYgb3Igc3RybmNweSwgYXMgdGhleSB0cmlnZ2VyIGEgd2FybmluZyB3aGVuCisgIC8vIGNvbXBpbGVkIHdpdGggVkMrKyA4LjAuCisgIG1lbWNweShidWZmZXIsIHJlZ2V4LCBsZW4pOworICBidWZmZXIgKz0gbGVuOworCisgIGlmIChsZW4gPT0gMCB8fCByZWdleFtsZW4gLSAxXSAhPSAnJCcpCisgICAgKmJ1ZmZlcisrID0gJyQnOyAgLy8gTWFrZXMgc3VyZSBmdWxsX3BhdHRlcm5fIGVuZHMgd2l0aCAnJCcuCisKKyAgKmJ1ZmZlciA9ICdcMCc7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfVVNFU19QT1NJWF9SRQorCitjb25zdCBjaGFyIGtVbmtub3duRmlsZVtdID0gInVua25vd24gZmlsZSI7CisKKy8vIEZvcm1hdHMgYSBzb3VyY2UgZmlsZSBwYXRoIGFuZCBhIGxpbmUgbnVtYmVyIGFzIHRoZXkgd291bGQgYXBwZWFyCisvLyBpbiBhbiBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSB0aGlzIGNvZGUuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVfbmFtZShmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlKTsKKworICBpZiAobGluZSA8IDApIHsKKyAgICByZXR1cm4gZmlsZV9uYW1lICsgIjoiOworICB9CisjaWZkZWYgX01TQ19WRVIKKyAgcmV0dXJuIGZpbGVfbmFtZSArICIoIiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lKSArICIpOiI7CisjZWxzZQorICByZXR1cm4gZmlsZV9uYW1lICsgIjoiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpICsgIjoiOworI2VuZGlmICAvLyBfTVNDX1ZFUgorfQorCisvLyBGb3JtYXRzIGEgZmlsZSBsb2NhdGlvbiBmb3IgY29tcGlsZXItaW5kZXBlbmRlbnQgWE1MIG91dHB1dC4KKy8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCwgd2UgcHV0IGl0IG5leHQgdG8KKy8vIEZvcm1hdEZpbGVMb2NhdGlvbiBpbiBvcmRlciB0byBjb250cmFzdCB0aGUgdHdvIGZ1bmN0aW9ucy4KKy8vIE5vdGUgdGhhdCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKCkgZG9lcyBOT1QgYXBwZW5kIGNvbG9uCisvLyB0byB0aGUgZmlsZSBsb2NhdGlvbiBpdCBwcm9kdWNlcywgdW5saWtlIEZvcm1hdEZpbGVMb2NhdGlvbigpLgorR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oCisgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lKGZpbGUgPT0gTlVMTCA/IGtVbmtub3duRmlsZSA6IGZpbGUpOworCisgIGlmIChsaW5lIDwgMCkKKyAgICByZXR1cm4gZmlsZV9uYW1lOworICBlbHNlCisgICAgcmV0dXJuIGZpbGVfbmFtZSArICI6IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lKTsKK30KKworCitHVGVzdExvZzo6R1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCisgICAgOiBzZXZlcml0eV8oc2V2ZXJpdHkpIHsKKyAgY29uc3QgY2hhciogY29uc3QgbWFya2VyID0KKyAgICAgIHNldmVyaXR5ID09IEdURVNUX0lORk8gPyAgICAiWyAgSU5GTyBdIiA6CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9XQVJOSU5HID8gIltXQVJOSU5HXSIgOgorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfRVJST1IgPyAgICJbIEVSUk9SIF0iIDogIlsgRkFUQUwgXSI7CisgIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsIDw8IG1hcmtlciA8PCAiICIKKyAgICAgICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCkgPDwgIjogIjsKK30KKworLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCitHVGVzdExvZzo6fkdUZXN0TG9nKCkgeworICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbDsKKyAgaWYgKHNldmVyaXR5XyA9PSBHVEVTVF9GQVRBTCkgeworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9Cit9CisvLyBEaXNhYmxlIE1pY3Jvc29mdCBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgUE9TSVggZnVuY3Rpb25zIGNhbGxlZCBmcm9tCisvLyB0aGlzIGNsYXNzIChjcmVhdCwgZHVwLCBkdXAyLCBhbmQgY2xvc2UpCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDk5NikKKyNlbmRpZiAgLy8gX01TQ19WRVIKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gT2JqZWN0IHRoYXQgY2FwdHVyZXMgYW4gb3V0cHV0IHN0cmVhbSAoc3Rkb3V0L3N0ZGVycikuCitjbGFzcyBDYXB0dXJlZFN0cmVhbSB7CisgcHVibGljOgorICAvLyBUaGUgY3RvciByZWRpcmVjdHMgdGhlIHN0cmVhbSB0byBhIHRlbXBvcmFyeSBmaWxlLgorICBleHBsaWNpdCBDYXB0dXJlZFN0cmVhbShpbnQgZmQpIDogZmRfKGZkKSwgdW5jYXB0dXJlZF9mZF8oZHVwKGZkKSkgeworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgY2hhciB0ZW1wX2Rpcl9wYXRoW01BWF9QQVRIICsgMV0gPSB7ICdcMCcgfTsgIC8vIE5PTElOVAorICAgIGNoYXIgdGVtcF9maWxlX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCisKKyAgICA6OkdldFRlbXBQYXRoQShzaXplb2YodGVtcF9kaXJfcGF0aCksIHRlbXBfZGlyX3BhdGgpOworICAgIGNvbnN0IFVJTlQgc3VjY2VzcyA9IDo6R2V0VGVtcEZpbGVOYW1lQSh0ZW1wX2Rpcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Rlc3RfcmVkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gR2VuZXJhdGUgdW5pcXVlIGZpbGUgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9maWxlX3BhdGgpOworICAgIEdURVNUX0NIRUNLXyhzdWNjZXNzICE9IDApCisgICAgICAgIDw8ICJVbmFibGUgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgaW4gIiA8PCB0ZW1wX2Rpcl9wYXRoOworICAgIGNvbnN0IGludCBjYXB0dXJlZF9mZCA9IGNyZWF0KHRlbXBfZmlsZV9wYXRoLCBfU19JUkVBRCB8IF9TX0lXUklURSk7CisgICAgR1RFU1RfQ0hFQ0tfKGNhcHR1cmVkX2ZkICE9IC0xKSA8PCAiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGVtcF9maWxlX3BhdGg7CisgICAgZmlsZW5hbWVfID0gdGVtcF9maWxlX3BhdGg7CisjIGVsc2UKKyAgICAvLyBUaGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGEgdGVzdCBoYXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBjdXJyZW50CisgICAgLy8gZGlyZWN0b3J5LCBzbyB3ZSBjcmVhdGUgdGhlIHRlbXBvcmFyeSBmaWxlIGluIHRoZSAvdG1wIGRpcmVjdG9yeQorICAgIC8vIGluc3RlYWQuIFdlIHVzZSAvdG1wIG9uIG1vc3Qgc3lzdGVtcywgYW5kIC9zZGNhcmQgb24gQW5kcm9pZC4KKyAgICAvLyBUaGF0J3MgYmVjYXVzZSBBbmRyb2lkIGRvZXNuJ3QgaGF2ZSAvdG1wLgorIyAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorICAgIC8vIE5vdGU6IEFuZHJvaWQgYXBwbGljYXRpb25zIGFyZSBleHBlY3RlZCB0byBjYWxsIHRoZSBmcmFtZXdvcmsncworICAgIC8vIENvbnRleHQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgbWV0aG9kIHRocm91Z2ggSk5JIHRvIGdldAorICAgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgd29ybGQtd3JpdGFibGUgU0QgQ2FyZCBkaXJlY3RvcnkuIEhvd2V2ZXIsCisgICAgLy8gdGhpcyByZXF1aXJlcyBhIENvbnRleHQgaGFuZGxlLCB3aGljaCBjYW5ub3QgYmUgcmV0cmlldmVkCisgICAgLy8gZ2xvYmFsbHkgZnJvbSBuYXRpdmUgY29kZS4gRG9pbmcgc28gYWxzbyBwcmVjbHVkZXMgcnVubmluZyB0aGUKKyAgICAvLyBjb2RlIGFzIHBhcnQgb2YgYSByZWd1bGFyIHN0YW5kYWxvbmUgZXhlY3V0YWJsZSwgd2hpY2ggZG9lc24ndAorICAgIC8vIHJ1biBpbiBhIERhbHZpayBwcm9jZXNzIChlLmcuIHdoZW4gcnVubmluZyBpdCB0aHJvdWdoICdhZGIgc2hlbGwnKS4KKyAgICAvLworICAgIC8vIFRoZSBsb2NhdGlvbiAvc2RjYXJkIGlzIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSBuYXRpdmUgY29kZQorICAgIC8vIGFuZCBpcyB0aGUgb25seSBsb2NhdGlvbiAodW5vZmZpY2lhbGx5KSBzdXBwb3J0ZWQgYnkgdGhlIEFuZHJvaWQKKyAgICAvLyB0ZWFtLiBJdCdzIGdlbmVyYWxseSBhIHN5bWxpbmsgdG8gdGhlIHJlYWwgU0QgQ2FyZCBtb3VudCBwb2ludAorICAgIC8vIHdoaWNoIGNhbiBiZSAvbW50L3NkY2FyZCwgL21udC9zZGNhcmQwLCAvc3lzdGVtL21lZGlhL3NkY2FyZCwgb3IKKyAgICAvLyBvdGhlciBPRU0tY3VzdG9taXplZCBsb2NhdGlvbnMuIE5ldmVyIHJlbHkgb24gdGhlc2UsIGFuZCBhbHdheXMKKyAgICAvLyB1c2UgL3NkY2FyZC4KKyAgICBjaGFyIG5hbWVfdGVtcGxhdGVbXSA9ICIvc2RjYXJkL2d0ZXN0X2NhcHR1cmVkX3N0cmVhbS5YWFhYWFgiOworIyAgZWxzZQorICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi90bXAvY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorICAgIGNvbnN0IGludCBjYXB0dXJlZF9mZCA9IG1rc3RlbXAobmFtZV90ZW1wbGF0ZSk7CisgICAgZmlsZW5hbWVfID0gbmFtZV90ZW1wbGF0ZTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICBmZmx1c2goTlVMTCk7CisgICAgZHVwMihjYXB0dXJlZF9mZCwgZmRfKTsKKyAgICBjbG9zZShjYXB0dXJlZF9mZCk7CisgIH0KKworICB+Q2FwdHVyZWRTdHJlYW0oKSB7CisgICAgcmVtb3ZlKGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RyaW5nKCkgeworICAgIGlmICh1bmNhcHR1cmVkX2ZkXyAhPSAtMSkgeworICAgICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgIGZmbHVzaChOVUxMKTsKKyAgICAgIGR1cDIodW5jYXB0dXJlZF9mZF8sIGZkXyk7CisgICAgICBjbG9zZSh1bmNhcHR1cmVkX2ZkXyk7CisgICAgICB1bmNhcHR1cmVkX2ZkXyA9IC0xOworICAgIH0KKworICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4oZmlsZW5hbWVfLmNfc3RyKCksICJyIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudCA9IFJlYWRFbnRpcmVGaWxlKGZpbGUpOworICAgIHBvc2l4OjpGQ2xvc2UoZmlsZSk7CisgICAgcmV0dXJuIGNvbnRlbnQ7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYW4gc3RkOjpzdHJpbmcuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKTsKKworICAvLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgorICBzdGF0aWMgc2l6ZV90IEdldEZpbGVTaXplKEZJTEUqIGZpbGUpOworCisgIGNvbnN0IGludCBmZF87ICAvLyBBIHN0cmVhbSB0byBjYXB0dXJlLgorICBpbnQgdW5jYXB0dXJlZF9mZF87CisgIC8vIE5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGhvbGRpbmcgdGhlIHN0ZGVyciBvdXRwdXQuCisgIDo6c3RkOjpzdHJpbmcgZmlsZW5hbWVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQ2FwdHVyZWRTdHJlYW0pOworfTsKKworLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4KK3NpemVfdCBDYXB0dXJlZFN0cmVhbTo6R2V0RmlsZVNpemUoRklMRSogZmlsZSkgeworICBmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGZ0ZWxsKGZpbGUpKTsKK30KKworLy8gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgZmlsZSBhcyBhIHN0cmluZy4KK3N0ZDo6c3RyaW5nIENhcHR1cmVkU3RyZWFtOjpSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKSB7CisgIGNvbnN0IHNpemVfdCBmaWxlX3NpemUgPSBHZXRGaWxlU2l6ZShmaWxlKTsKKyAgY2hhciogY29uc3QgYnVmZmVyID0gbmV3IGNoYXJbZmlsZV9zaXplXTsKKworICBzaXplX3QgYnl0ZXNfbGFzdF9yZWFkID0gMDsgIC8vICMgb2YgYnl0ZXMgcmVhZCBpbiB0aGUgbGFzdCBmcmVhZCgpCisgIHNpemVfdCBieXRlc19yZWFkID0gMDsgICAgICAgLy8gIyBvZiBieXRlcyByZWFkIHNvIGZhcgorCisgIGZzZWVrKGZpbGUsIDAsIFNFRUtfU0VUKTsKKworICAvLyBLZWVwcyByZWFkaW5nIHRoZSBmaWxlIHVudGlsIHdlIGNhbm5vdCByZWFkIGZ1cnRoZXIgb3IgdGhlCisgIC8vIHByZS1kZXRlcm1pbmVkIGZpbGUgc2l6ZSBpcyByZWFjaGVkLgorICBkbyB7CisgICAgYnl0ZXNfbGFzdF9yZWFkID0gZnJlYWQoYnVmZmVyK2J5dGVzX3JlYWQsIDEsIGZpbGVfc2l6ZS1ieXRlc19yZWFkLCBmaWxlKTsKKyAgICBieXRlc19yZWFkICs9IGJ5dGVzX2xhc3RfcmVhZDsKKyAgfSB3aGlsZSAoYnl0ZXNfbGFzdF9yZWFkID4gMCAmJiBieXRlc19yZWFkIDwgZmlsZV9zaXplKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50KGJ1ZmZlciwgYnl0ZXNfcmVhZCk7CisgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICByZXR1cm4gY29udGVudDsKK30KKworIyBpZmRlZiBfTVNDX1ZFUgorIyAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyBlbmRpZiAgLy8gX01TQ19WRVIKKworc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZGVyciA9IE5VTEw7CitzdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3Rkb3V0ID0gTlVMTDsKKworLy8gU3RhcnRzIGNhcHR1cmluZyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KK3ZvaWQgQ2FwdHVyZVN0cmVhbShpbnQgZmQsIGNvbnN0IGNoYXIqIHN0cmVhbV9uYW1lLCBDYXB0dXJlZFN0cmVhbSoqIHN0cmVhbSkgeworICBpZiAoKnN0cmVhbSAhPSBOVUxMKSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIk9ubHkgb25lICIgPDwgc3RyZWFtX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGNhcHR1cmVyIGNhbiBleGlzdCBhdCBhIHRpbWUuIjsKKyAgfQorICAqc3RyZWFtID0gbmV3IENhcHR1cmVkU3RyZWFtKGZkKTsKK30KKworLy8gU3RvcHMgY2FwdHVyaW5nIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0cmVhbShDYXB0dXJlZFN0cmVhbSoqIGNhcHR1cmVkX3N0cmVhbSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50ID0gKCpjYXB0dXJlZF9zdHJlYW0pLT5HZXRDYXB0dXJlZFN0cmluZygpOworCisgIGRlbGV0ZSAqY2FwdHVyZWRfc3RyZWFtOworICAqY2FwdHVyZWRfc3RyZWFtID0gTlVMTDsKKworICByZXR1cm4gY29udGVudDsKK30KKworLy8gU3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCit2b2lkIENhcHR1cmVTdGRvdXQoKSB7CisgIENhcHR1cmVTdHJlYW0oa1N0ZE91dEZpbGVubywgInN0ZG91dCIsICZnX2NhcHR1cmVkX3N0ZG91dCk7Cit9CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgordm9pZCBDYXB0dXJlU3RkZXJyKCkgeworICBDYXB0dXJlU3RyZWFtKGtTdGRFcnJGaWxlbm8sICJzdGRlcnIiLCAmZ19jYXB0dXJlZF9zdGRlcnIpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpIHsKKyAgcmV0dXJuIEdldENhcHR1cmVkU3RyZWFtKCZnX2NhcHR1cmVkX3N0ZG91dCk7Cit9CisKKy8vIFN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK3N0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RkZXJyKCkgeworICByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3RkZXJyKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KKzo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4gZ19hcmd2czsKKworc3RhdGljIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTDsgIC8vIE93bmVkLgorCit2b2lkIFNldEluamVjdGFibGVBcmd2cyhjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KiBhcmd2cykgeworICBpZiAoZ19pbmplY3RlZF90ZXN0X2FyZ3ZzICE9IGFyZ3ZzKQorICAgIGRlbGV0ZSBnX2luamVjdGVkX3Rlc3RfYXJndnM7CisgIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9IGFyZ3ZzOworfQorCitjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+JiBHZXRJbmplY3RhYmxlQXJndnMoKSB7CisgIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gTlVMTCkgeworICAgIHJldHVybiAqZ19pbmplY3RlZF90ZXN0X2FyZ3ZzOworICB9CisgIHJldHVybiBnX2FyZ3ZzOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK25hbWVzcGFjZSBwb3NpeCB7Cit2b2lkIEFib3J0KCkgeworICBEZWJ1Z0JyZWFrKCk7CisgIFRlcm1pbmF0ZVByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgMSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcG9zaXgKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUKKy8vIGdpdmVuIGZsYWcuICBGb3IgZXhhbXBsZSwgRmxhZ1RvRW52VmFyKCJmb28iKSB3aWxsIHJldHVybgorLy8gIkdURVNUX0ZPTyIgaW4gdGhlIG9wZW4tc291cmNlIHZlcnNpb24uCitzdGF0aWMgc3RkOjpzdHJpbmcgRmxhZ1RvRW52VmFyKGNvbnN0IGNoYXIqIGZsYWcpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZnVsbF9mbGFnID0KKyAgICAgIChNZXNzYWdlKCkgPDwgR1RFU1RfRkxBR19QUkVGSVhfIDw8IGZsYWcpLkdldFN0cmluZygpOworCisgIE1lc3NhZ2UgZW52X3ZhcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gZnVsbF9mbGFnLmxlbmd0aCgpOyBpKyspIHsKKyAgICBlbnZfdmFyIDw8IFRvVXBwZXIoZnVsbF9mbGFnLmNfc3RyKClbaV0pOworICB9CisKKyAgcmV0dXJuIGVudl92YXIuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMKKy8vIHRoZSByZXN1bHQgdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlCisvLyB1bmNoYW5nZWQgYW5kIHJldHVybnMgZmFsc2UuCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKSB7CisgIC8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBkZWNpbWFsIGludGVnZXIuCisgIGNoYXIqIGVuZCA9IE5VTEw7CisgIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVAorCisgIC8vIEhhcyBzdHJ0b2woKSBjb25zdW1lZCBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nPworICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgLy8gTm8gLSBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgZW5jb3VudGVyZWQuCisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0CisgICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgorICAgICAgICA8PCAiIGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7CisgICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KKyAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOworICBpZiAobG9uZ192YWx1ZSA9PSBMT05HX01BWCB8fCBsb25nX3ZhbHVlID09IExPTkdfTUlOIHx8CisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucworICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKKyAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KKyAgICAgICkgeworICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAorICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKKyAgICAgICAgPDwgIiBoYXMgdmFsdWUgIiA8PCBzdHIgPDwgIiwgd2hpY2ggb3ZlcmZsb3dzLlxuIjsKKyAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBCb29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KKy8vCisvLyBUaGUgdmFsdWUgaXMgY29uc2lkZXJlZCB0cnVlIGlmZiBpdCdzIG5vdCAiMCIuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgcmV0dXJuIHN0cmluZ192YWx1ZSA9PSBOVUxMID8KKyAgICAgIGRlZmF1bHRfdmFsdWUgOiBzdHJjbXAoc3RyaW5nX3ZhbHVlLCAiMCIpICE9IDA7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIGEgMzItYml0IGludGVnZXIgc3RvcmVkIGluIHRoZSBlbnZpcm9ubWVudAorLy8gdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQgaXNuJ3Qgc2V0IG9yCisvLyBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIDMyLWJpdCBpbnRlZ2VyLCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitJbnQzMiBJbnQzMkZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgaWYgKHN0cmluZ192YWx1ZSA9PSBOVUxMKSB7CisgICAgLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKworICBJbnQzMiByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOworICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJFbnZpcm9ubWVudCB2YXJpYWJsZSAiIDw8IGVudl92YXIsCisgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWUsICZyZXN1bHQpKSB7CisgICAgcHJpbnRmKCJUaGUgZGVmYXVsdCB2YWx1ZSAlcyBpcyB1c2VkLlxuIiwKKyAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCBkZWZhdWx0X3ZhbHVlKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bworLy8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0J3Mgbm90IHNldCwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorY29uc3QgY2hhciogU3RyaW5nRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiB2YWx1ZSA9PSBOVUxMID8gZGVmYXVsdF92YWx1ZSA6IHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1wcmludGVycy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0LXByaW50ZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZmE0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC1wcmludGVycy5jYwpAQCAtMCwwICsxLDM2MyBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIFRlc3QgLSBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgdGhhdCBjYW4gcHJpbnQgYQorLy8gdmFsdWUgb2YgYW55IHR5cGUgVDoKKy8vCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKTsKKy8vCisvLyBJdCB1c2VzIHRoZSA8PCBvcGVyYXRvciB3aGVuIHBvc3NpYmxlLCBhbmQgcHJpbnRzIHRoZSBieXRlcyBpbiB0aGUKKy8vIG9iamVjdCBvdGhlcndpc2UuICBBIHVzZXIgY2FuIG92ZXJyaWRlIGl0cyBiZWhhdmlvciBmb3IgYSBjbGFzcworLy8gdHlwZSBGb28gYnkgZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mLCBjb25zdCBGb28mKQorLy8gb3Igdm9pZCBQcmludFRvKGNvbnN0IEZvbyYsIDo6c3RkOjpvc3RyZWFtKikgaW4gdGhlIG5hbWVzcGFjZSB0aGF0CisvLyBkZWZpbmVzIEZvby4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6c3RkOjpvc3RyZWFtOworCisvLyBQcmludHMgYSBzZWdtZW50IG9mIGJ5dGVzIGluIHRoZSBnaXZlbiBvYmplY3QuCit2b2lkIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIG9zdHJlYW0qIG9zKSB7CisgIGNoYXIgdGV4dFs1XSA9ICIiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisgICAgY29uc3Qgc2l6ZV90IGogPSBzdGFydCArIGk7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgLy8gT3JnYW5pemVzIHRoZSBieXRlcyBpbnRvIGdyb3VwcyBvZiAyIGZvciBlYXN5IHBhcnNpbmcgYnkKKyAgICAgIC8vIGh1bWFuLgorICAgICAgaWYgKChqICUgMikgPT0gMCkKKyAgICAgICAgKm9zIDw8ICcgJzsKKyAgICAgIGVsc2UKKyAgICAgICAgKm9zIDw8ICctJzsKKyAgICB9CisgICAgR1RFU1RfU05QUklOVEZfKHRleHQsIHNpemVvZih0ZXh0KSwgIiUwMlgiLCBvYmpfYnl0ZXNbal0pOworICAgICpvcyA8PCB0ZXh0OworICB9Cit9CisKKy8vIFByaW50cyB0aGUgYnl0ZXMgaW4gdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLgordm9pZCBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwoY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgeworICAvLyBUZWxscyB0aGUgdXNlciBob3cgYmlnIHRoZSBvYmplY3QgaXMuCisgICpvcyA8PCBjb3VudCA8PCAiLWJ5dGUgb2JqZWN0IDwiOworCisgIGNvbnN0IHNpemVfdCBrVGhyZXNob2xkID0gMTMyOworICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDY0OworICAvLyBJZiB0aGUgb2JqZWN0IHNpemUgaXMgYmlnZ2VyIHRoYW4ga1RocmVzaG9sZCwgd2UnbGwgaGF2ZSB0byBvbWl0CisgIC8vIHNvbWUgZGV0YWlscyBieSBwcmludGluZyBvbmx5IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3Qga0NodW5rU2l6ZQorICAvLyBieXRlcy4KKyAgLy8gVE9ETyh3YW4pOiBsZXQgdGhlIHVzZXIgY29udHJvbCB0aGUgdGhyZXNob2xkIHVzaW5nIGEgZmxhZy4KKyAgaWYgKGNvdW50IDwga1RocmVzaG9sZCkgeworICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgMCwgY291bnQsIG9zKTsKKyAgfSBlbHNlIHsKKyAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGtDaHVua1NpemUsIG9zKTsKKyAgICAqb3MgPDwgIiAuLi4gIjsKKyAgICAvLyBSb3VuZHMgdXAgdG8gMi1ieXRlIGJvdW5kYXJ5LgorICAgIGNvbnN0IHNpemVfdCByZXN1bWVfcG9zID0gKGNvdW50IC0ga0NodW5rU2l6ZSArIDEpLzIqMjsKKyAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIHJlc3VtZV9wb3MsIGNvdW50IC0gcmVzdW1lX3Bvcywgb3MpOworICB9CisgICpvcyA8PCAiPiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgaW50ZXJuYWwyIHsKKworLy8gRGVsZWdhdGVzIHRvIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbCgpIHRvIHByaW50IHRoZSBieXRlcyBpbiB0aGUKKy8vIGdpdmVuIG9iamVjdC4gIFRoZSBkZWxlZ2F0aW9uIHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uLCB3aGljaAorLy8gdXNlcyB0aGUgPDwgb3BlcmF0b3IgYW5kIHRodXMgaXMgZWFzaWVyIGRvbmUgb3V0c2lkZSBvZiB0aGUKKy8vIDo6dGVzdGluZzo6aW50ZXJuYWwgbmFtZXNwYWNlLCB3aGljaCBjb250YWlucyBhIDw8IG9wZXJhdG9yIHRoYXQKKy8vIHNvbWV0aW1lcyBjb25mbGljdHMgd2l0aCB0aGUgb25lIGluIFNUTC4KK3ZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbChvYmpfYnl0ZXMsIGNvdW50LCBvcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbDIKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBhIGNoYXIgKG9yIHdjaGFyX3QpLCB3ZSBwcmludCBpdCBpbiBvbmUKKy8vIG9mIHRocmVlIGZvcm1hdHM6CisvLyAgIC0gYXMgaXMgaWYgaXQncyBhIHByaW50YWJsZSBBU0NJSSAoZS5nLiAnYScsICcyJywgJyAnKSwKKy8vICAgLSBhcyBhIGhleGlkZWNpbWFsIGVzY2FwZSBzZXF1ZW5jZSAoZS5nLiAnXHg3RicpLCBvcgorLy8gICAtIGFzIGEgc3BlY2lhbCBlc2NhcGUgc2VxdWVuY2UgKGUuZy4gJ1xyJywgJ1xuJykuCitlbnVtIENoYXJGb3JtYXQgeworICBrQXNJcywKKyAga0hleEVzY2FwZSwKKyAga1NwZWNpYWxFc2NhcGUKK307CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBjIGlzIGEgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3Rlci4gIFdlIHRlc3QgdGhlCisvLyB2YWx1ZSBvZiBjIGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsbGluZyBpc3ByaW50KCksIHdoaWNoIGlzIGJ1Z2d5IG9uCisvLyBXaW5kb3dzIE1vYmlsZS4KK2lubGluZSBib29sIElzUHJpbnRhYmxlQXNjaWkod2NoYXJfdCBjKSB7CisgIHJldHVybiAweDIwIDw9IGMgJiYgYyA8PSAweDdFOworfQorCisvLyBQcmludHMgYSB3aWRlIG9yIG5hcnJvdyBjaGFyIGMgYXMgYSBjaGFyYWN0ZXIgbGl0ZXJhbCB3aXRob3V0IHRoZQorLy8gcXVvdGVzLCBlc2NhcGluZyBpdCB3aGVuIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgorLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IFVuc2lnbmVkQ2hhciBpcyB0aGUgdW5zaWduZWQgdmVyc2lvbiBvZiBDaGFyLAorLy8gd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBVbnNpZ25lZENoYXIsIHR5cGVuYW1lIENoYXI+CitzdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzQ2hhckxpdGVyYWxUbyhDaGFyIGMsIG9zdHJlYW0qIG9zKSB7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oYykpIHsKKyAgICBjYXNlIEwnXDAnOgorICAgICAgKm9zIDw8ICJcXDAiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1wnJzoKKyAgICAgICpvcyA8PCAiXFwnIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcXCc6CisgICAgICAqb3MgPDwgIlxcXFwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xhJzoKKyAgICAgICpvcyA8PCAiXFxhIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcYic6CisgICAgICAqb3MgPDwgIlxcYiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGYnOgorICAgICAgKm9zIDw8ICJcXGYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xuJzoKKyAgICAgICpvcyA8PCAiXFxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdccic6CisgICAgICAqb3MgPDwgIlxcciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXHQnOgorICAgICAgKm9zIDw8ICJcXHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1x2JzoKKyAgICAgICpvcyA8PCAiXFx2IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoSXNQcmludGFibGVBc2NpaShjKSkgeworICAgICAgICAqb3MgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oYyk7CisgICAgICAgIHJldHVybiBrQXNJczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpvcyA8PCAiXFx4IiArIFN0cmluZzo6Rm9ybWF0SGV4SW50KHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpOworICAgICAgICByZXR1cm4ga0hleEVzY2FwZTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7Cit9CisKKy8vIFByaW50cyBhIHdjaGFyX3QgYyBhcyBpZiBpdCdzIHBhcnQgb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZXNjYXBpbmcgaXQgd2hlbgorLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCitzdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKHdjaGFyX3QgYywgb3N0cmVhbSogb3MpIHsKKyAgc3dpdGNoIChjKSB7CisgICAgY2FzZSBMJ1wnJzoKKyAgICAgICpvcyA8PCAiJyI7CisgICAgICByZXR1cm4ga0FzSXM7CisgICAgY2FzZSBMJyInOgorICAgICAgKm9zIDw8ICJcXFwiIjsKKyAgICAgIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFByaW50QXNDaGFyTGl0ZXJhbFRvPHdjaGFyX3Q+KGMsIG9zKTsKKyAgfQorfQorCisvLyBQcmludHMgYSBjaGFyIGMgYXMgaWYgaXQncyBwYXJ0IG9mIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwaW5nIGl0IHdoZW4KKy8vIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgorc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyhjaGFyIGMsIG9zdHJlYW0qIG9zKSB7CisgIHJldHVybiBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKAorICAgICAgc3RhdGljX2Nhc3Q8d2NoYXJfdD4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYykpLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIHdpZGUgb3IgbmFycm93IGNoYXJhY3RlciBjIGFuZCBpdHMgY29kZS4gICdcMCcgaXMgcHJpbnRlZAorLy8gYXMgIidcXDAnIiwgb3RoZXIgdW5wcmludGFibGUgY2hhcmFjdGVycyBhcmUgYWxzbyBwcm9wZXJseSBlc2NhcGVkCisvLyB1c2luZyB0aGUgc3RhbmRhcmQgQysrIGVzY2FwZSBzZXF1ZW5jZS4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAorLy8gVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsIHdoaWNoIGlzIHRoZSB0eXBlIG9mIGMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPgordm9pZCBQcmludENoYXJBbmRDb2RlVG8oQ2hhciBjLCBvc3RyZWFtKiBvcykgeworICAvLyBGaXJzdCwgcHJpbnQgYyBhcyBhIGxpdGVyYWwgaW4gdGhlIG1vc3QgcmVhZGFibGUgZm9ybSB3ZSBjYW4gZmluZC4KKyAgKm9zIDw8ICgoc2l6ZW9mKGMpID4gMSkgPyAiTCciIDogIiciKTsKKyAgY29uc3QgQ2hhckZvcm1hdCBmb3JtYXQgPSBQcmludEFzQ2hhckxpdGVyYWxUbzxVbnNpZ25lZENoYXI+KGMsIG9zKTsKKyAgKm9zIDw8ICInIjsKKworICAvLyBUbyBhaWQgdXNlciBkZWJ1Z2dpbmcsIHdlIGFsc28gcHJpbnQgYydzIGNvZGUgaW4gZGVjaW1hbCwgdW5sZXNzCisgIC8vIGl0J3MgMCAoaW4gd2hpY2ggY2FzZSBjIHdhcyBwcmludGVkIGFzICdcXDAnLCBtYWtpbmcgdGhlIGNvZGUKKyAgLy8gb2J2aW91cykuCisgIGlmIChjID09IDApCisgICAgcmV0dXJuOworICAqb3MgPDwgIiAoIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGMpOworCisgIC8vIEZvciBtb3JlIGNvbnZlbmllbmNlLCB3ZSBwcmludCBjJ3MgY29kZSBhZ2FpbiBpbiBoZXhpZGVjaW1hbCwKKyAgLy8gdW5sZXNzIGMgd2FzIGFscmVhZHkgcHJpbnRlZCBpbiB0aGUgZm9ybSAnXHgjIycgb3IgdGhlIGNvZGUgaXMgaW4KKyAgLy8gWzEsIDldLgorICBpZiAoZm9ybWF0ID09IGtIZXhFc2NhcGUgfHwgKDEgPD0gYyAmJiBjIDw9IDkpKSB7CisgICAgLy8gRG8gbm90aGluZy4KKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgIiwgMHgiIDw8IFN0cmluZzo6Rm9ybWF0SGV4SW50KHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpOworICB9CisgICpvcyA8PCAiKSI7Cit9CisKK3ZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludENoYXJBbmRDb2RlVG88dW5zaWduZWQgY2hhcj4oYywgb3MpOworfQordm9pZCBQcmludFRvKHNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludENoYXJBbmRDb2RlVG88dW5zaWduZWQgY2hhcj4oYywgb3MpOworfQorCisvLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwKKy8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBjb2RlLiAgTCdcMCcgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4KK3ZvaWQgUHJpbnRUbyh3Y2hhcl90IHdjLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJBbmRDb2RlVG88d2NoYXJfdD4od2MsIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBvc3RyZWFtLiAgQ2hhclR5cGUgbXVzdCBiZSBlaXRoZXIKKy8vIGNoYXIgb3Igd2NoYXJfdC4KKy8vIFRoZSBhcnJheSBzdGFydHMgYXQgYmVnaW4sIHRoZSBsZW5ndGggaXMgbGVuLCBpdCBtYXkgaW5jbHVkZSAnXDAnIGNoYXJhY3RlcnMKKy8vIGFuZCBtYXkgbm90IGJlIE5VTC10ZXJtaW5hdGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgorc3RhdGljIHZvaWQgUHJpbnRDaGFyc0FzU3RyaW5nVG8oCisgICAgY29uc3QgQ2hhclR5cGUqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICBjb25zdCBjaGFyKiBjb25zdCBrUXVvdGVCZWdpbiA9IHNpemVvZihDaGFyVHlwZSkgPT0gMSA/ICJcIiIgOiAiTFwiIjsKKyAgKm9zIDw8IGtRdW90ZUJlZ2luOworICBib29sIGlzX3ByZXZpb3VzX2hleCA9IGZhbHNlOworICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbGVuOyArK2luZGV4KSB7CisgICAgY29uc3QgQ2hhclR5cGUgY3VyID0gYmVnaW5baW5kZXhdOworICAgIGlmIChpc19wcmV2aW91c19oZXggJiYgSXNYRGlnaXQoY3VyKSkgeworICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIGlzIG9mICdceC4uJyBmb3JtIGFuZCB0aGlzIGNoYXJhY3RlciBjYW4gYmUKKyAgICAgIC8vIGludGVycHJldGVkIGFzIGFub3RoZXIgaGV4YWRlY2ltYWwgZGlnaXQgaW4gaXRzIG51bWJlci4gQnJlYWsgc3RyaW5nIHRvCisgICAgICAvLyBkaXNhbWJpZ3VhdGUuCisgICAgICAqb3MgPDwgIlwiICIgPDwga1F1b3RlQmVnaW47CisgICAgfQorICAgIGlzX3ByZXZpb3VzX2hleCA9IFByaW50QXNTdHJpbmdMaXRlcmFsVG8oY3VyLCBvcykgPT0ga0hleEVzY2FwZTsKKyAgfQorICAqb3MgPDwgIlwiIjsKK30KKworLy8gUHJpbnRzIGEgKGNvbnN0KSBjaGFyL3djaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MKKy8vICdiZWdpbicuICBDaGFyVHlwZSBtdXN0IGJlIGVpdGhlciBjaGFyIG9yIHdjaGFyX3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CitzdGF0aWMgdm9pZCBVbml2ZXJzYWxQcmludENoYXJBcnJheSgKKyAgICBjb25zdCBDaGFyVHlwZSogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7CisgIC8vIFRoZSBjb2RlCisgIC8vICAgY29uc3QgY2hhciBrRm9vW10gPSAiZm9vIjsKKyAgLy8gZ2VuZXJhdGVzIGFuIGFycmF5IG9mIDQsIG5vdCAzLCBlbGVtZW50cywgd2l0aCB0aGUgbGFzdCBvbmUgYmVpbmcgJ1wwJy4KKyAgLy8KKyAgLy8gVGhlcmVmb3JlIHdoZW4gcHJpbnRpbmcgYSBjaGFyIGFycmF5LCB3ZSBkb24ndCBwcmludCB0aGUgbGFzdCBlbGVtZW50IGlmCisgIC8vIGl0J3MgJ1wwJywgc3VjaCB0aGF0IHRoZSBvdXRwdXQgbWF0Y2hlcyB0aGUgc3RyaW5nIGxpdGVyYWwgYXMgaXQncworICAvLyB3cml0dGVuIGluIHRoZSBzb3VyY2UgY29kZS4KKyAgaWYgKGxlbiA+IDAgJiYgYmVnaW5bbGVuIC0gMV0gPT0gJ1wwJykgeworICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4gLSAxLCBvcyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSWYsIGhvd2V2ZXIsIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIG5vdCAnXDAnLCBlLmcuCisgIC8vICAgIGNvbnN0IGNoYXIga0Zvb1tdID0geyAnZicsICdvJywgJ28nIH07CisgIC8vIHdlIG11c3QgcHJpbnQgdGhlIGVudGlyZSBhcnJheS4gIFdlIGFsc28gcHJpbnQgYSBtZXNzYWdlIHRvIGluZGljYXRlCisgIC8vIHRoYXQgdGhlIGFycmF5IGlzIG5vdCBOVUwtdGVybWluYXRlZC4KKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8oYmVnaW4sIGxlbiwgb3MpOworICAqb3MgPDwgIiAobm8gdGVybWluYXRpbmcgTlVMKSI7Cit9CisKKy8vIFByaW50cyBhIChjb25zdCkgY2hhciBhcnJheSBvZiAnbGVuJyBlbGVtZW50cywgc3RhcnRpbmcgYXQgYWRkcmVzcyAnYmVnaW4nLgordm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IGNoYXIqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxQcmludENoYXJBcnJheShiZWdpbiwgbGVuLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIChjb25zdCkgd2NoYXJfdCBhcnJheSBvZiAnbGVuJyBlbGVtZW50cywgc3RhcnRpbmcgYXQgYWRkcmVzcworLy8gJ2JlZ2luJy4KK3ZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCB3Y2hhcl90KiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoYmVnaW4sIGxlbiwgb3MpOworfQorCisvLyBQcmludHMgdGhlIGdpdmVuIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgordm9pZCBQcmludFRvKGNvbnN0IGNoYXIqIHMsIG9zdHJlYW0qIG9zKSB7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICAqb3MgPDwgIk5VTEwiOworICB9IGVsc2UgeworICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7CisgICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocywgc3RybGVuKHMpLCBvcyk7CisgIH0KK30KKworLy8gTVNWQyBjb21waWxlciBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2hhcl90IGFzIGEgdHlwZWRlZgorLy8gb2YgdW5zaWduZWQgc2hvcnQuIERlZmluaW5nIGFuIG92ZXJsb2FkIGZvciBjb25zdCB3Y2hhcl90KiBpbiB0aGF0IGNhc2UKKy8vIHdvdWxkIGNhdXNlIHBvaW50ZXJzIHRvIHVuc2lnbmVkIHNob3J0cyBiZSBwcmludGVkIGFzIHdpZGUgc3RyaW5ncywKKy8vIHBvc3NpYmx5IGFjY2Vzc2luZyBtb3JlIG1lbW9yeSB0aGFuIGludGVuZGVkIGFuZCBjYXVzaW5nIGludmFsaWQKKy8vIG1lbW9yeSBhY2Nlc3Nlcy4gTVNWQyBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHN5bWJvbCB3aGVuCisvLyB3Y2hhcl90IGlzIGltcGxlbWVudGVkIGFzIGEgbmF0aXZlIHR5cGUuCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX05BVElWRV9XQ0hBUl9UX0RFRklORUQpCisvLyBQcmludHMgdGhlIGdpdmVuIHdpZGUgQyBzdHJpbmcgdG8gdGhlIG9zdHJlYW0uCit2b2lkIFByaW50VG8oY29uc3Qgd2NoYXJfdCogcywgb3N0cmVhbSogb3MpIHsKKyAgaWYgKHMgPT0gTlVMTCkgeworICAgICpvcyA8PCAiTlVMTCI7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8IEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpIDw8ICIgcG9pbnRpbmcgdG8gIjsKKyAgICBQcmludENoYXJzQXNTdHJpbmdUbyhzLCB3Y3NsZW4ocyksIG9zKTsKKyAgfQorfQorI2VuZGlmICAvLyB3Y2hhcl90IGlzIG5hdGl2ZQorCisvLyBQcmludHMgYSA6OnN0cmluZyBvYmplY3QuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK3ZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKK3ZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKworLy8gUHJpbnRzIGEgOjp3c3RyaW5nIG9iamVjdC4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK3ZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK3ZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwZWVmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0LXRlc3QtcGFydC5jYwpAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbDsKKworLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlIGJ5IG9taXR0aW5nIHRoZSBzdGFjayB0cmFjZQorLy8gaW4gaXQuCitzdGQ6OnN0cmluZyBUZXN0UGFydFJlc3VsdDo6RXh0cmFjdFN1bW1hcnkoY29uc3QgY2hhciogbWVzc2FnZSkgeworICBjb25zdCBjaGFyKiBjb25zdCBzdGFja190cmFjZSA9IHN0cnN0cihtZXNzYWdlLCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIpOworICByZXR1cm4gc3RhY2tfdHJhY2UgPT0gTlVMTCA/IG1lc3NhZ2UgOgorICAgICAgc3RkOjpzdHJpbmcobWVzc2FnZSwgc3RhY2tfdHJhY2UpOworfQorCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gb3MKKyAgICAgIDw8IHJlc3VsdC5maWxlX25hbWUoKSA8PCAiOiIgPDwgcmVzdWx0LmxpbmVfbnVtYmVyKCkgPDwgIjogIgorICAgICAgPDwgKHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzID8gIlN1Y2Nlc3MiIDoKKyAgICAgICAgICByZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlID8gIkZhdGFsIGZhaWx1cmUiIDoKKyAgICAgICAgICAiTm9uLWZhdGFsIGZhaWx1cmUiKSA8PCAiOlxuIgorICAgICAgPDwgcmVzdWx0Lm1lc3NhZ2UoKSA8PCBzdGQ6OmVuZGw7Cit9CisKKy8vIEFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgYXJyYXkuCit2b2lkIFRlc3RQYXJ0UmVzdWx0QXJyYXk6OkFwcGVuZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIGFycmF5Xy5wdXNoX2JhY2socmVzdWx0KTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KK2NvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UGFydFJlc3VsdEFycmF5OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCkpIHsKKyAgICBwcmludGYoIlxuSW52YWxpZCBpbmRleCAoJWQpIGludG8gVGVzdFBhcnRSZXN1bHRBcnJheS5cbiIsIGluZGV4KTsKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIH0KKworICByZXR1cm4gYXJyYXlfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgoraW50IFRlc3RQYXJ0UmVzdWx0QXJyYXk6OnNpemUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGFycmF5Xy5zaXplKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpCisgICAgOiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfKGZhbHNlKSwKKyAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyhHZXRVbml0VGVzdEltcGwoKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSkgeworICBHZXRVbml0VGVzdEltcGwoKS0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7Cit9CisKK0hhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6fkhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpIHsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgICAgb3JpZ2luYWxfcmVwb3J0ZXJfKTsKK30KKwordm9pZCBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgaWYgKHJlc3VsdC5mYXRhbGx5X2ZhaWxlZCgpKQorICAgIGhhc19uZXdfZmF0YWxfZmFpbHVyZV8gPSB0cnVlOworICBvcmlnaW5hbF9yZXBvcnRlcl8tPlJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNzlmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgaW4gc3RyLiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBzdHIKKy8vIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgorc3RhdGljIGNvbnN0IGNoYXIqIFNraXBTcGFjZXMoY29uc3QgY2hhciogc3RyKSB7CisgIHdoaWxlIChJc1NwYWNlKCpzdHIpKQorICAgIHN0cisrOworICByZXR1cm4gc3RyOworfQorCisvLyBWZXJpZmllcyB0aGF0IHJlZ2lzdGVyZWRfdGVzdHMgbWF0Y2ggdGhlIHRlc3QgbmFtZXMgaW4KKy8vIGRlZmluZWRfdGVzdF9uYW1lc187IHJldHVybnMgcmVnaXN0ZXJlZF90ZXN0cyBpZiBzdWNjZXNzZnVsLCBvcgorLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KK2NvbnN0IGNoYXIqIFR5cGVkVGVzdENhc2VQU3RhdGU6OlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoCisgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIHJlZ2lzdGVyZWRfdGVzdHMpIHsKKyAgdHlwZWRlZiA6OnN0ZDo6c2V0PGNvbnN0IGNoYXIqPjo6Y29uc3RfaXRlcmF0b3IgRGVmaW5lZFRlc3RJdGVyOworICByZWdpc3RlcmVkXyA9IHRydWU7CisKKyAgLy8gU2tpcCBpbml0aWFsIHdoaXRlc3BhY2UgaW4gcmVnaXN0ZXJlZF90ZXN0cyBzaW5jZSBzb21lCisgIC8vIHByZXByb2Nlc3NvcnMgcHJlZml4IHN0cmluZ2l6aWVkIGxpdGVyYWxzIHdpdGggd2hpdGVzcGFjZS4KKyAgcmVnaXN0ZXJlZF90ZXN0cyA9IFNraXBTcGFjZXMocmVnaXN0ZXJlZF90ZXN0cyk7CisKKyAgTWVzc2FnZSBlcnJvcnM7CisgIDo6c3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRlc3RzOworICBmb3IgKGNvbnN0IGNoYXIqIG5hbWVzID0gcmVnaXN0ZXJlZF90ZXN0czsgbmFtZXMgIT0gTlVMTDsKKyAgICAgICBuYW1lcyA9IFNraXBDb21tYShuYW1lcykpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gR2V0UHJlZml4VW50aWxDb21tYShuYW1lcyk7CisgICAgaWYgKHRlc3RzLmNvdW50KG5hbWUpICE9IDApIHsKKyAgICAgIGVycm9ycyA8PCAiVGVzdCAiIDw8IG5hbWUgPDwgIiBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UuXG4iOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAoRGVmaW5lZFRlc3RJdGVyIGl0ID0gZGVmaW5lZF90ZXN0X25hbWVzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gZGVmaW5lZF90ZXN0X25hbWVzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmIChuYW1lID09ICppdCkgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3VuZCkgeworICAgICAgdGVzdHMuaW5zZXJ0KG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBlcnJvcnMgPDwgIk5vIHRlc3QgbmFtZWQgIiA8PCBuYW1lCisgICAgICAgICAgICAgPDwgIiBjYW4gYmUgZm91bmQgaW4gdGhpcyB0ZXN0IGNhc2UuXG4iOworICAgIH0KKyAgfQorCisgIGZvciAoRGVmaW5lZFRlc3RJdGVyIGl0ID0gZGVmaW5lZF90ZXN0X25hbWVzXy5iZWdpbigpOworICAgICAgIGl0ICE9IGRlZmluZWRfdGVzdF9uYW1lc18uZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIGlmICh0ZXN0cy5jb3VudCgqaXQpID09IDApIHsKKyAgICAgIGVycm9ycyA8PCAiWW91IGZvcmdvdCB0byBsaXN0IHRlc3QgIiA8PCAqaXQgPDwgIi5cbiI7CisgICAgfQorICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yc19zdHIgPSBlcnJvcnMuR2V0U3RyaW5nKCk7CisgIGlmIChlcnJvcnNfc3RyICE9ICIiKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyAlcyIsIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLAorICAgICAgICAgICAgZXJyb3JzX3N0ci5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorCisgIHJldHVybiByZWdpc3RlcmVkX3Rlc3RzOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3NyYy9ndGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGU1M2RkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3QuY2MKQEAgLTAsMCArMSw1MDE1IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx3Y2hhci5oPgorI2luY2x1ZGUgPHdjdHlwZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmIEdURVNUX09TX0xJTlVYCisKKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gZ2V0dGltZW9mZGF5KCkuCisjIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisKKyMgaW5jbHVkZSA8ZmNudGwuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxsaW1pdHMuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzY2hlZC5oPiAgLy8gTk9MSU5UCisvLyBEZWNsYXJlcyB2c25wcmludGYoKS4gIFRoaXMgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KKyMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy9tbWFuLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzdHJpbmc+CisKKyNlbGlmIEdURVNUX09TX1NZTUJJQU4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19aT1MKKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorCisvLyBPbiB6L09TIHdlIGFkZGl0aW9uYWxseSBuZWVkIHN0cmluZ3MuaCBmb3Igc3RyY2FzZWNtcC4KKyMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCisKKyNlbGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAvLyBXZSBhcmUgb24gV2luZG93cyBDRS4KKworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgcHJvcGVyLgorCisjIGluY2x1ZGUgPGlvLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL3RpbWViLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4gIC8vIE5PTElOVAorCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTUlOR1cKKy8vIE1pbkdXIGhhcyBnZXR0aW1lb2ZkYXkoKSBidXQgbm90IF9mdGltZTY0KCkuCisvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YKKy8vICAgZ2V0dGltZW9mZGF5KCkuCisvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVGhlcmUgYXJlIG90aGVyIHdheXMgdG8gZ2V0IHRoZSB0aW1lIG9uCisvLyAgIFdpbmRvd3MsIGxpa2UgR2V0VGlja0NvdW50KCkgb3IgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKS4gIE1pbkdXCisvLyAgIHN1cHBvcnRzIHRoZXNlLiAgY29uc2lkZXIgdXNpbmcgdGhlbSBpbnN0ZWFkLgorIyAgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTUlOR1cKKworLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KKy8vIHNpbGVuY2UgaXQuCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAorCisjZWxzZQorCisvLyBBc3N1bWUgb3RoZXIgcGxhdGZvcm1zIGhhdmUgZ2V0dGltZW9mZGF5KCkuCisvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YKKy8vICAgZ2V0dGltZW9mZGF5KCkuCisjIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisKKy8vIGNwcGxpbnQgdGhpbmtzIHRoYXQgdGhlIGhlYWRlciBpcyBhbHJlYWR5IGluY2x1ZGVkLCBzbyB3ZSB3YW50IHRvCisvLyBzaWxlbmNlIGl0LgorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UCisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisjIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNlbmRpZgorCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworIyBpbmNsdWRlIDxhcnBhL2luZXQuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxuZXRkYi5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkNvdW50SWY7Cit1c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsKK3VzaW5nIGludGVybmFsOjpHZXRFbGVtZW50T3I7Cit1c2luZyBpbnRlcm5hbDo6U2h1ZmZsZTsKKworLy8gQ29uc3RhbnRzLgorCisvLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMKKy8vIGRpc2FibGVkIGFuZCBub3QgcnVuLgorc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVUZXN0RmlsdGVyW10gPSAiRElTQUJMRURfKjoqL0RJU0FCTEVEXyoiOworCisvLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMgY29uc2lkZXJlZCBhIGRlYXRoCisvLyB0ZXN0IGNhc2UgYW5kIHdpbGwgYmUgcnVuIGJlZm9yZSB0ZXN0IGNhc2VzIHdob3NlIG5hbWUgZG9lc24ndAorLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuCitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0Q2FzZUZpbHRlcltdID0gIipEZWF0aFRlc3Q6KkRlYXRoVGVzdC8qIjsKKworLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4KK3N0YXRpYyBjb25zdCBjaGFyIGtVbml2ZXJzYWxGaWx0ZXJbXSA9ICIqIjsKKworLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE91dHB1dEZpbGVbXSA9ICJ0ZXN0X2RldGFpbC54bWwiOworCisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkSW5kZXhbXSA9ICJHVEVTVF9TSEFSRF9JTkRFWCI7CisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0IHNoYXJkcy4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOworLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlLgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZFN0YXR1c0ZpbGVbXSA9ICJHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXSA9ICJcblN0YWNrIHRyYWNlOlxuIjsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitib29sIGdfaGVscF9mbGFnID0gZmFsc2U7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitzdGF0aWMgY29uc3QgY2hhciogR2V0RGVmYXVsdEZpbHRlcigpIHsKKyAgcmV0dXJuIGtVbml2ZXJzYWxGaWx0ZXI7Cit9CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cywKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMiLCBmYWxzZSksCisgICAgIlJ1biBkaXNhYmxlZCB0ZXN0cyB0b28sIGluIGFkZGl0aW9uIHRvIHRoZSB0ZXN0cyBub3JtYWxseSBiZWluZyBydW4uIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBicmVha19vbl9mYWlsdXJlLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJicmVha19vbl9mYWlsdXJlIiwgZmFsc2UpLAorICAgICJUcnVlIGlmZiBhIGZhaWxlZCBhc3NlcnRpb24gc2hvdWxkIGJlIGEgZGVidWdnZXIgYnJlYWstcG9pbnQuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBjYXRjaF9leGNlcHRpb25zLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJjYXRjaF9leGNlcHRpb25zIiwgdHJ1ZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCBjYXRjaCBleGNlcHRpb25zIGFuZCB0cmVhdCB0aGVtIGFzIHRlc3QgZmFpbHVyZXMuIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGNvbG9yLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImNvbG9yIiwgImF1dG8iKSwKKyAgICAiV2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuICBWYWxpZCB2YWx1ZXM6IHllcywgbm8sICIKKyAgICAiYW5kIGF1dG8uICAnYXV0bycgbWVhbnMgdG8gdXNlIGNvbG9ycyBpZiB0aGUgb3V0cHV0IGlzICIKKyAgICAiYmVpbmcgc2VudCB0byBhIHRlcm1pbmFsIGFuZCB0aGUgVEVSTSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiCisgICAgImlzIHNldCB0byBhIHRlcm1pbmFsIHR5cGUgdGhhdCBzdXBwb3J0cyBjb2xvcnMuIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGZpbHRlciwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJmaWx0ZXIiLCBHZXREZWZhdWx0RmlsdGVyKCkpLAorICAgICJBIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMgIgorICAgICJmb3IgZmlsdGVyaW5nIHRoZSB0ZXN0cyB0byBydW4sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAiCisgICAgIictJyBhbmQgYSA6IHNlcGFyYXRlZCBsaXN0IG9mIG5lZ2F0aXZlIHBhdHRlcm5zICh0ZXN0cyB0byAiCisgICAgImV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdCBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgIgorICAgICJwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKGxpc3RfdGVzdHMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICJMaXN0IGFsbCB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcgdGhlbS4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgb3V0cHV0LAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoIm91dHB1dCIsICIiKSwKKyAgICAiQSBmb3JtYXQgKGN1cnJlbnRseSBtdXN0IGJlIFwieG1sXCIpLCBvcHRpb25hbGx5IGZvbGxvd2VkICIKKyAgICAiYnkgYSBjb2xvbiBhbmQgYW4gb3V0cHV0IGZpbGUgbmFtZSBvciBkaXJlY3RvcnkuIEEgZGlyZWN0b3J5ICIKKyAgICAiaXMgaW5kaWNhdGVkIGJ5IGEgdHJhaWxpbmcgcGF0aG5hbWUgc2VwYXJhdG9yLiAiCisgICAgIkV4YW1wbGVzOiBcInhtbDpmaWxlbmFtZS54bWxcIiwgXCJ4bWw6OmRpcmVjdG9yeW5hbWUvXCIuICIKKyAgICAiSWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCBvdXRwdXQgZmlsZXMgd2lsbCBiZSBjcmVhdGVkICIKKyAgICAid2l0aGluIHRoYXQgZGlyZWN0b3J5LCB3aXRoIGZpbGUtbmFtZXMgYmFzZWQgb24gdGhlIHRlc3QgIgorICAgICJleGVjdXRhYmxlJ3MgbmFtZSBhbmQsIGlmIG5lY2Vzc2FyeSwgbWFkZSB1bmlxdWUgYnkgYWRkaW5nICIKKyAgICAiZGlnaXRzLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgcHJpbnRfdGltZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigicHJpbnRfdGltZSIsIHRydWUpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgZGlzcGxheSBlbGFwc2VkIHRpbWUgaW4gdGV4dCBvdXRwdXQuIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgcmFuZG9tX3NlZWQsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyYW5kb21fc2VlZCIsIDApLAorICAgICJSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIHdoZW4gc2h1ZmZsaW5nIHRlc3Qgb3JkZXJzLiAgTXVzdCBiZSBpbiByYW5nZSAiCisgICAgIlsxLCA5OTk5OV0sIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lLiIpOworCitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHJlcGVhdCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInJlcGVhdCIsIDEpLAorICAgICJIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgZWFjaCB0ZXN0LiAgU3BlY2lmeSBhIG5lZ2F0aXZlIG51bWJlciAiCisgICAgImZvciByZXBlYXRpbmcgZm9yZXZlci4gIFVzZWZ1bCBmb3Igc2hha2luZyBvdXQgZmxha3kgdGVzdHMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcywgZmFsc2UsCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8gIiBzaG91bGQgaW5jbHVkZSBpbnRlcm5hbCBzdGFjayBmcmFtZXMgd2hlbiAiCisgICAgInByaW50aW5nIHRlc3QgZmFpbHVyZSBzdGFjayB0cmFjZXMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBzaHVmZmxlLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJzaHVmZmxlIiwgZmFsc2UpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgcmFuZG9taXplIHRlc3RzJyBvcmRlciBvbiBldmVyeSBydW4uIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgc3RhY2tfdHJhY2VfZGVwdGgsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJzdGFja190cmFjZV9kZXB0aCIsIGtNYXhTdGFja1RyYWNlRGVwdGgpLAorICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIHByaW50IHdoZW4gYW4gIgorICAgICJhc3NlcnRpb24gZmFpbHMuICBUaGUgdmFsaWQgcmFuZ2UgaXMgMCB0aHJvdWdoIDEwMCwgaW5jbHVzaXZlLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBzdHJlYW1fcmVzdWx0X3RvLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoInN0cmVhbV9yZXN1bHRfdG8iLCAiIiksCisgICAgIlRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIGhvc3QgbmFtZSBhbmQgdGhlIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRvIHN0cmVhbSAiCisgICAgInRlc3QgcmVzdWx0cy4gRXhhbXBsZTogXCJsb2NhbGhvc3Q6NTU1XCIuIFRoZSBmbGFnIGlzIGVmZmVjdGl2ZSBvbmx5IG9uICIKKyAgICAiTGludXguIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICB0aHJvd19vbl9mYWlsdXJlLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJ0aHJvd19vbl9mYWlsdXJlIiwgZmFsc2UpLAorICAgICJXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGEgZmFpbGVkIGFzc2VydGlvbiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiAiCisgICAgImlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgb3IgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIGEgbm9uLXplcm8gY29kZSAiCisgICAgIm90aGVyd2lzZS4iKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gR2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBmcm9tIFswLCByYW5nZSksIHVzaW5nIGEgTGluZWFyCisvLyBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIChMQ0cpLiAgQ3Jhc2hlcyBpZiAncmFuZ2UnIGlzIDAgb3IgZ3JlYXRlcgorLy8gdGhhbiBrTWF4UmFuZ2UuCitVSW50MzIgUmFuZG9tOjpHZW5lcmF0ZShVSW50MzIgcmFuZ2UpIHsKKyAgLy8gVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgc2FtZSBhcyBhcmUgdXNlZCBpbiBnbGliYydzIHJhbmQoMykuCisgIHN0YXRlXyA9ICgxMTAzNTE1MjQ1VSpzdGF0ZV8gKyAxMjM0NVUpICUga01heFJhbmdlOworCisgIEdURVNUX0NIRUNLXyhyYW5nZSA+IDApCisgICAgICA8PCAiQ2Fubm90IGdlbmVyYXRlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgMCkuIjsKKyAgR1RFU1RfQ0hFQ0tfKHJhbmdlIDw9IGtNYXhSYW5nZSkKKyAgICAgIDw8ICJHZW5lcmF0aW9uIG9mIGEgbnVtYmVyIGluIFswLCAiIDw8IHJhbmdlIDw8ICIpIHdhcyByZXF1ZXN0ZWQsICIKKyAgICAgIDw8ICJidXQgdGhpcyBjYW4gb25seSBnZW5lcmF0ZSBudW1iZXJzIGluIFswLCAiIDw8IGtNYXhSYW5nZSA8PCAiKS4iOworCisgIC8vIENvbnZlcnRpbmcgdmlhIG1vZHVsdXMgaW50cm9kdWNlcyBhIGJpdCBvZiBkb3dud2FyZCBiaWFzLCBidXQKKyAgLy8gaXQncyBzaW1wbGUsIGFuZCBhIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIGlzbid0IHRvbyBnb29kCisgIC8vIHRvIGJlZ2luIHdpdGguCisgIHJldHVybiBzdGF0ZV8gJSByYW5nZTsKK30KKworLy8gR1Rlc3RJc0luaXRpYWxpemVkKCkgcmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBoYXMgaW5pdGlhbGl6ZWQKKy8vIEdvb2dsZSBUZXN0LiAgVXNlZnVsIGZvciBjYXRjaGluZyB0aGUgdXNlciBtaXN0YWtlIG9mIG5vdCBpbml0aWFsaXppbmcKKy8vIEdvb2dsZSBUZXN0IGJlZm9yZSBjYWxsaW5nIFJVTl9BTExfVEVTVFMoKS4KKy8vCisvLyBBIHVzZXIgbXVzdCBjYWxsIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkgdG8gaW5pdGlhbGl6ZSBHb29nbGUKKy8vIFRlc3QuICBnX2luaXRfZ3Rlc3RfY291bnQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdGltZXMKKy8vIEluaXRHb29nbGVUZXN0KCkgaGFzIGJlZW4gY2FsbGVkLiAgV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHZhcmlhYmxlCisvLyB1bmRlciBhIG11dGV4IGFzIGl0IGlzIG9ubHkgYWNjZXNzZWQgaW4gdGhlIG1haW4gdGhyZWFkLgorR1RFU1RfQVBJXyBpbnQgZ19pbml0X2d0ZXN0X2NvdW50ID0gMDsKK3N0YXRpYyBib29sIEdUZXN0SXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIGdfaW5pdF9ndGVzdF9jb3VudCAhPSAwOyB9CisKKy8vIEl0ZXJhdGVzIG92ZXIgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLCBrZWVwaW5nIGEgcnVubmluZyBzdW0gb2YgdGhlCisvLyByZXN1bHRzIG9mIGNhbGxpbmcgYSBnaXZlbiBpbnQtcmV0dXJuaW5nIG1ldGhvZCBvbiBlYWNoLgorLy8gUmV0dXJucyB0aGUgc3VtLgorc3RhdGljIGludCBTdW1PdmVyVGVzdENhc2VMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4mIGNhc2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKFRlc3RDYXNlOjoqbWV0aG9kKSgpIGNvbnN0KSB7CisgIGludCBzdW0gPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhc2VfbGlzdC5zaXplKCk7IGkrKykgeworICAgIHN1bSArPSAoY2FzZV9saXN0W2ldLT4qbWV0aG9kKSgpOworICB9CisgIHJldHVybiBzdW07Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZVBhc3NlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPlBhc3NlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgorc3RhdGljIGJvb2wgVGVzdENhc2VGYWlsZWQoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5GYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0X2Nhc2UgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRlc3QgdGhhdCBzaG91bGQKKy8vIHJ1bi4KK3N0YXRpYyBib29sIFNob3VsZFJ1blRlc3RDYXNlKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpOworfQorCisvLyBBc3NlcnRIZWxwZXIgY29uc3RydWN0b3IuCitBc3NlcnRIZWxwZXI6OkFzc2VydEhlbHBlcihUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSkKKyAgICA6IGRhdGFfKG5ldyBBc3NlcnRIZWxwZXJEYXRhKHR5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpKSB7Cit9CisKK0Fzc2VydEhlbHBlcjo6fkFzc2VydEhlbHBlcigpIHsKKyAgZGVsZXRlIGRhdGFfOworfQorCisvLyBNZXNzYWdlIGFzc2lnbm1lbnQsIGZvciBhc3NlcnRpb24gc3RyZWFtaW5nIHN1cHBvcnQuCit2b2lkIEFzc2VydEhlbHBlcjo6b3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPgorICAgIEFkZFRlc3RQYXJ0UmVzdWx0KGRhdGFfLT50eXBlLCBkYXRhXy0+ZmlsZSwgZGF0YV8tPmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kVXNlck1lc3NhZ2UoZGF0YV8tPm1lc3NhZ2UsIG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCkKKyAgICAgICAgICAgICAgICAgICAgICAtPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSkKKyAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgorICAgICAgICAgICAgICAgICAgICAgICk7ICAvLyBOT0xJTlQKK30KKworLy8gTXV0ZXggZm9yIGxpbmtlZCBwb2ludGVycy4KK0dURVNUX0FQSV8gR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKKworLy8gQXBwbGljYXRpb24gcGF0aG5hbWUgZ290dGVuIGluIEluaXRHb29nbGVUZXN0Lgorc3RkOjpzdHJpbmcgZ19leGVjdXRhYmxlX3BhdGg7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24ncyBuYW1lLCByZW1vdmluZyBkaXJlY3RvcnkgcGF0aCBpZiB0aGF0CisvLyBpcyBwcmVzZW50LgorRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkgeworICBGaWxlUGF0aCByZXN1bHQ7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJlc3VsdC5TZXQoRmlsZVBhdGgoZ19leGVjdXRhYmxlX3BhdGgpLlJlbW92ZUV4dGVuc2lvbigiZXhlIikpOworI2Vsc2UKKyAgcmVzdWx0LlNldChGaWxlUGF0aChnX2V4ZWN1dGFibGVfcGF0aCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIHJlc3VsdC5SZW1vdmVEaXJlY3RvcnlOYW1lKCk7Cit9CisKKy8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCisKKy8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuCitzdGQ6OnN0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKKyAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpIHJldHVybiBzdGQ6OnN0cmluZygiIik7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIHJldHVybiAoY29sb24gPT0gTlVMTCkgPworICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcpIDoKKyAgICAgIHN0ZDo6c3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnLCBjb2xvbiAtIGd0ZXN0X291dHB1dF9mbGFnKTsKK30KKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIG91dHB1dCBmaWxlLCBvciB0aGUgZGVmYXVsdCBpZiBub25lCisvLyB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCitzdGQ6OnN0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKKyAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpCisgICAgcmV0dXJuICIiOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGNvbG9uID0gc3RyY2hyKGd0ZXN0X291dHB1dF9mbGFnLCAnOicpOworICBpZiAoY29sb24gPT0gTlVMTCkKKyAgICByZXR1cm4gaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKKyAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKAorICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkpLAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoa0RlZmF1bHRPdXRwdXRGaWxlKSkuc3RyaW5nKCk7CisKKyAgaW50ZXJuYWw6OkZpbGVQYXRoIG91dHB1dF9uYW1lKGNvbG9uICsgMSk7CisgIGlmICghb3V0cHV0X25hbWUuSXNBYnNvbHV0ZVBhdGgoKSkKKyAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBcc29tZVxwYXRoIGlzIG5vdCBhbiBhYnNvbHV0ZQorICAgIC8vIHBhdGggKGFzIGl0cyBtZWFuaW5nIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZHJpdmUpLCB5ZXQgdGhlCisgICAgLy8gZm9sbG93aW5nIGxvZ2ljIGZvciB0dXJuaW5nIGl0IGludG8gYW4gYWJzb2x1dGUgcGF0aCBpcyB3cm9uZy4KKyAgICAvLyBGaXggaXQuCisgICAgb3V0cHV0X25hbWUgPSBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkpLAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoY29sb24gKyAxKSk7CisKKyAgaWYgKCFvdXRwdXRfbmFtZS5Jc0RpcmVjdG9yeSgpKQorICAgIHJldHVybiBvdXRwdXRfbmFtZS5zdHJpbmcoKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggcmVzdWx0KGludGVybmFsOjpGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSgKKyAgICAgIG91dHB1dF9uYW1lLCBpbnRlcm5hbDo6R2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCksCisgICAgICBHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKSk7CisgIHJldHVybiByZXN1bHQuc3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHdpbGRjYXJkIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLiAgVGhlCisvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgorLy8KKy8vIFRoaXMgcmVjdXJzaXZlIGFsZ29yaXRobSBpc24ndCB2ZXJ5IGVmZmljaWVudCwgYnV0IGlzIGNsZWFyIGFuZAorLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjb25zdCBjaGFyICpwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cikgeworICBzd2l0Y2ggKCpwYXR0ZXJuKSB7CisgICAgY2FzZSAnXDAnOgorICAgIGNhc2UgJzonOiAgLy8gRWl0aGVyICc6JyBvciAnXDAnIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uCisgICAgICByZXR1cm4gKnN0ciA9PSAnXDAnOworICAgIGNhc2UgJz8nOiAgLy8gTWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICAgIHJldHVybiAqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOworICAgIGNhc2UgJyonOiAgLy8gTWF0Y2hlcyBhbnkgc3RyaW5nIChwb3NzaWJseSBlbXB0eSkgb2YgY2hhcmFjdGVycy4KKyAgICAgIHJldHVybiAoKnN0ciAhPSAnXDAnICYmIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4sIHN0ciArIDEpKSB8fAorICAgICAgICAgIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4gKyAxLCBzdHIpOworICAgIGRlZmF1bHQ6ICAvLyBOb24tc3BlY2lhbCBjaGFyYWN0ZXIuICBNYXRjaGVzIGl0c2VsZi4KKyAgICAgIHJldHVybiAqcGF0dGVybiA9PSAqc3RyICYmCisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOworICB9Cit9CisKK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpIHsKKyAgY29uc3QgY2hhciAqY3VyX3BhdHRlcm4gPSBmaWx0ZXI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoUGF0dGVybk1hdGNoZXNTdHJpbmcoY3VyX3BhdHRlcm4sIG5hbWUuY19zdHIoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZpbmRzIHRoZSBuZXh0IHBhdHRlcm4gaW4gdGhlIGZpbHRlci4KKyAgICBjdXJfcGF0dGVybiA9IHN0cmNocihjdXJfcGF0dGVybiwgJzonKTsKKworICAgIC8vIFJldHVybnMgaWYgbm8gbW9yZSBwYXR0ZXJuIGNhbiBiZSBmb3VuZC4KKyAgICBpZiAoY3VyX3BhdHRlcm4gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNraXBzIHRoZSBwYXR0ZXJuIHNlcGFyYXRlciAodGhlICc6JyBjaGFyYWN0ZXIpLgorICAgIGN1cl9wYXR0ZXJuKys7CisgIH0KK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQorLy8gbmFtZSBhbmQgdGhlIHRlc3QgbmFtZS4KK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lID0gdGVzdF9jYXNlX25hbWUgKyAiLiIgKyB0ZXN0X25hbWUuY19zdHIoKTsKKworICAvLyBTcGxpdCAtLWd0ZXN0X2ZpbHRlciBhdCAnLScsIGlmIHRoZXJlIGlzIG9uZSwgdG8gc2VwYXJhdGUgaW50bworICAvLyBwb3NpdGl2ZSBmaWx0ZXIgYW5kIG5lZ2F0aXZlIGZpbHRlciBwb3J0aW9ucworICBjb25zdCBjaGFyKiBjb25zdCBwID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGRhc2ggPSBzdHJjaHIocCwgJy0nKTsKKyAgc3RkOjpzdHJpbmcgcG9zaXRpdmU7CisgIHN0ZDo6c3RyaW5nIG5lZ2F0aXZlOworICBpZiAoZGFzaCA9PSBOVUxMKSB7CisgICAgcG9zaXRpdmUgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsgIC8vIFdob2xlIHN0cmluZyBpcyBhIHBvc2l0aXZlIGZpbHRlcgorICAgIG5lZ2F0aXZlID0gIiI7CisgIH0gZWxzZSB7CisgICAgcG9zaXRpdmUgPSBzdGQ6OnN0cmluZyhwLCBkYXNoKTsgICAvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBkYXNoCisgICAgbmVnYXRpdmUgPSBzdGQ6OnN0cmluZyhkYXNoICsgMSk7ICAvLyBFdmVyeXRoaW5nIGFmdGVyIHRoZSBkYXNoCisgICAgaWYgKHBvc2l0aXZlLmVtcHR5KCkpIHsKKyAgICAgIC8vIFRyZWF0ICctdGVzdDEnIGFzIHRoZSBzYW1lIGFzICcqLXRlc3QxJworICAgICAgcG9zaXRpdmUgPSBrVW5pdmVyc2FsRmlsdGVyOworICAgIH0KKyAgfQorCisgIC8vIEEgZmlsdGVyIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMuICBJdCBtYXRjaGVzIGEKKyAgLy8gdGVzdCBpZiBhbnkgcGF0dGVybiBpbiBpdCBtYXRjaGVzIHRoZSB0ZXN0LgorICByZXR1cm4gKE1hdGNoZXNGaWx0ZXIoZnVsbF9uYW1lLCBwb3NpdGl2ZS5jX3N0cigpKSAmJgorICAgICAgICAgICFNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgbmVnYXRpdmUuY19zdHIoKSkpOworfQorCisjaWYgR1RFU1RfSEFTX1NFSAorLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlCisvLyBnaXZlbiBTRUggZXhjZXB0aW9uLCBvciBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIIG90aGVyd2lzZS4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KK2ludCBVbml0VGVzdE9wdGlvbnM6OkdUZXN0U2hvdWxkUHJvY2Vzc1NFSChEV09SRCBleGNlcHRpb25fY29kZSkgeworICAvLyBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIGEgU0VIIGV4Y2VwdGlvbiBpZjoKKyAgLy8gICAxLiB0aGUgdXNlciB3YW50cyBpdCB0bywgQU5ECisgIC8vICAgMi4gdGhpcyBpcyBub3QgYSBicmVha3BvaW50IGV4Y2VwdGlvbiwgQU5ECisgIC8vICAgMy4gdGhpcyBpcyBub3QgYSBDKysgZXhjZXB0aW9uIChWQysrIGltcGxlbWVudHMgdGhlbSB2aWEgU0VILAorICAvLyAgICAgIGFwcGFyZW50bHkpLgorICAvLworICAvLyBTRUggZXhjZXB0aW9uIGNvZGUgZm9yIEMrKyBleGNlcHRpb25zLgorICAvLyAoc2VlIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTg1Mjk0IGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKyAgY29uc3QgRFdPUkQga0N4eEV4Y2VwdGlvbkNvZGUgPSAweGUwNmQ3MzYzOworCisgIGJvb2wgc2hvdWxkX2hhbmRsZSA9IHRydWU7CisKKyAgaWYgKCFHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKQorICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKKyAgZWxzZSBpZiAoZXhjZXB0aW9uX2NvZGUgPT0gRVhDRVBUSU9OX0JSRUFLUE9JTlQpCisgICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOworICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBrQ3h4RXhjZXB0aW9uQ29kZSkKKyAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7CisKKyAgcmV0dXJuIHNob3VsZF9oYW5kbGUgPyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIDogRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieQorLy8gR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCisvLyByZXN1bHRzLiBJbnRlcmNlcHRzIG9ubHkgZmFpbHVyZXMgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQuCitTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQorICAgIDogaW50ZXJjZXB0X21vZGVfKElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFEKSwKKyAgICAgIHJlc3VsdF8ocmVzdWx0KSB7CisgIEluaXQoKTsKK30KKworLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieQorLy8gR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCisvLyByZXN1bHRzLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkKKyAgICA6IGludGVyY2VwdF9tb2RlXyhpbnRlcmNlcHRfbW9kZSksCisgICAgICByZXN1bHRfKHJlc3VsdCkgeworICBJbml0KCk7Cit9CisKK3ZvaWQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkluaXQoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7CisgICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKyAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKHRoaXMpOworICB9IGVsc2UgeworICAgIG9sZF9yZXBvcnRlcl8gPSBpbXBsLT5HZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpOworICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOworICB9Cit9CisKKy8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5IEdvb2dsZSBUZXN0CisvLyBiZWZvcmUuCitTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6flNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgeworICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIob2xkX3JlcG9ydGVyXyk7CisgIH0gZWxzZSB7CisgICAgaW1wbC0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQob2xkX3JlcG9ydGVyXyk7CisgIH0KK30KKworLy8gSW5jcmVtZW50cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCBjb3VudCBhbmQgcmVtZW1iZXJzIHRoZSByZXN1bHQuCisvLyBUaGlzIG1ldGhvZCBpcyBmcm9tIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIGludGVyZmFjZS4KK3ZvaWQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmVzdWx0Xy0+QXBwZW5kKHJlc3VsdCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgV2Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoaXMKKy8vIGluc3RlYWQgb2YgR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gZ2V0IHRoZSB0eXBlIElEIG9mCisvLyB0ZXN0aW5nOjpUZXN0LiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4KKy8vIHVzaW5nIEdvb2dsZSBUZXN0IGFzIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMKKy8vIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZworLy8gb24gd2hldGhlciB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yCisvLyBmcm9tIHVzZXIgdGVzdCBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzCisvLyByZXR1cm4gdGhlIHNhbWUgdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlCisvLyBndGVzdC5jYywgd2hpY2ggaXMgd2l0aGluIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsuCitUeXBlSWQgR2V0VGVzdFR5cGVJZCgpIHsKKyAgcmV0dXJuIEdldFR5cGVJZDxUZXN0PigpOworfQorCisvLyBUaGUgdmFsdWUgb2YgR2V0VGVzdFR5cGVJZCgpIGFzIHNlZW4gZnJvbSB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0CisvLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLgorZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdCA9IEdldFRlc3RUeXBlSWQoKTsKKworLy8gVGhpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGNoZWNrcyB0aGF0ICdyZXN1bHRzJyBjb250YWlucyBhIHRlc3QgcGFydAorLy8gZmFpbHVyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zIHRoZQorLy8gZ2l2ZW4gc3Vic3RyaW5nLgorQXNzZXJ0aW9uUmVzdWx0IEhhc09uZUZhaWx1cmUoY29uc3QgY2hhciogLyogcmVzdWx0c19leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogdHlwZV9leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogc3Vic3RyX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5JiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkKHR5cGUgPT0gVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgPworICAgICAgICAgICAgICAgICAgICAgICAgIjEgZmF0YWwgZmFpbHVyZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgIjEgbm9uLWZhdGFsIGZhaWx1cmUiKTsKKyAgTWVzc2FnZSBtc2c7CisgIGlmIChyZXN1bHRzLnNpemUoKSAhPSAxKSB7CisgICAgbXNnIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiXG4iCisgICAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCByZXN1bHRzLnNpemUoKSA8PCAiIGZhaWx1cmVzIjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIG1zZyA8PCAiXG4iIDw8IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoaSk7CisgICAgfQorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnOworICB9CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHIgPSByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApOworICBpZiAoci50eXBlKCkgIT0gdHlwZSkgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHI7CisgIH0KKworICBpZiAoc3Ryc3RyKHIubWVzc2FnZSgpLCBzdWJzdHIuY19zdHIoKSkgPT0gTlVMTCkgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgY29udGFpbmluZyBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN1YnN0ciA8PCAiXCJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHI7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworfQorCisvLyBUaGUgY29uc3RydWN0b3Igb2YgU2luZ2xlRmFpbHVyZUNoZWNrZXIgcmVtZW1iZXJzIHdoZXJlIHRvIGxvb2sgdXAKKy8vIHRlc3QgcGFydCByZXN1bHRzLCB3aGF0IHR5cGUgb2YgZmFpbHVyZSB3ZSBleHBlY3QsIGFuZCB3aGF0CisvLyBzdWJzdHJpbmcgdGhlIGZhaWx1cmUgbWVzc2FnZSBzaG91bGQgY29udGFpbi4KK1NpbmdsZUZhaWx1cmVDaGVja2VyOjogU2luZ2xlRmFpbHVyZUNoZWNrZXIoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0cywKKyAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKQorICAgIDogcmVzdWx0c18ocmVzdWx0cyksCisgICAgICB0eXBlXyh0eXBlKSwKKyAgICAgIHN1YnN0cl8oc3Vic3RyKSB7fQorCisvLyBUaGUgZGVzdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgorLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbgorLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGEKKy8vIG5vbi1mYXRhbCBmYWlsdXJlIHdpbGwgYmUgZ2VuZXJhdGVkLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6On5TaW5nbGVGYWlsdXJlQ2hlY2tlcigpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhIYXNPbmVGYWlsdXJlLCAqcmVzdWx0c18sIHR5cGVfLCBzdWJzdHJfKTsKK30KKworRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KSA6IHVuaXRfdGVzdF8odW5pdF90ZXN0KSB7fQorCit2b2lkIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHVuaXRfdGVzdF8tPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+QWRkVGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKyAgdW5pdF90ZXN0Xy0+bGlzdGVuZXJzKCktPnJlcGVhdGVyKCktPk9uVGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKK30KKworRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KSA6IHVuaXRfdGVzdF8odW5pdF90ZXN0KSB7fQorCit2b2lkIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHVuaXRfdGVzdF8tPkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKS0+UmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKK30KKworLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCitUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKgorVW5pdFRlc3RJbXBsOjpHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCkgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJmdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4Xyk7CisgIHJldHVybiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKK30KKworLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcikgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJmdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4Xyk7CisgIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfID0gcmVwb3J0ZXI7Cit9CisKKy8vIFJldHVybnMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkgeworICByZXR1cm4gcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5nZXQoKTsKK30KKworLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgordm9pZCBVbml0VGVzdEltcGw6OlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uc2V0KHJlcG9ydGVyKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgVGVzdENhc2VQYXNzZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgVGVzdENhc2VGYWlsZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZXNfLnNpemUoKSk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKy8vIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBTaG91bGRSdW5UZXN0Q2FzZSk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgoraW50IFVuaXRUZXN0SW1wbDo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KK2ludCBVbml0VGVzdEltcGw6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZUZXN0Q2FzZTo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgoraW50IFVuaXRUZXN0SW1wbDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFVuaXRUZXN0SW1wbDo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgoraW50IFVuaXRUZXN0SW1wbDo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3RJbXBsOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6dGVzdF90b19ydW5fY291bnQpOworfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorLy8KKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworLy8gQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKy8vIHRyYWNlIGJ1dCBCYXIoKSBhbmQgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0Lgorc3RkOjpzdHJpbmcgVW5pdFRlc3RJbXBsOjpDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKGludCBza2lwX2NvdW50KSB7CisgICh2b2lkKXNraXBfY291bnQ7CisgIHJldHVybiAiIjsKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KK1RpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIC8vIERpZmZlcmVuY2UgYmV0d2VlbiAxOTcwLTAxLTAxIGFuZCAxNjAxLTAxLTAxIGluIG1pbGxpc2Vjb25kcy4KKyAgLy8gaHR0cDovL2FuYWxvZ291cy5ibG9nc3BvdC5jb20vMjAwNS8wNC9lcG9jaC5odG1sCisgIGNvbnN0IFRpbWVJbk1pbGxpcyBrSmF2YUVwb2NoVG9XaW5GaWxlVGltZURlbHRhID0KKyAgICBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KDExNjQ0NDczNlVMKSAqIDEwMDAwMFVMOworICBjb25zdCBEV09SRCBrVGVudGhNaWNyb3NJbk1pbGxpU2Vjb25kID0gMTAwMDA7CisKKyAgU1lTVEVNVElNRSBub3dfc3lzdGltZTsKKyAgRklMRVRJTUUgbm93X2ZpbGV0aW1lOworICBVTEFSR0VfSU5URUdFUiBub3dfaW50NjQ7CisgIC8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBTaG91bGRuJ3QgdGhpcyBqdXN0IHVzZQorICAvLyAgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCk/CisgIEdldFN5c3RlbVRpbWUoJm5vd19zeXN0aW1lKTsKKyAgaWYgKFN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZub3dfc3lzdGltZSwgJm5vd19maWxldGltZSkpIHsKKyAgICBub3dfaW50NjQuTG93UGFydCA9IG5vd19maWxldGltZS5kd0xvd0RhdGVUaW1lOworICAgIG5vd19pbnQ2NC5IaWdoUGFydCA9IG5vd19maWxldGltZS5kd0hpZ2hEYXRlVGltZTsKKyAgICBub3dfaW50NjQuUXVhZFBhcnQgPSAobm93X2ludDY0LlF1YWRQYXJ0IC8ga1RlbnRoTWljcm9zSW5NaWxsaVNlY29uZCkgLQorICAgICAga0phdmFFcG9jaFRvV2luRmlsZVRpbWVEZWx0YTsKKyAgICByZXR1cm4gbm93X2ludDY0LlF1YWRQYXJ0OworICB9CisgIHJldHVybiAwOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8KKyAgX190aW1lYjY0IG5vdzsKKworIyBpZmRlZiBfTVNDX1ZFUgorCisgIC8vIE1TVkMgOCBkZXByZWNhdGVzIF9mdGltZTY0KCksIHNvIHdlIHdhbnQgdG8gc3VwcHJlc3Mgd2FybmluZyA0OTk2CisgIC8vIChkZXByZWNhdGVkIGZ1bmN0aW9uKSB0aGVyZS4KKyAgLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBHZXRUaWNrQ291bnQoKT8gIE9yIHVzZQorICAvLyAgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKCkKKyMgIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYuCisgIF9mdGltZTY0KCZub3cpOworIyAgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjIGVsc2UKKworICBfZnRpbWU2NCgmbm93KTsKKworIyBlbmRpZiAgLy8gX01TQ19WRVIKKworICByZXR1cm4gc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPihub3cudGltZSkgKiAxMDAwICsgbm93Lm1pbGxpdG07CisjZWxpZiBHVEVTVF9IQVNfR0VUVElNRU9GREFZXworICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnR2X3NlYykgKiAxMDAwICsgbm93LnR2X3VzZWMgLyAxMDAwOworI2Vsc2UKKyMgZXJyb3IgIkRvbid0IGtub3cgaG93IHRvIGdldCB0aGUgY3VycmVudCB0aW1lIG9uIHlvdXIgc3lzdGVtLiIKKyNlbmRpZgorfQorCisvLyBVdGlsaXRpZXMKKworLy8gY2xhc3MgU3RyaW5nLgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIENyZWF0ZXMgYSBVVEYtMTYgd2lkZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gQU5TSSBzdHJpbmcsIGFsbG9jYXRpbmcKKy8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKy8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSB3aWRlIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKy8vIGlucHV0IGlzIE5VTEwuCitMUENXU1RSIFN0cmluZzo6QW5zaVRvVXRmMTYoY29uc3QgY2hhciogYW5zaSkgeworICBpZiAoIWFuc2kpIHJldHVybiBOVUxMOworICBjb25zdCBpbnQgbGVuZ3RoID0gc3RybGVuKGFuc2kpOworICBjb25zdCBpbnQgdW5pY29kZV9sZW5ndGggPQorICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisgIFdDSEFSKiB1bmljb2RlID0gbmV3IFdDSEFSW3VuaWNvZGVfbGVuZ3RoICsgMV07CisgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhbnNpLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgdW5pY29kZV9sZW5ndGgpOworICB1bmljb2RlW3VuaWNvZGVfbGVuZ3RoXSA9IDA7CisgIHJldHVybiB1bmljb2RlOworfQorCisvLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nCisvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgQU5TSSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCisvLyBpbnB1dCBpcyBOVUxMLgorY29uc3QgY2hhciogU3RyaW5nOjpVdGYxNlRvQW5zaShMUENXU1RSIHV0ZjE2X3N0cikgIHsKKyAgaWYgKCF1dGYxNl9zdHIpIHJldHVybiBOVUxMOworICBjb25zdCBpbnQgYW5zaV9sZW5ndGggPQorICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHV0ZjE2X3N0ciwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICBjaGFyKiBhbnNpID0gbmV3IGNoYXJbYW5zaV9sZW5ndGggKyAxXTsKKyAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHV0ZjE2X3N0ciwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgYW5zaSwgYW5zaV9sZW5ndGgsIE5VTEwsIE5VTEwpOworICBhbnNpW2Fuc2lfbGVuZ3RoXSA9IDA7CisgIHJldHVybiBhbnNpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorLy8KKy8vIFVubGlrZSBzdHJjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKKy8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OkNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciAqIGxocywgY29uc3QgY2hhciAqIHJocykgeworICBpZiAoIGxocyA9PSBOVUxMICkgcmV0dXJuIHJocyA9PSBOVUxMOworCisgIGlmICggcmhzID09IE5VTEwgKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHN0cmNtcChsaHMsIHJocykgPT0gMDsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORyB8fCBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gQ29udmVydHMgYW4gYXJyYXkgb2Ygd2lkZSBjaGFycyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGUgZ2l2ZW4gTWVzc2FnZSBvYmplY3QuCitzdGF0aWMgdm9pZCBTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2UoY29uc3Qgd2NoYXJfdCogd3N0ciwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtc2cpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbGVuZ3RoOyApIHsgIC8vIE5PTElOVAorICAgIGlmICh3c3RyW2ldICE9IEwnXDAnKSB7CisgICAgICAqbXNnIDw8IFdpZGVTdHJpbmdUb1V0Zjgod3N0ciArIGksIHN0YXRpY19jYXN0PGludD4obGVuZ3RoIC0gaSkpOworICAgICAgd2hpbGUgKGkgIT0gbGVuZ3RoICYmIHdzdHJbaV0gIT0gTCdcMCcpCisgICAgICAgIGkrKzsKKyAgICB9IGVsc2UgeworICAgICAgKm1zZyA8PCAnXDAnOworICAgICAgaSsrOworICAgIH0KKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORyB8fCBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIENvbnN0cnVjdHMgYW4gZW1wdHkgTWVzc2FnZS4KKy8vIFdlIGFsbG9jYXRlIHRoZSBzdHJpbmdzdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIG90aGVyd2lzZSBlYWNoIHVzZSBvZgorLy8gQVNTRVJUL0VYUEVDVCBpbiBhIHByb2NlZHVyZSBhZGRzIG92ZXIgMjAwIGJ5dGVzIHRvIHRoZSBwcm9jZWR1cmUncworLy8gc3RhY2sgZnJhbWUgbGVhZGluZyB0byBodWdlIHN0YWNrIGZyYW1lcyBpbiBzb21lIGNhc2VzOyBnY2MgZG9lcyBub3QgcmV1c2UKKy8vIHRoZSBzdGFjayBzcGFjZS4KK01lc3NhZ2U6Ok1lc3NhZ2UoKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgeworICAvLyBCeSBkZWZhdWx0LCB3ZSB3YW50IHRoZXJlIHRvIGJlIGVub3VnaCBwcmVjaXNpb24gd2hlbiBwcmludGluZworICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCisgICpzc18gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDIpOworfQorCisvLyBUaGVzZSB0d28gb3ZlcmxvYWRzIGFsbG93IHN0cmVhbWluZyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBNZXNzYWdlCisvLyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCitNZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgIHJldHVybiAqdGhpcyA8PCBpbnRlcm5hbDo6U3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cik7Cit9CitNZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgIHJldHVybiAqdGhpcyA8PCBpbnRlcm5hbDo6U3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cik7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpIHsKKyAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6d3N0cmluZyYgd3N0cikgeworICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7CisgIHJldHVybiAqdGhpczsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIEdldHMgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3Qgc28gZmFyIGFzIGFuIHN0ZDo6c3RyaW5nLgorLy8gRWFjaCAnXDAnIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCitzdGQ6OnN0cmluZyBNZXNzYWdlOjpHZXRTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBpbnRlcm5hbDo6U3RyaW5nU3RyZWFtVG9TdHJpbmcoc3NfLmdldCgpKTsKK30KKworLy8gQXNzZXJ0aW9uUmVzdWx0IGNvbnN0cnVjdG9ycy4KKy8vIFVzZWQgaW4gRVhQRUNUX1RSVUUvRkFMU0UoYXNzZXJ0aW9uX3Jlc3VsdCkuCitBc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdChjb25zdCBBc3NlcnRpb25SZXN1bHQmIG90aGVyKQorICAgIDogc3VjY2Vzc18ob3RoZXIuc3VjY2Vzc18pLAorICAgICAgbWVzc2FnZV8ob3RoZXIubWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCA/CisgICAgICAgICAgICAgICBuZXcgOjpzdGQ6OnN0cmluZygqb3RoZXIubWVzc2FnZV8pIDoKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oTlVMTCkpIHsKK30KKworLy8gUmV0dXJucyB0aGUgYXNzZXJ0aW9uJ3MgbmVnYXRpb24uIFVzZWQgd2l0aCBFWFBFQ1QvQVNTRVJUX0ZBTFNFLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblJlc3VsdDo6b3BlcmF0b3IhKCkgY29uc3QgeworICBBc3NlcnRpb25SZXN1bHQgbmVnYXRpb24oIXN1Y2Nlc3NfKTsKKyAgaWYgKG1lc3NhZ2VfLmdldCgpICE9IE5VTEwpCisgICAgbmVnYXRpb24gPDwgKm1lc3NhZ2VfOworICByZXR1cm4gbmVnYXRpb247Cit9CisKKy8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKSB7CisgIHJldHVybiBBc3NlcnRpb25SZXN1bHQodHJ1ZSk7Cit9CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpIHsKKyAgcmV0dXJuIEFzc2VydGlvblJlc3VsdChmYWxzZSk7Cit9CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgorLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2U7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgorLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCisvLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCisvLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6CisvLworLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgorLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgorLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKKy8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCisvLworLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQorLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKKy8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCitBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JpbmdfY2FzZSkgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBhY3R1YWxfZXhwcmVzc2lvbjsKKyAgaWYgKGFjdHVhbF92YWx1ZSAhPSBhY3R1YWxfZXhwcmVzc2lvbikgeworICAgIG1zZyA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsdWU7CisgIH0KKworICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfZXhwcmVzc2lvbjsKKyAgaWYgKGlnbm9yaW5nX2Nhc2UpIHsKKyAgICBtc2cgPDwgIiAoaWdub3JpbmcgY2FzZSkiOworICB9CisgIGlmIChleHBlY3RlZF92YWx1ZSAhPSBleHBlY3RlZF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbldoaWNoIGlzOiAiIDw8IGV4cGVjdGVkX3ZhbHVlOworICB9CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7Cit9CisKKy8vIENvbnN0cnVjdHMgYSBmYWlsdXJlIG1lc3NhZ2UgZm9yIEJvb2xlYW4gYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLgorc3RkOjpzdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKAorICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwKKyAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCisgICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpIHsKKyAgY29uc3QgY2hhciogYWN0dWFsX21lc3NhZ2UgPSBhc3NlcnRpb25fcmVzdWx0Lm1lc3NhZ2UoKTsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiVmFsdWUgb2Y6ICIgPDwgZXhwcmVzc2lvbl90ZXh0CisgICAgICA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlOworICBpZiAoYWN0dWFsX21lc3NhZ2VbMF0gIT0gJ1wwJykKKyAgICBtc2cgPDwgIiAoIiA8PCBhY3R1YWxfbWVzc2FnZSA8PCAiKSI7CisgIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWU7CisgIHJldHVybiBtc2cuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ORUFSLgorQXNzZXJ0aW9uUmVzdWx0IERvdWJsZU5lYXJQcmVkRm9ybWF0KGNvbnN0IGNoYXIqIGV4cHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpIHsKKyAgY29uc3QgZG91YmxlIGRpZmYgPSBmYWJzKHZhbDEgLSB2YWwyKTsKKyAgaWYgKGRpZmYgPD0gYWJzX2Vycm9yKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIC8vIFRPRE8od2FuKTogZG8gbm90IHByaW50IHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uIGlmIGl0J3MKKyAgLy8gYWxyZWFkeSBhIGxpdGVyYWwuCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIgPDwgZXhwcjEgPDwgIiBhbmQgIiA8PCBleHByMgorICAgICAgPDwgIiBpcyAiIDw8IGRpZmYgPDwgIiwgd2hpY2ggZXhjZWVkcyAiIDw8IGFic19lcnJvcl9leHByIDw8ICIsIHdoZXJlXG4iCisgICAgICA8PCBleHByMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDEgPDwgIixcbiIKKyAgICAgIDw8IGV4cHIyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMiA8PCAiLCBhbmRcbiIKKyAgICAgIDw8IGFic19lcnJvcl9leHByIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgYWJzX2Vycm9yIDw8ICIuIjsKK30KKworCisvLyBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBGbG9hdExFKCkgYW5kIERvdWJsZUxFKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK0Fzc2VydGlvblJlc3VsdCBGbG9hdGluZ1BvaW50TEUoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgdmFsMikgeworICAvLyBSZXR1cm5zIHN1Y2Nlc3MgaWYgdmFsMSBpcyBsZXNzIHRoYW4gdmFsMiwKKyAgaWYgKHZhbDEgPCB2YWwyKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vIG9yIGlmIHZhbDEgaXMgYWxtb3N0IGVxdWFsIHRvIHZhbDIuCisgIGNvbnN0IEZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gbGhzKHZhbDEpLCByaHModmFsMik7CisgIGlmIChsaHMuQWxtb3N0RXF1YWxzKHJocykpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBhYm92ZSB0d28gY2hlY2tzIHdpbGwgYm90aCBmYWlsIGlmIGVpdGhlciB2YWwxIG9yCisgIC8vIHZhbDIgaXMgTmFOLCBhcyB0aGUgSUVFRSBmbG9hdGluZy1wb2ludCBzdGFuZGFyZCByZXF1aXJlcyB0aGF0CisgIC8vIGFueSBwcmVkaWNhdGUgaW52b2x2aW5nIGEgTmFOIG11c3QgcmV0dXJuIGZhbHNlLgorCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gdmFsMV9zczsKKyAgdmFsMV9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgPDwgdmFsMTsKKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDJfc3M7CisgIHZhbDJfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgIDw8IHZhbDI7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSA8PSAoIiA8PCBleHByMiA8PCAiKVxuIgorICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZ2YWwxX3NzKSA8PCAiIHZzICIKKyAgICAgIDw8IFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZ2YWwyX3NzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKKy8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgorQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxmbG9hdD4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsKK30KKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitBc3NlcnRpb25SZXN1bHQgRG91YmxlTEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxkb3VibGU+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUSB3aXRoIGludCBvciBlbnVtCisvLyBhcmd1bWVudHMuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7CisgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoYWN0dWFsLCBleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8gd2l0aCBpbnRlZ2VyIG9yIGVudW0gYXJndW1lbnRzLiAgSXQgaXMgaGVyZQorLy8ganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZSBvZiBzaW1pbGFyIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCB2YWwxLCBCaWdnZXN0SW50IHZhbDIpIHtcCisgIGlmICh2YWwxIG9wIHZhbDIpIHtcCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCisgIH0gZWxzZSB7XAorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgXAorICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpICIgI29wICIgKCIgPDwgZXhwcjJcCisgICAgICAgIDw8ICIpLCBhY3R1YWw6ICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDEsIHZhbDIpXAorICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpO1wKKyAgfVwKK30KKworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTkUgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhORSwgIT0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRSB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExFLCA8PSkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xUIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwgKQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR0Ugd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HVCB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdULCA+ICkKKworI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkVRLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKSB7CisgIGlmIChTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKSB7CisgIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICB0cnVlKTsKK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUk5FLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMikgeworICBpZiAoIVN0cmluZzo6Q1N0cmluZ0VxdWFscyhzMSwgczIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKKyAgfQorfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKKyAgaWYgKCFTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKKyAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSAoaWdub3JpbmcgY2FzZSksIGFjdHVhbDogXCIiCisgICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIElzU3ViU3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkuCisKKy8vIFRoaXMgZ3JvdXAgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcmV0dXJuIHRydWUgaWZmIG5lZWRsZSBpcyBhCisvLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2suICBOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmCisvLyBvbmx5LgorCitib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7CisgIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7CisKKyAgcmV0dXJuIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOworfQorCitib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7CisKKyAgcmV0dXJuIHdjc3N0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOworfQorCisvLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGVpdGhlciA6OnN0ZDo6c3RyaW5nIG9yIDo6c3RkOjp3c3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Citib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgeworICByZXR1cm4gaGF5c3RhY2suZmluZChuZWVkbGUpICE9IFN0cmluZ1R5cGU6Om5wb3M7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBlaXRoZXIgSXNTdWJzdHJpbmcoKSBvciBJc05vdFN1YnN0cmluZygpLAorLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nIHBhcmFtZXRlci4KKy8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgY29uc3QgY2hhciosIGNvbnN0IHdjaGFyX3QqLCA6OnN0ZDo6c3RyaW5nLAorLy8gb3IgOjpzdGQ6OndzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZ0ltcGwoCisgICAgYm9vbCBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcsCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLCBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgeworICBpZiAoSXNTdWJzdHJpbmdQcmVkKG5lZWRsZSwgaGF5c3RhY2spID09IGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZykKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIGNvbnN0IGJvb2wgaXNfd2lkZV9zdHJpbmcgPSBzaXplb2YobmVlZGxlWzBdKSA+IDE7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGJlZ2luX3N0cmluZ19xdW90ZSA9IGlzX3dpZGVfc3RyaW5nID8gIkxcIiIgOiAiXCIiOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiVmFsdWUgb2Y6ICIgPDwgbmVlZGxlX2V4cHIgPDwgIlxuIgorICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBuZWVkbGUgPDwgIlwiXG4iCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgKGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyA/ICIiIDogIm5vdCAiKQorICAgICAgPDwgImEgc3Vic3RyaW5nIG9mICIgPDwgaGF5c3RhY2tfZXhwciA8PCAiXG4iCisgICAgICA8PCAiV2hpY2ggaXM6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IGhheXN0YWNrIDw8ICJcIiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEKKy8vIHN1YnN0cmluZyBvZiBoYXlzdGFjayAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgorLy8gb25seSksIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIElzSFJFU1VMVHtTdWNjZXNzRmFpbHVyZX0gcHJlZGljYXRlcworQXNzZXJ0aW9uUmVzdWx0IEhSRVNVTFRGYWlsdXJlSGVscGVyKGNvbnN0IGNoYXIqIGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocikgeyAgLy8gTk9MSU5UCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgLy8gV2luZG93cyBDRSBkb2Vzbid0IHN1cHBvcnQgRm9ybWF0TWVzc2FnZS4KKyAgY29uc3QgY2hhciBlcnJvcl90ZXh0W10gPSAiIjsKKworIyBlbHNlCisKKyAgLy8gTG9va3MgdXAgdGhlIGh1bWFuLXJlYWRhYmxlIHN5c3RlbSBtZXNzYWdlIGZvciB0aGUgSFJFU1VMVCBjb2RlCisgIC8vIGFuZCBzaW5jZSB3ZSdyZSBub3QgcGFzc2luZyBhbnkgcGFyYW1zIHRvIEZvcm1hdE1lc3NhZ2UsIHdlIGRvbid0CisgIC8vIHdhbnQgaW5zZXJ0cyBleHBhbmRlZC4KKyAgY29uc3QgRFdPUkQga0ZsYWdzID0gRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUzsKKyAgY29uc3QgRFdPUkQga0J1ZlNpemUgPSA0MDk2OworICAvLyBHZXRzIHRoZSBzeXN0ZW0ncyBodW1hbiByZWFkYWJsZSBtZXNzYWdlIHN0cmluZyBmb3IgdGhpcyBIUkVTVUxULgorICBjaGFyIGVycm9yX3RleHRba0J1ZlNpemVdID0geyAnXDAnIH07CisgIERXT1JEIG1lc3NhZ2VfbGVuZ3RoID0gOjpGb3JtYXRNZXNzYWdlQShrRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gbm8gc291cmNlLCB3ZSdyZSBhc2tpbmcgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBociwgIC8vIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIGxpbmUgd2lkdGggcmVzdHJpY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0LCAgLy8gb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0J1ZlNpemUsICAvLyBidWYgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvLyBubyBhcmd1bWVudHMgZm9yIGluc2VydHMKKyAgLy8gVHJpbXMgdGFpbGluZyB3aGl0ZSBzcGFjZSAoRm9ybWF0TWVzc2FnZSBsZWF2ZXMgYSB0cmFpbGluZyBDUi1MRikKKyAgZm9yICg7IG1lc3NhZ2VfbGVuZ3RoICYmIElzU3BhY2UoZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdKTsKKyAgICAgICAgICAtLW1lc3NhZ2VfbGVuZ3RoKSB7CisgICAgZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdID0gJ1wwJzsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVycm9yX2hleCgiMHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoaHIpKTsKKyAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBlcnJvcl9oZXggPDwgIiAiIDw8IGVycm9yX3RleHQgPDwgIlxuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0Fzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRTdWNjZXNzKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVAorICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKyAgcmV0dXJuIEhSRVNVTFRGYWlsdXJlSGVscGVyKGV4cHIsICJzdWNjZWVkcyIsIGhyKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgImZhaWxzIiwgaHIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIFVuaWNvZGUgdGV4dCAod2lkZSBzdHJpbmdzKSBpbgorLy8gVVRGLTguCisKKy8vIEEgVW5pY29kZSBjb2RlLXBvaW50IGNhbiBoYXZlIHVwdG8gMjEgYml0cywgYW5kIGlzIGVuY29kZWQgaW4gVVRGLTgKKy8vIGxpa2UgdGhpczoKKy8vCisvLyBDb2RlLXBvaW50IGxlbmd0aCAgIEVuY29kaW5nCisvLyAgIDAgLSAgNyBiaXRzICAgICAgIDB4eHh4eHh4CisvLyAgIDggLSAxMSBiaXRzICAgICAgIDExMHh4eHh4IDEweHh4eHh4CisvLyAgMTIgLSAxNiBiaXRzICAgICAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4CisvLyAgMTcgLSAyMSBiaXRzICAgICAgIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSBvbmUtYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQxID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgIDcpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHR3by1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDIgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNSArIDYpKSAtIDE7CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSB0aHJlZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDMgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNCArIDIqNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIGZvdXItYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQ0ID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgKDMgKyAzKjYpKSAtIDE7CisKKy8vIENob3BzIG9mZiB0aGUgbiBsb3dlc3QgYml0cyBmcm9tIGEgYml0IHBhdHRlcm4uICBSZXR1cm5zIHRoZSBuCisvLyBsb3dlc3QgYml0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBvcmlnaW5hbCBiaXQgcGF0dGVybiB3aWxsIGJlCisvLyBzaGlmdGVkIHRvIHRoZSByaWdodCBieSBuIGJpdHMuCitpbmxpbmUgVUludDMyIENob3BMb3dCaXRzKFVJbnQzMiogYml0cywgaW50IG4pIHsKKyAgY29uc3QgVUludDMyIGxvd19iaXRzID0gKmJpdHMgJiAoKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgbikgLSAxKTsKKyAgKmJpdHMgPj49IG47CisgIHJldHVybiBsb3dfYml0czsKK30KKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIGNvbnZlcnRlZAorLy8gdG8gIihJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCkiLgorc3RkOjpzdHJpbmcgQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50KSB7CisgIGlmIChjb2RlX3BvaW50ID4ga01heENvZGVQb2ludDQpIHsKKyAgICByZXR1cm4gIihJbnZhbGlkIFVuaWNvZGUgMHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoY29kZV9wb2ludCkgKyAiKSI7CisgIH0KKworICBjaGFyIHN0cls1XTsgIC8vIEJpZyBlbm91Z2ggZm9yIHRoZSBsYXJnZXN0IHZhbGlkIGNvZGUgcG9pbnQuCisgIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQxKSB7CisgICAgc3RyWzFdID0gJ1wwJzsKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4eHh4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MikgeworICAgIHN0clsyXSA9ICdcMCc7CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4QzAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTEweHh4eHgKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQzKSB7CisgICAgc3RyWzNdID0gJ1wwJzsKKyAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RTAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMHh4eHgKKyAgfSBlbHNlIHsgIC8vIGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDQKKyAgICBzdHJbNF0gPSAnXDAnOworICAgIHN0clszXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RjAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMTB4eHgKKyAgfQorICByZXR1cm4gc3RyOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgb25seSBtYWtlIHNlbnNlIGlmIHRoZSB0aGUgc3lzdGVtCisvLyB1c2VzIFVURi0xNiBmb3Igd2lkZSBzdHJpbmcgZW5jb2RpbmcuIEFsbCBzdXBwb3J0ZWQgc3lzdGVtcworLy8gd2l0aCAxNiBiaXQgd2NoYXJfdCAoV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKSBkbyB1c2UgVVRGLTE2LgorCisvLyBEZXRlcm1pbmVzIGlmIHRoZSBhcmd1bWVudHMgY29uc3RpdHV0ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKKy8vIGFuZCB0aHVzIHNob3VsZCBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIFVuaWNvZGUgY29kZSBwb2ludAorLy8gdXNpbmcgQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpci4KK2lubGluZSBib29sIElzVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsIHdjaGFyX3Qgc2Vjb25kKSB7CisgIHJldHVybiBzaXplb2Yod2NoYXJfdCkgPT0gMiAmJgorICAgICAgKGZpcnN0ICYgMHhGQzAwKSA9PSAweEQ4MDAgJiYgKHNlY29uZCAmIDB4RkMwMCkgPT0gMHhEQzAwOworfQorCisvLyBDcmVhdGVzIGEgVW5pY29kZSBjb2RlIHBvaW50IGZyb20gVVRGMTYgc3Vycm9nYXRlIHBhaXIuCitpbmxpbmUgVUludDMyIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHNlY29uZCkgeworICBjb25zdCBVSW50MzIgbWFzayA9ICgxIDw8IDEwKSAtIDE7CisgIHJldHVybiAoc2l6ZW9mKHdjaGFyX3QpID09IDIpID8KKyAgICAgICgoKGZpcnN0ICYgbWFzaykgPDwgMTApIHwgKHNlY29uZCAmIG1hc2spKSArIDB4MTAwMDAgOgorICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBjb25kaXRpb24gaXMKKyAgICAgIC8vIGZhbHNlLCBidXQgd2UgcHJvdmlkZSBhIHNlbnNpYmxlIGRlZmF1bHQgaW4gY2FzZSBpdCBpcy4KKyAgICAgIHN0YXRpY19jYXN0PFVJbnQzMj4oZmlyc3QpOworfQorCisvLyBDb252ZXJ0cyBhIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIFRoZSB3aWRlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKKy8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpCisvLyAgIFVURi0zMiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gNCAob24gTGludXgpCisvLyBQYXJhbWV0ZXIgc3RyIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4KKy8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyCisvLyBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLiAtMSBpcyB1c2VkIHdoZW4gdGhlIGVudGlyZSBzdHJpbmcKKy8vIHNob3VsZCBiZSBwcm9jZXNzZWQuCisvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzCisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSB0aGV5IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuIElmIHRoZSBzdHJpbmcgaXMgaW4gVVRGMTYgZW5jb2RpbmcKKy8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycworLy8gd2lsbCBiZSBlbmNvZGVkIGFzIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gQmFzaWMgTm9ybWFsIFBsYW5lLgorc3RkOjpzdHJpbmcgV2lkZVN0cmluZ1RvVXRmOChjb25zdCB3Y2hhcl90KiBzdHIsIGludCBudW1fY2hhcnMpIHsKKyAgaWYgKG51bV9jaGFycyA9PSAtMSkKKyAgICBudW1fY2hhcnMgPSBzdGF0aWNfY2FzdDxpbnQ+KHdjc2xlbihzdHIpKTsKKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY2hhcnM7ICsraSkgeworICAgIFVJbnQzMiB1bmljb2RlX2NvZGVfcG9pbnQ7CisKKyAgICBpZiAoc3RyW2ldID09IEwnXDAnKSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGkgKyAxIDwgbnVtX2NoYXJzICYmIElzVXRmMTZTdXJyb2dhdGVQYWlyKHN0cltpXSwgc3RyW2kgKyAxXSkpIHsKKyAgICAgIHVuaWNvZGVfY29kZV9wb2ludCA9IENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJbaSArIDFdKTsKKyAgICAgIGkrKzsKKyAgICB9IGVsc2UgeworICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gc3RhdGljX2Nhc3Q8VUludDMyPihzdHJbaV0pOworICAgIH0KKworICAgIHN0cmVhbSA8PCBDb2RlUG9pbnRUb1V0ZjgodW5pY29kZV9jb2RlX3BvaW50KTsKKyAgfQorICByZXR1cm4gU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSk7Cit9CisKKy8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhbiBzdGQ6OnN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCisvLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLgorc3RkOjpzdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCAqIHdpZGVfY19zdHIpIHsKKyAgaWYgKHdpZGVfY19zdHIgPT0gTlVMTCkgIHJldHVybiAiKG51bGwpIjsKKworICByZXR1cm4gaW50ZXJuYWw6OldpZGVTdHJpbmdUb1V0Zjgod2lkZV9jX3N0ciwgLTEpOworfQorCisvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQorLy8gY29udGVudC4KKy8vCisvLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQSBOVUxMCisvLyBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KK2Jvb2wgU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90ICogbGhzLCBjb25zdCB3Y2hhcl90ICogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkgcmV0dXJuIHJocyA9PSBOVUxMOworCisgIGlmIChyaHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB3Y3NjbXAobGhzLCByaHMpID09IDA7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpIHsKKyAgaWYgKFN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJORSBvbiB3aWRlIHN0cmluZ3MuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMyKSB7CisgIGlmICghU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhzMSwgczIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUHJpbnRUb1N0cmluZyhzMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgUHJpbnRUb1N0cmluZyhzMik7Cit9CisKKy8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZQorLy8gdGhlIHNhbWUgY29udGVudC4KKy8vCisvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKy8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gcmhzID09IE5VTEw7CisgIGlmIChyaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwb3NpeDo6U3RyQ2FzZUNtcChsaHMsIHJocykgPT0gMDsKK30KKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuCisgIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFCisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBPbiBHTlUgcGxhdGZvcm0gdGhpcyBtZXRob2QgdXNlcyB3Y3NjYXNlY21wCisgIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUKKyAgLy8gY3VycmVudCBsb2NhbGUuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgeworICBpZiAobGhzID09IE5VTEwpIHJldHVybiByaHMgPT0gTlVMTDsKKworICBpZiAocmhzID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmV0dXJuIF93Y3NpY21wKGxocywgcmhzKSA9PSAwOworI2VsaWYgR1RFU1RfT1NfTElOVVggJiYgIUdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgcmV0dXJuIHdjc2Nhc2VjbXAobGhzLCByaHMpID09IDA7CisjZWxzZQorICAvLyBBbmRyb2lkLCBNYWMgT1MgWCBhbmQgQ3lnd2luIGRvbid0IGRlZmluZSB3Y3NjYXNlY21wLgorICAvLyBPdGhlciB1bmtub3duIE9TZXMgbWF5IG5vdCBkZWZpbmUgaXQgZWl0aGVyLgorICB3aW50X3QgbGVmdCwgcmlnaHQ7CisgIGRvIHsKKyAgICBsZWZ0ID0gdG93bG93ZXIoKmxocysrKTsKKyAgICByaWdodCA9IHRvd2xvd2VyKCpyaHMrKyk7CisgIH0gd2hpbGUgKGxlZnQgJiYgbGVmdCA9PSByaWdodCk7CisgIHJldHVybiBsZWZ0ID09IHJpZ2h0OworI2VuZGlmICAvLyBPUyBzZWxlY3RvcgorfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHN0ciBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcgY2FzZS4KKy8vIEFueSBzdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhbiBlbXB0eSBzdWZmaXguCitib29sIFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgeworICBjb25zdCBzaXplX3Qgc3RyX2xlbiA9IHN0ci5sZW5ndGgoKTsKKyAgY29uc3Qgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdWZmaXgubGVuZ3RoKCk7CisgIHJldHVybiAoc3RyX2xlbiA+PSBzdWZmaXhfbGVuKSAmJgorICAgICAgICAgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhzdHIuY19zdHIoKSArIHN0cl9sZW4gLSBzdWZmaXhfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXguY19zdHIoKSk7Cit9CisKKy8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlMDJkIi4KK3N0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKGludCB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IHZhbHVlOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlWCIuCitzdGQ6OnN0cmluZyBTdHJpbmc6OkZvcm1hdEhleEludChpbnQgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHZhbHVlOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIEZvcm1hdHMgYSBieXRlIGFzICIlMDJYIi4KK3N0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0Qnl0ZSh1bnNpZ25lZCBjaGFyIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjpoZXggPDwgc3RkOjp1cHBlcmNhc2UKKyAgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih2YWx1ZSk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gQ29udmVydHMgdGhlIGJ1ZmZlciBpbiBhIHN0cmluZ3N0cmVhbSB0byBhbiBzdGQ6OnN0cmluZywgY29udmVydGluZyBOVUwKKy8vIGJ5dGVzIHRvICJcXDAiIGFsb25nIHRoZSB3YXkuCitzdGQ6OnN0cmluZyBTdHJpbmdTdHJlYW1Ub1N0cmluZyg6OnN0ZDo6c3RyaW5nc3RyZWFtKiBzcykgeworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIgPSBzcy0+c3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXJ0ID0gc3RyLmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyLmxlbmd0aCgpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoMiAqIChlbmQgLSBzdGFydCkpOworICBmb3IgKGNvbnN0IGNoYXIqIGNoID0gc3RhcnQ7IGNoICE9IGVuZDsgKytjaCkgeworICAgIGlmICgqY2ggPT0gJ1wwJykgeworICAgICAgcmVzdWx0ICs9ICJcXDAiOyAgLy8gUmVwbGFjZXMgTlVMIHdpdGggIlxcMCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAqY2g7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQXBwZW5kcyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlIHRvIHRoZSBHb29nbGUtVGVzdC1nZW5lcmF0ZWQgbWVzc2FnZS4KK3N0ZDo6c3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBndGVzdF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiB1c2VyX21zZykgeworICAvLyBBcHBlbmRzIHRoZSB1c2VyIG1lc3NhZ2UgaWYgaXQncyBub24tZW1wdHkuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHVzZXJfbXNnX3N0cmluZyA9IHVzZXJfbXNnLkdldFN0cmluZygpOworICBpZiAodXNlcl9tc2dfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gZ3Rlc3RfbXNnOworICB9CisKKyAgcmV0dXJuIGd0ZXN0X21zZyArICJcbiIgKyB1c2VyX21zZ19zdHJpbmc7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBjbGFzcyBUZXN0UmVzdWx0CisKKy8vIENyZWF0ZXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4KK1Rlc3RSZXN1bHQ6OlRlc3RSZXN1bHQoKQorICAgIDogZGVhdGhfdGVzdF9jb3VudF8oMCksCisgICAgICBlbGFwc2VkX3RpbWVfKDApIHsKK30KKworLy8gRCd0b3IuCitUZXN0UmVzdWx0Ojp+VGVzdFJlc3VsdCgpIHsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHBhcnQgcmVzdWx0IGFtb25nIGFsbCB0aGUgcmVzdWx0cy4gaSBjYW4KKy8vIHJhbmdlIGZyb20gMCB0byB0b3RhbF9wYXJ0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLAorLy8gYWJvcnRzIHRoZSBwcm9ncmFtLgorY29uc3QgVGVzdFBhcnRSZXN1bHQmIFRlc3RSZXN1bHQ6OkdldFRlc3RQYXJ0UmVzdWx0KGludCBpKSBjb25zdCB7CisgIGlmIChpIDwgMCB8fCBpID49IHRvdGFsX3BhcnRfY291bnQoKSkKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIHJldHVybiB0ZXN0X3BhcnRfcmVzdWx0c18uYXQoaSk7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwcm9wZXJ0eS4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMgdGhlCisvLyBwcm9ncmFtLgorY29uc3QgVGVzdFByb3BlcnR5JiBUZXN0UmVzdWx0OjpHZXRUZXN0UHJvcGVydHkoaW50IGkpIGNvbnN0IHsKKyAgaWYgKGkgPCAwIHx8IGkgPj0gdGVzdF9wcm9wZXJ0eV9jb3VudCgpKQorICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgcmV0dXJuIHRlc3RfcHJvcGVydGllc18uYXQoaSk7Cit9CisKKy8vIENsZWFycyB0aGUgdGVzdCBwYXJ0IHJlc3VsdHMuCit2b2lkIFRlc3RSZXN1bHQ6OkNsZWFyVGVzdFBhcnRSZXN1bHRzKCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsKK30KKworLy8gQWRkcyBhIHRlc3QgcGFydCByZXN1bHQgdG8gdGhlIGxpc3QuCit2b2lkIFRlc3RSZXN1bHQ6OkFkZFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5wdXNoX2JhY2sodGVzdF9wYXJ0X3Jlc3VsdCk7Cit9CisKKy8vIEFkZHMgYSB0ZXN0IHByb3BlcnR5IHRvIHRoZSBsaXN0LiBJZiBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5IGFzIHRoZQorLy8gc3VwcGxpZWQgcHJvcGVydHkgaXMgYWxyZWFkeSByZXByZXNlbnRlZCwgdGhlIHZhbHVlIG9mIHRoaXMgdGVzdF9wcm9wZXJ0eQorLy8gcmVwbGFjZXMgdGhlIG9sZCB2YWx1ZSBmb3IgdGhhdCBrZXkuCit2b2lkIFRlc3RSZXN1bHQ6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7CisgIGlmICghVmFsaWRhdGVUZXN0UHJvcGVydHkoeG1sX2VsZW1lbnQsIHRlc3RfcHJvcGVydHkpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmdGVzdF9wcm9wZXJpdGVzX211dGV4Xyk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT46Oml0ZXJhdG9yIHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5ID0KKyAgICAgIHN0ZDo6ZmluZF9pZih0ZXN0X3Byb3BlcnRpZXNfLmJlZ2luKCksIHRlc3RfcHJvcGVydGllc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RQcm9wZXJ0eUtleUlzKHRlc3RfcHJvcGVydHkua2V5KCkpKTsKKyAgaWYgKHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5ID09IHRlc3RfcHJvcGVydGllc18uZW5kKCkpIHsKKyAgICB0ZXN0X3Byb3BlcnRpZXNfLnB1c2hfYmFjayh0ZXN0X3Byb3BlcnR5KTsKKyAgICByZXR1cm47CisgIH0KKyAgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXktPlNldFZhbHVlKHRlc3RfcHJvcGVydHkudmFsdWUoKSk7Cit9CisKKy8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RzdWl0ZXM+IGVsZW1lbnQgb2YgWE1MCisvLyBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1Jlc2VydmVkVGVzdFN1aXRlc0F0dHJpYnV0ZXNbXSA9IHsKKyAgImRpc2FibGVkIiwKKyAgImVycm9ycyIsCisgICJmYWlsdXJlcyIsCisgICJuYW1lIiwKKyAgInJhbmRvbV9zZWVkIiwKKyAgInRlc3RzIiwKKyAgInRpbWUiLAorICAidGltZXN0YW1wIgorfTsKKworLy8gVGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgYXR0cmlidXRlcyB1c2VkIGluIHRoZSA8dGVzdHN1aXRlPiBlbGVtZW50IG9mIFhNTAorLy8gb3V0cHV0Lgorc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtSZXNlcnZlZFRlc3RTdWl0ZUF0dHJpYnV0ZXNbXSA9IHsKKyAgImRpc2FibGVkIiwKKyAgImVycm9ycyIsCisgICJmYWlsdXJlcyIsCisgICJuYW1lIiwKKyAgInRlc3RzIiwKKyAgInRpbWUiCit9OworCisvLyBUaGUgbGlzdCBvZiByZXNlcnZlZCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIDx0ZXN0Y2FzZT4gZWxlbWVudCBvZiBYTUwgb3V0cHV0Lgorc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtSZXNlcnZlZFRlc3RDYXNlQXR0cmlidXRlc1tdID0geworICAiY2xhc3NuYW1lIiwKKyAgIm5hbWUiLAorICAic3RhdHVzIiwKKyAgInRpbWUiLAorICAidHlwZV9wYXJhbSIsCisgICJ2YWx1ZV9wYXJhbSIKK307CisKK3RlbXBsYXRlIDxpbnQga1NpemU+CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJyYXlBc1ZlY3Rvcihjb25zdCBjaGFyKiBjb25zdCAoJmFycmF5KVtrU2l6ZV0pIHsKKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPihhcnJheSwgYXJyYXkgKyBrU2l6ZSk7Cit9CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0UmVzZXJ2ZWRBdHRyaWJ1dGVzRm9yRWxlbWVudCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQpIHsKKyAgaWYgKHhtbF9lbGVtZW50ID09ICJ0ZXN0c3VpdGVzIikgeworICAgIHJldHVybiBBcnJheUFzVmVjdG9yKGtSZXNlcnZlZFRlc3RTdWl0ZXNBdHRyaWJ1dGVzKTsKKyAgfSBlbHNlIGlmICh4bWxfZWxlbWVudCA9PSAidGVzdHN1aXRlIikgeworICAgIHJldHVybiBBcnJheUFzVmVjdG9yKGtSZXNlcnZlZFRlc3RTdWl0ZUF0dHJpYnV0ZXMpOworICB9IGVsc2UgaWYgKHhtbF9lbGVtZW50ID09ICJ0ZXN0Y2FzZSIpIHsKKyAgICByZXR1cm4gQXJyYXlBc1ZlY3RvcihrUmVzZXJ2ZWRUZXN0Q2FzZUF0dHJpYnV0ZXMpOworICB9IGVsc2UgeworICAgIEdURVNUX0NIRUNLXyhmYWxzZSkgPDwgIlVucmVjb2duaXplZCB4bWxfZWxlbWVudCBwcm92aWRlZDogIiA8PCB4bWxfZWxlbWVudDsKKyAgfQorICAvLyBUaGlzIGNvZGUgaXMgdW5yZWFjaGFibGUgYnV0IHNvbWUgY29tcGlsZXJzIG1heSBub3QgcmVhbGl6ZXMgdGhhdC4KKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0V29yZExpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB3b3JkcykgeworICBNZXNzYWdlIHdvcmRfbGlzdDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3b3Jkcy5zaXplKCk7ICsraSkgeworICAgIGlmIChpID4gMCAmJiB3b3Jkcy5zaXplKCkgPiAyKSB7CisgICAgICB3b3JkX2xpc3QgPDwgIiwgIjsKKyAgICB9CisgICAgaWYgKGkgPT0gd29yZHMuc2l6ZSgpIC0gMSkgeworICAgICAgd29yZF9saXN0IDw8ICJhbmQgIjsKKyAgICB9CisgICAgd29yZF9saXN0IDw8ICInIiA8PCB3b3Jkc1tpXSA8PCAiJyI7CisgIH0KKyAgcmV0dXJuIHdvcmRfbGlzdC5HZXRTdHJpbmcoKTsKK30KKworYm9vbCBWYWxpZGF0ZVRlc3RQcm9wZXJ0eU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlc2VydmVkX25hbWVzKSB7CisgIGlmIChzdGQ6OmZpbmQocmVzZXJ2ZWRfbmFtZXMuYmVnaW4oKSwgcmVzZXJ2ZWRfbmFtZXMuZW5kKCksIHByb3BlcnR5X25hbWUpICE9CisgICAgICAgICAgcmVzZXJ2ZWRfbmFtZXMuZW5kKCkpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJSZXNlcnZlZCBrZXkgdXNlZCBpbiBSZWNvcmRQcm9wZXJ0eSgpOiAiIDw8IHByb3BlcnR5X25hbWUKKyAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgRm9ybWF0V29yZExpc3QocmVzZXJ2ZWRfbmFtZXMpCisgICAgICAgICAgICAgICAgICA8PCAiIGFyZSByZXNlcnZlZCBieSAiIDw8IEdURVNUX05BTUVfIDw8ICIpIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEFkZHMgYSBmYWlsdXJlIGlmIHRoZSBrZXkgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQgbmFtZWQKKy8vIHhtbF9lbGVtZW50LiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4KK2Jvb2wgVGVzdFJlc3VsdDo6VmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKKyAgcmV0dXJuIFZhbGlkYXRlVGVzdFByb3BlcnR5TmFtZSh0ZXN0X3Byb3BlcnR5LmtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJlc2VydmVkQXR0cmlidXRlc0ZvckVsZW1lbnQoeG1sX2VsZW1lbnQpKTsKK30KKworLy8gQ2xlYXJzIHRoZSBvYmplY3QuCit2b2lkIFRlc3RSZXN1bHQ6OkNsZWFyKCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsKKyAgdGVzdF9wcm9wZXJ0aWVzXy5jbGVhcigpOworICBkZWF0aF90ZXN0X2NvdW50XyA9IDA7CisgIGVsYXBzZWRfdGltZV8gPSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6RmFpbGVkKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEdldFRlc3RQYXJ0UmVzdWx0KGkpLmZhaWxlZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmF0YWxseSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0UGFydEZhdGFsbHlGYWlsZWQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gcmVzdWx0LmZhdGFsbHlfZmFpbGVkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCitib29sIFRlc3RSZXN1bHQ6Okhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9wYXJ0X3Jlc3VsdHNfLCBUZXN0UGFydEZhdGFsbHlGYWlsZWQpID4gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IG5vbi1mYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQubm9uZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgoraW50IFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcGFydF9yZXN1bHRzXy5zaXplKCkpOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KK2ludCBUZXN0UmVzdWx0Ojp0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X3Byb3BlcnRpZXNfLnNpemUoKSk7Cit9CisKKy8vIGNsYXNzIFRlc3QKKworLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0LgorCisvLyBUaGUgYyd0b3Igc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitUZXN0OjpUZXN0KCkKKyAgICA6IGd0ZXN0X2ZsYWdfc2F2ZXJfKG5ldyBpbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIpIHsKK30KKworLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorVGVzdDo6flRlc3QoKSB7CisgIGRlbGV0ZSBndGVzdF9mbGFnX3NhdmVyXzsKK30KKworLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpTZXRVcCgpIHsKK30KKworLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpUZWFyRG93bigpIHsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZSk7Cit9CisKKy8vIEFsbG93cyB1c2VyIHN1cHBsaWVkIGtleSB2YWx1ZSBwYWlycyB0byBiZSByZWNvcmRlZCBmb3IgbGF0ZXIgb3V0cHV0Lgordm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpIHsKKyAgTWVzc2FnZSB2YWx1ZV9tZXNzYWdlOworICB2YWx1ZV9tZXNzYWdlIDw8IHZhbHVlOworICBSZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlX21lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgUmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIGZyaWVuZCBvZiBVbml0VGVzdCBhbmQgYXMgc3VjaCBoYXMgYWNjZXNzIHRvCisgIC8vIEFkZFRlc3RQYXJ0UmVzdWx0LgorICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkVGVzdFBhcnRSZXN1bHQoCisgICAgICByZXN1bHRfdHlwZSwKKyAgICAgIE5VTEwsICAvLyBObyBpbmZvIGFib3V0IHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAgLTEsICAgIC8vIFdlIGhhdmUgbm8gaW5mbyBvbiB3aGljaCBsaW5lIGNhdXNlZCB0aGUgZXhjZXB0aW9uLgorICAgICAgbWVzc2FnZSwKKyAgICAgICIiKTsgICAvLyBObyBzdGFjayB0cmFjZSwgZWl0aGVyLgorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gR29vZ2xlIFRlc3QgcmVxdWlyZXMgYWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSB0byB1c2UgdGhlIHNhbWUgdGVzdAorLy8gZml4dHVyZSBjbGFzcy4gIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjdXJyZW50IHRlc3QgaGFzIHRoZQorLy8gc2FtZSBmaXh0dXJlIGNsYXNzIGFzIHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4gIElmCisvLyB5ZXMsIGl0IHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGl0IGdlbmVyYXRlcyBhIEdvb2dsZSBUZXN0IGZhaWx1cmUgYW5kCisvLyByZXR1cm5zIGZhbHNlLgorYm9vbCBUZXN0OjpIYXNTYW1lRml4dHVyZUNsYXNzKCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gaW1wbC0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKKworICAvLyBJbmZvIGFib3V0IHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4KKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGZpcnN0X3Rlc3RfaW5mbyA9IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVswXTsKKyAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXJzdF9maXh0dXJlX2lkID0gZmlyc3RfdGVzdF9pbmZvLT5maXh0dXJlX2NsYXNzX2lkXzsKKyAgY29uc3QgY2hhciogY29uc3QgZmlyc3RfdGVzdF9uYW1lID0gZmlyc3RfdGVzdF9pbmZvLT5uYW1lKCk7CisKKyAgLy8gSW5mbyBhYm91dCB0aGUgY3VycmVudCB0ZXN0LgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGhpc190ZXN0X2luZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIHRoaXNfZml4dHVyZV9pZCA9IHRoaXNfdGVzdF9pbmZvLT5maXh0dXJlX2NsYXNzX2lkXzsKKyAgY29uc3QgY2hhciogY29uc3QgdGhpc190ZXN0X25hbWUgPSB0aGlzX3Rlc3RfaW5mby0+bmFtZSgpOworCisgIGlmICh0aGlzX2ZpeHR1cmVfaWQgIT0gZmlyc3RfZml4dHVyZV9pZCkgeworICAgIC8vIElzIHRoZSBmaXJzdCB0ZXN0IGRlZmluZWQgdXNpbmcgVEVTVD8KKyAgICBjb25zdCBib29sIGZpcnN0X2lzX1RFU1QgPSBmaXJzdF9maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7CisgICAgLy8gSXMgdGhpcyB0ZXN0IGRlZmluZWQgdXNpbmcgVEVTVD8KKyAgICBjb25zdCBib29sIHRoaXNfaXNfVEVTVCA9IHRoaXNfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOworCisgICAgaWYgKGZpcnN0X2lzX1RFU1QgfHwgdGhpc19pc19URVNUKSB7CisgICAgICAvLyBUaGUgdXNlciBtaXhlZCBURVNUIGFuZCBURVNUX0YgaW4gdGhpcyB0ZXN0IGNhc2UgLSB3ZSdsbCB0ZWxsCisgICAgICAvLyBoaW0vaGVyIGhvdyB0byBmaXggaXQuCisKKyAgICAgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRFU1QgYW5kIHRoZSBuYW1lIG9mIHRoZSBURVNUX0YuICBOb3RlCisgICAgICAvLyB0aGF0IGZpcnN0X2lzX1RFU1QgYW5kIHRoaXNfaXNfVEVTVCBjYW5ub3QgYm90aCBiZSB0cnVlLCBhcworICAgICAgLy8gdGhlIGZpeHR1cmUgSURzIGFyZSBkaWZmZXJlbnQgZm9yIHRoZSB0d28gdGVzdHMuCisgICAgICBjb25zdCBjaGFyKiBjb25zdCBURVNUX25hbWUgPQorICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyBmaXJzdF90ZXN0X25hbWUgOiB0aGlzX3Rlc3RfbmFtZTsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfRl9uYW1lID0KKyAgICAgICAgICBmaXJzdF9pc19URVNUID8gdGhpc190ZXN0X25hbWUgOiBmaXJzdF90ZXN0X25hbWU7CisKKyAgICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKKyAgICAgICAgICA8PCAiY2xhc3MsIHNvIG1peGluZyBURVNUX0YgYW5kIFRFU1QgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIGlzXG4iCisgICAgICAgICAgPDwgImlsbGVnYWwuICBJbiB0ZXN0IGNhc2UgIiA8PCB0aGlzX3Rlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKQorICAgICAgICAgIDw8ICIsXG4iCisgICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX0ZfbmFtZSA8PCAiIGlzIGRlZmluZWQgdXNpbmcgVEVTVF9GIGJ1dFxuIgorICAgICAgICAgIDw8ICJ0ZXN0ICIgPDwgVEVTVF9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNULiAgWW91IHByb2JhYmx5XG4iCisgICAgICAgICAgPDwgIndhbnQgdG8gY2hhbmdlIHRoZSBURVNUIHRvIFRFU1RfRiBvciBtb3ZlIGl0IHRvIGFub3RoZXIgdGVzdFxuIgorICAgICAgICAgIDw8ICJjYXNlLiI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSB1c2VyIGRlZmluZWQgdHdvIGZpeHR1cmUgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4KKyAgICAgIC8vIHR3byBuYW1lc3BhY2VzIC0gd2UnbGwgdGVsbCBoaW0vaGVyIGhvdyB0byBmaXggaXQuCisgICAgICBBRERfRkFJTFVSRSgpCisgICAgICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCB0aGlzX3Rlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSA8PCAiLFxuIgorICAgICAgICAgIDw8ICJ5b3UgZGVmaW5lZCB0ZXN0ICIgPDwgZmlyc3RfdGVzdF9uYW1lCisgICAgICAgICAgPDwgIiBhbmQgdGVzdCAiIDw8IHRoaXNfdGVzdF9uYW1lIDw8ICJcbiIKKyAgICAgICAgICA8PCAidXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZlxuIgorICAgICAgICAgIDw8ICJ0aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb25cbiIKKyAgICAgICAgICA8PCAidW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZVxuIgorICAgICAgICAgIDw8ICJvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuIjsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiBHVEVTVF9IQVNfU0VICisKKy8vIEFkZHMgYW4gImV4Y2VwdGlvbiB0aHJvd24iIGZhdGFsIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4gIFRoaXMKKy8vIGZ1bmN0aW9uIHJldHVybnMgaXRzIHJlc3VsdCB2aWEgYW4gb3V0cHV0IHBhcmFtZXRlciBwb2ludGVyIGJlY2F1c2UgVkMrKworLy8gcHJvaGliaXRzIGNyZWF0aW9uIG9mIG9iamVjdHMgd2l0aCBkZXN0cnVjdG9ycyBvbiBzdGFjayBpbiBmdW5jdGlvbnMKKy8vIHVzaW5nIF9fdHJ5IChzZWUgZXJyb3IgQzI3MTIpLgorc3RhdGljIHN0ZDo6c3RyaW5nKiBGb3JtYXRTZWhFeGNlcHRpb25NZXNzYWdlKERXT1JEIGV4Y2VwdGlvbl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7CisgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgbWVzc2FnZSA8PCAiU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgiIDw8IHN0ZDo6c2V0YmFzZSgxNikgPDwKKyAgICBleGNlcHRpb25fY29kZSA8PCBzdGQ6OnNldGJhc2UoMTApIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOworCisgIHJldHVybiBuZXcgc3RkOjpzdHJpbmcobWVzc2FnZS5HZXRTdHJpbmcoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0Lgorc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoY29uc3QgY2hhciogZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICBNZXNzYWdlIG1lc3NhZ2U7CisgIGlmIChkZXNjcmlwdGlvbiAhPSBOVUxMKSB7CisgICAgbWVzc2FnZSA8PCAiQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uIFwiIiA8PCBkZXNjcmlwdGlvbiA8PCAiXCIiOworICB9IGVsc2UgeworICAgIG1lc3NhZ2UgPDwgIlVua25vd24gQysrIGV4Y2VwdGlvbiI7CisgIH0KKyAgbWVzc2FnZSA8PCAiIHRocm93biBpbiAiIDw8IGxvY2F0aW9uIDw8ICIuIjsKKworICByZXR1cm4gbWVzc2FnZS5HZXRTdHJpbmcoKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZygKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7CisKK0dvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbigKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgZmFpbHVyZSkKKyAgICA6IDo6c3RkOjpydW50aW1lX2Vycm9yKFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZyhmYWlsdXJlKS5jX3N0cigpKSB7fQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFdlIHB1dCB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGluIHRoZSBpbnRlcm5hbCBuYW1lc3BhY2UgYXMgSUJNJ3MgeGxDCisvLyBjb21waWxlciByZWplY3RzIHRoZSBjb2RlIGlmIHRoZXkgd2VyZSBkZWNsYXJlZCBzdGF0aWMuCisKKy8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgaGFuZGxlcyBTRUggZXhjZXB0aW9ucyBpdCB0aHJvd3MsIHdoZW4KKy8vIFNFSCBpcyBzdXBwb3J0ZWQ7IHJldHVybnMgdGhlIDAtdmFsdWUgZm9yIHR5cGUgUmVzdWx0IGluIGNhc2Ugb2YgYW4KKy8vIFNFSCBleGNlcHRpb24uICAoTWljcm9zb2Z0IGNvbXBpbGVycyBjYW5ub3QgaGFuZGxlIFNFSCBhbmQgQysrCisvLyBleGNlcHRpb25zIGluIHRoZSBzYW1lIGZ1bmN0aW9uLiAgVGhlcmVmb3JlLCB3ZSBwcm92aWRlIGEgc2VwYXJhdGUKKy8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIFNFSCBleGNlcHRpb25zLikKK3RlbXBsYXRlIDxjbGFzcyBULCB0eXBlbmFtZSBSZXN1bHQ+CitSZXN1bHQgSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgVCogb2JqZWN0LCBSZXN1bHQgKFQ6OiptZXRob2QpKCksIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7CisjaWYgR1RFU1RfSEFTX1NFSAorICBfX3RyeSB7CisgICAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7CisgIH0gX19leGNlcHQgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkdUZXN0U2hvdWxkUHJvY2Vzc1NFSCggIC8vIE5PTElOVAorICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpKSkgeworICAgIC8vIFdlIGNyZWF0ZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2Ugb24gdGhlIGhlYXAgYmVjYXVzZSBWQysrIHByb2hpYml0cworICAgIC8vIGNyZWF0aW9uIG9mIG9iamVjdHMgd2l0aCBkZXN0cnVjdG9ycyBvbiBzdGFjayBpbiBmdW5jdGlvbnMgdXNpbmcgX190cnkKKyAgICAvLyAoc2VlIGVycm9yIEMyNzEyKS4KKyAgICBzdGQ6OnN0cmluZyogZXhjZXB0aW9uX21lc3NhZ2UgPSBGb3JtYXRTZWhFeGNlcHRpb25NZXNzYWdlKAorICAgICAgICBHZXRFeGNlcHRpb25Db2RlKCksIGxvY2F0aW9uKTsKKyAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4Y2VwdGlvbl9tZXNzYWdlKTsKKyAgICBkZWxldGUgZXhjZXB0aW9uX21lc3NhZ2U7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oMCk7CisgIH0KKyNlbHNlCisgICh2b2lkKWxvY2F0aW9uOworICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorfQorCisvLyBSdW5zIHRoZSBnaXZlbiBtZXRob2QgYW5kIGNhdGNoZXMgYW5kIHJlcG9ydHMgQysrIGFuZC9vciBTRUgtc3R5bGUKKy8vIGV4Y2VwdGlvbnMsIGlmIHRoZXkgYXJlIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZQorLy8gUmVzdWx0IGluIGNhc2Ugb2YgYW4gU0VIIGV4Y2VwdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBULCB0eXBlbmFtZSBSZXN1bHQ+CitSZXN1bHQgSGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgVCogb2JqZWN0LCBSZXN1bHQgKFQ6OiptZXRob2QpKCksIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7CisgIC8vIE5PVEU6IFRoZSB1c2VyIGNvZGUgY2FuIGFmZmVjdCB0aGUgd2F5IGluIHdoaWNoIEdvb2dsZSBUZXN0IGhhbmRsZXMKKyAgLy8gZXhjZXB0aW9ucyBieSBzZXR0aW5nIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyksIGJ1dCBvbmx5IGJlZm9yZQorICAvLyBSVU5fQUxMX1RFU1RTKCkgc3RhcnRzLiBJdCBpcyB0ZWNobmljYWxseSBwb3NzaWJsZSB0byBjaGVjayB0aGUgZmxhZworICAvLyBhZnRlciB0aGUgZXhjZXB0aW9uIGlzIGNhdWdodCBhbmQgZWl0aGVyIHJlcG9ydCBvciByZS10aHJvdyB0aGUKKyAgLy8gZXhjZXB0aW9uIGJhc2VkIG9uIHRoZSBmbGFnJ3MgdmFsdWU6CisgIC8vCisgIC8vIHRyeSB7CisgIC8vICAgLy8gUGVyZm9ybSB0aGUgdGVzdCBtZXRob2QuCisgIC8vIH0gY2F0Y2ggKC4uLikgeworICAvLyAgIGlmIChHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKQorICAvLyAgICAgLy8gUmVwb3J0IHRoZSBleGNlcHRpb24gYXMgZmFpbHVyZS4KKyAgLy8gICBlbHNlCisgIC8vICAgICB0aHJvdzsgIC8vIFJlLXRocm93cyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLgorICAvLyB9CisgIC8vCisgIC8vIEhvd2V2ZXIsIHRoZSBwdXJwb3NlIG9mIHRoaXMgZmxhZyBpcyB0byBhbGxvdyB0aGUgcHJvZ3JhbSB0byBkcm9wIGludG8KKyAgLy8gdGhlIGRlYnVnZ2VyIHdoZW4gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIE9uIG1vc3QgcGxhdGZvcm1zLCBvbmNlIHRoZQorICAvLyBjb250cm9sIGVudGVycyB0aGUgY2F0Y2ggYmxvY2ssIHRoZSBleGNlcHRpb24gb3JpZ2luIGluZm9ybWF0aW9uIGlzCisgIC8vIGxvc3QgYW5kIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgdGhlIHByb2dyYW0gYXQgdGhlIHBvaW50IG9mIHRoZQorICAvLyByZS10aHJvdyBpbiB0aGlzIGZ1bmN0aW9uIC0tIGluc3RlYWQgb2YgYXQgdGhlIHBvaW50IG9mIHRoZSBvcmlnaW5hbAorICAvLyB0aHJvdyBzdGF0ZW1lbnQgaW4gdGhlIGNvZGUgdW5kZXIgdGVzdC4gIEZvciB0aGlzIHJlYXNvbiwgd2UgcGVyZm9ybQorICAvLyB0aGUgY2hlY2sgZWFybHksIHNhY3JpZmljaW5nIHRoZSBhYmlsaXR5IHRvIGFmZmVjdCBHb29nbGUgVGVzdCdzCisgIC8vIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiB0aGUgbWV0aG9kIHdoZXJlIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLgorICBpZiAoaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jYXRjaF9leGNlcHRpb25zKCkpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICAgIHRyeSB7CisgICAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsKKyAgICB9IGNhdGNoIChjb25zdCBpbnRlcm5hbDo6R29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24mKSB7ICAvLyBOT0xJTlQKKyAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIHR5cGUgY2FuIG9ubHkgYmUgdGhyb3duIGJ5IGEgZmFpbGVkIEdvb2dsZQorICAgICAgLy8gVGVzdCBhc3NlcnRpb24gd2l0aCB0aGUgaW50ZW50aW9uIG9mIGxldHRpbmcgYW5vdGhlciB0ZXN0aW5nCisgICAgICAvLyBmcmFtZXdvcmsgY2F0Y2ggaXQuICBUaGVyZWZvcmUgd2UganVzdCByZS10aHJvdyBpdC4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7ICAvLyBOT0xJTlQKKyAgICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShlLndoYXQoKSwgbG9jYXRpb24pKTsKKyAgICB9IGNhdGNoICguLi4pIHsgIC8vIE5PTElOVAorICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKKyAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKE5VTEwsIGxvY2F0aW9uKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworI2Vsc2UKKyAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gUnVucyB0aGUgdGVzdCBhbmQgdXBkYXRlcyB0aGUgdGVzdCByZXN1bHQuCit2b2lkIFRlc3Q6OlJ1bigpIHsKKyAgaWYgKCFIYXNTYW1lRml4dHVyZUNsYXNzKCkpIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQodGhpcywgJlRlc3Q6OlNldFVwLCAiU2V0VXAoKSIpOworICAvLyBXZSB3aWxsIHJ1biB0aGUgdGVzdCBvbmx5IGlmIFNldFVwKCkgd2FzIHN1Y2Nlc3NmdWwuCisgIGlmICghSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICAgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgICAgdGhpcywgJlRlc3Q6OlRlc3RCb2R5LCAidGhlIHRlc3QgYm9keSIpOworICB9CisKKyAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSGVuY2Ugd2Ugd2lsbAorICAvLyBhbHdheXMgY2FsbCBUZWFyRG93bigpLCBldmVuIGlmIFNldFVwKCkgb3IgdGhlIHRlc3QgYm9keSBoYXMKKyAgLy8gZmFpbGVkLgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdDo6VGVhckRvd24sICJUZWFyRG93bigpIik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSB7CisgIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+SGFzRmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgeworICByZXR1cm4gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPgorICAgICAgSGFzTm9uZmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIGNsYXNzIFRlc3RJbmZvCisKKy8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIEl0IGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSB0ZXN0IGZhY3RvcnkKKy8vIG9iamVjdC4KK1Rlc3RJbmZvOjpUZXN0SW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgYV90ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3ZhbHVlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KQorICAgIDogdGVzdF9jYXNlX25hbWVfKGFfdGVzdF9jYXNlX25hbWUpLAorICAgICAgbmFtZV8oYV9uYW1lKSwKKyAgICAgIHR5cGVfcGFyYW1fKGFfdHlwZV9wYXJhbSA/IG5ldyBzdGQ6OnN0cmluZyhhX3R5cGVfcGFyYW0pIDogTlVMTCksCisgICAgICB2YWx1ZV9wYXJhbV8oYV92YWx1ZV9wYXJhbSA/IG5ldyBzdGQ6OnN0cmluZyhhX3ZhbHVlX3BhcmFtKSA6IE5VTEwpLAorICAgICAgZml4dHVyZV9jbGFzc19pZF8oZml4dHVyZV9jbGFzc19pZCksCisgICAgICBzaG91bGRfcnVuXyhmYWxzZSksCisgICAgICBpc19kaXNhYmxlZF8oZmFsc2UpLAorICAgICAgbWF0Y2hlc19maWx0ZXJfKGZhbHNlKSwKKyAgICAgIGZhY3RvcnlfKGZhY3RvcnkpLAorICAgICAgcmVzdWx0XygpIHt9CisKKy8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4KK1Rlc3RJbmZvOjp+VGVzdEluZm8oKSB7IGRlbGV0ZSBmYWN0b3J5XzsgfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBDcmVhdGVzIGEgbmV3IFRlc3RJbmZvIG9iamVjdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggR29vZ2xlIFRlc3Q7CisvLyByZXR1cm5zIHRoZSBjcmVhdGVkIG9iamVjdC4KKy8vCisvLyBBcmd1bWVudHM6CisvLworLy8gICB0ZXN0X2Nhc2VfbmFtZTogICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgbmFtZTogICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdAorLy8gICB0eXBlX3BhcmFtOiAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKy8vICAgdmFsdWVfcGFyYW06ICAgICAgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVzdCdzIHZhbHVlIHBhcmFtZXRlciwKKy8vICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKy8vICAgZml4dHVyZV9jbGFzc19pZDogSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcworLy8gICBzZXRfdXBfdGM6ICAgICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6ICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorLy8gICBmYWN0b3J5OiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIHRlc3Qgb2JqZWN0LgorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgbmV3bHkgY3JlYXRlZCBUZXN0SW5mbyBpbnN0YW5jZSB3aWxsIGFzc3VtZQorLy8gICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgorVGVzdEluZm8qIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKKyAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgVGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkgeworICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgIG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwgbmFtZSwgdHlwZV9wYXJhbSwgdmFsdWVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgZml4dHVyZV9jbGFzc19pZCwgZmFjdG9yeSk7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5BZGRUZXN0SW5mbyhzZXRfdXBfdGMsIHRlYXJfZG93bl90YywgdGVzdF9pbmZvKTsKKyAgcmV0dXJuIHRlc3RfaW5mbzsKK30KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCit2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgTWVzc2FnZSBlcnJvcnM7CisgIGVycm9ycworICAgICAgPDwgIkF0dGVtcHRlZCByZWRlZmluaXRpb24gb2YgdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIi5cbiIKKyAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIiwgeW91IHRyaWVkXG4iCisgICAgICA8PCAidG8gZGVmaW5lIGEgdGVzdCB1c2luZyBhIGZpeHR1cmUgY2xhc3MgZGlmZmVyZW50IGZyb20gdGhlIG9uZVxuIgorICAgICAgPDwgInVzZWQgZWFybGllci4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB0d28gZml4dHVyZSBjbGFzc2VzIGFyZVxuIgorICAgICAgPDwgImZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gWW91IHNob3VsZFxuIgorICAgICAgPDwgInByb2JhYmx5IHJlbmFtZSBvbmUgb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudFxuIgorICAgICAgPDwgInRlc3QgY2FzZXMuIjsKKworICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzIiwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksCisgICAgICAgICAgZXJyb3JzLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIHsKKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIHRlc3QgbmFtZSBvZiBhIFRlc3RJbmZvIGFnYWluc3QgYSBrbm93bgorLy8gdmFsdWUuCisvLworLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVzdENhc2UgY2xhc3Mgb25seS4gIFdlIHB1dAorLy8gaXQgaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UgdG8gcHJldmVudCBwb2xsdXRpbmcgdGhlIG91dGVyCisvLyBuYW1lc3BhY2UuCisvLworLy8gVGVzdE5hbWVJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3ROYW1lSXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRlc3ROYW1lSXMgaGFzIE5PIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3ROYW1lSXMoY29uc3QgY2hhciogbmFtZSkKKyAgICAgIDogbmFtZV8obmFtZSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdF9pbmZvIG1hdGNoZXMgbmFtZV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0SW5mbyAqIHRlc3RfaW5mbykgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2luZm8gJiYgdGVzdF9pbmZvLT5uYW1lKCkgPT0gbmFtZV87CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoaXMgbWV0aG9kIGV4cGFuZHMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgcmVnaXN0ZXJlZCB3aXRoIG1hY3JvcyBURVNUX1AKKy8vIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBpbnRvIHJlZ3VsYXIgdGVzdHMgYW5kIHJlZ2lzdGVycyB0aG9zZS4KKy8vIFRoaXMgd2lsbCBiZSBkb25lIGp1c3Qgb25jZSBkdXJpbmcgdGhlIHByb2dyYW0gcnVudGltZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIHsKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBpZiAoIXBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8pIHsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfLlJlZ2lzdGVyVGVzdHMoKTsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKKyAgfQorI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgorLy8gZGVsZXRlcyBpdC4KK3ZvaWQgVGVzdEluZm86OlJ1bigpIHsKKyAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHdoZXJlIHRvIHN0b3JlIHRlc3QgcmVzdWx0LgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8odGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHRlc3QgaXMgYWJvdXQgdG8gc3RhcnQuCisgIHJlcGVhdGVyLT5PblRlc3RTdGFydCgqdGhpcyk7CisKKyAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpOworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QuCisgIFRlc3QqIGNvbnN0IHRlc3QgPSBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICBmYWN0b3J5XywgJmludGVybmFsOjpUZXN0RmFjdG9yeUJhc2U6OkNyZWF0ZVRlc3QsCisgICAgICAidGhlIHRlc3QgZml4dHVyZSdzIGNvbnN0cnVjdG9yIik7CisKKyAgLy8gUnVucyB0aGUgdGVzdCBvbmx5IGlmIHRoZSB0ZXN0IG9iamVjdCB3YXMgY3JlYXRlZCBhbmQgaXRzCisgIC8vIGNvbnN0cnVjdG9yIGRpZG4ndCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUuCisgIGlmICgodGVzdCAhPSBOVUxMKSAmJiAhVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAvLyBUaGlzIGRvZXNuJ3QgdGhyb3cgYXMgYWxsIHVzZXIgY29kZSB0aGF0IGNhbiB0aHJvdyBhcmUgd3JhcHBlZCBpbnRvCisgICAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUuCisgICAgdGVzdC0+UnVuKCk7CisgIH0KKworICAvLyBEZWxldGVzIHRoZSB0ZXN0IG9iamVjdC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGVzdCwgJlRlc3Q6OkRlbGV0ZVNlbGZfLCAidGhlIHRlc3QgZml4dHVyZSdzIGRlc3RydWN0b3IiKTsKKworICByZXN1bHRfLnNldF9lbGFwc2VkX3RpbWUoaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQpOworCisgIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCBhIHRlc3QgaGFzIGp1c3QgZmluaXNoZWQuCisgIHJlcGVhdGVyLT5PblRlc3RFbmQoKnRoaXMpOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHRvIHN0b3AgYXNzb2NpYXRpbmcgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhpcworICAvLyB0ZXN0LgorICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7Cit9CisKKy8vIGNsYXNzIFRlc3RDYXNlCisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgoraW50IFRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCitpbnQgVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RGYWlsZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFRlc3RDYXNlOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFJlcG9ydGFibGVEaXNhYmxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK2ludCBUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0RGlzYWJsZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KK2ludCBUZXN0Q2FzZTo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RSZXBvcnRhYmxlKTsKK30KKworLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgoraW50IFRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBTaG91bGRSdW5UZXN0KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9pbmZvX2xpc3RfLnNpemUoKSk7Cit9CisKKy8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2U6OlRlc3RDYXNlKGNvbnN0IGNoYXIqIGFfbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpCisgICAgOiBuYW1lXyhhX25hbWUpLAorICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIHNldF91cF90Y18oc2V0X3VwX3RjKSwKKyAgICAgIHRlYXJfZG93bl90Y18odGVhcl9kb3duX3RjKSwKKyAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorVGVzdENhc2U6On5UZXN0Q2FzZSgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0IGluIHRoZSBjb2xsZWN0aW9uLgorICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0SW5mbz4pOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0SW5mbyogVGVzdENhc2U6OkdldFRlc3RJbmZvKGludCBpKSBjb25zdCB7CisgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7CisgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpIHsKKyAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKKyAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOworfQorCisvLyBBZGRzIGEgdGVzdCB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSB0ZXN0IHVwb24KKy8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCit2b2lkIFRlc3RDYXNlOjpBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbykgeworICB0ZXN0X2luZm9fbGlzdF8ucHVzaF9iYWNrKHRlc3RfaW5mbyk7CisgIHRlc3RfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9pbmRpY2VzXy5zaXplKCkpKTsKK30KKworLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCit2b2lkIFRlc3RDYXNlOjpSdW4oKSB7CisgIGlmICghc2hvdWxkX3J1bl8pIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UodGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgcmVwZWF0ZXItPk9uVGVzdENhc2VTdGFydCgqdGhpcyk7CisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuU2V0VXBUZXN0Q2FzZSwgIlNldFVwVGVzdENhc2UoKSIpOworCisgIGNvbnN0IGludGVybmFsOjpUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfdGVzdF9jb3VudCgpOyBpKyspIHsKKyAgICBHZXRNdXRhYmxlVGVzdEluZm8oaSktPlJ1bigpOworICB9CisgIGVsYXBzZWRfdGltZV8gPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdENhc2U6OlJ1blRlYXJEb3duVGVzdENhc2UsICJUZWFyRG93blRlc3RDYXNlKCkiKTsKKworICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZShOVUxMKTsKK30KKworLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OkNsZWFyUmVzdWx0KCkgeworICBhZF9ob2NfdGVzdF9yZXN1bHRfLkNsZWFyKCk7CisgIEZvckVhY2godGVzdF9pbmZvX2xpc3RfLCBUZXN0SW5mbzo6Q2xlYXJUZXN0UmVzdWx0KTsKK30KKworLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgordm9pZCBUZXN0Q2FzZTo6U2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSkgeworICBTaHVmZmxlKHJhbmRvbSwgJnRlc3RfaW5kaWNlc18pOworfQorCisvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCit2b2lkIFRlc3RDYXNlOjpVbnNodWZmbGVUZXN0cygpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2luZGljZXNfLnNpemUoKTsgaSsrKSB7CisgICAgdGVzdF9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7CisgIH0KK30KKworLy8gRm9ybWF0cyBhIGNvdW50YWJsZSBub3VuLiAgRGVwZW5kaW5nIG9uIGl0cyBxdWFudGl0eSwgZWl0aGVyIHRoZQorLy8gc2luZ3VsYXIgZm9ybSBvciB0aGUgcGx1cmFsIGZvcm0gaXMgdXNlZC4gZS5nLgorLy8KKy8vIEZvcm1hdENvdW50YWJsZU5vdW4oMSwgImZvcm11bGEiLCAiZm9ybXVsaSIpIHJldHVybnMgIjEgZm9ybXVsYSIuCisvLyBGb3JtYXRDb3VudGFibGVOb3VuKDUsICJib29rIiwgImJvb2tzIikgcmV0dXJucyAiNSBib29rcyIuCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogc2luZ3VsYXJfZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBwbHVyYWxfZm9ybSkgeworICByZXR1cm4gaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhjb3VudCkgKyAiICIgKworICAgICAgKGNvdW50ID09IDEgPyBzaW5ndWxhcl9mb3JtIDogcGx1cmFsX2Zvcm0pOworfQorCisvLyBGb3JtYXRzIHRoZSBjb3VudCBvZiB0ZXN0cy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q291bnQoaW50IHRlc3RfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q2FzZUNvdW50KGludCB0ZXN0X2Nhc2VfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlX2NvdW50LCAidGVzdCBjYXNlIiwgInRlc3QgY2FzZXMiKTsKK30KKworLy8gQ29udmVydHMgYSBUZXN0UGFydFJlc3VsdDo6VHlwZSBlbnVtIHRvIGh1bWFuLWZyaWVuZGx5IHN0cmluZworLy8gcmVwcmVzZW50YXRpb24uICBCb3RoIGtOb25GYXRhbEZhaWx1cmUgYW5kIGtGYXRhbEZhaWx1cmUgYXJlIHRyYW5zbGF0ZWQKKy8vIHRvICJGYWlsdXJlIiwgYXMgdGhlIHVzZXIgdXN1YWxseSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UKKy8vIGJldHdlZW4gdGhlIHR3byB3aGVuIHZpZXdpbmcgdGhlIHRlc3QgcmVzdWx0Lgorc3RhdGljIGNvbnN0IGNoYXIgKiBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyhUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzOgorICAgICAgcmV0dXJuICJTdWNjZXNzIjsKKworICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmU6CisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZToKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgcmV0dXJuICJlcnJvcjogIjsKKyNlbHNlCisgICAgICByZXR1cm4gIkZhaWx1cmVcbiI7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJVbmtub3duIHJlc3VsdCB0eXBlIjsKKyAgfQorfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCB0byBhbiBzdGQ6OnN0cmluZy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkKKyAgICAgICAgICA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpCisgICAgICAgICAgPDwgIiAiIDw8IFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQudHlwZSgpKQorICAgICAgICAgIDw8IHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKS5HZXRTdHJpbmcoKTsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQuCitzdGF0aWMgdm9pZCBQcmludFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXN1bHQgPQorICAgICAgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQpOworICBwcmludGYoIiVzXG4iLCByZXN1bHQuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworICAvLyBJZiB0aGUgdGVzdCBwcm9ncmFtIHJ1bnMgaW4gVmlzdWFsIFN0dWRpbyBvciBhIGRlYnVnZ2VyLCB0aGUKKyAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dAorICAvLyB3aW5kb3cgc3VjaCB0aGF0IHRoZSB1c2VyIGNhbiBkb3VibGUtY2xpY2sgb24gaXQgdG8ganVtcCB0byB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBsb2NhdGlvbjsgb3RoZXJ3aXNlIHRoZXkgZG8gbm90aGluZy4KKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXZSBkb24ndCBjYWxsIE91dHB1dERlYnVnU3RyaW5nKigpIG9uIFdpbmRvd3MgTW9iaWxlLCBhcyBwcmludGluZworICAvLyB0byBzdGRvdXQgaXMgZG9uZSBieSBPdXRwdXREZWJ1Z1N0cmluZygpIHRoZXJlIGFscmVhZHkgLSB3ZSBkb24ndAorICAvLyB3YW50IHRoZSBzYW1lIG1lc3NhZ2UgcHJpbnRlZCB0d2ljZS4KKyAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EocmVzdWx0LmNfc3RyKCkpOworICA6Ok91dHB1dERlYnVnU3RyaW5nQSgiXG4iKTsKKyNlbmRpZgorfQorCisvLyBjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworZW51bSBHVGVzdENvbG9yIHsKKyAgQ09MT1JfREVGQVVMVCwKKyAgQ09MT1JfUkVELAorICBDT0xPUl9HUkVFTiwKKyAgQ09MT1JfWUVMTE9XCit9OworCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yLgorV09SRCBHZXRDb2xvckF0dHJpYnV0ZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgcmV0dXJuIEZPUkVHUk9VTkRfUkVEOworICAgIGNhc2UgQ09MT1JfR1JFRU46ICByZXR1cm4gRk9SRUdST1VORF9HUkVFTjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzogcmV0dXJuIEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9HUkVFTjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2Vsc2UKKworLy8gUmV0dXJucyB0aGUgQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gY29sb3IuICBDT0xPUl9ERUZBVUxUIGlzCisvLyBhbiBpbnZhbGlkIGlucHV0LgorY29uc3QgY2hhciogR2V0QW5zaUNvbG9yQ29kZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgIHJldHVybiAiMSI7CisgICAgY2FzZSBDT0xPUl9HUkVFTjogICByZXR1cm4gIjIiOworICAgIGNhc2UgQ09MT1JfWUVMTE9XOiAgcmV0dXJuICIzIjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBOVUxMOworICB9OworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KK2Jvb2wgU2hvdWxkVXNlQ29sb3IoYm9vbCBzdGRvdXRfaXNfdHR5KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X2NvbG9yID0gR1RFU1RfRkxBRyhjb2xvcikuY19zdHIoKTsKKworICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiYXV0byIpKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlCisgICAgLy8gY29uc29sZSB0aGVyZSBkb2VzIHN1cHBvcnQgY29sb3JzLgorICAgIHJldHVybiBzdGRvdXRfaXNfdHR5OworI2Vsc2UKKyAgICAvLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHdlIHJlbHkgb24gdGhlIFRFUk0gdmFyaWFibGUuCisgICAgY29uc3QgY2hhciogY29uc3QgdGVybSA9IHBvc2l4OjpHZXRFbnYoIlRFUk0iKTsKKyAgICBjb25zdCBib29sIHRlcm1fc3VwcG9ydHNfY29sb3IgPQorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS1jb2xvciIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tMjU2Y29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInNjcmVlbiIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAic2NyZWVuLTI1NmNvbG9yIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJsaW51eCIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAiY3lnd2luIik7CisgICAgcmV0dXJuIHN0ZG91dF9pc190dHkgJiYgdGVybV9zdXBwb3J0c19jb2xvcjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICB9CisKKyAgcmV0dXJuIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInllcyIpIHx8CisgICAgICBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ0cnVlIikgfHwKKyAgICAgIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInQiKSB8fAorICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiMSIpOworICAvLyBXZSB0YWtlICJ5ZXMiLCAidHJ1ZSIsICJ0IiwgYW5kICIxIiBhcyBtZWFuaW5nICJ5ZXMiLiAgSWYgdGhlCisgIC8vIHZhbHVlIGlzIG5laXRoZXIgb25lIG9mIHRoZXNlIG5vciAiYXV0byIsIHdlIHRyZWF0IGl0IGFzICJubyIgdG8KKyAgLy8gYmUgY29uc2VydmF0aXZlLgorfQorCisvLyBIZWxwZXJzIGZvciBwcmludGluZyBjb2xvcmVkIHN0cmluZ3MgdG8gc3Rkb3V0LiBOb3RlIHRoYXQgb24gV2luZG93cywgd2UKKy8vIGNhbm5vdCBzaW1wbHkgZW1pdCBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGhhdmUgdGhlIHRlcm1pbmFsIGNoYW5nZSBjb2xvcnMuCisvLyBUaGlzIHJvdXRpbmUgbXVzdCBhY3R1YWxseSBlbWl0IHRoZSBjaGFyYWN0ZXJzIHJhdGhlciB0aGFuIHJldHVybiBhIHN0cmluZworLy8gdGhhdCB3b3VsZCBiZSBjb2xvcmVkIHdoZW4gcHJpbnRlZCwgYXMgY2FuIGJlIGRvbmUgb24gTGludXguCit2b2lkIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvciBjb2xvciwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBHVEVTVF9PU19aT1MgfHwgR1RFU1RfT1NfSU9TCisgIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gZmFsc2U7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCBpbl9jb2xvcl9tb2RlID0KKyAgICAgIFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkocG9zaXg6OkZpbGVObyhzdGRvdXQpKSAhPSAwKTsKKyAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBpbl9jb2xvcl9tb2RlICYmIChjb2xvciAhPSBDT0xPUl9ERUZBVUxUKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBHVEVTVF9PU19aT1MKKyAgLy8gVGhlICchPSAwJyBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IE1TVkMgNy4xLgorCisgIGlmICghdXNlX2NvbG9yKSB7CisgICAgdnByaW50ZihmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIGNvbnN0IEhBTkRMRSBzdGRvdXRfaGFuZGxlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKworICAvLyBHZXRzIHRoZSBjdXJyZW50IHRleHQgY29sb3IuCisgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGJ1ZmZlcl9pbmZvOworICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhzdGRvdXRfaGFuZGxlLCAmYnVmZmVyX2luZm8pOworICBjb25zdCBXT1JEIG9sZF9jb2xvcl9hdHRycyA9IGJ1ZmZlcl9pbmZvLndBdHRyaWJ1dGVzOworCisgIC8vIFdlIG5lZWQgdG8gZmx1c2ggdGhlIHN0cmVhbSBidWZmZXJzIGludG8gdGhlIGNvbnNvbGUgYmVmb3JlIGVhY2gKKyAgLy8gU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgY2FsbCBsZXN0IGl0IGFmZmVjdCB0aGUgdGV4dCB0aGF0IGlzIGFscmVhZHkKKyAgLy8gcHJpbnRlZCBidXQgaGFzIG5vdCB5ZXQgcmVhY2hlZCB0aGUgY29uc29sZS4KKyAgZmZsdXNoKHN0ZG91dCk7CisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbG9yQXR0cmlidXRlKGNvbG9yKSB8IEZPUkVHUk9VTkRfSU5URU5TSVRZKTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworCisgIGZmbHVzaChzdGRvdXQpOworICAvLyBSZXN0b3JlcyB0aGUgdGV4dCBjb2xvci4KKyAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwgb2xkX2NvbG9yX2F0dHJzKTsKKyNlbHNlCisgIHByaW50ZigiXDAzM1swOzMlc20iLCBHZXRBbnNpQ29sb3JDb2RlKGNvbG9yKSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgcHJpbnRmKCJcMDMzW20iKTsgIC8vIFJlc2V0cyB0aGUgdGVybWluYWwgdG8gZGVmYXVsdC4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgdmFfZW5kKGFyZ3MpOworfQorCisvLyBUZXh0IHByaW50ZWQgaW4gR29vZ2xlIFRlc3QncyB0ZXh0IG91dHB1dCBhbmQgLS1ndW5pdF9saXN0X3Rlc3RzCisvLyBvdXRwdXQgdG8gbGFiZWwgdGhlIHR5cGUgcGFyYW1ldGVyIGFuZCB2YWx1ZSBwYXJhbWV0ZXIgZm9yIGEgdGVzdC4KK3N0YXRpYyBjb25zdCBjaGFyIGtUeXBlUGFyYW1MYWJlbFtdID0gIlR5cGVQYXJhbSI7CitzdGF0aWMgY29uc3QgY2hhciBrVmFsdWVQYXJhbUxhYmVsW10gPSAiR2V0UGFyYW0oKSI7CisKK3ZvaWQgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBjb25zdCBjaGFyKiBjb25zdCB0eXBlX3BhcmFtID0gdGVzdF9pbmZvLnR5cGVfcGFyYW0oKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfcGFyYW0gPSB0ZXN0X2luZm8udmFsdWVfcGFyYW0oKTsKKworICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMIHx8IHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKKyAgICBwcmludGYoIiwgd2hlcmUgIik7CisgICAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCkgeworICAgICAgcHJpbnRmKCIlcyA9ICVzIiwga1R5cGVQYXJhbUxhYmVsLCB0eXBlX3BhcmFtKTsKKyAgICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKQorICAgICAgICBwcmludGYoIiBhbmQgIik7CisgICAgfQorICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICBwcmludGYoIiVzID0gJXMiLCBrVmFsdWVQYXJhbUxhYmVsLCB2YWx1ZV9wYXJhbSk7CisgICAgfQorICB9Cit9CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlLgorLy8KKy8vIENsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciBpcyBjb3B5YWJsZS4KK2NsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIoKSB7fQorICBzdGF0aWMgdm9pZCBQcmludFRlc3ROYW1lKGNvbnN0IGNoYXIgKiB0ZXN0X2Nhc2UsIGNvbnN0IGNoYXIgKiB0ZXN0KSB7CisgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZSwgdGVzdCk7CisgIH0KKworICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgb3ZlcnJpZGUgd2hhdCdzIGluIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIFByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Cit9OworCisgIC8vIEZpcmVkIGJlZm9yZSBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbikgeworICBpZiAoR1RFU1RfRkxBRyhyZXBlYXQpICE9IDEpCisgICAgcHJpbnRmKCJcblJlcGVhdGluZyBhbGwgdGVzdHMgKGl0ZXJhdGlvbiAlZCkgLiAuIC5cblxuIiwgaXRlcmF0aW9uICsgMSk7CisKKyAgY29uc3QgY2hhciogY29uc3QgZmlsdGVyID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7CisKKyAgLy8gUHJpbnRzIHRoZSBmaWx0ZXIgaWYgaXQncyBub3QgKi4gIFRoaXMgcmVtaW5kcyB0aGUgdXNlciB0aGF0IHNvbWUKKyAgLy8gdGVzdHMgbWF5IGJlIHNraXBwZWQuCisgIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGZpbHRlciwga1VuaXZlcnNhbEZpbHRlcikpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiAlcyBmaWx0ZXIgPSAlc1xuIiwgR1RFU1RfTkFNRV8sIGZpbHRlcik7CisgIH0KKworICBpZiAoaW50ZXJuYWw6OlNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwgZmFsc2UpKSB7CisgICAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKTsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiBUaGlzIGlzIHRlc3Qgc2hhcmQgJWQgb2YgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaGFyZF9pbmRleCkgKyAxLAorICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoa1Rlc3RUb3RhbFNoYXJkcykpOworICB9CisKKyAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiBSYW5kb21pemluZyB0ZXN0cycgb3JkZXJzIHdpdGggYSBzZWVkIG9mICVkIC5cbiIsCisgICAgICAgICAgICAgICAgICB1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSk7CisgIH0KKworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKKyAgcHJpbnRmKCJSdW5uaW5nICVzIGZyb20gJXMuXG4iLAorICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAorICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1NldFVwU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLlxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2UubmFtZSgpKTsKKyAgaWYgKHRlc3RfY2FzZS50eXBlX3BhcmFtKCkgPT0gTlVMTCkgeworICAgIHByaW50ZigiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIiwgd2hlcmUgJXMgPSAlc1xuIiwga1R5cGVQYXJhbUxhYmVsLCB0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpKTsKKyAgfQorICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbIFJVTiAgICAgIF0gIik7CisgIFByaW50VGVzdE5hbWUodGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICBwcmludGYoIlxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBDYWxsZWQgYWZ0ZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIC8vIElmIHRoZSB0ZXN0IHBhcnQgc3VjY2VlZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorICBpZiAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpCisgICAgcmV0dXJuOworCisgIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBhc3NlcnRpb24gKGUuZy4gZXhwZWN0ZWQgdGhpcyBhbmQgZ290IHRoYXQpLgorICBQcmludFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+UGFzc2VkKCkpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWyAgICAgICBPSyBdICIpOworICB9IGVsc2UgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOworICB9CisgIFByaW50VGVzdE5hbWUodGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5GYWlsZWQoKSkKKyAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOworCisgIGlmIChHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7CisgICAgcHJpbnRmKCIgKCVzIG1zKVxuIiwgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZygKKyAgICAgICAgICAgdGVzdF9pbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGlmICghR1RFU1RfRkxBRyhwcmludF90aW1lKSkgcmV0dXJuOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9CisgICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMgKCVzIG1zIHRvdGFsKVxuXG4iLAorICAgICAgICAgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCksCisgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93blxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIHByaW50aW5nIHRoZSBsaXN0IG9mIGZhaWxlZCB0ZXN0cy4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmIChmYWlsZWRfdGVzdF9jb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworICAgIGlmICghdGVzdF9jYXNlLnNob3VsZF9ydW4oKSB8fCAodGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCkgPT0gMCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraikgeworICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7CisgICAgICBpZiAoIXRlc3RfaW5mby5zaG91bGRfcnVuKCkgfHwgdGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOworICAgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZS5uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgICAgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQodGVzdF9pbmZvKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKKyAgcHJpbnRmKCIlcyBmcm9tICVzIHJhbi4iLAorICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAorICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKKyAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKKyAgICBwcmludGYoIiAoJXMgbXMgdG90YWwpIiwKKyAgICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOworICB9CisgIHByaW50ZigiXG4iKTsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbICBQQVNTRUQgIF0gIik7CisgIHByaW50ZigiJXMuXG4iLCBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKS5jX3N0cigpKTsKKworICBpbnQgbnVtX2ZhaWx1cmVzID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmICghdW5pdF90ZXN0LlBhc3NlZCgpKSB7CisgICAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICAiWyAgRkFJTEVEICBdICIpOworICAgIHByaW50ZigiJXMsIGxpc3RlZCBiZWxvdzpcbiIsIEZvcm1hdFRlc3RDb3VudChmYWlsZWRfdGVzdF9jb3VudCkuY19zdHIoKSk7CisgICAgUHJpbnRGYWlsZWRUZXN0cyh1bml0X3Rlc3QpOworICAgIHByaW50ZigiXG4lMmQgRkFJTEVEICVzXG4iLCBudW1fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fZmFpbHVyZXMgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpOworICB9CisKKyAgaW50IG51bV9kaXNhYmxlZCA9IHVuaXRfdGVzdC5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKG51bV9kaXNhYmxlZCAmJiAhR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsKKyAgICBpZiAoIW51bV9mYWlsdXJlcykgeworICAgICAgcHJpbnRmKCJcbiIpOyAgLy8gQWRkIGEgc3BhY2VyIGlmIG5vIEZBSUxVUkUgYmFubmVyIGlzIGRpc3BsYXllZC4KKyAgICB9CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiICBZT1UgSEFWRSAlZCBESVNBQkxFRCAlc1xuXG4iLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKTsKKyAgfQorICAvLyBFbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBvdXRwdXQgaXMgcHJpbnRlZCBiZWZvcmUsIGUuZy4sIGhlYXBjaGVja2VyIG91dHB1dC4KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIEVuZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworLy8gY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIKKy8vCisvLyBUaGlzIGNsYXNzIGZvcndhcmRzIGV2ZW50cyB0byBvdGhlciBldmVudCBsaXN0ZW5lcnMuCitjbGFzcyBUZXN0RXZlbnRSZXBlYXRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBUZXN0RXZlbnRSZXBlYXRlcigpIDogZm9yd2FyZGluZ19lbmFibGVkXyh0cnVlKSB7fQorICB2aXJ0dWFsIH5UZXN0RXZlbnRSZXBlYXRlcigpOworICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOworICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkaW5nX2VuYWJsZWRfOyB9CisgIHZvaWQgc2V0X2ZvcndhcmRpbmdfZW5hYmxlZChib29sIGVuYWJsZSkgeyBmb3J3YXJkaW5nX2VuYWJsZWRfID0gZW5hYmxlOyB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKworIHByaXZhdGU6CisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWRfOworICAvLyBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCByZWNlaXZlIGV2ZW50cy4KKyAgc3RkOjp2ZWN0b3I8VGVzdEV2ZW50TGlzdGVuZXIqPiBsaXN0ZW5lcnNfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50UmVwZWF0ZXIpOworfTsKKworVGVzdEV2ZW50UmVwZWF0ZXI6On5UZXN0RXZlbnRSZXBlYXRlcigpIHsKKyAgRm9yRWFjaChsaXN0ZW5lcnNfLCBEZWxldGU8VGVzdEV2ZW50TGlzdGVuZXI+KTsKK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6QXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgeworICBsaXN0ZW5lcnNfLnB1c2hfYmFjayhsaXN0ZW5lcik7Cit9CisKKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEZhY3RvciB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgaW50byBWZWN0b3I6OkZpbmQuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50UmVwZWF0ZXI6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7ICsraSkgeworICAgIGlmIChsaXN0ZW5lcnNfW2ldID09IGxpc3RlbmVyKSB7CisgICAgICBsaXN0ZW5lcnNfLmVyYXNlKGxpc3RlbmVyc18uYmVnaW4oKSArIGkpOworICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvLyBTaW5jZSBtb3N0IG1ldGhvZHMgYXJlIHZlcnkgc2ltaWxhciwgdXNlIG1hY3JvcyB0byByZWR1Y2UgYm9pbGVycGxhdGUuCisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzLgorI2RlZmluZSBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgeyBcCisgICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKKyAgICB9IFwKKyAgfSBcCit9CisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzIGluIHJldmVyc2UKKy8vIG9yZGVyLgorI2RlZmluZSBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAorICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsgXAorICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCisgICAgfSBcCisgIH0gXAorfQorCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VTdGFydCwgVGVzdENhc2UpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFN0YXJ0LCBUZXN0SW5mbykKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UGFydFJlc3VsdCwgVGVzdFBhcnRSZXN1bHQpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcEVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0RW5kLCBUZXN0SW5mbykKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlRW5kLCBUZXN0Q2FzZSkKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtRW5kLCBVbml0VGVzdCkKKworI3VuZGVmIEdURVNUX1JFUEVBVEVSX01FVEhPRF8KKyN1bmRlZiBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgeworICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeworICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25FbmQodW5pdF90ZXN0LCBpdGVyYXRpb24pOworICAgIH0KKyAgfQorfQorCisvLyBFbmQgVGVzdEV2ZW50UmVwZWF0ZXIKKworLy8gVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYW4gWE1MIG91dHB1dCBmaWxlLgorY2xhc3MgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKTsKKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworCisgcHJpdmF0ZToKKyAgLy8gSXMgYyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIHRoYXQgaXMgbm9ybWFsaXplZCB0byBhIHNwYWNlIGNoYXJhY3RlcgorICAvLyB3aGVuIGl0IGFwcGVhcnMgaW4gYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZT8KKyAgc3RhdGljIGJvb2wgSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGNoYXIgYykgeworICAgIHJldHVybiBjID09IDB4OSB8fCBjID09IDB4QSB8fCBjID09IDB4RDsKKyAgfQorCisgIC8vIE1heSBjIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudD8KKyAgc3RhdGljIGJvb2wgSXNWYWxpZFhtbENoYXJhY3RlcihjaGFyIGMpIHsKKyAgICByZXR1cm4gSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGMpIHx8IGMgPj0gMHgyMDsKKyAgfQorCisgIC8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmCisgIC8vIGlzX2F0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlCisgIC8vIHZhbHVlLCBhbmQgbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdAorICAvLyB3aXRoIGNoYXJhY3RlciByZWZlcmVuY2VzLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKTsKKworICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbEF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIEVzY2FwZVhtbChzdHIsIHRydWUpOworICB9CisKKyAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIG5vdCBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWxUZXh0KGNvbnN0IGNoYXIqIHN0cikgeworICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCBmYWxzZSk7CisgIH0KKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBhdHRyaWJ1dGUgYmVsb25ncyB0byB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQKKyAgLy8gc3RyZWFtcyB0aGUgYXR0cmlidXRlIGFzIFhNTC4KKyAgc3RhdGljIHZvaWQgT3V0cHV0WG1sQXR0cmlidXRlKHN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKworICAvLyBTdHJlYW1zIGFuIFhNTCBDREFUQSBzZWN0aW9uLCBlc2NhcGluZyBpbnZhbGlkIENEQVRBIHNlcXVlbmNlcyBhcyBuZWVkZWQuCisgIHN0YXRpYyB2b2lkIE91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBkYXRhKTsKKworICAvLyBTdHJlYW1zIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RJbmZvIG9iamVjdC4KKyAgc3RhdGljIHZvaWQgT3V0cHV0WG1sVGVzdEluZm8oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworCisgIC8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QKKyAgc3RhdGljIHZvaWQgUHJpbnRYbWxUZXN0Q2FzZSg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworCisgIC8vIFByaW50cyBhbiBYTUwgc3VtbWFyeSBvZiB1bml0X3Rlc3QgdG8gb3V0cHV0IHN0cmVhbSBvdXQuCisgIHN0YXRpYyB2b2lkIFByaW50WG1sVW5pdFRlc3QoOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKworICAvLyBQcm9kdWNlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRlc3QgcHJvcGVydGllcyBpbiBhIHJlc3VsdCBhcyBzcGFjZQorICAvLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLgorICAvLyBXaGVuIHRoZSBzdGQ6OnN0cmluZyBpcyBub3QgZW1wdHksIGl0IGluY2x1ZGVzIGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZywKKyAgLy8gdG8gZGVsaW1pdCB0aGlzIGF0dHJpYnV0ZSBmcm9tIHByaW9yIGF0dHJpYnV0ZXMuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpOworCisgIC8vIFRoZSBvdXRwdXQgZmlsZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0X2ZpbGVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKTsKK307CisKKy8vIENyZWF0ZXMgYSBuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyLgorWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoY29uc3QgY2hhciogb3V0cHV0X2ZpbGUpCisgICAgOiBvdXRwdXRfZmlsZV8ob3V0cHV0X2ZpbGUpIHsKKyAgaWYgKG91dHB1dF9maWxlXy5jX3N0cigpID09IE5VTEwgfHwgb3V0cHV0X2ZpbGVfLmVtcHR5KCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlhNTCBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIG51bGxcbiIpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorfQorCisvLyBDYWxsZWQgYWZ0ZXIgdGhlIHVuaXQgdGVzdCBlbmRzLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICBGSUxFKiB4bWxvdXQgPSBOVUxMOworICBGaWxlUGF0aCBvdXRwdXRfZmlsZShvdXRwdXRfZmlsZV8pOworICBGaWxlUGF0aCBvdXRwdXRfZGlyKG91dHB1dF9maWxlLlJlbW92ZUZpbGVOYW1lKCkpOworCisgIGlmIChvdXRwdXRfZGlyLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSkgeworICAgIHhtbG91dCA9IHBvc2l4OjpGT3BlbihvdXRwdXRfZmlsZV8uY19zdHIoKSwgInciKTsKKyAgfQorICBpZiAoeG1sb3V0ID09IE5VTEwpIHsKKyAgICAvLyBUT0RPKHdhbik6IHJlcG9ydCB0aGUgcmVhc29uIG9mIHRoZSBmYWlsdXJlLgorICAgIC8vCisgICAgLy8gV2UgZG9uJ3QgZG8gaXQgZm9yIG5vdyBhczoKKyAgICAvLworICAgIC8vICAgMS4gVGhlcmUgaXMgbm8gdXJnZW50IG5lZWQgZm9yIGl0LgorICAgIC8vICAgMi4gSXQncyBhIGJpdCBpbnZvbHZlZCB0byBtYWtlIHRoZSBlcnJubyB2YXJpYWJsZSB0aHJlYWQtc2FmZSBvbgorICAgIC8vICAgICAgYWxsIHRocmVlIG9wZXJhdGluZyBzeXN0ZW1zIChMaW51eCwgV2luZG93cywgYW5kIE1hYyBPUykuCisgICAgLy8gICAzLiBUbyBpbnRlcnByZXQgdGhlIG1lYW5pbmcgb2YgZXJybm8gaW4gYSB0aHJlYWQtc2FmZSB3YXksCisgICAgLy8gICAgICB3ZSBuZWVkIHRoZSBzdHJlcnJvcl9yKCkgZnVuY3Rpb24sIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb24KKyAgICAvLyAgICAgIFdpbmRvd3MuCisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVW5hYmxlIHRvIG9wZW4gZmlsZSBcIiVzXCJcbiIsCisgICAgICAgICAgICBvdXRwdXRfZmlsZV8uY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgUHJpbnRYbWxVbml0VGVzdCgmc3RyZWFtLCB1bml0X3Rlc3QpOworICBmcHJpbnRmKHhtbG91dCwgIiVzIiwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSkuY19zdHIoKSk7CisgIGZjbG9zZSh4bWxvdXQpOworfQorCisvLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZiBpc19hdHRyaWJ1dGUKKy8vIGlzIHRydWUsIHRoZSB0ZXh0IGlzIG1lYW50IHRvIGFwcGVhciBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUsIGFuZAorLy8gbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdCB3aXRoIGNoYXJhY3RlcgorLy8gcmVmZXJlbmNlcy4KKy8vCisvLyBJbnZhbGlkIFhNTCBjaGFyYWN0ZXJzIGluIHN0ciwgaWYgYW55LCBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0LgorLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aGUgdGV4dCBwcm9jZXNzZWQgYnkgdGhpcworLy8gbW9kdWxlIHdpbGwgY29uc2lzdCBvZiBvcmRpbmFyeSBFbmdsaXNoIHRleHQuCisvLyBJZiB0aGlzIG1vZHVsZSBpcyBldmVyIG1vZGlmaWVkIHRvIHByb2R1Y2UgdmVyc2lvbiAxLjEgWE1MIG91dHB1dCwKKy8vIG1vc3QgaW52YWxpZCBjaGFyYWN0ZXJzIGNhbiBiZSByZXRhaW5lZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKy8vIFRPRE8od2FuKTogSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgbWluaW1hbGx5IGludmFzaXZlLCBodW1hbi1yZWFkYWJsZQorLy8gZXNjYXBpbmcgc2NoZW1lIGZvciBpbnZhbGlkIGNoYXJhY3RlcnMsIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZW0uCitzdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OkVzY2FwZVhtbCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBib29sIGlzX2F0dHJpYnV0ZSkgeworICBNZXNzYWdlIG07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBjaGFyIGNoID0gc3RyW2ldOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgJzwnOgorICAgICAgICBtIDw8ICImbHQ7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgbSA8PCAiJmd0OyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJic6CisgICAgICAgIG0gPDwgIiZhbXA7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcJyc6CisgICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCisgICAgICAgICAgbSA8PCAiJmFwb3M7IjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG0gPDwgJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkKKyAgICAgICAgICBtIDw8ICImcXVvdDsiOworICAgICAgICBlbHNlCisgICAgICAgICAgbSA8PCAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKElzVmFsaWRYbWxDaGFyYWN0ZXIoY2gpKSB7CisgICAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSAmJiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoY2gpKQorICAgICAgICAgICAgbSA8PCAiJiN4IiA8PCBTdHJpbmc6OkZvcm1hdEJ5dGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKQorICAgICAgICAgICAgICA8PCAiOyI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbSA8PCBjaDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMgaW52YWxpZCBpbiBYTUwgcmVtb3ZlZC4KKy8vIEN1cnJlbnRseSBpbnZhbGlkIGNoYXJhY3RlcnMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgc3RyaW5nLiBBbgorLy8gYWx0ZXJuYXRpdmUgaXMgdG8gcmVwbGFjZSB0aGVtIHdpdGggY2VydGFpbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgLiBvciA/Lgorc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgb3V0cHV0LnJlc2VydmUoc3RyLnNpemUoKSk7CisgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RyLmJlZ2luKCk7IGl0ICE9IHN0ci5lbmQoKTsgKytpdCkKKyAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcigqaXQpKQorICAgICAgb3V0cHV0LnB1c2hfYmFjaygqaXQpOworCisgIHJldHVybiBvdXRwdXQ7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZ2VuZXJhdGUgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVW5pdFRlc3QKKy8vIG9iamVjdC4KKy8vCisvLyBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBjb25jZXB0cyBtYXAgdG8gdGhlIERURDoKKy8vCisvLyA8dGVzdHN1aXRlcyBuYW1lPSJBbGxUZXN0cyI+ICAgICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBVbml0VGVzdCBvYmplY3QKKy8vICAgPHRlc3RzdWl0ZSBuYW1lPSJ0ZXN0Y2FzZS1uYW1lIj4gIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RDYXNlIG9iamVjdAorLy8gICAgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0LW5hbWUiPiAgICAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdEluZm8gb2JqZWN0CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0gaW5kaXZpZHVhbCBhc3NlcnRpb24gZmFpbHVyZXMKKy8vICAgICA8L3Rlc3RjYXNlPgorLy8gICA8L3Rlc3RzdWl0ZT4KKy8vIDwvdGVzdHN1aXRlcz4KKworLy8gRm9ybWF0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgYXMgc2Vjb25kcy4KK3N0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgbXMvMTAwMC4wOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiBlcG9jaCB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhIGRhdGUgc3RyaW5nIGluIHRoZSBJU08KKy8vIDg2MDEgZm9ybWF0LCB3aXRob3V0IHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbi4KK3N0ZDo6c3RyaW5nIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKFRpbWVJbk1pbGxpcyBtcykgeworICAvLyBVc2luZyBub24tcmVlbnRyYW50IHZlcnNpb24gYXMgbG9jYWx0aW1lX3IgaXMgbm90IHBvcnRhYmxlLgorICB0aW1lX3Qgc2Vjb25kcyA9IHN0YXRpY19jYXN0PHRpbWVfdD4obXMgLyAxMDAwKTsKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUpLgorICBjb25zdCBzdHJ1Y3QgdG0qIGNvbnN0IHRpbWVfc3RydWN0ID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsgIC8vIE5PTElOVAorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZSBhZ2Fpbi4KKyNlbHNlCisgIGNvbnN0IHN0cnVjdCB0bSogY29uc3QgdGltZV9zdHJ1Y3QgPSBsb2NhbHRpbWUoJnNlY29uZHMpOyAgLy8gTk9MSU5UCisjZW5kaWYKKyAgaWYgKHRpbWVfc3RydWN0ID09IE5VTEwpCisgICAgcmV0dXJuICIiOyAgLy8gSW52YWxpZCBtcyB2YWx1ZQorCisgIC8vIFlZWVktTU0tRERUaGg6bW06c3MKKyAgcmV0dXJuIFN0cmVhbWFibGVUb1N0cmluZyh0aW1lX3N0cnVjdC0+dG1feWVhciArIDE5MDApICsgIi0iICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LT50bV9tb24gKyAxKSArICItIiArCisgICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC0+dG1fbWRheSkgKyAiVCIgKworICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QtPnRtX2hvdXIpICsgIjoiICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LT50bV9taW4pICsgIjoiICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LT50bV9zZWMpOworfQorCisvLyBTdHJlYW1zIGFuIFhNTCBDREFUQSBzZWN0aW9uLCBlc2NhcGluZyBpbnZhbGlkIENEQVRBIHNlcXVlbmNlcyBhcyBuZWVkZWQuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEpIHsKKyAgY29uc3QgY2hhciogc2VnbWVudCA9IGRhdGE7CisgICpzdHJlYW0gPDwgIjwhW0NEQVRBWyI7CisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBuZXh0X3NlZ21lbnQgPSBzdHJzdHIoc2VnbWVudCwgIl1dPiIpOworICAgIGlmIChuZXh0X3NlZ21lbnQgIT0gTlVMTCkgeworICAgICAgc3RyZWFtLT53cml0ZSgKKyAgICAgICAgICBzZWdtZW50LCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KG5leHRfc2VnbWVudCAtIHNlZ21lbnQpKTsKKyAgICAgICpzdHJlYW0gPDwgIl1dPl1dJmd0OzwhW0NEQVRBWyI7CisgICAgICBzZWdtZW50ID0gbmV4dF9zZWdtZW50ICsgc3RybGVuKCJdXT4iKTsKKyAgICB9IGVsc2UgeworICAgICAgKnN0cmVhbSA8PCBzZWdtZW50OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpzdHJlYW0gPDwgIl1dPiI7Cit9CisKK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxBdHRyaWJ1dGUoCisgICAgc3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhbGxvd2VkX25hbWVzID0KKyAgICAgIEdldFJlc2VydmVkQXR0cmlidXRlc0ZvckVsZW1lbnQoZWxlbWVudF9uYW1lKTsKKworICBHVEVTVF9DSEVDS18oc3RkOjpmaW5kKGFsbG93ZWRfbmFtZXMuYmVnaW4oKSwgYWxsb3dlZF9uYW1lcy5lbmQoKSwgbmFtZSkgIT0KKyAgICAgICAgICAgICAgICAgICBhbGxvd2VkX25hbWVzLmVuZCgpKQorICAgICAgPDwgIkF0dHJpYnV0ZSAiIDw8IG5hbWUgPDwgIiBpcyBub3QgYWxsb3dlZCBmb3IgZWxlbWVudCA8IiA8PCBlbGVtZW50X25hbWUKKyAgICAgIDw8ICI+LiI7CisKKyAgKnN0cmVhbSA8PCAiICIgPDwgbmFtZSA8PCAiPVwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUodmFsdWUpIDw8ICJcIiI7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCisvLyBUT0RPKHdhbik6IFRoZXJlIGlzIGFsc28gdmFsdWUgaW4gcHJpbnRpbmcgcHJvcGVydGllcyB3aXRoIHRoZSBwbGFpbiBwcmludGVyLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQgPSAqdGVzdF9pbmZvLnJlc3VsdCgpOworICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdGNhc2UgPSAidGVzdGNhc2UiOworCisgICpzdHJlYW0gPDwgIiAgICA8dGVzdGNhc2UiOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJuYW1lIiwgdGVzdF9pbmZvLm5hbWUoKSk7CisKKyAgaWYgKHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsKKyAgICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJ2YWx1ZV9wYXJhbSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpKTsKKyAgfQorICBpZiAodGVzdF9pbmZvLnR5cGVfcGFyYW0oKSAhPSBOVUxMKSB7CisgICAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAidHlwZV9wYXJhbSIsIHRlc3RfaW5mby50eXBlX3BhcmFtKCkpOworICB9CisKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAic3RhdHVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby5zaG91bGRfcnVuKCkgPyAicnVuIiA6ICJub3RydW4iKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAidGltZSIsCisgICAgICAgICAgICAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMocmVzdWx0LmVsYXBzZWRfdGltZSgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgImNsYXNzbmFtZSIsIHRlc3RfY2FzZV9uYW1lKTsKKyAgKnN0cmVhbSA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhyZXN1bHQpOworCisgIGludCBmYWlsdXJlcyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHBhcnQgPSByZXN1bHQuR2V0VGVzdFBhcnRSZXN1bHQoaSk7CisgICAgaWYgKHBhcnQuZmFpbGVkKCkpIHsKKyAgICAgIGlmICgrK2ZhaWx1cmVzID09IDEpIHsKKyAgICAgICAgKnN0cmVhbSA8PCAiPlxuIjsKKyAgICAgIH0KKyAgICAgIGNvbnN0IHN0cmluZyBsb2NhdGlvbiA9IGludGVybmFsOjpGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKAorICAgICAgICAgIHBhcnQuZmlsZV9uYW1lKCksIHBhcnQubGluZV9udW1iZXIoKSk7CisgICAgICBjb25zdCBzdHJpbmcgc3VtbWFyeSA9IGxvY2F0aW9uICsgIlxuIiArIHBhcnQuc3VtbWFyeSgpOworICAgICAgKnN0cmVhbSA8PCAiICAgICAgPGZhaWx1cmUgbWVzc2FnZT1cIiIKKyAgICAgICAgICAgICAgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHN1bW1hcnkuY19zdHIoKSkKKyAgICAgICAgICAgICAgPDwgIlwiIHR5cGU9XCJcIj4iOworICAgICAgY29uc3Qgc3RyaW5nIGRldGFpbCA9IGxvY2F0aW9uICsgIlxuIiArIHBhcnQubWVzc2FnZSgpOworICAgICAgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKHN0cmVhbSwgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoZGV0YWlsKS5jX3N0cigpKTsKKyAgICAgICpzdHJlYW0gPDwgIjwvZmFpbHVyZT5cbiI7CisgICAgfQorICB9CisKKyAgaWYgKGZhaWx1cmVzID09IDApCisgICAgKnN0cmVhbSA8PCAiIC8+XG4iOworICBlbHNlCisgICAgKnN0cmVhbSA8PCAiICAgIDwvdGVzdGNhc2U+XG4iOworfQorCisvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdENhc2Ugb2JqZWN0Cit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRYbWxUZXN0Q2FzZShzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RzdWl0ZSA9ICJ0ZXN0c3VpdGUiOworICAqc3RyZWFtIDw8ICIgIDwiIDw8IGtUZXN0c3VpdGU7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJuYW1lIiwgdGVzdF9jYXNlLm5hbWUoKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJ0ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLnJlcG9ydGFibGVfdGVzdF9jb3VudCgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJmYWlsdXJlcyIsCisgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKAorICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlLCAiZGlzYWJsZWQiLAorICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAiZXJyb3JzIiwgIjAiKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgInRpbWUiLAorICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkpOworICAqc3RyZWFtIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHRlc3RfY2FzZS5hZF9ob2NfdGVzdF9yZXN1bHQoKSkKKyAgICAgICAgICA8PCAiPlxuIjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraSkgeworICAgIGlmICh0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSktPmlzX3JlcG9ydGFibGUoKSkKKyAgICAgIE91dHB1dFhtbFRlc3RJbmZvKHN0cmVhbSwgdGVzdF9jYXNlLm5hbWUoKSwgKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhpKSk7CisgIH0KKyAgKnN0cmVhbSA8PCAiICA8LyIgPDwga1Rlc3RzdWl0ZSA8PCAiPlxuIjsKK30KKworLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFVuaXRUZXN0KHN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdHN1aXRlcyA9ICJ0ZXN0c3VpdGVzIjsKKworICAqc3RyZWFtIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiI7CisgICpzdHJlYW0gPDwgIjwiIDw8IGtUZXN0c3VpdGVzOworCisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAidGVzdHMiLAorICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgImZhaWx1cmVzIiwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoCisgICAgICBzdHJlYW0sIGtUZXN0c3VpdGVzLCAiZGlzYWJsZWQiLAorICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgImVycm9ycyIsICIwIik7CisgIE91dHB1dFhtbEF0dHJpYnV0ZSgKKyAgICAgIHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJ0aW1lc3RhbXAiLAorICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEodW5pdF90ZXN0LnN0YXJ0X3RpbWVzdGFtcCgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAidGltZSIsCisgICAgICAgICAgICAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKSk7CisKKyAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgInJhbmRvbV9zZWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yYW5kb21fc2VlZCgpKSk7CisgIH0KKworICAqc3RyZWFtIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHVuaXRfdGVzdC5hZF9ob2NfdGVzdF9yZXN1bHQoKSk7CisKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJuYW1lIiwgIkFsbFRlc3RzIik7CisgICpzdHJlYW0gPDwgIj5cbiI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgIGlmICh1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSktPnJlcG9ydGFibGVfdGVzdF9jb3VudCgpID4gMCkKKyAgICAgIFByaW50WG1sVGVzdENhc2Uoc3RyZWFtLCAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpKTsKKyAgfQorICAqc3RyZWFtIDw8ICI8LyIgPDwga1Rlc3RzdWl0ZXMgPDwgIj5cbiI7Cit9CisKKy8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCisvLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLgorc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcygKKyAgICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpIHsKKyAgTWVzc2FnZSBhdHRyaWJ1dGVzOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkgPSByZXN1bHQuR2V0VGVzdFByb3BlcnR5KGkpOworICAgIGF0dHJpYnV0ZXMgPDwgIiAiIDw8IHByb3BlcnR5LmtleSgpIDw8ICI9IgorICAgICAgICA8PCAiXCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZShwcm9wZXJ0eS52YWx1ZSgpKSA8PCAiXCIiOworICB9CisgIHJldHVybiBhdHRyaWJ1dGVzLkdldFN0cmluZygpOworfQorCisvLyBFbmQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKKy8vIENoZWNrcyBpZiBzdHIgY29udGFpbnMgJz0nLCAnJicsICclJyBvciAnXG4nIGNoYXJhY3RlcnMuIElmIHllcywKKy8vIHJlcGxhY2VzIHRoZW0gYnkgIiV4eCIgd2hlcmUgeHggaXMgdGhlaXIgaGV4YWRlY2ltYWwgdmFsdWUuIEZvcgorLy8gZXhhbXBsZSwgcmVwbGFjZXMgIj0iIHdpdGggIiUzRCIuICBUaGlzIGFsZ29yaXRobSBpcyBPKHN0cmxlbihzdHIpKQorLy8gaW4gYm90aCB0aW1lIGFuZCBzcGFjZSAtLSBpbXBvcnRhbnQgYXMgdGhlIGlucHV0IHN0ciBtYXkgY29udGFpbiBhbgorLy8gYXJiaXRyYXJpbHkgbG9uZyB0ZXN0IGZhaWx1cmUgbWVzc2FnZSBhbmQgc3RhY2sgdHJhY2UuCitzdHJpbmcgU3RyZWFtaW5nTGlzdGVuZXI6OlVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoc3RybGVuKHN0cikgKyAxKTsKKyAgZm9yIChjaGFyIGNoID0gKnN0cjsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHIpIHsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlICclJzoKKyAgICAgIGNhc2UgJz0nOgorICAgICAgY2FzZSAnJic6CisgICAgICBjYXNlICdcbic6CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiUiICsgU3RyaW5nOjpGb3JtYXRCeXRlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTdHJlYW1pbmdMaXN0ZW5lcjo6U29ja2V0V3JpdGVyOjpNYWtlQ29ubmVjdGlvbigpIHsKKyAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gPT0gLTEpCisgICAgICA8PCAiTWFrZUNvbm5lY3Rpb24oKSBjYW4ndCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbi4iOworCisgIGFkZHJpbmZvIGhpbnRzOworICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgICAvLyBUbyBhbGxvdyBib3RoIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzLgorICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBhZGRyaW5mbyogc2VydmluZm8gPSBOVUxMOworCisgIC8vIFVzZSB0aGUgZ2V0YWRkcmluZm8oKSB0byBnZXQgYSBsaW5rZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgZm9yCisgIC8vIHRoZSBnaXZlbiBob3N0IG5hbWUuCisgIGNvbnN0IGludCBlcnJvcl9udW0gPSBnZXRhZGRyaW5mbygKKyAgICAgIGhvc3RfbmFtZV8uY19zdHIoKSwgcG9ydF9udW1fLmNfc3RyKCksICZoaW50cywgJnNlcnZpbmZvKTsKKyAgaWYgKGVycm9yX251bSAhPSAwKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZ2V0YWRkcmluZm8oKSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdhaV9zdHJlcnJvcihlcnJvcl9udW0pOworICB9CisKKyAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuLgorICBmb3IgKGFkZHJpbmZvKiBjdXJfYWRkciA9IHNlcnZpbmZvOyBzb2NrZmRfID09IC0xICYmIGN1cl9hZGRyICE9IE5VTEw7CisgICAgICAgY3VyX2FkZHIgPSBjdXJfYWRkci0+YWlfbmV4dCkgeworICAgIHNvY2tmZF8gPSBzb2NrZXQoCisgICAgICAgIGN1cl9hZGRyLT5haV9mYW1pbHksIGN1cl9hZGRyLT5haV9zb2NrdHlwZSwgY3VyX2FkZHItPmFpX3Byb3RvY29sKTsKKyAgICBpZiAoc29ja2ZkXyAhPSAtMSkgeworICAgICAgLy8gQ29ubmVjdCB0aGUgY2xpZW50IHNvY2tldCB0byB0aGUgc2VydmVyIHNvY2tldC4KKyAgICAgIGlmIChjb25uZWN0KHNvY2tmZF8sIGN1cl9hZGRyLT5haV9hZGRyLCBjdXJfYWRkci0+YWlfYWRkcmxlbikgPT0gLTEpIHsKKyAgICAgICAgY2xvc2Uoc29ja2ZkXyk7CisgICAgICAgIHNvY2tmZF8gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmcmVlYWRkcmluZm8oc2VydmluZm8pOyAgLy8gYWxsIGRvbmUgd2l0aCB0aGlzIHN0cnVjdHVyZQorCisgIGlmIChzb2NrZmRfID09IC0xKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIGNvbm5lY3QgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOworICB9Cit9CisKKy8vIEVuZCBvZiBjbGFzcyBTdHJlYW1pbmcgTGlzdGVuZXIKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTX18KKworLy8gQ2xhc3MgU2NvcGVkVHJhY2UKKworLy8gUHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvIGEgcGVyLXRocmVhZAorLy8gdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KK1Njb3BlZFRyYWNlOjpTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4XykgeworICBUcmFjZUluZm8gdHJhY2U7CisgIHRyYWNlLmZpbGUgPSBmaWxlOworICB0cmFjZS5saW5lID0gbGluZTsKKyAgdHJhY2UubWVzc2FnZSA9IG1lc3NhZ2UuR2V0U3RyaW5nKCk7CisKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlB1c2hHVGVzdFRyYWNlKHRyYWNlKTsKK30KKworLy8gUG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgorU2NvcGVkVHJhY2U6On5TY29wZWRUcmFjZSgpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oJlVuaXRUZXN0OjptdXRleF8pIHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlBvcEdUZXN0VHJhY2UoKTsKK30KKworCisvLyBjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4gIFBhcmFtZXRlcnM6CisvLworLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAorLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLgorLy8gICBza2lwX2NvdW50IC0gdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQ7IGRvZXNuJ3QgY291bnQKKy8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgorLy8KK3N0cmluZyBPc1N0YWNrVHJhY2VHZXR0ZXI6OkN1cnJlbnRTdGFja1RyYWNlKGludCAvKiBtYXhfZGVwdGggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2tpcF9jb3VudCAqLykKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgcmV0dXJuICIiOworfQorCit2b2lkIE9zU3RhY2tUcmFjZUdldHRlcjo6VXBvbkxlYXZpbmdHVGVzdCgpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Cit9CisKK2NvbnN0IGNoYXIqIGNvbnN0CitPc1N0YWNrVHJhY2VHZXR0ZXI6OmtFbGlkZWRGcmFtZXNNYXJrZXIgPQorICAgICIuLi4gIiBHVEVTVF9OQU1FXyAiIGludGVybmFsIGZyYW1lcyAuLi4iOworCisvLyBBIGhlbHBlciBjbGFzcyB0aGF0IGNyZWF0ZXMgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaW4gaXRzCisvLyBjb25zdHJ1Y3RvciBhbmQgZGVsZXRlcyB0aGUgZmlsZSBpbiBpdHMgZGVzdHJ1Y3Rvci4KK2NsYXNzIFNjb3BlZFByZW1hdHVyZUV4aXRGaWxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNjb3BlZFByZW1hdHVyZUV4aXRGaWxlKGNvbnN0IGNoYXIqIHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoKQorICAgICAgOiBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8ocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGgpIHsKKyAgICAvLyBJZiBhIHBhdGggdG8gdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaXMgc3BlY2lmaWVkLi4uCisgICAgaWYgKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoICE9IE5VTEwgJiYgKnByZW1hdHVyZV9leGl0X2ZpbGVwYXRoICE9ICdcMCcpIHsKKyAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZSB3aXRoIGEgc2luZ2xlICIwIiBjaGFyYWN0ZXIgaW4gaXQuICBJL08KKyAgICAgIC8vIGVycm9ycyBhcmUgaWdub3JlZCBhcyB0aGVyZSdzIG5vdGhpbmcgYmV0dGVyIHdlIGNhbiBkbyBhbmQgd2UKKyAgICAgIC8vIGRvbid0IHdhbnQgdG8gZmFpbCB0aGUgdGVzdCBiZWNhdXNlIG9mIHRoaXMuCisgICAgICBGSUxFKiBwZmlsZSA9IHBvc2l4OjpGT3BlbihwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCwgInciKTsKKyAgICAgIGZ3cml0ZSgiMCIsIDEsIDEsIHBmaWxlKTsKKyAgICAgIGZjbG9zZShwZmlsZSk7CisgICAgfQorICB9CisKKyAgflNjb3BlZFByZW1hdHVyZUV4aXRGaWxlKCkgeworICAgIGlmIChwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8gIT0gTlVMTCAmJiAqcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfICE9ICdcMCcpIHsKKyAgICAgIHJlbW92ZShwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8pOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogY29uc3QgcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RFdmVudExpc3RlbmVycworCitUZXN0RXZlbnRMaXN0ZW5lcnM6OlRlc3RFdmVudExpc3RlbmVycygpCisgICAgOiByZXBlYXRlcl8obmV3IGludGVybmFsOjpUZXN0RXZlbnRSZXBlYXRlcigpKSwKKyAgICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKE5VTEwpLAorICAgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyhOVUxMKSB7Cit9CisKK1Rlc3RFdmVudExpc3RlbmVyczo6flRlc3RFdmVudExpc3RlbmVycygpIHsgZGVsZXRlIHJlcGVhdGVyXzsgfQorCisvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQorLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQKKy8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKKy8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgdXNlci4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIHJlcGVhdGVyXy0+QXBwZW5kKGxpc3RlbmVyKTsKK30KKworLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4KKy8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKKy8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChsaXN0ZW5lciA9PSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXykKKyAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyA9IE5VTEw7CisgIGVsc2UgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pCisgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyA9IE5VTEw7CisgIHJldHVybiByZXBlYXRlcl8tPlJlbGVhc2UobGlzdGVuZXIpOworfQorCisvLyBSZXR1cm5zIHJlcGVhdGVyIHRoYXQgYnJvYWRjYXN0cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgZXZlbnRzIHRvIGFsbAorLy8gc3Vic2NyaWJlcnMuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50TGlzdGVuZXJzOjpyZXBlYXRlcigpIHsgcmV0dXJuIHJlcGVhdGVyXzsgfQorCisvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisvLyBUaGUgbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKKy8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gIT0gbGlzdGVuZXIpIHsKKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBwYXNzIHRoaXMgbWV0aG9kIGEgbGlzdGVuZXIgdGhhdCBpcyBhbHJlYWR5IGluIHRoZQorICAgIC8vIGxpc3QuCisgICAgZGVsZXRlIFJlbGVhc2UoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8pOworICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIFNldHMgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLiAgVGhlCisvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworLy8gZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKy8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyAhPSBsaXN0ZW5lcikgeworICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCisgICAgLy8gbGlzdC4KKyAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3htbF9nZW5lcmF0b3JfKTsKKyAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIGJ5IHRoZSByZXBlYXRlciB0byB0aGUKKy8vIGxpc3RlbmVycyBpbiB0aGUgbGlzdC4KK2Jvb2wgVGVzdEV2ZW50TGlzdGVuZXJzOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gcmVwZWF0ZXJfLT5mb3J3YXJkaW5nX2VuYWJsZWQoKTsKK30KKwordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCkgeworICByZXBlYXRlcl8tPnNldF9mb3J3YXJkaW5nX2VuYWJsZWQoZmFsc2UpOworfQorCisvLyBjbGFzcyBVbml0VGVzdAorCisvLyBHZXRzIHRoZSBzaW5nbGV0b24gVW5pdFRlc3Qgb2JqZWN0LiAgVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMKKy8vIGNhbGxlZCwgYSBVbml0VGVzdCBvYmplY3QgaXMgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLiAgQ29uc2VjdXRpdmUKKy8vIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIG9iamVjdC4KKy8vCisvLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfIGFzIGEgdXNlciBpcyBub3Qgc3VwcG9zZWQgdG8KKy8vIGNhbGwgdGhpcyBiZWZvcmUgbWFpbigpIHN0YXJ0cywgZnJvbSB3aGljaCBwb2ludCBvbiB0aGUgcmV0dXJuCisvLyB2YWx1ZSB3aWxsIG5ldmVyIGNoYW5nZS4KK1VuaXRUZXN0KiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSB7CisgIC8vIFdoZW4gY29tcGlsZWQgd2l0aCBNU1ZDIDcuMSBpbiBvcHRpbWl6ZWQgbW9kZSwgZGVzdHJveWluZyB0aGUKKyAgLy8gVW5pdFRlc3Qgb2JqZWN0IHVwb24gZXhpdGluZyB0aGUgcHJvZ3JhbSBtZXNzZXMgdXAgdGhlIGV4aXQgY29kZSwKKyAgLy8gY2F1c2luZyBzdWNjZXNzZnVsIHRlc3RzIHRvIGFwcGVhciBmYWlsZWQuICBXZSBoYXZlIHRvIHVzZSBhCisgIC8vIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNhc2UgdG8gYnlwYXNzIHRoZSBjb21waWxlciBidWcuCisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5LCBhdCB0aGUgY29zdCBvZgorICAvLyBsZWFraW5nIHRoZSBVbml0VGVzdCBvYmplY3QuCisKKyAgLy8gQ29kZUdlYXIgQysrQnVpbGRlciBpbnNpc3RzIG9uIGEgcHVibGljIGRlc3RydWN0b3IgZm9yIHRoZQorICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgVXNlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8ga2VlcCBnb29kIE9PCisgIC8vIGRlc2lnbiB3aXRoIHByaXZhdGUgZGVzdHJ1Y3Rvci4KKworI2lmIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICBzdGF0aWMgVW5pdFRlc3QqIGNvbnN0IGluc3RhbmNlID0gbmV3IFVuaXRUZXN0OworICByZXR1cm4gaW5zdGFuY2U7CisjZWxzZQorICBzdGF0aWMgVW5pdFRlc3QgaW5zdGFuY2U7CisgIHJldHVybiAmaW5zdGFuY2U7CisjZW5kaWYgIC8vIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+ZmFpbGVkX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFVuaXRUZXN0OjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmRpc2FibGVkX3Rlc3RfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCitpbnQgVW5pdFRlc3Q6OnJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+cmVwb3J0YWJsZV90ZXN0X2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dGVzdF90b19ydW5fY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorLy8gVU5JWCBlcG9jaC4KK2ludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OnN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbCgpLT5zdGFydF90aW1lc3RhbXAoKTsKK30KKworLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCitpbnRlcm5hbDo6VGltZUluTWlsbGlzIFVuaXRUZXN0OjplbGFwc2VkX3RpbWUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmVsYXBzZWRfdGltZSgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCitib29sIFVuaXRUZXN0OjpQYXNzZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPlBhc3NlZCgpOyB9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KK2Jvb2wgVW5pdFRlc3Q6OkZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+RmFpbGVkKCk7IH0KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5HZXRUZXN0Q2FzZShpKTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIHRlc3QgZmFpbHVyZXMgYW5kCisvLyBwcm9wZXJ0aWVzIGxvZ2dlZCBvdXRzaWRlIG9mIGluZGl2aWR1YWwgdGVzdCBjYXNlcy4KK2NvbnN0IFRlc3RSZXN1bHQmIFVuaXRUZXN0OjphZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7CisgIHJldHVybiAqaW1wbCgpLT5hZF9ob2NfdGVzdF9yZXN1bHQoKTsKK30KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpIHsKKyAgcmV0dXJuIGltcGwoKS0+R2V0TXV0YWJsZVRlc3RDYXNlKGkpOworfQorCisvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cworLy8gaW5zaWRlIEdvb2dsZSBUZXN0LgorVGVzdEV2ZW50TGlzdGVuZXJzJiBVbml0VGVzdDo6bGlzdGVuZXJzKCkgeworICByZXR1cm4gKmltcGwoKS0+bGlzdGVuZXJzKCk7Cit9CisKKy8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QKKy8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluIHRoZQorLy8gb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuICBBZnRlciBhbGwgdGVzdHMgaW4gdGhlIHByb2dyYW0gaGF2ZQorLy8gZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4gdGhlCisvLyAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisvLworLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50LgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8sIGFzIHdlIG9ubHkgc3VwcG9ydCBjYWxsaW5nIGl0CisvLyBmcm9tIHRoZSBtYWluIHRocmVhZC4KK0Vudmlyb25tZW50KiBVbml0VGVzdDo6QWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeworICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGltcGxfLT5lbnZpcm9ubWVudHMoKS5wdXNoX2JhY2soZW52KTsKKyAgcmV0dXJuIGVudjsKK30KKworLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsIEdvb2dsZSBUZXN0CisvLyBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykgZXZlbnR1YWxseSBjYWxsCisvLyB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZSBzaG91bGQgdXNlIHRoZQorLy8gYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KK3ZvaWQgVW5pdFRlc3Q6OkFkZFRlc3RQYXJ0UmVzdWx0KAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwKKyAgICBpbnQgbGluZV9udW1iZXIsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX3N0YWNrX3RyYWNlKSBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBtZXNzYWdlOworCisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaWYgKGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSA+IDApIHsKKyAgICBtc2cgPDwgIlxuIiA8PCBHVEVTVF9OQU1FXyA8PCAiIHRyYWNlOiI7CisKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkpOworICAgICAgICAgaSA+IDA7IC0taSkgeworICAgICAgY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UgPSBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKVtpIC0gMV07CisgICAgICBtc2cgPDwgIlxuIiA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRyYWNlLmZpbGUsIHRyYWNlLmxpbmUpCisgICAgICAgICAgPDwgIiAiIDw8IHRyYWNlLm1lc3NhZ2U7CisgICAgfQorICB9CisKKyAgaWYgKG9zX3N0YWNrX3RyYWNlLmNfc3RyKCkgIT0gTlVMTCAmJiAhb3Nfc3RhY2tfdHJhY2UuZW1wdHkoKSkgeworICAgIG1zZyA8PCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIgPDwgb3Nfc3RhY2tfdHJhY2U7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCByZXN1bHQgPQorICAgIFRlc3RQYXJ0UmVzdWx0KHJlc3VsdF90eXBlLCBmaWxlX25hbWUsIGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgaW1wbF8tPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCktPgorICAgICAgUmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKworICBpZiAocmVzdWx0X3R5cGUgIT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKSB7CisgICAgLy8gZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKyAgICAvLyBndGVzdF90aHJvd19vbl9mYWlsdXJlLiAgVGhpcyBhbGxvd3MgYSB1c2VyIHRvIHNldCB0aGUgbGF0dGVyCisgICAgLy8gaW4gdGhlIGNvZGUgKHBlcmhhcHMgaW4gb3JkZXIgdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMKKyAgICAvLyB3aXRoIGFub3RoZXIgdGVzdGluZyBmcmFtZXdvcmspIGFuZCBzcGVjaWZ5IHRoZSBmb3JtZXIgb24gdGhlCisgICAgLy8gY29tbWFuZCBsaW5lIGZvciBkZWJ1Z2dpbmcuCisgICAgaWYgKEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgICAvLyBVc2luZyBEZWJ1Z0JyZWFrIG9uIFdpbmRvd3MgYWxsb3dzIGd0ZXN0IHRvIHN0aWxsIGJyZWFrIGludG8gYSBkZWJ1Z2dlcgorICAgICAgLy8gd2hlbiBhIGZhaWx1cmUgaGFwcGVucyBhbmQgYm90aCB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGFuZAorICAgICAgLy8gdGhlIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBmbGFncyBhcmUgc3BlY2lmaWVkLgorICAgICAgRGVidWdCcmVhaygpOworI2Vsc2UKKyAgICAgIC8vIERlcmVmZXJlbmNlIE5VTEwgdGhyb3VnaCBhIHZvbGF0aWxlIHBvaW50ZXIgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgICAgIC8vIGZyb20gcmVtb3ZpbmcuIFdlIHVzZSB0aGlzIHJhdGhlciB0aGFuIGFib3J0KCkgb3IgX19idWlsdGluX3RyYXAoKSBmb3IKKyAgICAgIC8vIHBvcnRhYmlsaXR5OiBTeW1iaWFuIGRvZXNuJ3QgaW1wbGVtZW50IGFib3J0KCkgd2VsbCwgYW5kIHNvbWUgZGVidWdnZXJzCisgICAgICAvLyBkb24ndCBjb3JyZWN0bHkgdHJhcCBhYm9ydCgpLgorICAgICAgKnN0YXRpY19jYXN0PHZvbGF0aWxlIGludCo+KE5VTEwpID0gMTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICAgIH0gZWxzZSBpZiAoR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgICAgICB0aHJvdyBpbnRlcm5hbDo6R29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24ocmVzdWx0KTsKKyNlbHNlCisgICAgICAvLyBXZSBjYW5ub3QgY2FsbCBhYm9ydCgpIGFzIGl0IGdlbmVyYXRlcyBhIHBvcC11cCBpbiBkZWJ1ZyBtb2RlCisgICAgICAvLyB0aGF0IGNhbm5vdCBiZSBzdXBwcmVzc2VkIGluIFZDIDcuMSBvciBiZWxvdy4KKyAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICB9CisgIH0KK30KKworLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgZnJvbQorLy8gaW5zaWRlIGEgdGVzdCwgdG8gY3VycmVudCBUZXN0Q2FzZSdzIGFkX2hvY190ZXN0X3Jlc3VsdF8gd2hlbiBpbnZva2VkCisvLyBmcm9tIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQKKy8vIHdoZW4gaW52b2tlZCBlbHNld2hlcmUuICBJZiB0aGUgcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoCisvLyB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCit2b2lkIFVuaXRUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGltcGxfLT5SZWNvcmRQcm9wZXJ0eShUZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSkpOworfQorCisvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKKy8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgoraW50IFVuaXRUZXN0OjpSdW4oKSB7CisgIGNvbnN0IGJvb2wgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzID0KKyAgICAgIGludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5sZW5ndGgoKSA+IDA7CisKKyAgLy8gR29vZ2xlIFRlc3QgaW1wbGVtZW50cyB0aGlzIHByb3RvY29sIGZvciBjYXRjaGluZyB0aGF0IGEgdGVzdAorICAvLyBwcm9ncmFtIGV4aXRzIGJlZm9yZSByZXR1cm5pbmcgY29udHJvbCB0byBHb29nbGUgVGVzdDoKKyAgLy8KKyAgLy8gICAxLiBVcG9uIHN0YXJ0LCBHb29nbGUgVGVzdCBjcmVhdGVzIGEgZmlsZSB3aG9zZSBhYnNvbHV0ZSBwYXRoCisgIC8vICAgICAgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAvLyAgICAgIFRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRS4KKyAgLy8gICAyLiBXaGVuIEdvb2dsZSBUZXN0IGhhcyBmaW5pc2hlZCBpdHMgd29yaywgaXQgZGVsZXRlcyB0aGUgZmlsZS4KKyAgLy8KKyAgLy8gVGhpcyBhbGxvd3MgYSB0ZXN0IHJ1bm5lciB0byBzZXQgVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFIGJlZm9yZQorICAvLyBydW5uaW5nIGEgR29vZ2xlLVRlc3QtYmFzZWQgdGVzdCBwcm9ncmFtIGFuZCBjaGVjayB0aGUgZXhpc3RlbmNlCisgIC8vIG9mIHRoZSBmaWxlIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QgZXhlY3V0aW9uIHRvIHNlZSBpZiBpdCBoYXMKKyAgLy8gZXhpdGVkIHByZW1hdHVyZWx5LgorCisgIC8vIElmIHdlIGFyZSBpbiB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QsIGRvbid0CisgIC8vIGNyZWF0ZS9kZWxldGUgdGhlIHByZW1hdHVyZSBleGl0IGZpbGUsIGFzIGRvaW5nIHNvIGlzIHVubmVjZXNzYXJ5CisgIC8vIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBjcmVhdGUvZGVsZXRlCisgIC8vIHRoZSBmaWxlIHVwb24gZW50ZXJpbmcvbGVhdmluZyB0aGlzIGZ1bmN0aW9uLiAgSWYgdGhlIHByb2dyYW0KKyAgLy8gc29tZWhvdyBleGl0cyBiZWZvcmUgdGhpcyBmdW5jdGlvbiBoYXMgYSBjaGFuY2UgdG8gcmV0dXJuLCB0aGUKKyAgLy8gcHJlbWF0dXJlLWV4aXQgZmlsZSB3aWxsIGJlIGxlZnQgdW5kZWxldGVkLCBjYXVzaW5nIGEgdGVzdCBydW5uZXIKKyAgLy8gdGhhdCB1bmRlcnN0YW5kcyB0aGUgcHJlbWF0dXJlLWV4aXQtZmlsZSBwcm90b2NvbCB0byByZXBvcnQgdGhlCisgIC8vIHRlc3QgYXMgaGF2aW5nIGZhaWxlZC4KKyAgY29uc3QgaW50ZXJuYWw6OlNjb3BlZFByZW1hdHVyZUV4aXRGaWxlIHByZW1hdHVyZV9leGl0X2ZpbGUoCisgICAgICBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPworICAgICAgTlVMTCA6IGludGVybmFsOjpwb3NpeDo6R2V0RW52KCJURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUiKSk7CisKKyAgLy8gQ2FwdHVyZXMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykuICBUaGlzIHZhbHVlIHdpbGwgYmUKKyAgLy8gdXNlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcm9ncmFtLgorICBpbXBsKCktPnNldF9jYXRjaF9leGNlcHRpb25zKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpOworCisjaWYgR1RFU1RfSEFTX1NFSAorICAvLyBFaXRoZXIgdGhlIHVzZXIgd2FudHMgR29vZ2xlIFRlc3QgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlCisgIC8vIHRlc3RzIG9yIHRoaXMgaXMgZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIGRlYXRoIHRlc3QgY2hpbGQKKyAgLy8gcHJvY2Vzcy4gSW4gZWl0aGVyIGNhc2UgdGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0byBzZWUgcG9wLXVwIGRpYWxvZ3MKKyAgLy8gYWJvdXQgY3Jhc2hlcyAtIHRoZXkgYXJlIGV4cGVjdGVkLgorICBpZiAoaW1wbCgpLT5jYXRjaF9leGNlcHRpb25zKCkgfHwgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzKSB7CisjIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIC8vIFNldEVycm9yTW9kZSBkb2Vzbid0IGV4aXN0IG9uIENFLgorICAgIFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTIHwgU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFQgfAorICAgICAgICAgICAgICAgICBTRU1fTk9HUEZBVUxURVJST1JCT1ggfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjIGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBHVEVTVF9PU19XSU5ET1dTX01JTkdXKSAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBEZWF0aCB0ZXN0IGNoaWxkcmVuIGNhbiBiZSB0ZXJtaW5hdGVkIHdpdGggX2Fib3J0KCkuICBPbiBXaW5kb3dzLAorICAgIC8vIF9hYm9ydCgpIGNhbiBzaG93IGEgZGlhbG9nIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIGZvcmNlcyB0aGUKKyAgICAvLyBhYm9ydCBtZXNzYWdlIHRvIGdvIHRvIHN0ZGVyciBpbnN0ZWFkLgorICAgIF9zZXRfZXJyb3JfbW9kZShfT1VUX1RPX1NUREVSUik7CisjIGVuZGlmCisKKyMgaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBJbiB0aGUgZGVidWcgdmVyc2lvbiwgVmlzdWFsIFN0dWRpbyBwb3BzIHVwIGEgc2VwYXJhdGUgZGlhbG9nCisgICAgLy8gb2ZmZXJpbmcgYSBjaG9pY2UgdG8gZGVidWcgdGhlIGFib3J0ZWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBzdXBwcmVzcworICAgIC8vIHRoaXMgZGlhbG9nIG9yIGl0IHdpbGwgcG9wIHVwIGZvciBldmVyeSBFWFBFQ1QvQVNTRVJUX0RFQVRIIHN0YXRlbWVudAorICAgIC8vIGV4ZWN1dGVkLiBHb29nbGUgVGVzdCB3aWxsIG5vdGlmeSB0aGUgdXNlciBvZiBhbnkgdW5leHBlY3RlZAorICAgIC8vIGZhaWx1cmUgdmlhIHN0ZGVyci4KKyAgICAvLworICAgIC8vIFZDKysgZG9lc24ndCBkZWZpbmUgX3NldF9hYm9ydF9iZWhhdmlvcigpIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDguMC4KKyAgICAvLyBVc2VycyBvZiBwcmlvciBWQyB2ZXJzaW9ucyBzaGFsbCBzdWZmZXIgdGhlIGFnb255IGFuZCBwYWluIG9mCisgICAgLy8gY2xpY2tpbmcgdGhyb3VnaCB0aGUgY291bnRsZXNzIGRlYnVnIGRpYWxvZ3MuCisgICAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogZmluZCBhIHdheSB0byBzdXBwcmVzcyB0aGUgYWJvcnQgZGlhbG9nKCkgaW4gdGhlCisgICAgLy8gZGVidWcgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggVkMgNy4xIG9yIGxvd2VyLgorICAgIGlmICghR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkKKyAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoCisgICAgICAgICAgMHgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgX1dSSVRFX0FCT1JUX01TRyB8IF9DQUxMX1JFUE9SVEZBVUxUKTsgIC8vIHBvcC11cCB3aW5kb3csIGNvcmUgZHVtcC4KKyMgZW5kaWYKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyAgcmV0dXJuIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIGltcGwoKSwKKyAgICAgICZpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cywKKyAgICAgICJhdXhpbGlhcnkgdGVzdCBjb2RlIChlbnZpcm9ubWVudHMgb3IgZXZlbnQgbGlzdGVuZXJzKSIpID8gMCA6IDE7Cit9CisKKy8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKKy8vIGV4ZWN1dGVkLgorY29uc3QgY2hhciogVW5pdFRlc3Q6Om9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPm9yaWdpbmFsX3dvcmtpbmdfZGlyXy5jX3N0cigpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorY29uc3QgVGVzdEluZm8qIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfaW5mbygpOworfQorCisvLyBSZXR1cm5zIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KK2ludCBVbml0VGVzdDo6cmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+cmFuZG9tX3NlZWQoKTsgfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKy8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCitpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmCisgICAgVW5pdFRlc3Q6OnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpCisgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICByZXR1cm4gaW1wbF8tPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgorVW5pdFRlc3Q6OlVuaXRUZXN0KCkgeworICBpbXBsXyA9IG5ldyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKHRoaXMpOworfQorCisvLyBEZXN0cnVjdG9yIG9mIFVuaXRUZXN0LgorVW5pdFRlc3Q6On5Vbml0VGVzdCgpIHsKKyAgZGVsZXRlIGltcGxfOworfQorCisvLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCisvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KK3ZvaWQgVW5pdFRlc3Q6OlB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnB1c2hfYmFjayh0cmFjZSk7Cit9CisKKy8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgordm9pZCBVbml0VGVzdDo6UG9wR1Rlc3RUcmFjZSgpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucG9wX2JhY2soKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworVW5pdFRlc3RJbXBsOjpVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCkKKyAgICA6IHBhcmVudF8ocGFyZW50KSwKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzU1KSAgICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDM1NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNpbmcgdGhpcyBpbiBpbml0aWFsaXplcikuCisgICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlIGFnYWluLgorI2Vsc2UKKyAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorI2VuZGlmICAvLyBfTVNDX1ZFUgorICAgICAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8oCisgICAgICAgICAgJmRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKKyAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8oCisgICAgICAgICAgJmRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyksCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8oKSwKKyAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8oZmFsc2UpLAorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAgICAgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfKC0xKSwKKyAgICAgIGN1cnJlbnRfdGVzdF9jYXNlXyhOVUxMKSwKKyAgICAgIGN1cnJlbnRfdGVzdF9pbmZvXyhOVUxMKSwKKyAgICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8oKSwKKyAgICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8oTlVMTCksCisgICAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKGZhbHNlKSwKKyAgICAgIHJhbmRvbV9zZWVkXygwKSwgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgcmFuZG9tXygwKSwgIC8vIFdpbGwgYmUgcmVzZWVkZWQgYmVmb3JlIGZpcnN0IHVzZS4KKyAgICAgIHN0YXJ0X3RpbWVzdGFtcF8oMCksCisgICAgICBlbGFwc2VkX3RpbWVfKDApLAorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgICAgICBkZWF0aF90ZXN0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSksCisjZW5kaWYKKyAgICAgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgY2F0Y2hfZXhjZXB0aW9uc18oZmFsc2UpIHsKKyAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRSZXN1bHRQcmludGVyKG5ldyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIpOworfQorCitVbml0VGVzdEltcGw6On5Vbml0VGVzdEltcGwoKSB7CisgIC8vIERlbGV0ZXMgZXZlcnkgVGVzdENhc2UuCisgIEZvckVhY2godGVzdF9jYXNlc18sIGludGVybmFsOjpEZWxldGU8VGVzdENhc2U+KTsKKworICAvLyBEZWxldGVzIGV2ZXJ5IEVudmlyb25tZW50LgorICBGb3JFYWNoKGVudmlyb25tZW50c18sIGludGVybmFsOjpEZWxldGU8RW52aXJvbm1lbnQ+KTsKKworICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKK30KKworLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgaW4gYQorLy8gY29udGV4dCBvZiBhIHRlc3QsIHRvIGN1cnJlbnQgdGVzdCBjYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0IHdoZW4gaW52b2tlCisvLyBmcm9tIFNldFVwVGVzdENhc2UvVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQKKy8vIG90aGVyd2lzZS4gIElmIHRoZSByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LAorLy8gdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKKyAgc3RkOjpzdHJpbmcgeG1sX2VsZW1lbnQ7CisgIFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0OyAgLy8gVGVzdFJlc3VsdCBhcHByb3ByaWF0ZSBmb3IgcHJvcGVydHkgcmVjb3JkaW5nLgorCisgIGlmIChjdXJyZW50X3Rlc3RfaW5mb18gIT0gTlVMTCkgeworICAgIHhtbF9lbGVtZW50ID0gInRlc3RjYXNlIjsKKyAgICB0ZXN0X3Jlc3VsdCA9ICYoY3VycmVudF90ZXN0X2luZm9fLT5yZXN1bHRfKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X3Rlc3RfY2FzZV8gIT0gTlVMTCkgeworICAgIHhtbF9lbGVtZW50ID0gInRlc3RzdWl0ZSI7CisgICAgdGVzdF9yZXN1bHQgPSAmKGN1cnJlbnRfdGVzdF9jYXNlXy0+YWRfaG9jX3Rlc3RfcmVzdWx0Xyk7CisgIH0gZWxzZSB7CisgICAgeG1sX2VsZW1lbnQgPSAidGVzdHN1aXRlcyI7CisgICAgdGVzdF9yZXN1bHQgPSAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsKKyAgfQorICB0ZXN0X3Jlc3VsdC0+UmVjb3JkUHJvcGVydHkoeG1sX2VsZW1lbnQsIHRlc3RfcHJvcGVydHkpOworfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKy8vIERpc2FibGVzIGV2ZW50IGZvcndhcmRpbmcgaWYgdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IGluIGEgZGVhdGggdGVzdAorLy8gc3VicHJvY2Vzcy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpIHsKKyAgaWYgKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpCisgICAgbGlzdGVuZXJzKCktPlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBwZXJmb3JtaW5nIFhNTCBvdXRwdXQgYXMgc3BlY2lmaWVkIGJ5CisvLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6Q29uZmlndXJlWG1sT3V0cHV0KCkgeworICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2Zvcm1hdCA9IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCk7CisgIGlmIChvdXRwdXRfZm9ybWF0ID09ICJ4bWwiKSB7CisgICAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRYbWxHZW5lcmF0b3IobmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcigKKyAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKS5jX3N0cigpKSk7CisgIH0gZWxzZSBpZiAob3V0cHV0X2Zvcm1hdCAhPSAiIikgeworICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIG91dHB1dCBmb3JtYXQgXCIlc1wiIGlnbm9yZWQuXG4iLAorICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9Cit9CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisvLyBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnMgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgaW4gc3RyaW5nIGZvcm0uCisvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7CisgIGlmICghdGFyZ2V0LmVtcHR5KCkpIHsKKyAgICBjb25zdCBzaXplX3QgcG9zID0gdGFyZ2V0LmZpbmQoJzonKTsKKyAgICBpZiAocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBsaXN0ZW5lcnMoKS0+QXBwZW5kKG5ldyBTdHJlYW1pbmdMaXN0ZW5lcih0YXJnZXQuc3Vic3RyKDAsIHBvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3Vic3RyKHBvcysxKSkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIldBUk5JTkc6IHVucmVjb2duaXplZCBzdHJlYW1pbmcgdGFyZ2V0IFwiJXNcIiBpZ25vcmVkLlxuIiwKKyAgICAgICAgICAgICB0YXJnZXQuY19zdHIoKSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworCisvLyBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBkZXBlbmRlbnQgdXBvbiBmbGFnIHZhbHVlcyBvYnRhaW5lZCBpbgorLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KKy8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKKy8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCisvLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50Lgordm9pZCBVbml0VGVzdEltcGw6OlBvc3RGbGFnUGFyc2luZ0luaXQoKSB7CisgIC8vIEVuc3VyZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4ZWN1dGUgbW9yZSB0aGFuIG9uY2UuCisgIGlmICghcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXykgeworICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8gPSB0cnVlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgICBJbml0RGVhdGhUZXN0U3VicHJvY2Vzc0NvbnRyb2xJbmZvKCk7CisgICAgU3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICAgIC8vIFJlZ2lzdGVycyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBUaGlzIG1ha2VzIHBhcmFtZXRlcml6ZWQgdGVzdHMKKyAgICAvLyBhdmFpbGFibGUgdG8gdGhlIFVuaXRUZXN0IHJlZmxlY3Rpb24gQVBJIHdpdGhvdXQgcnVubmluZworICAgIC8vIFJVTl9BTExfVEVTVFMuCisgICAgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKKworICAgIC8vIENvbmZpZ3VyZXMgbGlzdGVuZXJzIGZvciBYTUwgb3V0cHV0LiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycworICAgIC8vIHRvIHNodXQgZG93biB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0IGJlZm9yZSBpbnZva2luZyBSVU5fQUxMX1RFU1RTLgorICAgIENvbmZpZ3VyZVhtbE91dHB1dCgpOworCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworICAgIC8vIENvbmZpZ3VyZXMgbGlzdGVuZXJzIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyLgorICAgIENvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpOworI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgIH0KK30KKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIG5hbWUgb2YgYSBUZXN0Q2FzZSBhZ2FpbnN0IGEga25vd24KKy8vIHZhbHVlLgorLy8KKy8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzIG9ubHkuICBXZSBwdXQKKy8vIGl0IGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIHRvIHByZXZlbnQgcG9sbHV0aW5nIHRoZSBvdXRlcgorLy8gbmFtZXNwYWNlLgorLy8KKy8vIFRlc3RDYXNlTmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdENhc2VOYW1lSXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3RDYXNlTmFtZUlzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG5hbWUgb2YgdGVzdF9jYXNlIG1hdGNoZXMgbmFtZV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfY2FzZSAhPSBOVUxMICYmIHN0cmNtcCh0ZXN0X2Nhc2UtPm5hbWUoKSwgbmFtZV8uY19zdHIoKSkgPT0gMDsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCisvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAorLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LiAgSXQncyB0aGUgQ0FMTEVSJ1MKKy8vIFJFU1BPTlNJQklMSVRZIHRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgV0hFTiBUSEUKKy8vIFRFU1RTIEFSRSBOT1QgU0hVRkZMRUQuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICB0eXBlX3BhcmFtOiAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2UqIFVuaXRUZXN0SW1wbDo6R2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKSB7CisgIC8vIENhbiB3ZSBmaW5kIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZT8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPjo6Y29uc3RfaXRlcmF0b3IgdGVzdF9jYXNlID0KKyAgICAgIHN0ZDo6ZmluZF9pZih0ZXN0X2Nhc2VzXy5iZWdpbigpLCB0ZXN0X2Nhc2VzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZU5hbWVJcyh0ZXN0X2Nhc2VfbmFtZSkpOworCisgIGlmICh0ZXN0X2Nhc2UgIT0gdGVzdF9jYXNlc18uZW5kKCkpCisgICAgcmV0dXJuICp0ZXN0X2Nhc2U7CisKKyAgLy8gTm8uICBMZXQncyBjcmVhdGUgb25lLgorICBUZXN0Q2FzZSogY29uc3QgbmV3X3Rlc3RfY2FzZSA9CisgICAgICBuZXcgVGVzdENhc2UodGVzdF9jYXNlX25hbWUsIHR5cGVfcGFyYW0sIHNldF91cF90YywgdGVhcl9kb3duX3RjKTsKKworICAvLyBJcyB0aGlzIGEgZGVhdGggdGVzdCBjYXNlPworICBpZiAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlYXRoVGVzdENhc2VGaWx0ZXIpKSB7CisgICAgLy8gWWVzLiAgSW5zZXJ0cyB0aGUgdGVzdCBjYXNlIGFmdGVyIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZQorICAgIC8vIGRlZmluZWQgc28gZmFyLiAgVGhpcyBvbmx5IHdvcmtzIHdoZW4gdGhlIHRlc3QgY2FzZXMgaGF2ZW4ndAorICAgIC8vIGJlZW4gc2h1ZmZsZWQuICBPdGhlcndpc2Ugd2UgbWF5IGVuZCB1cCBydW5uaW5nIGEgZGVhdGggdGVzdAorICAgIC8vIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QuCisgICAgKytsYXN0X2RlYXRoX3Rlc3RfY2FzZV87CisgICAgdGVzdF9jYXNlc18uaW5zZXJ0KHRlc3RfY2FzZXNfLmJlZ2luKCkgKyBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8sCisgICAgICAgICAgICAgICAgICAgICAgIG5ld190ZXN0X2Nhc2UpOworICB9IGVsc2UgeworICAgIC8vIE5vLiAgQXBwZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgIHRlc3RfY2FzZXNfLnB1c2hfYmFjayhuZXdfdGVzdF9jYXNlKTsKKyAgfQorCisgIHRlc3RfY2FzZV9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VfaW5kaWNlc18uc2l6ZSgpKSk7CisgIHJldHVybiBuZXdfdGVzdF9jYXNlOworfQorCisvLyBIZWxwZXJzIGZvciBzZXR0aW5nIHVwIC8gdGVhcmluZyBkb3duIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4gIFRoZXkKKy8vIGFyZSBmb3IgdXNlIGluIHRoZSBGb3JFYWNoKCkgZnVuY3Rpb24uCitzdGF0aWMgdm9pZCBTZXRVcEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5TZXRVcCgpOyB9CitzdGF0aWMgdm9pZCBUZWFyRG93bkVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5UZWFyRG93bigpOyB9CisKKy8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcworLy8gdGhyb3duIGR1cmluZyBhIHRlc3QsIHRoZSB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQgdGhlCisvLyByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4KKy8vCisvLyBXaGVuIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQsIGl0IGV4cGFuZHMgYW5kIHJlZ2lzdGVycworLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBmaXJzdCBpbiBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpLgorLy8gQWxsIG90aGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cygpIG1heSBzYWZlbHkgYXNzdW1lIHRoYXQKKy8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIHJlYWR5IHRvIGJlIGNvdW50ZWQgYW5kIHJ1bi4KK2Jvb2wgVW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cygpIHsKKyAgLy8gTWFrZXMgc3VyZSBJbml0R29vZ2xlVGVzdCgpIHdhcyBjYWxsZWQuCisgIGlmICghR1Rlc3RJc0luaXRpYWxpemVkKCkpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIlxuVGhpcyB0ZXN0IHByb2dyYW0gZGlkIE5PVCBjYWxsIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QgIgorICAgICAgICAgICAiYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLiAgUGxlYXNlIGZpeCBpdC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIERvIG5vdCBydW4gYW55IHRlc3QgaWYgdGhlIC0taGVscCBmbGFnIHdhcyBzcGVjaWZpZWQuCisgIGlmIChnX2hlbHBfZmxhZykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBSZXBlYXRzIHRoZSBjYWxsIHRvIHRoZSBwb3N0LWZsYWcgcGFyc2luZyBpbml0aWFsaXphdGlvbiBpbiBjYXNlIHRoZQorICAvLyB1c2VyIGRpZG4ndCBjYWxsIEluaXRHb29nbGVUZXN0LgorICBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7CisKKyAgLy8gRXZlbiBpZiBzaGFyZGluZyBpcyBub3Qgb24sIHRlc3QgcnVubmVycyBtYXkgd2FudCB0byB1c2UgdGhlCisgIC8vIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIHRvIHF1ZXJ5IHdoZXRoZXIgdGhlIHRlc3Qgc3VwcG9ydHMgdGhlIHNoYXJkaW5nCisgIC8vIHByb3RvY29sLgorICBpbnRlcm5hbDo6V3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKyAgLy8gVHJ1ZSBpZmYgd2UgYXJlIGluIGEgc3VicHJvY2VzcyBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QuCisgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IGZhbHNlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICBjb25zdCBib29sIHNob3VsZF9zaGFyZCA9IFNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KTsKKworICAvLyBDb21wYXJlcyB0aGUgZnVsbCB0ZXN0IG5hbWVzIHdpdGggdGhlIGZpbHRlciB0byBkZWNpZGUgd2hpY2gKKyAgLy8gdGVzdHMgdG8gcnVuLgorICBjb25zdCBib29sIGhhc190ZXN0c190b19ydW4gPSBGaWx0ZXJUZXN0cyhzaG91bGRfc2hhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wpID4gMDsKKworICAvLyBMaXN0cyB0aGUgdGVzdHMgYW5kIGV4aXRzIGlmIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3YXMgc3BlY2lmaWVkLgorICBpZiAoR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgeworICAgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiBGaWx0ZXJUZXN0cygpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhzaHVmZmxlKSA/CisgICAgICBHZXRSYW5kb21TZWVkRnJvbUZsYWcoR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIDogMDsKKworICAvLyBUcnVlIGlmZiBhdCBsZWFzdCBvbmUgdGVzdCBoYXMgZmFpbGVkLgorICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IGxpc3RlbmVycygpLT5yZXBlYXRlcigpOworCisgIHN0YXJ0X3RpbWVzdGFtcF8gPSBHZXRUaW1lSW5NaWxsaXMoKTsKKyAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1TdGFydCgqcGFyZW50Xyk7CisKKyAgLy8gSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IHRoZSB0ZXN0cz8gIFdlIGRvbid0IHdhbnQgdG8gcmVwZWF0IHRoZW0KKyAgLy8gd2hlbiB3ZSBhcmUgaW5zaWRlIHRoZSBzdWJwcm9jZXNzIG9mIGEgZGVhdGggdGVzdC4KKyAgY29uc3QgaW50IHJlcGVhdCA9IGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPyAxIDogR1RFU1RfRkxBRyhyZXBlYXQpOworICAvLyBSZXBlYXRzIGZvcmV2ZXIgaWYgdGhlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZS4KKyAgY29uc3QgYm9vbCBmb3JldmVyID0gcmVwZWF0IDwgMDsKKyAgZm9yIChpbnQgaSA9IDA7IGZvcmV2ZXIgfHwgaSAhPSByZXBlYXQ7IGkrKykgeworICAgIC8vIFdlIHdhbnQgdG8gcHJlc2VydmUgZmFpbHVyZXMgZ2VuZXJhdGVkIGJ5IGFkLWhvYyB0ZXN0CisgICAgLy8gYXNzZXJ0aW9ucyBleGVjdXRlZCBiZWZvcmUgUlVOX0FMTF9URVNUUygpLgorICAgIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCk7CisKKyAgICBjb25zdCBUaW1lSW5NaWxsaXMgc3RhcnQgPSBHZXRUaW1lSW5NaWxsaXMoKTsKKworICAgIC8vIFNodWZmbGVzIHRlc3QgY2FzZXMgYW5kIHRlc3RzIGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1biAmJiBHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgICByYW5kb20oKS0+UmVzZWVkKHJhbmRvbV9zZWVkXyk7CisgICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KCksCisgICAgICAvLyBzdWNoIHRoYXQgYSB0ZXN0IGV2ZW50IGxpc3RlbmVyIGNhbiBzZWUgdGhlIGFjdHVhbCB0ZXN0IG9yZGVyCisgICAgICAvLyBpbiB0aGUgZXZlbnQuCisgICAgICBTaHVmZmxlVGVzdHMoKTsKKyAgICB9CisKKyAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IHRoZSB0ZXN0cyBhcmUgYWJvdXQgdG8gc3RhcnQuCisgICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KCpwYXJlbnRfLCBpKTsKKworICAgIC8vIFJ1bnMgZWFjaCB0ZXN0IGNhc2UgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRlc3QgdG8gcnVuLgorICAgIGlmIChoYXNfdGVzdHNfdG9fcnVuKSB7CisgICAgICAvLyBTZXRzIHVwIGFsbCBlbnZpcm9ubWVudHMgYmVmb3JlaGFuZC4KKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwU3RhcnQoKnBhcmVudF8pOworICAgICAgRm9yRWFjaChlbnZpcm9ubWVudHNfLCBTZXRVcEVudmlyb25tZW50KTsKKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwRW5kKCpwYXJlbnRfKTsKKworICAgICAgLy8gUnVucyB0aGUgdGVzdHMgb25seSBpZiB0aGVyZSB3YXMgbm8gZmF0YWwgZmFpbHVyZSBkdXJpbmcgZ2xvYmFsCisgICAgICAvLyBzZXQtdXAuCisgICAgICBpZiAoIVRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgICAgIGZvciAoaW50IHRlc3RfaW5kZXggPSAwOyB0ZXN0X2luZGV4IDwgdG90YWxfdGVzdF9jYXNlX2NvdW50KCk7CisgICAgICAgICAgICAgdGVzdF9pbmRleCsrKSB7CisgICAgICAgICAgR2V0TXV0YWJsZVRlc3RDYXNlKHRlc3RfaW5kZXgpLT5SdW4oKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBUZWFycyBkb3duIGFsbCBlbnZpcm9ubWVudHMgaW4gcmV2ZXJzZSBvcmRlciBhZnRlcndhcmRzLgorICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCgqcGFyZW50Xyk7CisgICAgICBzdGQ6OmZvcl9lYWNoKGVudmlyb25tZW50c18ucmJlZ2luKCksIGVudmlyb25tZW50c18ucmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBUZWFyRG93bkVudmlyb25tZW50KTsKKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kKCpwYXJlbnRfKTsKKyAgICB9CisKKyAgICBlbGFwc2VkX3RpbWVfID0gR2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICAgIC8vIFRlbGxzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCB0aGUgdGVzdHMgaGF2ZSBqdXN0IGZpbmlzaGVkLgorICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25FbmQoKnBhcmVudF8sIGkpOworCisgICAgLy8gR2V0cyB0aGUgcmVzdWx0IGFuZCBjbGVhcnMgaXQuCisgICAgaWYgKCFQYXNzZWQoKSkgeworICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgdGVzdCBvcmRlciBhZnRlciB0aGUgaXRlcmF0aW9uLiAgVGhpcworICAgIC8vIGFsbG93cyB0aGUgdXNlciB0byBxdWlja2x5IHJlcHJvIGEgZmFpbHVyZSB0aGF0IGhhcHBlbnMgaW4gdGhlCisgICAgLy8gTi10aCBpdGVyYXRpb24gd2l0aG91dCByZXBlYXRpbmcgdGhlIGZpcnN0IChOIC0gMSkgaXRlcmF0aW9ucy4KKyAgICAvLyBUaGlzIGlzIG5vdCBlbmNsb3NlZCBpbiAiaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsgLi4uIH0iLCBpbgorICAgIC8vIGNhc2UgdGhlIHVzZXIgc29tZWhvdyBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBzb21ld2hlcmUKKyAgICAvLyAoaXQncyBhbHdheXMgc2FmZSB0byB1bnNodWZmbGUgdGhlIHRlc3RzKS4KKyAgICBVbnNodWZmbGVUZXN0cygpOworCisgICAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICAgIC8vIFBpY2tzIGEgbmV3IHJhbmRvbSBzZWVkIGZvciBlYWNoIGl0ZXJhdGlvbi4KKyAgICAgIHJhbmRvbV9zZWVkXyA9IEdldE5leHRSYW5kb21TZWVkKHJhbmRvbV9zZWVkXyk7CisgICAgfQorICB9CisKKyAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1FbmQoKnBhcmVudF8pOworCisgIHJldHVybiAhZmFpbGVkOworfQorCisvLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlCisvLyBpZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudC4gSWYgYSBmaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24sIHRoaXMKKy8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QKKy8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuCit2b2lkIFdyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgdGVzdF9zaGFyZF9maWxlID0gcG9zaXg6OkdldEVudihrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgIGlmICh0ZXN0X3NoYXJkX2ZpbGUgIT0gTlVMTCkgeworICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4odGVzdF9zaGFyZF9maWxlLCAidyIpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlIFwiJXNcIiAiCisgICAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgYnkgdGhlICVzIGVudmlyb25tZW50IHZhcmlhYmxlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9zaGFyZF9maWxlLCBrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICB9Cit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoaS5lLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK2Jvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX2VudiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfZW52LAorICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgaWYgKGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBJbnQzMkZyb21FbnZPckRpZSh0b3RhbF9zaGFyZHNfZW52LCAtMSk7CisgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoc2hhcmRfaW5kZXhfZW52LCAtMSk7CisKKyAgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggIT0gLTEpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCisgICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA9ICIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsIGJ1dCBoYXZlIGxlZnQgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyAhPSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKKyAgICAgIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiA9ICIgPDwgdG90YWxfc2hhcmRzCisgICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHNoYXJkX2luZGV4IDwgMCB8fCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB3ZSByZXF1aXJlIDAgPD0gIgorICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPCAiIDw8IGtUZXN0VG90YWxTaGFyZHMKKyAgICAgIDw8ICIsIGJ1dCB5b3UgaGF2ZSAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiPSIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiPSIgPDwgdG90YWxfc2hhcmRzIDw8ICIuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisKKyAgcmV0dXJuIHRvdGFsX3NoYXJkcyA+IDE7Cit9CisKKy8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKKy8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yCisvLyBhbmQgYWJvcnRzLgorSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCkgeworICBjb25zdCBjaGFyKiBzdHJfdmFsID0gcG9zaXg6OkdldEVudih2YXIpOworICBpZiAoc3RyX3ZhbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsOworICB9CisKKyAgSW50MzIgcmVzdWx0OworICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCB2YXIsCisgICAgICAgICAgICAgICAgICBzdHJfdmFsLCAmcmVzdWx0KSkgeworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCisvLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKKy8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0CisvLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgorYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZChpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKSB7CisgIHJldHVybiAodGVzdF9pZCAlIHRvdGFsX3NoYXJkcykgPT0gc2hhcmRfaW5kZXg7Cit9CisKKy8vIENvbXBhcmVzIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgdG8KKy8vIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4sIHRoZW4gcmVjb3JkcyB0aGUgcmVzdWx0IGluCisvLyBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCisvLyBJZiBzaGFyZF90ZXN0cyA9PSB0cnVlLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMgYmFzZWQgb24gc2hhcmRpbmcKKy8vIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQgLSBzZWUKKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6RmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKSB7CisgIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0VG90YWxTaGFyZHMsIC0xKSA6IC0xOworICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpIDogLTE7CisKKyAgLy8gbnVtX3J1bm5hYmxlX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgd2lsbAorICAvLyBydW4gYWNyb3NzIGFsbCBzaGFyZHMgKGkuZS4sIG1hdGNoIGZpbHRlciBhbmQgYXJlIG5vdCBkaXNhYmxlZCkuCisgIC8vIG51bV9zZWxlY3RlZF90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBydW4gb24KKyAgLy8gdGhpcyBzaGFyZC4KKyAgaW50IG51bV9ydW5uYWJsZV90ZXN0cyA9IDA7CisgIGludCBudW1fc2VsZWN0ZWRfdGVzdHMgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSA9IHRlc3RfY2FzZS0+bmFtZSgpOworICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4oZmFsc2UpOworCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKKyAgICAgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X25hbWUodGVzdF9pbmZvLT5uYW1lKCkpOworICAgICAgLy8gQSB0ZXN0IGlzIGRpc2FibGVkIGlmIHRlc3QgY2FzZSBuYW1lIG9yIHRlc3QgbmFtZSBtYXRjaGVzCisgICAgICAvLyBrRGlzYWJsZVRlc3RGaWx0ZXIuCisgICAgICBjb25zdCBib29sIGlzX2Rpc2FibGVkID0KKyAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKSB8fAorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKTsKKyAgICAgIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfID0gaXNfZGlzYWJsZWQ7CisKKyAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlc19maWx0ZXIgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk7CisgICAgICB0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXyA9IG1hdGNoZXNfZmlsdGVyOworCisgICAgICBjb25zdCBib29sIGlzX3J1bm5hYmxlID0KKyAgICAgICAgICAoR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgfHwgIWlzX2Rpc2FibGVkKSAmJgorICAgICAgICAgIG1hdGNoZXNfZmlsdGVyOworCisgICAgICBjb25zdCBib29sIGlzX3NlbGVjdGVkID0gaXNfcnVubmFibGUgJiYKKyAgICAgICAgICAoc2hhcmRfdGVzdHMgPT0gSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MIHx8CisgICAgICAgICAgIFNob3VsZFJ1blRlc3RPblNoYXJkKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ydW5uYWJsZV90ZXN0cykpOworCisgICAgICBudW1fcnVubmFibGVfdGVzdHMgKz0gaXNfcnVubmFibGU7CisgICAgICBudW1fc2VsZWN0ZWRfdGVzdHMgKz0gaXNfc2VsZWN0ZWQ7CisKKyAgICAgIHRlc3RfaW5mby0+c2hvdWxkX3J1bl8gPSBpc19zZWxlY3RlZDsKKyAgICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4odGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgfHwgaXNfc2VsZWN0ZWQpOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX3NlbGVjdGVkX3Rlc3RzOworfQorCisvLyBQcmludHMgdGhlIGdpdmVuIEMtc3RyaW5nIG9uIGEgc2luZ2xlIGxpbmUgYnkgcmVwbGFjaW5nIGFsbCAnXG4nCisvLyBjaGFyYWN0ZXJzIHdpdGggc3RyaW5nICJcXG4iLiAgSWYgdGhlIG91dHB1dCB0YWtlcyBtb3JlIHRoYW4KKy8vIG1heF9sZW5ndGggY2hhcmFjdGVycywgb25seSBwcmludHMgdGhlIGZpcnN0IG1heF9sZW5ndGggY2hhcmFjdGVycworLy8gYW5kICIuLi4iLgorc3RhdGljIHZvaWQgUHJpbnRPbk9uZUxpbmUoY29uc3QgY2hhciogc3RyLCBpbnQgbWF4X2xlbmd0aCkgeworICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgKnN0ciAhPSAnXDAnOyArK3N0cikgeworICAgICAgaWYgKGkgPj0gbWF4X2xlbmd0aCkgeworICAgICAgICBwcmludGYoIi4uLiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICgqc3RyID09ICdcbicpIHsKKyAgICAgICAgcHJpbnRmKCJcXG4iKTsKKyAgICAgICAgaSArPSAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlYyIsICpzdHIpOworICAgICAgICArK2k7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpIHsKKyAgLy8gUHJpbnQgYXQgbW9zdCB0aGlzIG1hbnkgY2hhcmFjdGVycyBmb3IgZWFjaCB0eXBlL3ZhbHVlIHBhcmFtZXRlci4KKyAgY29uc3QgaW50IGtNYXhQYXJhbUxlbmd0aCA9IDI1MDsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOworICAgIGJvb2wgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IGZhbHNlOworCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKKyAgICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICAgICAgIHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsKKyAgICAgIGlmICh0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXykgeworICAgICAgICBpZiAoIXByaW50ZWRfdGVzdF9jYXNlX25hbWUpIHsKKyAgICAgICAgICBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gdHJ1ZTsKKyAgICAgICAgICBwcmludGYoIiVzLiIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKKyAgICAgICAgICBpZiAodGVzdF9jYXNlLT50eXBlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCIgICMgJXMgPSAiLCBrVHlwZVBhcmFtTGFiZWwpOworICAgICAgICAgICAgLy8gV2UgcHJpbnQgdGhlIHR5cGUgcGFyYW1ldGVyIG9uIGEgc2luZ2xlIGxpbmUgdG8gbWFrZQorICAgICAgICAgICAgLy8gdGhlIG91dHB1dCBlYXN5IHRvIHBhcnNlIGJ5IGEgcHJvZ3JhbS4KKyAgICAgICAgICAgIFByaW50T25PbmVMaW5lKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpLCBrTWF4UGFyYW1MZW5ndGgpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgICVzIiwgdGVzdF9pbmZvLT5uYW1lKCkpOworICAgICAgICBpZiAodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsKKyAgICAgICAgICBwcmludGYoIiAgIyAlcyA9ICIsIGtWYWx1ZVBhcmFtTGFiZWwpOworICAgICAgICAgIC8vIFdlIHByaW50IHRoZSB2YWx1ZSBwYXJhbWV0ZXIgb24gYSBzaW5nbGUgbGluZSB0byBtYWtlIHRoZQorICAgICAgICAgIC8vIG91dHB1dCBlYXN5IHRvIHBhcnNlIGJ5IGEgcHJvZ3JhbS4KKyAgICAgICAgICBQcmludE9uT25lTGluZSh0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCksIGtNYXhQYXJhbUxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgfQorICAgIH0KKyAgfQorICBmZmx1c2goc3Rkb3V0KTsKK30KKworLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgorLy8KKy8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBhcmUKKy8vIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZSBpbnB1dCB0aGUKKy8vIGN1cnJlbnQgZ2V0dGVyLgordm9pZCBVbml0VGVzdEltcGw6OnNldF9vc19zdGFja190cmFjZV9nZXR0ZXIoCisgICAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBnZXR0ZXIpIHsKKyAgaWYgKG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gIT0gZ2V0dGVyKSB7CisgICAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87CisgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IGdldHRlcjsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBpZiBpdCBpcyBub3QgTlVMTDsKKy8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50CisvLyBnZXR0ZXIsIGFuZCByZXR1cm5zIGl0LgorT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBVbml0VGVzdEltcGw6Om9zX3N0YWNrX3RyYWNlX2dldHRlcigpIHsKKyAgaWYgKG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPT0gTlVMTCkgeworICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBuZXcgT3NTdGFja1RyYWNlR2V0dGVyOworICB9CisKKyAgcmV0dXJuIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKKy8vIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorVGVzdFJlc3VsdCogVW5pdFRlc3RJbXBsOjpjdXJyZW50X3Rlc3RfcmVzdWx0KCkgeworICByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fID8KKyAgICAgICYoY3VycmVudF90ZXN0X2luZm9fLT5yZXN1bHRfKSA6ICZhZF9ob2NfdGVzdF9yZXN1bHRfOworfQorCisvLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCisvLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2h1ZmZsZVRlc3RzKCkgeworICAvLyBTaHVmZmxlcyB0aGUgZGVhdGggdGVzdCBjYXNlcy4KKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCAwLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKKworICAvLyBTaHVmZmxlcyB0aGUgbm9uLWRlYXRoIHRlc3QgY2FzZXMuCisgIFNodWZmbGVSYW5nZShyYW5kb20oKSwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKSwgJnRlc3RfY2FzZV9pbmRpY2VzXyk7CisKKyAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluc2lkZSBlYWNoIHRlc3QgY2FzZS4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIHRlc3RfY2FzZXNfW2ldLT5TaHVmZmxlVGVzdHMocmFuZG9tKCkpOworICB9Cit9CisKKy8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCit2b2lkIFVuaXRUZXN0SW1wbDo6VW5zaHVmZmxlVGVzdHMoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBVbnNodWZmbGVzIHRoZSB0ZXN0cyBpbiBlYWNoIHRlc3QgY2FzZS4KKyAgICB0ZXN0X2Nhc2VzX1tpXS0+VW5zaHVmZmxlVGVzdHMoKTsKKyAgICAvLyBSZXNldHMgdGhlIGluZGV4IG9mIGVhY2ggdGVzdCBjYXNlLgorICAgIHRlc3RfY2FzZV9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7CisgIH0KK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoLi4uLCAxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbgorLy8gdGhlIHRyYWNlIGJ1dCBCYXIoKSBhbmQgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0Lgorc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChVbml0VGVzdCogLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQpIHsKKyAgLy8gV2UgcGFzcyBza2lwX2NvdW50ICsgMSB0byBza2lwIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpbiBhZGRpdGlvbgorICAvLyB0byB3aGF0IHRoZSB1c2VyIHJlYWxseSB3YW50cyB0byBza2lwLgorICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3Aoc2tpcF9jb3VudCArIDEpOworfQorCisvLyBVc2VkIGJ5IHRoZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfIG1hY3JvIHRvCisvLyBzdXBwcmVzcyB1bnJlYWNoYWJsZSBjb2RlIHdhcm5pbmdzLgorbmFtZXNwYWNlIHsKK2NsYXNzIENsYXNzVW5pcXVlVG9BbHdheXNUcnVlIHt9OworfQorCitib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbikgeyByZXR1cm4gY29uZGl0aW9uOyB9CisKK2Jvb2wgQWx3YXlzVHJ1ZSgpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICAvLyBUaGlzIGNvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2Ugc28gQWx3YXlzVHJ1ZSgpIG5ldmVyIGFjdHVhbGx5IHRocm93cywKKyAgLy8gYnV0IGl0IG1ha2VzIHRoZSBjb21waWxlciB0aGluayB0aGF0IGl0IG1heSB0aHJvdy4KKyAgaWYgKElzVHJ1ZShmYWxzZSkpCisgICAgdGhyb3cgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0CisvLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKKy8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KK2Jvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKSB7CisgIGNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7CisgIGlmIChzdHJuY21wKCpwc3RyLCBwcmVmaXgsIHByZWZpeF9sZW4pID09IDApIHsKKyAgICAqcHN0ciArPSBwcmVmaXhfbGVuOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlCisvLyB0aGUgZm9ybWF0ICItLWZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlICI9dmFsdWUiCisvLyBwYXJ0IGNhbiBiZSBvbWl0dGVkLgorLy8KKy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBOVUxMIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KK2NvbnN0IGNoYXIqIFBhcnNlRmxhZ1ZhbHVlKGNvbnN0IGNoYXIqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgeworICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4KKyAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLSIgZm9sbG93ZWQgYnkgR1RFU1RfRkxBR19QUkVGSVhfLgorICBjb25zdCBzdGQ6OnN0cmluZyBmbGFnX3N0ciA9IHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsgZmxhZzsKKyAgY29uc3Qgc2l6ZV90IGZsYWdfbGVuID0gZmxhZ19zdHIubGVuZ3RoKCk7CisgIGlmIChzdHJuY21wKHN0ciwgZmxhZ19zdHIuY19zdHIoKSwgZmxhZ19sZW4pICE9IDApIHJldHVybiBOVUxMOworCisgIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCisgIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47CisKKyAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCisgIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSB7CisgICAgcmV0dXJuIGZsYWdfZW5kOworICB9CisKKyAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCisgIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCisgIC8vIHRoZSBmbGFnIG5hbWUuCisgIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOworCisgIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCisgIHJldHVybiBmbGFnX2VuZCArIDE7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mIGVpdGhlcgorLy8gIi0tZmxhZz12YWx1ZSIgb3IgIi0tZmxhZyIuCisvLworLy8gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZSBhcyBsb25nIGFzIGl0IGRvZXMKKy8vIG5vdCBzdGFydCB3aXRoICcwJywgJ2YnLCBvciAnRicuCisvLworLy8gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZS4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUJvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgYm9vbCogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIGJvb2wuCisgICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VJbnQzMkZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgcmV0dXJuIFBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZmxhZyAtLSIgPDwgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZSk7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgorICAqdmFsdWUgPSB2YWx1ZV9zdHI7CisgIHJldHVybiB0cnVlOworfQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgaGFzIGEgcHJlZml4IHRoYXQgR29vZ2xlIFRlc3QgdXNlcyBmb3IgaXRzCisvLyBmbGFncywgaS5lLiwgc3RhcnRzIHdpdGggR1RFU1RfRkxBR19QUkVGSVhfIG9yIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLgorLy8gSWYgR29vZ2xlIFRlc3QgZGV0ZWN0cyB0aGF0IGEgY29tbWFuZCBsaW5lIGZsYWcgaGFzIGl0cyBwcmVmaXggYnV0IGlzIG5vdAorLy8gcmVjb2duaXplZCwgaXQgd2lsbCBwcmludCBpdHMgaGVscCBtZXNzYWdlLiBGbGFncyBzdGFydGluZyB3aXRoCisvLyBHVEVTVF9JTlRFUk5BTF9QUkVGSVhfIGZvbGxvd2VkIGJ5ICJpbnRlcm5hbF8iIGFyZSBjb25zaWRlcmVkIEdvb2dsZSBUZXN0CisvLyBpbnRlcm5hbCBmbGFncyBhbmQgZG8gbm90IHRyaWdnZXIgdGhlIGhlbHAgbWVzc2FnZS4KK3N0YXRpYyBib29sIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGNvbnN0IGNoYXIqIHN0cikgeworICByZXR1cm4gKFNraXBQcmVmaXgoIi0tIiwgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KCItIiwgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KCIvIiwgJnN0cikpICYmCisgICAgICAgICAhU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8gImludGVybmFsXyIsICZzdHIpICYmCisgICAgICAgICAoU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8sICZzdHIpIHx8CisgICAgICAgICAgU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXywgJnN0cikpOworfQorCisvLyBQcmludHMgYSBzdHJpbmcgY29udGFpbmluZyBjb2RlLWVuY29kZWQgdGV4dC4gIFRoZSBmb2xsb3dpbmcgZXNjYXBlCisvLyBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjb250cm9sIHRoZSB0ZXh0IGNvbG9yOgorLy8KKy8vICAgQEAgICAgcHJpbnRzIGEgc2luZ2xlICdAJyBjaGFyYWN0ZXIuCisvLyAgIEBSICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHJlZC4KKy8vICAgQEcgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gZ3JlZW4uCisvLyAgIEBZICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHllbGxvdy4KKy8vICAgQEQgICAgY2hhbmdlcyB0byB0aGUgZGVmYXVsdCB0ZXJtaW5hbCB0ZXh0IGNvbG9yLgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBXcml0ZSB0ZXN0cyBmb3IgdGhpcyBvbmNlIHdlIGFkZCBzdGRvdXQKKy8vIGNhcHR1cmluZyB0byBHb29nbGUgVGVzdC4KK3N0YXRpYyB2b2lkIFByaW50Q29sb3JFbmNvZGVkKGNvbnN0IGNoYXIqIHN0cikgeworICBHVGVzdENvbG9yIGNvbG9yID0gQ09MT1JfREVGQVVMVDsgIC8vIFRoZSBjdXJyZW50IGNvbG9yLgorCisgIC8vIENvbmNlcHR1YWxseSwgd2Ugc3BsaXQgdGhlIHN0cmluZyBpbnRvIHNlZ21lbnRzIGRpdmlkZWQgYnkgZXNjYXBlCisgIC8vIHNlcXVlbmNlcy4gIFRoZW4gd2UgcHJpbnQgb25lIHNlZ21lbnQgYXQgYSB0aW1lLiAgQXQgdGhlIGVuZCBvZgorICAvLyBlYWNoIGl0ZXJhdGlvbiwgdGhlIHN0ciBwb2ludGVyIGFkdmFuY2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vIG5leHQgc2VnbWVudC4KKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIqIHAgPSBzdHJjaHIoc3RyLCAnQCcpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICIlcyIsIHN0cik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RkOjpzdHJpbmcoc3RyLCBwKS5jX3N0cigpKTsKKworICAgIGNvbnN0IGNoYXIgY2ggPSBwWzFdOworICAgIHN0ciA9IHAgKyAyOworICAgIGlmIChjaCA9PSAnQCcpIHsKKyAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICJAIik7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnRCcpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfREVGQVVMVDsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdSJykgeworICAgICAgY29sb3IgPSBDT0xPUl9SRUQ7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnRycpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfR1JFRU47CisgICAgfSBlbHNlIGlmIChjaCA9PSAnWScpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfWUVMTE9XOworICAgIH0gZWxzZSB7CisgICAgICAtLXN0cjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIga0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlW10gPQorIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nICIgR1RFU1RfTkFNRV8gIi4gWW91IGNhbiB1c2UgdGhlXG4iCisiZm9sbG93aW5nIGNvbW1hbmQgbGluZSBmbGFncyB0byBjb250cm9sIGl0cyBiZWhhdmlvcjpcbiIKKyJcbiIKKyJUZXN0IFNlbGVjdGlvbjpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAibGlzdF90ZXN0c0BEXG4iCisiICAgICAgTGlzdCB0aGUgbmFtZXMgb2YgYWxsIHRlc3RzIGluc3RlYWQgb2YgcnVubmluZyB0aGVtLiBUaGUgbmFtZSBvZlxuIgorIiAgICAgIFRFU1QoRm9vLCBCYXIpIGlzIFwiRm9vLkJhclwiLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJmaWx0ZXI9QFlQT1NUSVZFX1BBVFRFUk5TIgorICAgICJbQEctQFlORUdBVElWRV9QQVRURVJOU11ARFxuIgorIiAgICAgIFJ1biBvbmx5IHRoZSB0ZXN0cyB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBidXRcbiIKKyIgICAgICBub25lIG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4gJz8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXI7ICcqJ1xuIgorIiAgICAgIG1hdGNoZXMgYW55IHN1YnN0cmluZzsgJzonIHNlcGFyYXRlcyB0d28gcGF0dGVybnMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzQERcbiIKKyIgICAgICBSdW4gYWxsIGRpc2FibGVkIHRlc3RzIHRvby5cbiIKKyJcbiIKKyJUZXN0IEV4ZWN1dGlvbjpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAicmVwZWF0PUBZW0NPVU5UXUBEXG4iCisiICAgICAgUnVuIHRoZSB0ZXN0cyByZXBlYXRlZGx5OyB1c2UgYSBuZWdhdGl2ZSBjb3VudCB0byByZXBlYXQgZm9yZXZlci5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic2h1ZmZsZUBEXG4iCisiICAgICAgUmFuZG9taXplIHRlc3RzJyBvcmRlcnMgb24gZXZlcnkgaXRlcmF0aW9uLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyYW5kb21fc2VlZD1AWVtOVU1CRVJdQERcbiIKKyIgICAgICBSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIGZvciBzaHVmZmxpbmcgdGVzdCBvcmRlcnMgKGJldHdlZW4gMSBhbmRcbiIKKyIgICAgICA5OTk5OSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUpLlxuIgorIlxuIgorIlRlc3QgT3V0cHV0OlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjb2xvcj1AWShAR3llc0BZfEBHbm9AWXxAR2F1dG9AWSlARFxuIgorIiAgICAgIEVuYWJsZS9kaXNhYmxlIGNvbG9yZWQgb3V0cHV0LiBUaGUgZGVmYXVsdCBpcyBAR2F1dG9ARC5cbiIKKyIgIC1ARy0iIEdURVNUX0ZMQUdfUFJFRklYXyAicHJpbnRfdGltZT0wQERcbiIKKyIgICAgICBEb24ndCBwcmludCB0aGUgZWxhcHNlZCB0aW1lIG9mIGVhY2ggdGVzdC5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAib3V0cHV0PXhtbEBZW0BHOkBZRElSRUNUT1JZX1BBVEhARyIKKyAgICBHVEVTVF9QQVRIX1NFUF8gIkBZfEBHOkBZRklMRV9QQVRIXUBEXG4iCisiICAgICAgR2VuZXJhdGUgYW4gWE1MIHJlcG9ydCBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IG9yIHdpdGggdGhlIGdpdmVuIGZpbGVcbiIKKyIgICAgICBuYW1lLiBAWUZJTEVfUEFUSEBEIGRlZmF1bHRzIHRvIEBHdGVzdF9kZXRhaWxzLnhtbEBELlxuIgorI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic3RyZWFtX3Jlc3VsdF90bz1AWUhPU1RARzpAWVBPUlRARFxuIgorIiAgICAgIFN0cmVhbSB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHNlcnZlci5cbiIKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworIlxuIgorIkFzc2VydGlvbiBCZWhhdmlvcjpcbiIKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJkZWF0aF90ZXN0X3N0eWxlPUBZKEBHZmFzdEBZfEBHdGhyZWFkc2FmZUBZKUBEXG4iCisiICAgICAgU2V0IHRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuXG4iCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImJyZWFrX29uX2ZhaWx1cmVARFxuIgorIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gZGVidWdnZXIgYnJlYWstcG9pbnRzLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJ0aHJvd19vbl9mYWlsdXJlQERcbiIKKyIgICAgICBUdXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvIEMrKyBleGNlcHRpb25zLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjYXRjaF9leGNlcHRpb25zPTBARFxuIgorIiAgICAgIERvIG5vdCByZXBvcnQgZXhjZXB0aW9ucyBhcyB0ZXN0IGZhaWx1cmVzLiBJbnN0ZWFkLCBhbGxvdyB0aGVtXG4iCisiICAgICAgdG8gY3Jhc2ggdGhlIHByb2dyYW0gb3IgdGhyb3cgYSBwb3AtdXAgKG9uIFdpbmRvd3MpLlxuIgorIlxuIgorIkV4Y2VwdCBmb3IgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQEQsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQgIgorICAgICJ0aGUgY29ycmVzcG9uZGluZ1xuIgorImVudmlyb25tZW50IHZhcmlhYmxlIG9mIGEgZmxhZyAoYWxsIGxldHRlcnMgaW4gdXBwZXItY2FzZSkuIEZvciBleGFtcGxlLCB0b1xuIgorImRpc2FibGUgY29sb3JlZCB0ZXh0IG91dHB1dCwgeW91IGNhbiBlaXRoZXIgc3BlY2lmeSBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8KKyAgICAiY29sb3I9bm9ARCBvciBzZXRcbiIKKyJ0aGUgQEciIEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiQ09MT1JARCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBAR25vQEQuXG4iCisiXG4iCisiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkIHRoZSAiIEdURVNUX05BTUVfICIgZG9jdW1lbnRhdGlvbiBhdFxuIgorIkBHIiBHVEVTVF9QUk9KRUNUX1VSTF8gIkBELiBJZiB5b3UgZmluZCBhIGJ1ZyBpbiAiIEdURVNUX05BTUVfICJcbiIKKyIobm90IG9uZSBpbiB5b3VyIG93biBjb2RlIG9yIHRlc3RzKSwgcGxlYXNlIHJlcG9ydCBpdCB0b1xuIgorIkBHPCIgR1RFU1RfREVWX0VNQUlMXyAiPkBELlxuIjsKKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuICBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlCisvLyBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3ZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgeworICBmb3IgKGludCBpID0gMTsgaSA8ICphcmdjOyBpKyspIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGFyZyA9IGFyZ19zdHJpbmcuY19zdHIoKTsKKworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUJvb2xGbGFnOworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUludDMyRmxhZzsKKyAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VTdHJpbmdGbGFnOworCisgICAgLy8gRG8gd2Ugc2VlIGEgR29vZ2xlIFRlc3QgZmxhZz8KKyAgICBpZiAoUGFyc2VCb29sRmxhZyhhcmcsIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0JyZWFrT25GYWlsdXJlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtDYXRjaEV4Y2VwdGlvbnNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrQ29sb3JGbGFnLCAmR1RFU1RfRkxBRyhjb2xvcikpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtEZWF0aFRlc3RTdHlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtEZWF0aFRlc3RVc2VGb3JrLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRmlsdGVyRmxhZywgJkdURVNUX0ZMQUcoZmlsdGVyKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtMaXN0VGVzdHNGbGFnLCAmR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga091dHB1dEZsYWcsICZHVEVTVF9GTEFHKG91dHB1dCkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrUHJpbnRUaW1lRmxhZywgJkdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JhbmRvbVNlZWRGbGFnLCAmR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JlcGVhdEZsYWcsICZHVEVTVF9GTEFHKHJlcGVhdCkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrU2h1ZmZsZUZsYWcsICZHVEVTVF9GTEFHKHNodWZmbGUpKSB8fAorICAgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtTdGFja1RyYWNlRGVwdGhGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtTdHJlYW1SZXN1bHRUb0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtUaHJvd09uRmFpbHVyZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpCisgICAgICAgICkgeworICAgICAgLy8gWWVzLiAgU2hpZnQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndiBsaXN0IGxlZnQgYnkgb25lLiAgTm90ZQorICAgICAgLy8gdGhhdCBhcmd2IGhhcyAoKmFyZ2MgKyAxKSBlbGVtZW50cywgdGhlIGxhc3Qgb25lIGFsd2F5cyBiZWluZworICAgICAgLy8gTlVMTC4gIFRoZSBmb2xsb3dpbmcgbG9vcCBtb3ZlcyB0aGUgdHJhaWxpbmcgTlVMTCBlbGVtZW50IGFzCisgICAgICAvLyB3ZWxsLgorICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2M7IGorKykgeworICAgICAgICBhcmd2W2pdID0gYXJndltqICsgMV07CisgICAgICB9CisKKyAgICAgIC8vIERlY3JlbWVudHMgdGhlIGFyZ3VtZW50IGNvdW50LgorICAgICAgKCphcmdjKS0tOworCisgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gZGVjcmVtZW50IHRoZSBpdGVyYXRvciBhcyB3ZSBqdXN0IHJlbW92ZWQKKyAgICAgIC8vIGFuIGVsZW1lbnQuCisgICAgICBpLS07CisgICAgfSBlbHNlIGlmIChhcmdfc3RyaW5nID09ICItLWhlbHAiIHx8IGFyZ19zdHJpbmcgPT0gIi1oIiB8fAorICAgICAgICAgICAgICAgYXJnX3N0cmluZyA9PSAiLT8iIHx8IGFyZ19zdHJpbmcgPT0gIi8/IiB8fAorICAgICAgICAgICAgICAgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoYXJnKSkgeworICAgICAgLy8gQm90aCBoZWxwIGZsYWcgYW5kIHVucmVjb2duaXplZCBHb29nbGUgVGVzdCBmbGFncyAoZXhjbHVkaW5nCisgICAgICAvLyBpbnRlcm5hbCBvbmVzKSB0cmlnZ2VyIGhlbHAgZGlzcGxheS4KKyAgICAgIGdfaGVscF9mbGFnID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoZ19oZWxwX2ZsYWcpIHsKKyAgICAvLyBXZSBwcmludCB0aGUgaGVscCBoZXJlIGluc3RlYWQgb2YgaW4gUlVOX0FMTF9URVNUUygpLCBhcyB0aGUKKyAgICAvLyBsYXR0ZXIgbWF5IG5vdCBiZSBjYWxsZWQgYXQgYWxsIGlmIHRoZSB1c2VyIGlzIHVzaW5nIEdvb2dsZQorICAgIC8vIFRlc3Qgd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrLgorICAgIFByaW50Q29sb3JFbmNvZGVkKGtDb2xvckVuY29kZWRIZWxwTWVzc2FnZSk7CisgIH0KK30KKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuCit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9Cit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBJbml0R29vZ2xlVGVzdCgpLgorLy8KKy8vIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yCisvLyB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBJbml0R29vZ2xlVGVzdEltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKKyAgZ19pbml0X2d0ZXN0X2NvdW50Kys7CisKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUgdHdpY2UuCisgIGlmIChnX2luaXRfZ3Rlc3RfY291bnQgIT0gMSkgcmV0dXJuOworCisgIGlmICgqYXJnYyA8PSAwKSByZXR1cm47CisKKyAgaW50ZXJuYWw6OmdfZXhlY3V0YWJsZV9wYXRoID0gaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhhcmd2WzBdKTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgZ19hcmd2cy5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSAhPSAqYXJnYzsgaSsrKSB7CisgICAgZ19hcmd2cy5wdXNoX2JhY2soU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pKTsKKyAgfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGFyZ2MsIGFyZ3YpOworICBHZXRVbml0VGVzdEltcGwoKS0+UG9zdEZsYWdQYXJzaW5nSW5pdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCisvLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQorLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCisvLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgorLy8KKy8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQorLy8gdXBkYXRlZC4KKy8vCisvLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0Lgordm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KKy8vIFVOSUNPREUgbW9kZS4KK3ZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgeworICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC9zcmMvZ3Rlc3RfbWFpbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0X21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwMjgyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvc3JjL2d0ZXN0X21haW4uY2MKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK0dURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHByaW50ZigiUnVubmluZyBtYWluKCkgZnJvbSBndGVzdF9tYWluLmNjXG4iKTsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwYTEzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTAsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUZXN0cyB0aGF0IHZlcmlmeSBpbnRlcmFjdGlvbiBvZiBleGNlcHRpb25zIGFuZCBkZWF0aCB0ZXN0cy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9IQVNfU0VICisjICBpbmNsdWRlIDx3aW5kb3dzLmg+ICAgICAgICAgIC8vIEZvciBSYWlzZUV4Y2VwdGlvbigpLgorIyBlbmRpZgorCisjIGluY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisjIGlmIEdURVNUX0hBU19FWENFUFRJT05TCisKKyMgIGluY2x1ZGUgPGV4Y2VwdGlvbj4gIC8vIEZvciBzdGQ6OmV4Y2VwdGlvbi4KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyByZXBvcnQgdGhyb3duIGV4Y2VwdGlvbnMgYXMgZmFpbHVyZXMgYW5kIHRoYXQgdGhlCisvLyBleGNlcHRpb25zIGRvIG5vdCBlc2NhcGUgZGVhdGggdGVzdCBtYWNyb3MuCitURVNUKEN4eEV4Y2VwdGlvbkRlYXRoVGVzdCwgRXhjZXB0aW9uSXNGYWlsdXJlKSB7CisgIHRyeSB7CisgICAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKHRocm93IDEsICIiKSwgInRocmV3IGFuIGV4Y2VwdGlvbiIpOworICB9IGNhdGNoICguLi4pIHsgIC8vIE5PTElOVAorICAgIEZBSUwoKSA8PCAiQW4gZXhjZXB0aW9uIGVzY2FwZWQgYSBkZWF0aCB0ZXN0IG1hY3JvIGludm9jYXRpb24gIgorICAgICAgICAgICA8PCAid2l0aCBjYXRjaF9leGNlcHRpb25zICIKKyAgICAgICAgICAgPDwgKHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgfQorfQorCitjbGFzcyBUZXN0RXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeyByZXR1cm4gImV4Y2VwdGlvbmFsIG1lc3NhZ2UiOyB9Cit9OworCitURVNUKEN4eEV4Y2VwdGlvbkRlYXRoVGVzdCwgUHJpbnRzTWVzc2FnZUZvclN0ZEV4Y2VwdGlvbnMpIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgaXMgcXVvdGVkIGluIHRoZSBmYWlsdXJlIHRleHQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSCh0aHJvdyBUZXN0RXhjZXB0aW9uKCksICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbmFsIG1lc3NhZ2UiKTsKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgbG9jYXRpb24gaXMgbWVudGlvbmVkIGluIHRoZSBmYWlsdXJlIHRleHQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSCh0aHJvdyBUZXN0RXhjZXB0aW9uKCksICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImd0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYyIpOworfQorIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworIyBpZiBHVEVTVF9IQVNfU0VICisvLyBUZXN0cyB0aGF0IGVuYWJsaW5nIGludGVyY2VwdGlvbiBvZiBTRUggZXhjZXB0aW9ucyB3aXRoIHRoZQorLy8gY2F0Y2hfZXhjZXB0aW9ucyBmbGFnIGRvZXMgbm90IGludGVyZmVyZSB3aXRoIFNFSCBleGNlcHRpb25zIGJlaW5nCisvLyB0cmVhdGVkIGFzIGRlYXRoIGJ5IGRlYXRoIHRlc3RzLgorVEVTVChTZWhFeGNlcHRpb25EZWFzVGVzdCwgQ2F0Y2hFeGNlcHRpb25zRG9lc05vdEludGVyZmVyZSkgeworICBFWFBFQ1RfREVBVEgoUmFpc2VFeGNlcHRpb24oNDIsIDB4MCwgMCwgTlVMTCksICIiKQorICAgICAgPDwgIndpdGggY2F0Y2hfZXhjZXB0aW9ucyAiCisgICAgICA8PCAodGVzdGluZzo6R1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworfQorIyBlbmRpZgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBHVEVTVF9FTkFCTEVfQ0FUQ0hfRVhDRVBUSU9OU18gIT0gMDsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDI2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjCkBAIC0wLDAgKzEsMTM2NyBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgZGVhdGggdGVzdHMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIgorCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+ICAgICAgICAgIC8vIEZvciBjaGRpcigpLgorIyBlbHNlCisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgIGluY2x1ZGUgPHN5cy93YWl0Lmg+ICAgICAgICAvLyBGb3Igd2FpdHBpZC4KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGluY2x1ZGUgPHN0ZGlvLmg+CisKKyMgaWYgR1RFU1RfT1NfTElOVVgKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjIGluY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorIyBkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyMgaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorIyB1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHBvc2l4ID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg7CisKK3VzaW5nIHRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdEZhY3Rvcnk7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RmlsZVBhdGg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0TGFzdEVycm5vRGVzY3JpcHRpb247Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkluRGVhdGhUZXN0Q2hpbGQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UGFyc2VOYXR1cmFsTnVtYmVyOworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIGhlbHBlciBjbGFzcyB3aG9zZSBvYmplY3RzIHJlcGxhY2UgdGhlIGRlYXRoIHRlc3QgZmFjdG9yeSBmb3IgYQorLy8gc2luZ2xlIFVuaXRUZXN0IG9iamVjdCBkdXJpbmcgdGhlaXIgbGlmZXRpbWVzLgorY2xhc3MgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkoRGVhdGhUZXN0RmFjdG9yeSogbmV3X2ZhY3RvcnkpCisgICAgICA6IHVuaXRfdGVzdF9pbXBsXyhHZXRVbml0VGVzdEltcGwoKSkgeworICAgIG9sZF9mYWN0b3J5XyA9IHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZWxlYXNlKCk7CisgICAgdW5pdF90ZXN0X2ltcGxfLT5kZWF0aF90ZXN0X2ZhY3RvcnlfLnJlc2V0KG5ld19mYWN0b3J5KTsKKyAgfQorCisgIH5SZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSgpIHsKKyAgICB1bml0X3Rlc3RfaW1wbF8tPmRlYXRoX3Rlc3RfZmFjdG9yeV8ucmVsZWFzZSgpOworICAgIHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZXNldChvbGRfZmFjdG9yeV8pOworICB9CisgcHJpdmF0ZToKKyAgLy8gUHJldmVudHMgY29weWluZyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSBvYmplY3RzLgorICBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeShjb25zdCBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSYpOworCisgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0X2ltcGxfOworICBEZWF0aFRlc3RGYWN0b3J5KiBvbGRfZmFjdG9yeV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3ZvaWQgRGllV2l0aE1lc3NhZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZGVycik7ICAvLyBNYWtlIHN1cmUgdGhlIHRleHQgaXMgcHJpbnRlZCBiZWZvcmUgdGhlIHByb2Nlc3MgZXhpdHMuCisKKyAgLy8gV2UgY2FsbCBfZXhpdCgpIGluc3RlYWQgb2YgZXhpdCgpLCBhcyB0aGUgZm9ybWVyIGlzIGEgZGlyZWN0CisgIC8vIHN5c3RlbSBjYWxsIGFuZCB0aHVzIHNhZmVyIGluIHRoZSBwcmVzZW5jZSBvZiB0aHJlYWRzLiAgZXhpdCgpCisgIC8vIHdpbGwgaW52b2tlIHVzZXItZGVmaW5lZCBleGl0LWhvb2tzLCB3aGljaCBtYXkgZG8gZGFuZ2Vyb3VzCisgIC8vIHRoaW5ncyB0aGF0IGNvbmZsaWN0IHdpdGggZGVhdGggdGVzdHMuCisgIC8vCisgIC8vIFNvbWUgY29tcGlsZXJzIGNhbiByZWNvZ25pemUgdGhhdCBfZXhpdCgpIG5ldmVyIHJldHVybnMgYW5kIGlzc3VlIHRoZQorICAvLyAndW5yZWFjaGFibGUgY29kZScgd2FybmluZyBmb3IgY29kZSBmb2xsb3dpbmcgdGhpcyBmdW5jdGlvbiwgdW5sZXNzCisgIC8vIGZvb2xlZCBieSBhIGZha2UgY29uZGl0aW9uLgorICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIF9leGl0KDEpOworfQorCit2b2lkIERpZUluc2lkZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBmdW5jdGlvbikgeworICBEaWVXaXRoTWVzc2FnZSgiZGVhdGggaW5zaWRlICIgKyBmdW5jdGlvbiArICIoKS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyB3b3JrLgorCitjbGFzcyBUZXN0Rm9yRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgVGVzdEZvckRlYXRoVGVzdCgpIDogb3JpZ2luYWxfZGlyXyhGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpKSB7fQorCisgIHZpcnR1YWwgflRlc3RGb3JEZWF0aFRlc3QoKSB7CisgICAgcG9zaXg6OkNoRGlyKG9yaWdpbmFsX2Rpcl8uY19zdHIoKSk7CisgIH0KKworICAvLyBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gdGhhdCdzIGV4cGVjdGVkIHRvIGRpZS4KKyAgc3RhdGljIHZvaWQgU3RhdGljTWVtYmVyRnVuY3Rpb24oKSB7IERpZUluc2lkZSgiU3RhdGljTWVtYmVyRnVuY3Rpb24iKTsgfQorCisgIC8vIEEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgdGhhdCBtYXkgZGllLgorICB2b2lkIE1lbWJlckZ1bmN0aW9uKCkgeworICAgIGlmIChzaG91bGRfZGllXykKKyAgICAgIERpZUluc2lkZSgiTWVtYmVyRnVuY3Rpb24iKTsKKyAgfQorCisgIC8vIFRydWUgaWZmIE1lbWJlckZ1bmN0aW9uKCkgc2hvdWxkIGRpZS4KKyAgYm9vbCBzaG91bGRfZGllXzsKKyAgY29uc3QgRmlsZVBhdGggb3JpZ2luYWxfZGlyXzsKK307CisKKy8vIEEgY2xhc3Mgd2l0aCBhIG1lbWJlciBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCitjbGFzcyBNYXlEaWUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWF5RGllKGJvb2wgc2hvdWxkX2RpZSkgOiBzaG91bGRfZGllXyhzaG91bGRfZGllKSB7fQorCisgIC8vIEEgbWVtYmVyIGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KKyAgdm9pZCBNZW1iZXJGdW5jdGlvbigpIGNvbnN0IHsKKyAgICBpZiAoc2hvdWxkX2RpZV8pCisgICAgICBEaWVJbnNpZGUoIk1heURpZTo6TWVtYmVyRnVuY3Rpb24iKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVHJ1ZSBpZmYgTWVtYmVyRnVuY3Rpb24oKSBzaG91bGQgZGllLgorICBib29sIHNob3VsZF9kaWVfOworfTsKKworLy8gQSBnbG9iYWwgZnVuY3Rpb24gdGhhdCdzIGV4cGVjdGVkIHRvIGRpZS4KK3ZvaWQgR2xvYmFsRnVuY3Rpb24oKSB7IERpZUluc2lkZSgiR2xvYmFsRnVuY3Rpb24iKTsgfQorCisvLyBBIG5vbi12b2lkIGZ1bmN0aW9uIHRoYXQncyBleHBlY3RlZCB0byBkaWUuCitpbnQgTm9uVm9pZEZ1bmN0aW9uKCkgeworICBEaWVJbnNpZGUoIk5vblZvaWRGdW5jdGlvbiIpOworICByZXR1cm4gMTsKK30KKworLy8gQSB1bmFyeSBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCit2b2lkIERpZUlmKGJvb2wgc2hvdWxkX2RpZSkgeworICBpZiAoc2hvdWxkX2RpZSkKKyAgICBEaWVJbnNpZGUoIkRpZUlmIik7Cit9CisKKy8vIEEgYmluYXJ5IGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KK2Jvb2wgRGllSWZMZXNzVGhhbihpbnQgeCwgaW50IHkpIHsKKyAgaWYgKHggPCB5KSB7CisgICAgRGllSW5zaWRlKCJEaWVJZkxlc3NUaGFuIik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIIGNhbiBiZSB1c2VkIG91dHNpZGUgYSBURVNULCBURVNUX0YsIG9yIHRlc3QgZml4dHVyZS4KK3ZvaWQgRGVhdGhUZXN0U3Vicm91dGluZSgpIHsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJkZWF0aC4qR2xvYmFsRnVuY3Rpb24iKTsKKyAgQVNTRVJUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJkZWF0aC4qR2xvYmFsRnVuY3Rpb24iKTsKK30KKworLy8gRGVhdGggaW4gZGJnLCBub3Qgb3B0LgoraW50IERpZUluRGVidWdFbHNlMTIoaW50KiBzaWRlZWZmZWN0KSB7CisgIGlmIChzaWRlZWZmZWN0KSAqc2lkZWVmZmVjdCA9IDEyOworCisjIGlmbmRlZiBOREVCVUcKKworICBEaWVJbnNpZGUoIkRpZUluRGVidWdFbHNlMTIiKTsKKworIyBlbmRpZiAgLy8gTkRFQlVHCisKKyAgcmV0dXJuIDEyOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhlIEV4aXRlZFdpdGhDb2RlIHByZWRpY2F0ZS4KK1RFU1QoRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QsIEV4aXRlZFdpdGhDb2RlKSB7CisgIC8vIE9uIFdpbmRvd3MsIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlzIHRoZSBzYW1lIGFzIGl0cyBleGl0IHN0YXR1cywKKyAgLy8gc28gdGhlIHByZWRpY2F0ZSBqdXN0IGNvbXBhcmVzIHRoZSBpdHMgaW5wdXQgd2l0aCBpdHMgcGFyYW1ldGVyLgorICBFWFBFQ1RfVFJVRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSgwKSk7CisgIEVYUEVDVF9UUlVFKHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpKDEpKTsKKyAgRVhQRUNUX1RSVUUodGVzdGluZzo6RXhpdGVkV2l0aENvZGUoNDIpKDQyKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSgwKSk7Cit9CisKKyMgZWxzZQorCisvLyBSZXR1cm5zIHRoZSBleGl0IHN0YXR1cyBvZiBhIHByb2Nlc3MgdGhhdCBjYWxscyBfZXhpdCgyKSB3aXRoIGEKKy8vIGdpdmVuIGV4aXQgY29kZS4gIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZQorLy8gRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QgdGVzdCBzdWl0ZS4KK3N0YXRpYyBpbnQgTm9ybWFsRXhpdFN0YXR1cyhpbnQgZXhpdF9jb2RlKSB7CisgIHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgX2V4aXQoZXhpdF9jb2RlKTsKKyAgfQorICBpbnQgc3RhdHVzOworICB3YWl0cGlkKGNoaWxkX3BpZCwgJnN0YXR1cywgMCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIFJldHVybnMgdGhlIGV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyB0aGF0IHJhaXNlcyBhIGdpdmVuIHNpZ25hbC4KKy8vIElmIHRoZSBzaWduYWwgZG9lcyBub3QgY2F1c2UgdGhlIHByb2Nlc3MgdG8gZGllLCB0aGVuIGl0IHJldHVybnMKKy8vIGluc3RlYWQgdGhlIGV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyB0aGF0IGV4aXRzIG5vcm1hbGx5IHdpdGggZXhpdAorLy8gY29kZSAxLiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0CisvLyB0ZXN0IHN1aXRlLgorc3RhdGljIGludCBLaWxsZWRFeGl0U3RhdHVzKGludCBzaWdudW0pIHsKKyAgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOworICBpZiAoY2hpbGRfcGlkID09IDApIHsKKyAgICByYWlzZShzaWdudW0pOworICAgIF9leGl0KDEpOworICB9CisgIGludCBzdGF0dXM7CisgIHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gVGVzdHMgdGhlIEV4aXRlZFdpdGhDb2RlIHByZWRpY2F0ZS4KK1RFU1QoRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QsIEV4aXRlZFdpdGhDb2RlKSB7CisgIGNvbnN0IGludCBzdGF0dXMwICA9IE5vcm1hbEV4aXRTdGF0dXMoMCk7CisgIGNvbnN0IGludCBzdGF0dXMxICA9IE5vcm1hbEV4aXRTdGF0dXMoMSk7CisgIGNvbnN0IGludCBzdGF0dXM0MiA9IE5vcm1hbEV4aXRTdGF0dXMoNDIpOworICBjb25zdCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSBwcmVkMCgwKTsKKyAgY29uc3QgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUgcHJlZDEoMSk7CisgIGNvbnN0IHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlIHByZWQ0Mig0Mik7CisgIEVYUEVDVF9QUkVEMShwcmVkMCwgIHN0YXR1czApOworICBFWFBFQ1RfUFJFRDEocHJlZDEsICBzdGF0dXMxKTsKKyAgRVhQRUNUX1BSRUQxKHByZWQ0Miwgc3RhdHVzNDIpOworICBFWFBFQ1RfRkFMU0UocHJlZDAoc3RhdHVzMSkpOworICBFWFBFQ1RfRkFMU0UocHJlZDQyKHN0YXR1czApKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWQxKHN0YXR1czQyKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBLaWxsZWRCeVNpZ25hbCBwcmVkaWNhdGUuCitURVNUKEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0LCBLaWxsZWRCeVNpZ25hbCkgeworICBjb25zdCBpbnQgc3RhdHVzX3NlZ3YgPSBLaWxsZWRFeGl0U3RhdHVzKFNJR1NFR1YpOworICBjb25zdCBpbnQgc3RhdHVzX2tpbGwgPSBLaWxsZWRFeGl0U3RhdHVzKFNJR0tJTEwpOworICBjb25zdCB0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbCBwcmVkX3NlZ3YoU0lHU0VHVik7CisgIGNvbnN0IHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsIHByZWRfa2lsbChTSUdLSUxMKTsKKyAgRVhQRUNUX1BSRUQxKHByZWRfc2Vndiwgc3RhdHVzX3NlZ3YpOworICBFWFBFQ1RfUFJFRDEocHJlZF9raWxsLCBzdGF0dXNfa2lsbCk7CisgIEVYUEVDVF9GQUxTRShwcmVkX3NlZ3Yoc3RhdHVzX2tpbGwpKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWRfa2lsbChzdGF0dXNfc2VndikpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIHRoYXQgdGhlIGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIG1heSBvciBtYXkgbm90CisvLyBiZSBmb2xsb3dlZCBieSBvcGVyYXRvcjw8LCBhbmQgdGhhdCBpbiBlaXRoZXIgY2FzZSB0aGUgY29tcGxldGUgdGV4dAorLy8gY29tcHJpc2VzIG9ubHkgYSBzaW5nbGUgQysrIHN0YXRlbWVudC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgLy8gVGhpcyB3b3VsZCBmYWlsIGlmIGV4ZWN1dGVkOyB0aGlzIGlzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5CisgICAgQVNTRVJUX0RFQVRIKHJldHVybiwgIiIpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7CisgIGVsc2UKKyAgICAvLyBUaGlzIGVtcHR5ICJlbHNlIiBicmFuY2ggaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgRVhQRUNUX0RFQVRICisgICAgLy8gZG9lc24ndCBleHBhbmQgaW50byBhbiAiaWYiIHN0YXRlbWVudCB3aXRob3V0IGFuICJlbHNlIgorICAgIDsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfREVBVEgocmV0dXJuLCAiIikgPDwgImRpZCBub3QgZGllIjsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7CisgIGVsc2UKKyAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAxIDw8IDIgPDwgMzsKK30KKwordm9pZCBEaWVXaXRoRW1iZWRkZWROdWwoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiSGVsbG8lY215IG51bGwgd29ybGQuXG4iLCAnXDAnKTsKKyAgZmZsdXNoKHN0ZGVycik7CisgIF9leGl0KDEpOworfQorCisjIGlmIEdURVNUX1VTRVNfUENSRQorLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCB3b3JrIHdoZW4gdGhlIGVycm9yCisvLyBtZXNzYWdlIGhhcyBhIE5VTCBjaGFyYWN0ZXIgaW4gaXQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRW1iZWRkZWROdWxJbk1lc3NhZ2UpIHsKKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IDxyZWdleC5oPiBkb2Vzbid0IHN1cHBvcnQgbWF0Y2hpbmcgc3RyaW5ncworICAvLyB3aXRoIGVtYmVkZGVkIE5VTCBjaGFyYWN0ZXJzIC0gZmluZCBhIHdheSB0byB3b3JrYXJvdW5kIGl0LgorICBFWFBFQ1RfREVBVEgoRGllV2l0aEVtYmVkZGVkTnVsKCksICJteSBudWxsIHdvcmxkIik7CisgIEFTU0VSVF9ERUFUSChEaWVXaXRoRW1iZWRkZWROdWwoKSwgIm15IG51bGwgd29ybGQiKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX1VTRVNfUENSRQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIGludGVyYWN0cyB3ZWxsIHdpdGggc3dpdGNoCisvLyBzdGF0ZW1lbnRzLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN3aXRjaFN0YXRlbWVudCkgeworLy8gTWljcm9zb2Z0IGNvbXBpbGVyIHVzdWFsbHkgY29tcGxhaW5zIGFib3V0IHN3aXRjaCBzdGF0ZW1lbnRzIHdpdGhvdXQKKy8vIGNhc2UgbGFiZWxzLiBXZSBzdXBwcmVzcyB0aGF0IHdhcm5pbmcgZm9yIHRoaXMgdGVzdC4KKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDY1KQorIyBlbmRpZiAgLy8gX01TQ19WRVIKKworICBzd2l0Y2ggKDApCisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJleGl0IGluIGRlZmF1bHQgc3dpdGNoIGhhbmRsZXIiOworCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAiZXhpdCBpbiBzd2l0Y2ggY2FzZSI7CisKKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIFRlc3RzIHRoYXQgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgImZhc3QiIHN0eWxlCisvLyBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN0YXRpY01lbWJlckZ1bmN0aW9uRmFzdFN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEFTU0VSVF9ERUFUSChTdGF0aWNNZW1iZXJGdW5jdGlvbigpLCAiZGVhdGguKlN0YXRpY01lbWJlciIpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2FuIGJlIHVzZWQgaW4gYSAiZmFzdCIKKy8vIHN0eWxlIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWVtYmVyRnVuY3Rpb25GYXN0U3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgc2hvdWxkX2RpZV8gPSB0cnVlOworICBFWFBFQ1RfREVBVEgoTWVtYmVyRnVuY3Rpb24oKSwgImluc2lkZS4qTWVtYmVyRnVuY3Rpb24iKTsKK30KKwordm9pZCBDaGFuZ2VUb1Jvb3REaXIoKSB7IHBvc2l4OjpDaERpcihHVEVTVF9QQVRIX1NFUF8pOyB9CisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgd29yayBldmVuIGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBoYXMgYmVlbgorLy8gY2hhbmdlZC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBGYXN0RGVhdGhUZXN0SW5DaGFuZ2VkRGlyKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisKKyAgQ2hhbmdlVG9Sb290RGlyKCk7CisgIEVYUEVDVF9FWElUKF9leGl0KDEpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSwgIiIpOworCisgIENoYW5nZVRvUm9vdERpcigpOworICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKTsKK30KKworIyBpZiBHVEVTVF9PU19MSU5VWAordm9pZCBTaWdwcm9mQWN0aW9uKGludCwgc2lnaW5mb190Kiwgdm9pZCopIHsgLyogbm8gb3AgKi8gfQorCisvLyBTZXRzIFNJR1BST0YgYWN0aW9uIGFuZCBJVElNRVJfUFJPRiB0aW1lciAoaW50ZXJ2YWw6IDFtcykuCit2b2lkIFNldFNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigpIHsKKyAgc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKKyAgdGltZXIuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKyAgdGltZXIuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDE7CisgIHRpbWVyLml0X3ZhbHVlID0gdGltZXIuaXRfaW50ZXJ2YWw7CisgIEFTU0VSVF9FUSgwLCBzZXRpdGltZXIoSVRJTUVSX1BST0YsICZ0aW1lciwgTlVMTCkpOworICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ25hbF9hY3Rpb247CisgIG1lbXNldCgmc2lnbmFsX2FjdGlvbiwgMCwgc2l6ZW9mKHNpZ25hbF9hY3Rpb24pKTsKKyAgc2lnZW1wdHlzZXQoJnNpZ25hbF9hY3Rpb24uc2FfbWFzayk7CisgIHNpZ25hbF9hY3Rpb24uc2Ffc2lnYWN0aW9uID0gU2lncHJvZkFjdGlvbjsKKyAgc2lnbmFsX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU1RBUlQgfCBTQV9TSUdJTkZPOworICBBU1NFUlRfRVEoMCwgc2lnYWN0aW9uKFNJR1BST0YsICZzaWduYWxfYWN0aW9uLCBOVUxMKSk7Cit9CisKKy8vIERpc2FibGVzIElUSU1FUl9QUk9GIHRpbWVyIGFuZCBpZ25vcmVzIFNJR1BST0Ygc2lnbmFsLgordm9pZCBEaXNhYmxlU2lncHJvZkFjdGlvbkFuZFRpbWVyKHN0cnVjdCBzaWdhY3Rpb24qIG9sZF9zaWduYWxfYWN0aW9uKSB7CisgIHN0cnVjdCBpdGltZXJ2YWwgdGltZXI7CisgIHRpbWVyLml0X2ludGVydmFsLnR2X3NlYyA9IDA7CisgIHRpbWVyLml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworICB0aW1lci5pdF92YWx1ZSA9IHRpbWVyLml0X2ludGVydmFsOworICBBU1NFUlRfRVEoMCwgc2V0aXRpbWVyKElUSU1FUl9QUk9GLCAmdGltZXIsIE5VTEwpKTsKKyAgc3RydWN0IHNpZ2FjdGlvbiBzaWduYWxfYWN0aW9uOworICBtZW1zZXQoJnNpZ25hbF9hY3Rpb24sIDAsIHNpemVvZihzaWduYWxfYWN0aW9uKSk7CisgIHNpZ2VtcHR5c2V0KCZzaWduYWxfYWN0aW9uLnNhX21hc2spOworICBzaWduYWxfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworICBBU1NFUlRfRVEoMCwgc2lnYWN0aW9uKFNJR1BST0YsICZzaWduYWxfYWN0aW9uLCBvbGRfc2lnbmFsX2FjdGlvbikpOworfQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHdvcmsgd2hlbiBTSUdQUk9GIGhhbmRsZXIgYW5kIHRpbWVyIGFyZSBzZXQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRmFzdFNpZ3Byb2ZBY3Rpb25TZXQpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgU2V0U2lncHJvZkFjdGlvbkFuZFRpbWVyKCk7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZF9zaWduYWxfYWN0aW9uOworICBEaXNhYmxlU2lncHJvZkFjdGlvbkFuZFRpbWVyKCZvbGRfc2lnbmFsX2FjdGlvbik7CisgIEVYUEVDVF9UUlVFKG9sZF9zaWduYWxfYWN0aW9uLnNhX3NpZ2FjdGlvbiA9PSBTaWdwcm9mQWN0aW9uKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFRocmVhZFNhZmVTaWdwcm9mQWN0aW9uU2V0KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIFNldFNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigpOworICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKKyAgc3RydWN0IHNpZ2FjdGlvbiBvbGRfc2lnbmFsX2FjdGlvbjsKKyAgRGlzYWJsZVNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigmb2xkX3NpZ25hbF9hY3Rpb24pOworICBFWFBFQ1RfVFJVRShvbGRfc2lnbmFsX2FjdGlvbi5zYV9zaWdhY3Rpb24gPT0gU2lncHJvZkFjdGlvbik7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisvLyBSZXBlYXRzIGEgcmVwcmVzZW50YXRpdmUgc2FtcGxlIG9mIGRlYXRoIHRlc3RzIGluIHRoZSAidGhyZWFkc2FmZSIgc3R5bGU6CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTdGF0aWNNZW1iZXJGdW5jdGlvblRocmVhZHNhZmVTdHlsZSkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworICBBU1NFUlRfREVBVEgoU3RhdGljTWVtYmVyRnVuY3Rpb24oKSwgImRlYXRoLipTdGF0aWNNZW1iZXIiKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE1lbWJlckZ1bmN0aW9uVGhyZWFkc2FmZVN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIHNob3VsZF9kaWVfID0gdHJ1ZTsKKyAgRVhQRUNUX0RFQVRIKE1lbWJlckZ1bmN0aW9uKCksICJpbnNpZGUuKk1lbWJlckZ1bmN0aW9uIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUaHJlYWRzYWZlRGVhdGhUZXN0SW5Mb29wKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpCisgICAgRVhQRUNUX0VYSVQoX2V4aXQoaSksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKGkpLCAiIikgPDwgIjogaSA9ICIgPDwgaTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFRocmVhZHNhZmVEZWF0aFRlc3RJbkNoYW5nZWREaXIpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKworICBDaGFuZ2VUb1Jvb3REaXIoKTsKKyAgRVhQRUNUX0VYSVQoX2V4aXQoMSksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpLCAiIik7CisKKyAgQ2hhbmdlVG9Sb290RGlyKCk7CisgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWl4ZWRTdHlsZXMpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworfQorCisjIGlmIEdURVNUX0hBU19DTE9ORSAmJiBHVEVTVF9IQVNfUFRIUkVBRAorCituYW1lc3BhY2UgeworCitib29sIHB0aHJlYWRfZmxhZzsKKwordm9pZCBTZXRQdGhyZWFkRmxhZygpIHsKKyAgcHRocmVhZF9mbGFnID0gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEb2VzTm90RXhlY3V0ZUF0Zm9ya0hvb2tzKSB7CisgIGlmICghdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSkgeworICAgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgICAgcHRocmVhZF9mbGFnID0gZmFsc2U7CisgICAgQVNTRVJUX0VRKDAsIHB0aHJlYWRfYXRmb3JrKCZTZXRQdGhyZWFkRmxhZywgTlVMTCwgTlVMTCkpOworICAgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICAgIEFTU0VSVF9GQUxTRShwdGhyZWFkX2ZsYWcpOworICB9Cit9CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DTE9ORSAmJiBHVEVTVF9IQVNfUFRIUkVBRAorCisvLyBUZXN0cyB0aGF0IGEgbWV0aG9kIG9mIGFub3RoZXIgY2xhc3MgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE1ldGhvZE9mQW5vdGhlckNsYXNzKSB7CisgIGNvbnN0IE1heURpZSB4KHRydWUpOworICBBU1NFUlRfREVBVEgoeC5NZW1iZXJGdW5jdGlvbigpLCAiTWF5RGllXFw6XFw6TWVtYmVyRnVuY3Rpb24iKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGdsb2JhbCBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgR2xvYmFsRnVuY3Rpb24pIHsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJHbG9iYWxGdW5jdGlvbiIpOworfQorCisvLyBUZXN0cyB0aGF0IGFueSB2YWx1ZSBjb252ZXJ0aWJsZSB0byBhbiBSRSB3b3JrcyBhcyBhIHNlY29uZAorLy8gYXJndW1lbnQgdG8gRVhQRUNUX0RFQVRILgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFjY2VwdHNBbnl0aGluZ0NvbnZlcnRpYmxlVG9SRSkgeworICBzdGF0aWMgY29uc3QgY2hhciByZWdleF9jX3N0cltdID0gIkdsb2JhbEZ1bmN0aW9uIjsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksIHJlZ2V4X2Nfc3RyKTsKKworICBjb25zdCB0ZXN0aW5nOjppbnRlcm5hbDo6UkUgcmVnZXgocmVnZXhfY19zdHIpOworICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgcmVnZXgpOworCisjIGlmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgY29uc3Qgc3RyaW5nIHJlZ2V4X3N0cihyZWdleF9jX3N0cik7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleF9zdHIpOworCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgcmVnZXhfc3RkX3N0cihyZWdleF9jX3N0cik7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleF9zdGRfc3RyKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIG5vbi12b2lkIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgZGVhdGggdGVzdC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBOb25Wb2lkRnVuY3Rpb24pIHsKKyAgQVNTRVJUX0RFQVRIKE5vblZvaWRGdW5jdGlvbigpLCAiTm9uVm9pZEZ1bmN0aW9uIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgZnVuY3Rpb25zIHRoYXQgdGFrZSBwYXJhbWV0ZXIocykgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEZ1bmN0aW9uV2l0aFBhcmFtZXRlcikgeworICBFWFBFQ1RfREVBVEgoRGllSWYodHJ1ZSksICJEaWVJZlxcKFxcKSIpOworICBFWFBFQ1RfREVBVEgoRGllSWZMZXNzVGhhbigyLCAzKSwgIkRpZUlmTGVzc1RoYW4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVBVEggY2FuIGJlIHVzZWQgb3V0c2lkZSBhIFRFU1QsIFRFU1RfRiwgb3IgdGVzdCBmaXh0dXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE91dHNpZGVGaXh0dXJlKSB7CisgIERlYXRoVGVzdFN1YnJvdXRpbmUoKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyBjYW4gYmUgZG9uZSBpbnNpZGUgYSBsb29wLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEluc2lkZUxvb3ApIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBFWFBFQ1RfREVBVEgoRGllSWZMZXNzVGhhbigtMSwgaSksICJEaWVJZkxlc3NUaGFuIikgPDwgIndoZXJlIGkgPT0gIiA8PCBpOworICB9Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBjb21wb3VuZCBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIENvbXBvdW5kU3RhdGVtZW50KSB7CisgIEVYUEVDVF9ERUFUSCh7ICAvLyBOT0xJTlQKKyAgICBjb25zdCBpbnQgeCA9IDI7CisgICAgY29uc3QgaW50IHkgPSB4ICsgMTsKKyAgICBEaWVJZkxlc3NUaGFuKHgsIHkpOworICB9LAorICAiRGllSWZMZXNzVGhhbiIpOworfQorCisvLyBUZXN0cyB0aGF0IGNvZGUgdGhhdCBkb2Vzbid0IGRpZSBjYXVzZXMgYSBkZWF0aCB0ZXN0IHRvIGZhaWwuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRG9lc05vdERpZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgoRGllSWYoZmFsc2UpLCAiRGllSWYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBkaWUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGRlYXRoIHRlc3QgZmFpbHMgd2hlbiB0aGUgZXJyb3IgbWVzc2FnZSBpc24ndCBleHBlY3RlZC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFcnJvck1lc3NhZ2VNaXNtYXRjaCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfREVBVEgoRGllSWYodHJ1ZSksICJEaWVJZkxlc3NUaGFuIikgPDwgIkVuZCBvZiBkZWF0aCB0ZXN0IG1lc3NhZ2UuIjsKKyAgfSwgImRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGVycm9yIik7Cit9CisKKy8vIE9uIGV4aXQsICphYm9ydGVkIHdpbGwgYmUgdHJ1ZSBpZmYgdGhlIEVYUEVDVF9ERUFUSCgpIHN0YXRlbWVudAorLy8gYWJvcnRlZCB0aGUgZnVuY3Rpb24uCit2b2lkIEV4cGVjdERlYXRoVGVzdEhlbHBlcihib29sKiBhYm9ydGVkKSB7CisgICphYm9ydGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0RFQVRIKERpZUlmKGZhbHNlKSwgIkRpZUlmIik7ICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbC4KKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEggZG9lc24ndCBhYm9ydCB0aGUgdGVzdCBvbiBmYWlsdXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEVYUEVDVF9ERUFUSCkgeworICBib29sIGFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFeHBlY3REZWF0aFRlc3RIZWxwZXIoJmFib3J0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRpZSIpOworICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIIGRvZXMgYWJvcnQgdGhlIHRlc3Qgb24gZmFpbHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBU1NFUlRfREVBVEgpIHsKKyAgc3RhdGljIGJvb2wgYWJvcnRlZDsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgYWJvcnRlZCA9IHRydWU7CisgICAgQVNTRVJUX0RFQVRIKERpZUlmKGZhbHNlKSwgIkRpZUlmIik7ICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbC4KKyAgICBhYm9ydGVkID0gZmFsc2U7CisgIH0sICJmYWlsZWQgdG8gZGllIik7CisgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSCBldmFsdWF0ZXMgdGhlIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgU2luZ2xlRXZhbHVhdGlvbikgeworICBpbnQgeCA9IDM7CisgIEVYUEVDVF9ERUFUSChEaWVJZigoKyt4KSA9PSA0KSwgIkRpZUlmIik7CisKKyAgY29uc3QgY2hhciogcmVnZXggPSAiRGllSWYiOworICBjb25zdCBjaGFyKiByZWdleF9zYXZlID0gcmVnZXg7CisgIEVYUEVDVF9ERUFUSChEaWVJZkxlc3NUaGFuKDMsIDQpLCByZWdleCsrKTsKKyAgRVhQRUNUX0VRKHJlZ2V4X3NhdmUgKyAxLCByZWdleCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgcnVuLWF3YXkgZGVhdGggdGVzdHMgYXJlIHJlcG9ydGVkIGFzIGZhaWx1cmVzLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFJ1bmF3YXlJc0ZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKHN0YXRpY19jYXN0PHZvaWQ+KDApLCAiRm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGllLiIpOworfQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHJlcG9ydCBleGVjdXRpbmcgJ3JldHVybicgaW4gdGhlIHN0YXRlbWVudCBhcworLy8gZmFpbHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBSZXR1cm5Jc0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0RFQVRIKHJldHVybiwgIkJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQlVHX0RFQVRIIHdvcmtzIGFzIGV4cGVjdGVkLCB0aGF0IGlzLCB5b3UgY2FuIHN0cmVhbSBhCisvLyBtZXNzYWdlIHRvIGl0LCBhbmQgaW4gZGVidWcgbW9kZSBpdDoKKy8vIDEuIEFzc2VydHMgb24gZGVhdGguCisvLyAyLiBIYXMgbm8gc2lkZSBlZmZlY3QuCisvLworLy8gQW5kIGluIG9wdCBtb2RlLCBpdDoKKy8vIDEuICBIYXMgc2lkZSBlZmZlY3RzIGJ1dCBkb2VzIG5vdCBhc3NlcnQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGVzdEV4cGVjdERlYnVnRGVhdGgpIHsKKyAgaW50IHNpZGVlZmZlY3QgPSAwOworCisgIEVYUEVDVF9ERUJVR19ERUFUSChEaWVJbkRlYnVnRWxzZTEyKCZzaWRlZWZmZWN0KSwgImRlYXRoLipEaWVJbkRlYnVnRWxzZTEyIikKKyAgICAgIDw8ICJNdXN0IGFjY2VwdCBhIHN0cmVhbWVkIG1lc3NhZ2UiOworCisjIGlmZGVmIE5ERUJVRworCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9jY3VycyBpbiBvcHQgbW9kZSAoc2lkZWVmZmVjdCkuCisgIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7CisKKyMgZWxzZQorCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IGRvZXMgbm90IG9jY3VyIGluIGRiZyBtb2RlIChubyBzaWRlZWZmZWN0KS4KKyAgRVhQRUNUX0VRKDAsIHNpZGVlZmZlY3QpOworCisjIGVuZGlmCit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQlVHX0RFQVRIIHdvcmtzIGFzIGV4cGVjdGVkLCB0aGF0IGlzLCB5b3UgY2FuIHN0cmVhbSBhCisvLyBtZXNzYWdlIHRvIGl0LCBhbmQgaW4gZGVidWcgbW9kZSBpdDoKKy8vIDEuIEFzc2VydHMgb24gZGVhdGguCisvLyAyLiBIYXMgbm8gc2lkZSBlZmZlY3QuCisvLworLy8gQW5kIGluIG9wdCBtb2RlLCBpdDoKKy8vIDEuICBIYXMgc2lkZSBlZmZlY3RzIGJ1dCBkb2VzIG5vdCBhc3NlcnQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGVzdEFzc2VydERlYnVnRGVhdGgpIHsKKyAgaW50IHNpZGVlZmZlY3QgPSAwOworCisgIEFTU0VSVF9ERUJVR19ERUFUSChEaWVJbkRlYnVnRWxzZTEyKCZzaWRlZWZmZWN0KSwgImRlYXRoLipEaWVJbkRlYnVnRWxzZTEyIikKKyAgICAgIDw8ICJNdXN0IGFjY2VwdCBhIHN0cmVhbWVkIG1lc3NhZ2UiOworCisjIGlmZGVmIE5ERUJVRworCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9jY3VycyBpbiBvcHQgbW9kZSAoc2lkZWVmZmVjdCkuCisgIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7CisKKyMgZWxzZQorCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IGRvZXMgbm90IG9jY3VyIGluIGRiZyBtb2RlIChubyBzaWRlZWZmZWN0KS4KKyAgRVhQRUNUX0VRKDAsIHNpZGVlZmZlY3QpOworCisjIGVuZGlmCit9CisKKyMgaWZuZGVmIE5ERUJVRworCit2b2lkIEV4cGVjdERlYnVnRGVhdGhIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICAqYWJvcnRlZCA9IHRydWU7CisgIEVYUEVDVF9ERUJVR19ERUFUSChyZXR1cm4sICIiKSA8PCAiVGhpcyBpcyBleHBlY3RlZCB0byBmYWlsLiI7CisgICphYm9ydGVkID0gZmFsc2U7Cit9CisKKyMgIGlmIEdURVNUX09TX1dJTkRPV1MKK1RFU1QoUG9wVXBEZWF0aFRlc3QsIERvZXNOb3RTaG93UG9wVXBPbkFib3J0KSB7CisgIHByaW50ZigiVGhpcyB0ZXN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZhaWxpbmcgaWYgaXQgc2hvd3MgIgorICAgICAgICAgImFueSBwb3AtdXAgZGlhbG9ncy5cbiIpOworICBmZmx1c2goc3Rkb3V0KTsKKworICBFWFBFQ1RfREVBVEgoeworICAgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBmYWxzZTsKKyAgICBhYm9ydCgpOworICB9LCAiIik7Cit9CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUJVR19ERUFUSCBpbiBkZWJ1ZyBtb2RlIGRvZXMgbm90IGFib3J0CisvLyB0aGUgZnVuY3Rpb24uCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhwZWN0RGVidWdEZWF0aERvZXNOb3RBYm9ydCkgeworICBib29sIGFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFeHBlY3REZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOworICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Cit9CisKK3ZvaWQgQXNzZXJ0RGVidWdEZWF0aEhlbHBlcihib29sKiBhYm9ydGVkKSB7CisgICphYm9ydGVkID0gdHJ1ZTsKKyAgQVNTRVJUX0RFQlVHX0RFQVRIKHJldHVybiwgIiIpIDw8ICJUaGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwuIjsKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVCVUdfREVBVEggaW4gZGVidWcgbW9kZSBhYm9ydHMgdGhlIGZ1bmN0aW9uIG9uCisvLyBmYWlsdXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHMpIHsKKyAgc3RhdGljIGJvb2wgYWJvcnRlZDsKKyAgYWJvcnRlZCA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOworICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworIyBlbmRpZiAgLy8gX05ERUJVRworCisvLyBUZXN0cyB0aGUgKl9FWElUIGZhbWlseSBvZiBtYWNyb3MsIHVzaW5nIGEgdmFyaWV0eSBvZiBwcmVkaWNhdGVzLgorc3RhdGljIHZvaWQgVGVzdEV4aXRNYWNyb3MoKSB7CisgIEVYUEVDVF9FWElUKF9leGl0KDEpLCAgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMSksICAiIik7CisgIEFTU0VSVF9FWElUKF9leGl0KDQyKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoNDIpLCAiIik7CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIC8vIE9mIGFsbCBzaWduYWxzIGVmZmVjdHMgb24gdGhlIHByb2Nlc3MgZXhpdCBjb2RlLCBvbmx5IHRob3NlIG9mIFNJR0FCUlQKKyAgLy8gYXJlIGRvY3VtZW50ZWQgb24gV2luZG93cy4KKyAgLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kd3d6a3Q0YyhWUy43MSkuYXNweC4KKyAgRVhQRUNUX0VYSVQocmFpc2UoU0lHQUJSVCksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDMpLCAiIikgPDwgImJfYXIiOworCisjIGVsc2UKKworICBFWFBFQ1RfRVhJVChyYWlzZShTSUdLSUxMKSwgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHS0lMTCksICIiKSA8PCAiZm9vIjsKKyAgQVNTRVJUX0VYSVQocmFpc2UoU0lHVVNSMiksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1VTUjIpLCAiIikgPDwgImJhciI7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0VYSVQoX2V4aXQoMCksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1NFR1YpLCAiIikKKyAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIHRvby4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCB0b28uIik7CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfRVhJVChyYWlzZShTSUdTRUdWKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKQorICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhpdE1hY3JvcykgeworICBUZXN0RXhpdE1hY3JvcygpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhpdE1hY3Jvc1VzaW5nRm9yaykgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gdHJ1ZTsKKyAgVGVzdEV4aXRNYWNyb3MoKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEludmFsaWRTdHlsZSkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInJvY29jbyI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9ERUFUSChfZXhpdCgwKSwgIiIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERlYXRoVGVzdEZhaWxlZE91dHB1dCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9ERUFUSChEaWVXaXRoTWVzc2FnZSgiZGVhdGhcbiIpLAorICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBtZXNzYWdlIiksCisgICAgICAiQWN0dWFsIG1zZzpcbiIKKyAgICAgICJbICBERUFUSCAgIF0gZGVhdGhcbiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRGVhdGhUZXN0VW5leHBlY3RlZFJldHVybk91dHB1dCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9ERUFUSCh7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZXR1cm5pbmdcbiIpOworICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSwgIiIpLAorICAgICAgIiAgICBSZXN1bHQ6IGlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LlxuIgorICAgICAgIiBFcnJvciBtc2c6XG4iCisgICAgICAiWyAgREVBVEggICBdIHJldHVybmluZ1xuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RCYWRFeGl0Q29kZU91dHB1dCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9FWElUKERpZVdpdGhNZXNzYWdlKCJleGl0aW5nIHdpdGggcmMgMVxuIiksCisgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgzKSwKKyAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBtZXNzYWdlIiksCisgICAgICAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIgorICAgICAgIiAgICAgICAgICAgIEV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzIDFcbiIKKyAgICAgICJBY3R1YWwgbXNnOlxuIgorICAgICAgIlsgIERFQVRIICAgXSBleGl0aW5nIHdpdGggcmMgMVxuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RNdWx0aUxpbmVNYXRjaEZhaWwpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfREVBVEgoRGllV2l0aE1lc3NhZ2UoImxpbmUgMVxubGluZSAyXG5saW5lIDNcbiIpLAorICAgICAgICAgICAgICAgICAgICJsaW5lIDFcbnh5elxubGluZSAzXG4iKSwKKyAgICAgICJBY3R1YWwgbXNnOlxuIgorICAgICAgIlsgIERFQVRIICAgXSBsaW5lIDFcbiIKKyAgICAgICJbICBERUFUSCAgIF0gbGluZSAyXG4iCisgICAgICAiWyAgREVBVEggICBdIGxpbmUgM1xuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RNdWx0aUxpbmVNYXRjaFBhc3MpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX0RFQVRIKERpZVdpdGhNZXNzYWdlKCJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iKSwKKyAgICAgICAgICAgICAgICJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iKTsKK30KKworLy8gQSBEZWF0aFRlc3RGYWN0b3J5IHRoYXQgcmV0dXJucyBNb2NrRGVhdGhUZXN0cy4KK2NsYXNzIE1vY2tEZWF0aFRlc3RGYWN0b3J5IDogcHVibGljIERlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgTW9ja0RlYXRoVGVzdEZhY3RvcnkoKTsKKyAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKKworICAvLyBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIENyZWF0ZS4KKyAgdm9pZCBTZXRQYXJhbWV0ZXJzKGJvb2wgY3JlYXRlLCBEZWF0aFRlc3Q6OlRlc3RSb2xlIHJvbGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCk7CisKKyAgLy8gQWNjZXNzb3JzLgorICBpbnQgQXNzdW1lUm9sZUNhbGxzKCkgY29uc3QgeyByZXR1cm4gYXNzdW1lX3JvbGVfY2FsbHNfOyB9CisgIGludCBXYWl0Q2FsbHMoKSBjb25zdCB7IHJldHVybiB3YWl0X2NhbGxzXzsgfQorICBpbnQgUGFzc2VkQ2FsbHMoKSBjb25zdCB7IHJldHVybiBwYXNzZWRfYXJnc18uc2l6ZSgpOyB9CisgIGJvb2wgUGFzc2VkQXJndW1lbnQoaW50IG4pIGNvbnN0IHsgcmV0dXJuIHBhc3NlZF9hcmdzX1tuXTsgfQorICBpbnQgQWJvcnRDYWxscygpIGNvbnN0IHsgcmV0dXJuIGFib3J0X2FyZ3NfLnNpemUoKTsgfQorICBEZWF0aFRlc3Q6OkFib3J0UmVhc29uIEFib3J0QXJndW1lbnQoaW50IG4pIGNvbnN0IHsKKyAgICByZXR1cm4gYWJvcnRfYXJnc19bbl07CisgIH0KKyAgYm9vbCBUZXN0RGVsZXRlZCgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfZGVsZXRlZF87IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNb2NrRGVhdGhUZXN0OworICAvLyBJZiB0cnVlLCBDcmVhdGUgd2lsbCByZXR1cm4gYSBNb2NrRGVhdGhUZXN0OyBvdGhlcndpc2UgaXQgcmV0dXJucworICAvLyBOVUxMLgorICBib29sIGNyZWF0ZV87CisgIC8vIFRoZSB2YWx1ZSBhIE1vY2tEZWF0aFRlc3Qgd2lsbCByZXR1cm4gZnJvbSBpdHMgQXNzdW1lUm9sZSBtZXRob2QuCisgIERlYXRoVGVzdDo6VGVzdFJvbGUgcm9sZV87CisgIC8vIFRoZSB2YWx1ZSBhIE1vY2tEZWF0aFRlc3Qgd2lsbCByZXR1cm4gZnJvbSBpdHMgV2FpdCBtZXRob2QuCisgIGludCBzdGF0dXNfOworICAvLyBUaGUgdmFsdWUgYSBNb2NrRGVhdGhUZXN0IHdpbGwgcmV0dXJuIGZyb20gaXRzIFBhc3NlZCBtZXRob2QuCisgIGJvb2wgcGFzc2VkXzsKKworICAvLyBOdW1iZXIgb2YgdGltZXMgQXNzdW1lUm9sZSB3YXMgY2FsbGVkLgorICBpbnQgYXNzdW1lX3JvbGVfY2FsbHNfOworICAvLyBOdW1iZXIgb2YgdGltZXMgV2FpdCB3YXMgY2FsbGVkLgorICBpbnQgd2FpdF9jYWxsc187CisgIC8vIFRoZSBhcmd1bWVudHMgdG8gdGhlIGNhbGxzIHRvIFBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisgIC8vIFNldFBhcmFtZXRlcnMuCisgIHN0ZDo6dmVjdG9yPGJvb2w+IHBhc3NlZF9hcmdzXzsKKyAgLy8gVGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbHMgdG8gQWJvcnQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworICAvLyBTZXRQYXJhbWV0ZXJzLgorICBzdGQ6OnZlY3RvcjxEZWF0aFRlc3Q6OkFib3J0UmVhc29uPiBhYm9ydF9hcmdzXzsKKyAgLy8gVHJ1ZSBpZiB0aGUgbGFzdCBNb2NrRGVhdGhUZXN0IHJldHVybmVkIGJ5IENyZWF0ZSBoYXMgYmVlbgorICAvLyBkZWxldGVkLgorICBib29sIHRlc3RfZGVsZXRlZF87Cit9OworCisKKy8vIEEgRGVhdGhUZXN0IGltcGxlbWVudGF0aW9uIHVzZWZ1bCBpbiB0ZXN0aW5nLiAgSXQgcmV0dXJucyB2YWx1ZXMgc2V0CisvLyBhdCBpdHMgY3JlYXRpb24gZnJvbSBpdHMgdmFyaW91cyBpbmhlcml0ZWQgRGVhdGhUZXN0IG1ldGhvZHMsIGFuZAorLy8gcmVwb3J0cyBjYWxscyB0byB0aG9zZSBtZXRob2RzIHRvIGl0cyBwYXJlbnQgTW9ja0RlYXRoVGVzdEZhY3RvcnkKKy8vIG9iamVjdC4KK2NsYXNzIE1vY2tEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIE1vY2tEZWF0aFRlc3QoTW9ja0RlYXRoVGVzdEZhY3RvcnkgKnBhcmVudCwKKyAgICAgICAgICAgICAgICBUZXN0Um9sZSByb2xlLCBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCkgOgorICAgICAgcGFyZW50XyhwYXJlbnQpLCByb2xlXyhyb2xlKSwgc3RhdHVzXyhzdGF0dXMpLCBwYXNzZWRfKHBhc3NlZCkgeworICB9CisgIHZpcnR1YWwgfk1vY2tEZWF0aFRlc3QoKSB7CisgICAgcGFyZW50Xy0+dGVzdF9kZWxldGVkXyA9IHRydWU7CisgIH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCkgeworICAgICsrcGFyZW50Xy0+YXNzdW1lX3JvbGVfY2FsbHNfOworICAgIHJldHVybiByb2xlXzsKKyAgfQorICB2aXJ0dWFsIGludCBXYWl0KCkgeworICAgICsrcGFyZW50Xy0+d2FpdF9jYWxsc187CisgICAgcmV0dXJuIHN0YXR1c187CisgIH0KKyAgdmlydHVhbCBib29sIFBhc3NlZChib29sIGV4aXRfc3RhdHVzX29rKSB7CisgICAgcGFyZW50Xy0+cGFzc2VkX2FyZ3NfLnB1c2hfYmFjayhleGl0X3N0YXR1c19vayk7CisgICAgcmV0dXJuIHBhc3NlZF87CisgIH0KKyAgdmlydHVhbCB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgeworICAgIHBhcmVudF8tPmFib3J0X2FyZ3NfLnB1c2hfYmFjayhyZWFzb24pOworICB9CisKKyBwcml2YXRlOgorICBNb2NrRGVhdGhUZXN0RmFjdG9yeSogY29uc3QgcGFyZW50XzsKKyAgY29uc3QgVGVzdFJvbGUgcm9sZV87CisgIGNvbnN0IGludCBzdGF0dXNfOworICBjb25zdCBib29sIHBhc3NlZF87Cit9OworCisKKy8vIE1vY2tEZWF0aFRlc3RGYWN0b3J5IGNvbnN0cnVjdG9yLgorTW9ja0RlYXRoVGVzdEZhY3Rvcnk6Ok1vY2tEZWF0aFRlc3RGYWN0b3J5KCkKKyAgICA6IGNyZWF0ZV8odHJ1ZSksCisgICAgICByb2xlXyhEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCksCisgICAgICBzdGF0dXNfKDApLAorICAgICAgcGFzc2VkXyh0cnVlKSwKKyAgICAgIGFzc3VtZV9yb2xlX2NhbGxzXygwKSwKKyAgICAgIHdhaXRfY2FsbHNfKDApLAorICAgICAgcGFzc2VkX2FyZ3NfKCksCisgICAgICBhYm9ydF9hcmdzXygpIHsKK30KKworCisvLyBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIENyZWF0ZS4KK3ZvaWQgTW9ja0RlYXRoVGVzdEZhY3Rvcnk6OlNldFBhcmFtZXRlcnMoYm9vbCBjcmVhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdDo6VGVzdFJvbGUgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgYm9vbCBwYXNzZWQpIHsKKyAgY3JlYXRlXyA9IGNyZWF0ZTsKKyAgcm9sZV8gPSByb2xlOworICBzdGF0dXNfID0gc3RhdHVzOworICBwYXNzZWRfID0gcGFzc2VkOworCisgIGFzc3VtZV9yb2xlX2NhbGxzXyA9IDA7CisgIHdhaXRfY2FsbHNfID0gMDsKKyAgcGFzc2VkX2FyZ3NfLmNsZWFyKCk7CisgIGFib3J0X2FyZ3NfLmNsZWFyKCk7Cit9CisKKworLy8gU2V0cyB0ZXN0IHRvIE5VTEwgKGlmIGNyZWF0ZV8gaXMgZmFsc2UpIG9yIHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3CisvLyBNb2NrRGVhdGhUZXN0IG9iamVjdCB3aXRoIHBhcmFtZXRlcnMgdGFrZW4gZnJvbSB0aGUgbGFzdCBjYWxsCisvLyB0byBTZXRQYXJhbWV0ZXJzIChpZiBjcmVhdGVfIGlzIHRydWUpLiAgQWx3YXlzIHJldHVybnMgdHJ1ZS4KK2Jvb2wgTW9ja0RlYXRoVGVzdEZhY3Rvcnk6OkNyZWF0ZShjb25zdCBjaGFyKiAvKnN0YXRlbWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFKiAvKnJlZ2V4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLypmaWxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qbGluZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKKyAgdGVzdF9kZWxldGVkXyA9IGZhbHNlOworICBpZiAoY3JlYXRlXykgeworICAgICp0ZXN0ID0gbmV3IE1vY2tEZWF0aFRlc3QodGhpcywgcm9sZV8sIHN0YXR1c18sIHBhc3NlZF8pOworICB9IGVsc2UgeworICAgICp0ZXN0ID0gTlVMTDsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQSB0ZXN0IGZpeHR1cmUgZm9yIHRlc3RpbmcgdGhlIGxvZ2ljIG9mIHRoZSBHVEVTVF9ERUFUSF9URVNUXyBtYWNyby4KKy8vIEl0IGluc3RhbGxzIGEgTW9ja0RlYXRoVGVzdEZhY3RvcnkgdGhhdCBpcyB1c2VkIGZvciB0aGUgZHVyYXRpb24KKy8vIG9mIHRoZSB0ZXN0IGNhc2UuCitjbGFzcyBNYWNyb0xvZ2ljRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIHRlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSogcmVwbGFjZXJfOworICBzdGF0aWMgTW9ja0RlYXRoVGVzdEZhY3RvcnkqIGZhY3RvcnlfOworCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgZmFjdG9yeV8gPSBuZXcgTW9ja0RlYXRoVGVzdEZhY3Rvcnk7CisgICAgcmVwbGFjZXJfID0gbmV3IHRlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeShmYWN0b3J5Xyk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGRlbGV0ZSByZXBsYWNlcl87CisgICAgcmVwbGFjZXJfID0gTlVMTDsKKyAgICBkZWxldGUgZmFjdG9yeV87CisgICAgZmFjdG9yeV8gPSBOVUxMOworICB9CisKKyAgLy8gUnVucyBhIGRlYXRoIHRlc3QgdGhhdCBicmVha3MgdGhlIHJ1bGVzIGJ5IHJldHVybmluZy4gIFN1Y2ggYSBkZWF0aAorICAvLyB0ZXN0IGNhbm5vdCBiZSBydW4gZGlyZWN0bHkgZnJvbSBhIHRlc3Qgcm91dGluZSB0aGF0IHVzZXMgYQorICAvLyBNb2NrRGVhdGhUZXN0LCBvciB0aGUgcmVtYWluZGVyIG9mIHRoZSByb3V0aW5lIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgorICBzdGF0aWMgdm9pZCBSdW5SZXR1cm5pbmdEZWF0aFRlc3QoYm9vbCogZmxhZykgeworICAgIEFTU0VSVF9ERUFUSCh7ICAvLyBOT0xJTlQKKyAgICAgICpmbGFnID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9LCAiIik7CisgIH0KK307CisKK3Rlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSogTWFjcm9Mb2dpY0RlYXRoVGVzdDo6cmVwbGFjZXJfCisgICAgPSBOVUxMOworTW9ja0RlYXRoVGVzdEZhY3RvcnkqIE1hY3JvTG9naWNEZWF0aFRlc3Q6OmZhY3RvcnlfID0gTlVMTDsKKworCisvLyBUZXN0IHRoYXQgbm90aGluZyBoYXBwZW5zIHdoZW4gdGhlIGZhY3RvcnkgZG9lc24ndCByZXR1cm4gYSBEZWF0aFRlc3Q6CitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgTm90aGluZ0hhcHBlbnMpIHsKKyAgYm9vbCBmbGFnID0gZmFsc2U7CisgIGZhY3RvcnlfLT5TZXRQYXJhbWV0ZXJzKGZhbHNlLCBEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCwgMCwgdHJ1ZSk7CisgIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOworICBFWFBFQ1RfRkFMU0UoZmxhZyk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfRkFMU0UoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0IHRoYXQgdGhlIHBhcmVudCBwcm9jZXNzIGRvZXNuJ3QgcnVuIHRoZSBkZWF0aCB0ZXN0IGNvZGUsCisvLyBhbmQgdGhhdCB0aGUgUGFzc2VkIG1ldGhvZCByZXR1cm5zIGZhbHNlIHdoZW4gdGhlIChzaW11bGF0ZWQpCisvLyBjaGlsZCBwcm9jZXNzIGV4aXRzIHdpdGggc3RhdHVzIDA6CitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGRFeGl0c1N1Y2Nlc3NmdWxseSkgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpPVkVSU0VFX1RFU1QsIDAsIHRydWUpOworICBFWFBFQ1RfREVBVEgoZmxhZyA9IHRydWUsICIiKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEFTU0VSVF9FUSgxLCBmYWN0b3J5Xy0+UGFzc2VkQ2FsbHMoKSk7CisgIEVYUEVDVF9GQUxTRShmYWN0b3J5Xy0+UGFzc2VkQXJndW1lbnQoMCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgUGFzc2VkIG1ldGhvZCB3YXMgZ2l2ZW4gdGhlIGFyZ3VtZW50ICJ0cnVlIiB3aGVuCisvLyB0aGUgKHNpbXVsYXRlZCkgY2hpbGQgcHJvY2VzcyBleGl0cyB3aXRoIHN0YXR1cyAxOgorVEVTVF9GKE1hY3JvTG9naWNEZWF0aFRlc3QsIENoaWxkRXhpdHNVbnN1Y2Nlc3NmdWxseSkgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpPVkVSU0VFX1RFU1QsIDEsIHRydWUpOworICBFWFBFQ1RfREVBVEgoZmxhZyA9IHRydWUsICIiKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEFTU0VSVF9FUSgxLCBmYWN0b3J5Xy0+UGFzc2VkQ2FsbHMoKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5QYXNzZWRBcmd1bWVudCgwKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKKyAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSAoc2ltdWxhdGVkKSBjaGlsZCBwcm9jZXNzIGV4ZWN1dGVzIHRoZSBkZWF0aCB0ZXN0CisvLyBjb2RlLCBhbmQgaXMgYWJvcnRlZCB3aXRoIHRoZSBjb3JyZWN0IEFib3J0UmVhc29uIGlmIGl0CisvLyBleGVjdXRlcyBhIHJldHVybiBzdGF0ZW1lbnQuCitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGRQZXJmb3Jtc1JldHVybikgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpFWEVDVVRFX1RFU1QsIDAsIHRydWUpOworICBSdW5SZXR1cm5pbmdEZWF0aFRlc3QoJmZsYWcpOworICBFWFBFQ1RfVFJVRShmbGFnKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPlBhc3NlZENhbGxzKCkpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7CisgIEVYUEVDVF9FUShEZWF0aFRlc3Q6OlRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCwKKyAgICAgICAgICAgIGZhY3RvcnlfLT5BYm9ydEFyZ3VtZW50KDApKTsKKyAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSAoc2ltdWxhdGVkKSBjaGlsZCBwcm9jZXNzIGlzIGFib3J0ZWQgd2l0aCB0aGUKKy8vIGNvcnJlY3QgQWJvcnRSZWFzb24gaWYgaXQgZG9lcyBub3QgZGllLgorVEVTVF9GKE1hY3JvTG9naWNEZWF0aFRlc3QsIENoaWxkRG9lc05vdERpZSkgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpFWEVDVVRFX1RFU1QsIDAsIHRydWUpOworICBFWFBFQ1RfREVBVEgoZmxhZyA9IHRydWUsICIiKTsKKyAgRVhQRUNUX1RSVUUoZmxhZyk7CisgIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgLy8gVGhpcyB0aW1lIHRoZXJlIGFyZSB0d28gY2FsbHMgdG8gQWJvcnQ6IG9uZSBzaW5jZSB0aGUgdGVzdCBkaWRuJ3QKKyAgLy8gZGllLCBhbmQgYW5vdGhlciBmcm9tIHRoZSBSZXR1cm5TZW50aW5lbCB3aGVuIGl0J3MgZGVzdHJveWVkLiAgVGhlCisgIC8vIHNlbnRpbmVsIG5vcm1hbGx5IGlzbid0IGRlc3Ryb3llZCBpZiBhIHRlc3QgZG9lc24ndCBkaWUsIHNpbmNlCisgIC8vIF9leGl0KDIpIGlzIGNhbGxlZCBpbiB0aGF0IGNhc2UgYnkgRm9ya2luZ0RlYXRoVGVzdCwgYnV0IG5vdCBieQorICAvLyBvdXIgTW9ja0RlYXRoVGVzdC4KKyAgQVNTRVJUX0VRKDIsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfRVEoRGVhdGhUZXN0OjpURVNUX0RJRF9OT1RfRElFLAorICAgICAgICAgICAgZmFjdG9yeV8tPkFib3J0QXJndW1lbnQoMCkpOworICBFWFBFQ1RfRVEoRGVhdGhUZXN0OjpURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQsCisgICAgICAgICAgICBmYWN0b3J5Xy0+QWJvcnRBcmd1bWVudCgxKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIHN1Y2Nlc3NmdWwgZGVhdGggdGVzdCBkb2VzIG5vdCByZWdpc3RlciBhIHN1Y2Nlc3NmdWwKKy8vIHRlc3QgcGFydC4KK1RFU1QoU3VjY2Vzc1JlZ2lzdHJhdGlvbkRlYXRoVGVzdCwgTm9TdWNjZXNzUGFydCkgeworICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKKyAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc0RlYXRoVGVzdCwgRGVhdGhUZXN0KSB7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDApLCAiIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiOworICB9LCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfREVBVEgoX2V4aXQoMCksICIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSI7CisgIH0sICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUKKy8vIGxhc3QgZXJyb3IgaXMgMCBhbmQgbm9uLWVtcHR5IHN0cmluZyB3aGVuIGl0IGlzIG5vbi16ZXJvLgorVEVTVChHZXRMYXN0RXJybm9EZXNjcmlwdGlvbiwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb25Xb3JrcykgeworICBlcnJubyA9IEVOT0VOVDsKKyAgRVhQRUNUX1NUUk5FKCIiLCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICBlcnJubyA9IDA7CisgIEVYUEVDVF9TVFJFUSgiIiwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKS5jX3N0cigpKTsKK30KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCitURVNUKEF1dG9IYW5kbGVUZXN0LCBBdXRvSGFuZGxlV29ya3MpIHsKKyAgSEFORExFIGhhbmRsZSA9IDo6Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgQVNTRVJUX05FKElOVkFMSURfSEFORExFX1ZBTFVFLCBoYW5kbGUpOworCisgIC8vIFRlc3RzIHRoYXQgdGhlIEF1dG9IYW5kbGUgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIHdpdGggYSBoYW5kbGUuCisgIHRlc3Rpbmc6OmludGVybmFsOjpBdXRvSGFuZGxlIGF1dG9faGFuZGxlKGhhbmRsZSk7CisgIEVYUEVDVF9FUShoYW5kbGUsIGF1dG9faGFuZGxlLkdldCgpKTsKKworICAvLyBUZXN0cyB0aGF0IFJlc2V0IGFzc2lnbnMgSU5WQUxJRF9IQU5ETEVfVkFMVUUuCisgIC8vIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCB2ZXJpZnkgd2hldGhlciB0aGUgb3JpZ2luYWwgaGFuZGxlIGlzIGNsb3NlZC4KKyAgYXV0b19oYW5kbGUuUmVzZXQoKTsKKyAgRVhQRUNUX0VRKElOVkFMSURfSEFORExFX1ZBTFVFLCBhdXRvX2hhbmRsZS5HZXQoKSk7CisKKyAgLy8gVGVzdHMgdGhhdCBSZXNldCBhc3NpZ25zIHRoZSBuZXcgaGFuZGxlLgorICAvLyBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgdmVyaWZ5IHdoZXRoZXIgdGhlIG9yaWdpbmFsIGhhbmRsZSBpcyBjbG9zZWQuCisgIGhhbmRsZSA9IDo6Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgQVNTRVJUX05FKElOVkFMSURfSEFORExFX1ZBTFVFLCBoYW5kbGUpOworICBhdXRvX2hhbmRsZS5SZXNldChoYW5kbGUpOworICBFWFBFQ1RfRVEoaGFuZGxlLCBhdXRvX2hhbmRsZS5HZXQoKSk7CisKKyAgLy8gVGVzdHMgdGhhdCBBdXRvSGFuZGxlIGNvbnRhaW5zIElOVkFMSURfSEFORExFX1ZBTFVFIGJ5IGRlZmF1bHQuCisgIHRlc3Rpbmc6OmludGVybmFsOjpBdXRvSGFuZGxlIGF1dG9faGFuZGxlMjsKKyAgRVhQRUNUX0VRKElOVkFMSURfSEFORExFX1ZBTFVFLCBhdXRvX2hhbmRsZTIuR2V0KCkpOworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBCaWdnZXN0UGFyc2FibGU7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IEJpZ2dlc3RTaWduZWRQYXJzYWJsZTsKKyMgZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdFBhcnNhYmxlOwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIEJpZ2dlc3RTaWduZWRQYXJzYWJsZTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gV2UgY2Fubm90IHVzZSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSBhcyBpdCBjbGFzaGVzIHdpdGggdGhlCisvLyBtYXgoKSBtYWNybyBkZWZpbmVkIGJ5IDx3aW5kb3dzLmg+LgorY29uc3QgQmlnZ2VzdFBhcnNhYmxlIGtCaWdnZXN0UGFyc2FibGVNYXggPSBVTExPTkdfTUFYOworY29uc3QgQmlnZ2VzdFNpZ25lZFBhcnNhYmxlIGtCaWdnZXN0U2lnbmVkUGFyc2FibGVNYXggPSBMTE9OR19NQVg7CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgUmVqZWN0c0ludmFsaWRGb3JtYXQpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgLy8gUmVqZWN0cyBub24tbnVtYmVycy4KKyAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigibm9uLW51bWJlciBzdHJpbmciLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBudW1iZXJzIHdpdGggd2hpdGVzcGFjZSBwcmVmaXguCisgIEVYUEVDVF9GQUxTRShQYXJzZU5hdHVyYWxOdW1iZXIoIiAxMjMiLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBuZWdhdGl2ZSBudW1iZXJzLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCItMTIzIiwgJnJlc3VsdCkpOworCisgIC8vIFJlamVjdHMgbnVtYmVycyBzdGFydGluZyB3aXRoIGEgcGx1cyBzaWduLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCIrMTIzIiwgJnJlc3VsdCkpOworICBlcnJubyA9IDA7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgUmVqZWN0c092ZXJmbG93bk51bWJlcnMpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiLCAmcmVzdWx0KSk7CisKKyAgc2lnbmVkIGNoYXIgY2hhcl9yZXN1bHQgPSAwOworICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCIyMDAiLCAmY2hhcl9yZXN1bHQpKTsKKyAgZXJybm8gPSAwOworfQorCitURVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIEFjY2VwdHNWYWxpZE51bWJlcnMpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgcmVzdWx0ID0gMDsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIxMjMiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxMjNVLCByZXN1bHQpOworCisgIC8vIENoZWNrIDAgYXMgYW4gZWRnZSBjYXNlLgorICByZXN1bHQgPSAxOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjAiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgwVSwgcmVzdWx0KTsKKworICByZXN1bHQgPSAxOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjAwMDAwIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRVEoMFUsIHJlc3VsdCk7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgQWNjZXB0c1R5cGVMaW1pdHMpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBrQmlnZ2VzdFBhcnNhYmxlTWF4OworCisgIEJpZ2dlc3RQYXJzYWJsZSByZXN1bHQgPSAwOworICBFWFBFQ1RfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIobXNnLkdldFN0cmluZygpLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUShrQmlnZ2VzdFBhcnNhYmxlTWF4LCByZXN1bHQpOworCisgIE1lc3NhZ2UgbXNnMjsKKyAgbXNnMiA8PCBrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4OworCisgIEJpZ2dlc3RTaWduZWRQYXJzYWJsZSBzaWduZWRfcmVzdWx0ID0gMDsKKyAgRVhQRUNUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKG1zZzIuR2V0U3RyaW5nKCksICZzaWduZWRfcmVzdWx0KSk7CisgIEVYUEVDVF9FUShrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4LCBzaWduZWRfcmVzdWx0KTsKKworICBNZXNzYWdlIG1zZzM7CisgIG1zZzMgPDwgSU5UX01BWDsKKworICBpbnQgaW50X3Jlc3VsdCA9IDA7CisgIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2czLkdldFN0cmluZygpLCAmaW50X3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoSU5UX01BWCwgaW50X3Jlc3VsdCk7CisKKyAgTWVzc2FnZSBtc2c0OworICBtc2c0IDw8IFVJTlRfTUFYOworCisgIHVuc2lnbmVkIGludCB1aW50X3Jlc3VsdCA9IDA7CisgIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2c0LkdldFN0cmluZygpLCAmdWludF9yZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFVJTlRfTUFYLCB1aW50X3Jlc3VsdCk7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgV29ya3NGb3JTaG9ydGVySW50ZWdlcnMpIHsKKyAgc2hvcnQgc2hvcnRfcmVzdWx0ID0gMDsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIxMjMiLCAmc2hvcnRfcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxMjMsIHNob3J0X3Jlc3VsdCk7CisKKyAgc2lnbmVkIGNoYXIgY2hhcl9yZXN1bHQgPSAwOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjEyMyIsICZjaGFyX3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoMTIzLCBjaGFyX3Jlc3VsdCk7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworVEVTVChFbnZpcm9ubWVudFRlc3QsIEhhbmRsZUZpdHNJbnRvU2l6ZVQpIHsKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVtb3ZlIHRoaXMgdGVzdCBhZnRlciB0aGlzIGNvbmRpdGlvbiBpcyB2ZXJpZmllZAorICAvLyBpbiBhIHN0YXRpYyBhc3NlcnRpb24gaW4gZ3Rlc3QtZGVhdGgtdGVzdC5jYyBpbiB0aGUgZnVuY3Rpb24KKyAgLy8gR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IuCisgIEFTU0VSVF9UUlVFKHNpemVvZihIQU5ETEUpIDw9IHNpemVvZihzaXplX3QpKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEL0FTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgdHJpZ2dlcgorLy8gZmFpbHVyZXMgd2hlbiBkZWF0aCB0ZXN0cyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0uCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NEZWF0aFRlc3QsIEV4cGVjdHNEZWF0aFdoZW5EZWF0aFRlc3RzQXZhaWxhYmxlKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoRGllSW5zaWRlKCJDb25kRGVhdGhUZXN0RXhwZWN0TWFjcm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVhdGggaW5zaWRlIENvbmREZWF0aFRlc3RFeHBlY3RNYWNybyIpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKERpZUluc2lkZSgiQ29uZERlYXRoVGVzdEFzc2VydE1hY3JvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlYXRoIGluc2lkZSBDb25kRGVhdGhUZXN0QXNzZXJ0TWFjcm8iKTsKKworICAvLyBFbXB0eSBzdGF0ZW1lbnQgd2lsbCBub3QgY3Jhc2gsIHdoaWNoIG11c3QgdHJpZ2dlciBhIGZhaWx1cmUuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7Cit9CisKKyNlbHNlCisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDYXB0dXJlU3RkZXJyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldENhcHR1cmVkU3RkZXJyOworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQvQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBhcmUgc3RpbGwKKy8vIGRlZmluZWQgYnV0IGRvIG5vdCB0cmlnZ2VyIGZhaWx1cmVzIHdoZW4gZGVhdGggdGVzdHMgYXJlIG5vdCBhdmFpbGFibGUgb24KKy8vIHRoZSBzeXN0ZW0uCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NUZXN0LCBXYXJuc1doZW5EZWF0aFRlc3RzTm90QXZhaWxhYmxlKSB7CisgIC8vIEVtcHR5IHN0YXRlbWVudCB3aWxsIG5vdCBjcmFzaCwgYnV0IHRoYXQgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgZmFpbHVyZQorICAvLyB3aGVuIGRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkLgorICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpOworICBzdGQ6OnN0cmluZyBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKSk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gc3Ryc3RyKG91dHB1dC5jX3N0cigpLCAiOyIpKTsKKworICAvLyBUaGUgc3RyZWFtZWQgbWVzc2FnZSBzaG91bGQgbm90IGJlIHByaW50ZWQgYXMgdGhlcmUgaXMgbm8gdGVzdCBmYWlsdXJlLgorICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpIDw8ICJzdHJlYW1lZCBtZXNzYWdlIjsKKyAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCA9PSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICJzdHJlYW1lZCBtZXNzYWdlIikpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCg7LCAiIik7ICAvLyBOT0xJTlQKKyAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSBzdHJzdHIob3V0cHV0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIikpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwgIjsiKSk7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKSA8PCAic3RyZWFtZWQgbWVzc2FnZSI7ICAvLyBOT0xJTlQKKyAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCA9PSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICJzdHJlYW1lZCBtZXNzYWdlIikpOworfQorCit2b2lkIEZ1bmNXaXRoQXNzZXJ0KGludCogbikgeworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybjssICIiKTsKKyAgKCpuKSsrOworfQorCisvLyBUZXN0cyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgZG9lcyBub3QgcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQKKy8vIGZ1bmN0aW9uIChhcyBBU1NFUlRfREVBVEggZG9lcykgaWYgZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NUZXN0LCBBc3NlcnREZWF0RG9lc05vdFJldHVybmhJZlVuc3VwcG9ydGVkKSB7CisgIGludCBuID0gMDsKKyAgRnVuY1dpdGhBc3NlcnQoJm4pOworICBFWFBFQ1RfRVEoMSwgbik7Cit9CisKK1RFU1QoSW5EZWF0aFRlc3RDaGlsZERlYXRoVGVzdCwgUmVwb3J0c0RlYXRoVGVzdENvcnJlY3RseUluRmFzdFN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9GQUxTRShJbkRlYXRoVGVzdENoaWxkKCkpOworICBFWFBFQ1RfREVBVEgoeworICAgIGZwcmludGYoc3RkZXJyLCBJbkRlYXRoVGVzdENoaWxkKCkgPyAiSW5zaWRlIiA6ICJPdXRzaWRlIik7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgX2V4aXQoMSk7CisgIH0sICJJbnNpZGUiKTsKK30KKworVEVTVChJbkRlYXRoVGVzdENoaWxkRGVhdGhUZXN0LCBSZXBvcnRzRGVhdGhUZXN0Q29ycmVjdGx5SW5UaHJlYWRTYWZlU3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgRVhQRUNUX0ZBTFNFKEluRGVhdGhUZXN0Q2hpbGQoKSk7CisgIEVYUEVDVF9ERUFUSCh7CisgICAgZnByaW50ZihzdGRlcnIsIEluRGVhdGhUZXN0Q2hpbGQoKSA/ICJJbnNpZGUiIDogIk91dHNpZGUiKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBfZXhpdCgxKTsKKyAgfSwgIkluc2lkZSIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFRlc3RzIHRoYXQgdGhlIGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIG1heSBvciBtYXkgbm90CisvLyBiZSBmb2xsb3dlZCBieSBvcGVyYXRvcjw8LCBhbmQgdGhhdCBpbiBlaXRoZXIgY2FzZSB0aGUgY29tcGxldGUgdGV4dAorLy8gY29tcHJpc2VzIG9ubHkgYSBzaW5nbGUgQysrIHN0YXRlbWVudC4KKy8vCisvLyBUaGUgc3ludGF4IHNob3VsZCB3b3JrIHdoZXRoZXIgZGVhdGggdGVzdHMgYXJlIGF2YWlsYWJsZSBvciBub3QuCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NTeW50YXhEZWF0aFRlc3QsIFNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICAvLyBUaGlzIHdvdWxkIGZhaWwgaWYgZXhlY3V0ZWQ7IHRoaXMgaXMgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkKKyAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybiwgIiIpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChfZXhpdCgxKSwgIiIpOworICBlbHNlCisgICAgLy8gVGhpcyBlbXB0eSAiZWxzZSIgYnJhbmNoIGlzIG1lYW50IHRvIGVuc3VyZSB0aGF0IEVYUEVDVF9ERUFUSAorICAgIC8vIGRvZXNuJ3QgZXhwYW5kIGludG8gYW4gImlmIiBzdGF0ZW1lbnQgd2l0aG91dCBhbiAiZWxzZSIKKyAgICA7ICAvLyBOT0xJTlQKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybiwgIiIpIDw8ICJkaWQgbm90IGRpZSI7CisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgOyAgLy8gTk9MSU5UCisgIGVsc2UKKyAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIikgPDwgMSA8PCAyIDw8IDM7Cit9CisKKy8vIFRlc3RzIHRoYXQgY29uZGl0aW9uYWwgZGVhdGggdGVzdCBtYWNyb3MgZXhwYW5kIHRvIGNvZGUgd2hpY2ggaW50ZXJhY3RzCisvLyB3ZWxsIHdpdGggc3dpdGNoIHN0YXRlbWVudHMuCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NTeW50YXhEZWF0aFRlc3QsIFN3aXRjaFN0YXRlbWVudCkgeworLy8gTWljcm9zb2Z0IGNvbXBpbGVyIHVzdWFsbHkgY29tcGxhaW5zIGFib3V0IHN3aXRjaCBzdGF0ZW1lbnRzIHdpdGhvdXQKKy8vIGNhc2UgbGFiZWxzLiBXZSBzdXBwcmVzcyB0aGF0IHdhcm5pbmcgZm9yIHRoaXMgdGVzdC4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDY1KQorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisgIHN3aXRjaCAoMCkKKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChfZXhpdCgxKSwgIiIpCisgICAgICAgICAgPDwgImV4aXQgaW4gZGVmYXVsdCBzd2l0Y2ggaGFuZGxlciI7CisKKyAgc3dpdGNoICgwKQorICAgIGNhc2UgMDoKKyAgICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoX2V4aXQoMSksICIiKSA8PCAiZXhpdCBpbiBzd2l0Y2ggY2FzZSI7CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIFRlc3RzIHRoYXQgYSB0ZXN0IGNhc2Ugd2hvc2UgbmFtZSBlbmRzIHdpdGggIkRlYXRoVGVzdCIgd29ya3MgZmluZQorLy8gb24gV2luZG93cy4KK1RFU1QoTm90QURlYXRoVGVzdCwgVGVzdCkgeworICBTVUNDRUVEKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1maWxlcGF0aF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWY1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYwpAQCAtMCwwICsxLDY4MCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBHb29nbGUgVGVzdCBmaWxlcGF0aCB1dGlsaXRpZXMKKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQorLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKy8vCisvLyBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGZyb20gZ3Rlc3RfdW5pdHRlc3QuY2MsIHRvIGF2b2lkIGNoYW5naW5nCisvLyBidWlsZCBvciBtYWtlLWZpbGVzIGZvciBzb21lIGV4aXN0aW5nIEdvb2dsZSBUZXN0IGNsaWVudHMuIERvIG5vdAorLy8gI2luY2x1ZGUgdGhpcyBmaWxlIGFueXdoZXJlIGVsc2UhCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisjIGluY2x1ZGUgPGRpcmVjdC5oPiAgLy8gTk9MSU5UCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBNb3ZlIHRoZXNlIHRvIHRoZSBQT1NJWCBhZGFwdGVyIHNlY3Rpb24gaW4KKy8vIGd0ZXN0LXBvcnQuaC4KKworLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgdGhlIHJlbW92ZSBDIGZ1bmN0aW9uLgoraW50IHJlbW92ZShjb25zdCBjaGFyKiBwYXRoKSB7CisgIExQQ1dTVFIgd3BhdGggPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGgpOworICBpbnQgcmV0ID0gRGVsZXRlRmlsZSh3cGF0aCkgPyAwIDogLTE7CisgIGRlbGV0ZSBbXSB3cGF0aDsKKyAgcmV0dXJuIHJldDsKK30KKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIHRoZSBfcm1kaXIgQyBmdW5jdGlvbi4KK2ludCBfcm1kaXIoY29uc3QgY2hhciogcGF0aCkgeworICBGaWxlUGF0aCBmaWxlcGF0aChwYXRoKTsKKyAgTFBDV1NUUiB3cGF0aCA9IFN0cmluZzo6QW5zaVRvVXRmMTYoCisgICAgICBmaWxlcGF0aC5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5jX3N0cigpKTsKKyAgaW50IHJldCA9IFJlbW92ZURpcmVjdG9yeSh3cGF0aCkgPyAwIDogLTE7CisgIGRlbGV0ZSBbXSB3cGF0aDsKKyAgcmV0dXJuIHJldDsKK30KKworI2Vsc2UKKworVEVTVChHZXRDdXJyZW50RGlyVGVzdCwgUmV0dXJuc0N1cnJlbnREaXIpIHsKKyAgY29uc3QgRmlsZVBhdGggb3JpZ2luYWxfZGlyID0gRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKTsKKyAgRVhQRUNUX0ZBTFNFKG9yaWdpbmFsX2Rpci5Jc0VtcHR5KCkpOworCisgIHBvc2l4OjpDaERpcihHVEVTVF9QQVRIX1NFUF8pOworICBjb25zdCBGaWxlUGF0aCBjd2QgPSBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpOworICBwb3NpeDo6Q2hEaXIob3JpZ2luYWxfZGlyLmNfc3RyKCkpOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICAvLyBTa2lwcyB0aGUgIjoiLgorICBjb25zdCBjaGFyKiBjb25zdCBjd2Rfd2l0aG91dF9kcml2ZSA9IHN0cmNocihjd2QuY19zdHIoKSwgJzonKTsKKyAgQVNTRVJUX1RSVUUoY3dkX3dpdGhvdXRfZHJpdmUgIT0gTlVMTCk7CisgIEVYUEVDVF9TVFJFUShHVEVTVF9QQVRIX1NFUF8sIGN3ZF93aXRob3V0X2RyaXZlICsgMSk7CisKKyMgZWxzZQorCisgIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8sIGN3ZC5zdHJpbmcoKSk7CisKKyMgZW5kaWYKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCitURVNUKElzRW1wdHlUZXN0LCBSZXR1cm5zVHJ1ZUZvckVtcHR5UGF0aCkgeworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiIikuSXNFbXB0eSgpKTsKK30KKworVEVTVChJc0VtcHR5VGVzdCwgUmV0dXJuc0ZhbHNlRm9yTm9uRW1wdHlQYXRoKSB7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYSIpLklzRW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiLiIpLklzRW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYS9iIikuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJhXFxiXFwiKS5Jc0VtcHR5KCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICIiIC0+ICIiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBXaGVuRW1wdHlOYW1lKSB7CisgIEVYUEVDVF9FUSgiIiwgRmlsZVBhdGgoIiIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFmaWxlIiAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBCdXROb0RpcmVjdG9yeSkgeworICBFWFBFQ1RfRVEoImFmaWxlIiwKKyAgICAgIEZpbGVQYXRoKCJhZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgIi9hZmlsZSIgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgUm9vdEZpbGVTaG91bGRHaXZlRmlsZU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICBGaWxlUGF0aChHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiYWRpci8iIC0+ICIiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBXaGVyZVRoZXJlSXNOb0ZpbGVOYW1lKSB7CisgIEVYUEVDVF9FUSgiIiwKKyAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8pLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvYWZpbGUiIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEdpdmVGaWxlTmFtZSkgeworICBFWFBFQ1RfRVEoImFmaWxlIiwKKyAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiYWRpci9zdWJkaXIvYWZpbGUiIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEFsc29HaXZlRmlsZU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKQorICAgICAgLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworCisvLyBUZXN0cyB0aGF0IFJlbW92ZURpcmVjdG9yeU5hbWUoKSB3b3JrcyB3aXRoIHRoZSBhbHRlcm5hdGUgc2VwYXJhdG9yCisvLyBvbiBXaW5kb3dzLgorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCIvYWZpbGUiKSAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBSb290RmlsZVNob3VsZEdpdmVGaWxlTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImFmaWxlIiwgRmlsZVBhdGgoIi9hZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUoImFkaXIvIikgLT4gIiIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFdoZXJlVGhlcmVJc05vRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKCIiLCBGaWxlUGF0aCgiYWRpci8iKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyL2FmaWxlIikgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgU2hvdWxkR2l2ZUZpbGVOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiYWZpbGUiLCBGaWxlUGF0aCgiYWRpci9hZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUoImFkaXIvc3ViZGlyL2FmaWxlIikgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgU2hvdWxkQWxzb0dpdmVGaWxlTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImFmaWxlIiwKKyAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyL3N1YmRpci9hZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKyNlbmRpZgorCisvLyBSZW1vdmVGaWxlTmFtZSAiIiAtPiAiLi8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgRW1wdHlOYW1lKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gT24gV2luZG93cyBDRSwgd2UgdXNlIHRoZSByb290IGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXywgRmlsZVBhdGgoIiIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworI2Vsc2UKKyAgRVhQRUNUX0VRKCIuIiBHVEVTVF9QQVRIX1NFUF8sIEZpbGVQYXRoKCIiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKKyNlbmRpZgorfQorCisvLyBSZW1vdmVGaWxlTmFtZSAiYWRpci8iIC0+ICJhZGlyLyIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBCdXROb0ZpbGUpIHsKKyAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgImFkaXIvYWZpbGUiIC0+ICJhZGlyLyIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc0Rpck5hbWUpIHsKKyAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICAgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSAiYWRpci9zdWJkaXIvYWZpbGUiIC0+ICJhZGlyL3N1YmRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJBbmRTdWJEaXJOYW1lKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXywKKyAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gInN1YmRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpCisgICAgICAuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lICIvYWZpbGUiIC0+ICIvIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzUm9vdERpcikgeworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfLAorICAgICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVGaWxlTmFtZSgpIHdvcmtzIHdpdGggdGhlIGFsdGVybmF0ZSBzZXBhcmF0b3Igb24KKy8vIFdpbmRvd3MuCisKKy8vIFJlbW92ZUZpbGVOYW1lKCJhZGlyLyIpIC0+ICJhZGlyLyIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBCdXROb0ZpbGVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICAgICAgICBGaWxlUGF0aCgiYWRpci8iKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUoImFkaXIvYWZpbGUiKSAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUoImFkaXIvc3ViZGlyL2FmaWxlIikgLT4gImFkaXIvc3ViZGlyLyIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc0RpckFuZFN1YkRpck5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gInN1YmRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvc3ViZGlyL2FmaWxlIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lKCIvYWZpbGUiKSAtPiAiXCIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc1Jvb3REaXJGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXywgRmlsZVBhdGgoIi9hZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworfQorCisjZW5kaWYKKworVEVTVChNYWtlRmlsZU5hbWVUZXN0LCBHZW5lcmF0ZVdoZW5OdW1iZXJJc1plcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiksIEZpbGVQYXRoKCJiYXIiKSwKKyAgICAgIDAsICJ4bWwiKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVGaWxlTmFtZU51bWJlckd0WmVybykgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCJmb28iKSwgRmlsZVBhdGgoImJhciIpLAorICAgICAgMTIsICJ4bWwiKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyXzEyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVGaWxlTmFtZVdpdGhTbGFzaE51bWJlcklzWmVybykgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCisgICAgICBGaWxlUGF0aCgiYmFyIiksIDAsICJ4bWwiKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVGaWxlTmFtZVdpdGhTbGFzaE51bWJlckd0WmVybykgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCisgICAgICBGaWxlUGF0aCgiYmFyIiksIDEyLCAieG1sIik7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhcl8xMi54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlV2hlbk51bWJlcklzWmVyb0FuZERpcklzRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiIiksIEZpbGVQYXRoKCJiYXIiKSwKKyAgICAgIDAsICJ4bWwiKTsKKyAgRVhQRUNUX0VRKCJiYXIueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChNYWtlRmlsZU5hbWVUZXN0LCBHZW5lcmF0ZVdoZW5OdW1iZXJJc05vdFplcm9BbmREaXJJc0VtcHR5KSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoIiIpLCBGaWxlUGF0aCgiYmFyIiksCisgICAgICAxNCwgInhtbCIpOworICBFWFBFQ1RfRVEoImJhcl8xNC54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgV29ya3NXaGVuRGlyRG9lc05vdEVuZFdpdGhQYXRoU2VwKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiYmFyLnhtbCIpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBXb3Jrc1doZW5QYXRoMUVuZHNXaXRoUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIueG1sIikpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIFBhdGgxQmVpbmdFbXB0eSkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImJhci54bWwiKSk7CisgIEVYUEVDVF9FUSgiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMkJlaW5nRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iKSwgRmlsZVBhdGgoIiIpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIEJvdGhQYXRoQmVpbmdFbXB0eSkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoIiIpKTsKKyAgRVhQRUNUX0VRKCIiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDFDb250YWluc1BhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiZm9vYmFyLnhtbCIpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiBHVEVTVF9QQVRIX1NFUF8gImZvb2Jhci54bWwiLAorICAgICAgICAgICAgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIFBhdGgyQ29udGFpbnNQYXRoU2VwKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocygKKyAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCisgICAgICBGaWxlUGF0aCgiYmFyIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIiwKKyAgICAgICAgICAgIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMkVuZHNXaXRoUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImJhciIgR1RFU1RfUEFUSF9TRVBfKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgIiIgLT4gIiIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgRW1wdHlTdHJpbmcpIHsKKyAgRVhQRUNUX0VRKCIiLCBGaWxlUGF0aCgiIikuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvbyIgLT4gImZvbyIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgRmlsZU5vU2xhc2hTdHJpbmcpIHsKKyAgRVhQRUNUX0VRKCJmb28iLCBGaWxlUGF0aCgiZm9vIikuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvby8iIC0+ICJmb28iCitURVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIFNob3VsZFJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiZm9vIiwKKyAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXykuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIEVYUEVDVF9FUSgiZm9vIiwgRmlsZVBhdGgoImZvby8iKS5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5zdHJpbmcoKSk7CisjZW5kaWYKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICJmb28vYmFyLyIgLT4gImZvby9iYXIvIgorVEVTVChSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JUZXN0LCBTaG91bGRSZW1vdmVMYXN0U2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfKQorICAgICAgICAgICAgICAgIC5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvciAiZm9vL2JhciIgLT4gImZvby9iYXIiCitURVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIFNob3VsZFJldHVyblVubW9kaWZpZWQpIHsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIikKKyAgICAgICAgICAgICAgICAuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworfQorCitURVNUKERpcmVjdG9yeVRlc3QsIFJvb3REaXJlY3RvcnlFeGlzdHMpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cy4KKyAgY2hhciBjdXJyZW50X2RyaXZlW19NQVhfUEFUSF07ICAvLyBOT0xJTlQKKyAgY3VycmVudF9kcml2ZVswXSA9IHN0YXRpY19jYXN0PGNoYXI+KF9nZXRkcml2ZSgpICsgJ0EnIC0gMSk7CisgIGN1cnJlbnRfZHJpdmVbMV0gPSAnOic7CisgIGN1cnJlbnRfZHJpdmVbMl0gPSAnXFwnOworICBjdXJyZW50X2RyaXZlWzNdID0gJ1wwJzsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoY3VycmVudF9kcml2ZSkuRGlyZWN0b3J5RXhpc3RzKCkpOworI2Vsc2UKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi8iKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKK1RFU1QoRGlyZWN0b3J5VGVzdCwgUm9vdE9mV3JvbmdEcml2ZURvZXNOb3RFeGlzdHMpIHsKKyAgY29uc3QgaW50IHNhdmVkX2RyaXZlXyA9IF9nZXRkcml2ZSgpOworICAvLyBGaW5kIGEgZHJpdmUgdGhhdCBkb2Vzbid0IGV4aXN0LiBTdGFydCB3aXRoICdaJyB0byBhdm9pZCBjb21tb24gb25lcy4KKyAgZm9yIChjaGFyIGRyaXZlID0gJ1onOyBkcml2ZSA+PSAnQSc7IGRyaXZlLS0pCisgICAgaWYgKF9jaGRyaXZlKGRyaXZlIC0gJ0EnICsgMSkgPT0gLTEpIHsKKyAgICAgIGNoYXIgbm9uX2RyaXZlW19NQVhfUEFUSF07ICAvLyBOT0xJTlQKKyAgICAgIG5vbl9kcml2ZVswXSA9IGRyaXZlOworICAgICAgbm9uX2RyaXZlWzFdID0gJzonOworICAgICAgbm9uX2RyaXZlWzJdID0gJ1xcJzsKKyAgICAgIG5vbl9kcml2ZVszXSA9ICdcMCc7CisgICAgICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgobm9uX2RyaXZlKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIF9jaGRyaXZlKHNhdmVkX2RyaXZlXyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gV2luZG93cyBDRSBfZG9lc18gY29uc2lkZXIgYW4gZW1wdHkgZGlyZWN0b3J5IHRvIGV4aXN0LgorVEVTVChEaXJlY3RvcnlUZXN0LCBFbXB0eVBhdGhEaXJlY3RvcnlEb2VzTm90RXhpc3QpIHsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5EaXJlY3RvcnlFeGlzdHMoKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCitURVNUKERpcmVjdG9yeVRlc3QsIEN1cnJlbnREaXJlY3RvcnlFeGlzdHMpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cy4KKyMgaWZuZGVmIF9XSU4zMl9DRSAgLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeS4KKworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLiIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi5cXCIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKworIyBlbmRpZiAgLy8gX1dJTjMyX0NFCisjZWxzZQorICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLiIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi4vIikuRGlyZWN0b3J5RXhpc3RzKCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKy8vICJmb28vYmFyIiA9PSBmb28vL2JhciIgPT0gImZvby8vL2JhciIKK1RFU1QoTm9ybWFsaXplVGVzdCwgTXVsdGlwbGVDb25zZWN1dGl2ZVNlcGFwYXJhdG9yc0luTWlkc3RyaW5nKSB7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8KKyAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOworfQorCisvLyAiL2JhciIgPT0gLy9iYXIiID09ICIvLy9iYXIiCitURVNUKE5vcm1hbGl6ZVRlc3QsIE11bHRpcGxlQ29uc2VjdXRpdmVTZXBhcGFyYXRvcnNBdFN0cmluZ1N0YXJ0KSB7CisgIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7Cit9CisKKy8vICJmb28vIiA9PSBmb28vLyIgPT0gImZvby8vLyIKK1RFU1QoTm9ybWFsaXplVGVzdCwgTXVsdGlwbGVDb25zZWN1dGl2ZVNlcGFwYXJhdG9yc0F0U3RyaW5nRW5kKSB7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXykuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfKS5zdHJpbmcoKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworCisvLyBUZXN0cyB0aGF0IHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFyZSBub3JtYWxpemVkCisvLyByZWdhcmRsZXNzIG9mIHRoZWlyIGNvbWJpbmF0aW9uIChlLmcuICJmb29cIiA9PSJmb28vXCIgPT0KKy8vICJmb29cXC8iKS4KK1RFU1QoTm9ybWFsaXplVGVzdCwgTWl4QWx0ZXJuYXRlU2VwYXJhdG9yQXRTdHJpbmdFbmQpIHsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28vIikuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICIvIikuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImZvby8vIiBHVEVTVF9QQVRIX1NFUF8pLnN0cmluZygpKTsKK30KKworI2VuZGlmCisKK1RFU1QoQXNzaWdubWVudE9wZXJhdG9yVGVzdCwgRGVmYXVsdEFzc2lnbmVkVG9Ob25EZWZhdWx0KSB7CisgIEZpbGVQYXRoIGRlZmF1bHRfcGF0aDsKKyAgRmlsZVBhdGggbm9uX2RlZmF1bHRfcGF0aCgicGF0aCIpOworICBub25fZGVmYXVsdF9wYXRoID0gZGVmYXVsdF9wYXRoOworICBFWFBFQ1RfRVEoIiIsIG5vbl9kZWZhdWx0X3BhdGguc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIGRlZmF1bHRfcGF0aC5zdHJpbmcoKSk7ICAvLyBSSFMgdmFyIGlzIHVuY2hhbmdlZC4KK30KKworVEVTVChBc3NpZ25tZW50T3BlcmF0b3JUZXN0LCBOb25EZWZhdWx0QXNzaWduZWRUb0RlZmF1bHQpIHsKKyAgRmlsZVBhdGggbm9uX2RlZmF1bHRfcGF0aCgicGF0aCIpOworICBGaWxlUGF0aCBkZWZhdWx0X3BhdGg7CisgIGRlZmF1bHRfcGF0aCA9IG5vbl9kZWZhdWx0X3BhdGg7CisgIEVYUEVDVF9FUSgicGF0aCIsIGRlZmF1bHRfcGF0aC5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgicGF0aCIsIG5vbl9kZWZhdWx0X3BhdGguc3RyaW5nKCkpOyAgLy8gUkhTIHZhciBpcyB1bmNoYW5nZWQuCit9CisKK1RFU1QoQXNzaWdubWVudE9wZXJhdG9yVGVzdCwgQ29uc3RBc3NpZ25lZFRvTm9uQ29uc3QpIHsKKyAgY29uc3QgRmlsZVBhdGggY29uc3RfZGVmYXVsdF9wYXRoKCJjb25zdF9wYXRoIik7CisgIEZpbGVQYXRoIG5vbl9kZWZhdWx0X3BhdGgoInBhdGgiKTsKKyAgbm9uX2RlZmF1bHRfcGF0aCA9IGNvbnN0X2RlZmF1bHRfcGF0aDsKKyAgRVhQRUNUX0VRKCJjb25zdF9wYXRoIiwgbm9uX2RlZmF1bHRfcGF0aC5zdHJpbmcoKSk7Cit9CisKK2NsYXNzIERpcmVjdG9yeUNyZWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICB0ZXN0ZGF0YV9wYXRoXy5TZXQoRmlsZVBhdGgoCisgICAgICAgIFRlbXBEaXIoKSArIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpICsKKyAgICAgICAgIl9kaXJlY3RvcnlfY3JlYXRpb24iIEdURVNUX1BBVEhfU0VQXyAidGVzdCIgR1RFU1RfUEFUSF9TRVBfKSk7CisgICAgdGVzdGRhdGFfZmlsZV8uU2V0KHRlc3RkYXRhX3BhdGhfLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKworICAgIHVuaXF1ZV9maWxlMF8uU2V0KEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUodGVzdGRhdGFfcGF0aF8sIEZpbGVQYXRoKCJ1bmlxdWUiKSwKKyAgICAgICAgMCwgInR4dCIpKTsKKyAgICB1bmlxdWVfZmlsZTFfLlNldChGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLCBGaWxlUGF0aCgidW5pcXVlIiksCisgICAgICAgIDEsICJ0eHQiKSk7CisKKyAgICByZW1vdmUodGVzdGRhdGFfZmlsZV8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMF8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMV8uY19zdHIoKSk7CisgICAgcG9zaXg6OlJtRGlyKHRlc3RkYXRhX3BhdGhfLmNfc3RyKCkpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHJlbW92ZSh0ZXN0ZGF0YV9maWxlXy5jX3N0cigpKTsKKyAgICByZW1vdmUodW5pcXVlX2ZpbGUwXy5jX3N0cigpKTsKKyAgICByZW1vdmUodW5pcXVlX2ZpbGUxXy5jX3N0cigpKTsKKyAgICBwb3NpeDo6Um1EaXIodGVzdGRhdGFfcGF0aF8uY19zdHIoKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyBUZW1wRGlyKCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgICAgcmV0dXJuICJcXHRlbXBcXCI7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgY29uc3QgY2hhciogdGVtcF9kaXIgPSBwb3NpeDo6R2V0RW52KCJURU1QIik7CisgICAgaWYgKHRlbXBfZGlyID09IE5VTEwgfHwgdGVtcF9kaXJbMF0gPT0gJ1wwJykKKyAgICAgIHJldHVybiAiXFx0ZW1wXFwiOworICAgIGVsc2UgaWYgKHRlbXBfZGlyW3N0cmxlbih0ZW1wX2RpcikgLSAxXSA9PSAnXFwnKQorICAgICAgcmV0dXJuIHRlbXBfZGlyOworICAgIGVsc2UKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZyh0ZW1wX2RpcikgKyAiXFwiOworI2VsaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorICAgIHJldHVybiAiL3NkY2FyZC8iOworI2Vsc2UKKyAgICByZXR1cm4gIi90bXAvIjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgfQorCisgIHZvaWQgQ3JlYXRlVGV4dEZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgICBGSUxFKiBmID0gcG9zaXg6OkZPcGVuKGZpbGVuYW1lLCAidyIpOworICAgIGZwcmludGYoZiwgInRleHRcbiIpOworICAgIGZjbG9zZShmKTsKKyAgfQorCisgIC8vIFN0cmluZ3MgcmVwcmVzZW50aW5nIGEgZGlyZWN0b3J5IGFuZCBhIGZpbGUsIHdpdGggaWRlbnRpY2FsIHBhdGhzCisgIC8vIGV4Y2VwdCBmb3IgdGhlIHRyYWlsaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIgdGhhdCBkaXN0aW5xdWlzaGVzCisgIC8vIGEgZGlyZWN0b3J5IG5hbWVkICd0ZXN0JyBmcm9tIGEgZmlsZSBuYW1lZCAndGVzdCcuIEV4YW1wbGUgbmFtZXM6CisgIEZpbGVQYXRoIHRlc3RkYXRhX3BhdGhfOyAgLy8gIi90bXAvZGlyZWN0b3J5X2NyZWF0aW9uL3Rlc3QvIgorICBGaWxlUGF0aCB0ZXN0ZGF0YV9maWxlXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0IgorICBGaWxlUGF0aCB1bmlxdWVfZmlsZTBfOyAgLy8gIi90bXAvZGlyZWN0b3J5X2NyZWF0aW9uL3Rlc3QvdW5pcXVlLnR4dCIKKyAgRmlsZVBhdGggdW5pcXVlX2ZpbGUxXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0L3VuaXF1ZV8xLnR4dCIKK307CisKK1RFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkpIHsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RkYXRhX3BhdGhfLkRpcmVjdG9yeUV4aXN0cygpKSA8PCB0ZXN0ZGF0YV9wYXRoXy5zdHJpbmcoKTsKKyAgRVhQRUNUX1RSVUUodGVzdGRhdGFfcGF0aF8uQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKTsKKyAgRVhQRUNUX1RSVUUodGVzdGRhdGFfcGF0aF8uRGlyZWN0b3J5RXhpc3RzKCkpOworfQorCitURVNUX0YoRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVEaXJlY3Rvcmllc0ZvckFscmVhZHlFeGlzdGluZ1BhdGgpIHsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RkYXRhX3BhdGhfLkRpcmVjdG9yeUV4aXN0cygpKSA8PCB0ZXN0ZGF0YV9wYXRoXy5zdHJpbmcoKTsKKyAgRVhQRUNUX1RSVUUodGVzdGRhdGFfcGF0aF8uQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKTsKKyAgLy8gQ2FsbCAnY3JlYXRlJyBhZ2Fpbi4uLiBzaG91bGQgc3RpbGwgc3VjY2VlZC4KKyAgRVhQRUNUX1RSVUUodGVzdGRhdGFfcGF0aF8uQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKTsKK30KKworVEVTVF9GKERpcmVjdG9yeUNyZWF0aW9uVGVzdCwgQ3JlYXRlRGlyZWN0b3JpZXNBbmRVbmlxdWVGaWxlbmFtZSkgeworICBGaWxlUGF0aCBmaWxlX3BhdGgoRmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUodGVzdGRhdGFfcGF0aF8sCisgICAgICBGaWxlUGF0aCgidW5pcXVlIiksICJ0eHQiKSk7CisgIEVYUEVDVF9FUSh1bmlxdWVfZmlsZTBfLnN0cmluZygpLCBmaWxlX3BhdGguc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UoZmlsZV9wYXRoLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsgIC8vIGZpbGUgbm90IHRoZXJlCisKKyAgdGVzdGRhdGFfcGF0aF8uQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpOworICBFWFBFQ1RfRkFMU0UoZmlsZV9wYXRoLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsgIC8vIGZpbGUgc3RpbGwgbm90IHRoZXJlCisgIENyZWF0ZVRleHRGaWxlKGZpbGVfcGF0aC5jX3N0cigpKTsKKyAgRVhQRUNUX1RSVUUoZmlsZV9wYXRoLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKKworICBGaWxlUGF0aCBmaWxlX3BhdGgyKEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLAorICAgICAgRmlsZVBhdGgoInVuaXF1ZSIpLCAidHh0IikpOworICBFWFBFQ1RfRVEodW5pcXVlX2ZpbGUxXy5zdHJpbmcoKSwgZmlsZV9wYXRoMi5zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShmaWxlX3BhdGgyLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsgIC8vIGZpbGUgbm90IHRoZXJlCisgIENyZWF0ZVRleHRGaWxlKGZpbGVfcGF0aDIuY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKGZpbGVfcGF0aDIuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworfQorCitURVNUX0YoRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVEaXJlY3Rvcmllc0ZhaWwpIHsKKyAgLy8gZm9yY2UgYSBmYWlsdXJlIGJ5IHB1dHRpbmcgYSBmaWxlIHdoZXJlIHdlIHdpbGwgdHJ5IHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgQ3JlYXRlVGV4dEZpbGUodGVzdGRhdGFfZmlsZV8uY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX2ZpbGVfLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RkYXRhX2ZpbGVfLkRpcmVjdG9yeUV4aXN0cygpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RkYXRhX2ZpbGVfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Cit9CisKK1RFU1QoTm9EaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZU5vRGlyZWN0b3JpZXNGb3JEZWZhdWx0WG1sRmlsZSkgeworICBjb25zdCBGaWxlUGF0aCB0ZXN0X2RldGFpbF94bWwoInRlc3RfZGV0YWlsLnhtbCIpOworICBFWFBFQ1RfRkFMU0UodGVzdF9kZXRhaWxfeG1sLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgRmlsZVBhdGggZnA7CisgIEVYUEVDVF9FUSgiIiwgZnAuc3RyaW5nKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgQ2hhckFuZENvcHlDb25zdHJ1Y3RvcnMpIHsKKyAgY29uc3QgRmlsZVBhdGggZnAoInNwaWN5Iik7CisgIEVYUEVDVF9FUSgic3BpY3kiLCBmcC5zdHJpbmcoKSk7CisKKyAgY29uc3QgRmlsZVBhdGggZnBfY29weShmcCk7CisgIEVYUEVDVF9FUSgic3BpY3kiLCBmcF9jb3B5LnN0cmluZygpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFN0cmluZ0NvbnN0cnVjdG9yKSB7CisgIGNvbnN0IEZpbGVQYXRoIGZwKHN0ZDo6c3RyaW5nKCJjaWRlciIpKTsKKyAgRVhQRUNUX0VRKCJjaWRlciIsIGZwLnN0cmluZygpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFNldCkgeworICBjb25zdCBGaWxlUGF0aCBhcHBsZSgiYXBwbGUiKTsKKyAgRmlsZVBhdGggbWFjKCJtYWMiKTsKKyAgbWFjLlNldChhcHBsZSk7ICAvLyBJbXBsZW1lbnQgU2V0KCkgc2luY2Ugb3ZlcmxvYWRpbmcgb3BlcmF0b3I9IGlzIGZvcmJpZGRlbi4KKyAgRVhQRUNUX0VRKCJhcHBsZSIsIG1hYy5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiYXBwbGUiLCBhcHBsZS5zdHJpbmcoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBUb1N0cmluZykgeworICBjb25zdCBGaWxlUGF0aCBmaWxlKCJkcmluayIpOworICBFWFBFQ1RfRVEoImRyaW5rIiwgZmlsZS5zdHJpbmcoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBSZW1vdmVFeHRlbnNpb24pIHsKKyAgRVhQRUNUX0VRKCJhcHAiLCBGaWxlUGF0aCgiYXBwLmNjIikuUmVtb3ZlRXh0ZW5zaW9uKCJjYyIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJhcHAiLCBGaWxlUGF0aCgiYXBwLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiZXhlIikuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIkFQUCIsIEZpbGVQYXRoKCJBUFAuRVhFIikuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKS5zdHJpbmcoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBSZW1vdmVFeHRlbnNpb25XaGVuVGhlcmVJc05vRXh0ZW5zaW9uKSB7CisgIEVYUEVDVF9FUSgiYXBwIiwgRmlsZVBhdGgoImFwcCIpLlJlbW92ZUV4dGVuc2lvbigiZXhlIikuc3RyaW5nKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgSXNEaXJlY3RvcnkpIHsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJjb2xhIikuSXNEaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJrb2FsYSIgR1RFU1RfUEFUSF9TRVBfKS5Jc0RpcmVjdG9yeSgpKTsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgia29hbGEvIikuSXNEaXJlY3RvcnkoKSk7CisjZW5kaWYKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIElzQWJzb2x1dGVQYXRoKSB7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiaXMiIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJjOlxcIiBHVEVTVF9QQVRIX1NFUF8gImlzX25vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfUEFUSF9TRVBfICJyZWxhdGl2ZSIpLklzQWJzb2x1dGVQYXRoKCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImM6Zm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIpLklzQWJzb2x1dGVQYXRoKCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiYzovIiBHVEVTVF9QQVRIX1NFUF8gImlzX25vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfUEFUSF9TRVBfICJyZWxhdGl2ZSIpLklzQWJzb2x1dGVQYXRoKCkpOworI2Vsc2UKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfICJpc19ub3QiIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKQorICAgICAgICAgICAgICAuSXNBYnNvbHV0ZVBhdGgoKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIElzUm9vdERpcmVjdG9yeSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImE6XFwiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJaOi8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJlOi8vIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIiIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJiOiIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJiOmEiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiODovIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImN8LyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyNlbHNlCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIvIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLy8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIlxcIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIi94IikuSXNSb290RGlyZWN0b3J5KCkpOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjZjUxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MKQEAgLTAsMCArMSwxNTQgQEAKKy8vIENvcHlyaWdodCAyMDAzLCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBEYW4gRWdub3IgKGVnbm9yQGdvb2dsZS5jb20pCisvLyBQb3J0ZWQgdG8gV2luZG93czogVmFkaW0gQmVybWFuICh2YWRpbWJAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIHRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjsKKworaW50IG51bTsKK01lc3NhZ2UqIGhpc3RvcnkgPSBOVUxMOworCisvLyBDbGFzcyB3aGljaCB0cmFja3MgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24KK2NsYXNzIEEgeworIHB1YmxpYzoKKyAgQSgpOiBteW51bShudW0rKykgeyAqaGlzdG9yeSA8PCAiQSIgPDwgbXludW0gPDwgIiBjdG9yXG4iOyB9CisgIHZpcnR1YWwgfkEoKSB7ICpoaXN0b3J5IDw8ICJBIiA8PCBteW51bSA8PCAiIGR0b3JcbiI7IH0KKyAgdmlydHVhbCB2b2lkIFVzZSgpIHsgKmhpc3RvcnkgPDwgIkEiIDw8IG15bnVtIDw8ICIgdXNlXG4iOyB9CisgcHJvdGVjdGVkOgorICBpbnQgbXludW07Cit9OworCisvLyBTdWJjbGFzcworY2xhc3MgQiA6IHB1YmxpYyBBIHsKKyBwdWJsaWM6CisgIEIoKSB7ICpoaXN0b3J5IDw8ICJCIiA8PCBteW51bSA8PCAiIGN0b3JcbiI7IH0KKyAgfkIoKSB7ICpoaXN0b3J5IDw8ICJCIiA8PCBteW51bSA8PCAiIGR0b3JcbiI7IH0KKyAgdmlydHVhbCB2b2lkIFVzZSgpIHsgKmhpc3RvcnkgPDwgIkIiIDw8IG15bnVtIDw8ICIgdXNlXG4iOyB9Cit9OworCitjbGFzcyBMaW5rZWRQdHJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgTGlua2VkUHRyVGVzdCgpIHsKKyAgICBudW0gPSAwOworICAgIGhpc3RvcnkgPSBuZXcgTWVzc2FnZTsKKyAgfQorCisgIHZpcnR1YWwgfkxpbmtlZFB0clRlc3QoKSB7CisgICAgZGVsZXRlIGhpc3Rvcnk7CisgICAgaGlzdG9yeSA9IE5VTEw7CisgIH0KK307CisKK1RFU1RfRihMaW5rZWRQdHJUZXN0LCBHZW5lcmFsVGVzdCkgeworICB7CisgICAgbGlua2VkX3B0cjxBPiBhMCwgYTEsIGEyOworICAgIC8vIFVzZSBleHBsaWNpdCBmdW5jdGlvbiBjYWxsIG5vdGF0aW9uIGhlcmUgdG8gc3VwcHJlc3Mgc2VsZi1hc3NpZ24gd2FybmluZy4KKyAgICBhMC5vcGVyYXRvcj0oYTApOworICAgIGExID0gYTI7CisgICAgQVNTRVJUX0VRKGEwLmdldCgpLCBzdGF0aWNfY2FzdDxBKj4oTlVMTCkpOworICAgIEFTU0VSVF9FUShhMS5nZXQoKSwgc3RhdGljX2Nhc3Q8QSo+KE5VTEwpKTsKKyAgICBBU1NFUlRfRVEoYTIuZ2V0KCksIHN0YXRpY19jYXN0PEEqPihOVUxMKSk7CisgICAgQVNTRVJUX1RSVUUoYTAgPT0gTlVMTCk7CisgICAgQVNTRVJUX1RSVUUoYTEgPT0gTlVMTCk7CisgICAgQVNTRVJUX1RSVUUoYTIgPT0gTlVMTCk7CisKKyAgICB7CisgICAgICBsaW5rZWRfcHRyPEE+IGEzKG5ldyBBKTsKKyAgICAgIGEwID0gYTM7CisgICAgICBBU1NFUlRfVFJVRShhMCA9PSBhMyk7CisgICAgICBBU1NFUlRfVFJVRShhMCAhPSBOVUxMKTsKKyAgICAgIEFTU0VSVF9UUlVFKGEwLmdldCgpID09IGEzKTsKKyAgICAgIEFTU0VSVF9UUlVFKGEwID09IGEzLmdldCgpKTsKKyAgICAgIGxpbmtlZF9wdHI8QT4gYTQoYTApOworICAgICAgYTEgPSBhNDsKKyAgICAgIGxpbmtlZF9wdHI8QT4gYTUobmV3IEEpOworICAgICAgQVNTRVJUX1RSVUUoYTUuZ2V0KCkgIT0gYTMpOworICAgICAgQVNTRVJUX1RSVUUoYTUgIT0gYTMuZ2V0KCkpOworICAgICAgYTIgPSBhNTsKKyAgICAgIGxpbmtlZF9wdHI8Qj4gYjAobmV3IEIpOworICAgICAgbGlua2VkX3B0cjxBPiBhNihiMCk7CisgICAgICBBU1NFUlRfVFJVRShiMCA9PSBhNik7CisgICAgICBBU1NFUlRfVFJVRShhNiA9PSBiMCk7CisgICAgICBBU1NFUlRfVFJVRShiMCAhPSBOVUxMKTsKKyAgICAgIGE1ID0gYjA7CisgICAgICBhNSA9IGIwOworICAgICAgYTMtPlVzZSgpOworICAgICAgYTQtPlVzZSgpOworICAgICAgYTUtPlVzZSgpOworICAgICAgYTYtPlVzZSgpOworICAgICAgYjAtPlVzZSgpOworICAgICAgKCpiMCkuVXNlKCk7CisgICAgICBiMC5nZXQoKS0+VXNlKCk7CisgICAgfQorCisgICAgYTAtPlVzZSgpOworICAgIGExLT5Vc2UoKTsKKyAgICBhMi0+VXNlKCk7CisKKyAgICBhMSA9IGEyOworICAgIGEyLnJlc2V0KG5ldyBBKTsKKyAgICBhMC5yZXNldCgpOworCisgICAgbGlua2VkX3B0cjxBPiBhNzsKKyAgfQorCisgIEFTU0VSVF9TVFJFUSgKKyAgICAiQTAgY3RvclxuIgorICAgICJBMSBjdG9yXG4iCisgICAgIkEyIGN0b3JcbiIKKyAgICAiQjIgY3RvclxuIgorICAgICJBMCB1c2VcbiIKKyAgICAiQTAgdXNlXG4iCisgICAgIkIyIHVzZVxuIgorICAgICJCMiB1c2VcbiIKKyAgICAiQjIgdXNlXG4iCisgICAgIkIyIHVzZVxuIgorICAgICJCMiB1c2VcbiIKKyAgICAiQjIgZHRvclxuIgorICAgICJBMiBkdG9yXG4iCisgICAgIkEwIHVzZVxuIgorICAgICJBMCB1c2VcbiIKKyAgICAiQTEgdXNlXG4iCisgICAgIkEzIGN0b3JcbiIKKyAgICAiQTAgZHRvclxuIgorICAgICJBMyBkdG9yXG4iCisgICAgIkExIGR0b3JcbiIsCisgICAgaGlzdG9yeS0+R2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK30gIC8vIFVubmFtZWQgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtbGlzdGVuZXJfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjYyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtbGlzdGVuZXJfdGVzdC5jYwpAQCAtMCwwICsxLDMxMCBAQAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgZmlsZSB2ZXJpZmllcyBHb29nbGUgVGVzdCBldmVudCBsaXN0ZW5lcnMgcmVjZWl2ZSBldmVudHMgYXQgdGhlCisvLyByaWdodCB0aW1lcy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudDsKK3VzaW5nIDo6dGVzdGluZzo6RW52aXJvbm1lbnQ7Cit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0Q2FzZTsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXI7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RJbmZvOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKKy8vIFVzZWQgYnkgdGVzdHMgdG8gcmVnaXN0ZXIgdGhlaXIgZXZlbnRzLgorc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBnX2V2ZW50cyA9IE5VTEw7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIEV2ZW50UmVjb3JkaW5nTGlzdGVuZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lcihjb25zdCBjaGFyKiBuYW1lKSA6IG5hbWVfKG5hbWUpIHt9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RQcm9ncmFtU3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgICAgTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UgPDwgR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdEl0ZXJhdGlvblN0YXJ0IikKKyAgICAgICAgICAgIDw8ICIoIiA8PCBpdGVyYXRpb24gPDwgIikiOworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2sobWVzc2FnZS5HZXRTdHJpbmcoKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1NldFVwRW5kIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdENhc2VTdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdFN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIC8qdGVzdF9wYXJ0X3Jlc3VsdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0UGFydFJlc3VsdCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RFbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdENhc2VFbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1RlYXJEb3duRW5kIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgICAgTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UgPDwgR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdEl0ZXJhdGlvbkVuZCIpCisgICAgICAgICAgICA8PCAiKCIgIDw8IGl0ZXJhdGlvbiA8PCAiKSI7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhtZXNzYWdlLkdldFN0cmluZygpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0UHJvZ3JhbUVuZCIpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgR2V0RnVsbE1ldGhvZE5hbWUoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBuYW1lXyArICIuIiArIG5hbWU7CisgIH0KKworICBzdGQ6OnN0cmluZyBuYW1lXzsKK307CisKK2NsYXNzIEVudmlyb25tZW50SW52b2NhdGlvbkNhdGNoZXIgOiBwdWJsaWMgRW52aXJvbm1lbnQgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkVudmlyb25tZW50OjpTZXRVcCIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkVudmlyb25tZW50OjpUZWFyRG93biIpOworICB9Cit9OworCitjbGFzcyBMaXN0ZW5lclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkxpc3RlbmVyVGVzdDo6U2V0VXBUZXN0Q2FzZSIpOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duVGVzdENhc2UiKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OlNldFVwIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIpOworICB9Cit9OworCitURVNUX0YoTGlzdGVuZXJUZXN0LCBEb2VzRm9vKSB7CisgIC8vIFRlc3QgZXhlY3V0aW9uIG9yZGVyIHdpdGhpbiBhIHRlc3QgY2FzZSBpcyBub3QgZ3VhcmFudGVlZCBzbyB3ZSBhcmUgbm90CisgIC8vIHJlY29yZGluZyB0aGUgdGVzdCBuYW1lLgorICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5Iik7CisgIFNVQ0NFRUQoKTsgIC8vIFRyaWdnZXJzIE9uVGVzdFBhcnRSZXN1bHQuCit9CisKK1RFU1RfRihMaXN0ZW5lclRlc3QsIERvZXNCYXIpIHsKKyAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIpOworICBTVUNDRUVEKCk7ICAvLyBUcmlnZ2VycyBPblRlc3RQYXJ0UmVzdWx0LgorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RW52aXJvbm1lbnRJbnZvY2F0aW9uQ2F0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV2ZW50UmVjb3JkaW5nTGlzdGVuZXI7CisKK3ZvaWQgVmVyaWZ5UmVzdWx0cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QqIGV4cGVjdGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX2RhdGFfc2l6ZSkgeworICBjb25zdCBpbnQgYWN0dWFsX3NpemUgPSBkYXRhLnNpemUoKTsKKyAgLy8gSWYgdGhlIGZvbGxvd2luZyBhc3NlcnRpb24gZmFpbHMsIGEgbmV3IGVudHJ5IHdpbGwgYmUgYXBwZW5kZWQgdG8KKyAgLy8gZGF0YS4gIEhlbmNlIHdlIHNhdmUgZGF0YS5zaXplKCkgZmlyc3QuCisgIEVYUEVDVF9FUShleHBlY3RlZF9kYXRhX3NpemUsIGFjdHVhbF9zaXplKTsKKworICAvLyBDb21wYXJlcyB0aGUgY29tbW9uIHByZWZpeC4KKyAgY29uc3QgaW50IHNob3J0ZXJfc2l6ZSA9IGV4cGVjdGVkX2RhdGFfc2l6ZSA8PSBhY3R1YWxfc2l6ZSA/CisgICAgICBleHBlY3RlZF9kYXRhX3NpemUgOiBhY3R1YWxfc2l6ZTsKKyAgaW50IGkgPSAwOworICBmb3IgKDsgaSA8IHNob3J0ZXJfc2l6ZTsgKytpKSB7CisgICAgQVNTRVJUX1NUUkVRKGV4cGVjdGVkX2RhdGFbaV0sIGRhdGFbaV0uY19zdHIoKSkKKyAgICAgICAgPDwgImF0IHBvc2l0aW9uICIgPDwgaTsKKyAgfQorCisgIC8vIFByaW50cyBleHRyYSBlbGVtZW50cyBpbiB0aGUgYWN0dWFsIGRhdGEuCisgIGZvciAoOyBpIDwgYWN0dWFsX3NpemU7ICsraSkgeworICAgIHByaW50ZigiICBBY3R1YWwgZXZlbnQgIyVkOiAlc1xuIiwgaSwgZGF0YVtpXS5jX3N0cigpKTsKKyAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGV2ZW50czsKKyAgZ19ldmVudHMgPSAmZXZlbnRzOworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLkFwcGVuZCgKKyAgICAgIG5ldyBFdmVudFJlY29yZGluZ0xpc3RlbmVyKCIxc3QiKSk7CisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5BcHBlbmQoCisgICAgICBuZXcgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lcigiMm5kIikpOworCisgIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRW52aXJvbm1lbnRJbnZvY2F0aW9uQ2F0Y2hlcik7CisKKyAgR1RFU1RfQ0hFQ0tfKGV2ZW50cy5zaXplKCkgPT0gMCkKKyAgICAgIDw8ICJBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQgc2hvdWxkIG5vdCBnZW5lcmF0ZSBhbnkgZXZlbnRzIGl0c2VsZi4iOworCisgIDo6dGVzdGluZzo6R1RFU1RfRkxBRyhyZXBlYXQpID0gMjsKKyAgaW50IHJldF92YWwgPSBSVU5fQUxMX1RFU1RTKCk7CisKKyAgY29uc3QgY2hhciogY29uc3QgZXhwZWN0ZWRfZXZlbnRzW10gPSB7CisgICAgIjFzdC5PblRlc3RQcm9ncmFtU3RhcnQiLAorICAgICIybmQuT25UZXN0UHJvZ3JhbVN0YXJ0IiwKKyAgICAiMXN0Lk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDApIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDApIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1NldFVwU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6U2V0VXAiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNTZXRVcEVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1NldFVwRW5kIiwKKyAgICAiMXN0Lk9uVGVzdENhc2VTdGFydCIsCisgICAgIjJuZC5PblRlc3RDYXNlU3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwVGVzdENhc2UiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duVGVzdENhc2UiLAorICAgICIybmQuT25UZXN0Q2FzZUVuZCIsCisgICAgIjFzdC5PblRlc3RDYXNlRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6VGVhckRvd24iLAorICAgICIybmQuT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvbkVuZCgwKSIsCisgICAgIjFzdC5PblRlc3RJdGVyYXRpb25FbmQoMCkiLAorICAgICIxc3QuT25UZXN0SXRlcmF0aW9uU3RhcnQoMSkiLAorICAgICIybmQuT25UZXN0SXRlcmF0aW9uU3RhcnQoMSkiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIsCisgICAgIkVudmlyb25tZW50OjpTZXRVcCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1NldFVwRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzU2V0VXBFbmQiLAorICAgICIxc3QuT25UZXN0Q2FzZVN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdENhc2VTdGFydCIsCisgICAgIkxpc3RlbmVyVGVzdDo6U2V0VXBUZXN0Q2FzZSIsCisgICAgIjFzdC5PblRlc3RTdGFydCIsCisgICAgIjJuZC5PblRlc3RTdGFydCIsCisgICAgIkxpc3RlbmVyVGVzdDo6U2V0VXAiLAorICAgICJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5IiwKKyAgICAiMXN0Lk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICIybmQuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd24iLAorICAgICIybmQuT25UZXN0RW5kIiwKKyAgICAiMXN0Lk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RTdGFydCIsCisgICAgIjJuZC5PblRlc3RTdGFydCIsCisgICAgIkxpc3RlbmVyVGVzdDo6U2V0VXAiLAorICAgICJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5IiwKKyAgICAiMXN0Lk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICIybmQuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd24iLAorICAgICIybmQuT25UZXN0RW5kIiwKKyAgICAiMXN0Lk9uVGVzdEVuZCIsCisgICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd25UZXN0Q2FzZSIsCisgICAgIjJuZC5PblRlc3RDYXNlRW5kIiwKKyAgICAiMXN0Lk9uVGVzdENhc2VFbmQiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIsCisgICAgIkVudmlyb25tZW50OjpUZWFyRG93biIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQiLAorICAgICIybmQuT25UZXN0SXRlcmF0aW9uRW5kKDEpIiwKKyAgICAiMXN0Lk9uVGVzdEl0ZXJhdGlvbkVuZCgxKSIsCisgICAgIjJuZC5PblRlc3RQcm9ncmFtRW5kIiwKKyAgICAiMXN0Lk9uVGVzdFByb2dyYW1FbmQiCisgIH07CisgIFZlcmlmeVJlc3VsdHMoZXZlbnRzLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2V2ZW50cywKKyAgICAgICAgICAgICAgICBzaXplb2YoZXhwZWN0ZWRfZXZlbnRzKS9zaXplb2YoZXhwZWN0ZWRfZXZlbnRzWzBdKSk7CisKKyAgLy8gV2UgbmVlZCB0byBjaGVjayBtYW51YWxseSBmb3IgYWQgaG9jIHRlc3QgZmFpbHVyZXMgdGhhdCBoYXBwZW4gYWZ0ZXIKKyAgLy8gUlVOX0FMTF9URVNUUyBmaW5pc2hlcy4KKyAgaWYgKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5GYWlsZWQoKSkKKyAgICByZXRfdmFsID0gMTsKKworICByZXR1cm4gcmV0X3ZhbDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1tZXNzYWdlX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTIzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjCkBAIC0wLDAgKzEsMTU5IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRlc3RzIGZvciB0aGUgTWVzc2FnZSBjbGFzcy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6dGVzdGluZzo6TWVzc2FnZTsKKworLy8gVGVzdHMgdGhlIHRlc3Rpbmc6Ok1lc3NhZ2UgY2xhc3MKKworLy8gVGVzdHMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCitURVNUKE1lc3NhZ2VUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgY29uc3QgTWVzc2FnZSBtc2c7CisgIEVYUEVDVF9FUSgiIiwgbXNnLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgdGhlIGNvcHkgY29uc3RydWN0b3IuCitURVNUKE1lc3NhZ2VUZXN0LCBDb3B5Q29uc3RydWN0b3IpIHsKKyAgY29uc3QgTWVzc2FnZSBtc2cxKCJIZWxsbyIpOworICBjb25zdCBNZXNzYWdlIG1zZzIobXNnMSk7CisgIEVYUEVDVF9FUSgiSGVsbG8iLCBtc2cyLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgTWVzc2FnZSBmcm9tIGEgQy1zdHJpbmcuCitURVNUKE1lc3NhZ2VUZXN0LCBDb25zdHJ1Y3RzRnJvbUNTdHJpbmcpIHsKKyAgTWVzc2FnZSBtc2coIkhlbGxvIik7CisgIEVYUEVDVF9FUSgiSGVsbG8iLCBtc2cuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBmbG9hdC4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNGbG9hdCkgeworICBjb25zdCBzdGQ6OnN0cmluZyBzID0gKE1lc3NhZ2UoKSA8PCAxLjIzNDU2RiA8PCAiICIgPDwgMi4zNDU2N0YpLkdldFN0cmluZygpOworICAvLyBCb3RoIG51bWJlcnMgc2hvdWxkIGJlIHByaW50ZWQgd2l0aCBlbm91Z2ggcHJlY2lzaW9uLgorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiMS4yMzQ1NjAiLCBzLmNfc3RyKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiIDIuMzQ1NjY5Iiwgcy5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgZG91YmxlLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0RvdWJsZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBzID0gKE1lc3NhZ2UoKSA8PCAxMjYwNTcwODgwLjQ1NTU0OTcgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTI2MDU3MjI2NS4xOTU0NTM0KS5HZXRTdHJpbmcoKTsKKyAgLy8gQm90aCBudW1iZXJzIHNob3VsZCBiZSBwcmludGVkIHdpdGggZW5vdWdoIHByZWNpc2lvbi4KKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIjEyNjA1NzA4ODAuNDUiLCBzLmNfc3RyKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiIDEyNjA1NzIyNjUuMTkiLCBzLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBub24tY2hhciBwb2ludGVyLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc1BvaW50ZXIpIHsKKyAgaW50IG4gPSAwOworICBpbnQqIHAgPSAmbjsKKyAgRVhQRUNUX05FKCIobnVsbCkiLCAoTWVzc2FnZSgpIDw8IHApLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgTlVMTCBub24tY2hhciBwb2ludGVyLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc051bGxQb2ludGVyKSB7CisgIGludCogcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiKG51bGwpIiwgKE1lc3NhZ2UoKSA8PCBwKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIEMgc3RyaW5nLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0NTdHJpbmcpIHsKKyAgRVhQRUNUX0VRKCJGb28iLCAoTWVzc2FnZSgpIDw8ICJGb28iKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIE5VTEwgQyBzdHJpbmcuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zTnVsbENTdHJpbmcpIHsKKyAgY2hhciogcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiKG51bGwpIiwgKE1lc3NhZ2UoKSA8PCBwKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBzdGQ6OnN0cmluZy4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNTdHJpbmcpIHsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIoIkhlbGxvIik7CisgIEVYUEVDVF9FUSgiSGVsbG8iLCAoTWVzc2FnZSgpIDw8IHN0cikuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBvdXRwdXQgc3RyaW5ncyBjb250YWluaW5nIGVtYmVkZGVkIE5VTHMuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zU3RyaW5nV2l0aEVtYmVkZGVkTlVMKSB7CisgIGNvbnN0IGNoYXIgY2hhcl9hcnJheV93aXRoX251bFtdID0KKyAgICAgICJIZXJlJ3MgYSBOVUxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyI7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyaW5nX3dpdGhfbnVsKGNoYXJfYXJyYXlfd2l0aF9udWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyX2FycmF5X3dpdGhfbnVsKSAtIDEpOworICBFWFBFQ1RfRVEoIkhlcmUncyBhIE5VTFxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyIsCisgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IHN0cmluZ193aXRoX251bCkuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBOVUwgY2hhci4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNOVUxDaGFyKSB7CisgIEVYUEVDVF9FUSgiXFwwIiwgKE1lc3NhZ2UoKSA8PCAnXDAnKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBpbnQuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zSW50KSB7CisgIEVYUEVDVF9FUSgiMTIzIiwgKE1lc3NhZ2UoKSA8PCAxMjMpLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgY2FuIGJlCisvLyBzdHJlYW1lZCB0byBNZXNzYWdlLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0Jhc2ljSW9NYW5pcCkgeworICBFWFBFQ1RfRVEoIkxpbmUgMS5cbkEgTlVMIGNoYXIgXFwwIGluIGxpbmUgMi4iLAorICAgICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCAiTGluZSAxLiIgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkEgTlVMIGNoYXIgIiA8PCBzdGQ6OmVuZHMgPDwgc3RkOjpmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gbGluZSAyLiIpLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgTWVzc2FnZTo6R2V0U3RyaW5nKCkKK1RFU1QoTWVzc2FnZVRlc3QsIEdldFN0cmluZykgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IDEgPDwgIiBsYW1iIjsKKyAgRVhQRUNUX0VRKCIxIGxhbWIiLCBtc2cuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBNZXNzYWdlIG9iamVjdCB0byBhbiBvc3RyZWFtLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc1RvT1N0cmVhbSkgeworICBNZXNzYWdlIG1zZygiSGVsbG8iKTsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgbXNnOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzcykpOworfQorCisvLyBUZXN0cyB0aGF0IGEgTWVzc2FnZSBvYmplY3QgZG9lc24ndCB0YWtlIHVwIHRvbyBtdWNoIHN0YWNrIHNwYWNlLgorVEVTVChNZXNzYWdlVGVzdCwgRG9lc05vdFRha2VVcE11Y2hTdGFja1NwYWNlKSB7CisgIEVYUEVDVF9MRShzaXplb2YoTWVzc2FnZSksIDE2VSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1vcHRpb25zX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4NmRjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1vcHRpb25zX3Rlc3QuY2MKQEAgLTAsMCArMSwyMTUgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisvLworLy8gR29vZ2xlIFRlc3QgVW5pdFRlc3RPcHRpb25zIHRlc3RzCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBmcm9tIGd0ZXN0LmNjLCB0byBhdm9pZCBjaGFuZ2luZyBidWlsZCBvcgorLy8gbWFrZS1maWxlcyBvbiBXaW5kb3dzIGFuZCBvdGhlciBwbGF0Zm9ybXMuIERvIG5vdCAjaW5jbHVkZSB0aGlzIGZpbGUKKy8vIGFueXdoZXJlIGVsc2UhCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCisvLyBUdXJucyB0aGUgZ2l2ZW4gcmVsYXRpdmUgcGF0aCBpbnRvIGFuIGFic29sdXRlIHBhdGguCitGaWxlUGF0aCBHZXRBYnNvbHV0ZVBhdGhPZihjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCkgeworICByZXR1cm4gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCksIHJlbGF0aXZlX3BhdGgpOworfQorCisvLyBUZXN0aW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0L0dldE91dHB1dEZpbGUuCisKK1RFU1QoWG1sT3V0cHV0VGVzdCwgR2V0T3V0cHV0Rm9ybWF0RGVmYXVsdCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgRVhQRUNUX1NUUkVRKCIiLCBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpLmNfc3RyKCkpOworfQorCitURVNUKFhtbE91dHB1dFRlc3QsIEdldE91dHB1dEZvcm1hdCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZpbGVuYW1lIjsKKyAgRVhQRUNUX1NUUkVRKCJ4bWwiLCBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpLmNfc3RyKCkpOworfQorCitURVNUKFhtbE91dHB1dFRlc3QsIEdldE91dHB1dEZpbGVEZWZhdWx0KSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICIiOworICBFWFBFQ1RfRVEoR2V0QWJzb2x1dGVQYXRoT2YoRmlsZVBhdGgoInRlc3RfZGV0YWlsLnhtbCIpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkpOworfQorCitURVNUKFhtbE91dHB1dFRlc3QsIEdldE91dHB1dEZpbGVTaW5nbGVGaWxlKSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6ZmlsZW5hbWUuYWJjIjsKKyAgRVhQRUNUX0VRKEdldEFic29sdXRlUGF0aE9mKEZpbGVQYXRoKCJmaWxlbmFtZS5hYmMiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlRnJvbURpcmVjdG9yeVBhdGgpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpwYXRoIiBHVEVTVF9QQVRIX1NFUF87CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX291dHB1dF9maWxlID0KKyAgICAgIEdldEFic29sdXRlUGF0aE9mKAorICAgICAgICAgIEZpbGVQYXRoKHN0ZDo6c3RyaW5nKCJwYXRoIikgKyBHVEVTVF9QQVRIX1NFUF8gKworICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpICsgIi54bWwiKSkuc3RyaW5nKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZmlsZSA9CisgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgRVhQRUNUX1NUUkNBU0VFUShleHBlY3RlZF9vdXRwdXRfZmlsZS5jX3N0cigpLCBvdXRwdXRfZmlsZS5jX3N0cigpKTsKKyNlbHNlCisgIEVYUEVDVF9FUShleHBlY3RlZF9vdXRwdXRfZmlsZSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZW5kaWYKK30KKworVEVTVChPdXRwdXRGaWxlSGVscGVyc1Rlc3QsIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBleGVfc3RyID0gR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkuc3RyaW5nKCk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBjb25zdCBib29sIHN1Y2Nlc3MgPQorICAgICAgX3N0cmNtcGkoImd0ZXN0LW9wdGlvbnNfdGVzdCIsIGV4ZV9zdHIuY19zdHIoKSkgPT0gMCB8fAorICAgICAgX3N0cmNtcGkoImd0ZXN0LW9wdGlvbnMtZXhfdGVzdCIsIGV4ZV9zdHIuY19zdHIoKSkgPT0gMCB8fAorICAgICAgX3N0cmNtcGkoImd0ZXN0X2FsbF90ZXN0IiwgZXhlX3N0ci5jX3N0cigpKSA9PSAwIHx8CisgICAgICBfc3RyY21waSgiZ3Rlc3RfZGxsX3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDA7CisjZWxzZQorICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVtb3ZlIHRoZSBoYXJkLWNvZGVkICJsdC0iIHByZWZpeCB3aGVuCisgIC8vICAgQ2hhbmRsZXIgQ2FycnV0aCdzIGxpYnRvb2wgcmVwbGFjZW1lbnQgaXMgcmVhZHkuCisgIGNvbnN0IGJvb2wgc3VjY2VzcyA9CisgICAgICBleGVfc3RyID09ICJndGVzdC1vcHRpb25zX3Rlc3QiIHx8CisgICAgICBleGVfc3RyID09ICJndGVzdF9hbGxfdGVzdCIgfHwKKyAgICAgIGV4ZV9zdHIgPT0gImx0LWd0ZXN0X2FsbF90ZXN0IiB8fAorICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3RfZGxsX3Rlc3QiOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIGlmICghc3VjY2VzcykKKyAgICBGQUlMKCkgPDwgIkdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpIHJldHVybnMgIiA8PCBleGVfc3RyOworfQorCitjbGFzcyBYbWxPdXRwdXRDaGFuZ2VEaXJUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXyA9IEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCk7CisgICAgcG9zaXg6OkNoRGlyKCIuLiIpOworICAgIC8vIFRoaXMgd2lsbCBtYWtlIHRoZSB0ZXN0IGZhaWwgaWYgcnVuIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LgorICAgIEVYUEVDVF9ORShvcmlnaW5hbF93b3JraW5nX2Rpcl8uc3RyaW5nKCksCisgICAgICAgICAgICAgIEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkuc3RyaW5nKCkpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHBvc2l4OjpDaERpcihvcmlnaW5hbF93b3JraW5nX2Rpcl8uc3RyaW5nKCkuY19zdHIoKSk7CisgIH0KKworICBGaWxlUGF0aCBvcmlnaW5hbF93b3JraW5nX2Rpcl87Cit9OworCitURVNUX0YoWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCwgUHJlc2VydmVPcmlnaW5hbFdvcmtpbmdEaXJXaXRoRGVmYXVsdCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgRVhQRUNUX0VRKEZpbGVQYXRoOjpDb25jYXRQYXRocyhvcmlnaW5hbF93b3JraW5nX2Rpcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoInRlc3RfZGV0YWlsLnhtbCIpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkpOworfQorCitURVNUX0YoWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCwgUHJlc2VydmVPcmlnaW5hbFdvcmtpbmdEaXJXaXRoRGVmYXVsdFhNTCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sIjsKKyAgRVhQRUNUX0VRKEZpbGVQYXRoOjpDb25jYXRQYXRocyhvcmlnaW5hbF93b3JraW5nX2Rpcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoInRlc3RfZGV0YWlsLnhtbCIpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkpOworfQorCitURVNUX0YoWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCwgUHJlc2VydmVPcmlnaW5hbFdvcmtpbmdEaXJXaXRoUmVsYXRpdmVGaWxlKSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6ZmlsZW5hbWUuYWJjIjsKKyAgRVhQRUNUX0VRKEZpbGVQYXRoOjpDb25jYXRQYXRocyhvcmlnaW5hbF93b3JraW5nX2Rpcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImZpbGVuYW1lLmFiYyIpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkpOworfQorCitURVNUX0YoWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCwgUHJlc2VydmVPcmlnaW5hbFdvcmtpbmdEaXJXaXRoUmVsYXRpdmVQYXRoKSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6cGF0aCIgR1RFU1RfUEFUSF9TRVBfOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9CisgICAgICBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICAgICAgb3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgIEZpbGVQYXRoKHN0ZDo6c3RyaW5nKCJwYXRoIikgKyBHVEVTVF9QQVRIX1NFUF8gKworICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpICsgIi54bWwiKSkuc3RyaW5nKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZmlsZSA9CisgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgRVhQRUNUX1NUUkNBU0VFUShleHBlY3RlZF9vdXRwdXRfZmlsZS5jX3N0cigpLCBvdXRwdXRfZmlsZS5jX3N0cigpKTsKKyNlbHNlCisgIEVYUEVDVF9FUShleHBlY3RlZF9vdXRwdXRfZmlsZSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZW5kaWYKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aEFic29sdXRlRmlsZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpjOlxcdG1wXFxmaWxlbmFtZS5hYmMiOworICBFWFBFQ1RfRVEoRmlsZVBhdGgoImM6XFx0bXBcXGZpbGVuYW1lLmFiYyIpLnN0cmluZygpLAorICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSk7CisjZWxzZQorICBHVEVTVF9GTEFHKG91dHB1dCkgPSJ4bWw6L3RtcC9maWxlbmFtZS5hYmMiOworICBFWFBFQ1RfRVEoRmlsZVBhdGgoIi90bXAvZmlsZW5hbWUuYWJjIikuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKKyNlbmRpZgorfQorCitURVNUX0YoWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCwgUHJlc2VydmVPcmlnaW5hbFdvcmtpbmdEaXJXaXRoQWJzb2x1dGVQYXRoKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBjb25zdCBzdGQ6OnN0cmluZyBwYXRoID0gImM6XFx0bXBcXCI7CisjZWxzZQorICBjb25zdCBzdGQ6OnN0cmluZyBwYXRoID0gIi90bXAvIjsKKyNlbmRpZgorCisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6IiArIHBhdGg7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX291dHB1dF9maWxlID0KKyAgICAgIHBhdGggKyBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArICIueG1sIjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dF9maWxlID0KKyAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZWxzZQorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc4MmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBiYXNpYyBjb25zdHJ1Y3RzIG9mCisvLyBHb29nbGUgVGVzdCB3b3JrLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgInRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlczsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yOworCisvLyBUZXN0cyB0aGF0IGdlbmVyYXRvcnMgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0CisvLyBhcmUgZnVuY3Rpb25hbC4gVGhlIHRlc3QgdXNpbmcgZXh0ZXJuX2dlbiBpcyBkZWZpbmVkCisvLyBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MuCitQYXJhbUdlbmVyYXRvcjxpbnQ+IGV4dGVybl9nZW4gPSBWYWx1ZXMoMzMpOworCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgaW4gb25lIHRyYW5zbGF0aW9uIHVuaXQKKy8vIGFuZCBpbnN0YW50aWF0ZWQgaW4gYW5vdGhlci4gVGhlIHRlc3QgaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MKKy8vIGFuZCBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0IGZpeHR1cmUgY2xhc3MgaXMgZGVmaW5lZCBpbgorLy8gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmguCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChNdWx0aXBsZXNPZjMzLAorICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygzMywgNjYpKTsKKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBpbnN0YW50aWF0ZWQKKy8vIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzLiBBbm90aGVyIGluc3RhbnRpYXRpb24gaXMgZGVmaW5lZAorLy8gaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIGFuZCBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QKKy8vIGZpeHR1cmUgaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaAorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDQyKjMsIDQyKjQsIDQyKjUpKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwY2I4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MKQEAgLTAsMCArMSw5MDQgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZi4gVGhpcyBmaWxlIHZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycyBvYmplY3RzIHByb2R1Y2UgY29ycmVjdCBwYXJhbWV0ZXIgc2VxdWVuY2VzIGFuZCB0aGF0CisvLyBHb29nbGUgVGVzdCBydW50aW1lIGluc3RhbnRpYXRlcyBjb3JyZWN0IHRlc3RzIGZyb20gdGhvc2Ugc2VxdWVuY2VzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyMgaW5jbHVkZSA8YWxnb3JpdGhtPgorIyBpbmNsdWRlIDxpb3N0cmVhbT4KKyMgaW5jbHVkZSA8bGlzdD4KKyMgaW5jbHVkZSA8c3N0cmVhbT4KKyMgaW5jbHVkZSA8c3RyaW5nPgorIyBpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRvIGluY2x1ZGUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmguCisjIGRlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorIyBpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiICAvLyBmb3IgVW5pdFRlc3RPcHRpb25zCisjIHVuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjIGluY2x1ZGUgInRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgiCisKK3VzaW5nIDo6c3RkOjp2ZWN0b3I7Cit1c2luZyA6OnN0ZDo6c29ydDsKKwordXNpbmcgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQ7Cit1c2luZyA6OnRlc3Rpbmc6OkJvb2w7Cit1c2luZyA6OnRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyA6OnRlc3Rpbmc6OlJhbmdlOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtOwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlc0luOworCisjIGlmIEdURVNUX0hBU19DT01CSU5FCit1c2luZyA6OnRlc3Rpbmc6OkNvbWJpbmU7Cit1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7Cit1c2luZyA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlOwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGU7CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczsKKworLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcuCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbW92ZSBQcmludFZhbHVlKCkgd2hlbiB3ZSBtb3ZlIG1hdGNoZXJzIGFuZAorLy8gRVhQRUNUX1RIQVQoKSBmcm9tIEdvb2dsZSBNb2NrIHRvIEdvb2dsZSBUZXN0LiAgQXQgdGhhdCB0aW1lLCB3ZQorLy8gY2FuIHdyaXRlIEVYUEVDVF9USEFUKHgsIEVxKHkpKSB0byBjb21wYXJlIHR3byB0dXBsZXMgeCBhbmQgeSwgYXMKKy8vIEVYUEVDVF9USEFUKCkgYW5kIHRoZSBtYXRjaGVycyBrbm93IGhvdyB0byBwcmludCB0dXBsZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgc3RyZWFtIDw8IHZhbHVlOworICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFRoZXNlIG92ZXJsb2FkcyBhbGxvdyBwcmludGluZyB0dXBsZXMgaW4gb3VyIHRlc3RzLiAgV2UgY2Fubm90CisvLyBkZWZpbmUgYW4gb3BlcmF0b3I8PCBmb3IgdHVwbGVzLCBhcyB0aGF0IGRlZmluaXRpb24gbmVlZHMgdG8gYmUgaW4KKy8vIHRoZSBzdGQgbmFtZXNwYWNlIGluIG9yZGVyIHRvIGJlIHBpY2tlZCB1cCBieSBHb29nbGUgVGVzdCB2aWEKKy8vIEFyZ3VtZW50LURlcGVuZGVudCBMb29rdXAsIHlldCBkZWZpbmluZyBhbnl0aGluZyBpbiB0aGUgc3RkCisvLyBuYW1lc3BhY2UgaW4gbm9uLVNUTCBjb2RlIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKzo6c3RkOjpzdHJpbmcgUHJpbnRWYWx1ZShjb25zdCB0dXBsZTxUMSwgVDI+JiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgc3RyZWFtIDw8ICIoIiA8PCBnZXQ8MD4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDE+KHZhbHVlKSA8PCAiKSI7CisgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorOjpzdGQ6OnN0cmluZyBQcmludFZhbHVlKGNvbnN0IHR1cGxlPFQxLCBUMiwgVDM+JiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgc3RyZWFtIDw8ICIoIiA8PCBnZXQ8MD4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDE+KHZhbHVlKQorICAgICAgICAgPDwgIiwgIjw8IGdldDwyPih2YWx1ZSkgPDwgIikiOworICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Cis6OnN0ZDo6c3RyaW5nIFByaW50VmFsdWUoCisgICAgY29uc3QgdHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgIHN0cmVhbSA8PCAiKCIgPDwgZ2V0PDA+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwxPih2YWx1ZSkKKyAgICAgICAgIDw8ICIsICI8PCBnZXQ8Mj4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDM+KHZhbHVlKQorICAgICAgICAgPDwgIiwgIjw8IGdldDw0Pih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8NT4odmFsdWUpCisgICAgICAgICA8PCAiLCAiPDwgZ2V0PDY+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDw3Pih2YWx1ZSkKKyAgICAgICAgIDw8ICIsICI8PCBnZXQ8OD4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDk+KHZhbHVlKSA8PCAiKSI7CisgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFZlcmlmaWVzIHRoYXQgYSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGdlbmVyYXRvciBhbmQgYWNjZXNzZWQKKy8vIHZpYSB0aGUgaXRlcmF0b3Igb2JqZWN0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIG9uZSB1c2luZyBHb29nbGUgVGVzdAorLy8gYXNzZXJ0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3ZvaWQgVmVyaWZ5R2VuZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ+JiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUICgmZXhwZWN0ZWRfdmFsdWVzKVtOXSkgeworICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUPjo6aXRlcmF0b3IgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICBBU1NFUlRfRkFMU0UoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKQorICAgICAgICA8PCAiQXQgZWxlbWVudCAiIDw8IGkgPDwgIiB3aGVuIGFjY2Vzc2luZyB2aWEgYW4gaXRlcmF0b3IgIgorICAgICAgICA8PCAiY3JlYXRlZCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yLlxuIjsKKyAgICAvLyBXZSBjYW5ub3QgdXNlIEVYUEVDVF9FUSgpIGhlcmUgYXMgdGhlIHZhbHVlcyBtYXkgYmUgdHVwbGVzLAorICAgIC8vIHdoaWNoIGRvbid0IHN1cHBvcnQgPDwuCisgICAgRVhQRUNUX1RSVUUoZXhwZWN0ZWRfdmFsdWVzW2ldID09ICppdCkKKyAgICAgICAgPDwgIndoZXJlIGkgaXMgIiA8PCBpCisgICAgICAgIDw8ICIsIGV4cGVjdGVkX3ZhbHVlc1tpXSBpcyAiIDw8IFByaW50VmFsdWUoZXhwZWN0ZWRfdmFsdWVzW2ldKQorICAgICAgICA8PCAiLCAqaXQgaXMgIiA8PCBQcmludFZhbHVlKCppdCkKKyAgICAgICAgPDwgIiwgYW5kICdpdCcgaXMgYW4gaXRlcmF0b3IgY3JlYXRlZCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yLlxuIjsKKyAgICBpdCsrOworICB9CisgIEVYUEVDVF9UUlVFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKKyAgICAgICAgPDwgIkF0IHRoZSBwcmVzdW1lZCBlbmQgb2Ygc2VxdWVuY2Ugd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKKyAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3Rvci5cbiI7CisKKyAgLy8gVGVzdCB0aGUgaXRlcmF0b3IgYXNzaWdubWVudC4gVGhlIGZvbGxvd2luZyBsaW5lcyB2ZXJpZnkgdGhhdAorICAvLyB0aGUgc2VxdWVuY2UgYWNjZXNzZWQgdmlhIGFuIGl0ZXJhdG9yIGluaXRpYWxpemVkIHZpYSB0aGUKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvciAoYXMgb3Bwb3NlZCB0byBhIGNvcHkgY29uc3RydWN0b3IpIG1hdGNoZXMKKyAgLy8ganVzdCB0aGUgc2FtZS4KKyAgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICBBU1NFUlRfRkFMU0UoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKQorICAgICAgICA8PCAiQXQgZWxlbWVudCAiIDw8IGkgPDwgIiB3aGVuIGFjY2Vzc2luZyB2aWEgYW4gaXRlcmF0b3IgIgorICAgICAgICA8PCAiY3JlYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLlxuIjsKKyAgICBFWFBFQ1RfVFJVRShleHBlY3RlZF92YWx1ZXNbaV0gPT0gKml0KQorICAgICAgICA8PCAid2hlcmUgaSBpcyAiIDw8IGkKKyAgICAgICAgPDwgIiwgZXhwZWN0ZWRfdmFsdWVzW2ldIGlzICIgPDwgUHJpbnRWYWx1ZShleHBlY3RlZF92YWx1ZXNbaV0pCisgICAgICAgIDw8ICIsICppdCBpcyAiIDw8IFByaW50VmFsdWUoKml0KQorICAgICAgICA8PCAiLCBhbmQgJ2l0JyBpcyBhbiBpdGVyYXRvciBjcmVhdGVkIHdpdGggdGhlIGNvcHkgY29uc3RydWN0b3IuXG4iOworICAgIGl0Kys7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKQorICAgICAgICA8PCAiQXQgdGhlIHByZXN1bWVkIGVuZCBvZiBzZXF1ZW5jZSB3aGVuIGFjY2Vzc2luZyB2aWEgYW4gaXRlcmF0b3IgIgorICAgICAgICA8PCAiY3JlYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLlxuIjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoY29uc3QgUGFyYW1HZW5lcmF0b3I8VD4mIGdlbmVyYXRvcikgeworICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUPjo6aXRlcmF0b3IgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgRVhQRUNUX1RSVUUoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKTsKKworICBpdCA9IGdlbmVyYXRvci5iZWdpbigpOworICBFWFBFQ1RfVFJVRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpOworfQorCisvLyBHZW5lcmF0b3IgdGVzdHMuIFRoZXkgdGVzdCB0aGF0IGVhY2ggb2YgdGhlIHByb3ZpZGVkIGdlbmVyYXRvciBmdW5jdGlvbnMKKy8vIGdlbmVyYXRlcyBhbiBleHBlY3RlZCBzZXF1ZW5jZSBvZiB2YWx1ZXMuIFRoZSBnZW5lcmFsIHRlc3QgcGF0dGVybgorLy8gaW5zdGFudGlhdGVzIGEgZ2VuZXJhdG9yIHVzaW5nIG9uZSBvZiB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9ucywKKy8vIGNoZWNrcyB0aGUgc2VxdWVuY2UgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvciB1c2luZyBpdHMgaXRlcmF0b3IgQVBJLAorLy8gYW5kIHRoZW4gcmVzZXRzIHRoZSBpdGVyYXRvciBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlcXVlbmNlCisvLyBhbmQgY2hlY2tzIHRoZSBzZXF1ZW5jZSBhZ2Fpbi4KKworLy8gVGVzdHMgdGhhdCBpdGVyYXRvcnMgcHJvZHVjZWQgYnkgZ2VuZXJhdG9yIGZ1bmN0aW9ucyBjb25mb3JtIHRvIHRoZQorLy8gRm9yd2FyZEl0ZXJhdG9yIGNvbmNlcHQuCitURVNUKEl0ZXJhdG9yVGVzdCwgUGFyYW1JdGVyYXRvckNvbmZvcm1zVG9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0KSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMTApOworICBQYXJhbUdlbmVyYXRvcjxpbnQ+OjppdGVyYXRvciBpdCA9IGdlbi5iZWdpbigpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgaXRlcmF0b3IgaW5pdGlhbGl6YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQuCisgIFBhcmFtR2VuZXJhdG9yPGludD46Oml0ZXJhdG9yIGl0MiA9IGl0OworICBFWFBFQ1RfVFJVRSgqaXQgPT0gKml0MikgPDwgIkluaXRpYWxpemVkIGl0ZXJhdG9ycyBtdXN0IHBvaW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZWxlbWVudCBzYW1lIGFzIGl0cyBzb3VyY2UgcG9pbnRzIHRvIjsKKworICAvLyBWZXJpZmllcyB0aGF0IGl0ZXJhdG9yIGFzc2lnbm1lbnQgd29ya3MgYXMgZXhwZWN0ZWQuCisgIGl0Kys7CisgIEVYUEVDVF9GQUxTRSgqaXQgPT0gKml0Mik7CisgIGl0MiA9IGl0OworICBFWFBFQ1RfVFJVRSgqaXQgPT0gKml0MikgPDwgIkFzc2lnbmVkIGl0ZXJhdG9ycyBtdXN0IHBvaW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZWxlbWVudCBzYW1lIGFzIGl0cyBzb3VyY2UgcG9pbnRzIHRvIjsKKworICAvLyBWZXJpZmllcyB0aGF0IHByZWZpeCBvcGVyYXRvcisrKCkgcmV0dXJucyAqdGhpcy4KKyAgRVhQRUNUX0VRKCZpdCwgJigrK2l0KSkgPDwgIlJlc3VsdCBvZiB0aGUgcHJlZml4IG9wZXJhdG9yKysgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJyZWZlciB0byB0aGUgb3JpZ2luYWwgb2JqZWN0IjsKKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIHBvc3RmaXggb3BlcmF0b3IrKyBwb2ludHMgdG8gdGhlIHZhbHVlCisgIC8vIHBvaW50ZWQgdG8gYnkgdGhlIG9yaWdpbmFsIGl0ZXJhdG9yLgorICBpbnQgb3JpZ2luYWxfdmFsdWUgPSAqaXQ7ICAvLyBIYXZlIHRvIGNvbXB1dGUgaXQgb3V0c2lkZSBvZiBtYWNybyBjYWxsIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYWZmZWN0ZWQgYnkgdGhlIHBhcmFtZXRlciBldmFsdWF0aW9uIG9yZGVyLgorICBFWFBFQ1RfRVEob3JpZ2luYWxfdmFsdWUsICooaXQrKykpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgcHJlZml4IGFuZCBwb3N0Zml4IG9wZXJhdG9yKysoKSBhZHZhbmNlIGFuIGl0ZXJhdG9yCisgIC8vIGFsbCB0aGUgc2FtZS4KKyAgaXQyID0gaXQ7CisgIGl0Kys7CisgICsraXQyOworICBFWFBFQ1RfVFJVRSgqaXQgPT0gKml0Mik7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmFuZ2UoKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlV2l0aERlZmF1bHRTdGVwKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMyk7CisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHswLCAxLCAyfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFJhbmdlKCkgZ2VuZXJhdGVzIHRoZSBzaW5nbGUgZWxlbWVudCBzZXF1ZW5jZQorLy8gYXMgZXhwZWN0ZWQgd2hlbiBwcm92aWRlZCB3aXRoIHJhbmdlIGxpbWl0cyB0aGF0IGFyZSBlcXVhbC4KK1RFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVNpbmdsZVZhbHVlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMSk7CisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHswfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFJhbmdlKCkgd2l0aCBnZW5lcmF0ZXMgZW1wdHkgc2VxdWVuY2Ugd2hlbgorLy8gc3VwcGxpZWQgd2l0aCBhbiBlbXB0eSByYW5nZS4KK1RFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZUVtcHR5KSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgMCk7CisgIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKK30KKworLy8gVGVzdHMgdGhhdCBSYW5nZSgpIHdpdGggY3VzdG9tIHN0ZXAgKGdyZWF0ZXIgdGhlbiBvbmUpIGdlbmVyYXRlcworLy8gdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlV2l0aEN1c3RvbVN0ZXApIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCA5LCAzKTsKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezAsIDMsIDZ9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IFJhbmdlKCkgd2l0aCBjdXN0b20gc3RlcCAoZ3JlYXRlciB0aGVuIG9uZSkgZ2VuZXJhdGVzCisvLyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugd2hlbiB0aGUgbGFzdCBlbGVtZW50IGRvZXMgbm90IGZhbGwgb24gdGhlCisvLyB1cHBlciByYW5nZSBsaW1pdC4gU2VxdWVuY2VzIGdlbmVyYXRlZCBieSBSYW5nZSgpIG11c3Qgbm90IGhhdmUKKy8vIGVsZW1lbnRzIGJleW9uZCB0aGUgcmFuZ2UgbGltaXRzLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlV2l0aEN1c3RvbVN0ZXBPdmVyVXBwZXJCb3VuZCkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDQsIDMpOworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MCwgM307CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgUmFuZ2Ugd29ya3Mgd2l0aCB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBkZWZpbmUKKy8vIGNvcHkgY29uc3RydWN0b3IsIG9wZXJhdG9yPSgpLCBvcGVyYXRvcisoKSwgYW5kIG9wZXJhdG9yPCgpLgorY2xhc3MgRG9nQWRkZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRG9nQWRkZXIoY29uc3QgY2hhciogYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KKyAgRG9nQWRkZXIoY29uc3QgRG9nQWRkZXImIG90aGVyKSA6IHZhbHVlXyhvdGhlci52YWx1ZV8uY19zdHIoKSkge30KKworICBEb2dBZGRlciBvcGVyYXRvcj0oY29uc3QgRG9nQWRkZXImIG90aGVyKSB7CisgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgdmFsdWVfID0gb3RoZXIudmFsdWVfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBEb2dBZGRlciBvcGVyYXRvcisoY29uc3QgRG9nQWRkZXImIG90aGVyKSBjb25zdCB7CisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8IHZhbHVlXy5jX3N0cigpIDw8IG90aGVyLnZhbHVlXy5jX3N0cigpOworICAgIHJldHVybiBEb2dBZGRlcihtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRG9nQWRkZXImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyA8IG90aGVyLnZhbHVlXzsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIHZhbHVlXzsKK307CisKK1RFU1QoUmFuZ2VUZXN0LCBXb3Jrc1dpdGhBQ3VzdG9tVHlwZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxEb2dBZGRlcj4gZ2VuID0KKyAgICAgIFJhbmdlKERvZ0FkZGVyKCJjYXQiKSwgRG9nQWRkZXIoImNhdGRvZ2RvZyIpLCBEb2dBZGRlcigiZG9nIikpOworICBQYXJhbUdlbmVyYXRvcjxEb2dBZGRlcj46Oml0ZXJhdG9yIGl0ID0gZ2VuLmJlZ2luKCk7CisKKyAgQVNTRVJUX0ZBTFNFKGl0ID09IGdlbi5lbmQoKSk7CisgIEVYUEVDVF9TVFJFUSgiY2F0IiwgaXQtPnZhbHVlKCkuY19zdHIoKSk7CisKKyAgQVNTRVJUX0ZBTFNFKCsraXQgPT0gZ2VuLmVuZCgpKTsKKyAgRVhQRUNUX1NUUkVRKCJjYXRkb2ciLCBpdC0+dmFsdWUoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfVFJVRSgrK2l0ID09IGdlbi5lbmQoKSk7Cit9CisKK2NsYXNzIEludFdyYXBwZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW50V3JhcHBlcihpbnQgYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KKyAgSW50V3JhcHBlcihjb25zdCBJbnRXcmFwcGVyJiBvdGhlcikgOiB2YWx1ZV8ob3RoZXIudmFsdWVfKSB7fQorCisgIEludFdyYXBwZXIgb3BlcmF0b3I9KGNvbnN0IEludFdyYXBwZXImIG90aGVyKSB7CisgICAgdmFsdWVfID0gb3RoZXIudmFsdWVfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLyBvcGVyYXRvcisoKSBhZGRzIGEgZGlmZmVyZW50IHR5cGUuCisgIEludFdyYXBwZXIgb3BlcmF0b3IrKGludCBvdGhlcikgY29uc3QgeyByZXR1cm4gSW50V3JhcHBlcih2YWx1ZV8gKyBvdGhlcik7IH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50V3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfIDwgb3RoZXIudmFsdWVfOworICB9CisgIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgcHJpdmF0ZToKKyAgaW50IHZhbHVlXzsKK307CisKK1RFU1QoUmFuZ2VUZXN0LCBXb3Jrc1dpdGhBQ3VzdG9tVHlwZVdpdGhEaWZmZXJlbnRJbmNyZW1lbnRUeXBlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPEludFdyYXBwZXI+IGdlbiA9IFJhbmdlKEludFdyYXBwZXIoMCksIEludFdyYXBwZXIoMikpOworICBQYXJhbUdlbmVyYXRvcjxJbnRXcmFwcGVyPjo6aXRlcmF0b3IgaXQgPSBnZW4uYmVnaW4oKTsKKworICBBU1NFUlRfRkFMU0UoaXQgPT0gZ2VuLmVuZCgpKTsKKyAgRVhQRUNUX0VRKDAsIGl0LT52YWx1ZSgpKTsKKworICBBU1NFUlRfRkFMU0UoKytpdCA9PSBnZW4uZW5kKCkpOworICBFWFBFQ1RfRVEoMSwgaXQtPnZhbHVlKCkpOworCisgIEVYUEVDVF9UUlVFKCsraXQgPT0gZ2VuLmVuZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHdpdGggYW4gYXJyYXkgcGFyYW1ldGVyIGdlbmVyYXRlcworLy8gdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luQXJyYXkpIHsKKyAgaW50IGFycmF5W10gPSB7MywgNSwgOH07CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4oYXJyYXkpOworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBhcnJheSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSB3aXRoIGEgY29uc3QgYXJyYXkgcGFyYW1ldGVyIGdlbmVyYXRlcworLy8gdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luQ29uc3RBcnJheSkgeworICBjb25zdCBpbnQgYXJyYXlbXSA9IHszLCA1LCA4fTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbihhcnJheSk7CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGFycmF5KTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFZhbHVlc0luKCkgd2l0aCBhbiBhcnJheSBwYXJhbWV0ZXIgY29udGFpbmluZyBhCisvLyBzaW5nbGUgZWxlbWVudCBnZW5lcmF0ZXMgdGhlIHNpbmdsZSBlbGVtZW50IHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luU2luZ2xlRWxlbWVudEFycmF5KSB7CisgIGludCBhcnJheVtdID0gezQyfTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbihhcnJheSk7CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGFycmF5KTsKK30KKworLy8gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UgZm9yIGFuIFNUTAorLy8gY29udGFpbmVyICh2ZWN0b3IpLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luVmVjdG9yKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxpbnQ+IENvbnRhaW5lclR5cGU7CisgIENvbnRhaW5lclR5cGUgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKDMpOworICB2YWx1ZXMucHVzaF9iYWNrKDUpOworICB2YWx1ZXMucHVzaF9iYWNrKDgpOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKHZhbHVlcyk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezMsIDUsIDh9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlc0luKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2UpIHsKKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGludD4gQ29udGFpbmVyVHlwZTsKKyAgQ29udGFpbmVyVHlwZSB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soMyk7CisgIHZhbHVlcy5wdXNoX2JhY2soNSk7CisgIHZhbHVlcy5wdXNoX2JhY2soOCk7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4odmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezMsIDUsIDh9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSBwcm92aWRlZCB3aXRoIGFuIGl0ZXJhdG9yIHJhbmdlIHNwZWNpZnlpbmcgYQorLy8gc2luZ2xlIHZhbHVlIGdlbmVyYXRlcyBhIHNpbmdsZS1lbGVtZW50IHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luU2luZ2xlRWxlbWVudEl0ZXJhdG9yUmFuZ2UpIHsKKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGludD4gQ29udGFpbmVyVHlwZTsKKyAgQ29udGFpbmVyVHlwZSB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soNDIpOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHs0Mn07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHByb3ZpZGVkIHdpdGggYW4gZW1wdHkgaXRlcmF0b3IgcmFuZ2UKKy8vIGdlbmVyYXRlcyBhbiBlbXB0eSBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJbkVtcHR5SXRlcmF0b3JSYW5nZSkgeworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8aW50PiBDb250YWluZXJUeXBlOworICBDb250YWluZXJUeXBlIHZhbHVlczsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKworICBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGdlbik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIFZhbHVlcygpIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFZhbHVlc1Rlc3QsIFZhbHVlc1dvcmtzKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzKDMsIDUsIDgpOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA1LCA4fTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCBWYWx1ZXMoKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlcyBmcm9tIGVsZW1lbnRzIG9mCisvLyBkaWZmZXJlbnQgdHlwZXMgY29udmVydGlibGUgdG8gUGFyYW1HZW5lcmF0b3IncyBwYXJhbWV0ZXIgdHlwZS4KK1RFU1QoVmFsdWVzVGVzdCwgVmFsdWVzV29ya3NGb3JWYWx1ZXNPZkNvbXBhdGlibGVUeXBlcykgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxkb3VibGU+IGdlbiA9IFZhbHVlcygzLCA1LjBmLCA4LjApOworCisgIGNvbnN0IGRvdWJsZSBleHBlY3RlZF92YWx1ZXNbXSA9IHszLjAsIDUuMCwgOC4wfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworVEVTVChWYWx1ZXNUZXN0LCBWYWx1ZXNXb3Jrc0Zvck1heExlbmd0aExpc3QpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXMoCisgICAgICAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsIDkwLCAxMDAsCisgICAgICAxMTAsIDEyMCwgMTMwLCAxNDAsIDE1MCwgMTYwLCAxNzAsIDE4MCwgMTkwLCAyMDAsCisgICAgICAyMTAsIDIyMCwgMjMwLCAyNDAsIDI1MCwgMjYwLCAyNzAsIDI4MCwgMjkwLCAzMDAsCisgICAgICAzMTAsIDMyMCwgMzMwLCAzNDAsIDM1MCwgMzYwLCAzNzAsIDM4MCwgMzkwLCA0MDAsCisgICAgICA0MTAsIDQyMCwgNDMwLCA0NDAsIDQ1MCwgNDYwLCA0NzAsIDQ4MCwgNDkwLCA1MDApOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHsKKyAgICAgIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAsIDEwMCwKKyAgICAgIDExMCwgMTIwLCAxMzAsIDE0MCwgMTUwLCAxNjAsIDE3MCwgMTgwLCAxOTAsIDIwMCwKKyAgICAgIDIxMCwgMjIwLCAyMzAsIDI0MCwgMjUwLCAyNjAsIDI3MCwgMjgwLCAyOTAsIDMwMCwKKyAgICAgIDMxMCwgMzIwLCAzMzAsIDM0MCwgMzUwLCAzNjAsIDM3MCwgMzgwLCAzOTAsIDQwMCwKKyAgICAgIDQxMCwgNDIwLCA0MzAsIDQ0MCwgNDUwLCA0NjAsIDQ3MCwgNDgwLCA0OTAsIDUwMH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIEVkZ2UgY2FzZSB0ZXN0LiBUZXN0cyB0aGF0IHNpbmdsZS1wYXJhbWV0ZXIgVmFsdWVzKCkgZ2VuZXJhdGVzIHRoZSBzZXF1ZW5jZQorLy8gd2l0aCB0aGUgc2luZ2xlIHZhbHVlLgorVEVTVChWYWx1ZXNUZXN0LCBWYWx1ZXNXaXRoU2luZ2xlUGFyYW1ldGVyKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzKDQyKTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7NDJ9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IEJvb2woKSBnZW5lcmF0ZXMgc2VxdWVuY2UgKGZhbHNlLCB0cnVlKS4KK1RFU1QoQm9vbFRlc3QsIEJvb2xXb3JrcykgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxib29sPiBnZW4gPSBCb29sKCk7CisKKyAgY29uc3QgYm9vbCBleHBlY3RlZF92YWx1ZXNbXSA9IHtmYWxzZSwgdHJ1ZX07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKworLy8gVGVzdHMgdGhhdCBDb21iaW5lKCkgd2l0aCB0d28gcGFyYW1ldGVycyBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhUd29QYXJhbWV0ZXJzKSB7CisgIGNvbnN0IGNoYXIqIGZvbyA9ICJmb28iOworICBjb25zdCBjaGFyKiBiYXIgPSAiYmFyIjsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8Y29uc3QgY2hhciosIGludD4gPiBnZW4gPQorICAgICAgQ29tYmluZShWYWx1ZXMoZm9vLCBiYXIpLCBWYWx1ZXMoMywgNCkpOworCisgIHR1cGxlPGNvbnN0IGNoYXIqLCBpbnQ+IGV4cGVjdGVkX3ZhbHVlc1tdID0geworICAgIG1ha2VfdHVwbGUoZm9vLCAzKSwgbWFrZV90dXBsZShmb28sIDQpLAorICAgIG1ha2VfdHVwbGUoYmFyLCAzKSwgbWFrZV90dXBsZShiYXIsIDQpfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCBDb21iaW5lKCkgd2l0aCB0aHJlZSBwYXJhbWV0ZXJzIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aFRocmVlUGFyYW1ldGVycykgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoVmFsdWVzKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDMsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDUsIDYpKTsKKyAgdHVwbGU8aW50LCBpbnQsIGludD4gZXhwZWN0ZWRfdmFsdWVzW10gPSB7CisgICAgbWFrZV90dXBsZSgwLCAzLCA1KSwgbWFrZV90dXBsZSgwLCAzLCA2KSwKKyAgICBtYWtlX3R1cGxlKDAsIDQsIDUpLCBtYWtlX3R1cGxlKDAsIDQsIDYpLAorICAgIG1ha2VfdHVwbGUoMSwgMywgNSksIG1ha2VfdHVwbGUoMSwgMywgNiksCisgICAgbWFrZV90dXBsZSgxLCA0LCA1KSwgbWFrZV90dXBsZSgxLCA0LCA2KX07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIENvbWJpbmUoKSB3aXRoIHRoZSBmaXJzdCBwYXJhbWV0ZXIgZ2VuZXJhdGluZyBhIHNpbmdsZSB2YWx1ZQorLy8gc2VxdWVuY2UgZ2VuZXJhdGVzIGEgc2VxdWVuY2Ugd2l0aCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFsIHRvIHRoZQorLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aEZpcnN0UGFyYW1ldGVyU2luZ2xlVmFsdWUpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoNDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygwLCAxKSk7CisKKyAgdHVwbGU8aW50LCBpbnQ+IGV4cGVjdGVkX3ZhbHVlc1tdID0ge21ha2VfdHVwbGUoNDIsIDApLCBtYWtlX3R1cGxlKDQyLCAxKX07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIENvbWJpbmUoKSB3aXRoIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGdlbmVyYXRpbmcgYSBzaW5nbGUgdmFsdWUKKy8vIHNlcXVlbmNlIGdlbmVyYXRlcyBhIHNlcXVlbmNlIHdpdGggdGhlIG51bWJlciBvZiBlbGVtZW50cyBlcXVhbCB0byB0aGUKKy8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBmaXJzdCBwYXJhbWV0ZXIuCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aFNlY29uZFBhcmFtZXRlclNpbmdsZVZhbHVlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoVmFsdWVzKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg0MikpOworCisgIHR1cGxlPGludCwgaW50PiBleHBlY3RlZF92YWx1ZXNbXSA9IHttYWtlX3R1cGxlKDAsIDQyKSwgbWFrZV90dXBsZSgxLCA0Mil9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IHdoZW4gdGhlIGZpcnN0IHBhcmFtZXRlciBwcm9kdWNlcyBhbiBlbXB0eSBzZXF1ZW5jZSwKKy8vIENvbWJpbmUoKSBwcm9kdWNlcyBhbiBlbXB0eSBzZXF1ZW5jZSwgdG9vLgorVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhGaXJzdFBhcmFtZXRlckVtcHR5UmFuZ2UpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShSYW5nZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMCwgMSkpOworICBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGdlbik7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiB0aGUgc2Vjb25kIHBhcmFtZXRlciBwcm9kdWNlcyBhbiBlbXB0eSBzZXF1ZW5jZSwKKy8vIENvbWJpbmUoKSBwcm9kdWNlcyBhbiBlbXB0eSBzZXF1ZW5jZSwgdG9vLgorVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhTZWNvbmRQYXJhbWV0ZXJFbXB0eVJhbmdlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoVmFsdWVzKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlKDEsIDEpKTsKKyAgVmVyaWZ5R2VuZXJhdG9ySXNFbXB0eShnZW4pOworfQorCisvLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgY29tYmluZSB3b3JrcyB3aXRoIHRoZSBtYXhpbXVtIG51bWJlcgorLy8gb2YgcGFyYW1ldGVycyBzdXBwb3J0ZWQgYnkgR29vZ2xlIFRlc3QgKGN1cnJlbnRseSAxMCkuCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aE1heE51bWJlck9mUGFyYW1ldGVycykgeworICBjb25zdCBjaGFyKiBmb28gPSAiZm9vIjsKKyAgY29uc3QgY2hhciogYmFyID0gImJhciI7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGNvbnN0IGNoYXIqLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoVmFsdWVzKGZvbywgYmFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMSksIFZhbHVlcygyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMyksIFZhbHVlcyg0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNSksIFZhbHVlcyg2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNyksIFZhbHVlcyg4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoOSkpOworCisgIHR1cGxlPGNvbnN0IGNoYXIqLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PgorICAgICAgZXhwZWN0ZWRfdmFsdWVzW10gPSB7bWFrZV90dXBsZShmb28sIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZShiYXIsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKKworLy8gVGVzdHMgdGhhdCBhbiBnZW5lcmF0b3IgcHJvZHVjZXMgY29ycmVjdCBzZXF1ZW5jZSBhZnRlciBiZWluZworLy8gYXNzaWduZWQgZnJvbSBhbm90aGVyIGdlbmVyYXRvci4KK1RFU1QoUGFyYW1HZW5lcmF0b3JUZXN0LCBBc3NpZ25tZW50V29ya3MpIHsKKyAgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXMoMSwgMik7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuMiA9IFZhbHVlcygzLCA0KTsKKyAgZ2VuID0gZ2VuMjsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MywgNH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSB0ZXN0cyBhcmUgZXhwYW5kZWQgYW5kIHJ1biBhcyBzcGVjaWZpZWQ6CisvLyBvbmUgdGVzdCBwZXIgZWxlbWVudCBmcm9tIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yCisvLyBzcGVjaWZpZWQgaW4gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AuIEl0IGFsc28gdmVyaWZpZXMgdGhhdCB0aGUgdGVzdCdzCisvLyBmaXh0dXJlIGNvbnN0cnVjdG9yLCBTZXRVcCgpLCBhbmQgVGVhckRvd24oKSBoYXZlIHJ1biBhbmQgaGF2ZSBiZWVuCisvLyBzdXBwbGllZCB3aXRoIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMuCisKKy8vIFRoZSB1c2Ugb2YgZW52aXJvbm1lbnQgb2JqZWN0IGFsbG93cyBkZXRlY3Rpb24gb2YgdGhlIGNhc2Ugd2hlcmUgbm8gdGVzdAorLy8gY2FzZSBmdW5jdGlvbmFsaXR5IGlzIHJ1biBhdCBhbGwuIEluIHRoaXMgY2FzZSBUZXN0Q2FzZVRlYXJEb3duIHdpbGwgbm90CisvLyBiZSBhYmxlIHRvIGRldGVjdCBtaXNzaW5nIHRlc3RzLCBuYXR1cmFsbHkuCit0ZW1wbGF0ZSA8aW50IGtFeHBlY3RlZENhbGxzPgorY2xhc3MgVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50KiBJbnN0YW5jZSgpIHsKKyAgICBzdGF0aWMgVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudCogaW5zdGFuY2UgPSBuZXcgVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudDsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0KKworICB2b2lkIEZpeHR1cmVDb25zdHJ1Y3RvckV4ZWN1dGVkKCkgeyBmaXh0dXJlX2NvbnN0cnVjdG9yX2NvdW50XysrOyB9CisgIHZvaWQgU2V0VXBFeGVjdXRlZCgpIHsgc2V0X3VwX2NvdW50XysrOyB9CisgIHZvaWQgVGVhckRvd25FeGVjdXRlZCgpIHsgdGVhcl9kb3duX2NvdW50XysrOyB9CisgIHZvaWQgVGVzdEJvZHlFeGVjdXRlZCgpIHsgdGVzdF9ib2R5X2NvdW50XysrOyB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIElmIGFsbCBNdWx0aXBsZVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0cyBoYXZlIGJlZW4gZGUtc2VsZWN0ZWQKKyAgICAvLyBieSB0aGUgZmlsdGVyIGZsYWcsIHRoZSBmb2xsb3dpbmcgY2hlY2tzIG1ha2Ugbm8gc2Vuc2UuCisgICAgYm9vbCBwZXJmb3JtX2NoZWNrID0gZmFsc2U7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtFeHBlY3RlZENhbGxzOyArK2kpIHsKKyAgICAgIE1lc3NhZ2UgbXNnOworICAgICAgbXNnIDw8ICJUZXN0c0V4cGFuZGVkQW5kUnVuLyIgPDwgaTsKKyAgICAgIGlmIChVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KAorICAgICAgICAgICAgICJUZXN0RXhwYW5zaW9uTW9kdWxlL011bHRpcGxlVGVzdEdlbmVyYXRpb25UZXN0IiwKKyAgICAgICAgICAgICAgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpKSB7CisgICAgICAgIHBlcmZvcm1fY2hlY2sgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAocGVyZm9ybV9jaGVjaykgeworICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZENhbGxzLCBmaXh0dXJlX2NvbnN0cnVjdG9yX2NvdW50XykKKyAgICAgICAgICA8PCAiRml4dHVyZSBjb25zdHJ1Y3RvciBvZiBQYXJhbVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8ICJoYXMgbm90IGJlZW4gcnVuIGFzIGV4cGVjdGVkLiI7CisgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkQ2FsbHMsIHNldF91cF9jb3VudF8pCisgICAgICAgICAgPDwgIkZpeHR1cmUgU2V0VXAgbWV0aG9kIG9mIFBhcmFtVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSAiCisgICAgICAgICAgPDwgImhhcyBub3QgYmVlbiBydW4gYXMgZXhwZWN0ZWQuIjsKKyAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRDYWxscywgdGVhcl9kb3duX2NvdW50XykKKyAgICAgICAgICA8PCAiRml4dHVyZSBUZWFyRG93biBtZXRob2Qgb2YgUGFyYW1UZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCAiaGFzIG5vdCBiZWVuIHJ1biBhcyBleHBlY3RlZC4iOworICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZENhbGxzLCB0ZXN0X2JvZHlfY291bnRfKQorICAgICAgICAgIDw8ICJUZXN0IGluIFBhcmFtVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSAiCisgICAgICAgICAgPDwgImhhcyBub3QgYmVlbiBydW4gYXMgZXhwZWN0ZWQuIjsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQoKSA6IGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfKDApLCBzZXRfdXBfY291bnRfKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyX2Rvd25fY291bnRfKDApLCB0ZXN0X2JvZHlfY291bnRfKDApIHt9CisKKyAgaW50IGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfOworICBpbnQgc2V0X3VwX2NvdW50XzsKKyAgaW50IHRlYXJfZG93bl9jb3VudF87CisgIGludCB0ZXN0X2JvZHlfY291bnRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudCk7Cit9OworCitjb25zdCBpbnQgdGVzdF9nZW5lcmF0aW9uX3BhcmFtc1tdID0gezM2LCA0MiwgNzJ9OworCitjbGFzcyBUZXN0R2VuZXJhdGlvblRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsKKyBwdWJsaWM6CisgIGVudW0geworICAgIFBBUkFNRVRFUl9DT1VOVCA9CisgICAgICAgIHNpemVvZih0ZXN0X2dlbmVyYXRpb25fcGFyYW1zKS9zaXplb2YodGVzdF9nZW5lcmF0aW9uX3BhcmFtc1swXSkKKyAgfTsKKworICB0eXBlZGVmIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQ8UEFSQU1FVEVSX0NPVU5UPiBFbnZpcm9ubWVudDsKKworICBUZXN0R2VuZXJhdGlvblRlc3QoKSB7CisgICAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPkZpeHR1cmVDb25zdHJ1Y3RvckV4ZWN1dGVkKCk7CisgICAgY3VycmVudF9wYXJhbWV0ZXJfID0gR2V0UGFyYW0oKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPlNldFVwRXhlY3V0ZWQoKTsKKyAgICBFWFBFQ1RfRVEoY3VycmVudF9wYXJhbWV0ZXJfLCBHZXRQYXJhbSgpKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPlRlYXJEb3duRXhlY3V0ZWQoKTsKKyAgICBFWFBFQ1RfRVEoY3VycmVudF9wYXJhbWV0ZXJfLCBHZXRQYXJhbSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgYm9vbCBhbGxfdGVzdHNfaW5fdGVzdF9jYXNlX3NlbGVjdGVkID0gdHJ1ZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUEFSQU1FVEVSX0NPVU5UOyArK2kpIHsKKyAgICAgIE1lc3NhZ2UgdGVzdF9uYW1lOworICAgICAgdGVzdF9uYW1lIDw8ICJUZXN0c0V4cGFuZGVkQW5kUnVuLyIgPDwgaTsKKyAgICAgIGlmICggIVVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoCisgICAgICAgICAgICAgICAgIlRlc3RFeHBhbnNpb25Nb2R1bGUvTXVsdGlwbGVUZXN0R2VuZXJhdGlvblRlc3QiLAorICAgICAgICAgICAgICAgIHRlc3RfbmFtZS5HZXRTdHJpbmcoKSkpIHsKKyAgICAgICAgYWxsX3Rlc3RzX2luX3Rlc3RfY2FzZV9zZWxlY3RlZCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfVFJVRShhbGxfdGVzdHNfaW5fdGVzdF9jYXNlX3NlbGVjdGVkKQorICAgICAgICA8PCAiV2hlbiBydW5uaW5nIHRoZSBUZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlIGFsbCBvZiBpdHMgdGVzdHNcbiIKKyAgICAgICAgPDwgIm11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGZpbHRlciBmbGFnIGZvciB0aGUgdGVzdCBjYXNlIHRvIHBhc3MuXG4iCisgICAgICAgIDw8ICJJZiBub3QgYWxsIG9mIHRoZW0gYXJlIGVuYWJsZWQsIHdlIGNhbid0IHJlbGlhYmx5IGNvbmNsdWRlXG4iCisgICAgICAgIDw8ICJ0aGF0IHRoZSBjb3JyZWN0IG51bWJlciBvZiB0ZXN0cyBoYXZlIGJlZW4gZ2VuZXJhdGVkLiI7CisKKyAgICBjb2xsZWN0ZWRfcGFyYW1ldGVyc18uY2xlYXIoKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgdmVjdG9yPGludD4gZXhwZWN0ZWRfdmFsdWVzKHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXMgKyBQQVJBTUVURVJfQ09VTlQpOworICAgIC8vIFRlc3QgZXhlY3V0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGJ5IEdvb2dsZSBUZXN0LAorICAgIC8vIHNvIHRoZSBvcmRlciBvZiB2YWx1ZXMgaW4gY29sbGVjdGVkX3BhcmFtZXRlcnNfIGNhbiBiZQorICAgIC8vIGRpZmZlcmVudCBhbmQgd2UgaGF2ZSB0byBzb3J0IHRvIGNvbXBhcmUuCisgICAgc29ydChleHBlY3RlZF92YWx1ZXMuYmVnaW4oKSwgZXhwZWN0ZWRfdmFsdWVzLmVuZCgpKTsKKyAgICBzb3J0KGNvbGxlY3RlZF9wYXJhbWV0ZXJzXy5iZWdpbigpLCBjb2xsZWN0ZWRfcGFyYW1ldGVyc18uZW5kKCkpOworCisgICAgRVhQRUNUX1RSVUUoY29sbGVjdGVkX3BhcmFtZXRlcnNfID09IGV4cGVjdGVkX3ZhbHVlcyk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgaW50IGN1cnJlbnRfcGFyYW1ldGVyXzsKKyAgc3RhdGljIHZlY3RvcjxpbnQ+IGNvbGxlY3RlZF9wYXJhbWV0ZXJzXzsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEdlbmVyYXRpb25UZXN0KTsKK307Cit2ZWN0b3I8aW50PiBUZXN0R2VuZXJhdGlvblRlc3Q6OmNvbGxlY3RlZF9wYXJhbWV0ZXJzXzsKKworVEVTVF9QKFRlc3RHZW5lcmF0aW9uVGVzdCwgVGVzdHNFeHBhbmRlZEFuZFJ1bikgeworICBFbnZpcm9ubWVudDo6SW5zdGFuY2UoKS0+VGVzdEJvZHlFeGVjdXRlZCgpOworICBFWFBFQ1RfRVEoY3VycmVudF9wYXJhbWV0ZXJfLCBHZXRQYXJhbSgpKTsKKyAgY29sbGVjdGVkX3BhcmFtZXRlcnNfLnB1c2hfYmFjayhHZXRQYXJhbSgpKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RFeHBhbnNpb25Nb2R1bGUsIFRlc3RHZW5lcmF0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXMpKTsKKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIGVsZW1lbnQgc2VxdWVuY2UgKHRoaXJkIHBhcmFtZXRlciBvZgorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1ApIGlzIGV2YWx1YXRlZCBpbiBJbml0R29vZ2xlVGVzdCgpIGFuZCBuZWl0aGVyIGF0CisvLyB0aGUgY2FsbCBzaXRlIG9mIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG5vciBpbiBSVU5fQUxMX1RFU1RTKCkuICBGb3IKKy8vIHRoYXQsIHdlIGRlY2xhcmUgcGFyYW1fdmFsdWVfIHRvIGJlIGEgc3RhdGljIG1lbWJlciBvZgorLy8gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgYW5kIGluaXRpYWxpemUgaXQgdG8gMC4gIFdlIHNldCBpdCB0byAxIGluCisvLyBtYWluKCksIGp1c3QgYmVmb3JlIGludm9jYXRpb24gb2YgSW5pdEdvb2dsZVRlc3QoKS4gIEFmdGVyIGNhbGxpbmcKKy8vIEluaXRHb29nbGVUZXN0KCksIHdlIHNldCB0aGUgdmFsdWUgdG8gMi4gIElmIHRoZSBzZXF1ZW5jZSBpcyBldmFsdWF0ZWQKKy8vIGJlZm9yZSBvciBhZnRlciBJbml0R29vZ2xlVGVzdCwgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agd2lsbCBjcmVhdGUgYQorLy8gdGVzdCB3aXRoIHBhcmFtZXRlciBvdGhlciB0aGFuIDEsIGFuZCB0aGUgdGVzdCBib2R5IHdpbGwgZmFpbCB0aGUKKy8vIGFzc2VydGlvbi4KK2NsYXNzIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7CisgcHVibGljOgorICBzdGF0aWMgaW50IHBhcmFtX3ZhbHVlKCkgeyByZXR1cm4gcGFyYW1fdmFsdWVfOyB9CisgIHN0YXRpYyB2b2lkIHNldF9wYXJhbV92YWx1ZShpbnQgcGFyYW1fdmFsdWUpIHsgcGFyYW1fdmFsdWVfID0gcGFyYW1fdmFsdWU7IH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgcGFyYW1fdmFsdWVfOworfTsKK2ludCBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdDo6cGFyYW1fdmFsdWVfID0gMDsKKworVEVTVF9QKEdlbmVyYXRvckV2YWx1YXRpb25UZXN0LCBHZW5lcmF0b3JzRXZhbHVhdGVkSW5NYWluKSB7CisgIEVYUEVDVF9FUSgxLCBHZXRQYXJhbSgpKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEdlbkV2YWxNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdDo6cGFyYW1fdmFsdWUoKSkpOworCisvLyBUZXN0cyB0aGF0IGdlbmVyYXRvcnMgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0IGFyZQorLy8gZnVuY3Rpb25hbC4gR2VuZXJhdG9yIGV4dGVybl9nZW4gaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QyLmNjLgorZXh0ZXJuIFBhcmFtR2VuZXJhdG9yPGludD4gZXh0ZXJuX2dlbjsKK2NsYXNzIEV4dGVybmFsR2VuZXJhdG9yVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4ge307CitURVNUX1AoRXh0ZXJuYWxHZW5lcmF0b3JUZXN0LCBFeHRlcm5hbEdlbmVyYXRvcikgeworICAvLyBTZXF1ZW5jZSBwcm9kdWNlZCBieSBleHRlcm5fZ2VuIGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgdmFsdWUKKyAgLy8gd2hpY2ggd2UgdmVyaWZ5IGhlcmUuCisgIEVYUEVDVF9FUShHZXRQYXJhbSgpLCAzMyk7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChFeHRlcm5hbEdlbmVyYXRvck1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsR2VuZXJhdG9yVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl9nZW4pOworCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgaW4gb25lIHRyYW5zbGF0aW9uCisvLyB1bml0IGFuZCBpbnN0YW50aWF0ZWQgaW4gYW5vdGhlci4gVGhpcyB0ZXN0IHdpbGwgYmUgaW5zdGFudGlhdGVkIGluCisvLyBndGVzdC1wYXJhbS10ZXN0X3Rlc3QyLmNjLiBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0IGZpeHR1cmUgY2xhc3MgaXMKKy8vIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmguCitURVNUX1AoRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCwgSXNNdWx0aXBsZU9mMzMpIHsKKyAgRVhQRUNUX0VRKDAsIEdldFBhcmFtKCkgJSAzMyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgaW5zdGFudGlhdGVkIHdpdGggbXVsdGlwbGUKKy8vIGdlbmVyYXRvcnMuCitjbGFzcyBNdWx0aXBsZUluc3RhbnRpYXRpb25UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7fTsKK1RFU1RfUChNdWx0aXBsZUluc3RhbnRpYXRpb25UZXN0LCBBbGxvd3NNdWx0aXBsZUluc3RhbmNlcykgeworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2UxLCBNdWx0aXBsZUluc3RhbnRpYXRpb25UZXN0LCBWYWx1ZXMoMSwgMikpOworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2UyLCBNdWx0aXBsZUluc3RhbnRpYXRpb25UZXN0LCBSYW5nZSgzLCA1KSk7CisKKy8vIFRlc3RzIHRoYXQgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgaW5zdGFudGlhdGVkCisvLyBpbiBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cy4gVGhpcyB0ZXN0IHdpbGwgYmUgaW5zdGFudGlhdGVkCisvLyBoZXJlIGFuZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QyLmNjLgorLy8gSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhdGlvblVuaXRzVGVzdCBmaXh0dXJlIGNsYXNzCisvLyBpcyBkZWZpbmVkIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oLgorVEVTVF9QKEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYWlvblVuaXRzVGVzdCwgSXNNdWx0aXBsZU9mNDIpIHsKKyAgRVhQRUNUX0VRKDAsIEdldFBhcmFtKCkgJSA0Mik7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXF1ZW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNDIsIDQyKjIpKTsKKworLy8gVGVzdHMgdGhhdCBlYWNoIGl0ZXJhdGlvbiBvZiBwYXJhbWV0ZXJpemVkIHRlc3QgcnVucyBpbiBhIHNlcGFyYXRlIHRlc3QKKy8vIG9iamVjdC4KK2NsYXNzIFNlcGFyYXRlSW5zdGFuY2VUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7CisgcHVibGljOgorICBTZXBhcmF0ZUluc3RhbmNlVGVzdCgpIDogY291bnRfKDApIHt9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBFWFBFQ1RfR0UoZ2xvYmFsX2NvdW50XywgMikKKyAgICAgICAgPDwgIklmIHNvbWUgKGJ1dCBub3QgYWxsKSBTZXBhcmF0ZUluc3RhbmNlVGVzdCB0ZXN0cyBoYXZlIGJlZW4gIgorICAgICAgICA8PCAiZmlsdGVyZWQgb3V0IHRoaXMgdGVzdCB3aWxsIGZhaWwuIE1ha2Ugc3VyZSB0aGF0IGFsbCAiCisgICAgICAgIDw8ICJHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCBhcmUgc2VsZWN0ZWQgb3IgZGUtc2VsZWN0ZWQgdG9nZXRoZXIgIgorICAgICAgICA8PCAiYnkgdGhlIHRlc3QgZmlsdGVyLiI7CisgIH0KKworIHByb3RlY3RlZDoKKyAgaW50IGNvdW50XzsKKyAgc3RhdGljIGludCBnbG9iYWxfY291bnRfOworfTsKK2ludCBTZXBhcmF0ZUluc3RhbmNlVGVzdDo6Z2xvYmFsX2NvdW50XyA9IDA7CisKK1RFU1RfUChTZXBhcmF0ZUluc3RhbmNlVGVzdCwgVGVzdHNSdW5JblNlcGFyYXRlSW5zdGFuY2VzKSB7CisgIEVYUEVDVF9FUSgwLCBjb3VudF8rKyk7CisgIGdsb2JhbF9jb3VudF8rKzsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEZvdXJFbGVtU2VxdWVuY2UsIFNlcGFyYXRlSW5zdGFuY2VUZXN0LCBSYW5nZSgxLCA0KSk7CisKKy8vIFRlc3RzIHRoYXQgYWxsIGluc3RhbnRpYXRpb25zIG9mIGEgdGVzdCBoYXZlIG5hbWVkIGFwcHJvcHJpYXRlbHkuIFRlc3QKKy8vIGRlZmluZWQgd2l0aCBURVNUX1AoVGVzdENhc2VOYW1lLCBUZXN0TmFtZSkgYW5kIGluc3RhbnRpYXRlZCB3aXRoCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXF1ZW5jZU5hbWUsIFRlc3RDYXNlTmFtZSwgZ2VuZXJhdG9yKSBtdXN0IGJlIG5hbWVkCisvLyBTZXF1ZW5jZU5hbWUvVGVzdENhc2VOYW1lLlRlc3ROYW1lL2ksIHdoZXJlIGkgaXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlCisvLyBzZXF1ZW5jZSBlbGVtZW50IHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QuCitjbGFzcyBOYW1pbmdUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7fTsKKworVEVTVF9QKE5hbWluZ1Rlc3QsIFRlc3RzUmVwb3J0Q29ycmVjdE5hbWVzQW5kUGFyYW1ldGVycykgeworICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworCisgIEVYUEVDVF9TVFJFUSgiWmVyb1RvRml2ZVNlcXVlbmNlL05hbWluZ1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOworCisgIE1lc3NhZ2UgaW5kZXhfc3RyZWFtOworICBpbmRleF9zdHJlYW0gPDwgIlRlc3RzUmVwb3J0Q29ycmVjdE5hbWVzQW5kUGFyYW1ldGVycy8iIDw8IEdldFBhcmFtKCk7CisgIEVYUEVDVF9TVFJFUShpbmRleF9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwgdGVzdF9pbmZvLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUSg6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoR2V0UGFyYW0oKSksIHRlc3RfaW5mby0+dmFsdWVfcGFyYW0oKSk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFplcm9Ub0ZpdmVTZXF1ZW5jZSwgTmFtaW5nVGVzdCwgUmFuZ2UoMCwgNSkpOworCisvLyBDbGFzcyB0aGF0IGNhbm5vdCBiZSBzdHJlYW1lZCBpbnRvIGFuIG9zdHJlYW0uICBJdCBuZWVkcyB0byBiZSBjb3B5YWJsZQorLy8gKGFuZCwgaW4gY2FzZSBvZiBNU1ZDLCBhbHNvIGFzc2lnbmFibGUpIGluIG9yZGVyIHRvIGJlIGEgdGVzdCBwYXJhbWV0ZXIKKy8vIHR5cGUuICBJdHMgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIGRvIGV4YWN0bHkKKy8vIHdoYXQgd2UgbmVlZC4KK2NsYXNzIFVuc3RyZWFtYWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBVbnN0cmVhbWFibGUoaW50IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKworIHByaXZhdGU6CisgIGludCB2YWx1ZV87Cit9OworCitjbGFzcyBDb21tZW50VGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPFVuc3RyZWFtYWJsZT4ge307CisKK1RFU1RfUChDb21tZW50VGVzdCwgVGVzdHNDb3JyZWN0bHlSZXBvcnRVbnN0cmVhbWFibGVQYXJhbXMpIHsKKyAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKworICBFWFBFQ1RfRVEoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLCB0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uV2l0aENvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoVW5zdHJlYW1hYmxlKDEpKSk7CisKKy8vIFZlcmlmeSB0aGF0IHdlIGNhbiBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgdGVzdCBmaXh0dXJlcywgd2hlcmUgdGhlIGJhc2UKKy8vIGNsYXNzIGZpeHR1cmUgaXMgbm90IHBhcmFtZXRlcml6ZWQgYW5kIHRoZSBkZXJpdmVkIGNsYXNzIGlzLiBJbiB0aGlzIGNhc2UKKy8vIFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCBpbmhlcml0cyBmcm9tIE5vblBhcmFtZXRlcml6ZWRCYXNlVGVzdC4gIFdlCisvLyBwZXJmb3JtIHNpbXBsZSB0ZXN0cyBvbiBib3RoLgorY2xhc3MgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QoKSA6IG5fKDE3KSB7IH0KKyBwcm90ZWN0ZWQ6CisgIGludCBuXzsKK307CisKK2NsYXNzIFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCA6IHB1YmxpYyBOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50PiB7CisgcHJvdGVjdGVkOgorICBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QoKSA6IGNvdW50XygwKSB7IH0KKyAgaW50IGNvdW50XzsKKyAgc3RhdGljIGludCBnbG9iYWxfY291bnRfOworfTsKKworaW50IFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdDo6Z2xvYmFsX2NvdW50XyA9IDA7CisKK1RFU1RfRihOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QsIEZpeHR1cmVJc0luaXRpYWxpemVkKSB7CisgIEVYUEVDVF9FUSgxNywgbl8pOworfQorCitURVNUX1AoUGFyYW1ldGVyaXplZERlcml2ZWRUZXN0LCBTZWVzU2VxdWVuY2UpIHsKKyAgRVhQRUNUX0VRKDE3LCBuXyk7CisgIEVYUEVDVF9FUSgwLCBjb3VudF8rKyk7CisgIEVYUEVDVF9FUShHZXRQYXJhbSgpLCBnbG9iYWxfY291bnRfKyspOworfQorCitjbGFzcyBQYXJhbWV0ZXJpemVkRGVhdGhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsgfTsKKworVEVTVF9GKFBhcmFtZXRlcml6ZWREZWF0aFRlc3QsIEdldFBhcmFtRGllc0Zyb21UZXN0RikgeworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKEdldFBhcmFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdCAuKiIpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChSYW5nZVplcm9Ub0ZpdmUsIFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCwgUmFuZ2UoMCwgNSkpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK1RFU1QoQ29tcGlsZVRlc3QsIENvbWJpbmVJc0RlZmluZWRPbmx5V2hlbkd0ZXN0SGFzUGFyYW1UZXN0SXNEZWZpbmVkKSB7CisjaWYgR1RFU1RfSEFTX0NPTUJJTkUgJiYgIUdURVNUX0hBU19QQVJBTV9URVNUCisgIEZBSUwoKSA8PCAiR1RFU1RfSEFTX0NPTUJJTkUgaXMgZGVmaW5lZCB3aGlsZSBHVEVTVF9IQVNfUEFSQU1fVEVTVCBpcyBub3RcbiIKKyNlbmRpZgorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBVc2VkIGluIFRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UuCisgIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChUZXN0R2VuZXJhdGlvblRlc3Q6OkVudmlyb25tZW50OjpJbnN0YW5jZSgpKTsKKyAgLy8gVXNlZCBpbiBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCB0ZXN0IGNhc2UuIFRlc3RzIHRoYXQgdGhlIHVwZGF0ZWQgdmFsdWUKKyAgLy8gd2lsbCBiZSBwaWNrZWQgdXAgZm9yIGluc3RhbnRpYXRpbmcgdGVzdHMgaW4gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QuCisgIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0OjpzZXRfcGFyYW1fdmFsdWUoMSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBVc2VkIGluIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0IHRlc3QgY2FzZS4gVGVzdHMgdGhhdCB2YWx1ZSB1cGRhdGVkCisgIC8vIGhlcmUgd2lsbCBOT1QgYmUgdXNlZCBmb3IgaW5zdGFudGlhdGluZyB0ZXN0cyBpbgorICAvLyBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdC4KKyAgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnNldF9wYXJhbV92YWx1ZSgyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWExMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgcHJvdmlkZXMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseQorLy8gZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmLgorCisjaWZuZGVmIEdURVNUX1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9URVNUX0hfCisjZGVmaW5lIEdURVNUX1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9URVNUX0hfCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gVGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIGRlZmluaXRpb24gYW5kIGluc3RhbnRpYXRpb24gb2YgYSB0ZXN0CisvLyBpbiBzZXBhcmF0ZSB0cmFuc2xhdGlvbiB1bml0cy4KK2NsYXNzIEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4geworfTsKKworLy8gVGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIGluc3RhbnRpYXRpb24gb2YgYSB0ZXN0IGluIG11bHRpcGxlCisvLyB0cmFuc2xhdGlvbiB1bml0cy4KK2NsYXNzIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYWlvblVuaXRzVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXBvcnRfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMWYyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MKQEAgLTAsMCArMSwxMjUzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldiksIHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBpbnRlcm5hbCBjcm9zcy1wbGF0Zm9ybSBzdXBwb3J0IHV0aWxpdGllcy4KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBHVEVTVF9PU19NQUMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4gIC8vIEZvciBzdGQ6OnBhaXIgYW5kIHN0ZDo6bWFrZV9wYWlyLgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCit1c2luZyBzdGQ6Om1ha2VfcGFpcjsKK3VzaW5nIHN0ZDo6cGFpcjsKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworVEVTVChJc1hEaWdpdFRlc3QsIFdvcmtzRm9yTmFycm93QXNjaWkpIHsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJzAnKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KCc5JykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnQScpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJ0YnKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KCdhJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnZicpKTsKKworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoJy0nKSk7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdCgnZycpKTsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KCdHJykpOworfQorCitURVNUKElzWERpZ2l0VGVzdCwgUmV0dXJuc0ZhbHNlRm9yTmFycm93Tm9uQXNjaWkpIHsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KHN0YXRpY19jYXN0PGNoYXI+KDB4ODApKSk7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdChzdGF0aWNfY2FzdDxjaGFyPignMCcgfCAweDgwKSkpOworfQorCitURVNUKElzWERpZ2l0VGVzdCwgV29ya3NGb3JXaWRlQXNjaWkpIHsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCcwJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJzknKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnQScpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCdGJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJ2EnKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnZicpKTsKKworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoTCctJykpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoTCdnJykpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoTCdHJykpOworfQorCitURVNUKElzWERpZ2l0VGVzdCwgUmV0dXJuc0ZhbHNlRm9yV2lkZU5vbkFzY2lpKSB7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdChzdGF0aWNfY2FzdDx3Y2hhcl90PigweDgwKSkpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oTCcwJyB8IDB4ODApKSk7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdChzdGF0aWNfY2FzdDx3Y2hhcl90PihMJzAnIHwgMHgxMDApKSk7Cit9CisKK2NsYXNzIEJhc2UgeworIHB1YmxpYzoKKyAgLy8gQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBkbyBleGFjdGx5IHdoYXQgd2UgbmVlZCwgc28gd2UKKyAgLy8gdXNlIHRoZW0uCisgIEJhc2UoKSA6IG1lbWJlcl8oMCkge30KKyAgZXhwbGljaXQgQmFzZShpbnQgbikgOiBtZW1iZXJfKG4pIHt9CisgIHZpcnR1YWwgfkJhc2UoKSB7fQorICBpbnQgbWVtYmVyKCkgeyByZXR1cm4gbWVtYmVyXzsgfQorCisgcHJpdmF0ZToKKyAgaW50IG1lbWJlcl87Cit9OworCitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRGVyaXZlZChpbnQgbikgOiBCYXNlKG4pIHt9Cit9OworCitURVNUKEltcGxpY2l0Q2FzdFRlc3QsIENvbnZlcnRzUG9pbnRlcnMpIHsKKyAgRGVyaXZlZCBkZXJpdmVkKDApOworICBFWFBFQ1RfVFJVRSgmZGVyaXZlZCA9PSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2UqPigmZGVyaXZlZCkpOworfQorCitURVNUKEltcGxpY2l0Q2FzdFRlc3QsIENhblVzZUluaGVyaXRhbmNlKSB7CisgIERlcml2ZWQgZGVyaXZlZCgxKTsKKyAgQmFzZSBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihkZXJpdmVkKTsKKyAgRVhQRUNUX0VRKGRlcml2ZWQubWVtYmVyKCksIGJhc2UubWVtYmVyKCkpOworfQorCitjbGFzcyBDYXN0YWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDYXN0YWJsZShib29sKiBjb252ZXJ0ZWQpIDogY29udmVydGVkXyhjb252ZXJ0ZWQpIHt9CisgIG9wZXJhdG9yIEJhc2UoKSB7CisgICAgKmNvbnZlcnRlZF8gPSB0cnVlOworICAgIHJldHVybiBCYXNlKCk7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wqIGNvbnZlcnRlZF87Cit9OworCitURVNUKEltcGxpY2l0Q2FzdFRlc3QsIENhblVzZU5vbkNvbnN0Q2FzdE9wZXJhdG9yKSB7CisgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgIENhc3RhYmxlIGNhc3RhYmxlKCZjb252ZXJ0ZWQpOworICBCYXNlIGJhc2UgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2U+KGNhc3RhYmxlKTsKKyAgRVhQRUNUX1RSVUUoY29udmVydGVkKTsKK30KKworY2xhc3MgQ29uc3RDYXN0YWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDb25zdENhc3RhYmxlKGJvb2wqIGNvbnZlcnRlZCkgOiBjb252ZXJ0ZWRfKGNvbnZlcnRlZCkge30KKyAgb3BlcmF0b3IgQmFzZSgpIGNvbnN0IHsKKyAgICAqY29udmVydGVkXyA9IHRydWU7CisgICAgcmV0dXJuIEJhc2UoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCogY29udmVydGVkXzsKK307CisKK1RFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuVXNlQ29uc3RDYXN0T3BlcmF0b3JPbkNvbnN0VmFsdWVzKSB7CisgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgIGNvbnN0IENvbnN0Q2FzdGFibGUgY29uc3RfY2FzdGFibGUoJmNvbnZlcnRlZCk7CisgIEJhc2UgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oY29uc3RfY2FzdGFibGUpOworICBFWFBFQ1RfVFJVRShjb252ZXJ0ZWQpOworfQorCitjbGFzcyBDb25zdEFuZE5vbkNvbnN0Q2FzdGFibGUgeworIHB1YmxpYzoKKyAgQ29uc3RBbmROb25Db25zdENhc3RhYmxlKGJvb2wqIGNvbnZlcnRlZCwgYm9vbCogY29uc3RfY29udmVydGVkKQorICAgICAgOiBjb252ZXJ0ZWRfKGNvbnZlcnRlZCksIGNvbnN0X2NvbnZlcnRlZF8oY29uc3RfY29udmVydGVkKSB7fQorICBvcGVyYXRvciBCYXNlKCkgeworICAgICpjb252ZXJ0ZWRfID0gdHJ1ZTsKKyAgICByZXR1cm4gQmFzZSgpOworICB9CisgIG9wZXJhdG9yIEJhc2UoKSBjb25zdCB7CisgICAgKmNvbnN0X2NvbnZlcnRlZF8gPSB0cnVlOworICAgIHJldHVybiBCYXNlKCk7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wqIGNvbnZlcnRlZF87CisgIGJvb2wqIGNvbnN0X2NvbnZlcnRlZF87Cit9OworCitURVNUKEltcGxpY2l0Q2FzdFRlc3QsIENhblNlbGVjdEJldHdlZW5Db25zdEFuZE5vbkNvbnN0Q2FzckFwcHJvcHJpYXRlbHkpIHsKKyAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgYm9vbCBjb25zdF9jb252ZXJ0ZWQgPSBmYWxzZTsKKyAgQ29uc3RBbmROb25Db25zdENhc3RhYmxlIGNhc3RhYmxlKCZjb252ZXJ0ZWQsICZjb25zdF9jb252ZXJ0ZWQpOworICBCYXNlIGJhc2UgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2U+KGNhc3RhYmxlKTsKKyAgRVhQRUNUX1RSVUUoY29udmVydGVkKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbnN0X2NvbnZlcnRlZCk7CisKKyAgY29udmVydGVkID0gZmFsc2U7CisgIGNvbnN0X2NvbnZlcnRlZCA9IGZhbHNlOworICBjb25zdCBDb25zdEFuZE5vbkNvbnN0Q2FzdGFibGUgY29uc3RfY2FzdGFibGUoJmNvbnZlcnRlZCwgJmNvbnN0X2NvbnZlcnRlZCk7CisgIGJhc2UgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2U+KGNvbnN0X2Nhc3RhYmxlKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbnZlcnRlZCk7CisgIEVYUEVDVF9UUlVFKGNvbnN0X2NvbnZlcnRlZCk7Cit9CisKK2NsYXNzIFRvIHsKKyBwdWJsaWM6CisgIFRvKGJvb2wqIGNvbnZlcnRlZCkgeyAqY29udmVydGVkID0gdHJ1ZTsgfSAgLy8gTk9MSU5UCit9OworCitURVNUKEltcGxpY2l0Q2FzdFRlc3QsIENhblVzZUltcGxpY2l0Q29uc3RydWN0b3IpIHsKKyAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgVG8gdG8gPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPFRvPigmY29udmVydGVkKTsKKyAgKHZvaWQpdG87CisgIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCk7Cit9CisKK1RFU1QoSXRlcmF0b3JUcmFpdHNUZXN0LCBXb3Jrc0ZvclNUTENvbnRhaW5lckl0ZXJhdG9ycykgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LAorICAgICAgSXRlcmF0b3JUcmFpdHM8IDo6c3RkOjp2ZWN0b3I8aW50Pjo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Ym9vbCwKKyAgICAgIEl0ZXJhdG9yVHJhaXRzPCA6OnN0ZDo6bGlzdDxib29sPjo6aXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpOworfQorCitURVNUKEl0ZXJhdG9yVHJhaXRzVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Ob25Db25zdCkgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y2hhciwgSXRlcmF0b3JUcmFpdHM8Y2hhcio+Ojp2YWx1ZV90eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3Qgdm9pZCosIEl0ZXJhdG9yVHJhaXRzPGNvbnN0IHZvaWQqKj46OnZhbHVlX3R5cGU+KCk7Cit9CisKK1RFU1QoSXRlcmF0b3JUcmFpdHNUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb0NvbnN0KSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjaGFyLCBJdGVyYXRvclRyYWl0czxjb25zdCBjaGFyKj46OnZhbHVlX3R5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCB2b2lkKiwKKyAgICAgIEl0ZXJhdG9yVHJhaXRzPGNvbnN0IHZvaWQqIGNvbnN0Kj46OnZhbHVlX3R5cGU+KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGVsZW1lbnRfdHlwZSB0eXBlZGVmIGlzIGF2YWlsYWJsZSBpbiBzY29wZWRfcHRyIGFuZCByZWZlcnMKKy8vIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZS4KK1RFU1QoU2NvcGVkUHRyVGVzdCwgRGVmaW5lc0VsZW1lbnRUeXBlKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI8aW50Pjo6ZWxlbWVudF90eXBlPigpOworfQorCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBJbXBsZW1lbnQgVEhFIFJFU1Qgb2Ygc2NvcGVkX3B0ciB0ZXN0cy4KKworVEVTVChHdGVzdENoZWNrU3ludGF4VGVzdCwgQmVoYXZlc0xpa2VBU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEdURVNUX0NIRUNLXyhmYWxzZSkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXQncyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seS4iOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgR1RFU1RfQ0hFQ0tfKHRydWUpOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgOyAgLy8gTk9MSU5UCisgIGVsc2UKKyAgICBHVEVTVF9DSEVDS18odHJ1ZSkgPDwgIiI7Cit9CisKK1RFU1QoR3Rlc3RDaGVja1N5bnRheFRlc3QsIFdvcmtzV2l0aFN3aXRjaCkgeworICBzd2l0Y2ggKDApIHsKKyAgICBjYXNlIDE6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1RFU1RfQ0hFQ0tfKHRydWUpOworICB9CisKKyAgc3dpdGNoICgwKQorICAgIGNhc2UgMDoKKyAgICAgIEdURVNUX0NIRUNLXyh0cnVlKSA8PCAiQ2hlY2sgZmFpbGVkIGluIHN3aXRjaCBjYXNlIjsKK30KKworLy8gVmVyaWZpZXMgYmVoYXZpb3Igb2YgRm9ybWF0RmlsZUxvY2F0aW9uLgorVEVTVChGb3JtYXRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzRmlsZUxvY2F0aW9uKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJmb28uY2MiLCBGb3JtYXRGaWxlTG9jYXRpb24oImZvby5jYyIsIDQyKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICI0MiIsIEZvcm1hdEZpbGVMb2NhdGlvbigiZm9vLmNjIiwgNDIpKTsKK30KKworVEVTVChGb3JtYXRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVW5rbm93bkZpbGUpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMigKKyAgICAgIElzU3Vic3RyaW5nLCAidW5rbm93biBmaWxlIiwgRm9ybWF0RmlsZUxvY2F0aW9uKE5VTEwsIDQyKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICI0MiIsIEZvcm1hdEZpbGVMb2NhdGlvbihOVUxMLCA0MikpOworfQorCitURVNUKEZvcm1hdEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVa25vd25MaW5lKSB7CisgIEVYUEVDVF9FUSgiZm9vLmNjOiIsIEZvcm1hdEZpbGVMb2NhdGlvbigiZm9vLmNjIiwgLTEpKTsKK30KKworVEVTVChGb3JtYXRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duRmlsZUFuZExpbmUpIHsKKyAgRVhQRUNUX0VRKCJ1bmtub3duIGZpbGU6IiwgRm9ybWF0RmlsZUxvY2F0aW9uKE5VTEwsIC0xKSk7Cit9CisKKy8vIFZlcmlmaWVzIGJlaGF2aW9yIG9mIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24uCitURVNUKEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzRmlsZUxvY2F0aW9uKSB7CisgIEVYUEVDVF9FUSgiZm9vLmNjOjQyIiwgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigiZm9vLmNjIiwgNDIpKTsKK30KKworVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkZpbGUpIHsKKyAgRVhQRUNUX0VRKCJ1bmtub3duIGZpbGU6NDIiLAorICAgICAgICAgICAgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbihOVUxMLCA0MikpOworfQorCitURVNUKEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duTGluZSkgeworICBFWFBFQ1RfRVEoImZvby5jYyIsIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oImZvby5jYyIsIC0xKSk7Cit9CisKK1RFU1QoRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVa25vd25GaWxlQW5kTGluZSkgeworICBFWFBFQ1RfRVEoInVua25vd24gZmlsZSIsIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oTlVMTCwgLTEpKTsKK30KKworI2lmIEdURVNUX09TX01BQyB8fCBHVEVTVF9PU19RTlgKK3ZvaWQqIFRocmVhZEZ1bmModm9pZCogZGF0YSkgeworICBwdGhyZWFkX211dGV4X3QqIG11dGV4ID0gc3RhdGljX2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4oZGF0YSk7CisgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK1RFU1QoR2V0VGhyZWFkQ291bnRUZXN0LCBSZXR1cm5zQ29ycmVjdFZhbHVlKSB7CisgIEVYUEVDVF9FUSgxVSwgR2V0VGhyZWFkQ291bnQoKSk7CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKKyAgcHRocmVhZF9hdHRyX3QgIGF0dHI7CisgIHB0aHJlYWRfdCAgICAgICB0aHJlYWRfaWQ7CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogdHVybiBtdXRleCBpbnRvIGludGVybmFsOjpNdXRleCBmb3IgYXV0b21hdGljCisgIC8vIGRlc3RydWN0aW9uLgorICBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LCBOVUxMKTsKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CisgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cikpOworICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSkpOworCisgIGNvbnN0IGludCBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkX2lkLCAmYXR0ciwgJlRocmVhZEZ1bmMsICZtdXRleCk7CisgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cikpOworICBBU1NFUlRfRVEoMCwgc3RhdHVzKTsKKyAgRVhQRUNUX0VRKDJVLCBHZXRUaHJlYWRDb3VudCgpKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKKworICB2b2lkKiBkdW1teTsKKyAgQVNTRVJUX0VRKDAsIHB0aHJlYWRfam9pbih0aHJlYWRfaWQsICZkdW1teSkpOworCisjIGlmIEdURVNUX09TX01BQworCisgIC8vIE1hY09TIFggbWF5IG5vdCBpbW1lZGlhdGVseSByZXBvcnQgdGhlIHVwZGF0ZWQgdGhyZWFkIGNvdW50IGFmdGVyCisgIC8vIGpvaW5pbmcgYSB0aHJlYWQsIGNhdXNpbmcgZmxha2luZXNzIGluIHRoaXMgdGVzdC4gVG8gY291bnRlciB0aGF0LCB3ZQorICAvLyB3YWl0IGZvciB1cCB0byAuNSBzZWNvbmRzIGZvciB0aGUgT1MgdG8gcmVwb3J0IHRoZSBjb3JyZWN0IHZhbHVlLgorICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIGlmIChHZXRUaHJlYWRDb3VudCgpID09IDEpCisgICAgICBicmVhazsKKworICAgIFNsZWVwTWlsbGlzZWNvbmRzKDEwMCk7CisgIH0KKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyAgRVhQRUNUX0VRKDFVLCBHZXRUaHJlYWRDb3VudCgpKTsKKyAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleCk7Cit9CisjZWxzZQorVEVTVChHZXRUaHJlYWRDb3VudFRlc3QsIFJldHVybnNaZXJvV2hlblVuYWJsZVRvQ291bnRUaHJlYWRzKSB7CisgIEVYUEVDVF9FUSgwVSwgR2V0VGhyZWFkQ291bnQoKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX01BQyB8fCBHVEVTVF9PU19RTlgKKworVEVTVChHdGVzdENoZWNrRGVhdGhUZXN0LCBEaWVzV2l0aENvcnJlY3RPdXRwdXRPbkZhaWx1cmUpIHsKKyAgY29uc3QgYm9vbCBhX2ZhbHNlX2NvbmRpdGlvbiA9IGZhbHNlOworICBjb25zdCBjaGFyIHJlZ2V4W10gPQorI2lmZGVmIF9NU0NfVkVSCisgICAgICJndGVzdC1wb3J0X3Rlc3RcXC5jY1xcKFxcZCtcXCk6IgorI2VsaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorICAgICAiZ3Rlc3QtcG9ydF90ZXN0XFwuY2M6WzAtOV0rIgorI2Vsc2UKKyAgICAgImd0ZXN0LXBvcnRfdGVzdFxcLmNjOlxcZCsiCisjZW5kaWYgIC8vIF9NU0NfVkVSCisgICAgICIuKmFfZmFsc2VfY29uZGl0aW9uLipFeHRyYSBpbmZvLioiOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoR1RFU1RfQ0hFQ0tfKGFfZmFsc2VfY29uZGl0aW9uKSA8PCAiRXh0cmEgaW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXgpOworfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworVEVTVChHdGVzdENoZWNrRGVhdGhUZXN0LCBMaXZlc1NpbGVudGx5T25TdWNjZXNzKSB7CisgIEVYUEVDVF9FWElUKHsKKyAgICAgIEdURVNUX0NIRUNLXyh0cnVlKSA8PCAiRXh0cmEgaW5mbyI7CisgICAgICA6OnN0ZDo6Y2VyciA8PCAiU3VjY2Vzc1xuIjsKKyAgICAgIGV4aXQoMCk7IH0sCisgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiU3VjY2VzcyIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3QgY2hvb3NlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgYXBwcm9wcmlhdGUgdG8KKy8vIHRoZSBwbGF0Zm9ybS4gVGhlIHRlc3Qgd2lsbCBwcm9kdWNlIGNvbXBpbGVyIGVycm9ycyBpbiBjYXNlIG9mIGZhaWx1cmUuCisvLyBGb3Igc2ltcGxpY2l0eSwgd2Ugb25seSBjb3ZlciB0aGUgbW9zdCBpbXBvcnRhbnQgcGxhdGZvcm1zIGhlcmUuCitURVNUKFJlZ2V4RW5naW5lU2VsZWN0aW9uVGVzdCwgU2VsZWN0c0NvcnJlY3RSZWdleEVuZ2luZSkgeworI2lmIEdURVNUX0hBU19QT1NJWF9SRQorCisgIEVYUEVDVF9UUlVFKEdURVNUX1VTRVNfUE9TSVhfUkUpOworCisjZWxzZQorCisgIEVYUEVDVF9UUlVFKEdURVNUX1VTRVNfU0lNUExFX1JFKTsKKworI2VuZGlmCit9CisKKyNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCisKKyMgaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KK2NsYXNzIFJFVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKKy8vIERlZmluZXMgU3RyaW5nVHlwZXMgYXMgdGhlIGxpc3Qgb2YgYWxsIHN0cmluZyB0eXBlcyB0aGF0IGNsYXNzIFJFCisvLyBzdXBwb3J0cy4KK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8CisgICAgOjpzdGQ6OnN0cmluZywKKyMgIGlmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisgICAgOjpzdHJpbmcsCisjICBlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKyAgICBjb25zdCBjaGFyKj4gU3RyaW5nVHlwZXM7CisKK1RZUEVEX1RFU1RfQ0FTRShSRVRlc3QsIFN0cmluZ1R5cGVzKTsKKworLy8gVGVzdHMgUkUncyBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMuCitUWVBFRF9URVNUKFJFVGVzdCwgSW1wbGljaXRDb25zdHJ1Y3RvcldvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KFR5cGVQYXJhbSgiIikpOworICBFWFBFQ1RfU1RSRVEoIiIsIGVtcHR5LnBhdHRlcm4oKSk7CisKKyAgY29uc3QgUkUgc2ltcGxlKFR5cGVQYXJhbSgiaGVsbG8iKSk7CisgIEVYUEVDVF9TVFJFUSgiaGVsbG8iLCBzaW1wbGUucGF0dGVybigpKTsKKworICBjb25zdCBSRSBub3JtYWwoVHlwZVBhcmFtKCIuKihcXHcrKSIpKTsKKyAgRVhQRUNUX1NUUkVRKCIuKihcXHcrKSIsIG5vcm1hbC5wYXR0ZXJuKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFJFJ3MgY29uc3RydWN0b3JzIHJlamVjdCBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCitUWVBFRF9URVNUKFJFVGVzdCwgUmVqZWN0c0ludmFsaWRSZWdleCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgY29uc3QgUkUgaW52YWxpZChUeXBlUGFyYW0oIj8iKSk7CisgIH0sICJcIj9cIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIik7Cit9CisKKy8vIFRlc3RzIFJFOjpGdWxsTWF0Y2goKS4KK1RZUEVEX1RFU1QoUkVUZXN0LCBGdWxsTWF0Y2hXb3JrcykgeworICBjb25zdCBSRSBlbXB0eShUeXBlUGFyYW0oIiIpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oIiIpLCBlbXB0eSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImEiKSwgZW1wdHkpKTsKKworICBjb25zdCBSRSByZShUeXBlUGFyYW0oImEuKnoiKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCJheiIpLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYXh5eiIpLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImJheiIpLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImF6eSIpLCByZSkpOworfQorCisvLyBUZXN0cyBSRTo6UGFydGlhbE1hdGNoKCkuCitUWVBFRF9URVNUKFJFVGVzdCwgUGFydGlhbE1hdGNoV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoVHlwZVBhcmFtKCIiKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCIiKSwgZW1wdHkpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImEiKSwgZW1wdHkpKTsKKworICBjb25zdCBSRSByZShUeXBlUGFyYW0oImEuKnoiKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJheiIpLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYXh5eiIpLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYmF6IiksIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJhenkiKSwgcmUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJ6emEiKSwgcmUpKTsKK30KKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworI2VsaWYgR1RFU1RfVVNFU19TSU1QTEVfUkUKKworVEVTVChJc0luU2V0VGVzdCwgTnVsQ2hhcklzTm90SW5BbnlTZXQpIHsKKyAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ1wwJywgIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ1wwJywgIlwwIikpOworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnXDAnLCAiYSIpKTsKK30KKworVEVTVChJc0luU2V0VGVzdCwgV29ya3NGb3JOb25OdWxDaGFycykgeworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnYScsICJBYiIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ2MnLCAiIikpOworCisgIEVYUEVDVF9UUlVFKElzSW5TZXQoJ2InLCAiYmNkIikpOworICBFWFBFQ1RfVFJVRShJc0luU2V0KCdiJywgImFiIikpOworfQorCitURVNUKElzQXNjaWlEaWdpdFRlc3QsIElzRmFsc2VGb3JOb25EaWdpdCkgeworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnKycpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnLScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnLicpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnYScpKTsKK30KKworVEVTVChJc0FzY2lpRGlnaXRUZXN0LCBJc1RydWVGb3JEaWdpdCkgeworICBFWFBFQ1RfVFJVRShJc0FzY2lpRGlnaXQoJzAnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlEaWdpdCgnMScpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaURpZ2l0KCc1JykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpRGlnaXQoJzknKSk7Cit9CisKK1RFU1QoSXNBc2NpaVB1bmN0VGVzdCwgSXNGYWxzZUZvck5vblB1bmN0KSB7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCdcbicpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnMCcpKTsKK30KKworVEVTVChJc0FzY2lpUHVuY3RUZXN0LCBJc1RydWVGb3JQdW5jdCkgeworICBmb3IgKGNvbnN0IGNoYXIqIHAgPSAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiI7ICpwOyBwKyspIHsKKyAgICBFWFBFQ1RfUFJFRDEoSXNBc2NpaVB1bmN0LCAqcCk7CisgIH0KK30KKworVEVTVChJc1JlcGVhdFRlc3QsIElzRmFsc2VGb3JOb25SZXBlYXRDaGFyKSB7CisgIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCdhJykpOworICBFWFBFQ1RfRkFMU0UoSXNSZXBlYXQoJzEnKSk7CisgIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnLScpKTsKK30KKworVEVTVChJc1JlcGVhdFRlc3QsIElzVHJ1ZUZvclJlcGVhdENoYXIpIHsKKyAgRVhQRUNUX1RSVUUoSXNSZXBlYXQoJz8nKSk7CisgIEVYUEVDVF9UUlVFKElzUmVwZWF0KCcqJykpOworICBFWFBFQ1RfVFJVRShJc1JlcGVhdCgnKycpKTsKK30KKworVEVTVChJc0FzY2lpV2hpdGVTcGFjZVRlc3QsIElzRmFsc2VGb3JOb25XaGl0ZVNwYWNlKSB7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCcxJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdoaXRlU3BhY2UoJysnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnXycpKTsKK30KKworVEVTVChJc0FzY2lpV2hpdGVTcGFjZVRlc3QsIElzVHJ1ZUZvcldoaXRlU3BhY2UpIHsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJyAnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdcbicpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1xyJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXHQnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdcdicpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1xmJykpOworfQorCitURVNUKElzQXNjaWlXb3JkQ2hhclRlc3QsIElzRmFsc2VGb3JOb25Xb3JkQ2hhcikgeworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignKycpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignLicpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignICcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignXG4nKSk7Cit9CisKK1RFU1QoSXNBc2NpaVdvcmRDaGFyVGVzdCwgSXNUcnVlRm9yTGV0dGVyKSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignYScpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdiJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ0EnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignWicpKTsKK30KKworVEVTVChJc0FzY2lpV29yZENoYXJUZXN0LCBJc1RydWVGb3JEaWdpdCkgeworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJzAnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignMScpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCc3JykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJzknKSk7Cit9CisKK1RFU1QoSXNBc2NpaVdvcmRDaGFyVGVzdCwgSXNUcnVlRm9yVW5kZXJzY29yZSkgeworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ18nKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzRmFsc2VGb3JOb25QcmludGFibGUpIHsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnXDAwNycpKTsKK30KKworVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvckRpZ2l0KSB7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCcwJykpOworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnOScpKTsKK30KKworVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvcldoaXRlU3BhY2UpIHsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJyAnKSk7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdcbicpKTsKK30KKworVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvclNvbWVMZXR0ZXIpIHsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdaJykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc1RydWVGb3JQdW5jdCkgeworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCcuJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCctJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCdeJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCckJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCcoJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCddJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCd7JykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCd8JykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc1RydWVGb3JTb21lTGV0dGVyKSB7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ2QnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ0QnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3MnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ1MnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3cnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ1cnKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZFB1bmN0KSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1xcJywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdcXCcsICcgJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdfJywgJy4nKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJy4nLCAnYScpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1xcJywgJ1xcJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ18nLCAnXycpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICcrJywgJysnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnLicsICcuJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfZCkgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnLicpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnMCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJzknKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9EKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ0QnLCAnMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICc5JykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICdcMCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJ2EnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICctJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfcykgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnLicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICc5JykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICcgJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnXG4nKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICdcdCcpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX1MpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICcgJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJ1xyJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICdcMCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJ2EnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICc5JykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfdykgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJysnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdcbicpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnMCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ2InKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdDJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnXycpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX1cpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdBJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ2InKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnOScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdfJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdcMCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJyonKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdcbicpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkV2hpdGVTcGFjZSkgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdmJywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdmJywgJ1xuJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICduJywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICduJywgJ1xyJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdyJywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdyJywgJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3QnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3QnLCAndCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndicsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndicsICdcZicpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2YnLCAnXGYnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnbicsICdcbicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdyJywgJ1xyJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3QnLCAnXHQnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndicsICdcdicpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBVbmVzY2FwZWREb3QpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnXG4nKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICdcMCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICcuJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJ2EnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnICcpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBVbmVzY2FwZWRDaGFyKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICdhJywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnYScsICdiJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnJCcsICdhJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJyQnLCAnJCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnNScsICc1JykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICdaJywgJ1onKSk7Cit9CisKK1RFU1QoVmFsaWRhdGVSZWdleFRlc3QsIEdlbmVyYXRlc0ZhaWx1cmVBbmRSZXR1cm5zRmFsc2VGb3JJbnZhbGlkKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KE5VTEwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJhXFwiKSksCisgICAgICAiU3ludGF4IGVycm9yIGF0IGluZGV4IDEgaW4gc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBcImFcXFwiOiAiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImFcXCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJcXG5cXCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJcXHNcXGhiIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXCJcXGhcIiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiXl4iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmciKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIi4qXmIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmciKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIiQkIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJeJGEiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInJCcgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImEoYiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicoJyBpcyB1bnN1cHBvcnRlZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYWIpIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJyknIGlzIHVuc3VwcG9ydGVkIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJbYWIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInWycgaXMgdW5zdXBwb3J0ZWQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImF7MiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIid7JyBpcyB1bnN1cHBvcnRlZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiPyIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIic/JyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJeKiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicqJyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCI1KisiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInKycgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbiIpOworfQorCitURVNUKFZhbGlkYXRlUmVnZXhUZXN0LCBSZXR1cm5zVHJ1ZUZvclZhbGlkKSB7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIiIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiYSIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiLioiKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIl5hXysiKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIl5hXFx0XFwmPyIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiMDkqJCIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiXlokIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJhXFxeWlxcJFxcKFxcKVxcfFxcW1xcXVxce1xcfSIpKTsKK30KKworVEVTVChNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZFRlc3QsIFdvcmtzRm9yWmVyb09yT25lKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJ2EnLCAnPycsICJhIiwgImJhIikpOworICAvLyBSZXBlYXRpbmcgbW9yZSB0aGFuIG9uY2UuCisgIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJ2EnLCAnPycsICJiIiwgImFhYiIpKTsKKworICAvLyBSZXBlYXRpbmcgemVybyB0aW1lcy4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICdhJywgJz8nLCAiYiIsICJiYSIpKTsKKyAgLy8gUmVwZWF0aW5nIG9uY2UuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnYScsICc/JywgImIiLCAiYWIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnIycsICc/JywgIi4iLCAiIyMiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc0Zvclplcm9Pck1hbnkpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcqJywgImEkIiwgImJhYWIiKSk7CisKKyAgLy8gUmVwZWF0aW5nIHplcm8gdGltZXMuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcqJywgImIiLCAiYmMiKSk7CisgIC8vIFJlcGVhdGluZyBvbmNlLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKicsICJiIiwgImFiYyIpKTsKKyAgLy8gUmVwZWF0aW5nIG1vcmUgdGhhbiBvbmNlLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCh0cnVlLCAndycsICcqJywgIi0iLCAiYWJfMS1nIikpOworfQorCitURVNUKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NGb3JPbmVPck1hbnkpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcrJywgImEkIiwgImJhYWIiKSk7CisgIC8vIFJlcGVhdGluZyB6ZXJvIHRpbWVzLgorICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJysnLCAiYiIsICJiYyIpKTsKKworICAvLyBSZXBlYXRpbmcgb25jZS4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJysnLCAiYiIsICJhYmMiKSk7CisgIC8vIFJlcGVhdGluZyBtb3JlIHRoYW4gb25jZS4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQodHJ1ZSwgJ3cnLCAnKycsICItIiwgImFiXzEtZyIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgUmV0dXJuc1RydWVGb3JFbXB0eVJlZ2V4KSB7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIiIsICIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIiIsICJhYiIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NXaGVuRG9sbGFySXNJblJlZ2V4KSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCIkIiwgImEiKSk7CisKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiJCIsICIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImEkIiwgImEiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsIFdvcmtzV2hlblJlZ2V4U3RhcnRzV2l0aEVzY2FwZVNlcXVlbmNlKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJcXHciLCAiKyIpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIlxcVyIsICJhYiIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXHNhIiwgIlxuYWIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcZCIsICIxYSIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoUmVwZXRpdGlvbikgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiLithIiwgImFiYyIpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoImE/YiIsICJhYWIiKSk7CisKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiLiphIiwgImJjMTItYWIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImE/YiIsICJiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJhP2IiLCAiYWIiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsCisgICAgIFdvcmtzV2hlblJlZ2V4U3RhcnRzV2l0aFJlcGV0aW9uT2ZFc2NhcGVTZXF1ZW5jZSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiXFwuK2EiLCAiYWJjIikpOworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiXFxzP2IiLCAiICBiIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcKCphIiwgIigoKChhYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxeP2IiLCAiXmIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcXFw/YiIsICJiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXFxcP2IiLCAiXFxiIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBNYXRjaGVzU2VxdWVudGlhbGx5KSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJhYi4qYyIsICJhY2FiYyIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJhYi4qYyIsICJhYi1mc2MiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblN0cmluZ0lzTnVsbCkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCIiLCBOVUxMKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoQ2FyZXQpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXmEiLCAiYmEiKSk7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoIl4kIiwgImEiKSk7CisKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJeYSIsICJhYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJeIiwgImFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIl4kIiwgIiIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBSZXR1cm5zRmFsc2VXaGVuTm9NYXRjaCkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCJhIiwgImJjZGUxMjMiKSk7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoImEuK2EiLCAiLS1hYTg4ODg4ODg4IikpOworfQorCitURVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFJldHVybnNUcnVlV2hlbk1hdGNoaW5nUHJlZml4KSB7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXFx3KyIsICJhYjFfIC0gNSIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCIuKj0iLCAiPSIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJ4LiphYj8uKmJjIiwgInhhYWFiYyIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5NYXRjaGluZ05vblByZWZpeCkgeworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIlxcdysiLCAiJCQkIGFiMV8gLSA1IikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIlxcLis9IiwgIj0gIC4uLj0iKSk7Cit9CisKKy8vIFRlc3RzIFJFJ3MgaW1wbGljaXQgY29uc3RydWN0b3JzLgorVEVTVChSRVRlc3QsIEltcGxpY2l0Q29uc3RydWN0b3JXb3JrcykgeworICBjb25zdCBSRSBlbXB0eSgiIik7CisgIEVYUEVDVF9TVFJFUSgiIiwgZW1wdHkucGF0dGVybigpKTsKKworICBjb25zdCBSRSBzaW1wbGUoImhlbGxvIik7CisgIEVYUEVDVF9TVFJFUSgiaGVsbG8iLCBzaW1wbGUucGF0dGVybigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBSRSdzIGNvbnN0cnVjdG9ycyByZWplY3QgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25zLgorVEVTVChSRVRlc3QsIFJlamVjdHNJbnZhbGlkUmVnZXgpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIGNvbnN0IFJFIG5vcm1hbChOVUxMKTsKKyAgfSwgIk5VTEwgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBjb25zdCBSRSBub3JtYWwoIi4qKFxcdysiKTsKKyAgfSwgIicoJyBpcyB1bnN1cHBvcnRlZCIpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBjb25zdCBSRSBpbnZhbGlkKCJePyIpOworICB9LCAiJz8nIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4iKTsKK30KKworLy8gVGVzdHMgUkU6OkZ1bGxNYXRjaCgpLgorVEVTVChSRVRlc3QsIEZ1bGxNYXRjaFdvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KCIiKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaCgiIiwgZW1wdHkpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goImEiLCBlbXB0eSkpOworCisgIGNvbnN0IFJFIHJlMSgiYSIpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCJhIiwgcmUxKSk7CisKKyAgY29uc3QgUkUgcmUoImEuKnoiKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaCgiYXoiLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCJheHl6IiwgcmUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goImJheiIsIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKCJhenkiLCByZSkpOworfQorCisvLyBUZXN0cyBSRTo6UGFydGlhbE1hdGNoKCkuCitURVNUKFJFVGVzdCwgUGFydGlhbE1hdGNoV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoIiIpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCIiLCBlbXB0eSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJhIiwgZW1wdHkpKTsKKworICBjb25zdCBSRSByZSgiYS4qeiIpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJheiIsIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImF4eXoiLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJiYXoiLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJhenkiLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OlBhcnRpYWxNYXRjaCgienphIiwgcmUpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworVEVTVChDYXB0dXJlVGVzdCwgQ2FwdHVyZXNTdGRvdXQpIHsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBmcHJpbnRmKHN0ZG91dCwgImFiYyIpOworICBFWFBFQ1RfU1RSRVEoImFiYyIsIEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSk7CisKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBmcHJpbnRmKHN0ZG91dCwgImRlZiVjZ2hpIiwgJ1wwJyk7CisgIEVYUEVDVF9FUSg6OnN0ZDo6c3RyaW5nKCJkZWZcMGdoaSIsIDcpLCA6OnN0ZDo6c3RyaW5nKEdldENhcHR1cmVkU3Rkb3V0KCkpKTsKK30KKworVEVTVChDYXB0dXJlVGVzdCwgQ2FwdHVyZXNTdGRlcnIpIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBmcHJpbnRmKHN0ZGVyciwgImprbCIpOworICBFWFBFQ1RfU1RSRVEoImprbCIsIEdldENhcHR1cmVkU3RkZXJyKCkuY19zdHIoKSk7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICBmcHJpbnRmKHN0ZGVyciwgImprbCVjbW5vIiwgJ1wwJyk7CisgIEVYUEVDVF9FUSg6OnN0ZDo6c3RyaW5nKCJqa2xcMG1ubyIsIDcpLCA6OnN0ZDo6c3RyaW5nKEdldENhcHR1cmVkU3RkZXJyKCkpKTsKK30KKworLy8gVGVzdHMgdGhhdCBzdGRvdXQgYW5kIHN0ZGVyciBjYXB0dXJlIGRvbid0IGludGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIuCitURVNUKENhcHR1cmVUZXN0LCBDYXB0dXJlc1N0ZG91dEFuZFN0ZGVycikgeworICBDYXB0dXJlU3Rkb3V0KCk7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgZnByaW50ZihzdGRvdXQsICJwcXIiKTsKKyAgZnByaW50ZihzdGRlcnIsICJzdHUiKTsKKyAgRVhQRUNUX1NUUkVRKCJwcXIiLCBHZXRDYXB0dXJlZFN0ZG91dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoInN0dSIsIEdldENhcHR1cmVkU3RkZXJyKCkuY19zdHIoKSk7Cit9CisKK1RFU1QoQ2FwdHVyZURlYXRoVGVzdCwgQ2Fubm90UmVlbnRlclN0ZG91dENhcHR1cmUpIHsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKENhcHR1cmVTdGRvdXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25seSBvbmUgc3Rkb3V0IGNhcHR1cmVyIGNhbiBleGlzdCBhdCBhIHRpbWUiKTsKKyAgR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKworICAvLyBXZSBjYW5ub3QgdGVzdCBzdGRlcnIgY2FwdHVyaW5nIHVzaW5nIGRlYXRoIHRlc3RzIGFzIHRoZXkgdXNlIGl0CisgIC8vIHRoZW1zZWx2ZXMuCit9CisKKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3JJbml0aWFsaXplc1RvRGVmYXVsdFZhbHVlcykgeworICBUaHJlYWRMb2NhbDxpbnQ+IHQxOworICBFWFBFQ1RfRVEoMCwgdDEuZ2V0KCkpOworCisgIFRocmVhZExvY2FsPHZvaWQqPiB0MjsKKyAgRVhQRUNUX1RSVUUodDIuZ2V0KCkgPT0gTlVMTCk7Cit9CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBTaW5nbGVQYXJhbUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXNUb1BhcmFtKSB7CisgIFRocmVhZExvY2FsPGludD4gdDEoMTIzKTsKKyAgRVhQRUNUX0VRKDEyMywgdDEuZ2V0KCkpOworCisgIGludCBpID0gMDsKKyAgVGhyZWFkTG9jYWw8aW50Kj4gdDIoJmkpOworICBFWFBFQ1RfRVEoJmksIHQyLmdldCgpKTsKK30KKworY2xhc3MgTm9EZWZhdWx0Q29udHJ1Y3RvciB7CisgcHVibGljOgorICBleHBsaWNpdCBOb0RlZmF1bHRDb250cnVjdG9yKGNvbnN0IGNoYXIqKSB7fQorICBOb0RlZmF1bHRDb250cnVjdG9yKGNvbnN0IE5vRGVmYXVsdENvbnRydWN0b3ImKSB7fQorfTsKKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIFZhbHVlRGVmYXVsdENvbnRydWN0b3JJc05vdFJlcXVpcmVkRm9yUGFyYW1WZXJzaW9uKSB7CisgIFRocmVhZExvY2FsPE5vRGVmYXVsdENvbnRydWN0b3I+IGJhcihOb0RlZmF1bHRDb250cnVjdG9yKCJmb28iKSk7CisgIGJhci5wb2ludGVyKCk7Cit9CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBHZXRBbmRQb2ludGVyUmV0dXJuU2FtZVZhbHVlKSB7CisgIFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiB0aHJlYWRfbG9jYWxfc3RyaW5nOworCisgIEVYUEVDVF9FUSh0aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSwgJih0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpKSk7CisKKyAgLy8gVmVyaWZpZXMgdGhlIGNvbmRpdGlvbiBzdGlsbCBob2xkcyBhZnRlciBjYWxsaW5nIHNldC4KKyAgdGhyZWFkX2xvY2FsX3N0cmluZy5zZXQoImZvbyIpOworICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCksICYodGhyZWFkX2xvY2FsX3N0cmluZy5nZXQoKSkpOworfQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgUG9pbnRlckFuZENvbnN0UG9pbnRlclJldHVyblNhbWVWYWx1ZSkgeworICBUaHJlYWRMb2NhbDxzdGQ6OnN0cmluZz4gdGhyZWFkX2xvY2FsX3N0cmluZzsKKyAgY29uc3QgVGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+JiBjb25zdF90aHJlYWRfbG9jYWxfc3RyaW5nID0KKyAgICAgIHRocmVhZF9sb2NhbF9zdHJpbmc7CisKKyAgRVhQRUNUX0VRKHRocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpLCBjb25zdF90aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSk7CisKKyAgdGhyZWFkX2xvY2FsX3N0cmluZy5zZXQoImZvbyIpOworICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCksIGNvbnN0X3RocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpKTsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKwordm9pZCBBZGRUd28oaW50KiBwYXJhbSkgeyAqcGFyYW0gKz0gMjsgfQorCitURVNUKFRocmVhZFdpdGhQYXJhbVRlc3QsIENvbnN0cnVjdG9yRXhlY3V0ZXNUaHJlYWRGdW5jKSB7CisgIGludCBpID0gNDA7CisgIFRocmVhZFdpdGhQYXJhbTxpbnQqPiB0aHJlYWQoJkFkZFR3bywgJmksIE5VTEwpOworICB0aHJlYWQuSm9pbigpOworICBFWFBFQ1RfRVEoNDIsIGkpOworfQorCitURVNUKE11dGV4RGVhdGhUZXN0LCBBc3NlcnRIZWxkU2hvdWxkQXNzZXJ0V2hlbk5vdExvY2tlZCkgeworICAvLyBBc3NlcnRIZWxkKCkgaXMgZmxha3kgb25seSBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgdGhyZWFkcyBhY2Nlc3NpbmcKKyAgLy8gdGhlIGxvY2suIEluIHRoaXMgY2FzZSwgdGhlIHRlc3QgaXMgcm9idXN0LgorICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKKyAgICBNdXRleCBtOworICAgIHsgTXV0ZXhMb2NrIGxvY2soJm0pOyB9CisgICAgbS5Bc3NlcnRIZWxkKCk7CisgIH0sCisgICJ0aHJlYWQgLipob2xkIik7Cit9CisKK1RFU1QoTXV0ZXhUZXN0LCBBc3NlcnRIZWxkU2hvdWxkTm90QXNzZXJ0V2hlbkxvY2tlZCkgeworICBNdXRleCBtOworICBNdXRleExvY2sgbG9jaygmbSk7CisgIG0uQXNzZXJ0SGVsZCgpOworfQorCitjbGFzcyBBdG9taWNDb3VudGVyV2l0aE11dGV4IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEF0b21pY0NvdW50ZXJXaXRoTXV0ZXgoTXV0ZXgqIG11dGV4KSA6CisgICAgdmFsdWVfKDApLCBtdXRleF8obXV0ZXgpLCByYW5kb21fKDQyKSB7fQorCisgIHZvaWQgSW5jcmVtZW50KCkgeworICAgIE11dGV4TG9jayBsb2NrKG11dGV4Xyk7CisgICAgaW50IHRlbXAgPSB2YWx1ZV87CisgICAgeworICAgICAgLy8gTG9ja2luZyBhIG11dGV4IHB1dHMgdXAgYSBtZW1vcnkgYmFycmllciwgcHJldmVudGluZyByZWFkcyBhbmQKKyAgICAgIC8vIHdyaXRlcyB0byB2YWx1ZV8gcmVhcnJhbmdlZCB3aGVuIG9ic2VydmVkIGZyb20gb3RoZXIgdGhyZWFkcy4KKyAgICAgIC8vCisgICAgICAvLyBXZSBjYW5ub3QgdXNlIE11dGV4IGFuZCBNdXRleExvY2sgaGVyZSBvciByZWx5IG9uIHRoZWlyIG1lbW9yeQorICAgICAgLy8gYmFycmllciBmdW5jdGlvbmFsaXR5IGFzIHdlIGFyZSB0ZXN0aW5nIHRoZW0gaGVyZS4KKyAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtZW1vcnlfYmFycmllcl9tdXRleDsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbWVtb3J5X2JhcnJpZXJfbXV0ZXgsIE5VTEwpKTsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfbG9jaygmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKKworICAgICAgU2xlZXBNaWxsaXNlY29uZHMocmFuZG9tXy5HZW5lcmF0ZSgzMCkpOworCisgICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X3VubG9jaygmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKKyAgICB9CisgICAgdmFsdWVfID0gdGVtcCArIDE7CisgIH0KKyAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICB2b2xhdGlsZSBpbnQgdmFsdWVfOworICBNdXRleCogY29uc3QgbXV0ZXhfOyAgLy8gUHJvdGVjdHMgdmFsdWVfLgorICBSYW5kb20gICAgICAgcmFuZG9tXzsKK307CisKK3ZvaWQgQ291bnRpbmdUaHJlYWRGdW5jKHBhaXI8QXRvbWljQ291bnRlcldpdGhNdXRleCosIGludD4gcGFyYW0pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbS5zZWNvbmQ7ICsraSkKKyAgICAgIHBhcmFtLmZpcnN0LT5JbmNyZW1lbnQoKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbXV0ZXggb25seSBsZXRzIG9uZSB0aHJlYWQgYXQgYSB0aW1lIHRvIGxvY2sgaXQuCitURVNUKE11dGV4VGVzdCwgT25seU9uZVRocmVhZENhbkxvY2tBdEFUaW1lKSB7CisgIE11dGV4IG11dGV4OworICBBdG9taWNDb3VudGVyV2l0aE11dGV4IGxvY2tlZF9jb3VudGVyKCZtdXRleCk7CisKKyAgdHlwZWRlZiBUaHJlYWRXaXRoUGFyYW08cGFpcjxBdG9taWNDb3VudGVyV2l0aE11dGV4KiwgaW50PiA+IFRocmVhZFR5cGU7CisgIGNvbnN0IGludCBrQ3ljbGVDb3VudCA9IDIwOworICBjb25zdCBpbnQga1RocmVhZENvdW50ID0gNzsKKyAgc2NvcGVkX3B0cjxUaHJlYWRUeXBlPiBjb3VudGluZ190aHJlYWRzW2tUaHJlYWRDb3VudF07CisgIE5vdGlmaWNhdGlvbiB0aHJlYWRzX2Nhbl9zdGFydDsKKyAgLy8gQ3JlYXRlcyBhbmQgcnVucyBrVGhyZWFkQ291bnQgdGhyZWFkcyB0aGF0IGluY3JlbWVudCBsb2NrZWRfY291bnRlcgorICAvLyBrQ3ljbGVDb3VudCB0aW1lcyBlYWNoLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRDb3VudDsgKytpKSB7CisgICAgY291bnRpbmdfdGhyZWFkc1tpXS5yZXNldChuZXcgVGhyZWFkVHlwZSgmQ291bnRpbmdUaHJlYWRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCZsb2NrZWRfY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ3ljbGVDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkc19jYW5fc3RhcnQpKTsKKyAgfQorICB0aHJlYWRzX2Nhbl9zdGFydC5Ob3RpZnkoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkQ291bnQ7ICsraSkKKyAgICBjb3VudGluZ190aHJlYWRzW2ldLT5Kb2luKCk7CisKKyAgLy8gSWYgdGhlIG11dGV4IGxldHMgbW9yZSB0aGFuIG9uZSB0aHJlYWQgdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIGF0IGEKKyAgLy8gdGltZSwgdGhleSBhcmUgbGlrZWx5IHRvIGVuY291bnRlciBhIHJhY2UgY29uZGl0aW9uIGFuZCBoYXZlIHNvbWUKKyAgLy8gaW5jcmVtZW50cyBvdmVyd3JpdHRlbiwgcmVzdWx0aW5nIGluIHRoZSBsb3dlciB0aGVuIGV4cGVjdGVkIGNvdW50ZXIKKyAgLy8gdmFsdWUuCisgIEVYUEVDVF9FUShrQ3ljbGVDb3VudCAqIGtUaHJlYWRDb3VudCwgbG9ja2VkX2NvdW50ZXIudmFsdWUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBSdW5Gcm9tVGhyZWFkKHZvaWQgKGZ1bmMpKFQpLCBUIHBhcmFtKSB7CisgIFRocmVhZFdpdGhQYXJhbTxUPiB0aHJlYWQoZnVuYywgcGFyYW0sIE5VTEwpOworICB0aHJlYWQuSm9pbigpOworfQorCit2b2lkIFJldHJpZXZlVGhyZWFkTG9jYWxWYWx1ZSgKKyAgICBwYWlyPFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiosIHN0ZDo6c3RyaW5nKj4gcGFyYW0pIHsKKyAgKnBhcmFtLnNlY29uZCA9IHBhcmFtLmZpcnN0LT5nZXQoKTsKK30KKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIFBhcmFtZXRlcml6ZWRDb25zdHJ1Y3RvclNldHNEZWZhdWx0KSB7CisgIFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiB0aHJlYWRfbG9jYWxfc3RyaW5nKCJmb28iKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLCB0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpLmNfc3RyKCkpOworCisgIHRocmVhZF9sb2NhbF9zdHJpbmcuc2V0KCJiYXIiKTsKKyAgRVhQRUNUX1NUUkVRKCJiYXIiLCB0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpLmNfc3RyKCkpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgUnVuRnJvbVRocmVhZCgmUmV0cmlldmVUaHJlYWRMb2NhbFZhbHVlLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigmdGhyZWFkX2xvY2FsX3N0cmluZywgJnJlc3VsdCkpOworICBFWFBFQ1RfU1RSRVEoImZvbyIsIHJlc3VsdC5jX3N0cigpKTsKK30KKworLy8gRGVzdHJ1Y3RvclRyYWNrZXIga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBpdHMgaW5zdGFuY2VzIGhhdmUgYmVlbgorLy8gZGVzdHJveWVkLgorc3RhdGljIHN0ZDo6dmVjdG9yPGJvb2w+IGdfZGVzdHJveWVkOworCitjbGFzcyBEZXN0cnVjdG9yVHJhY2tlciB7CisgcHVibGljOgorICBEZXN0cnVjdG9yVHJhY2tlcigpIDogaW5kZXhfKEdldE5ld0luZGV4KCkpIHt9CisgIERlc3RydWN0b3JUcmFja2VyKGNvbnN0IERlc3RydWN0b3JUcmFja2VyJiAvKiByaHMgKi8pCisgICAgICA6IGluZGV4XyhHZXROZXdJbmRleCgpKSB7fQorICB+RGVzdHJ1Y3RvclRyYWNrZXIoKSB7CisgICAgLy8gV2UgbmV2ZXIgYWNjZXNzIGdfZGVzdHJveWVkIGNvbmN1cnJlbnRseSwgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgIC8vIHByb3RlY3QgdGhlIHdyaXRlIG9wZXJhdGlvbiB1bmRlciBhIG11dGV4LgorICAgIGdfZGVzdHJveWVkW2luZGV4X10gPSB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IEdldE5ld0luZGV4KCkgeworICAgIGdfZGVzdHJveWVkLnB1c2hfYmFjayhmYWxzZSk7CisgICAgcmV0dXJuIGdfZGVzdHJveWVkLnNpemUoKSAtIDE7CisgIH0KKyAgY29uc3QgaW50IGluZGV4XzsKK307CisKK3R5cGVkZWYgVGhyZWFkTG9jYWw8RGVzdHJ1Y3RvclRyYWNrZXI+KiBUaHJlYWRQYXJhbTsKKwordm9pZCBDYWxsVGhyZWFkTG9jYWxHZXQoVGhyZWFkUGFyYW0gdGhyZWFkX2xvY2FsX3BhcmFtKSB7CisgIHRocmVhZF9sb2NhbF9wYXJhbS0+Z2V0KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBhIFRocmVhZExvY2FsIG9iamVjdCBkaWVzIGluIGEgdGhyZWFkLCBpdCBkZXN0cm95cworLy8gdGhlIG1hbmFnZWQgb2JqZWN0IGZvciB0aGF0IHRocmVhZC4KK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBEZXN0cm95c01hbmFnZWRPYmplY3RGb3JPd25UaHJlYWRXaGVuRHlpbmcpIHsKKyAgZ19kZXN0cm95ZWQuY2xlYXIoKTsKKworICB7CisgICAgLy8gVGhlIG5leHQgbGluZSBkZWZhdWx0IGNvbnN0cnVjdHMgYSBEZXN0cnVjdG9yVHJhY2tlciBvYmplY3QgYXMKKyAgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBvYmplY3RzIG1hbmFnZWQgYnkgdGhyZWFkX2xvY2FsX3RyYWNrZXIuCisgICAgVGhyZWFkTG9jYWw8RGVzdHJ1Y3RvclRyYWNrZXI+IHRocmVhZF9sb2NhbF90cmFja2VyOworICAgIEFTU0VSVF9FUSgxVSwgZ19kZXN0cm95ZWQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UoZ19kZXN0cm95ZWRbMF0pOworCisgICAgLy8gVGhpcyBjcmVhdGVzIGFub3RoZXIgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGZvciB0aGUgbWFpbiB0aHJlYWQuCisgICAgdGhyZWFkX2xvY2FsX3RyYWNrZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKDJVLCBnX2Rlc3Ryb3llZC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShnX2Rlc3Ryb3llZFswXSk7CisgICAgQVNTRVJUX0ZBTFNFKGdfZGVzdHJveWVkWzFdKTsKKyAgfQorCisgIC8vIE5vdyB0aHJlYWRfbG9jYWxfdHJhY2tlciBoYXMgZGllZC4gIEl0IHNob3VsZCBoYXZlIGRlc3Ryb3llZCBib3RoIHRoZQorICAvLyBkZWZhdWx0IHZhbHVlIHNoYXJlZCBieSBhbGwgdGhyZWFkcyBhbmQgdGhlIHZhbHVlIGZvciB0aGUgbWFpbgorICAvLyB0aHJlYWQuCisgIEFTU0VSVF9FUSgyVSwgZ19kZXN0cm95ZWQuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoZ19kZXN0cm95ZWRbMF0pOworICBFWFBFQ1RfVFJVRShnX2Rlc3Ryb3llZFsxXSk7CisKKyAgZ19kZXN0cm95ZWQuY2xlYXIoKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIGEgdGhyZWFkIGV4aXRzLCB0aGUgdGhyZWFkLWxvY2FsIG9iamVjdCBmb3IgdGhhdAorLy8gdGhyZWFkIGlzIGRlc3Ryb3llZC4KK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBEZXN0cm95c01hbmFnZWRPYmplY3RBdFRocmVhZEV4aXQpIHsKKyAgZ19kZXN0cm95ZWQuY2xlYXIoKTsKKworICB7CisgICAgLy8gVGhlIG5leHQgbGluZSBkZWZhdWx0IGNvbnN0cnVjdHMgYSBEZXN0cnVjdG9yVHJhY2tlciBvYmplY3QgYXMKKyAgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBvYmplY3RzIG1hbmFnZWQgYnkgdGhyZWFkX2xvY2FsX3RyYWNrZXIuCisgICAgVGhyZWFkTG9jYWw8RGVzdHJ1Y3RvclRyYWNrZXI+IHRocmVhZF9sb2NhbF90cmFja2VyOworICAgIEFTU0VSVF9FUSgxVSwgZ19kZXN0cm95ZWQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UoZ19kZXN0cm95ZWRbMF0pOworCisgICAgLy8gVGhpcyBjcmVhdGVzIGFub3RoZXIgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGluIHRoZSBuZXcgdGhyZWFkLgorICAgIFRocmVhZFdpdGhQYXJhbTxUaHJlYWRQYXJhbT4gdGhyZWFkKAorICAgICAgICAmQ2FsbFRocmVhZExvY2FsR2V0LCAmdGhyZWFkX2xvY2FsX3RyYWNrZXIsIE5VTEwpOworICAgIHRocmVhZC5Kb2luKCk7CisKKyAgICAvLyBOb3cgdGhlIG5ldyB0aHJlYWQgaGFzIGV4aXRlZC4gIFRoZSBwZXItdGhyZWFkIG9iamVjdCBmb3IgaXQKKyAgICAvLyBzaG91bGQgaGF2ZSBiZWVuIGRlc3Ryb3llZC4KKyAgICBBU1NFUlRfRVEoMlUsIGdfZGVzdHJveWVkLnNpemUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKGdfZGVzdHJveWVkWzBdKTsKKyAgICBBU1NFUlRfVFJVRShnX2Rlc3Ryb3llZFsxXSk7CisgIH0KKworICAvLyBOb3cgdGhyZWFkX2xvY2FsX3RyYWNrZXIgaGFzIGRpZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuCisgIC8vIGRlc3Ryb3llZCB0b28uCisgIEFTU0VSVF9FUSgyVSwgZ19kZXN0cm95ZWQuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoZ19kZXN0cm95ZWRbMF0pOworICBFWFBFQ1RfVFJVRShnX2Rlc3Ryb3llZFsxXSk7CisKKyAgZ19kZXN0cm95ZWQuY2xlYXIoKTsKK30KKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIFRocmVhZExvY2FsTXV0YXRpb25zQWZmZWN0T25seUN1cnJlbnRUaHJlYWQpIHsKKyAgVGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+IHRocmVhZF9sb2NhbF9zdHJpbmc7CisgIHRocmVhZF9sb2NhbF9zdHJpbmcuc2V0KCJGb28iKTsKKyAgRVhQRUNUX1NUUkVRKCJGb28iLCB0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpLmNfc3RyKCkpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgUnVuRnJvbVRocmVhZCgmUmV0cmlldmVUaHJlYWRMb2NhbFZhbHVlLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigmdGhyZWFkX2xvY2FsX3N0cmluZywgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShyZXN1bHQuZW1wdHkoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtcHJpbnRlcnNfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC1wcmludGVyc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYmVjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtcHJpbnRlcnNfdGVzdC5jYwpAQCAtMCwwICsxLDE1NjYgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIGhhc2hfbWFwIGFuZCBoYXNoX3NldCBhcmUgYXZhaWxhYmxlIHVuZGVyIFZpc3VhbCBDKysuCisjaWYgX01TQ19WRVIKKyMgZGVmaW5lIEdURVNUX0hBU19IQVNIX01BUF8gMSAgLy8gSW5kaWNhdGVzIHRoYXQgaGFzaF9tYXAgaXMgYXZhaWxhYmxlLgorIyBpbmNsdWRlIDxoYXNoX21hcD4gICAgICAgICAgICAvLyBOT0xJTlQKKyMgZGVmaW5lIEdURVNUX0hBU19IQVNIX1NFVF8gMSAgLy8gSW5kaWNhdGVzIHRoYXQgaGFzaF9zZXQgaXMgYXZhaWxhYmxlLgorIyBpbmNsdWRlIDxoYXNoX3NldD4gICAgICAgICAgICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBTb21lIHVzZXItZGVmaW5lZCB0eXBlcyBmb3IgdGVzdGluZyB0aGUgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIuCisKKy8vIEFuIGFub255bW91cyBlbnVtIHR5cGUuCitlbnVtIEFub255bW91c0VudW0geworICBrQUUxID0gLTEsCisgIGtBRTIgPSAxCit9OworCisvLyBBbiBlbnVtIHdpdGhvdXQgYSB1c2VyLWRlZmluZWQgcHJpbnRlci4KK2VudW0gRW51bVdpdGhvdXRQcmludGVyIHsKKyAga0VXUDEgPSAtMiwKKyAga0VXUDIgPSA0MgorfTsKKworLy8gQW4gZW51bSB3aXRoIGEgPDwgb3BlcmF0b3IuCitlbnVtIEVudW1XaXRoU3RyZWFtaW5nIHsKKyAga0VXUzEgPSAxMAorfTsKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIEVudW1XaXRoU3RyZWFtaW5nIGUpIHsKKyAgcmV0dXJuIG9zIDw8IChlID09IGtFV1MxID8gImtFV1MxIiA6ICJpbnZhbGlkIik7Cit9CisKKy8vIEFuIGVudW0gd2l0aCBhIFByaW50VG8oKSBmdW5jdGlvbi4KK2VudW0gRW51bVdpdGhQcmludFRvIHsKKyAga0VXUFQxID0gMQorfTsKKwordm9pZCBQcmludFRvKEVudW1XaXRoUHJpbnRUbyBlLCBzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAoZSA9PSBrRVdQVDEgPyAia0VXUFQxIiA6ICJpbnZhbGlkIik7Cit9CisKKy8vIEEgY2xhc3MgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LgorY2xhc3MgQmlnZ2VzdEludENvbnZlcnRpYmxlIHsKKyBwdWJsaWM6CisgIG9wZXJhdG9yIDo6dGVzdGluZzo6aW50ZXJuYWw6OkJpZ2dlc3RJbnQoKSBjb25zdCB7IHJldHVybiA0MjsgfQorfTsKKworLy8gQSB1c2VyLWRlZmluZWQgdW5wcmludGFibGUgY2xhc3MgdGVtcGxhdGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVucHJpbnRhYmxlVGVtcGxhdGVJbkdsb2JhbCB7CisgcHVibGljOgorICBVbnByaW50YWJsZVRlbXBsYXRlSW5HbG9iYWwoKSA6IHZhbHVlXygpIHt9CisgcHJpdmF0ZToKKyAgVCB2YWx1ZV87Cit9OworCisvLyBBIHVzZXItZGVmaW5lZCBzdHJlYW1hYmxlIHR5cGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitjbGFzcyBTdHJlYW1hYmxlSW5HbG9iYWwgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+U3RyZWFtYWJsZUluR2xvYmFsKCkge30KK307CisKK2lubGluZSB2b2lkIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJlYW1hYmxlSW5HbG9iYWwmIC8qIHggKi8pIHsKKyAgb3MgPDwgIlN0cmVhbWFibGVJbkdsb2JhbCI7Cit9CisKK3ZvaWQgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0cmVhbWFibGVJbkdsb2JhbCogLyogeCAqLykgeworICBvcyA8PCAiU3RyZWFtYWJsZUluR2xvYmFsKiI7Cit9CisKK25hbWVzcGFjZSBmb28geworCisvLyBBIHVzZXItZGVmaW5lZCB1bnByaW50YWJsZSB0eXBlIGluIGEgdXNlciBuYW1lc3BhY2UuCitjbGFzcyBVbnByaW50YWJsZUluRm9vIHsKKyBwdWJsaWM6CisgIFVucHJpbnRhYmxlSW5Gb28oKSA6IHpfKDApIHsgbWVtY3B5KHh5XywgIlx4RUZceDEyXHgwXHgwXHgzNFx4QUJceDBceDAiLCA4KTsgfQorIHByaXZhdGU6CisgIGNoYXIgeHlfWzhdOworICBkb3VibGUgel87Cit9OworCisvLyBBIHVzZXItZGVmaW5lZCBwcmludGFibGUgdHlwZSBpbiBhIHVzZXItY2hvc2VuIG5hbWVzcGFjZS4KK3N0cnVjdCBQcmludGFibGVWaWFQcmludFRvIHsKKyAgUHJpbnRhYmxlVmlhUHJpbnRUbygpIDogdmFsdWUoKSB7fQorICBpbnQgdmFsdWU7Cit9OworCit2b2lkIFByaW50VG8oY29uc3QgUHJpbnRhYmxlVmlhUHJpbnRUbyYgeCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAiUHJpbnRhYmxlVmlhUHJpbnRUbzogIiA8PCB4LnZhbHVlOworfQorCisvLyBBIHR5cGUgd2l0aCBhIHVzZXItZGVmaW5lZCA8PCBmb3IgcHJpbnRpbmcgaXRzIHBvaW50ZXIuCitzdHJ1Y3QgUG9pbnRlclByaW50YWJsZSB7Cit9OworCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyUHJpbnRhYmxlKiAvKiB4ICovKSB7CisgIHJldHVybiBvcyA8PCAiUG9pbnRlclByaW50YWJsZSoiOworfQorCisvLyBBIHVzZXItZGVmaW5lZCBwcmludGFibGUgY2xhc3MgdGVtcGxhdGUgaW4gYSB1c2VyLWNob3NlbiBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZSB7CisgcHVibGljOgorICBleHBsaWNpdCBQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGUoY29uc3QgVCYgYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KKworICBjb25zdCBUJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VG8oY29uc3QgUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlPFQ+JiB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICJQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGU6ICIgPDwgeC52YWx1ZSgpOworfQorCisvLyBBIHVzZXItZGVmaW5lZCBzdHJlYW1hYmxlIGNsYXNzIHRlbXBsYXRlIGluIGEgdXNlciBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFN0cmVhbWFibGVUZW1wbGF0ZUluRm9vIHsKKyBwdWJsaWM6CisgIFN0cmVhbWFibGVUZW1wbGF0ZUluRm9vKCkgOiB2YWx1ZV8oKSB7fQorCisgIGNvbnN0IFQmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgcHJpdmF0ZToKKyAgVCB2YWx1ZV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSA6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtYWJsZVRlbXBsYXRlSW5Gb288VD4mIHgpIHsKKyAgcmV0dXJuIG9zIDw8ICJTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbzogIiA8PCB4LnZhbHVlKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmb28KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGd0ZXN0X3ByaW50ZXJzX3Rlc3QgeworCit1c2luZyA6OnN0ZDo6ZGVxdWU7Cit1c2luZyA6OnN0ZDo6bGlzdDsKK3VzaW5nIDo6c3RkOjptYWtlX3BhaXI7Cit1c2luZyA6OnN0ZDo6bWFwOwordXNpbmcgOjpzdGQ6Om11bHRpbWFwOwordXNpbmcgOjpzdGQ6Om11bHRpc2V0OwordXNpbmcgOjpzdGQ6OnBhaXI7Cit1c2luZyA6OnN0ZDo6c2V0OwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKK3VzaW5nIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZzsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZTsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF87Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpOYXRpdmVBcnJheTsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nczsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnQ7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3M7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjprUmVmZXJlbmNlOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nOworCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQordXNpbmcgOjpzdGQ6OnRyMTo6bWFrZV90dXBsZTsKK3VzaW5nIDo6c3RkOjp0cjE6OnR1cGxlOworI2VuZGlmCisKKy8vIFRoZSBoYXNoXyogY2xhc3NlcyBhcmUgbm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZC4gIFNUTHBvcnQKKy8vIGRlZmluZXMgdGhlbSBpbiBuYW1lc3BhY2Ugc3RkLiAgTVNWQyBkZWZpbmVzIHRoZW0gaW4gOjpzdGRleHQuICBHQ0MKKy8vIGRlZmluZXMgdGhlbSBpbiA6Oi4KKyNpZmRlZiBfU1RMUF9IQVNIX01BUCAgLy8gV2UgZ290IDxoYXNoX21hcD4gZnJvbSBTVExwb3J0LgordXNpbmcgOjpzdGQ6Omhhc2hfbWFwOwordXNpbmcgOjpzdGQ6Omhhc2hfc2V0OwordXNpbmcgOjpzdGQ6Omhhc2hfbXVsdGltYXA7Cit1c2luZyA6OnN0ZDo6aGFzaF9tdWx0aXNldDsKKyNlbGlmIF9NU0NfVkVSCit1c2luZyA6OnN0ZGV4dDo6aGFzaF9tYXA7Cit1c2luZyA6OnN0ZGV4dDo6aGFzaF9zZXQ7Cit1c2luZyA6OnN0ZGV4dDo6aGFzaF9tdWx0aW1hcDsKK3VzaW5nIDo6c3RkZXh0OjpoYXNoX211bHRpc2V0OworI2VuZGlmCisKKy8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlci4gIFRoaXMKKy8vIGlzIGEgaGVscGVyIGZvciB0ZXN0aW5nIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZm9yIHZhcmlvdXMgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cmluZyBQcmludChjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLyBQcmludHMgYSB2YWx1ZSBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGEgc3RyaW5nLCB1c2luZyB0aGUgdW5pdmVyc2FsCisvLyB2YWx1ZSBwcmludGVyLiAgVGhpcyBpcyBhIGhlbHBlciBmb3IgdGVzdGluZworLy8gVW5pdmVyc2FsUHJpbnRlcjxUJj46OlByaW50KCkgZm9yIHZhcmlvdXMgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cmluZyBQcmludEJ5UmVmKGNvbnN0IFQmIHZhbHVlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIFVuaXZlcnNhbFByaW50ZXI8VCY+OjpQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLyBUZXN0cyBwcmludGluZyB2YXJpb3VzIGVudW0gdHlwZXMuCisKK1RFU1QoUHJpbnRFbnVtVGVzdCwgQW5vbnltb3VzRW51bSkgeworICBFWFBFQ1RfRVEoIi0xIiwgUHJpbnQoa0FFMSkpOworICBFWFBFQ1RfRVEoIjEiLCBQcmludChrQUUyKSk7Cit9CisKK1RFU1QoUHJpbnRFbnVtVGVzdCwgRW51bVdpdGhvdXRQcmludGVyKSB7CisgIEVYUEVDVF9FUSgiLTIiLCBQcmludChrRVdQMSkpOworICBFWFBFQ1RfRVEoIjQyIiwgUHJpbnQoa0VXUDIpKTsKK30KKworVEVTVChQcmludEVudW1UZXN0LCBFbnVtV2l0aFN0cmVhbWluZykgeworICBFWFBFQ1RfRVEoImtFV1MxIiwgUHJpbnQoa0VXUzEpKTsKKyAgRVhQRUNUX0VRKCJpbnZhbGlkIiwgUHJpbnQoc3RhdGljX2Nhc3Q8RW51bVdpdGhTdHJlYW1pbmc+KDApKSk7Cit9CisKK1RFU1QoUHJpbnRFbnVtVGVzdCwgRW51bVdpdGhQcmludFRvKSB7CisgIEVYUEVDVF9FUSgia0VXUFQxIiwgUHJpbnQoa0VXUFQxKSk7CisgIEVYUEVDVF9FUSgiaW52YWxpZCIsIFByaW50KHN0YXRpY19jYXN0PEVudW1XaXRoUHJpbnRUbz4oMCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgYSBjbGFzcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQuCisKK1RFU1QoUHJpbnRDbGFzc1Rlc3QsIEJpZ2dlc3RJbnRDb252ZXJ0aWJsZSkgeworICBFWFBFQ1RfRVEoIjQyIiwgUHJpbnQoQmlnZ2VzdEludENvbnZlcnRpYmxlKCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdmFyaW91cyBjaGFyIHR5cGVzLgorCisvLyBjaGFyLgorVEVTVChQcmludENoYXJUZXN0LCBQbGFpbkNoYXIpIHsKKyAgRVhQRUNUX0VRKCInXFwwJyIsIFByaW50KCdcMCcpKTsKKyAgRVhQRUNUX0VRKCInXFwnJyAoMzksIDB4MjcpIiwgUHJpbnQoJ1wnJykpOworICBFWFBFQ1RfRVEoIidcIicgKDM0LCAweDIyKSIsIFByaW50KCciJykpOworICBFWFBFQ1RfRVEoIic/JyAoNjMsIDB4M0YpIiwgUHJpbnQoJz8nKSk7CisgIEVYUEVDVF9FUSgiJ1xcXFwnICg5MiwgMHg1QykiLCBQcmludCgnXFwnKSk7CisgIEVYUEVDVF9FUSgiJ1xcYScgKDcpIiwgUHJpbnQoJ1xhJykpOworICBFWFBFQ1RfRVEoIidcXGInICg4KSIsIFByaW50KCdcYicpKTsKKyAgRVhQRUNUX0VRKCInXFxmJyAoMTIsIDB4QykiLCBQcmludCgnXGYnKSk7CisgIEVYUEVDVF9FUSgiJ1xcbicgKDEwLCAweEEpIiwgUHJpbnQoJ1xuJykpOworICBFWFBFQ1RfRVEoIidcXHInICgxMywgMHhEKSIsIFByaW50KCdccicpKTsKKyAgRVhQRUNUX0VRKCInXFx0JyAoOSkiLCBQcmludCgnXHQnKSk7CisgIEVYUEVDVF9FUSgiJ1xcdicgKDExLCAweEIpIiwgUHJpbnQoJ1x2JykpOworICBFWFBFQ1RfRVEoIidcXHg3RicgKDEyNykiLCBQcmludCgnXHg3RicpKTsKKyAgRVhQRUNUX0VRKCInXFx4RkYnICgyNTUpIiwgUHJpbnQoJ1x4RkYnKSk7CisgIEVYUEVDVF9FUSgiJyAnICgzMiwgMHgyMCkiLCBQcmludCgnICcpKTsKKyAgRVhQRUNUX0VRKCInYScgKDk3LCAweDYxKSIsIFByaW50KCdhJykpOworfQorCisvLyBzaWduZWQgY2hhci4KK1RFU1QoUHJpbnRDaGFyVGVzdCwgU2lnbmVkQ2hhcikgeworICBFWFBFQ1RfRVEoIidcXDAnIiwgUHJpbnQoc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KCdcMCcpKSk7CisgIEVYUEVDVF9FUSgiJ1xceENFJyAoLTUwKSIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oLTUwKSkpOworfQorCisvLyB1bnNpZ25lZCBjaGFyLgorVEVTVChQcmludENoYXJUZXN0LCBVbnNpZ25lZENoYXIpIHsKKyAgRVhQRUNUX0VRKCInXFwwJyIsIFByaW50KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCdcMCcpKSk7CisgIEVYUEVDVF9FUSgiJ2InICg5OCwgMHg2MikiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oJ2InKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBvdGhlciBzaW1wbGUsIGJ1aWx0LWluIHR5cGVzLgorCisvLyBib29sLgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgQm9vbCkgeworICBFWFBFQ1RfRVEoImZhbHNlIiwgUHJpbnQoZmFsc2UpKTsKKyAgRVhQRUNUX0VRKCJ0cnVlIiwgUHJpbnQodHJ1ZSkpOworfQorCisvLyB3Y2hhcl90LgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgV2NoYXJfdCkgeworICBFWFBFQ1RfRVEoIkwnXFwwJyIsIFByaW50KEwnXDAnKSk7CisgIEVYUEVDVF9FUSgiTCdcXCcnICgzOSwgMHgyNykiLCBQcmludChMJ1wnJykpOworICBFWFBFQ1RfRVEoIkwnXCInICgzNCwgMHgyMikiLCBQcmludChMJyInKSk7CisgIEVYUEVDVF9FUSgiTCc/JyAoNjMsIDB4M0YpIiwgUHJpbnQoTCc/JykpOworICBFWFBFQ1RfRVEoIkwnXFxcXCcgKDkyLCAweDVDKSIsIFByaW50KEwnXFwnKSk7CisgIEVYUEVDVF9FUSgiTCdcXGEnICg3KSIsIFByaW50KEwnXGEnKSk7CisgIEVYUEVDVF9FUSgiTCdcXGInICg4KSIsIFByaW50KEwnXGInKSk7CisgIEVYUEVDVF9FUSgiTCdcXGYnICgxMiwgMHhDKSIsIFByaW50KEwnXGYnKSk7CisgIEVYUEVDVF9FUSgiTCdcXG4nICgxMCwgMHhBKSIsIFByaW50KEwnXG4nKSk7CisgIEVYUEVDVF9FUSgiTCdcXHInICgxMywgMHhEKSIsIFByaW50KEwnXHInKSk7CisgIEVYUEVDVF9FUSgiTCdcXHQnICg5KSIsIFByaW50KEwnXHQnKSk7CisgIEVYUEVDVF9FUSgiTCdcXHYnICgxMSwgMHhCKSIsIFByaW50KEwnXHYnKSk7CisgIEVYUEVDVF9FUSgiTCdcXHg3RicgKDEyNykiLCBQcmludChMJ1x4N0YnKSk7CisgIEVYUEVDVF9FUSgiTCdcXHhGRicgKDI1NSkiLCBQcmludChMJ1x4RkYnKSk7CisgIEVYUEVDVF9FUSgiTCcgJyAoMzIsIDB4MjApIiwgUHJpbnQoTCcgJykpOworICBFWFBFQ1RfRVEoIkwnYScgKDk3LCAweDYxKSIsIFByaW50KEwnYScpKTsKKyAgRVhQRUNUX0VRKCJMJ1xceDU3NicgKDEzOTgpIiwgUHJpbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg1NzYpKSk7CisgIEVYUEVDVF9FUSgiTCdcXHhDNzREJyAoNTEwMjEpIiwgUHJpbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHhDNzREKSkpOworfQorCisvLyBUZXN0IHRoYXQgSW50NjQgcHJvdmlkZXMgbW9yZSBzdG9yYWdlIHRoYW4gd2NoYXJfdC4KK1RFU1QoUHJpbnRUeXBlU2l6ZVRlc3QsIFdjaGFyX3QpIHsKKyAgRVhQRUNUX0xUKHNpemVvZih3Y2hhcl90KSwgc2l6ZW9mKHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2NCkpOworfQorCisvLyBWYXJpb3VzIGludGVnZXIgdHlwZXMuCitURVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBJbnRlZ2VyKSB7CisgIEVYUEVDVF9FUSgiJ1xceEZGJyAoMjU1KSIsIFByaW50KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDI1NSkpKTsgIC8vIHVpbnQ4CisgIEVYUEVDVF9FUSgiJ1xceDgwJyAoLTEyOCkiLCBQcmludChzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oLTEyOCkpKTsgIC8vIGludDgKKyAgRVhQRUNUX0VRKCI2NTUzNSIsIFByaW50KFVTSFJUX01BWCkpOyAgLy8gdWludDE2CisgIEVYUEVDVF9FUSgiLTMyNzY4IiwgUHJpbnQoU0hSVF9NSU4pKTsgIC8vIGludDE2CisgIEVYUEVDVF9FUSgiNDI5NDk2NzI5NSIsIFByaW50KFVJTlRfTUFYKSk7ICAvLyB1aW50MzIKKyAgRVhQRUNUX0VRKCItMjE0NzQ4MzY0OCIsIFByaW50KElOVF9NSU4pKTsgIC8vIGludDMyCisgIEVYUEVDVF9FUSgiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8dGVzdGluZzo6aW50ZXJuYWw6OlVJbnQ2ND4oLTEpKSk7ICAvLyB1aW50NjQKKyAgRVhQRUNUX0VRKCItOTIyMzM3MjAzNjg1NDc3NTgwOCIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx0ZXN0aW5nOjppbnRlcm5hbDo6SW50NjQ+KDEpIDw8IDYzKSk7ICAvLyBpbnQ2NAorfQorCisvLyBTaXplIHR5cGVzLgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgU2l6ZV90KSB7CisgIEVYUEVDVF9FUSgiMSIsIFByaW50KHNpemVvZignYScpKSk7ICAvLyBzaXplX3QuCisjaWYgIUdURVNUX09TX1dJTkRPV1MKKyAgLy8gV2luZG93cyBoYXMgbm8gc3NpemVfdCB0eXBlLgorICBFWFBFQ1RfRVEoIi0yIiwgUHJpbnQoc3RhdGljX2Nhc3Q8c3NpemVfdD4oLTIpKSk7ICAvLyBzc2l6ZV90LgorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworfQorCisvLyBGbG9hdGluZy1wb2ludHMuCitURVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBGbG9hdGluZ1BvaW50cykgeworICBFWFBFQ1RfRVEoIjEuNSIsIFByaW50KDEuNWYpKTsgICAvLyBmbG9hdAorICBFWFBFQ1RfRVEoIi0yLjUiLCBQcmludCgtMi41KSk7ICAvLyBkb3VibGUKK30KKworLy8gU2luY2UgOjpzdGQ6OnN0cmluZ3N0cmVhbTo6b3BlcmF0b3I8PChjb25zdCB2b2lkICopIGZvcm1hdHMgdGhlIHBvaW50ZXIKKy8vIG91dHB1dCBkaWZmZXJlbnRseSB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMsIHdlIGhhdmUgdG8gY3JlYXRlIHRoZSBleHBlY3RlZAorLy8gb3V0cHV0IGZpcnN0IGFuZCB1c2UgaXQgYXMgb3VyIGV4cGVjdGF0aW9uLgorc3RhdGljIHN0cmluZyBQcmludFBvaW50ZXIoY29uc3Qgdm9pZCAqcCkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGV4cGVjdGVkX3Jlc3VsdF9zdHJlYW07CisgIGV4cGVjdGVkX3Jlc3VsdF9zdHJlYW0gPDwgcDsKKyAgcmV0dXJuIGV4cGVjdGVkX3Jlc3VsdF9zdHJlYW0uc3RyKCk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIEMgc3RyaW5ncy4KKworLy8gY29uc3QgY2hhciouCitURVNUKFByaW50Q1N0cmluZ1Rlc3QsIENvbnN0KSB7CisgIGNvbnN0IGNoYXIqIHAgPSAiV29ybGQiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBcIldvcmxkXCIiLCBQcmludChwKSk7Cit9CisKKy8vIGNoYXIqLgorVEVTVChQcmludENTdHJpbmdUZXN0LCBOb25Db25zdCkgeworICBjaGFyIHBbXSA9ICJIaSI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIFwiSGlcIiIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDxjaGFyKj4ocCkpKTsKK30KKworLy8gTlVMTCBDIHN0cmluZy4KK1RFU1QoUHJpbnRDU3RyaW5nVGVzdCwgTnVsbCkgeworICBjb25zdCBjaGFyKiBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyB0aGF0IEMgc3RyaW5ncyBhcmUgZXNjYXBlZCBwcm9wZXJseS4KK1RFU1QoUHJpbnRDU3RyaW5nVGVzdCwgRXNjYXBlc1Byb3Blcmx5KSB7CisgIGNvbnN0IGNoYXIqIHAgPSAiJ1wiP1xcXGFcYlxmXG5cclx0XHZceDdGXHhGRiBhIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gXCInXFxcIj9cXFxcXFxhXFxiXFxmIgorICAgICAgICAgICAgIlxcblxcclxcdFxcdlxceDdGXFx4RkYgYVwiIiwKKyAgICAgICAgICAgIFByaW50KHApKTsKK30KKworCisKKy8vIE1TVkMgY29tcGlsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdoYXJfdCBhcyBhIHR5cGVkZWYKKy8vIG9mIHVuc2lnbmVkIHNob3J0LiBEZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3Qgd2NoYXJfdCogaW4gdGhhdCBjYXNlCisvLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsCisvLyBwb3NzaWJseSBhY2Nlc3NpbmcgbW9yZSBtZW1vcnkgdGhhbiBpbnRlbmRlZCBhbmQgY2F1c2luZyBpbnZhbGlkCisvLyBtZW1vcnkgYWNjZXNzZXMuIE1TVkMgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCBzeW1ib2wgd2hlbgorLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorCisvLyBjb25zdCB3Y2hhcl90Ki4KK1RFU1QoUHJpbnRXaWRlQ1N0cmluZ1Rlc3QsIENvbnN0KSB7CisgIGNvbnN0IHdjaGFyX3QqIHAgPSBMIldvcmxkIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gTFwiV29ybGRcIiIsIFByaW50KHApKTsKK30KKworLy8gd2NoYXJfdCouCitURVNUKFByaW50V2lkZUNTdHJpbmdUZXN0LCBOb25Db25zdCkgeworICB3Y2hhcl90IHBbXSA9IEwiSGkiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBMXCJIaVwiIiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PHdjaGFyX3QqPihwKSkpOworfQorCisvLyBOVUxMIHdpZGUgQyBzdHJpbmcuCitURVNUKFByaW50V2lkZUNTdHJpbmdUZXN0LCBOdWxsKSB7CisgIGNvbnN0IHdjaGFyX3QqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2lkZSBDIHN0cmluZ3MgYXJlIGVzY2FwZWQgcHJvcGVybHkuCitURVNUKFByaW50V2lkZUNTdHJpbmdUZXN0LCBFc2NhcGVzUHJvcGVybHkpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSB7J1wnJywgJyInLCAnPycsICdcXCcsICdcYScsICdcYicsICdcZicsICdcbicsICdccicsCisgICAgICAgICAgICAgICAgICAgICAgICdcdCcsICdcdicsIDB4RDMsIDB4NTc2LCAweDhEMywgMHhDNzRELCAnICcsICdhJywgJ1wwJ307CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocykgKyAiIHBvaW50aW5nIHRvIExcIidcXFwiP1xcXFxcXGFcXGJcXGYiCisgICAgICAgICAgICAiXFxuXFxyXFx0XFx2XFx4RDNcXHg1NzZcXHg4RDNcXHhDNzREIGFcIiIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4ocykpKTsKK30KKyNlbmRpZiAgLy8gbmF0aXZlIHdjaGFyX3QKKworLy8gVGVzdHMgcHJpbnRpbmcgcG9pbnRlcnMgdG8gb3RoZXIgY2hhciB0eXBlcy4KKworLy8gc2lnbmVkIGNoYXIqLgorVEVTVChQcmludENoYXJQb2ludGVyVGVzdCwgU2lnbmVkQ2hhcikgeworICBzaWduZWQgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2lnbmVkIGNoYXIqPigweDEyMzQpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIGNvbnN0IHNpZ25lZCBjaGFyKi4KK1RFU1QoUHJpbnRDaGFyUG9pbnRlclRlc3QsIENvbnN0U2lnbmVkQ2hhcikgeworICBzaWduZWQgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2lnbmVkIGNoYXIqPigweDEyMzQpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIHVuc2lnbmVkIGNoYXIqLgorVEVTVChQcmludENoYXJQb2ludGVyVGVzdCwgVW5zaWduZWRDaGFyKSB7CisgIHVuc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigweDEyMzQpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIGNvbnN0IHVuc2lnbmVkIGNoYXIqLgorVEVTVChQcmludENoYXJQb2ludGVyVGVzdCwgQ29uc3RVbnNpZ25lZENoYXIpIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KDB4MTIzNCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgcG9pbnRlcnMgdG8gc2ltcGxlLCBidWlsdC1pbiB0eXBlcy4KKworLy8gYm9vbCouCitURVNUKFByaW50UG9pbnRlclRvQnVpbHRJblR5cGVUZXN0LCBCb29sKSB7CisgIGJvb2wqIHAgPSByZWludGVycHJldF9jYXN0PGJvb2wqPigweEFCQ0QpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIHZvaWQqLgorVEVTVChQcmludFBvaW50ZXJUb0J1aWx0SW5UeXBlVGVzdCwgVm9pZCkgeworICB2b2lkKiBwID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oMHhBQkNEKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBjb25zdCB2b2lkKi4KK1RFU1QoUHJpbnRQb2ludGVyVG9CdWlsdEluVHlwZVRlc3QsIENvbnN0Vm9pZCkgeworICBjb25zdCB2b2lkKiBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oMHhBQkNEKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBwb2ludGVycyB0byBwb2ludGVycy4KK1RFU1QoUHJpbnRQb2ludGVyVG9Qb2ludGVyVGVzdCwgSW50UG9pbnRlclBvaW50ZXIpIHsKKyAgaW50KiogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50Kio+KDB4QUJDRCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgKG5vbi1tZW1iZXIpIGZ1bmN0aW9uIHBvaW50ZXJzLgorCit2b2lkIE15RnVuY3Rpb24oaW50IC8qIG4gKi8pIHt9CisKK1RFU1QoUHJpbnRQb2ludGVyVGVzdCwgTm9uTWVtYmVyRnVuY3Rpb25Qb2ludGVyKSB7CisgIC8vIFdlIGNhbm5vdCBkaXJlY3RseSBjYXN0ICZNeUZ1bmN0aW9uIHRvIGNvbnN0IHZvaWQqIGJlY2F1c2UgdGhlCisgIC8vIHN0YW5kYXJkIGRpc2FsbG93cyBjYXN0aW5nIGJldHdlZW4gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGFuZAorICAvLyBwb2ludGVycyB0byBvYmplY3RzLCBhbmQgc29tZSBjb21waWxlcnMgKGUuZy4gR0NDIDMuNCkgZW5mb3JjZQorICAvLyB0aGlzIGxpbWl0YXRpb24uCisgIEVYUEVDVF9FUSgKKyAgICAgIFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGludGVybmFsOjpCaWdnZXN0SW50PigmTXlGdW5jdGlvbikpKSwKKyAgICAgIFByaW50KCZNeUZ1bmN0aW9uKSk7CisgIGludCAoKnApKGJvb2wpID0gTlVMTDsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIEFuIGFzc2VydGlvbiBwcmVkaWNhdGUgZGV0ZXJtaW5pbmcgd2hldGhlciBhIG9uZSBzdHJpbmcgaXMgYSBwcmVmaXggZm9yCisvLyBhbm90aGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+CitBc3NlcnRpb25SZXN1bHQgSGFzUHJlZml4KGNvbnN0IFN0cmluZ1R5cGUmIHN0ciwgY29uc3QgU3RyaW5nVHlwZSYgcHJlZml4KSB7CisgIGlmIChzdHIuZmluZChwcmVmaXgsIDApID09IDApCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICBjb25zdCBib29sIGlzX3dpZGVfc3RyaW5nID0gc2l6ZW9mKHByZWZpeFswXSkgPiAxOworICBjb25zdCBjaGFyKiBjb25zdCBiZWdpbl9zdHJpbmdfcXVvdGUgPSBpc193aWRlX3N0cmluZyA/ICJMXCIiIDogIlwiIjsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IHByZWZpeCA8PCAiXCIgaXMgbm90IGEgcHJlZml4IG9mICIKKyAgICAgIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBzdHIgPDwgIlwiXG4iOworfQorCisvLyBUZXN0cyBwcmludGluZyBtZW1iZXIgdmFyaWFibGUgcG9pbnRlcnMuICBBbHRob3VnaCB0aGV5IGFyZSBjYWxsZWQKKy8vIHBvaW50ZXJzLCB0aGV5IGRvbid0IHBvaW50IHRvIGEgbG9jYXRpb24gaW4gdGhlIGFkZHJlc3Mgc3BhY2UuCisvLyBUaGVpciByZXByZXNlbnRhdGlvbiBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGh1cyB0aGV5IHdpbGwgYmUKKy8vIHByaW50ZWQgYXMgcmF3IGJ5dGVzLgorCitzdHJ1Y3QgRm9vIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkZvbygpIHt9CisgIGludCBNeU1ldGhvZChjaGFyIHgpIHsgcmV0dXJuIHggKyAxOyB9CisgIHZpcnR1YWwgY2hhciBNeVZpcnR1YWxNZXRob2QoaW50IC8qIG4gKi8pIHsgcmV0dXJuICdhJzsgfQorCisgIGludCB2YWx1ZTsKK307CisKK1RFU1QoUHJpbnRQb2ludGVyVGVzdCwgTWVtYmVyVmFyaWFibGVQb2ludGVyKSB7CisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeChQcmludCgmRm9vOjp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBQcmludChzaXplb2YoJkZvbzo6dmFsdWUpKSArICItYnl0ZSBvYmplY3QgIikpOworICBpbnQgKEZvbzo6KnApID0gTlVMTDsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoUHJpbnQocCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcmludChzaXplb2YocCkpICsgIi1ieXRlIG9iamVjdCAiKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4gIEFsdGhvdWdoIHRoZXkgYXJlIGNhbGxlZAorLy8gcG9pbnRlcnMsIHRoZXkgZG9uJ3QgcG9pbnQgdG8gYSBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4KKy8vIFRoZWlyIHJlcHJlc2VudGF0aW9uIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBUaHVzIHRoZXkgd2lsbCBiZQorLy8gcHJpbnRlZCBhcyByYXcgYnl0ZXMuCitURVNUKFByaW50UG9pbnRlclRlc3QsIE1lbWJlckZ1bmN0aW9uUG9pbnRlcikgeworICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoUHJpbnQoJkZvbzo6TXlNZXRob2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKCZGb286Ok15TWV0aG9kKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNQcmVmaXgoUHJpbnQoJkZvbzo6TXlWaXJ0dWFsTWV0aG9kKSwKKyAgICAgICAgICAgICAgICBQcmludChzaXplb2YoKCZGb286Ok15VmlydHVhbE1ldGhvZCkpKSArICItYnl0ZSBvYmplY3QgIikpOworICBpbnQgKEZvbzo6KnApKGNoYXIpID0gTlVMTDsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoUHJpbnQocCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcmludChzaXplb2YocCkpICsgIi1ieXRlIG9iamVjdCAiKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIEMgYXJyYXlzLgorCisvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFByaW50KCkgaXMgdGhhdCBpdCBlbnN1cmVzIHRoYXQgdGhlCisvLyBhcmd1bWVudCBpcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3N0cmluZyBQcmludEFycmF5SGVscGVyKFQgKCZhKVtOXSkgeworICByZXR1cm4gUHJpbnQoYSk7Cit9CisKKy8vIE9uZS1kaW1lbnNpb25hbCBhcnJheS4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIE9uZURpbWVuc2lvbmFsQXJyYXkpIHsKKyAgaW50IGFbNV0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIsIDMsIDQsIDUgfSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBUd28tZGltZW5zaW9uYWwgYXJyYXkuCitURVNUKFByaW50QXJyYXlUZXN0LCBUd29EaW1lbnNpb25hbEFycmF5KSB7CisgIGludCBhWzJdWzVdID0geworICAgIHsgMSwgMiwgMywgNCwgNSB9LAorICAgIHsgNiwgNywgOCwgOSwgMCB9CisgIH07CisgIEVYUEVDVF9FUSgieyB7IDEsIDIsIDMsIDQsIDUgfSwgeyA2LCA3LCA4LCA5LCAwIH0gfSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBBcnJheSBvZiBjb25zdCBlbGVtZW50cy4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIENvbnN0QXJyYXkpIHsKKyAgY29uc3QgYm9vbCBhWzFdID0geyBmYWxzZSB9OworICBFWFBFQ1RfRVEoInsgZmFsc2UgfSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBjaGFyIGFycmF5IHdpdGhvdXQgdGVybWluYXRpbmcgTlVMLgorVEVTVChQcmludEFycmF5VGVzdCwgQ2hhckFycmF5V2l0aE5vVGVybWluYXRpbmdOdWwpIHsKKyAgLy8gQXJyYXkgYSBjb250YWlucyAnXDAnIGluIHRoZSBtaWRkbGUgYW5kIGRvZXNuJ3QgZW5kIHdpdGggJ1wwJy4KKyAgY2hhciBhW10gPSB7ICdIJywgJ1wwJywgJ2knIH07CisgIEVYUEVDVF9FUSgiXCJIXFwwaVwiIChubyB0ZXJtaW5hdGluZyBOVUwpIiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIGNvbnN0IGNoYXIgYXJyYXkgd2l0aCB0ZXJtaW5hdGluZyBOVUwuCitURVNUKFByaW50QXJyYXlUZXN0LCBDb25zdENoYXJBcnJheVdpdGhUZXJtaW5hdGluZ051bCkgeworICBjb25zdCBjaGFyIGFbXSA9ICJcMEhpIjsKKyAgRVhQRUNUX0VRKCJcIlxcMEhpXCIiLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gY29uc3Qgd2NoYXJfdCBhcnJheSB3aXRob3V0IHRlcm1pbmF0aW5nIE5VTC4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIFdDaGFyQXJyYXlXaXRoTm9UZXJtaW5hdGluZ051bCkgeworICAvLyBBcnJheSBhIGNvbnRhaW5zICdcMCcgaW4gdGhlIG1pZGRsZSBhbmQgZG9lc24ndCBlbmQgd2l0aCAnXDAnLgorICBjb25zdCB3Y2hhcl90IGFbXSA9IHsgTCdIJywgTCdcMCcsIEwnaScgfTsKKyAgRVhQRUNUX0VRKCJMXCJIXFwwaVwiIChubyB0ZXJtaW5hdGluZyBOVUwpIiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIHdjaGFyX3QgYXJyYXkgd2l0aCB0ZXJtaW5hdGluZyBOVUwuCitURVNUKFByaW50QXJyYXlUZXN0LCBXQ29uc3RDaGFyQXJyYXlXaXRoVGVybWluYXRpbmdOdWwpIHsKKyAgY29uc3Qgd2NoYXJfdCBhW10gPSBMIlwwSGkiOworICBFWFBFQ1RfRVEoIkxcIlxcMEhpXCIiLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gQXJyYXkgb2Ygb2JqZWN0cy4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIE9iamVjdEFycmF5KSB7CisgIHN0cmluZyBhWzNdID0geyAiSGkiLCAiSGVsbG8iLCAiTmkgaGFvIiB9OworICBFWFBFQ1RfRVEoInsgXCJIaVwiLCBcIkhlbGxvXCIsIFwiTmkgaGFvXCIgfSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBBcnJheSB3aXRoIG1hbnkgZWxlbWVudHMuCitURVNUKFByaW50QXJyYXlUZXN0LCBCaWdBcnJheSkgeworICBpbnQgYVsxMDBdID0geyAxLCAyLCAzIH07CisgIEVYUEVDVF9FUSgieyAxLCAyLCAzLCAwLCAwLCAwLCAwLCAwLCAuLi4sIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSIsCisgICAgICAgICAgICBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgOjpzdHJpbmcgYW5kIDo6c3RkOjpzdHJpbmcuCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworLy8gOjpzdHJpbmcuCitURVNUKFByaW50U3RyaW5nVGVzdCwgU3RyaW5nSW5HbG9iYWxOYW1lc3BhY2UpIHsKKyAgY29uc3QgY2hhciBzW10gPSAiJ1wiP1xcXGFcYlxmXG5cMFxyXHRcdlx4N0ZceEZGIGEiOworICBjb25zdCA6OnN0cmluZyBzdHIocywgc2l6ZW9mKHMpKTsKKyAgRVhQRUNUX0VRKCJcIidcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXDBcXHJcXHRcXHZcXHg3RlxceEZGIGFcXDBcIiIsCisgICAgICAgICAgICBQcmludChzdHIpKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworLy8gOjpzdGQ6OnN0cmluZy4KK1RFU1QoUHJpbnRTdHJpbmdUZXN0LCBTdHJpbmdJblN0ZE5hbWVzcGFjZSkgeworICBjb25zdCBjaGFyIHNbXSA9ICInXCI/XFxcYVxiXGZcblwwXHJcdFx2XHg3Rlx4RkYgYSI7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyKHMsIHNpemVvZihzKSk7CisgIEVYUEVDVF9FUSgiXCInXFxcIj9cXFxcXFxhXFxiXFxmXFxuXFwwXFxyXFx0XFx2XFx4N0ZcXHhGRiBhXFwwXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RyKSk7Cit9CisKK1RFU1QoUHJpbnRTdHJpbmdUZXN0LCBTdHJpbmdBbWJpZ3VvdXNIZXgpIHsKKyAgLy8gIlx4NkJBTkFOQSIgaXMgYW1iaWd1b3VzLCBpdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgc3RhcnRpbmcgd2l0aCBlaXRoZXIgb2Y6CisgIC8vICdceDYnLCAnXHg2QicsIG9yICdceDZCQScuCisKKyAgLy8gYSBoZXggZXNjYXBpbmcgc2VxdWVuY2UgZm9sbG93aW5nIGJ5IGEgZGVjaW1hbCBkaWdpdAorICBFWFBFQ1RfRVEoIlwiMFxceDEyXCIgXCIzXCIiLCBQcmludCg6OnN0ZDo6c3RyaW5nKCIwXHgxMiIgIjMiKSkpOworICAvLyBhIGhleCBlc2NhcGluZyBzZXF1ZW5jZSBmb2xsb3dpbmcgYnkgYSBoZXggZGlnaXQgKGxvd2VyLWNhc2UpCisgIEVYUEVDVF9FUSgiXCJtbVxceDZcIiBcImJhbmFuYXNcIiIsIFByaW50KDo6c3RkOjpzdHJpbmcoIm1tXHg2IiAiYmFuYW5hcyIpKSk7CisgIC8vIGEgaGV4IGVzY2FwaW5nIHNlcXVlbmNlIGZvbGxvd2luZyBieSBhIGhleCBkaWdpdCAodXBwZXItY2FzZSkKKyAgRVhQRUNUX0VRKCJcIk5PTVxceDZcIiBcIkJBTkFOQVwiIiwgUHJpbnQoOjpzdGQ6OnN0cmluZygiTk9NXHg2IiAiQkFOQU5BIikpKTsKKyAgLy8gYSBoZXggZXNjYXBpbmcgc2VxdWVuY2UgZm9sbG93aW5nIGJ5IGEgbm9uLXhkaWdpdAorICBFWFBFQ1RfRVEoIlwiIVxceDUtIVwiIiwgUHJpbnQoOjpzdGQ6OnN0cmluZygiIVx4NS0hIikpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgOjp3c3RyaW5nIGFuZCA6OnN0ZDo6d3N0cmluZy4KKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworLy8gOjp3c3RyaW5nLgorVEVTVChQcmludFdpZGVTdHJpbmdUZXN0LCBTdHJpbmdJbkdsb2JhbE5hbWVzcGFjZSkgeworICBjb25zdCB3Y2hhcl90IHNbXSA9IEwiJ1wiP1xcXGFcYlxmXG5cMFxyXHRcdlx4RDNceDU3Nlx4OEQzXHhDNzREIGEiOworICBjb25zdCA6OndzdHJpbmcgc3RyKHMsIHNpemVvZihzKS9zaXplb2Yod2NoYXJfdCkpOworICBFWFBFQ1RfRVEoIkxcIidcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXDBcXHJcXHRcXHYiCisgICAgICAgICAgICAiXFx4RDNcXHg1NzZcXHg4RDNcXHhDNzREIGFcXDBcIiIsCisgICAgICAgICAgICBQcmludChzdHIpKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIDo6c3RkOjp3c3RyaW5nLgorVEVTVChQcmludFdpZGVTdHJpbmdUZXN0LCBTdHJpbmdJblN0ZE5hbWVzcGFjZSkgeworICBjb25zdCB3Y2hhcl90IHNbXSA9IEwiJ1wiP1xcXGFcYlxmXG5cMFxyXHRcdlx4RDNceDU3Nlx4OEQzXHhDNzREIGEiOworICBjb25zdCA6OnN0ZDo6d3N0cmluZyBzdHIocywgc2l6ZW9mKHMpL3NpemVvZih3Y2hhcl90KSk7CisgIEVYUEVDVF9FUSgiTFwiJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcMFxcclxcdFxcdiIKKyAgICAgICAgICAgICJcXHhEM1xceDU3NlxceDhEM1xceEM3NEQgYVxcMFwiIiwKKyAgICAgICAgICAgIFByaW50KHN0cikpOworfQorCitURVNUKFByaW50V2lkZVN0cmluZ1Rlc3QsIFN0cmluZ0FtYmlndW91c0hleCkgeworICAvLyBzYW1lIGZvciB3aWRlIHN0cmluZ3MuCisgIEVYUEVDVF9FUSgiTFwiMFxceDEyXCIgTFwiM1wiIiwgUHJpbnQoOjpzdGQ6OndzdHJpbmcoTCIwXHgxMiIgTCIzIikpKTsKKyAgRVhQRUNUX0VRKCJMXCJtbVxceDZcIiBMXCJiYW5hbmFzXCIiLAorICAgICAgICAgICAgUHJpbnQoOjpzdGQ6OndzdHJpbmcoTCJtbVx4NiIgTCJiYW5hbmFzIikpKTsKKyAgRVhQRUNUX0VRKCJMXCJOT01cXHg2XCIgTFwiQkFOQU5BXCIiLAorICAgICAgICAgICAgUHJpbnQoOjpzdGQ6OndzdHJpbmcoTCJOT01ceDYiIEwiQkFOQU5BIikpKTsKKyAgRVhQRUNUX0VRKCJMXCIhXFx4NS0hXCIiLCBQcmludCg6OnN0ZDo6d3N0cmluZyhMIiFceDUtISIpKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisvLyBUZXN0cyBwcmludGluZyB0eXBlcyB0aGF0IHN1cHBvcnQgZ2VuZXJpYyBzdHJlYW1pbmcgKGkuZS4gc3RyZWFtaW5nCisvLyB0byBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4gZm9yIGFueSB2YWxpZCBDaGFyIGFuZAorLy8gQ2hhclRyYWl0cyB0eXBlcykuCisKKy8vIFRlc3RzIHByaW50aW5nIGEgbm9uLXRlbXBsYXRlIHR5cGUgdGhhdCBzdXBwb3J0cyBnZW5lcmljIHN0cmVhbWluZy4KKworY2xhc3MgQWxsb3dzR2VuZXJpY1N0cmVhbWluZyB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHM+CitzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9wZXJhdG9yPDwoCisgICAgc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywKKyAgICBjb25zdCBBbGxvd3NHZW5lcmljU3RyZWFtaW5nJiAvKiBhICovKSB7CisgIHJldHVybiBvcyA8PCAiQWxsb3dzR2VuZXJpY1N0cmVhbWluZyI7Cit9CisKK1RFU1QoUHJpbnRUeXBlV2l0aEdlbmVyaWNTdHJlYW1pbmdUZXN0LCBOb25UZW1wbGF0ZVR5cGUpIHsKKyAgQWxsb3dzR2VuZXJpY1N0cmVhbWluZyBhOworICBFWFBFQ1RfRVEoIkFsbG93c0dlbmVyaWNTdHJlYW1pbmciLCBQcmludChhKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgdGVtcGxhdGUgdHlwZSB0aGF0IHN1cHBvcnRzIGdlbmVyaWMgc3RyZWFtaW5nLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+CitzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9wZXJhdG9yPDwoCisgICAgc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywKKyAgICBjb25zdCBBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGU8VD4mIC8qIGEgKi8pIHsKKyAgcmV0dXJuIG9zIDw8ICJBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGUiOworfQorCitURVNUKFByaW50VHlwZVdpdGhHZW5lcmljU3RyZWFtaW5nVGVzdCwgVGVtcGxhdGVUeXBlKSB7CisgIEFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZTxpbnQ+IGE7CisgIEVYUEVDVF9FUSgiQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlIiwgUHJpbnQoYSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBhIHR5cGUgdGhhdCBzdXBwb3J0cyBnZW5lcmljIHN0cmVhbWluZyBhbmQgY2FuIGJlCisvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhbm90aGVyIHByaW50YWJsZSB0eXBlLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZSB7CisgcHVibGljOgorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyVHJhaXRzLCB0eXBlbmFtZSBUPgorc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsCisgICAgY29uc3QgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ0FuZEltcGxpY2l0Q29udmVyc2lvblRlbXBsYXRlPFQ+JiAvKiBhICovKSB7CisgIHJldHVybiBvcyA8PCAiQWxsb3dzR2VuZXJpY1N0cmVhbWluZ0FuZEltcGxpY2l0Q29udmVyc2lvblRlbXBsYXRlIjsKK30KKworVEVTVChQcmludFR5cGVXaXRoR2VuZXJpY1N0cmVhbWluZ1Rlc3QsIFR5cGVJbXBsaWNpdGx5Q29udmVydGlibGUpIHsKKyAgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ0FuZEltcGxpY2l0Q29udmVyc2lvblRlbXBsYXRlPGludD4gYTsKKyAgRVhQRUNUX0VRKCJBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGUiLCBQcmludChhKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXworCisvLyBUZXN0cyBwcmludGluZyBTdHJpbmdQaWVjZS4KKworVEVTVChQcmludFN0cmluZ1BpZWNlVGVzdCwgU2ltcGxlU3RyaW5nUGllY2UpIHsKKyAgY29uc3QgU3RyaW5nUGllY2Ugc3AgPSAiSGVsbG8iOworICBFWFBFQ1RfRVEoIlwiSGVsbG9cIiIsIFByaW50KHNwKSk7Cit9CisKK1RFU1QoUHJpbnRTdHJpbmdQaWVjZVRlc3QsIFVucHJpbnRhYmxlQ2hhcmFjdGVycykgeworICBjb25zdCBjaGFyIHN0cltdID0gIk5VTCAoXDApIGFuZCBcclx0IjsKKyAgY29uc3QgU3RyaW5nUGllY2Ugc3Aoc3RyLCBzaXplb2Yoc3RyKSAtIDEpOworICBFWFBFQ1RfRVEoIlwiTlVMIChcXDApIGFuZCBcXHJcXHRcIiIsIFByaW50KHNwKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KKworLy8gVGVzdHMgcHJpbnRpbmcgU1RMIGNvbnRhaW5lcnMuCisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBFbXB0eURlcXVlKSB7CisgIGRlcXVlPGNoYXI+IGVtcHR5OworICBFWFBFQ1RfRVEoInt9IiwgUHJpbnQoZW1wdHkpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE5vbkVtcHR5RGVxdWUpIHsKKyAgZGVxdWU8aW50PiBub25fZW1wdHk7CisgIG5vbl9lbXB0eS5wdXNoX2JhY2soMSk7CisgIG5vbl9lbXB0eS5wdXNoX2JhY2soMyk7CisgIEVYUEVDVF9FUSgieyAxLCAzIH0iLCBQcmludChub25fZW1wdHkpKTsKK30KKworI2lmIEdURVNUX0hBU19IQVNIX01BUF8KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE9uZUVsZW1lbnRIYXNoTWFwKSB7CisgIGhhc2hfbWFwPGludCwgY2hhcj4gbWFwMTsKKyAgbWFwMVsxXSA9ICdhJzsKKyAgRVhQRUNUX0VRKCJ7ICgxLCAnYScgKDk3LCAweDYxKSkgfSIsIFByaW50KG1hcDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEhhc2hNdWx0aU1hcCkgeworICBoYXNoX211bHRpbWFwPGludCwgYm9vbD4gbWFwMTsKKyAgbWFwMS5pbnNlcnQobWFrZV9wYWlyKDUsIHRydWUpKTsKKyAgbWFwMS5pbnNlcnQobWFrZV9wYWlyKDUsIGZhbHNlKSk7CisKKyAgLy8gRWxlbWVudHMgb2YgaGFzaF9tdWx0aW1hcCBjYW4gYmUgcHJpbnRlZCBpbiBhbnkgb3JkZXIuCisgIGNvbnN0IHN0cmluZyByZXN1bHQgPSBQcmludChtYXAxKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0ID09ICJ7ICg1LCB0cnVlKSwgKDUsIGZhbHNlKSB9IiB8fAorICAgICAgICAgICAgICByZXN1bHQgPT0gInsgKDUsIGZhbHNlKSwgKDUsIHRydWUpIH0iKQorICAgICAgICAgICAgICAgICAgPDwgIiB3aGVyZSBQcmludChtYXAxKSByZXR1cm5zIFwiIiA8PCByZXN1bHQgPDwgIlwiLiI7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0hBU0hfTUFQXworCisjaWYgR1RFU1RfSEFTX0hBU0hfU0VUXworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgSGFzaFNldCkgeworICBoYXNoX3NldDxzdHJpbmc+IHNldDE7CisgIHNldDEuaW5zZXJ0KCJoZWxsbyIpOworICBFWFBFQ1RfRVEoInsgXCJoZWxsb1wiIH0iLCBQcmludChzZXQxKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBIYXNoTXVsdGlTZXQpIHsKKyAgY29uc3QgaW50IGtTaXplID0gNTsKKyAgaW50IGFba1NpemVdID0geyAxLCAxLCAyLCA1LCAxIH07CisgIGhhc2hfbXVsdGlzZXQ8aW50PiBzZXQxKGEsIGEgKyBrU2l6ZSk7CisKKyAgLy8gRWxlbWVudHMgb2YgaGFzaF9tdWx0aXNldCBjYW4gYmUgcHJpbnRlZCBpbiBhbnkgb3JkZXIuCisgIGNvbnN0IHN0cmluZyByZXN1bHQgPSBQcmludChzZXQxKTsKKyAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3BhdHRlcm4gPSAieyBkLCBkLCBkLCBkLCBkIH0iOyAgLy8gZCBtZWFucyBhIGRpZ2l0LgorCisgIC8vIFZlcmlmaWVzIHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgcGF0dGVybjsgYWxzbyBleHRyYWN0cworICAvLyB0aGUgbnVtYmVycyBpbiB0aGUgcmVzdWx0LgorICBBU1NFUlRfRVEoZXhwZWN0ZWRfcGF0dGVybi5sZW5ndGgoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSByZXN1bHQubGVuZ3RoKCk7IGkrKykgeworICAgIGlmIChleHBlY3RlZF9wYXR0ZXJuW2ldID09ICdkJykgeworICAgICAgQVNTRVJUX05FKGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocmVzdWx0W2ldKSksIDApOworICAgICAgbnVtYmVycy5wdXNoX2JhY2socmVzdWx0W2ldIC0gJzAnKTsKKyAgICB9IGVsc2UgeworICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkX3BhdHRlcm5baV0sIHJlc3VsdFtpXSkgPDwgIiB3aGVyZSByZXN1bHQgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0OworICAgIH0KKyAgfQorCisgIC8vIE1ha2VzIHN1cmUgdGhlIHJlc3VsdCBjb250YWlucyB0aGUgcmlnaHQgbnVtYmVycy4KKyAgc3RkOjpzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CisgIHN0ZDo6c29ydChhLCBhICsga1NpemUpOworICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGEsIGEgKyBrU2l6ZSwgbnVtYmVycy5iZWdpbigpKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0hBU0hfU0VUXworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTGlzdCkgeworICBjb25zdCBzdHJpbmcgYVtdID0geworICAgICJoZWxsbyIsCisgICAgIndvcmxkIgorICB9OworICBjb25zdCBsaXN0PHN0cmluZz4gc3RyaW5ncyhhLCBhICsgMik7CisgIEVYUEVDVF9FUSgieyBcImhlbGxvXCIsIFwid29ybGRcIiB9IiwgUHJpbnQoc3RyaW5ncykpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTWFwKSB7CisgIG1hcDxpbnQsIGJvb2w+IG1hcDE7CisgIG1hcDFbMV0gPSB0cnVlOworICBtYXAxWzVdID0gZmFsc2U7CisgIG1hcDFbM10gPSB0cnVlOworICBFWFBFQ1RfRVEoInsgKDEsIHRydWUpLCAoMywgdHJ1ZSksICg1LCBmYWxzZSkgfSIsIFByaW50KG1hcDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE11bHRpTWFwKSB7CisgIG11bHRpbWFwPGJvb2wsIGludD4gbWFwMTsKKyAgLy8gVGhlIG1ha2VfcGFpciB0ZW1wbGF0ZSBmdW5jdGlvbiB3b3VsZCBkZWR1Y2UgdGhlIHR5cGUgYXMKKyAgLy8gcGFpcjxib29sLCBpbnQ+IGhlcmUsIGFuZCBzaW5jZSB0aGUga2V5IHBhcnQgaW4gYSBtdWx0aW1hcCBoYXMgdG8KKyAgLy8gYmUgY29uc3RhbnQsIHdpdGhvdXQgYSB0ZW1wbGF0ZWQgY3RvciBpbiB0aGUgcGFpciBjbGFzcyAoYXMgaW4KKyAgLy8gbGliQ3N0ZCBvbiBTb2xhcmlzKSwgbWFrZV9wYWlyIGNhbGwgd291bGQgZmFpbCB0byBjb21waWxlIGFzIG5vCisgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgZm91bmQuICBUaHVzIGV4cGxpY2l0IHR5cGVuYW1lIGlzIHVzZWQKKyAgLy8gaGVyZSBpbnN0ZWFkLgorICBtYXAxLmluc2VydChwYWlyPGNvbnN0IGJvb2wsIGludD4odHJ1ZSwgMCkpOworICBtYXAxLmluc2VydChwYWlyPGNvbnN0IGJvb2wsIGludD4odHJ1ZSwgMSkpOworICBtYXAxLmluc2VydChwYWlyPGNvbnN0IGJvb2wsIGludD4oZmFsc2UsIDIpKTsKKyAgRVhQRUNUX0VRKCJ7IChmYWxzZSwgMiksICh0cnVlLCAwKSwgKHRydWUsIDEpIH0iLCBQcmludChtYXAxKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBTZXQpIHsKKyAgY29uc3QgdW5zaWduZWQgaW50IGFbXSA9IHsgMywgMCwgNSB9OworICBzZXQ8dW5zaWduZWQgaW50PiBzZXQxKGEsIGEgKyAzKTsKKyAgRVhQRUNUX0VRKCJ7IDAsIDMsIDUgfSIsIFByaW50KHNldDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE11bHRpU2V0KSB7CisgIGNvbnN0IGludCBhW10gPSB7IDEsIDEsIDIsIDUsIDEgfTsKKyAgbXVsdGlzZXQ8aW50PiBzZXQxKGEsIGEgKyA1KTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDEsIDEsIDIsIDUgfSIsIFByaW50KHNldDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFBhaXIpIHsKKyAgcGFpcjxjb25zdCBib29sLCBpbnQ+IHAodHJ1ZSwgNSk7CisgIEVYUEVDVF9FUSgiKHRydWUsIDUpIiwgUHJpbnQocCkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgVmVjdG9yKSB7CisgIHZlY3RvcjxpbnQ+IHY7CisgIHYucHVzaF9iYWNrKDEpOworICB2LnB1c2hfYmFjaygyKTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIgfSIsIFByaW50KHYpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIExvbmdTZXF1ZW5jZSkgeworICBjb25zdCBpbnQgYVsxMDBdID0geyAxLCAyLCAzIH07CisgIGNvbnN0IHZlY3RvcjxpbnQ+IHYoYSwgYSArIDEwMCk7CisgIEVYUEVDVF9FUSgieyAxLCAyLCAzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAiCisgICAgICAgICAgICAiMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLi4uIH0iLCBQcmludCh2KSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBOZXN0ZWRDb250YWluZXIpIHsKKyAgY29uc3QgaW50IGExW10gPSB7IDEsIDIgfTsKKyAgY29uc3QgaW50IGEyW10gPSB7IDMsIDQsIDUgfTsKKyAgY29uc3QgbGlzdDxpbnQ+IGwxKGExLCBhMSArIDIpOworICBjb25zdCBsaXN0PGludD4gbDIoYTIsIGEyICsgMyk7CisKKyAgdmVjdG9yPGxpc3Q8aW50PiA+IHY7CisgIHYucHVzaF9iYWNrKGwxKTsKKyAgdi5wdXNoX2JhY2sobDIpOworICBFWFBFQ1RfRVEoInsgeyAxLCAyIH0sIHsgMywgNCwgNSB9IH0iLCBQcmludCh2KSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBPbmVEaW1lbnNpb25hbE5hdGl2ZUFycmF5KSB7CisgIGNvbnN0IGludCBhWzNdID0geyAxLCAyLCAzIH07CisgIE5hdGl2ZUFycmF5PGludD4gYihhLCAzLCBrUmVmZXJlbmNlKTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIsIDMgfSIsIFByaW50KGIpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFR3b0RpbWVuc2lvbmFsTmF0aXZlQXJyYXkpIHsKKyAgY29uc3QgaW50IGFbMl1bM10gPSB7IHsgMSwgMiwgMyB9LCB7IDQsIDUsIDYgfSB9OworICBOYXRpdmVBcnJheTxpbnRbM10+IGIoYSwgMiwga1JlZmVyZW5jZSk7CisgIEVYUEVDVF9FUSgieyB7IDEsIDIsIDMgfSwgeyA0LCA1LCA2IH0gfSIsIFByaW50KGIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGNsYXNzIG5hbWVkIGl0ZXJhdG9yIGlzbid0IHRyZWF0ZWQgYXMgYSBjb250YWluZXIuCisKK3N0cnVjdCBpdGVyYXRvciB7CisgIGNoYXIgeDsKK307CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBJdGVyYXRvcikgeworICBpdGVyYXRvciBpdCA9IHt9OworICBFWFBFQ1RfRVEoIjEtYnl0ZSBvYmplY3QgPDAwPiIsIFByaW50KGl0KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBjbGFzcyBuYW1lZCBjb25zdF9pdGVyYXRvciBpc24ndCB0cmVhdGVkIGFzIGEgY29udGFpbmVyLgorCitzdHJ1Y3QgY29uc3RfaXRlcmF0b3IgeworICBjaGFyIHg7Cit9OworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgQ29uc3RJdGVyYXRvcikgeworICBjb25zdF9pdGVyYXRvciBpdCA9IHt9OworICBFWFBFQ1RfRVEoIjEtYnl0ZSBvYmplY3QgPDAwPiIsIFByaW50KGl0KSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCisvLyBUZXN0cyBwcmludGluZyB0dXBsZXMuCisKKy8vIFR1cGxlcyBvZiB2YXJpb3VzIGFyaXRpZXMuCitURVNUKFByaW50VHVwbGVUZXN0LCBWYXJpb3VzU2l6ZXMpIHsKKyAgdHVwbGU8PiB0MDsKKyAgRVhQRUNUX0VRKCIoKSIsIFByaW50KHQwKSk7CisKKyAgdHVwbGU8aW50PiB0MSg1KTsKKyAgRVhQRUNUX0VRKCIoNSkiLCBQcmludCh0MSkpOworCisgIHR1cGxlPGNoYXIsIGJvb2w+IHQyKCdhJywgdHJ1ZSk7CisgIEVYUEVDVF9FUSgiKCdhJyAoOTcsIDB4NjEpLCB0cnVlKSIsIFByaW50KHQyKSk7CisKKyAgdHVwbGU8Ym9vbCwgaW50LCBpbnQ+IHQzKGZhbHNlLCAyLCAzKTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMpIiwgUHJpbnQodDMpKTsKKworICB0dXBsZTxib29sLCBpbnQsIGludCwgaW50PiB0NChmYWxzZSwgMiwgMywgNCk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0KSIsIFByaW50KHQ0KSk7CisKKyAgdHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbD4gdDUoZmFsc2UsIDIsIDMsIDQsIHRydWUpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSkiLCBQcmludCh0NSkpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludD4gdDYoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNikiLCBQcmludCh0NikpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50PiB0NyhmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNyk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3KSIsIFByaW50KHQ3KSk7CisKKyAgdHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50LCBpbnQsIGJvb2w+IHQ4KAorICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSkiLCBQcmludCh0OCkpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50LCBib29sLCBpbnQ+IHQ5KAorICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUsIDkpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSwgOSkiLCBQcmludCh0OSkpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICI4IjsKKyAgLy8gVkMrKyAyMDEwJ3MgaW1wbGVtZW50YXRpb24gb2YgdHVwbGUgb2YgQysrMHggaXMgZGVmaWNpZW50LCByZXF1aXJpbmcKKyAgLy8gYW4gZXhwbGljaXQgdHlwZSBjYXN0IG9mIE5VTEwgdG8gYmUgdXNlZC4KKyAgdHVwbGU8Ym9vbCwgY2hhciwgc2hvcnQsIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiwgIC8vIE5PTElOVAorICAgICAgdGVzdGluZzo6aW50ZXJuYWw6OkludDY0LCBmbG9hdCwgZG91YmxlLCBjb25zdCBjaGFyKiwgdm9pZCosIHN0cmluZz4KKyAgICAgIHQxMChmYWxzZSwgJ2EnLCAzLCA0LCA1LCAxLjVGLCAtMi41LCBzdHIsCisgICAgICAgICAgSW1wbGljaXRDYXN0Xzx2b2lkKj4oTlVMTCksICIxMCIpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgJ2EnICg5NywgMHg2MSksIDMsIDQsIDUsIDEuNSwgLTIuNSwgIiArIFByaW50UG9pbnRlcihzdHIpICsKKyAgICAgICAgICAgICIgcG9pbnRpbmcgdG8gXCI4XCIsIE5VTEwsIFwiMTBcIikiLAorICAgICAgICAgICAgUHJpbnQodDEwKSk7Cit9CisKKy8vIE5lc3RlZCB0dXBsZXMuCitURVNUKFByaW50VHVwbGVUZXN0LCBOZXN0ZWRUdXBsZSkgeworICB0dXBsZTx0dXBsZTxpbnQsIGJvb2w+LCBjaGFyPiBuZXN0ZWQobWFrZV90dXBsZSg1LCB0cnVlKSwgJ2EnKTsKKyAgRVhQRUNUX0VRKCIoKDUsIHRydWUpLCAnYScgKDk3LCAweDYxKSkiLCBQcmludChuZXN0ZWQpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCB1bnByaW50YWJsZSB0eXBlcy4KKworLy8gVW5wcmludGFibGUgdHlwZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitURVNUKFByaW50VW5wcmludGFibGVUeXBlVGVzdCwgSW5HbG9iYWxOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCIxLWJ5dGUgb2JqZWN0IDwwMD4iLAorICAgICAgICAgICAgUHJpbnQoVW5wcmludGFibGVUZW1wbGF0ZUluR2xvYmFsPGNoYXI+KCkpKTsKK30KKworLy8gVW5wcmludGFibGUgdHlwZXMgaW4gYSB1c2VyIG5hbWVzcGFjZS4KK1RFU1QoUHJpbnRVbnByaW50YWJsZVR5cGVUZXN0LCBJblVzZXJOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCIxNi1ieXRlIG9iamVjdCA8RUYtMTIgMDAtMDAgMzQtQUIgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDA+IiwKKyAgICAgICAgICAgIFByaW50KDo6Zm9vOjpVbnByaW50YWJsZUluRm9vKCkpKTsKK30KKworLy8gVW5wcmludGFibGUgdHlwZXMgYXJlIHRoYXQgdG9vIGJpZyB0byBiZSBwcmludGVkIGNvbXBsZXRlbHkuCisKK3N0cnVjdCBCaWcgeworICBCaWcoKSB7IG1lbXNldChhcnJheSwgMCwgc2l6ZW9mKGFycmF5KSk7IH0KKyAgY2hhciBhcnJheVsyNTddOworfTsKKworVEVTVChQcmludFVucHJpdGFibGVUeXBlVGVzdCwgQmlnT2JqZWN0KSB7CisgIEVYUEVDVF9FUSgiMjU3LWJ5dGUgb2JqZWN0IDwwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAuLi4gMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDA+IiwKKyAgICAgICAgICAgIFByaW50KEJpZygpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCBzdHJlYW1hYmxlIHR5cGVzLgorCisvLyBTdHJlYW1hYmxlIHR5cGVzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorVEVTVChQcmludFN0cmVhbWFibGVUeXBlVGVzdCwgSW5HbG9iYWxOYW1lc3BhY2UpIHsKKyAgU3RyZWFtYWJsZUluR2xvYmFsIHg7CisgIEVYUEVDVF9FUSgiU3RyZWFtYWJsZUluR2xvYmFsIiwgUHJpbnQoeCkpOworICBFWFBFQ1RfRVEoIlN0cmVhbWFibGVJbkdsb2JhbCoiLCBQcmludCgmeCkpOworfQorCisvLyBQcmludGFibGUgdGVtcGxhdGUgdHlwZXMgaW4gYSB1c2VyIG5hbWVzcGFjZS4KK1RFU1QoUHJpbnRTdHJlYW1hYmxlVHlwZVRlc3QsIFRlbXBsYXRlVHlwZUluVXNlck5hbWVzcGFjZSkgeworICBFWFBFQ1RfRVEoIlN0cmVhbWFibGVUZW1wbGF0ZUluRm9vOiAwIiwKKyAgICAgICAgICAgIFByaW50KDo6Zm9vOjpTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbzxpbnQ+KCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgaGF2ZSBhIFByaW50VG8oKSBmdW5jdGlvbi4KK1RFU1QoUHJpbnRQcmludGFibGVUeXBlVGVzdCwgSW5Vc2VyTmFtZXNwYWNlKSB7CisgIEVYUEVDVF9FUSgiUHJpbnRhYmxlVmlhUHJpbnRUbzogMCIsCisgICAgICAgICAgICBQcmludCg6OmZvbzo6UHJpbnRhYmxlVmlhUHJpbnRUbygpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgcG9pbnRlciB0byBhIHVzZXItZGVmaW5lZCB0eXBlIHRoYXQgaGFzIGEgPDwKKy8vIG9wZXJhdG9yIGZvciBpdHMgcG9pbnRlci4KK1RFU1QoUHJpbnRQcmludGFibGVUeXBlVGVzdCwgUG9pbnRlckluVXNlck5hbWVzcGFjZSkgeworICA6OmZvbzo6UG9pbnRlclByaW50YWJsZSB4OworICBFWFBFQ1RfRVEoIlBvaW50ZXJQcmludGFibGUqIiwgUHJpbnQoJngpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdXNlci1kZWZpbmVkIGNsYXNzIHRlbXBsYXRlIHRoYXQgaGF2ZSBhIFByaW50VG8oKSBmdW5jdGlvbi4KK1RFU1QoUHJpbnRQcmludGFibGVUeXBlVGVzdCwgVGVtcGxhdGVJblVzZXJOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCJQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGU6IDUiLAorICAgICAgICAgICAgUHJpbnQoOjpmb286OlByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZTxpbnQ+KDUpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfUFJPVE9CVUZfCisKKy8vIFRlc3RzIHByaW50aW5nIGEgcHJvdG9jb2wgbWVzc2FnZS4KK1RFU1QoUHJpbnRQcm90b2NvbE1lc3NhZ2VUZXN0LCBQcmludHNTaG9ydERlYnVnU3RyaW5nKSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpUZXN0TWVzc2FnZSBtc2c7CisgIG1zZy5zZXRfbWVtYmVyKCJ5ZXMiKTsKKyAgRVhQRUNUX0VRKCI8bWVtYmVyOlwieWVzXCI+IiwgUHJpbnQobXNnKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgc2hvcnQgcHJvdG8yIG1lc3NhZ2UuCitURVNUKFByaW50UHJvdG8yTWVzc2FnZVRlc3QsIFByaW50c1Nob3J0RGVidWdTdHJpbmdXaGVuSXRJc1Nob3J0KSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpGb29NZXNzYWdlIG1zZzsKKyAgbXNnLnNldF9pbnRfZmllbGQoMik7CisgIG1zZy5zZXRfc3RyaW5nX2ZpZWxkKCJoZWxsbyIpOworICBFWFBFQ1RfUFJFRDIoUkU6OkZ1bGxNYXRjaCwgUHJpbnQobXNnKSwKKyAgICAgICAgICAgICAgICI8aW50X2ZpZWxkOlxccyoyXFxzK3N0cmluZ19maWVsZDpcXHMqXCJoZWxsb1wiPiIpOworfQorCisvLyBUZXN0cyBwcmludGluZyBhIGxvbmcgcHJvdG8yIG1lc3NhZ2UuCitURVNUKFByaW50UHJvdG8yTWVzc2FnZVRlc3QsIFByaW50c0RlYnVnU3RyaW5nV2hlbkl0SXNMb25nKSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpGb29NZXNzYWdlIG1zZzsKKyAgbXNnLnNldF9pbnRfZmllbGQoMik7CisgIG1zZy5zZXRfc3RyaW5nX2ZpZWxkKCJoZWxsbyIpOworICBtc2cuYWRkX25hbWVzKCJwZXRlciIpOworICBtc2cuYWRkX25hbWVzKCJwYXVsIik7CisgIG1zZy5hZGRfbmFtZXMoIm1hcnkiKTsKKyAgRVhQRUNUX1BSRUQyKFJFOjpGdWxsTWF0Y2gsIFByaW50KG1zZyksCisgICAgICAgICAgICAgICAiPFxuIgorICAgICAgICAgICAgICAgImludF9maWVsZDpcXHMqMlxuIgorICAgICAgICAgICAgICAgInN0cmluZ19maWVsZDpcXHMqXCJoZWxsb1wiXG4iCisgICAgICAgICAgICAgICAibmFtZXM6XFxzKlwicGV0ZXJcIlxuIgorICAgICAgICAgICAgICAgIm5hbWVzOlxccypcInBhdWxcIlxuIgorICAgICAgICAgICAgICAgIm5hbWVzOlxccypcIm1hcnlcIlxuIgorICAgICAgICAgICAgICAgIj4iKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUFJPVE9CVUZfCisKKy8vIFRlc3RzIHRoYXQgdGhlIHVuaXZlcnNhbCBwcmludGVyIHByaW50cyBib3RoIHRoZSBhZGRyZXNzIGFuZCB0aGUKKy8vIHZhbHVlIG9mIGEgcmVmZXJlbmNlLgorVEVTVChQcmludFJlZmVyZW5jZVRlc3QsIFByaW50c0FkZHJlc3NBbmRWYWx1ZSkgeworICBpbnQgbiA9IDU7CisgIEVYUEVDVF9FUSgiQCIgKyBQcmludFBvaW50ZXIoJm4pICsgIiA1IiwgUHJpbnRCeVJlZihuKSk7CisKKyAgaW50IGFbMl1bM10gPSB7CisgICAgeyAwLCAxLCAyIH0sCisgICAgeyAzLCA0LCA1IH0KKyAgfTsKKyAgRVhQRUNUX0VRKCJAIiArIFByaW50UG9pbnRlcihhKSArICIgeyB7IDAsIDEsIDIgfSwgeyAzLCA0LCA1IH0gfSIsCisgICAgICAgICAgICBQcmludEJ5UmVmKGEpKTsKKworICBjb25zdCA6OmZvbzo6VW5wcmludGFibGVJbkZvbyB4OworICBFWFBFQ1RfRVEoIkAiICsgUHJpbnRQb2ludGVyKCZ4KSArICIgMTYtYnl0ZSBvYmplY3QgIgorICAgICAgICAgICAgIjxFRi0xMiAwMC0wMCAzNC1BQiAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMD4iLAorICAgICAgICAgICAgUHJpbnRCeVJlZih4KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHVuaXZlcnNhbCBwcmludGVyIHByaW50cyBhIGZ1bmN0aW9uIHBvaW50ZXIgcGFzc2VkIGJ5CisvLyByZWZlcmVuY2UuCitURVNUKFByaW50UmVmZXJlbmNlVGVzdCwgSGFuZGxlc0Z1bmN0aW9uUG9pbnRlcikgeworICB2b2lkICgqZnApKGludCBuKSA9ICZNeUZ1bmN0aW9uOworICBjb25zdCBzdHJpbmcgZnBfcG9pbnRlcl9zdHJpbmcgPQorICAgICAgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZmcCkpOworICAvLyBXZSBjYW5ub3QgZGlyZWN0bHkgY2FzdCAmTXlGdW5jdGlvbiB0byBjb25zdCB2b2lkKiBiZWNhdXNlIHRoZQorICAvLyBzdGFuZGFyZCBkaXNhbGxvd3MgY2FzdGluZyBiZXR3ZWVuIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBhbmQKKyAgLy8gcG9pbnRlcnMgdG8gb2JqZWN0cywgYW5kIHNvbWUgY29tcGlsZXJzIChlLmcuIEdDQyAzLjQpIGVuZm9yY2UKKyAgLy8gdGhpcyBsaW1pdGF0aW9uLgorICBjb25zdCBzdHJpbmcgZnBfc3RyaW5nID0gUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6QmlnZ2VzdEludD4oZnApKSk7CisgIEVYUEVDVF9FUSgiQCIgKyBmcF9wb2ludGVyX3N0cmluZyArICIgIiArIGZwX3N0cmluZywKKyAgICAgICAgICAgIFByaW50QnlSZWYoZnApKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgdW5pdmVyc2FsIHByaW50ZXIgcHJpbnRzIGEgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIKKy8vIHBhc3NlZCBieSByZWZlcmVuY2UuCitURVNUKFByaW50UmVmZXJlbmNlVGVzdCwgSGFuZGxlc01lbWJlckZ1bmN0aW9uUG9pbnRlcikgeworICBpbnQgKEZvbzo6KnApKGNoYXIgY2gpID0gJkZvbzo6TXlNZXRob2Q7CisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeCgKKyAgICAgIFByaW50QnlSZWYocCksCisgICAgICAiQCIgKyBQcmludFBvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJnApKSArICIgIiArCisgICAgICAgICAgUHJpbnQoc2l6ZW9mKHApKSArICItYnl0ZSBvYmplY3QgIikpOworCisgIGNoYXIgKEZvbzo6KnAyKShpbnQgbikgPSAmRm9vOjpNeVZpcnR1YWxNZXRob2Q7CisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeCgKKyAgICAgIFByaW50QnlSZWYocDIpLAorICAgICAgIkAiICsgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZwMikpICsgIiAiICsKKyAgICAgICAgICBQcmludChzaXplb2YocDIpKSArICItYnl0ZSBvYmplY3QgIikpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSB1bml2ZXJzYWwgcHJpbnRlciBwcmludHMgYSBtZW1iZXIgdmFyaWFibGUgcG9pbnRlcgorLy8gcGFzc2VkIGJ5IHJlZmVyZW5jZS4KK1RFU1QoUHJpbnRSZWZlcmVuY2VUZXN0LCBIYW5kbGVzTWVtYmVyVmFyaWFibGVQb2ludGVyKSB7CisgIGludCAoRm9vOjoqcCkgPSAmRm9vOjp2YWx1ZTsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoCisgICAgICBQcmludEJ5UmVmKHApLAorICAgICAgIkAiICsgUHJpbnRQb2ludGVyKCZwKSArICIgIiArIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoKSwgd2hpY2ggaXMgdXNlZCB0byBwcmludAorLy8gYW4gb3BlcmFuZCBpbiBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uIChlLmcuIEFTU0VSVF9FUSkgd2hlbiB0aGUgYXNzZXJ0aW9uCisvLyBmYWlscywgZm9ybWF0cyB0aGUgb3BlcmFuZCBpbiB0aGUgZGVzaXJlZCB3YXkuCisKKy8vIHNjYWxhcgorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvclNjYWxhcikgeworICBFWFBFQ1RfU1RSRVEoIjEyMyIsCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoMTIzLCAxMjQpLmNfc3RyKCkpOworfQorCisvLyBub24tY2hhciBwb2ludGVyCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yTm9uQ2hhclBvaW50ZXIpIHsKKyAgaW50IG4gPSAwOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKCZuKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgmbiwgJm4pLmNfc3RyKCkpOworfQorCisvLyBub24tY2hhciBhcnJheQorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBGb3JtYXRzTm9uQ2hhckFycmF5QXNQb2ludGVyKSB7CisgIC8vIEluIGV4cHJlc3Npb24gJ2FycmF5ID09IHgnLCAnYXJyYXknIGlzIGNvbXBhcmVkIGJ5IHBvaW50ZXIuCisgIC8vIFRoZXJlZm9yZSB3ZSB3YW50IHRvIHByaW50IGFuIGFycmF5IG9wZXJhbmQgYXMgYSBwb2ludGVyLgorICBpbnQgbltdID0geyAxLCAyLCAzIH07CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIobiksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UobiwgbikuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIGZvcm1hdHRpbmcgYSBjaGFyIHBvaW50ZXIgd2hlbiBpdCdzIGNvbXBhcmVkIHdpdGggYW5vdGhlciBwb2ludGVyLgorLy8gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcHJpbnQgaXQgYXMgYSByYXcgcG9pbnRlciwgYXMgdGhlIGNvbXBhcmlzaW9uIGlzIGJ5CisvLyBwb2ludGVyLgorCisvLyBjaGFyIHBvaW50ZXIgdnMgcG9pbnRlcgorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJQb2ludGVyVnNQb2ludGVyKSB7CisgIC8vIEluIGV4cHJlc3Npb24gJ3AgPT0geCcsIHdoZXJlICdwJyBhbmQgJ3gnIGFyZSAoY29uc3Qgb3Igbm90KSBjaGFyCisgIC8vIHBvaW50ZXJzLCB0aGUgb3BlcmFuZHMgYXJlIGNvbXBhcmVkIGJ5IHBvaW50ZXIuICBUaGVyZWZvcmUgd2UKKyAgLy8gd2FudCB0byBwcmludCAncCcgYXMgYSBwb2ludGVyIGluc3RlYWQgb2YgYSBDIHN0cmluZyAod2UgZG9uJ3QKKyAgLy8gZXZlbiBrbm93IGlmIGl0J3Mgc3VwcG9zZWQgdG8gcG9pbnQgdG8gYSB2YWxpZCBDIHN0cmluZykuCisKKyAgLy8gY29uc3QgY2hhcioKKyAgY29uc3QgY2hhciogcyA9ICJoZWxsbyI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocyksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgcykuY19zdHIoKSk7CisKKyAgLy8gY2hhcioKKyAgY2hhciBjaCA9ICdhJzsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcigmY2gpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKCZjaCwgJmNoKS5jX3N0cigpKTsKK30KKworLy8gd2NoYXJfdCBwb2ludGVyIHZzIHBvaW50ZXIKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhclBvaW50ZXJWc1BvaW50ZXIpIHsKKyAgLy8gSW4gZXhwcmVzc2lvbiAncCA9PSB4Jywgd2hlcmUgJ3AnIGFuZCAneCcgYXJlIChjb25zdCBvciBub3QpIGNoYXIKKyAgLy8gcG9pbnRlcnMsIHRoZSBvcGVyYW5kcyBhcmUgY29tcGFyZWQgYnkgcG9pbnRlci4gIFRoZXJlZm9yZSB3ZQorICAvLyB3YW50IHRvIHByaW50ICdwJyBhcyBhIHBvaW50ZXIgaW5zdGVhZCBvZiBhIHdpZGUgQyBzdHJpbmcgKHdlIGRvbid0CisgIC8vIGV2ZW4ga25vdyBpZiBpdCdzIHN1cHBvc2VkIHRvIHBvaW50IHRvIGEgdmFsaWQgd2lkZSBDIHN0cmluZykuCisKKyAgLy8gY29uc3Qgd2NoYXJfdCoKKyAgY29uc3Qgd2NoYXJfdCogcyA9IEwiaGVsbG8iOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHMpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHMsIHMpLmNfc3RyKCkpOworCisgIC8vIHdjaGFyX3QqCisgIHdjaGFyX3QgY2ggPSBMJ2EnOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKCZjaCksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoJmNoLCAmY2gpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBmb3JtYXR0aW5nIGEgY2hhciBwb2ludGVyIHdoZW4gaXQncyBjb21wYXJlZCB0byBhIHN0cmluZyBvYmplY3QuCisvLyBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBwcmludCB0aGUgY2hhciBwb2ludGVyIGFzIGEgQyBzdHJpbmcuCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworLy8gY2hhciBwb2ludGVyIHZzIDo6c3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhclBvaW50ZXJWc1N0cmluZykgeworICBjb25zdCBjaGFyKiBzID0gImhlbGxvIFwid29ybGQiOworICBFWFBFQ1RfU1RSRVEoIlwiaGVsbG8gXFxcIndvcmxkXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHMsIDo6c3RyaW5nKCkpLmNfc3RyKCkpOworCisgIC8vIGNoYXIqCisgIGNoYXIgc3RyW10gPSAiaGlcMSI7CisgIGNoYXIqIHAgPSBzdHI7CisgIEVYUEVDVF9TVFJFUSgiXCJoaVxceDFcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocCwgOjpzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisjZW5kaWYKKworLy8gY2hhciBwb2ludGVyIHZzIHN0ZDo6c3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhclBvaW50ZXJWc1N0ZFN0cmluZykgeworICBjb25zdCBjaGFyKiBzID0gImhlbGxvIFwid29ybGQiOworICBFWFBFQ1RfU1RSRVEoIlwiaGVsbG8gXFxcIndvcmxkXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHMsIDo6c3RkOjpzdHJpbmcoKSkuY19zdHIoKSk7CisKKyAgLy8gY2hhcioKKyAgY2hhciBzdHJbXSA9ICJoaVwxIjsKKyAgY2hhciogcCA9IHN0cjsKKyAgRVhQRUNUX1NUUkVRKCJcImhpXFx4MVwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShwLCA6OnN0ZDo6c3RyaW5nKCkpLmNfc3RyKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyB3Y2hhcl90IHBvaW50ZXIgdnMgOjp3c3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJQb2ludGVyVnNXU3RyaW5nKSB7CisgIGNvbnN0IHdjaGFyX3QqIHMgPSBMImhpIFwid29ybGQiOworICBFWFBFQ1RfU1RSRVEoIkxcImhpIFxcXCJ3b3JsZFwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCA6OndzdHJpbmcoKSkuY19zdHIoKSk7CisKKyAgLy8gd2NoYXJfdCoKKyAgd2NoYXJfdCBzdHJbXSA9IEwiaGlcMSI7CisgIHdjaGFyX3QqIHAgPSBzdHI7CisgIEVYUEVDVF9TVFJFUSgiTFwiaGlcXHgxXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHAsIDo6d3N0cmluZygpKS5jX3N0cigpKTsKK30KKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyB3Y2hhcl90IHBvaW50ZXIgdnMgc3RkOjp3c3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJQb2ludGVyVnNTdGRXU3RyaW5nKSB7CisgIGNvbnN0IHdjaGFyX3QqIHMgPSBMImhpIFwid29ybGQiOworICBFWFBFQ1RfU1RSRVEoIkxcImhpIFxcXCJ3b3JsZFwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCA6OnN0ZDo6d3N0cmluZygpKS5jX3N0cigpKTsKKworICAvLyB3Y2hhcl90KgorICB3Y2hhcl90IHN0cltdID0gTCJoaVwxIjsKKyAgd2NoYXJfdCogcCA9IHN0cjsKKyAgRVhQRUNUX1NUUkVRKCJMXCJoaVxceDFcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocCwgOjpzdGQ6OndzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisjZW5kaWYKKworLy8gVGVzdHMgZm9ybWF0dGluZyBhIGNoYXIgYXJyYXkgd2hlbiBpdCdzIGNvbXBhcmVkIHdpdGggYSBwb2ludGVyIG9yIGFycmF5LgorLy8gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcHJpbnQgdGhlIGFycmF5IGFzIGEgcm93IHBvaW50ZXIsIGFzIHRoZSBjb21wYXJpc29uCisvLyBpcyBieSBwb2ludGVyLgorCisvLyBjaGFyIGFycmF5IHZzIHBvaW50ZXIKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyQXJyYXlWc1BvaW50ZXIpIHsKKyAgY2hhciBzdHJbXSA9ICJoaSBcIndvcmxkXCIiOworICBjaGFyKiBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzdHIpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgcCkuY19zdHIoKSk7Cit9CisKKy8vIGNoYXIgYXJyYXkgdnMgY2hhciBhcnJheQorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheVZzQ2hhckFycmF5KSB7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAiaGkgXCJ3b3JsZFwiIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzdHIpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgc3RyKS5jX3N0cigpKTsKK30KKworLy8gd2NoYXJfdCBhcnJheSB2cyBwb2ludGVyCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJBcnJheVZzUG9pbnRlcikgeworICB3Y2hhcl90IHN0cltdID0gTCJoaSBcIndvcmxkXCIiOworICB3Y2hhcl90KiBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzdHIpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgcCkuY19zdHIoKSk7Cit9CisKKy8vIHdjaGFyX3QgYXJyYXkgdnMgd2NoYXJfdCBhcnJheQorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyQXJyYXlWc1dDaGFyQXJyYXkpIHsKKyAgY29uc3Qgd2NoYXJfdCBzdHJbXSA9IEwiaGkgXCJ3b3JsZFwiIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzdHIpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgc3RyKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgZm9ybWF0dGluZyBhIGNoYXIgYXJyYXkgd2hlbiBpdCdzIGNvbXBhcmVkIHdpdGggYSBzdHJpbmcgb2JqZWN0LgorLy8gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcHJpbnQgdGhlIGFycmF5IGFzIGEgQyBzdHJpbmcuCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworLy8gY2hhciBhcnJheSB2cyBzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyQXJyYXlWc1N0cmluZykgeworICBjb25zdCBjaGFyIHN0cltdID0gImhpIFwid1wwcmxkXCIiOworICBFWFBFQ1RfU1RSRVEoIlwiaGkgXFxcIndcIiIsICAvLyBUaGUgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1iZWRkZWQgTlVMIHRlcm1pbmF0ZXMgdGhlIHN0cmluZy4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIDo6c3RyaW5nKCkpLmNfc3RyKCkpOworfQorI2VuZGlmCisKKy8vIGNoYXIgYXJyYXkgdnMgc3RkOjpzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyQXJyYXlWc1N0ZFN0cmluZykgeworICBjb25zdCBjaGFyIHN0cltdID0gImhpIFwid29ybGRcIiI7CisgIEVYUEVDVF9TVFJFUSgiXCJoaSBcXFwid29ybGRcXFwiXCIiLCAgLy8gVGhlIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCA6OnN0ZDo6c3RyaW5nKCkpLmNfc3RyKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyB3Y2hhcl90IGFycmF5IHZzIHdzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhckFycmF5VnNXU3RyaW5nKSB7CisgIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSBMImhpIFwid29ybGRcIiI7CisgIEVYUEVDVF9TVFJFUSgiTFwiaGkgXFxcIndvcmxkXFxcIlwiIiwgIC8vIFRoZSBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgOjp3c3RyaW5nKCkpLmNfc3RyKCkpOworfQorI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIHdjaGFyX3QgYXJyYXkgdnMgc3RkOjp3c3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJBcnJheVZzU3RkV1N0cmluZykgeworICBjb25zdCB3Y2hhcl90IHN0cltdID0gTCJoaSBcIndcMHJsZFwiIjsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIkxcImhpIFxcXCJ3XCIiLCAgLy8gVGhlIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWJlZGRlZCBOVUwgdGVybWluYXRlcyB0aGUgc3RyaW5nLgorICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgOjpzdGQ6OndzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisjZW5kaWYKKworLy8gVXNlZnVsIGZvciB0ZXN0aW5nIFByaW50VG9TdHJpbmcoKS4gIFdlIGNhbm5vdCB1c2UgRVhQRUNUX0VRKCkKKy8vIHRoZXJlIGFzIGl0cyBpbXBsZW1lbnRhdGlvbiB1c2VzIFByaW50VG9TdHJpbmcoKS4gIFRoZSBjYWxsZXIgbXVzdAorLy8gZW5zdXJlIHRoYXQgJ3ZhbHVlJyBoYXMgbm8gc2lkZSBlZmZlY3QuCisjZGVmaW5lIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHZhbHVlLCBleHBlY3RlZF9zdHJpbmcpICAgICAgICAgXAorICBFWFBFQ1RfVFJVRShQcmludFRvU3RyaW5nKHZhbHVlKSA9PSAoZXhwZWN0ZWRfc3RyaW5nKSkgICAgICAgIFwKKyAgICAgIDw8ICIgd2hlcmUgIiAjdmFsdWUgIiBwcmludHMgYXMgIiA8PCAoUHJpbnRUb1N0cmluZyh2YWx1ZSkpCisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yU2NhbGFyKSB7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKDEyMywgIjEyMyIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb0NvbnN0Q2hhcikgeworICBjb25zdCBjaGFyKiBwID0gImhlbGxvIjsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocCwgIlwiaGVsbG9cIiIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb05vbkNvbnN0Q2hhcikgeworICBjaGFyIHNbXSA9ICJoZWxsbyI7CisgIGNoYXIqIHAgPSBzOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhwLCAiXCJoZWxsb1wiIik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIEVzY2FwZXNGb3JQb2ludGVyVG9Db25zdENoYXIpIHsKKyAgY29uc3QgY2hhciogcCA9ICJoZWxsb1xuIjsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocCwgIlwiaGVsbG9cXG5cIiIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBFc2NhcGVzRm9yUG9pbnRlclRvTm9uQ29uc3RDaGFyKSB7CisgIGNoYXIgc1tdID0gImhlbGxvXDEiOworICBjaGFyKiBwID0gczsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocCwgIlwiaGVsbG9cXHgxXCIiKTsKK30KKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JBcnJheSkgeworICBpbnQgblszXSA9IHsgMSwgMiwgMyB9OworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhuLCAieyAxLCAyLCAzIH0iKTsKK30KKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JDaGFyQXJyYXkpIHsKKyAgY2hhciBzW10gPSAiaGVsbG8iOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhzLCAiXCJoZWxsb1wiIik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yQ2hhckFycmF5V2l0aEVtYmVkZGVkTnVsKSB7CisgIGNvbnN0IGNoYXIgc3RyX3dpdGhfbnVsW10gPSAiaGVsbG9cMCB3b3JsZCI7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHN0cl93aXRoX251bCwgIlwiaGVsbG9cXDAgd29ybGRcIiIpOworCisgIGNoYXIgbXV0YWJsZV9zdHJfd2l0aF9udWxbXSA9ICJoZWxsb1wwIHdvcmxkIjsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18obXV0YWJsZV9zdHJfd2l0aF9udWwsICJcImhlbGxvXFwwIHdvcmxkXCIiKTsKK30KKworI3VuZGVmIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfCisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFRlc3QsIFdvcmtzRm9yTm9uUmVmZXJlbmNlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnQoMTIzLCAmc3MpOworICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VGVzdCwgV29ya3NGb3JSZWZlcmVuY2UpIHsKKyAgY29uc3QgaW50JiBuID0gMTIzOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxUZXJzZVByaW50KG4sICZzcyk7CisgIEVYUEVDVF9FUSgiMTIzIiwgc3Muc3RyKCkpOworfQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUZXN0LCBXb3Jrc0ZvckNTdHJpbmcpIHsKKyAgY29uc3QgY2hhciogczEgPSAiYWJjIjsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczE7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnQoczEsICZzczEpOworICBFWFBFQ1RfRVEoIlwiYWJjXCIiLCBzczEuc3RyKCkpOworCisgIGNoYXIqIHMyID0gY29uc3RfY2FzdDxjaGFyKj4oczEpOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMjsKKyAgVW5pdmVyc2FsVGVyc2VQcmludChzMiwgJnNzMik7CisgIEVYUEVDVF9FUSgiXCJhYmNcIiIsIHNzMi5zdHIoKSk7CisKKyAgY29uc3QgY2hhciogczMgPSBOVUxMOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMzsKKyAgVW5pdmVyc2FsVGVyc2VQcmludChzMywgJnNzMyk7CisgIEVYUEVDVF9FUSgiTlVMTCIsIHNzMy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsUHJpbnRUZXN0LCBXb3Jrc0Zvck5vblJlZmVyZW5jZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxQcmludCgxMjMsICZzcyk7CisgIEVYUEVDVF9FUSgiMTIzIiwgc3Muc3RyKCkpOworfQorCitURVNUKFVuaXZlcnNhbFByaW50VGVzdCwgV29ya3NGb3JSZWZlcmVuY2UpIHsKKyAgY29uc3QgaW50JiBuID0gMTIzOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxQcmludChuLCAmc3MpOworICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxQcmludFRlc3QsIFdvcmtzRm9yQ1N0cmluZykgeworICBjb25zdCBjaGFyKiBzMSA9ICJhYmMiOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMTsKKyAgVW5pdmVyc2FsUHJpbnQoczEsICZzczEpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHMxKSArICIgcG9pbnRpbmcgdG8gXCJhYmNcIiIsIHN0cmluZyhzczEuc3RyKCkpKTsKKworICBjaGFyKiBzMiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHMxKTsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczI7CisgIFVuaXZlcnNhbFByaW50KHMyLCAmc3MyKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzMikgKyAiIHBvaW50aW5nIHRvIFwiYWJjXCIiLCBzdHJpbmcoc3MyLnN0cigpKSk7CisKKyAgY29uc3QgY2hhciogczMgPSBOVUxMOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMzsKKyAgVW5pdmVyc2FsUHJpbnQoczMsICZzczMpOworICBFWFBFQ1RfRVEoIk5VTEwiLCBzczMuc3RyKCkpOworfQorCitURVNUKFVuaXZlcnNhbFByaW50VGVzdCwgV29ya3NGb3JDaGFyQXJyYXkpIHsKKyAgY29uc3QgY2hhciBzdHJbXSA9ICJcIkxpbmVcMCAxXCJcbkxpbmUgMiI7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MxOworICBVbml2ZXJzYWxQcmludChzdHIsICZzczEpOworICBFWFBFQ1RfRVEoIlwiXFxcIkxpbmVcXDAgMVxcXCJcXG5MaW5lIDJcIiIsIHNzMS5zdHIoKSk7CisKKyAgY29uc3QgY2hhciBtdXRhYmxlX3N0cltdID0gIlwiTGluZVwwIDFcIlxuTGluZSAyIjsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczI7CisgIFVuaXZlcnNhbFByaW50KG11dGFibGVfc3RyLCAmc3MyKTsKKyAgRVhQRUNUX0VRKCJcIlxcXCJMaW5lXFwwIDFcXFwiXFxuTGluZSAyXCIiLCBzczIuc3RyKCkpOworfQorCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nc1Rlc3QsIFByaW50c0VtcHR5VHVwbGUpIHsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MobWFrZV90dXBsZSgpKTsKKyAgRVhQRUNUX0VRKDB1LCByZXN1bHQuc2l6ZSgpKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0LCBQcmludHNPbmVUdXBsZSkgeworICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhtYWtlX3R1cGxlKDEpKTsKKyAgQVNTRVJUX0VRKDF1LCByZXN1bHQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCIxIiwgcmVzdWx0WzBdKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0LCBQcmludHNUd29UdXBsZSkgeworICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhtYWtlX3R1cGxlKDEsICdhJykpOworICBBU1NFUlRfRVEoMnUsIHJlc3VsdC5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCByZXN1bHRbMF0pOworICBFWFBFQ1RfRVEoIidhJyAoOTcsIDB4NjEpIiwgcmVzdWx0WzFdKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0LCBQcmludHNUZXJzZWx5KSB7CisgIGNvbnN0IGludCBuID0gMTsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCisgICAgICB0dXBsZTxjb25zdCBpbnQmLCBjb25zdCBjaGFyKj4obiwgImEiKSk7CisgIEFTU0VSVF9FUSgydSwgcmVzdWx0LnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7CisgIEVYUEVDVF9FUSgiXCJhXCIiLCByZXN1bHRbMV0pOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X3ByaW50ZXJzX3Rlc3QKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4YmE5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC10ZXN0LXBhcnRfdGVzdC5jYwpAQCAtMCwwICsxLDIwOCBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBtaGV1bGVAZ29vZ2xlLmNvbSAoTWFya3VzIEhldWxlKQorLy8KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OlRlc3Q7Cit1c2luZyB0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXk7CisKK25hbWVzcGFjZSB7CisKKy8vIFRlc3RzIHRoZSBUZXN0UGFydFJlc3VsdCBjbGFzcy4KKworLy8gVGhlIHRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBUZXN0UGFydFJlc3VsdC4KK2NsYXNzIFRlc3RQYXJ0UmVzdWx0VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFRlc3RQYXJ0UmVzdWx0VGVzdCgpCisgICAgICA6IHIxXyhUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MsICJmb28vYmFyLmNjIiwgMTAsICJTdWNjZXNzISIpLAorICAgICAgICByMl8oVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsICJmb28vYmFyLmNjIiwgLTEsICJGYWlsdXJlISIpLAorICAgICAgICByM18oVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIE5VTEwsIC0xLCAiRmFpbHVyZSEiKSB7fQorCisgIFRlc3RQYXJ0UmVzdWx0IHIxXywgcjJfLCByM187Cit9OworCisKK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIENvbnN0cnVjdG9yV29ya3MpIHsKKyAgTWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlIDw8ICJzb21ldGhpbmcgaXMgdGVycmlibHkgd3JvbmciOworICBtZXNzYWdlIDw8IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPih0ZXN0aW5nOjppbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIpOworICBtZXNzYWdlIDw8ICJzb21lIHVuaW1wb3J0YW50IHN0YWNrIHRyYWNlIjsKKworICBjb25zdCBUZXN0UGFydFJlc3VsdCByZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29tZV9maWxlLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIHJlc3VsdC50eXBlKCkpOworICBFWFBFQ1RfU1RSRVEoInNvbWVfZmlsZS5jYyIsIHJlc3VsdC5maWxlX25hbWUoKSk7CisgIEVYUEVDVF9FUSg0MiwgcmVzdWx0LmxpbmVfbnVtYmVyKCkpOworICBFWFBFQ1RfU1RSRVEobWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpLCByZXN1bHQubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJzb21ldGhpbmcgaXMgdGVycmlibHkgd3JvbmciLCByZXN1bHQuc3VtbWFyeSgpKTsKK30KKworVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgUmVzdWx0QWNjZXNzb3JzV29yaykgeworICBjb25zdCBUZXN0UGFydFJlc3VsdCBzdWNjZXNzKFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiKTsKKyAgRVhQRUNUX1RSVUUoc3VjY2Vzcy5wYXNzZWQoKSk7CisgIEVYUEVDVF9GQUxTRShzdWNjZXNzLmZhaWxlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3Mubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShzdWNjZXNzLmZhdGFsbHlfZmFpbGVkKCkpOworCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IG5vbmZhdGFsX2ZhaWx1cmUoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIik7CisgIEVYUEVDVF9GQUxTRShub25mYXRhbF9mYWlsdXJlLnBhc3NlZCgpKTsKKyAgRVhQRUNUX1RSVUUobm9uZmF0YWxfZmFpbHVyZS5mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKG5vbmZhdGFsX2ZhaWx1cmUubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShub25mYXRhbF9mYWlsdXJlLmZhdGFsbHlfZmFpbGVkKCkpOworCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IGZhdGFsX2ZhaWx1cmUoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIik7CisgIEVYUEVDVF9GQUxTRShmYXRhbF9mYWlsdXJlLnBhc3NlZCgpKTsKKyAgRVhQRUNUX1RSVUUoZmF0YWxfZmFpbHVyZS5mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShmYXRhbF9mYWlsdXJlLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShmYXRhbF9mYWlsdXJlLmZhdGFsbHlfZmFpbGVkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6dHlwZSgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgdHlwZSkgeworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLCByMV8udHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCByMl8udHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCByM18udHlwZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OmZpbGVfbmFtZSgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgZmlsZV9uYW1lKSB7CisgIEVYUEVDVF9TVFJFUSgiZm9vL2Jhci5jYyIsIHIxXy5maWxlX25hbWUoKSk7CisgIEVYUEVDVF9TVFJFUShOVUxMLCByM18uZmlsZV9uYW1lKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6bGluZV9udW1iZXIoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIGxpbmVfbnVtYmVyKSB7CisgIEVYUEVDVF9FUSgxMCwgcjFfLmxpbmVfbnVtYmVyKCkpOworICBFWFBFQ1RfRVEoLTEsIHIyXy5saW5lX251bWJlcigpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6Om1lc3NhZ2UoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX1NUUkVRKCJTdWNjZXNzISIsIHIxXy5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6cGFzc2VkKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBQYXNzZWQpIHsKKyAgRVhQRUNUX1RSVUUocjFfLnBhc3NlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHIyXy5wYXNzZWQoKSk7CisgIEVYUEVDVF9GQUxTRShyM18ucGFzc2VkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6ZmFpbGVkKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBGYWlsZWQpIHsKKyAgRVhQRUNUX0ZBTFNFKHIxXy5mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHIyXy5mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHIzXy5mYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpmYXRhbGx5X2ZhaWxlZCgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgRmF0YWxseUZhaWxlZCkgeworICBFWFBFQ1RfRkFMU0UocjFfLmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfRkFMU0UocjJfLmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShyM18uZmF0YWxseV9mYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0Ojpub25mYXRhbGx5X2ZhaWxlZCgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgTm9uZmF0YWxseUZhaWxlZCkgeworICBFWFBFQ1RfRkFMU0UocjFfLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShyMl8ubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShyM18ubm9uZmF0YWxseV9mYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBUZXN0UGFydFJlc3VsdEFycmF5IGNsYXNzLgorCitjbGFzcyBUZXN0UGFydFJlc3VsdEFycmF5VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0KCkKKyAgICAgIDogcjFfKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCAiZm9vL2Jhci5jYyIsIC0xLCAiRmFpbHVyZSAxIiksCisgICAgICAgIHIyXyhUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgImZvby9iYXIuY2MiLCAtMSwgIkZhaWx1cmUgMiIpIHt9CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgcjFfLCByMl87Cit9OworCisvLyBUZXN0cyB0aGF0IFRlc3RQYXJ0UmVzdWx0QXJyYXkgaW5pdGlhbGx5IGhhcyBzaXplIDAuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QsIEluaXRpYWxTaXplSXNaZXJvKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgRVhQRUNUX0VRKDAsIHJlc3VsdHMuc2l6ZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIHRoZSBnaXZlbiBUZXN0UGFydFJlc3VsdAorLy8gYWZ0ZXIgb25lIEFwcGVuZCgpIG9wZXJhdGlvbi4KK1RFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5VGVzdCwgQ29udGFpbnNHaXZlblJlc3VsdEFmdGVyQXBwZW5kKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgcmVzdWx0cy5BcHBlbmQocjFfKTsKKyAgRVhQRUNUX0VRKDEsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJGYWlsdXJlIDEiLCByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyB0aGUgZ2l2ZW4gVGVzdFBhcnRSZXN1bHRzCisvLyBhZnRlciB0d28gQXBwZW5kKCkgb3BlcmF0aW9ucy4KK1RFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5VGVzdCwgQ29udGFpbnNHaXZlblJlc3VsdHNBZnRlclR3b0FwcGVuZHMpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOworICByZXN1bHRzLkFwcGVuZChyMV8pOworICByZXN1bHRzLkFwcGVuZChyMl8pOworICBFWFBFQ1RfRVEoMiwgcmVzdWx0cy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIkZhaWx1cmUgMSIsIHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJGYWlsdXJlIDIiLCByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLm1lc3NhZ2UoKSk7Cit9CisKK3R5cGVkZWYgVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QgVGVzdFBhcnRSZXN1bHRBcnJheURlYXRoVGVzdDsKKworLy8gVGVzdHMgdGhhdCB0aGUgcHJvZ3JhbSBkaWVzIHdoZW4gR2V0VGVzdFBhcnRSZXN1bHQoKSBpcyBjYWxsZWQgd2l0aAorLy8gYW4gaW52YWxpZCBpbmRleC4KK1RFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5RGVhdGhUZXN0LCBEaWVzV2hlbkluZGV4SXNPdXRPZkJvdW5kKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgcmVzdWx0cy5BcHBlbmQocjFfKTsKKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoLTEpLCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKSwgIiIpOworfQorCisvLyBUT0RPKG1oZXVsZUBnb29nbGUuY29tKTogQWRkIGEgdGVzdCBmb3IgdGhlIGNsYXNzIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlci4KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWEzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYwpAQCAtMCwwICsxLDMyMCBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCit1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7Cit1c2luZyA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlOwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGU7Cit1c2luZyA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50OwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTsKK3VzaW5nIDo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOworCisvLyBUZXN0cyB0aGF0IHR1cGxlX2VsZW1lbnQ8SywgdHVwbGU8VDAsIFQxLCAuLi4sIFROPiA+Ojp0eXBlIHJldHVybnMgVEsuCitURVNUKHR1cGxlX2VsZW1lbnRfVGVzdCwgUmV0dXJuc0VsZW1lbnRUeXBlKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIHR1cGxlX2VsZW1lbnQ8MCwgdHVwbGU8aW50LCBjaGFyPiA+Ojp0eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50JiwgdHVwbGVfZWxlbWVudDwxLCB0dXBsZTxkb3VibGUsIGludCY+ID46OnR5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxib29sLCB0dXBsZV9lbGVtZW50PDIsIHR1cGxlPGRvdWJsZSwgaW50LCBib29sPiA+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyB0aGF0IHR1cGxlX3NpemU8VD46OnZhbHVlIGdpdmVzIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlCisvLyB0eXBlIFQuCitURVNUKHR1cGxlX3NpemVfVGVzdCwgUmV0dXJuc051bWJlck9mRmllbGRzKSB7CisgIEVYUEVDVF9FUSgwLCArdHVwbGVfc2l6ZTx0dXBsZTw+ID46OnZhbHVlKTsKKyAgRVhQRUNUX0VRKDEsICt0dXBsZV9zaXplPHR1cGxlPHZvaWQqPiA+Ojp2YWx1ZSk7CisgIEVYUEVDVF9FUSgxLCArdHVwbGVfc2l6ZTx0dXBsZTxjaGFyPiA+Ojp2YWx1ZSk7CisgIEVYUEVDVF9FUSgxLCArKHR1cGxlX3NpemU8dHVwbGU8dHVwbGU8aW50LCBkb3VibGU+ID4gPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0VRKDIsICsodHVwbGVfc2l6ZTx0dXBsZTxpbnQmLCBjb25zdCBjaGFyPiA+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRVEoMywgKyh0dXBsZV9zaXplPHR1cGxlPGNoYXIqLCB2b2lkLCBjb25zdCBib29sJj4gPjo6dmFsdWUpKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIGEgdHVwbGUgd2l0aCBpdHNlbGYuCitURVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc1dpdGhTZWxmKSB7CisgIGNvbnN0IHR1cGxlPGludCwgY2hhciwgYm9vbD4gYSg1LCAnYScsIGZhbHNlKTsKKworICBFWFBFQ1RfVFJVRShhID09IGEpOworICBFWFBFQ1RfRkFMU0UoYSAhPSBhKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHR3byB0dXBsZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KK1RFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzRXF1YWxUdXBsZXMpIHsKKyAgY29uc3QgdHVwbGU8aW50LCBib29sPiBhKDUsIHRydWUpLCBiKDUsIHRydWUpOworCisgIEVYUEVDVF9UUlVFKGEgPT0gYik7CisgIEVYUEVDVF9GQUxTRShhICE9IGIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgdHdvIGRpZmZlcmVudCB0dXBsZXMgdGhhdCBoYXZlIG5vIHJlZmVyZW5jZSBmaWVsZHMuCitURVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc1VuZXF1YWxUdXBsZXNXaXRob3V0UmVmZXJlbmNlRmllbGRzKSB7CisgIHR5cGVkZWYgdHVwbGU8Y29uc3QgaW50LCBjaGFyPiBGb29UdXBsZTsKKworICBjb25zdCBGb29UdXBsZSBhKDAsICd4Jyk7CisgIGNvbnN0IEZvb1R1cGxlIGIoMSwgJ2EnKTsKKworICBFWFBFQ1RfVFJVRShhICE9IGIpOworICBFWFBFQ1RfRkFMU0UoYSA9PSBiKTsKKworICBjb25zdCBGb29UdXBsZSBjKDEsICdiJyk7CisKKyAgRVhQRUNUX1RSVUUoYiAhPSBjKTsKKyAgRVhQRUNUX0ZBTFNFKGIgPT0gYyk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB0d28gZGlmZmVyZW50IHR1cGxlcyB0aGF0IGhhdmUgcmVmZXJlbmNlIGZpZWxkcy4KK1RFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzVW5lcXVhbFR1cGxlc1dpdGhSZWZlcmVuY2VGaWVsZHMpIHsKKyAgdHlwZWRlZiB0dXBsZTxpbnQmLCBjb25zdCBjaGFyJj4gRm9vVHVwbGU7CisKKyAgaW50IGkgPSA1OworICBjb25zdCBjaGFyIGNoID0gJ2EnOworICBjb25zdCBGb29UdXBsZSBhKGksIGNoKTsKKworICBpbnQgaiA9IDY7CisgIGNvbnN0IEZvb1R1cGxlIGIoaiwgY2gpOworCisgIEVYUEVDVF9UUlVFKGEgIT0gYik7CisgIEVYUEVDVF9GQUxTRShhID09IGIpOworCisgIGogPSA1OworICBjb25zdCBjaGFyIGNoMiA9ICdiJzsKKyAgY29uc3QgRm9vVHVwbGUgYyhqLCBjaDIpOworCisgIEVYUEVDVF9UUlVFKGIgIT0gYyk7CisgIEVYUEVDVF9GQUxTRShiID09IGMpOworfQorCisvLyBUZXN0cyB0aGF0IGEgdHVwbGUgZmllbGQgd2l0aCBhIHJlZmVyZW5jZSB0eXBlIGlzIGFuIGFsaWFzIG9mIHRoZQorLy8gdmFyaWFibGUgaXQncyBzdXBwb3NlZCB0byByZWZlcmVuY2UuCitURVNUKFJlZmVyZW5jZUZpZWxkVGVzdCwgSXNBbGlhc09mUmVmZXJlbmNlZFZhcmlhYmxlKSB7CisgIGludCBuID0gMDsKKyAgdHVwbGU8Ym9vbCwgaW50Jj4gdCh0cnVlLCBuKTsKKworICBuID0gMTsKKyAgRVhQRUNUX0VRKG4sIGdldDwxPih0KSkKKyAgICAgIDw8ICJDaGFuZ2luZyBhIHVuZGVybHlpbmcgdmFyaWFibGUgc2hvdWxkIHVwZGF0ZSB0aGUgcmVmZXJlbmNlIGZpZWxkLiI7CisKKyAgLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nIGZ1bm55IHdpdGgKKyAgLy8gdGhlICYgb3BlcmF0b3IgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiBnZXQ8PigpLgorICBFWFBFQ1RfRVEoJm4sICYoZ2V0PDE+KHQpKSkKKyAgICAgIDw8ICJUaGUgYWRkcmVzcyBvZiBhIHJlZmVyZW5jZSBmaWVsZCBzaG91bGQgZXF1YWwgdGhlIGFkZHJlc3Mgb2YgIgorICAgICAgPDwgInRoZSB1bmRlcmx5aW5nIHZhcmlhYmxlLiI7CisKKyAgZ2V0PDE+KHQpID0gMjsKKyAgRVhQRUNUX0VRKDIsIG4pCisgICAgICA8PCAiQ2hhbmdpbmcgYSByZWZlcmVuY2UgZmllbGQgc2hvdWxkIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YXJpYWJsZS4iOworfQorCisvLyBUZXN0cyB0aGF0IHR1cGxlJ3MgZGVmYXVsdCBjb25zdHJ1Y3RvciBkZWZhdWx0IGluaXRpYWxpemVzIGVhY2ggZmllbGQuCisvLyBUaGlzIHRlc3QgbmVlZHMgdG8gY29tcGlsZSB3aXRob3V0IGdlbmVyYXRpbmcgd2FybmluZ3MuCitURVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3JEZWZhdWx0SW5pdGlhbGl6ZXNFYWNoRmllbGQpIHsKKyAgLy8gVGhlIFRSMSByZXBvcnQgcmVxdWlyZXMgdGhhdCB0dXBsZSdzIGRlZmF1bHQgY29uc3RydWN0b3IgZGVmYXVsdAorICAvLyBpbml0aWFsaXplcyBlYWNoIGZpZWxkLCBldmVuIGlmIGl0J3MgYSBwcmltaXRpdmUgdHlwZS4gIElmIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBmb3JnZXRzIHRvIGRvIHRoaXMsIHRoaXMgdGVzdCB3aWxsIGNhdGNoIGl0IGJ5CisgIC8vIGdlbmVyYXRpbmcgd2FybmluZ3MgYWJvdXQgdXNpbmcgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgKGFzc3VtaW5nCisgIC8vIGEgZGVjZW50IGNvbXBpbGVyKS4KKworICB0dXBsZTw+IGVtcHR5OworCisgIHR1cGxlPGludD4gYTEsIGIxOworICBiMSA9IGExOworICBFWFBFQ1RfRVEoMCwgZ2V0PDA+KGIxKSk7CisKKyAgdHVwbGU8aW50LCBkb3VibGU+IGEyLCBiMjsKKyAgYjIgPSBhMjsKKyAgRVhQRUNUX0VRKDAsIGdldDwwPihiMikpOworICBFWFBFQ1RfRVEoMC4wLCBnZXQ8MT4oYjIpKTsKKworICB0dXBsZTxkb3VibGUsIGNoYXIsIGJvb2wqPiBhMywgYjM7CisgIGIzID0gYTM7CisgIEVYUEVDVF9FUSgwLjAsIGdldDwwPihiMykpOworICBFWFBFQ1RfRVEoJ1wwJywgZ2V0PDE+KGIzKSk7CisgIEVYUEVDVF9UUlVFKGdldDwyPihiMykgPT0gTlVMTCk7CisKKyAgdHVwbGU8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBhMTAsIGIxMDsKKyAgYjEwID0gYTEwOworICBFWFBFQ1RfRVEoMCwgZ2V0PDA+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDE+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDI+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDM+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDQ+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDU+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDY+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDc+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDg+KGIxMCkpOworICBFWFBFQ1RfRVEoMCwgZ2V0PDk+KGIxMCkpOworfQorCisvLyBUZXN0cyBjb25zdHJ1Y3RpbmcgYSB0dXBsZSBmcm9tIGl0cyBmaWVsZHMuCitURVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBDb25zdHJ1Y3RzRnJvbUZpZWxkcykgeworICBpbnQgbiA9IDE7CisgIC8vIFJlZmVyZW5jZSBmaWVsZC4KKyAgdHVwbGU8aW50Jj4gYShuKTsKKyAgRVhQRUNUX0VRKCZuLCAmKGdldDwwPihhKSkpOworCisgIC8vIE5vbi1yZWZlcmVuY2UgZmllbGRzLgorICB0dXBsZTxpbnQsIGNoYXI+IGIoNSwgJ2EnKTsKKyAgRVhQRUNUX0VRKDUsIGdldDwwPihiKSk7CisgIEVYUEVDVF9FUSgnYScsIGdldDwxPihiKSk7CisKKyAgLy8gQ29uc3QgcmVmZXJlbmNlIGZpZWxkLgorICBjb25zdCBpbnQgbSA9IDI7CisgIHR1cGxlPGJvb2wsIGNvbnN0IGludCY+IGModHJ1ZSwgbSk7CisgIEVYUEVDVF9UUlVFKGdldDwwPihjKSk7CisgIEVYUEVDVF9FUSgmbSwgJihnZXQ8MT4oYykpKTsKK30KKworLy8gVGVzdHMgdHVwbGUncyBjb3B5IGNvbnN0cnVjdG9yLgorVEVTVChUdXBsZUNvbnN0cnVjdG9yVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIHR1cGxlPGRvdWJsZSwgYm9vbD4gYSgwLjAsIHRydWUpOworICB0dXBsZTxkb3VibGUsIGJvb2w+IGIoYSk7CisKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIGdldDwwPihiKSk7CisgIEVYUEVDVF9UUlVFKGdldDwxPihiKSk7Cit9CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBhIHR1cGxlIGZyb20gYW5vdGhlciB0dXBsZSB0aGF0IGhhcyBhIGNvbXBhdGlibGUKKy8vIGJ1dCBkaWZmZXJlbnQgdHlwZS4KK1RFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvbnN0cnVjdHNGcm9tRGlmZmVyZW50VHVwbGVUeXBlKSB7CisgIHR1cGxlPGludCwgaW50LCBjaGFyPiBhKDAsIDEsICdhJyk7CisgIHR1cGxlPGRvdWJsZSwgbG9uZywgaW50PiBiKGEpOworCisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCBnZXQ8MD4oYikpOworICBFWFBFQ1RfRVEoMSwgZ2V0PDE+KGIpKTsKKyAgRVhQRUNUX0VRKCdhJywgZ2V0PDI+KGIpKTsKK30KKworLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgMi10dXBsZSBmcm9tIGFuIHN0ZDo6cGFpci4KK1RFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvbnN0cnVjdHNGcm9tUGFpcikgeworICA6OnN0ZDo6cGFpcjxpbnQsIGNoYXI+IGEoMSwgJ2EnKTsKKyAgdHVwbGU8aW50LCBjaGFyPiBiKGEpOworICB0dXBsZTxpbnQsIGNvbnN0IGNoYXImPiBjKGEpOworfQorCisvLyBUZXN0cyBhc3NpZ25pbmcgYSB0dXBsZSB0byBhbm90aGVyIHR1cGxlIHdpdGggdGhlIHNhbWUgdHlwZS4KK1RFU1QoVHVwbGVBc3NpZ25tZW50VGVzdCwgQXNzaWduc1RvU2FtZVR1cGxlVHlwZSkgeworICBjb25zdCB0dXBsZTxpbnQsIGxvbmc+IGEoNSwgN0wpOworICB0dXBsZTxpbnQsIGxvbmc+IGI7CisgIGIgPSBhOworICBFWFBFQ1RfRVEoNSwgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX0VRKDdMLCBnZXQ8MT4oYikpOworfQorCisvLyBUZXN0cyBhc3NpZ25pbmcgYSB0dXBsZSB0byBhbm90aGVyIHR1cGxlIHdpdGggYSBkaWZmZXJlbnQgYnV0CisvLyBjb21wYXRpYmxlIHR5cGUuCitURVNUKFR1cGxlQXNzaWdubWVudFRlc3QsIEFzc2lnbnNUb0RpZmZlcmVudFR1cGxlVHlwZSkgeworICBjb25zdCB0dXBsZTxpbnQsIGxvbmcsIGJvb2w+IGEoMSwgN0wsIHRydWUpOworICB0dXBsZTxsb25nLCBpbnQsIGJvb2w+IGI7CisgIGIgPSBhOworICBFWFBFQ1RfRVEoMUwsIGdldDwwPihiKSk7CisgIEVYUEVDVF9FUSg3LCBnZXQ8MT4oYikpOworICBFWFBFQ1RfVFJVRShnZXQ8Mj4oYikpOworfQorCisvLyBUZXN0cyBhc3NpZ25pbmcgYW4gc3RkOjpwYWlyIHRvIGEgMi10dXBsZS4KK1RFU1QoVHVwbGVBc3NpZ25tZW50VGVzdCwgQXNzaWduc0Zyb21QYWlyKSB7CisgIGNvbnN0IDo6c3RkOjpwYWlyPGludCwgYm9vbD4gYSg1LCB0cnVlKTsKKyAgdHVwbGU8aW50LCBib29sPiBiOworICBiID0gYTsKKyAgRVhQRUNUX0VRKDUsIGdldDwwPihiKSk7CisgIEVYUEVDVF9UUlVFKGdldDwxPihiKSk7CisKKyAgdHVwbGU8bG9uZywgYm9vbD4gYzsKKyAgYyA9IGE7CisgIEVYUEVDVF9FUSg1TCwgZ2V0PDA+KGMpKTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDE+KGMpKTsKK30KKworLy8gQSBmaXh0dXJlIGZvciB0ZXN0aW5nIGJpZyB0dXBsZXMuCitjbGFzcyBCaWdUdXBsZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB0eXBlZGVmIHR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludD4gQmlnVHVwbGU7CisKKyAgQmlnVHVwbGVUZXN0KCkgOgorICAgICAgYV8oMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiksCisgICAgICBiXygxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzKSB7fQorCisgIEJpZ1R1cGxlIGFfLCBiXzsKK307CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBiaWcgdHVwbGVzLgorVEVTVF9GKEJpZ1R1cGxlVGVzdCwgQ29uc3RydWN0aW9uKSB7CisgIEJpZ1R1cGxlIGE7CisgIEJpZ1R1cGxlIGIoYl8pOworfQorCisvLyBUZXN0cyB0aGF0IGdldDxOPih0KSByZXR1cm5zIHRoZSBOLXRoICgwLWJhc2VkKSBmaWVsZCBvZiB0dXBsZSB0LgorVEVTVF9GKEJpZ1R1cGxlVGVzdCwgZ2V0KSB7CisgIEVYUEVDVF9FUSgxLCBnZXQ8MD4oYV8pKTsKKyAgRVhQRUNUX0VRKDIsIGdldDw5PihhXykpOworCisgIC8vIFRlc3RzIHRoYXQgZ2V0KCkgd29ya3Mgb24gYSBjb25zdCB0dXBsZSB0b28uCisgIGNvbnN0IEJpZ1R1cGxlIGEoYV8pOworICBFWFBFQ1RfRVEoMSwgZ2V0PDA+KGEpKTsKKyAgRVhQRUNUX0VRKDIsIGdldDw5PihhKSk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBiaWcgdHVwbGVzLgorVEVTVF9GKEJpZ1R1cGxlVGVzdCwgQ29tcGFyaXNvbnMpIHsKKyAgRVhQRUNUX1RSVUUoYV8gPT0gYV8pOworICBFWFBFQ1RfRkFMU0UoYV8gIT0gYV8pOworCisgIEVYUEVDVF9UUlVFKGFfICE9IGJfKTsKKyAgRVhQRUNUX0ZBTFNFKGFfID09IGJfKTsKK30KKworVEVTVChNYWtlVHVwbGVUZXN0LCBXb3Jrc0ZvclNjYWxhclR5cGVzKSB7CisgIHR1cGxlPGJvb2wsIGludD4gYTsKKyAgYSA9IG1ha2VfdHVwbGUodHJ1ZSwgNSk7CisgIEVYUEVDVF9UUlVFKGdldDwwPihhKSk7CisgIEVYUEVDVF9FUSg1LCBnZXQ8MT4oYSkpOworCisgIHR1cGxlPGNoYXIsIGludCwgbG9uZz4gYjsKKyAgYiA9IG1ha2VfdHVwbGUoJ2EnLCAnYicsIDUpOworICBFWFBFQ1RfRVEoJ2EnLCBnZXQ8MD4oYikpOworICBFWFBFQ1RfRVEoJ2InLCBnZXQ8MT4oYikpOworICBFWFBFQ1RfRVEoNSwgZ2V0PDI+KGIpKTsKK30KKworVEVTVChNYWtlVHVwbGVUZXN0LCBXb3Jrc0ZvclBvaW50ZXJzKSB7CisgIGludCBhW10gPSB7IDEsIDIsIDMsIDQgfTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gImhpIjsKKyAgaW50KiBjb25zdCBwID0gYTsKKworICB0dXBsZTxjb25zdCBjaGFyKiwgaW50Kj4gdDsKKyAgdCA9IG1ha2VfdHVwbGUoc3RyLCBwKTsKKyAgRVhQRUNUX0VRKHN0ciwgZ2V0PDA+KHQpKTsKKyAgRVhQRUNUX0VRKHAsIGdldDwxPih0KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg0NzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBUZXN0cyB0aGF0IHRoZSBzYW1lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlCisvLyBpbnN0YW50aWF0ZWQgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KKy8vIChDb250YWluZXJUZXN0IGlzIGFsc28gaW5zdGFudGlhdGVkIGluIGd0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYy4pCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChWZWN0b3IsIENvbnRhaW5lclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpUeXBlczxzdGQ6OnZlY3RvcjxpbnQ+ID4pOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGJhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjCkBAIC0wLDAgKzEsMzYwIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyB0ZXN0aW5nOjpUZXN0OworCisvLyBVc2VkIGZvciB0ZXN0aW5nIHRoYXQgU2V0VXBUZXN0Q2FzZSgpL1RlYXJEb3duVGVzdENhc2UoKSwgZml4dHVyZQorLy8gY3Rvci9kdG9yLCBhbmQgU2V0VXAoKS9UZWFyRG93bigpIHdvcmsgY29ycmVjdGx5IGluIHR5cGVkIHRlc3RzIGFuZAorLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIENvbW1vblRlc3QgOiBwdWJsaWMgVGVzdCB7CisgIC8vIEZvciBzb21lIHRlY2huaWNhbCByZWFzb24sIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpCisgIC8vIG11c3QgYmUgcHVibGljLgorIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBzaGFyZWRfID0gbmV3IFQoNSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGRlbGV0ZSBzaGFyZWRfOworICAgIHNoYXJlZF8gPSBOVUxMOworICB9CisKKyAgLy8gVGhpcyAncHJvdGVjdGVkOicgaXMgb3B0aW9uYWwuICBUaGVyZSdzIG5vIGhhcm0gaW4gbWFraW5nIGFsbAorICAvLyBtZW1iZXJzIG9mIHRoaXMgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBwdWJsaWMuCisgcHJvdGVjdGVkOgorICAvLyBXZSB1c2VkIHRvIHVzZSBzdGQ6Omxpc3QgaGVyZSwgYnV0IHN3aXRjaGVkIHRvIHN0ZDo6dmVjdG9yIHNpbmNlCisgIC8vIE1TVkMncyA8bGlzdD4gZG9lc24ndCBjb21waWxlIGNsZWFubHkgd2l0aCAvVzQuCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VD4gVmVjdG9yOworICB0eXBlZGVmIHN0ZDo6c2V0PGludD4gSW50U2V0OworCisgIENvbW1vblRlc3QoKSA6IHZhbHVlXygxKSB7fQorCisgIHZpcnR1YWwgfkNvbW1vblRlc3QoKSB7IEVYUEVDVF9FUSgzLCB2YWx1ZV8pOyB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEVYUEVDVF9FUSgxLCB2YWx1ZV8pOworICAgIHZhbHVlXysrOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEVYUEVDVF9FUSgyLCB2YWx1ZV8pOworICAgIHZhbHVlXysrOworICB9CisKKyAgVCB2YWx1ZV87CisgIHN0YXRpYyBUKiBzaGFyZWRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBDb21tb25UZXN0PFQ+OjpzaGFyZWRfID0gTlVMTDsKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdHlwZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordXNpbmcgdGVzdGluZzo6VHlwZXM7CisKKy8vIFRlc3RzIHRoYXQgU2V0VXBUZXN0Q2FzZSgpL1RlYXJEb3duVGVzdENhc2UoKSwgZml4dHVyZSBjdG9yL2R0b3IsCisvLyBhbmQgU2V0VXAoKS9UZWFyRG93bigpIHdvcmsgY29ycmVjdGx5IGluIHR5cGVkIHRlc3RzCisKK3R5cGVkZWYgVHlwZXM8Y2hhciwgaW50PiBUd29UeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShDb21tb25UZXN0LCBUd29UeXBlcyk7CisKK1RZUEVEX1RFU1QoQ29tbW9uVGVzdCwgVmFsdWVzQXJlQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYmUgdmlzaXRlZCB2aWEKKyAgLy8gdGhlIFRlc3RGaXh0dXJlOjogcHJlZml4LgorICBFWFBFQ1RfRVEoNSwgKlRlc3RGaXh0dXJlOjpzaGFyZWRfKTsKKworICAvLyBUeXBlZGVmcyBpbiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYmUgdmlzaXRlZCB2aWEgdGhlCisgIC8vICJ0eXBlbmFtZSBUZXN0Rml4dHVyZTo6IiBwcmVmaXguCisgIHR5cGVuYW1lIFRlc3RGaXh0dXJlOjpWZWN0b3IgZW1wdHk7CisgIEVYUEVDVF9FUSgwVSwgZW1wdHkuc2l6ZSgpKTsKKworICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6SW50U2V0IGVtcHR5MjsKKyAgRVhQRUNUX0VRKDBVLCBlbXB0eTIuc2l6ZSgpKTsKKworICAvLyBOb24tc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgbXVzdCBiZSB2aXNpdGVkIHZpYQorICAvLyAndGhpcycsIGFzIHJlcXVpcmVkIGJ5IEMrKyBmb3IgY2xhc3MgdGVtcGxhdGVzLgorICBFWFBFQ1RfRVEoMiwgdGhpcy0+dmFsdWVfKTsKK30KKworLy8gVGhlIHNlY29uZCB0ZXN0IG1ha2VzIHN1cmUgc2hhcmVkXyBpcyBub3QgZGVsZXRlZCBhZnRlciB0aGUgZmlyc3QKKy8vIHRlc3QuCitUWVBFRF9URVNUKENvbW1vblRlc3QsIFZhbHVlc0FyZVN0aWxsQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYWxzbyBiZSB2aXNpdGVkCisgIC8vIHZpYSAndGhpcycuCisgIEFTU0VSVF9UUlVFKHRoaXMtPnNoYXJlZF8gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSg1LCAqdGhpcy0+c2hhcmVkXyk7CisKKyAgLy8gVHlwZVBhcmFtIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PFR5cGVQYXJhbT4oMiksIHRoaXMtPnZhbHVlXyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbXVsdGlwbGUgVFlQRURfVEVTVF9DQVNFJ3MgY2FuIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUKKy8vIHRyYW5zbGF0aW9uIHVuaXQuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0MSA6IHB1YmxpYyBUZXN0IHsKK307CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBUWVBFRF9URVNUX0NBU0UgY2FuIGJlIGEKKy8vIHNpbmdsZSB0eXBlLgorVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdDEsIGludCk7CitUWVBFRF9URVNUKFR5cGVkVGVzdDEsIEEpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0MiA6IHB1YmxpYyBUZXN0IHsKK307CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBUWVBFRF9URVNUX0NBU0UgY2FuIGJlIGEKKy8vIFR5cGVzPC4uLj4gdHlwZSBsaXN0LgorVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdDIsIFR5cGVzPGludD4pOworCisvLyBUaGlzIGFsc28gdmVyaWZpZXMgdGhhdCB0ZXN0cyBmcm9tIGRpZmZlcmVudCB0eXBlZCB0ZXN0IGNhc2VzIGNhbgorLy8gc2hhcmUgdGhlIHNhbWUgbmFtZS4KK1RZUEVEX1RFU1QoVHlwZWRUZXN0MiwgQSkge30KKworLy8gVGVzdHMgdGhhdCBhIHR5cGVkIHRlc3QgY2FzZSBjYW4gYmUgZGVmaW5lZCBpbiBhIG5hbWVzcGFjZS4KKworbmFtZXNwYWNlIGxpYnJhcnkxIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBOdW1lcmljVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK3R5cGVkZWYgVHlwZXM8aW50LCBsb25nPiBOdW1lcmljVHlwZXM7CitUWVBFRF9URVNUX0NBU0UoTnVtZXJpY1Rlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoTnVtZXJpY1Rlc3QsIERlZmF1bHRJc1plcm8pIHsKKyAgRVhQRUNUX0VRKDAsIFR5cGVQYXJhbSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGxpYnJhcnkxCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKwordXNpbmcgdGVzdGluZzo6VHlwZXM7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZWRUZXN0Q2FzZVBTdGF0ZTsKKworLy8gVGVzdHMgVHlwZWRUZXN0Q2FzZVBTdGF0ZS4KKworY2xhc3MgVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAwLCAiRm9vVGVzdCIsICJBIik7CisgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAwLCAiRm9vVGVzdCIsICJCIik7CisgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAwLCAiRm9vVGVzdCIsICJDIik7CisgIH0KKworICBUeXBlZFRlc3RDYXNlUFN0YXRlIHN0YXRlXzsKK307CisKK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlVGVzdCwgU3VjY2VlZHNGb3JNYXRjaGluZ0xpc3QpIHsKKyAgY29uc3QgY2hhciogdGVzdHMgPSAiQSwgQiwgQyI7CisgIEVYUEVDVF9FUSh0ZXN0cywKKyAgICAgICAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCB0ZXN0cykpOworfQorCisvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSB0ZXN0cyBhbmQgc3BhY2VzIGFyb3VuZCB0aGUgbmFtZXMKKy8vIGRvbid0IG1hdHRlci4KK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlVGVzdCwgSWdub3Jlc09yZGVyQW5kU3BhY2VzKSB7CisgIGNvbnN0IGNoYXIqIHRlc3RzID0gIkEsQywgICBCIjsKKyAgRVhQRUNUX0VRKHRlc3RzLAorICAgICAgICAgICAgc3RhdGVfLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoImZvby5jYyIsIDEsIHRlc3RzKSk7Cit9CisKK3R5cGVkZWYgVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QgVHlwZWRUZXN0Q2FzZVBTdGF0ZURlYXRoVGVzdDsKKworVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNEdXBsaWNhdGVzKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEIsIEEsIEMiKSwKKyAgICAgICJmb29cXC5jYy4xLj86IFRlc3QgQSBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2VcXC4iKTsKK30KKworVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNFeHRyYVRlc3QpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCAiQSwgQiwgQywgRCIpLAorICAgICAgImZvb1xcLmNjLjEuPzogTm8gdGVzdCBuYW1lZCBEIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHRlc3QgY2FzZVxcLiIpOworfQorCitURVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZURlYXRoVGVzdCwgRGV0ZWN0c01pc3NlZFRlc3QpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCAiQSwgQyIpLAorICAgICAgImZvb1xcLmNjLjEuPzogWW91IGZvcmdvdCB0byBsaXN0IHRlc3QgQlxcLiIpOworfQorCisvLyBUZXN0cyB0aGF0IGRlZmluaW5nIGEgdGVzdCBmb3IgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBnZW5lcmF0ZXMKKy8vIGEgcnVuLXRpbWUgZXJyb3IgaWYgdGhlIHRlc3QgY2FzZSBoYXMgYmVlbiByZWdpc3RlcmVkLgorVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNUZXN0QWZ0ZXJSZWdpc3RyYXRpb24pIHsKKyAgc3RhdGVfLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoImZvby5jYyIsIDEsICJBLCBCLCBDIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uQWRkVGVzdE5hbWUoImZvby5jYyIsIDIsICJGb29UZXN0IiwgIkQiKSwKKyAgICAgICJmb29cXC5jYy4yLj86IFRlc3QgRCBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QIgorICAgICAgIlxcKEZvb1Rlc3QsIFxcLlxcLlxcLlxcKVxcLiIpOworfQorCisvLyBUZXN0cyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUgY3Rvci9kdG9yLAorLy8gYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRGVyaXZlZFRlc3QgOiBwdWJsaWMgQ29tbW9uVGVzdDxUPiB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChEZXJpdmVkVGVzdCk7CisKK1RZUEVEX1RFU1RfUChEZXJpdmVkVGVzdCwgVmFsdWVzQXJlQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYmUgdmlzaXRlZCB2aWEKKyAgLy8gdGhlIFRlc3RGaXh0dXJlOjogcHJlZml4LgorICBFWFBFQ1RfRVEoNSwgKlRlc3RGaXh0dXJlOjpzaGFyZWRfKTsKKworICAvLyBOb24tc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgbXVzdCBiZSB2aXNpdGVkIHZpYQorICAvLyAndGhpcycsIGFzIHJlcXVpcmVkIGJ5IEMrKyBmb3IgY2xhc3MgdGVtcGxhdGVzLgorICBFWFBFQ1RfRVEoMiwgdGhpcy0+dmFsdWVfKTsKK30KKworLy8gVGhlIHNlY29uZCB0ZXN0IG1ha2VzIHN1cmUgc2hhcmVkXyBpcyBub3QgZGVsZXRlZCBhZnRlciB0aGUgZmlyc3QKKy8vIHRlc3QuCitUWVBFRF9URVNUX1AoRGVyaXZlZFRlc3QsIFZhbHVlc0FyZVN0aWxsQ29ycmVjdCkgeworICAvLyBTdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSBjYW4gYWxzbyBiZSB2aXNpdGVkCisgIC8vIHZpYSAndGhpcycuCisgIEFTU0VSVF9UUlVFKHRoaXMtPnNoYXJlZF8gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSg1LCAqdGhpcy0+c2hhcmVkXyk7CisgIEVYUEVDVF9FUSgyLCB0aGlzLT52YWx1ZV8pOworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChEZXJpdmVkVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0FyZUNvcnJlY3QsIFZhbHVlc0FyZVN0aWxsQ29ycmVjdCk7CisKK3R5cGVkZWYgVHlwZXM8c2hvcnQsIGxvbmc+IE15VHdvVHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRGVyaXZlZFRlc3QsIE15VHdvVHlwZXMpOworCisvLyBUZXN0cyB0aGF0IG11bHRpcGxlIFRZUEVEX1RFU1RfQ0FTRV9QJ3MgY2FuIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUKKy8vIHRyYW5zbGF0aW9uIHVuaXQuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0UDEgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMSk7CisKKy8vIEZvciB0ZXN0aW5nIHRoYXQgdGhlIGNvZGUgYmV0d2VlbiBUWVBFRF9URVNUX0NBU0VfUCgpIGFuZAorLy8gVFlQRURfVEVTVF9QKCkgaXMgbm90IGVuY2xvc2VkIGluIGEgbmFtZXNwYWNlLgordHlwZWRlZiBpbnQgSW50QWZ0ZXJUeXBlZFRlc3RDYXNlUDsKKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAxLCBBKSB7fQorVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAxLCBCKSB7fQorCisvLyBGb3IgdGVzdGluZyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9QKCkgYW5kCisvLyBSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCgpIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG5hbWVzcGFjZS4KK3R5cGVkZWYgaW50IEludEJlZm9yZVJlZ2lzdGVyVHlwZWRUZXN0Q2FzZVA7CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFAxLCBBLCBCKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlZFRlc3RQMiA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFAyKTsKKworLy8gVGhpcyBhbHNvIHZlcmlmaWVzIHRoYXQgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdHlwZS1wYXJhbWV0ZXJpemVkCisvLyB0ZXN0IGNhc2VzIGNhbiBzaGFyZSB0aGUgc2FtZSBuYW1lLgorVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAyLCBBKSB7fQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMiwgQSk7CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvZGUgYmV0d2VlbiBUWVBFRF9URVNUX0NBU0VfUCgpIGFuZAorLy8gUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoKSBpcyBub3QgZW5jbG9zZWQgaW4gYSBuYW1lc3BhY2UuCitJbnRBZnRlclR5cGVkVGVzdENhc2VQIGFmdGVyID0gMDsKK0ludEJlZm9yZVJlZ2lzdGVyVHlwZWRUZXN0Q2FzZVAgYmVmb3JlID0gMDsKKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgbGFzdCBhcmd1bWVudCBvZiBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUCgpCisvLyBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHR5cGUgb3IgYSBUeXBlczwuLi4+IHR5cGUgbGlzdC4KK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKEludCwgVHlwZWRUZXN0UDEsIGludCk7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChJbnQsIFR5cGVkVGVzdFAyLCBUeXBlczxpbnQ+KTsKKworLy8gVGVzdHMgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHRyYW5zbGF0aW9uIHVuaXQuCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChEb3VibGUsIFR5cGVkVGVzdFAyLCBUeXBlczxkb3VibGU+KTsKKworLy8gVGVzdHMgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCisvLyAoQ29udGFpbmVyVGVzdCBpcyBhbHNvIGluc3RhbnRpYXRlZCBpbiBndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MuKQordHlwZWRlZiBUeXBlczxzdGQ6OnZlY3Rvcjxkb3VibGU+LCBzdGQ6OnNldDxjaGFyPiA+IE15Q29udGFpbmVyczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBDb250YWluZXJUZXN0LCBNeUNvbnRhaW5lcnMpOworCisvLyBUZXN0cyB0aGF0IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgZGVmaW5lZCBhbmQKKy8vIGluc3RhbnRpYXRlZCBpbiBhIG5hbWVzcGFjZS4KKworbmFtZXNwYWNlIGxpYnJhcnkyIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBOdW1lcmljVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKE51bWVyaWNUZXN0KTsKKworVFlQRURfVEVTVF9QKE51bWVyaWNUZXN0LCBEZWZhdWx0SXNaZXJvKSB7CisgIEVYUEVDVF9FUSgwLCBUeXBlUGFyYW0oKSk7Cit9CisKK1RZUEVEX1RFU1RfUChOdW1lcmljVGVzdCwgWmVyb0lzTGVzc1RoYW5PbmUpIHsKKyAgRVhQRUNUX0xUKFR5cGVQYXJhbSgwKSwgVHlwZVBhcmFtKDEpKTsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoTnVtZXJpY1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0SXNaZXJvLCBaZXJvSXNMZXNzVGhhbk9uZSk7Cit0eXBlZGVmIFR5cGVzPGludCwgZG91YmxlPiBOdW1lcmljVHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgTnVtZXJpY1Rlc3QsIE51bWVyaWNUeXBlcyk7CisKK30gIC8vIG5hbWVzcGFjZSBsaWJyYXJ5MgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2lmICFkZWZpbmVkKEdURVNUX0hBU19UWVBFRF9URVNUKSAmJiAhZGVmaW5lZChHVEVTVF9IQVNfVFlQRURfVEVTVF9QKQorCisvLyBHb29nbGUgVGVzdCBtYXkgbm90IHN1cHBvcnQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggc29tZQorLy8gY29tcGlsZXJzLiBJZiB3ZSB1c2UgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gY29tcGlsZSBvdXQgYWxsCisvLyBjb2RlIHJlZmVycmluZyB0byB0aGUgZ3Rlc3RfbWFpbiBsaWJyYXJ5LCBNU1ZDIGxpbmtlciB3aWxsIG5vdCBsaW5rCisvLyB0aGF0IGxpYnJhcnkgYXQgYWxsIGFuZCBjb25zZXF1ZW50bHkgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBlbnRyeQorLy8gcG9pbnQgZGVmaW5lZCBpbiB0aGF0IGxpYnJhcnkgKGZhdGFsIGVycm9yIExOSzE1NjE6IGVudHJ5IHBvaW50CisvLyBtdXN0IGJlIGRlZmluZWQpLiBUaGlzIGR1bW15IHRlc3Qga2VlcHMgZ3Rlc3RfbWFpbiBsaW5rZWQgaW4uCitURVNUKER1bW15VGVzdCwgVHlwZWRUZXN0c0FyZU5vdFN1cHBvcnRlZE9uVGhpc1BsYXRmb3JtKSB7fQorCisjZW5kaWYgIC8vICNpZiAhZGVmaW5lZChHVEVTVF9IQVNfVFlQRURfVEVTVCkgJiYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQ3NTcwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9URVNUX0dURVNUX1RZUEVEX1RFU1RfVEVTVF9IXworI2RlZmluZSBHVEVTVF9URVNUX0dURVNUX1RZUEVEX1RFU1RfVEVTVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKwordXNpbmcgdGVzdGluZzo6VGVzdDsKKworLy8gRm9yIHRlc3RpbmcgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCisvLyBDb250YWluZXJUZXN0IHdpbGwgYmUgaW5zdGFudGlhdGVkIGluIGJvdGggZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjCisvLyBhbmQgZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDb250YWluZXJUZXN0IDogcHVibGljIFRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoQ29udGFpbmVyVGVzdCk7CisKK1RZUEVEX1RFU1RfUChDb250YWluZXJUZXN0LCBDYW5CZURlZmF1bHRDb25zdHJ1Y3RlZCkgeworICBUeXBlUGFyYW0gY29udGFpbmVyOworfQorCitUWVBFRF9URVNUX1AoQ29udGFpbmVyVGVzdCwgSW5pdGlhbFNpemVJc1plcm8pIHsKKyAgVHlwZVBhcmFtIGNvbnRhaW5lcjsKKyAgRVhQRUNUX0VRKDBVLCBjb250YWluZXIuc2l6ZSgpKTsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoQ29udGFpbmVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbkJlRGVmYXVsdENvbnN0cnVjdGVkLCBJbml0aWFsU2l6ZUlzWmVybyk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisjZW5kaWYgIC8vIEdURVNUX1RFU1RfR1RFU1RfVFlQRURfVEVTVF9URVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwODNlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYwpAQCAtMCwwICsxLDM0MSBAQAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGVzdHMgdmVyaWZ5aW5nIGNvcnJlY3RuZXNzIG9mIGRhdGEgcHJvdmlkZWQgdmlhCisvLyBVbml0VGVzdCdzIHB1YmxpYyBtZXRob2RzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIHN0cmNtcC4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IExlc3NCeU5hbWUgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCogYSwgY29uc3QgVCogYikgeworICAgIHJldHVybiBzdHJjbXAoYS0+bmFtZSgpLCBiLT5uYW1lKCkpIDwgMDsKKyAgfQorfTsKKworY2xhc3MgVW5pdFRlc3RIZWxwZXIgeworIHB1YmxpYzoKKyAgLy8gUmV0dXJucyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIHRlc3QgY2FzZXMgc29ydGVkIGJ5IHRoZSB0ZXN0IGNhc2UKKyAgLy8gbmFtZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBhcnJheS4KKyAgc3RhdGljIFRlc3RDYXNlIGNvbnN0KiogY29uc3QgR2V0U29ydGVkVGVzdENhc2VzKCkgeworICAgIFVuaXRUZXN0JiB1bml0X3Rlc3QgPSAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisgICAgVGVzdENhc2UgY29uc3QqKiBjb25zdCB0ZXN0X2Nhc2VzID0KKyAgICAgICAgbmV3IGNvbnN0IFRlc3RDYXNlKlt1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCldOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkKKyAgICAgIHRlc3RfY2FzZXNbaV0gPSB1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisKKyAgICBzdGQ6OnNvcnQodGVzdF9jYXNlcywKKyAgICAgICAgICAgICAgdGVzdF9jYXNlcyArIHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSwKKyAgICAgICAgICAgICAgTGVzc0J5TmFtZTxUZXN0Q2FzZT4oKSk7CisgICAgcmV0dXJuIHRlc3RfY2FzZXM7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgYnkgaXRzIG5hbWUuICBUaGUgY2FsbGVyIGRvZXNuJ3Qgb3duIHRoZSByZXR1cm5lZAorICAvLyBwb2ludGVyLgorICBzdGF0aWMgY29uc3QgVGVzdENhc2UqIEZpbmRUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgVW5pdFRlc3QmIHVuaXRfdGVzdCA9ICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworICAgICAgaWYgKDAgPT0gc3RyY21wKHRlc3RfY2FzZS0+bmFtZSgpLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIHRlc3RfY2FzZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBhcnJheSBvZiBwb2ludGVycyB0byBhbGwgdGVzdHMgaW4gYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZQorICAvLyBzb3J0ZWQgYnkgdGhlIHRlc3QgbmFtZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQorICAvLyBhcnJheS4KKyAgc3RhdGljIFRlc3RJbmZvIGNvbnN0KiogY29uc3QgR2V0U29ydGVkVGVzdHMoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICAgIFRlc3RJbmZvIGNvbnN0KiogY29uc3QgdGVzdHMgPQorICAgICAgICBuZXcgY29uc3QgVGVzdEluZm8qW3Rlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpXTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCk7ICsraSkKKyAgICAgIHRlc3RzW2ldID0gdGVzdF9jYXNlLT5HZXRUZXN0SW5mbyhpKTsKKworICAgIHN0ZDo6c29ydCh0ZXN0cywgdGVzdHMgKyB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICAgICAgTGVzc0J5TmFtZTxUZXN0SW5mbz4oKSk7CisgICAgcmV0dXJuIHRlc3RzOworICB9Cit9OworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUZXN0Q2FzZVdpdGhDb21tZW50VGVzdCA6IHB1YmxpYyBUZXN0IHt9OworVFlQRURfVEVTVF9DQVNFKFRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LCBUeXBlczxpbnQ+KTsKK1RZUEVEX1RFU1QoVGVzdENhc2VXaXRoQ29tbWVudFRlc3QsIER1bW15KSB7fQorCitjb25zdCBpbnQga1R5cGVkVGVzdENhc2VzID0gMTsKK2NvbnN0IGludCBrVHlwZWRUZXN0cyA9IDE7CisjZWxzZQorY29uc3QgaW50IGtUeXBlZFRlc3RDYXNlcyA9IDA7Citjb25zdCBpbnQga1R5cGVkVGVzdHMgPSAwOworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBXZSBjYW4gb25seSB0ZXN0IHRoZSBhY2Nlc3NvcnMgdGhhdCBkbyBub3QgY2hhbmdlIHZhbHVlIHdoaWxlIHRlc3RzIHJ1bi4KKy8vIFNpbmNlIHRlc3RzIGNhbiBiZSBydW4gaW4gYW55IG9yZGVyLCB0aGUgdmFsdWVzIHRoZSBhY2Nlc3NvcnMgdGhhdCB0cmFjaworLy8gdGVzdCBleGVjdXRpb24gKHN1Y2ggYXMgZmFpbGVkX3Rlc3RfY291bnQpIGNhbiBub3QgYmUgcHJlZGljdGVkLgorVEVTVChBcGlUZXN0LCBVbml0VGVzdEltbXV0YWJsZUFjY2Vzc29yc1dvcmspIHsKKyAgVW5pdFRlc3QqIHVuaXRfdGVzdCA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgIEFTU0VSVF9FUSgyICsga1R5cGVkVGVzdENhc2VzLCB1bml0X3Rlc3QtPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEgKyBrVHlwZWRUZXN0Q2FzZXMsIHVuaXRfdGVzdC0+dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDIsIHVuaXRfdGVzdC0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDUgKyBrVHlwZWRUZXN0cywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2NvdW50KCkpOworICBFWFBFQ1RfRVEoMyArIGtUeXBlZFRlc3RzLCB1bml0X3Rlc3QtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworCisgIGNvbnN0IFRlc3RDYXNlKiogY29uc3QgdGVzdF9jYXNlcyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0Q2FzZXMoKTsKKworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2VzWzBdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX1Rlc3QiLCB0ZXN0X2Nhc2VzWzFdLT5uYW1lKCkpOworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RfY2FzZXNbMl0tPm5hbWUoKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyAgZGVsZXRlW10gdGVzdF9jYXNlczsKKworICAvLyBUaGUgZm9sbG93aW5nIGxpbmVzIGluaXRpYXRlIGFjdGlvbnMgdG8gdmVyaWZ5IGNlcnRhaW4gbWV0aG9kcyBpbgorICAvLyBGaW5hbFN1Y2Nlc3NDaGVja2VyOjpUZWFyRG93bi4KKworICAvLyBSZWNvcmRzIGEgdGVzdCBwcm9wZXJ0eSB0byB2ZXJpZnkgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KCkuCisgIFJlY29yZFByb3BlcnR5KCJrZXkiLCAidmFsdWUiKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTnVsbChjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCAiYXJndW1lbnQgaXMgIiA8PCBzdHI7CisgIH0KKyAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKK30KKworVEVTVChBcGlUZXN0LCBUZXN0Q2FzZUltbXV0YWJsZUFjY2Vzc29yc1dvcmspIHsKKyAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIkFwaVRlc3QiKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9jYXNlICE9IE5VTEwpOworCisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpKTsKKyAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDMsIHRlc3RfY2FzZS0+dGVzdF90b19ydW5fY291bnQoKSk7CisgIEFTU0VSVF9FUSg0LCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSk7CisKKyAgY29uc3QgVGVzdEluZm8qKiB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOworCisgIEVYUEVDVF9TVFJFUSgiRElTQUJMRURfRHVtbXkxIiwgdGVzdHNbMF0tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzBdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKKworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlRGlzYWJsZWRBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMV0tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzFdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzFdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RzWzFdLT5zaG91bGRfcnVuKCkpOworCisgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMl0tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzJdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzJdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RzWzJdLT5zaG91bGRfcnVuKCkpOworCisgIEVYUEVDVF9TVFJFUSgiVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbM10tPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzNdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzNdLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RzWzNdLT5zaG91bGRfcnVuKCkpOworCisgIGRlbGV0ZVtdIHRlc3RzOworICB0ZXN0cyA9IE5VTEw7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICB0ZXN0X2Nhc2UgPSBVbml0VGVzdEhlbHBlcjo6RmluZFRlc3RDYXNlKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIik7CisgIEFTU0VSVF9UUlVFKHRlc3RfY2FzZSAhPSBOVUxMKTsKKworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7CisgIEVYUEVDVF9TVFJFUShHZXRUeXBlTmFtZTxpbnQ+KCkuY19zdHIoKSwgdGVzdF9jYXNlLT50eXBlX3BhcmFtKCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSk7CisgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2UtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2UtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCkpOworCisgIHRlc3RzID0gVW5pdFRlc3RIZWxwZXI6OkdldFNvcnRlZFRlc3RzKHRlc3RfY2FzZSk7CisKKyAgRVhQRUNUX1NUUkVRKCJEdW1teSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RzWzBdLT50eXBlX3BhcmFtKCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKKworICBkZWxldGVbXSB0ZXN0czsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKK30KKworVEVTVChBcGlUZXN0LCBUZXN0Q2FzZURpc2FibGVkQWNjZXNzb3JzV29yaykgeworICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiRElTQUJMRURfVGVzdCIpOworICBBU1NFUlRfVFJVRSh0ZXN0X2Nhc2UgIT0gTlVMTCk7CisKKyAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlLT5uYW1lKCkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlLT50eXBlX3BhcmFtKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpKTsKKyAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZS0+dGVzdF90b19ydW5fY291bnQoKSk7CisgIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSk7CisKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+R2V0VGVzdEluZm8oMCk7CisgIEVYUEVDVF9TVFJFUSgiRHVtbXkyIiwgdGVzdF9pbmZvLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2luZm8tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfRkFMU0UodGVzdF9pbmZvLT5zaG91bGRfcnVuKCkpOworfQorCisvLyBUaGVzZSB0d28gdGVzdHMgYXJlIGhlcmUgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0ZXN0aW5nCisvLyB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50LCBkaXNhYmxlZF90ZXN0X2NvdW50LCBhbmQgdGVzdF90b19ydW5fY291bnQuCitURVNUKEFwaVRlc3QsIERJU0FCTEVEX0R1bW15MSkge30KK1RFU1QoRElTQUJMRURfVGVzdCwgRHVtbXkyKSB7fQorCitjbGFzcyBGaW5hbFN1Y2Nlc3NDaGVja2VyIDogcHVibGljIEVudmlyb25tZW50IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBVbml0VGVzdCogdW5pdF90ZXN0ID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisKKyAgICBFWFBFQ1RfRVEoMSArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT5zdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMyArIGtUeXBlZFRlc3RzLCB1bml0X3Rlc3QtPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdW5pdF90ZXN0LT5mYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCB1bml0X3Rlc3QtPmZhaWxlZF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKHVuaXRfdGVzdC0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9GQUxTRSh1bml0X3Rlc3QtPkZhaWxlZCgpKTsKKyAgICBBU1NFUlRfRVEoMiArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSk7CisKKyAgICBjb25zdCBUZXN0Q2FzZSoqIGNvbnN0IHRlc3RfY2FzZXMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdENhc2VzKCk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2VzWzBdLT5uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2Nhc2VzWzBdLT50eXBlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VzWzBdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2VzWzBdLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICAgIEFTU0VSVF9FUSg0LCB0ZXN0X2Nhc2VzWzBdLT50b3RhbF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgzLCB0ZXN0X2Nhc2VzWzBdLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMF0tPmZhaWxlZF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMF0tPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGVzdF9jYXNlc1swXS0+RmFpbGVkKCkpOworCisgICAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlc1sxXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlc1sxXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZXNbMV0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZXNbMV0tPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZXNbMV0tPnRvdGFsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMV0tPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlc1sxXS0+ZmFpbGVkX3Rlc3RfY291bnQoKSk7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RfY2FzZXNbMl0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKEdldFR5cGVOYW1lPGludD4oKS5jX3N0cigpLCB0ZXN0X2Nhc2VzWzJdLT50eXBlX3BhcmFtKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMl0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMl0tPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZXNbMl0tPnRvdGFsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZXNbMl0tPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlc1syXS0+ZmFpbGVkX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9jYXNlc1syXS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2VzWzJdLT5GYWlsZWQoKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyAgICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiQXBpVGVzdCIpOworICAgIGNvbnN0IFRlc3RJbmZvKiogdGVzdHMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdHModGVzdF9jYXNlKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX0R1bW15MSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGVzdHNbMF0tPnNob3VsZF9ydW4oKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlRGlzYWJsZWRBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMV0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbMV0tPnRlc3RfY2FzZV9uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dmFsdWVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMV0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMV0tPnJlc3VsdCgpLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RzWzFdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMl0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbMl0tPnRlc3RfY2FzZV9uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dmFsdWVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMl0tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbMl0tPnJlc3VsdCgpLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RzWzJdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbM10tPm5hbWUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbM10tPnRlc3RfY2FzZV9uYW1lKCkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dmFsdWVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbM10tPnNob3VsZF9ydW4oKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdHNbM10tPnJlc3VsdCgpLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3RzWzNdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKyAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5ID0gdGVzdHNbM10tPnJlc3VsdCgpLT5HZXRUZXN0UHJvcGVydHkoMCk7CisgICAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJ2YWx1ZSIsIHByb3BlcnR5LnZhbHVlKCkpOworCisgICAgZGVsZXRlW10gdGVzdHM7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICAgIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiKTsKKyAgICB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOworCisgICAgRVhQRUNUX1NUUkVRKCJEdW1teSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMF0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RzWzBdLT50eXBlX3BhcmFtKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzBdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzBdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0c1swXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgICBkZWxldGVbXSB0ZXN0czsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgICBkZWxldGVbXSB0ZXN0X2Nhc2VzOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyB0ZXN0aW5nOjppbnRlcm5hbDo6RmluYWxTdWNjZXNzQ2hlY2tlcigpKTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NWFhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGJ1aWxkIG1vc3Qgb2YgR29vZ2xlIFRlc3QncyBvd24gdGVzdHMKKy8vIGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBmaWxlLiAgVGhpcyBmaWxlIHNlcnZlcyB0aGlzIHB1cnBvc2UuCisjaW5jbHVkZSAidGVzdC9ndGVzdC1maWxlcGF0aF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3Qtb3B0aW9uc190ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9wcm9kdWN0aW9uLmNjIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OGYzZTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwyMTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyBicmVhay1vbi1mYWlsdXJlIG1vZGUuCisKK0EgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIHNlZy1mYXVsdCB3aGVuIGFuIGFzc2VydGlvbiBmYWlscywgdXNpbmcKK2VpdGhlciB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUKKy0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnLiAgVGhpcyBzY3JpcHQgdGVzdHMgc3VjaCBmdW5jdGlvbmFsaXR5CitieSBpbnZva2luZyBndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XyAoYSBwcm9ncmFtIHdyaXR0ZW4gd2l0aAorR29vZ2xlIFRlc3QpIHdpdGggZGlmZmVyZW50IGVudmlyb25tZW50cyBhbmQgY29tbWFuZCBsaW5lIGZsYWdzLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworCisjIENvbnN0YW50cy4KKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSBicmVhay1vbi1mYWlsdXJlIG1vZGUuCitCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIgPSAnR1RFU1RfQlJFQUtfT05fRkFJTFVSRScKKworIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorQlJFQUtfT05fRkFJTFVSRV9GTEFHID0gJ2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmUnCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZS4KK1RIUk9XX09OX0ZBSUxVUkVfRU5WX1ZBUiA9ICdHVEVTVF9USFJPV19PTl9GQUlMVVJFJworCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSBjYXRjaC1leGNlcHRpb25zIG1vZGUuCitDQVRDSF9FWENFUFRJT05TX0VOVl9WQVIgPSAnR1RFU1RfQ0FUQ0hfRVhDRVBUSU9OUycKKworIyBQYXRoIHRvIHRoZSBndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XyBwcm9ncmFtLgorRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAnZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8nKQorCisKK2Vudmlyb24gPSBndGVzdF90ZXN0X3V0aWxzLmVudmlyb24KK1NldEVudlZhciA9IGd0ZXN0X3Rlc3RfdXRpbHMuU2V0RW52VmFyCisKKyMgVGVzdHMgaW4gdGhpcyBmaWxlIHJ1biBhIEdvb2dsZS1UZXN0LWJhc2VkIHRlc3QgcHJvZ3JhbSBhbmQgZXhwZWN0IGl0CisjIHRvIHRlcm1pbmF0ZSBwcmVtYXR1cmVseS4gIFRoZXJlZm9yZSB0aGV5IGFyZSBpbmNvbXBhdGlibGUgd2l0aAorIyB0aGUgcHJlbWF0dXJlLWV4aXQtZmlsZSBwcm90b2NvbCBieSBkZXNpZ24uICBVbnNldCB0aGUKKyMgcHJlbWF0dXJlLWV4aXQgZmlsZXBhdGggdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIGNyZWF0aW5nCisjIHRoZSBmaWxlLgorU2V0RW52VmFyKGd0ZXN0X3Rlc3RfdXRpbHMuUFJFTUFUVVJFX0VYSVRfRklMRV9FTlZfVkFSLCBOb25lKQorCisKK2RlZiBSdW4oY29tbWFuZCk6CisgICIiIlJ1bnMgYSBjb21tYW5kOyByZXR1cm5zIDEgaWYgaXQgd2FzIGtpbGxlZCBieSBhIHNpZ25hbCwgb3IgMCBvdGhlcndpc2UuIiIiCisKKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kLCBlbnY9ZW52aXJvbikKKyAgaWYgcC50ZXJtaW5hdGVkX2J5X3NpZ25hbDoKKyAgICByZXR1cm4gMQorICBlbHNlOgorICAgIHJldHVybiAwCisKKworIyBUaGUgdGVzdHMuCisKKworY2xhc3MgR1Rlc3RCcmVha09uRmFpbHVyZVVuaXRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiJUZXN0cyB1c2luZyB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvcgorICB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWcgdG8gdHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50bworICBzZWdtZW50YXRpb24gZmF1bHRzLgorICAiIiIKKworICBkZWYgUnVuQW5kVmVyaWZ5KHNlbGYsIGVudl92YXJfdmFsdWUsIGZsYWdfdmFsdWUsIGV4cGVjdF9zZWdfZmF1bHQpOgorICAgICIiIlJ1bnMgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8gYW5kIHZlcmlmaWVzIHRoYXQgaXQgZG9lcworICAgIChvciBkb2VzIG5vdCkgaGF2ZSBhIHNlZy1mYXVsdC4KKworICAgIEFyZ3M6CisgICAgICBlbnZfdmFyX3ZhbHVlOiAgICB2YWx1ZSBvZiB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU7IE5vbmUgaWYgdGhlIHZhcmlhYmxlIHNob3VsZCBiZSB1bnNldC4KKyAgICAgIGZsYWdfdmFsdWU6ICAgICAgIHZhbHVlIG9mIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgaWYgdGhlIGZsYWcgc2hvdWxkIG5vdCBiZSBwcmVzZW50LgorICAgICAgZXhwZWN0X3NlZ19mYXVsdDogMSBpZiB0aGUgcHJvZ3JhbSBpcyBleHBlY3RlZCB0byBnZW5lcmF0ZSBhIHNlZy1mYXVsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgb3RoZXJ3aXNlLgorICAgICIiIgorCisgICAgU2V0RW52VmFyKEJSRUFLX09OX0ZBSUxVUkVfRU5WX1ZBUiwgZW52X3Zhcl92YWx1ZSkKKworICAgIGlmIGVudl92YXJfdmFsdWUgaXMgTm9uZToKKyAgICAgIGVudl92YXJfdmFsdWVfbXNnID0gJyBpcyBub3Qgc2V0JworICAgIGVsc2U6CisgICAgICBlbnZfdmFyX3ZhbHVlX21zZyA9ICc9JyArIGVudl92YXJfdmFsdWUKKworICAgIGlmIGZsYWdfdmFsdWUgaXMgTm9uZToKKyAgICAgIGZsYWcgPSAnJworICAgIGVsaWYgZmxhZ192YWx1ZSA9PSAnMCc6CisgICAgICBmbGFnID0gJy0tJXM9MCcgJSBCUkVBS19PTl9GQUlMVVJFX0ZMQUcKKyAgICBlbHNlOgorICAgICAgZmxhZyA9ICctLSVzJyAlIEJSRUFLX09OX0ZBSUxVUkVfRkxBRworCisgICAgY29tbWFuZCA9IFtFWEVfUEFUSF0KKyAgICBpZiBmbGFnOgorICAgICAgY29tbWFuZC5hcHBlbmQoZmxhZykKKworICAgIGlmIGV4cGVjdF9zZWdfZmF1bHQ6CisgICAgICBzaG91bGRfb3Jfbm90ID0gJ3Nob3VsZCcKKyAgICBlbHNlOgorICAgICAgc2hvdWxkX29yX25vdCA9ICdzaG91bGQgbm90JworCisgICAgaGFzX3NlZ19mYXVsdCA9IFJ1bihjb21tYW5kKQorCisgICAgU2V0RW52VmFyKEJSRUFLX09OX0ZBSUxVUkVfRU5WX1ZBUiwgTm9uZSkKKworICAgIG1zZyA9ICgnd2hlbiAlcyVzLCBhbiBhc3NlcnRpb24gZmFpbHVyZSBpbiAiJXMiICVzIGNhdXNlIGEgc2VnLWZhdWx0LicgJQorICAgICAgICAgICAoQlJFQUtfT05fRkFJTFVSRV9FTlZfVkFSLCBlbnZfdmFyX3ZhbHVlX21zZywgJyAnLmpvaW4oY29tbWFuZCksCisgICAgICAgICAgICBzaG91bGRfb3Jfbm90KSkKKyAgICBzZWxmLmFzc2VydF8oaGFzX3NlZ19mYXVsdCA9PSBleHBlY3Rfc2VnX2ZhdWx0LCBtc2cpCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3Ioc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IG1vZGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MCkKKworICBkZWYgdGVzdEVudlZhcihzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKworICBkZWYgdGVzdEZsYWcoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MCkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQorCisgIGRlZiB0ZXN0RmxhZ092ZXJyaWRlc0VudlZhcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MCkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisKKyAgZGVmIHRlc3RCcmVha09uRmFpbHVyZU92ZXJyaWRlc1Rocm93T25GYWlsdXJlKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBvdmVycmlkZXMgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZS4iIiIKKworICAgIFNldEVudlZhcihUSFJPV19PTl9GQUlMVVJFX0VOVl9WQVIsICcxJykKKyAgICB0cnk6CisgICAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKyAgICBmaW5hbGx5OgorICAgICAgU2V0RW52VmFyKFRIUk9XX09OX0ZBSUxVUkVfRU5WX1ZBUiwgTm9uZSkKKworICBpZiBJU19XSU5ET1dTOgorICAgIGRlZiB0ZXN0Q2F0Y2hFeGNlcHRpb25zRG9lc05vdEludGVyZmVyZShzZWxmKToKKyAgICAgICIiIlRlc3RzIHRoYXQgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBkb2Vzbid0IGludGVyZmVyZS4iIiIKKworICAgICAgU2V0RW52VmFyKENBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUiwgJzEnKQorICAgICAgdHJ5OgorICAgICAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKyAgICAgIGZpbmFsbHk6CisgICAgICAgIFNldEVudlZhcihDQVRDSF9FWENFUFRJT05TX0VOVl9WQVIsIE5vbmUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDA3NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjCkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyBicmVhay1vbi1mYWlsdXJlIG1vZGUuCisvLworLy8gQSB1c2VyIGNhbiBhc2sgR29vZ2xlIFRlc3QgdG8gc2VnLWZhdWx0IHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzLCB1c2luZworLy8gZWl0aGVyIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZQorLy8gLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWcuICBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgdGVzdGluZyBzdWNoCisvLyBmdW5jdGlvbmFsaXR5LgorLy8KKy8vIFRoaXMgcHJvZ3JhbSB3aWxsIGJlIGludm9rZWQgZnJvbSBhIFB5dGhvbiB1bml0IHRlc3QuICBJdCBpcworLy8gZXhwZWN0ZWQgdG8gZmFpbC4gIERvbid0IHJ1biBpdCBkaXJlY3RseS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHsKKworLy8gQSB0ZXN0IHRoYXQncyBleHBlY3RlZCB0byBmYWlsLgorVEVTVChGb28sIEJhcikgeworICBFWFBFQ1RfRVEoMiwgMyk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU0VIICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gT24gV2luZG93cyBNb2JpbGUgZ2xvYmFsIGV4Y2VwdGlvbiBoYW5kbGVycyBhcmUgbm90IHN1cHBvcnRlZC4KK0xPTkcgV0lOQVBJIEV4aXRXaXRoRXhjZXB0aW9uQ29kZSgKKyAgICBzdHJ1Y3QgX0VYQ0VQVElPTl9QT0lOVEVSUyogZXhjZXB0aW9uX3BvaW50ZXJzKSB7CisgIGV4aXQoZXhjZXB0aW9uX3BvaW50ZXJzLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGUpOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIFN1cHByZXNzZXMgZGlzcGxheSBvZiB0aGUgV2luZG93cyBlcnJvciBkaWFsb2cgdXBvbiBlbmNvdW50ZXJpbmcKKyAgLy8gYSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgKHNlZ21lbnQgdmlvbGF0aW9uKS4KKyAgU2V0RXJyb3JNb2RlKFNFTV9OT0dQRkFVTFRFUlJPUkJPWCB8IFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOworCisjIGlmIEdURVNUX0hBU19TRUggJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgLy8gVGhlIGRlZmF1bHQgdW5oYW5kbGVkIGV4Y2VwdGlvbiBmaWx0ZXIgZG9lcyBub3QgYWx3YXlzIGV4aXQKKyAgLy8gd2l0aCB0aGUgZXhjZXB0aW9uIGNvZGUgYXMgZXhpdCBjb2RlIC0gZm9yIGV4YW1wbGUgaXQgZXhpdHMgd2l0aAorICAvLyAwIGZvciBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiBhbmQgMSBmb3IgRVhDRVBUSU9OX0JSRUFLUE9JTlQKKyAgLy8gaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUuIFRodXMgd2UgdXNlIG91ciBvd24KKyAgLy8gZmlsdGVyIHdoaWNoIGFsd2F5cyBleGl0cyB3aXRoIHRoZSBleGNlcHRpb24gY29kZSBmb3IgdW5oYW5kbGVkCisgIC8vIGV4Y2VwdGlvbnMuCisgIFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihFeGl0V2l0aEV4Y2VwdGlvbkNvZGUpOworCisjIGVuZGlmCisjZW5kaWYKKworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2ZmMyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0LnB5CkBAIC0wLDAgKzEsMjM3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyBHb29nbGUgVGVzdCdzIGV4Y2VwdGlvbiBjYXRjaGluZyBiZWhhdmlvci4KKworVGhpcyBzY3JpcHQgaW52b2tlcyBndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfIGFuZAorZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XyAocHJvZ3JhbXMgd3JpdHRlbiB3aXRoCitHb29nbGUgVGVzdCkgYW5kIHZlcmlmaWVzIHRoZWlyIG91dHB1dC4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3ZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpJworCitpbXBvcnQgb3MKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworIyBDb25zdGFudHMuCitGTEFHX1BSRUZJWCA9ICctLWd0ZXN0XycKK0xJU1RfVEVTVFNfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2xpc3RfdGVzdHMnCitOT19DQVRDSF9FWENFUFRJT05TX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdjYXRjaF9leGNlcHRpb25zPTAnCitGSUxURVJfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2ZpbHRlcicKKworIyBQYXRoIHRvIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb25zX2V4X3Rlc3RfIGJpbmFyeSwgY29tcGlsZWQgd2l0aAorIyBleGNlcHRpb25zIGVuYWJsZWQuCitFWF9FWEVfUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKAorICAgICdndGVzdF9jYXRjaF9leGNlcHRpb25zX2V4X3Rlc3RfJykKKworIyBQYXRoIHRvIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfIGJpbmFyeSwgY29tcGlsZWQgd2l0aAorIyBleGNlcHRpb25zIGRpc2FibGVkLgorRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAnZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19ub19leF90ZXN0XycpCisKK2Vudmlyb24gPSBndGVzdF90ZXN0X3V0aWxzLmVudmlyb24KK1NldEVudlZhciA9IGd0ZXN0X3Rlc3RfdXRpbHMuU2V0RW52VmFyCisKKyMgVGVzdHMgaW4gdGhpcyBmaWxlIHJ1biBhIEdvb2dsZS1UZXN0LWJhc2VkIHRlc3QgcHJvZ3JhbSBhbmQgZXhwZWN0IGl0CisjIHRvIHRlcm1pbmF0ZSBwcmVtYXR1cmVseS4gIFRoZXJlZm9yZSB0aGV5IGFyZSBpbmNvbXBhdGlibGUgd2l0aAorIyB0aGUgcHJlbWF0dXJlLWV4aXQtZmlsZSBwcm90b2NvbCBieSBkZXNpZ24uICBVbnNldCB0aGUKKyMgcHJlbWF0dXJlLWV4aXQgZmlsZXBhdGggdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIGNyZWF0aW5nCisjIHRoZSBmaWxlLgorU2V0RW52VmFyKGd0ZXN0X3Rlc3RfdXRpbHMuUFJFTUFUVVJFX0VYSVRfRklMRV9FTlZfVkFSLCBOb25lKQorCitURVNUX0xJU1QgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgW0VYRV9QQVRILCBMSVNUX1RFU1RTX0ZMQUddLCBlbnY9ZW52aXJvbikub3V0cHV0CisKK1NVUFBPUlRTX1NFSF9FWENFUFRJT05TID0gJ1Rocm93c1NlaEV4Y2VwdGlvbicgaW4gVEVTVF9MSVNUCisKK2lmIFNVUFBPUlRTX1NFSF9FWENFUFRJT05TOgorICBCSU5BUllfT1VUUFVUID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtFWEVfUEFUSF0sIGVudj1lbnZpcm9uKS5vdXRwdXQKKworRVhfQklOQVJZX09VVFBVVCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICBbRVhfRVhFX1BBVEhdLCBlbnY9ZW52aXJvbikub3V0cHV0CisKKworIyBUaGUgdGVzdHMuCitpZiBTVVBQT1JUU19TRUhfRVhDRVBUSU9OUzoKKyAgIyBweWxpbnQ6ZGlzYWJsZS1tc2c9QzYzMDIKKyAgY2xhc3MgQ2F0Y2hTZWhFeGNlcHRpb25zVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBleGNlcHRpb24tY2F0Y2hpbmcgYmVoYXZpb3IuIiIiCisKKworICAgIGRlZiBUZXN0U2VoRXhjZXB0aW9ucyhzZWxmLCB0ZXN0X291dHB1dCk6CisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duICcKKyAgICAgICAgICAgICAgICAgICAnaW4gdGhlIHRlc3QgZml4dHVyZVwncyBjb25zdHJ1Y3RvcicKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gJworICAgICAgICAgICAgICAgICAgICdpbiB0aGUgdGVzdCBmaXh0dXJlXCdzIGRlc3RydWN0b3InCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duIGluIFNldFVwVGVzdENhc2UoKScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gVGVhckRvd25UZXN0Q2FzZSgpJworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biBpbiBTZXRVcCgpJworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biBpbiBUZWFyRG93bigpJworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biBpbiB0aGUgdGVzdCBib2R5JworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorCisgICAgZGVmIHRlc3RDYXRjaGVzU2VoRXhjZXB0aW9uc1dpdGhDeHhFeGNlcHRpb25zRW5hYmxlZChzZWxmKToKKyAgICAgIHNlbGYuVGVzdFNlaEV4Y2VwdGlvbnMoRVhfQklOQVJZX09VVFBVVCkKKworICAgIGRlZiB0ZXN0Q2F0Y2hlc1NlaEV4Y2VwdGlvbnNXaXRoQ3h4RXhjZXB0aW9uc0Rpc2FibGVkKHNlbGYpOgorICAgICAgc2VsZi5UZXN0U2VoRXhjZXB0aW9ucyhCSU5BUllfT1VUUFVUKQorCisKK2NsYXNzIENhdGNoQ3h4RXhjZXB0aW9uc1Rlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIEMrKyBleGNlcHRpb24tY2F0Y2hpbmcgYmVoYXZpb3IuCisKKyAgICAgVGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdmVyaWZ5IHRoYXQ6CisgICAgICogQysrIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgbG9nZ2VkIGFzIEMrKyAobm90IFNFSCkgZXhjZXB0aW9ucworICAgICAqIEV4Y2VwdGlvbiB0aHJvd24gYWZmZWN0IHRoZSByZW1haW5kZXIgb2YgdGhlIHRlc3Qgd29yayBmbG93IGluIHRoZQorICAgICAgIGV4cGVjdGVkIG1hbm5lci4KKyAgIiIiCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luRml4dHVyZUNvbnN0cnVjdG9yKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICcKKyAgICAgICAgICAgICAgICAgJyJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIiB0aHJvd24gJworICAgICAgICAgICAgICAgICAnaW4gdGhlIHRlc3QgZml4dHVyZVwncyBjb25zdHJ1Y3RvcicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ3VuZXhwZWN0ZWQnIG5vdCBpbiBFWF9CSU5BUllfT1VUUFVULAorICAgICAgICAgICAgICAgICAnVGhpcyBmYWlsdXJlIGJlbG9uZ3MgaW4gdGhpcyB0ZXN0IG9ubHkgaWYgJworICAgICAgICAgICAgICAgICAnIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IiAobm8gcXVvdGVzKSAnCisgICAgICAgICAgICAgICAgICdhcHBlYXJzIG9uIHRoZSBzYW1lIGxpbmUgYXMgd29yZHMgImNhbGxlZCB1bmV4cGVjdGVkbHkiJykKKworICBpZiAoJ0N4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QuVGhyb3dzRXhjZXB0aW9uSW5EZXN0cnVjdG9yJyBpbgorICAgICAgRVhfQklOQVJZX09VVFBVVCk6CisKKyAgICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5GaXh0dXJlRGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iIHRocm93biAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgZGVzdHJ1Y3RvcicKKyAgICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgJworICAgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luU2V0VXBUZXN0Q2FzZShzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCisgICAgICAgICAgICAgICAgICcgdGhyb3duIGluIFNldFVwVGVzdENhc2UoKScKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgY29uc3RydWN0b3IgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgZGVzdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdDo6U2V0VXAoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdDo6VGVhckRvd24oKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCB0ZXN0IGJvZHkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5UZWFyRG93blRlc3RDYXNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIicKKyAgICAgICAgICAgICAgICAgJyB0aHJvd24gaW4gVGVhckRvd25UZXN0Q2FzZSgpJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblNldFVwKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIicKKyAgICAgICAgICAgICAgICAgJyB0aHJvd24gaW4gU2V0VXAoKScKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IGRlc3RydWN0b3IgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0OjpUZWFyRG93bigpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCd1bmV4cGVjdGVkJyBub3QgaW4gRVhfQklOQVJZX09VVFBVVCwKKyAgICAgICAgICAgICAgICAgJ1RoaXMgZmFpbHVyZSBiZWxvbmdzIGluIHRoaXMgdGVzdCBvbmx5IGlmICcKKyAgICAgICAgICAgICAgICAgJyJDeHhFeGNlcHRpb25JblNldFVwVGVzdCIgKG5vIHF1b3RlcykgJworICAgICAgICAgICAgICAgICAnYXBwZWFycyBvbiB0aGUgc2FtZSBsaW5lIGFzIHdvcmRzICJjYWxsZWQgdW5leHBlY3RlZGx5IicpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luVGVhckRvd24oc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiBUZWFyRG93bigpJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QgZGVzdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblRlc3RCb2R5KHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIicKKyAgICAgICAgICAgICAgICAgJyB0aHJvd24gaW4gdGhlIHRlc3QgYm9keScKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0IGRlc3RydWN0b3IgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0OjpUZWFyRG93bigpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RDYXRjaGVzTm9uU3RkQ3h4RXhjZXB0aW9ucyhzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ1Vua25vd24gQysrIGV4Y2VwdGlvbiB0aHJvd24gaW4gdGhlIHRlc3QgYm9keScKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdFVuaGFuZGxlZEN4eEV4Y2VwdGlvbnNBYm9ydFRoZVByb2dyYW0oc2VsZik6CisgICAgIyBGaWx0ZXJzIG91dCBTRUggZXhjZXB0aW9uIHRlc3RzIG9uIFdpbmRvd3MuIFVuaGFuZGxlZCBTRUggZXhjZXB0aW9ucworICAgICMgY2F1c2UgdGVzdHMgdG8gc2hvdyBwb3AtdXAgd2luZG93cyB0aGVyZS4KKyAgICBGSVRMRVJfT1VUX1NFSF9URVNUU19GTEFHID0gRklMVEVSX0ZMQUcgKyAnPS0qU2VoKicKKyAgICAjIEJ5IGRlZmF1bHQsIEdvb2dsZSBUZXN0IGRvZXNuJ3QgY2F0Y2ggdGhlIGV4Y2VwdGlvbnMuCisgICAgdW5jYXVnaHRfZXhjZXB0aW9uc19leF9iaW5hcnlfb3V0cHV0ID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgICAgICBbRVhfRVhFX1BBVEgsCisgICAgICAgICBOT19DQVRDSF9FWENFUFRJT05TX0ZMQUcsCisgICAgICAgICBGSVRMRVJfT1VUX1NFSF9URVNUU19GTEFHXSwKKyAgICAgICAgZW52PWVudmlyb24pLm91dHB1dAorCisgICAgc2VsZi5hc3NlcnRfKCdVbmhhbmRsZWQgQysrIGV4Y2VwdGlvbiB0ZXJtaW5hdGluZyB0aGUgcHJvZ3JhbScKKyAgICAgICAgICAgICAgICAgaW4gdW5jYXVnaHRfZXhjZXB0aW9uc19leF9iaW5hcnlfb3V0cHV0KQorICAgIHNlbGYuYXNzZXJ0XygndW5leHBlY3RlZCcgbm90IGluIHVuY2F1Z2h0X2V4Y2VwdGlvbnNfZXhfYmluYXJ5X291dHB1dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGZjODJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MKQEAgLTAsMCArMSwzMTEgQEAKKy8vIENvcHlyaWdodCAyMDEwLCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZi4gVGVzdHMgaW4gdGhpcyBmaWxlIHRocm93IEMrKyBvciBTRUgKKy8vIGV4Y2VwdGlvbnMsIGFuZCB0aGUgb3V0cHV0IGlzIHZlcmlmaWVkIGJ5IGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdC5weS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3IgZXhpdCgpLgorCisjaWYgR1RFU1RfSEFTX1NFSAorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisjIGluY2x1ZGUgPGV4Y2VwdGlvbj4gIC8vIEZvciBzZXRfdGVybWluYXRlKCkuCisjIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNlbmRpZgorCit1c2luZyB0ZXN0aW5nOjpUZXN0OworCisjaWYgR1RFU1RfSEFTX1NFSAorCitjbGFzcyBTZWhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIFNlaEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0KCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5Db25zdHJ1Y3Rvcikge30KKworY2xhc3MgU2VoRXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIH5TZWhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0KCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0LCBUaHJvd3NFeGNlcHRpb25JbkRlc3RydWN0b3IpIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0LCBUaHJvd3NFeGNlcHRpb25JblNldFVwVGVzdENhc2UpIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0LCBUaHJvd3NFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2UpIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluU2V0VXBUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JblNldFVwVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5TZXRVcCkge30KKworY2xhc3MgU2VoRXhjZXB0aW9uSW5UZWFyRG93blRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IFJhaXNlRXhjZXB0aW9uKDQyLCAwLCAwLCBOVUxMKTsgfQorfTsKKworVEVTVF9GKFNlaEV4Y2VwdGlvbkluVGVhckRvd25UZXN0LCBUaHJvd3NFeGNlcHRpb25JblRlYXJEb3duKSB7fQorCitURVNUKFNlaEV4Y2VwdGlvblRlc3QsIFRocm93c1NlaEV4Y2VwdGlvbikgeworICBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICAvLyBXaXRob3V0IHRoaXMgbWFjcm8gVkMrKyBjb21wbGFpbnMgYWJvdXQgdW5yZWFjaGFibGUgY29kZSBhdCB0aGUgZW5kIG9mCisgICAgLy8gdGhlIGNvbnN0cnVjdG9yLgorICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oCisgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5DeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjYWxsZWQgdW5leHBlY3RlZGx5LiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlNldFVwKCkgIgorICAgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdDo6VGVhckRvd24oKSAiCisgICAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QsIFRocm93c0V4Y2VwdGlvbkluQ29uc3RydWN0b3IpIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgdGVzdCBib2R5ICIKKyAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOworfQorCisvLyBFeGNlcHRpb25zIGluIGRlc3RydWN0b3JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEMrKzExLgorI2lmICFkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSAmJiAgX19jcGx1c3BsdXMgPCAyMDExMDNMCitjbGFzcyBDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCgpIHsKKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKAorICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKSk7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0LCBUaHJvd3NFeGNlcHRpb25JbkRlc3RydWN0b3IpIHt9CisjZW5kaWYgIC8vIEMrKzExIG1vZGUKKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IGNvbnN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgfkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IGRlc3RydWN0b3IgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpTZXRVcCgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdDo6VGVhckRvd24oKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QsIFRocm93c0V4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZSkgeworICBwcmludGYoIiVzIiwKKyAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IHRlc3QgYm9keSAiCisgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7Cit9CisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlKSB7fQorCitjbGFzcyBDeHhFeGNlcHRpb25JblNldFVwVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5DeHhFeGNlcHRpb25JblNldFVwVGVzdCgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IGRlc3RydWN0b3IgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOyB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblNldFVwVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5TZXRVcCkgeworICBBRERfRkFJTFVSRSgpIDw8ICJDeHhFeGNlcHRpb25JblNldFVwVGVzdCB0ZXN0IGJvZHkgIgorICAgICAgICAgICAgICAgIDw8ICJjYWxsZWQgdW5leHBlY3RlZGx5LiI7Cit9CisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgfkN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0KCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QgZGVzdHJ1Y3RvciAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0LCBUaHJvd3NFeGNlcHRpb25JblRlYXJEb3duKSB7fQorCitjbGFzcyBDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5DeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0IGRlc3RydWN0b3IgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdDo6VGVhckRvd24oKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0LCBUaHJvd3NTdGRDeHhFeGNlcHRpb24pIHsKKyAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7Cit9CisKK1RFU1QoQ3h4RXhjZXB0aW9uVGVzdCwgVGhyb3dzTm9uU3RkQ3h4RXhjZXB0aW9uKSB7CisgIHRocm93ICJDLXN0cmluZyI7Cit9CisKKy8vIFRoaXMgdGVybWluYXRlIGhhbmRsZXIgYWJvcnRzIHRoZSBwcm9ncmFtIHVzaW5nIGV4aXQoKSByYXRoZXIgdGhhbiBhYm9ydCgpLgorLy8gVGhpcyBhdm9pZHMgc2hvd2luZyBwb3AtdXBzIG9uIFdpbmRvd3Mgc3lzdGVtcyBhbmQgY29yZSBkdW1wcyBvbiBVbml4LWxpa2UKKy8vIG9uZXMuCit2b2lkIFRlcm1pbmF0ZUhhbmRsZXIoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsICJVbmhhbmRsZWQgQysrIGV4Y2VwdGlvbiB0ZXJtaW5hdGluZyB0aGUgcHJvZ3JhbS4iKTsKKyAgZmZsdXNoKE5VTEwpOworICBleGl0KDMpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgIHN0ZDo6c2V0X3Rlcm1pbmF0ZSgmVGVybWluYXRlSGFuZGxlcik7CisjZW5kaWYKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMDJhNTNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3QucHkKQEAgLTAsMCArMSwxMzAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3QgY29ycmVjdGx5IGRldGVybWluZXMgd2hldGhlciB0byB1c2UgY29sb3JzLiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPSAnbnQnCisKK0NPTE9SX0VOVl9WQVIgPSAnR1RFU1RfQ09MT1InCitDT0xPUl9GTEFHID0gJ2d0ZXN0X2NvbG9yJworQ09NTUFORCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9jb2xvcl90ZXN0XycpCisKKworZGVmIFNldEVudlZhcihlbnZfdmFyLCB2YWx1ZSk6CisgICIiIlNldHMgdGhlIGVudiB2YXJpYWJsZSB0byAndmFsdWUnOyB1bnNldHMgaXQgd2hlbiAndmFsdWUnIGlzIE5vbmUuIiIiCisKKyAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgb3MuZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCisgIGVsaWYgZW52X3ZhciBpbiBvcy5lbnZpcm9uOgorICAgIGRlbCBvcy5lbnZpcm9uW2Vudl92YXJdCisKKworZGVmIFVzZXNDb2xvcih0ZXJtLCBjb2xvcl9lbnZfdmFyLCBjb2xvcl9mbGFnKToKKyAgIiIiUnVucyBndGVzdF9jb2xvcl90ZXN0XyBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLiIiIgorCisgIFNldEVudlZhcignVEVSTScsIHRlcm0pCisgIFNldEVudlZhcihDT0xPUl9FTlZfVkFSLCBjb2xvcl9lbnZfdmFyKQorCisgIGlmIGNvbG9yX2ZsYWcgaXMgTm9uZToKKyAgICBhcmdzID0gW10KKyAgZWxzZToKKyAgICBhcmdzID0gWyctLSVzPSVzJyAlIChDT0xPUl9GTEFHLCBjb2xvcl9mbGFnKV0KKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhbQ09NTUFORF0gKyBhcmdzKQorICByZXR1cm4gbm90IHAuZXhpdGVkIG9yIHAuZXhpdF9jb2RlCisKKworY2xhc3MgR1Rlc3RDb2xvclRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgIGRlZiB0ZXN0Tm9FbnZWYXJOb0ZsYWcoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSdzIG5laXRoZXIgR1RFU1RfQ09MT1Igbm9yIC0tZ3Rlc3RfY29sb3IuIiIiCisKKyAgICBpZiBub3QgSVNfV0lORE9XUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgTm9uZSkpCisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZW1hY3MnLCBOb25lLCBOb25lKSkKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybS1tb25vJywgTm9uZSwgTm9uZSkpCisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigndW5rbm93bicsIE5vbmUsIE5vbmUpKQorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignbGludXgnLCBOb25lLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdjeWd3aW4nLCBOb25lLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgTm9uZSwgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tMjU2Y29sb3InLCBOb25lLCBOb25lKSkKKworICBkZWYgdGVzdEZsYWdPbmx5KHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUncyAtLWd0ZXN0X2NvbG9yIGJ1dCBub3QgR1RFU1RfQ09MT1IuIiIiCisKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsIE5vbmUsICdubycpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsIE5vbmUsICdubycpKQorICAgIGlmIG5vdCBJU19XSU5ET1dTOgorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2VtYWNzJywgTm9uZSwgJ2F1dG8nKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICdhdXRvJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICd5ZXMnKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICd5ZXMnKSkKKworICBkZWYgdGVzdEVudlZhck9ubHkoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSdzIEdURVNUX0NPTE9SIGJ1dCBub3QgLS1ndGVzdF9jb2xvci4iIiIKKworICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdkdW1iJywgJ25vJywgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ25vJywgTm9uZSkpCisgICAgaWYgbm90IElTX1dJTkRPV1M6CisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsICdhdXRvJywgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAnYXV0bycsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCAneWVzJywgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAneWVzJywgTm9uZSkpCisKKyAgZGVmIHRlc3RFbnZWYXJBbmRGbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUgYXJlIGJvdGggR1RFU1RfQ09MT1IgYW5kIC0tZ3Rlc3RfY29sb3IuIiIiCisKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAnbm8nLCAnbm8nKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgJ25vJywgJ3llcycpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ25vJywgJ2F1dG8nKSkKKworICBkZWYgdGVzdEFsaWFzZXNPZlllc0FuZE5vKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIGFsaWFzZXMgaW4gc3BlY2lmeWluZyAtLWd0ZXN0X2NvbG9yLiIiIgorCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICd0cnVlJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICdZRVMnKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJ1QnKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJzEnKSkKKworICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICdmJykpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJ2ZhbHNlJykpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJzAnKSkKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAndW5rbm93bicpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZWJiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9jb2xvcl90ZXN0Xy5jYwpAQCAtMCwwICsxLDcxIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBBIGhlbHBlciBwcm9ncmFtIGZvciB0ZXN0aW5nIGhvdyBHb29nbGUgVGVzdCBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlCisvLyBjb2xvcnMgaW4gdGhlIG91dHB1dC4gIEl0IHByaW50cyAiWUVTIiBhbmQgcmV0dXJucyAxIGlmIEdvb2dsZSBUZXN0CisvLyBkZWNpZGVzIHRvIHVzZSBjb2xvcnMsIGFuZCBwcmludHMgIk5PIiBhbmQgcmV0dXJucyAwIG90aGVyd2lzZS4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNob3VsZFVzZUNvbG9yOworCisvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBVbml0VGVzdCBzaW5nbGV0b24gaXMKKy8vIGNyZWF0ZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLCBhbmQgdGh1cyB0aGF0IFNob3VsZFVzZUNvbG9yKCkKKy8vIHdvcmtzIHRoZSBzYW1lIHdheSBhcyBpbiBhIHJlYWwgR29vZ2xlLVRlc3QtYmFzZWQgdGVzdC4gIFdlIGRvbid0IGFjdHVhbAorLy8gcnVuIHRoZSBURVNUIGl0c2VsZi4KK1RFU1QoR1Rlc3RDb2xvclRlc3QsIER1bW15KSB7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgaWYgKFNob3VsZFVzZUNvbG9yKHRydWUpKSB7CisgICAgLy8gR29vZ2xlIFRlc3QgZGVjaWRlcyB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQgKGFzc3VtaW5nIGl0CisgICAgLy8gZ29lcyB0byBhIFRUWSkuCisgICAgcHJpbnRmKCJZRVNcbiIpOworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIC8vIEdvb2dsZSBUZXN0IGRlY2lkZXMgbm90IHRvIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KKyAgICBwcmludGYoIk5PXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWMyNDMzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkKQEAgLTAsMCArMSwxMDMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3QgY29ycmVjdGx5IHBhcnNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworCitJU19XSU5ET1dTID0gb3MubmFtZSA9PSAnbnQnCitJU19MSU5VWCA9IG9zLm5hbWUgPT0gJ3Bvc2l4JyBhbmQgb3MudW5hbWUoKVswXSA9PSAnTGludXgnCisKK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfZW52X3Zhcl90ZXN0XycpCisKK2Vudmlyb24gPSBvcy5lbnZpcm9uLmNvcHkoKQorCisKK2RlZiBBc3NlcnRFcShleHBlY3RlZCwgYWN0dWFsKToKKyAgaWYgZXhwZWN0ZWQgIT0gYWN0dWFsOgorICAgIHByaW50ICdFeHBlY3RlZDogJXMnICUgKGV4cGVjdGVkLCkKKyAgICBwcmludCAnICBBY3R1YWw6ICVzJyAlIChhY3R1YWwsKQorICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisKKworZGVmIFNldEVudlZhcihlbnZfdmFyLCB2YWx1ZSk6CisgICIiIlNldHMgdGhlIGVudiB2YXJpYWJsZSB0byAndmFsdWUnOyB1bnNldHMgaXQgd2hlbiAndmFsdWUnIGlzIE5vbmUuIiIiCisKKyAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCisgIGVsaWYgZW52X3ZhciBpbiBlbnZpcm9uOgorICAgIGRlbCBlbnZpcm9uW2Vudl92YXJdCisKKworZGVmIEdldEZsYWcoZmxhZyk6CisgICIiIlJ1bnMgZ3Rlc3RfZW52X3Zhcl90ZXN0XyBhbmQgcmV0dXJucyBpdHMgb3V0cHV0LiIiIgorCisgIGFyZ3MgPSBbQ09NTUFORF0KKyAgaWYgZmxhZyBpcyBub3QgTm9uZToKKyAgICBhcmdzICs9IFtmbGFnXQorICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGFyZ3MsIGVudj1lbnZpcm9uKS5vdXRwdXQKKworCitkZWYgVGVzdEZsYWcoZmxhZywgdGVzdF92YWwsIGRlZmF1bHRfdmFsKToKKyAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gZmxhZyBpcyBhZmZlY3RlZCBieSB0aGUgY29ycmVzcG9uZGluZyBlbnYgdmFyLiIiIgorCisgIGVudl92YXIgPSAnR1RFU1RfJyArIGZsYWcudXBwZXIoKQorICBTZXRFbnZWYXIoZW52X3ZhciwgdGVzdF92YWwpCisgIEFzc2VydEVxKHRlc3RfdmFsLCBHZXRGbGFnKGZsYWcpKQorICBTZXRFbnZWYXIoZW52X3ZhciwgTm9uZSkKKyAgQXNzZXJ0RXEoZGVmYXVsdF92YWwsIEdldEZsYWcoZmxhZykpCisKKworY2xhc3MgR1Rlc3RFbnZWYXJUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgdGVzdEVudlZhckFmZmVjdHNGbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUgc2hvdWxkIGFmZmVjdCB0aGUgY29ycmVzcG9uZGluZyBmbGFnLiIiIgorCisgICAgVGVzdEZsYWcoJ2JyZWFrX29uX2ZhaWx1cmUnLCAnMScsICcwJykKKyAgICBUZXN0RmxhZygnY29sb3InLCAneWVzJywgJ2F1dG8nKQorICAgIFRlc3RGbGFnKCdmaWx0ZXInLCAnRm9vVGVzdC5CYXInLCAnKicpCisgICAgVGVzdEZsYWcoJ291dHB1dCcsICd4bWw6dG1wL2Zvby54bWwnLCAnJykKKyAgICBUZXN0RmxhZygncHJpbnRfdGltZScsICcwJywgJzEnKQorICAgIFRlc3RGbGFnKCdyZXBlYXQnLCAnOTk5JywgJzEnKQorICAgIFRlc3RGbGFnKCd0aHJvd19vbl9mYWlsdXJlJywgJzEnLCAnMCcpCisgICAgVGVzdEZsYWcoJ2RlYXRoX3Rlc3Rfc3R5bGUnLCAndGhyZWFkc2FmZScsICdmYXN0JykKKyAgICBUZXN0RmxhZygnY2F0Y2hfZXhjZXB0aW9ucycsICcwJywgJzEnKQorCisgICAgaWYgSVNfTElOVVg6CisgICAgICBUZXN0RmxhZygnZGVhdGhfdGVzdF91c2VfZm9yaycsICcxJywgJzAnKQorICAgICAgVGVzdEZsYWcoJ3N0YWNrX3RyYWNlX2RlcHRoJywgJzAnLCAnMTAwJykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzlhZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdF8uY2MKQEAgLTAsMCArMSwxMjYgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEEgaGVscGVyIHByb2dyYW0gZm9yIHRlc3RpbmcgdGhhdCBHb29nbGUgVGVzdCBwYXJzZXMgdGhlIGVudmlyb25tZW50CisvLyB2YXJpYWJsZXMgY29ycmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCit1c2luZyA6OnN0ZDo6Y291dDsKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIG1ha2UgdGhlIHRlc3QgbW9yZSByZWFsaXN0aWMgYnkgZW5zdXJpbmcKKy8vIHRoYXQgdGhlIFVuaXRUZXN0IHNpbmdsZXRvbiBpcyBjcmVhdGVkIGJlZm9yZSBtYWluKCkgaXMgZW50ZXJlZC4KKy8vIFdlIGRvbid0IGFjdHVhbCBydW4gdGhlIFRFU1QgaXRzZWxmLgorVEVTVChHVGVzdEVudlZhclRlc3QsIER1bW15KSB7Cit9CisKK3ZvaWQgUHJpbnRGbGFnKGNvbnN0IGNoYXIqIGZsYWcpIHsKKyAgaWYgKHN0cmNtcChmbGFnLCAiYnJlYWtfb25fZmFpbHVyZSIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiY2F0Y2hfZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiY29sb3IiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGNvbG9yKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJkZWF0aF90ZXN0X3N0eWxlIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJkZWF0aF90ZXN0X3VzZV9mb3JrIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJmaWx0ZXIiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGZpbHRlcik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAib3V0cHV0IikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhvdXRwdXQpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgInByaW50X3RpbWUiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKHByaW50X3RpbWUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgInJlcGVhdCIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcocmVwZWF0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJzdGFja190cmFjZV9kZXB0aCIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgInRocm93X29uX2ZhaWx1cmUiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvdXQgPDwgIkludmFsaWQgZmxhZyBuYW1lICIgPDwgZmxhZworICAgICAgIDw8ICIuICBWYWxpZCBuYW1lcyBhcmUgYnJlYWtfb25fZmFpbHVyZSwgY29sb3IsIGZpbHRlciwgZXRjLlxuIjsKKyAgZXhpdCgxKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBpZiAoYXJnYyAhPSAyKSB7CisgICAgY291dCA8PCAiVXNhZ2U6IGd0ZXN0X2Vudl92YXJfdGVzdF8gTkFNRV9PRl9GTEFHXG4iOworICAgIHJldHVybiAxOworICB9CisKKyAgdGVzdGluZzo6UHJpbnRGbGFnKGFyZ3ZbMV0pOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9lbnZpcm9ubWVudF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmZjE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9lbnZpcm9ubWVudF90ZXN0LmNjCkBAIC0wLDAgKzEsMTkyIEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRlc3RzIHVzaW5nIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cy4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMSAgLy8gUmVxdWlyZWQgZm9yIHRoZSBuZXh0ICNpbmNsdWRlLgorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworR1RFU1RfREVDTEFSRV9zdHJpbmdfKGZpbHRlcik7Cit9CisKK25hbWVzcGFjZSB7CisKK2VudW0gRmFpbHVyZVR5cGUgeworICBOT19GQUlMVVJFLCBOT05fRkFUQUxfRkFJTFVSRSwgRkFUQUxfRkFJTFVSRQorfTsKKworLy8gRm9yIHRlc3RpbmcgdXNpbmcgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzLgorY2xhc3MgTXlFbnZpcm9ubWVudCA6IHB1YmxpYyB0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICBNeUVudmlyb25tZW50KCkgeyBSZXNldCgpOyB9CisKKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBmYWlsdXJlX2luX3NldF91cF8sIFNldFVwKCkgd2lsbAorICAvLyBnZW5lcmF0ZSBhIG5vbi1mYXRhbCBmYWlsdXJlLCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUsIG9yCisgIC8vIHN1Y2NlZWQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBzZXRfdXBfd2FzX3J1bl8gPSB0cnVlOworCisgICAgc3dpdGNoIChmYWlsdXJlX2luX3NldF91cF8pIHsKKyAgICAgIGNhc2UgTk9OX0ZBVEFMX0ZBSUxVUkU6CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlIGluIGdsb2JhbCBzZXQtdXAuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZBVEFMX0ZBSUxVUkU6CisgICAgICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSBpbiBnbG9iYWwgc2V0LXVwLiI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGVzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICB0ZWFyX2Rvd25fd2FzX3J1bl8gPSB0cnVlOworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlIGluIGdsb2JhbCB0ZWFyLWRvd24uIjsKKyAgfQorCisgIC8vIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhlIGVudmlyb25tZW50IHMudC4gaXQgY2FuIGJlIHJldXNlZC4KKyAgdm9pZCBSZXNldCgpIHsKKyAgICBmYWlsdXJlX2luX3NldF91cF8gPSBOT19GQUlMVVJFOworICAgIHNldF91cF93YXNfcnVuXyA9IGZhbHNlOworICAgIHRlYXJfZG93bl93YXNfcnVuXyA9IGZhbHNlOworICB9CisKKyAgLy8gV2UgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgdHlwZSBvZiBmYWlsdXJlIFNldFVwKCkgc2hvdWxkCisgIC8vIGdlbmVyYXRlLgorICB2b2lkIHNldF9mYWlsdXJlX2luX3NldF91cChGYWlsdXJlVHlwZSB0eXBlKSB7CisgICAgZmFpbHVyZV9pbl9zZXRfdXBfID0gdHlwZTsKKyAgfQorCisgIC8vIFdhcyBTZXRVcCgpIHJ1bj8KKyAgYm9vbCBzZXRfdXBfd2FzX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNldF91cF93YXNfcnVuXzsgfQorCisgIC8vIFdhcyBUZWFyRG93bigpIHJ1bj8KKyAgYm9vbCB0ZWFyX2Rvd25fd2FzX3J1bigpIGNvbnN0IHsgcmV0dXJuIHRlYXJfZG93bl93YXNfcnVuXzsgfQorCisgcHJpdmF0ZToKKyAgRmFpbHVyZVR5cGUgZmFpbHVyZV9pbl9zZXRfdXBfOworICBib29sIHNldF91cF93YXNfcnVuXzsKKyAgYm9vbCB0ZWFyX2Rvd25fd2FzX3J1bl87Cit9OworCisvLyBXYXMgdGhlIFRFU1QgcnVuPworYm9vbCB0ZXN0X3dhc19ydW47CisKKy8vIFRoZSBzb2xlIHB1cnBvc2Ugb2YgdGhpcyBURVNUIGlzIHRvIGVuYWJsZSB1cyB0byBjaGVjayB3aGV0aGVyIGl0CisvLyB3YXMgcnVuLgorVEVTVChGb29UZXN0LCBCYXIpIHsKKyAgdGVzdF93YXNfcnVuID0gdHJ1ZTsKK30KKworLy8gUHJpbnRzIHRoZSBtZXNzYWdlIGFuZCBhYm9ydHMgdGhlIHByb2dyYW0gaWYgY29uZGl0aW9uIGlzIGZhbHNlLgordm9pZCBDaGVjayhib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogbXNnKSB7CisgIGlmICghY29uZGl0aW9uKSB7CisgICAgcHJpbnRmKCJGQUlMRUQ6ICVzXG4iLCBtc2cpOworICAgIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgfQorfQorCisvLyBSdW5zIHRoZSB0ZXN0cy4gIFJldHVybiB0cnVlIGlmZiBzdWNjZXNzZnVsLgorLy8KKy8vIFRoZSAnZmFpbHVyZScgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdHlwZSBvZiBmYWlsdXJlIHRoYXQgc2hvdWxkCisvLyBiZSBnZW5lcmF0ZWQgYnkgdGhlIGdsb2JhbCBzZXQtdXAuCitpbnQgUnVuQWxsVGVzdHMoTXlFbnZpcm9ubWVudCogZW52LCBGYWlsdXJlVHlwZSBmYWlsdXJlKSB7CisgIGVudi0+UmVzZXQoKTsKKyAgZW52LT5zZXRfZmFpbHVyZV9pbl9zZXRfdXAoZmFpbHVyZSk7CisgIHRlc3Rfd2FzX3J1biA9IGZhbHNlOworICB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPkNsZWFyQWRIb2NUZXN0UmVzdWx0KCk7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIFJlZ2lzdGVycyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LCBhbmQgdmVyaWZpZXMgdGhhdCB0aGUKKyAgLy8gcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHJldHVybnMgaXRzIGFyZ3VtZW50LgorICBNeUVudmlyb25tZW50KiBjb25zdCBlbnYgPSBuZXcgTXlFbnZpcm9ubWVudDsKKyAgQ2hlY2sodGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGVudikgPT0gZW52LAorICAgICAgICAiQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KCkgc2hvdWxkIHJldHVybiBpdHMgYXJndW1lbnQuIik7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBSVU5fQUxMX1RFU1RTKCkgcnVucyB0aGUgdGVzdHMgd2hlbiB0aGUgZ2xvYmFsCisgIC8vIHNldC11cCBpcyBzdWNjZXNzZnVsLgorICBDaGVjayhSdW5BbGxUZXN0cyhlbnYsIE5PX0ZBSUxVUkUpICE9IDAsCisgICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgdGhlIGdsb2JhbCB0ZWFyLWRvd24gIgorICAgICAgICAic2hvdWxkIGdlbmVyYXRlIGEgZmFpbHVyZS4iKTsKKyAgQ2hlY2sodGVzdF93YXNfcnVuLAorICAgICAgICAiVGhlIHRlc3RzIHNob3VsZCBydW4sIGFzIHRoZSBnbG9iYWwgc2V0LXVwIHNob3VsZCBnZW5lcmF0ZSBubyAiCisgICAgICAgICJmYWlsdXJlIik7CisgIENoZWNrKGVudi0+dGVhcl9kb3duX3dhc19ydW4oKSwKKyAgICAgICAgIlRoZSBnbG9iYWwgdGVhci1kb3duIHNob3VsZCBydW4sIGFzIHRoZSBnbG9iYWwgc2V0LXVwIHdhcyBydW4uIik7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBSVU5fQUxMX1RFU1RTKCkgcnVucyB0aGUgdGVzdHMgd2hlbiB0aGUgZ2xvYmFsCisgIC8vIHNldC11cCBnZW5lcmF0ZXMgbm8gZmF0YWwgZmFpbHVyZS4KKyAgQ2hlY2soUnVuQWxsVGVzdHMoZW52LCBOT05fRkFUQUxfRkFJTFVSRSkgIT0gMCwKKyAgICAgICAgIlJVTl9BTExfVEVTVFMoKSBzaG91bGQgcmV0dXJuIG5vbi16ZXJvLCBhcyBib3RoIHRoZSBnbG9iYWwgc2V0LXVwICIKKyAgICAgICAgImFuZCB0aGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgZ2VuZXJhdGUgYSBub24tZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2sodGVzdF93YXNfcnVuLAorICAgICAgICAiVGhlIHRlc3RzIHNob3VsZCBydW4sIGFzIHRoZSBnbG9iYWwgc2V0LXVwIHNob3VsZCBnZW5lcmF0ZSBubyAiCisgICAgICAgICJmYXRhbCBmYWlsdXJlLiIpOworICBDaGVjayhlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCB3YXMgcnVuLiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgbm8gdGVzdCB3aGVuIHRoZSBnbG9iYWwgc2V0LXVwCisgIC8vIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUuCisgIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgRkFUQUxfRkFJTFVSRSkgIT0gMCwKKyAgICAgICAgIlJVTl9BTExfVEVTVFMoKSBzaG91bGQgcmV0dXJuIG5vbi16ZXJvLCBhcyB0aGUgZ2xvYmFsIHNldC11cCAiCisgICAgICAgICJzaG91bGQgZ2VuZXJhdGUgYSBmYXRhbCBmYWlsdXJlLiIpOworICBDaGVjayghdGVzdF93YXNfcnVuLAorICAgICAgICAiVGhlIHRlc3RzIHNob3VsZCBub3QgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgIgorICAgICAgICAiYSBmYXRhbCBmYWlsdXJlLiIpOworICBDaGVjayhlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCB3YXMgcnVuLiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIGRvZXNuJ3QgZG8gZ2xvYmFsIHNldC11cCBvcgorICAvLyB0ZWFyLWRvd24gd2hlbiB0aGVyZSBpcyBubyB0ZXN0IHRvIHJ1bi4KKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhmaWx0ZXIpID0gIi0qIjsKKyAgQ2hlY2soUnVuQWxsVGVzdHMoZW52LCBOT19GQUlMVVJFKSA9PSAwLAorICAgICAgICAiUlVOX0FMTF9URVNUUygpIHNob3VsZCByZXR1cm4gemVybywgYXMgdGhlcmUgaXMgbm8gdGVzdCB0byBydW4uIik7CisgIENoZWNrKCFlbnYtPnNldF91cF93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHNldC11cCBzaG91bGQgbm90IHJ1biwgYXMgdGhlcmUgaXMgbm8gdGVzdCB0byBydW4uIik7CisgIENoZWNrKCFlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgbm90IHJ1biwgIgorICAgICAgICAiYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIG5vdCBydW4uIik7CisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZDFhNzcwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weQpAQCAtMCwwICsxLDYzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0IHRlc3QgZmlsdGVycy4KKworQSB1c2VyIGNhbiBzcGVjaWZ5IHdoaWNoIHRlc3QocykgaW4gYSBHb29nbGUgVGVzdCBwcm9ncmFtIHRvIHJ1biB2aWEgZWl0aGVyCit0aGUgR1RFU1RfRklMVEVSIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZSAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVGhpcyBzY3JpcHQgdGVzdHMgc3VjaCBmdW5jdGlvbmFsaXR5IGJ5IGludm9raW5nCitndGVzdF9maWx0ZXJfdW5pdHRlc3RfIChhIHByb2dyYW0gd3JpdHRlbiB3aXRoIEdvb2dsZSBUZXN0KSB3aXRoIGRpZmZlcmVudAorZW52aXJvbm1lbnRzIGFuZCBjb21tYW5kIGxpbmUgZmxhZ3MuCisKK05vdGUgdGhhdCB0ZXN0IHNoYXJkaW5nIG1heSBhbHNvIGluZmx1ZW5jZSB3aGljaCB0ZXN0cyBhcmUgZmlsdGVyZWQuIFRoZXJlZm9yZSwKK3dlIHRlc3QgdGhhdCBoZXJlIGFsc28uCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzZXRzCitpbXBvcnQgc3lzCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKyMgQ29uc3RhbnRzLgorCisjIENoZWNrcyBpZiB0aGlzIHBsYXRmb3JtIGNhbiBwYXNzIGVtcHR5IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBjaGlsZAorIyBwcm9jZXNzZXMuICBXZSBzZXQgYW4gZW52IHZhcmlhYmxlIHRvIGFuIGVtcHR5IHN0cmluZyBhbmQgaW52b2tlIGEgcHl0aG9uCisjIHNjcmlwdCBpbiBhIHN1YnByb2Nlc3MgdG8gcHJpbnQgd2hldGhlciB0aGUgdmFyaWFibGUgaXMgU1RJTEwgaW4KKyMgb3MuZW52aXJvbi4gIFdlIHRoZW4gdXNlICdldmFsJyB0byBwYXJzZSB0aGUgY2hpbGQncyBvdXRwdXQgc28gdGhhdCBhbgorIyBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbnB1dCBpcyBhbnl0aGluZyBvdGhlciB0aGFuICdUcnVlJyBub3IgJ0ZhbHNlJy4KK29zLmVudmlyb25bJ0VNUFRZX1ZBUiddID0gJycKK2NoaWxkID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ2ltcG9ydCBvczsgcHJpbnQgXCdFTVBUWV9WQVJcJyBpbiBvcy5lbnZpcm9uJ10pCitDQU5fUEFTU19FTVBUWV9FTlYgPSBldmFsKGNoaWxkLm91dHB1dCkKKworCisjIENoZWNrIGlmIHRoaXMgcGxhdGZvcm0gY2FuIHVuc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBjaGlsZCBwcm9jZXNzZXMuCisjIFdlIHNldCBhbiBlbnYgdmFyaWFibGUgdG8gYSBub24tZW1wdHkgc3RyaW5nLCB1bnNldCBpdCwgYW5kIGludm9rZQorIyBhIHB5dGhvbiBzY3JpcHQgaW4gYSBzdWJwcm9jZXNzIHRvIHByaW50IHdoZXRoZXIgdGhlIHZhcmlhYmxlCisjIGlzIE5PIExPTkdFUiBpbiBvcy5lbnZpcm9uLgorIyBXZSB1c2UgJ2V2YWwnIHRvIHBhcnNlIHRoZSBjaGlsZCdzIG91dHB1dCBzbyB0aGF0IGFuIGV4Y2VwdGlvbgorIyBpcyB0aHJvd24gaWYgdGhlIGlucHV0IGlzIG5laXRoZXIgJ1RydWUnIG5vciAnRmFsc2UnLgorb3MuZW52aXJvblsnVU5TRVRfVkFSJ10gPSAnWCcKK2RlbCBvcy5lbnZpcm9uWydVTlNFVF9WQVInXQorY2hpbGQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgW3N5cy5leGVjdXRhYmxlLCAnLWMnLCAnaW1wb3J0IG9zOyBwcmludCBcJ1VOU0VUX1ZBUlwnIG5vdCBpbiBvcy5lbnZpcm9uJ10pCitDQU5fVU5TRVRfRU5WID0gZXZhbChjaGlsZC5vdXRwdXQpCisKKworIyBDaGVja3MgaWYgd2Ugc2hvdWxkIHRlc3Qgd2l0aCBhbiBlbXB0eSBmaWx0ZXIuIFRoaXMgZG9lc24ndAorIyBtYWtlIHNlbnNlIG9uIHBsYXRmb3JtcyB0aGF0IGNhbm5vdCBwYXNzIGVtcHR5IGVudiB2YXJpYWJsZXMgKFdpbjMyKQorIyBhbmQgb24gcGxhdGZvcm1zIHRoYXQgY2Fubm90IHVuc2V0IHZhcmlhYmxlcyAoc2luY2Ugd2UgY2Fubm90IHRlbGwKKyMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiIiBhbmQgTlVMTCAtLSBCb3JsYW5kIGFuZCBTb2xhcmlzIDwgNS4xMCkKK0NBTl9URVNUX0VNUFRZX0ZJTFRFUiA9IChDQU5fUEFTU19FTVBUWV9FTlYgYW5kIENBTl9VTlNFVF9FTlYpCisKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHNwZWNpZnlpbmcgdGhlIHRlc3QgZmlsdGVycy4KK0ZJTFRFUl9FTlZfVkFSID0gJ0dURVNUX0ZJTFRFUicKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0ZXN0IHNoYXJkaW5nLgorVE9UQUxfU0hBUkRTX0VOVl9WQVIgPSAnR1RFU1RfVE9UQUxfU0hBUkRTJworU0hBUkRfSU5ERVhfRU5WX1ZBUiA9ICdHVEVTVF9TSEFSRF9JTkRFWCcKK1NIQVJEX1NUQVRVU19GSUxFX0VOVl9WQVIgPSAnR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUnCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBzcGVjaWZ5aW5nIHRoZSB0ZXN0IGZpbHRlcnMuCitGSUxURVJfRkxBRyA9ICdndGVzdF9maWx0ZXInCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBpbmNsdWRpbmcgZGlzYWJsZWQgdGVzdHMuCitBTFNPX1JVTl9ESVNBQkVEX1RFU1RTX0ZMQUcgPSAnZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMnCisKKyMgQ29tbWFuZCB0byBydW4gdGhlIGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gcHJvZ3JhbS4KK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XycpCisKKyMgUmVnZXggZm9yIGRldGVybWluaW5nIHdoZXRoZXIgcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCBpbiB0aGUgYmluYXJ5LgorUEFSQU1fVEVTVF9SRUdFWCA9IHJlLmNvbXBpbGUocicvUGFyYW1UZXN0JykKKworIyBSZWdleCBmb3IgcGFyc2luZyB0ZXN0IGNhc2UgbmFtZXMgZnJvbSBHb29nbGUgVGVzdCdzIG91dHB1dC4KK1RFU1RfQ0FTRV9SRUdFWCA9IHJlLmNvbXBpbGUocideXFtcLStcXSBcZCsgdGVzdHM/IGZyb20gKFx3KygvXHcrKT8pJykKKworIyBSZWdleCBmb3IgcGFyc2luZyB0ZXN0IG5hbWVzIGZyb20gR29vZ2xlIFRlc3QncyBvdXRwdXQuCitURVNUX1JFR0VYID0gcmUuY29tcGlsZShyJ15cW1xzKlJVTlxzKlxdLipcLihcdysoL1x3Kyk/KScpCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIHRvIHRlbGwgR29vZ2xlIFRlc3QgdG8gb3V0cHV0IHRoZSBsaXN0IG9mIHRlc3RzIGl0CisjIHdpbGwgcnVuLgorTElTVF9URVNUU19GTEFHID0gJy0tZ3Rlc3RfbGlzdF90ZXN0cycKKworIyBJbmRpY2F0ZXMgd2hldGhlciBHb29nbGUgVGVzdCBzdXBwb3J0cyBkZWF0aCB0ZXN0cy4KK1NVUFBPUlRTX0RFQVRIX1RFU1RTID0gJ0hhc0RlYXRoVGVzdCcgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtDT01NQU5ELCBMSVNUX1RFU1RTX0ZMQUddKS5vdXRwdXQKKworIyBGdWxsIG5hbWVzIG9mIGFsbCB0ZXN0cyBpbiBndGVzdF9maWx0ZXJfdW5pdHRlc3RzXy4KK1BBUkFNX1RFU1RTID0gWworICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMScsCisgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8xJywKKyAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RYLzEnLAorICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFkvMScsCisgICAgXQorCitESVNBQkxFRF9URVNUUyA9IFsKKyAgICAnQmFyVGVzdC5ESVNBQkxFRF9UZXN0Rm91cicsCisgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZpdmUnLAorICAgICdCYXpUZXN0LkRJU0FCTEVEX1Rlc3RDJywKKyAgICAnRElTQUJMRURfRm9vYmFyVGVzdC5UZXN0MScsCisgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuRElTQUJMRURfVGVzdDInLAorICAgICdESVNBQkxFRF9Gb29iYXJiYXpUZXN0LlRlc3RBJywKKyAgICBdCisKK2lmIFNVUFBPUlRTX0RFQVRIX1RFU1RTOgorICBERUFUSF9URVNUUyA9IFsKKyAgICAnSGFzRGVhdGhUZXN0LlRlc3QxJywKKyAgICAnSGFzRGVhdGhUZXN0LlRlc3QyJywKKyAgICBdCitlbHNlOgorICBERUFUSF9URVNUUyA9IFtdCisKKyMgQWxsIHRoZSBub24tZGlzYWJsZWQgdGVzdHMuCitBQ1RJVkVfVEVTVFMgPSBbCisgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAnRm9vVGVzdC5YeXonLAorCisgICAgJ0JhclRlc3QuVGVzdE9uZScsCisgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKworICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAnQmF6VGVzdC5UZXN0QicsCisgICAgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMKKworcGFyYW1fdGVzdHNfcHJlc2VudCA9IE5vbmUKKworIyBVdGlsaXRpZXMuCisKK2Vudmlyb24gPSBvcy5lbnZpcm9uLmNvcHkoKQorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIHRoZSBlbnYgdmFyaWFibGUgdG8gJ3ZhbHVlJzsgdW5zZXRzIGl0IHdoZW4gJ3ZhbHVlJyBpcyBOb25lLiIiIgorCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIGVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gZW52aXJvbjoKKyAgICBkZWwgZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBSdW5BbmRSZXR1cm5PdXRwdXQoYXJncyA9IE5vbmUpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgaXRzIG91dHB1dC4iIiIKKworICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtDT01NQU5EXSArIChhcmdzIG9yIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52aXJvbikub3V0cHV0CisKKworZGVmIFJ1bkFuZEV4dHJhY3RUZXN0TGlzdChhcmdzID0gTm9uZSk6CisgICIiIlJ1bnMgdGhlIHRlc3QgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlIGFuZCBhIGxpc3Qgb2YgdGVzdHMgcnVuLiIiIgorCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgKGFyZ3Mgb3IgW10pLCBlbnY9ZW52aXJvbikKKyAgdGVzdHNfcnVuID0gW10KKyAgdGVzdF9jYXNlID0gJycKKyAgdGVzdCA9ICcnCisgIGZvciBsaW5lIGluIHAub3V0cHV0LnNwbGl0KCdcbicpOgorICAgIG1hdGNoID0gVEVTVF9DQVNFX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CisgICAgICB0ZXN0X2Nhc2UgPSBtYXRjaC5ncm91cCgxKQorICAgIGVsc2U6CisgICAgICBtYXRjaCA9IFRFU1RfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgIGlmIG1hdGNoIGlzIG5vdCBOb25lOgorICAgICAgICB0ZXN0ID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgdGVzdHNfcnVuLmFwcGVuZCh0ZXN0X2Nhc2UgKyAnLicgKyB0ZXN0KQorICByZXR1cm4gKHRlc3RzX3J1biwgcC5leGl0X2NvZGUpCisKKworZGVmIEludm9rZVdpdGhNb2RpZmllZEVudihleHRyYV9lbnYsIGZ1bmN0aW9uLCAqYXJncywgKiprd2FyZ3MpOgorICAiIiJSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGluIGEgbW9kaWZpZWQgZW52aXJvbm1lbnQuIiIiCisgIHRyeToKKyAgICBvcmlnaW5hbF9lbnYgPSBlbnZpcm9uLmNvcHkoKQorICAgIGVudmlyb24udXBkYXRlKGV4dHJhX2VudikKKyAgICByZXR1cm4gZnVuY3Rpb24oKmFyZ3MsICoqa3dhcmdzKQorICBmaW5hbGx5OgorICAgIGVudmlyb24uY2xlYXIoKQorICAgIGVudmlyb24udXBkYXRlKG9yaWdpbmFsX2VudikKKworCitkZWYgUnVuV2l0aFNoYXJkaW5nKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsIGNvbW1hbmQpOgorICAiIiJSdW5zIGEgdGVzdCBwcm9ncmFtIHNoYXJkIGFuZCByZXR1cm5zIGV4aXQgY29kZSBhbmQgYSBsaXN0IG9mIHRlc3RzIHJ1bi4iIiIKKworICBleHRyYV9lbnYgPSB7U0hBUkRfSU5ERVhfRU5WX1ZBUjogc3RyKHNoYXJkX2luZGV4KSwKKyAgICAgICAgICAgICAgIFRPVEFMX1NIQVJEU19FTlZfVkFSOiBzdHIodG90YWxfc2hhcmRzKX0KKyAgcmV0dXJuIEludm9rZVdpdGhNb2RpZmllZEVudihleHRyYV9lbnYsIFJ1bkFuZEV4dHJhY3RUZXN0TGlzdCwgY29tbWFuZCkKKworIyBUaGUgdW5pdCB0ZXN0LgorCisKK2NsYXNzIEdUZXN0RmlsdGVyVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRoZSBlbnYgdmFyaWFibGUgb3IgdGhlIGNvbW1hbmQgbGluZSBmbGFnIHRvIGZpbHRlciB0ZXN0cy4iIiIKKworICAjIFV0aWxpdGllcy4KKworICBkZWYgQXNzZXJ0U2V0RXF1YWwoc2VsZiwgbGhzLCByaHMpOgorICAgICIiIkFzc2VydHMgdGhhdCB0d28gc2V0cyBhcmUgZXF1YWwuIiIiCisKKyAgICBmb3IgZWxlbSBpbiBsaHM6CisgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiByaHMsICclcyBpbiAlcycgJSAoZWxlbSwgcmhzKSkKKworICAgIGZvciBlbGVtIGluIHJoczoKKyAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIGluIGxocywgJyVzIGluICVzJyAlIChlbGVtLCBsaHMpKQorCisgIGRlZiBBc3NlcnRQYXJ0aXRpb25Jc1ZhbGlkKHNlbGYsIHNldF92YXIsIGxpc3Rfb2Zfc2V0cyk6CisgICAgIiIiQXNzZXJ0cyB0aGF0IGxpc3Rfb2Zfc2V0cyBpcyBhIHZhbGlkIHBhcnRpdGlvbiBvZiBzZXRfdmFyLiIiIgorCisgICAgZnVsbF9wYXJ0aXRpb24gPSBbXQorICAgIGZvciBzbGljZV92YXIgaW4gbGlzdF9vZl9zZXRzOgorICAgICAgZnVsbF9wYXJ0aXRpb24uZXh0ZW5kKHNsaWNlX3ZhcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXRfdmFyKSwgbGVuKGZ1bGxfcGFydGl0aW9uKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNldHMuU2V0KHNldF92YXIpLCBzZXRzLlNldChmdWxsX3BhcnRpdGlvbikpCisKKyAgZGVmIEFkanVzdEZvclBhcmFtZXRlcml6ZWRUZXN0cyhzZWxmLCB0ZXN0c190b19ydW4pOgorICAgICIiIkFkanVzdCB0ZXN0c190b19ydW4gaW4gY2FzZSB2YWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBkaXNhYmxlZC4iIiIKKworICAgIGdsb2JhbCBwYXJhbV90ZXN0c19wcmVzZW50CisgICAgaWYgbm90IHBhcmFtX3Rlc3RzX3ByZXNlbnQ6CisgICAgICByZXR1cm4gbGlzdChzZXRzLlNldCh0ZXN0c190b19ydW4pIC0gc2V0cy5TZXQoUEFSQU1fVEVTVFMpKQorICAgIGVsc2U6CisgICAgICByZXR1cm4gdGVzdHNfdG9fcnVuCisKKyAgZGVmIFJ1bkFuZFZlcmlmeShzZWxmLCBndGVzdF9maWx0ZXIsIHRlc3RzX3RvX3J1bik6CisgICAgIiIiQ2hlY2tzIHRoYXQgdGhlIGJpbmFyeSBydW5zIGNvcnJlY3Qgc2V0IG9mIHRlc3RzIGZvciBhIGdpdmVuIGZpbHRlci4iIiIKKworICAgIHRlc3RzX3RvX3J1biA9IHNlbGYuQWRqdXN0Rm9yUGFyYW1ldGVyaXplZFRlc3RzKHRlc3RzX3RvX3J1bikKKworICAgICMgRmlyc3QsIHRlc3RzIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgICMgV2luZG93cyByZW1vdmVzIGVtcHR5IHZhcmlhYmxlcyBmcm9tIHRoZSBlbnZpcm9ubWVudCB3aGVuIHBhc3NpbmcgaXQKKyAgICAjIHRvIGEgbmV3IHByb2Nlc3MuICBUaGlzIG1lYW5zIGl0IGlzIGltcG9zc2libGUgdG8gcGFzcyBhbiBlbXB0eSBmaWx0ZXIKKyAgICAjIGludG8gYSBwcm9jZXNzIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEhvd2V2ZXIsIHdlIGNhbiBzdGlsbAorICAgICMgdGVzdCB0aGUgY2FzZSB3aGVuIHRoZSB2YXJpYWJsZSBpcyBub3Qgc3VwcGxpZWQgKGkuZS4sIGd0ZXN0X2ZpbHRlciBpcworICAgICMgTm9uZSkuCisgICAgIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2NDAzCisgICAgaWYgQ0FOX1RFU1RfRU1QVFlfRklMVEVSIG9yIGd0ZXN0X2ZpbHRlciAhPSAnJzoKKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgZ3Rlc3RfZmlsdGVyKQorICAgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KClbMF0KKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgTm9uZSkKKyAgICAgIHNlbGYuQXNzZXJ0U2V0RXF1YWwodGVzdHNfcnVuLCB0ZXN0c190b19ydW4pCisgICAgIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzY0MDMKKworICAgICMgTmV4dCwgdGVzdHMgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBmbGFnLgorCisgICAgaWYgZ3Rlc3RfZmlsdGVyIGlzIE5vbmU6CisgICAgICBhcmdzID0gW10KKyAgICBlbHNlOgorICAgICAgYXJncyA9IFsnLS0lcz0lcycgJSAoRklMVEVSX0ZMQUcsIGd0ZXN0X2ZpbHRlcildCisKKyAgICB0ZXN0c19ydW4gPSBSdW5BbmRFeHRyYWN0VGVzdExpc3QoYXJncylbMF0KKyAgICBzZWxmLkFzc2VydFNldEVxdWFsKHRlc3RzX3J1biwgdGVzdHNfdG9fcnVuKQorCisgIGRlZiBSdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoc2VsZiwgZ3Rlc3RfZmlsdGVyLCB0b3RhbF9zaGFyZHMsIHRlc3RzX3RvX3J1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPU5vbmUsIGNoZWNrX2V4aXRfMD1GYWxzZSk6CisgICAgIiIiQ2hlY2tzIHRoYXQgYmluYXJ5IHJ1bnMgY29ycmVjdCB0ZXN0cyBmb3IgdGhlIGdpdmVuIGZpbHRlciBhbmQgc2hhcmQuCisKKyAgICBSdW5zIGFsbCBzaGFyZHMgb2YgZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyB3aXRoIHRoZSBnaXZlbiBmaWx0ZXIsIGFuZAorICAgIHZlcmlmaWVzIHRoYXQgdGhlIHJpZ2h0IHNldCBvZiB0ZXN0cyB3ZXJlIHJ1bi4gVGhlIHVuaW9uIG9mIHRlc3RzIHJ1bgorICAgIG9uIGVhY2ggc2hhcmQgc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0ZXN0c190b19ydW4sIHdpdGhvdXQgZHVwbGljYXRlcy4KKworICAgIEFyZ3M6CisgICAgICBndGVzdF9maWx0ZXI6IEEgZmlsdGVyIHRvIGFwcGx5IHRvIHRoZSB0ZXN0cy4KKyAgICAgIHRvdGFsX3NoYXJkczogQSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzIHRvIHNwbGl0IHRlc3QgcnVuIGludG8uCisgICAgICB0ZXN0c190b19ydW46IEEgc2V0IG9mIHRlc3RzIGV4cGVjdGVkIHRvIHJ1bi4KKyAgICAgIGFyZ3MgICA6ICAgICAgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRvIHRoZSB0ZXN0IGJpbmFyeS4KKyAgICAgIGNoZWNrX2V4aXRfMDogV2hlbiBzZXQgdG8gYSB0cnVlIHZhbHVlLCBtYWtlIHN1cmUgdGhhdCBhbGwgc2hhcmRzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLgorICAgICIiIgorCisgICAgdGVzdHNfdG9fcnVuID0gc2VsZi5BZGp1c3RGb3JQYXJhbWV0ZXJpemVkVGVzdHModGVzdHNfdG9fcnVuKQorCisgICAgIyBXaW5kb3dzIHJlbW92ZXMgZW1wdHkgdmFyaWFibGVzIGZyb20gdGhlIGVudmlyb25tZW50IHdoZW4gcGFzc2luZyBpdAorICAgICMgdG8gYSBuZXcgcHJvY2Vzcy4gIFRoaXMgbWVhbnMgaXQgaXMgaW1wb3NzaWJsZSB0byBwYXNzIGFuIGVtcHR5IGZpbHRlcgorICAgICMgaW50byBhIHByb2Nlc3MgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSG93ZXZlciwgd2UgY2FuIHN0aWxsCisgICAgIyB0ZXN0IHRoZSBjYXNlIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG5vdCBzdXBwbGllZCAoaS5lLiwgZ3Rlc3RfZmlsdGVyIGlzCisgICAgIyBOb25lKS4KKyAgICAjIHB5bGludDogZGlzYWJsZS1tc2c9QzY0MDMKKyAgICBpZiBDQU5fVEVTVF9FTVBUWV9GSUxURVIgb3IgZ3Rlc3RfZmlsdGVyICE9ICcnOgorICAgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCBndGVzdF9maWx0ZXIpCisgICAgICBwYXJ0aXRpb24gPSBbXQorICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgdG90YWxfc2hhcmRzKToKKyAgICAgICAgKHRlc3RzX3J1biwgZXhpdF9jb2RlKSA9IFJ1bldpdGhTaGFyZGluZyh0b3RhbF9zaGFyZHMsIGksIGFyZ3MpCisgICAgICAgIGlmIGNoZWNrX2V4aXRfMDoKKyAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4aXRfY29kZSkKKyAgICAgICAgcGFydGl0aW9uLmFwcGVuZCh0ZXN0c19ydW4pCisKKyAgICAgIHNlbGYuQXNzZXJ0UGFydGl0aW9uSXNWYWxpZCh0ZXN0c190b19ydW4sIHBhcnRpdGlvbikKKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgTm9uZSkKKyAgICAjIHB5bGludDogZW5hYmxlLW1zZz1DNjQwMworCisgIGRlZiBSdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKHNlbGYsIGd0ZXN0X2ZpbHRlciwgdGVzdHNfdG9fcnVuKToKKyAgICAiIiJDaGVja3MgdGhhdCB0aGUgYmluYXJ5IHJ1bnMgY29ycmVjdCBzZXQgb2YgdGVzdHMgZm9yIHRoZSBnaXZlbiBmaWx0ZXIuCisKKyAgICBSdW5zIGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gd2l0aCB0aGUgZ2l2ZW4gZmlsdGVyLCBhbmQgZW5hYmxlcworICAgIGRpc2FibGVkIHRlc3RzLiBWZXJpZmllcyB0aGF0IHRoZSByaWdodCBzZXQgb2YgdGVzdHMgd2VyZSBydW4uCisKKyAgICBBcmdzOgorICAgICAgZ3Rlc3RfZmlsdGVyOiBBIGZpbHRlciB0byBhcHBseSB0byB0aGUgdGVzdHMuCisgICAgICB0ZXN0c190b19ydW46IEEgc2V0IG9mIHRlc3RzIGV4cGVjdGVkIHRvIHJ1bi4KKyAgICAiIiIKKworICAgIHRlc3RzX3RvX3J1biA9IHNlbGYuQWRqdXN0Rm9yUGFyYW1ldGVyaXplZFRlc3RzKHRlc3RzX3RvX3J1bikKKworICAgICMgQ29uc3RydWN0IHRoZSBjb21tYW5kIGxpbmUuCisgICAgYXJncyA9IFsnLS0lcycgJSBBTFNPX1JVTl9ESVNBQkVEX1RFU1RTX0ZMQUddCisgICAgaWYgZ3Rlc3RfZmlsdGVyIGlzIG5vdCBOb25lOgorICAgICAgYXJncy5hcHBlbmQoJy0tJXM9JXMnICUgKEZJTFRFUl9GTEFHLCBndGVzdF9maWx0ZXIpKQorCisgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KGFyZ3MpWzBdCisgICAgc2VsZi5Bc3NlcnRTZXRFcXVhbCh0ZXN0c19ydW4sIHRlc3RzX3RvX3J1bikKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgIiIiU2V0cyB1cCB0ZXN0IGNhc2UuCisKKyAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCBpbiB0aGUgYmluYXJ5IGFuZAorICAgIHNldHMgdGhlIGZsYWdzIGFjY29yZGluZ2x5LgorICAgICIiIgorCisgICAgZ2xvYmFsIHBhcmFtX3Rlc3RzX3ByZXNlbnQKKyAgICBpZiBwYXJhbV90ZXN0c19wcmVzZW50IGlzIE5vbmU6CisgICAgICBwYXJhbV90ZXN0c19wcmVzZW50ID0gUEFSQU1fVEVTVF9SRUdFWC5zZWFyY2goCisgICAgICAgICAgUnVuQW5kUmV0dXJuT3V0cHV0KCkpIGlzIG5vdCBOb25lCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3Ioc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGJlaGF2aW9yIG9mIG5vdCBzcGVjaWZ5aW5nIHRoZSBmaWx0ZXIuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShOb25lLCBBQ1RJVkVfVEVTVFMpCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3JXaXRoU2hhcmRzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciB3aXRob3V0IHRoZSBmaWx0ZXIsIHdpdGggc2hhcmRpbmcgZW5hYmxlZC4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIDEsIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCAyLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgbGVuKEFDVElWRV9URVNUUykgLSAxLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgbGVuKEFDVElWRV9URVNUUyksIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCBsZW4oQUNUSVZFX1RFU1RTKSArIDEsIEFDVElWRV9URVNUUykKKworICBkZWYgdGVzdEVtcHR5RmlsdGVyKHNlbGYpOgorICAgICIiIlRlc3RzIGFuIGVtcHR5IGZpbHRlci4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcnLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZygnJywgMSwgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJycsIDIsIFtdKQorCisgIGRlZiB0ZXN0QmFkRmlsdGVyKHNlbGYpOgorICAgICIiIlRlc3RzIGEgZmlsdGVyIHRoYXQgbWF0Y2hlcyBub3RoaW5nLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0JhZEZpbHRlcicsIFtdKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnQmFkRmlsdGVyJywgW10pCisKKyAgZGVmIHRlc3RGdWxsTmFtZShzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJpbmcgYnkgZnVsbCBuYW1lLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0Zvb1Rlc3QuWHl6JywgWydGb29UZXN0Llh5eiddKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnRm9vVGVzdC5YeXonLCBbJ0Zvb1Rlc3QuWHl6J10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJ0Zvb1Rlc3QuWHl6JywgNSwgWydGb29UZXN0Llh5eiddKQorCisgIGRlZiB0ZXN0VW5pdmVyc2FsRmlsdGVycyhzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJzIHRoYXQgbWF0Y2ggZXZlcnl0aGluZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqJywgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLionLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJyouKicsIGxlbihBQ1RJVkVfVEVTVFMpIC0gMywgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnKicsIEFDVElWRV9URVNUUyArIERJU0FCTEVEX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnKi4qJywgQUNUSVZFX1RFU1RTICsgRElTQUJMRURfVEVTVFMpCisKKyAgZGVmIHRlc3RGaWx0ZXJCeVRlc3RDYXNlKHNlbGYpOgorICAgICIiIlRlc3RzIGZpbHRlcmluZyBieSB0ZXN0IGNhc2UgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdGb29UZXN0LionLCBbJ0Zvb1Rlc3QuQWJjJywgJ0Zvb1Rlc3QuWHl6J10pCisKKyAgICBCQVpfVEVTVFMgPSBbJ0JhelRlc3QuVGVzdE9uZScsICdCYXpUZXN0LlRlc3RBJywgJ0JhelRlc3QuVGVzdEInXQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdCYXpUZXN0LionLCBCQVpfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdCYXpUZXN0LionLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVpfVEVTVFMgKyBbJ0JhelRlc3QuRElTQUJMRURfVGVzdEMnXSkKKworICBkZWYgdGVzdEZpbHRlckJ5VGVzdChzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJpbmcgYnkgdGVzdCBuYW1lLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyouVGVzdE9uZScsIFsnQmFyVGVzdC5UZXN0T25lJywgJ0JhelRlc3QuVGVzdE9uZSddKQorCisgIGRlZiB0ZXN0RmlsdGVyRGlzYWJsZWRUZXN0cyhzZWxmKToKKyAgICAiIiJTZWxlY3Qgb25seSB0aGUgZGlzYWJsZWQgdGVzdHMgdG8gcnVuLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnXSkKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqRElTQUJMRURfKicsIFtdKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnKkRJU0FCTEVEXyonLCBESVNBQkxFRF9URVNUUykKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLkRJU0FCTEVEXyonLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJyouRElTQUJMRURfKicsIFsKKyAgICAgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZvdXInLAorICAgICAgICAnQmFyVGVzdC5ESVNBQkxFRF9UZXN0Rml2ZScsCisgICAgICAgICdCYXpUZXN0LkRJU0FCTEVEX1Rlc3RDJywKKyAgICAgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuRElTQUJMRURfVGVzdDInLAorICAgICAgICBdKQorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0RJU0FCTEVEXyonLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0RJU0FCTEVEXyonLCBbCisgICAgICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJywKKyAgICAgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuRElTQUJMRURfVGVzdDInLAorICAgICAgICAnRElTQUJMRURfRm9vYmFyYmF6VGVzdC5UZXN0QScsCisgICAgICAgIF0pCisKKyAgZGVmIHRlc3RXaWxkY2FyZEluVGVzdENhc2VOYW1lKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHdpbGRjYXJkIGluIHRoZSB0ZXN0IGNhc2UgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqYSouKicsIFsKKyAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCisgICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgICdCYXpUZXN0LlRlc3RCJywgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMpCisKKyAgZGVmIHRlc3RXaWxkY2FyZEluVGVzdE5hbWUoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgd2lsZGNhcmQgaW4gdGhlIHRlc3QgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLipBKicsIFsnRm9vVGVzdC5BYmMnLCAnQmF6VGVzdC5UZXN0QSddKQorCisgIGRlZiB0ZXN0RmlsdGVyV2l0aG91dERvdChzZWxmKToKKyAgICAiIiJUZXN0cyBhIGZpbHRlciB0aGF0IGhhcyBubyAnLicgaW4gaXQuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKnoqJywgWworICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgICdCYXpUZXN0LlRlc3RCJywKKyAgICAgICAgXSkKKworICBkZWYgdGVzdFR3b1BhdHRlcm5zKHNlbGYpOgorICAgICIiIlRlc3RzIGZpbHRlcnMgdGhhdCBjb25zaXN0IG9mIHR3byBwYXR0ZXJucy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdGb28qLio6KkEqJywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAgICAgXSkKKworICAgICMgQW4gZW1wdHkgcGF0dGVybiArIGEgbm9uLWVtcHR5IG9uZQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCc6KkEqJywgWydGb29UZXN0LkFiYycsICdCYXpUZXN0LlRlc3RBJ10pCisKKyAgZGVmIHRlc3RUaHJlZVBhdHRlcm5zKHNlbGYpOgorICAgICIiIlRlc3RzIGZpbHRlcnMgdGhhdCBjb25zaXN0IG9mIHRocmVlIHBhdHRlcm5zLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJypvbyo6KkEqOipPbmUnLCBbCisgICAgICAgICdGb29UZXN0LkFiYycsCisgICAgICAgICdGb29UZXN0Llh5eicsCisKKyAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCisKKyAgICAgICAgJ0JhelRlc3QuVGVzdE9uZScsCisgICAgICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAgICAgXSkKKworICAgICMgVGhlIDJuZCBwYXR0ZXJuIGlzIGVtcHR5LgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqb28qOjoqT25lJywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICBdKQorCisgICAgIyBUaGUgbGFzdCAyIHBhdHRlcm5zIGFyZSBlbXB0eS4KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKm9vKjo6JywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorICAgICAgICBdKQorCisgIGRlZiB0ZXN0TmVnYXRpdmVGaWx0ZXJzKHNlbGYpOgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLUJhelRlc3QuVGVzdE9uZScsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisKKyAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QicsCisgICAgICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyotRm9vVGVzdC5BYmM6QmF6VGVzdC4qJywgWworICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKyAgICAgICAgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMpCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnQmFyVGVzdC4qLUJhclRlc3QuVGVzdE9uZScsIFsKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisgICAgICAgIF0pCisKKyAgICAjIFRlc3RzIHdpdGhvdXQgbGVhZGluZyAnKicuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJy1Gb29UZXN0LkFiYzpGb29UZXN0Llh5ejpCYXpUZXN0LionLCBbCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKyAgICAgICAgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMpCisKKyAgICAjIFZhbHVlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyovKicsIFBBUkFNX1RFU1RTKQorCisgICAgIyBWYWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzIGZpbHRlcmluZyBieSB0aGUgc2VxdWVuY2UgbmFtZS4KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnU2VxUC8qJywgWworICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8xJywKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMScsCisgICAgICAgIF0pCisKKyAgICAjIFZhbHVlIHBhcmFtZXRlcml6ZWQgdGVzdHMgZmlsdGVyaW5nIGJ5IHRoZSB0ZXN0IG5hbWUuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyovMCcsIFsKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMCcsCisgICAgICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICBdKQorCisgIGRlZiB0ZXN0RmxhZ092ZXJyaWRlc0VudlZhcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBmaWx0ZXIgZmxhZyBvdmVycmlkZXMgdGhlIGZpbHRlcmluZyBlbnYuIHZhcmlhYmxlLiIiIgorCisgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCAnRm9vKicpCisgICAgYXJncyA9IFsnLS0lcz0lcycgJSAoRklMVEVSX0ZMQUcsICcqT25lJyldCisgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KGFyZ3MpWzBdCisgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCBOb25lKQorCisgICAgc2VsZi5Bc3NlcnRTZXRFcXVhbCh0ZXN0c19ydW4sIFsnQmFyVGVzdC5UZXN0T25lJywgJ0JhelRlc3QuVGVzdE9uZSddKQorCisgIGRlZiB0ZXN0U2hhcmRTdGF0dXNGaWxlSXNDcmVhdGVkKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgdGhlIHNoYXJkIGZpbGUgaXMgY3JlYXRlZCBpZiBzcGVjaWZpZWQgaW4gdGhlIGVudmlyb25tZW50LiIiIgorCisgICAgc2hhcmRfc3RhdHVzX2ZpbGUgPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXJkX3N0YXR1c19maWxlJykKKyAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHNoYXJkX3N0YXR1c19maWxlKSkKKworICAgIGV4dHJhX2VudiA9IHtTSEFSRF9TVEFUVVNfRklMRV9FTlZfVkFSOiBzaGFyZF9zdGF0dXNfZmlsZX0KKyAgICB0cnk6CisgICAgICBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LCBSdW5BbmRSZXR1cm5PdXRwdXQpCisgICAgZmluYWxseToKKyAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzaGFyZF9zdGF0dXNfZmlsZSkpCisgICAgICBvcy5yZW1vdmUoc2hhcmRfc3RhdHVzX2ZpbGUpCisKKyAgZGVmIHRlc3RTaGFyZFN0YXR1c0ZpbGVJc0NyZWF0ZWRXaXRoTGlzdFRlc3RzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgdGhlIHNoYXJkIGZpbGUgaXMgY3JlYXRlZCB3aXRoIHRoZSAibGlzdF90ZXN0cyIgZmxhZy4iIiIKKworICAgIHNoYXJkX3N0YXR1c19maWxlID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFyZF9zdGF0dXNfZmlsZTInKQorICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoc2hhcmRfc3RhdHVzX2ZpbGUpKQorCisgICAgZXh0cmFfZW52ID0ge1NIQVJEX1NUQVRVU19GSUxFX0VOVl9WQVI6IHNoYXJkX3N0YXR1c19maWxlfQorICAgIHRyeToKKyAgICAgIG91dHB1dCA9IEludm9rZVdpdGhNb2RpZmllZEVudihleHRyYV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuQW5kUmV0dXJuT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMSVNUX1RFU1RTX0ZMQUddKQorICAgIGZpbmFsbHk6CisgICAgICAjIFRoaXMgYXNzZXJ0aW9uIGVuc3VyZXMgdGhhdCBHb29nbGUgVGVzdCBlbnVtZXJhdGVkIHRoZSB0ZXN0cyBhcworICAgICAgIyBvcHBvc2VkIHRvIHJ1bm5pbmcgdGhlbS4KKyAgICAgIHNlbGYuYXNzZXJ0XygnWz09PT09PT09PT1dJyBub3QgaW4gb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIG91dHB1dCBkdXJpbmcgdGVzdCBlbnVtZXJhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGVuc3VyZSB0aGF0IExJU1RfVEVTVFNfRkxBRyBpcyBhc3NpZ25lZCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnY29ycmVjdCBmbGFnIHZhbHVlIGZvciBsaXN0aW5nIEdvb2dsZSBUZXN0IHRlc3RzLicpCisKKyAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzaGFyZF9zdGF0dXNfZmlsZSkpCisgICAgICBvcy5yZW1vdmUoc2hhcmRfc3RhdHVzX2ZpbGUpCisKKyAgaWYgU1VQUE9SVFNfREVBVEhfVEVTVFM6CisgICAgZGVmIHRlc3RTaGFyZGluZ1dvcmtzV2l0aERlYXRoVGVzdHMoc2VsZik6CisgICAgICAiIiJUZXN0cyBpbnRlZ3JhdGlvbiB3aXRoIGRlYXRoIHRlc3RzIGFuZCBzaGFyZGluZy4iIiIKKworICAgICAgZ3Rlc3RfZmlsdGVyID0gJ0hhc0RlYXRoVGVzdC4qOlNlcVAvKicKKyAgICAgIGV4cGVjdGVkX3Rlc3RzID0gWworICAgICAgICAgICdIYXNEZWF0aFRlc3QuVGVzdDEnLAorICAgICAgICAgICdIYXNEZWF0aFRlc3QuVGVzdDInLAorCisgICAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8xJywKKyAgICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMCcsCisgICAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzEnLAorICAgICAgICAgIF0KKworICAgICAgZm9yIGZsYWcgaW4gWyctLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9dGhyZWFkc2FmZScsCisgICAgICAgICAgICAgICAgICAgJy0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT1mYXN0J106CisgICAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKGd0ZXN0X2ZpbHRlciwgMywgZXhwZWN0ZWRfdGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2V4aXRfMD1UcnVlLCBhcmdzPVtmbGFnXSkKKyAgICAgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoZ3Rlc3RfZmlsdGVyLCA1LCBleHBlY3RlZF90ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfZXhpdF8wPVRydWUsIGFyZ3M9W2ZsYWddKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RlZmZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8uY2MKQEAgLTAsMCArMSwxNDAgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QgdGVzdCBmaWx0ZXJzLgorLy8KKy8vIEEgdXNlciBjYW4gc3BlY2lmeSB3aGljaCB0ZXN0KHMpIGluIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSB0byBydW4gdmlhCisvLyBlaXRoZXIgdGhlIEdURVNUX0ZJTFRFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGZsYWcuICBUaGlzIGlzIHVzZWQgZm9yIHRlc3Rpbmcgc3VjaCBmdW5jdGlvbmFsaXR5LgorLy8KKy8vIFRoZSBwcm9ncmFtIHdpbGwgYmUgaW52b2tlZCBmcm9tIGEgUHl0aG9uIHVuaXQgdGVzdC4gIERvbid0IHJ1biBpdAorLy8gZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCisvLyBUZXN0IGNhc2UgRm9vVGVzdC4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsKK30KKworVEVTVF9GKEZvb1Rlc3QsIFh5eikgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdCBjYXNlIEJhclRlc3QuCisKK1RFU1QoQmFyVGVzdCwgVGVzdE9uZSkgeworfQorCitURVNUKEJhclRlc3QsIFRlc3RUd28pIHsKK30KKworVEVTVChCYXJUZXN0LCBUZXN0VGhyZWUpIHsKK30KKworVEVTVChCYXJUZXN0LCBESVNBQkxFRF9UZXN0Rm91cikgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworVEVTVChCYXJUZXN0LCBESVNBQkxFRF9UZXN0Rml2ZSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdCBjYXNlIEJhelRlc3QuCisKK1RFU1QoQmF6VGVzdCwgVGVzdE9uZSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworVEVTVChCYXpUZXN0LCBUZXN0QSkgeworfQorCitURVNUKEJhelRlc3QsIFRlc3RCKSB7Cit9CisKK1RFU1QoQmF6VGVzdCwgRElTQUJMRURfVGVzdEMpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBIYXNEZWF0aFRlc3QKKworVEVTVChIYXNEZWF0aFRlc3QsIFRlc3QxKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoZXhpdCgxKSwgIi4qIik7Cit9CisKKy8vIFdlIG5lZWQgYXQgbGVhc3QgdHdvIGRlYXRoIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBhbGwgZGVhdGggdGVzdHMKKy8vIGFyZW4ndCBvbiB0aGUgZmlyc3Qgc2hhcmQuCitURVNUKEhhc0RlYXRoVGVzdCwgVGVzdDIpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChleGl0KDEpLCAiLioiKTsKK30KKworLy8gVGVzdCBjYXNlIEZvb2JhclRlc3QKKworVEVTVChESVNBQkxFRF9Gb29iYXJUZXN0LCBUZXN0MSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworVEVTVChESVNBQkxFRF9Gb29iYXJUZXN0LCBESVNBQkxFRF9UZXN0MikgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdCBjYXNlIEZvb2JhcmJhelRlc3QKKworVEVTVChESVNBQkxFRF9Gb29iYXJiYXpUZXN0LCBUZXN0QSkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCitjbGFzcyBQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKK307CisKK1RFU1RfUChQYXJhbVRlc3QsIFRlc3RYKSB7Cit9CisKK1RFU1RfUChQYXJhbVRlc3QsIFRlc3RZKSB7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcVAsIFBhcmFtVGVzdCwgdGVzdGluZzo6VmFsdWVzKDEsIDIpKTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcVEsIFBhcmFtVGVzdCwgdGVzdGluZzo6VmFsdWVzKDUsIDYpKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2hlbHBfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDkzYzgzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkKQEAgLTAsMCArMSwxNzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIHRoZSAtLWhlbHAgZmxhZyBvZiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgorCitTWU5PUFNJUworICAgICAgIGd0ZXN0X2hlbHBfdGVzdC5weSAtLWJ1aWxkX2Rpcj1CVUlMRC9ESVIKKyAgICAgICAgICMgd2hlcmUgQlVJTEQvRElSIGNvbnRhaW5zIHRoZSBidWlsdCBndGVzdF9oZWxwX3Rlc3RfIGZpbGUuCisgICAgICAgZ3Rlc3RfaGVscF90ZXN0LnB5CisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworSVNfTElOVVggPSBvcy5uYW1lID09ICdwb3NpeCcgYW5kIG9zLnVuYW1lKClbMF0gPT0gJ0xpbnV4JworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworCitQUk9HUkFNX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfaGVscF90ZXN0XycpCitGTEFHX1BSRUZJWCA9ICctLWd0ZXN0XycKK0RFQVRIX1RFU1RfU1RZTEVfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2RlYXRoX3Rlc3Rfc3R5bGUnCitTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdzdHJlYW1fcmVzdWx0X3RvJworVU5LTk9XTl9GTEFHID0gRkxBR19QUkVGSVggKyAndW5rbm93bl9mbGFnX2Zvcl90ZXN0aW5nJworTElTVF9URVNUU19GTEFHID0gRkxBR19QUkVGSVggKyAnbGlzdF90ZXN0cycKK0lOQ09SUkVDVF9GTEFHX1ZBUklBTlRTID0gW3JlLnN1YignXi0tJywgJy0nLCBMSVNUX1RFU1RTX0ZMQUcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuc3ViKCdeLS0nLCAnLycsIExJU1RfVEVTVFNfRkxBRyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5zdWIoJ18nLCAnLScsIExJU1RfVEVTVFNfRkxBRyldCitJTlRFUk5BTF9GTEFHX0ZPUl9URVNUSU5HID0gRkxBR19QUkVGSVggKyAnaW50ZXJuYWxfZmxhZ19mb3JfdGVzdGluZycKKworU1VQUE9SVFNfREVBVEhfVEVTVFMgPSAiRGVhdGhUZXN0IiBpbiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgW1BST0dSQU1fUEFUSCwgTElTVF9URVNUU19GTEFHXSkub3V0cHV0CisKKyMgVGhlIGhlbHAgbWVzc2FnZSBtdXN0IG1hdGNoIHRoaXMgcmVnZXguCitIRUxQX1JFR0VYID0gcmUuY29tcGlsZSgKKyAgICBGTEFHX1BSRUZJWCArIHInbGlzdF90ZXN0cy4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ2ZpbHRlcj0uKicgKworICAgIEZMQUdfUFJFRklYICsgcidhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cy4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3JlcGVhdD0uKicgKworICAgIEZMQUdfUFJFRklYICsgcidzaHVmZmxlLionICsKKyAgICBGTEFHX1BSRUZJWCArIHIncmFuZG9tX3NlZWQ9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInY29sb3I9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHIncHJpbnRfdGltZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ291dHB1dD0uKicgKworICAgIEZMQUdfUFJFRklYICsgcidicmVha19vbl9mYWlsdXJlLionICsKKyAgICBGTEFHX1BSRUZJWCArIHIndGhyb3dfb25fZmFpbHVyZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ2NhdGNoX2V4Y2VwdGlvbnM9MC4qJywKKyAgICByZS5ET1RBTEwpCisKKworZGVmIFJ1bldpdGhGbGFnKGZsYWcpOgorICAiIiJSdW5zIGd0ZXN0X2hlbHBfdGVzdF8gd2l0aCB0aGUgZ2l2ZW4gZmxhZy4KKworICBSZXR1cm5zOgorICAgIHRoZSBleGl0IGNvZGUgYW5kIHRoZSB0ZXh0IG91dHB1dCBhcyBhIHR1cGxlLgorICBBcmdzOgorICAgIGZsYWc6IHRoZSBjb21tYW5kLWxpbmUgZmxhZyB0byBwYXNzIHRvIGd0ZXN0X2hlbHBfdGVzdF8sIG9yIE5vbmUuCisgICIiIgorCisgIGlmIGZsYWcgaXMgTm9uZToKKyAgICBjb21tYW5kID0gW1BST0dSQU1fUEFUSF0KKyAgZWxzZToKKyAgICBjb21tYW5kID0gW1BST0dSQU1fUEFUSCwgZmxhZ10KKyAgY2hpbGQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKKyAgcmV0dXJuIGNoaWxkLmV4aXRfY29kZSwgY2hpbGQub3V0cHV0CisKKworY2xhc3MgR1Rlc3RIZWxwVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdGhlIC0taGVscCBmbGFnIGFuZCBpdHMgZXF1aXZhbGVudCBmb3Jtcy4iIiIKKworICBkZWYgVGVzdEhlbHBGbGFnKHNlbGYsIGZsYWcpOgorICAgICIiIlZlcmlmaWVzIGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLgorCisgICAgVGhlIHJpZ2h0IG1lc3NhZ2UgbXVzdCBiZSBwcmludGVkIGFuZCB0aGUgdGVzdHMgbXVzdAorICAgIHNraXBwZWQgd2hlbiB0aGUgZ2l2ZW4gZmxhZyBpcyBzcGVjaWZpZWQuCisKKyAgICBBcmdzOgorICAgICAgZmxhZzogIEEgZmxhZyB0byBwYXNzIHRvIHRoZSBiaW5hcnkgb3IgTm9uZS4KKyAgICAiIiIKKworICAgIGV4aXRfY29kZSwgb3V0cHV0ID0gUnVuV2l0aEZsYWcoZmxhZykKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBleGl0X2NvZGUpCisgICAgc2VsZi5hc3NlcnRfKEhFTFBfUkVHRVguc2VhcmNoKG91dHB1dCksIG91dHB1dCkKKworICAgIGlmIElTX0xJTlVYOgorICAgICAgc2VsZi5hc3NlcnRfKFNUUkVBTV9SRVNVTFRfVE9fRkxBRyBpbiBvdXRwdXQsIG91dHB1dCkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKFNUUkVBTV9SRVNVTFRfVE9fRkxBRyBub3QgaW4gb3V0cHV0LCBvdXRwdXQpCisKKyAgICBpZiBTVVBQT1JUU19ERUFUSF9URVNUUyBhbmQgbm90IElTX1dJTkRPV1M6CisgICAgICBzZWxmLmFzc2VydF8oREVBVEhfVEVTVF9TVFlMRV9GTEFHIGluIG91dHB1dCwgb3V0cHV0KQorICAgIGVsc2U6CisgICAgICBzZWxmLmFzc2VydF8oREVBVEhfVEVTVF9TVFlMRV9GTEFHIG5vdCBpbiBvdXRwdXQsIG91dHB1dCkKKworICBkZWYgVGVzdE5vbkhlbHBGbGFnKHNlbGYsIGZsYWcpOgorICAgICIiIlZlcmlmaWVzIGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBubyBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLgorCisgICAgVmVyaWZpZXMgdGhhdCB3aGVuIG5vIGhlbHAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSB0ZXN0cyBhcmUgcnVuCisgICAgYW5kIHRoZSBoZWxwIG1lc3NhZ2UgaXMgbm90IHByaW50ZWQuCisKKyAgICBBcmdzOgorICAgICAgZmxhZzogIEEgZmxhZyB0byBwYXNzIHRvIHRoZSBiaW5hcnkgb3IgTm9uZS4KKyAgICAiIiIKKworICAgIGV4aXRfY29kZSwgb3V0cHV0ID0gUnVuV2l0aEZsYWcoZmxhZykKKyAgICBzZWxmLmFzc2VydF8oZXhpdF9jb2RlICE9IDApCisgICAgc2VsZi5hc3NlcnRfKG5vdCBIRUxQX1JFR0VYLnNlYXJjaChvdXRwdXQpLCBvdXRwdXQpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aEZ1bGxGbGFnKHNlbGYpOgorICAgIHNlbGYuVGVzdEhlbHBGbGFnKCctLWhlbHAnKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhTaG9ydEZsYWcoc2VsZik6CisgICAgc2VsZi5UZXN0SGVscEZsYWcoJy1oJykKKworICBkZWYgdGVzdFByaW50c0hlbHBXaXRoUXVlc3Rpb25GbGFnKHNlbGYpOgorICAgIHNlbGYuVGVzdEhlbHBGbGFnKCctPycpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aFdpbmRvd3NTdHlsZVF1ZXN0aW9uRmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZygnLz8nKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhVbnJlY29nbml6ZWRHb29nbGVUZXN0RmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZyhVTktOT1dOX0ZMQUcpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aEluY29ycmVjdEZsYWdTdHlsZShzZWxmKToKKyAgICBmb3IgaW5jb3JyZWN0X2ZsYWcgaW4gSU5DT1JSRUNUX0ZMQUdfVkFSSUFOVFM6CisgICAgICBzZWxmLlRlc3RIZWxwRmxhZyhpbmNvcnJlY3RfZmxhZykKKworICBkZWYgdGVzdFJ1bnNUZXN0c1dpdGhvdXRIZWxwRmxhZyhzZWxmKToKKyAgICAiIiJWZXJpZmllcyB0aGF0IHdoZW4gbm8gaGVscCBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIHRlc3RzIGFyZSBydW4KKyAgICBhbmQgdGhlIGhlbHAgbWVzc2FnZSBpcyBub3QgcHJpbnRlZC4iIiIKKworICAgIHNlbGYuVGVzdE5vbkhlbHBGbGFnKE5vbmUpCisKKyAgZGVmIHRlc3RSdW5zVGVzdHNXaXRoR3Rlc3RJbnRlcm5hbEZsYWcoc2VsZik6CisgICAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgdGVzdHMgYXJlIHJ1biBhbmQgbm8gaGVscCBtZXNzYWdlIGlzIHByaW50ZWQgd2hlbgorICAgIGEgZmxhZyBzdGFydGluZyB3aXRoIEdvb2dsZSBUZXN0IHByZWZpeCBhbmQgJ2ludGVybmFsXycgaXMgc3VwcGxpZWQuIiIiCisKKyAgICBzZWxmLlRlc3ROb25IZWxwRmxhZyhJTlRFUk5BTF9GTEFHX0ZPUl9URVNUSU5HKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9oZWxwX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZjc4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYwpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUaGlzIHByb2dyYW0gaXMgbWVhbnQgdG8gYmUgcnVuIGJ5IGd0ZXN0X2hlbHBfdGVzdC5weS4gIERvIG5vdCBydW4KKy8vIGl0IGRpcmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gV2hlbiBhIGhlbHAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoaXMgcHJvZ3JhbSBzaG91bGQgc2tpcCB0aGUgdGVzdHMKKy8vIGFuZCBleGl0IHdpdGggMDsgb3RoZXJ3aXNlIHRoZSBmb2xsb3dpbmcgdGVzdCB3aWxsIGJlIGV4ZWN1dGVkLAorLy8gY2F1c2luZyB0aGlzIHByb2dyYW0gdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KK1RFU1QoSGVscEZsYWdUZXN0LCBTaG91bGROb3RCZVJ1bikgeworICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlRlc3RzIHNob3VsZG4ndCBiZSBydW4gd2hlbiAtLWhlbHAgaXMgc3BlY2lmaWVkLiI7Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorVEVTVChEZWF0aFRlc3QsIFVzZWRCeVB5dGhvblNjcmlwdFRvRGV0ZWN0U3VwcG9ydEZvckRlYXRoVGVzdHNJblRoaXNCaW5hcnkpIHt9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTI1YjA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMjA3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcuCisKK0EgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIGxpc3QgYWxsIHRlc3RzIGJ5IHNwZWNpZnlpbmcgdGhlCistLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4gIFRoaXMgc2NyaXB0IHRlc3RzIHN1Y2ggZnVuY3Rpb25hbGl0eQorYnkgaW52b2tpbmcgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGgKK0dvb2dsZSBUZXN0KSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLgorIiIiCisKK19fYXV0aG9yX18gPSAncGhhbm5hQGdvb2dsZS5jb20gKFBhdHJpY2sgSGFubmEpJworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworaW1wb3J0IHJlCisKKworIyBDb25zdGFudHMuCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBlbmFibGluZy9kaXNhYmxpbmcgbGlzdGluZyBhbGwgdGVzdHMuCitMSVNUX1RFU1RTX0ZMQUcgPSAnZ3Rlc3RfbGlzdF90ZXN0cycKKworIyBQYXRoIHRvIHRoZSBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyBwcm9ncmFtLgorRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8nKQorCisjIFRoZSBleHBlY3RlZCBvdXRwdXQgd2hlbiBydW5uaW5nIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIHdpdGgKKyMgLS1ndGVzdF9saXN0X3Rlc3RzCitFWFBFQ1RFRF9PVVRQVVRfTk9fRklMVEVSX1JFID0gcmUuY29tcGlsZShyIiIiRm9vRGVhdGhUZXN0XC4KKyAgVGVzdDEKK0Zvb1wuCisgIEJhcjEKKyAgQmFyMgorICBESVNBQkxFRF9CYXIzCitBYmNcLgorICBYeXoKKyAgRGVmCitGb29CYXJcLgorICBCYXoKK0Zvb1Rlc3RcLgorICBUZXN0MQorICBESVNBQkxFRF9UZXN0MgorICBUZXN0MworVHlwZWRUZXN0LzBcLiAgIyBUeXBlUGFyYW0gPSAoVmVyeUxvezI0NX18Y2xhc3MgVmVyeUxvezIzOX0pXC5cLlwuCisgIFRlc3RBCisgIFRlc3RCCitUeXBlZFRlc3QvMVwuICAjIFR5cGVQYXJhbSA9IGludFxzKlwqCisgIFRlc3RBCisgIFRlc3RCCitUeXBlZFRlc3QvMlwuICAjIFR5cGVQYXJhbSA9IC4qTXlBcnJheTxib29sLFxzKjQyPgorICBUZXN0QQorICBUZXN0QgorTXkvVHlwZVBhcmFtVGVzdC8wXC4gICMgVHlwZVBhcmFtID0gKFZlcnlMb3syNDV9fGNsYXNzIFZlcnlMb3syMzl9KVwuXC5cLgorICBUZXN0QQorICBUZXN0QgorTXkvVHlwZVBhcmFtVGVzdC8xXC4gICMgVHlwZVBhcmFtID0gaW50XHMqXCoKKyAgVGVzdEEKKyAgVGVzdEIKK015L1R5cGVQYXJhbVRlc3QvMlwuICAjIFR5cGVQYXJhbSA9IC4qTXlBcnJheTxib29sLFxzKjQyPgorICBUZXN0QQorICBUZXN0QgorTXlJbnN0YW50aWF0aW9uL1ZhbHVlUGFyYW1UZXN0XC4KKyAgVGVzdEEvMCAgIyBHZXRQYXJhbVwoXCkgPSBvbmUgbGluZQorICBUZXN0QS8xICAjIEdldFBhcmFtXChcKSA9IHR3b1xcbmxpbmVzCisgIFRlc3RBLzIgICMgR2V0UGFyYW1cKFwpID0gYSB2ZXJ5XFxubG97MjQxfVwuXC5cLgorICBUZXN0Qi8wICAjIEdldFBhcmFtXChcKSA9IG9uZSBsaW5lCisgIFRlc3RCLzEgICMgR2V0UGFyYW1cKFwpID0gdHdvXFxubGluZXMKKyAgVGVzdEIvMiAgIyBHZXRQYXJhbVwoXCkgPSBhIHZlcnlcXG5sb3syNDF9XC5cLlwuCisiIiIpCisKKyMgVGhlIGV4cGVjdGVkIG91dHB1dCB3aGVuIHJ1bm5pbmcgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gd2l0aAorIyAtLWd0ZXN0X2xpc3RfdGVzdHMgYW5kIC0tZ3Rlc3RfZmlsdGVyPUZvbyouCitFWFBFQ1RFRF9PVVRQVVRfRklMVEVSX0ZPT19SRSA9IHJlLmNvbXBpbGUociIiIkZvb0RlYXRoVGVzdFwuCisgIFRlc3QxCitGb29cLgorICBCYXIxCisgIEJhcjIKKyAgRElTQUJMRURfQmFyMworRm9vQmFyXC4KKyAgQmF6CitGb29UZXN0XC4KKyAgVGVzdDEKKyAgRElTQUJMRURfVGVzdDIKKyAgVGVzdDMKKyIiIikKKworIyBVdGlsaXRpZXMuCisKKworZGVmIFJ1bihhcmdzKToKKyAgIiIiUnVucyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZiB0ZXN0cyBwcmludGVkLiIiIgorCisgIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0VYRV9QQVRIXSArIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV9zdGRlcnI9RmFsc2UpLm91dHB1dAorCisKKyMgVGhlIHVuaXQgdGVzdC4KKworY2xhc3MgR1Rlc3RMaXN0VGVzdHNVbml0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdXNpbmcgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHRvIGxpc3QgYWxsIHRlc3RzLiIiIgorCisgIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZmxhZ192YWx1ZSwgZXhwZWN0ZWRfb3V0cHV0X3JlLCBvdGhlcl9mbGFnKToKKyAgICAiIiJSdW5zIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIGFuZCB2ZXJpZmllcyB0aGF0IGl0IHByaW50cworICAgIHRoZSBjb3JyZWN0IHRlc3RzLgorCisgICAgQXJnczoKKyAgICAgIGZsYWdfdmFsdWU6ICAgICAgICAgdmFsdWUgb2YgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnOworICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KKyAgICAgIGV4cGVjdGVkX291dHB1dF9yZTogcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGFmdGVyIHJ1bm5pbmcgY29tbWFuZDsKKyAgICAgIG90aGVyX2ZsYWc6ICAgICAgICAgYSBkaWZmZXJlbnQgZmxhZyB0byBiZSBwYXNzZWQgdG8gY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbG9uZyB3aXRoIGd0ZXN0X2xpc3RfdGVzdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgaWYgdGhlIGZsYWcgc2hvdWxkIG5vdCBiZSBwcmVzZW50LgorICAgICIiIgorCisgICAgaWYgZmxhZ192YWx1ZSBpcyBOb25lOgorICAgICAgZmxhZyA9ICcnCisgICAgICBmbGFnX2V4cHJlc3Npb24gPSAnbm90IHNldCcKKyAgICBlbGlmIGZsYWdfdmFsdWUgPT0gJzAnOgorICAgICAgZmxhZyA9ICctLSVzPTAnICUgTElTVF9URVNUU19GTEFHCisgICAgICBmbGFnX2V4cHJlc3Npb24gPSAnMCcKKyAgICBlbHNlOgorICAgICAgZmxhZyA9ICctLSVzJyAlIExJU1RfVEVTVFNfRkxBRworICAgICAgZmxhZ19leHByZXNzaW9uID0gJzEnCisKKyAgICBhcmdzID0gW2ZsYWddCisKKyAgICBpZiBvdGhlcl9mbGFnIGlzIG5vdCBOb25lOgorICAgICAgYXJncyArPSBbb3RoZXJfZmxhZ10KKworICAgIG91dHB1dCA9IFJ1bihhcmdzKQorCisgICAgaWYgZXhwZWN0ZWRfb3V0cHV0X3JlOgorICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZS5tYXRjaChvdXRwdXQpLAorICAgICAgICAgICgnd2hlbiAlcyBpcyAlcywgdGhlIG91dHB1dCBvZiAiJXMiIGlzICIlcyIsXG4nCisgICAgICAgICAgICd3aGljaCBkb2VzIG5vdCBtYXRjaCByZWdleCAiJXMiJyAlCisgICAgICAgICAgIChMSVNUX1RFU1RTX0ZMQUcsIGZsYWdfZXhwcmVzc2lvbiwgJyAnLmpvaW4oYXJncyksIG91dHB1dCwKKyAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZS5wYXR0ZXJuKSkpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICBub3QgRVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUl9SRS5tYXRjaChvdXRwdXQpLAorICAgICAgICAgICgnd2hlbiAlcyBpcyAlcywgdGhlIG91dHB1dCBvZiAiJXMiIGlzICIlcyInJQorICAgICAgICAgICAoTElTVF9URVNUU19GTEFHLCBmbGFnX2V4cHJlc3Npb24sICcgJy5qb2luKGFyZ3MpLCBvdXRwdXQpKSkKKworICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgbW9kZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPU5vbmUpCisKKyAgZGVmIHRlc3RGbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Tm9uZSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9RVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUl9SRSwKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPU5vbmUpCisKKyAgZGVmIHRlc3RPdmVycmlkZU5vbkZpbHRlckZsYWdzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgLS1ndGVzdF9saXN0X3Rlc3RzIG92ZXJyaWRlcyB0aGUgbm9uLWZpbHRlciBmbGFncy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZT1FWFBFQ1RFRF9PVVRQVVRfTk9fRklMVEVSX1JFLAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Jy0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZScpCisKKyAgZGVmIHRlc3RXaXRoRmlsdGVyRmxhZ3Moc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCAtLWd0ZXN0X2xpc3RfdGVzdHMgdGFrZXMgaW50byBhY2NvdW50IHRoZQorICAgIC0tZ3Rlc3RfZmlsdGVyIGZsYWcuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9RVhQRUNURURfT1VUUFVUX0ZJTFRFUl9GT09fUkUsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz0nLS1ndGVzdF9maWx0ZXI9Rm9vKicpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDdjMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfLmNjCkBAIC0wLDAgKzEsMTU3IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBwaGFubmFAZ29vZ2xlLmNvbSAoUGF0cmljayBIYW5uYSkKKworLy8gVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnLgorLy8KKy8vIEEgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIGxpc3QgYWxsIHRlc3RzIHRoYXQgd2lsbCBydW4KKy8vIHNvIHRoYXQgd2hlbiB1c2luZyBhIGZpbHRlciwgYSB1c2VyIHdpbGwga25vdyB3aGF0CisvLyB0ZXN0cyB0byBsb29rIGZvci4gVGhlIHRlc3RzIHdpbGwgbm90IGJlIHJ1biBhZnRlciBsaXN0aW5nLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSB3aWxsIGJlIGludm9rZWQgZnJvbSBhIFB5dGhvbiB1bml0IHRlc3QuCisvLyBEb24ndCBydW4gaXQgZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBTZXZlcmFsIGRpZmZlcmVudCB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0aGF0IHdpbGwgYmUgbGlzdGVkLgorVEVTVChGb28sIEJhcjEpIHsKK30KKworVEVTVChGb28sIEJhcjIpIHsKK30KKworVEVTVChGb28sIERJU0FCTEVEX0JhcjMpIHsKK30KKworVEVTVChBYmMsIFh5eikgeworfQorCitURVNUKEFiYywgRGVmKSB7Cit9CisKK1RFU1QoRm9vQmFyLCBCYXopIHsKK30KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihGb29UZXN0LCBUZXN0MSkgeworfQorCitURVNUX0YoRm9vVGVzdCwgRElTQUJMRURfVGVzdDIpIHsKK30KKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QzKSB7Cit9CisKK1RFU1QoRm9vRGVhdGhUZXN0LCBUZXN0MSkgeworfQorCisvLyBBIGdyb3VwIG9mIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKK2NsYXNzIE15VHlwZSB7CisgcHVibGljOgorICBleHBsaWNpdCBNeVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyB2YWx1ZV87Cit9OworCisvLyBUZWFjaGVzIEdvb2dsZSBUZXN0IGhvdyB0byBwcmludCBhIE15VHlwZS4KK3ZvaWQgUHJpbnRUbyhjb25zdCBNeVR5cGUmIHgsIHN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8IHgudmFsdWUoKTsKK30KKworY2xhc3MgVmFsdWVQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxNeVR5cGU+IHsKK307CisKK1RFU1RfUChWYWx1ZVBhcmFtVGVzdCwgVGVzdEEpIHsKK30KKworVEVTVF9QKFZhbHVlUGFyYW1UZXN0LCBUZXN0QikgeworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBNeUluc3RhbnRpYXRpb24sIFZhbHVlUGFyYW1UZXN0LAorICAgIHRlc3Rpbmc6OlZhbHVlcyhNeVR5cGUoIm9uZSBsaW5lIiksCisgICAgICAgICAgICAgICAgICAgIE15VHlwZSgidHdvXG5saW5lcyIpLAorICAgICAgICAgICAgICAgICAgICBNeVR5cGUoImEgdmVyeVxubG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyBsaW5lIikpKTsgIC8vIE5PTElOVAorCisvLyBBIGdyb3VwIG9mIHR5cGVkIHRlc3RzLgorCisvLyBBIGRlbGliZXJhdGVseSBsb25nIHR5cGUgbmFtZSBmb3IgdGVzdGluZyB0aGUgbGluZS10cnVuY2F0aW5nCisvLyBiZWhhdmlvciB3aGVuIHByaW50aW5nIGEgdHlwZSBwYXJhbWV0ZXIuCitjbGFzcyBWZXJ5TG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29nTmFtZSB7ICAvLyBOT0xJTlQKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBrU2l6ZT4KK2NsYXNzIE15QXJyYXkgeworfTsKKwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxWZXJ5TG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29nTmFtZSwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqLCBNeUFycmF5PGJvb2wsIDQyPiA+IE15VHlwZXM7CisKK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QsIE15VHlwZXMpOworCitUWVBFRF9URVNUKFR5cGVkVGVzdCwgVGVzdEEpIHsKK30KKworVFlQRURfVEVTVChUeXBlZFRlc3QsIFRlc3RCKSB7Cit9CisKKy8vIEEgZ3JvdXAgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1UZXN0KTsKKworVFlQRURfVEVTVF9QKFR5cGVQYXJhbVRlc3QsIFRlc3RBKSB7Cit9CisKK1RZUEVEX1RFU1RfUChUeXBlUGFyYW1UZXN0LCBUZXN0QikgeworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1UZXN0LCBUZXN0QSwgVGVzdEIpOworCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgVHlwZVBhcmFtVGVzdCwgTXlUeXBlcyk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfbWFpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Q5YmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFRlc3RzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBkZWZpbmUgbWFpbigpIHdoZW4gd2UgbGluayB0bworLy8gZ3Rlc3RfbWFpbiBpbnN0ZWFkIG9mIGd0ZXN0LgorCituYW1lc3BhY2UgeworCitURVNUKEdUZXN0TWFpblRlc3QsIFNob3VsZFN1Y2NlZWQpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFdlIGFyZSB1c2luZyB0aGUgbWFpbigpIGZ1bmN0aW9uIGRlZmluZWQgaW4gc3JjL2d0ZXN0X21haW4uY2MsIHNvCisvLyB3ZSBkb24ndCBkZWZpbmUgaXQgaGVyZS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9ub190ZXN0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyNTk5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9ub190ZXN0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGVzdHMgdGhhdCBhIEdvb2dsZSBUZXN0IHByb2dyYW0gdGhhdCBoYXMgbm8gdGVzdCBkZWZpbmVkIGNhbiBydW4KKy8vIHN1Y2Nlc3NmdWxseS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIEFuIGFkLWhvYyBhc3NlcnRpb24gb3V0c2lkZSBvZiBhbGwgdGVzdHMuCisgIC8vCisgIC8vIFRoaXMgc2VydmVzIHRocmVlIHB1cnBvc2VzOgorICAvLworICAvLyAxLiBJdCB2ZXJpZmllcyB0aGF0IGFuIGFkLWhvYyBhc3NlcnRpb24gY2FuIGJlIGV4ZWN1dGVkIGV2ZW4gaWYKKyAgLy8gICAgbm8gdGVzdCBpcyBkZWZpbmVkLgorICAvLyAyLiBJdCB2ZXJpZmllcyB0aGF0IGEgZmFpbGVkIGFkLWhvYyBhc3NlcnRpb24gY2F1c2VzIHRoZSB0ZXN0CisgIC8vICAgIHByb2dyYW0gdG8gZmFpbC4KKyAgLy8gMy4gV2UgaGFkIGEgYnVnIHdoZXJlIHRoZSBYTUwgb3V0cHV0IHdvbid0IGJlIGdlbmVyYXRlZCBpZiBhbgorICAvLyAgICBhc3NlcnRpb24gaXMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBjYWxsZWQsIGV2ZW4KKyAgLy8gICAgdGhvdWdoIC0tZ3Rlc3Rfb3V0cHV0PXhtbCBpcyBzcGVjaWZpZWQuICBUaGlzIG1ha2VzIHN1cmUgdGhlCisgIC8vICAgIGJ1ZyBpcyBmaXhlZCBhbmQgZG9lc24ndCByZWdyZXNzLgorICBFWFBFQ1RfRVEoMSwgMik7CisKKyAgLy8gVGhlIGFib3ZlIEVYUEVDVF9FUSgpIHNob3VsZCBjYXVzZSBSVU5fQUxMX1RFU1RTKCkgdG8gcmV0dXJuIG5vbi16ZXJvLgorICByZXR1cm4gUlVOX0FMTF9URVNUUygpID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQwOWUyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdC5weQpAQCAtMCwwICsxLDMzNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgdGhlIHRleHQgb3V0cHV0IG9mIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsuCisKK1NZTk9QU0lTCisgICAgICAgZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgLS1idWlsZF9kaXI9QlVJTEQvRElSIC0tZ2VuZ29sZGVuCisgICAgICAgICAjIHdoZXJlIEJVSUxEL0RJUiBjb250YWlucyB0aGUgYnVpbHQgZ3Rlc3Rfb3V0cHV0X3Rlc3RfIGZpbGUuCisgICAgICAgZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgLS1nZW5nb2xkZW4KKyAgICAgICBndGVzdF9vdXRwdXRfdGVzdC5weQorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKKyMgVGhlIGZsYWcgZm9yIGdlbmVyYXRpbmcgdGhlIGdvbGRlbiBmaWxlCitHRU5HT0xERU5fRkxBRyA9ICctLWdlbmdvbGRlbicKK0NBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUl9OQU1FID0gJ0dURVNUX0NBVENIX0VYQ0VQVElPTlMnCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKKworIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiByZW1vdmUgdGhlIF9saW4gc3VmZml4LgorR09MREVOX05BTUUgPSAnZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQnCisKK1BST0dSQU1fUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9vdXRwdXRfdGVzdF8nKQorCisjIEF0IGxlYXN0IG9uZSBjb21tYW5kIHdlIGV4ZXJjaXNlIG11c3Qgbm90IGhhdmUgdGhlCisjIC0tZ3Rlc3RfaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzIGZsYWcuCitDT01NQU5EX0xJU1RfVEVTVFMgPSAoe30sIFtQUk9HUkFNX1BBVEgsICctLWd0ZXN0X2xpc3RfdGVzdHMnXSkKK0NPTU1BTkRfV0lUSF9DT0xPUiA9ICh7fSwgW1BST0dSQU1fUEFUSCwgJy0tZ3Rlc3RfY29sb3I9eWVzJ10pCitDT01NQU5EX1dJVEhfVElNRSA9ICh7fSwgW1BST0dSQU1fUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tZ3Rlc3RfcHJpbnRfdGltZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICctLWd0ZXN0X2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICctLWd0ZXN0X2ZpbHRlcj1GYXRhbEZhaWx1cmVUZXN0Lio6TG9nZ2luZ1Rlc3QuKiddKQorQ09NTUFORF9XSVRIX0RJU0FCTEVEID0gKAorICAgIHt9LCBbUFJPR1JBTV9QQVRILAorICAgICAgICAgJy0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMnLAorICAgICAgICAgJy0tZ3Rlc3RfaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzJywKKyAgICAgICAgICctLWd0ZXN0X2ZpbHRlcj0qRElTQUJMRURfKiddKQorQ09NTUFORF9XSVRIX1NIQVJESU5HID0gKAorICAgIHsnR1RFU1RfU0hBUkRfSU5ERVgnOiAnMScsICdHVEVTVF9UT1RBTF9TSEFSRFMnOiAnMid9LAorICAgIFtQUk9HUkFNX1BBVEgsCisgICAgICctLWd0ZXN0X2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycsCisgICAgICctLWd0ZXN0X2ZpbHRlcj1QYXNzaW5nVGVzdC4qJ10pCisKK0dPTERFTl9QQVRIID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksIEdPTERFTl9OQU1FKQorCisKK2RlZiBUb1VuaXhMaW5lRW5kaW5nKHMpOgorICAiIiJDaGFuZ2VzIGFsbCBXaW5kb3dzL01hYyBsaW5lIGVuZGluZ3MgaW4gcyB0byBVTklYIGxpbmUgZW5kaW5ncy4iIiIKKworICByZXR1cm4gcy5yZXBsYWNlKCdcclxuJywgJ1xuJykucmVwbGFjZSgnXHInLCAnXG4nKQorCisKK2RlZiBSZW1vdmVMb2NhdGlvbnModGVzdF9vdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gZnJvbSBhIEdvb2dsZSBUZXN0IHByb2dyYW0ncyBvdXRwdXQuCisKKyAgQXJnczoKKyAgICAgICB0ZXN0X291dHB1dDogIHRoZSBvdXRwdXQgb2YgYSBHb29nbGUgVGVzdCBwcm9ncmFtLgorCisgIFJldHVybnM6CisgICAgICAgb3V0cHV0IHdpdGggYWxsIGZpbGUgbG9jYXRpb24gaW5mbyAoaW4gdGhlIGZvcm0gb2YKKyAgICAgICAnRElSRUNUT1JZL0ZJTEVfTkFNRTpMSU5FX05VTUJFUjogJ29yCisgICAgICAgJ0RJUkVDVE9SWVxcRklMRV9OQU1FKExJTkVfTlVNQkVSKTogJykgcmVwbGFjZWQgYnkKKyAgICAgICAnRklMRV9OQU1FOiM6ICcuCisgICIiIgorCisgIHJldHVybiByZS5zdWIocicuKlsvXFxdKC4rKShcOlxkK3xcKFxkK1wpKVw6ICcsIHInXDE6IzogJywgdGVzdF9vdXRwdXQpCisKKworZGVmIFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCk6CisgICIiIlJlbW92ZXMgYWxsIHN0YWNrIHRyYWNlcyBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4iIiIKKworICAjICo/IG1lYW5zICJmaW5kIHRoZSBzaG9ydGVzdCBzdHJpbmcgdGhhdCBtYXRjaGVzIi4KKyAgcmV0dXJuIHJlLnN1YihyJ1N0YWNrIHRyYWNlOigufFxuKSo/XG5cbicsCisgICAgICAgICAgICAgICAgJ1N0YWNrIHRyYWNlOiAob21pdHRlZClcblxuJywgb3V0cHV0KQorCisKK2RlZiBSZW1vdmVTdGFja1RyYWNlcyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCB0cmFjZXMgb2Ygc3RhY2sgdHJhY2VzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgICMgKj8gbWVhbnMgImZpbmQgdGhlIHNob3J0ZXN0IHN0cmluZyB0aGF0IG1hdGNoZXMiLgorICByZXR1cm4gcmUuc3ViKHInU3RhY2sgdHJhY2U6KC58XG4pKj9cblxuJywgJycsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlVGltZShvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCB0aW1lIGluZm9ybWF0aW9uIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgIHJldHVybiByZS5zdWIocidcKFxkKyBtcycsICcoPyBtcycsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlVHlwZUluZm9EZXRhaWxzKHRlc3Rfb3V0cHV0KToKKyAgIiIiUmVtb3ZlcyBjb21waWxlci1zcGVjaWZpYyB0eXBlIGluZm8gZnJvbSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgorCisgIEFyZ3M6CisgICAgICAgdGVzdF9vdXRwdXQ6ICB0aGUgb3V0cHV0IG9mIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbS4KKworICBSZXR1cm5zOgorICAgICAgIG91dHB1dCB3aXRoIHR5cGUgaW5mb3JtYXRpb24gbm9ybWFsaXplZCB0byBjYW5vbmljYWwgZm9ybS4KKyAgIiIiCisKKyAgIyBzb21lIGNvbXBpbGVycyBvdXRwdXQgdGhlIG5hbWUgb2YgdHlwZSAndW5zaWduZWQgaW50JyBhcyAndW5zaWduZWQnCisgIHJldHVybiByZS5zdWIocid1bnNpZ25lZCBpbnQnLCAndW5zaWduZWQnLCB0ZXN0X291dHB1dCkKKworCitkZWYgTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0odGVzdF9vdXRwdXQpOgorICAiIiJOb3JtYWxpemVzIHBsYXRmb3JtIHNwZWNpZmljIG91dHB1dCBkZXRhaWxzIGZvciBlYXNpZXIgY29tcGFyaXNvbi4iIiIKKworICBpZiBJU19XSU5ET1dTOgorICAgICMgUmVtb3ZlcyB0aGUgY29sb3IgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcHJlc2VudCBvbiBXaW5kb3dzLgorICAgIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKCdceDFiXFxbKDA7M1xkKT9tJywgJycsIHRlc3Rfb3V0cHV0KQorICAgICMgQ2hhbmdlcyBmYWlsdXJlIG1lc3NhZ2UgaGVhZGVycyBpbnRvIHRoZSBXaW5kb3dzIGZvcm1hdC4KKyAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJzogRmFpbHVyZVxuJywgcic6IGVycm9yOiAnLCB0ZXN0X291dHB1dCkKKyAgICAjIENoYW5nZXMgZmlsZShsaW5lX251bWJlcikgdG8gZmlsZTpsaW5lX251bWJlci4KKyAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJygoXHd8XC4pKylcKChcZCspXCk6JywgcidcMTpcMzonLCB0ZXN0X291dHB1dCkKKworICByZXR1cm4gdGVzdF9vdXRwdXQKKworCitkZWYgUmVtb3ZlVGVzdENvdW50cyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIHRlc3QgY291bnRzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgIG91dHB1dCA9IHJlLnN1YihyJ1xkKyB0ZXN0cz8sIGxpc3RlZCBiZWxvdycsCisgICAgICAgICAgICAgICAgICAnPyB0ZXN0cywgbGlzdGVkIGJlbG93Jywgb3V0cHV0KQorICBvdXRwdXQgPSByZS5zdWIocidcZCsgRkFJTEVEIFRFU1RTJywKKyAgICAgICAgICAgICAgICAgICc/IEZBSUxFRCBURVNUUycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIFxkKyB0ZXN0IGNhc2VzPycsCisgICAgICAgICAgICAgICAgICAnPyB0ZXN0cyBmcm9tID8gdGVzdCBjYXNlcycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIChbYS16QS1aX10pJywKKyAgICAgICAgICAgICAgICAgIHInPyB0ZXN0cyBmcm9tIFwxJywgb3V0cHV0KQorICByZXR1cm4gcmUuc3ViKHInXGQrIHRlc3RzP1wuJywgJz8gdGVzdHMuJywgb3V0cHV0KQorCisKK2RlZiBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCBwYXR0ZXJuKToKKyAgIiIiUmVtb3ZlcyBvdXRwdXQgb2Ygc3BlY2lmaWVkIHRlc3RzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgorCisgIFRoaXMgZnVuY3Rpb24gc3RyaXBzIG5vdCBvbmx5IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgYSB0ZXN0IGJ1dCBhbHNvCisgIGFsbCBvdXRwdXQgaW4gYmV0d2Vlbi4KKworICBBcmdzOgorICAgIHRlc3Rfb3V0cHV0OiAgICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSB0ZXN0IG91dHB1dC4KKyAgICBwYXR0ZXJuOiAgICAgICAgICAgQSByZWdleCBzdHJpbmcgdGhhdCBtYXRjaGVzIG5hbWVzIG9mIHRlc3QgY2FzZXMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgdG8gcmVtb3ZlLgorCisgIFJldHVybnM6CisgICAgQ29udGVudHMgb2YgdGVzdF9vdXRwdXQgd2l0aCB0ZXN0cyB3aG9zZSBuYW1lcyBtYXRjaCBwYXR0ZXJuIHJlbW92ZWQuCisgICIiIgorCisgIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKAorICAgICAgcicuKlxbIFJVTiAgICAgIFxdIC4qJXMoLnxcbikqP1xbKCAgRkFJTEVEICB8ICAgICAgIE9LIClcXSAuKiVzLipcbicgJSAoCisgICAgICAgICAgcGF0dGVybiwgcGF0dGVybiksCisgICAgICAnJywKKyAgICAgIHRlc3Rfb3V0cHV0KQorICByZXR1cm4gcmUuc3ViKHInLiolcy4qXG4nICUgcGF0dGVybiwgJycsIHRlc3Rfb3V0cHV0KQorCisKK2RlZiBOb3JtYWxpemVPdXRwdXQob3V0cHV0KToKKyAgIiIiTm9ybWFsaXplcyBvdXRwdXQgKHRoZSBvdXRwdXQgb2YgZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmV4ZSkuIiIiCisKKyAgb3V0cHV0ID0gVG9Vbml4TGluZUVuZGluZyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCkKKyAgb3V0cHV0ID0gUmVtb3ZlVGltZShvdXRwdXQpCisgIHJldHVybiBvdXRwdXQKKworCitkZWYgR2V0U2hlbGxDb21tYW5kT3V0cHV0KGVudl9jbWQpOgorICAiIiJSdW5zIGEgY29tbWFuZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgcmV0dXJucyBpdHMgb3V0cHV0IGluIGEgc3RyaW5nLgorCisgIEFyZ3M6CisgICAgZW52X2NtZDogVGhlIHNoZWxsIGNvbW1hbmQuIEEgMi10dXBsZSB3aGVyZSBlbGVtZW50IDAgaXMgYSBkaWN0IG9mIGV4dHJhCisgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCwgYW5kIGVsZW1lbnQgMSBpcyBhIHN0cmluZyB3aXRoCisgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KKworICBSZXR1cm5zOgorICAgIEEgc3RyaW5nIHdpdGggdGhlIGNvbW1hbmQncyBjb21iaW5lZCBzdGFuZGFyZCBhbmQgZGlhZ25vc3RpYyBvdXRwdXQuCisgICIiIgorCisgICMgU3Bhd25zIGNtZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgZ2V0cyBpdHMgc3RhbmRhcmQgSS9PIGZpbGUgb2JqZWN0cy4KKyAgIyBTZXQgYW5kIHNhdmUgdGhlIGVudmlyb25tZW50IHByb3Blcmx5LgorICBlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgZW52aXJvbi51cGRhdGUoZW52X2NtZFswXSkKKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhlbnZfY21kWzFdLCBlbnY9ZW52aXJvbikKKworICByZXR1cm4gcC5vdXRwdXQKKworCitkZWYgR2V0Q29tbWFuZE91dHB1dChlbnZfY21kKToKKyAgIiIiUnVucyBhIGNvbW1hbmQgYW5kIHJldHVybnMgaXRzIG91dHB1dCB3aXRoIGFsbCBmaWxlIGxvY2F0aW9uCisgIGluZm8gc3RyaXBwZWQgb2ZmLgorCisgIEFyZ3M6CisgICAgZW52X2NtZDogIFRoZSBzaGVsbCBjb21tYW5kLiBBIDItdHVwbGUgd2hlcmUgZWxlbWVudCAwIGlzIGEgZGljdCBvZiBleHRyYQorICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0LCBhbmQgZWxlbWVudCAxIGlzIGEgc3RyaW5nIHdpdGgKKyAgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KKyAgIiIiCisKKyAgIyBEaXNhYmxlcyBleGNlcHRpb24gcG9wLXVwcyBvbiBXaW5kb3dzLgorICBlbnZpcm9uLCBjbWRsaW5lID0gZW52X2NtZAorICBlbnZpcm9uID0gZGljdChlbnZpcm9uKSAgIyBFbnN1cmVzIHdlIGFyZSBtb2RpZnlpbmcgYSBjb3B5LgorICBlbnZpcm9uW0NBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUl9OQU1FXSA9ICcxJworICByZXR1cm4gTm9ybWFsaXplT3V0cHV0KEdldFNoZWxsQ29tbWFuZE91dHB1dCgoZW52aXJvbiwgY21kbGluZSkpKQorCisKK2RlZiBHZXRPdXRwdXRPZkFsbENvbW1hbmRzKCk6CisgICIiIlJldHVybnMgY29uY2F0ZW5hdGVkIG91dHB1dCBmcm9tIHNldmVyYWwgcmVwcmVzZW50YXRpdmUgY29tbWFuZHMuIiIiCisKKyAgcmV0dXJuIChHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9DT0xPUikgKworICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1RJTUUpICsKKyAgICAgICAgICBHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9ESVNBQkxFRCkgKworICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1NIQVJESU5HKSkKKworCit0ZXN0X2xpc3QgPSBHZXRTaGVsbENvbW1hbmRPdXRwdXQoQ09NTUFORF9MSVNUX1RFU1RTKQorU1VQUE9SVFNfREVBVEhfVEVTVFMgPSAnRGVhdGhUZXN0JyBpbiB0ZXN0X2xpc3QKK1NVUFBPUlRTX1RZUEVEX1RFU1RTID0gJ1R5cGVkVGVzdCcgaW4gdGVzdF9saXN0CitTVVBQT1JUU19USFJFQURTID0gJ0V4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QnIGluIHRlc3RfbGlzdAorU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTID0gRmFsc2UKKworQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFID0gKFNVUFBPUlRTX0RFQVRIX1RFU1RTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RZUEVEX1RFU1RTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RIUkVBRFMpCisKKworY2xhc3MgR1Rlc3RPdXRwdXRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgUmVtb3ZlVW5zdXBwb3J0ZWRUZXN0cyhzZWxmLCB0ZXN0X291dHB1dCk6CisgICAgaWYgbm90IFNVUFBPUlRTX0RFQVRIX1RFU1RTOgorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnRGVhdGhUZXN0JykKKyAgICBpZiBub3QgU1VQUE9SVFNfVFlQRURfVEVTVFM6CisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsICdUeXBlZFRlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnVHlwZWREZWF0aFRlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnVHlwZVBhcmFtRGVhdGhUZXN0JykKKyAgICBpZiBub3QgU1VQUE9SVFNfVEhSRUFEUzoKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCcpCisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCcpCisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtzQ29uY3VycmVudGx5JykKKyAgICBpZiBub3QgU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTOgorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVTdGFja1RyYWNlcyh0ZXN0X291dHB1dCkKKworICAgIHJldHVybiB0ZXN0X291dHB1dAorCisgIGRlZiB0ZXN0T3V0cHV0KHNlbGYpOgorICAgIG91dHB1dCA9IEdldE91dHB1dE9mQWxsQ29tbWFuZHMoKQorCisgICAgZ29sZGVuX2ZpbGUgPSBvcGVuKEdPTERFTl9QQVRILCAncmInKQorICAgICMgQSBtaXMtY29uZmlndXJlZCBzb3VyY2UgY29udHJvbCBzeXN0ZW0gY2FuIGNhdXNlIFxyIGFwcGVhciBpbiBFT0wKKyAgICAjIHNlcXVlbmNlcyB3aGVuIHdlIHJlYWQgdGhlIGdvbGRlbiBmaWxlIGlycmVzcGVjdGl2ZSBvZiBhbiBvcGVyYXRpbmcKKyAgICAjIHN5c3RlbSB1c2VkLiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gc3RyaXAgdGhvc2UgXHIncyBmcm9tIG5ld2xpbmVzCisgICAgIyB1bmNvbmRpdGlvbmFsbHkuCisgICAgZ29sZGVuID0gVG9Vbml4TGluZUVuZGluZyhnb2xkZW5fZmlsZS5yZWFkKCkpCisgICAgZ29sZGVuX2ZpbGUuY2xvc2UoKQorCisgICAgIyBXZSB3YW50IHRoZSB0ZXN0IHRvIHBhc3MgcmVnYXJkbGVzcyBvZiBjZXJ0YWluIGZlYXR1cmVzIGJlaW5nCisgICAgIyBzdXBwb3J0ZWQgb3Igbm90LgorCisgICAgIyBXZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0eXBlIG5hbWUgc3BlY2lmaWNzIGluIGFsbCBjYXNlcy4KKyAgICBub3JtYWxpemVkX2FjdHVhbCA9IFJlbW92ZVR5cGVJbmZvRGV0YWlscyhvdXRwdXQpCisgICAgbm9ybWFsaXplZF9nb2xkZW4gPSBSZW1vdmVUeXBlSW5mb0RldGFpbHMoZ29sZGVuKQorCisgICAgaWYgQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtYWxpemVkX2dvbGRlbiwgbm9ybWFsaXplZF9hY3R1YWwpCisgICAgZWxzZToKKyAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsID0gTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0oCisgICAgICAgICAgUmVtb3ZlVGVzdENvdW50cyhub3JtYWxpemVkX2FjdHVhbCkpCisgICAgICBub3JtYWxpemVkX2dvbGRlbiA9IE5vcm1hbGl6ZVRvQ3VycmVudFBsYXRmb3JtKAorICAgICAgICAgIFJlbW92ZVRlc3RDb3VudHMoc2VsZi5SZW1vdmVVbnN1cHBvcnRlZFRlc3RzKG5vcm1hbGl6ZWRfZ29sZGVuKSkpCisKKyAgICAgICMgVGhpcyBjb2RlIGlzIHZlcnkgaGFuZHkgd2hlbiBkZWJ1Z2dpbmcgZ29sZGVuIGZpbGUgZGlmZmVyZW5jZXM6CisgICAgICBpZiBvcy5nZXRlbnYoJ0RFQlVHX0dURVNUX09VVFBVVF9URVNUJyk6CisgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKAorICAgICAgICAgICAgZ3Rlc3RfdGVzdF91dGlscy5HZXRTb3VyY2VEaXIoKSwKKyAgICAgICAgICAgICdfZ3Rlc3Rfb3V0cHV0X3Rlc3Rfbm9ybWFsaXplZF9hY3R1YWwudHh0JyksICd3YicpLndyaXRlKAorICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsKQorICAgICAgICBvcGVuKG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksCisgICAgICAgICAgICAnX2d0ZXN0X291dHB1dF90ZXN0X25vcm1hbGl6ZWRfZ29sZGVuLnR4dCcpLCAnd2InKS53cml0ZSgKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkX2dvbGRlbikKKworICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtYWxpemVkX2dvbGRlbiwgbm9ybWFsaXplZF9hY3R1YWwpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgaWYgc3lzLmFyZ3ZbMTpdID09IFtHRU5HT0xERU5fRkxBR106CisgICAgaWYgQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFOgorICAgICAgb3V0cHV0ID0gR2V0T3V0cHV0T2ZBbGxDb21tYW5kcygpCisgICAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICd3YicpCisgICAgICBnb2xkZW5fZmlsZS53cml0ZShvdXRwdXQpCisgICAgICBnb2xkZW5fZmlsZS5jbG9zZSgpCisgICAgZWxzZToKKyAgICAgIG1lc3NhZ2UgPSAoCisgICAgICAgICAgIiIiVW5hYmxlIHRvIHdyaXRlIGEgZ29sZGVuIGZpbGUgd2hlbiBjb21waWxlZCBpbiBhbiBlbnZpcm9ubWVudAordGhhdCBkb2VzIG5vdCBzdXBwb3J0IGFsbCB0aGUgcmVxdWlyZWQgZmVhdHVyZXMgKGRlYXRoIHRlc3RzLCB0eXBlZCB0ZXN0cywKK2FuZCBtdWx0aXBsZSB0aHJlYWRzKS4gIFBsZWFzZSBnZW5lcmF0ZSB0aGUgZ29sZGVuIGZpbGUgdXNpbmcgYSBiaW5hcnkgYnVpbHQKK3dpdGggdGhvc2UgZmVhdHVyZXMgZW5hYmxlZC4iIiIpCisKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUobWVzc2FnZSkKKyAgICAgIHN5cy5leGl0KDEpCisgIGVsc2U6CisgICAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWI2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTAzNCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBvdXRwdXQgdW5kZXIKKy8vIHZhcmlvdXMgY29uZGl0aW9ucy4gIFRoZSBvdXRwdXQgd2lsbCB0aGVuIGJlIHZlcmlmaWVkIGJ5CisvLyBndGVzdF9vdXRwdXRfdGVzdC5weSB0byBlbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBnZW5lcmF0ZXMgdGhlCisvLyBkZXNpcmVkIG1lc3NhZ2VzLiAgVGhlcmVmb3JlLCBtb3N0IHRlc3RzIGluIHRoaXMgZmlsZSBhcmUgTUVBTlQgVE8KKy8vIEZBSUwuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKK3VzaW5nIHRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheTsKKwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6Ok5vdGlmaWNhdGlvbjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07CisjZW5kaWYKKworbmFtZXNwYWNlIHBvc2l4ID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjsKKworLy8gVGVzdHMgY2F0Y2hpbmcgZmF0YWwgZmFpbHVyZXMuCisKKy8vIEEgc3Vicm91dGluZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdC4KK3ZvaWQgVGVzdEVxMShpbnQgeCkgeworICBBU1NFUlRfRVEoMSwgeCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSB0ZXN0IHN1YnJvdXRpbmUsIGNhdGNoZXMgdGhlIGZhdGFsIGZhaWx1cmUgaXQKKy8vIGdlbmVyYXRlcywgYW5kIHRoZW4gcmV0dXJucyBlYXJseS4KK3ZvaWQgVHJ5VGVzdFN1YnJvdXRpbmUoKSB7CisgIC8vIENhbGxzIGEgc3Vicm91bnRpbmUgdGhhdCB5aWVsZHMgYSBmYXRhbCBmYWlsdXJlLgorICBUZXN0RXExKDIpOworCisgIC8vIENhdGNoZXMgdGhlIGZhdGFsIGZhaWx1cmUgYW5kIGFib3J0cyB0aGUgdGVzdC4KKyAgLy8KKyAgLy8gVGhlIHRlc3Rpbmc6OlRlc3Q6OiBwcmVmaXggaXMgbmVjZXNzYXJ5IHdoZW4gY2FsbGluZworICAvLyBIYXNGYXRhbEZhaWx1cmUoKSBvdXRzaWRlIG9mIGEgVEVTVCwgVEVTVF9GLCBvciB0ZXN0IGZpeHR1cmUuCisgIGlmICh0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworCisgIC8vIElmIHdlIGdldCBoZXJlLCBzb21ldGhpbmcgaXMgd3JvbmcuCisgIEZBSUwoKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZC4iOworfQorCitURVNUKFBhc3NpbmdUZXN0LCBQYXNzaW5nVGVzdDEpIHsKK30KKworVEVTVChQYXNzaW5nVGVzdCwgUGFzc2luZ1Rlc3QyKSB7Cit9CisKKy8vIFRlc3RzIHRoYXQgcGFyYW1ldGVycyBvZiBmYWlsaW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIHByaW50ZWQgaW4gdGhlCisvLyBmYWlsaW5nIHRlc3Qgc3VtbWFyeS4KK2NsYXNzIEZhaWxpbmdQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworCitURVNUX1AoRmFpbGluZ1BhcmFtVGVzdCwgRmFpbHMpIHsKKyAgRVhQRUNUX0VRKDEsIEdldFBhcmFtKCkpOworfQorCisvLyBUaGlzIGdlbmVyYXRlcyBhIHRlc3Qgd2hpY2ggd2lsbCBmYWlsLiBHb29nbGUgVGVzdCBpcyBleHBlY3RlZCB0byBwcmludAorLy8gaXRzIHBhcmFtZXRlciB3aGVuIGl0IG91dHB1dHMgdGhlIGxpc3Qgb2YgYWxsIGZhaWxlZCB0ZXN0cy4KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFByaW50aW5nRmFpbGluZ1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxpbmdQYXJhbVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoMikpOworCitzdGF0aWMgY29uc3QgY2hhciBrR29sZGVuU3RyaW5nW10gPSAiXCJMaW5lXDAgMVwiXG5MaW5lIDIiOworCitURVNUKE5vbmZhdGFsRmFpbHVyZVRlc3QsIEVzY2FwZXNTdHJpbmdPcGVyYW5kcykgeworICBzdGQ6OnN0cmluZyBhY3R1YWwgPSAiYWN0dWFsIFwic3RyaW5nXCIiOworICBFWFBFQ1RfRVEoa0dvbGRlblN0cmluZywgYWN0dWFsKTsKKworICBjb25zdCBjaGFyKiBnb2xkZW4gPSBrR29sZGVuU3RyaW5nOworICBFWFBFQ1RfRVEoZ29sZGVuLCBhY3R1YWwpOworfQorCisvLyBUZXN0cyBjYXRjaGluZyBhIGZhdGFsIGZhaWx1cmUgaW4gYSBzdWJyb3V0aW5lLgorVEVTVChGYXRhbEZhaWx1cmVUZXN0LCBGYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpXG4iKTsKKworICBUcnlUZXN0U3Vicm91dGluZSgpOworfQorCisvLyBUZXN0cyBjYXRjaGluZyBhIGZhdGFsIGZhaWx1cmUgaW4gYSBuZXN0ZWQgc3Vicm91dGluZS4KK1RFU1QoRmF0YWxGYWlsdXJlVGVzdCwgRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKVxuIik7CisKKyAgLy8gQ2FsbHMgYSBzdWJyb3VudGluZSB0aGF0IHlpZWxkcyBhIGZhdGFsIGZhaWx1cmUuCisgIFRyeVRlc3RTdWJyb3V0aW5lKCk7CisKKyAgLy8gQ2F0Y2hlcyB0aGUgZmF0YWwgZmFpbHVyZSBhbmQgYWJvcnRzIHRoZSB0ZXN0LgorICAvLworICAvLyBXaGVuIGNhbGxpbmcgSGFzRmF0YWxGYWlsdXJlKCkgaW5zaWRlIGEgVEVTVCwgVEVTVF9GLCBvciB0ZXN0CisgIC8vIGZpeHR1cmUsIHRoZSB0ZXN0aW5nOjpUZXN0OjogcHJlZml4IGlzIG5vdCBuZWVkZWQuCisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworCisgIC8vIElmIHdlIGdldCBoZXJlLCBzb21ldGhpbmcgaXMgd3JvbmcuCisgIEZBSUwoKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZC4iOworfQorCisvLyBUZXN0cyBIYXNGYXRhbEZhaWx1cmUoKSBhZnRlciBhIGZhaWxlZCBFWFBFQ1QgY2hlY2suCitURVNUKEZhdGFsRmFpbHVyZVRlc3QsIE5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlIG9uIGZhbHNlKVxuIik7CisgIEVYUEVDVF9UUlVFKGZhbHNlKTsgIC8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUKKyAgQVNTRVJUX0ZBTFNFKEhhc0ZhdGFsRmFpbHVyZSgpKTsgIC8vIFRoaXMgc2hvdWxkIHN1Y2NlZWQuCit9CisKKy8vIFRlc3RzIGludGVybGVhdmluZyB1c2VyIGxvZ2dpbmcgYW5kIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMuCitURVNUKExvZ2dpbmdUZXN0LCBJbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucykgeworICBzdGF0aWMgY29uc3QgaW50IGFbNF0gPSB7CisgICAgMywgOSwgMiwgNgorICB9OworCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzIG9uICgzKSA+PSAoYVtpXSkpXG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihhKS9zaXplb2YoKmEpKTsgaSsrKSB7CisgICAgcHJpbnRmKCJpID09ICVkXG4iLCBpKTsKKyAgICBFWFBFQ1RfR0UoMywgYVtpXSk7CisgIH0KK30KKworLy8gVGVzdHMgdGhlIFNDT1BFRF9UUkFDRSBtYWNyby4KKworLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRlc3RpbmcgU0NPUEVEX1RSQUNFLgordm9pZCBTdWJXaXRob3V0VHJhY2UoaW50IG4pIHsKKyAgRVhQRUNUX0VRKDEsIG4pOworICBBU1NFUlRfRVEoMiwgbik7Cit9CisKKy8vIEFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIFNDT1BFRF9UUkFDRS4KK3ZvaWQgU3ViV2l0aFRyYWNlKGludCBuKSB7CisgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIm4gPSAiIDw8IG4pOworCisgIFN1YldpdGhvdXRUcmFjZShuKTsKK30KKworLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0UoKSBvYmV5cyBsZXhpY2FsIHNjb3Blcy4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgT2JleXNTY29wZXMpIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyB0cmFjZSBiZWZvcmUgU0NPUEVEX1RSQUNFKCkgaXMgaW52b2tlZC4KKyAgQUREX0ZBSUxVUkUoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkbid0IGhhdmUgYSB0cmFjZS4iOworCisgIHsKKyAgICBTQ09QRURfVFJBQ0UoIkV4cGVjdGVkIHRyYWNlIik7CisgICAgLy8gQWZ0ZXIgU0NPUEVEX1RSQUNFKCksIGEgZmFpbHVyZSBpbiB0aGUgY3VycmVudCBzY29wZSBzaG91bGQgY29udGFpbgorICAgIC8vIHRoZSB0cmFjZS4KKyAgICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgaGF2ZSBhIHRyYWNlLiI7CisgIH0KKworICAvLyBPbmNlIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgc2NvcGUgb2YgdGhlIFNDT1BFRF9UUkFDRSgpLCB0aGVyZQorICAvLyBzaG91bGQgYmUgbm8gdHJhY2UgYWdhaW4uCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZG4ndCBoYXZlIGEgdHJhY2UuIjsKK30KKworLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0Ugd29ya3MgaW5zaWRlIGEgbG9vcC4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgV29ya3NJbkxvb3ApIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIGZvciAoaW50IGkgPSAxOyBpIDw9IDI7IGkrKykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImkgPSAiIDw8IGkpOworCisgICAgU3ViV2l0aG91dFRyYWNlKGkpOworICB9Cit9CisKKy8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFIHdvcmtzIGluIGEgc3Vicm91dGluZS4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgV29ya3NJblN1YnJvdXRpbmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIFN1YldpdGhUcmFjZSgxKTsKKyAgU3ViV2l0aFRyYWNlKDIpOworfQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSBjYW4gYmUgbmVzdGVkLgorVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBDYW5CZU5lc3RlZCkgeworICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7CisKKyAgU0NPUEVEX1RSQUNFKCIiKTsgIC8vIEEgdHJhY2Ugd2l0aG91dCBhIG1lc3NhZ2UuCisKKyAgU3ViV2l0aFRyYWNlKDIpOworfQorCisvLyBUZXN0cyB0aGF0IG11bHRpcGxlIFNDT1BFRF9UUkFDRXMgY2FuIGJlIHVzZWQgaW4gdGhlIHNhbWUgc2NvcGUuCitURVNUKFNDT1BFRF9UUkFDRVRlc3QsIENhbkJlUmVwZWF0ZWQpIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIFNDT1BFRF9UUkFDRSgiQSIpOworICBBRERfRkFJTFVSRSgpCisgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQS4iOworCisgIFNDT1BFRF9UUkFDRSgiQiIpOworICBBRERfRkFJTFVSRSgpCisgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSBhbmQgQi4iOworCisgIHsKKyAgICBTQ09QRURfVFJBQ0UoIkMiKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgPDwgImNvbnRhaW4gdHJhY2UgcG9pbnQgQSwgQiwgYW5kIEMuIjsKKyAgfQorCisgIFNDT1BFRF9UUkFDRSgiRCIpOworICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgIgorICAgICAgICAgICAgICAgIDw8ICJjb250YWluIHRyYWNlIHBvaW50IEEsIEIsIGFuZCBELiI7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSgpcyBjYW4gYmUgdXNlZCBjb25jdXJyZW50bHkgZnJvbSBtdWx0aXBsZQorLy8gdGhyZWFkcy4gIE5hbWVseSwgYW4gYXNzZXJ0aW9uIHNob3VsZCBiZSBhZmZlY3RlZCBieQorLy8gU0NPUEVEX1RSQUNFKClzIGluIGl0cyBvd24gdGhyZWFkIG9ubHkuCisKKy8vIEhlcmUncyB0aGUgc2VxdWVuY2Ugb2YgYWN0aW9ucyB0aGF0IGhhcHBlbiBpbiB0aGUgdGVzdDoKKy8vCisvLyAgIFRocmVhZCBBIChtYWluKSAgICAgICAgICAgICAgICB8IFRocmVhZCBCIChzcGF3bmVkKQorLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIHNwYXducyB0aHJlYWQgQiAgICAgICAgICAgICAgICB8CisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgd2FpdHMgZm9yIG4xICAgICAgICAgICAgICAgICAgIHwgU0NPUEVEX1RSQUNFKCJUcmFjZSBCIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlcyBmYWlsdXJlICMxCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdGlmaWVzIG4xCisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgU0NPUEVEX1RSQUNFKCJUcmFjZSBBIik7ICAgICAgIHwgd2FpdHMgZm9yIG4yCisvLyAgIGdlbmVyYXRlcyBmYWlsdXJlICMyICAgICAgICAgICB8CisvLyAgIG5vdGlmaWVzIG4yICAgICAgICAgICAgICAgICAgICB8CisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgd2FpdHMgZm9yIG4zICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVzIGZhaWx1cmUgIzMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhY2UgQiBkaWVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlcyBmYWlsdXJlICM0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdGlmaWVzIG4zCisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgZ2VuZXJhdGVzIGZhaWx1cmUgIzUgICAgICAgICAgIHwgZmluaXNoZXMKKy8vICAgdHJhY2UgQSBkaWVzICAgICAgICAgICAgICAgICAgIHwKKy8vICAgZ2VuZXJhdGVzIGZhaWx1cmUgIzYgICAgICAgICAgIHwKKy8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICB3YWl0cyBmb3IgdGhyZWFkIEIgdG8gZmluaXNoICAgfAorCitzdHJ1Y3QgQ2hlY2tQb2ludHMgeworICBOb3RpZmljYXRpb24gbjE7CisgIE5vdGlmaWNhdGlvbiBuMjsKKyAgTm90aWZpY2F0aW9uIG4zOworfTsKKworc3RhdGljIHZvaWQgVGhyZWFkV2l0aFNjb3BlZFRyYWNlKENoZWNrUG9pbnRzKiBjaGVja19wb2ludHMpIHsKKyAgeworICAgIFNDT1BFRF9UUkFDRSgiVHJhY2UgQiIpOworICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEIgYWxpdmUpLiI7CisgICAgY2hlY2tfcG9pbnRzLT5uMS5Ob3RpZnkoKTsKKyAgICBjaGVja19wb2ludHMtPm4yLldhaXRGb3JOb3RpZmljYXRpb24oKTsKKworICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzMgKGluIHRocmVhZCBCLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4iOworICB9ICAvLyBUcmFjZSBCIGRpZXMgaGVyZS4KKyAgQUREX0ZBSUxVUkUoKQorICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzQgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEEgYWxpdmUpLiI7CisgIGNoZWNrX3BvaW50cy0+bjMuTm90aWZ5KCk7Cit9CisKK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgV29ya3NDb25jdXJyZW50bHkpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDYgZmFpbHVyZXMpXG4iKTsKKworICBDaGVja1BvaW50cyBjaGVja19wb2ludHM7CisgIFRocmVhZFdpdGhQYXJhbTxDaGVja1BvaW50cyo+IHRocmVhZCgmVGhyZWFkV2l0aFNjb3BlZFRyYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBjaGVja19wb2ludHMubjEuV2FpdEZvck5vdGlmaWNhdGlvbigpOworCisgIHsKKyAgICBTQ09QRURfVFJBQ0UoIlRyYWNlIEEiKTsKKyAgICBBRERfRkFJTFVSRSgpCisgICAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyIChpbiB0aHJlYWQgQSwgdHJhY2UgQSAmIEIgYm90aCBhbGl2ZSkuIjsKKyAgICBjaGVja19wb2ludHMubjIuTm90aWZ5KCk7CisgICAgY2hlY2tfcG9pbnRzLm4zLldhaXRGb3JOb3RpZmljYXRpb24oKTsKKworICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzUgKGluIHRocmVhZCBBLCBvbmx5IHRyYWNlIEEgYWxpdmUpLiI7CisgIH0gIC8vIFRyYWNlIEEgZGllcyBoZXJlLgorICBBRERfRkFJTFVSRSgpCisgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNiAoaW4gdGhyZWFkIEEsIG5vIHRyYWNlIGFsaXZlKS4iOworICB0aHJlYWQuSm9pbigpOworfQorI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKK1RFU1QoRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0LAorICAgICBESVNBQkxFRF9BbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWdTdXBwcmVzc2VzV2FybmluZykgeworICAvLyBUaGlzIHRlc3QgYm9keSBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LiAgSXRzIHNvbGUgcHVycG9zZSBpcyBmb3IKKyAgLy8gdmVyaWZ5aW5nIHRoYXQgdGhlIC0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZworICAvLyBzdXBwcmVzc2VzIHRoZSAiWU9VIEhBVkUgMTIgRElTQUJMRUQgVEVTVFMiIHdhcm5pbmcgYXQgdGhlIGVuZCBvZgorICAvLyB0aGUgdGVzdCBvdXRwdXQuCit9CisKKy8vIFRlc3RzIHVzaW5nIGFzc2VydGlvbnMgb3V0c2lkZSBvZiBURVNUIGFuZCBURVNUX0YuCisvLworLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHR3byBmYWlsdXJlcyBpbnRlbnRpb25hbGx5Lgordm9pZCBBZEhvY1Rlc3QoKSB7CisgIHByaW50ZigiVGhlIG5vbi10ZXN0IHBhcnQgb2YgdGhlIGNvZGUgaXMgZXhwZWN0ZWQgdG8gaGF2ZSAyIGZhaWx1cmVzLlxuXG4iKTsKKyAgRVhQRUNUX1RSVUUoZmFsc2UpOworICBFWFBFQ1RfRVEoMiwgMyk7Cit9CisKKy8vIFJ1bnMgYWxsIFRFU1RzLCBhbGwgVEVTVF9GcywgYW5kIHRoZSBhZCBob2MgdGVzdC4KK2ludCBSdW5BbGxUZXN0cygpIHsKKyAgQWRIb2NUZXN0KCk7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CisKKy8vIFRlc3RzIG5vbi1mYXRhbCBmYWlsdXJlcyBpbiB0aGUgZml4dHVyZSBjb25zdHJ1Y3Rvci4KK2NsYXNzIE5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIE5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICBwcmludGYoIihleHBlY3RpbmcgNSBmYWlsdXJlcylcbiIpOworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuIjsKKyAgfQorCisgIH5Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNSwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIsIGluIFNldFVwKCkuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM0LCBpbiBUZWFyRG93bi4iOworICB9Cit9OworCitURVNUX0YoTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LCBGYWlsdXJlSW5Db25zdHJ1Y3RvcikgeworICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBib2R5LiI7Cit9CisKKy8vIFRlc3RzIGZhdGFsIGZhaWx1cmVzIGluIHRoZSBmaXh0dXJlIGNvbnN0cnVjdG9yLgorY2xhc3MgRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0KCkgeworICAgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgICAgSW5pdCgpOworICB9CisKKyAgfkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIFNldFVwKCkuICAiCisgICAgICAgICAgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyB0aGUgdGVzdCBmaXh0dXJlIGMndG9yICIKKyAgICAgICAgICAgICAgICAgIDw8ICJoYWQgYSBmYXRhbCBmYWlsdXJlLiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIFRlYXJEb3duKCkuICAiCisgICAgICAgICAgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyB0aGUgdGVzdCBmaXh0dXJlIGMndG9yICIKKyAgICAgICAgICAgICAgICAgIDw8ICJoYWQgYSBmYXRhbCBmYWlsdXJlLiI7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgSW5pdCgpIHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuIjsKKyAgfQorfTsKKworVEVTVF9GKEZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCwgRmFpbHVyZUluQ29uc3RydWN0b3IpIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIHRoZSB0ZXN0IGJvZHkuICAiCisgICAgICAgICAgICAgICAgPDwgIldlIHNob3VsZCBuZXZlciBnZXQgaGVyZSwgYXMgdGhlIHRlc3QgZml4dHVyZSBjJ3RvciAiCisgICAgICAgICAgICAgICAgPDwgImhhZCBhIGZhdGFsIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdHMgbm9uLWZhdGFsIGZhaWx1cmVzIGluIFNldFVwKCkuCitjbGFzcyBOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfk5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0KCkgeworICAgIERlaW5pdCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiKGV4cGVjdGluZyA0IGZhaWx1cmVzKVxuIik7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gVGVhckRvd24oKS4iOworICB9CisgcHJpdmF0ZToKKyAgdm9pZCBEZWluaXQoKSB7CisgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM0LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KK307CisKK1RFU1RfRihOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdCwgRmFpbHVyZUluU2V0VXApIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmdW5jdGlvbi4iOworfQorCisvLyBUZXN0cyBmYXRhbCBmYWlsdXJlcyBpbiBTZXRVcCgpLgorY2xhc3MgRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5GYXRhbEZhaWx1cmVJblNldFVwVGVzdCgpIHsKKyAgICBEZWluaXQoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcmludGYoIihleHBlY3RpbmcgMyBmYWlsdXJlcylcbiIpOworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gVGVhckRvd24oKS4iOworICB9CisgcHJpdmF0ZToKKyAgdm9pZCBEZWluaXQoKSB7CisgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KK307CisKK1RFU1RfRihGYXRhbEZhaWx1cmVJblNldFVwVGVzdCwgRmFpbHVyZUluU2V0VXApIHsKKyAgRkFJTCgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gdGhlIHRlc3QgZnVuY3Rpb24uICAiCisgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyBTZXRVcCgpIGZhaWxlZC4iOworfQorCitURVNUKEFkZEZhaWx1cmVBdFRlc3QsIE1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyKSB7CisgIEFERF9GQUlMVVJFX0FUKCJmb28uY2MiLCA0MikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgaW4gZm9vLmNjIjsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gQSB1bmFyeSBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCit2b2lkIERpZUlmKGJvb2wgc2hvdWxkX2RpZSkgeworICBHVEVTVF9DSEVDS18oIXNob3VsZF9kaWUpIDw8ICIgLSBkZWF0aCBpbnNpZGUgRGllSWYoKS4iOworfQorCisvLyBUZXN0cyBydW5uaW5nIGRlYXRoIHRlc3RzIGluIGEgbXVsdGktdGhyZWFkZWQgY29udGV4dC4KKworLy8gVXNlZCBmb3IgY29vcmRpbmF0aW9uIGJldHdlZW4gdGhlIG1haW4gYW5kIHRoZSBzcGF3biB0aHJlYWQuCitzdHJ1Y3QgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zIHsKKyAgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zKCkge30KKworICBOb3RpZmljYXRpb24gc3Bhd25fdGhyZWFkX3N0YXJ0ZWQ7CisgIE5vdGlmaWNhdGlvbiBzcGF3bl90aHJlYWRfb2tfdG9fdGVybWluYXRlOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMpOworfTsKKworLy8gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSB0aHJlYWQgc3Bhd24gYnkgdGhlCisvLyBNdWx0aXBsZVRocmVhZHMgdGVzdCAoYmVsb3cpLgorc3RhdGljIHZvaWQgVGhyZWFkUm91dGluZShTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqIG5vdGlmaWNhdGlvbnMpIHsKKyAgLy8gU2lnbmFscyB0aGUgbWFpbiB0aHJlYWQgdGhhdCB0aGlzIHRocmVhZCBoYXMgc3RhcnRlZC4KKyAgbm90aWZpY2F0aW9ucy0+c3Bhd25fdGhyZWFkX3N0YXJ0ZWQuTm90aWZ5KCk7CisKKyAgLy8gV2FpdHMgZm9yIHBlcm1pc3Npb24gdG8gZmluaXNoIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICBub3RpZmljYXRpb25zLT5zcGF3bl90aHJlYWRfb2tfdG9fdGVybWluYXRlLldhaXRGb3JOb3RpZmljYXRpb24oKTsKK30KKworLy8gVGhpcyBpcyBhIGRlYXRoLXRlc3QgdGVzdCwgYnV0IGl0J3Mgbm90IG5hbWVkIHdpdGggYSBEZWF0aFRlc3QKKy8vIHN1ZmZpeC4gIEl0IHN0YXJ0cyB0aHJlYWRzIHdoaWNoIG1pZ2h0IGludGVyZmVyZSB3aXRoIGxhdGVyCisvLyBkZWF0aCB0ZXN0cywgc28gaXQgbXVzdCBydW4gYWZ0ZXIgYWxsIG90aGVyIGRlYXRoIHRlc3RzLgorY2xhc3MgRGVhdGhUZXN0QW5kTXVsdGlUaHJlYWRzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFN0YXJ0cyBhIHRocmVhZCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlZ2luLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgdGhyZWFkXy5yZXNldChuZXcgVGhyZWFkV2l0aFBhcmFtPFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyo+KAorICAgICAgICAmVGhyZWFkUm91dGluZSwgJm5vdGlmaWNhdGlvbnNfLCBOVUxMKSk7CisgICAgbm90aWZpY2F0aW9uc18uc3Bhd25fdGhyZWFkX3N0YXJ0ZWQuV2FpdEZvck5vdGlmaWNhdGlvbigpOworICB9CisgIC8vIFRlbGxzIHRoZSB0aHJlYWQgdG8gZmluaXNoLCBhbmQgcmVhcHMgaXQuCisgIC8vIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgdGhyZWFkIGxpYnJhcnkgaW4gdXNlLAorICAvLyBhIG1hbmFnZXIgdGhyZWFkIG1pZ2h0IHN0aWxsIGJlIGxlZnQgcnVubmluZyB0aGF0IHdpbGwgaW50ZXJmZXJlCisgIC8vIHdpdGggbGF0ZXIgZGVhdGggdGVzdHMuICBUaGlzIGlzIHVuZm9ydHVuYXRlLCBidXQgdGhpcyBjbGFzcworICAvLyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIGFzIGJlc3QgaXQgY2FuLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgbm90aWZpY2F0aW9uc18uc3Bhd25fdGhyZWFkX29rX3RvX3Rlcm1pbmF0ZS5Ob3RpZnkoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zIG5vdGlmaWNhdGlvbnNfOworICBzY29wZWRfcHRyPFRocmVhZFdpdGhQYXJhbTxTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqPiA+IHRocmVhZF87Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gVGhlIE1peGVkVXBUZXN0Q2FzZVRlc3QgdGVzdCBjYXNlIHZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3Qgd2lsbCBmYWlsIGEKKy8vIHRlc3QgaWYgaXQgdXNlcyBhIGRpZmZlcmVudCBmaXh0dXJlIGNsYXNzIHRoYW4gd2hhdCBvdGhlciB0ZXN0cyBpbgorLy8gdGhlIHNhbWUgdGVzdCBjYXNlIHVzZS4gIEl0IGRlbGliZXJhdGVseSBjb250YWlucyB0d28gZml4dHVyZQorLy8gY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRlZmluZWQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCisKKy8vIFRoZSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCB0ZXN0IGNhc2UgdmVyaWZpZXMgdGhhdAorLy8gd2hlbiB0aGUgdXNlciBkZWZpbmVzIHR3byB0ZXN0cyB3aXRoIHRoZSBzYW1lIHRlc3QgY2FzZSBuYW1lIEFORAorLy8gc2FtZSB0ZXN0IG5hbWUgKGJ1dCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyksIHRoZSBzZWNvbmQgdGVzdCB3aWxsCisvLyBmYWlsLgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VUZXN0LCBGaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCwKKyAgICAgICBUaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbCkge30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworCituYW1lc3BhY2UgYmFyIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUKKy8vIGdvbGRlbiBmaWxlIHRvIGNoZWNrIHRoYXQgR29vZ2xlIFRlc3QgZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsVG9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUX0YoTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QsCisgICAgICAgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBiYXIKKworLy8gVGhlIGZvbGxvd2luZyB0d28gdGVzdCBjYXNlcyB2ZXJpZnkgdGhhdCBHb29nbGUgVGVzdCBjYXRjaGVzIHRoZSB1c2VyCisvLyBlcnJvciBvZiBtaXhpbmcgVEVTVCBhbmQgVEVTVF9GIGluIHRoZSBzYW1lIHRlc3QgY2FzZS4gIFRoZSBmaXJzdAorLy8gdGVzdCBjYXNlIGNoZWNrcyB0aGUgc2NlbmFyaW8gd2hlcmUgVEVTVF9GIGFwcGVhcnMgYmVmb3JlIFRFU1QsIGFuZAorLy8gdGhlIHNlY29uZCBvbmUgY2hlY2tzIHdoZXJlIFRFU1QgYXBwZWFycyBiZWZvcmUgVEVTVF9GLgorCitjbGFzcyBURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUX0YpIHt9CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUKFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwpIHt9CisKK2NsYXNzIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1QoVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUKSB7fQorCisvLyBFeHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUgZ29sZGVuIGZpbGUgdG8gY2hlY2sgdGhhdCBHb29nbGUgVGVzdAorLy8gZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbCkgeworfQorCisvLyBVc2VkIGZvciB0ZXN0aW5nIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgYW5kIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkuCitpbnQgZ2xvYmFsX2ludGVnZXIgPSAwOworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBnbG9iYWwgdmFyaWFibGVzLgorVEVTVChFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMpIHsKKyAgZ2xvYmFsX2ludGVnZXIgPSAwOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKDEsIGdsb2JhbF9pbnRlZ2VyKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCB2YXJpYWJsZXMKKy8vIChzdGF0aWMgb3Igbm90KS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxWYXJpYWJsZXMpIHsKKyAgaW50IG0gPSAwOworICBzdGF0aWMgaW50IG47CisgIG4gPSAxOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKG0sIG4pIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBzdWNjZWVkcyB3aGVuIHRoZXJlIGlzIGV4YWN0bHkKKy8vIG9uZSBub24tZmF0YWwgZmFpbHVyZSBhbmQgbm8gZmF0YWwgZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBpcyBubworLy8gbm9uLWZhdGFsIGZhaWx1cmUuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBub24tZmF0YWwgZmFpbHVyZXMuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSAxLiI7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMi4iOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBmYXRhbAorLy8gZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBjYW4gcmVmZXJlbmNlIGdsb2JhbCB2YXJpYWJsZXMuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcykgeworICBnbG9iYWxfaW50ZWdlciA9IDA7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBBU1NFUlRfRVEoMSwgZ2xvYmFsX2ludGVnZXIpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7CisgIH0sICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCBzdGF0aWMKKy8vIHZhcmlhYmxlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxTdGF0aWNWYXJpYWJsZXMpIHsKKyAgc3RhdGljIGludCBuOworICBuID0gMTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEFTU0VSVF9FUSgwLCBuKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIHN1Y2NlZWRzIHdoZW4gdGhlcmUgaXMgZXhhY3RseQorLy8gb25lIGZhdGFsIGZhaWx1cmUgYW5kIG5vIG5vbi1mYXRhbCBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBTdWNjZWVkc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG5vIGZhdGFsCisvLyBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgIH0sICIiKTsKK30KKworLy8gQSBoZWxwZXIgZm9yIGdlbmVyYXRpbmcgYSBmYXRhbCBmYWlsdXJlLgordm9pZCBGYXRhbEZhaWx1cmUoKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBmYXRhbCBmYWlsdXJlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEZhdGFsRmFpbHVyZSgpOworICAgIEZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBub24tZmF0YWwKKy8vIGZhaWx1cmUuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHRoZSBvdXRwdXQgb2YgdHlwZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0UoVHlwZWRUZXN0LCB0ZXN0aW5nOjpUeXBlczxpbnQ+KTsKKworVFlQRURfVEVTVChUeXBlZFRlc3QsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDAsIFR5cGVQYXJhbSgpKTsKK30KKworVFlQRURfVEVTVChUeXBlZFRlc3QsIEZhaWx1cmUpIHsKKyAgRVhQRUNUX0VRKDEsIFR5cGVQYXJhbSgpKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSI7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdGhlIG91dHB1dCBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdFAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQKTsKKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDBVLCBUeXBlUGFyYW0oKSk7Cit9CisKK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQLCBGYWlsdXJlKSB7CisgIEVYUEVDVF9FUSgxVSwgVHlwZVBhcmFtKCkpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UCwgU3VjY2VzcywgRmFpbHVyZSk7CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8dW5zaWduZWQgY2hhciwgdW5zaWduZWQgaW50PiBVbnNpZ25lZFR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoVW5zaWduZWQsIFR5cGVkVGVzdFAsIFVuc2lnbmVkVHlwZXMpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFdlIHJlbHkgb24gdGhlIGdvbGRlbiBmaWxlIHRvIHZlcmlmeSB0aGF0IHRlc3RzIHdob3NlIHRlc3QgY2FzZQorLy8gbmFtZSBlbmRzIHdpdGggRGVhdGhUZXN0IGFyZSBydW4gZmlyc3QuCisKK1RFU1QoQURlYXRoVGVzdCwgU2hvdWxkUnVuRmlyc3QpIHsKK30KKworIyBpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlZCB0ZXN0cyB3aG9zZSB0ZXN0CisvLyBjYXNlIG5hbWUgZW5kcyB3aXRoIERlYXRoVGVzdCBhcmUgcnVuIGZpcnN0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFUeXBlZERlYXRoVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8aW50LCBkb3VibGU+IE51bWVyaWNUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShBVHlwZWREZWF0aFRlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoQVR5cGVkRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgeworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisjIGlmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworCisvLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIHdob3NlIHRlc3QgY2FzZSBuYW1lIGVuZHMgd2l0aCBEZWF0aFRlc3QgYXJlIHJ1biBmaXJzdC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBBVHlwZVBhcmFtRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoQVR5cGVQYXJhbURlYXRoVGVzdCk7CisKK1RZUEVEX1RFU1RfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgeworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCk7CisKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBBVHlwZVBhcmFtRGVhdGhUZXN0LCBOdW1lcmljVHlwZXMpOworCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdHMgdmFyaW91cyBmYWlsdXJlIGNvbmRpdGlvbnMgb2YKKy8vIEVYUEVDVF97LE5PTn1GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9LgorY2xhc3MgRXhwZWN0RmFpbHVyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOiAgLy8gTXVzdCBiZSBwdWJsaWMgYW5kIG5vdCBwcm90ZWN0ZWQgZHVlIHRvIGEgYnVnIGluIGcrKyAzLjQuMi4KKyAgZW51bSBGYWlsdXJlTW9kZSB7CisgICAgRkFUQUxfRkFJTFVSRSwKKyAgICBOT05GQVRBTF9GQUlMVVJFCisgIH07CisgIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmUoRmFpbHVyZU1vZGUgZmFpbHVyZSkgeworICAgIGlmIChmYWlsdXJlID09IEZBVEFMX0ZBSUxVUkUpIHsKKyAgICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICAgIH0gZWxzZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICAgIH0KKyAgfQorfTsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmUpIHsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLCAiRXhwZWN0ZWQgbm9uLWZhdGFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmUpIHsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworICAvLyBXcm9uZyBtZXNzYWdlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksICJTb21lIG90aGVyIG5vbi1mYXRhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCitjbGFzcyBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0IDogcHVibGljIEV4cGVjdEZhaWx1cmVUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZhaWx1cmVNb2RlIGZhaWx1cmUpIHsKKyAgICBUaHJlYWRXaXRoUGFyYW08RmFpbHVyZU1vZGU+IHRocmVhZCgmQWRkRmFpbHVyZSwgZmFpbHVyZSwgTlVMTCk7CisgICAgdGhyZWFkLkpvaW4oKTsKKyAgfQorfTsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZSkgeworICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdE5vbkZhdGFsRmFpbHVyZSkgeworICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKK3R5cGVkZWYgRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgdGhlIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIG9ubHkgY2F0Y2hlcyBmYWlsdXJlcyBmcm9tCisvLyB0aGUgY3VycmVudCB0aHJlYWQgaWYgaXQgaXMgaW5zdGFudGlhdGVkIHdpdGggSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQuCitURVNUX0YoU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LCBJbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZCkgeworICBwcmludGYoIihleHBlY3RpbmcgMiBmYWlsdXJlcylcbiIpOworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKKyAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELAorICAgICAgICAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRkFUQUxfRkFJTFVSRSk7CisgICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoTk9ORkFUQUxfRkFJTFVSRSk7CisgIH0KKyAgLy8gVGhlIHR3byBmYWlsdXJlcyBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnRlcmNlcHRlZC4KKyAgRVhQRUNUX0VRKDAsIHJlc3VsdHMuc2l6ZSgpKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSBleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworICAvLyBXcm9uZyBtZXNzYWdlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIG90aGVyIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisKKy8vIFR3byB0ZXN0IGVudmlyb25tZW50cyBmb3IgdGVzdGluZyB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKS4KKworY2xhc3MgRm9vRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLCAiRm9vRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsICJGb29FbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfQorfTsKKworY2xhc3MgQmFyRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLCAiQmFyRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsICJCYXJFbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICB9Cit9OworCitib29sIEdURVNUX0ZMQUcoaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzKSA9IGZhbHNlOworCisvLyBUaGUgbWFpbiBmdW5jdGlvbi4KKy8vCisvLyBUaGUgaWRlYSBpcyB0byB1c2UgR29vZ2xlIFRlc3QgdG8gcnVuIGFsbCB0aGUgdGVzdHMgd2UgaGF2ZSBkZWZpbmVkIChzb21lCisvLyBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsKSwgYW5kIHRoZW4gY29tcGFyZSB0aGUgdGVzdCByZXN1bHRzCisvLyB3aXRoIHRoZSAiZ29sZGVuIiBmaWxlLgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBmYWxzZTsKKworICAvLyBXZSBqdXN0IHJ1biB0aGUgdGVzdHMsIGtub3dpbmcgc29tZSBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsLgorICAvLyBXZSB3aWxsIHVzZSBhIHNlcGFyYXRlIFB5dGhvbiBzY3JpcHQgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mCisgIC8vIHRoaXMgcHJvZ3JhbSB3aXRoIHRoZSBnb2xkZW4gZmlsZS4KKworICAvLyBJdCdzIGhhcmQgdG8gdGVzdCBJbml0R29vZ2xlVGVzdCgpIGRpcmVjdGx5LCBhcyBpdCBoYXMgbWFueQorICAvLyBnbG9iYWwgc2lkZSBlZmZlY3RzLiAgVGhlIGZvbGxvd2luZyBsaW5lIHNlcnZlcyBhcyBhIHNhbml0eSB0ZXN0CisgIC8vIGZvciBpdC4KKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpZiAoYXJnYyA+PSAyICYmCisgICAgICAoc3RkOjpzdHJpbmcoYXJndlsxXSkgPT0KKyAgICAgICAiLS1ndGVzdF9pbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMiKSkKKyAgICBHVEVTVF9GTEFHKGludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cykgPSB0cnVlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaWYgKHRlc3Rpbmc6OmludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSAhPSAiIikgeworICAgIC8vIFNraXAgdGhlIHVzdWFsIG91dHB1dCBjYXB0dXJpbmcgaWYgd2UncmUgcnVubmluZyBhcyB0aGUgY2hpbGQKKyAgICAvLyBwcm9jZXNzIG9mIGFuIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdC4KKyMgaWYgR1RFU1RfT1NfV0lORE9XUworICAgIHBvc2l4OjpGUmVvcGVuKCJudWw6IiwgInciLCBzdGRvdXQpOworIyBlbHNlCisgICAgcG9zaXg6OkZSZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3Rkb3V0KTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgaWYgKEdURVNUX0ZMQUcoaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzKSkKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworCisgIC8vIFJlZ2lzdGVycyB0d28gZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzLgorICAvLyBUaGUgZ29sZGVuIGZpbGUgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBzZXQgdXAgaW4gdGhlIG9yZGVyIHRoZXkKKyAgLy8gYXJlIHJlZ2lzdGVyZWQsIGFuZCB0b3JuIGRvd24gaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEJhckVudmlyb25tZW50KTsKKworICByZXR1cm4gUnVuQWxsVGVzdHMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBlZWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0CkBAIC0wLDAgKzEsNzIwIEBACitUaGUgbm9uLXRlc3QgcGFydCBvZiB0aGUgY29kZSBpcyBleHBlY3RlZCB0byBoYXZlIDIgZmFpbHVyZXMuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogZmFsc2UKKyAgQWN0dWFsOiBmYWxzZQorRXhwZWN0ZWQ6IHRydWUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogMworRXhwZWN0ZWQ6IDIKKxtbMDszMm1bPT09PT09PT09PV0gG1ttUnVubmluZyA2MyB0ZXN0cyBmcm9tIDI4IHRlc3QgY2FzZXMuCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbUdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK0Zvb0Vudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KK0JhckVudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQURlYXRoVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21BRGVhdGhUZXN0LlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFEZWF0aFRlc3QuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQVR5cGVkRGVhdGhUZXN0LzAsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMybVsgUlVOICAgICAgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBVHlwZWREZWF0aFRlc3QvMSwgd2hlcmUgVHlwZVBhcmFtID0gZG91YmxlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMCwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21NeS9BVHlwZVBhcmFtRGVhdGhUZXN0LzAuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLCB3aGVyZSBUeXBlUGFyYW0gPSBkb3VibGUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMS5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gUGFzc2luZ1Rlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QxCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MQorG1swOzMybVsgUlVOICAgICAgXSAbW21QYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE5vbmZhdGFsRmFpbHVyZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogYWN0dWFsCisgIEFjdHVhbDogImFjdHVhbCBcInN0cmluZ1wiIgorRXhwZWN0ZWQ6IGtHb2xkZW5TdHJpbmcKK1doaWNoIGlzOiAiXCJMaW5lIgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBhY3R1YWwKKyAgQWN0dWFsOiAiYWN0dWFsIFwic3RyaW5nXCIiCitFeHBlY3RlZDogZ29sZGVuCitXaGljaCBpczogIlwiTGluZSIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogeAorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lCisoZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IHgKKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZQorG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgb24gZmFsc2UpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IGZhbHNlCisgIEFjdHVhbDogZmFsc2UKK0V4cGVjdGVkOiB0cnVlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIExvZ2dpbmdUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUxvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMgb24gKDMpID49IChhW2ldKSkKK2kgPT0gMAoraSA9PSAxCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6ICgzKSA+PSAoYVtpXSksIGFjdHVhbDogMyB2cyA5CitpID09IDIKK2kgPT0gMworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgNgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Mb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucworG1swOzMybVstLS0tLS0tLS0tXSAbW202IHRlc3RzIGZyb20gU0NPUEVEX1RSQUNFVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0Lk9iZXlzU2NvcGVzCisoZXhwZWN0ZWQgdG8gZmFpbCkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZG4ndCBoYXZlIGEgdHJhY2UuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgaGF2ZSBhIHRyYWNlLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRXhwZWN0ZWQgdHJhY2UKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZG4ndCBoYXZlIGEgdHJhY2UuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuT2JleXNTY29wZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luTG9vcAorKGV4cGVjdGVkIHRvIGZhaWwpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IG4KKyAgQWN0dWFsOiAxCitFeHBlY3RlZDogMgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogaSA9IDEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogbgorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBpID0gMgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5Mb29wCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJblN1YnJvdXRpbmUKKyhleHBlY3RlZCB0byBmYWlsKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBuCisgIEFjdHVhbDogMQorRXhwZWN0ZWQ6IDIKK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IG4gPSAxCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IG4KKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogbiA9IDIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luU3Vicm91dGluZQorG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlTmVzdGVkCisoZXhwZWN0ZWQgdG8gZmFpbCkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogbgorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBuID0gMgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlTmVzdGVkCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVSZXBlYXRlZAorKGV4cGVjdGVkIHRvIGZhaWwpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSBhbmQgQi4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBBCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBLCBCLCBhbmQgQy4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBCCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSwgQiwgYW5kIEQuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBECitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEEKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZVJlcGVhdGVkCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NDb25jdXJyZW50bHkKKyhleHBlY3RpbmcgNiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzEgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEIgYWxpdmUpLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogVHJhY2UgQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMiAoaW4gdGhyZWFkIEEsIHRyYWNlIEEgJiBCIGJvdGggYWxpdmUpLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogVHJhY2UgQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMyAoaW4gdGhyZWFkIEIsIHRyYWNlIEEgJiBCIGJvdGggYWxpdmUpLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogVHJhY2UgQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNCAoaW4gdGhyZWFkIEIsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM1IChpbiB0aHJlYWQgQSwgb25seSB0cmFjZSBBIGFsaXZlKS4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzYgKGluIHRocmVhZCBBLCBubyB0cmFjZSBhbGl2ZSkuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NDb25jdXJyZW50bHkKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorKGV4cGVjdGluZyA1IGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gdGhlIHRlc3QgZml4dHVyZSBjJ3Rvci4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIsIGluIFNldFVwKCkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBib2R5LgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNCwgaW4gVGVhckRvd24uCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM1LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorKGV4cGVjdGluZyAyIGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gdGhlIHRlc3QgZml4dHVyZSBjJ3Rvci4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21Ob25GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorKGV4cGVjdGluZyA0IGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIsIGluIHRoZSB0ZXN0IGZ1bmN0aW9uLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gVGVhckRvd24oKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzQsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIEZhdGFsRmFpbHVyZUluU2V0VXBUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisoZXhwZWN0aW5nIDMgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiBTZXRVcCgpLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gVGVhckRvd24oKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzMsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIEFkZEZhaWx1cmVBdFRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttQWRkRmFpbHVyZUF0VGVzdC5NZXNzYWdlQ29udGFpbnNTcGVjaWZpZWRGaWxlQW5kTGluZU51bWJlcgorZm9vLmNjOjQyOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgaW4gZm9vLmNjCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUFkZEZhaWx1cmVBdFRlc3QuTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttNCB0ZXN0cyBmcm9tIE1peGVkVXBUZXN0Q2FzZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5GaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbworG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuU2Vjb25kVGVzdEZyb21OYW1lc3BhY2VGb28KKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbAorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRmFpbGVkCitBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQorY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgTWl4ZWRVcFRlc3RDYXNlVGVzdCwKK3lvdSBkZWZpbmVkIHRlc3QgRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbyBhbmQgdGVzdCBUaGlzU2hvdWxkRmFpbAordXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZgordGhlIHR3byBjbGFzc2VzIGFyZSBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIG9yIHRyYW5zbGF0aW9uCit1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lCitvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWwKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbFRvbworZ3Rlc3QuY2M6IzogRmFpbHVyZQorRmFpbGVkCitBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQorY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgTWl4ZWRVcFRlc3RDYXNlVGVzdCwKK3lvdSBkZWZpbmVkIHRlc3QgRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbyBhbmQgdGVzdCBUaGlzU2hvdWxkRmFpbFRvbwordXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZgordGhlIHR3byBjbGFzc2VzIGFyZSBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIG9yIHRyYW5zbGF0aW9uCit1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lCitvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWxUb28KKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIE1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCitndGVzdC5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0FsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCitjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCwKK3lvdSBkZWZpbmVkIHRlc3QgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwgYW5kIHRlc3QgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwKK3VzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWYKK3RoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvbgordW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZQorb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUX0YKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRgorG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKK2NsYXNzLCBzbyBtaXhpbmcgVEVTVF9GIGFuZCBURVNUIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBpcworaWxsZWdhbC4gIEluIHRlc3QgY2FzZSBURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UsCit0ZXN0IERlZmluZWRVc2luZ1RFU1RfRiBpcyBkZWZpbmVkIHVzaW5nIFRFU1RfRiBidXQKK3Rlc3QgRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwgaXMgZGVmaW5lZCB1c2luZyBURVNULiAgWW91IHByb2JhYmx5Cit3YW50IHRvIGNoYW5nZSB0aGUgVEVTVCB0byBURVNUX0Ygb3IgbW92ZSBpdCB0byBhbm90aGVyIHRlc3QKK2Nhc2UuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUQW5kU2hvdWxkRmFpbAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUX0ZBbmRTaG91bGRGYWlsCitndGVzdC5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0FsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCitjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXMKK2lsbGVnYWwuICBJbiB0ZXN0IGNhc2UgVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLAordGVzdCBEZWZpbmVkVXNpbmdURVNUX0ZBbmRTaG91bGRGYWlsIGlzIGRlZmluZWQgdXNpbmcgVEVTVF9GIGJ1dAordGVzdCBEZWZpbmVkVXNpbmdURVNUIGlzIGRlZmluZWQgdXNpbmcgVEVTVC4gIFlvdSBwcm9iYWJseQord2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0CitjYXNlLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbAorG1swOzMybVstLS0tLS0tLS0tXSAbW204IHRlc3RzIGZyb20gRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsVmFyaWFibGVzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlTG9jYWxWYXJpYWJsZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5TdWNjZWVkc1doZW5UaGVyZUlzT25lTm9uZmF0YWxGYWlsdXJlCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9Ob25mYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b05vbmZhdGFsRmFpbHVyZXMKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAyIGZhaWx1cmVzCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlIDEuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMi4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cworG1swOzMybVstLS0tLS0tLS0tXSAbW204IHRlc3RzIGZyb20gRXhwZWN0RmF0YWxGYWlsdXJlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsU3RhdGljVmFyaWFibGVzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlTG9jYWxTdGF0aWNWYXJpYWJsZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5TdWNjZWVkc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb0ZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb0ZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvRmF0YWxGYWlsdXJlcworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMiBmYWlsdXJlcworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lTm9uZmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFR5cGVkVGVzdC8wLCB3aGVyZSBUeXBlUGFyYW0gPSBpbnQKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVHlwZWRUZXN0LzAuU3VjY2VzcworG1swOzMybVsgICAgICAgT0sgXSAbW21UeXBlZFRlc3QvMC5TdWNjZXNzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVR5cGVkVGVzdC8wLkZhaWx1cmUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogVHlwZVBhcmFtKCkKKyAgQWN0dWFsOiAwCitFeHBlY3RlZDogMQorRXhwZWN0ZWQgZmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21UeXBlZFRlc3QvMC5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSBpbnQKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFVuc2lnbmVkL1R5cGVkVGVzdFAvMCwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgY2hhcgorG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuU3VjY2VzcworG1swOzMybVsgICAgICAgT0sgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuU3VjY2VzcworG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuRmFpbHVyZQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBUeXBlUGFyYW0oKQorICBBY3R1YWw6ICdcMCcKK0V4cGVjdGVkOiAxVQorV2hpY2ggaXM6IDEKK0V4cGVjdGVkIGZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLkZhaWx1cmUsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGNoYXIKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFVuc2lnbmVkL1R5cGVkVGVzdFAvMSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgaW50CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5TdWNjZXNzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5TdWNjZXNzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5GYWlsdXJlCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IFR5cGVQYXJhbSgpCisgIEFjdHVhbDogMAorRXhwZWN0ZWQ6IDFVCitXaGljaCBpczogMQorRXhwZWN0ZWQgZmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgaW50CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTQgdGVzdHMgZnJvbSBFeHBlY3RGYWlsdXJlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogU3VjY2VzczoKK1N1Y2NlZWRlZAorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlIGNvbnRhaW5pbmcgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSBleHBlY3RlZC4iCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFN1Y2Nlc3M6CitTdWNjZWVkZWQKKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZSBjb250YWluaW5nICJTb21lIG90aGVyIG5vbi1mYXRhbCBmYWlsdXJlLiIKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFN1Y2Nlc3M6CitTdWNjZWVkZWQKKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZSBjb250YWluaW5nICJTb21lIG90aGVyIGZhdGFsIGZhaWx1cmUgZXhwZWN0ZWQuIgorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBTdWNjZXNzOgorU3VjY2VlZGVkCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUgY29udGFpbmluZyAiU29tZSBvdGhlciBub24tZmF0YWwgZmFpbHVyZS4iCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgMiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QuSW50ZXJjZXB0T25seUN1cnJlbnRUaHJlYWQKKyhleHBlY3RpbmcgMiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LkludGVyY2VwdE9ubHlDdXJyZW50VGhyZWFkCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIFByaW50aW5nRmFpbGluZ1BhcmFtcy9GYWlsaW5nUGFyYW1UZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVByaW50aW5nRmFpbGluZ1BhcmFtcy9GYWlsaW5nUGFyYW1UZXN0LkZhaWxzLzAKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogR2V0UGFyYW0oKQorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVByaW50aW5nRmFpbGluZ1BhcmFtcy9GYWlsaW5nUGFyYW1UZXN0LkZhaWxzLzAsIHdoZXJlIEdldFBhcmFtKCkgPSAyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbUdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgorQmFyRW52aXJvbm1lbnQ6OlRlYXJEb3duKCkgY2FsbGVkLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCitGb29FbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorG1swOzMybVs9PT09PT09PT09XSAbW202MyB0ZXN0cyBmcm9tIDI4IHRlc3QgY2FzZXMgcmFuLgorG1swOzMybVsgIFBBU1NFRCAgXSAbW20yMSB0ZXN0cy4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttNDIgdGVzdHMsIGxpc3RlZCBiZWxvdzoKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTG9nZ2luZ1Rlc3QuSW50ZXJsZWF2aW5nTG9nZ2luZ0FuZEFzc2VydGlvbnMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5PYmV5c1Njb3BlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5Mb29wCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJblN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZU5lc3RlZAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlUmVwZWF0ZWQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0NvbmN1cnJlbnRseQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUFkZEZhaWx1cmVBdFRlc3QuTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsVG9vCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUQW5kU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vRmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVHlwZWRUZXN0LzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBjaGFyCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBpbnQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdC5JbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21QcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdC5GYWlscy8wLCB3aGVyZSBHZXRQYXJhbSgpID0gMgorCis0MiBGQUlMRUQgVEVTVFMKKxtbMDszM20gIFlPVSBIQVZFIDEgRElTQUJMRUQgVEVTVAorCisbW21Ob3RlOiBHb29nbGUgVGVzdCBmaWx0ZXIgPSBGYXRhbEZhaWx1cmVUZXN0Lio6TG9nZ2luZ1Rlc3QuKgorWz09PT09PT09PT1dIFJ1bm5pbmcgNCB0ZXN0cyBmcm9tIDIgdGVzdCBjYXNlcy4KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuCitbLS0tLS0tLS0tLV0gMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QKK1sgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiB4CisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZSAoPyBtcykKK1sgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiB4CisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZSAoPyBtcykKK1sgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgb24gZmFsc2UpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IGZhbHNlCisgIEFjdHVhbDogZmFsc2UKK0V4cGVjdGVkOiB0cnVlCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUgKD8gbXMpCitbLS0tLS0tLS0tLV0gMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QgKD8gbXMgdG90YWwpCisKK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBMb2dnaW5nVGVzdAorWyBSVU4gICAgICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMgb24gKDMpID49IChhW2ldKSkKK2kgPT0gMAoraSA9PSAxCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6ICgzKSA+PSAoYVtpXSksIGFjdHVhbDogMyB2cyA5CitpID09IDIKK2kgPT0gMworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgNgorWyAgRkFJTEVEICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zICg/IG1zKQorWy0tLS0tLS0tLS1dIDEgdGVzdCBmcm9tIExvZ2dpbmdUZXN0ICg/IG1zIHRvdGFsKQorCitbLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duCitbPT09PT09PT09PV0gNCB0ZXN0cyBmcm9tIDIgdGVzdCBjYXNlcyByYW4uICg/IG1zIHRvdGFsKQorWyAgUEFTU0VEICBdIDAgdGVzdHMuCitbICBGQUlMRUQgIF0gNCB0ZXN0cywgbGlzdGVkIGJlbG93OgorWyAgRkFJTEVEICBdIEZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorWyAgRkFJTEVEICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisKKyA0IEZBSUxFRCBURVNUUworTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gKkRJU0FCTEVEXyoKK1s9PT09PT09PT09XSBSdW5uaW5nIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlLgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QKK1sgUlVOICAgICAgXSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QuRElTQUJMRURfQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnU3VwcHJlc3Nlc1dhcm5pbmcKK1sgICAgICAgT0sgXSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QuRElTQUJMRURfQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnU3VwcHJlc3Nlc1dhcm5pbmcKK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK1s9PT09PT09PT09XSAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZSByYW4uCitbICBQQVNTRUQgIF0gMSB0ZXN0LgorTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gUGFzc2luZ1Rlc3QuKgorTm90ZTogVGhpcyBpcyB0ZXN0IHNoYXJkIDIgb2YgMi4KK1s9PT09PT09PT09XSBSdW5uaW5nIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlLgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBQYXNzaW5nVGVzdAorWyBSVU4gICAgICBdIFBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MgorWyAgICAgICBPSyBdIFBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgorWz09PT09PT09PT1dIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlIHJhbi4KK1sgIFBBU1NFRCAgXSAxIHRlc3QuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRlZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDI0MjcgQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIG9uIDEwLzMxLzIwMTEgYnkgY29tbWFuZAorLy8gJ2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgNScuICBETyBOT1QgRURJVCBCWSBIQU5EIQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGd0ZXN0X3ByZWRfaW1wbC5oCisvLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIHNjcmlwdCBhbmQgcXVpdGUgbG9uZy4gIElmIHlvdSBpbnRlbmQgdG8KKy8vIGxlYXJuIGhvdyBHb29nbGUgVGVzdCB3b3JrcyBieSByZWFkaW5nIGl0cyB1bml0IHRlc3RzLCByZWFkCisvLyBndGVzdF91bml0dGVzdC5jYyBpbnN0ZWFkLgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBHb29nbGUgVGVzdCBwcmVkaWNhdGUKKy8vIGFzc2VydGlvbnMuICBXZSBjb21waWxlIGl0IGFzIHBhcnQgb2YgdGhlIGd0ZXN0X3VuaXR0ZXN0IHRhcmdldAorLy8gb25seSB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiB0aWR5IGFuZCBjb21wYWN0LCBhcyBpdCBpcyBxdWl0ZQorLy8gaW52b2x2ZWQgdG8gc2V0IHVwIHRoZSBzdGFnZSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCB1c2luZyBHb29nbGUKKy8vIFRlc3QgaXRzZWxmLgorLy8KKy8vIEN1cnJlbnRseSwgZ3Rlc3RfdW5pdHRlc3QgdGFrZXMgfjExIHNlY29uZHMgdG8gcnVuIGluIHRoZSB0ZXN0aW5nCisvLyBkYWVtb24uICBJbiB0aGUgZnV0dXJlLCBpZiBpdCBncm93cyB0b28gbGFyZ2UgYW5kIG5lZWRzIG11Y2ggbW9yZQorLy8gdGltZSB0byBmaW5pc2gsIHdlIHNob3VsZCBjb25zaWRlciBzZXBhcmF0aW5nIHRoaXMgZmlsZSBpbnRvIGEKKy8vIHN0YW5kLWFsb25lIHJlZ3Jlc3Npb24gdGVzdC4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gQSB1c2VyLWRlZmluZWQgZGF0YSB0eXBlLgorc3RydWN0IEJvb2wgeworICBleHBsaWNpdCBCb29sKGludCB2YWwpIDogdmFsdWUodmFsICE9IDApIHt9CisKKyAgYm9vbCBvcGVyYXRvcj4oaW50IG4pIGNvbnN0IHsgcmV0dXJuIHZhbHVlID4gQm9vbChuKS52YWx1ZTsgfQorCisgIEJvb2wgb3BlcmF0b3IrKGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gQm9vbCh2YWx1ZSArIHJocy52YWx1ZSk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQm9vbCYgcmhzKSBjb25zdCB7IHJldHVybiB2YWx1ZSA9PSByaHMudmFsdWU7IH0KKworICBib29sIHZhbHVlOworfTsKKworLy8gRW5hYmxlcyBCb29sIHRvIGJlIHVzZWQgaW4gYXNzZXJ0aW9ucy4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCb29sJiB4KSB7CisgIHJldHVybiBvcyA8PCAoeC52YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIHVuYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2Jvb2wgUHJlZEZ1bmN0aW9uMShUMSB2MSkgeworICByZXR1cm4gdjEgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb24xSW50KGludCB2MSkgeworICByZXR1cm4gdjEgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb24xQm9vbChCb29sIHYxKSB7CisgIHJldHVybiB2MSA+IDA7Cit9CisKKy8vIEEgdW5hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3IxIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVDEmIHYxKSB7CisgICAgcmV0dXJuIHYxID4gMDsKKyAgfQorfTsKKworLy8gQSB1bmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjEoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjEodjEpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgPDwgIi4iOworfQorCisvLyBBIHVuYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjEgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uMShlMSwgdjEpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMS4KKworY2xhc3MgUHJlZGljYXRlMVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworfTsKKworYm9vbCBQcmVkaWNhdGUxVGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlMVRlc3Q6OmZpbmlzaGVkXzsKK2ludCBQcmVkaWNhdGUxVGVzdDo6bjFfOworCit0eXBlZGVmIFByZWRpY2F0ZTFUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUxVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMVRlc3QgRVhQRUNUX1BSRUQxVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMVRlc3QgQVNTRVJUX1BSRUQxVGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKKyAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3Rpb24xQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3Rpb24xSW50LAorICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3Rpb24xSW50LAorICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdGlvbjFCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKKyAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0aW9uMUJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKy8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgYmluYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIGJpbmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBQcmVkRnVuY3Rpb24yKFQxIHYxLCBUMiB2MikgeworICByZXR1cm4gdjEgKyB2MiA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbjJJbnQoaW50IHYxLCBpbnQgdjIpIHsKKyAgcmV0dXJuIHYxICsgdjIgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb24yQm9vbChCb29sIHYxLCBCb29sIHYyKSB7CisgIHJldHVybiB2MSArIHYyID4gMDsKK30KKworLy8gQSBiaW5hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3IyIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgeworICAgIHJldHVybiB2MSArIHYyID4gMDsKKyAgfQorfTsKKworLy8gQSBiaW5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uMihjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSB7CisgIGlmIChQcmVkRnVuY3Rpb24yKHYxLCB2MikpCisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBlMSA8PCAiICsgIiA8PCBlMgorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCB2MSArIHYyIDw8ICIuIjsKK30KKworLy8gQSBiaW5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yMiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uMihlMSwgZTIsIHYxLCB2Mik7CisgIH0KK307CisKKy8vIFRlc3RzIGZvciB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQyLgorCitjbGFzcyBQcmVkaWNhdGUyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBleHBlY3RlZF90b19maW5pc2hfID0gdHJ1ZTsKKyAgICBmaW5pc2hlZF8gPSBmYWxzZTsKKyAgICBuMV8gPSBuMl8gPSAwOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIFZlcmlmaWVzIHRoYXQgZWFjaCBvZiB0aGUgcHJlZGljYXRlJ3MgYXJndW1lbnRzIHdhcyBldmFsdWF0ZWQKKyAgICAvLyBleGFjdGx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDEsIG4xXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAyICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuMl8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworICBzdGF0aWMgaW50IG4yXzsKK307CisKK2Jvb2wgUHJlZGljYXRlMlRlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZTJUZXN0OjpmaW5pc2hlZF87CitpbnQgUHJlZGljYXRlMlRlc3Q6Om4xXzsKK2ludCBQcmVkaWNhdGUyVGVzdDo6bjJfOworCit0eXBlZGVmIFByZWRpY2F0ZTJUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUyVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMlRlc3QgRVhQRUNUX1BSRUQyVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMlRlc3QgQVNTRVJUX1BSRUQyVGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0aW9uMkludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0aW9uMkJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3Rpb24ySW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3Rpb24ySW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIHRlcm5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgdGVybmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK2Jvb2wgUHJlZEZ1bmN0aW9uMyhUMSB2MSwgVDIgdjIsIFQzIHYzKSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb24zSW50KGludCB2MSwgaW50IHYyLCBpbnQgdjMpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbjNCb29sKEJvb2wgdjEsIEJvb2wgdjIsIEJvb2wgdjMpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyA+IDA7Cit9CisKKy8vIEEgdGVybmFyeSBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvcjMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgeworICAgIHJldHVybiB2MSArIHYyICsgdjMgPiAwOworICB9Cit9OworCisvLyBBIHRlcm5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjMoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzKSB7CisgIGlmIChQcmVkRnVuY3Rpb24zKHYxLCB2MiwgdjMpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgKyB2MiArIHYzIDw8ICIuIjsKK30KKworLy8gQSB0ZXJuYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgY29uc3QgeworICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb24zKGUxLCBlMiwgZTMsIHYxLCB2MiwgdjMpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMy4KKworY2xhc3MgUHJlZGljYXRlM1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gbjJfID0gbjNfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4zXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA0ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgorICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKKyAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKKyAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKKyAgICB9CisgIH0KKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOworCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87CisKKyAgc3RhdGljIGludCBuMV87CisgIHN0YXRpYyBpbnQgbjJfOworICBzdGF0aWMgaW50IG4zXzsKK307CisKK2Jvb2wgUHJlZGljYXRlM1Rlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZTNUZXN0OjpmaW5pc2hlZF87CitpbnQgUHJlZGljYXRlM1Rlc3Q6Om4xXzsKK2ludCBQcmVkaWNhdGUzVGVzdDo6bjJfOworaW50IFByZWRpY2F0ZTNUZXN0OjpuM187CisKK3R5cGVkZWYgUHJlZGljYXRlM1Rlc3QgRVhQRUNUX1BSRURfRk9STUFUM1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTNUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUzVGVzdCBFWFBFQ1RfUFJFRDNUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUzVGVzdCBBU1NFUlRfUFJFRDNUZXN0OworCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zSW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zSW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdGlvbjNJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdGlvbjNCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0aW9uM0ludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIDQtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIDQtYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2Jvb2wgUHJlZEZ1bmN0aW9uNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb240SW50KGludCB2MSwgaW50IHYyLCBpbnQgdjMsIGludCB2NCkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb240Qm9vbChCb29sIHYxLCBCb29sIHYyLCBCb29sIHYzLCBCb29sIHY0KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCA+IDA7Cit9CisKKy8vIEEgNC1hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3I0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7CisgICAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ID4gMDsKKyAgfQorfTsKKworLy8gQSA0LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjQoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjQodjEsIHYyLCB2MywgdjQpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMgPDwgIiArICIgPDwgZTQKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgKyB2MiArIHYzICsgdjQgPDwgIi4iOworfQorCisvLyBBIDQtYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjQgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uNChlMSwgZTIsIGUzLCBlNCwgdjEsIHYyLCB2MywgdjQpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNC4KKworY2xhc3MgUHJlZGljYXRlNFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gbjJfID0gbjNfID0gbjRfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4zXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA0ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuNF8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNSAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworICBzdGF0aWMgaW50IG4yXzsKKyAgc3RhdGljIGludCBuM187CisgIHN0YXRpYyBpbnQgbjRfOworfTsKKworYm9vbCBQcmVkaWNhdGU0VGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlNFRlc3Q6OmZpbmlzaGVkXzsKK2ludCBQcmVkaWNhdGU0VGVzdDo6bjFfOworaW50IFByZWRpY2F0ZTRUZXN0OjpuMl87CitpbnQgUHJlZGljYXRlNFRlc3Q6Om4zXzsKK2ludCBQcmVkaWNhdGU0VGVzdDo6bjRfOworCit0eXBlZGVmIFByZWRpY2F0ZTRUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0OwordHlwZWRlZiBQcmVkaWNhdGU0VGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNFRlc3QgRVhQRUNUX1BSRUQ0VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNFRlc3QgQVNTRVJUX1BSRUQ0VGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENChQcmVkRnVuY3Rpb240Qm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENChQcmVkRnVuY3Rpb240SW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENChQcmVkRnVuY3Rpb240SW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdGlvbjRCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0aW9uNEJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKy8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgNS1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgNS1hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2Jvb2wgUHJlZEZ1bmN0aW9uNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb241SW50KGludCB2MSwgaW50IHYyLCBpbnQgdjMsIGludCB2NCwgaW50IHY1KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCArIHY1ID4gMDsKK30KK2Jvb2wgUHJlZEZ1bmN0aW9uNUJvb2woQm9vbCB2MSwgQm9vbCB2MiwgQm9vbCB2MywgQm9vbCB2NCwgQm9vbCB2NSkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgKyB2NSA+IDA7Cit9CisKKy8vIEEgNS1hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3I1IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgeworICAgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCArIHY1ID4gMDsKKyAgfQorfTsKKworLy8gQSA1LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb241KGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNSYgdjUpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjUodjEsIHYyLCB2MywgdjQsIHY1KSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzIDw8ICIgKyAiIDw8IGU0IDw8ICIgKyAiIDw8IGU1CisgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKKyAgICAgIDw8IHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPDwgIi4iOworfQorCisvLyBBIDUtYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjUgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjUoZTEsIGUyLCBlMywgZTQsIGU1LCB2MSwgdjIsIHYzLCB2NCwgdjUpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNS4KKworY2xhc3MgUHJlZGljYXRlNVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gbjJfID0gbjNfID0gbjRfID0gbjVfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4zXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA0ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuNF8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNSAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjVfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDYgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCisgICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOworICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgorICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKKworICBzdGF0aWMgaW50IG4xXzsKKyAgc3RhdGljIGludCBuMl87CisgIHN0YXRpYyBpbnQgbjNfOworICBzdGF0aWMgaW50IG40XzsKKyAgc3RhdGljIGludCBuNV87Cit9OworCitib29sIFByZWRpY2F0ZTVUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOworYm9vbCBQcmVkaWNhdGU1VGVzdDo6ZmluaXNoZWRfOworaW50IFByZWRpY2F0ZTVUZXN0OjpuMV87CitpbnQgUHJlZGljYXRlNVRlc3Q6Om4yXzsKK2ludCBQcmVkaWNhdGU1VGVzdDo6bjNfOworaW50IFByZWRpY2F0ZTVUZXN0OjpuNF87CitpbnQgUHJlZGljYXRlNVRlc3Q6Om41XzsKKwordHlwZWRlZiBQcmVkaWNhdGU1VGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNVRlc3QgQVNTRVJUX1BSRURfRk9STUFUNVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTVUZXN0IEVYUEVDVF9QUkVENVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTVUZXN0IEFTU0VSVF9QUkVENVRlc3Q7CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdGlvbjVJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241SW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdGlvbjVCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0aW9uNUludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0aW9uNUludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfcHJlbWF0dXJlX2V4aXRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI2YmU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MKQEAgLTAsMCArMSwxNDEgQEAKKy8vIENvcHlyaWdodCAyMDEzLCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBtYW5pcHVsYXRlcyB0aGUgcHJlbWF0dXJlLWV4aXQtZGV0ZWN0aW9uCisvLyBmaWxlIGNvcnJlY3RseS4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkdldEVudjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpTdGF0OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OlN0YXRTdHJ1Y3Q7CisKK25hbWVzcGFjZSB7CisKKy8vIElzIHRoZSBURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhwZWN0ZWQgdG8gYmUKKy8vIHNldD8KK2NvbnN0IGJvb2wga1Rlc3RQcmVtYXR1cmVFeGl0RmlsZUVudlZhclNob3VsZEJlU2V0ID0gZmFsc2U7CisKK2NsYXNzIFByZW1hdHVyZUV4aXRUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gZmlsZSBleGlzdHMuCisgIHN0YXRpYyBib29sIEZpbGVFeGlzdHMoY29uc3QgY2hhciogZmlsZXBhdGgpIHsKKyAgICBTdGF0U3RydWN0IHN0YXQ7CisgICAgcmV0dXJuIFN0YXQoZmlsZXBhdGgsICZzdGF0KSA9PSAwOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIFByZW1hdHVyZUV4aXRUZXN0KCkgeworICAgIHByZW1hdHVyZV9leGl0X2ZpbGVfcGF0aF8gPSBHZXRFbnYoIlRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSIpOworCisgICAgLy8gTm9ybWFsaXplIE5VTEwgdG8gIiIgZm9yIGVhc2Ugb2YgaGFuZGxpbmcuCisgICAgaWYgKHByZW1hdHVyZV9leGl0X2ZpbGVfcGF0aF8gPT0gTlVMTCkgeworICAgICAgcHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXyA9ICIiOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgZXhpc3RzLgorICBib29sIFByZW1hdHVyZUV4aXRGaWxlRXhpc3RzKCkgY29uc3QgeworICAgIHJldHVybiBGaWxlRXhpc3RzKHByZW1hdHVyZV9leGl0X2ZpbGVfcGF0aF8pOworICB9CisKKyAgY29uc3QgY2hhciogcHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXzsKK307CisKK3R5cGVkZWYgUHJlbWF0dXJlRXhpdFRlc3QgUHJlbWF0dXJlRXhpdERlYXRoVGVzdDsKKworLy8gVGVzdHMgdGhhdDoKKy8vICAgLSB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBleGlzdHMgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYQorLy8gICAgIGRlYXRoIHRlc3QgKEVYUEVDVF9ERUFUSCopLCBhbmQKKy8vICAgLSBhIGRlYXRoIHRlc3QgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCB0aGUgbWFpbiB0ZXN0IHByb2Nlc3MncworLy8gICAgIGhhbmRsaW5nIG9mIHRoZSBwcmVtYXR1cmUtZXhpdCBmaWxlLgorVEVTVF9GKFByZW1hdHVyZUV4aXREZWF0aFRlc3QsIEZpbGVFeGlzdHNEdXJpbmdFeGVjdXRpb25PZkRlYXRoVGVzdCkgeworICBpZiAoKnByZW1hdHVyZV9leGl0X2ZpbGVfcGF0aF8gPT0gJ1wwJykgeworICAgIHJldHVybjsKKyAgfQorCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoeworICAgICAgLy8gSWYgdGhlIGZpbGUgZXhpc3RzLCBjcmFzaCB0aGUgcHJvY2VzcyBzdWNoIHRoYXQgdGhlIG1haW4gdGVzdAorICAgICAgLy8gcHJvY2VzcyB3aWxsIGNhdGNoIHRoZSAoZXhwZWN0ZWQpIGNyYXNoIGFuZCByZXBvcnQgYSBzdWNjZXNzOworICAgICAgLy8gb3RoZXJ3aXNlIGRvbid0IGNyYXNoLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBtYWluIHRlc3QgcHJvY2VzcworICAgICAgLy8gdG8gcmVwb3J0IHRoYXQgdGhlIGRlYXRoIHRlc3QgaGFzIGZhaWxlZC4KKyAgICAgIGlmIChQcmVtYXR1cmVFeGl0RmlsZUV4aXN0cygpKSB7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IFRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSBpcyBzZXQgd2hlcmUgaXQncyBleHBlY3RlZCB0bworLy8gYmUgc2V0LgorVEVTVF9GKFByZW1hdHVyZUV4aXRUZXN0LCBUZXN0UHJlbWF0dXJlRXhpdEZpbGVFbnZWYXJJc1NldCkgeworICBpZiAoa1Rlc3RQcmVtYXR1cmVFeGl0RmlsZUVudlZhclNob3VsZEJlU2V0KSB7CisgICAgY29uc3QgY2hhciogY29uc3QgZmlsZXBhdGggPSBHZXRFbnYoIlRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSIpOworICAgIEFTU0VSVF9UUlVFKGZpbGVwYXRoICE9IE5VTEwpOworICAgIEFTU0VSVF9ORSgqZmlsZXBhdGgsICdcMCcpOworICB9Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgZXhpc3RzIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEKKy8vIG5vcm1hbCAobm9uLWRlYXRoKSB0ZXN0LgorVEVTVF9GKFByZW1hdHVyZUV4aXRUZXN0LCBQcmVtYXR1cmVFeGl0RmlsZUV4aXN0c0R1cmluZ1Rlc3RFeGVjdXRpb24pIHsKKyAgaWYgKCpwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfID09ICdcMCcpIHsKKyAgICByZXR1cm47CisgIH0KKworICBFWFBFQ1RfVFJVRShQcmVtYXR1cmVFeGl0RmlsZUV4aXN0cygpKQorICAgICAgPDwgIiBmaWxlICIgPDwgcHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXworICAgICAgPDwgIiBzaG91bGQgZXhpc3QgZHVyaW5nIHRlc3QgZXhlY3V0aW9uLCBidXQgZG9lc24ndC4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgY29uc3QgaW50IGV4aXRfY29kZSA9IFJVTl9BTExfVEVTVFMoKTsKKworICAvLyBUZXN0IHRoYXQgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaXMgZGVsZXRlZCB1cG9uIHJldHVybiBmcm9tCisgIC8vIFJVTl9BTExfVEVTVFMoKS4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZXBhdGggPSBHZXRFbnYoIlRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSIpOworICBpZiAoZmlsZXBhdGggIT0gTlVMTCAmJiAqZmlsZXBhdGggIT0gJ1wwJykgeworICAgIGlmIChQcmVtYXR1cmVFeGl0VGVzdDo6RmlsZUV4aXN0cyhmaWxlcGF0aCkpIHsKKyAgICAgIHByaW50ZigKKyAgICAgICAgICAiRmlsZSAlcyBzaG91bGRuJ3QgZXhpc3QgYWZ0ZXIgdGhlIHRlc3QgcHJvZ3JhbSBmaW5pc2hlcywgYnV0IGRvZXMuIiwKKyAgICAgICAgICBmaWxlcGF0aCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXhpdF9jb2RlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwYWJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBVbml0IHRlc3QgZm9yIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0L3Byb2R1Y3Rpb24uaCIKKworLy8gVGVzdHMgdGhhdCBwcml2YXRlIG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gYSBURVNUIGRlY2xhcmVkIGFzCisvLyBhIGZyaWVuZCBvZiB0aGUgY2xhc3MuCitURVNUKFByaXZhdGVDb2RlVGVzdCwgQ2FuQWNjZXNzUHJpdmF0ZU1lbWJlcnMpIHsKKyAgUHJpdmF0ZUNvZGUgYTsKKyAgRVhQRUNUX0VRKDAsIGEueF8pOworCisgIGEuc2V0X3goMSk7CisgIEVYUEVDVF9FUSgxLCBhLnhfKTsKK30KKwordHlwZWRlZiB0ZXN0aW5nOjpUZXN0IFByaXZhdGVDb2RlRml4dHVyZVRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgcHJpdmF0ZSBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGEgVEVTVF9GIGRlY2xhcmVkCisvLyBhcyBhIGZyaWVuZCBvZiB0aGUgY2xhc3MuCitURVNUX0YoUHJpdmF0ZUNvZGVGaXh0dXJlVGVzdCwgQ2FuQWNjZXNzUHJpdmF0ZU1lbWJlcnMpIHsKKyAgUHJpdmF0ZUNvZGUgYTsKKyAgRVhQRUNUX0VRKDAsIGEueF8pOworCisgIGEuc2V0X3goMik7CisgIEVYUEVDVF9FUSgyLCBhLnhfKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9yZXBlYXRfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9yZXBlYXRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODEwMTJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjCkBAIC0wLDAgKzEsMjUzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyB0aGUgLS1ndGVzdF9yZXBlYXQ9bnVtYmVyIGZsYWcuCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZGVhdGhfdGVzdF9zdHlsZSk7CitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZmlsdGVyKTsKK0dURVNUX0RFQ0xBUkVfaW50MzJfKHJlcGVhdCk7CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGZpbHRlcik7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCk7CisKK25hbWVzcGFjZSB7CisKKy8vIFdlIG5lZWQgdGhpcyB3aGVuIHdlIGFyZSB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZiBhbmQgdGhlcmVmb3JlCisvLyBjYW5ub3QgdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMuCisjZGVmaW5lIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBkbyB7XAorICAgIGNvbnN0IGludCBleHBlY3RlZF92YWwgPSAoZXhwZWN0ZWQpO1wKKyAgICBjb25zdCBpbnQgYWN0dWFsX3ZhbCA9IChhY3R1YWwpO1wKKyAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGV4cGVjdGVkX3ZhbCAhPSBhY3R1YWxfdmFsKSkge1wKKyAgICAgIDo6c3RkOjpjb3V0IDw8ICJWYWx1ZSBvZjogIiAjYWN0dWFsICJcbiJcCisgICAgICAgICAgICAgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgYWN0dWFsX3ZhbCA8PCAiXG4iXAorICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiICNleHBlY3RlZCAiXG4iXAorICAgICAgICAgICAgICAgICAgPDwgIldoaWNoIGlzOiAiIDw8IGV4cGVjdGVkX3ZhbCA8PCAiXG4iO1wKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpO1wKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisKKy8vIFVzZWQgZm9yIHZlcmlmeWluZyB0aGF0IGdsb2JhbCBlbnZpcm9ubWVudCBzZXQtdXAgYW5kIHRlYXItZG93biBhcmUKKy8vIGluc2lkZSB0aGUgZ3Rlc3RfcmVwZWF0IGxvb3AuCisKK2ludCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCA9IDA7CitpbnQgZ19lbnZpcm9ubWVudF90ZWFyX2Rvd25fY291bnQgPSAwOworCitjbGFzcyBNeUVudmlyb25tZW50IDogcHVibGljIHRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIE15RW52aXJvbm1lbnQoKSB7fQorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50Kys7IH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCsrOyB9Cit9OworCisvLyBBIHRlc3QgdGhhdCBzaG91bGQgZmFpbC4KKworaW50IGdfc2hvdWxkX2ZhaWxfY291bnQgPSAwOworCitURVNUKEZvb1Rlc3QsIFNob3VsZEZhaWwpIHsKKyAgZ19zaG91bGRfZmFpbF9jb3VudCsrOworICBFWFBFQ1RfRVEoMCwgMSkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKK30KKworLy8gQSB0ZXN0IHRoYXQgc2hvdWxkIHBhc3MuCisKK2ludCBnX3Nob3VsZF9wYXNzX2NvdW50ID0gMDsKKworVEVTVChGb29UZXN0LCBTaG91bGRQYXNzKSB7CisgIGdfc2hvdWxkX3Bhc3NfY291bnQrKzsKK30KKworLy8gQSB0ZXN0IHRoYXQgY29udGFpbnMgYSB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0IGFuZCBhIGZhc3QgZGVhdGgKKy8vIHRlc3QuICBJdCBzaG91bGQgcGFzcy4KKworaW50IGdfZGVhdGhfdGVzdF9jb3VudCA9IDA7CisKK1RFU1QoQmFyRGVhdGhUZXN0LCBUaHJlYWRTYWZlQW5kRmFzdCkgeworICBnX2RlYXRoX3Rlc3RfY291bnQrKzsKKworICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpLCAiIik7CisKKyAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCg6OnRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6QWJvcnQoKSwgIiIpOworfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKK2ludCBnX3BhcmFtX3Rlc3RfY291bnQgPSAwOworCitjb25zdCBpbnQga051bWJlck9mUGFyYW1UZXN0cyA9IDEwOworCitjbGFzcyBNeVBhcmFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4ge307CisKK1RFU1RfUChNeVBhcmFtVGVzdCwgU2hvdWxkUGFzcykgeworICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBNYWtlIHBhcmFtZXRlciB2YWx1ZSBjaGVja2luZyByb2J1c3QKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgV1JUIG9yZGVyIG9mIHRlc3RzLgorICBHVEVTVF9DSEVDS19JTlRfRVFfKGdfcGFyYW1fdGVzdF9jb3VudCAlIGtOdW1iZXJPZlBhcmFtVGVzdHMsIEdldFBhcmFtKCkpOworICBnX3BhcmFtX3Rlc3RfY291bnQrKzsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE15UGFyYW1TZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE15UGFyYW1UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6UmFuZ2UoMCwga051bWJlck9mUGFyYW1UZXN0cykpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBSZXNldHMgdGhlIGNvdW50IGZvciBlYWNoIHRlc3QuCit2b2lkIFJlc2V0Q291bnRzKCkgeworICBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCA9IDA7CisgIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50ID0gMDsKKyAgZ19zaG91bGRfZmFpbF9jb3VudCA9IDA7CisgIGdfc2hvdWxkX3Bhc3NfY291bnQgPSAwOworICBnX2RlYXRoX3Rlc3RfY291bnQgPSAwOworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIGdfcGFyYW1fdGVzdF9jb3VudCA9IDA7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCit9CisKKy8vIENoZWNrcyB0aGF0IHRoZSBjb3VudCBmb3IgZWFjaCB0ZXN0IGlzIGV4cGVjdGVkLgordm9pZCBDaGVja0NvdW50cyhpbnQgZXhwZWN0ZWQpIHsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgZ19lbnZpcm9ubWVudF9zZXRfdXBfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfc2hvdWxkX2ZhaWxfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX3Nob3VsZF9wYXNzX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgZ19kZWF0aF90ZXN0X2NvdW50KTsKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkICoga051bWJlck9mUGFyYW1UZXN0cywgZ19wYXJhbV90ZXN0X2NvdW50KTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKK30KKworLy8gVGVzdHMgdGhlIGJlaGF2aW9yIG9mIEdvb2dsZSBUZXN0IHdoZW4gLS1ndGVzdF9yZXBlYXQgaXMgbm90IHNwZWNpZmllZC4KK3ZvaWQgVGVzdFJlcGVhdFVuc3BlY2lmaWVkKCkgeworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDEsIFJVTl9BTExfVEVTVFMoKSk7CisgIENoZWNrQ291bnRzKDEpOworfQorCisvLyBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgR29vZ2xlIFRlc3Qgd2hlbiAtLWd0ZXN0X3JlcGVhdCBoYXMgdGhlIGdpdmVuIHZhbHVlLgordm9pZCBUZXN0UmVwZWF0KGludCByZXBlYXQpIHsKKyAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0OworCisgIFJlc2V0Q291bnRzKCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0ID4gMCA/IDEgOiAwLCBSVU5fQUxMX1RFU1RTKCkpOworICBDaGVja0NvdW50cyhyZXBlYXQpOworfQorCisvLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhbiBlbXB0eQorLy8gc2V0IG9mIHRlc3RzLgordm9pZCBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKGludCByZXBlYXQpIHsKKyAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0OworICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiTm9uZSI7CisKKyAgUmVzZXRDb3VudHMoKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBSVU5fQUxMX1RFU1RTKCkpOworICBDaGVja0NvdW50cygwKTsKK30KKworLy8gVGVzdHMgdXNpbmcgLS1ndGVzdF9yZXBlYXQgd2hlbiAtLWd0ZXN0X2ZpbHRlciBzcGVjaWZpZXMgYSBzZXQgb2YKKy8vIHN1Y2Nlc3NmdWwgdGVzdHMuCit2b2lkIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yU3VjY2Vzc2Z1bFRlc3RzKGludCByZXBlYXQpIHsKKyAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0OworICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiKi0qU2hvdWxkRmFpbCI7CisKKyAgUmVzZXRDb3VudHMoKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBSVU5fQUxMX1RFU1RTKCkpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKHJlcGVhdCwgZ19lbnZpcm9ubWVudF9zZXRfdXBfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKHJlcGVhdCwgZ19lbnZpcm9ubWVudF90ZWFyX2Rvd25fY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfc2hvdWxkX2ZhaWxfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKHJlcGVhdCwgZ19zaG91bGRfcGFzc19jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2RlYXRoX3Rlc3RfY291bnQpOworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0ICoga051bWJlck9mUGFyYW1UZXN0cywgZ19wYXJhbV90ZXN0X2NvdW50KTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKK30KKworLy8gVGVzdHMgdXNpbmcgLS1ndGVzdF9yZXBlYXQgd2hlbiAtLWd0ZXN0X2ZpbHRlciBzcGVjaWZpZXMgYSBzZXQgb2YKKy8vIGZhaWxlZCB0ZXN0cy4KK3ZvaWQgVGVzdFJlcGVhdFdpdGhGaWx0ZXJGb3JGYWlsZWRUZXN0cyhpbnQgcmVwZWF0KSB7CisgIEdURVNUX0ZMQUcocmVwZWF0KSA9IHJlcGVhdDsKKyAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gIipTaG91bGRGYWlsIjsKKworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDEsIFJVTl9BTExfVEVTVFMoKSk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX3Nob3VsZF9mYWlsX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBnX3Nob3VsZF9wYXNzX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBnX2RlYXRoX3Rlc3RfY291bnQpOworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMCwgZ19wYXJhbV90ZXN0X2NvdW50KTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgTXlFbnZpcm9ubWVudCk7CisKKyAgVGVzdFJlcGVhdFVuc3BlY2lmaWVkKCk7CisgIFRlc3RSZXBlYXQoMCk7CisgIFRlc3RSZXBlYXQoMSk7CisgIFRlc3RSZXBlYXQoNSk7CisKKyAgVGVzdFJlcGVhdFdpdGhFbXB0eUZpbHRlcigyKTsKKyAgVGVzdFJlcGVhdFdpdGhFbXB0eUZpbHRlcigzKTsKKworICBUZXN0UmVwZWF0V2l0aEZpbHRlckZvclN1Y2Nlc3NmdWxUZXN0cygzKTsKKworICBUZXN0UmVwZWF0V2l0aEZpbHRlckZvckZhaWxlZFRlc3RzKDQpOworCisgIC8vIEl0IHdvdWxkIGJlIG5pY2UgdG8gdmVyaWZ5IHRoYXQgdGhlIHRlc3RzIGluZGVlZCBsb29wIGZvcmV2ZXIKKyAgLy8gd2hlbiBHVEVTVF9GTEFHKHJlcGVhdCkgaXMgbmVnYXRpdmUsIGJ1dCB0aGlzIHRlc3Qgd2lsbCBiZSBxdWl0ZQorICAvLyBjb21wbGljYXRlZCB0byB3cml0ZS4gIFNpbmNlIHRoaXMgZmxhZyBpcyBmb3IgaW50ZXJhY3RpdmUKKyAgLy8gZGVidWdnaW5nIG9ubHkgYW5kIGRvZXNuJ3QgYWZmZWN0IHRoZSBub3JtYWwgdGVzdCByZXN1bHQsIHN1Y2ggYQorICAvLyB0ZXN0IHdvdWxkIGJlIGFuIG92ZXJraWxsLgorCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzBkMDMwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3QucHkKQEAgLTAsMCArMSwzMjUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVmVyaWZpZXMgdGhhdCB0ZXN0IHNodWZmbGluZyB3b3Jrcy4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisjIENvbW1hbmQgdG8gcnVuIHRoZSBndGVzdF9zaHVmZmxlX3Rlc3RfIHByb2dyYW0uCitDT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X3NodWZmbGVfdGVzdF8nKQorCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRlc3Qgc2hhcmRpbmcuCitUT1RBTF9TSEFSRFNfRU5WX1ZBUiA9ICdHVEVTVF9UT1RBTF9TSEFSRFMnCitTSEFSRF9JTkRFWF9FTlZfVkFSID0gJ0dURVNUX1NIQVJEX0lOREVYJworCitURVNUX0ZJTFRFUiA9ICdBKi5BOkEqLkI6QyonCisKK0FMTF9URVNUUyA9IFtdCitBQ1RJVkVfVEVTVFMgPSBbXQorRklMVEVSRURfVEVTVFMgPSBbXQorU0hBUkRFRF9URVNUUyA9IFtdCisKK1NIVUZGTEVEX0FMTF9URVNUUyA9IFtdCitTSFVGRkxFRF9BQ1RJVkVfVEVTVFMgPSBbXQorU0hVRkZMRURfRklMVEVSRURfVEVTVFMgPSBbXQorU0hVRkZMRURfU0hBUkRFRF9URVNUUyA9IFtdCisKKworZGVmIEFsc29SdW5EaXNhYmxlZFRlc3RzRmxhZygpOgorICByZXR1cm4gJy0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMnCisKKworZGVmIEZpbHRlckZsYWcodGVzdF9maWx0ZXIpOgorICByZXR1cm4gJy0tZ3Rlc3RfZmlsdGVyPSVzJyAlICh0ZXN0X2ZpbHRlciwpCisKKworZGVmIFJlcGVhdEZsYWcobik6CisgIHJldHVybiAnLS1ndGVzdF9yZXBlYXQ9JXMnICUgKG4sKQorCisKK2RlZiBTaHVmZmxlRmxhZygpOgorICByZXR1cm4gJy0tZ3Rlc3Rfc2h1ZmZsZScKKworCitkZWYgUmFuZG9tU2VlZEZsYWcobik6CisgIHJldHVybiAnLS1ndGVzdF9yYW5kb21fc2VlZD0lcycgJSAobiwpCisKKworZGVmIFJ1bkFuZFJldHVybk91dHB1dChleHRyYV9lbnYsIGFyZ3MpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgaXRzIG91dHB1dC4iIiIKKworICBlbnZpcm9uX2NvcHkgPSBvcy5lbnZpcm9uLmNvcHkoKQorICBlbnZpcm9uX2NvcHkudXBkYXRlKGV4dHJhX2VudikKKworICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtDT01NQU5EXSArIGFyZ3MsIGVudj1lbnZpcm9uX2NvcHkpLm91dHB1dAorCisKK2RlZiBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoZXh0cmFfZW52LCBhcmdzKToKKyAgIiIiUnVucyB0aGUgdGVzdCBwcm9ncmFtIGFuZCByZXR1cm5zIGEgbGlzdCBvZiB0ZXN0IGxpc3RzLgorCisgIEFyZ3M6CisgICAgZXh0cmFfZW52OiBhIG1hcCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB0aGVpciB2YWx1ZXMKKyAgICBhcmdzOiBjb21tYW5kIGxpbmUgZmxhZ3MgdG8gcGFzcyB0byBndGVzdF9zaHVmZmxlX3Rlc3RfCisKKyAgUmV0dXJuczoKKyAgICBBIGxpc3Qgd2hlcmUgdGhlIGktdGggZWxlbWVudCBpcyB0aGUgbGlzdCBvZiB0ZXN0cyBydW4gaW4gdGhlIGktdGgKKyAgICB0ZXN0IGl0ZXJhdGlvbi4KKyAgIiIiCisKKyAgdGVzdF9pdGVyYXRpb25zID0gW10KKyAgZm9yIGxpbmUgaW4gUnVuQW5kUmV0dXJuT3V0cHV0KGV4dHJhX2VudiwgYXJncykuc3BsaXQoJ1xuJyk6CisgICAgaWYgbGluZS5zdGFydHN3aXRoKCctLS0tJyk6CisgICAgICB0ZXN0cyA9IFtdCisgICAgICB0ZXN0X2l0ZXJhdGlvbnMuYXBwZW5kKHRlc3RzKQorICAgIGVsaWYgbGluZS5zdHJpcCgpOgorICAgICAgdGVzdHMuYXBwZW5kKGxpbmUuc3RyaXAoKSkgICMgJ1Rlc3RDYXNlTmFtZS5UZXN0TmFtZScKKworICByZXR1cm4gdGVzdF9pdGVyYXRpb25zCisKKworZGVmIEdldFRlc3RDYXNlcyh0ZXN0cyk6CisgICIiIlJldHVybnMgYSBsaXN0IG9mIHRlc3QgY2FzZXMgaW4gdGhlIGdpdmVuIGZ1bGwgdGVzdCBuYW1lcy4KKworICBBcmdzOgorICAgIHRlc3RzOiBhIGxpc3Qgb2YgZnVsbCB0ZXN0IG5hbWVzCisKKyAgUmV0dXJuczoKKyAgICBBIGxpc3Qgb2YgdGVzdCBjYXNlcyBmcm9tICd0ZXN0cycsIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLgorICAgIENvbnNlY3V0aXZlIGR1cGxpY2F0ZXMgYXJlIHJlbW92ZWQuCisgICIiIgorCisgIHRlc3RfY2FzZXMgPSBbXQorICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICB0ZXN0X2Nhc2UgPSB0ZXN0LnNwbGl0KCcuJylbMF0KKyAgICBpZiBub3QgdGVzdF9jYXNlIGluIHRlc3RfY2FzZXM6CisgICAgICB0ZXN0X2Nhc2VzLmFwcGVuZCh0ZXN0X2Nhc2UpCisKKyAgcmV0dXJuIHRlc3RfY2FzZXMKKworCitkZWYgQ2FsY3VsYXRlVGVzdExpc3RzKCk6CisgICIiIkNhbGN1bGF0ZXMgdGhlIGxpc3Qgb2YgdGVzdHMgcnVuIHVuZGVyIGRpZmZlcmVudCBmbGFncy4iIiIKKworICBpZiBub3QgQUxMX1RFU1RTOgorICAgIEFMTF9URVNUUy5leHRlbmQoCisgICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7fSwgW0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZygpXSlbMF0pCisKKyAgaWYgbm90IEFDVElWRV9URVNUUzoKKyAgICBBQ1RJVkVfVEVTVFMuZXh0ZW5kKEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7fSwgW10pWzBdKQorCisgIGlmIG5vdCBGSUxURVJFRF9URVNUUzoKKyAgICBGSUxURVJFRF9URVNUUy5leHRlbmQoCisgICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7fSwgW0ZpbHRlckZsYWcoVEVTVF9GSUxURVIpXSlbMF0pCisKKyAgaWYgbm90IFNIQVJERURfVEVTVFM6CisgICAgU0hBUkRFRF9URVNUUy5leHRlbmQoCisgICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pWzBdKQorCisgIGlmIG5vdCBTSFVGRkxFRF9BTExfVEVTVFM6CisgICAgU0hVRkZMRURfQUxMX1RFU1RTLmV4dGVuZChHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCksIFNodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX0FDVElWRV9URVNUUzoKKyAgICBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMuZXh0ZW5kKEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKV0pWzBdKQorCisgIGlmIG5vdCBTSFVGRkxFRF9GSUxURVJFRF9URVNUUzoKKyAgICBTSFVGRkxFRF9GSUxURVJFRF9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpLCBGaWx0ZXJGbGFnKFRFU1RfRklMVEVSKV0pWzBdKQorCisgIGlmIG5vdCBTSFVGRkxFRF9TSEFSREVEX1RFU1RTOgorICAgIFNIVUZGTEVEX1NIQVJERURfVEVTVFMuZXh0ZW5kKAorICAgICAgICBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoe1RPVEFMX1NIQVJEU19FTlZfVkFSOiAnMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzEnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKV0pWzBdKQorCisKK2NsYXNzIEdUZXN0U2h1ZmZsZVVuaXRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiJUZXN0cyB0ZXN0IHNodWZmbGluZy4iIiIKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgQ2FsY3VsYXRlVGVzdExpc3RzKCkKKworICBkZWYgdGVzdFNodWZmbGVQcmVzZXJ2ZXNOdW1iZXJPZlRlc3RzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEFMTF9URVNUUyksIGxlbihTSFVGRkxFRF9BTExfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEFDVElWRV9URVNUUyksIGxlbihTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEZJTFRFUkVEX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihTSEFSREVEX1RFU1RTKSwgbGVuKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZUNoYW5nZXNUZXN0T3JkZXIoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKFNIVUZGTEVEX0FMTF9URVNUUyAhPSBBTExfVEVTVFMsIFNIVUZGTEVEX0FMTF9URVNUUykKKyAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfQUNUSVZFX1RFU1RTICE9IEFDVElWRV9URVNUUywgU0hVRkZMRURfQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuYXNzZXJ0XyhTSFVGRkxFRF9GSUxURVJFRF9URVNUUyAhPSBGSUxURVJFRF9URVNUUywKKyAgICAgICAgICAgICAgICAgU0hVRkZMRURfRklMVEVSRURfVEVTVFMpCisgICAgc2VsZi5hc3NlcnRfKFNIVUZGTEVEX1NIQVJERURfVEVTVFMgIT0gU0hBUkRFRF9URVNUUywKKyAgICAgICAgICAgICAgICAgU0hVRkZMRURfU0hBUkRFRF9URVNUUykKKworICBkZWYgdGVzdFNodWZmbGVDaGFuZ2VzVGVzdENhc2VPcmRlcihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FMTF9URVNUUykgIT0gR2V0VGVzdENhc2VzKEFMTF9URVNUUyksCisgICAgICAgICAgICAgICAgIEdldFRlc3RDYXNlcyhTSFVGRkxFRF9BTExfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FDVElWRV9URVNUUykgIT0gR2V0VGVzdENhc2VzKEFDVElWRV9URVNUUyksCisgICAgICAgIEdldFRlc3RDYXNlcyhTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoRklMVEVSRURfVEVTVFMpLAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpICE9IEdldFRlc3RDYXNlcyhTSEFSREVEX1RFU1RTKSwKKyAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZURvZXNOb3RSZXBlYXRUZXN0KHNlbGYpOgorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FMTF9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgU0hVRkZMRURfQUxMX1RFU1RTLmNvdW50KHRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgU0hVRkZMRURfQUNUSVZFX1RFU1RTLmNvdW50KHRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9GSUxURVJFRF9URVNUUy5jb3VudCh0ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgJyVzIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UnICUgKHRlc3QsKSkKKyAgICBmb3IgdGVzdCBpbiBTSFVGRkxFRF9TSEFSREVEX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9TSEFSREVEX1RFU1RTLmNvdW50KHRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZURvZXNOb3RDcmVhdGVOZXdUZXN0KHNlbGYpOgorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FMTF9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIEFMTF9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIEFDVElWRV9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gRklMVEVSRURfVEVTVFMsICclcyBpcyBhbiBpbnZhbGlkIHRlc3QnICUgKHRlc3QsKSkKKyAgICBmb3IgdGVzdCBpbiBTSFVGRkxFRF9TSEFSREVEX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hBUkRFRF9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZUluY2x1ZGVzQWxsVGVzdHMoc2VsZik6CisgICAgZm9yIHRlc3QgaW4gQUxMX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIEFDVElWRV9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUywgJyVzIGlzIG1pc3NpbmcnICUgKHRlc3QsKSkKKyAgICBmb3IgdGVzdCBpbiBGSUxURVJFRF9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIQVJERURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSFVGRkxFRF9TSEFSREVEX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZUxlYXZlc0RlYXRoVGVzdHNBdEZyb250KHNlbGYpOgorICAgIG5vbl9kZWF0aF90ZXN0X2ZvdW5kID0gRmFsc2UKKyAgICBmb3IgdGVzdCBpbiBTSFVGRkxFRF9BQ1RJVkVfVEVTVFM6CisgICAgICBpZiAnRGVhdGhUZXN0LicgaW4gdGVzdDoKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBub25fZGVhdGhfdGVzdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QnICUgKHRlc3QsKSkKKyAgICAgIGVsc2U6CisgICAgICAgIG5vbl9kZWF0aF90ZXN0X2ZvdW5kID0gVHJ1ZQorCisgIGRlZiBfVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKHNlbGYsIHRlc3RzKToKKyAgICB0ZXN0X2Nhc2VzID0gW10KKyAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgIFt0ZXN0X2Nhc2UsIF9dID0gdGVzdC5zcGxpdCgnLicpCisgICAgICBpZiB0ZXN0X2Nhc2VzIGFuZCB0ZXN0X2Nhc2VzWy0xXSAhPSB0ZXN0X2Nhc2U6CisgICAgICAgIHRlc3RfY2FzZXMuYXBwZW5kKHRlc3RfY2FzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB0ZXN0X2Nhc2VzLmNvdW50KHRlc3RfY2FzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgY2FzZSAlcyBpcyBub3QgZ3JvdXBlZCB0b2dldGhlciBpbiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0X2Nhc2UsIHRlc3RzKSkKKworICBkZWYgdGVzdFNodWZmbGVEb2VzTm90SW50ZXJsZWF2ZVRlc3RDYXNlcyhzZWxmKToKKyAgICBzZWxmLl9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoU0hVRkZMRURfQUxMX1RFU1RTKQorICAgIHNlbGYuX1ZlcmlmeVRlc3RDYXNlc0RvTm90SW50ZXJsZWF2ZShTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTKQorICAgIHNlbGYuX1ZlcmlmeVRlc3RDYXNlc0RvTm90SW50ZXJsZWF2ZShTSFVGRkxFRF9TSEFSREVEX1RFU1RTKQorCisgIGRlZiB0ZXN0U2h1ZmZsZVJlc3RvcmVzT3JkZXJBZnRlckVhY2hJdGVyYXRpb24oc2VsZik6CisgICAgIyBHZXQgdGhlIHRlc3QgbGlzdHMgaW4gYWxsIDMgaXRlcmF0aW9ucywgdXNpbmcgcmFuZG9tIHNlZWQgMSwgMiwKKyAgICAjIGFuZCAzIHJlc3BlY3RpdmVseS4gIEdvb2dsZSBUZXN0IHBpY2tzIGEgZGlmZmVyZW50IHNlZWQgaW4gZWFjaAorICAgICMgaXRlcmF0aW9uLCBhbmQgdGhpcyB0ZXN0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KKyAgICAjIHBpY2tpbmcgc3VjY2Vzc2l2ZSBudW1iZXJzLiAgVGhpcyBkZXBlbmRlbmN5IGlzIG5vdCBpZGVhbCwgYnV0CisgICAgIyBtYWtlcyB0aGUgdGVzdCBtdWNoIGVhc2llciB0byB3cml0ZS4KKyAgICBbdGVzdHNfaW5faXRlcmF0aW9uMSwgdGVzdHNfaW5faXRlcmF0aW9uMiwgdGVzdHNfaW5faXRlcmF0aW9uM10gPSAoCisgICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSksIFJlcGVhdEZsYWcoMyldKSkKKworICAgICMgTWFrZSBzdXJlIHJ1bm5pbmcgdGhlIHRlc3RzIHdpdGggcmFuZG9tIHNlZWQgMSBnZXRzIHRoZSBzYW1lCisgICAgIyBvcmRlciBhcyBpbiBpdGVyYXRpb24gMSBhYm92ZS4KKyAgICBbdGVzdHNfd2l0aF9zZWVkMV0gPSBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHNfaW5faXRlcmF0aW9uMSwgdGVzdHNfd2l0aF9zZWVkMSkKKworICAgICMgTWFrZSBzdXJlIHJ1bm5pbmcgdGhlIHRlc3RzIHdpdGggcmFuZG9tIHNlZWQgMiBnZXRzIHRoZSBzYW1lCisgICAgIyBvcmRlciBhcyBpbiBpdGVyYXRpb24gMiBhYm92ZS4gIFN1Y2Nlc3MgbWVhbnMgdGhhdCBHb29nbGUgVGVzdAorICAgICMgY29ycmVjdGx5IHJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIGJlZm9yZSByZS1zaHVmZmxpbmcgYXQgdGhlCisgICAgIyBiZWdpbm5pbmcgb2YgaXRlcmF0aW9uIDIuCisgICAgW3Rlc3RzX3dpdGhfc2VlZDJdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDIpXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RzX2luX2l0ZXJhdGlvbjIsIHRlc3RzX3dpdGhfc2VlZDIpCisKKyAgICAjIE1ha2Ugc3VyZSBydW5uaW5nIHRoZSB0ZXN0cyB3aXRoIHJhbmRvbSBzZWVkIDMgZ2V0cyB0aGUgc2FtZQorICAgICMgb3JkZXIgYXMgaW4gaXRlcmF0aW9uIDMgYWJvdmUuICBTdWNjZXNzIG1lYW5zIHRoYXQgR29vZ2xlIFRlc3QKKyAgICAjIGNvcnJlY3RseSByZXN0b3JlcyB0aGUgdGVzdCBvcmRlciBiZWZvcmUgcmUtc2h1ZmZsaW5nIGF0IHRoZQorICAgICMgYmVnaW5uaW5nIG9mIGl0ZXJhdGlvbiAzLgorICAgIFt0ZXN0c193aXRoX3NlZWQzXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygzKV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0c19pbl9pdGVyYXRpb24zLCB0ZXN0c193aXRoX3NlZWQzKQorCisgIGRlZiB0ZXN0U2h1ZmZsZUdlbmVyYXRlc05ld09yZGVySW5FYWNoSXRlcmF0aW9uKHNlbGYpOgorICAgIFt0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c19pbl9pdGVyYXRpb24yLCB0ZXN0c19pbl9pdGVyYXRpb24zXSA9ICgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKSwgUmVwZWF0RmxhZygzKV0pKQorCisgICAgc2VsZi5hc3NlcnRfKHRlc3RzX2luX2l0ZXJhdGlvbjEgIT0gdGVzdHNfaW5faXRlcmF0aW9uMiwKKyAgICAgICAgICAgICAgICAgdGVzdHNfaW5faXRlcmF0aW9uMSkKKyAgICBzZWxmLmFzc2VydF8odGVzdHNfaW5faXRlcmF0aW9uMSAhPSB0ZXN0c19pbl9pdGVyYXRpb24zLAorICAgICAgICAgICAgICAgICB0ZXN0c19pbl9pdGVyYXRpb24xKQorICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0c19pbl9pdGVyYXRpb24yICE9IHRlc3RzX2luX2l0ZXJhdGlvbjMsCisgICAgICAgICAgICAgICAgIHRlc3RzX2luX2l0ZXJhdGlvbjIpCisKKyAgZGVmIHRlc3RTaHVmZmxlU2hhcmRlZFRlc3RzUHJlc2VydmVzUGFydGl0aW9uKHNlbGYpOgorICAgICMgSWYgd2UgcnVuIE0gdGVzdHMgb24gTiBzaGFyZHMsIHRoZSBzYW1lIE0gdGVzdHMgc2hvdWxkIGJlIHJ1biBpbgorICAgICMgdG90YWwsIHJlZ2FyZGxlc3Mgb2YgdGhlIHJhbmRvbSBzZWVkcyB1c2VkIGJ5IHRoZSBzaGFyZHMuCisgICAgW3Rlc3RzMV0gPSBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoe1RPVEFMX1NIQVJEU19FTlZfVkFSOiAnMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQVJEX0lOREVYX0VOVl9WQVI6ICcwJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSkKKyAgICBbdGVzdHMyXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzEnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMjApXSkKKyAgICBbdGVzdHMzXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzInfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMjUpXSkKKyAgICBzb3J0ZWRfc2hhcmRlZF90ZXN0cyA9IHRlc3RzMSArIHRlc3RzMiArIHRlc3RzMworICAgIHNvcnRlZF9zaGFyZGVkX3Rlc3RzLnNvcnQoKQorICAgIHNvcnRlZF9hY3RpdmVfdGVzdHMgPSBbXQorICAgIHNvcnRlZF9hY3RpdmVfdGVzdHMuZXh0ZW5kKEFDVElWRV9URVNUUykKKyAgICBzb3J0ZWRfYWN0aXZlX3Rlc3RzLnNvcnQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkX2FjdGl2ZV90ZXN0cywgc29ydGVkX3NoYXJkZWRfdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjQ0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0Xy5jYwpAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVmVyaWZpZXMgdGhhdCB0ZXN0IHNodWZmbGluZyB3b3Jrcy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6dGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Cit1c2luZyA6OnRlc3Rpbmc6OlVuaXRUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjsKKworLy8gVGhlIHRlc3QgbWV0aG9kcyBhcmUgZW1wdHksIGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgdGhpcyBwcm9ncmFtIGlzCisvLyB0byBwcmludCB0aGUgdGVzdCBuYW1lcyBiZWZvcmUvYWZ0ZXIgc2h1ZmZsaW5nLgorCitjbGFzcyBBIDogcHVibGljIFRlc3Qge307CitURVNUX0YoQSwgQSkge30KK1RFU1RfRihBLCBCKSB7fQorCitURVNUKEFEZWF0aFRlc3QsIEEpIHt9CitURVNUKEFEZWF0aFRlc3QsIEIpIHt9CitURVNUKEFEZWF0aFRlc3QsIEMpIHt9CisKK1RFU1QoQiwgQSkge30KK1RFU1QoQiwgQikge30KK1RFU1QoQiwgQykge30KK1RFU1QoQiwgRElTQUJMRURfRCkge30KK1RFU1QoQiwgRElTQUJMRURfRSkge30KKworVEVTVChCRGVhdGhUZXN0LCBBKSB7fQorVEVTVChCRGVhdGhUZXN0LCBCKSB7fQorCitURVNUKEMsIEEpIHt9CitURVNUKEMsIEIpIHt9CitURVNUKEMsIEMpIHt9CitURVNUKEMsIERJU0FCTEVEX0QpIHt9CisKK1RFU1QoQ0RlYXRoVGVzdCwgQSkge30KKworVEVTVChESVNBQkxFRF9ELCBBKSB7fQorVEVTVChESVNBQkxFRF9ELCBESVNBQkxFRF9CKSB7fQorCisvLyBUaGlzIHByaW50ZXIgcHJpbnRzIHRoZSBmdWxsIHRlc3QgbmFtZXMgb25seSwgc3RhcnRpbmcgZWFjaCB0ZXN0CisvLyBpdGVyYXRpb24gd2l0aCBhICItLS0tIiBtYXJrZXIuCitjbGFzcyBUZXN0TmFtZVByaW50ZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBpdGVyYXRpb24gKi8pIHsKKyAgICBwcmludGYoIi0tLS1cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBwcmludGYoIiVzLiVzXG4iLCB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIFJlcGxhY2VzIHRoZSBkZWZhdWx0IHByaW50ZXIgd2l0aCBUZXN0TmFtZVByaW50ZXIsIHdoaWNoIHByaW50cworICAvLyB0aGUgdGVzdCBuYW1lIG9ubHkuCisgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOworICBkZWxldGUgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSk7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IFRlc3ROYW1lUHJpbnRlcik7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkMDkxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgaXQncyBwb3NzaWJsZSB0byB1c2UgR29vZ2xlIFRlc3QgYnkgaW5jbHVkaW5nCisvLyB0aGUgZ3Rlc3QuaCBoZWFkZXIgZmlsZSBhbG9uZS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU3Vicm91dGluZSgpIHsKKyAgRVhQRUNUX0VRKDQyLCA0Mik7Cit9CisKK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3ROb0ZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRSg7KTsKKyAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKKyAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoU3Vicm91dGluZSgpKTsKKyAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoeyBTVUNDRUVEKCk7IH0pOworfQorCitURVNUKE5vRmF0YWxGYWlsdXJlVGVzdCwgQXNzZXJ0Tm9GYXRhbEZhaWx1cmUpIHsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoOyk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFN1YnJvdXRpbmUoKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHsgU1VDQ0VFRCgpOyB9KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkYWE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF9zdHJlc3NfdGVzdC5jYwpAQCAtMCwwICsxLDI1NiBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0UoKSBhbmQgdmFyaW91cyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGNhbiBiZQorLy8gdXNlZCBpbiBhIGxhcmdlIG51bWJlciBvZiB0aHJlYWRzIGNvbmN1cnJlbnRseS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFdlIG11c3QgZGVmaW5lIHRoaXMgbWFjcm8gaW4gb3JkZXIgdG8gI2luY2x1ZGUKKy8vIGd0ZXN0LWludGVybmFsLWlubC5oLiAgVGhpcyBpcyBob3cgR29vZ2xlIFRlc3QgcHJldmVudHMgYSB1c2VyIGZyb20KKy8vIGFjY2lkZW50YWxseSBkZXBlbmRpbmcgb24gaXRzIGludGVybmFsIGltcGxlbWVudGF0aW9uLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIHsKKwordXNpbmcgaW50ZXJuYWw6Ok5vdGlmaWNhdGlvbjsKK3VzaW5nIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJczsKK3VzaW5nIGludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07Cit1c2luZyBpbnRlcm5hbDo6c2NvcGVkX3B0cjsKKworLy8gSW4gb3JkZXIgdG8gcnVuIHRlc3RzIGluIHRoaXMgZmlsZSwgZm9yIHBsYXRmb3JtcyB3aGVyZSBHb29nbGUgVGVzdCBpcworLy8gdGhyZWFkIHNhZmUsIGltcGxlbWVudCBUaHJlYWRXaXRoUGFyYW0uIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaXRzIEFQSQorLy8gaW4gZ3Rlc3QtcG9ydC5oLCB3aGVyZSBpdCBpcyBkZWZpbmVkIGZvciBhbHJlYWR5IHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisKKy8vIEhvdyBtYW55IHRocmVhZHMgdG8gY3JlYXRlPworY29uc3QgaW50IGtUaHJlYWRDb3VudCA9IDUwOworCitzdGQ6OnN0cmluZyBJZFRvS2V5KGludCBpZCwgY29uc3QgY2hhciogc3VmZml4KSB7CisgIE1lc3NhZ2Uga2V5OworICBrZXkgPDwgImtleV8iIDw8IGlkIDw8ICJfIiA8PCBzdWZmaXg7CisgIHJldHVybiBrZXkuR2V0U3RyaW5nKCk7Cit9CisKK3N0ZDo6c3RyaW5nIElkVG9TdHJpbmcoaW50IGlkKSB7CisgIE1lc3NhZ2UgaWRfbWVzc2FnZTsKKyAgaWRfbWVzc2FnZSA8PCBpZDsKKyAgcmV0dXJuIGlkX21lc3NhZ2UuR2V0U3RyaW5nKCk7Cit9CisKK3ZvaWQgRXhwZWN0S2V5QW5kVmFsdWVXZXJlUmVjb3JkZWRGb3JJZCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+JiBwcm9wZXJ0aWVzLAorICAgIGludCBpZCwgY29uc3QgY2hhciogc3VmZml4KSB7CisgIFRlc3RQcm9wZXJ0eUtleUlzIG1hdGNoZXNfa2V5KElkVG9LZXkoaWQsIHN1ZmZpeCkuY19zdHIoKSk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT46OmNvbnN0X2l0ZXJhdG9yIHByb3BlcnR5ID0KKyAgICAgIHN0ZDo6ZmluZF9pZihwcm9wZXJ0aWVzLmJlZ2luKCksIHByb3BlcnRpZXMuZW5kKCksIG1hdGNoZXNfa2V5KTsKKyAgQVNTRVJUX1RSVUUocHJvcGVydHkgIT0gcHJvcGVydGllcy5lbmQoKSkKKyAgICAgIDw8ICJleHBlY3RpbmcgIiA8PCBzdWZmaXggPDwgIiB2YWx1ZSBmb3IgaWQgIiA8PCBpZDsKKyAgRVhQRUNUX1NUUkVRKElkVG9TdHJpbmcoaWQpLmNfc3RyKCksIHByb3BlcnR5LT52YWx1ZSgpKTsKK30KKworLy8gQ2FsbHMgYSBsYXJnZSBudW1iZXIgb2YgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucywgd2hlcmUgZXhhY3RseSBvbmUgb2YgdGhlbQorLy8gd2lsbCBmYWlsLgordm9pZCBNYW55QXNzZXJ0cyhpbnQgaWQpIHsKKyAgR1RFU1RfTE9HXyhJTkZPKSA8PCAiVGhyZWFkICMiIDw8IGlkIDw8ICIgcnVubmluZy4uLiI7CisKKyAgU0NPUEVEX1RSQUNFKE1lc3NhZ2UoKSA8PCAiVGhyZWFkICMiIDw8IGlkKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRDb3VudDsgaSsrKSB7CisgICAgU0NPUEVEX1RSQUNFKE1lc3NhZ2UoKSA8PCAiSXRlcmF0aW9uICMiIDw8IGkpOworCisgICAgLy8gQSBidW5jaCBvZiBhc3NlcnRpb25zIHRoYXQgc2hvdWxkIHN1Y2NlZWQuCisgICAgRVhQRUNUX1RSVUUodHJ1ZSk7CisgICAgQVNTRVJUX0ZBTFNFKGZhbHNlKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworICAgIEVYUEVDVF9TVFJFUSgiYSIsICJhIik7CisgICAgQVNTRVJUX0xFKDUsIDYpOworICAgIEVYUEVDVF9FUShpLCBpKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworCisgICAgLy8gUmVjb3JkUHJvcGVydHkoKSBzaG91bGQgaW50ZXJhY3Qgc2FmZWx5IHdpdGggb3RoZXIgdGhyZWFkcyBhcyB3ZWxsLgorICAgIC8vIFRoZSBzaGFyZWRfa2V5IGZvcmNlcyBwcm9wZXJ0eSB1cGRhdGVzLgorICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KElkVG9LZXkoaWQsICJzdHJpbmciKS5jX3N0cigpLCBJZFRvU3RyaW5nKGlkKS5jX3N0cigpKTsKKyAgICBUZXN0OjpSZWNvcmRQcm9wZXJ0eShJZFRvS2V5KGlkLCAiaW50IikuY19zdHIoKSwgaWQpOworICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KCJzaGFyZWRfa2V5IiwgSWRUb1N0cmluZyhpZCkuY19zdHIoKSk7CisKKyAgICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbCBrVGhyZWFkQ291bnQgdGltZXMgcGVyIHRocmVhZC4gIEl0CisgICAgLy8gaXMgZm9yIHRlc3Rpbmcgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gaGFuZGxlIGZhaWxlZCBhc3NlcnRpb25zIGluIGEKKyAgICAvLyBtdWx0aS10aHJlYWRlZCBjb250ZXh0LgorICAgIEVYUEVDVF9MVChpLCAwKSA8PCAiVGhpcyBzaG91bGQgYWx3YXlzIGZhaWwuIjsKKyAgfQorfQorCit2b2lkIENoZWNrVGVzdEZhaWx1cmVDb3VudChpbnQgZXhwZWN0ZWRfZmFpbHVyZXMpIHsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgY29uc3QgVGVzdFJlc3VsdCogY29uc3QgcmVzdWx0ID0gaW5mby0+cmVzdWx0KCk7CisgIEdURVNUX0NIRUNLXyhleHBlY3RlZF9mYWlsdXJlcyA9PSByZXN1bHQtPnRvdGFsX3BhcnRfY291bnQoKSkKKyAgICAgIDw8ICJMb2dnZWQgIiA8PCByZXN1bHQtPnRvdGFsX3BhcnRfY291bnQoKSA8PCAiIGZhaWx1cmVzICIKKyAgICAgIDw8ICIgdnMuICIgPDwgZXhwZWN0ZWRfZmFpbHVyZXMgPDwgIiBleHBlY3RlZCI7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFNDT1BFRF9UUkFDRSgpIGFuZCBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluIG1hbnkgdGhyZWFkcworLy8gY29uY3VycmVudGx5LgorVEVTVChTdHJlc3NUZXN0LCBDYW5Vc2VTY29wZWRUcmFjZUFuZEFzc2VydGlvbnNJbk1hbnlUaHJlYWRzKSB7CisgIHsKKyAgICBzY29wZWRfcHRyPFRocmVhZFdpdGhQYXJhbTxpbnQ+ID4gdGhyZWFkc1trVGhyZWFkQ291bnRdOworICAgIE5vdGlmaWNhdGlvbiB0aHJlYWRzX2Nhbl9zdGFydDsKKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBrVGhyZWFkQ291bnQ7IGkrKykKKyAgICAgIHRocmVhZHNbaV0ucmVzZXQobmV3IFRocmVhZFdpdGhQYXJhbTxpbnQ+KCZNYW55QXNzZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkc19jYW5fc3RhcnQpKTsKKworICAgIHRocmVhZHNfY2FuX3N0YXJ0Lk5vdGlmeSgpOworCisgICAgLy8gQmxvY2tzIHVudGlsIGFsbCB0aGUgdGhyZWFkcyBhcmUgZG9uZS4KKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBrVGhyZWFkQ291bnQ7IGkrKykKKyAgICAgIHRocmVhZHNbaV0tPkpvaW4oKTsKKyAgfQorCisgIC8vIEVuc3VyZXMgdGhhdCBrVGhyZWFkQ291bnQqa1RocmVhZENvdW50IGZhaWx1cmVzIGhhdmUgYmVlbiByZXBvcnRlZC4KKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgY29uc3QgVGVzdFJlc3VsdCogY29uc3QgcmVzdWx0ID0gaW5mby0+cmVzdWx0KCk7CisKKyAgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiBwcm9wZXJ0aWVzOworICAvLyBXZSBoYXZlIG5vIGFjY2VzcyB0byB0aGUgVGVzdFJlc3VsdCdzIGxpc3Qgb2YgcHJvcGVydGllcyBidXQgd2UgY2FuCisgIC8vIGNvcHkgdGhlbSBvbmUgYnkgb25lLgorICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpOyArK2kpCisgICAgcHJvcGVydGllcy5wdXNoX2JhY2socmVzdWx0LT5HZXRUZXN0UHJvcGVydHkoaSkpOworCisgIEVYUEVDVF9FUShrVGhyZWFkQ291bnQgKiAyICsgMSwgcmVzdWx0LT50ZXN0X3Byb3BlcnR5X2NvdW50KCkpCisgICAgICA8PCAiU3RyaW5nIGFuZCBpbnQgdmFsdWVzIHJlY29yZGVkIG9uIGVhY2ggdGhyZWFkLCAiCisgICAgICA8PCAiYXMgd2VsbCBhcyBvbmUgc2hhcmVkX2tleSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZENvdW50OyArK2kpIHsKKyAgICBFeHBlY3RLZXlBbmRWYWx1ZVdlcmVSZWNvcmRlZEZvcklkKHByb3BlcnRpZXMsIGksICJzdHJpbmciKTsKKyAgICBFeHBlY3RLZXlBbmRWYWx1ZVdlcmVSZWNvcmRlZEZvcklkKHByb3BlcnRpZXMsIGksICJpbnQiKTsKKyAgfQorICBDaGVja1Rlc3RGYWlsdXJlQ291bnQoa1RocmVhZENvdW50KmtUaHJlYWRDb3VudCk7Cit9CisKK3ZvaWQgRmFpbGluZ1RocmVhZChib29sIGlzX2ZhdGFsKSB7CisgIGlmIChpc19mYXRhbCkKKyAgICBGQUlMKCkgPDwgIkZhdGFsIGZhaWx1cmUgaW4gc29tZSBvdGhlciB0aHJlYWQuICIKKyAgICAgICAgICAgPDwgIihUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuKSI7CisgIGVsc2UKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJOb24tZmF0YWwgZmFpbHVyZSBpbiBzb21lIG90aGVyIHRocmVhZC4gIgorICAgICAgICAgICAgICAgICAgPDwgIihUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuKSI7Cit9CisKK3ZvaWQgR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoYm9vbCBpc19mYXRhbCkgeworICBUaHJlYWRXaXRoUGFyYW08Ym9vbD4gdGhyZWFkKCZGYWlsaW5nVGhyZWFkLCBpc19mYXRhbCwgTlVMTCk7CisgIHRocmVhZC5Kb2luKCk7Cit9CisKK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3ROb0ZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7CisgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpKTsKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZmFpbHVyZSAodGhlIG9uZSBmcm9tCisgIC8vIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKCkpLCBzaW5jZSB0aGUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUKKyAgLy8gc2hvdWxkIHN1Y2NlZWQuCisgIENoZWNrVGVzdEZhaWx1cmVDb3VudCgxKTsKK30KKwordm9pZCBBc3NlcnROb0ZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKCkgeworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZCh0cnVlKSk7Cit9CitURVNUKE5vRmF0YWxGYWlsdXJlVGVzdCwgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcykgeworICAvLyBVc2luZyBhIHN1YnJvdXRpbmUsIHRvIG1ha2Ugc3VyZSwgdGhhdCB0aGUgdGVzdCBjb250aW51ZXMuCisgIEFzc2VydE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMoKTsKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZmFpbHVyZSAodGhlIG9uZSBmcm9tCisgIC8vIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKCkpLCBzaW5jZSB0aGUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUKKyAgLy8gc2hvdWxkIHN1Y2NlZWQuCisgIENoZWNrVGVzdEZhaWx1cmVDb3VudCgxKTsKK30KKworVEVTVChGYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcykgeworICAvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgZmFpbCwgc2luY2UgdGhlIGN1cnJlbnQgdGhyZWFkIGRvZXNuJ3QgZ2VuZXJhdGUgYQorICAvLyBmYXRhbCBmYWlsdXJlLCBvbmx5IGFub3RoZXIgb25lIGRvZXMuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpLCAiZXhwZWN0ZWQiKTsKKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDIpOworfQorCitURVNUKEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICAvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgc3VjY2VlZCwgYmVjYXVzZSBmYWlsdXJlcyBpbiBhbGwgdGhyZWFkcyBhcmUKKyAgLy8gY29uc2lkZXJlZC4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoCisgICAgICBHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZCh0cnVlKSwgImV4cGVjdGVkIik7CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudCgwKTsKKyAgLy8gV2UgbmVlZCB0byBhZGQgYSBmYWlsdXJlLCBiZWNhdXNlIG1haW4oKSBjaGVja3MgdGhhdCB0aGVyZSBhcmUgZmFpbHVyZXMuCisgIC8vIEJ1dCB3aGVuIG9ubHkgdGhpcyB0ZXN0IGlzIHJ1biwgd2Ugc2hvdWxkbid0IGhhdmUgYW55IGZhaWx1cmVzLgorICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGlzIGFuIGV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Cit9CisKK1RFU1QoTm9uRmF0YWxGYWlsdXJlVGVzdCwgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMpIHsKKyAgLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIGZhaWwsIHNpbmNlIHRoZSBjdXJyZW50IHRocmVhZCBkb2Vzbid0IGdlbmVyYXRlIGEKKyAgLy8gZmF0YWwgZmFpbHVyZSwgb25seSBhbm90aGVyIG9uZSBkb2VzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCIpOworICBDaGVja1Rlc3RGYWlsdXJlQ291bnQoMik7Cit9CisKK1RFU1QoTm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzVGVzdCwgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBzdWNjZWVkLCBiZWNhdXNlIGZhaWx1cmVzIGluIGFsbCB0aHJlYWRzIGFyZQorICAvLyBjb25zaWRlcmVkLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUygKKyAgICAgIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKGZhbHNlKSwgImV4cGVjdGVkIik7CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudCgwKTsKKyAgLy8gV2UgbmVlZCB0byBhZGQgYSBmYWlsdXJlLCBiZWNhdXNlIG1haW4oKSBjaGVja3MgdGhhdCB0aGVyZSBhcmUgZmFpbHVyZXMsCisgIC8vIEJ1dCB3aGVuIG9ubHkgdGhpcyB0ZXN0IGlzIHJ1biwgd2Ugc2hvdWxkbid0IGhhdmUgYW55IGZhaWx1cmVzLgorICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGlzIGFuIGV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBjb25zdCBpbnQgcmVzdWx0ID0gUlVOX0FMTF9URVNUUygpOyAgLy8gRXhwZWN0ZWQgdG8gZmFpbC4KKyAgR1RFU1RfQ0hFQ0tfKHJlc3VsdCA9PSAxKSA8PCAiUlVOX0FMTF9URVNUUygpIGRpZCBub3QgZmFpbCBhcyBleHBlY3RlZCI7CisKKyAgcHJpbnRmKCJcblBBU1NcbiIpOworICByZXR1cm4gMDsKK30KKworI2Vsc2UKK1RFU1QoU3RyZXNzVGVzdCwKKyAgICAgRElTQUJMRURfVGhyZWFkU2FmZXR5VGVzdHNBcmVTa2lwcGVkV2hlbkdvb2dsZVRlc3RJc05vdFRocmVhZFNhZmUpIHsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Rlc3RfdXRpbHMucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODg4NGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Rlc3RfdXRpbHMucHkKQEAgLTAsMCArMSwzMjAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCB1dGlsaXRpZXMgZm9yIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsuIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdW5pdHRlc3QKK190ZXN0X21vZHVsZSA9IHVuaXR0ZXN0CisKKyMgU3VwcHJlc3NlcyB0aGUgJ0ltcG9ydCBub3QgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZScgbGludCBjb21wbGFpbnQuCisjIHB5bGludDogZGlzYWJsZS1tc2c9QzYyMDQKK3RyeToKKyAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgX1NVQlBST0NFU1NfTU9EVUxFX0FWQUlMQUJMRSA9IFRydWUKK2V4Y2VwdDoKKyAgaW1wb3J0IHBvcGVuMgorICBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFID0gRmFsc2UKKyMgcHlsaW50OiBlbmFibGUtbXNnPUM2MjA0CisKK0dURVNUX09VVFBVVF9WQVJfTkFNRSA9ICdHVEVTVF9PVVRQVVQnCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKK0lTX0NZR1dJTiA9IG9zLm5hbWUgPT0gJ3Bvc2l4JyBhbmQgJ0NZR1dJTicgaW4gb3MudW5hbWUoKVswXQorCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3Igc3BlY2lmeWluZyB0aGUgcGF0aCB0byB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZS4KK1BSRU1BVFVSRV9FWElUX0ZJTEVfRU5WX1ZBUiA9ICdURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUnCisKK2Vudmlyb24gPSBvcy5lbnZpcm9uLmNvcHkoKQorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzL3Vuc2V0cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIGdpdmVuIHZhbHVlLiIiIgorCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIGVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gZW52aXJvbjoKKyAgICBkZWwgZW52aXJvbltlbnZfdmFyXQorCisKKyMgSGVyZSB3ZSBleHBvc2UgYSBjbGFzcyBmcm9tIGEgcGFydGljdWxhciBtb2R1bGUsIGRlcGVuZGluZyBvbiB0aGUKKyMgZW52aXJvbm1lbnQuIFRoZSBjb21tZW50IHN1cHByZXNzZXMgdGhlICdJbnZhbGlkIHZhcmlhYmxlIG5hbWUnIGxpbnQKKyMgY29tcGxhaW50LgorVGVzdENhc2UgPSBfdGVzdF9tb2R1bGUuVGVzdENhc2UgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjQwOQorCisjIEluaXRpYWxseSBtYXBzIGEgZmxhZyB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gQWZ0ZXIKKyMgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKCkgaXMgY2FsbGVkLCBtYXBzIGEgZmxhZyB0byBpdHMgYWN0dWFsIHZhbHVlLgorX2ZsYWdfbWFwID0geydzb3VyY2VfZGlyJzogb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwKKyAgICAgICAgICAgICAnYnVpbGRfZGlyJzogb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKX0KK19ndGVzdF9mbGFnc19hcmVfcGFyc2VkID0gRmFsc2UKKworCitkZWYgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKGFyZ3YpOgorICAiIiJQYXJzZXMgYW5kIHN0cmlwcyBHb29nbGUgVGVzdCBmbGFncyBmcm9tIGFyZ3YuICBUaGlzIGlzIGlkZW1wb3RlbnQuIiIiCisKKyAgIyBTdXBwcmVzc2VzIHRoZSBsaW50IGNvbXBsYWludCBhYm91dCBhIGdsb2JhbCB2YXJpYWJsZSBzaW5jZSB3ZSBuZWVkIGl0CisgICMgaGVyZSB0byBtYWludGFpbiBtb2R1bGUtd2lkZSBzdGF0ZS4KKyAgZ2xvYmFsIF9ndGVzdF9mbGFnc19hcmVfcGFyc2VkICAjIHB5bGludDogZGlzYWJsZS1tc2c9VzA2MDMKKyAgaWYgX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQ6CisgICAgcmV0dXJuCisKKyAgX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQgPSBUcnVlCisgIGZvciBmbGFnIGluIF9mbGFnX21hcDoKKyAgICAjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgaWYgZmxhZy51cHBlcigpIGluIG9zLmVudmlyb246CisgICAgICBfZmxhZ19tYXBbZmxhZ10gPSBvcy5lbnZpcm9uW2ZsYWcudXBwZXIoKV0KKworICAgICMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgaSA9IDEgICMgU2tpcHMgdGhlIHByb2dyYW0gbmFtZS4KKyAgICB3aGlsZSBpIDwgbGVuKGFyZ3YpOgorICAgICAgcHJlZml4ID0gJy0tJyArIGZsYWcgKyAnPScKKyAgICAgIGlmIGFyZ3ZbaV0uc3RhcnRzd2l0aChwcmVmaXgpOgorICAgICAgICBfZmxhZ19tYXBbZmxhZ10gPSBhcmd2W2ldW2xlbihwcmVmaXgpOl0KKyAgICAgICAgZGVsIGFyZ3ZbaV0KKyAgICAgICAgYnJlYWsKKyAgICAgIGVsc2U6CisgICAgICAgICMgV2UgZG9uJ3QgaW5jcmVtZW50IGkgaW4gY2FzZSB3ZSBqdXN0IGZvdW5kIGEgLS1ndGVzdF8qIGZsYWcKKyAgICAgICAgIyBhbmQgcmVtb3ZlZCBpdCBmcm9tIGFyZ3YuCisgICAgICAgIGkgKz0gMQorCisKK2RlZiBHZXRGbGFnKGZsYWcpOgorICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmxhZy4iIiIKKworICAjIEluIGNhc2UgR2V0RmxhZygpIGlzIGNhbGxlZCBiZWZvcmUgTWFpbigpLCB3ZSBhbHdheXMgY2FsbAorICAjIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncygpIGhlcmUgdG8gbWFrZSBzdXJlIHRoZSAtLWd0ZXN0XyogZmxhZ3MKKyAgIyBhcmUgcGFyc2VkLgorICBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3Moc3lzLmFyZ3YpCisKKyAgcmV0dXJuIF9mbGFnX21hcFtmbGFnXQorCisKK2RlZiBHZXRTb3VyY2VEaXIoKToKKyAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSAucHkgZmlsZXMgYXJlLiIiIgorCisgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoR2V0RmxhZygnc291cmNlX2RpcicpKQorCisKK2RlZiBHZXRCdWlsZERpcigpOgorICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRlc3QgYmluYXJpZXMgYXJlLiIiIgorCisgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoR2V0RmxhZygnYnVpbGRfZGlyJykpCisKKworX3RlbXBfZGlyID0gTm9uZQorCitkZWYgX1JlbW92ZVRlbXBEaXIoKToKKyAgaWYgX3RlbXBfZGlyOgorICAgIHNodXRpbC5ybXRyZWUoX3RlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKK2F0ZXhpdC5yZWdpc3RlcihfUmVtb3ZlVGVtcERpcikKKworCitkZWYgR2V0VGVtcERpcigpOgorICAiIiJSZXR1cm5zIGEgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgZmlsZXMuIiIiCisKKyAgZ2xvYmFsIF90ZW1wX2RpcgorICBpZiBub3QgX3RlbXBfZGlyOgorICAgIF90ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICByZXR1cm4gX3RlbXBfZGlyCisKKworZGVmIEdldFRlc3RFeGVjdXRhYmxlUGF0aChleGVjdXRhYmxlX25hbWUsIGJ1aWxkX2Rpcj1Ob25lKToKKyAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGVzdCBiaW5hcnkgZ2l2ZW4gaXRzIG5hbWUuCisKKyAgVGhlIGZ1bmN0aW9uIHdpbGwgcHJpbnQgYSBtZXNzYWdlIGFuZCBhYm9ydCB0aGUgcHJvZ3JhbSBpZiB0aGUgcmVzdWx0aW5nIGZpbGUKKyAgZG9lc24ndCBleGlzdC4KKworICBBcmdzOgorICAgIGV4ZWN1dGFibGVfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBiaW5hcnkgdGhhdCB0aGUgdGVzdCBzY3JpcHQgcnVucy4KKyAgICBidWlsZF9kaXI6ICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBsb29rIGZvciBleGVjdXRhYmxlcywgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiBHZXRCdWlsZERpcigpLgorCisgIFJldHVybnM6CisgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRlc3QgYmluYXJ5LgorICAiIiIKKworICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihidWlsZF9kaXIgb3IgR2V0QnVpbGREaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9uYW1lKSkKKyAgaWYgKElTX1dJTkRPV1Mgb3IgSVNfQ1lHV0lOKSBhbmQgbm90IHBhdGguZW5kc3dpdGgoJy5leGUnKToKKyAgICBwYXRoICs9ICcuZXhlJworCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICBtZXNzYWdlID0gKAorICAgICAgICAnVW5hYmxlIHRvIGZpbmQgdGhlIHRlc3QgYmluYXJ5LiBQbGVhc2UgbWFrZSBzdXJlIHRvIHByb3ZpZGUgcGF0aFxuJworICAgICAgICAndG8gdGhlIGJpbmFyeSB2aWEgdGhlIC0tYnVpbGRfZGlyIGZsYWcgb3IgdGhlIEJVSUxEX0RJUlxuJworICAgICAgICAnZW52aXJvbm1lbnQgdmFyaWFibGUuJykKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtZXNzYWdlCisgICAgc3lzLmV4aXQoMSkKKworICByZXR1cm4gcGF0aAorCisKK2RlZiBHZXRFeGl0U3RhdHVzKGV4aXRfY29kZSk6CisgICIiIlJldHVybnMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSwgb3IgLTEgaWYgZXhpdCgpIHdhc24ndCBjYWxsZWQuCisKKyAgQXJnczoKKyAgICBleGl0X2NvZGU6IHRoZSByZXN1bHQgdmFsdWUgb2Ygb3Muc3lzdGVtKGNvbW1hbmQpLgorICAiIiIKKworICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgIyBPbiBXaW5kb3dzLCBvcy5XRVhJVFNUQVRVUygpIGRvZXNuJ3Qgd29yayBhbmQgb3Muc3lzdGVtKCkgcmV0dXJucworICAgICMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSBkaXJlY3RseS4KKyAgICByZXR1cm4gZXhpdF9jb2RlCisgIGVsc2U6CisgICAgIyBPbiBVbml4LCBvcy5XRVhJVFNUQVRVUygpIG11c3QgYmUgdXNlZCB0byBleHRyYWN0IHRoZSBleGl0IHN0YXR1cworICAgICMgZnJvbSB0aGUgcmVzdWx0IG9mIG9zLnN5c3RlbSgpLgorICAgIGlmIG9zLldJRkVYSVRFRChleGl0X2NvZGUpOgorICAgICAgcmV0dXJuIG9zLldFWElUU1RBVFVTKGV4aXRfY29kZSkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIC0xCisKKworY2xhc3MgU3VicHJvY2VzczoKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIHdvcmtpbmdfZGlyPU5vbmUsIGNhcHR1cmVfc3RkZXJyPVRydWUsIGVudj1Ob25lKToKKyAgICAiIiJDaGFuZ2VzIGludG8gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBpZiBwcm92aWRlZCwgYW5kIGV4ZWN1dGVzIGEgY29tbWFuZC4KKworICAgIFJlc3RvcmVzIHRoZSBvbGQgZGlyZWN0b3J5IGFmdGVyd2FyZHMuCisKKyAgICBBcmdzOgorICAgICAgY29tbWFuZDogICAgICAgIFRoZSBjb21tYW5kIHRvIHJ1biwgaW4gdGhlIGZvcm0gb2Ygc3lzLmFyZ3YuCisgICAgICB3b3JraW5nX2RpcjogICAgVGhlIGRpcmVjdG9yeSB0byBjaGFuZ2UgaW50by4KKyAgICAgIGNhcHR1cmVfc3RkZXJyOiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY2FwdHVyZSBzdGRlcnIgaW4gdGhlIG91dHB1dCBtZW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICBvciB0byBkaXNjYXJkIGl0LgorICAgICAgZW52OiAgICAgICAgICAgIERpY3Rpb25hcnkgd2l0aCBlbnZpcm9ubWVudCB0byBwYXNzIHRvIHRoZSBzdWJwcm9jZXNzLgorCisgICAgUmV0dXJuczoKKyAgICAgIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgb3V0Y29tZSBvZiB0aGUgZXhlY3V0ZWQgcHJvY2Vzcy4gSXQgaGFzIHRoZQorICAgICAgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAgICAgIHRlcm1pbmF0ZWRfYnlfc2lnbmFsICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gdGVybWluYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGEgc2lnbmFsLgorICAgICAgICBzaWduYWwgICAgICAgICAgICAgICAgIFN5Z25hbCB0aGF0IHRlcm1pbmF0ZWQgdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICAgIGV4aXRlZCAgICAgICAgICAgICAgICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkIG5vcm1hbGx5LgorICAgICAgICBleGl0X2NvZGUgICAgICAgICAgICAgIFRoZSBjb2RlIHdpdGggd2hpY2ggdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkLgorICAgICAgICBvdXRwdXQgICAgICAgICAgICAgICAgIENoaWxkIHByb2Nlc3MncyBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCBpbiBhIHN0cmluZy4KKyAgICAiIiIKKworICAgICMgVGhlIHN1YnByb2Nlc3MgbW9kdWxlIGlzIHRoZSBwcmVmZXJyYWJsZSB3YXkgb2YgcnVubmluZyBwcm9ncmFtcworICAgICMgc2luY2UgaXQgaXMgYXZhaWxhYmxlIGFuZCBiZWhhdmVzIGNvbnNpc3RlbnRseSBvbiBhbGwgcGxhdGZvcm1zLAorICAgICMgaW5jbHVkaW5nIFdpbmRvd3MuIEJ1dCBpdCBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyBpbiBweXRob24gMi40LgorICAgICMgSW4gZWFybGllciBweXRob24gdmVyc2lvbnMsIHdlIHJldmVydCB0byB0aGUgcG9wZW4yIG1vZHVsZSwgd2hpY2ggaXMKKyAgICAjIGF2YWlsYWJsZSBpbiBweXRob24gMi4wIGFuZCBsYXRlciBidXQgZG9lc24ndCBwcm92aWRlIHJlcXVpcmVkCisgICAgIyBmdW5jdGlvbmFsaXR5IChQb3BlbjQpIHVuZGVyIFdpbmRvd3MuIFRoaXMgYWxsb3dzIHVzIHRvIHN1cHBvcnQgTWFjCisgICAgIyBPUyBYIDEwLjQgVGlnZXIsIHdoaWNoIGhhcyBweXRob24gMi4zIGluc3RhbGxlZC4KKyAgICBpZiBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFOgorICAgICAgaWYgY2FwdHVyZV9zdGRlcnI6CisgICAgICAgIHN0ZGVyciA9IHN1YnByb2Nlc3MuU1RET1VUCisgICAgICBlbHNlOgorICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlBJUEUKKworICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9d29ya2luZ19kaXIsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLCBlbnY9ZW52KQorICAgICAgIyBjb21tdW5pY2F0ZSByZXR1cm5zIGEgdHVwbGUgd2l0aCB0aGUgZmlsZSBvYmVjdCBmb3IgdGhlIGNoaWxkJ3MKKyAgICAgICMgb3V0cHV0LgorICAgICAgc2VsZi5vdXRwdXQgPSBwLmNvbW11bmljYXRlKClbMF0KKyAgICAgIHNlbGYuX3JldHVybl9jb2RlID0gcC5yZXR1cm5jb2RlCisgICAgZWxzZToKKyAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorCisgICAgICBkZWYgX1JlcGxhY2VFbnZEaWN0KGRlc3QsIHNyYyk6CisgICAgICAgICMgQ2hhbmdlcyBtYWRlIGJ5IG9zLmVudmlyb24uY2xlYXIgYXJlIG5vdCBpbmhlcml0YWJsZSBieSBjaGlsZAorICAgICAgICAjIHByb2Nlc3NlcyB1bnRpbCBQeXRob24gMi42LiBUbyBwcm9kdWNlIGluaGVyaXRhYmxlIGNoYW5nZXMgd2UgaGF2ZQorICAgICAgICAjIHRvIGRlbGV0ZSBlbnZpcm9ubWVudCBpdGVtcyB3aXRoIHRoZSBkZWwgc3RhdGVtZW50LgorICAgICAgICBmb3Iga2V5IGluIGRlc3Qua2V5cygpOgorICAgICAgICAgIGRlbCBkZXN0W2tleV0KKyAgICAgICAgZGVzdC51cGRhdGUoc3JjKQorCisgICAgICAjIFdoZW4gJ2VudicgaXMgbm90IE5vbmUsIGJhY2t1cCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCByZXBsYWNlCisgICAgICAjIHRoZW0gd2l0aCB0aGUgcGFzc2VkICdlbnYnLiBXaGVuICdlbnYnIGlzIE5vbmUsIHdlIHNpbXBseSB1c2UgdGhlCisgICAgICAjIGN1cnJlbnQgJ29zLmVudmlyb24nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHN1YnByb2Nlc3MuUG9wZW4KKyAgICAgICMgc2VtYW50aWNzIHVzZWQgYWJvdmUuCisgICAgICBpZiBlbnYgaXMgbm90IE5vbmU6CisgICAgICAgIG9sZF9lbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgX1JlcGxhY2VFbnZEaWN0KG9zLmVudmlyb24sIGVudikKKworICAgICAgdHJ5OgorICAgICAgICBpZiB3b3JraW5nX2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICBvcy5jaGRpcih3b3JraW5nX2RpcikKKyAgICAgICAgaWYgY2FwdHVyZV9zdGRlcnI6CisgICAgICAgICAgcCA9IHBvcGVuMi5Qb3BlbjQoY29tbWFuZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwID0gcG9wZW4yLlBvcGVuMyhjb21tYW5kKQorICAgICAgICBwLnRvY2hpbGQuY2xvc2UoKQorICAgICAgICBzZWxmLm91dHB1dCA9IHAuZnJvbWNoaWxkLnJlYWQoKQorICAgICAgICByZXRfY29kZSA9IHAud2FpdCgpCisgICAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgICMgUmVzdG9yZSB0aGUgb2xkIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgICAjIGlmIHRoZXkgd2VyZSByZXBsYWNlZC4KKyAgICAgICAgaWYgZW52IGlzIG5vdCBOb25lOgorICAgICAgICAgIF9SZXBsYWNlRW52RGljdChvcy5lbnZpcm9uLCBvbGRfZW52aXJvbikKKworICAgICAgIyBDb252ZXJ0cyByZXRfY29kZSB0byBtYXRjaCB0aGUgc2VtYW50aWNzIG9mCisgICAgICAjIHN1YnByb2Nlc3MuUG9wZW4ucmV0dXJuY29kZS4KKyAgICAgIGlmIG9zLldJRlNJR05BTEVEKHJldF9jb2RlKToKKyAgICAgICAgc2VsZi5fcmV0dXJuX2NvZGUgPSAtb3MuV1RFUk1TSUcocmV0X2NvZGUpCisgICAgICBlbHNlOiAgIyBvcy5XSUZFWElURUQocmV0X2NvZGUpIHNob3VsZCByZXR1cm4gVHJ1ZSBoZXJlLgorICAgICAgICBzZWxmLl9yZXR1cm5fY29kZSA9IG9zLldFWElUU1RBVFVTKHJldF9jb2RlKQorCisgICAgaWYgc2VsZi5fcmV0dXJuX2NvZGUgPCAwOgorICAgICAgc2VsZi50ZXJtaW5hdGVkX2J5X3NpZ25hbCA9IFRydWUKKyAgICAgIHNlbGYuZXhpdGVkID0gRmFsc2UKKyAgICAgIHNlbGYuc2lnbmFsID0gLXNlbGYuX3JldHVybl9jb2RlCisgICAgZWxzZToKKyAgICAgIHNlbGYudGVybWluYXRlZF9ieV9zaWduYWwgPSBGYWxzZQorICAgICAgc2VsZi5leGl0ZWQgPSBUcnVlCisgICAgICBzZWxmLmV4aXRfY29kZSA9IHNlbGYuX3JldHVybl9jb2RlCisKKworZGVmIE1haW4oKToKKyAgIiIiUnVucyB0aGUgdW5pdCB0ZXN0LiIiIgorCisgICMgV2UgbXVzdCBjYWxsIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncygpIGJlZm9yZSBjYWxsaW5nCisgICMgdW5pdHRlc3QubWFpbigpLiAgT3RoZXJ3aXNlIHRoZSBsYXR0ZXIgd2lsbCBiZSBjb25mdXNlZCBieSB0aGUKKyAgIyAtLWd0ZXN0XyogZmxhZ3MuCisgIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncyhzeXMuYXJndikKKyAgIyBUaGUgdGVzdGVkIGJpbmFyaWVzIHNob3VsZCBub3QgYmUgd3JpdGluZyBYTUwgb3V0cHV0IGZpbGVzIHVubGVzcyB0aGUKKyAgIyBzY3JpcHQgZXhwbGljaXRseSBpbnN0cnVjdHMgdGhlbSB0by4KKyAgIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBNb3ZlIHRoaXMgaW50byBTdWJwcm9jZXNzIHdoZW4gd2UgaW1wbGVtZW50CisgICMgcGFzc2luZyBlbnZpcm9ubWVudCBpbnRvIGl0IGFzIGEgcGFyYW1ldGVyLgorICBpZiBHVEVTVF9PVVRQVVRfVkFSX05BTUUgaW4gb3MuZW52aXJvbjoKKyAgICBkZWwgb3MuZW52aXJvbltHVEVTVF9PVVRQVVRfVkFSX05BTUVdCisKKyAgX3Rlc3RfbW9kdWxlLm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NmM3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGVzdHMgR29vZ2xlIFRlc3QncyB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGVuYWJsZWQuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cyB0aGUgcHJvZ3JhbSB3aXRoCisvLyBub24temVyby4gIFdlIHVzZSB0aGlzIGluc3RlYWQgb2YgYSBHb29nbGUgVGVzdCBhc3NlcnRpb24gdG8KKy8vIGluZGljYXRlIGEgZmFpbHVyZSwgYXMgdGhlIGxhdHRlciBpcyBiZWVuIHRlc3RlZCBhbmQgY2Fubm90IGJlCisvLyByZWxpZWQgb24uCit2b2lkIEZhaWwoY29uc3QgY2hhciogbXNnKSB7CisgIHByaW50ZigiRkFJTFVSRTogJXNcbiIsIG1zZyk7CisgIGZmbHVzaChzdGRvdXQpOworICBleGl0KDEpOworfQorCisvLyBUZXN0cyB0aGF0IGFuIGFzc2VydGlvbiBmYWlsdXJlIHRocm93cyBhIHN1YmNsYXNzIG9mCisvLyBzdGQ6OnJ1bnRpbWVfZXJyb3IuCit2b2lkIFRlc3RGYWlsdXJlVGhyb3dzUnVudGltZUVycm9yKCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTsKKworICAvLyBBIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHNob3VsZG4ndCB0aHJvdy4KKyAgdHJ5IHsKKyAgICBFWFBFQ1RfRVEoMywgMyk7CisgIH0gY2F0Y2goLi4uKSB7CisgICAgRmFpbCgiQSBzdWNjZXNzZnVsIGFzc2VydGlvbiB3cm9uZ2Z1bGx5IHRocmV3LiIpOworICB9CisKKyAgLy8gQSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCB0aHJvdyBhIHN1YmNsYXNzIG9mIHN0ZDo6cnVudGltZV9lcnJvci4KKyAgdHJ5IHsKKyAgICBFWFBFQ1RfRVEoMiwgMykgPDwgIkV4cGVjdGVkIGZhaWx1cmUiOworICB9IGNhdGNoKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYgZSkgeworICAgIGlmIChzdHJzdHIoZS53aGF0KCksICJFeHBlY3RlZCBmYWlsdXJlIikgIT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQSBmYWlsZWQgYXNzZXJ0aW9uIGRpZCB0aHJvdyBhbiBleGNlcHRpb24gb2YgdGhlIHJpZ2h0IHR5cGUsICIKKyAgICAgICAgICAgImJ1dCB0aGUgbWVzc2FnZSBpcyBpbmNvcnJlY3QuICBJbnN0ZWFkIG9mIGNvbnRhaW5pbmcgXCJFeHBlY3RlZCAiCisgICAgICAgICAgICJmYWlsdXJlXCIsIGl0IGlzOlxuIik7CisgICAgRmFpbChlLndoYXQoKSk7CisgIH0gY2F0Y2goLi4uKSB7CisgICAgRmFpbCgiQSBmYWlsZWQgYXNzZXJ0aW9uIHRocmV3IHRoZSB3cm9uZyB0eXBlIG9mIGV4Y2VwdGlvbi4iKTsKKyAgfQorICBGYWlsKCJBIGZhaWxlZCBhc3NlcnRpb24gc2hvdWxkJ3ZlIHRocm93biBidXQgZGlkbid0LiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgcGVvcGxlIGNhbiB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbgorICAvLyBvdGhlciB0ZXN0aW5nIGZyYW1ld29ya3MsIGFzIGxvbmcgYXMgdGhleSBpbml0aWFsaXplIEdvb2dsZSBUZXN0CisgIC8vIHByb3Blcmx5IGFuZCBzZXQgdGhlIHRocm93bi1vbi1mYWlsdXJlIG1vZGUuICBUaGVyZWZvcmUsIHdlIGRvbid0CisgIC8vIHVzZSBHb29nbGUgVGVzdCdzIGNvbnN0cnVjdHMgZm9yIGRlZmluaW5nIGFuZCBydW5uaW5nIHRlc3RzCisgIC8vIChlLmcuIFRFU1QgYW5kIFJVTl9BTExfVEVTVFMpIGhlcmUuCisKKyAgVGVzdEZhaWx1cmVUaHJvd3NSdW50aW1lRXJyb3IoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Njc4ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weQpAQCAtMCwwICsxLDE3MSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgR29vZ2xlIFRlc3QncyB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorCitUaGlzIHNjcmlwdCBpbnZva2VzIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGgKK0dvb2dsZSBUZXN0KSB3aXRoIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYW5kIGNvbW1hbmQgbGluZSBmbGFncy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworIyBDb25zdGFudHMuCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZS4KK1RIUk9XX09OX0ZBSUxVUkUgPSAnZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZScKKworIyBQYXRoIHRvIHRoZSBndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfIHByb2dyYW0sIGNvbXBpbGVkIHdpdGgKKyMgZXhjZXB0aW9ucyBkaXNhYmxlZC4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgJ2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8nKQorCisKKyMgVXRpbGl0aWVzLgorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgZ2l2ZW4gdmFsdWU7IHVuc2V0cyBpdCB3aGVuIHRoZQorICBnaXZlbiB2YWx1ZSBpcyBOb25lLgorICAiIiIKKworICBlbnZfdmFyID0gZW52X3Zhci51cHBlcigpCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIG9zLmVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gb3MuZW52aXJvbjoKKyAgICBkZWwgb3MuZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBSdW4oY29tbWFuZCk6CisgICIiIlJ1bnMgYSBjb21tYW5kOyByZXR1cm5zIFRydWUvRmFsc2UgaWYgaXRzIGV4aXQgY29kZSBpcy9pc24ndCAwLiIiIgorCisgIHByaW50ICdSdW5uaW5nICIlcyIuIC4gLicgJSAnICcuam9pbihjb21tYW5kKQorICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCisgIHJldHVybiBwLmV4aXRlZCBhbmQgcC5leGl0X2NvZGUgPT0gMAorCisKKyMgVGhlIHRlc3RzLiAgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlZmFjdG9yIHRoZSBjbGFzcyB0byBzaGFyZSBjb21tb24KKyMgbG9naWMgd2l0aCBjb2RlIGluIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkuCitjbGFzcyBUaHJvd09uRmFpbHVyZVRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuIiIiCisKKyAgZGVmIFJ1bkFuZFZlcmlmeShzZWxmLCBlbnZfdmFyX3ZhbHVlLCBmbGFnX3ZhbHVlLCBzaG91bGRfZmFpbCk6CisgICAgIiIiUnVucyBndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfIGFuZCB2ZXJpZmllcyB0aGF0IGl0IGRvZXMKKyAgICAob3IgZG9lcyBub3QpIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGNvZGUuCisKKyAgICBBcmdzOgorICAgICAgZW52X3Zhcl92YWx1ZTogICAgdmFsdWUgb2YgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOyBOb25lIGlmIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgdW5zZXQuCisgICAgICBmbGFnX3ZhbHVlOiAgICAgICB2YWx1ZSBvZiB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWc7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KKyAgICAgIHNob3VsZF9mYWlsOiAgICAgIFRydWUgaWZmIHRoZSBwcm9ncmFtIGlzIGV4cGVjdGVkIHRvIGZhaWwuCisgICAgIiIiCisKKyAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRSwgZW52X3Zhcl92YWx1ZSkKKworICAgIGlmIGVudl92YXJfdmFsdWUgaXMgTm9uZToKKyAgICAgIGVudl92YXJfdmFsdWVfbXNnID0gJyBpcyBub3Qgc2V0JworICAgIGVsc2U6CisgICAgICBlbnZfdmFyX3ZhbHVlX21zZyA9ICc9JyArIGVudl92YXJfdmFsdWUKKworICAgIGlmIGZsYWdfdmFsdWUgaXMgTm9uZToKKyAgICAgIGZsYWcgPSAnJworICAgIGVsaWYgZmxhZ192YWx1ZSA9PSAnMCc6CisgICAgICBmbGFnID0gJy0tJXM9MCcgJSBUSFJPV19PTl9GQUlMVVJFCisgICAgZWxzZToKKyAgICAgIGZsYWcgPSAnLS0lcycgJSBUSFJPV19PTl9GQUlMVVJFCisKKyAgICBjb21tYW5kID0gW0VYRV9QQVRIXQorICAgIGlmIGZsYWc6CisgICAgICBjb21tYW5kLmFwcGVuZChmbGFnKQorCisgICAgaWYgc2hvdWxkX2ZhaWw6CisgICAgICBzaG91bGRfb3Jfbm90ID0gJ3Nob3VsZCcKKyAgICBlbHNlOgorICAgICAgc2hvdWxkX29yX25vdCA9ICdzaG91bGQgbm90JworCisgICAgZmFpbGVkID0gbm90IFJ1bihjb21tYW5kKQorCisgICAgU2V0RW52VmFyKFRIUk9XX09OX0ZBSUxVUkUsIE5vbmUpCisKKyAgICBtc2cgPSAoJ3doZW4gJXMlcywgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaW4gIiVzIiAlcyBjYXVzZSBhIG5vbi16ZXJvICcKKyAgICAgICAgICAgJ2V4aXQgY29kZS4nICUKKyAgICAgICAgICAgKFRIUk9XX09OX0ZBSUxVUkUsIGVudl92YXJfdmFsdWVfbXNnLCAnICcuam9pbihjb21tYW5kKSwKKyAgICAgICAgICAgIHNob3VsZF9vcl9ub3QpKQorICAgIHNlbGYuYXNzZXJ0XyhmYWlsZWQgPT0gc2hvdWxkX2ZhaWwsIG1zZykKKworICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgbW9kZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwgZmxhZ192YWx1ZT1Ob25lLCBzaG91bGRfZmFpbD1GYWxzZSkKKworICBkZWYgdGVzdFRocm93T25GYWlsdXJlRW52VmFyKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSBHVEVTVF9USFJPV19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPUZhbHNlKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1UcnVlKQorCisgIGRlZiB0ZXN0VGhyb3dPbkZhaWx1cmVGbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUgZmxhZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1GYWxzZSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9VHJ1ZSkKKworICBkZWYgdGVzdFRocm93T25GYWlsdXJlRmxhZ092ZXJyaWRlc0VudlZhcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBvdmVycmlkZXMgR1RFU1RfVEhST1dfT05fRkFJTFVSRS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPUZhbHNlKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPVRydWUpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9RmFsc2UpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9VHJ1ZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg4ZmUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGVzdHMgR29vZ2xlIFRlc3QncyB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBtdXN0IGJlIGNvbXBpbGVkIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZC4gIEl0IHdpbGwgYmUKKy8vIGludm9rZWQgYnkgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5LCBhbmQgaXMgZXhwZWN0ZWQgdG8gZXhpdAorLy8gd2l0aCBub24temVybyBpbiB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlIG9yIDAgb3RoZXJ3aXNlLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBmZmx1c2gsIGZwcmludGYsIE5VTEwsIGV0Yy4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhpdAorI2luY2x1ZGUgPGV4Y2VwdGlvbj4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBzZXRfdGVybWluYXRlCisKKy8vIFRoaXMgdGVybWluYXRlIGhhbmRsZXIgYWJvcnRzIHRoZSBwcm9ncmFtIHVzaW5nIGV4aXQoKSByYXRoZXIgdGhhbiBhYm9ydCgpLgorLy8gVGhpcyBhdm9pZHMgc2hvd2luZyBwb3AtdXBzIG9uIFdpbmRvd3Mgc3lzdGVtcyBhbmQgY29yZSBkdW1wcyBvbiBVbml4LWxpa2UKKy8vIG9uZXMuCit2b2lkIFRlcm1pbmF0ZUhhbmRsZXIoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsICJVbmhhbmRsZWQgQysrIGV4Y2VwdGlvbiB0ZXJtaW5hdGluZyB0aGUgcHJvZ3JhbS4iKTsKKyAgZmZsdXNoKE5VTEwpOworICBleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICBzdGQ6OnNldF90ZXJtaW5hdGUoJlRlcm1pbmF0ZUhhbmRsZXIpOworI2VuZGlmCisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHBlb3BsZSBjYW4gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4KKyAgLy8gb3RoZXIgdGVzdGluZyBmcmFtZXdvcmtzLCBhcyBsb25nIGFzIHRoZXkgaW5pdGlhbGl6ZSBHb29nbGUgVGVzdAorICAvLyBwcm9wZXJseSBhbmQgc2V0IHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuICBUaGVyZWZvcmUsIHdlIGRvbid0CisgIC8vIHVzZSBHb29nbGUgVGVzdCdzIGNvbnN0cnVjdHMgZm9yIGRlZmluaW5nIGFuZCBydW5uaW5nIHRlc3RzCisgIC8vIChlLmcuIFRFU1QgYW5kIFJVTl9BTExfVEVTVFMpIGhlcmUuCisKKyAgLy8gSW4gdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQsIHRoaXMKKyAgLy8gYXNzZXJ0aW9uIHdpbGwgY2F1c2UgdGhlIHByb2dyYW0gdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KKyAgRVhQRUNUX0VRKDIsIDMpOworCisgIC8vIFdoZW4gbm90IGluIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUsIHRoZSBjb250cm9sIHdpbGwgcmVhY2gKKyAgLy8gaGVyZS4KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YWU1N2VlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IHdhcm5zIHRoZSB1c2VyIHdoZW4gbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0XycpCisKKworZGVmIEFzc2VydChjb25kaXRpb24pOgorICBpZiBub3QgY29uZGl0aW9uOgorICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisKKworZGVmIEFzc2VydEVxKGV4cGVjdGVkLCBhY3R1YWwpOgorICBpZiBleHBlY3RlZCAhPSBhY3R1YWw6CisgICAgcHJpbnQgJ0V4cGVjdGVkOiAlcycgJSAoZXhwZWN0ZWQsKQorICAgIHByaW50ICcgIEFjdHVhbDogJXMnICUgKGFjdHVhbCwpCisgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKworCitkZWYgVGVzdEV4aXRDb2RlQW5kT3V0cHV0KGNvbW1hbmQpOgorICAiIiJSdW5zIHRoZSBnaXZlbiBjb21tYW5kIGFuZCB2ZXJpZmllcyBpdHMgZXhpdCBjb2RlIGFuZCBvdXRwdXQuIiIiCisKKyAgIyBWZXJpZmllcyB0aGF0ICdjb21tYW5kJyBleGl0cyB3aXRoIGNvZGUgMS4KKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQorICBBc3NlcnQocC5leGl0ZWQpCisgIEFzc2VydEVxKDEsIHAuZXhpdF9jb2RlKQorICBBc3NlcnQoJ0luaXRHb29nbGVUZXN0JyBpbiBwLm91dHB1dCkKKworCitjbGFzcyBHVGVzdFVuaW5pdGlhbGl6ZWRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgdGVzdEV4aXRDb2RlQW5kT3V0cHV0KHNlbGYpOgorICAgIFRlc3RFeGl0Q29kZUFuZE91dHB1dChDT01NQU5EKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzE2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYwpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworVEVTVChEdW1teVRlc3QsIER1bW15KSB7CisgIC8vIFRoaXMgdGVzdCBkb2Vzbid0IHZlcmlmeSBhbnl0aGluZy4gIFdlIGp1c3QgbmVlZCBpdCB0byBjcmVhdGUgYQorICAvLyByZWFsaXN0aWMgc3RhZ2UgZm9yIHRlc3RpbmcgdGhlIGJlaGF2aW9yIG9mIEdvb2dsZSBUZXN0IHdoZW4KKyAgLy8gUlVOX0FMTF9URVNUUygpIGlzIGNhbGxlZCB3aXRob3V0IHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkgYmVpbmcKKyAgLy8gY2FsbGVkIGZpcnN0LgorfQorCitpbnQgbWFpbigpIHsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FiMDdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNzQxNSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBiYXNpYyBjb25zdHJ1Y3RzIG9mCisvLyBHb29nbGUgVGVzdCB3b3JrLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29tbWFuZCBsaW5lIGZsYWcgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZAorLy8gaW4gY29kZSBvbmNlIDxndGVzdC9ndGVzdC5oPiBoYXMgYmVlbiAjaW5jbHVkZWQuCisvLyBEbyBub3QgbW92ZSBpdCBhZnRlciBvdGhlciAjaW5jbHVkZXMuCitURVNUKENvbW1hbmRMaW5lRmxhZ3NUZXN0LCBDYW5CZUFjY2Vzc2VkSW5Db2RlT25jZUdUZXN0SElzSW5jbHVkZWQpIHsKKyAgYm9vbCBkdW1teSA9IHRlc3Rpbmc6OkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNvbG9yKSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcobGlzdF90ZXN0cykKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcob3V0cHV0KSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCkgPiAwCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzaHVmZmxlKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPiAwCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pICE9ICJ1bmtub3duIgorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgRVhQRUNUX1RSVUUoZHVtbXkgfHwgIWR1bW15KTsgIC8vIFN1cHByZXNzZXMgd2FybmluZyB0aGF0IGR1bW15IGlzIHVudXNlZC4KK30KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gRm9yIElOVF9NQVguCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworCitjbGFzcyBTdHJlYW1pbmdMaXN0ZW5lclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBjbGFzcyBGYWtlU29ja2V0V3JpdGVyIDogcHVibGljIFN0cmVhbWluZ0xpc3RlbmVyOjpBYnN0cmFjdFNvY2tldFdyaXRlciB7CisgICBwdWJsaWM6CisgICAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KKyAgICB2aXJ0dWFsIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsgb3V0cHV0XyArPSBtZXNzYWdlOyB9CisKKyAgICBzdHJpbmcgb3V0cHV0XzsKKyAgfTsKKworICBTdHJlYW1pbmdMaXN0ZW5lclRlc3QoKQorICAgICAgOiBmYWtlX3NvY2tfd3JpdGVyXyhuZXcgRmFrZVNvY2tldFdyaXRlciksCisgICAgICAgIHN0cmVhbWVyXyhmYWtlX3NvY2tfd3JpdGVyXyksCisgICAgICAgIHRlc3RfaW5mb19vYmpfKCJGb29UZXN0IiwgIkJhciIsIE5VTEwsIE5VTEwsIDAsIE5VTEwpIHt9CisKKyBwcm90ZWN0ZWQ6CisgIHN0cmluZyogb3V0cHV0KCkgeyByZXR1cm4gJihmYWtlX3NvY2tfd3JpdGVyXy0+b3V0cHV0Xyk7IH0KKworICBGYWtlU29ja2V0V3JpdGVyKiBjb25zdCBmYWtlX3NvY2tfd3JpdGVyXzsKKyAgU3RyZWFtaW5nTGlzdGVuZXIgc3RyZWFtZXJfOworICBVbml0VGVzdCB1bml0X3Rlc3RfOworICBUZXN0SW5mbyB0ZXN0X2luZm9fb2JqXzsgIC8vIFRoZSBuYW1lIHRlc3RfaW5mb18gd2FzIHRha2VuIGJ5IHRlc3Rpbmc6OlRlc3QuCit9OworCitURVNUX0YoU3RyZWFtaW5nTGlzdGVuZXJUZXN0LCBPblRlc3RQcm9ncmFtRW5kKSB7CisgICpvdXRwdXQoKSA9ICIiOworICBzdHJlYW1lcl8uT25UZXN0UHJvZ3JhbUVuZCh1bml0X3Rlc3RfKTsKKyAgRVhQRUNUX0VRKCJldmVudD1UZXN0UHJvZ3JhbUVuZCZwYXNzZWQ9MVxuIiwgKm91dHB1dCgpKTsKK30KKworVEVTVF9GKFN0cmVhbWluZ0xpc3RlbmVyVGVzdCwgT25UZXN0SXRlcmF0aW9uRW5kKSB7CisgICpvdXRwdXQoKSA9ICIiOworICBzdHJlYW1lcl8uT25UZXN0SXRlcmF0aW9uRW5kKHVuaXRfdGVzdF8sIDQyKTsKKyAgRVhQRUNUX0VRKCJldmVudD1UZXN0SXRlcmF0aW9uRW5kJnBhc3NlZD0xJmVsYXBzZWRfdGltZT0wbXNcbiIsICpvdXRwdXQoKSk7Cit9CisKK1RFU1RfRihTdHJlYW1pbmdMaXN0ZW5lclRlc3QsIE9uVGVzdENhc2VTdGFydCkgeworICAqb3V0cHV0KCkgPSAiIjsKKyAgc3RyZWFtZXJfLk9uVGVzdENhc2VTdGFydChUZXN0Q2FzZSgiRm9vVGVzdCIsICJCYXIiLCBOVUxMLCBOVUxMKSk7CisgIEVYUEVDVF9FUSgiZXZlbnQ9VGVzdENhc2VTdGFydCZuYW1lPUZvb1Rlc3RcbiIsICpvdXRwdXQoKSk7Cit9CisKK1RFU1RfRihTdHJlYW1pbmdMaXN0ZW5lclRlc3QsIE9uVGVzdENhc2VFbmQpIHsKKyAgKm91dHB1dCgpID0gIiI7CisgIHN0cmVhbWVyXy5PblRlc3RDYXNlRW5kKFRlc3RDYXNlKCJGb29UZXN0IiwgIkJhciIsIE5VTEwsIE5VTEwpKTsKKyAgRVhQRUNUX0VRKCJldmVudD1UZXN0Q2FzZUVuZCZwYXNzZWQ9MSZlbGFwc2VkX3RpbWU9MG1zXG4iLCAqb3V0cHV0KCkpOworfQorCitURVNUX0YoU3RyZWFtaW5nTGlzdGVuZXJUZXN0LCBPblRlc3RTdGFydCkgeworICAqb3V0cHV0KCkgPSAiIjsKKyAgc3RyZWFtZXJfLk9uVGVzdFN0YXJ0KHRlc3RfaW5mb19vYmpfKTsKKyAgRVhQRUNUX0VRKCJldmVudD1UZXN0U3RhcnQmbmFtZT1CYXJcbiIsICpvdXRwdXQoKSk7Cit9CisKK1RFU1RfRihTdHJlYW1pbmdMaXN0ZW5lclRlc3QsIE9uVGVzdEVuZCkgeworICAqb3V0cHV0KCkgPSAiIjsKKyAgc3RyZWFtZXJfLk9uVGVzdEVuZCh0ZXN0X2luZm9fb2JqXyk7CisgIEVYUEVDVF9FUSgiZXZlbnQ9VGVzdEVuZCZwYXNzZWQ9MSZlbGFwc2VkX3RpbWU9MG1zXG4iLCAqb3V0cHV0KCkpOworfQorCitURVNUX0YoU3RyZWFtaW5nTGlzdGVuZXJUZXN0LCBPblRlc3RQYXJ0UmVzdWx0KSB7CisgICpvdXRwdXQoKSA9ICIiOworICBzdHJlYW1lcl8uT25UZXN0UGFydFJlc3VsdChUZXN0UGFydFJlc3VsdCgKKyAgICAgIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAiZm9vLmNjIiwgNDIsICJmYWlsZWQ9XG4mJSIpKTsKKworICAvLyBNZXRhIGNoYXJhY3RlcnMgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZSBzaG91bGQgYmUgcHJvcGVybHkgZXNjYXBlZC4KKyAgRVhQRUNUX0VRKAorICAgICAgImV2ZW50PVRlc3RQYXJ0UmVzdWx0JmZpbGU9Zm9vLmNjJmxpbmU9NDImbWVzc2FnZT1mYWlsZWQlM0QlMEElMjYlMjVcbiIsCisgICAgICAqb3V0cHV0KCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworLy8gUHJvdmlkZXMgYWNjZXNzIHRvIG90aGVyd2lzZSBwcml2YXRlIHBhcnRzIG9mIHRoZSBUZXN0RXZlbnRMaXN0ZW5lcnMgY2xhc3MKKy8vIHRoYXQgYXJlIG5lZWRlZCB0byB0ZXN0IGl0LgorY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3IgeworIHB1YmxpYzoKKyAgc3RhdGljIFRlc3RFdmVudExpc3RlbmVyKiBHZXRSZXBlYXRlcihUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycykgeworICAgIHJldHVybiBsaXN0ZW5lcnMtPnJlcGVhdGVyKCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTZXREZWZhdWx0UmVzdWx0UHJpbnRlcihUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgICAgbGlzdGVuZXJzLT5TZXREZWZhdWx0UmVzdWx0UHJpbnRlcihsaXN0ZW5lcik7CisgIH0KKyAgc3RhdGljIHZvaWQgU2V0RGVmYXVsdFhtbEdlbmVyYXRvcihUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgICBsaXN0ZW5lcnMtPlNldERlZmF1bHRYbWxHZW5lcmF0b3IobGlzdGVuZXIpOworICB9CisKKyAgc3RhdGljIGJvb2wgRXZlbnRGb3J3YXJkaW5nRW5hYmxlZChjb25zdCBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycykgeworICAgIHJldHVybiBsaXN0ZW5lcnMuRXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpOworICB9CisKKyAgc3RhdGljIHZvaWQgU3VwcHJlc3NFdmVudEZvcndhcmRpbmcoVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMpIHsKKyAgICBsaXN0ZW5lcnMtPlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7CisgIH0KK307CisKK2NsYXNzIFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyIDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RIZWxwZXIoKSB7fQorCisgIC8vIEZvcndhcmRzIHRvIFVuaXRUZXN0OjpSZWNvcmRQcm9wZXJ0eSgpIHRvIGJ5cGFzcyBhY2Nlc3MgY29udHJvbHMuCisgIHZvaWQgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIHVuaXRfdGVzdF8uUmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgIH0KKworICBVbml0VGVzdCB1bml0X3Rlc3RfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0OwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzczsKK3VzaW5nIHRlc3Rpbmc6OkRvdWJsZUxFOwordXNpbmcgdGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIHRlc3Rpbmc6OkVudmlyb25tZW50OwordXNpbmcgdGVzdGluZzo6RmxvYXRMRTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNvbG9yKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGZpbHRlcik7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGxpc3RfdGVzdHMpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhvdXRwdXQpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhwcmludF90aW1lKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhyZXBlYXQpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcyk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHNodWZmbGUpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKK3VzaW5nIHRlc3Rpbmc6OklzTm90U3Vic3RyaW5nOwordXNpbmcgdGVzdGluZzo6SXNTdWJzdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjpNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7Cit1c2luZyB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE7Cit1c2luZyB0ZXN0aW5nOjpUZXN0OwordXNpbmcgdGVzdGluZzo6VGVzdENhc2U7Cit1c2luZyB0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Cit1c2luZyB0ZXN0aW5nOjpUZXN0SW5mbzsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheTsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RQcm9wZXJ0eTsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RSZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpUaW1lSW5NaWxsaXM7Cit1c2luZyB0ZXN0aW5nOjpVbml0VGVzdDsKK3VzaW5nIHRlc3Rpbmc6OmtNYXhTdGFja1RyYWNlRGVwdGg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWRkUmVmZXJlbmNlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QXBwZW5kVXNlck1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QXJyYXlBd2FyZUZpbmQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QXJyYXlFcTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDb2RlUG9pbnRUb1V0Zjg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q29tcGlsZUFzc2VydFR5cGVzRXF1YWw7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q29weUFycmF5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNvdW50SWY7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RXFGYWlsdXJlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZsb2F0aW5nUG9pbnQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9yRWFjaDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHM7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRFbGVtZW50T3I7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0TmV4dFJhbmRvbVNlZWQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0UmFuZG9tU2VlZEZyb21GbGFnOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFRlc3RUeXBlSWQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFR5cGVJZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRVbml0VGVzdEltcGw7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyRnJvbUVudk9yRGllOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc0NvbnRhaW5lcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc0NvbnRhaW5lclRlc3Q7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SXNOb3RDb250YWluZXI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UGFyc2VJbnQzMkZsYWc7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlQ29uc3Q7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlUmVmZXJlbmNlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNob3VsZFJ1blRlc3RPblNoYXJkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNob3VsZFNoYXJkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNob3VsZFVzZUNvbG9yOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNodWZmbGU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2h1ZmZsZVJhbmdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNraXBQcmVmaXg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUZXN0UmVzdWx0QWNjZXNzb3I7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VUludDMyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OldpZGVTdHJpbmdUb1V0Zjg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6a0NvcHk7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6a01heFJhbmRvbVNlZWQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6a1JlZmVyZW5jZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjprVGVzdFR5cGVJZEluR29vZ2xlVGVzdDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyOworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNhcHR1cmVTdGRvdXQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q2FwdHVyZWRTdGRvdXQ7CisjZW5kaWYKKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07CisjZW5kaWYKKworY2xhc3MgVGVzdGluZ1ZlY3RvciA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxpbnQ+IHsKK307CisKKzo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvcikgeworICBvcyA8PCAieyAiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7IGkrKykgeworICAgIG9zIDw8IHZlY3RvcltpXSA8PCAiICI7CisgIH0KKyAgb3MgPDwgIn0iOworICByZXR1cm4gb3M7Cit9CisKKy8vIFRoaXMgbGluZSB0ZXN0cyB0aGF0IHdlIGNhbiBkZWZpbmUgdGVzdHMgaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2UuCituYW1lc3BhY2UgeworCitURVNUKEdldFJhbmRvbVNlZWRGcm9tRmxhZ1Rlc3QsIEhhbmRsZXNaZXJvKSB7CisgIGNvbnN0IGludCBzZWVkID0gR2V0UmFuZG9tU2VlZEZyb21GbGFnKDApOworICBFWFBFQ1RfTEUoMSwgc2VlZCk7CisgIEVYUEVDVF9MRShzZWVkLCBzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSk7Cit9CisKK1RFU1QoR2V0UmFuZG9tU2VlZEZyb21GbGFnVGVzdCwgUHJlc2VydmVzVmFsaWRTZWVkKSB7CisgIEVYUEVDVF9FUSgxLCBHZXRSYW5kb21TZWVkRnJvbUZsYWcoMSkpOworICBFWFBFQ1RfRVEoMiwgR2V0UmFuZG9tU2VlZEZyb21GbGFnKDIpKTsKKyAgRVhQRUNUX0VRKGtNYXhSYW5kb21TZWVkIC0gMSwgR2V0UmFuZG9tU2VlZEZyb21GbGFnKGtNYXhSYW5kb21TZWVkIC0gMSkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCksCisgICAgICAgICAgICBHZXRSYW5kb21TZWVkRnJvbUZsYWcoa01heFJhbmRvbVNlZWQpKTsKK30KKworVEVTVChHZXRSYW5kb21TZWVkRnJvbUZsYWdUZXN0LCBOb3JtYWxpemVzSW52YWxpZFNlZWQpIHsKKyAgY29uc3QgaW50IHNlZWQxID0gR2V0UmFuZG9tU2VlZEZyb21GbGFnKC0xKTsKKyAgRVhQRUNUX0xFKDEsIHNlZWQxKTsKKyAgRVhQRUNUX0xFKHNlZWQxLCBzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSk7CisKKyAgY29uc3QgaW50IHNlZWQyID0gR2V0UmFuZG9tU2VlZEZyb21GbGFnKGtNYXhSYW5kb21TZWVkICsgMSk7CisgIEVYUEVDVF9MRSgxLCBzZWVkMik7CisgIEVYUEVDVF9MRShzZWVkMiwgc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCkpOworfQorCitURVNUKEdldE5leHRSYW5kb21TZWVkVGVzdCwgV29ya3NGb3JWYWxpZElucHV0KSB7CisgIEVYUEVDVF9FUSgyLCBHZXROZXh0UmFuZG9tU2VlZCgxKSk7CisgIEVYUEVDVF9FUSgzLCBHZXROZXh0UmFuZG9tU2VlZCgyKSk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSwKKyAgICAgICAgICAgIEdldE5leHRSYW5kb21TZWVkKGtNYXhSYW5kb21TZWVkIC0gMSkpOworICBFWFBFQ1RfRVEoMSwgR2V0TmV4dFJhbmRvbVNlZWQoa01heFJhbmRvbVNlZWQpKTsKKworICAvLyBXZSBkZWxpYmVyYXRlbHkgZG9uJ3QgdGVzdCBHZXROZXh0UmFuZG9tU2VlZCgpIHdpdGggaW52YWxpZAorICAvLyBpbnB1dHMsIGFzIHRoYXQgcmVxdWlyZXMgZGVhdGggdGVzdHMsIHdoaWNoIGFyZSBleHBlbnNpdmUuICBUaGlzCisgIC8vIGlzIGZpbmUgYXMgR2V0TmV4dFJhbmRvbVNlZWQoKSBpcyBpbnRlcm5hbCBhbmQgaGFzIGEKKyAgLy8gc3RyYWlnaHRmb3J3YXJkIGRlZmluaXRpb24uCit9CisKK3N0YXRpYyB2b2lkIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpIHsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpDbGVhclRlc3RQYXJ0UmVzdWx0cygKKyAgICAgIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCkpOworfQorCisvLyBUZXN0cyBHZXRUeXBlSWQuCisKK1RFU1QoR2V0VHlwZUlkVGVzdCwgUmV0dXJuc1NhbWVWYWx1ZUZvclNhbWVUeXBlKSB7CisgIEVYUEVDVF9FUShHZXRUeXBlSWQ8aW50PigpLCBHZXRUeXBlSWQ8aW50PigpKTsKKyAgRVhQRUNUX0VRKEdldFR5cGVJZDxUZXN0PigpLCBHZXRUeXBlSWQ8VGVzdD4oKSk7Cit9CisKK2NsYXNzIFN1YkNsYXNzT2ZUZXN0IDogcHVibGljIFRlc3Qge307CitjbGFzcyBBbm90aGVyU3ViQ2xhc3NPZlRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKKworVEVTVChHZXRUeXBlSWRUZXN0LCBSZXR1cm5zRGlmZmVyZW50VmFsdWVzRm9yRGlmZmVyZW50VHlwZXMpIHsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxpbnQ+KCksIEdldFR5cGVJZDxjb25zdCBpbnQ+KCkpOworICBFWFBFQ1RfTkUoR2V0VHlwZUlkPGludD4oKSwgR2V0VHlwZUlkPGNoYXI+KCkpOworICBFWFBFQ1RfTkUoR2V0VHlwZUlkPGludD4oKSwgR2V0VGVzdFR5cGVJZCgpKTsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxTdWJDbGFzc09mVGVzdD4oKSwgR2V0VGVzdFR5cGVJZCgpKTsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxBbm90aGVyU3ViQ2xhc3NPZlRlc3Q+KCksIEdldFRlc3RUeXBlSWQoKSk7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8QW5vdGhlclN1YkNsYXNzT2ZUZXN0PigpLCBHZXRUeXBlSWQ8U3ViQ2xhc3NPZlRlc3Q+KCkpOworfQorCisvLyBWZXJpZmllcyB0aGF0IEdldFRlc3RUeXBlSWQoKSByZXR1cm5zIHRoZSBzYW1lIHZhbHVlLCBubyBtYXR0ZXIgaXQKKy8vIGlzIGNhbGxlZCBmcm9tIGluc2lkZSBHb29nbGUgVGVzdCBvciBvdXRzaWRlIG9mIGl0LgorVEVTVChHZXRUZXN0VHlwZUlkVGVzdCwgUmV0dXJuc1RoZVNhbWVWYWx1ZUluc2lkZU9yT3V0c2lkZU9mR29vZ2xlVGVzdCkgeworICBFWFBFQ1RfRVEoa1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3QsIEdldFRlc3RUeXBlSWQoKSk7Cit9CisKKy8vIFRlc3RzIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygpLgorCitURVNUKEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kc1Rlc3QsIEZvcm1hdHNaZXJvKSB7CisgIEVYUEVDVF9FUSgiMCIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygwKSk7Cit9CisKK1RFU1QoRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzVGVzdCwgRm9ybWF0c1Bvc2l0aXZlTnVtYmVyKSB7CisgIEVYUEVDVF9FUSgiMC4wMDMiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMykpOworICBFWFBFQ1RfRVEoIjAuMDEiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMTApKTsKKyAgRVhQRUNUX0VRKCIwLjIiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMjAwKSk7CisgIEVYUEVDVF9FUSgiMS4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDEyMDApKTsKKyAgRVhQRUNUX0VRKCIzIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDMwMDApKTsKK30KKworVEVTVChGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHNUZXN0LCBGb3JtYXRzTmVnYXRpdmVOdW1iZXIpIHsKKyAgRVhQRUNUX0VRKCItMC4wMDMiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTMpKTsKKyAgRVhQRUNUX0VRKCItMC4wMSIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMTApKTsKKyAgRVhQRUNUX0VRKCItMC4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0yMDApKTsKKyAgRVhQRUNUX0VRKCItMS4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0xMjAwKSk7CisgIEVYUEVDVF9FUSgiLTMiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTMwMDApKTsKK30KKworLy8gVGVzdHMgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoKS4gIFRoZSBjb3JyZWN0bmVzcyBvZiBjb252ZXJzaW9uCisvLyBmb3IgcGFydGljdWxhciBkYXRlcyBiZWxvdyB3YXMgdmVyaWZpZWQgaW4gUHl0aG9uIHVzaW5nCisvLyBkYXRldGltZS5kYXRldGltZS5mcm9tdXRjdGltZXN0YW1wKDx0aW1ldGFtcD4vMTAwMCkuCisKKy8vIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdGltZXpvbmUsIHNvIHdlCisvLyBoYXZlIHRvIHNldCB1cCBhIHBhcnRpY3VsYXIgdGltZXpvbmUgdG8gb2J0YWluIHByZWRpY3RhYmxlIHJlc3VsdHMuCitjbGFzcyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICAvLyBPbiBDeWd3aW4sIEdDQyBkb2Vzbid0IGFsbG93IHVucXVhbGlmaWVkIGludGVnZXIgbGl0ZXJhbHMgdG8gZXhjZWVkCisgIC8vIDMyIGJpdHMsIGV2ZW4gd2hlbiA2NC1iaXQgaW50ZWdlciB0eXBlcyBhcmUgYXZhaWxhYmxlLiAgV2UgaGF2ZSB0bworICAvLyBmb3JjZSB0aGUgY29uc3RhbnRzIHRvIGhhdmUgYSA2NC1iaXQgdHlwZSBoZXJlLgorICBzdGF0aWMgY29uc3QgVGltZUluTWlsbGlzIGtNaWxsaXNQZXJTZWMgPSAxMDAwOworCisgcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHNhdmVkX3R6XyA9IE5VTEw7CisjaWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmdW5jdGlvbiBvciB2YXJpYWJsZSBtYXkgYmUgdW5zYWZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBnZXRlbnYsIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmR1cCkuCisgICAgaWYgKGdldGVudigiVFoiKSkKKyAgICAgIHNhdmVkX3R6XyA9IHN0cmR1cChnZXRlbnYoIlRaIikpOworIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZSBhZ2Fpbi4KKyNlbHNlCisgICAgaWYgKGdldGVudigiVFoiKSkKKyAgICAgIHNhdmVkX3R6XyA9IHN0cmR1cChnZXRlbnYoIlRaIikpOworI2VuZGlmCisKKyAgICAvLyBTZXQgdXAgdGhlIHRpbWUgem9uZSBmb3IgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEgdG8gdXNlLiAgV2UKKyAgICAvLyBjYW5ub3QgdXNlIHRoZSBsb2NhbCB0aW1lIHpvbmUgYmVjYXVzZSB0aGUgZnVuY3Rpb24ncyBvdXRwdXQgZGVwZW5kcworICAgIC8vIG9uIHRoZSB0aW1lIHpvbmUuCisgICAgU2V0VGltZVpvbmUoIlVUQyswMCIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIFNldFRpbWVab25lKHNhdmVkX3R6Xyk7CisgICAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihzYXZlZF90el8pKTsKKyAgICBzYXZlZF90el8gPSBOVUxMOworICB9CisKKyAgc3RhdGljIHZvaWQgU2V0VGltZVpvbmUoY29uc3QgY2hhciogdGltZV96b25lKSB7CisgICAgLy8gdHpzZXQoKSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIFRaIHZhcmlhYmxlIGJlaW5nIHByZXNlbnQgYW5kIGVtcHR5CisgICAgLy8gYW5kIG5vdCBiZWluZyBwcmVzZW50LCBzbyB3ZSBoYXZlIHRvIGNvbnNpZGVyIHRoZSBjYXNlIG9mIHRpbWVfem9uZQorICAgIC8vIGJlaW5nIE5VTEwuCisjaWYgX01TQ19WRVIKKyAgICAvLyAuLi5Vbmxlc3MgaXQncyBNU1ZDLCB3aG9zZSBzdGFuZGFyZCBsaWJyYXJ5J3MgX3B1dGVudiBkb2Vzbid0CisgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiBlbXB0eSBhbmQgYSBtaXNzaW5nIHZhcmlhYmxlLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPQorICAgICAgICBzdGQ6OnN0cmluZygiVFo9IikgKyAodGltZV96b25lID8gdGltZV96b25lIDogIiIpOworICAgIF9wdXRlbnYoZW52X3Zhci5jX3N0cigpKTsKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmdW5jdGlvbiBpcyBkZXByZWNhdGVkKS4KKyAgICB0enNldCgpOworIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZSBhZ2Fpbi4KKyNlbHNlCisgICAgaWYgKHRpbWVfem9uZSkgeworICAgICAgc2V0ZW52KCgiVFoiKSwgdGltZV96b25lLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgdW5zZXRlbnYoIlRaIik7CisgICAgfQorICAgIHR6c2V0KCk7CisjZW5kaWYKKyAgfQorCisgIGNvbnN0IGNoYXIqIHNhdmVkX3R6XzsKK307CisKK2NvbnN0IFRpbWVJbk1pbGxpcyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3Q6OmtNaWxsaXNQZXJTZWM7CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50c1R3b0RpZ2l0U2VnbWVudHMpIHsKKyAgRVhQRUNUX0VRKCIyMDExLTEwLTMxVDE4OjUyOjQyIiwKKyAgICAgICAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMjAwODcxNjIgKiBrTWlsbGlzUGVyU2VjKSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIE1pbGxpc2Vjb25kc0RvTm90QWZmZWN0UmVzdWx0KSB7CisgIEVYUEVDVF9FUSgKKyAgICAgICIyMDExLTEwLTMxVDE4OjUyOjQyIiwKKyAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMjAwODcxNjIgKiBrTWlsbGlzUGVyU2VjICsgMjM0KSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50c0xlYWRpbmdaZXJvZXMpIHsKKyAgRVhQRUNUX0VRKCIyMDExLTA5LTAzVDA1OjA3OjAyIiwKKyAgICAgICAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMTUwMjY0MjIgKiBrTWlsbGlzUGVyU2VjKSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50czI0SG91clRpbWUpIHsKKyAgRVhQRUNUX0VRKCIyMDExLTA5LTI4VDE3OjA4OjIyIiwKKyAgICAgICAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMTcyMjk3MDIgKiBrTWlsbGlzUGVyU2VjKSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50c0Vwb2NoU3RhcnQpIHsKKyAgRVhQRUNUX0VRKCIxOTcwLTAxLTAxVDAwOjAwOjAwIiwgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMCkpOworfQorCisjaWYgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorCisjIGlmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MgLXctcmNoCisjIGVuZGlmCisKKy8vIFRlc3RzIHRoYXQgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBpcyB0cnVlIHdoZW4geCBpcyBhIG51bGwKKy8vIHBvaW50ZXIgbGl0ZXJhbC4KK1RFU1QoTnVsbExpdGVyYWxUZXN0LCBJc1RydWVGb3JOdWxsTGl0ZXJhbHMpIHsKKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhOVUxMKSk7CisgIEVYUEVDVF9UUlVFKEdURVNUX0lTX05VTExfTElURVJBTF8oMCkpOworICBFWFBFQ1RfVFJVRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKDBVKSk7CisgIEVYUEVDVF9UUlVFKEdURVNUX0lTX05VTExfTElURVJBTF8oMEwpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGlzIGZhbHNlIHdoZW4geCBpcyBub3QgYSBudWxsCisvLyBwb2ludGVyIGxpdGVyYWwuCitURVNUKE51bGxMaXRlcmFsVGVzdCwgSXNGYWxzZUZvck5vbk51bGxMaXRlcmFscykgeworICBFWFBFQ1RfRkFMU0UoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygxKSk7CisgIEVYUEVDVF9GQUxTRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKDAuMCkpOworICBFWFBFQ1RfRkFMU0UoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEdURVNUX0lTX05VTExfTElURVJBTF8oc3RhdGljX2Nhc3Q8dm9pZCo+KE5VTEwpKSk7Cit9CisKKyMgaWZkZWYgX19CT1JMQU5EQ19fCisvLyBSZXN0b3JlcyB3YXJuaW5ncyBhZnRlciBwcmV2aW91cyAiI3ByYWdtYSBvcHRpb24gcHVzaCIgc3VwcHJlc3NlZCB0aGVtLgorIyAgcHJhZ21hIG9wdGlvbiBwb3AKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisvLworLy8gVGVzdHMgQ29kZVBvaW50VG9VdGY4KCkuCisKKy8vIFRlc3RzIHRoYXQgdGhlIE5VTCBjaGFyYWN0ZXIgTCdcMCcgaXMgZW5jb2RlZCBjb3JyZWN0bHkuCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZU51bCkgeworICBFWFBFQ1RfRVEoIiIsIENvZGVQb2ludFRvVXRmOChMJ1wwJykpOworfQorCisvLyBUZXN0cyB0aGF0IEFTQ0lJIGNoYXJhY3RlcnMgYXJlIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGVBc2NpaSkgeworICBFWFBFQ1RfRVEoImEiLCBDb2RlUG9pbnRUb1V0ZjgoTCdhJykpOworICBFWFBFQ1RfRVEoIloiLCBDb2RlUG9pbnRUb1V0ZjgoTCdaJykpOworICBFWFBFQ1RfRVEoIiYiLCBDb2RlUG9pbnRUb1V0ZjgoTCcmJykpOworICBFWFBFQ1RfRVEoIlx4N0YiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDdGJykpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDggdG8gMTEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTEweHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZThUbzExQml0cykgeworICAvLyAwMDAgMTEwMSAwMDExID0+IDExMC0wMDAxMSAxMC0wMTAwMTEKKyAgRVhQRUNUX0VRKCJceEMzXHg5MyIsIENvZGVQb2ludFRvVXRmOChMJ1x4RDMnKSk7CisKKyAgLy8gMTAxIDAxMTEgMDExMCA9PiAxMTAtMTAxMDEgMTAtMTEwMTEwCisgIC8vIFNvbWUgY29tcGlsZXJzIChlLmcuLCBHQ0Mgb24gTWluR1cpIGNhbm5vdCBoYW5kbGUgbm9uLUFTQ0lJIGNvZGVwb2ludHMKKyAgLy8gaW4gd2lkZSBzdHJpbmdzIGFuZCB3aWRlIGNoYXJzLiBJbiBvcmRlciB0byBhY2NvbW9kYXRlIHRoZW0sIHdlIGhhdmUgdG8KKyAgLy8gaW50cm9kdWNlIHN1Y2ggY2hhcmFjdGVyIGNvbnN0YW50cyBhcyBpbnRlZ2Vycy4KKyAgRVhQRUNUX0VRKCJceEQ1XHhCNiIsCisgICAgICAgICAgICBDb2RlUG9pbnRUb1V0Zjgoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg1NzYpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTIgdG8gMTYgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZTEyVG8xNkJpdHMpIHsKKyAgLy8gMDAwMCAxMDAwIDExMDEgMDAxMSA9PiAxMTEwLTAwMDAgMTAtMTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfRVEoIlx4RTBceEEzXHg5MyIsCisgICAgICAgICAgICBDb2RlUG9pbnRUb1V0Zjgoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg4RDMpKSk7CisKKyAgLy8gMTEwMCAwMTExIDAxMDAgMTEwMSA9PiAxMTEwLTExMDAgMTAtMDExMTAxIDEwLTAwMTEwMQorICBFWFBFQ1RfRVEoIlx4RUNceDlEXHg4RCIsCisgICAgICAgICAgICBDb2RlUG9pbnRUb1V0Zjgoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHhDNzREKSkpOworfQorCisjaWYgIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisvLyBUZXN0cyBpbiB0aGlzIGdyb3VwIHJlcXVpcmUgYSB3Y2hhcl90IHRvIGhvbGQgPiAxNiBiaXRzLCBhbmQgdGh1cworLy8gYXJlIHNraXBwZWQgb24gV2luZG93cywgQ3lnd2luLCBhbmQgU3ltYmlhbiwgd2hlcmUgYSB3Y2hhcl90IGlzCisvLyAxNi1iaXQgd2lkZS4gVGhpcyBjb2RlIG1heSBub3QgY29tcGlsZSBvbiB0aG9zZSBzeXN0ZW1zLgorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDE3IHRvIDIxIGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGUxN1RvMjFCaXRzKSB7CisgIC8vIDAgMDAwMSAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTEwLTAwMCAxMC0wMTAwMDAgMTAtMTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfRVEoIlx4RjBceDkwXHhBM1x4OTMiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwOEQzJykpOworCisgIC8vIDAgMDAwMSAwMDAwIDAxMDAgMDAwMCAwMDAwID0+IDExMTEwLTAwMCAxMC0wMTAwMDAgMTAtMDEwMDAwIDEwLTAwMDAwMAorICBFWFBFQ1RfRVEoIlx4RjBceDkwXHg5MFx4ODAiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwNDAwJykpOworCisgIC8vIDEgMDAwMCAxMDAwIDAxMTAgMDAxMSAwMTAwID0+IDExMTEwLTEwMCAxMC0wMDEwMDAgMTAtMDExMDAwIDEwLTExMDEwMAorICBFWFBFQ1RfRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwODYzNCcpKTsKK30KKworLy8gVGVzdHMgdGhhdCBlbmNvZGluZyBhbiBpbnZhbGlkIGNvZGUtcG9pbnQgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCByZXN1bHQuCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZUludmFsaWRDb2RlUG9pbnQpIHsKKyAgRVhQRUNUX0VRKCIoSW52YWxpZCBVbmljb2RlIDB4MTIzNEFCQ0QpIiwgQ29kZVBvaW50VG9VdGY4KEwnXHgxMjM0QUJDRCcpKTsKK30KKworI2VuZGlmICAvLyAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKworLy8gVGVzdHMgV2lkZVN0cmluZ1RvVXRmOCgpLgorCisvLyBUZXN0cyB0aGF0IHRoZSBOVUwgY2hhcmFjdGVyIEwnXDAnIGlzIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlTnVsKSB7CisgIEVYUEVDVF9TVFJFUSgiIiwgV2lkZVN0cmluZ1RvVXRmOChMIiIsIDApLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCIiLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNDSUkgc3RyaW5ncyBhcmUgZW5jb2RlZCBjb3JyZWN0bHkuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVBc2NpaSkgeworICBFWFBFQ1RfU1RSRVEoImEiLCBXaWRlU3RyaW5nVG9VdGY4KEwiYSIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImFiIiwgV2lkZVN0cmluZ1RvVXRmOChMImFiIiwgMikuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiYSIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJhIiwgLTEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImFiIiwgV2lkZVN0cmluZ1RvVXRmOChMImFiIiwgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDggdG8gMTEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTEweHh4eHggMTB4eHh4eHguCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGU4VG8xMUJpdHMpIHsKKyAgLy8gMDAwIDExMDEgMDAxMSA9PiAxMTAtMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhDM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHhEMyIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIlx4QzNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4RDMiLCAtMSkuY19zdHIoKSk7CisKKyAgLy8gMTAxIDAxMTEgMDExMCA9PiAxMTAtMTAxMDEgMTAtMTEwMTEwCisgIGNvbnN0IHdjaGFyX3Qgc1tdID0geyAweDU3NiwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RDVceEI2IiwgV2lkZVN0cmluZ1RvVXRmOChzLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEQ1XHhCNiIsIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDEyIHRvIDE2IGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlMTJUbzE2Qml0cykgeworICAvLyAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTAtMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIGNvbnN0IHdjaGFyX3QgczFbXSA9IHsgMHg4RDMsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEUwXHhBM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KHMxLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEUwXHhBM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KHMxLCAtMSkuY19zdHIoKSk7CisKKyAgLy8gMTEwMCAwMTExIDAxMDAgMTEwMSA9PiAxMTEwLTExMDAgMTAtMDExMTAxIDEwLTAwMTEwMQorICBjb25zdCB3Y2hhcl90IHMyW10gPSB7IDB4Qzc0RCwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RUNceDlEXHg4RCIsIFdpZGVTdHJpbmdUb1V0ZjgoczIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIlx4RUNceDlEXHg4RCIsIFdpZGVTdHJpbmdUb1V0ZjgoczIsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgY29udmVyc2lvbiBzdG9wcyB3aGVuIHRoZSBmdW5jdGlvbiBlbmNvdW50ZXJzIFwwIGNoYXJhY3Rlci4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIFN0b3BzT25OdWxDaGFyYWN0ZXIpIHsKKyAgRVhQRUNUX1NUUkVRKCJBQkMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiQUJDXDBYWVoiLCAxMDApLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBjb252ZXJzaW9uIHN0b3BzIHdoZW4gdGhlIGZ1bmN0aW9uIHJlYWNoZXMgdGhlIGxpbWl0CisvLyBzcGVjaWZpZWQgYnkgdGhlICdsZW5ndGgnIHBhcmFtZXRlci4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIFN0b3BzV2hlbkxlbmd0aExpbWl0UmVhY2hlZCkgeworICBFWFBFQ1RfU1RSRVEoIkFCQyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJBQkNERUYiLCAzKS5jX3N0cigpKTsKK30KKworI2lmICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworLy8gVGVzdHMgdGhhdCBVbmljb2RlIGNvZGUtcG9pbnRzIHRoYXQgaGF2ZSAxNyB0byAyMSBiaXRzIGFyZSBlbmNvZGVkCisvLyBhcyAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eC4gVGhpcyBjb2RlIG1heSBub3QgY29tcGlsZQorLy8gb24gdGhlIHN5c3RlbXMgdXNpbmcgVVRGLTE2IGVuY29kaW5nLgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlMTdUbzIxQml0cykgeworICAvLyAwIDAwMDEgMDAwMCAxMDAwIDExMDEgMDAxMSA9PiAxMTExMC0wMDAgMTAtMDEwMDAwIDEwLTEwMDAxMSAxMC0wMTAwMTEKKyAgRVhQRUNUX1NUUkVRKCJceEYwXHg5MFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4MTA4RDMiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEYwXHg5MFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4MTA4RDMiLCAtMSkuY19zdHIoKSk7CisKKyAgLy8gMSAwMDAwIDEwMDAgMDExMCAwMDExIDAxMDAgPT4gMTExMTAtMTAwIDEwLTAwMTAwMCAxMC0wMTEwMDAgMTAtMTEwMTAwCisgIEVYUEVDVF9TVFJFUSgiXHhGNFx4ODhceDk4XHhCNCIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceDEwODYzNCIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHgxMDg2MzQiLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZW5jb2RpbmcgYW4gaW52YWxpZCBjb2RlLXBvaW50IGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlSW52YWxpZENvZGVQb2ludCkgeworICBFWFBFQ1RfU1RSRVEoIihJbnZhbGlkIFVuaWNvZGUgMHhBQkNERkYpIiwKKyAgICAgICAgICAgICAgIFdpZGVTdHJpbmdUb1V0ZjgoTCJceEFCQ0RGRiIsIC0xKS5jX3N0cigpKTsKK30KKyNlbHNlICAvLyAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKy8vIFRlc3RzIHRoYXQgc3Vycm9nYXRlIHBhaXJzIGFyZSBlbmNvZGVkIGNvcnJlY3RseSBvbiB0aGUgc3lzdGVtcyB1c2luZworLy8gVVRGLTE2IGVuY29kaW5nIGluIHRoZSB3aWRlIHN0cmluZ3MuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVWYWxpZFV0ZjE2U1Vycm9nYXRlUGFpcnMpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSB7IDB4RDgwMSwgMHhEQzAwLCAnXDAnIH07CisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceDkwXHg4MCIsIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGVuY29kaW5nIGFuIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisvLyBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZUludmFsaWRVdGYxNlN1cnJvZ2F0ZVBhaXIpIHsKKyAgLy8gTGVhZGluZyBzdXJyb2dhdGUgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICBjb25zdCB3Y2hhcl90IHMxW10gPSB7IDB4RDgwMCwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RURceEEwXHg4MCIsIFdpZGVTdHJpbmdUb1V0ZjgoczEsIC0xKS5jX3N0cigpKTsKKyAgLy8gTGVhZGluZyBzdXJyb2dhdGUgaXMgbm90IGZvbGxvd2VkIGJ5IHRoZSB0cmFpbGluZyBzdXJyb2dhdGUuCisgIGNvbnN0IHdjaGFyX3QgczJbXSA9IHsgMHhEODAwLCAnTScsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVEXHhBMFx4ODBNIiwgV2lkZVN0cmluZ1RvVXRmOChzMiwgLTEpLmNfc3RyKCkpOworICAvLyBUcmFpbGluZyBzdXJyb2dhdGUgYXBwZWFyYXMgd2l0aG91dCBhIGxlYWRpbmcgc3Vycm9nYXRlLgorICBjb25zdCB3Y2hhcl90IHMzW10gPSB7IDB4REMwMCwgJ1AnLCAnUScsICdSJywgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RURceEIwXHg4MFBRUiIsIFdpZGVTdHJpbmdUb1V0ZjgoczMsIC0xKS5jX3N0cigpKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisKKy8vIFRlc3RzIHRoYXQgY29kZXBvaW50IGNvbmNhdGVuYXRpb24gd29ya3MgY29ycmVjdGx5LgorI2lmICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ29uY2F0ZW5hdGVzQ29kZXBvaW50c0NvcnJlY3RseSkgeworICBjb25zdCB3Y2hhcl90IHNbXSA9IHsgMHgxMDg2MzQsIDB4Qzc0RCwgJ1xuJywgMHg1NzYsIDB4OEQzLCAweDEwODYzNCwgJ1wwJ307CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJceEY0XHg4OFx4OThceEI0IgorICAgICAgICAgICJceEVDXHg5RFx4OEQiCisgICAgICAgICAgIlxuIgorICAgICAgICAgICJceEQ1XHhCNiIKKyAgICAgICAgICAiXHhFMFx4QTNceDkzIgorICAgICAgICAgICJceEY0XHg4OFx4OThceEI0IiwKKyAgICAgIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorI2Vsc2UKK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENvbmNhdGVuYXRlc0NvZGVwb2ludHNDb3JyZWN0bHkpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSB7IDB4Qzc0RCwgJ1xuJywgMHg1NzYsIDB4OEQzLCAnXDAnfTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlx4RUNceDlEXHg4RCIgIlxuIiAiXHhENVx4QjYiICJceEUwXHhBM1x4OTMiLAorICAgICAgV2lkZVN0cmluZ1RvVXRmOChzLCAtMSkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworCisvLyBUZXN0cyB0aGUgUmFuZG9tIGNsYXNzLgorCitURVNUKFJhbmRvbURlYXRoVGVzdCwgR2VuZXJhdGVzQ3Jhc2hlc09uSW52YWxpZFJhbmdlKSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tKDQyKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHJhbmRvbS5HZW5lcmF0ZSgwKSwKKyAgICAgICJDYW5ub3QgZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFxcWzAsIDBcXCkiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHJhbmRvbS5HZW5lcmF0ZSh0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tOjprTWF4UmFuZ2UgKyAxKSwKKyAgICAgICJHZW5lcmF0aW9uIG9mIGEgbnVtYmVyIGluIFxcWzAsIDIxNDc0ODM2NDlcXCkgd2FzIHJlcXVlc3RlZCwgIgorICAgICAgImJ1dCB0aGlzIGNhbiBvbmx5IGdlbmVyYXRlIG51bWJlcnMgaW4gXFxbMCwgMjE0NzQ4MzY0OFxcKSIpOworfQorCitURVNUKFJhbmRvbVRlc3QsIEdlbmVyYXRlc051bWJlcnNXaXRoaW5SYW5nZSkgeworICBjb25zdCBVSW50MzIga1JhbmdlID0gMTAwMDA7CisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tKDEyMzQ1KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRVhQRUNUX0xUKHJhbmRvbS5HZW5lcmF0ZShrUmFuZ2UpLCBrUmFuZ2UpIDw8ICIgZm9yIGl0ZXJhdGlvbiAiIDw8IGk7CisgIH0KKworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbTIodGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbTo6a01heFJhbmdlKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRVhQRUNUX0xUKHJhbmRvbTIuR2VuZXJhdGUoa1JhbmdlKSwga1JhbmdlKSA8PCAiIGZvciBpdGVyYXRpb24gIiA8PCBpOworICB9Cit9CisKK1RFU1QoUmFuZG9tVGVzdCwgUmVwZWF0c1doZW5SZXNlZWRlZCkgeworICBjb25zdCBpbnQga1NlZWQgPSAxMjM7CisgIGNvbnN0IGludCBrQXJyYXlTaXplID0gMTA7CisgIGNvbnN0IFVJbnQzMiBrUmFuZ2UgPSAxMDAwMDsKKyAgVUludDMyIHZhbHVlc1trQXJyYXlTaXplXTsKKworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbShrU2VlZCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0FycmF5U2l6ZTsgaSsrKSB7CisgICAgdmFsdWVzW2ldID0gcmFuZG9tLkdlbmVyYXRlKGtSYW5nZSk7CisgIH0KKworICByYW5kb20uUmVzZWVkKGtTZWVkKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQXJyYXlTaXplOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEodmFsdWVzW2ldLCByYW5kb20uR2VuZXJhdGUoa1JhbmdlKSkgPDwgIiBmb3IgaXRlcmF0aW9uICIgPDwgaTsKKyAgfQorfQorCisvLyBUZXN0cyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4KKworLy8gVGVzdHMgQ291bnRJZigpLgorCitzdGF0aWMgYm9vbCBJc1Bvc2l0aXZlKGludCBuKSB7IHJldHVybiBuID4gMDsgfQorCitURVNUKENvbnRhaW5lclV0aWxpdHlUZXN0LCBDb3VudElmKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gdjsKKyAgRVhQRUNUX0VRKDAsIENvdW50SWYodiwgSXNQb3NpdGl2ZSkpOyAgLy8gV29ya3MgZm9yIGFuIGVtcHR5IGNvbnRhaW5lci4KKworICB2LnB1c2hfYmFjaygtMSk7CisgIHYucHVzaF9iYWNrKDApOworICBFWFBFQ1RfRVEoMCwgQ291bnRJZih2LCBJc1Bvc2l0aXZlKSk7ICAvLyBXb3JrcyB3aGVuIG5vIHZhbHVlIHNhdGlzZmllcy4KKworICB2LnB1c2hfYmFjaygyKTsKKyAgdi5wdXNoX2JhY2soLTEwKTsKKyAgdi5wdXNoX2JhY2soMTApOworICBFWFBFQ1RfRVEoMiwgQ291bnRJZih2LCBJc1Bvc2l0aXZlKSk7Cit9CisKKy8vIFRlc3RzIEZvckVhY2goKS4KKworc3RhdGljIGludCBnX3N1bSA9IDA7CitzdGF0aWMgdm9pZCBBY2N1bXVsYXRlKGludCBuKSB7IGdfc3VtICs9IG47IH0KKworVEVTVChDb250YWluZXJVdGlsaXR5VGVzdCwgRm9yRWFjaCkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIGdfc3VtID0gMDsKKyAgRm9yRWFjaCh2LCBBY2N1bXVsYXRlKTsKKyAgRVhQRUNUX0VRKDAsIGdfc3VtKTsgIC8vIFdvcmtzIGZvciBhbiBlbXB0eSBjb250YWluZXI7CisKKyAgZ19zdW0gPSAwOworICB2LnB1c2hfYmFjaygxKTsKKyAgRm9yRWFjaCh2LCBBY2N1bXVsYXRlKTsKKyAgRVhQRUNUX0VRKDEsIGdfc3VtKTsgIC8vIFdvcmtzIGZvciBhIGNvbnRhaW5lciB3aXRoIG9uZSBlbGVtZW50LgorCisgIGdfc3VtID0gMDsKKyAgdi5wdXNoX2JhY2soMjApOworICB2LnB1c2hfYmFjaygzMDApOworICBGb3JFYWNoKHYsIEFjY3VtdWxhdGUpOworICBFWFBFQ1RfRVEoMzIxLCBnX3N1bSk7Cit9CisKKy8vIFRlc3RzIEdldEVsZW1lbnRPcigpLgorVEVTVChDb250YWluZXJVdGlsaXR5VGVzdCwgR2V0RWxlbWVudE9yKSB7CisgIHN0ZDo6dmVjdG9yPGNoYXI+IGE7CisgIEVYUEVDVF9FUSgneCcsIEdldEVsZW1lbnRPcihhLCAwLCAneCcpKTsKKworICBhLnB1c2hfYmFjaygnYScpOworICBhLnB1c2hfYmFjaygnYicpOworICBFWFBFQ1RfRVEoJ2EnLCBHZXRFbGVtZW50T3IoYSwgMCwgJ3gnKSk7CisgIEVYUEVDVF9FUSgnYicsIEdldEVsZW1lbnRPcihhLCAxLCAneCcpKTsKKyAgRVhQRUNUX0VRKCd4JywgR2V0RWxlbWVudE9yKGEsIC0yLCAneCcpKTsKKyAgRVhQRUNUX0VRKCd4JywgR2V0RWxlbWVudE9yKGEsIDIsICd4JykpOworfQorCitURVNUKENvbnRhaW5lclV0aWxpdHlEZWF0aFRlc3QsIFNodWZmbGVSYW5nZSkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGE7CisgIGEucHVzaF9iYWNrKDApOworICBhLnB1c2hfYmFjaygxKTsKKyAgYS5wdXNoX2JhY2soMik7CisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tKDEpOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBTaHVmZmxlUmFuZ2UoJnJhbmRvbSwgLTEsIDEsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2Ugc3RhcnQgLTE6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMCwgM1xcXSIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIDQsIDQsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2Ugc3RhcnQgNDogbXVzdCBiZSBpbiByYW5nZSBcXFswLCAzXFxdIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBTaHVmZmxlUmFuZ2UoJnJhbmRvbSwgMywgMiwgJmEpLAorICAgICAgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggMjogbXVzdCBiZSBpbiByYW5nZSBcXFszLCAzXFxdIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBTaHVmZmxlUmFuZ2UoJnJhbmRvbSwgMywgNCwgJmEpLAorICAgICAgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggNDogbXVzdCBiZSBpbiByYW5nZSBcXFszLCAzXFxdIik7Cit9CisKK2NsYXNzIFZlY3RvclNodWZmbGVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrVmVjdG9yU2l6ZSA9IDIwOworCisgIFZlY3RvclNodWZmbGVUZXN0KCkgOiByYW5kb21fKDEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtWZWN0b3JTaXplOyBpKyspIHsKKyAgICAgIHZlY3Rvcl8ucHVzaF9iYWNrKGkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBib29sIFZlY3RvcklzQ29ycnVwdChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICBpZiAoa1ZlY3RvclNpemUgIT0gc3RhdGljX2Nhc3Q8aW50Pih2ZWN0b3Iuc2l6ZSgpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBmb3VuZF9pbl92ZWN0b3Jba1ZlY3RvclNpemVdID0geyBmYWxzZSB9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICBjb25zdCBpbnQgZSA9IHZlY3RvcltpXTsKKyAgICAgIGlmIChlIDwgMCB8fCBlID49IGtWZWN0b3JTaXplIHx8IGZvdW5kX2luX3ZlY3RvcltlXSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGZvdW5kX2luX3ZlY3RvcltlXSA9IHRydWU7CisgICAgfQorCisgICAgLy8gVmVjdG9yIHNpemUgaXMgY29ycmVjdCwgZWxlbWVudHMnIHJhbmdlIGlzIGNvcnJlY3QsIG5vCisgICAgLy8gZHVwbGljYXRlIGVsZW1lbnRzLiAgVGhlcmVmb3JlIG5vIGNvcnJ1cHRpb24gaGFzIG9jY3VycmVkLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBib29sIFZlY3RvcklzTm90Q29ycnVwdChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICByZXR1cm4gIVZlY3RvcklzQ29ycnVwdCh2ZWN0b3IpOworICB9CisKKyAgc3RhdGljIGJvb2wgUmFuZ2VJc1NodWZmbGVkKGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvciwgaW50IGJlZ2luLCBpbnQgZW5kKSB7CisgICAgZm9yIChpbnQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgIGlmIChpICE9IHZlY3RvcltpXSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGJvb2wgUmFuZ2VJc1Vuc2h1ZmZsZWQoCisgICAgICBjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IsIGludCBiZWdpbiwgaW50IGVuZCkgeworICAgIHJldHVybiAhUmFuZ2VJc1NodWZmbGVkKHZlY3RvciwgYmVnaW4sIGVuZCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc1NodWZmbGVkKGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvcikgeworICAgIHJldHVybiBSYW5nZUlzU2h1ZmZsZWQodmVjdG9yLCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHZlY3Rvci5zaXplKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIFZlY3RvcklzVW5zaHVmZmxlZChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICByZXR1cm4gIVZlY3RvcklzU2h1ZmZsZWQodmVjdG9yKTsKKyAgfQorCisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tXzsKKyAgVGVzdGluZ1ZlY3RvciB2ZWN0b3JfOworfTsgIC8vIGNsYXNzIFZlY3RvclNodWZmbGVUZXN0CisKK2NvbnN0IGludCBWZWN0b3JTaHVmZmxlVGVzdDo6a1ZlY3RvclNpemU7CisKK1RFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgSGFuZGxlc0VtcHR5UmFuZ2UpIHsKKyAgLy8gVGVzdHMgYW4gZW1wdHkgcmFuZ2UgYXQgdGhlIGJlZ2lubmluZy4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIDAsIDAsICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOworCisgIC8vIC4uLmluIHRoZSBtaWRkbGUuLi4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZS8yLCBrVmVjdG9yU2l6ZS8yLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5hdCB0aGUgZW5kLi4uCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUgLSAxLCBrVmVjdG9yU2l6ZSAtIDEsICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOworCisgIC8vIC4uLmFuZCBwYXN0IHRoZSBlbmQuCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUsIGtWZWN0b3JTaXplLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBIYW5kbGVzUmFuZ2VPZlNpemVPbmUpIHsKKyAgLy8gVGVzdHMgYSBzaXplIG9uZSByYW5nZSBhdCB0aGUgYmVnaW5uaW5nLi4uCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywgMCwgMSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7CisKKyAgLy8gLi4uaW4gdGhlIG1pZGRsZS4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplLzIsIGtWZWN0b3JTaXplLzIgKyAxLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5hbmQgYXQgdGhlIGVuZC4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZSAtIDEsIGtWZWN0b3JTaXplLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKK30KKworLy8gQmVjYXVzZSB3ZSB1c2Ugb3VyIG93biByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBhbmQgYSBmaXhlZCBzZWVkLAorLy8gd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBmb2xsb3dpbmcgInJhbmRvbSIgdGVzdHMgd2lsbCBzdWNjZWVkLgorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzRW50aXJlVmVjdG9yKSB7CisgIFNodWZmbGUoJnJhbmRvbV8sICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEVYUEVDVF9GQUxTRShWZWN0b3JJc1Vuc2h1ZmZsZWQodmVjdG9yXykpIDw8IHZlY3Rvcl87CisKKyAgLy8gVGVzdHMgdGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnRzIGluIHBhcnRpY3VsYXIgdG8gZW5zdXJlIHRoYXQKKyAgLy8gdGhlcmUgYXJlIG5vIG9mZi1ieS1vbmUgcHJvYmxlbXMgaW4gb3VyIHNodWZmbGUgYWxnb3JpdGhtLgorICBFWFBFQ1RfTkUoMCwgdmVjdG9yX1swXSk7CisgIEVYUEVDVF9ORShrVmVjdG9yU2l6ZSAtIDEsIHZlY3Rvcl9ba1ZlY3RvclNpemUgLSAxXSk7Cit9CisKK1RFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgU2h1ZmZsZXNTdGFydE9mVmVjdG9yKSB7CisgIGNvbnN0IGludCBrUmFuZ2VTaXplID0ga1ZlY3RvclNpemUvMjsKKworICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIDAsIGtSYW5nZVNpemUsICZ2ZWN0b3JfKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNTaHVmZmxlZCwgdmVjdG9yXywgMCwga1JhbmdlU2l6ZSk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzVW5zaHVmZmxlZCwgdmVjdG9yXywga1JhbmdlU2l6ZSwga1ZlY3RvclNpemUpOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzRW5kT2ZWZWN0b3IpIHsKKyAgY29uc3QgaW50IGtSYW5nZVNpemUgPSBrVmVjdG9yU2l6ZSAvIDI7CisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1JhbmdlU2l6ZSwga1ZlY3RvclNpemUsICZ2ZWN0b3JfKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNVbnNodWZmbGVkLCB2ZWN0b3JfLCAwLCBrUmFuZ2VTaXplKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNTaHVmZmxlZCwgdmVjdG9yXywga1JhbmdlU2l6ZSwga1ZlY3RvclNpemUpOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzTWlkZGxlT2ZWZWN0b3IpIHsKKyAgaW50IGtSYW5nZVNpemUgPSBrVmVjdG9yU2l6ZS8zOworICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtSYW5nZVNpemUsIDIqa1JhbmdlU2l6ZSwgJnZlY3Rvcl8pOworCisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8sIDAsIGtSYW5nZVNpemUpOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1NodWZmbGVkLCB2ZWN0b3JfLCBrUmFuZ2VTaXplLCAyKmtSYW5nZVNpemUpOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8sIDIqa1JhbmdlU2l6ZSwga1ZlY3RvclNpemUpOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzUmVwZWF0YWJseSkgeworICBUZXN0aW5nVmVjdG9yIHZlY3RvcjI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1ZlY3RvclNpemU7IGkrKykgeworICAgIHZlY3RvcjIucHVzaF9iYWNrKGkpOworICB9CisKKyAgcmFuZG9tXy5SZXNlZWQoMTIzNCk7CisgIFNodWZmbGUoJnJhbmRvbV8sICZ2ZWN0b3JfKTsKKyAgcmFuZG9tXy5SZXNlZWQoMTIzNCk7CisgIFNodWZmbGUoJnJhbmRvbV8sICZ2ZWN0b3IyKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVmVjdG9yU2l6ZTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKHZlY3Rvcl9baV0sIHZlY3RvcjJbaV0pIDw8ICIgd2hlcmUgaSBpcyAiIDw8IGk7CisgIH0KK30KKworLy8gVGVzdHMgdGhlIHNpemUgb2YgdGhlIEFzc2VydEhlbHBlciBjbGFzcy4KKworVEVTVChBc3NlcnRIZWxwZXJUZXN0LCBBc3NlcnRIZWxwZXJJc1NtYWxsKSB7CisgIC8vIFRvIGF2b2lkIGJyZWFraW5nIGNsaWVudHMgdGhhdCB1c2UgbG90cyBvZiBhc3NlcnRpb25zIGluIG9uZQorICAvLyBmdW5jdGlvbiwgd2UgY2Fubm90IGdyb3cgdGhlIHNpemUgb2YgQXNzZXJ0SGVscGVyLgorICBFWFBFQ1RfTEUoc2l6ZW9mKHRlc3Rpbmc6OmludGVybmFsOjpBc3NlcnRIZWxwZXIpLCBzaXplb2Yodm9pZCopKTsKK30KKworLy8gVGVzdHMgU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgpLgorVEVTVChTdHJpbmdUZXN0LCBFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSkgeworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJmb29iYXIiLCAiQkFSIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJmb29iYVIiLCAiYmFyIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJmb29iYXIiLCAiIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCIiLCAiIikpOworCisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJGb29iYXIiLCAiZm9vIikpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiZm9vYmFyIiwgIkZvbyIpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoIiIsICJmb28iKSk7Cit9CisKKy8vIEMrK0J1aWxkZXIncyBwcmVwcm9jZXNzb3IgaXMgYnVnZ3k7IGl0IGZhaWxzIHRvIGV4cGFuZCBtYWNyb3MgdGhhdAorLy8gYXBwZWFyIGluIG1hY3JvIHBhcmFtZXRlcnMgYWZ0ZXIgd2lkZSBjaGFyIGxpdGVyYWxzLiAgUHJvdmlkZSBhbiBhbGlhcworLy8gZm9yIE5VTEwgYXMgYSB3b3JrYXJvdW5kLgorc3RhdGljIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGtOdWxsID0gTlVMTDsKKworLy8gVGVzdHMgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscworVEVTVChTdHJpbmdUZXN0LCBDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscykgeworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKE5VTEwsIE5VTEwpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoa051bGwsIEwiIikpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMIiIsIGtOdWxsKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGtOdWxsLCBMImZvb2JhciIpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCJmb29iYXIiLCBrTnVsbCkpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiZm9vYmFyIiwgTCJmb29iYXIiKSk7CisgIEVYUEVDVF9UUlVFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCJmb29iYXIiLCBMIkZPT0JBUiIpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMIkZPT0JBUiIsIEwiZm9vYmFyIikpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZygpLgorVEVTVChTdHJpbmdUZXN0LCBTaG93V2lkZUNTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLAorICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoTlVMTCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoTCIiKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhMImZvbyIpLmNfc3RyKCkpOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitURVNUKFN0cmluZ1Rlc3QsIEFuc2lBbmRVdGYxNk51bGwpIHsKKyAgRVhQRUNUX0VRKE5VTEwsIFN0cmluZzo6QW5zaVRvVXRmMTYoTlVMTCkpOworICBFWFBFQ1RfRVEoTlVMTCwgU3RyaW5nOjpVdGYxNlRvQW5zaShOVUxMKSk7Cit9CisKK1RFU1QoU3RyaW5nVGVzdCwgQW5zaUFuZFV0ZjE2Q29udmVydEJhc2ljKSB7CisgIGNvbnN0IGNoYXIqIGFuc2kgPSBTdHJpbmc6OlV0ZjE2VG9BbnNpKEwic3RyIik7CisgIEVYUEVDVF9TVFJFUSgic3RyIiwgYW5zaSk7CisgIGRlbGV0ZSBbXSBhbnNpOworICBjb25zdCBXQ0hBUiogdXRmMTYgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KCJzdHIiKTsKKyAgRVhQRUNUX0VRKDAsIHdjc25jbXAoTCJzdHIiLCB1dGYxNiwgMykpOworICBkZWxldGUgW10gdXRmMTY7Cit9CisKK1RFU1QoU3RyaW5nVGVzdCwgQW5zaUFuZFV0ZjE2Q29udmVydFBhdGhDaGFycykgeworICBjb25zdCBjaGFyKiBhbnNpID0gU3RyaW5nOjpVdGYxNlRvQW5zaShMIi46XFwgXCIqPyIpOworICBFWFBFQ1RfU1RSRVEoIi46XFwgXCIqPyIsIGFuc2kpOworICBkZWxldGUgW10gYW5zaTsKKyAgY29uc3QgV0NIQVIqIHV0ZjE2ID0gU3RyaW5nOjpBbnNpVG9VdGYxNigiLjpcXCBcIio/Iik7CisgIEVYUEVDVF9FUSgwLCB3Y3NuY21wKEwiLjpcXCBcIio/IiwgdXRmMTYsIDMpKTsKKyAgZGVsZXRlIFtdIHV0ZjE2OworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIFRlc3RQcm9wZXJ0eSBjb25zdHJ1Y3Rpb24uCitURVNUKFRlc3RQcm9wZXJ0eVRlc3QsIFN0cmluZ1ZhbHVlKSB7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgIjEiKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMSIsIHByb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UHJvcGVydHkgcmVwbGFjaW5nIGEgdmFsdWUuCitURVNUKFRlc3RQcm9wZXJ0eVRlc3QsIFJlcGxhY2VTdHJpbmdWYWx1ZSkgeworICBUZXN0UHJvcGVydHkgcHJvcGVydHkoImtleSIsICIxIik7CisgIEVYUEVDVF9TVFJFUSgiMSIsIHByb3BlcnR5LnZhbHVlKCkpOworICBwcm9wZXJ0eS5TZXRWYWx1ZSgiMiIpOworICBFWFBFQ1RfU1RSRVEoIjIiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gQWRkRmF0YWxGYWlsdXJlKCkgYW5kIEFkZE5vbmZhdGFsRmFpbHVyZSgpIG11c3QgYmUgc3RhbmQtYWxvbmUKKy8vIGZ1bmN0aW9ucyAoaS5lLiB0aGVpciBkZWZpbml0aW9ucyBjYW5ub3QgYmUgaW5saW5lZCBhdCB0aGUgY2FsbAorLy8gc2l0ZXMpLCBvciBDKytCdWlsZGVyIHdvbid0IGNvbXBpbGUgdGhlIGNvZGUuCitzdGF0aWMgdm9pZCBBZGRGYXRhbEZhaWx1cmUoKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworfQorCitzdGF0aWMgdm9pZCBBZGROb25mYXRhbEZhaWx1cmUoKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Cit9CisKK2NsYXNzIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6ICAvLyBNdXN0IGJlIHB1YmxpYyBhbmQgbm90IHByb3RlY3RlZCBkdWUgdG8gYSBidWcgaW4gZysrIDMuNC4yLgorICBlbnVtIEZhaWx1cmVNb2RlIHsKKyAgICBGQVRBTF9GQUlMVVJFLAorICAgIE5PTkZBVEFMX0ZBSUxVUkUKKyAgfTsKKyAgc3RhdGljIHZvaWQgQWRkRmFpbHVyZShGYWlsdXJlTW9kZSBmYWlsdXJlKSB7CisgICAgaWYgKGZhaWx1cmUgPT0gRkFUQUxfRkFJTFVSRSkgeworICAgICAgQWRkRmF0YWxGYWlsdXJlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZE5vbmZhdGFsRmFpbHVyZSgpOworICAgIH0KKyAgfQorfTsKKworLy8gVGVzdHMgdGhhdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBpbnRlcmNlcHRzIHRlc3QKKy8vIGZhaWx1cmVzLgorVEVTVF9GKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCwgSW50ZXJjZXB0c1Rlc3RGYWlsdXJlcykgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKKyAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELAorICAgICAgICAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpOworICB9CisKKyAgRVhQRUNUX0VRKDIsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKS5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworVEVTVF9GKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCwgRGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgeworICAgIC8vIFRlc3RzLCB0aGF0IHRoZSBkZXByZWNhdGVkIGNvbnN0cnVjdG9yIHN0aWxsIHdvcmtzLgorICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKCZyZXN1bHRzKTsKKyAgICBBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpOworICB9CisgIEVYUEVDVF9FUSgxLCByZXN1bHRzLnNpemUoKSk7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisKK2NsYXNzIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyV2l0aFRocmVhZHNUZXN0CisgIDogcHVibGljIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGYWlsdXJlTW9kZSBmYWlsdXJlKSB7CisgICAgVGhyZWFkV2l0aFBhcmFtPEZhaWx1cmVNb2RlPiB0aHJlYWQoJkFkZEZhaWx1cmUsIGZhaWx1cmUsIE5VTEwpOworICAgIHRocmVhZC5Kb2luKCk7CisgIH0KK307CisKK1RFU1RfRihTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcldpdGhUaHJlYWRzVGVzdCwKKyAgICAgICBJbnRlcmNlcHRzVGVzdEZhaWx1cmVzSW5BbGxUaHJlYWRzKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKAorICAgICAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX0FMTF9USFJFQURTLCAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpOworICAgIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpOworICAgIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpOworICB9CisKKyAgRVhQRUNUX0VRKDQsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKS5mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgyKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgzKS5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKKy8vIFRlc3RzIEVYUEVDVF9GQVRBTF9GQUlMVVJFeyxPTl9BTExfVEhSRUFEU30uICBNYWtlcyBzdXJlIHRoYXQgdGhleQorLy8gd29yayBldmVuIGlmIHRoZSBmYWlsdXJlIGlzIGdlbmVyYXRlZCBpbiBhIGNhbGxlZCBmdW5jdGlvbiByYXRoZXIgdGhhbgorLy8gdGhlIGN1cnJlbnQgY29udGV4dC4KKwordHlwZWRlZiBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QgRXhwZWN0RmF0YWxGYWlsdXJlVGVzdDsKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhdGNoZXNGYXRhbEZhbGl1cmUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmF0YWxGYWlsdXJlKCksICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhdGFsRmFpbHVyZSgpLCA6OnN0cmluZygiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKSk7Cit9CisjZW5kaWYKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNTdGRTdHJpbmdPYmplY3QpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmF0YWxGYWlsdXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIikpOworfQorCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc0ZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICAvLyBXZSBoYXZlIGFub3RoZXIgdGVzdCBiZWxvdyB0byB2ZXJpZnkgdGhhdCB0aGUgbWFjcm8gY2F0Y2hlcyBmYXRhbAorICAvLyBmYWlsdXJlcyBnZW5lcmF0ZWQgb24gYW5vdGhlciB0aHJlYWQuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiCisjIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MKKyNlbmRpZgorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIGJlIHVzZWQgaW4gYSBub24tdm9pZAorLy8gZnVuY3Rpb24gZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQgaW4gaXQgY29udGFpbnMgQVNTRVJUXyouCisKK2ludCBOb25Wb2lkRnVuY3Rpb24oKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKGZhbHNlKSwgIiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhGQUlMKCksICIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBDYW5CZVVzZWRJbk5vblZvaWRGdW5jdGlvbikgeworICBOb25Wb2lkRnVuY3Rpb24oKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIC4uLikgZG9lc24ndCBhYm9ydCB0aGUKKy8vIGN1cnJlbnQgZnVuY3Rpb24gZXZlbiB0aG91Z2ggJ3N0YXRlbWVudCcgZ2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZS4KKwordm9pZCBEb2VzTm90QWJvcnRIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShmYWxzZSksICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoRkFJTCgpLCAiIik7CisKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHByZXNzZWQgdGhlbS4KKyMgcHJhZ21hIG9wdGlvbiBwb3AKKyNlbmRpZgorCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRG9lc05vdEFib3J0KSB7CisgIGJvb2wgYWJvcnRlZCA9IHRydWU7CisgIERvZXNOb3RBYm9ydEhlbHBlcigmYWJvcnRlZCk7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkV7LF9PTl9BTExfVEhSRUFEU30gYWNjZXB0cyBhCisvLyBzdGF0ZW1lbnQgdGhhdCBjb250YWlucyBhIG1hY3JvIHdoaWNoIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuCisvLyB1bnByb3RlY3RlZCBjb21tYS4KKworc3RhdGljIGludCBnbG9iYWxfdmFyID0gMDsKKyNkZWZpbmUgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXyBnbG9iYWxfdmFyKyssIGdsb2JhbF92YXIrKworCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEpIHsKKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBHVEVTVF9VU0VfVU5QUk9URUNURURfQ09NTUFfOworICAgIEFkZEZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7CisjZW5kaWYKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyh7CisgICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKKyAgICBBZGRGYXRhbEZhaWx1cmUoKTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRXssT05fQUxMX1RIUkVBRFN9LgorCit0eXBlZGVmIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCBFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0OworCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc05vbmZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBZGROb25mYXRhbEZhaWx1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0cmluZygiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIikpOworfQorI2VuZGlmCisKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RkU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKSk7Cit9CisKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYXRjaGVzTm9uZmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIC8vIFdlIGhhdmUgYW5vdGhlciB0ZXN0IGJlbG93IHRvIHZlcmlmeSB0aGF0IHRoZSBtYWNybyBjYXRjaGVzCisgIC8vIG5vbi1mYXRhbCBmYWlsdXJlcyBnZW5lcmF0ZWQgb24gYW5vdGhlciB0aHJlYWQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9IGFjY2VwdHMgYQorLy8gc3RhdGVtZW50IHRoYXQgY29udGFpbnMgYSBtYWNybyB3aGljaCBleHBhbmRzIHRvIGNvZGUgY29udGFpbmluZyBhbgorLy8gdW5wcm90ZWN0ZWQgY29tbWEuCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIEdURVNUX1VTRV9VTlBST1RFQ1RFRF9DT01NQV87CisgICAgQWRkTm9uZmF0YWxGYWlsdXJlKCk7CisgIH0sICIiKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyh7CisgICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKKyAgICBBZGROb25mYXRhbEZhaWx1cmUoKTsKKyAgfSwgIiIpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCit0eXBlZGVmIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyV2l0aFRocmVhZHNUZXN0CisgICAgRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdDsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKK1RFU1RfRihFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoCisgICAgICBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChOT05GQVRBTF9GQUlMVVJFKSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gVGVzdHMgdGhlIFRlc3RQcm9wZXJ0eSBjbGFzcy4KKworVEVTVChUZXN0UHJvcGVydHlUZXN0LCBDb25zdHJ1Y3RvcldvcmtzKSB7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgInZhbHVlIik7CisgIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoInZhbHVlIiwgcHJvcGVydHkudmFsdWUoKSk7Cit9CisKK1RFU1QoVGVzdFByb3BlcnR5VGVzdCwgU2V0VmFsdWUpIHsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5KCJrZXkiLCAidmFsdWVfMSIpOworICBFWFBFQ1RfU1RSRVEoImtleSIsIHByb3BlcnR5LmtleSgpKTsKKyAgcHJvcGVydHkuU2V0VmFsdWUoInZhbHVlXzIiKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgidmFsdWVfMiIsIHByb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBUZXN0cyB0aGUgVGVzdFJlc3VsdCBjbGFzcworCisvLyBUaGUgdGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIFRlc3RSZXN1bHQuCitjbGFzcyBUZXN0UmVzdWx0VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IFRQUlZlY3RvcjsKKworICAvLyBXZSBtYWtlIHVzZSBvZiAyIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMsCisgIFRlc3RQYXJ0UmVzdWx0ICogcHIxLCAqIHByMjsKKworICAvLyAuLi4gYW5kIDMgVGVzdFJlc3VsdCBvYmplY3RzLgorICBUZXN0UmVzdWx0ICogcjAsICogcjEsICogcjI7CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIHByMSBpcyBmb3Igc3VjY2Vzcy4KKyAgICBwcjEgPSBuZXcgVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vL2Jhci5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VjY2VzcyEiKTsKKworICAgIC8vIHByMiBpcyBmb3IgZmF0YWwgZmFpbHVyZS4KKyAgICBwcjIgPSBuZXcgVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28vYmFyLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsICAvLyBUaGlzIGxpbmUgbnVtYmVyIG1lYW5zICJ1bmtub3duIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSEiKTsKKworICAgIC8vIENyZWF0ZXMgdGhlIFRlc3RSZXN1bHQgb2JqZWN0cy4KKyAgICByMCA9IG5ldyBUZXN0UmVzdWx0KCk7CisgICAgcjEgPSBuZXcgVGVzdFJlc3VsdCgpOworICAgIHIyID0gbmV3IFRlc3RSZXN1bHQoKTsKKworICAgIC8vIEluIG9yZGVyIHRvIHRlc3QgVGVzdFJlc3VsdCwgd2UgbmVlZCB0byBtb2RpZnkgaXRzIGludGVybmFsCisgICAgLy8gc3RhdGUsIGluIHBhcnRpY3VsYXIgdGhlIFRlc3RQYXJ0UmVzdWx0IHZlY3RvciBpdCBob2xkcy4KKyAgICAvLyB0ZXN0X3BhcnRfcmVzdWx0cygpIHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuCisgICAgLy8gV2UgY2FzdCBpdCB0byBhIG5vbi1jb25zdCBvYmplY3Qgcy50LiBpdCBjYW4gYmUgbW9kaWZpZWQgKHllcywKKyAgICAvLyB0aGlzIGlzIGEgaGFjaykuCisgICAgVFBSVmVjdG9yKiByZXN1bHRzMSA9IGNvbnN0X2Nhc3Q8VFBSVmVjdG9yKj4oCisgICAgICAgICZUZXN0UmVzdWx0QWNjZXNzb3I6OnRlc3RfcGFydF9yZXN1bHRzKCpyMSkpOworICAgIFRQUlZlY3RvciogcmVzdWx0czIgPSBjb25zdF9jYXN0PFRQUlZlY3Rvcio+KAorICAgICAgICAmVGVzdFJlc3VsdEFjY2Vzc29yOjp0ZXN0X3BhcnRfcmVzdWx0cygqcjIpKTsKKworICAgIC8vIHIwIGlzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCisKKyAgICAvLyByMSBjb250YWlucyBhIHNpbmdsZSBTVUNDRVNTIFRlc3RQYXJ0UmVzdWx0LgorICAgIHJlc3VsdHMxLT5wdXNoX2JhY2soKnByMSk7CisKKyAgICAvLyByMiBjb250YWlucyBhIFNVQ0NFU1MsIGFuZCBhIEZBSUxVUkUuCisgICAgcmVzdWx0czItPnB1c2hfYmFjaygqcHIxKTsKKyAgICByZXN1bHRzMi0+cHVzaF9iYWNrKCpwcjIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGRlbGV0ZSBwcjE7CisgICAgZGVsZXRlIHByMjsKKworICAgIGRlbGV0ZSByMDsKKyAgICBkZWxldGUgcjE7CisgICAgZGVsZXRlIHIyOworICB9CisKKyAgLy8gSGVscGVyIHRoYXQgY29tcGFyZXMgdHdvIHR3byBUZXN0UGFydFJlc3VsdHMuCisgIHN0YXRpYyB2b2lkIENvbXBhcmVUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgYWN0dWFsKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnR5cGUoKSwgYWN0dWFsLnR5cGUoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLmZpbGVfbmFtZSgpLCBhY3R1YWwuZmlsZV9uYW1lKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5saW5lX251bWJlcigpLCBhY3R1YWwubGluZV9udW1iZXIoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLnN1bW1hcnkoKSwgYWN0dWFsLnN1bW1hcnkoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLm1lc3NhZ2UoKSwgYWN0dWFsLm1lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnBhc3NlZCgpLCBhY3R1YWwucGFzc2VkKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5mYWlsZWQoKSwgYWN0dWFsLmZhaWxlZCgpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQubm9uZmF0YWxseV9mYWlsZWQoKSwgYWN0dWFsLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5mYXRhbGx5X2ZhaWxlZCgpLCBhY3R1YWwuZmF0YWxseV9mYWlsZWQoKSk7CisgIH0KK307CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgdG90YWxfcGFydF9jb3VudCkgeworICBBU1NFUlRfRVEoMCwgcjAtPnRvdGFsX3BhcnRfY291bnQoKSk7CisgIEFTU0VSVF9FUSgxLCByMS0+dG90YWxfcGFydF9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDIsIHIyLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0OjpQYXNzZWQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgUGFzc2VkKSB7CisgIEFTU0VSVF9UUlVFKHIwLT5QYXNzZWQoKSk7CisgIEFTU0VSVF9UUlVFKHIxLT5QYXNzZWQoKSk7CisgIEFTU0VSVF9GQUxTRShyMi0+UGFzc2VkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0OjpGYWlsZWQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgRmFpbGVkKSB7CisgIEFTU0VSVF9GQUxTRShyMC0+RmFpbGVkKCkpOworICBBU1NFUlRfRkFMU0UocjEtPkZhaWxlZCgpKTsKKyAgQVNTRVJUX1RSVUUocjItPkZhaWxlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoKS4KKwordHlwZWRlZiBUZXN0UmVzdWx0VGVzdCBUZXN0UmVzdWx0RGVhdGhUZXN0OworCitURVNUX0YoVGVzdFJlc3VsdERlYXRoVGVzdCwgR2V0VGVzdFBhcnRSZXN1bHQpIHsKKyAgQ29tcGFyZVRlc3RQYXJ0UmVzdWx0KCpwcjEsIHIyLT5HZXRUZXN0UGFydFJlc3VsdCgwKSk7CisgIENvbXBhcmVUZXN0UGFydFJlc3VsdCgqcHIyLCByMi0+R2V0VGVzdFBhcnRSZXN1bHQoMSkpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHIyLT5HZXRUZXN0UGFydFJlc3VsdCgyKSwgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHIyLT5HZXRUZXN0UGFydFJlc3VsdCgtMSksICIiKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdCBoYXMgbm8gcHJvcGVydGllcyB3aGVuIG5vbmUgYXJlIGFkZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBOb1Byb3BlcnRpZXNGb3VuZFdoZW5Ob25lQXJlQWRkZWQpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgQVNTRVJUX0VRKDAsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIHRoZSBleHBlY3RlZCBwcm9wZXJ0eSB3aGVuIGFkZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBPbmVQcm9wZXJ0eUZvdW5kV2hlbkFkZGVkKSB7CisgIFRlc3RSZXN1bHQgdGVzdF9yZXN1bHQ7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHkpOworICBBU1NFUlRfRVEoMSwgdGVzdF9yZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBhY3R1YWxfcHJvcGVydHkgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMCk7CisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBhY3R1YWxfcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBhY3R1YWxfcHJvcGVydHkudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIG11bHRpcGxlIHByb3BlcnRpZXMgd2hlbiBhZGRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgTXVsdGlwbGVQcm9wZXJ0aWVzRm91bmRXaGVuQWRkZWQpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzEoImtleV8xIiwgIjEiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzIoImtleV8yIiwgIjIiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMik7CisgIEFTU0VSVF9FUSgyLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8xID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDApOworICBFWFBFQ1RfU1RSRVEoImtleV8xIiwgYWN0dWFsX3Byb3BlcnR5XzEua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBhY3R1YWxfcHJvcGVydHlfMS52YWx1ZSgpKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8yID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDEpOworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgYWN0dWFsX3Byb3BlcnR5XzIua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIiLCBhY3R1YWxfcHJvcGVydHlfMi52YWx1ZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoKSBvdmVycmlkZXMgdmFsdWVzIGZvciBkdXBsaWNhdGUga2V5cy4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgT3ZlcnJpZGVzVmFsdWVzRm9yRHVwbGljYXRlS2V5cykgeworICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OworICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMV8xKCJrZXlfMSIsICIxIik7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8yXzEoImtleV8yIiwgIjIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzFfMigia2V5XzEiLCAiMTIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzJfMigia2V5XzIiLCAiMjIiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzFfMSk7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eV8yXzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMV8yKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzJfMik7CisKKyAgQVNTRVJUX0VRKDIsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgYWN0dWFsX3Byb3BlcnR5XzEgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMCk7CisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBhY3R1YWxfcHJvcGVydHlfMS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMTIiLCBhY3R1YWxfcHJvcGVydHlfMS52YWx1ZSgpKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8yID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDEpOworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgYWN0dWFsX3Byb3BlcnR5XzIua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIyIiwgYWN0dWFsX3Byb3BlcnR5XzIudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eSgpLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBHZXRUZXN0UHJvcGVydHkpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzEoImtleV8xIiwgIjEiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzIoImtleV8yIiwgIjIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzMoImtleV8zIiwgIjMiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMik7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eV8zKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGZldGNoZWRfcHJvcGVydHlfMSA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgwKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBmZXRjaGVkX3Byb3BlcnR5XzIgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMSk7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgZmV0Y2hlZF9wcm9wZXJ0eV8zID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDIpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBmZXRjaGVkX3Byb3BlcnR5XzEua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBmZXRjaGVkX3Byb3BlcnR5XzEudmFsdWUoKSk7CisKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMiIsIGZldGNoZWRfcHJvcGVydHlfMi5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMiIsIGZldGNoZWRfcHJvcGVydHlfMi52YWx1ZSgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8zIiwgZmV0Y2hlZF9wcm9wZXJ0eV8zLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIzIiwgZmV0Y2hlZF9wcm9wZXJ0eV8zLnZhbHVlKCkpOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQodGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDMpLCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQodGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KC0xKSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEdUZXN0RmxhZ1NhdmVyIHdvcmtzIG9uIFdpbmRvd3MgYW5kIE1hYy4KKworY2xhc3MgR1Rlc3RGbGFnU2F2ZXJUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gU2F2ZXMgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIHN1Y2ggdGhhdCB3ZSBjYW4gcmVzdG9yZSB0aGVtIGxhdGVyLCBhbmQKKyAgLy8gdGhlbiBzZXRzIHRoZW0gdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuICBUaGlzIHdpbGwgYmUgY2FsbGVkCisgIC8vIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBpcyBydW4uCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgc2F2ZXJfID0gbmV3IEdUZXN0RmxhZ1NhdmVyOworCisgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJhdXRvIjsKKyAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiIjsKKyAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSAwOworICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IDE7CisgICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID0ga01heFN0YWNrVHJhY2VEZXB0aDsKKyAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gIiI7CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IGZhbHNlOworICB9CisKKyAgLy8gUmVzdG9yZXMgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIHRoYXQgdGhlIHRlc3RzIGhhdmUgbW9kaWZpZWQuICBUaGlzIHdpbGwKKyAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UgaXMgcnVuLgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGRlbGV0ZSBzYXZlcl87CisgICAgc2F2ZXJfID0gTlVMTDsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGVuCisgIC8vIG1vZGlmaWVzIGVhY2ggb2YgdGhlbS4KKyAgdm9pZCBWZXJpZnlBbmRNb2RpZnlGbGFncygpIHsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdXRvIiwgR1RFU1RfRkxBRyhjb2xvcikuY19zdHIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShHVEVTVF9GTEFHKHByaW50X3RpbWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpOworICAgIEVYUEVDVF9FUSgxLCBHVEVTVF9GTEFHKHJlcGVhdCkpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKHNodWZmbGUpKTsKKyAgICBFWFBFQ1RfRVEoa01heFN0YWNrVHJhY2VEZXB0aCwgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSk7CisKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhjb2xvcikgPSAibm8iOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSB0cnVlOworICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICJhYmMiOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSB0cnVlOworICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6Zm9vLnhtbCI7CisgICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gMTsKKyAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSAxMDA7CisgICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSAxOworICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSAibG9jYWxob3N0OjEyMzQiOworICAgIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSB0cnVlOworICB9CisKKyBwcml2YXRlOgorICAvLyBGb3Igc2F2aW5nIEdvb2dsZSBUZXN0IGZsYWdzIGR1cmluZyB0aGlzIHRlc3QgY2FzZS4KKyAgc3RhdGljIEdUZXN0RmxhZ1NhdmVyKiBzYXZlcl87Cit9OworCitHVGVzdEZsYWdTYXZlciogR1Rlc3RGbGFnU2F2ZXJUZXN0OjpzYXZlcl8gPSBOVUxMOworCisvLyBHb29nbGUgVGVzdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgb2YgdGVzdHMuICBUaGUgZm9sbG93aW5nIHR3bworLy8gdGVzdHMgYXJlIGRlc2lnbmVkIHRvIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGVpciBvcmRlci4KKworLy8gTW9kaWZpZXMgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIGluIHRoZSB0ZXN0IGJvZHkuCitURVNUX0YoR1Rlc3RGbGFnU2F2ZXJUZXN0LCBNb2RpZnlHVGVzdEZsYWdzKSB7CisgIFZlcmlmeUFuZE1vZGlmeUZsYWdzKCk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIGluIHRoZSBib2R5IG9mIHRoZSBwcmV2aW91cyB0ZXN0IHdlcmUKKy8vIHJlc3RvcmVkIHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4KK1RFU1RfRihHVGVzdEZsYWdTYXZlclRlc3QsIFZlcmlmeUdUZXN0RmxhZ3MpIHsKKyAgVmVyaWZ5QW5kTW9kaWZ5RmxhZ3MoKTsKK30KKworLy8gU2V0cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBnaXZlbgorLy8gdmFsdWUuICBJZiB0aGUgdmFsdWUgYXJndW1lbnQgaXMgIiIsIHVuc2V0cyB0aGUgZW52aXJvbm1lbnQKKy8vIHZhcmlhYmxlLiAgVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IGJvdGggYXJndW1lbnRzIGFyZSBub3QgTlVMTC4KK3N0YXRpYyB2b2lkIFNldEVudihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLgorICByZXR1cm47CisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1N1bk9TXzVfOCkgfHwgZGVmaW5lZChfX1N1bk9TXzVfOSkKKyAgLy8gQysrQnVpbGRlcidzIHB1dGVudiBvbmx5IHN0b3JlcyBhIHBvaW50ZXIgdG8gaXRzIHBhcmFtZXRlcjsgd2UgaGF2ZSB0bworICAvLyBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIHJlbWFpbnMgdmFsaWQgYXMgbG9uZyBhcyBpdCBtaWdodCBiZSBuZWVkZWQuCisgIC8vIFdlIHVzZSBhbiBzdGQ6Om1hcCB0byBkbyBzby4KKyAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyo+IGFkZGVkX2VudjsKKworICAvLyBCZWNhdXNlIHB1dGVudiBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCB3ZSBjYW4ndCBkZWxldGUgdGhlCisgIC8vIHByZXZpb3VzIHN0cmluZyAoaWYgcHJlc2VudCkgdW50aWwgYWZ0ZXIgaXQncyByZXBsYWNlZC4KKyAgc3RkOjpzdHJpbmcgKnByZXZfZW52ID0gTlVMTDsKKyAgaWYgKGFkZGVkX2Vudi5maW5kKG5hbWUpICE9IGFkZGVkX2Vudi5lbmQoKSkgeworICAgIHByZXZfZW52ID0gYWRkZWRfZW52W25hbWVdOworICB9CisgIGFkZGVkX2VudltuYW1lXSA9IG5ldyBzdGQ6OnN0cmluZygKKyAgICAgIChNZXNzYWdlKCkgPDwgbmFtZSA8PCAiPSIgPDwgdmFsdWUpLkdldFN0cmluZygpKTsKKworICAvLyBUaGUgc3RhbmRhcmQgc2lnbmF0dXJlIG9mIHB1dGVudiBhY2NlcHRzIGEgJ2NoYXIqJyBhcmd1bWVudC4gT3RoZXIKKyAgLy8gaW1wbGVtZW50YXRpb25zLCBsaWtlIEMrK0J1aWxkZXIncywgYWNjZXB0IGEgJ2NvbnN0IGNoYXIqJy4KKyAgLy8gV2UgY2FzdCBhd2F5IHRoZSAnY29uc3QnIHNpbmNlIHRoYXQgd291bGQgd29yayBmb3IgYm90aCB2YXJpYW50cy4KKyAgcHV0ZW52KGNvbnN0X2Nhc3Q8Y2hhcio+KGFkZGVkX2VudltuYW1lXS0+Y19zdHIoKSkpOworICBkZWxldGUgcHJldl9lbnY7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBJZiB3ZSBhcmUgb24gV2luZG93cyBwcm9wZXIuCisgIF9wdXRlbnYoKE1lc3NhZ2UoKSA8PCBuYW1lIDw8ICI9IiA8PCB2YWx1ZSkuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisjZWxzZQorICBpZiAoKnZhbHVlID09ICdcMCcpIHsKKyAgICB1bnNldGVudihuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBzZXRlbnYobmFtZSwgdmFsdWUsIDEpOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLgorCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnY7CisKKy8vIFRlc3RzIEludDMyRnJvbUdUZXN0RW52KCkuCisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tR1Rlc3RFbnYoKSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorVEVTVChJbnQzMkZyb21HVGVzdEVudlRlc3QsIFJldHVybnNEZWZhdWx0V2hlblZhcmlhYmxlSXNOb3RTZXQpIHsKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIiKTsKKyAgRVhQRUNUX0VRKDEwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDEwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tR1Rlc3RFbnYoKSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVyZmxvd3MgYXMgYW4gSW50MzIuCitURVNUKEludDMyRnJvbUdUZXN0RW52VGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFsdWVPdmVyZmxvd3MpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgd2FybmluZ3MpXG4iKTsKKworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIjEyMzQ1Njc4OTg3NjU0MzIxIik7CisgIEVYUEVDVF9FUSgyMCwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCAyMCkpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiLTEyMzQ1Njc4OTg3NjU0MzIxIik7CisgIEVYUEVDVF9FUSgzMCwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCAzMCkpOworfQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUdUZXN0RW52KCkgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuIHRoZQorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgZGVjaW1hbCBpbnRlZ2VyLgorVEVTVChJbnQzMkZyb21HVGVzdEVudlRlc3QsIFJldHVybnNEZWZhdWx0V2hlblZhbHVlSXNJbnZhbGlkKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyAyIHdhcm5pbmdzKVxuIik7CisKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICJBMSIpOworICBFWFBFQ1RfRVEoNDAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgNDApKTsKKworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIjEyWCIpOworICBFWFBFQ1RfRVEoNTAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgNTApKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21HVGVzdEVudigpIHBhcnNlcyBhbmQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGl0IHJlcHJlc2VudHMgYSB2YWxpZCBkZWNpbWFsIGludGVnZXIgaW4KKy8vIHRoZSByYW5nZSBvZiBhbiBJbnQzMi4KK1RFU1QoSW50MzJGcm9tR1Rlc3RFbnZUZXN0LCBQYXJzZXNBbmRSZXR1cm5zVmFsaWRWYWx1ZSkgeworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIjEyMyIpOworICBFWFBFQ1RfRVEoMTIzLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDApKTsKKworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIi0zMjEiKTsKKyAgRVhQRUNUX0VRKC0zMjEsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMCkpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gVGVzdHMgUGFyc2VJbnQzMkZsYWcoKS4KKworLy8gVGVzdHMgdGhhdCBQYXJzZUludDMyRmxhZygpIHJldHVybnMgZmFsc2UgYW5kIGRvZXNuJ3QgY2hhbmdlIHRoZQorLy8gb3V0cHV0IHZhbHVlIHdoZW4gdGhlIGZsYWcgaGFzIHdyb25nIGZvcm1hdAorVEVTVChQYXJzZUludDMyRmxhZ1Rlc3QsIFJldHVybnNGYWxzZUZvckludmFsaWRGbGFnKSB7CisgIEludDMyIHZhbHVlID0gMTIzOworICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoIi0tYT0xMDAiLCAiYiIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7CisKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCJhPTEwMCIsICJhIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBQYXJzZUludDMyRmxhZygpIHJldHVybnMgZmFsc2UgYW5kIGRvZXNuJ3QgY2hhbmdlIHRoZQorLy8gb3V0cHV0IHZhbHVlIHdoZW4gdGhlIGZsYWcgb3ZlcmZsb3dzIGFzIGFuIEludDMyLgorVEVTVChQYXJzZUludDMyRmxhZ1Rlc3QsIFJldHVybnNEZWZhdWx0V2hlblZhbHVlT3ZlcmZsb3dzKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyAyIHdhcm5pbmdzKVxuIik7CisKKyAgSW50MzIgdmFsdWUgPSAxMjM7CisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hYmM9MTIzNDU2Nzg5ODc2NTQzMjEiLCAiYWJjIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKKworICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoIi0tYWJjPS0xMjM0NTY3ODk4NzY1NDMyMSIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IFBhcnNlSW50MzJGbGFnKCkgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCBjaGFuZ2UgdGhlCisvLyBvdXRwdXQgdmFsdWUgd2hlbiB0aGUgZmxhZyBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBkZWNpbWFsCisvLyBpbnRlZ2VyLgorVEVTVChQYXJzZUludDMyRmxhZ1Rlc3QsIFJldHVybnNEZWZhdWx0V2hlblZhbHVlSXNJbnZhbGlkKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyAyIHdhcm5pbmdzKVxuIik7CisKKyAgSW50MzIgdmFsdWUgPSAxMjM7CisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hYmM9QTEiLCAiYWJjIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKKworICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoIi0tYWJjPTEyWCIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IFBhcnNlSW50MzJGbGFnKCkgcGFyc2VzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhbmQKKy8vIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmbGFnIHJlcHJlc2VudHMgYSB2YWxpZCBkZWNpbWFsIGludGVnZXIgaW4KKy8vIHRoZSByYW5nZSBvZiBhbiBJbnQzMi4KK1RFU1QoUGFyc2VJbnQzMkZsYWdUZXN0LCBQYXJzZXNBbmRSZXR1cm5zVmFsaWRWYWx1ZSkgeworICBJbnQzMiB2YWx1ZSA9IDEyMzsKKyAgRVhQRUNUX1RSVUUoUGFyc2VJbnQzMkZsYWcoIi0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFiYz00NTYiLCAiYWJjIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSg0NTYsIHZhbHVlKTsKKworICBFWFBFQ1RfVFJVRShQYXJzZUludDMyRmxhZygiLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYWJjPS03ODkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgtNzg5LCB2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tRW52T3JEaWUoKSBwYXJzZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXIgb3IKKy8vIHJldHVybnMgdGhlIGNvcnJlY3QgZGVmYXVsdC4KKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLgorI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorVEVTVChJbnQzMkZyb21FbnZPckRpZVRlc3QsIFBhcnNlc0FuZFJldHVybnNWYWxpZFZhbHVlKSB7CisgIEVYUEVDVF9FUSgzMzMsIEludDMyRnJvbUVudk9yRGllKEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVW5zZXRWYXIiLCAzMzMpKTsKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVW5zZXRWYXIiLCAiMTIzIik7CisgIEVYUEVDVF9FUSgxMjMsIEludDMyRnJvbUVudk9yRGllKEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVW5zZXRWYXIiLCAzMzMpKTsKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVW5zZXRWYXIiLCAiLTEyMyIpOworICBFWFBFQ1RfRVEoLTEyMywgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsIDMzMykpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21FbnZPckRpZSgpIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKKy8vIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgYW4gSW50MzIuCitURVNUKEludDMyRnJvbUVudk9yRGllRGVhdGhUZXN0LCBBYm9ydHNPbkZhaWx1cmUpIHsKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVkFSIiwgInh4eCIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJWQVIiLCAxMjMpLAorICAgICAgIi4qIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tRW52T3JEaWUoKSBhYm9ydHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlCisvLyBpZiB0aGUgdmFyaWFibGUgY2Fubm90IGJlIHJlcHJlc250ZWQgYnkgYW4gSW50MzIuCitURVNUKEludDMyRnJvbUVudk9yRGllRGVhdGhUZXN0LCBBYm9ydHNPbkludDMyT3ZlcmZsb3cpIHsKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVkFSIiwgIjEyMzQ1Njc4OTEyMzQ1Njc4OTEyMzQiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIEludDMyRnJvbUVudk9yRGllKEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVkFSIiwgMTIzKSwKKyAgICAgICIuKiIpOworfQorCisvLyBUZXN0cyB0aGF0IFNob3VsZFJ1blRlc3RPblNoYXJkKCkgc2VsZWN0cyBhbGwgdGVzdHMKKy8vIHdoZXJlIHRoZXJlIGlzIDEgc2hhcmQuCitURVNUKFNob3VsZFJ1blRlc3RPblNoYXJkVGVzdCwgSXNQYXJ0aXRpb25XaGVuVGhlcmVJc09uZVNoYXJkKSB7CisgIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDApKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgMSkpOworICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCAyKSk7CisgIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDMpKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgNCkpOworfQorCitjbGFzcyBTaG91bGRTaGFyZFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgaW5kZXhfdmFyXyA9IEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiSU5ERVgiOworICAgIHRvdGFsX3Zhcl8gPSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRPVEFMIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBTZXRFbnYoaW5kZXhfdmFyXywgIiIpOworICAgIFNldEVudih0b3RhbF92YXJfLCAiIik7CisgIH0KKworICBjb25zdCBjaGFyKiBpbmRleF92YXJfOworICBjb25zdCBjaGFyKiB0b3RhbF92YXJfOworfTsKKworLy8gVGVzdHMgdGhhdCBzaGFyZGluZyBpcyBkaXNhYmxlZCBpZiBuZWl0aGVyIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKy8vIGFyZSBzZXQuCitURVNUX0YoU2hvdWxkU2hhcmRUZXN0LCBSZXR1cm5zRmFsc2VXaGVuTmVpdGhlckVudlZhcklzU2V0KSB7CisgIFNldEVudihpbmRleF92YXJfLCAiIik7CisgIFNldEVudih0b3RhbF92YXJfLCAiIik7CisKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc2hhcmRpbmcgaXMgbm90IGVuYWJsZWQgaWYgdG90YWxfc2hhcmRzICA9PSAxLgorVEVTVF9GKFNob3VsZFNoYXJkVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRvdGFsU2hhcmRJc09uZSkgeworICBTZXRFbnYoaW5kZXhfdmFyXywgIjAiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICIxIik7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOworfQorCisvLyBUZXN0cyB0aGF0IHNoYXJkaW5nIGlzIGVuYWJsZWQgaWYgdG90YWxfc2hhcmRzID4gMSBhbmQKKy8vIHdlIGFyZSBub3QgaW4gYSBkZWF0aCB0ZXN0IHN1YnByb2Nlc3MuCisvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBDRS4KKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK1RFU1RfRihTaG91bGRTaGFyZFRlc3QsIFdvcmtzV2hlblNoYXJkRW52VmFyc0FyZVZhbGlkKSB7CisgIFNldEVudihpbmRleF92YXJfLCAiNCIpOworICBTZXRFbnYodG90YWxfdmFyXywgIjIyIik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI4Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiOSIpOworICBFWFBFQ1RfVFJVRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOworCisgIFNldEVudihpbmRleF92YXJfLCAiMCIpOworICBTZXRFbnYodG90YWxfdmFyXywgIjkiKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFRlc3RzIHRoYXQgd2UgZXhpdCBpbiBlcnJvciBpZiB0aGUgc2hhcmRpbmcgdmFsdWVzIGFyZSBub3QgdmFsaWQuCisKK3R5cGVkZWYgU2hvdWxkU2hhcmRUZXN0IFNob3VsZFNoYXJkRGVhdGhUZXN0OworCitURVNUX0YoU2hvdWxkU2hhcmREZWF0aFRlc3QsIEFib3J0c1doZW5TaGFyZGluZ0VudlZhcnNBcmVJbnZhbGlkKSB7CisgIFNldEVudihpbmRleF92YXJfLCAiNCIpOworICBTZXRFbnYodG90YWxfdmFyXywgIjQiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSksICIuKiIpOworCisgIFNldEVudihpbmRleF92YXJfLCAiNCIpOworICBTZXRFbnYodG90YWxfdmFyXywgIi0yIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpLCAiLioiKTsKKworICBTZXRFbnYoaW5kZXhfdmFyXywgIjUiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSksICIuKiIpOworCisgIFNldEVudihpbmRleF92YXJfLCAiIik7CisgIFNldEVudih0b3RhbF92YXJfLCAiNSIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSwgIi4qIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2hvdWxkUnVuVGVzdE9uU2hhcmQgaXMgYSBwYXJ0aXRpb24gd2hlbiA1CisvLyBzaGFyZHMgYXJlIHVzZWQuCitURVNUKFNob3VsZFJ1blRlc3RPblNoYXJkVGVzdCwgSXNQYXJ0aXRpb25XaGVuVGhlcmVBcmVGaXZlU2hhcmRzKSB7CisgIC8vIENob29zZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRlc3RzIGFuZCBzaGFyZHMuCisgIGNvbnN0IGludCBudW1fdGVzdHMgPSAxNzsKKyAgY29uc3QgaW50IG51bV9zaGFyZHMgPSA1OworCisgIC8vIENoZWNrIHBhcnRpdGlvbmluZzogZWFjaCB0ZXN0IHNob3VsZCBiZSBvbiBleGFjdGx5IDEgc2hhcmQuCisgIGZvciAoaW50IHRlc3RfaWQgPSAwOyB0ZXN0X2lkIDwgbnVtX3Rlc3RzOyB0ZXN0X2lkKyspIHsKKyAgICBpbnQgcHJldl9zZWxlY3RlZF9zaGFyZF9pbmRleCA9IC0xOworICAgIGZvciAoaW50IHNoYXJkX2luZGV4ID0gMDsgc2hhcmRfaW5kZXggPCBudW1fc2hhcmRzOyBzaGFyZF9pbmRleCsrKSB7CisgICAgICBpZiAoU2hvdWxkUnVuVGVzdE9uU2hhcmQobnVtX3NoYXJkcywgc2hhcmRfaW5kZXgsIHRlc3RfaWQpKSB7CisgICAgICAgIGlmIChwcmV2X3NlbGVjdGVkX3NoYXJkX2luZGV4IDwgMCkgeworICAgICAgICAgIHByZXZfc2VsZWN0ZWRfc2hhcmRfaW5kZXggPSBzaGFyZF9pbmRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJTaGFyZCAiIDw8IHByZXZfc2VsZWN0ZWRfc2hhcmRfaW5kZXggPDwgIiBhbmQgIgorICAgICAgICAgICAgPDwgc2hhcmRfaW5kZXggPDwgIiBhcmUgYm90aCBzZWxlY3RlZCB0byBydW4gdGVzdCAiIDw8IHRlc3RfaWQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGVjayBiYWxhbmNlOiBUaGlzIGlzIG5vdCByZXF1aXJlZCBieSB0aGUgc2hhcmRpbmcgcHJvdG9jb2wsIGJ1dCBpcyBhCisgIC8vIGRlc2lyYWJsZSBwcm9wZXJ0eSBmb3IgcGVyZm9ybWFuY2UuCisgIGZvciAoaW50IHNoYXJkX2luZGV4ID0gMDsgc2hhcmRfaW5kZXggPCBudW1fc2hhcmRzOyBzaGFyZF9pbmRleCsrKSB7CisgICAgaW50IG51bV90ZXN0c19vbl9zaGFyZCA9IDA7CisgICAgZm9yIChpbnQgdGVzdF9pZCA9IDA7IHRlc3RfaWQgPCBudW1fdGVzdHM7IHRlc3RfaWQrKykgeworICAgICAgbnVtX3Rlc3RzX29uX3NoYXJkICs9CisgICAgICAgIFNob3VsZFJ1blRlc3RPblNoYXJkKG51bV9zaGFyZHMsIHNoYXJkX2luZGV4LCB0ZXN0X2lkKTsKKyAgICB9CisgICAgRVhQRUNUX0dFKG51bV90ZXN0c19vbl9zaGFyZCwgbnVtX3Rlc3RzIC8gbnVtX3NoYXJkcyk7CisgIH0KK30KKworLy8gRm9yIHRoZSBzYW1lIHJlYXNvbiB3ZSBhcmUgbm90IGV4cGxpY2l0bHkgdGVzdGluZyBldmVyeXRoaW5nIGluIHRoZQorLy8gVGVzdCBjbGFzcywgdGhlcmUgYXJlIG5vIHNlcGFyYXRlIHRlc3RzIGZvciB0aGUgZm9sbG93aW5nIGNsYXNzZXMKKy8vIChleGNlcHQgZm9yIHNvbWUgdHJpdmlhbCBjYXNlcyk6CisvLworLy8gICBUZXN0Q2FzZSwgVW5pdFRlc3QsIFVuaXRUZXN0UmVzdWx0UHJpbnRlci4KKy8vCisvLyBTaW1pbGFybHksIHRoZXJlIGFyZSBubyBzZXBhcmF0ZSB0ZXN0cyBmb3IgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisvLworLy8gICBURVNULCBURVNUX0YsIFJVTl9BTExfVEVTVFMKKworVEVTVChVbml0VGVzdFRlc3QsIENhbkdldE9yaWdpbmFsV29ya2luZ0RpcikgeworICBBU1NFUlRfVFJVRShVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSAhPSBOVUxMKTsKKyAgRVhQRUNUX1NUUk5FKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpLCAiIik7Cit9CisKK1RFU1QoVW5pdFRlc3RUZXN0LCBSZXR1cm5zUGxhdXNpYmxlVGltZXN0YW1wKSB7CisgIEVYUEVDVF9MVCgwLCBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+c3RhcnRfdGltZXN0YW1wKCkpOworICBFWFBFQ1RfTEUoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnN0YXJ0X3RpbWVzdGFtcCgpLCBHZXRUaW1lSW5NaWxsaXMoKSk7Cit9CisKKy8vIFdoZW4gYSBwcm9wZXJ0eSB1c2luZyBhIHJlc2VydmVkIGtleSBpcyBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uLCBpdAorLy8gdGVzdHMgdGhhdCBhIG5vbi1mYXRhbCBmYWlsdXJlIGlzIGFkZGVkLCBhIGZhdGFsIGZhaWx1cmUgaXMgbm90IGFkZGVkLAorLy8gYW5kIHRoYXQgdGhlIHByb3BlcnR5IGlzIG5vdCByZWNvcmRlZC4KK3ZvaWQgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXkoCisgICAgY29uc3QgVGVzdFJlc3VsdCYgdGVzdF9yZXN1bHQsIGNvbnN0IGNoYXIqIGtleSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShUZXN0OjpSZWNvcmRQcm9wZXJ0eShrZXksICIxIiksICJSZXNlcnZlZCBrZXkiKTsKKyAgQVNTRVJUX0VRKDAsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSkgPDwgIlByb3BlcnR5IGZvciBrZXkgJyIgPDwga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInIHJlY29yZGVkIHVuZXhwZWN0ZWRseS4iOworfQorCit2b2lkIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3QoCisgICAgY29uc3QgY2hhcioga2V5KSB7CisgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9pbmZvICE9IE5VTEwpOworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleSgqdGVzdF9pbmZvLT5yZXN1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KTsKK30KKwordm9pZCBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0Q2FzZSgKKyAgICBjb25zdCBjaGFyKiBrZXkpIHsKKyAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworICBBU1NFUlRfVFJVRSh0ZXN0X2Nhc2UgIT0gTlVMTCk7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KAorICAgICAgdGVzdF9jYXNlLT5hZF9ob2NfdGVzdF9yZXN1bHQoKSwga2V5KTsKK30KKwordm9pZCBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgIGNvbnN0IGNoYXIqIGtleSkgeworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleSgKKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5hZF9ob2NfdGVzdF9yZXN1bHQoKSwga2V5KTsKK30KKworLy8gVGVzdHMgdGhhdCBwcm9wZXJ0eSByZWNvcmRpbmcgZnVuY3Rpb25zIGluIFVuaXRUZXN0IG91dHNpZGUgb2YgdGVzdHMKKy8vIGZ1bmN0aW9ucyBjb3JyZWNseS4gIENyZWF0aW5nIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgVW5pdFRlc3QgZW5zdXJlcyBpdAorLy8gaXMgaW4gYSBzdGF0ZSBzaW1pbGFyIHRvIHRoZSBVbml0VGVzdCdzIHNpbmdsZXRvbidzIGJldHdlZW4gdGVzdHMuCitjbGFzcyBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdCA6CisgICAgcHVibGljIHRlc3Rpbmc6OmludGVybmFsOjpVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlciB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3RDYXNlKAorICAgICAgICAiZGlzYWJsZWQiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0Q2FzZSgKKyAgICAgICAgImVycm9ycyIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3RDYXNlKAorICAgICAgICAiZmFpbHVyZXMiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0Q2FzZSgKKyAgICAgICAgIm5hbWUiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0Q2FzZSgKKyAgICAgICAgInRlc3RzIik7CisgICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdENhc2UoCisgICAgICAgICJ0aW1lIik7CisKKyAgICBUZXN0OjpSZWNvcmRQcm9wZXJ0eSgidGVzdF9jYXNlX2tleV8xIiwgIjEiKTsKKyAgICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9jYXNlKCk7CisgICAgQVNTRVJUX1RSVUUodGVzdF9jYXNlICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZS0+YWRfaG9jX3Rlc3RfcmVzdWx0KCkudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInRlc3RfY2FzZV9rZXlfMSIsCisgICAgICAgICAgICAgICAgIHRlc3RfY2FzZS0+YWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLmtleSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEiLAorICAgICAgICAgICAgICAgICB0ZXN0X2Nhc2UtPmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS52YWx1ZSgpKTsKKyAgfQorfTsKKworLy8gVGVzdHMgVGVzdFJlc3VsdCBoYXMgdGhlIGV4cGVjdGVkIHByb3BlcnR5IHdoZW4gYWRkZWQuCitURVNUX0YoVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3QsIE9uZVByb3BlcnR5Rm91bmRXaGVuQWRkZWQpIHsKKyAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworCisgIEFTU0VSVF9FUSgxLCB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsCisgICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMSIsCisgICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS52YWx1ZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdCBoYXMgbXVsdGlwbGUgcHJvcGVydGllcyB3aGVuIGFkZGVkLgorVEVTVF9GKFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0LCBNdWx0aXBsZVByb3BlcnRpZXNGb3VuZFdoZW5BZGRlZCkgeworICBVbml0VGVzdFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7CisgIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoImtleV8yIiwgIjIiKTsKKworICBBU1NFUlRfRVEoMiwgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLAorICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS52YWx1ZSgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwKKyAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDEpLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIyIiwgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMSkudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OlJlY29yZFByb3BlcnR5KCkgb3ZlcnJpZGVzIHZhbHVlcyBmb3IgZHVwbGljYXRlIGtleXMuCitURVNUX0YoVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3QsIE92ZXJyaWRlc1ZhbHVlc0ZvckR1cGxpY2F0ZUtleXMpIHsKKyAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBVbml0VGVzdFJlY29yZFByb3BlcnR5KCJrZXlfMiIsICIyIik7CisgIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoImtleV8xIiwgIjEyIik7CisgIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoImtleV8yIiwgIjIyIik7CisKKyAgQVNTRVJUX0VRKDIsIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8xIiwKKyAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIxMiIsCisgICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS52YWx1ZSgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwKKyAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDEpLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIyMiIsCisgICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgxKS52YWx1ZSgpKTsKK30KKworVEVTVF9GKFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0LAorICAgICAgIEFkZEZhaWx1cmVJbnNpZGVUZXN0c1doZW5Vc2luZ1Rlc3RDYXNlUmVzZXJ2ZWRLZXlzKSB7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3QoCisgICAgICAibmFtZSIpOworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0KAorICAgICAgInZhbHVlX3BhcmFtIik7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3QoCisgICAgICAidHlwZV9wYXJhbSIpOworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0KAorICAgICAgInN0YXR1cyIpOworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0KAorICAgICAgInRpbWUiKTsKKyAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdCgKKyAgICAgICJjbGFzc25hbWUiKTsKK30KKworVEVTVF9GKFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0LAorICAgICAgIEFkZFJlY29yZFdpdGhSZXNlcnZlZEtleXNHZW5lcmF0ZXNDb3JyZWN0UHJvcGVydHlMaXN0KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoIm5hbWUiLCAiMSIpLAorICAgICAgIidjbGFzc25hbWUnLCAnbmFtZScsICdzdGF0dXMnLCAndGltZScsICd0eXBlX3BhcmFtJywgYW5kICd2YWx1ZV9wYXJhbSciCisgICAgICAiIGFyZSByZXNlcnZlZCIpOworfQorCitjbGFzcyBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEVudmlyb25tZW50IDogcHVibGljIEVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAidGVzdHMiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAiZmFpbHVyZXMiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAiZGlzYWJsZWQiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAiZXJyb3JzIik7CisgICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKKyAgICAgICAgIm5hbWUiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAidGltZXN0YW1wIik7CisgICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKKyAgICAgICAgInRpbWUiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAicmFuZG9tX3NlZWQiKTsKKyAgfQorfTsKKworLy8gVGhpcyB3aWxsIHRlc3QgcHJvcGVydHkgcmVjb3JkaW5nIG91dHNpZGUgb2YgYW55IHRlc3Qgb3IgdGVzdCBjYXNlLgorc3RhdGljIEVudmlyb25tZW50KiByZWNvcmRfcHJvcGVydHlfZW52ID0KKyAgICBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0RW52aXJvbm1lbnQpOworCisvLyBUaGlzIGdyb3VwIG9mIHRlc3RzIGlzIGZvciBwcmVkaWNhdGUgYXNzZXJ0aW9ucyAoQVNTRVJUX1BSRUQqLCBldGMpCisvLyBvZiB2YXJpb3VzIGFyaXRpZXMuICBUaGV5IGRvIG5vdCBhdHRlbXB0IHRvIGJlIGV4aGF1c3RpdmUuICBSYXRoZXIsCisvLyB2aWV3IHRoZW0gYXMgc21va2UgdGVzdHMgdGhhdCBjYW4gYmUgZWFzaWx5IHJldmlld2VkIGFuZCB2ZXJpZmllZC4KKy8vIEEgbW9yZSBjb21wbGV0ZSBzZXQgb2YgdGVzdHMgZm9yIHByZWRpY2F0ZSBhc3NlcnRpb25zIGNhbiBiZSBmb3VuZAorLy8gaW4gZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjLgorCisvLyBGaXJzdCwgc29tZSBwcmVkaWNhdGVzIGFuZCBwcmVkaWNhdGUtZm9ybWF0dGVycyBuZWVkZWQgYnkgdGhlIHRlc3RzLgorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBhcmd1bWVudCBpcyBhbiBldmVuIG51bWJlci4KK2Jvb2wgSXNFdmVuKGludCBuKSB7CisgIHJldHVybiAobiAlIDIpID09IDA7Cit9CisKKy8vIEEgZnVuY3RvciB0aGF0IHJldHVybnMgdHJ1ZSBpZmYgdGhlIGFyZ3VtZW50IGlzIGFuIGV2ZW4gbnVtYmVyLgorc3RydWN0IElzRXZlbkZ1bmN0b3IgeworICBib29sIG9wZXJhdG9yKCkoaW50IG4pIHsgcmV0dXJuIElzRXZlbihuKTsgfQorfTsKKworLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uIHRoYXQgYXNzZXJ0cyB0aGUgYXJndW1lbnQgaXMgYW4gZXZlbgorLy8gbnVtYmVyLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydElzRXZlbihjb25zdCBjaGFyKiBleHByLCBpbnQgbikgeworICBpZiAoSXNFdmVuKG4pKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IG4gPDwgIiwgd2hpY2ggaXMgbm90IGV2ZW4uIjsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKK30KKworLy8gQSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIEFzc2VydGlvblJlc3VsdCBmb3IgdXNlIGluCisvLyBFWFBFQ1QvQVNTRVJUX1RSVUUvRkFMU0UuCitBc3NlcnRpb25SZXN1bHQgUmVzdWx0SXNFdmVuKGludCBuKSB7CisgIGlmIChJc0V2ZW4obikpCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKSA8PCBuIDw8ICIgaXMgZXZlbiI7CisgIGVsc2UKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworfQorCisvLyBBIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgQXNzZXJ0aW9uUmVzdWx0IGJ1dCBnaXZlcyBubworLy8gZXhwbGFuYXRpb24gd2h5IGl0IHN1Y2NlZWRzLiBOZWVkZWQgZm9yIHRlc3RpbmcgdGhhdAorLy8gRVhQRUNUL0FTU0VSVF9GQUxTRSBoYW5kbGVzIHN1Y2ggZnVuY3Rpb25zIGNvcnJlY3RseS4KK0Fzc2VydGlvblJlc3VsdCBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKGludCBuKSB7CisgIGlmIChJc0V2ZW4obikpCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgZWxzZQorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7Cit9CisKKy8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yIHRoYXQgYXNzZXJ0cyB0aGUgYXJndW1lbnQgaXMgYW4gZXZlbgorLy8gbnVtYmVyLgorc3RydWN0IEFzc2VydElzRXZlbkZ1bmN0b3IgeworICBBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBleHByLCBpbnQgbikgeworICAgIHJldHVybiBBc3NlcnRJc0V2ZW4oZXhwciwgbik7CisgIH0KK307CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHN1bSBvZiB0aGUgYXJndW1lbnRzIGlzIGFuIGV2ZW4gbnVtYmVyLgorYm9vbCBTdW1Jc0V2ZW4yKGludCBuMSwgaW50IG4yKSB7CisgIHJldHVybiBJc0V2ZW4objEgKyBuMik7Cit9CisKKy8vIEEgZnVuY3RvciB0aGF0IHJldHVybnMgdHJ1ZSBpZmYgdGhlIHN1bSBvZiB0aGUgYXJndW1lbnRzIGlzIGFuIGV2ZW4KKy8vIG51bWJlci4KK3N0cnVjdCBTdW1Jc0V2ZW4zRnVuY3RvciB7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgbjEsIGludCBuMiwgaW50IG4zKSB7CisgICAgcmV0dXJuIElzRXZlbihuMSArIG4yICsgbjMpOworICB9Cit9OworCisvLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24gdGhhdCBhc3NlcnRzIHRoZSBzdW0gb2YgdGhlCisvLyBhcmd1bWVudHMgaXMgYW4gZXZlbiBudW1iZXIuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0U3VtSXNFdmVuNCgKKyAgICBjb25zdCBjaGFyKiBlMSwgY29uc3QgY2hhciogZTIsIGNvbnN0IGNoYXIqIGUzLCBjb25zdCBjaGFyKiBlNCwKKyAgICBpbnQgbjEsIGludCBuMiwgaW50IG4zLCBpbnQgbjQpIHsKKyAgY29uc3QgaW50IHN1bSA9IG4xICsgbjIgKyBuMyArIG40OworICBpZiAoSXNFdmVuKHN1bSkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBlMSA8PCAiICsgIiA8PCBlMiA8PCAiICsgIiA8PCBlMyA8PCAiICsgIiA8PCBlNAorICAgICAgPDwgIiAoIiA8PCBuMSA8PCAiICsgIiA8PCBuMiA8PCAiICsgIiA8PCBuMyA8PCAiICsgIiA8PCBuNAorICAgICAgPDwgIikgZXZhbHVhdGVzIHRvICIgPDwgc3VtIDw8ICIsIHdoaWNoIGlzIG5vdCBldmVuLiI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Cit9CisKKy8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yIHRoYXQgYXNzZXJ0cyB0aGUgc3VtIG9mIHRoZSBhcmd1bWVudHMKKy8vIGlzIGFuIGV2ZW4gbnVtYmVyLgorc3RydWN0IEFzc2VydFN1bUlzRXZlbjVGdW5jdG9yIHsKKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoCisgICAgICBjb25zdCBjaGFyKiBlMSwgY29uc3QgY2hhciogZTIsIGNvbnN0IGNoYXIqIGUzLCBjb25zdCBjaGFyKiBlNCwKKyAgICAgIGNvbnN0IGNoYXIqIGU1LCBpbnQgbjEsIGludCBuMiwgaW50IG4zLCBpbnQgbjQsIGludCBuNSkgeworICAgIGNvbnN0IGludCBzdW0gPSBuMSArIG4yICsgbjMgKyBuNCArIG41OworICAgIGlmIChJc0V2ZW4oc3VtKSkgeworICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBNZXNzYWdlIG1zZzsKKyAgICBtc2cgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMgPDwgIiArICIgPDwgZTQgPDwgIiArICIgPDwgZTUKKyAgICAgICAgPDwgIiAoIgorICAgICAgICA8PCBuMSA8PCAiICsgIiA8PCBuMiA8PCAiICsgIiA8PCBuMyA8PCAiICsgIiA8PCBuNCA8PCAiICsgIiA8PCBuNQorICAgICAgICA8PCAiKSBldmFsdWF0ZXMgdG8gIiA8PCBzdW0gPDwgIiwgd2hpY2ggaXMgbm90IGV2ZW4uIjsKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZShtc2cpOworICB9Cit9OworCisKKy8vIFRlc3RzIHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBUZXN0cyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IGRvbid0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCitURVNUKFByZWQxVGVzdCwgV2l0aG91dEZvcm1hdCkgeworICAvLyBTdWNjZXNzIGNhc2VzLgorICBFWFBFQ1RfUFJFRDEoSXNFdmVuRnVuY3RvcigpLCAyKSA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgQVNTRVJUX1BSRUQxKElzRXZlbiwgNCk7CisKKyAgLy8gRmFpbHVyZSBjYXNlcy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKElzRXZlbiwgNSkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfUFJFRDEoSXNFdmVuRnVuY3RvcigpLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgImV2YWx1YXRlcyB0byBmYWxzZSIpOworfQorCisvLyBUZXN0cyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCitURVNUKFByZWQxVGVzdCwgV2l0aEZvcm1hdCkgeworICAvLyBTdWNjZXNzIGNhc2VzLgorICBFWFBFQ1RfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbiwgMik7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuRnVuY3RvcigpLCA0KQorICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgVU5FWFBFQ1RFRCEiOworCisgIC8vIEZhaWx1cmUgY2FzZXMuCisgIGNvbnN0IGludCBuID0gNTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1BSRURfRk9STUFUMShBc3NlcnRJc0V2ZW5GdW5jdG9yKCksIG4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibiBldmFsdWF0ZXMgdG8gNSwgd2hpY2ggaXMgbm90IGV2ZW4uIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuLCA1KSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMgZXZhbHVhdGVzIHRoZWlyIGFyZ3VtZW50cworLy8gZXhhY3RseSBvbmNlLgorVEVTVChQcmVkMVRlc3QsIFNpbmdsZUV2YWx1YXRpb25PbkZhaWx1cmUpIHsKKyAgLy8gQSBzdWNjZXNzIGNhc2UuCisgIHN0YXRpYyBpbnQgbiA9IDA7CisgIEVYUEVDVF9QUkVEMShJc0V2ZW4sIG4rKyk7CisgIEVYUEVDVF9FUSgxLCBuKSA8PCAiVGhlIGFyZ3VtZW50IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisKKyAgLy8gQSBmYWlsdXJlIGNhc2UuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuRnVuY3RvcigpLCBuKyspCisgICAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0VRKDIsIG4pIDw8ICJUaGUgYXJndW1lbnQgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKK30KKworCisvLyBUZXN0cyBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB3aG9zZSBhcml0eSBpcyA+PSAyLgorCisvLyBUZXN0cyBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IGRvbid0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCitURVNUKFByZWRUZXN0LCBXaXRob3V0Rm9ybWF0KSB7CisgIC8vIFN1Y2Nlc3MgY2FzZXMuCisgIEFTU0VSVF9QUkVEMihTdW1Jc0V2ZW4yLCAyLCA0KSA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgRVhQRUNUX1BSRUQzKFN1bUlzRXZlbjNGdW5jdG9yKCksIDQsIDYsIDgpOworCisgIC8vIEZhaWx1cmUgY2FzZXMuCisgIGNvbnN0IGludCBuMSA9IDE7CisgIGNvbnN0IGludCBuMiA9IDI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMihTdW1Jc0V2ZW4yLCBuMSwgbjIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQzKFN1bUlzRXZlbjNGdW5jdG9yKCksIDEsIDIsIDQpOworICB9LCAiZXZhbHVhdGVzIHRvIGZhbHNlIik7Cit9CisKKy8vIFRlc3RzIHByZWRpY2F0ZSBhc3NlcnRpb25zIHRoYXQgdXNlIGEgY3VzdG9tIGZvcm1hdHRlci4KK1RFU1QoUHJlZFRlc3QsIFdpdGhGb3JtYXQpIHsKKyAgLy8gU3VjY2VzcyBjYXNlcy4KKyAgQVNTRVJUX1BSRURfRk9STUFUNChBc3NlcnRTdW1Jc0V2ZW40LCA0LCA2LCA4LCAxMCkgPDwKKyAgICAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgRVhQRUNUX1BSRURfRk9STUFUNShBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvcigpLCAyLCA0LCA2LCA4LCAxMCk7CisKKyAgLy8gRmFpbHVyZSBjYXNlcy4KKyAgY29uc3QgaW50IG4xID0gMTsKKyAgY29uc3QgaW50IG4yID0gMjsKKyAgY29uc3QgaW50IG4zID0gNDsKKyAgY29uc3QgaW50IG40ID0gNjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChBc3NlcnRTdW1Jc0V2ZW40LCBuMSwgbjIsIG4zLCBuNCk7CisgIH0sICJldmFsdWF0ZXMgdG8gMTMsIHdoaWNoIGlzIG5vdCBldmVuLiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KEFzc2VydFN1bUlzRXZlbjVGdW5jdG9yKCksIDEsIDIsIDQsIDYsIDgpCisgICAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBldmFsdWF0ZXMgdGhlaXIgYXJndW1lbnRzCisvLyBleGFjdGx5IG9uY2UuCitURVNUKFByZWRUZXN0LCBTaW5nbGVFdmFsdWF0aW9uT25GYWlsdXJlKSB7CisgIC8vIEEgc3VjY2VzcyBjYXNlLgorICBpbnQgbjEgPSAwOworICBpbnQgbjIgPSAwOworICBFWFBFQ1RfUFJFRDIoU3VtSXNFdmVuMiwgbjErKywgbjIrKyk7CisgIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworCisgIC8vIEFub3RoZXIgc3VjY2VzcyBjYXNlLgorICBuMSA9IG4yID0gMDsKKyAgaW50IG4zID0gMDsKKyAgaW50IG40ID0gMDsKKyAgaW50IG41ID0gMDsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgIG4xKyssIG4yKyssIG4zKyssIG40KyssIG41KyspCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKyAgRVhQRUNUX0VRKDEsIG4xKSA8PCAiQXJndW1lbnQgMSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjIpIDw8ICJBcmd1bWVudCAyIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMykgPDwgIkFyZ3VtZW50IDMgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG40KSA8PCAiQXJndW1lbnQgNCBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjUpIDw8ICJBcmd1bWVudCA1IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisKKyAgLy8gQSBmYWlsdXJlIGNhc2UuCisgIG4xID0gbjIgPSBuMyA9IDA7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhTdW1Jc0V2ZW4zRnVuY3RvcigpLCArK24xLCBuMisrLCBuMysrKQorICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjMpIDw8ICJBcmd1bWVudCAzIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisKKyAgLy8gQW5vdGhlciBmYWlsdXJlIGNhc2UuCisgIG4xID0gbjIgPSBuMyA9IG40ID0gMDsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChBc3NlcnRTdW1Jc0V2ZW40LCArK24xLCBuMisrLCBuMysrLCBuNCsrKTsKKyAgfSwgImV2YWx1YXRlcyB0byAxLCB3aGljaCBpcyBub3QgZXZlbi4iKTsKKyAgRVhQRUNUX0VRKDEsIG4xKSA8PCAiQXJndW1lbnQgMSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjIpIDw8ICJBcmd1bWVudCAyIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMykgPDwgIkFyZ3VtZW50IDMgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG40KSA8PCAiQXJndW1lbnQgNCBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworfQorCisKKy8vIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGVzdGluZyB1c2luZyBvdmVybG9hZGVkL3RlbXBsYXRlCisvLyBmdW5jdGlvbnMgd2l0aCBBU1NFUlRfUFJFRG4gYW5kIEVYUEVDVF9QUkVEbi4KKworYm9vbCBJc1Bvc2l0aXZlKGRvdWJsZSB4KSB7CisgIHJldHVybiB4ID4gMDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIElzTmVnYXRpdmUoVCB4KSB7CisgIHJldHVybiB4IDwgMDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2Jvb2wgR3JlYXRlclRoYW4oVDEgeDEsIFQyIHgyKSB7CisgIHJldHVybiB4MSA+IHgyOworfQorCisvLyBUZXN0cyB0aGF0IG92ZXJsb2FkZWQgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluICpfUFJFRCogYXMgbG9uZyBhcworLy8gdGhlaXIgdHlwZXMgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorVEVTVChQcmVkaWNhdGVBc3NlcnRpb25UZXN0LCBBY2NlcHRzT3ZlcmxvYWRlZEZ1bmN0aW9uKSB7CisgIC8vIEMrK0J1aWxkZXIgcmVxdWlyZXMgQy1zdHlsZSBjYXN0cyByYXRoZXIgdGhhbiBzdGF0aWNfY2FzdC4KKyAgRVhQRUNUX1BSRUQxKChib29sICgqKShpbnQpKShJc1Bvc2l0aXZlKSwgNSk7ICAvLyBOT0xJTlQKKyAgQVNTRVJUX1BSRUQxKChib29sICgqKShkb3VibGUpKShJc1Bvc2l0aXZlKSwgNi4wKTsgIC8vIE5PTElOVAorfQorCisvLyBUZXN0cyB0aGF0IHRlbXBsYXRlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRUQqIGFzIGxvbmcgYXMKKy8vIHRoZWlyIHR5cGVzIGFyZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KK1RFU1QoUHJlZGljYXRlQXNzZXJ0aW9uVGVzdCwgQWNjZXB0c1RlbXBsYXRlRnVuY3Rpb24pIHsKKyAgRVhQRUNUX1BSRUQxKElzTmVnYXRpdmU8aW50PiwgLTUpOworICAvLyBNYWtlcyBzdXJlIHRoYXQgd2UgY2FuIGhhbmRsZSB0ZW1wbGF0ZXMgd2l0aCBtb3JlIHRoYW4gb25lCisgIC8vIHBhcmFtZXRlci4KKyAgQVNTRVJUX1BSRUQyKChHcmVhdGVyVGhhbjxpbnQsIGludD4pLCA1LCAwKTsKK30KKworCisvLyBTb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgdXNpbmcgb3ZlcmxvYWRlZC90ZW1wbGF0ZQorLy8gZnVuY3Rpb25zIHdpdGggQVNTRVJUX1BSRURfRk9STUFUbiBhbmQgRVhQRUNUX1BSRURfRk9STUFUbi4KKworQXNzZXJ0aW9uUmVzdWx0IElzUG9zaXRpdmVGb3JtYXQoY29uc3QgY2hhciogLyogZXhwciAqLywgaW50IG4pIHsKKyAgcmV0dXJuIG4gPiAwID8gQXNzZXJ0aW9uU3VjY2VzcygpIDoKKyAgICAgIEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJGYWlsdXJlIik7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1Bvc2l0aXZlRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIgKi8sIGRvdWJsZSB4KSB7CisgIHJldHVybiB4ID4gMCA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6CisgICAgICBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiRmFpbHVyZSIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0Fzc2VydGlvblJlc3VsdCBJc05lZ2F0aXZlRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIgKi8sIFQgeCkgeworICByZXR1cm4geCA8IDAgPyBBc3NlcnRpb25TdWNjZXNzKCkgOgorICAgICAgQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgIkZhaWx1cmUiKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK0Fzc2VydGlvblJlc3VsdCBFcXVhbHNGb3JtYXQoY29uc3QgY2hhciogLyogZXhwcjEgKi8sIGNvbnN0IGNoYXIqIC8qIGV4cHIyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgeDEsIGNvbnN0IFQyJiB4MikgeworICByZXR1cm4geDEgPT0geDIgPyBBc3NlcnRpb25TdWNjZXNzKCkgOgorICAgICAgQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgIkZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRURfRk9STUFUKgorLy8gd2l0aG91dCBleHBsaWNpdGx5IHNwZWNpZnlpbmcgdGhlaXIgdHlwZXMuCitURVNUKFByZWRpY2F0ZUZvcm1hdEFzc2VydGlvblRlc3QsIEFjY2VwdHNPdmVybG9hZGVkRnVuY3Rpb24pIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShJc1Bvc2l0aXZlRm9ybWF0LCA1KTsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShJc1Bvc2l0aXZlRm9ybWF0LCA2LjApOworfQorCisvLyBUZXN0cyB0aGF0IHRlbXBsYXRlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRURfRk9STUFUKiB3aXRob3V0CisvLyBleHBsaWNpdGx5IHNwZWNpZnlpbmcgdGhlaXIgdHlwZXMuCitURVNUKFByZWRpY2F0ZUZvcm1hdEFzc2VydGlvblRlc3QsIEFjY2VwdHNUZW1wbGF0ZUZ1bmN0aW9uKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNOZWdhdGl2ZUZvcm1hdCwgLTUpOworICBBU1NFUlRfUFJFRF9GT1JNQVQyKEVxdWFsc0Zvcm1hdCwgMywgMyk7Cit9CisKKworLy8gVGVzdHMgc3RyaW5nIGFzc2VydGlvbnMuCisKKy8vIFRlc3RzIEFTU0VSVF9TVFJFUSB3aXRoIG5vbi1OVUxMIGFyZ3VtZW50cy4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUkVRKSB7CisgIGNvbnN0IGNoYXIgKiBjb25zdCBwMSA9ICJnb29kIjsKKyAgQVNTRVJUX1NUUkVRKHAxLCBwMSk7CisKKyAgLy8gTGV0IHAyIGhhdmUgdGhlIHNhbWUgY29udGVudCBhcyBwMSwgYnV0IGJlIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MuCisgIGNvbnN0IGNoYXIgcDJbXSA9ICJnb29kIjsKKyAgQVNTRVJUX1NUUkVRKHAxLCBwMik7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkVRKCJiYWQiLCAiZ29vZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IFwiYmFkXCIiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1NUUkVRIHdpdGggTlVMTCBhcmd1bWVudHMuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJFUV9OdWxsKSB7CisgIEFTU0VSVF9TVFJFUShzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KE5VTEwpLCBOVUxMKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkVRKE5VTEwsICJub24tbnVsbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAibm9uLW51bGwiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1NUUkVRIHdpdGggTlVMTCBhcmd1bWVudHMuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJFUV9OdWxsMikgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSRVEoIm5vbi1udWxsIiwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICJub24tbnVsbCIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfU1RSTkUuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJORSkgeworICBBU1NFUlRfU1RSTkUoImhpIiwgIkhpIik7CisgIEFTU0VSVF9TVFJORSgiSGkiLCBOVUxMKTsKKyAgQVNTRVJUX1NUUk5FKE5VTEwsICJIaSIpOworICBBU1NFUlRfU1RSTkUoIiIsIE5VTEwpOworICBBU1NFUlRfU1RSTkUoTlVMTCwgIiIpOworICBBU1NFUlRfU1RSTkUoIiIsICJIaSIpOworICBBU1NFUlRfU1RSTkUoIkhpIiwgIiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSTkUoIkhpIiwgIkhpIiksCisgICAgICAgICAgICAgICAgICAgICAgICJcIkhpXCIgdnMgXCJIaVwiIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9TVFJDQVNFRVEuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJDQVNFRVEpIHsKKyAgQVNTRVJUX1NUUkNBU0VFUSgiaGkiLCAiSGkiKTsKKyAgQVNTRVJUX1NUUkNBU0VFUShzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KE5VTEwpLCBOVUxMKTsKKworICBBU1NFUlRfU1RSQ0FTRUVRKCIiLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFRVEoIkhpIiwgImhpMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAiKGlnbm9yaW5nIGNhc2UpIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9TVFJDQVNFTkUuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJDQVNFTkUpIHsKKyAgQVNTRVJUX1NUUkNBU0VORSgiaGkxIiwgIkhpMiIpOworICBBU1NFUlRfU1RSQ0FTRU5FKCJIaSIsIE5VTEwpOworICBBU1NFUlRfU1RSQ0FTRU5FKE5VTEwsICJIaSIpOworICBBU1NFUlRfU1RSQ0FTRU5FKCIiLCBOVUxMKTsKKyAgQVNTRVJUX1NUUkNBU0VORShOVUxMLCAiIik7CisgIEFTU0VSVF9TVFJDQVNFTkUoIiIsICJIaSIpOworICBBU1NFUlRfU1RSQ0FTRU5FKCJIaSIsICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkNBU0VORSgiSGkiLCAiaGkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIihpZ25vcmluZyBjYXNlKSIpOworfQorCisvLyBUZXN0cyAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgU1RSRVFfV2lkZSkgeworICAvLyBOVUxMIHN0cmluZ3MuCisgIEFTU0VSVF9TVFJFUShzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90ICo+KE5VTEwpLCBOVUxMKTsKKworICAvLyBFbXB0eSBzdHJpbmdzLgorICBBU1NFUlRfU1RSRVEoTCIiLCBMIiIpOworCisgIC8vIE5vbi1udWxsIHZzIE5VTEwuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJFUShMIm5vbi1udWxsIiwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tbnVsbCIpOworCisgIC8vIEVxdWFsIHN0cmluZ3MuCisgIEVYUEVDVF9TVFJFUShMIkhpIiwgTCJIaSIpOworCisgIC8vIFVuZXF1YWwgc3RyaW5ncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkVRKEwiYWJjIiwgTCJBYmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFiYyIpOworCisgIC8vIFN0cmluZ3MgY29udGFpbmluZyB3aWRlIGNoYXJhY3RlcnMuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJFUShMImFiY1x4ODExOSIsIEwiYWJjXHg4MTIwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMiKTsKKworICAvLyBUaGUgc3RyZWFtaW5nIHZhcmlhdGlvbi4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1NUUkVRKEwiYWJjXHg4MTE5IiwgTCJhYmNceDgxMjEiKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSI7CisgIH0sICJFeHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBTVFJORV9XaWRlKSB7CisgIC8vIE5VTEwgc3RyaW5ncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1NUUk5FKHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QgKj4oTlVMTCksIE5VTEwpOworICB9LCAiIik7CisKKyAgLy8gRW1wdHkgc3RyaW5ncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKEwiIiwgTCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkxcIlwiIik7CisKKyAgLy8gTm9uLW51bGwgdnMgTlVMTC4KKyAgQVNTRVJUX1NUUk5FKEwibm9uLW51bGwiLCBOVUxMKTsKKworICAvLyBFcXVhbCBzdHJpbmdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSTkUoTCJIaSIsIEwiSGkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkxcIkhpXCIiKTsKKworICAvLyBVbmVxdWFsIHN0cmluZ3MuCisgIEVYUEVDVF9TVFJORShMImFiYyIsIEwiQWJjIik7CisKKyAgLy8gU3RyaW5ncyBjb250YWluaW5nIHdpZGUgY2hhcmFjdGVycy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKEwiYWJjXHg4MTE5IiwgTCJhYmNceDgxMTkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYyIpOworCisgIC8vIFRoZSBzdHJlYW1pbmcgdmFyaWF0aW9uLgorICBBU1NFUlRfU1RSTkUoTCJhYmNceDgxMTkiLCBMImFiY1x4ODEyMCIpIDw8ICJUaGlzIHNob3VsZG4ndCBoYXBwZW4iOworfQorCisvLyBUZXN0cyBmb3IgOjp0ZXN0aW5nOjpJc1N1YnN0cmluZygpLgorCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nKCkgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3QgY2hhciouCitURVNUKElzU3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JDU3RyaW5nKSB7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsIE5VTEwsICJhIikpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCAiYiIsIE5VTEwpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgIm5lZWRsZSIsICJoYXlzdGFjayIpKTsKKworICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihOVUxMKSwgTlVMTCkpOworICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsICJuZWVkbGUiLCAidHdvIG5lZWRsZXMiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCB3Y2hhcl90Ki4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvcldpZGVDU3RyaW5nKSB7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsIGtOdWxsLCBMImEiKSk7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsIEwiYiIsIGtOdWxsKSk7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgTCJoYXlzdGFjayIpKTsKKworICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsIHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPihOVUxMKSwgTlVMTCkpOworICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgTCJ0d28gbmVlZGxlcyIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZygpIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBtZXNzYWdlIHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IGNoYXIqLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIEdlbmVyYXRlc0NvcnJlY3RNZXNzYWdlRm9yQ1N0cmluZykgeworICBFWFBFQ1RfU1RSRVEoIlZhbHVlIG9mOiBuZWVkbGVfZXhwclxuIgorICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBcIm5lZWRsZVwiXG4iCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrX2V4cHJcbiIKKyAgICAgICAgICAgICAgICJXaGljaCBpczogXCJoYXlzdGFja1wiIiwKKyAgICAgICAgICAgICAgIElzU3Vic3RyaW5nKCJuZWVkbGVfZXhwciIsICJoYXlzdGFja19leHByIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkbGUiLCAiaGF5c3RhY2siKS5mYWlsdXJlX21lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OnN0cmluZy4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdHNGb3JTdGRTdHJpbmcpIHsKKyAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCBzdGQ6OnN0cmluZygiaGVsbG8iKSwgImFoZWxsb2IiKSk7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsICJoZWxsbyIsIHN0ZDo6c3RyaW5nKCJ3b3JsZCIpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OndzdHJpbmcuCitURVNUKElzU3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JTdGRXc3RyaW5nKSB7CisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgOjpzdGQ6OndzdHJpbmcoTCJuZWVkbGUiKSwgTCJ0d28gbmVlZGxlcyIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCA6OnN0ZDo6d3N0cmluZyhMImhheXN0YWNrIikpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZygpIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBtZXNzYWdlIHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjp3c3RyaW5nLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIEdlbmVyYXRlc0NvcnJlY3RNZXNzYWdlRm9yV3N0cmluZykgeworICBFWFBFQ1RfU1RSRVEoIlZhbHVlIG9mOiBuZWVkbGVfZXhwclxuIgorICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBMXCJuZWVkbGVcIlxuIgorICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBhIHN1YnN0cmluZyBvZiBoYXlzdGFja19leHByXG4iCisgICAgICAgICAgICAgICAiV2hpY2ggaXM6IExcImhheXN0YWNrXCIiLAorICAgICAgICAgICAgICAgSXNTdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIm5lZWRsZV9leHByIiwgImhheXN0YWNrX2V4cHIiLAorICAgICAgICAgICAgICAgICAgIDo6c3RkOjp3c3RyaW5nKEwibmVlZGxlIiksIEwiaGF5c3RhY2siKS5mYWlsdXJlX21lc3NhZ2UoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRlc3RzIGZvciA6OnRlc3Rpbmc6OklzTm90U3Vic3RyaW5nKCkuCisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCBjaGFyKi4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvckNTdHJpbmcpIHsKKyAgRVhQRUNUX1RSVUUoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCAibmVlZGxlIiwgImhheXN0YWNrIikpOworICBFWFBFQ1RfRkFMU0UoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCAibmVlZGxlIiwgInR3byBuZWVkbGVzIikpOworfQorCisvLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nKCkgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3Qgd2NoYXJfdCouCitURVNUKElzTm90U3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JXaWRlQ1N0cmluZykgeworICBFWFBFQ1RfVFJVRShJc05vdFN1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgTCJoYXlzdGFjayIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCBMInR3byBuZWVkbGVzIikpOworfQorCisvLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nKCkgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3Qgd2NoYXJfdCouCitURVNUKElzTm90U3Vic3RyaW5nVGVzdCwgR2VuZXJhdGVzQ29ycmVjdE1lc3NhZ2VGb3JXaWRlQ1N0cmluZykgeworICBFWFBFQ1RfU1RSRVEoIlZhbHVlIG9mOiBuZWVkbGVfZXhwclxuIgorICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBMXCJuZWVkbGVcIlxuIgorICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBub3QgYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2tfZXhwclxuIgorICAgICAgICAgICAgICAgIldoaWNoIGlzOiBMXCJ0d28gbmVlZGxlc1wiIiwKKyAgICAgICAgICAgICAgIElzTm90U3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICJuZWVkbGVfZXhwciIsICJoYXlzdGFja19leHByIiwKKyAgICAgICAgICAgICAgICAgICBMIm5lZWRsZSIsIEwidHdvIG5lZWRsZXMiKS5mYWlsdXJlX21lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OnN0cmluZy4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdHNGb3JTdGRTdHJpbmcpIHsKKyAgRVhQRUNUX0ZBTFNFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgc3RkOjpzdHJpbmcoImhlbGxvIiksICJhaGVsbG9iIikpOworICBFWFBFQ1RfVFJVRShJc05vdFN1YnN0cmluZygiIiwgIiIsICJoZWxsbyIsIHN0ZDo6c3RyaW5nKCJ3b3JsZCIpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcoKSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgbWVzc2FnZSB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6c3RyaW5nLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIEdlbmVyYXRlc0NvcnJlY3RNZXNzYWdlRm9yU3RkU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiVmFsdWUgb2Y6IG5lZWRsZV9leHByXG4iCisgICAgICAgICAgICAgICAiICBBY3R1YWw6IFwibmVlZGxlXCJcbiIKKyAgICAgICAgICAgICAgICJFeHBlY3RlZDogbm90IGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrX2V4cHJcbiIKKyAgICAgICAgICAgICAgICJXaGljaCBpczogXCJ0d28gbmVlZGxlc1wiIiwKKyAgICAgICAgICAgICAgIElzTm90U3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICJuZWVkbGVfZXhwciIsICJoYXlzdGFja19leHByIiwKKyAgICAgICAgICAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJuZWVkbGUiKSwgInR3byBuZWVkbGVzIikuZmFpbHVyZV9tZXNzYWdlKCkpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OndzdHJpbmcuCitURVNUKElzTm90U3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JTdGRXc3RyaW5nKSB7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIElzTm90U3Vic3RyaW5nKCIiLCAiIiwgOjpzdGQ6OndzdHJpbmcoTCJuZWVkbGUiKSwgTCJ0d28gbmVlZGxlcyIpKTsKKyAgRVhQRUNUX1RSVUUoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIDo6c3RkOjp3c3RyaW5nKEwiaGF5c3RhY2siKSkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisvLyBUZXN0cyBmbG9hdGluZy1wb2ludCBhc3NlcnRpb25zLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK2NsYXNzIEZsb2F0aW5nUG9pbnRUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gUHJlLWNhbGN1bGF0ZWQgbnVtYmVycyB0byBiZSB1c2VkIGJ5IHRoZSB0ZXN0cy4KKyAgc3RydWN0IFRlc3RWYWx1ZXMgeworICAgIFJhd1R5cGUgY2xvc2VfdG9fcG9zaXRpdmVfemVybzsKKyAgICBSYXdUeXBlIGNsb3NlX3RvX25lZ2F0aXZlX3plcm87CisgICAgUmF3VHlwZSBmdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybzsKKworICAgIFJhd1R5cGUgY2xvc2VfdG9fb25lOworICAgIFJhd1R5cGUgZnVydGhlcl9mcm9tX29uZTsKKworICAgIFJhd1R5cGUgaW5maW5pdHk7CisgICAgUmF3VHlwZSBjbG9zZV90b19pbmZpbml0eTsKKyAgICBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9pbmZpbml0eTsKKworICAgIFJhd1R5cGUgbmFuMTsKKyAgICBSYXdUeXBlIG5hbjI7CisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSB0ZXN0aW5nOjppbnRlcm5hbDo6RmxvYXRpbmdQb2ludDxSYXdUeXBlPiBGbG9hdGluZzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGbG9hdGluZzo6Qml0cyBCaXRzOworCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBjb25zdCBzaXplX3QgbWF4X3VscHMgPSBGbG9hdGluZzo6a01heFVscHM7CisKKyAgICAvLyBUaGUgYml0cyB0aGF0IHJlcHJlc2VudCAwLjAuCisgICAgY29uc3QgQml0cyB6ZXJvX2JpdHMgPSBGbG9hdGluZygwKS5iaXRzKCk7CisKKyAgICAvLyBNYWtlcyBzb21lIG51bWJlcnMgY2xvc2UgdG8gMC4wLgorICAgIHZhbHVlc18uY2xvc2VfdG9fcG9zaXRpdmVfemVybyA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIHplcm9fYml0cyArIG1heF91bHBzLzIpOworICAgIHZhbHVlc18uY2xvc2VfdG9fbmVnYXRpdmVfemVybyA9IC1GbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICB6ZXJvX2JpdHMgKyBtYXhfdWxwcyAtIG1heF91bHBzLzIpOworICAgIHZhbHVlc18uZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm8gPSAtRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgemVyb19iaXRzICsgbWF4X3VscHMgKyAxIC0gbWF4X3VscHMvMik7CisKKyAgICAvLyBUaGUgYml0cyB0aGF0IHJlcHJlc2VudCAxLjAuCisgICAgY29uc3QgQml0cyBvbmVfYml0cyA9IEZsb2F0aW5nKDEpLmJpdHMoKTsKKworICAgIC8vIE1ha2VzIHNvbWUgbnVtYmVycyBjbG9zZSB0byAxLjAuCisgICAgdmFsdWVzXy5jbG9zZV90b19vbmUgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKG9uZV9iaXRzICsgbWF4X3VscHMpOworICAgIHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIG9uZV9iaXRzICsgbWF4X3VscHMgKyAxKTsKKworICAgIC8vICtpbmZpbml0eS4KKyAgICB2YWx1ZXNfLmluZmluaXR5ID0gRmxvYXRpbmc6OkluZmluaXR5KCk7CisKKyAgICAvLyBUaGUgYml0cyB0aGF0IHJlcHJlc2VudCAraW5maW5pdHkuCisgICAgY29uc3QgQml0cyBpbmZpbml0eV9iaXRzID0gRmxvYXRpbmcodmFsdWVzXy5pbmZpbml0eSkuYml0cygpOworCisgICAgLy8gTWFrZXMgc29tZSBudW1iZXJzIGNsb3NlIHRvIGluZmluaXR5LgorICAgIHZhbHVlc18uY2xvc2VfdG9faW5maW5pdHkgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICBpbmZpbml0eV9iaXRzIC0gbWF4X3VscHMpOworICAgIHZhbHVlc18uZnVydGhlcl9mcm9tX2luZmluaXR5ID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgaW5maW5pdHlfYml0cyAtIG1heF91bHBzIC0gMSk7CisKKyAgICAvLyBNYWtlcyBzb21lIE5BTidzLiAgU2V0cyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGZyYWN0aW9uIHNvIHRoYXQKKyAgICAvLyBvdXIgTmFOJ3MgYXJlIHF1aWV0OyB0cnlpbmcgdG8gcHJvY2VzcyBhIHNpZ25hbGluZyBOYU4gd291bGQgcmFpc2UgYW4KKyAgICAvLyBleGNlcHRpb24gaWYgb3VyIGVudmlyb25tZW50IGVuYWJsZXMgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9ucy4KKyAgICB2YWx1ZXNfLm5hbjEgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKEZsb2F0aW5nOjprRXhwb25lbnRCaXRNYXNrCisgICAgICAgIHwgKHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChGbG9hdGluZzo6a0ZyYWN0aW9uQml0Q291bnQgLSAxKSkgfCAxKTsKKyAgICB2YWx1ZXNfLm5hbjIgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKEZsb2F0aW5nOjprRXhwb25lbnRCaXRNYXNrCisgICAgICAgIHwgKHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChGbG9hdGluZzo6a0ZyYWN0aW9uQml0Q291bnQgLSAxKSkgfCAyMDApOworICB9CisKKyAgdm9pZCBUZXN0U2l6ZSgpIHsKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKFJhd1R5cGUpLCBzaXplb2YoQml0cykpOworICB9CisKKyAgc3RhdGljIFRlc3RWYWx1ZXMgdmFsdWVzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgordHlwZW5hbWUgRmxvYXRpbmdQb2ludFRlc3Q8UmF3VHlwZT46OlRlc3RWYWx1ZXMKKyAgICBGbG9hdGluZ1BvaW50VGVzdDxSYXdUeXBlPjo6dmFsdWVzXzsKKworLy8gSW5zdGFudGlhdGVzIEZsb2F0aW5nUG9pbnRUZXN0IGZvciB0ZXN0aW5nICpfRkxPQVRfRVEuCit0eXBlZGVmIEZsb2F0aW5nUG9pbnRUZXN0PGZsb2F0PiBGbG9hdFRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgdGhlIHNpemUgb2YgRmxvYXQ6OkJpdHMgbWF0Y2hlcyB0aGUgc2l6ZSBvZiBmbG9hdC4KK1RFU1RfRihGbG9hdFRlc3QsIFNpemUpIHsKKyAgVGVzdFNpemUoKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHdpdGggKzAgYW5kIC0wLgorVEVTVF9GKEZsb2F0VGVzdCwgWmVyb3MpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMCwgLTAuMCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSgtMC4wLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4wIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GTE9BVF9FUSgwLjAsIDEuNSksCisgICAgICAgICAgICAgICAgICAgICAgICIxLjUiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgY2xvc2UgdG8gMC4KKy8vCisvLyBUaGlzIGVuc3VyZXMgdGhhdCAqX0ZMT0FUX0VRIGhhbmRsZXMgdGhlIHNpZ24gY29ycmVjdGx5IGFuZCBubworLy8gb3ZlcmZsb3cgb2NjdXJzIHdoZW4gY29tcGFyaW5nIG51bWJlcnMgd2hvc2UgYWJzb2x1dGUgdmFsdWUgaXMgdmVyeQorLy8gc21hbGwuCitURVNUX0YoRmxvYXRUZXN0LCBBbG1vc3RaZXJvcykgeworICAvLyBJbiBDKytCdWlsZGVyLCBuYW1lcyB3aXRoaW4gbG9jYWwgY2xhc3NlcyAoc3VjaCBhcyB1c2VkIGJ5CisgIC8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFKSBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUKKyAgLy8gc2NvcGluZyBjbGFzcy4gIFVzZSBhIHN0YXRpYyBsb2NhbCBhbGlhcyBhcyBhIHdvcmthcm91bmQuCisgIC8vIFdlIHVzZSB0aGUgYXNzaWdubWVudCBzeW50YXggc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgU3VuIFN0dWRpbywKKyAgLy8gZG9uJ3QgYWxsb3cgaW5pdGlhbGl6aW5nIHJlZmVyZW5jZXMgdXNpbmcgY29uc3RydWN0aW9uIHN5bnRheAorICAvLyAocGFyZW50aGVzZXMpLgorICBzdGF0aWMgY29uc3QgRmxvYXRUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKKworICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCB2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8pOworICBFWFBFQ1RfRkxPQVRfRVEoLTAuMCwgdi5jbG9zZV90b19uZWdhdGl2ZV96ZXJvKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywgdi5jbG9zZV90b19uZWdhdGl2ZV96ZXJvKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRkxPQVRfRVEodi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvLAorICAgICAgICAgICAgICAgICAgICB2LmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvKTsKKyAgfSwgInYuZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm8iKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgY2xvc2UgdG8gZWFjaCBvdGhlci4KK1RFU1RfRihGbG9hdFRlc3QsIFNtYWxsRGlmZikgeworICBFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmNsb3NlX3RvX29uZSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSgxLjAsIHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgZmFyIGFwYXJ0LgorVEVTVF9GKEZsb2F0VGVzdCwgTGFyZ2VEaWZmKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSgyLjUsIDMuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIzLjAiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHdpdGggaW5maW5pdHkuCisvLworLy8gVGhpcyBlbnN1cmVzIHRoYXQgbm8gb3ZlcmZsb3cgb2NjdXJzIHdoZW4gY29tcGFyaW5nIG51bWJlcnMgd2hvc2UKKy8vIGFic29sdXRlIHZhbHVlIGlzIHZlcnkgbGFyZ2UuCitURVNUX0YoRmxvYXRUZXN0LCBJbmZpbml0eSkgeworICBFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5jbG9zZV90b19pbmZpbml0eSk7CisgIEVYUEVDVF9GTE9BVF9FUSgtdmFsdWVzXy5pbmZpbml0eSwgLXZhbHVlc18uY2xvc2VfdG9faW5maW5pdHkpOworI2lmICFHVEVTVF9PU19TWU1CSUFOCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgLXZhbHVlc18uaW5maW5pdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiLXZhbHVlc18uaW5maW5pdHkiKTsKKworICAvLyBUaGlzIGlzIGludGVyZXN0aW5nIGFzIHRoZSByZXByZXNlbnRhdGlvbnMgb2YgaW5maW5pdHkgYW5kIG5hbjEKKyAgLy8gYXJlIG9ubHkgMSBETFAgYXBhcnQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSh2YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLm5hbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzXy5uYW4xIik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOCit9CisKKy8vIFRlc3RzIHRoYXQgY29tcGFyaW5nIHdpdGggTkFOIGFsd2F5cyByZXR1cm5zIGZhbHNlLgorVEVTVF9GKEZsb2F0VGVzdCwgTmFOKSB7CisjaWYgIUdURVNUX09TX1NZTUJJQU4KKy8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorCisgIC8vIEluIEMrK0J1aWxkZXIsIG5hbWVzIHdpdGhpbiBsb2NhbCBjbGFzc2VzIChzdWNoIGFzIHVzZWQgYnkKKyAgLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUpIGNhbm5vdCBiZSByZXNvbHZlZCBhZ2FpbnN0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZQorICAvLyBzY29waW5nIGNsYXNzLiAgVXNlIGEgc3RhdGljIGxvY2FsIGFsaWFzIGFzIGEgd29ya2Fyb3VuZC4KKyAgLy8gV2UgdXNlIHRoZSBhc3NpZ25tZW50IHN5bnRheCBzaW5jZSBzb21lIGNvbXBpbGVycywgbGlrZSBTdW4gU3R1ZGlvLAorICAvLyBkb24ndCBhbGxvdyBpbml0aWFsaXppbmcgcmVmZXJlbmNlcyB1c2luZyBjb25zdHJ1Y3Rpb24gc3ludGF4CisgIC8vIChwYXJlbnRoZXNlcykuCisgIHN0YXRpYyBjb25zdCBGbG9hdFRlc3Q6OlRlc3RWYWx1ZXMmIHYgPSB0aGlzLT52YWx1ZXNfOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSh2Lm5hbjEsIHYubmFuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Lm5hbjEiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKHYubmFuMSwgdi5uYW4yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2Lm5hbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidi5uYW4xIik7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZMT0FUX0VRKHYubmFuMSwgdi5pbmZpbml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICJ2LmluZmluaXR5Iik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOCit9CisKKy8vIFRlc3RzIHRoYXQgKl9GTE9BVF9FUSBhcmUgcmVmbGV4aXZlLgorVEVTVF9GKEZsb2F0VGVzdCwgUmVmbGV4aXZlKSB7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjAsIDAuMCk7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjAsIDEuMCk7CisgIEFTU0VSVF9GTE9BVF9FUSh2YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLmluZmluaXR5KTsKK30KKworLy8gVGVzdHMgdGhhdCAqX0ZMT0FUX0VRIGFyZSBjb21tdXRhdGl2ZS4KK1RFU1RfRihGbG9hdFRlc3QsIENvbW11dGF0aXZlKSB7CisgIC8vIFdlIGFscmVhZHkgdGVzdGVkIEVYUEVDVF9GTE9BVF9FUSgxLjAsIHZhbHVlc18uY2xvc2VfdG9fb25lKS4KKyAgRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uY2xvc2VfdG9fb25lLCAxLjApOworCisgIC8vIFdlIGFscmVhZHkgdGVzdGVkIEVYUEVDVF9GTE9BVF9FUSgxLjAsIHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSkuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSh2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX05FQVIuCitURVNUX0YoRmxvYXRUZXN0LCBFWFBFQ1RfTkVBUikgeworICBFWFBFQ1RfTkVBUigtMS4wZiwgLTEuMWYsIDAuMmYpOworICBFWFBFQ1RfTkVBUigyLjBmLCAzLjBmLCAxLjBmKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FQVIoMS4wZiwxLjVmLCAwLjI1ZiksICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wZiBhbmQgMS41ZiBpcyAwLjUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIGV4Y2VlZHMgMC4yNWYiKTsKKyAgLy8gVG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDIuOTUuMCwgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubworICAvLyBzcGFjZSBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gdGhlIHByZXZpb3VzIGxpbmUuCit9CisKKy8vIFRlc3RzIEFTU0VSVF9ORUFSLgorVEVTVF9GKEZsb2F0VGVzdCwgQVNTRVJUX05FQVIpIHsKKyAgQVNTRVJUX05FQVIoLTEuMGYsIC0xLjFmLCAwLjJmKTsKKyAgQVNTRVJUX05FQVIoMi4wZiwgMy4wZiwgMS4wZik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ORUFSKDEuMGYsMS41ZiwgMC4yNWYpLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMGYgYW5kIDEuNWYgaXMgMC41LCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjVmIik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBsaW5lLgorfQorCisvLyBUZXN0cyB0aGUgY2FzZXMgd2hlcmUgRmxvYXRMRSgpIHNob3VsZCBzdWNjZWVkLgorVEVTVF9GKEZsb2F0VGVzdCwgRmxvYXRMRVN1Y2NlZWRzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgMS4wZiwgMi4wZik7ICAvLyBXaGVuIHZhbDEgPCB2YWwyLAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIDEuMGYsIDEuMGYpOyAgLy8gdmFsMSA9PSB2YWwyLAorCisgIC8vIG9yIHdoZW4gdmFsMSBpcyBncmVhdGVyIHRoYW4sIGJ1dCBhbG1vc3QgZXF1YWxzIHRvLCB2YWwyLgorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIHZhbHVlc18uY2xvc2VfdG9fcG9zaXRpdmVfemVybywgMC4wZik7Cit9CisKKy8vIFRlc3RzIHRoZSBjYXNlcyB3aGVyZSBGbG9hdExFKCkgc2hvdWxkIGZhaWwuCitURVNUX0YoRmxvYXRUZXN0LCBGbG9hdExFRmFpbHMpIHsKKyAgLy8gV2hlbiB2YWwxIGlzIGdyZWF0ZXIgdGhhbiB2YWwyIGJ5IGEgbGFyZ2UgbWFyZ2luLAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIDIuMGYsIDEuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIuMGYpIDw9ICgxLjBmKSIpOworCisgIC8vIG9yIGJ5IGEgc21hbGwgeWV0IG5vbi1uZWdsaWdpYmxlIG1hcmdpbiwKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUsIDEuMGYpOworICB9LCAiKHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSkgPD0gKDEuMGYpIik7CisKKyNpZiAhR1RFU1RfT1NfU1lNQklBTiAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICAvLyBDKytCdWlsZGVyIGdpdmVzIGJhZCByZXN1bHRzIGZvciBvcmRlcmVkIGNvbXBhcmlzb25zIGludm9sdmluZyBOYU5zCisgIC8vIGR1ZSB0byBjb21waWxlciBidWdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIHZhbHVlc18ubmFuMSwgdmFsdWVzXy5pbmZpbml0eSk7CisgIH0sICIodmFsdWVzXy5uYW4xKSA8PSAodmFsdWVzXy5pbmZpbml0eSkiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCAtdmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKTsKKyAgfSwgIigtdmFsdWVzXy5pbmZpbml0eSkgPD0gKHZhbHVlc18ubmFuMSkiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLm5hbjEsIHZhbHVlc18ubmFuMSk7CisgIH0sICIodmFsdWVzXy5uYW4xKSA8PSAodmFsdWVzXy5uYW4xKSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTiAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCit9CisKKy8vIEluc3RhbnRpYXRlcyBGbG9hdGluZ1BvaW50VGVzdCBmb3IgdGVzdGluZyAqX0RPVUJMRV9FUS4KK3R5cGVkZWYgRmxvYXRpbmdQb2ludFRlc3Q8ZG91YmxlPiBEb3VibGVUZXN0OworCisvLyBUZXN0cyB0aGF0IHRoZSBzaXplIG9mIERvdWJsZTo6Qml0cyBtYXRjaGVzIHRoZSBzaXplIG9mIGRvdWJsZS4KK1RFU1RfRihEb3VibGVUZXN0LCBTaXplKSB7CisgIFRlc3RTaXplKCk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB3aXRoICswIGFuZCAtMC4KK1RFU1RfRihEb3VibGVUZXN0LCBaZXJvcykgeworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgLTAuMCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoLTAuMCwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRE9VQkxFX0VRKDAuMCwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBjbG9zZSB0byAwLgorLy8KKy8vIFRoaXMgZW5zdXJlcyB0aGF0ICpfRE9VQkxFX0VRIGhhbmRsZXMgdGhlIHNpZ24gY29ycmVjdGx5IGFuZCBubworLy8gb3ZlcmZsb3cgb2NjdXJzIHdoZW4gY29tcGFyaW5nIG51bWJlcnMgd2hvc2UgYWJzb2x1dGUgdmFsdWUgaXMgdmVyeQorLy8gc21hbGwuCitURVNUX0YoRG91YmxlVGVzdCwgQWxtb3N0WmVyb3MpIHsKKyAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQorICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCisgIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgorICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCisgIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKKyAgLy8gKHBhcmVudGhlc2VzKS4KKyAgc3RhdGljIGNvbnN0IERvdWJsZVRlc3Q6OlRlc3RWYWx1ZXMmIHYgPSB0aGlzLT52YWx1ZXNfOworCisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCB2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8pOworICBFWFBFQ1RfRE9VQkxFX0VRKC0wLjAsIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7CisgIEVYUEVDVF9ET1VCTEVfRVEodi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvLCB2LmNsb3NlX3RvX25lZ2F0aXZlX3plcm8pOworCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9ET1VCTEVfRVEodi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvLAorICAgICAgICAgICAgICAgICAgICAgdi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyk7CisgIH0sICJ2LmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIGVhY2ggb3RoZXIuCitURVNUX0YoRG91YmxlVGVzdCwgU21hbGxEaWZmKSB7CisgIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCB2YWx1ZXNfLmNsb3NlX3RvX29uZSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGZhciBhcGFydC4KK1RFU1RfRihEb3VibGVUZXN0LCBMYXJnZURpZmYpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSgyLjAsIDMuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIzLjAiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHdpdGggaW5maW5pdHkuCisvLworLy8gVGhpcyBlbnN1cmVzIHRoYXQgbm8gb3ZlcmZsb3cgb2NjdXJzIHdoZW4gY29tcGFyaW5nIG51bWJlcnMgd2hvc2UKKy8vIGFic29sdXRlIHZhbHVlIGlzIHZlcnkgbGFyZ2UuCitURVNUX0YoRG91YmxlVGVzdCwgSW5maW5pdHkpIHsKKyAgRVhQRUNUX0RPVUJMRV9FUSh2YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgtdmFsdWVzXy5pbmZpbml0eSwgLXZhbHVlc18uY2xvc2VfdG9faW5maW5pdHkpOworI2lmICFHVEVTVF9PU19TWU1CSUFOCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmluZmluaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi12YWx1ZXNfLmluZmluaXR5Iik7CisKKyAgLy8gVGhpcyBpcyBpbnRlcmVzdGluZyBhcyB0aGUgcmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5XyBhbmQgbmFuMV8KKyAgLy8gYXJlIG9ubHkgMSBETFAgYXBhcnQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18ubmFuMSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0IGNvbXBhcmluZyB3aXRoIE5BTiBhbHdheXMgcmV0dXJucyBmYWxzZS4KK1RFU1RfRihEb3VibGVUZXN0LCBOYU4pIHsKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorICAvLyBJbiBDKytCdWlsZGVyLCBuYW1lcyB3aXRoaW4gbG9jYWwgY2xhc3NlcyAoc3VjaCBhcyB1c2VkIGJ5CisgIC8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFKSBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUKKyAgLy8gc2NvcGluZyBjbGFzcy4gIFVzZSBhIHN0YXRpYyBsb2NhbCBhbGlhcyBhcyBhIHdvcmthcm91bmQuCisgIC8vIFdlIHVzZSB0aGUgYXNzaWdubWVudCBzeW50YXggc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgU3VuIFN0dWRpbywKKyAgLy8gZG9uJ3QgYWxsb3cgaW5pdGlhbGl6aW5nIHJlZmVyZW5jZXMgdXNpbmcgY29uc3RydWN0aW9uIHN5bnRheAorICAvLyAocGFyZW50aGVzZXMpLgorICBzdGF0aWMgY29uc3QgRG91YmxlVGVzdDo6VGVzdFZhbHVlcyYgdiA9IHRoaXMtPnZhbHVlc187CisKKyAgLy8gTm9raWEncyBTVExwb3J0IGNyYXNoZXMgaWYgd2UgdHJ5IHRvIG91dHB1dCBpbmZpbml0eSBvciBOYU4uCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEodi5uYW4xLCB2Lm5hbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidi5uYW4xIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEodi5uYW4xLCB2Lm5hbjIpLCAidi5uYW4yIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoMS4wLCB2Lm5hbjEpLCAidi5uYW4xIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ET1VCTEVfRVEodi5uYW4xLCB2LmluZmluaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgInYuaW5maW5pdHkiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KK30KKworLy8gVGVzdHMgdGhhdCAqX0RPVUJMRV9FUSBhcmUgcmVmbGV4aXZlLgorVEVTVF9GKERvdWJsZVRlc3QsIFJlZmxleGl2ZSkgeworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgMC4wKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLjAsIDEuMCk7CisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyAgLy8gTm9raWEncyBTVExwb3J0IGNyYXNoZXMgaWYgd2UgdHJ5IHRvIG91dHB1dCBpbmZpbml0eSBvciBOYU4uCisgIEFTU0VSVF9ET1VCTEVfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5pbmZpbml0eSk7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOCit9CisKKy8vIFRlc3RzIHRoYXQgKl9ET1VCTEVfRVEgYXJlIGNvbW11dGF0aXZlLgorVEVTVF9GKERvdWJsZVRlc3QsIENvbW11dGF0aXZlKSB7CisgIC8vIFdlIGFscmVhZHkgdGVzdGVkIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCB2YWx1ZXNfLmNsb3NlX3RvX29uZSkuCisgIEVYUEVDVF9ET1VCTEVfRVEodmFsdWVzXy5jbG9zZV90b19vbmUsIDEuMCk7CisKKyAgLy8gV2UgYWxyZWFkeSB0ZXN0ZWQgRVhQRUNUX0RPVUJMRV9FUSgxLjAsIHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSkuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4wIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9ORUFSLgorVEVTVF9GKERvdWJsZVRlc3QsIEVYUEVDVF9ORUFSKSB7CisgIEVYUEVDVF9ORUFSKC0xLjAsIC0xLjEsIDAuMik7CisgIEVYUEVDVF9ORUFSKDIuMCwgMy4wLCAxLjApOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkVBUigxLjAsIDEuNSwgMC4yNSksICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wIGFuZCAxLjUgaXMgMC41LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjUiKTsKKyAgLy8gVG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDIuOTUuMCwgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubworICAvLyBzcGFjZSBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gdGhlIHByZXZpb3VzIHN0YXRlbWVudC4KK30KKworLy8gVGVzdHMgQVNTRVJUX05FQVIuCitURVNUX0YoRG91YmxlVGVzdCwgQVNTRVJUX05FQVIpIHsKKyAgQVNTRVJUX05FQVIoLTEuMCwgLTEuMSwgMC4yKTsKKyAgQVNTRVJUX05FQVIoMi4wLCAzLjAsIDEuMCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ORUFSKDEuMCwgMS41LCAwLjI1KSwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjAgYW5kIDEuNSBpcyAwLjUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIGV4Y2VlZHMgMC4yNSIpOworICAvLyBUbyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMi45NS4wLCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vCisgIC8vIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiB0aGUgcHJldmlvdXMgc3RhdGVtZW50LgorfQorCisvLyBUZXN0cyB0aGUgY2FzZXMgd2hlcmUgRG91YmxlTEUoKSBzaG91bGQgc3VjY2VlZC4KK1RFU1RfRihEb3VibGVUZXN0LCBEb3VibGVMRVN1Y2NlZWRzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIDEuMCwgMi4wKTsgIC8vIFdoZW4gdmFsMSA8IHZhbDIsCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIDEuMCwgMS4wKTsgIC8vIHZhbDEgPT0gdmFsMiwKKworICAvLyBvciB3aGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuLCBidXQgYWxtb3N0IGVxdWFscyB0bywgdmFsMi4KKyAgRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgdmFsdWVzXy5jbG9zZV90b19wb3NpdGl2ZV96ZXJvLCAwLjApOworfQorCisvLyBUZXN0cyB0aGUgY2FzZXMgd2hlcmUgRG91YmxlTEUoKSBzaG91bGQgZmFpbC4KK1RFU1RfRihEb3VibGVUZXN0LCBEb3VibGVMRUZhaWxzKSB7CisgIC8vIFdoZW4gdmFsMSBpcyBncmVhdGVyIHRoYW4gdmFsMiBieSBhIGxhcmdlIG1hcmdpbiwKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgMi4wLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIuMCkgPD0gKDEuMCkiKTsKKworICAvLyBvciBieSBhIHNtYWxsIHlldCBub24tbmVnbGlnaWJsZSBtYXJnaW4sCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSwgMS4wKTsKKyAgfSwgIih2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpIDw9ICgxLjApIik7CisKKyNpZiAhR1RFU1RfT1NfU1lNQklBTiAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICAvLyBDKytCdWlsZGVyIGdpdmVzIGJhZCByZXN1bHRzIGZvciBvcmRlcmVkIGNvbXBhcmlzb25zIGludm9sdmluZyBOYU5zCisgIC8vIGR1ZSB0byBjb21waWxlciBidWdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCB2YWx1ZXNfLm5hbjEsIHZhbHVlc18uaW5maW5pdHkpOworICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18uaW5maW5pdHkpIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIC12YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLm5hbjEpOworICB9LCAiICgtdmFsdWVzXy5pbmZpbml0eSkgPD0gKHZhbHVlc18ubmFuMSkiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihEb3VibGVMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLm5hbjEpOworICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18ubmFuMSkiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorfQorCisKKy8vIFZlcmlmaWVzIHRoYXQgYSB0ZXN0IG9yIHRlc3QgY2FzZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIERJU0FCTEVEXyBpcworLy8gbm90IHJ1bi4KKworLy8gQSB0ZXN0IHdob3NlIG5hbWUgc3RhcnRzIHdpdGggRElTQUJMRURfLgorLy8gU2hvdWxkIG5vdCBydW4uCitURVNUKERpc2FibGVkVGVzdCwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdGVzdCBzaG91bGQgbm90IGJlIHJ1bi4iOworfQorCisvLyBBIHRlc3Qgd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIERJU0FCTEVEXy4KKy8vIFNob3VsZCBydW4uCitURVNUKERpc2FibGVkVGVzdCwgTm90RElTQUJMRURfVGVzdFNob3VsZFJ1bikgeworICBFWFBFQ1RfRVEoMSwgMSk7Cit9CisKKy8vIEEgdGVzdCBjYXNlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggRElTQUJMRURfLgorLy8gU2hvdWxkIG5vdCBydW4uCitURVNUKERJU0FCTEVEX1Rlc3RDYXNlLCBUZXN0U2hvdWxkTm90UnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBUZXN0IGluIGRpc2FibGVkIHRlc3QgY2FzZSBzaG91bGQgbm90IGJlIHJ1bi4iOworfQorCisvLyBBIHRlc3QgY2FzZSBhbmQgdGVzdCB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIERJU0FCTEVEXy4KKy8vIFNob3VsZCBub3QgcnVuLgorVEVTVChESVNBQkxFRF9UZXN0Q2FzZSwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogVGVzdCBpbiBkaXNhYmxlZCB0ZXN0IGNhc2Ugc2hvdWxkIG5vdCBiZSBydW4uIjsKK30KKworLy8gQ2hlY2sgdGhhdCB3aGVuIGFsbCB0ZXN0cyBpbiBhIHRlc3QgY2FzZSBhcmUgZGlzYWJsZWQsIFNldHVwVGVzdENhc2UoKSBhbmQKKy8vIFRlYXJEb3duVGVzdENhc2UoKSBhcmUgbm90IGNhbGxlZC4KK2NsYXNzIERpc2FibGVkVGVzdHNUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogQWxsIHRlc3RzIGRpc2FibGVkIGluIHRlc3QgY2FzZS4gIgorICAgICAgICAgICAgICAiU2V0dXBUZXN0Q2FzZSgpIHNob3VsZCBub3QgYmUgY2FsbGVkLiI7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBBbGwgdGVzdHMgZGlzYWJsZWQgaW4gdGVzdCBjYXNlLiAiCisgICAgICAgICAgICAgICJUZWFyRG93blRlc3RDYXNlKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQuIjsKKyAgfQorfTsKKworVEVTVF9GKERpc2FibGVkVGVzdHNUZXN0LCBESVNBQkxFRF9UZXN0U2hvdWxkTm90UnVuXzEpIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4uIjsKK30KKworVEVTVF9GKERpc2FibGVkVGVzdHNUZXN0LCBESVNBQkxFRF9UZXN0U2hvdWxkTm90UnVuXzIpIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4uIjsKK30KKworLy8gVGVzdHMgdGhhdCBkaXNhYmxlZCB0eXBlZCB0ZXN0cyBhcmVuJ3QgcnVuLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGludCwgZG91YmxlPiBOdW1lcmljVHlwZXM7CitUWVBFRF9URVNUX0NBU0UoVHlwZWRUZXN0LCBOdW1lcmljVHlwZXMpOworCitUWVBFRF9URVNUKFR5cGVkVGVzdCwgRElTQUJMRURfU2hvdWxkTm90UnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0eXBlZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRElTQUJMRURfVHlwZWRUZXN0IDogcHVibGljIFRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFKERJU0FCTEVEX1R5cGVkVGVzdCwgTnVtZXJpY1R5cGVzKTsKKworVFlQRURfVEVTVChESVNBQkxFRF9UeXBlZFRlc3QsIFNob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdHlwZWQgdGVzdCBzaG91bGQgbm90IHJ1bi4iOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIFRlc3RzIHRoYXQgZGlzYWJsZWQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZW4ndCBydW4uCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0UCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFApOworCitUWVBFRF9URVNUX1AoVHlwZWRUZXN0UCwgRElTQUJMRURfU2hvdWxkTm90UnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiAiCisgICAgICAgICA8PCAiRGlzYWJsZWQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3Qgc2hvdWxkIG5vdCBydW4uIjsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UCwgRElTQUJMRURfU2hvdWxkTm90UnVuKTsKKworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIFR5cGVkVGVzdFAsIE51bWVyaWNUeXBlcyk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRElTQUJMRURfVHlwZWRUZXN0UCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKERJU0FCTEVEX1R5cGVkVGVzdFApOworCitUWVBFRF9URVNUX1AoRElTQUJMRURfVHlwZWRUZXN0UCwgU2hvdWxkTm90UnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiAiCisgICAgICAgICA8PCAiRGlzYWJsZWQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3Qgc2hvdWxkIG5vdCBydW4uIjsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRElTQUJMRURfVHlwZWRUZXN0UCwgU2hvdWxkTm90UnVuKTsKKworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIERJU0FCTEVEX1R5cGVkVGVzdFAsIE51bWVyaWNUeXBlcyk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBUZXN0cyB0aGF0IGFzc2VydGlvbiBtYWNyb3MgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzIGV4YWN0bHkgb25jZS4KKworY2xhc3MgU2luZ2xlRXZhbHVhdGlvblRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOiAgLy8gTXVzdCBiZSBwdWJsaWMgYW5kIG5vdCBwcm90ZWN0ZWQgZHVlIHRvIGEgYnVnIGluIGcrKyAzLjQuMi4KKyAgLy8gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgbmVlZGVkIGJ5IHRoZSBGYWlsZWRBU1NFUlRfU1RSRVEgdGVzdAorICAvLyBiZWxvdy4gIEl0J3MgcHVibGljIHRvIHdvcmsgYXJvdW5kIEMrK0J1aWxkZXIncyBidWcgd2l0aCBzY29waW5nIGxvY2FsCisgIC8vIGNsYXNzZXMuCisgIHN0YXRpYyB2b2lkIENvbXBhcmVBbmRJbmNyZW1lbnRDaGFyUHRycygpIHsKKyAgICBBU1NFUlRfU1RSRVEocDFfKyssIHAyXysrKTsKKyAgfQorCisgIC8vIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSB0aGUgRmFpbGVkQVNTRVJUX05FIHRlc3QgYmVsb3cuICBJdCdzCisgIC8vIHB1YmxpYyB0byB3b3JrIGFyb3VuZCBDKytCdWlsZGVyJ3MgYnVnIHdpdGggc2NvcGluZyBsb2NhbCBjbGFzc2VzLgorICBzdGF0aWMgdm9pZCBDb21wYXJlQW5kSW5jcmVtZW50SW50cygpIHsKKyAgICBBU1NFUlRfTkUoYV8rKywgYl8rKyk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgU2luZ2xlRXZhbHVhdGlvblRlc3QoKSB7CisgICAgcDFfID0gczFfOworICAgIHAyXyA9IHMyXzsKKyAgICBhXyA9IDA7CisgICAgYl8gPSAwOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHMxXzsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHMyXzsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHAxXzsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHAyXzsKKworICBzdGF0aWMgaW50IGFfOworICBzdGF0aWMgaW50IGJfOworfTsKKworY29uc3QgY2hhciogY29uc3QgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnMxXyA9ICIwMTIzNCI7Citjb25zdCBjaGFyKiBjb25zdCBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6czJfID0gImFiY2RlIjsKK2NvbnN0IGNoYXIqIFNpbmdsZUV2YWx1YXRpb25UZXN0OjpwMV87Citjb25zdCBjaGFyKiBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6cDJfOworaW50IFNpbmdsZUV2YWx1YXRpb25UZXN0OjphXzsKK2ludCBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6Yl87CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBBU1NFUlRfU1RSRVEgZmFpbHMsIGl0IGV2YWx1YXRlcyBpdHMgYXJndW1lbnRzCisvLyBleGFjdGx5IG9uY2UuCitURVNUX0YoU2luZ2xlRXZhbHVhdGlvblRlc3QsIEZhaWxlZEFTU0VSVF9TVFJFUSkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShTaW5nbGVFdmFsdWF0aW9uVGVzdDo6Q29tcGFyZUFuZEluY3JlbWVudENoYXJQdHJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICJwMl8rKyIpOworICBFWFBFQ1RfRVEoczFfICsgMSwgcDFfKTsKKyAgRVhQRUNUX0VRKHMyXyArIDEsIHAyXyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RyaW5nIGFzc2VydGlvbiBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuCitURVNUX0YoU2luZ2xlRXZhbHVhdGlvblRlc3QsIEFTU0VSVF9TVFIpIHsKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfU1RSTkUKKyAgRVhQRUNUX1NUUk5FKHAxXysrLCBwMl8rKyk7CisgIEVYUEVDVF9FUShzMV8gKyAxLCBwMV8pOworICBFWFBFQ1RfRVEoczJfICsgMSwgcDJfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX1NUUkNBU0VFUQorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSQ0FTRUVRKHAxXysrLCBwMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyBjYXNlIik7CisgIEVYUEVDVF9FUShzMV8gKyAyLCBwMV8pOworICBFWFBFQ1RfRVEoczJfICsgMiwgcDJfKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIEFTU0VSVF9ORSBmYWlscywgaXQgZXZhbHVhdGVzIGl0cyBhcmd1bWVudHMgZXhhY3RseQorLy8gb25jZS4KK1RFU1RfRihTaW5nbGVFdmFsdWF0aW9uVGVzdCwgRmFpbGVkQVNTRVJUX05FKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFNpbmdsZUV2YWx1YXRpb25UZXN0OjpDb21wYXJlQW5kSW5jcmVtZW50SW50cygpLAorICAgICAgICAgICAgICAgICAgICAgICAiKGFfKyspICE9IChiXysrKSIpOworICBFWFBFQ1RfRVEoMSwgYV8pOworICBFWFBFQ1RfRVEoMSwgYl8pOworfQorCisvLyBUZXN0cyB0aGF0IGFzc2VydGlvbiBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuCitURVNUX0YoU2luZ2xlRXZhbHVhdGlvblRlc3QsIE90aGVyQ2FzZXMpIHsKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfVFJVRQorICBFWFBFQ1RfVFJVRSgwID09IGFfKyspOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgxLCBhXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9UUlVFCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKC0xID09IGFfKyspLCAiLTEgPT0gYV8rKyIpOworICBFWFBFQ1RfRVEoMiwgYV8pOworCisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX0dUCisgIEVYUEVDVF9HVChhXysrLCBiXysrKTsKKyAgRVhQRUNUX0VRKDMsIGFfKTsKKyAgRVhQRUNUX0VRKDEsIGJfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX0xUCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVChhXysrLCBiXysrKSwgIihhXysrKSA8IChiXysrKSIpOworICBFWFBFQ1RfRVEoNCwgYV8pOworICBFWFBFQ1RfRVEoMiwgYl8pOworCisgIC8vIHN1Y2Nlc3NmdWwgQVNTRVJUX1RSVUUKKyAgQVNTRVJUX1RSVUUoMCA8IGFfKyspOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSg1LCBhXyk7CisKKyAgLy8gc3VjY2Vzc2Z1bCBBU1NFUlRfR1QKKyAgQVNTRVJUX0dUKGFfKyssIGJfKyspOworICBFWFBFQ1RfRVEoNiwgYV8pOworICBFWFBFQ1RfRVEoMywgYl8pOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKwordm9pZCBUaHJvd0FuSW50ZWdlcigpIHsKKyAgdGhyb3cgMTsKK30KKworLy8gVGVzdHMgdGhhdCBhc3NlcnRpb24gYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBFeGNlcHRpb25UZXN0cykgeworICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9USFJPVworICBFWFBFQ1RfVEhST1coeyAgLy8gTk9MSU5UCisgICAgYV8rKzsKKyAgICBUaHJvd0FuSW50ZWdlcigpOworICB9LCBpbnQpOworICBFWFBFQ1RfRVEoMSwgYV8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfVEhST1csIHRocm93cyBkaWZmZXJlbnQKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKHsgIC8vIE5PTElOVAorICAgIGFfKys7CisgICAgVGhyb3dBbkludGVnZXIoKTsKKyAgfSwgYm9vbCksICJ0aHJvd3MgYSBkaWZmZXJlbnQgdHlwZSIpOworICBFWFBFQ1RfRVEoMiwgYV8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfVEhST1csIHRocm93cyBub3RoaW5nCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyhhXysrLCBib29sKSwgInRocm93cyBub3RoaW5nIik7CisgIEVYUEVDVF9FUSgzLCBhXyk7CisKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfTk9fVEhST1cKKyAgRVhQRUNUX05PX1RIUk9XKGFfKyspOworICBFWFBFQ1RfRVEoNCwgYV8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfTk9fVEhST1cKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05PX1RIUk9XKHsgIC8vIE5PTElOVAorICAgIGFfKys7CisgICAgVGhyb3dBbkludGVnZXIoKTsKKyAgfSksICJpdCB0aHJvd3MiKTsKKyAgRVhQRUNUX0VRKDUsIGFfKTsKKworICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9BTllfVEhST1cKKyAgRVhQRUNUX0FOWV9USFJPVyh7ICAvLyBOT0xJTlQKKyAgICBhXysrOworICAgIFRocm93QW5JbnRlZ2VyKCk7CisgIH0pOworICBFWFBFQ1RfRVEoNiwgYV8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfQU5ZX1RIUk9XCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9BTllfVEhST1coYV8rKyksICJpdCBkb2Vzbid0Iik7CisgIEVYUEVDVF9FUSg3LCBhXyk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gVGVzdHMge0FTU0VSVHxFWFBFQ1R9X05PX0ZBVEFMX0ZBSUxVUkUuCitjbGFzcyBOb0ZhdGFsRmFpbHVyZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFN1Y2NlZWRzKCkge30KKyAgdm9pZCBGYWlsc05vbkZhdGFsKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgInNvbWUgbm9uLWZhdGFsIGZhaWx1cmUiOworICB9CisgIHZvaWQgRmFpbHMoKSB7CisgICAgRkFJTCgpIDw8ICJzb21lIGZhdGFsIGZhaWx1cmUiOworICB9CisKKyAgdm9pZCBEb0Fzc2VydE5vRmF0YWxGYWlsdXJlT25GYWlscygpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShGYWlscygpKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJzaG9sZCBub3QgcmVhY2ggaGVyZS4iOworICB9CisKKyAgdm9pZCBEb0V4cGVjdE5vRmF0YWxGYWlsdXJlT25GYWlscygpIHsKKyAgICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShGYWlscygpKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJvdGhlciBmYWlsdXJlIjsKKyAgfQorfTsKKworVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgTm9GYWlsdXJlKSB7CisgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKFN1Y2NlZWRzKCkpOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTdWNjZWVkcygpKTsKK30KKworVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgTm9uRmF0YWxJc05vRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEZhaWxzTm9uRmF0YWwoKSksCisgICAgICAic29tZSBub24tZmF0YWwgZmFpbHVyZSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEZhaWxzTm9uRmF0YWwoKSksCisgICAgICAic29tZSBub24tZmF0YWwgZmFpbHVyZSIpOworfQorCitURVNUX0YoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZU9uRmF0YWxGYWlsdXJlKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcigmZ3Rlc3RfZmFpbHVyZXMpOworICAgIERvQXNzZXJ0Tm9GYXRhbEZhaWx1cmVPbkZhaWxzKCk7CisgIH0KKyAgQVNTRVJUX0VRKDIsIGd0ZXN0X2ZhaWx1cmVzLnNpemUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLnR5cGUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLnR5cGUoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJzb21lIGZhdGFsIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJpdCBkb2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS5tZXNzYWdlKCkpOworfQorCitURVNUX0YoTm9GYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3ROb0ZhdGFsRmFpbHVyZU9uRmF0YWxGYWlsdXJlKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcigmZ3Rlc3RfZmFpbHVyZXMpOworICAgIERvRXhwZWN0Tm9GYXRhbEZhaWx1cmVPbkZhaWxzKCk7CisgIH0KKyAgQVNTRVJUX0VRKDMsIGd0ZXN0X2ZhaWx1cmVzLnNpemUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLnR5cGUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLnR5cGUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDIpLnR5cGUoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJzb21lIGZhdGFsIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJpdCBkb2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAib3RoZXIgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMikubWVzc2FnZSgpKTsKK30KKworVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgTWVzc2FnZUlzU3RyZWFtYWJsZSkgeworICBUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzOworICB7CisgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoJmd0ZXN0X2ZhaWx1cmVzKTsKKyAgICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgImZvbyIpIDw8ICJteSBtZXNzYWdlIjsKKyAgfQorICBBU1NFUlRfRVEoMiwgZ3Rlc3RfZmFpbHVyZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMCkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkudHlwZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgImZvbyIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIm15IG1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLm1lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIG5vbi1zdHJpbmcgYXNzZXJ0aW9ucy4KKworLy8gVGVzdHMgRXFGYWlsdXJlKCksIHVzZWQgZm9yIGltcGxlbWVudGluZyAqRVEqIGFzc2VydGlvbnMuCitURVNUKEFzc2VydGlvblRlc3QsIEVxRmFpbHVyZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBmb29fdmFsKCI1IiksIGJhcl92YWwoIjYiKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnMSgKKyAgICAgIEVxRmFpbHVyZSgiZm9vIiwgImJhciIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKQorICAgICAgLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiBiYXJcbiIKKyAgICAgICIgIEFjdHVhbDogNlxuIgorICAgICAgIkV4cGVjdGVkOiBmb29cbiIKKyAgICAgICJXaGljaCBpczogNSIsCisgICAgICBtc2cxLmNfc3RyKCkpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzIoCisgICAgICBFcUZhaWx1cmUoImZvbyIsICI2IiwgZm9vX3ZhbCwgYmFyX3ZhbCwgZmFsc2UpCisgICAgICAuZmFpbHVyZV9tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiVmFsdWUgb2Y6IDZcbiIKKyAgICAgICJFeHBlY3RlZDogZm9vXG4iCisgICAgICAiV2hpY2ggaXM6IDUiLAorICAgICAgbXNnMi5jX3N0cigpKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBtc2czKAorICAgICAgRXFGYWlsdXJlKCI1IiwgImJhciIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKQorICAgICAgLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiBiYXJcbiIKKyAgICAgICIgIEFjdHVhbDogNlxuIgorICAgICAgIkV4cGVjdGVkOiA1IiwKKyAgICAgIG1zZzMuY19zdHIoKSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnNCgKKyAgICAgIEVxRmFpbHVyZSgiNSIsICI2IiwgZm9vX3ZhbCwgYmFyX3ZhbCwgZmFsc2UpLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiA2XG4iCisgICAgICAiRXhwZWN0ZWQ6IDUiLAorICAgICAgbXNnNC5jX3N0cigpKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBtc2c1KAorICAgICAgRXFGYWlsdXJlKCJmb28iLCAiYmFyIiwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiXCJ4XCIiKSwgc3RkOjpzdHJpbmcoIlwieVwiIiksCisgICAgICAgICAgICAgICAgdHJ1ZSkuZmFpbHVyZV9tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiVmFsdWUgb2Y6IGJhclxuIgorICAgICAgIiAgQWN0dWFsOiBcInlcIlxuIgorICAgICAgIkV4cGVjdGVkOiBmb28gKGlnbm9yaW5nIGNhc2UpXG4iCisgICAgICAiV2hpY2ggaXM6IFwieFwiIiwKKyAgICAgIG1zZzUuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIEFwcGVuZFVzZXJNZXNzYWdlKCksIHVzZWQgZm9yIGltcGxlbWVudGluZyB0aGUgKkVRKiBtYWNyb3MuCitURVNUKEFzc2VydGlvblRlc3QsIEFwcGVuZFVzZXJNZXNzYWdlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZvbygiZm9vIik7CisKKyAgTWVzc2FnZSBtc2c7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiwKKyAgICAgICAgICAgICAgIEFwcGVuZFVzZXJNZXNzYWdlKGZvbywgbXNnKS5jX3N0cigpKTsKKworICBtc2cgPDwgImJhciI7CisgIEVYUEVDVF9TVFJFUSgiZm9vXG5iYXIiLAorICAgICAgICAgICAgICAgQXBwZW5kVXNlck1lc3NhZ2UoZm9vLCBtc2cpLmNfc3RyKCkpOworfQorCisjaWZkZWYgX19CT1JMQU5EQ19fCisvLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsICJVbnJlYWNoYWJsZSBjb2RlIgorIyBwcmFnbWEgb3B0aW9uIHB1c2ggLXctY2NjIC13LXJjaAorI2VuZGlmCisKKy8vIFRlc3RzIEFTU0VSVF9UUlVFLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfVFJVRSkgeworICBBU1NFUlRfVFJVRSgyID4gMSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoMiA8IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAiMiA8IDEiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1RSVUUocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgorVEVTVChBc3NlcnRpb25UZXN0LCBBc3NlcnRUcnVlV2l0aEFzc2VydGlvblJlc3VsdCkgeworICBBU1NFUlRfVFJVRShSZXN1bHRJc0V2ZW4oMikpOworI2lmbmRlZiBfX0JPUkxBTkRDX18KKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlci4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuKDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW4oMylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBmYWxzZSAoMyBpcyBvZGQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogdHJ1ZSIpOworI2VuZGlmCisgIEFTU0VSVF9UUlVFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMikpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0ZBTFNFLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfRkFMU0UpIHsKKyAgQVNTRVJUX0ZBTFNFKDIgPCAxKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoMiA+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIgPiAxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9GQUxTRShwcmVkaWNhdGUpIGZvciBwcmVkaWNhdGVzIHJldHVybmluZyBBc3NlcnRpb25SZXN1bHQuCitURVNUKEFzc2VydGlvblRlc3QsIEFzc2VydEZhbHNlV2l0aEFzc2VydGlvblJlc3VsdCkgeworICBBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuKDMpKTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShSZXN1bHRJc0V2ZW4oMikpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbigyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWUgKDIgaXMgZXZlbilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworI2VuZGlmCisgIEFTU0VSVF9GQUxTRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMikpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHJlc3NlZCB0aGVtCisjIHByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKworLy8gVGVzdHMgdXNpbmcgQVNTRVJUX0VRIG9uIGRvdWJsZSB2YWx1ZXMuICBUaGUgcHVycG9zZSBpcyB0byBtYWtlCisvLyBzdXJlIHRoYXQgdGhlIHNwZWNpYWxpemF0aW9uIHdlIGRpZCBmb3IgaW50ZWdlciBhbmQgYW5vbnltb3VzIGVudW1zCisvLyBpc24ndCB1c2VkIGZvciBkb3VibGUgYXJndW1lbnRzLgorVEVTVChFeHBlY3RUZXN0LCBBU1NFUlRfRVFfRG91YmxlKSB7CisgIC8vIEEgc3VjY2Vzcy4KKyAgQVNTRVJUX0VRKDUuNiwgNS42KTsKKworICAvLyBBIGZhaWx1cmUuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSg1LjEsIDUuMiksCisgICAgICAgICAgICAgICAgICAgICAgICI1LjEiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0VRLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfRVEpIHsKKyAgQVNTRVJUX0VRKDUsIDIgKyAzKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKDUsIDIqMyksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogMiozXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogNlxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDUiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0VRKE5VTEwsIHBvaW50ZXIpLgorI2lmIEdURVNUX0NBTl9DT01QQVJFX05VTEwKK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0VRX05VTEwpIHsKKyAgLy8gQSBzdWNjZXNzLgorICBjb25zdCBjaGFyKiBwID0gTlVMTDsKKyAgLy8gU29tZSBvbGRlciBHQ0MgdmVyc2lvbnMgbWF5IGlzc3VlIGEgc3B1cmlvdXMgd2FyaW5nIGluIHRoaXMgb3IgdGhlIG5leHQKKyAgLy8gYXNzZXJ0aW9uIHN0YXRlbWVudC4gVGhpcyB3YXJuaW5nIHNob3VsZCBub3QgYmUgc3VwcHJlc3NlZCB3aXRoCisgIC8vIHN0YXRpY19jYXN0IHNpbmNlIHRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBhYmlsaXR5IHRvIHVzZSBiYXJlIE5VTEwgYXMgdGhlCisgIC8vIGV4cGVjdGVkIHBhcmFtZXRlciB0byB0aGUgbWFjcm8uCisgIEFTU0VSVF9FUShOVUxMLCBwKTsKKworICAvLyBBIGZhaWx1cmUuCisgIHN0YXRpYyBpbnQgbiA9IDA7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShOVUxMLCAmbiksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogJm5cbiIpOworfQorI2VuZGlmICAvLyBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisKKy8vIFRlc3RzIEFTU0VSVF9FUSgwLCBub25fcG9pbnRlcikuICBTaW5jZSB0aGUgbGl0ZXJhbCAwIGNhbiBiZQorLy8gdHJlYXRlZCBhcyBhIG51bGwgcG9pbnRlciBieSB0aGUgY29tcGlsZXIsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IEFTU0VSVF9FUSgwLCBub25fcG9pbnRlcikgaXNuJ3QgaW50ZXJwcmV0ZWQgYnkgR29vZ2xlIFRlc3QgYXMKKy8vIEFTU0VSVF9FUShzdGF0aWNfY2FzdDx2b2lkKj4oTlVMTCksIG5vbl9wb2ludGVyKS4KK1RFU1QoRXhwZWN0VGVzdCwgQVNTRVJUX0VRXzApIHsKKyAgaW50IG4gPSAwOworCisgIC8vIEEgc3VjY2Vzcy4KKyAgQVNTRVJUX0VRKDAsIG4pOworCisgIC8vIEEgZmFpbHVyZS4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKDAsIDUuNiksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogMCIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfTkUuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9ORSkgeworICBBU1NFUlRfTkUoNiwgNyk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ORSgnYScsICdhJyksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKCdhJykgIT0gKCdhJyksICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFjdHVhbDogJ2EnICg5NywgMHg2MSkgdnMgJ2EnICg5NywgMHg2MSkiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0xFLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTEUpIHsKKyAgQVNTRVJUX0xFKDIsIDMpOworICBBU1NFUlRfTEUoMiwgMik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9MRSgyLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPD0gKDApLCBhY3R1YWw6IDIgdnMgMCIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfTFQuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9MVCkgeworICBBU1NFUlRfTFQoMiwgMyk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9MVCgyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPCAoMiksIGFjdHVhbDogMiB2cyAyIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9HRS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0dFKSB7CisgIEFTU0VSVF9HRSgyLCAxKTsKKyAgQVNTRVJUX0dFKDIsIDIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfR0UoMiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpID49ICgzKSwgYWN0dWFsOiAyIHZzIDMiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0dULgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfR1QpIHsKKyAgQVNTRVJUX0dUKDIsIDEpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfR1QoMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpID4gKDIpLCBhY3R1YWw6IDIgdnMgMiIpOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKwordm9pZCBUaHJvd05vdGhpbmcoKSB7fQorCisvLyBUZXN0cyBBU1NFUlRfVEhST1cuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9USFJPVykgeworICBBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgaW50KTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlciAyMDA3IGFuZCAyMDA5LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBib29sKSwKKyAgICAgICJFeHBlY3RlZDogVGhyb3dBbkludGVnZXIoKSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgYm9vbC5cbiIKKyAgICAgICIgIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50IHR5cGUuIik7CisjIGVuZGlmCisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfVEhST1coVGhyb3dOb3RoaW5nKCksIGJvb2wpLAorICAgICAgIkV4cGVjdGVkOiBUaHJvd05vdGhpbmcoKSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgYm9vbC5cbiIKKyAgICAgICIgIEFjdHVhbDogaXQgdGhyb3dzIG5vdGhpbmcuIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9OT19USFJPVy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX05PX1RIUk9XKSB7CisgIEFTU0VSVF9OT19USFJPVyhUaHJvd05vdGhpbmcoKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9OT19USFJPVyhUaHJvd0FuSW50ZWdlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBUaHJvd0FuSW50ZWdlcigpIGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uLiIKKyAgICAgICAgICAgICAgICAgICAgICAgIlxuICBBY3R1YWw6IGl0IHRocm93cy4iKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0FOWV9USFJPVy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0FOWV9USFJPVykgeworICBBU1NFUlRfQU5ZX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpLAorICAgICAgIkV4cGVjdGVkOiBUaHJvd05vdGhpbmcoKSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuIgorICAgICAgIiAgQWN0dWFsOiBpdCBkb2Vzbid0LiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIE1ha2VzIHN1cmUgd2UgZGVhbCB3aXRoIHRoZSBwcmVjZWRlbmNlIG9mIDw8LiAgVGhpcyB0ZXN0IHNob3VsZAorLy8gY29tcGlsZS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQXNzZXJ0UHJlY2VkZW5jZSkgeworICBBU1NFUlRfRVEoMSA8IDIsIHRydWUpOworICBib29sIGZhbHNlX3ZhbHVlID0gZmFsc2U7CisgIEFTU0VSVF9FUSh0cnVlICYmIGZhbHNlX3ZhbHVlLCBmYWxzZSk7Cit9CisKKy8vIEEgc3Vicm91dGluZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdC4KK3ZvaWQgVGVzdEVxMShpbnQgeCkgeworICBBU1NFUlRfRVEoMSwgeCk7Cit9CisKKy8vIFRlc3RzIGNhbGxpbmcgYSB0ZXN0IHN1YnJvdXRpbmUgdGhhdCdzIG5vdCBwYXJ0IG9mIGEgZml4dHVyZS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgTm9uRml4dHVyZVN1YnJvdXRpbmUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoVGVzdEVxMSgyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiB4Iik7Cit9CisKKy8vIEFuIHVuY29weWFibGUgY2xhc3MuCitjbGFzcyBVbmNvcHlhYmxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFVuY29weWFibGUoaW50IGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9CisKKyAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVbmNvcHlhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWUoKSA9PSByaHMudmFsdWUoKTsKKyAgfQorIHByaXZhdGU6CisgIC8vIFRoaXMgY29uc3RydWN0b3IgZGVsaWJlcmF0ZWx5IGhhcyBubyBpbXBsZW1lbnRhdGlvbiwgYXMgd2UgZG9uJ3QKKyAgLy8gd2FudCB0aGlzIGNsYXNzIHRvIGJlIGNvcHlhYmxlLgorICBVbmNvcHlhYmxlKGNvbnN0IFVuY29weWFibGUmKTsgIC8vIE5PTElOVAorCisgIGludCB2YWx1ZV87Cit9OworCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFVuY29weWFibGUmIHZhbHVlKSB7CisgIHJldHVybiBvcyA8PCB2YWx1ZS52YWx1ZSgpOworfQorCisKK2Jvb2wgSXNQb3NpdGl2ZVVuY29weWFibGUoY29uc3QgVW5jb3B5YWJsZSYgeCkgeworICByZXR1cm4geC52YWx1ZSgpID4gMDsKK30KKworLy8gQSBzdWJyb3V0aW5lIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0Lgordm9pZCBUZXN0QXNzZXJ0Tm9uUG9zaXRpdmUoKSB7CisgIFVuY29weWFibGUgeSgtMSk7CisgIEFTU0VSVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeSk7Cit9CisvLyBBIHN1YnJvdXRpbmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIHRlc3QuCit2b2lkIFRlc3RBc3NlcnRFcXVhbHNVbmNvcHlhYmxlKCkgeworICBVbmNvcHlhYmxlIHgoNSk7CisgIFVuY29weWFibGUgeSgtMSk7CisgIEFTU0VSVF9FUSh4LCB5KTsKK30KKworLy8gVGVzdHMgdGhhdCB1bmNvcHlhYmxlIG9iamVjdHMgY2FuIGJlIHVzZWQgaW4gYXNzZXJ0aW9ucy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQXNzZXJ0V29ya3NXaXRoVW5jb3B5YWJsZU9iamVjdCkgeworICBVbmNvcHlhYmxlIHgoNSk7CisgIEFTU0VSVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeCk7CisgIEFTU0VSVF9FUSh4LCB4KTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoVGVzdEFzc2VydE5vblBvc2l0aXZlKCksCisgICAgIklzUG9zaXRpdmVVbmNvcHlhYmxlKHkpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmVcbnkgZXZhbHVhdGVzIHRvIC0xIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFRlc3RBc3NlcnRFcXVhbHNVbmNvcHlhYmxlKCksCisgICAgIlZhbHVlIG9mOiB5XG4gIEFjdHVhbDogLTFcbkV4cGVjdGVkOiB4XG5XaGljaCBpczogNSIpOworfQorCisvLyBUZXN0cyB0aGF0IHVuY29weWFibGUgb2JqZWN0cyBjYW4gYmUgdXNlZCBpbiBleHBlY3RzLgorVEVTVChBc3NlcnRpb25UZXN0LCBFeHBlY3RXb3Jrc1dpdGhVbmNvcHlhYmxlT2JqZWN0KSB7CisgIFVuY29weWFibGUgeCg1KTsKKyAgRVhQRUNUX1BSRUQxKElzUG9zaXRpdmVVbmNvcHlhYmxlLCB4KTsKKyAgVW5jb3B5YWJsZSB5KC0xKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1BSRUQxKElzUG9zaXRpdmVVbmNvcHlhYmxlLCB5KSwKKyAgICAiSXNQb3NpdGl2ZVVuY29weWFibGUoeSkgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZVxueSBldmFsdWF0ZXMgdG8gLTEiKTsKKyAgRVhQRUNUX0VRKHgsIHgpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoeCwgeSksCisgICAgIlZhbHVlIG9mOiB5XG4gIEFjdHVhbDogLTFcbkV4cGVjdGVkOiB4XG5XaGljaCBpczogNSIpOworfQorCitlbnVtIE5hbWVkRW51bSB7CisgIGtFMSA9IDAsCisgIGtFMiA9IDEKK307CisKK1RFU1QoQXNzZXJ0aW9uVGVzdCwgTmFtZWRFbnVtKSB7CisgIEVYUEVDVF9FUShrRTEsIGtFMSk7CisgIEVYUEVDVF9MVChrRTEsIGtFMik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShrRTEsIGtFMiksICJXaGljaCBpczogMCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoa0UxLCBrRTIpLCAiQWN0dWFsOiAxIik7Cit9CisKKy8vIFRoZSB2ZXJzaW9uIG9mIGdjYyB1c2VkIGluIFhDb2RlIDIuMiBoYXMgYSBidWcgYW5kIGRvZXNuJ3QgYWxsb3cKKy8vIGFub255bW91cyBlbnVtcyBpbiBhc3NlcnRpb25zLiAgVGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgdGVzdCBpcyBub3QKKy8vIGRvbmUgb24gTWFjLgorLy8gU3VuIFN0dWRpbyBhbmQgSFAgYUNDIGFsc28gcmVqZWN0IHRoaXMgY29kZS4KKyNpZiAhR1RFU1RfT1NfTUFDICYmICFkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiAhZGVmaW5lZChfX0hQX2FDQykKKworLy8gVGVzdHMgdXNpbmcgYXNzZXJ0aW9ucyB3aXRoIGFub255bW91cyBlbnVtcy4KK2VudW0geworICBrQ2FzZUEgPSAtMSwKKworIyBpZiBHVEVTVF9PU19MSU5VWAorCisgIC8vIFdlIHdhbnQgdG8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgc2l6ZSBvZiB0aGUgYW5vbnltb3VzIGVudW0gaXMKKyAgLy8gbGFyZ2VyIHRoYW4gc2l6ZW9mKGludCksIHRvIG1ha2Ugc3VyZSBvdXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgIC8vIGFzc2VydGlvbnMgZG9lc24ndCB0cnVuY2F0ZSB0aGUgZW51bXMuICBIb3dldmVyLCBNU1ZDCisgIC8vIChpbmNvcnJlY3RseSkgZG9lc24ndCBhbGxvdyBhbiBlbnVtIHZhbHVlIHRvIGV4Y2VlZCB0aGUgcmFuZ2Ugb2YKKyAgLy8gYW4gaW50LCBzbyB0aGlzIGhhcyB0byBiZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkLgorICAvLworICAvLyBPbiBMaW51eCwga0Nhc2VCIGFuZCBrQ2FzZUEgaGF2ZSB0aGUgc2FtZSB2YWx1ZSB3aGVuIHRydW5jYXRlZCB0bworICAvLyBpbnQgc2l6ZS4gIFdlIHdhbnQgdG8gdGVzdCB3aGV0aGVyIHRoaXMgd2lsbCBjb25mdXNlIHRoZQorICAvLyBhc3NlcnRpb25zLgorICBrQ2FzZUIgPSB0ZXN0aW5nOjppbnRlcm5hbDo6a01heEJpZ2dlc3RJbnQsCisKKyMgZWxzZQorCisgIGtDYXNlQiA9IElOVF9NQVgsCisKKyMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyAga0Nhc2VDID0gNDIKK307CisKK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQW5vbnltb3VzRW51bSkgeworIyBpZiBHVEVTVF9PU19MSU5VWAorCisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGtDYXNlQSksIHN0YXRpY19jYXN0PGludD4oa0Nhc2VCKSk7CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyAgRVhQRUNUX0VRKGtDYXNlQSwga0Nhc2VBKTsKKyAgRVhQRUNUX05FKGtDYXNlQSwga0Nhc2VCKTsKKyAgRVhQRUNUX0xUKGtDYXNlQSwga0Nhc2VCKTsKKyAgRVhQRUNUX0xFKGtDYXNlQSwga0Nhc2VCKTsKKyAgRVhQRUNUX0dUKGtDYXNlQiwga0Nhc2VBKTsKKyAgRVhQRUNUX0dFKGtDYXNlQSwga0Nhc2VBKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dFKGtDYXNlQSwga0Nhc2VCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihrQ2FzZUEpID49IChrQ2FzZUIpIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HRShrQ2FzZUEsIGtDYXNlQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICItMSB2cyA0MiIpOworCisgIEFTU0VSVF9FUShrQ2FzZUEsIGtDYXNlQSk7CisgIEFTU0VSVF9ORShrQ2FzZUEsIGtDYXNlQik7CisgIEFTU0VSVF9MVChrQ2FzZUEsIGtDYXNlQik7CisgIEFTU0VSVF9MRShrQ2FzZUEsIGtDYXNlQik7CisgIEFTU0VSVF9HVChrQ2FzZUIsIGtDYXNlQSk7CisgIEFTU0VSVF9HRShrQ2FzZUEsIGtDYXNlQSk7CisKKyMgaWZuZGVmIF9fQk9STEFORENfXworCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShrQ2FzZUEsIGtDYXNlQiksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjoga0Nhc2VCIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShrQ2FzZUEsIGtDYXNlQyksCisgICAgICAgICAgICAgICAgICAgICAgICJBY3R1YWw6IDQyIik7CisjIGVuZGlmCisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKGtDYXNlQSwga0Nhc2VDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIldoaWNoIGlzOiAtMSIpOworfQorCisjZW5kaWYgIC8vICFHVEVTVF9PU19NQUMgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKK3N0YXRpYyBIUkVTVUxUIFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpIHsKKyAgcmV0dXJuIEVfVU5FWFBFQ1RFRDsKK30KKworc3RhdGljIEhSRVNVTFQgT2tIUkVTVUxUU3VjY2VzcygpIHsKKyAgcmV0dXJuIFNfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSB7CisgIHJldHVybiBTX0ZBTFNFOworfQorCisvLyBIUkVTVUxUIGFzc2VydGlvbiB0ZXN0cyB0ZXN0IGJvdGggemVybyBhbmQgbm9uLXplcm8KKy8vIHN1Y2Nlc3MgY29kZXMgYXMgd2VsbCBhcyBmYWlsdXJlIG1lc3NhZ2UgZm9yIGVhY2guCisvLworLy8gV2luZG93cyBDRSBkb2Vzbid0IHN1cHBvcnQgbWVzc2FnZSB0ZXh0cy4KK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRCkgeworICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoU19PSyk7CisgIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChTX0ZBTFNFKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoVW5leHBlY3RlZEhSRVNVTFRGYWlsdXJlKCkpLAorICAgICJFeHBlY3RlZDogKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSBzdWNjZWVkcy5cbiIKKyAgICAiICBBY3R1YWw6IDB4ODAwMEZGRkYiKTsKK30KKworVEVTVChIUkVTVUxUQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKSB7CisgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChTX09LKTsKKyAgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKFNfRkFMU0UpOworCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSksCisgICAgIkV4cGVjdGVkOiAoVW5leHBlY3RlZEhSRVNVTFRGYWlsdXJlKCkpIHN1Y2NlZWRzLlxuIgorICAgICIgIEFjdHVhbDogMHg4MDAwRkZGRiIpOworfQorCitURVNUKEhSRVNVTFRBc3NlcnRpb25UZXN0LCBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQpIHsKKyAgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKEVfVU5FWFBFQ1RFRCk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0hSRVNVTFRfRkFJTEVEKE9rSFJFU1VMVFN1Y2Nlc3MoKSksCisgICAgIkV4cGVjdGVkOiAoT2tIUkVTVUxUU3VjY2VzcygpKSBmYWlscy5cbiIKKyAgICAiICBBY3R1YWw6IDB4MCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoRmFsc2VIUkVTVUxUU3VjY2VzcygpKSwKKyAgICAiRXhwZWN0ZWQ6IChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpIGZhaWxzLlxuIgorICAgICIgIEFjdHVhbDogMHgxIik7Cit9CisKK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRCkgeworICBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoRV9VTkVYUEVDVEVEKTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlciAyMDA3IGFuZCAyMDA5LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfSFJFU1VMVF9GQUlMRUQoT2tIUkVTVUxUU3VjY2VzcygpKSwKKyAgICAiRXhwZWN0ZWQ6IChPa0hSRVNVTFRTdWNjZXNzKCkpIGZhaWxzLlxuIgorICAgICIgIEFjdHVhbDogMHgwIik7CisjIGVuZGlmCisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0hSRVNVTFRfRkFJTEVEKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSksCisgICAgIkV4cGVjdGVkOiAoRmFsc2VIUkVTVUxUU3VjY2VzcygpKSBmYWlscy5cbiIKKyAgICAiICBBY3R1YWw6IDB4MSIpOworfQorCisvLyBUZXN0cyB0aGF0IHN0cmVhbWluZyB0byB0aGUgSFJFU1VMVCBtYWNyb3Mgd29ya3MuCitURVNUKEhSRVNVTFRBc3NlcnRpb25UZXN0LCBTdHJlYW1pbmcpIHsKKyAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFNfT0spIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoU19PSykgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoRV9VTkVYUEVDVEVEKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChFX1VORVhQRUNURUQpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisKKyMgaWZuZGVmIF9fQk9STEFORENfXworCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIgMjAwNyBhbmQgMjAwOS4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoRV9VTkVYUEVDVEVEKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworIyBlbmRpZgorCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKFNfT0spIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoU19PSykgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwgIlVucmVhY2hhYmxlIGNvZGUiCisjIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MgLXctcmNoCisjZW5kaWYKKworLy8gVGVzdHMgdGhhdCB0aGUgYXNzZXJ0aW9uIG1hY3JvcyBiZWhhdmUgbGlrZSBzaW5nbGUgc3RhdGVtZW50cy4KK1RFU1QoQXNzZXJ0aW9uU3ludGF4VGVzdCwgQmFzaWNBc3NlcnRpb25zQmVoYXZlc0xpa2VTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSBleGVjdXRlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiSXQncyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seS4iOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0ZBTFNFKGZhbHNlKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEFTU0VSVF9MVCgxLCAzKTsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7ICAvLyBOT0xJTlQKKyAgZWxzZQorICAgIEVYUEVDVF9HVCgzLCAyKSA8PCAiIjsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisvLyBUZXN0cyB0aGF0IHRoZSBjb21waWxlciB3aWxsIG5vdCBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBjb2RlIGluIHRoZQorLy8gRVhQRUNUX1RIUk9XL0VYUEVDVF9BTllfVEhST1cvRVhQRUNUX05PX1RIUk9XIG1hY3Jvcy4KK1RFU1QoRXhwZWN0VGhyb3dUZXN0LCBEb2VzTm90R2VuZXJhdGVVbnJlYWNoYWJsZUNvZGVXYXJuaW5nKSB7CisgIGludCBuID0gMDsKKworICBFWFBFQ1RfVEhST1codGhyb3cgMSwgaW50KTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKG4rKywgaW50KSwgIiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1codGhyb3cgMSwgY29uc3QgY2hhciopLCAiIik7CisgIEVYUEVDVF9OT19USFJPVyhuKyspOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTk9fVEhST1codGhyb3cgMSksICIiKTsKKyAgRVhQRUNUX0FOWV9USFJPVyh0aHJvdyAxKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0FOWV9USFJPVyhuKyspLCAiIik7Cit9CisKK1RFU1QoQXNzZXJ0aW9uU3ludGF4VGVzdCwgRXhjZXB0aW9uQXNzZXJ0aW9uc0JlaGF2ZXNMaWtlU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9USFJPVyhUaHJvd05vdGhpbmcoKSwgYm9vbCk7CisKKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBFWFBFQ1RfVEhST1coVGhyb3dBbkludGVnZXIoKSwgaW50KTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9OT19USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEVYUEVDVF9OT19USFJPVyhUaHJvd05vdGhpbmcoKSk7CisgIGVsc2UKKyAgICA7ICAvLyBOT0xJTlQKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBFWFBFQ1RfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKTsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEVYUEVDVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSk7CisgIGVsc2UKKyAgICA7ICAvLyBOT0xJTlQKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBOb0ZhdGFsRmFpbHVyZUFzc2VydGlvbnNCZWhhdmVzTGlrZVNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShGQUlMKCkpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSBleGVjdXRlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkl0J3MgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkuIjsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEZBSUwoKSkgPDwgIiI7CisgIGVsc2UKKyAgICA7ICAvLyBOT0xJTlQKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSk7CisgIGVsc2UKKyAgICA7ICAvLyBOT0xJTlQKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7ICAvLyBOT0xJTlQKKyAgZWxzZQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGFzc2VydGlvbiBtYWNyb3Mgd29yayB3ZWxsIHdpdGggc3dpdGNoIHN0YXRlbWVudHMuCitURVNUKEFzc2VydGlvblN5bnRheFRlc3QsIFdvcmtzV2l0aFN3aXRjaCkgeworICBzd2l0Y2ggKDApIHsKKyAgICBjYXNlIDE6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUX1RSVUUodHJ1ZSk7CisgIH0KKworICBzd2l0Y2ggKDApCisgICAgY2FzZSAwOgorICAgICAgRVhQRUNUX0ZBTFNFKGZhbHNlKSA8PCAiRVhQRUNUX0ZBTFNFIGZhaWxlZCBpbiBzd2l0Y2ggY2FzZSI7CisKKyAgLy8gQmluYXJ5IGFzc2VydGlvbnMgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgZGlmZmVyZW50IGNvZGUgcGF0aAorICAvLyB0aGFuIHRoZSBCb29sZWFuIGFzc2VydGlvbnMuICBIZW5jZSB3ZSB0ZXN0IHRoZW0gc2VwYXJhdGVseS4KKyAgc3dpdGNoICgwKSB7CisgICAgY2FzZSAxOgorICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlRfRVEoMSwgMSkgPDwgIkFTU0VSVF9FUSBmYWlsZWQgaW4gZGVmYXVsdCBzd2l0Y2ggaGFuZGxlciI7CisgIH0KKworICBzd2l0Y2ggKDApCisgICAgY2FzZSAwOgorICAgICAgRVhQRUNUX05FKDEsIDIpOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKwordm9pZCBUaHJvd0FTdHJpbmcoKSB7CisgICAgdGhyb3cgInN0ZDo6c3RyaW5nIjsKK30KKworLy8gVGVzdCB0aGF0IHRoZSBleGNlcHRpb24gYXNzZXJ0aW9uIG1hY3JvcyBjb21waWxlIGFuZCB3b3JrIHdpdGggY29uc3QKKy8vIHR5cGUgcXVhbGlmaWVyLgorVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBXb3Jrc1dpdGhDb25zdCkgeworICAgIEFTU0VSVF9USFJPVyhUaHJvd0FTdHJpbmcoKSwgY29uc3QgY2hhciopOworCisgICAgRVhQRUNUX1RIUk9XKFRocm93QVN0cmluZygpLCBjb25zdCBjaGFyKik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCB0cmFja3MgU1VDQ0VFRCouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBTVUNDRUVEKSB7CisgIFNVQ0NFRUQoKTsKKyAgU1VDQ0VFRCgpIDw8ICJPSyI7CisgIEVYUEVDVF9FUSgyLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJhY2sgc3VjY2Vzc2Z1bCBFWFBFQ1RfKi4KK1RFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIEVYUEVDVCkgeworICBFWFBFQ1RfVFJVRSh0cnVlKTsKKyAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cmFjayBzdWNjZXNzZnVsIEVYUEVDVF9TVFIqLgorVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgRVhQRUNUX1NUUikgeworICBFWFBFQ1RfU1RSRVEoIiIsICIiKTsKKyAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cmFjayBzdWNjZXNzZnVsIEFTU0VSVF8qLgorVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgQVNTRVJUKSB7CisgIEFTU0VSVF9UUlVFKHRydWUpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3NmdWwgQVNTRVJUX1NUUiouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSKSB7CisgIEFTU0VSVF9TVFJFUSgiIiwgIiIpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworbmFtZXNwYWNlIHsKKworLy8gVGVzdHMgdGhlIG1lc3NhZ2Ugc3RyZWFtaW5nIHZhcmlhdGlvbiBvZiBhc3NlcnRpb25zLgorCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgRVhQRUNUKSB7CisgIEVYUEVDVF9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUoMSwgMSkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUgIzEiKTsKKyAgRVhQRUNUX0xFKDEsIDIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVCgxLCAwKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjMi4iKTsKKyAgRVhQRUNUX0dFKDEsIDApIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCgxLCAyKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjMy4iKTsKKworICBFWFBFQ1RfU1RSRVEoIjEiLCAiMSIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORSgiMSIsICIxIikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUgIzQuIik7CisgIEVYUEVDVF9TVFJDQVNFRVEoImEiLCAiQSIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJDQVNFTkUoImEiLCAiQSIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICM1LiIpOworCisgIEVYUEVDVF9GTE9BVF9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDEsIDEuMikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzYuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUgIzYuIik7CisgIEVYUEVDVF9ORUFSKDEsIDEuMSwgMC4yKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworfQorCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgQVNTRVJUKSB7CisgIEFTU0VSVF9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBBU1NFUlRfTkUoMSwgMikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX0xFKDEsIDIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9MVCgxLCAyKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBBU1NFUlRfR0UoMSwgMCkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dUKDEsIDIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlLiIpOworfQorCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgQVNTRVJUX1NUUikgeworICBBU1NFUlRfU1RSRVEoIjEiLCAiMSIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9TVFJORSgiMSIsICIyIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX1NUUkNBU0VFUSgiYSIsICJBIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkNBU0VORSgiYSIsICJBIikgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUuIik7Cit9CisKK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlRfRkxPQVRJTkcpIHsKKyAgQVNTRVJUX0ZMT0FUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9ET1VCTEVfRVEoMSwgMSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX05FQVIoMSwxLjIsIDAuMSkgPDwgIkV4cGVjdCBmYWlsdXJlLiIsICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdCBmYWlsdXJlLiIpOworICAvLyBUbyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMi45NS4wLCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vCisgIC8vIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiB0aGUgcHJldmlvdXMgc3RhdGVtZW50LgorfQorCisvLyBUZXN0cyB1c2luZyBBU1NFUlRfRkFMU0Ugd2l0aCBhIHN0cmVhbWVkIG1lc3NhZ2UuCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgQVNTRVJUX0ZBTFNFKSB7CisgIEFTU0VSVF9GQUxTRShmYWxzZSkgPDwgIlRoaXMgc2hvdWxkbid0IGZhaWwuIjsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0ZBTFNFKHRydWUpIDw8ICJFeHBlY3RlZCBmYWlsdXJlOiAiIDw8IDIgPDwgIiA+ICIgPDwgMQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHRydWU7CisgIH0sICJFeHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEZBSUwgd2l0aCBhIHN0cmVhbWVkIG1lc3NhZ2UuCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgRkFJTCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIjAiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgU1VDQ0VFRCB3aXRoIGEgc3RyZWFtZWQgbWVzc2FnZS4KK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBTVUNDRUVEKSB7CisgIFNVQ0NFRUQoKSA8PCAiU3VjY2VzcyA9PSAiIDw8IDE7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEFTU0VSVF9UUlVFIHdpdGggYSBzdHJlYW1lZCBtZXNzYWdlLgorVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEFTU0VSVF9UUlVFKSB7CisgIEFTU0VSVF9UUlVFKHRydWUpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9UUlVFKHRydWUpIDw8IHRydWU7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGNoYXIgKj4oTlVMTCk7CisgIH0sICIobnVsbCkobnVsbCkiKTsKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHVzaW5nIHdpZGUgc3RyaW5ncyBpbiBhc3NlcnRpb24gbWVzc2FnZXMuCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgV2lkZVN0cmluZ01lc3NhZ2UpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1RSVUUoZmFsc2UpIDw8IEwiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLlx4ODExOSI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9FUSgxLCAyKSA8PCAiVGhpcyBmYWlsdXJlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgTCJleHBlY3RlZCB0b28uXHg4MTIwIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCB0b28uIik7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgRVhQRUNUX1RSVUUuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9UUlVFKSB7CisgIEVYUEVDVF9UUlVFKHRydWUpIDw8ICJJbnRlbnRpb25hbCBzdWNjZXNzIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoZmFsc2UpIDw8ICJJbnRlbnRpb25hbCBmYWlsdXJlICMxLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlbnRpb25hbCBmYWlsdXJlICMxLiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShmYWxzZSkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUgIzIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUgIzIuIik7CisgIEVYUEVDVF9UUlVFKDIgPiAxKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRSgyIDwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogMiA8IDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBmYWxzZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoMiA+IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMiA+IDMiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX1RSVUUocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgorVEVTVChFeHBlY3RUZXN0LCBFeHBlY3RUcnVlV2l0aEFzc2VydGlvblJlc3VsdCkgeworICBFWFBFQ1RfVFJVRShSZXN1bHRJc0V2ZW4oMikpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShSZXN1bHRJc0V2ZW4oMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbigzKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlICgzIGlzIG9kZClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7CisgIEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMikpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0ZBTFNFIHdpdGggYSBzdHJlYW1lZCBtZXNzYWdlLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRkFMU0UpIHsKKyAgRVhQRUNUX0ZBTFNFKDIgPCAxKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRkFMU0UoZmFsc2UpIDw8ICJJbnRlbnRpb25hbCBzdWNjZXNzIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKHRydWUpIDw8ICJJbnRlbnRpb25hbCBmYWlsdXJlICMxLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlbnRpb25hbCBmYWlsdXJlICMxLiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UodHJ1ZSkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUgIzIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUgIzIuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSgyID4gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogMiA+IDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKDIgPCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjIgPCAzIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9GQUxTRShwcmVkaWNhdGUpIGZvciBwcmVkaWNhdGVzIHJldHVybmluZyBBc3NlcnRpb25SZXN1bHQuCitURVNUKEV4cGVjdFRlc3QsIEV4cGVjdEZhbHNlV2l0aEFzc2VydGlvblJlc3VsdCkgeworICBFWFBFQ1RfRkFMU0UoUmVzdWx0SXNFdmVuKDMpKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKFJlc3VsdElzRXZlbigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuKDIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZSAoMiBpcyBldmVuKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7CisgIEVYUEVDVF9GQUxTRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDMpKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHJlc3NlZCB0aGVtCisjIHByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKworLy8gVGVzdHMgRVhQRUNUX0VRLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRVEpIHsKKyAgRVhQRUNUX0VRKDUsIDIgKyAzKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDUsIDIqMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogMiozXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogNlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDUiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDUsIDIgLSAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjIgLSAzIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEVYUEVDVF9FUSBvbiBkb3VibGUgdmFsdWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gbWFrZQorLy8gc3VyZSB0aGF0IHRoZSBzcGVjaWFsaXphdGlvbiB3ZSBkaWQgZm9yIGludGVnZXIgYW5kIGFub255bW91cyBlbnVtcworLy8gaXNuJ3QgdXNlZCBmb3IgZG91YmxlIGFyZ3VtZW50cy4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0VRX0RvdWJsZSkgeworICAvLyBBIHN1Y2Nlc3MuCisgIEVYUEVDVF9FUSg1LjYsIDUuNik7CisKKyAgLy8gQSBmYWlsdXJlLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoNS4xLCA1LjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiNS4xIik7Cit9CisKKyNpZiBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisvLyBUZXN0cyBFWFBFQ1RfRVEoTlVMTCwgcG9pbnRlcikuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9FUV9OVUxMKSB7CisgIC8vIEEgc3VjY2Vzcy4KKyAgY29uc3QgY2hhciogcCA9IE5VTEw7CisgIC8vIFNvbWUgb2xkZXIgR0NDIHZlcnNpb25zIG1heSBpc3N1ZSBhIHNwdXJpb3VzIHdhcm5pbmcgaW4gdGhpcyBvciB0aGUgbmV4dAorICAvLyBhc3NlcnRpb24gc3RhdGVtZW50LiBUaGlzIHdhcm5pbmcgc2hvdWxkIG5vdCBiZSBzdXBwcmVzc2VkIHdpdGgKKyAgLy8gc3RhdGljX2Nhc3Qgc2luY2UgdGhlIHRlc3QgdmVyaWZpZXMgdGhlIGFiaWxpdHkgdG8gdXNlIGJhcmUgTlVMTCBhcyB0aGUKKyAgLy8gZXhwZWN0ZWQgcGFyYW1ldGVyIHRvIHRoZSBtYWNyby4KKyAgRVhQRUNUX0VRKE5VTEwsIHApOworCisgIC8vIEEgZmFpbHVyZS4KKyAgaW50IG4gPSAwOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoTlVMTCwgJm4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6ICZuXG4iKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorCisvLyBUZXN0cyBFWFBFQ1RfRVEoMCwgbm9uX3BvaW50ZXIpLiAgU2luY2UgdGhlIGxpdGVyYWwgMCBjYW4gYmUKKy8vIHRyZWF0ZWQgYXMgYSBudWxsIHBvaW50ZXIgYnkgdGhlIGNvbXBpbGVyLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCBFWFBFQ1RfRVEoMCwgbm9uX3BvaW50ZXIpIGlzbid0IGludGVycHJldGVkIGJ5IEdvb2dsZSBUZXN0IGFzCisvLyBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dm9pZCo+KE5VTEwpLCBub25fcG9pbnRlcikuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9FUV8wKSB7CisgIGludCBuID0gMDsKKworICAvLyBBIHN1Y2Nlc3MuCisgIEVYUEVDVF9FUSgwLCBuKTsKKworICAvLyBBIGZhaWx1cmUuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgwLCA1LjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDAiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX05FLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfTkUpIHsKKyAgRVhQRUNUX05FKDYsIDcpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORSgnYScsICdhJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKCdhJykgIT0gKCdhJyksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdHVhbDogJ2EnICg5NywgMHg2MSkgdnMgJ2EnICg5NywgMHg2MSkiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKDIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMiIpOworICBjaGFyKiBjb25zdCBwMCA9IE5VTEw7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORShwMCwgcDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicDAiKTsKKyAgLy8gT25seSB3YXkgdG8gZ2V0IHRoZSBOb2tpYSBjb21waWxlciB0byBjb21waWxlIHRoZSBjYXN0CisgIC8vIGlzIHRvIGhhdmUgYSBzZXBhcmF0ZSB2b2lkKiB2YXJpYWJsZSBmaXJzdC4gUHV0dGluZworICAvLyB0aGUgdHdvIGNhc3RzIG9uIHRoZSBzYW1lIGxpbmUgZG9lc24ndCB3b3JrLCBuZWl0aGVyIGRvZXMKKyAgLy8gYSBkaXJlY3QgQy1zdHlsZSB0byBjaGFyKi4KKyAgdm9pZCogcHYxID0gKHZvaWQqKTB4MTIzNDsgIC8vIE5PTElOVAorICBjaGFyKiBjb25zdCBwMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHB2MSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORShwMSwgcDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicDEiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0xFLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfTEUpIHsKKyAgRVhQRUNUX0xFKDIsIDMpOworICBFWFBFQ1RfTEUoMiwgMik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MRSgyLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPD0gKDApLCBhY3R1YWw6IDIgdnMgMCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTEUoMS4xLCAwLjkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKDEuMSkgPD0gKDAuOSkiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0xULgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfTFQpIHsKKyAgRVhQRUNUX0xUKDIsIDMpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDwgKDIpLCBhY3R1YWw6IDIgdnMgMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoMiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMikgPCAoMSkiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0dFLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfR0UpIHsKKyAgRVhQRUNUX0dFKDIsIDEpOworICBFWFBFQ1RfR0UoMiwgMik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HRSgyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPj0gKDMpLCBhY3R1YWw6IDIgdnMgMyIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR0UoMC45LCAxLjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKDAuOSkgPj0gKDEuMSkiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0dULgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfR1QpIHsKKyAgRVhQRUNUX0dUKDIsIDEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR1QoMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpID4gKDIpLCBhY3R1YWw6IDIgdnMgMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR1QoMiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMikgPiAoMykiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIEVYUEVDVF9USFJPVy4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX1RIUk9XKSB7CisgIEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogVGhyb3dBbkludGVnZXIoKSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgYm9vbC5cbiAgQWN0dWFsOiBpdCB0aHJvd3MgYSBkaWZmZXJlbnQgdHlwZS4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfVEhST1coVGhyb3dOb3RoaW5nKCksIGJvb2wpLAorICAgICAgIkV4cGVjdGVkOiBUaHJvd05vdGhpbmcoKSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgYm9vbC5cbiIKKyAgICAgICIgIEFjdHVhbDogaXQgdGhyb3dzIG5vdGhpbmcuIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9OT19USFJPVy4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX05PX1RIUk9XKSB7CisgIEVYUEVDVF9OT19USFJPVyhUaHJvd05vdGhpbmcoKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyhUaHJvd0FuSW50ZWdlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBUaHJvd0FuSW50ZWdlcigpIGRvZXNuJ3QgdGhyb3cgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uLlxuICBBY3R1YWw6IGl0IHRocm93cy4iKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0FOWV9USFJPVy4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0FOWV9USFJPVykgeworICBFWFBFQ1RfQU5ZX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpLAorICAgICAgIkV4cGVjdGVkOiBUaHJvd05vdGhpbmcoKSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuIgorICAgICAgIiAgQWN0dWFsOiBpdCBkb2Vzbid0LiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIE1ha2Ugc3VyZSB3ZSBkZWFsIHdpdGggdGhlIHByZWNlZGVuY2Ugb2YgPDwuCitURVNUKEV4cGVjdFRlc3QsIEV4cGVjdFByZWNlZGVuY2UpIHsKKyAgRVhQRUNUX0VRKDEgPCAyLCB0cnVlKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHRydWUsIHRydWUgJiYgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IHRydWUgJiYgZmFsc2UiKTsKK30KKworCisvLyBUZXN0cyB0aGUgU3RyZWFtYWJsZVRvU3RyaW5nKCkgZnVuY3Rpb24uCisKKy8vIFRlc3RzIHVzaW5nIFN0cmVhbWFibGVUb1N0cmluZygpIG9uIGEgc2NhbGFyLgorVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBTY2FsYXIpIHsKKyAgRVhQRUNUX1NUUkVRKCI1IiwgU3RyZWFtYWJsZVRvU3RyaW5nKDUpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIG5vbi1jaGFyIHBvaW50ZXIuCitURVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIFBvaW50ZXIpIHsKKyAgaW50IG4gPSAwOworICBpbnQqIHAgPSAmbjsKKyAgRVhQRUNUX1NUUk5FKCIobnVsbCkiLCBTdHJlYW1hYmxlVG9TdHJpbmcocCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFN0cmVhbWFibGVUb1N0cmluZygpIG9uIGEgTlVMTCBub24tY2hhciBwb2ludGVyLgorVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBOdWxsUG9pbnRlcikgeworICBpbnQqIHAgPSBOVUxMOworICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsIFN0cmVhbWFibGVUb1N0cmluZyhwKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBDIHN0cmluZy4KK1RFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgQ1N0cmluZykgeworICBFWFBFQ1RfU1RSRVEoIkZvbyIsIFN0cmVhbWFibGVUb1N0cmluZygiRm9vIikuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFN0cmVhbWFibGVUb1N0cmluZygpIG9uIGEgTlVMTCBDIHN0cmluZy4KK1RFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgTnVsbENTdHJpbmcpIHsKKyAgY2hhciogcCA9IE5VTEw7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwgU3RyZWFtYWJsZVRvU3RyaW5nKHApLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB1c2luZyBzdHJlYW1hYmxlIHZhbHVlcyBhcyBhc3NlcnRpb24gbWVzc2FnZXMuCisKKy8vIFRlc3RzIHVzaW5nIHN0ZDo6c3RyaW5nIGFzIGFuIGFzc2VydGlvbiBtZXNzYWdlLgorVEVTVChTdHJlYW1hYmxlVGVzdCwgc3RyaW5nKSB7CisgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBzdHIoCisgICAgICAiVGhpcyBmYWlsdXJlIG1lc3NhZ2UgaXMgYSBzdGQ6OnN0cmluZywgYW5kIGlzIGV4cGVjdGVkLiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBzdHIuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIG91dHB1dCBzdHJpbmdzIGNvbnRhaW5pbmcgZW1iZWRkZWQgTlVMcy4KKy8vIExpbWl0ZWQgdG8gTGludXggYmVjYXVzZSB3ZSBjYW4gb25seSBkbyB0aGlzIHdpdGggc3RkOjpzdHJpbmcncy4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIHN0cmluZ1dpdGhFbWJlZGRlZE5VTCkgeworICBzdGF0aWMgY29uc3QgY2hhciBjaGFyX2FycmF5X3dpdGhfbnVsW10gPQorICAgICAgIkhlcmUncyBhIE5VTFwwIGFuZCBzb21lIG1vcmUgc3RyaW5nIjsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ193aXRoX251bChjaGFyX2FycmF5X3dpdGhfbnVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyX2FycmF5X3dpdGhfbnVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSk7ICAvLyBkcm9wcyB0aGUgdHJhaWxpbmcgTlVMCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCBzdHJpbmdfd2l0aF9udWwsCisgICAgICAgICAgICAgICAgICAgICAgICJIZXJlJ3MgYSBOVUxcXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gb3V0cHV0IGEgTlVMIGNoYXIuCitURVNUKFN0cmVhbWFibGVUZXN0LCBOVUxDaGFyKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEZBSUwoKSA8PCAiQSBOVUwiIDw8ICdcMCcgPDwgIiBhbmQgc29tZSBtb3JlIHN0cmluZyI7CisgIH0sICJBIE5VTFxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyIpOworfQorCisvLyBUZXN0cyB1c2luZyBpbnQgYXMgYW4gYXNzZXJ0aW9uIG1lc3NhZ2UuCitURVNUKFN0cmVhbWFibGVUZXN0LCBpbnQpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8IDkwMDkxMywKKyAgICAgICAgICAgICAgICAgICAgICAgIjkwMDkxMyIpOworfQorCisvLyBUZXN0cyB1c2luZyBOVUxMIGNoYXIgcG9pbnRlciBhcyBhbiBhc3NlcnRpb24gbWVzc2FnZS4KKy8vCisvLyBJbiBNU1ZDLCBzdHJlYW1pbmcgYSBOVUxMIGNoYXIgKiBjYXVzZXMgYWNjZXNzIHZpb2xhdGlvbi4gIEdvb2dsZSBUZXN0CisvLyBpbXBsZW1lbnRlZCBhIHdvcmthcm91bmQgKHN1YnN0aXR1dGluZyAiKG51bGwpIiBmb3IgTlVMTCkuICBUaGlzCisvLyB0ZXN0cyB3aGV0aGVyIHRoZSB3b3JrYXJvdW5kIHdvcmtzLgorVEVTVChTdHJlYW1hYmxlVGVzdCwgTnVsbENoYXJQdHIpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIihudWxsKSIpOworfQorCisvLyBUZXN0cyB0aGF0IGJhc2ljIElPIG1hbmlwdWxhdG9ycyAoZW5kbCwgZW5kcywgYW5kIGZsdXNoKSBjYW4gYmUKKy8vIHN0cmVhbWVkIHRvIHRlc3Rpbmc6Ok1lc3NhZ2UuCitURVNUKFN0cmVhbWFibGVUZXN0LCBCYXNpY0lvTWFuaXApIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRkFJTCgpIDw8ICJMaW5lIDEuIiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgICAgPDwgIkEgTlVMIGNoYXIgIiA8PCBzdGQ6OmVuZHMgPDwgc3RkOjpmbHVzaCA8PCAiIGluIGxpbmUgMi4iOworICB9LCAiTGluZSAxLlxuQSBOVUwgY2hhciBcXDAgaW4gbGluZSAyLiIpOworfQorCisvLyBUZXN0cyB0aGUgbWFjcm9zIHRoYXQgaGF2ZW4ndCBiZWVuIGNvdmVyZWQgc28gZmFyLgorCit2b2lkIEFkZEZhaWx1cmVIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICAqYWJvcnRlZCA9IHRydWU7CisgIEFERF9GQUlMVVJFKCkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUuIjsKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworLy8gVGVzdHMgQUREX0ZBSUxVUkUuCitURVNUKE1hY3JvVGVzdCwgQUREX0ZBSUxVUkUpIHsKKyAgYm9vbCBhYm9ydGVkID0gdHJ1ZTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZUhlbHBlcigmYWJvcnRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlbnRpb25hbCBmYWlsdXJlLiIpOworICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Cit9CisKKy8vIFRlc3RzIEFERF9GQUlMVVJFX0FULgorVEVTVChNYWNyb1Rlc3QsIEFERF9GQUlMVVJFX0FUKSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgQUREX0ZBSUxVUkVfQVQgZG9lcyBnZW5lcmF0ZSBhIG5vbmZhdGFsIGZhaWx1cmUgYW5kCisgIC8vIHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMgdGhlIHVzZXItc3RyZWFtZWQgcGFydC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQUREX0ZBSUxVUkVfQVQoImZvby5jYyIsIDQyKSA8PCAiV3JvbmchIiwgIldyb25nISIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHVzZXItc3RyZWFtZWQgcGFydCBpcyBvcHRpb25hbC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQUREX0ZBSUxVUkVfQVQoImZvby5jYyIsIDQyKSwgIkZhaWxlZCIpOworCisgIC8vIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCB2ZXJpZnkgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zCisgIC8vIHRoZSByaWdodCBmaWxlIHBhdGggYW5kIGxpbmUgbnVtYmVyIHRoZSBzYW1lIHdheSwgYXMKKyAgLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBkb2Vzbid0IGdldCB0byBzZWUgdGhlIGZpbGUgcGF0aCBhbmQKKyAgLy8gbGluZSBudW1iZXIuICBJbnN0ZWFkLCB3ZSBkbyB0aGF0IGluIGd0ZXN0X291dHB1dF90ZXN0Xy5jYy4KK30KKworLy8gVGVzdHMgRkFJTC4KK1RFU1QoTWFjcm9UZXN0LCBGQUlMKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIFNVQ0NFRUQKK1RFU1QoTWFjcm9UZXN0LCBTVUNDRUVEKSB7CisgIFNVQ0NFRUQoKTsKKyAgU1VDQ0VFRCgpIDw8ICJFeHBsaWNpdCBzdWNjZXNzLiI7Cit9CisKKy8vIFRlc3RzIGZvciBFWFBFQ1RfRVEoKSBhbmQgQVNTRVJUX0VRKCkuCisvLworLy8gVGhlc2UgdGVzdHMgZmFpbCAqaW50ZW50aW9uYWxseSosIHMudC4gdGhlIGZhaWx1cmUgbWVzc2FnZXMgY2FuIGJlCisvLyBnZW5lcmF0ZWQgYW5kIHRlc3RlZC4KKy8vCisvLyBXZSBoYXZlIGRpZmZlcmVudCB0ZXN0cyBmb3IgZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzLgorCisvLyBUZXN0cyB1c2luZyBib29sIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgQm9vbCkgeworICBFWFBFQ1RfRVEodHJ1ZSwgIHRydWUpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgICAgICBib29sIGZhbHNlX3ZhbHVlID0gZmFsc2U7CisgICAgICBBU1NFUlRfRVEoZmFsc2VfdmFsdWUsIHRydWUpOworICAgIH0sICJWYWx1ZSBvZjogdHJ1ZSIpOworfQorCisvLyBUZXN0cyB1c2luZyBpbnQgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBJbnQpIHsKKyAgQVNTRVJUX0VRKDMyLCAzMik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgzMiwgMzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMzMiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgdGltZV90IHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgVGltZV9UKSB7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx0aW1lX3Q+KDApLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dGltZV90PigwKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShzdGF0aWNfY2FzdDx0aW1lX3Q+KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dGltZV90PigxMjM0KSksCisgICAgICAgICAgICAgICAgICAgICAgICIxMjM0Iik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIGNoYXIgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBDaGFyKSB7CisgIEFTU0VSVF9FUSgneicsICd6Jyk7CisgIGNvbnN0IGNoYXIgY2ggPSAnYic7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgnXDAnLCBjaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoJ2EnLCBjaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIpOworfQorCisvLyBUZXN0cyB1c2luZyB3Y2hhcl90IHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgV2lkZUNoYXIpIHsKKyAgRVhQRUNUX0VRKEwnYicsIEwnYicpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShMJ1wwJywgTCd4JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogTCd4J1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IEwneCcgKDEyMCwgMHg3OClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBMJ1wwJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hpY2ggaXM6IEwnXDAnICgwLCAweDApIik7CisKKyAgc3RhdGljIHdjaGFyX3Qgd2NoYXI7CisgIHdjaGFyID0gTCdiJzsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKEwnYScsIHdjaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndjaGFyIik7CisgIHdjaGFyID0gMHg4MTE5OworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg4MTIwKSwgd2NoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IHdjaGFyIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIDo6c3RkOjpzdHJpbmcgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBTdGRTdHJpbmcpIHsKKyAgLy8gQ29tcGFyZXMgYSBjb25zdCBjaGFyKiB0byBhbiBzdGQ6OnN0cmluZyB0aGF0IGhhcyBpZGVudGljYWwKKyAgLy8gY29udGVudC4KKyAgQVNTRVJUX0VRKCJUZXN0IiwgOjpzdGQ6OnN0cmluZygiVGVzdCIpKTsKKworICAvLyBDb21wYXJlcyB0d28gaWRlbnRpY2FsIHN0ZDo6c3RyaW5ncy4KKyAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyMSgiQSAqIGluIHRoZSBtaWRkbGUiKTsKKyAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyMihzdHIxKTsKKyAgRVhQRUNUX0VRKHN0cjEsIHN0cjIpOworCisgIC8vIENvbXBhcmVzIGEgY29uc3QgY2hhciogdG8gYW4gc3RkOjpzdHJpbmcgdGhhdCBoYXMgZGlmZmVyZW50CisgIC8vIGNvbnRlbnQKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKCJUZXN0IiwgOjpzdGQ6OnN0cmluZygidGVzdCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwidGVzdFwiIik7CisKKyAgLy8gQ29tcGFyZXMgYW4gc3RkOjpzdHJpbmcgdG8gYSBjaGFyKiB0aGF0IGhhcyBkaWZmZXJlbnQgY29udGVudC4KKyAgY2hhciogY29uc3QgcDEgPSBjb25zdF9jYXN0PGNoYXIqPigiZm9vIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg6OnN0ZDo6c3RyaW5nKCJiYXIiKSwgcDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicDEiKTsKKworICAvLyBDb21wYXJlcyB0d28gc3RkOjpzdHJpbmdzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgY29udGVudHMsIG9uZSBvZgorICAvLyB3aGljaCBoYXZpbmcgYSBOVUwgY2hhcmFjdGVyIGluIHRoZSBtaWRkbGUuICBUaGlzIHNob3VsZCBmYWlsLgorICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBzdHIzKHN0cjEpOworICBzdHIzLmF0KDIpID0gJ1wwJzsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHN0cjEsIHN0cjMpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IHN0cjNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBcIkEgXFwwIGluIHRoZSBtaWRkbGVcIiIpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRlc3RzIHVzaW5nIDo6c3RkOjp3c3RyaW5nIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgU3RkV2lkZVN0cmluZykgeworICAvLyBDb21wYXJlcyB0d28gaWRlbnRpY2FsIHN0ZDo6d3N0cmluZ3MuCisgIGNvbnN0IDo6c3RkOjp3c3RyaW5nIHdzdHIxKEwiQSAqIGluIHRoZSBtaWRkbGUiKTsKKyAgY29uc3QgOjpzdGQ6OndzdHJpbmcgd3N0cjIod3N0cjEpOworICBBU1NFUlRfRVEod3N0cjEsIHdzdHIyKTsKKworICAvLyBDb21wYXJlcyBhbiBzdGQ6OndzdHJpbmcgdG8gYSBjb25zdCB3Y2hhcl90KiB0aGF0IGhhcyBpZGVudGljYWwKKyAgLy8gY29udGVudC4KKyAgY29uc3Qgd2NoYXJfdCBrVGVzdFg4MTE5W10gPSB7ICdUJywgJ2UnLCAncycsICd0JywgMHg4MTE5LCAnXDAnIH07CisgIEVYUEVDVF9FUSg6OnN0ZDo6d3N0cmluZyhrVGVzdFg4MTE5KSwga1Rlc3RYODExOSk7CisKKyAgLy8gQ29tcGFyZXMgYW4gc3RkOjp3c3RyaW5nIHRvIGEgY29uc3Qgd2NoYXJfdCogdGhhdCBoYXMgZGlmZmVyZW50CisgIC8vIGNvbnRlbnQuCisgIGNvbnN0IHdjaGFyX3Qga1Rlc3RYODEyMFtdID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDB4ODEyMCwgJ1wwJyB9OworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfRVEoOjpzdGQ6OndzdHJpbmcoa1Rlc3RYODExOSksIGtUZXN0WDgxMjApOworICB9LCAia1Rlc3RYODEyMCIpOworCisgIC8vIENvbXBhcmVzIHR3byBzdGQ6OndzdHJpbmdzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgY29udGVudHMsIG9uZSBvZgorICAvLyB3aGljaCBoYXZpbmcgYSBOVUwgY2hhcmFjdGVyIGluIHRoZSBtaWRkbGUuCisgIDo6c3RkOjp3c3RyaW5nIHdzdHIzKHdzdHIxKTsKKyAgd3N0cjMuYXQoMikgPSBMJ1wwJzsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHdzdHIxLCB3c3RyMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3c3RyMyIpOworCisgIC8vIENvbXBhcmVzIGEgd2NoYXJfdCogdG8gYW4gc3RkOjp3c3RyaW5nIHRoYXQgaGFzIGRpZmZlcmVudAorICAvLyBjb250ZW50LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRVEoY29uc3RfY2FzdDx3Y2hhcl90Kj4oTCJmb28iKSwgOjpzdGQ6OndzdHJpbmcoTCJiYXIiKSk7CisgIH0sICIiKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyBUZXN0cyB1c2luZyA6OnN0cmluZyB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIEdsb2JhbFN0cmluZykgeworICAvLyBDb21wYXJlcyBhIGNvbnN0IGNoYXIqIHRvIGEgOjpzdHJpbmcgdGhhdCBoYXMgaWRlbnRpY2FsIGNvbnRlbnQuCisgIEVYUEVDVF9FUSgiVGVzdCIsIDo6c3RyaW5nKCJUZXN0IikpOworCisgIC8vIENvbXBhcmVzIHR3byBpZGVudGljYWwgOjpzdHJpbmdzLgorICBjb25zdCA6OnN0cmluZyBzdHIxKCJBICogaW4gdGhlIG1pZGRsZSIpOworICBjb25zdCA6OnN0cmluZyBzdHIyKHN0cjEpOworICBBU1NFUlRfRVEoc3RyMSwgc3RyMik7CisKKyAgLy8gQ29tcGFyZXMgYSA6OnN0cmluZyB0byBhIGNvbnN0IGNoYXIqIHRoYXQgaGFzIGRpZmZlcmVudCBjb250ZW50LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoOjpzdHJpbmcoIlRlc3QiKSwgInRlc3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QiKTsKKworICAvLyBDb21wYXJlcyB0d28gOjpzdHJpbmdzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgY29udGVudHMsIG9uZSBvZiB3aGljaAorICAvLyBoYXZpbmcgYSBOVUwgY2hhcmFjdGVyIGluIHRoZSBtaWRkbGUuCisgIDo6c3RyaW5nIHN0cjMoc3RyMSk7CisgIHN0cjMuYXQoMikgPSAnXDAnOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoc3RyMSwgc3RyMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHIzIik7CisKKyAgLy8gQ29tcGFyZXMgYSA6OnN0cmluZyB0byBhIGNoYXIqIHRoYXQgaGFzIGRpZmZlcmVudCBjb250ZW50LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRVEoOjpzdHJpbmcoImJhciIpLCBjb25zdF9jYXN0PGNoYXIqPigiZm9vIikpOworICB9LCAiIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBUZXN0cyB1c2luZyA6OndzdHJpbmcgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBHbG9iYWxXaWRlU3RyaW5nKSB7CisgIC8vIENvbXBhcmVzIHR3byBpZGVudGljYWwgOjp3c3RyaW5ncy4KKyAgc3RhdGljIGNvbnN0IDo6d3N0cmluZyB3c3RyMShMIkEgKiBpbiB0aGUgbWlkZGxlIik7CisgIHN0YXRpYyBjb25zdCA6OndzdHJpbmcgd3N0cjIod3N0cjEpOworICBFWFBFQ1RfRVEod3N0cjEsIHdzdHIyKTsKKworICAvLyBDb21wYXJlcyBhIGNvbnN0IHdjaGFyX3QqIHRvIGEgOjp3c3RyaW5nIHRoYXQgaGFzIGlkZW50aWNhbCBjb250ZW50LgorICBjb25zdCB3Y2hhcl90IGtUZXN0WDgxMTlbXSA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAweDgxMTksICdcMCcgfTsKKyAgQVNTRVJUX0VRKGtUZXN0WDgxMTksIDo6d3N0cmluZyhrVGVzdFg4MTE5KSk7CisKKyAgLy8gQ29tcGFyZXMgYSBjb25zdCB3Y2hhcl90KiB0byBhIDo6d3N0cmluZyB0aGF0IGhhcyBkaWZmZXJlbnQKKyAgLy8gY29udGVudC4KKyAgY29uc3Qgd2NoYXJfdCBrVGVzdFg4MTIwW10gPSB7ICdUJywgJ2UnLCAncycsICd0JywgMHg4MTIwLCAnXDAnIH07CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9FUShrVGVzdFg4MTIwLCA6OndzdHJpbmcoa1Rlc3RYODExOSkpOworICB9LCAiVGVzdFxceDgxMTkiKTsKKworICAvLyBDb21wYXJlcyBhIHdjaGFyX3QqIHRvIGEgOjp3c3RyaW5nIHRoYXQgaGFzIGRpZmZlcmVudCBjb250ZW50LgorICB3Y2hhcl90KiBjb25zdCBwMSA9IGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KEwiZm9vIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMSwgOjp3c3RyaW5nKEwiYmFyIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFyIik7CisKKyAgLy8gQ29tcGFyZXMgdHdvIDo6d3N0cmluZ3MgdGhhdCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgb25lIG9mIHdoaWNoCisgIC8vIGhhdmluZyBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIG1pZGRsZS4KKyAgc3RhdGljIDo6d3N0cmluZyB3c3RyMzsKKyAgd3N0cjMgPSB3c3RyMTsKKyAgd3N0cjMuYXQoMikgPSBMJ1wwJzsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHdzdHIxLCB3c3RyMyksCisgICAgICAgICAgICAgICAgICAgICAgICJ3c3RyMyIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBUZXN0cyB1c2luZyBjaGFyIHBvaW50ZXJzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBDaGFyUG9pbnRlcikgeworICBjaGFyKiBjb25zdCBwMCA9IE5VTEw7CisgIC8vIE9ubHkgd2F5IHRvIGdldCB0aGUgTm9raWEgY29tcGlsZXIgdG8gY29tcGlsZSB0aGUgY2FzdAorICAvLyBpcyB0byBoYXZlIGEgc2VwYXJhdGUgdm9pZCogdmFyaWFibGUgZmlyc3QuIFB1dHRpbmcKKyAgLy8gdGhlIHR3byBjYXN0cyBvbiB0aGUgc2FtZSBsaW5lIGRvZXNuJ3Qgd29yaywgbmVpdGhlciBkb2VzCisgIC8vIGEgZGlyZWN0IEMtc3R5bGUgdG8gY2hhciouCisgIHZvaWQqIHB2MSA9ICh2b2lkKikweDEyMzQ7ICAvLyBOT0xJTlQKKyAgdm9pZCogcHYyID0gKHZvaWQqKTB4QUJDMDsgIC8vIE5PTElOVAorICBjaGFyKiBjb25zdCBwMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHB2MSk7CisgIGNoYXIqIGNvbnN0IHAyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocHYyKTsKKyAgQVNTRVJUX0VRKHAxLCBwMSk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAwLCBwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogcDIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAxLCBwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oMHgxMjM0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KDB4QUJDMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAiQUJDMCIpOworfQorCisvLyBUZXN0cyB1c2luZyB3Y2hhcl90IHBvaW50ZXJzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBXaWRlQ2hhclBvaW50ZXIpIHsKKyAgd2NoYXJfdCogY29uc3QgcDAgPSBOVUxMOworICAvLyBPbmx5IHdheSB0byBnZXQgdGhlIE5va2lhIGNvbXBpbGVyIHRvIGNvbXBpbGUgdGhlIGNhc3QKKyAgLy8gaXMgdG8gaGF2ZSBhIHNlcGFyYXRlIHZvaWQqIHZhcmlhYmxlIGZpcnN0LiBQdXR0aW5nCisgIC8vIHRoZSB0d28gY2FzdHMgb24gdGhlIHNhbWUgbGluZSBkb2Vzbid0IHdvcmssIG5laXRoZXIgZG9lcworICAvLyBhIGRpcmVjdCBDLXN0eWxlIHRvIGNoYXIqLgorICB2b2lkKiBwdjEgPSAodm9pZCopMHgxMjM0OyAgLy8gTk9MSU5UCisgIHZvaWQqIHB2MiA9ICh2b2lkKikweEFCQzA7ICAvLyBOT0xJTlQKKyAgd2NoYXJfdCogY29uc3QgcDEgPSByZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihwdjEpOworICB3Y2hhcl90KiBjb25zdCBwMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8d2NoYXJfdCo+KHB2Mik7CisgIEVYUEVDVF9FUShwMCwgcDApOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMCwgcDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IHAyIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMSwgcDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicDIiKTsKKyAgdm9pZCogcHYzID0gKHZvaWQqKTB4MTIzNDsgIC8vIE5PTElOVAorICB2b2lkKiBwdjQgPSAodm9pZCopMHhBQkMwOyAgLy8gTk9MSU5UCisgIGNvbnN0IHdjaGFyX3QqIHAzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB3Y2hhcl90Kj4ocHYzKTsKKyAgY29uc3Qgd2NoYXJfdCogcDQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHdjaGFyX3QqPihwdjQpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDMsIHA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInA0Iik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIG90aGVyIHR5cGVzIG9mIHBvaW50ZXJzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBPdGhlclBvaW50ZXIpIHsKKyAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PGNvbnN0IGludCo+KE5VTEwpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgaW50Kj4oTlVMTCkpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8Y29uc3QgaW50Kj4oTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGludCo+KDB4MTIzNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAiMHgxMjM0Iik7Cit9CisKKy8vIEEgY2xhc3MgdGhhdCBzdXBwb3J0cyBiaW5hcnkgY29tcGFyaXNvbiBvcGVyYXRvcnMgYnV0IG5vdCBzdHJlYW1pbmcuCitjbGFzcyBVbnByaW50YWJsZUNoYXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5wcmludGFibGVDaGFyKGNoYXIgY2gpIDogY2hhcl8oY2gpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNoYXJfID09IHJocy5jaGFyXzsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gIT0gcmhzLmNoYXJfOworICB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNoYXJfIDwgcmhzLmNoYXJfOworICB9CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyA8PSByaHMuY2hhcl87CisgIH0KKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPiByaHMuY2hhcl87CisgIH0KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNoYXJfID49IHJocy5jaGFyXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2hhciBjaGFyXzsKK307CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0VRKCkgYW5kIGZyaWVuZHMgZG9uJ3QgcmVxdWlyZSB0aGUgYXJndW1lbnRzIHRvCisvLyBiZSBwcmludGFibGUuCitURVNUKENvbXBhcmlzb25Bc3NlcnRpb25UZXN0LCBBY2NlcHRzVW5wcmludGFibGVBcmdzKSB7CisgIGNvbnN0IFVucHJpbnRhYmxlQ2hhciB4KCd4JyksIHkoJ3knKTsKKyAgQVNTRVJUX0VRKHgsIHgpOworICBFWFBFQ1RfTkUoeCwgeSk7CisgIEFTU0VSVF9MVCh4LCB5KTsKKyAgRVhQRUNUX0xFKHgsIHkpOworICBBU1NFUlRfR1QoeSwgeCk7CisgIEVYUEVDVF9HRSh4LCB4KTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoeCwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OD4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHgsIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVCh5LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc5PiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR1QoeCwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OD4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKHgsIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7CisKKyAgLy8gQ29kZSB0ZXN0ZWQgYnkgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUgY2Fubm90IHJlZmVyZW5jZSBsb2NhbAorICAvLyB2YXJpYWJsZXMsIHNvIHdlIGhhdmUgdG8gd3JpdGUgVW5wcmludGFibGVDaGFyKCd4JykgaW5zdGVhZCBvZiB4LgorI2lmbmRlZiBfX0JPUkxBTkRDX18KKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlci4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX05FKFVucHJpbnRhYmxlQ2hhcigneCcpLCBVbnByaW50YWJsZUNoYXIoJ3gnKSksCisgICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OD4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0xFKFVucHJpbnRhYmxlQ2hhcigneScpLCBVbnByaW50YWJsZUNoYXIoJ3gnKSksCisgICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OD4iKTsKKyNlbmRpZgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTEUoVW5wcmludGFibGVDaGFyKCd5JyksIFVucHJpbnRhYmxlQ2hhcigneCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEtYnl0ZSBvYmplY3QgPDc5PiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfR0UoVW5wcmludGFibGVDaGFyKCd4JyksIFVucHJpbnRhYmxlQ2hhcigneScpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfR0UoVW5wcmludGFibGVDaGFyKCd4JyksIFVucHJpbnRhYmxlQ2hhcigneScpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEtYnl0ZSBvYmplY3QgPDc5PiIpOworfQorCisvLyBUZXN0cyB0aGUgRlJJRU5EX1RFU1QgbWFjcm8uCisKKy8vIFRoaXMgY2xhc3MgaGFzIGEgcHJpdmF0ZSBtZW1iZXIgd2Ugd2FudCB0byB0ZXN0LiAgV2Ugd2lsbCB0ZXN0IGl0CisvLyBib3RoIGluIGEgVEVTVCBhbmQgaW4gYSBURVNUX0YuCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgRm9vKCkge30KKworIHByaXZhdGU6CisgIGludCBCYXIoKSBjb25zdCB7IHJldHVybiAxOyB9CisKKyAgLy8gRGVjbGFyZXMgdGhlIGZyaWVuZCB0ZXN0cyB0aGF0IGNhbiBhY2Nlc3MgdGhlIHByaXZhdGUgbWVtYmVyCisgIC8vIEJhcigpLgorICBGUklFTkRfVEVTVChGUklFTkRfVEVTVF9UZXN0LCBURVNUKTsKKyAgRlJJRU5EX1RFU1QoRlJJRU5EX1RFU1RfVGVzdDIsIFRFU1RfRik7Cit9OworCisvLyBUZXN0cyB0aGF0IHRoZSBGUklFTkRfVEVTVCBkZWNsYXJhdGlvbiBhbGxvd3MgYSBURVNUIHRvIGFjY2VzcyBhCisvLyBjbGFzcydzIHByaXZhdGUgbWVtYmVycy4gIFRoaXMgc2hvdWxkIGNvbXBpbGUuCitURVNUKEZSSUVORF9URVNUX1Rlc3QsIFRFU1QpIHsKKyAgQVNTRVJUX0VRKDEsIEZvbygpLkJhcigpKTsKK30KKworLy8gVGhlIGZpeHR1cmUgbmVlZGVkIHRvIHRlc3QgdXNpbmcgRlJJRU5EX1RFU1Qgd2l0aCBURVNUX0YuCitjbGFzcyBGUklFTkRfVEVTVF9UZXN0MiA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEZvbyBmb287Cit9OworCisvLyBUZXN0cyB0aGF0IHRoZSBGUklFTkRfVEVTVCBkZWNsYXJhdGlvbiBhbGxvd3MgYSBURVNUX0YgdG8gYWNjZXNzIGEKKy8vIGNsYXNzJ3MgcHJpdmF0ZSBtZW1iZXJzLiAgVGhpcyBzaG91bGQgY29tcGlsZS4KK1RFU1RfRihGUklFTkRfVEVTVF9UZXN0MiwgVEVTVF9GKSB7CisgIEFTU0VSVF9FUSgxLCBmb28uQmFyKCkpOworfQorCisvLyBUZXN0cyB0aGUgbGlmZSBjeWNsZSBvZiBUZXN0IG9iamVjdHMuCisKKy8vIFRoZSB0ZXN0IGZpeHR1cmUgZm9yIHRlc3RpbmcgdGhlIGxpZmUgY3ljbGUgb2YgVGVzdCBvYmplY3RzLgorLy8KKy8vIFRoaXMgY2xhc3MgY291bnRzIHRoZSBudW1iZXIgb2YgbGl2ZSB0ZXN0IG9iamVjdHMgdGhhdCB1c2VzIHRoaXMKKy8vIGZpeHR1cmUuCitjbGFzcyBUZXN0TGlmZUN5Y2xlVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIENvbnN0cnVjdG9yLiAgSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIHRlc3Qgb2JqZWN0cyB0aGF0IHVzZXMKKyAgLy8gdGhpcyBmaXh0dXJlLgorICBUZXN0TGlmZUN5Y2xlVGVzdCgpIHsgY291bnRfKys7IH0KKworICAvLyBEZXN0cnVjdG9yLiAgRGVjcmVtZW50cyB0aGUgbnVtYmVyIG9mIHRlc3Qgb2JqZWN0cyB0aGF0IHVzZXMgdGhpcworICAvLyBmaXh0dXJlLgorICB+VGVzdExpZmVDeWNsZVRlc3QoKSB7IGNvdW50Xy0tOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpdmUgdGVzdCBvYmplY3RzIHRoYXQgdXNlcyB0aGlzIGZpeHR1cmUuCisgIGludCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIGNvdW50XzsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBjb3VudF87Cit9OworCitpbnQgVGVzdExpZmVDeWNsZVRlc3Q6OmNvdW50XyA9IDA7CisKKy8vIFRlc3RzIHRoZSBsaWZlIGN5Y2xlIG9mIHRlc3Qgb2JqZWN0cy4KK1RFU1RfRihUZXN0TGlmZUN5Y2xlVGVzdCwgVGVzdDEpIHsKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIHRlc3Qgb2JqZWN0IGluIHRoaXMgdGVzdCBjYXNlIHRoYXQncworICAvLyBjdXJyZW50bHkgYWxpdmUuCisgIEFTU0VSVF9FUSgxLCBjb3VudCgpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpZmUgY3ljbGUgb2YgdGVzdCBvYmplY3RzLgorVEVTVF9GKFRlc3RMaWZlQ3ljbGVUZXN0LCBUZXN0MikgeworICAvLyBBZnRlciBUZXN0MSBpcyBkb25lIGFuZCBUZXN0MiBpcyBzdGFydGVkLCB0aGVyZSBzaG91bGQgc3RpbGwgYmUKKyAgLy8gb25seSBvbmUgbGl2ZSB0ZXN0IG9iamVjdCwgYXMgdGhlIG9iamVjdCBmb3IgVGVzdDEgc2hvdWxkJ3ZlIGJlZW4KKyAgLy8gZGVsZXRlZC4KKyAgQVNTRVJUX0VRKDEsIGNvdW50KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gVGVzdHMgdGhhdCB0aGUgY29weSBjb25zdHJ1Y3RvciB3b3JrcyB3aGVuIGl0IGlzIE5PVCBvcHRpbWl6ZWQgYXdheSBieQorLy8gdGhlIGNvbXBpbGVyLgorVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBDb3B5Q29uc3RydWN0b3JXb3Jrc1doZW5Ob3RPcHRpbWllZCkgeworICAvLyBDaGVja3MgdGhhdCB0aGUgY29weSBjb25zdHJ1Y3RvciBkb2Vzbid0IHRyeSB0byBkZXJlZmVyZW5jZSBOVUxMIHBvaW50ZXJzCisgIC8vIGluIHRoZSBzb3VyY2Ugb2JqZWN0LgorICBBc3NlcnRpb25SZXN1bHQgcjEgPSBBc3NlcnRpb25TdWNjZXNzKCk7CisgIEFzc2VydGlvblJlc3VsdCByMiA9IHIxOworICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYWRkZWQgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBvcHRpbWl6aW5nCisgIC8vIGF3YXkgdGhlIGNvbnN0cnVjdG9yIGNhbGwuCisgIHIxIDw8ICJhYmMiOworCisgIEFzc2VydGlvblJlc3VsdCByMyA9IHIxOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8Ym9vbD4ocjMpLCBzdGF0aWNfY2FzdDxib29sPihyMSkpOworICBFWFBFQ1RfU1RSRVEoImFiYyIsIHIxLm1lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQXNzZXJ0aW9uU3VjY2VzcyBhbmQgQXNzZXJ0aW9uRmFpbHVyZSBjb25zdHJ1Y3QKKy8vIEFzc2VydGlvblJlc3VsdCBvYmplY3RzIGFzIGV4cGVjdGVkLgorVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBDb25zdHJ1Y3Rpb25Xb3JrcykgeworICBBc3NlcnRpb25SZXN1bHQgcjEgPSBBc3NlcnRpb25TdWNjZXNzKCk7CisgIEVYUEVDVF9UUlVFKHIxKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCByMS5tZXNzYWdlKCkpOworCisgIEFzc2VydGlvblJlc3VsdCByMiA9IEFzc2VydGlvblN1Y2Nlc3MoKSA8PCAiYWJjIjsKKyAgRVhQRUNUX1RSVUUocjIpOworICBFWFBFQ1RfU1RSRVEoImFiYyIsIHIyLm1lc3NhZ2UoKSk7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHIzID0gQXNzZXJ0aW9uRmFpbHVyZSgpOworICBFWFBFQ1RfRkFMU0UocjMpOworICBFWFBFQ1RfU1RSRVEoIiIsIHIzLm1lc3NhZ2UoKSk7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHI0ID0gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJkZWYiOworICBFWFBFQ1RfRkFMU0UocjQpOworICBFWFBFQ1RfU1RSRVEoImRlZiIsIHI0Lm1lc3NhZ2UoKSk7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHI1ID0gQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgImdoaSIpOworICBFWFBFQ1RfRkFMU0UocjUpOworICBFWFBFQ1RfU1RSRVEoImdoaSIsIHI1Lm1lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIG5lZ2F0aW9uIGZsaXBzIHRoZSBwcmVkaWNhdGUgcmVzdWx0IGJ1dCBrZWVwcyB0aGUgbWVzc2FnZS4KK1RFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgTmVnYXRpb25Xb3JrcykgeworICBBc3NlcnRpb25SZXN1bHQgcjEgPSBBc3NlcnRpb25TdWNjZXNzKCkgPDwgImFiYyI7CisgIEVYUEVDVF9GQUxTRSghcjEpOworICBFWFBFQ1RfU1RSRVEoImFiYyIsICghcjEpLm1lc3NhZ2UoKSk7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHIyID0gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJkZWYiOworICBFWFBFQ1RfVFJVRSghcjIpOworICBFWFBFQ1RfU1RSRVEoImRlZiIsICghcjIpLm1lc3NhZ2UoKSk7Cit9CisKK1RFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgU3RyZWFtaW5nV29ya3MpIHsKKyAgQXNzZXJ0aW9uUmVzdWx0IHIgPSBBc3NlcnRpb25TdWNjZXNzKCk7CisgIHIgPDwgImFiYyIgPDwgJ2QnIDw8IDAgPDwgdHJ1ZTsKKyAgRVhQRUNUX1NUUkVRKCJhYmNkMHRydWUiLCByLm1lc3NhZ2UoKSk7Cit9CisKK1RFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgQ2FuU3RyZWFtT3N0cmVhbU1hbmlwdWxhdG9ycykgeworICBBc3NlcnRpb25SZXN1bHQgciA9IEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgciA8PCAiRGF0YSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6Zmx1c2ggPDwgc3RkOjplbmRzIDw8ICJXaWxsIGJlIHZpc2libGUiOworICBFWFBFQ1RfU1RSRVEoIkRhdGFcblxcMFdpbGwgYmUgdmlzaWJsZSIsIHIubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgdXNlciB0eXBlIHdob3NlIGRlZmluaXRpb24gYW5kIG9wZXJhdG9yIDw8IGFyZQorLy8gYm90aCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK2NsYXNzIEJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQmFzZShpbnQgYW5feCkgOiB4Xyhhbl94KSB7fQorICBpbnQgeCgpIGNvbnN0IHsgcmV0dXJuIHhfOyB9CisgcHJpdmF0ZToKKyAgaW50IHhfOworfTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2UmIHZhbCkgeworICByZXR1cm4gb3MgPDwgdmFsLngoKTsKK30KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2UqIHBvaW50ZXIpIHsKKyAgcmV0dXJuIG9zIDw8ICIoIiA8PCBwb2ludGVyLT54KCkgPDwgIikiOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBDYW5TdHJlYW1Vc2VyVHlwZUluR2xvYmFsTmFtZVNwYWNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBCYXNlIGEoMSk7CisKKyAgbXNnIDw8IGEgPDwgJmE7ICAvLyBVc2VzIDo6b3BlcmF0b3I8PC4KKyAgRVhQRUNUX1NUUkVRKCIxKDEpIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSB1c2VyIHR5cGUgd2hvc2UgZGVmaW5pdGlvbiBhbmQgb3BlcmF0b3I8PCBhcmUKKy8vIGJvdGggaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2UuCituYW1lc3BhY2UgeworY2xhc3MgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlKGludCBhbl94KTogQmFzZShhbl94KSB7fQorfTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSYgdmFsKSB7CisgIHJldHVybiBvcyA8PCB2YWwueCgpOworfQorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlKiBwb2ludGVyKSB7CisgIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKK30KK30gIC8vIG5hbWVzcGFjZQorCitURVNUKE1lc3NhZ2VUZXN0LCBDYW5TdHJlYW1Vc2VyVHlwZUluVW5uYW1lZE5hbWVTcGFjZSkgeworICBNZXNzYWdlIG1zZzsKKyAgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlIGEoMSk7CisKKyAgbXNnIDw8IGEgPDwgJmE7ICAvLyBVc2VzIDx1bm5hbWVkX25hbWVzcGFjZT46Om9wZXJhdG9yPDwuCisgIEVYUEVDVF9TVFJFUSgiMSgxKSIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgdXNlciB0eXBlIHdob3NlIGRlZmluaXRpb24gYW5kIG9wZXJhdG9yPDwgYXJlCisvLyBib3RoIGluIGEgdXNlciBuYW1lc3BhY2UuCituYW1lc3BhY2UgbmFtZXNwYWNlMSB7CitjbGFzcyBNeVR5cGVJbk5hbWVTcGFjZTEgOiBwdWJsaWMgQmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBNeVR5cGVJbk5hbWVTcGFjZTEoaW50IGFuX3gpOiBCYXNlKGFuX3gpIHt9Cit9Oworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXlUeXBlSW5OYW1lU3BhY2UxJiB2YWwpIHsKKyAgcmV0dXJuIG9zIDw8IHZhbC54KCk7Cit9CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNeVR5cGVJbk5hbWVTcGFjZTEqIHBvaW50ZXIpIHsKKyAgcmV0dXJuIG9zIDw8ICIoIiA8PCBwb2ludGVyLT54KCkgPDwgIikiOworfQorfSAgLy8gbmFtZXNwYWNlIG5hbWVzcGFjZTEKKworVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJblVzZXJOYW1lU3BhY2UpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG5hbWVzcGFjZTE6Ok15VHlwZUluTmFtZVNwYWNlMSBhKDEpOworCisgIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyBuYW1lc3BhY2UxOjpvcGVyYXRvcjw8LgorICBFWFBFQ1RfU1RSRVEoIjEoMSkiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIHVzZXIgdHlwZSB3aG9zZSBkZWZpbml0aW9uIGlzIGluIGEgdXNlciBuYW1lc3BhY2UKKy8vIGJ1dCB3aG9zZSBvcGVyYXRvcjw8IGlzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorbmFtZXNwYWNlIG5hbWVzcGFjZTIgeworY2xhc3MgTXlUeXBlSW5OYW1lU3BhY2UyIDogcHVibGljIDo6QmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBNeVR5cGVJbk5hbWVTcGFjZTIoaW50IGFuX3gpOiBCYXNlKGFuX3gpIHt9Cit9OworfSAgLy8gbmFtZXNwYWNlIG5hbWVzcGFjZTIKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZTI6Ok15VHlwZUluTmFtZVNwYWNlMiYgdmFsKSB7CisgIHJldHVybiBvcyA8PCB2YWwueCgpOworfQorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlMjo6TXlUeXBlSW5OYW1lU3BhY2UyKiBwb2ludGVyKSB7CisgIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKK30KKworVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJblVzZXJOYW1lU3BhY2VXaXRoU3RyZWFtT3BlcmF0b3JJbkdsb2JhbCkgeworICBNZXNzYWdlIG1zZzsKKyAgbmFtZXNwYWNlMjo6TXlUeXBlSW5OYW1lU3BhY2UyIGEoMSk7CisKKyAgbXNnIDw8IGEgPDwgJmE7ICAvLyBVc2VzIDo6b3BlcmF0b3I8PC4KKyAgRVhQRUNUX1NUUkVRKCIxKDEpIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgTlVMTCBwb2ludGVycyB0byB0ZXN0aW5nOjpNZXNzYWdlLgorVEVTVChNZXNzYWdlVGVzdCwgTnVsbFBvaW50ZXJzKSB7CisgIE1lc3NhZ2UgbXNnOworICBjaGFyKiBjb25zdCBwMSA9IE5VTEw7CisgIHVuc2lnbmVkIGNoYXIqIGNvbnN0IHAyID0gTlVMTDsKKyAgaW50KiBwMyA9IE5VTEw7CisgIGRvdWJsZSogcDQgPSBOVUxMOworICBib29sKiBwNSA9IE5VTEw7CisgIE1lc3NhZ2UqIHA2ID0gTlVMTDsKKworICBtc2cgPDwgcDEgPDwgcDIgPDwgcDMgPDwgcDQgPDwgcDUgPDwgcDY7CisgIEFTU0VSVF9TVFJFUSgiKG51bGwpKG51bGwpKG51bGwpKG51bGwpKG51bGwpKG51bGwpIiwKKyAgICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIHdpZGUgc3RyaW5ncyB0byB0ZXN0aW5nOjpNZXNzYWdlLgorVEVTVChNZXNzYWdlVGVzdCwgV2lkZVN0cmluZ3MpIHsKKyAgLy8gU3RyZWFtcyBhIE5VTEwgb2YgdHlwZSBjb25zdCB3Y2hhcl90Ki4KKyAgY29uc3Qgd2NoYXJfdCogY29uc3Rfd3N0ciA9IE5VTEw7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwKKyAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgY29uc3Rfd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisKKyAgLy8gU3RyZWFtcyBhIE5VTEwgb2YgdHlwZSB3Y2hhcl90Ki4KKyAgd2NoYXJfdCogd3N0ciA9IE5VTEw7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwKKyAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisKKyAgLy8gU3RyZWFtcyBhIG5vbi1OVUxMIG9mIHR5cGUgY29uc3Qgd2NoYXJfdCouCisgIGNvbnN0X3dzdHIgPSBMImFiY1x4ODExOSI7CisgIEVYUEVDVF9TVFJFUSgiYWJjXHhlOFx4ODRceDk5IiwKKyAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgY29uc3Rfd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisKKyAgLy8gU3RyZWFtcyBhIG5vbi1OVUxMIG9mIHR5cGUgd2NoYXJfdCouCisgIHdzdHIgPSBjb25zdF9jYXN0PHdjaGFyX3QqPihjb25zdF93c3RyKTsKKyAgRVhQRUNUX1NUUkVRKCJhYmNceGU4XHg4NFx4OTkiLAorICAgICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCB3c3RyKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworCisvLyBUaGlzIGxpbmUgdGVzdHMgdGhhdCB3ZSBjYW4gZGVmaW5lIHRlc3RzIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZS4KK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGVzdHMgdGhlIFRlc3RJbmZvIGNsYXNzLgorCitjbGFzcyBUZXN0SW5mb1Rlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3QgVGVzdEluZm8qIEdldFRlc3RJbmZvKGNvbnN0IGNoYXIqIHRlc3RfbmFtZSkgeworICAgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBHZXRVbml0VGVzdEltcGwoKS0+CisgICAgICAgIEdldFRlc3RDYXNlKCJUZXN0SW5mb1Rlc3QiLCAiIiwgTlVMTCwgTlVMTCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpOyArK2kpIHsKKyAgICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPkdldFRlc3RJbmZvKGkpOworICAgICAgaWYgKHN0cmNtcCh0ZXN0X25hbWUsIHRlc3RfaW5mby0+bmFtZSgpKSA9PSAwKQorICAgICAgICByZXR1cm4gdGVzdF9pbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBUZXN0UmVzdWx0KiBHZXRUZXN0UmVzdWx0KAorICAgICAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnJlc3VsdCgpOworICB9Cit9OworCisvLyBUZXN0cyBUZXN0SW5mbzo6dGVzdF9jYXNlX25hbWUoKSBhbmQgVGVzdEluZm86Om5hbWUoKS4KK1RFU1RfRihUZXN0SW5mb1Rlc3QsIE5hbWVzKSB7CisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSBHZXRUZXN0SW5mbygiTmFtZXMiKTsKKworICBBU1NFUlRfU1RSRVEoIlRlc3RJbmZvVGVzdCIsIHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEFTU0VSVF9TVFJFUSgiTmFtZXMiLCB0ZXN0X2luZm8tPm5hbWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RJbmZvOjpyZXN1bHQoKS4KK1RFU1RfRihUZXN0SW5mb1Rlc3QsIHJlc3VsdCkgeworICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gR2V0VGVzdEluZm8oInJlc3VsdCIpOworCisgIC8vIEluaXRpYWxseSwgdGhlcmUgaXMgbm8gVGVzdFBhcnRSZXN1bHQgZm9yIHRoaXMgdGVzdC4KKyAgQVNTRVJUX0VRKDAsIEdldFRlc3RSZXN1bHQodGVzdF9pbmZvKS0+dG90YWxfcGFydF9jb3VudCgpKTsKKworICAvLyBBZnRlciB0aGUgcHJldmlvdXMgYXNzZXJ0aW9uLCB0aGVyZSBpcyBzdGlsbCBub25lLgorICBBU1NFUlRfRVEoMCwgR2V0VGVzdFJlc3VsdCh0ZXN0X2luZm8pLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyBzZXR0aW5nIHVwIGFuZCB0ZWFyaW5nIGRvd24gYSB0ZXN0IGNhc2UuCisKK2NsYXNzIFNldFVwVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZQorICAvLyBpcyBydW4uCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCJTZXR0aW5nIHVwIHRoZSB0ZXN0IGNhc2UgLiAuIC5cbiIpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgc29tZSBzaGFyZWQgcmVzb3VyY2UuICBJbiB0aGlzIHNpbXBsZSBleGFtcGxlLCB3ZQorICAgIC8vIGp1c3QgY3JlYXRlIGEgQyBzdHJpbmcuICBNb3JlIGNvbXBsZXggc3R1ZmYgY2FuIGJlIGRvbmUgaWYKKyAgICAvLyBkZXNpcmVkLgorICAgIHNoYXJlZF9yZXNvdXJjZV8gPSAiMTIzIjsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHNldCB1cC4KKyAgICBjb3VudGVyXysrOworCisgICAgLy8gU2V0VXBUZXN0Q2FzZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyXyk7CisgIH0KKworICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBpcworICAvLyBydW4uCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCJUZWFyaW5nIGRvd24gdGhlIHRlc3QgY2FzZSAuIC4gLlxuIik7CisKKyAgICAvLyBEZWNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAuCisgICAgY291bnRlcl8tLTsKKworICAgIC8vIFRlYXJEb3duVGVzdENhc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMCwgY291bnRlcl8pOworCisgICAgLy8gQ2xlYW5zIHVwIHRoZSBzaGFyZWQgcmVzb3VyY2UuCisgICAgc2hhcmVkX3Jlc291cmNlXyA9IE5VTEw7CisgIH0KKworICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBlYWNoIHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBTZXRVcFRlc3RDYXNlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UsIHNvIGNvdW50ZXJfIHNob3VsZAorICAgIC8vIGFsd2F5cyBiZSAxLgorICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyXyk7CisgIH0KKworICAvLyBOdW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAuCisgIHN0YXRpYyBpbnQgY291bnRlcl87CisKKyAgLy8gU29tZSByZXNvdXJjZSB0byBiZSBzaGFyZWQgYnkgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBzdGF0aWMgY29uc3QgY2hhciogc2hhcmVkX3Jlc291cmNlXzsKK307CisKK2ludCBTZXRVcFRlc3RDYXNlVGVzdDo6Y291bnRlcl8gPSAwOworY29uc3QgY2hhciogU2V0VXBUZXN0Q2FzZVRlc3Q6OnNoYXJlZF9yZXNvdXJjZV8gPSBOVUxMOworCisvLyBBIHRlc3QgdGhhdCB1c2VzIHRoZSBzaGFyZWQgcmVzb3VyY2UuCitURVNUX0YoU2V0VXBUZXN0Q2FzZVRlc3QsIFRlc3QxKSB7CisgIEVYUEVDVF9TVFJORShOVUxMLCBzaGFyZWRfcmVzb3VyY2VfKTsKK30KKworLy8gQW5vdGhlciB0ZXN0IHRoYXQgdXNlcyB0aGUgc2hhcmVkIHJlc291cmNlLgorVEVTVF9GKFNldFVwVGVzdENhc2VUZXN0LCBUZXN0MikgeworICBFWFBFQ1RfU1RSRVEoIjEyMyIsIHNoYXJlZF9yZXNvdXJjZV8pOworfQorCisvLyBUaGUgSW5pdEdvb2dsZVRlc3RUZXN0IHRlc3QgY2FzZSB0ZXN0cyB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpLgorCisvLyBUaGUgRmxhZ3Mgc3RydWN0IHN0b3JlcyBhIGNvcHkgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorc3RydWN0IEZsYWdzIHsKKyAgLy8gQ29uc3RydWN0cyBhIEZsYWdzIHN0cnVjdCB3aGVyZSBlYWNoIGZsYWcgaGFzIGl0cyBkZWZhdWx0IHZhbHVlLgorICBGbGFncygpIDogYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMoZmFsc2UpLAorICAgICAgICAgICAgYnJlYWtfb25fZmFpbHVyZShmYWxzZSksCisgICAgICAgICAgICBjYXRjaF9leGNlcHRpb25zKGZhbHNlKSwKKyAgICAgICAgICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmsoZmFsc2UpLAorICAgICAgICAgICAgZmlsdGVyKCIiKSwKKyAgICAgICAgICAgIGxpc3RfdGVzdHMoZmFsc2UpLAorICAgICAgICAgICAgb3V0cHV0KCIiKSwKKyAgICAgICAgICAgIHByaW50X3RpbWUodHJ1ZSksCisgICAgICAgICAgICByYW5kb21fc2VlZCgwKSwKKyAgICAgICAgICAgIHJlcGVhdCgxKSwKKyAgICAgICAgICAgIHNodWZmbGUoZmFsc2UpLAorICAgICAgICAgICAgc3RhY2tfdHJhY2VfZGVwdGgoa01heFN0YWNrVHJhY2VEZXB0aCksCisgICAgICAgICAgICBzdHJlYW1fcmVzdWx0X3RvKCIiKSwKKyAgICAgICAgICAgIHRocm93X29uX2ZhaWx1cmUoZmFsc2UpIHt9CisKKyAgLy8gRmFjdG9yeSBtZXRob2RzLgorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIEFsc29SdW5EaXNhYmxlZFRlc3RzKGJvb2wgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyA9IGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgQnJlYWtPbkZhaWx1cmUoYm9vbCBicmVha19vbl9mYWlsdXJlKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuYnJlYWtfb25fZmFpbHVyZSA9IGJyZWFrX29uX2ZhaWx1cmU7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBDYXRjaEV4Y2VwdGlvbnMoYm9vbCBjYXRjaF9leGNlcHRpb25zKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuY2F0Y2hfZXhjZXB0aW9ucyA9IGNhdGNoX2V4Y2VwdGlvbnM7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfZGVhdGhfdGVzdF91c2VfZm9yayBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBEZWF0aFRlc3RVc2VGb3JrKGJvb2wgZGVhdGhfdGVzdF91c2VfZm9yaykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmRlYXRoX3Rlc3RfdXNlX2ZvcmsgPSBkZWF0aF90ZXN0X3VzZV9mb3JrOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2ZpbHRlciBmbGFnIGhhcyB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBGaWx0ZXIoY29uc3QgY2hhciogZmlsdGVyKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuZmlsdGVyID0gZmlsdGVyOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2xpc3RfdGVzdHMgZmxhZyBoYXMgdGhlCisgIC8vIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgTGlzdFRlc3RzKGJvb2wgbGlzdF90ZXN0cykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmxpc3RfdGVzdHMgPSBsaXN0X3Rlc3RzOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X291dHB1dCBmbGFnIGhhcyB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBPdXRwdXQoY29uc3QgY2hhciogb3V0cHV0KSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3Mub3V0cHV0ID0gb3V0cHV0OworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3ByaW50X3RpbWUgZmxhZyBoYXMgdGhlIGdpdmVuCisgIC8vIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgUHJpbnRUaW1lKGJvb2wgcHJpbnRfdGltZSkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnByaW50X3RpbWUgPSBwcmludF90aW1lOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3JhbmRvbV9zZWVkIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFJhbmRvbVNlZWQoSW50MzIgcmFuZG9tX3NlZWQpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5yYW5kb21fc2VlZCA9IHJhbmRvbV9zZWVkOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3JlcGVhdCBmbGFnIGhhcyB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBSZXBlYXQoSW50MzIgcmVwZWF0KSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MucmVwZWF0ID0gcmVwZWF0OworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3NodWZmbGUgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgU2h1ZmZsZShib29sIHNodWZmbGUpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5zaHVmZmxlID0gc2h1ZmZsZTsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBTdGFja1RyYWNlRGVwdGgoSW50MzIgc3RhY2tfdHJhY2VfZGVwdGgpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5zdGFja190cmFjZV9kZXB0aCA9IHN0YWNrX3RyYWNlX2RlcHRoOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgU3RyZWFtUmVzdWx0VG8oY29uc3QgY2hhciogc3RyZWFtX3Jlc3VsdF90bykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnN0cmVhbV9yZXN1bHRfdG8gPSBzdHJlYW1fcmVzdWx0X3RvOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgVGhyb3dPbkZhaWx1cmUoYm9vbCB0aHJvd19vbl9mYWlsdXJlKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MudGhyb3dfb25fZmFpbHVyZSA9IHRocm93X29uX2ZhaWx1cmU7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gVGhlc2UgZmllbGRzIHN0b3JlIHRoZSBmbGFnIHZhbHVlcy4KKyAgYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0czsKKyAgYm9vbCBicmVha19vbl9mYWlsdXJlOworICBib29sIGNhdGNoX2V4Y2VwdGlvbnM7CisgIGJvb2wgZGVhdGhfdGVzdF91c2VfZm9yazsKKyAgY29uc3QgY2hhciogZmlsdGVyOworICBib29sIGxpc3RfdGVzdHM7CisgIGNvbnN0IGNoYXIqIG91dHB1dDsKKyAgYm9vbCBwcmludF90aW1lOworICBJbnQzMiByYW5kb21fc2VlZDsKKyAgSW50MzIgcmVwZWF0OworICBib29sIHNodWZmbGU7CisgIEludDMyIHN0YWNrX3RyYWNlX2RlcHRoOworICBjb25zdCBjaGFyKiBzdHJlYW1fcmVzdWx0X3RvOworICBib29sIHRocm93X29uX2ZhaWx1cmU7Cit9OworCisvLyBGaXh0dXJlIGZvciB0ZXN0aW5nIEluaXRHb29nbGVUZXN0KCkuCitjbGFzcyBJbml0R29vZ2xlVGVzdFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBDbGVhcnMgdGhlIGZsYWdzIGJlZm9yZSBlYWNoIHRlc3QuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIiOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IDA7CisgICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gMTsKKyAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBrTWF4U3RhY2tUcmFjZURlcHRoOworICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSAiIjsKKyAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gZmFsc2U7CisgIH0KKworICAvLyBBc3NlcnRzIHRoYXQgdHdvIG5hcnJvdyBvciB3aWRlIHN0cmluZyBhcnJheXMgYXJlIGVxdWFsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CisgIHN0YXRpYyB2b2lkIEFzc2VydFN0cmluZ0FycmF5RXEoc2l6ZV90IHNpemUxLCBDaGFyVHlwZSoqIGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZTIsIENoYXJUeXBlKiogYXJyYXkyKSB7CisgICAgQVNTRVJUX0VRKHNpemUxLCBzaXplMikgPDwgIiBBcnJheSBzaXplcyBkaWZmZXJlbnQuIjsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemUxOyBpKyspIHsKKyAgICAgIEFTU0VSVF9TVFJFUShhcnJheTFbaV0sIGFycmF5MltpXSkgPDwgIiB3aGVyZSBpID09ICIgPDwgaTsKKyAgICB9CisgIH0KKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSBmbGFnIHZhbHVlcyBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWVzLgorICBzdGF0aWMgdm9pZCBDaGVja0ZsYWdzKGNvbnN0IEZsYWdzJiBleHBlY3RlZCkgeworICAgIEVYUEVDVF9FUShleHBlY3RlZC5hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cywKKyAgICAgICAgICAgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5icmVha19vbl9mYWlsdXJlLCBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuY2F0Y2hfZXhjZXB0aW9ucywgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLmRlYXRoX3Rlc3RfdXNlX2ZvcmssIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5maWx0ZXIsIEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQubGlzdF90ZXN0cywgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLm91dHB1dCwgR1RFU1RfRkxBRyhvdXRwdXQpLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5wcmludF90aW1lLCBHVEVTVF9GTEFHKHByaW50X3RpbWUpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucmFuZG9tX3NlZWQsIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucmVwZWF0LCBHVEVTVF9GTEFHKHJlcGVhdCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5zaHVmZmxlLCBHVEVTVF9GTEFHKHNodWZmbGUpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuc3RhY2tfdHJhY2VfZGVwdGgsIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQuc3RyZWFtX3Jlc3VsdF90bywKKyAgICAgICAgICAgICAgICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQudGhyb3dfb25fZmFpbHVyZSwgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSk7CisgIH0KKworICAvLyBQYXJzZXMgYSBjb21tYW5kIGxpbmUgKHNwZWNpZmllZCBieSBhcmdjMSBhbmQgYXJndjEpLCB0aGVuCisgIC8vIHZlcmlmaWVzIHRoYXQgdGhlIGZsYWcgdmFsdWVzIGFyZSBleHBlY3RlZCBhbmQgdGhhdCB0aGUKKyAgLy8gcmVjb2duaXplZCBmbGFncyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KKyAgc3RhdGljIHZvaWQgVGVzdFBhcnNpbmdGbGFncyhpbnQgYXJnYzEsIGNvbnN0IENoYXJUeXBlKiogYXJndjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MyLCBjb25zdCBDaGFyVHlwZSoqIGFyZ3YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsYWdzJiBleHBlY3RlZCwgYm9vbCBzaG91bGRfcHJpbnRfaGVscCkgeworICAgIGNvbnN0IGJvb2wgc2F2ZWRfaGVscF9mbGFnID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Z19oZWxwX2ZsYWc7CisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Z19oZWxwX2ZsYWcgPSBmYWxzZTsKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKyAgICBDYXB0dXJlU3Rkb3V0KCk7CisjZW5kaWYKKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lLgorICAgIGludGVybmFsOjpQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoJmFyZ2MxLCBjb25zdF9jYXN0PENoYXJUeXBlKio+KGFyZ3YxKSk7CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2FwdHVyZWRfc3Rkb3V0ID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKyNlbmRpZgorCisgICAgLy8gVmVyaWZpZXMgdGhlIGZsYWcgdmFsdWVzLgorICAgIENoZWNrRmxhZ3MoZXhwZWN0ZWQpOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgcmVjb2duaXplZCBmbGFncyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjb21tYW5kCisgICAgLy8gbGluZS4KKyAgICBBc3NlcnRTdHJpbmdBcnJheUVxKGFyZ2MxICsgMSwgYXJndjEsIGFyZ2MyICsgMSwgYXJndjIpOworCisgICAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5IHNob3VsZCBuZWl0aGVyIHNldCBnX2hlbHBfZmxhZyBub3IgcHJpbnQgdGhlCisgICAgLy8gaGVscCBtZXNzYWdlIGZvciB0aGUgZmxhZ3MgaXQgcmVjb2duaXplcy4KKyAgICBFWFBFQ1RfRVEoc2hvdWxkX3ByaW50X2hlbHAsIDo6dGVzdGluZzo6aW50ZXJuYWw6OmdfaGVscF9mbGFnKTsKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKyAgICBjb25zdCBjaGFyKiBjb25zdCBleHBlY3RlZF9oZWxwX2ZyYWdtZW50ID0KKyAgICAgICAgIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nIjsKKyAgICBpZiAoc2hvdWxkX3ByaW50X2hlbHApIHsKKyAgICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsIGV4cGVjdGVkX2hlbHBfZnJhZ21lbnQsIGNhcHR1cmVkX3N0ZG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNOb3RTdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2hlbHBfZnJhZ21lbnQsIGNhcHR1cmVkX3N0ZG91dCk7CisgICAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpnX2hlbHBfZmxhZyA9IHNhdmVkX2hlbHBfZmxhZzsKKyAgfQorCisgIC8vIFRoaXMgbWFjcm8gd3JhcHMgVGVzdFBhcnNpbmdGbGFncyBzLnQuIHRoZSB1c2VyIGRvZXNuJ3QgbmVlZAorICAvLyB0byBzcGVjaWZ5IHRoZSBhcnJheSBzaXplcy4KKworI2RlZmluZSBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YxLCBhcmd2MiwgZXhwZWN0ZWQsIHNob3VsZF9wcmludF9oZWxwKSBcCisgIFRlc3RQYXJzaW5nRmxhZ3Moc2l6ZW9mKGFyZ3YxKS9zaXplb2YoKmFyZ3YxKSAtIDEsIGFyZ3YxLCBcCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFyZ3YyKS9zaXplb2YoKmFyZ3YyKSAtIDEsIGFyZ3YyLCBcCisgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIHNob3VsZF9wcmludF9oZWxwKQorfTsKKworLy8gVGVzdHMgcGFyc2luZyBhbiBlbXB0eSBjb21tYW5kIGxpbmUuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBFbXB0eSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzKCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIGNvbW1hbmQgbGluZSB0aGF0IGhhcyBubyBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTm9GbGFnKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFncygpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSBiYWQgLS1ndGVzdF9maWx0ZXIgZmxhZy4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEZpbHRlckJhZCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2ZpbHRlciIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2ZpbHRlciIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoIiIpLCB0cnVlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhbiBlbXB0eSAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyRW1wdHkpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9maWx0ZXI9IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoIiIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSBub24tZW1wdHkgLS1ndGVzdF9maWx0ZXIgZmxhZy4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEZpbHRlck5vbkVtcHR5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyPWFiYyIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6RmlsdGVyKCJhYmMiKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlV2l0aG91dFZhbHVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSIsCisgICAgTlVMTAorfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkJyZWFrT25GYWlsdXJlKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPTAuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBCcmVha09uRmFpbHVyZUZhbHNlXzApIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPTAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkJyZWFrT25GYWlsdXJlKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1mLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVGYWxzZV9mKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1mIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9Ri4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlRmFsc2VfRikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9RiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZyB0aGF0IGhhcyBhICJ0cnVlIgorLy8gZGVmaW5pdGlvbi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlVHJ1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBDYXRjaEV4Y2VwdGlvbnMpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpDYXRjaEV4Y2VwdGlvbnModHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2RlYXRoX3Rlc3RfdXNlX2ZvcmsuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBEZWF0aFRlc3RVc2VGb3JrKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZGVhdGhfdGVzdF91c2VfZm9yayIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6RGVhdGhUZXN0VXNlRm9yayh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgdGhlIHNhbWUgZmxhZyB0d2ljZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuICBUaGUKKy8vIGV4cGVjdGVkIGJlaGF2aW9yIGlzIHRoYXQgdGhlIG9uZSBjb21pbmcgbGFzdCB0YWtlcyBwcmVjZWRlbmNlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRHVwbGljYXRlZEZsYWdzKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyPWEiLAorICAgICItLWd0ZXN0X2ZpbHRlcj1iIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoImIiKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYW4gdW5yZWNvZ25pemVkIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFVucmVjb2duaXplZEZsYWcpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKKyAgICAiYmFyIiwgIC8vIFVucmVjb2duaXplZCBieSBHb29nbGUgVGVzdC4KKyAgICAiLS1ndGVzdF9maWx0ZXI9YiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgICJiYXIiLAorICAgIE5VTEwKKyAgfTsKKworICBGbGFncyBmbGFnczsKKyAgZmxhZ3MuYnJlYWtfb25fZmFpbHVyZSA9IHRydWU7CisgIGZsYWdzLmZpbHRlciA9ICJiIjsKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgZmxhZ3MsIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIExpc3RUZXN0c0ZsYWcpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9saXN0X3Rlc3RzIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Okxpc3RUZXN0cyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3aXRoIGEgInRydWUiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNUcnVlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz0xIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Okxpc3RUZXN0cyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3aXRoIGEgImZhbHNlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmFsc2UpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9saXN0X3Rlc3RzPTAiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfbGlzdF90ZXN0cz1mLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmFsc2VfZikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2xpc3RfdGVzdHM9ZiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfbGlzdF90ZXN0cz1GLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmFsc2VfRikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2xpc3RfdGVzdHM9RiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfb3V0cHV0IChpbnZhbGlkKS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dEVtcHR5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfb3V0cHV0IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfb3V0cHV0IiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3MoKSwgdHJ1ZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQ9eG1sCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBPdXRwdXRYbWwpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQ9eG1sIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpPdXRwdXQoInhtbCIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQ9eG1sOmZpbGUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dFhtbEZpbGUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQ9eG1sOmZpbGUiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Ok91dHB1dCgieG1sOmZpbGUiKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfb3V0cHV0PXhtbDpkaXJlY3RvcnkvcGF0aC8KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dFhtbERpcmVjdG9yeSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X291dHB1dD14bWw6ZGlyZWN0b3J5L3BhdGgvIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6Ok91dHB1dCgieG1sOmRpcmVjdG9yeS9wYXRoLyIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfcHJpbnRfdGltZSBmbGFnCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBQcmludFRpbWVGbGFnKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfcHJpbnRfdGltZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpQcmludFRpbWUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9wcmludF90aW1lIGZsYWcgd2l0aCBhICJ0cnVlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lVHJ1ZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X3ByaW50X3RpbWU9MSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpQcmludFRpbWUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9wcmludF90aW1lIGZsYWcgd2l0aCBhICJmYWxzZSIgdmFsdWUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZhbHNlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfcHJpbnRfdGltZT0wIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3ByaW50X3RpbWU9Zi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZhbHNlX2YpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9wcmludF90aW1lPWYiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3ByaW50X3RpbWU9Ri4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZhbHNlX0YpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9wcmludF90aW1lPUYiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3JhbmRvbV9zZWVkPW51bWJlcgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUmFuZG9tU2VlZCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3JhbmRvbV9zZWVkPTEwMDAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlJhbmRvbVNlZWQoMTAwMCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3JlcGVhdD1udW1iZXIKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFJlcGVhdCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3JlcGVhdD0xMDAwIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpSZXBlYXQoMTAwMCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHModHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIHdpdGggYSAidHJ1ZSIgdmFsdWUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEFsc29SdW5EaXNhYmxlZFRlc3RzVHJ1ZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzPTEiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6OkFsc29SdW5EaXNhYmxlZFRlc3RzKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZyB3aXRoIGEgImZhbHNlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQWxzb1J1bkRpc2FibGVkVGVzdHNGYWxzZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzPTAiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6OkFsc29SdW5EaXNhYmxlZFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfc2h1ZmZsZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFNodWZmbGVXaXRob3V0VmFsdWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zaHVmZmxlIiwKKyAgICBOVUxMCit9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6U2h1ZmZsZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfc2h1ZmZsZT0wLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZUZhbHNlXzApIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zaHVmZmxlPTAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlNodWZmbGUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSAtLWd0ZXN0X3NodWZmbGUgZmxhZyB0aGF0IGhhcyBhICJ0cnVlIgorLy8gZGVmaW5pdGlvbi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFNodWZmbGVUcnVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfc2h1ZmZsZT0xIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpTaHVmZmxlKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zdGFja190cmFjZV9kZXB0aD1udW1iZXIuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTdGFja1RyYWNlRGVwdGgpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zdGFja190cmFjZV9kZXB0aD01IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpTdGFja1RyYWNlRGVwdGgoNSksIGZhbHNlKTsKK30KKworVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU3RyZWFtUmVzdWx0VG8pIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zdHJlYW1fcmVzdWx0X3RvPWxvY2FsaG9zdDoxMjM0IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oCisgICAgICBhcmd2LCBhcmd2MiwgRmxhZ3M6OlN0cmVhbVJlc3VsdFRvKCJsb2NhbGhvc3Q6MTIzNCIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVXaXRob3V0VmFsdWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlIiwKKyAgICBOVUxMCit9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6VGhyb3dPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmU9MC4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFRocm93T25GYWlsdXJlRmFsc2VfMCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmU9MCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6VGhyb3dPbkZhaWx1cmUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUgZmxhZyB0aGF0IGhhcyBhICJ0cnVlIgorLy8gZGVmaW5pdGlvbi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFRocm93T25GYWlsdXJlVHJ1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmU9MSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6VGhyb3dPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHBhcnNpbmcgd2lkZSBzdHJpbmdzLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgV2lkZVN0cmluZ3MpIHsKKyAgY29uc3Qgd2NoYXJfdCogYXJndltdID0geworICAgIEwiZm9vLmV4ZSIsCisgICAgTCItLWd0ZXN0X2ZpbHRlcj1Gb28qIiwKKyAgICBMIi0tZ3Rlc3RfbGlzdF90ZXN0cz0xIiwKKyAgICBMIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSIsCisgICAgTCItLW5vbl9ndGVzdF9mbGFnIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3Qgd2NoYXJfdCogYXJndjJbXSA9IHsKKyAgICBMImZvby5leGUiLAorICAgIEwiLS1ub25fZ3Rlc3RfZmxhZyIsCisgICAgTlVMTAorICB9OworCisgIEZsYWdzIGV4cGVjdGVkX2ZsYWdzOworICBleHBlY3RlZF9mbGFncy5icmVha19vbl9mYWlsdXJlID0gdHJ1ZTsKKyAgZXhwZWN0ZWRfZmxhZ3MuZmlsdGVyID0gIkZvbyoiOworICBleHBlY3RlZF9mbGFncy5saXN0X3Rlc3RzID0gdHJ1ZTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBleHBlY3RlZF9mbGFncywgZmFsc2UpOworfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIGN1cnJlbnRfdGVzdF9pbmZvKCkgaW4gVW5pdFRlc3QuCitjbGFzcyBDdXJyZW50VGVzdEluZm9UZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gVGVzdHMgdGhhdCBjdXJyZW50X3Rlc3RfaW5mbygpIHJldHVybnMgTlVMTCBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgaW4KKyAgLy8gdGhlIHRlc3QgY2FzZSBpcyBydW4uCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIHRlc3RzIHJ1bm5pbmcgYXQgdGhpcyBwb2ludC4KKyAgICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfaW5mbyA9PSBOVUxMKQorICAgICAgICA8PCAiVGhlcmUgc2hvdWxkIGJlIG5vIHRlc3RzIHJ1bm5pbmcgYXQgdGhpcyBwb2ludC4iOworICB9CisKKyAgLy8gVGVzdHMgdGhhdCBjdXJyZW50X3Rlc3RfaW5mbygpIHJldHVybnMgTlVMTCBhZnRlciB0aGUgbGFzdCB0ZXN0IGluCisgIC8vIHRoZSB0ZXN0IGNhc2UgaGFzIHJ1bi4KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfaW5mbyA9PSBOVUxMKQorICAgICAgICA8PCAiVGhlcmUgc2hvdWxkIGJlIG5vIHRlc3RzIHJ1bm5pbmcgYXQgdGhpcyBwb2ludC4iOworICB9Cit9OworCisvLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBUZXN0SW5mbyBmb3IgY3VycmVudGx5IHJ1bm5pbmcKKy8vIHRlc3QgYnkgY2hlY2tpbmcgdGhlIGV4cGVjdGVkIHRlc3QgbmFtZSBhZ2FpbnN0IHRoZSBhY3R1YWwgb25lLgorVEVTVF9GKEN1cnJlbnRUZXN0SW5mb1Rlc3QsIFdvcmtzRm9yRmlyc3RUZXN0SW5BVGVzdENhc2UpIHsKKyAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbyA9CisgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gdGVzdF9pbmZvKQorICAgICAgPDwgIlRoZXJlIGlzIGEgdGVzdCBydW5uaW5nIHNvIHdlIHNob3VsZCBoYXZlIGEgdmFsaWQgVGVzdEluZm8uIjsKKyAgRVhQRUNUX1NUUkVRKCJDdXJyZW50VGVzdEluZm9UZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKQorICAgICAgPDwgIkV4cGVjdGVkIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0IGNhc2UuIjsKKyAgRVhQRUNUX1NUUkVRKCJXb3Jrc0ZvckZpcnN0VGVzdEluQVRlc3RDYXNlIiwgdGVzdF9pbmZvLT5uYW1lKCkpCisgICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuIjsKK30KKworLy8gVGVzdHMgdGhhdCBjdXJyZW50X3Rlc3RfaW5mbygpIHJldHVybnMgVGVzdEluZm8gZm9yIGN1cnJlbnRseSBydW5uaW5nCisvLyB0ZXN0IGJ5IGNoZWNraW5nIHRoZSBleHBlY3RlZCB0ZXN0IG5hbWUgYWdhaW5zdCB0aGUgYWN0dWFsIG9uZS4gIFdlCisvLyB1c2UgdGhpcyB0ZXN0IHRvIHNlZSB0aGF0IHRoZSBUZXN0SW5mbyBvYmplY3QgYWN0dWFsbHkgY2hhbmdlZCBmcm9tCisvLyB0aGUgcHJldmlvdXMgaW52b2NhdGlvbi4KK1RFU1RfRihDdXJyZW50VGVzdEluZm9UZXN0LCBXb3Jrc0ZvclNlY29uZFRlc3RJbkFUZXN0Q2FzZSkgeworICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KKyAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSB0ZXN0X2luZm8pCisgICAgICA8PCAiVGhlcmUgaXMgYSB0ZXN0IHJ1bm5pbmcgc28gd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBUZXN0SW5mby4iOworICBFWFBFQ1RfU1RSRVEoIkN1cnJlbnRUZXN0SW5mb1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpCisgICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QgY2FzZS4iOworICBFWFBFQ1RfU1RSRVEoIldvcmtzRm9yU2Vjb25kVGVzdEluQVRlc3RDYXNlIiwgdGVzdF9pbmZvLT5uYW1lKCkpCisgICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gVGhlc2UgdHdvIGxpbmVzIHRlc3QgdGhhdCB3ZSBjYW4gZGVmaW5lIHRlc3RzIGluIGEgbmFtZXNwYWNlIHRoYXQKKy8vIGhhcyB0aGUgbmFtZSAidGVzdGluZyIgYW5kIGlzIG5lc3RlZCBpbiBhbm90aGVyIG5hbWVzcGFjZS4KK25hbWVzcGFjZSBteV9uYW1lc3BhY2UgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBNYWtlcyBzdXJlIHRoYXQgVEVTVCBrbm93cyB0byB1c2UgOjp0ZXN0aW5nOjpUZXN0IGluc3RlYWQgb2YKKy8vIDo6bXlfbmFtZXNwYWNlOjp0ZXN0aW5nOjpUZXN0LgorY2xhc3MgVGVzdCB7fTsKKworLy8gTWFrZXMgc3VyZSB0aGF0IGFuIGFzc2VydGlvbiBrbm93cyB0byB1c2UgOjp0ZXN0aW5nOjpNZXNzYWdlIGluc3RlYWQgb2YKKy8vIDo6bXlfbmFtZXNwYWNlOjp0ZXN0aW5nOjpNZXNzYWdlLgorY2xhc3MgTWVzc2FnZSB7fTsKKworLy8gTWFrZXMgc3VyZSB0aGF0IGFuIGFzc2VydGlvbiBrbm93cyB0byB1c2UKKy8vIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGluc3RlYWQgb2YKKy8vIDo6bXlfbmFtZXNwYWNlOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQuCitjbGFzcyBBc3NlcnRpb25SZXN1bHQge307CisKKy8vIFRlc3RzIHRoYXQgYW4gYXNzZXJ0aW9uIHRoYXQgc2hvdWxkIHN1Y2NlZWQgd29ya3MgYXMgZXhwZWN0ZWQuCitURVNUKE5lc3RlZFRlc3RpbmdOYW1lc3BhY2VUZXN0LCBTdWNjZXNzKSB7CisgIEVYUEVDVF9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworfQorCisvLyBUZXN0cyB0aGF0IGFuIGFzc2VydGlvbiB0aGF0IHNob3VsZCBmYWlsIHdvcmtzIGFzIGV4cGVjdGVkLgorVEVTVChOZXN0ZWRUZXN0aW5nTmFtZXNwYWNlVGVzdCwgRmFpbHVyZSkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIG15X25hbWVzcGFjZQorCisvLyBUZXN0cyB0aGF0IG9uZSBjYW4gY2FsbCBzdXBlcmNsYXNzIFNldFVwIGFuZCBUZWFyRG93biBtZXRob2RzLS0KKy8vIHRoYXQgaXMsIHRoYXQgdGhleSBhcmUgbm90IHByaXZhdGUuCisvLyBObyB0ZXN0cyBhcmUgYmFzZWQgb24gdGhpcyBmaXh0dXJlOyB0aGUgdGVzdCAicGFzc2VzIiBpZiBpdCBjb21waWxlcworLy8gc3VjY2Vzc2Z1bGx5LgorY2xhc3MgUHJvdGVjdGVkRml4dHVyZU1ldGhvZHNUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIFRlc3Q6OlNldFVwKCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIFRlc3Q6OlRlYXJEb3duKCk7CisgIH0KK307CisKKy8vIFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0IHRlc3RzIHRoZSBzdHJlYW1pbmcgdmVyc2lvbnMgb2YgYSByZXByZXNlbnRhdGl2ZQorLy8gc2FtcGxlIG9mIGFzc2VydGlvbnMuCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBVbmNvbmRpdGlvbmFsKSB7CisgIFNVQ0NFRUQoKSA8PCAiZXhwZWN0ZWQgc3VjY2VzcyI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFERF9GQUlMVVJFKCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjaWZkZWYgX19CT1JMQU5EQ19fCisvLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsICJVbnJlYWNoYWJsZSBjb2RlIgorIyBwcmFnbWEgb3B0aW9uIHB1c2ggLXctY2NjIC13LXJjaAorI2VuZGlmCisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFRydXRoKSB7CisgIEVYUEVDVF9UUlVFKHRydWUpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfVFJVRSh0cnVlKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoZmFsc2UpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgVHJ1dGgyKSB7CisgIEVYUEVDVF9GQUxTRShmYWxzZSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9GQUxTRShmYWxzZSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSh0cnVlKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRSh0cnVlKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXByZXNzZWQgdGhlbQorIyBwcmFnbWEgb3B0aW9uIHBvcAorI2VuZGlmCisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEludGVnZXJFcXVhbHMpIHsKKyAgRVhQRUNUX0VRKDEsIDEpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfRVEoMSwgMSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgxLCAyKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSgxLCAyKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEludGVnZXJMZXNzVGhhbikgeworICBFWFBFQ1RfTFQoMSwgMikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9MVCgxLCAyKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDIsIDEpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0xUKDIsIDEpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgU3RyaW5nc0VxdWFsKSB7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiwgImZvbyIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfU1RSRVEoImZvbyIsICJmb28iKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkVRKCJmb28iLCAiYmFyIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFN0cmluZ3NOb3RFcXVhbCkgeworICBFWFBFQ1RfU1RSTkUoImZvbyIsICJiYXIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX1NUUk5FKCJmb28iLCAiYmFyIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORSgiZm9vIiwgImZvbyIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUk5FKCJmb28iLCAiZm9vIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBTdHJpbmdzRXF1YWxJZ25vcmluZ0Nhc2UpIHsKKyAgRVhQRUNUX1NUUkNBU0VFUSgiZm9vIiwgIkZPTyIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfU1RSQ0FTRUVRKCJmb28iLCAiRk9PIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJDQVNFRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFN0cmluZ05vdEVxdWFsSWdub3JpbmdDYXNlKSB7CisgIEVYUEVDVF9TVFJDQVNFTkUoImZvbyIsICJiYXIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX1NUUkNBU0VORSgiZm9vIiwgImJhciIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSQ0FTRU5FKCJmb28iLCAiRk9PIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRU5FKCJiYXIiLCAiQkFSIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBGbG9hdGluZ1BvaW50RXF1YWxzKSB7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjAsIDEuMCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9GTE9BVF9FUSgxLjAsIDEuMCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSgwLjAsIDEuMCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkxPQVRfRVEoMC4wLCAxLjApIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFRocm93KSB7CisgIEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgaW50KSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGJvb2wpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGJvb2wpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgTm9UaHJvdykgeworICBFWFBFQ1RfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBBbnlUaHJvdykgeworICBFWFBFQ1RfQU5ZX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfQU5ZX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGNvcnJlY3RseSBkZWNpZGVzIHdoZXRoZXIgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorCitURVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzQ29sb3JzV2hlbkdUZXN0Q29sb3JGbGFnSXNZZXMpIHsKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAieWVzIjsKKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJkdW1iIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCit9CisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuR1Rlc3RDb2xvckZsYWdJc0FsaWFzT2ZZZXMpIHsKKyAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJUcnVlIjsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAidCI7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorCisgIEdURVNUX0ZMQUcoY29sb3IpID0gIjEiOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KK30KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc05vQ29sb3JXaGVuR1Rlc3RDb2xvckZsYWdJc05vKSB7CisgIEdURVNUX0ZMQUcoY29sb3IpID0gIm5vIjsKKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorfQorCitURVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzTm9Db2xvcldoZW5HVGVzdENvbG9yRmxhZ0lzSW52YWxpZCkgeworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorCisgIEdURVNUX0ZMQUcoY29sb3IpID0gIkYiOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIEdURVNUX0ZMQUcoY29sb3IpID0gIjAiOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIEdURVNUX0ZMQUcoY29sb3IpID0gInVua25vd24iOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorfQorCitURVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzQ29sb3JzV2hlblN0ZG91dElzVHR5KSB7CisgIEdURVNUX0ZMQUcoY29sb3IpID0gImF1dG8iOworCisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgICAvLyBTdGRvdXQgaXMgYSBUVFkuCit9CisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuVGVybVN1cHBvcnRzQ29sb3JzKSB7CisgIEdURVNUX0ZMQUcoY29sb3IpID0gImF1dG8iOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBPbiBXaW5kb3dzLCB3ZSBpZ25vcmUgdGhlIFRFUk0gdmFyaWFibGUgYXMgaXQncyB1c3VhbGx5IG5vdCBzZXQuCisKKyAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICIiKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisjZWxzZQorICAvLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHdlIHJlbHkgb24gVEVSTSB0byBkZXRlcm1pbmUgaWYgdGhlCisgIC8vIHRlcm1pbmFsIHN1cHBvcnRzIGNvbG9ycy4KKworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJlbWFjcyIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJ2dDEwMCIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJ4dGVybS1tb25vIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJ4dGVybS1jb2xvciIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0tMjU2Y29sb3IiKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInNjcmVlbiIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAic2NyZWVuLTI1NmNvbG9yIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJsaW51eCIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiY3lnd2luIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKy8vIFZlcmlmaWVzIHRoYXQgU3RhdGljQXNzZXJ0VHlwZUVxIHdvcmtzIGluIGEgbmFtZXNwYWNlIHNjb3BlLgorCitzdGF0aWMgYm9vbCBkdW1teTEgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBTdGF0aWNBc3NlcnRUeXBlRXE8Ym9vbCwgYm9vbD4oKTsKK3N0YXRpYyBib29sIGR1bW15MiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9CisgICAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IGludCwgY29uc3QgaW50PigpOworCisvLyBWZXJpZmllcyB0aGF0IFN0YXRpY0Fzc2VydFR5cGVFcSB3b3JrcyBpbiBhIGNsYXNzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFN0YXRpY0Fzc2VydFR5cGVFcVRlc3RIZWxwZXIgeworIHB1YmxpYzoKKyAgU3RhdGljQXNzZXJ0VHlwZUVxVGVzdEhlbHBlcigpIHsgU3RhdGljQXNzZXJ0VHlwZUVxPGJvb2wsIFQ+KCk7IH0KK307CisKK1RFU1QoU3RhdGljQXNzZXJ0VHlwZUVxVGVzdCwgV29ya3NJbkNsYXNzKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcVRlc3RIZWxwZXI8Ym9vbD4oKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBTdGF0aWNBc3NlcnRUeXBlRXEgd29ya3MgaW5zaWRlIGEgZnVuY3Rpb24uCisKK3R5cGVkZWYgaW50IEludEFsaWFzOworCitURVNUKFN0YXRpY0Fzc2VydFR5cGVFcVRlc3QsIENvbXBpbGVzRm9yRXF1YWxUeXBlcykgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBJbnRBbGlhcz4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCosIEludEFsaWFzKj4oKTsKK30KKworVEVTVChHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wVGVzdCwgUmV0dXJuc1RoZVN0YWNrVHJhY2UpIHsKKyAgdGVzdGluZzo6VW5pdFRlc3QqIGNvbnN0IHVuaXRfdGVzdCA9IHRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgIC8vIFdlIGRvbid0IGhhdmUgYSBzdGFjayB3YWxrZXIgaW4gR29vZ2xlIFRlc3QgeWV0LgorICBFWFBFQ1RfU1RSRVEoIiIsIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AodW5pdF90ZXN0LCAwKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKHVuaXRfdGVzdCwgMSkuY19zdHIoKSk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRoZXJlSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBTFNFKEhhc05vbmZhdGFsRmFpbHVyZSgpKTsKK30KKworc3RhdGljIHZvaWQgRmFpbEZhdGFsbHkoKSB7IEZBSUwoKTsgfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5UaGVyZUlzT25seUZhdGFsRmFpbHVyZSkgeworICBGYWlsRmF0YWxseSgpOworICBjb25zdCBib29sIGhhc19ub25mYXRhbF9mYWlsdXJlID0gSGFzTm9uZmF0YWxGYWlsdXJlKCk7CisgIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOworICBFWFBFQ1RfRkFMU0UoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlSXNOb25mYXRhbEZhaWx1cmUpIHsKKyAgQUREX0ZBSUxVUkUoKTsKKyAgY29uc3QgYm9vbCBoYXNfbm9uZmF0YWxfZmFpbHVyZSA9IEhhc05vbmZhdGFsRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlQXJlRmF0YWxBbmROb25mYXRhbEZhaWx1cmVzKSB7CisgIEZhaWxGYXRhbGx5KCk7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmUoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKK30KKworLy8gQSB3cmFwcGVyIGZvciBjYWxsaW5nIEhhc05vbmZhdGFsRmFpbHVyZSBvdXRzaWRlIG9mIGEgdGVzdCBib2R5Lgorc3RhdGljIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlSGVscGVyKCkgeworICByZXR1cm4gdGVzdGluZzo6VGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgV29ya3NPdXRzaWRlT2ZUZXN0Qm9keSkgeworICBFWFBFQ1RfRkFMU0UoSGFzTm9uZmF0YWxGYWlsdXJlSGVscGVyKCkpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFdvcmtzT3V0c2lkZU9mVGVzdEJvZHkyKSB7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKK30KKworVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRoZXJlSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBTFNFKEhhc0ZhaWx1cmUoKSk7Cit9CisKK1RFU1QoSGFzRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlSXNGYXRhbEZhaWx1cmUpIHsKKyAgRmFpbEZhdGFsbHkoKTsKKyAgY29uc3QgYm9vbCBoYXNfZmFpbHVyZSA9IEhhc0ZhaWx1cmUoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19mYWlsdXJlKTsKK30KKworVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuVGhlcmVJc05vbmZhdGFsRmFpbHVyZSkgeworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5UaGVyZUFyZUZhdGFsQW5kTm9uZmF0YWxGYWlsdXJlcykgeworICBGYWlsRmF0YWxseSgpOworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCisvLyBBIHdyYXBwZXIgZm9yIGNhbGxpbmcgSGFzRmFpbHVyZSBvdXRzaWRlIG9mIGEgdGVzdCBib2R5Lgorc3RhdGljIGJvb2wgSGFzRmFpbHVyZUhlbHBlcigpIHsgcmV0dXJuIHRlc3Rpbmc6OlRlc3Q6Okhhc0ZhaWx1cmUoKTsgfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5KSB7CisgIEVYUEVDVF9GQUxTRShIYXNGYWlsdXJlSGVscGVyKCkpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5MikgeworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZUhlbHBlcigpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCitjbGFzcyBUZXN0TGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBUZXN0TGlzdGVuZXIoKSA6IG9uX3N0YXJ0X2NvdW50ZXJfKE5VTEwpLCBpc19kZXN0cm95ZWRfKE5VTEwpIHt9CisgIFRlc3RMaXN0ZW5lcihpbnQqIG9uX3N0YXJ0X2NvdW50ZXIsIGJvb2wqIGlzX2Rlc3Ryb3llZCkKKyAgICAgIDogb25fc3RhcnRfY291bnRlcl8ob25fc3RhcnRfY291bnRlciksCisgICAgICAgIGlzX2Rlc3Ryb3llZF8oaXNfZGVzdHJveWVkKSB7fQorCisgIHZpcnR1YWwgflRlc3RMaXN0ZW5lcigpIHsKKyAgICBpZiAoaXNfZGVzdHJveWVkXykKKyAgICAgICppc19kZXN0cm95ZWRfID0gdHJ1ZTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgaWYgKG9uX3N0YXJ0X2NvdW50ZXJfICE9IE5VTEwpCisgICAgICAoKm9uX3N0YXJ0X2NvdW50ZXJfKSsrOworICB9CisKKyBwcml2YXRlOgorICBpbnQqIG9uX3N0YXJ0X2NvdW50ZXJfOworICBib29sKiBpc19kZXN0cm95ZWRfOworfTsKKworLy8gVGVzdHMgdGhlIGNvbnN0cnVjdG9yLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBDb25zdHJ1Y3Rpb25Xb3JrcykgeworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworCisgIEVYUEVDVF9UUlVFKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKSAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpID09IE5VTEwpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBUZXN0RXZlbnRMaXN0ZW5lcnMgZGVzdHJ1Y3RvciBkZWxldGVzIGFsbCB0aGUgbGlzdGVuZXJzIGl0CisvLyBvd25zLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBEZXN0cnVjdGlvbldvcmtzKSB7CisgIGJvb2wgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl9pc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgYm9vbCBkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBib29sIGV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBUZXN0TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgPSBuZXcgVGVzdExpc3RlbmVyKAorICAgICAgTlVMTCwgJmRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfaXNfZGVzdHJveWVkKTsKKyAgVGVzdExpc3RlbmVyKiBkZWZhdWx0X3htbF9wcmludGVyID0gbmV3IFRlc3RMaXN0ZW5lcigKKyAgICAgIE5VTEwsICZkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7CisgIFRlc3RMaXN0ZW5lciogZXh0cmFfbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKAorICAgICAgTlVMTCwgJmV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCk7CisKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIpOworICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF94bWxfcHJpbnRlcik7CisgICAgbGlzdGVuZXJzLkFwcGVuZChleHRyYV9saXN0ZW5lcik7CisgIH0KKyAgRVhQRUNUX1RSVUUoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl9pc19kZXN0cm95ZWQpOworICBFWFBFQ1RfVFJVRShkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7CisgIEVYUEVDVF9UUlVFKGV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciBBcHBlbmQnZWQgdG8gYSBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdCBzdGFydHMKKy8vIHJlY2VpdmluZyBldmVudHMuCitURVNUKFRlc3RFdmVudExpc3RlbmVyc1Rlc3QsIEFwcGVuZCkgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgbGlzdGVuZXJzLkFwcGVuZChsaXN0ZW5lcik7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworICB9CisgIEVYUEVDVF9UUlVFKGlzX2Rlc3Ryb3llZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbGlzdGVuZXJzIHJlY2VpdmUgZXZlbnRzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYXBwZW5kZWQgdG8KKy8vIHRoZSBsaXN0LCBleGNlcHQgZm9yICpFbmQgcmVxdWVzdHMsIHdoaWNoIG11c3QgYmUgcmVjZWl2ZWQgaW4gdGhlIHJldmVyc2UKKy8vIG9yZGVyLgorY2xhc3MgU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHZlY3RvciwgY29uc3QgY2hhciogaWQpCisgICAgICA6IHZlY3Rvcl8odmVjdG9yKSwgaWRfKGlkKSB7fQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgdmVjdG9yXy0+cHVzaF9iYWNrKEdldEV2ZW50RGVzY3JpcHRpb24oIk9uVGVzdFByb2dyYW1TdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgdmVjdG9yXy0+cHVzaF9iYWNrKEdldEV2ZW50RGVzY3JpcHRpb24oIk9uVGVzdFByb2dyYW1FbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICAgIHZlY3Rvcl8tPnB1c2hfYmFjayhHZXRFdmVudERlc2NyaXB0aW9uKCJPblRlc3RJdGVyYXRpb25TdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyAgICB2ZWN0b3JfLT5wdXNoX2JhY2soR2V0RXZlbnREZXNjcmlwdGlvbigiT25UZXN0SXRlcmF0aW9uRW5kIikpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBHZXRFdmVudERlc2NyaXB0aW9uKGNvbnN0IGNoYXIqIG1ldGhvZCkgeworICAgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlIDw8IGlkXyA8PCAiLiIgPDwgbWV0aG9kOworICAgIHJldHVybiBtZXNzYWdlLkdldFN0cmluZygpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB2ZWN0b3JfOworICBjb25zdCBjaGFyKiBjb25zdCBpZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcik7Cit9OworCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBBcHBlbmRLZWVwc09yZGVyKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2ZWM7CisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKCZ2ZWMsICIxc3QiKSk7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKCZ2ZWMsICIybmQiKSk7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKCZ2ZWMsICIzcmQiKSk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICBBU1NFUlRfRVEoM1UsIHZlYy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIjFzdC5PblRlc3RQcm9ncmFtU3RhcnQiLCB2ZWNbMF0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMm5kLk9uVGVzdFByb2dyYW1TdGFydCIsIHZlY1sxXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0UHJvZ3JhbVN0YXJ0IiwgdmVjWzJdLmNfc3RyKCkpOworCisgIHZlYy5jbGVhcigpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1FbmQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICBBU1NFUlRfRVEoM1UsIHZlYy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIjNyZC5PblRlc3RQcm9ncmFtRW5kIiwgdmVjWzBdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RQcm9ncmFtRW5kIiwgdmVjWzFdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjFzdC5PblRlc3RQcm9ncmFtRW5kIiwgdmVjWzJdLmNfc3RyKCkpOworCisgIHZlYy5jbGVhcigpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLCAwKTsKKyAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0SXRlcmF0aW9uU3RhcnQiLCB2ZWNbMF0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMm5kLk9uVGVzdEl0ZXJhdGlvblN0YXJ0IiwgdmVjWzFdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjNyZC5PblRlc3RJdGVyYXRpb25TdGFydCIsIHZlY1syXS5jX3N0cigpKTsKKworICB2ZWMuY2xlYXIoKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RJdGVyYXRpb25FbmQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCksIDApOworICBBU1NFUlRfRVEoM1UsIHZlYy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIjNyZC5PblRlc3RJdGVyYXRpb25FbmQiLCB2ZWNbMF0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMm5kLk9uVGVzdEl0ZXJhdGlvbkVuZCIsIHZlY1sxXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0SXRlcmF0aW9uRW5kIiwgdmVjWzJdLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbGlzdGVuZXIgcmVtb3ZlZCBmcm9tIGEgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3Qgc3RvcHMgcmVjZWl2aW5nCisvLyBldmVudHMgYW5kIGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxpc3QgaXMgZGVzdHJveWVkLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBSZWxlYXNlKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgLy8gQWx0aG91Z2ggQXBwZW5kIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IHRvIHRoZSBsaXN0LAorICAvLyB0aGUgZm9sbG93aW5nIGNhbGxzIHJlbGVhc2UgaXQsIGFuZCB3ZSBuZWVkIHRvIGRlbGV0ZSBpdCBiZWZvcmUgdGhlCisgIC8vIHRlc3QgZW5kcy4KKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworICB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgICBsaXN0ZW5lcnMuQXBwZW5kKGxpc3RlbmVyKTsKKyAgICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSk7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXIpID09IE5VTEwpOworICB9CisgIEVYUEVDVF9FUSgwLCBvbl9zdGFydF9jb3VudGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2Rlc3Ryb3llZCk7CisgIGRlbGV0ZSBsaXN0ZW5lcjsKK30KKworLy8gVGVzdHMgdGhhdCBubyBldmVudHMgYXJlIGZvcndhcmRlZCB3aGVuIGV2ZW50IGZvcndhcmRpbmcgaXMgZGlzYWJsZWQuCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZykgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCBOVUxMKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICBsaXN0ZW5lcnMuQXBwZW5kKGxpc3RlbmVyKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQobGlzdGVuZXJzKSk7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygmbGlzdGVuZXJzKTsKKyAgQVNTRVJUX0ZBTFNFKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKGxpc3RlbmVycykpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgIEVYUEVDVF9FUSgwLCBvbl9zdGFydF9jb3VudGVyKTsKK30KKworLy8gVGVzdHMgdGhhdCBldmVudHMgZ2VuZXJhdGVkIGJ5IEdvb2dsZSBUZXN0IGFyZSBub3QgZm9yd2FyZGVkIGluCisvLyBkZWF0aCB0ZXN0IHN1YnByb2Nlc3Nlcy4KK1RFU1QoRXZlbnRMaXN0ZW5lckRlYXRoVGVzdCwgRXZlbnRzTm90Rm9yd2FyZGVkSW5EZWF0aFRlc3RTdWJwcmVjZXNzZXMpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7CisgICAgICBHVEVTVF9DSEVDS18oVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoCisgICAgICAgICAgKkdldFVuaXRUZXN0SW1wbCgpLT5saXN0ZW5lcnMoKSkpIDw8ICJleHBlY3RlZCBmYWlsdXJlIjt9LAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGxpc3RlbmVyIGluc3RhbGxlZCB2aWEgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoKSBzdGFydHMKKy8vIHJlY2VpdmluZyBldmVudHMgYW5kIGlzIHJldHVybmVkIHZpYSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgYW5kIHRoYXQKKy8vIHRoZSBwcmV2aW91cyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhbmQgZGVsZXRlZC4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKworICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkpOworCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKworICBFWFBFQ1RfRVEoMSwgb25fc3RhcnRfY291bnRlcik7CisKKyAgLy8gUmVwbGFjaW5nIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgd2l0aCBzb21ldGhpbmcgZWxzZSBzaG91bGQgcmVtb3ZlIGl0CisgIC8vIGZyb20gdGhlIGxpc3QgYW5kIGRlc3Ryb3kgaXQuCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigmbGlzdGVuZXJzLCBOVUxMKTsKKworICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShpc19kZXN0cm95ZWQpOworCisgIC8vIEFmdGVyIGJyb2FkY2FzdGluZyBhbiBldmVudCB0aGUgY291bnRlciBpcyBzdGlsbCB0aGUgc2FtZSwgaW5kaWNhdGluZworICAvLyB0aGUgbGlzdGVuZXIgaXMgbm90IGluIHRoZSBsaXN0IGFueW1vcmUuCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGxpc3RlbmVyIHN0b3BzIHJlY2VpdmluZyBldmVudHMKKy8vIHdoZW4gcmVtb3ZlZCB2aWEgUmVsZWFzZSBhbmQgdGhhdCBpcyBub3Qgb3duZWQgYnkgdGhlIGxpc3QgYW55bW9yZS4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIFJlbW92aW5nRGVmYXVsdFJlc3VsdFByaW50ZXJXb3JrcykgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIC8vIEFsdGhvdWdoIEFwcGVuZCBwYXNzZXMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCB0byB0aGUgbGlzdCwKKyAgLy8gdGhlIGZvbGxvd2luZyBjYWxscyByZWxlYXNlIGl0LCBhbmQgd2UgbmVlZCB0byBkZWxldGUgaXQgYmVmb3JlIHRoZQorICAvLyB0ZXN0IGVuZHMuCisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKworICAgIEVYUEVDVF9FUShsaXN0ZW5lciwgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXIpKTsKKyAgICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpID09IE5VTEwpOworICAgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworCisgICAgLy8gQnJvYWRjYXN0aW5nIGV2ZW50cyBub3cgc2hvdWxkIG5vdCBhZmZlY3QgZGVmYXVsdF9yZXN1bHRfcHJpbnRlci4KKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7CisgIH0KKyAgLy8gRGVzdHJveWluZyB0aGUgbGlzdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgbGlzdGVuZXIgbm93LCB0b28uCisgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworICBkZWxldGUgbGlzdGVuZXI7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciBpbnN0YWxsZWQgdmlhIFNldERlZmF1bHRYbWxHZW5lcmF0b3IoKSBzdGFydHMKKy8vIHJlY2VpdmluZyBldmVudHMgYW5kIGlzIHJldHVybmVkIHZpYSBkZWZhdWx0X3htbF9nZW5lcmF0b3IoKSBhbmQgdGhhdAorLy8gdGhlIHByZXZpb3VzIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QgYW5kIGRlbGV0ZWQuCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBkZWZhdWx0X3htbF9nZW5lcmF0b3IpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoJmxpc3RlbmVycywgbGlzdGVuZXIpOworCisgIEVYUEVDVF9FUShsaXN0ZW5lciwgbGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisKKyAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworCisgIC8vIFJlcGxhY2luZyBkZWZhdWx0X3htbF9nZW5lcmF0b3Igd2l0aCBzb21ldGhpbmcgZWxzZSBzaG91bGQgcmVtb3ZlIGl0CisgIC8vIGZyb20gdGhlIGxpc3QgYW5kIGRlc3Ryb3kgaXQuCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsIE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoaXNfZGVzdHJveWVkKTsKKworICAvLyBBZnRlciBicm9hZGNhc3RpbmcgYW4gZXZlbnQgdGhlIGNvdW50ZXIgaXMgc3RpbGwgdGhlIHNhbWUsIGluZGljYXRpbmcKKyAgLy8gdGhlIGxpc3RlbmVyIGlzIG5vdCBpbiB0aGUgbGlzdCBhbnltb3JlLgorICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGxpc3RlbmVyIHN0b3BzIHJlY2VpdmluZyBldmVudHMKKy8vIHdoZW4gcmVtb3ZlZCB2aWEgUmVsZWFzZSBhbmQgdGhhdCBpcyBub3Qgb3duZWQgYnkgdGhlIGxpc3QgYW55bW9yZS4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIFJlbW92aW5nRGVmYXVsdFhtbEdlbmVyYXRvcldvcmtzKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgLy8gQWx0aG91Z2ggQXBwZW5kIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IHRvIHRoZSBsaXN0LAorICAvLyB0aGUgZm9sbG93aW5nIGNhbGxzIHJlbGVhc2UgaXQsIGFuZCB3ZSBuZWVkIHRvIGRlbGV0ZSBpdCBiZWZvcmUgdGhlCisgIC8vIHRlc3QgZW5kcy4KKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworICB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcigmbGlzdGVuZXJzLCBsaXN0ZW5lcik7CisKKyAgICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSk7CisgICAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpID09IE5VTEwpOworICAgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworCisgICAgLy8gQnJvYWRjYXN0aW5nIGV2ZW50cyBub3cgc2hvdWxkIG5vdCBhZmZlY3QgZGVmYXVsdF94bWxfZ2VuZXJhdG9yLgorICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICAgIEVYUEVDVF9FUSgwLCBvbl9zdGFydF9jb3VudGVyKTsKKyAgfQorICAvLyBEZXN0cm95aW5nIHRoZSBsaXN0IHNob3VsZCBub3QgYWZmZWN0IHRoZSBsaXN0ZW5lciBub3csIHRvby4KKyAgRVhQRUNUX0ZBTFNFKGlzX2Rlc3Ryb3llZCk7CisgIGRlbGV0ZSBsaXN0ZW5lcjsKK30KKworLy8gU2FuaXR5IHRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBhbHRlcm5hdGl2ZSwgdmVyYm9zZSBzcGVsbGluZ3Mgb2YKKy8vIHNvbWUgb2YgdGhlIG1hY3JvcyB3b3JrLiAgV2UgZG9uJ3QgdGVzdCB0aGVtIHRob3JvdWdobHkgYXMgdGhhdAorLy8gd291bGQgYmUgcXVpdGUgaW52b2x2ZWQuICBTaW5jZSB0aGVpciBpbXBsZW1lbnRhdGlvbnMgYXJlCisvLyBzdHJhaWdodGZvcndhcmQsIGFuZCB0aGV5IGFyZSByYXJlbHkgdXNlZCwgd2UnbGwganVzdCByZWx5IG9uIHRoZQorLy8gdXNlcnMgdG8gdGVsbCB1cyB3aGVuIHRoZXkgYXJlIGJyb2tlbi4KK0dURVNUX1RFU1QoQWx0ZXJuYXRpdmVOYW1lVGVzdCwgV29ya3MpIHsgIC8vIEdURVNUX1RFU1QgaXMgdGhlIHNhbWUgYXMgVEVTVC4KKyAgR1RFU1RfU1VDQ0VFRCgpIDw8ICJPSyI7ICAvLyBHVEVTVF9TVUNDRUVEIGlzIHRoZSBzYW1lIGFzIFNVQ0NFRUQuCisKKyAgLy8gR1RFU1RfRkFJTCBpcyB0aGUgc2FtZSBhcyBGQUlMLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9GQUlMKCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIC8vIEdURVNUX0FTU0VSVF9YWSBpcyB0aGUgc2FtZSBhcyBBU1NFUlRfWFkuCisKKyAgR1RFU1RfQVNTRVJUX0VRKDAsIDApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfRVEoMCwgMSkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfRVEoMSwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9ORSgwLCAxKTsKKyAgR1RFU1RfQVNTRVJUX05FKDEsIDApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfTkUoMCwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9MRSgwLCAwKTsKKyAgR1RFU1RfQVNTRVJUX0xFKDAsIDEpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfTEUoMSwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9MVCgwLCAxKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0xUKDAsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0xUKDEsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBHVEVTVF9BU1NFUlRfR0UoMCwgMCk7CisgIEdURVNUX0FTU0VSVF9HRSgxLCAwKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0dFKDAsIDEpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBHVEVTVF9BU1NFUlRfR1QoMSwgMCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9HVCgwLCAxKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9HVCgxLCAxKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIGZvciBpbnRlcm5hbCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5pdmVyc2FsCisvLyBwcmludGluZy4KKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEZpbmQgYSBiZXR0ZXIgaG9tZSBmb3IgdGhlbS4KKworY2xhc3MgQ29udmVyc2lvbkhlbHBlckJhc2Uge307CitjbGFzcyBDb252ZXJzaW9uSGVscGVyRGVyaXZlZCA6IHB1YmxpYyBDb252ZXJzaW9uSGVscGVyQmFzZSB7fTsKKworLy8gVGVzdHMgdGhhdCBJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgorVEVTVChJc0FQcm90b2NvbE1lc3NhZ2VUZXN0LCBWYWx1ZUlzQ29tcGlsZVRpbWVDb25zdGFudCkgeworICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oSXNBUHJvdG9jb2xNZXNzYWdlPFByb3RvY29sTWVzc2FnZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdHJ1ZSk7CisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyghSXNBUHJvdG9jb2xNZXNzYWdlPGludD46OnZhbHVlLCBjb25zdF9mYWxzZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyB0cnVlIHdoZW4gVCBpcworLy8gcHJvdG8yOjpNZXNzYWdlIG9yIGEgc3ViLWNsYXNzIG9mIGl0LgorVEVTVChJc0FQcm90b2NvbE1lc3NhZ2VUZXN0LCBWYWx1ZUlzVHJ1ZVdoZW5UeXBlSXNBUHJvdG9jb2xNZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKElzQVByb3RvY29sTWVzc2FnZTwgOjpwcm90bzI6Ok1lc3NhZ2U+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKElzQVByb3RvY29sTWVzc2FnZTxQcm90b2NvbE1lc3NhZ2U+Ojp2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyBmYWxzZSB3aGVuIFQgaXMgbmVpdGhlcgorLy8gUHJvdG9jb2xNZXNzYWdlIG5vciBhIHN1Yi1jbGFzcyBvZiBpdC4KK1RFU1QoSXNBUHJvdG9jb2xNZXNzYWdlVGVzdCwgVmFsdWVJc0ZhbHNlV2hlblR5cGVJc05vdEFQcm90b2NvbE1lc3NhZ2UpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQVByb3RvY29sTWVzc2FnZTxpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShJc0FQcm90b2NvbE1lc3NhZ2U8Y29uc3QgQ29udmVyc2lvbkhlbHBlckJhc2U+Ojp2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWwgY29tcGlsZXMgd2hlbiB0aGUgdHlwZSBhcmd1bWVudHMgYXJlCisvLyBlcXVhbC4KK1RFU1QoQ29tcGlsZUFzc2VydFR5cGVzRXF1YWwsIENvbXBpbGVzV2hlblR5cGVzQXJlRXF1YWwpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgdm9pZD4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50KiwgaW50Kj4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVSZWZlcmVuY2UgZG9lcyBub3QgYWZmZWN0IG5vbi1yZWZlcmVuY2UgdHlwZXMuCitURVNUKFJlbW92ZVJlZmVyZW5jZVRlc3QsIERvZXNOb3RBZmZlY3ROb25SZWZlcmVuY2VUeXBlKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlUmVmZXJlbmNlPGludD46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXIsIFJlbW92ZVJlZmVyZW5jZTxjb25zdCBjaGFyPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVSZWZlcmVuY2UgcmVtb3ZlcyByZWZlcmVuY2UgZnJvbSByZWZlcmVuY2UgdHlwZXMuCitURVNUKFJlbW92ZVJlZmVyZW5jZVRlc3QsIFJlbW92ZXNSZWZlcmVuY2UpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBSZW1vdmVSZWZlcmVuY2U8aW50Jj46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXIsIFJlbW92ZVJlZmVyZW5jZTxjb25zdCBjaGFyJj46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2UoKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUMik+KCk7Cit9CisKK1RFU1QoUmVtb3ZlUmVmZXJlbmNlVGVzdCwgTWFjcm9WZXJzaW9uKSB7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZTxpbnQsIGludD4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlPGNvbnN0IGNoYXIsIGNvbnN0IGNoYXImPigpOworfQorCisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlQ29uc3QgZG9lcyBub3QgYWZmZWN0IG5vbi1jb25zdCB0eXBlcy4KK1RFU1QoUmVtb3ZlQ29uc3RUZXN0LCBEb2VzTm90QWZmZWN0Tm9uQ29uc3RUeXBlKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlQ29uc3Q8aW50Pjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y2hhciYsIFJlbW92ZUNvbnN0PGNoYXImPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVDb25zdCByZW1vdmVzIGNvbnN0IGZyb20gY29uc3QgdHlwZXMuCitURVNUKFJlbW92ZUNvbnN0VGVzdCwgUmVtb3Zlc0NvbnN0KSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlQ29uc3Q8Y29uc3QgaW50Pjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y2hhclsyXSwgUmVtb3ZlQ29uc3Q8Y29uc3QgY2hhclsyXT46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXJbMl1bM10sIFJlbW92ZUNvbnN0PGNvbnN0IGNoYXJbMl1bM10+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyBHVEVTVF9SRU1PVkVfQ09OU1RfLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBUZXN0R1Rlc3RSZW1vdmVDb25zdCgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX1JFTU9WRV9DT05TVF8oVDIpPigpOworfQorCitURVNUKFJlbW92ZUNvbnN0VGVzdCwgTWFjcm9WZXJzaW9uKSB7CisgIFRlc3RHVGVzdFJlbW92ZUNvbnN0PGludCwgaW50PigpOworICBUZXN0R1Rlc3RSZW1vdmVDb25zdDxkb3VibGUmLCBkb3VibGUmPigpOworICBUZXN0R1Rlc3RSZW1vdmVDb25zdDxjaGFyLCBjb25zdCBjaGFyPigpOworfQorCisvLyBUZXN0cyBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0KCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFQyKT4oKTsKK30KKworVEVTVChSZW1vdmVSZWZlcmVuY2VUb0NvbnN0VGVzdCwgV29ya3MpIHsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8aW50LCBpbnQ+KCk7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGRvdWJsZSwgZG91YmxlJj4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8Y2hhciwgY29uc3QgY2hhcj4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8Y2hhciwgY29uc3QgY2hhciY+KCk7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKj4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBBZGRSZWZlcmVuY2UgZG9lcyBub3QgYWZmZWN0IHJlZmVyZW5jZSB0eXBlcy4KK1RFU1QoQWRkUmVmZXJlbmNlVGVzdCwgRG9lc05vdEFmZmVjdFJlZmVyZW5jZVR5cGUpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50JiwgQWRkUmVmZXJlbmNlPGludCY+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyJiwgQWRkUmVmZXJlbmNlPGNvbnN0IGNoYXImPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBBZGRSZWZlcmVuY2UgYWRkcyByZWZlcmVuY2UgdG8gbm9uLXJlZmVyZW5jZSB0eXBlcy4KK1RFU1QoQWRkUmVmZXJlbmNlVGVzdCwgQWRkc1JlZmVyZW5jZSkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQmLCBBZGRSZWZlcmVuY2U8aW50Pjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y29uc3QgY2hhciYsIEFkZFJlZmVyZW5jZTxjb25zdCBjaGFyPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgR1RFU1RfQUREX1JFRkVSRU5DRV8uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFRlc3RHVGVzdEFkZFJlZmVyZW5jZSgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX0FERF9SRUZFUkVOQ0VfKFQyKT4oKTsKK30KKworVEVTVChBZGRSZWZlcmVuY2VUZXN0LCBNYWNyb1ZlcnNpb24pIHsKKyAgVGVzdEdUZXN0QWRkUmVmZXJlbmNlPGludCYsIGludD4oKTsKKyAgVGVzdEdUZXN0QWRkUmVmZXJlbmNlPGNvbnN0IGNoYXImLCBjb25zdCBjaGFyJj4oKTsKK30KKworLy8gVGVzdHMgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdCgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oVDIpPigpOworfQorCitURVNUKEdUZXN0UmVmZXJlbmNlVG9Db25zdFRlc3QsIFdvcmtzKSB7CisgIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3Q8Y29uc3QgY2hhciYsIGNoYXI+KCk7CisgIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3Q8Y29uc3QgaW50JiwgY29uc3QgaW50PigpOworICBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0PGNvbnN0IGRvdWJsZSYsIGRvdWJsZT4oKTsKKyAgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdDxjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IHN0ZDo6c3RyaW5nJj4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbXBsaWNpdGx5Q29udmVydGlibGU8VDEsIFQyPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCitURVNUKEltcGxpY2l0bHlDb252ZXJ0aWJsZVRlc3QsIFZhbHVlSXNDb21waWxlVGltZUNvbnN0YW50KSB7CisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCwgaW50Pjo6dmFsdWUpLCBjb25zdF90cnVlKTsKKyAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCghSW1wbGljaXRseUNvbnZlcnRpYmxlPHZvaWQqLCBpbnQqPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfZmFsc2UpOworfQorCisvLyBUZXN0cyB0aGF0IEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUMSwgVDI+Ojp2YWx1ZSBpcyB0cnVlIHdoZW4gVDEgY2FuCisvLyBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBUMi4KK1RFU1QoSW1wbGljaXRseUNvbnZlcnRpYmxlVGVzdCwgVmFsdWVJc1RydWVXaGVuQ29udmVydGlibGUpIHsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQsIGRvdWJsZT46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8ZG91YmxlLCBpbnQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCosIHZvaWQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQqLCBjb25zdCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxDb252ZXJzaW9uSGVscGVyRGVyaXZlZCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udmVyc2lvbkhlbHBlckJhc2UmPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBDb252ZXJzaW9uSGVscGVyQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uSGVscGVyQmFzZT46OnZhbHVlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW1wbGljaXRseUNvbnZlcnRpYmxlPFQxLCBUMj46OnZhbHVlIGlzIGZhbHNlIHdoZW4gVDEKKy8vIGNhbm5vdCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBUMi4KK1RFU1QoSW1wbGljaXRseUNvbnZlcnRpYmxlVGVzdCwgVmFsdWVJc0ZhbHNlV2hlbk5vdENvbnZlcnRpYmxlKSB7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGRvdWJsZSwgaW50Kj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPHZvaWQqLCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgaW50KiwgaW50Kj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPENvbnZlcnNpb25IZWxwZXJCYXNlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbkhlbHBlckRlcml2ZWQmPjo6dmFsdWUpKTsKK30KKworLy8gVGVzdHMgSXNDb250YWluZXJUZXN0LgorCitjbGFzcyBOb25Db250YWluZXIge307CisKK1RFU1QoSXNDb250YWluZXJUZXN0VGVzdCwgV29ya3NGb3JOb25Db250YWluZXIpIHsKKyAgRVhQRUNUX0VRKHNpemVvZihJc05vdENvbnRhaW5lciksIHNpemVvZihJc0NvbnRhaW5lclRlc3Q8aW50PigwKSkpOworICBFWFBFQ1RfRVEoc2l6ZW9mKElzTm90Q29udGFpbmVyKSwgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxjaGFyWzVdPigwKSkpOworICBFWFBFQ1RfRVEoc2l6ZW9mKElzTm90Q29udGFpbmVyKSwgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxOb25Db250YWluZXI+KDApKSk7Cit9CisKK1RFU1QoSXNDb250YWluZXJUZXN0VGVzdCwgV29ya3NGb3JDb250YWluZXIpIHsKKyAgRVhQRUNUX0VRKHNpemVvZihJc0NvbnRhaW5lciksCisgICAgICAgICAgICBzaXplb2YoSXNDb250YWluZXJUZXN0PHN0ZDo6dmVjdG9yPGJvb2w+ID4oMCkpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihJc0NvbnRhaW5lciksCisgICAgICAgICAgICBzaXplb2YoSXNDb250YWluZXJUZXN0PHN0ZDo6bWFwPGludCwgZG91YmxlPiA+KDApKSk7Cit9CisKKy8vIFRlc3RzIEFycmF5RXEoKS4KKworVEVTVChBcnJheUVxVGVzdCwgV29ya3NGb3JEZWdlbmVyYXRlZEFycmF5cykgeworICBFWFBFQ1RfVFJVRShBcnJheUVxKDUsIDVMKSk7CisgIEVYUEVDVF9GQUxTRShBcnJheUVxKCdhJywgMCkpOworfQorCitURVNUKEFycmF5RXFUZXN0LCBXb3Jrc0Zvck9uZURpbWVuc2lvbmFsQXJyYXlzKSB7CisgIC8vIE5vdGUgdGhhdCBhIGFuZCBiIGFyZSBkaXN0aW5jdCBidXQgY29tcGF0aWJsZSB0eXBlcy4KKyAgY29uc3QgaW50IGFbXSA9IHsgMCwgMSB9OworICBsb25nIGJbXSA9IHsgMCwgMSB9OworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGIpKTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCAyLCBiKSk7CisKKyAgYlswXSA9IDI7CisgIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIGIpKTsKKyAgRVhQRUNUX0ZBTFNFKEFycmF5RXEoYSwgMSwgYikpOworfQorCitURVNUKEFycmF5RXFUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsQXJyYXlzKSB7CisgIGNvbnN0IGNoYXIgYVtdWzNdID0geyAiaGkiLCAibG8iIH07CisgIGNvbnN0IGNoYXIgYltdWzNdID0geyAiaGkiLCAibG8iIH07CisgIGNvbnN0IGNoYXIgY1tdWzNdID0geyAiaGkiLCAibGkiIH07CisKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgMiwgYikpOworCisgIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIGMpKTsKKyAgRVhQRUNUX0ZBTFNFKEFycmF5RXEoYSwgMiwgYykpOworfQorCisvLyBUZXN0cyBBcnJheUF3YXJlRmluZCgpLgorCitURVNUKEFycmF5QXdhcmVGaW5kVGVzdCwgV29ya3NGb3JPbmVEaW1lbnNpb25hbEFycmF5KSB7CisgIGNvbnN0IGNoYXIgYVtdID0gImhlbGxvIjsKKyAgRVhQRUNUX0VRKGEgKyA0LCBBcnJheUF3YXJlRmluZChhLCBhICsgNSwgJ28nKSk7CisgIEVYUEVDVF9FUShhICsgNSwgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDUsICd4JykpOworfQorCitURVNUKEFycmF5QXdhcmVGaW5kVGVzdCwgV29ya3NGb3JUd29EaW1lbnNpb25hbEFycmF5KSB7CisgIGludCBhW11bMl0gPSB7IHsgMCwgMSB9LCB7IDIsIDMgfSwgeyA0LCA1IH0gfTsKKyAgY29uc3QgaW50IGJbMl0gPSB7IDIsIDMgfTsKKyAgRVhQRUNUX0VRKGEgKyAxLCBBcnJheUF3YXJlRmluZChhLCBhICsgMywgYikpOworCisgIGNvbnN0IGludCBjWzJdID0geyA2LCA3IH07CisgIEVYUEVDVF9FUShhICsgMywgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDMsIGMpKTsKK30KKworLy8gVGVzdHMgQ29weUFycmF5KCkuCisKK1RFU1QoQ29weUFycmF5VGVzdCwgV29ya3NGb3JEZWdlbmVyYXRlZEFycmF5cykgeworICBpbnQgbiA9IDA7CisgIENvcHlBcnJheSgnYScsICZuKTsKKyAgRVhQRUNUX0VRKCdhJywgbik7Cit9CisKK1RFU1QoQ29weUFycmF5VGVzdCwgV29ya3NGb3JPbmVEaW1lbnNpb25hbEFycmF5cykgeworICBjb25zdCBjaGFyIGFbM10gPSAiaGkiOworICBpbnQgYlszXTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fICAvLyBDKytCdWlsZGVyIGNhbm5vdCBjb21waWxlIHNvbWUgYXJyYXkgc2l6ZSBkZWR1Y3Rpb25zLgorICBDb3B5QXJyYXkoYSwgJmIpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGIpKTsKKyNlbmRpZgorCisgIGludCBjWzNdOworICBDb3B5QXJyYXkoYSwgMywgYyk7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYykpOworfQorCitURVNUKENvcHlBcnJheVRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxBcnJheXMpIHsKKyAgY29uc3QgaW50IGFbMl1bM10gPSB7IHsgMCwgMSwgMiB9LCB7IDMsIDQsIDUgfSB9OworICBpbnQgYlsyXVszXTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fICAvLyBDKytCdWlsZGVyIGNhbm5vdCBjb21waWxlIHNvbWUgYXJyYXkgc2l6ZSBkZWR1Y3Rpb25zLgorICBDb3B5QXJyYXkoYSwgJmIpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGIpKTsKKyNlbmRpZgorCisgIGludCBjWzJdWzNdOworICBDb3B5QXJyYXkoYSwgMiwgYyk7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYykpOworfQorCisvLyBUZXN0cyBOYXRpdmVBcnJheS4KKworVEVTVChOYXRpdmVBcnJheVRlc3QsIENvbnN0cnVjdG9yRnJvbUFycmF5V29ya3MpIHsKKyAgY29uc3QgaW50IGFbM10gPSB7IDAsIDEsIDIgfTsKKyAgTmF0aXZlQXJyYXk8aW50PiBuYShhLCAzLCBrUmVmZXJlbmNlKTsKKyAgRVhQRUNUX0VRKDNVLCBuYS5zaXplKCkpOworICBFWFBFQ1RfRVEoYSwgbmEuYmVnaW4oKSk7Cit9CisKK1RFU1QoTmF0aXZlQXJyYXlUZXN0LCBDcmVhdGVzQW5kRGVsZXRlc0NvcHlPZkFycmF5V2hlbkFza2VkVG8pIHsKKyAgdHlwZWRlZiBpbnQgQXJyYXlbMl07CisgIEFycmF5KiBhID0gbmV3IEFycmF5WzFdOworICAoKmEpWzBdID0gMDsKKyAgKCphKVsxXSA9IDE7CisgIE5hdGl2ZUFycmF5PGludD4gbmEoKmEsIDIsIGtDb3B5KTsKKyAgRVhQRUNUX05FKCphLCBuYS5iZWdpbigpKTsKKyAgZGVsZXRlW10gYTsKKyAgRVhQRUNUX0VRKDAsIG5hLmJlZ2luKClbMF0pOworICBFWFBFQ1RfRVEoMSwgbmEuYmVnaW4oKVsxXSk7CisKKyAgLy8gV2UgcmVseSBvbiB0aGUgaGVhcCBjaGVja2VyIHRvIHZlcmlmeSB0aGF0IG5hIGRlbGV0ZXMgdGhlIGNvcHkgb2YKKyAgLy8gYXJyYXkuCit9CisKK1RFU1QoTmF0aXZlQXJyYXlUZXN0LCBUeXBlTWVtYmVyc0FyZUNvcnJlY3QpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIE5hdGl2ZUFycmF5PGNoYXI+Ojp2YWx1ZV90eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50WzJdLCBOYXRpdmVBcnJheTxpbnRbMl0+Ojp2YWx1ZV90eXBlPigpOworCisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBjaGFyKiwgTmF0aXZlQXJyYXk8Y2hhcj46OmNvbnN0X2l0ZXJhdG9yPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgYm9vbCgqKVsyXSwgTmF0aXZlQXJyYXk8Ym9vbFsyXT46OmNvbnN0X2l0ZXJhdG9yPigpOworfQorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgTWV0aG9kc1dvcmspIHsKKyAgY29uc3QgaW50IGFbM10gPSB7IDAsIDEsIDIgfTsKKyAgTmF0aXZlQXJyYXk8aW50PiBuYShhLCAzLCBrQ29weSk7CisgIEFTU0VSVF9FUSgzVSwgbmEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMsIG5hLmVuZCgpIC0gbmEuYmVnaW4oKSk7CisKKyAgTmF0aXZlQXJyYXk8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBuYS5iZWdpbigpOworICBFWFBFQ1RfRVEoMCwgKml0KTsKKyAgKytpdDsKKyAgRVhQRUNUX0VRKDEsICppdCk7CisgIGl0Kys7CisgIEVYUEVDVF9FUSgyLCAqaXQpOworICArK2l0OworICBFWFBFQ1RfRVEobmEuZW5kKCksIGl0KTsKKworICBFWFBFQ1RfVFJVRShuYSA9PSBuYSk7CisKKyAgTmF0aXZlQXJyYXk8aW50PiBuYTIoYSwgMywga1JlZmVyZW5jZSk7CisgIEVYUEVDVF9UUlVFKG5hID09IG5hMik7CisKKyAgY29uc3QgaW50IGIxWzNdID0geyAwLCAxLCAxIH07CisgIGNvbnN0IGludCBiMls0XSA9IHsgMCwgMSwgMiwgMyB9OworICBFWFBFQ1RfRkFMU0UobmEgPT0gTmF0aXZlQXJyYXk8aW50PihiMSwgMywga1JlZmVyZW5jZSkpOworICBFWFBFQ1RfRkFMU0UobmEgPT0gTmF0aXZlQXJyYXk8aW50PihiMiwgNCwga0NvcHkpKTsKK30KKworVEVTVChOYXRpdmVBcnJheVRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxBcnJheSkgeworICBjb25zdCBjaGFyIGFbMl1bM10gPSB7ICJoaSIsICJsbyIgfTsKKyAgTmF0aXZlQXJyYXk8Y2hhclszXT4gbmEoYSwgMiwga1JlZmVyZW5jZSk7CisgIEFTU0VSVF9FUSgyVSwgbmEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGEsIG5hLmJlZ2luKCkpOworfQorCisvLyBUZXN0cyBTa2lwUHJlZml4KCkuCisKK1RFU1QoU2tpcFByZWZpeFRlc3QsIFNraXBzV2hlblByZWZpeE1hdGNoZXMpIHsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gImhlbGxvIjsKKworICBjb25zdCBjaGFyKiBwID0gc3RyOworICBFWFBFQ1RfVFJVRShTa2lwUHJlZml4KCIiLCAmcCkpOworICBFWFBFQ1RfRVEoc3RyLCBwKTsKKworICBwID0gc3RyOworICBFWFBFQ1RfVFJVRShTa2lwUHJlZml4KCJoZWxsIiwgJnApKTsKKyAgRVhQRUNUX0VRKHN0ciArIDQsIHApOworfQorCitURVNUKFNraXBQcmVmaXhUZXN0LCBEb2VzTm90U2tpcFdoZW5QcmVmaXhEb2VzTm90TWF0Y2gpIHsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gIndvcmxkIjsKKworICBjb25zdCBjaGFyKiBwID0gc3RyOworICBFWFBFQ1RfRkFMU0UoU2tpcFByZWZpeCgiVyIsICZwKSk7CisgIEVYUEVDVF9FUShzdHIsIHApOworCisgIHAgPSBzdHI7CisgIEVYUEVDVF9GQUxTRShTa2lwUHJlZml4KCJ3b3JsZCEiLCAmcCkpOworICBFWFBFQ1RfRVEoc3RyLCBwKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWNlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8gd3JpdGVzIHNvbWUgeG1sIHZpYSBUZXN0UHJvcGVydHkgdXNlZCBieQorLy8gZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIFByb3BlcnR5T25lIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIFJlY29yZFByb3BlcnR5KCJTZXRVcFByb3AiLCAxKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duUHJvcCIsIDEpOworICB9Cit9OworCitURVNUX0YoUHJvcGVydHlPbmUsIFRlc3RTb21lUHJvcGVydGllcykgeworICBSZWNvcmRQcm9wZXJ0eSgiVGVzdFNvbWVQcm9wZXJ0eSIsIDEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MDBiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIGd0ZXN0X3htbF9vdXRmaWxlMl90ZXN0XyB3cml0ZXMgc29tZSB4bWwgdmlhIFRlc3RQcm9wZXJ0eSB1c2VkIGJ5CisvLyBndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworY2xhc3MgUHJvcGVydHlUd28gOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgUmVjb3JkUHJvcGVydHkoIlNldFVwUHJvcCIsIDIpOworICB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiVGVhckRvd25Qcm9wIiwgMik7CisgIH0KK307CisKK1RFU1RfRihQcm9wZXJ0eVR3bywgVGVzdFNvbWVQcm9wZXJ0aWVzKSB7CisgIFJlY29yZFByb3BlcnR5KCJUZXN0U29tZVByb3BlcnR5IiwgMik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI0ZTQzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQpAQCAtMCwwICsxLDEzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IGZvciB0aGUgZ3Rlc3RfeG1sX291dHB1dCBtb2R1bGUuIiIiCisKK19fYXV0aG9yX18gPSAia2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KSIKKworaW1wb3J0IG9zCitmcm9tIHhtbC5kb20gaW1wb3J0IG1pbmlkb20sIE5vZGUKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKK2ltcG9ydCBndGVzdF94bWxfdGVzdF91dGlscworCisKK0dURVNUX09VVFBVVF9TVUJESVIgPSAieG1sX291dGZpbGVzIgorR1RFU1RfT1VUUFVUXzFfVEVTVCA9ICJndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8iCitHVEVTVF9PVVRQVVRfMl9URVNUID0gImd0ZXN0X3htbF9vdXRmaWxlMl90ZXN0XyIKKworRVhQRUNURURfWE1MXzEgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHRlc3RzdWl0ZXMgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIiB0aW1lc3RhbXA9IioiIG5hbWU9IkFsbFRlc3RzIj4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJQcm9wZXJ0eU9uZSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iVGVzdFNvbWVQcm9wZXJ0aWVzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eU9uZSIgU2V0VXBQcm9wPSIxIiBUZXN0U29tZVByb3BlcnR5PSIxIiBUZWFyRG93blByb3A9IjEiIC8+CisgIDwvdGVzdHN1aXRlPgorPC90ZXN0c3VpdGVzPgorIiIiCisKK0VYUEVDVEVEX1hNTF8yID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIgdGltZXN0YW1wPSIqIiBuYW1lPSJBbGxUZXN0cyI+CisgIDx0ZXN0c3VpdGUgbmFtZT0iUHJvcGVydHlUd28iIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IlRlc3RTb21lUHJvcGVydGllcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iUHJvcGVydHlUd28iIFNldFVwUHJvcD0iMiIgVGVzdFNvbWVQcm9wZXJ0eT0iMiIgVGVhckRvd25Qcm9wPSIyIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4KKyIiIgorCisKK2NsYXNzIEdUZXN0WE1MT3V0RmlsZXNUZXN0KGd0ZXN0X3htbF90ZXN0X3V0aWxzLkdUZXN0WE1MVGVzdENhc2UpOgorICAiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgWE1MIG91dHB1dCBmdW5jdGlvbmFsaXR5LiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICAjIFdlIHdhbnQgdGhlIHRyYWlsaW5nICcvJyB0aGF0IHRoZSBsYXN0ICIiIHByb3ZpZGVzIGluIG9zLnBhdGguam9pbiwgZm9yCisgICAgIyB0ZWxsaW5nIEdvb2dsZSBUZXN0IHRvIGNyZWF0ZSBhbiBvdXRwdXQgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSBzaW5nbGUgZmlsZQorICAgICMgZm9yIHhtbCBvdXRwdXQuCisgICAgc2VsZi5vdXRwdXRfZGlyXyA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX09VVFBVVF9TVUJESVIsICIiKQorICAgIHNlbGYuRGVsZXRlRmlsZXNBbmREaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLkRlbGV0ZUZpbGVzQW5kRGlyKCkKKworICBkZWYgRGVsZXRlRmlsZXNBbmREaXIoc2VsZik6CisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMV9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMl9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3Mucm1kaXIoc2VsZi5vdXRwdXRfZGlyXykKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisKKyAgZGVmIHRlc3RPdXRmaWxlMShzZWxmKToKKyAgICBzZWxmLl9UZXN0T3V0RmlsZShHVEVTVF9PVVRQVVRfMV9URVNULCBFWFBFQ1RFRF9YTUxfMSkKKworICBkZWYgdGVzdE91dGZpbGUyKHNlbGYpOgorICAgIHNlbGYuX1Rlc3RPdXRGaWxlKEdURVNUX09VVFBVVF8yX1RFU1QsIEVYUEVDVEVEX1hNTF8yKQorCisgIGRlZiBfVGVzdE91dEZpbGUoc2VsZiwgdGVzdF9uYW1lLCBleHBlY3RlZF94bWwpOgorICAgIGd0ZXN0X3Byb2dfcGF0aCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKHRlc3RfbmFtZSkKKyAgICBjb21tYW5kID0gW2d0ZXN0X3Byb2dfcGF0aCwgIi0tZ3Rlc3Rfb3V0cHV0PXhtbDolcyIgJSBzZWxmLm91dHB1dF9kaXJfXQorICAgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfZGlyPWd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpKQorICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBwLmV4aXRfY29kZSkKKworICAgICMgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxpYnRvb2wgY2F1c2VzIHRoZSBidWlsdCB0ZXN0IGJpbmFyeSB0byBiZQorICAgICMgICBuYW1lZCBsdC1ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8gaW5zdGVhZCBvZgorICAgICMgICBndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8uICBUbyBhY2NvdW50IGZvciB0aGlzIHBvc3NpYmlsbGl0eSwgd2UKKyAgICAjICAgYWxsb3cgYm90aCBuYW1lcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuICBXZSBzaG91bGQgcmVtb3ZlIHRoaXMKKyAgICAjICAgaGFjayB3aGVuIENoYW5kbGVyIENhcnJ1dGgncyBsaWJ0b29sIHJlcGxhY2VtZW50IHRvb2wgaXMgcmVhZHkuCisgICAgb3V0cHV0X2ZpbGVfbmFtZTEgPSB0ZXN0X25hbWUgKyAiLnhtbCIKKyAgICBvdXRwdXRfZmlsZTEgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyXywgb3V0cHV0X2ZpbGVfbmFtZTEpCisgICAgb3V0cHV0X2ZpbGVfbmFtZTIgPSAnbHQtJyArIG91dHB1dF9maWxlX25hbWUxCisgICAgb3V0cHV0X2ZpbGUyID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpcl8sIG91dHB1dF9maWxlX25hbWUyKQorICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzZmlsZShvdXRwdXRfZmlsZTEpIG9yIG9zLnBhdGguaXNmaWxlKG91dHB1dF9maWxlMiksCisgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlMSkKKworICAgIGV4cGVjdGVkID0gbWluaWRvbS5wYXJzZVN0cmluZyhleHBlY3RlZF94bWwpCisgICAgaWYgb3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUxKToKKyAgICAgIGFjdHVhbCA9IG1pbmlkb20ucGFyc2Uob3V0cHV0X2ZpbGUxKQorICAgIGVsc2U6CisgICAgICBhY3R1YWwgPSBtaW5pZG9tLnBhcnNlKG91dHB1dF9maWxlMikKKyAgICBzZWxmLk5vcm1hbGl6ZVhtbChhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIHNlbGYuQXNzZXJ0RXF1aXZhbGVudE5vZGVzKGV4cGVjdGVkLmRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIGV4cGVjdGVkLnVubGluaygpCisgICAgYWN0dWFsLnVubGluaygpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgb3MuZW52aXJvblsiR1RFU1RfU1RBQ0tfVFJBQ0VfREVQVEgiXSA9ICIwIgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNjA1ZDRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwzMDcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCBmb3IgdGhlIGd0ZXN0X3htbF9vdXRwdXQgbW9kdWxlIiIiCisKK19fYXV0aG9yX18gPSAnZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpJworCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBlcnJubworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbSwgTm9kZQorCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworaW1wb3J0IGd0ZXN0X3htbF90ZXN0X3V0aWxzCisKKworR1RFU1RfRklMVEVSX0ZMQUcgPSAnLS1ndGVzdF9maWx0ZXInCitHVEVTVF9MSVNUX1RFU1RTX0ZMQUcgPSAnLS1ndGVzdF9saXN0X3Rlc3RzJworR1RFU1RfT1VUUFVUX0ZMQUcgICAgICAgICA9ICItLWd0ZXN0X291dHB1dCIKK0dURVNUX0RFRkFVTFRfT1VUUFVUX0ZJTEUgPSAidGVzdF9kZXRhaWwueG1sIgorR1RFU1RfUFJPR1JBTV9OQU1FID0gImd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfIgorCitTVVBQT1JUU19TVEFDS19UUkFDRVMgPSBGYWxzZQorCitpZiBTVVBQT1JUU19TVEFDS19UUkFDRVM6CisgIFNUQUNLX1RSQUNFX1RFTVBMQVRFID0gJ1xuU3RhY2sgdHJhY2U6XG4qJworZWxzZToKKyAgU1RBQ0tfVFJBQ0VfVEVNUExBVEUgPSAnJworCitFWFBFQ1RFRF9OT05fRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIyMyIgZmFpbHVyZXM9IjQiIGRpc2FibGVkPSIyIiBlcnJvcnM9IjAiIHRpbWU9IioiIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiIGFkX2hvY19wcm9wZXJ0eT0iNDIiPgorICA8dGVzdHN1aXRlIG5hbWU9IlN1Y2Nlc3NmdWxUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJTdWNjZWVkcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU3VjY2Vzc2Z1bFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iRmFpbGVkVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iRmFpbHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IkZhaWxlZFRlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KiYjeDBBO1ZhbHVlIG9mOiAyJiN4MEE7RXhwZWN0ZWQ6IDEiIHR5cGU9IiI+PCFbQ0RBVEFbZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KgorVmFsdWUgb2Y6IDIKK0V4cGVjdGVkOiAxJShzdGFjaylzXV0+PC9mYWlsdXJlPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9Ik1peGVkUmVzdWx0VGVzdCIgdGVzdHM9IjMiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMSIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iU3VjY2VlZHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik1peGVkUmVzdWx0VGVzdCIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJGYWlscyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTWl4ZWRSZXN1bHRUZXN0Ij4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtWYWx1ZSBvZjogMiYjeDBBO0V4cGVjdGVkOiAxIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK1ZhbHVlIG9mOiAyCitFeHBlY3RlZDogMSUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtWYWx1ZSBvZjogMyYjeDBBO0V4cGVjdGVkOiAyIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK1ZhbHVlIG9mOiAzCitFeHBlY3RlZDogMiUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICA8L3Rlc3RjYXNlPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJESVNBQkxFRF90ZXN0IiBzdGF0dXM9Im5vdHJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJNaXhlZFJlc3VsdFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iWG1sUXVvdGluZ1Rlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMSIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ik91dHB1dHNDRGF0YSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iWG1sUXVvdGluZ1Rlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KiYjeDBBO0ZhaWxlZCYjeDBBO1hNTCBvdXRwdXQ6ICZsdDs/eG1sIGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7Jmd0OyZsdDt0b3AmZ3Q7Jmx0OyFbQ0RBVEFbY2RhdGEgdGV4dF1dJmd0OyZsdDsvdG9wJmd0OyIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitGYWlsZWQKK1hNTCBvdXRwdXQ6IDw/eG1sIGVuY29kaW5nPSJ1dGYtOCI+PHRvcD48IVtDREFUQVtjZGF0YSB0ZXh0XV0+XV0mZ3Q7PCFbQ0RBVEFbPC90b3A+JShzdGFjaylzXV0+PC9mYWlsdXJlPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkludmFsaWRDaGFyYWN0ZXJzVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSW52YWxpZENoYXJhY3RlcnNJbk1lc3NhZ2UiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IkludmFsaWRDaGFyYWN0ZXJzVGVzdCI+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSJndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqJiN4MEE7RmFpbGVkJiN4MEE7SW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtdIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK0ZhaWxlZAorSW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtdJShzdGFjaylzXV0+PC9mYWlsdXJlPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkRpc2FibGVkVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMSIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iRElTQUJMRURfdGVzdF9ub3RfcnVuIiBzdGF0dXM9Im5vdHJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJEaXNhYmxlZFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iUHJvcGVydHlSZWNvcmRpbmdUZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiIFNldFVwVGVzdENhc2U9InllcyIgVGVhckRvd25UZXN0Q2FzZT0iYXllIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iT25lUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiLz4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSW50VmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5X2ludD0iMSIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUaHJlZVByb3BlcnRpZXMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiIGtleV8yPSIyIiBrZXlfMz0iMyIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eVJlY29yZGluZ1Rlc3QiIGtleV8xPSIyIi8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9Ik5vRml4dHVyZVRlc3QiIHRlc3RzPSIzIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJSZWNvcmRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5PSIxIi8+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5X2Zvcl91dGlsaXR5X2ludD0iMSIvPgorICAgICA8dGVzdGNhc2UgbmFtZT0iRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkU3RyaW5nVmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik5vRml4dHVyZVRlc3QiIGtleV9mb3JfdXRpbGl0eV9zdHJpbmc9IjEiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJUeXBlZFRlc3QvMCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJUeXBlZFRlc3QvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iVHlwZWRUZXN0LzEiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iVHlwZWRUZXN0LzEiIC8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IlNpbmdsZS9UeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLzAiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTaW5nbGUvVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZS8xIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4iIiIgJSB7J3N0YWNrJzogU1RBQ0tfVFJBQ0VfVEVNUExBVEV9CisKK0VYUEVDVEVEX0ZJTFRFUkVEX1RFU1RfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIKKyAgICAgICAgICAgIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiIGFkX2hvY19wcm9wZXJ0eT0iNDIiPgorICA8dGVzdHN1aXRlIG5hbWU9IlN1Y2Nlc3NmdWxUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIgorICAgICAgICAgICAgIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IlN1Y2NlZWRzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTdWNjZXNzZnVsVGVzdCIvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4iIiIKKworRVhQRUNURURfRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIwIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIKKyAgICAgICAgICAgIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiPgorPC90ZXN0c3VpdGVzPiIiIgorCitHVEVTVF9QUk9HUkFNX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChHVEVTVF9QUk9HUkFNX05BTUUpCisKK1NVUFBPUlRTX1RZUEVEX1RFU1RTID0gJ1R5cGVkVGVzdCcgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtHVEVTVF9QUk9HUkFNX1BBVEgsIEdURVNUX0xJU1RfVEVTVFNfRkxBR10sIGNhcHR1cmVfc3RkZXJyPUZhbHNlKS5vdXRwdXQKKworCitjbGFzcyBHVGVzdFhNTE91dHB1dFVuaXRUZXN0KGd0ZXN0X3htbF90ZXN0X3V0aWxzLkdUZXN0WE1MVGVzdENhc2UpOgorICAiIiIKKyAgVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgZnVuY3Rpb25hbGl0eS4KKyAgIiIiCisKKyAgIyBUaGlzIHRlc3QgY3VycmVudGx5IGJyZWFrcyBvbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0eXBlZCBhbmQKKyAgIyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIHNvIHdlIGRvbid0IHJ1biBpdCB1bmRlciB0aGVtLgorICBpZiBTVVBQT1JUU19UWVBFRF9URVNUUzoKKyAgICBkZWYgdGVzdE5vbkVtcHR5WG1sT3V0cHV0KHNlbGYpOgorICAgICAgIiIiCisgICAgICBSdW5zIGEgdGVzdCBwcm9ncmFtIHRoYXQgZ2VuZXJhdGVzIGEgbm9uLWVtcHR5IFhNTCBvdXRwdXQsIGFuZAorICAgICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KKyAgICAgICIiIgorICAgICAgc2VsZi5fVGVzdFhtbE91dHB1dChHVEVTVF9QUk9HUkFNX05BTUUsIEVYUEVDVEVEX05PTl9FTVBUWV9YTUwsIDEpCisKKyAgZGVmIHRlc3RFbXB0eVhtbE91dHB1dChzZWxmKToKKyAgICAiIiJWZXJpZmllcyBYTUwgb3V0cHV0IGZvciBhIEdvb2dsZSBUZXN0IGJpbmFyeSB3aXRob3V0IGFjdHVhbCB0ZXN0cy4KKworICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYW4gZW1wdHkgWE1MIG91dHB1dCwgYW5kCisgICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KKyAgICAiIiIKKworICAgIHNlbGYuX1Rlc3RYbWxPdXRwdXQoJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnLCBFWFBFQ1RFRF9FTVBUWV9YTUwsIDApCisKKyAgZGVmIHRlc3RUaW1lc3RhbXBWYWx1ZShzZWxmKToKKyAgICAiIiJDaGVja3Mgd2hldGhlciB0aGUgdGltZXN0YW1wIGF0dHJpYnV0ZSBpbiB0aGUgWE1MIG91dHB1dCBpcyB2YWxpZC4KKworICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYW4gZW1wdHkgWE1MIG91dHB1dCwgYW5kIGNoZWNrcyBpZgorICAgIHRoZSB0aW1lc3RhbXAgYXR0cmlidXRlIGluIHRoZSB0ZXN0c3VpdGVzIHRhZyBpcyB2YWxpZC4KKyAgICAiIiIKKyAgICBhY3R1YWwgPSBzZWxmLl9HZXRYbWxPdXRwdXQoJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnLCBbXSwgMCkKKyAgICBkYXRlX3RpbWVfc3RyID0gYWN0dWFsLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCd0aW1lc3RhbXAnKS52YWx1ZQorICAgICMgZGF0ZXRpbWUuc3RycHRpbWUoKSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBQeXRob24gMi41KyBzbyB3ZSBoYXZlIHRvCisgICAgIyBwYXJzZSB0aGUgZXhwZWN0ZWQgZGF0ZXRpbWUgbWFudWFsbHkuCisgICAgbWF0Y2ggPSByZS5tYXRjaChyJyhcZCspLShcZFxkKS0oXGRcZClUKFxkXGQpOihcZFxkKTooXGRcZCknLCBkYXRlX3RpbWVfc3RyKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgcmUubWF0Y2gsCisgICAgICAgICdYTUwgZGF0ZXR0aW1lIHN0cmluZyAlcyBoYXMgaW5jb3JyZWN0IGZvcm1hdCcgJSBkYXRlX3RpbWVfc3RyKQorICAgIGRhdGVfdGltZV9mcm9tX3htbCA9IGRhdGV0aW1lLmRhdGV0aW1lKAorICAgICAgICB5ZWFyPWludChtYXRjaC5ncm91cCgxKSksIG1vbnRoPWludChtYXRjaC5ncm91cCgyKSksCisgICAgICAgIGRheT1pbnQobWF0Y2guZ3JvdXAoMykpLCBob3VyPWludChtYXRjaC5ncm91cCg0KSksCisgICAgICAgIG1pbnV0ZT1pbnQobWF0Y2guZ3JvdXAoNSkpLCBzZWNvbmQ9aW50KG1hdGNoLmdyb3VwKDYpKSkKKworICAgIHRpbWVfZGVsdGEgPSBhYnMoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgLSBkYXRlX3RpbWVfZnJvbV94bWwpCisgICAgIyB0aW1lc3RhbXAgdmFsdWUgc2hvdWxkIGJlIG5lYXIgdGhlIGN1cnJlbnQgbG9jYWwgdGltZQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lX2RlbHRhIDwgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9NjAwKSwKKyAgICAgICAgICAgICAgICAgICAgJ3RpbWVfZGVsdGEgaXMgJXMnICUgdGltZV9kZWx0YSkKKyAgICBhY3R1YWwudW5saW5rKCkKKworICBkZWYgdGVzdERlZmF1bHRPdXRwdXRGaWxlKHNlbGYpOgorICAgICIiIgorICAgIENvbmZpcm1zIHRoYXQgR29vZ2xlIFRlc3QgcHJvZHVjZXMgYW4gWE1MIG91dHB1dCBmaWxlIHdpdGggdGhlIGV4cGVjdGVkCisgICAgZGVmYXVsdCBuYW1lIGlmIG5vIG5hbWUgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCisgICAgIiIiCisgICAgb3V0cHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfREVGQVVMVF9PVVRQVVRfRklMRSkKKyAgICBndGVzdF9wcm9nX3BhdGggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAgICAgJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnKQorICAgIHRyeToKKyAgICAgIG9zLnJlbW92ZShvdXRwdXRfZmlsZSkKKyAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICByYWlzZQorCisgICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICAgICAgW2d0ZXN0X3Byb2dfcGF0aCwgJyVzPXhtbCcgJSBHVEVTVF9PVVRQVVRfRkxBR10sCisgICAgICAgIHdvcmtpbmdfZGlyPWd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpKQorICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBwLmV4aXRfY29kZSkKKyAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUpKQorCisgIGRlZiB0ZXN0U3VwcHJlc3NlZFhtbE91dHB1dChzZWxmKToKKyAgICAiIiIKKyAgICBUZXN0cyB0aGF0IG5vIFhNTCBmaWxlIGlzIGdlbmVyYXRlZCBpZiB0aGUgZGVmYXVsdCBYTUwgbGlzdGVuZXIgaXMKKyAgICBzaHV0IGRvd24gYmVmb3JlIFJVTl9BTExfVEVTVFMgaXMgaW52b2tlZC4KKyAgICAiIiIKKworICAgIHhtbF9wYXRoID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BST0dSQU1fTkFNRSArICdvdXQueG1sJykKKyAgICBpZiBvcy5wYXRoLmlzZmlsZSh4bWxfcGF0aCk6CisgICAgICBvcy5yZW1vdmUoeG1sX3BhdGgpCisKKyAgICBjb21tYW5kID0gW0dURVNUX1BST0dSQU1fUEFUSCwKKyAgICAgICAgICAgICAgICclcz14bWw6JXMnICUgKEdURVNUX09VVFBVVF9GTEFHLCB4bWxfcGF0aCksCisgICAgICAgICAgICAgICAnLS1zaHV0X2Rvd25feG1sJ10KKyAgICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCisgICAgaWYgcC50ZXJtaW5hdGVkX2J5X3NpZ25hbDoKKyAgICAgICMgcC5zaWduYWwgaXMgYXZhbGFibGUgb25seSBpZiBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsIGlzIFRydWUuCisgICAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICAgIHAudGVybWluYXRlZF9ieV9zaWduYWwsCisgICAgICAgICAgJyVzIHdhcyBraWxsZWQgYnkgc2lnbmFsICVkJyAlIChHVEVTVF9QUk9HUkFNX05BTUUsIHAuc2lnbmFsKSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgcC5leGl0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBleGl0ZWQgd2l0aCBjb2RlICVzLCB3aGljaCBkb2Vzbid0IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgZXhwZWN0ZWQgZXhpdCBjb2RlICVzLicKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvbW1hbmQsIHAuZXhpdF9jb2RlLCAxKSkKKworICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5pc2ZpbGUoeG1sX3BhdGgpKQorCisgIGRlZiB0ZXN0RmlsdGVyZWRUZXN0WG1sT3V0cHV0KHNlbGYpOgorICAgICIiIlZlcmlmaWVzIFhNTCBvdXRwdXQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkLgorCisgICAgUnVucyBhIHRlc3QgcHJvZ3JhbSB0aGF0IGV4ZWN1dGVzIG9ubHkgc29tZSB0ZXN0cyBhbmQgdmVyaWZpZXMgdGhhdAorICAgIG5vbi1zZWxlY3RlZCB0ZXN0cyBkbyBub3Qgc2hvdyB1cCBpbiB0aGUgWE1MIG91dHB1dC4KKyAgICAiIiIKKworICAgIHNlbGYuX1Rlc3RYbWxPdXRwdXQoR1RFU1RfUFJPR1JBTV9OQU1FLCBFWFBFQ1RFRF9GSUxURVJFRF9URVNUX1hNTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3M9Wyclcz1TdWNjZXNzZnVsVGVzdC4qJyAlIEdURVNUX0ZJTFRFUl9GTEFHXSkKKworICBkZWYgX0dldFhtbE91dHB1dChzZWxmLCBndGVzdF9wcm9nX25hbWUsIGV4dHJhX2FyZ3MsIGV4cGVjdGVkX2V4aXRfY29kZSk6CisgICAgIiIiCisgICAgUmV0dXJucyB0aGUgeG1sIG91dHB1dCBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbSBndGVzdF9wcm9nX25hbWUuCisgICAgRnVydGhlcm1vcmUsIHRoZSBwcm9ncmFtJ3MgZXhpdCBjb2RlIG11c3QgYmUgZXhwZWN0ZWRfZXhpdF9jb2RlLgorICAgICIiIgorICAgIHhtbF9wYXRoID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X3Byb2dfbmFtZSArICdvdXQueG1sJykKKyAgICBndGVzdF9wcm9nX3BhdGggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChndGVzdF9wcm9nX25hbWUpCisKKyAgICBjb21tYW5kID0gKFtndGVzdF9wcm9nX3BhdGgsICclcz14bWw6JXMnICUgKEdURVNUX09VVFBVVF9GTEFHLCB4bWxfcGF0aCldICsKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZ3MpCisgICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQorICAgIGlmIHAudGVybWluYXRlZF9ieV9zaWduYWw6CisgICAgICBzZWxmLmFzc2VydF8oRmFsc2UsCisgICAgICAgICAgICAgICAgICAgJyVzIHdhcyBraWxsZWQgYnkgc2lnbmFsICVkJyAlIChndGVzdF9wcm9nX25hbWUsIHAuc2lnbmFsKSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfZXhpdF9jb2RlLCBwLmV4aXRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGV4aXRlZCB3aXRoIGNvZGUgJXMsIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBleHBlY3RlZCBleGl0IGNvZGUgJXMuJworICAgICAgICAgICAgICAgICAgICAgICAgJSAoY29tbWFuZCwgcC5leGl0X2NvZGUsIGV4cGVjdGVkX2V4aXRfY29kZSkpCisgICAgYWN0dWFsID0gbWluaWRvbS5wYXJzZSh4bWxfcGF0aCkKKyAgICByZXR1cm4gYWN0dWFsCisKKyAgZGVmIF9UZXN0WG1sT3V0cHV0KHNlbGYsIGd0ZXN0X3Byb2dfbmFtZSwgZXhwZWN0ZWRfeG1sLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXhpdF9jb2RlLCBleHRyYV9hcmdzPU5vbmUpOgorICAgICIiIgorICAgIEFzc2VydHMgdGhhdCB0aGUgWE1MIGRvY3VtZW50IGdlbmVyYXRlZCBieSBydW5uaW5nIHRoZSBwcm9ncmFtCisgICAgZ3Rlc3RfcHJvZ19uYW1lIG1hdGNoZXMgZXhwZWN0ZWRfeG1sLCBhIHN0cmluZyBjb250YWluaW5nIGFub3RoZXIKKyAgICBYTUwgZG9jdW1lbnQuICBGdXJ0aGVybW9yZSwgdGhlIHByb2dyYW0ncyBleGl0IGNvZGUgbXVzdCBiZQorICAgIGV4cGVjdGVkX2V4aXRfY29kZS4KKyAgICAiIiIKKworICAgIGFjdHVhbCA9IHNlbGYuX0dldFhtbE91dHB1dChndGVzdF9wcm9nX25hbWUsIGV4dHJhX2FyZ3Mgb3IgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2V4aXRfY29kZSkKKyAgICBleHBlY3RlZCA9IG1pbmlkb20ucGFyc2VTdHJpbmcoZXhwZWN0ZWRfeG1sKQorICAgIHNlbGYuTm9ybWFsaXplWG1sKGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCisgICAgc2VsZi5Bc3NlcnRFcXVpdmFsZW50Tm9kZXMoZXhwZWN0ZWQuZG9jdW1lbnRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCisgICAgZXhwZWN0ZWQudW5saW5rKCkKKyAgICBhY3R1YWwudW5saW5rKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBvcy5lbnZpcm9uWydHVEVTVF9TVEFDS19UUkFDRV9ERVBUSCddID0gJzEnCisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiODc3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYwpAQCAtMCwwICsxLDE4MSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorCisvLyBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0IFhNTCBvdXRwdXQuCisvLworLy8gQSB1c2VyIGNhbiBzcGVjaWZ5IFhNTCBvdXRwdXQgaW4gYSBHb29nbGUgVGVzdCBwcm9ncmFtIHRvIHJ1biB2aWEKKy8vIGVpdGhlciB0aGUgR1RFU1RfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZSAtLWd0ZXN0X291dHB1dAorLy8gZmxhZy4gIFRoaXMgaXMgdXNlZCBmb3IgdGVzdGluZyBzdWNoIGZ1bmN0aW9uYWxpdHkuCisvLworLy8gVGhpcyBwcm9ncmFtIHdpbGwgYmUgaW52b2tlZCBmcm9tIGEgUHl0aG9uIHVuaXQgdGVzdC4gIERvbid0IHJ1biBpdAorLy8gZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW07Cit1c2luZyA6OnRlc3Rpbmc6OlVuaXRUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7CisKK2NsYXNzIFN1Y2Nlc3NmdWxUZXN0IDogcHVibGljIFRlc3QgeworfTsKKworVEVTVF9GKFN1Y2Nlc3NmdWxUZXN0LCBTdWNjZWVkcykgeworICBTVUNDRUVEKCkgPDwgIlRoaXMgaXMgYSBzdWNjZXNzLiI7CisgIEFTU0VSVF9FUSgxLCAxKTsKK30KKworY2xhc3MgRmFpbGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RFU1RfRihGYWlsZWRUZXN0LCBGYWlscykgeworICBBU1NFUlRfRVEoMSwgMik7Cit9CisKK2NsYXNzIERpc2FibGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RFU1RfRihEaXNhYmxlZFRlc3QsIERJU0FCTEVEX3Rlc3Rfbm90X3J1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdGVzdCBzaG91bGQgbm90IGJlIHJ1biI7Cit9CisKK1RFU1QoTWl4ZWRSZXN1bHRUZXN0LCBTdWNjZWVkcykgeworICBFWFBFQ1RfRVEoMSwgMSk7CisgIEFTU0VSVF9FUSgxLCAxKTsKK30KKworVEVTVChNaXhlZFJlc3VsdFRlc3QsIEZhaWxzKSB7CisgIEVYUEVDVF9FUSgxLCAyKTsKKyAgQVNTRVJUX0VRKDIsIDMpOworfQorCitURVNUKE1peGVkUmVzdWx0VGVzdCwgRElTQUJMRURfdGVzdCkgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdGVzdCBzaG91bGQgbm90IGJlIHJ1biI7Cit9CisKK1RFU1QoWG1sUXVvdGluZ1Rlc3QsIE91dHB1dHNDRGF0YSkgeworICBGQUlMKCkgPDwgIlhNTCBvdXRwdXQ6ICIKKyAgICAgICAgICAgICI8P3htbCBlbmNvZGluZz1cInV0Zi04XCI+PHRvcD48IVtDREFUQVtjZGF0YSB0ZXh0XV0+PC90b3A+IjsKK30KKworLy8gSGVscHMgdG8gdGVzdCB0aGF0IGludmFsaWQgY2hhcmFjdGVycyBwcm9kdWNlZCBieSB0ZXN0IGNvZGUgZG8gbm90IG1ha2UKKy8vIGl0IGludG8gdGhlIFhNTCBmaWxlLgorVEVTVChJbnZhbGlkQ2hhcmFjdGVyc1Rlc3QsIEludmFsaWRDaGFyYWN0ZXJzSW5NZXNzYWdlKSB7CisgIEZBSUwoKSA8PCAiSW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtceDFceDJdIjsKK30KKworY2xhc3MgUHJvcGVydHlSZWNvcmRpbmdUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsgUmVjb3JkUHJvcGVydHkoIlNldFVwVGVzdENhc2UiLCAieWVzIik7IH0KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duVGVzdENhc2UiLCAiYXllIik7IH0KK307CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIE9uZVByb3BlcnR5KSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7Cit9CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIEludFZhbHVlZFByb3BlcnR5KSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfaW50IiwgMSk7Cit9CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIFRocmVlUHJvcGVydGllcykgeworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzIiLCAiMiIpOworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzMiLCAiMyIpOworfQorCitURVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlKSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIyIik7Cit9CisKK1RFU1QoTm9GaXh0dXJlVGVzdCwgUmVjb3JkUHJvcGVydHkpIHsKKyAgUmVjb3JkUHJvcGVydHkoImtleSIsICIxIik7Cit9CisKK3ZvaWQgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKSB7CisgIHRlc3Rpbmc6OlRlc3Q6OlJlY29yZFByb3BlcnR5KGtleSwgdmFsdWUpOworfQorCit2b2lkIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICB0ZXN0aW5nOjpUZXN0OjpSZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsKK30KKworVEVTVChOb0ZpeHR1cmVUZXN0LCBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSkgeworICBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRQcm9wZXJ0eSgia2V5X2Zvcl91dGlsaXR5X2ludCIsIDEpOworfQorCitURVNUKE5vRml4dHVyZVRlc3QsIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFN0cmluZ1ZhbHVlZFByb3BlcnR5KSB7CisgIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KCJrZXlfZm9yX3V0aWxpdHlfc3RyaW5nIiwgIjEiKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgaXMgb3V0cHV0IGluIHRoZSAndmFsdWVfcGFyYW0nCisvLyBYTUwgYXR0cmlidXRlIGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorY2xhc3MgVmFsdWVQYXJhbVRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworVEVTVF9QKFZhbHVlUGFyYW1UZXN0LCBIYXNWYWx1ZVBhcmFtQXR0cmlidXRlKSB7fQorVEVTVF9QKFZhbHVlUGFyYW1UZXN0LCBBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlKSB7fQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2luZ2xlLCBWYWx1ZVBhcmFtVGVzdCwgVmFsdWVzKDMzLCA0MikpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHR5cGUgcGFyYW1ldGVyIG5hbWUgaXMgb3V0cHV0IGluIHRoZSAndHlwZV9wYXJhbScKKy8vIFhNTCBhdHRyaWJ1dGUgZm9yIHR5cGVkIHRlc3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFR5cGVkVGVzdCA6IHB1YmxpYyBUZXN0IHt9OwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGxvbmc+IFR5cGVkVGVzdFR5cGVzOworVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdCwgVHlwZWRUZXN0VHlwZXMpOworVFlQRURfVEVTVChUeXBlZFRlc3QsIEhhc1R5cGVQYXJhbUF0dHJpYnV0ZSkge30KKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorLy8gVmVyaWZpZXMgdGhhdCB0aGUgdHlwZSBwYXJhbWV0ZXIgbmFtZSBpcyBvdXRwdXQgaW4gdGhlICd0eXBlX3BhcmFtJworLy8gWE1MIGF0dHJpYnV0ZSBmb3IgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UgOiBwdWJsaWMgVGVzdCB7fTsKK1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UpOworVFlQRURfVEVTVF9QKFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UsIEhhc1R5cGVQYXJhbUF0dHJpYnV0ZSkge30KK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UsIEhhc1R5cGVQYXJhbUF0dHJpYnV0ZSk7Cit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGludCwgbG9uZz4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZVR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoU2luZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2VUeXBlcyk7CisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItLXNodXRfZG93bl94bWwiKSA9PSAwKSB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCk7CisgICAgZGVsZXRlIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSk7CisgIH0KKyAgdGVzdGluZzo6VGVzdDo6UmVjb3JkUHJvcGVydHkoImFkX2hvY19wcm9wZXJ0eSIsICI0MiIpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3htbF90ZXN0X3V0aWxzLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L2d0ZXN0X3htbF90ZXN0X3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkMGMzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkKQEAgLTAsMCArMSwxOTQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCB1dGlsaXRpZXMgZm9yIGd0ZXN0X3htbF9vdXRwdXQiIiIKKworX19hdXRob3JfXyA9ICdlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSknCisKK2ltcG9ydCByZQorZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tLCBOb2RlCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworR1RFU1RfT1VUUFVUX0ZMQUcgICAgICAgICA9ICctLWd0ZXN0X291dHB1dCcKK0dURVNUX0RFRkFVTFRfT1VUUFVUX0ZJTEUgPSAndGVzdF9kZXRhaWwueG1sJworCitjbGFzcyBHVGVzdFhNTFRlc3RDYXNlKGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiIKKyAgQmFzZSBjbGFzcyBmb3IgdGVzdHMgb2YgR29vZ2xlIFRlc3QncyBYTUwgb3V0cHV0IGZ1bmN0aW9uYWxpdHkuCisgICIiIgorCisKKyAgZGVmIEFzc2VydEVxdWl2YWxlbnROb2RlcyhzZWxmLCBleHBlY3RlZF9ub2RlLCBhY3R1YWxfbm9kZSk6CisgICAgIiIiCisgICAgQXNzZXJ0cyB0aGF0IGFjdHVhbF9ub2RlIChhIERPTSBub2RlIG9iamVjdCkgaXMgZXF1aXZhbGVudCB0bworICAgIGV4cGVjdGVkX25vZGUgKGFub3RoZXIgRE9NIG5vZGUgb2JqZWN0KSwgaW4gdGhhdCBlaXRoZXIgYm90aCBvZgorICAgIHRoZW0gYXJlIENEQVRBIG5vZGVzIGFuZCBoYXZlIHRoZSBzYW1lIHZhbHVlLCBvciBib3RoIGFyZSBET00KKyAgICBlbGVtZW50cyBhbmQgYWN0dWFsX25vZGUgbWVldHMgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICogIEl0IGhhcyB0aGUgc2FtZSB0YWcgbmFtZSBhcyBleHBlY3RlZF9ub2RlLgorICAgICogIEl0IGhhcyB0aGUgc2FtZSBzZXQgb2YgYXR0cmlidXRlcyBhcyBleHBlY3RlZF9ub2RlLCBlYWNoIHdpdGgKKyAgICAgICB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgZXhwZWN0ZWRfbm9kZS4KKyAgICAgICBFeGNlcHRpb25zIGFyZSBhbnkgYXR0cmlidXRlIG5hbWVkICJ0aW1lIiwgd2hpY2ggbmVlZHMgb25seSBiZQorICAgICAgIGNvbnZlcnRpYmxlIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCBhbnkgYXR0cmlidXRlIG5hbWVkCisgICAgICAgInR5cGVfcGFyYW0iIHdoaWNoIG9ubHkgaGFzIHRvIGJlIG5vbi1lbXB0eS4KKyAgICAqICBJdCBoYXMgYW4gZXF1aXZhbGVudCBzZXQgb2YgY2hpbGQgbm9kZXMgKGluY2x1ZGluZyBlbGVtZW50cyBhbmQKKyAgICAgICBDREFUQSBzZWN0aW9ucykgYXMgZXhwZWN0ZWRfbm9kZS4gIE5vdGUgdGhhdCB3ZSBpZ25vcmUgdGhlCisgICAgICAgb3JkZXIgb2YgdGhlIGNoaWxkcmVuIGFzIHRoZXkgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGluIGFueQorICAgICAgIHBhcnRpY3VsYXIgb3JkZXIuCisgICAgIiIiCisKKyAgICBpZiBleHBlY3RlZF9ub2RlLm5vZGVUeXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5DREFUQV9TRUNUSU9OX05PREUsIGFjdHVhbF9ub2RlLm5vZGVUeXBlKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfbm9kZS5ub2RlVmFsdWUsIGFjdHVhbF9ub2RlLm5vZGVWYWx1ZSkKKyAgICAgIHJldHVybgorCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIGFjdHVhbF9ub2RlLm5vZGVUeXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vZGUuRUxFTUVOVF9OT0RFLCBleHBlY3RlZF9ub2RlLm5vZGVUeXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX25vZGUudGFnTmFtZSwgYWN0dWFsX25vZGUudGFnTmFtZSkKKworICAgIGV4cGVjdGVkX2F0dHJpYnV0ZXMgPSBleHBlY3RlZF9ub2RlLmF0dHJpYnV0ZXMKKyAgICBhY3R1YWxfYXR0cmlidXRlcyAgID0gYWN0dWFsX25vZGUgIC5hdHRyaWJ1dGVzCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIGV4cGVjdGVkX2F0dHJpYnV0ZXMubGVuZ3RoLCBhY3R1YWxfYXR0cmlidXRlcy5sZW5ndGgsCisgICAgICAgICdhdHRyaWJ1dGUgbnVtYmVycyBkaWZmZXIgaW4gZWxlbWVudCAlczpcbkV4cGVjdGVkOiAlclxuQWN0dWFsOiAlcicgJSAoCisgICAgICAgICAgICBhY3R1YWxfbm9kZS50YWdOYW1lLCBleHBlY3RlZF9hdHRyaWJ1dGVzLmtleXMoKSwKKyAgICAgICAgICAgIGFjdHVhbF9hdHRyaWJ1dGVzLmtleXMoKSkpCisgICAgZm9yIGkgaW4gcmFuZ2UoZXhwZWN0ZWRfYXR0cmlidXRlcy5sZW5ndGgpOgorICAgICAgZXhwZWN0ZWRfYXR0ciA9IGV4cGVjdGVkX2F0dHJpYnV0ZXMuaXRlbShpKQorICAgICAgYWN0dWFsX2F0dHIgICA9IGFjdHVhbF9hdHRyaWJ1dGVzLmdldChleHBlY3RlZF9hdHRyLm5hbWUpCisgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgYWN0dWFsX2F0dHIgaXMgbm90IE5vbmUsCisgICAgICAgICAgJ2V4cGVjdGVkIGF0dHJpYnV0ZSAlcyBub3QgZm91bmQgaW4gZWxlbWVudCAlcycgJQorICAgICAgICAgIChleHBlY3RlZF9hdHRyLm5hbWUsIGFjdHVhbF9ub2RlLnRhZ05hbWUpKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgZXhwZWN0ZWRfYXR0ci52YWx1ZSwgYWN0dWFsX2F0dHIudmFsdWUsCisgICAgICAgICAgJyB2YWx1ZXMgb2YgYXR0cmlidXRlICVzIGluIGVsZW1lbnQgJXMgZGlmZmVyOiAlcyB2cyAlcycgJQorICAgICAgICAgIChleHBlY3RlZF9hdHRyLm5hbWUsIGFjdHVhbF9ub2RlLnRhZ05hbWUsCisgICAgICAgICAgIGV4cGVjdGVkX2F0dHIudmFsdWUsIGFjdHVhbF9hdHRyLnZhbHVlKSkKKworICAgIGV4cGVjdGVkX2NoaWxkcmVuID0gc2VsZi5fR2V0Q2hpbGRyZW4oZXhwZWN0ZWRfbm9kZSkKKyAgICBhY3R1YWxfY2hpbGRyZW4gPSBzZWxmLl9HZXRDaGlsZHJlbihhY3R1YWxfbm9kZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgbGVuKGV4cGVjdGVkX2NoaWxkcmVuKSwgbGVuKGFjdHVhbF9jaGlsZHJlbiksCisgICAgICAgICdudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMgZGlmZmVyIGluIGVsZW1lbnQgJyArIGFjdHVhbF9ub2RlLnRhZ05hbWUpCisgICAgZm9yIGNoaWxkX2lkLCBjaGlsZCBpbiBleHBlY3RlZF9jaGlsZHJlbi5pdGVyaXRlbXMoKToKKyAgICAgIHNlbGYuYXNzZXJ0XyhjaGlsZF9pZCBpbiBhY3R1YWxfY2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgJzwlcz4gaXMgbm90IGluIDwlcz4gKGluIGVsZW1lbnQgJXMpJyAlCisgICAgICAgICAgICAgICAgICAgKGNoaWxkX2lkLCBhY3R1YWxfY2hpbGRyZW4sIGFjdHVhbF9ub2RlLnRhZ05hbWUpKQorICAgICAgc2VsZi5Bc3NlcnRFcXVpdmFsZW50Tm9kZXMoY2hpbGQsIGFjdHVhbF9jaGlsZHJlbltjaGlsZF9pZF0pCisKKyAgaWRlbnRpZnlpbmdfYXR0cmlidXRlID0geworICAgICd0ZXN0c3VpdGVzJzogJ25hbWUnLAorICAgICd0ZXN0c3VpdGUnOiAnbmFtZScsCisgICAgJ3Rlc3RjYXNlJzogICduYW1lJywKKyAgICAnZmFpbHVyZSc6ICAgJ21lc3NhZ2UnLAorICAgIH0KKworICBkZWYgX0dldENoaWxkcmVuKHNlbGYsIGVsZW1lbnQpOgorICAgICIiIgorICAgIEZldGNoZXMgYWxsIG9mIHRoZSBjaGlsZCBub2RlcyBvZiBlbGVtZW50LCBhIERPTSBFbGVtZW50IG9iamVjdC4KKyAgICBSZXR1cm5zIHRoZW0gYXMgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIElEcyBvZiB0aGUKKyAgICBjaGlsZHJlbi4gIEZvciA8dGVzdHN1aXRlcz4sIDx0ZXN0c3VpdGU+IGFuZCA8dGVzdGNhc2U+IGVsZW1lbnRzLCB0aGUgSUQKKyAgICBpcyB0aGUgdmFsdWUgb2YgdGhlaXIgIm5hbWUiIGF0dHJpYnV0ZTsgZm9yIDxmYWlsdXJlPiBlbGVtZW50cywgaXQgaXMKKyAgICB0aGUgdmFsdWUgb2YgdGhlICJtZXNzYWdlIiBhdHRyaWJ1dGU7IENEQVRBIHNlY3Rpb25zIGFuZCBub24td2hpdGVzcGFjZQorICAgIHRleHQgbm9kZXMgYXJlIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIENEQVRBIHNlY3Rpb24gd2l0aCBJRAorICAgICJkZXRhaWwiLiAgQW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBhYm92ZQorICAgIGZvdXIgaXMgZW5jb3VudGVyZWQsIGlmIHR3byBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGlkZW50aWZ5aW5nCisgICAgYXR0cmlidXRlcyBhcmUgZW5jb3VudGVyZWQsIG9yIGlmIGFueSBvdGhlciB0eXBlIG9mIG5vZGUgaXMgZW5jb3VudGVyZWQuCisgICAgIiIiCisKKyAgICBjaGlsZHJlbiA9IHt9CisgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKKyAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICBzZWxmLmFzc2VydF8oY2hpbGQudGFnTmFtZSBpbiBzZWxmLmlkZW50aWZ5aW5nX2F0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICdFbmNvdW50ZXJlZCB1bmtub3duIGVsZW1lbnQgPCVzPicgJSBjaGlsZC50YWdOYW1lKQorICAgICAgICBjaGlsZElEID0gY2hpbGQuZ2V0QXR0cmlidXRlKHNlbGYuaWRlbnRpZnlpbmdfYXR0cmlidXRlW2NoaWxkLnRhZ05hbWVdKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hpbGRJRCBub3QgaW4gY2hpbGRyZW4pCisgICAgICAgIGNoaWxkcmVuW2NoaWxkSURdID0gY2hpbGQKKyAgICAgIGVsaWYgY2hpbGQubm9kZVR5cGUgaW4gW05vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERV06CisgICAgICAgIGlmICdkZXRhaWwnIG5vdCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUgb3IKKyAgICAgICAgICAgICAgbm90IGNoaWxkLm5vZGVWYWx1ZS5pc3NwYWNlKCkpOgorICAgICAgICAgICAgY2hpbGRyZW5bJ2RldGFpbCddID0gY2hpbGQub3duZXJEb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oCisgICAgICAgICAgICAgICAgY2hpbGQubm9kZVZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGNoaWxkcmVuWydkZXRhaWwnXS5ub2RlVmFsdWUgKz0gY2hpbGQubm9kZVZhbHVlCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLmZhaWwoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgbm9kZSB0eXBlICVkJyAlIGNoaWxkLm5vZGVUeXBlKQorICAgIHJldHVybiBjaGlsZHJlbgorCisgIGRlZiBOb3JtYWxpemVYbWwoc2VsZiwgZWxlbWVudCk6CisgICAgIiIiCisgICAgTm9ybWFsaXplcyBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgdG8gZWxpbWluYXRlIHJlZmVyZW5jZXMgdG8gdHJhbnNpZW50CisgICAgaW5mb3JtYXRpb24gdGhhdCBtYXkgY2hhbmdlIGZyb20gcnVuIHRvIHJ1bi4KKworICAgICogIFRoZSAidGltZSIgYXR0cmlidXRlIG9mIDx0ZXN0c3VpdGVzPiwgPHRlc3RzdWl0ZT4gYW5kIDx0ZXN0Y2FzZT4KKyAgICAgICBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIGFzdGVyaXNrLCBpZiBpdCBjb250YWlucworICAgICAgIG9ubHkgZGlnaXQgY2hhcmFjdGVycy4KKyAgICAqICBUaGUgInRpbWVzdGFtcCIgYXR0cmlidXRlIG9mIDx0ZXN0c3VpdGVzPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEKKyAgICAgICBzaW5nbGUgYXN0ZXJpc2ssIGlmIGl0IGNvbnRhaW5zIGEgdmFsaWQgSVNPODYwMSBkYXRldGltZSB2YWx1ZS4KKyAgICAqICBUaGUgInR5cGVfcGFyYW0iIGF0dHJpYnV0ZSBvZiA8dGVzdGNhc2U+IGVsZW1lbnRzIGlzIHJlcGxhY2VkIHdpdGggYQorICAgICAgIHNpbmdsZSBhc3RlcmlzayAoaWYgaXQgc24gbm9uLWVtcHR5KSBhcyBpdCBpcyB0aGUgdHlwZSBuYW1lIHJldHVybmVkCisgICAgICAgYnkgdGhlIGNvbXBpbGVyIGFuZCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuCisgICAgKiAgVGhlIGxpbmUgaW5mbyByZXBvcnRlZCBpbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgIm1lc3NhZ2UiCisgICAgICAgYXR0cmlidXRlIGFuZCBDREFUQSBzZWN0aW9uIG9mIDxmYWlsdXJlPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIHRoZQorICAgICAgIGZpbGUncyBiYXNlbmFtZSBhbmQgYSBzaW5nbGUgYXN0ZXJpc2sgZm9yIHRoZSBsaW5lIG51bWJlci4KKyAgICAqICBUaGUgZGlyZWN0b3J5IG5hbWVzIGluIGZpbGUgcGF0aHMgYXJlIHJlbW92ZWQuCisgICAgKiAgVGhlIHN0YWNrIHRyYWNlcyBhcmUgcmVtb3ZlZC4KKyAgICAiIiIKKworICAgIGlmIGVsZW1lbnQudGFnTmFtZSA9PSAndGVzdHN1aXRlcyc6CisgICAgICB0aW1lc3RhbXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3RpbWVzdGFtcCcpCisgICAgICB0aW1lc3RhbXAudmFsdWUgPSByZS5zdWIocideXGR7NH0tXGRcZC1cZFxkVFxkXGQ6XGRcZDpcZFxkJCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyonLCB0aW1lc3RhbXAudmFsdWUpCisgICAgaWYgZWxlbWVudC50YWdOYW1lIGluICgndGVzdHN1aXRlcycsICd0ZXN0c3VpdGUnLCAndGVzdGNhc2UnKToKKyAgICAgIHRpbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3RpbWUnKQorICAgICAgdGltZS52YWx1ZSA9IHJlLnN1YihyJ15cZCsoXC5cZCspPyQnLCAnKicsIHRpbWUudmFsdWUpCisgICAgICB0eXBlX3BhcmFtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCd0eXBlX3BhcmFtJykKKyAgICAgIGlmIHR5cGVfcGFyYW0gYW5kIHR5cGVfcGFyYW0udmFsdWU6CisgICAgICAgIHR5cGVfcGFyYW0udmFsdWUgPSAnKicKKyAgICBlbGlmIGVsZW1lbnQudGFnTmFtZSA9PSAnZmFpbHVyZSc6CisgICAgICBzb3VyY2VfbGluZV9wYXQgPSByJ14uKlsvXFxdKC4qOilcZCtcbicKKyAgICAgICMgUmVwbGFjZXMgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHdpdGggYSBub3JtYWxpemVkIGZvcm0uCisgICAgICBtZXNzYWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCdtZXNzYWdlJykKKyAgICAgIG1lc3NhZ2UudmFsdWUgPSByZS5zdWIoc291cmNlX2xpbmVfcGF0LCAnXFwxKlxuJywgbWVzc2FnZS52YWx1ZSkKKyAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICAgICMgUmVwbGFjZXMgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHdpdGggYSBub3JtYWxpemVkIGZvcm0uCisgICAgICAgICAgY2RhdGEgPSByZS5zdWIoc291cmNlX2xpbmVfcGF0LCAnXFwxKlxuJywgY2hpbGQubm9kZVZhbHVlKQorICAgICAgICAgICMgUmVtb3ZlcyB0aGUgYWN0dWFsIHN0YWNrIHRyYWNlLgorICAgICAgICAgIGNoaWxkLm5vZGVWYWx1ZSA9IHJlLnN1YihyJ1xuU3RhY2sgdHJhY2U6XG4oLnxcbikqJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsIGNkYXRhKQorICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CisgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgc2VsZi5Ob3JtYWxpemVYbWwoY2hpbGQpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvcHJvZHVjdGlvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9wcm9kdWN0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGE0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3Rlc3QvcHJvZHVjdGlvbi5jYwpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgaXMgcGFydCBvZiB0aGUgdW5pdCB0ZXN0IGZvciBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaC4KKworI2luY2x1ZGUgInByb2R1Y3Rpb24uaCIKKworUHJpdmF0ZUNvZGU6OlByaXZhdGVDb2RlKCkgOiB4XygwKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC90ZXN0L3Byb2R1Y3Rpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9wcm9kdWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZDVlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAvdGVzdC9wcm9kdWN0aW9uLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGlzIHBhcnQgb2YgdGhlIHVuaXQgdGVzdCBmb3IgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmguCisKKyNpZm5kZWYgR1RFU1RfVEVTVF9QUk9EVUNUSU9OX0hfCisjZGVmaW5lIEdURVNUX1RFU1RfUFJPRFVDVElPTl9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJvZC5oIgorCitjbGFzcyBQcml2YXRlQ29kZSB7CisgcHVibGljOgorICAvLyBEZWNsYXJlcyBhIGZyaWVuZCB0ZXN0IHRoYXQgZG9lcyBub3QgdXNlIGEgZml4dHVyZS4KKyAgRlJJRU5EX1RFU1QoUHJpdmF0ZUNvZGVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycyk7CisKKyAgLy8gRGVjbGFyZXMgYSBmcmllbmQgdGVzdCB0aGF0IHVzZXMgYSBmaXh0dXJlLgorICBGUklFTkRfVEVTVChQcml2YXRlQ29kZUZpeHR1cmVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycyk7CisKKyAgUHJpdmF0ZUNvZGUoKTsKKworICBpbnQgeCgpIGNvbnN0IHsgcmV0dXJuIHhfOyB9CisgcHJpdmF0ZToKKyAgdm9pZCBzZXRfeChpbnQgYW5feCkgeyB4XyA9IGFuX3g7IH0KKyAgaW50IHhfOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9URVNUX1BST0RVQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY4MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9Db25maWcvRGVidWdQcm9qZWN0LnhjY29uZmlnCkBAIC0wLDAgKzEsMzAgQEAKKy8vCisvLyAgRGVidWdQcm9qZWN0LnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBEZWJ1ZyBDb25maWd1cmF0aW9uIHByb2plY3Qgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kCisvLyAgZXhhbXBsZXMuIEl0IGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJQcm9qZWN0IiBpbmZvCisvLyAgZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisjaW5jbHVkZSAiR2VuZXJhbC54Y2NvbmZpZyIKKworLy8gTm8gb3B0aW1pemF0aW9uCitHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMAorCisvLyBEZXBsb3ltZW50IHBvc3Rwcm9jZXNzaW5nIGlzIHdoYXQgdHJpZ2dlcnMgWGNvZGUgdG8gc3RyaXAsIHR1cm4gaXQgb2ZmCitERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk8KKworLy8gRGVhZCBjb2RlIHN0cmlwcGluZyBvZmYKK0RFQURfQ09ERV9TVFJJUFBJTkcgPSBOTworCisvLyBEZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBvbiBvYnZpb3VzbHkKK0dDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUworCisvLyBEZWZpbmUgdGhlIERFQlVHIG1hY3JvIGluIGFsbCBkZWJ1ZyBidWlsZHMKK09USEVSX0NGTEFHUyA9ICQoT1RIRVJfQ0ZMQUdTKSAtRERFQlVHPTEKKworLy8gVGhlc2UgYXJlIHR1cm5lZCBvZmYgdG8gYXZvaWQgU1RMIGluY29tcGF0aWJpbGl0aWVzIHdpdGggY2xpZW50IGNvZGUKKy8vIC8vIFR1cm5zIG9uIHNwZWNpYWwgQysrIFNUTCBjaGVja3MgdG8gImVuY291cmFnZSIgZ29vZCBTVEwgdXNlCisvLyBHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TKSBfR0xJQkNYWF9ERUJVR19QRURBTlRJQyBfR0xJQkNYWF9ERUJVRyBfR0xJQkNQUF9DT05DRVBUX0NIRUNLUwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1N2IxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL0NvbmZpZy9GcmFtZXdvcmtUYXJnZXQueGNjb25maWcKQEAgLTAsMCArMSwxNyBAQAorLy8KKy8vICBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIEZyYW1ld29yayB0YXJnZXQgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kIGV4YW1wbGVzLiBJdAorLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBEeW5hbWljIGxpYnMgbmVlZCB0byBiZSBwb3NpdGlvbiBpbmRlcGVuZGVudAorR0NDX0RZTkFNSUNfTk9fUElDID0gTk8KKworLy8gRHluYW1pYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBleHRlcm5hbCBzeW1ib2xzIHN0cmlwcGVkLgorU1RSSVBfU1RZTEUgPSBub24tZ2xvYmFsCisKKy8vIExldCB0aGUgdXNlciBpbnN0YWxsIGJ5IHNwZWNpZnlpbmcgdGhlICREU1RST09UIHdpdGggeGNvZGVidWlsZAorU0tJUF9JTlNUQUxMID0gTk8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2UzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnCkBAIC0wLDAgKzEsNDEgQEAKKy8vCisvLyAgR2VuZXJhbC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgR2VuZXJhbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrIGFuZAorLy8gIGV4YW1wbGVzLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBCdWlsZCBmb3IgUFBDIGFuZCBJbnRlbCwgMzItIGFuZCA2NC1iaXQKK0FSQ0hTID0gaTM4NiB4ODZfNjQgcHBjIHBwYzY0CisKKy8vIFplcm9saW5rIHByZXZlbnRzIGxpbmsgd2FybmluZ3Mgc28gdHVybiBpdCBvZmYKK1pFUk9fTElOSyA9IE5PCisKKy8vIFByZWJpbmRpbmcgY29uc2lkZXJlZCB1bmhlbHBmdWwgaW4gMTAuMyBhbmQgbGF0ZXIKK1BSRUJJTkRJTkcgPSBOTworCisvLyBTdHJpY3Rlc3Qgd2FybmluZyBwb2xpY3kKK1dBUk5JTkdfQ0ZMQUdTID0gLVdhbGwgLVdlcnJvciAtV2VuZGlmLWxhYmVscyAtV25ld2xpbmUtZW9mIC1Xbm8tc2lnbi1jb21wYXJlIC1Xc2hhZG93CisKKy8vIFdvcmsgYXJvdW5kIFhjb2RlIGJ1Z3MgYnkgdXNpbmcgZXh0ZXJuYWwgc3RyaXAuIFNlZToKKy8vIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvWGNvZGUtdXNlcnMvMjAwNi9GZWIvbXNnMDAwNTAuaHRtbAorU0VQQVJBVEVfU1RSSVAgPSBZRVMKKworLy8gRm9yY2UgQzk5IGRpYWxlY3QKK0dDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gYzk5CisKKy8vIG5vdCBzdXJlIHdoeSBhcHBsZSBkZWZhdWx0cyB0aGlzIG9uLCBidXQgaXQncyBwcmV0dHkgcmlza3kKK0FMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5PCisKKy8vIFR1cm4gb24gcG9zaXRpb24gZGVwZW5kZW50IGNvZGUgZm9yIG1vc3QgY2FzZXMgKG92ZXJyaWRkZW4gd2hlcmUgYXBwcm9wcmlhdGUpCitHQ0NfRFlOQU1JQ19OT19QSUMgPSBZRVMKKworLy8gRGVmYXVsdCBTREsgYW5kIG1pbmltdW0gT1MgdmVyc2lvbiBpcyAxMC40CitTREtST09UID0gJChERVZFTE9QRVJfU0RLX0RJUikvTWFjT1NYMTAuNHUuc2RrCitNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAxMC40CitHQ0NfVkVSU0lPTiA9IDQuMAorCisvLyBWRVJTSU9OSU5HIEJVSUxEIFNFVFRJTkdTICh1c2VkIGluIEluZm8ucGxpc3QpCitHVEVTVF9WRVJTSU9OSU5GT19BQk9VVCA9ICDCqSAyMDA4IEdvb2dsZSBJbmMuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvQ29uZmlnL1JlbGVhc2VQcm9qZWN0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDlmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZwpAQCAtMCwwICsxLDMyIEBACisvLworLy8gIFJlbGVhc2VQcm9qZWN0LnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBSZWxlYXNlIENvbmZpZ3VyYXRpb24gcHJvamVjdCBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yaworLy8gIGFuZCBleGFtcGxlcy4gSXQgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlByb2plY3QiIGluZm8KKy8vICBkaWFsb2cuCisvLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgorLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLworLy8gCisKKyNpbmNsdWRlICJHZW5lcmFsLnhjY29uZmlnIgorCisvLyBzdWJjb25maWcvUmVsZWFzZS54Y2NvbmZpZworCisvLyBPcHRpbWl6ZSBmb3Igc3BhY2UgYW5kIHNpemUgKEFwcGxlIHJlY29tbWVuZGF0aW9uKQorR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IHMKKworLy8gRGVwbG9tZW50IHBvc3Rwcm9jZXNzaW5nIGlzIHdoYXQgdHJpZ2dlcnMgWGNvZGUgdG8gc3RyaXAKK0RFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBZRVMKKworLy8gTm8gc3ltYm9scworR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk8KKworLy8gRGVhZCBjb2RlIHN0cmlwIGRvZXMgbm90IGFmZmVjdCBPYmpDIGNvZGUgYnV0IGNhbiBoZWxwIGZvciBDCitERUFEX0NPREVfU1RSSVBQSU5HID0gWUVTCisKKy8vIE5ERUJVRyBpcyB1c2VkIGJ5IHRoaW5ncyBsaWtlIGFzc2VydC5oLCBzbyBkZWZpbmUgaXQgZm9yIGdlbmVyYWwgY29tcGF0LgorLy8gQVNTRVJUIGdvaW5nIGF3YXkgaW4gcmVsZWFzZSB0ZW5kcyB0byBjcmVhdGUgdW51c2VkIHZhcnMuCitPVEhFUl9DRkxBR1MgPSAkKE9USEVSX0NGTEFHUykgLUROREVCVUc9MSAtV25vLXVudXNlZC12YXJpYWJsZQorCisvLyBXaGVuIHdlIHN0cmlwIHdlIHdhbnQgdG8gc3RyaXAgYWxsIHN5bWJvbHMgaW4gcmVsZWFzZSwgYnV0IHNhdmUgZXh0ZXJuYWxzLgorU1RSSVBfU1RZTEUgPSBhbGwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjJmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnCkBAIC0wLDAgKzEsMTggQEAKKy8vCisvLyAgU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgc3RhdGljIGxpYnJhcnkgdGFyZ2V0IHNldHRpbmdzIGZvciBsaWJndGVzdC5hLiBJdAorLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBTdGF0aWMgbGlicyBjYW4gYmUgaW5jbHVkZWQgaW4gYnVuZGxlcyBzbyBtYWtlIHRoZW0gcG9zaXRpb24gaW5kZXBlbmRlbnQKK0dDQ19EWU5BTUlDX05PX1BJQyA9IE5PCisKKy8vIFN0YXRpYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBpbnRlcm5hbCBnbG9iYWxzIG9yIGV4dGVybmFsIHN5bWJvbHMKKy8vIHN0cmlwcGVkLgorU1RSSVBfU1RZTEUgPSBkZWJ1Z2dpbmcKKworLy8gTGV0IHRoZSB1c2VyIGluc3RhbGwgYnkgc3BlY2lmeWluZyB0aGUgJERTVFJPT1Qgd2l0aCB4Y29kZWJ1aWxkCitTS0lQX0lOU1RBTEwgPSBOTwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9Db25maWcvVGVzdFRhcmdldC54Y2NvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2NTJiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcKQEAgLTAsMCArMSw4IEBACisvLworLy8gIFRlc3RUYXJnZXQueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIFRlc3QgdGFyZ2V0IHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrIGFuZCBleGFtcGxlcy4gSXQKKy8vICBpcyBzZXQgaW4gdGhlICJCYXNlZCBPbjoiIGRyb3Bkb3duIGluIHRoZSAiVGFyZ2V0IiBpbmZvIGRpYWxvZy4KKworUFJPRFVDVF9OQU1FID0gJChUQVJHRVRfTkFNRSkKK0hFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi9pbmNsdWRlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1Jlc291cmNlcy9JbmZvLnBsaXN0IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQyOGVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20uZ29vZ2xlLiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Rk1XSzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+R1RFU1RfVkVSU0lPTklORk9fTE9ORzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPkdURVNUX1ZFUlNJT05JTkZPX1NIT1JUPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfSBHVEVTVF9WRVJTSU9OSU5GT19MT05HLCAke0dURVNUX1ZFUlNJT05JTkZPX0FCT1VUfTwvc3RyaW5nPgorCTxrZXk+TlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0PC9rZXk+CisJPHN0cmluZz4ke0dURVNUX1ZFUlNJT05JTkZPX0FCT1VUfTwvc3RyaW5nPgorCTxrZXk+Q1NSZXNvdXJjZXNGaWxlTWFwcGVkPC9rZXk+CisJPHRydWUvPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg1MmVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS5nb29nbGUuZ3Rlc3QuJHtQUk9EVUNUX05BTUU6aWRlbnRpZmllcn08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5GTVdLPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNTUmVzb3VyY2VzRmlsZU1hcHBlZDwva2V5PgorCTx0cnVlLz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL1dpZGdldEZyYW1ld29yay54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc2MTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMCwwICsxLDQ1NyBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQyOworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisJCTQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RSAvKiBUZXN0ICovID0geworCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwMjREMTY5MTEzRDdENDYwMEM3MDU5RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVGVzdCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDI0RDE2MTExM0Q3RDI0MDBDNzA1OUUgLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwMjREMTY2MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0OworCQkJcHJvZHVjdE5hbWUgPSBUZXN0QW5kQnVpbGQ7CisJCX07CisJCTQwMjREMUU5MTEzRDgzRkYwMEM3MDU5RSAvKiBUZXN0QW5kQnVpbGQgKi8gPSB7CisJCQlpc2EgPSBQQlhBZ2dyZWdhdGVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDAyNEQxRjAxMTNEODQyQjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0QW5kQnVpbGQiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwMjREMUVEMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJCTQwMjREMUVGMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0QW5kQnVpbGQ7CisJCQlwcm9kdWN0TmFtZSA9IFRlc3RBbmRCdWlsZDsKKwkJfTsKKy8qIEVuZCBQQlhBZ2dyZWdhdGVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkzQjdFQjEyNTBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjMwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyAqLzsgfTsKKwkJM0I3RUIxMjYwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJM0I3RUIxMjgwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovOyB9OworCQkzQjdFQjE0ODBFNUFGM0I0MDBDN0YyMzkgLyogV2lkZ2V0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovOyB9OworCQk0MDI0RDE4ODExM0Q3RDc4MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwMjREMTg1MTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdC5hICovOyB9OworCQk0MDI0RDE4OTExM0Q3RDdBMDBDNzA1OUUgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDAyNEQxODMxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCQkzQjA3QkRGMDBFM0YzRkFFMDA2NDc4NjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwOworCQkJcmVtb3RlSW5mbyA9IGdUZXN0RXhhbXBsZTsKKwkJfTsKKwkJNDAyNEQxNjUxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDNCMDdCREU5MEUzRjNGOUUwMDY0Nzg2OTsKKwkJCXJlbW90ZUluZm8gPSBXaWRnZXRGcmFtZXdvcmtUZXN0OworCQl9OworCQk0MDI0RDFFQzExM0Q4NDA5MDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwOworCQkJcmVtb3RlSW5mbyA9IFdpZGdldEZyYW1ld29yazsKKwkJfTsKKwkJNDAyNEQxRUUxMTNEODQwRDAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RTsKKwkJCXJlbW90ZUluZm8gPSBUZXN0OworCQl9OworLyogRW5kIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkzQjA3QkRFQTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJM0I3RUIxMjMwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHdpZGdldC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSB3aWRnZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gd2lkZ2V0X3Rlc3QuY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwMjREMTgzMTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gbGliZ3Rlc3RfbWFpbi5hOyBwYXRoID0gL3Vzci9sb2NhbC9saWIvbGliZ3Rlc3RfbWFpbi5hOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQk0MDI0RDE4NTExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSBsaWJndGVzdC5hOyBwYXRoID0gL3Vzci9sb2NhbC9saWIvbGliZ3Rlc3QuYTsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJNDAyNEQxRTIxMTNEODM4MjAwQzcwNTlFIC8qIHJ1bnRlc3RzLnNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQuc2g7IHBhdGggPSBydW50ZXN0cy5zaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQwN0YyQzcwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0OyBwYXRoID0gSW5mby5wbGlzdDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQwN0YyQzgwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBXaWRnZXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTNCMDdCREU4MEUzRjNGOUUwMDY0Nzg2OSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDAyNEQxODkxMTNEN0Q3QTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTQwMjREMTg4MTEzRDdENzgwMEM3MDU5RSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0I3RUIxNDgwRTVBRjNCNDAwQzdGMjM5IC8qIFdpZGdldC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJOEQwN0YyQzMwNDg2Q0M3QTAwN0NEMUQwIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDA3RjJDODA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0LmZyYW1ld29yayAqLywKKwkJCQkzQjA3QkRFQTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogZ1Rlc3RFeGFtcGxlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDI0RDFFMTExM0Q4MzZDMDBDNzA1OUUgLyogU2NyaXB0cyAqLywKKwkJCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovLAorCQkJCTA4OUMxNjY1RkU4NDExNThDMDJBQUMwNyAvKiBSZXNvdXJjZXMgKi8sCisJCQkJM0IwN0JFMzUwRTQwOTRFNDAwNjQ3ODY5IC8qIFRlc3QgKi8sCisJCQkJMDg2N0Q2OUFGRTg0MDI4RkMwMkFBQzA3IC8qIEV4dGVybmFsIEZyYW1ld29ya3MgYW5kIExpYnJhcmllcyAqLywKKwkJCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9IGdUZXN0RXhhbXBsZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjlBRkU4NDAyOEZDMDJBQUMwNyAvKiBFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwMjREMTgzMTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgKi8sCisJCQkJNDAyNEQxODUxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0LmEgKi8sCisJCQkpOworCQkJbmFtZSA9ICJFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg5QzE2NjVGRTg0MTE1OEMwMkFBQzA3IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQwN0YyQzcwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkpOworCQkJbmFtZSA9IFJlc291cmNlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTNCN0VCMTIzMEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuY2MgKi8sCisJCQkJM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovLAorCQkJKTsKKwkJCW5hbWUgPSBTb3VyY2U7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQjA3QkUzNTBFNDA5NEU0MDA2NDc4NjkgLyogVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNDAyNEQxRTExMTNEODM2QzAwQzcwNTlFIC8qIFNjcmlwdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwMjREMUUyMTEzRDgzODIwMEM3MDU5RSAvKiBydW50ZXN0cy5zaCAqLywKKwkJCSk7CisJCQluYW1lID0gU2NyaXB0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovID0geworCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJM0I3RUIxMjYwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oIGluIEhlYWRlcnMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQkzQjA3QkRFOTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAzQjA3QkRGNDBFM0YzRkI2MDA2NDc4NjkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIldpZGdldEZyYW1ld29ya1Rlc3QiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJM0IwN0JERTcwRTNGM0Y5RTAwNjQ3ODY5IC8qIFNvdXJjZXMgKi8sCisJCQkJM0IwN0JERTgwRTNGM0Y5RTAwNjQ3ODY5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJM0IwN0JERjEwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IFdpZGdldEZyYW1ld29ya1Rlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IGdUZXN0RXhhbXBsZVRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gM0IwN0JERUEwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0RnJhbWV3b3JrICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMDdGMkMxMDQ4NkNDN0EwMDdDRDFEMCAvKiBTb3VyY2VzICovLAorCQkJCThEMDdGMkMzMDQ4NkNDN0EwMDdDRDFEMCAvKiBGcmFtZXdvcmtzICovLAorCQkJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovLAorCQkJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQwN0YyQzUwNDg2Q0M3QTAwN0NEMUQwIC8qIFJleiAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gV2lkZ2V0RnJhbWV3b3JrOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIjsKKwkJCXByb2R1Y3ROYW1lID0gZ1Rlc3RFeGFtcGxlOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDhEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5mcmFtZXdvcmsiOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldpZGdldEZyYW1ld29yayIgKi87CisJCQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAyLjQiOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CisJCQltYWluR3JvdXAgPSAwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogZ1Rlc3RFeGFtcGxlICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi8sCisJCQkJM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi8sCisJCQkJNDAyNEQxNjIxMTNEN0QyNDAwQzcwNTlFIC8qIFRlc3QgKi8sCisJCQkJNDAyNEQxRTkxMTNEODNGRjAwQzcwNTlFIC8qIFRlc3RBbmRCdWlsZCAqLywKKwkJCSk7CisJCX07CisvKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDA3RjJCRjA0ODZDQzdBMDA3Q0QxRDAgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmV6QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkM1MDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXogKi8gPSB7CisJCQlpc2EgPSBQQlhSZXpCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlekJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk0MDI0RDE2MTExM0Q3RDI0MDBDNzA1OUUgLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCSk7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7CisJCQlzaGVsbFNjcmlwdCA9ICIvYmluL2Jhc2ggJFNSQ1JPT1QvcnVudGVzdHMuc2ggJEJVSUxUX1BST0RVQ1RTX0RJUi9XaWRnZXRGcmFtZXdvcmtUZXN0XG4iOworCQl9OworLyogRW5kIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0IwN0JERTcwRTNGM0Y5RTAwNjQ3ODY5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQjdFQjEyODBFNUFFRTQ2MDBDN0YyMzkgLyogd2lkZ2V0X3Rlc3QuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJOEQwN0YyQzEwNDg2Q0M3QTAwN0NEMUQwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQjdFQjEyNTBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKwkJM0IwN0JERjEwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldEZyYW1ld29yayAqLzsKKwkJCXRhcmdldFByb3h5ID0gM0IwN0JERjAwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDAyNEQxNjYxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwMjREMTY1MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwMjREMUVEMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwMjREMUVDMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwMjREMUVGMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RSAvKiBUZXN0ICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDI0RDFFRTExM0Q4NDBEMDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworLyogRW5kIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCTNCMDdCREVDMEUzRjNGOUYwMDY0Nzg2OSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXRGcmFtZXdvcmtUZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJM0IwN0JERUQwRTNGM0Y5RjAwNjQ3ODY5IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxNjMxMTNEN0QyNDAwQzcwNTlFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwMjREMTY0MTEzRDdEMjQwMEM3MDU5RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxRUExMTNEODNGRjAwQzcwNTlFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwMjREMUVCMTEzRDgzRkYwMEM3MDU5RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICJAbG9hZGVyX3BhdGgvLi4vRnJhbWV3b3JrcyI7CisJCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIkBsb2FkZXJfcGF0aC8uLi9GcmFtZXdvcmtzIjsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXQ7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ3MDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTNCMDdCREY0MEUzRjNGQjYwMDY0Nzg2OSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrVGVzdCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkzQjA3QkRFQzBFM0YzRjlGMDA2NDc4NjkgLyogRGVidWcgKi8sCisJCQkJM0IwN0JERUQwRTNGM0Y5RjAwNjQ3ODY5IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxNjkxMTNEN0Q0NjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwMjREMTYzMTEzRDdEMjQwMEM3MDU5RSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDI0RDE2NDExM0Q3RDI0MDBDNzA1OUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDI0RDFGMDExM0Q4NDJCMDBDNzA1OUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlRlc3RBbmRCdWlsZCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MDI0RDFFQTExM0Q4M0ZGMDBDNzA1OUUgLyogRGVidWcgKi8sCisJCQkJNDAyNEQxRUIxMTNEODNGRjAwQzcwNTlFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDIwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJXaWRnZXRGcmFtZXdvcmsiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ0MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldpZGdldEZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDgwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3J1bnRlc3RzLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTBkNDEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgRXhlY3V0ZXMgdGhlIHNhbXBsZXMgYW5kIHRlc3RzIGZvciB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLgorCisjIEhlbHAgdGhlIGR5bmFtaWMgbGlua2VyIGZpbmQgdGhlIHBhdGggdG8gdGhlIGxpYnJhcmllcy4KK2V4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKK2V4cG9ydCBEWUxEX0xJQlJBUllfUEFUSD0kQlVJTFRfUFJPRFVDVFNfRElSCisKKyMgQ3JlYXRlIHNvbWUgZXhlY3V0YWJsZXMuCit0ZXN0X2V4ZWN1dGFibGVzPSRACisKKyMgTm93IGV4ZWN1dGUgZWFjaCBvbmUgaW4gdHVybiBrZWVwaW5nIHRyYWNrIG9mIGhvdyBtYW55IHN1Y2NlZWRlZCBhbmQgZmFpbGVkLgorc3VjY2VlZGVkPTAKK2ZhaWxlZD0wCitmYWlsZWRfbGlzdD0oKQorZm9yIHRlc3QgaW4gJHt0ZXN0X2V4ZWN1dGFibGVzWypdfTsgZG8KKyAgIiR0ZXN0IgorICByZXN1bHQ9JD8KKyAgaWYgWyAkcmVzdWx0IC1lcSAwIF07IHRoZW4KKyAgICBzdWNjZWVkZWQ9JCgoICRzdWNjZWVkZWQgKyAxICkpCisgIGVsc2UKKyAgICBmYWlsZWQ9JCgoIGZhaWxlZCArIDEgKSkKKyAgICBmYWlsZWRfbGlzdD0iJGZhaWxlZF9saXN0ICR0ZXN0IgorICBmaQorZG9uZQorCisjIFJlcG9ydCB0aGUgc3VjY2Vzc2VzIGFuZCBmYWlsdXJlcyB0byB0aGUgY29uc29sZS4KK2VjaG8gIlRlc3RzIGNvbXBsZXRlIHdpdGggJHN1Y2NlZWRlZCBzdWNjZXNzZXMgYW5kICRmYWlsZWQgZmFpbHVyZXMuIgoraWYgWyAkZmFpbGVkIC1uZSAwIF07IHRoZW4KKyAgZWNobyAiVGhlIGZvbGxvd2luZyB0ZXN0cyBmYWlsZWQ6IgorICBlY2hvICRmYWlsZWRfbGlzdAorZmkKK2V4aXQgJGZhaWxlZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmM0ZTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCisvLworLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKKy8vIHdpZGdldC5jYworLy8KKworLy8gV2lkZ2V0IGlzIGEgdmVyeSBzaW1wbGUgY2xhc3MgdXNlZCBmb3IgZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIGd0ZXN0CisKKyNpbmNsdWRlICJ3aWRnZXQuaCIKKworV2lkZ2V0OjpXaWRnZXQoaW50IG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiBudW1iZXJfKG51bWJlciksCisgICAgICBuYW1lXyhuYW1lKSB7fQorCitXaWRnZXQ6On5XaWRnZXQoKSB7fQorCitmbG9hdCBXaWRnZXQ6OkdldEZsb2F0VmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBudW1iZXJfOworfQorCitpbnQgV2lkZ2V0OjpHZXRJbnRWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obnVtYmVyXyk7Cit9CisKK3N0ZDo6c3RyaW5nIFdpZGdldDo6R2V0U3RyaW5nVmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lXzsKK30KKwordm9pZCBXaWRnZXQ6OkdldENoYXJQdHJWYWx1ZShjaGFyKiBidWZmZXIsIHNpemVfdCBtYXhfc2l6ZSkgY29uc3QgeworICAvLyBDb3B5IHRoZSBjaGFyKiByZXByZXNlbnRhdGlvbiBvZiBuYW1lXyBpbnRvIGJ1ZmZlciwgdXAgdG8gbWF4X3NpemUuCisgIHN0cm5jcHkoYnVmZmVyLCBuYW1lXy5jX3N0cigpLCBtYXhfc2l6ZS0xKTsKKyAgYnVmZmVyW21heF9zaXplLTFdID0gJ1wwJzsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1NWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCisvLworLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKKy8vIHdpZGdldC5oCisvLworCisvLyBXaWRnZXQgaXMgYSB2ZXJ5IHNpbXBsZSBjbGFzcyB1c2VkIGZvciBkZW1vbnN0cmF0aW5nIHRoZSB1c2Ugb2YgZ3Rlc3QuIEl0CisvLyBzaW1wbHkgc3RvcmVzIHR3byB2YWx1ZXMgYSBzdHJpbmcgYW5kIGFuIGludGVnZXIsIHdoaWNoIGFyZSByZXR1cm5lZCB2aWEKKy8vIHB1YmxpYyBhY2Nlc3NvcnMgaW4gbXVsdGlwbGUgZm9ybXMuCisKKyNpbXBvcnQgPHN0cmluZz4KKworY2xhc3MgV2lkZ2V0IHsKKyBwdWJsaWM6CisgIFdpZGdldChpbnQgbnVtYmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgIH5XaWRnZXQoKTsKKworICAvLyBQdWJsaWMgYWNjZXNzb3JzIHRvIG51bWJlciBkYXRhCisgIGZsb2F0IEdldEZsb2F0VmFsdWUoKSBjb25zdDsKKyAgaW50IEdldEludFZhbHVlKCkgY29uc3Q7CisKKyAgLy8gUHVibGljIGFjY2Vzc29ycyB0byB0aGUgc3RyaW5nIGRhdGEKKyAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nVmFsdWUoKSBjb25zdDsKKyAgdm9pZCBHZXRDaGFyUHRyVmFsdWUoY2hhciogYnVmZmVyLCBzaXplX3QgbWF4X3NpemUpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gRGF0YSBtZW1iZXJzCisgIGZsb2F0IG51bWJlcl87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjU5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHByZXN0b24uYS5qYWNrc29uQGdtYWlsLmNvbSAoUHJlc3RvbiBKYWNrc29uKQorLy8KKy8vIEdvb2dsZSBUZXN0IC0gRnJhbWV3b3JrU2FtcGxlCisvLyB3aWRnZXRfdGVzdC5jYworLy8KKworLy8gVGhpcyBpcyBhIHNpbXBsZSB0ZXN0IGZpbGUgZm9yIHRoZSBXaWRnZXQgY2xhc3MgaW4gdGhlIFdpZGdldC5mcmFtZXdvcmsKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8V2lkZ2V0L3dpZGdldC5oPgorCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgY29uc3RydWN0b3Igc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlCisvLyBXaWRnZXQgY2xhc3MgY29ycmVjdGx5LgorVEVTVChXaWRnZXRJbml0aWFsaXplclRlc3QsIFRlc3RDb25zdHJ1Y3RvcikgeworICBXaWRnZXQgd2lkZ2V0KDEuMGYsICJuYW1lIik7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjBmLCB3aWRnZXQuR2V0RmxvYXRWYWx1ZSgpKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCJuYW1lIiksIHdpZGdldC5HZXRTdHJpbmdWYWx1ZSgpKTsKK30KKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBmbG9hdCBhbmQgc3RyaW5nIHZhbHVlcyB0byBpbnQgYW5kCisvLyBjaGFyKiwgcmVzcGVjdGl2ZWx5LgorVEVTVChXaWRnZXRJbml0aWFsaXplclRlc3QsIFRlc3RDb252ZXJzaW9uKSB7CisgIFdpZGdldCB3aWRnZXQoMS4wZiwgIm5hbWUiKTsKKyAgRVhQRUNUX0VRKDEsIHdpZGdldC5HZXRJbnRWYWx1ZSgpKTsKKworICBzaXplX3QgbWF4X3NpemUgPSAxMjg7CisgIGNoYXIgYnVmZmVyW21heF9zaXplXTsKKyAgd2lkZ2V0LkdldENoYXJQdHJWYWx1ZShidWZmZXIsIG1heF9zaXplKTsKKyAgRVhQRUNUX1NUUkVRKCJuYW1lIiwgYnVmZmVyKTsKK30KKworLy8gVXNlIHRoZSBHb29nbGUgVGVzdCBtYWluIHRoYXQgaXMgbGlua2VkIGludG8gdGhlIGZyYW1ld29yay4gSXQgZG9lcyBzb21ldGhpbmcKKy8vIGxpa2UgdGhpczoKKy8vIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworLy8gICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisvLyAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7CisvLyB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NjcmlwdHMvcnVudGVzdHMuc2ggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NjcmlwdHMvcnVudGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjMjI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDY1IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgRXhlY3V0ZXMgdGhlIHNhbXBsZXMgYW5kIHRlc3RzIGZvciB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLgorCisjIEhlbHAgdGhlIGR5bmFtaWMgbGlua2VyIGZpbmQgdGhlIHBhdGggdG8gdGhlIGxpYnJhcmllcy4KK2V4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKK2V4cG9ydCBEWUxEX0xJQlJBUllfUEFUSD0kQlVJTFRfUFJPRFVDVFNfRElSCisKKyMgQ3JlYXRlIHNvbWUgZXhlY3V0YWJsZXMuCit0ZXN0X2V4ZWN1dGFibGVzPSgiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiCisgICAgICAgICAgICAgICAgICAiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdCIKKyAgICAgICAgICAgICAgICAgICIkQlVJTFRfUFJPRFVDVFNfRElSL3NhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIgorICAgICAgICAgICAgICAgICAgIiRCVUlMVF9QUk9EVUNUU19ESVIvc2FtcGxlMV91bml0dGVzdC1zdGF0aWMiKQorCisjIE5vdyBleGVjdXRlIGVhY2ggb25lIGluIHR1cm4ga2VlcGluZyB0cmFjayBvZiBob3cgbWFueSBzdWNjZWVkZWQgYW5kIGZhaWxlZC4gCitzdWNjZWVkZWQ9MAorZmFpbGVkPTAKK2ZhaWxlZF9saXN0PSgpCitmb3IgdGVzdCBpbiAke3Rlc3RfZXhlY3V0YWJsZXNbKl19OyBkbworICAiJHRlc3QiCisgIHJlc3VsdD0kPworICBpZiBbICRyZXN1bHQgLWVxIDAgXTsgdGhlbgorICAgIHN1Y2NlZWRlZD0kKCggJHN1Y2NlZWRlZCArIDEgKSkKKyAgZWxzZQorICAgIGZhaWxlZD0kKCggZmFpbGVkICsgMSApKQorICAgIGZhaWxlZF9saXN0PSIkZmFpbGVkX2xpc3QgJHRlc3QiCisgIGZpCitkb25lCisKKyMgUmVwb3J0IHRoZSBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIHRvIHRoZSBjb25zb2xlLgorZWNobyAiVGVzdHMgY29tcGxldGUgd2l0aCAkc3VjY2VlZGVkIHN1Y2Nlc3NlcyBhbmQgJGZhaWxlZCBmYWlsdXJlcy4iCitpZiBbICRmYWlsZWQgLW5lIDAgXTsgdGhlbgorICBlY2hvICJUaGUgZm9sbG93aW5nIHRlc3RzIGZhaWxlZDoiCisgIGVjaG8gJGZhaWxlZF9saXN0CitmaQorZXhpdCAkZmFpbGVkCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL2d0ZXN0L2d0ZXN0LTEuNy4wL3hjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MWRlOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weQpAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQSBzY3JpcHQgdG8gcHJlcGFyZSB2ZXJzaW9uIGluZm9ybXRpb24gZm9yIHVzZSB0aGUgZ3Rlc3QgSW5mby5wbGlzdCBmaWxlLgorCisgIFRoaXMgc2NyaXB0IGV4dHJhY3RzIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIGFuZAorICB1c2VzIGl0IHRvIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gVGhlCisgICNkZWZpbmVzIGluIHRoaXMgaGVhZGVyIGZpbGUgd2lsbCBiZSBpbmNsdWRlZCBpbiBkdXJpbmcgdGhlIGdlbmVyYXRpb24gb2YKKyAgdGhlIEluZm8ucGxpc3Qgb2YgdGhlIGZyYW1ld29yaywgZ2l2aW5nIHRoZSBjb3JyZWN0IHZhbHVlIHRvIHRoZSB2ZXJzaW9uCisgIHNob3duIGluIHRoZSBGaW5kZXIuCisKKyAgVGhpcyBzY3JpcHQgbWFrZXMgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9ucyAodGhlc2UgYXJlIGZhdWx0cyBvZiB0aGUgc2NyaXB0LAorICBub3QgcHJvYmxlbXMgd2l0aCB0aGUgQXV0b2NvbmYpOgorICAgIDEuIFRoZSBBQ19JTklUIG1hY3JvIHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZmlyc3QgMTAyNCBjaGFyYWN0ZXJzCisgICAgICAgb2YgY29uZmlndXJlLmFjCisgICAgMi4gVGhlIHZlcnNpb24gc3RyaW5nIHdpbGwgYmUgMyBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgd2lsbCBiZQorICAgICAgIHN1cnJvdW5kZWQgYnkgc3F1cmUgYnJhY2tldHMsICJbIiBhbmQgIl0iIChlLmcuIFsxLjAuMV0pLiBUaGUgZmlyc3QKKyAgICAgICBzZWdtZW50IHJlcHJlc2VudHMgdGhlIG1ham9yIHZlcnNpb24sIHRoZSBzZWNvbmQgcmVwcmVzZW50cyB0aGUgbWlub3IKKyAgICAgICB2ZXJzaW9uIGFuZCB0aGUgdGhpcmQgcmVwcmVzZW50cyB0aGUgZml4IHZlcnNpb24uCisgICAgMy4gTm8gIikiIGNoYXJhY3RlciBleGlzdHMgYmV0d2VlbiB0aGUgb3BlbmluZyAiKCIgYW5kIGNsb3NpbmcgIikiIG9mCisgICAgICAgQUNfSU5JVCwgaW5jbHVkaW5nIGluIGNvbW1lbnRzIGFuZCBjaGFyYWN0ZXIgc3RyaW5ncy4KKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKKworIyBSZWFkIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgKHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBWZXJzaW9uLmgpCitpZiAobGVuKHN5cy5hcmd2KSA8IDMpOgorICBwcmludCAiVXNhZ2U6IHZlcnNpb25nZW5lcmF0ZS5weSBpbnB1dF9kaXIgb3V0cHV0X2RpciIKKyAgc3lzLmV4aXQoMSkKK2Vsc2U6CisgIGlucHV0X2RpciA9IHN5cy5hcmd2WzFdCisgIG91dHB1dF9kaXIgPSBzeXMuYXJndlsyXQorCisjIFJlYWQgdGhlIGZpcnN0IDEwMjQgY2hhcmFjdGVycyBvZiB0aGUgY29uZmlndXJlLmFjIGZpbGUKK2NvbmZpZ19maWxlID0gb3BlbigiJXMvY29uZmlndXJlLmFjIiAlIGlucHV0X2RpciwgJ3InKQorYnVmZmVyX3NpemUgPSAxMDI0CitvcGVuaW5nX3N0cmluZyA9IGNvbmZpZ19maWxlLnJlYWQoYnVmZmVyX3NpemUpCitjb25maWdfZmlsZS5jbG9zZSgpCisKKyMgRXh0cmFjdCB0aGUgdmVyc2lvbiBzdHJpbmcgZnJvbSB0aGUgQUNfSU5JVCBtYWNybworIyAgIFRoZSBmb2xsb3dpbmcgaW5pdF9leHByZXNzaW9uIG1lYW5zOgorIyAgICAgRXh0cmFjdCB0aHJlZSBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgc3Vycm91bmRlZCBieSBzcXVyZQorIyAgICAgYnJhY2tldHMoZS5nLiAiWzEuMC4xXSIpIGJldHdlZW4gIkFDX0lOSVQoIiBhbmQgIikiLiBEbyBub3QgYmUgZ3JlZWR5CisjICAgICAoKj8gaXMgdGhlIG5vbi1ncmVlZHkgZmxhZykgc2luY2UgdGhhdCB3b3VsZCBwdWxsIGluIGV2ZXJ5dGhpbmcgYmV0d2VlbgorIyAgICAgdGhlIGZpcnN0ICIoIiBhbmQgdGhlIGxhc3QgIikiIGluIHRoZSBmaWxlLgordmVyc2lvbl9leHByZXNzaW9uID0gcmUuY29tcGlsZShyIkFDX0lOSVRcKC4qP1xbKFxkKylcLihcZCspXC4oXGQrKVxdLio/XCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5ET1RBTEwpCit2ZXJzaW9uX3ZhbHVlcyA9IHZlcnNpb25fZXhwcmVzc2lvbi5zZWFyY2gob3BlbmluZ19zdHJpbmcpCittYWpvcl92ZXJzaW9uID0gdmVyc2lvbl92YWx1ZXMuZ3JvdXAoMSkKK21pbm9yX3ZlcnNpb24gPSB2ZXJzaW9uX3ZhbHVlcy5ncm91cCgyKQorZml4X3ZlcnNpb24gPSB2ZXJzaW9uX3ZhbHVlcy5ncm91cCgzKQorCisjIFdyaXRlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRvIGEgaGVhZGVyIGZpbGUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisjIEluZm8ucGxpc3QgZmlsZS4KK2ZpbGVfZGF0YSA9ICIiIi8vCisvLyBETyBOT1QgTU9ESUZZIFRISVMgRklMRSAoYnV0IHlvdSBjYW4gZGVsZXRlIGl0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IHRoZSB2ZXJzaW9uZ2VuZXJhdGUucHkgc2NyaXB0LiBUaGlzIHNjcmlwdAorLy8gaXMgZXhlY3V0ZWQgaW4gYSAiUnVuIFNjcmlwdCIgYnVpbGQgcGhhc2Ugd2hlbiBjcmVhdGluZyBndGVzdC5mcmFtZXdvcmsuIFRoaXMKKy8vIGhlYWRlciBmaWxlIGlzIG5vdCB1c2VkIGR1cmluZyBjb21waWxhdGlvbiBvZiBDLXNvdXJjZS4gUmF0aGVyLCBpdCBzaW1wbHkKKy8vIGRlZmluZXMgc29tZSB2ZXJzaW9uIHN0cmluZ3MgZm9yIHN1YnN0aXR1dGlvbiBpbiB0aGUgSW5mby5wbGlzdC4gQmVjYXVzZSBvZgorLy8gdGhpcywgd2UgYXJlIG5vdCBub3QgcmVzdHJpY3RlZCB0byBDLXN5bnRheCBub3IgYXJlIHdlIHVzaW5nIGluY2x1ZGUgZ3VhcmRzLgorLy8KKworI2RlZmluZSBHVEVTVF9WRVJTSU9OSU5GT19TSE9SVCAlcy4lcworI2RlZmluZSBHVEVTVF9WRVJTSU9OSU5GT19MT05HICVzLiVzLiVzCisKKyIiIiAlIChtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uLCBtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uLCBmaXhfdmVyc2lvbikKK3ZlcnNpb25fZmlsZSA9IG9wZW4oIiVzL1ZlcnNpb24uaCIgJSBvdXRwdXRfZGlyLCAndycpCit2ZXJzaW9uX2ZpbGUud3JpdGUoZmlsZV9kYXRhKQordmVyc2lvbl9maWxlLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvZ3Rlc3QueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvZ3Rlc3QvZ3Rlc3QtMS43LjAveGNvZGUvZ3Rlc3QueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDUyYTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9ndGVzdC9ndGVzdC0xLjcuMC94Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMTEzNSBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQ2OworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisJCTNCMjM4RjVGMEU4MjhCNTQwMDg0NkUxMSAvKiBDaGVjayAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAzQjIzOEZBMzBFODI4QkI2MDA4NDZFMTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIkNoZWNrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTNCMjM4RjVFMEU4MjhCNTQwMDg0NkUxMSAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDA4OTlGOUQwRkZBNzQwRjAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5RjcxMDFBNDM0NDAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDA4OUEwOTgwRkZBRDM0QTAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5RjkxMDFBNDM0OTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IENoZWNrOworCQkJcHJvZHVjdE5hbWUgPSBDaGVjazsKKwkJfTsKKwkJNDBDNDRBREMwRTM3OThGNDAwOEZDQzUxIC8qIFZlcnNpb24gSW5mbyAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MEM0NEFFNDBFMzc5OTA1MDA4RkNDNTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlZlcnNpb24gSW5mbyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MEM0NEFEQjBFMzc5OEY0MDA4RkNDNTEgLyogR2VuZXJhdGUgVmVyc2lvbi5oICovLAorCQkJKTsKKwkJCWNvbW1lbnRzID0gIlRoZSBnZW5lcmF0aW9uIG9mIFZlcnNpb24uaCBtdXN0IGJlIHBlcmZvcm1lZCBpbiBpdHMgb3duIHRhcmdldC4gU2luY2UgdGhlIEluZm8ucGxpc3QgaXMgcHJlcHJvY2Vzc2VkIGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIGJ1aWxkIHBoYXNlcyBpbiBndGVzdCwgdGhlIFZlcnNpb24uaCBmaWxlIHdvdWxkIG5vdCBiZSByZWFkeSBpZiBpbmNsdWRlZCBhcyBhIGJ1aWxkIHBoYXNlIG9mIHRoYXQgdGFyZ2V0LiI7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJWZXJzaW9uIEluZm8iOworCQkJcHJvZHVjdE5hbWUgPSBWZXJzaW9uLmg7CisJCX07CisvKiBFbmQgUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMjI0QTEyQTMwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjI0QTEyQTIwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJM0JGNkYyQTAwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQkY2RjI5RjBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggKi87IH07CisJCTNCRjZGMkE1MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNDA0ODg0MzgwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0RCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzOTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDUwMEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0Y2MEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUgKi87IH07CisJCTQwNDg4NEEwMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0UyMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggKi87IH07CisJCTQwNDg4NEExMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLzsgfTsKKwkJNDA0ODg0QTIwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U0MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oICovOyB9OworCQk0MDQ4ODRBMzBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovOyB9OworCQk0MDQ4ODRBNDBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U2MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCAqLzsgfTsKKwkJNDA0ODg0QUMwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovOyB9OworCQk0MDQ4ODRBRDBFMkY3Q0Q5MDBDRjc2NTggLyogQ09OVFJJQlVUT1JTIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODRBQTBFMkY3Q0Q5MDBDRjc2NTggLyogQ09OVFJJQlVUT1JTICovOyB9OworCQk0MDQ4ODRBRTBFMkY3Q0Q5MDBDRjc2NTggLyogTElDRU5TRSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgKi87IH07CisJCTQwODk5RjNBMEZGQTcwRDQwMDBCMjlBRSAvKiBndGVzdC1hbGwuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyMjRBMTJBMTBFOUVBREE3MDBCRDE3RkQgLyogZ3Rlc3QtYWxsLmNjICovOyB9OworCQk0MDg5OUY1MDBGRkE3MjgxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA4OTlGNEQwRkZBNzI3MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggKi87IH07CisJCTQwODk5RjUzMEZGQTcyQTAwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCMjM4QzEyMEU3RkUxM0MwMDg0NkUxMSAvKiBndGVzdF91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDA4OUEwNDQwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLzsgfTsKKwkJNDA4OUEwNDYwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDBDODQ4RkYxMDFBMjExNTAwODM2NDJBIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi87IH07CisJCTQwQzg0OTE1MTAxQTIxREYwMDgzNjQyQSAvKiBndGVzdF9tYWluLmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0MEQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X21haW4uY2MgKi87IH07CisJCTQwQzg0OTE2MTAxQTIzNUIwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OworCQk0MEM4NDkyMTEwMUEyM0FEMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5NzgxMDFBMzY1NDAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5ODAxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovOyB9OworCQk0MEM4NDk4MjEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovOyB9OworCQk0MEM4NDk4MzEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5OEYxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLzsgfTsKKwkJNDBDODQ5OTAxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDBDODQ5OTIxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDhGQTEwMUEyMDlDMDA4MzY0MkEgLyogbGliZ3Rlc3QuYSAqLzsgfTsKKwkJNDBDODQ5OTMxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OTBCMTAxQTIxN0UwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgKi87IH07CisJCTQwQzg0OUEyMTAxQTM3MDUwMDgzNjQyQSAvKiBndGVzdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovOyB9OworCQk0MEM4NDlBNDEwMUEzNzE1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLzsgfTsKKwkJNDUzOUM5MzQwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTMzMEVDMjgwQUUwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0NTM5QzkzODBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovOyB9OworCQk0NTM5QzkzOTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM5MzYwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggKi87IH07CisJCTQ1MzlDOTNBMEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi87IH07CisJCTQ1NjdDODE4MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDU2N0M4MTcxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisJCTQwODk5RjlDMEZGQTc0MEYwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUU7CisJCQlyZW1vdGVJbmZvID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCX07CisJCTQwODlBMDk3MEZGQUQzNEEwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUU7CisJCQlyZW1vdGVJbmZvID0gc2FtcGxlMV91bml0dGVzdDsKKwkJfTsKKwkJNDA4QkVDMEYxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDNDRBRTUwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MTsKKwkJCXJlbW90ZUluZm8gPSBWZXJzaW9uLmg7CisJCX07CisJCTQwQzg0OTdDMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LXN0YXRpYyI7CisJCX07CisJCTQwQzg0OTdFMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0X21haW4tc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5OEIxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5OEQxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3RfbWFpbi1zdGF0aWMiOworCQl9OworCQk0MEM4NDk5QjEwMUEzNkRDMDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBOworCQkJcmVtb3RlSW5mbyA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCX07CisJCTQwQzg0OTlEMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LWZyYW1ld29yayI7CisJCX07CisJCTQwQzg0OTlGMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LWZyYW1ld29yayI7CisJCX07CisJCTQwQzg0OUY2MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0X3VuaXR0ZXN0LXN0YXRpYyI7CisJCX07CisJCTQwQzg0OUY4MTAxQTQzNDkwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKKwkJfTsKKy8qIEVuZCBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNDA0ODg0QTUwRTJGN0MwNDAwQ0Y3NjU4IC8qIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9IEhlYWRlcnMvaW50ZXJuYWw7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gNjsKKwkJCWZpbGVzID0gKAorCQkJCTQwNDg4NEEwMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEExMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKKwkJCQk0MDQ4ODRBMjBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDUzOUM5MzgwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LWxpbmtlZF9wdHIuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDUzOUM5MzkwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQ1MzlDOTNBMEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEEzMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEE0MEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDA4OTlGNTAwRkZBNzI4MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTNCRjZGMkEwMEU3OUI1QUQwMDBGMkVFRSAvKiBndGVzdC10eXBlLXV0aWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkpOworCQkJbmFtZSA9ICJDb3B5IEhlYWRlcnMgSW50ZXJuYWwiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkyMjRBMTJBMTBFOUVBREE3MDBCRDE3RkQgLyogZ3Rlc3QtYWxsLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9ICJndGVzdC1hbGwuY2MiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyMjRBMTJBMjBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdGVzdC1wYXJ0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQjIzOEMxMjBFN0ZFMTNDMDA4NDZFMTEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBndGVzdF91bml0dGVzdC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I4N0QyMTAwRTk2QjkyRTAwMEQxODUyIC8qIHJ1bnRlc3RzLnNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQuc2g7IHBhdGggPSBydW50ZXN0cy5zaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0JGNkYyOUYwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHlwZS11dGlsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHlwZWQtdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDAzRUUzN0MwRTM3NzgyMjAwNEJEMUUyIC8qIHZlcnNpb25nZW5lcmF0ZS5weSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQuc2NyaXB0LnB5dGhvbjsgcGF0aCA9IHZlcnNpb25nZW5lcmF0ZS5weTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzREIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWRlYXRoLXRlc3QuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0RDMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1tZXNzYWdlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1tZXNzYWdlLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNERDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3BpLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1zcGkuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0RFMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBndGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGd0ZXN0X3ByZWRfaW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFMDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBndGVzdF9wcm9kLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0UyMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWZpbGVwYXRoLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFNDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWludGVybmFsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcG9ydC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzRTYwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXN0cmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3Qtc3RyaW5nLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNGNjBFMkY3OTlCMDBDRjc2NTggLyogUkVBRE1FICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IFJFQURNRTsgcGF0aCA9IC4uL1JFQURNRTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQk0MDQ4ODQwRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfbWFpbi5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGd0ZXN0X21haW4uY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IENIQU5HRVM7IHBhdGggPSAuLi9DSEFOR0VTOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQ09OVFJJQlVUT1JTOyBwYXRoID0gLi4vQ09OVFJJQlVUT1JTOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwNDg4NEFCMEUyRjdDRDkwMENGNzY1OCAvKiBMSUNFTlNFICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IExJQ0VOU0U7IHBhdGggPSAuLi9MSUNFTlNFOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0MDg5OUY0RDBGRkE3MjcxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXR1cGxlLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gc2FtcGxlMS5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA4OUEwMkQwRkZBQ0Y3RjAwMEIyOUFFIC8qIHNhbXBsZTEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gc2FtcGxlMS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHNhbXBsZTFfdW5pdHRlc3QuY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJndGVzdC5hOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJndGVzdF9tYWluLmE7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwQzg0OTg3MTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gZ3Rlc3RfdW5pdHRlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwQzg0OTk3MTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBEZWJ1Z1Byb2plY3QueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnhjY29uZmlnOyBwYXRoID0gRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MEQ0Q0RGMzBFMzBFMDc0MDAyOTQ4MDEgLyogR2VuZXJhbC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBHZW5lcmFsLnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnhjY29uZmlnOyBwYXRoID0gUmVsZWFzZVByb2plY3QueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDRjUxMEUzMEY1RTIwMDI5NDgwMSAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gZ3Rlc3QuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0NTM5QzkzMzBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcGFyYW0tdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDUzOUM5MzUwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LWxpbmtlZF9wdHIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWxpbmtlZF9wdHIuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1MzlDOTM2MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wYXJhbS11dGlsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0NTY3QzgxNzEyNjRGRjcxMDA3NzQwQkUgLyogZ3Rlc3QtcHJpbnRlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXByaW50ZXJzLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTQwODk5RjQxMEZGQTcxODQwMDBCMjlBRSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5QTQxMDFBMzcxNTAwODM2NDJBIC8qIGd0ZXN0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTQwQzg0OTE2MTAxQTIzNUIwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJNDA4OUEwMTEwRkZBQ0VGQzAwMEIyOUFFIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MEM4NDlBMjEwMUEzNzA1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5MjExMDFBMjNBRDAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk4MTEwMUEzNjg1MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTgyMTAxQTM2ODUwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5ODMxMDFBMzY4NTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk5MTEwMUEzNkE2MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTkyMTAxQTM2QTYwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5OTMxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQ1MzlDOEZGMEVDMjdGNjQwMEE3MEY0QyAvKiBndGVzdC5mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi8sCisJCQkJNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLywKKwkJCQk0MDg5OUY0MzBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovLAorCQkJCTQwQzg0OTg3MTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdCAqLywKKwkJCQk0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBndGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDBENENERjAwRTMwRTA3NDAwMjk0ODAxIC8qIENvbmZpZyAqLywKKwkJCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovLAorCQkJCTQwRDRDRjRFMEUzMEY1RTIwMDI5NDgwMSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJNDAzRUUzN0IwRTM3NzgyMjAwNEJEMUUyIC8qIFNjcmlwdHMgKi8sCisJCQkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovLAorCQkJKTsKKwkJCW5hbWUgPSBndGVzdDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovLAorCQkJCTQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi8sCisJCQkJNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgKi8sCisJCQkJNDA0ODgzRjYwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSAqLywKKwkJCQk0MDQ4ODNEOTBFMkY3OTlCMDBDRjc2NTggLyogaW5jbHVkZSAqLywKKwkJCQk0MDg5QTAyRjBGRkFDRjg0MDAwQjI5QUUgLyogc2FtcGxlcyAqLywKKwkJCQk0MDQ4ODQwNzBFMkY3OTlCMDBDRjc2NTggLyogc3JjICovLAorCQkJCTNCMjM4QkYwMEU3RkUxM0IwMDg0NkUxMSAvKiB0ZXN0ICovLAorCQkJKTsKKwkJCW5hbWUgPSBTb3VyY2U7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQjIzOEJGMDBFN0ZFMTNCMDA4NDZFMTEgLyogdGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSB0ZXN0OworCQkJcGF0aCA9IC4uL3Rlc3Q7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwM0VFMzdCMEUzNzc4MjIwMDRCRDFFMiAvKiBTY3JpcHRzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDNFRTM3QzBFMzc3ODIyMDA0QkQxRTIgLyogdmVyc2lvbmdlbmVyYXRlLnB5ICovLAorCQkJCTNCODdEMjEwMEU5NkI5MkUwMDBEMTg1MiAvKiBydW50ZXN0cy5zaCAqLywKKwkJCSk7CisJCQlwYXRoID0gU2NyaXB0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4M0Q5MEUyRjc5OUIwMENGNzY1OCAvKiBpbmNsdWRlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDQ4ODNEQTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QgKi8sCisJCQkpOworCQkJbmFtZSA9IGluY2x1ZGU7CisJCQlwYXRoID0gLi4vaW5jbHVkZTsKKwkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKKwkJfTsKKwkJNDA0ODgzREEwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDQ4ODNFMTBFMkY3OTlCMDBDRjc2NTggLyogaW50ZXJuYWwgKi8sCisJCQkJMjI0QTEyQTIwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oICovLAorCQkJCTQwNDg4M0RCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggKi8sCisJCQkJNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLywKKwkJCQk0NTM5QzkzMzBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oICovLAorCQkJCTQ1NjdDODE3MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oICovLAorCQkJCTQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLywKKwkJCQk0MDQ4ODNERTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QuaCAqLywKKwkJCQk0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi8sCisJCQkJNDA0ODgzRTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCAqLywKKwkJCQkzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBndGVzdDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4M0UxMEUyRjc5OUIwMENGNzY1OCAvKiBpbnRlcm5hbCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDA0ODgzRTIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCAqLywKKwkJCQk0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLywKKwkJCQk0MDQ4ODNFNDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCAqLywKKwkJCQk0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovLAorCQkJCTQ1MzlDOTM2MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oICovLAorCQkJCTQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi8sCisJCQkJNDA0ODgzRTUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXBvcnQuaCAqLywKKwkJCQk0MDQ4ODNFNjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggKi8sCisJCQkJNDA4OTlGNEQwRkZBNzI3MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggKi8sCisJCQkJM0JGNkYyOUYwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBpbnRlcm5hbDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4NDA3MEUyRjc5OUIwMENGNzY1OCAvKiBzcmMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi8sCisJCQkJNDA0ODg0MEQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X21haW4uY2MgKi8sCisJCQkpOworCQkJbmFtZSA9IHNyYzsKKwkJCXBhdGggPSAuLi9zcmM7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwODlBMDJGMEZGQUNGODQwMDBCMjlBRSAvKiBzYW1wbGVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLywKKwkJCQk0MDg5QTAyRDBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5oICovLAorCQkJCTQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSBzYW1wbGVzOworCQkJcGF0aCA9IC4uL3NhbXBsZXM7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwRDRDREYwMEUzMEUwNzQwMDI5NDgwMSAvKiBDb25maWcgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwRDRDREYxMEUzMEUwNzQwMDI5NDgwMSAvKiBEZWJ1Z1Byb2plY3QueGNjb25maWcgKi8sCisJCQkJNDBENENERjIwRTMwRTA3NDAwMjk0ODAxIC8qIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyAqLywKKwkJCQk0MEQ0Q0RGMzBFMzBFMDc0MDAyOTQ4MDEgLyogR2VuZXJhbC54Y2NvbmZpZyAqLywKKwkJCQk0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi8sCisJCQkJNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi8sCisJCQkpOworCQkJcGF0aCA9IENvbmZpZzsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwRDRDRjRFMEUzMEY1RTIwMDI5NDgwMSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwRDRDRjUxMEUzMEY1RTIwMDI5NDgwMSAvKiBJbmZvLnBsaXN0ICovLAorCQkJKTsKKwkJCXBhdGggPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwNDg4NDM4MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggaW4gSGVhZGVycyAqLywKKwkJCQk0MDQ4ODQzOTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDUzOUM5MzQwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTQ1NjdDODE4MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oIGluIEhlYWRlcnMgKi8sCisJCQkJM0JGNkYyQTUwRTc5QjYxNjAwMEYyRUVFIC8qIGd0ZXN0LXR5cGVkLXRlc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTQwNDg4NDNBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCBpbiBIZWFkZXJzICovLAorCQkJCTQwNDg4NDNCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0MwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3ByZWRfaW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0QwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCBpbiBIZWFkZXJzICovLAorCQkJCTIyNEExMkEzMEU5RUFEQ0MwMEJEMTdGRCAvKiBndGVzdC10ZXN0LXBhcnQuaCBpbiBIZWFkZXJzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJNDA4OTlGNDIwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MDg5OUY0QTBGRkE3MUJDMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDg5OUY0MDBGRkE3MTg0MDAwQjI5QUUgLyogU291cmNlcyAqLywKKwkJCQk0MDg5OUY0MTBGRkE3MTg0MDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM4NDlBMDEwMUEzNkYxMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQlwcm9kdWN0TmFtZSA9IGd0ZXN0X3VuaXR0ZXN0OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDA4OUEwMjQwRkZBQ0YwMTAwMEIyOUFFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDg5QTAxMDBGRkFDRUZDMDAwQjI5QUUgLyogU291cmNlcyAqLywKKwkJCQk0MDg5QTAxMTBGRkFDRUZDMDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM4NDk5RTEwMUEzNkU1MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCXByb2R1Y3ROYW1lID0gc2FtcGxlMV91bml0dGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkEgLyogZ3Rlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTAyMTAxQTIxMkUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3Qtc3RhdGljIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwQzg0OEY3MTAxQTIwOUMwMDgzNjQyQSAvKiBTb3VyY2VzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gImd0ZXN0LXN0YXRpYyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmxpYnJhcnkuc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTEyMTAxQTIxRDIwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfbWFpbi1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ5MDgxMDFBMjE3RTAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCQlwcm9kdWN0TmFtZSA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUubGlicmFyeS5zdGF0aWMiOworCQl9OworCQk0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTg0MTAxQTM2ODUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwQzg0OTdGMTAxQTM2ODUwMDgzNjQyQSAvKiBTb3VyY2VzICovLAorCQkJCTQwQzg0OTgxMTAxQTM2ODUwMDgzNjQyQSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwQzg0OTdCMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJCTQwQzg0OTdEMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5ODcxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJNDBDODQ5ODkxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTk0MTAxQTM2QTYwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ5OEUxMDFBMzZBNjAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkJNDBDODQ5OTExMDFBMzZBNjAwODM2NDJBIC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDBDODQ5OEExMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5OEMxMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyI7CisJCQlwcm9kdWN0TmFtZSA9IHNhbXBsZTFfdW5pdHRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIGd0ZXN0LWZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLywKKwkJCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLywKKwkJCQk0MDQ4ODRBNTBFMkY3QzA0MDBDRjc2NTggLyogQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDBDNDRBRTYwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDA4QkVDMTAxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5OUMxMDFBMzZEQzAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJndGVzdC1mcmFtZXdvcmsiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIjsKKwkJCXByb2R1Y3ROYW1lID0gZ3Rlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuZnJhbWV3b3JrIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWF0dHJpYnV0ZXMgPSB7CisJCQkJTGFzdFVwZ3JhZGVDaGVjayA9IDA0NjA7CisJCQl9OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImd0ZXN0IiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMiI7CisJCQlkZXZlbG9wbWVudFJlZ2lvbiA9IEVuZ2xpc2g7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCWtub3duUmVnaW9ucyA9ICgKKwkJCQlFbmdsaXNoLAorCQkJCUphcGFuZXNlLAorCQkJCUZyZW5jaCwKKwkJCQlHZXJtYW4sCisJCQkJZW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIGd0ZXN0ICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLywKKwkJCQk0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi8sCisJCQkJNDA4OTlGNDIwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLywKKwkJCQk0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljICovLAorCQkJCTQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLywKKwkJCQk0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi8sCisJCQkJM0IyMzhGNUYwRTgyOEI1NDAwODQ2RTExIC8qIENoZWNrICovLAorCQkJCTQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MSAvKiBWZXJzaW9uIEluZm8gKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQwN0YyQkYwNDg2Q0M3QTAwN0NEMUQwIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDA0ODg0NTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSBpbiBSZXNvdXJjZXMgKi8sCisJCQkJNDA0ODg0QUMwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgaW4gUmVzb3VyY2VzICovLAorCQkJCTQwNDg4NEFEMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgaW4gUmVzb3VyY2VzICovLAorCQkJCTQwNDg4NEFFMEUyRjdDRDkwMENGNzY1OCAvKiBMSUNFTlNFIGluIFJlc291cmNlcyAqLywKKwkJCQk0MEM4NDk3ODEwMUEzNjU0MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0IyMzhGNUUwRTgyOEI1NDAwODQ2RTExIC8qIFNoZWxsU2NyaXB0ICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSZW1lbWJlciwgdGhpcyBcIlJ1biBTY3JpcHRcIiBidWlsZCBwaGFzZSB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gJFNSQ1JPT1Rcbi9iaW4vYmFzaCBTY3JpcHRzL3J1bnRlc3RzLnNoIjsKKwkJfTsKKwkJNDBDNDRBREIwRTM3OThGNDAwOEZDQzUxIC8qIEdlbmVyYXRlIFZlcnNpb24uaCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJCSIkKFNSQ1JPT1QpL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IiwKKwkJCQkiJChTUkNST09UKS8uLi9jb25maWd1cmUuYWMiLAorCQkJKTsKKwkJCW5hbWUgPSAiR2VuZXJhdGUgVmVyc2lvbi5oIjsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJCSIkKFBST0pFQ1RfVEVNUF9ESVIpL1ZlcnNpb24uaCIsCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSZW1lbWJlciwgdGhpcyBcIlJ1biBTY3JpcHRcIiBidWlsZCBwaGFzZSB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gJFNSQ1JPT1Rcbi91c3IvYmluL3B5dGhvbiBTY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weSAuLi8gJFBST0pFQ1RfVEVNUF9ESVIiOworCQl9OworLyogRW5kIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNDA4OTlGNDAwRkZBNzE4NDAwMEIyOUFFIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDg5OUY1MzBGRkE3MkEwMDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJNDA4OUEwMTAwRkZBQ0VGQzAwMEIyOUFFIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDg5QTA0NDBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovLAorCQkJCTQwODlBMDQ2MEZGQUQxQkUwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OEY3MTAxQTIwOUMwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ4RkYxMDFBMjExNTAwODM2NDJBIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDkwODEwMUEyMTdFMDA4MzY0MkEgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTE1MTAxQTIxREYwMDgzNjQyQSAvKiBndGVzdF9tYWluLmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OTdGMTAxQTM2ODUwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5ODAxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OThFMTAxQTM2QTYwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5OEYxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLywKKwkJCQk0MEM4NDk5MDEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwODk5RjNBMEZGQTcwRDQwMDBCMjlBRSAvKiBndGVzdC1hbGwuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCQk0MDg5OUY5RDBGRkE3NDBGMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDg5OUY5QzBGRkE3NDBGMDAwQjI5QUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MDg5QTA5ODBGRkFEMzRBMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwODlBMDk3MEZGQUQzNEEwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwOEJFQzEwMTA0NkNGRTkwMERFRjUyMiAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwOEJFQzBGMTA0NkNGRTkwMERFRjUyMiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzQ0QUU2MEUzNzk5MjIwMDhGQ0M1MSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MSAvKiBWZXJzaW9uIEluZm8gKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzQ0QUU1MEUzNzk5MjIwMDhGQ0M1MSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTdCMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTdDMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTdEMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQSAvKiBndGVzdF9tYWluLXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5N0UxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDBDODQ5OEExMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5OEIxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDBDODQ5OEMxMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk4RDEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDk5QzEwMUEzNkRDMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlCMTAxQTM2REMwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTlFMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlEMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUEwMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlGMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUY3MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OUY2MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUY5MTAxQTQzNDkwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTg5MTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5RjgxMDFBNDM0OTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKy8qIEVuZCBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQkzQjIzOEY2MDBFODI4QjU0MDA4NDZFMTEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlQUk9EVUNUX05BTUUgPSBDaGVjazsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJM0IyMzhGNjEwRTgyOEI1NDAwODQ2RTExIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJUFJPRFVDVF9OQU1FID0gQ2hlY2s7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDA4OTlGNDUwRkZBNzE4NTAwMEIyOUFFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOworCQkJCVBST0RVQ1RfTkFNRSA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MDg5OUY0NjBGRkE3MTg1MDAwQjI5QUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC4uLzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDg5QTAxNTBGRkFDRUZEMDAwQjI5QUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwODlBMDE2MEZGQUNFRkQwMDBCMjlBRSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlQUk9EVUNUX05BTUUgPSAic2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzQ0QURGMEUzNzk4RjQwMDhGQ0M1MSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJCVRBUkdFVF9OQU1FID0gZ3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MEM0NEFFMDBFMzc5OEY0MDA4RkNDNTEgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJCVRBUkdFVF9OQU1FID0gZ3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OEZCMTAxQTIwOUQwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7CisJCQkJR0NDX0lOTElORVNfQVJFX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwQzg0OEZDMTAxQTIwOUQwMDgzNjQyQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwODk5RkIzMEZGQTc1NjcwMDBCMjlBRSAvKiBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDkwRTEwMUEyMTdGMDA4MzY0MkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfbWFpbjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ5MEYxMDFBMjE3RjAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfbWFpbjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDk4NTEwMUEzNjg1MDA4MzY0MkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi87CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwQzg0OTg2MTAxQTM2ODUwMDgzNjQyQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0X3VuaXR0ZXN0OworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTk1MTAxQTM2QTYwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJUFJPRFVDVF9OQU1FID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ5OTYxMDFBMzZBNjAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyI7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLAorCQkJCQkuLi9pbmNsdWRlLywKKwkJCQkpOworCQkJCUlORk9QTElTVF9GSUxFID0gUmVzb3VyY2VzL0luZm8ucGxpc3Q7CisJCQkJSU5GT1BMSVNUX1BSRUZJWF9IRUFERVIgPSAiJChQUk9KRUNUX1RFTVBfRElSKS9WZXJzaW9uLmgiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQkJVkVSU0lPTklOR19TWVNURU0gPSAiYXBwbGUtZ2VuZXJpYyI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0RkFEQzI0NDA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGMjBFMzBFMDc0MDAyOTQ4MDEgLyogRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlEWUxJQl9DT01QQVRJQklMSVRZX1ZFUlNJT04gPSAxOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9IDE7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IFJlc291cmNlcy9JbmZvLnBsaXN0OworCQkJCUlORk9QTElTVF9QUkVGSVhfSEVBREVSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvVmVyc2lvbi5oIjsKKwkJCQlJTkZPUExJU1RfUFJFUFJPQ0VTUyA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gImFwcGxlLWdlbmVyaWMiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0RkFEQzI0ODA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTNCMjM4RkEzMEU4MjhCQjYwMDg0NkUxMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiQ2hlY2siICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJM0IyMzhGNjAwRTgyOEI1NDAwODQ2RTExIC8qIERlYnVnICovLAorCQkJCTNCMjM4RjYxMEU4MjhCNTQwMDg0NkUxMSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwODk5RjRBMEZGQTcxQkMwMDBCMjlBRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwODk5RjQ1MEZGQTcxODUwMDBCMjlBRSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDg5OUY0NjBGRkE3MTg1MDAwQjI5QUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDg5QTAyNDBGRkFDRjAxMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwODlBMDE1MEZGQUNFRkQwMDBCMjlBRSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDg5QTAxNjBGRkFDRUZEMDAwQjI5QUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM0NEFFNDBFMzc5OTA1MDA4RkNDNTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlZlcnNpb24gSW5mbyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MEM0NEFERjBFMzc5OEY0MDA4RkNDNTEgLyogRGVidWcgKi8sCisJCQkJNDBDNDRBRTAwRTM3OThGNDAwOEZDQzUxIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDBDODQ5MDIxMDFBMjEyRTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdC1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ4RkIxMDFBMjA5RDAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OEZDMTAxQTIwOUQwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTEyMTAxQTIxRDIwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfbWFpbi1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ5MEUxMDFBMjE3RjAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OTBGMTAxQTIxN0YwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTg0MTAxQTM2ODUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwQzg0OTg1MTAxQTM2ODUwMDgzNjQyQSAvKiBEZWJ1ZyAqLywKKwkJCQk0MEM4NDk4NjEwMUEzNjg1MDA4MzY0MkEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDk5NDEwMUEzNkE2MDA4MzY0MkEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwQzg0OTk1MTAxQTM2QTYwMDgzNjQyQSAvKiBEZWJ1ZyAqLywKKwkJCQk0MEM4NDk5NjEwMUEzNkE2MDA4MzY0MkEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LWZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDYwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiZ3Rlc3QiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDcwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9DSEFOR0VTLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvQ0hBTkdFUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmYjhjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvQ0hBTkdFUy50eHQKQEAgLTAsMCArMSw1MjggQEAKKzIwMTMtMDItMjcgdmVyc2lvbiAyLjUuMDoKKworICBHZW5lcmFsCisgICogTmV3IG5vdGlvbiAiaW1wb3J0IHB1YmxpYyIgdGhhdCBhbGxvd3MgYSBwcm90byBmaWxlIHRvIGZvcndhcmQgdGhlIGNvbnRlbnQKKyAgICBpdCBpbXBvcnRzIHRvIGl0cyBpbXBvcnRlcnMuIEZvciBleGFtcGxlLAorICAgICAgLy8gZm9vLnByb3RvCisgICAgICBpbXBvcnQgcHVibGljICJiYXIucHJvdG8iOworICAgICAgaW1wb3J0ICJiYXoucHJvdG8iOworCisgICAgICAvLyBxdXgucHJvdG8KKyAgICAgIGltcG9ydCAiZm9vLnByb3RvIjsKKyAgICAgIC8vIFN0dWZmIGRlZmluZWQgaW4gYmFyLnByb3RvIG1heSBiZSB1c2VkIGluIHRoaXMgZmlsZSwgYnV0IHN0dWZmIGZyb20KKyAgICAgIC8vIGJhei5wcm90byBtYXkgTk9UIGJlIHVzZWQgd2l0aG91dCBpbXBvcnRpbmcgaXQgZXhwbGljaXRseS4KKyAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgbW92aW5nIHByb3RvIGZpbGVzLiBUbyBtb3ZlIGEgcHJvdG8gZmlsZSwganVzdCBsZWF2ZQorICAgIGEgc2luZ2xlICJpbXBvcnQgcHVibGljIiBpbiB0aGUgb2xkIHByb3RvIGZpbGUuCisgICogTmV3IGVudW0gb3B0aW9uICJhbGxvd19hbGlhcyIgdGhhdCBzcGVjaWZpZXMgd2hldGhlciBkaWZmZXJlbnQgc3ltYm9scyBjYW4KKyAgICBiZSBhc3NpZ25lZCB0aGUgc2FtZSBudW1lcmljIHZhbHVlLiBEZWZhdWx0IHZhbHVlIGlzICJ0cnVlIi4gU2V0dGluZyBpdCB0bworICAgIGZhbHNlIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gcmVqZWN0IGVudW0gZGVmaW5pdGlvbnMgd2hlcmUgbXVsdGlwbGUgc3ltYm9scworICAgIGhhdmUgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZS4KKworICBDKysKKyAgKiBOZXcgZ2VuZXJhdGVkIG1ldGhvZCBzZXRfYWxsb2NhdGVkX2ZvbyhUeXBlKiBmb28pIGZvciBtZXNzYWdlIGFuZCBzdHJpbmcKKyAgICBmaWVsZHMuIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBmaWVsZCB0byBhIHByZS1hbGxvY2F0ZWQgb2JqZWN0CisgICAgYW5kIHRoZSBjb250YWluaW5nIG1lc3NhZ2UgdGFrZXMgdGhlIG93bmVyc2hpcCBvZiB0aGF0IG9iamVjdC4KKyAgKiBBZGRlZCBTZXRBbGxvY2F0ZWRFeHRlbnNpb24oKSBhbmQgUmVsZWFzZUV4dGVuc2lvbigpIHRvIGV4dGVuc2lvbnMgQVBJLgorICAqIEN1c3RvbSBvcHRpb25zIGFyZSBub3cgZm9ybWF0dGVkIGNvcnJlY3RseSB3aGVuIGRlc2NyaXB0b3JzIGFyZSBwcmludGVkIGluCisgICAgdGV4dCBmb3JtYXQuCisgICogVmFyaW91cyBzcGVlZCBvcHRpbWl6YXRpb25zLgorCisgIEphdmEKKyAgKiBDb21tZW50cyBpbiBwcm90byBmaWxlcyBhcmUgbm93IGNvbGxlY3RlZCBhbmQgcHV0IGludG8gZ2VuZXJhdGVkIGNvZGUgYXMKKyAgICBjb21tZW50cyBmb3IgY29ycmVzcG9uZGluZyBjbGFzc2VzIGFuZCBkYXRhIG1lbWJlcnMuCisgICogQWRkZWQgUGFyc2VyIHRvIHBhcnNlIGRpcmVjdGx5IGludG8gbWVzc2FnZXMgd2l0aG91dCBhIEJ1aWxkZXIuIEZvcgorICAgIGV4YW1wbGUsCisgICAgICBGb28gZm9vID0gRm9vLmdldFBhcnNlcigpLlBhcnNlRnJvbShpbnB1dCk7CisgICAgVXNpbmcgUGFyc2VyIGlzIH4yNSUgZmFzdGVyIHRoYW4gdXNpbmcgQnVpbGRlciB0byBwYXJzZSBtZXNzYWdlcy4KKyAgKiBBZGRlZCBnZXR0ZXJzL3NldHRlcnMgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIEJ5dGVTdHJpbmcgb2YgYSBzdHJpbmcgZmllbGQKKyAgICBkaXJlY3RseS4KKyAgKiBCeXRlU3RyaW5nIG5vdyBzdXBwb3J0cyBtb3JlIG9wZXJhdGlvbnM6IHN1YnN0cmluZygpLCBwcmVwZW5kKCksIGFuZAorICAgIGFwcGVuZCgpLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgQnl0ZVN0cmluZyB1c2VzIGEgYmluYXJ5IHRyZWUgc3RydWN0dXJlCisgICAgdG8gc3VwcG9ydCB0aGVzZSBvcGVyYXRpb25zIGVmZmljaWVudGx5LgorICAqIE5ldyBtZXRob2QgZmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkgdGhhdCBsaXN0cyBhbGwgbWlzc2luZyByZXF1aXJlZAorICAgIGZpZWxkcy4KKyAgKiBWYXJpb3VzIGNvZGUgc2l6ZSBhbmQgc3BlZWQgb3B0aW1pemF0aW9ucy4KKworICBQeXRob24KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIG1lc3NhZ2UgY3JlYXRpb24uIERlc2NyaXB0b3JEYXRhYmFzZSwKKyAgICBEZXNjcmlwdG9yUG9vbCwgYW5kIE1lc3NhZ2VGYWN0b3J5IHdvcmsgbGlrZSB0aGVpciBDKysgY291dGVycGFydHMgdG8KKyAgICBzaW1wbGlmeSBEZXNjcmlwdG9yIGNvbnN0cnVjdGlvbiBmcm9tICpEZXNjcmlwdG9yUHJvdG9zLCBhbmQgTWVzc2FnZUZhY3RvcnkKKyAgICBwcm92aWRlcyBhIG1lc3NhZ2UgaW5zdGFuY2UgZnJvbSBhIERlc2NyaXB0b3IuCisgICogQWRkZWQgcGlja2xlIHN1cHBvcnQgZm9yIHByb3RvYnVmIG1lc3NhZ2VzLgorICAqIFVua25vd24gZmllbGRzIGFyZSBub3cgcHJlc2VydmVkIGFmdGVyIHBhcnNpbmcuCisgICogRml4ZWQgYnVnIHdoZXJlIGN1c3RvbSBvcHRpb25zIHdlcmUgbm90IGNvcnJlY3RseSBwb3B1bGF0ZWQuIEN1c3RvbQorICAgIG9wdGlvbnMgY2FuIGJlIGFjY2Vzc2VkIG5vdy4KKyAgKiBBZGRlZCBFbnVtVHlwZVdyYXBwZXIgdGhhdCBwcm92aWRlcyBiZXR0ZXIgYWNjZXNzaWJpbGl0eSB0byBlbnVtIHR5cGVzLgorICAqIEFkZGVkIFBhcnNlTWVzc2FnZShkZXNjcmlwdG9yLCBieXRlcykgdG8gZ2VuZXJhdGUgYSBuZXcgTWVzc2FnZSBpbnN0YW5jZQorICAgIGZyb20gYSBkZXNjcmlwdG9yIGFuZCBhIGJ5dGUgc3RyaW5nLgorCisyMDExLTA1LTAxIHZlcnNpb24gMi40LjE6CisKKyAgQysrCisgICogRml4ZWQgdGhlIGZyZW5kc2hpcCBwcm9ibGVtIGZvciBvbGQgY29tcGlsZXJzIHRvIG1ha2UgdGhlIGxpYnJhcnkgbm93IGdjYyAzCisgICAgY29tcGF0aWJsZSBhZ2Fpbi4KKyAgKiBGaXhlZCB2Y3Byb2plY3RzL2V4dHJhY3RfaW5jbHVkZXMuYmF0IHRvIGV4dHJhY3QgY29tcGlsZXIvcGx1Z2luLmguCisKKyAgSmF2YQorICAqIFJlbW92ZWQgdXNhZ2VzIG9mIEpESyAxLjYgb25seSBmZWF0dXJlcyB0byBtYWtlIHRoZSBsaWJyYXJ5IG5vdyBKREsgMS41CisgICAgY29tcGF0aWJsZSBhZ2Fpbi4KKyAgKiBGaXhlZCBhIGJ1ZyBhYm91dCBuZWdhdGl2ZSBlbnVtIHZhbHVlcy4KKyAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIG5vdyBkZWZpbmVkIGluIGdlbmVyYXRlZCBtZXNzYWdlcyBmb3IgamF2YSBzZXJpYWxpemluZy4KKyAgKiBGaXhlZCBwcm90b2MgdG8gdXNlIGphdmEubGFuZy5PYmplY3QsIHdoaWNoIG1ha2VzICJPYmplY3QiIG5vdyBhIHZhbGlkCisgICAgbWVzc2FnZSBuYW1lIGFnYWluLgorCisgIFB5dGhvbgorICAqIEV4cGVyaW1lbnRhbCBDKysgaW1wbGVtZW50YXRpb24gbm93IHJlcXVpcmVzIEMrKyBwcm90b2J1ZiBsaWJyYXJ5IGluc3RhbGxlZC4KKyAgICBTZWUgdGhlIFJFQURNRS50eHQgaW4gdGhlIHB5dGhvbiBkaXJlY3RvcnkgZm9yIGRldGFpbHMuCisKKzIwMTEtMDItMDIgdmVyc2lvbiAyLjQuMDoKKworICBHZW5lcmFsCisgICogVGhlIFJQQyAoY2N8amF2YXxweSlfZ2VuZXJpY19zZXJ2aWNlcyBkZWZhdWx0IHZhbHVlIGlzIG5vdyBmYWxzZSBpbnN0ZWFkIG9mCisgICAgdHJ1ZS4KKyAgKiBDdXN0b20gb3B0aW9ucyBjYW4gaGF2ZSBhZ2dyZWdhdGUgdHlwZXMuIEZvciBleGFtcGxlLAorICAgICAgbWVzc2FnZSBNeU9wdGlvbiB7CisgICAgICAgIG9wdGlvbmFsIHN0cmluZyBjb21tZW50ID0gMTsKKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGF1dGhvciA9IDI7CisgICAgICB9CisgICAgICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyB7CisgICAgICAgIG9wdGlvbmFsIE15T3B0aW9uIG15b3B0aW9uID0gMTIzNDU7CisgICAgICB9CisgICAgVGhpcyBvcHRpb24gY2FuIG5vdyBiZSBzZXQgYXMgZm9sbG93czoKKyAgICAgIG1lc3NhZ2UgU29tZVR5cGUgeworICAgICAgICBvcHRpb25hbCBpbnQzMiBmaWVsZCA9IDEgWyhteW9wdGlvbikgPSB7IGNvbW1lbnQ6J3gnIGF1dGhvcjoneScgfV07CisgICAgICB9CisKKyAgQysrCisgICogVmFyaW91cyBzcGVlZCBhbmQgY29kZSBzaXplIG9wdGltaXphdGlvbnMuCisgICogQWRkZWQgYSByZWxlYXNlX2ZvbygpIG1ldGhvZCBvbiBzdHJpbmcgYW5kIG1lc3NhZ2UgZmllbGRzLgorICAqIEZpeGVkIGd6aXBfb3V0cHV0X3N0cmVhbSBzdWItc3RyZWFtIGhhbmRsaW5nLgorCisgIEphdmEKKyAgKiBCdWlsZGVycyBub3cgbWFpbnRhaW4gc3ViLWJ1aWxkZXJzIGZvciBzdWItbWVzc2FnZXMuIFVzZSBnZXRGb29CdWlsZGVyKCkgdG8KKyAgICBnZXQgdGhlIGJ1aWxkZXIgZm9yIHRoZSBzdWItbWVzc2FnZSAiZm9vIi4gVGhpcyBhbGxvd3MgeW91IHRvIHJlcGVhdGVkbHkKKyAgICBtb2RpZnkgZGVlcGx5LW5lc3RlZCBzdWItbWVzc2FnZXMgd2l0aG91dCByZWJ1aWxkaW5nIHRoZW0uCisgICogQnVpbGRlci5idWlsZCgpIG5vIGxvbmdlciBpbnZhbGlkYXRlcyB0aGUgQnVpbGRlciBmb3IgZ2VuZXJhdGVkIG1lc3NhZ2VzCisgICAgKFlvdSBtYXkgY29udGludWUgdG8gbW9kaWZ5IGl0IGFuZCB0aGVuIGJ1aWxkIGFub3RoZXIgbWVzc2FnZSkuCisgICogQ29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBlZmZpY2llbnQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkKKyAgICBpbXBsZW1lbnRhdGlvbnMgaWYgbmV3IG9wdGlvbiBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCBpcyBlbmFibGVkLgorICAgIChPdGhlcndpc2UsIHJlZmxlY3Rpb24tYmFzZWQgaW1wbGVtZW50YXRpb25zIGFyZSB1c2VkLikKKyAgKiBHZW5lcmF0ZWQgbWVzc2FnZXMgbm93IGltcGxlbWVudCBTZXJpYWxpemFibGUuCisgICogRmllbGRzIHdpdGggW2RlcHJlY2F0ZWQ9dHJ1ZV0gd2lsbCBiZSBtYXJrZWQgd2l0aCBARGVwcmVjYXRlZCBpbiBKYXZhLgorICAqIEFkZGVkIGxhenkgY29udmVyc2lvbiBvZiBVVEYtOCBlbmNvZGVkIHN0cmluZ3MgdG8gU3RyaW5nIG9iamVjdHMgdG8gaW1wcm92ZQorICAgIHBlcmZvcm1hbmNlLgorICAqIFZhcmlvdXMgb3B0aW1pemF0aW9ucy4KKyAgKiBFbnVtIHZhbHVlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgaW5zdGVhZCBvZiBjYWxsaW5nIGdldE51bWJlcigpIG9uIHRoZQorICAgIGVudW0gbWVtYmVyLgorICAqIEZvciBlYWNoIGVudW0gdmFsdWUsIGFuIGludGVnZXIgY29uc3RhbnQgaXMgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0aGUgc3VmZml4CisgICAgX1ZBTFVFLgorCisgIFB5dGhvbgorICAqIEFkZGVkIGFuIGV4cGVyaW1lbnRhbCAgQysrIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24gbWVzc2FnZXMgdmlhIGEgUHl0aG9uCisgICAgZXh0ZW5zaW9uLiBJbXBsZW1lbnRhdGlvbiB0eXBlIGlzIGNvbnRyb2xsZWQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICBQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTiAodmFsaWQgdmFsdWVzOiAiY3BwIiBhbmQgInB5dGhvbiIpCisgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgY3VycmVudGx5ICJweXRob24iIGJ1dCB3aWxsIGJlIGNoYW5nZWQgdG8gImNwcCIgaW4KKyAgICBmdXR1cmUgcmVsZWFzZS4KKyAgKiBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvbiBtZXNzYWdlIGluc3RhbnRpYXRpb24gc2lnbmlmaWNhbnRseS4KKyAgICBNb3N0IG9mIHRoZSB3b3JrIG9uIG1lc3NhZ2UgaW5zdGFudGlhdGlvbiBpcyBkb25lIGp1c3Qgb25jZSBwZXIgbWVzc2FnZQorICAgIGNsYXNzLCBpbnN0ZWFkIG9mIG9uY2UgcGVyIG1lc3NhZ2UgaW5zdGFuY2UuCisgICogSW1wcm92ZWQgcGVyZm9ybWFuY2Ugb24gdGV4dCBtZXNzYWdlIHBhcnNpbmcuCisgICogQWxsb3cgYWRkKCkgdG8gZm9yd2FyZCBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGUgY29uY3JldGUgY2xhc3MuCisgICAgICBFLmcuIGluc3RlYWQgb2YKKyAgICAgICAgaXRlbSA9IHJlcGVhdGVkX2ZpZWxkLmFkZCgpCisgICAgICAgIGl0ZW0uZm9vID0gYmFyCisgICAgICAgIGl0ZW0uYmF6ID0gcXV1eAorICAgICAgWW91IGNhbiBkbzoKKyAgICAgICAgcmVwZWF0ZWRfZmllbGQuYWRkKGZvbz1iYXIsIGJhej1xdXV4KQorICAqIEFkZGVkIGEgc29ydCgpIGludGVyZmFjZSB0byB0aGUgQmFzZUNvbnRhaW5lci4KKyAgKiBBZGRlZCBhbiBleHRlbmQoKSBtZXRob2QgdG8gcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4KKyAgKiBBZGRlZCBVVEY4IGRlYnVnIHN0cmluZyBzdXBwb3J0LgorCisyMDEwLTAxLTA4IHZlcnNpb24gMi4zLjA6CisKKyAgR2VuZXJhbAorICAqIFBhcnNlcnMgZm9yIHJlcGVhdGVkIG51bWVyaWMgZmllbGRzIG5vdyBhbHdheXMgYWNjZXB0IGJvdGggcGFja2VkIGFuZAorICAgIHVucGFja2VkIGlucHV0LiAgVGhlIFtwYWNrZWQ9dHJ1ZV0gb3B0aW9uIG9ubHkgYWZmZWN0cyBzZXJpYWxpemVycy4KKyAgICBUaGVyZWZvcmUsIGl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCBhIGZpZWxkIHRvIHBhY2tlZCBmb3JtYXQgd2l0aG91dAorICAgIGJyZWFraW5nIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IC0tIGFzIGxvbmcgYXMgYWxsIHBhcnRpZXMgYXJlIHVzaW5nCisgICAgcHJvdG9idWYgMi4zLjAgb3IgYWJvdmUsIGF0IGxlYXN0LgorICAqIFRoZSBnZW5lcmljIFJQQyBzZXJ2aWNlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBDKyssIEphdmEsIGFuZCBQeXRob24KKyAgICBnZW5lcmF0b3JzIGNhbiBiZSBkaXNhYmxlZCB2aWEgZmlsZSBvcHRpb25zOgorICAgICAgb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSBmYWxzZTsKKyAgICAgIG9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSBmYWxzZTsKKyAgICAgIG9wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gZmFsc2U7CisgICAgVGhpcyBhbGxvd3MgcGx1Z2lucyB0byBnZW5lcmF0ZSBhbHRlcm5hdGl2ZSBjb2RlLCBwb3NzaWJseSBzcGVjaWZpYyB0byBzb21lCisgICAgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uCisKKyAgcHJvdG9jCisgICogTm93IHN1cHBvcnRzIGEgcGx1Z2luIHN5c3RlbSBmb3IgY29kZSBnZW5lcmF0b3JzLiAgUGx1Z2lucyBjYW4gZ2VuZXJhdGUKKyAgICBjb2RlIGZvciBuZXcgbGFuZ3VhZ2VzIG9yIGluamVjdCBhZGRpdGlvbmFsIGNvZGUgaW50byB0aGUgb3V0cHV0IG9mIG90aGVyCisgICAgY29kZSBnZW5lcmF0b3JzLiAgUGx1Z2lucyBhcmUganVzdCBiaW5hcmllcyB3aGljaCBhY2NlcHQgYSBwcm90b2NvbCBidWZmZXIKKyAgICBvbiBzdGRpbiBhbmQgd3JpdGUgYSBwcm90b2NvbCBidWZmZXIgdG8gc3Rkb3V0LCBzbyB0aGV5IG1heSBiZSB3cml0dGVuIGluCisgICAgYW55IGxhbmd1YWdlLiAgU2VlIHNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvLgorICAgICoqV0FSTklORyoqOiAgUGx1Z2lucyBhcmUgZXhwZXJpbWVudGFsLiAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGEKKyAgICBmdXR1cmUgdmVyc2lvbi4KKyAgKiBJZiB0aGUgb3V0cHV0IGxvY2F0aW9uIGVuZHMgaW4gLnppcCBvciAuamFyLCBwcm90b2Mgd2lsbCB3cml0ZSBpdHMgb3V0cHV0CisgICAgdG8gYSB6aXAvamFyIGFyY2hpdmUgaW5zdGVhZCBvZiBhIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlOgorICAgICAgcHJvdG9jIC0tamF2YV9vdXQ9bXlwcm90b19zcmNzLmphciAtLXB5dGhvbl9vdXQ9bXlwcm90by56aXAgbXlwcm90by5wcm90bworICAgIEN1cnJlbnRseSB0aGUgYXJjaGl2ZSBjb250ZW50cyBhcmUgbm90IGNvbXByZXNzZWQsIHRob3VnaCB0aGlzIGNvdWxkIGNoYW5nZQorICAgIGluIHRoZSBmdXR1cmUuCisgICogaW5mLCAtaW5mLCBhbmQgbmFuIGNhbiBub3cgYmUgdXNlZCBhcyBkZWZhdWx0IHZhbHVlcyBmb3IgZmxvYXQgYW5kIGRvdWJsZQorICAgIGZpZWxkcy4KKworICBDKysKKyAgKiBWYXJpb3VzIHNwZWVkIGFuZCBjb2RlIHNpemUgb3B0aW1pemF0aW9ucy4KKyAgKiBEeW5hbWljTWVzc2FnZUZhY3RvcnkgaXMgbm93IGZ1bGx5IHRocmVhZC1zYWZlLgorICAqIE1lc3NhZ2U6OlV0ZjhEZWJ1Z1N0cmluZygpIG1ldGhvZCBpcyBsaWtlIERlYnVnU3RyaW5nKCkgYnV0IGF2b2lkcyBlc2NhcGluZworICAgIFVURi04IGJ5dGVzLgorICAqIENvbXBpbGVkLWluIG1lc3NhZ2UgdHlwZXMgY2FuIG5vdyBjb250YWluIGR5bmFtaWMgZXh0ZW5zaW9ucywgdGhyb3VnaCB1c2UKKyAgICBvZiBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeSgpLgorICAqIE5vdyBjb21waWxlcyBzaGFyZWQgbGlicmFyaWVzIChETExzKSBieSBkZWZhdWx0IG9uIEN5Z3dpbiBhbmQgTWluR1csIHRvCisgICAgbWF0Y2ggb3RoZXIgcGxhdGZvcm1zLiAgVXNlIC0tZGlzYWJsZS1zaGFyZWQgdG8gYXZvaWQgdGhpcy4KKworICBKYXZhCisgICogcGFyc2VEZWxpbWl0ZWRGcm9tKCkgYW5kIG1lcmdlRGVsaW1pdGVkRnJvbSgpIG5vdyBkZXRlY3QgRU9GIGFuZCByZXR1cm4KKyAgICBmYWxzZS9udWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAqIEZpeGVkIHNvbWUgaW5pdGlhbGl6YXRpb24gb3JkZXJpbmcgYnVncy4KKyAgKiBGaXhlcyBmb3IgT3BlbkpESyA3LgorCisgIFB5dGhvbgorICAqIDEwLTI1IHRpbWVzIGZhc3RlciB0aGFuIDIuMi4wLCBzdGlsbCBwdXJlLVB5dGhvbi4KKyAgKiBDYWxsaW5nIGEgbXV0YXRpbmcgbWV0aG9kIG9uIGEgc3ViLW1lc3NhZ2UgYWx3YXlzIGluc3RhbnRpYXRlcyB0aGUgbWVzc2FnZQorICAgIGluIGl0cyBwYXJlbnQgZXZlbiBpZiB0aGUgbXV0YXRpbmcgbWV0aG9kIGRvZXNuJ3QgYWN0dWFsbHkgbXV0YXRlIGFueXRoaW5nCisgICAgKGUuZy4gcGFyc2luZyBmcm9tIGFuIGVtcHR5IHN0cmluZykuCisgICogRXhwYW5kZWQgZGVzY3JpcHRvcnMgYSBiaXQuCisKKzIwMDktMDgtMTEgdmVyc2lvbiAyLjIuMDoKKworICBDKysKKyAgKiBMaXRlIG1vZGU6ICBUaGUgIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSIgb3B0aW9uIGNhdXNlcyB0aGUgY29tcGlsZXIKKyAgICB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgZGVwZW5kcyBsaWJwcm90b2J1Zi1saXRlLCB3aGljaCBpcyBtdWNoIHNtYWxsZXIKKyAgICB0aGFuIGxpYnByb3RvYnVmIGJ1dCBsYWNrcyBkZXNjcmlwdG9ycywgcmVmbGVjdGlvbiwgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMuCisgICogRml4ZWQgYnVnIHdoZXJlIE1lc3NhZ2UuU3dhcChNZXNzYWdlKSB3YXMgb25seSBpbXBsZW1lbnRlZCBmb3IKKyAgICBvcHRpbWl6ZV9mb3Jfc3BlZWQuICBTd2FwIG5vdyBwcm9wZXJseSBpbXBsZW1lbnRlZCBpbiBib3RoIG1vZGVzCisgICAgKElzc3VlIDkxKS4KKyAgKiBBZGRlZCBSZW1vdmVMYXN0IGFuZCBTd2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpIHRvIFJlZmxlY3Rpb24KKyAgICBpbnRlcmZhY2UgZm9yIHJlcGVhdGVkIGVsZW1lbnRzLgorICAqIEFkZGVkIFN3YXAoTWVzc2FnZSkgdG8gUmVmbGVjdGlvbiBpbnRlcmZhY2UuCisgICogRmxvYXRpbmctcG9pbnQgbGl0ZXJhbHMgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUKKyAgICBzaW5nbGUtcHJlY2lzaW9uIG5vdyBleHBsaWNpdGx5IGhhdmUgJ2YnIHN1ZmZpeCB0byBhdm9pZCBwZWRhbnRpYyB3YXJuaW5ncworICAgIHByb2R1Y2VkIGJ5IHNvbWUgY29tcGlsZXJzLgorICAqIFRoZSBbZGVwcmVjYXRlZD10cnVlXSBvcHRpb24gbm93IGNhdXNlcyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIGdlbmVyYXRlCisgICAgYSBHQ0Mtc3R5bGUgZGVwcmVjYXRpb24gYW5ub3RhdGlvbiAobm8tb3Agb24gb3RoZXIgY29tcGlsZXJzKS4KKyAgKiBnb29nbGU6OnByb3RvYnVmOjpHZXRFbnVtRGVzY3JpcHRvcjxTb21lR2VuZXJhdGVkRW51bVR5cGU+KCkgcmV0dXJucyB0aGUKKyAgICBFbnVtRGVzY3JpcHRvciBmb3IgdGhhdCB0eXBlIC0tIHVzZWZ1bCBmb3IgdGVtcGxhdGVzIHdoaWNoIGNhbm5vdCBjYWxsCisgICAgU29tZUdlbmVyYXRlZEVudW1UeXBlX2Rlc2NyaXB0b3IoKS4KKyAgKiBWYXJpb3VzIG9wdGltaXphdGlvbnMgYW5kIG9ic2N1cmUgYnVnIGZpeGVzLgorCisgIEphdmEKKyAgKiBMaXRlIG1vZGU6ICBUaGUgIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSIgb3B0aW9uIGNhdXNlcyB0aGUgY29tcGlsZXIKKyAgICB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgZGVwZW5kcyBsaWJwcm90b2J1Zi1saXRlLCB3aGljaCBpcyBtdWNoIHNtYWxsZXIKKyAgICB0aGFuIGxpYnByb3RvYnVmIGJ1dCBsYWNrcyBkZXNjcmlwdG9ycywgcmVmbGVjdGlvbiwgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMuCisgICogTG90cyBvZiBzdHlsZSBjbGVhbnVwcy4KKworICBQeXRob24KKyAgKiBGaXhlZCBlbmRpYW5uZXNzIGJ1ZyB3aXRoIGZsb2F0cyBhbmQgZG91Ymxlcy4KKyAgKiBUZXh0IGZvcm1hdCBwYXJzaW5nIHN1cHBvcnQuCisgICogRml4IGJ1ZyB3aXRoIHBhcnNpbmcgcGFja2VkIHJlcGVhdGVkIGZpZWxkcyBpbiBlbWJlZGRlZCBtZXNzYWdlcy4KKyAgKiBBYmlsaXR5IHRvIGluaXRpYWxpemUgZmllbGRzIGJ5IHBhc3Npbmcga2V5d29yZCBhcmdzIHRvIGNvbnN0cnVjdG9yLgorICAqIFN1cHBvcnQgaXRlcmF0b3JzIGluIGV4dGVuZCBhbmQgX19zZXRzbGljZV9fIGZvciBjb250YWluZXJzLgorCisyMDA5LTA1LTEzIHZlcnNpb24gMi4xLjA6CisKKyAgR2VuZXJhbAorICAqIFJlcGVhdGVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZXMgKHR5cGVzIG90aGVyIHRoYXQgc3RyaW5nLCBncm91cCwgYW5kCisgICAgbmVzdGVkIG1lc3NhZ2VzKSBtYXkgbm93IHVzZSB0aGUgb3B0aW9uIFtwYWNrZWQgPSB0cnVlXSB0byBnZXQgYSBtb3JlCisgICAgZWZmaWNpZW50IGVuY29kaW5nLiAgSW4gdGhlIG5ldyBlbmNvZGluZywgdGhlIGVudGlyZSBsaXN0IGlzIHdyaXR0ZW4KKyAgICBhcyBhIHNpbmdsZSBieXRlIGJsb2IgdXNpbmcgdGhlICJsZW5ndGgtZGVsaW1pdGVkIiB3aXJlIHR5cGUuICBXaXRoaW4KKyAgICB0aGlzIGJsb2IsIHRoZSBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgZW5jb2RlZCB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZAorICAgIGJlIG5vcm1hbGx5IGV4Y2VwdCB3aXRob3V0IGEgdGFnIGJlZm9yZSBlYWNoIHZhbHVlICh0aHVzLCB0aGV5IGFyZQorICAgIHRpZ2h0bHkgInBhY2tlZCIpLgorICAqIEZvciBlYWNoIGZpZWxkLCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29udGFpbnMgYW4gaW50ZWdlciBjb25zdGFudCBhc3NpZ25lZAorICAgIHRvIHRoZSBmaWVsZCBudW1iZXIuICBGb3IgZXhhbXBsZSwgdGhlIC5wcm90byBmaWxlOgorICAgICAgbWVzc2FnZSBGb28geyBvcHRpb25hbCBpbnQgYmFyX2JheiA9IDEyMzsgfQorICAgIHdvdWxkIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLCBhbGwgd2l0aCB0aGUgaW50ZWdlciB2YWx1ZSAxMjM6CisgICAgICBDKys6ICAgICBGb286OmtCYXJCYXpGaWVsZE51bWJlcgorICAgICAgSmF2YTogICAgRm9vLkJBUl9CQVpfRklFTERfTlVNQkVSCisgICAgICBQeXRob246ICBGb28uQkFSX0JBWl9GSUVMRF9OVU1CRVIKKyAgICBDb25zdGFudHMgYXJlIGFsc28gZ2VuZXJhdGVkIGZvciBleHRlbnNpb25zLCB3aXRoIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUuCisgICAgVGhlc2UgY29uc3RhbnRzIG1heSBiZSB1c2VkIGFzIHN3aXRjaCBjYXNlcy4KKyAgKiBVcGRhdGVkIGJ1bmRsZWQgR29vZ2xlIFRlc3QgdG8gdmVyc2lvbiAxLjMuMC4gIEdvb2dsZSBUZXN0IGlzIG5vdyBidW5kbGVkCisgICAgaW4gaXRzIHZlcmJhdGltIGZvcm0gYXMgYSBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28geW91IGNhbiBkcm9wIGluIGFueQorICAgIG90aGVyIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QgaWYgbmVlZGVkLgorICAqIG9wdGltaXplX2ZvciA9IFNQRUVEIGlzIG5vdyB0aGUgZGVmYXVsdCwgYnkgcG9wdWxhciBkZW1hbmQuICBVc2UKKyAgICBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUgaWYgY29kZSBzaXplIGlzIG1vcmUgaW1wb3J0YW50IGluIHlvdXIgYXBwLgorICAqIEl0IGlzIG5vdyBhbiBlcnJvciB0byBkZWZpbmUgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcGVhdGVkIGZpZWxkLgorICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHNpbGVudGx5IGlnbm9yZWQgKGl0IGhhZCBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZAorICAgIGNvZGUpLgorICAqIEZpZWxkcyBjYW4gbm93IGJlIG1hcmtlZCBkZXByZWNhdGVkIGxpa2U6CisgICAgICBvcHRpb25hbCBpbnQzMiBmb28gPSAxIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgQ3VycmVudGx5IHRoaXMgZG9lcyBub3QgaGF2ZSBhbnkgYWN0dWFsIGVmZmVjdCwgYnV0IGluIHRoZSBmdXR1cmUgdGhlIGNvZGUKKyAgICBnZW5lcmF0b3JzIG1heSBnZW5lcmF0ZSBkZXByZWNhdGlvbiBhbm5vdGF0aW9ucyBpbiBlYWNoIGxhbmd1YWdlLgorICAqIENyb3NzLWNvbXBpbGluZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIHVzaW5nIHRoZSAtLXdpdGgtcHJvdG9jIG9wdGlvbiB0bworICAgIGNvbmZpZ3VyZS4gIFNlZSBSRUFETUUudHh0IGZvciBtb3JlIGluZm8uCisKKyAgcHJvdG9jCisgICogLS1lcnJvcl9mb3JtYXQ9bXN2cyBvcHRpb24gY2F1c2VzIGVycm9ycyB0byBiZSBwcmludGVkIGluIFZpc3VhbCBTdHVkaW8KKyAgICBmb3JtYXQsIHdoaWNoIHNob3VsZCBhbGxvdyB0aGVtIHRvIGJlIGNsaWNrZWQgb24gaW4gdGhlIGJ1aWxkIGxvZyB0byBnbworICAgIGRpcmVjdGx5IHRvIHRoZSBlcnJvciBsb2NhdGlvbi4KKyAgKiBUaGUgdHlwZSBuYW1lIHJlc29sdmVyIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgdHlwZSBuYW1lcyB0byBmaWVsZHMuICBGb3IKKyAgICBleGFtcGxlLCB0aGlzIG5vdyB3b3JrczoKKyAgICAgIG1lc3NhZ2UgRm9vIHt9CisgICAgICBtZXNzYWdlIEJhciB7CisgICAgICAgIG9wdGlvbmFsIGludDMyIEZvbyA9IDE7CisgICAgICAgIG9wdGlvbmFsIEZvbyBiYXogPSAyOworICAgICAgfQorICAgIFByZXZpb3VzbHksIHRoZSB0eXBlIG9mICJiYXoiIHdvdWxkIHJlc29sdmUgdG8gIkJhci5Gb28iLCBhbmQgeW91J2QgZ2V0CisgICAgYW4gZXJyb3IgYmVjYXVzZSBCYXIuRm9vIGlzIGEgZmllbGQsIG5vdCBhIHR5cGUuICBOb3cgdGhlIHR5cGUgb2YgImJheiIKKyAgICByZXNvbHZlcyB0byB0aGUgbWVzc2FnZSB0eXBlIEZvby4gIFRoaXMgY2hhbmdlIGlzIHVubGlrZWx5IHRvIG1ha2UgYQorICAgIGRpZmZlcmVuY2UgdG8gYW55b25lIHdobyBmb2xsb3dzIHRoZSBQcm90b2NvbCBCdWZmZXJzIHN0eWxlIGd1aWRlLgorCisgIEMrKworICAqIFNldmVyYWwgb3B0aW1pemF0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bzoKKyAgICAtIFNlcmlhbGl6YXRpb24sIGVzcGVjaWFsbHkgdG8gZmxhdCBhcnJheXMsIGlzIDEwJS01MCUgZmFzdGVyLCBwb3NzaWJseQorICAgICAgbW9yZSBmb3Igc21hbGwgb2JqZWN0cy4KKyAgICAtIFNldmVyYWwgZGVzY3JpcHRvciBvcGVyYXRpb25zIHdoaWNoIHByZXZpb3VzbHkgcmVxdWlyZWQgbG9ja2luZyBubyBsb25nZXIKKyAgICAgIGRvLgorICAgIC0gRGVzY3JpcHRvcnMgYXJlIG5vdyBjb25zdHJ1Y3RlZCBsYXppbHkgb24gZmlyc3QgdXNlLCByYXRoZXIgdGhhbiBhdAorICAgICAgcHJvY2VzcyBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZCBzYXZlIG1lbW9yeSBpbiBwcm9ncmFtcyB3aGljaCBkbyBub3QKKyAgICAgIHVzZSBkZXNjcmlwdG9ycyBvciByZWZsZWN0aW9uLgorICAgIC0gVW5rbm93bkZpZWxkU2V0IGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0byBiZSBtb3JlIGVmZmljaWVudCAoZXNwZWNpYWxseSBpbgorICAgICAgdGVybXMgb2YgbWVtb3J5IHVzYWdlKS4KKyAgICAtIFZhcmlvdXMgb3B0aW1pemF0aW9ucyB0byByZWR1Y2UgY29kZSBzaXplICh0aG91Z2ggdGhlIHNlcmlhbGl6YXRpb24gc3BlZWQKKyAgICAgIG9wdGltaXphdGlvbnMgaW5jcmVhc2VkIGNvZGUgc2l6ZSkuCisgICogTWVzc2FnZSBpbnRlcmZhY2UgaGFzIG1ldGhvZCBQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oKSB3aGljaCBwYXJzZXMKKyAgICBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gaW5wdXQgc3RyZWFtIHJhdGhlciB0aGFuIHBhcnNpbmcgdW50aWwKKyAgICBFT0YuCisgICogR3ppcElucHV0U3RyZWFtIGFuZCBHemlwT3V0cHV0U3RyZWFtIHN1cHBvcnQgcmVhZGluZy93cml0aW5nIGd6aXAtIG9yCisgICAgemxpYi1jb21wcmVzc2VkIHN0cmVhbXMgaWYgemxpYiBpcyBhdmFpbGFibGUuCisgICAgKGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oKQorICAqIERlc2NyaXB0b3JQb29sOjpGaW5kQWxsRXh0ZW5zaW9ucygpIGFuZCBjb3JyZXNwb25kaW5nCisgICAgRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kQWxsRXh0ZW5zaW9ucygpIGNhbiBiZSB1c2VkIHRvIGVudW1lcmF0ZSBhbGwKKyAgICBleHRlbnNpb25zIG9mIGEgZ2l2ZW4gdHlwZS4KKyAgKiBGb3IgZWFjaCBlbnVtIHR5cGUgRm9vLCBwcm90b2Mgd2lsbCBnZW5lcmF0ZSBmdW5jdGlvbnM6CisgICAgICBjb25zdCBzdHJpbmcmIEZvb19OYW1lKEZvbyB2YWx1ZSk7CisgICAgICBib29sIEZvb19QYXJzZShjb25zdCBzdHJpbmcmIG5hbWUsIEZvbyogcmVzdWx0KTsKKyAgICBUaGUgZm9ybWVyIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAgICB2YWx1ZSB3aGlsZSB0aGUgbGF0dGVyIGZpbmRzIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEgbmFtZS4KKyAgKiBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIG5vdyBoYXZlIGJhY2staW5zZXJ0aW9uIGl0ZXJhdG9ycy4KKyAgKiBTdHJpbmcgZmllbGRzIG5vdyBoYXZlIHNldHRlcnMgdGhhdCB0YWtlIGEgY2hhciogYW5kIGEgc2l6ZSwgaW4gYWRkaXRpb24KKyAgICB0byB0aGUgZXhpc3Rpbmcgb25lcyB0aGF0IHRvb2sgY2hhciogb3IgY29uc3Qgc3RyaW5nJi4KKyAgKiBEZXNjcmlwdG9yUG9vbDo6QWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgbWF5IGJlIHVzZWQgdG8gdGVsbAorICAgIERlc2NyaXB0b3JQb29sIHRvIGNyZWF0ZSBwbGFjZWhvbGRlciBkZXNjcmlwdG9ycyBmb3IgdW5rbm93biBlbnRpdGllcworICAgIHJlZmVyZW5jZWQgaW4gYSBGaWxlRGVzY3JpcHRvclByb3RvLiAgVGhpcyBjYW4gYWxsb3cgeW91IHRvIHBhcnNlIGEgLnByb3RvCisgICAgZmlsZSB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gb3RoZXIgLnByb3RvIGZpbGVzIHRoYXQgaXQgaW1wb3J0cywgZm9yCisgICAgZXhhbXBsZS4KKyAgKiBVcGRhdGVkIGd0ZXN0IHRvIGxhdGVzdCB2ZXJzaW9uLiAgVGhlIGd0ZXN0IHBhY2thZ2UgaXMgbm93IGluY2x1ZGVkIGFzIGEKKyAgICBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28gaXQgc2hvdWxkIGJlIGFibGUgdG8gZHJvcCBuZXcgdmVyc2lvbnMgaW50byB0aGUKKyAgICAiZ3Rlc3QiIHN1YmRpcmVjdG9yeSB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKworICBKYXZhCisgICogRml4ZWQgYnVnIHdoZXJlIE1lc3NhZ2UubWVyZ2VGcm9tKE1lc3NhZ2UpIGZhaWxlZCB0byBtZXJnZSBleHRlbnNpb25zLgorICAqIE1lc3NhZ2UgaW50ZXJmYWNlIGhhcyBuZXcgbWV0aG9kIHRvQnVpbGRlcigpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8KKyAgICBuZXdCdWlsZGVyRm9yVHlwZSgpLm1lcmdlRnJvbSh0aGlzKS4KKyAgKiBBbGwgZW51bXMgbm93IGltcGxlbWVudCB0aGUgUHJvdG9jb2xNZXNzYWdlRW51bSBpbnRlcmZhY2UuCisgICogU2V0dGluZyBhIGZpZWxkIHRvIG51bGwgbm93IHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4KKyAgKiBGaXhlZCB0ZW5kZW5jeSBmb3IgVGV4dEZvcm1hdCdzIHBhcnNpbmcgdG8gb3ZlcmZsb3cgdGhlIHN0YWNrIHdoZW4KKyAgICBwYXJzaW5nIGxhcmdlIHN0cmluZyB2YWx1ZXMuICBUaGUgdW5kZXJseWluZyBwcm9ibGVtIGlzIHdpdGggSmF2YSdzCisgICAgcmVnZXggaW1wbGVtZW50YXRpb24gKHdoaWNoIHVuZm9ydHVuYXRlbHkgdXNlcyByZWN1cnNpdmUgYmFja3RyYWNraW5nCisgICAgcmF0aGVyIHRoYW4gYnVpbGRpbmcgYW4gTkZBKS4gIFdvcmtlZCBhcm91bmQgYnkgbWFraW5nIHVzZSBvZiBwb3NzZXNpdmUKKyAgICBxdWFudGlmaWVycy4KKyAgKiBHZW5lcmF0ZWQgc2VydmljZSBjbGFzc2VzIG5vdyBhbHNvIGdlbmVyYXRlIHB1cmUgaW50ZXJmYWNlcy4gIEZvciBhIHNlcnZpY2UKKyAgICBGb28sIEZvby5JbnRlcmZhY2UgaXMgYSBwdXJlIGludGVyZmFjZSBjb250YWluaW5nIGFsbCBvZiB0aGUgc2VydmljZSdzCisgICAgZGVmaW5lZCBtZXRob2RzLiAgRm9vLm5ld1JlZmxlY3RpdmVTZXJ2aWNlKCkgY2FuIGJlIGNhbGxlZCB0byB3cmFwIGFuCisgICAgaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgaW4gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGdlbmVyaWMKKyAgICBScGNTZXJ2aWNlIGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZXMgcmVmbGVjdGlvbiBzdXBwb3J0IHRoYXQgaXMgdXN1YWxseQorICAgIG5lZWRlZCBieSBSUEMgc2VydmVyIGltcGxlbWVudGF0aW9ucy4KKyAgKiBSUEMgaW50ZXJmYWNlcyBub3cgc3VwcG9ydCBibG9ja2luZyBvcGVyYXRpb24gaW4gYWRkaXRpb24gdG8gbm9uLWJsb2NraW5nLgorICAgIFRoZSBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgc2VwYXJhdGUgYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBzdHVicworICAgIHdoaWNoIG9wZXJhdGUgYWdhaW5zdCBzZXBhcmF0ZSBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIFJQQyBpbnRlcmZhY2VzLgorICAgIFJQQyBpbXBsZW1lbnRhdGlvbnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZXMgaW4gb3JkZXIgdG8KKyAgICBzdXBwb3J0IGJsb2NraW5nIG1vZGUuCisgICogTmV3IEkvTyBtZXRob2RzIHBhcnNlRGVsaW1pdGVkRnJvbSgpLCBtZXJnZURlbGltaXRlZEZyb20oKSwgYW5kCisgICAgd3JpdGVEZWxpbWl0ZWRUbygpIHJlYWQgYW5kIHdyaXRlICJkZWxlbWl0ZWQiIG1lc3NhZ2VzIGZyb20vdG8gYSBzdHJlYW0sCisgICAgbWVhbmluZyB0aGF0IHRoZSBtZXNzYWdlIHNpemUgcHJlY2VkZXMgdGhlIGRhdGEuICBUaGlzIHdheSwgeW91IGNhbiB3cml0ZQorICAgIG11bHRpcGxlIG1lc3NhZ2VzIHRvIGEgc3RyZWFtIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IGRlbGltaXRpbmcKKyAgICB0aGVtIHlvdXJzZWxmLgorICAqIFRocm93IGEgbW9yZSBkZXNjcmlwdGl2ZSBleGNlcHRpb24gd2hlbiBidWlsZCgpIGlzIGRvdWJsZS1jYWxsZWQuCisgICogQWRkIGEgbWV0aG9kIHRvIHF1ZXJ5IHdoZXRoZXIgQ29kZWRJbnB1dFN0cmVhbSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICAgIHN0cmVhbS4KKyAgKiBBZGQgYSBtZXRob2QgdG8gcmVzZXQgYSBDb2RlZElucHV0U3RyZWFtJ3Mgc2l6ZSBjb3VudGVyOyB1c2VmdWwgd2hlbgorICAgIHJlYWRpbmcgbWFueSBtZXNzYWdlcyB3aXRoIHRoZSBzYW1lIHN0cmVhbS4KKyAgKiBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSBub3cgYWNjb3VudCBmb3IgdW5rbm93biBmaWVsZHMuCisKKyAgUHl0aG9uCisgICogQWRkZWQgc2xpY2luZyBzdXBwb3J0IGZvciByZXBlYXRlZCBzY2FsYXIgZmllbGRzLiBBZGRlZCBzbGljZSByZXRyaWV2YWwgYW5kCisgICAgcmVtb3ZhbCBvZiByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLgorICAqIFVwZGF0ZWQgUlBDIGludGVyZmFjZXMgdG8gYWxsb3cgZm9yIGJsb2NraW5nIG9wZXJhdGlvbi4gIEEgY2xpZW50IG1heQorICAgIG5vdyBwYXNzIE5vbmUgZm9yIGEgY2FsbGJhY2sgd2hlbiBtYWtpbmcgYW4gUlBDLCBpbiB3aGljaCBjYXNlIHRoZQorICAgIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIGFuZCB0aGUgcmVzcG9uc2UKKyAgICBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZCBkaXJlY3RseSB0byB0aGUgY2FsbGVyLiAgVGhpcyBpbnRlcmZhY2UgY2hhbmdlCisgICAgY2Fubm90IGJlIHVzZWQgaW4gcHJhY3RpY2UgdW50aWwgUlBDIGltcGxlbWVudGF0aW9ucyBhcmUgdXBkYXRlZCB0bworICAgIGltcGxlbWVudCBpdC4KKyAgKiBDaGFuZ2VzIHRvIGlucHV0X3N0cmVhbS5weSBzaG91bGQgbWFrZSBwcm90b2J1ZiBjb21wYXRpYmxlIHdpdGggYXBwZW5naW5lLgorCisyMDA4LTExLTI1IHZlcnNpb24gMi4wLjM6CisKKyAgcHJvdG9jCisgICogRW51bSB2YWx1ZXMgbWF5IG5vdyBoYXZlIGN1c3RvbSBvcHRpb25zLCB1c2luZyBzeW50YXggc2ltaWxhciB0byBmaWVsZAorICAgIG9wdGlvbnMuCisgICogRml4ZWQgYnVnIHdoZXJlIC5wcm90byBmaWxlcyB3aGljaCB1c2UgY3VzdG9tIG9wdGlvbnMgYnV0IGRvbid0IGFjdHVhbGx5CisgICAgZGVmaW5lIHRoZW0gKGkuZS4gdGhleSBpbXBvcnQgYW5vdGhlciAucHJvdG8gZmlsZSBkZWZpbmluZyB0aGUgb3B0aW9ucykKKyAgICBoYWQgdG8gZXhwbGljaXRseSBpbXBvcnQgZGVzY3JpcHRvci5wcm90by4KKyAgKiBBZGphY2VudCBzdHJpbmcgbGl0ZXJhbHMgaW4gLnByb3RvIGZpbGVzIHdpbGwgbm93IGJlIGNvbmNhdGVuYXRlZCwgbGlrZSBpbgorICAgIEMuCisgICogSWYgYW4gaW5wdXQgZmlsZSBpcyBhIFdpbmRvd3MgYWJzb2x1dGUgcGF0aCAoZS5nLiAiQzpcZm9vXGJhci5wcm90byIpIGFuZAorICAgIHRoZSBpbXBvcnQgcGF0aCBvbmx5IGNvbnRhaW5zICIuIiAob3IgY29udGFpbnMgIi4iIGJ1dCBkb2VzIG5vdCBjb250YWluCisgICAgdGhlIGZpbGUpLCBwcm90b2MgaW5jb3JyZWN0bHkgdGhvdWdodCB0aGF0IHRoZSBmaWxlIHdhcyB1bmRlciAiLiIsIGJlY2F1c2UKKyAgICBpdCB0aG91Z2h0IHRoYXQgdGhlIHBhdGggd2FzIHJlbGF0aXZlIChzaW5jZSBpdCBkaWRuJ3Qgc3RhcnQgd2l0aCBhIHNsYXNoKS4KKyAgICBUaGlzIGhhcyBiZWVuIGZpeGVkLgorCisgIEMrKworICAqIEdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgbm93IGhhdmUgYSBTd2FwKCkgbWV0aG9kIHdoaWNoIGVmZmljaWVudGx5IHN3YXBzCisgICAgdGhlIGNvbnRlbnRzIG9mIHR3byBvYmplY3RzLgorICAqIEFsbCBtZXNzYWdlIGNsYXNzZXMgbm93IGhhdmUgYSBTcGFjZVVzZWQoKSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBlc3RpbWF0ZQorICAgIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgYWxsb2NhdGVkIG1lbW9yeSBjdXJyZW50bHkgb3duZWQgYnkgdGhlIG9iamVjdC4KKyAgICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB5b3UgYXJlIHJldXNpbmcgYSBzaW5nbGUgbWVzc2FnZSBvYmplY3QKKyAgICB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ1dCB3YW50IHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb2F0IHVwIHRvbyBsYXJnZS4KKyAgKiBOZXcgbWV0aG9kIE1lc3NhZ2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZQorICAgIHNlcmlhbGl6ZWQgZGF0YS4gIE1heSBiZSBtb3JlIGNvbnZlbmllbnQgdGhhbiBjYWxsaW5nCisgICAgU2VyaWFsaXplVG9TdHJpbmcoc3RyaW5nKikuCisgICogSW4gZGVidWcgbW9kZSwgbG9nIGVycm9yIG1lc3NhZ2VzIHdoZW4gc3RyaW5nLXR5cGUgZmllbGRzIGFyZSBmb3VuZCB0bworICAgIGNvbnRhaW4gYnl0ZXMgdGhhdCBhcmUgbm90IHZhbGlkIFVURi04LgorICAqIEZpeGVkIGJ1ZyB3aGVyZSBhIG1lc3NhZ2Ugd2l0aCBtdWx0aXBsZSBleHRlbnNpb24gcmFuZ2VzIGNvdWxkbid0IHBhcnNlCisgICAgZXh0ZW5zaW9ucy4KKyAgKiBGaXhlZCBidWcgd2hlcmUgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmKSBkaWRuJ3QgZG8gYW55dGhpbmcgaWYgaW52b2tlZCBvbgorICAgIGEgbWVzc2FnZSB0aGF0IGNvbnRhaW5lZCBubyBmaWVsZHMgKGJ1dCBwb3NzaWJseSBjb250YWluZWQgZXh0ZW5zaW9ucykuCisgICogRml4ZWQgU2hvcnREZWJ1Z1N0cmluZygpIHRvIG5vdCBiZSBPKG5eMikuICBEdXJyLgorICAqIEZpeGVkIGNyYXNoIGluIFRleHRGb3JtYXQgcGFyc2luZyBpZiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGlucHV0IGNhdXNlZCBhCisgICAgdG9rZW5pemF0aW9uIGVycm9yLgorICAqIEZpeGVkIG9ic2N1cmUgYnVncyBpbiB6ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MuCisgICogQWRkZWQgc3VwcG9ydCBmb3IgSFAgQysrIG9uIFRydTY0LgorICAqIE9ubHkgYnVpbGQgdGVzdHMgb24gIm1ha2UgY2hlY2siLCBub3QgIm1ha2UiLgorICAqIEZpeGVkIGFsaWdubWVudCBpc3N1ZSB0aGF0IGNhdXNlZCBjcmFzaGVzIHdoZW4gdXNpbmcgRHluYW1pY01lc3NhZ2Ugb24KKyAgICA2NC1iaXQgU3BhcmMgbWFjaGluZXMuCisgICogU2ltcGxpZnkgdGVtcGxhdGUgdXNhZ2UgdG8gd29yayB3aXRoIE1TVkMgMjAwMy4KKyAgKiBXb3JrIGFyb3VuZCBHQ0MgNC4zLnggeDg2XzY0IGNvbXBpbGVyIGJ1ZyB0aGF0IGNhdXNlZCBjcmFzaGVzIG9uIHN0YXJ0dXAuCisgICAgKFRoaXMgYWZmZWN0ZWQgRmVkb3JhIDkgaW4gcGFydGljdWxhci4pCisgICogTm93IHdvcmtzIG9uICJTb2xhcmlzIDEwIHVzaW5nIHJlY2VudCBTdW4gU3R1ZGlvIi4KKworICBKYXZhCisgICogTmV3IG92ZXJsb2FkIG9mIG1lcmdlRnJvbSgpIHdoaWNoIHBhcnNlcyBhIHNsaWNlIG9mIGEgYnl0ZSBhcnJheSBpbnN0ZWFkCisgICAgb2YgdGhlIHdob2xlIHRoaW5nLgorICAqIE5ldyBtZXRob2QgQnl0ZVN0cmluZy5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIGRvZXMgd2hhdCBpdCBzb3VuZHMgbGlrZS4KKyAgKiBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvZiBpc0luaXRpYWxpemVkKCkgd2hlbiBvcHRpbWl6aW5nIGZvciBjb2RlIHNpemUuCisKKyAgUHl0aG9uCisgICogQ29ycmVjdGVkIExpc3RGaWVsZHMoKSBzaWduYXR1cmUgaW4gTWVzc2FnZSBiYXNlIGNsYXNzIHRvIG1hdGNoIHdoYXQKKyAgICBzdWJjbGFzc2VzIGFjdHVhbGx5IGltcGxlbWVudC4KKyAgKiBTb21lIG1pbm9yIHJlZmFjdG9yaW5nLgorICAqIERvbid0IHBhc3Mgc2VsZiBhcyBmaXJzdCBhcmd1bWVudCB0byBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIChubyBsb25nZXIKKyAgICBhbGxvd2VkIGluIFB5dGhvbiAyLjYpLgorCisyMDA4LTA5LTI5IHZlcnNpb24gMi4wLjI6CisKKyAgR2VuZXJhbAorICAqIExpY2Vuc2UgY2hhbmdlZCBmcm9tIEFwYWNoZSAyLjAgdG8gTmV3IEJTRC4KKyAgKiBJdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGN1c3RvbSAib3B0aW9ucyIsIHdoaWNoIGFyZSBiYXNpY2FsbHkKKyAgICBhbm5vdGF0aW9ucyB3aGljaCBtYXkgYmUgcGxhY2VkIG9uIGRlZmluaXRpb25zIGluIGEgLnByb3RvIGZpbGUuCisgICAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBkZWZpbmUgYSBmaWVsZCBvcHRpb24gY2FsbGVkICJmb28iIGxpa2Ugc286CisgICAgICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIgorICAgICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgeworICAgICAgICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMTIzNDU7CisgICAgICB9CisgICAgVGhlbiB5b3UgYW5ub3RhdGUgYSBmaWVsZCB1c2luZyB0aGUgImZvbyIgb3B0aW9uOgorICAgICAgbWVzc2FnZSBNeU1lc3NhZ2UgeworICAgICAgICBvcHRpb25hbCBpbnQzMiBzb21lX2ZpZWxkID0gMSBbKGZvbykgPSAiYmFyIl0KKyAgICAgIH0KKyAgICBUaGUgdmFsdWUgb2YgdGhpcyBvcHRpb24gaXMgdGhlbiB2aXNpYmxlIHZpYSB0aGUgbWVzc2FnZSdzCisgICAgRGVzY3JpcHRvcjoKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgICBNeU1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJzb21lX2ZpZWxkIik7CisgICAgICBhc3NlcnQoZmllbGQtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24oZm9vKSA9PSAiYmFyIik7CisgICAgVGhpcyBmZWF0dXJlIGhhcyBiZWVuIGltcGxlbWVudGVkIGFuZCB0ZXN0ZWQgaW4gQysrIGFuZCBKYXZhLgorICAgIE90aGVyIGxhbmd1YWdlcyBtYXkgb3IgbWF5IG5vdCBuZWVkIHRvIGRvIGV4dHJhIHdvcmsgdG8gc3VwcG9ydAorICAgIGN1c3RvbSBvcHRpb25zLCBkZXBlbmRpbmcgb24gaG93IHRoZXkgY29uc3RydWN0IGRlc2NyaXB0b3JzLgorCisgIEMrKworICAqIEZpeGVkIHNvbWUgR0NDIHdhcm5pbmdzIHRoYXQgb25seSBvY2N1ciB3aGVuIHVzaW5nIC1wZWRhbnRpYy4KKyAgKiBJbXByb3ZlZCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gY29kZSwgbWFraW5nIG9yZGVyaW5nIG1vcmUKKyAgICBwcmVkaWN0YWJsZSBhbW9uZyBvdGhlciB0aGluZ3MuCisgICogVGV4dEZvcm1hdCB3aWxsIG5vIGxvbmdlciBhY2NlcHQgbWVzc2FnZXMgd2hpY2ggY29udGFpbiBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBvZiBhIHNpbmd1bGFyIGZpZWxkLiAgUHJldmlvdXNseSwgdGhlIGxhdHRlciBpbnN0YW5jZQorICAgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZm9ybWVyLgorICAqIE5vdyB3b3JrcyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBoYXNoX21hcC4KKworICBKYXZhCisgICogUHJpbnQgQE92ZXJyaWRlIGFubm90YXRpb24gaW4gZ2VuZXJhdGVkIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuCisKKyAgUHl0aG9uCisgICogU3RyaW5ncyBub3cgdXNlIHRoZSAidW5pY29kZSIgdHlwZSByYXRoZXIgdGhhbiB0aGUgInN0ciIgdHlwZS4KKyAgICBTdHJpbmcgZmllbGRzIG1heSBzdGlsbCBiZSBhc3NpZ25lZCBBU0NJSSAic3RyIiB2YWx1ZXM7IHRoZXkgd2lsbAorICAgIGF1dG9tYXRpY2FsbHkgYmUgY29udmVydGVkLgorICAqIEFkZGluZyBhIHByb3BlcnR5IHRvIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZXBlYXRlZCBmaWVsZCBub3cKKyAgICByYWlzZXMgYW4gZXhjZXB0aW9uLiAgRm9yIGV4YW1wbGU6CisgICAgICAjIE5vIGxvbmdlciB3b3JrcyAoYW5kIG5ldmVyIHNob3VsZCBoYXZlKS4KKyAgICAgIG1lc3NhZ2Uuc29tZV9yZXBlYXRlZF9maWVsZC5mb28gPSAxCisKKyAgV2luZG93cworICAqIFdlIG5vdyBidWlsZCBzdGF0aWMgbGlicmFyaWVzIHJhdGhlciB0aGFuIERMTHMgYnkgZGVmYXVsdCBvbiBNU1ZDLgorICAgIFNlZSB2c3Byb2plY3RzL3JlYWRtZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKzIwMDgtMDgtMTUgdmVyc2lvbiAyLjAuMToKKworICBwcm90b2MKKyAgKiBOZXcgZmxhZ3MgLS1lbmNvZGUgYW5kIC0tZGVjb2RlIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiBwcm90b2J1ZiB0ZXh0CisgICAgZm9ybWF0IGFuZCBiaW5hcnkgZm9ybWF0IGZyb20gdGhlIGNvbW1hbmQtbGluZS4KKyAgKiBOZXcgZmxhZyAtLWRlc2NyaXB0b3Jfc2V0X291dCBjYW4gYmUgdXNlZCB0byB3cml0ZSBGaWxlRGVzY3JpcHRvclByb3RvcyBmb3IKKyAgICBhbGwgcGFyc2VkIGZpbGVzIGRpcmVjdGx5IGludG8gYSBzaW5nbGUgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHBhcnRpY3VsYXJseQorICAgIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byBwYXJzZSAucHJvdG8gZmlsZXMgZnJvbSBwcm9ncmFtcyB3cml0dGVuIGluIGxhbmd1YWdlcworICAgIG90aGVyIHRoYW4gQysrOiBqdXN0IHJ1biBwcm90b2MgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MgYW5kIGhhdmUgaXQgb3V0cHV0CisgICAgYSBGaWxlRGVzY3JpcHRvckxpc3QsIHRoZW4gcGFyc2UgdGhhdCBuYXRpdmVseS4KKyAgKiBJbXByb3ZlZCBlcnJvciBtZXNzYWdlIHdoZW4gYW4gZW51bSB2YWx1ZSdzIG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlcgorICAgIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBlbnVtIHR5cGUncyBzY29wZSwgZS5nLiBpZiB0d28gZW51bSB0eXBlcyBkZWNsYXJlZAorICAgIGluIHRoZSBzYW1lIHNjb3BlIGhhdmUgdmFsdWVzIHdpdGggdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgZGlzYWxsb3dlZCBmb3IKKyAgICBjb21wYXRpYmlsaXR5IHdpdGggQysrLCBidXQgdGhpcyB3YXNuJ3QgY2xlYXIgZnJvbSB0aGUgZXJyb3IuCisgICogRml4ZWQgYWJzb2x1dGUgb3V0cHV0IHBhdGhzIG9uIFdpbmRvd3MuCisgICogQWxsb3cgdHJhaWxpbmcgc2xhc2hlcyBpbiAtLXByb3RvX3BhdGggbWFwcGluZ3MuCisKKyAgQysrCisgICogUmVmbGVjdGlvbiBvYmplY3RzIGFyZSBub3cgcGVyLWNsYXNzIHJhdGhlciB0aGFuIHBlci1pbnN0YW5jZS4gIFRvIG1ha2UgdGhpcworICAgIHBvc3NpYmxlLCB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2UgaGFkIHRvIGJlIGNoYW5nZWQgc3VjaCB0aGF0IGFsbCBtZXRob2RzCisgICAgdGFrZSB0aGUgTWVzc2FnZSBpbnN0YW5jZSBhcyBhIHBhcmFtZXRlci4gIFRoaXMgY2hhbmdlIGltcHJvdmVzIHBlcmZvcm1hbmNlCisgICAgc2lnbmlmaWNhbnRseSBpbiBtZW1vcnktYmFuZHdpZHRoLWxpbWl0ZWQgdXNlIGNhc2VzLCBzaW5jZSBpdCBtYWtlcyB0aGUKKyAgICBtZXNzYWdlIG9iamVjdHMgc21hbGxlci4gIE5vdGUgdGhhdCBzb3VyY2UtaW5jb21wYXRpYmxlIGludGVyZmFjZSBjaGFuZ2VzCisgICAgbGlrZSB0aGlzIHdpbGwgbm90IGJlIG1hZGUgYWdhaW4gYWZ0ZXIgdGhlIGxpYnJhcnkgbGVhdmVzIGJldGEuCisgICogSGV1cmlzdGljYWxseSBkZXRlY3Qgc3ViLW1lc3NhZ2VzIHdoZW4gcHJpbnRpbmcgdW5rbm93biBmaWVsZHMuCisgICogRml4IHN0YXRpYyBpbml0aWFsaXphdGlvbiBvcmRlcmluZyBidWcgdGhhdCBjYXVzZWQgY3Jhc2hlcyBhdCBzdGFydHVwIHdoZW4KKyAgICBjb21waWxpbmcgb24gTWFjIHdpdGggc3RhdGljIGxpbmtpbmcuCisgICogRml4ZWQgVG9rZW5pemVyVGVzdCB3aGVuIGNvbXBpbGluZyB3aXRoIC1ETkRFQlVHIG9uIExpbnV4LgorICAqIEZpeGVkIGluY29ycmVjdCBkZWZpbml0aW9uIG9mIGtpbnQzMm1pbi4KKyAgKiBGaXggYnl0ZXMgdHlwZSBzZXR0ZXIgdG8gd29yayB3aXRoIGJ5dGUgc2VxdWVuY2VzIHdpdGggZW1iZWRkZWQgTlVMTHMuCisgICogT3RoZXIgaXJyZWxldmFudCB0d2Vha3MuCisKKyAgSmF2YQorICAqIEZpeGVkIFVua25vd25GaWVsZFNldCdzIHBhcnNpbmcgb2YgdmFyaW50cyBsYXJnZXIgdGhhbiAzMiBiaXRzLgorICAqIEZpeGVkIFRleHRGb3JtYXQncyBwYXJzaW5nIG9mICJpbmYiIGFuZCAibmFuIi4KKyAgKiBGaXhlZCBUZXh0Rm9ybWF0J3MgcGFyc2luZyBvZiBjb21tZW50cy4KKyAgKiBBZGRlZCBpbmZvIHRvIEphdmEgUE9NIHRoYXQgd2lsbCBiZSByZXF1aXJlZCB3aGVuIHdlIHVwbG9hZCB0aGUKKyAgICBwYWNrYWdlIHRvIGEgTWF2ZW4gcmVwby4KKworICBQeXRob24KKyAgKiBNZXJnZUZyb20obWVzc2FnZSkgYW5kIENvcHlGcm9tKG1lc3NhZ2UpIGFyZSBub3cgaW1wbGVtZW50ZWQuCisgICogU2VyaWFsaXplVG9TdHJpbmcoKSByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQKKyAgICBmaWVsZHMuCisgICogQ29kZSBvcmdhbml6YXRpb24gaW1wcm92ZW1lbnRzLgorICAqIEZpeGVkIGRvYyBjb21tZW50cyBmb3IgUnBjQ29udHJvbGxlciBhbmQgUnBjQ2hhbm5lbCwgd2hpY2ggaGFkIHNvbWVob3cgYmVlbgorICAgIHN3YXBwZWQuCisgICogRml4ZWQgdGV4dF9mb3JtYXRfdGVzdCBvbiBXaW5kb3dzIHdoZXJlIGZsb2F0aW5nLXBvaW50IGV4cG9uZW50cyBzb21ldGltZXMKKyAgICBjb250YWluIGV4dHJhIHplcm9zLgorICAqIEZpeCBQeXRob24gc2VydmljZSBDYWxsTWV0aG9kKCkgaW1wbGVtZW50YXRpb24uCisKKyAgT3RoZXIKKyAgKiBJbXByb3ZlZCByZWFkbWVzLgorICAqIFZJTSBzeW50YXggaGlnaGxpZ2h0aW5nIGltcHJvdmVtZW50cy4KKworMjAwOC0wNy0wNyB2ZXJzaW9uIDIuMC4wOgorCisgICogRmlyc3QgcHVibGljIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL0NPTlRSSUJVVE9SUy50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL0NPTlRSSUJVVE9SUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5ZWMzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvQ09OVFJJQlVUT1JTLnR4dApAQCAtMCwwICsxLDkwIEBACitUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIHBlb3BsZSB3aG8gaGF2ZSBtYWRlIGxhcmdlIGNvbnRyaWJ1dGlvbnMKK3RvIHRoZSBwdWJsaWMgdmVyc2lvbiBvZiBQcm90b2NvbCBCdWZmZXJzLgorCitPcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb246CisgIFNhbmpheSBHaGVtYXdhdCA8c2FuamF5QGdvb2dsZS5jb20+CisgIEplZmYgRGVhbiA8amVmZkBnb29nbGUuY29tPgorICBEYW5pZWwgRHVsaXR6IDxkYW5pZWxAZ29vZ2xlLmNvbT4KKyAgQ3JhaWcgU2lsdmVyc3RlaW4KKyAgUGF1bCBIYWFociA8aGFhaHJAZ29vZ2xlLmNvbT4KKyAgQ29yZXkgQW5kZXJzb24gPGNvcmluQGdvb2dsZS5jb20+CisgIChhbmQgbWFueSBvdGhlcnMpCisKK1Byb3RvMiBDKysgYW5kIEphdmEgcHJpbWFyeSBhdXRob3I6CisgIEtlbnRvbiBWYXJkYSA8a2VudG9uQGdvb2dsZS5jb20+CisKK1Byb3RvMiBQeXRob24gcHJpbWFyeSBhdXRob3JzOgorICBXaWxsIFJvYmluc29uIDxyb2JpbnNvbkBnb29nbGUuY29tPgorICBQZXRhciBQZXRyb3YgPHBldGFyQGdvb2dsZS5jb20+CisKK0xhcmdlIGNvZGUgY29udHJpYnV0aW9uczoKKyAgSmFzb24gSHN1ZWggPGphc29uaEBnb29nbGUuY29tPgorICBKb3NlcGggU2Nob3JyIDxqc2Nob3JyQGdvb2dsZS5jb20+CisgIFdlbmJvIFpodSA8d2VuYm96QGdvb2dsZS5jb20+CisKK0xhcmdlIHF1YW50aXR5IG9mIGNvZGUgcmV2aWV3czoKKyAgU2NvdHQgQnJ1Y2UgPHNicnVjZUBnb29nbGUuY29tPgorICBGcmFuayBZZWxsaW4KKyAgTmVhbCBOb3J3aXR6IDxubm9yd2l0ekBnb29nbGUuY29tPgorICBKZWZmcmV5IFlhc3NraW4gPGp5YXNza2luQGdvb2dsZS5jb20+CisgIEFtYnJvc2UgRmVpbnN0ZWluIDxhbWJyb3NlQGdvb2dsZS5jb20+CisKK0RvY3VtZW50YXRpb246CisgIExpc2EgQ2FyZXkgPGxjYXJleUBnb29nbGUuY29tPgorCitNYXZlbiBwYWNrYWdpbmc6CisgIEdyZWdvcnkgS2ljayA8Z2FrQGdvb2dsZS5jb20+CisKK1BhdGNoIGNvbnRyaWJ1dG9yczoKKyAgS2V2aW4gS28gPGtldmluLnMua29AZ21haWwuY29tPgorICAgICogU21hbGwgcGF0Y2ggdG8gaGFuZGxlIHRyYWlsaW5nIHNsYXNoZXMgaW4gLS1wcm90b19wYXRoIGZsYWcuCisgIEpvaGFuIEV1cGhyb3NpbmUgPHByb3BweUBhbWluY2hlLmNvbT4KKyAgICAqIFNtYWxsIHBhdGNoIHRvIGZpeCBQeXRob24gQ2FsbE1ldGhvZCgpLgorICBVbHJpY2ggS3VuaXR6IDxrdW5lQGRlaW5lLXRhbGVyLmRlPgorICAgICogU21hbGwgb3B0aW1pemF0aW9ucyB0byBQeXRob24gc2VyaWFsaXphdGlvbi4KKyAgTGVhbmRybyBMdWNhcmVsbGEgPGxsdWNheEBnbWFpbC5jb20+CisgICAgKiBWSSBzeW50YXggaGlnaGxpZ2h0aW5nIHR3ZWFrcy4KKyAgICAqIEZpeCBjb21waWxlciB0byBub3QgbWFrZSBvdXRwdXQgZXhlY3V0YWJsZS4KKyAgRGlsaXAgSm9zZXBoIDxkaWxpcC5hbnRvbnkuam9zZXBoQGdtYWlsLmNvbT4KKyAgICAqIEhldXJpc3RpYyBkZXRlY3Rpb24gb2Ygc3ViLW1lc3NhZ2VzIHdoZW4gcHJpbnRpbmcgdW5rbm93biBmaWVsZHMgaW4KKyAgICAgIHRleHQgZm9ybWF0LgorICBCcmlhbiBBdGtpbnNvbiA8bmFpcmI3NzRAZ21haWwuY29tPgorICAgICogQWRkZWQgQE92ZXJyaWRlIGFubm90YXRpb24gdG8gZ2VuZXJhdGVkIEphdmEgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4KKyAgVmluY2VudCBDaG9pbmnocmUgPENob2luaWVyZS5WaW5jZW50QGh5ZHJvLnFjLmNhPgorICAgICogVHJ1NjQgc3VwcG9ydC4KKyAgTW9udHkgVGF5bG9yIDxtb250eS50YXlsb3JAZ21haWwuY29tPgorICAgICogU29sYXJpcyAxMCArIFN1biBTdHVkaW8gZml4ZXMuCisgIEFsZWsgU3Rvcm0gPGFsZWsuc3Rvcm1AZ21haWwuY29tPgorICAgICogU2xpY2luZyBzdXBwb3J0IGZvciByZXBlYXRlZCBzY2FsYXIgZmllbGRzIGZvciB0aGUgUHl0aG9uIEFQSS4KKyAgT2xlZyBTbW9sc2t5IDxvbGVnLnNtb2xza3lAZ21haWwuY29tPgorICAgICogTVMgVmlzdWFsIFN0dWRpbyBlcnJvciBmb3JtYXQgb3B0aW9uLgorICAgICogRGV0ZWN0IHVub3JkZXJlZF9tYXAgaW4gc3RsX2hhc2gubTQuCisgIEJyaWFuIE9sc29uIDxicmlhbm9sc29uQGdvb2dsZS5jb20+CisgICAgKiBnemlwL3psaWIgSS9PIHN1cHBvcnQuCisgIE1pY2hhZWwgUG9vbGUgPG1kcG9vbGVAdHJvaWx1cy5vcmc+CisgICAgKiBGaXhlZCB3YXJuaW5ncyBhYm91dCBnZW5lcmF0ZWQgY29uc3RydWN0b3JzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemluZworICAgICAgYWxsIGZpZWxkcyAob25seSBwcmVzZW50IHdpdGggY2VydGFpbiBjb21waWxlciBzZXR0aW5ncykuCisgICAgKiBBZGRlZCBnZW5lcmF0aW9uIG9mIGZpZWxkIG51bWJlciBjb25zdGFudHMuCisgIFdpbmsgU2F2aWxsZSA8d2lua0Bnb29nbGUuY29tPgorICAgICogRml4ZWQgaW5pdGlhbGl6YXRpb24gb3JkZXJpbmcgcHJvYmxlbSBpbiBsb2dnaW5nIGNvZGUuCisgIFdpbGwgUGllcmNlIDx3aWxscEBudWNsZWkuY29tPgorICAgICogU21hbGwgcGF0Y2ggaW1wcm92aW5nIHBlcmZvcm1hbmNlIG9mIGluIFB5dGhvbiBzZXJpYWxpemF0aW9uLgorICBBbGV4YW5kcmUgVmFzc2Fsb3R0aSA8YWxleGFuZHJlQHBlYWRyb3AuY29tPgorICAgICogRW1hY3MgbW9kZSBmb3IgUHJvdG9jb2wgQnVmZmVycyAoZWRpdG9ycy9wcm90b2J1Zi1tb2RlLmVsKS4KKyAgU2NvdHQgU3RhZmZvcmQgPHNjb3R0LnN0YWZmb3JkQGdtYWlsLmNvbT4KKyAgICAqIEFkZGVkIFN3YXAoKSwgU3dhcEVsZW1lbnRzKCksIGFuZCBSZW1vdmVMYXN0KCkgdG8gUmVmbGVjdGlvbiBpbnRlcmZhY2UuCisgIEFsZXhhbmRlciBNZWxuaWtvdiA8YWxtQHNpYm1haWwucnU+CisgICAgKiBIUFVYIHN1cHBvcnQuCisgIE9saXZlciBKb3dldHQgPG9saXZlci5qb3dldHRAZ21haWwuY29tPgorICAgICogRGV0ZWN0IHdoZXRoZXIgemxpYiBpcyBuZXcgZW5vdWdoIGluIGNvbmZpZ3VyZSBzY3JpcHQuCisgICAgKiBGaXhlcyBmb3IgU29sYXJpcyAxMCAzMi82NC1iaXQgY29uZnVzaW9uLgorICBFdmFuIEpvbmVzIDxldmFuakBtaXQuZWR1PgorICAgICogT3B0aW1pemUgSmF2YSBzZXJpYWxpemF0aW9uIGNvZGUgd2hlbiB3cml0aW5nIGEgc21hbGwgbWVzc2FnZSB0byBhIHN0cmVhbS4KKyAgICAqIE9wdGltaXplIEphdmEgc2VyaWFsaXphdGlvbiBvZiBzdHJpbmdzIHNvIHRoYXQgVVRGLTggZW5jb2RpbmcgaGFwcGVucyBvbmx5CisgICAgICBvbmNlIHBlciBzdHJpbmcgcGVyIHNlcmlhbGl6YXRpb24gY2FsbC4KKyAgICAqIENsZWFuIHVwIHNvbWUgSmF2YSB3YXJuaW5ncy4KKyAgICAqIEZpeCBidWcgd2l0aCBwZXJtYW5lbnQgY2FsbGJhY2tzIHRoYXQgZGVsZXRlIHRoZW1zZWx2ZXMgd2hlbiBydW4uCisgIE1pY2hhZWwgS3VjaGFyc2tpIDxtLmt1Y2hhcnNraUBnbWFpbC5jb20+CisgICAgKiBBZGRlZCBDb2RlZElucHV0U3RyZWFtLmdldFRvdGFsQnl0ZXNSZWFkKCkuCisgIEthY3BlciBLb3dhbGlrIDx4YXJ0aGlzaXVzLmtrQGdtYWlsLmNvbT4KKyAgICAqIEZpeGVkIG00L2FjeF9wdGhyZWFkLm00IHByb2JsZW0gZm9yIHNvbWUgTGludXggZGlzdHJpYnV0aW9ucy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvQ09QWUlORy50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL0NPUFlJTkcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL0NPUFlJTkcudHh0CkBAIC0wLDAgKzEsMzMgQEAKK0NvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIFByb3RvY29sIEJ1ZmZlciBjb21waWxlciBpcyBvd25lZCBieSB0aGUgb3duZXIKK29mIHRoZSBpbnB1dCBmaWxlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGl0LiAgVGhpcyBjb2RlIGlzIG5vdAorc3RhbmRhbG9uZSBhbmQgcmVxdWlyZXMgYSBzdXBwb3J0IGxpYnJhcnkgdG8gYmUgbGlua2VkIHdpdGggaXQuICBUaGlzCitzdXBwb3J0IGxpYnJhcnkgaXMgaXRzZWxmIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGxpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL0lOU1RBTEwudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9JTlNUQUxMLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTNiMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9JTlNUQUxMLnR4dApAQCAtMCwwICsxLDIzNyBAQAorVGhpcyBmaWxlIGNvbnRhaW5zIGRldGFpbGVkIGJ1dCBnZW5lcmljIGluZm9ybWF0aW9uIG9uIGJ1aWxkaW5nIGFuZAoraW5zdGFsbGluZyB0aGUgQysrIHBhcnQgb2YgdGhpcyBwcm9qZWN0LiAgRm9yIHNob3J0ZXIgaW5zdHJ1Y3Rpb25zLAorYXMgd2VsbCBhcyBpbnN0cnVjdGlvbnMgZm9yIGNvbXBpbGluZyBhbmQgaW5zdGFsbGluZyB0aGUgSmF2YSBvcgorUHl0aG9uIHBhcnRzLCBzZWUgUkVBRE1FLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIGZyZWUgZG9jdW1lbnRhdGlvbjsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcwordW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisKK0Jhc2ljIEluc3RhbGxhdGlvbgorPT09PT09PT09PT09PT09PT09CisKKyAgIFRoZXNlIGFyZSBnZW5lcmljIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCisKKyAgIFRoZSBgY29uZmlndXJlJyBzaGVsbCBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgY29ycmVjdCB2YWx1ZXMgZm9yCit2YXJpb3VzIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLiAgSXQgdXNlcwordGhvc2UgdmFsdWVzIHRvIGNyZWF0ZSBhIGBNYWtlZmlsZScgaW4gZWFjaCBkaXJlY3Rvcnkgb2YgdGhlIHBhY2thZ2UuCitJdCBtYXkgYWxzbyBjcmVhdGUgb25lIG9yIG1vcmUgYC5oJyBmaWxlcyBjb250YWluaW5nIHN5c3RlbS1kZXBlbmRlbnQKK2RlZmluaXRpb25zLiAgRmluYWxseSwgaXQgY3JlYXRlcyBhIHNoZWxsIHNjcmlwdCBgY29uZmlnLnN0YXR1cycgdGhhdAoreW91IGNhbiBydW4gaW4gdGhlIGZ1dHVyZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBhbmQgYQorZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQgKHVzZWZ1bCBtYWlubHkgZm9yCitkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJdCBjYW4gYWxzbyB1c2UgYW4gb3B0aW9uYWwgZmlsZSAodHlwaWNhbGx5IGNhbGxlZCBgY29uZmlnLmNhY2hlJworYW5kIGVuYWJsZWQgd2l0aCBgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScgb3Igc2ltcGx5IGAtQycpIHRoYXQgc2F2ZXMKK3RoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cCByZWNvbmZpZ3VyaW5nLiAgKENhY2hpbmcgaXMKK2Rpc2FibGVkIGJ5IGRlZmF1bHQgdG8gcHJldmVudCBwcm9ibGVtcyB3aXRoIGFjY2lkZW50YWwgdXNlIG9mIHN0YWxlCitjYWNoZSBmaWxlcy4pCisKKyAgIElmIHlvdSBuZWVkIHRvIGRvIHVudXN1YWwgdGhpbmdzIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UsIHBsZWFzZSB0cnkKK3RvIGZpZ3VyZSBvdXQgaG93IGBjb25maWd1cmUnIGNvdWxkIGNoZWNrIHdoZXRoZXIgdG8gZG8gdGhlbSwgYW5kIG1haWwKK2RpZmZzIG9yIGluc3RydWN0aW9ucyB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUgYFJFQURNRScgc28gdGhleSBjYW4KK2JlIGNvbnNpZGVyZWQgZm9yIHRoZSBuZXh0IHJlbGVhc2UuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBjYWNoZSwgYW5kIGF0Citzb21lIHBvaW50IGBjb25maWcuY2FjaGUnIGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91CittYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisKKyAgIFRoZSBmaWxlIGBjb25maWd1cmUuYWMnIChvciBgY29uZmlndXJlLmluJykgaXMgdXNlZCB0byBjcmVhdGUKK2Bjb25maWd1cmUnIGJ5IGEgcHJvZ3JhbSBjYWxsZWQgYGF1dG9jb25mJy4gIFlvdSBvbmx5IG5lZWQKK2Bjb25maWd1cmUuYWMnIGlmIHlvdSB3YW50IHRvIGNoYW5nZSBpdCBvciByZWdlbmVyYXRlIGBjb25maWd1cmUnIHVzaW5nCithIG5ld2VyIHZlcnNpb24gb2YgYGF1dG9jb25mJy4KKworVGhlIHNpbXBsZXN0IHdheSB0byBjb21waWxlIHRoaXMgcGFja2FnZSBpczoKKworICAxLiBgY2QnIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGFuZCB0eXBlCisgICAgIGAuL2NvbmZpZ3VyZScgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlIGZvciB5b3VyIHN5c3RlbS4gIElmIHlvdSdyZQorICAgICB1c2luZyBgY3NoJyBvbiBhbiBvbGQgdmVyc2lvbiBvZiBTeXN0ZW0gViwgeW91IG1pZ2h0IG5lZWQgdG8gdHlwZQorICAgICBgc2ggLi9jb25maWd1cmUnIGluc3RlYWQgdG8gcHJldmVudCBgY3NoJyBmcm9tIHRyeWluZyB0byBleGVjdXRlCisgICAgIGBjb25maWd1cmUnIGl0c2VsZi4KKworICAgICBSdW5uaW5nIGBjb25maWd1cmUnIHRha2VzIGF3aGlsZS4gIFdoaWxlIHJ1bm5pbmcsIGl0IHByaW50cyBzb21lCisgICAgIG1lc3NhZ2VzIHRlbGxpbmcgd2hpY2ggZmVhdHVyZXMgaXQgaXMgY2hlY2tpbmcgZm9yLgorCisgIDIuIFR5cGUgYG1ha2UnIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UuCisKKyAgMy4gT3B0aW9uYWxseSwgdHlwZSBgbWFrZSBjaGVjaycgdG8gcnVuIGFueSBzZWxmLXRlc3RzIHRoYXQgY29tZSB3aXRoCisgICAgIHRoZSBwYWNrYWdlLgorCisgIDQuIFR5cGUgYG1ha2UgaW5zdGFsbCcgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIGFueSBkYXRhIGZpbGVzIGFuZAorICAgICBkb2N1bWVudGF0aW9uLgorCisgIDUuIFlvdSBjYW4gcmVtb3ZlIHRoZSBwcm9ncmFtIGJpbmFyaWVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbSB0aGUKKyAgICAgc291cmNlIGNvZGUgZGlyZWN0b3J5IGJ5IHR5cGluZyBgbWFrZSBjbGVhbicuICBUbyBhbHNvIHJlbW92ZSB0aGUKKyAgICAgZmlsZXMgdGhhdCBgY29uZmlndXJlJyBjcmVhdGVkIChzbyB5b3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yCisgICAgIGEgZGlmZmVyZW50IGtpbmQgb2YgY29tcHV0ZXIpLCB0eXBlIGBtYWtlIGRpc3RjbGVhbicuICBUaGVyZSBpcworICAgICBhbHNvIGEgYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgdGFyZ2V0LCBidXQgdGhhdCBpcyBpbnRlbmRlZCBtYWlubHkKKyAgICAgZm9yIHRoZSBwYWNrYWdlJ3MgZGV2ZWxvcGVycy4gIElmIHlvdSB1c2UgaXQsIHlvdSBtYXkgaGF2ZSB0byBnZXQKKyAgICAgYWxsIHNvcnRzIG9mIG90aGVyIHByb2dyYW1zIGluIG9yZGVyIHRvIHJlZ2VuZXJhdGUgZmlsZXMgdGhhdCBjYW1lCisgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworQ29tcGlsZXJzIGFuZCBPcHRpb25zCis9PT09PT09PT09PT09PT09PT09PT0KKworICAgU29tZSBzeXN0ZW1zIHJlcXVpcmUgdW51c3VhbCBvcHRpb25zIGZvciBjb21waWxhdGlvbiBvciBsaW5raW5nIHRoYXQKK3RoZSBgY29uZmlndXJlJyBzY3JpcHQgZG9lcyBub3Qga25vdyBhYm91dC4gIFJ1biBgLi9jb25maWd1cmUgLS1oZWxwJworZm9yIGRldGFpbHMgb24gc29tZSBvZiB0aGUgcGVydGluZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworICAgWW91IGNhbiBnaXZlIGBjb25maWd1cmUnIGluaXRpYWwgdmFsdWVzIGZvciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKK2J5IHNldHRpbmcgdmFyaWFibGVzIGluIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gdGhlIGVudmlyb25tZW50LiAgSGVyZQoraXMgYW4gZXhhbXBsZToKKworICAgICAuL2NvbmZpZ3VyZSBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXgKKworICAgKk5vdGUgRGVmaW5pbmcgVmFyaWFibGVzOjosIGZvciBtb3JlIGRldGFpbHMuCisKK0NvbXBpbGluZyBGb3IgTXVsdGlwbGUgQXJjaGl0ZWN0dXJlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFlvdSBjYW4gY29tcGlsZSB0aGUgcGFja2FnZSBmb3IgbW9yZSB0aGFuIG9uZSBraW5kIG9mIGNvbXB1dGVyIGF0IHRoZQorc2FtZSB0aW1lLCBieSBwbGFjaW5nIHRoZSBvYmplY3QgZmlsZXMgZm9yIGVhY2ggYXJjaGl0ZWN0dXJlIGluIHRoZWlyCitvd24gZGlyZWN0b3J5LiAgVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIGEgdmVyc2lvbiBvZiBgbWFrZScgdGhhdAorc3VwcG9ydHMgdGhlIGBWUEFUSCcgdmFyaWFibGUsIHN1Y2ggYXMgR05VIGBtYWtlJy4gIGBjZCcgdG8gdGhlCitkaXJlY3Rvcnkgd2hlcmUgeW91IHdhbnQgdGhlIG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMgdG8gZ28gYW5kIHJ1bgordGhlIGBjb25maWd1cmUnIHNjcmlwdC4gIGBjb25maWd1cmUnIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGZvciB0aGUKK3NvdXJjZSBjb2RlIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBgY29uZmlndXJlJyBpcyBpbiBhbmQgaW4gYC4uJy4KKworICAgSWYgeW91IGhhdmUgdG8gdXNlIGEgYG1ha2UnIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYFZQQVRIJwordmFyaWFibGUsIHlvdSBoYXZlIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG9uZSBhcmNoaXRlY3R1cmUgYXQgYQordGltZSBpbiB0aGUgc291cmNlIGNvZGUgZGlyZWN0b3J5LiAgQWZ0ZXIgeW91IGhhdmUgaW5zdGFsbGVkIHRoZQorcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSwgdXNlIGBtYWtlIGRpc3RjbGVhbicgYmVmb3JlIHJlY29uZmlndXJpbmcKK2ZvciBhbm90aGVyIGFyY2hpdGVjdHVyZS4KKworSW5zdGFsbGF0aW9uIE5hbWVzCis9PT09PT09PT09PT09PT09PT0KKworICAgQnkgZGVmYXVsdCwgYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIHRoZSBwYWNrYWdlJ3MgZmlsZXMgaW4KK2AvdXNyL2xvY2FsL2JpbicsIGAvdXNyL2xvY2FsL21hbicsIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeSBhbgoraW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIGAvdXNyL2xvY2FsJyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCitvcHRpb24gYC0tcHJlZml4PVBBVEgnLgorCisgICBZb3UgY2FuIHNwZWNpZnkgc2VwYXJhdGUgaW5zdGFsbGF0aW9uIHByZWZpeGVzIGZvcgorYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZpbGVzIGFuZCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMuICBJZiB5b3UKK2dpdmUgYGNvbmZpZ3VyZScgdGhlIG9wdGlvbiBgLS1leGVjLXByZWZpeD1QQVRIJywgdGhlIHBhY2thZ2Ugd2lsbCB1c2UKK1BBVEggYXMgdGhlIHByZWZpeCBmb3IgaW5zdGFsbGluZyBwcm9ncmFtcyBhbmQgbGlicmFyaWVzLgorRG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZGF0YSBmaWxlcyB3aWxsIHN0aWxsIHVzZSB0aGUgcmVndWxhciBwcmVmaXguCisKKyAgIEluIGFkZGl0aW9uLCBpZiB5b3UgdXNlIGFuIHVudXN1YWwgZGlyZWN0b3J5IGxheW91dCB5b3UgY2FuIGdpdmUKK29wdGlvbnMgbGlrZSBgLS1iaW5kaXI9UEFUSCcgdG8gc3BlY2lmeSBkaWZmZXJlbnQgdmFsdWVzIGZvciBwYXJ0aWN1bGFyCitraW5kcyBvZiBmaWxlcy4gIFJ1biBgY29uZmlndXJlIC0taGVscCcgZm9yIGEgbGlzdCBvZiB0aGUgZGlyZWN0b3JpZXMKK3lvdSBjYW4gc2V0IGFuZCB3aGF0IGtpbmRzIG9mIGZpbGVzIGdvIGluIHRoZW0uCisKKyAgIElmIHRoZSBwYWNrYWdlIHN1cHBvcnRzIGl0LCB5b3UgY2FuIGNhdXNlIHByb2dyYW1zIHRvIGJlIGluc3RhbGxlZAord2l0aCBhbiBleHRyYSBwcmVmaXggb3Igc3VmZml4IG9uIHRoZWlyIG5hbWVzIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVgnIG9yIGAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCcuCisKK09wdGlvbmFsIEZlYXR1cmVzCis9PT09PT09PT09PT09PT09PQorCisgICBTb21lIHBhY2thZ2VzIHBheSBhdHRlbnRpb24gdG8gYC0tZW5hYmxlLUZFQVRVUkUnIG9wdGlvbnMgdG8KK2Bjb25maWd1cmUnLCB3aGVyZSBGRUFUVVJFIGluZGljYXRlcyBhbiBvcHRpb25hbCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorVGhleSBtYXkgYWxzbyBwYXkgYXR0ZW50aW9uIHRvIGAtLXdpdGgtUEFDS0FHRScgb3B0aW9ucywgd2hlcmUgUEFDS0FHRQoraXMgc29tZXRoaW5nIGxpa2UgYGdudS1hcycgb3IgYHgnIChmb3IgdGhlIFggV2luZG93IFN5c3RlbSkuICBUaGUKK2BSRUFETUUnIHNob3VsZCBtZW50aW9uIGFueSBgLS1lbmFibGUtJyBhbmQgYC0td2l0aC0nIG9wdGlvbnMgdGhhdCB0aGUKK3BhY2thZ2UgcmVjb2duaXplcy4KKworICAgRm9yIHBhY2thZ2VzIHRoYXQgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0sIGBjb25maWd1cmUnIGNhbiB1c3VhbGx5CitmaW5kIHRoZSBYIGluY2x1ZGUgYW5kIGxpYnJhcnkgZmlsZXMgYXV0b21hdGljYWxseSwgYnV0IGlmIGl0IGRvZXNuJ3QsCit5b3UgY2FuIHVzZSB0aGUgYGNvbmZpZ3VyZScgb3B0aW9ucyBgLS14LWluY2x1ZGVzPURJUicgYW5kCitgLS14LWxpYnJhcmllcz1ESVInIHRvIHNwZWNpZnkgdGhlaXIgbG9jYXRpb25zLgorCitTcGVjaWZ5aW5nIHRoZSBTeXN0ZW0gVHlwZQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVGhlcmUgbWF5IGJlIHNvbWUgZmVhdHVyZXMgYGNvbmZpZ3VyZScgY2Fubm90IGZpZ3VyZSBvdXQKK2F1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgbWFjaGluZSB0aGUgcGFja2FnZQord2lsbCBydW4gb24uICBVc3VhbGx5LCBhc3N1bWluZyB0aGUgcGFja2FnZSBpcyBidWlsdCB0byBiZSBydW4gb24gdGhlCitfc2FtZV8gYXJjaGl0ZWN0dXJlcywgYGNvbmZpZ3VyZScgY2FuIGZpZ3VyZSB0aGF0IG91dCwgYnV0IGlmIGl0IHByaW50cworYSBtZXNzYWdlIHNheWluZyBpdCBjYW5ub3QgZ3Vlc3MgdGhlIG1hY2hpbmUgdHlwZSwgZ2l2ZSBpdCB0aGUKK2AtLWJ1aWxkPVRZUEUnIG9wdGlvbi4gIFRZUEUgY2FuIGVpdGhlciBiZSBhIHNob3J0IG5hbWUgZm9yIHRoZSBzeXN0ZW0KK3R5cGUsIHN1Y2ggYXMgYHN1bjQnLCBvciBhIGNhbm9uaWNhbCBuYW1lIHdoaWNoIGhhcyB0aGUgZm9ybToKKworICAgICBDUFUtQ09NUEFOWS1TWVNURU0KKword2hlcmUgU1lTVEVNIGNhbiBoYXZlIG9uZSBvZiB0aGVzZSBmb3JtczoKKworICAgICBPUyBLRVJORUwtT1MKKworICAgU2VlIHRoZSBmaWxlIGBjb25maWcuc3ViJyBmb3IgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBlYWNoIGZpZWxkLiAgSWYKK2Bjb25maWcuc3ViJyBpc24ndCBpbmNsdWRlZCBpbiB0aGlzIHBhY2thZ2UsIHRoZW4gdGhpcyBwYWNrYWdlIGRvZXNuJ3QKK25lZWQgdG8ga25vdyB0aGUgbWFjaGluZSB0eXBlLgorCisgICBJZiB5b3UgYXJlIF9idWlsZGluZ18gY29tcGlsZXIgdG9vbHMgZm9yIGNyb3NzLWNvbXBpbGluZywgeW91IHNob3VsZAordXNlIHRoZSBgLS10YXJnZXQ9VFlQRScgb3B0aW9uIHRvIHNlbGVjdCB0aGUgdHlwZSBvZiBzeXN0ZW0gdGhleSB3aWxsCitwcm9kdWNlIGNvZGUgZm9yLgorCisgICBJZiB5b3Ugd2FudCB0byBfdXNlXyBhIGNyb3NzIGNvbXBpbGVyLCB0aGF0IGdlbmVyYXRlcyBjb2RlIGZvciBhCitwbGF0Zm9ybSBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbGQgcGxhdGZvcm0sIHlvdSBzaG91bGQgc3BlY2lmeSB0aGUKKyJob3N0IiBwbGF0Zm9ybSAoaS5lLiwgdGhhdCBvbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHByb2dyYW1zIHdpbGwKK2V2ZW50dWFsbHkgYmUgcnVuKSB3aXRoIGAtLWhvc3Q9VFlQRScuCisKK1NoYXJpbmcgRGVmYXVsdHMKKz09PT09PT09PT09PT09PT0KKworICAgSWYgeW91IHdhbnQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBgY29uZmlndXJlJyBzY3JpcHRzIHRvIHNoYXJlLAoreW91IGNhbiBjcmVhdGUgYSBzaXRlIHNoZWxsIHNjcmlwdCBjYWxsZWQgYGNvbmZpZy5zaXRlJyB0aGF0IGdpdmVzCitkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaWFibGVzIGxpa2UgYENDJywgYGNhY2hlX2ZpbGUnLCBhbmQgYHByZWZpeCcuCitgY29uZmlndXJlJyBsb29rcyBmb3IgYFBSRUZJWC9zaGFyZS9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLCB0aGVuCitgUFJFRklYL2V0Yy9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLiAgT3IsIHlvdSBjYW4gc2V0IHRoZQorYENPTkZJR19TSVRFJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNpdGUgc2NyaXB0LgorQSB3YXJuaW5nOiBub3QgYWxsIGBjb25maWd1cmUnIHNjcmlwdHMgbG9vayBmb3IgYSBzaXRlIHNjcmlwdC4KKworRGVmaW5pbmcgVmFyaWFibGVzCis9PT09PT09PT09PT09PT09PT0KKworICAgVmFyaWFibGVzIG5vdCBkZWZpbmVkIGluIGEgc2l0ZSBzaGVsbCBzY3JpcHQgY2FuIGJlIHNldCBpbiB0aGUKK2Vudmlyb25tZW50IHBhc3NlZCB0byBgY29uZmlndXJlJy4gIEhvd2V2ZXIsIHNvbWUgcGFja2FnZXMgbWF5IHJ1bgorY29uZmlndXJlIGFnYWluIGR1cmluZyB0aGUgYnVpbGQsIGFuZCB0aGUgY3VzdG9taXplZCB2YWx1ZXMgb2YgdGhlc2UKK3ZhcmlhYmxlcyBtYXkgYmUgbG9zdC4gIEluIG9yZGVyIHRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgeW91IHNob3VsZCBzZXQKK3RoZW0gaW4gdGhlIGBjb25maWd1cmUnIGNvbW1hbmQgbGluZSwgdXNpbmcgYFZBUj12YWx1ZScuICBGb3IgZXhhbXBsZToKKworICAgICAuL2NvbmZpZ3VyZSBDQz0vdXNyL2xvY2FsMi9iaW4vZ2NjCisKK3dpbGwgY2F1c2UgdGhlIHNwZWNpZmllZCBnY2MgdG8gYmUgdXNlZCBhcyB0aGUgQyBjb21waWxlciAodW5sZXNzIGl0IGlzCitvdmVycmlkZGVuIGluIHRoZSBzaXRlIHNoZWxsIHNjcmlwdCkuCisKK2Bjb25maWd1cmUnIEludm9jYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT0KKworICAgYGNvbmZpZ3VyZScgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gY29udHJvbCBob3cgaXQKK29wZXJhdGVzLgorCitgLS1oZWxwJworYC1oJworICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgorCitgLS12ZXJzaW9uJworYC1WJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgLS1jYWNoZS1maWxlPUZJTEUnCisgICAgIEVuYWJsZSB0aGUgY2FjaGU6IHVzZSBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgaW4gRklMRSwKKyAgICAgdHJhZGl0aW9uYWxseSBgY29uZmlnLmNhY2hlJy4gIEZJTEUgZGVmYXVsdHMgdG8gYC9kZXYvbnVsbCcgdG8KKyAgICAgZGlzYWJsZSBjYWNoaW5nLgorCitgLS1jb25maWctY2FjaGUnCitgLUMnCisgICAgIEFsaWFzIGZvciBgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScuCisKK2AtLXF1aWV0JworYC0tc2lsZW50JworYC1xJworICAgICBEbyBub3QgcHJpbnQgbWVzc2FnZXMgc2F5aW5nIHdoaWNoIGNoZWNrcyBhcmUgYmVpbmcgbWFkZS4gIFRvCisgICAgIHN1cHByZXNzIGFsbCBub3JtYWwgb3V0cHV0LCByZWRpcmVjdCBpdCB0byBgL2Rldi9udWxsJyAoYW55IGVycm9yCisgICAgIG1lc3NhZ2VzIHdpbGwgc3RpbGwgYmUgc2hvd24pLgorCitgLS1zcmNkaXI9RElSJworICAgICBMb29rIGZvciB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGluIGRpcmVjdG9yeSBESVIuICBVc3VhbGx5CisgICAgIGBjb25maWd1cmUnIGNhbiBkZXRlcm1pbmUgdGhhdCBkaXJlY3RvcnkgYXV0b21hdGljYWxseS4KKworYGNvbmZpZ3VyZScgYWxzbyBhY2NlcHRzIHNvbWUgb3RoZXIsIG5vdCB3aWRlbHkgdXNlZnVsLCBvcHRpb25zLiAgUnVuCitgY29uZmlndXJlIC0taGVscCcgZm9yIG1vcmUgZGV0YWlscy4KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyODYxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMjUgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAorCitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbgorCisjIEJ1aWxkIC4gYmVmb3JlIHNyYyBzbyB0aGF0IG91ciBhbGwtbG9jYWwgYW5kIGNsZWFuLWxvY2FsIGhvb2tzIGtpY2tzIGluIGF0CisjIHRoZSByaWdodCB0aW1lLgorU1VCRElSUyA9IC4gc3JjCisKKyMgQWx3YXlzIGluY2x1ZGUgZ3Rlc3QgaW4gZGlzdHJpYnV0aW9ucy4KK0RJU1RfU1VCRElSUyA9ICQoc3ViZGlycykgc3JjCisKKyMgQnVpbGQgZ3Rlc3QgYmVmb3JlIHdlIGJ1aWxkIHByb3RvYnVmIHRlc3RzLiAgV2UgZG9uJ3QgYWRkIGd0ZXN0IHRvIFNVQkRJUlMKKyMgYmVjYXVzZSB0aGVuICJtYWtlIGNoZWNrIiB3b3VsZCBhbHNvIGJ1aWxkIGFuZCBydW4gYWxsIG9mIGd0ZXN0J3Mgb3duIHRlc3RzLAorIyB3aGljaCB0YWtlcyBhIGxvdCBvZiB0aW1lIGFuZCBpcyBnZW5lcmFsbHkgbm90IHVzZWZ1bCB0byB1cy4gIEFsc28sIHdlIGRvbid0CisjIHdhbnQgIm1ha2UgaW5zdGFsbCIgdG8gcmVjdXJzZSBpbnRvIGd0ZXN0IHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlCisjIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBndGVzdCBpZiB0aGVyZSBpcyBvbmUuCitjaGVjay1sb2NhbDoKKwlAZWNobyAiTWFraW5nIGxpYi9saWJndGVzdC5hIGxpYi9saWJndGVzdF9tYWluLmEgaW4gZ3Rlc3QiCisJQGNkIGd0ZXN0ICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGxpYi9saWJndGVzdC5sYSBsaWIvbGliZ3Rlc3RfbWFpbi5sYQorCisjIFdlIHdvdWxkIGxpa2UgdG8gY2xlYW4gZ3Rlc3Qgd2hlbiAibWFrZSBjbGVhbiIgaXMgaW52b2tlZC4gIEJ1dCB3ZSBoYXZlIHRvCisjIGJlIGNhcmVmdWwgYmVjYXVzZSBjbGVhbi1sb2NhbCBpcyBhbHNvIGludm9rZWQgZHVyaW5nICJtYWtlIGRpc3RjbGVhbiIsIGJ1dAorIyAibWFrZSBkaXN0Y2xlYW4iIGFscmVhZHkgcmVjdXJzZXMgaW50byBndGVzdCBiZWNhdXNlIGl0J3MgbGlzdGVkIGFtb25nIHRoZQorIyBESVNUX1NVQkRJUlMuICBkaXN0Y2xlYW4gd2lsbCBkZWxldGUgZ3Rlc3QvTWFrZWZpbGUsIHNvIGlmIHdlIHRoZW4gdHJ5IHRvCisjIGNkIHRvIHRoZSBkaXJlY3RvcnkgYWdhaW4gYW5kICJtYWtlIGNsZWFuIiBpdCB3aWxsIGZhaWwuICBTbywgY2hlY2sgdGhhdCB0aGUKKyMgTWFrZWZpbGUgZXhpc3RzIGJlZm9yZSByZWN1cnNpbmcuCitjbGVhbi1sb2NhbDoKKwlAaWYgdGVzdCAtZSBndGVzdC9NYWtlZmlsZTsgdGhlbiBcCisJICBlY2hvICJNYWtpbmcgY2xlYW4gaW4gZ3Rlc3QiOyBcCisJICBjZCBndGVzdCAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjbGVhbjsgXAorCWZpCisKK3BrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKK3BrZ2NvbmZpZ19EQVRBID0gcHJvdG9idWYucGMgcHJvdG9idWYtbGl0ZS5wYworCitFWFRSQV9ESVNUID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXV0b2dlbi5zaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJFQURNRS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TVEFMTC50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDT1BZSU5HLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENPTlRSSUJVVE9SUy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0hBTkdFUy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlZGl0b3JzL1JFQURNRS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVkaXRvcnMvcHJvdG8udmltICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWRpdG9ycy9wcm90b2J1Zi1tb2RlLmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL2NvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvZXh0cmFjdF9pbmNsdWRlcy5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy9saWJwcm90b2J1Zi52Y3Byb2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL2xpYnByb3RvYnVmLWxpdGUudmNwcm9qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvbGlicHJvdG9jLnZjcHJvaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy9wcm90b2J1Zi5zbG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL3Byb3RvYy52Y3Byb2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvcmVhZG1lLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy90ZXN0X3BsdWdpbi52Y3Byb2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL3Rlc3RzLnZjcHJvaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvbGl0ZS10ZXN0LnZjcHJvaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy9jb252ZXJ0MjAwOHRvMjAwNS5zaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleGFtcGxlcy9SRUFETUUudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4YW1wbGVzL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXhhbXBsZXMvYWRkcmVzc2Jvb2sucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleGFtcGxlcy9hZGRfcGVyc29uLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4YW1wbGVzL2xpc3RfcGVvcGxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXhhbXBsZXMvQWRkUGVyc29uLmphdmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleGFtcGxlcy9MaXN0UGVvcGxlLmphdmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4YW1wbGVzL2FkZF9wZXJzb24ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXhhbXBsZXMvbGlzdF9wZW9wbGUucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2UuamF2YSAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZUxpdGUuamF2YSAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RQYXJzZXIuamF2YSAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1JwY0NoYW5uZWwuamF2YSAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jsb2NraW5nU2VydmljZS5qYXZhICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQm91bmRlZEJ5dGVTdHJpbmcuamF2YSAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nLmphdmEgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW0uamF2YSAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW0uamF2YSAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9ycy5qYXZhICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlLmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YSAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkU2V0LmphdmEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5qYXZhICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludGVybmFsLmphdmEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmphdmEgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5RmllbGQuamF2YSAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3QuamF2YSAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0xpc3QuamF2YSAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlcmFsQnl0ZVN0cmluZy5qYXZhICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2UuamF2YSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGUuamF2YSAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZU9yQnVpbGRlci5qYXZhICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VPckJ1aWxkZXIuamF2YSAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyLmphdmEgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b2NvbE1lc3NhZ2VFbnVtLmphdmEgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyLmphdmEgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmcuamF2YSAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDYWxsYmFjay5qYXZhICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YSAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ29udHJvbGxlci5qYXZhICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNVdGlsLmphdmEgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VFeGNlcHRpb24uamF2YSAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZS5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXIuamF2YSAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdC5qYXZhICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5qYXZhICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldC5qYXZhICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuamF2YSAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VdGY4LmphdmEgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQuamF2YSAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlVGVzdC5qYXZhICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Cb3VuZGVkQnl0ZVN0cmluZ1Rlc3QuamF2YSAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmdUZXN0LmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbVRlc3QuamF2YSAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbVRlc3QuamF2YSAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0RlcHJlY2F0ZWRGaWVsZFRlc3QuamF2YSAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnNUZXN0LmphdmEgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YSAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZvcmNlRmllbGRCdWlsZGVyc1ByZVJ1bi5qYXZhICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZVRlc3QuamF2YSAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Jc1ZhbGlkVXRmOFRlc3QuamF2YSAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0lzVmFsaWRVdGY4VGVzdFV0aWwuamF2YSAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0FycmF5TGlzdFRlc3QuamF2YSAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nRW5kVG9FbmRUZXN0LmphdmEgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVyYWxCeXRlU3RyaW5nVGVzdC5qYXZhICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZVRlc3QuamF2YSAgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlVGVzdC5qYXZhICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL05lc3RlZEJ1aWxkZXJzVGVzdC5qYXZhICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyVGVzdC5qYXZhICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9SZXBlYXRlZEZpZWxkQnVpbGRlclRlc3QuamF2YSAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nU3Vic3RyaW5nVGVzdC5qYXZhICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdUZXN0LmphdmEgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlVGVzdC5qYXZhICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlclRlc3QuamF2YSAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXBUZXN0LmphdmEgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YSAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Rlc3RVdGlsLmphdmEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFRlc3QuamF2YSAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRUZXN0LmphdmEgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0VGVzdC5qYXZhIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdFRlc3QuamF2YSAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9idWlsZGVyc190ZXN0LnByb3RvICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8gICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8gICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byAgICAgICAgICBcCisgIGphdmEvcG9tLnhtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9SRUFETUUudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2dlbmVyYXRvcl90ZXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdGVzdC5weSAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QucHkgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Rlc3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW51bV90eXBlX3dyYXBwZXIucHkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QxLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9jcHBfdGVzdC5weSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2ZhY3RvcnlfdGVzdC5weSAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfbGlzdGVuZXIucHkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV90ZXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX2V4dGVuc2lvbnMucHJvdG8gICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9uc19keW5hbWljLnByb3RvICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90byAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fbWVzc2FnZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NwcF9tZXNzYWdlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9yZWZsZWN0aW9uX3Rlc3QucHkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fY3BwX2dlbmVyYXRlZF90ZXN0LnB5ICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvc2VydmljZV9yZWZsZWN0aW9uX3Rlc3QucHkgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9mb3JtYXRfdGVzdC5weSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90eXBlX2NoZWNrZXJzLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Vua25vd25fZmllbGRzX3Rlc3QucHkgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdF90ZXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLXByb3RvMi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9kZXNjcmlwdG9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcHJvdG9idWYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3Bvb2wucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9mYWN0b3J5LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvX19pbml0X18ucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2V6X3NldHVwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vc2V0dXAucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9tb3gucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL3N0dWJvdXQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vUkVBRE1FLnR4dAorCisjIERlbGV0ZXMgYWxsIHRoZSBmaWxlcyBnZW5lcmF0ZWQgYnkgYXV0b2dlbi5zaC4KK01BSU5UQUlORVJDTEVBTkZJTEVTID0gICBcCisgIGFjbG9jYWwubTQgICAgICAgICAgICAgXAorICBjb25maWcuZ3Vlc3MgICAgICAgICAgIFwKKyAgY29uZmlnLnN1YiAgICAgICAgICAgICBcCisgIGNvbmZpZ3VyZSAgICAgICAgICAgICAgXAorICBkZXBjb21wICAgICAgICAgICAgICAgIFwKKyAgaW5zdGFsbC1zaCAgICAgICAgICAgICBcCisgIGx0bWFpbi5zaCAgICAgICAgICAgICAgXAorICBNYWtlZmlsZS5pbiAgICAgICAgICAgIFwKKyAgbWlzc2luZyAgICAgICAgICAgICAgICBcCisgIG1raW5zdGFsbGRpcnMgICAgICAgICAgXAorICBjb25maWcuaC5pbiAgICAgICAgICAgIFwKKyAgc3RhbXAuaC5pbiAgICAgICAgICAgICBcCisgIG00L2x0c3VnYXIubTQgICAgICAgICAgXAorICBtNC9saWJ0b29sLm00ICAgICAgICAgIFwKKyAgbTQvbHR2ZXJzaW9uLm00ICAgICAgICBcCisgIG00L2x0fm9ic29sZXRlLm00ICAgICAgXAorICBtNC9sdG9wdGlvbnMubTQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvTWFrZWZpbGUuaW4gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYWU4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTA0MSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4zIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACitzdWJkaXIgPSAuCitESVNUX0NPTU1PTiA9ICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlnLmguaW4gXAorCSQoc3JjZGlyKS9wcm90b2J1Zi1saXRlLnBjLmluICQoc3JjZGlyKS9wcm90b2J1Zi5wYy5pbiBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgZGVwY29tcCBcCisJaW5zdGFsbC1zaCBsdG1haW4uc2ggbWlzc2luZworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvYWNfc3lzdGVtX2V4dGVuc2lvbnMubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYWN4X2NoZWNrX3N1bmNjLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2FjeF9wdGhyZWFkLm00ICQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCAkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L3N0bF9oYXNoLm00ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK2FtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTID0gY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBcCisgY29uZmlndXJlLmxpbmVubyBjb25maWcuc3RhdHVzLmxpbmVubworbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSBjb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0gcHJvdG9idWYucGMgcHJvdG9idWYtbGl0ZS5wYworQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCisJaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKKwlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAorICB0ZXN0IC16ICIkJGZpbGVzIiBcCisgICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCisgICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAorICB9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIKK0RBVEEgPSAkKHBrZ2NvbmZpZ19EQVRBKQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCisJJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKKwlkaXN0ZGlyIGRpc3QgZGlzdC1hbGwgZGlzdGNoZWNrCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQordG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCithbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCisgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikiOyB0aGVuIFwKKyAgICBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKKyAgICAgICYmIHJtIC1yZiAiJChkaXN0ZGlyKSIgXAorICAgICAgfHwgeyBzbGVlcCA1ICYmIHJtIC1yZiAiJChkaXN0ZGlyKSI7IH07IFwKKyAgZWxzZSA6OyBmaQorYW1fX3JlbGF0aXZpemUgPSBcCisgIGRpcjA9YHB3ZGA7IFwKKyAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCisgIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCisgIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCisgIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAorICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCisgICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAorICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKKyAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCisgICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAorICAgICAgZWxzZSBcCisgICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAorICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCisgICAgICAgIGZpOyBcCisgICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCisgICAgICBmaTsgXAorICAgIGZpOyBcCisgICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgIGRvbmU7IFwKKyAgcmVsZGlyPSIkJGRpcjIiCitESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKK0daSVBfRU5WID0gLS1iZXN0CitkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CithbV9fZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9ICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgXAorICB8IHNlZCAnc3xeXC4vfCQocHJlZml4KS98JyB8IGdyZXAgLXYgJyQoaW5mb2RpcikvZGlyJCQnCitkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0lTQUlORk8gPSBASVNBSU5GT0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BPV19MSUIgPSBAUE9XX0xJQkAKK1BST1RPQlVGX09QVF9GTEFHID0gQFBST1RPQlVGX09QVF9GTEFHQAorUFJPVE9DID0gQFBST1RPQ0AKK1BUSFJFQURfQ0MgPSBAUFRIUkVBRF9DQ0AKK1BUSFJFQURfQ0ZMQUdTID0gQFBUSFJFQURfQ0ZMQUdTQAorUFRIUkVBRF9MSUJTID0gQFBUSFJFQURfTElCU0AKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQVIgPSBAYWNfY3RfQVJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithY3hfcHRocmVhZF9jb25maWcgPSBAYWN4X3B0aHJlYWRfY29uZmlnQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3ViZGlycyA9IEBzdWJkaXJzQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0ID0gQHRhcmdldEAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0YXJnZXRfY3B1ID0gQHRhcmdldF9jcHVACit0YXJnZXRfb3MgPSBAdGFyZ2V0X29zQAordGFyZ2V0X3ZlbmRvciA9IEB0YXJnZXRfdmVuZG9yQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbgorCisjIEJ1aWxkIC4gYmVmb3JlIHNyYyBzbyB0aGF0IG91ciBhbGwtbG9jYWwgYW5kIGNsZWFuLWxvY2FsIGhvb2tzIGtpY2tzIGluIGF0CisjIHRoZSByaWdodCB0aW1lLgorU1VCRElSUyA9IC4gc3JjCisKKyMgQWx3YXlzIGluY2x1ZGUgZ3Rlc3QgaW4gZGlzdHJpYnV0aW9ucy4KK0RJU1RfU1VCRElSUyA9ICQoc3ViZGlycykgc3JjCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IHByb3RvYnVmLnBjIHByb3RvYnVmLWxpdGUucGMKK0VYVFJBX0RJU1QgPSBcCisgIGF1dG9nZW4uc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2VuZXJhdGVfZGVzY3JpcHRvcl9wcm90by5zaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSRUFETUUudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOU1RBTEwudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ09QWUlORy50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDT05UUklCVVRPUlMudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENIQU5HRVMudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWRpdG9ycy9SRUFETUUudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlZGl0b3JzL3Byb3RvLnZpbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVkaXRvcnMvcHJvdG9idWYtbW9kZS5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy9jb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL2V4dHJhY3RfaW5jbHVkZXMuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvbGlicHJvdG9idWYudmNwcm9qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy9saWJwcm90b2J1Zi1saXRlLnZjcHJvaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL2xpYnByb3RvYy52Y3Byb2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvcHJvdG9idWYuc2xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy9wcm90b2MudmNwcm9qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL3JlYWRtZS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvdGVzdF9wbHVnaW4udmNwcm9qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnNwcm9qZWN0cy90ZXN0cy52Y3Byb2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Byb2plY3RzL2xpdGUtdGVzdC52Y3Byb2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzcHJvamVjdHMvY29udmVydDIwMDh0bzIwMDUuc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXhhbXBsZXMvUkVBRE1FLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleGFtcGxlcy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4YW1wbGVzL2FkZHJlc3Nib29rLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXhhbXBsZXMvYWRkX3BlcnNvbi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleGFtcGxlcy9saXN0X3Blb3BsZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4YW1wbGVzL0FkZFBlcnNvbi5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXhhbXBsZXMvTGlzdFBlb3BsZS5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleGFtcGxlcy9hZGRfcGVyc29uLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4YW1wbGVzL2xpc3RfcGVvcGxlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlLmphdmEgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0UGFyc2VyLmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdScGNDaGFubmVsLmphdmEgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1NlcnZpY2UuamF2YSAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0JvdW5kZWRCeXRlU3RyaW5nLmphdmEgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQnl0ZVN0cmluZy5qYXZhICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmphdmEgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtLmphdmEgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YSAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZS5qYXZhICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvblJlZ2lzdHJ5LmphdmEgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmphdmEgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GaWVsZFNldC5qYXZhICAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2UuamF2YSAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZUxpdGUuamF2YSAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnRlcm5hbC5qYXZhICAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5qYXZhIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eUZpZWxkLmphdmEgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmEgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdMaXN0LmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZXJhbEJ5dGVTdHJpbmcuamF2YSAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlLmphdmEgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlLmphdmEgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGVPckJ1aWxkZXIuamF2YSAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlT3JCdWlsZGVyLmphdmEgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1BhcnNlci5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUHJvdG9jb2xNZXNzYWdlRW51bS5qYXZhICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9SZXBlYXRlZEZpZWxkQnVpbGRlci5qYXZhICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nLmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ2FsbGJhY2suamF2YSAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDaGFubmVsLmphdmEgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NvbnRyb2xsZXIuamF2YSAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjVXRpbC5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2UuamF2YSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyLmphdmEgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TbWFsbFNvcnRlZE1hcC5qYXZhICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXQuamF2YSAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uamF2YSAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXQuamF2YSAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmEgICAgIFwKKyAgamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVXRmOC5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9XaXJlRm9ybWF0LmphdmEgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZVRlc3QuamF2YSAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQm91bmRlZEJ5dGVTdHJpbmdUZXN0LmphdmEgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nVGVzdC5qYXZhICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW1UZXN0LmphdmEgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXByZWNhdGVkRmllbGRUZXN0LmphdmEgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3JzVGVzdC5qYXZhICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRHluYW1pY01lc3NhZ2VUZXN0LmphdmEgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Gb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4uamF2YSAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VUZXN0LmphdmEgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSXNWYWxpZFV0ZjhUZXN0LmphdmEgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Jc1ZhbGlkVXRmOFRlc3RVdGlsLmphdmEgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3RUZXN0LmphdmEgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0VuZFRvRW5kVGVzdC5qYXZhICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlcmFsQnl0ZVN0cmluZ1Rlc3QuamF2YSAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVUZXN0LmphdmEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVRlc3QuamF2YSAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OZXN0ZWRCdWlsZGVyc1Rlc3QuamF2YSAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1BhcnNlclRlc3QuamF2YSAgICAgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Sb3BlQnl0ZVN0cmluZ1N1YnN0cmluZ1Rlc3QuamF2YSAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nVGVzdC5qYXZhICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZVRlc3QuamF2YSAgICAgICAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXJUZXN0LmphdmEgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwVGVzdC5qYXZhICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGVzdEJhZElkZW50aWZpZXJzLmphdmEgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbC5qYXZhICAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXRUZXN0LmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0VGVzdC5qYXZhICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdFRlc3QuamF2YSBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXRUZXN0LmphdmEgICAgICAgICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbXVsdGlwbGVfZmlsZXNfdGVzdC5wcm90byAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfYnVpbGRlcnNfdGVzdC5wcm90byAgICAgICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbi5wcm90byAgICAgICAgICAgICAgXAorICBqYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvICAgICBcCisgIGphdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvICAgICAgICAgIFwKKyAgamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8gICAgICAgICAgXAorICBqYXZhL3BvbS54bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGphdmEvUkVBRE1FLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVjb2Rlci5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX2RhdGFiYXNlX3Rlc3QucHkgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0LnB5ICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl90ZXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5ICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90byAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfY3BwX3Rlc3QucHkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9mYWN0b3J5X3Rlc3QucHkgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2xpc3RlbmVyLnB5ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX2V4dGVuc2lvbnNfZHluYW1pYy5wcm90byAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jcHBfbWVzc2FnZS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5weSAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9yZWZsZWN0aW9uX2NwcF9nZW5lcmF0ZWRfdGVzdC5weSAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3NlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LnB5ICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8gICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X3V0aWwucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZm9ybWF0X3Rlc3QucHkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC91bmtub3duX2ZpZWxkc190ZXN0LnB5ICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbi1wcm90bzIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wb29sLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfZmFjdG9yeS5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2VfcmVmbGVjdGlvbi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vZ29vZ2xlL19faW5pdF9fLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9lel9zZXR1cC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL3NldHVwLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBweXRob24vbW94LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB5dGhvbi9zdHVib3V0LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHl0aG9uL1JFQURNRS50eHQKKworCisjIERlbGV0ZXMgYWxsIHRoZSBmaWxlcyBnZW5lcmF0ZWQgYnkgYXV0b2dlbi5zaC4KK01BSU5UQUlORVJDTEVBTkZJTEVTID0gXAorICBhY2xvY2FsLm00ICAgICAgICAgICAgIFwKKyAgY29uZmlnLmd1ZXNzICAgICAgICAgICBcCisgIGNvbmZpZy5zdWIgICAgICAgICAgICAgXAorICBjb25maWd1cmUgICAgICAgICAgICAgIFwKKyAgZGVwY29tcCAgICAgICAgICAgICAgICBcCisgIGluc3RhbGwtc2ggICAgICAgICAgICAgXAorICBsdG1haW4uc2ggICAgICAgICAgICAgIFwKKyAgTWFrZWZpbGUuaW4gICAgICAgICAgICBcCisgIG1pc3NpbmcgICAgICAgICAgICAgICAgXAorICBta2luc3RhbGxkaXJzICAgICAgICAgIFwKKyAgY29uZmlnLmguaW4gICAgICAgICAgICBcCisgIHN0YW1wLmguaW4gICAgICAgICAgICAgXAorICBtNC9sdHN1Z2FyLm00ICAgICAgICAgIFwKKyAgbTQvbGlidG9vbC5tNCAgICAgICAgICBcCisgIG00L2x0dmVyc2lvbi5tNCAgICAgICAgXAorICBtNC9sdH5vYnNvbGV0ZS5tNCAgICAgIFwKKyAgbTQvbHRvcHRpb25zLm00CisKK2FsbDogY29uZmlnLmgKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKK2FtLS1yZWZyZXNoOiBNYWtlZmlsZQorCUA6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBlY2hvICcgY2QgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbic7IFwKKwkgICAgICAkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduIE1ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiBNYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCisJICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCSQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCSQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK2NvbmZpZy5oOiBzdGFtcC1oMQorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gcm0gLWYgc3RhbXAtaDE7IGVsc2UgOjsgZmkKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHN0YW1wLWgxOyBlbHNlIDo7IGZpCisKK3N0YW1wLWgxOiAkKHNyY2RpcikvY29uZmlnLmguaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAcm0gLWYgc3RhbXAtaDEKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCiskKHNyY2RpcikvY29uZmlnLmguaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpIAorCSgkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpKQorCXJtIC1mIHN0YW1wLWgxCisJdG91Y2ggJEAKKworZGlzdGNsZWFuLWhkcjoKKwktcm0gLWYgY29uZmlnLmggc3RhbXAtaDEKK3Byb3RvYnVmLnBjOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvcHJvdG9idWYucGMuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACitwcm90b2J1Zi1saXRlLnBjOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvcHJvdG9idWYtbGl0ZS5wYy5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wgY29uZmlnLmx0CitpbnN0YWxsLXBrZ2NvbmZpZ0RBVEE6ICQocGtnY29uZmlnX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChwa2djb25maWdkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIgorCUBsaXN0PSckKHBrZ2NvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQocGtnY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChwa2djb25maWdkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChwa2djb25maWdfREFUQSknOyB0ZXN0IC1uICIkKHBrZ2NvbmZpZ2RpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwlkaXI9JyQoREVTVERJUikkKHBrZ2NvbmZpZ2RpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCiskKFJFQ1VSU0lWRV9UQVJHRVRTKToKKwlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCitjdGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PS47IFwKKwllbHNlIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PTsgXAorCWZpOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCisJICAgICAgc2V0ICIkJEAiICIkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCXRlc3QgLWQgIiQoZGlzdGRpcikiIHx8IG1rZGlyICIkKGRpc3RkaXIpIgorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKKwkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAorCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKKwkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJCWFtX19za2lwX21vZGVfZml4PTogXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJLXRlc3QgLW4gIiQoYW1fX3NraXBfbW9kZV9maXgpIiBcCisJfHwgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC03NTUgXAorCQktZXhlYyBjaG1vZCB1K3J3eCxnbytyeCB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKKwl8fCBjaG1vZCAtUiBhK3IgIiQoZGlzdGRpcikiCitkaXN0LWd6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWJ6aXAyOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEJaSVAyPSQke0JaSVAyLS05fSBiemlwMiAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtbHppcDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBsemlwIC1jICQke0xaSVBfT1BULS05fSA+JChkaXN0ZGlyKS50YXIubHoKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC1sem1hOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGx6bWEgLTkgLWMgPiQoZGlzdGRpcikudGFyLmx6bWEKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC14ejogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBYWl9PUFQ9JCR7WFpfT1BULS1lfSB4eiAtYyA+JChkaXN0ZGlyKS50YXIueHoKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC10YXJaOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3Qtc2hhcjogZGlzdGRpcgorCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtemlwOiBkaXN0ZGlyCisJLXJtIC1mICQoZGlzdGRpcikuemlwCisJemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QgZGlzdC1hbGw6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCisJKi50YXIuZ3oqKSBcCisJICBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWRjICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLmJ6MiopIFwKKwkgIGJ6aXAyIC1kYyAkKGRpc3RkaXIpLnRhci5iejIgfCAkKGFtX191bnRhcikgOztcCisJKi50YXIubHptYSopIFwKKwkgIGx6bWEgLWRjICQoZGlzdGRpcikudGFyLmx6bWEgfCAkKGFtX191bnRhcikgOztcCisJKi50YXIubHoqKSBcCisJICBsemlwIC1kYyAkKGRpc3RkaXIpLnRhci5seiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci54eiopIFwKKwkgIHh6IC1kYyAkKGRpc3RkaXIpLnRhci54eiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5aKikgXAorCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAorCSouc2hhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAorCSouemlwKikgXAorCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCisJZXNhYworCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQorCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS9faW5zdAorCWNobW9kIGEtdyAkKGRpc3RkaXIpCisJdGVzdCAtZCAkKGRpc3RkaXIpL19idWlsZCB8fCBleGl0IDA7IFwKKwlkY19pbnN0YWxsX2Jhc2U9YCQoYW1fX2NkKSAkKGRpc3RkaXIpL19pbnN0ICYmIHB3ZCB8IHNlZCAtZSAncyxeW146XFwvXTpbXFwvXSwvLCdgIFwKKwkgICYmIGRjX2Rlc3RkaXI9IiQke1RNUERJUi0vdG1wfS9hbS1kYy0kJCQkLyIgXAorCSAgJiYgYW1fX2N3ZD1gcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJChkaXN0ZGlyKS9fYnVpbGQgXAorCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgICAkKEFNX0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKKwkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAorCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgJiYgKHsgXAorCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCisJICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKKwkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKKwkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKKwkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrIFwKKwkgICYmIGNkICIkJGFtX19jd2QiIFwKKwkgIHx8IGV4aXQgMQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCUAoZWNobyAiJChkaXN0ZGlyKSBhcmNoaXZlcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uOiAiOyBcCisJICBsaXN0PSckKERJU1RfQVJDSElWRVMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSkgfCBcCisJICBzZWQgLWUgMWggLWUgMXMvLi89L2cgLWUgMXAgLWUgMXggLWUgJyQkcCcgLWUgJyQkeCcKK2Rpc3R1bmluc3RhbGxjaGVjazoKKwlAdGVzdCAtbiAnJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgfHwgeyBcCisJICBlY2hvICdFUlJPUjogdHJ5aW5nIHRvIHJ1biAkQCB3aXRoIGFuIGVtcHR5JyBcCisJICAgICAgICckJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgPiYyOyBcCisJICBleGl0IDE7IFwKKwl9OyBcCisJJChhbV9fY2QpICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyB8fCB7IFwKKwkgIGVjaG8gJ0VSUk9SOiBjYW5ub3QgY2hkaXIgaW50byAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyA+JjI7IFwKKwkgIGV4aXQgMTsgXAorCX07IFwKKwl0ZXN0IGAkKGFtX19kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCisJICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKKwkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKKwkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKKwkgICAgICAgIGZpIDsgXAorCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgIGV4aXQgMTsgfSA+JjIKK2Rpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KKwlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKKwkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKKwkgIGV4aXQgMSA7IFwKKwlmaQorCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAorCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCisJICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgZXhpdCAxOyB9ID4mMgorY2hlY2stYW06IGFsbC1hbQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLWxvY2FsCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlICQoREFUQSkgY29uZmlnLmgKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgICBpbnN0YWxsOyBcCisJZWxzZSBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKKwlmaQorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1sb2NhbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktcmVjdXJzaXZlCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1yZWN1cnNpdmUKKworaHRtbC1hbToKKworaW5mbzogaW5mby1yZWN1cnNpdmUKKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQorCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtcmVjdXJzaXZlCisKK3BkZi1hbToKKworcHM6IHBzLXJlY3Vyc2l2ZQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtcGtnY29uZmlnREFUQQorCisuTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgYWxsIGNoZWNrLWFtIFwKKwljdGFncy1yZWN1cnNpdmUgaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwIHRhZ3MtcmVjdXJzaXZlCisKKy5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAorCWFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2hlY2stbG9jYWwgY2xlYW4gXAorCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1sb2NhbCBjdGFncyBjdGFncy1yZWN1cnNpdmUgXAorCWRpc3QgZGlzdC1hbGwgZGlzdC1iemlwMiBkaXN0LWd6aXAgZGlzdC1semlwIGRpc3QtbHptYSBcCisJZGlzdC1zaGFyIGRpc3QtdGFyWiBkaXN0LXh6IGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcGtnY29uZmlnREFUQSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIFwKKwlwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAorCXVuaW5zdGFsbC1wa2djb25maWdEQVRBCisKKworIyBCdWlsZCBndGVzdCBiZWZvcmUgd2UgYnVpbGQgcHJvdG9idWYgdGVzdHMuICBXZSBkb24ndCBhZGQgZ3Rlc3QgdG8gU1VCRElSUworIyBiZWNhdXNlIHRoZW4gIm1ha2UgY2hlY2siIHdvdWxkIGFsc28gYnVpbGQgYW5kIHJ1biBhbGwgb2YgZ3Rlc3QncyBvd24gdGVzdHMsCisjIHdoaWNoIHRha2VzIGEgbG90IG9mIHRpbWUgYW5kIGlzIGdlbmVyYWxseSBub3QgdXNlZnVsIHRvIHVzLiAgQWxzbywgd2UgZG9uJ3QKKyMgd2FudCAibWFrZSBpbnN0YWxsIiB0byByZWN1cnNlIGludG8gZ3Rlc3Qgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUKKyMgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGd0ZXN0IGlmIHRoZXJlIGlzIG9uZS4KK2NoZWNrLWxvY2FsOgorCUBlY2hvICJNYWtpbmcgbGliL2xpYmd0ZXN0LmEgbGliL2xpYmd0ZXN0X21haW4uYSBpbiBndGVzdCIKKwlAY2QgZ3Rlc3QgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgbGliL2xpYmd0ZXN0LmxhIGxpYi9saWJndGVzdF9tYWluLmxhCisKKyMgV2Ugd291bGQgbGlrZSB0byBjbGVhbiBndGVzdCB3aGVuICJtYWtlIGNsZWFuIiBpcyBpbnZva2VkLiAgQnV0IHdlIGhhdmUgdG8KKyMgYmUgY2FyZWZ1bCBiZWNhdXNlIGNsZWFuLWxvY2FsIGlzIGFsc28gaW52b2tlZCBkdXJpbmcgIm1ha2UgZGlzdGNsZWFuIiwgYnV0CisjICJtYWtlIGRpc3RjbGVhbiIgYWxyZWFkeSByZWN1cnNlcyBpbnRvIGd0ZXN0IGJlY2F1c2UgaXQncyBsaXN0ZWQgYW1vbmcgdGhlCisjIERJU1RfU1VCRElSUy4gIGRpc3RjbGVhbiB3aWxsIGRlbGV0ZSBndGVzdC9NYWtlZmlsZSwgc28gaWYgd2UgdGhlbiB0cnkgdG8KKyMgY2QgdG8gdGhlIGRpcmVjdG9yeSBhZ2FpbiBhbmQgIm1ha2UgY2xlYW4iIGl0IHdpbGwgZmFpbC4gIFNvLCBjaGVjayB0aGF0IHRoZQorIyBNYWtlZmlsZSBleGlzdHMgYmVmb3JlIHJlY3Vyc2luZy4KK2NsZWFuLWxvY2FsOgorCUBpZiB0ZXN0IC1lIGd0ZXN0L01ha2VmaWxlOyB0aGVuIFwKKwkgIGVjaG8gIk1ha2luZyBjbGVhbiBpbiBndGVzdCI7IFwKKwkgIGNkIGd0ZXN0ICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNsZWFuOyBcCisJZmkKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9SRUFETUUudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTUxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNTIgQEAKK1Byb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvCisKK0MrKyBJbnN0YWxsYXRpb24gLSBVbml4Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitUbyBidWlsZCBhbmQgaW5zdGFsbCB0aGUgQysrIFByb3RvY29sIEJ1ZmZlciBydW50aW1lIGFuZCB0aGUgUHJvdG9jb2wKK0J1ZmZlciBjb21waWxlciAocHJvdG9jKSBleGVjdXRlIHRoZSBmb2xsb3dpbmc6CisKKyAgJCAuL2NvbmZpZ3VyZQorICAkIG1ha2UKKyAgJCBtYWtlIGNoZWNrCisgICQgbWFrZSBpbnN0YWxsCisKK0lmICJtYWtlIGNoZWNrIiBmYWlscywgeW91IGNhbiBzdGlsbCBpbnN0YWxsLCBidXQgaXQgaXMgbGlrZWx5IHRoYXQKK3NvbWUgZmVhdHVyZXMgb2YgdGhpcyBsaWJyYXJ5IHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IG9uIHlvdXIgc3lzdGVtLgorUHJvY2VlZCBhdCB5b3VyIG93biByaXNrLgorCisibWFrZSBpbnN0YWxsIiBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4KKworRm9yIGFkdmFuY2VkIHVzYWdlIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyZSBhbmQgbWFrZSwgc2VlIElOU1RBTEwudHh0LgorCisqKiBIaW50IG9uIGluc3RhbGwgbG9jYXRpb24gKioKKworICBCeSBkZWZhdWx0LCB0aGUgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCB0byAvdXNyL2xvY2FsLiAgSG93ZXZlciwKKyAgb24gbWFueSBwbGF0Zm9ybXMsIC91c3IvbG9jYWwvbGliIGlzIG5vdCBwYXJ0IG9mIExEX0xJQlJBUllfUEFUSC4KKyAgWW91IGNhbiBhZGQgaXQsIGJ1dCBpdCBtYXkgYmUgZWFzaWVyIHRvIGp1c3QgaW5zdGFsbCB0byAvdXNyCisgIGluc3RlYWQuICBUbyBkbyB0aGlzLCBpbnZva2UgY29uZmlndXJlIGFzIGZvbGxvd3M6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisKKyAgSWYgeW91IGFscmVhZHkgYnVpbHQgdGhlIHBhY2thZ2Ugd2l0aCBhIGRpZmZlcmVudCBwcmVmaXgsIG1ha2Ugc3VyZQorICB0byBydW4gIm1ha2UgY2xlYW4iIGJlZm9yZSBidWlsZGluZyBhZ2Fpbi4KKworKiogQ29tcGlsaW5nIGRlcGVuZGVudCBwYWNrYWdlcyAqKgorCisgIFRvIGNvbXBpbGUgYSBwYWNrYWdlIHRoYXQgdXNlcyBQcm90b2NvbCBCdWZmZXJzLCB5b3UgbmVlZCB0byBwYXNzCisgIHZhcmlvdXMgZmxhZ3MgdG8geW91ciBjb21waWxlciBhbmQgbGlua2VyLiAgQXMgb2YgdmVyc2lvbiAyLjIuMCwKKyAgUHJvdG9jb2wgQnVmZmVycyBpbnRlZ3JhdGVzIHdpdGggcGtnLWNvbmZpZyB0byBtYW5hZ2UgdGhpcy4gIElmIHlvdQorICBoYXZlIHBrZy1jb25maWcgaW5zdGFsbGVkLCB0aGVuIHlvdSBjYW4gaW52b2tlIGl0IHRvIGdldCBhIGxpc3Qgb2YKKyAgZmxhZ3MgbGlrZSBzbzoKKworICAgIHBrZy1jb25maWcgLS1jZmxhZ3MgcHJvdG9idWYgICAgICAgICAjIHByaW50IGNvbXBpbGVyIGZsYWdzCisgICAgcGtnLWNvbmZpZyAtLWxpYnMgcHJvdG9idWYgICAgICAgICAgICMgcHJpbnQgbGlua2VyIGZsYWdzCisgICAgcGtnLWNvbmZpZyAtLWNmbGFncyAtLWxpYnMgcHJvdG9idWYgICMgcHJpbnQgYm90aAorCisgIEZvciBleGFtcGxlOgorCisgICAgYysrIG15X3Byb2dyYW0uY2MgbXlfcHJvdG8ucGIuY2MgYHBrZy1jb25maWcgLS1jZmxhZ3MgLS1saWJzIHByb3RvYnVmYAorCisgIE5vdGUgdGhhdCBwYWNrYWdlcyB3cml0dGVuIHByaW9yIHRvIHRoZSAyLjIuMCByZWxlYXNlIG9mIFByb3RvY29sCisgIEJ1ZmZlcnMgbWF5IG5vdCB5ZXQgaW50ZWdyYXRlIHdpdGggcGtnLWNvbmZpZyB0byBnZXQgZmxhZ3MsIGFuZCBtYXkKKyAgbm90IHBhc3MgdGhlIGNvcnJlY3Qgc2V0IG9mIGZsYWdzIHRvIGNvcnJlY3RseSBsaW5rIGFnYWluc3QKKyAgbGlicHJvdG9idWYuICBJZiB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbiB1c2VzIGF1dG9jb25mLCB5b3UgY2FuCisgIG9mdGVuIGZpeCB0aGUgcHJvYmxlbSBieSBpbnZva2luZyBpdHMgY29uZmlndXJlIHNjcmlwdCBsaWtlOgorCisgICAgY29uZmlndXJlIENYWEZMQUdTPSIkKHBrZy1jb25maWcgLS1jZmxhZ3MgcHJvdG9idWYpIiBcCisgICAgICAgICAgICAgIExJQlM9IiQocGtnLWNvbmZpZyAtLWxpYnMgcHJvdG9idWYpIgorCisgIFRoaXMgd2lsbCBmb3JjZSBpdCB0byB1c2UgdGhlIGNvcnJlY3QgZmxhZ3MuCisKKyAgSWYgeW91IGFyZSB3cml0aW5nIGFuIGF1dG9jb25mLWJhc2VkIHBhY2thZ2UgdGhhdCB1c2VzIFByb3RvY29sCisgIEJ1ZmZlcnMsIHlvdSBzaG91bGQgcHJvYmFibHkgdXNlIHRoZSBQS0dfQ0hFQ0tfTU9EVUxFUyBtYWNybyBpbiB5b3VyCisgIGNvbmZpZ3VyZSBzY3JpcHQgbGlrZToKKworICAgIFBLR19DSEVDS19NT0RVTEVTKFtwcm90b2J1Zl0sIFtwcm90b2J1Zl0pCisKKyAgU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGluZm8uCisKKyAgSWYgeW91IG9ubHkgd2FudCBwcm90b2J1Zi1saXRlLCBzdWJzdGl0dXRlICJwcm90b2J1Zi1saXRlIiBpbiBwbGFjZQorICBvZiAicHJvdG9idWYiIGluIHRoZXNlIGV4YW1wbGVzLgorCisqKiBOb3RlIGZvciBjcm9zcy1jb21waWxpbmcgKioKKworICBUaGUgbWFrZWZpbGVzIG5vcm1hbGx5IGludm9rZSB0aGUgcHJvdG9jIGV4ZWN1dGFibGUgdGhhdCB0aGV5IGp1c3QKKyAgYnVpbHQgaW4gb3JkZXIgdG8gYnVpbGQgdGVzdHMuICBXaGVuIGNyb3NzLWNvbXBpbGluZywgdGhlIHByb3RvYworICBleGVjdXRhYmxlIG1heSBub3QgYmUgZXhlY3V0YWJsZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgSW4gdGhpcyBjYXNlLAorICB5b3UgbXVzdCBidWlsZCBhIGNvcHkgb2YgcHJvdG9jIGZvciB0aGUgaG9zdCBtYWNoaW5lIGZpcnN0LCB0aGVuIHVzZQorICB0aGUgLS13aXRoLXByb3RvYyBvcHRpb24gdG8gdGVsbCBjb25maWd1cmUgdG8gdXNlIGl0IGluc3RlYWQuICBGb3IKKyAgZXhhbXBsZToKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1wcm90b2M9cHJvdG9jCisKKyAgVGhpcyB3aWxsIHVzZSB0aGUgaW5zdGFsbGVkIHByb3RvYyAoZm91bmQgaW4geW91ciAkUEFUSCkgaW5zdGVhZCBvZgorICB0cnlpbmcgdG8gZXhlY3V0ZSB0aGUgb25lIGJ1aWx0IGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gIFlvdSBjYW4KKyAgYWxzbyB1c2UgYW4gZXhlY3V0YWJsZSB0aGF0IGhhc24ndCBiZWVuIGluc3RhbGxlZC4gIEZvciBleGFtcGxlLCBpZgorICB5b3UgYnVpbHQgdGhlIHByb3RvYnVmIHBhY2thZ2UgZm9yIHlvdXIgaG9zdCBtYWNoaW5lIGluIC4uL2hvc3QsCisgIHlvdSBtaWdodCBkbzoKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1wcm90b2M9Li4vaG9zdC9zcmMvcHJvdG9jCisKKyAgRWl0aGVyIHdheSwgeW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIHByb3RvYyBleGVjdXRhYmxlIHlvdSB1c2UKKyAgaGFzIHRoZSBzYW1lIHZlcnNpb24gYXMgdGhlIHByb3RvYnVmIHNvdXJjZSBjb2RlIHlvdSBhcmUgdHJ5aW5nIHRvCisgIHVzZSBpdCB3aXRoLgorCisqKiBOb3RlIGZvciBTb2xhcmlzIHVzZXJzICoqCisKKyAgU29sYXJpcyAxMCB4ODYgaGFzIGEgYnVnIHRoYXQgd2lsbCBtYWtlIGxpbmtpbmcgZmFpbCwgY29tcGxhaW5pbmcKKyAgYWJvdXQgbGlic3RkYysrLmxhIGJlaW5nIGludmFsaWQuICBXZSBoYXZlIGluY2x1ZGVkIGEgd29yay1hcm91bmQKKyAgaW4gdGhpcyBwYWNrYWdlLiAgVG8gdXNlIHRoZSB3b3JrLWFyb3VuZCwgcnVuIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCisgICAgLi9jb25maWd1cmUgTERGTEFHUz0tTCRQV0Qvc3JjL3NvbGFyaXMKKworICBTZWUgc3JjL3NvbGFyaXMvbGlic3RkYysrLmxhIGZvciBtb3JlIGluZm8gb24gdGhpcyBidWcuCisKKyoqIE5vdGUgZm9yIEhQIEMrKyBUcnU2NCB1c2VycyAqKgorCisgIFRvIGNvbXBpbGUgaW52b2tlIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCisgICAgLi9jb25maWd1cmUgQ1hYRkxBR1M9Ii1PIC1zdGQgYW5zaSAtaWVlZSAtRF9fVVNFX1NURF9JT1NUUkVBTSIKKworICBBbHNvLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBnbWFrZSBpbnN0ZWFkIG9mIG1ha2UuCisKK0MrKyBJbnN0YWxsYXRpb24gLSBXaW5kb3dzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3UgYXJlIHVzaW5nIE1pY3Jvc29mdCBWaXN1YWwgQysrLCBzZWUgdnNwcm9qZWN0cy9yZWFkbWUudHh0LgorCitJZiB5b3UgYXJlIHVzaW5nIEN5Z3dpbiBvciBNaW5HVywgZm9sbG93IHRoZSBVbml4IGluc3RhbGxhdGlvbgoraW5zdHJ1Y3Rpb25zLCBhYm92ZS4KKworQmluYXJ5IENvbXBhdGliaWxpdHkgV2FybmluZworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEdWUgdG8gdGhlIG5hdHVyZSBvZiBDKyssIGl0IGlzIHVubGlrZWx5IHRoYXQgYW55IHR3byB2ZXJzaW9ucyBvZiB0aGUKK1Byb3RvY29sIEJ1ZmZlcnMgQysrIHJ1bnRpbWUgbGlicmFyaWVzIHdpbGwgaGF2ZSBjb21wYXRpYmxlIEFCSXMuCitUaGF0IGlzLCBpZiB5b3UgbGlua2VkIGFuIGV4ZWN1dGFibGUgYWdhaW5zdCBhbiBvbGRlciB2ZXJzaW9uIG9mCitsaWJwcm90b2J1ZiwgaXQgaXMgdW5saWtlbHkgdG8gd29yayB3aXRoIGEgbmV3ZXIgdmVyc2lvbiB3aXRob3V0CityZS1jb21waWxpbmcuICBUaGlzIHByb2JsZW0sIHdoZW4gaXQgb2NjdXJzLCB3aWxsIG5vcm1hbGx5IGJlIGRldGVjdGVkCitpbW1lZGlhdGVseSBvbiBzdGFydHVwIG9mIHlvdXIgYXBwLiAgU3RpbGwsIHlvdSBtYXkgd2FudCB0byBjb25zaWRlcgordXNpbmcgc3RhdGljIGxpbmthZ2UuICBZb3UgY2FuIGNvbmZpZ3VyZSB0aGlzIHBhY2thZ2UgdG8gaW5zdGFsbAorc3RhdGljIGxpYnJhcmllcyBvbmx5IHVzaW5nOgorCisgIC4vY29uZmlndXJlIC0tZGlzYWJsZS1zaGFyZWQKKworSmF2YSBhbmQgUHl0aG9uIEluc3RhbGxhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgSmF2YSBhbmQgUHl0aG9uIHJ1bnRpbWUgbGlicmFyaWVzIGZvciBQcm90b2NvbCBCdWZmZXJzIGFyZSBsb2NhdGVkCitpbiB0aGUgamF2YSBhbmQgcHl0aG9uIGRpcmVjdG9yaWVzLiAgU2VlIHRoZSBSRUFETUUgZmlsZSBpbiBlYWNoCitkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbXBpbGUgYW5kIGluc3RhbGwgdGhlbS4KK05vdGUgdGhhdCBib3RoIG9mIHRoZW0gcmVxdWlyZSB5b3UgdG8gZmlyc3QgaW5zdGFsbCB0aGUgUHJvdG9jb2wKK0J1ZmZlciBjb21waWxlciAocHJvdG9jKSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgQysrIHBhY2thZ2UuCisKK1VzYWdlCis9PT09PQorCitUaGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IgUHJvdG9jb2wgQnVmZmVycyBpcyBhdmFpbGFibGUgdmlhIHRoZQord2ViIGF0OgorCisgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2FjbG9jYWwubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4MWFkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvYWNsb2NhbC5tNApAQCAtMCwwICsxLDEwMjAgQEAKKyMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjExLjMgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyMgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorbTRfaWYobTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pLCBbMi42OF0sLAorW200X3dhcm5pbmcoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjY4LgorWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSXQgbWF5IHdvcmssIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0by4KK0lmIHlvdSBoYXZlIHByb2JsZW1zLCB5b3UgbWF5IG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgYnVpbGQgc3lzdGVtIGVudGlyZWx5LgorVG8gZG8gc28sIHVzZSB0aGUgcHJvY2VkdXJlIGRvY3VtZW50ZWQgYnkgdGhlIHBhY2thZ2UsIHR5cGljYWxseSBgYXV0b3JlY29uZicuXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAxMSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxCisKKyMgQU1fQVVUT01BS0VfVkVSU0lPTihWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEF1dG9tYWtlIFguWSB0cmFjZXMgdGhpcyBtYWNybyB0byBlbnN1cmUgYWNsb2NhbC5tNCBoYXMgYmVlbgorIyBnZW5lcmF0ZWQgZnJvbSB0aGUgbTQgZmlsZXMgYWNjb21wYW55aW5nIEF1dG9tYWtlIFguWS4KKyMgKFRoaXMgcHJpdmF0ZSBtYWNybyBzaG91bGQgbm90IGJlIGNhbGxlZCBvdXRzaWRlIHRoaXMgZmlsZS4pCitBQ19ERUZVTihbQU1fQVVUT01BS0VfVkVSU0lPTl0sCitbYW1fX2FwaV92ZXJzaW9uPScxLjExJworZG5sIFNvbWUgdXNlcnMgZmluZCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBtaXN0YWtlIGl0IGZvciBhIHdheSB0bworZG5sIHJlcXVpcmUgc29tZSBtaW5pbXVtIHZlcnNpb24uICBQb2ludCB0aGVtIHRvIHRoZSByaWdodCBtYWNyby4KK200X2lmKFskMV0sIFsxLjExLjNdLCBbXSwKKyAgICAgIFtBQ19GQVRBTChbRG8gbm90IGNhbGwgJDAsIHVzZSBBTV9JTklUX0FVVE9NQUtFKFskMV0pLl0pXSlkbmwKK10pCisKKyMgX0FNX0FVVE9DT05GX1ZFUlNJT04oVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgYWNsb2NhbCB0cmFjZXMgdGhpcyBtYWNybyB0byBmaW5kIHRoZSBBdXRvY29uZiB2ZXJzaW9uLgorIyBUaGlzIGlzIGEgcHJpdmF0ZSBtYWNybyB0b28uICBVc2luZyBtNF9kZWZpbmUgc2ltcGxpZmllcworIyB0aGUgbG9naWMgaW4gYWNsb2NhbCwgd2hpY2ggY2FuIHNpbXBseSBpZ25vcmUgdGhpcyBkZWZpbml0aW9uLgorbTRfZGVmaW5lKFtfQU1fQVVUT0NPTkZfVkVSU0lPTl0sIFtdKQorCisjIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gdGhleSBjYW4gYmUgdHJhY2VkLgorIyBUaGlzIGZ1bmN0aW9uIGlzIEFDX1JFUVVJUkVkIGJ5IEFNX0lOSVRfQVVUT01BS0UuCitBQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sCitbQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xMS4zXSlkbmwKK200X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCisgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKK19BTV9BVVRPQ09ORl9WRVJTSU9OKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSldKQorCisjIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCisjICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCisjIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCisjCisjIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKKyMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKKyMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCisjIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQorIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAorIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKKyMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KKyMKKyMgJGFjX2F1eF9kaXIvbWlzc2luZworIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCisjICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCisjICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCisjICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKKyMKKyMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKKyMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKKyMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91CisjIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCisjCisjIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAorIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKKyMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKKyMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCisjICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCisjIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCisjIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCisjIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KKyMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgorIworIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KKyMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQorIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCisKK0FDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCitbZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KK0FDX1BSRVJFUShbMi41MF0pZG5sCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitdKQorCisjIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDkKKworIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCitBQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAorW0FDX1BSRVJFUSgyLjUyKWRubAorIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCisJWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAorQUNfU1VCU1QoWyQxX1RSVUVdKWRubAorQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCittNF9kZWZpbmUoW19BTV9DT05EX1ZBTFVFXyQxXSwgWyQyXSlkbmwKK2lmICQyOyB0aGVuCisgICQxX1RSVUU9CisgICQxX0ZBTFNFPScjJworZWxzZQorICAkMV9UUlVFPScjJworICAkMV9GQUxTRT0KK2ZpCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKAorW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgorICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCitmaV0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDksCisjIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMTIKKworIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKKyMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCisjIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncworIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCisjIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KKworCisjIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCisjIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCisjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCisjCisjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcworIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgorIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCisjIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgorQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAorQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAorQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCisKK2lmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQorCitBQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAorICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKK1tpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIG00X2Nhc2UoWyQxXSwgW0NDXSwKKyAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCisgICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7CisgICAgIGVzYWNdLAorICAgIFtDWFhdLAorICAgIFtjYXNlICIgJGRlcGNjICIgaW4gIygKKyAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKKyAgICAgZXNhY10pCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCisgICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCisgICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgorICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQorICAgICAgYW1fX21pbnVzX29iaj0KKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCitdKQorQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCitBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQorXSkKKworCisjIEFNX1NFVF9ERVBESVIKKyMgLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KKyMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCitBQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCitbQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK0FDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKK10pCisKKworIyBBTV9ERVBfVFJBQ0sKKyMgLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKK1tBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCitbICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKKyAgYW1fX25vZGVwPSdfbm8nCitmaQorQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCitBQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKK0FDX1NVQlNUKFthbV9fbm9kZXBdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW2FtX19ub2RlcF0pZG5sCitdKQorCisjIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyNzZXJpYWwgNQorCisjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW3sKKyAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKKyAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAorICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KKyAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCisgICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7CisgICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OworICBlc2FjCisgIHNoaWZ0CisgIGZvciBtZgorICBkbworICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKKyAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KKyAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKKyAgICBlbHNlCisgICAgICBjb250aW51ZQorICAgIGZpCisgICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKKyAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCisgICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQorICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAorICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQorICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCisgICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCisgICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAorICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQorICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCisgICAgIyBleHBhbnNpb24uCisgICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCisgICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKKwkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQorICAgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAorICAgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQorICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKKyAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICAgIGRvbmUKKyAgZG9uZQorfQorXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworCisKKyMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgorIworIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCisjIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKKyMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KK0FDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCitbQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCisgICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCitdKQorCisjIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorIyAyMDA1LCAyMDA2LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDE2CisKKyMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCisjIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKKyMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQorIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCisjIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQorIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgorIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKKyMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKKyMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgorIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgorQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAorW0FDX1BSRVJFUShbMi42Ml0pZG5sCitkbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdworZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCittNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KKyAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKKyAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgorICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCisgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAorICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKKyAgZmkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCitBQ19TVUJTVChbQ1lHUEFUSF9XXSkKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCittNF9pZnZhbChbJDJdLAorW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKK1tfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKK2RubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgorbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCisgIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAorCitfQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKK1tBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCisgQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCitBQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAorQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAorQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKK0FNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCitBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQorQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX01LRElSX1BdKWRubAorIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCitBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCitfQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwKKwkgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKKwkJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKK19BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhDQyldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfQ0NdLAorCQkJICBkZWZuKFtBQ19QUk9HX0NDXSlbX0FNX0RFUEVOREVOQ0lFUyhDQyldKV0pZG5sCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAorCQkgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKKwkJCSAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19PQkpDXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0sCisJCSAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKKwkJCSAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKK10pCitfQU1fSUZfT1BUSU9OKFtzaWxlbnQtcnVsZXNdLCBbQUNfUkVRVUlSRShbQU1fU0lMRU5UX1JVTEVTXSldKWRubAorZG5sIFRoZSBgcGFyYWxsZWwtdGVzdHMnIGRyaXZlciBtYXkgbmVlZCB0byBrbm93IGFib3V0IEVYRUVYVCwgc28gYWRkIHRoZQorZG5sIGBhbV9fRVhFRVhUJyBjb25kaXRpb25hbCBpZiBfQU1fQ09NUElMRVJfRVhFRVhUIHdhcyBzZWVuLiAgVGhpcyBtYWNybworZG5sIGlzIGhvb2tlZCBvbnRvIF9BQ19DT01QSUxFUl9FWEVFWFQgZWFybHksIHNlZSBiZWxvdy4KK0FDX0NPTkZJR19DT01NQU5EU19QUkUoZG5sCitbbTRfcHJvdmlkZV9pZihbX0FNX0NPTVBJTEVSX0VYRUVYVF0sCisgIFtBTV9DT05ESVRJT05BTChbYW1fX0VYRUVYVF0sIFt0ZXN0IC1uICIkRVhFRVhUIl0pXSldKWRubAorXSkKKworZG5sIEhvb2sgaW50byBgX0FDX0NPTVBJTEVSX0VYRUVYVCcgZWFybHkgdG8gbGVhcm4gaXRzIGV4cGFuc2lvbi4gIERvIG5vdAorZG5sIGFkZCB0aGUgY29uZGl0aW9uYWwgcmlnaHQgaGVyZSwgYXMgX0FDX0NPTVBJTEVSX0VYRUVYVCBtYXkgYmUgZnVydGhlcgorZG5sIG1hbmdsZWQgYnkgQXV0b2NvbmYgYW5kIHJ1biBpbiBhIHNoZWxsIGNvbmRpdGlvbmFsIHN0YXRlbWVudC4KK200X2RlZmluZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0sCittNF9kZWZuKFtfQUNfQ09NUElMRVJfRVhFRVhUXSlbbTRfcHJvdmlkZShbX0FNX0NPTVBJTEVSX0VYRUVYVF0pXSkKKworCisjIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCisjIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgorIyB0aGF0IGlzIGdlbmVyYXRlZC4gIFRoZSBzdGFtcCBmaWxlcyBhcmUgbnVtYmVyZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbmFtZXMuCisKKyMgQXV0b2NvbmYgY2FsbHMgX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PSyAod2hlbiBkZWZpbmVkKSBpbiB0aGUKKyMgbG9vcCB3aGVyZSBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIGhlYWRlcnMsIHNvIHdlIGNhbiBnZW5lcmF0ZQorIyBvdXIgc3RhbXAgZmlsZXMgdGhlcmUuCitBQ19ERUZVTihbX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PS10sCitbIyBDb21wdXRlICQxJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgorX2FtX2FyZz0kMQorX2FtX3N0YW1wX2NvdW50PTEKK2ZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbworICBjYXNlICRfYW1faGVhZGVyIGluCisgICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKKyAgICAgIGJyZWFrIDs7CisgICAgKiApCisgICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7CisgIGVzYWMKK2RvbmUKK2VjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gQVNfRElSTkFNRShbIiRfYW1fYXJnIl0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDgsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMQorCisjIEFNX1BST0dfSU5TVEFMTF9TSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lICRpbnN0YWxsX3NoLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAoraWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OworICAqKQorICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgorICBlc2FjCitmaQorQUNfU1VCU1QoaW5zdGFsbF9zaCldKQorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCisjIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KK0FDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAorW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCitta2RpciAudHN0IDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC50c3Q7IHRoZW4KKyAgYW1fX2xlYWRpbmdfZG90PS4KK2Vsc2UKKyAgYW1fX2xlYWRpbmdfZG90PV8KK2ZpCitybWRpciAudHN0IDI+L2Rldi9udWxsCitBQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQorCisjIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4gICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIEZyb20gSmltIE1leWVyaW5nCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4LAorIyAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworIyBBTV9NQUlOVEFJTkVSX01PREUoW0RFRkFVTFQtTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29udHJvbCBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcy4KKyMgRGVmYXVsdCBpcyB0byBkaXNhYmxlIHRoZW0sIHVubGVzcyBgZW5hYmxlJyBpcyBwYXNzZWQgbGl0ZXJhbGx5LgorIyBGb3Igc3ltbWV0cnksIGBkaXNhYmxlJyBtYXkgYmUgcGFzc2VkIGFzIHdlbGwuICBBbnl3YXksIHRoZSB1c2VyCisjIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSAtLWVuYWJsZS8tLWRpc2FibGUgc3dpdGNoLgorQUNfREVGVU4oW0FNX01BSU5UQUlORVJfTU9ERV0sCitbbTRfY2FzZShtNF9kZWZhdWx0KFskMV0sIFtkaXNhYmxlXSksCisgICAgICAgW2VuYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZGlzYWJsZV0pXSwKKyAgICAgICBbZGlzYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSldLAorICAgICAgIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSkKKyAgICAgICAgbTRfd2Fybihbc3ludGF4XSwgW3VuZXhwZWN0ZWQgYXJndW1lbnQgdG8gQU1AJnRAX01BSU5UQUlORVJfTU9ERTogJDFdKV0pCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKKyAgZG5sIG1haW50YWluZXItbW9kZSdzIGRlZmF1bHQgaXMgJ2Rpc2FibGUnIHVubGVzcyAnZW5hYmxlJyBpcyBwYXNzZWQKKyAgQUNfQVJHX0VOQUJMRShbbWFpbnRhaW5lci1tb2RlXSwKK1sgIC0tXVthbV9tYWludGFpbmVyX290aGVyXVstbWFpbnRhaW5lci1tb2RlICBhbV9tYWludGFpbmVyX290aGVyIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAorICAgICAgW1VTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbF0sCisgICAgICBbVVNFX01BSU5UQUlORVJfTU9ERT1dbTRfaWYoYW1fbWFpbnRhaW5lcl9vdGhlciwgW2VuYWJsZV0sIFtub10sIFt5ZXNdKSkKKyAgQUNfTVNHX1JFU1VMVChbJFVTRV9NQUlOVEFJTkVSX01PREVdKQorICBBTV9DT05ESVRJT05BTChbTUFJTlRBSU5FUl9NT0RFXSwgW3Rlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXNdKQorICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKyAgQUNfU1VCU1QoW01BSU5UXSlkbmwKK10KKykKKworQVVfREVGVU4oW2ptX01BSU5UQUlORVJfTU9ERV0sIFtBTV9NQUlOVEFJTkVSX01PREVdKQorCisjIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNAorCisjIEFNX01BS0VfSU5DTFVERSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBob3cgbWFrZSB0cmVhdHMgaW5jbHVkZXMuCitBQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKK1thbV9tYWtlPSR7TUFLRS1tYWtlfQorY2F0ID4gY29uZmluYyA8PCAnRU5EJworYW1fX2RvaXQ6CisJQGVjaG8gdGhpcyBpcyB0aGUgYW1fX2RvaXQgdGFyZ2V0CisuUEhPTlk6IGFtX19kb2l0CitFTkQKKyMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KK0FDX01TR19DSEVDS0lORyhbZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZV0pCithbV9faW5jbHVkZT0iIyIKK2FtX19xdW90ZT0KK19hbV9yZXN1bHQ9bm9uZQorIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2VjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKKyMgSWdub3JlIGFsbCBraW5kcyBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcm9tIGBtYWtlJy4KK2Nhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCisqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKKyAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICBhbV9fcXVvdGU9CisgIF9hbV9yZXN1bHQ9R05VCisgIDs7Citlc2FjCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCisgICAqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKKyAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKKyAgICAgYW1fX3F1b3RlPSJcIiIKKyAgICAgX2FtX3Jlc3VsdD1CU0QKKyAgICAgOzsKKyAgIGVzYWMKK2ZpCitBQ19TVUJTVChbYW1fX2luY2x1ZGVdKQorQUNfU1VCU1QoW2FtX19xdW90ZV0pCitBQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCitybSAtZiBjb25maW5jIGNvbmZtZgorXSkKKworIyBGYWtlIHRoZSBleGlzdGVuY2Ugb2YgcHJvZ3JhbXMgdGhhdCBHTlUgbWFpbnRhaW5lcnMgdXNlLiAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA2CisKKyMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCitbQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKKyQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQorQUNfU1VCU1QoJDEpXSkKKworCisjIEFNX01JU1NJTkdfSEFTX1JVTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgorIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCitBQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCitBQ19SRVFVSVJFX0FVWF9GSUxFKFttaXNzaW5nXSlkbmwKK2lmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKKyAgKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKKyAgZXNhYworZmkKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCitmaQorXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMQorCisjIEFNX1BST0dfTUtESVJfUAorIyAtLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCitBQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKK1tBQ19QUkVSRVEoWzIuNjBdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKK2RubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKK2RubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgorZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCitkbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCitkbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCitkbmwgTUtESVJfUCkuCitBQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKK2Nhc2UgJG1rZGlyX3AgaW4KKyAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKKyAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OworZXNhYworXSkKKworIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOCwgMjAxMCBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA1CisKKyMgX0FNX01BTkdMRV9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fTUFOR0xFX09QVElPTl0sCitbW19BTV9PUFRJT05fXW00X2JwYXRzdWJzdCgkMSwgW1teYS16QS1aMC05X11dLCBbX10pXSkKKworIyBfQU1fU0VUX09QVElPTihOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAorW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQorCisjIF9BTV9TRVRfT1BUSU9OUyhPUFRJT05TKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKK1ttNF9mb3JlYWNoX3coW19BTV9PcHRpb25dLCBbJDFdLCBbX0FNX1NFVF9PUFRJT04oX0FNX09wdGlvbildKV0pCisKKyMgX0FNX0lGX09QVElPTihPUFRJT04sIElGLVNFVCwgW0lGLU5PVC1TRVRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgorQUNfREVGVU4oW19BTV9JRl9PUFRJT05dLAorW200X2lmc2V0KF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbJDJdLCBbJDNdKV0pCisKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIEFNX1NBTklUWV9DSEVDSworIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKKyMgUmVqZWN0IHVuc2FmZSBjaGFyYWN0ZXJzIGluICRzcmNkaXIgb3IgdGhlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5CisjIG5hbWUuICBBY2NlcHQgc3BhY2UgYW5kIHRhYiBvbmx5IGluIHRoZSBsYXR0ZXIuCithbV9sZj0nCisnCitjYXNlIGBwd2RgIGluCisgICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWVdKTs7Citlc2FjCitjYXNlICRzcmNkaXIgaW4KKyAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIHNyY2RpciB2YWx1ZTogYCRzcmNkaXInXSk7OworZXNhYworCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGVgCisgICBmaQorICAgcm0gLWYgY29uZnRlc3QuZmlsZQorICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCitmaQorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMQorCisjIEFNX1BST0dfSU5TVEFMTF9TVFJJUAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT25lIGlzc3VlIHdpdGggdmVuZG9yIGBpbnN0YWxsJyAoZXZlbiBHTlUpIGlzIHRoYXQgeW91IGNhbid0CisjIHNwZWNpZnkgdGhlIHByb2dyYW0gdXNlZCB0byBzdHJpcCBiaW5hcmllcy4gIFRoaXMgaXMgZXNwZWNpYWxseQorIyBhbm5veWluZyBpbiBjcm9zcy1jb21waWxpbmcgZW52aXJvbm1lbnRzLCB3aGVyZSB0aGUgYnVpbGQncyBzdHJpcAorIyBpcyB1bmxpa2VseSB0byBoYW5kbGUgdGhlIGhvc3QncyBiaW5hcmllcy4KKyMgRm9ydHVuYXRlbHkgaW5zdGFsbC1zaCB3aWxsIGhvbm9yIGEgU1RSSVBQUk9HIHZhcmlhYmxlLCBzbyB3ZQorIyBhbHdheXMgdXNlIGluc3RhbGwtc2ggaW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcsIGFuZCBpbml0aWFsaXplCisjIFNUUklQUFJPRyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgU1RSSVAgdmFyaWFibGUgKHNldCBieSB0aGUgdXNlcikuCitBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NUUklQXSwKK1tBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU0hdKWRubAorIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCisjIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCisjIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgorZG5sIERvbid0IHRlc3QgZm9yICRjcm9zc19jb21waWxpbmcgPSB5ZXMsIGJlY2F1c2UgaXQgbWlnaHQgYmUgYG1heWJlJy4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCisgIEFDX0NIRUNLX1RPT0woW1NUUklQXSwgW3N0cmlwXSwgOikKK2ZpCitJTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgorQUNfU1VCU1QoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDgsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMworCisjIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dHRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgorIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KK0FDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCisKKyMgQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHVibGljIHNpc3RlciBvZiBfQU1fU1VCU1RfTk9UTUFLRS4KK0FDX0RFRlVOKFtBTV9TVUJTVF9OT1RNQUtFXSwgW19BTV9TVUJTVF9OT1RNQUtFKCRAKV0pCisKKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIF9BTV9QUk9HX1RBUihGT1JNQVQpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsIGluIGZvcm1hdCBGT1JNQVQuCisjIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mIGB2NycsIGB1c3RhcicsIG9yIGBwYXgnLgorIworIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAorIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQorIyAkdGFyZGlyLgorIyAgICAgdGFyZGlyPWRpcmVjdG9yeSAmJiAkKGFtX190YXIpID4gcmVzdWx0LnRhcgorIworIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdW50YXIpIHRoYXQgZXh0cmFjdCBzdWNoCisjIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCisjICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCitBQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKK1sjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAorIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCitBQ19TVUJTVChbQU1UQVJdLCBbJyQke1RBUi10YXJ9J10pCittNF9pZihbJDFdLCBbdjddLAorICAgICBbYW1fX3Rhcj0nJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciInIGFtX191bnRhcj0nJCR7VEFSLXRhcn0geGYgLSddLAorICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAorICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKKyMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KK19hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCitfYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQorIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCisjIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCitmb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scworZG8KKyAgY2FzZSAkX2FtX3Rvb2wgaW4KKyAgZ251dGFyKQorICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKKyAgICBkbworICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKKyAgICBkb25lCisgICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCisgICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKKyAgICA7OworICBwbGFpbnRhcikKKyAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQorICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCisgICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQorICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCisgICAgOzsKKyAgcGF4KQorICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ncGF4IC1yJworICAgIDs7CisgIGNwaW8pCisgICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJworICAgIDs7CisgIG5vbmUpCisgICAgYW1fX3Rhcj1mYWxzZQorICAgIGFtX190YXJfPWZhbHNlCisgICAgYW1fX3VudGFyPWZhbHNlCisgICAgOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCisgICMgYW5kIGFtX191bnRhciBzZXQuCisgIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhaworCisgICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcworICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCisgIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KKyAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQorICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhaworICBmaQorZG9uZQorcm0gLXJmIGNvbmZ0ZXN0LmRpcgorCitBQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCitBQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCitBQ19TVUJTVChbYW1fX3Rhcl0pCitBQ19TVUJTVChbYW1fX3VudGFyXSkKK10pICMgX0FNX1BST0dfVEFSCisKK200X2luY2x1ZGUoW200L2FjX3N5c3RlbV9leHRlbnNpb25zLm00XSkKK200X2luY2x1ZGUoW200L2FjeF9jaGVja19zdW5jYy5tNF0pCittNF9pbmNsdWRlKFttNC9hY3hfcHRocmVhZC5tNF0pCittNF9pbmNsdWRlKFttNC9saWJ0b29sLm00XSkKK200X2luY2x1ZGUoW200L2x0b3B0aW9ucy5tNF0pCittNF9pbmNsdWRlKFttNC9sdHN1Z2FyLm00XSkKK200X2luY2x1ZGUoW200L2x0dmVyc2lvbi5tNF0pCittNF9pbmNsdWRlKFttNC9sdH5vYnNvbGV0ZS5tNF0pCittNF9pbmNsdWRlKFttNC9zdGxfaGFzaC5tNF0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2F1dG9nZW4uc2ggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2F1dG9nZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzNlMDI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvYXV0b2dlbi5zaApAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vc2gKKworIyBSdW4gdGhpcyBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG90aGVyIGZpbGVzIHRoYXQgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVGhlc2UgZmlsZXMgYXJlIG5vdCBjaGVja2VkIGluIGJlY2F1c2UgdGhleQorIyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisKK3NldCAtZQorCisjIENoZWNrIHRoYXQgd2UncmUgYmVpbmcgcnVuIGZyb20gdGhlIHJpZ2h0IGRpcmVjdG9yeS4KK2lmIHRlc3QgISAtZiBzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oOyB0aGVuCisgIGNhdCA+JjIgPDwgX19FT0ZfXworQ291bGQgbm90IGZpbmQgc291cmNlIGNvZGUuICBNYWtlIHN1cmUgeW91IGFyZSBydW5uaW5nIHRoaXMgc2NyaXB0IGZyb20gdGhlCityb290IG9mIHRoZSBkaXN0cmlidXRpb24gdHJlZS4KK19fRU9GX18KKyAgZXhpdCAxCitmaQorCisjIENoZWNrIHRoYXQgZ3Rlc3QgaXMgcHJlc2VudC4gIFVzdWFsbHkgaXQgaXMgYWxyZWFkeSB0aGVyZSBzaW5jZSB0aGUKKyMgZGlyZWN0b3J5IGlzIHNldCB1cCBhcyBhbiBTVk4gZXh0ZXJuYWwuCitpZiB0ZXN0ICEgLWUgZ3Rlc3Q7IHRoZW4KKyAgZWNobyAiR29vZ2xlIFRlc3Qgbm90IHByZXNlbnQuICBGZXRjaGluZyBndGVzdC0xLjUuMCBmcm9tIHRoZSB3ZWIuLi4iCisgIGN1cmwgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vZmlsZXMvZ3Rlc3QtMS41LjAudGFyLmJ6MiB8IHRhciBqeAorICBtdiBndGVzdC0xLjUuMCBndGVzdAorZmkKKworc2V0IC1leAorCisjIFRlbXBvcmFyeSBoYWNrOiAgTXVzdCBjaGFuZ2UgQyBydW50aW1lIGxpYnJhcnkgdG8gIm11bHRpLXRocmVhZGVkIERMTCIsCisjICAgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgc2V0IHRvICJtdWx0aS10aHJlYWRlZCBzdGF0aWMiIHdoZW4gTVNWQyB1cGdyYWRlcworIyAgIHRoZSBwcm9qZWN0IGZpbGUgdG8gTVNWQyAyMDA1LzIwMDguICB2bGFkbCBvZiBHb29nbGUgVGVzdCBzYXlzIGd0ZXN0IHdpbGwKKyMgICBwcm9iYWJseSBjaGFuZ2UgdGhlaXIgZGVmYXVsdCB0byBtYXRjaCwgdGhlbiB0aGlzIHdpbGwgYmUgdW5uZWNlc3NhcnkuCisjICAgT25lIG9mIHRoZXNlIG1hcHBpbmdzIGNvbnZlcnRzIHRoZSBkZWJ1ZyBjb25maWd1cmF0aW9uIGFuZCB0aGUgb3RoZXIKKyMgICBjb252ZXJ0cyB0aGUgcmVsZWFzZSBjb25maWd1cmF0aW9uLiAgSSBkb24ndCBrbm93IHdoaWNoIGlzIHdoaWNoLgorc2VkIC1pIC1lICdzL1J1bnRpbWVMaWJyYXJ5PSI1Ii9SdW50aW1lTGlicmFyeT0iMyIvZzsKKyAgICAgICAgICAgcy9SdW50aW1lTGlicmFyeT0iNCIvUnVudGltZUxpYnJhcnk9IjIiL2c7JyBndGVzdC9tc3ZjLyoudmNwcm9qCisKKyMgVE9ETyhrZW50b24pOiAgUmVtb3ZlIHRoZSAiLG5vLW9ic29sZXRlIiBwYXJ0IGFuZCBmaXggdGhlIHJlc3VsdGluZyB3YXJuaW5ncy4KK2F1dG9yZWNvbmYgLWYgLWkgLVdhbGwsbm8tb2Jzb2xldGUKKworcm0gLXJmIGF1dG9tNHRlLmNhY2hlIGNvbmZpZy5oLmlufgorZXhpdCAwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2NvbmZpZy5ndWVzcyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2MjJhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE1MzAgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKyMgICAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMTItMDItMTAnCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAgUGxlYXNlIHNlbmQgcGF0Y2hlcyAoY29udGV4dAorIyBkaWZmIGZvcm1hdCkgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGFuZCBpbmNsdWRlIGEgQ2hhbmdlTG9nCisjIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMgorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCAtcSBfX0VMRl9fCisJCXRoZW4KKwkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KKwkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPworCQkgICAgb3M9bmV0YnNkCisJCWVsc2UKKwkJICAgIG9zPW5ldGJzZGVsZgorCQlmaQorCQk7OworCSAgICAqKQorCQlvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJIyBSZXNldCBFWElUIHRyYXAgYmVmb3JlIGV4aXRpbmcgdG8gYXZvaWQgc3B1cmlvdXMgbm9uLXplcm8gZXhpdCBjb2RlLgorCWV4aXRjb2RlPSQ/CisJdHJhcCAnJyAwCisJZXhpdCAkZXhpdGNvZGUgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorCWVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtOnJpc2NvczoqOip8YXJtOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOkF1cm9yYVVYOjUuKjoqIHwgaTg2eGVuOkF1cm9yYVVYOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1hdXJvcmF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCVNVTl9BUkNIPSJpMzg2IgorCSMgSWYgdGhlcmUgaXMgYSBjb21waWxlciwgc2VlIGlmIGl0IGlzIGNvbmZpZ3VyZWQgZm9yIDY0LWJpdCBvYmplY3RzLgorCSMgTm90ZSB0aGF0IHRoZSBTdW4gY2MgZG9lcyBub3QgdHVybiBfX0xQNjRfXyBpbnRvIDEgbGlrZSBnY2MgZG9lcy4KKwkjIFRoaXMgdGVzdCB3b3JrcyBmb3IgYm90aCBjb21waWxlcnMuCisJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJICAgIGlmIChlY2hvICcjaWZkZWYgX19hbWQ2NCc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCWdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJU1VOX0FSQ0g9Ing4Nl82NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtTVU5fQVJDSH0tcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKwllY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorCWVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKwllY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorCSMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCA7OworICAgICo6QUlYOio6WzQ1NjddKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKwkJICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorCQkgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisJCSAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorCQkgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKwkJICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisJCQljYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKwkJCSAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworCQkJICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKwkJCWVzYWMgOzsKKwkJICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKworCQkjZGVmaW5lIF9IUFVYX1NPVVJDRQorCQkjaW5jbHVkZSA8c3RkbGliLmg+CisJCSNpbmNsdWRlIDx1bmlzdGQuaD4KKworCQlpbnQgbWFpbiAoKQorCQl7CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKwkJI2VuZGlmCisJCSAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisJCSAgICBzd2l0Y2ggKGNwdSkKKwkJCXsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworCQkJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMl8wOgorCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisJCQkgICAgc3dpdGNoIChiaXRzKQorCQkJCXsKKwkJCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisJCQkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworCQkJCX0gYnJlYWs7CisJCSNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisJCQkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCSNlbmRpZgorCQkJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQl9CisJCSAgICBleGl0ICgwKTsKKwkJfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCAtcSBfX0xQNjRfXworCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisJRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKwllY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwljYXNlICR7VU5BTUVfUFJPQ0VTU09SfSBpbgorCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICAqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOk1TWVMqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zeXMKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIGF1dGhlbnRpY2FtZCB8IGdlbnVpbmVpbnRlbCB8IEVNNjRUKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgSUE2NCkKKwkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCWVzYWMgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgODY2NDpXaW5kb3dzX05UOiopCisJZWNobyB4ODZfNjQtcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhYXJjaDY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYWFyY2g2NF9iZTpMaW51eDoqOiopCisJVU5BTUVfTUFDSElORT1hYXJjaDY0X2JlCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisJZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJaWYgZWNobyBfX0FSTV9FQUJJX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCSAgICB8IGdyZXAgLXEgX19BUk1fRUFCSV9fCisJdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwllbHNlCisJICAgIGlmIGVjaG8gX19BUk1fUENTX1ZGUCB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCXwgZ3JlcCAtcSBfX0FSTV9QQ1NfVkZQCisJICAgIHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQorCSAgICBlbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmloZgorCSAgICBmaQorCWZpCisJZXhpdCA7OworICAgIGF2cjMyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzdjMyOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgZnJ2OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaGV4YWdvbjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCUxJQkM9Z251CisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeTElCQydgCisJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IgorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiogfCBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPSR7VU5BTUVfTUFDSElORX0KKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeQ1BVJ2AKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQorCSMgTG9vayBmb3IgQ1BVIGxldmVsCisJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KKwkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKKwllc2FjCisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHRpbGUqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4dGVuc2EqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisJIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorCSMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKwkjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorCSMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisJIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKwkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKQkjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorCQkJIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorCWVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCQllY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIGkzODYpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJCSAgdGhlbgorCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKKwkJICBmaQorCQlmaSA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBORU8tPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuZW8tdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisJZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKwlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7CisgICAgaSo4NjpBUk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYXJvcworCWV4aXQgOzsKKyAgICB4ODZfNjQ6Vk1rZXJuZWw6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVzeAorCWV4aXQgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKwkiNCIKKyNlbHNlCisJIiIKKyNlbmRpZgorCSk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvY29uZmlnLmguaW4gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODBlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogdGhlIG5hbWUgb2YgPGhhc2hfbWFwPiAqLworI3VuZGVmIEhBU0hfTUFQX0NMQVNTCisKKy8qIHRoZSBsb2NhdGlvbiBvZiA8dW5vcmRlcmVkX21hcD4gb3IgPGhhc2hfbWFwPiAqLworI3VuZGVmIEhBU0hfTUFQX0gKKworLyogdGhlIG5hbWVzcGFjZSBvZiBoYXNoX21hcC9oYXNoX3NldCAqLworI3VuZGVmIEhBU0hfTkFNRVNQQUNFCisKKy8qIHRoZSBuYW1lIG9mIDxoYXNoX3NldD4gKi8KKyN1bmRlZiBIQVNIX1NFVF9DTEFTUworCisvKiB0aGUgbG9jYXRpb24gb2YgPHVub3JkZXJlZF9zZXQ+IG9yIDxoYXNoX3NldD4gKi8KKyN1bmRlZiBIQVNIX1NFVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ETEZDTl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnRydW5jYXRlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0ZUUlVOQ0FURQorCisvKiBkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGhhcyBoYXNoX21hcCAqLworI3VuZGVmIEhBVkVfSEFTSF9NQVAKKworLyogZGVmaW5lIGlmIHRoZSBjb21waWxlciBoYXMgaGFzaF9zZXQgKi8KKyN1bmRlZiBIQVZFX0hBU0hfU0VUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbXNldCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NRU1TRVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBta2RpcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NS0RJUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBIQVZFX1BUSFJFQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2hyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkVSUk9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9sJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlRPTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRW5hYmxlIGNsYXNzZXMgdXNpbmcgemxpYiBjb21wcmVzc2lvbi4gKi8KKyN1bmRlZiBIQVZFX1pMSUIKKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisjdW5kZWYgTFRfT0JKRElSCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIERlZmluZSB0byBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lIG9uCisgICB5b3VyIHN5c3RlbS4gKi8KKyN1bmRlZiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gQUlYIDMsIEludGVyaXguICAqLworI2lmbmRlZiBfQUxMX1NPVVJDRQorIyB1bmRlZiBfQUxMX1NPVVJDRQorI2VuZGlmCisvKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIHVuZGVmIF9HTlVfU09VUkNFCisjZW5kaWYKKy8qIEVuYWJsZSB0aHJlYWRpbmcgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTCisjIHVuZGVmIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUworI2VuZGlmCisvKiBFbmFibGUgZXh0ZW5zaW9ucyBvbiBIUCBOb25TdG9wLiAgKi8KKyNpZm5kZWYgX1RBTkRFTV9TT1VSQ0UKKyMgdW5kZWYgX1RBTkRFTV9TT1VSQ0UKKyNlbmRpZgorLyogRW5hYmxlIGdlbmVyYWwgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX19FWFRFTlNJT05TX18KKyMgdW5kZWYgX19FWFRFTlNJT05TX18KKyNlbmRpZgorCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCisKKy8qIERlZmluZSB0byAxIGlmIG9uIE1JTklYLiAqLworI3VuZGVmIF9NSU5JWAorCisvKiBEZWZpbmUgdG8gMiBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgUE9TSVguMSBmZWF0dXJlcyBleGNlcHQgd2l0aAorICAgdGhpcyBkZWZpbmVkLiAqLworI3VuZGVmIF9QT1NJWF8xX1NPVVJDRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3IgYHN0YXQnIGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2NvbmZpZy5zdWIgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzg5NGRhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvY29uZmlnLnN1YgpAQCAtMCwwICsxLDE3NzMgQEAKKyMhIC9iaW4vc2gKKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorIyAgIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAxMi0wMi0xMCcKKworIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCisjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKKyMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIEdOVSBDaGFuZ2VMb2cgZW50cnkuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKKzIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDs7CisKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2Nhc2UgJCMgaW4KKyAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKKyAxKSA7OworICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICAgIGV4aXQgMTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWFuZHJvaWQqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgXAorICBsaW51eC11Y2xpYmMqIHwgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBcCisgIGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBcCisgIGtvcGVuc29sYXJpcyotZ251KiB8IFwKKyAgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCBydG1rLW5vdmEqKQorICAgIG9zPS0kbWF5YmVfb3MKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAorICAgIDs7CisgIGFuZHJvaWQtbGludXgpCisgICAgb3M9LWxpbnV4LWFuZHJvaWQKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYC11bmtub3duCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5IHwgLW1pY3JvYmxhemUpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWJsdWVnZW5lKikKKwkJb3M9LWNuaworCQk7OworCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zY291dCkKKwkJOzsKKwktd3JzKQorCQlvcz0tdnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c29zKikKKwkJb3M9LWNob3J1c29zCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzcmRiKQorCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktaGl1eCopCisJCW9zPS1oaXV4d2UyCisJCTs7CisJLXNjbzYpCisJCW9zPS1zY281djYKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY281djYqKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbyopCisJCW9zPS1zY28zLjJ2MgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXVkayopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktaXNjKQorCQlvcz0taXNjMi4yCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktY2xpeCopCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCisJCTs7CisJLWlzYyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktbHlueCopCisJCW9zPS1seW54b3MKKwkJOzsKKwktcHR4KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCisJCTs7CisJLXdpbmRvd3NudCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKKwkJOzsKKwktcHNvcyopCisJCW9zPS1wc29zCisJCTs7CisJLW1pbnQgfCAtbWludFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7Citlc2FjCisKKyMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCisJIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KKwkxNzUwYSB8IDU4MCBcCisJfCBhMjlrIFwKKwl8IGFhcmNoNjQgfCBhYXJjaDY0X2JlIFwKKwl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCisJfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKKwl8IGFtMzNfMi4wIFwKKwl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciB8IGF2cjMyIFwKKyAgICAgICAgfCBiZTMyIHwgYmU2NCBcCisJfCBiZmluIFwKKwl8IGM0eCB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGVwaXBoYW55IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBoZXhhZ29uIFwKKwl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAorCXwgaXAyayB8IGlxMjAwMCBcCisJfCBsZTMyIHwgbGU2NCBcCisJfCBsbTMyIFwKKwl8IG0zMmMgfCBtMzJyIHwgbTMycmxlIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgXAorCXwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1jb3JlIHwgbWVwIHwgbWV0YWcgXAorCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCisJfCBtaXBzMTYgXAorCXwgbWlwczY0IHwgbWlwczY0ZWwgXAorCXwgbWlwczY0b2N0ZW9uIHwgbWlwczY0b2N0ZW9uZWwgXAorCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKKwl8IG1pcHM2NHI1OTAwIHwgbWlwczY0cjU5MDBlbCBcCisJfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwczY0dnI1OTAwIHwgbWlwczY0dnI1OTAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCisJfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCisJfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAorCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwl8IG1veGllIFwKKwl8IG10IFwKKwl8IG1zcDQzMCBcCisJfCBuZHMzMiB8IG5kczMybGUgfCBuZHMzMmJlIFwKKwl8IG5pb3MgfCBuaW9zMiBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9wZW44IFwKKwl8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSBcCisJfCBweXJhbWlkIFwKKwl8IHJsNzggfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IFwKKwl8IHRhaG9lIHwgdGljNHggfCB0aWM1NHggfCB0aWM1NXggfCB0aWM2eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB1Ymljb20zMiBcCisJfCB2ODUwIHwgdjg1MGUgfCB2ODUwZTEgfCB2ODUwZTIgfCB2ODUwZXMgfCB2ODUwZTJ2MyBcCisJfCB3ZTMyayBcCisJfCB4ODYgfCB4YzE2eCB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGsgfCB6ODApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCWM1NHgpCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJOzsKKwljNTV4KQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCTs7CisJYzZ4KQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIgfCBtNjhoY3MxMnggfCBwaWNvY2hpcCkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCisJCTs7CisJbXMxKQorCQliYXNpY19tYWNoaW5lPW10LXVua25vd24KKwkJOzsKKworCXN0cm9uZ2FybSB8IHRodW1iIHwgeHNjYWxlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCTs7CisJeGdhdGUpCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCXhzY2FsZWViKQorCQliYXNpY19tYWNoaW5lPWFybWViLXVua25vd24KKwkJOzsKKworCXhzY2FsZWVsKQorCQliYXNpY19tYWNoaW5lPWFybWVsLXVua25vd24KKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhYXJjaDY0LSogfCBhYXJjaDY0X2JlLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCisJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKKwl8IGF2ci0qIHwgYXZyMzItKiBcCisJfCBiZTMyLSogfCBiZTY0LSogXAorCXwgYmZpbi0qIHwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogXAorCXwgY2xpcHBlci0qIHwgY3JheW52LSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZmlkby0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGhleGFnb24tKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbGUzMi0qIHwgbGU2NC0qIFwKKwl8IGxtMzItKiBcCisJfCBtMzJjLSogfCBtMzJyLSogfCBtMzJybGUtKiBcCisJfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAorCXwgbTg4MTEwLSogfCBtODhrLSogfCBtYXhxLSogfCBtY29yZS0qIHwgbWV0YWctKiB8IG1pY3JvYmxhemUtKiBcCisJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCisJfCBtaXBzMTYtKiBcCisJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAorCXwgbWlwczY0b2N0ZW9uLSogfCBtaXBzNjRvY3Rlb25lbC0qIFwKKwl8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAorCXwgbWlwczY0cjU5MDAtKiB8IG1pcHM2NHI1OTAwZWwtKiBcCisJfCBtaXBzNjR2ci0qIHwgbWlwczY0dnJlbC0qIFwKKwl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCisJfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAorCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAorCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCisJfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAorCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCisJfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwl8IG1taXgtKiBcCisJfCBtdC0qIFwKKwl8IG1zcDQzMC0qIFwKKwl8IG5kczMyLSogfCBuZHMzMmxlLSogfCBuZHMzMmJlLSogXAorCXwgbmlvcy0qIHwgbmlvczItKiBcCisJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9wZW44LSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIFwKKwl8IHB5cmFtaWQtKiBcCisJfCBybDc4LSogfCByb21wLSogfCByczYwMDAtKiB8IHJ4LSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyNF1hZWItKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAorCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCisJfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCisJfCBzcGFyY2xpdGUtKiBcCisJfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCisJfCB0aWxlKi0qIFwKKwl8IHRyb24tKiBcCisJfCB1Ymljb20zMi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2ODUwZTEtKiB8IHY4NTBlcy0qIHwgdjg1MGUyLSogfCB2ODUwZTJ2My0qIFwKKwl8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKiB8IHo4MC0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUsIHdpdGggZ2xvYiBtYXRjaC4KKwl4dGVuc2EqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCWFiYWN1cykKKwkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWFwb2xsbzY4YnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhcm9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWFyb3MKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWJsYWNrZmluKQorCQliYXNpY19tYWNoaW5lPWJmaW4tdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlibGFja2Zpbi0qKQorCQliYXNpY19tYWNoaW5lPWJmaW4tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJYmx1ZWdlbmUqKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1jbmsKKwkJOzsKKwljNTR4LSopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzU1eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM2eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljZWdjYykKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tY2VnY2MKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgajkwKQorCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmF5bnYpCisJCWJhc2ljX21hY2hpbmU9Y3JheW52LWNyYXkKKwkJb3M9LXVuaWNvc21wCisJCTs7CisJY3IxNiB8IGNyMTYtKikKKwkJYmFzaWNfbWFjaGluZT1jcjE2LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZGljb3MpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tZGljb3MKKwkJOzsKKwlkamdwcCkKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCW9zPS1tc2Rvc2RqZ3BwCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQorCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWdvMzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tZ28zMgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloODMwMHhyYXkpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0teHJheQorCQk7OworCWg4NTAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCTs7CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pY3JvYmxhemUpCisJCWJhc2ljX21hY2hpbmU9bWljcm9ibGF6ZS14aWxpbngKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5ndzMyY2UpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LW1pbmd3MzJjZQorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW1zMS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCisJCTs7CisJbXN5cykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc3lzCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluYWNsKQorCQliYXNpY19tYWNoaW5lPWxlMzItdW5rbm93bgorCQlvcz0tbmFjbAorCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbmVvLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uZW8tdGFuZGVtCisJCTs7CisJbnNlLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc2UtdGFuZGVtCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjIHwgcHBjYmUpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSogfCBwcGNiZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3Ryb25nYXJtLSogfCB0aHVtYi0qKQorCQliYXNpY19tYWNoaW5lPWFybS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXN1bjIpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQk7OworCXN1bjJvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuMm9zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW4zb3MzKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4zb3M0KQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40b3MzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuNG9zNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRzb2wyKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlzdW4zIHwgc3VuMy0qKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCTs7CisJc3VuNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgorCQk7OworCXN2MSkKKwkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXQzZSkKKwkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0OTApCisJCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXRpbGUqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LWxpbnV4LWdudQorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b2FkMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKKwkJb3M9LXRvcHMyMAorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl0cGYpCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCW9zPS10cGYKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKwkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKwkJOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXc2NSopCisJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworCQlvcz0tbm9uZQorCQk7OworCXc4OWstKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJb3M9LXByb2VsZgorCQk7OworCXhib3gpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCXhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJeHNjYWxlLSogfCB4c2NhbGVlW2JsXS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL154c2NhbGUvYXJtLydgCisJCTs7CisJeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwl6ODAtKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4MC11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCW1taXgpCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKwkjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworCSMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLWF1cm9yYXV4KQorCQlvcz0tYXVyb3JhdXgKKwkJOzsKKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLWNuayogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLWF1cm9yYXV4KiB8IC1zb2xhcmlzKiBcCisJICAgICAgfCAtc3ltKiB8IC1rb3BlbnNvbGFyaXMqIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIHwgLWFyb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKKwkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLW1zeXMqIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1hbmRyb2lkKiBcCisJICAgICAgfCAtbGludXgtbmV3bGliKiB8IC1saW51eC11Y2xpYmMqIFwKKwkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKKwkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKiB8IC1lcyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKwktb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwkta2FvcyopCisJCW9zPS1rYW9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktZGljb3MqKQorCQlvcz0tZGljb3MKKwkJOzsKKwktbmFjbCopCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwlzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisJc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworCWM0eC0qIHwgdGljNHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM2eC0qKQorCQlvcz0tY29mZgorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKwltZXAtKikKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLWNpc2NvKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotKikKKwkJb3M9LWVsZgorCQk7OworCW9yMzItKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1iZSkKKwkJb3M9LWJlb3MKKwkJOzsKKwkqLWhhaWt1KQorCQlvcz0taGFpa3UKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktY25rKnwtYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0CisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvY29uZmlndXJlIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODA0NDNiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvY29uZmlndXJlCkBAIC0wLDAgKzEsMTk0ODkgQEAKKyMhIC9iaW4vc2gKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4IGZvciBQcm90b2NvbCBCdWZmZXJzIDIuNS4wLgorIworIyBSZXBvcnQgYnVncyB0byA8cHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbT4uCisjCisjCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4KKyMKKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisiCisgIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Cithc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KK2FzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQorCitleGl0Y29kZT0wCithc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9CitpZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6CisKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMQorCisgIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCR7QkFTSF9WRVJTSU9OK3NldH1cIiB8fCAoCisgICAgRUNITz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCisgICAgRUNITz1cJEVDSE9cJEVDSE9cJEVDSE9cJEVDSE9cJEVDSE8KKyAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITworICAgIFBBVEg9L2VtcHR5IEZQQVRIPS9lbXB0eTsgZXhwb3J0IFBBVEggRlBBVEgKKyAgICB0ZXN0IFwiWFxgcHJpbnRmICVzIFwkRUNIT1xgXCIgPSBcIlhcJEVDSE9cIiBcXAorICAgICAgfHwgdGVzdCBcIlhcYHByaW50IC1yIC0tIFwkRUNIT1xgXCIgPSBcIlhcJEVDSE9cIiApIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorCitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2ZvdW5kPWZhbHNlCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGFzX2ZvdW5kPToKKyAgY2FzZSAkYXNfZGlyIGluICMoCisJIC8qKQorCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KKwkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCisJCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGJyZWFrIDIKK2ZpCitmaQorCSAgIGRvbmU7OworICAgICAgIGVzYWMKKyAgYXNfZm91bmQ9ZmFsc2UKK2RvbmUKKyRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcworZmk7IH0KK0lGUz0kYXNfc2F2ZV9JRlMKKworCisgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6CisgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisJIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKwkjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorCSMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KKwlCQVNIX0VOVj0vZGV2L251bGwKKwlFTlY9L2Rldi9udWxsCisJKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCisJZXhwb3J0IENPTkZJR19TSEVMTAorCWNhc2UgJC0gaW4gIyAoKCgoCisJICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKwkgICp2KiApIGFzX29wdHM9LXYgOzsKKwkgICp4KiApIGFzX29wdHM9LXggOzsKKwkgICogKSBhc19vcHRzPSA7OworCWVzYWMKKwlleGVjICIkQ09ORklHX1NIRUxMIiAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CitmaQorCisgICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgorICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCisgICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgorICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgorICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgorICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKKyAgZWxzZQorICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYW5kCiskMDogcHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbSBhYm91dCB5b3VyIHN5c3RlbSwgaW5jbHVkaW5nCiskMDogYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcyBtZXNzYWdlLiBUaGVuCiskMDogaW5zdGFsbCBhIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuIHRoZSBzY3JpcHQKKyQwOiB1bmRlciBzdWNoIGEgc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLiIKKyAgZmkKKyAgZXhpdCAxCitmaQorZmkKK2ZpCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorZXhwb3J0IFNIRUxMCisjIFVuc2V0IG1vcmUgdmFyaWFibGVzIGtub3duIHRvIGludGVyZmVyZSB3aXRoIGJlaGF2aW9yIG9mIGNvbW1vbiB0b29scy4KK0NMSUNPTE9SX0ZPUkNFPSBHUkVQX09QVElPTlM9Cit1bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIFNoZWxsIEZ1bmN0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyBhc19mbl91bnNldCBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tCisjIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisKKyMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgorYXNfZm5fc2V0X3N0YXR1cyAoKQoreworICByZXR1cm4gJDEKK30gIyBhc19mbl9zZXRfc3RhdHVzCisKKyMgYXNfZm5fZXhpdCBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgorYXNfZm5fZXhpdCAoKQoreworICBzZXQgK2UKKyAgYXNfZm5fc2V0X3N0YXR1cyAkMQorICBleGl0ICQxCit9ICMgYXNfZm5fZXhpdAorCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKKyMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKKyMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgorIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQorIyBpbXBsZW1lbnRhdGlvbnMuCitpZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMSs9XCQyCisgIH0nCitlbHNlCisgIGFzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMT1cJCQxXCQyCisgIH0KK2ZpICMgYXNfZm5fYXBwZW5kCisKKyMgYXNfZm5fYXJpdGggQVJHLi4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCisjIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKKyMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCitpZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD0kKCggJCogKSkKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCisgIH0KK2ZpICMgYXNfZm5fYXJpdGgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKworICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KKyAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKKyAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisgIC4gIi4vJGFzX21lLmxpbmVubyIKKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wJworICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9bG4KKyAgZWxzZQorICAgIGFzX2xuX3M9J2NwIC1wJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCisKK3Rlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKK2V4ZWMgNj4mMQorCisjIE5hbWUgb2YgdGhlIGhvc3QuCisjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCisjCisjIEluaXRpYWxpemF0aW9ucy4KKyMKK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKK2FjX2NsZWFuX2ZpbGVzPQorYWNfY29uZmlnX2xpYm9ial9kaXI9LgorTElCT0JKUz0KK2Nyb3NzX2NvbXBpbGluZz1ubworc3ViZGlycz0KK01GTEFHUz0KK01BS0VGTEFHUz0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9J1Byb3RvY29sIEJ1ZmZlcnMnCitQQUNLQUdFX1RBUk5BTUU9J3Byb3RvYnVmJworUEFDS0FHRV9WRVJTSU9OPScyLjUuMCcKK1BBQ0tBR0VfU1RSSU5HPSdQcm90b2NvbCBCdWZmZXJzIDIuNS4wJworUEFDS0FHRV9CVUdSRVBPUlQ9J3Byb3RvYnVmQGdvb2dsZWdyb3Vwcy5jb20nCitQQUNLQUdFX1VSTD0nJworCithY191bmlxdWVfZmlsZT0ic3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjIgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCitlbmFibGVfb3B0aW9uX2NoZWNraW5nPW5vCithY19zdWJzdF92YXJzPSdhbV9fRVhFRVhUX0ZBTFNFCithbV9fRVhFRVhUX1RSVUUKK0xUTElCT0JKUworc3ViZGlycworUFRIUkVBRF9DRkxBR1MKK1BUSFJFQURfTElCUworUFRIUkVBRF9DQworYWN4X3B0aHJlYWRfY29uZmlnCitVU0VfRVhURVJOQUxfUFJPVE9DX0ZBTFNFCitVU0VfRVhURVJOQUxfUFJPVE9DX1RSVUUKK1BST1RPQworSEFWRV9aTElCX0ZBTFNFCitIQVZFX1pMSUJfVFJVRQorUE9XX0xJQgorTElCT0JKUworT1RPT0w2NAorT1RPT0wKK0xJUE8KK05NRURJVAorRFNZTVVUSUwKK01BTklGRVNUX1RPT0wKK1JBTkxJQgorYWNfY3RfQVIKK0FSCitETExUT09MCitPQkpEVU1QCitMTl9TCitOTQorYWNfY3RfRFVNUEJJTgorRFVNUEJJTgorTEQKK0ZHUkVQCitTRUQKK0xJQlRPT0wKK0lTQUlORk8KK1BST1RPQlVGX09QVF9GTEFHCitHQ0NfRkFMU0UKK0dDQ19UUlVFCitFR1JFUAorR1JFUAorQ1hYQ1BQCithbV9fZmFzdGRlcENYWF9GQUxTRQorYW1fX2Zhc3RkZXBDWFhfVFJVRQorQ1hYREVQTU9ERQorYWNfY3RfQ1hYCitDWFhGTEFHUworQ1hYCithbV9fZmFzdGRlcENDX0ZBTFNFCithbV9fZmFzdGRlcENDX1RSVUUKK0NDREVQTU9ERQorYW1fX25vZGVwCitBTURFUEJBQ0tTTEFTSAorQU1ERVBfRkFMU0UKK0FNREVQX1RSVUUKK2FtX19xdW90ZQorYW1fX2luY2x1ZGUKK0RFUERJUgorT0JKRVhUCitFWEVFWFQKK2FjX2N0X0NDCitDUFBGTEFHUworTERGTEFHUworQ0ZMQUdTCitDQworYW1fX3VudGFyCithbV9fdGFyCitBTVRBUgorYW1fX2xlYWRpbmdfZG90CitTRVRfTUFLRQorQVdLCitta2Rpcl9wCitNS0RJUl9QCitJTlNUQUxMX1NUUklQX1BST0dSQU0KK1NUUklQCitpbnN0YWxsX3NoCitNQUtFSU5GTworQVVUT0hFQURFUgorQVVUT01BS0UKK0FVVE9DT05GCitBQ0xPQ0FMCitWRVJTSU9OCitQQUNLQUdFCitDWUdQQVRIX1cKK2FtX19pc3JjCitJTlNUQUxMX0RBVEEKK0lOU1RBTExfU0NSSVBUCitJTlNUQUxMX1BST0dSQU0KK3RhcmdldF9vcwordGFyZ2V0X3ZlbmRvcgordGFyZ2V0X2NwdQordGFyZ2V0Citob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK01BSU5UCitNQUlOVEFJTkVSX01PREVfRkFMU0UKK01BSU5UQUlORVJfTU9ERV9UUlVFCit0YXJnZXRfYWxpYXMKK2hvc3RfYWxpYXMKK2J1aWxkX2FsaWFzCitMSUJTCitFQ0hPX1QKK0VDSE9fTgorRUNIT19DCitERUZTCittYW5kaXIKK2xvY2FsZWRpcgorbGliZGlyCitwc2RpcgorcGRmZGlyCitkdmlkaXIKK2h0bWxkaXIKK2luZm9kaXIKK2RvY2Rpcgorb2xkaW5jbHVkZWRpcgoraW5jbHVkZWRpcgorbG9jYWxzdGF0ZWRpcgorc2hhcmVkc3RhdGVkaXIKK3N5c2NvbmZkaXIKK2RhdGFkaXIKK2RhdGFyb290ZGlyCitsaWJleGVjZGlyCitzYmluZGlyCitiaW5kaXIKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKK3ByZWZpeAorZXhlY19wcmVmaXgKK1BBQ0tBR0VfVVJMCitQQUNLQUdFX0JVR1JFUE9SVAorUEFDS0FHRV9TVFJJTkcKK1BBQ0tBR0VfVkVSU0lPTgorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX05BTUUKK1BBVEhfU0VQQVJBVE9SCitTSEVMTCcKK2FjX3N1YnN0X2ZpbGVzPScnCithY191c2VyX29wdHM9JworZW5hYmxlX29wdGlvbl9jaGVja2luZworZW5hYmxlX21haW50YWluZXJfbW9kZQord2l0aF96bGliCit3aXRoX3Byb3RvYworZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcKK2VuYWJsZV82NGJpdF9zb2xhcmlzCitlbmFibGVfc2hhcmVkCitlbmFibGVfc3RhdGljCit3aXRoX3BpYworZW5hYmxlX2Zhc3RfaW5zdGFsbAord2l0aF9nbnVfbGQKK3dpdGhfc3lzcm9vdAorZW5hYmxlX2xpYnRvb2xfbG9jaworJworICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworQ0MKK0NGTEFHUworTERGTEFHUworTElCUworQ1BQRkxBR1MKK0NYWAorQ1hYRkxBR1MKK0NDQworQ1hYQ1BQJworYWNfc3ViZGlyc19hbGw9J2d0ZXN0JworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKK2FjX3VucmVjb2duaXplZF9vcHRzPQorYWNfdW5yZWNvZ25pemVkX3NlcD0KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCisjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKK2RhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9JworaW5mb2Rpcj0nJHtkYXRhcm9vdGRpcn0vaW5mbycKK2h0bWxkaXI9JyR7ZG9jZGlyfScKK2R2aWRpcj0nJHtkb2NkaXJ9JworcGRmZGlyPScke2RvY2Rpcn0nCitwc2Rpcj0nJHtkb2NkaXJ9JworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitsb2NhbGVkaXI9JyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZScKK21hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJworCithY19wcmV2PQorYWNfZGFzaGRhc2g9Citmb3IgYWNfb3B0aW9uCitkbworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAkYWNfcHJldj1cJGFjX29wdGlvbgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgKj0/KikgYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKKyAgKj0pICAgYWNfb3B0YXJnPSA7OworICAqKSAgICBhY19vcHRhcmc9eWVzIDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgorICAtLSkKKyAgICBhY19kYXNoZGFzaD15ZXMgOzsKKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKKyAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKKyAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCisgICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OworICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCisgIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQorICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZGlzYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1ubyA7OworCisgIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCisgICAgYWNfcHJldj1kb2NkaXIgOzsKKyAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCisgICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKKworICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQorICAgIGFjX3ByZXY9ZHZpZGlyIDs7CisgIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCisgICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZW5hYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQorICAgIGFjX3ByZXY9aHRtbGRpciA7OworICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKKyAgfCAtLWh0PSopCisgICAgaHRtbGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKKyAgICBhY19wcmV2PWxvY2FsZWRpciA7OworICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQorICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCisgICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisKKyAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKKyAgICBhY19wcmV2PXBkZmRpciA7OworICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQorICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKKyAgICBhY19wcmV2PXBzZGlyIDs7CisgIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQorICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGgtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRob3V0LSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1ubyA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCRhY19vcHRpb24nCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICAgIDs7CisKKyAgKj0qKQorICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtePV0qXCk9J2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgY2FzZSAkYWNfZW52dmFyIGluICMoCisgICAgICAnJyB8IFswLTldKiB8ICpbIV8kYXNfY3JfYWxudW1dKiApCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YXJpYWJsZSBuYW1lOiBcYCRhY19lbnZ2YXInIiA7OworICAgIGVzYWMKKyAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKKyAgICBleHBvcnQgJGFjX2VudnZhciA7OworCisgICopCisgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgorICAgIDogIiR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259IgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICBhc19mbl9lcnJvciAkPyAibWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIgorZmkKKworaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgorICBjYXNlICRlbmFibGVfb3B0aW9uX2NoZWNraW5nIGluCisgICAgbm8pIDs7CisgICAgZmF0YWwpIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA7OworICAgICopICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjIgOzsKKyAgZXNhYworZmkKKworIyBDaGVjayBhbGwgZGlyZWN0b3J5IGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kuCitmb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKKwkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCisJCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKKwkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKK2RvCisgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAjIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICAqLyApCisgICAgICBhY192YWw9YGV4cHIgIlgkYWNfdmFsIiA6ICdYXCguKlteL11cKScgXHwgIlgkYWNfdmFsIiA6ICdYXCguKlwpJ2AKKyAgICAgIGV2YWwgJGFjX3Zhcj1cJGFjX3ZhbDs7CisgIGVzYWMKKyAgIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKKyAgZXNhYworICBhc19mbl9lcnJvciAkPyAiZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIKK2RvbmUKKworIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitidWlsZD0kYnVpbGRfYWxpYXMKK2hvc3Q9JGhvc3RfYWxpYXMKK3RhcmdldD0kdGFyZ2V0X2FsaWFzCisKKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2lmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkIiA+JjIKKyAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKyAgZmkKK2ZpCisKK2FjX3Rvb2xfcHJlZml4PQordGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCisKKworYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCithY19sc19kaT1gbHMgLWRpIC5gICYmCithY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIndvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIgordGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJwd2QgZG9lcyBub3QgcmVwb3J0IG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkiCisKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX215c2VsZiIgfHwKKyRhc19leHByIFgiJGFzX215c2VsZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19teXNlbGYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllcyAmJiBzcmNkaXI9IiRhY19jb25mZGlyIG9yIC4uIgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIgorZmkKK2FjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKK2FjX2Fic19jb25mZGlyPWAoCisJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCBhc19mbl9lcnJvciAkPyAiJGFjX21zZyIKKwlwd2QpYAorIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KK2lmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KKyAgc3JjZGlyPS4KK2ZpCisjIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgorIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCisjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KK2Nhc2UgJHNyY2RpciBpbgorKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Citlc2FjCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorZG9uZQorCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxfQUNFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIFByb3RvY29sIEJ1ZmZlcnMgMi41LjAgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCisgICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KKyAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKKyAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCisKK0luc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCisKK0J5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgorXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCitmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgorCitGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKworRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKyAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCisgIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQorICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9wcm90b2J1Zl0KKyAgLS1odG1sZGlyPURJUiAgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcGRmZGlyPURJUiAgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcHNkaXI9RElSICAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKKworUHJvZ3JhbSBuYW1lczoKKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggICAgICAgICAgICBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCAgICAgICAgICAgIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0gICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKworU3lzdGVtIHR5cGVzOgorICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQorICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgY29uZmlndXJlIGZvciBidWlsZGluZyBjb21waWxlcnMgZm9yIFRBUkdFVCBbSE9TVF0KK19BQ0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKyAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCisgICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBQcm90b2NvbCBCdWZmZXJzIDIuNS4wOiI7OworICAgZXNhYworICBjYXQgPDxcX0FDRU9GCisKK09wdGlvbmFsIEZlYXR1cmVzOgorICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlICBkaXNhYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIKKyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAorICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycworICAtLWRpc2FibGUtNjRiaXQtc29sYXJpcyBCdWlsZCA2NCBiaXQgYmluYXJ5IG9uIFNvbGFyaXMgW2RlZmF1bHQ9b25dCisgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQorICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KKyAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXQorICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpCisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXdpdGgtemxpYiAgICAgICAgICAgICBpbmNsdWRlIGNsYXNzZXMgZm9yIHN0cmVhbWluZyBjb21wcmVzc2VkIGRhdGEgaW4gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBbZGVmYXVsdD1jaGVja10KKyAgLS13aXRoLXByb3RvYz1DT01NQU5EICAgdXNlIHRoZSBnaXZlbiBwcm90b2MgY29tbWFuZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9uZSB3aGVuIGJ1aWxkaW5nIHRlc3RzICh1c2VmdWwgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzLWNvbXBpbGluZykKKyAgLS13aXRoLXBpY1s9UEtHU10gICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgW2RlZmF1bHQ9dXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhdCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10KKyAgLS13aXRoLXN5c3Jvb3Q9RElSIFNlYXJjaCBmb3IgZGVwZW5kZW50IGxpYnJhcmllcyB3aXRoaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAob3IgdGhlIGNvbXBpbGVyJ3Mgc3lzcm9vdCBpZiBub3Qgc3BlY2lmaWVkKS4KKworU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisgIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQorICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+CisgIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KKyAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgorICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KKyAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ1hYRkxBR1MgICAgQysrIGNvbXBpbGVyIGZsYWdzCisgIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKKworVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKworUmVwb3J0IGJ1Z3MgdG8gPHByb3RvYnVmQGdvb2dsZWdyb3Vwcy5jb20+LgorX0FDRU9GCithY19zdGF0dXM9JD8KK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorUHJvdG9jb2wgQnVmZmVycyBjb25maWd1cmUgMi41LjAKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OAorCitDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorX0FDRU9GCisgIGV4aXQKK2ZpCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jb21waWxlCisKKyMgYWNfZm5fY3h4X3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2N4eF90cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jeHhfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2N4eF90cnlfY3BwICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgIGFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2NwcAorCisjIGFjX2ZuX2N4eF9jaGVja19oZWFkZXJfbW9uZ3JlbCBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZworIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY3h4X2NoZWNrX2hlYWRlcl9tb25ncmVsICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorI2luY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHByZXNlbmNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHByZXNlbmNlLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAorICB5ZXM6bm86ICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorKCAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gcHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbSAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPVwkYWNfaGVhZGVyX2NvbXBpbGVyIgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jeHhfY2hlY2tfaGVhZGVyX21vbmdyZWwKKworIyBhY19mbl9jeHhfdHJ5X3J1biBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcworIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KK2FjX2ZuX2N4eF90cnlfcnVuICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCitmaQorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2N4eF90cnlfcnVuCisKKyMgYWNfZm5fY3h4X2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY3h4X2NoZWNrX2hlYWRlcl9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY3h4X2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY3h4X2NoZWNrX2RlY2wgTElORU5PIFNZTUJPTCBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBTWU1CT0wgaXMgZGVjbGFyZWQgaW4gSU5DTFVERVMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY3h4X2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAorICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CisjaWZuZGVmICRhc19kZWNsX25hbWUKKyNpZmRlZiBfX2NwbHVzcGx1cworICAodm9pZCkgJGFzX2RlY2xfdXNlOworI2Vsc2UKKyAgKHZvaWQpICRhc19kZWNsX25hbWU7CisjZW5kaWYKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2N4eF9jaGVja19kZWNsCisKKyMgYWNfZm5fY190cnlfbGluayBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfbGluayAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgorICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCisgICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCisgICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9saW5rCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cyBhbmQgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluCisjIElOQ0xVREVTLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUKKworIyBhY19mbl9jX2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBGVU5DIGV4aXN0cywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5CithY19mbl9jX2NoZWNrX2Z1bmMgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfZnVuYworCisjIGFjX2ZuX2N4eF90cnlfbGluayBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jeHhfdHJ5X2xpbmsgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgorICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCisgICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCisgICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2xpbmsKKworIyBhY19mbl9jeHhfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgRlVOQyBleGlzdHMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseQorYWNfZm5fY3h4X2NoZWNrX2Z1bmMgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY3h4X2NoZWNrX2Z1bmMKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IFByb3RvY29sIEJ1ZmZlcnMgJGFzX21lIDIuNS4wLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqXCcqKQorICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKK3sgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KK3sgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCisjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispCisgICAgZWNobworCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgICBjYXNlICRhY192YWwgaW4KKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKyAgICAgIGVzYWMKKyAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICBkb25lIHwgc29ydAorICAgIGVjaG8KKworICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKyAgICAgIGRvCisJZXZhbCBhY192YWw9XCQkYWNfdmFyCisJY2FzZSAkYWNfdmFsIGluCisJKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworCWVzYWMKKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgY2F0IGNvbmZkZWZzLmgKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCisgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAorCiskYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2FjX3NpdGVfZmlsZTE9Tk9ORQorYWNfc2l0ZV9maWxlMj1OT05FCitpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCisgICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCisgIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAorICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CisgICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgZXNhYworZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIiBcCisgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKKyAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KKwlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKKwlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKwlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBhY19jYWNoZV9jb3JydXB0ZWQ9OgorCWVsc2UKKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CisgICAgZXNhYworICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCisgICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7CisgICAgZXNhYworICBmaQorZG9uZQoraWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKK2ZpCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcy4uLiAiID4mNjsgfQorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbWFpbnRhaW5lcl9tb2RlOyBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMKK2ZpCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVU0VfTUFJTlRBSU5FUl9NT0RFIiA+JjUKKyRhc19lY2hvICIkVVNFX01BSU5UQUlORVJfTU9ERSIgPiY2OyB9CisgICBpZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPQorICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCitlbHNlCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJworICBNQUlOVEFJTkVSX01PREVfRkFMU0U9CitmaQorCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorCisKKworCithY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGNvbmZpZy5oIgorCisKKworIyBhdXRvY29uZidzIGRlZmF1bHQgQ1hYRkxBR1MgYXJlIHVzdWFsbHkgIi1nIC1PMiIuICBUaGVzZSBhcmVuJ3QgbmVjZXNzYXJpbHkKKyMgdGhlIGJlc3QgY2hvaWNlIGZvciBsaWJwcm90b2J1Zi4KK2lmIHRlc3QgIngke2FjX2N2X2Vudl9DRkxBR1Nfc2V0fSIgPSAieCI7IHRoZW4gOgorICBDRkxBR1M9IiIKK2ZpCitpZiB0ZXN0ICJ4JHthY19jdl9lbnZfQ1hYRkxBR1Nfc2V0fSIgPSAieCI7IHRoZW4gOgorICBDWFhGTEFHUz0iIgorZmkKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCisgIGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC1zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBpbnN0YWxsLXNoLCBpbnN0YWxsLnNoLCBvciBzaHRvb2wgaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiICIkTElORU5PIiA1CitmaQorCisjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKyMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KKyMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQorIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5FTk8iIDUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9idWlsZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKK2FjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQorY2FzZSAkYWNfY3ZfYnVpbGQgaW4KKyotKi0qKSA7OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNTs7Citlc2FjCitidWlsZD0kYWNfY3ZfYnVpbGQKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl9idWlsZAorc2hpZnQKK2J1aWxkX2NwdT0kMQorYnVpbGRfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgorYnVpbGRfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaG9zdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCisgIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCitlbHNlCisgIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxpYXNgIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2hvc3QgaW4KKyotKi0qKSA7OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiICIkTElORU5PIiA1OzsKK2VzYWMKK2hvc3Q9JGFjX2N2X2hvc3QKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl9ob3N0CitzaGlmdAoraG9zdF9jcHU9JDEKK2hvc3RfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgoraG9zdF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfdGFyZ2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCR0YXJnZXRfYWxpYXMiID0geDsgdGhlbgorICBhY19jdl90YXJnZXQ9JGFjX2N2X2hvc3QKK2Vsc2UKKyAgYWNfY3ZfdGFyZ2V0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICR0YXJnZXRfYWxpYXNgIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICR0YXJnZXRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdGFyZ2V0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdGFyZ2V0IiA+JjY7IH0KK2Nhc2UgJGFjX2N2X3RhcmdldCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgdGFyZ2V0IiAiJExJTkVOTyIgNTs7Citlc2FjCit0YXJnZXQ9JGFjX2N2X3RhcmdldAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X3RhcmdldAorc2hpZnQKK3RhcmdldF9jcHU9JDEKK3RhcmdldF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Cit0YXJnZXRfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJHRhcmdldF9vcyBpbiAqXCAqKSB0YXJnZXRfb3M9YGVjaG8gIiR0YXJnZXRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgordGVzdCAtbiAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworYW1fX2FwaV92ZXJzaW9uPScxLjExJworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCisjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4gIygoCisgIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bworCSAgICBta2RpciBjb25mdGVzdC5kaXIKKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworCSAgICB0aGVuCisJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICAgIGJyZWFrIDMKKwkgICAgZmkKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKKworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK3JtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAiID4mNjsgfQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBSZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMgaW4gJHNyY2RpciBvciB0aGUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkKKyMgbmFtZS4gIEFjY2VwdCBzcGFjZSBhbmQgdGFiIG9ubHkgaW4gdGhlIGxhdHRlci4KK2FtX2xmPScKKycKK2Nhc2UgYHB3ZGAgaW4KKyAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZl0qKQorICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnNhZmUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZSIgIiRMSU5FTk8iIDU7OworZXNhYworY2FzZSAkc3JjZGlyIGluCisgICpbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXSopCisgICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBzcmNkaXIgdmFsdWU6IFxgJHNyY2RpciciICIkTElORU5PIiA1OzsKK2VzYWMKKworIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKKyAgIGZpCisgICBybSAtZiBjb25mdGVzdC5maWxlCisgICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAiJExJTkVOTyIgNQorICAgZmkKKworICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIGFzX2ZuX2Vycm9yICQ/ICJuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAiJExJTkVOTyIgNQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9Cit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIERvdWJsZSBhbnkgXCBvciAkLgorIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KK2FjX3NjcmlwdD0ncy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLycKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9YCRhc19lY2hvICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgfCBzZWQgIiRhY19zY3JpcHQiYAorCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCisKK2lmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKKyAgKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKKyAgZXNhYworZmkKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiYyO30KK2ZpCisKK2lmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKKyAgKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKKyAgZXNhYworZmkKKworIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCisjIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCisjIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitTVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKKyRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgorICBhY19jdF9TVFJJUD0kU1RSSVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgorICAgIFNUUklQPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFNUUklQPSRhY19jdF9TVFJJUAorICBmaQorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCisgIGlmICR7YWNfY3ZfcGF0aF9ta2Rpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBta2RpciBnbWtkaXI7IGRvCisJIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCSAgIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH0gfHwgY29udGludWUKKwkgICBjYXNlIGAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLS12ZXJzaW9uIDI+JjFgIGluICMoCisJICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChmaWxldXRpbHMpICc0LjEqKQorCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKKwkgICAgICAgYnJlYWsgMzs7CisJICAgZXNhYworCSBkb25lCisgICAgICAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCisKKyAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBNS0RJUl9QPSIkYWNfY3ZfcGF0aF9ta2RpciAtcCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBNS0RJUl9QIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgTUtESVJfUD0iJGFjX2luc3RhbGxfc2ggLWQiCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKKyRhc19lY2hvICIkTUtESVJfUCIgPiY2OyB9CisKK21rZGlyX3A9IiRNS0RJUl9QIgorY2FzZSAkbWtkaXJfcCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSopIDs7CisgICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKK2VzYWMKKworZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKKyRhc19lY2hvICIkQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KK3NldCB4ICR7TUFLRS1tYWtlfQorYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCitpZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKK1NIRUxMID0gL2Jpbi9zaAorYWxsOgorCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2Nhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgorICAqQEBAJSUlPT8qPUBAQCUlJSopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKKyAgKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Citlc2FjCitybSAtZiBjb25mdGVzdC5tYWtlCitmaQoraWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgIFNFVF9NQUtFPQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworcm0gLXJmIC50c3QgMj4vZGV2L251bGwKK21rZGlyIC50c3QgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLnRzdDsgdGhlbgorICBhbV9fbGVhZGluZ19kb3Q9LgorZWxzZQorICBhbV9fbGVhZGluZ19kb3Q9XworZmkKK3JtZGlyIC50c3QgMj4vZGV2L251bGwKKworaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgorICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAorICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCisgIGFtX19pc3JjPScgLUkkKHNyY2RpciknCisgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAorICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKKyAgZmkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCisKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorIFBBQ0tBR0U9J3Byb3RvYnVmJworIFZFUlNJT049JzIuNS4wJworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorX0FDRU9GCisKKyMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KKworQUNMT0NBTD0ke0FDTE9DQUwtIiR7YW1fbWlzc2luZ19ydW59YWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0ifQorCisKK0FVVE9DT05GPSR7QVVUT0NPTkYtIiR7YW1fbWlzc2luZ19ydW59YXV0b2NvbmYifQorCisKK0FVVE9NQUtFPSR7QVVUT01BS0UtIiR7YW1fbWlzc2luZ19ydW59YXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259In0KKworCitBVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KKworCitNQUtFSU5GTz0ke01BS0VJTkZPLSIke2FtX21pc3NpbmdfcnVufW1ha2VpbmZvIn0KKworIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCisjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAorIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCitBTVRBUj0nJCR7VEFSLXRhcn0nCisKK2FtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nCisKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtemxpYiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfemxpYitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfemxpYjsKK2Vsc2UKKyAgd2l0aF96bGliPWNoZWNrCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wcm90b2Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3Byb3RvYytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcHJvdG9jOworZWxzZQorICB3aXRoX3Byb3RvYz1ubworZmkKKworCisjIENoZWNrcyBmb3IgcHJvZ3JhbXMuCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICBmaQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisKKyMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKK2FjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCisKK2FjX3JtZmlsZXM9Citmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKK2RvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisgIGVzYWMKK2RvbmUKK3JtIC1mICRhY19ybWZpbGVzCisKK2lmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworIyBBdXRvY29uZi4KK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKwl0aGVuIDo7IGVsc2UKKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwlmaQorCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAorCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJworCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgorCSMgYWN0dWFsbHkgd29ya2luZy4KKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCit0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KKworZWxzZQorICBhY19maWxlPScnCitmaQoraWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiskYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9CithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorCitybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9CitpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQorIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorIyBgcm0nLgorZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKKyByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCisjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bm8KKyAgZWxzZQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKwljcm9zc19jb21waWxpbmc9eWVzCisgICAgZWxzZQorCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgICBmaQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jY19nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6CisKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK0RFUERJUj0iJHthbV9fbGVhZGluZ19kb3R9ZGVwcyIKKworYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlcGZpbGVzIgorCisKK2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCithbV9fZG9pdDoKKwlAZWNobyB0aGlzIGlzIHRoZSBhbV9fZG9pdCB0YXJnZXQKKy5QSE9OWTogYW1fX2RvaXQKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UuLi4gIiA+JjY7IH0KK2FtX19pbmNsdWRlPSIjIgorYW1fX3F1b3RlPQorX2FtX3Jlc3VsdD1ub25lCisjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgorZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgorIyBJZ25vcmUgYWxsIGtpbmRzIG9mIGFkZGl0aW9uYWwgb3V0cHV0IGZyb20gYG1ha2UnLgorY2FzZSBgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAgaW4gIygKKyp0aGVcIGFtX19kb2l0XCB0YXJnZXQqKQorICBhbV9faW5jbHVkZT1pbmNsdWRlCisgIGFtX19xdW90ZT0KKyAgX2FtX3Jlc3VsdD1HTlUKKyAgOzsKK2VzYWMKKyMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgoraWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgorICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgorICAgY2FzZSBgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAgaW4gIygKKyAgICp0aGVcIGFtX19kb2l0XCB0YXJnZXQqKQorICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQorICAgICBhbV9fcXVvdGU9IlwiIgorICAgICBfYW1fcmVzdWx0PUJTRAorICAgICA7OworICAgZXNhYworZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRfYW1fcmVzdWx0IiA+JjY7IH0KK3JtIC1mIGNvbmZpbmMgY29uZm1mCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworICBhbV9fbm9kZXA9J19ubycKK2ZpCisgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIEFNREVQX1RSVUU9CisgIEFNREVQX0ZBTFNFPScjJworZWxzZQorICBBTURFUF9UUlVFPScjJworICBBTURFUF9GQUxTRT0KK2ZpCisKKworCitkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKKyAgZmkKKyAgYW1fX3VuaXZlcnNhbD1mYWxzZQorICBjYXNlICIgJGRlcGNjICIgaW4gIygKKyAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKKyAgICAgZXNhYworCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgZ2NjKQorICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KKyAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCisgICAgICA7OworICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CitpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgorICAgIENYWD0kQ0NDCisgIGVsc2UKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ1hYPSIkQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDWFg9JGFjX2N2X3Byb2dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWCIgPiY1CiskYXNfZWNobyAiJENYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGFjX2N0X0NYWD0kQ1hYCisgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKK2lmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ1hYIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NYWCIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCisgICAgQ1hYPSJnKysiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ1hYPSRhY19jdF9DWFgKKyAgZmkKK2ZpCisKKyAgZmkKK2ZpCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2N4eF9jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2N4eF9jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR1hYPXllcworZWxzZQorICBHWFg9CitmaQorYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KK2FjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY3h4X2crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19zYXZlX2N4eF93ZXJyb3JfZmxhZz0kYWNfY3h4X3dlcnJvcl9mbGFnCisgICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2N4eF9nPW5vCisgICBDWFhGTEFHUz0iLWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZWxzZQorICBDWFhGTEFHUz0iIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCisJIENYWEZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY3h4X2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2N4eF9nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgorICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9CisgIGZpCitmaQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCisgICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCisgICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgorICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQorICAgICAgYW1fX21pbnVzX29iaj0KKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NYWERFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCisKKyBpZgorICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0KKyAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9JyMnCitlbHNlCisgIGFtX19mYXN0ZGVwQ1hYX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ1hYX0ZBTFNFPQorZmkKKworCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KKyAgaWYgJHthY19jdl9wcm9nX0NYWENQUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCisKK2ZpCisgIENYWENQUD0kYWNfY3ZfcHJvZ19DWFhDUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1hYQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCitjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCitjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKKyAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorZmkKKworICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgorZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCisJCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jeHhfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisKKyAgYWNfZm5fY3h4X2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibWluaXgvY29uZmlnLmgiICJhY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX21pbml4X2NvbmZpZ19oIiA9IHh5ZXM7IHRoZW4gOgorICBNSU5JWD15ZXMKK2Vsc2UKKyAgTUlOSVg9CitmaQorCisKKyAgaWYgdGVzdCAiJE1JTklYIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBfUE9TSVhfU09VUkNFIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIF9QT1NJWF8xX1NPVVJDRSAyIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBfTUlOSVggMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBpdCBpcyBzYWZlIHRvIGRlZmluZSBfX0VYVEVOU0lPTlNfXyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gZGVmaW5lIF9fRVhURU5TSU9OU19fLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCSAgZGVmaW5lIF9fRVhURU5TSU9OU19fIDEKKwkgICRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX189eWVzCitlbHNlCisgIGFjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fIiA+JjY7IH0KKyAgdGVzdCAkYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX18gPSB5ZXMgJiYKKyAgICAkYXNfZWNobyAiI2RlZmluZSBfX0VYVEVOU0lPTlNfXyAxIiA+PmNvbmZkZWZzLmgKKworICAkYXNfZWNobyAiI2RlZmluZSBfQUxMX1NPVVJDRSAxIiA+PmNvbmZkZWZzLmgKKworICAkYXNfZWNobyAiI2RlZmluZSBfR05VX1NPVVJDRSAxIiA+PmNvbmZkZWZzLmgKKworICAkYXNfZWNobyAiI2RlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMSIgPj5jb25mZGVmcy5oCisKKyAgJGFzX2VjaG8gIiNkZWZpbmUgX1RBTkRFTV9TT1VSQ0UgMSIgPj5jb25mZGVmcy5oCisKKworCisKKworCisKKyBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBHQ0NfVFJVRT0KKyAgR0NDX0ZBTFNFPScjJworZWxzZQorICBHQ0NfVFJVRT0nIycKKyAgR0NDX0ZBTFNFPQorZmkKKyAgICMgbGV0IHRoZSBNYWtlZmlsZSBrbm93IGlmIHdlJ3JlIGdjYworCisjIHRlc3RfdXRpbC5jYyB0YWtlcyBmb3JldmVyIHRvIGNvbXBpbGUgd2l0aCBHQ0MgYW5kIG9wdGltaXphdGlvbiB0dXJuZWQgb24uCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEMrKyBjb21waWxlciBmbGFncy4uLiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBDKysgY29tcGlsZXIgZmxhZ3MuLi4uLi4gIiA+JjY7IH0KK2lmIHRlc3QgIngke2FjX2N2X2Vudl9DWFhGTEFHU19zZXR9IiA9ICJ4IjsgdGhlbiA6CisKKyAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIjsgdGhlbiA6CisKKyAgICBQUk9UT0JVRl9PUFRfRkxBRz0iLU8yIgorICAgIENYWEZMQUdTPSIke0NYWEZMQUdTfSAtZyIKKworZmkKKworICAjIFByb3RvY29sIEJ1ZmZlcnMgY29udGFpbnMgc2V2ZXJhbCBjaGVja3MgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5CisgICMgZm9yIGRlYnVnZ2luZyBhbmQgd2hpY2ggbWlnaHQgaHVydCBwZXJmb3JtYW5jZS4gIE1vc3QgdXNlcnMgYXJlIHByb2JhYmx5CisgICMgZW5kIHVzZXJzIHdobyBkb24ndCB3YW50IHRoZXNlIGNoZWNrcywgc28gYWRkIC1ETkRFQlVHIGJ5IGRlZmF1bHQuCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLUROREVCVUciCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVzZSBkZWZhdWx0OiAkUFJPVE9CVUZfT1BUX0ZMQUcgJENYWEZMQUdTIiA+JjUKKyRhc19lY2hvICJ1c2UgZGVmYXVsdDogJFBST1RPQlVGX09QVF9GTEFHICRDWFhGTEFHUyIgPiY2OyB9CisKK2Vsc2UKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdXNlIHVzZXItc3VwcGxpZWQ6ICRDWFhGTEFHUyIgPiY1CiskYXNfZWNobyAidXNlIHVzZXItc3VwcGxpZWQ6ICRDWFhGTEFHUyIgPiY2OyB9CisKK2ZpCisKKworCisKKworICBhY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisgIGFjX2ZuX2N4eF9jaGVja19kZWNsICIkTElORU5PIiAiX19TVU5QUk9fQ0MiICJhY19jdl9oYXZlX2RlY2xfX19TVU5QUk9fQ0MiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX19fU1VOUFJPX0NDIiA9IHh5ZXM7IHRoZW4gOgorICBTVU5DQz0ieWVzIgorZWxzZQorICBTVU5DQz0ibm8iCitmaQorCisgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworCisgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS02NGJpdC1zb2xhcmlzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlXzY0Yml0X3NvbGFyaXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV82NGJpdF9zb2xhcmlzOyBhY19lbmFibGVfNjRiaXQ9IiRlbmFibGV2YWwiCitlbHNlCisgIGFjX2VuYWJsZV82NGJpdD0ieWVzIgorZmkKKworCisgIGlmIHRlc3QgIiRTVU5DQyIgPSAieWVzIiAtYSAieCR7YWNfY3ZfZW52X0NYWEZMQUdTX3NldH0iID0gIngiOyB0aGVuIDoKKworICAgICAgICAgICAgQ1hYRkxBR1M9Ii1nMCAteE8zIC14bGlibWlsIC14ZGVwZW5kIC14YnVpbHRpbiAtbXQgLWNvbXBhdD01IC1saWJyYXJ5PXN0bHBvcnQ0IC1saWJyYXJ5PUNydW4gLXRlbXBsYXRlPW5vJWV4dGRlZiAke0NYWEZMQUdTfSIKKworZmkKKworICBjYXNlICRob3N0X29zIGluCisgICAgKnNvbGFyaXMqKQorICAgICAgZm9yIGFjX3Byb2cgaW4gaXNhaW5mbworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0lTQUlORk8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkSVNBSU5GTyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19JU0FJTkZPPSIkSVNBSU5GTyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0lTQUlORk89IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0lTQUlORk89JGFjX2N2X3Byb2dfSVNBSU5GTworaWYgdGVzdCAtbiAiJElTQUlORk8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSVNBSU5GTyIgPiY1CiskYXNfZWNobyAiJElTQUlORk8iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkSVNBSU5GTyIgJiYgYnJlYWsKK2RvbmUKK3Rlc3QgLW4gIiRJU0FJTkZPIiB8fCBJU0FJTkZPPSJubyIKKworICAgICAgaWYgdGVzdCAieCRJU0FJTkZPIiAhPSAieG5vIjsgdGhlbiA6CisgIGlzYWluZm9fYj1gJHtJU0FJTkZPfSAtYmAKK2Vsc2UKKyAgaXNhaW5mb19iPSJ4IgorZmkKKworICAgICAgaWYgdGVzdCAiJGlzYWluZm9fYiIgIT0gIngiOyB0aGVuIDoKKworCisgICAgICAgIGlzYWluZm9faz1gJHtJU0FJTkZPfSAta2AKKworICAgICAgICBpZiB0ZXN0ICJ4JGFjX2VuYWJsZV82NGJpdCIgPSAieHllcyI7IHRoZW4gOgorCisKKyAgICAgICAgICBpZiB0ZXN0ICJ4JGxpYmRpciIgPSAieFwke2V4ZWNfcHJlZml4fS9saWIiOyB0aGVuIDoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliZGlyPSIke2xpYmRpcn0vJHtpc2FpbmZvX2t9IgorCitmaQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCR7YWNfY3ZfZW52X0NYWEZMQUdTX3NldH0iID0gIngiOyB0aGVuIDoKKworICAgICAgICAgICAgQ1hYRkxBR1M9IiR7Q1hYRkxBR1N9IC1tNjQiCisgICAgICAgICAgICBhY19jdl9lbnZfQ1hYRkxBR1Nfc2V0PXNldAorICAgICAgICAgICAgYWNfY3ZfZW52X0NYWEZMQUdTX3ZhbHVlPSctbTY0JworCitmaQorCisgICAgICAgICAgaWYgdGVzdCAieCR7YWNfY3ZfZW52X0NGTEFHU19zZXR9IiA9ICJ4IjsgdGhlbiA6CisKKyAgICAgICAgICAgIENGTEFHUz0iJHtDRkxBR1N9IC1tNjQiCisgICAgICAgICAgICBhY19jdl9lbnZfQ0ZMQUdTX3NldD1zZXQKKyAgICAgICAgICAgIGFjX2N2X2Vudl9DRkxBR1NfdmFsdWU9Jy1tNjQnCisKK2ZpCisKKyAgICAgICAgICBpZiB0ZXN0ICIkdGFyZ2V0X2NwdSIgPSAic3BhcmMiIC1hICJ4JFNVTkNDIiA9ICJ4eWVzIiA7IHRoZW4gOgorCisgICAgICAgICAgICBDWFhGTEFHUz0iLXhtZW1hbGlnbj04cyAke0NYWEZMQUdTfSIKKworZmkKKworZmkKKworZmkKKyAgICA7OworICBlc2FjCisKKworCisjIEhhdmUgdG8gZG8gbGlidG9vbCBhZnRlciBTVU5DQywgb3RoZXIgd2lzZSBpdCAiaGVscGZ1bGx5IiBhZGRzIENydW4gQ3N0ZAorIyB0byB0aGUgbGluaworY2FzZSBgcHdkYCBpbgorICAqXCAqIHwgKlwJKikKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IExpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBcYHB3ZFxgIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IExpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBcYHB3ZFxgIiA+JjI7fSA7OworZXNhYworCisKKworbWFjcm9fdmVyc2lvbj0nMi40LjInCittYWNyb19yZXZpc2lvbj0nMS4zMzM3JworCisKKworCisKKworCisKKworCisKKworCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBCYWNrc2xhc2hpZnkgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbgorIyBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbImAkXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworCitFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzLi4uICIgPiY2OyB9CisjIFRlc3QgcHJpbnQgZmlyc3QsIGJlY2F1c2UgaXQgd2lsbCBiZSBhIGJ1aWx0aW4gaWYgcHJlc2VudC4KK2lmIHRlc3QgIlhgKCBwcmludCAtciAtLSAtbiApIDI+L2Rldi9udWxsYCIgPSBYLW4gJiYgXAorICAgdGVzdCAiWGBwcmludCAtciAtLSAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnQgLXIgLS0nCitlbGlmIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludGYgJXNcbicKK2Vsc2UKKyAgIyBVc2UgdGhpcyBmdW5jdGlvbiBhcyBhIGZhbGxiYWNrIHRoYXQgYWx3YXlzIHdvcmtzLgorICBmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKKyAgeworICAgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskMQorX0xURUNIT19FT0YnCisgIH0KKyAgRUNITz0nZnVuY19mYWxsYmFja19lY2hvJworZmkKKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIiCit9CisKK2Nhc2UgIiRFQ0hPIiBpbgorICBwcmludGYqKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogcHJpbnRmIiA+JjUKKyRhc19lY2hvICJwcmludGYiID4mNjsgfSA7OworICBwcmludCopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBwcmludCAtciIgPiY1CiskYXNfZWNobyAicHJpbnQgLXIiID4mNjsgfSA7OworICAqKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY2F0IiA+JjUKKyRhc19lY2hvICJjYXQiID4mNjsgfSA7OworZXNhYworCisKKworCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1NFRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAgICAgICBhY19zY3JpcHQ9cy9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIvCisgICAgIGZvciBhY19pIGluIDEgMiAzIDQgNSA2IDc7IGRvCisgICAgICAgYWNfc2NyaXB0PSIkYWNfc2NyaXB0JGFzX25sJGFjX3NjcmlwdCIKKyAgICAgZG9uZQorICAgICBlY2hvICIkYWNfc2NyaXB0IiAyPi9kZXYvbnVsbCB8IHNlZCA5OXEgPmNvbmZ0ZXN0LnNlZAorICAgICB7IGFjX3NjcmlwdD07IHVuc2V0IGFjX3NjcmlwdDt9CisgICAgIGlmIHRlc3QgLXogIiRTRUQiOyB0aGVuCisgIGFjX3BhdGhfU0VEX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfU0VEPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9TRUQiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX1NFRCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX1NFRCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfU0VECitjYXNlIGAiJGFjX3BhdGhfU0VEIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX1NFRD0iJGFjX3BhdGhfU0VEIiBhY19wYXRoX1NFRF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX1NFRCIgLWYgY29uZnRlc3Quc2VkIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9TRURfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9TRUQiCisgICAgICBhY19wYXRoX1NFRF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX1NFRF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfU0VEIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIHNlZCBjb3VsZCBiZSBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfU0VEPSRTRUQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfU0VEIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9TRUQiID4mNjsgfQorIFNFRD0iJGFjX2N2X3BhdGhfU0VEIgorICBybSAtZiBjb25mdGVzdC5zZWQKKwordGVzdCAteiAiJFNFRCIgJiYgU0VEPXNlZAorWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgorCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBmZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0ZHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyAnYWIqYycgfCAkR1JFUCAtRiAnYWIqYycgPi9kZXYvbnVsbCAyPiYxCisgICB0aGVuIGFjX2N2X3BhdGhfRkdSRVA9IiRHUkVQIC1GIgorICAgZWxzZQorICAgICBpZiB0ZXN0IC16ICIkRkdSRVAiOyB0aGVuCisgIGFjX3BhdGhfRkdSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBmZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfRkdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0ZHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9GR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0ZHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9GR1JFUAorY2FzZSBgIiRhY19wYXRoX0ZHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0ZHUkVQPSIkYWNfcGF0aF9GR1JFUCIgYWNfcGF0aF9GR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnRkdSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfRkdSRVAiIEZHUkVQIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9GR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9GR1JFUD0iJGFjX3BhdGhfRkdSRVAiCisgICAgICBhY19wYXRoX0ZHUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfRkdSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0ZHUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGZncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9GR1JFUD0kRkdSRVAKK2ZpCisKKyAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0ZHUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9GR1JFUCIgPiY2OyB9CisgRkdSRVA9IiRhY19jdl9wYXRoX0ZHUkVQIgorCisKK3Rlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gIiA+JjY7IH0KKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gJEVDSE8gIiRhY19wcm9nInwgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSAkRUNITyAiJGFjX3Byb2ciIHwgJEdSRVAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gJEVDSE8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gIiA+JjY7IH0KK2ZpCitpZiAke2x0X2N2X3BhdGhfTEQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEIiA+JjUKKyRhc19lY2hvICIkTEQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCit0ZXN0IC16ICIkTEQiICYmIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19nbnVfbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfZ251X2xkIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNjsgfQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSkuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9OTSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgorICBmaQorICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKKyAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKwkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKwkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKwljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCSAgYnJlYWsKKwkgIDs7CisJKikKKwkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSAgKi9kZXYvbnVsbCopCisJICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICAgIGJyZWFrCisJICAgIDs7CisJICAqKQorCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgZG9uZQorICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX05NIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcGF0aF9OTSIgPiY2OyB9CitpZiB0ZXN0ICIkbHRfY3ZfcGF0aF9OTSIgIT0gIm5vIjsgdGhlbgorICBOTT0iJGx0X2N2X3BhdGhfTk0iCitlbHNlCisgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgorICBpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4gOgorICAgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBlbHNlCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBkdW1wYmluICJsaW5rIC1kdW1wIgorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19EVU1QQklOKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuCisgIGFjX2N2X3Byb2dfRFVNUEJJTj0iJERVTVBCSU4iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19EVU1QQklOPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitEVU1QQklOPSRhY19jdl9wcm9nX0RVTVBCSU4KK2lmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERVTVBCSU4iID4mNQorJGFzX2VjaG8gIiREVU1QQklOIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkRFVNUEJJTiIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiREVU1QQklOIjsgdGhlbgorICBhY19jdF9EVU1QQklOPSREVU1QQklOCisgIGZvciBhY19wcm9nIGluIGR1bXBiaW4gImxpbmsgLWR1bXAiCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU49IiRhY19jdF9EVU1QQklOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTj0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRFVNUEJJTj0kYWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOCitpZiB0ZXN0IC1uICIkYWNfY3RfRFVNUEJJTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9EVU1QQklOIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRFVNUEJJTiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfRFVNUEJJTiIgPSB4OyB0aGVuCisgICAgRFVNUEJJTj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBEVU1QQklOPSRhY19jdF9EVU1QQklOCisgIGZpCitmaQorCisgICAgY2FzZSBgJERVTVBCSU4gLXN5bWJvbHMgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKyAgICAqQ09GRiopCisgICAgICBEVU1QQklOPSIkRFVNUEJJTiAtc3ltYm9scyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIERVTVBCSU49OgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9ubV9pbnRlcmZhY2UrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkYWNfY29tcGlsZVwiIiA+JjUpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkTk0gXFxcImNvbmZ0ZXN0LiRhY19vYmpleHRcXFwiXCIiID4mNSkKKyAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiBvdXRwdXRcIiIgPiY1KQorICBjYXQgY29uZnRlc3Qub3V0ID4mNQorICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAiID4mNjsgfQorTE5fUz0kYXNfbG5fcworaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKKyRhc19lY2hvICJubywgdXNpbmcgJExOX1MiID4mNjsgfQorZmkKKworIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3N5c19tYXhfY21kX2xlbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG1pbnQqKQorICAgICMgT24gTWlOVCB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3MyKikKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGEgbG9uZyB0aW1lIG9uIE9TLzIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTIKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKlsJIF0vLydgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4CisgICAgZmkKKyAgICA7OworICAqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gKGdldGNvbmYgQVJHX01BWCkgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICBlbHNlCisgICAgICAjIE1ha2UgdGVzdHN0cmluZyBhIGxpdHRsZSBiaWdnZXIgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggaXQuCisgICAgICAjIGEgMUsgc3RyaW5nIHNob3VsZCBiZSBhIHJlYXNvbmFibGUgc3RhcnQuCisgICAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOyBkbworICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQorICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKKyAgICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICAgIHdoaWxlIHsgdGVzdCAiWCJgZW52IGVjaG8gIiR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCisJICAgICAgICAgPSAiWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciOyB9ID4vZGV2L251bGwgMj4mMSAmJgorCSAgICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAorICAgICAgZG8KKyAgICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgIyBPbmx5IGNoZWNrIHRoZSBzdHJpbmcgbGVuZ3RoIG91dHNpZGUgdGhlIGxvb3AuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgCisgICAgICB0ZXN0c3RyaW5nPQorICAgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbgorICAgICAgIyBtYXNzaXZlIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUKKyAgICAgICMgbGlua2VyLiAgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKworZmkKKworaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIiA+JjUKKyRhc19lY2hvICJub25lIiA+JjY7IH0KK2ZpCittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKworCisKKworCis6ICR7Q1A9ImNwIC1mIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgc29tZSBYU0kgY29uc3RydWN0cyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzLi4uICIgPiY2OyB9CisjIFRyeSBzb21lIFhTSSBmZWF0dXJlcworeHNpX3NoZWxsPW5vCisoIF9sdF9kdW1teT0iYS9iL2MiCisgIHRlc3QgIiR7X2x0X2R1bW15IyMqL30sJHtfbHRfZHVtbXklLyp9LCR7X2x0X2R1bW15Iz8/fSIke19sdF9kdW1teSUiJF9sdF9kdW1teSJ9LCBcCisgICAgICA9IGMsYS9iLGIvYywgXAorICAgICYmIGV2YWwgJ3Rlc3QgJCgoIDEgKyAxICkpIC1lcSAyIFwKKyAgICAmJiB0ZXN0ICIkeyNfbHRfZHVtbXl9IiAtZXEgNScgKSA+L2Rldi9udWxsIDI+JjEgXAorICAmJiB4c2lfc2hlbGw9eWVzCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHhzaV9zaGVsbCIgPiY1CiskYXNfZWNobyAiJHhzaV9zaGVsbCIgPiY2OyB9CisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBcIis9XCIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgXCIrPVwiLi4uICIgPiY2OyB9CitsdF9zaGVsbF9hcHBlbmQ9bm8KKyggZm9vPWJhcjsgc2V0IGZvbyBiYXo7IGV2YWwgIiQxKz1cJDIiICYmIHRlc3QgIiRmb28iID0gYmFyYmF6ICkgXAorICAgID4vZGV2L251bGwgMj4mMSBcCisgICYmIGx0X3NoZWxsX2FwcGVuZD15ZXMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfc2hlbGxfYXBwZW5kIiA+JjUKKyRhc19lY2hvICIkbHRfc2hlbGxfYXBwZW5kIiA+JjY7IH0KKworCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgbHRfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgbHRfdW5zZXQ9ZmFsc2UKK2ZpCisKKworCisKKworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJworICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIGx0X1NQMk5MPSd0ciBcMTAwIFxuJworICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl90b19ob3N0X2ZpbGVfY21kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqLSotY3lnd2luKiApCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMgorICAgICAgICA7OworICAgICAgKiApICMgb3RoZXJ3aXNlLCBhc3N1bWUgKm5peAorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25peF90b193MzIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgKi0qLWN5Z3dpbiogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4KKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqICkgIyB1bmhhbmRsZWQgaG9zdHMgKGFuZCAibm9ybWFsIiBuYXRpdmUgYnVpbGRzKQorICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorICAgIDs7Citlc2FjCisKK2ZpCisKK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQiID4mNjsgfQorCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gdG9vbGNoYWluIGZvcm1hdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjYXNzdW1lIG9yZGluYXJ5IGNyb3NzIHRvb2xzLCBvciBuYXRpdmUgYnVpbGQuCitsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKK2Nhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworZXNhYworCitmaQorCit0b190b29sX2ZpbGVfY21kPSRsdF9jdl90b190b29sX2ZpbGVfY21kCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl90b190b29sX2ZpbGVfY21kIiA+JjY7IH0KKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9sZF9yZWxvYWRfZmxhZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnPSctcicKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNjsgfQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPWZhbHNlCisgICAgZmkKKyAgICA7OworICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKKworCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK09CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAoraWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1CiskYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCisgIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAoraWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KKyAgICBPQkpEVU1QPSJmYWxzZSIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCisgIGZpCitlbHNlCisgIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCitmaQorCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXhbNC05XSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpWzQ1XSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKKyAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGFzc3VtZXMgQlNEIG5tLCBzbyBkaXNhbGxvdyBpdCBpZiB1c2luZyBNUyBkdW1wYmluLgorICBpZiAoIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIkJTRCBubSIgJiYgZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgICMgS2VlcCB0aGlzIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gZnVuY193aW4zMl9saWJpZC4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICBmaQorICA7OworCitjZWdjYyopCisgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hhaWt1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKiB8IGhwdXgxMSopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEZbIC1dWzAtOV1bMC05XSkoLWJpdCk/KCBbTE1dU0IpPyBzaGFyZWQgb2JqZWN0KCBmaWxlKT9bLCAtXSogUEEtUklTQyBbMC05XVwuWzAtOV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV1cLlswLTldKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4WzMtOV0qKQorICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK25ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCisqbnRvKiB8ICpxbngqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKwordHBmKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY2OyB9CisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bXDFdXC9bXDFdXC9nOy9nImAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK2ZpCisKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19ETExUT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorRExMVE9PTD0kYWNfY3ZfcHJvZ19ETExUT09MCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRETExUT09MIiA+JjUKKyRhc19lY2hvICIkRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3RfRExMVE9PTD0kRExMVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSIkYWNfY3RfRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRExMVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9ETExUT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0RMTFRPT0wiID0geDsgdGhlbgorICAgIERMTFRPT0w9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERMTFRPT0w9JGFjX2N0X0RMTFRPT0wKKyAgZmkKK2Vsc2UKKyAgRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2ZpCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gYXNzb2NpYXRlIHJ1bnRpbWUgYW5kIGxpbmsgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0ndW5rbm93bicKKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAjIHR3byBkaWZmZXJlbnQgc2hlbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gbHRtYWluLnNoCisgICMgZGVjaWRlIHdoaWNoIHRvIHVzZSBiYXNlZCBvbiBjYXBhYmlsaXRpZXMgb2YgJERMTFRPT0wKKyAgY2FzZSBgJERMTFRPT0wgLS1oZWxwIDI+JjFgIGluCisgICotLWlkZW50aWZ5LXN0cmljdCopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sKKyAgICA7OworICBlc2FjCisgIDs7CisqKQorICAjIGZhbGxiYWNrOiBhc3N1bWUgbGlua2xpYiBJUyBzaGFyZWRsaWIKKyAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9IiRFQ0hPIgorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiA+JjY7IH0KK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAordGVzdCAteiAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiAmJiBzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kRUNITworCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGFyCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0FSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BUj0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVI9JGFjX2N2X3Byb2dfQVIKK2lmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBUiIgPiY1CiskYXNfZWNobyAiJEFSIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQVIiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQVIiOyB0aGVuCisgIGFjX2N0X0FSPSRBUgorICBmb3IgYWNfcHJvZyBpbiBhcgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0FSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQVI9JGFjX2N2X3Byb2dfYWNfY3RfQVIKK2lmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9BUiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0FSIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0FSIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQVIiID0geDsgdGhlbgorICAgIEFSPSJmYWxzZSIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBBUj0kYWNfY3RfQVIKKyAgZmkKK2ZpCisKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9hcl9hdF9maWxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfYXJfYXRfZmlsZT1ubworICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mNScKKyAgICAgIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRsdF9hcl90cnlcIiI7IH0gPiY1CisgIChldmFsICRsdF9hcl90cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtZXEgMDsgdGhlbgorCSMgRW5zdXJlIHRoZSBhcmNoaXZlciBmYWlscyB1cG9uIGJvZ3VzIGZpbGUgbmFtZXMuCisJcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBsaWJjb25mdGVzdC5hCisJeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGx0X2FyX3RyeVwiIjsgfSA+JjUKKyAgKGV2YWwgJGx0X2FyX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FyX2F0X2ZpbGUiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9hcl9hdF9maWxlIiA+JjY7IH0KKworaWYgdGVzdCAieCRsdF9jdl9hcl9hdF9maWxlIiA9IHhubzsgdGhlbgorICBhcmNoaXZlcl9saXN0X3NwZWM9CitlbHNlCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0kbHRfY3ZfYXJfYXRfZmlsZQorZmkKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitTVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKKyRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgorICBhY19jdF9TVFJJUD0kU1RSSVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgorICAgIFNUUklQPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFNUUklQPSRhY19jdF9TVFJJUAorICBmaQorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCit0ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJBTkxJQiIgPiY1CiskYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KKyAgICBSQU5MSUI9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUkFOTElCPSRhY19jdF9SQU5MSUIKKyAgZmkKK2Vsc2UKKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitmaQorCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgorCisKKworCisKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCR0b29sX29sZGxpYiIKK2ZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249eWVzIDs7CisgICopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPW5vIDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbQUJDREVHUlNUXScKKyAgZmkKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tCQ0RFR1FSU1RdJworICA7Oworc29sYXJpcyopCisgIHN5bWNvZGU9J1tCRFJUXScKKyAgOzsKK3NjbzMuMnY1KikKKyAgc3ltY29kZT0nW0RUXScKKyAgOzsKK3N5c3Y0LjJ1dzIqKQorICBzeW1jb2RlPSdbRFRdJworICA7Oworc3lzdjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgc3ltY29kZT0nW0FCRFRdJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tERk5TVFVdJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2Nhc2UgYCROTSAtViAyPiYxYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIHN5bWNvZGU9J1tBQkNER0lSU1RXXScgOzsKK2VzYWMKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbi4KKyMgU29tZSBzeXN0ZW1zIChlc3AuIG9uIGlhNjQpIGxpbmsgZGF0YSBhbmQgY29kZSBzeW1ib2xzIGRpZmZlcmVudGx5LAorIyBzbyB1c2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKVsgXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKVsgXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKGxpYlteIF0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJsaWJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkYnVpbGRfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWAkRUNITyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAorICA7OworZXNhYworCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyc2NvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICAjIFRyYW5zZm9ybSBzeW1jb2RlLCBzeW1wYXQsIGFuZCBzeW1wcmZ4IGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgorICBzeW14ZnJtPSJcXDEgJGFjX3N5bXByZnhcXDIgXFwyIgorCisgICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KKyAgaWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgICAjIEZha2UgaXQgZm9yIGR1bXBiaW4gYW5kIHNheSBUIGZvciBhbnkgbm9uLXN0YXRpYyBmdW5jdGlvbgorICAgICMgYW5kIEQgZm9yIGFueSBnbG9iYWwgdmFyaWFibGUuCisgICAgIyBBbHNvIGZpbmQgQysrIGFuZCBfX2Zhc3RjYWxsIHN5bWJvbHMgZnJvbSBNU1ZDKyssCisgICAgIyB3aGljaCBzdGFydCB3aXRoIEAgb3IgPy4KKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkQVdLICciXAorIiAgICAge2xhc3Rfc2VjdGlvbj1zZWN0aW9uOyBzZWN0aW9uPVwkIDN9OyJcCisiICAgICAvXkNPRkYgU1lNQk9MIFRBQkxFL3tmb3IoaSBpbiBoaWRlKSBkZWxldGUgaGlkZVtpXX07IlwKKyIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAorIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKKyIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKKyIgICAgIHtpZihoaWRlW3NlY3Rpb25dKSBuZXh0fTsiXAorIiAgICAge2Y9MH07IFwkIDB+L1woXCkuKlx8L3tmPTF9OyB7cHJpbnRmIGYgPyBcIlQgXCIgOiBcIkQgXCJ9OyJcCisiICAgICB7c3BsaXQoXCQgMCwgYSwgL1x8fFxyLyk7IHNwbGl0KGFbMl0sIHMpfTsiXAorIiAgICAgc1sxXX4vXltAP10ve3ByaW50IHNbMV0sIHNbMV07IG5leHR9OyJcCisiICAgICBzWzFdfnByZngge3NwbGl0KHNbMV0sdCxcIkBcIik7IHByaW50IHRbMV0sIHN1YnN0cih0WzFdLGxlbmd0aChwcmZ4KSl9IlwKKyIgICAgICcgcHJmeD1eJGFjX3N5bXByZngiCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWwkgXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsJIF1bCSBdKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnLyBfX2dudV9sdG8vZCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKTsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorX0xUX0VPRgorCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgXD4gJG5saXN0XCIiOyB9ID4mNQorICAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX0xUX0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8X0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK0xUX0RMU1lNX0NPTlNUIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHZvaWQgICAgICAgKmFkZHJlc3M7Cit9CitsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW10gPQoreworICB7ICJAUFJPR1JBTUAiLCAodm9pZCAqKSAwIH0sCitfTFRfRU9GCisJICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKKwkgIGNhdCA8PFxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitfTFRfRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0CisJICBsdF9nbG9ic3ltX3NhdmVfTElCUz0kTElCUworCSAgbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisJICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0kbHRfZ2xvYnN5bV9zYXZlX0xJQlMKKwkgIENGTEFHUz0kbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUworCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorCitmaQorCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmYWlsZWQiID4mNQorJGFzX2VjaG8gImZhaWxlZCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBvayIgPiY1CiskYXNfZWNobyAib2siID4mNjsgfQorZmkKKworIyBSZXNwb25zZSBmaWxlIHN1cHBvcnQuCitpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2VsaWYgJE5NIC0taGVscCAyPi9kZXYvbnVsbCB8IGdyZXAgJ1tAXUZJTEUnID4vZGV2L251bGw7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3lzcm9vdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3lzcm9vdC4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXN5c3Jvb3Qgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3N5c3Jvb3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3N5c3Jvb3Q7CitlbHNlCisgIHdpdGhfc3lzcm9vdD1ubworZmkKKworCitsdF9zeXNyb290PQorY2FzZSAke3dpdGhfc3lzcm9vdH0gaW4gIygKKyB5ZXMpCisgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICBsdF9zeXNyb290PWAkQ0MgLS1wcmludC1zeXNyb290IDI+L2Rldi9udWxsYAorICAgZmkKKyAgIDs7ICMoCisgLyopCisgICBsdF9zeXNyb290PWBlY2hvICIkd2l0aF9zeXNyb290IiB8IHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICA7OyAjKAorIG5vfCcnKQorICAgOzsgIygKKyAqKQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7d2l0aF9zeXNyb290fSIgPiY1CiskYXNfZWNobyAiJHt3aXRoX3N5c3Jvb3R9IiA+JjY7IH0KKyAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgc3lzcm9vdCBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGguIiAiJExJTkVOTyIgNQorICAgOzsKK2VzYWMKKworIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke2x0X3N5c3Jvb3Q6LW5vfSIgPiY1CiskYXNfZWNobyAiJHtsdF9zeXNyb290Oi1ub30iID4mNjsgfQorCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9saWJ0b29sX2xvY2s7CitmaQorCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgICAqRUxGLTMyKikKKwlIUFVYX0lBNjRfTU9ERT0iMzIiCisJOzsKKyAgICAgICpFTEYtNjQqKQorCUhQVVhfSUE2NF9NT0RFPSI2NCIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICcjbGluZSAnJExJTkVOTycgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC0zMiIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qa2ZyZWVic2QqLWdudXx4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAorczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICAgKjMyLWJpdCopCisJY2FzZSAkaG9zdCBpbgorCSAgeDg2XzY0LSprZnJlZWJzZCotZ251KQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODZfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCisJICAgIDs7CisJICBwcGM2NC0qbGludXgqfHBvd2VycGM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKKwkgICAgOzsKKwkgIHMzOTB4LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKjY0LWJpdCopCisJY2FzZSAkaG9zdCBpbgorCSAgeDg2XzY0LSprZnJlZWJzZCotZ251KQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NF9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorCSAgICA7OworCSAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGY2NHBwYyIKKwkgICAgOzsKKwkgIHMzOTAqLSpsaW51eCp8czM5MCotKnRwZiopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zMzkwIgorCSAgICA7OworCSAgc3BhcmMqLSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9jY19uZWVkc19iZWxmKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBsdF9jdl9jY19uZWVkc19iZWxmPXllcworZWxzZQorICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY2OyB9CisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CisqLSpzb2xhcmlzKikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopCisgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgaT84Ni0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjKi0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgICMgR05VIGxkIDIuMjEgaW50cm9kdWNlZCBfc29sMiBlbXVsYXRpb25zLiAgVXNlIHRoZW0gaWYgYXZhaWxhYmxlLgorICAgICAgICBpZiAke0xELWxkfSAtViB8IGdyZXAgX3NvbDIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgTEQ9IiR7TEQtbGR9X3NvbDIiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9bXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX01BTklGRVNUX1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MPSIkTUFOSUZFU1RfVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX01BTklGRVNUX1RPT0w9IiR7YWNfdG9vbF9wcmVmaXh9bXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorTUFOSUZFU1RfVE9PTD0kYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MCitpZiB0ZXN0IC1uICIkTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQU5JRkVTVF9UT09MIiA+JjUKKyRhc19lY2hvICIkTUFOSUZFU1RfVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgYWNfY3RfTUFOSUZFU1RfVE9PTD0kTUFOSUZFU1RfVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9NQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0w9IiRhY19jdF9NQU5JRkVTVF9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTD0ibXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfTUFOSUZFU1RfVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9NQU5JRkVTVF9UT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfTUFOSUZFU1RfVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X01BTklGRVNUX1RPT0wiID0geDsgdGhlbgorICAgIE1BTklGRVNUX1RPT0w9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgTUFOSUZFU1RfVE9PTD0kYWNfY3RfTUFOSUZFU1RfVE9PTAorICBmaQorZWxzZQorICBNQU5JRkVTVF9UT09MPSIkYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MIgorZmkKKwordGVzdCAteiAiJE1BTklGRVNUX1RPT0wiICYmIE1BTklGRVNUX1RPT0w9bXQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJE1BTklGRVNUX1RPT0wgaXMgYSBtYW5pZmVzdCB0b29sIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRNQU5JRkVTVF9UT09MIGlzIGEgbWFuaWZlc3QgdG9vbC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9bm8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86ICRNQU5JRkVTVF9UT09MICctPyciID4mNQorICAkTUFOSUZFU1RfVE9PTCAnLT8nIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0CisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGlmICRHUkVQICdNYW5pZmVzdCBUb29sJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9eWVzCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0KgorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sIiA+JjY7IH0KK2lmIHRlc3QgIngkbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sIiAhPSB4eWVzOyB0aGVuCisgIE1BTklGRVNUX1RPT0w9OgorZmkKKworCisKKworCisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZHN5bXV0aWwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZHN5bXV0aWw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0RTWU1VVElMKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERTWU1VVElMIjsgdGhlbgorICBhY19jdl9wcm9nX0RTWU1VVElMPSIkRFNZTVVUSUwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19EU1lNVVRJTD0iJHthY190b29sX3ByZWZpeH1kc3ltdXRpbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitEU1lNVVRJTD0kYWNfY3ZfcHJvZ19EU1lNVVRJTAoraWYgdGVzdCAtbiAiJERTWU1VVElMIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERTWU1VVElMIiA+JjUKKyRhc19lY2hvICIkRFNZTVVUSUwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RTWU1VVElMIjsgdGhlbgorICBhY19jdF9EU1lNVVRJTD0kRFNZTVVUSUwKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkc3ltdXRpbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZHN5bXV0aWw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0RTWU1VVElMIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMPSIkYWNfY3RfRFNZTVVUSUwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTD0iZHN5bXV0aWwiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRFNZTVVUSUw9JGFjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUwKK2lmIHRlc3QgLW4gIiRhY19jdF9EU1lNVVRJTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9EU1lNVVRJTCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0RTWU1VVElMIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfRFNZTVVUSUwiID0geDsgdGhlbgorICAgIERTWU1VVElMPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERTWU1VVElMPSRhY19jdF9EU1lNVVRJTAorICBmaQorZWxzZQorICBEU1lNVVRJTD0iJGFjX2N2X3Byb2dfRFNZTVVUSUwiCitmaQorCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW5tZWRpdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTk1FRElUKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE5NRURJVCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19OTUVESVQ9IiROTUVESVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19OTUVESVQ9IiR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK05NRURJVD0kYWNfY3ZfcHJvZ19OTUVESVQKK2lmIHRlc3QgLW4gIiROTUVESVQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTk1FRElUIiA+JjUKKyRhc19lY2hvICIkTk1FRElUIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19OTUVESVQiOyB0aGVuCisgIGFjX2N0X05NRURJVD0kTk1FRElUCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibm1lZGl0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBubWVkaXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X05NRURJVCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9OTUVESVQiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUPSIkYWNfY3RfTk1FRElUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUPSJubWVkaXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfTk1FRElUPSRhY19jdl9wcm9nX2FjX2N0X05NRURJVAoraWYgdGVzdCAtbiAiJGFjX2N0X05NRURJVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9OTUVESVQiID4mNQorJGFzX2VjaG8gIiRhY19jdF9OTUVESVQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9OTUVESVQiID0geDsgdGhlbgorICAgIE5NRURJVD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBOTUVESVQ9JGFjX2N0X05NRURJVAorICBmaQorZWxzZQorICBOTUVESVQ9IiRhY19jdl9wcm9nX05NRURJVCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1saXBvIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWxpcG87IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0xJUE8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTElQTyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19MSVBPPSIkTElQTyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0xJUE89IiR7YWNfdG9vbF9wcmVmaXh9bGlwbyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitMSVBPPSRhY19jdl9wcm9nX0xJUE8KK2lmIHRlc3QgLW4gIiRMSVBPIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExJUE8iID4mNQorJGFzX2VjaG8gIiRMSVBPIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MSVBPIjsgdGhlbgorICBhY19jdF9MSVBPPSRMSVBPCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibGlwbyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbGlwbzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTElQTys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9MSVBPIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0xJUE89IiRhY19jdF9MSVBPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfTElQTz0ibGlwbyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9MSVBPPSRhY19jdl9wcm9nX2FjX2N0X0xJUE8KK2lmIHRlc3QgLW4gIiRhY19jdF9MSVBPIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0xJUE8iID4mNQorJGFzX2VjaG8gIiRhY19jdF9MSVBPIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfTElQTyIgPSB4OyB0aGVuCisgICAgTElQTz0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBMSVBPPSRhY19jdF9MSVBPCisgIGZpCitlbHNlCisgIExJUE89IiRhY19jdl9wcm9nX0xJUE8iCitmaQorCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX09UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX09UT09MPSIkT1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PVE9PTD0iJHthY190b29sX3ByZWZpeH1vdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitPVE9PTD0kYWNfY3ZfcHJvZ19PVE9PTAoraWYgdGVzdCAtbiAiJE9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9UT09MIiA+JjUKKyRhc19lY2hvICIkT1RPT0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09UT09MIjsgdGhlbgorICBhY19jdF9PVE9PTD0kT1RPT0wKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb3Rvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X09UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09UT09MPSIkYWNfY3RfT1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PVE9PTD0ib3Rvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfT1RPT0w9JGFjX2N2X3Byb2dfYWNfY3RfT1RPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9PVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PVE9PTCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfT1RPT0wiID0geDsgdGhlbgorICAgIE9UT09MPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9UT09MPSRhY19jdF9PVE9PTAorICBmaQorZWxzZQorICBPVE9PTD0iJGFjX2N2X3Byb2dfT1RPT0wiCitmaQorCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w2NCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vdG9vbDY0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19PVE9PTDY0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9UT09MNjQiOyB0aGVuCisgIGFjX2N2X3Byb2dfT1RPT0w2ND0iJE9UT09MNjQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PVE9PTDY0PSIke2FjX3Rvb2xfcHJlZml4fW90b29sNjQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorT1RPT0w2ND0kYWNfY3ZfcHJvZ19PVE9PTDY0CitpZiB0ZXN0IC1uICIkT1RPT0w2NCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPVE9PTDY0IiA+JjUKKyRhc19lY2hvICIkT1RPT0w2NCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT1RPT0w2NCI7IHRoZW4KKyAgYWNfY3RfT1RPT0w2ND0kT1RPT0w2NAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sNjQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG90b29sNjQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X09UT09MNjQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0w2NCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0PSIkYWNfY3RfT1RPT0w2NCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09UT09MNjQ9Im90b29sNjQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfT1RPT0w2ND0kYWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0CitpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0w2NCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PVE9PTDY0IiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT1RPT0w2NCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X09UT09MNjQiID0geDsgdGhlbgorICAgIE9UT09MNjQ9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT1RPT0w2ND0kYWNfY3RfT1RPT0w2NAorICBmaQorZWxzZQorICBPVE9PTDY0PSIkYWNfY3ZfcHJvZ19PVE9PTDY0IgorZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAgIGlmIHRlc3QgLXogIiR7TFRfTVVMVElfTU9EVUxFfSI7IHRoZW4KKwkjIEJ5IGRlZmF1bHQgd2Ugd2lsbCBhZGQgdGhlIC1zaW5nbGVfbW9kdWxlIGZsYWcuIFlvdSBjYW4gb3ZlcnJpZGUKKwkjIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVF9NVUxUSV9NT0RVTEUKKwkjIG5vbi1lbXB0eSBhdCBjb25maWd1cmUgdGltZSwgb3IgYnkgYWRkaW5nIC1tdWx0aV9tb2R1bGUgdG8gdGhlCisJIyBsaW5rIGZsYWdzLgorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwllY2hvICJpbnQgZm9vKHZvaWQpe3JldHVybiAxO30iID4gY29uZnRlc3QuYworCWVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCistZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyIgPiY1CisJJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKwkgIC1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIDI+Y29uZnRlc3QuZXJyCisgICAgICAgIF9sdF9yZXN1bHQ9JD8KKwkjIElmIHRoZXJlIGlzIGEgbm9uLWVtcHR5IGVycm9yIGxvZywgYW5kICJzaW5nbGVfbW9kdWxlIgorCSMgYXBwZWFycyBpbiBpdCwgYXNzdW1lIHRoZSBmbGFnIGNhdXNlZCBhIGxpbmtlciB3YXJuaW5nCisgICAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyICYmICRHUkVQIHNpbmdsZV9tb2R1bGUgY29uZnRlc3QuZXJyOyB0aGVuCisJICBjYXQgY29uZnRlc3QuZXJyID4mNQorCSMgT3RoZXJ3aXNlLCBpZiB0aGUgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggYSAwIGV4aXQgY29kZSBmcm9tCisJIyB0aGUgY29tcGlsZXIsIGl0IHdvcmtlZC4KKwllbGlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAkX2x0X3Jlc3VsdCAtZXEgMDsgdGhlbgorCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyID4mNQorCWZpCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPiY2OyB9CisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ubworICAgICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgICAgICBlY2hvICJfbWFpbiIgPiBjb25mdGVzdC5zeW0KKyAgICAgIExERkxBR1M9IiRMREZMQUdTIC1XbCwtZXhwb3J0ZWRfc3ltYm9sc19saXN0LGNvbmZ0ZXN0LnN5bSIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9eWVzCitlbHNlCisgIGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisJTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA+JjY7IH0KKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAtZm9yY2VfbG9hZCBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9sZF9mb3JjZV9sb2FkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfZm9yY2VfbG9hZD1ubworICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgZm9yY2VkX2xvYWRlZCgpIHsgcmV0dXJuIDI7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyIgPiY1CisgICAgICAkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIDI+JjUKKyAgICAgIGVjaG8gIiRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIiA+JjUKKyAgICAgICRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIDI+JjUKKyAgICAgIGVjaG8gIiRSQU5MSUIgbGliY29uZnRlc3QuYSIgPiY1CisgICAgICAkUkFOTElCIGxpYmNvbmZ0ZXN0LmEgMj4mNQorICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSIgPiY1CisgICAgICAkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIDI+Y29uZnRlc3QuZXJyCisgICAgICBfbHRfcmVzdWx0PSQ/CisgICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVyciAmJiAkR1JFUCBmb3JjZV9sb2FkIGNvbmZ0ZXN0LmVycjsgdGhlbgorCWNhdCBjb25mdGVzdC5lcnIgPiY1CisgICAgICBlbGlmIHRlc3QgLWYgY29uZnRlc3QgJiYgdGVzdCAkX2x0X3Jlc3VsdCAtZXEgMCAmJiAkR1JFUCBmb3JjZWRfbG9hZCBjb25mdGVzdCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJbHRfY3ZfbGRfZm9yY2VfbG9hZD15ZXMKKyAgICAgIGVsc2UKKwljYXQgY29uZnRlc3QuZXJyID4mNQorICAgICAgZmkKKyAgICAgICAgcm0gLWYgY29uZnRlc3QuZXJyIGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QgY29uZnRlc3QuYworICAgICAgICBybSAtcmYgY29uZnRlc3QuZFNZTQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9mb3JjZV9sb2FkIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPiY2OyB9CisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luMS4qKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbiopICMgZGFyd2luIDUueCBvbgorICAgICAgIyBpZiBydW5uaW5nIG9uIDEwLjUgb3IgbGF0ZXIsIHRoZSBkZXBsb3ltZW50IHRhcmdldCBkZWZhdWx0cworICAgICAgIyB0byB0aGUgT1MgdmVyc2lvbiwgaWYgb24geDg2LCBhbmQgMTAuNCwgdGhlIGRlcGxveW1lbnQKKyAgICAgICMgdGFyZ2V0IGRlZmF1bHRzIHRvIDEwLjQuIERvbid0IHlvdSBsb3ZlIGl0PworICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSwkaG9zdCBpbgorCTEwLjAsKjg2Ki1kYXJ3aW44KnwxMC4wLCotZGFyd2luWzkxXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisJMTAuWzAxMl0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworCTEwLiopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisgICAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX3NpbmdsZV9tb2Q9JyRzaW5nbGVfbW9kdWxlJworICAgIGZpCisgICAgaWYgdGVzdCAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nICR7d2x9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltJworICAgIGVsc2UKKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9J34kTk1FRElUIC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiIgJiYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gIm5vIjsgdGhlbgorICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKKyAgICBlbHNlCisgICAgICBfbHRfZHN5bXV0aWw9CisgICAgZmkKKyAgICA7OworICBlc2FjCisKK2ZvciBhY19oZWFkZXIgaW4gZGxmY24uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCitmdW5jX3N0cmlwbmFtZV9jbmYgKCkKK3sKKyAgY2FzZSAkezJ9IGluCisgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyVcXFxcJHsyfVwkJSUiYDs7CisgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKKyAgZXNhYworfSAjIGZ1bmNfc3RyaXBuYW1lX2NuZgorCisKKworCisKKyMgU2V0IG9wdGlvbnMKKworCisKKyAgICAgICAgZW5hYmxlX2Rsb3Blbj1ubworCisKKyAgZW5hYmxlX3dpbjMyX2RsbD1ubworCisKKyAgICAgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpCisKKworCisKKworCisKKworCisgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc3RhdGljOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmkKKworCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3BpYytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcGljOyBsdF9wPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJHdpdGh2YWwgaW4KKyAgICB5ZXN8bm8pIHBpY19tb2RlPSR3aXRodmFsIDs7CisgICAgKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIGx0X3BrZyBpbiAkd2l0aHZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJGx0X3BrZyIgPSAiWCRsdF9wIjsgdGhlbgorCSAgcGljX21vZGU9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIHBpY19tb2RlPWRlZmF1bHQKK2ZpCisKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0CisKKworCisKKworCisKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9mYXN0X2luc3RhbGw7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworZmkKKworCisKKworCisKKworCisKKworCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRsdG1haW4iCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X29iamRpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHJtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1CiskYXNfZWNobyAiJGx0X2N2X29iamRpciIgPiY2OyB9CitvYmpkaXI9JGx0X2N2X29iamRpcgorCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTFRfT0JKRElSICIkbHRfY3Zfb2JqZGlyLyIKK19BQ0VPRgorCisKKworCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBHbG9iYWwgdmFyaWFibGVzOgorb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX01BR0lDX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGU7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0CisKK2x0X3NhdmVfQ0M9IiRDQyIKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0PSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCisKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBudmNjKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1YY29tcGlsZXIgLWZuby1idWlsdGluJyA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCisgICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCisKKworCisKKworICBsdF9wcm9nX2NvbXBpbGVyX3dsPQorbHRfcHJvZ19jb21waWxlcl9waWM9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KKworCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbMy05XSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVhsaW5rZXIgJworICAgICAgaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iLVhjb21waWxlciAkbHRfcHJvZ19jb21waWxlcl9waWMiCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorICAgICAgZWNjKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgaWNjIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorICAgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisgICAgICBpY2MqIHwgaWZvcnQqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBMYWhleSBGb3J0cmFuIDguMS4KKyAgICAgIGxmOTUqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy0tc2hhcmVkJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctLXN0YXRpYycKKwk7OworICAgICAgbmFnZm9yKikKKwkjIE5BRyBGb3J0cmFuIGNvbXBpbGVyCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLC1XbCwsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZwaWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgIHhsKiB8IGJneGwqIHwgYmdmKiB8IG1waXhsKikKKwkjIElCTSBYTCBDIDguMC9Gb3J0cmFuIDEwLjEsIDExLjEgb24gUFBDIGFuZCBCbHVlR2VuZQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1xcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctcXN0YXRpY2xpbmsnCisJOzsKKyAgICAgICopCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQ2VyZXNcIEZvcnRyYW4qIHwgKlN1bipGb3J0cmFuKlwgWzEtN10uKiB8ICpTdW4qRm9ydHJhbipcIDguWzAtM10qKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCSAgbHRfcHJvZ19jb21waWxlcl93bD0nJworCSAgOzsKKwkqU3VuXCBGKiB8ICpTdW4qRm9ydHJhbiopCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCisJICA7OworCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJICA7OworICAgICAgICAqSW50ZWwqXCBbQ0ZdKkNvbXBpbGVyKikKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKwkgIDs7CisJKlBvcnRsYW5kXCBHcm91cCopCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KiB8IHN1bmY3NyogfCBzdW5mOTAqIHwgc3VuZjk1KikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVBJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtjb25mb3JtX3BpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXBpYycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0KKyAgICA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCisgICAgOzsKK2VzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9waWMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYyIgPiY2OyB9CitsdF9wcm9nX2NvbXBpbGVyX3BpYz0kbHRfY3ZfcHJvZ19jb21waWxlcl9waWMKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzPW5vCisgICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KK2ZpCisKK2ZpCisKKworCisKKworCisKKworCisKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNcIgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRFQ0hPICIkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9CitmaQorCisKKworCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289bm8KKyAgICRSTSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjY7IH0KKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNjsgfQorCisKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKKyRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKKworCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorCisgIHJ1bnBhdGhfdmFyPQorICBhbGxvd191bmRlZmluZWRfZmxhZz0KKyAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisgIGFyY2hpdmVfY21kcz0KKyAgYXJjaGl2ZV9leHBzeW1fY21kcz0KKyAgY29tcGlsZXJfbmVlZHNfb2JqZWN0PW5vCisgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9bm8KKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQorICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGhhcmRjb2RlX2F1dG9tYXRpYz1ubworICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPW5vCisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICBpbmhlcml0X3JwYXRoPW5vCisgIGxpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgorICBtb2R1bGVfY21kcz0KKyAgbW9kdWxlX2V4cHN5bV9jbWRzPQorICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPQorICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0KKyAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQorICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBpbmNsdWRlX2V4cHN5bXM9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgZXhjbHVkZV9leHBzeW1zPSdfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICAjIEV4Y2x1ZGUgc2hhcmVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIHN5bWJvbHMuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIGxpbmtfYWxsX2RlcGxpYnM9bm8KKyAgICA7OworICBlc2FjCisKKyAgbGRfc2hsaWJzPXllcworCisgICMgT24gc29tZSB0YXJnZXRzLCBHTlUgbGQgaXMgY29tcGF0aWJsZSBlbm91Z2ggd2l0aCB0aGUgbmF0aXZlIGxpbmtlcgorICAjIHRoYXQgd2UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgbmF0aXZlIGludGVyZmFjZSBmb3IgYm90aC4KKyAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9bm8KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisJIyBUaGUgQUlYIHBvcnQgb2YgR05VIGxkIGhhcyBhbHdheXMgYXNwaXJlZCB0byBjb21wYXRpYmlsaXR5CisJIyB3aXRoIHRoZSBuYXRpdmUgbGlua2VyLiAgSG93ZXZlciwgYXMgdGhlIHdhcm5pbmcgaW4gdGhlIEdOVSBsZAorCSMgYmxvY2sgc2F5cywgdmVyc2lvbnMgYmVmb3JlIDIuMTkuNSogY291bGRuJ3QgcmVhbGx5IGNyZWF0ZSB3b3JraW5nCisJIyBzaGFyZWQgbGlicmFyaWVzLCByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNlZC4KKwljYXNlIGAkTEQgLXYgMj4mMWAgaW4KKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLjE5LjUqKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuWzItOV0qKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIFszLTldKikgOzsKKwkgICopCisJICAgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwk7OworICAgIGVzYWMKKyAgZmkKKworICBpZiB0ZXN0ICIkbHRfdXNlX2dudV9sZF9pbnRlcmZhY2UiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgKkdOVVwgZ29sZCopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXhbMy05XSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuMTksIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBiaW51dGlscworKioqIDIuMjAgb3IgYWJvdmUsIG9yIG1vZGlmeSB5b3VyIFBBVEggc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLgorKioqIFlvdSB3aWxsIHRoZW4gbmVlZCB0byByZXN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCisKK19MVF9FT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCApIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1hbGwtc3ltYm9scycKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU11bIF0vcy8uKlsgXVwoW14gXSpcKS9cMSBEQVRBLztzL14uKlsgXV9fbm1fX1woW14gXSpcKVsgXVteIF0qL1wxIERBVEEvOy9eSVsgXS9kOy9eW0FJVFddWyBdL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgICBleGNsdWRlX2V4cHN5bXM9J1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZScKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBoYWlrdSopCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgdG1wX2RpZXQ9bm8KKyAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQorCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCisJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubworICAgICAgdGhlbgorCXRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJworCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKKwkJCQkJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJbGY5NSopCQkJCSMgTGFoZXkgRm9ydHJhbiA4LjEKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorCSAgdG1wX3NoYXJlZGZsYWc9Jy0tc2hhcmVkJyA7OworCXhsW2NDXSogfCBiZ3hsW2NDXSogfCBtcGl4bFtjQ10qKSAjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCisJICB0bXBfc2hhcmVkZmxhZz0nLXFta3Nocm9iaicKKwkgIHRtcF9hZGRmbGFnPSA7OworCW52Y2MqKQkjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgY29tcGlsZXJfbmVlZHNfb2JqZWN0PXllcworCSAgOzsKKwllc2FjCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCQkJIyBTdW4gQyA1LjkKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgY29tcGlsZXJfbmVlZHNfb2JqZWN0PXllcworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJZXNhYworCWFyY2hpdmVfY21kcz0nJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworICAgICAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKyAgICAgICAgZmkKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJeGxmKiB8IGJnZiogfCBiZ3hsZiogfCBtcGl4bGYqKQorCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAtLW5vLXdob2xlLWFyY2hpdmUnCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgICRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgIGZpCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG5ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8ICRHUkVQICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKQorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cworCSAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKKwkgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisJICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBsZF9zaGxpYnM9bm8KKwkgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXhbNC05XSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCSMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbAorCSMgZGVmaW5lZCBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KKwlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZWxzZQorCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeFs1LTldKikKKwkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKwkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgYnJlYWsKKwkgIGZpCisJICBkb25lCisJICA7OworCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBhcmNoaXZlX2NtZHM9JycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgZmlsZV9saXN0X3NwZWM9JyR7d2x9LWYsJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgIDoKKwkgIGVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorCWxpbmtfYWxsX2RlcGxpYnM9bm8KKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LWJleHBhbGwnCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1iZXJvaycKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisgICAgICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICAgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoXworZmkKKworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIteiBub2RlZnMiCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoXworZmkKKworCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVybm90b2snCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm9rJworCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBlbHNlCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJGNvbnZlbmllbmNlJworCSAgZmkKKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJzZGlbNDVdKikKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY2wqKQorCSMgTmF0aXZlIE1TVkMKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCWZpbGVfbGlzdF9zcGVjPSdAJworCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgIHNlZCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBlbHNlCisJICAgIHNlZCAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBmaX4KKwkgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgIGxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCApPSd0cnVlJworCWVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisJZXhjbHVkZV9leHBzeW1zPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisJZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEsREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV11bIF0vcy8uKlsgXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCSMgRG9uJ3QgdXNlIHJhbmxpYgorCW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKKwlwb3N0bGlua19jbWRzPSdsdF9vdXRwdXRmaWxlPSJAT1VUUFVUQCJ+CisJICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAqLmV4ZXwqLkVYRSkgOzsKKwkgICAgKikKKwkgICAgICBsdF9vdXRwdXRmaWxlPSIkbHRfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICA7OworCSAgZXNhY34KKwkgIGlmIHRlc3QgIiRNQU5JRkVTVF9UT09MIiAhPSAiOiIgJiYgdGVzdCAtZiAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOyB0aGVuCisJICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgZmknCisJOzsKKyAgICAgICopCisJIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZnVuY19lY2hvX2FsbCAiJGRlcGxpYnMiIHwgJFNFRCAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworCSMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisJb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKKwkjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorCW9sZF9hcmNoaXZlX2NtZHM9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKwllbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKworCisgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgIGhhcmRjb2RlX2RpcmVjdD1ubworICBoYXJkY29kZV9hdXRvbWF0aWM9eWVzCisgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKKyAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlICR7d2x9LWZvcmNlX2xvYWQsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAnCisKKyAgZWxzZQorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScnCisgIGZpCisgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisgICAgYXJjaGl2ZV9jbWRzPSJcJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAkX2x0X2Rhcl9zaW5nbGVfbW9kJHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9jbWRzPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9leHBzeW1fY21kcz0ic2VkIC1lICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorCisgIGVsc2UKKyAgbGRfc2hsaWJzPW5vCisgIGZpCisKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMi4qKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisJaGFyZGNvZGVfZGlyZWN0PXllcworCWhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwloYXJkY29kZV9taW51c19MPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCisJICAjIE9sZGVyIHZlcnNpb25zIG9mIHRoZSAxMS4wMCBjb21waWxlciBkbyBub3QgdW5kZXJzdGFuZCAtYiB5ZXQKKwkgICMgKEhQOTI0NTMtMDEgQS4xMS4wMS4yMCBkb2Vzbid0LCBIUDkyNDUzLTAxIEIuMTEuWC4zNTE3NS0zNTE3Ni5HUCBkb2VzKQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0MgdW5kZXJzdGFuZHMgLWIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHVuZGVyc3RhbmRzIC1iLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfX2IrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgLWIiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9fYiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID0geHllczsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCitlbHNlCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworZmkKKworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgaGFyZGNvZGVfZGlyZWN0PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJICA7OworCSopCisJICBoYXJkY29kZV9kaXJlY3Q9eWVzCisJICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGhvc3Rfb3MgbGlua2VyIGFjY2VwdHMgLWV4cG9ydGVkX3N5bWJvbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworaW50IGZvbyAodm9pZCkgeyByZXR1cm4gMDsgfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPXllcworZWxzZQorICBsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sIiA+JjY7IH0KKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAke3dsfS1leHBvcnRzX2ZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBpbmhlcml0X3JwYXRoPXllcworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwloYXJkY29kZV9kaXJlY3Q9eWVzCisJaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCWhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKwlpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisJZWxzZQorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgICA7OworCSAgZXNhYworCWZpCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFyY2hpdmVfY21kcz0nJEVDSE8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz0nbm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nIC16IGRlZnMnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCXdsYXJjPScke3dsfScKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkqIkNvbXBpbGVycyA1LjAiKikKKwkgIHdsYXJjPScnCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwkqKQorCSAgd2xhcmM9JyR7d2x9JworCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJZWxzZQorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCWxkX3NobGlicz15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLlswMjRdKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS16LG5vZGVmcycKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SLCRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IHgkaG9zdF92ZW5kb3IgPSB4c25pOyB0aGVuCisgICAgICBjYXNlICRob3N0IGluCisgICAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlicyIgPiY1CiskYXNfZWNobyAiJGxkX3NobGlicyIgPiY2OyB9Cit0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKword2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCisKKworCisKKworCisKKworCisKKworCisKKworCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kcyBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworCWlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKwkgIHNvbmFtZT1jb25mdGVzdAorCSAgbGliPWNvbmZ0ZXN0CisJICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgIGRlcGxpYnM9CisJICB3bD0kbHRfcHJvZ19jb21waWxlcl93bAorCSAgcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljCisJICBjb21waWxlcl9mbGFncz0tdgorCSAgbGlua2VyX2ZsYWdzPS12CisJICB2ZXJzdHJpbmc9CisJICBvdXRwdXRfb2JqZGlyPS4KKwkgIGxpYm5hbWU9Y29uZnRlc3QKKwkgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0KKwkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1CisgIChldmFsICRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisJICB0aGVuCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPW5vCisJICBlbHNlCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPXllcworCSAgZmkKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisJZmkKKwkkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNjsgfQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9JGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OworICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7CisgIGVzYWMKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VkX3N0cmlwX2VxPSJzLD1cKFtBLVphLXpdOlwpLFwxLGciIDs7CisgICAgKikgbHRfc2VkX3N0cmlwX2VxPSJzLD0vLC8sZyIgOzsKKyAgZXNhYworICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgYXdrICRsdF9hd2tfYXJnIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAkbHRfc2VkX3N0cmlwX2VxYAorICBjYXNlICRsdF9zZWFyY2hfcGF0aF9zcGVjIGluCisgICpcOyopCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICdzLzsvIC9nJ2AKKyAgICA7OworICAqKQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgIDs7CisgIGVzYWMKKyAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKKyAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCisgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQorICBsdF9tdWx0aV9vc19kaXI9YCRDQyAkQ1BQRkxBR1MgJENGTEFHUyAkTERGTEFHUyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5IDI+L2Rldi9udWxsYAorICBmb3IgbHRfc3lzX3BhdGggaW4gJGx0X3NlYXJjaF9wYXRoX3NwZWM7IGRvCisgICAgaWYgdGVzdCAtZCAiJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiOyB0aGVuCisgICAgICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIgorICAgIGVsc2UKKyAgICAgIHRlc3QgLWQgIiRsdF9zeXNfcGF0aCIgJiYgXAorCWx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoIgorICAgIGZpCisgIGRvbmUKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCBhd2sgJworQkVHSU4ge1JTPSIgIjsgRlM9Ii98XG4iO30geworICBsdF9mb289IiI7CisgIGx0X2NvdW50PTA7CisgIGZvciAobHRfaSA9IE5GOyBsdF9pID4gMDsgbHRfaS0tKSB7CisgICAgaWYgKCRsdF9pICE9ICIiICYmICRsdF9pICE9ICIuIikgeworICAgICAgaWYgKCRsdF9pID09ICIuLiIpIHsKKyAgICAgICAgbHRfY291bnQrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsdF9jb3VudCA9PSAwKSB7CisgICAgICAgICAgbHRfZm9vPSIvIiAkbHRfaSBsdF9mb287CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbHRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobHRfZm9vICE9ICIiKSB7IGx0X2ZyZXFbbHRfZm9vXSsrOyB9CisgIGlmIChsdF9mcmVxW2x0X2Zvb10gPT0gMSkgeyBwcmludCBsdF9mb287IH0KK30nYAorICAjIEFXSyBwcm9ncmFtIGFib3ZlIGVycm9uZW91c2x5IHByZXBlbmRzICcvJyB0byBDOi9kb3MvcGF0aHMKKyAgIyBmb3IgdGhlc2UgaG9zdHMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfFwKKyAgICAgICRTRUQgJ3MsL1woW0EtWmEtel06XCksXDEsZydgIDs7CisgIGVzYWMKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJGx0X05MMlNQYAorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXhbNC05XSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkY2NfYmFzZW5hbWUgaW4KKyAgeWVzLCopCisgICAgIyBnY2MKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBpZiB0ZXN0IC1uICdcJyckc3RyaXBtZSdcJycgJiYgdGVzdCAtbiAnXCcnJHN0cmlwbGliJ1wnJzsgdGhlbgorICAgICAgICBldmFsICdcJyckc3RyaXBsaWIgXCRkbGRpci8kZGxuYW1lJ1wnJyB8fCBleGl0IFwkPzsKKyAgICAgIGZpJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9saWIvdzMyYXBpIgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjZWdjYyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworCisgICosY2wqKQorICAgICMgTmF0aXZlIE1TVkMKKyAgICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uZGxsLmxpYicKKworICAgIGNhc2UgJGJ1aWxkX29zIGluCisgICAgbWluZ3cqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPQorICAgICAgbHRfc2F2ZV9pZnM9JElGUworICAgICAgSUZTPSc7JworICAgICAgZm9yIGx0X3BhdGggaW4gJExJQgorICAgICAgZG8KKyAgICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgICAjIExldCBET1MgdmFyaWFibGUgZXhwYW5zaW9uIHByaW50IHRoZSBzaG9ydCA4LjMgc3R5bGUgZmlsZSBuYW1lLgorICAgICAgICBsdF9wYXRoPWBjZCAiJGx0X3BhdGgiIDI+L2Rldi9udWxsICYmIGNtZCAvL0MgImZvciAlaSBpbiAoIi4iKSBkbyBAZWNobyAlfnNpImAKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjICRsdF9wYXRoIgorICAgICAgZG9uZQorICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgIyBDb252ZXJ0IHRvIE1TWVMgc3R5bGUuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IHNlZCAtZSAnc3xcXFxcfC98ZycgLWUgJ3N8IFxcKFthLXpBLVpdXFwpOnwgL1xcMXxnJyAtZSAnc3xeIHx8J2AKKyAgICAgIDs7CisgICAgY3lnd2luKikKKyAgICAgICMgQ29udmVydCB0byB1bml4IGZvcm0sIHRoZW4gdG8gZG9zIGZvcm0sIHRoZW4gYmFjayB0byB1bml4IGZvcm0KKyAgICAgICMgYnV0IHRoaXMgdGltZSBkb3Mgc3R5bGUgKG5vIHNwYWNlcyEpIHNvIHRoYXQgdGhlIHVuaXggZm9ybSBsb29rcworICAgICAgIyBsaWtlIC9jeWdkcml2ZS9jL1BST0dSQX4xOi9jeWdkci4uLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMSUIiYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLWRvcyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgMj4vZGV2L251bGxgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgOzsKKyAgICAqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkTElCIgorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICAjIEZJWE1FOiBmaW5kIHRoZSBzaG9ydCBuYW1lIG9yIHRoZSBwYXRoIGNvbXBvbmVudHMsIGFzIHNwYWNlcyBhcmUKKyAgICAgICMgY29tbW9uLiAoZS5nLiAiUHJvZ3JhbSBGaWxlcyIgLT4gIlBST0dSQX4xIikKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxpbmsuZXhlJworICAgIDs7CisKKyAgKikKKyAgICAjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisgIGVzYWMKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsyM10uKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIuKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKKyAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgKikgIyBmcm9tIDQuNiBvbiwgYW5kIERyYWdvbkZseQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitoYWlrdSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NSwgLi4uCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICAjIG9yIGZhaWxzIG91dHJpZ2h0LCBzbyBvdmVycmlkZSBhdG9taWNhbGx5OgorICBpbnN0YWxsX292ZXJyaWRlX21vZGU9NTU1CisgIDs7CisKK2ludGVyaXhbMy05XSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIGdsaWJjL0VMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgaWYgJHtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICBzYXZlX2xpYmRpcj0kbGliZGlyCisgICAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJGx0X3Byb2dfY29tcGlsZXJfd2xcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIiCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGlmICAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGw7IHRoZW4gOgorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCitmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgICAgbGliZGlyPSRzYXZlX2xpYmRpcgorCitmaQorCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsJIF0qaHdjYXBbCSBdL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7cy8iLy9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2RlbGYqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KK2hhcmRjb2RlX2FjdGlvbj0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiB8fAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQorJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb24iID4mNjsgfQorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluayB8fAorICAgdGVzdCAiJGluaGVyaXRfcnBhdGgiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKworCisKKworICBpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgICA7OworCisgICopCisgICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2hsX2xvYWQiICJhY19jdl9mdW5jX3NobF9sb2FkIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzaGxfbG9hZCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCitlbHNlCisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImRsb3BlbiIgImFjX2N2X2Z1bmNfZGxvcGVuIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbGRfZGxkX2xpbmsrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxkX2xpbmsgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbGRfbGluayAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPXllcworZWxzZQorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9kbG9wZW5fc2VsZis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9CitfTFRfRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mNSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZj1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKKworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjY7IH0KKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKKyAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQoraW50IGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOworI2VuZGlmCisKK2ludCBmbm9yZCAoKSB7IHJldHVybiA0MjsgfQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZQorICAgICAgICB7CisJICBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSAgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAgICAgZWxzZSBwdXRzIChkbGVycm9yICgpKTsKKwl9CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICByZXR1cm4gc3RhdHVzOworfQorX0xUX0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9CisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgZmkKKyAgICA7OworICAqKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgIDs7CisgIGVzYWMKK2ZpCisKKworCisKKworCisKKworCisKKworCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbNC05XSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9CisKKworCisKK2ZpCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCitDQz0iJGx0X3NhdmVfQ0MiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KKyAgaWYgJHthY19jdl9wcm9nX0NYWENQUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCisKK2ZpCisgIENYWENQUD0kYWNfY3ZfcHJvZ19DWFhDUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1hYQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworZWxzZQorICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKK2ZpCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQorYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9Citjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYPW5vCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPQoraGFyZGNvZGVfZGlyZWN0X0NYWD1ubworaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlX0NYWD1ubworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KK2hhcmRjb2RlX21pbnVzX0xfQ1hYPW5vCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAoraGFyZGNvZGVfYXV0b21hdGljX0NYWD1ubworaW5oZXJpdF9ycGF0aF9DWFg9bm8KK21vZHVsZV9jbWRzX0NYWD0KK21vZHVsZV9leHBzeW1fY21kc19DWFg9CitsaW5rX2FsbF9kZXBsaWJzX0NYWD11bmtub3duCitvbGRfYXJjaGl2ZV9jbWRzX0NYWD0kb2xkX2FyY2hpdmVfY21kcworcmVsb2FkX2ZsYWdfQ1hYPSRyZWxvYWRfZmxhZworcmVsb2FkX2NtZHNfQ1hYPSRyZWxvYWRfY21kcworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPQorZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9DWFg9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBDWFggY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW10pIHsgcmV0dXJuKDApOyB9JworCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKworCisKKworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSAtciBjb25mdGVzdCoKKworCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9JENDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgbHRfc2F2ZV9MRD0kTEQKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBHQ0M9JEdYWAorICBsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorICBsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCisgIGZpCisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wYXRoX0xECisgIGZpCisgIHRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCisgIENDPSR7Q1hYLSJjKysifQorICBDRkxBR1M9JENYWEZMQUdTCisgIGNvbXBpbGVyPSRDQworICBjb21waWxlcl9DWFg9JENDCisgIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCisKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisgICAgIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQorICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9JyAtZm5vLWJ1aWx0aW4nCisgICAgZWxzZQorICAgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9CitmaQoraWYgJHtsdF9jdl9wYXRoX0xEKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1CiskYXNfZWNobyAiJExEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQordGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfZ251X2xkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKKworCisKKworCisgICAgICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKKyAgICAgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDICRwaWNfZmxhZyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgICAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8CisJICAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9CisgICAgICAgIGZpCisgICAgICBlbHNlCisgICAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICAgIHdsYXJjPQorCisgICAgICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBmaQorCisgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCisgICAgZWxzZQorICAgICAgR1hYPW5vCisgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgd2xhcmM9CisgICAgZmkKKworICAgICMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworICAgICAgYWl4WzQtOV0qKQorICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeFs1LTldKikKKwkgICAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICAgICAgY2FzZSAkbGRfZmxhZyBpbgorCSAgICAgICotYnJ0bCopCisJICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICAgICAgYnJlYWsKKwkgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIDs7CisgICAgICAgICAgZXNhYworCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICAgIGZpCisKKyAgICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJworICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYPXllcworICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0nOicKKyAgICAgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisgICAgICAgIGZpbGVfbGlzdF9zcGVjX0NYWD0nJHt3bH0tZiwnCisKKyAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKwkgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF9fQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF9fQ1hYIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoX19DWFgiOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWAorZmkKKworICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iLXogbm9kZWZzIgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgICAgICBlbHNlCisJICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisJICAgIGlmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIGlmICR7bHRfY3ZfYWl4X2xpYnBhdGhfX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWCI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF9fQ1hYIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoX19DWFgKK2ZpCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVybm90b2snCisJICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm9rJworCSAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICBlbHNlCisJICAgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSckY29udmVuaWVuY2UnCisJICAgIGZpCisJICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgICAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkCisJICAgICMgbGlicmFyaWVzLgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIDs7CisKKyAgICAgIGJlb3MqKQorCWlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorCSAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWVsc2UKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisKKyAgICAgIGNob3J1cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgKikKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgbGRfc2hsaWJzX0NYWD1ubworCSAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJY2FzZSAkR1hYLCRjY19iYXNlbmFtZSBpbgorCSxjbCogfCBubyxjbCopCisJICAjIE5hdGl2ZSBNU1ZDCisJICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisJICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyAnCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKKwkgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9eWVzCisJICBmaWxlX2xpc3Rfc3BlY19DWFg9J0AnCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCSAgbGliZXh0PWxpYgorCSAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJICBzaHJleHRfY21kcz0iLmRsbCIKKwkgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgJFNFRCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICAgIGVsc2UKKwkgICAgICAkU0VEIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZml+CisJICAgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgICAgbGlua25hbWVzPScKKwkgICMgVGhlIGxpbmtlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgc3RhdGljIGxpYiBpZiB3ZSBidWlsZCBhIERMTC4KKwkgICMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCBDWFgpPSd0cnVlJworCSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9eWVzCisJICAjIERvbid0IHVzZSByYW5saWIKKwkgIG9sZF9wb3N0aW5zdGFsbF9jbWRzX0NYWD0nY2htb2QgNjQ0ICRvbGRsaWInCisJICBwb3N0bGlua19jbWRzX0NYWD0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICAgKikKKwkJbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCQlsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCQk7OworCSAgICBlc2FjfgorCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGx0X291dHB1dGZpbGUifgorCSAgICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICAgIGZpJworCSAgOzsKKwkqKQorCSAgIyBnKysKKwkgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBDWFgpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorCSAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctTCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCisJICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCisJICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD15ZXMKKworCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBlbHNlCisJICAgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgZml+CisJICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgZmkKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorCisKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgaGFyZGNvZGVfYXV0b21hdGljX0NYWD15ZXMKKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKKyAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworCisgIGVsc2UKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JycKKyAgZmkKKyAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorICAgIGFyY2hpdmVfY21kc19DWFg9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgbW9kdWxlX2NtZHNfQ1hYPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgorICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgZmkKKworICBlbHNlCisgIGxkX3NobGlic19DWFg9bm8KKyAgZmkKKworCTs7CisKKyAgICAgIGRndXgqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGVjKysqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZDIuKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQorCSMgc3dpdGNoIHRvIEVMRgorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QtZWxmKikKKyAgICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAgICAgIyBjb252ZW50aW9ucworICAgICAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgICAgICA7OworCisgICAgICBnbnUqKQorICAgICAgICA7OworCisgICAgICBoYWlrdSopCisgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDkqKQorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKyAgICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkgICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKyAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBhQ0MqKQorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBocHV4MTAqfGhwdXgxMSopCisgICAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworICAgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisJICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCisgICAgICAgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9eWVzCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgIGFDQyopCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgaHBwYSo2NCopCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgIGlhNjQqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICBpYTY0KikKKwkgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgICopCisJICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICBlc2FjCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBpbnRlcml4WzMtOV0qKQorCWhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisgICAgICAgIGluaGVyaXRfcnBhdGhfQ1hYPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqICkKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgd2l0aF9nbnVfbGQ9eWVzCisJICAgICMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJICAgICMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJICAgICMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJICAgIGNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSAgICAgICoiVmVyc2lvbiA3LiIqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgICAqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgICAgICAgdG1wX2lkeW49CisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCQkgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkJZXNhYworCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICBlc2FjCisJICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICA7OworICAgICAgICAgIHBnQ0MqIHwgcGdjcHAqKQorICAgICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgY2FzZSBgJENDIC1WYCBpbgorCSAgICAqcGdDQ1wgWzEtNV0uKiB8ICpwZ2NwcFwgWzEtNV0uKikKKwkgICAgICBwcmVsaW5rX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2JqcyAkbGlib2JqcyAkY29tcGlsZV9kZXBsaWJzfgorCQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAiJworCSAgICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2xkb2JqcyRvbGRfZGVwbGlic34KKwkJJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGB+CisJCSRSQU5MSUIgJG9sZGxpYicKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgKikgIyBWZXJzaW9uIDYgYW5kIGFib3ZlIHVzZSB3ZWFrIHN5bWJvbHMKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICBlc2FjCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCisKKwkgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJworCSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkImA7IHRlbXBsaXN0PWBmdW5jX2VjaG9fYWxsICIkdGVtcGxpc3QiIHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisJICB4bCogfCBtcGl4bCogfCBiZ3hsKikKKwkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQywgd2l0aCBHTlUgbGQKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQljYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQkkQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgICAgZmkKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMnCisJICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwkgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgICAgY29tcGlsZXJfbmVlZHNfb2JqZWN0X0NYWD15ZXMKKworCSAgICAgICMgTm90IHN1cmUgd2hldGhlciBzb21ldGhpbmcgYmFzZWQgb24KKwkgICAgICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCisJICAgICAgIyB3b3VsZCBiZSBiZXR0ZXIuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbHlueG9zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisKKyAgICAgIG04OGsqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworCTs7CisKKyAgICAgIG12cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgY3h4KikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKwkgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIG5ldGJzZCopCisgICAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKwkgIHdsYXJjPQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWZpCisJIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKwk7OworCisgICAgICAqbnRvKiB8ICpxbngqKQorICAgICAgICBsZF9zaGxpYnNfQ1hYPXllcworCTs7CisKKyAgICAgIG9wZW5ic2QyKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgorCWxkX3NobGlic19DWFg9bm8KKwk7OworCisgICAgICBvcGVuYnNkKikKKwlpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCSAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYPXllcworCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworCSAgZmkKKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKKwllbHNlCisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworCisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKSBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgICAgKikgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICBlc2FjCisJICAgIDs7CisgICAgICAgICAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICBjeHgqKQorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopCisJICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCQk7OworCSAgICAgICopCisJICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgICAgICAgICAkUk0gJGxpYi5leHAnCisJICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCisJCTs7CisJICAgIGVzYWMKKworCSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICBvc2YzKikKKwkgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgICAqKQorCSAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICBlc2FjCisKKwkgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBwc29zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgICAgOzsKKworICAgICAgc3Vub3M0KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBzb2xhcmlzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyogfCBzdW5DQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgICAgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisJICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJICAgICAgKikKKwkJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4KKwkgICAgICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJICAgICMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0teiAke3dsfWRlZnMnCisJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGVsc2UKKwkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgICAgICMgcGxhdGZvcm0uCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisJICAgICAgZmkKKworCSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SICR3bCRsaWJkaXInCisJICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCQlzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJCSopCisJCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJCSAgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgQ0MqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorCSMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisJIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworCSMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorCSMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKwkjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKwkjIGFzIC16IGRlZnMuCisJbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LHRleHQnCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LG5vZGVmcycKKwlhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SLCRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCisJbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tQmV4cG9ydCcKKwlydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJG9sZG9ianN+CisJICAgICAgJyIkb2xkX2FyY2hpdmVfY21kc19DWFgiCisJICAgIHJlbG9hZF9jbWRzX0NYWD0nJENDIC1UcHJlbGlua19vYmplY3RzICRyZWxvYWRfb2Jqc34KKwkgICAgICAnIiRyZWxvYWRfY21kc19DWFgiCisJICAgIDs7CisJICAqKQorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJZXNhYworICAgICAgOzsKKworICAgICAgdGFuZGVtKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHZ4d29ya3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworICAgIGVzYWMKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1CiskYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQorICAgIHRlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworICAgIEdDQ19DWFg9IiRHWFgiCisgICAgTERfQ1hYPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICAjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorcHJlZGVwX29iamVjdHNfQ1hYPQorcG9zdGRlcF9vYmplY3RzX0NYWD0KK3ByZWRlcHNfQ1hYPQorcG9zdGRlcHNfQ1hYPQorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0KKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK19MVF9FT0YKKworCitfbHRfbGliZGVwc19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitjYXNlICIkQ0MgJENGTEFHUyAiIGluICMoCisqXCAtZmx0bypcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLWx0byIgOzsKKypcIC1md2hvcHIqXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby13aG9wciIgOzsKKypcIC1mdXNlLWxpbmtlci1wbHVnaW4qXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby11c2UtbGlua2VyLXBsdWdpbiIgOzsKK2VzYWMKKworaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHtwcmV2fSR7cH0gaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgIyBFeHBhbmQgdGhlIHN5c3Jvb3QgdG8gZWFzZSBleHRyYWN0aW5nIHRoZSBkaXJlY3RvcmllcyBsYXRlci4KKyAgICAgICBpZiB0ZXN0IC16ICIkcHJldiI7IHRoZW4KKyAgICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWVfY25mICctTCcgJycgIiRwIjsgcHJldj0tTDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLVInICcnICIkcCI7IHByZXY9LVI7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLWwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1sJyAnJyAiJHAiOyBwcmV2PS1sOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBmaQorICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICA9KikgZnVuY19zdHJpcG5hbWVfY25mICc9JyAnJyAiJHAiOyBwPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICR7cHJldn0gaW4KKwkgLUwgfCAtUikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCI7IHRoZW4KKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJHBvc3RkZXBzX0NYWCI7IHRoZW4KKwkgICBwb3N0ZGVwc19DWFg9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgcG9zdGRlcHNfQ1hYPSIke3Bvc3RkZXBzX0NYWH0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICBwcmV2PQorICAgICAgIDs7CisKKyAgICAqLmx0by4kb2JqZXh0KSA7OyAjIElnbm9yZSBHQ0MgTFRPIG9iamVjdHMKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRwcmVkZXBfb2JqZWN0c19DWFgiOyB0aGVuCisJICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcCIKKwkgZWxzZQorCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHByZWRlcF9vYmplY3RzX0NYWCAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRwb3N0ZGVwX29iamVjdHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwIgorCSBlbHNlCisJICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHBvc3RkZXBfb2JqZWN0c19DWFggJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgQ1hYIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRSTSAtZiBjb25mZXN0LiRvYmpleHQKK0NGTEFHUz0kX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1MKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXhbMy05XSopCisgICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KKyAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KKyAgcHJlZGVwX29iamVjdHNfQ1hYPQorICBwb3N0ZGVwX29iamVjdHNfQ1hYPQorICBwb3N0ZGVwc19DWFg9CisgIDs7CisKK2xpbnV4KikKKyAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisgICpTdW5cIEMqKQorICAgICMgU3VuIEMrKyA1LjkKKworICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgcG9zdGRlcHNfQ1hYPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyogfCBzdW5DQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIHBvc3RkZXBzX0NYWD0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworCisKK2Nhc2UgIiAkcG9zdGRlcHNfQ1hYICIgaW4KKyoiIC1sYyAiKikgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vIDs7Citlc2FjCisgY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD0KK2lmIHRlc3QgLW4gIiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0iOyB0aGVuCisgY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD1gZWNobyAiICR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0iIHwgJHtTRUR9IC1lICdzISAtTCEgIWcnIC1lICdzIV4gISEnYAorZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPQorbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorCisKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgIDs7CisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorICAgICAgOzsKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqcW54KiB8ICpudG8qKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeFs0LTldKikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCWVsc2UKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgQ1hYKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisJIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworCSMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctRERMTF9FWFBPUlQnCisJOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKKwk7OworICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCisJICAgIGZpCisJICAgIDs7CisJICBhQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCp8aWE2NCopCisJICAgICAgIyArWiB0aGUgZGVmYXVsdAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgaW50ZXJpeCopCisJIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCisJIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PworCTs7CisgICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgOzsKKwkgIGVjcGMqICkKKwkgICAgIyBvbGQgSW50ZWwgQysrIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgaWNwYyogKQorCSAgICAjIEludGVsIEMrKywgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisJICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyogfCBwZ2NwcCopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mcGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICB4bGMqIHwgeGxDKiB8IGJneGxbY0NdKiB8IG1waXhsW2NDXSopCisJICAgICMgSUJNIFhMIDguMCwgOS4wIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXFwaWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXFzdGF0aWNsaW5rJworCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1Rb3B0aW9uIGxkICcKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubworCTs7CisgICAgZXNhYworICBmaQorCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKKyAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWD0kbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNjsgfQorbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9bm8KKyAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID0geHllczsgdGhlbgorICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIDs7CisgICAgIGVzYWMKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KK2ZpCisKK2ZpCisKKworCisKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWFwiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorZmkKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNjsgfQorCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNjsgfQorCisKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9CisgIGhhcmRfbGlua3M9eWVzCisgICRSTSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CiskYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGV4Y2x1ZGVfZXhwc3ltc19DWFg9J19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKicKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbNC05XSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgICMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbCBkZWZpbmVkCisgICAgIyBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KKyAgICBpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikgfHwgKFwkIDIgPT0gIlciKSkgJiYgKHN1YnN0cihcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSIkbHRkbGxfY21kcyIKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgY2wqKQorICAgICAgZXhjbHVkZV9leHBzeW1zX0NYWD0nX05VTExfSU1QT1JUX0RFU0NSSVBUT1J8X0lNUE9SVF9ERVNDUklQVE9SXy4qJworICAgICAgOzsKKyAgICAqKQorICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxIERBVEEvO3MvXi4qWyBdX19ubV9fXChbXiBdKlwpWyBdW14gXSovXDEgREFUQS87L15JWyBdL2Q7L15bQUlUV11bIF0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIGV4Y2x1ZGVfZXhwc3ltc19DWFg9J1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgKikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgIDs7CisgIGVzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKKyRhc19lY2hvICIkbGRfc2hsaWJzX0NYWCIgPiY2OyB9Cit0ZXN0ICIkbGRfc2hsaWJzX0NYWCIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3dpdGhfZ251X2xkX0NYWD0kd2l0aF9nbnVfbGQKKworCisKKworCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHNfQ1hYIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworCWlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKwkgIHNvbmFtZT1jb25mdGVzdAorCSAgbGliPWNvbmZ0ZXN0CisJICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgIGRlcGxpYnM9CisJICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9DWFgKKwkgIHBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgKKwkgIGNvbXBpbGVyX2ZsYWdzPS12CisJICBsaW5rZXJfZmxhZ3M9LXYKKwkgIHZlcnN0cmluZz0KKwkgIG91dHB1dF9vYmpkaXI9LgorCSAgbGlibmFtZT1jb25mdGVzdAorCSAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9CisJICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kc19DWFggMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisJICB0aGVuCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworCSAgZWxzZQorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCisJICBmaQorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisJZmkKKwkkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY2OyB9CisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9JGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWAorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQorCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeFs0LTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgcG93ZXJwYykKKyAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCisgICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIDs7CisgIG02OGspCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gZnVuY19lY2hvX2FsbCAiJGxpYiIgfCAkU0VEICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJFJNIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICAgIDs7CisgIGVzYWMKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY2VnY2MqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKworICAqLGNsKikKKyAgICAjIE5hdGl2ZSBNU1ZDCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbYS16QS1aXVxcKTp8IC9cXDF8ZycgLWUgJ3N8XiB8fCdgCisgICAgICA7OworICAgIGN5Z3dpbiopCisgICAgICAjIENvbnZlcnQgdG8gdW5peCBmb3JtLCB0aGVuIHRvIGRvcyBmb3JtLCB0aGVuIGJhY2sgdG8gdW5peCBmb3JtCisgICAgICAjIGJ1dCB0aGlzIHRpbWUgZG9zIHN0eWxlIChubyBzcGFjZXMhKSBzbyB0aGF0IHRoZSB1bml4IGZvcm0gbG9va3MKKyAgICAgICMgbGlrZSAvY3lnZHJpdmUvYy9QUk9HUkF+MTovY3lnZHIuLi4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTElCImAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS1kb3MgIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIDI+L2Rldi9udWxsYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJExJQiIKKyAgICAgIGlmICRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRILgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgIyBGSVhNRTogZmluZCB0aGUgc2hvcnQgbmFtZSBvciB0aGUgcGF0aCBjb21wb25lbnRzLCBhcyBzcGFjZXMgYXJlCisgICAgICAjIGNvbW1vbi4gKGUuZy4gIlByb2dyYW0gRmlsZXMiIC0+ICJQUk9HUkF+MSIpCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsaW5rLmV4ZScKKyAgICA7OworCisgICopCisgICAgIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworICBlc2FjCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzIzXS4qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMi4qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hhaWt1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBydW50aW1lX2xvYWRlciIKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvYm9vdC9ob21lL2NvbmZpZy9saWIgL2Jvb3QvY29tbW9uL2xpYiAvYm9vdC9zeXN0ZW0vbGliJworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LCAuLi4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgICMgb3IgZmFpbHMgb3V0cmlnaHQsIHNvIG92ZXJyaWRlIGF0b21pY2FsbHk6CisgIGluc3RhbGxfb3ZlcnJpZGVfbW9kZT01NTUKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBpZiAke2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkbHRfcHJvZ19jb21waWxlcl93bF9DWFhcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWFwiIgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGlmICAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGw7IHRoZW4gOgorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCitmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgICAgbGliZGlyPSRzYXZlX2xpYmRpcgorCitmaQorCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsJIF0qaHdjYXBbCSBdL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7cy8iLy9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2RlbGYqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQoraGFyZGNvZGVfYWN0aW9uX0NYWD0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCIgfHwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3Zhcl9DWFgiIHx8CisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19DWFgiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9DWFgiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIENYWCkiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0NYWCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9DWFg9dW5zdXBwb3J0ZWQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNQorJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjY7IH0KKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID0gcmVsaW5rIHx8CisgICB0ZXN0ICIkaW5oZXJpdF9ycGF0aF9DWFgiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKworCisKKworCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKKyAgTERDWFg9JExECisgIExEPSRsdF9zYXZlX0xECisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKyAgbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorICBsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKKyAgbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitmaSAjIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgICAgIGFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBsaWJ0b29sIgorCisKKworCisjIE9ubHkgZXhwYW5kIG9uY2U6CisKKworCisjIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitmb3IgYWNfaGVhZGVyIGluIGZjbnRsLmggaW50dHlwZXMuaCBsaW1pdHMuaCBzdGRsaWIuaCB1bmlzdGQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jeHhfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBtZW1jbXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWVtY21wLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9bm8KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworCisgIC8qIFNvbWUgdmVyc2lvbnMgb2YgbWVtY21wIGFyZSBub3QgOC1iaXQgY2xlYW4uICAqLworICBjaGFyIGMwID0gJ1wxMDAnLCBjMSA9ICdcMjAwJywgYzIgPSAnXDIwMSc7CisgIGlmIChtZW1jbXAoJmMwLCAmYzIsIDEpID49IDAgfHwgbWVtY21wKCZjMSwgJmMyLCAxKSA+PSAwKQorICAgIHJldHVybiAxOworCisgIC8qIFRoZSBOZXh0IHg4NiBPcGVuU3RlcCBidWcgc2hvd3MgdXAgb25seSB3aGVuIGNvbXBhcmluZyAxNiBieXRlcworICAgICBvciBtb3JlIGFuZCB3aXRoIGF0IGxlYXN0IG9uZSBidWZmZXIgbm90IHN0YXJ0aW5nIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorICAgICBXaWxsaWFtIExld2lzIHByb3ZpZGVkIHRoaXMgdGVzdCBwcm9ncmFtLiAgICovCisgIHsKKyAgICBjaGFyIGZvb1syMV07CisgICAgY2hhciBiYXJbMjFdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICB7CisJY2hhciAqYSA9IGZvbyArIGk7CisJY2hhciAqYiA9IGJhciArIGk7CisJc3RyY3B5IChhLCAiLS0tLS0tLS0wMTExMTExMSIpOworCXN0cmNweSAoYiwgIi0tLS0tLS0tMTAwMDAwMDAiKTsKKwlpZiAobWVtY21wIChhLCBiLCAxNikgPj0gMCkKKwkgIHJldHVybiAxOworICAgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nIiA+JjY7IH0KK3Rlc3QgJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcgPSBubyAmJiBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBtZW1jbXAuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIG1lbWNtcC4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBzdHJ0b2QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgc3RydG9kLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfc3RydG9kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX3N0cnRvZD1ubworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaWZuZGVmIHN0cnRvZAorZG91YmxlIHN0cnRvZCAoKTsKKyNlbmRpZgoraW50CittYWluKCkKK3sKKyAgeworICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgTGludXggc3RydG9kIG1pcy1wYXJzZSBzdHJpbmdzIHdpdGggbGVhZGluZyAnKycuICAqLworICAgIGNoYXIgKnN0cmluZyA9ICIgKzY5IjsKKyAgICBjaGFyICp0ZXJtOworICAgIGRvdWJsZSB2YWx1ZTsKKyAgICB2YWx1ZSA9IHN0cnRvZCAoc3RyaW5nLCAmdGVybSk7CisgICAgaWYgKHZhbHVlICE9IDY5IHx8IHRlcm0gIT0gKHN0cmluZyArIDQpKQorICAgICAgcmV0dXJuIDE7CisgIH0KKworICB7CisgICAgLyogVW5kZXIgU29sYXJpcyAyLjQsIHN0cnRvZCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBmb3IgdGhlCisgICAgICAgdGVybWluYXRpbmcgY2hhcmFjdGVyIHVuZGVyIHNvbWUgY29uZGl0aW9ucy4gICovCisgICAgY2hhciAqc3RyaW5nID0gIk5hTiI7CisgICAgY2hhciAqdGVybTsKKyAgICBzdHJ0b2QgKHN0cmluZywgJnRlcm0pOworICAgIGlmICh0ZXJtICE9IHN0cmluZyAmJiAqKHRlcm0gLSAxKSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19zdHJ0b2Q9eWVzCitlbHNlCisgIGFjX2N2X2Z1bmNfc3RydG9kPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zdHJ0b2QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX3N0cnRvZCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX3N0cnRvZCA9IG5vOyB0aGVuCisgIGNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIHN0cnRvZC4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgc3RydG9kLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworYWNfZm5fY3h4X2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJwb3ciICJhY19jdl9mdW5jX3BvdyIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19wb3ciID0geHllczsgdGhlbiA6CisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfcG93ID0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcG93IGluIC1sbSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcG93IGluIC1sbS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfbV9wb3crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG0gICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHBvdyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHBvdyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9tX3Bvdz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX21fcG93PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9tX3BvdyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9tX3BvdyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9tX3BvdyIgPSB4eWVzOyB0aGVuIDoKKyAgUE9XX0xJQj0tbG0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYW5ub3QgZmluZCBsaWJyYXJ5IGNvbnRhaW5pbmcgZGVmaW5pdGlvbiBvZiBwb3ciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2Fubm90IGZpbmQgbGlicmFyeSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgcG93IiA+JjI7fQorZmkKKworZmkKKworZmkKKworZm9yIGFjX2Z1bmMgaW4gZnRydW5jYXRlIG1lbXNldCBta2RpciBzdHJjaHIgc3RyZXJyb3Igc3RydG9sCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY3h4X2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKKyMgQ2hlY2sgZm9yIHpsaWIuCitIQVZFX1pMSUI9MAoraWYgdGVzdCAiJHdpdGhfemxpYiIgIT0gbm87IHRoZW4gOgorCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgemxpYiB2ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHpsaWIgdmVyc2lvbi4uLiAiID4mNjsgfQorCisgICMgRmlyc3QgY2hlY2sgdGhlIHpsaWIgaGVhZGVyIHZlcnNpb24uCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworICAgICAgICAjaW5jbHVkZSA8emxpYi5oPgorICAgICAgICAjaWYgIWRlZmluZWQoWkxJQl9WRVJOVU0pIHx8IChaTElCX1ZFUk5VTSA8IDB4MTIwNCkKKyAgICAgICAgIyBlcnJvciB6bGliIHZlcnNpb24gdG9vIG9sZAorICAgICAgICAjZW5kaWYKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2sgKDEuMi4wLjQgb3IgbGF0ZXIpIiA+JjUKKyRhc19lY2hvICJvayAoMS4yLjAuNCBvciBsYXRlcikiID4mNjsgfQorCisgICAgIyBBbHNvIG5lZWQgdG8gYWRkIC1seiB0byB0aGUgbGlua2VyIGZsYWdzIGFuZCBtYWtlIHN1cmUgdGhpcyBzdWNjZWVkcy4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgemxpYlZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB6bGliVmVyc2lvbi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfemxpYlZlcnNpb24rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciB6bGliVmVyc2lvbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHpsaWJWZXJzaW9uICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHo7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF96bGliVmVyc2lvbj0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX3psaWJWZXJzaW9uKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF96bGliVmVyc2lvbis6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX3psaWJWZXJzaW9uPW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfemxpYlZlcnNpb24iID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfemxpYlZlcnNpb24iID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfemxpYlZlcnNpb24KK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1pMSUIgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgIEhBVkVfWkxJQj0xCisKK2Vsc2UKKworICAgICAgaWYgdGVzdCAiJHdpdGhfemxpYiIgIT0gY2hlY2s7IHRoZW4gOgorCisgICAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIi0td2l0aC16bGliIHdhcyBnaXZlbiwgYnV0IG5vIHdvcmtpbmcgemxpYiBsaWJyYXJ5IHdhcyBmb3VuZAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKworZmkKKworZmkKKworCitlbHNlCisKKyAgICBpZiB0ZXN0ICIkd2l0aF96bGliIiA9IGNoZWNrOyB0aGVuIDoKKworICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGhlYWRlcnMgbWlzc2luZyBvciB0b28gb2xkIChyZXF1aXJlcyAxLjIuMC40KSIgPiY1CiskYXNfZWNobyAiaGVhZGVycyBtaXNzaW5nIG9yIHRvbyBvbGQgKHJlcXVpcmVzIDEuMi4wLjQpIiA+JjY7IH0KKworZWxzZQorCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICItLXdpdGgtemxpYiB3YXMgZ2l2ZW4sIGJ1dCB6bGliIGhlYWRlcnMgd2VyZSBub3QgcHJlc2VudCBvciB3ZXJlIHRvbyBvbGQgKHJlcXVpcmVzIDEuMi4wLjQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorCitmaQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCisgaWYgdGVzdCAkSEFWRV9aTElCID0gMTsgdGhlbgorICBIQVZFX1pMSUJfVFJVRT0KKyAgSEFWRV9aTElCX0ZBTFNFPScjJworZWxzZQorICBIQVZFX1pMSUJfVFJVRT0nIycKKyAgSEFWRV9aTElCX0ZBTFNFPQorZmkKKworCitpZiB0ZXN0ICIkd2l0aF9wcm90b2MiICE9ICJubyI7IHRoZW4gOgorCisgIFBST1RPQz0kd2l0aF9wcm90b2MKKyAgaWYgdGVzdCAiJHdpdGhfcHJvdG9jIiA9ICJ5ZXMiOyB0aGVuIDoKKworICAgICMgTm8gYXJndW1lbnQgZ2l2ZW4uICBVc2Ugc3lzdGVtIHByb3RvYy4KKyAgICBQUk9UT0M9cHJvdG9jCisKK2ZpCisgIGlmIGVjaG8gIiRQUk9UT0MiIHwgZ3JlcCAtcSAnXlteL10uKi8nOyB0aGVuIDoKKworICAgICMgRG9lcyBub3Qgc3RhcnQgd2l0aCBhIHNsYXNoLCBidXQgY29udGFpbnMgYSBzbGFzaC4gIFNvLCBpdCdzIGEgcmVsYXRpdmUKKyAgICAjIHBhdGggKGFzIG9wcG9zZWQgdG8gYW4gYWJzb2x1dGUgcGF0aCBvciBhbiBleGVjdXRhYmxlIGluICRQQVRIKS4KKyAgICAjIFNpbmNlIGl0IHdpbGwgYWN0dWFsbHkgYmUgZXhlY3V0ZWQgZnJvbSB0aGUgc3JjIGRpcmVjdG9yeSwgcHJlZml4IHdpdGgKKyAgICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFdlIGFsc28gaW5zZXJ0ICRhY190b3BfYnVpbGRfcHJlZml4IGluIGNhc2UgdGhpcworICAgICMgaXMgYSBuZXN0ZWQgcGFja2FnZSBhbmQgLS13aXRoLXByb3RvYyB3YXMgYWN0dWFsbHkgZ2l2ZW4gb24gdGhlIG91dGVyCisgICAgIyBwYWNrYWdlJ3MgY29uZmlndXJlIHNjcmlwdC4KKyAgICBQUk9UT0M9YHB3ZGAvJHthY190b3BfYnVpbGRfcHJlZml4fSRQUk9UT0MKKworZmkKKworCitmaQorIGlmIHRlc3QgIiR3aXRoX3Byb3RvYyIgIT0gIm5vIjsgdGhlbgorICBVU0VfRVhURVJOQUxfUFJPVE9DX1RSVUU9CisgIFVTRV9FWFRFUk5BTF9QUk9UT0NfRkFMU0U9JyMnCitlbHNlCisgIFVTRV9FWFRFUk5BTF9QUk9UT0NfVFJVRT0nIycKKyAgVVNFX0VYVEVSTkFMX1BST1RPQ19GQUxTRT0KK2ZpCisKKworCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCithY3hfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTLi4uICIgPiY2OyB9CisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwdGhyZWFkX2pvaW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBwdGhyZWFkX2pvaW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWN4X3B0aHJlYWRfb2s9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY3hfcHRocmVhZF9vayIgPiY1CiskYXNfZWNobyAiJGFjeF9wdGhyZWFkX29rIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCithY3hfcHRocmVhZF9mbGFncz0icHRocmVhZHMgbm9uZSAtS3RocmVhZCAta3RocmVhZCBsdGhyZWFkIC1wdGhyZWFkIC1wdGhyZWFkcyAtbXRocmVhZHMgcHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCBwdGhyZWFkLWNvbmZpZyIKKworIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorIyBpbmRpdmlkdWFsIGl0ZW1zIGZvbGxvdzoKKworIyBwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyMgbm9uZTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorIyAgICAgICBvdGhlciBjb21waWxlciBmbGFncyB0byBwcmV2ZW50IGNvbnRpbnVhbCBjb21waWxlciB3YXJuaW5ncworIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisjIC1rdGhyZWFkOiBGcmVlQlNEIGtlcm5lbCB0aHJlYWRzIChwcmVmZXJyZWQgdG8gLXB0aHJlYWQgc2luY2UgU01QLWFibGUpCisjIGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorIyAtcHRocmVhZDogTGludXgvZ2NjIChrZXJuZWwgdGhyZWFkcyksIEJTRC9nY2MgKHVzZXJsYW5kIHRocmVhZHMpCisjIC1wdGhyZWFkczogU29sYXJpcy9nY2MKKyMgLW10aHJlYWRzOiBNaW5ndzMyL2djYywgTHlueC9nY2MKKyMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorIyAgICAgIGRvZXNuJ3QgaHVydCB0byBjaGVjayBzaW5jZSB0aGlzIHNvbWV0aW1lcyBkZWZpbmVzIHB0aHJlYWRzIHRvbzsKKyMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisjIHB0aHJlYWQ6IExpbnV4LCBldGNldGVyYQorIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisjIHB0aHJlYWQtY29uZmlnOiB1c2UgcHRocmVhZC1jb25maWcgcHJvZ3JhbSAoZm9yIEdOVSBQdGggbGlicmFyeSkKKworY2FzZSAiJHtob3N0X2NwdX0tJHtob3N0X29zfSIgaW4KKyAgICAgICAgKnNvbGFyaXMqKQorCisgICAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCisgICAgICAgICMgKG5vbi1mdW5jdGlvbmFsKSB2ZXJzaW9ucyBvZiB0aGUgcHRocmVhZHMgcm91dGluZXMsIHNvIGxpbmstYmFzZWQKKyAgICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCisgICAgICAgICMgYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhpcyBtYWNybywgc28gd2UgY291bGQgY2hlY2sgZm9yIHRoYXQsIGJ1dAorICAgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6CisKKyAgICAgICAgYWN4X3B0aHJlYWRfZmxhZ3M9Ii1wdGhyZWFkcyBwdGhyZWFkIC1tdCAtcHRocmVhZCAkYWN4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7Citlc2FjCisKK2lmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCitmb3IgZmxhZyBpbiAkYWN4X3B0aHJlYWRfZmxhZ3M7IGRvCisKKyAgICAgICAgY2FzZSAkZmxhZyBpbgorICAgICAgICAgICAgICAgIG5vbmUpCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIC0qKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWcuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKworCQlwdGhyZWFkLWNvbmZpZykKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwdGhyZWFkLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcHRocmVhZC1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY3hfcHRocmVhZF9jb25maWciOyB0aGVuCisgIGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnPSIkYWN4X3B0aHJlYWRfY29uZmlnIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnPSJ5ZXMiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnIiAmJiBhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZz0ibm8iCitmaQorZmkKK2FjeF9wdGhyZWFkX2NvbmZpZz0kYWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWcKK2lmIHRlc3QgLW4gIiRhY3hfcHRocmVhZF9jb25maWciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWN4X3B0aHJlYWRfY29uZmlnIiA+JjUKKyRhc19lY2hvICIkYWN4X3B0aHJlYWRfY29uZmlnIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKwkJaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9jb25maWciID0geG5vOyB0aGVuIGNvbnRpbnVlOyBmaQorCQlQVEhSRUFEX0NGTEFHUz0iYHB0aHJlYWQtY29uZmlnIC0tY2ZsYWdzYCIKKwkJUFRIUkVBRF9MSUJTPSJgcHRocmVhZC1jb25maWcgLS1sZGZsYWdzYCBgcHRocmVhZC1jb25maWcgLS1saWJzYCIKKwkJOzsKKworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iLWwkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBDaGVjayBmb3IgdmFyaW91cyBmdW5jdGlvbnMuICBXZSBtdXN0IGluY2x1ZGUgcHRocmVhZC5oLAorICAgICAgICAjIHNpbmNlIHNvbWUgZnVuY3Rpb25zIG1heSBiZSBtYWNyb3MuICAoT24gdGhlIFNlcXVlbnQsIHdlCisgICAgICAgICMgbmVlZCBhIHNwZWNpYWwgZmxhZyAtS3RocmVhZCB0byBtYWtlIHRoaXMgaGVhZGVyIGNvbXBpbGUuKQorICAgICAgICAjIFdlIGNoZWNrIGZvciBwdGhyZWFkX2pvaW4gYmVjYXVzZSBpdCBpcyBpbiAtbHB0aHJlYWQgb24gSVJJWAorICAgICAgICAjIHdoaWxlIHB0aHJlYWRfY3JlYXRlIGlzIGluIGxpYmMuICBXZSBjaGVjayBmb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgICAgICAgIyBkdWUgdG8gREVDIGNyYXppbmVzcyB3aXRoIC1scHRocmVhZHMuICBXZSBjaGVjayBmb3IKKyAgICAgICAgIyBwdGhyZWFkX2NsZWFudXBfcHVzaCBiZWNhdXNlIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHB0aHJlYWQKKyAgICAgICAgIyBmdW5jdGlvbnMgb24gU29sYXJpcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vbi1mdW5jdGlvbmFsIGxpYmMgc3R1Yi4KKyAgICAgICAgIyBXZSB0cnkgcHRocmVhZF9jcmVhdGUgb24gZ2VuZXJhbCBwcmluY2lwbGVzLgorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY3hfcHRocmVhZF9vaz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWN4X3B0aHJlYWRfb2siID4mNQorJGFzX2VjaG8gIiRhY3hfcHRocmVhZF9vayIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorCisgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorZG9uZQorZmkKKworIyBWYXJpb3VzIG90aGVyIGNoZWNrczoKK2lmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogSk9JTkFCTEUgYXR0cmlidXRlIGlzIGNhbGxlZCBVTkRFVEFDSEVELgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGpvaW5hYmxlIHB0aHJlYWQgYXR0cmlidXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZS4uLiAiID4mNjsgfQorCWF0dHJfbmFtZT11bmtub3duCisJZm9yIGF0dHIgaW4gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRDsgZG8KKwkgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworaW50IGF0dHI9JGF0dHI7IHJldHVybiBhdHRyOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGF0dHJfbmFtZT0kYXR0cjsgYnJlYWsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCWRvbmUKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhdHRyX25hbWUiID4mNQorJGFzX2VjaG8gIiRhdHRyX25hbWUiID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICIkYXR0cl9uYW1lIiAhPSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICRhdHRyX25hbWUKK19BQ0VPRgorCisgICAgICAgIGZpCisKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkcy4uLiAiID4mNjsgfQorICAgICAgICBmbGFnPW5vCisgICAgICAgIGNhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICAgICAqLWFpeCogfCAqLWZyZWVic2QqIHwgKi1kYXJ3aW4qKSBmbGFnPSItRF9USFJFQURfU0FGRSI7OworICAgICAgICAgICAgKnNvbGFyaXMqIHwgKi1vc2YqIHwgKi1ocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7CisgICAgICAgIGVzYWMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7ZmxhZ30iID4mNQorJGFzX2VjaG8gIiR7ZmxhZ30iID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGZsYWciICE9IHhubzsgdGhlbgorICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgZmkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBtdXN0IGNvbXBpbGUgd2l0aCB4bGNfciBvciBjY19yCisJaWYgdGVzdCB4IiRHQ0MiICE9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBmb3IgYWNfcHJvZyBpbiB4bGNfciBjY19yCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfUFRIUkVBRF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRQVEhSRUFEX0NDIjsgdGhlbgorICBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiRQVEhSRUFEX0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUFRIUkVBRF9DQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUFRIUkVBRF9DQz0kYWNfY3ZfcHJvZ19QVEhSRUFEX0NDCitpZiB0ZXN0IC1uICIkUFRIUkVBRF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQVEhSRUFEX0NDIiA+JjUKKyRhc19lY2hvICIkUFRIUkVBRF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRQVEhSRUFEX0NDIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJFBUSFJFQURfQ0MiIHx8IFBUSFJFQURfQ0M9IiR7Q0N9IgorCisgICAgICAgIGVsc2UKKyAgICAgICAgICBQVEhSRUFEX0NDPSRDQworCWZpCisKKwkjIFRoZSBuZXh0IHBhcnQgdHJpZXMgdG8gZGV0ZWN0IEdDQyBpbmNvbnNpc3RlbmN5IHdpdGggLXNoYXJlZCBvbiBzb21lCisJIyBhcmNoaXRlY3R1cmVzIGFuZCBzeXN0ZW1zLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGluIGNlcnRhaW4KKwkjIGNvbmZpZ3VyYXRpb25zLCB3aGVuIC1zaGFyZWQgaXMgc3BlY2lmaWVkLCBHQ0MgImZvcmdldHMiIHRvCisJIyBpbnRlcm5hbGx5IHVzZSB2YXJpb3VzIGZsYWdzIHdoaWNoIGFyZSBzdGlsbCBuZWNlc3NhcnkuCisKKwkjCisJIyBQcmVwYXJlIHRoZSBmbGFncworCSMKKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlzYXZlX0xJQlM9IiRMSUJTIgorCXNhdmVfQ0M9IiRDQyIKKworCSMgVHJ5IHdpdGggdGhlIGZsYWdzIGRldGVybWluZWQgYnkgdGhlIGVhcmxpZXIgY2hlY2tzLgorCSMKKwkjIC1XbCwteixkZWZzIGZvcmNlcyBsaW5rLXRpbWUgc3ltYm9sIHJlc29sdXRpb24sIHNvIHRoYXQgdGhlCisJIyBsaW5raW5nIGNoZWNrcyB3aXRoIC1zaGFyZWQgYWN0dWFsbHkgaGF2ZSBhbnkgdmFsdWUKKwkjCisJIyBGSVhNRTogLWZQSUMgaXMgcmVxdWlyZWQgZm9yIC1zaGFyZWQgb24gbWFueSBhcmNoaXRlY3R1cmVzLAorCSMgc28gd2Ugc3BlY2lmeSBpdCBoZXJlLCBidXQgdGhlIHJpZ2h0IHdheSB3b3VsZCBwcm9iYWJseSBiZSB0bworCSMgcHJvcGVybHkgZGV0ZWN0IHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgcmVxdWlyZWQuCisJQ0ZMQUdTPSItc2hhcmVkIC1mUElDIC1XbCwteixkZWZzICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCUxJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisJQ0M9IiRQVEhSRUFEX0NDIgorCisJIyBJbiBvcmRlciBub3QgdG8gY3JlYXRlIHNldmVyYWwgbGV2ZWxzIG9mIGluZGVudGF0aW9uLCB3ZSB0ZXN0CisJIyB0aGUgdmFsdWUgb2YgIiRkb25lIiB1bnRpbCB3ZSBmaW5kIHRoZSBjdXJlIG9yIHJ1biBvdXQgb2YgaWRlYXMuCisJZG9uZT0ibm8iCisKKwkjIEZpcnN0LCBtYWtlIHN1cmUgdGhlIENGTEFHUyB3ZSBhZGRlZCBhcmUgYWN0dWFsbHkgYWNjZXB0ZWQgYnkgb3VyCisJIyBjb21waWxlci4gIElmIG5vdCAoYW5kIE9TIFgncyBsZCwgZm9yIGluc3RhbmNlLCBkb2VzIG5vdCBhY2NlcHQgLXopLAorCSMgdGhlbiB3ZSBjYW4ndCBkbyB0aGlzIHRlc3QuCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBjaGVjayBmb3IgR0NDIHB0aHJlYWQvc2hhcmVkIGluY29uc2lzdGVuY2llcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGNoZWNrIGZvciBHQ0MgcHRocmVhZC9zaGFyZWQgaW5jb25zaXN0ZW5jaWVzLi4uICIgPiY2OyB9CisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgZG9uZT15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXMgOyB0aGVuCisJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJICAgZWxzZQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJICAgZmkKKwlmaQorCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtcHRocmVhZCBpcyBzdWZmaWNpZW50IHdpdGggLXNoYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1wdGhyZWFkIGlzIHN1ZmZpY2llbnQgd2l0aCAtc2hhcmVkLi4uICIgPiY2OyB9CisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBkb25lPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJICAgZWxzZQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSAgIGZpCisJZmkKKworCSMKKwkjIExpbnV4IGdjYyBvbiBzb21lIGFyY2hpdGVjdHVyZXMgc3VjaCBhcyBtaXBzL21pcHNlbCBmb3JnZXRzCisJIyBhYm91dCAtbHB0aHJlYWQKKwkjCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbHB0aHJlYWQgZml4ZXMgdGhhdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1scHRocmVhZCBmaXhlcyB0aGF0Li4uICIgPiY2OyB9CisJICAgTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRvbmU9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkgICAgICBQVEhSRUFEX0xJQlM9Ii1scHRocmVhZCAkUFRIUkVBRF9MSUJTIgorCSAgIGVsc2UKKwkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkgICBmaQorCWZpCisJIworCSMgRnJlZUJTRCA0LjEwIGdjYyBmb3JnZXRzIHRvIHVzZSAtbGNfciBpbnN0ZWFkIG9mIC1sYworCSMKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sY19yIGZpeGVzIHRoYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGNfciBmaXhlcyB0aGF0Li4uICIgPiY2OyB9CisJICAgTElCUz0iLWxjX3IgJFBUSFJFQURfTElCUyAkc2F2ZV9MSUJTIgorCSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRvbmU9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkgICAgICBQVEhSRUFEX0xJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMiCisJICAgZWxzZQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSAgIGZpCisJZmkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgIyBPSywgd2UgaGF2ZSBydW4gb3V0IG9mIGlkZWFzCisJICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBJbXBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgdG8gdXNlIHB0aHJlYWRzIHdpdGggc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbXBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgdG8gdXNlIHB0aHJlYWRzIHdpdGggc2hhcmVkIGxpYnJhcmllcyIgPiYyO30KKworCSAgICMgc28gaXQncyBub3Qgc2FmZSB0byBhc3N1bWUgdGhhdCB3ZSBtYXkgdXNlIHB0aHJlYWRzCisJICAgYWN4X3B0aHJlYWRfb2s9bm8KKwlmaQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdoYXQgd2UgaGF2ZSBzbyBmYXIgaXMgc3VmZmljaWVudCB3aXRoIC1ub3N0ZGxpYiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdoYXQgd2UgaGF2ZSBzbyBmYXIgaXMgc3VmZmljaWVudCB3aXRoIC1ub3N0ZGxpYi4uLiAiID4mNjsgfQorCUNGTEFHUz0iLW5vc3RkbGliICRDRkxBR1MiCisJIyB3ZSBuZWVkIGMgd2l0aCBub3N0ZGxpYgorCUxJQlM9IiRMSUJTIC1sYyIKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZG9uZT15ZXMKK2Vsc2UKKyAgZG9uZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwlpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJZWxzZQorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCWZpCisKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1scHRocmVhZCBzYXZlcyB0aGUgZGF5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxwdGhyZWFkIHNhdmVzIHRoZSBkYXkuLi4gIiA+JjY7IH0KKwkgICBMSUJTPSItbHB0aHJlYWQgJExJQlMiCisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisJICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRvbmU9eWVzCitlbHNlCisgIGRvbmU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCSAgICAgIFBUSFJFQURfTElCUz0iJFBUSFJFQURfTElCUyAtbHB0aHJlYWQiCisJICAgZWxzZQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogSW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgaG93IHRvIHVzZSBwdGhyZWFkcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMgYW5kIC1ub3N0ZGxpYiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbXBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgdG8gdXNlIHB0aHJlYWRzIHdpdGggc2hhcmVkIGxpYnJhcmllcyBhbmQgLW5vc3RkbGliIiA+JjI7fQorCSAgIGZpCisJZmkKKworCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCUxJQlM9IiRzYXZlX0xJQlMiCisJQ0M9IiRzYXZlX0NDIgorZWxzZQorICAgICAgICBQVEhSRUFEX0NDPSIkQ0MiCitmaQorCisKKworCisKKyMgRmluYWxseSwgZXhlY3V0ZSBBQ1RJT04tSUYtRk9VTkQvQUNUSU9OLUlGLU5PVC1GT1VORDoKK2lmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1BUSFJFQUQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgOgorZWxzZQorICAgICAgICBhY3hfcHRocmVhZF9vaz1ubworCitmaQorYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIGxvY2F0aW9uIG9mIGhhc2hfbWFwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRoZSBsb2NhdGlvbiBvZiBoYXNoX21hcC4uLiAiID4mNjsgfQorCisgICBhY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisgICBhY19jdl9jeHhfaGFzaF9tYXA9IiIKKyAgICMgRmlyc3QgdHJ5IHVub3JkZXJlZF9tYXAsIGJ1dCBub3Qgb24gZ2NjJ3MgYmVmb3JlIDQuMiAtLSBJJ3ZlCisgICAjIHNlZW4gdW5leHBsYWluYWJsZSB1bm9yZGVyZWRfbWFwIGJ1Z3Mgd2l0aCAtTzIgb24gb2xkZXIgZ2NjJ3MuCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA8IDIpKQorICAgICAgICAgICAgICAgICAgICMgZXJyb3IgR0NDIHRvbyBvbGQgZm9yIHVub3JkZXJlZF9tYXAKKyAgICAgICAgICAgICAgICAgICAjZW5kaWYKKworaW50CittYWluICgpCit7CisvKiBubyBwcm9ncmFtIGJvZHkgbmVjZXNzYXJ5ICovCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBzdGxfaGFzaF9vbGRfZ2NjPW5vCitlbHNlCisgIHN0bF9oYXNoX29sZF9nY2M9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBmb3IgbG9jYXRpb24gaW4gdW5vcmRlcmVkX21hcCB0cjEvdW5vcmRlcmVkX21hcDsgZG8KKyAgICAgZm9yIG5hbWVzcGFjZSBpbiBzdGQgc3RkOjp0cjE7IGRvCisgICAgICAgaWYgdGVzdCAteiAiJGFjX2N2X2N4eF9oYXNoX21hcCIgLWEgIiRzdGxfaGFzaF9vbGRfZ2NjIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgICMgU29tZSBvbGRlciBnY2MncyBoYXZlIGEgYnVnZ3kgdHIxLCBzbyB0ZXN0IGEgYml0IG9mIGNvZGUuCisgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGxvY2F0aW9uPgoraW50CittYWluICgpCit7Citjb25zdCAke25hbWVzcGFjZX06OnVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmluZCg1KSA9PSB0LmVuZCgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY3h4X2hhc2hfbWFwPSI8JGxvY2F0aW9uPiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgYWNfY3ZfY3h4X2hhc2hfbmFtZXNwYWNlPSIkbmFtZXNwYWNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY19jdl9jeHhfaGFzaF9tYXBfY2xhc3M9InVub3JkZXJlZF9tYXAiOworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgIGZpCisgICAgIGRvbmUKKyAgIGRvbmUKKyAgICMgTm93IHRyeSBoYXNoX21hcAorICAgZm9yIGxvY2F0aW9uIGluIGV4dC9oYXNoX21hcCBoYXNoX21hcDsgZG8KKyAgICAgZm9yIG5hbWVzcGFjZSBpbiBfX2dudV9jeHggIiIgc3RkIHN0ZGV4dDsgZG8KKyAgICAgICBpZiB0ZXN0IC16ICIkYWNfY3ZfY3h4X2hhc2hfbWFwIjsgdGhlbgorICAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRsb2NhdGlvbj4KK2ludAorbWFpbiAoKQoreworJHtuYW1lc3BhY2V9OjpoYXNoX21hcDxpbnQsIGludD4gdAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY3h4X2hhc2hfbWFwPSI8JGxvY2F0aW9uPiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgYWNfY3ZfY3h4X2hhc2hfbmFtZXNwYWNlPSIkbmFtZXNwYWNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY19jdl9jeHhfaGFzaF9tYXBfY2xhc3M9Imhhc2hfbWFwIjsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICBmaQorICAgICBkb25lCisgICBkb25lCisgICBhY19jdl9jeHhfaGFzaF9zZXQ9YGVjaG8gIiRhY19jdl9jeHhfaGFzaF9tYXAiIHwgc2VkIHMvbWFwL3NldC9gOworICAgYWNfY3ZfY3h4X2hhc2hfc2V0X2NsYXNzPWBlY2hvICIkYWNfY3ZfY3h4X2hhc2hfbWFwX2NsYXNzIiB8IHNlZCBzL21hcC9zZXQvYDsKKyAgIGlmIHRlc3QgLW4gIiRhY19jdl9jeHhfaGFzaF9tYXAiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSEFTSF9NQVAgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9IQVNIX1NFVCAxIiA+PmNvbmZkZWZzLmgKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBU0hfTUFQX0ggJGFjX2N2X2N4eF9oYXNoX21hcAorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVNIX1NFVF9IICRhY19jdl9jeHhfaGFzaF9zZXQKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFTSF9OQU1FU1BBQ0UgJGFjX2N2X2N4eF9oYXNoX25hbWVzcGFjZQorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVNIX01BUF9DTEFTUyAkYWNfY3ZfY3h4X2hhc2hfbWFwX2NsYXNzCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBU0hfU0VUX0NMQVNTICRhY19jdl9jeHhfaGFzaF9zZXRfY2xhc3MKK19BQ0VPRgorCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2N4eF9oYXNoX21hcCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2N4eF9oYXNoX21hcCIgPiY2OyB9CisgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogIiA+JjUKKyRhc19lY2hvICIiID4mNjsgfQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBhbiBTVEwgaGFzaF9tYXAiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY291bGQgbm90IGZpbmQgYW4gU1RMIGhhc2hfbWFwIiA+JjI7fQorICAgZmkKKworCisjIEhBQ0s6ICBNYWtlIGd0ZXN0J3MgY29uZmlndXJlIHNjcmlwdCBwaWNrIHVwIG91ciBjb3B5IG9mIENGTEFHUyBhbmQgQ1hYRkxBR1MsCisjICAgc2luY2UgdGhlIGZsYWdzIGFkZGVkIGJ5IEFDWF9DSEVDS19TVU5DQyBtdXN0IGJlIHVzZWQgd2hlbiBjb21waWxpbmcgZ3Rlc3QKKyMgICB0b28uCitleHBvcnQgQ0ZMQUdTCitleHBvcnQgQ1hYRkxBR1MKKworCitzdWJkaXJzPSIkc3ViZGlycyBndGVzdCIKKworCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUgc3JjL01ha2VmaWxlIHByb3RvYnVmLnBjIHByb3RvYnVmLWxpdGUucGMiCisKK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCisjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzLgorCitfQUNFT0YKKworIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCisgICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKSB8CisgIHNlZCAnCisgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorICAgICB0IGNsZWFyCisgICAgIDpjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6ZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIjsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICAgIGlmIHRlc3QgISAtZiAiJGNhY2hlX2ZpbGUiIHx8IHRlc3QgLWggIiRjYWNoZV9maWxlIjsgdGhlbgorCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbiAjKAorICAgICAgICAqLyogfCA/OiopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCisJICBtdiAtZiAiJGNhY2hlX2ZpbGUiJCQgIiRjYWNoZV9maWxlIiA7OyAjKAorICAgICAgICAqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKKwllc2FjCisgICAgICBmaQorICAgIGZpCisgIGVsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworYWNfbGlib2Jqcz0KK2FjX2x0bGlib2Jqcz0KK1U9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCisgIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKK2lmIHRlc3QgLXogIiR7TUFJTlRBSU5FUl9NT0RFX1RSVUV9IiAmJiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk1BSU5UQUlORVJfTU9ERVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKKyBpZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgorICBhbV9fRVhFRVhUX1RSVUU9CisgIGFtX19FWEVFWFRfRkFMU0U9JyMnCitlbHNlCisgIGFtX19FWEVFWFRfVFJVRT0nIycKKyAgYW1fX0VYRUVYVF9GQUxTRT0KK2ZpCisKK2lmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENYWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7R0NDX1RSVUV9IiAmJiB0ZXN0IC16ICIke0dDQ19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkdDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7SEFWRV9aTElCX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfWkxJQl9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfWkxJQlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7VVNFX0VYVEVSTkFMX1BST1RPQ19UUlVFfSIgJiYgdGVzdCAteiAiJHtVU0VfRVhURVJOQUxfUFJPVE9DX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiVVNFX0VYVEVSTkFMX1BST1RPQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKKworOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCithY193cml0ZV9mYWlsPTAKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2FzX3dyaXRlX2ZhaWw9MAorY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2RlYnVnPWZhbHNlCithY19jc19yZWNoZWNrPWZhbHNlCithY19jc19zaWxlbnQ9ZmFsc2UKKworU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK2V4cG9ydCBTSEVMTAorX0FTRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl91bnNldCBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tCisjIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisjIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCisjIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKKyMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKKyMgaW1wbGVtZW50YXRpb25zLgoraWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDErPVwkMgorICB9JworZWxzZQorICBhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDE9XCQkMVwkMgorICB9CitmaSAjIGFzX2ZuX2FwcGVuZAorCisjIGFzX2ZuX2FyaXRoIEFSRy4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQorIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCisjIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgoraWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9JCgoICQqICkpCisgIH0nCitlbHNlCisgIGFzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAorICB9CitmaSAjIGFzX2ZuX2FyaXRoCisKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluICMoKCgoKAorLW4qKQorICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgIHh5KSAgRUNIT19DPSdcYyc7OworICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCisgICAgICAgRUNIT19UPScJJzs7CisgIGVzYWM7OworKikKKyAgRUNIT19OPSctbic7OworZXNhYworCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCitmaQoraWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPSdsbiAtcycKKyAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgICBhc19sbl9zPSdjcCAtcCcKKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPWxuCisgIGVsc2UKKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgZmkKK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAoraWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworZXhlYyA2PiYxCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mICRDT05GSUdfU1RBVFVTIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNFT0YKK3Rlc3QgJGFzX3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICQwIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgorIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KK2FjX2xvZz0iCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IFByb3RvY29sIEJ1ZmZlcnMgJGFzX21lIDIuNS4wLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICAkICQwICRACisKK29uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorIgorCitfQUNFT0YKKworY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Citlc2FjCisKK2Nhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworZXNhYworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKK2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKK2Zyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcworYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKKyAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgICAgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCisKK0NvbmZpZ3VyYXRpb24gZmlsZXM6CiskY29uZmlnX2ZpbGVzCisKK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKKyRjb25maWdfaGVhZGVycworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byA8cHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbT4uIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKK2FjX2NzX3ZlcnNpb249IlxcCitQcm90b2NvbCBCdWZmZXJzIGNvbmZpZy5zdGF0dXMgMi41LjAKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OCwKKyAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCisKK0NvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKworYWNfcHdkPSckYWNfcHdkJworc3JjZGlyPSckc3JjZGlyJworSU5TVEFMTD0nJElOU1RBTEwnCitNS0RJUl9QPSckTUtESVJfUCcKK0FXSz0nJEFXSycKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPT8qKQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtLSo9KQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPQorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAqKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKKyAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKKyAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKKworICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBzZXQgWCAnJFNIRUxMJyAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCisgIHNoaWZ0CisgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisgIENPTkZJR19TSEVMTD0nJFNIRUxMJworICBleHBvcnQgQ09ORklHX1NIRUxMCisgIGV4ZWMgIlwkQCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCisgICRhc19lY2hvICIkYWNfbG9nIgorfSA+JjUKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMKKyMgSU5JVC1DT01NQU5EUworIworQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIgorCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKK2RvdWJsZV9xdW90ZV9zdWJzdD0nJGRvdWJsZV9xdW90ZV9zdWJzdCcKK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSckZGVsYXlfdmFyaWFibGVfc3Vic3QnCittYWNyb192ZXJzaW9uPSdgJEVDSE8gIiRtYWNyb192ZXJzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21hY3JvX3JldmlzaW9uPSdgJEVDSE8gIiRtYWNyb19yZXZpc2lvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfc2hhcmVkPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zdGF0aWM9J2AkRUNITyAiJGVuYWJsZV9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcGljX21vZGU9J2AkRUNITyAiJHBpY19tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9mYXN0X2luc3RhbGw9J2AkRUNITyAiJGVuYWJsZV9mYXN0X2luc3RhbGwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU0hFTEw9J2AkRUNITyAiJFNIRUxMIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0VDSE89J2AkRUNITyAiJEVDSE8iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworUEFUSF9TRVBBUkFUT1I9J2AkRUNITyAiJFBBVEhfU0VQQVJBVE9SIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hvc3RfYWxpYXM9J2AkRUNITyAiJGhvc3RfYWxpYXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaG9zdD0nYCRFQ0hPICIkaG9zdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitob3N0X29zPSdgJEVDSE8gIiRob3N0X29zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2J1aWxkX2FsaWFzPSdgJEVDSE8gIiRidWlsZF9hbGlhcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitidWlsZD0nYCRFQ0hPICIkYnVpbGQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYnVpbGRfb3M9J2AkRUNITyAiJGJ1aWxkX29zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1NFRD0nYCRFQ0hPICIkU0VEIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1hzZWQ9J2AkRUNITyAiJFhzZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworR1JFUD0nYCRFQ0hPICIkR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitFR1JFUD0nYCRFQ0hPICIkRUdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRkdSRVA9J2AkRUNITyAiJEZHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xEPSdgJEVDSE8gIiRMRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitOTT0nYCRFQ0hPICIkTk0iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTE5fUz0nYCRFQ0hPICIkTE5fUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittYXhfY21kX2xlbj0nYCRFQ0hPICIkbWF4X2NtZF9sZW4iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWNfb2JqZXh0PSdgJEVDSE8gIiRhY19vYmpleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhlZXh0PSdgJEVDSE8gIiRleGVleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfdW5zZXQ9J2AkRUNITyAiJGx0X3Vuc2V0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X1NQMk5MPSdgJEVDSE8gIiRsdF9TUDJOTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9OTDJTUD0nYCRFQ0hPICIkbHRfTkwyU1AiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfdG9faG9zdF9maWxlX2NtZD0nYCRFQ0hPICIkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl90b190b29sX2ZpbGVfY21kPSdgJEVDSE8gIiRsdF9jdl90b190b29sX2ZpbGVfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3JlbG9hZF9mbGFnPSdgJEVDSE8gIiRyZWxvYWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCityZWxvYWRfY21kcz0nYCRFQ0hPICIkcmVsb2FkX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT0JKRFVNUD0nYCRFQ0hPICIkT0JKRFVNUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitkZXBsaWJzX2NoZWNrX21ldGhvZD0nYCRFQ0hPICIkZGVwbGlic19jaGVja19tZXRob2QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9tYWdpY19jbWQ9J2AkRUNITyAiJGZpbGVfbWFnaWNfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbWFnaWNfZ2xvYj0nYCRFQ0hPICIkZmlsZV9tYWdpY19nbG9iIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dhbnRfbm9jYXNlZ2xvYj0nYCRFQ0hPICIkd2FudF9ub2Nhc2VnbG9iIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0RMTFRPT0w9J2AkRUNITyAiJERMTFRPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9J2AkRUNITyAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0FSPSdgJEVDSE8gIiRBUiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitBUl9GTEFHUz0nYCRFQ0hPICIkQVJfRkxBR1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZXJfbGlzdF9zcGVjPSdgJEVDSE8gIiRhcmNoaXZlcl9saXN0X3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU1RSSVA9J2AkRUNITyAiJFNUUklQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1JBTkxJQj0nYCRFQ0hPICIkUkFOTElCIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPSdgJEVDSE8gIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQ0M9J2AkRUNITyAiJENDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0NGTEFHUz0nYCRFQ0hPICIkQ0ZMQUdTIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyPSdgJEVDSE8gIiRjb21waWxlciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitHQ0M9J2AkRUNITyAiJEdDQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitubV9maWxlX2xpc3Rfc3BlYz0nYCRFQ0hPICIkbm1fZmlsZV9saXN0X3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfc3lzcm9vdD0nYCRFQ0hPICIkbHRfc3lzcm9vdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvYmpkaXI9J2AkRUNITyAiJG9iamRpciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitNQUdJQ19DTUQ9J2AkRUNITyAiJE1BR0lDX0NNRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9waWM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfcGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfd2w9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfd2wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vPSdgJEVDSE8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCituZWVkX2xvY2tzPSdgJEVDSE8gIiRuZWVkX2xvY2tzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK01BTklGRVNUX1RPT0w9J2AkRUNITyAiJE1BTklGRVNUX1RPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRFNZTVVUSUw9J2AkRUNITyAiJERTWU1VVElMIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK05NRURJVD0nYCRFQ0hPICIkTk1FRElUIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xJUE89J2AkRUNITyAiJExJUE8iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT1RPT0w9J2AkRUNITyAiJE9UT09MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK09UT09MNjQ9J2AkRUNITyAiJE9UT09MNjQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGliZXh0PSdgJEVDSE8gIiRsaWJleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hyZXh0X2NtZHM9J2AkRUNITyAiJHNocmV4dF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4dHJhY3RfZXhwc3ltc19jbWRzPSdgJEVDSE8gIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2NtZHNfbmVlZF9sYz0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX25lZWRfbGMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz0nYCRFQ0hPICIkZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9J2AkRUNITyAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nYCRFQ0hPICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbmVlZHNfb2JqZWN0PSdgJEVDSE8gIiRjb21waWxlcl9uZWVkc19vYmplY3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9jbWRzPSdgJEVDSE8gIiRhcmNoaXZlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9leHBzeW1fY21kcz0nYCRFQ0hPICIkYXJjaGl2ZV9leHBzeW1fY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittb2R1bGVfY21kcz0nYCRFQ0hPICIkbW9kdWxlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbW9kdWxlX2V4cHN5bV9jbWRzPSdgJEVDSE8gIiRtb2R1bGVfZXhwc3ltX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2l0aF9nbnVfbGQ9J2AkRUNITyAiJHdpdGhfZ251X2xkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FsbG93X3VuZGVmaW5lZF9mbGFnPSdgJEVDSE8gIiRhbGxvd191bmRlZmluZWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitub191bmRlZmluZWRfZmxhZz0nYCRFQ0hPICIkbm9fdW5kZWZpbmVkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYCRFQ0hPICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdD0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX21pbnVzX0w9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWM9J2AkRUNITyAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmhlcml0X3JwYXRoPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpbmtfYWxsX2RlcGxpYnM9J2AkRUNITyAiJGxpbmtfYWxsX2RlcGxpYnMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSdgJEVDSE8gIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X3N5bWJvbHNfY21kcz0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGV4Y2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVsaW5rX2NtZHM9J2AkRUNITyAiJHByZWxpbmtfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0bGlua19jbWRzPSdgJEVDSE8gIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRmaWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0nYCRFQ0hPICIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF9saWJfcHJlZml4PSdgJEVDSE8gIiRuZWVkX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF92ZXJzaW9uPSdgJEVDSE8gIiRuZWVkX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwordmVyc2lvbl90eXBlPSdgJEVDSE8gIiR2ZXJzaW9uX3R5cGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcnVucGF0aF92YXI9J2AkRUNITyAiJHJ1bnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NobGlicGF0aF92YXI9J2AkRUNITyAiJHNobGlicGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSdgJEVDSE8gIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlibmFtZV9zcGVjPSdgJEVDSE8gIiRsaWJuYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlicmFyeV9uYW1lc19zcGVjPSdgJEVDSE8gIiRsaWJyYXJ5X25hbWVzX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc29uYW1lX3NwZWM9J2AkRUNITyAiJHNvbmFtZV9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luc3RhbGxfb3ZlcnJpZGVfbW9kZT0nYCRFQ0hPICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRwb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmluaXNoX2NtZHM9J2AkRUNITyAiJGZpbmlzaF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbmlzaF9ldmFsPSdgJEVDSE8gIiRmaW5pc2hfZXZhbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9pbnRvX2xpYnM9J2AkRUNITyAiJGhhcmRjb2RlX2ludG9fbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9J2AkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfYWN0aW9uPSdgJEVDSE8gIiRoYXJkY29kZV9hY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Rsb3Blbj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3BlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGY9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9zdHJpcGxpYj0nYCRFQ0hPICIkb2xkX3N0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N0cmlwbGliPSdgJEVDSE8gIiRzdHJpcGxpYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9J2AkRUNITyAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0cz0nYCRFQ0hPICIkcHJlZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGRlcF9vYmplY3RzPSdgJEVDSE8gIiRwb3N0ZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcHJlZGVwcz0nYCRFQ0hPICIkcHJlZGVwcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwcz0nYCRFQ0hPICIkcG9zdGRlcHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSdgJEVDSE8gIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTERfQ1hYPSdgJEVDSE8gIiRMRF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRyZWxvYWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2NtZHNfQ1hYPSdgJEVDSE8gIiRyZWxvYWRfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfY21kc19DWFg9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dDQ19DWFg9J2AkRUNITyAiJEdDQ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl93bF9DWFg9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD0nYCRFQ0hPICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPSdgJEVDSE8gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nYCRFQ0hPICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX25lZWRzX29iamVjdF9DWFg9J2AkRUNITyAiJGNvbXBpbGVyX25lZWRzX29iamVjdF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFg9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWD0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19DWFg9J2AkRUNITyAiJGFyY2hpdmVfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2AkRUNITyAiJGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9jbWRzX0NYWD0nYCRFQ0hPICIkbW9kdWxlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9leHBzeW1fY21kc19DWFg9J2AkRUNITyAiJG1vZHVsZV9leHBzeW1fY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2l0aF9nbnVfbGRfQ1hYPSdgJEVDSE8gIiR3aXRoX2dudV9sZF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRub191bmRlZmluZWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9kaXJlY3RfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3RfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbWludXNfTF9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0xfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luaGVyaXRfcnBhdGhfQ1hYPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaW5rX2FsbF9kZXBsaWJzX0NYWD0nYCRFQ0hPICIkbGlua19hbGxfZGVwbGlic19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD0nYCRFQ0hPICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhjbHVkZV9leHBzeW1zX0NYWD0nYCRFQ0hPICIkZXhjbHVkZV9leHBzeW1zX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXNfQ1hYPSdgJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWxpbmtfY21kc19DWFg9J2AkRUNITyAiJHByZWxpbmtfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGxpbmtfY21kc19DWFg9J2AkRUNITyAiJHBvc3RsaW5rX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjX0NYWD0nYCRFQ0hPICIkZmlsZV9saXN0X3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2FjdGlvbl9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0c19DWFg9J2AkRUNITyAiJHByZWRlcF9vYmplY3RzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwX29iamVjdHNfQ1hYPSdgJEVDSE8gIiRwb3N0ZGVwX29iamVjdHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWRlcHNfQ1hYPSdgJEVDSE8gIiRwcmVkZXBzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwc19DWFg9J2AkRUNITyAiJHBvc3RkZXBzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPSdgJEVDSE8gIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKKworTFRDQz0nJExUQ0MnCitMVENGTEFHUz0nJExUQ0ZMQUdTJworY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJworCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisKKyMgUXVvdGUgZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIFNIRUxMIFwKK0VDSE8gXAorUEFUSF9TRVBBUkFUT1IgXAorU0VEIFwKK0dSRVAgXAorRUdSRVAgXAorRkdSRVAgXAorTEQgXAorTk0gXAorTE5fUyBcCitsdF9TUDJOTCBcCitsdF9OTDJTUCBcCityZWxvYWRfZmxhZyBcCitPQkpEVU1QIFwKK2RlcGxpYnNfY2hlY2tfbWV0aG9kIFwKK2ZpbGVfbWFnaWNfY21kIFwKK2ZpbGVfbWFnaWNfZ2xvYiBcCit3YW50X25vY2FzZWdsb2IgXAorRExMVE9PTCBcCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCBcCitBUiBcCitBUl9GTEFHUyBcCithcmNoaXZlcl9saXN0X3NwZWMgXAorU1RSSVAgXAorUkFOTElCIFwKK0NDIFwKK0NGTEFHUyBcCitjb21waWxlciBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXggXAorbm1fZmlsZV9saXN0X3NwZWMgXAorbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgXAorbHRfcHJvZ19jb21waWxlcl9waWMgXAorbHRfcHJvZ19jb21waWxlcl93bCBcCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyBcCitsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCituZWVkX2xvY2tzIFwKK01BTklGRVNUX1RPT0wgXAorRFNZTVVUSUwgXAorTk1FRElUIFwKK0xJUE8gXAorT1RPT0wgXAorT1RPT0w2NCBcCitzaHJleHRfY21kcyBcCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgXAorY29tcGlsZXJfbmVlZHNfb2JqZWN0IFwKK3dpdGhfZ251X2xkIFwKK2FsbG93X3VuZGVmaW5lZF9mbGFnIFwKK25vX3VuZGVmaW5lZF9mbGFnIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCitleGNsdWRlX2V4cHN5bXMgXAoraW5jbHVkZV9leHBzeW1zIFwKK2ZpbGVfbGlzdF9zcGVjIFwKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIFwKK2xpYm5hbWVfc3BlYyBcCitsaWJyYXJ5X25hbWVzX3NwZWMgXAorc29uYW1lX3NwZWMgXAoraW5zdGFsbF9vdmVycmlkZV9tb2RlIFwKK2ZpbmlzaF9ldmFsIFwKK29sZF9zdHJpcGxpYiBcCitzdHJpcGxpYiBcCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgXAorcHJlZGVwX29iamVjdHMgXAorcG9zdGRlcF9vYmplY3RzIFwKK3ByZWRlcHMgXAorcG9zdGRlcHMgXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKK0xEX0NYWCBcCityZWxvYWRfZmxhZ19DWFggXAorY29tcGlsZXJfQ1hYIFwKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWCBcCitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAorbHRfcHJvZ19jb21waWxlcl93bF9DWFggXAorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIFwKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCBcCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIFwKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWCBcCitjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYIFwKK3dpdGhfZ251X2xkX0NYWCBcCithbGxvd191bmRlZmluZWRfZmxhZ19DWFggXAorbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIFwKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYIFwKK2V4Y2x1ZGVfZXhwc3ltc19DWFggXAoraW5jbHVkZV9leHBzeW1zX0NYWCBcCitmaWxlX2xpc3Rfc3BlY19DWFggXAorY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCBcCitwcmVkZXBfb2JqZWN0c19DWFggXAorcG9zdGRlcF9vYmplY3RzX0NYWCBcCitwcmVkZXBzX0NYWCBcCitwb3N0ZGVwc19DWFggXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWDsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1xcXFxcXFxgXFwiXFxcJF0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gcmVsb2FkX2NtZHMgXAorb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAorb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCitvbGRfYXJjaGl2ZV9jbWRzIFwKK2V4dHJhY3RfZXhwc3ltc19jbWRzIFwKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorYXJjaGl2ZV9jbWRzIFwKK2FyY2hpdmVfZXhwc3ltX2NtZHMgXAorbW9kdWxlX2NtZHMgXAorbW9kdWxlX2V4cHN5bV9jbWRzIFwKK2V4cG9ydF9zeW1ib2xzX2NtZHMgXAorcHJlbGlua19jbWRzIFwKK3Bvc3RsaW5rX2NtZHMgXAorcG9zdGluc3RhbGxfY21kcyBcCitwb3N0dW5pbnN0YWxsX2NtZHMgXAorZmluaXNoX2NtZHMgXAorc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIFwKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKK3JlbG9hZF9jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAorYXJjaGl2ZV9jbWRzX0NYWCBcCithcmNoaXZlX2V4cHN5bV9jbWRzX0NYWCBcCittb2R1bGVfY21kc19DWFggXAorbW9kdWxlX2V4cHN5bV9jbWRzX0NYWCBcCitleHBvcnRfc3ltYm9sc19jbWRzX0NYWCBcCitwcmVsaW5rX2NtZHNfQ1hYIFwKK3Bvc3RsaW5rX2NtZHNfQ1hYOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInCit4c2lfc2hlbGw9JyR4c2lfc2hlbGwnCitsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnCisKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCisKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJworCisKKworCisKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OworICAgICJkZXBmaWxlcyIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBkZXBmaWxlcyIgOzsKKyAgICAibGlidG9vbCIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBsaWJ0b29sIiA7OworICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgICAic3JjL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNyYy9NYWtlZmlsZSIgOzsKKyAgICAicHJvdG9idWYucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcHJvdG9idWYucGMiIDs7CisgICAgInByb3RvYnVmLWxpdGUucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcHJvdG9idWYtbGl0ZS5wYyIgOzsKKworICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKKyAgZXNhYworZG9uZQorCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKKyMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorJGRlYnVnIHx8Cit7CisgIHRtcD0gYWNfdG1wPQorICB0cmFwICdleGl0X3N0YXR1cz0kPworICA6ICIke2FjX3RtcDo9JHRtcH0iCisgIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorYWNfdG1wPSR0bXAKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgoraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKworCithY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCisjIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCisjIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKKyMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCitpZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KKyAgZXZhbCBhY19jcj1cJFwnXFxyXCcKK2ZpCithY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCitpZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgorICBhY19jc19hd2tfY3I9J1xccicKK2Vsc2UKKyAgYWNfY3NfYXdrX2NyPSRhY19jcgorZmkKKworZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKK19BQ0VPRgorCisKK3sKKyAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKyAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgorICBlY2hvICJfQUNFT0YiCit9ID5jb25mJCRzdWJzLnNoIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK2FjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCisgIC4gLi9jb25mJCRzdWJzLnNoIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCisgIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorcm0gLWYgY29uZiQkc3Vicy5zaAorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKK19BQ0VPRgorc2VkIC1uICcKK2gKK3MvXi9TWyIvOyBzLyEuKi8iXT0vCitwCitnCitzL15bXiFdKiEvLworOnJlcGwKK3QgcmVwbAorcy8nIiRhY19kZWxpbSInJC8vCit0IGRlbGltCis6bmwKK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworcAorbgorYiByZXBsCis6bW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBubAorOmRlbGltCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCitwCitiCis6bW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBkZWxpbQorJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJworL15bXiIiXS97CisgIE4KKyAgcy9cbi8vCit9CisnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCitybSAtZiBjb25mJCRzdWJzLmF3aworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitfQUNBV0sKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCisgIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCisKK30KK3sKKyAgbGluZSA9ICQgMAorICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKKyAgc3Vic3RlZCA9IDAKKyAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQorICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7CisgICAga2V5ID0gZmllbGRbaV0KKyAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQorICAgIGlmIChTX2lzX3NldFtrZXldKSB7CisgICAgICB2YWx1ZSA9IFNba2V5XQorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQorICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKKyAgICAgIHN1YnN0ZWQgPSAxCisgICAgfSBlbHNlCisgICAgICBsZW4gKz0gMSArIGtleWxlbgorICB9CisKKyAgcHJpbnQgbGluZQorfQorCitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQoraWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCitlbHNlCisgIGNhdAorZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorX0FDRU9GCisKKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKK2gKK3MvLy8KK3MvXi86Lworcy9bCSBdKiQvOi8KK3MvOlwkKHNyY2Rpcik6LzovZworcy86XCR7c3JjZGlyfTovOi9nCitzLzpAc3JjZGlyQDovOi9nCitzL146Ki8vCitzLzoqJC8vCit4CitzL1woPVsJIF0qXCkuKi9cMS8KK0cKK3MvXG4vLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCitpZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCitjYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKK0JFR0lOIHsKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bworIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorCisjIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCisjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCisgIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKKyAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCisKKyMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAorIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCisjIG5ld2xpbmUgc2VxdWVuY2VzLgorCithY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorc2VkIC1uICcKK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCByc2V0Cis6cnNldAorcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KK3QgZGVmCitkCis6ZGVmCitzL1xcJC8vCit0IGJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzIi9wCitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAorZAorOmJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCit0IGNvbnQKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCit0IGNvbnQKK2QKKzpjb250CituCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgY2xlYXIKKzpjbGVhcgorcy9cXCQvLwordCBic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCitkCis6YnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAorYiBjb250CisnIDxjb25mZGVmcy5oIHwgc2VkICcKK3MvJyIkYWNfZGVsaW0iJy8iXFxcCisiL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorfQorL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7CisgIGxpbmUgPSBcJCAwCisgIHNwbGl0KGxpbmUsIGFyZywgIiAiKQorICBpZiAoYXJnWzFdID09ICIjIikgeworICAgIGRlZnVuZGVmID0gYXJnWzJdCisgICAgbWFjMSA9IGFyZ1szXQorICB9IGVsc2UgeworICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKKyAgICBtYWMxID0gYXJnWzJdCisgIH0KKyAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQorICBtYWNybyA9IG1hYzJbMV0KKyAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCisgIGlmIChEX2lzX3NldFttYWNyb10pIHsKKyAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgorICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KKyAgICBuZXh0CisgIH0gZWxzZSB7CisgICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAorICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKyAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgeworICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgorICAgICAgbmV4dAorICAgIH0KKyAgfQorfQoreyBwcmludCB9CitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgorCisKK2V2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCitzaGlmdAorZm9yIGFjX3RhZworZG8KKyAgY2FzZSAkYWNfdGFnIGluCisgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworICBlc2FjCisgIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCisgIDpbRkhMXSo6Kik7OworICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKKyAgOltGSF0tKSBhY190YWc9LTotOzsKKyAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKyAgZXNhYworICBhY19zYXZlX0lGUz0kSUZTCisgIElGUz06CisgIHNldCB4ICRhY190YWcKKyAgSUZTPSRhY19zYXZlX0lGUworICBzaGlmdAorICBhY19maWxlPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6TCkgYWNfc291cmNlPSQxOzsKKyAgOltGSF0pCisgICAgYWNfZmlsZV9pbnB1dHM9CisgICAgZm9yIGFjX2YKKyAgICBkbworICAgICAgY2FzZSAkYWNfZiBpbgorICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OworICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKwkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCisJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisJIHRlc3QgLWYgIiRhY19mIiB8fAorCSAgIGNhc2UgJGFjX2YgaW4KKwkgICBbXFwvJF0qKSBmYWxzZTs7CisJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworCSAgIGVzYWMgfHwKKwkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYworICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworCWAnIGJ5IGNvbmZpZ3VyZS4nCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKyAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKKyAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAorICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworICAgIGVzYWMKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworCisgIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisgIGVzYWMKKyAgYWNfTUtESVJfUD0kTUtESVJfUAorICBjYXNlICRNS0RJUl9QIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7CisgIGVzYWMKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCisjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KK2FjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQorYWNfc2VkX2RhdGFyb290PScKKy9kYXRhcm9vdGRpci8geworICBwCisgIHEKK30KKy9AZGF0YWRpckAvcAorL0Bkb2NkaXJAL3AKKy9AaW5mb2RpckAvcAorL0Bsb2NhbGVkaXJAL3AKKy9AbWFuZGlyQC9wJworY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OworKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCisgIHMmQGRvY2RpckAmJGRvY2RpciZnCisgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKKyAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKKyAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKK2VzYWMKK19BQ0VPRgorCisjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKyMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0CitzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CitzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAorcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0CitzJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CitzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0CitzJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0CitzJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0CiskYWNfZGF0YXJvb3RkaXJfaGFjaworIgorZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisKK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKKyAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQorCisgIHJtIC1mICIkYWNfdG1wL3N0ZGluIgorICBjYXNlICRhY19maWxlIGluCisgIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OworICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CisgIGVzYWMgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyA7OworICA6SCkKKyAgIworICAjIENPTkZJR19IRUFERVIKKyAgIworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeworICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKyAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBybSAtZiAiJGFjX2ZpbGUiCisgICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCisJfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CisgIGZpCisjIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9IiRhY19maWxlIgorX2FtX3N0YW1wX2NvdW50PTEKK2ZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbworICBjYXNlICRfYW1faGVhZGVyIGluCisgICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKKyAgICAgIGJyZWFrIDs7CisgICAgKiApCisgICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7CisgIGVzYWMKK2RvbmUKK2VjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gJGFzX2Rpcm5hbWUgLS0gIiRfYW1fYXJnIiB8fAorJGFzX2V4cHIgWCIkX2FtX2FyZyIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRfYW1fYXJnIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKKyA7OworCisgIDpDKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQorIDs7CisgIGVzYWMKKworCisgIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgorICAgICJkZXBmaWxlcyI6QykgdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgeworICAjIEF1dG9jb25mIDIuNjIgcXVvdGVzIC0tZmlsZSBhcmd1bWVudHMgZm9yIGV2YWwsIGJ1dCBub3Qgd2hlbiBmaWxlcworICAjIGFyZSBsaXN0ZWQgd2l0aG91dCAtLWZpbGUuICBMZXQncyBwbGF5IHNhZmUgYW5kIG9ubHkgZW5hYmxlIHRoZSBldmFsCisgICMgaWYgd2UgZGV0ZWN0IHRoZSBxdW90aW5nLgorICBjYXNlICRDT05GSUdfRklMRVMgaW4KKyAgKlwnKikgZXZhbCBzZXQgeCAiJENPTkZJR19GSUxFUyIgOzsKKyAgKikgICBzZXQgeCAkQ09ORklHX0ZJTEVTIDs7CisgIGVzYWMKKyAgc2hpZnQKKyAgZm9yIG1mCisgIGRvCisgICAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAorICAgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCisgICAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAgICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgorICAgICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCisgICAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQorICAgICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgorICAgIGlmIHNlZCAtbiAncyxeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlLiosWCxwJyAiJG1mIiB8IGdyZXAgWCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIGRpcnBhcnQ9YCRhc19kaXJuYW1lIC0tICIkbWYiIHx8CiskYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRtZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQorICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgorICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0CisgICAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKKyAgICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAgICMgZXhwYW5zaW9uLgorICAgIGZvciBmaWxlIGluIGBzZWQgLW4gIgorICAgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisJIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbworICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICAgIGZkaXI9YCRhc19kaXJuYW1lIC0tICIkZmlsZSIgfHwKKyRhc19leHByIFgiJGZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICBhc19kaXI9JGRpcnBhcnQvJGZkaXI7IGFzX2ZuX21rZGlyX3AKKyAgICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKKyAgICBkb25lCisgIGRvbmUKK30KKyA7OworICAgICJsaWJ0b29sIjpDKQorCisgICAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgorICAgICMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICAgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICAgIGZpCisKKyAgICBjZmdmaWxlPSIke29maWxlfVQiCisgICAgdHJhcCAiJFJNIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKKyAgICAkUk0gIiRjZmdmaWxlIgorCisgICAgY2F0IDw8X0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisjISAkU0hFTEwKKworIyBgJEVDSE8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJGFzX21lICgkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wuCisjCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIGlmIHlvdSBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSBvciBsaWJyYXJ5IHRoYXQKKyMgaXMgYnVpbHQgdXNpbmcgR05VIExpYnRvb2wsIHlvdSBtYXkgaW5jbHVkZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisjIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBHTlUgTGlidG9vbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR05VIExpYnRvb2w7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBhIGNvcHkKKyMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwsIG9yCisjIG9idGFpbmVkIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKworIyBUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCithdmFpbGFibGVfdGFncz0iQ1hYICIKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKKworIyBXaGljaCByZWxlYXNlIG9mIGxpYnRvb2wubTQgd2FzIHVzZWQ/CittYWNyb192ZXJzaW9uPSRtYWNyb192ZXJzaW9uCittYWNyb19yZXZpc2lvbj0kbWFjcm9fcmV2aXNpb24KKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hhdCB0eXBlIG9mIG9iamVjdHMgdG8gYnVpbGQuCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgcHJvdGVjdHMgYmFja3NsYXNoZXMuCitFQ0hPPSRsdF9FQ0hPCisKKyMgVGhlIFBBVEggc2VwYXJhdG9yIGZvciB0aGUgYnVpbGQgc3lzdGVtLgorUEFUSF9TRVBBUkFUT1I9JGx0X1BBVEhfU0VQQVJBVE9SCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KK1NFRD0kbHRfU0VECisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSJcJFNFRCAtZSAxcy9eWC8vIgorCisjIEEgZ3JlcCBwcm9ncmFtIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzLgorR1JFUD0kbHRfR1JFUAorCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgQSBsaXRlcmFsIHN0cmluZyBtYXRjaGVyLgorRkdSRVA9JGx0X0ZHUkVQCisKKyMgQSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIuCitOTT0kbHRfTk0KKworIyBXaGV0aGVyIHdlIG5lZWQgc29mdCBvciBoYXJkIGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KK21heF9jbWRfbGVuPSRtYXhfY21kX2xlbgorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0kYWNfb2JqZXh0CisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSRleGVleHQKKworIyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiLgorbHRfdW5zZXQ9JGx0X3Vuc2V0CisKKyMgdHVybiBzcGFjZXMgaW50byBuZXdsaW5lcy4KK1NQMk5MPSRsdF9sdF9TUDJOTAorCisjIHR1cm4gbmV3bGluZXMgaW50byBzcGFjZXMuCitOTDJTUD0kbHRfbHRfTkwyU1AKKworIyBjb252ZXJ0IFwkYnVpbGQgZmlsZSBuYW1lcyB0byBcJGhvc3QgZm9ybWF0LgordG9faG9zdF9maWxlX2NtZD0kbHRfY3ZfdG9faG9zdF9maWxlX2NtZAorCisjIGNvbnZlcnQgXCRidWlsZCBmaWxlcyB0byB0b29sY2hhaW4gZm9ybWF0LgordG9fdG9vbF9maWxlX2NtZD0kbHRfY3ZfdG9fdG9vbF9maWxlX2NtZAorCisjIEFuIG9iamVjdCBzeW1ib2wgZHVtcGVyLgorT0JKRFVNUD0kbHRfT0JKRFVNUAorCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIi4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEhvdyB0byBmaW5kIHBvdGVudGlhbCBmaWxlcyB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiLgorZmlsZV9tYWdpY19nbG9iPSRsdF9maWxlX21hZ2ljX2dsb2IKKworIyBGaW5kIHBvdGVudGlhbCBmaWxlcyB1c2luZyBub2Nhc2VnbG9iIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyIuCit3YW50X25vY2FzZWdsb2I9JGx0X3dhbnRfbm9jYXNlZ2xvYgorCisjIERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0kbHRfRExMVE9PTAorCisjIENvbW1hbmQgdG8gYXNzb2NpYXRlIHNoYXJlZCBhbmQgbGluayBsaWJyYXJpZXMuCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kbHRfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKKworIyBGbGFncyB0byBjcmVhdGUgYW4gYXJjaGl2ZS4KK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEhvdyB0byBmZWVkIGEgZmlsZSBsaXN0aW5nIHRvIHRoZSBhcmNoaXZlci4KK2FyY2hpdmVyX2xpc3Rfc3BlYz0kbHRfYXJjaGl2ZXJfbGlzdF9zcGVjCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0uCitTVFJJUD0kbHRfU1RSSVAKKworIyBDb21tYW5kcyB1c2VkIHRvIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgV2hldGhlciB0byB1c2UgYSBsb2NrIGZvciBvbGQgYXJjaGl2ZSBleHRyYWN0aW9uLgorbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPSRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24KKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9DQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfQ0ZMQUdTCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpci4KK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyIHdoZW4gbGliIHByZWZpeCBpcyBuZWVkZWQuCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgKKworIyBTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXMgZm9yIFwkTk0uCitubV9maWxlX2xpc3Rfc3BlYz0kbHRfbm1fZmlsZV9saXN0X3NwZWMKKworIyBUaGUgcm9vdCB3aGVyZSB0byBzZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMsYW5kIGluIHdoaWNoIG91ciBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZC4KK2x0X3N5c3Jvb3Q9JGx0X3N5c3Jvb3QKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgd2l0aCAiZmlsZSIuCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIE1hbmlmZXN0IHRvb2wuCitNQU5JRkVTVF9UT09MPSRsdF9NQU5JRkVTVF9UT09MCisKKyMgVG9vbCB0byBtYW5pcHVsYXRlIGFyY2hpdmVkIERXQVJGIGRlYnVnIHN5bWJvbCBmaWxlcyBvbiBNYWMgT1MgWC4KK0RTWU1VVElMPSRsdF9EU1lNVVRJTAorCisjIFRvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYLgorTk1FRElUPSRsdF9OTUVESVQKKworIyBUb29sIHRvIG1hbmlwdWxhdGUgZmF0IG9iamVjdHMgYW5kIGFyY2hpdmVzIG9uIE1hYyBPUyBYLgorTElQTz0kbHRfTElQTworCisjIGxkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYLgorT1RPT0w9JGx0X09UT09MCisKKyMgbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciA2NCBiaXQgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYIDEwLjQuCitPVE9PTDY0PSRsdF9PVE9PTDY0CisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSRsaWJleHQKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSRsdF9zaHJleHRfY21kcworCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9JGx0X3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rCisKKyMgRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgUGVybWlzc2lvbiBtb2RlIG92ZXJyaWRlIGZvciBpbnN0YWxsYXRpb24gb2Ygc2hhcmVkIGxpYnJhcmllcy4KK2luc3RhbGxfb3ZlcnJpZGVfbW9kZT0kbHRfaW5zdGFsbF9vdmVycmlkZV9tb2RlCisKKyMgQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitwb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgQXMgImZpbmlzaF9jbWRzIiwgZXhjZXB0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0CisjIG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCitoYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicworCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcy4KK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMuCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xECisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKKworIyBBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2wKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWMKKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljLgorYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjCisKKyMgV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHkuCitjb21waWxlcl9uZWVkc19vYmplY3Q9JGx0X2NvbXBpbGVyX25lZWRzX29iamVjdAorCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHMKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCisjIGEgc2hhcmVkIGFyY2hpdmUuCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHMKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzCisKKyMgV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90Lgord2l0aF9nbnVfbGQ9JGx0X3dpdGhfZ251X2xkCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKworIyBGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0CisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FXCR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisjIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcworIyAiYWJzb2x1dGUiLGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nIFwke3NobGlicGF0aF92YXJ9IGlmIHRoZQorIyBsaWJyYXJ5IGlzIHJlbG9jYXRlZC4KK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0kaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgorCisjIFNldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAorIyBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWMKKworIyBTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcworIyB0byBydW50aW1lIHBhdGggbGlzdC4KK2luaGVyaXRfcnBhdGg9JGluaGVyaXRfcnBhdGgKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzCisKKyMgU2V0IHRvICJ5ZXMiIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltcworCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zCisKKyMgQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXMuCitwcmVsaW5rX2NtZHM9JGx0X3ByZWxpbmtfY21kcworCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgZmluaXNoaW5nIGxpbmtpbmcgcHJvZ3JhbXMuCitwb3N0bGlua19jbWRzPSRsdF9wb3N0bGlua19jbWRzCisKKyMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzLgorZmlsZV9saXN0X3NwZWM9JGx0X2ZpbGVfbGlzdF9zcGVjCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgorCisjIFRoZSBkaXJlY3RvcmllcyBzZWFyY2hlZCBieSB0aGlzIGNvbXBpbGVyIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlycz0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvCisjIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0cworcHJlZGVwcz0kbHRfcHJlZGVwcworcG9zdGRlcHM9JGx0X3Bvc3RkZXBzCisKKyMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyMgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoCisKKyMgIyMjIEVORCBMSUJUT09MIENPTkZJRworCitfTFRfRU9GCisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICBjYXQgPDxcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorX0xUX0VPRgorICAgIDs7CisgIGVzYWMKKworCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBpZiB0ZXN0IHgiJHhzaV9zaGVsbCIgPSB4eWVzOyB0aGVuCisgIHNlZCAtZSAnL15mdW5jX2Rpcm5hbWUgKCkkLywvXn0gIyBmdW5jX2Rpcm5hbWUgL2NcCitmdW5jX2Rpcm5hbWUgKClcCit7XAorXCAgICBjYXNlICR7MX0gaW5cCitcICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOztcCitcICAgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7O1wKK1wgICAgZXNhY1wKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Rpcm5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2Jhc2VuYW1lICgpJC8sL159ICMgZnVuY19iYXNlbmFtZSAvY1wKK2Z1bmNfYmFzZW5hbWUgKClcCit7XAorXCAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYmFzZW5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpJC8sL159ICMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAvY1wKK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKClcCit7XAorXCAgICBjYXNlICR7MX0gaW5cCitcICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOztcCitcICAgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7O1wKK1wgICAgZXNhY1wKK1wgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19zdHJpcG5hbWUgKCkkLywvXn0gIyBmdW5jX3N0cmlwbmFtZSAvY1wKK2Z1bmNfc3RyaXBuYW1lICgpXAore1wKK1wgICAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZVwKK1wgICAgIyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHNvIGFzc2lnbiBvbmUgdG8gb3JkaW5hcnkgcGFyYW1ldGVyIGZpcnN0LlwKK1wgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7M31cCitcICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9XAorXCAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQlIiR7Mn0ifVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX3N0cmlwbmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3BsaXRfbG9uZ19vcHQgKCkkLywvXn0gIyBmdW5jX3NwbGl0X2xvbmdfb3B0IC9jXAorZnVuY19zcGxpdF9sb25nX29wdCAoKVwKK3tcCitcICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZT0kezElJT0qfVwKK1wgICAgZnVuY19zcGxpdF9sb25nX29wdF9hcmc9JHsxIyo9fVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX3NwbGl0X2xvbmdfb3B0IGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19zcGxpdF9zaG9ydF9vcHQgKCkkLywvXn0gIyBmdW5jX3NwbGl0X3Nob3J0X29wdCAvY1wKK2Z1bmNfc3BsaXRfc2hvcnRfb3B0ICgpXAore1wKK1wgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPSR7MSM/P31cCitcICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWU9JHsxJSIkZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIn1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zcGxpdF9zaG9ydF9vcHQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2xvMm8gKCkkLywvXn0gIyBmdW5jX2xvMm8gL2NcCitmdW5jX2xvMm8gKClcCit7XAorXCAgICBjYXNlICR7MX0gaW5cCitcICAgICAgKi5sbykgZnVuY19sbzJvX3Jlc3VsdD0kezElLmxvfS4ke29iamV4dH0gOztcCitcICAgICAgKikgICAgZnVuY19sbzJvX3Jlc3VsdD0kezF9IDs7XAorXCAgICBlc2FjXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfbG8ybyBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfeGZvcm0gKCkkLywvXn0gIyBmdW5jX3hmb3JtIC9jXAorZnVuY194Zm9ybSAoKVwKK3tcCisgICAgZnVuY194Zm9ybV9yZXN1bHQ9JHsxJS4qfS5sb1wKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX3hmb3JtIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19hcml0aCAoKSQvLC9efSAjIGZ1bmNfYXJpdGggL2NcCitmdW5jX2FyaXRoICgpXAore1wKKyAgICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJCogKSlcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcml0aCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfbGVuICgpJC8sL159ICMgZnVuY19sZW4gL2NcCitmdW5jX2xlbiAoKVwKK3tcCisgICAgZnVuY19sZW5fcmVzdWx0PSR7IzF9XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfbGVuIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKK2ZpCisKK2lmIHRlc3QgeCIkbHRfc2hlbGxfYXBwZW5kIiA9IHh5ZXM7IHRoZW4KKyAgc2VkIC1lICcvXmZ1bmNfYXBwZW5kICgpJC8sL159ICMgZnVuY19hcHBlbmQgL2NcCitmdW5jX2FwcGVuZCAoKVwKK3tcCisgICAgZXZhbCAiJHsxfSs9XFwkezJ9IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2FwcGVuZCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfYXBwZW5kX3F1b3RlZCAoKSQvLC9efSAjIGZ1bmNfYXBwZW5kX3F1b3RlZCAvY1wKK2Z1bmNfYXBwZW5kX3F1b3RlZCAoKVwKK3tcCitcICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR7Mn0iXAorXCAgICBldmFsICIkezF9Kz1cXFxcIFxcJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2FwcGVuZF9xdW90ZWQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgICMgU2F2ZSBhIGBmdW5jX2FwcGVuZCcgZnVuY3Rpb24gY2FsbCB3aGVyZSBwb3NzaWJsZSBieSBkaXJlY3QgdXNlIG9mICcrPScKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW2EtekEtWl9dXHsxLFx9XCkgIiVcMSs9IiVnJyAkY2ZnZmlsZSA+ICRjZmdmaWxlLnRtcCBcCisgICAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQorICB0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorZWxzZQorICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgZXZlbiB3aGVuICcrPScgaXMgbm90IGF2YWlsYWJsZQorICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbYS16QS1aX11cezEsXH1cKSAiJVwxPSIkXDElZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2ZpCisKK2lmIHRlc3QgeCIkX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbCIgPSB4IjoiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogVW5hYmxlIHRvIHN1YnN0aXR1dGUgZXh0ZW5kZWQgc2hlbGwgZnVuY3Rpb25zIGluICRvZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBVbmFibGUgdG8gc3Vic3RpdHV0ZSBleHRlbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gJG9maWxlIiA+JjI7fQorZmkKKworCisgICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8CisgICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKKworCisgICAgY2F0IDw8X0xUX0VPRiA+PiAiJG9maWxlIgorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IENYWAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfQ1hYCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZ19DWFgKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kc19DWFgKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19DWFgKKworIyBBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX0NYWAorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFgKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFgKKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMuCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFgKKworIyBXaGV0aGVyIHRoZSBjb21waWxlciBjb3BlcyB3aXRoIHBhc3Npbmcgbm8gb2JqZWN0cyBkaXJlY3RseS4KK2NvbXBpbGVyX25lZWRzX29iamVjdD0kbHRfY29tcGlsZXJfbmVlZHNfb2JqZWN0X0NYWAorCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWAorCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFgKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19DWFgKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworIyBhIHNoYXJlZCBhcmNoaXZlLgorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0NYWAorbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfQ1hYCisKKyMgV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90Lgord2l0aF9nbnVfbGQ9JGx0X3dpdGhfZ251X2xkX0NYWAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0NYWAorCisjIEZsYWcgdGhhdCBlbmZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19DWFgKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FXCR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisjIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfQ1hYCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FXCR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisjIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcworIyAiYWJzb2x1dGUiLGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nIFwke3NobGlicGF0aF92YXJ9IGlmIHRoZQorIyBsaWJyYXJ5IGlzIHJlbG9jYXRlZC4KK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0kaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlX0NYWAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0NYWAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWAorCisjIFNldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAorIyBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYCisKKyMgU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyMgdG8gcnVudGltZSBwYXRoIGxpc3QuCitpbmhlcml0X3JwYXRoPSRpbmhlcml0X3JwYXRoX0NYWAorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfQ1hYCisKKyMgU2V0IHRvICJ5ZXMiIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0NYWAorCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0NYWAorCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzLgorcHJlbGlua19jbWRzPSRsdF9wcmVsaW5rX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBmaW5pc2hpbmcgbGlua2luZyBwcm9ncmFtcy4KK3Bvc3RsaW5rX2NtZHM9JGx0X3Bvc3RsaW5rX2NtZHNfQ1hYCisKKyMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzLgorZmlsZV9saXN0X3NwZWM9JGx0X2ZpbGVfbGlzdF9zcGVjX0NYWAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fQ1hYCisKKyMgVGhlIGRpcmVjdG9yaWVzIHNlYXJjaGVkIGJ5IHRoaXMgY29tcGlsZXIgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX2RpcnNfQ1hYCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvCisjIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0NYWAorcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfQ1hYCitwcmVkZXBzPSRsdF9wcmVkZXBzX0NYWAorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0NYWAorCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFgKKworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogQ1hYCitfTFRfRU9GCisKKyA7OworCisgIGVzYWMKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0IDEKK2ZpCisKKyMKKyMgQ09ORklHX1NVQkRJUlMgc2VjdGlvbi4KKyMKK2lmIHRlc3QgIiRub19yZWN1cnNpb24iICE9IHllczsgdGhlbgorCisgICMgUmVtb3ZlIC0tY2FjaGUtZmlsZSwgLS1zcmNkaXIsIGFuZCAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nIGFyZ3VtZW50cworICAjIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisgIGFjX3N1Yl9jb25maWd1cmVfYXJncz0KKyAgYWNfcHJldj0KKyAgZXZhbCAic2V0IHggJGFjX2NvbmZpZ3VyZV9hcmdzIgorICBzaGlmdAorICBmb3IgYWNfYXJnCisgIGRvCisgICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgICBhY19wcmV2PQorICAgICAgY29udGludWUKKyAgICBmaQorICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICAgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIFwKKyAgICB8IC0tYz0qKQorICAgICAgOzsKKyAgICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgICAgOzsKKyAgICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgICAgOzsKKyAgICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgICA7OworICAgIC0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcpCisgICAgICA7OworICAgICopCisgICAgICBjYXNlICRhY19hcmcgaW4KKyAgICAgICpcJyopIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgICBlc2FjCisgICAgICBhc19mbl9hcHBlbmQgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgQWx3YXlzIHByZXBlbmQgLS1wcmVmaXggdG8gZW5zdXJlIHVzaW5nIHRoZSBzYW1lIHByZWZpeAorICAjIGluIHN1YmRpciBjb25maWd1cmF0aW9ucy4KKyAgYWNfYXJnPSItLXByZWZpeD0kcHJlZml4IgorICBjYXNlICRhY19hcmcgaW4KKyAgKlwnKikgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgZXNhYworICBhY19zdWJfY29uZmlndXJlX2FyZ3M9IickYWNfYXJnJyAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIgorCisgICMgUGFzcyAtLXNpbGVudAorICBpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICAgIGFjX3N1Yl9jb25maWd1cmVfYXJncz0iLS1zaWxlbnQgJGFjX3N1Yl9jb25maWd1cmVfYXJncyIKKyAgZmkKKworICAjIEFsd2F5cyBwcmVwZW5kIC0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcgdG8gc2lsZW5jZSB3YXJuaW5ncywgc2luY2UKKyAgIyBkaWZmZXJlbnQgc3ViZGlycyBjYW4gaGF2ZSBkaWZmZXJlbnQgLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zLgorICBhY19zdWJfY29uZmlndXJlX2FyZ3M9Ii0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcgJGFjX3N1Yl9jb25maWd1cmVfYXJncyIKKworICBhY19wb3BkaXI9YHB3ZGAKKyAgZm9yIGFjX2RpciBpbiA6ICRzdWJkaXJzOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQorCisgICAgIyBEbyBub3QgY29tcGxhaW4sIHNvIGEgY29uZmlndXJlIHNjcmlwdCBjYW4gY29uZmlndXJlIHdoaWNoZXZlcgorICAgICMgcGFydHMgb2YgYSBsYXJnZSBzb3VyY2UgdHJlZSBhcmUgcHJlc2VudC4KKyAgICB0ZXN0IC1kICIkc3JjZGlyLyRhY19kaXIiIHx8IGNvbnRpbnVlCisKKyAgICBhY19tc2c9Ij09PSBjb25maWd1cmluZyBpbiAkYWNfZGlyIChgcHdkYC8kYWNfZGlyKSIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfbXNnIiA+JjUKKyAgICAkYXNfZWNobyAiJGFjX21zZyIgPiY2CisgICAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKworICAgIGNkICIkYWNfZGlyIgorCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCisgICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zcmNkaXIvY29uZmlndXJlLmdudQorICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCisgICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zcmNkaXIvY29uZmlndXJlCisgICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbiI7IHRoZW4KKyAgICAgICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKyAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjI7fQorICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0KKyAgICBmaQorCisgICAgIyBUaGUgcmVjdXJzaW9uIGlzIGhlcmUuCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1Yl9jb25maWd1cmUiOyB0aGVuCisgICAgICAjIE1ha2UgdGhlIGNhY2hlIGZpbGUgbmFtZSBjb3JyZWN0IHJlbGF0aXZlIHRvIHRoZSBzdWJkaXJlY3RvcnkuCisgICAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIGFjX3N1Yl9jYWNoZV9maWxlPSRjYWNoZV9maWxlIDs7CisgICAgICAqKSAjIFJlbGF0aXZlIG5hbWUuCisJYWNfc3ViX2NhY2hlX2ZpbGU9JGFjX3RvcF9idWlsZF9wcmVmaXgkY2FjaGVfZmlsZSA7OworICAgICAgZXNhYworCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJ1bm5pbmcgJFNIRUxMICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3JjZGlyIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHJ1bm5pbmcgJFNIRUxMICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3JjZGlyIiA+JjY7fQorICAgICAgIyBUaGUgZXZhbCBtYWtlcyBxdW90aW5nIGFyZ3VtZW50cyB3b3JrLgorICAgICAgZXZhbCAiXCRTSEVMTCBcIlwkYWNfc3ViX2NvbmZpZ3VyZVwiICRhY19zdWJfY29uZmlndXJlX2FyZ3MgXAorCSAgIC0tY2FjaGUtZmlsZT1cIlwkYWNfc3ViX2NhY2hlX2ZpbGVcIiAtLXNyY2Rpcj1cIlwkYWNfc3JjZGlyXCIiIHx8CisJYXNfZm5fZXJyb3IgJD8gIiRhY19zdWJfY29uZmlndXJlIGZhaWxlZCBmb3IgJGFjX2RpciIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgY2QgIiRhY19wb3BkaXIiCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KK2ZpCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvY29uZmlndXJlLmFjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzMjUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsMTUwIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgY29uZmlndXJlLgorIyMgSW4gZ2VuZXJhbCwgdGhlIHNhZmVzdCB3YXkgdG8gcHJvY2VlZCBpcyB0byBydW4gLi9hdXRvZ2VuLnNoCisKK0FDX1BSRVJFUSgyLjU5KQorCisjIE5vdGU6ICBJZiB5b3UgY2hhbmdlIHRoZSB2ZXJzaW9uLCB5b3UgbXVzdCBhbHNvIHVwZGF0ZSBpdCBpbjoKKyMgKiBqYXZhL3BvbS54bWwKKyMgKiBweXRob24vc2V0dXAucHkKKyMgKiBzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oCisjICogc3JjL01ha2VmaWxlLmFtIChVcGRhdGUgLXZlcnNpb24taW5mbyBmb3IgTERGTEFHUyBpZiBuZWVkZWQpCisjCisjIEluIHRoZSBTVk4gdHJ1bmssIHRoZSB2ZXJzaW9uIHNob3VsZCBhbHdheXMgYmUgdGhlIG5leHQgYW50aWNpcGF0ZWQgcmVsZWFzZQorIyB2ZXJzaW9uIHdpdGggdGhlICItcHJlIiBzdWZmaXguICAoV2UgdXNlZCB0byB1c2UgIi1TTkFQU0hPVCIgYnV0IHRoaXMgcHVzaGVkCisjIHRoZSBzaXplIG9mIG9uZSBmaWxlIG5hbWUgaW4gdGhlIGRpc3QgdGFyZmlsZSBvdmVyIHRoZSA5OS1jaGFyIGxpbWl0LikKK0FDX0lOSVQoW1Byb3RvY29sIEJ1ZmZlcnNdLFsyLjUuMF0sW3Byb3RvYnVmQGdvb2dsZWdyb3Vwcy5jb21dLFtwcm90b2J1Zl0pCisKK0FNX01BSU5UQUlORVJfTU9ERShbZW5hYmxlXSkKKworQUNfQ09ORklHX1NSQ0RJUihzcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MpCitBQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQorQUNfQ09ORklHX01BQ1JPX0RJUihbbTRdKQorCisjIGF1dG9jb25mJ3MgZGVmYXVsdCBDWFhGTEFHUyBhcmUgdXN1YWxseSAiLWcgLU8yIi4gIFRoZXNlIGFyZW4ndCBuZWNlc3NhcmlseQorIyB0aGUgYmVzdCBjaG9pY2UgZm9yIGxpYnByb3RvYnVmLgorQVNfSUYoW3Rlc3QgIngke2FjX2N2X2Vudl9DRkxBR1Nfc2V0fSIgPSAieCJdLAorICAgICAgW0NGTEFHUz0iIl0pCitBU19JRihbdGVzdCAieCR7YWNfY3ZfZW52X0NYWEZMQUdTX3NldH0iID0gIngiXSwKKyAgICAgIFtDWFhGTEFHUz0iIl0pCisKK0FDX0NBTk9OSUNBTF9UQVJHRVQKKworQU1fSU5JVF9BVVRPTUFLRQorCitBQ19BUkdfV0lUSChbemxpYl0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXpsaWJdLAorICAgIFtpbmNsdWRlIGNsYXNzZXMgZm9yIHN0cmVhbWluZyBjb21wcmVzc2VkIGRhdGEgaW4gYW5kIG91dCBAPDpAZGVmYXVsdD1jaGVja0A6PkBdKV0sCisgIFtdLFt3aXRoX3psaWI9Y2hlY2tdKQorCitBQ19BUkdfV0lUSChbcHJvdG9jXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtcHJvdG9jPUNPTU1BTkRdLAorICAgIFt1c2UgdGhlIGdpdmVuIHByb3RvYyBjb21tYW5kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBuZXcgb25lIHdoZW4gYnVpbGRpbmcgdGVzdHMgKHVzZWZ1bCBmb3IgY3Jvc3MtY29tcGlsaW5nKV0pXSwKKyAgW10sW3dpdGhfcHJvdG9jPW5vXSkKKworIyBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19DQworQUNfUFJPR19DWFgKK0FDX0xBTkcoW0MrK10pCitBQ1hfVVNFX1NZU1RFTV9FWFRFTlNJT05TCitBTV9DT05ESVRJT05BTChHQ0MsIHRlc3QgIiRHQ0MiID0geWVzKSAgICMgbGV0IHRoZSBNYWtlZmlsZSBrbm93IGlmIHdlJ3JlIGdjYworCisjIHRlc3RfdXRpbC5jYyB0YWtlcyBmb3JldmVyIHRvIGNvbXBpbGUgd2l0aCBHQ0MgYW5kIG9wdGltaXphdGlvbiB0dXJuZWQgb24uCitBQ19NU0dfQ0hFQ0tJTkcoW0MrKyBjb21waWxlciBmbGFncy4uLl0pCitBU19JRihbdGVzdCAieCR7YWNfY3ZfZW52X0NYWEZMQUdTX3NldH0iID0gIngiXSxbCisgIEFTX0lGKFt0ZXN0ICIkR0NDIiA9ICJ5ZXMiXSxbCisgICAgUFJPVE9CVUZfT1BUX0ZMQUc9Ii1PMiIKKyAgICBDWFhGTEFHUz0iJHtDWFhGTEFHU30gLWciCisgIF0pCisKKyAgIyBQcm90b2NvbCBCdWZmZXJzIGNvbnRhaW5zIHNldmVyYWwgY2hlY2tzIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgb25seQorICAjIGZvciBkZWJ1Z2dpbmcgYW5kIHdoaWNoIG1pZ2h0IGh1cnQgcGVyZm9ybWFuY2UuICBNb3N0IHVzZXJzIGFyZSBwcm9iYWJseQorICAjIGVuZCB1c2VycyB3aG8gZG9uJ3Qgd2FudCB0aGVzZSBjaGVja3MsIHNvIGFkZCAtRE5ERUJVRyBieSBkZWZhdWx0LgorICBDWFhGTEFHUz0iJENYWEZMQUdTIC1ETkRFQlVHIgorCisgIEFDX01TR19SRVNVTFQoW3VzZSBkZWZhdWx0OiAkUFJPVE9CVUZfT1BUX0ZMQUcgJENYWEZMQUdTXSkKK10sWworICBBQ19NU0dfUkVTVUxUKFt1c2UgdXNlci1zdXBwbGllZDogJENYWEZMQUdTXSkKK10pCisKK0FDX1NVQlNUKFBST1RPQlVGX09QVF9GTEFHKQorCitBQ1hfQ0hFQ0tfU1VOQ0MKKworIyBIYXZlIHRvIGRvIGxpYnRvb2wgYWZ0ZXIgU1VOQ0MsIG90aGVyIHdpc2UgaXQgImhlbHBmdWxseSIgYWRkcyBDcnVuIENzdGQKKyMgdG8gdGhlIGxpbmsKK0FDX1BST0dfTElCVE9PTAorCisjIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgorQUNfSEVBREVSX1NUREMKK0FDX0NIRUNLX0hFQURFUlMoW2ZjbnRsLmggaW50dHlwZXMuaCBsaW1pdHMuaCBzdGRsaWIuaCB1bmlzdGQuaF0pCisKKyMgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KK0FDX0ZVTkNfTUVNQ01QCitBQ19GVU5DX1NUUlRPRAorQUNfQ0hFQ0tfRlVOQ1MoW2Z0cnVuY2F0ZSBtZW1zZXQgbWtkaXIgc3RyY2hyIHN0cmVycm9yIHN0cnRvbF0pCisKKyMgQ2hlY2sgZm9yIHpsaWIuCitIQVZFX1pMSUI9MAorQVNfSUYoW3Rlc3QgIiR3aXRoX3psaWIiICE9IG5vXSwgWworICBBQ19NU0dfQ0hFQ0tJTkcoW3psaWIgdmVyc2lvbl0pCisKKyAgIyBGaXJzdCBjaGVjayB0aGUgemxpYiBoZWFkZXIgdmVyc2lvbi4KKyAgQUNfQ09NUElMRV9JRkVMU0UoCisgICAgW0FDX0xBTkdfUFJPR1JBTShbWworICAgICAgICAjaW5jbHVkZSA8emxpYi5oPgorICAgICAgICAjaWYgIWRlZmluZWQoWkxJQl9WRVJOVU0pIHx8IChaTElCX1ZFUk5VTSA8IDB4MTIwNCkKKyAgICAgICAgIyBlcnJvciB6bGliIHZlcnNpb24gdG9vIG9sZAorICAgICAgICAjZW5kaWYKKyAgICAgICAgXV0sIFtdKV0sIFsKKyAgICBBQ19NU0dfUkVTVUxUKFtvayAoMS4yLjAuNCBvciBsYXRlcildKQorCisgICAgIyBBbHNvIG5lZWQgdG8gYWRkIC1seiB0byB0aGUgbGlua2VyIGZsYWdzIGFuZCBtYWtlIHN1cmUgdGhpcyBzdWNjZWVkcy4KKyAgICBBQ19TRUFSQ0hfTElCUyhbemxpYlZlcnNpb25dLCBbel0sIFsKKyAgICAgIEFDX0RFRklORShbSEFWRV9aTElCXSwgWzFdLCBbRW5hYmxlIGNsYXNzZXMgdXNpbmcgemxpYiBjb21wcmVzc2lvbi5dKQorICAgICAgSEFWRV9aTElCPTEKKyAgICBdLCBbCisgICAgICBBU19JRihbdGVzdCAiJHdpdGhfemxpYiIgIT0gY2hlY2tdLCBbCisgICAgICAgIEFDX01TR19GQUlMVVJFKFstLXdpdGgtemxpYiB3YXMgZ2l2ZW4sIGJ1dCBubyB3b3JraW5nIHpsaWIgbGlicmFyeSB3YXMgZm91bmRdKQorICAgICAgXSkKKyAgICBdKQorICBdLCBbCisgICAgQVNfSUYoW3Rlc3QgIiR3aXRoX3psaWIiID0gY2hlY2tdLCBbCisgICAgICBBQ19NU0dfUkVTVUxUKFtoZWFkZXJzIG1pc3Npbmcgb3IgdG9vIG9sZCAocmVxdWlyZXMgMS4yLjAuNCldKQorICAgIF0sIFsKKyAgICAgIEFDX01TR19GQUlMVVJFKFstLXdpdGgtemxpYiB3YXMgZ2l2ZW4sIGJ1dCB6bGliIGhlYWRlcnMgd2VyZSBub3QgcHJlc2VudCBvciB3ZXJlIHRvbyBvbGQgKHJlcXVpcmVzIDEuMi4wLjQpXSkKKyAgICBdKQorICBdKQorXSkKK0FNX0NPTkRJVElPTkFMKFtIQVZFX1pMSUJdLCBbdGVzdCAkSEFWRV9aTElCID0gMV0pCisKK0FTX0lGKFt0ZXN0ICIkd2l0aF9wcm90b2MiICE9ICJubyJdLCBbCisgIFBST1RPQz0kd2l0aF9wcm90b2MKKyAgQVNfSUYoW3Rlc3QgIiR3aXRoX3Byb3RvYyIgPSAieWVzIl0sIFsKKyAgICAjIE5vIGFyZ3VtZW50IGdpdmVuLiAgVXNlIHN5c3RlbSBwcm90b2MuCisgICAgUFJPVE9DPXByb3RvYworICBdKQorICBBU19JRihbZWNobyAiJFBST1RPQyIgfCBncmVwIC1xICdeQDw6QF4vQDo+QC4qLyddLCBbCisgICAgIyBEb2VzIG5vdCBzdGFydCB3aXRoIGEgc2xhc2gsIGJ1dCBjb250YWlucyBhIHNsYXNoLiAgU28sIGl0J3MgYSByZWxhdGl2ZQorICAgICMgcGF0aCAoYXMgb3Bwb3NlZCB0byBhbiBhYnNvbHV0ZSBwYXRoIG9yIGFuIGV4ZWN1dGFibGUgaW4gJFBBVEgpLgorICAgICMgU2luY2UgaXQgd2lsbCBhY3R1YWxseSBiZSBleGVjdXRlZCBmcm9tIHRoZSBzcmMgZGlyZWN0b3J5LCBwcmVmaXggd2l0aAorICAgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgV2UgYWxzbyBpbnNlcnQgJGFjX3RvcF9idWlsZF9wcmVmaXggaW4gY2FzZSB0aGlzCisgICAgIyBpcyBhIG5lc3RlZCBwYWNrYWdlIGFuZCAtLXdpdGgtcHJvdG9jIHdhcyBhY3R1YWxseSBnaXZlbiBvbiB0aGUgb3V0ZXIKKyAgICAjIHBhY2thZ2UncyBjb25maWd1cmUgc2NyaXB0LgorICAgIFBST1RPQz1gcHdkYC8ke2FjX3RvcF9idWlsZF9wcmVmaXh9JFBST1RPQworICBdKQorICBBQ19TVUJTVChbUFJPVE9DXSkKK10pCitBTV9DT05ESVRJT05BTChbVVNFX0VYVEVSTkFMX1BST1RPQ10sIFt0ZXN0ICIkd2l0aF9wcm90b2MiICE9ICJubyJdKQorCitBQ1hfUFRIUkVBRAorQUNfQ1hYX1NUTF9IQVNICisKKyMgSEFDSzogIE1ha2UgZ3Rlc3QncyBjb25maWd1cmUgc2NyaXB0IHBpY2sgdXAgb3VyIGNvcHkgb2YgQ0ZMQUdTIGFuZCBDWFhGTEFHUywKKyMgICBzaW5jZSB0aGUgZmxhZ3MgYWRkZWQgYnkgQUNYX0NIRUNLX1NVTkNDIG11c3QgYmUgdXNlZCB3aGVuIGNvbXBpbGluZyBndGVzdAorIyAgIHRvby4KK2V4cG9ydCBDRkxBR1MKK2V4cG9ydCBDWFhGTEFHUworQUNfQ09ORklHX1NVQkRJUlMoW2d0ZXN0XSkKKworQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBzcmMvTWFrZWZpbGUgcHJvdG9idWYucGMgcHJvdG9idWYtbGl0ZS5wY10pCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZGVwY29tcCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZGVwY29tcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDBhYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9kZXBjb21wCkBAIC0wLDAgKzEsNjg4IEBACisjISAvYmluL3NoCisjIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKKworc2NyaXB0dmVyc2lvbj0yMDExLTEyLTA0LjExOyAjIFVUQworCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCwKKyMgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPi4KKworY2FzZSAkMSBpbgorICAnJykKKyAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICBleGl0IDE7CisgICAgIDs7CisgIC1oIHwgLS1oKikKKyAgICBjYXQgPDxcRU9GCitVc2FnZTogZGVwY29tcCBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQorCitSdW4gUFJPR1JBTVMgQVJHUyB0byBjb21waWxlIGEgZmlsZSwgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMKK2FzIHNpZGUtZWZmZWN0cy4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBkZXBtb2RlICAgICBEZXBlbmRlbmN5IHRyYWNraW5nIG1vZGUuCisgIHNvdXJjZSAgICAgIFNvdXJjZSBmaWxlIHJlYWQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBvYmplY3QgICAgICBPYmplY3QgZmlsZSBvdXRwdXQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBERVBESVIgICAgICBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgZGVwZW5kZW5jaWVzLgorICBkZXBmaWxlICAgICBEZXBlbmRlbmN5IGZpbGUgdG8gb3V0cHV0LgorICB0bXBkZXBmaWxlICBUZW1wb3JhcnkgZmlsZSB0byB1c2Ugd2hlbiBvdXRwdXR0aW5nIGRlcGVuZGVuY2llcy4KKyAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRkZXBtb2RlIiB8fCB0ZXN0IC16ICIkc291cmNlIiB8fCB0ZXN0IC16ICIkb2JqZWN0IjsgdGhlbgorICBlY2hvICJkZXBjb21wOiBWYXJpYWJsZXMgc291cmNlLCBvYmplY3QgYW5kIGRlcG1vZGUgbXVzdCBiZSBzZXQiIDE+JjIKKyAgZXhpdCAxCitmaQorCisjIERlcGVuZGVuY2llcyBmb3Igc3ViL2Jhci5vIG9yIHN1Yi9iYXIub2JqIGdvIGludG8gc3ViLy5kZXBzL2Jhci5Qby4KK2RlcGZpbGU9JHtkZXBmaWxlLWBlY2hvICIkb2JqZWN0IiB8CisgIHNlZCAnc3xbXlxcL10qJHwnJHtERVBESVItLmRlcHN9Jy8mfDtzfFwuXChbXi5dKlwpJHwuUFwxfDtzfFBvYmokfFBvfCdgfQordG1wZGVwZmlsZT0ke3RtcGRlcGZpbGUtYGVjaG8gIiRkZXBmaWxlIiB8IHNlZCAncy9cLlwoW14uXSpcKSQvLlRcMS8nYH0KKworcm0gLWYgIiR0bXBkZXBmaWxlIgorCisjIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKKyMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCisjIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCisjIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgoraWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KKyAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCisgIGdjY2ZsYWc9LU0KKyAgZGVwbW9kZT1nY2MKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBkYXNobXN0ZG91dCB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50LgorICAgZGFzaG1mbGFnPS14TQorICAgZGVwbW9kZT1kYXNobXN0ZG91dAorZmkKKworY3lncGF0aF91PSJjeWdwYXRoIC11IC1mIC0iCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjbXN5czsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBtc3Zpc3VhbGNwcCBidXQgdy9vIGN5Z3BhdGggdHJhbnNsYXRpb24uCisgICAjIEp1c3QgY29udmVydCB0aGUgYmFja3NsYXNoLWVzY2FwZWQgYmFja3NsYXNoZXMgdG8gc2luZ2xlIGZvcndhcmQKKyAgICMgc2xhc2hlcyB0byBzYXRpc2Z5IGRlcGVuZC5tNAorICAgY3lncGF0aF91PSdzZWQgcyxcXFxcLC8sZycKKyAgIGRlcG1vZGU9bXN2aXN1YWxjcHAKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IG1zdmM3bXN5czsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBtc3ZjNyBidXQgdy9vIGN5Z3BhdGggdHJhbnNsYXRpb24uCisgICAjIEp1c3QgY29udmVydCB0aGUgYmFja3NsYXNoLWVzY2FwZWQgYmFja3NsYXNoZXMgdG8gc2luZ2xlIGZvcndhcmQKKyAgICMgc2xhc2hlcyB0byBzYXRpc2Z5IGRlcGVuZC5tNAorICAgY3lncGF0aF91PSdzZWQgcyxcXFxcLC8sZycKKyAgIGRlcG1vZGU9bXN2YzcKK2ZpCisKK2Nhc2UgIiRkZXBtb2RlIiBpbgorZ2NjMykKKyMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0CisjIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQorIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgorIyMgVW5mb3J0dW5hdGVseSwgRnJlZUJTRCBjODkgYWNjZXB0YW5jZSBvZiBmbGFncyBkZXBlbmRzIHVwb24KKyMjIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgb3JkZXI7IHNvIGFkZCB0aGUgZmxhZ3Mgd2hlcmUgdGhleQorIyMgYXBwZWFyIGluIGRlcGVuZDIuYW0uICBOb3RlIHRoYXQgdGhlIHNsb3dkb3duIGluY3VycmVkIGhlcmUKKyMjIGFmZmVjdHMgb25seSBjb25maWd1cmU6IGluIG1ha2VmaWxlcywgJUZBU1RERVAlIHNob3J0Y3V0cyB0aGlzLgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLWMpIHNldCBmbm9yZCAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIiAiJGFyZyIgOzsKKyAgICAqKSAgc2V0IGZub3JkICIkQCIgIiRhcmciIDs7CisgICAgZXNhYworICAgIHNoaWZ0ICMgZm5vcmQKKyAgICBzaGlmdCAjICRhcmcKKyAgZG9uZQorICAiJEAiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBtdiAiJHRtcGRlcGZpbGUiICIkZGVwZmlsZSIKKyAgOzsKKworZ2NjKQorIyMgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBnZXQgZGVwZW5kZW5jeSBvdXRwdXQgZnJvbSBnY2MuICBIZXJlJ3MKKyMjIHdoeSB3ZSBwaWNrIHRoaXMgcmF0aGVyIG9ic2N1cmUgbWV0aG9kOgorIyMgLSBEb24ndCB3YW50IHRvIHVzZSAtTUQgYmVjYXVzZSB3ZSdkIGxpa2UgdGhlIGRlcGVuZGVuY2llcyB0byBlbmQKKyMjICAgdXAgaW4gYSBzdWJkaXIuICBIYXZpbmcgdG8gcmVuYW1lIGJ5IGhhbmQgaXMgdWdseS4KKyMjICAgKFdlIG1pZ2h0IGVuZCB1cCBkb2luZyB0aGlzIGFueXdheSB0byBzdXBwb3J0IG90aGVyIGNvbXBpbGVycy4pCisjIyAtIFRoZSBERVBFTkRFTkNJRVNfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG1ha2VzIGdjYyBhY3QgbGlrZQorIyMgICAtTU0sIG5vdCAtTSAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuCisjIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCisjIyAgIHRoYW4gcmVuYW1pbmcpLgorICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KKyAgICBnY2NmbGFnPS1NRCwKKyAgZmkKKyAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIGFscGhhPUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKKyMjIFRoZSBzZWNvbmQgLWUgZXhwcmVzc2lvbiBoYW5kbGVzIERPUy1zdHlsZSBmaWxlIG5hbWVzIHdpdGggZHJpdmUgbGV0dGVycy4KKyAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCisgICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisjIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSBgZGVsZXRlZCBoZWFkZXIgZmlsZScgcHJvYmxlbS4KKyMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCisjIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKKyMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCisjIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCisjIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgYDonLiAgT24gdGhlIHRoZW9yeQorIyMgdGhhdCB0aGUgc3BhY2UgbWVhbnMgc29tZXRoaW5nLCB3ZSBhZGQgYSBzcGFjZSB0byB0aGUgb3V0cHV0IGFzCisjIyB3ZWxsLiAgaHAgZGVwbW9kZSBhbHNvIGFkZHMgdGhhdCBzcGFjZSwgYnV0IGFsc28gcHJlZml4ZXMgdGhlIFZQQVRICisjIyB0byB0aGUgb2JqZWN0LiAgVGFrZSBjYXJlIHRvIG5vdCByZXBlYXQgaXQgaW4gdGhlIG91dHB1dC4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgInN8Liokb2JqZWN0JHx8IiAtZSAnLzokL2QnIFwKKyAgICAgIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaHApCisgICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQorICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCisgICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGV4aXQgMQorICA7OworCitzZ2kpCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICIkQCIgIi1XcCwtTUR1cGRhdGUsJHRtcGRlcGZpbGUiCisgIGVsc2UKKyAgICAiJEAiIC1NRHVwZGF0ZSAiJHRtcGRlcGZpbGUiCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuICAjIHllcywgdGhlIHNvdXJjZWZpbGUgZGVwZW5kIG9uIG90aGVyIGZpbGVzCisgICAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKworICAgICMgQ2xpcCBvZmYgdGhlIGluaXRpYWwgZWxlbWVudCAodGhlIGRlcGVuZGVudCkuICBEb24ndCB0cnkgdG8gYmUKKyAgICAjIGNsZXZlciBhbmQgcmVwbGFjZSB0aGlzIHdpdGggc2VkIGNvZGUsIGFzIElSSVggc2VkIHdvbid0IGhhbmRsZQorICAgICMgbGluZXMgd2l0aCBtb3JlIHRoYW4gYSBmaXhlZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoNDA5NiBpbgorICAgICMgSVJJWCA2LjIgc2VkLCA4MTkyIGluIElSSVggNi41KS4gIFdlIGFsc28gcmVtb3ZlIGNvbW1lbnQgbGluZXM7CisgICAgIyB0aGUgSVJJWCBjYyBhZGRzIGNvbW1lbnRzIGxpa2UgYCM6ZmVjJyB0byB0aGUgZW5kIG9mIHRoZQorICAgICMgZGVwZW5kZW5jeSBsaW5lLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIHwgXAorICAgIHRyICcKKycgJyAnID4+ICIkZGVwZmlsZSIKKyAgICBlY2hvID4+ICIkZGVwZmlsZSIKKworICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAorICAgPj4gIiRkZXBmaWxlIgorICBlbHNlCisgICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKKyAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKKyAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworYWl4KQorICAjIFRoZSBDIGZvciBBSVggQ29tcGlsZXIgdXNlcyAtTSBhbmQgb3V0cHV0cyB0aGUgZGVwZW5kZW5jaWVzCisgICMgaW4gYSAudSBmaWxlLiAgSW4gb2xkZXIgdmVyc2lvbnMsIHRoaXMgZmlsZSBhbHdheXMgbGl2ZXMgaW4gdGhlCisgICMgY3VycmVudCBkaXJlY3RvcnkuICBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUKKyAgIyBzdGFydCBvZiBlYWNoIGxpbmU7ICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgIyBWZXJzaW9uIDYgdXNlcyB0aGUgZGlyZWN0b3J5IGluIGJvdGggY2FzZXMuCisgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCisgIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQorICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTI9JGJhc2UudQorICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS51CisgICAgIiRAIiAtV2MsLU0KKyAgZWxzZQorICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UudQorICAgICIkQCIgLU0KKyAgZmkKKyAgc3RhdD0kPworCisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKKyAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKKyAgZG8KKyAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgZG9uZQorICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJy4KKyAgICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WwkgXSosLCcgLWUgJ3MsJCw6LCcgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2ljYykKKyAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCisgICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYworICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jCisgICMgICAgZm9vLm86IHN1Yi9mb28uaAorICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYworICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCisgICMgICAgc3ViL2Zvby5jOgorICAjICAgIHN1Yi9mb28uaDoKKyAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKKyAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAorICAjICAgICBzdWIvZm9vLmggLi4uIFwKKyAgIyAgICAgLi4uCisKKyAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCisgICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCisgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisgICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8CisgICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaHAyKQorICAjIFRoZSAiaHAiIHN0YW56YSBhYm92ZSBkb2VzIG5vdCB3b3JrIHdpdGggYUNDIChDKyspIGFuZCBIUCdzIGlhNjQKKyAgIyBjb21waWxlcnMsIHdoaWNoIGhhdmUgaW50ZWdyYXRlZCBwcmVwcm9jZXNzb3JzLiAgVGhlIGNvcnJlY3Qgb3B0aW9uCisgICMgdG8gdXNlIHdpdGggdGhlc2UgaXMgK01ha2VkOyBpdCB3cml0ZXMgZGVwZW5kZW5jaWVzIHRvIGEgZmlsZSBuYW1lZAorICAjICdmb28uZCcsIHdoaWNoIGxhbmRzIG5leHQgdG8gdGhlIG9iamVjdCBmaWxlLCB3aGVyZXZlciB0aGF0CisgICMgaGFwcGVucyB0byBiZS4KKyAgIyBNdWNoIG9mIHRoaXMgaXMgc2ltaWxhciB0byB0aGUgdHJ1NjQgY2FzZTsgc2VlIGNvbW1lbnRzIHRoZXJlLgorICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAorICAgIHRtcGRlcGZpbGUyPSRkaXIubGlicy8kYmFzZS5kCisgICAgIiRAIiAtV2MsK01ha2VkCisgIGVsc2UKKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAorICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCisgICAgIiRAIiArTWFrZWQKKyAgZmkKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIgorICAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgZG8KKyAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgZG9uZQorICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIEFkZCBgZGVwZW5kZW50Lmg6JyBsaW5lcy4KKyAgICBzZWQgLW5lICcyLCR7CisJICAgICAgIHMvXiAqLy8KKwkgICAgICAgcy8gXFwqJC8vCisJICAgICAgIHMvJC86LworCSAgICAgICBwCisJICAgICB9JyAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlMiIKKyAgOzsKKwordHJ1NjQpCisgICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCisgICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCisgICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0CisgICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KKyAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KKyAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCisgICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKworICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGggVHJ1NjQgY2MsIHNoYXJlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFrZSBhCisgICAgICAjIHN0YXRpYyBsaWJyYXJ5LiAgVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBpbiBsaWJ0b29sIDEuNCBzZXJpZXMgdG8KKyAgICAgICMgaGFuZGxlIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uLgorICAgICAgIyBXaXRoIGxpYnRvb2wgMS40LCBkZXBlbmRlbmNpZXMgd2VyZSBvdXRwdXQgaW4gJGRpci5saWJzLyRiYXNlLmxvLmQuCisgICAgICAjCisgICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhpcyBleGNlcHRpb24gd2FzIHJlbW92ZWQsIGFuZCBsaWJ0b29sIG5vdworICAgICAgIyBnZW5lcmF0ZXMgMiBzZXBhcmF0ZSBvYmplY3RzIGZvciB0aGUgMiBsaWJyYXJpZXMuICBUaGVzZSB0d28KKyAgICAgICMgY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKKyAgICAgICMgaW4gJGRpciRiYXNlLm8uZC4gIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGJvdGggZmlsZXMsIGJlY2F1c2UKKyAgICAgICMgb25lIG9mIHRoZSB0d28gY29tcGlsYXRpb25zIGNhbiBiZSBkaXNhYmxlZC4gIFdlIHNob3VsZCBwcmVmZXIKKyAgICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCisgICAgICAjIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB3aGVuIC5saWJzLyBpcyBkZWxldGVkLCB3aGlsZSBpZ25vcmluZworICAgICAgIyB0aGUgZm9ybWVyIHdvdWxkIGNhdXNlIGEgZGlzdGNsZWFuY2hlY2sgcGFuaWMuCisgICAgICB0bXBkZXBmaWxlMT0kZGlyLmxpYnMvJGJhc2UubG8uZCAgICMgbGlidG9vbCAxLjQKKyAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5vLmQgICAgICAgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLm8uZCAgICAjIGxpYnRvb2wgMS41CisgICAgICB0bXBkZXBmaWxlND0kZGlyLmxpYnMvJGJhc2UuZCAgICAgICMgQ29tcGFxIENDQyBWNi4yLTUwNAorICAgICAgIiRAIiAtV2MsLU1ECisgICBlbHNlCisgICAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kCisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGU0PSRkaXIkYmFzZS5kCisgICAgICAiJEAiIC1NRAorICAgZmkKKworICAgc3RhdD0kPworICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgICBlbHNlCisgICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgorICAgICAgZXhpdCAkc3RhdAorICAgZmkKKworICAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgIGRvCisgICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhaworICAgZG9uZQorICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgorICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICBlbHNlCisgICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICAgZmkKKyAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgIDs7CisKK21zdmM3KQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICBzaG93SW5jbHVkZXM9LVdjLC1zaG93SW5jbHVkZXMKKyAgZWxzZQorICAgIHNob3dJbmNsdWRlcz0tc2hvd0luY2x1ZGVzCisgIGZpCisgICIkQCIgJHNob3dJbmNsdWRlcyA+ICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBncmVwIC12ICdeTm90ZTogaW5jbHVkaW5nIGZpbGU6ICcgIiR0bXBkZXBmaWxlIgorICBpZiB0ZXN0ICIkc3RhdCIgPSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgIyBUaGUgZmlyc3Qgc2VkIHByb2dyYW0gYmVsb3cgZXh0cmFjdHMgdGhlIGZpbGUgbmFtZXMgYW5kIGVzY2FwZXMKKyAgIyBiYWNrc2xhc2hlcyBmb3IgY3lncGF0aC4gIFRoZSBzZWNvbmQgc2VkIHByb2dyYW0gb3V0cHV0cyB0aGUgZmlsZQorICAjIG5hbWUgd2hlbiByZWFkaW5nLCBidXQgYWxzbyBhY2N1bXVsYXRlcyBhbGwgaW5jbHVkZSBmaWxlcyBpbiB0aGUKKyAgIyBob2xkIGJ1ZmZlciBpbiBvcmRlciB0byBvdXRwdXQgdGhlbSBhZ2FpbiBhdCB0aGUgZW5kLiAgVGhpcyBvbmx5CisgICMgd29ya3Mgd2l0aCBzZWQgaW1wbGVtZW50YXRpb25zIHRoYXQgY2FuIGhhbmRsZSBsYXJnZSBidWZmZXJzLgorICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uICcKKy9eTm90ZTogaW5jbHVkaW5nIGZpbGU6ICAqXCguKlwpLyB7CisgIHMvL1wxLworICBzL1xcL1xcXFwvZworICBwCit9JyB8ICRjeWdwYXRoX3UgfCBzb3J0IC11IHwgc2VkIC1uICcKK3MvIC9cXCAvZworcy9cKC4qXCkvCVwxIFxcL3AKK3MvLlwoLipcKSBcXC9cMTovCitICiskIHsKKyAgcy8uKi8JLworICBHCisgIHAKK30nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3ZjN21zeXMpCisgICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQorICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCisgICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGV4aXQgMQorICA7OworCisjbm9zaWRlZWZmZWN0KQorICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKKyAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KKworZGFzaG1zdGRvdXQpCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICB0ZXN0IC16ICIkZGFzaG1mbGFnIiAmJiBkYXNobWZsYWc9LU0KKyAgIyBSZXF1aXJlIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGA6JworICAjIGluIHRoZSB0YXJnZXQgbmFtZS4gIFRoaXMgaXMgdG8gY29wZSB3aXRoIERPUy1zdHlsZSBmaWxlbmFtZXM6CisgICMgYSBkZXBlbmRlbmN5IHN1Y2ggYXMgYGM6L2Zvby9iYXInIGNvdWxkIGJlIHNlZW4gYXMgdGFyZ2V0IGBjJyBvdGhlcndpc2UuCisgICIkQCIgJGRhc2htZmxhZyB8CisgICAgc2VkICdzOl5bICBdKlteOiBdW146XVteOl0qXDpbICAgIF0qOiciJG9iamVjdCInXDogOicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworZGFzaFhtc3Rkb3V0KQorICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5CisgICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgorICBleGl0IDEKKyAgOzsKKworbWFrZWRlcGVuZCkKKyAgIiRAIiB8fCBleGl0ICQ/CisgICMgUmVtb3ZlIGFueSBMaWJ0b29sIGNhbGwKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisgICMgWCBtYWtlZGVwZW5kCisgIHNoaWZ0CisgIGNsZWFyZWQ9bm8gZWF0PW5vCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRjbGVhcmVkIGluCisgICAgbm8pCisgICAgICBzZXQgIiI7IHNoaWZ0CisgICAgICBjbGVhcmVkPXllcyA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICRlYXQgPSB5ZXM7IHRoZW4KKyAgICAgIGVhdD1ubworICAgICAgY29udGludWUKKyAgICBmaQorICAgIGNhc2UgIiRhcmciIGluCisgICAgLUQqfC1JKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQorICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KKyAgICAtYXJjaCkKKyAgICAgIGVhdD15ZXMgOzsKKyAgICAtKnwkb2JqZWN0KQorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgIGVzYWMKKyAgZG9uZQorICBvYmpfc3VmZml4PWBlY2hvICIkb2JqZWN0IiB8IHNlZCAncy9eLipcLi8uLydgCisgIHRvdWNoICIkdG1wZGVwZmlsZSIKKyAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICBybSAtZiAiJGRlcGZpbGUiCisgICMgbWFrZWRlcGVuZCBtYXkgcHJlcGVuZCB0aGUgVlBBVEggZnJvbSB0aGUgc291cmNlIGZpbGUgbmFtZSB0byB0aGUgb2JqZWN0LgorICAjIE5vIG5lZWQgdG8gcmVnZXgtZXNjYXBlICRvYmplY3QsIGV4Y2VzcyBtYXRjaGluZyBvZiAnLicgaXMgaGFybWxlc3MuCisgIHNlZCAic3xeLipcKCRvYmplY3QgKjpcKXxcMXwiICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCisnIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKKyAgOzsKKworY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIiRAIiAtRSB8CisgICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKKyAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgKikKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIiRAIiAtRSAyPi9kZXYvbnVsbCB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6XDE6cCcgfCAkY3lncGF0aF91IHwgc29ydCAtdSA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uIC1lICdzJSAlXFwgJWcnIC1lICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3ZjbXN5cykKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9lZGl0b3JzL1JFQURNRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2VkaXRvcnMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTlmYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9lZGl0b3JzL1JFQURNRS50eHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBlZGl0b3JzCit0byBwcm9wZXJseSBkaXNwbGF5IFByb3RvY29sIEJ1ZmZlciBmaWxlcy4KKworU2VlIGVhY2ggZmlsZSdzIGhlYWRlciBjb21tZW50IGZvciBkaXJlY3Rpb25zIG9uIGhvdyB0byB1c2UgaXQgd2l0aCB0aGUKK2FwcHJvcHJpYXRlIGVkaXRvci4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZWRpdG9ycy9wcm90by52aW0gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2VkaXRvcnMvcHJvdG8udmltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjVmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2VkaXRvcnMvcHJvdG8udmltCkBAIC0wLDAgKzEsMTA1IEBACisiIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyIgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIgorIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIiBtZXQ6CisiCisiICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisiIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyIgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisiIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyIgZGlzdHJpYnV0aW9uLgorIiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisiIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisiIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisiCisiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyIgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyIgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisiIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisiIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisiIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyIgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiBUaGlzIGlzIHRoZSBWaW0gc3ludGF4IGZpbGUgZm9yIEdvb2dsZSBQcm90b2NvbCBCdWZmZXJzLgorIgorIiBVc2FnZToKKyIKKyIgMS4gY3AgcHJvdG8udmltIH4vLnZpbS9zeW50YXgvCisiIDIuIEFkZCB0aGUgZm9sbG93aW5nIHRvIH4vLnZpbXJjOgorIgorIiBhdWdyb3VwIGZpbGV0eXBlCisiICAgYXUhIEJ1ZlJlYWQsQnVmTmV3RmlsZSAqLnByb3RvIHNldGZpbGV0eXBlIHByb3RvCisiIGF1Z3JvdXAgZW5kCisiCisiIE9yIGp1c3QgY3JlYXRlIGEgbmV3IGZpbGUgY2FsbGVkIH4vLnZpbS9mdGRldGVjdC9wcm90by52aW0gd2l0aCB0aGUKKyIgcHJldmlvdXMgbGluZXMgb24gaXQuCisKK2lmIHZlcnNpb24gPCA2MDAKKyAgc3ludGF4IGNsZWFyCitlbHNlaWYgZXhpc3RzKCJiOmN1cnJlbnRfc3ludGF4IikKKyAgZmluaXNoCitlbmRpZgorCitzeW4gY2FzZSBtYXRjaAorCitzeW4ga2V5d29yZCBwYlRvZG8gICAgICAgY29udGFpbmVkIFRPRE8gRklYTUUgWFhYCitzeW4gY2x1c3RlciBwYkNvbW1lbnRHcnAgY29udGFpbnM9cGJUb2RvCisKK3N5biBrZXl3b3JkIHBiU3ludGF4ICAgICBzeW50YXggaW1wb3J0IG9wdGlvbgorc3luIGtleXdvcmQgcGJTdHJ1Y3R1cmUgIHBhY2thZ2UgbWVzc2FnZSBncm91cAorc3luIGtleXdvcmQgcGJSZXBlYXQgICAgIG9wdGlvbmFsIHJlcXVpcmVkIHJlcGVhdGVkCitzeW4ga2V5d29yZCBwYkRlZmF1bHQgICAgZGVmYXVsdAorc3luIGtleXdvcmQgcGJFeHRlbmQgICAgIGV4dGVuZCBleHRlbnNpb25zIHRvIG1heAorc3luIGtleXdvcmQgcGJSUEMgICAgICAgIHNlcnZpY2UgcnBjIHJldHVybnMKKworc3luIGtleXdvcmQgcGJUeXBlICAgICAgaW50MzIgaW50NjQgdWludDMyIHVpbnQ2NCBzaW50MzIgc2ludDY0CitzeW4ga2V5d29yZCBwYlR5cGUgICAgICBmaXhlZDMyIGZpeGVkNjQgc2ZpeGVkMzIgc2ZpeGVkNjQKK3N5biBrZXl3b3JkIHBiVHlwZSAgICAgIGZsb2F0IGRvdWJsZSBib29sIHN0cmluZyBieXRlcworc3luIGtleXdvcmQgcGJUeXBlZGVmICAgZW51bQorc3luIGtleXdvcmQgcGJCb29sICAgICAgdHJ1ZSBmYWxzZQorCitzeW4gbWF0Y2ggICBwYkludCAgICAgLy1cP1w8XGRcK1w+Lworc3luIG1hdGNoICAgcGJJbnQgICAgIC9cPDBbeFhdXHgrXD4vCitzeW4gbWF0Y2ggICBwYkZsb2F0ICAgL1w8LVw/XGQqXChcLlxkKlwpXD8vCitzeW4gcmVnaW9uICBwYkNvbW1lbnQgc3RhcnQ9IlwvXCoiIGVuZD0iXCpcLyIgY29udGFpbnM9QHBiQ29tbWVudEdycAorc3luIHJlZ2lvbiAgcGJDb21tZW50IHN0YXJ0PSIvLyIgc2tpcD0iXFwkIiBlbmQ9IiQiIGtlZXBlbmQgY29udGFpbnM9QHBiQ29tbWVudEdycAorc3luIHJlZ2lvbiAgcGJTdHJpbmcgIHN0YXJ0PS8iLyBza2lwPS9cXC4vIGVuZD0vIi8KK3N5biByZWdpb24gIHBiU3RyaW5nICBzdGFydD0vJy8gc2tpcD0vXFwuLyBlbmQ9LycvCisKK2lmIHZlcnNpb24gPj0gNTA4IHx8ICFleGlzdHMoImRpZF9wcm90b19zeW5faW5pdHMiKQorICBpZiB2ZXJzaW9uIDwgNTA4CisgICAgbGV0IGRpZF9wcm90b19zeW5faW5pdHMgPSAxCisgICAgY29tbWFuZCAtbmFyZ3M9KyBIaUxpbmsgaGkgbGluayA8YXJncz4KKyAgZWxzZQorICAgIGNvbW1hbmQgLW5hcmdzPSsgSGlMaW5rIGhpIGRlZiBsaW5rIDxhcmdzPgorICBlbmRpZgorCisgIEhpTGluayBwYlRvZG8gICAgICAgICBUb2RvCisKKyAgSGlMaW5rIHBiU3ludGF4ICAgICAgIEluY2x1ZGUKKyAgSGlMaW5rIHBiU3RydWN0dXJlICAgIFN0cnVjdHVyZQorICBIaUxpbmsgcGJSZXBlYXQgICAgICAgUmVwZWF0CisgIEhpTGluayBwYkRlZmF1bHQgICAgICBLZXl3b3JkCisgIEhpTGluayBwYkV4dGVuZCAgICAgICBLZXl3b3JkCisgIEhpTGluayBwYlJQQyAgICAgICAgICBLZXl3b3JkCisgIEhpTGluayBwYlR5cGUgICAgICAgICBUeXBlCisgIEhpTGluayBwYlR5cGVkZWYgICAgICBUeXBlZGVmCisgIEhpTGluayBwYkJvb2wgICAgICAgICBCb29sZWFuCisKKyAgSGlMaW5rIHBiSW50ICAgICAgICAgIE51bWJlcgorICBIaUxpbmsgcGJGbG9hdCAgICAgICAgRmxvYXQKKyAgSGlMaW5rIHBiQ29tbWVudCAgICAgIENvbW1lbnQKKyAgSGlMaW5rIHBiU3RyaW5nICAgICAgIFN0cmluZworCisgIGRlbGNvbW1hbmQgSGlMaW5rCitlbmRpZgorCitsZXQgYjpjdXJyZW50X3N5bnRheCA9ICJwcm90byIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZWRpdG9ycy9wcm90b2J1Zi1tb2RlLmVsIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9lZGl0b3JzL3Byb3RvYnVmLW1vZGUuZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhZWNjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZWRpdG9ycy9wcm90b2J1Zi1tb2RlLmVsCkBAIC0wLDAgKzEsMjIwIEBACis7OzsgcHJvdG9idWYtbW9kZS5lbCAtLS0gbWFqb3IgbW9kZSBmb3IgZWRpdGluZyBwcm90b2NvbCBidWZmZXJzLgorCis7OyBBdXRob3I6IEFsZXhhbmRyZSBWYXNzYWxvdHRpIDxhbGV4YW5kcmVAcGVhZHJvcC5jb20+Cis7OyBDcmVhdGVkOiAyMy1BcHItMjAwOQorOzsgVmVyc2lvbjogMC4zCis7OyBLZXl3b3JkczogZ29vZ2xlIHByb3RvYnVmIGxhbmd1YWdlcworCis7OyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKzs7IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKzs7IG1ldDoKKzs7Cis7OyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorOzsgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorOzsgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorOzsgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorOzsgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorOzsgZGlzdHJpYnV0aW9uLgorOzsgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworOzsgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKzs7IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCis7OworOzsgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworOzsgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKzs7IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorOzsgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKzs7IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorOzsgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorOzsgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCis7OyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKzs7IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKzs7IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorOzsgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworOzs7IENvbW1lbnRhcnk6CisKKzs7IEluc3RhbGxhdGlvbjoKKzs7ICAgLSBQdXQgYHByb3RvYnVmLW1vZGUuZWwnIGluIHlvdXIgRW1hY3MgbG9hZC1wYXRoLgorOzsgICAtIEFkZCB0aGlzIGxpbmUgdG8geW91ciAuZW1hY3MgZmlsZToKKzs7ICAgICAgIChyZXF1aXJlICdwcm90b2J1Zi1tb2RlKQorOzsKKzs7IFlvdSBjYW4gY3VzdG9taXplIHRoaXMgbW9kZSBqdXN0IGxpa2UgYW55IG1vZGUgZGVyaXZlZCBmcm9tIENDIE1vZGUuICBJZgorOzsgeW91IHdhbnQgdG8gYWRkIGN1c3RvbWl6YXRpb25zIHNwZWNpZmljIHRvIHByb3RvYnVmLW1vZGUsIHlvdSBjYW4gdXNlIHRoZQorOzsgYHByb3RvYnVmLW1vZGUtaG9vaycuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdvdWxkIG1ha2UgcHJvdG9jb2wtbW9kZQorOzsgdXNlIDItc3BhY2UgaW5kZW50YXRpb246Cis7OworOzsgICAoZGVmY29uc3QgbXktcHJvdG9idWYtc3R5bGUKKzs7ICAgICAnKChjLWJhc2ljLW9mZnNldCAuIDIpCis7OyAgICAgICAoaW5kZW50LXRhYnMtbW9kZSAuIG5pbCkpKQorOzsKKzs7ICAgKGFkZC1ob29rICdwcm90b2J1Zi1tb2RlLWhvb2sKKzs7ICAgICAobGFtYmRhICgpIChjLWFkZC1zdHlsZSAibXktc3R5bGUiIG15LXByb3RvYnVmLXN0eWxlIHQpKSkKKzs7Cis7OyBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBDQyBNb2RlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cis7OyBjdXN0b21pemF0aW9uIGRldGFpbHMgYW5kIGhvdyB0byB1c2UgdGhpcyBtb2RlLgorOzsKKzs7IFRPRE86Cis7OyAgIC0gTWFrZSBoaWdobGlnaHRpbmcgZm9yIGVudW0gdmFsdWVzIHdvcmsgcHJvcGVybHkuCis7OyAgIC0gRml4IHRoZSBwYXJzZXIgdG8gcmVjb2duaXplIGV4dGVuc2lvbnMgYXMgaWRlbnRpZmllcnMgYW5kIG5vdAorOzsgICAgIGFzIGNhc3RzLgorOzsgICAtIEltcHJvdmUgdGhlIHBhcnNpbmcgb2Ygb3B0aW9uIGFzc2lnbm1lbnQgbGlzdHMuIEZvciBleGFtcGxlOgorOzsgICAgICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMSBbKG15X2ZpZWxkX29wdGlvbikgPSA0LjVdOworOzsgICAtIEFkZCBzdXBwb3J0IGZvciBmdWxseS1xdWFsaWZpZWQgaWRlbnRpZmllcnMgKGUuZy4sIHdpdGggYSBsZWFkaW5nICIuIikuCisKKzs7OyBDb2RlOgorCisocmVxdWlyZSAnY2MtbW9kZSkKKworKGV2YWwtd2hlbi1jb21waWxlCisgIChyZXF1aXJlICdjYy1sYW5ncykKKyAgKHJlcXVpcmUgJ2NjLWZvbnRzKSkKKworOzsgVGhpcyBtb2RlIGRvZXMgbm90IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIG1vZGVzLiBTbywgd2UgZG8gbm90IHVzZSAKKzs7IHRoZSB1c3VhbCBgYy1hZGQtbGFuZ3VhZ2UnIGZ1bmN0aW9uLgorKGV2YWwtYW5kLWNvbXBpbGUKKyAgKHB1dCAncHJvdG9idWYtbW9kZSAnYy1tb2RlLXByZWZpeCAicHJvdG9idWYtIikpCisKKzs7IFRoZSBmb2xsb3dpbmcgY29kZSB1c2VzIG9mIHRoZSBgYy1sYW5nLWRlZmNvbnN0JyBtYWNybyBkZWZpbmUgc3ludGFjdGljCis7OyBmZWF0dXJlcyBvZiBwcm90b2NvbCBidWZmZXIgbGFuZ3VhZ2UuICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBpbiB0aGUKKzs7IGNjLWxhbmdzLmVsIGZpbGUgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWFuaW5nIG9mIHRoZSAta3dkcyB2YXJpYWJsZXMuCisKKyhjLWxhbmctZGVmY29uc3QgYy1wcmltaXRpdmUtdHlwZS1rd2RzCisgIHByb3RvYnVmICcoImRvdWJsZSIgImZsb2F0IiAiaW50MzIiICJpbnQ2NCIgInVpbnQzMiIgInVpbnQ2NCIgInNpbnQzMiIKKyAgICAgICAgICAgICAic2ludDY0IiAiZml4ZWQzMiIgImZpeGVkNjQiICJzZml4ZWQzMiIgInNmaXhlZDY0IiAiYm9vbCIKKyAgICAgICAgICAgICAic3RyaW5nIiAiYnl0ZXMiICJncm91cCIpKQorCisoYy1sYW5nLWRlZmNvbnN0IGMtbW9kaWZpZXIta3dkcworICBwcm90b2J1ZiAnKCJyZXF1aXJlZCIgIm9wdGlvbmFsIiAicmVwZWF0ZWQiKSkKKworKGMtbGFuZy1kZWZjb25zdCBjLWNsYXNzLWRlY2wta3dkcworICBwcm90b2J1ZiAnKCJtZXNzYWdlIiAiZW51bSIgInNlcnZpY2UiKSkKKworKGMtbGFuZy1kZWZjb25zdCBjLWNvbnN0YW50LWt3ZHMKKyAgcHJvdG9idWYgJygidHJ1ZSIgImZhbHNlIikpCisKKyhjLWxhbmctZGVmY29uc3QgYy1vdGhlci1kZWNsLWt3ZHMKKyAgcHJvdG9idWYgJygicGFja2FnZSIgImltcG9ydCIpKQorCisoYy1sYW5nLWRlZmNvbnN0IGMtb3RoZXIta3dkcworICBwcm90b2J1ZiAnKCJkZWZhdWx0IiAibWF4IikpCisKKyhjLWxhbmctZGVmY29uc3QgYy1pZGVudGlmaWVyLW9wcworICA7OyBIYW5kbGUgZXh0ZW5kZWQgaWRlbnRpZmllcnMgbGlrZSBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMKKyAgcHJvdG9idWYgJygobGVmdC1hc3NvYyAiLiIpKSkKKworOzsgVGhlIGZvbGxvd2luZyBrZXl3b3JkcyBkbyBub3QgZml0IHdlbGwgaW4ga2V5d29yZCBjbGFzc2VzIGRlZmluZWQgYnkKKzs7IGNjLW1vZGUuICBTbywgd2UgYXBwcm94aW1hdGUgYXMgYmVzdCB3ZSBjYW4uCisKKyhjLWxhbmctZGVmY29uc3QgYy10eXBlLWxpc3Qta3dkcworICBwcm90b2J1ZiAnKCJleHRlbnNpb25zIiAidG8iKSkKKworKGMtbGFuZy1kZWZjb25zdCBjLXR5cGVsZXNzLWRlY2wta3dkcworICBwcm90b2J1ZiAnKCJleHRlbmQiICJycGMiICJvcHRpb24iICJyZXR1cm5zIikpCisKKworOzsgSGVyZSB3ZSByZW1vdmUgZGVmYXVsdCBzeW50YXggZm9yIGxvb3BzLCBpZi1zdGF0ZW1lbnRzIGFuZCBvdGhlciBDCis7OyBzeW50YWN0aWMgZmVhdHVyZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGxhbmd1YWdlLgorCisoYy1sYW5nLWRlZmNvbnN0IGMtYnJhY2UtbGlzdC1kZWNsLWt3ZHMKKyAgOzsgUmVtb3ZlIHN5bnRheCBmb3IgQy1zdHlsZSBlbnVtZXJhdGlvbnMuCisgIHByb3RvYnVmIG5pbCkKKworKGMtbGFuZy1kZWZjb25zdCBjLWJsb2NrLXN0bXQtMS1rd2RzCisgIDs7IFJlbW92ZSBzeW50YXggZm9yICJkbyIgYW5kICJlbHNlIiBrZXl3b3Jkcy4KKyAgcHJvdG9idWYgbmlsKQorCisoYy1sYW5nLWRlZmNvbnN0IGMtYmxvY2stc3RtdC0yLWt3ZHMKKyAgOzsgUmVtb3ZlIHN5bnRheCBmb3IgImZvciIsICJpZiIsICJzd2l0Y2giIGFuZCAid2hpbGUiIGtleXdvcmRzLgorICBwcm90b2J1ZiBuaWwpCisKKyhjLWxhbmctZGVmY29uc3QgYy1zaW1wbGUtc3RtdC1rd2RzCisgIDs7IFJlbW92ZSBzeW50YXggZm9yICJicmVhayIsICJjb250aW51ZSIsICJnb3RvIiBhbmQgInJldHVybiIga2V5d29yZHMuCisgIHByb3RvYnVmIG5pbCkKKworKGMtbGFuZy1kZWZjb25zdCBjLXBhcmVuLXN0bXQta3dkcworICA7OyBSZW1vdmUgc3BlY2lhbCBjYXNlIGZvciB0aGUgIig7OykiIGluIGZvci1sb29wcy4KKyAgcHJvdG9idWYgbmlsKQorCisoYy1sYW5nLWRlZmNvbnN0IGMtbGFiZWwta3dkcworICA7OyBSZW1vdmUgY2FzZSBsYWJlbCBzeW50YXggZm9yIHRoZSAiY2FzZSIgYW5kICJkZWZhdWx0IiBrZXl3b3Jkcy4KKyAgcHJvdG9idWYgbmlsKQorCisoYy1sYW5nLWRlZmNvbnN0IGMtYmVmb3JlLWxhYmVsLWt3ZHMKKyAgOzsgUmVtb3ZlIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGxhYmVsIGluIGEgZ290byBzdGF0ZW1lbnQuCisgIHByb3RvYnVmIG5pbCkKKworKGMtbGFuZy1kZWZjb25zdCBjLWNwcC1tYXRjaGVycworICA7OyBEaXNhYmxlIGFsbCB0aGUgQyBwcmVwcm9jZXNzb3Igc3ludGF4LgorICBwcm90b2J1ZiBuaWwpCisKKyhjLWxhbmctZGVmY29uc3QgYy1kZWNsLXByZWZpeC1yZQorICA7OyBTYW1lIGFzIGZvciBDLCBleGNlcHQgaXQgZG9lcyBub3QgbWF0Y2ggIigiLiBUaGlzIGlzIG5lZWRlZCBmb3IgZGlzYWJsaW5nCisgIDs7IHRoZSBzeW50YXggZm9yIGNhc3RzLgorICBwcm90b2J1ZiAiXFwoW1x7XH07LF0rXFwpIikKKworCis7OyBBZGQgc3VwcG9ydCBmb3IgdmFyaWFibGUgbGV2ZWxzIG9mIHN5bnRheCBoaWdobGlnaHRpbmcuCisKKyhkZWZjb25zdCBwcm90b2J1Zi1mb250LWxvY2sta2V5d29yZHMtMSAoYy1sYW5nLWNvbnN0IGMtbWF0Y2hlcnMtMSBwcm90b2J1ZikKKyAgIk1pbmltYWwgaGlnaGxpZ2h0aW5nIGZvciBwcm90b2J1Zi1tb2RlLiIpCisKKyhkZWZjb25zdCBwcm90b2J1Zi1mb250LWxvY2sta2V5d29yZHMtMiAoYy1sYW5nLWNvbnN0IGMtbWF0Y2hlcnMtMiBwcm90b2J1ZikKKyAgIkZhc3Qgbm9ybWFsIGhpZ2hsaWdodGluZyBmb3IgcHJvdG9idWYtbW9kZS4iKQorCisoZGVmY29uc3QgcHJvdG9idWYtZm9udC1sb2NrLWtleXdvcmRzLTMgKGMtbGFuZy1jb25zdCBjLW1hdGNoZXJzLTMgcHJvdG9idWYpCisgICJBY2N1cmF0ZSBub3JtYWwgaGlnaGxpZ2h0aW5nIGZvciBwcm90b2J1Zi1tb2RlLiIpCisKKyhkZWZ2YXIgcHJvdG9idWYtZm9udC1sb2NrLWtleXdvcmRzIHByb3RvYnVmLWZvbnQtbG9jay1rZXl3b3Jkcy0zCisgICJEZWZhdWx0IGV4cHJlc3Npb25zIHRvIGhpZ2hsaWdodCBpbiBwcm90b2J1Zi1tb2RlLiIpCisKKzs7IE91ciBzeW50YXggdGFibGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSB0aGUga2V5d29yZCBjbGFzc2VzIHdlIGRlZmluZWQKKzs7IHByZXZpb3VzbHkgd2l0aCB0aGUgYGMtbGFuZy1jb25zdCcgbWFjcm8uCisoZGVmdmFyIHByb3RvYnVmLW1vZGUtc3ludGF4LXRhYmxlIG5pbAorICAiU3ludGF4IHRhYmxlIHVzZWQgaW4gcHJvdG9idWYtbW9kZSBidWZmZXJzLiIpCisob3IgcHJvdG9idWYtbW9kZS1zeW50YXgtdGFibGUKKyAgICAoc2V0cSBwcm90b2J1Zi1tb2RlLXN5bnRheC10YWJsZQorICAgICAgICAgIChmdW5jYWxsIChjLWxhbmctY29uc3QgYy1tYWtlLW1vZGUtc3ludGF4LXRhYmxlIHByb3RvYnVmKSkpKQorCisoZGVmdmFyIHByb3RvYnVmLW1vZGUtYWJicmV2LXRhYmxlIG5pbAorICAiQWJicmV2aWF0aW9uIHRhYmxlIHVzZWQgaW4gcHJvdG9idWYtbW9kZSBidWZmZXJzLiIpCisKKyhkZWZ2YXIgcHJvdG9idWYtbW9kZS1tYXAgbmlsCisgICJLZXltYXAgdXNlZCBpbiBwcm90b2J1Zi1tb2RlIGJ1ZmZlcnMuIikKKyhvciBwcm90b2J1Zi1tb2RlLW1hcAorICAgIChzZXRxIHByb3RvYnVmLW1vZGUtbWFwIChjLW1ha2UtaW5oZXJpdGVkLWtleW1hcCkpKQorCisoZWFzeS1tZW51LWRlZmluZSBwcm90b2J1Zi1tZW51IHByb3RvYnVmLW1vZGUtbWFwCisgICJQcm90b2NvbCBCdWZmZXJzIE1vZGUgQ29tbWFuZHMiCisgIChjb25zICJQcm90b2NvbCBCdWZmZXJzIiAoYy1sYW5nLWNvbnN0IGMtbW9kZS1tZW51IHByb3RvYnVmKSkpCisKKzs7OyMjI2F1dG9sb2FkIChhZGQtdG8tbGlzdCAnYXV0by1tb2RlLWFsaXN0ICcoIlxcLnByb3RvXFwnIiAuIHByb3RvYnVmLW1vZGUpKQorCis7OzsjIyNhdXRvbG9hZAorKGRlZnVuIHByb3RvYnVmLW1vZGUgKCkKKyAgIk1ham9yIG1vZGUgZm9yIGVkaXRpbmcgUHJvdG9jb2wgQnVmZmVycyBkZXNjcmlwdGlvbiBsYW5ndWFnZS4KKworVGhlIGhvb2sgYGMtbW9kZS1jb21tb24taG9vaycgaXMgcnVuIHdpdGggbm8gYXJndW1lbnQgYXQgbW9kZQoraW5pdGlhbGl6YXRpb24sIHRoZW4gYHByb3RvYnVmLW1vZGUtaG9vaycuCisKK0tleSBiaW5kaW5nczoKK1xce3Byb3RvYnVmLW1vZGUtbWFwfSIKKyAgKGludGVyYWN0aXZlKQorICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQorICAoc2V0LXN5bnRheC10YWJsZSBwcm90b2J1Zi1tb2RlLXN5bnRheC10YWJsZSkKKyAgKHNldHEgbWFqb3ItbW9kZSAncHJvdG9idWYtbW9kZQorICAgICAgICBtb2RlLW5hbWUgIlByb3RvY29sLUJ1ZmZlcnMiCisgICAgICAgIGxvY2FsLWFiYnJldi10YWJsZSBwcm90b2J1Zi1tb2RlLWFiYnJldi10YWJsZQorICAgICAgICBhYmJyZXYtbW9kZSB0KQorICAodXNlLWxvY2FsLW1hcCBwcm90b2J1Zi1tb2RlLW1hcCkKKyAgKGMtaW5pdGlhbGl6ZS1jYy1tb2RlIHQpCisgIChpZiAoZmJvdW5kcCAnYy1tYWtlLWVtYWNzLXZhcmlhYmxlcy1sb2NhbCkKKyAgICAgIChjLW1ha2UtZW1hY3MtdmFyaWFibGVzLWxvY2FsKSkKKyAgKGMtaW5pdC1sYW5ndWFnZS12YXJzIHByb3RvYnVmLW1vZGUpCisgIChjLWNvbW1vbi1pbml0ICdwcm90b2J1Zi1tb2RlKQorICAoZWFzeS1tZW51LWFkZCBwcm90b2J1Zi1tZW51KQorICAoYy1ydW4tbW9kZS1ob29rcyAnYy1tb2RlLWNvbW1vbi1ob29rICdwcm90b2J1Zi1tb2RlLWhvb2spCisgIChjLXVwZGF0ZS1tb2RlbGluZSkpCisKKyhwcm92aWRlICdwcm90b2J1Zi1tb2RlKQorCis7OzsgcHJvdG9idWYtbW9kZS5lbCBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvQWRkUGVyc29uLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL0FkZFBlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWFjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL0FkZFBlcnNvbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8vIFNlZSBSRUFETUUudHh0IGZvciBpbmZvcm1hdGlvbiBhbmQgYnVpbGQgaW5zdHJ1Y3Rpb25zLgorCitpbXBvcnQgY29tLmV4YW1wbGUudHV0b3JpYWwuQWRkcmVzc0Jvb2tQcm90b3MuQWRkcmVzc0Jvb2s7CitpbXBvcnQgY29tLmV4YW1wbGUudHV0b3JpYWwuQWRkcmVzc0Jvb2tQcm90b3MuUGVyc29uOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCitjbGFzcyBBZGRQZXJzb24geworICAvLyBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIGEgUGVyc29uIG1lc3NhZ2UgYmFzZWQgb24gdXNlciBpbnB1dC4KKyAgc3RhdGljIFBlcnNvbiBQcm9tcHRGb3JBZGRyZXNzKEJ1ZmZlcmVkUmVhZGVyIHN0ZGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gc3Rkb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFBlcnNvbi5CdWlsZGVyIHBlcnNvbiA9IFBlcnNvbi5uZXdCdWlsZGVyKCk7CisKKyAgICBzdGRvdXQucHJpbnQoIkVudGVyIHBlcnNvbiBJRDogIik7CisgICAgcGVyc29uLnNldElkKEludGVnZXIudmFsdWVPZihzdGRpbi5yZWFkTGluZSgpKSk7CisKKyAgICBzdGRvdXQucHJpbnQoIkVudGVyIG5hbWU6ICIpOworICAgIHBlcnNvbi5zZXROYW1lKHN0ZGluLnJlYWRMaW5lKCkpOworCisgICAgc3Rkb3V0LnByaW50KCJFbnRlciBlbWFpbCBhZGRyZXNzIChibGFuayBmb3Igbm9uZSk6ICIpOworICAgIFN0cmluZyBlbWFpbCA9IHN0ZGluLnJlYWRMaW5lKCk7CisgICAgaWYgKGVtYWlsLmxlbmd0aCgpID4gMCkgeworICAgICAgcGVyc29uLnNldEVtYWlsKGVtYWlsKTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3Rkb3V0LnByaW50KCJFbnRlciBhIHBob25lIG51bWJlciAob3IgbGVhdmUgYmxhbmsgdG8gZmluaXNoKTogIik7CisgICAgICBTdHJpbmcgbnVtYmVyID0gc3RkaW4ucmVhZExpbmUoKTsKKyAgICAgIGlmIChudW1iZXIubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgUGVyc29uLlBob25lTnVtYmVyLkJ1aWxkZXIgcGhvbmVOdW1iZXIgPQorICAgICAgICBQZXJzb24uUGhvbmVOdW1iZXIubmV3QnVpbGRlcigpLnNldE51bWJlcihudW1iZXIpOworCisgICAgICBzdGRvdXQucHJpbnQoIklzIHRoaXMgYSBtb2JpbGUsIGhvbWUsIG9yIHdvcmsgcGhvbmU/ICIpOworICAgICAgU3RyaW5nIHR5cGUgPSBzdGRpbi5yZWFkTGluZSgpOworICAgICAgaWYgKHR5cGUuZXF1YWxzKCJtb2JpbGUiKSkgeworICAgICAgICBwaG9uZU51bWJlci5zZXRUeXBlKFBlcnNvbi5QaG9uZVR5cGUuTU9CSUxFKTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoImhvbWUiKSkgeworICAgICAgICBwaG9uZU51bWJlci5zZXRUeXBlKFBlcnNvbi5QaG9uZVR5cGUuSE9NRSk7CisgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJ3b3JrIikpIHsKKyAgICAgICAgcGhvbmVOdW1iZXIuc2V0VHlwZShQZXJzb24uUGhvbmVUeXBlLldPUkspOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3Rkb3V0LnByaW50bG4oIlVua25vd24gcGhvbmUgdHlwZS4gIFVzaW5nIGRlZmF1bHQuIik7CisgICAgICB9CisKKyAgICAgIHBlcnNvbi5hZGRQaG9uZShwaG9uZU51bWJlcik7CisgICAgfQorCisgICAgcmV0dXJuIHBlcnNvbi5idWlsZCgpOworICB9CisKKyAgLy8gTWFpbiBmdW5jdGlvbjogIFJlYWRzIHRoZSBlbnRpcmUgYWRkcmVzcyBib29rIGZyb20gYSBmaWxlLAorICAvLyAgIGFkZHMgb25lIHBlcnNvbiBiYXNlZCBvbiB1c2VyIGlucHV0LCB0aGVuIHdyaXRlcyBpdCBiYWNrIG91dCB0byB0aGUgc2FtZQorICAvLyAgIGZpbGUuCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiAgQWRkUGVyc29uIEFERFJFU1NfQk9PS19GSUxFIik7CisgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgfQorCisgICAgQWRkcmVzc0Jvb2suQnVpbGRlciBhZGRyZXNzQm9vayA9IEFkZHJlc3NCb29rLm5ld0J1aWxkZXIoKTsKKworICAgIC8vIFJlYWQgdGhlIGV4aXN0aW5nIGFkZHJlc3MgYm9vay4KKyAgICB0cnkgeworICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzWzBdKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGFkZHJlc3NCb29rLm1lcmdlRnJvbShpbnB1dCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeyBpbnB1dC5jbG9zZSgpOyB9IGNhdGNoIChUaHJvd2FibGUgaWdub3JlKSB7fQorICAgICAgfQorICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYXJnc1swXSArICI6IEZpbGUgbm90IGZvdW5kLiAgQ3JlYXRpbmcgYSBuZXcgZmlsZS4iKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYW4gYWRkcmVzcy4KKyAgICBhZGRyZXNzQm9vay5hZGRQZXJzb24oCisgICAgICBQcm9tcHRGb3JBZGRyZXNzKG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSksCisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQpKTsKKworICAgIC8vIFdyaXRlIHRoZSBuZXcgYWRkcmVzcyBib29rIGJhY2sgdG8gZGlzay4KKyAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFyZ3NbMF0pOworICAgIHRyeSB7CisgICAgICBhZGRyZXNzQm9vay5idWlsZCgpLndyaXRlVG8ob3V0cHV0KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL0xpc3RQZW9wbGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvTGlzdFBlb3BsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjE1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL0xpc3RQZW9wbGUuamF2YQpAQCAtMCwwICsxLDUwIEBACisvLyBTZWUgUkVBRE1FLnR4dCBmb3IgaW5mb3JtYXRpb24gYW5kIGJ1aWxkIGluc3RydWN0aW9ucy4KKworaW1wb3J0IGNvbS5leGFtcGxlLnR1dG9yaWFsLkFkZHJlc3NCb29rUHJvdG9zLkFkZHJlc3NCb29rOworaW1wb3J0IGNvbS5leGFtcGxlLnR1dG9yaWFsLkFkZHJlc3NCb29rUHJvdG9zLlBlcnNvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CisKK2NsYXNzIExpc3RQZW9wbGUgeworICAvLyBJdGVyYXRlcyB0aG91Z2ggYWxsIHBlb3BsZSBpbiB0aGUgQWRkcmVzc0Jvb2sgYW5kIHByaW50cyBpbmZvIGFib3V0IHRoZW0uCisgIHN0YXRpYyB2b2lkIFByaW50KEFkZHJlc3NCb29rIGFkZHJlc3NCb29rKSB7CisgICAgZm9yIChQZXJzb24gcGVyc29uOiBhZGRyZXNzQm9vay5nZXRQZXJzb25MaXN0KCkpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGVyc29uIElEOiAiICsgcGVyc29uLmdldElkKCkpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIE5hbWU6ICIgKyBwZXJzb24uZ2V0TmFtZSgpKTsKKyAgICAgIGlmIChwZXJzb24uaGFzRW1haWwoKSkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgRS1tYWlsIGFkZHJlc3M6ICIgKyBwZXJzb24uZ2V0RW1haWwoKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoUGVyc29uLlBob25lTnVtYmVyIHBob25lTnVtYmVyIDogcGVyc29uLmdldFBob25lTGlzdCgpKSB7CisgICAgICAgIHN3aXRjaCAocGhvbmVOdW1iZXIuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgY2FzZSBNT0JJTEU6CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIE1vYmlsZSBwaG9uZSAjOiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSE9NRToKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgSG9tZSBwaG9uZSAjOiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgV09SSzoKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgV29yayBwaG9uZSAjOiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwaG9uZU51bWJlci5nZXROdW1iZXIoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTWFpbiBmdW5jdGlvbjogIFJlYWRzIHRoZSBlbnRpcmUgYWRkcmVzcyBib29rIGZyb20gYSBmaWxlIGFuZCBwcmludHMgYWxsCisgIC8vICAgdGhlIGluZm9ybWF0aW9uIGluc2lkZS4KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6ICBMaXN0UGVvcGxlIEFERFJFU1NfQk9PS19GSUxFIik7CisgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgZXhpc3RpbmcgYWRkcmVzcyBib29rLgorICAgIEFkZHJlc3NCb29rIGFkZHJlc3NCb29rID0KKyAgICAgIEFkZHJlc3NCb29rLnBhcnNlRnJvbShuZXcgRmlsZUlucHV0U3RyZWFtKGFyZ3NbMF0pKTsKKworICAgIFByaW50KGFkZHJlc3NCb29rKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9leGFtcGxlcy9NYWtlZmlsZSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjOTA4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvTWFrZWZpbGUKQEAgLTAsMCArMSw1OCBAQAorIyBTZWUgUkVBRE1FLnR4dC4KKworLlBIT05ZOiBhbGwgY3BwIGphdmEgcHl0aG9uIGNsZWFuCisKK2FsbDogY3BwIGphdmEgcHl0aG9uCisKK2NwcDogICAgYWRkX3BlcnNvbl9jcHAgICAgbGlzdF9wZW9wbGVfY3BwCitqYXZhOiAgIGFkZF9wZXJzb25famF2YSAgIGxpc3RfcGVvcGxlX2phdmEKK3B5dGhvbjogYWRkX3BlcnNvbl9weXRob24gbGlzdF9wZW9wbGVfcHl0aG9uCisKK2NsZWFuOgorCXJtIC1mIGFkZF9wZXJzb25fY3BwIGxpc3RfcGVvcGxlX2NwcCBhZGRfcGVyc29uX2phdmEgbGlzdF9wZW9wbGVfamF2YSBhZGRfcGVyc29uX3B5dGhvbiBsaXN0X3Blb3BsZV9weXRob24KKwlybSAtZiBqYXZhY19taWRkbGVtYW4gQWRkUGVyc29uKi5jbGFzcyBMaXN0UGVvcGxlKi5jbGFzcyBjb20vZXhhbXBsZS90dXRvcmlhbC8qLmNsYXNzCisJcm0gLWYgcHJvdG9jX21pZGRsZW1hbiBhZGRyZXNzYm9vay5wYi5jYyBhZGRyZXNzYm9vay5wYi5oIGFkZHJlc3Nib29rX3BiMi5weSBjb20vZXhhbXBsZS90dXRvcmlhbC9BZGRyZXNzQm9va1Byb3Rvcy5qYXZhCisJcm0gLWYgKi5weWMKKwlybWRpciBjb20vZXhhbXBsZS90dXRvcmlhbCAyPi9kZXYvbnVsbCB8fCB0cnVlCisJcm1kaXIgY29tL2V4YW1wbGUgMj4vZGV2L251bGwgfHwgdHJ1ZQorCXJtZGlyIGNvbSAyPi9kZXYvbnVsbCB8fCB0cnVlCisKK3Byb3RvY19taWRkbGVtYW46IGFkZHJlc3Nib29rLnByb3RvCisJcHJvdG9jIC0tY3BwX291dD0uIC0tamF2YV9vdXQ9LiAtLXB5dGhvbl9vdXQ9LiBhZGRyZXNzYm9vay5wcm90bworCUB0b3VjaCBwcm90b2NfbWlkZGxlbWFuCisKK2FkZF9wZXJzb25fY3BwOiBhZGRfcGVyc29uLmNjIHByb3RvY19taWRkbGVtYW4KKwlwa2ctY29uZmlnIC0tY2ZsYWdzIHByb3RvYnVmICAjIGZhaWxzIGlmIHByb3RvYnVmIGlzIG5vdCBpbnN0YWxsZWQKKwljKysgYWRkX3BlcnNvbi5jYyBhZGRyZXNzYm9vay5wYi5jYyAtbyBhZGRfcGVyc29uX2NwcCBgcGtnLWNvbmZpZyAtLWNmbGFncyAtLWxpYnMgcHJvdG9idWZgCisKK2xpc3RfcGVvcGxlX2NwcDogbGlzdF9wZW9wbGUuY2MgcHJvdG9jX21pZGRsZW1hbgorCXBrZy1jb25maWcgLS1jZmxhZ3MgcHJvdG9idWYgICMgZmFpbHMgaWYgcHJvdG9idWYgaXMgbm90IGluc3RhbGxlZAorCWMrKyBsaXN0X3Blb3BsZS5jYyBhZGRyZXNzYm9vay5wYi5jYyAtbyBsaXN0X3Blb3BsZV9jcHAgYHBrZy1jb25maWcgLS1jZmxhZ3MgLS1saWJzIHByb3RvYnVmYAorCitqYXZhY19taWRkbGVtYW46IEFkZFBlcnNvbi5qYXZhIExpc3RQZW9wbGUuamF2YSBwcm90b2NfbWlkZGxlbWFuCisJamF2YWMgQWRkUGVyc29uLmphdmEgTGlzdFBlb3BsZS5qYXZhIGNvbS9leGFtcGxlL3R1dG9yaWFsL0FkZHJlc3NCb29rUHJvdG9zLmphdmEKKwlAdG91Y2ggamF2YWNfbWlkZGxlbWFuCisKK2FkZF9wZXJzb25famF2YTogamF2YWNfbWlkZGxlbWFuCisJQGVjaG8gIldyaXRpbmcgc2hvcnRjdXQgc2NyaXB0IGFkZF9wZXJzb25famF2YS4uLiIKKwlAZWNobyAnIyEgL2Jpbi9zaCcgPiBhZGRfcGVyc29uX2phdmEKKwlAZWNobyAnamF2YSAtY2xhc3NwYXRoIC46JCRDTEFTU1BBVEggQWRkUGVyc29uICIkJEAiJyA+PiBhZGRfcGVyc29uX2phdmEKKwlAY2htb2QgK3ggYWRkX3BlcnNvbl9qYXZhCisKK2xpc3RfcGVvcGxlX2phdmE6IGphdmFjX21pZGRsZW1hbgorCUBlY2hvICJXcml0aW5nIHNob3J0Y3V0IHNjcmlwdCBsaXN0X3Blb3BsZV9qYXZhLi4uIgorCUBlY2hvICcjISAvYmluL3NoJyA+IGxpc3RfcGVvcGxlX2phdmEKKwlAZWNobyAnamF2YSAtY2xhc3NwYXRoIC46JCRDTEFTU1BBVEggTGlzdFBlb3BsZSAiJCRAIicgPj4gbGlzdF9wZW9wbGVfamF2YQorCUBjaG1vZCAreCBsaXN0X3Blb3BsZV9qYXZhCisKK2FkZF9wZXJzb25fcHl0aG9uOiBhZGRfcGVyc29uLnB5IHByb3RvY19taWRkbGVtYW4KKwlAZWNobyAiV3JpdGluZyBzaG9ydGN1dCBzY3JpcHQgYWRkX3BlcnNvbl9weXRob24uLi4iCisJQGVjaG8gJyMhIC9iaW4vc2gnID4gYWRkX3BlcnNvbl9weXRob24KKwlAZWNobyAnLi9hZGRfcGVyc29uLnB5ICIkJEAiJyA+PiBhZGRfcGVyc29uX3B5dGhvbgorCUBjaG1vZCAreCBhZGRfcGVyc29uX3B5dGhvbgorCitsaXN0X3Blb3BsZV9weXRob246IGxpc3RfcGVvcGxlLnB5IHByb3RvY19taWRkbGVtYW4KKwlAZWNobyAiV3JpdGluZyBzaG9ydGN1dCBzY3JpcHQgbGlzdF9wZW9wbGVfcHl0aG9uLi4uIgorCUBlY2hvICcjISAvYmluL3NoJyA+IGxpc3RfcGVvcGxlX3B5dGhvbgorCUBlY2hvICcuL2xpc3RfcGVvcGxlLnB5ICIkJEAiJyA+PiBsaXN0X3Blb3BsZV9weXRob24KKwlAY2htb2QgK3ggbGlzdF9wZW9wbGVfcHl0aG9uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL1JFQURNRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYmYwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDI5IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBleGFtcGxlIGNvZGUgdGhhdCB1c2VzIFByb3RvY29sIEJ1ZmZlcnMgdG8gbWFuYWdlIGFuCithZGRyZXNzIGJvb2suICBUd28gcHJvZ3JhbXMgYXJlIHByb3ZpZGVkLCBlYWNoIHdpdGggdGhyZWUgZGlmZmVyZW50CitpbXBsZW1lbnRhdGlvbnMsIG9uZSB3cml0dGVuIGluIGVhY2ggb2YgQysrLCBKYXZhLCBhbmQgUHl0aG9uLiAgVGhlIGFkZF9wZXJzb24KK2V4YW1wbGUgYWRkcyBhIG5ldyBwZXJzb24gdG8gYW4gYWRkcmVzcyBib29rLCBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gaW5wdXQKK3RoZSBwZXJzb24ncyBpbmZvcm1hdGlvbi4gIFRoZSBsaXN0X3Blb3BsZSBleGFtcGxlIGxpc3RzIHBlb3BsZSBhbHJlYWR5IGluIHRoZQorYWRkcmVzcyBib29rLiAgVGhlIGV4YW1wbGVzIHVzZSB0aGUgZXhhY3Qgc2FtZSBmb3JtYXQgaW4gYWxsIHRocmVlIGxhbmd1YWdlcywKK3NvIHlvdSBjYW4sIGZvciBleGFtcGxlLCB1c2UgYWRkX3BlcnNvbl9qYXZhIHRvIGNyZWF0ZSBhbiBhZGRyZXNzIGJvb2sgYW5kIHRoZW4KK3VzZSBsaXN0X3Blb3BsZV9weXRob24gdG8gcmVhZCBpdC4KKworWW91IG11c3QgaW5zdGFsbCB0aGUgcHJvdG9idWYgcGFja2FnZSBiZWZvcmUgeW91IGNhbiBidWlsZCB0aGVzZS4KKworVG8gYnVpbGQgYWxsIHRoZSBleGFtcGxlcyAob24gYSB1bml4LWxpa2Ugc3lzdGVtKSwgc2ltcGx5IHJ1biAibWFrZSIuICBUaGlzCitjcmVhdGVzIHRoZSBmb2xsb3dpbmcgZXhlY3V0YWJsZSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnk6CisgIGFkZF9wZXJzb25fY3BwICAgICBsaXN0X3Blb3BsZV9jcHAKKyAgYWRkX3BlcnNvbl9qYXZhICAgIGxpc3RfcGVvcGxlX2phdmEKKyAgYWRkX3BlcnNvbl9weXRob24gIGxpc3RfcGVvcGxlX3B5dGhvbgorCitJZiB5b3Ugb25seSB3YW50IHRvIGNvbXBpbGUgZXhhbXBsZXMgaW4gb25lIGxhbmd1YWdlLCB1c2UgIm1ha2UgY3BwIiosCisibWFrZSBqYXZhIiwgb3IgIm1ha2UgcHl0aG9uIi4KKworQWxsIG9mIHRoZXNlIHByb2dyYW1zIHNpbXBseSB0YWtlIGFuIGFkZHJlc3MgYm9vayBmaWxlIGFzIHRoZWlyIHBhcmFtZXRlci4KK1RoZSBhZGRfcGVyc29uIHByb2dyYW1zIHdpbGwgY3JlYXRlIHRoZSBmaWxlIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KKworVGhlc2UgZXhhbXBsZXMgYXJlIHBhcnQgb2YgdGhlIFByb3RvY29sIEJ1ZmZlcnMgdHV0b3JpYWwsIGxvY2F0ZWQgYXQ6CisgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvZG9jcy90dXRvcmlhbHMuaHRtbAorCisqIE5vdGUgdGhhdCBvbiBzb21lIHBsYXRmb3JtcyB5b3UgbWF5IGhhdmUgdG8gZWRpdCB0aGUgTWFrZWZpbGUgYW5kIHJlbW92ZQorIi1scHRocmVhZCIgZnJvbSB0aGUgbGlua2VyIGNvbW1hbmRzIChwZXJoYXBzIHJlcGxhY2luZyBpdCB3aXRoIHNvbWV0aGluZyBlbHNlKS4KK1dlIGRpZG4ndCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgYmVjYXVzZSB3ZSB3YW50ZWQgdG8ga2VlcCB0aGUgZXhhbXBsZSBzaW1wbGUuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL2FkZF9wZXJzb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL2FkZF9wZXJzb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljYTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvYWRkX3BlcnNvbi5jYwpAQCAtMCwwICsxLDk1IEBACisvLyBTZWUgUkVBRE1FLnR4dCBmb3IgaW5mb3JtYXRpb24gYW5kIGJ1aWxkIGluc3RydWN0aW9ucy4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImFkZHJlc3Nib29rLnBiLmgiCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvLyBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIGEgUGVyc29uIG1lc3NhZ2UgYmFzZWQgb24gdXNlciBpbnB1dC4KK3ZvaWQgUHJvbXB0Rm9yQWRkcmVzcyh0dXRvcmlhbDo6UGVyc29uKiBwZXJzb24pIHsKKyAgY291dCA8PCAiRW50ZXIgcGVyc29uIElEIG51bWJlcjogIjsKKyAgaW50IGlkOworICBjaW4gPj4gaWQ7CisgIHBlcnNvbi0+c2V0X2lkKGlkKTsKKyAgY2luLmlnbm9yZSgyNTYsICdcbicpOworCisgIGNvdXQgPDwgIkVudGVyIG5hbWU6ICI7CisgIGdldGxpbmUoY2luLCAqcGVyc29uLT5tdXRhYmxlX25hbWUoKSk7CisKKyAgY291dCA8PCAiRW50ZXIgZW1haWwgYWRkcmVzcyAoYmxhbmsgZm9yIG5vbmUpOiAiOworICBzdHJpbmcgZW1haWw7CisgIGdldGxpbmUoY2luLCBlbWFpbCk7CisgIGlmICghZW1haWwuZW1wdHkoKSkgeworICAgIHBlcnNvbi0+c2V0X2VtYWlsKGVtYWlsKTsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgY291dCA8PCAiRW50ZXIgYSBwaG9uZSBudW1iZXIgKG9yIGxlYXZlIGJsYW5rIHRvIGZpbmlzaCk6ICI7CisgICAgc3RyaW5nIG51bWJlcjsKKyAgICBnZXRsaW5lKGNpbiwgbnVtYmVyKTsKKyAgICBpZiAobnVtYmVyLmVtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHR1dG9yaWFsOjpQZXJzb246OlBob25lTnVtYmVyKiBwaG9uZV9udW1iZXIgPSBwZXJzb24tPmFkZF9waG9uZSgpOworICAgIHBob25lX251bWJlci0+c2V0X251bWJlcihudW1iZXIpOworCisgICAgY291dCA8PCAiSXMgdGhpcyBhIG1vYmlsZSwgaG9tZSwgb3Igd29yayBwaG9uZT8gIjsKKyAgICBzdHJpbmcgdHlwZTsKKyAgICBnZXRsaW5lKGNpbiwgdHlwZSk7CisgICAgaWYgKHR5cGUgPT0gIm1vYmlsZSIpIHsKKyAgICAgIHBob25lX251bWJlci0+c2V0X3R5cGUodHV0b3JpYWw6OlBlcnNvbjo6TU9CSUxFKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImhvbWUiKSB7CisgICAgICBwaG9uZV9udW1iZXItPnNldF90eXBlKHR1dG9yaWFsOjpQZXJzb246OkhPTUUpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAid29yayIpIHsKKyAgICAgIHBob25lX251bWJlci0+c2V0X3R5cGUodHV0b3JpYWw6OlBlcnNvbjo6V09SSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvdXQgPDwgIlVua25vd24gcGhvbmUgdHlwZS4gIFVzaW5nIGRlZmF1bHQuIiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvLyBNYWluIGZ1bmN0aW9uOiAgUmVhZHMgdGhlIGVudGlyZSBhZGRyZXNzIGJvb2sgZnJvbSBhIGZpbGUsCisvLyAgIGFkZHMgb25lIHBlcnNvbiBiYXNlZCBvbiB1c2VyIGlucHV0LCB0aGVuIHdyaXRlcyBpdCBiYWNrIG91dCB0byB0aGUgc2FtZQorLy8gICBmaWxlLgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAvLyBWZXJpZnkgdGhhdCB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB0aGF0IHdlIGxpbmtlZCBhZ2FpbnN0IGlzCisgIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVycyB3ZSBjb21waWxlZCBhZ2FpbnN0LgorICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047CisKKyAgaWYgKGFyZ2MgIT0gMikgeworICAgIGNlcnIgPDwgIlVzYWdlOiAgIiA8PCBhcmd2WzBdIDw8ICIgQUREUkVTU19CT09LX0ZJTEUiIDw8IGVuZGw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgdHV0b3JpYWw6OkFkZHJlc3NCb29rIGFkZHJlc3NfYm9vazsKKworICB7CisgICAgLy8gUmVhZCB0aGUgZXhpc3RpbmcgYWRkcmVzcyBib29rLgorICAgIGZzdHJlYW0gaW5wdXQoYXJndlsxXSwgaW9zOjppbiB8IGlvczo6YmluYXJ5KTsKKyAgICBpZiAoIWlucHV0KSB7CisgICAgICBjb3V0IDw8IGFyZ3ZbMV0gPDwgIjogRmlsZSBub3QgZm91bmQuICBDcmVhdGluZyBhIG5ldyBmaWxlLiIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKCFhZGRyZXNzX2Jvb2suUGFyc2VGcm9tSXN0cmVhbSgmaW5wdXQpKSB7CisgICAgICBjZXJyIDw8ICJGYWlsZWQgdG8gcGFyc2UgYWRkcmVzcyBib29rLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICAvLyBBZGQgYW4gYWRkcmVzcy4KKyAgUHJvbXB0Rm9yQWRkcmVzcyhhZGRyZXNzX2Jvb2suYWRkX3BlcnNvbigpKTsKKworICB7CisgICAgLy8gV3JpdGUgdGhlIG5ldyBhZGRyZXNzIGJvb2sgYmFjayB0byBkaXNrLgorICAgIGZzdHJlYW0gb3V0cHV0KGFyZ3ZbMV0sIGlvczo6b3V0IHwgaW9zOjp0cnVuYyB8IGlvczo6YmluYXJ5KTsKKyAgICBpZiAoIWFkZHJlc3NfYm9vay5TZXJpYWxpemVUb09zdHJlYW0oJm91dHB1dCkpIHsKKyAgICAgIGNlcnIgPDwgIkZhaWxlZCB0byB3cml0ZSBhZGRyZXNzIGJvb2suIiA8PCBlbmRsOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIC8vIE9wdGlvbmFsOiAgRGVsZXRlIGFsbCBnbG9iYWwgb2JqZWN0cyBhbGxvY2F0ZWQgYnkgbGlicHJvdG9idWYuCisgIGdvb2dsZTo6cHJvdG9idWY6OlNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL2FkZF9wZXJzb24ucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL2FkZF9wZXJzb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzhlNTY5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvYWRkX3BlcnNvbi5weQpAQCAtMCwwICsxLDU4IEBACisjISAvdXNyL2Jpbi9weXRob24KKworIyBTZWUgUkVBRE1FLnR4dCBmb3IgaW5mb3JtYXRpb24gYW5kIGJ1aWxkIGluc3RydWN0aW9ucy4KKworaW1wb3J0IGFkZHJlc3Nib29rX3BiMgoraW1wb3J0IHN5cworCisjIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gYSBQZXJzb24gbWVzc2FnZSBiYXNlZCBvbiB1c2VyIGlucHV0LgorZGVmIFByb21wdEZvckFkZHJlc3MocGVyc29uKToKKyAgcGVyc29uLmlkID0gaW50KHJhd19pbnB1dCgiRW50ZXIgcGVyc29uIElEIG51bWJlcjogIikpCisgIHBlcnNvbi5uYW1lID0gcmF3X2lucHV0KCJFbnRlciBuYW1lOiAiKQorCisgIGVtYWlsID0gcmF3X2lucHV0KCJFbnRlciBlbWFpbCBhZGRyZXNzIChibGFuayBmb3Igbm9uZSk6ICIpCisgIGlmIGVtYWlsICE9ICIiOgorICAgIHBlcnNvbi5lbWFpbCA9IGVtYWlsCisKKyAgd2hpbGUgVHJ1ZToKKyAgICBudW1iZXIgPSByYXdfaW5wdXQoIkVudGVyIGEgcGhvbmUgbnVtYmVyIChvciBsZWF2ZSBibGFuayB0byBmaW5pc2gpOiAiKQorICAgIGlmIG51bWJlciA9PSAiIjoKKyAgICAgIGJyZWFrCisKKyAgICBwaG9uZV9udW1iZXIgPSBwZXJzb24ucGhvbmUuYWRkKCkKKyAgICBwaG9uZV9udW1iZXIubnVtYmVyID0gbnVtYmVyCisKKyAgICB0eXBlID0gcmF3X2lucHV0KCJJcyB0aGlzIGEgbW9iaWxlLCBob21lLCBvciB3b3JrIHBob25lPyAiKQorICAgIGlmIHR5cGUgPT0gIm1vYmlsZSI6CisgICAgICBwaG9uZV9udW1iZXIudHlwZSA9IGFkZHJlc3Nib29rX3BiMi5QZXJzb24uTU9CSUxFCisgICAgZWxpZiB0eXBlID09ICJob21lIjoKKyAgICAgIHBob25lX251bWJlci50eXBlID0gYWRkcmVzc2Jvb2tfcGIyLlBlcnNvbi5IT01FCisgICAgZWxpZiB0eXBlID09ICJ3b3JrIjoKKyAgICAgIHBob25lX251bWJlci50eXBlID0gYWRkcmVzc2Jvb2tfcGIyLlBlcnNvbi5XT1JLCisgICAgZWxzZToKKyAgICAgIHByaW50ICJVbmtub3duIHBob25lIHR5cGU7IGxlYXZpbmcgYXMgZGVmYXVsdCB2YWx1ZS4iCisKKyMgTWFpbiBwcm9jZWR1cmU6ICBSZWFkcyB0aGUgZW50aXJlIGFkZHJlc3MgYm9vayBmcm9tIGEgZmlsZSwKKyMgICBhZGRzIG9uZSBwZXJzb24gYmFzZWQgb24gdXNlciBpbnB1dCwgdGhlbiB3cml0ZXMgaXQgYmFjayBvdXQgdG8gdGhlIHNhbWUKKyMgICBmaWxlLgoraWYgbGVuKHN5cy5hcmd2KSAhPSAyOgorICBwcmludCAiVXNhZ2U6Iiwgc3lzLmFyZ3ZbMF0sICJBRERSRVNTX0JPT0tfRklMRSIKKyAgc3lzLmV4aXQoLTEpCisKK2FkZHJlc3NfYm9vayA9IGFkZHJlc3Nib29rX3BiMi5BZGRyZXNzQm9vaygpCisKKyMgUmVhZCB0aGUgZXhpc3RpbmcgYWRkcmVzcyBib29rLgordHJ5OgorICBmID0gb3BlbihzeXMuYXJndlsxXSwgInJiIikKKyAgYWRkcmVzc19ib29rLlBhcnNlRnJvbVN0cmluZyhmLnJlYWQoKSkKKyAgZi5jbG9zZSgpCitleGNlcHQgSU9FcnJvcjoKKyAgcHJpbnQgc3lzLmFyZ3ZbMV0gKyAiOiBGaWxlIG5vdCBmb3VuZC4gIENyZWF0aW5nIGEgbmV3IGZpbGUuIgorCisjIEFkZCBhbiBhZGRyZXNzLgorUHJvbXB0Rm9yQWRkcmVzcyhhZGRyZXNzX2Jvb2sucGVyc29uLmFkZCgpKQorCisjIFdyaXRlIHRoZSBuZXcgYWRkcmVzcyBib29rIGJhY2sgdG8gZGlzay4KK2YgPSBvcGVuKHN5cy5hcmd2WzFdLCAid2IiKQorZi53cml0ZShhZGRyZXNzX2Jvb2suU2VyaWFsaXplVG9TdHJpbmcoKSkKK2YuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9leGFtcGxlcy9hZGRyZXNzYm9vay5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvYWRkcmVzc2Jvb2sucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0ODI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvYWRkcmVzc2Jvb2sucHJvdG8KQEAgLTAsMCArMSwzMCBAQAorLy8gU2VlIFJFQURNRS50eHQgZm9yIGluZm9ybWF0aW9uIGFuZCBidWlsZCBpbnN0cnVjdGlvbnMuCisKK3BhY2thZ2UgdHV0b3JpYWw7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmV4YW1wbGUudHV0b3JpYWwiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkFkZHJlc3NCb29rUHJvdG9zIjsKKworbWVzc2FnZSBQZXJzb24geworICByZXF1aXJlZCBzdHJpbmcgbmFtZSA9IDE7CisgIHJlcXVpcmVkIGludDMyIGlkID0gMjsgICAgICAgIC8vIFVuaXF1ZSBJRCBudW1iZXIgZm9yIHRoaXMgcGVyc29uLgorICBvcHRpb25hbCBzdHJpbmcgZW1haWwgPSAzOworCisgIGVudW0gUGhvbmVUeXBlIHsKKyAgICBNT0JJTEUgPSAwOworICAgIEhPTUUgPSAxOworICAgIFdPUksgPSAyOworICB9CisKKyAgbWVzc2FnZSBQaG9uZU51bWJlciB7CisgICAgcmVxdWlyZWQgc3RyaW5nIG51bWJlciA9IDE7CisgICAgb3B0aW9uYWwgUGhvbmVUeXBlIHR5cGUgPSAyIFtkZWZhdWx0ID0gSE9NRV07CisgIH0KKworICByZXBlYXRlZCBQaG9uZU51bWJlciBwaG9uZSA9IDQ7Cit9CisKKy8vIE91ciBhZGRyZXNzIGJvb2sgZmlsZSBpcyBqdXN0IG9uZSBvZiB0aGVzZS4KK21lc3NhZ2UgQWRkcmVzc0Jvb2sgeworICByZXBlYXRlZCBQZXJzb24gcGVyc29uID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvbGlzdF9wZW9wbGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL2xpc3RfcGVvcGxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjMxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2V4YW1wbGVzL2xpc3RfcGVvcGxlLmNjCkBAIC0wLDAgKzEsNjggQEAKKy8vIFNlZSBSRUFETUUudHh0IGZvciBpbmZvcm1hdGlvbiBhbmQgYnVpbGQgaW5zdHJ1Y3Rpb25zLgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiYWRkcmVzc2Jvb2sucGIuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vIEl0ZXJhdGVzIHRob3VnaCBhbGwgcGVvcGxlIGluIHRoZSBBZGRyZXNzQm9vayBhbmQgcHJpbnRzIGluZm8gYWJvdXQgdGhlbS4KK3ZvaWQgTGlzdFBlb3BsZShjb25zdCB0dXRvcmlhbDo6QWRkcmVzc0Jvb2smIGFkZHJlc3NfYm9vaykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHJlc3NfYm9vay5wZXJzb25fc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCB0dXRvcmlhbDo6UGVyc29uJiBwZXJzb24gPSBhZGRyZXNzX2Jvb2sucGVyc29uKGkpOworCisgICAgY291dCA8PCAiUGVyc29uIElEOiAiIDw8IHBlcnNvbi5pZCgpIDw8IGVuZGw7CisgICAgY291dCA8PCAiICBOYW1lOiAiIDw8IHBlcnNvbi5uYW1lKCkgPDwgZW5kbDsKKyAgICBpZiAocGVyc29uLmhhc19lbWFpbCgpKSB7CisgICAgICBjb3V0IDw8ICIgIEUtbWFpbCBhZGRyZXNzOiAiIDw8IHBlcnNvbi5lbWFpbCgpIDw8IGVuZGw7CisgICAgfQorCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwZXJzb24ucGhvbmVfc2l6ZSgpOyBqKyspIHsKKyAgICAgIGNvbnN0IHR1dG9yaWFsOjpQZXJzb246OlBob25lTnVtYmVyJiBwaG9uZV9udW1iZXIgPSBwZXJzb24ucGhvbmUoaik7CisKKyAgICAgIHN3aXRjaCAocGhvbmVfbnVtYmVyLnR5cGUoKSkgeworICAgICAgICBjYXNlIHR1dG9yaWFsOjpQZXJzb246Ok1PQklMRToKKyAgICAgICAgICBjb3V0IDw8ICIgIE1vYmlsZSBwaG9uZSAjOiAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHR1dG9yaWFsOjpQZXJzb246OkhPTUU6CisgICAgICAgICAgY291dCA8PCAiICBIb21lIHBob25lICM6ICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdHV0b3JpYWw6OlBlcnNvbjo6V09SSzoKKyAgICAgICAgICBjb3V0IDw8ICIgIFdvcmsgcGhvbmUgIzogIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgcGhvbmVfbnVtYmVyLm51bWJlcigpIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKy8vIE1haW4gZnVuY3Rpb246ICBSZWFkcyB0aGUgZW50aXJlIGFkZHJlc3MgYm9vayBmcm9tIGEgZmlsZSBhbmQgcHJpbnRzIGFsbAorLy8gICB0aGUgaW5mb3JtYXRpb24gaW5zaWRlLgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAvLyBWZXJpZnkgdGhhdCB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB0aGF0IHdlIGxpbmtlZCBhZ2FpbnN0IGlzCisgIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVycyB3ZSBjb21waWxlZCBhZ2FpbnN0LgorICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047CisKKyAgaWYgKGFyZ2MgIT0gMikgeworICAgIGNlcnIgPDwgIlVzYWdlOiAgIiA8PCBhcmd2WzBdIDw8ICIgQUREUkVTU19CT09LX0ZJTEUiIDw8IGVuZGw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgdHV0b3JpYWw6OkFkZHJlc3NCb29rIGFkZHJlc3NfYm9vazsKKworICB7CisgICAgLy8gUmVhZCB0aGUgZXhpc3RpbmcgYWRkcmVzcyBib29rLgorICAgIGZzdHJlYW0gaW5wdXQoYXJndlsxXSwgaW9zOjppbiB8IGlvczo6YmluYXJ5KTsKKyAgICBpZiAoIWFkZHJlc3NfYm9vay5QYXJzZUZyb21Jc3RyZWFtKCZpbnB1dCkpIHsKKyAgICAgIGNlcnIgPDwgIkZhaWxlZCB0byBwYXJzZSBhZGRyZXNzIGJvb2suIiA8PCBlbmRsOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIExpc3RQZW9wbGUoYWRkcmVzc19ib29rKTsKKworICAvLyBPcHRpb25hbDogIERlbGV0ZSBhbGwgZ2xvYmFsIG9iamVjdHMgYWxsb2NhdGVkIGJ5IGxpYnByb3RvYnVmLgorICBnb29nbGU6OnByb3RvYnVmOjpTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9leGFtcGxlcy9saXN0X3Blb3BsZS5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvbGlzdF9wZW9wbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjlmMzZiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZXhhbXBsZXMvbGlzdF9wZW9wbGUucHkKQEAgLTAsMCArMSwzOCBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisKKyMgU2VlIFJFQURNRS50eHQgZm9yIGluZm9ybWF0aW9uIGFuZCBidWlsZCBpbnN0cnVjdGlvbnMuCisKK2ltcG9ydCBhZGRyZXNzYm9va19wYjIKK2ltcG9ydCBzeXMKKworIyBJdGVyYXRlcyB0aG91Z2ggYWxsIHBlb3BsZSBpbiB0aGUgQWRkcmVzc0Jvb2sgYW5kIHByaW50cyBpbmZvIGFib3V0IHRoZW0uCitkZWYgTGlzdFBlb3BsZShhZGRyZXNzX2Jvb2spOgorICBmb3IgcGVyc29uIGluIGFkZHJlc3NfYm9vay5wZXJzb246CisgICAgcHJpbnQgIlBlcnNvbiBJRDoiLCBwZXJzb24uaWQKKyAgICBwcmludCAiICBOYW1lOiIsIHBlcnNvbi5uYW1lCisgICAgaWYgcGVyc29uLkhhc0ZpZWxkKCdlbWFpbCcpOgorICAgICAgcHJpbnQgIiAgRS1tYWlsIGFkZHJlc3M6IiwgcGVyc29uLmVtYWlsCisKKyAgICBmb3IgcGhvbmVfbnVtYmVyIGluIHBlcnNvbi5waG9uZToKKyAgICAgIGlmIHBob25lX251bWJlci50eXBlID09IGFkZHJlc3Nib29rX3BiMi5QZXJzb24uTU9CSUxFOgorICAgICAgICBwcmludCAiICBNb2JpbGUgcGhvbmUgIzoiLAorICAgICAgZWxpZiBwaG9uZV9udW1iZXIudHlwZSA9PSBhZGRyZXNzYm9va19wYjIuUGVyc29uLkhPTUU6CisgICAgICAgIHByaW50ICIgIEhvbWUgcGhvbmUgIzoiLAorICAgICAgZWxpZiBwaG9uZV9udW1iZXIudHlwZSA9PSBhZGRyZXNzYm9va19wYjIuUGVyc29uLldPUks6CisgICAgICAgIHByaW50ICIgIFdvcmsgcGhvbmUgIzoiLAorICAgICAgcHJpbnQgcGhvbmVfbnVtYmVyLm51bWJlcgorCisjIE1haW4gcHJvY2VkdXJlOiAgUmVhZHMgdGhlIGVudGlyZSBhZGRyZXNzIGJvb2sgZnJvbSBhIGZpbGUgYW5kIHByaW50cyBhbGwKKyMgICB0aGUgaW5mb3JtYXRpb24gaW5zaWRlLgoraWYgbGVuKHN5cy5hcmd2KSAhPSAyOgorICBwcmludCAiVXNhZ2U6Iiwgc3lzLmFyZ3ZbMF0sICJBRERSRVNTX0JPT0tfRklMRSIKKyAgc3lzLmV4aXQoLTEpCisKK2FkZHJlc3NfYm9vayA9IGFkZHJlc3Nib29rX3BiMi5BZGRyZXNzQm9vaygpCisKKyMgUmVhZCB0aGUgZXhpc3RpbmcgYWRkcmVzcyBib29rLgorZiA9IG9wZW4oc3lzLmFyZ3ZbMV0sICJyYiIpCithZGRyZXNzX2Jvb2suUGFyc2VGcm9tU3RyaW5nKGYucmVhZCgpKQorZi5jbG9zZSgpCisKK0xpc3RQZW9wbGUoYWRkcmVzc19ib29rKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9nZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9nZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3MjE5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2dlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKKyMgUnVuIHRoaXMgc2NyaXB0IHRvIHJlZ2VuZXJhdGUgZGVzY3JpcHRvci5wYi57aCxjY30gYWZ0ZXIgdGhlIHByb3RvY29sCisjIGNvbXBpbGVyIGNoYW5nZXMuICBTaW5jZSB0aGVzZSBmaWxlcyBhcmUgY29tcGlsZWQgaW50byB0aGUgcHJvdG9jb2wgY29tcGlsZXIKKyMgaXRzZWxmLCB0aGV5IGNhbm5vdCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhIG1ha2UgcnVsZS4gICJtYWtlIGNoZWNrIgorIyB3aWxsIGZhaWwgaWYgdGhlc2UgZmlsZXMgZG8gbm90IG1hdGNoIHdoYXQgdGhlIHByb3RvY29sIGNvbXBpbGVyIHdvdWxkCisjIGdlbmVyYXRlLgorIworIyBISU5UOiAgRmxhZ3MgcGFzc2VkIHRvIGdlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2ggd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkKKyMgICB0byBtYWtlIHdoZW4gYnVpbGRpbmcgcHJvdG9jLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBwYXNzaW5nCisjICAgLWo0IHRvIHJ1biA0IGpvYnMgc2ltdWx0YW5lb3VzbHkuCisKK2lmIHRlc3QgISAtZSBzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oOyB0aGVuCisgIGNhdCA+JjIgPDwgX19FT0ZfXworQ291bGQgbm90IGZpbmQgc291cmNlIGNvZGUuICBNYWtlIHN1cmUgeW91IGFyZSBydW5uaW5nIHRoaXMgc2NyaXB0IGZyb20gdGhlCityb290IG9mIHRoZSBkaXN0cmlidXRpb24gdHJlZS4KK19fRU9GX18KKyAgZXhpdCAxCitmaQorCitpZiB0ZXN0ICEgLWUgc3JjL01ha2VmaWxlOyB0aGVuCisgIGNhdCA+JjIgPDwgX19FT0ZfXworQ291bGQgbm90IGZpbmQgc3JjL01ha2VmaWxlLiAgWW91IG11c3QgcnVuIC4vY29uZmlndXJlIChhbmQgcGVyaGFwcworLi9hdXRvZ2VuLnNoKSBmaXJzdC4KK19fRU9GX18KKyAgZXhpdCAxCitmaQorCitjZCBzcmMKK21ha2UgJEAgcHJvdG9jICYmCisgIC4vcHJvdG9jIC0tY3BwX291dD1kbGxleHBvcnRfZGVjbD1MSUJQUk9UT0JVRl9FWFBPUlQ6LiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byAmJiBcCisgIC4vcHJvdG9jIC0tY3BwX291dD1kbGxleHBvcnRfZGVjbD1MSUJQUk9UT0NfRVhQT1JUOi4gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bworY2QgLi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvQ0hBTkdFUyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvQ0hBTkdFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE5MjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9DSEFOR0VTCkBAIC0wLDAgKzEsMTMwIEBACitDaGFuZ2VzIGZvciAxLjYuMDoKKworKiBOZXcgZmVhdHVyZTogQUREX0ZBSUxVUkVfQVQoKSBmb3IgcmVwb3J0aW5nIGEgdGVzdCBmYWlsdXJlIGF0IHRoZQorICBnaXZlbiBzb3VyY2UgbG9jYXRpb24gLS0gdXNlZnVsIGZvciB3cml0aW5nIHRlc3RpbmcgdXRpbGl0aWVzLgorKiBOZXcgZmVhdHVyZTogdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIGlzIG1vdmVkIGZyb20gR29vZ2xlIE1vY2sKKyAgdG8gR29vZ2xlIFRlc3QuCisqIE5ldyBmZWF0dXJlOiB0eXBlIHBhcmFtZXRlcnMgYW5kIHZhbHVlIHBhcmFtZXRlcnMgYXJlIHJlcG9ydGVkIGluCisgIHRoZSBYTUwgcmVwb3J0IG5vdy4KKyogQSBndGVzdF9kaXNhYmxlX3B0aHJlYWRzIENNYWtlIG9wdGlvbi4KKyogQ29sb3JlZCBvdXRwdXQgd29ya3MgaW4gR05VIFNjcmVlbiBzZXNzaW9ucyBub3cuCisqIFBhcmFtZXRlcnMgb2YgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgbm93IHByaW50ZWQgaW4gdGhlCisgIHRleHR1YWwgb3V0cHV0LgorKiBGYWlsdXJlcyBmcm9tIGFkIGhvYyB0ZXN0IGFzc2VydGlvbnMgcnVuIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgYXJlCisgIG5vdyBjb3JyZWN0bHkgcmVwb3J0ZWQuCisqIEFyZ3VtZW50cyBvZiBBU1NFUlRfWFkgYW5kIEVYUEVDVF9YWSBubyBsb25nZXIgbmVlZCB0byBzdXBwb3J0IDw8IHRvCisgIG9zdHJlYW0uCisqIE1vcmUgY29tcGxldGUgaGFuZGxpbmcgb2YgZXhjZXB0aW9ucy4KKyogR1RFU1RfQVNTRVJUX1hZIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQVNTRVJUX1hZIGluIGNhc2UgdGhlIGxhdHRlcgorICBuYW1lIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGxpYnJhcnkuCisqIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBpcyBub3cgdHJ1ZSBieSBkZWZhdWx0LCBhbGxvd2luZyBhIHRlc3QKKyAgcHJvZ3JhbSB0byBjb250aW51ZSBhZnRlciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorKiBWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZXMgY2FuIG5vdyBkZXJpdmUgZnJvbSBUZXN0IGFuZAorICBXaXRoUGFyYW1JbnRlcmZhY2U8VD4gc2VwYXJhdGVseSwgZWFzaW5nIGNvbnZlcnNpb24gb2YgbGVnYWN5IHRlc3RzLgorKiBEZWF0aCB0ZXN0IG1lc3NhZ2VzIGFyZSBjbGVhcmx5IG1hcmtlZCB0byBtYWtlIHRoZW0gbW9yZQorICBkaXN0aW5ndWlzaGFibGUgZnJvbSBvdGhlciBtZXNzYWdlcy4KKyogQ29tcGF0aWJpbGl0eSBmaXhlcyBmb3IgQW5kcm9pZCwgR29vZ2xlIE5hdGl2ZSBDbGllbnQsIE1pbkdXLCBIUCBVWCwKKyAgUG93ZXJQQywgTHVjaWQgYXV0b3Rvb2xzLCBsaWJDU3RkLCBTdW4gQysrLCBCb3JsYW5kIEMrKyBCdWlsZGVyIChDb2RlIEdlYXIpLAorICBJQk0gWEwgQysrIChWaXN1YWwgQWdlIEMrKyksIGFuZCBDKysweC4KKyogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisqIFBvdGVudGlhbGx5IGluY29tcGF0aWJsZSBjaGFuZ2VzOiBkaXNhYmxlcyB0aGUgaGFybWZ1bCAnbWFrZSBpbnN0YWxsJworICBjb21tYW5kIGluIGF1dG90b29scy4KKworQ2hhbmdlcyBmb3IgMS41LjA6CisKKyAqIE5ldyBmZWF0dXJlOiBhc3NlcnRpb25zIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGluIG11bHRpcGxlIHRocmVhZHMKKyAgIHdoZXJlIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4KKyAqIE5ldyBmZWF0dXJlOiBwcmVkaWNhdGVzIHVzZWQgaW5zaWRlIEVYUEVDVF9UUlVFKCkgYW5kIGZyaWVuZHMKKyAgIGNhbiBub3cgZ2VuZXJhdGUgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZXMuCisgKiBOZXcgZmVhdHVyZTogR29vZ2xlIFRlc3QgY2FuIG5vdyBiZSBjb21waWxlZCBhcyBhIERMTC4KKyAqIE5ldyBmZWF0dXJlOiBmdXNlZCBzb3VyY2UgZmlsZXMgYXJlIGluY2x1ZGVkLgorICogTmV3IGZlYXR1cmU6IHByaW50cyBoZWxwIHdoZW4gZW5jb3VudGVyaW5nIHVucmVjb2duaXplZCBHb29nbGUgVGVzdCBmbGFncy4KKyAqIEV4cGVyaW1lbnRhbCBmZWF0dXJlOiBDTWFrZSBidWlsZCBzY3JpcHQgKHJlcXVpcmVzIENNYWtlIDIuNi40KykuCisgKiBFeHBlcmltZW50YWwgZmVhdHVyZTogdGhlIFB1bXAgc2NyaXB0IGZvciBtZXRhIHByb2dyYW1taW5nLgorICogZG91YmxlIHZhbHVlcyBzdHJlYW1lZCB0byBhbiBhc3NlcnRpb24gYXJlIHByaW50ZWQgd2l0aCBlbm91Z2ggcHJlY2lzaW9uCisgICB0byBkaWZmZXJlbnRpYXRlIGFueSB0d28gZGlmZmVyZW50IHZhbHVlcy4KKyAqIEdvb2dsZSBUZXN0IG5vdyB3b3JrcyBvbiBTb2xhcmlzIGFuZCBBSVguCisgKiBCdWlsZCBhbmQgdGVzdCBzY3JpcHQgaW1wcm92ZW1lbnRzLgorICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKKyBQb3RlbnRpYWxseSBicmVha2luZyBjaGFuZ2VzOgorCisgKiBTdG9wcGVkIHN1cHBvcnRpbmcgVkMrKyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorICogRHJvcHBlZCBzdXBwb3J0IGZvciAnbWFrZSBpbnN0YWxsJy4KKworQ2hhbmdlcyBmb3IgMS40LjA6CisKKyAqIE5ldyBmZWF0dXJlOiB0aGUgZXZlbnQgbGlzdGVuZXIgQVBJCisgKiBOZXcgZmVhdHVyZTogdGVzdCBzaHVmZmxpbmcKKyAqIE5ldyBmZWF0dXJlOiB0aGUgWE1MIHJlcG9ydCBmb3JtYXQgaXMgY2xvc2VyIHRvIGp1bml0cmVwb3J0IGFuZCBjYW4KKyAgIGJlIHBhcnNlZCBieSBIdWRzb24gbm93LgorICogTmV3IGZlYXR1cmU6IHdoZW4gYSB0ZXN0IHJ1bnMgdW5kZXIgVmlzdWFsIFN0dWRpbywgaXRzIGZhaWx1cmVzIGFyZQorICAgaW50ZWdyYXRlZCBpbiB0aGUgSURFLgorICogTmV3IGZlYXR1cmU6IC9NRChkKSB2ZXJzaW9ucyBvZiBWQysrIHByb2plY3RzLgorICogTmV3IGZlYXR1cmU6IGVsYXBzZWQgdGltZSBmb3IgdGhlIHRlc3RzIGlzIHByaW50ZWQgYnkgZGVmYXVsdC4KKyAqIE5ldyBmZWF0dXJlOiBjb21lcyB3aXRoIGEgVFIxIHR1cGxlIGltcGxlbWVudGF0aW9uIHN1Y2ggdGhhdCBCb29zdAorICAgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgQ29tYmluZSgpLgorICogTmV3IGZlYXR1cmU6IEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgbWFjcm8gYW5kIGZyaWVuZHMuCisgKiBOZXcgZmVhdHVyZTogdGhlIFhjb2RlIHByb2plY3QgY2FuIG5vdyBwcm9kdWNlIHN0YXRpYyBndGVzdAorICAgbGlicmFyaWVzIGluIGFkZGl0aW9uIHRvIGEgZnJhbWV3b3JrLgorICogQ29tcGF0aWJpbGl0eSBmaXhlcyBmb3IgU29sYXJpcywgQ3lnd2luLCBtaW5HVywgV2luZG93cyBNb2JpbGUsCisgICBTeW1iaWFuLCBnY2MsIGFuZCBDKytCdWlsZGVyLgorICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKK0NoYW5nZXMgZm9yIDEuMy4wOgorCisgKiBOZXcgZmVhdHVyZTogZGVhdGggdGVzdHMgb24gV2luZG93cywgQ3lnd2luLCBhbmQgTWFjLgorICogTmV3IGZlYXR1cmU6IGFiaWxpdHkgdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4gb3RoZXIgdGVzdGluZworICAgZnJhbWV3b3Jrcy4KKyAqIE5ldyBmZWF0dXJlOiBhYmlsaXR5IHRvIHJ1biBkaXNhYmxlZCB0ZXN0IHZpYQorICAgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cy4KKyAqIE5ldyBmZWF0dXJlOiB0aGUgLS1oZWxwIGZsYWcgZm9yIHByaW50aW5nIHRoZSB1c2FnZS4KKyAqIE5ldyBmZWF0dXJlOiBhY2Nlc3MgdG8gR29vZ2xlIFRlc3QgZmxhZyB2YWx1ZXMgaW4gdXNlciBjb2RlLgorICogTmV3IGZlYXR1cmU6IGEgc2NyaXB0IHRoYXQgcGFja3MgR29vZ2xlIFRlc3QgaW50byBvbmUgLmggYW5kIG9uZQorICAgLmNjIGZpbGUgZm9yIGVhc3kgZGVwbG95bWVudC4KKyAqIE5ldyBmZWF0dXJlOiBzdXBwb3J0IGZvciBkaXN0cmlidXRpbmcgdGVzdCBmdW5jdGlvbnMgdG8gbXVsdGlwbGUKKyAgIG1hY2hpbmVzIChyZXF1aXJlcyBzdXBwb3J0IGZyb20gdGhlIHRlc3QgcnVubmVyKS4KKyAqIEJ1ZyBmaXhlcyBhbmQgaW1wbGVtZW50YXRpb24gY2xlYW4tdXBzLgorCitDaGFuZ2VzIGZvciAxLjIuMToKKworICogQ29tcGF0aWJpbGl0eSBmaXhlcyBmb3IgTGludXggSUEtNjQgYW5kIElCTSB6L09TLgorICogQWRkZWQgc3VwcG9ydCBmb3IgdXNpbmcgQm9vc3QgYW5kIG90aGVyIFRSMSBpbXBsZW1lbnRhdGlvbnMuCisgKiBDaGFuZ2VzIHRvIHRoZSBidWlsZCBzY3JpcHRzIHRvIHN1cHBvcnQgdXBjb21pbmcgcmVsZWFzZSBvZiBHb29nbGUgQysrCisgICBNb2NraW5nIEZyYW1ld29yay4KKyAqIEFkZGVkIE1ha2VmaWxlIHRvIHRoZSBkaXN0cmlidXRpb24gcGFja2FnZS4KKyAqIEltcHJvdmVkIGJ1aWxkIGluc3RydWN0aW9ucyBpbiBSRUFETUUuCisKK0NoYW5nZXMgZm9yIDEuMi4wOgorCisgKiBOZXcgZmVhdHVyZTogdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAqIE5ldyBmZWF0dXJlOiB0aGUgQVNTRVJUL0VYUEVDVF8oTk9OKUZBVEFMX0ZBSUxVUkUoX09OX0FMTF9USFJFQURTKQorICAgbWFjcm9zLgorICogQ2hhbmdlZCB0aGUgWE1MIHJlcG9ydCBmb3JtYXQgdG8gbWF0Y2ggSlVuaXQvQW50J3MuCisgKiBBZGRlZCB0ZXN0cyB0byB0aGUgWGNvZGUgcHJvamVjdC4KKyAqIEFkZGVkIHNjb25zL1NDb25zY3JpcHQgZm9yIGJ1aWxkaW5nIHdpdGggU0NvbnMuCisgKiBBZGRlZCBzcmMvZ3Rlc3QtYWxsLmNjIGZvciBidWlsZGluZyBHb29nbGUgVGVzdCBmcm9tIGEgc2luZ2xlIGZpbGUuCisgKiBGaXhlZCBjb21wYXRpYmlsaXR5IHdpdGggU29sYXJpcyBhbmQgei9PUy4KKyAqIEVuYWJsZWQgcnVubmluZyBQeXRob24gdGVzdHMgb24gc3lzdGVtcyB3aXRoIHB5dGhvbiAyLjMgaW5zdGFsbGVkLAorICAgZS5nLiBNYWMgT1MgWCAxMC40LgorICogQnVnIGZpeGVzLgorCitDaGFuZ2VzIGZvciAxLjEuMDoKKworICogTmV3IGZlYXR1cmU6IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAqIE5ldyBmZWF0dXJlOiBleGNlcHRpb24gYXNzZXJ0aW9ucy4KKyAqIE5ldyBmZWF0dXJlOiBwcmludGluZyBlbGFwc2VkIHRpbWUgb2YgdGVzdHMuCisgKiBJbXByb3ZlZCB0aGUgcm9idXN0bmVzcyBvZiBkZWF0aCB0ZXN0cy4KKyAqIEFkZGVkIGFuIFhjb2RlIHByb2plY3QgYW5kIHNhbXBsZXMuCisgKiBBZGp1c3RlZCB0aGUgb3V0cHV0IGZvcm1hdCBvbiBXaW5kb3dzIHRvIGJlIHVuZGVyc3RhbmRhYmxlIGJ5IFZpc3VhbCBTdHVkaW8uCisgKiBNaW5vciBidWcgZml4ZXMuCisKK0NoYW5nZXMgZm9yIDEuMC4xOgorCisgKiBBZGRlZCBwcm9qZWN0IGZpbGVzIGZvciBWaXN1YWwgU3R1ZGlvIDcuMS4KKyAqIEZpeGVkIGlzc3VlcyB3aXRoIGNvbXBpbGluZyBvbiBNYWMgT1MgWC4KKyAqIEZpeGVkIGlzc3VlcyB3aXRoIGNvbXBpbGluZyBvbiBDeWd3aW4uCisKK0NoYW5nZXMgZm9yIDEuMC4wOgorCisgKiBJbml0aWFsIE9wZW4gU291cmNlIHJlbGVhc2Ugb2YgR29vZ2xlIFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTI3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjUwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ01ha2UgYnVpbGQgc2NyaXB0IGZvciBHb29nbGUgVGVzdC4KKyMKKyMgVG8gcnVuIHRoZSB0ZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmIG9uIExpbnV4LCB1c2UgJ21ha2UgdGVzdCcgb3IKKyMgY3Rlc3QuICBZb3UgY2FuIHNlbGVjdCB3aGljaCB0ZXN0cyB0byBydW4gdXNpbmcgJ2N0ZXN0IC1SIHJlZ2V4Jy4KKyMgRm9yIG1vcmUgb3B0aW9ucywgcnVuICdjdGVzdCAtLWhlbHAnLgorCisjIEJVSUxEX1NIQVJFRF9MSUJTIGlzIGEgc3RhbmRhcmQgQ01ha2UgdmFyaWFibGUsIGJ1dCB3ZSBkZWNsYXJlIGl0IGhlcmUgdG8KKyMgbWFrZSBpdCBwcm9taW5lbnQgaW4gdGhlIEdVSS4KK29wdGlvbihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyAoRExMcykuIiBPRkYpCisKKyMgV2hlbiBvdGhlciBsaWJyYXJpZXMgYXJlIHVzaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgcnVudGltZSBsaWJyYXJpZXMsCisjIEdvb2dsZSBUZXN0IGFsc28gaGFzIHRvIHVzZSBvbmUuCitvcHRpb24oCisgIGd0ZXN0X2ZvcmNlX3NoYXJlZF9jcnQKKyAgIlVzZSBzaGFyZWQgKERMTCkgcnVuLXRpbWUgbGliIGV2ZW4gd2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBzdGF0aWMgbGliLiIKKyAgT0ZGKQorCitvcHRpb24oZ3Rlc3RfYnVpbGRfdGVzdHMgIkJ1aWxkIGFsbCBvZiBndGVzdCdzIG93biB0ZXN0cy4iIE9GRikKKworb3B0aW9uKGd0ZXN0X2J1aWxkX3NhbXBsZXMgIkJ1aWxkIGd0ZXN0J3Mgc2FtcGxlIHByb2dyYW1zLiIgT0ZGKQorCitvcHRpb24oZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcyAiRGlzYWJsZSB1c2VzIG9mIHB0aHJlYWRzIGluIGd0ZXN0LiIgT0ZGKQorCisjIERlZmluZXMgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkgYW5kIHNldF91cF9oZXJtZXRpY19idWlsZCgpLgoraW5jbHVkZShjbWFrZS9oZXJtZXRpY19idWlsZC5jbWFrZSBPUFRJT05BTCkKKworaWYgKENPTU1BTkQgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKQorICBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUHJvamVjdC13aWRlIHNldHRpbmdzCisKKyMgTmFtZSBvZiB0aGUgcHJvamVjdC4KKyMKKyMgQ01ha2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0IGNhbiByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5CisjIGFzICR7Z3Rlc3RfU09VUkNFX0RJUn0gYW5kIHRvIHRoZSByb290IGJpbmFyeSBkaXJlY3RvcnkgYXMKKyMgJHtndGVzdF9CSU5BUllfRElSfS4KKyMgTGFuZ3VhZ2UgIkMiIGlzIHJlcXVpcmVkIGZvciBmaW5kX3BhY2thZ2UoVGhyZWFkcykuCitwcm9qZWN0KGd0ZXN0IENYWCBDKQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNi4yKQorCitpZiAoQ09NTUFORCBzZXRfdXBfaGVybWV0aWNfYnVpbGQpCisgIHNldF91cF9oZXJtZXRpY19idWlsZCgpCitlbmRpZigpCisKKyMgRGVmaW5lIGhlbHBlciBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VkIGJ5IEdvb2dsZSBUZXN0LgoraW5jbHVkZShjbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZSkKKworY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIoKSAgIyBEZWZpbmVkIGluIGludGVybmFsX3V0aWxzLmNtYWtlLgorCisjIFdoZXJlIEdvb2dsZSBUZXN0J3MgLmggZmlsZXMgY2FuIGJlIGZvdW5kLgoraW5jbHVkZV9kaXJlY3RvcmllcygKKyAgJHtndGVzdF9TT1VSQ0VfRElSfS9pbmNsdWRlCisgICR7Z3Rlc3RfU09VUkNFX0RJUn0pCisKKyMgV2hlcmUgR29vZ2xlIFRlc3QncyBsaWJyYXJpZXMgY2FuIGJlIGZvdW5kLgorbGlua19kaXJlY3Rvcmllcygke2d0ZXN0X0JJTkFSWV9ESVJ9L3NyYykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERlZmluZXMgdGhlIGd0ZXN0ICYgZ3Rlc3RfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rCisjIHdpdGggb25lIG9mIHRoZW0uCisKKyMgR29vZ2xlIFRlc3QgbGlicmFyaWVzLiAgV2UgYnVpbGQgdGhlbSB1c2luZyBtb3JlIHN0cmljdCB3YXJuaW5ncyB0aGFuIHdoYXQKKyMgYXJlIHVzZWQgZm9yIG90aGVyIHRhcmdldHMsIHRvIGVuc3VyZSB0aGF0IGd0ZXN0IGNhbiBiZSBjb21waWxlZCBieSBhIHVzZXIKKyMgYWdncmVzc2l2ZSBhYm91dCB3YXJuaW5ncy4KK2N4eF9saWJyYXJ5KGd0ZXN0ICIke2N4eF9zdHJpY3R9IiBzcmMvZ3Rlc3QtYWxsLmNjKQorY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbiAiJHtjeHhfc3RyaWN0fSIgc3JjL2d0ZXN0X21haW4uY2MpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ3Rlc3RfbWFpbiBndGVzdCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNhbXBsZXMgb24gaG93IHRvIGxpbmsgdXNlciB0ZXN0cyB3aXRoIGd0ZXN0IG9yIGd0ZXN0X21haW4uCisjCisjIFRoZXkgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LiAgVG8gYnVpbGQgdGhlbSwgc2V0IHRoZQorIyBndGVzdF9idWlsZF9zYW1wbGVzIG9wdGlvbiB0byBPTi4gIFlvdSBjYW4gZG8gaXQgYnkgcnVubmluZyBjY21ha2UKKyMgb3Igc3BlY2lmeWluZyB0aGUgLURidWlsZF9ndGVzdF9zYW1wbGVzPU9OIGZsYWcgd2hlbiBydW5uaW5nIGNtYWtlLgorCitpZiAoZ3Rlc3RfYnVpbGRfc2FtcGxlcykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlMV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4gc2FtcGxlcy9zYW1wbGUxLmNjKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGUyX3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTIuY2MpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTNfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU0X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTQuY2MpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTVfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluIHNhbXBsZXMvc2FtcGxlMS5jYykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlNl91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4pCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTdfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU4X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbikKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlOV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0KQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGUxMF91bml0dGVzdCBzYW1wbGVzIGd0ZXN0KQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgR29vZ2xlIFRlc3QncyBvd24gdGVzdHMuCisjCisjIFlvdSBjYW4gc2tpcCB0aGlzIHNlY3Rpb24gaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRlc3RpbmcKKyMgR29vZ2xlIFRlc3QgaXRzZWxmLgorIworIyBUaGUgdGVzdHMgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LiAgVG8gYnVpbGQgdGhlbSwgc2V0IHRoZQorIyBndGVzdF9idWlsZF90ZXN0cyBvcHRpb24gdG8gT04uICBZb3UgY2FuIGRvIGl0IGJ5IHJ1bm5pbmcgY2NtYWtlCisjIG9yIHNwZWNpZnlpbmcgdGhlIC1EZ3Rlc3RfYnVpbGRfdGVzdHM9T04gZmxhZyB3aGVuIHJ1bm5pbmcgY21ha2UuCisKK2lmIChndGVzdF9idWlsZF90ZXN0cykKKyAgIyBUaGlzIG11c3QgYmUgc2V0IGluIHRoZSByb290IGRpcmVjdG9yeSBmb3IgdGhlIHRlc3RzIHRvIGJlIHJ1biBieQorICAjICdtYWtlIHRlc3QnIG9yIGN0ZXN0LgorICBlbmFibGVfdGVzdGluZygpCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggc3RhbmRhcmQgY29tcGlsZXIgZmxhZ3MuCisKKyAgY3h4X3Rlc3QoZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X2Vudmlyb25tZW50X3Rlc3QgZ3Rlc3QpCisgIGN4eF90ZXN0KGd0ZXN0LWZpbGVwYXRoX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtbGlua2VkX3B0cl90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0LWxpc3RlbmVyX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfbWFpbl91bml0dGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC1tZXNzYWdlX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3Qtb3B0aW9uc190ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0LXBhcmFtLXRlc3RfdGVzdCBndGVzdAorICAgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYykKKyAgY3h4X3Rlc3QoZ3Rlc3QtcG9ydF90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3ByZWRfaW1wbF91bml0dGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC1wcmludGVyc190ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3Byb2RfdGVzdCBndGVzdF9tYWluCisgICAgdGVzdC9wcm9kdWN0aW9uLmNjKQorICBjeHhfdGVzdChndGVzdF9yZXBlYXRfdGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF9zdHJlc3NfdGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdC10eXBlZC10ZXN0X3Rlc3QgZ3Rlc3RfbWFpbgorICAgIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYykKKyAgY3h4X3Rlc3QoZ3Rlc3RfdW5pdHRlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QgZ3Rlc3QpCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggbm9uLXN0YW5kYXJkIGNvbXBpbGVyIGZsYWdzLgorCisgICMgTVNWQyA3LjEgZG9lcyBub3Qgc3VwcG9ydCBTVEwgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIEdSRUFURVIgMTMxMCkKKyAgICBjeHhfbGlicmFyeShndGVzdF9ub19leGNlcHRpb24gIiR7Y3h4X25vX2V4Y2VwdGlvbn0iCisgICAgICBzcmMvZ3Rlc3QtYWxsLmNjKQorICAgIGN4eF9saWJyYXJ5KGd0ZXN0X21haW5fbm9fZXhjZXB0aW9uICIke2N4eF9ub19leGNlcHRpb259IgorICAgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKKyAgZW5kaWYoKQorICBjeHhfbGlicmFyeShndGVzdF9tYWluX25vX3J0dGkgIiR7Y3h4X25vX3J0dGl9IgorICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCisKKyAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdC1kZWF0aC10ZXN0X2V4X25vY2F0Y2hfdGVzdAorICAgICIke2N4eF9leGNlcHRpb259IC1ER1RFU1RfRU5BQkxFX0NBVENIX0VYQ0VQVElPTlNfPTAiCisgICAgZ3Rlc3QgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MpCisgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3QtZGVhdGgtdGVzdF9leF9jYXRjaF90ZXN0CisgICAgIiR7Y3h4X2V4Y2VwdGlvbn0gLURHVEVTVF9FTkFCTEVfQ0FUQ0hfRVhDRVBUSU9OU189MSIKKyAgICBndGVzdCB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYykKKworICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0X25vX3J0dGlfdW5pdHRlc3QgIiR7Y3h4X25vX3J0dGl9IgorICAgIGd0ZXN0X21haW5fbm9fcnR0aSB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjKQorCisgIGN4eF9zaGFyZWRfbGlicmFyeShndGVzdF9kbGwgIiR7Y3h4X2RlZmF1bHR9IgorICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCisKKyAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyhndGVzdF9kbGxfdGVzdF8gIiR7Y3h4X2RlZmF1bHR9IgorICAgIGd0ZXN0X2RsbCB0ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ3Rlc3RfZGxsX3Rlc3RfCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MSIpCisKKyAgaWYgKE5PVCBNU1ZDIE9SIE5PVCBNU1ZDX1ZFUlNJT04gRVFVQUwgMTYwMCkKKyAgICAjIFRoZSBDKysgU3RhbmRhcmQgc3BlY2lmaWVzIHR1cGxlX2VsZW1lbnQ8aW50LCBjbGFzcz4uCisgICAgIyBZZXQgTVNWQyAxMCdzIDx1dGlsaXR5PiBkZWNsYXJlcyB0dXBsZV9lbGVtZW50PHNpemVfdCwgY2xhc3M+LgorICAgICMgVGhhdCBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2l0aCBvdXIgb3duIHN0YW5kYXJkLWNvbmZvcm1pbmcKKyAgICAjIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgVGhlcmVmb3JlIHVzaW5nIG91ciBvd24gdHVwbGUgd2l0aAorICAgICMgTVNWQyAxMCBkb2Vzbid0IGNvbXBpbGUuCisgICAgY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbl91c2Vfb3duX3R1cGxlICIke2N4eF91c2Vfb3duX3R1cGxlfSIKKyAgICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCisKKyAgICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0LXR1cGxlX3Rlc3QgIiR7Y3h4X3VzZV9vd25fdHVwbGV9IgorICAgICAgZ3Rlc3RfbWFpbl91c2Vfb3duX3R1cGxlIHRlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYykKKworICAgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3RfdXNlX293bl90dXBsZV90ZXN0ICIke2N4eF91c2Vfb3duX3R1cGxlfSIKKyAgICAgIGd0ZXN0X21haW5fdXNlX293bl90dXBsZQorICAgICAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjKQorICBlbmRpZigpCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgUHl0aG9uIHRlc3RzLgorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdCkKKworICAjIE1TVkMgNy4xIGRvZXMgbm90IHN1cHBvcnQgU1RMIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZC4KKyAgaWYgKE5PVCBNU1ZDIE9SIE1TVkNfVkVSU0lPTiBHUkVBVEVSIDEzMTApCisgICAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygKKyAgICAgIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfbm9fZXhfdGVzdF8KKyAgICAgICIke2N4eF9ub19leGNlcHRpb259IgorICAgICAgZ3Rlc3RfbWFpbl9ub19leGNlcHRpb24KKyAgICAgIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0Xy5jYykKKyAgZW5kaWYoKQorCisgIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MoCisgICAgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XworICAgICIke2N4eF9leGNlcHRpb259IgorICAgIGd0ZXN0X21haW4KKyAgICB0ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MpCisgIHB5X3Rlc3QoZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2NvbG9yX3Rlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfY29sb3JfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9lbnZfdmFyX3Rlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfZW52X3Zhcl90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9maWx0ZXJfdW5pdHRlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfaGVscF90ZXN0XyB0ZXN0IGd0ZXN0X21haW4pCisgIHB5X3Rlc3QoZ3Rlc3RfaGVscF90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9vdXRwdXRfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9vdXRwdXRfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9zaHVmZmxlX3Rlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3Rfc2h1ZmZsZV90ZXN0KQorCisgICMgTVNWQyA3LjEgZG9lcyBub3Qgc3VwcG9ydCBTVEwgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIEdSRUFURVIgMTMxMCkKKyAgICBjeHhfZXhlY3V0YWJsZShndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfIHRlc3QgZ3Rlc3Rfbm9fZXhjZXB0aW9uKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfCisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0ZMQUdTICIke2N4eF9ub19leGNlcHRpb259IikKKyAgICBweV90ZXN0KGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdCkKKyAgZW5kaWYoKQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF91bmluaXRpYWxpemVkX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgcHlfdGVzdChndGVzdF94bWxfb3V0ZmlsZXNfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L0NPTlRSSUJVVE9SUyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvQ09OVFJJQlVUT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWUyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L0NPTlRSSUJVVE9SUwpAQCAtMCwwICsxLDM3IEBACisjIFRoaXMgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgcGVvcGxlIHdobyd2ZSBtYWRlIG5vbi10cml2aWFsCisjIGNvbnRyaWJ1dGlvbiB0byB0aGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBwcm9qZWN0LiAgUGVvcGxlCisjIHdobyBjb21taXQgY29kZSB0byB0aGUgcHJvamVjdCBhcmUgZW5jb3VyYWdlZCB0byBhZGQgdGhlaXIgbmFtZXMKKyMgaGVyZS4gIFBsZWFzZSBrZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBmaXJzdCBuYW1lcy4KKworQWpheSBKb3NoaSA8amFqQGdvb2dsZS5jb20+CitCYWzDoXpzIETDoW4gPGJhbGF6cy5kYW5AZ21haWwuY29tPgorQmhhcmF0IE1lZGlyYXR0YSA8YmhhcmF0QG1lbmFsdG8uY29tPgorQ2hhbmRsZXIgQ2FycnV0aCA8Y2hhbmRsZXJjQGdvb2dsZS5jb20+CitDaHJpcyBQcmluY2UgPGNwcmluY2VAZ29vZ2xlLmNvbT4KK0NocmlzIFRheWxvciA8dGF5bG9yY0Bnb29nbGUuY29tPgorRGFuIEVnbm9yIDxlZ25vckBnb29nbGUuY29tPgorRXJpYyBSb21hbiA8ZXJvbWFuQGNocm9taXVtLm9yZz4KK0hhZHkgWmFsZWsgPGhhZHkuemFsZWtAZ21haWwuY29tPgorSmVmZnJleSBZYXNza2luIDxqeWFzc2tpbkBnb29nbGUuY29tPgorSsOzaSBTaWd1csOwc3NvbiA8am9pQGdvb2dsZS5jb20+CitLZWlyIE1pZXJsZSA8bWllcmxlQGdtYWlsLmNvbT4KK0tlaXRoIFJheSA8a2VpdGgucmF5QGdtYWlsLmNvbT4KK0tlbnRvbiBWYXJkYSA8a2VudG9uQGdvb2dsZS5jb20+CitNYW51ZWwgS2xpbWVrIDxrbGltZWtAZ29vZ2xlLmNvbT4KK01hcmt1cyBIZXVsZSA8bWFya3VzLmhldWxlQGdtYWlsLmNvbT4KK01pa2EgUmFlbnRvIDxtaWtpZUBpa2kuZmk+CitNaWtsw7NzIEZhemVrYXMgPG1mYXpla2FzQHN6ZW1hZm9yLmNvbT4KK1Bhc2kgVmFsbWluZW4gPHBhc2kudmFsbWluZW5AZ21haWwuY29tPgorUGF0cmljayBIYW5uYSA8cGhhbm5hQGdvb2dsZS5jb20+CitQYXRyaWNrIFJpbGV5IDxwZnJAZ29vZ2xlLmNvbT4KK1BldGVyIEthbWluc2tpIDxwaW90cmtAZ29vZ2xlLmNvbT4KK1ByZXN0b24gSmFja3NvbiA8cHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tPgorUmFpbmVyIEtsYWZmZW5ib2VjayA8cmFpbmVyLmtsYWZmZW5ib2Vja0BkeW5hdHJhY2UuY29tPgorUnVzcyBDb3ggPHJzY0Bnb29nbGUuY29tPgorUnVzcyBSdWZlciA8cnVzc0BwZW50YWQuY29tPgorU2VhbiBNY2FmZWUgPGVlZmFjbUBnbWFpbC5jb20+CitTaWd1csOwdXIgw4FzZ2VpcnNzb24gPHNpZ2dpQGdvb2dsZS5jb20+CitUcmFjeSBCaWFsaWsgPHRyYWN5QHBlbnRhZC5jb20+CitWYWRpbSBCZXJtYW4gPHZhZGltYkBnb29nbGUuY29tPgorVmxhZCBMb3NldiA8dmxhZGxAZ29vZ2xlLmNvbT4KK1poYW55b25nIFdhbiA8d2FuQGdvb2dsZS5jb20+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L0xJQ0VOU0UgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0MWExMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvTElDRU5TRQpAQCAtMCwwICsxLDI4IEBACitDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgoraW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODhjNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwNSBAQAorIyBBdXRvbWFrZSBmaWxlCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CisKKyMgTm9uc3RhbmRhcmQgcGFja2FnZSBmaWxlcyBmb3IgZGlzdHJpYnV0aW9uCitFWFRSQV9ESVNUID0gXAorICBDSEFOR0VTIFwKKyAgQ09OVFJJQlVUT1JTIFwKKyAgTElDRU5TRSBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAgXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wIFwKKyAgbWFrZS9NYWtlZmlsZSBcCisgIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSBcCisgIHNjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSBcCisgIHNjcmlwdHMvcHVtcC5weSBcCisgIHNjcmlwdHMvdGVzdC9NYWtlZmlsZQorCisjIGd0ZXN0IHNvdXJjZSBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgZGlyZWN0bHkuICBUaGV5IGFyZQorIyAjaW5jbHVkZWQgYnkgZ3Rlc3QtYWxsLmNjLgorR1RFU1RfU1JDID0gXAorICBzcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBcCisgIHNyYy9ndGVzdC1maWxlcGF0aC5jYyBcCisgIHNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCBcCisgIHNyYy9ndGVzdC1wb3J0LmNjIFwKKyAgc3JjL2d0ZXN0LXByaW50ZXJzLmNjIFwKKyAgc3JjL2d0ZXN0LXRlc3QtcGFydC5jYyBcCisgIHNyYy9ndGVzdC10eXBlZC10ZXN0LmNjIFwKKyAgc3JjL2d0ZXN0LmNjCisKK0VYVFJBX0RJU1QgKz0gJChHVEVTVF9TUkMpCisKKyMgU2FtcGxlIGZpbGVzIHRoYXQgd2UgZG9uJ3QgY29tcGlsZS4KK0VYVFJBX0RJU1QgKz0gXAorICBzYW1wbGVzL3ByaW1lX3RhYmxlcy5oIFwKKyAgc2FtcGxlcy9zYW1wbGUyX3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjCisKKyMgQysrIHRlc3QgZmlsZXMgdGhhdCB3ZSBkb24ndCBjb21waWxlIGRpcmVjdGx5LgorRVhUUkFfRElTVCArPSBcCisgIHRlc3QvZ3Rlc3QtZGVhdGgtdGVzdF9leF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtbGlzdGVuZXJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1vcHRpb25zX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaCBcCisgIHRlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1wcmludGVyc190ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10ZXN0LXBhcnRfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCBcCisgIHRlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9jb2xvcl90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X291dHB1dF90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9zdHJlc3NfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMV90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYyBcCisgIHRlc3QvcHJvZHVjdGlvbi5jYyBcCisgIHRlc3QvcHJvZHVjdGlvbi5oCisKKyMgUHl0aG9uIHRlc3RzIHRoYXQgd2UgZG9uJ3QgcnVuLgorRVhUUkFfRElTVCArPSBcCisgIHRlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfaGVscF90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9vdXRwdXRfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQgXAorICB0ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfdGVzdF91dGlscy5weSBcCisgIHRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRmaWxlc190ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF94bWxfdGVzdF91dGlscy5weQorCisjIENNYWtlIHNjcmlwdAorRVhUUkFfRElTVCArPSBcCisgIENNYWtlTGlzdHMudHh0IFwKKyAgY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKKworIyBNU1ZDIHByb2plY3QgZmlsZXMKK0VYVFJBX0RJU1QgKz0gXAorICBtc3ZjL2d0ZXN0LW1kLnNsbiBcCisgIG1zdmMvZ3Rlc3QtbWQudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdC5zbG4gXAorICBtc3ZjL2d0ZXN0LnZjcHJvaiBcCisgIG1zdmMvZ3Rlc3RfbWFpbi1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X21haW4udmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF9wcm9kX3Rlc3QtbWQudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF91bml0dGVzdC1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvagorCisjIHhjb2RlIHByb2plY3QgZmlsZXMKK0VYVFJBX0RJU1QgKz0gXAorICB4Y29kZS9Db25maWcvRGVidWdQcm9qZWN0LnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL0ZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyBcCisgIHhjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL1JlbGVhc2VQcm9qZWN0LnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvVGVzdFRhcmdldC54Y2NvbmZpZyBcCisgIHhjb2RlL1Jlc291cmNlcy9JbmZvLnBsaXN0IFwKKyAgeGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaCBcCisgIHhjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IFwKKyAgeGNvZGUvZ3Rlc3QueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorCisjIHhjb2RlIHNhbXBsZSBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL0luZm8ucGxpc3QgXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3J1bnRlc3RzLnNoIFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmNjIFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmggXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXRfdGVzdC5jYworCisjIEMrK0J1aWxkZXIgcHJvamVjdCBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIGNvZGVnZWFyL2d0ZXN0LmNicHJvaiBcCisgIGNvZGVnZWFyL2d0ZXN0Lmdyb3VwcHJvaiBcCisgIGNvZGVnZWFyL2d0ZXN0X2FsbC5jYyBcCisgIGNvZGVnZWFyL2d0ZXN0X2xpbmsuY2MgXAorICBjb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvaiBcCisgIGNvZGVnZWFyL2d0ZXN0X3VuaXR0ZXN0LmNicHJvagorCisjIERpc3RyaWJ1dGUgYW5kIGluc3RhbGwgTTQgbWFjcm8KK200ZGF0YWRpciA9ICQoZGF0YWRpcikvYWNsb2NhbAorbTRkYXRhX0RBVEEgPSBtNC9ndGVzdC5tNAorRVhUUkFfRElTVCArPSAkKG00ZGF0YV9EQVRBKQorCisjIFdlIGRlZmluZSB0aGUgZ2xvYmFsIEFNX0NQUEZMQUdTIGFzIGV2ZXJ5dGhpbmcgd2UgY29tcGlsZSBpbmNsdWRlcyBmcm9tIHRoZXNlCisjIGRpcmVjdG9yaWVzLgorQU1fQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS9pbmNsdWRlCisKKyMgTW9kaWZpZXMgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyBmb3IgcHRocmVhZHMgY29tcGF0aWJpbGl0eS4KK2lmIEhBVkVfUFRIUkVBRFMKKyAgQU1fQ1hYRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NAIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MQorICBBTV9MSUJTID0gQFBUSFJFQURfTElCU0AKK2Vsc2UKKyAgQU1fQ1hYRkxBR1MgPSAtREdURVNUX0hBU19QVEhSRUFEPTAKK2VuZGlmCisKKyMgQnVpbGQgcnVsZXMgZm9yIGxpYnJhcmllcy4KK2xpYl9MVExJQlJBUklFUyA9IGxpYi9saWJndGVzdC5sYSBsaWIvbGliZ3Rlc3RfbWFpbi5sYQorCitsaWJfbGliZ3Rlc3RfbGFfU09VUkNFUyA9IHNyYy9ndGVzdC1hbGwuY2MKKworcGtnaW5jbHVkZV9IRUFERVJTID0gXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCisKK3BrZ2luY2x1ZGVfaW50ZXJuYWxkaXIgPSAkKHBrZ2luY2x1ZGVkaXIpL2ludGVybmFsCitwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMgPSBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKKworbGliX2xpYmd0ZXN0X21haW5fbGFfU09VUkNFUyA9IHNyYy9ndGVzdF9tYWluLmNjCitsaWJfbGliZ3Rlc3RfbWFpbl9sYV9MSUJBREQgPSBsaWIvbGliZ3Rlc3QubGEKKworIyBCdWxpZCBydWxlcyBmb3Igc2FtcGxlcyBhbmQgdGVzdHMuIEF1dG9tYWtlJ3MgbmFtaW5nIGZvciBzb21lIG9mCisjIHRoZXNlIHZhcmlhYmxlcyBpc24ndCB0ZXJyaWJseSBvYnZpb3VzLCBzbyB0aGlzIGlzIGEgYnJpZWYKKyMgcmVmZXJlbmNlOgorIworIyBURVNUUyAtLSBQcm9ncmFtcyBydW4gYXV0b21hdGljYWxseSBieSAibWFrZSBjaGVjayIKKyMgY2hlY2tfUFJPR1JBTVMgLS0gUHJvZ3JhbXMgYnVpbHQgYnkgIm1ha2UgY2hlY2siIGJ1dCBub3QgbmVjZXNzYXJpbHkgcnVuCisKK25vaW5zdF9MVExJQlJBUklFUyA9IHNhbXBsZXMvbGlic2FtcGxlcy5sYQorCitzYW1wbGVzX2xpYnNhbXBsZXNfbGFfU09VUkNFUyA9IFwKKyAgc2FtcGxlcy9zYW1wbGUxLmNjIFwKKyAgc2FtcGxlcy9zYW1wbGUxLmggXAorICBzYW1wbGVzL3NhbXBsZTIuY2MgXAorICBzYW1wbGVzL3NhbXBsZTIuaCBcCisgIHNhbXBsZXMvc2FtcGxlMy1pbmwuaCBcCisgIHNhbXBsZXMvc2FtcGxlNC5jYyBcCisgIHNhbXBsZXMvc2FtcGxlNC5oCisKK1RFU1RTPQorVEVTVFNfRU5WSVJPTk1FTlQgPSBHVEVTVF9TT1VSQ0VfRElSPSIkKHNyY2RpcikvdGVzdCIgXAorICAgICAgICAgICAgICAgICAgICBHVEVTVF9CVUlMRF9ESVI9IiQodG9wX2J1aWxkZGlyKS90ZXN0IgorY2hlY2tfUFJPR1JBTVM9CisKKyMgQSBzaW1wbGUgc2FtcGxlIG9uIHVzaW5nIGd0ZXN0LgorVEVTVFMgKz0gc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0CitjaGVja19QUk9HUkFNUyArPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QKK3NhbXBsZXNfc2FtcGxlMV91bml0dGVzdF9TT1VSQ0VTID0gc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjCitzYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfTERBREQgPSBsaWIvbGliZ3Rlc3RfbWFpbi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWIvbGliZ3Rlc3QubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcy9saWJzYW1wbGVzLmxhCisKKyMgQW5vdGhlciBzYW1wbGUuICBJdCBhbHNvIHZlcmlmaWVzIHRoYXQgbGliZ3Rlc3Qgd29ya3MuCitURVNUUyArPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0CitjaGVja19QUk9HUkFNUyArPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0CitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X1NPVVJDRVMgPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0LmxhCisKKyMgVGhpcyB0ZXN0cyBtb3N0IGNvbnN0cnVjdHMgb2YgZ3Rlc3QgYW5kIHZlcmlmaWVzIHRoYXQgbGliZ3Rlc3RfbWFpbgorIyBhbmQgbGliZ3Rlc3Qgd29yay4KK1RFU1RTICs9IHRlc3QvZ3Rlc3RfYWxsX3Rlc3QKK2NoZWNrX1BST0dSQU1TICs9IHRlc3QvZ3Rlc3RfYWxsX3Rlc3QKK3Rlc3RfZ3Rlc3RfYWxsX3Rlc3RfU09VUkNFUyA9IHRlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MKK3Rlc3RfZ3Rlc3RfYWxsX3Rlc3RfTERBREQgPSBsaWIvbGliZ3Rlc3RfbWFpbi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliL2xpYmd0ZXN0LmxhCisKKyMgVGVzdHMgdGhhdCBmdXNlZCBndGVzdCBmaWxlcyBjb21waWxlIGFuZCB3b3JrLgorRlVTRURfR1RFU1RfU1JDID0gXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjIFwKKyAgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmggXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYworCitpZiBIQVZFX1BZVEhPTgorVEVTVFMgKz0gdGVzdC9mdXNlZF9ndGVzdF90ZXN0CitjaGVja19QUk9HUkFNUyArPSB0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QKK3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9TT1VSQ0VTID0gJChGVVNFRF9HVEVTVF9TUkMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcy9zYW1wbGUxLmNjIHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwordGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTID0gLUkiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKworIyBCdWlsZCBydWxlcyBmb3IgcHV0dGluZyBmdXNlZCBHb29nbGUgVGVzdCBmaWxlcyBpbnRvIHRoZSBkaXN0cmlidXRpb24KKyMgcGFja2FnZS4gVGhlIHVzZXIgY2FuIGFsc28gY3JlYXRlIHRob3NlIGZpbGVzIGJ5IG1hbnVhbGx5IHJ1bm5pbmcKKyMgc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5LgorJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFUyk6IGZ1c2VkLWd0ZXN0CisKK2Z1c2VkLWd0ZXN0OiAkKHBrZ2luY2x1ZGVfSEVBREVSUykgJChwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMpIFwKKyAgICAgICAgICAgICAkKEdURVNUX1NSQykgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYyBcCisgICAgICAgICAgICAgc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5CisJbWtkaXIgLXAgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCisJY2htb2QgLVIgdSt3ICIkKHNyY2RpcikvZnVzZWQtc3JjIgorCXJtIC1mICIkKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyIKKwlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC5oIgorCSIkKHNyY2Rpcikvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5IiAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKwljcCAtZiAiJChzcmNkaXIpL3NyYy9ndGVzdF9tYWluLmNjIiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC8iCisKK21haW50YWluZXItY2xlYW4tbG9jYWw6CisJcm0gLXJmICIkKHNyY2RpcikvZnVzZWQtc3JjIgorZW5kaWYKKworIyBEZWF0aCB0ZXN0cyBtYXkgcHJvZHVjZSBjb3JlIGR1bXBzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuIEluIGNhc2UKKyMgdGhpcyBoYXBwZW5zLCBjbGVhbiB0aGVtIHRvIGtlZXAgZGlzdGNsZWFuY2hlY2sgaGFwcHkuCitDTEVBTkZJTEVTID0gY29yZQorCisjIERpc2FibGVzICdtYWtlIGluc3RhbGwnIGFzIGluc3RhbGxpbmcgYSBjb21waWxlZCB2ZXJzaW9uIG9mIEdvb2dsZQorIyBUZXN0IGNhbiBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvciBkdWUgdG8gdmlvbGF0aW9uIG9mIHRoZQorIyBPbmUtRGVmaW5pdGlvbiBSdWxlLgorCitpbnN0YWxsLWV4ZWMtbG9jYWw6CisJZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0IGludG8geW91ciBidWlsZCBzeXN0ZW0uIgorCWZhbHNlCisKK2luc3RhbGwtZGF0YS1sb2NhbDoKKwllY2hvICInbWFrZSBpbnN0YWxsJyBpcyBkYW5nZXJvdXMgYW5kIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIHNlZSBSRUFETUUgZm9yIGhvdyB0byBpbnRlZ3JhdGUgR29vZ2xlIFRlc3QgaW50byB5b3VyIGJ1aWxkIHN5c3RlbS4iCisJZmFsc2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvTWFrZWZpbGUuaW4gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDkzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTM2MCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4zIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIEF1dG9tYWtlIGZpbGUKKworCisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK1RFU1RTID0gc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0JChFWEVFWFQpIFwKKwlzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0JChFWEVFWFQpIFwKKwl0ZXN0L2d0ZXN0X2FsbF90ZXN0JChFWEVFWFQpICQoYW1fX0VYRUVYVF8xKQorY2hlY2tfUFJPR1JBTVMgPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QkKEVYRUVYVCkgXAorCXNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QkKEVYRUVYVCkgXAorCXRlc3QvZ3Rlc3RfYWxsX3Rlc3QkKEVYRUVYVCkgJChhbV9fRVhFRVhUXzEpCitASEFWRV9QWVRIT05fVFJVRUBhbV9fYXBwZW5kXzEgPSB0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QKK0BIQVZFX1BZVEhPTl9UUlVFQGFtX19hcHBlbmRfMiA9IHRlc3QvZnVzZWRfZ3Rlc3RfdGVzdAorc3ViZGlyID0gLgorRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQocGtnaW5jbHVkZV9IRUFERVJTKSBcCisJJChwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCisJJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX3NyY2RpcikvYnVpbGQtYXV4L2NvbmZpZy5oLmluIFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKHRvcF9zcmNkaXIpL3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluIFwKKwlidWlsZC1hdXgvY29uZmlnLmd1ZXNzIGJ1aWxkLWF1eC9jb25maWcuc3ViIGJ1aWxkLWF1eC9kZXBjb21wIFwKKwlidWlsZC1hdXgvaW5zdGFsbC1zaCBidWlsZC1hdXgvbHRtYWluLnNoIGJ1aWxkLWF1eC9taXNzaW5nCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCAkKHRvcF9zcmNkaXIpL200L2x0c3VnYXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00ICQodG9wX3NyY2RpcikvbTQvbHR+b2Jzb2xldGUubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYWN4X3B0aHJlYWQubTQgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKKyBjb25maWd1cmUubGluZW5vIGNvbmZpZy5zdGF0dXMubGluZW5vCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9idWlsZC1hdXgvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9IHNjcmlwdHMvZ3Rlc3QtY29uZmlnCitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAorICB0ZXN0IC16ICIkJGZpbGVzIiBcCisgICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCisgICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAorICB9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKG00ZGF0YWRpcikiIFwKKwkiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikiIFwKKwkiJChERVNURElSKSQocGtnaW5jbHVkZV9pbnRlcm5hbGRpcikiCitMVExJQlJBUklFUyA9ICQobGliX0xUTElCUkFSSUVTKSAkKG5vaW5zdF9MVExJQlJBUklFUykKK2xpYl9saWJndGVzdF9sYV9MSUJBREQgPQorYW1fX2RpcnN0YW1wID0gJChhbV9fbGVhZGluZ19kb3QpZGlyc3RhbXAKK2FtX2xpYl9saWJndGVzdF9sYV9PQkpFQ1RTID0gc3JjL2d0ZXN0LWFsbC5sbworbGliX2xpYmd0ZXN0X2xhX09CSkVDVFMgPSAkKGFtX2xpYl9saWJndGVzdF9sYV9PQkpFQ1RTKQorbGliX2xpYmd0ZXN0X21haW5fbGFfREVQRU5ERU5DSUVTID0gbGliL2xpYmd0ZXN0LmxhCithbV9saWJfbGliZ3Rlc3RfbWFpbl9sYV9PQkpFQ1RTID0gc3JjL2d0ZXN0X21haW4ubG8KK2xpYl9saWJndGVzdF9tYWluX2xhX09CSkVDVFMgPSAkKGFtX2xpYl9saWJndGVzdF9tYWluX2xhX09CSkVDVFMpCitzYW1wbGVzX2xpYnNhbXBsZXNfbGFfTElCQUREID0KK2FtX3NhbXBsZXNfbGlic2FtcGxlc19sYV9PQkpFQ1RTID0gc2FtcGxlcy9zYW1wbGUxLmxvIFwKKwlzYW1wbGVzL3NhbXBsZTIubG8gc2FtcGxlcy9zYW1wbGU0LmxvCitzYW1wbGVzX2xpYnNhbXBsZXNfbGFfT0JKRUNUUyA9ICQoYW1fc2FtcGxlc19saWJzYW1wbGVzX2xhX09CSkVDVFMpCitASEFWRV9QWVRIT05fVFJVRUBhbV9fRVhFRVhUXzEgPSB0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QkKEVYRUVYVCkKK2FtX3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfT0JKRUNUUyA9ICBcCisJc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC4kKE9CSkVYVCkKK3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfT0JKRUNUUyA9ICBcCisJJChhbV9zYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X09CSkVDVFMpCitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X0RFUEVOREVOQ0lFUyA9IGxpYi9saWJndGVzdC5sYQorYW1fc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X09CSkVDVFMgPSAgXAorCXNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC4kKE9CSkVYVCkKK3NhbXBsZXNfc2FtcGxlMV91bml0dGVzdF9PQkpFQ1RTID0gIFwKKwkkKGFtX3NhbXBsZXNfc2FtcGxlMV91bml0dGVzdF9PQkpFQ1RTKQorc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0RFUEVOREVOQ0lFUyA9IGxpYi9saWJndGVzdF9tYWluLmxhIFwKKwlsaWIvbGliZ3Rlc3QubGEgc2FtcGxlcy9saWJzYW1wbGVzLmxhCithbV9fdGVzdF9mdXNlZF9ndGVzdF90ZXN0X1NPVVJDRVNfRElTVCA9IGZ1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MgXAorCWZ1c2VkLXNyYy9ndGVzdC9ndGVzdC5oIGZ1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjIFwKKwlzYW1wbGVzL3NhbXBsZTEuY2Mgc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjCithbV9fb2JqZWN0c18xID0gIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC4kKE9CSkVYVCkgXAorCWZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi4kKE9CSkVYVCkKK0BIQVZFX1BZVEhPTl9UUlVFQGFtX3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18xKSBcCitASEFWRV9QWVRIT05fVFJVRUAJc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS4kKE9CSkVYVCkgXAorQEhBVkVfUFlUSE9OX1RSVUVACXNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QuJChPQkpFWFQpCit0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfT0JKRUNUUyA9ICQoYW1fdGVzdF9mdXNlZF9ndGVzdF90ZXN0X09CSkVDVFMpCit0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfTERBREQgPSAkKExEQUREKQorYW1fdGVzdF9ndGVzdF9hbGxfdGVzdF9PQkpFQ1RTID0gdGVzdC9ndGVzdF9hbGxfdGVzdC4kKE9CSkVYVCkKK3Rlc3RfZ3Rlc3RfYWxsX3Rlc3RfT0JKRUNUUyA9ICQoYW1fdGVzdF9ndGVzdF9hbGxfdGVzdF9PQkpFQ1RTKQordGVzdF9ndGVzdF9hbGxfdGVzdF9ERVBFTkRFTkNJRVMgPSBsaWIvbGliZ3Rlc3RfbWFpbi5sYSBcCisJbGliL2xpYmd0ZXN0LmxhCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9idWlsZC1hdXgKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2J1aWxkLWF1eC9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NYWENPTVBJTEUgPSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorTFRDWFhDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykKK0NYWExEID0gJChDWFgpCitDWFhMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDWFhMRCkgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKGxpYl9saWJndGVzdF9sYV9TT1VSQ0VTKSAkKGxpYl9saWJndGVzdF9tYWluX2xhX1NPVVJDRVMpIFwKKwkkKHNhbXBsZXNfbGlic2FtcGxlc19sYV9TT1VSQ0VTKSBcCisJJChzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X1NPVVJDRVMpIFwKKwkkKHNhbXBsZXNfc2FtcGxlMV91bml0dGVzdF9TT1VSQ0VTKSBcCisJJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFUykgXAorCSQodGVzdF9ndGVzdF9hbGxfdGVzdF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChsaWJfbGliZ3Rlc3RfbGFfU09VUkNFUykgXAorCSQobGliX2xpYmd0ZXN0X21haW5fbGFfU09VUkNFUykgXAorCSQoc2FtcGxlc19saWJzYW1wbGVzX2xhX1NPVVJDRVMpIFwKKwkkKHNhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfU09VUkNFUykgXAorCSQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X1NPVVJDRVMpIFwKKwkkKGFtX190ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFU19ESVNUKSBcCisJJCh0ZXN0X2d0ZXN0X2FsbF90ZXN0X1NPVVJDRVMpCitEQVRBID0gJChtNGRhdGFfREFUQSkKK0hFQURFUlMgPSAkKHBrZ2luY2x1ZGVfSEVBREVSUykgJChwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCithbV9fdHR5X2NvbG9ycyA9IFwKK3JlZD07IGdybj07IGxnbj07IGJsdT07IHN0ZD0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCit0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKK2FtX19yZW1vdmVfZGlzdGRpciA9IFwKKyAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKSI7IHRoZW4gXAorICAgIGZpbmQgIiQoZGlzdGRpcikiIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAorICAgICAgJiYgcm0gLXJmICIkKGRpc3RkaXIpIiBcCisgICAgICB8fCB7IHNsZWVwIDUgJiYgcm0gLXJmICIkKGRpc3RkaXIpIjsgfTsgXAorICBlbHNlIDo7IGZpCitESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKS50YXIuYnoyICQoZGlzdGRpcikuemlwCitHWklQX0VOViA9IC0tYmVzdAorZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAorYW1fX2Rpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIFwKKyAgfCBzZWQgJ3N8XlwuL3wkKHByZWZpeCkvfCcgfCBncmVwIC12ICckKGluZm9kaXIpL2RpciQkJworZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BUSFJFQURfQ0MgPSBAUFRIUkVBRF9DQ0AKK1BUSFJFQURfQ0ZMQUdTID0gQFBUSFJFQURfQ0ZMQUdTQAorUFRIUkVBRF9MSUJTID0gQFBUSFJFQURfTElCU0AKK1BZVEhPTiA9IEBQWVRIT05ACitSQU5MSUIgPSBAUkFOTElCQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0FSID0gQGFjX2N0X0FSQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYWN4X3B0aHJlYWRfY29uZmlnID0gQGFjeF9wdGhyZWFkX2NvbmZpZ0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKKworIyBOb25zdGFuZGFyZCBwYWNrYWdlIGZpbGVzIGZvciBkaXN0cmlidXRpb24KKworIyBTYW1wbGUgZmlsZXMgdGhhdCB3ZSBkb24ndCBjb21waWxlLgorCisjIEMrKyB0ZXN0IGZpbGVzIHRoYXQgd2UgZG9uJ3QgY29tcGlsZSBkaXJlY3RseS4KKworIyBQeXRob24gdGVzdHMgdGhhdCB3ZSBkb24ndCBydW4uCisKKyMgQ01ha2Ugc2NyaXB0CisKKyMgTVNWQyBwcm9qZWN0IGZpbGVzCisKKyMgeGNvZGUgcHJvamVjdCBmaWxlcworCisjIHhjb2RlIHNhbXBsZSBmaWxlcworCisjIEMrK0J1aWxkZXIgcHJvamVjdCBmaWxlcworRVhUUkFfRElTVCA9IENIQU5HRVMgQ09OVFJJQlVUT1JTIExJQ0VOU0UgXAorCWluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAgXAorCWluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wIFwKKwlpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcCBcCisJaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wIG1ha2UvTWFrZWZpbGUgXAorCXNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSBzY3JpcHRzL2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgXAorCXNjcmlwdHMvcHVtcC5weSBzY3JpcHRzL3Rlc3QvTWFrZWZpbGUgJChHVEVTVF9TUkMpIFwKKwlzYW1wbGVzL3ByaW1lX3RhYmxlcy5oIHNhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYyBcCisJc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjIHNhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYyBcCisJc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjIHNhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYyBcCisJc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIHNhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYyBcCisJc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjIHRlc3QvZ3Rlc3QtZGVhdGgtdGVzdF9leF90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfdGVzdC5jYyB0ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjIHRlc3QvZ3Rlc3QtbGlzdGVuZXJfdGVzdC5jYyBcCisJdGVzdC9ndGVzdC1tZXNzYWdlX3Rlc3QuY2MgdGVzdC9ndGVzdC1vcHRpb25zX3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYyB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIHRlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MgdGVzdC9ndGVzdC10ZXN0LXBhcnRfdGVzdC5jYyBcCisJdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYyBcCisJdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MgdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCBcCisJdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYyBcCisJdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYyBcCisJdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjIHRlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYyB0ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0Xy5jYyB0ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8uY2MgdGVzdC9ndGVzdF9tYWluX3VuaXR0ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MgdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIHRlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjIHRlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0Xy5jYyBcCisJdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjIHRlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MgXAorCXRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MgXAorCXRlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYyB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIFwKKwl0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjIFwKKwl0ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYyBcCisJdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYyB0ZXN0L3Byb2R1Y3Rpb24uY2MgXAorCXRlc3QvcHJvZHVjdGlvbi5oIHRlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weSBcCisJdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weSB0ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weSBcCisJdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkgdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X291dHB1dF90ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0IFwKKwl0ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weSB0ZXN0L2d0ZXN0X3Rlc3RfdXRpbHMucHkgXAorCXRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5IFwKKwl0ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weSBcCisJdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weSBcCisJdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0LnB5IHRlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkgXAorCUNNYWtlTGlzdHMudHh0IGNtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlIG1zdmMvZ3Rlc3QtbWQuc2xuIFwKKwltc3ZjL2d0ZXN0LW1kLnZjcHJvaiBtc3ZjL2d0ZXN0LnNsbiBtc3ZjL2d0ZXN0LnZjcHJvaiBcCisJbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvaiBtc3ZjL2d0ZXN0X21haW4udmNwcm9qIFwKKwltc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2ogbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qIFwKKwltc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvaiBtc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvaiBcCisJeGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZyBcCisJeGNvZGUvQ29uZmlnL0ZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyBcCisJeGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcgXAorCXhjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZyBcCisJeGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgXAorCXhjb2RlL0NvbmZpZy9UZXN0VGFyZ2V0LnhjY29uZmlnIHhjb2RlL1Jlc291cmNlcy9JbmZvLnBsaXN0IFwKKwl4Y29kZS9TY3JpcHRzL3J1bnRlc3RzLnNoIHhjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IFwKKwl4Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIFwKKwl4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0IFwKKwl4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBcCisJeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvcnVudGVzdHMuc2ggXAorCXhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYyBcCisJeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmggXAorCXhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjIFwKKwljb2RlZ2Vhci9ndGVzdC5jYnByb2ogY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qIFwKKwljb2RlZ2Vhci9ndGVzdF9hbGwuY2MgY29kZWdlYXIvZ3Rlc3RfbGluay5jYyBcCisJY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2ogY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIFwKKwkkKG00ZGF0YV9EQVRBKQorCisjIGd0ZXN0IHNvdXJjZSBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgZGlyZWN0bHkuICBUaGV5IGFyZQorIyAjaW5jbHVkZWQgYnkgZ3Rlc3QtYWxsLmNjLgorR1RFU1RfU1JDID0gXAorICBzcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBcCisgIHNyYy9ndGVzdC1maWxlcGF0aC5jYyBcCisgIHNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCBcCisgIHNyYy9ndGVzdC1wb3J0LmNjIFwKKyAgc3JjL2d0ZXN0LXByaW50ZXJzLmNjIFwKKyAgc3JjL2d0ZXN0LXRlc3QtcGFydC5jYyBcCisgIHNyYy9ndGVzdC10eXBlZC10ZXN0LmNjIFwKKyAgc3JjL2d0ZXN0LmNjCisKKworIyBEaXN0cmlidXRlIGFuZCBpbnN0YWxsIE00IG1hY3JvCittNGRhdGFkaXIgPSAkKGRhdGFkaXIpL2FjbG9jYWwKK200ZGF0YV9EQVRBID0gbTQvZ3Rlc3QubTQKKworIyBXZSBkZWZpbmUgdGhlIGdsb2JhbCBBTV9DUFBGTEFHUyBhcyBldmVyeXRoaW5nIHdlIGNvbXBpbGUgaW5jbHVkZXMgZnJvbSB0aGVzZQorIyBkaXJlY3Rvcmllcy4KK0FNX0NQUEZMQUdTID0gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvaW5jbHVkZQorQEhBVkVfUFRIUkVBRFNfRkFMU0VAQU1fQ1hYRkxBR1MgPSAtREdURVNUX0hBU19QVEhSRUFEPTAKKworIyBNb2RpZmllcyBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGZvciBwdGhyZWFkcyBjb21wYXRpYmlsaXR5LgorQEhBVkVfUFRIUkVBRFNfVFJVRUBBTV9DWFhGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AgLURHVEVTVF9IQVNfUFRIUkVBRD0xCitASEFWRV9QVEhSRUFEU19UUlVFQEFNX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorCisjIEJ1aWxkIHJ1bGVzIGZvciBsaWJyYXJpZXMuCitsaWJfTFRMSUJSQVJJRVMgPSBsaWIvbGliZ3Rlc3QubGEgbGliL2xpYmd0ZXN0X21haW4ubGEKK2xpYl9saWJndGVzdF9sYV9TT1VSQ0VTID0gc3JjL2d0ZXN0LWFsbC5jYworcGtnaW5jbHVkZV9IRUFERVJTID0gXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCisKK3BrZ2luY2x1ZGVfaW50ZXJuYWxkaXIgPSAkKHBrZ2luY2x1ZGVkaXIpL2ludGVybmFsCitwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMgPSBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKKworbGliX2xpYmd0ZXN0X21haW5fbGFfU09VUkNFUyA9IHNyYy9ndGVzdF9tYWluLmNjCitsaWJfbGliZ3Rlc3RfbWFpbl9sYV9MSUJBREQgPSBsaWIvbGliZ3Rlc3QubGEKKworIyBCdWxpZCBydWxlcyBmb3Igc2FtcGxlcyBhbmQgdGVzdHMuIEF1dG9tYWtlJ3MgbmFtaW5nIGZvciBzb21lIG9mCisjIHRoZXNlIHZhcmlhYmxlcyBpc24ndCB0ZXJyaWJseSBvYnZpb3VzLCBzbyB0aGlzIGlzIGEgYnJpZWYKKyMgcmVmZXJlbmNlOgorIworIyBURVNUUyAtLSBQcm9ncmFtcyBydW4gYXV0b21hdGljYWxseSBieSAibWFrZSBjaGVjayIKKyMgY2hlY2tfUFJPR1JBTVMgLS0gUHJvZ3JhbXMgYnVpbHQgYnkgIm1ha2UgY2hlY2siIGJ1dCBub3QgbmVjZXNzYXJpbHkgcnVuCitub2luc3RfTFRMSUJSQVJJRVMgPSBzYW1wbGVzL2xpYnNhbXBsZXMubGEKK3NhbXBsZXNfbGlic2FtcGxlc19sYV9TT1VSQ0VTID0gXAorICBzYW1wbGVzL3NhbXBsZTEuY2MgXAorICBzYW1wbGVzL3NhbXBsZTEuaCBcCisgIHNhbXBsZXMvc2FtcGxlMi5jYyBcCisgIHNhbXBsZXMvc2FtcGxlMi5oIFwKKyAgc2FtcGxlcy9zYW1wbGUzLWlubC5oIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU0LmgKKworVEVTVFNfRU5WSVJPTk1FTlQgPSBHVEVTVF9TT1VSQ0VfRElSPSIkKHNyY2RpcikvdGVzdCIgXAorICAgICAgICAgICAgICAgICAgICBHVEVTVF9CVUlMRF9ESVI9IiQodG9wX2J1aWxkZGlyKS90ZXN0IgorCitzYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfU09VUkNFUyA9IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYworc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0X21haW4ubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliL2xpYmd0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvbGlic2FtcGxlcy5sYQorCitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X1NPVVJDRVMgPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0LmxhCit0ZXN0X2d0ZXN0X2FsbF90ZXN0X1NPVVJDRVMgPSB0ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjCit0ZXN0X2d0ZXN0X2FsbF90ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0X21haW4ubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYi9saWJndGVzdC5sYQorCisKKyMgVGVzdHMgdGhhdCBmdXNlZCBndGVzdCBmaWxlcyBjb21waWxlIGFuZCB3b3JrLgorRlVTRURfR1RFU1RfU1JDID0gXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjIFwKKyAgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmggXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYworCitASEFWRV9QWVRIT05fVFJVRUB0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFUyA9ICQoRlVTRURfR1RFU1RfU1JDKSBcCitASEFWRV9QWVRIT05fVFJVRUAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvc2FtcGxlMS5jYyBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKKworQEhBVkVfUFlUSE9OX1RSVUVAdGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTID0gLUkiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKworIyBEZWF0aCB0ZXN0cyBtYXkgcHJvZHVjZSBjb3JlIGR1bXBzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuIEluIGNhc2UKKyMgdGhpcyBoYXBwZW5zLCBjbGVhbiB0aGVtIHRvIGtlZXAgZGlzdGNsZWFuY2hlY2sgaGFwcHkuCitDTEVBTkZJTEVTID0gY29yZQorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuY2MgLmxvIC5vIC5vYmoKK2FtLS1yZWZyZXNoOiBNYWtlZmlsZQorCUA6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduJzsgXAorCSAgICAgICQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduIE1ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgZWNobyAnICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyc7IFwKKwkgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCiskKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCSQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK2J1aWxkLWF1eC9jb25maWcuaDogYnVpbGQtYXV4L3N0YW1wLWgxCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBybSAtZiBidWlsZC1hdXgvc3RhbXAtaDE7IGVsc2UgOjsgZmkKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGJ1aWxkLWF1eC9zdGFtcC1oMTsgZWxzZSA6OyBmaQorCitidWlsZC1hdXgvc3RhbXAtaDE6ICQodG9wX3NyY2RpcikvYnVpbGQtYXV4L2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQHJtIC1mIGJ1aWxkLWF1eC9zdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgYnVpbGQtYXV4L2NvbmZpZy5oCiskKHRvcF9zcmNkaXIpL2J1aWxkLWF1eC9jb25maWcuaC5pbjogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKKwkoJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKSkKKwlybSAtZiBidWlsZC1hdXgvc3RhbXAtaDEKKwl0b3VjaCAkQAorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBidWlsZC1hdXgvY29uZmlnLmggYnVpbGQtYXV4L3N0YW1wLWgxCitzY3JpcHRzL2d0ZXN0LWNvbmZpZzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS9zY3JpcHRzL2d0ZXN0LWNvbmZpZy5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK2luc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobGliZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobGliZGlyKSIKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCisJICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lOyBcCisJdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCisJICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgJyQoREVTVERJUikkKGxpYmRpciknIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgIiQoREVTVERJUikkKGxpYmRpcikiOyBcCisJfQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgJChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJyQoREVTVERJUikkKGxpYmRpcikvJCRmJyI7IFwKKwkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICIkKERFU1RESVIpJChsaWJkaXIpLyQkZiI7IFwKKwlkb25lCisKK2NsZWFuLWxpYkxUTElCUkFSSUVTOgorCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGRpcj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfC9bXi9dKiQkfHwnYCI7IFwKKwkgIHRlc3QgIiQkZGlyIiAhPSAiJCRwIiB8fCBkaXI9LjsgXAorCSAgZWNobyAicm0gLWYgXCIkJHtkaXJ9L3NvX2xvY2F0aW9uc1wiIjsgXAorCSAgcm0gLWYgIiQke2Rpcn0vc29fbG9jYXRpb25zIjsgXAorCWRvbmUKKworY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobm9pbnN0X0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorc3JjLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMKKwlAOiA+IHNyYy8kKGFtX19kaXJzdGFtcCkKK3NyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy8kKERFUERJUikKKwlAOiA+IHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvZ3Rlc3QtYWxsLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitsaWIvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGxpYgorCUA6ID4gbGliLyQoYW1fX2RpcnN0YW1wKQorbGliL2xpYmd0ZXN0LmxhOiAkKGxpYl9saWJndGVzdF9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGliX2xpYmd0ZXN0X2xhX0RFUEVOREVOQ0lFUykgbGliLyQoYW1fX2RpcnN0YW1wKQorCSQoQ1hYTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYl9saWJndGVzdF9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9sYV9MSUJBREQpICQoTElCUykKK3NyYy9ndGVzdF9tYWluLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitsaWIvbGliZ3Rlc3RfbWFpbi5sYTogJChsaWJfbGliZ3Rlc3RfbWFpbl9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9tYWluX2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9saWJfbGliZ3Rlc3RfbWFpbl9sYV9ERVBFTkRFTkNJRVMpIGxpYi8kKGFtX19kaXJzdGFtcCkKKwkkKENYWExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJfbGliZ3Rlc3RfbWFpbl9sYV9PQkpFQ1RTKSAkKGxpYl9saWJndGVzdF9tYWluX2xhX0xJQkFERCkgJChMSUJTKQorc2FtcGxlcy8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc2FtcGxlcworCUA6ID4gc2FtcGxlcy8kKGFtX19kaXJzdGFtcCkKK3NhbXBsZXMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzYW1wbGVzLyQoREVQRElSKQorCUA6ID4gc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL3NhbXBsZTEubG86IHNhbXBsZXMvJChhbV9fZGlyc3RhbXApIFwKKwlzYW1wbGVzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NhbXBsZXMvc2FtcGxlMi5sbzogc2FtcGxlcy8kKGFtX19kaXJzdGFtcCkgXAorCXNhbXBsZXMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc2FtcGxlcy9zYW1wbGU0LmxvOiBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKSBcCisJc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL2xpYnNhbXBsZXMubGE6ICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX09CSkVDVFMpICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9zYW1wbGVzX2xpYnNhbXBsZXNfbGFfREVQRU5ERU5DSUVTKSBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKQorCSQoQ1hYTElOSykgICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX09CSkVDVFMpICQoc2FtcGxlc19saWJzYW1wbGVzX2xhX0xJQkFERCkgJChMSUJTKQorCitjbGVhbi1jaGVja1BST0dSQU1TOgorCUBsaXN0PSckKGNoZWNrX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC4kKE9CSkVYVCk6IHNhbXBsZXMvJChhbV9fZGlyc3RhbXApIFwKKwlzYW1wbGVzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QkKEVYRUVYVCk6ICQoc2FtcGxlc19zYW1wbGUxMF91bml0dGVzdF9PQkpFQ1RTKSAkKHNhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3NhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfREVQRU5ERU5DSUVTKSBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0JChFWEVFWFQpCisJJChDWFhMSU5LKSAkKHNhbXBsZXNfc2FtcGxlMTBfdW5pdHRlc3RfT0JKRUNUUykgJChzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X0xEQUREKSAkKExJQlMpCitzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuJChPQkpFWFQpOiBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKSBcCisJc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QkKEVYRUVYVCk6ICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X09CSkVDVFMpICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9zYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfREVQRU5ERU5DSUVTKSBzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QkKEVYRUVYVCkKKwkkKENYWExJTkspICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X09CSkVDVFMpICQoc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0xEQUREKSAkKExJQlMpCitmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGZ1c2VkLXNyYy9ndGVzdAorCUA6ID4gZnVzZWQtc3JjL2d0ZXN0LyQoYW1fX2RpcnN0YW1wKQorZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKQorCUA6ID4gZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2Z1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLiQoT0JKRVhUKTogIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLiQoT0JKRVhUKTogIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApIFwKKwlmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS4kKE9CSkVYVCk6ICBcCisJc2FtcGxlcy8kKGFtX19kaXJzdGFtcCkgc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlzYW1wbGVzLyQoYW1fX2RpcnN0YW1wKSBzYW1wbGVzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3Rlc3QvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHRlc3QKKwlAOiA+IHRlc3QvJChhbV9fZGlyc3RhbXApCit0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QkKEVYRUVYVCk6ICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X09CSkVDVFMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfREVQRU5ERU5DSUVTKSB0ZXN0LyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiB0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QkKEVYRUVYVCkKKwkkKENYWExJTkspICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X09CSkVDVFMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0xEQUREKSAkKExJQlMpCit0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgdGVzdC8kKERFUERJUikKKwlAOiA+IHRlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQordGVzdC9ndGVzdF9hbGxfdGVzdC4kKE9CSkVYVCk6IHRlc3QvJChhbV9fZGlyc3RhbXApIFwKKwl0ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3Rlc3QvZ3Rlc3RfYWxsX3Rlc3QkKEVYRUVYVCk6ICQodGVzdF9ndGVzdF9hbGxfdGVzdF9PQkpFQ1RTKSAkKHRlc3RfZ3Rlc3RfYWxsX3Rlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3Rlc3RfZ3Rlc3RfYWxsX3Rlc3RfREVQRU5ERU5DSUVTKSB0ZXN0LyQoYW1fX2RpcnN0YW1wKQorCUBybSAtZiB0ZXN0L2d0ZXN0X2FsbF90ZXN0JChFWEVFWFQpCisJJChDWFhMSU5LKSAkKHRlc3RfZ3Rlc3RfYWxsX3Rlc3RfT0JKRUNUUykgJCh0ZXN0X2d0ZXN0X2FsbF90ZXN0X0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisJLXJtIC1mIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLiQoT0JKRVhUKQorCS1ybSAtZiBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0X21haW4uJChPQkpFWFQpCisJLXJtIC1mIHNhbXBsZXMvc2FtcGxlMS4kKE9CSkVYVCkKKwktcm0gLWYgc2FtcGxlcy9zYW1wbGUxLmxvCisJLXJtIC1mIHNhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuJChPQkpFWFQpCisJLXJtIC1mIHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC4kKE9CSkVYVCkKKwktcm0gLWYgc2FtcGxlcy9zYW1wbGUyLiQoT0JKRVhUKQorCS1ybSAtZiBzYW1wbGVzL3NhbXBsZTIubG8KKwktcm0gLWYgc2FtcGxlcy9zYW1wbGU0LiQoT0JKRVhUKQorCS1ybSAtZiBzYW1wbGVzL3NhbXBsZTQubG8KKwktcm0gLWYgc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS4kKE9CSkVYVCkKKwktcm0gLWYgc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2d0ZXN0LWFsbC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2d0ZXN0LWFsbC5sbworCS1ybSAtZiBzcmMvZ3Rlc3RfbWFpbi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2d0ZXN0X21haW4ubG8KKwktcm0gLWYgdGVzdC9ndGVzdF9hbGxfdGVzdC4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc2FtcGxlcy8kKERFUERJUikvc2FtcGxlMS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNhbXBsZXMvJChERVBESVIpL3NhbXBsZTEwX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzYW1wbGVzLyQoREVQRElSKS9zYW1wbGUxX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzYW1wbGVzLyQoREVQRElSKS9zYW1wbGUyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc2FtcGxlcy8kKERFUERJUikvc2FtcGxlNC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzYW1wbGVzLyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjLyQoREVQRElSKS9ndGVzdC1hbGwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvJChERVBESVIpL2d0ZXN0X21haW4uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUB0ZXN0LyQoREVQRElSKS9ndGVzdF9hbGxfdGVzdC5Qb0BhbV9fcXVvdGVACisKKy5jYy5vOgorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACWRlcGJhc2U9YGVjaG8gJEAgfCBzZWQgJ3N8W14vXSokJHwkKERFUERJUikvJnw7c3xcLm8kJHx8J2A7XAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgJDwgJiZcCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgJDwKKworLmNjLm9iajoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5vYmokJHx8J2A7XAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYCAmJlwKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJCRkZXBiYXNlLlRwbyAkJGRlcGJhc2UuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jYy5sbzoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5sbyQkfHwnYDtcCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMVENYWENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkJGRlcGJhc2UuVHBvIC1jIC1vICRAICQ8ICYmXAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkJGRlcGJhc2UuVHBvICQkZGVwYmFzZS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTFRDWFhDT01QSUxFKSAtYyAtbyAkQCAkPAorCitmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vOiBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLm8gLU1EIC1NUCAtTUYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLlRwbyAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vIGB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpIGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5UcG8gZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYycgb2JqZWN0PSdmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vIGB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCisKK2Z1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLm9iajogZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vYmogLU1EIC1NUCAtTUYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3QtYWxsLlRwbyAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vYmogYGlmIHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdC1hbGwuVHBvIGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MnIG9iamVjdD0nZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdC1hbGwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0LWFsbC5vYmogYGlmIHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyc7IGZpYAorCitmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0X21haW4ubzogZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm8gLU1EIC1NUCAtTUYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5UcG8gLWMgLW8gZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm8gYHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLlRwbyBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MnIG9iamVjdD0nZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5vIGB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKKworZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm9iajogZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZnVzZWQtc3JjL2d0ZXN0L3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLm9iaiAtTUQgLU1QIC1NRiBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1ndGVzdF9tYWluLlRwbyAtYyAtbyBmdXNlZC1zcmMvZ3Rlc3QvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LWd0ZXN0X21haW4ub2JqIGBpZiB0ZXN0IC1mICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5UcG8gZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJyBvYmplY3Q9J2Z1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGZ1c2VkLXNyYy9ndGVzdC90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3QtZ3Rlc3RfbWFpbi5vYmogYGlmIHRlc3QgLWYgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Z1c2VkLXNyYy9ndGVzdC9ndGVzdF9tYWluLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyc7IGZpYAorCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm86IHNhbXBsZXMvc2FtcGxlMS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm8gLU1EIC1NUCAtTUYgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEuVHBvIC1jIC1vIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEubyBgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzYW1wbGVzL3NhbXBsZTEuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEuVHBvIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nc2FtcGxlcy9zYW1wbGUxLmNjJyBvYmplY3Q9J3NhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS5vIGB0ZXN0IC1mICdzYW1wbGVzL3NhbXBsZTEuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNhbXBsZXMvc2FtcGxlMS5jYworCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm9iajogc2FtcGxlcy9zYW1wbGUxLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTEub2JqIC1NRCAtTVAgLU1GIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlRwbyAtYyAtbyBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm9iaiBgaWYgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NhbXBsZXMvc2FtcGxlMS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2FtcGxlcy9zYW1wbGUxLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLlRwbyBzYW1wbGVzLyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J3NhbXBsZXMvc2FtcGxlMS5jYycgb2JqZWN0PSdzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMS5vYmogYGlmIHRlc3QgLWYgJ3NhbXBsZXMvc2FtcGxlMS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzYW1wbGVzL3NhbXBsZTEuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NhbXBsZXMvc2FtcGxlMS5jYyc7IGZpYAorCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm86IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QuVHBvIC1jIC1vIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QubyBgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgc2FtcGxlcy8kKERFUERJUikvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QuVHBvIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3NhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5vIGB0ZXN0IC1mICdzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYworCitzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm9iajogc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHNhbXBsZXMvdGVzdF9mdXNlZF9ndGVzdF90ZXN0LXNhbXBsZTFfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LlRwbyAtYyAtbyBzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpIHNhbXBsZXMvJChERVBESVIpL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0LlRwbyBzYW1wbGVzLyQoREVQRElSKS90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYycgb2JqZWN0PSdzYW1wbGVzL3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdC1zYW1wbGUxX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2FtcGxlcy90ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3Qtc2FtcGxlMV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyc7IGZpYAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCS1ybSAtcmYgbGliLy5saWJzIGxpYi9fbGlicworCS1ybSAtcmYgc2FtcGxlcy8ubGlicyBzYW1wbGVzL19saWJzCisJLXJtIC1yZiBzcmMvLmxpYnMgc3JjL19saWJzCisJLXJtIC1yZiB0ZXN0Ly5saWJzIHRlc3QvX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wgY29uZmlnLmx0CitpbnN0YWxsLW00ZGF0YURBVEE6ICQobTRkYXRhX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChtNGRhdGFkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtNGRhdGFkaXIpIgorCUBsaXN0PSckKG00ZGF0YV9EQVRBKSc7IHRlc3QgLW4gIiQobTRkYXRhZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChtNGRhdGFkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChtNGRhdGFkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLW00ZGF0YURBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtNGRhdGFfREFUQSknOyB0ZXN0IC1uICIkKG00ZGF0YWRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwlkaXI9JyQoREVTVERJUikkKG00ZGF0YWRpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCitpbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTOiAkKHBrZ2luY2x1ZGVfSEVBREVSUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHBrZ2luY2x1ZGVkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKSIKKwlAbGlzdD0nJChwa2dpbmNsdWRlX0hFQURFUlMpJzsgdGVzdCAtbiAiJChwa2dpbmNsdWRlZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgJyQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQocGtnaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQocGtnaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwlkaXI9JyQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQoraW5zdGFsbC1wa2dpbmNsdWRlX2ludGVybmFsSEVBREVSUzogJChwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocGtnaW5jbHVkZV9pbnRlcm5hbGRpcikiCisJQGxpc3Q9JyQocGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTKSc7IHRlc3QgLW4gIiQocGtnaW5jbHVkZV9pbnRlcm5hbGRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgXAorCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICckKERFU1RESVIpJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSciOyBcCisJICAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICIkKERFU1RESVIpJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSIgfHwgZXhpdCAkJD87IFwKKwlkb25lCisKK3VuaW5zdGFsbC1wa2dpbmNsdWRlX2ludGVybmFsSEVBREVSUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHBrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUyknOyB0ZXN0IC1uICIkKHBrZ2luY2x1ZGVfaW50ZXJuYWxkaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCisJZGlyPSckKERFU1RESVIpJChwa2dpbmNsdWRlX2ludGVybmFsZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworY2hlY2stVEVTVFM6ICQoVEVTVFMpCisJQGZhaWxlZD0wOyBhbGw9MDsgeGZhaWw9MDsgeHBhc3M9MDsgc2tpcD0wOyBcCisJc3JjZGlyPSQoc3JjZGlyKTsgZXhwb3J0IHNyY2RpcjsgXAorCWxpc3Q9JyAkKFRFU1RTKSAnOyBcCisJJChhbV9fdHR5X2NvbG9ycyk7IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKKwkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKKwkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKKwkJeHBhc3M9YGV4cHIgJCR4cGFzcyArIDFgOyBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPVhQQVNTOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJY29sPSQkZ3JuOyByZXM9UEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICBlc2FjOyBcCisJICAgIGVsaWYgdGVzdCAkJD8gLW5lIDc3OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhmYWlsPWBleHByICQkeGZhaWwgKyAxYDsgXAorCQljb2w9JCRsZ247IHJlcz1YRkFJTDsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPUZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbHNlIFwKKwkgICAgICBza2lwPWBleHByICQkc2tpcCArIDFgOyBcCisJICAgICAgY29sPSQkYmx1OyByZXM9U0tJUDsgXAorCSAgICBmaTsgXAorCSAgICBlY2hvICIkJHtjb2x9JCRyZXMkJHtzdGR9OiAkJHRzdCI7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIHRlc3QgIiQkYWxsIiAtZXEgMTsgdGhlbiBcCisJICAgIHRlc3RzPSJ0ZXN0IjsgXAorCSAgICBBbGw9IiI7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0cz0idGVzdHMiOyBcCisJICAgIEFsbD0iQWxsICI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAorCSAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMDsgdGhlbiBcCisJICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgcGFzc2VkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMTsgdGhlbiBmYWlsdXJlcz1mYWlsdXJlOyBlbHNlIGZhaWx1cmVzPWZhaWx1cmVzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIGJlaGF2ZWQgYXMgZXhwZWN0ZWQgKCQkeGZhaWwgZXhwZWN0ZWQgJCRmYWlsdXJlcykiOyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBmYWlsZWQiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAxOyB0aGVuIHBhc3Nlcz1wYXNzOyBlbHNlIHBhc3Nlcz1wYXNzZXM7IGZpOyBcCisJICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgJCRwYXNzZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwkgIGRhc2hlcz0iJCRiYW5uZXIiOyBcCisJICBza2lwcGVkPSIiOyBcCisJICBpZiB0ZXN0ICIkJHNraXAiIC1uZSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCRza2lwIiAtZXEgMTsgdGhlbiBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0IHdhcyBub3QgcnVuKSI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0cyB3ZXJlIG5vdCBydW4pIjsgXAorCSAgICBmaTsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHNraXBwZWQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKKwkgICAgICBkYXNoZXM9IiQkc2tpcHBlZCI7IFwKKwkgIGZpOyBcCisJICByZXBvcnQ9IiI7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtbmUgMCAmJiB0ZXN0IC1uICIkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IHRoZW4gXAorCSAgICByZXBvcnQ9IlBsZWFzZSByZXBvcnQgdG8gJChQQUNLQUdFX0JVR1JFUE9SVCkiOyBcCisJICAgIHRlc3QgYGVjaG8gIiQkcmVwb3J0IiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHJlcG9ydCI7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9YGVjaG8gIiQkZGFzaGVzIiB8IHNlZCBzLy4vPS9nYDsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgY29sPSIkJGdybiI7IFwKKwkgIGVsc2UgXAorCSAgICBjb2w9IiQkcmVkIjsgXAorCSAgZmk7IFwKKwkgIGVjaG8gIiQke2NvbH0kJGRhc2hlcyQke3N0ZH0iOyBcCisJICBlY2hvICIkJHtjb2x9JCRiYW5uZXIkJHtzdGR9IjsgXAorCSAgdGVzdCAteiAiJCRza2lwcGVkIiB8fCBlY2hvICIkJHtjb2x9JCRza2lwcGVkJCR7c3RkfSI7IFwKKwkgIHRlc3QgLXogIiQkcmVwb3J0IiB8fCBlY2hvICIkJHtjb2x9JCRyZXBvcnQkJHtzdGR9IjsgXAorCSAgZWNobyAiJCR7Y29sfSQkZGFzaGVzJCR7c3RkfSI7IFwKKwkgIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgXAorCWVsc2UgOjsgZmkKKworZGlzdGRpcjogJChESVNURklMRVMpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJdGVzdCAtZCAiJChkaXN0ZGlyKSIgfHwgbWtkaXIgIiQoZGlzdGRpcikiCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJLXRlc3QgLW4gIiQoYW1fX3NraXBfbW9kZV9maXgpIiBcCisJfHwgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC03NTUgXAorCQktZXhlYyBjaG1vZCB1K3J3eCxnbytyeCB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKKwl8fCBjaG1vZCAtUiBhK3IgIiQoZGlzdGRpcikiCitkaXN0LWd6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorZGlzdC1iemlwMjogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBCWklQMj0kJHtCWklQMi0tOX0gYnppcDIgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWx6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgbHppcCAtYyAkJHtMWklQX09QVC0tOX0gPiQoZGlzdGRpcikudGFyLmx6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtbHptYTogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBsem1hIC05IC1jID4kKGRpc3RkaXIpLnRhci5sem1hCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QteHo6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgWFpfT1BUPSQke1haX09QVC0tZX0geHogLWMgPiQoZGlzdGRpcikudGFyLnh6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtdGFyWjogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBjb21wcmVzcyAtYyA+JChkaXN0ZGlyKS50YXIuWgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXNoYXI6IGRpc3RkaXIKKwlzaGFyICQoZGlzdGRpcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikuc2hhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorZGlzdC16aXA6IGRpc3RkaXIKKwktcm0gLWYgJChkaXN0ZGlyKS56aXAKKwl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdCBkaXN0LWFsbDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEJaSVAyPSQke0JaSVAyLS05fSBiemlwMiAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCisJLXJtIC1mICQoZGlzdGRpcikuemlwCisJemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKKyMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KKyMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKKyMgdGFyZmlsZS4KK2Rpc3RjaGVjazogZGlzdAorCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKKwkqLnRhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCisJKi50YXIuYnoyKikgXAorCSAgYnppcDIgLWRjICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5sem1hKikgXAorCSAgbHptYSAtZGMgJChkaXN0ZGlyKS50YXIubHptYSB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5seiopIFwKKwkgIGx6aXAgLWRjICQoZGlzdGRpcikudGFyLmx6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLnh6KikgXAorCSAgeHogLWRjICQoZGlzdGRpcikudGFyLnh6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLloqKSBcCisJICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCisJKi5zaGFyLmd6KikgXAorCSAgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1kYyAkKGRpc3RkaXIpLnNoYXIuZ3ogfCB1bnNoYXIgOztcCisJKi56aXAqKSBcCisJICB1bnppcCAkKGRpc3RkaXIpLnppcCA7O1wKKwllc2FjCisJY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIGErdyAkKGRpc3RkaXIpCisJbWtkaXIgJChkaXN0ZGlyKS9fYnVpbGQKKwlta2RpciAkKGRpc3RkaXIpL19pbnN0CisJY2htb2QgYS13ICQoZGlzdGRpcikKKwl0ZXN0IC1kICQoZGlzdGRpcikvX2J1aWxkIHx8IGV4aXQgMDsgXAorCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAorCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCisJICAmJiBhbV9fY3dkPWBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKGRpc3RkaXIpL19idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICQoQU1fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgXAorCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCisJICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAmJiAoeyBcCisJICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKKwkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAorCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAorCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAorCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sgXAorCSAgJiYgY2QgIiQkYW1fX2N3ZCIgXAorCSAgfHwgZXhpdCAxCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKKwkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKKwkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JworZGlzdHVuaW5zdGFsbGNoZWNrOgorCUB0ZXN0IC1uICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyB8fCB7IFwKKwkgIGVjaG8gJ0VSUk9SOiB0cnlpbmcgdG8gcnVuICRAIHdpdGggYW4gZW1wdHknIFwKKwkgICAgICAgJyQkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyA+JjI7IFwKKwkgIGV4aXQgMTsgXAorCX07IFwKKwkkKGFtX19jZCkgJyQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknIHx8IHsgXAorCSAgZWNobyAnRVJST1I6IGNhbm5vdCBjaGRpciBpbnRvICQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknID4mMjsgXAorCSAgZXhpdCAxOyBcCisJfTsgXAorCXRlc3QgYCQoYW1fX2Rpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKKwkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAorCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAorCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAorCSAgICAgICAgZmkgOyBcCisJICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICAgZXhpdCAxOyB9ID4mMgorZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgorCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAorCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCisJICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKKwkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICBleGl0IDE7IH0gPiYyCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJChjaGVja19QUk9HUkFNUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1URVNUUworY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpICQoREFUQSkgJChIRUFERVJTKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKG00ZGF0YWRpcikiICIkKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKSIgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVfaW50ZXJuYWxkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgICAgIGluc3RhbGw7IFwKKwllbHNlIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAorCWZpCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCS1ybSAtZiBmdXNlZC1zcmMvZ3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBmdXNlZC1zcmMvZ3Rlc3QvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGxpYi8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc2FtcGxlcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNhbXBsZXMvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgdGVzdC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHRlc3QvJChhbV9fZGlyc3RhbXApCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorQEhBVkVfUFlUSE9OX0ZBTFNFQG1haW50YWluZXItY2xlYW4tbG9jYWw6CitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMVExJQlJBUklFUyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQorCS1ybSAtcmYgZnVzZWQtc3JjL2d0ZXN0LyQoREVQRElSKSBzYW1wbGVzLyQoREVQRElSKSBzcmMvJChERVBESVIpIHRlc3QvJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtbTRkYXRhREFUQSBcCisJaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUyBpbnN0YWxsLXBrZ2luY2x1ZGVfaW50ZXJuYWxIRUFERVJTCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1saWJMVExJQlJBUklFUworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKKwktcm0gLXJmIGZ1c2VkLXNyYy9ndGVzdC8kKERFUERJUikgc2FtcGxlcy8kKERFUERJUikgc3JjLyQoREVQRElSKSB0ZXN0LyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCisJbWFpbnRhaW5lci1jbGVhbi1sb2NhbAorCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLW00ZGF0YURBVEEgXAorCXVuaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUyBcCisJdW5pbnN0YWxsLXBrZ2luY2x1ZGVfaW50ZXJuYWxIRUFERVJTCisKKy5NQUtFOiBjaGVjay1hbSBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGFtLS1yZWZyZXNoIGNoZWNrIGNoZWNrLVRFU1RTIGNoZWNrLWFtIFwKKwljbGVhbiBjbGVhbi1jaGVja1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY3RhZ3MgZGlzdCBkaXN0LWFsbCBcCisJZGlzdC1iemlwMiBkaXN0LWd6aXAgZGlzdC1semlwIGRpc3QtbHptYSBkaXN0LXNoYXIgZGlzdC10YXJaIFwKKwlkaXN0LXh6IGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAorCWluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCisJaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW00ZGF0YURBVEEgaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMgXAorCWluc3RhbGwtcGtnaW5jbHVkZV9pbnRlcm5hbEhFQURFUlMgaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKKwltYWludGFpbmVyLWNsZWFuLWxvY2FsIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKKwl1bmluc3RhbGwtbTRkYXRhREFUQSB1bmluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMgXAorCXVuaW5zdGFsbC1wa2dpbmNsdWRlX2ludGVybmFsSEVBREVSUworCisKKyMgQnVpbGQgcnVsZXMgZm9yIHB1dHRpbmcgZnVzZWQgR29vZ2xlIFRlc3QgZmlsZXMgaW50byB0aGUgZGlzdHJpYnV0aW9uCisjIHBhY2thZ2UuIFRoZSB1c2VyIGNhbiBhbHNvIGNyZWF0ZSB0aG9zZSBmaWxlcyBieSBtYW51YWxseSBydW5uaW5nCisjIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weS4KK0BIQVZFX1BZVEhPTl9UUlVFQCQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X1NPVVJDRVMpOiBmdXNlZC1ndGVzdAorCitASEFWRV9QWVRIT05fVFJVRUBmdXNlZC1ndGVzdDogJChwa2dpbmNsdWRlX0hFQURFUlMpICQocGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTKSBcCitASEFWRV9QWVRIT05fVFJVRUAgICAgICAgICAgICAgJChHVEVTVF9TUkMpIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MgXAorQEhBVkVfUFlUSE9OX1RSVUVAICAgICAgICAgICAgIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weQorQEhBVkVfUFlUSE9OX1RSVUVACW1rZGlyIC1wICIkKHNyY2RpcikvZnVzZWQtc3JjIgorQEhBVkVfUFlUSE9OX1RSVUVACWNobW9kIC1SIHUrdyAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKK0BIQVZFX1BZVEhPTl9UUlVFQAlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MiCitASEFWRV9QWVRIT05fVFJVRUAJcm0gLWYgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCIKK0BIQVZFX1BZVEhPTl9UUlVFQAkiJChzcmNkaXIpL3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSIgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCitASEFWRV9QWVRIT05fVFJVRUAJY3AgLWYgIiQoc3JjZGlyKS9zcmMvZ3Rlc3RfbWFpbi5jYyIgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvIgorCitASEFWRV9QWVRIT05fVFJVRUBtYWludGFpbmVyLWNsZWFuLWxvY2FsOgorQEhBVkVfUFlUSE9OX1RSVUVACXJtIC1yZiAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKworIyBEaXNhYmxlcyAnbWFrZSBpbnN0YWxsJyBhcyBpbnN0YWxsaW5nIGEgY29tcGlsZWQgdmVyc2lvbiBvZiBHb29nbGUKKyMgVGVzdCBjYW4gbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3IgZHVlIHRvIHZpb2xhdGlvbiBvZiB0aGUKKyMgT25lLURlZmluaXRpb24gUnVsZS4KKworaW5zdGFsbC1leGVjLWxvY2FsOgorCWVjaG8gIidtYWtlIGluc3RhbGwnIGlzIGRhbmdlcm91cyBhbmQgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgc2VlIFJFQURNRSBmb3IgaG93IHRvIGludGVncmF0ZSBHb29nbGUgVGVzdCBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtLiIKKwlmYWxzZQorCitpbnN0YWxsLWRhdGEtbG9jYWw6CisJZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0IGludG8geW91ciBidWlsZCBzeXN0ZW0uIgorCWZhbHNlCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvUkVBRE1FIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiZjcyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvUkVBRE1FCkBAIC0wLDAgKzEsNDM0IEBACitHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LworCitPdmVydmlldworLS0tLS0tLS0KKworR29vZ2xlJ3MgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyB0ZXN0cyBvbiBhIHZhcmlldHkgb2YgcGxhdGZvcm1zCisoTGludXgsIE1hYyBPUyBYLCBXaW5kb3dzLCBXaW5kb3dzIENFLCBTeW1iaWFuLCBldGMpLiAgQmFzZWQgb24gdGhlCit4VW5pdCBhcmNoaXRlY3R1cmUuICBTdXBwb3J0cyBhdXRvbWF0aWMgdGVzdCBkaXNjb3ZlcnksIGEgcmljaCBzZXQgb2YKK2Fzc2VydGlvbnMsIHVzZXItZGVmaW5lZCBhc3NlcnRpb25zLCBkZWF0aCB0ZXN0cywgZmF0YWwgYW5kIG5vbi1mYXRhbAorZmFpbHVyZXMsIHZhcmlvdXMgb3B0aW9ucyBmb3IgcnVubmluZyB0aGUgdGVzdHMsIGFuZCBYTUwgdGVzdCByZXBvcnQKK2dlbmVyYXRpb24uCisKK1BsZWFzZSBzZWUgdGhlIHByb2plY3QgcGFnZSBhYm92ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHRoZQorbWFpbGluZyBsaXN0IGZvciBxdWVzdGlvbnMsIGRpc2N1c3Npb25zLCBhbmQgZGV2ZWxvcG1lbnQuICBUaGVyZSBpcworYWxzbyBhbiBJUkMgY2hhbm5lbCBvbiBPRlRDIChpcmMub2Z0Yy5uZXQpICNndGVzdCBhdmFpbGFibGUuICBQbGVhc2UKK2pvaW4gdXMhCisKK1JlcXVpcmVtZW50cyBmb3IgRW5kIFVzZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHb29nbGUgVGVzdCBpcyBkZXNpZ25lZCB0byBoYXZlIGZhaXJseSBtaW5pbWFsIHJlcXVpcmVtZW50cyB0byBidWlsZAorYW5kIHVzZSB3aXRoIHlvdXIgcHJvamVjdHMsIGJ1dCB0aGVyZSBhcmUgc29tZS4gIEN1cnJlbnRseSwgd2Ugc3VwcG9ydAorTGludXgsIFdpbmRvd3MsIE1hYyBPUyBYLCBhbmQgQ3lnd2luLiAgV2Ugd2lsbCBhbHNvIG1ha2Ugb3VyIGJlc3QKK2VmZm9ydCB0byBzdXBwb3J0IG90aGVyIHBsYXRmb3JtcyAoZS5nLiBTb2xhcmlzLCBBSVgsIGFuZCB6L09TKS4KK0hvd2V2ZXIsIHNpbmNlIGNvcmUgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgcHJvamVjdCBoYXZlIG5vIGFjY2VzcwordG8gdGhlc2UgcGxhdGZvcm1zLCBHb29nbGUgVGVzdCBtYXkgaGF2ZSBvdXRzdGFuZGluZyBpc3N1ZXMgdGhlcmUuICBJZgoreW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQorZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLiAgUGF0Y2hlcyBmb3IgZml4aW5nIHRoZW0gYXJlCitldmVuIG1vcmUgd2VsY29tZSEKKworIyMjIExpbnV4IFJlcXVpcmVtZW50cyAjIyMKKworVGhlc2UgYXJlIHRoZSBiYXNlIHJlcXVpcmVtZW50cyB0byBidWlsZCBhbmQgdXNlIEdvb2dsZSBUZXN0IGZyb20gYSBzb3VyY2UKK3BhY2thZ2UgKGFzIGRlc2NyaWJlZCBiZWxvdyk6CisgICogR05VLWNvbXBhdGlibGUgTWFrZSBvciBnbWFrZQorICAqIFBPU0lYLXN0YW5kYXJkIHNoZWxsCisgICogUE9TSVgoLTIpIFJlZ3VsYXIgRXhwcmVzc2lvbnMgKHJlZ2V4LmgpCisgICogQSBDKys5OC1zdGFuZGFyZC1jb21wbGlhbnQgY29tcGlsZXIKKworIyMjIFdpbmRvd3MgUmVxdWlyZW1lbnRzICMjIworCisgICogTWljcm9zb2Z0IFZpc3VhbCBDKysgNy4xIG9yIG5ld2VyCisKKyMjIyBDeWd3aW4gUmVxdWlyZW1lbnRzICMjIworCisgICogQ3lnd2luIDEuNS4yNS0xNCBvciBuZXdlcgorCisjIyMgTWFjIE9TIFggUmVxdWlyZW1lbnRzICMjIworCisgICogTWFjIE9TIFggMTAuNCBUaWdlciBvciBuZXdlcgorICAqIERldmVsb3BlciBUb29scyBJbnN0YWxsZWQKKworQWxzbywgeW91J2xsIG5lZWQgQ01ha2UgMi42LjQgb3IgaGlnaGVyIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZQorc2FtcGxlcyB1c2luZyB0aGUgcHJvdmlkZWQgQ01ha2Ugc2NyaXB0LCByZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybS4KKworUmVxdWlyZW1lbnRzIGZvciBDb250cmlidXRvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4gIElmIHlvdSBwbGFuIHRvIGNvbnRyaWJ1dGUgYSBwYXRjaCwgeW91IG5lZWQgdG8KK2J1aWxkIEdvb2dsZSBUZXN0IGFuZCBpdHMgb3duIHRlc3RzIGZyb20gYW4gU1ZOIGNoZWNrb3V0IChkZXNjcmliZWQKK2JlbG93KSwgd2hpY2ggaGFzIGZ1cnRoZXIgcmVxdWlyZW1lbnRzOgorCisgICogUHl0aG9uIHZlcnNpb24gMi4zIG9yIG5ld2VyIChmb3IgcnVubmluZyBzb21lIG9mIHRoZSB0ZXN0cyBhbmQKKyAgICByZS1nZW5lcmF0aW5nIGNlcnRhaW4gc291cmNlIGZpbGVzIGZyb20gdGVtcGxhdGVzKQorICAqIENNYWtlIDIuNi40IG9yIG5ld2VyCisKK0dldHRpbmcgdGhlIFNvdXJjZQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSB0d28gcHJpbWFyeSB3YXlzIG9mIGdldHRpbmcgR29vZ2xlIFRlc3QncyBzb3VyY2UgY29kZTogeW91CitjYW4gZG93bmxvYWQgYSBzdGFibGUgc291cmNlIHJlbGVhc2UgaW4geW91ciBwcmVmZXJyZWQgYXJjaGl2ZSBmb3JtYXQsCitvciBkaXJlY3RseSBjaGVjayBvdXQgdGhlIHNvdXJjZSBmcm9tIG91ciBTdWJ2ZXJzaW9uIChTVk4pIHJlcG9zaXRhcnkuCitUaGUgU1ZOIGNoZWNrb3V0IHJlcXVpcmVzIGEgZmV3IGV4dHJhIHN0ZXBzIGFuZCBzb21lIGV4dHJhIHNvZnR3YXJlCitwYWNrYWdlcyBvbiB5b3VyIHN5c3RlbSwgYnV0IGxldHMgeW91IHRyYWNrIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgYW5kCittYWtlIHBhdGNoZXMgbXVjaCBtb3JlIGVhc2lseSwgc28gd2UgaGlnaGx5IGVuY291cmFnZSBpdC4KKworIyMjIFNvdXJjZSBQYWNrYWdlICMjIworCitHb29nbGUgVGVzdCBpcyByZWxlYXNlZCBpbiB2ZXJzaW9uZWQgc291cmNlIHBhY2thZ2VzIHdoaWNoIGNhbiBiZQorZG93bmxvYWRlZCBmcm9tIHRoZSBkb3dubG9hZCBwYWdlIFsxXS4gIFNldmVyYWwgZGlmZmVyZW50IGFyY2hpdmUKK2Zvcm1hdHMgYXJlIHByb3ZpZGVkLCBidXQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgdG9vbHMgdXNlZCB0bworbWFuaXB1bGF0ZSB0aGVtLCBhbmQgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBmaWxlLiAgRG93bmxvYWQKK3doaWNoZXZlciB5b3UgYXJlIG1vc3QgY29tZm9ydGFibGUgd2l0aC4KKworICBbMV0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvZG93bmxvYWRzL2xpc3QKKworT25jZSB0aGUgcGFja2FnZSBpcyBkb3dubG9hZGVkLCBleHBhbmQgaXQgdXNpbmcgd2hpY2hldmVyIHRvb2xzIHlvdQorcHJlZmVyIGZvciB0aGF0IHR5cGUuICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZQorbmFtZSAiZ3Rlc3QtWC5ZLloiIHdoaWNoIGNvbnRhaW5zIGFsbCBvZiB0aGUgc291cmNlIGNvZGUuICBIZXJlIGFyZQorc29tZSBleGFtcGxlcyBvbiBMaW51eDoKKworICB0YXIgLXh2emYgZ3Rlc3QtWC5ZLloudGFyLmd6CisgIHRhciAteHZqZiBndGVzdC1YLlkuWi50YXIuYnoyCisgIHVuemlwIGd0ZXN0LVguWS5aLnppcAorCisjIyMgU1ZOIENoZWNrb3V0ICMjIworCitUbyBjaGVjayBvdXQgdGhlIG1haW4gYnJhbmNoIChhbHNvIGtub3duIGFzIHRoZSAidHJ1bmsiKSBvZiBHb29nbGUKK1Rlc3QsIHJ1biB0aGUgZm9sbG93aW5nIFN1YnZlcnNpb24gY29tbWFuZDoKKworICBzdm4gY2hlY2tvdXQgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLyBndGVzdC1zdm4KKworU2V0dGluZyB1cCB0aGUgQnVpbGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGJ1aWxkIEdvb2dsZSBUZXN0IGFuZCB5b3VyIHRlc3RzIHRoYXQgdXNlIGl0LCB5b3UgbmVlZCB0byB0ZWxsIHlvdXIKK2J1aWxkIHN5c3RlbSB3aGVyZSB0byBmaW5kIGl0cyBoZWFkZXJzIGFuZCBzb3VyY2UgZmlsZXMuICBUaGUgZXhhY3QKK3dheSB0byBkbyBpdCBkZXBlbmRzIG9uIHdoaWNoIGJ1aWxkIHN5c3RlbSB5b3UgdXNlLCBhbmQgaXMgdXN1YWxseQorc3RyYWlnaHRmb3J3YXJkLgorCisjIyMgR2VuZXJpYyBCdWlsZCBJbnN0cnVjdGlvbnMgIyMjCisKK1N1cHBvc2UgeW91IHB1dCBHb29nbGUgVGVzdCBpbiBkaXJlY3RvcnkgJHtHVEVTVF9ESVJ9LiAgVG8gYnVpbGQgaXQsCitjcmVhdGUgYSBsaWJyYXJ5IGJ1aWxkIHRhcmdldCAob3IgYSBwcm9qZWN0IGFzIGNhbGxlZCBieSBWaXN1YWwgU3R1ZGlvCithbmQgWGNvZGUpIHRvIGNvbXBpbGUKKworICAke0dURVNUX0RJUn0vc3JjL2d0ZXN0LWFsbC5jYworCit3aXRoCisKKyAgJHtHVEVTVF9ESVJ9L2luY2x1ZGUgYW5kICR7R1RFU1RfRElSfQorCitpbiB0aGUgaGVhZGVyIHNlYXJjaCBwYXRoLiAgQXNzdW1pbmcgYSBMaW51eC1saWtlIHN5c3RlbSBhbmQgZ2NjLAorc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyB3aWxsIGRvOgorCisgIGcrKyAtSSR7R1RFU1RfRElSfS9pbmNsdWRlIC1JJHtHVEVTVF9ESVJ9IC1jICR7R1RFU1RfRElSfS9zcmMvZ3Rlc3QtYWxsLmNjCisgIGFyIC1ydiBsaWJndGVzdC5hIGd0ZXN0LWFsbC5vCisKK05leHQsIHlvdSBzaG91bGQgY29tcGlsZSB5b3VyIHRlc3Qgc291cmNlIGZpbGUgd2l0aAorJHtHVEVTVF9ESVJ9L2luY2x1ZGUgaW4gdGhlIGhlYWRlciBzZWFyY2ggcGF0aCwgYW5kIGxpbmsgaXQgd2l0aCBndGVzdAorYW5kIGFueSBvdGhlciBuZWNlc3NhcnkgbGlicmFyaWVzOgorCisgIGcrKyAtSSR7R1RFU1RfRElSfS9pbmNsdWRlIHBhdGgvdG8veW91cl90ZXN0LmNjIGxpYmd0ZXN0LmEgLW8geW91cl90ZXN0CisKK0FzIGFuIGV4YW1wbGUsIHRoZSBtYWtlLyBkaXJlY3RvcnkgY29udGFpbnMgYSBNYWtlZmlsZSB0aGF0IHlvdSBjYW4KK3VzZSB0byBidWlsZCBHb29nbGUgVGVzdCBvbiBzeXN0ZW1zIHdoZXJlIEdOVSBtYWtlIGlzIGF2YWlsYWJsZQorKGUuZy4gTGludXgsIE1hYyBPUyBYLCBhbmQgQ3lnd2luKS4gIEl0IGRvZXNuJ3QgdHJ5IHRvIGJ1aWxkIEdvb2dsZQorVGVzdCdzIG93biB0ZXN0cy4gIEluc3RlYWQsIGl0IGp1c3QgYnVpbGRzIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5IGFuZAorYSBzYW1wbGUgdGVzdC4gIFlvdSBjYW4gdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgb3duIGJ1aWxkCitzY3JpcHQuCisKK0lmIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSBjb3JyZWN0IGZvciB5b3VyIGVudmlyb25tZW50LCB0aGUKK2ZvbGxvd2luZyBjb21tYW5kcyBzaG91bGQgc3VjY2VlZDoKKworICBjZCAke0dURVNUX0RJUn0vbWFrZQorICBtYWtlCisgIC4vc2FtcGxlMV91bml0dGVzdAorCitJZiB5b3Ugc2VlIGVycm9ycywgdHJ5IHRvIHR3ZWFrIHRoZSBjb250ZW50cyBvZiBtYWtlL01ha2VmaWxlIHRvIG1ha2UKK3RoZW0gZ28gYXdheS4gIFRoZXJlIGFyZSBpbnN0cnVjdGlvbnMgaW4gbWFrZS9NYWtlZmlsZSBvbiBob3cgdG8gZG8KK2l0LgorCisjIyMgVXNpbmcgQ01ha2UgIyMjCisKK0dvb2dsZSBUZXN0IGNvbWVzIHdpdGggYSBDTWFrZSBidWlsZCBzY3JpcHQgKENNYWtlTGlzdHMudHh0KSB0aGF0IGNhbgorYmUgdXNlZCBvbiBhIHdpZGUgcmFuZ2Ugb2YgcGxhdGZvcm1zICgiQyIgc3RhbmRzIGZvciBjcm9zcy1wbGF0b2ZybS4pLgorSWYgeW91IGRvbid0IGhhdmUgQ01ha2UgaW5zdGFsbGVkIGFscmVhZHksIHlvdSBjYW4gZG93bmxvYWQgaXQgZm9yCitmcmVlIGZyb20gaHR0cDovL3d3dy5jbWFrZS5vcmcvLgorCitDTWFrZSB3b3JrcyBieSBnZW5lcmF0aW5nIG5hdGl2ZSBtYWtlZmlsZXMgb3IgYnVpbGQgcHJvamVjdHMgdGhhdCBjYW4KK2JlIHVzZWQgaW4gdGhlIGNvbXBpbGVyIGVudmlyb25tZW50IG9mIHlvdXIgY2hvaWNlLiAgVGhlIHR5cGljYWwKK3dvcmtmbG93IHN0YXJ0cyB3aXRoOgorCisgIG1rZGlyIG15YnVpbGQgICAgICAgIyBDcmVhdGUgYSBkaXJlY3RvcnkgdG8gaG9sZCB0aGUgYnVpbGQgb3V0cHV0LgorICBjZCBteWJ1aWxkCisgIGNtYWtlICR7R1RFU1RfRElSfSAgIyBHZW5lcmF0ZSBuYXRpdmUgYnVpbGQgc2NyaXB0cy4KKworSWYgeW91IHdhbnQgdG8gYnVpbGQgR29vZ2xlIFRlc3QncyBzYW1wbGVzLCB5b3Ugc2hvdWxkIHJlcGxhY2UgdGhlCitsYXN0IGNvbW1hbmQgd2l0aAorCisgIGNtYWtlIC1EZ3Rlc3RfYnVpbGRfc2FtcGxlcz1PTiAke0dURVNUX0RJUn0KKworSWYgeW91IGFyZSBvbiBhICpuaXggc3lzdGVtLCB5b3Ugc2hvdWxkIG5vdyBzZWUgYSBNYWtlZmlsZSBpbiB0aGUKK2N1cnJlbnQgZGlyZWN0b3J5LiAgSnVzdCB0eXBlICdtYWtlJyB0byBidWlsZCBndGVzdC4KKworSWYgeW91IHVzZSBXaW5kb3dzIGFuZCBoYXZlIFZpc3R1YWwgU3R1ZGlvIGluc3RhbGxlZCwgYSBndGVzdC5zbG4gZmlsZQorYW5kIHNldmVyYWwgLnZjcHJvaiBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQuICBZb3UgY2FuIHRoZW4gYnVpbGQgdGhlbQordXNpbmcgVmlzdWFsIFN0dWRpby4KKworT24gTWFjIE9TIFggd2l0aCBYY29kZSBpbnN0YWxsZWQsIGEgLnhjb2RlcHJvaiBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLgorCisjIyMgTGVnYWN5IEJ1aWxkIFNjcmlwdHMgIyMjCisKK0JlZm9yZSBzZXR0bGluZyBvbiBDTWFrZSwgd2UgaGF2ZSBiZWVuIHByb3ZpZGluZyBoYW5kLW1haW50YWluZWQgYnVpbGQKK3Byb2plY3RzL3NjcmlwdHMgZm9yIFZpc3VhbCBTdHVkaW8sIFhjb2RlLCBhbmQgQXV0b3Rvb2xzLiAgV2hpbGUgd2UKK2NvbnRpbnVlIHRvIHByb3ZpZGUgdGhlbSBmb3IgY29udmVuaWVuY2UsIHRoZXkgYXJlIG5vdCBhY3RpdmVseQorbWFpbnRhaW5lZCBhbnkgbW9yZS4gIFdlIGhpZ2hseSByZWNvbW1lbmQgdGhhdCB5b3UgZm9sbG93IHRoZQoraW5zdHJ1Y3Rpb25zIGluIHRoZSBwcmV2aW91cyB0d28gc2VjdGlvbnMgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0Cit3aXRoIHlvdXIgZXhpc3RpbmcgYnVpbGQgc3lzdGVtLgorCitJZiB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgdGhlIGxlZ2FjeSBidWlsZCBzY3JpcHRzLCBoZXJlJ3MgaG93OgorCitUaGUgbXN2Y1wgZm9sZGVyIGNvbnRhaW5zIHR3byBzb2x1dGlvbnMgd2l0aCBWaXN1YWwgQysrIHByb2plY3RzLgorT3BlbiB0aGUgZ3Rlc3Quc2xuIG9yIGd0ZXN0LW1kLnNsbiBmaWxlIHVzaW5nIFZpc3VhbCBTdHVkaW8sIGFuZCB5b3UKK2FyZSByZWFkeSB0byBidWlsZCBHb29nbGUgVGVzdCB0aGUgc2FtZSB3YXkgeW91IGJ1aWxkIGFueSBWaXN1YWwKK1N0dWRpbyBwcm9qZWN0LiAgRmlsZXMgdGhhdCBoYXZlIG5hbWVzIGVuZGluZyB3aXRoIC1tZCB1c2UgRExMCit2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgcnVudGltZSBsaWJyYXJpZXMgKHRoZSAvTUQgb3IgdGhlIC9NRGQgY29tcGlsZXIKK29wdGlvbikuICBGaWxlcyB3aXRob3V0IHRoYXQgc3VmZml4IHVzZSBzdGF0aWMgdmVyc2lvbnMgb2YgdGhlIHJ1bnRpbWUKK2xpYnJhcmllcyAodGhlIC9NVCBvciB0aGUgL01UZCBvcHRpb24pLiAgUGxlYXNlIG5vdGUgdGhhdCBvbmUgbXVzdCB1c2UKK3RoZSBzYW1lIG9wdGlvbiB0byBjb21waWxlIGJvdGggZ3Rlc3QgYW5kIHRoZSB0ZXN0IGNvZGUuICBJZiB5b3UgdXNlCitWaXN1YWwgU3R1ZGlvIDIwMDUgb3IgYWJvdmUsIHdlIHJlY29tbWVuZCB0aGUgLW1kIHZlcnNpb24gYXMgL01EIGlzCit0aGUgZGVmYXVsdCBmb3IgbmV3IHByb2plY3RzIGluIHRoZXNlIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8uCisKK09uIE1hYyBPUyBYLCBvcGVuIHRoZSBndGVzdC54Y29kZXByb2ogaW4gdGhlIHhjb2RlLyBmb2xkZXIgdXNpbmcKK1hjb2RlLiAgQnVpbGQgdGhlICJndGVzdCIgdGFyZ2V0LiAgVGhlIHVuaXZlcnNhbCBiaW5hcnkgZnJhbWV3b3JrIHdpbGwKK2VuZCB1cCBpbiB5b3VyIHNlbGVjdGVkIGJ1aWxkIGRpcmVjdG9yeSAoc2VsZWN0ZWQgaW4gdGhlIFhjb2RlCisiUHJlZmVyZW5jZXMuLi4iIC0+ICJCdWlsZGluZyIgcGFuZSBhbmQgZGVmYXVsdHMgdG8geGNvZGUvYnVpbGQpLgorQWx0ZXJuYXRpdmVseSwgYXQgdGhlIGNvbW1hbmQgbGluZSwgZW50ZXI6CisKKyAgeGNvZGVidWlsZAorCitUaGlzIHdpbGwgYnVpbGQgdGhlICJSZWxlYXNlIiBjb25maWd1cmF0aW9uIG9mIGd0ZXN0LmZyYW1ld29yayBpbiB5b3VyCitkZWZhdWx0IGJ1aWxkIGxvY2F0aW9uLiAgU2VlIHRoZSAieGNvZGVidWlsZCIgbWFuIHBhZ2UgZm9yIG1vcmUKK2luZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhbmQgYnVpbGRpbmcgaW4KK2RpZmZlcmVudCBsb2NhdGlvbnMuCisKK0lmIHlvdSB3aXNoIHRvIHVzZSB0aGUgR29vZ2xlIFRlc3QgWGNvZGUgcHJvamVjdCB3aXRoIFhjb2RlIDQueCBhbmQKK2Fib3ZlLCB5b3UgbmVlZCB0byBlaXRoZXI6CisgKiB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4geGNvZGUvQ29uZmlnL0dlbmVyYWwueGNvbmZpZy4KKyAgIENvbW1lbnQgb3B0aW9ucyBTREtST09ULCBNQUNPU19ERVBMT1lNRU5UX1RBUkdFVCwgYW5kIEdDQ19WRVJTSU9OLiBJZgorICAgeW91IGNob29zZSB0aGlzIHJvdXRlIHlvdSBsb3NlIHRoZSBhYmlsaXR5IHRvIHRhcmdldCBlYXJsaWVyIHZlcnNpb25zCisgICBvZiBNYWNPUyBYLgorICogSW5zdGFsbCBhbiBTREsgZm9yIGFuIGVhcmxpZXIgdmVyc2lvbi4gVGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZQorICAgc3VwcG9ydGVkIGJ5IEFwcGxlLCBidXQgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gd29yaworICAgKGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTM3ODUxOCkuCisKK1R3ZWFraW5nIEdvb2dsZSBUZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHb29nbGUgVGVzdCBjYW4gYmUgdXNlZCBpbiBkaXZlcnNlIGVudmlyb25tZW50cy4gIFRoZSBkZWZhdWx0Citjb25maWd1cmF0aW9uIG1heSBub3Qgd29yayAob3IgbWF5IG5vdCB3b3JrIHdlbGwpIG91dCBvZiB0aGUgYm94IGluCitzb21lIGVudmlyb25tZW50cy4gIEhvd2V2ZXIsIHlvdSBjYW4gZWFzaWx5IHR3ZWFrIEdvb2dsZSBUZXN0IGJ5CitkZWZpbmluZyBjb250cm9sIG1hY3JvcyBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lLiAgR2VuZXJhbGx5LAordGhlc2UgbWFjcm9zIGFyZSBuYW1lZCBsaWtlIEdURVNUX1hZWiBhbmQgeW91IGRlZmluZSB0aGVtIHRvIGVpdGhlciAxCitvciAwIHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgY2VydGFpbiBmZWF0dXJlLgorCitXZSBsaXN0IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBtYWNyb3MgYmVsb3cuICBGb3IgYSBjb21wbGV0ZSBsaXN0LAorc2VlIGZpbGUgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmguCisKKyMjIyBDaG9vc2luZyBhIFRSMSBUdXBsZSBMaWJyYXJ5ICMjIworCitTb21lIEdvb2dsZSBUZXN0IGZlYXR1cmVzIHJlcXVpcmUgdGhlIEMrKyBUZWNobmljYWwgUmVwb3J0IDEgKFRSMSkKK3R1cGxlIGxpYnJhcnksIHdoaWNoIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIHdpdGggYWxsIGNvbXBpbGVycy4gIFRoZQorZ29vZCBuZXdzIGlzIHRoYXQgR29vZ2xlIFRlc3QgaW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgdGhhdCdzCitlbm91Z2ggZm9yIGl0cyBvd24gbmVlZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB1c2UgdGhpcyB3aGVuIHRoZQorY29tcGlsZXIgZG9lc24ndCBwcm92aWRlIFRSMSB0dXBsZS4KKworVXN1YWxseSB5b3UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHdoaWNoIHR1cGxlIGxpYnJhcnkgR29vZ2xlIFRlc3QKK3VzZXMuICBIb3dldmVyLCBpZiB5b3VyIHByb2plY3QgYWxyZWFkeSB1c2VzIFRSMSB0dXBsZSwgeW91IG5lZWQgdG8KK3RlbGwgR29vZ2xlIFRlc3QgdG8gdXNlIHRoZSBzYW1lIFRSMSB0dXBsZSBsaWJyYXJ5IHRoZSByZXN0IG9mIHlvdXIKK3Byb2plY3QgdXNlcywgb3IgdGhlIHR3byB0dXBsZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBjbGFzaC4gIFRvIGRvCit0aGF0LCBhZGQKKworICAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTAKKwordG8gdGhlIGNvbXBpbGVyIGZsYWdzIHdoaWxlIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhbmQgeW91ciB0ZXN0cy4gIElmCit5b3Ugd2FudCB0byBmb3JjZSBHb29nbGUgVGVzdCB0byB1c2UgaXRzIG93biB0dXBsZSBsaWJyYXJ5LCBqdXN0IGFkZAorCisgIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MgaW5zdGVhZC4KKworSWYgeW91IGRvbid0IHdhbnQgR29vZ2xlIFRlc3QgdG8gdXNlIHR1cGxlIGF0IGFsbCwgYWRkCisKKyAgLURHVEVTVF9IQVNfVFIxX1RVUExFPTAKKworYW5kIGFsbCBmZWF0dXJlcyB1c2luZyB0dXBsZSB3aWxsIGJlIGRpc2FibGVkLgorCisjIyMgTXVsdGktdGhyZWFkZWQgVGVzdHMgIyMjCisKK0dvb2dsZSBUZXN0IGlzIHRocmVhZC1zYWZlIHdoZXJlIHRoZSBwdGhyZWFkIGxpYnJhcnkgaXMgYXZhaWxhYmxlLgorQWZ0ZXIgI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiLCB5b3UgY2FuIGNoZWNrIHRoZSBHVEVTVF9JU19USFJFQURTQUZFCittYWNybyB0byBzZWUgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlICh5ZXMgaWYgdGhlIG1hY3JvIGlzICNkZWZpbmVkIHRvCisxLCBubyBpZiBpdCdzIHVuZGVmaW5lZC4pLgorCitJZiBHb29nbGUgVGVzdCBkb2Vzbid0IGNvcnJlY3RseSBkZXRlY3Qgd2hldGhlciBwdGhyZWFkIGlzIGF2YWlsYWJsZQoraW4geW91ciBlbnZpcm9ubWVudCwgeW91IGNhbiBmb3JjZSBpdCB3aXRoCisKKyAgLURHVEVTVF9IQVNfUFRIUkVBRD0xCisKK29yCisKKyAgLURHVEVTVF9IQVNfUFRIUkVBRD0wCisKK1doZW4gR29vZ2xlIFRlc3QgdXNlcyBwdGhyZWFkLCB5b3UgbWF5IG5lZWQgdG8gYWRkIGZsYWdzIHRvIHlvdXIKK2NvbXBpbGVyIGFuZC9vciBsaW5rZXIgdG8gc2VsZWN0IHRoZSBwdGhyZWFkIGxpYnJhcnksIG9yIHlvdSdsbCBnZXQKK2xpbmsgZXJyb3JzLiAgSWYgeW91IHVzZSB0aGUgQ01ha2Ugc2NyaXB0IG9yIHRoZSBkZXByZWNhdGVkIEF1dG90b29scworc2NyaXB0LCB0aGlzIGlzIHRha2VuIGNhcmUgb2YgZm9yIHlvdS4gIElmIHlvdSB1c2UgeW91ciBvd24gYnVpbGQKK3NjcmlwdCwgeW91J2xsIG5lZWQgdG8gcmVhZCB5b3VyIGNvbXBpbGVyIGFuZCBsaW5rZXIncyBtYW51YWwgdG8KK2ZpZ3VyZSBvdXQgd2hhdCBmbGFncyB0byBhZGQuCisKKyMjIyBBcyBhIFNoYXJlZCBMaWJyYXJ5IChETEwpICMjIworCitHb29nbGUgVGVzdCBpcyBjb21wYWN0LCBzbyBtb3N0IHVzZXJzIGNhbiBidWlsZCBhbmQgbGluayBpdCBhcyBhCitzdGF0aWMgbGlicmFyeSBmb3IgdGhlIHNpbXBsaWNpdHkuICBZb3UgY2FuIGNob29zZSB0byB1c2UgR29vZ2xlIFRlc3QKK2FzIGEgc2hhcmVkIGxpYnJhcnkgKGtub3duIGFzIGEgRExMIG9uIFdpbmRvd3MpIGlmIHlvdSBwcmVmZXIuCisKK1RvIGNvbXBpbGUgKmd0ZXN0KiBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBhZGQKKworICAtREdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWT0xCisKK3RvIHRoZSBjb21waWxlciBmbGFncy4gIFlvdSdsbCBhbHNvIG5lZWQgdG8gdGVsbCB0aGUgbGlua2VyIHRvIHByb2R1Y2UKK2Egc2hhcmVkIGxpYnJhcnkgaW5zdGVhZCAtIGNvbnN1bHQgeW91ciBsaW5rZXIncyBtYW51YWwgZm9yIGhvdyB0byBkbworaXQuCisKK1RvIGNvbXBpbGUgeW91ciAqdGVzdHMqIHRoYXQgdXNlIHRoZSBndGVzdCBzaGFyZWQgbGlicmFyeSwgYWRkCisKKyAgLURHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MuCisKK05vdGU6IHdoaWxlIHRoZSBhYm92ZSBzdGVwcyBhcmVuJ3QgdGVjaG5pY2FsbHkgbmVjZXNzYXJ5IHRvZGF5IHdoZW4KK3VzaW5nIHNvbWUgY29tcGlsZXJzIChlLmcuIEdDQyksIHRoZXkgbWF5IGJlY29tZSBuZWNlc3NhcnkgaW4gdGhlCitmdXR1cmUsIGlmIHdlIGRlY2lkZSB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBsb2FkaW5nIHRoZSBsaWJyYXJ5IChzZWUKK2h0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIGRldGFpbHMpLiAgVGhlcmVmb3JlIHlvdSBhcmUKK3JlY29tbWVuZGVkIHRvIGFsd2F5cyBhZGQgdGhlIGFib3ZlIGZsYWdzIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYQorc2hhcmVkIGxpYnJhcnkuICBPdGhlcndpc2UgYSBmdXR1cmUgcmVsZWFzZSBvZiBHb29nbGUgVGVzdCBtYXkgYnJlYWsKK3lvdXIgYnVpbGQgc2NyaXB0LgorCisjIyMgQXZvaWRpbmcgTWFjcm8gTmFtZSBDbGFzaGVzICMjIworCitJbiBDKyssIG1hY3JvcyBkb24ndCBvYmV5IG5hbWVzcGFjZXMuICBUaGVyZWZvcmUgdHdvIGxpYnJhcmllcyB0aGF0Citib3RoIGRlZmluZSBhIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgd2lsbCBjbGFzaCBpZiB5b3UgI2luY2x1ZGUgYm90aAorZGVmaW5pdGlvbnMuICBJbiBjYXNlIGEgR29vZ2xlIFRlc3QgbWFjcm8gY2xhc2hlcyB3aXRoIGFub3RoZXIKK2xpYnJhcnksIHlvdSBjYW4gZm9yY2UgR29vZ2xlIFRlc3QgdG8gcmVuYW1lIGl0cyBtYWNybyB0byBhdm9pZCB0aGUKK2NvbmZsaWN0LgorCitTcGVjaWZpY2FsbHksIGlmIGJvdGggR29vZ2xlIFRlc3QgYW5kIHNvbWUgb3RoZXIgY29kZSBkZWZpbmUgbWFjcm8KK0ZPTywgeW91IGNhbiBhZGQKKworICAtREdURVNUX0RPTlRfREVGSU5FX0ZPTz0xCisKK3RvIHRoZSBjb21waWxlciBmbGFncyB0byB0ZWxsIEdvb2dsZSBUZXN0IHRvIGNoYW5nZSB0aGUgbWFjcm8ncyBuYW1lCitmcm9tIEZPTyB0byBHVEVTVF9GT08uICBDdXJyZW50bHkgRk9PIGNhbiBiZSBGQUlMLCBTVUNDRUVELCBvciBURVNULgorRm9yIGV4YW1wbGUsIHdpdGggLURHVEVTVF9ET05UX0RFRklORV9URVNUPTEsIHlvdSdsbCBuZWVkIHRvIHdyaXRlCisKKyAgR1RFU1RfVEVTVChTb21lVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KKworaW5zdGVhZCBvZgorCisgIFRFU1QoU29tZVRlc3QsIERvZXNUaGlzKSB7IC4uLiB9CisKK2luIG9yZGVyIHRvIGRlZmluZSBhIHRlc3QuCisKK1VwZ3JhdGluZyBmcm9tIGFuIEVhcmxpZXIgVmVyc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHN0cml2ZSB0byBrZWVwIEdvb2dsZSBUZXN0IHJlbGVhc2VzIGJhY2t3YXJkIGNvbXBhdGlibGUuCitTb21ldGltZXMsIHRob3VnaCwgd2UgaGF2ZSB0byBtYWtlIHNvbWUgYnJlYWtpbmcgY2hhbmdlcyBmb3IgdGhlCit1c2VycycgbG9uZy10ZXJtIGJlbmVmaXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB3aGF0IHlvdSdsbCBuZWVkIHRvCitkbyBpZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBHb29nbGUgVGVzdC4KKworIyMjIFVwZ3JhZGluZyBmcm9tIDEuMy4wIG9yIEVhcmxpZXIgIyMjCisKK1lvdSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IGVuYWJsZSBvciBkaXNhYmxlIEdvb2dsZSBUZXN0J3Mgb3duIFRSMQordHVwbGUgbGlicmFyeS4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHNlY3Rpb24gIkNob29zaW5nIGEgVFIxIFR1cGxlCitMaWJyYXJ5Ii4KKworIyMjIFVwZ3JhZGluZyBmcm9tIDEuNC4wIG9yIEVhcmxpZXIgIyMjCisKK1RoZSBBdXRvdG9vbHMgYnVpbGQgc2NyaXB0IChjb25maWd1cmUgKyBtYWtlKSBpcyBubyBsb25nZXIgb2ZmaWNpYWxseQorc3VwcG9ydHRlZC4gIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHlvdXIgb3duIGJ1aWxkIHN5c3RlbSBvcgordXNlIENNYWtlLiAgSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIEF1dG90b29scywgeW91IGNhbiBmaW5kCitpbnN0cnVjdGlvbnMgaW4gdGhlIFJFQURNRSBmaWxlIGZyb20gR29vZ2xlIFRlc3QgMS40LjAuCisKK09uIHBsYXRmb3JtcyB3aGVyZSB0aGUgcHRocmVhZCBsaWJyYXJ5IGlzIGF2YWlsYWJsZSwgR29vZ2xlIFRlc3QgdXNlcworaXQgaW4gb3JkZXIgdG8gYmUgdGhyZWFkLXNhZmUuICBTZWUgdGhlICJNdWx0aS10aHJlYWRlZCBUZXN0cyIgc2VjdGlvbgorZm9yIHdoYXQgdGhpcyBtZWFucyB0byB5b3VyIGJ1aWxkIHNjcmlwdC4KKworSWYgeW91IHVzZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLCBHb29nbGUKK1Rlc3Qgd2lsbCBubyBsb25nZXIgY29tcGlsZS4gIFRoaXMgc2hvdWxkIGFmZmVjdCB2ZXJ5IGZldyBwZW9wbGUsIGFzIGEKK2xhcmdlIHBvcnRpb24gb2YgU1RMIChpbmNsdWRpbmcgPHN0cmluZz4pIGRvZXNuJ3QgY29tcGlsZSBpbiB0aGlzIG1vZGUKK2FueXdheS4gIFdlIGRlY2lkZWQgdG8gc3RvcCBzdXBwb3J0aW5nIGl0IGluIG9yZGVyIHRvIGdyZWF0bHkgc2ltcGxpZnkKK0dvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb24uCisKK0RldmVsb3BpbmcgR29vZ2xlIFRlc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGRpc2N1c3NlcyBob3cgdG8gbWFrZSB5b3VyIG93biBjaGFuZ2VzIHRvIEdvb2dsZSBUZXN0LgorCisjIyMgVGVzdGluZyBHb29nbGUgVGVzdCBJdHNlbGYgIyMjCisKK1RvIG1ha2Ugc3VyZSB5b3VyIGNoYW5nZXMgd29yayBhcyBpbnRlbmRlZCBhbmQgZG9uJ3QgYnJlYWsgZXhpc3RpbmcKK2Z1bmN0aW9uYWxpdHksIHlvdSdsbCB3YW50IHRvIGNvbXBpbGUgYW5kIHJ1biBHb29nbGUgVGVzdCdzIG93biB0ZXN0cy4KK0ZvciB0aGF0IHlvdSBjYW4gdXNlIENNYWtlOgorCisgIG1rZGlyIG15YnVpbGQKKyAgY2QgbXlidWlsZAorICBjbWFrZSAtRGd0ZXN0X2J1aWxkX3Rlc3RzPU9OICR7R1RFU1RfRElSfQorCitNYWtlIHN1cmUgeW91IGhhdmUgUHl0aG9uIGluc3RhbGxlZCwgYXMgc29tZSBvZiBHb29nbGUgVGVzdCdzIHRlc3RzCithcmUgd3JpdHRlbiBpbiBQeXRob24uICBJZiB0aGUgY21ha2UgY29tbWFuZCBjb21wbGFpbnMgYWJvdXQgbm90IGJlaW5nCithYmxlIHRvIGZpbmQgUHl0aG9uICgiQ291bGQgTk9UIGZpbmQgUHl0aG9uSW50ZXJwIChtaXNzaW5nOgorUFlUSE9OX0VYRUNVVEFCTEUpIiksIHRyeSB0ZWxsaW5nIGl0IGV4cGxpY2l0bHkgd2hlcmUgeW91ciBQeXRob24KK2V4ZWN1dGFibGUgY2FuIGJlIGZvdW5kOgorCisgIGNtYWtlIC1EUFlUSE9OX0VYRUNVVEFCTEU9cGF0aC90by9weXRob24gLURndGVzdF9idWlsZF90ZXN0cz1PTiAke0dURVNUX0RJUn0KKworTmV4dCwgeW91IGNhbiBidWlsZCBHb29nbGUgVGVzdCBhbmQgYWxsIG9mIGl0cyBvd24gdGVzdHMuICBPbiAqbml4LAordGhpcyBpcyB1c3VhbGx5IGRvbmUgYnkgJ21ha2UnLiAgVG8gcnVuIHRoZSB0ZXN0cywgZG8KKworICBtYWtlIHRlc3QKKworQWxsIHRlc3RzIHNob3VsZCBwYXNzLgorCisjIyMgUmVnZW5lcmF0aW5nIFNvdXJjZSBGaWxlcyAjIyMKKworU29tZSBvZiBHb29nbGUgVGVzdCdzIHNvdXJjZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGVzIChub3QKK2luIHRoZSBDKysgc2Vuc2UpIHVzaW5nIGEgc2NyaXB0LiAgQSB0ZW1wbGF0ZSBmaWxlIGlzIG5hbWVkIEZPTy5wdW1wLAord2hlcmUgRk9PIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGl0IHdpbGwgZ2VuZXJhdGUuICBGb3IgZXhhbXBsZSwgdGhlCitmaWxlIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcCBpcyB1c2VkIHRvIGdlbmVyYXRlCitndGVzdC10eXBlLXV0aWwuaCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisKK05vcm1hbGx5IHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlZ2VuZXJhdGluZyB0aGUgc291cmNlIGZpbGVzLAordW5sZXNzIHlvdSBuZWVkIHRvIG1vZGlmeSB0aGVtLiAgSW4gdGhhdCBjYXNlLCB5b3Ugc2hvdWxkIG1vZGlmeSB0aGUKK2NvcnJlc3BvbmRpbmcgLnB1bXAgZmlsZXMgaW5zdGVhZCBhbmQgcnVuIHRoZSBwdW1wLnB5IFB5dGhvbiBzY3JpcHQgdG8KK3JlZ2VuZXJhdGUgdGhlbS4gIFlvdSBjYW4gZmluZCBwdW1wLnB5IGluIHRoZSBzY3JpcHRzLyBkaXJlY3RvcnkuCitSZWFkIHRoZSBQdW1wIG1hbnVhbCBbMl0gZm9yIGhvdyB0byB1c2UgaXQuCisKKyAgWzJdIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvUHVtcE1hbnVhbAorCisjIyMgQ29udHJpYnV0aW5nIGEgUGF0Y2ggIyMjCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4gIFBsZWFzZSByZWFkIHRoZSBHb29nbGUgVGVzdCBkZXZlbG9wZXIncyBndWlkZSBbM10KK2ZvciBob3cgeW91IGNhbiBjb250cmlidXRlLiAgSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHlvdSBoYXZlIHNpZ25lZAordGhlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50LCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIGFjY2VwdCB0aGUKK3BhdGNoLgorCisgIFszXSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3REZXZHdWlkZQorCitIYXBweSB0ZXN0aW5nIQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9hY2xvY2FsLm00IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZGY5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2FjbG9jYWwubTQKQEAgLTAsMCArMSwxMTk4IEBACisjIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMS4zIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCisjIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK200X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCisgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKK200X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNjhdLCwKK1ttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42OC4KK1lvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIEl0IG1heSB3b3JrLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8uCitJZiB5b3UgaGF2ZSBwcm9ibGVtcywgeW91IG1heSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS4KK1RvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgYGF1dG9yZWNvbmYnLl0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTEgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMQorCisjIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KKyMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCisjIChUaGlzIHByaXZhdGUgbWFjcm8gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGlzIGZpbGUuKQorQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLAorW2FtX19hcGlfdmVyc2lvbj0nMS4xMScKK2RubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KK2RubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCittNF9pZihbJDFdLCBbMS4xMS4zXSwgW10sCisgICAgICBbQUNfRkFUQUwoW0RvIG5vdCBjYWxsICQwLCB1c2UgQU1fSU5JVF9BVVRPTUFLRShbJDFdKS5dKV0pZG5sCitdKQorCisjIF9BTV9BVVRPQ09ORl9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGFjbG9jYWwgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZmluZCB0aGUgQXV0b2NvbmYgdmVyc2lvbi4KKyMgVGhpcyBpcyBhIHByaXZhdGUgbWFjcm8gdG9vLiAgVXNpbmcgbTRfZGVmaW5lIHNpbXBsaWZpZXMKKyMgdGhlIGxvZ2ljIGluIGFjbG9jYWwsIHdoaWNoIGNhbiBzaW1wbHkgaWdub3JlIHRoaXMgZGVmaW5pdGlvbi4KK200X2RlZmluZShbX0FNX0FVVE9DT05GX1ZFUlNJT05dLCBbXSkKKworIyBBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIHRoZXkgY2FuIGJlIHRyYWNlZC4KKyMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBTV9JTklUX0FVVE9NQUtFLgorQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAorW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTEuM10pZG5sCittNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAorICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCitfQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSkpXSkKKworIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxCisKKyMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cworIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bworIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgorIworIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCisjIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCisjIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAorIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKKyMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKKyMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCisjIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCisjCisjICRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQorIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAorIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAorIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCisjCisjIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCisjIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5CisjIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQorIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgorIworIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKKyMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6CisjICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCisjIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcworIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQorIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgorIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCisjIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KKyMKKyMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCisjIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKKyMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgorCitBQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAorW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCitBQ19QUkVSRVEoWzIuNTBdKWRubAorIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorXSkKKworIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA5CisKKyMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBhIGNvbmRpdGlvbmFsLgorQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKK1tBQ19QUkVSRVEoMi41MilkbmwKKyBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAorCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKK0FDX1NVQlNUKFskMV9UUlVFXSlkbmwKK0FDX1NVQlNUKFskMV9GQUxTRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAorbTRfZGVmaW5lKFtfQU1fQ09ORF9WQUxVRV8kMV0sIFskMl0pZG5sCitpZiAkMjsgdGhlbgorICAkMV9UUlVFPQorICAkMV9GQUxTRT0nIycKK2Vsc2UKKyAgJDFfVFJVRT0nIycKKyAgJDFfRkFMU0U9CitmaQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKK1tpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQorZmldKV0pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA5LAorIyAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEyCisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgorIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgorIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgorIworIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKKyMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKKyMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAorIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KK0FDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKK0FDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKK0FDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCitBQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAorCitpZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKKworQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKKyAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCitbaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKKyAgZmkKKyAgYW1fX3VuaXZlcnNhbD1mYWxzZQorICBtNF9jYXNlKFskMV0sIFtDQ10sCisgICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjXSwKKyAgICBbQ1hYXSwKKyAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCisgICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7CisgICAgIGVzYWNdKQorCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgZ2NjKQorICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KKyAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCisgICAgICA7OworICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorXSkKK0FDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQorQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKK10pCisKKworIyBBTV9TRVRfREVQRElSCisjIC0tLS0tLS0tLS0tLS0KKyMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCisjIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUworQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCitBQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCitdKQorCisKKyMgQU1fREVQX1RSQUNLCisjIC0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sCitbQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAorWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAorICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKKyAgQU1ERVBCQUNLU0xBU0g9J1wnCisgIGFtX19ub2RlcD0nX25vJworZmkKK0FNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQorQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCitBQ19TVUJTVChbYW1fX25vZGVwXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFthbV9fbm9kZXBdKWRubAorXSkKKworIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjc2VyaWFsIDUKKworIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1t7CisgICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCisgICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKKyAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCisgIGNhc2UgJENPTkZJR19GSUxFUyBpbgorICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OworICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKKyAgZXNhYworICBzaGlmdAorICBmb3IgbWYKKyAgZG8KKyAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCisgICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0CisgICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCisgICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCisgICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCisgICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQorICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgorICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0CisgICAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKKyAgICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAgICMgZXhwYW5zaW9uLgorICAgIGZvciBmaWxlIGluIGBzZWQgLW4gIgorICAgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisJIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbworICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKKyAgICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKKyAgICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKKyAgICBkb25lCisgIGRvbmUKK30KK10pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKworCisjIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KKyMKKyMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZworIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCisjIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCitBQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAorICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKKyAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQorXSkKKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyMgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxNgorCisjIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgorIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorCisjIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCisjIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKKyMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQorIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KKyMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KKyMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCisjIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCisjIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKKyMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KK0FDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKK1tBQ19QUkVSRVEoWzIuNjJdKWRubAorZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKK2RubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgorbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCisgICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0CisgICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKKyAgQUNfU1VCU1QoW2FtX19pc3JjXSwgWycgLUkkKHNyY2RpciknXSlfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKWRubAorICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCisgIGZpCitmaQorCisjIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKK2lmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCisgIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKKyAgZWxzZQorICAgIENZR1BBVEhfVz1lY2hvCisgIGZpCitmaQorQUNfU1VCU1QoW0NZR1BBVEhfV10pCisKKyMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KK2RubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgorbTRfaWZ2YWwoWyQyXSwKK1ttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKKyBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCisgQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCitbX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCitkbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KK200X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAorICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKKworX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCitbQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQorIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKK0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAorQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCisJICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCisJCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCitfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKKwkJCSAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCisJCQkgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfT0JKQ10sCisJCQkgIGRlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldKV0pZG5sCitdKQorX0FNX0lGX09QVElPTihbc2lsZW50LXJ1bGVzXSwgW0FDX1JFUVVJUkUoW0FNX1NJTEVOVF9SVUxFU10pXSlkbmwKK2RubCBUaGUgYHBhcmFsbGVsLXRlc3RzJyBkcml2ZXIgbWF5IG5lZWQgdG8ga25vdyBhYm91dCBFWEVFWFQsIHNvIGFkZCB0aGUKK2RubCBgYW1fX0VYRUVYVCcgY29uZGl0aW9uYWwgaWYgX0FNX0NPTVBJTEVSX0VYRUVYVCB3YXMgc2Vlbi4gIFRoaXMgbWFjcm8KK2RubCBpcyBob29rZWQgb250byBfQUNfQ09NUElMRVJfRVhFRVhUIGVhcmx5LCBzZWUgYmVsb3cuCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKGRubAorW200X3Byb3ZpZGVfaWYoW19BTV9DT01QSUxFUl9FWEVFWFRdLAorICBbQU1fQ09ORElUSU9OQUwoW2FtX19FWEVFWFRdLCBbdGVzdCAtbiAiJEVYRUVYVCJdKV0pXSlkbmwKK10pCisKK2RubCBIb29rIGludG8gYF9BQ19DT01QSUxFUl9FWEVFWFQnIGVhcmx5IHRvIGxlYXJuIGl0cyBleHBhbnNpb24uICBEbyBub3QKK2RubCBhZGQgdGhlIGNvbmRpdGlvbmFsIHJpZ2h0IGhlcmUsIGFzIF9BQ19DT01QSUxFUl9FWEVFWFQgbWF5IGJlIGZ1cnRoZXIKK2RubCBtYW5nbGVkIGJ5IEF1dG9jb25mIGFuZCBydW4gaW4gYSBzaGVsbCBjb25kaXRpb25hbCBzdGF0ZW1lbnQuCittNF9kZWZpbmUoW19BQ19DT01QSUxFUl9FWEVFWFRdLAorbTRfZGVmbihbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW200X3Byb3ZpZGUoW19BTV9DT01QSUxFUl9FWEVFWFRdKV0pCisKKworIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKKyMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgorCisjIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCisjIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKKyMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgorQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAorWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9JDEKK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBBTV9QUk9HX0lOU1RBTExfU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSAkaW5zdGFsbF9zaC4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK2lmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKKyAgKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKKyAgZXNhYworZmkKK0FDX1NVQlNUKGluc3RhbGxfc2gpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcworIyB3aXRoIGEgbGVhZGluZyBkb3QuICBGb3IgaW5zdGFuY2UgTVMtRE9TIGRvZXNuJ3QuCitBQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwKK1tybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKKworIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKK0FDX1NVQlNUKFthbV9fcXVvdGVdKQorQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQorcm0gLWYgY29uZmluYyBjb25mbWYKK10pCisKKyMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNgorCisjIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAorW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCiskMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KK0FDX1NVQlNUKCQxKV0pCisKKworIyBBTV9NSVNTSU5HX0hBU19SVU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KKyMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgorQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAorQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCitpZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7CisgICopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7CisgIGVzYWMKK2ZpCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQorZmkKK10pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBBTV9QUk9HX01LRElSX1AKKyMgLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBgbWtkaXIgLXAnLgorQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sCitbQUNfUFJFUkVRKFsyLjYwXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCitkbmwgQXV0b21ha2UgMS44IHRvIDEuOS42IHVzZWQgdG8gZGVmaW5lIG1rZGlyX3AuICBXZSBub3cgdXNlIE1LRElSX1AsCitkbmwgd2hpbGUga2VlcGluZyBhIGRlZmluaXRpb24gb2YgbWtkaXJfcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK2RubCBATUtESVJfUEAgaXMgbWFnaWM6IEFDX09VVFBVVCBhZGp1c3RzIGl0cyB2YWx1ZSBmb3IgZWFjaCBNYWtlZmlsZS4KK2RubCBIb3dldmVyIHdlIGNhbm5vdCBkZWZpbmUgbWtkaXJfcCBhcyAkKE1LRElSX1ApIGZvciB0aGUgc2FrZSBvZgorZG5sIE1ha2VmaWxlLmlucyB0aGF0IGRvIG5vdCBkZWZpbmUgTUtESVJfUCwgc28gd2UgZG8gb3VyIG93bgorZG5sIGFkanVzdG1lbnQgdXNpbmcgdG9wX2J1aWxkZGlyICh3aGljaCBpcyBkZWZpbmVkIG1vcmUgb2Z0ZW4gdGhhbgorZG5sIE1LRElSX1ApLgorQUNfU1VCU1QoW21rZGlyX3BdLCBbIiRNS0RJUl9QIl0pZG5sCitjYXNlICRta2Rpcl9wIGluCisgIFtbXFwvJF1dKiB8ID86W1tcXC9dXSopIDs7CisgICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKK2VzYWMKK10pCisKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDgsIDIwMTAgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAorW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKyMgX0FNX1NFVF9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IG9wdGlvbiBOQU1FLiAgUHJlc2VudGx5IHRoYXQgb25seSBtZWFucyBkZWZpbmluZyBhIGZsYWcgZm9yIHRoaXMgb3B0aW9uLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIDEpXSkKKworIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCitbbTRfZm9yZWFjaF93KFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQorCisjIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK0FDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKK1ttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOCwgMjAwOSwKKyMgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgQU1fUEFUSF9QWVRIT04oW01JTklNVU0tVkVSU0lPTl0sIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRzIHN1cHBvcnQgZm9yIGRpc3RyaWJ1dGluZyBQeXRob24gbW9kdWxlcyBhbmQgcGFja2FnZXMuICBUbworIyBpbnN0YWxsIG1vZHVsZXMsIGNvcHkgdGhlbSB0byAkKHB5dGhvbmRpciksIHVzaW5nIHRoZSBweXRob25fUFlUSE9OCisjIGF1dG9tYWtlIHZhcmlhYmxlLiAgVG8gaW5zdGFsbCBhIHBhY2thZ2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZQorIyBhdXRvbWFrZSBwYWNrYWdlLCBpbnN0YWxsIHRvICQocGtncHl0aG9uZGlyKSwgb3IgdXNlIHRoZQorIyBwa2dweXRob25fUFlUSE9OIGF1dG9tYWtlIHZhcmlhYmxlLgorIworIyBUaGUgdmFyaWFibGVzICQocHlleGVjZGlyKSBhbmQgJChwa2dweWV4ZWNkaXIpIGFyZSBwcm92aWRlZCBhcworIyBsb2NhdGlvbnMgdG8gaW5zdGFsbCBweXRob24gZXh0ZW5zaW9uIG1vZHVsZXMgKHNoYXJlZCBsaWJyYXJpZXMpLgorIyBBbm90aGVyIG1hY3JvIGlzIHJlcXVpcmVkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIHRvIGNvbXBpbGUKKyMgZXh0ZW5zaW9uIG1vZHVsZXMuCisjCisjIElmIHlvdXIgcGFja2FnZSBpcyBjb25maWd1cmVkIHdpdGggYSBkaWZmZXJlbnQgcHJlZml4IHRvIHB5dGhvbiwKKyMgdXNlcnMgd2lsbCBoYXZlIHRvIGFkZCB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgdG8gdGhlIFBZVEhPTlBBVEgKKyMgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGNyZWF0ZSBhIC5wdGggZmlsZSAoc2VlIHRoZSBweXRob24KKyMgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscykuCisjCisjIElmIHRoZSBNSU5JTVVNLVZFUlNJT04gYXJndW1lbnQgaXMgcGFzc2VkLCBBTV9QQVRIX1BZVEhPTiB3aWxsCisjIGNhdXNlIGFuIGVycm9yIGlmIHRoZSB2ZXJzaW9uIG9mIHB5dGhvbiBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbQorIyBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVtZW50LiAgTUlOSU1VTS1WRVJTSU9OIHNob3VsZCBjb25zaXN0IG9mCisjIG51bWJlcnMgYW5kIGRvdHMgb25seS4KK0FDX0RFRlVOKFtBTV9QQVRIX1BZVEhPTl0sCisgWworICBkbmwgRmluZCBhIFB5dGhvbiBpbnRlcnByZXRlci4gIFB5dGhvbiB2ZXJzaW9ucyBwcmlvciB0byAyLjAgYXJlIG5vdAorICBkbmwgc3VwcG9ydGVkLiAoMi4wIHdhcyByZWxlYXNlZCBvbiBPY3RvYmVyIDE2LCAyMDAwKS4KKyAgbTRfZGVmaW5lX2RlZmF1bHQoW19BTV9QWVRIT05fSU5URVJQUkVURVJfTElTVF0sCitbcHl0aG9uIHB5dGhvbjIgcHl0aG9uMyBweXRob24zLjIgcHl0aG9uMy4xIHB5dGhvbjMuMCBweXRob24yLjcgZG5sCisgcHl0aG9uMi42IHB5dGhvbjIuNSBweXRob24yLjQgcHl0aG9uMi4zIHB5dGhvbjIuMiBweXRob24yLjEgcHl0aG9uMi4wXSkKKworICBBQ19BUkdfVkFSKFtQWVRIT05dLCBbdGhlIFB5dGhvbiBpbnRlcnByZXRlcl0pCisKKyAgbTRfaWYoWyQxXSxbXSxbCisgICAgZG5sIE5vIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLgorICAgICMgRmluZCBhbnkgUHl0aG9uIGludGVycHJldGVyLgorICAgIGlmIHRlc3QgLXogIiRQWVRIT04iOyB0aGVuCisgICAgICBBQ19QQVRIX1BST0dTKFtQWVRIT05dLCBfQU1fUFlUSE9OX0lOVEVSUFJFVEVSX0xJU1QsIDopCisgICAgZmkKKyAgICBhbV9kaXNwbGF5X1BZVEhPTj1weXRob24KKyAgXSwgWworICAgIGRubCBBIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLgorICAgIGlmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCisgICAgICAjIElmIHRoZSB1c2VyIHNldCAkUFlUSE9OLCB1c2UgaXQgYW5kIGRvbid0IHNlYXJjaCBzb21ldGhpbmcgZWxzZS4KKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAkUFlUSE9OIHZlcnNpb24gPj0gJDFdKQorICAgICAgQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oWyRQWVRIT05dLCBbJDFdLAorCQkJICAgICAgW0FDX01TR19SRVNVTFQoeWVzKV0sCisJCQkgICAgICBbQUNfTVNHX0VSUk9SKHRvbyBvbGQpXSkKKyAgICAgIGFtX2Rpc3BsYXlfUFlUSE9OPSRQWVRIT04KKyAgICBlbHNlCisgICAgICAjIE90aGVyd2lzZSwgdHJ5IGVhY2ggaW50ZXJwcmV0ZXIgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBzYXRpc2ZpZXMKKyAgICAgICMgVkVSU0lPTi4KKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgYSBQeXRob24gaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uID49ICQxXSwKKwlbYW1fY3ZfcGF0aGxlc3NfUFlUSE9OXSxbCisJZm9yIGFtX2N2X3BhdGhsZXNzX1BZVEhPTiBpbiBfQU1fUFlUSE9OX0lOVEVSUFJFVEVSX0xJU1Qgbm9uZTsgZG8KKwkgIHRlc3QgIiRhbV9jdl9wYXRobGVzc19QWVRIT04iID0gbm9uZSAmJiBicmVhaworCSAgQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oWyRhbV9jdl9wYXRobGVzc19QWVRIT05dLCBbJDFdLCBbYnJlYWtdKQorCWRvbmVdKQorICAgICAgIyBTZXQgJFBZVEhPTiB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiAkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OLgorICAgICAgaWYgdGVzdCAiJGFtX2N2X3BhdGhsZXNzX1BZVEhPTiIgPSBub25lOyB0aGVuCisJUFlUSE9OPToKKyAgICAgIGVsc2UKKyAgICAgICAgQUNfUEFUSF9QUk9HKFtQWVRIT05dLCBbJGFtX2N2X3BhdGhsZXNzX1BZVEhPTl0pCisgICAgICBmaQorICAgICAgYW1fZGlzcGxheV9QWVRIT049JGFtX2N2X3BhdGhsZXNzX1BZVEhPTgorICAgIGZpCisgIF0pCisKKyAgaWYgdGVzdCAiJFBZVEhPTiIgPSA6OyB0aGVuCisgIGRubCBSdW4gYW55IHVzZXItc3BlY2lmaWVkIGFjdGlvbiwgb3IgYWJvcnQuCisgICAgbTRfZGVmYXVsdChbJDNdLCBbQUNfTVNHX0VSUk9SKFtubyBzdWl0YWJsZSBQeXRob24gaW50ZXJwcmV0ZXIgZm91bmRdKV0pCisgIGVsc2UKKworICBkbmwgUXVlcnkgUHl0aG9uIGZvciBpdHMgdmVyc2lvbiBudW1iZXIuICBHZXR0aW5nIFs6M10gc2VlbXMgdG8gYmUKKyAgZG5sIHRoZSBiZXN0IHdheSB0byBkbyB0aGlzOyBpdCdzIHdoYXQgInNpdGUucHkiIGRvZXMgaW4gdGhlIHN0YW5kYXJkCisgIGRubCBsaWJyYXJ5LgorCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHZlcnNpb25dLCBbYW1fY3ZfcHl0aG9uX3ZlcnNpb25dLAorICAgIFthbV9jdl9weXRob25fdmVyc2lvbj1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZShzeXMudmVyc2lvbltbOjNdXSkiYF0pCisgIEFDX1NVQlNUKFtQWVRIT05fVkVSU0lPTl0sIFskYW1fY3ZfcHl0aG9uX3ZlcnNpb25dKQorCisgIGRubCBVc2UgdGhlIHZhbHVlcyBvZiAkcHJlZml4IGFuZCAkZXhlY19wcmVmaXggZm9yIHRoZSBjb3JyZXNwb25kaW5nCisgIGRubCB2YWx1ZXMgb2YgUFlUSE9OX1BSRUZJWCBhbmQgUFlUSE9OX0VYRUNfUFJFRklYLiAgVGhlc2UgYXJlIG1hZGUKKyAgZG5sIGRpc3RpbmN0IHZhcmlhYmxlcyBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWQgYmUuICBIb3dldmVyLAorICBkbmwgZ2VuZXJhbCBjb25zZW5zdXMgaXMgdGhhdCB5b3Ugc2hvdWxkbid0IG5lZWQgdGhpcyBhYmlsaXR5LgorCisgIEFDX1NVQlNUKFtQWVRIT05fUFJFRklYXSwgWycke3ByZWZpeH0nXSkKKyAgQUNfU1VCU1QoW1BZVEhPTl9FWEVDX1BSRUZJWF0sIFsnJHtleGVjX3ByZWZpeH0nXSkKKworICBkbmwgQXQgdGltZXMgKGxpa2Ugd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzKSB5b3UgbWF5IHdhbnQKKyAgZG5sIHRvIGtub3cgd2hpY2ggT1MgcGxhdGZvcm0gUHl0aG9uIHRoaW5rcyB0aGlzIGlzLgorCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHBsYXRmb3JtXSwgW2FtX2N2X3B5dGhvbl9wbGF0Zm9ybV0sCisgICAgW2FtX2N2X3B5dGhvbl9wbGF0Zm9ybT1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZShzeXMucGxhdGZvcm0pImBdKQorICBBQ19TVUJTVChbUFlUSE9OX1BMQVRGT1JNXSwgWyRhbV9jdl9weXRob25fcGxhdGZvcm1dKQorCisKKyAgZG5sIFNldCB1cCA0IGRpcmVjdG9yaWVzOgorCisgIGRubCBweXRob25kaXIgLS0gd2hlcmUgdG8gaW5zdGFsbCBweXRob24gc2NyaXB0cy4gIFRoaXMgaXMgdGhlCisgIGRubCAgIHNpdGUtcGFja2FnZXMgZGlyZWN0b3J5LCBub3QgdGhlIHB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5CisgIGRubCAgIGRpcmVjdG9yeSBsaWtlIGluIHByZXZpb3VzIGF1dG9tYWtlIGJldGFzLiAgVGhpcyBiZWhhdmlvcgorICBkbmwgICBpcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCBsaXNwZGlyLm00IGZvciBleGFtcGxlLgorICBkbmwgUXVlcnkgZGlzdHV0aWxzIGZvciB0aGlzIGRpcmVjdG9yeS4KKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYW1fZGlzcGxheV9QWVRIT04gc2NyaXB0IGRpcmVjdG9yeV0sCisgICAgW2FtX2N2X3B5dGhvbl9weXRob25kaXJdLAorICAgIFtpZiB0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORQorICAgICB0aGVuCisgICAgICAgYW1fcHlfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorICAgICBlbHNlCisgICAgICAgYW1fcHlfcHJlZml4PSRwcmVmaXgKKyAgICAgZmkKKyAgICAgYW1fY3ZfcHl0aG9uX3B5dGhvbmRpcj1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZzsgc3lzLnN0ZG91dC53cml0ZShzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoMCwwLHByZWZpeD0nJGFtX3B5X3ByZWZpeCcpKSIgMj4vZGV2L251bGxgCisgICAgIGNhc2UgJGFtX2N2X3B5dGhvbl9weXRob25kaXIgaW4KKyAgICAgJGFtX3B5X3ByZWZpeCopCisgICAgICAgYW1fX3N0cmlwX3ByZWZpeD1gZWNobyAiJGFtX3B5X3ByZWZpeCIgfCBzZWQgJ3N8LnwufGcnYAorICAgICAgIGFtX2N2X3B5dGhvbl9weXRob25kaXI9YGVjaG8gIiRhbV9jdl9weXRob25fcHl0aG9uZGlyIiB8IHNlZCAicyxeJGFtX19zdHJpcF9wcmVmaXgsJFBZVEhPTl9QUkVGSVgsImAKKyAgICAgICA7OworICAgICAqKQorICAgICAgIGNhc2UgJGFtX3B5X3ByZWZpeCBpbgorICAgICAgICAgL3VzcnwvU3lzdGVtKikgOzsKKyAgICAgICAgICopCisJICBhbV9jdl9weXRob25fcHl0aG9uZGlyPSRQWVRIT05fUFJFRklYL2xpYi9weXRob24kUFlUSE9OX1ZFUlNJT04vc2l0ZS1wYWNrYWdlcworCSAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgZXNhYworICAgIF0pCisgIEFDX1NVQlNUKFtweXRob25kaXJdLCBbJGFtX2N2X3B5dGhvbl9weXRob25kaXJdKQorCisgIGRubCBwa2dweXRob25kaXIgLS0gJFBBQ0tBR0UgZGlyZWN0b3J5IHVuZGVyIHB5dGhvbmRpci4gIFdhcworICBkbmwgICBQWVRIT05fU0lURV9QQUNLQUdFIGluIHByZXZpb3VzIGJldGFzLCBidXQgdGhpcyBuYW1pbmcgaXMKKyAgZG5sICAgbW9yZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgYXV0b21ha2UuCisKKyAgQUNfU1VCU1QoW3BrZ3B5dGhvbmRpcl0sIFtcJHtweXRob25kaXJ9LyRQQUNLQUdFXSkKKworICBkbmwgcHlleGVjZGlyIC0tIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBweXRob24gZXh0ZW5zaW9uIG1vZHVsZXMKKyAgZG5sICAgKHNoYXJlZCBsaWJyYXJpZXMpCisgIGRubCBRdWVyeSBkaXN0dXRpbHMgZm9yIHRoaXMgZGlyZWN0b3J5LgorICBBQ19DQUNIRV9DSEVDSyhbZm9yICRhbV9kaXNwbGF5X1BZVEhPTiBleHRlbnNpb24gbW9kdWxlIGRpcmVjdG9yeV0sCisgICAgW2FtX2N2X3B5dGhvbl9weWV4ZWNkaXJdLAorICAgIFtpZiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FCisgICAgIHRoZW4KKyAgICAgICBhbV9weV9leGVjX3ByZWZpeD0kYW1fcHlfcHJlZml4CisgICAgIGVsc2UKKyAgICAgICBhbV9weV9leGVjX3ByZWZpeD0kZXhlY19wcmVmaXgKKyAgICAgZmkKKyAgICAgYW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcj1gJFBZVEhPTiAtYyAiaW1wb3J0IHN5czsgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZzsgc3lzLnN0ZG91dC53cml0ZShzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoMSwwLHByZWZpeD0nJGFtX3B5X2V4ZWNfcHJlZml4JykpIiAyPi9kZXYvbnVsbGAKKyAgICAgY2FzZSAkYW1fY3ZfcHl0aG9uX3B5ZXhlY2RpciBpbgorICAgICAkYW1fcHlfZXhlY19wcmVmaXgqKQorICAgICAgIGFtX19zdHJpcF9wcmVmaXg9YGVjaG8gIiRhbV9weV9leGVjX3ByZWZpeCIgfCBzZWQgJ3N8LnwufGcnYAorICAgICAgIGFtX2N2X3B5dGhvbl9weWV4ZWNkaXI9YGVjaG8gIiRhbV9jdl9weXRob25fcHlleGVjZGlyIiB8IHNlZCAicyxeJGFtX19zdHJpcF9wcmVmaXgsJFBZVEhPTl9FWEVDX1BSRUZJWCwiYAorICAgICAgIDs7CisgICAgICopCisgICAgICAgY2FzZSAkYW1fcHlfZXhlY19wcmVmaXggaW4KKyAgICAgICAgIC91c3J8L1N5c3RlbSopIDs7CisgICAgICAgICAqKQorCSAgIGFtX2N2X3B5dGhvbl9weWV4ZWNkaXI9JFBZVEhPTl9FWEVDX1BSRUZJWC9saWIvcHl0aG9uJFBZVEhPTl9WRVJTSU9OL3NpdGUtcGFja2FnZXMKKwkgICA7OworICAgICAgIGVzYWMKKyAgICAgICA7OworICAgICBlc2FjCisgICAgXSkKKyAgQUNfU1VCU1QoW3B5ZXhlY2Rpcl0sIFskYW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcl0pCisKKyAgZG5sIHBrZ3B5ZXhlY2RpciAtLSAkKHB5ZXhlY2RpcikvJChQQUNLQUdFKQorCisgIEFDX1NVQlNUKFtwa2dweWV4ZWNkaXJdLCBbXCR7cHlleGVjZGlyfS8kUEFDS0FHRV0pCisKKyAgZG5sIFJ1biBhbnkgdXNlci1zcGVjaWZpZWQgYWN0aW9uLgorICAkMgorICBmaQorCitdKQorCisKKyMgQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oUFJPRywgVkVSU0lPTiwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSdW4gQUNUSU9OLUlGLVRSVUUgaWYgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBQUk9HIGhhcyB2ZXJzaW9uID49IFZFUlNJT04uCisjIFJ1biBBQ1RJT04tSUYtRkFMU0Ugb3RoZXJ3aXNlLgorIyBUaGlzIHRlc3QgdXNlcyBzeXMuaGV4dmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBzdHJpbmcgZXF1aXZhbGVudCAoZmlyc3QKKyMgd29yZCBvZiBzeXMudmVyc2lvbiksIGluIG9yZGVyIHRvIGNvcGUgd2l0aCB2ZXJzaW9ucyBzdWNoIGFzIDIuMmMxLgorIyBUaGlzIHN1cHBvcnRzIFB5dGhvbiAyLjAgb3IgaGlnaGVyLiAoMi4wIHdhcyByZWxlYXNlZCBvbiBPY3RvYmVyIDE2LCAyMDAwKS4KK0FDX0RFRlVOKFtBTV9QWVRIT05fQ0hFQ0tfVkVSU0lPTl0sCisgW3Byb2c9ImltcG9ydCBzeXMKKyMgc3BsaXQgc3RyaW5ncyBieSAnLicgYW5kIGNvbnZlcnQgdG8gbnVtZXJpYy4gIEFwcGVuZCBzb21lIHplcm9zCisjIGJlY2F1c2Ugd2UgbmVlZCBhdCBsZWFzdCA0IGRpZ2l0cyBmb3IgdGhlIGhleCBjb252ZXJzaW9uLgorIyBtYXAgcmV0dXJucyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy4wIGFuZCBhIGxpc3QgaW4gMi54CittaW52ZXIgPSBsaXN0KG1hcChpbnQsICckMicuc3BsaXQoJy4nKSkpICsgW1swLCAwLCAwXV0KK21pbnZlcmhleCA9IDAKKyMgeHJhbmdlIGlzIG5vdCBwcmVzZW50IGluIFB5dGhvbiAzLjAgYW5kIHJhbmdlIHJldHVybnMgYW4gaXRlcmF0b3IKK2ZvciBpIGluIGxpc3QocmFuZ2UoMCwgNCkpOiBtaW52ZXJoZXggPSAobWludmVyaGV4IDw8IDgpICsgbWludmVyW1tpXV0KK3N5cy5leGl0KHN5cy5oZXh2ZXJzaW9uIDwgbWludmVyaGV4KSIKKyAgQVNfSUYoW0FNX1JVTl9MT0coWyQxIC1jICIkcHJvZyJdKV0sIFskM10sIFskNF0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMQorCisjIEFNX1JVTl9MT0coQ09NTUFORCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSdW4gQ09NTUFORCwgc2F2ZSB0aGUgZXhpdCBzdGF0dXMgaW4gYWNfc3RhdHVzLCBhbmQgbG9nIGl0LgorIyAoVGhpcyBoYXMgYmVlbiBhZGFwdGVkIGZyb20gQXV0b2NvbmYncyBfQUNfUlVOX0xPRyBtYWNyby4pCitBQ19ERUZVTihbQU1fUlVOX0xPR10sCitbeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJDEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICgkMSkgPiZBU19NRVNTQUdFX0xPR19GRCAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgYWNfc3RhdHVzPSQ/CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgKGV4aXQgJGFjX3N0YXR1cyk7IH1dKQorCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworIyBBTV9TQU5JVFlfQ0hFQ0sKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCisjIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQorIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgorYW1fbGY9JworJworY2FzZSBgcHdkYCBpbgorICAqW1tcXFwiXCNcJFwmXCdcYCRhbV9sZl1dKikKKyAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lXSk7OworZXNhYworY2FzZSAkc3JjZGlyIGluCisgICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXCBcCV1dKikKKyAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBzcmNkaXIgdmFsdWU6IGAkc3JjZGlyJ10pOzsKK2VzYWMKKworIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiRbKl0iICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKKyAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCisgICBmaQorCisgICB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQorZmkKK0FDX01TR19SRVNVTFQoeWVzKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAorIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKKyMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCisjIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKKyMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQorIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCitbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2RubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKK0FDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDMKKworIyBfQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByZXZlbnQgQXV0b21ha2UgZnJvbSBvdXRwdXR0aW5nIFZBUklBQkxFID0gQFZBUklBQkxFQCBpbiBNYWtlZmlsZS5pbi4KKyMgVGhpcyBtYWNybyBpcyB0cmFjZWQgYnkgQXV0b21ha2UuCitBQ19ERUZVTihbX0FNX1NVQlNUX05PVE1BS0VdKQorCisjIEFNX1NVQlNUX05PVE1BS0UoVkFSSUFCTEUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFB1YmxpYyBzaXN0ZXIgb2YgX0FNX1NVQlNUX05PVE1BS0UuCitBQ19ERUZVTihbQU1fU1VCU1RfTk9UTUFLRV0sIFtfQU1fU1VCU1RfTk9UTUFLRSgkQCldKQorCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBfQU1fUFJPR19UQVIoRk9STUFUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgorIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKKyMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKKyMgJHRhcmRpci4KKyMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAorIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgorIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgorQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCitbIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgWWVzLCBpdCdzIHN0aWxsIHVzZWQKKyMgaW4gdGhlIHdpbGQgOi0oICBXZSBzaG91bGQgZmluZCBhIHByb3BlciB3YXkgdG8gZGVwcmVjYXRlIGl0IC4uLgorQUNfU1VCU1QoW0FNVEFSXSwgWyckJHtUQVItdGFyfSddKQorbTRfaWYoWyQxXSwgW3Y3XSwKKyAgICAgW2FtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nXSwKKyAgICAgW200X2Nhc2UoWyQxXSwgW3VzdGFyXSwsIFtwYXhdLCwKKyAgICAgICAgICAgICAgW200X2ZhdGFsKFtVbmtub3duIHRhciBmb3JtYXRdKV0pCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCisjIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCitfYW1fdG9vbHM9J2dudXRhciBtNF9pZihbJDFdLCBbdXN0YXJdLCBbcGxhaW50YXJdKSBwYXggY3BpbyBub25lJworX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KKyMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAorIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgorZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKK2RvCisgIGNhc2UgJF9hbV90b29sIGluCisgIGdudXRhcikKKyAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7CisgICAgZG8KKyAgICAgIEFNX1JVTl9MT0coWyRfYW1fdGFyIC0tdmVyc2lvbl0pICYmIGJyZWFrCisgICAgZG9uZQorICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJworICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0iJF9hbV90YXIgLXhmIC0iCisgICAgOzsKKyAgcGxhaW50YXIpCisgICAgIyBNdXN0IHNraXAgR05VIHRhcjogaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCAtLWZvcm1hdD0gaXQgZG9lc24ndCBjcmVhdGUKKyAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgorICAgICh0YXIgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjEgJiYgY29udGludWUKKyAgICBhbV9fdGFyPSd0YXIgY2hmIC0gIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9J3RhciB4ZiAtJworICAgIDs7CisgIHBheCkKKyAgICBhbV9fdGFyPSdwYXggLUwgLXggJDEgLXcgIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0ncGF4IC1MIC14ICQxIC13ICIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9J3BheCAtcicKKyAgICA7OworICBjcGlvKQorICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJworICAgIGFtX190YXJfPSdmaW5kICIkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJworICAgIGFtX191bnRhcj0nY3BpbyAtaSAtSCAkMSAtZCcKKyAgICA7OworICBub25lKQorICAgIGFtX190YXI9ZmFsc2UKKyAgICBhbV9fdGFyXz1mYWxzZQorICAgIGFtX191bnRhcj1mYWxzZQorICAgIDs7CisgIGVzYWMKKworICAjIElmIHRoZSB2YWx1ZSB3YXMgY2FjaGVkLCBzdG9wIG5vdy4gIFdlIGp1c3Qgd2FudGVkIHRvIGhhdmUgYW1fX3RhcgorICAjIGFuZCBhbV9fdW50YXIgc2V0LgorICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKKworICAjIHRhci91bnRhciBhIGR1bW15IGRpcmVjdG9yeSwgYW5kIHN0b3AgaWYgdGhlIGNvbW1hbmQgd29ya3MKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQorICBBTV9SVU5fTE9HKFt0YXJkaXI9Y29uZnRlc3QuZGlyICYmIGV2YWwgJGFtX190YXJfID5jb25mdGVzdC50YXJdKQorICBybSAtcmYgY29uZnRlc3QuZGlyCisgIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCisgICAgQU1fUlVOX0xPRyhbJGFtX191bnRhciA8Y29uZnRlc3QudGFyXSkKKyAgICBncmVwIEdyZXBNZSBjb25mdGVzdC5kaXIvZmlsZSA+L2Rldi9udWxsIDI+JjEgJiYgYnJlYWsKKyAgZmkKK2RvbmUKK3JtIC1yZiBjb25mdGVzdC5kaXIKKworQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm9nX3Rhcl8kMV0sIFthbV9jdl9wcm9nX3Rhcl8kMT0kX2FtX3Rvb2xdKQorQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQorQUNfU1VCU1QoW2FtX190YXJdKQorQUNfU1VCU1QoW2FtX191bnRhcl0pCitdKSAjIF9BTV9QUk9HX1RBUgorCittNF9pbmNsdWRlKFttNC9saWJ0b29sLm00XSkKK200X2luY2x1ZGUoW200L2x0b3B0aW9ucy5tNF0pCittNF9pbmNsdWRlKFttNC9sdHN1Z2FyLm00XSkKK200X2luY2x1ZGUoW200L2x0dmVyc2lvbi5tNF0pCittNF9pbmNsdWRlKFttNC9sdH5vYnNvbGV0ZS5tNF0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2J1aWxkLWF1eC9jb25maWcuZ3Vlc3MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2J1aWxkLWF1eC9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYyMmE0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE1MzAgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKyMgICAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMTItMDItMTAnCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAgUGxlYXNlIHNlbmQgcGF0Y2hlcyAoY29udGV4dAorIyBkaWZmIGZvcm1hdCkgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGFuZCBpbmNsdWRlIGEgQ2hhbmdlTG9nCisjIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMgorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCAtcSBfX0VMRl9fCisJCXRoZW4KKwkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KKwkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPworCQkgICAgb3M9bmV0YnNkCisJCWVsc2UKKwkJICAgIG9zPW5ldGJzZGVsZgorCQlmaQorCQk7OworCSAgICAqKQorCQlvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJIyBSZXNldCBFWElUIHRyYXAgYmVmb3JlIGV4aXRpbmcgdG8gYXZvaWQgc3B1cmlvdXMgbm9uLXplcm8gZXhpdCBjb2RlLgorCWV4aXRjb2RlPSQ/CisJdHJhcCAnJyAwCisJZXhpdCAkZXhpdGNvZGUgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorCWVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtOnJpc2NvczoqOip8YXJtOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOkF1cm9yYVVYOjUuKjoqIHwgaTg2eGVuOkF1cm9yYVVYOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1hdXJvcmF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCVNVTl9BUkNIPSJpMzg2IgorCSMgSWYgdGhlcmUgaXMgYSBjb21waWxlciwgc2VlIGlmIGl0IGlzIGNvbmZpZ3VyZWQgZm9yIDY0LWJpdCBvYmplY3RzLgorCSMgTm90ZSB0aGF0IHRoZSBTdW4gY2MgZG9lcyBub3QgdHVybiBfX0xQNjRfXyBpbnRvIDEgbGlrZSBnY2MgZG9lcy4KKwkjIFRoaXMgdGVzdCB3b3JrcyBmb3IgYm90aCBjb21waWxlcnMuCisJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJICAgIGlmIChlY2hvICcjaWZkZWYgX19hbWQ2NCc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCWdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJU1VOX0FSQ0g9Ing4Nl82NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtTVU5fQVJDSH0tcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKwllY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorCWVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKwllY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorCSMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCA7OworICAgICo6QUlYOio6WzQ1NjddKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKwkJICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorCQkgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisJCSAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorCQkgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKwkJICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisJCQljYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKwkJCSAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworCQkJICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKwkJCWVzYWMgOzsKKwkJICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKworCQkjZGVmaW5lIF9IUFVYX1NPVVJDRQorCQkjaW5jbHVkZSA8c3RkbGliLmg+CisJCSNpbmNsdWRlIDx1bmlzdGQuaD4KKworCQlpbnQgbWFpbiAoKQorCQl7CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKwkJI2VuZGlmCisJCSAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisJCSAgICBzd2l0Y2ggKGNwdSkKKwkJCXsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworCQkJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMl8wOgorCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisJCQkgICAgc3dpdGNoIChiaXRzKQorCQkJCXsKKwkJCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisJCQkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworCQkJCX0gYnJlYWs7CisJCSNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisJCQkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCSNlbmRpZgorCQkJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQl9CisJCSAgICBleGl0ICgwKTsKKwkJfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCAtcSBfX0xQNjRfXworCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisJRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKwllY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwljYXNlICR7VU5BTUVfUFJPQ0VTU09SfSBpbgorCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICAqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOk1TWVMqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zeXMKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIGF1dGhlbnRpY2FtZCB8IGdlbnVpbmVpbnRlbCB8IEVNNjRUKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgSUE2NCkKKwkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCWVzYWMgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgODY2NDpXaW5kb3dzX05UOiopCisJZWNobyB4ODZfNjQtcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhYXJjaDY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYWFyY2g2NF9iZTpMaW51eDoqOiopCisJVU5BTUVfTUFDSElORT1hYXJjaDY0X2JlCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisJZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJaWYgZWNobyBfX0FSTV9FQUJJX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCSAgICB8IGdyZXAgLXEgX19BUk1fRUFCSV9fCisJdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwllbHNlCisJICAgIGlmIGVjaG8gX19BUk1fUENTX1ZGUCB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCXwgZ3JlcCAtcSBfX0FSTV9QQ1NfVkZQCisJICAgIHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQorCSAgICBlbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmloZgorCSAgICBmaQorCWZpCisJZXhpdCA7OworICAgIGF2cjMyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzdjMyOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgZnJ2OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaGV4YWdvbjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCUxJQkM9Z251CisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeTElCQydgCisJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IgorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiogfCBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPSR7VU5BTUVfTUFDSElORX0KKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeQ1BVJ2AKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQorCSMgTG9vayBmb3IgQ1BVIGxldmVsCisJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KKwkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKKwllc2FjCisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHRpbGUqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4dGVuc2EqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisJIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorCSMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKwkjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorCSMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisJIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKwkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKQkjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorCQkJIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorCWVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCQllY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIGkzODYpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJCSAgdGhlbgorCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKKwkJICBmaQorCQlmaSA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBORU8tPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuZW8tdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisJZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKwlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7CisgICAgaSo4NjpBUk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYXJvcworCWV4aXQgOzsKKyAgICB4ODZfNjQ6Vk1rZXJuZWw6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVzeAorCWV4aXQgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKwkiNCIKKyNlbHNlCisJIiIKKyNlbmRpZgorCSk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2NvbmZpZy5oLmluIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9idWlsZC1hdXgvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzYjViMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGJ1aWxkLWF1eC9jb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0RMRkNOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBIQVZFX1BUSFJFQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLgorICAgKi8KKyN1bmRlZiBMVF9PQkpESVIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9OQU1FCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1NUUklORworCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9VUkwKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KKworLyogRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudCB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24KKyAgIHlvdXIgc3lzdGVtLiAqLworI3VuZGVmIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjdW5kZWYgVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9idWlsZC1hdXgvY29uZmlnLnN1YiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzg5NGRhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNzczIEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKyMgICAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMTItMDItMTAnCisKKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBHTlUgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsCisyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCA7OworCisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitjYXNlICQjIGluCisgMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgorICAgIGV4aXQgMTs7CisgMSkgOzsKKyAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1hbmRyb2lkKiB8IGxpbnV4LWRpZXRsaWJjIHwgbGludXgtbmV3bGliKiB8IFwKKyAgbGludXgtdWNsaWJjKiB8IHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwgXAorICBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICBhbmRyb2lkLWxpbnV4KQorICAgIG9zPS1saW51eC1hbmRyb2lkCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AtdW5rbm93bgorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1ibHVlZ2VuZSopCisJCW9zPS1jbmsKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c3JkYikKKwkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhYXJjaDY0IHwgYWFyY2g2NF9iZSBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisgICAgICAgIHwgYmUzMiB8IGJlNjQgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBlcGlwaGFueSBcCisJfCBmaWRvIHwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaGV4YWdvbiBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbGUzMiB8IGxlNjQgXAorCXwgbG0zMiBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCB8IG1ldGFnIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NG9jdGVvbiB8IG1pcHM2NG9jdGVvbmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjRyNTkwMCB8IG1pcHM2NHI1OTAwZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmRzMzIgfCBuZHMzMmxlIHwgbmRzMzJiZSBcCisJfCBuaW9zIHwgbmlvczIgXAorCXwgbnMxNmsgfCBuczMyayBcCisJfCBvcGVuOCBcCisJfCBvcjMyIFwKKwl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCisJfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgXAorCXwgcHlyYW1pZCBcCisJfCBybDc4IHwgcnggXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSBcCisJfCB0YWhvZSB8IHRpYzR4IHwgdGljNTR4IHwgdGljNTV4IHwgdGljNnggfCB0aWM4MCB8IHRyb24gXAorCXwgdWJpY29tMzIgXAorCXwgdjg1MCB8IHY4NTBlIHwgdjg1MGUxIHwgdjg1MGUyIHwgdjg1MGVzIHwgdjg1MGUydjMgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwljNTR4KQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCTs7CisJYzU1eCkKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQk7OworCWM2eCkKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCTs7CisJbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyIHwgbTY4aGNzMTJ4IHwgcGljb2NoaXApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKKwlzdHJvbmdhcm0gfCB0aHVtYiB8IHhzY2FsZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQk7OworCXhnYXRlKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwl4c2NhbGVlYikKKwkJYmFzaWNfbWFjaGluZT1hcm1lYi11bmtub3duCisJCTs7CisKKwl4c2NhbGVlbCkKKwkJYmFzaWNfbWFjaGluZT1hcm1lbC11bmtub3duCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWFyY2g2NC0qIHwgYWFyY2g2NF9iZS0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKKwl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCisJfCBhdnItKiB8IGF2cjMyLSogXAorCXwgYmUzMi0qIHwgYmU2NC0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBoZXhhZ29uLSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IGxlMzItKiB8IGxlNjQtKiBcCisJfCBsbTMyLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiB8IG1ldGFnLSogfCBtaWNyb2JsYXplLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NG9jdGVvbi0qIHwgbWlwczY0b2N0ZW9uZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHI1OTAwLSogfCBtaXBzNjRyNTkwMGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuZHMzMi0qIHwgbmRzMzJsZS0qIHwgbmRzMzJiZS0qIFwKKwl8IG5pb3MtKiB8IG5pb3MyLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCisJfCBvcGVuOC0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcmw3OC0qIHwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjRdYS0qIHwgc2hbMjRdYWViLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdjEtKiB8IHN4Py0qIFwKKwl8IHRhaG9lLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdGlsZSotKiBcCisJfCB0cm9uLSogXAorCXwgdWJpY29tMzItKiBcCisJfCB2ODUwLSogfCB2ODUwZS0qIHwgdjg1MGUxLSogfCB2ODUwZXMtKiB8IHY4NTBlMi0qIHwgdjg1MGUydjMtKiBcCisJfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EqLSogXAorCXwgeW1wLSogXAorCXwgejhrLSogfCB6ODAtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXJvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1hcm9zCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwlibGFja2ZpbikKKwkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJYmxhY2tmaW4tKikKKwkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCWJsdWVnZW5lKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tY25rCisJCTs7CisJYzU0eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM1NXgtKikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljNngtKikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY2VnY2MpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LWNlZ2NjCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTYgfCBjcjE2LSopCisJCWJhc2ljX21hY2hpbmU9Y3IxNi11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRpY29zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LWRpY29zCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW02OGtub21tdSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJbTY4a25vbW11LSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaWNyb2JsYXplKQorCQliYXNpY19tYWNoaW5lPW1pY3JvYmxhemUteGlsaW54CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluZ3czMmNlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1taW5ndzMyY2UKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW9uaXRvcikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCW1vcnBob3MpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCW9zPS1tb3JwaG9zCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltczEtKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAorCQk7OworCW1zeXMpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXN5cworCQk7OworCW12cykKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisJbmFjbCkKKwkJYmFzaWNfbWFjaGluZT1sZTMyLXVua25vd24KKwkJb3M9LW5hY2wKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW5lby10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bmVvLXRhbmRlbQorCQk7OworCW5zZS10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNlLXRhbmRlbQorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcGVucmlzYyB8IG9wZW5yaXNjLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCTs7CisJb3M0MDApCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LW9zNDAwCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGFyaXNjKQorCQliYXNpY19tYWNoaW5lPWhwcGEtdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlwYXJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKwlwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwYzk4KQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJOzsKKwlwYzk4LSopCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bTQpCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtNC0qKQorCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQorCQk7OworCXBwYyB8IHBwY2JlKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qIHwgcHBjYmUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkJOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCisJCTs7CisJcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KKwkJOzsKKwlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcmRvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNkZSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCisJCW9zPS1lbGYKKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDVlbCkKKwkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN0cm9uZ2FybS0qIHwgdGh1bWItKikKKwkJYmFzaWNfbWFjaGluZT1hcm0tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWxlKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eeHNjYWxlL2FybS8nYAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisJIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKwkjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1hdXJvcmF1eCkKKwkJb3M9LWF1cm9yYXV4CisJCTs7CisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1jbmsqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1hdXJvcmF1eCogfCAtc29sYXJpcyogXAorCSAgICAgIHwgLXN5bSogfCAta29wZW5zb2xhcmlzKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiB8IC1hcm9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCisJICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIHwgLWNlZ2NjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1tc3lzKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtbGludXgtYW5kcm9pZCogXAorCSAgICAgIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyogfCAtZXMqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIHwgLWhhaWt1KiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisJLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworCS10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLWRpY29zKikKKwkJb3M9LWRpY29zCisJCTs7CisJLW5hY2wqKQorCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJc2NvcmUtKikKKwkJb3M9LWVsZgorCQk7OworCXNwdS0qKQorCQlvcz0tZWxmCisJCTs7CisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotcmViZWwpCisJCW9zPS1saW51eAorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKwljNHgtKiB8IHRpYzR4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTR4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTV4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNngtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLWtudXRoKQorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWNuayp8LWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2J1aWxkLWF1eC9kZXBjb21wIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9idWlsZC1hdXgvZGVwY29tcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDBhYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9idWlsZC1hdXgvZGVwY29tcApAQCAtMCwwICsxLDY4OCBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAxMS0xMi0wNC4xMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsCisjIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0dGluZyBkZXBlbmRlbmNpZXMuCisgIGxpYnRvb2wgICAgIFdoZXRoZXIgbGlidG9vbCBpcyB1c2VkICh5ZXMvbm8pLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgorRU9GCisgICAgZXhpdCAkPworICAgIDs7CisgIC12IHwgLS12KikKKyAgICBlY2hvICJkZXBjb21wICRzY3JpcHR2ZXJzaW9uIgorICAgIGV4aXQgJD8KKyAgICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KKyAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCitkZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAorICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KK3RtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9CisKK3JtIC1mICIkdG1wZGVwZmlsZSIKKworIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCisjIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAorIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQorIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCisgICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgorICBnY2NmbGFnPS1NCisgIGRlcG1vZGU9Z2NjCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KKyAgIGRhc2htZmxhZz0teE0KKyAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKK2ZpCisKK2N5Z3BhdGhfdT0iY3lncGF0aCAtdSAtZiAtIgoraWYgdGVzdCAiJGRlcG1vZGUiID0gbXN2Y21zeXM7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgbXN2aXN1YWxjcHAgYnV0IHcvbyBjeWdwYXRoIHRyYW5zbGF0aW9uLgorICAgIyBKdXN0IGNvbnZlcnQgdGhlIGJhY2tzbGFzaC1lc2NhcGVkIGJhY2tzbGFzaGVzIHRvIHNpbmdsZSBmb3J3YXJkCisgICAjIHNsYXNoZXMgdG8gc2F0aXNmeSBkZXBlbmQubTQKKyAgIGN5Z3BhdGhfdT0nc2VkIHMsXFxcXCwvLGcnCisgICBkZXBtb2RlPW1zdmlzdWFsY3BwCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjN21zeXM7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgbXN2YzcgYnV0IHcvbyBjeWdwYXRoIHRyYW5zbGF0aW9uLgorICAgIyBKdXN0IGNvbnZlcnQgdGhlIGJhY2tzbGFzaC1lc2NhcGVkIGJhY2tzbGFzaGVzIHRvIHNpbmdsZSBmb3J3YXJkCisgICAjIHNsYXNoZXMgdG8gc2F0aXNmeSBkZXBlbmQubTQKKyAgIGN5Z3BhdGhfdT0nc2VkIHMsXFxcXCwvLGcnCisgICBkZXBtb2RlPW1zdmM3CitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyMjIFVuZm9ydHVuYXRlbHksIEZyZWVCU0QgYzg5IGFjY2VwdGFuY2Ugb2YgZmxhZ3MgZGVwZW5kcyB1cG9uCisjIyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG9yZGVyOyBzbyBhZGQgdGhlIGZsYWdzIHdoZXJlIHRoZXkKKyMjIGFwcGVhciBpbiBkZXBlbmQyLmFtLiAgTm90ZSB0aGF0IHRoZSBzbG93ZG93biBpbmN1cnJlZCBoZXJlCisjIyBhZmZlY3RzIG9ubHkgY29uZmlndXJlOiBpbiBtYWtlZmlsZXMsICVGQVNUREVQJSBzaG9ydGN1dHMgdGhpcy4KKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1jKSBzZXQgZm5vcmQgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIgIiRhcmciIDs7CisgICAgKikgIHNldCBmbm9yZCAiJEAiICIkYXJnIiA7OworICAgIGVzYWMKKyAgICBzaGlmdCAjIGZub3JkCisgICAgc2hpZnQgIyAkYXJnCisgIGRvbmUKKyAgIiRAIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCisjIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKKyMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCisjIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCisjIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQorIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKKyMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgorIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQorIyMgICB0aGFuIHJlbmFtaW5nKS4KKyAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCisgICAgZ2NjZmxhZz0tTUQsCisgIGZpCisgICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisjIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCisgIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAorICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCisjIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQorIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCisjIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZworIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbworIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8CisjIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKKyMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcworIyMgd2VsbC4gIGhwIGRlcG1vZGUgYWxzbyBhZGRzIHRoYXQgc3BhY2UsIGJ1dCBhbHNvIHByZWZpeGVzIHRoZSBWUEFUSAorIyMgdG8gdGhlIG9iamVjdC4gIFRha2UgY2FyZSB0byBub3QgcmVwZWF0IGl0IGluIHRoZSBvdXRwdXQuCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICJzfC4qJG9iamVjdCR8fCIgLWUgJy86JC9kJyBcCisgICAgICB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcworICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKKyAgICB0ciAnCisnICcgJyA+PiAiJGRlcGZpbGUiCisgICAgZWNobyA+PiAiJGRlcGZpbGUiCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2FpeCkKKyAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcworICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQorICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCisgICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgorICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2UudQorICAgICIkQCIgLVdjLC1NCisgIGVsc2UKKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLnUKKyAgICAiJEAiIC1NCisgIGZpCisgIHN0YXQ9JD8KKworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCisgICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCisgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitpY2MpCisgICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgorICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKKyAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCisgICMgICAgZm9vLm86IHN1Yi9mb28uYworICAjICAgIGZvby5vOiBzdWIvZm9vLmgKKyAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6CisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAorICAjICAgIHN1Yi9mb28uYzoKKyAgIyAgICBzdWIvZm9vLmg6CisgICMgSUNDIDcuMSB3aWxsIG91dHB1dAorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCisgICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKKyAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCisgICMgICAgIC4uLgorCisgICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAorICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgorICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAorICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwMikKKyAgIyBUaGUgImhwIiBzdGFuemEgYWJvdmUgZG9lcyBub3Qgd29yayB3aXRoIGFDQyAoQysrKSBhbmQgSFAncyBpYTY0CisgICMgY29tcGlsZXJzLCB3aGljaCBoYXZlIGludGVncmF0ZWQgcHJlcHJvY2Vzc29ycy4gIFRoZSBjb3JyZWN0IG9wdGlvbgorICAjIHRvIHVzZSB3aXRoIHRoZXNlIGlzICtNYWtlZDsgaXQgd3JpdGVzIGRlcGVuZGVuY2llcyB0byBhIGZpbGUgbmFtZWQKKyAgIyAnZm9vLmQnLCB3aGljaCBsYW5kcyBuZXh0IHRvIHRoZSBvYmplY3QgZmlsZSwgd2hlcmV2ZXIgdGhhdAorICAjIGhhcHBlbnMgdG8gYmUuCisgICMgTXVjaCBvZiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRydTY0IGNhc2U7IHNlZSBjb21tZW50cyB0aGVyZS4KKyAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKKyAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2UuZAorICAgICIkQCIgLVdjLCtNYWtlZAorICBlbHNlCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICIkQCIgK01ha2VkCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgIyBBZGQgYGRlcGVuZGVudC5oOicgbGluZXMuCisgICAgc2VkIC1uZSAnMiwkeworCSAgICAgICBzL14gKi8vCisJICAgICAgIHMvIFxcKiQvLworCSAgICAgICBzLyQvOi8KKwkgICAgICAgcAorCSAgICAgfScgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZTIiCisgIDs7CisKK3RydTY0KQorICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQorICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgorICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisKKyAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQorICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCisgICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgorICAgICAgIworICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKKyAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCisgICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCisgICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCisgICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcworICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgorICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40CisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAorICAgICAgIiRAIiAtTUQKKyAgIGZpCisKKyAgIHN0YXQ9JD8KKyAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICAgZWxzZQorICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgICAgIGV4aXQgJHN0YXQKKyAgIGZpCisKKyAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICBkbworICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgIGRvbmUKKyAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICAgZWxzZQorICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgIGZpCisgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICA7OworCittc3ZjNykKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgc2hvd0luY2x1ZGVzPS1XYywtc2hvd0luY2x1ZGVzCisgIGVsc2UKKyAgICBzaG93SW5jbHVkZXM9LXNob3dJbmNsdWRlcworICBmaQorICAiJEAiICRzaG93SW5jbHVkZXMgPiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgZ3JlcCAtdiAnXk5vdGU6IGluY2x1ZGluZyBmaWxlOiAnICIkdG1wZGVwZmlsZSIKKyAgaWYgdGVzdCAiJHN0YXQiID0gMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgICMgVGhlIGZpcnN0IHNlZCBwcm9ncmFtIGJlbG93IGV4dHJhY3RzIHRoZSBmaWxlIG5hbWVzIGFuZCBlc2NhcGVzCisgICMgYmFja3NsYXNoZXMgZm9yIGN5Z3BhdGguICBUaGUgc2Vjb25kIHNlZCBwcm9ncmFtIG91dHB1dHMgdGhlIGZpbGUKKyAgIyBuYW1lIHdoZW4gcmVhZGluZywgYnV0IGFsc28gYWNjdW11bGF0ZXMgYWxsIGluY2x1ZGUgZmlsZXMgaW4gdGhlCisgICMgaG9sZCBidWZmZXIgaW4gb3JkZXIgdG8gb3V0cHV0IHRoZW0gYWdhaW4gYXQgdGhlIGVuZC4gIFRoaXMgb25seQorICAjIHdvcmtzIHdpdGggc2VkIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBoYW5kbGUgbGFyZ2UgYnVmZmVycy4KKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAnCisvXk5vdGU6IGluY2x1ZGluZyBmaWxlOiAgKlwoLipcKS8geworICBzLy9cMS8KKyAgcy9cXC9cXFxcL2cKKyAgcAorfScgfCAkY3lncGF0aF91IHwgc29ydCAtdSB8IHNlZCAtbiAnCitzLyAvXFwgL2cKK3MvXCguKlwpLwlcMSBcXC9wCitzLy5cKC4qXCkgXFwvXDE6LworSAorJCB7CisgIHMvLiovCS8KKyAgRworICBwCit9JyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2Yzdtc3lzKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworI25vc2lkZWVmZmVjdCkKKyAgIyBUaGlzIGNvbW1lbnQgYWJvdmUgaXMgdXNlZCBieSBhdXRvbWFrZSB0byB0ZWxsIHNpZGUtZWZmZWN0CisgICMgZGVwZW5kZW5jeSB0cmFja2luZyBtZWNoYW5pc21zIGZyb20gc2xvd2VyIG9uZXMuCisKK2Rhc2htc3Rkb3V0KQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dCwgcmVnYXJkbGVzcyBvZiAtby4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKKyAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgorICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgorICAiJEAiICRkYXNobWZsYWcgfAorICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2Rhc2hYbXN0ZG91dCkKKyAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQorICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KKyAgZXhpdCAxCisgIDs7CisKK21ha2VkZXBlbmQpCisgICIkQCIgfHwgZXhpdCAkPworICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgIlgkMSIgIT0gJ1gtLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorICAjIFggbWFrZWRlcGVuZAorICBzaGlmdAorICBjbGVhcmVkPW5vIGVhdD1ubworICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkY2xlYXJlZCBpbgorICAgIG5vKQorICAgICAgc2V0ICIiOyBzaGlmdAorICAgICAgY2xlYXJlZD15ZXMgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAkZWF0ID0geWVzOyB0aGVuCisgICAgICBlYXQ9bm8KKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1EKnwtSSopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgIyBTdHJpcCBhbnkgb3B0aW9uIHRoYXQgbWFrZWRlcGVuZCBtYXkgbm90IHVuZGVyc3RhbmQuICBSZW1vdmUKKyAgICAjIHRoZSBvYmplY3QgdG9vLCBvdGhlcndpc2UgbWFrZWRlcGVuZCB3aWxsIHBhcnNlIGl0IGFzIGEgc291cmNlIGZpbGUuCisgICAgLWFyY2gpCisgICAgICBlYXQ9eWVzIDs7CisgICAgLSp8JG9iamVjdCkKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgb2JqX3N1ZmZpeD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXi4qXC4vLi8nYAorICB0b3VjaCAiJHRtcGRlcGZpbGUiCisgICR7TUFLRURFUEVORC1tYWtlZGVwZW5kfSAtbyIkb2JqX3N1ZmZpeCIgLWYiJHRtcGRlcGZpbGUiICIkQCIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICAjIG1ha2VkZXBlbmQgbWF5IHByZXBlbmQgdGhlIFZQQVRIIGZyb20gdGhlIHNvdXJjZSBmaWxlIG5hbWUgdG8gdGhlIG9iamVjdC4KKyAgIyBObyBuZWVkIHRvIHJlZ2V4LWVzY2FwZSAkb2JqZWN0LCBleGNlc3MgbWF0Y2hpbmcgb2YgJy4nIGlzIGhhcm1sZXNzLgorICBzZWQgInN8Xi4qXCgkb2JqZWN0ICo6XCl8XDF8IiAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICBzZWQgJzEsMmQnICIkdG1wZGVwZmlsZSIgfCB0ciAnICcgJworJyB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZSIuYmFrCisgIDs7CisKK2NwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQuCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgIlgkMSIgIT0gJ1gtLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICIkQCIgLUUgfAorICAgIHNlZCAtbiAtZSAnL14jIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyBcCisgICAgICAgLWUgJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIHwKKyAgICBzZWQgJyQgczogXFwkOjonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICBzZWQgPCAiJHRtcGRlcGZpbGUiICcvXiQvZDtzL14gLy87cy8gXFwkLy87cy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK21zdmlzdWFsY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAiLUdtInwiL0dtInwiLUdpInwiL0dpInwiLVpJInwiL1pJIikKKwlzZXQgZm5vcmQgIiRAIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgICopCisJc2V0IGZub3JkICIkQCIgIiRhcmciCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgZXNhYworICBkb25lCisgICIkQCIgLUUgMj4vZGV2L251bGwgfAorICBzZWQgLW4gJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIvIHM6OlwxOnAnIHwgJGN5Z3BhdGhfdSB8IHNvcnQgLXUgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgorICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgLW4gLWUgJ3MlICVcXCAlZycgLWUgJy9eXCguKlwpJC8gczo6XDFcOjpwJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2Y21zeXMpCisgICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQorICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCisgICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGV4aXQgMQorICA7OworCitub25lKQorICBleGVjICIkQCIKKyAgOzsKKworKikKKyAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2luc3RhbGwtc2ggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2J1aWxkLWF1eC9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MjQ0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2J1aWxkLWF1eC9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsNTI3IEBACisjIS9iaW4vc2gKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisKK3NjcmlwdHZlcnNpb249MjAxMS0wMS0xOS4yMTsgIyBVVEMKKworIyBUaGlzIG9yaWdpbmF0ZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKSwgd2hpY2ggd2FzCisjIGxhdGVyIHJlbGVhc2VkIGluIFgxMVI2ICh4Yy9jb25maWcvdXRpbC9pbnN0YWxsLnNoKSB3aXRoIHRoZQorIyBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBsaWNlbnNlLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgWCBDb25zb3J0aXVtCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisjIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisjIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorIyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyMgWCBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUMtCisjIFRJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisjIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBYIENvbnNvcnRpdW0gc2hhbGwgbm90CisjIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsLQorIyBpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgWCBDb25zb3ItCisjIHRpdW0uCisjCisjCisjIEZTRiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLgorCitubD0nCisnCitJRlM9IiAiIgkkbmwiCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSR7RE9JVFBST0ctfQoraWYgdGVzdCAteiAiJGRvaXQiOyB0aGVuCisgIGRvaXRfZXhlYz1leGVjCitlbHNlCisgIGRvaXRfZXhlYz0kZG9pdAorZmkKKworIyBQdXQgaW4gYWJzb2x1dGUgZmlsZSBuYW1lcyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsKKyMgb3IgdXNlIGVudmlyb25tZW50IHZhcnMuCisKK2NoZ3JwcHJvZz0ke0NIR1JQUFJPRy1jaGdycH0KK2NobW9kcHJvZz0ke0NITU9EUFJPRy1jaG1vZH0KK2Nob3ducHJvZz0ke0NIT1dOUFJPRy1jaG93bn0KK2NtcHByb2c9JHtDTVBQUk9HLWNtcH0KK2NwcHJvZz0ke0NQUFJPRy1jcH0KK21rZGlycHJvZz0ke01LRElSUFJPRy1ta2Rpcn0KK212cHJvZz0ke01WUFJPRy1tdn0KK3JtcHJvZz0ke1JNUFJPRy1ybX0KK3N0cmlwcHJvZz0ke1NUUklQUFJPRy1zdHJpcH0KKworcG9zaXhfZ2xvYj0nPycKK2luaXRpYWxpemVfcG9zaXhfZ2xvYj0nCisgIHRlc3QgIiRwb3NpeF9nbG9iIiAhPSAiPyIgfHwgeworICAgIGlmIChzZXQgLWYpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICBwb3NpeF9nbG9iPQorICAgIGVsc2UKKyAgICAgIHBvc2l4X2dsb2I9OgorICAgIGZpCisgIH0KKycKKworcG9zaXhfbWtkaXI9CisKKyMgRGVzaXJlZCBtb2RlIG9mIGluc3RhbGxlZCBmaWxlLgorbW9kZT0wNzU1CisKK2NoZ3JwY21kPQorY2htb2RjbWQ9JGNobW9kcHJvZworY2hvd25jbWQ9CittdmNtZD0kbXZwcm9nCitybWNtZD0iJHJtcHJvZyAtZiIKK3N0cmlwY21kPQorCitzcmM9Citkc3Q9CitkaXJfYXJnPQorZHN0X2FyZz0KKworY29weV9vbl9jaGFuZ2U9ZmFsc2UKK25vX3RhcmdldF9kaXJlY3Rvcnk9CisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0uLi4gWy1UXSBTUkNGSUxFIERTVEZJTEUKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiBTUkNGSUxFUy4uLiBESVJFQ1RPUlkKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtdCBESVJFQ1RPUlkgU1JDRklMRVMuLi4KKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtZCBESVJFQ1RPUklFUy4uLgorCitJbiB0aGUgMXN0IGZvcm0sIGNvcHkgU1JDRklMRSB0byBEU1RGSUxFLgorSW4gdGhlIDJuZCBhbmQgM3JkLCBjb3B5IGFsbCBTUkNGSUxFUyB0byBESVJFQ1RPUlkuCitJbiB0aGUgNHRoLCBjcmVhdGUgRElSRUNUT1JJRVMuCisKK09wdGlvbnM6CisgICAgIC0taGVscCAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQuCisgICAgIC0tdmVyc2lvbiAgZGlzcGxheSB2ZXJzaW9uIGluZm8gYW5kIGV4aXQuCisKKyAgLWMgICAgICAgICAgICAoaWdub3JlZCkKKyAgLUMgICAgICAgICAgICBpbnN0YWxsIG9ubHkgaWYgZGlmZmVyZW50IChwcmVzZXJ2ZSB0aGUgbGFzdCBkYXRhIG1vZGlmaWNhdGlvbiB0aW1lKQorICAtZCAgICAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCisgIC1nIEdST1VQICAgICAgJGNoZ3JwcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gR1JPVVAuCisgIC1tIE1PREUgICAgICAgJGNobW9kcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gTU9ERS4KKyAgLW8gVVNFUiAgICAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgorICAtcyAgICAgICAgICAgICRzdHJpcHByb2cgaW5zdGFsbGVkIGZpbGVzLgorICAtdCBESVJFQ1RPUlkgIGluc3RhbGwgaW50byBESVJFQ1RPUlkuCisgIC1UICAgICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlcyBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb21tYW5kczoKKyAgQ0hHUlBQUk9HIENITU9EUFJPRyBDSE9XTlBST0cgQ01QUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRworICBSTVBST0cgU1RSSVBQUk9HCisiCisKK3doaWxlIHRlc3QgJCMgLW5lIDA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtYykgOzsKKworICAgIC1DKSBjb3B5X29uX2NoYW5nZT10cnVlOzsKKworICAgIC1kKSBkaXJfYXJnPXRydWU7OworCisgICAgLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgorCXNoaWZ0OzsKKworICAgIC0taGVscCkgZWNobyAiJHVzYWdlIjsgZXhpdCAkPzs7CisKKyAgICAtbSkgbW9kZT0kMgorCWNhc2UgJG1vZGUgaW4KKwkgIConICcqIHwgKicJJyogfCAqJworJyoJICB8IConKicqIHwgKic/JyogfCAqJ1snKikKKwkgICAgZWNobyAiJDA6IGludmFsaWQgbW9kZTogJG1vZGUiID4mMgorCSAgICBleGl0IDE7OworCWVzYWMKKwlzaGlmdDs7CisKKyAgICAtbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisJc2hpZnQ7OworCisgICAgLXMpIHN0cmlwY21kPSRzdHJpcHByb2c7OworCisgICAgLXQpIGRzdF9hcmc9JDIKKwkjIFByb3RlY3QgbmFtZXMgcHJvYmxlbWF0aWMgZm9yIGB0ZXN0JyBhbmQgb3RoZXIgdXRpbGl0aWVzLgorCWNhc2UgJGRzdF9hcmcgaW4KKwkgIC0qIHwgWz1cKFwpIV0pIGRzdF9hcmc9Li8kZHN0X2FyZzs7CisJZXNhYworCXNoaWZ0OzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWU7OworCisgICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworCisgICAgLS0pCXNoaWZ0CisJYnJlYWs7OworCisgICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgorCWV4aXQgMTs7CisKKyAgICAqKSAgYnJlYWs7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0X2FyZyI7IHRoZW4KKyAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisgICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCisgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KKyAgZm9yIGFyZworICBkbworICAgIGlmIHRlc3QgLW4gIiRkc3RfYXJnIjsgdGhlbgorICAgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdF9hcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgZmkKKyAgICBzaGlmdCAjIGFyZworICAgIGRzdF9hcmc9JGFyZworICAgICMgUHJvdGVjdCBuYW1lcyBwcm9ibGVtYXRpYyBmb3IgYHRlc3QnIGFuZCBvdGhlciB1dGlsaXRpZXMuCisgICAgY2FzZSAkZHN0X2FyZyBpbgorICAgICAgLSogfCBbPVwoXCkhXSkgZHN0X2FyZz0uLyRkc3RfYXJnOzsKKyAgICBlc2FjCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCisgICAgZWNobyAiJDA6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLiIgPiYyCisgICAgZXhpdCAxCisgIGZpCisgICMgSXQncyBPSyB0byBjYWxsIGBpbnN0YWxsLXNoIC1kJyB3aXRob3V0IGFyZ3VtZW50LgorICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbmFsIGRpcmVjdG9yaWVzLgorICBleGl0IDAKK2ZpCisKK2lmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICBkb19leGl0PScoZXhpdCAkcmV0KTsgZXhpdCAkcmV0JworICB0cmFwICJyZXQ9MTI5OyAkZG9fZXhpdCIgMQorICB0cmFwICJyZXQ9MTMwOyAkZG9fZXhpdCIgMgorICB0cmFwICJyZXQ9MTQxOyAkZG9fZXhpdCIgMTMKKyAgdHJhcCAicmV0PTE0MzsgJGRvX2V4aXQiIDE1CisKKyAgIyBTZXQgdW1hc2sgc28gYXMgbm90IHRvIGNyZWF0ZSB0ZW1wcyB3aXRoIHRvby1nZW5lcm91cyBtb2Rlcy4KKyAgIyBIb3dldmVyLCAnc3RyaXAnIHJlcXVpcmVzIGJvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvIHRlbXBzLgorICBjYXNlICRtb2RlIGluCisgICAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCisgICAgKjY0NCkgY3BfdW1hc2s9MTMzOzsKKyAgICAqNzU1KSBjcF91bWFzaz0yMjs7CisKKyAgICAqWzAtN10pCisgICAgICBpZiB0ZXN0IC16ICIkc3RyaXBjbWQiOyB0aGVuCisJdV9wbHVzX3J3PQorICAgICAgZWxzZQorCXVfcGx1c19ydz0nJSAyMDAnCisgICAgICBmaQorICAgICAgY3BfdW1hc2s9YGV4cHIgJygnIDc3NyAtICRtb2RlICUgMTAwMCAnKScgJHVfcGx1c19yd2A7OworICAgICopCisgICAgICBpZiB0ZXN0IC16ICIkc3RyaXBjbWQiOyB0aGVuCisJdV9wbHVzX3J3PQorICAgICAgZWxzZQorCXVfcGx1c19ydz0sdStydworICAgICAgZmkKKyAgICAgIGNwX3VtYXNrPSRtb2RlJHVfcGx1c19ydzs7CisgIGVzYWMKK2ZpCisKK2ZvciBzcmMKK2RvCisgICMgUHJvdGVjdCBuYW1lcyBwcm9ibGVtYXRpYyBmb3IgYHRlc3QnIGFuZCBvdGhlciB1dGlsaXRpZXMuCisgIGNhc2UgJHNyYyBpbgorICAgIC0qIHwgWz1cKFwpIV0pIHNyYz0uLyRzcmM7OworICBlc2FjCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgZHN0PSRzcmMKKyAgICBkc3RkaXI9JGRzdAorICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgZHN0ZGlyX3N0YXR1cz0kPworICBlbHNlCisKKyAgICAjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZAorICAgICMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQKKyAgICAjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKyAgICBpZiB0ZXN0ICEgLWYgIiRzcmMiICYmIHRlc3QgISAtZCAiJHNyYyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiAkc3JjIGRvZXMgbm90IGV4aXN0LiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGRzdF9hcmciOyB0aGVuCisgICAgICBlY2hvICIkMDogbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkLiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorICAgIGRzdD0kZHN0X2FyZworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGRzdGRpcj0kZHN0CisgICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAorICAgICAgZHN0ZGlyX3N0YXR1cz0wCisgICAgZWxzZQorICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KKyAgICAgIGRzdGRpcj1gCisJKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAorCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKwllY2hvIFgiJGRzdCIgfAorCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXClbXi9dLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXCkkL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cKS4qL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIHMvLiovLi87IHEnCisgICAgICBgCisKKyAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgICBkc3RkaXJfc3RhdHVzPSQ/CisgICAgZmkKKyAgZmkKKworICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCisKKyAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCisgICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KKyAgICAgICcnKQorCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KKwkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgorCXVtYXNrPWB1bWFza2AKKwljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KKwkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKKwkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKKworCSAgKlswLTddKQorCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCisJICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKKwkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKKwkgICAgYDs7CisJICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7CisJZXNhYworCisJIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KKwkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCisJaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisJICBta2Rpcl9tb2RlPS1tJG1vZGUKKwllbHNlCisJICBta2Rpcl9tb2RlPQorCWZpCisKKwlwb3NpeF9ta2Rpcj1mYWxzZQorCWNhc2UgJHVtYXNrIGluCisJICAqWzEyMzU2N11bMC03XVswLTddKQorCSAgICAjIFBPU0lYIG1rZGlyIC1wIHNldHMgdSt3eCBiaXRzIHJlZ2FyZGxlc3Mgb2YgdW1hc2ssIHdoaWNoCisJICAgICMgaXMgaW5jb21wYXRpYmxlIHdpdGggRnJlZUJTRCAnaW5zdGFsbCcgd2hlbiAodW1hc2sgJiAzMDApICE9IDAuCisJICAgIDs7CisJICAqKQorCSAgICB0bXBkaXI9JHtUTVBESVItL3RtcH0vaW5zJFJBTkRPTS0kJAorCSAgICB0cmFwICdyZXQ9JD87IHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIiAyPi9kZXYvbnVsbDsgZXhpdCAkcmV0JyAwCisKKwkgICAgaWYgKHVtYXNrICRta2Rpcl91bWFzayAmJgorCQlleGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiR0bXBkaXIvZCIpID4vZGV2L251bGwgMj4mMQorCSAgICB0aGVuCisJICAgICAgaWYgdGVzdCAteiAiJGRpcl9hcmciIHx8IHsKKwkJICAgIyBDaGVjayBmb3IgUE9TSVggaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAtbS4KKwkJICAgIyBIUC1VWCAxMS4yMyBhbmQgSVJJWCA2LjUgbWtkaXIgLW0gLXAgc2V0cyBncm91cC0gb3IKKwkJICAgIyBvdGhlci13cml0ZWFibGUgYml0IG9mIHBhcmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBzaG91bGRuJ3QuCisJCSAgICMgRnJlZUJTRCA2LjEgbWtkaXIgLW0gLXAgc2V0cyBtb2RlIG9mIGV4aXN0aW5nIGRpcmVjdG9yeS4KKwkJICAgbHNfbGRfdG1wZGlyPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICBjYXNlICRsc19sZF90bXBkaXIgaW4KKwkJICAgICBkPz8/Py0/ci0qKSBkaWZmZXJlbnRfbW9kZT03MDA7OworCQkgICAgIGQ/Pz8/LT8tLSopIGRpZmZlcmVudF9tb2RlPTc1NTs7CisJCSAgICAgKikgZmFsc2U7OworCQkgICBlc2FjICYmCisJCSAgICRta2RpcnByb2cgLW0kZGlmZmVyZW50X21vZGUgLXAgLS0gIiR0bXBkaXIiICYmIHsKKwkJICAgICBsc19sZF90bXBkaXJfMT1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgICB0ZXN0ICIkbHNfbGRfdG1wZGlyIiA9ICIkbHNfbGRfdG1wZGlyXzEiCisJCSAgIH0KKwkJIH0KKwkgICAgICB0aGVuIHBvc2l4X21rZGlyPToKKwkgICAgICBmaQorCSAgICAgIHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBSZW1vdmUgYW55IGRpcnMgbGVmdCBiZWhpbmQgYnkgYW5jaWVudCBta2RpciBpbXBsZW1lbnRhdGlvbnMuCisJICAgICAgcm1kaXIgLi8kbWtkaXJfbW9kZSAuLy1wIC4vLS0gMj4vZGV2L251bGwKKwkgICAgZmkKKwkgICAgdHJhcCAnJyAwOzsKKwllc2FjOzsKKyAgICBlc2FjCisKKyAgICBpZgorICAgICAgJHBvc2l4X21rZGlyICYmICgKKwl1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiCisgICAgICApCisgICAgdGhlbiA6CisgICAgZWxzZQorCisgICAgICAjIFRoZSB1bWFzayBpcyByaWRpY3Vsb3VzLCBvciBta2RpciBkb2VzIG5vdCBjb25mb3JtIHRvIFBPU0lYLAorICAgICAgIyBvciBpdCBmYWlsZWQgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uICBDcmVhdGUgdGhlCisgICAgICAjIGRpcmVjdG9yeSB0aGUgc2xvdyB3YXksIHN0ZXAgYnkgc3RlcCwgY2hlY2tpbmcgZm9yIHJhY2VzIGFzIHdlIGdvLgorCisgICAgICBjYXNlICRkc3RkaXIgaW4KKwkvKikgcHJlZml4PScvJzs7CisJWy09XChcKSFdKikgcHJlZml4PScuLyc7OworCSopICBwcmVmaXg9Jyc7OworICAgICAgZXNhYworCisgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIgorCisgICAgICBvSUZTPSRJRlMKKyAgICAgIElGUz0vCisgICAgICAkcG9zaXhfZ2xvYiBzZXQgLWYKKyAgICAgIHNldCBmbm9yZCAkZHN0ZGlyCisgICAgICBzaGlmdAorICAgICAgJHBvc2l4X2dsb2Igc2V0ICtmCisgICAgICBJRlM9JG9JRlMKKworICAgICAgcHJlZml4ZXM9CisKKyAgICAgIGZvciBkCisgICAgICBkbworCXRlc3QgWCIkZCIgPSBYICYmIGNvbnRpbnVlCisKKwlwcmVmaXg9JHByZWZpeCRkCisJaWYgdGVzdCAtZCAiJHByZWZpeCI7IHRoZW4KKwkgIHByZWZpeGVzPQorCWVsc2UKKwkgIGlmICRwb3NpeF9ta2RpcjsgdGhlbgorCSAgICAodW1hc2s9JG1rZGlyX3VtYXNrICYmCisJICAgICAkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiKSAmJiBicmVhaworCSAgICAjIERvbid0IGZhaWwgaWYgdHdvIGluc3RhbmNlcyBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCisJICAgIHRlc3QgLWQgIiRwcmVmaXgiIHx8IGV4aXQgMQorCSAgZWxzZQorCSAgICBjYXNlICRwcmVmaXggaW4KKwkgICAgICAqXCcqKSBxcHJlZml4PWBlY2hvICIkcHJlZml4IiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisJICAgICAgKikgcXByZWZpeD0kcHJlZml4OzsKKwkgICAgZXNhYworCSAgICBwcmVmaXhlcz0iJHByZWZpeGVzICckcXByZWZpeCciCisJICBmaQorCWZpCisJcHJlZml4PSRwcmVmaXgvCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwcmVmaXhlcyI7IHRoZW4KKwkjIERvbid0IGZhaWwgaWYgdHdvIGluc3RhbmNlcyBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCisJKHVtYXNrICRta2Rpcl91bWFzayAmJgorCSBldmFsICJcJGRvaXRfZXhlYyBcJG1rZGlycHJvZyAkcHJlZml4ZXMiKSB8fAorCSAgdGVzdCAtZCAiJGRzdGRpciIgfHwgZXhpdCAxCisJb2Jzb2xldGVfbWtkaXJfdXNlZD10cnVlCisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAiJG9ic29sZXRlX21rZGlyX3VzZWQkY2hvd25jbWQkY2hncnBjbWQiID0gZmFsc2UgfHwKKyAgICAgIHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICRtb2RlICIkZHN0IjsgfSB8fCBleGl0IDEKKyAgZWxzZQorCisgICAgIyBNYWtlIGEgY291cGxlIG9mIHRlbXAgZmlsZSBuYW1lcyBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKyAgICBkc3R0bXA9JGRzdGRpci9faW5zdC4kJF8KKyAgICBybXRtcD0kZHN0ZGlyL19ybS4kJF8KKworICAgICMgVHJhcCB0byBjbGVhbiB1cCB0aG9zZSB0ZW1wIGZpbGVzIGF0IGV4aXQuCisgICAgdHJhcCAncmV0PSQ/OyBybSAtZiAiJGRzdHRtcCIgIiRybXRtcCIgJiYgZXhpdCAkcmV0JyAwCisKKyAgICAjIENvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lLgorICAgICh1bWFzayAkY3BfdW1hc2sgJiYgJGRvaXRfZXhlYyAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIpICYmCisKKyAgICAjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMuCisgICAgIworICAgICMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyAgICAjIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKKyAgICAjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGNwcHJvZyAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCisgICAgIworICAgIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3R0bXAiOyB9ICYmCisKKyAgICAjIElmIC1DLCBkb24ndCBib3RoZXIgdG8gY29weSBpZiBpdCB3b3VsZG4ndCBjaGFuZ2UgdGhlIGZpbGUuCisgICAgaWYgJGNvcHlfb25fY2hhbmdlICYmCisgICAgICAgb2xkPWBMQ19BTEw9QyBscyAtZGxMICIkZHN0IgkyPi9kZXYvbnVsbGAgJiYKKyAgICAgICBuZXc9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3R0bXAiCTI+L2Rldi9udWxsYCAmJgorCisgICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIgJiYKKyAgICAgICAkcG9zaXhfZ2xvYiBzZXQgLWYgJiYKKyAgICAgICBzZXQgWCAkb2xkICYmIG9sZD06JDI6JDQ6JDU6JDYgJiYKKyAgICAgICBzZXQgWCAkbmV3ICYmIG5ldz06JDI6JDQ6JDU6JDYgJiYKKyAgICAgICAkcG9zaXhfZ2xvYiBzZXQgK2YgJiYKKworICAgICAgIHRlc3QgIiRvbGQiID0gIiRuZXciICYmCisgICAgICAgJGNtcHByb2cgIiRkc3QiICIkZHN0dG1wIiA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuCisgICAgICBybSAtZiAiJGRzdHRtcCIKKyAgICBlbHNlCisgICAgICAjIFJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICAgICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3QiIDI+L2Rldi9udWxsIHx8CisKKyAgICAgICMgVGhlIHJlbmFtZSBmYWlsZWQsIHBlcmhhcHMgYmVjYXVzZSBtdiBjYW4ndCByZW5hbWUgc29tZXRoaW5nIGVsc2UKKyAgICAgICMgdG8gaXRzZWxmLCBvciBwZXJoYXBzIGJlY2F1c2UgbXYgaXMgc28gYW5jaWVudCB0aGF0IGl0IGRvZXMgbm90CisgICAgICAjIHN1cHBvcnQgLWYuCisgICAgICB7CisJIyBOb3cgcmVtb3ZlIG9yIG1vdmUgYXNpZGUgYW55IG9sZCBmaWxlIGF0IGRlc3RpbmF0aW9uIGxvY2F0aW9uLgorCSMgV2UgdHJ5IHRoaXMgdHdvIHdheXMgc2luY2Ugcm0gY2FuJ3QgdW5saW5rIGl0c2VsZiBvbiBzb21lCisJIyBzeXN0ZW1zIGFuZCB0aGUgZGVzdGluYXRpb24gZmlsZSBtaWdodCBiZSBidXN5IGZvciBvdGhlcgorCSMgcmVhc29ucy4gIEluIHRoaXMgY2FzZSwgdGhlIGZpbmFsIGNsZWFudXAgbWlnaHQgZmFpbCBidXQgdGhlIG5ldworCSMgZmlsZSBzaG91bGQgc3RpbGwgaW5zdGFsbCBzdWNjZXNzZnVsbHkuCisJeworCSAgdGVzdCAhIC1mICIkZHN0IiB8fAorCSAgJGRvaXQgJHJtY21kIC1mICIkZHN0IiAyPi9kZXYvbnVsbCB8fAorCSAgeyAkZG9pdCAkbXZjbWQgLWYgIiRkc3QiICIkcm10bXAiIDI+L2Rldi9udWxsICYmCisJICAgIHsgJGRvaXQgJHJtY21kIC1mICIkcm10bXAiIDI+L2Rldi9udWxsOyA6OyB9CisJICB9IHx8CisJICB7IGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0IiA+JjIKKwkgICAgKGV4aXQgMSk7IGV4aXQgMQorCSAgfQorCX0gJiYKKworCSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKwkkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0IgorICAgICAgfQorICAgIGZpIHx8IGV4aXQgMQorCisgICAgdHJhcCAnJyAwCisgIGZpCitkb25lCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2x0bWFpbi5zaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg1MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9idWlsZC1hdXgvbHRtYWluLnNoCkBAIC0wLDAgKzEsOTY2MSBAQAorCisjIGxpYnRvb2wgKEdOVSBsaWJ0b29sKSAyLjQuMgorIyBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwKKyMgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KKyMgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKKyMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KKyMKKyMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjCisjICAgICAgIC0tY29uZmlnICAgICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisjICAgICAgIC0tZGVidWcgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKKyMgICAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyMgICAgICAgLS1mZWF0dXJlcyAgICAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisjICAgICAgIC0tbW9kZT1NT0RFICAgICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFCisjICAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKyMgICAgICAgLS1xdWlldCwgLS1zaWxlbnQgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworIyAgICAgICAtLW5vLXF1aWV0LCAtLW5vLXNpbGVudAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIChkZWZhdWx0KQorIyAgICAgICAtLW5vLXdhcm4gICAgICAgICAgICBkb24ndCBkaXNwbGF5IHdhcm5pbmcgbWVzc2FnZXMKKyMgICAgICAgLS10YWc9VEFHICAgICAgICAgICAgdXNlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZyb20gdGFnIFRBRworIyAgIC12LCAtLXZlcmJvc2UgICAgICAgICAgICBwcmludCBtb3JlIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhbiBkZWZhdWx0CisjICAgICAgIC0tbm8tdmVyYm9zZSAgICAgICAgIGRvbid0IHByaW50IHRoZSBleHRyYSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisjICAgICAgIC0tdmVyc2lvbiAgICAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KKyMgICAtaCwgLS1oZWxwLCAtLWhlbHAtYWxsICAgcHJpbnQgc2hvcnQsIGxvbmcsIG9yIGRldGFpbGVkIGhlbHAgbWVzc2FnZQorIworIyBNT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisjCisjICAgICAgICAgY2xlYW4gICAgICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKKyMgICAgICAgICBjb21waWxlICAgICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAorIyAgICAgICAgIGV4ZWN1dGUgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorIyAgICAgICAgIGZpbmlzaCAgICAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisjICAgICAgICAgaW5zdGFsbCAgICAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCisjICAgICAgICAgbGluayAgICAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorIyAgICAgICAgIHVuaW5zdGFsbCAgICAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorIworIyBNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBXaGVuIHBhc3NlZCBhcyBmaXJzdCBvcHRpb24sCisjIGAtLW1vZGU9TU9ERScgbWF5IGJlIGFiYnJldmlhdGVkIGFzIGBNT0RFJyBvciBhIHVuaXF1ZSBhYmJyZXZpYXRpb24gb2YgdGhhdC4KKyMgVHJ5IGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuCisjCisjIFdoZW4gcmVwb3J0aW5nIGEgYnVnLCBwbGVhc2UgZGVzY3JpYmUgYSB0ZXN0IGNhc2UgdG8gcmVwcm9kdWNlIGl0IGFuZAorIyBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisjCisjICAgICAgICAgaG9zdC10cmlwbGV0OgkkaG9zdAorIyAgICAgICAgIHNoZWxsOgkJJFNIRUxMCisjICAgICAgICAgY29tcGlsZXI6CQkkTFRDQworIyAgICAgICAgIGNvbXBpbGVyIGZsYWdzOgkJJExUQ0ZMQUdTCisjICAgICAgICAgbGlua2VyOgkJJExEIChnbnU/ICR3aXRoX2dudV9sZCkKKyMgICAgICAgICAkcHJvZ25hbWU6CShHTlUgbGlidG9vbCkgMi40LjIgRGViaWFuLTIuNC4yLTF1YnVudHUxCisjICAgICAgICAgYXV0b21ha2U6CSRhdXRvbWFrZV92ZXJzaW9uCisjICAgICAgICAgYXV0b2NvbmY6CSRhdXRvY29uZl92ZXJzaW9uCisjCisjIFJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4KKyMgR05VIGxpYnRvb2wgaG9tZSBwYWdlOiA8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYnRvb2wvPi4KKyMgR2VuZXJhbCBoZWxwIHVzaW5nIEdOVSBzb2Z0d2FyZTogPGh0dHA6Ly93d3cuZ251Lm9yZy9nZXRoZWxwLz4uCisKK1BST0dSQU09bGlidG9vbAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPSIyLjQuMiBEZWJpYW4tMi40LjItMXVidW50dTEiCitUSU1FU1RBTVA9IiIKK3BhY2thZ2VfcmV2aXNpb249MS4zMzM3CisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorJDEKK19MVEVDSE9fRU9GJworfQorCisjIE5MUyBudWlzYW5jZXM6IFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgorbHRfdXNlcl9sb2NhbGU9CitsdF9zYWZlX2xvY2FsZT0KK2ZvciBsdF92YXIgaW4gTEFORyBMQU5HVUFHRSBMQ19BTEwgTENfQ1RZUEUgTENfQ09MTEFURSBMQ19NRVNTQUdFUworZG8KKyAgZXZhbCAiaWYgdGVzdCBcIlwkeyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCisgICAgICAgICAgc2F2ZV8kbHRfdmFyPVwkJGx0X3ZhcgorICAgICAgICAgICRsdF92YXI9QworCSAgZXhwb3J0ICRsdF92YXIKKwkgIGx0X3VzZXJfbG9jYWxlPVwiJGx0X3Zhcj1cXFwkc2F2ZV9cJGx0X3ZhcjsgXCRsdF91c2VyX2xvY2FsZVwiCisJICBsdF9zYWZlX2xvY2FsZT1cIiRsdF92YXI9QzsgXCRsdF9zYWZlX2xvY2FsZVwiCisJZmkiCitkb25lCitMQ19BTEw9QworTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFIExDX0FMTAorCiskbHRfdW5zZXQgQ0RQQVRICisKKworIyBXb3JrIGFyb3VuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlIG9uIElSSVggNi41LiBPbiBJUklYIDYuNCssIHNoCisjIGlzIGtzaCBidXQgd2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCBhcyAic2giIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZgorIyB0aGUgX1hQRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gMSAob25lKSwgdGhlIHNwZWNpYWwKKyMgcG9zaXRpb25hbCBwYXJhbWV0ZXIgJDAsIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwsIGlzIHRoZSBuYW1lIG9mIHRoZQorIyBmdW5jdGlvbi4KK3Byb2dwYXRoPSIkMCIKKworCisKKzogJHtDUD0iY3AgLWYifQordGVzdCAiJHtFQ0hPK3NldH0iID0gc2V0IHx8IEVDSE89JHthc19lY2hvLSdwcmludGYgJXNcbid9Cis6ICR7TUFLRT0ibWFrZSJ9Cis6ICR7TUtESVI9Im1rZGlyIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9Cis6ICR7U0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9In0KKzogJHtYc2VkPSIkU0VEIC1lIDFzL15YLy8ifQorCisjIEdsb2JhbCB2YXJpYWJsZXM6CitFWElUX1NVQ0NFU1M9MAorRVhJVF9GQUlMVVJFPTEKK0VYSVRfTUlTTUFUQ0g9NjMgICMgJD8gPSA2MyBpcyB1c2VkIHRvIGluZGljYXRlIHZlcnNpb24gbWlzbWF0Y2ggdG8gbWlzc2luZy4KK0VYSVRfU0tJUD03NwkgICMgJD8gPSA3NyBpcyB1c2VkIHRvIGluZGljYXRlIGEgc2tpcHBlZCB0ZXN0IHRvIGF1dG9tYWtlLgorCitleGl0X3N0YXR1cz0kRVhJVF9TVUNDRVNTCisKKyMgTWFrZSBzdXJlIElGUyBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0CitsdF9ubD0nCisnCitJRlM9IiAJJGx0X25sIgorCitkaXJuYW1lPSJzLC9bXi9dKiQsLCIKK2Jhc2VuYW1lPSJzLF4uKi8sLCIKKworIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCisjIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KK2Z1bmNfZGlybmFtZSAoKQoreworICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRkaXJuYW1lImAKKyAgICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgICAgZmkKK30gIyBmdW5jX2Rpcm5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2Jhc2VuYW1lIGZpbGUKK2Z1bmNfYmFzZW5hbWUgKCkKK3sKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGJhc2VuYW1lImAKK30gIyBmdW5jX2Jhc2VuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KKyMgY2FsbDoKKyMgICBkaXJuYW1lOiAgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksCisjICAgICAgICAgICAgIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIHNldCByZXN1bHQKKyMgICAgICAgICAgICAgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisjICAgYmFzZW5hbWU6IENvbXB1dGUgZmlsZW5hbWUgb2YgRklMRS4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dW5lZCBpbiAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorIyBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggZnVuY19kaXJuYW1lCisjIGFuZCBmdW5jX2Jhc2VuYW1lLiBGb3IgZWZmaWNpZW5jeSwgd2UgZG8gbm90IGRlbGVnYXRlIHRvCisjIHRob3NlIGZ1bmN0aW9ucyBidXQgaW5zdGVhZCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgaGVyZS4KK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkKK3sKKyAgICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgLWUgIiRkaXJuYW1lImAKKyAgICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgICAgZmkKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAtZSAiJGJhc2VuYW1lImAKK30gIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorIyBmdW5jX3N0cmlwX3N1ZmZpeCBwcmVmaXggbmFtZQorZnVuY19zdHJpcG5hbWUgKCkKK3sKKyAgICBjYXNlICR7Mn0gaW4KKyAgICAgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyVcXFxcJHsyfVwkJSUiYDs7CisgICAgICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlJHsyfVwkJSUiYDs7CisgICAgZXNhYworfSAjIGZ1bmNfc3RyaXBuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgVGhlc2UgU0VEIHNjcmlwdHMgcHJlc3VwcG9zZSBhbiBhYnNvbHV0ZSBwYXRoIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KK3BhdGhjYXI9J3MsXi9cKFteL10qXCkuKiQsXDEsJworcGF0aGNkcj0ncyxeL1teL10qLCwnCityZW1vdmVkb3RwYXJ0cz0nOmRvdHNsCisJCXNAL1wuL0AvQGcKKwkJdCBkb3RzbAorCQlzLC9cLiQsLywnCitjb2xsYXBzZXNsYXNoZXM9J3NAL1x7MSxcfUAvQGcnCitmaW5hbHNsYXNoPSdzLC8qJCwvLCcKKworIyBmdW5jX25vcm1hbF9hYnNwYXRoIFBBVEgKKyMgUmVtb3ZlIGRvdWJsZWQtdXAgYW5kIHRyYWlsaW5nIHNsYXNoZXMsICIuIiBwYXRoIGNvbXBvbmVudHMsCisjIGFuZCBjYW5jZWwgb3V0IGFueSAiLi4iIHBhdGggY29tcG9uZW50cyBpbiBQQVRIIGFmdGVyIG1ha2luZworIyBpdCBhbiBhYnNvbHV0ZSBwYXRoLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IgorZnVuY19ub3JtYWxfYWJzcGF0aCAoKQoreworICAjIFN0YXJ0IGZyb20gcm9vdCBkaXIgYW5kIHJlYXNzZW1ibGUgdGhlIHBhdGguCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PQorICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPSQxCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfYWx0bmFtZXNwYWNlPQorICBjYXNlICRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIGluCisgICAgIiIpCisgICAgICAjIEVtcHR5IHBhdGgsIHRoYXQganVzdCBtZWFucyAkY3dkLgorICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICJgcHdkYCIKKyAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICAgIHJldHVybgorICAgIDs7CisgICAgIyBUaGUgbmV4dCB0aHJlZSBlbnRyaWVzIGFyZSB1c2VkIHRvIHNwb3QgYSBydW4gb2YgcHJlY2lzZWx5CisgICAgIyB0d28gbGVhZGluZyBzbGFzaGVzIHdpdGhvdXQgdXNpbmcgbmVnYXRlZCBjaGFyYWN0ZXIgY2xhc3NlczsKKyAgICAjIHdlIHRha2UgYWR2YW50YWdlIG9mIGNhc2UncyBmaXJzdC1tYXRjaCBiZWhhdmlvdXIuCisgICAgLy8vKikKKyAgICAgICMgVW51c3VhbCBmb3JtIG9mIGFic29sdXRlIHBhdGgsIGRvIG5vdGhpbmcuCisgICAgOzsKKyAgICAvLyopCisgICAgICAjIE5vdCBuZWNlc3NhcmlseSBhbiBvcmRpbmFyeSBwYXRoOyBQT1NJWCByZXNlcnZlcyBsZWFkaW5nICcvLycKKyAgICAgICMgYW5kIGZvciBleGFtcGxlIEN5Z3dpbiB1c2VzIGl0IHRvIGFjY2VzcyByZW1vdGUgZmlsZSBzaGFyZXMKKyAgICAgICMgb3ZlciBDSUZTL1NNQiwgc28gd2UgY29uc2VydmUgYSBsZWFkaW5nIGRvdWJsZSBzbGFzaCBpZiBmb3VuZC4KKyAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfYWx0bmFtZXNwYWNlPS8KKyAgICA7OworICAgIC8qKQorICAgICAgIyBBYnNvbHV0ZSBwYXRoLCBkbyBub3RoaW5nLgorICAgIDs7CisgICAgKikKKyAgICAgICMgUmVsYXRpdmUgcGF0aCwgcHJlcGVuZCAkY3dkLgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD1gcHdkYC8kZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aAorICAgIDs7CisgIGVzYWMKKyAgIyBDYW5jZWwgb3V0IGFsbCB0aGUgc2ltcGxlIHN0dWZmIHRvIHNhdmUgaXRlcmF0aW9ucy4gIFdlIGFsc28gd2FudAorICAjIHRoZSBwYXRoIHRvIGVuZCB3aXRoIGEgc2xhc2ggZm9yIGVhc2Ugb2YgcGFyc2luZywgc28gbWFrZSBzdXJlCisgICMgdGhlcmUgaXMgb25lIChhbmQgb25seSBvbmUpIGhlcmUuCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKKyAgICAgICAgLWUgIiRyZW1vdmVkb3RwYXJ0cyIgLWUgIiRjb2xsYXBzZXNsYXNoZXMiIC1lICIkZmluYWxzbGFzaCJgCisgIHdoaWxlIDo7IGRvCisgICAgIyBQcm9jZXNzZWQgaXQgYWxsIHlldD8KKyAgICBpZiB0ZXN0ICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgPSAvIDsgdGhlbgorICAgICAgIyBJZiB3ZSBhc2NlbmRlZCB0byB0aGUgcm9vdCB1c2luZyAiLi4iIHRoZSByZXN1bHQgbWF5IGJlIGVtcHR5IG5vdy4KKyAgICAgIGlmIHRlc3QgLXogIiRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdCIgOyB0aGVuCisgICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PS8KKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgICAgZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50PWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCisgICAgICAgIC1lICIkcGF0aGNhciJgCisgICAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAorICAgICAgICAtZSAiJHBhdGhjZHIiYAorICAgICMgRmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggaXQKKyAgICBjYXNlICRmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQgaW4KKyAgICAgICIiKQorICAgICAgICAjIFRyYWlsaW5nIGVtcHR5IHBhdGggY29tcG9uZW50LCBpZ25vcmUgaXQuCisgICAgICA7OworICAgICAgLi4pCisgICAgICAgICMgUGFyZW50IGRpcjsgc3RyaXAgbGFzdCBhc3NlbWJsZWQgY29tcG9uZW50IGZyb20gcmVzdWx0LgorICAgICAgICBmdW5jX2Rpcm5hbWUgIiRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdCIKKyAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKyAgICAgIDs7CisgICAgICAqKQorICAgICAgICAjIEFjdHVhbCBwYXRoIGNvbXBvbmVudCwgYXBwZW5kIGl0LgorICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQvJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudAorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIyBSZXN0b3JlIGxlYWRpbmcgZG91YmxlLXNsYXNoIGlmIG9uZSB3YXMgZm91bmQgb24gZW50cnkuCisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAorfQorCisjIGZ1bmNfcmVsYXRpdmVfcGF0aCBTUkNESVIgRFNURElSCisjIGdlbmVyYXRlcyBhIHJlbGF0aXZlIHBhdGggZnJvbSBTUkNESVIgdG8gRFNURElSLCB3aXRoIGEgdHJhaWxpbmcKKyMgc2xhc2ggaWYgbm9uLWVtcHR5LCBzdWl0YWJsZSBmb3IgaW1tZWRpYXRlbHkgYXBwZW5kaW5nIGEgZmlsZW5hbWUKKyMgd2l0aG91dCBuZWVkaW5nIHRvIGFwcGVuZCBhIHNlcGFyYXRvci4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IgorZnVuY19yZWxhdGl2ZV9wYXRoICgpCit7CisgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9CisgIGZ1bmNfbm9ybWFsX2Fic3BhdGggIiQxIgorICBmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcj0kZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKKyAgZnVuY19ub3JtYWxfYWJzcGF0aCAiJDIiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyPSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAorCisgICMgQXNjZW5kIHRoZSB0cmVlIHN0YXJ0aW5nIGZyb20gbGliZGlyCisgIHdoaWxlIDo7IGRvCisgICAgIyBjaGVjayBpZiB3ZSBoYXZlIGZvdW5kIGEgcHJlZml4IG9mIGJpbmRpcgorICAgIGNhc2UgJGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyIGluCisgICAgICAkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIpCisgICAgICAgICMgZm91bmQgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9CisgICAgICAgIGJyZWFrCisgICAgICAgIDs7CisgICAgICAkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIqKQorICAgICAgICAjIGZvdW5kIGEgbWF0Y2hpbmcgcHJlZml4CisgICAgICAgIGZ1bmNfc3RyaXBuYW1lICIkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIiICcnICIkZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXIiCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiOyB0aGVuCisgICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX2Rpcm5hbWUgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyPSR7ZnVuY19kaXJuYW1lX3Jlc3VsdH0KKyAgICAgICAgaWYgdGVzdCAieCRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciIgPSB4IDsgdGhlbgorICAgICAgICAgICMgSGF2ZSB0byBkZXNjZW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IQorICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9Li4vJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQKKyAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0kZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXIKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4uLyRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0CisgICAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIyBOb3cgY2FsY3VsYXRlIHBhdGg7IHRha2UgY2FyZSB0byBhdm9pZCBkb3VibGluZy11cCBzbGFzaGVzLgorICBmdW5jX3N0cmlwbmFtZSAnJyAnLycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IgorICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgZnVuY19zdHJpcG5hbWUgJy8nICcvJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkIgorICBpZiB0ZXN0ICJ4JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIgIT0geCA7IHRoZW4KKyAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PSR7ZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdH0vJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9CisgIGZpCisKKyAgIyBOb3JtYWxpc2F0aW9uLiBJZiBiaW5kaXIgaXMgbGliZGlyLCByZXR1cm4gZW1wdHkgc3RyaW5nLAorICAjIGVsc2UgcmVsYXRpdmUgcGF0aCBlbmRpbmcgd2l0aCBhIHNsYXNoOyBlaXRoZXIgd2F5LCB0YXJnZXQKKyAgIyBmaWxlIG5hbWUgY2FuIGJlIGRpcmVjdGx5IGFwcGVuZGVkLgorICBpZiB0ZXN0ICEgLXogIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IjsgdGhlbgorICAgIGZ1bmNfc3RyaXBuYW1lICcuLycgJycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0LyIKKyAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgZmkKK30KKworIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW06CitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkcHJvZ3BhdGgiCitwcm9nbmFtZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKKworIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBwYXRoIGZvciByZWV4ZWN1dGlvbjoKK2Nhc2UgJHByb2dwYXRoIGluCisgIFtcXC9dKnxbQS1aYS16XTpcXCopIDs7CisgICpbXFwvXSopCisgICAgIHByb2dkaXI9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKyAgICAgcHJvZ2Rpcj1gY2QgIiRwcm9nZGlyIiAmJiBwd2RgCisgICAgIHByb2dwYXRoPSIkcHJvZ2Rpci8kcHJvZ25hbWUiCisgICAgIDs7CisgICopCisgICAgIHNhdmVfSUZTPSIkSUZTIgorICAgICBJRlM9JHtQQVRIX1NFUEFSQVRPUi06fQorICAgICBmb3IgcHJvZ2RpciBpbiAkUEFUSDsgZG8KKyAgICAgICBJRlM9IiRzYXZlX0lGUyIKKyAgICAgICB0ZXN0IC14ICIkcHJvZ2Rpci8kcHJvZ25hbWUiICYmIGJyZWFrCisgICAgIGRvbmUKKyAgICAgSUZTPSIkc2F2ZV9JRlMiCisgICAgIHRlc3QgLW4gIiRwcm9nZGlyIiB8fCBwcm9nZGlyPWBwd2RgCisgICAgIHByb2dwYXRoPSIkcHJvZ2Rpci8kcHJvZ25hbWUiCisgICAgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSIke1NFRH0iJyAtZSAxcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW2AiJFxcXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbImBcXF1cKS9cXFwxL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IHR1cm5zIGEgc3RyaW5nIGludG8gYSByZWdleCBtYXRjaGluZyBmb3IgdGhlCisjIHN0cmluZyBsaXRlcmFsbHkuCitzZWRfbWFrZV9saXRlcmFsX3JlZ2V4PSdzLFtdLlteJFxcKlwvXSxcXCYsZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgY29udmVydHMgYSB3MzIgZmlsZSBuYW1lIG9yIHBhdGgKKyMgd2hpY2ggY29udGFpbnMgZm9yd2FyZCBzbGFzaGVzLCBpbnRvIG9uZSB0aGF0IGNvbnRhaW5zCisjIChlc2NhcGVkKSBiYWNrc2xhc2hlcy4gIEEgdmVyeSBuYWl2ZSBpbXBsZW1lbnRhdGlvbi4KK2x0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnk9J3N8XFxcXCp8XFx8ZztzfC98XFx8ZztzfFxcfFxcXFx8ZycKKworIyBSZS1gXCcgcGFyYW1ldGVyIGV4cGFuc2lvbnMgaW4gb3V0cHV0IG9mIGRvdWJsZV9xdW90ZV9zdWJzdCB0aGF0IHdlcmUKKyMgYFwnLWVkIGluIGlucHV0IHRvIHRoZSBzYW1lLiAgSWYgYW4gb2RkIG51bWJlciBvZiBgXCcgcHJlY2VkZWQgYSAnJCcKKyMgaW4gaW5wdXQgdG8gZG91YmxlX3F1b3RlX3N1YnN0LCB0aGF0ICckJyB3YXMgcHJvdGVjdGVkIGZyb20gZXhwYW5zaW9uLgorIyBTaW5jZSBlYWNoIGlucHV0IGBcJyBpcyBub3cgdHdvIGBcJ3MsIGxvb2sgZm9yIGFueSBudW1iZXIgb2YgcnVucyBvZgorIyBmb3VyIGBcJ3MgZm9sbG93ZWQgYnkgdHdvIGBcJ3MgYW5kIHRoZW4gYSAnJCcuICBgXCcgdGhhdCAnJCcuCiticz0nXFwnCiticzI9J1xcXFwnCiticzQ9J1xcXFxcXFxcJworZG9sbGFyPSdcJCcKK3NlZF9kb3VibGVfYmFja3NsYXNoPSJcCisgIHMvJGJzNC8mXFwKKy9nCisgIHMvXiRiczIkZG9sbGFyLyRicyYvCisgIHMvXFwoW14kYnNdXFwpJGJzMiRkb2xsYXIvXFwxJGJzMiRicyRkb2xsYXIvZworICBzL1xuLy9nIgorCisjIFN0YW5kYXJkIG9wdGlvbnM6CitvcHRfZHJ5X3J1bj1mYWxzZQorb3B0X2hlbHA9ZmFsc2UKK29wdF9xdWlldD1mYWxzZQorb3B0X3ZlcmJvc2U9ZmFsc2UKK29wdF93YXJuaW5nPToKKworIyBmdW5jX2VjaG8gYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UsIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgbW9kZQorIyBuYW1lIGlmIGl0IGhhcyBiZWVuIHNldCB5ZXQuCitmdW5jX2VjaG8gKCkKK3sKKyAgICAkRUNITyAiJHByb2duYW1lOiAke29wdF9tb2RlKyRvcHRfbW9kZTogfSQqIgorfQorCisjIGZ1bmNfdmVyYm9zZSBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSBpbiB2ZXJib3NlIG1vZGUgb25seS4KK2Z1bmNfdmVyYm9zZSAoKQoreworICAgICRvcHRfdmVyYm9zZSAmJiBmdW5jX2VjaG8gJHsxKyIkQCJ9CisKKyAgICAjIEEgYnVnIGluIGJhc2ggaGFsdHMgdGhlIHNjcmlwdCBpZiB0aGUgbGFzdCBsaW5lIG9mIGEgZnVuY3Rpb24KKyAgICAjIGZhaWxzIHdoZW4gc2V0IC1lIGlzIGluIGZvcmNlLCBzbyB3ZSBuZWVkIGFub3RoZXIgY29tbWFuZCB0bworICAgICMgd29yayBhcm91bmQgdGhhdDoKKyAgICA6Cit9CisKKyMgZnVuY19lY2hvX2FsbCBhcmcuLi4KKyMgSW52b2tlICRFQ0hPIHdpdGggYWxsIGFyZ3MsIHNwYWNlLXNlcGFyYXRlZC4KK2Z1bmNfZWNob19hbGwgKCkKK3sKKyAgICAkRUNITyAiJCoiCit9CisKKyMgZnVuY19lcnJvciBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KK2Z1bmNfZXJyb3IgKCkKK3sKKyAgICAkRUNITyAiJHByb2duYW1lOiAke29wdF9tb2RlKyRvcHRfbW9kZTogfSIkezErIiRAIn0gMT4mMgorfQorCisjIGZ1bmNfd2FybmluZyBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgd2FybmluZyBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgorZnVuY193YXJuaW5nICgpCit7CisgICAgJG9wdF93YXJuaW5nICYmICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9d2FybmluZzogIiR7MSsiJEAifSAxPiYyCisKKyAgICAjIGJhc2ggYnVnIGFnYWluOgorICAgIDoKK30KKworIyBmdW5jX2ZhdGFsX2Vycm9yIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfZXJyb3IgKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorfQorCisjIGZ1bmNfZmF0YWxfaGVscCBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKKyMgYSBoZWxwIGhpbnQsIGFuZCBleGl0LgorZnVuY19mYXRhbF9oZWxwICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBmdW5jX2ZhdGFsX2Vycm9yICIkaGVscCIKK30KK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgICMjIGRlZmF1bHQKKworCisjIGZ1bmNfZ3JlcCBleHByZXNzaW9uIGZpbGVuYW1lCisjIENoZWNrIHdoZXRoZXIgRVhQUkVTU0lPTiBtYXRjaGVzIGFueSBsaW5lIG9mIEZJTEVOQU1FLCB3aXRob3V0IG91dHB1dC4KK2Z1bmNfZ3JlcCAoKQoreworICAgICRHUkVQICIkMSIgIiQyIiA+L2Rldi9udWxsIDI+JjEKK30KKworCisjIGZ1bmNfbWtkaXJfcCBkaXJlY3RvcnktcGF0aAorIyBNYWtlIHN1cmUgdGhlIGVudGlyZSBwYXRoIHRvIERJUkVDVE9SWS1QQVRIIGlzIGF2YWlsYWJsZS4KK2Z1bmNfbWtkaXJfcCAoKQoreworICAgIG15X2RpcmVjdG9yeV9wYXRoPSIkMSIKKyAgICBteV9kaXJfbGlzdD0KKworICAgIGlmIHRlc3QgLW4gIiRteV9kaXJlY3RvcnlfcGF0aCIgJiYgdGVzdCAiJG9wdF9kcnlfcnVuIiAhPSAiOiI7IHRoZW4KKworICAgICAgIyBQcm90ZWN0IGRpcmVjdG9yeSBuYW1lcyBzdGFydGluZyB3aXRoIGAtJworICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4KKyAgICAgICAgLSopIG15X2RpcmVjdG9yeV9wYXRoPSIuLyRteV9kaXJlY3RvcnlfcGF0aCIgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBXaGlsZSBzb21lIHBvcnRpb24gb2YgRElSIGRvZXMgbm90IHlldCBleGlzdC4uLgorICAgICAgd2hpbGUgdGVzdCAhIC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiOyBkbworICAgICAgICAjIC4uLm1ha2UgYSBsaXN0IGluIHRvcG1vc3QgZmlyc3Qgb3JkZXIuICBVc2UgYSBjb2xvbiBkZWxpbWl0ZWQKKwkjIGxpc3QgaW5jYXNlIHNvbWUgcG9ydGlvbiBvZiBwYXRoIGNvbnRhaW5zIHdoaXRlc3BhY2UuCisgICAgICAgIG15X2Rpcl9saXN0PSIkbXlfZGlyZWN0b3J5X3BhdGg6JG15X2Rpcl9saXN0IgorCisgICAgICAgICMgSWYgdGhlIGxhc3QgcG9ydGlvbiBhZGRlZCBoYXMgbm8gc2xhc2ggaW4gaXQsIHRoZSBsaXN0IGlzIGRvbmUKKyAgICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4gKi8qKSA7OyAqKSBicmVhayA7OyBlc2FjCisKKyAgICAgICAgIyAuLi5vdGhlcndpc2UgdGhyb3cgYXdheSB0aGUgY2hpbGQgZGlyZWN0b3J5IGFuZCBsb29wCisgICAgICAgIG15X2RpcmVjdG9yeV9wYXRoPWAkRUNITyAiJG15X2RpcmVjdG9yeV9wYXRoIiB8ICRTRUQgLWUgIiRkaXJuYW1lImAKKyAgICAgIGRvbmUKKyAgICAgIG15X2Rpcl9saXN0PWAkRUNITyAiJG15X2Rpcl9saXN0IiB8ICRTRUQgJ3MsOiokLCwnYAorCisgICAgICBzYXZlX21rZGlyX3BfSUZTPSIkSUZTIjsgSUZTPSc6JworICAgICAgZm9yIG15X2RpciBpbiAkbXlfZGlyX2xpc3Q7IGRvCisJSUZTPSIkc2F2ZV9ta2Rpcl9wX0lGUyIKKyAgICAgICAgIyBta2RpciBjYW4gZmFpbCB3aXRoIGEgYEZpbGUgZXhpc3QnIGVycm9yIGlmIHR3byBwcm9jZXNzZXMKKyAgICAgICAgIyB0cnkgdG8gY3JlYXRlIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgY29uY3VycmVudGx5LiAgRG9uJ3QKKyAgICAgICAgIyBzdG9wIGluIHRoYXQgY2FzZSEKKyAgICAgICAgJE1LRElSICIkbXlfZGlyIiAyPi9kZXYvbnVsbCB8fCA6CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgorCisgICAgICAjIEJhaWwgb3V0IGlmIHdlIChvciBzb21lIG90aGVyIHByb2Nlc3MpIGZhaWxlZCB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisgICAgICB0ZXN0IC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiIHx8IFwKKyAgICAgICAgZnVuY19mYXRhbF9lcnJvciAiRmFpbGVkIHRvIGNyZWF0ZSBcYCQxJyIKKyAgICBmaQorfQorCisKKyMgZnVuY19ta3RlbXBkaXIgW3N0cmluZ10KKyMgTWFrZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3b24ndCBjbGFzaCB3aXRoIG90aGVyIHJ1bm5pbmcKKyMgbGlidG9vbCBwcm9jZXNzZXMsIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGlmIHBvc3NpYmxlLiAgSWYKKyMgZ2l2ZW4sIFNUUklORyBpcyB0aGUgYmFzZW5hbWUgZm9yIHRoYXQgZGlyZWN0b3J5LgorZnVuY19ta3RlbXBkaXIgKCkKK3sKKyAgICBteV90ZW1wbGF0ZT0iJHtUTVBESVItL3RtcH0vJHsxLSRwcm9nbmFtZX0iCisKKyAgICBpZiB0ZXN0ICIkb3B0X2RyeV9ydW4iID0gIjoiOyB0aGVuCisgICAgICAjIFJldHVybiBhIGRpcmVjdG9yeSBuYW1lLCBidXQgZG9uJ3QgY3JlYXRlIGl0IGluIGRyeS1ydW4gbW9kZQorICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0kJCIKKyAgICBlbHNlCisKKyAgICAgICMgSWYgbWt0ZW1wIHdvcmtzLCB1c2UgdGhhdCBmaXJzdCBhbmQgZm9yZW1vc3QKKyAgICAgIG15X3RtcGRpcj1gbWt0ZW1wIC1kICIke215X3RlbXBsYXRlfS1YWFhYWFhYWCIgMj4vZGV2L251bGxgCisKKyAgICAgIGlmIHRlc3QgISAtZCAiJG15X3RtcGRpciI7IHRoZW4KKyAgICAgICAgIyBGYWlsaW5nIHRoYXQsIGF0IGxlYXN0IHRyeSBhbmQgdXNlICRSQU5ET00gdG8gYXZvaWQgYSByYWNlCisgICAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJHtSQU5ET00tMH0kJCIKKworICAgICAgICBzYXZlX21rdGVtcGRpcl91bWFzaz1gdW1hc2tgCisgICAgICAgIHVtYXNrIDAwNzcKKyAgICAgICAgJE1LRElSICIkbXlfdG1wZGlyIgorICAgICAgICB1bWFzayAkc2F2ZV9ta3RlbXBkaXJfdW1hc2sKKyAgICAgIGZpCisKKyAgICAgICMgSWYgd2UncmUgbm90IGluIGRyeS1ydW4gbW9kZSwgYm9tYiBvdXQgb24gZmFpbHVyZQorICAgICAgdGVzdCAtZCAiJG15X3RtcGRpciIgfHwgXAorICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkbXlfdG1wZGlyJyIKKyAgICBmaQorCisgICAgJEVDSE8gIiRteV90bXBkaXIiCit9CisKKworIyBmdW5jX3F1b3RlX2Zvcl9ldmFsIGFyZworIyBBZXN0aGV0aWNhbGx5IHF1b3RlIEFSRyB0byBiZSBldmFsZWQgbGF0ZXIuCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzOiBGVU5DX1FVT1RFX0ZPUl9FVkFMX1JFU1VMVAorIyBpcyBkb3VibGUtcXVvdGVkLCBzdWl0YWJsZSBmb3IgYSBzdWJzZXF1ZW50IGV2YWwsIHdoZXJlYXMKKyMgRlVOQ19RVU9URV9GT1JfRVZBTF9VTlFVT1RFRF9SRVNVTFQgaGFzIG1lcmVseSBhbGwgY2hhcmFjdGVycworIyB3aGljaCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUgcXVvdGVzIGJhY2tzbGFzaGlmaWVkLgorZnVuY19xdW90ZV9mb3JfZXZhbCAoKQoreworICAgIGNhc2UgJDEgaW4KKyAgICAgICpbXFxcYFwiXCRdKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD1gJEVDSE8gIiQxIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYCA7OworICAgICAgKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9IiQxIiA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IGluCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gZGVsYXkKKyAgICAgICMgd29yZCBzcGxpdHRpbmcsIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGFuZCBhbmQgdmFyaWFibGUKKyAgICAgICMgZXhwYW5zaW9uIGZvciBhIHN1YnNlcXVlbnQgZXZhbC4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisgICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0PSJcIiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdFwiIgorICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdCIKKyAgICBlc2FjCit9CisKKworIyBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgYXJnCisjIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlcjsgc2FtZSBhcyBhYm92ZSwKKyMgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZnVuY19xdW90ZV9mb3JfZXhwYW5kICgpCit7CisgICAgY2FzZSAkMSBpbgorICAgICAgKltcXFxgXCJdKikKKwlteV9hcmc9YCRFQ0hPICIkMSIgfCAkU0VEIFwKKwkgICAgLWUgIiRkb3VibGVfcXVvdGVfc3Vic3QiIC1lICIkc2VkX2RvdWJsZV9iYWNrc2xhc2giYCA7OworICAgICAgKikKKyAgICAgICAgbXlfYXJnPSIkMSIgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRteV9hcmcgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQorICAgICAgIyB3b3JkIHNwbGl0dGluZyBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgICAgbXlfYXJnPSJcIiRteV9hcmdcIiIKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0PSIkbXlfYXJnIgorfQorCisKKyMgZnVuY19zaG93X2V2YWwgY21kIFtmYWlsX2V4cF0KKyMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcworIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKKyMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuCitmdW5jX3Nob3dfZXZhbCAoKQoreworICAgIG15X2NtZD0iJDEiCisgICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKKworICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgeworICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgorICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorICAgIH0KKworICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKKyAgICAgIGV2YWwgIiRteV9jbWQiCisgICAgICBteV9zdGF0dXM9JD8KKyAgICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1lcSAwOyB0aGVuIDo7IGVsc2UKKwlldmFsICIoZXhpdCAkbXlfc3RhdHVzKTsgJG15X2ZhaWxfZXhwIgorICAgICAgZmkKKyAgICBmaQorfQorCisKKyMgZnVuY19zaG93X2V2YWxfbG9jYWxlIGNtZCBbZmFpbF9leHBdCisjIFVubGVzcyBvcHRfc2lsZW50IGlzIHRydWUsIHRoZW4gb3V0cHV0IENNRC4gIFRoZW4sIGlmIG9wdF9kcnlydW4gaXMKKyMgbm90IHRydWUsIGV2YWx1YXRlIENNRC4gIElmIHRoZSBldmFsdWF0aW9uIG9mIENNRCBmYWlscywgYW5kIEZBSUxfRVhQCisjIGlzIGdpdmVuLCB0aGVuIGV2YWx1YXRlIGl0LiAgVXNlIHRoZSBzYXZlZCBsb2NhbGUgZm9yIGV2YWx1YXRpb24uCitmdW5jX3Nob3dfZXZhbF9sb2NhbGUgKCkKK3sKKyAgICBteV9jbWQ9IiQxIgorICAgIG15X2ZhaWxfZXhwPSIkezItOn0iCisKKyAgICAke29wdF9zaWxlbnQtZmFsc2V9IHx8IHsKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJG15X2NtZCIKKyAgICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKyAgICB9CisKKyAgICBpZiAke29wdF9kcnlfcnVuLWZhbHNlfTsgdGhlbiA6OyBlbHNlCisgICAgICBldmFsICIkbHRfdXNlcl9sb2NhbGUKKwkgICAgJG15X2NtZCIKKyAgICAgIG15X3N0YXR1cz0kPworICAgICAgZXZhbCAiJGx0X3NhZmVfbG9jYWxlIgorICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQorCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCisgICAgICBmaQorICAgIGZpCit9CisKKyMgZnVuY190cl9zaAorIyBUdXJuICQxIGludG8gYSBzdHJpbmcgc3VpdGFibGUgZm9yIGEgc2hlbGwgdmFyaWFibGUgbmFtZS4KKyMgUmVzdWx0IGlzIHN0b3JlZCBpbiAkZnVuY190cl9zaF9yZXN1bHQuICBBbGwgY2hhcmFjdGVycworIyBub3QgaW4gdGhlIHNldCBhLXpBLVowLTlfIGFyZSByZXBsYWNlZCB3aXRoICdfJy4gRnVydGhlciwKKyMgaWYgJDEgYmVnaW5zIHdpdGggYSBkaWdpdCwgYSAnXycgaXMgcHJlcGVuZGVkIGFzIHdlbGwuCitmdW5jX3RyX3NoICgpCit7CisgIGNhc2UgJDEgaW4KKyAgWzAtOV0qIHwgKlshYS16QS1aMC05X10qKQorICAgIGZ1bmNfdHJfc2hfcmVzdWx0PWAkRUNITyAiJDEiIHwgJFNFRCAncy9eXChbMC05XVwpL19cMS87IHMvW15hLXpBLVowLTlfXS9fL2cnYAorICAgIDs7CisgICogKQorICAgIGZ1bmNfdHJfc2hfcmVzdWx0PSQxCisgICAgOzsKKyAgZXNhYworfQorCisKKyMgZnVuY192ZXJzaW9uCisjIEVjaG8gdmVyc2lvbiBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfdmVyc2lvbiAoKQoreworICAgICRvcHRfZGVidWcKKworICAgICRTRUQgLW4gJy8oQykvIWIgZ28KKwk6bW9yZQorCS9cLi8heworCSAgTgorCSAgcy9cbiMgLyAvCisJICBiIG1vcmUKKwl9CisJOmdvCisJL14jICckUFJPR1JBTScgKEdOVSAvLC8jIHdhcnJhbnR5OyAvIHsKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworICAgICAgICBzL1woKEMpXClbIDAtOSwtXSpcKCBbMS05XVswLTldKlwpL1wxXDIvCisgICAgICAgIHAKKyAgICAgfScgPCAiJHByb2dwYXRoIgorICAgICBleGl0ICQ/Cit9CisKKyMgZnVuY191c2FnZQorIyBFY2hvIHNob3J0IGhlbHAgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCitmdW5jX3VzYWdlICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sL14jICAqLiotLWhlbHAvIHsKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworCXMvXCRwcm9nbmFtZS8nJHByb2duYW1lJy8KKwlwCisgICAgfScgPCAiJHByb2dwYXRoIgorICAgIGVjaG8KKyAgICAkRUNITyAicnVuIFxgJHByb2duYW1lIC0taGVscCB8IG1vcmUnIGZvciBmdWxsIHVzYWdlIgorICAgIGV4aXQgJD8KK30KKworIyBmdW5jX2hlbHAgW05PRVhJVF0KKyMgRWNobyBsb25nIGhlbHAgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQsCisjIHVubGVzcyAnbm9leGl0JyBpcyBwYXNzZWQgYXMgYXJndW1lbnQuCitmdW5jX2hlbHAgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvIyBSZXBvcnQgYnVncyB0by8geworCTpwcmludAorICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisJcypcJHByb2duYW1lKickcHJvZ25hbWUnKgorCXMqXCRob3N0KiciJGhvc3QiJyoKKwlzKlwkU0hFTEwqJyIkU0hFTEwiJyoKKwlzKlwkTFRDQyonIiRMVENDIicqCisJcypcJExUQ0ZMQUdTKiciJExUQ0ZMQUdTIicqCisJcypcJExEKiciJExEIicqCisJcy9cJHdpdGhfZ251X2xkLyciJHdpdGhfZ251X2xkIicvCisJcy9cJGF1dG9tYWtlX3ZlcnNpb24vJyJgKCR7QVVUT01BS0UtYXV0b21ha2V9IC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcy9cJGF1dG9jb25mX3ZlcnNpb24vJyJgKCR7QVVUT0NPTkYtYXV0b2NvbmZ9IC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcAorCWQKKyAgICAgfQorICAgICAvXiMgLiogaG9tZSBwYWdlOi9iIHByaW50CisgICAgIC9eIyBHZW5lcmFsIGhlbHAgdXNpbmcvYiBwcmludAorICAgICAnIDwgIiRwcm9ncGF0aCIKKyAgICByZXQ9JD8KKyAgICBpZiB0ZXN0IC16ICIkMSI7IHRoZW4KKyAgICAgIGV4aXQgJHJldAorICAgIGZpCit9CisKKyMgZnVuY19taXNzaW5nX2FyZyBhcmduYW1lCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IgYW5kIHNldCBnbG9iYWwKKyMgZXhpdF9jbWQuCitmdW5jX21pc3NpbmdfYXJnICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgZnVuY19lcnJvciAibWlzc2luZyBhcmd1bWVudCBmb3IgJDEuIgorICAgIGV4aXRfY21kPWV4aXQKK30KKworCisjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IHNob3J0b3B0CisjIFNldCBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lIGFuZCBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmcgc2hlbGwKKyMgdmFyaWFibGVzIGFmdGVyIHNwbGl0dGluZyBTSE9SVE9QVCBhZnRlciB0aGUgMm5kIGNoYXJhY3Rlci4KK2Z1bmNfc3BsaXRfc2hvcnRfb3B0ICgpCit7CisgICAgbXlfc2VkX3Nob3J0X29wdD0nMXMvXlwoLi5cKS4qJC9cMS87cScKKyAgICBteV9zZWRfc2hvcnRfcmVzdD0nMXMvXi4uXCguKlwpJC9cMS87cScKKworICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWU9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX3Nob3J0X29wdCJgCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9zaG9ydF9yZXN0ImAKK30gIyBmdW5jX3NwbGl0X3Nob3J0X29wdCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgbG9uZ29wdAorIyBTZXQgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lIGFuZCBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZyBzaGVsbAorIyB2YXJpYWJsZXMgYWZ0ZXIgc3BsaXR0aW5nIExPTkdPUFQgYXQgdGhlIGA9JyBzaWduLgorZnVuY19zcGxpdF9sb25nX29wdCAoKQoreworICAgIG15X3NlZF9sb25nX29wdD0nMXMvXlwoLS1bXj1dKlwpPS4qL1wxLztxJworICAgIG15X3NlZF9sb25nX2FyZz0nMXMvXi0tW149XSo9Ly8nCisKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX2xvbmdfb3B0ImAKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfbG9uZ19hcmciYAorfSAjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKK2V4aXRfY21kPToKKworCisKKworCittYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCittYWdpY19leGU9IiUlJU1BR0lDIEVYRSB2YXJpYWJsZSUlJSIKKworIyBHbG9iYWwgdmFyaWFibGVzLgorbm9ub3B0PQorcHJlc2VydmVfYXJncz0KK2xvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKK28ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKK2V4dHJhY3RlZF9hcmNoaXZlcz0KK2V4dHJhY3RlZF9zZXJpYWw9MAorCisjIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKKyMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZworIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgorZXhlY19jbWQ9CisKKyMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCisjIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KK2Z1bmNfYXBwZW5kICgpCit7CisgICAgZXZhbCAiJHsxfT1cJCR7MX1cJHsyfSIKK30gIyBmdW5jX2FwcGVuZCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworIyBmdW5jX2FwcGVuZF9xdW90ZWQgdmFyIHZhbHVlCisjIFF1b3RlIFZBTFVFIGFuZCBhcHBlbmQgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIsIHNlcGFyYXRlZAorIyBieSBhIHNwYWNlLgorZnVuY19hcHBlbmRfcXVvdGVkICgpCit7CisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHsyfSIKKyAgICBldmFsICIkezF9PVwkJHsxfVxcIFwkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCit9ICMgZnVuY19hcHBlbmRfcXVvdGVkIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KK2Z1bmNfYXJpdGggKCkKK3sKKyAgICBmdW5jX2FyaXRoX3Jlc3VsdD1gZXhwciAiJHtAfSJgCit9ICMgZnVuY19hcml0aCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfbGVuIHN0cmluZworIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgorZnVuY19sZW4gKCkKK3sKKyAgICBmdW5jX2xlbl9yZXN1bHQ9YGV4cHIgIiR7MX0iIDogIi4qIiAyPi9kZXYvbnVsbCB8fCBlY2hvICRtYXhfY21kX2xlbmAKK30gIyBmdW5jX2xlbiBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfbG8ybyBvYmplY3QKK2Z1bmNfbG8ybyAoKQoreworICAgIGZ1bmNfbG8yb19yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRsbzJvImAKK30gIyBmdW5jX2xvMm8gbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKK2Z1bmNfeGZvcm0gKCkKK3sKKyAgICBmdW5jX3hmb3JtX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAncy9cLlteLl0qJC8ubG8vJ2AKK30gIyBmdW5jX3hmb3JtIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQorIyBhIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBoaW50LCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZnVuY19lcnJvciAiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiIKK30KKworCisjIGZ1bmNfY29uZmlnCisjIERpc3BsYXkgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCB0aGUgdGFncyBpbiB0aGlzIHNjcmlwdC4KK2Z1bmNfY29uZmlnICgpCit7CisgICAgcmVfYmVnaW5jZj0nXiMgIyMjIEJFR0lOIExJQlRPT0wnCisgICAgcmVfZW5kY2Y9J14jICMjIyBFTkQgTElCVE9PTCcKKworICAgICMgRGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICRTRUQgIjEsLyRyZV9iZWdpbmNmIENPTkZJRy9kOy8kcmVfZW5kY2YgQ09ORklHLyxcJGQiIDwgIiRwcm9ncGF0aCIKKworICAgICMgTm93IHByaW50IHRoZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHRhZ3MuCisgICAgZm9yIHRhZ25hbWUgaW4gJHRhZ2xpc3Q7IGRvCisgICAgICAkU0VEIC1uICIvJHJlX2JlZ2luY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC8sLyRyZV9lbmRjZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkL3AiIDwgIiRwcm9ncGF0aCIKKyAgICBkb25lCisKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19mZWF0dXJlcworIyBEaXNwbGF5IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCitmdW5jX2ZlYXR1cmVzICgpCit7CisgICAgZWNobyAiaG9zdDogJGhvc3QiCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfZW5hYmxlX3RhZyB0YWduYW1lCisjIFZlcmlmeSB0aGF0IFRBR05BTUUgaXMgdmFsaWQsIGFuZCBlaXRoZXIgZmxhZyBhbiBlcnJvciBhbmQgZXhpdCwgb3IKKyMgZW5hYmxlIHRoZSBUQUdOQU1FIHRhZy4gIFdlIGFsc28gYWRkIFRBR05BTUUgdG8gdGhlIGdsb2JhbCAkdGFnbGlzdAorIyB2YXJpYWJsZSBoZXJlLgorZnVuY19lbmFibGVfdGFnICgpCit7CisgICMgR2xvYmFsIHZhcmlhYmxlOgorICB0YWduYW1lPSIkMSIKKworICByZV9iZWdpbmNmPSJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgorICByZV9lbmRjZj0iXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHNlZF9leHRyYWN0Y2Y9Ii8kcmVfYmVnaW5jZi8sLyRyZV9lbmRjZi9wIgorCisgICMgVmFsaWRhdGUgdGFnbmFtZS4KKyAgY2FzZSAkdGFnbmFtZSBpbgorICAgICpbIS1fQS1aYS16MC05LC9dKikKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIgorICAgICAgOzsKKyAgZXNhYworCisgICMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdyBpdCdzCisgICMgdGhlcmUgYnV0IG5vdCBzcGVjaWFsbHkgbWFya2VkLgorICBjYXNlICR0YWduYW1lIGluCisgICAgQ0MpIDs7CisgICAgKikKKyAgICAgIGlmICRHUkVQICIkcmVfYmVnaW5jZiIgIiRwcm9ncGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCisKKwkjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLiAgQmUgY2FyZWZ1bCB0byBxdW90ZSB0aGUgcGF0aAorCSMgYW5kIHRoZSBzZWQgc2NyaXB0LCB0byBhdm9pZCBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSwgYnV0CisJIyBhbHNvIGRvbid0IHVzZSBub24tcG9ydGFibGUgcXVvdGVzIHdpdGhpbiBiYWNrcXVvdGVzIHdpdGhpbgorCSMgcXVvdGVzIHdlIGhhdmUgdG8gZG8gaXQgaW4gMiBzdGVwczoKKwlleHRyYWN0ZWRjZj1gJFNFRCAtbiAtZSAiJHNlZF9leHRyYWN0Y2YiIDwgIiRwcm9ncGF0aCJgCisJZXZhbCAiJGV4dHJhY3RlZGNmIgorICAgICAgZWxzZQorCWZ1bmNfZXJyb3IgImlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIgorICAgICAgZmkKKyAgICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2gKKyMgRW5zdXJlIHRoYXQgd2UgYXJlIHVzaW5nIG00IG1hY3JvcywgYW5kIGxpYnRvb2wgc2NyaXB0IGZyb20gdGhlIHNhbWUKKyMgcmVsZWFzZSBvZiBsaWJ0b29sLgorZnVuY19jaGVja192ZXJzaW9uX21hdGNoICgpCit7CisgIGlmIHRlc3QgIiRwYWNrYWdlX3JldmlzaW9uIiAhPSAiJG1hY3JvX3JldmlzaW9uIjsgdGhlbgorICAgIGlmIHRlc3QgIiRWRVJTSU9OIiAhPSAiJG1hY3JvX3ZlcnNpb24iOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KKyAgICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKKyRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIGJ1dCB0aGUKKyRwcm9nbmFtZTogZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSBhbiBvbGRlciByZWxlYXNlLgorJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSAkUEFDS0FHRSAkVkVSU0lPTgorJHByb2duYW1lOiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgorX0xUX0VPRgorICAgICAgZWxzZQorICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQorJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tICRQQUNLQUdFICRtYWNyb192ZXJzaW9uLgorJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSAkUEFDS0FHRSAkVkVSU0lPTgorJHByb2duYW1lOiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgorX0xUX0VPRgorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24sCiskcHJvZ25hbWU6IGJ1dCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSByZXZpc2lvbiAkbWFjcm9fcmV2aXNpb24uCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tIHJldmlzaW9uICRwYWNrYWdlX3JldmlzaW9uCiskcHJvZ25hbWU6IG9mICRQQUNLQUdFICRWRVJTSU9OIGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgZmkKKworICAgIGV4aXQgJEVYSVRfTUlTTUFUQ0gKKyAgZmkKK30KKworCisjIFNob3J0aGFuZCBmb3IgLS1tb2RlPWZvbywgb25seSB2YWxpZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKK2Nhc2UgJDEgaW4KK2NsZWFufGNsZWF8Y2xlfGNsKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBjbGVhbiAkezErIiRAIn07IHNoaWZ0CisgIDs7Citjb21waWxlfGNvbXBpbHxjb21waXxjb21wfGNvbXxjb3xjKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBjb21waWxlICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2V4ZWN1dGV8ZXhlY3V0fGV4ZWN1fGV4ZWN8ZXhlfGV4fGUpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGV4ZWN1dGUgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworZmluaXNofGZpbmlzfGZpbml8ZmlufGZpfGYpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGZpbmlzaCAkezErIiRAIn07IHNoaWZ0CisgIDs7CitpbnN0YWxsfGluc3RhbHxpbnN0YXxpbnN0fGluc3xpbnxpKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBpbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2xpbmt8bGlufGxpfGwpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGxpbmsgJHsxKyIkQCJ9OyBzaGlmdAorICA7OwordW5pbnN0YWxsfHVuaW5zdGFsfHVuaW5zdGF8dW5pbnN0fHVuaW5zfHVuaW58dW5pfHVufHUpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIHVuaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0CisgIDs7Citlc2FjCisKKworCisjIE9wdGlvbiBkZWZhdWx0czoKK29wdF9kZWJ1Zz06CitvcHRfZHJ5X3J1bj1mYWxzZQorb3B0X2NvbmZpZz1mYWxzZQorb3B0X3ByZXNlcnZlX2R1cF9kZXBzPWZhbHNlCitvcHRfZmVhdHVyZXM9ZmFsc2UKK29wdF9maW5pc2g9ZmFsc2UKK29wdF9oZWxwPWZhbHNlCitvcHRfaGVscF9hbGw9ZmFsc2UKK29wdF9zaWxlbnQ9Ogorb3B0X3dhcm5pbmc9Ogorb3B0X3ZlcmJvc2U9Ogorb3B0X3NpbGVudD1mYWxzZQorb3B0X3ZlcmJvc2U9ZmFsc2UKKworCisjIFBhcnNlIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4gIFRoaXMgY29tZXMgYXMgc29vbiBhcyBwb3NzaWJsZSBpbiB0aGUKKyMgc2NyaXB0IHRvIG1ha2UgdGhpbmdzIGxpa2UgYC0tdmVyc2lvbicgaGFwcGVuIGFzIHF1aWNrbHkgYXMgd2UgY2FuLgoreworICAjIHRoaXMganVzdCBlYXNlcyBleGl0IGhhbmRsaW5nCisgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgICAgb3B0PSIkMSIKKyAgICBzaGlmdAorICAgIGNhc2UgJG9wdCBpbgorICAgICAgLS1kZWJ1Z3wteCkJb3B0X2RlYnVnPSdzZXQgLXgnCisJCQlmdW5jX2VjaG8gImVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCisJCQkkb3B0X2RlYnVnCisJCQk7OworICAgICAgLS1kcnktcnVufC0tZHJ5cnVufC1uKQorCQkJb3B0X2RyeV9ydW49OgorCQkJOzsKKyAgICAgIC0tY29uZmlnKQorCQkJb3B0X2NvbmZpZz06CitmdW5jX2NvbmZpZworCQkJOzsKKyAgICAgIC0tZGxvcGVufC1kbG9wZW4pCisJCQlvcHRhcmc9IiQxIgorCQkJb3B0X2Rsb3Blbj0iJHtvcHRfZGxvcGVuKyRvcHRfZGxvcGVuCit9JG9wdGFyZyIKKwkJCXNoaWZ0CisJCQk7OworICAgICAgLS1wcmVzZXJ2ZS1kdXAtZGVwcykKKwkJCW9wdF9wcmVzZXJ2ZV9kdXBfZGVwcz06CisJCQk7OworICAgICAgLS1mZWF0dXJlcykKKwkJCW9wdF9mZWF0dXJlcz06CitmdW5jX2ZlYXR1cmVzCisJCQk7OworICAgICAgLS1maW5pc2gpCisJCQlvcHRfZmluaXNoPToKK3NldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKKwkJCTs7CisgICAgICAtLWhlbHApCisJCQlvcHRfaGVscD06CisJCQk7OworICAgICAgLS1oZWxwLWFsbCkKKwkJCW9wdF9oZWxwX2FsbD06CitvcHRfaGVscD0nOiBoZWxwLWFsbCcKKwkJCTs7CisgICAgICAtLW1vZGUpCisJCQl0ZXN0ICQjID0gMCAmJiBmdW5jX21pc3NpbmdfYXJnICRvcHQgJiYgYnJlYWsKKwkJCW9wdGFyZz0iJDEiCisJCQlvcHRfbW9kZT0iJG9wdGFyZyIKK2Nhc2UgJG9wdGFyZyBpbgorICAjIFZhbGlkIG1vZGUgYXJndW1lbnRzOgorICBjbGVhbnxjb21waWxlfGV4ZWN1dGV8ZmluaXNofGluc3RhbGx8bGlua3xyZWxpbmt8dW5pbnN0YWxsKSA7OworCisgICMgQ2F0Y2ggYW55dGhpbmcgZWxzZSBhcyBhbiBlcnJvcgorICAqKSBmdW5jX2Vycm9yICJpbnZhbGlkIGFyZ3VtZW50IGZvciAkb3B0IgorICAgICBleGl0X2NtZD1leGl0CisgICAgIGJyZWFrCisgICAgIDs7Citlc2FjCisJCQlzaGlmdAorCQkJOzsKKyAgICAgIC0tbm8tc2lsZW50fC0tbm8tcXVpZXQpCisJCQlvcHRfc2lsZW50PWZhbHNlCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKwkJCTs7CisgICAgICAtLW5vLXdhcm5pbmd8LS1uby13YXJuKQorCQkJb3B0X3dhcm5pbmc9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tbm8tdmVyYm9zZSkKKwkJCW9wdF92ZXJib3NlPWZhbHNlCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKwkJCTs7CisgICAgICAtLXNpbGVudHwtLXF1aWV0KQorCQkJb3B0X3NpbGVudD06CitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKyAgICAgICAgb3B0X3ZlcmJvc2U9ZmFsc2UKKwkJCTs7CisgICAgICAtLXZlcmJvc2V8LXYpCisJCQlvcHRfdmVyYm9zZT06CitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKK29wdF9zaWxlbnQ9ZmFsc2UKKwkJCTs7CisgICAgICAtLXRhZykKKwkJCXRlc3QgJCMgPSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgJG9wdCAmJiBicmVhaworCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF90YWc9IiRvcHRhcmciCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCAkb3B0YXJnIgorZnVuY19lbmFibGVfdGFnICIkb3B0YXJnIgorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC1cP3wtaCkJCWZ1bmNfdXNhZ2UJCQkJOzsKKyAgICAgIC0taGVscCkJCWZ1bmNfaGVscAkJCQk7OworICAgICAgLS12ZXJzaW9uKQlmdW5jX3ZlcnNpb24JCQkJOzsKKworICAgICAgIyBTZXBhcmF0ZSBvcHRhcmdzIHRvIGxvbmcgb3B0aW9uczoKKyAgICAgIC0tKj0qKQorCQkJZnVuY19zcGxpdF9sb25nX29wdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZSIgIiRmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZyIgJHsxKyIkQCJ9CisJCQlzaGlmdAorCQkJOzsKKworICAgICAgIyBTZXBhcmF0ZSBub24tYXJndW1lbnQgc2hvcnQgb3B0aW9uczoKKyAgICAgIC1cPyp8LWgqfC1uKnwtdiopCisJCQlmdW5jX3NwbGl0X3Nob3J0X29wdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWUiICItJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyIgJHsxKyIkQCJ9CisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLS0pCQlicmVhawkJCQkJOzsKKyAgICAgIC0qKQkJZnVuY19mYXRhbF9oZWxwICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdCciIDs7CisgICAgICAqKQkJc2V0IGR1bW15ICIkb3B0IiAkezErIiRAIn07CXNoaWZ0OyBicmVhayAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIFZhbGlkYXRlIG9wdGlvbnM6CisKKyAgIyBzYXZlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQKKyAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisgICAgbm9ub3B0PSIkb3B0IgorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBwcmVzZXJ2ZSAtLWRlYnVnCisgIHRlc3QgIiRvcHRfZGVidWciID0gOiB8fCBmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgLS1kZWJ1ZyIKKworICBjYXNlICRob3N0IGluCisgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKnB3MzIqIHwgKmNlZ2NjKikKKyAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCisgICAgICBvcHRfZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPToKKyAgICAgIDs7CisgICAgKikKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcworICAgICAgOzsKKyAgZXNhYworCisgICRvcHRfaGVscCB8fCB7CisgICAgIyBTYW5pdHkgY2hlY2tzIGZpcnN0OgorICAgIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIm5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiCisgICAgZmkKKworICAgICMgRGFyd2luIHN1Y2tzCisgICAgZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKKworICAgICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCisgICAgaWYgdGVzdCAtbiAiJG9wdF9kbG9wZW4iICYmIHRlc3QgIiRvcHRfbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgICAgZnVuY19lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIgorICAgICAgJEVDSE8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgorICAgIGdlbmVyaWNfaGVscD0iJGhlbHAiCisgICAgaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCAtLW1vZGU9JG9wdF9tb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgIH0KKworCisgICMgQmFpbCBpZiB0aGUgb3B0aW9ucyB3ZXJlIHNjcmV3ZWQKKyAgJGV4aXRfY21kICRFWElUX0ZBSUxVUkUKK30KKworCisKKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjICAgIE1haW4uICAgICMjCisjIyAtLS0tLS0tLS0tLSAjIworCisjIGZ1bmNfbGFsaWJfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sYWxpYl9wICgpCit7CisgICAgdGVzdCAtZiAiJDEiICYmCisgICAgICAkU0VEIC1lIDRxICIkMSIgMj4vZGV2L251bGwgXAorICAgICAgICB8ICRHUkVQICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIgPiAvZGV2L251bGwgMj4mMQorfQorCisjIGZ1bmNfbGFsaWJfdW5zYWZlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCBgLmxhJyBsaWJyYXJ5IG9yIGAubG8nIG9iamVjdCBmaWxlLgorIyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNhbWUgY2hlY2sgYXMgZnVuY19sYWxpYl9wIHdpdGhvdXQKKyMgcmVzb3J0aW5nIHRvIGV4dGVybmFsIHByb2dyYW1zLiAgVG8gdGhpcyBlbmQsIGl0IHJlZGlyZWN0cyBzdGRpbiBhbmQKKyMgY2xvc2VzIGl0IGFmdGVyd2FyZHMsIHdpdGhvdXQgc2F2aW5nIHRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IuCisjIEFzIGEgc2FmZXR5IG1lYXN1cmUsIHVzZSBpdCBvbmx5IHdoZXJlIGEgbmVnYXRpdmUgcmVzdWx0IHdvdWxkIGJlCisjIGZhdGFsIGFueXdheS4gIFdvcmtzIGlmIGBmaWxlJyBkb2VzIG5vdCBleGlzdC4KK2Z1bmNfbGFsaWJfdW5zYWZlX3AgKCkKK3sKKyAgICBsYWxpYl9wPW5vCisgICAgaWYgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXIgIiQxIiAmJiBleGVjIDU8JjAgPCIkMSI7IHRoZW4KKwlmb3IgbGFsaWJfcF9sIGluIDEgMiAzIDQKKwlkbworCSAgICByZWFkIGxhbGliX3BfbGluZQorCSAgICBjYXNlICIkbGFsaWJfcF9saW5lIiBpbgorCQlcI1wgR2VuZXJhdGVkXCBieVwgKiRQQUNLQUdFKiApIGxhbGliX3A9eWVzOyBicmVhazs7CisJICAgIGVzYWMKKwlkb25lCisJZXhlYyAwPCY1IDU8Ji0KKyAgICBmaQorICAgIHRlc3QgIiRsYWxpYl9wIiA9IHllcworfQorCisjIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAoKQoreworICAgIGZ1bmNfbGFsaWJfcCAiJDEiCit9CisKKyMgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBleGVjdXRhYmxlCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9CisgICAgY2FzZSAkMSBpbgorICAgICouZXhlKSA7OworICAgICopIGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4PS5leGUgOzsKKyAgICBlc2FjCisgICAgJEdSRVAgIiRtYWdpY19leGUiICIkMSRmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeCIgPi9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSBmaWxlCisjIEFzc3VtZXMgZmlsZSBpcyBhbiBsdHdyYXBwZXJfZXhlY3V0YWJsZQorIyB1c2VzICRmaWxlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZmlsZW5hbWUgZm9yIGEKKyMgdGVtcG9yYXJ5IGx0d3JhcHBlcl9zY3JpcHQuCitmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICgpCit7CisgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgorICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb3Igd3JhcHBlciBleGVjdXRhYmxlCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sdHdyYXBwZXJfcCAoKQoreworICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkMSIgfHwgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkMSIKK30KKworCisjIGZ1bmNfZXhlY3V0ZV9jbWRzIGNvbW1hbmRzIGZhaWxfY21kCisjIEV4ZWN1dGUgdGlsZGUtZGVsaW1pdGVkIENPTU1BTkRTLgorIyBJZiBGQUlMX0NNRCBpcyBnaXZlbiwgZXZhbCB0aGF0IHVwb24gZmFpbHVyZS4KKyMgRkFJTF9DTUQgbWF5IHJlYWQtYWNjZXNzIHRoZSBjdXJyZW50IGNvbW1hbmQgaW4gdmFyaWFibGUgQ01EIQorZnVuY19leGVjdXRlX2NtZHMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgc2F2ZV9pZnM9JElGUzsgSUZTPSd+JworICAgIGZvciBjbWQgaW4gJDE7IGRvCisgICAgICBJRlM9JHNhdmVfaWZzCisgICAgICBldmFsIGNtZD1cIiRjbWRcIgorICAgICAgZnVuY19zaG93X2V2YWwgIiRjbWQiICIkezItOn0iCisgICAgZG9uZQorICAgIElGUz0kc2F2ZV9pZnMKK30KKworCisjIGZ1bmNfc291cmNlIGZpbGUKKyMgU291cmNlIEZJTEUsIGFkZGluZyBkaXJlY3RvcnkgY29tcG9uZW50IGlmIG5lY2Vzc2FyeS4KKyMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bworIyBGSUxFIGV2ZW4gaWYgYm90aCBGSUxFIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCisjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKKyMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KK2Z1bmNfc291cmNlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgJDEgaW4KKyAgICAqLyogfCAqXFwqKQkuICIkMSIgOzsKKyAgICAqKQkJLiAiLi8kMSIgOzsKKyAgICBlc2FjCit9CisKKworIyBmdW5jX3Jlc29sdmVfc3lzcm9vdCBQQVRICisjIFJlcGxhY2UgYSBsZWFkaW5nID0gaW4gUEFUSCB3aXRoIGEgc3lzcm9vdC4gIFN0b3JlIHRoZSByZXN1bHQgaW50bworIyBmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKK2Z1bmNfcmVzb2x2ZV9zeXNyb290ICgpCit7CisgIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdD0kMQorICBjYXNlICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQgaW4KKyAgPSopCisgICAgZnVuY19zdHJpcG5hbWUgJz0nICcnICIkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdD0kbHRfc3lzcm9vdCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICA7OworICBlc2FjCit9CisKKyMgZnVuY19yZXBsYWNlX3N5c3Jvb3QgUEFUSAorIyBJZiBQQVRIIGJlZ2lucyB3aXRoIHRoZSBzeXNyb290LCByZXBsYWNlIGl0IHdpdGggPSBhbmQKKyMgc3RvcmUgdGhlIHJlc3VsdCBpbnRvIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdC4KK2Z1bmNfcmVwbGFjZV9zeXNyb290ICgpCit7CisgIGNhc2UgIiRsdF9zeXNyb290OiQxIiBpbgorICA/KjoiJGx0X3N5c3Jvb3QiKikKKyAgICBmdW5jX3N0cmlwbmFtZSAiJGx0X3N5c3Jvb3QiICcnICIkMSIKKyAgICBmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQ9Ij0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorICAgIDs7CisgICopCisgICAgIyBJbmNsdWRpbmcgbm8gc3lzcm9vdC4KKyAgICBmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQ9JDEKKyAgICA7OworICBlc2FjCit9CisKKyMgZnVuY19pbmZlcl90YWcgYXJnCisjIEluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiBhbnkgYXJlIGF2YWlsYWJsZSBhbmQKKyMgaWYgb25lIHdhc24ndCBjaG9zZW4gdmlhIHRoZSAiLS10YWciIGNvbW1hbmQgbGluZSBvcHRpb24uCisjIE9ubHkgYXR0ZW1wdCB0aGlzIGlmIHRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlCisjIGNvbW1hbmQgZG9lc24ndCBtYXRjaCB0aGUgZGVmYXVsdCBjb21waWxlci4KKyMgYXJnIGlzIHVzdWFsbHkgb2YgdGhlIGZvcm0gJ2djYyAuLi4nCitmdW5jX2luZmVyX3RhZyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorICAgICAgQ0NfcXVvdGVkPQorICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJZnVuY19hcHBlbmRfcXVvdGVkIENDX3F1b3RlZCAiJGFyZyIKKyAgICAgIGRvbmUKKyAgICAgIENDX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ2AKKyAgICAgIENDX3F1b3RlZF9leHBhbmRlZD1gZnVuY19lY2hvX2FsbCAkQ0NfcXVvdGVkYAorICAgICAgY2FzZSAkQCBpbgorICAgICAgIyBCbGFua3MgaW4gdGhlIGNvbW1hbmQgbWF5IGhhdmUgYmVlbiBzdHJpcHBlZCBieSB0aGUgY2FsbGluZyBzaGVsbCwKKyAgICAgICMgYnV0IG5vdCBmcm9tIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuLgorICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiAkQ0NfZXhwYW5kZWQgIiogfCAiJENDX2V4cGFuZGVkICIqIHwgXAorICAgICAgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgJENDX3F1b3RlZF9leHBhbmRlZCAiKiB8ICIkQ0NfcXVvdGVkX2V4cGFuZGVkICIqKSA7OworICAgICAgIyBCbGFua3MgYXQgdGhlIHN0YXJ0IG9mICRiYXNlX2NvbXBpbGUgd2lsbCBjYXVzZSB0aGlzIHRvIGZhaWwKKyAgICAgICMgaWYgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0gYXMgd2VsbC4KKyAgICAgICopCisJZm9yIHogaW4gJGF2YWlsYWJsZV90YWdzOyBkbworCSAgaWYgJEdSRVAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR6JCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgorCSAgICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvcCcgPCAkcHJvZ3BhdGhgIgorCSAgICBDQ19xdW90ZWQ9CisJICAgIGZvciBhcmcgaW4gJENDOyBkbworCSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICAgICBmdW5jX2FwcGVuZF9xdW90ZWQgQ0NfcXVvdGVkICIkYXJnIgorCSAgICBkb25lCisJICAgIENDX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ2AKKwkgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCisJICAgIGNhc2UgIiRAICIgaW4KKwkgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiAkQ0NfZXhwYW5kZWQgIiogfCAiJENDX2V4cGFuZGVkICIqIHwgXAorCSAgICAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiAkQ0NfcXVvdGVkX2V4cGFuZGVkICIqIHwgIiRDQ19xdW90ZWRfZXhwYW5kZWQgIiopCisJICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKKwkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgorCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCisJICAgICAgdGFnbmFtZT0kegorCSAgICAgIGJyZWFrCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKwlkb25lCisJIyBJZiAkdGFnbmFtZSBzdGlsbCBpc24ndCBzZXQsIHRoZW4gbm8gdGFnZ2VkIGNvbmZpZ3VyYXRpb24KKwkjIHdhcyBmb3VuZCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCB0aGUgIi0tdGFnIiBjb21tYW5kCisJIyBsaW5lIG9wdGlvbiBtdXN0IGJlIHVzZWQuCisJaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisJICBmdW5jX2VjaG8gInVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgInNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIKKyMJZWxzZQorIwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGZpCit9CisKKworCisjIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3Qgb3V0cHV0X25hbWUgcGljX25hbWUgbm9ucGljX25hbWUKKyMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCisjIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgorZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAoKQoreworICAgIHdyaXRlX2xpYm9iaj0kezF9CisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHdyaXRlX2xvYmo9XCckezJ9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9sb2JqPW5vbmUKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfb2xkb2JqPVwnJHszfVwnCisgICAgZWxzZQorICAgICAgd3JpdGVfb2xkb2JqPW5vbmUKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8IHsKKyAgICAgIGNhdCA+JHt3cml0ZV9saWJvYmp9VCA8PEVPRgorIyAkd3JpdGVfbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KK3BpY19vYmplY3Q9JHdyaXRlX2xvYmoKKworIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdAorbm9uX3BpY19vYmplY3Q9JHdyaXRlX29sZG9iagorCitFT0YKKyAgICAgICRNViAiJHt3cml0ZV9saWJvYmp9VCIgIiR7d3JpdGVfbGlib2JqfSIKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRklMRSBOQU1FIEFORCBQQVRIIENPTlZFUlNJT04gSEVMUEVSIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgQVJHCisjIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyB3aGVuICRidWlsZCBpcyAqbml4LAorIyBhbmQgJGhvc3QgaXMgbWluZ3csIGN5Z3dpbiwgb3Igc29tZSBvdGhlciB3MzIgZW52aXJvbm1lbnQuIFJlbGllcyBvbiBhCisjIGNvcnJlY3RseSBjb25maWd1cmVkIHdpbmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlLCB3aXRoIHRoZSB3aW5lcGF0aCBwcm9ncmFtCisjIGluICRidWlsZCdzICRQQVRILgorIworIyBBUkcgaXMgdGhlICRidWlsZCBmaWxlIG5hbWUgdG8gYmUgY29udmVydGVkIHRvIHczMiBmb3JtYXQuCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gJGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0LCBhbmQgd2lsbAorIyBiZSBlbXB0eSBvbiBlcnJvciAob3Igd2hlbiBBUkcgaXMgZW1wdHkpCitmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXMgbm90IGV4aXQgd2l0aCBhIG5vbi16ZXJvIGVycm9yIGNvZGUsIHNvIHdlCisgICAgIyBhcmUgZm9yY2VkIHRvIGNoZWNrIHRoZSBjb250ZW50cyBvZiBzdGRvdXQuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgICAjIGNvbW1hbmQgaXMgbm90IGZvdW5kLCB0aGUgc2hlbGwgd2lsbCBzZXQgYW4gZXhpdCBjb2RlIG9mIDEyNyBhbmQgcHJpbnQKKyAgICAjICphbiBlcnJvciBtZXNzYWdlKiB0byBzdGRvdXQuIFNvIHdlIG11c3QgY2hlY2sgZm9yIGJvdGggZXJyb3IgY29kZSBvZgorICAgICMgemVybyBBTkQgbm9uLWVtcHR5IHN0ZG91dCwgd2hpY2ggZXhwbGFpbnMgdGhlIG9kZCBjb25zdHJ1Y3Rpb246CisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXA9YHdpbmVwYXRoIC13ICIkMSIgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAiJD8iIC1lcSAwICYmIHRlc3QgLW4gIiR7ZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXB9IjsgdGhlbgorICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9YCRFQ0hPICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXAiIHwKKyAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAorICAgIGVsc2UKKyAgICAgIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0PQorICAgIGZpCisgIGZpCit9CisjIGVuZDogZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiBBUkcKKyMgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9ucyB3aGVuICRidWlsZCBpcyAqbml4LCBhbmQKKyMgJGhvc3QgaXMgbWluZ3csIGN5Z3dpbiwgb3Igc29tZSBvdGhlciB3MzIgZW52aXJvbm1lbnQuIFJlbGllcyBvbiBhIGNvcnJlY3RseQorIyBjb25maWd1cmVkIHdpbmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlLCB3aXRoIHRoZSB3aW5lcGF0aCBwcm9ncmFtIGluICRidWlsZCdzCisjICRQQVRILiBBc3N1bWVzIEFSRyBoYXMgbm8gbGVhZGluZyBvciB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzLgorIworIyBBUkcgaXMgcGF0aCB0byBiZSBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgZm9ybWF0IHRvIHdpbjMyLgorIyBSZXN1bHQgaXMgYXZhaWxhYmxlIGluICRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdC4KKyMgVW5jb252ZXJ0aWJsZSBmaWxlIChkaXJlY3RvcnkpIG5hbWVzIGluIEFSRyBhcmUgc2tpcHBlZDsgaWYgbm8gZGlyZWN0b3J5IG5hbWVzCisjIGFyZSBjb252ZXJ0aWJsZSwgdGhlbiB0aGUgcmVzdWx0IG1heSBiZSBlbXB0eS4KK2Z1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAjIHVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXNuJ3QgY29udmVydCBwYXRocywgb25seSBmaWxlIG5hbWVzCisgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0PSIiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgIG9sZElGUz0kSUZTCisgICAgSUZTPToKKyAgICBmb3IgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9mIGluICQxOyBkbworICAgICAgSUZTPSRvbGRJRlMKKyAgICAgIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX2YiCisgICAgICBpZiB0ZXN0IC1uICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiIDsgdGhlbgorICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQiOyB0aGVuCisgICAgICAgICAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZ1bmNfYXBwZW5kIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0ICI7JGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0IgorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSRvbGRJRlMKKyAgZmkKK30KKyMgZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyCisKKworIyBmdW5jX2N5Z3BhdGggQVJHUy4uLgorIyBXcmFwcGVyIGFyb3VuZCBjYWxsaW5nIHRoZSBjeWdwYXRoIHByb2dyYW0gdmlhIExUX0NZR1BBVEguIFRoaXMgaXMgdXNlZCB3aGVuCisjIHdoZW4gKDEpICRidWlsZCBpcyAqbml4IGFuZCBDeWd3aW4gaXMgaG9zdGVkIHZpYSBhIHdpbmUgZW52aXJvbm1lbnQ7IG9yICgyKQorIyAkYnVpbGQgaXMgTVNZUyBhbmQgJGhvc3QgaXMgQ3lnd2luLCBvciAoMykgJGJ1aWxkIGlzIEN5Z3dpbi4gSW4gY2FzZSAoMSkgb3IKKyMgKDIpLCByZXR1cm5zIHRoZSBDeWd3aW4gZmlsZSBuYW1lIG9yIHBhdGggaW4gZnVuY19jeWdwYXRoX3Jlc3VsdCAoaW5wdXQKKyMgZmlsZSBuYW1lIG9yIHBhdGggaXMgYXNzdW1lZCB0byBiZSBpbiB3MzIgZm9ybWF0LCBhcyBwcmV2aW91c2x5IGNvbnZlcnRlZAorIyBmcm9tICRidWlsZCdzICpuaXggb3IgTVNZUyBmb3JtYXQpLiBJbiBjYXNlICgzKSwgcmV0dXJucyB0aGUgdzMyIGZpbGUgbmFtZQorIyBvciBwYXRoIGluIGZ1bmNfY3lncGF0aF9yZXN1bHQgKGlucHV0IGZpbGUgbmFtZSBvciBwYXRoIGlzIGFzc3VtZWQgdG8gYmUgaW4KKyMgQ3lnd2luIGZvcm1hdCkuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGVycm9yLgorIworIyBBUkdTIGFyZSBwYXNzZWQgdG8gY3lncGF0aCwgd2l0aCB0aGUgbGFzdCBvbmUgYmVpbmcgdGhlIGZpbGUgbmFtZSBvciBwYXRoIHRvCisjIGJlIGNvbnZlcnRlZC4KKyMKKyMgU3BlY2lmeSB0aGUgYWJzb2x1dGUgKm5peCAob3IgdzMyKSBuYW1lIHRvIGN5Z3BhdGggaW4gdGhlIExUX0NZR1BBVEgKKyMgZW52aXJvbm1lbnQgdmFyaWFibGU7IGRvIG5vdCBwdXQgaXQgaW4gJFBBVEguCitmdW5jX2N5Z3BhdGggKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC1uICIkTFRfQ1lHUEFUSCIgJiYgdGVzdCAtZiAiJExUX0NZR1BBVEgiOyB0aGVuCisgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD1gJExUX0NZR1BBVEggIiRAIiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICIkPyIgLW5lIDA7IHRoZW4KKyAgICAgICMgb24gZmFpbHVyZSwgZW5zdXJlIHJlc3VsdCBpcyBlbXB0eQorICAgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD0KKyAgICBmaQorICBlbHNlCisgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD0KKyAgICBmdW5jX2Vycm9yICJMVF9DWUdQQVRIIGlzIGVtcHR5IG9yIHNwZWNpZmllcyBub24tZXhpc3RlbnQgZmlsZTogXGAkTFRfQ1lHUEFUSCciCisgIGZpCit9CisjZW5kOiBmdW5jX2N5Z3BhdGgKKworCisjIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBvciBwYXRoIEFSRyBmcm9tIE1TWVMgZm9ybWF0IHRvIHczMiBmb3JtYXQuICBSZXR1cm4KKyMgcmVzdWx0IGluIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgIyBhd2t3YXJkOiBjbWQgYXBwZW5kcyBzcGFjZXMgdG8gcmVzdWx0CisgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdD1gKCBjbWQgLy9jIGVjaG8gIiQxIiApIDI+L2Rldi9udWxsIHwKKyAgICAkU0VEIC1lICdzL1sgXSokLy8nIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCit9CisjZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgQVJHMSBBUkcyCisjIFZlcmlmeSB0aGF0IEFSRzEgKGEgZmlsZSBuYW1lIGluICRidWlsZCBmb3JtYXQpIHdhcyBjb252ZXJ0ZWQgdG8gJGhvc3QKKyMgZm9ybWF0IGluIEFSRzIuIE90aGVyd2lzZSwgZW1pdCBhbiBlcnJvciBtZXNzYWdlLCBidXQgY29udGludWUgKHJlc2V0dGluZworIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQgdG8gQVJHMSkuCitmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiQyIiAmJiB0ZXN0IC1uICIkMSIgOyB0aGVuCisgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSBob3N0IGZpbGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIgorICAgIGZ1bmNfZXJyb3IgIiAgXGAkMSciCisgICAgZnVuY19lcnJvciAiQ29udGludWluZywgYnV0IHVuaW5zdGFsbGVkIGV4ZWN1dGFibGVzIG1heSBub3Qgd29yay4iCisgICAgIyBGYWxsYmFjazoKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIEZST01fUEFUSFNFUCBUT19QQVRIU0VQIEZST01fUEFUSCBUT19QQVRICisjIFZlcmlmeSB0aGF0IEZST01fUEFUSCAoYSBwYXRoIGluICRidWlsZCBmb3JtYXQpIHdhcyBjb252ZXJ0ZWQgdG8gJGhvc3QKKyMgZm9ybWF0IGluIFRPX1BBVEguIE90aGVyd2lzZSwgZW1pdCBhbiBlcnJvciBtZXNzYWdlLCBidXQgY29udGludWUsIHJlc2V0dGluZworIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQgdG8gYSBzaW1wbGlzdGljIGZhbGxiYWNrIHZhbHVlIChzZWUgYmVsb3cpLgorZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC16ICIkNCIgJiYgdGVzdCAtbiAiJDMiOyB0aGVuCisgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSB0aGUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgZnVuY19lcnJvciAiICBcYCQzJyIKKyAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKKyAgICAjIEZhbGxiYWNrLiAgVGhpcyBpcyBhIGRlbGliZXJhdGVseSBzaW1wbGlzdGljICJjb252ZXJzaW9uIiBhbmQKKyAgICAjIHNob3VsZCBub3QgYmUgImltcHJvdmVkIi4gIFNlZSBsaWJ0b29sLmluZm8uCisgICAgaWYgdGVzdCAieCQxIiAhPSAieCQyIjsgdGhlbgorICAgICAgbHRfcmVwbGFjZV9wYXRoc2VwX2NoYXJzPSJzfCQxfCQyfGciCisgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiQzIiB8CisgICAgICAgICRTRUQgLWUgIiRsdF9yZXBsYWNlX3BhdGhzZXBfY2hhcnMiYAorICAgIGVsc2UKKyAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDMiCisgICAgZmkKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgRlJPTlRQQVQgQkFDS1BBVCBSRVBMIE9SSUcKKyMgTW9kaWZpZXMgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IGJ5IHByZXBlbmRpbmcgUkVQTCBpZiBPUklHIG1hdGNoZXMgRlJPTlRQQVQKKyMgYW5kIGFwcGVuZGluZyBSRVBMIGlmIE9SSUcgbWF0Y2hlcyBCQUNLUEFULgorZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICgpCit7CisgICRvcHRfZGVidWcKKyAgY2FzZSAkNCBpbgorICAkMSApIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDMkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIDs7CisgIGVzYWMKKyAgY2FzZSAkNCBpbgorICAkMiApIGZ1bmNfYXBwZW5kIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCAiJDMiCisgICAgOzsKKyAgZXNhYworfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgJGJ1aWxkIHRvICRob3N0IEZJTEUgTkFNRSBDT05WRVJTSU9OIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpbnZva2VkIHZpYSBgJHRvX2hvc3RfZmlsZV9jbWQgQVJHJworIworIyBJbiBlYWNoIGNhc2UsIEFSRyBpcyB0aGUgcGF0aCB0byBiZSBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgdG8gJGhvc3QgZm9ybWF0LgorIyBSZXN1bHQgd2lsbCBiZSBhdmFpbGFibGUgaW4gJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KKworCisjIGZ1bmNfdG9faG9zdF9maWxlIEFSRworIyBDb252ZXJ0cyB0aGUgZmlsZSBuYW1lIEFSRyBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiBSZXR1cm4gcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfdG9faG9zdF9maWxlICgpCit7CisgICRvcHRfZGVidWcKKyAgJHRvX2hvc3RfZmlsZV9jbWQgIiQxIgorfQorIyBlbmQgZnVuY190b19ob3N0X2ZpbGUKKworCisjIGZ1bmNfdG9fdG9vbF9maWxlIEFSRyBMQVpZCisjIGNvbnZlcnRzIHRoZSBmaWxlIG5hbWUgQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byB0b29sY2hhaW4gZm9ybWF0LiBSZXR1cm4KKyMgcmVzdWx0IGluIGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdC4gIElmIHRoZSBjb252ZXJzaW9uIGluIHVzZSBpcyBsaXN0ZWQKKyMgaW4gKHRoZSBjb21tYSBzZXBhcmF0ZWQpIExBWlksIG5vIGNvbnZlcnNpb24gdGFrZXMgcGxhY2UuCitmdW5jX3RvX3Rvb2xfZmlsZSAoKQoreworICAkb3B0X2RlYnVnCisgIGNhc2UgLCQyLCBpbgorICAgICosIiR0b190b29sX2ZpbGVfY21kIiwqKQorICAgICAgZnVuY190b190b29sX2ZpbGVfcmVzdWx0PSQxCisgICAgICA7OworICAgICopCisgICAgICAkdG9fdG9vbF9maWxlX2NtZCAiJDEiCisgICAgICBmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQ9JGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdAorICAgICAgOzsKKyAgZXNhYworfQorIyBlbmQgZnVuY190b190b29sX2ZpbGUKKworCisjIGZ1bmNfY29udmVydF9maWxlX25vb3AgQVJHCisjIENvcHkgQVJHIHRvIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25vb3AgKCkKK3sKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25vb3AKKworCisjIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBBUkcgZnJvbSAobWluZ3cpIE1TWVMgdG8gKG1pbmd3KSB3MzIgZm9ybWF0OyBhdXRvbWF0aWMKKyMgY29udmVyc2lvbiB0byB3MzIgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGN3cmFwcGVyLiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJDEiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tIEN5Z3dpbiB0byB3MzIgZm9ybWF0LiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgYmVjYXVzZSAkYnVpbGQgaXMgY3lnd2luLCB3ZSBjYWxsICJ0aGUiIGN5Z3BhdGggaW4gJFBBVEg7IG5vIG5lZWQgdG8gdXNlCisgICAgIyBMVF9DWUdQQVRIIGluIHRoaXMgY2FzZS4KKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9YGN5Z3BhdGggLW0gIiQxImAKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX25peF90b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tICpuaXggdG8gdzMyIGZvcm1hdC4gIFJlcXVpcmVzIGEgd2luZSBlbnZpcm9ubWVudAorIyBhbmQgYSB3b3JraW5nIHdpbmVwYXRoLiBSZXR1cm5zIHJlc3VsdCBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJDEiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gTVNZUyB0byBDeWd3aW4gZm9ybWF0LiAgUmVxdWlyZXMgTFRfQ1lHUEFUSCBzZXQuCisjIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiQxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAiJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4KKworCisjIGZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4gQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tICpuaXggdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIEN5Z3dpbiBpbnN0YWxsZWQKKyMgaW4gYSB3aW5lIGVudmlyb25tZW50LCB3b3JraW5nIHdpbmVwYXRoLCBhbmQgTFRfQ1lHUEFUSCBzZXQuICBSZXR1cm5zIHJlc3VsdAorIyBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBjb252ZXJ0IGZyb20gKm5peCB0byB3MzIsIHRoZW4gdXNlIGN5Z3BhdGggdG8gY29udmVydCBmcm9tIHczMiB0byBjeWd3aW4uCisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJDEiCisgICAgZnVuY19jeWdwYXRoIC11ICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jeWdwYXRoX3Jlc3VsdCIKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgJGJ1aWxkIHRvICRob3N0IFBBVEggQ09OVkVSU0lPTiBGVU5DVElPTlMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGludm9rZWQgdmlhIGAkdG9faG9zdF9wYXRoX2NtZCBBUkcnCisjCisjIEluIGVhY2ggY2FzZSwgQVJHIGlzIHRoZSBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCB0byAkaG9zdCBmb3JtYXQuCisjIFRoZSByZXN1bHQgd2lsbCBiZSBhdmFpbGFibGUgaW4gJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KKyMKKyMgUGF0aCBzZXBhcmF0b3JzIGFyZSBhbHNvIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiAgSWYKKyMgQVJHIGJlZ2lucyBvciBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIsIGl0IGlzIHByZXNlcnZlZCAoYnV0CisjIGNvbnZlcnRlZCB0byAkaG9zdCBmb3JtYXQpIG9uIG91dHB1dC4KKyMKKyMgQWxsIHBhdGggY29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIG5hbWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbjoKKyMgICBmaWxlIG5hbWUgY29udmVyc2lvbiBmdW5jdGlvbiAgICA6IGZ1bmNfY29udmVydF9maWxlX1hfdG9fWSAoKQorIyAgIHBhdGggY29udmVyc2lvbiBmdW5jdGlvbiAgICAgICAgIDogZnVuY19jb252ZXJ0X3BhdGhfWF90b19ZICgpCisjIHdoZXJlLCBmb3IgYW55IGdpdmVuICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbiB0aGUgJ1hfdG9fWScgdmFsdWUgaXMgdGhlCisjIHNhbWUuICBJZiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgYWRkZWQgZm9yIG5ldyAkYnVpbGQvJGhvc3QgY29tYmluYXRpb25zLAorIyB0aGUgdHdvIG5ldyBmdW5jdGlvbnMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuLCBvciBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorIyB3aWxsIGJyZWFrLgorCisKKyMgZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQKKyMgRW5zdXJlcyB0aGF0IGZ1bmN0aW9uICJwb2ludGVyIiB2YXJpYWJsZSAkdG9faG9zdF9wYXRoX2NtZCBpcyBzZXQgdG8gdGhlCisjIGFwcHJvcHJpYXRlIHZhbHVlLCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgJHRvX2hvc3RfZmlsZV9jbWQuCit0b19ob3N0X3BhdGhfY21kPQorZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC16ICIkdG9faG9zdF9wYXRoX2NtZCI7IHRoZW4KKyAgICBmdW5jX3N0cmlwbmFtZSAnZnVuY19jb252ZXJ0X2ZpbGVfJyAnJyAiJHRvX2hvc3RfZmlsZV9jbWQiCisgICAgdG9faG9zdF9wYXRoX2NtZD0iZnVuY19jb252ZXJ0X3BhdGhfJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9IgorICBmaQorfQorCisKKyMgZnVuY190b19ob3N0X3BhdGggQVJHCisjIENvbnZlcnRzIHRoZSBwYXRoIEFSRyBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiBSZXR1cm4gcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfdG9faG9zdF9wYXRoICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQKKyAgJHRvX2hvc3RfcGF0aF9jbWQgIiQxIgorfQorIyBlbmQgZnVuY190b19ob3N0X3BhdGgKKworCisjIGZ1bmNfY29udmVydF9wYXRoX25vb3AgQVJHCisjIENvcHkgQVJHIHRvIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25vb3AgKCkKK3sKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX25vb3AKKworCisjIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IHBhdGggQVJHIGZyb20gKG1pbmd3KSBNU1lTIHRvIChtaW5ndykgdzMyIGZvcm1hdDsgYXV0b21hdGljCisjIGNvbnZlcnNpb24gdG8gdzMyIGlzIG5vdCBhdmFpbGFibGUgaW5zaWRlIHRoZSBjd3JhcHBlci4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tIEFSRy4gIE1TWVMKKyAgICAjIGJlaGF2aW9yIGlzIGluY29uc2lzdGVudCBoZXJlOyBjeWdwYXRoIHR1cm5zIHRoZW0gaW50byAnLjsnIGFuZCAnOy4nOworICAgICMgYW5kIHdpbmVwYXRoIGlnbm9yZXMgdGhlbSBjb21wbGV0ZWx5LgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6ICI7IiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgIjsiICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9jeWd3aW5fdG9fdzMyIEFSRworIyBDb252ZXJ0IHBhdGggQVJHIGZyb20gQ3lnd2luIHRvIHczMiBmb3JtYXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9jeWd3aW5fdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBTZWUgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzI6CisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGN5Z3BhdGggLW0gLXAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxImAKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6ICI7IiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgIjsiICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIKKworCisjIGZ1bmNfY29udmVydF9wYXRoX25peF90b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAqbml4IHRvIHczMiBmb3JtYXQuICBSZXF1aXJlcyBhIHdpbmUgZW52aXJvbm1lbnQgYW5kCisjIGEgd29ya2luZyB3aW5lcGF0aC4gIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25peF90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4gQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSBNU1lTIHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBMVF9DWUdQQVRIIHNldC4KKyMgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgLXAgIiRmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jeWdwYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6IDogXAorICAgICAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgIjoqIiAiKjoiIDogIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4KKworCisjIGZ1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4gQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAqbml4IHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBDeWd3aW4gaW5zdGFsbGVkIGluIGEKKyMgYSB3aW5lIGVudmlyb25tZW50LCB3b3JraW5nIHdpbmVwYXRoLCBhbmQgTFRfQ1lHUEFUSCBzZXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tCisgICAgIyBBUkcuIG1zeXMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmUsIGN5Z3BhdGggdHVybnMgdGhlbQorICAgICMgaW50byAnLjsnIGFuZCAnOy4nLCBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgLXAgIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogOiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgOiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fY3lnd2luCisKKworIyBmdW5jX21vZGVfY29tcGlsZSBhcmcuLi4KK2Z1bmNfbW9kZV9jb21waWxlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKKyAgICBzdXBwcmVzc19vcHQ9eWVzCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorICAgIGFyZ19tb2RlPW5vcm1hbAorICAgIGxpYm9iaj0KKyAgICBsYXRlcj0KKyAgICBwaWVfZmxhZz0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnX21vZGUgaW4KKyAgICAgIGFyZyAgKQorCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKKwlsYXN0YXJnPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCTs7CisKKyAgICAgIHRhcmdldCApCisJbGlib2JqPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCWNvbnRpbnVlCisJOzsKKworICAgICAgbm9ybWFsICkKKwkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisJY2FzZSAkYXJnIGluCisJLW8pCisJICB0ZXN0IC1uICIkbGlib2JqIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIKKwkgIGFyZ19tb2RlPXRhcmdldAorCSAgY29udGludWUKKwkgIDs7CisKKwktcGllIHwgLWZwaWUgfCAtZlBJRSkKKyAgICAgICAgICBmdW5jX2FwcGVuZCBwaWVfZmxhZyAiICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1zaGFyZWQgfCAtc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCisJICBmdW5jX2FwcGVuZCBsYXRlciAiICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1uby1zdXBwcmVzcykKKwkgIHN1cHByZXNzX29wdD1ubworCSAgY29udGludWUKKwkgIDs7CisKKwktWGNvbXBpbGVyKQorCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAorCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKKwkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCisKKwktV2MsKikKKwkgIGZ1bmNfc3RyaXBuYW1lICctV2MsJyAnJyAiJGFyZyIKKwkgIGFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgbGFzdGFyZz0KKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBsYXN0YXJnICIkYXJnIgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRsYXN0YXJnIgorCSAgbGFzdGFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgorCSAgZnVuY19hcHBlbmQgYmFzZV9jb21waWxlICIgJGxhc3RhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCSopCisJICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCisJICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KKwkgICMKKwkgIGxhc3Rhcmc9IiRzcmNmaWxlIgorCSAgc3JjZmlsZT0iJGFyZyIKKwkgIDs7CisJZXNhYyAgIyAgY2FzZSAkYXJnCisJOzsKKyAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKyAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBiYXNlX2NvbXBpbGUgIiRsYXN0YXJnIgorICAgIGRvbmUgIyBmb3IgYXJnCisKKyAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgIGFyZykKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBtdXN0IHNwZWNpZnkgYW4gYXJndW1lbnQgZm9yIC1YY29tcGlsZSIKKyAgICAgIDs7CisgICAgdGFyZ2V0KQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIgorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgeworCWZ1bmNfYmFzZW5hbWUgIiRzcmNmaWxlIgorCWxpYm9iaj0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgICAgfQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5bY0NGU2lmbXNvXSB8IFwKKyAgICAqLmFkYSB8ICouYWRiIHwgKi5hZHMgfCAqLmFzbSB8IFwKKyAgICAqLmMrKyB8ICouY2MgfCAqLmlpIHwgKi5jbGFzcyB8ICouY3BwIHwgKi5jeHggfCBcCisgICAgKi5bZkZdWzA5XT8gfCAqLmZvciB8ICouamF2YSB8ICouZ28gfCAqLm9iaiB8ICouc3ggfCAqLmN1IHwgKi5jdXApCisgICAgICBmdW5jX3hmb3JtICIkbGlib2JqIgorICAgICAgbGlib2JqPSRmdW5jX3hmb3JtX3Jlc3VsdAorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLmxvKSBmdW5jX2xvMm8gIiRsaWJvYmoiOyBvYmo9JGZ1bmNfbG8yb19yZXN1bHQgOzsKKyAgICAqKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgZm9yIGFyZyBpbiAkbGF0ZXI7IGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zaGFyZWQpCisJdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgorCWJ1aWxkX29sZF9saWJzPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtc3RhdGljKQorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1waWMpCisJcGljX21vZGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLW5vbi1waWMpCisJcGljX21vZGU9bm8KKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxpYm9iaiIKKyAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiIFwKKyAgICAgICYmICRFQ0hPICJYJGxpYm9iaiIgfCAkR1JFUCAnW11+I14qe307PD4/IiciJyInCSAmKCl8YCRbXScgXAorICAgICAgJiYgZnVuY193YXJuaW5nICJsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgorICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvYmoiICIvIiAiIgorICAgIG9iam5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCisKKyAgICB0ZXN0IC16ICIkYmFzZV9jb21waWxlIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIgorCisgICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICByZW1vdmVsaXN0PSIkb2JqICRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBlbHNlCisgICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCisgICAgZmkKKworICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisgICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICBmaQorCisgICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKKyAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKKyAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCisgICAgICBvdXRwdXRfb2JqPWAkRUNITyAiJHNyY2ZpbGUiIHwgJFNFRCAncyVeLiovJSU7IHMlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQorICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCisgICAgZWxzZQorICAgICAgb3V0cHV0X29iaj0KKyAgICAgIG5lZWRfbG9ja3M9bm8KKyAgICAgIGxvY2tmaWxlPQorICAgIGZpCisKKyAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAorICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KKyAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKyAgICAgIGZ1bmNfYXBwZW5kIHJlbW92ZWxpc3QgIiAkb3V0cHV0X29iaiIKKyAgICAgICRFQ0hPICIkc3JjZmlsZSIgPiAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRsb2NrZmlsZSIKKyAgICB0cmFwICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnIDEgMiAxNQorCisgICAgZnVuY190b190b29sX2ZpbGUgIiRzcmNmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgIHNyY2ZpbGU9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRzcmNmaWxlIgorICAgIHFzcmNmaWxlPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdAorCisgICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCisgICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKKworICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKKyAgICAgIGVsc2UKKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCisgICAgICBmaQorCisgICAgICBmdW5jX21rZGlyX3AgIiR4ZGlyJG9iamRpciIKKworICAgICAgaWYgdGVzdCAteiAiJG91dHB1dF9vYmoiOyB0aGVuCisJIyBQbGFjZSBQSUMgb2JqZWN0cyBpbiAkb2JqZGlyCisJZnVuY19hcHBlbmQgY29tbWFuZCAiIC1vICRsb2JqIgorICAgICAgZmkKKworICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIJXAorICAgICAgICAgICd0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRsb2JqIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICckTVYgIiRvdXRwdXRfb2JqIiAiJGxvYmoiJyBcCisJICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJworICAgICAgZmkKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgaWYgdGVzdCAiJHN1cHByZXNzX29wdCIgPSB5ZXM7IHRoZW4KKwlzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUkcGllX2ZsYWciCisgICAgICBlbHNlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJZnVuY19hcHBlbmQgY29tbWFuZCAiIC1vICRvYmoiCisgICAgICBmaQorCisgICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KKyAgICAgIGZ1bmNfYXBwZW5kIGNvbW1hbmQgIiRzdXBwcmVzc19vdXRwdXQiCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIiBcCisgICAgICAgICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkb2JqIicgXAorCSAgJ2Vycm9yPSQ/OyAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRlcnJvcicKKyAgICAgIGZpCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCB7CisgICAgICBmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICIkbGlib2JqIiAiJG9iamRpci8kb2JqbmFtZSIgIiRvYmpuYW1lIgorCisgICAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKwlyZW1vdmVsaXN0PSRsb2NrZmlsZQorICAgICAgICAkUk0gIiRsb2NrZmlsZSIKKyAgICAgIGZpCisgICAgfQorCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKKyRvcHRfaGVscCB8fCB7CisgIHRlc3QgIiRvcHRfbW9kZSIgPSBjb21waWxlICYmIGZ1bmNfbW9kZV9jb21waWxlICR7MSsiJEAifQorfQorCitmdW5jX21vZGVfaGVscCAoKQoreworICAgICMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgorICAgIGNhc2UgJG9wdF9tb2RlIGluCisgICAgICAiIikKKyAgICAgICAgIyBHZW5lcmljIGhlbHAgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVzYWdlIGNvbW1lbnRzCisgICAgICAgICMgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZmlsZS4KKyAgICAgICAgZnVuY19oZWxwCisgICAgICAgIDs7CisKKyAgICAgIGNsZWFuKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCit3aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgICAgICAgIDs7CisKKyAgICAgIGNvbXBpbGUpCisgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQorCitDb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQorICAtbm8tc3VwcHJlc3MgICAgICBkbyBub3Qgc3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGZvciBtdWx0aXBsZSBwYXNzZXMKKyAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkIFBJQyBvYmplY3RzIG9ubHkKKyAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1zaGFyZWQgICAgICAgICAgIGRvIG5vdCBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisgIC1zdGF0aWMgICAgICAgICAgIG9ubHkgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZworICAtV2MsRkxBRyAgICAgICAgICBwYXNzIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGNvbXBpbGVyCisKK0NPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCitmcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgorCitUaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KK1NPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQorbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgorICAgICAgICA7OworCisgICAgICBleGVjdXRlKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgorCitBdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKKworVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJworZmxhZ3MuCisKK0lmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKK2ludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQorZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCisKK1RoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgorICAgICAgICA7OworCisgICAgICBmaW5pc2gpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KKworQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KKworRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KKworVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCit0aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKKyAgICAgICAgOzsKKworICAgICAgaW5zdGFsbCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCisKK0luc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgorCitJTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKK2VpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgSU5TVEFMTC1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtaW5zdC1wcmVmaXgtZGlyIFBSRUZJWC1ESVIgIFVzZSBQUkVGSVgtRElSIGFzIGEgc3RhZ2luZyBhcmVhIGZvciBpbnN0YWxsYXRpb24KKworVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKK0JTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgorICAgICAgICA7OworCisgICAgICBsaW5rKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KKworTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bworY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCithIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCisgIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQorICAtYmluZGlyIEJJTkRJUiAgICBzcGVjaWZ5IHBhdGggdG8gYmluYXJpZXMgZGlyZWN0b3J5IChmb3Igc3lzdGVtcyB3aGVyZQorICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgbXVzdCBiZSBmb3VuZCBpbiB0aGUgUEFUSCBzZXR0aW5nIGF0IHJ1bnRpbWUpCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scworICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQorICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQorICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKKyAgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IFJFR0VYCisgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAorICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCisgIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCisgIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAorICAtbm8tZmFzdC1pbnN0YWxsICBkaXNhYmxlIHRoZSBmYXN0LWluc3RhbGwgbW9kZQorICAtbm8taW5zdGFsbCAgICAgICBsaW5rIGEgbm90LWluc3RhbGxhYmxlIGV4ZWN1dGFibGUKKyAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCisgIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cworICAtb2JqZWN0bGlzdCBGSUxFICBVc2UgYSBsaXN0IG9mIG9iamVjdCBmaWxlcyBmb3VuZCBpbiBGSUxFIHRvIHNwZWNpZnkgb2JqZWN0cworICAtcHJlY2lvdXMtZmlsZXMtcmVnZXggUkVHRVgKKyAgICAgICAgICAgICAgICAgICAgZG9uJ3QgcmVtb3ZlIG91dHB1dCBmaWxlcyBtYXRjaGluZyBSRUdFWAorICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgorICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCisgIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCisgIC1zaGFyZWQgICAgICAgICAgIG9ubHkgZG8gZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC1zaHJleHQgU1VGRklYICAgIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBzaGFyZWQgbGlicmFyeSBmaWxlIGV4dGVuc2lvbgorICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAtc3RhdGljLWxpYnRvb2wtbGlicworICAgICAgICAgICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcworICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCisgIC13ZWFrIExJQk5BTUUgICAgIGRlY2xhcmUgdGhhdCB0aGUgdGFyZ2V0IHByb3ZpZGVzIHRoZSBMSUJOQU1FIGludGVyZmFjZQorICAtV2MsRkxBRworICAtWGNvbXBpbGVyIEZMQUcgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBjb21waWxlcgorICAtV2wsRkxBRworICAtWGxpbmtlciBGTEFHICAgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBsaW5rZXIKKyAgLVhDQ2xpbmtlciBGTEFHICAgcGFzcyBsaW5rLXNwZWNpZmljIEZMQUcgdG8gdGhlIGNvbXBpbGVyIGRyaXZlciAoQ0MpCisKK0FsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCisKK0V2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCit0cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQorb2JqZWN0IGZpbGVzLgorCitJZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKK29ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKK3JlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAordXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCitpcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgorICAgICAgICA7OworCisgICAgICB1bmluc3RhbGwpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCitPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgIGZ1bmNfZmF0YWxfaGVscCAiaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRvcHRfbW9kZSciCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgZWNobworICAgICRFQ0hPICJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCit9CisKKyMgTm93IHRoYXQgd2UndmUgY29sbGVjdGVkIGEgcG9zc2libGUgLS1tb2RlIGFyZywgc2hvdyBoZWxwIGlmIG5lY2Vzc2FyeQoraWYgJG9wdF9oZWxwOyB0aGVuCisgIGlmIHRlc3QgIiRvcHRfaGVscCIgPSA6OyB0aGVuCisgICAgZnVuY19tb2RlX2hlbHAKKyAgZWxzZQorICAgIHsKKyAgICAgIGZ1bmNfaGVscCBub2V4aXQKKyAgICAgIGZvciBvcHRfbW9kZSBpbiBjb21waWxlIGxpbmsgZXhlY3V0ZSBpbnN0YWxsIGZpbmlzaCB1bmluc3RhbGwgY2xlYW47IGRvCisJZnVuY19tb2RlX2hlbHAKKyAgICAgIGRvbmUKKyAgICB9IHwgc2VkIC1uICcxcDsgMiwkcy9eVXNhZ2U6LyAgb3I6IC9wJworICAgIHsKKyAgICAgIGZ1bmNfaGVscCBub2V4aXQKKyAgICAgIGZvciBvcHRfbW9kZSBpbiBjb21waWxlIGxpbmsgZXhlY3V0ZSBpbnN0YWxsIGZpbmlzaCB1bmluc3RhbGwgY2xlYW47IGRvCisJZWNobworCWZ1bmNfbW9kZV9oZWxwCisgICAgICBkb25lCisgICAgfSB8CisgICAgc2VkICcxZAorICAgICAgL15XaGVuIHJlcG9ydGluZy8sL15SZXBvcnQveworCUgKKwlkCisgICAgICB9CisgICAgICAkeAorICAgICAgL2luZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzL2QKKyAgICAgIC9tb3JlIGRldGFpbGVkIC4qTU9ERS9kCisgICAgICBzL15Vc2FnZTouKi0tbW9kZT1cKFteIF0qXCkgLiovRGVzY3JpcHRpb24gb2YgXDEgbW9kZTovJworICBmaQorICBleGl0ICQ/CitmaQorCisKKyMgZnVuY19tb2RlX2V4ZWN1dGUgYXJnLi4uCitmdW5jX21vZGVfZXhlY3V0ZSAoKQoreworICAgICRvcHRfZGVidWcKKyAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgorICAgIGNtZD0iJG5vbm9wdCIKKyAgICB0ZXN0IC16ICIkY21kIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIgorCisgICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KKyAgICBmb3IgZmlsZSBpbiAkb3B0X2Rsb3BlbjsgZG8KKyAgICAgIHRlc3QgLWYgIiRmaWxlIiBcCisJfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSBmaWxlIgorCisgICAgICBkaXI9CisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLmxhKQorCWZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZmlsZSIKKwlmaWxlPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KKwlkbG5hbWU9CisJbGlicmFyeV9uYW1lcz0KKwlmdW5jX3NvdXJjZSAiJGZpbGUiCisKKwkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmIFwKKwkgICAgZnVuY193YXJuaW5nICJcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKKwkgIGNvbnRpbnVlCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIGRpciAiLyRvYmpkaXIiCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkZGlyLyRkbG5hbWUiOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciCisJICBmaQorCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCisJZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKwk7OworCisgICAgICAqKQorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCisgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisgICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCisKKyAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCisgICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKKyAgICAgIGVsc2UKKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCisgICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgorCisgICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgorICAgIGFyZ3M9CisgICAgZm9yIGZpbGUKKyAgICBkbworICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgLSogfCAqLmxhIHwgKi5sbyApIDs7CisgICAgICAqKQorCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJGZpbGUiOyB0aGVuCisJICBmdW5jX3NvdXJjZSAiJGZpbGUiCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZWxpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCisJICBmdW5jX3NvdXJjZSAiJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0IgorCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCisgICAgICBmdW5jX2FwcGVuZF9xdW90ZWQgYXJncyAiJGZpbGUiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiWCRvcHRfZHJ5X3J1biIgPSBYZmFsc2U7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCSMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgorCWV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisKKyAgICAgICMgUmVzdG9yZSBzYXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgIGZvciBsdF92YXIgaW4gTEFORyBMQU5HVUFHRSBMQ19BTEwgTENfQ1RZUEUgTENfQ09MTEFURSBMQ19NRVNTQUdFUworICAgICAgZG8KKwlldmFsICJpZiB0ZXN0IFwiXCR7c2F2ZV8kbHRfdmFyK3NldH1cIiA9IHNldDsgdGhlbgorICAgICAgICAgICAgICAgICRsdF92YXI9XCRzYXZlXyRsdF92YXI7IGV4cG9ydCAkbHRfdmFyCisJICAgICAgZWxzZQorCQkkbHRfdW5zZXQgJGx0X3ZhcgorCSAgICAgIGZpIgorICAgICAgZG9uZQorCisgICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCisgICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKKyAgICBlbHNlCisgICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZXZhbCAiXCRFQ0hPIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKwllY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorICAgICAgJEVDSE8gIiRjbWQkYXJncyIKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIGZpCit9CisKK3Rlc3QgIiRvcHRfbW9kZSIgPSBleGVjdXRlICYmIGZ1bmNfbW9kZV9leGVjdXRlICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2ZpbmlzaCBhcmcuLi4KK2Z1bmNfbW9kZV9maW5pc2ggKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbGlicz0KKyAgICBsaWJkaXJzPQorICAgIGFkbWluY21kcz0KKworICAgIGZvciBvcHQgaW4gIiRub25vcHQiICR7MSsiJEAifQorICAgIGRvCisgICAgICBpZiB0ZXN0IC1kICIkb3B0IjsgdGhlbgorCWZ1bmNfYXBwZW5kIGxpYmRpcnMgIiAkb3B0IgorCisgICAgICBlbGlmIHRlc3QgLWYgIiRvcHQiOyB0aGVuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJG9wdCI7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIGxpYnMgIiAkb3B0IgorCWVsc2UKKwkgIGZ1bmNfd2FybmluZyAiXGAkb3B0JyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJZmkKKworICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgYXJndW1lbnQgXGAkb3B0JyIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGxpYnMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkbHRfc3lzcm9vdCI7IHRoZW4KKyAgICAgICAgc3lzcm9vdF9yZWdleD1gJEVDSE8gIiRsdF9zeXNyb290IiB8ICRTRUQgIiRzZWRfbWFrZV9saXRlcmFsX3JlZ2V4ImAKKyAgICAgICAgc3lzcm9vdF9jbWQ9InMvXChbICddXCkkc3lzcm9vdF9yZWdleC9cMS9nOyIKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzcm9vdF9jbWQ9CisgICAgICBmaQorCisgICAgICAjIFJlbW92ZSBzeXNyb290IHJlZmVyZW5jZXMKKyAgICAgIGlmICRvcHRfZHJ5X3J1bjsgdGhlbgorICAgICAgICBmb3IgbGliIGluICRsaWJzOyBkbworICAgICAgICAgIGVjaG8gInJlbW92aW5nIHJlZmVyZW5jZXMgdG8gJGx0X3N5c3Jvb3QgYW5kIFxgPScgcHJlZml4ZXMgZnJvbSAkbGliIgorICAgICAgICBkb25lCisgICAgICBlbHNlCisgICAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisgICAgICAgIGZvciBsaWIgaW4gJGxpYnM7IGRvCisJICBzZWQgLWUgIiR7c3lzcm9vdF9jbWR9IHMvXChbICddLVtMUl1cKT0vXDEvZzsgcy9cKFsgJ11cKT0vXDEvZyIgJGxpYiBcCisJICAgID4gJHRtcGRpci90bXAtbGEKKwkgIG12IC1mICR0bXBkaXIvdG1wLWxhICRsaWIKKwlkb25lCisgICAgICAgICR7Uk19ciAiJHRtcGRpciIKKyAgICAgIGZpCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJGZpbmlzaF9jbWRzIiAnYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisnIiRjbWQiJyInCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCisJICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWRzIiB8fCBmdW5jX2FwcGVuZCBhZG1pbmNtZHMgIgorICAgICAgICRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgorICAgICRvcHRfc2lsZW50ICYmIGV4aXQgJEVYSVRfU1VDQ0VTUworCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICBlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCSRFQ0hPICIgICAkbGliZGlyIgorICAgICAgZG9uZQorICAgICAgZWNobworICAgICAgZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCisgICAgICBlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKKyAgICAgIGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCisgICAgICBlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwllY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorCWVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisJZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwlsaWJkaXI9TElCRElSCisJZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisJJEVDSE8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgorCSRFQ0hPICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorCWVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgorICAgICAgZmkKKyAgICAgIGVjaG8KKworICAgICAgZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCisgICAgICBjYXNlICRob3N0IGluCisJc29sYXJpczIuWzY3ODldfHNvbGFyaXMyLjFbMC05XSkKKwkgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpLCBjcmxlKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwiCisJICBlY2hvICJwYWdlcy4iCisJICA7OworCSopCisJICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKKwkgIDs7CisgICAgICBlc2FjCisgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgIGZpCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKK3Rlc3QgIiRvcHRfbW9kZSIgPSBmaW5pc2ggJiYgZnVuY19tb2RlX2ZpbmlzaCAkezErIiRAIn0KKworCisjIGZ1bmNfbW9kZV9pbnN0YWxsIGFyZy4uLgorZnVuY19tb2RlX2luc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgorICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoIHx8CisgICAgICAgIyBBbGxvdyB0aGUgdXNlIG9mIEdOVSBzaHRvb2wncyBpbnN0YWxsIGNvbW1hbmQuCisgICAgICAgY2FzZSAkbm9ub3B0IGluICpzaHRvb2wqKSA6OzsgKikgZmFsc2U7OyBlc2FjOyB0aGVuCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbm9ub3B0IgorICAgICAgaW5zdGFsbF9wcm9nPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQgIgorICAgICAgYXJnPSQxCisgICAgICBzaGlmdAorICAgIGVsc2UKKyAgICAgIGluc3RhbGxfcHJvZz0KKyAgICAgIGFyZz0kbm9ub3B0CisgICAgZmkKKworICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KKyAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKyAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3Byb2cgIiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICBpbnN0YWxsX3NoYXJlZF9wcm9nPSRpbnN0YWxsX3Byb2cKKyAgICBjYXNlICIgJGluc3RhbGxfcHJvZyAiIGluCisgICAgICAqW1xcXCAvXWNwXCAqKSBpbnN0YWxsX2NwPTogOzsKKyAgICAgICopIGluc3RhbGxfY3A9ZmFsc2UgOzsKKyAgICBlc2FjCisKKyAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCisgICAgZGVzdD0KKyAgICBmaWxlcz0KKyAgICBvcHRzPQorICAgIHByZXY9CisgICAgaW5zdGFsbF90eXBlPQorICAgIGlzZGlyPW5vCisgICAgc3RyaXBtZT0KKyAgICBub19tb2RlPToKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGFyZzI9CisgICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KKwlmdW5jX2FwcGVuZCBmaWxlcyAiICRkZXN0IgorCWRlc3Q9JGFyZworCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKKyAgICAgIC1mKQorCWlmICRpbnN0YWxsX2NwOyB0aGVuIDo7IGVsc2UKKwkgIHByZXY9JGFyZworCWZpCisJOzsKKyAgICAgIC1nIHwgLW0gfCAtbykKKwlwcmV2PSRhcmcKKwk7OworICAgICAgLXMpCisJc3RyaXBtZT0iIC1zIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIC0qKQorCTs7CisgICAgICAqKQorCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KKwlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwkgIGlmIHRlc3QgIngkcHJldiIgPSB4LW0gJiYgdGVzdCAtbiAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSI7IHRoZW4KKwkgICAgYXJnMj0kaW5zdGFsbF9vdmVycmlkZV9tb2RlCisJICAgIG5vX21vZGU9ZmFsc2UKKwkgIGZpCisJICBwcmV2PQorCWVsc2UKKwkgIGRlc3Q9JGFyZworCSAgY29udGludWUKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgICAgZnVuY19hcHBlbmQgaW5zdGFsbF9wcm9nICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgICAgaWYgdGVzdCAtbiAiJGFyZzIiOyB0aGVuCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZzIiCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgaW5zdGFsbF9zaGFyZWRfcHJvZyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICBkb25lCisKKyAgICB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIgorCisgICAgdGVzdCAtbiAiJHByZXYiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKKworICAgIGlmIHRlc3QgLW4gIiRpbnN0YWxsX292ZXJyaWRlX21vZGUiICYmICRub19tb2RlOyB0aGVuCisgICAgICBpZiAkaW5zdGFsbF9jcDsgdGhlbiA6OyBlbHNlCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSIKKwlmdW5jX2FwcGVuZCBpbnN0YWxsX3NoYXJlZF9wcm9nICIgLW0gJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCisJZnVuY19mYXRhbF9oZWxwICJubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKKyAgICAgIGVsc2UKKwlmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiJGRlc3QiCisgICAgZGVzdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkZGVzdCIgIiIgIi4iCisgICAgICBkZXN0ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICAgIGRlc3RuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKyAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KKyAgICAgIHNldCBkdW1teSAkZmlsZXM7IHNoaWZ0CisgICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAorCWZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IgorICAgIGZpCisgICAgY2FzZSAkZGVzdGRpciBpbgorICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKyAgICAqKQorICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCWNhc2UgJGZpbGUgaW4KKwkqLmxvKSA7OworCSopCisJICBmdW5jX2ZhdGFsX2hlbHAgIlxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLiRsaWJleHQpCisJIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKwlmdW5jX2FwcGVuZCBzdGF0aWNsaWJzICIgJGZpbGUiCisJOzsKKworICAgICAgKi5sYSkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZpbGUiCisJZmlsZT0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRmaWxlIiBcCisJICB8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKworCWxpYnJhcnlfbmFtZXM9CisJb2xkX2xpYnJhcnk9CisJcmVsaW5rX2NvbW1hbmQ9CisJZnVuY19zb3VyY2UgIiRmaWxlIgorCisJIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgorCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCisJICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBjdXJyZW50X2xpYmRpcnMgIiAkbGliZGlyIiA7OworCSAgZXNhYworCWVsc2UKKwkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KKwkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZnV0dXJlX2xpYmRpcnMgIiAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisKKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiLyIgIiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCWZ1bmNfYXBwZW5kIGRpciAiJG9iamRpciIKKworCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCisJICBpbnN0X3ByZWZpeF9kaXI9YCRFQ0hPICIkZGVzdGRpciIgfCAkU0VEIC1lICJzJSRsaWJkaXJcJCUlImAKKworCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAorCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAorCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KKwkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCisJICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KKwkgIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiBjYW5ub3QgaW5zdGFsbCBcYCRmaWxlJyB0byBhIGRpcmVjdG9yeSBub3QgZW5kaW5nIGluICRsaWJkaXIiCisKKwkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKKwkgIGVsc2UKKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKKwkgIGZpCisKKwkgIGZ1bmNfd2FybmluZyAicmVsaW5raW5nIFxgJGZpbGUnIgorCSAgZnVuY19zaG93X2V2YWwgIiRyZWxpbmtfY29tbWFuZCIgXAorCSAgICAnZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJ1wnJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IicKKwlmaQorCisJIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXM7IHNoaWZ0CisJaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisJICByZWFsbmFtZT0iJDEiCisJICBzaGlmdAorCisJICBzcmNuYW1lPSIkcmVhbG5hbWUiCisJICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCisKKwkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9zaGFyZWRfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgXAorCSAgICAgICdleGl0ICQ/JworCSAgdHN0cmlwbWU9IiRzdHJpcG1lIgorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorCSAgICBjYXNlICRyZWFsbmFtZSBpbgorCSAgICAqLmRsbC5hKQorCSAgICAgIHRzdHJpcG1lPSIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAtbiAiJHRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCisJICAgIGZ1bmNfc2hvd19ldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiAnZXhpdCAkPycKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgorCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgorCSAgICAjIFRyeSBgbG4gLXNmJyBmaXJzdCwgYmVjYXVzZSB0aGUgYGxuJyBiaW5hcnkgbWlnaHQgZGVwZW5kIG9uCisJICAgICMgdGhlIHN5bWxpbmsgd2UgcmVwbGFjZSEgIFNvbGFyaXMgL2Jpbi9sbiBkb2VzIG5vdCB1bmRlcnN0YW5kIC1mLAorCSAgICAjIHNvIHdlIGFsc28gbmVlZCB0byB0cnkgcm0gJiYgbG4gLXMuCisJICAgIGZvciBsaW5rbmFtZQorCSAgICBkbworCSAgICAgIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSIgXAorCQkmJiBmdW5jX3Nob3dfZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRSTSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCisJICAgIGRvbmUKKwkgIGZpCisKKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKwkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKKwlmaQorCisJIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCisJZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKKwlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiICdleGl0ICQ/JworCisJIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgZnVuY19hcHBlbmQgc3RhdGljbGlicyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCTs7CisKKyAgICAgICoubG8pCisJIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCisKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwkgIGRlc3RmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCWNhc2UgJGRlc3RmaWxlIGluCisJKi5sbykKKwkgIGZ1bmNfbG8ybyAiJGRlc3RmaWxlIgorCSAgc3RhdGljZGVzdD0kZnVuY19sbzJvX3Jlc3VsdAorCSAgOzsKKwkqLiRvYmpleHQpCisJICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCisJICBkZXN0ZmlsZT0KKwkgIDs7CisJKikKKwkgIGZ1bmNfZmF0YWxfaGVscCAiY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciCisJICA7OworCWVzYWMKKworCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgorCXRlc3QgLW4gIiRkZXN0ZmlsZSIgJiYgXAorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiAnZXhpdCAkPycKKworCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgorCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJICBmdW5jX2xvMm8gIiRmaWxlIgorCSAgc3RhdGljb2JqPSRmdW5jX2xvMm9fcmVzdWx0CisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiICdleGl0ICQ/JworCWZpCisJZXhpdCAkRVhJVF9TVUNDRVNTCisJOzsKKworICAgICAgKikKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwkgIGRlc3RmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIGFuZCB0aGVyZSBpcyBhIC5leGUgb24gdGhlIGVuZCwgc3RyaXAgaXQKKwkjIGJlY2F1c2UgaXQgaXMgbW9zdCBsaWtlbHkgYSBsaWJ0b29sIHNjcmlwdCB3ZSBhY3R1YWxseSB3YW50IHRvCisJIyBpbnN0YWxsCisJc3RyaXBwZWRfZXh0PSIiCisJY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCisJICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgICBmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgICBzdHJpcHBlZF9leHQ9Ii5leGUiCisJICAgIGZpCisJICAgIDs7CisJZXNhYworCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWNhc2UgJGhvc3QgaW4KKwkqY3lnd2luKiB8ICptaW5ndyopCisJICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCisJICAgICAgd3JhcHBlcj0kZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgICAgd3JhcHBlcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIGZpCisJICAgIDs7CisJKikKKwkgICAgd3JhcHBlcj0kZmlsZQorCSAgICA7OworCWVzYWMKKwlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJHdyYXBwZXIiOyB0aGVuCisJICBub3RpbnN0X2RlcGxpYnM9CisJICByZWxpbmtfY29tbWFuZD0KKworCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgorCisJICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KKwkgIHRlc3QgLXogIiRnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCR3cmFwcGVyJyIKKworCSAgZmluYWxpemU9eWVzCisJICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCisJICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KKwkgICAgbGliZGlyPQorCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCSAgICAgIGZ1bmNfc291cmNlICIkbGliIgorCSAgICBmaQorCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJEVDSE8gIiRsaWIiIHwgJFNFRCAncyVeLiovJSVnJ2AgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCisJICAgICAgZnVuY193YXJuaW5nICJcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIKKwkgICAgICBmaW5hbGl6ZT1ubworCSAgICBmaQorCSAgZG9uZQorCisJICByZWxpbmtfY29tbWFuZD0KKwkgIGZ1bmNfc291cmNlICIkd3JhcHBlciIKKworCSAgb3V0cHV0bmFtZT0KKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KKwkgICAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisJCWZ1bmNfYmFzZW5hbWUgIiRmaWxlJHN0cmlwcGVkX2V4dCIKKwkJZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKKwkgICAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwkgICAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAorCisJICAgICAgICAkb3B0X3NpbGVudCB8fCB7CisJICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJHJlbGlua19jb21tYW5kIgorCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKwkgICAgICAgIH0KKwkgICAgICAgIGlmIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgorCSAgICAgICAgICBlbHNlCisJCSAgZnVuY19lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IgorCQkgICRvcHRfZHJ5X3J1biB8fCAke1JNfXIgIiR0bXBkaXIiCisJCSAgY29udGludWUKKwkgICAgICAgIGZpCisJICAgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKKwkgICAgICBlbHNlCisJICAgICAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCByZWxpbmsgXGAkZmlsZSciCisJICAgICAgZmkKKwkgICAgfQorCSAgZWxzZQorCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCisJICAgIGZpbGU9YCRFQ0hPICIkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFNFRCAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKKwkgIGZpCisJZmkKKworCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgorCSMgb25lIGFueXdheQorCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgorCSovdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKKwkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCisJICAqLmV4ZToqLmV4ZSkKKwkgICAgIyB0aGlzIGlzIG9rCisJICAgIDs7CisJICAqLmV4ZToqKQorCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCisJICAgIDs7CisJICAqOiouZXhlKQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRkZXN0ZmlsZSIKKwkgICAgZGVzdGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiICdleGl0ICQ/JworCSRvcHRfZHJ5X3J1biB8fCBpZiB0ZXN0IC1uICIkb3V0cHV0bmFtZSI7IHRoZW4KKwkgICR7Uk19ciAiJHRtcGRpciIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCisgICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKyAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgorICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2xkbGliIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgdG9vbF9vbGRsaWI9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiICdleGl0ICQ/JworCisgICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAiJG9sZF9zdHJpcGxpYiAkdG9vbF9vbGRsaWIiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgJ2V4aXQgJD8nCisgICAgZG9uZQorCisgICAgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIiAmJiBcCisgICAgICBmdW5jX3dhcm5pbmcgInJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgICRvcHRfZHJ5X3J1biAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjX2NtZD0nJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCisgICAgZWxzZQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGluc3RhbGwgJiYgZnVuY19tb2RlX2luc3RhbGwgJHsxKyIkQCJ9CisKKworIyBmdW5jX2dlbmVyYXRlX2Rsc3ltcyBvdXRwdXRuYW1lIG9yaWdpbmF0b3IgcGljX3AKKyMgRXh0cmFjdCBzeW1ib2xzIGZyb20gZGxwcmVmaWxlcyBhbmQgY3JlYXRlICR7b3V0cHV0bmFtZX1TLm8gd2l0aAorIyBhIGRscHJlb3BlbiBzeW1ib2wgdGFibGUuCitmdW5jX2dlbmVyYXRlX2Rsc3ltcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9vdXRwdXRuYW1lPSIkMSIKKyAgICBteV9vcmlnaW5hdG9yPSIkMiIKKyAgICBteV9waWNfcD0iJHszLW5vfSIKKyAgICBteV9wcmVmaXg9YCRFQ0hPICIkbXlfb3JpZ2luYXRvciIgfCBzZWQgJ3MlW15hLXpBLVowLTldJV8lZydgCisgICAgbXlfZGxzeW1zPQorCisgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwlteV9kbHN5bXM9IiR7bXlfb3V0cHV0bmFtZX1TLmMiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAibm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJG15X2Rsc3ltcyI7IHRoZW4KKyAgICAgIGNhc2UgJG15X2Rsc3ltcyBpbgorICAgICAgIiIpIDs7CisgICAgICAqLmMpCisJIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKwlubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfS5ubSIKKworCWZ1bmNfc2hvd19ldmFsICIkUk0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisKKwkjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgorCWZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKworCSRvcHRfZHJ5X3J1biB8fCAkRUNITyA+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorLyogJG15X2Rsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRteV9vdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIFwiQ1wiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDQpKSB8fCAoX19HTlVDX18gPiA0KSkKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCBcIi1Xc3RyaWN0LXByb3RvdHlwZXNcIgorI2VuZGlmCisKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwlpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAkb3B0X2RyeV9ydW4gfHwgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwkgIHByb2dmaWxlcz1gJEVDSE8gIiRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwkgIGZvciBwcm9nZmlsZSBpbiAkcHJvZ2ZpbGVzOyBkbworCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHByb2dmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCciCisJICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkTk0gJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgfQorCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICB9CisJICBmaQorCisJICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCSAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisgICAgICAgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZWxzZQorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgIiR7U0VEfSAtZSAncy9cKFtdLlsqXiRdXCkvXFxcXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJworCSAgICAgIGV2YWwgJyRHUkVQIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkgICAgICAgICAgZXZhbCAnY2F0ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZmkKKwlmaQorCisJZm9yIGRscHJlZmlsZSBpbiAkZGxwcmVmaWxlczsgZG8KKwkgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkZGxwcmVmaWxlJyIKKwkgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGUiCisJICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAjIGlmIGFuIGltcG9ydCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIG9idGFpbiBkbG5hbWUKKwkgICAgICBpZiBmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCAiJGRscHJlZmlsZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfdHJfc2ggIiRkbHByZWZpbGUiCisJICAgICAgICBldmFsICJjdXJyX2xhZmlsZT1cJGxpYmZpbGVfJGZ1bmNfdHJfc2hfcmVzdWx0IgorCSAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9IiIKKwkgICAgICAgIGlmIHRlc3QgLW4gIiRjdXJyX2xhZmlsZSIgJiYgZnVuY19sYWxpYl9wICIkY3Vycl9sYWZpbGUiOyB0aGVuCisJICAgICAgICAgICMgVXNlIHN1YnNoZWxsLCB0byBhdm9pZCBjbG9iYmVyaW5nIGN1cnJlbnQgdmFyaWFibGUgdmFsdWVzCisJICAgICAgICAgIGRscHJlZmlsZV9kbG5hbWU9YHNvdXJjZSAiJGN1cnJfbGFmaWxlIiAmJiBlY2hvICIkZGxuYW1lImAKKwkgICAgICAgICAgaWYgdGVzdCAtbiAiJGRscHJlZmlsZV9kbG5hbWUiIDsgdGhlbgorCSAgICAgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGVfZGxuYW1lIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICAjIG5vIGxhZmlsZS4gdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCAtZGxwcmVvcGVuIDxpbXBvcnQgbGlicmFyeT4uCisJICAgICAgICAgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kICIkZGxwcmVmaWxlIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorCSAgICAgICAgICBmaQorCSAgICAgICAgZmkKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbHByZWZpbGVfZGxiYXNlbmFtZSIgOyB0aGVuCisJICAgICAgICAgICAgZXZhbCAnJEVDSE8gIjogJGRscHJlZmlsZV9kbGJhc2VuYW1lIiA+PiAiJG5saXN0IicKKwkgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgIGZ1bmNfd2FybmluZyAiQ291bGQgbm90IGNvbXB1dGUgRExMIG5hbWUgZnJvbSAkbmFtZSIKKwkgICAgICAgICAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAgICAgICBmaQorCSAgICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgICAgZXZhbCAiJE5NIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8CisJICAgICAgICAgICAgJFNFRCAtZSAnL0kgX19pbXAvZCcgLWUgJ3MvSSBfX25tXy9EIC87cy9fbm1fXy8vJyA+PiAnJG5saXN0JyIKKwkgICAgICAgIH0KKwkgICAgICBlbHNlICMgbm90IGFuIGltcG9ydCBsaWIKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgICBldmFsICIkTk0gXCIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICAgICAgfQorCSAgICAgIGZpCisJICAgIDs7CisJICAgICopCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgIGV2YWwgIiROTSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgICAgfQorCSAgICA7OworICAgICAgICAgIGVzYWMKKwlkb25lCisKKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgorCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKKwkgICAgJE1WICIkbmxpc3QiVCAiJG5saXN0IgorCSAgZmkKKworCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKwkgIGlmICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgfAorCSAgICAgIGlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzb3J0IC1rIDMKKwkgICAgICBlbHNlCisJCXNvcnQgKzIKKwkgICAgICBmaSB8CisJICAgICAgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiJworCSAgZWxzZQorCSAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgIGZpCisKKwkgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAqYWRkcmVzczsKK30gbHRfZGxzeW1saXN0OworZXh0ZXJuIExUX0RMU1lNX0NPTlNUIGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdOworTFRfRExTWU1fQ09OU1QgbHRfZGxzeW1saXN0CitsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW10gPQore1wKKyAgeyBcIiRteV9vcmlnaW5hdG9yXCIsICh2b2lkICopIDAgfSwiCisKKwkgIGNhc2UgJG5lZWRfbGliX3ByZWZpeCBpbgorCSAgbm8pCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgICA7OworCSAgKikKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZlwKKyIKKwl9ICMgISRvcHRfZHJ5X3J1bgorCisJcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQorCWNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgorCSoiIC1zdGF0aWMgIiopIDs7CisJKikKKwkgIGNhc2UgJGhvc3QgaW4KKwkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAorCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCisJICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCisJICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KKwkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCisJICAqLSotZnJlZWJzZDIuKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQorCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURGUkVFQlNEX1dPUktBUk9VTkQiIDs7CisJICAqLSotaHB1eCopCisJICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICJYJG15X3BpY19wIiAhPSBYbm87IHRoZW4KKwkgICAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwlzeW10YWJfY2ZsYWdzPQorCWZvciBhcmcgaW4gJExUQ0ZMQUdTOyBkbworCSAgY2FzZSAkYXJnIGluCisJICAtcGllIHwgLWZwaWUgfCAtZlBJRSkgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHN5bXRhYl9jZmxhZ3MgIiAkYXJnIiA7OworCSAgZXNhYworCWRvbmUKKworCSMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJZnVuY19zaG93X2V2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyRzeW10YWJfY2ZsYWdzIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRteV9kbHN5bXMiKScgJ2V4aXQgJD8nCisKKwkjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCInCisKKwkjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorCXN5bWZpbGVvYmo9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX1TLiRvYmpleHQiCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmIjsgdGhlbgorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICBlbHNlCisJICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaQorCSAgOzsKKwkqKQorCSAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlmdW5jX2ZhdGFsX2Vycm9yICJ1bmtub3duIHN1ZmZpeCBmb3IgXGAkbXlfZGxzeW1zJyIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisgICAgICAjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisgICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKyAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJSBAU1lNRklMRUAlJSJgCisgICAgZmkKK30KKworIyBmdW5jX3dpbjMyX2xpYmlkIGFyZworIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCisjCisjIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKKyMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50CisjIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KKyMgRGVzcGl0ZSB0aGUgbmFtZSwgYWxzbyBkZWFsIHdpdGggNjQgYml0IGJpbmFyaWVzLgorZnVuY193aW4zMl9saWJpZCAoKQoreworICAkb3B0X2RlYnVnCisgIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCisgIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCisgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KKyAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0CisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgorICAgIDs7CisgICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKKyAgICAjIEtlZXAgdGhlIGVncmVwIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gX0xUX0NIRUNLX01BR0lDX01FVEhPRC4KKyAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8CisgICAgICAgJEVHUkVQICdmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiB8CisJJFNFRCAtbiAtZSAnCisJICAgIDEsMTAweworCQkvIEkgL3sKKwkJICAgIHMsLiosaW1wb3J0LAorCQkgICAgcAorCQkgICAgcQorCQl9CisJICAgIH0nYAorICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KKyAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKKyAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgICpETEwqKQorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgOzsKKyAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCisgICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKKyAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICRFQ0hPICIkd2luMzJfbGliaWRfdHlwZSIKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIgQVJHCisjCisjIFBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCisjIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorIyBpbXBvcnQgbGlicmFyeSBBUkcuCisjIEludm9rZWQgYnkgZXZhbCdpbmcgdGhlIGxpYnRvb2wgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gdGhlIHZhcmlhYmxlCisjICAgICRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliICgpCit7CisgICRvcHRfZGVidWcKKyAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9YCRETExUT09MIC0taWRlbnRpZnktc3RyaWN0IC0taWRlbnRpZnkgIiQxImAKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSBTRUNUSU9OX05BTUUgTElCTkFNRXMKKyMKKyMgVGhlIGlzIHRoZSBjb3JlIG9mIGEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYQorIyBwbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBleHRyYWN0IHRoZSBuYW1lIG9mIHRoZQorIyBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgaW1wb3J0IGxpYnJhcnkgTElCTkFNRS4KKyMKKyMgU0VDVElPTl9OQU1FIGlzIGVpdGhlciAuaWRhdGEkNiBvciAuaWRhdGEkNywgZGVwZW5kaW5nCisjIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY29tcGlsZXIgdGhhdCBjcmVhdGVkIHRoZSBpbXBsaWIuCisjCisjIEVjaG9zIHRoZSBuYW1lIG9mIHRoZSBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZQorIyBzcGVjaWZpZWQgaW1wb3J0IGxpYnJhcnkuCitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSAoKQoreworICAkb3B0X2RlYnVnCisgIG1hdGNoX2xpdGVyYWw9YCRFQ0hPICIkMSIgfCAkU0VEICIkc2VkX21ha2VfbGl0ZXJhbF9yZWdleCJgCisgICRPQkpEVU1QIC1zIC0tc2VjdGlvbiAiJDEiICIkMiIgMj4vZGV2L251bGwgfAorICAgICRTRUQgJy9eQ29udGVudHMgb2Ygc2VjdGlvbiAnIiRtYXRjaF9saXRlcmFsIic6L3sKKyAgICAgICMgUGxhY2UgbWFya2VyIGF0IGJlZ2lubmluZyBvZiBhcmNoaXZlIG1lbWJlciBkbGxuYW1lIHNlY3Rpb24KKyAgICAgIHMvLiovPT09PU1BUks9PT09LworICAgICAgcAorICAgICAgZAorICAgIH0KKyAgICAjIFRoZXNlIGxpbmVzIGNhbiBzb21ldGltZXMgYmUgbG9uZ2VyIHRoYW4gNDMgY2hhcmFjdGVycywgYnV0CisgICAgIyBhcmUgYWx3YXlzIHVuaW50ZXJlc3RpbmcKKyAgICAvOlsJIF0qZmlsZSBmb3JtYXQgcGVbaV1ceywxXH0tL2QKKyAgICAvXkluIGFyY2hpdmUgW146XSo6L2QKKyAgICAjIEVuc3VyZSBtYXJrZXIgaXMgcHJpbnRlZAorICAgIC9ePT09PU1BUks9PT09L3AKKyAgICAjIFJlbW92ZSBhbGwgbGluZXMgd2l0aCBsZXNzIHRoYW4gNDMgY2hhcmFjdGVycworICAgIC9eLlx7NDNcfS8hZAorICAgICMgRnJvbSByZW1haW5pbmcgbGluZXMsIHJlbW92ZSBmaXJzdCA0MyBjaGFyYWN0ZXJzCisgICAgcy9eLlx7NDNcfS8vJyB8CisgICAgJFNFRCAtbiAnCisgICAgICAjIEpvaW4gbWFya2VyIGFuZCBhbGwgbGluZXMgdW50aWwgbmV4dCBtYXJrZXIgaW50byBhIHNpbmdsZSBsaW5lCisgICAgICAvXj09PT1NQVJLPT09PS8gYiBwYXJhCisgICAgICBICisgICAgICAkIGIgcGFyYQorICAgICAgYgorICAgICAgOnBhcmEKKyAgICAgIHgKKyAgICAgIHMvXG4vL2cKKyAgICAgICMgUmVtb3ZlIHRoZSBtYXJrZXIKKyAgICAgIHMvXj09PT1NQVJLPT09PS8vCisgICAgICAjIFJlbW92ZSB0cmFpbGluZyBkb3RzIGFuZCB3aGl0ZXNwYWNlCisgICAgICBzL1tcLiBcdF0qJC8vCisgICAgICAjIFByaW50CisgICAgICAvLi9wJyB8CisgICAgIyB3ZSBub3cgaGF2ZSBhIGxpc3QsIG9uZSBlbnRyeSBwZXIgbGluZSwgb2YgdGhlIHN0cmluZ2lmaWVkCisgICAgIyBjb250ZW50cyBvZiB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbiBvZiBhbGwgbWVtYmVycyBvZiB0aGUKKyAgICAjIGFyY2hpdmUgd2hpY2ggcG9zc2VzcyB0aGF0IHNlY3Rpb24uIEhldXJpc3RpYzogZWxpbWluYXRlCisgICAgIyBhbGwgdGhvc2Ugd2hpY2ggaGF2ZSBhIGZpcnN0IG9yIHNlY29uZCBjaGFyYWN0ZXIgdGhhdCBpcworICAgICMgYSAnLicgKHRoYXQgaXMsIG9iamR1bXAncyByZXByZXNlbnRhdGlvbiBvZiBhbiB1bnByaW50YWJsZQorICAgICMgY2hhcmFjdGVyLikgVGhpcyBzaG91bGQgd29yayBmb3IgYWxsIGFyY2hpdmVzIHdpdGggbGVzcyB0aGFuCisgICAgIyAweDMwMmYgZXhwb3J0cyAtLSBidXQgd2lsbCBmYWlsIGZvciBETExzIHdob3NlIG5hbWUgYWN0dWFsbHkKKyAgICAjIGJlZ2lucyB3aXRoIGEgbGl0ZXJhbCAnLicgb3IgYSBzaW5nbGUgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5CisgICAgIyBhICcuJy4KKyAgICAjCisgICAgIyBPZiB0aG9zZSB0aGF0IHJlbWFpbiwgcHJpbnQgdGhlIGZpcnN0IG9uZS4KKyAgICAkU0VEIC1lICcvXlwuL2Q7L14uXC4vZDtxJworfQorCisjIGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3AgQVJHCisjIFRoaXMgcHJlZGljYXRlIHJldHVybnMgd2l0aCB6ZXJvIHN0YXR1cyAoVFJVRSkgaWYKKyMgQVJHIGlzIGEgR05VL2JpbnV0aWxzLXN0eWxlIGltcG9ydCBsaWJyYXJ5LiBSZXR1cm5zCisjIHdpdGggbm9uemVybyBzdGF0dXMgKEZBTFNFKSBvdGhlcndpc2UuCitmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl9wICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b190b29sX2ZpbGUgIiQxIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICBmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl90bXA9YCROTSAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgfCBldmFsICIkZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRFR1JFUCAnIChfaGVhZF9bQS1aYS16MC05X10rX1thZF1sKnxbQS1aYS16MC05X10rX1thZF1sKl9pbmFtZSkkJ2AKKyAgdGVzdCAtbiAiJGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3RtcCIKK30KKworIyBmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3AgQVJHCisjIFRoaXMgcHJlZGljYXRlIHJldHVybnMgd2l0aCB6ZXJvIHN0YXR1cyAoVFJVRSkgaWYKKyMgQVJHIGlzIGFuIE1TLXN0eWxlIGltcG9ydCBsaWJyYXJ5LiBSZXR1cm5zCisjIHdpdGggbm9uemVybyBzdGF0dXMgKEZBTFNFKSBvdGhlcndpc2UuCitmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3AgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX3Rvb2xfZmlsZSAiJDEiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfdG1wPWAkTk0gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiIHwgZXZhbCAiJGdsb2JhbF9zeW1ib2xfcGlwZSIgfCAkR1JFUCAnX05VTExfSU1QT1JUX0RFU0NSSVBUT1InYAorICB0ZXN0IC1uICIkZnVuY19jeWdtaW5nX21zX2ltcGxpYl90bXAiCit9CisKKyMgZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrIEFSRworIyBQbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBleHRyYWN0IHRoZQorIyBuYW1lIG9mIHRoZSBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyMgaW1wb3J0IGxpYnJhcnkgQVJHLgorIworIyBUaGlzIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGlzIGZvciB1c2Ugd2hlbiAkRExMVE9PTAorIyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAtLWlkZW50aWZ5LXN0cmljdCBvcHRpb24uCisjIEludm9rZWQgYnkgZXZhbCdpbmcgdGhlIGxpYnRvb2wgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gdGhlIHZhcmlhYmxlCisjICAgICRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrICgpCit7CisgICRvcHRfZGVidWcKKyAgaWYgZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfcCAiJDEiIDsgdGhlbgorICAgICMgYmludXRpbHMgaW1wb3J0IGxpYnJhcnkKKyAgICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrX2NvcmUgJy5pZGF0YSQ3JyAiJDEiYAorICBlbGlmIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfcCAiJDEiIDsgdGhlbgorICAgICMgbXMtZ2VuZXJhdGVkIGltcG9ydCBsaWJyYXJ5CisgICAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9YGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlICcuaWRhdGEkNicgIiQxImAKKyAgZWxzZQorICAgICMgdW5rbm93bgorICAgIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0PSIiCisgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCitmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAorICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKKyAgICBpZiB0ZXN0ICIkbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uIiA9IHllczsgdGhlbgorICAgICAgbG9ja2ZpbGU9JGZfZXhfYW5fYXJfb2xkbGliLmxvY2sKKyAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBmaQorICAgIGZ1bmNfc2hvd19ldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcIlwkZl9leF9hbl9hcl9vbGRsaWJcIikiIFwKKwkJICAgJ3N0YXQ9JD87IHJtIC1mICIkbG9ja2ZpbGUiOyBleGl0ICRzdGF0JworICAgIGlmIHRlc3QgIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iID0geWVzOyB0aGVuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgcm0gLWYgIiRsb2NrZmlsZSIKKyAgICBmaQorICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgIDoKKyAgICBlbHNlCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJvYmplY3QgbmFtZSBjb25mbGljdHMgaW4gYXJjaGl2ZTogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIKKyAgICBmaQorfQorCisKKyMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCitmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0CisgICAgbXlfb2xkbGlicz0kezErIiRAIn0KKyAgICBteV9vbGRvYmpzPSIiCisgICAgbXlfeGxpYj0iIgorICAgIG15X3hhYnM9IiIKKyAgICBteV94ZGlyPSIiCisKKyAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KKyAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKyAgICAgIGNhc2UgJG15X3hsaWIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OworCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OworICAgICAgZXNhYworICAgICAgZnVuY19iYXNlbmFtZSAiJG15X3hsaWIiCisgICAgICBteV94bGliPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICBteV94bGliX3U9JG15X3hsaWIKKyAgICAgIHdoaWxlIDo7IGRvCisgICAgICAgIGNhc2UgIiAkZXh0cmFjdGVkX2FyY2hpdmVzICIgaW4KKwkqIiAkbXlfeGxpYl91ICIqKQorCSAgZnVuY19hcml0aCAkZXh0cmFjdGVkX3NlcmlhbCArIDEKKwkgIGV4dHJhY3RlZF9zZXJpYWw9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICBteV94bGliX3U9bHQkZXh0cmFjdGVkX3NlcmlhbC0kbXlfeGxpYiA7OworCSopIGJyZWFrIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZXh0cmFjdGVkX2FyY2hpdmVzPSIkZXh0cmFjdGVkX2FyY2hpdmVzICRteV94bGliX3UiCisgICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliX3UiCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJG15X3hkaXIiCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotZGFyd2luKikKKwlmdW5jX3ZlcmJvc2UgIkV4dHJhY3RpbmcgJG15X3hhYnMiCisJIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCisJJG9wdF9kcnlfcnVuIHx8IHsKKwkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAorCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPworCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKKwkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKKwkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YGJhc2VuYW1lICIkZGFyd2luX2FyY2hpdmUiYAorCSAgZGFyd2luX2FyY2hlcz1gJExJUE8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsIHx8IHRydWVgCisJICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4KKwkgICAgZGFyd2luX2FyY2hlcz1gJEVDSE8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAorCSAgICBkYXJ3aW5fYXJjaD0KKwkgICAgZnVuY192ZXJib3NlICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKKwkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCisJICAgICAgZnVuY19ta2Rpcl9wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgICRMSVBPIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKKwkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKKwkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKKwkgICAgICAkUk0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKKwkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCisgICAgICAgICAgICAjIyBPa2F5IG5vdyB3ZSd2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKKwkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJFNFRCAtZSAiJGJhc2VuYW1lIiB8IHNvcnQgLXVgCisJICAgIGRhcndpbl9maWxlPQorCSAgICBkYXJ3aW5fZmlsZXM9CisJICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbworCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgc29ydCB8ICROTDJTUGAKKwkgICAgICAkTElQTyAtY3JlYXRlIC1vdXRwdXQgIiRkYXJ3aW5fZmlsZSIgJGRhcndpbl9maWxlcworCSAgICBkb25lICMgJGRhcndpbl9maWxlbGlzdAorCSAgICAkUk0gLXJmIHVuZmF0LSQkCisJICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgorCSAgZWxzZQorCSAgICBjZCAkZGFyd2luX29yaWdfZGlyCisJICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorCSAgZmkgIyAkZGFyd2luX2FyY2hlcworCX0gIyAhJG9wdF9kcnlfcnVuCisJOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorCTs7CisgICAgICBlc2FjCisgICAgICBteV9vbGRvYmpzPSIkbXlfb2xkb2JqcyAiYGZpbmQgJG15X3hkaXIgLW5hbWUgXCouJG9iamV4dCAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgc29ydCB8ICROTDJTUGAKKyAgICBkb25lCisKKyAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0PSIkbXlfb2xkb2JqcyIKK30KKworCisjIGZ1bmNfZW1pdF93cmFwcGVyIFthcmc9bm9dCisjCisjIEVtaXQgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndworIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCisjIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZXMKKyMgc2V0IHRoZXJlaW4uCisjCisjIEFSRyBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVIKKyMgdmFyaWFibGUgd2lsbCB0YWtlLiAgSWYgJ3llcycsIHRoZW4gdGhlIGVtaXR0ZWQgc2NyaXB0CisjIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBpcyBzdG9yZWQgaXMKKyMgdGhlICRvYmpkaXIgZGlyZWN0b3J5LiAgVGhpcyBpcyBhIGN5Z3dpbi9taW5ndy1zcGVjaWZpYworIyBiZWhhdmlvci4KK2Z1bmNfZW1pdF93cmFwcGVyICgpCit7CisJZnVuY19lbWl0X3dyYXBwZXJfYXJnMT0kezEtbm99CisKKwkkRUNITyAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKK2ZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KK2lmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgorICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKyAgZ2VuZXJhdGVkX2J5X2xpYnRvb2xfdmVyc2lvbj0nJG1hY3JvX3ZlcnNpb24nCisgIG5vdGluc3RfZGVwbGlicz0nJG5vdGluc3RfZGVwbGlicycKK2Vsc2UKKyAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJEVDSE8gYXJlIGFscmVhZHkgc2V0LgorICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgZmlsZT1cIlwkMFwiIgorCisgICAgcUVDSE89YCRFQ0hPICIkRUNITyIgfCAkU0VEICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAkRUNITyAiXAorCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisgICAgRUNITz1cIiRxRUNIT1wiCisgIGZpCisKKyMgVmVyeSBiYXNpYyBvcHRpb24gcGFyc2luZy4gVGhlc2Ugb3B0aW9ucyBhcmUgKGEpIHNwZWNpZmljIHRvCisjIHRoZSBsaWJ0b29sIHdyYXBwZXIsIChiKSBhcmUgaWRlbnRpY2FsIGJldHdlZW4gdGhlIHdyYXBwZXIKKyMgL3NjcmlwdC8gYW5kIHRoZSB3cmFwcGVyIC9leGVjdXRhYmxlLyB3aGljaCBpcyB1c2VkIG9ubHkgb24KKyMgd2luZG93cyBwbGF0Zm9ybXMsIGFuZCAoYykgYWxsIGJlZ2luIHdpdGggdGhlIHN0cmluZyAiLS1sdC0iCisjIChhcHBsaWNhdGlvbiBwcm9ncmFtcyBhcmUgdW5saWtlbHkgdG8gaGF2ZSBvcHRpb25zIHdoaWNoIG1hdGNoCisjIHRoaXMgcGF0dGVybikuCisjCisjIFRoZXJlIGFyZSBvbmx5IHR3byBzdXBwb3J0ZWQgb3B0aW9uczogLS1sdC1kZWJ1ZyBhbmQKKyMgLS1sdC1kdW1wLXNjcmlwdC4gVGhlcmUgaXMsIGRlbGliZXJhdGVseSwgbm8gLS1sdC1oZWxwLgorIworIyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhpcyBwYXJzaW5nIGZ1bmN0aW9uIHNob3VsZCBiZSB0aGUKKyMgc2NyaXB0J3MgJDAgdmFsdWUsIGZvbGxvd2VkIGJ5ICIkQCIuCitsdF9vcHRpb25fZGVidWc9CitmdW5jX3BhcnNlX2x0X29wdGlvbnMgKCkKK3sKKyAgbHRfc2NyaXB0X2FyZzA9XCQwCisgIHNoaWZ0CisgIGZvciBsdF9vcHQKKyAgZG8KKyAgICBjYXNlIFwiXCRsdF9vcHRcIiBpbgorICAgIC0tbHQtZGVidWcpIGx0X29wdGlvbl9kZWJ1Zz0xIDs7CisgICAgLS1sdC1kdW1wLXNjcmlwdCkKKyAgICAgICAgbHRfZHVtcF9EPVxgXCRFQ0hPIFwiWFwkbHRfc2NyaXB0X2FyZzBcIiB8ICRTRUQgLWUgJ3MvXlgvLycgLWUgJ3MlL1teL10qJCUlJ1xgCisgICAgICAgIHRlc3QgXCJYXCRsdF9kdW1wX0RcIiA9IFwiWFwkbHRfc2NyaXB0X2FyZzBcIiAmJiBsdF9kdW1wX0Q9LgorICAgICAgICBsdF9kdW1wX0Y9XGBcJEVDSE8gXCJYXCRsdF9zY3JpcHRfYXJnMFwiIHwgJFNFRCAtZSAncy9eWC8vJyAtZSAncyVeLiovJSUnXGAKKyAgICAgICAgY2F0IFwiXCRsdF9kdW1wX0QvXCRsdF9kdW1wX0ZcIgorICAgICAgICBleGl0IDAKKyAgICAgIDs7CisgICAgLS1sdC0qKQorICAgICAgICBcJEVDSE8gXCJVbnJlY29nbml6ZWQgLS1sdC0gb3B0aW9uOiAnXCRsdF9vcHQnXCIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIyBQcmludCB0aGUgZGVidWcgYmFubmVyIGltbWVkaWF0ZWx5OgorICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgIGVjaG8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBsaWJ0b29sIHdyYXBwZXIgKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OXCIgMT4mMgorICBmaQorfQorCisjIFVzZWQgd2hlbiAtLWx0LWRlYnVnLiBQcmludHMgaXRzIGFyZ3VtZW50cyB0byBzdGRvdXQKKyMgKHJlZGlyZWN0aW9uIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyKQorZnVuY19sdF9kdW1wX2FyZ3MgKCkKK3sKKyAgbHRfZHVtcF9hcmdzX049MTsKKyAgZm9yIGx0X2FyZworICBkbworICAgIFwkRUNITyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IG5ld2FyZ3ZbXCRsdF9kdW1wX2FyZ3NfTl06IFwkbHRfYXJnXCIKKyAgICBsdF9kdW1wX2FyZ3NfTj1cYGV4cHIgXCRsdF9kdW1wX2FyZ3NfTiArIDFcYAorICBkb25lCit9CisKKyMgQ29yZSBmdW5jdGlvbiBmb3IgbGF1bmNoaW5nIHRoZSB0YXJnZXQgYXBwbGljYXRpb24KK2Z1bmNfZXhlY19wcm9ncmFtX2NvcmUgKCkKK3sKKyIKKyAgY2FzZSAkaG9zdCBpbgorICAjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKyAgKi0qLW1pbmd3IHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKyAgICAkRUNITyAiXAorICAgICAgaWYgdGVzdCAtbiBcIlwkbHRfb3B0aW9uX2RlYnVnXCI7IHRoZW4KKyAgICAgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndlswXTogXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIDE+JjIKKyAgICAgICAgZnVuY19sdF9kdW1wX2FyZ3MgXCR7MStcIlwkQFwifSAxPiYyCisgICAgICBmaQorICAgICAgZXhlYyBcIlwkcHJvZ2RpclxcXFxcJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisgICAgOzsKKworICAqKQorICAgICRFQ0hPICJcCisgICAgICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgICAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2WzBdOiBcJHByb2dkaXIvXCRwcm9ncmFtXCIgMT4mMgorICAgICAgICBmdW5jX2x0X2R1bXBfYXJncyBcJHsxK1wiXCRAXCJ9IDE+JjIKKyAgICAgIGZpCisgICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKyAgICA7OworICBlc2FjCisgICRFQ0hPICJcCisgICAgICBcJEVDSE8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJCpcIiAxPiYyCisgICAgICBleGl0IDEKK30KKworIyBBIGZ1bmN0aW9uIHRvIGVuY2Fwc3VsYXRlIGxhdW5jaGluZyB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCisjIFN0cmlwcyBvcHRpb25zIGluIHRoZSAtLWx0LSogbmFtZXNwYWNlIGZyb20gXCRAIGFuZAorIyBsYXVuY2hlcyB0YXJnZXQgYXBwbGljYXRpb24gd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy4KK2Z1bmNfZXhlY19wcm9ncmFtICgpCit7CisgIGNhc2UgXCIgXCQqIFwiIGluCisgICpcXCAtLWx0LSopCisgICAgZm9yIGx0X3dyX2FyZworICAgIGRvCisgICAgICBjYXNlIFwkbHRfd3JfYXJnIGluCisgICAgICAtLWx0LSopIDs7CisgICAgICAqKSBzZXQgeCBcIlwkQFwiIFwiXCRsdF93cl9hcmdcIjsgc2hpZnQ7OworICAgICAgZXNhYworICAgICAgc2hpZnQKKyAgICBkb25lIDs7CisgIGVzYWMKKyAgZnVuY19leGVjX3Byb2dyYW1fY29yZSBcJHsxK1wiXCRAXCJ9Cit9CisKKyAgIyBQYXJzZSBvcHRpb25zCisgIGZ1bmNfcGFyc2VfbHRfb3B0aW9ucyBcIlwkMFwiIFwkezErXCJcJEBcIn0KKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRFQ0hPIFwiXCRmaWxlXCIgfCAkU0VEICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICRTRUQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbworICAgIGRlc3RkaXI9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlL1teL10qXCQlJSdcYAorCisgICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgorICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KKyAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgorICAgICAgW1xcXFwvXSogfCBbQS1aYS16XTpbXFxcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7CisgICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7CisgICAgICBlc2FjCisgICAgZmkKKworICAgIGZpbGU9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlXi4qLyUlJ1xgCisgICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICRTRUQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVXN1YWxseSAnbm8nLCBleGNlcHQgb24gY3lnd2luL21pbmd3IHdoZW4gZW1iZWRkZWQgaW50bworICAjIHRoZSBjd3JhcHBlci4KKyAgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVI9JGZ1bmNfZW1pdF93cmFwcGVyX2FyZzEKKyAgaWYgdGVzdCBcIlwkV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVJcIiA9IFwieWVzXCI7IHRoZW4KKyAgICAjIHNwZWNpYWwgY2FzZSBmb3IgJy4nCisgICAgaWYgdGVzdCBcIlwkdGhpc2RpclwiID0gXCIuXCI7IHRoZW4KKyAgICAgIHRoaXNkaXI9XGBwd2RcYAorICAgIGZpCisgICAgIyByZW1vdmUgLmxpYnMgZnJvbSB0aGlzZGlyCisgICAgY2FzZSBcIlwkdGhpc2RpclwiIGluCisgICAgKltcXFxcL10kb2JqZGlyICkgdGhpc2Rpcj1cYFwkRUNITyBcIlwkdGhpc2RpclwiIHwgJFNFRCAncyVbXFxcXC9dW15cXFxcL10qJCUlJ1xgIDs7CisgICAgJG9iamRpciApICAgdGhpc2Rpcj0uIDs7CisgICAgZXNhYworICBmaQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKyIKKworCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAkRUNITyAiXAorICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0CisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisKKyAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8CisgICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKKyAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgorCisgICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKKworICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCisgICAgICAkTUtESVIgXCJcJHByb2dkaXJcIgorICAgIGVsc2UKKyAgICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICAgIGZpIgorCisJICAkRUNITyAiXAorCisgICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKKyAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCisgICAgICBpZiByZWxpbmtfY29tbWFuZF9vdXRwdXQ9XGBldmFsIFwkcmVsaW5rX2NvbW1hbmQgMj4mMVxgOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkRUNITyBcIlwkcmVsaW5rX2NvbW1hbmRfb3V0cHV0XCIgPiYyCisJJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisJZXhpdCAxCisgICAgICBmaQorICAgIGZpCisKKyAgICAkTVYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKKyAgICB7ICRSTSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKKyAgICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQorICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICBmaSIKKwllbHNlCisJICAkRUNITyAiXAorICBwcm9ncmFtPSckb3V0cHV0bmFtZScKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyIKKwlmaQorCisJJEVDSE8gIlwKKworICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgorCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwkjCisJIyBGaXggdGhlIERMTCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uICBEbyB0aGlzIGJlZm9yZSBwcmVwZW5kaW5nCisJIyB0byBzaGxpYnBhdGgsIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCBhcmUgUEFUSCBhbmQgdW5pbnN0YWxsZWQKKwkjIGxpYnJhcmllcyBtdXN0IGNvbWUgZmlyc3QuCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICisgICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKKyIKKwlmaQorCisJIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisJaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorCSAgJEVDSE8gIlwKKyAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgorICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKKworICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgorICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCisgICAgJHNobGlicGF0aF92YXI9XGBcJEVDSE8gXCJcJCRzaGxpYnBhdGhfdmFyXCIgfCAkU0VEICdzLzo6KlwkLy8nXGAKKworICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgorIgorCWZpCisKKwkkRUNITyAiXAorICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCisgICAgICBmdW5jX2V4ZWNfcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJEVDSE8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCisgICAgXCRFQ0hPIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCisgICAgXCRFQ0hPIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpXAorIgorfQorCisKKyMgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworIyBlbWl0IHRoZSBzb3VyY2UgY29kZSBmb3IgYSB3cmFwcGVyIGV4ZWN1dGFibGUgb24gc3Rkb3V0CisjIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gZnVuY19tb2RlX2xpbmsgYmVjYXVzZQorIyBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlIHNldCB0aGVyZWluLgorZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyAoKQoreworCWNhdCA8PEVPRgorCisvKiAkY3dyYXBwZXJzb3VyY2UgLSB0ZW1wb3Jhcnkgd3JhcHBlciBleGVjdXRhYmxlIGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisgICBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisKKyAgIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorICAgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgorCisgICBUaGlzIHdyYXBwZXIgZXhlY3V0YWJsZSBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisgICBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisqLworRU9GCisJICAgIGNhdCA8PCJFT0YiCisjaWZkZWYgX01TQ19WRVIKKyMgZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxwcm9jZXNzLmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGlmZGVmIF9fQ1lHV0lOX18KKyMgIGluY2x1ZGUgPGlvLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisvKiBkZWNsYXJhdGlvbnMgb2Ygbm9uLUFOU0kgZnVuY3Rpb25zICovCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitpbnQgX3B1dGVudiAoY29uc3QgY2hhciAqKTsKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitjaGFyICpyZWFscGF0aCAoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50IHB1dGVudiAoY2hhciAqKTsKK2ludCBzZXRlbnYgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworIyBlbmRpZgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCisvKiBwb3J0YWJpbGl0eSBkZWZpbmVzLCBleGNsdWRpbmcgcGF0aCBoYW5kbGluZyBtYWNyb3MgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCisjIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorIyAgZGVmaW5lIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgaW50cHRyX3QgaW50CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBIQVZFX1NFVEVOVgorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQVRIX01BWCkKKyMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKKyMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgorI2Vsc2UKKyMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAorI2VuZGlmCisKKyNpZm5kZWYgU19JWE9USAorIyBkZWZpbmUgU19JWE9USCAwCisjZW5kaWYKKyNpZm5kZWYgU19JWEdSUAorIyBkZWZpbmUgU19JWEdSUCAwCisjZW5kaWYKKworLyogcGF0aCBoYW5kbGluZyBwb3J0YWJpbGl0eSBtYWNyb3MgKi8KKyNpZm5kZWYgRElSX1NFUEFSQVRPUgorIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCisgIGRlZmluZWQgKF9fT1MyX18pCisjIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKKyMgZW5kaWYKKyMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQorI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCisJKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCisjZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SKQorI2Vsc2UgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCisjZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworCisjaWZuZGVmIEZPUEVOX1dCCisjIGRlZmluZSBGT1BFTl9XQiAidyIKKyNlbmRpZgorI2lmbmRlZiBfT19CSU5BUlkKKyMgZGVmaW5lIF9PX0JJTkFSWSAwCisjZW5kaWYKKworI2RlZmluZSBYTUFMTE9DKHR5cGUsIG51bSkgICAgICAoKHR5cGUgKikgeG1hbGxvYyAoKG51bSkgKiBzaXplb2YodHlwZSkpKQorI2RlZmluZSBYRlJFRShzdGFsZSkgZG8geyBcCisgIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCit9IHdoaWxlICgwKQorCisjaWYgZGVmaW5lZChMVF9ERUJVR1dSQVBQRVIpCitzdGF0aWMgaW50IGx0X2RlYnVnID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGx0X2RlYnVnID0gMDsKKyNlbmRpZgorCitjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSAibGlidG9vbC13cmFwcGVyIjsgLyogaW4gY2FzZSB4c3RyZHVwIGZhaWxzICovCisKK3ZvaWQgKnhtYWxsb2MgKHNpemVfdCBudW0pOworY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKTsKK2NvbnN0IGNoYXIgKmJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7CitjaGFyICpmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpOworY2hhciAqY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKTsKK2ludCBtYWtlX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGNoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworY2hhciAqc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCk7Cit2b2lkIGx0X2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7CitzdGF0aWMgY29uc3QgY2hhciAqbm9ubnVsbCAoY29uc3QgY2hhciAqcyk7CitzdGF0aWMgY29uc3QgY2hhciAqbm9uZW1wdHkgKGNvbnN0IGNoYXIgKnMpOwordm9pZCBsdF9zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2NoYXIgKmx0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCk7Cit2b2lkIGx0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwordm9pZCBsdF91cGRhdGVfbGliX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2NoYXIgKipwcmVwYXJlX3NwYXduIChjaGFyICoqYXJndik7Cit2b2lkIGx0X2R1bXBfc2NyaXB0IChGSUxFICpmKTsKK0VPRgorCisJICAgIGNhdCA8PEVPRgordm9sYXRpbGUgY29uc3QgY2hhciAqIE1BR0lDX0VYRSA9ICIkbWFnaWNfZXhlIjsKK2NvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQVJOQU1FID0gIiRzaGxpYnBhdGhfdmFyIjsKK0VPRgorCisJICAgIGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiR0ZW1wX3JwYXRoIgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIiOworRU9GCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoICIkZGxsc2VhcmNocGF0aDoiCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICJQQVRIIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiOworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDwiRU9GIgorY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIFRBUkdFVF9QUk9HUkFNX05BTUUgPSAibHQtJG91dHB1dG5hbWUiOyAvKiBob3BlZnVsbHksIG5vIC5leGUgKi8KK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICIkb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGZpCisKKworCSAgICBjYXQgPDwiRU9GIgorCisjZGVmaW5lIExUV1JBUFBFUl9PUFRJT05fUFJFRklYICAgICAgICAgIi0tbHQtIgorCitzdGF0aWMgY29uc3QgY2hhciAqbHR3cmFwcGVyX29wdGlvbl9wcmVmaXggPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWDsKK3N0YXRpYyBjb25zdCBjaGFyICpkdW1wc2NyaXB0X29wdCAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkdW1wLXNjcmlwdCI7CitzdGF0aWMgY29uc3QgY2hhciAqZGVidWdfb3B0ICAgICAgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZGVidWciOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgKipuZXdhcmd6OworICBpbnQgIG5ld2FyZ2M7CisgIGNoYXIgKnRtcF9wYXRoc3BlYzsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX3BhdGg7CisgIGNoYXIgKmFjdHVhbF9jd3JhcHBlcl9uYW1lOworICBjaGFyICp0YXJnZXRfbmFtZTsKKyAgY2hhciAqbHRfYXJndl96ZXJvOworICBpbnRwdHJfdCBydmFsID0gMTI3OworCisgIGludCBpOworCisgIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKGJhc2VfbmFtZSAoYXJndlswXSkpOworICBuZXdhcmd6ID0gWE1BTExPQyAoY2hhciAqLCBhcmdjICsgMSk7CisKKyAgLyogdmVyeSBzaW1wbGUgYXJnIHBhcnNpbmc7IGRvbid0IHdhbnQgdG8gcmVseSBvbiBnZXRvcHQKKyAgICogYWxzbywgY29weSBhbGwgbm9uIGN3cmFwcGVyIG9wdGlvbnMgdG8gbmV3YXJneiwgZXhjZXB0CisgICAqIGFyZ3pbMF0sIHdoaWNoIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkKKyAgICovCisgIG5ld2FyZ2M9MDsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkdW1wc2NyaXB0X29wdCkgPT0gMCkKKwl7CitFT0YKKwkgICAgY2FzZSAiJGhvc3QiIGluCisJICAgICAgKm1pbmd3KiB8ICpjeWd3aW4qICkKKwkJIyBtYWtlIHN0ZG91dCB1c2UgInVuaXgiIGxpbmUgZW5kaW5ncworCQllY2hvICIgICAgICAgICAgc2V0bW9kZSgxLF9PX0JJTkFSWSk7IgorCQk7OworCSAgICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorCSAgbHRfZHVtcF9zY3JpcHQgKHN0ZG91dCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkZWJ1Z19vcHQpID09IDApCisJeworICAgICAgICAgIGx0X2RlYnVnID0gMTsKKyAgICAgICAgICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGhvd2V2ZXIsIGlmIHRoZXJlIGlzIGFuIG9wdGlvbiBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UsIGJ1dCBpdCBpcyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGtub3cgYWJvdXQgYW5kCisgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGRlYWx0IHdpdGgsIGFib3ZlIChpbmx1ZGluZyBkdW1wLXNjcmlwdCksIHRoZW4KKyAgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IuIE90aGVyd2lzZSwgdGFyZ2V0cyBtaWdodCBiZWdpbiB0byBiZWxpZXZlCisgICAgICAgICAgICAgdGhleSBhcmUgYWxsb3dlZCB0byB1c2Ugb3B0aW9ucyBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UuIFRoZSBmaXJzdCB0aW1lIGFueSB1c2VyIGNvbXBsYWlucyBhYm91dCB0aGlzLCB3ZSdsbAorICAgICAgICAgICAgIG5lZWQgdG8gbWFrZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCBhIGNvbmZpZ3VyZS10aW1lIG9wdGlvbgorICAgICAgICAgICAgIG9yIGEgY29uZmlndXJlLmFjLXNldHRhYmxlIHZhbHVlLgorICAgICAgICAgICAqLworICAgICAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAidW5yZWNvZ25pemVkICVzIG9wdGlvbjogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlIC4uLiAqLworICAgICAgbmV3YXJnelsrK25ld2FyZ2NdID0geHN0cmR1cCAoYXJndltpXSk7CisgICAgfQorICBuZXdhcmd6WysrbmV3YXJnY10gPSBOVUxMOworCitFT0YKKwkgICAgY2F0IDw8RU9GCisgIC8qIFRoZSBHTlUgYmFubmVyIG11c3QgYmUgdGhlIGZpcnN0IG5vbi1lcnJvciBkZWJ1ZyBtZXNzYWdlICovCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICJsaWJ0b29sIHdyYXBwZXIgKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OXG4iKTsKK0VPRgorCSAgICBjYXQgPDwiRU9GIgorICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIGFyZ3ZbMF06ICVzXG4iLCBhcmd2WzBdKTsKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBwcm9ncmFtX25hbWU6ICVzXG4iLCBwcm9ncmFtX25hbWUpOworCisgIHRtcF9wYXRoc3BlYyA9IGZpbmRfZXhlY3V0YWJsZSAoYXJndlswXSk7CisgIGlmICh0bXBfcGF0aHNwZWMgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiY291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIihtYWluKSBmb3VuZCBleGUgKGJlZm9yZSBzeW1saW5rIGNoYXNlKSBhdDogJXNcbiIsCisJCSAgdG1wX3BhdGhzcGVjKTsKKworICBhY3R1YWxfY3dyYXBwZXJfcGF0aCA9IGNoYXNlX3N5bWxpbmtzICh0bXBfcGF0aHNwZWMpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIihtYWluKSBmb3VuZCBleGUgKGFmdGVyIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0geHN0cmR1cCAoYmFzZV9uYW1lIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9wYXRoLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogd3JhcHBlciBuYW1lIHRyYW5zZm9ybXMgKi8KKyAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAoYWN0dWFsX2N3cmFwcGVyX25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIC8qIHRhcmdldF9uYW1lIHRyYW5zZm9ybXMgLS0gdXNlIGFjdHVhbCB0YXJnZXQgcHJvZ3JhbSBuYW1lOyBtaWdodCBoYXZlIGx0LSBwcmVmaXggKi8KKyAgdGFyZ2V0X25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKFRBUkdFVF9QUk9HUkFNX05BTUUpKTsKKyAgc3RyZW5kemFwICh0YXJnZXRfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAodGFyZ2V0X25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIHRhcmdldF9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihtYWluKSBsaWJ0b29sIHRhcmdldCBuYW1lOiAlc1xuIiwKKwkJICB0YXJnZXRfbmFtZSk7CitFT0YKKworCSAgICBjYXQgPDxFT0YKKyAgbmV3YXJnelswXSA9CisgICAgWE1BTExPQyAoY2hhciwgKHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpICsKKwkJICAgIHN0cmxlbiAoIiRvYmpkaXIiKSArIDEgKyBzdHJsZW4gKGFjdHVhbF9jd3JhcHBlcl9uYW1lKSArIDEpKTsKKyAgc3RyY3B5IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIHN0cmNhdCAobmV3YXJnelswXSwgIiRvYmpkaXIiKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiLyIpOworRU9GCisKKwkgICAgY2F0IDw8IkVPRiIKKyAgLyogc3RvcCBoZXJlLCBhbmQgY29weSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMgdHdpY2UgKi8KKyAgdG1wX3BhdGhzcGVjID0geHN0cmR1cCAobmV3YXJnelswXSk7CisKKyAgLyogZG8gTk9UIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSwgc28gdXNlIGFjdHVhbF9jd3JhcHBlcl9uYW1lICovCisgIHN0cmNhdCAobmV3YXJnelswXSwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIC8qIERPIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSBpZiBpdCBleGlzdHMsIHNvIHVzZSB0YXJnZXRfbmFtZSAqLworICBsdF9hcmd2X3plcm8gPSBsdF9leHRlbmRfc3RyICh0bXBfcGF0aHNwZWMsIHRhcmdldF9uYW1lLCAxKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisgIHRtcF9wYXRoc3BlYyA9IE5VTEw7CitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCSAgICBjYXQgPDwiRU9GIgorICB7CisgICAgY2hhciogcDsKKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIgKG5ld2FyZ3pbMF0sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICAgIHdoaWxlICgocCA9IHN0cmNociAobHRfYXJndl96ZXJvLCAnXFwnKSkgIT0gTlVMTCkKKyAgICAgIHsKKwkqcCA9ICcvJzsKKyAgICAgIH0KKyAgfQorRU9GCisJICAgIDs7CisJICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorICBYRlJFRSAodGFyZ2V0X25hbWUpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIGx0X3NldGVudiAoIkJJTl9TSCIsICJ4cGc0Iik7IC8qIGZvciBUcnU2NCAqLworICBsdF9zZXRlbnYgKCJEVUFMQ0FTRSIsICIxIik7ICAvKiBmb3IgTVNLIHNoICovCisgIC8qIFVwZGF0ZSB0aGUgRExMIHNlYXJjaHBhdGguICBFWEVfUEFUSF9WQUxVRSAoJGRsbHNlYXJjaHBhdGgpIG11c3QKKyAgICAgYmUgcHJlcGVuZGVkIGJlZm9yZSAodGhhdCBpcywgYXBwZWFyIGFmdGVyKSBMSUJfUEFUSF9WQUxVRSAoJHRlbXBfcnBhdGgpCisgICAgIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCAqX1ZBUk5BTUVzIGFyZSBQQVRIIGJ1dCB1bmluc3RhbGxlZAorICAgICBsaWJyYXJpZXMgbXVzdCBjb21lIGZpcnN0LiAqLworICBsdF91cGRhdGVfZXhlX3BhdGggKEVYRV9QQVRIX1ZBUk5BTUUsIEVYRV9QQVRIX1ZBTFVFKTsKKyAgbHRfdXBkYXRlX2xpYl9wYXRoIChMSUJfUEFUSF9WQVJOQU1FLCBMSUJfUEFUSF9WQUxVRSk7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBsdF9hcmd2X3plcm86ICVzXG4iLAorCQkgIG5vbm51bGwgKGx0X2FyZ3ZfemVybykpOworICBmb3IgKGkgPSAwOyBpIDwgbmV3YXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgbmV3YXJnelslZF06ICVzXG4iLAorCQkgICAgICBpLCBub25udWxsIChuZXdhcmd6W2ldKSk7CisgICAgfQorCitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCQljYXQgPDwiRU9GIgorICAvKiBleGVjdiBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgb24gbWluZ3cgYXMgZXhwZWN0ZWQgb24gdW5peCAqLworICBuZXdhcmd6ID0gcHJlcGFyZV9zcGF3biAobmV3YXJneik7CisgIHJ2YWwgPSBfc3Bhd252IChfUF9XQUlULCBsdF9hcmd2X3plcm8sIChjb25zdCBjaGFyICogY29uc3QgKikgbmV3YXJneik7CisgIGlmIChydmFsID09IC0xKQorICAgIHsKKyAgICAgIC8qIGZhaWxlZCB0byBzdGFydCBwcm9jZXNzICovCisgICAgICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgICAiKG1haW4pIGZhaWxlZCB0byBsYXVuY2ggdGFyZ2V0IFwiJXNcIjogJXNcbiIsCisJCSAgICAgIGx0X2FyZ3ZfemVybywgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworICAgICAgcmV0dXJuIDEyNzsKKyAgICB9CisgIHJldHVybiBydmFsOworRU9GCisJCTs7CisJICAgICAgKikKKwkJY2F0IDw8IkVPRiIKKyAgZXhlY3YgKGx0X2FyZ3ZfemVybywgbmV3YXJneik7CisgIHJldHVybiBydmFsOyAvKiA9MTI3LCBidXQgYXZvaWRzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nICovCitFT0YKKwkJOzsKKwkgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCit9CisKK3ZvaWQgKgoreG1hbGxvYyAoc2l6ZV90IG51bSkKK3sKKyAgdm9pZCAqcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKKyAgaWYgKCFwKQorICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJtZW1vcnkgZXhoYXVzdGVkIik7CisKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgoreHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwKKwkJCSAgc3RyaW5nKSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKgorYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpiYXNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIoY2hlY2tfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHBhdGgpKTsKKyAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChzdGF0IChwYXRoLCAmc3QpID49IDApCisgICAgICAmJiAoc3Quc3RfbW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK21ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgaW50IHJ2YWwgPSAwOworICBzdHJ1Y3Qgc3RhdCBzdDsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1ha2VfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHBhdGgpKTsKKyAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICB7CisgICAgICBydmFsID0gY2htb2QgKHBhdGgsIHN0LnN0X21vZGUgfCBTX0lYT1RIIHwgU19JWEdSUCB8IFNfSVhVU1IpOworICAgIH0KKyAgcmV0dXJuIHJ2YWw7Cit9CisKKy8qIFNlYXJjaGVzIGZvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSB3cmFwcGVyLiAgUmV0dXJucworICAgbmV3bHkgYWxsb2NhdGVkIGZ1bGwgcGF0aCBuYW1lIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZQorICAgRG9lcyBub3QgY2hhc2Ugc3ltbGlua3MsIGV2ZW4gb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGVtLgorKi8KK2NoYXIgKgorZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKQoreworICBpbnQgaGFzX3NsYXNoID0gMDsKKyAgY29uc3QgY2hhciAqcDsKKyAgY29uc3QgY2hhciAqcF9uZXh0OworICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KKyAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOworICBpbnQgdG1wX2xlbjsKKyAgY2hhciAqY29uY2F0X25hbWU7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihmaW5kX2V4ZWN1dGFibGUpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbmVtcHR5ICh3cmFwcGVyKSk7CisKKyAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBBYnNvbHV0ZSBwYXRoPyAqLworI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIHdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQorICAgIHsKKyAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7CisgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorCXJldHVybiBjb25jYXRfbmFtZTsKKyAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgeworI2VuZGlmCisgICAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAod3JhcHBlclswXSkpCisJeworCSAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKwkgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJICAgIHJldHVybiBjb25jYXRfbmFtZTsKKwkgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJfQorI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICAgIH0KKyNlbmRpZgorCisgIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCisgICAgaWYgKCpwID09ICcvJykKKyAgICAgIHsKKwloYXNfc2xhc2ggPSAxOworCWJyZWFrOworICAgICAgfQorICBpZiAoIWhhc19zbGFzaCkKKyAgICB7CisgICAgICAvKiBubyBzbGFzaGVzOyBzZWFyY2ggUEFUSCAqLworICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKKyAgICAgIGlmIChwYXRoICE9IE5VTEwpCisJeworCSAgZm9yIChwID0gcGF0aDsgKnA7IHAgPSBwX25leHQpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpxOworCSAgICAgIHNpemVfdCBwX2xlbjsKKwkgICAgICBmb3IgKHEgPSBwOyAqcTsgcSsrKQorCQlpZiAoSVNfUEFUSF9TRVBBUkFUT1IgKCpxKSkKKwkJICBicmVhazsKKwkgICAgICBwX2xlbiA9IHEgLSBwOworCSAgICAgIHBfbmV4dCA9ICgqcSA9PSAnXDAnID8gcSA6IHEgKyAxKTsKKwkgICAgICBpZiAocF9sZW4gPT0gMCkKKwkJeworCQkgIC8qIGVtcHR5IHBhdGg6IGN1cnJlbnQgZGlyZWN0b3J5ICovCisJCSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQorCQkgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgImdldGN3ZCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKKwkJICB0bXBfbGVuID0gc3RybGVuICh0bXApOworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisJCSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKKwkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisJCSAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkJcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJICAgIH0KKwl9CisgICAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLworICAgIH0KKyAgLyogUmVsYXRpdmUgcGF0aCB8IG5vdCBmb3VuZCBpbiBwYXRoOiBwcmVwZW5kIGN3ZCAqLworICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgImdldGN3ZCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworICB0bXBfbGVuID0gc3RybGVuICh0bXApOworICBjb25jYXRfbmFtZSA9IFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOworICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKyAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKworICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKgorY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKQoreworI2lmbmRlZiBTX0lTTE5LCisgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7CisjZWxzZQorICBjaGFyIGJ1ZltMVF9QQVRITUFYXTsKKyAgc3RydWN0IHN0YXQgczsKKyAgY2hhciAqdG1wX3BhdGhzcGVjID0geHN0cmR1cCAocGF0aHNwZWMpOworICBjaGFyICpwOworICBpbnQgaGFzX3N5bWxpbmtzID0gMDsKKyAgd2hpbGUgKHN0cmxlbiAodG1wX3BhdGhzcGVjKSAmJiAhaGFzX3N5bWxpbmtzKQorICAgIHsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICJjaGVja2luZyBwYXRoIGNvbXBvbmVudCBmb3Igc3ltbGlua3M6ICVzXG4iLAorCQkgICAgICB0bXBfcGF0aHNwZWMpOworICAgICAgaWYgKGxzdGF0ICh0bXBfcGF0aHNwZWMsICZzKSA9PSAwKQorCXsKKwkgIGlmIChTX0lTTE5LIChzLnN0X21vZGUpICE9IDApCisJICAgIHsKKwkgICAgICBoYXNfc3ltbGlua3MgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIHNlYXJjaCBiYWNrd2FyZHMgZm9yIGxhc3QgRElSX1NFUEFSQVRPUiAqLworCSAgcCA9IHRtcF9wYXRoc3BlYyArIHN0cmxlbiAodG1wX3BhdGhzcGVjKSAtIDE7CisJICB3aGlsZSAoKHAgPiB0bXBfcGF0aHNwZWMpICYmICghSVNfRElSX1NFUEFSQVRPUiAoKnApKSkKKwkgICAgcC0tOworCSAgaWYgKChwID09IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQorCSAgICB7CisJICAgICAgLyogbm8gbW9yZSBESVJfU0VQQVJBVE9SUyBsZWZ0ICovCisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICpwID0gJ1wwJzsKKwl9CisgICAgICBlbHNlCisJeworCSAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICJlcnJvciBhY2Nlc3NpbmcgZmlsZSBcIiVzXCI6ICVzIiwKKwkJICAgIHRtcF9wYXRoc3BlYywgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworCX0KKyAgICB9CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGlmICghaGFzX3N5bWxpbmtzKQorICAgIHsKKyAgICAgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7CisgICAgfQorCisgIHRtcF9wYXRoc3BlYyA9IHJlYWxwYXRoIChwYXRoc3BlYywgYnVmKTsKKyAgaWYgKHRtcF9wYXRoc3BlYyA9PSAwKQorICAgIHsKKyAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSJjb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKKyAgICB9CisgIHJldHVybiB4c3RyZHVwICh0bXBfcGF0aHNwZWMpOworI2VuZGlmCit9CisKK2NoYXIgKgorc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgc2l6ZV90IGxlbiwgcGF0bGVuOworCisgIGFzc2VydCAoc3RyICE9IE5VTEwpOworICBhc3NlcnQgKHBhdCAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIHBhdGxlbiA9IHN0cmxlbiAocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgICB7CisgICAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOworICAgICAgaWYgKHN0cmNtcCAoc3RyLCBwYXQpID09IDApCisJKnN0ciA9ICdcMCc7CisgICAgfQorICByZXR1cm4gc3RyOworfQorCit2b2lkCitsdF9kZWJ1Z3ByaW50ZiAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGlmIChsdF9kZWJ1ZykKKyAgICB7CisgICAgICAodm9pZCkgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6JWQ6ICIsIHByb2dyYW1fbmFtZSwgZmlsZSwgbGluZSk7CisgICAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICAgICh2b2lkKSB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOworICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsdF9lcnJvcl9jb3JlIChpbnQgZXhpdF9zdGF0dXMsIGNvbnN0IGNoYXIgKmZpbGUsCisJICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICptb2RlLAorCSAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczolczolZDogJXM6ICIsIHByb2dyYW1fbmFtZSwgZmlsZSwgbGluZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKKyAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCBmaWxlLCBsaW5lLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZCAoYXApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitub25udWxsIChjb25zdCBjaGFyICpzKQoreworICByZXR1cm4gcyA/IHMgOiAiKG51bGwpIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorbm9uZW1wdHkgKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiAocyAmJiAhKnMpID8gIihlbXB0eSkiIDogbm9ubnVsbCAocyk7Cit9CisKK3ZvaWQKK2x0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihsdF9zZXRlbnYpIHNldHRpbmcgJyVzJyB0byAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisgIHsKKyNpZmRlZiBIQVZFX1NFVEVOVgorICAgIC8qIGFsd2F5cyBtYWtlIGEgY29weSwgZm9yIGNvbnNpc3RlbmN5IHdpdGggIUhBVkVfU0VURU5WICovCisgICAgY2hhciAqc3RyID0geHN0cmR1cCAodmFsdWUpOworICAgIHNldGVudiAobmFtZSwgc3RyLCAxKTsKKyNlbHNlCisgICAgaW50IGxlbiA9IHN0cmxlbiAobmFtZSkgKyAxICsgc3RybGVuICh2YWx1ZSkgKyAxOworICAgIGNoYXIgKnN0ciA9IFhNQUxMT0MgKGNoYXIsIGxlbik7CisgICAgc3ByaW50ZiAoc3RyLCAiJXM9JXMiLCBuYW1lLCB2YWx1ZSk7CisgICAgaWYgKHB1dGVudiAoc3RyKSAhPSBFWElUX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgIFhGUkVFIChzdHIpOworICAgICAgfQorI2VuZGlmCisgIH0KK30KKworY2hhciAqCitsdF9leHRlbmRfc3RyIChjb25zdCBjaGFyICpvcmlnX3ZhbHVlLCBjb25zdCBjaGFyICphZGQsIGludCB0b19lbmQpCit7CisgIGNoYXIgKm5ld192YWx1ZTsKKyAgaWYgKG9yaWdfdmFsdWUgJiYgKm9yaWdfdmFsdWUpCisgICAgeworICAgICAgaW50IG9yaWdfdmFsdWVfbGVuID0gc3RybGVuIChvcmlnX3ZhbHVlKTsKKyAgICAgIGludCBhZGRfbGVuID0gc3RybGVuIChhZGQpOworICAgICAgbmV3X3ZhbHVlID0gWE1BTExPQyAoY2hhciwgYWRkX2xlbiArIG9yaWdfdmFsdWVfbGVuICsgMSk7CisgICAgICBpZiAodG9fZW5kKQorICAgICAgICB7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUsIG9yaWdfdmFsdWUpOworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlICsgb3JpZ192YWx1ZV9sZW4sIGFkZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlLCBhZGQpOworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlICsgYWRkX2xlbiwgb3JpZ192YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuZXdfdmFsdWUgPSB4c3RyZHVwIChhZGQpOworICAgIH0KKyAgcmV0dXJuIG5ld192YWx1ZTsKK30KKwordm9pZAorbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3VwZGF0ZV9leGVfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisKKyAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQorICAgIHsKKyAgICAgIGNoYXIgKm5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKKyAgICAgIC8qIHNvbWUgc3lzdGVtcyBjYW4ndCBjb3BlIHdpdGggYSAnOictdGVybWluYXRlZCBwYXRoICMnICovCisgICAgICBpbnQgbGVuID0gc3RybGVuIChuZXdfdmFsdWUpOworICAgICAgd2hpbGUgKCgobGVuID0gc3RybGVuIChuZXdfdmFsdWUpKSA+IDApICYmIElTX1BBVEhfU0VQQVJBVE9SIChuZXdfdmFsdWVbbGVuLTFdKSkKKyAgICAgICAgeworICAgICAgICAgIG5ld192YWx1ZVtsZW4tMV0gPSAnXDAnOworICAgICAgICB9CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQKK2x0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihsdF91cGRhdGVfbGliX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbm51bGwgKG5hbWUpLCBub25udWxsICh2YWx1ZSkpOworCisgIGlmIChuYW1lICYmICpuYW1lICYmIHZhbHVlICYmICp2YWx1ZSkKKyAgICB7CisgICAgICBjaGFyICpuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKK0VPRgorCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCQljYXQgPDwiRU9GIgorCisvKiBQcmVwYXJlcyBhbiBhcmd1bWVudCB2ZWN0b3IgYmVmb3JlIGNhbGxpbmcgc3Bhd24oKS4KKyAgIE5vdGUgdGhhdCBzcGF3bigpIGRvZXMgbm90IGJ5IGl0c2VsZiBjYWxsIHRoZSBjb21tYW5kIGludGVycHJldGVyCisgICAgIChnZXRlbnYgKCJDT01TUEVDIikgIT0gTlVMTCA/IGdldGVudiAoIkNPTVNQRUMiKSA6CisgICAgICAoeyBPU1ZFUlNJT05JTkZPIHY7IHYuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihPU1ZFUlNJT05JTkZPKTsKKyAgICAgICAgIEdldFZlcnNpb25FeCgmdik7CisgICAgICAgICB2LmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQ7CisgICAgICB9KSA/ICJjbWQuZXhlIiA6ICJjb21tYW5kLmNvbSIpLgorICAgSW5zdGVhZCBpdCBzaW1wbHkgY29uY2F0ZW5hdGVzIHRoZSBhcmd1bWVudHMsIHNlcGFyYXRlZCBieSAnICcsIGFuZCBjYWxscworICAgQ3JlYXRlUHJvY2VzcygpLiAgV2UgbXVzdCBxdW90ZSB0aGUgYXJndW1lbnRzIHNpbmNlIFdpbjMyIENyZWF0ZVByb2Nlc3MoKQorICAgaW50ZXJwcmV0cyBjaGFyYWN0ZXJzIGxpa2UgJyAnLCAnXHQnLCAnXFwnLCAnIicgKGJ1dCBub3QgJzwnIGFuZCAnPicpIGluIGEKKyAgIHNwZWNpYWwgd2F5OgorICAgLSBTcGFjZSBhbmQgdGFiIGFyZSBpbnRlcnByZXRlZCBhcyBkZWxpbWl0ZXJzLiBUaGV5IGFyZSBub3QgdHJlYXRlZCBhcworICAgICBkZWxpbWl0ZXJzIGlmIHRoZXkgYXJlIHN1cnJvdW5kZWQgYnkgZG91YmxlIHF1b3RlczogIi4uLiIuCisgICAtIFVuZXNjYXBlZCBkb3VibGUgcXVvdGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGlucHV0LiBUaGVpciBvbmx5IGVmZmVjdCBpcworICAgICB0aGF0IHdpdGhpbiBkb3VibGUgcXVvdGVzLCBzcGFjZSBhbmQgdGFiIGFyZSB0cmVhdGVkIGxpa2Ugbm9ybWFsCisgICAgIGNoYXJhY3RlcnMuCisgICAtIEJhY2tzbGFzaGVzIG5vdCBmb2xsb3dlZCBieSBkb3VibGUgcXVvdGVzIGFyZSBub3Qgc3BlY2lhbC4KKyAgIC0gQnV0IDIqbisxIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlIGJlY29tZQorICAgICBuIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlIChuID49IDApOgorICAgICAgIFwiIC0+ICIKKyAgICAgICBcXFwiIC0+IFwiCisgICAgICAgXFxcXFwiIC0+IFxcIgorICovCisjZGVmaW5lIFNIRUxMX1NQRUNJQUxfQ0hBUlMgIlwiXFwgXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyIKKyNkZWZpbmUgU0hFTExfU1BBQ0VfQ0hBUlMgIiBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3IgorY2hhciAqKgorcHJlcGFyZV9zcGF3biAoY2hhciAqKmFyZ3YpCit7CisgIHNpemVfdCBhcmdjOworICBjaGFyICoqbmV3X2FyZ3Y7CisgIHNpemVfdCBpOworCisgIC8qIENvdW50IG51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKykKKyAgICA7CisKKyAgLyogQWxsb2NhdGUgbmV3IGFyZ3VtZW50IHZlY3Rvci4gICovCisgIG5ld19hcmd2ID0gWE1BTExPQyAoY2hhciAqLCBhcmdjICsgMSk7CisKKyAgLyogUHV0IHF1b3RlZCBhcmd1bWVudHMgaW50byB0aGUgbmV3IGFyZ3VtZW50IHZlY3Rvci4gICovCisgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqc3RyaW5nID0gYXJndltpXTsKKworICAgICAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKQorCW5ld19hcmd2W2ldID0geHN0cmR1cCAoIlwiXCIiKTsKKyAgICAgIGVsc2UgaWYgKHN0cnBicmsgKHN0cmluZywgU0hFTExfU1BFQ0lBTF9DSEFSUykgIT0gTlVMTCkKKwl7CisJICBpbnQgcXVvdGVfYXJvdW5kID0gKHN0cnBicmsgKHN0cmluZywgU0hFTExfU1BBQ0VfQ0hBUlMpICE9IE5VTEwpOworCSAgc2l6ZV90IGxlbmd0aDsKKwkgIHVuc2lnbmVkIGludCBiYWNrc2xhc2hlczsKKwkgIGNvbnN0IGNoYXIgKnM7CisJICBjaGFyICpxdW90ZWRfc3RyaW5nOworCSAgY2hhciAqcDsKKworCSAgbGVuZ3RoID0gMDsKKwkgIGJhY2tzbGFzaGVzID0gMDsKKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgIGxlbmd0aCsrOworCSAgZm9yIChzID0gc3RyaW5nOyAqcyAhPSAnXDAnOyBzKyspCisJICAgIHsKKwkgICAgICBjaGFyIGMgPSAqczsKKwkgICAgICBpZiAoYyA9PSAnIicpCisJCWxlbmd0aCArPSBiYWNrc2xhc2hlcyArIDE7CisJICAgICAgbGVuZ3RoKys7CisJICAgICAgaWYgKGMgPT0gJ1xcJykKKwkJYmFja3NsYXNoZXMrKzsKKwkgICAgICBlbHNlCisJCWJhY2tzbGFzaGVzID0gMDsKKwkgICAgfQorCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgbGVuZ3RoICs9IGJhY2tzbGFzaGVzICsgMTsKKworCSAgcXVvdGVkX3N0cmluZyA9IFhNQUxMT0MgKGNoYXIsIGxlbmd0aCArIDEpOworCisJICBwID0gcXVvdGVkX3N0cmluZzsKKwkgIGJhY2tzbGFzaGVzID0gMDsKKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgICpwKysgPSAnIic7CisJICBmb3IgKHMgPSBzdHJpbmc7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGNoYXIgYyA9ICpzOworCSAgICAgIGlmIChjID09ICciJykKKwkJeworCQkgIHVuc2lnbmVkIGludCBqOworCQkgIGZvciAoaiA9IGJhY2tzbGFzaGVzICsgMTsgaiA+IDA7IGotLSkKKwkJICAgICpwKysgPSAnXFwnOworCQl9CisJICAgICAgKnArKyA9IGM7CisJICAgICAgaWYgKGMgPT0gJ1xcJykKKwkJYmFja3NsYXNoZXMrKzsKKwkgICAgICBlbHNlCisJCWJhY2tzbGFzaGVzID0gMDsKKwkgICAgfQorCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBqOworCSAgICAgIGZvciAoaiA9IGJhY2tzbGFzaGVzOyBqID4gMDsgai0tKQorCQkqcCsrID0gJ1xcJzsKKwkgICAgICAqcCsrID0gJyInOworCSAgICB9CisJICAqcCA9ICdcMCc7CisKKwkgIG5ld19hcmd2W2ldID0gcXVvdGVkX3N0cmluZzsKKwl9CisgICAgICBlbHNlCisJbmV3X2FyZ3ZbaV0gPSAoY2hhciAqKSBzdHJpbmc7CisgICAgfQorICBuZXdfYXJndlthcmdjXSA9IE5VTEw7CisKKyAgcmV0dXJuIG5ld19hcmd2OworfQorRU9GCisJCTs7CisJICAgIGVzYWMKKworICAgICAgICAgICAgY2F0IDw8IkVPRiIKK3ZvaWQgbHRfZHVtcF9zY3JpcHQgKEZJTEUqIGYpCit7CitFT0YKKwkgICAgZnVuY19lbWl0X3dyYXBwZXIgeWVzIHwKKwkgICAgICAkU0VEIC1uIC1lICcKK3MvXlwoLlx7NzlcfVwpXCguLipcKS9cMVwKK1wyLworaAorcy9cKFtcXCJdXCkvXFxcMS9nCitzLyQvXFxuLworcy9cKFteXG5dKlwpLiovICBmcHV0cyAoIlwxIiwgZik7L3AKK2cKK0QnCisgICAgICAgICAgICBjYXQgPDwiRU9GIgorfQorRU9GCit9CisjIGVuZDogZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworCisjIGZ1bmNfd2luMzJfaW1wb3J0X2xpYl9wIEFSRworIyBUcnVlIGlmIEFSRyBpcyBhbiBpbXBvcnQgbGliLCBhcyBpbmRpY2F0ZWQgYnkgJGZpbGVfbWFnaWNfY21kCitmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBjYXNlIGBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkMVwiIDI+L2Rldi9udWxsIHwgJFNFRCAtZSAxMHFgIGluCisgICAgKmltcG9ydCopIDogOzsKKyAgICAqKSBmYWxzZSA7OworICAgIGVzYWMKK30KKworIyBmdW5jX21vZGVfbGluayBhcmcuLi4KK2Z1bmNfbW9kZV9saW5rICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgJGhvc3QgaW4KKyAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAorICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAorICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQorICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCisgICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubworCisgICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKKyAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90CisgICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQorICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCisgICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICBlc2FjCisgICAgbGlidG9vbF9hcmdzPSRub25vcHQKKyAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCisgICAgY29tcGlsZV9jb21tYW5kPSRub25vcHQKKyAgICBmaW5hbGl6ZV9jb21tYW5kPSRub25vcHQKKworICAgIGNvbXBpbGVfcnBhdGg9CisgICAgZmluYWxpemVfcnBhdGg9CisgICAgY29tcGlsZV9zaGxpYnBhdGg9CisgICAgZmluYWxpemVfc2hsaWJwYXRoPQorICAgIGNvbnZlbmllbmNlPQorICAgIG9sZF9jb252ZW5pZW5jZT0KKyAgICBkZXBsaWJzPQorICAgIG9sZF9kZXBsaWJzPQorICAgIGNvbXBpbGVyX2ZsYWdzPQorICAgIGxpbmtlcl9mbGFncz0KKyAgICBkbGxzZWFyY2hwYXRoPQorICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAorICAgIGluc3RfcHJlZml4X2Rpcj0KKyAgICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KKworICAgIGF2b2lkX3ZlcnNpb249bm8KKyAgICBiaW5kaXI9CisgICAgZGxmaWxlcz0KKyAgICBkbHByZWZpbGVzPQorICAgIGRsc2VsZj1ubworICAgIGV4cG9ydF9keW5hbWljPW5vCisgICAgZXhwb3J0X3N5bWJvbHM9CisgICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9CisgICAgZ2VuZXJhdGVkPQorICAgIGxpYm9ianM9CisgICAgbHRsaWJzPQorICAgIG1vZHVsZT1ubworICAgIG5vX2luc3RhbGw9bm8KKyAgICBvYmpzPQorICAgIG5vbl9waWNfb2JqZWN0cz0KKyAgICBwcmVjaW91c19maWxlc19yZWdleD0KKyAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KKyAgICBwcmVsb2FkPW5vCisgICAgcHJldj0KKyAgICBwcmV2YXJnPQorICAgIHJlbGVhc2U9CisgICAgcnBhdGg9CisgICAgeHJwYXRoPQorICAgIHBlcm1fcnBhdGg9CisgICAgdGVtcF9ycGF0aD0KKyAgICB0aHJlYWRfc2FmZT1ubworICAgIHZpbmZvPQorICAgIHZpbmZvX251bWJlcj1ubworICAgIHdlYWtfbGlicz0KKyAgICBzaW5nbGVfbW9kdWxlPSIke3dsfS1zaW5nbGVfbW9kdWxlIgorICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKKworICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLXNoYXJlZCkKKwl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCisJYnVpbGRfb2xkX2xpYnM9bm8KKwlicmVhaworCTs7CisgICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMgfCAtc3RhdGljLWxpYnRvb2wtbGlicykKKwljYXNlICRhcmcgaW4KKwktYWxsLXN0YXRpYykKKwkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIgorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCSAgOzsKKwktc3RhdGljKQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz1idWlsdAorCSAgOzsKKwktc3RhdGljLWxpYnRvb2wtbGlicykKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJICA7OworCWVzYWMKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwlicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKyAgICAgIHFhcmc9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0CisgICAgICBmdW5jX2FwcGVuZCBsaWJ0b29sX2FyZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisKKyAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJY2FzZSAkcHJldiBpbgorCW91dHB1dCkKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBPVVRQVVRAIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBPVVRQVVRAIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRwcmV2IGluCisJYmluZGlyKQorCSAgYmluZGlyPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWRsZmlsZXN8ZGxwcmVmaWxlcykKKwkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgcHJlbG9hZD15ZXMKKwkgIGZpCisJICBjYXNlICRhcmcgaW4KKwkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCisJICBmb3JjZSkKKwkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbHNlCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRhcmciCisJICAgIGVsc2UKKwkgICAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGFyZyIKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXhwc3ltcykKKwkgIGV4cG9ydF9zeW1ib2xzPSIkYXJnIgorCSAgdGVzdCAtZiAiJGFyZyIgXAorCSAgICB8fCBmdW5jX2ZhdGFsX2Vycm9yICJzeW1ib2wgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWV4cHN5bXNfcmVnZXgpCisJICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlmcmFtZXdvcmspCisJICBjYXNlICRob3N0IGluCisJICAgICotKi1kYXJ3aW4qKQorCSAgICAgIGNhc2UgIiRkZXBsaWJzICIgaW4KKwkJKiIgJHFhcmcubHRmcmFtZXdvcmsgIiopIDs7CisJCSopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkcWFyZy5sdGZyYW1ld29yayIgIyB0aGlzIGlzIGZpeGVkIGxhdGVyCisJCSAgIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICBlc2FjCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJaW5zdF9wcmVmaXgpCisJICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJb2JqZWN0bGlzdCkKKwkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCisJICAgIHNhdmVfYXJnPSRhcmcKKwkgICAgbW9yZWFyZ3M9CisJICAgIGZvciBmaWwgaW4gYGNhdCAiJHNhdmVfYXJnImAKKwkgICAgZG8KKyMJICAgICAgZnVuY19hcHBlbmQgbW9yZWFyZ3MgIiAkZmlsIgorCSAgICAgIGFyZz0kZmlsCisJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJICAgICAgaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkJcGljX29iamVjdD0KKwkJbm9uX3BpY19vYmplY3Q9CisKKwkJIyBSZWFkIHRoZSAubG8gZmlsZQorCQlmdW5jX3NvdXJjZSAiJGFyZyIKKworCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmCisJCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJCWZpCisKKwkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCisKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCSAgICAgIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkcGljX29iamVjdCIKKwkJICAgICAgcHJldj0KKwkJICAgICAgY29udGludWUKKwkJICAgIGVsc2UKKwkJICAgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkJICAgICAgcHJldj1kbHByZWZpbGVzCisJCSAgICBmaQorCQkgIGZpCisKKwkJICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQorCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkJICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkJICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkcGljX29iamVjdCIKKwkJICAgIHByZXY9CisJCSAgZmkKKworCQkgICMgQSBQSUMgb2JqZWN0LgorCQkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkJICBhcmc9IiRwaWNfb2JqZWN0IgorCQlmaQorCisJCSMgTm9uLVBJQyBvYmplY3QuCisJCWlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJCSAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0CisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCQkgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJCSAgZmkKKwkJZWxzZQorCQkgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkJICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCisJCSAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkJZmkKKwkgICAgICBlbHNlCisJCSMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCQlpZiAkb3B0X2RyeV9ydW47IHRoZW4KKwkJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCQkgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJCSAgeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkJICBmdW5jX2xvMm8gIiRhcmciCisJCSAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkJICBub25fcGljX29iamVjdD0keGRpciRmdW5jX2xvMm9fcmVzdWx0CisJCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgICAgICAgIGVsc2UKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IgorCQlmaQorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAibGluayBpbnB1dCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICBmaQorCSAgYXJnPSRzYXZlX2FyZworCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXByZWNpb3VzX3JlZ2V4KQorCSAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcmVsZWFzZSkKKwkgIHJlbGVhc2U9Ii0kYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJwYXRoIHwgeHJwYXRoKQorCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJICBjYXNlICRhcmcgaW4KKwkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkgICopCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIgorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJHByZXYiID0gcnBhdGg7IHRoZW4KKwkgICAgY2FzZSAiJHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgcnBhdGggIiAkYXJnIiA7OworCSAgICBlc2FjCisJICBlbHNlCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkYXJnIiA7OworCSAgICBlc2FjCisJICBmaQorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXNocmV4dCkKKwkgIHNocmV4dF9jbWRzPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXdlYWspCisJICBmdW5jX2FwcGVuZCB3ZWFrX2xpYnMgIiAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhjY2xpbmtlcikKKwkgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIHByZXY9CisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhjb21waWxlcikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4bGlua2VyKQorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICR3bCRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICR3bCRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR3bCRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJKikKKwkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwllc2FjCisgICAgICBmaSAjIHRlc3QgLW4gIiRwcmV2IgorCisgICAgICBwcmV2YXJnPSIkYXJnIgorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1hbGwtc3RhdGljKQorCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgIyBTZWUgY29tbWVudCBmb3IgLXN0YXRpYyBmbGFnIGJlbG93LCBmb3IgbW9yZSBkZXRhaWxzLgorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1hbGxvdy11bmRlZmluZWQpCisJIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgorCWZ1bmNfZmF0YWxfZXJyb3IgIlxgLWFsbG93LXVuZGVmaW5lZCcgbXVzdCBub3QgYmUgdXNlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IgorCTs7CisKKyAgICAgIC1hdm9pZC12ZXJzaW9uKQorCWF2b2lkX3ZlcnNpb249eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtYmluZGlyKQorCXByZXY9YmluZGlyCisJY29udGludWUKKwk7OworCisgICAgICAtZGxvcGVuKQorCXByZXY9ZGxmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRscHJlb3BlbikKKwlwcmV2PWRscHJlZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtZHluYW1pYykKKwlleHBvcnRfZHluYW1pYz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIm1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCisJZmkKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KKwkgIHByZXY9ZXhwc3ltcworCWVsc2UKKwkgIHByZXY9ZXhwc3ltc19yZWdleAorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAtZnJhbWV3b3JrKQorCXByZXY9ZnJhbWV3b3JrCisJY29udGludWUKKwk7OworCisgICAgICAtaW5zdC1wcmVmaXgtZGlyKQorCXByZXY9aW5zdF9wcmVmaXgKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgVGhlIG5hdGl2ZSBJUklYIGxpbmtlciB1bmRlcnN0YW5kcyAtTEFORzoqLCAtTElTVDoqIGFuZCAtTE5POioKKyAgICAgICMgc28sIGlmIHdlIHNlZSB0aGVzZSBmbGFncyBiZSBjYXJlZnVsIG5vdCB0byB0cmVhdCB0aGVtIGxpa2UgLUwKKyAgICAgIC1MW0EtWl1bQS1aXSo6KikKKwljYXNlICR3aXRoX2djYy8kaG9zdCBpbgorCW5vLyotKi1pcml4KiB8IC8qLSotaXJpeCopCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1MKikKKwlmdW5jX3N0cmlwbmFtZSAiLUwiICcnICIkYXJnIgorCWlmIHRlc3QgLXogIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiOyB0aGVuCisJICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAicmVxdWlyZSBubyBzcGFjZSBiZXR3ZWVuIFxgLUwnIGFuZCBcYCQxJyIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAibmVlZCBwYXRoIGZvciBcYC1MJyBvcHRpb24iCisJICBmaQorCWZpCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJZGlyPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJKikKKwkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkgIHRlc3QgLXogIiRhYnNkaXIiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIgorCSAgZGlyPSIkYWJzZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAiJGRlcGxpYnMgIiBpbgorCSoiIC1MJGRpciAiKiB8ICoiICRhcmcgIiopCisJICAjIFdpbGwgb25seSBoYXBwZW4gZm9yIGFic29sdXRlIG9yIHN5c3Jvb3QgYXJndW1lbnRzCisJICA7OworCSopCisJICAjIFByZXNlcnZlIHN5c3Jvb3QsIGJ1dCBuZXZlciBpbmNsdWRlIHJlbGF0aXZlIGRpcmVjdG9yaWVzCisJICBjYXNlICRkaXIgaW4KKwkgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qIHwgPSopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIiA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBkZXBsaWJzICIgLUwkZGlyIiA7OworCSAgZXNhYworCSAgZnVuY19hcHBlbmQgbGliX3NlYXJjaF9wYXRoICIgJGRpciIKKwkgIDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJEVDSE8gIiRkaXIiIHwgJFNFRCAncyovbGliJCovYmluKidgCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRkaXI6IiopIDs7CisJICA6OikgZGxsc2VhcmNocGF0aD0kZGlyOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JHRlc3RiaW5kaXI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiR0ZXN0YmluZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1sKikKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKiB8ICotKi1oYWlrdSopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBvciBtYXRoIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3MyKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGFuZCBtYXRoIGxpYnJhcmllcyBhcmUgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZnVuY19hcHBlbmQgZGVwbGlicyAiIFN5c3RlbS5sdGZyYW1ld29yayIKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQorCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCWVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KKwkgY2FzZSAkaG9zdCBpbgorCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAjIERvIG5vdCBpbmNsdWRlIGxpYmNfciBkaXJlY3RseSwgdXNlIC1wdGhyZWFkIGZsYWcuCisJICAgY29udGludWUKKwkgICA7OworCSBlc2FjCisJZmkKKwlmdW5jX2FwcGVuZCBkZXBsaWJzICIgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJbW9kdWxlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKworICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgIyBEYXJ3aW4gdXNlcyB0aGUgLWFyY2ggZmxhZyB0byBkZXRlcm1pbmUgb3V0cHV0IGFyY2hpdGVjdHVyZS4KKyAgICAgIC1tb2RlbHwtYXJjaHwtaXN5c3Jvb3R8LS1zeXNyb290KQorCWZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlIFwKKyAgICAgIHwtdGhyZWFkc3wtZm9wZW5tcHwtb3Blbm1wfC1tcHwteG9wZW5tcHwtb21wfC1xc21wPSopCisJZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGFyZyIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbXVsdGlfbW9kdWxlKQorCXNpbmdsZV9tb2R1bGU9IiR7d2x9LW11bHRpX21vZHVsZSIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotZGFyd2luKiB8ICotY2VnY2MqKQorCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCisJICAjIGFuZCBEYXJ3aW4gaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgIGZ1bmNfd2FybmluZyAiXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiCisJICBmdW5jX3dhcm5pbmcgImFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtb2JqZWN0bGlzdCkKKwlwcmV2PW9iamVjdGxpc3QKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCisJcHJldj1wcmVjaW91c19yZWdleAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkYXJnIgorCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCT0qKQorCSAgZnVuY19zdHJpcG5hbWUgJz0nICcnICIkZGlyIgorCSAgZGlyPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCisJICA7OworCWVzYWMKKwljYXNlICIkeHJwYXRoICIgaW4KKwkqIiAkZGlyICIqKSA7OworCSopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNoYXJlZCkKKwkjIFRoZSBlZmZlY3RzIG9mIC1zaGFyZWQgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNocmV4dCkKKwlwcmV2PXNocmV4dAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLW51bWJlcikKKwlwcmV2PXZpbmZvCisJdmluZm9fbnVtYmVyPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXdlYWspCisgICAgICAgIHByZXY9d2VhaworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgZnVuY19hcHBlbmQgYXJnICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKKwlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCTs7CisKKyAgICAgIC1XbCwqKQorCWZ1bmNfc3RyaXBuYW1lICctV2wsJyAnJyAiJGFyZyIKKwlhcmdzPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlhcmc9CisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGFyZyAiICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YQ0NsaW5rZXIpCisJcHJldj14Y2NsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgLW1zZ18qIGZvciBvc2YgY2MKKyAgICAgIC1tc2dfKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICMgRmxhZ3MgdG8gYmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLCB3aXRoIHJhdGlvbmFsZToKKyAgICAgICMgLTY0LCAtbWlwc1swLTldICAgICAgZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC1yWzAtOV1bMC05XSogICAgICAgIHNwZWNpZnkgcHJvY2Vzc29yIGZvciB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC14YXJjaD0qLCAteHRhcmdldD0qIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIFN1biBjb21waWxlcgorICAgICAgIyArREEqLCArREQqICAgICAgICAgICBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBIUCBjb21waWxlcgorICAgICAgIyAtcSogICAgICAgICAgICAgICAgICBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCisgICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmbGFncyBmb3IgR0NDCisgICAgICAjIC1GL3BhdGggICAgICAgICAgICAgIHBhdGggdG8gdW5pbnN0YWxsZWQgZnJhbWV3b3JrcywgZ2NjIG9uIGRhcndpbgorICAgICAgIyAtcCwgLXBnLCAtLWNvdmVyYWdlLCAtZnByb2ZpbGUtKiAgcHJvZmlsaW5nIGZsYWdzIGZvciBHQ0MKKyAgICAgICMgQGZpbGUgICAgICAgICAgICAgICAgR0NDIHJlc3BvbnNlIGZpbGVzCisgICAgICAjIC10cD0qICAgICAgICAgICAgICAgIFBvcnRsYW5kIHBnY2MgdGFyZ2V0IHByb2Nlc3NvciBzZWxlY3Rpb24KKyAgICAgICMgLS1zeXNyb290PSogICAgICAgICAgZm9yIHN5c3Jvb3Qgc3VwcG9ydAorICAgICAgIyAtTyosIC1mbHRvKiwgLWZ3aG9wciosIC1mdXNlLWxpbmtlci1wbHVnaW4gR0NDIGxpbmstdGltZSBvcHRpbWl6YXRpb24KKyAgICAgIC02NHwtbWlwc1swLTldfC1yWzAtOV1bMC05XSp8LXhhcmNoPSp8LXh0YXJnZXQ9KnwrREEqfCtERCp8LXEqfC1tKnwgXAorICAgICAgLXRbNDVdKnwtdHhzY2FsZSp8LXB8LXBnfC0tY292ZXJhZ2V8LWZwcm9maWxlLSp8LUYqfEAqfC10cD0qfC0tc3lzcm9vdD0qfCBcCisgICAgICAtTyp8LWZsdG8qfC1md2hvcHIqfC1mdXNlLWxpbmtlci1wbHVnaW4pCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworCisgICAgICAqLiRvYmpleHQpCisJIyBBIHN0YW5kYXJkIG9iamVjdC4KKwlmdW5jX2FwcGVuZCBvYmpzICIgJGFyZyIKKwk7OworCisgICAgICAqLmxvKQorCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgorCWlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRhcmciOyB0aGVuCisJICBwaWNfb2JqZWN0PQorCSAgbm9uX3BpY19vYmplY3Q9CisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICIkYXJnIgorCisJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYKKwkgICAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIgorCSAgZmkKKworCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCQlmdW5jX2FwcGVuZCBkbGZpbGVzICIgJHBpY19vYmplY3QiCisJCXByZXY9CisJCWNvbnRpbnVlCisJICAgICAgZWxzZQorCQkjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQlwcmV2PWRscHJlZmlsZXMKKwkgICAgICBmaQorCSAgICBmaQorCisJICAgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJICAgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRwaWNfb2JqZWN0IgorCSAgICAgIHByZXY9CisJICAgIGZpCisKKwkgICAgIyBBIFBJQyBvYmplY3QuCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWVsc2UKKwkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICAgIGZ1bmNfbG8ybyAiJGFyZyIKKwkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIG9sZF9kZXBsaWJzICIgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgICoubGEpCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgorCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRhcmciCisJaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisJICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIHByZXY9CisJZWxpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgorCSAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICBwcmV2PQorCWVsc2UKKwkgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCisgICAgICAqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworICAgICAgZXNhYyAjIGFyZworCisgICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCisJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICAgIGZpCisgICAgZG9uZSAjIGFyZ3VtZW50IHBhcnNpbmcgbG9vcAorCisgICAgdGVzdCAtbiAiJHByZXYiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKKworICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisgICAgZmkKKworICAgIG9sZGxpYnM9CisgICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQorICAgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisgICAgb3V0cHV0bmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCisKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKKyAgICAgIGV2YWwgc2hsaWJfc2VhcmNoX3BhdGg9XGBcJEVDSE8gXCJcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFNFRCBcJ3MvOi8gL2dcJ1xgCisgICAgZWxzZQorICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9CisgICAgZmkKKyAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKKyAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCisKKyAgICBmdW5jX2Rpcm5hbWUgIiRvdXRwdXQiICIvIiAiIgorICAgIG91dHB1dF9vYmpkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JG9iamRpciIKKyAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dF9vYmpkaXIvIgorICAgIHRvb2xfb3V0cHV0X29iamRpcj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgZnVuY19ta2Rpcl9wICIkb3V0cHV0X29iamRpciIKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIgorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCWNhc2UgIiRsaWJzICIgaW4KKwkqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYnMgIiAkZGVwbGliIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgorCisgICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcworICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQorICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM7IHRoZW4KKwlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KKwkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KKwkgICoiICRwcmVfcG9zdF9kZXAgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJHByZV9wb3N0X2RlcHMiIDs7CisJICBlc2FjCisJICBmdW5jX2FwcGVuZCBwcmVfcG9zdF9kZXBzICIgJHByZV9wb3N0X2RlcCIKKwlkb25lCisgICAgICBmaQorICAgICAgcHJlX3Bvc3RfZGVwcz0KKyAgICBmaQorCisgICAgZGVwbGlicz0KKyAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisgICAgbmV3bGliX3NlYXJjaF9wYXRoPQorICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIGxpYikKKwlwYXNzZXM9ImNvbnYgZGxwcmVvcGVuIGxpbmsiCisJZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCisJICBjYXNlICRmaWxlIGluCisJICAqLmxhKSA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9oZWxwICJsaWJyYXJpZXMgY2FuIFxgLWRsb3Blbicgb25seSBsaWJ0b29sIGxpYnJhcmllczogJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJZG9uZQorCTs7CisgICAgcHJvZykKKwljb21waWxlX2RlcGxpYnM9CisJZmluYWxpemVfZGVwbGlicz0KKwlhbGxkZXBsaWJzPW5vCisJbmV3ZGxmaWxlcz0KKwluZXdkbHByZWZpbGVzPQorCXBhc3Nlcz0iY29udiBzY2FuIGRsb3BlbiBkbHByZW9wZW4gbGluayIKKwk7OworICAgICopICBwYXNzZXM9ImNvbnYiCisJOzsKKyAgICBlc2FjCisKKyAgICBmb3IgcGFzcyBpbiAkcGFzc2VzOyBkbworICAgICAgIyBUaGUgcHJlb3BlbiBwYXNzIGluIGxpYiBtb2RlIHJldmVyc2VzICRkZXBsaWJzOyBwdXQgaXQgYmFjayBoZXJlCisgICAgICAjIHNvIHRoYXQgLUwgY29tZXMgYmVmb3JlIGxpYnMgdGhhdCBuZWVkIGl0IGZvciBpbnN0YW5jZS4uLgorICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayI7IHRoZW4KKwkjIyBGSVhNRTogRmluZCB0aGUgcGxhY2Ugd2hlcmUgdGhlIGxpc3QgaXMgcmVidWlsdCBpbiB0aGUgd3JvbmcKKwkjIyAgICAgICAgb3JkZXIsIGFuZCBmaXggaXQgdGhlcmUgcHJvcGVybHkKKyAgICAgICAgdG1wX2RlcGxpYnM9CisJZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgIHRtcF9kZXBsaWJzPSIkZGVwbGliICR0bXBfZGVwbGlicyIKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iOyB0aGVuCisJbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCWNhc2UgJHBhc3MgaW4KKwlkbG9wZW4pIGxpYnM9IiRkbGZpbGVzIiA7OworCWRscHJlb3BlbikgbGlicz0iJGRscHJlZmlsZXMiIDs7CisJbGluaykKKwkgIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSIKKwkgIHRlc3QgIlgkbGlua19hbGxfZGVwbGlicyIgIT0gWG5vICYmIGxpYnM9IiRsaWJzICRkZXBlbmRlbmN5X2xpYnMiCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixkbHByZW9wZW4iOyB0aGVuCisJIyBDb2xsZWN0IGFuZCBmb3J3YXJkIGRlcGxpYnMgb2YgcHJlb3BlbmVkIGxpYnRvb2wgbGlicworCWZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCisJICAjIElnbm9yZSBub24tbGlidG9vbC1saWJzCisJICBkZXBlbmRlbmN5X2xpYnM9CisJICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGxpYiIKKwkgIGNhc2UgJGxpYiBpbgorCSAgKi5sYSkJZnVuY19zb3VyY2UgIiRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiIDs7CisJICBlc2FjCisKKwkgICMgQ29sbGVjdCBwcmVvcGVuZWQgbGlidG9vbCBkZXBsaWJzLCBleGNlcHQgYW55IHRoaXMgbGlicmFyeQorCSAgIyBoYXMgZGVjbGFyZWQgYXMgd2VhayBsaWJzCisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisgICAgICAgICAgICBkZXBsaWJfYmFzZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKKwkgICAgY2FzZSAiICR3ZWFrX2xpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliX2Jhc2UgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZG9uZQorCWxpYnM9IiRkbHByZWZpbGVzIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgorCSMgQ29sbGVjdCBkbHByZW9wZW5lZCBsaWJyYXJpZXMKKwlzYXZlX2RlcGxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorCisgICAgICBmb3IgZGVwbGliIGluICRsaWJzOyBkbworCWxpYj0KKwlmb3VuZD1ubworCWNhc2UgJGRlcGxpYiBpbgorCS1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUgXAorICAgICAgICB8LXRocmVhZHN8LWZvcGVubXB8LW9wZW5tcHwtbXB8LXhvcGVubXB8LW9tcHwtcXNtcD0qKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRkZXBsaWIiCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCisJCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJCSAgICAqIiAkZGVwbGliICIqKSA7OworCQkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCS1sKikKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZzsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgIlxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiCisJICAgIGNvbnRpbnVlCisJICBmaQorCSAgZnVuY19zdHJpcG5hbWUgJy1sJyAnJyAiJGRlcGxpYiIKKwkgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCisJICBlbHNlCisJICAgIHNlYXJjaGRpcnM9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGgiCisJICBmaQorCSAgZm9yIHNlYXJjaGRpciBpbiAkc2VhcmNoZGlyczsgZG8KKwkgICAgZm9yIHNlYXJjaF9leHQgaW4gLmxhICRzdGRfc2hyZXh0IC5zbyAuYTsgZG8KKwkgICAgICAjIFNlYXJjaCB0aGUgbGlidG9vbCBsaWJyYXJ5CisJICAgICAgbGliPSIkc2VhcmNoZGlyL2xpYiR7bmFtZX0ke3NlYXJjaF9leHR9IgorCSAgICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJCWlmIHRlc3QgIiRzZWFyY2hfZXh0IiA9ICIubGEiOyB0aGVuCisJCSAgZm91bmQ9eWVzCisJCWVsc2UKKwkJICBmb3VuZD1ubworCQlmaQorCQlicmVhayAyCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZG9uZQorCSAgaWYgdGVzdCAiJGZvdW5kIiAhPSB5ZXM7IHRoZW4KKwkgICAgIyBkZXBsaWIgZG9lc24ndCBzZWVtIHRvIGJlIGEgbGlidG9vbCBsaWJyYXJ5CisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICBlbHNlICMgZGVwbGliIGlzIGEgbGlidG9vbCBsaWJyYXJ5CisJICAgICMgSWYgJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyAmJiAkZGVwbGliIGlzIGEgc3RkbGliLAorCSAgICAjIFdlIG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIHRoaW5ncyBoZXJlLCBhbmQgbm90IGxhdGVyLgorCSAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikKKwkJaWYgZnVuY19sYWxpYl9wICIkbGliIjsgdGhlbgorCQkgIGxpYnJhcnlfbmFtZXM9CisJCSAgb2xkX2xpYnJhcnk9CisJCSAgZnVuY19zb3VyY2UgIiRsaWIiCisJCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCQkgICAgbGw9IiRsIgorCQkgIGRvbmUKKwkJICBpZiB0ZXN0ICJYJGxsIiA9ICJYJG9sZF9saWJyYXJ5IiA7IHRoZW4gIyBvbmx5IHN0YXRpYyB2ZXJzaW9uIGF2YWlsYWJsZQorCQkgICAgZm91bmQ9bm8KKwkJICAgIGZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCisJCSAgICBsYWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQorCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCQkgICAgZWxzZQorCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCQkgICAgZmkKKwkJICAgIGNvbnRpbnVlCisJCSAgZmkKKwkJZmkKKwkJOzsKKwkgICAgICAqKSA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGZpCisJICA7OyAjIC1sCisJKi5sdGZyYW1ld29yaykKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiA7IHRoZW4KKwkJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkJICAgICoiICRkZXBsaWIgIiopIDs7CisJCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkZGVwbGliIiA7OworCQllc2FjCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJLUwqKQorCSAgY2FzZSAkbGlua21vZGUgaW4KKwkgIGxpYikKKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgdGVzdCAiJHBhc3MiID0gY29udiAmJiBjb250aW51ZQorCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKwkgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBjb250aW51ZQorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgICA7OworCSAgKikKKwkgICAgZnVuY193YXJuaW5nICJcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICBjb250aW51ZQorCSAgOzsgIyAtTAorCS1SKikKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwkgICAgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGRlcGxpYiIKKwkgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGRpcj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkZGlyIiA7OworCSAgICBlc2FjCisJICBmaQorCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgIGNvbnRpbnVlCisJICA7OworCSoubGEpCisJICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIKKwkgIGxpYj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJICA7OworCSouJGxpYmV4dCkKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICAjIExpbmtpbmcgY29udmVuaWVuY2UgbW9kdWxlcyBpbnRvIHNoYXJlZCBsaWJyYXJpZXMgaXMgYWxsb3dlZCwKKwkgICAgIyBidXQgbGlua2luZyBvdGhlciBzdGF0aWMgbGlicmFyaWVzIGlzIG5vbi1wb3J0YWJsZS4KKwkgICAgY2FzZSAiICRkbHByZWNvbnZlbmllbmNlbGlicyAiIGluCisJICAgICoiICRkZXBsaWIgIiopIDs7CisJICAgICopCisJICAgICAgdmFsaWRfYV9saWI9bm8KKwkgICAgICBjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCQltYXRjaF9wYXR0ZXJuKikKKwkJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAorCQkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkJICBpZiBldmFsICJcJEVDSE8gXCIkZGVwbGliXCIiIDI+L2Rldi9udWxsIHwgJFNFRCAxMHEgXAorCQkgICAgfCAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkgICAgdmFsaWRfYV9saWI9eWVzCisJCSAgZmkKKwkJOzsKKwkJcGFzc19hbGwpCisJCSAgdmFsaWRfYV9saWI9eWVzCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBUcnlpbmcgdG8gbGluayB3aXRoIHN0YXRpYyBsaWIgYXJjaGl2ZSAkZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKKwkJZWNobyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZSBoZXJlLiIKKwkgICAgICBlbHNlCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgorCQkkRUNITyAiKioqIHN0YXRpYyBsaWJyYXJ5ICRkZXBsaWIgaXMgbm90IHBvcnRhYmxlISIKKwkJZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIHByb2cpCisJICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIDs7ICMgKi4kbGliZXh0CisJKi5sbyB8ICouJG9iamV4dCkKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgIGVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuIHx8IHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcgc3RhdGljYWxseSwKKwkgICAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRlcGxpYiIKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICRkZXBsaWIiCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJJURFUExJQlMlKQorCSAgYWxsZGVwbGlicz15ZXMKKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMgIyBjYXNlICRkZXBsaWIKKworCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGxpYiIgXAorCSAgfHwgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCWxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9CisJIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKKwkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlcyBpbnN0YWxsZWQsIG9yIHNob3VsZG5vdGxpbmsKKwlpbnN0YWxsZWQ9eWVzCisJc2hvdWxkbm90bGluaz1ubworCWF2b2lkdGVtcHJwYXRoPQorCisKKwkjIFJlYWQgdGhlIC5sYSBmaWxlCisJZnVuY19zb3VyY2UgIiRsaWIiCisKKwkjIENvbnZlcnQgIi1mcmFtZXdvcmsgZm9vIiB0byAiZm9vLmx0ZnJhbWV3b3JrIgorCWlmIHRlc3QgLW4gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIjsgdGhlbgorCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICIkaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzLy1mcmFtZXdvcmsgXChbXiAkXSpcKS9cMS5sdGZyYW1ld29yay9nJ2AKKwkgIGZvciB0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIGluICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnczsgZG8KKwkgICAgY2FzZSAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJICAgICAgKiIgJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyI7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlkZXBlbmRlbmN5X2xpYnM9YCRFQ0hPICIgJGRlcGVuZGVuY3lfbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJICAgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iIHx8CisJICAgeyB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IH07IHRoZW4KKwkgIHRlc3QgLW4gIiRkbG9wZW4iICYmIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkZGxvcGVuIgorCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRkbHByZW9wZW4iCisJZmkKKworCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgorCSAgICBmaQorCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCisJICAgIGZ1bmNfYXBwZW5kIGNvbnZlbmllbmNlICIgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICBmdW5jX2FwcGVuZCBvbGRfY29udmVuaWVuY2UgIiAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIHRtcF9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCQljYXNlICIkdG1wX2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIKKwkgICAgZG9uZQorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IgorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGNvbnYKKworCisJIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorCWxpbmtsaWI9CisJaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJgorCSAgIHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQsbm8iOyB9OyB0aGVuCisJICBsaW5rbGliPSRvbGRfbGlicmFyeQorCWVsc2UKKwkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkgICAgbGlua2xpYj0iJGwiCisJICBkb25lCisJZmkKKwlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgorCSAgZWxzZQorCSAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGxpYiIKKwkgIGZpCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBkbG9wZW4KKworCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGxhZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNfbGFkaXI9IiRsYWRpciIgOzsKKwkqKQorCSAgYWJzX2xhZGlyPWBjZCAiJGxhZGlyIiAmJiBwd2RgCisJICBpZiB0ZXN0IC16ICIkYWJzX2xhZGlyIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkbGFkaXInIgorCSAgICBmdW5jX3dhcm5pbmcgInBhc3NpbmcgaXQgbGl0ZXJhbGx5IHRvIHRoZSBsaW5rZXIsIGFsdGhvdWdoIGl0IG1pZ2h0IGZhaWwiCisJICAgIGFic19sYWRpcj0iJGxhZGlyIgorCSAgZmkKKwkgIDs7CisJZXNhYworCWZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJbGFuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKwkjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KKwlpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCisJICBpZiB0ZXN0ICEgLWYgIiRsdF9zeXNyb290JGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIKKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgorCSAgZWxzZQorCSAgICBkaXI9IiRsdF9zeXNyb290JGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbHRfc3lzcm9vdCRsaWJkaXIiCisJICBmaQorCSAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gWHllcyAmJiBhdm9pZHRlbXBycGF0aD15ZXMKKwllbHNlCisJICBpZiB0ZXN0ICEgLWYgIiRsYWRpci8kb2JqZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCisJICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfcGF0aCAiICRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgorCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCisJICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfcGF0aCAiICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkbGFuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIiAmJiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGxpYnJhcmllcyBtYXkgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCisJICBmaQorCSAgY2FzZSAiJGhvc3QiIGluCisJICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgcGxhdGZvcm1zIHdpdGggUEUtRExMcy4KKwkgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICAgICAgIyBMaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyeSBpZiBib3RoCisJICAgICAgIyBzdGF0aWMgYW5kIHNoYXJlZCBhcmUgcHJlc2VudC4gIFRoZXJlZm9yZSwgZW5zdXJlIHdlIGV4dHJhY3QKKwkgICAgICAjIHN5bWJvbHMgZnJvbSB0aGUgaW1wb3J0IGxpYnJhcnkgaWYgYSBzaGFyZWQgbGlicmFyeSBpcyBwcmVzZW50CisJICAgICAgIyAob3RoZXJ3aXNlLCB0aGUgZGxvcGVuIG1vZHVsZSBuYW1lIHdpbGwgYmUgaW5jb3JyZWN0KS4gIFdlIGRvCisJICAgICAgIyB0aGlzIGJ5IHB1dHRpbmcgdGhlIGltcG9ydCBsaWJyYXJ5IG5hbWUgaW50byAkbmV3ZGxwcmVmaWxlcy4KKwkgICAgICAjIFdlIHJlY292ZXIgdGhlIGRsb3BlbiBtb2R1bGUgbmFtZSBieSAnc2F2aW5nJyB0aGUgbGEgZmlsZQorCSAgICAgICMgbmFtZSBpbiBhIHNwZWNpYWwgcHVycG9zZSB2YXJpYWJsZSwgYW5kIChsYXRlcikgZXh0cmFjdGluZyB0aGUKKwkgICAgICAjIGRsbmFtZSBmcm9tIHRoZSBsYSBmaWxlLgorCSAgICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgICBmdW5jX3RyX3NoICIkZGlyLyRsaW5rbGliIgorCSAgICAgICAgZXZhbCAibGliZmlsZV8kZnVuY190cl9zaF9yZXN1bHQ9XCRhYnNfbGFkaXIvXCRsYW5hbWUiCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kbGlua2xpYiIKKwkgICAgICBlbHNlCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgICAjIEtlZXAgYSBsaXN0IG9mIHByZW9wZW5lZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMgdG8gY2hlY2sKKwkgICAgICAgICMgdGhhdCB0aGV5IGFyZSBiZWluZyB1c2VkIGNvcnJlY3RseSBpbiB0aGUgbGluayBwYXNzLgorCSAgICAgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCSAgICAgICAgICBmdW5jX2FwcGVuZCBkbHByZWNvbnZlbmllbmNlbGlicyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgIGZpCisJICAgIDs7CisJICAgICogKQorCSAgICAgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scworCSAgICAgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgorCSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCisJICAgICAgICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJICAgICAgICAgIGZ1bmNfYXBwZW5kIGRscHJlY29udmVuaWVuY2VsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgICAgICBlbGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kZGxuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJZmkgIyAkcGFzcyA9IGRscHJlb3BlbgorCisJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICMgTGluayB0aGUgY29udmVuaWVuY2UgbGlicmFyeQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKKwkgIGVsaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiICMgdXNlZCBmb3IgcHJvZyxzY2FuIHBhc3MKKwkgIGZpCisJICBjb250aW51ZQorCWZpCisKKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nICYmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCisJICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkbGFkaXIiCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCisJICBsaW5rYWxsZGVwbGlicz1ubworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKKwkgIGZpCisKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICAgICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJCSA7OworCSAgICBlc2FjCisJICAgICMgTmVlZCB0byBsaW5rIGFnYWluc3QgYWxsIGRlcGVuZGVuY3lfbGlicz8KKwkgICAgaWYgdGVzdCAiJGxpbmthbGxkZXBsaWJzIiA9IHllczsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICAjIE5lZWQgdG8gaGFyZGNvZGUgc2hhcmVkIGxpYnJhcnkgcGF0aHMKKwkgICAgICAjIG9yL2FuZCBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcworCSAgICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIgorCSAgZG9uZSAjIGZvciBkZXBsaWIKKwkgIGNvbnRpbnVlCisJZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgICAgeyB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwKKwkgICAgICAgICB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzLCRpbnN0YWxsZWQiID0gImJ1aWx0LHllcyI7IH0gfHwKKwkgICAgICAgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgorCSAgICAjIFdlIG5lZWQgdG8gaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aAorCSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAteiAiJGF2b2lkdGVtcHJwYXRoIiA7IHRoZW4KKwkgICAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgICAgY2FzZSAiJHRlbXBfcnBhdGg6IiBpbgorCSAgICAgICoiJGFic2RpcjoiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0ZW1wX3JwYXRoICIkYWJzZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisKKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBjb21waWxlX3JwYXRoICIgJGFic2RpciIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KKworCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCisJICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAorCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCisJCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KKwkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCisJICAgIGNvbnRpbnVlCisJICBmaQorCWZpCisKKwlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisJdXNlX3N0YXRpY19saWJzPSRwcmVmZXJfc3RhdGljX2xpYnMKKwlpZiB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IGJ1aWx0ICYmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCisJICB1c2Vfc3RhdGljX2xpYnM9bm8KKwlmaQorCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgIHsgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqKQorCSAgICAgICMgTm8gcG9pbnQgaW4gcmVsaW5raW5nIERMTHMgYmVjYXVzZSBwYXRocyBhcmUgbm90IGVuY29kZWQKKwkgICAgICBmdW5jX2FwcGVuZCBub3RpbnN0X2RlcGxpYnMgIiAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPW5vCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgbm90aW5zdF9kZXBsaWJzICIgJGxpYiIKKwkgICAgICBuZWVkX3JlbGluaz15ZXMKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwkgICMgVGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5CisKKwkgICMgV2FybiBhYm91dCBwb3J0YWJpbGl0eSwgY2FuJ3QgbGluayBhZ2FpbnN0IC1tb2R1bGUncyBvbiBzb21lCisJICAjIHN5c3RlbXMgKGRhcndpbikuICBEb24ndCBibGVhdCBhYm91dCBkbG9wZW5lZCBtb2R1bGVzIHRob3VnaCEKKwkgIGRsb3Blbm1vZHVsZT0iIgorCSAgZm9yIGRscHJlbW9kdWxldGVzdCBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgaWYgdGVzdCAiWCRkbHByZW1vZHVsZXRlc3QiID0gIlgkbGliIjsgdGhlbgorCSAgICAgIGRsb3Blbm1vZHVsZT0iJGRscHJlbW9kdWxldGVzdCIKKwkgICAgICBicmVhaworCSAgICBmaQorCSAgZG9uZQorCSAgaWYgdGVzdCAteiAiJGRsb3Blbm1vZHVsZSIgJiYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwkgICAgZWNobworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgZXhlY3V0YWJsZSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZWxzZQorCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCisJICAgIGZpCisJICAgICRFQ0hPICIqKiogJGxpbmtsaWIgaXMgbm90IHBvcnRhYmxlISIKKwkgIGZpCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmCisJICAgICB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgorCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCisJICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKKwkgICAgIyBzZWFyY2ggcGF0aC4KKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfcnBhdGggIiAkYWJzZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCisJICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCisJICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCSAgICBzaGlmdAorCSAgICByZWFsbmFtZT0iJDEiCisJICAgIHNoaWZ0CisJICAgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCSAgICAjIHVzZSBkbG5hbWUgaWYgd2UgZ290IGl0LiBpdCdzIHBlcmZlY3RseSBnb29kLCBubz8KKwkgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICBzb25hbWU9IiRkbG5hbWUiCisJICAgIGVsaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgICAgICMgYmxlaCB3aW5kb3dzCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICpjeWd3aW4qIHwgbWluZ3cqIHwgKmNlZ2NjKikKKwkgICAgICAgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJCW1ham9yPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQl2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKwkgICAgZWxzZQorCSAgICAgIHNvbmFtZT0iJHJlYWxuYW1lIgorCSAgICBmaQorCisJICAgICMgTWFrZSBhIG5ldyBuYW1lIGZvciB0aGUgZXh0cmFjdF9leHBzeW1zX2NtZHMgdG8gdXNlCisJICAgIHNvcm9vdD0iJHNvbmFtZSIKKwkgICAgZnVuY19iYXNlbmFtZSAiJHNvcm9vdCIKKwkgICAgc29uYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGZ1bmNfc3RyaXBuYW1lICdsaWInICcuZGxsJyAiJHNvbmFtZSIKKwkgICAgbmV3bGliPWxpYmltcC0kZnVuY19zdHJpcG5hbWVfcmVzdWx0LmEKKworCSAgICAjIElmIHRoZSBsaWJyYXJ5IGhhcyBubyBleHBvcnQgbGlzdCwgdGhlbiBjcmVhdGUgb25lIG5vdworCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiI7IHRoZW4gOgorCSAgICBlbHNlCisJICAgICAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gXGAkc29uYW1lJyIKKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJGV4dHJhY3RfZXhwc3ltc19jbWRzIiAnZXhpdCAkPycKKwkgICAgZmkKKworCSAgICAjIENyZWF0ZSAkbmV3bGliCisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKKwkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgaW1wb3J0IGxpYnJhcnkgZm9yIFxgJHNvbmFtZSciCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIgJ2V4aXQgJD8nCisJICAgIGZpCisJICAgICMgbWFrZSBzdXJlIHRoZSBsaWJyYXJ5IHZhcmlhYmxlcyBhcmUgcG9pbnRpbmcgdG8gdGhlIG5ldyBsaWJyYXJ5CisJICAgIGRpcj0kb3V0cHV0X29iamRpcgorCSAgICBsaW5rbGliPSRuZXdsaWIKKwkgIGZpICMgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIgorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkJY2FzZSAkaG9zdCBpbgorCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCisJCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1kYXJ3aW4qICkKKwkJICAgICMgaWYgdGhlIGxpYiBpcyBhIChub24tZGxvcGVuZWQpIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QKKwkJICAgICMgbGluayBhZ2FpbnN0IGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBlYXJsaWVyIHdhcm5pbmdzCisJCSAgICBpZiAvdXNyL2Jpbi9maWxlIC1MICRhZGQgMj4gL2Rldi9udWxsIHwKKwkJCSAkR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCisJCSAgICAgIGlmIHRlc3QgIlgkZGxvcGVubW9kdWxlIiAhPSAiWCRsaWIiOyB0aGVuCisJCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCisJCQlpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgorCQkJICBlY2hvCisJCQkgIGVjaG8gIioqKiBBbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc3RhdGljIGFyY2hpdmUgYXZhaWxhYmxlIgorCQkJICBlY2hvICIqKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKKwkJCWVsc2UKKwkJCSAgYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJCWZpCisJCSAgICAgIGVsaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCQkJYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJICAgICAgZmkKKwkJICAgIGZpCisJCWVzYWMKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKKwkJZXNhYworCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIHJlbGluaykKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICAgIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJCWFkZF9kaXI9Ii1MJGFic2RpciIKKwkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQkgIGNhc2UgJGxpYmRpciBpbgorCQkgICAgW1xcL10qKQorCQkgICAgICBmdW5jX2FwcGVuZCBhZGRfZGlyICIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgICAgOzsKKwkJICBlc2FjCisJCWZpCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7CisJICAgIGVzYWMKKworCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCisJICAgICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJ1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgorCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBjb21waWxlX3NobGlicGF0aCAiJGFkZF9zaGxpYnBhdGg6IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmCisJCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmCisJCSB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkJY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkJKiI6JGxpYmRpcjoiKikgOzsKKwkJKikgZnVuY19hcHBlbmQgZmluYWxpemVfc2hsaWJwYXRoICIkbGliZGlyOiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJICAgIGFkZF9zaGxpYnBhdGg9CisJICAgIGFkZF9kaXI9CisJICAgIGFkZD0KKwkgICAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KKwkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXMgJiYKKwkgICAgICAgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSIgPSBubzsgdGhlbgorCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGxpYmRpcjoiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9zaGxpYnBhdGggIiRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgorCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgorCQlhZGQ9IiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkJYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJY2FzZSAkbGliZGlyIGluCisJCSAgW1xcL10qKQorCQkgICAgZnVuY19hcHBlbmQgYWRkX2RpciAiIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCisJCSAgICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZF9kaXIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZCAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgorCSAgICBmaQorCSAgZmkKKwllbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCisJICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKKwkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KKwkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCisJICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgY29tcGlsZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkZmluYWxpemVfZGVwbGlicyIKKwkgIGZpCisJZWxpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBOb3QgYSBzaGFyZWQgbGlicmFyeQorCSAgaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorCSAgICAjIFdlJ3JlIHRyeWluZyBsaW5rIGEgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBhIHN0YXRpYyBvbmUKKwkgICAgIyBidXQgdGhlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQuCisKKwkgICAgIyBKdXN0IHByaW50IGEgd2FybmluZyBhbmQgYWRkIHRoZSBsaWJyYXJ5IHRvIGRlcGVuZGVuY3lfbGlicyBzbworCSAgICAjIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBzdGF0aWMgbGlicmFyeS4KKwkgICAgZWNobworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCisJICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgZWNobyAiKioqIEJ1dCBhcyB5b3UgdHJ5IHRvIGJ1aWxkIGEgbW9kdWxlIGxpYnJhcnksIGxpYnRvb2wgd2lsbCBzdGlsbCBjcmVhdGUgIgorCSAgICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIgorCSAgICAgIGVjaG8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKKwkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCQllY2hvCisJCWVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCQllY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCQllY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJCWVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKKwkgICAgbGlua19zdGF0aWM9eWVzCisJICBmaQorCWZpICMgbGluayBzaGFyZWQvc3RhdGljIGxpYnJhcnk/CisKKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZGVwZW5kZW5jeV9saWJzIiAmJgorCSAgICAgeyB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwKKwkgICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkbGlua19zdGF0aWMiID0geWVzOyB9OyB0aGVuCisJICAgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicworCSAgICB0ZW1wX2RlcGxpYnM9CisJICAgIGZvciBsaWJkaXIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRsaWJkaXIgaW4KKwkgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRsaWJkaXIiCisJICAgICAgICAgICB0ZW1wX3hycGF0aD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KKwkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OworCQkgICAqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgZnVuY19hcHBlbmQgdGVtcF9kZXBsaWJzICIgJGxpYmRpciI7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCisJICBmaQorCisJICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkYWJzZGlyIgorCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5CisJICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGNhc2UgJGRlcGxpYiBpbgorICAgICAgICAgICAgICAtTCopIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisgICAgICAgICAgICAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiOzsKKyAgICAgICAgICAgICAgKikgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiIDs7CisgICAgICAgICAgICBlc2FjCisJICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0ICIqKQorICAgICAgICAgICAgICAgIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzZWFyY2ggcGF0aHMgb2YgYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzCisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBwYXRoPQorCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKKwkgICAgICAqLmxhKQorCSAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiCisJICAgICAgICBkZXBsaWI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSAgICAgICAgZnVuY19kaXJuYW1lICIkZGVwbGliIiAiIiAiLiIKKwkJZGlyPSRmdW5jX2Rpcm5hbWVfcmVzdWx0CisJCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCQljYXNlICRkaXIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNkaXI9IiRkaXIiIDs7CisJCSopCisJCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKKwkJICAgIGFic2Rpcj0iJGRpciIKKwkJICBmaQorCQkgIDs7CisJCWVzYWMKKwkJaWYgJEdSRVAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotZGFyd2luKikKKwkJICBkZXBkZXBsPQorCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCisJCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KKwkJICAgICAgZGVwZGVwbD0kdG1wCisJCSAgICBkb25lCisJCSAgICBpZiB0ZXN0IC1mICIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiIDsgdGhlbgorCQkgICAgICBkZXBkZXBsPSIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiCisJCSAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0x9IC1MICRkZXBkZXBsIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRkYXJ3aW5faW5zdGFsbF9uYW1lIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWAke09UT09MNjR9IC1MICRkZXBkZXBsICB8IGF3ayAne2lmIChOUiA9PSAyKSB7cHJpbnQgJDE7ZXhpdH19J2AKKyAgICAgICAgICAgICAgICAgICAgICBmaQorCQkgICAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICR7d2x9LWR5bGliX2ZpbGUgJHt3bH0ke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiIC1keWxpYl9maWxlICR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKKwkJICAgICAgcGF0aD0KKwkJICAgIGZpCisJCSAgZmkKKwkJICA7OworCQkqKQorCQkgIHBhdGg9Ii1MJGFic2Rpci8kb2JqZGlyIgorCQkgIDs7CisJCWVzYWMKKwkJZWxzZQorCQkgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCSAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJCSAgdGVzdCAiJGFic2RpciIgIT0gIiRsaWJkaXIiICYmIFwKKwkJICAgIGZ1bmNfd2FybmluZyAiXGAkZGVwbGliJyBzZWVtcyB0byBiZSBtb3ZlZCIKKworCQkgIHBhdGg9Ii1MJGFic2RpciIKKwkJZmkKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgY2FzZSAiICRkZXBsaWJzICIgaW4KKwkgICAgICAqIiAkcGF0aCAiKikgOzsKKwkgICAgICAqKSBkZXBsaWJzPSIkcGF0aCAkZGVwbGlicyIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgIGZpICMgbGlua19hbGxfZGVwbGlicyAhPSBubworCWZpICMgbGlua21vZGUgPSBsaWIKKyAgICAgIGRvbmUgIyBmb3IgZGVwbGliIGluICRsaWJzCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9ICJwcm9nIjsgdGhlbgorCSAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGNvbXBpbGVfZGVwbGlicyIKKwkgIGZpbmFsaXplX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkZmluYWxpemVfZGVwbGlicyIKKwllbHNlCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICJgJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlmaQorICAgICAgZmkKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCisJaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KKwkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgIGxpYl9zZWFyY2hfcGF0aD0KKwkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KKwkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGxpYl9zZWFyY2hfcGF0aCAiICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKwlmaQorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgdmFycz0iZGVwbGlicyIKKwllbHNlCisJICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKKwlmaQorCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbworCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgorCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCisJICBuZXdfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbworCSAgICAjIEZJWE1FOiBQZWRhbnRpY2FsbHksIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBzbworCSAgICAjICAgICAgICB0aGF0IHNvbWUgbmFzdHkgZGVwZW5kZW5jeSBsb29wIGlzbid0IGFjY2lkZW50YWxseQorCSAgICAjICAgICAgICBicm9rZW46CisJICAgICNuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiCisJICAgICMgUHJhZ21hdGljYWxseSwgdGhpcyBzZWVtcyB0byBjYXVzZSB2ZXJ5IGZldyBwcm9ibGVtcyBpbgorCSAgICAjIHByYWN0aWNlOgorCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgIC1SKikgOzsKKwkgICAgKikKKwkgICAgICAjIEFuZCBoZXJlIGlzIHRoZSByZWFzb246IHdoZW4gYSBsaWJyYXJ5IGFwcGVhcnMgbW9yZQorCSAgICAgICMgdGhhbiBvbmNlIGFzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY2Ugb2YgYSBsaWJyYXJ5LCBvcgorCSAgICAgICMgaXMgaW1wbGljaXRseSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UgYnkgdGhlCisJICAgICAgIyBjb21waWxlciwgaXQgaXMgY29uc2lkZXJlZCBzcGVjaWFsLCBhbmQgbXVsdGlwbGUKKwkgICAgICAjIG9jY3VycmVuY2VzIHRoZXJlb2YgYXJlIG5vdCByZW1vdmVkLiAgQ29tcGFyZSB0aGlzCisJICAgICAgIyB3aXRoIGhhdmluZyB0aGUgc2FtZSBsaWJyYXJ5IGJlaW5nIGxpc3RlZCBhcyBhCisJICAgICAgIyBkZXBlbmRlbmN5IG9mIG11bHRpcGxlIG90aGVyIGxpYnJhcmllczogaW4gdGhpcyBjYXNlLAorCSAgICAgICMgd2Uga25vdyAocGVkYW50aWNhbGx5LCB3ZSBhc3N1bWUpIHRoZSBsaWJyYXJ5IGRvZXMgbm90CisJICAgICAgIyBuZWVkIHRvIGJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSwgc28gd2Uga2VlcCBvbmx5IHRoZQorCSAgICAgICMgbGFzdCBjb3B5LiAgVGhpcyBpcyBub3QgYWx3YXlzIHJpZ2h0LCBidXQgaXQgaXMgcmFyZQorCSAgICAgICMgZW5vdWdoIHRoYXQgd2UgcmVxdWlyZSB1c2VycyB0aGF0IHJlYWxseSBtZWFuIHRvIHBsYXkKKwkgICAgICAjIHN1Y2ggdW5wb3J0YWJsZSBsaW5raW5nIHRyaWNrcyB0byBsaW5rIHRoZSBsaWJyYXJ5CisJICAgICAgIyB1c2luZyAtV2wsLWxuYW1lLCBzbyB0aGF0IGxpYnRvb2wgZG9lcyBub3QgY29uc2lkZXIgaXQKKwkgICAgICAjIGZvciBkdXBsaWNhdGUgcmVtb3ZhbC4KKwkgICAgICBjYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgICAgKikKKwkJY2FzZSAiICRuZXdfbGlicyAiIGluCisJCSoiICRkZXBsaWIgIiopIDs7CisJCSopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkJZXNhYworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJG5ld19saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKQorCSAgICAgIGNhc2UgIiAkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICAqKSBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIGV2YWwgJHZhcj1cIiR0bXBfbGlic1wiCisJZG9uZSAjIGZvciB2YXIKKyAgICAgIGZpCisgICAgICAjIExhc3Qgc3RlcDogcmVtb3ZlIHJ1bnRpbWUgbGlicyBmcm9tIGRlcGVuZGVuY3lfbGlicworICAgICAgIyAodGhleSBzdGF5IGluIGRlcGxpYnMpCisgICAgICB0bXBfbGlicz0KKyAgICAgIGZvciBpIGluICRkZXBlbmRlbmN5X2xpYnMgOyBkbworCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAiIGluCisJKiIgJGkgIiopCisJICBpPSIiCisJICA7OworCWVzYWMKKwlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRpIgorCWZpCisgICAgICBkb25lCisgICAgICBkZXBlbmRlbmN5X2xpYnM9JHRtcF9saWJzCisgICAgZG9uZSAjIGZvciBwYXNzCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKyAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisgICAgZmkKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgb2xkbGliKQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisgICAgICBmaQorCisgICAgICBjYXNlICIgJGRlcGxpYnMiIGluCisgICAgICAqXCAtbCogfCAqXCAtTCopCisJZnVuY193YXJuaW5nICJcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiA7OworICAgICAgZXNhYworCisgICAgICB0ZXN0IC1uICIkcnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisgICAgICBvbGRsaWJzPSIkb3V0cHV0IgorICAgICAgZnVuY19hcHBlbmQgb2JqcyAiJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRvdXRwdXRuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJOzsKKyAgICAgICopCisJdGVzdCAiJG1vZHVsZSIgPSBubyAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgImxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciCisKKwlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgorCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJZWxzZQorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbGlibmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIKKwllbHNlCisJICBlY2hvCisJICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbm9uLWxpYnRvb2wiCisJICAkRUNITyAiKioqIG9iamVjdHMgJG9ianMgaXMgbm90IHBvcnRhYmxlISIKKwkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkb2JqcyIKKwlmaQorICAgICAgZmkKKworICAgICAgdGVzdCAiJGRsc2VsZiIgIT0gbm8gJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIgorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBzaGlmdAorICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKKwlmdW5jX3dhcm5pbmcgImlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IgorCisgICAgICBpbnN0YWxsX2xpYmRpcj0iJDEiCisKKyAgICAgIG9sZGxpYnM9CisgICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCisJICAjIFNvbWUgY29tcGlsZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBhIGAuYWwnIGV4dGVuc2lvbiBzbworCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZXh0ZW5zaW9uIGFuCisJICAjIGFyY2hpdmUgbm9ybWFsbHkgd291bGQuCisJICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCisJICBidWlsZF9vbGRfbGlicz15ZXMKKwlmaQorCisJdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKworCXRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKyAgICAgIGVsc2UKKworCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCisJc2V0IGR1bW15ICR2aW5mbyAwIDAgMAorCXNoaWZ0CisJSUZTPSIkc2F2ZV9pZnMiCisKKwl0ZXN0IC1uICIkNyIgJiYgXAorCSAgZnVuY19mYXRhbF9oZWxwICJ0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciCisKKwkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcworCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCisJIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKKworCWNhc2UgJHZpbmZvX251bWJlciBpbgorCXllcykKKwkgIG51bWJlcl9tYWpvcj0iJDEiCisJICBudW1iZXJfbWlub3I9IiQyIgorCSAgbnVtYmVyX3JldmlzaW9uPSIkMyIKKwkgICMKKwkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0CisJICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgorCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKKwkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKKwkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCisJICAjCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgICMgY29ycmVjdCBsaW51eCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorCSAgZGFyd2lufGxpbnV4fG9zZnx3aW5kb3dzfG5vbmUpCisJICAgIGZ1bmNfYXJpdGggJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3IKKwkgICAgY3VycmVudD0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKKwkgICAgOzsKKwkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxxbnh8c3Vub3MpCisJICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBhZ2U9IjAiCisJICAgIDs7CisJICBpcml4fG5vbnN0b3B1eCkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBsdF9pcml4X2luY3JlbWVudD1ubworCSAgICA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJbm8pCisJICBjdXJyZW50PSIkMSIKKwkgIHJldmlzaW9uPSIkMiIKKwkgIGFnZT0iJDMiCisJICA7OworCWVzYWMKKworCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCisJY2FzZSAkY3VycmVudCBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiQ1VSUkVOVCBcYCRjdXJyZW50JyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcmV2aXNpb24gaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIlJFVklTSU9OIFxgJHJldmlzaW9uJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkYWdlIGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJBR0UgXGAkYWdlJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGFnZSIgLWd0ICIkY3VycmVudCI7IHRoZW4KKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCWZpCisKKwkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCisJbWFqb3I9CisJdmVyc3VmZml4PQorCXZlcnN0cmluZz0KKwljYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwlub25lKSA7OworCisJZGFyd2luKQorCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgorCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgKyAxCisJICBtaW5vcl9jdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgeGxjdmVyc3RyaW5nPSIke3dsfS1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudCAke3dsfS1jdXJyZW50X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudC4kcmV2aXNpb24iCisJICB2ZXJzdHJpbmc9Ii1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJG1pbm9yX2N1cnJlbnQgLWN1cnJlbnRfdmVyc2lvbiAkbWlub3JfY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJZnJlZWJzZC1hb3V0KQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7CisJICA7OworCisJZnJlZWJzZC1lbGYpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCisJICA7OworCisJaXJpeCB8IG5vbnN0b3B1eCkKKwkgIGlmIHRlc3QgIlgkbHRfaXJpeF9pbmNyZW1lbnQiID0gIlhubyI7IHRoZW4KKwkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIGVsc2UKKwkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UgKyAxCisJICBmaQorCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisKKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgICBub25zdG9wdXgpIHZlcnN0cmluZ19wcmVmaXg9bm9uc3RvcHV4IDs7CisJICAgICopICAgICAgICAgdmVyc3RyaW5nX3ByZWZpeD1zZ2kgOzsKKwkgIGVzYWMKKwkgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kcmV2aXNpb24KKwkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KKwkgICAgZnVuY19hcml0aCAkcmV2aXNpb24gLSAkbG9vcAorCSAgICBpZmFjZT0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgZnVuY19hcml0aCAkbG9vcCAtIDEKKwkgICAgbG9vcD0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKKwkgIGRvbmUKKworCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgorCSAgbWFqb3I9LiRtYWpvcgorCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgorCSAgOzsKKworCWxpbnV4KSAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJICBtYWpvcj0uJGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlvc2YpCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisJICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kYWdlCisJICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCisJICAgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkbG9vcAorCSAgICBpZmFjZT0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgZnVuY19hcml0aCAkbG9vcCAtIDEKKwkgICAgbG9vcD0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCisJICBkb25lCisKKwkgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KKwkgIGZ1bmNfYXBwZW5kIHZlcnN0cmluZyAiOiR7Y3VycmVudH0uMCIKKwkgIDs7CisKKwlxbngpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCisJICA7OworCisJc3Vub3MpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgorCSAgOzsKKworCXdpbmRvd3MpCisJICAjIFVzZSAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgb25lCisJICAjIGV4dGVuc2lvbiBvbiBET1MgOC4zIGZpbGVzeXN0ZW1zLgorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSItJG1ham9yIgorCSAgOzsKKworCSopCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIKKwkgIDs7CisJZXNhYworCisJIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KKwlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSAgbWFqb3I9CisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbikKKwkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCisJICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKKwkgICAgdmVyc3RyaW5nPQorCSAgICA7OworCSAgKikKKwkgICAgdmVyc3RyaW5nPSIwLjAiCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICAgIHZlcnN1ZmZpeD0KKwkgIGVsc2UKKwkgICAgdmVyc3VmZml4PSIuMC4wIgorCSAgZmkKKwlmaQorCisJIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCisJaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgIG1ham9yPQorCSAgdmVyc3VmZml4PQorCSAgdmVyc3RyaW5nPSIiCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KKwlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAidW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIKKwkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgZmkKKwllbHNlCisJICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKwlmaQorCisgICAgICBmaQorCisgICAgICBmdW5jX2dlbmVyYXRlX2Rsc3ltcyAiJGxpYm5hbWUiICIkbGlibmFtZSIgInllcyIKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkc3ltZmlsZW9iaiIKKyAgICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKyAgICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKKwkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KKwlyZW1vdmVsaXN0PQorCXRlbXByZW1vdmVsaXN0PWAkRUNITyAiJG91dHB1dF9vYmpkaXIvKiJgCisJZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbworCSAgY2FzZSAkcCBpbgorCSAgICAqLiRvYmpleHQgfCAqLmdjbm8pCisJICAgICAgIDs7CisJICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCisJICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgorCQkgaWYgJEVDSE8gIiRwIiB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKKwkJIHRoZW4KKwkJICAgY29udGludWUKKwkJIGZpCisJICAgICAgIGZpCisJICAgICAgIGZ1bmNfYXBwZW5kIHJlbW92ZWxpc3QgIiAkcCIKKwkgICAgICAgOzsKKwkgICAgKikgOzsKKwkgIGVzYWMKKwlkb25lCisJdGVzdCAtbiAiJHJlbW92ZWxpc3QiICYmIFwKKwkgIGZ1bmNfc2hvd19ldmFsICIke1JNfXIgXCRyZW1vdmVsaXN0IgorICAgICAgZmkKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgorCWZ1bmNfYXBwZW5kIG9sZGxpYnMgIiAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCisJIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgorCW9sZG9ianM9IiRvYmpzICJgJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIi9cLiR7bGliZXh0fSQvZDsgJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgICNmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworICAgICAgIwlsaWJfc2VhcmNoX3BhdGg9YCRFQ0hPICIkbGliX3NlYXJjaF9wYXRoICIgfCAkU0VEICJzJSAkcGF0aCAlICVnImAKKyAgICAgICMJZGVwbGlicz1gJEVDSE8gIiRkZXBsaWJzICIgfCAkU0VEICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgIwlkZXBlbmRlbmN5X2xpYnM9YCRFQ0hPICIkZGVwZW5kZW5jeV9saWJzICIgfCAkU0VEICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgI2RvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJdGVtcF94cnBhdGg9CisJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbworCSAgZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRsaWJkaXIiCisJICBmdW5jX2FwcGVuZCB0ZW1wX3hycGF0aCAiIC1SJGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdCIKKwkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgZXNhYworCWRvbmUKKwlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF94cnBhdGggJGRlcGVuZGVuY3lfbGlicyIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgZGxmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcyB0aGF0IHdvbid0IGJlIGRscHJlb3BlbmVkCisgICAgICBvbGRfZGxmaWxlcz0iJGRsZmlsZXMiCisgICAgICBkbGZpbGVzPQorICAgICAgZm9yIGxpYiBpbiAkb2xkX2RsZmlsZXM7IGRvCisJY2FzZSAiICRkbHByZWZpbGVzICRkbGZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcworICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbworCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqIHwgKi0qLWhhaWt1KikKKwkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICA7OworCSAgKi0qLW5ldGJzZCopCisJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICA7OworCSAgKikKKwkgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zIGlmIG5lY2Vzc2FyeS4KKwkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbmVlZF9sYyIgPSAieWVzIjsgdGhlbgorCSAgICAgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAtbGMiCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJZmkKKworCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KKwluYW1lX3NhdmU9JG5hbWUKKwlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKKwlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKKwl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4CisJbWFqb3Jfc2F2ZT0kbWFqb3IKKwkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluaworCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bworCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PworCXJlbGVhc2U9IiIKKwl2ZXJzdWZmaXg9IiIKKwltYWpvcj0iIgorCW5ld2RlcGxpYnM9CisJZHJvcHBlZGRlcHM9bm8KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCXBhc3NfYWxsKQorCSAgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCisJICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCisJICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCisJICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKKwkgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW9yLgorCSAgbmV3ZGVwbGlicz0kZGVwbGlicworCSAgOzsKKwl0ZXN0X2NvbXBpbGUpCisJICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cworCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKKwkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCisJICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KKwkgICRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QuYworCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKKwkgICRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QKKwkgIGlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRkZXBsaWJzOyB0aGVuCisJICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgY2FzZSAkaSBpbgorCSAgICAgIC1sKikKKwkJZnVuY19zdHJpcG5hbWUgLWwgJycgIiRpIgorCQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQkgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICoiICRpICIqKQorCQkgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgICAgaT0iIgorCQkgICAgOzsKKwkJICBlc2FjCisJCWZpCisJCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkJICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCAiXFwkRUNITyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcIiJgCisJCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKKwkJICBkZXBsaWJfbWF0Y2g9JDEKKwkJICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICBlY2hvCisJCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggSSBiZWxpZXZlIHlvdSBkbyBub3QgaGF2ZSIKKwkJICAgIGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIGl0IGZvciIKKwkJICAgIGVjaG8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICBmaQorCQlmaQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgIyBFcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlCisJICAgICMgdGhlIHNpdHVhdGlvbjogQ29tcGlsZSBhIHNlcGFyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgY2FzZSAkaSBpbgorCSAgICAgIC1sKikKKwkJZnVuY19zdHJpcG5hbWUgLWwgJycgIiRpIgorCQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAorCQlpZiAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaTsgdGhlbgorCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCSAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJICAgICoiICRpICIqKQorCQkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgICAgIGk9IiIKKwkJICAgICAgOzsKKwkJICAgIGVzYWMKKwkJICBmaQorCQkgIGlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkJICAgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQkgICAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAorCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKKwkJICAgIGRlcGxpYl9tYXRjaD0kMQorCQkgICAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgICBlbHNlCisJCSAgICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgICBlY2hvCisJCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKKwkJICAgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQkgICAgICBlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKKwkJICAgICAgZWNobyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgICAgZmkKKwkJICBmaQorCQllbHNlCisJCSAgZHJvcHBlZGRlcHM9eWVzCisJCSAgZWNobworCQkgICRFQ0hPICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCisJCSAgZWNobyAiKioqIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgorCQkgIGVjaG8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCisJCSAgZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKKwkJZmkKKwkJOzsKKwkgICAgICAqKQorCQlmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaQorCSAgOzsKKwlmaWxlX21hZ2ljKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIGNhc2UgJGFfZGVwbGliIGluCisJICAgIC1sKikKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgorCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkgIGFfZGVwbGliPSIiCisJCSAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCWlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX2dsb2IiOyB0aGVuCisJCSAgbGlibmFtZWdsb2I9YGZ1bmNfZWNob19hbGwgIiRsaWJuYW1lIiB8ICRTRUQgLWUgJGZpbGVfbWFnaWNfZ2xvYmAKKwkJZWxzZQorCQkgIGxpYm5hbWVnbG9iPSRsaWJuYW1lCisJCWZpCisJCXRlc3QgIiR3YW50X25vY2FzZWdsb2IiID0geWVzICYmIG5vY2FzZWdsb2I9YHNob3B0IC1wIG5vY2FzZWdsb2JgCisJCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCQkgIGlmIHRlc3QgIiR3YW50X25vY2FzZWdsb2IiID0geWVzOyB0aGVuCisJCSAgICBzaG9wdCAtcyBub2Nhc2VnbG9iCisJCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVnbG9iWy4tXSogMj4vZGV2L251bGxgCisJCSAgICAkbm9jYXNlZ2xvYgorCQkgIGVsc2UKKwkJICAgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZWdsb2JbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmaQorCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KKwkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIHwKKwkJCSAkR1JFUCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgorCQkJY29udGludWUKKwkJICAgICAgZmkKKwkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCisJCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KKwkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluaworCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCisJCSAgICAgICMgYnV0IHNvIHdoYXQ/CisJCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCisJCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbworCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAorCQkJY2FzZSAkcG90bGlibGluayBpbgorCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7CisJCQkqKSBwb3RsaWI9YCRFQ0hPICIkcG90bGliIiB8ICRTRUQgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OworCQkJZXNhYworCQkgICAgICBkb25lCisJCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCB8CisJCQkgJFNFRCAtZSAxMHEgfAorCQkJICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCQlmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgorCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciBmaWxlIG1hZ2ljIHRlc3QpIgorCQllbHNlCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCisJCSAgJEVDSE8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgorCQlmaQorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbWF0Y2hfcGF0dGVybiopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAorCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBjYXNlICRhX2RlcGxpYiBpbgorCSAgICAtbCopCisJICAgICAgZnVuY19zdHJpcG5hbWUgLWwgJycgIiRhX2RlcGxpYiIKKwkgICAgICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkqIiAkYV9kZXBsaWIgIiopCisJCSAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAorCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiJHBvdGVudF9saWJcIiIgMj4vZGV2L251bGwgfCAkU0VEIDEwcSB8IFwKKwkJICAgICAgICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCSAgICAgIGFfZGVwbGliPSIiCisJCSAgICAgIGJyZWFrIDIKKwkJICAgIGZpCisJCSAgZG9uZQorCQlkb25lCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlkcm9wcGVkZGVwcz15ZXMKKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKKwkJZWxzZQorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRFQ0hPICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW5vbmUgfCB1bmtub3duIHwgKikKKwkgIG5ld2RlcGxpYnM9IiIKKwkgIHRtcF9kZXBsaWJzPWAkRUNITyAiICRkZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyQvLzsgcy8gLVtMUl1bXiBdKi8vZydgCisJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCisJICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJworCSAgICAgIHRtcF9kZXBsaWJzPWAkRUNITyAiICR0bXBfZGVwbGlicyIgfCAkU0VEICJzLCRpLCwiYAorCSAgICBkb25lCisJICBmaQorCSAgY2FzZSAkdG1wX2RlcGxpYnMgaW4KKwkgICpbIVwJXCBdKikKKwkgICAgZWNobworCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgorCSAgICBmaQorCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKKwkgICAgZHJvcHBlZGRlcHM9eWVzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSB3aXRoIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICBuZXdkZXBsaWJzPWAkRUNITyAiICRuZXdkZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgZWNobworCSAgICBlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKKwkgICAgJEVDSE8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgorCSAgICBlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyIKKwkgICAgZWNobyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgICAgIGVjaG8KKwkgICAgICBlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKKwkgICAgICBlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCSAgICAgIGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkgICAgICBlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJICAgICAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJICAgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgIGVsc2UKKwkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKKwkgICAgZWNobyAiKioqIG9yIGlzIGRlY2xhcmVkIHRvIC1kbG9wZW4gaXQuIgorCisJICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0gbm87IHRoZW4KKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKKwkgICAgICBlY2hvICIqKiogYmVjYXVzZSBlaXRoZXIgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlbSBvciIKKwkgICAgICBlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCWZpCisJIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCisJZGVwbGlicz0kbmV3ZGVwbGlicworICAgICAgZmkKKyAgICAgICMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKKyAgICAgIGNhc2UgJGhvc3QgaW4KKwkqLSotZGFyd2luKikKKwkgIG5ld2RlcGxpYnM9YCRFQ0hPICIgJG5ld2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPWAkRUNITyAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCSAgZGVwbGlicz1gJEVDSE8gIiAkZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCSAgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRkZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJY2FzZSAkZGVwbGliIGluCisJLUwqKQorCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCisJICAqIiAkZGVwbGliICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OworCSAgZXNhYworCSAgOzsKKwkqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZGVwbGlicz0iJG5ld19saWJzIgorCisgICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCisgICAgICBsaWJyYXJ5X25hbWVzPQorICAgICAgb2xkX2xpYnJhcnk9CisgICAgICBkbG5hbWU9CisKKyAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJIyBSZW1vdmUgJHt3bH0gaW5zdGFuY2VzIHdoZW4gbGlua2luZyB3aXRoIGxkLgorCSMgRklYTUU6IHNob3VsZCB0ZXN0IHRoZSByaWdodCBfY21kcyB2YXJpYWJsZS4KKwljYXNlICRhcmNoaXZlX2NtZHMgaW4KKwkgICpcJExEXCAqKSB3bD0gOzsKKyAgICAgICAgZXNhYworCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKKwkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRsaWJkaXIiCisJCWxpYmRpcj0kZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0CisJCWlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJCWVsc2UKKwkJICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJCSAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkJICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCSAgICA7OworCQkgICopCisJCSAgICBmdW5jX2FwcGVuZCBoYXJkY29kZV9saWJkaXJzICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZnVuY19hcHBlbmQgZGVwX3JwYXRoICIgJGZsYWciCisJICAgICAgZmkKKwkgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGV2YWwgImRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIiCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgICAgcnBhdGg9CisJICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgICBkb25lCisJICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgorCSAgZmkKKwkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCisJZmkKKworCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKKwl0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCisJaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KKwkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKwlmaQorCisJIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwlzaGlmdAorCXJlYWxuYW1lPSIkMSIKKwlzaGlmdAorCisJaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCWVsc2UKKwkgIHNvbmFtZT0iJHJlYWxuYW1lIgorCWZpCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgIGRsbmFtZT0kc29uYW1lCisJZmkKKworCWxpYj0iJG91dHB1dF9vYmpkaXIvJHJlYWxuYW1lIgorCWxpbmtuYW1lcz0KKwlmb3IgbGluaworCWRvCisJICBmdW5jX2FwcGVuZCBsaW5rbmFtZXMgIiAkbGluayIKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwl0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCisJZGVsZmlsZXM9CisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgJG9wdF9kcnlfcnVuIHx8IGNwICIkZXhwb3J0X3N5bWJvbHMiICIkb3V0cHV0X29iamRpci8kbGlibmFtZS51ZXhwIgorCSAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRleHBvcnRfc3ltYm9scyIKKwlmaQorCisJb3JpZ19leHBvcnRfc3ltYm9scz0KKwljYXNlICRob3N0X29zIGluCisJY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAjIGV4cG9ydGluZyB1c2luZyB1c2VyIHN1cHBsaWVkIHN5bWZpbGUKKwkgICAgaWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiICE9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgIyBhbmQgaXQncyBOT1QgYWxyZWFkeSBhIC5kZWYgZmlsZS4gTXVzdCBmaWd1cmUgb3V0CisJICAgICAgIyB3aGljaCBvZiB0aGUgZ2l2ZW4gc3ltYm9scyBhcmUgZGF0YSBzeW1ib2xzIGFuZCB0YWcKKwkgICAgICAjIHRoZW0gYXMgc3VjaC4gU28sIHRyaWdnZXIgdXNlIG9mIGV4cG9ydF9zeW1ib2xzX2NtZHMuCisJICAgICAgIyBleHBvcnRfc3ltYm9scyBnZXRzIHJlYXNzaWduZWQgaW5zaWRlIHRoZSAicHJlcGFyZQorCSAgICAgICMgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scyIgaWYgc3RhdGVtZW50LCBzbyB0aGUKKwkgICAgICAjIGluY2x1ZGVfZXhwc3ltcyBsb2dpYyBzdGlsbCB3b3Jrcy4KKwkgICAgICBvcmlnX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICAgICAgZXhwb3J0X3N5bWJvbHM9CisJICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCSAgICBmaQorCSAgZmkKKwkgIDs7CisJZXNhYworCisJIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCisJICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCisJICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQxIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICMgVGFrZSB0aGUgbm9ybWFsIGJyYW5jaCBpZiB0aGUgbm1fZmlsZV9saXN0X3NwZWMgYnJhbmNoCisJICAgICAgIyBkb2Vzbid0IHdvcmsgb3IgaWYgdG9vbCBjb252ZXJzaW9uIGlzIG5vdCBuZWVkZWQuCisJICAgICAgY2FzZSAkbm1fZmlsZV9saXN0X3NwZWN+JHRvX3Rvb2xfZmlsZV9jbWQgaW4KKwkJKn5mdW5jX2NvbnZlcnRfZmlsZV9ub29wIHwgKn5mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMiB8IH4qKQorCQkgIHRyeV9ub3JtYWxfYnJhbmNoPXllcworCQkgIGV2YWwgY21kPVwiJGNtZDFcIgorCQkgIGZ1bmNfbGVuICIgJGNtZCIKKwkJICBsZW49JGZ1bmNfbGVuX3Jlc3VsdAorCQkgIDs7CisJCSopCisJCSAgdHJ5X25vcm1hbF9icmFuY2g9bm8KKwkJICA7OworCSAgICAgIGVzYWMKKwkgICAgICBpZiB0ZXN0ICIkdHJ5X25vcm1hbF9icmFuY2giID0geWVzIFwKKwkJICYmIHsgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIFwKKwkJICAgICAgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IH0KKwkgICAgICB0aGVuCisJCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKKwkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKKwkgICAgICBlbGlmIHRlc3QgLW4gIiRubV9maWxlX2xpc3Rfc3BlYyI7IHRoZW4KKwkJZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKwkJb3V0cHV0X2xhPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCQlzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkJc2F2ZV9vdXRwdXQ9JG91dHB1dAorCQlvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubm0KKwkJZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJCWxpYm9ianM9JG5tX2ZpbGVfbGlzdF9zcGVjJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCQlmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRvdXRwdXQiCisJCWZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJE5NIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkJZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzOyBkbworCQkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2JqIgorCQkgICRFQ0hPICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IgorCQlkb25lID4gIiRvdXRwdXQiCisJCWV2YWwgY21kPVwiJGNtZDFcIgorCQlmdW5jX3Nob3dfZXZhbCAiJGNtZCIgJ2V4aXQgJD8nCisJCW91dHB1dD0kc2F2ZV9vdXRwdXQKKwkJbGlib2Jqcz0kc2F2ZV9saWJvYmpzCisJCXNraXBwZWRfZXhwb3J0PWZhbHNlCisJICAgICAgZWxzZQorCQkjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KKwkJZnVuY192ZXJib3NlICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKKwkJc2tpcHBlZF9leHBvcnQ9OgorCQkjIEJyZWFrIG91dCBlYXJseSwgb3RoZXJ3aXNlIHNraXBwZWRfZXhwb3J0IG1heSBiZQorCQkjIHNldCB0byBmYWxzZSBieSBhIGxhdGVyIGJ1dCBzaG9ydGVyIGNtZC4KKwkJYnJlYWsKKwkgICAgICBmaQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgIHRtcF9leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgorCSAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICMgVGhlIGdpdmVuIGV4cG9ydHNfc3ltYm9scyBmaWxlIGhhcyB0byBiZSBmaWx0ZXJlZCwgc28gZmlsdGVyIGl0LgorCSAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgIyAncycgY29tbWFuZHMgd2hpY2ggbm90IGFsbCBzZWRzIGNhbiBoYW5kbGUuIEdOVSBzZWQgc2hvdWxkIGJlIGZpbmUKKwkgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICMgaXNuJ3QgYSBibGVzc2VkIHRvb2wuCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgorCSAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwlmaQorCisJdG1wX2RlcGxpYnM9CisJZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCisJICAqIiAkdGVzdF9kZXBsaWIgIiopIDs7CisJICAqKQorCSAgICBmdW5jX2FwcGVuZCB0bXBfZGVwbGlicyAiICR0ZXN0X2RlcGxpYiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorCisJaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiAmJgorCSAgICB0ZXN0ICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiA9IHllcyAmJgorCSAgICB0ZXN0IC16ICIkbGlib2JqcyI7IHRoZW4KKwkgICAgIyBleHRyYWN0IHRoZSBhcmNoaXZlcywgc28gd2UgaGF2ZSBvYmplY3RzIHRvIGxpc3QuCisJICAgICMgVE9ETzogY291bGQgb3B0aW1pemUgdGhpcyB0byBqdXN0IGV4dHJhY3Qgb25lIGFyY2hpdmUuCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZWxzZQorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKKwkgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiICRmbGFnIgorCWZpCisKKwkjIE1ha2UgYSBiYWNrdXAgb2YgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgd2hlbiByZWxpbmtpbmcKKwlpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVUgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/CisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgIGVsc2UKKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgZmkKKwllbHNlCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKKwkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYKKwkgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiICYmCisJICAgbGVuPSRmdW5jX2xlbl9yZXN1bHQgJiYKKwkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIDoKKwllbHNlCisJICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UKKwkgICMgb3IsIGlmIHVzaW5nIEdOVSBsZCBhbmQgc2tpcHBlZF9leHBvcnQgaXMgbm90IDosIHVzZSBhIGxpbmtlcgorCSAgIyBzY3JpcHQuCisKKwkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCisJICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKKwkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKKwkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0CisJICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgorCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQorCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZworCSAgIyB0aGUgc3BlYy4KKwkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgIGZpCisJICBzYXZlX291dHB1dD0kb3V0cHV0CisJICBmdW5jX2Jhc2VuYW1lICIkb3V0cHV0IgorCSAgb3V0cHV0X2xhPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCisJICAjIENsZWFyIHRoZSByZWxvYWRhYmxlIG9iamVjdCBjcmVhdGlvbiBjb21tYW5kIHF1ZXVlIGFuZAorCSAgIyBpbml0aWFsaXplIGsgdG8gb25lLgorCSAgdGVzdF9jbWRzPQorCSAgY29uY2F0X2NtZHM9CisJICBvYmpsaXN0PQorCSAgbGFzdF9yb2JqPQorCSAgaz0xCisKKwkgIGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rc2NyaXB0CisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgR05VIGxkIHNjcmlwdDogJG91dHB1dCIKKwkgICAgZWNobyAnSU5QVVQgKCcgPiAkb3V0cHV0CisJICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcworCSAgICBkbworCSAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2JqIgorCSAgICAgICRFQ0hPICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiA+PiAkb3V0cHV0CisJICAgIGRvbmUKKwkgICAgZWNobyAnKScgPj4gJG91dHB1dAorCSAgICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRvdXRwdXQiCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgICBvdXRwdXQ9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCSAgZWxpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIlgkZmlsZV9saXN0X3NwZWMiICE9IFg7IHRoZW4KKwkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9LmxuaworCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIGxpbmtlciBpbnB1dCBmaWxlIGxpc3Q6ICRvdXRwdXQiCisJICAgIDogPiAkb3V0cHV0CisJICAgIHNldCB4ICRzYXZlX2xpYm9ianMKKwkgICAgc2hpZnQKKwkgICAgZmlyc3RvYmo9CisJICAgIGlmIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzOyB0aGVuCisJICAgICAgZmlyc3RvYmo9IiQxICIKKwkgICAgICBzaGlmdAorCSAgICBmaQorCSAgICBmb3Igb2JqCisJICAgIGRvCisJICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRvdXRwdXQiCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgICBvdXRwdXQ9JGZpcnN0b2JqXCIkZmlsZV9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIKKwkgIGVsc2UKKwkgICAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyI7IHRoZW4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLi4uIgorCSAgICAgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCSAgICAgIGV2YWwgdGVzdF9jbWRzPVwiJHJlbG9hZF9jbWRzXCIKKwkgICAgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiCisJICAgICAgbGVuMD0kZnVuY19sZW5fcmVzdWx0CisJICAgICAgbGVuPSRsZW4wCisKKwkgICAgICAjIExvb3Agb3ZlciB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGxpbmtlZC4KKwkgICAgICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKKwkgICAgICBkbworCQlmdW5jX2xlbiAiICRvYmoiCisJCWZ1bmNfYXJpdGggJGxlbiArICRmdW5jX2xlbl9yZXN1bHQKKwkJbGVuPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQlpZiB0ZXN0ICJYJG9iamxpc3QiID0gWCB8fAorCQkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkJICBmdW5jX2FwcGVuZCBvYmpsaXN0ICIgJG9iaiIKKwkJZWxzZQorCQkgICMgVGhlIGNvbW1hbmQgJHRlc3RfY21kcyBpcyBhbG1vc3QgdG9vIGxvbmcsIGFkZCBhCisJCSAgIyBjb21tYW5kIHRvIHRoZSBxdWV1ZS4KKwkJICBpZiB0ZXN0ICIkayIgLWVxIDEgOyB0aGVuCisJCSAgICAjIFRoZSBmaXJzdCBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgdG8gYWRkLgorCQkgICAgcmVsb2FkX29ianM9JG9iamxpc3QKKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgorCQkgIGVsc2UKKwkJICAgICMgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMgd2lsbCBsaW5rIGluCisJCSAgICAjIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgorCQkgICAgcmVsb2FkX29ianM9IiRvYmpsaXN0ICRsYXN0X3JvYmoiCisJCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kcmVsb2FkX2NtZHN+XCRSTSAkbGFzdF9yb2JqXCIKKwkJICBmaQorCQkgIGxhc3Rfcm9iaj0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIGZ1bmNfYXJpdGggJGsgKyAxCisJCSAgaz0kZnVuY19hcml0aF9yZXN1bHQKKwkJICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkJICBvYmpsaXN0PSIgJG9iaiIKKwkJICBmdW5jX2xlbiAiICRsYXN0X3JvYmoiCisJCSAgZnVuY19hcml0aCAkbGVuMCArICRmdW5jX2xlbl9yZXN1bHQKKwkJICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJCWZpCisJICAgICAgZG9uZQorCSAgICAgICMgSGFuZGxlIHRoZSByZW1haW5pbmcgb2JqZWN0cyBieSBjcmVhdGluZyBvbmUgbGFzdAorCSAgICAgICMgcmVsb2FkYWJsZSBvYmplY3QgZmlsZS4gIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0CisJICAgICAgIyBmaWxlcyB3aWxsIGxpbmsgaW4gdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgcmVsb2FkX29ianM9IiRvYmpsaXN0ICRsYXN0X3JvYmoiCisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kc1wiCisJICAgICAgaWYgdGVzdCAtbiAiJGxhc3Rfcm9iaiI7IHRoZW4KKwkgICAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc31+XCRSTSAkbGFzdF9yb2JqXCIKKwkgICAgICBmaQorCSAgICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKworCSAgICBlbHNlCisJICAgICAgb3V0cHV0PQorCSAgICBmaQorCisJICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCisJICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgorCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgbGlib2Jqcz0kb3V0cHV0CisJICAgICAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBleHBvcnQgZmlsZS4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kcyRleHBvcnRfc3ltYm9sc19jbWRzXCIKKwkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgorCQlldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc35cJFJNICRsYXN0X3JvYmpcIgorCSAgICAgIGZpCisJICAgIGZpCisKKwkgICAgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYKKwkgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIGEgdGVtcG9yYXJ5IHJlbG9hZGFibGUgb2JqZWN0IGZpbGU6ICRvdXRwdXQiCisKKwkgICAgIyBMb29wIHRocm91Z2ggdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBhYm92ZSBhbmQgZXhlY3V0ZSB0aGVtLgorCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY29uY2F0X2NtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgJG9wdF9zaWxlbnQgfHwgeworCQkgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKKwkJICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisJICAgICAgfQorCSAgICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kIiB8fCB7CisJCWx0X2V4aXQ9JD8KKworCQkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKKwkJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgdGhlbgorCQkgICggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiBcCisJCSAgICAkUk0gIiR7cmVhbG5hbWV9VCIgJiYgXAorCQkgICAgJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkJZmkKKworCQlleGl0ICRsdF9leGl0CisJICAgICAgfQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisKKyAgICAgICAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICAgICAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICIkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgICAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICAgICAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAgICAgIyBGSVhNRTogJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIHBvdGVudGlhbGx5IGNvbnRhaW5zIGxvdHMgb2YKKwkgICAgICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgICAgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgICAgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5CisJICAgICAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgICAgICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCisJICAgICAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwkgICAgZmkKKwkgIGZpCisKKwkgIGxpYm9ianM9JG91dHB1dAorCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCisJICBvdXRwdXQ9JHNhdmVfb3V0cHV0CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQorCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCisKKwkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgICAgZWxzZQorCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICAgIGZpCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kYXJjaGl2ZV9jbWRzCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZGVsZmlsZXMiOyB0aGVuCisJICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIHRvICRjbWRzLgorCSAgZXZhbCBjbWRzPVwiXCRjbWRzflwkUk0gJGRlbGZpbGVzXCIKKwlmaQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKworCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGRscHJlZmlsZXMKKwkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJZmkKKworCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGV2YWwgY21kPVwiJGNtZFwiCisJICAkb3B0X3NpbGVudCB8fCB7CisJICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKKwkgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgfQorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkgICAgbHRfZXhpdD0kPworCisJICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICBpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJICAgICAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKKwkgICAgICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCisJCSRNViAiJHtyZWFsbmFtZX1VIiAiJHJlYWxuYW1lIiApCisJICAgIGZpCisKKwkgICAgZXhpdCAkbHRfZXhpdAorCSAgfQorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKworCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VCAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkTVYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgICAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCisJICAgIGZpCisJICBmaQorCisJICBleGl0ICRFWElUX1NVQ0NFU1MKKwlmaQorCisJIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KKwlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KKwkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KKwkgICAgZnVuY19zaG93X2V2YWwgJyhjZCAiJG91dHB1dF9vYmpkaXIiICYmICRSTSAiJGxpbmtuYW1lIiAmJiAkTE5fUyAiJHJlYWxuYW1lIiAiJGxpbmtuYW1lIiknICdleGl0ICQ/JworCSAgZmkKKwlkb25lCisKKwkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KKwkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgorCSAgZGxuYW1lPSIkc29uYW1lIgorCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9iaikKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisgICAgICBmaQorCisgICAgICBjYXNlICIgJGRlcGxpYnMiIGluCisgICAgICAqXCAtbCogfCAqXCAtTCopCisJZnVuY193YXJuaW5nICJcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIG9iamVjdHMiIDs7CisgICAgICBlc2FjCisKKyAgICAgIHRlc3QgLW4gIiRycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgY2FzZSAkb3V0cHV0IGluCisgICAgICAqLmxvKQorCXRlc3QgLW4gIiRvYmpzJG9sZF9kZXBsaWJzIiAmJiBcCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiCisKKwlsaWJvYmo9JG91dHB1dAorCWZ1bmNfbG8ybyAiJGxpYm9iaiIKKwlvYmo9JGZ1bmNfbG8yb19yZXN1bHQKKwk7OworICAgICAgKikKKwlsaWJvYmo9CisJb2JqPSIkb3V0cHV0IgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJG9iaiAkbGlib2JqCisKKyAgICAgICMgT2JqZWN0cyBmcm9tIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFRoaXMgYXNzdW1lcworICAgICAgIyBzaW5nbGUtdmVyc2lvbiBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBXaGVuZXZlciB3ZSBjcmVhdGUKKyAgICAgICMgZGlmZmVyZW50IG9uZXMgZm9yIFBJQy9ub24tUElDLCB0aGlzIHdlJ2xsIGhhdmUgdG8gZHVwbGljYXRlCisgICAgICAjIHRoZSBleHRyYWN0aW9uLgorICAgICAgcmVsb2FkX2NvbnZfb2Jqcz0KKyAgICAgIGdlbnRvcD0KKyAgICAgICMgcmVsb2FkX2NtZHMgcnVucyAkTEQgZGlyZWN0bHksIHNvIGxldCB1cyBnZXQgcmlkIG9mCisgICAgICAjIC1XbCBmcm9tIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGFuZCBob3BlIHdlIGNhbiBnZXQgYnkgd2l0aAorICAgICAgIyB0dXJuaW5nIGNvbW1hIGludG8gc3BhY2UuLgorICAgICAgd2w9CisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzPVwiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgIHJlbG9hZF9jb252X29ianM9JHJlbG9hZF9vYmpzXCBgJEVDSE8gIiR0bXBfd2hvbGVfYXJjaGl2ZV9mbGFncyIgfCAkU0VEICdzfCx8IHxnJ2AKKwllbHNlCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b2JqfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgYnVpbGRpbmcgc2hhcmVkLCB3ZSBuZWVkIHRvIHVzZSBub25fcGljX29ianMKKyAgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBsaWJvYmpzPSIkbm9uX3BpY19vYmplY3RzIgorCisgICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKyAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRFQ0hPICIkbGlib2JqcyIgfCAkU1AyTkwgfCAkU0VEICIvXC4ke2xpYmV4dH0kL2Q7IC9cLmxpYiQvZDsgJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCisgICAgICBvdXRwdXQ9IiRvYmoiCisgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJHJlbG9hZF9jbWRzIiAnZXhpdCAkPycKKworICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCisgICAgICBpZiB0ZXN0IC16ICIkbGlib2JqIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCisJZmkKKworCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0CisJIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKwkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJIyAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/CisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgorCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCisJcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgorCW91dHB1dD0iJGxpYm9iaiIKKwlmdW5jX2V4ZWN1dGVfY21kcyAiJHJlbG9hZF9jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCisgICAgICBmaQorCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisKKyAgICBwcm9nKQorICAgICAgY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qKSBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXQiCisJICAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0LmV4ZTs7CisgICAgICBlc2FjCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAiJHByZWxvYWQiID0geWVzIFwKKyAgICAgICAgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duIFwKKwkmJiB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd24gJiYgXAorCSAgZnVuY193YXJuaW5nICJcYExUX0lOSVQoW2Rsb3Blbl0pJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgorCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwljb21waWxlX2RlcGxpYnM9YCRFQ0hPICIgJGNvbXBpbGVfZGVwbGlicyIgfCAkU0VEICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJZmluYWxpemVfZGVwbGlicz1gJEVDSE8gIiAkZmluYWxpemVfZGVwbGlicyIgfCAkU0VEICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLWRhcndpbiopCisJIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycworCSMgQnV0IGlzIHN1cHBvc2VkbHkgZml4ZWQgb24gMTAuNCBvciBsYXRlciAoeWF5ISkuCisJaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorCSAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSBpbgorCSAgICAxMC5bMDEyM10pCisJICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHt3bH0tYmluZF9hdF9sb2FkIgorCSAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgIDs7CisJICBlc2FjCisJZmkKKwkjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisJY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiICRjb21waWxlX2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJOzsKKyAgICAgIGVzYWMKKworCisgICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKKyAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0CisgICAgICBuZXdfbGlicz0KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJY2FzZSAiICRuZXdfbGlicyAiIGluCisJKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OworCSopCisJICBjYXNlICIgJGNvbXBpbGVfZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRjb21waWxlX2RlcGxpYnM7IGRvCisJY2FzZSAkZGVwbGliIGluCisJLUwqKQorCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCisJICAqIiAkZGVwbGliICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OworCSAgZXNhYworCSAgOzsKKwkqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2xpYnMiCisKKworICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGNvbXBpbGVfZGVwbGlicyIKKyAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkZmluYWxpemVfZGVwbGlicyIKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KKwkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KKwkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgZXNhYworCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKwkgIHRlc3RiaW5kaXI9YCR7RUNIT30gIiRsaWJkaXIiIHwgJHtTRUR9IC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGxpYmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRsaWJkaXI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiRsaWJkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQlmdW5jX2FwcGVuZCBoYXJkY29kZV9saWJkaXJzICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCTs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZWxzZQorCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIGZ1bmNfYXBwZW5kIHJwYXRoICIgJGZsYWciCisJICBmaQorCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3Blcm1fcnBhdGggIiAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKKworICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCisJY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkU0VEICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkb3V0cHV0bmFtZSIgIkBQUk9HUkFNQCIgIm5vIgorCisgICAgICAjIHRlbXBsYXRlIHByZWxpbmtpbmcgc3RlcAorICAgICAgaWYgdGVzdCAtbiAiJHByZWxpbmtfY21kcyI7IHRoZW4KKwlmdW5jX2V4ZWN1dGVfY21kcyAiJHByZWxpbmtfY21kcyIgJ2V4aXQgJD8nCisgICAgICBmaQorCisgICAgICB3cmFwcGVyc19yZXF1aXJlZD15ZXMKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICpjZWdjYyogfCAqbWluZ3czMmNlKikKKyAgICAgICAgIyBEaXNhYmxlIHdyYXBwZXJzIGZvciBjZWdjYyBhbmQgbWluZ3czMmNlIGhvc3RzLCB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIGFueXdheS4KKyAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgOzsKKyAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCisgICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgIiR3cmFwcGVyc19yZXF1aXJlZCIgPSBubzsgdGhlbgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisKKwkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KKwlleGl0X3N0YXR1cz0wCisJZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0X3N0YXR1cz0kPycKKworCWlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICBwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RsaW5rX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorCWlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICckUk0gIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSInCisJZmkKKworCWV4aXQgJGV4aXRfc3RhdHVzCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCisgICAgICBmaQorCisgICAgICBjb21waWxlX3Zhcj0KKyAgICAgIGZpbmFsaXplX3Zhcj0KKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgIGZ1bmNfYXBwZW5kIHJwYXRoICIkZGlyOiIKKwkgIGRvbmUKKwkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgZG9uZQorCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5vX2luc3RhbGwiID0geWVzOyB0aGVuCisJIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc2NyaXB0LgorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwlsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKKwkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisKKwlpZiB0ZXN0IC1uICIkcG9zdGxpbmtfY21kcyI7IHRoZW4KKwkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgcG9zdGxpbmtfY21kcz1gZnVuY19lY2hvX2FsbCAiJHBvc3RsaW5rX2NtZHMiIHwgJFNFRCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJyAtZSAncyVAVE9PTF9PVVRQVVRAJSciJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCInJWcnYAorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKwlmaQorCisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwlmdW5jX3dhcm5pbmcgInRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIgorCWZ1bmNfd2FybmluZyAiXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkU0VEICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCisJICBlbHNlCisJICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcworCSAgICByZWxpbmtfY29tbWFuZD0KKwkgIGZpCisJZWxzZQorCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCWZpCisgICAgICBmaQorCisgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisgICAgICBsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAorCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQorCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCWZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSIKKwlwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJyAtZSAncyVAVE9PTF9PVVRQVVRAJSciJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCInJWcnYAorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGxpbmtfY21kcyIgJ2V4aXQgJD8nCisgICAgICBmaQorCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBmaQorCWRvbmUKKwlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgorCXJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZmkKKworICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBub3QgaW4gZHJ5IHJ1biBtb2RlLgorICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKKwkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgorCWNhc2UgJG91dHB1dCBpbgorCSAgKi5leGUpIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICBvdXRwdXQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworCWVzYWMKKwkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKKwljYXNlICRob3N0IGluCisJICAqY3lnd2luKikKKwkgICAgZXhlZXh0PS5leGUKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0bmFtZSIKKwkgICAgb3V0cHV0bmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJICAqKSBleGVleHQ9IDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiApCisJICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvdXRwdXQiICIiICIuIgorCSAgICBvdXRwdXRfbmFtZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKKwkgICAgb3V0cHV0X3BhdGg9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKwkgICAgY3dyYXBwZXJzb3VyY2U9IiRvdXRwdXRfcGF0aC8kb2JqZGlyL2x0LSRvdXRwdXRfbmFtZS5jIgorCSAgICBjd3JhcHBlcj0iJG91dHB1dF9wYXRoLyRvdXRwdXRfbmFtZS5leGUiCisJICAgICRSTSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyCisJICAgIHRyYXAgIiRSTSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyOyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQorCisJICAgIGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMgPiAkY3dyYXBwZXJzb3VyY2UKKworCSAgICAjIFRoZSB3cmFwcGVyIGV4ZWN1dGFibGUgaXMgYnVpbHQgdXNpbmcgdGhlICRob3N0IGNvbXBpbGVyLAorCSAgICAjIGJlY2F1c2UgaXQgY29udGFpbnMgJGhvc3QgcGF0aHMgYW5kIGZpbGVzLiBJZiBjcm9zcy0KKwkgICAgIyBjb21waWxpbmcsIGl0LCBsaWtlIHRoZSB0YXJnZXQgZXhlY3V0YWJsZSwgbXVzdCBiZQorCSAgICAjIGV4ZWN1dGVkIG9uIHRoZSAkaG9zdCBvciB1bmRlciBhbiBlbXVsYXRpb24gZW52aXJvbm1lbnQuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1vICRjd3JhcHBlciAkY3dyYXBwZXJzb3VyY2UKKwkgICAgICAkU1RSSVAgJGN3cmFwcGVyCisJICAgIH0KKworCSAgICAjIE5vdywgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdCBmb3IgZnVuY19zb3VyY2UgdXNlOgorCSAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICRjd3JhcHBlcgorCSAgICAkUk0gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgIHRyYXAgIiRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgIyBub3RlOiB0aGlzIHNjcmlwdCB3aWxsIG5vdCBiZSBleGVjdXRlZCwgc28gZG8gbm90IGNobW9kLgorCSAgICAgIGlmIHRlc3QgIngkYnVpbGQiID0gIngkaG9zdCIgOyB0aGVuCisJCSRjd3JhcHBlciAtLWx0LWR1bXAtc2NyaXB0ID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZWxzZQorCQlmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIGZpCisJICAgIH0KKwkgIDs7CisJICAqICkKKwkgICAgJFJNICRvdXRwdXQKKwkgICAgdHJhcCAiJFJNICRvdXRwdXQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X3dyYXBwZXIgbm8gPiAkb3V0cHV0CisJICAgIGNobW9kICt4ICRvdXRwdXQKKwkgIDs7CisJZXNhYworICAgICAgfQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgorICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KKwlvbGRvYmpzPSIkbGlib2Jqc19zYXZlICRzeW1maWxlb2JqIgorCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgorCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWVsc2UKKwkgIG9sZG9ianM9IiRvbGRfZGVwbGlicyAkbm9uX3BpY19vYmplY3RzIgorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzICYmIHRlc3QgLWYgIiRzeW1maWxlb2JqIjsgdGhlbgorCSAgICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJHN5bWZpbGVvYmoiCisJICBmaQorCWZpCisJYWRkbGlicz0iJG9sZF9jb252ZW5pZW5jZSIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRhZGRsaWJzIjsgdGhlbgorCWdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKworCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCisJZnVuY19hcHBlbmQgb2xkb2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwljbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisgICAgICBlbHNlCisKKwkjIEFkZCBhbnkgb2JqZWN0cyBmcm9tIHByZWxvYWRlZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwlpZiB0ZXN0IC1uICIkZGxwcmVmaWxlcyI7IHRoZW4KKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcworCSAgZnVuY19hcHBlbmQgb2xkb2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCWZpCisKKwkjIFBPU0lYIGRlbWFuZHMgbm8gcGF0aHMgdG8gYmUgZW5jb2RlZCBpbiBhcmNoaXZlcy4gIFdlIGhhdmUKKwkjIHRvIGF2b2lkIGNyZWF0aW5nIGFyY2hpdmVzIHdpdGggZHVwbGljYXRlIGJhc2VuYW1lcyBpZiB3ZQorCSMgbWlnaHQgaGF2ZSB0byBleHRyYWN0IHRoZW0gYWZ0ZXJ3YXJkcywgZS5nLiwgd2hlbiBjcmVhdGluZyBhCisJIyBzdGF0aWMgYXJjaGl2ZSBvdXQgb2YgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvciB3aGVuIGxpbmtpbmcKKwkjIHRoZSBlbnRpcmV0eSBvZiBhIGxpYnRvb2wgYXJjaGl2ZSBpbnRvIGFub3RoZXIgKGN1cnJlbnRseQorCSMgbm90IHN1cHBvcnRlZCBieSBsaWJ0b29sKS4KKwlpZiAoZm9yIG9iaiBpbiAkb2xkb2JqcworCSAgICBkbworCSAgICAgIGZ1bmNfYmFzZW5hbWUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgZG9uZSB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisJICA6CisJZWxzZQorCSAgZWNobyAiY29weWluZyBzZWxlY3RlZCBvYmplY3QgZmlsZXMgdG8gYXZvaWQgYmFzZW5hbWUgY29uZmxpY3RzLi4uIgorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisJICBmdW5jX21rZGlyX3AgIiRnZW50b3AiCisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICBjb3VudGVyPTEKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgb2JqYmFzZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgorCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OworCSAgICAqW1wgL10iJG9iamJhc2UgIiopCisJICAgICAgd2hpbGUgOjsgZG8KKwkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KKwkJIyBvdmVybGFwcy4KKwkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKKwkJZnVuY19hcml0aCAkY291bnRlciArIDEKKwkJY291bnRlcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJY2FzZSAiICRvbGRvYmpzICIgaW4KKwkJKltcIC9dIiRuZXdvYmogIiopIDs7CisJCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKKwkJZXNhYworCSAgICAgIGRvbmUKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgZnVuY19hcHBlbmQgb2xkb2JqcyAiICRnZW50b3AvJG5ld29iaiIKKwkgICAgICA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJG9iaiIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJZnVuY190b190b29sX2ZpbGUgIiRvbGRsaWIiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJdG9vbF9vbGRsaWI9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKworCWZ1bmNfbGVuICIgJGNtZHMiCisJbGVuPSRmdW5jX2xlbl9yZXN1bHQKKwlpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbGlmIHRlc3QgLW4gIiRhcmNoaXZlcl9saXN0X3NwZWMiOyB0aGVuCisJICBmdW5jX3ZlcmJvc2UgInVzaW5nIGNvbW1hbmQgZmlsZSBhcmNoaXZlIGxpbmtpbmcuLi4iCisJICBmb3Igb2JqIGluICRvbGRvYmpzCisJICBkbworCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG9iaiIKKwkgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJICBkb25lID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUubGliY21kCisJICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUubGliY21kIgorCSAgb2xkb2Jqcz0iICRhcmNoaXZlcl9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IgorCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcworCWVsc2UKKwkgICMgdGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIGluIHBhcnRzCisJICBmdW5jX3ZlcmJvc2UgInVzaW5nIHBpZWNld2lzZSBhcmNoaXZlIGxpbmtpbmcuLi4iCisJICBzYXZlX1JBTkxJQj0kUkFOTElCCisJICBSQU5MSUI9OgorCSAgb2JqbGlzdD0KKwkgIGNvbmNhdF9jbWRzPQorCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCisJICBvbGRvYmpzPQorCSAgIyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZmluZGluZyB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3Q/CisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGxhc3Rfb2xkb2JqPSRvYmoKKwkgIGRvbmUKKwkgIGV2YWwgdGVzdF9jbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIgorCSAgbGVuMD0kZnVuY19sZW5fcmVzdWx0CisJICBsZW49JGxlbjAKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY19sZW4gIiAkb2JqIgorCSAgICBmdW5jX2FyaXRoICRsZW4gKyAkZnVuY19sZW5fcmVzdWx0CisJICAgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgZnVuY19hcHBlbmQgb2JqbGlzdCAiICRvYmoiCisJICAgIGlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgorCSAgICAgIDoKKwkgICAgZWxzZQorCSAgICAgICMgdGhlIGFib3ZlIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGl0IGdldHMgdG9vIGxvbmcKKwkgICAgICBvbGRvYmpzPSRvYmpsaXN0CisJICAgICAgaWYgdGVzdCAiJG9iaiIgPSAiJGxhc3Rfb2xkb2JqIiA7IHRoZW4KKwkJUkFOTElCPSRzYXZlX1JBTkxJQgorCSAgICAgIGZpCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgICAgICBvYmpsaXN0PQorCSAgICAgIGxlbj0kbGVuMAorCSAgICBmaQorCSAgZG9uZQorCSAgUkFOTElCPSRzYXZlX1JBTkxJQgorCSAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgaWYgdGVzdCAiWCRvbGRvYmpzIiA9ICJYIiA7IHRoZW4KKwkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc1wiCisJICBlbHNlCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHN+XCRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZpCisJZmkKKyAgICAgIGZpCisgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJGNtZHMiICdleGl0ICQ/JworICAgIGRvbmUKKworICAgIHRlc3QgLW4gIiRnZW5lcmF0ZWQiICYmIFwKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIke1JNfXIkZ2VuZXJhdGVkIgorCisgICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgKi5sYSkKKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKKyAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCAkbHRfdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgorCWVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWVsc2UKKwkgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICByZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyBAaW5zdF9wcmVmaXhfZGlyQCkiCisgICAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgorCXJlbGlua19jb21tYW5kPQorICAgICAgZmkKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbworCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQorCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgICoubGEpCisJCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHRgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgLUwqKQorCQlmdW5jX3N0cmlwbmFtZSAtTCAnJyAiJGRlcGxpYiIKKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiIC1MJGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdCIKKwkJOzsKKwkgICAgICAtUiopCisJCWZ1bmNfc3RyaXBuYW1lIC1SICcnICIkZGVwbGliIgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgLVIkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgbmV3ZGxmaWxlcz0KKworCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJICAgICAgICBmdW5jX2Jhc2VuYW1lICIkbGliIgorCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICR7bHRfc3lzcm9vdDorPX0kbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkgICAgICAqLmxhKQorCQkjIE9ubHkgcGFzcyBwcmVvcGVuZWQgZmlsZXMgdG8gdGhlIHBzZXVkby1hcmNoaXZlIChmb3IKKwkJIyBldmVudHVhbCBsaW5raW5nIHdpdGggdGhlIGFwcC4gdGhhdCBsaW5rcyBpdCkgaWYgd2UKKwkJIyBkaWRuJ3QgYWxyZWFkeSBsaW5rIHRoZSBwcmVvcGVuZWQgb2JqZWN0cyBkaXJlY3RseSBpbnRvCisJCSMgdGhlIGxpYnJhcnk6CisJCWZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CisJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRhYnMiCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBmaQorCSAgJFJNICRvdXRwdXQKKwkgICMgcGxhY2UgZGxuYW1lIGluIGNvcnJlY3QgcG9zaXRpb24gZm9yIGN5Z3dpbgorCSAgIyBJbiBmYWN0LCBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSB0aGlzIGNvZGUgZm9yIGFsbCB0YXJnZXQKKwkgICMgc3lzdGVtcyB0aGF0IGNhbid0IGhhcmQtY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gdGhlaXIgZXhlY3V0YWJsZXMKKwkgICMgYW5kIHRoYXQgaGF2ZSBubyBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlIGluZGVwZW5kZW50IG9mIFBBVEgsCisJICAjIGJ1dCBpdCB0dXJucyBvdXQgd2UgY2FuJ3QgZWFzaWx5IGRldGVybWluZSB0aGF0IGZyb20gaW5zcGVjdGluZworCSAgIyBsaWJ0b29sIHZhcmlhYmxlcywgc28gd2UgaGF2ZSB0byBoYXJkLWNvZGUgdGhlIE9TcyB0byB3aGljaCBpdAorCSAgIyBhcHBsaWVzIGhlcmU7IGF0IHRoZSBtb21lbnQsIHRoYXQgbWVhbnMgcGxhdGZvcm1zIHRoYXQgdXNlIHRoZSBQRQorCSAgIyBvYmplY3QgZm9ybWF0IHdpdGggRExMIGZpbGVzLiAgU2VlIHRoZSBsb25nIGNvbW1lbnQgYXQgdGhlIHRvcCBvZgorCSAgIyB0ZXN0cy9iaW5kaXIuYXQgZm9yIGZ1bGwgZGV0YWlscy4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCB8ICpjZWdjYyosKmxhaSx5ZXMsbm8sKi5kbGwpCisJICAgICAgIyBJZiBhIC1iaW5kaXIgYXJndW1lbnQgd2FzIHN1cHBsaWVkLCBwbGFjZSB0aGUgZGxsIHRoZXJlLgorCSAgICAgIGlmIHRlc3QgIngkYmluZGlyIiAhPSB4IDsKKwkgICAgICB0aGVuCisJCWZ1bmNfcmVsYXRpdmVfcGF0aCAiJGluc3RhbGxfbGliZGlyIiAiJGJpbmRpciIKKwkJdGRsbmFtZT0kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCRkbG5hbWUKKwkgICAgICBlbHNlCisJCSMgT3RoZXJ3aXNlIGZhbGwgYmFjayBvbiBoZXVyaXN0aWMuCisJCXRkbG5hbWU9Li4vYmluLyRkbG5hbWUKKwkgICAgICBmaQorCSAgICAgIDs7CisJICBlc2FjCisJICAkRUNITyA+ICRvdXRwdXQgIlwKKyMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckdGRsbmFtZScKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JworCisjIExpbmtlciBmbGFncyB0aGF0IGNhbiBub3QgZ28gaW4gZGVwZW5kZW5jeV9saWJzLgoraW5oZXJpdGVkX2xpbmtlcl9mbGFncz0nJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKKworIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQord2Vha19saWJyYXJ5X25hbWVzPSckd2Vha19saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD0kaW5zdGFsbGVkCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPSRtb2R1bGUKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JyRkbGZpbGVzJworZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0geWVzOyB0aGVuCisJICAgICRFQ0hPID4+ICRvdXRwdXQgIlwKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCisJICBmaQorCWRvbmUKKyAgICAgIH0KKworICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgorICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KKyAgICAgIGZ1bmNfc2hvd19ldmFsICcoIGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkb3V0cHV0bmFtZSIgJiYgJExOX1MgIi4uLyRvdXRwdXRuYW1lIiAiJG91dHB1dG5hbWUiICknICdleGl0ICQ/JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKK3sgdGVzdCAiJG9wdF9tb2RlIiA9IGxpbmsgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgfSAmJgorICAgIGZ1bmNfbW9kZV9saW5rICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX3VuaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV91bmluc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgUk09IiRub25vcHQiCisgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZikgZnVuY19hcHBlbmQgUk0gIiAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKKyAgICAgIC0qKSBmdW5jX2FwcGVuZCBSTSAiICRhcmciIDs7CisgICAgICAqKSBmdW5jX2FwcGVuZCBmaWxlcyAiICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJFJNIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIKKworICAgIHJtZGlycz0KKworICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgIGZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorICAgICAgZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICAgIGlmIHRlc3QgIlgkZGlyIiA9IFguOyB0aGVuCisJb2Rpcj0iJG9iamRpciIKKyAgICAgIGVsc2UKKwlvZGlyPSIkZGlyLyRvYmpkaXIiCisgICAgICBmaQorICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisgICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsICYmIG9kaXI9IiRkaXIiCisKKyAgICAgICMgUmVtZW1iZXIgb2RpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2RpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHJtZGlycyAiICRvZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiB7IHRlc3QgLUwgIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgeyB0ZXN0IC1oICIkZmlsZSI7IH0gPi9kZXYvbnVsbCAyPiYxIHx8CisJIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCToKKyAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisJZXhpdF9zdGF0dXM9MQorCWNvbnRpbnVlCisgICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAkbmFtZSBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG4iCisJICBkb25lCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kb2xkX2xpYnJhcnkiCisKKwkgIGNhc2UgIiRvcHRfbW9kZSIgaW4KKwkgIGNsZWFuKQorCSAgICBjYXNlICIgJGxpYnJhcnlfbmFtZXMgIiBpbgorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSB0ZXN0IC1uICIkZGxuYW1lIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJGRsbmFtZSIgOzsKKwkgICAgZXNhYworCSAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfWkiCisJICAgIDs7CisJICB1bmluc3RhbGwpCisJICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKKwkgICAgZmkKKwkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCisJICAgIDs7CisJICBlc2FjCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgorCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqKQorCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbiA7IHRoZW4KKwkgIG5vZXhlbmFtZT0kbmFtZQorCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRuYW1lIgorCSAgICBub2V4ZW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCisJICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQorCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmIGZ1bmNfbHR3cmFwcGVyX3AgIiRmaWxlIjsgdGhlbgorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAgIGVsc2UKKwkgICAgICByZWxpbmtfY29tbWFuZD0KKwkgICAgICBmdW5jX3NvdXJjZSAkZGlyLyRub2V4ZW5hbWUKKwkgICAgZmkKKworCSAgICAjIG5vdGUgJG5hbWUgc3RpbGwgY29udGFpbnMgLmV4ZSBpZiBpdCB3YXMgaW4gJGZpbGUgb3JpZ2luYWxseQorCSAgICAjIGFzIGRvZXMgdGhlIHZlcnNpb24gb2YgJGZpbGUgdGhhdCB3YXMgYWRkZWQgaW50byAkcm1maWxlcworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfVMuJHtvYmpleHR9IgorCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllcyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSR7bm9leGVuYW1lfS5jIgorCSAgICBmaQorCSAgZmkKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJFJNICRybWZpbGVzIiAnZXhpdF9zdGF0dXM9MScKKyAgICBkb25lCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICJybWRpciAkZGlyID4vZGV2L251bGwgMj4mMSIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKK30KKworeyB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbjsgfSAmJgorICAgIGZ1bmNfbW9kZV91bmluc3RhbGwgJHsxKyIkQCJ9CisKK3Rlc3QgLXogIiRvcHRfbW9kZSIgJiYgeworICBoZWxwPSIkZ2VuZXJpY19oZWxwIgorICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgorfQorCit0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKKyAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG9wdF9tb2RlJyIKKworaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgorICBldmFsIGV4ZWMgIiRleGVjX2NtZCIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCitleGl0ICRleGl0X3N0YXR1cworCisKKyMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCisjIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZworIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKKyMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCisjIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAorIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAorIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCisjIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCisjIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5CisjIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAorYnVpbGRfbGlidG9vbF9saWJzPW5vCitidWlsZF9vbGRfbGlicz15ZXMKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKK2J1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSBlY2hvIG5vOzsgKikgZWNobyB5ZXM7OyBlc2FjYAorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgorIyB2aTpzdz0yCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvYnVpbGQtYXV4L21pc3NpbmcgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2J1aWxkLWF1eC9taXNzaW5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2YThmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2J1aWxkLWF1eC9taXNzaW5nCkBAIC0wLDAgKzEsMzMxIEBACisjISAvYmluL3NoCisjIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgorCitzY3JpcHR2ZXJzaW9uPTIwMTItMDEtMDYuMTM7ICMgVVRDCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorIyAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgZXhpdCAxCitmaQorCitydW49Ogorc2VkX291dHB1dD0ncy8uKiAtLW91dHB1dFsgPV1cKFteIF0qXCkuKi9cMS9wJworc2VkX21pbnVzbz0ncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJworCisjIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCisjIHNyY2RpciBhbHJlYWR5LgoraWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KKyAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYworZWxzZQorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCitmaQorCittc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCisKK2Nhc2UgJDEgaW4KKy0tcnVuKQorICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCisgIHJ1bj0KKyAgc2hpZnQKKyAgIiRAIiAmJiBleGl0IDAKKyAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucworICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCisgICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKKyAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgorICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KKyAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCisgICAgcnVuPToKKyAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCisgIGZpCisgIDs7CisKKyAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorICAgIGVjaG8gIlwKKyQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgorCitIYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCitlcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCisKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCisKK1N1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKKyAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JworICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKKyAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKKyAgYXV0b200dGUgICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZSwgb3IgY3JlYXRlIGEgc3R1YiBvbmUKKyAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcworICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisgIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisKK1ZlcnNpb24gc3VmZml4ZXMgdG8gUFJPR1JBTSBhcyB3ZWxsIGFzIHRoZSBwcmVmaXhlcyBcYGdudS0nLCBcYGdudScsIGFuZAorXGBnJyBhcmUgaWdub3JlZCB3aGVuIGNoZWNraW5nIHRoZSBuYW1lLgorCitTZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCitlc2FjCisKKyMgbm9ybWFsaXplIHByb2dyYW0gbmFtZSB0byBjaGVjayBmb3IuCitwcm9ncmFtPWBlY2hvICIkMSIgfCBzZWQgJworICBzL15nbnUtLy87IHQKKyAgcy9eZ251Ly87IHQKKyAgcy9eZy8vOyB0J2AKKworIyBOb3cgZXhpdCBpZiB3ZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLiAgQWxzbyBleGl0IG5vdyBpZiB3ZQorIyBkb24ndCBoYXZlIGl0IGFuZCAtLXZlcnNpb24gd2FzIHBhc3NlZCAobW9zdCBsaWtlbHkgdG8gZGV0ZWN0CisjIHRoZSBwcm9ncmFtKS4gIFRoaXMgaXMgYWJvdXQgbm9uLUdOVSBwcm9ncmFtcywgc28gdXNlICQxIG5vdAorIyAkcHJvZ3JhbS4KK2Nhc2UgJDEgaW4KKyAgbGV4Knx5YWNjKikKKyAgICAjIE5vdCBHTlUgcHJvZ3JhbXMsIHRoZXkgZG9uJ3QgaGF2ZSAtLXZlcnNpb24uCisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICAjIENvdWxkIG5vdCBydW4gLS12ZXJzaW9uIG9yIC0taGVscC4gIFRoaXMgaXMgcHJvYmFibHkgc29tZW9uZQorICAgICAgICMgcnVubmluZyBgJFRPT0wgLS12ZXJzaW9uJyBvciBgJFRPT0wgLS1oZWxwJyB0byBjaGVjayB3aGV0aGVyCisgICAgICAgIyAkVE9PTCBleGlzdHMgYW5kIG5vdCBrbm93aW5nICRUT09MIHVzZXMgbWlzc2luZy4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7Citlc2FjCisKKyMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCisjIHRyeSB0byBlbXVsYXRlIGl0LgorY2FzZSAkcHJvZ3JhbSBpbgorICBhY2xvY2FsKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQorICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHRvdWNoIGFjbG9jYWwubTQKKyAgICA7OworCisgIGF1dG9jb25mKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQorICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKKyAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKKyAgICB0b3VjaF9maWxlcz0KKyAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAorCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKKyAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgICAgdG91Y2ggJHRvdWNoX2ZpbGVzCisgICAgOzsKKworICBhdXRvbWFrZSopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KKyAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgorICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8CisJICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKKwkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKKyAgICA7OworCisgIGF1dG9tNHRlKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCisgICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIjISAvYmluL3NoIgorCWVjaG8gIiMgQ3JlYXRlZCBieSBHTlUgQXV0b21ha2UgbWlzc2luZyBhcyBhIHJlcGxhY2VtZW50IG9mIgorCWVjaG8gIiMgICQgJEAiCisJZWNobyAiZXhpdCAwIgorCWNobW9kICt4ICRmaWxlCisJZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgIGJpc29uKnx5YWNjKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCisgICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9XCR7JCN9CisJY2FzZSAkTEFTVEFSRyBpbgorCSoueSkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgorCWVjaG8gPnkudGFiLmgKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleCp8ZmxleCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiBsZXgueXkuYworICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPVwkeyQjfQorCWNhc2UgJExBU1RBUkcgaW4KKwkqLmwpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKKwkgICAgZmkKKwkgIDs7CisJZXNhYworICAgIGZpCisgICAgaWYgdGVzdCAhIC1mIGxleC55eS5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYworICAgIGZpCisgICAgOzsKKworICBoZWxwMm1hbiopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKwkgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSBvZiBhIG1hbnVhbCBwYWdlLiAgWW91IG1heSBuZWVkIHRoZQorCSBcYEhlbHAybWFuJyBwYWNrYWdlIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UKKwkgZWZmZWN0LiAgWW91IGNhbiBnZXQgXGBIZWxwMm1hbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKKwlleGl0ICQ/CisgICAgZmkKKyAgICA7OworCisgIG1ha2VpbmZvKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKKyAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cworICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKKyAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgorICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICAjIFRoZSBmaWxlIHRvIHRvdWNoIGlzIHRoYXQgc3BlY2lmaWVkIHdpdGggLW8gLi4uCisgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCisgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorICAgICAgIyAuLi4gb3IgaXQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgd2l0aCBAc2V0ZmlsZW5hbWUgLi4uCisgICAgICBpbmZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKKyAgICAgIGZpbGU9YHNlZCAtbiAnCisJL15Ac2V0ZmlsZW5hbWUveworCSAgcy8uKiBcKFteIF0qXCkgKiQvXDEvCisJICBwCisJICBxCisJfScgJGluZmlsZWAKKyAgICAgICMgLi4uIG9yIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIG5hbWUgKGRpci9mLnRleGkgYmVjb21lcyBmLmluZm8pCisgICAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJGluZmlsZSIgfCBzZWQgJ3MsLiovLCw7cywuW14uXSokLCwnYC5pbmZvCisgICAgZmkKKyAgICAjIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgdXNlciByZWFsbHkgbmVlZHMgbWFrZWluZm87CisgICAgIyBsZXQncyBmYWlsIHdpdGhvdXQgdG91Y2hpbmcgYW55dGhpbmcuCisgICAgdGVzdCAtZiAkZmlsZSB8fCBleGl0IDEKKyAgICB0b3VjaCAkZmlsZQorICAgIDs7CisKKyAgKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCisgICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCisgICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQorICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2IyMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQpAQCAtMCwwICsxLDIyNyBAQAorIyBEZWZpbmVzIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWZ1bCBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QgYW5kCisjIEdvb2dsZSBNb2NrLgorIworIyBOb3RlOgorIworIyAtIFRoaXMgZmlsZSB3aWxsIGJlIHJ1biB0d2ljZSB3aGVuIGJ1aWxkaW5nIEdvb2dsZSBNb2NrIChvbmNlIHZpYQorIyAgIEdvb2dsZSBUZXN0J3MgQ01ha2VMaXN0cy50eHQsIGFuZCBvbmNlIHZpYSBHb29nbGUgTW9jaydzKS4KKyMgICBUaGVyZWZvcmUgaXQgc2hvdWxkbid0IGhhdmUgYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIGRlZmluaW5nCisjICAgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLgorIworIyAtIFRoZSBmdW5jdGlvbnMvbWFjcm9zIGRlZmluZWQgaW4gdGhpcyBmaWxlIG1heSBkZXBlbmQgb24gR29vZ2xlCisjICAgVGVzdCBhbmQgR29vZ2xlIE1vY2sncyBvcHRpb24oKSBkZWZpbml0aW9ucywgYW5kIHRodXMgbXVzdCBiZQorIyAgIGNhbGxlZCAqYWZ0ZXIqIHRoZSBvcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLgorCisjIFR3ZWFrcyBDTWFrZSdzIGRlZmF1bHQgY29tcGlsZXIvbGlua2VyIHNldHRpbmdzIHRvIHN1aXQgR29vZ2xlIFRlc3QncyBuZWVkcy4KKyMKKyMgVGhpcyBtdXN0IGJlIGEgbWFjcm8oKSwgYXMgaW5zaWRlIGEgZnVuY3Rpb24gc3RyaW5nKCkgY2FuIG9ubHkKKyMgdXBkYXRlIHZhcmlhYmxlcyBpbiB0aGUgZnVuY3Rpb24gc2NvcGUuCittYWNybyhmaXhfZGVmYXVsdF9jb21waWxlcl9zZXR0aW5nc18pCisgIGlmIChNU1ZDKQorICAgICMgRm9yIE1TVkMsIENNYWtlIHNldHMgY2VydGFpbiBmbGFncyB0byBkZWZhdWx0cyB3ZSB3YW50IHRvIG92ZXJyaWRlLgorICAgICMgVGhpcyByZXBsYWNlbWVudCBjb2RlIGlzIHRha2VuIGZyb20gc2FtcGxlIGluIHRoZSBDTWFrZSBXaWtpIGF0CisgICAgIyBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlX0ZBUSNEeW5hbWljX1JlcGxhY2UuCisgICAgZm9yZWFjaCAoZmxhZ192YXIKKyAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1MgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCisgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX01JTlNJWkVSRUwgQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgICAgaWYgKE5PVCBCVUlMRF9TSEFSRURfTElCUyBBTkQgTk9UIGd0ZXN0X2ZvcmNlX3NoYXJlZF9jcnQpCisgICAgICAgICMgV2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBzaG91bGQgYWxzbyB1c2UKKyAgICAgICAgIyBzaGFyZWQgcnVudGltZSBsaWJyYXJpZXMuICBPdGhlcndpc2UsIGl0IG1heSBlbmQgdXAgd2l0aCBtdWx0aXBsZQorICAgICAgICAjIGNvcGllcyBvZiBydW50aW1lIGxpYnJhcnkgZGF0YSBpbiBkaWZmZXJlbnQgbW9kdWxlcywgcmVzdWx0aW5nIGluCisgICAgICAgICMgaGFyZC10by1maW5kIGNyYXNoZXMuIFdoZW4gaXQgaXMgYnVpbHQgYXMgYSBzdGF0aWMgbGlicmFyeSwgaXQgaXMKKyAgICAgICAgIyBwcmVmZXJhYmxlIHRvIHVzZSBDUlQgYXMgc3RhdGljIGxpYnJhcmllcywgYXMgd2UgZG9uJ3QgaGF2ZSB0byByZWx5CisgICAgICAgICMgb24gQ1JUIERMTHMgYmVpbmcgYXZhaWxhYmxlLiBDTWFrZSBhbHdheXMgZGVmYXVsdHMgdG8gdXNpbmcgc2hhcmVkCisgICAgICAgICMgQ1JUIGxpYnJhcmllcywgc28gd2Ugb3ZlcnJpZGUgdGhhdCBkZWZhdWx0IGhlcmUuCisgICAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICItTVQiICR7ZmxhZ192YXJ9ICIkeyR7ZmxhZ192YXJ9fSIpCisgICAgICBlbmRpZigpCisKKyAgICAgICMgV2UgcHJlZmVyIG1vcmUgc3RyaWN0IHdhcm5pbmcgY2hlY2tpbmcgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0LgorICAgICAgIyBSZXBsYWNlcyAvVzMgd2l0aCAvVzQgaW4gZGVmYXVsdHMuCisgICAgICBzdHJpbmcoUkVQTEFDRSAiL1czIiAiLVc0IiAke2ZsYWdfdmFyfSAiJHske2ZsYWdfdmFyfX0iKQorICAgIGVuZGZvcmVhY2goKQorICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgRGVmaW5lcyB0aGUgY29tcGlsZXIvbGlua2VyIGZsYWdzIHVzZWQgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYW5kCisjIEdvb2dsZSBNb2NrLiAgWW91IGNhbiB0d2VhayB0aGVzZSBkZWZpbml0aW9ucyB0byBzdWl0IHlvdXIgbmVlZC4gIEEKKyMgdmFyaWFibGUncyB2YWx1ZSBpcyBlbXB0eSBiZWZvcmUgaXQncyBleHBsaWNpdGx5IGFzc2lnbmVkIHRvLgorbWFjcm8oY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIpCisgIGlmIChOT1QgZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcykKKyAgICAjIERlZmluZXMgQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQgYW5kIENNQUtFX1RIUkVBRF9MSUJTX0lOSVQuCisgICAgZmluZF9wYWNrYWdlKFRocmVhZHMpCisgIGVuZGlmKCkKKworICBmaXhfZGVmYXVsdF9jb21waWxlcl9zZXR0aW5nc18oKQorICBpZiAoTVNWQykKKyAgICAjIE5ld2xpbmVzIGluc2lkZSBmbGFncyB2YXJpYWJsZXMgYnJlYWsgQ01ha2UncyBOTWFrZSBnZW5lcmF0b3IuCisgICAgIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBBZGQgLVJUQ3MgYW5kIC1SVEN1IHRvIGRlYnVnIGJ1aWxkcy4KKyAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1HUyAtVzQgLVdYIC13ZDQxMjcgLXdkNDI1MSAtd2Q0Mjc1IC1ub2xvZ28gLUogLVppIikKKyAgICBpZiAoTVNWQ19WRVJTSU9OIExFU1MgMTQwMCkKKyAgICAgICMgU3VwcHJlc3Mgc3B1cmlvdXMgd2FybmluZ3MgTVNWQyA3LjEgc29tZXRpbWVzIGlzc3Vlcy4KKyAgICAgICMgRm9yY2luZyB2YWx1ZSB0byBib29sLgorICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0ODAwIikKKyAgICAgICMgQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLgorICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0NTExIC13ZDQ1MTIiKQorICAgICAgIyBDb21wYXRpYmlsaXR5IHdhcm5pbmdzIG5vdCBhcHBsaWNhYmxlIHRvIEdvb2dsZSBUZXN0LgorICAgICAgIyBSZXNvbHZlZCBvdmVybG9hZCB3YXMgZm91bmQgYnkgYXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cC4KKyAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDY3NSIpCisgICAgZW5kaWYoKQorICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURfVU5JQ09ERSAtRFVOSUNPREUgLURXSU4zMiAtRF9XSU4zMiIpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRFNUUklDVCAtRFdJTjMyX0xFQU5fQU5EX01FQU4iKQorICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItRUhzYyAtRF9IQVNfRVhDRVBUSU9OUz0xIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLURfSEFTX0VYQ0VQVElPTlM9MCIpCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItR1ItIikKKyAgZWxzZWlmIChDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItV2FsbCAtV3NoYWRvdyIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZXhjZXB0aW9ucyIpCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1mbm8tZXhjZXB0aW9ucyIpCisgICAgIyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBHQ0MgZG9lc24ndCBkZWZpbmUgYSBtYWNybyB0byBpbmRpY2F0ZQorICAgICMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQuICBUaGVyZWZvcmUgd2UgZGVmaW5lIEdURVNUX0hBU19SVFRJCisgICAgIyBleHBsaWNpdGx5LgorICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLWZuby1ydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCisgICAgc2V0KGN4eF9zdHJpY3RfZmxhZ3MKKyAgICAgICItV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIikKKyAgZWxzZWlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIlN1blBybyIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZWF0dXJlcz1leGNlcHQiKQorICAgICMgU3VuIFBybyBkb2Vzbid0IHByb3ZpZGUgbWFjcm9zIHRvIGluZGljYXRlIHdoZXRoZXIgZXhjZXB0aW9ucyBhbmQKKyAgICAjIFJUVEkgYXJlIGVuYWJsZWQsIHNvIHdlIGRlZmluZSBHVEVTVF9IQVNfKiBleHBsaWNpdGx5LgorICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItZmVhdHVyZXM9bm8lZXhjZXB0IC1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MCIpCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItZmVhdHVyZXM9bm8lcnR0aSAtREdURVNUX0hBU19SVFRJPTAiKQorICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiVmlzdWFsQWdlIiBPUgorICAgICAgQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJYTCIpCisgICAgIyBDTWFrZSAyLjggY2hhbmdlcyBWaXN1YWwgQWdlJ3MgY29tcGlsZXIgSUQgdG8gIlhMIi4KKyAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLXFlaCIpCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1xbm9laCIpCisgICAgIyBVbnRpbCB2ZXJzaW9uIDkuMCwgVmlzdWFsIEFnZSBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIHRvIGluZGljYXRlCisgICAgIyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZC4gIFRoZXJlZm9yZSB3ZSBkZWZpbmUgR1RFU1RfSEFTX1JUVEkKKyAgICAjIGV4cGxpY2l0bHkuCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItcW5vcnR0aSAtREdURVNUX0hBU19SVFRJPTAiKQorICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiSFAiKQorICAgIHNldChjeHhfYmFzZV9mbGFncyAiLUFBIC1tdCIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MSIpCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIitub2VoIC1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MCIpCisgICAgIyBSVFRJIGNhbiBub3QgYmUgZGlzYWJsZWQgaW4gSFAgYUNDIGNvbXBpbGVyLgorICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiIikKKyAgZW5kaWYoKQorCisgIGlmIChDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkgICMgVGhlIHB0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGFuZCBhbGxvd2VkLgorICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURHVEVTVF9IQVNfUFRIUkVBRD0xIikKKyAgZWxzZSgpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtREdURVNUX0hBU19QVEhSRUFEPTAiKQorICBlbmRpZigpCisKKyAgIyBGb3IgYnVpbGRpbmcgZ3Rlc3QncyBvd24gdGVzdHMgYW5kIHNhbXBsZXMuCisgIHNldChjeHhfZXhjZXB0aW9uICIke0NNQUtFX0NYWF9GTEFHU30gJHtjeHhfYmFzZV9mbGFnc30gJHtjeHhfZXhjZXB0aW9uX2ZsYWdzfSIpCisgIHNldChjeHhfbm9fZXhjZXB0aW9uCisgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2N4eF9iYXNlX2ZsYWdzfSAke2N4eF9ub19leGNlcHRpb25fZmxhZ3N9IikKKyAgc2V0KGN4eF9kZWZhdWx0ICIke2N4eF9leGNlcHRpb259IikKKyAgc2V0KGN4eF9ub19ydHRpICIke2N4eF9kZWZhdWx0fSAke2N4eF9ub19ydHRpX2ZsYWdzfSIpCisgIHNldChjeHhfdXNlX293bl90dXBsZSAiJHtjeHhfZGVmYXVsdH0gLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0xIikKKworICAjIEZvciBidWlsZGluZyB0aGUgZ3Rlc3QgbGlicmFyaWVzLgorICBzZXQoY3h4X3N0cmljdCAiJHtjeHhfZGVmYXVsdH0gJHtjeHhfc3RyaWN0X2ZsYWdzfSIpCitlbmRtYWNybygpCisKKyMgRGVmaW5lcyB0aGUgZ3Rlc3QgJiBndGVzdF9tYWluIGxpYnJhcmllcy4gIFVzZXIgdGVzdHMgc2hvdWxkIGxpbmsKKyMgd2l0aCBvbmUgb2YgdGhlbS4KK2Z1bmN0aW9uKGN4eF9saWJyYXJ5X3dpdGhfdHlwZSBuYW1lIHR5cGUgY3h4X2ZsYWdzKQorICAjIHR5cGUgY2FuIGJlIGVpdGhlciBTVEFUSUMgb3IgU0hBUkVEIHRvIGRlbm90ZSBhIHN0YXRpYyBvciBzaGFyZWQgbGlicmFyeS4KKyAgIyBBUkdOIHJlZmVycyB0byBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciAnY3h4X2ZsYWdzJy4KKyAgYWRkX2xpYnJhcnkoJHtuYW1lfSAke3R5cGV9ICR7QVJHTn0pCisgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgUFJPUEVSVElFUworICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpCisgIGlmIChCVUlMRF9TSEFSRURfTElCUyBPUiB0eXBlIFNUUkVRVUFMICJTSEFSRUQiKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlk9MSIpCisgIGVuZGlmKCkKKyAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGJ1aWxkIHRhcmdldHMuCisKK2Z1bmN0aW9uKGN4eF9zaGFyZWRfbGlicmFyeSBuYW1lIGN4eF9mbGFncykKKyAgY3h4X2xpYnJhcnlfd2l0aF90eXBlKCR7bmFtZX0gU0hBUkVEICIke2N4eF9mbGFnc30iICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKGN4eF9saWJyYXJ5IG5hbWUgY3h4X2ZsYWdzKQorICBjeHhfbGlicmFyeV93aXRoX3R5cGUoJHtuYW1lfSAiIiAiJHtjeHhfZmxhZ3N9IiAke0FSR059KQorZW5kZnVuY3Rpb24oKQorCisjIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MobmFtZSBjeHhfZmxhZ3MgbGlicyBzcmNzLi4uKQorIworIyBjcmVhdGVzIGEgbmFtZWQgQysrIGV4ZWN1dGFibGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsaWJyYXJpZXMgYW5kCisjIGlzIGJ1aWx0IGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBjb21waWxlciBmbGFncy4KK2Z1bmN0aW9uKGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MgbmFtZSBjeHhfZmxhZ3MgbGlicykKKyAgYWRkX2V4ZWN1dGFibGUoJHtuYW1lfSAke0FSR059KQorICBpZiAoY3h4X2ZsYWdzKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0ZMQUdTICIke2N4eF9mbGFnc30iKQorICBlbmRpZigpCisgIGlmIChCVUlMRF9TSEFSRURfTElCUykKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfQorICAgICAgUFJPUEVSVElFUworICAgICAgQ09NUElMRV9ERUZJTklUSU9OUyAiR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZPTEiKQorICBlbmRpZigpCisgICMgVG8gc3VwcG9ydCBtaXhpbmcgbGlua2luZyBpbiBzdGF0aWMgYW5kIGR5bmFtaWMgbGlicmFyaWVzLCBsaW5rIGVhY2gKKyAgIyBsaWJyYXJ5IGluIHdpdGggYW4gZXh0cmEgY2FsbCB0byB0YXJnZXRfbGlua19saWJyYXJpZXMuCisgIGZvcmVhY2ggKGxpYiAiJHtsaWJzfSIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtsaWJ9KQorICBlbmRmb3JlYWNoKCkKK2VuZGZ1bmN0aW9uKCkKKworIyBjeHhfZXhlY3V0YWJsZShuYW1lIGRpciBsaWIgc3Jjcy4uLikKKyMKKyMgY3JlYXRlcyBhIG5hbWVkIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzIGJ1aWx0CisjIGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcy4gIGRpci9uYW1lLmNjIGlzIGltcGxpY2l0bHkgaW5jbHVkZWQgaW4KKyMgdGhlIHNvdXJjZSBmaWxlIGxpc3QuCitmdW5jdGlvbihjeHhfZXhlY3V0YWJsZSBuYW1lIGRpciBsaWJzKQorICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKAorICAgICR7bmFtZX0gIiR7Y3h4X2RlZmF1bHR9IiAiJHtsaWJzfSIgIiR7ZGlyfS8ke25hbWV9LmNjIiAke0FSR059KQorZW5kZnVuY3Rpb24oKQorCisjIFNldHMgUFlUSE9OSU5URVJQX0ZPVU5EIGFuZCBQWVRIT05fRVhFQ1VUQUJMRS4KK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnApCisKKyMgY3h4X3Rlc3Rfd2l0aF9mbGFncyhuYW1lIGN4eF9mbGFncyBsaWJzIHNyY3MuLi4pCisjCisjIGNyZWF0ZXMgYSBuYW1lZCBDKysgdGVzdCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzIGJ1aWx0CisjIGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBjb21waWxlciBmbGFncy4KK2Z1bmN0aW9uKGN4eF90ZXN0X3dpdGhfZmxhZ3MgbmFtZSBjeHhfZmxhZ3MgbGlicykKKyAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygke25hbWV9ICIke2N4eF9mbGFnc30iICIke2xpYnN9IiAke0FSR059KQorICBhZGRfdGVzdCgke25hbWV9ICR7bmFtZX0pCitlbmRmdW5jdGlvbigpCisKKyMgY3h4X3Rlc3QobmFtZSBsaWJzIHNyY3MuLi4pCisjCisjIGNyZWF0ZXMgYSBuYW1lZCB0ZXN0IHRhcmdldCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzCisjIGJ1aWx0IGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcy4gIFVubGlrZSBjeHhfdGVzdF93aXRoX2ZsYWdzLAorIyB0ZXN0L25hbWUuY2MgaXMgYWxyZWFkeSBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgZmlsZSBsaXN0LgorZnVuY3Rpb24oY3h4X3Rlc3QgbmFtZSBsaWJzKQorICBjeHhfdGVzdF93aXRoX2ZsYWdzKCIke25hbWV9IiAiJHtjeHhfZGVmYXVsdH0iICIke2xpYnN9IgorICAgICJ0ZXN0LyR7bmFtZX0uY2MiICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKKyMgcHlfdGVzdChuYW1lKQorIworIyBjcmVhdGVzIGEgUHl0aG9uIHRlc3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aG9zZSBtYWluIG1vZHVsZSBpcyBpbgorIyB0ZXN0L25hbWUucHkuICBJdCBkb2VzIG5vdGhpbmcgaWYgUHl0aG9uIGlzIG5vdCBpbnN0YWxsZWQuCitmdW5jdGlvbihweV90ZXN0IG5hbWUpCisgICMgV2UgYXJlIG5vdCBzdXBwb3J0aW5nIFB5dGhvbiB0ZXN0cyBvbiBMaW51eCB5ZXQgYXMgdGhleSBjb25zaWRlcgorICAjIGFsbCBMaW51eCBlbnZpcm9ubWVudHMgdG8gYmUgZ29vZ2xlMyBhbmQgdHJ5IHRvIHVzZSBnb29nbGUzIGZlYXR1cmVzLgorICBpZiAoUFlUSE9OSU5URVJQX0ZPVU5EKQorICAgICMgJHtDTUFLRV9CSU5BUllfRElSfSBpcyBrbm93biBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHNvIHdlIGNhbgorICAgICMgZGlyZWN0bHkgYmluZCBpdCBmcm9tIGNtYWtlLiAke0NURVNUX0NPTkZJR1VSQVRJT05fVFlQRX0gaXMga25vd24KKyAgICAjIG9ubHkgYXQgY3Rlc3QgcnVudGltZSAoYnkgY2FsbGluZyBjdGVzdCAtYyA8Q29uZmlndXJhdGlvbj4pLCBzbworICAgICMgd2UgaGF2ZSB0byBlc2NhcGUgJCB0byBkZWxheSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaGVyZS4KKyAgICBhZGRfdGVzdCgke25hbWV9CisgICAgICAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC8ke25hbWV9LnB5CisgICAgICAgICAgLS1idWlsZF9kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1wke0NURVNUX0NPTkZJR1VSQVRJT05fVFlQRX0pCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3QuY2Jwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jb2RlZ2Vhci9ndGVzdC5jYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMzA1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3QuY2Jwcm9qCkBAIC0wLDAgKzEsMTM4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxQcm9qZWN0R3VpZD57YmNhMzdhNzItNWIwNy00NmNmLWI0NGUtODlmOGUwNjQ1MWEyfTwvUHJvamVjdEd1aWQ+DQorICAgIDxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPlJlbGVhc2U8L0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNlJyBvciAnJChCYXNlKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgICAgPENmZ18yPnRydWU8L0NmZ18yPg0KKyAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD50cnVlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCisgICAgPE91dHB1dEV4dD5saWI8L091dHB1dEV4dD4NCisgICAgPERDQ19DQnVpbGRlck91dHB1dD5KUEhORTwvRENDX0NCdWlsZGVyT3V0cHV0Pg0KKyAgICA8RGVmaW5lcz5OT19TVFJJQ1Q8L0RlZmluZXM+DQorICAgIDxEeW5hbWljUlRMPnRydWU8L0R5bmFtaWNSVEw+DQorICAgIDxVc2VQYWNrYWdlcz50cnVlPC9Vc2VQYWNrYWdlcz4NCisgICAgPFByb2plY3RUeXBlPkNwcFN0YXRpY0xpYnJhcnk8L1Byb2plY3RUeXBlPg0KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+DQorICAgIDxQYWNrYWdlSW1wb3J0cz5ydGwuYnBpO3ZjbC5icGk7YmNiaWUuYnBpO3ZjbHguYnBpO3ZjbGFjdG5iYW5kLmJwaTt4bWxydGwuYnBpO2JjYnNtcC5icGk7ZGJydGwuYnBpO3ZjbGRiLmJwaTtiZGVydGwuYnBpO3ZjbGRieC5icGk7ZHNuYXAuYnBpO2RzbmFwY29uLmJwaTt2Y2xpYi5icGk7aWJ4cHJlc3MuYnBpO2Fkb3J0bC5icGk7ZGJ4Y2RzLmJwaTtkYmV4cHJlc3MuYnBpO0RieENvbW1vbkRyaXZlci5icGk7d2Vic25hcC5icGk7dmNsaWUuYnBpO3dlYmRzbmFwLmJwaTtpbmV0LmJwaTtpbmV0ZGJiZGUuYnBpO2luZXRkYnhwcmVzcy5icGk7c29hcHJ0bC5icGk7UmF2ZTc1VkNMLmJwaTt0ZWVVSS5icGk7dGVlLmJwaTt0ZWVkYi5icGk7SW5keUNvcmUuYnBpO0luZHlTeXN0ZW0uYnBpO0luZHlQcm90b2NvbHMuYnBpO0ludHJhd2ViREJfOTBfMTAwLmJwaTtJbnRyYXdlYl85MF8xMDAuYnBpO2RjbFppcEZvcmdlZDExLmJwaTt2Y2xaaXBGb3JnZWQxMS5icGk7R1IzMl9CRFMyMDA2LmJwaTtHUjMyX0RTR05fQkRTMjAwNi5icGk7SmNsLmJwaTtKY2xWY2wuYnBpO0p2Q29yZUQxMVIuYnBpO0p2U3lzdGVtRDExUi5icGk7SnZTdGRDdHJsc0QxMVIuYnBpO0p2QXBwRnJtRDExUi5icGk7SnZCYW5kc0QxMVIuYnBpO0p2REJEMTFSLmJwaTtKdkRsZ3NEMTFSLmJwaTtKdkJERUQxMVIuYnBpO0p2Q21wRDExUi5icGk7SnZDcnlwdEQxMVIuYnBpO0p2Q3RybHNEMTFSLmJwaTtKdkN1c3RvbUQxMVIuYnBpO0p2RG9ja2luZ0QxMVIuYnBpO0p2RG90TmV0Q3RybHNEMTFSLmJwaTtKdkVESUQxMVIuYnBpO0p2R2xvYnVzRDExUi5icGk7SnZITUlEMTFSLmJwaTtKdkludGVycHJldGVyRDExUi5icGk7SnZKYW5zRDExUi5icGk7SnZNYW5hZ2VkVGhyZWFkc0QxMVIuYnBpO0p2TU1EMTFSLmJwaTtKdk5ldEQxMVIuYnBpO0p2UGFnZUNvbXBzRDExUi5icGk7SnZQbHVnaW5EMTFSLmJwaTtKdlByaW50UHJldmlld0QxMVIuYnBpO0p2UnVudGltZURlc2lnbkQxMVIuYnBpO0p2VGltZUZyYW1ld29ya0QxMVIuYnBpO0p2VmFsaWRhdG9yc0QxMVIuYnBpO0p2V2l6YXJkRDExUi5icGk7SnZYUEN0cmxzRDExUi5icGk7VmNsU21wLmJwaTtDRXhjZXB0aW9uRXhwZXJ0MTEuYnBpPC9QYWNrYWdlSW1wb3J0cz4NCisgICAgPEJDQ193cGFyPmZhbHNlPC9CQ0Nfd3Bhcj4NCisgICAgPEluY2x1ZGVQYXRoPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9JbmNsdWRlUGF0aD4NCisgICAgPEFsbFBhY2thZ2VMaWJzPnJ0bC5saWI7dmNsLmxpYjwvQWxsUGFja2FnZUxpYnM+DQorICAgIDxUTElCX1BhZ2VTaXplPjMyPC9UTElCX1BhZ2VTaXplPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQorICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4NCisgICAgPERDQ19EZWJ1Z0luZm9JbkV4ZT50cnVlPC9EQ0NfRGVidWdJbmZvSW5FeGU+DQorICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KKyAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPg0KKyAgICA8QkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPmZhbHNlPC9CQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+DQorICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPg0KKyAgICA8RENDX0RlZmluZT5ERUJVRzwvRENDX0RlZmluZT4NCisgICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQorICAgIDxUQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz50cnVlPC9UQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz4NCisgICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+DQorICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxkZWJ1ZzskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQorICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4NCisgICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4NCisgICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+UmVsZWFzZTwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KKyAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZT5DcHBTdGF0aWNMaWJyYXJ5PC9Cb3JsYW5kLlByb2plY3RUeXBlPg0KKyAgICA8Qm9ybGFuZFByb2plY3Q+DQorPEJvcmxhbmRQcm9qZWN0PjxDUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjxWZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPjwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyI+PC9WZXJzaW9uSW5mb0tleXM+PC9WZXJzaW9uSW5mb0tleXM+PERlYnVnZ2luZz48RGVidWdnaW5nIE5hbWU9IkRlYnVnU291cmNlRGlycyI+PC9EZWJ1Z2dpbmc+PC9EZWJ1Z2dpbmc+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUnVuUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iRGVidWdDV0QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJIb3N0QXBwbGljYXRpb24iPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVIb3N0Ij48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGF0aCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZVBhcmFtcyI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUxhdW5jaGVyIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iVXNlUmVtb3RlTGF1bmNoZXIiPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUNXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZURlYnVnIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1ZyBTeW1ib2xzIFNlYXJjaCBQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZEFsbFN5bWJvbHMiPlRydWU8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZFVuc3BlY2lmaWVkU3ltYm9scyI+RmFsc2U8L1BhcmFtZXRlcnM+PC9QYXJhbWV0ZXJzPjxFeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICANCisgICAgICANCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2UyazEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIDIwMDAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2V4cDEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIFhQIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+DQorICAgIDwvRXhjbHVkZWRfUGFja2FnZXM+PExpbmtlcj48TGlua2VyIE5hbWU9IkxpYlByZWZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJTdWZmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliVmVyc2lvbiI+PC9MaW5rZXI+PC9MaW5rZXI+PFByb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJBdXRvU2hvd0RlcHMiPkZhbHNlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iTWFuYWdlUGF0aHMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJWZXJpZnlQYWNrYWdlcyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PC9Qcm9qZWN0UHJvcGVydGllcz48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9IkNvdW50Ij4zPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxzcmM7Li5caW5jbHVkZTwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0wIj4zMjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZSBOYW1lPSJJdGVtMSI+MTY8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjwvQ1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkNwcC5UYXJnZXRzIiAvPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1kZWF0aC10ZXN0LmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjM8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1tZXNzYWdlLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjQ8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1wYXJhbS10ZXN0LmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjU8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1zcGkuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+NjwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXRlc3QtcGFydC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj43PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3QtdHlwZWQtdGVzdC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj44PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3QuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MDwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0X3ByZWRfaW1wbC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xPC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3RfcHJvZC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4yPC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj45PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtZmlsZXBhdGguaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTA8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1pbnRlcm5hbC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xMTwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LWxpbmtlZF9wdHIuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTI8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xNDwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBhcmFtLXV0aWwuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTM8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1wb3J0LmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE1PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3Qtc3RyaW5nLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE2PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtdHlwZS11dGlsLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE3PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Imd0ZXN0X2FsbC5jYyI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTg8L0J1aWxkT3JkZXI+DQorICAgIDwvQ3BwQ29tcGlsZT4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+DQorICAgICAgPEtleT5DZmdfMTwvS2V5Pg0KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4NCisgICAgICA8S2V5PkNmZ18yPC9LZXk+DQorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jb2RlZ2Vhci9ndGVzdC5ncm91cHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMzFjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qCkBAIC0wLDAgKzEsNTQgQEAKK++7vzxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxQcm9qZWN0R3VpZD57YzFkOTIzZTAtNmNiYS00MzMyLTliNmYtMzQyMGFjYmY1MDkxfTwvUHJvamVjdEd1aWQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwIC8+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdHMgSW5jbHVkZT0iZ3Rlc3QuY2Jwcm9qIiAvPg0KKyAgICA8UHJvamVjdHMgSW5jbHVkZT0iZ3Rlc3RfbWFpbi5jYnByb2oiIC8+DQorICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJndGVzdF91bml0dGVzdC5jYnByb2oiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eTwvQm9ybGFuZC5QZXJzb25hbGl0eT4NCisgICAgPEJvcmxhbmQuUHJvamVjdFR5cGUgLz4NCisgICAgPEJvcmxhbmRQcm9qZWN0Pg0KKzxCb3JsYW5kUHJvamVjdCB4bWxucz0iIj48RGVmYXVsdC5QZXJzb25hbGl0eT48L0RlZmF1bHQuUGVyc29uYWxpdHk+PC9Cb3JsYW5kUHJvamVjdD48L0JvcmxhbmRQcm9qZWN0Pg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3QiPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3QuY2Jwcm9qIiBUYXJnZXRzPSIiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3Q6Q2xlYW4iPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3QuY2Jwcm9qIiBUYXJnZXRzPSJDbGVhbiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdDpNYWtlIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iTWFrZSIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdF9tYWluIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X21haW4uY2Jwcm9qIiBUYXJnZXRzPSIiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfbWFpbjpDbGVhbiI+DQorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdF9tYWluLmNicHJvaiIgVGFyZ2V0cz0iQ2xlYW4iIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfbWFpbjpNYWtlIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X21haW4uY2Jwcm9qIiBUYXJnZXRzPSJNYWtlIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X3VuaXR0ZXN0Ij4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X3VuaXR0ZXN0OkNsZWFuIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iQ2xlYW4iIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfdW5pdHRlc3Q6TWFrZSI+DQorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdF91bml0dGVzdC5jYnByb2oiIFRhcmdldHM9Ik1ha2UiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQnVpbGQiPg0KKyAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJndGVzdDtndGVzdF9tYWluO2d0ZXN0X3VuaXR0ZXN0IiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkNsZWFuIj4NCisgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iZ3Rlc3Q6Q2xlYW47Z3Rlc3RfbWFpbjpDbGVhbjtndGVzdF91bml0dGVzdDpDbGVhbiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJNYWtlIj4NCisgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iZ3Rlc3Q6TWFrZTtndGVzdF9tYWluOk1ha2U7Z3Rlc3RfdW5pdHRlc3Q6TWFrZSIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkQmluUGF0aClcQm9ybGFuZC5Hcm91cC5UYXJnZXRzJykiIFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuR3JvdXAuVGFyZ2V0cyIgLz4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9hbGwuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X2FsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFiMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9hbGwuY2MKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKy8vDQorLy8gQXV0aG9yOiBKb3NoIEtlbGxleSAoam9zaGtlbEBnbWFpbC5jb20pDQorLy8NCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkNCisvLw0KKy8vIEMrK0J1aWxkZXIncyBJREUgY2Fubm90IGJ1aWxkIGEgc3RhdGljIGxpYnJhcnkgZnJvbSBmaWxlcyB3aXRoIGh5cGhlbnMNCisvLyBpbiB0aGVpciBuYW1lLiAgU2VlIGh0dHA6Ly9xYy5jb2RlZ2Vhci5jb20vd2MvcWNtYWluLmFzcHg/ZD03MDk3NyAuDQorLy8gVGhpcyBmaWxlIHNlcnZlcyBhcyBhIHdvcmthcm91bmQuDQorDQorI2luY2x1ZGUgInNyYy9ndGVzdC1hbGwuY2MiDQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9saW5rLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9saW5rLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOGVjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X2xpbmsuY2MKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuDQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKy8vDQorLy8gQXV0aG9yOiBKb3NoIEtlbGxleSAoam9zaGtlbEBnbWFpbC5jb20pDQorLy8NCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkNCisvLw0KKy8vIExpbmtzIGd0ZXN0LmxpYiBhbmQgZ3Rlc3RfbWFpbi5saWIgaW50byB0aGUgY3VycmVudCBwcm9qZWN0IGluIEMrK0J1aWxkZXIuDQorLy8gVGhpcyBtZWFucyB0aGF0IHRoZXNlIGxpYnJhcmllcyBjYW4ndCBiZSByZW5hbWVkLCBidXQgaXQncyB0aGUgb25seSB3YXkgdG8NCisvLyBlbnN1cmUgdGhhdCBEZWJ1ZyB2ZXJzdXMgUmVsZWFzZSB0ZXN0IGJ1aWxkcyBhcmUgbGlua2VkIGFnYWluc3QgdGhlDQorLy8gYXBwcm9wcmlhdGUgRGVidWcgb3IgUmVsZWFzZSBidWlsZCBvZiB0aGUgbGlicmFyaWVzLg0KKw0KKyNwcmFnbWEgbGluayAiZ3Rlc3QubGliIg0KKyNwcmFnbWEgbGluayAiZ3Rlc3RfbWFpbi5saWIiDQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2Y2UxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2oKQEAgLTAsMCArMSw4MiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8UHJvamVjdEd1aWQ+e2JjYTM3YTcyLTViMDctNDZjZi1iNDRlLTg5ZjhlMDY0NTFhMn08L1Byb2plY3RHdWlkPg0KKyAgICA8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5SZWxlYXNlPC9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzZScgb3IgJyQoQmFzZSknIT0nJyI+DQorICAgIDxCYXNlPnRydWU8L0Jhc2U+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgICAgPENmZ18xPnRydWU8L0NmZ18xPg0KKyAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+DQorICAgIDxCYXNlPnRydWU8L0Jhc2U+DQorICAgIDxDZmdfMj50cnVlPC9DZmdfMj4NCisgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJhc2UpJyE9JyciPg0KKyAgICA8QkNDX09wdGltaXplRm9yU3BlZWQ+dHJ1ZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQorICAgIDxPdXRwdXRFeHQ+bGliPC9PdXRwdXRFeHQ+DQorICAgIDxEQ0NfQ0J1aWxkZXJPdXRwdXQ+SlBITkU8L0RDQ19DQnVpbGRlck91dHB1dD4NCisgICAgPERlZmluZXM+Tk9fU1RSSUNUPC9EZWZpbmVzPg0KKyAgICA8RHluYW1pY1JUTD50cnVlPC9EeW5hbWljUlRMPg0KKyAgICA8VXNlUGFja2FnZXM+dHJ1ZTwvVXNlUGFja2FnZXM+DQorICAgIDxQcm9qZWN0VHlwZT5DcHBTdGF0aWNMaWJyYXJ5PC9Qcm9qZWN0VHlwZT4NCisgICAgPEJDQ19DUFBDb21waWxlQWx3YXlzPnRydWU8L0JDQ19DUFBDb21waWxlQWx3YXlzPg0KKyAgICA8UGFja2FnZUltcG9ydHM+cnRsLmJwaTt2Y2wuYnBpO2JjYmllLmJwaTt2Y2x4LmJwaTt2Y2xhY3RuYmFuZC5icGk7eG1scnRsLmJwaTtiY2JzbXAuYnBpO2RicnRsLmJwaTt2Y2xkYi5icGk7YmRlcnRsLmJwaTt2Y2xkYnguYnBpO2RzbmFwLmJwaTtkc25hcGNvbi5icGk7dmNsaWIuYnBpO2lieHByZXNzLmJwaTthZG9ydGwuYnBpO2RieGNkcy5icGk7ZGJleHByZXNzLmJwaTtEYnhDb21tb25Ecml2ZXIuYnBpO3dlYnNuYXAuYnBpO3ZjbGllLmJwaTt3ZWJkc25hcC5icGk7aW5ldC5icGk7aW5ldGRiYmRlLmJwaTtpbmV0ZGJ4cHJlc3MuYnBpO3NvYXBydGwuYnBpO1JhdmU3NVZDTC5icGk7dGVlVUkuYnBpO3RlZS5icGk7dGVlZGIuYnBpO0luZHlDb3JlLmJwaTtJbmR5U3lzdGVtLmJwaTtJbmR5UHJvdG9jb2xzLmJwaTtJbnRyYXdlYkRCXzkwXzEwMC5icGk7SW50cmF3ZWJfOTBfMTAwLmJwaTtkY2xaaXBGb3JnZWQxMS5icGk7dmNsWmlwRm9yZ2VkMTEuYnBpO0dSMzJfQkRTMjAwNi5icGk7R1IzMl9EU0dOX0JEUzIwMDYuYnBpO0pjbC5icGk7SmNsVmNsLmJwaTtKdkNvcmVEMTFSLmJwaTtKdlN5c3RlbUQxMVIuYnBpO0p2U3RkQ3RybHNEMTFSLmJwaTtKdkFwcEZybUQxMVIuYnBpO0p2QmFuZHNEMTFSLmJwaTtKdkRCRDExUi5icGk7SnZEbGdzRDExUi5icGk7SnZCREVEMTFSLmJwaTtKdkNtcEQxMVIuYnBpO0p2Q3J5cHREMTFSLmJwaTtKdkN0cmxzRDExUi5icGk7SnZDdXN0b21EMTFSLmJwaTtKdkRvY2tpbmdEMTFSLmJwaTtKdkRvdE5ldEN0cmxzRDExUi5icGk7SnZFRElEMTFSLmJwaTtKdkdsb2J1c0QxMVIuYnBpO0p2SE1JRDExUi5icGk7SnZJbnRlcnByZXRlckQxMVIuYnBpO0p2SmFuc0QxMVIuYnBpO0p2TWFuYWdlZFRocmVhZHNEMTFSLmJwaTtKdk1NRDExUi5icGk7SnZOZXREMTFSLmJwaTtKdlBhZ2VDb21wc0QxMVIuYnBpO0p2UGx1Z2luRDExUi5icGk7SnZQcmludFByZXZpZXdEMTFSLmJwaTtKdlJ1bnRpbWVEZXNpZ25EMTFSLmJwaTtKdlRpbWVGcmFtZXdvcmtEMTFSLmJwaTtKdlZhbGlkYXRvcnNEMTFSLmJwaTtKdldpemFyZEQxMVIuYnBpO0p2WFBDdHJsc0QxMVIuYnBpO1ZjbFNtcC5icGk7Q0V4Y2VwdGlvbkV4cGVydDExLmJwaTwvUGFja2FnZUltcG9ydHM+DQorICAgIDxCQ0Nfd3Bhcj5mYWxzZTwvQkNDX3dwYXI+DQorICAgIDxJbmNsdWRlUGF0aD4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxzcmM7Li5caW5jbHVkZTsuLjwvSW5jbHVkZVBhdGg+DQorICAgIDxBbGxQYWNrYWdlTGlicz5ydGwubGliO3ZjbC5saWI8L0FsbFBhY2thZ2VMaWJzPg0KKyAgICA8VExJQl9QYWdlU2l6ZT4zMjwvVExJQl9QYWdlU2l6ZT4NCisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPg0KKyAgICA8QkNDX09wdGltaXplRm9yU3BlZWQ+ZmFsc2U8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KKyAgICA8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+DQorICAgIDxEQ0NfRGVidWdJbmZvSW5FeGU+dHJ1ZTwvRENDX0RlYnVnSW5mb0luRXhlPg0KKyAgICA8RGVmaW5lcz5fREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4NCisgICAgPElMSU5LX0Z1bGxEZWJ1Z0luZm8+dHJ1ZTwvSUxJTktfRnVsbERlYnVnSW5mbz4NCisgICAgPEJDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5mYWxzZTwvQkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICA8SUxJTktfRGlzYWJsZUluY3JlbWVudGFsTGlua2luZz50cnVlPC9JTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPg0KKyAgICA8QkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPk5vbmU8L0JDQ19Vc2VSZWdpc3RlclZhcmlhYmxlcz4NCisgICAgPERDQ19EZWZpbmU+REVCVUc8L0RDQ19EZWZpbmU+DQorICAgIDxCQ0NfRGVidWdMaW5lTnVtYmVycz50cnVlPC9CQ0NfRGVidWdMaW5lTnVtYmVycz4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dERpcj5EZWJ1ZzwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KKyAgICA8VEFTTV9EaXNwbGF5U291cmNlTGluZXM+dHJ1ZTwvVEFTTV9EaXNwbGF5U291cmNlTGluZXM+DQorICAgIDxCQ0NfU3RhY2tGcmFtZXM+dHJ1ZTwvQkNDX1N0YWNrRnJhbWVzPg0KKyAgICA8QkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPnRydWU8L0JDQ19EaXNhYmxlT3B0aW1pemF0aW9ucz4NCisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWJcZGVidWc7JChJTElOS19MaWJyYXJ5UGF0aCk8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgICA8VEFTTV9EZWJ1Z2dpbmc+RnVsbDwvVEFTTV9EZWJ1Z2dpbmc+DQorICAgIDxCQ0NfU291cmNlRGVidWdnaW5nT24+dHJ1ZTwvQkNDX1NvdXJjZURlYnVnZ2luZ09uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+DQorICAgIDxEZWZpbmVzPk5ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPlJlbGVhc2U8L0ludGVybWVkaWF0ZU91dHB1dERpcj4NCisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWJccmVsZWFzZTskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQorICAgIDxUQVNNX0RlYnVnZ2luZz5Ob25lPC9UQVNNX0RlYnVnZ2luZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+Q1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eTwvQm9ybGFuZC5QZXJzb25hbGl0eT4NCisgICAgPEJvcmxhbmQuUHJvamVjdFR5cGU+Q3BwU3RhdGljTGlicmFyeTwvQm9ybGFuZC5Qcm9qZWN0VHlwZT4NCisgICAgPEJvcmxhbmRQcm9qZWN0Pg0KKzxCb3JsYW5kUHJvamVjdD48Q1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48VmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4wPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz48L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiPjwvVmVyc2lvbkluZm9LZXlzPjwvVmVyc2lvbkluZm9LZXlzPjxEZWJ1Z2dpbmc+PERlYnVnZ2luZyBOYW1lPSJEZWJ1Z1NvdXJjZURpcnMiPjwvRGVidWdnaW5nPjwvRGVidWdnaW5nPjxQYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJ1blBhcmFtcyI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkxhdW5jaGVyIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iVXNlTGF1bmNoZXIiPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iSG9zdEFwcGxpY2F0aW9uIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlSG9zdCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZVBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZVJlbW90ZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVDV0QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVEZWJ1ZyI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iRGVidWcgU3ltYm9scyBTZWFyY2ggUGF0aCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkxvYWRBbGxTeW1ib2xzIj5UcnVlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkxvYWRVbnNwZWNpZmllZFN5bWJvbHMiPkZhbHNlPC9QYXJhbWV0ZXJzPjwvUGFyYW1ldGVycz48RXhjbHVkZWRfUGFja2FnZXM+DQorICAgICAgPEV4Y2x1ZGVkX1BhY2thZ2VzIE5hbWU9IiQoQkRTKVxiaW5cYmNib2ZmaWNlMmsxMDAuYnBsIj5Db2RlR2VhciBDKytCdWlsZGVyIE9mZmljZSAyMDAwIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+DQorICAgICAgPEV4Y2x1ZGVkX1BhY2thZ2VzIE5hbWU9IiQoQkRTKVxiaW5cYmNib2ZmaWNleHAxMDAuYnBsIj5Db2RlR2VhciBDKytCdWlsZGVyIE9mZmljZSBYUCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICA8L0V4Y2x1ZGVkX1BhY2thZ2VzPjxMaW5rZXI+PExpbmtlciBOYW1lPSJMaWJQcmVmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliU3VmZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlZlcnNpb24iPjwvTGlua2VyPjwvTGlua2VyPjxQcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iQXV0b1Nob3dEZXBzIj5GYWxzZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9Ik1hbmFnZVBhdGhzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iVmVyaWZ5UGFja2FnZXMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjwvUHJvamVjdFByb3BlcnRpZXM+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJDb3VudCI+MzwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0wIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxzcmM7Li5caW5jbHVkZTsuLjwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0xIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxzcmM7Li5caW5jbHVkZTsuLjwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0yIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxzcmM7Li5cc3JjOy4uXGluY2x1ZGU8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJDb3VudCI+MTwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9Ikl0ZW0wIj4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcyBOYW1lPSJDb3VudCI+MTwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcyBOYW1lPSJJdGVtMCI+Tk9fU1RSSUNUPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZSBOYW1lPSJDb3VudCI+MTwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZSBOYW1lPSJJdGVtMCI+MzI8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iSXRlbTEiPjE2PC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48L0NQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PC9Cb3JsYW5kUHJvamVjdD48L0JvcmxhbmRQcm9qZWN0Pg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcQm9ybGFuZC5DcHAuVGFyZ2V0cyIgLz4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Ii4uXHNyY1xndGVzdF9tYWluLmNjIj4NCisgICAgICA8QnVpbGRPcmRlcj4wPC9CdWlsZE9yZGVyPg0KKyAgICA8L0NwcENvbXBpbGU+DQorICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPg0KKyAgICAgIDxLZXk+Q2ZnXzE8L0tleT4NCisgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+DQorICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+DQorICAgICAgPEtleT5DZmdfMjwvS2V5Pg0KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X3VuaXR0ZXN0LmNicHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWRiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X3VuaXR0ZXN0LmNicHJvagpAQCAtMCwwICsxLDg4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxQcm9qZWN0R3VpZD57ZWVhNjMzOTMtNWFjNS00YjljLTg5MDktZDc1ZmVmMmRhYTQxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPlJlbGVhc2U8L0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNlJyBvciAnJChCYXNlKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgICAgPENmZ18yPnRydWU8L0NmZ18yPg0KKyAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+DQorICAgIDxPdXRwdXRFeHQ+ZXhlPC9PdXRwdXRFeHQ+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD50cnVlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCisgICAgPERlZmluZXM+Tk9fU1RSSUNUPC9EZWZpbmVzPg0KKyAgICA8RENDX0NCdWlsZGVyT3V0cHV0PkpQSE5FPC9EQ0NfQ0J1aWxkZXJPdXRwdXQ+DQorICAgIDxEeW5hbWljUlRMPnRydWU8L0R5bmFtaWNSVEw+DQorICAgIDxJTElOS19PYmplY3RTZWFyY2hQYXRoPi4uXHRlc3Q8L0lMSU5LX09iamVjdFNlYXJjaFBhdGg+DQorICAgIDxVc2VQYWNrYWdlcz50cnVlPC9Vc2VQYWNrYWdlcz4NCisgICAgPFByb2plY3RUeXBlPkNwcENvbnNvbGVBcHBsaWNhdGlvbjwvUHJvamVjdFR5cGU+DQorICAgIDxOb1ZDTD50cnVlPC9Ob1ZDTD4NCisgICAgPEJDQ19DUFBDb21waWxlQWx3YXlzPnRydWU8L0JDQ19DUFBDb21waWxlQWx3YXlzPg0KKyAgICA8UGFja2FnZUltcG9ydHM+cnRsLmJwaTt2Y2wuYnBpO2JjYmllLmJwaTt2Y2x4LmJwaTt2Y2xhY3RuYmFuZC5icGk7eG1scnRsLmJwaTtiY2JzbXAuYnBpO2RicnRsLmJwaTt2Y2xkYi5icGk7YmRlcnRsLmJwaTt2Y2xkYnguYnBpO2RzbmFwLmJwaTtkc25hcGNvbi5icGk7dmNsaWIuYnBpO2lieHByZXNzLmJwaTthZG9ydGwuYnBpO2RieGNkcy5icGk7ZGJleHByZXNzLmJwaTtEYnhDb21tb25Ecml2ZXIuYnBpO3dlYnNuYXAuYnBpO3ZjbGllLmJwaTt3ZWJkc25hcC5icGk7aW5ldC5icGk7aW5ldGRiYmRlLmJwaTtpbmV0ZGJ4cHJlc3MuYnBpO3NvYXBydGwuYnBpO1JhdmU3NVZDTC5icGk7dGVlVUkuYnBpO3RlZS5icGk7dGVlZGIuYnBpO0luZHlDb3JlLmJwaTtJbmR5U3lzdGVtLmJwaTtJbmR5UHJvdG9jb2xzLmJwaTtJbnRyYXdlYkRCXzkwXzEwMC5icGk7SW50cmF3ZWJfOTBfMTAwLmJwaTtKY2wuYnBpO0pjbFZjbC5icGk7SnZDb3JlRDExUi5icGk7SnZTeXN0ZW1EMTFSLmJwaTtKdlN0ZEN0cmxzRDExUi5icGk7SnZBcHBGcm1EMTFSLmJwaTtKdkJhbmRzRDExUi5icGk7SnZEQkQxMVIuYnBpO0p2RGxnc0QxMVIuYnBpO0p2QkRFRDExUi5icGk7SnZDbXBEMTFSLmJwaTtKdkNyeXB0RDExUi5icGk7SnZDdHJsc0QxMVIuYnBpO0p2Q3VzdG9tRDExUi5icGk7SnZEb2NraW5nRDExUi5icGk7SnZEb3ROZXRDdHJsc0QxMVIuYnBpO0p2RURJRDExUi5icGk7SnZHbG9idXNEMTFSLmJwaTtKdkhNSUQxMVIuYnBpO0p2SW50ZXJwcmV0ZXJEMTFSLmJwaTtKdkphbnNEMTFSLmJwaTtKdk1hbmFnZWRUaHJlYWRzRDExUi5icGk7SnZNTUQxMVIuYnBpO0p2TmV0RDExUi5icGk7SnZQYWdlQ29tcHNEMTFSLmJwaTtKdlBsdWdpbkQxMVIuYnBpO0p2UHJpbnRQcmV2aWV3RDExUi5icGk7SnZSdW50aW1lRGVzaWduRDExUi5icGk7SnZUaW1lRnJhbWV3b3JrRDExUi5icGk7SnZWYWxpZGF0b3JzRDExUi5icGk7SnZXaXphcmREMTFSLmJwaTtKdlhQQ3RybHNEMTFSLmJwaTtWY2xTbXAuYnBpPC9QYWNrYWdlSW1wb3J0cz4NCisgICAgPEJDQ193cGFyPmZhbHNlPC9CQ0Nfd3Bhcj4NCisgICAgPEluY2x1ZGVQYXRoPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXGluY2x1ZGU7Li5cdGVzdDsuLjwvSW5jbHVkZVBhdGg+DQorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazsuLlx0ZXN0PC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPE11bHRpdGhyZWFkZWQ+dHJ1ZTwvTXVsdGl0aHJlYWRlZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPg0KKyAgICA8QkNDX09wdGltaXplRm9yU3BlZWQ+ZmFsc2U8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KKyAgICA8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+DQorICAgIDxEQ0NfRGVidWdJbmZvSW5FeGU+dHJ1ZTwvRENDX0RlYnVnSW5mb0luRXhlPg0KKyAgICA8RGVmaW5lcz5fREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4NCisgICAgPElMSU5LX0Z1bGxEZWJ1Z0luZm8+dHJ1ZTwvSUxJTktfRnVsbERlYnVnSW5mbz4NCisgICAgPEJDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5mYWxzZTwvQkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICA8SUxJTktfRGlzYWJsZUluY3JlbWVudGFsTGlua2luZz50cnVlPC9JTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPg0KKyAgICA8QkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPk5vbmU8L0JDQ19Vc2VSZWdpc3RlclZhcmlhYmxlcz4NCisgICAgPERDQ19EZWZpbmU+REVCVUc8L0RDQ19EZWZpbmU+DQorICAgIDxCQ0NfRGVidWdMaW5lTnVtYmVycz50cnVlPC9CQ0NfRGVidWdMaW5lTnVtYmVycz4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dERpcj5EZWJ1ZzwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KKyAgICA8VEFTTV9EaXNwbGF5U291cmNlTGluZXM+dHJ1ZTwvVEFTTV9EaXNwbGF5U291cmNlTGluZXM+DQorICAgIDxCQ0NfU3RhY2tGcmFtZXM+dHJ1ZTwvQkNDX1N0YWNrRnJhbWVzPg0KKyAgICA8QkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPnRydWU8L0JDQ19EaXNhYmxlT3B0aW1pemF0aW9ucz4NCisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWJcZGVidWc7JChJTElOS19MaWJyYXJ5UGF0aCk8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgICA8VEFTTV9EZWJ1Z2dpbmc+RnVsbDwvVEFTTV9EZWJ1Z2dpbmc+DQorICAgIDxCQ0NfU291cmNlRGVidWdnaW5nT24+dHJ1ZTwvQkNDX1NvdXJjZURlYnVnZ2luZ09uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+DQorICAgIDxEZWZpbmVzPk5ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPlJlbGVhc2U8L0ludGVybWVkaWF0ZU91dHB1dERpcj4NCisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWJccmVsZWFzZTskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQorICAgIDxUQVNNX0RlYnVnZ2luZz5Ob25lPC9UQVNNX0RlYnVnZ2luZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+Q1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eTwvQm9ybGFuZC5QZXJzb25hbGl0eT4NCisgICAgPEJvcmxhbmQuUHJvamVjdFR5cGU+Q3BwQ29uc29sZUFwcGxpY2F0aW9uPC9Cb3JsYW5kLlByb2plY3RUeXBlPg0KKyAgICA8Qm9ybGFuZFByb2plY3Q+DQorPEJvcmxhbmRQcm9qZWN0PjxDUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjxWZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPjwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyI+PC9WZXJzaW9uSW5mb0tleXM+PC9WZXJzaW9uSW5mb0tleXM+PERlYnVnZ2luZz48RGVidWdnaW5nIE5hbWU9IkRlYnVnU291cmNlRGlycyI+PC9EZWJ1Z2dpbmc+PC9EZWJ1Z2dpbmc+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUnVuUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iRGVidWdDV0QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJIb3N0QXBwbGljYXRpb24iPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVIb3N0Ij48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGF0aCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZVBhcmFtcyI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUxhdW5jaGVyIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iVXNlUmVtb3RlTGF1bmNoZXIiPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUNXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZURlYnVnIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1ZyBTeW1ib2xzIFNlYXJjaCBQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZEFsbFN5bWJvbHMiPlRydWU8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZFVuc3BlY2lmaWVkU3ltYm9scyI+RmFsc2U8L1BhcmFtZXRlcnM+PC9QYXJhbWV0ZXJzPjxFeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICANCisgICAgICANCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2UyazEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIDIwMDAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2V4cDEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIFhQIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+DQorICAgIDwvRXhjbHVkZWRfUGFja2FnZXM+PExpbmtlcj48TGlua2VyIE5hbWU9IkxpYlByZWZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJTdWZmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliVmVyc2lvbiI+PC9MaW5rZXI+PC9MaW5rZXI+PFByb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJBdXRvU2hvd0RlcHMiPkZhbHNlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iTWFuYWdlUGF0aHMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJWZXJpZnlQYWNrYWdlcyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PC9Qcm9qZWN0UHJvcGVydGllcz48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9IkNvdW50Ij4zPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXGluY2x1ZGU7Li5cdGVzdDsuLjwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0xIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxpbmNsdWRlOy4uXHRlc3Q8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMiI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOy4uXHRlc3Q8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMSI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9Ikl0ZW0yIj4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazskKE9VVFBVVERJUik7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcyBOYW1lPSJDb3VudCI+MjwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48SGlzdG9yeUxpc3RzX2hsRGVmaW5lcyBOYW1lPSJJdGVtMCI+Tk9fU1RSSUNUPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0xIj5TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjwvQ1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkNwcC5UYXJnZXRzIiAvPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENwcENvbXBpbGUgSW5jbHVkZT0iLi5cdGVzdFxndGVzdF91bml0dGVzdC5jYyI+DQorICAgICAgPEJ1aWxkT3JkZXI+MDwvQnVpbGRPcmRlcj4NCisgICAgPC9DcHBDb21waWxlPg0KKyAgICA8Q3BwQ29tcGlsZSBJbmNsdWRlPSJndGVzdF9saW5rLmNjIj4NCisgICAgICA8QnVpbGRPcmRlcj4xPC9CdWlsZE9yZGVyPg0KKyAgICA8L0NwcENvbXBpbGU+DQorICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPg0KKyAgICAgIDxLZXk+Q2ZnXzE8L0tleT4NCisgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+DQorICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+DQorICAgICAgPEtleT5DZmdfMjwvS2V5Pg0KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvbmZpZ3VyZSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliZmFjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvbmZpZ3VyZQpAQCAtMCwwICsxLDE4MjIyIEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OCBmb3IgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAxLjYuMC4KKyMKKyMgUmVwb3J0IGJ1Z3MgdG8gPGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbT4uCisjCisjCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4KKyMKKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisiCisgIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Cithc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KK2FzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQorCitleGl0Y29kZT0wCithc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9CitpZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6CisKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCisKKyAgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cJHtCQVNIX1ZFUlNJT04rc2V0fVwiIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKyAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITworICAgIEVDSE89XCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgXCJYXGBwcmludGYgJXMgXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiIFxcCisgICAgICB8fCB0ZXN0IFwiWFxgcHJpbnQgLXIgLS0gXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiICkgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorCitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2ZvdW5kPWZhbHNlCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGFzX2ZvdW5kPToKKyAgY2FzZSAkYXNfZGlyIGluICMoCisJIC8qKQorCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KKwkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCisJCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGJyZWFrIDIKK2ZpCitmaQorCSAgIGRvbmU7OworICAgICAgIGVzYWMKKyAgYXNfZm91bmQ9ZmFsc2UKK2RvbmUKKyRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcworZmk7IH0KK0lGUz0kYXNfc2F2ZV9JRlMKKworCisgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6CisgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisJIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKwkjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorCSMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KKwlCQVNIX0VOVj0vZGV2L251bGwKKwlFTlY9L2Rldi9udWxsCisJKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCisJZXhwb3J0IENPTkZJR19TSEVMTAorCWNhc2UgJC0gaW4gIyAoKCgoCisJICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKwkgICp2KiApIGFzX29wdHM9LXYgOzsKKwkgICp4KiApIGFzX29wdHM9LXggOzsKKwkgICogKSBhc19vcHRzPSA7OworCWVzYWMKKwlleGVjICIkQ09ORklHX1NIRUxMIiAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CitmaQorCisgICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgorICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCisgICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgorICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgorICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgorICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKKyAgZWxzZQorICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYW5kCiskMDogZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGFib3V0IHlvdXIgc3lzdGVtLAorJDA6IGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCiskMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KKyQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgorICBmaQorICBleGl0IDEKK2ZpCitmaQorZmkKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitleHBvcnQgU0hFTEwKKyMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgorQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KK3Vuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTworICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgeworICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KKyAgICAgIE4KKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKyAgICAgIHQgbG9vcAorICAgICAgcy8tXG4uKi8vCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKKwordGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAorZXhlYyA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0nR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaycKK1BBQ0tBR0VfVEFSTkFNRT0nZ3Rlc3QnCitQQUNLQUdFX1ZFUlNJT049JzEuNi4wJworUEFDS0FHRV9TVFJJTkc9J0dvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgMS42LjAnCitQQUNLQUdFX0JVR1JFUE9SVD0nZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tJworUEFDS0FHRV9VUkw9JycKKworYWNfdW5pcXVlX2ZpbGU9Ii4vTElDRU5TRSIKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworYWNfc3Vic3RfdmFycz0nYW1fX0VYRUVYVF9GQUxTRQorYW1fX0VYRUVYVF9UUlVFCitMVExJQk9CSlMKK0xJQk9CSlMKK0hBVkVfUFRIUkVBRFNfRkFMU0UKK0hBVkVfUFRIUkVBRFNfVFJVRQorUFRIUkVBRF9DRkxBR1MKK1BUSFJFQURfTElCUworUFRIUkVBRF9DQworYWN4X3B0aHJlYWRfY29uZmlnCitIQVZFX1BZVEhPTl9GQUxTRQorSEFWRV9QWVRIT05fVFJVRQorUFlUSE9OCitDWFhDUFAKK0NQUAorT1RPT0w2NAorT1RPT0wKK0xJUE8KK05NRURJVAorRFNZTVVUSUwKK01BTklGRVNUX1RPT0wKK1JBTkxJQgorYWNfY3RfQVIKK0FSCitETExUT09MCitPQkpEVU1QCitMTl9TCitOTQorYWNfY3RfRFVNUEJJTgorRFVNUEJJTgorTEQKK0ZHUkVQCitFR1JFUAorR1JFUAorU0VECitob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK0xJQlRPT0wKK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFCithbV9fZmFzdGRlcENYWF9UUlVFCitDWFhERVBNT0RFCithY19jdF9DWFgKK0NYWEZMQUdTCitDWFgKK2FtX19mYXN0ZGVwQ0NfRkFMU0UKK2FtX19mYXN0ZGVwQ0NfVFJVRQorQ0NERVBNT0RFCithbV9fbm9kZXAKK0FNREVQQkFDS1NMQVNICitBTURFUF9GQUxTRQorQU1ERVBfVFJVRQorYW1fX3F1b3RlCithbV9faW5jbHVkZQorREVQRElSCitPQkpFWFQKK0VYRUVYVAorYWNfY3RfQ0MKK0NQUEZMQUdTCitMREZMQUdTCitDRkxBR1MKK0NDCithbV9fdW50YXIKK2FtX190YXIKK0FNVEFSCithbV9fbGVhZGluZ19kb3QKK1NFVF9NQUtFCitBV0sKK21rZGlyX3AKK01LRElSX1AKK0lOU1RBTExfU1RSSVBfUFJPR1JBTQorU1RSSVAKK2luc3RhbGxfc2gKK01BS0VJTkZPCitBVVRPSEVBREVSCitBVVRPTUFLRQorQVVUT0NPTkYKK0FDTE9DQUwKK1ZFUlNJT04KK1BBQ0tBR0UKK0NZR1BBVEhfVworYW1fX2lzcmMKK0lOU1RBTExfREFUQQorSU5TVEFMTF9TQ1JJUFQKK0lOU1RBTExfUFJPR1JBTQordGFyZ2V0X2FsaWFzCitob3N0X2FsaWFzCitidWlsZF9hbGlhcworTElCUworRUNIT19UCitFQ0hPX04KK0VDSE9fQworREVGUworbWFuZGlyCitsb2NhbGVkaXIKK2xpYmRpcgorcHNkaXIKK3BkZmRpcgorZHZpZGlyCitodG1sZGlyCitpbmZvZGlyCitkb2NkaXIKK29sZGluY2x1ZGVkaXIKK2luY2x1ZGVkaXIKK2xvY2Fsc3RhdGVkaXIKK3NoYXJlZHN0YXRlZGlyCitzeXNjb25mZGlyCitkYXRhZGlyCitkYXRhcm9vdGRpcgorbGliZXhlY2Rpcgorc2JpbmRpcgorYmluZGlyCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCitwcmVmaXgKK2V4ZWNfcHJlZml4CitQQUNLQUdFX1VSTAorUEFDS0FHRV9CVUdSRVBPUlQKK1BBQ0tBR0VfU1RSSU5HCitQQUNLQUdFX1ZFUlNJT04KK1BBQ0tBR0VfVEFSTkFNRQorUEFDS0FHRV9OQU1FCitQQVRIX1NFUEFSQVRPUgorU0hFTEwnCithY19zdWJzdF9maWxlcz0nJworYWNfdXNlcl9vcHRzPScKK2VuYWJsZV9vcHRpb25fY2hlY2tpbmcKK2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCitlbmFibGVfc2hhcmVkCitlbmFibGVfc3RhdGljCit3aXRoX3BpYworZW5hYmxlX2Zhc3RfaW5zdGFsbAord2l0aF9nbnVfbGQKK3dpdGhfc3lzcm9vdAorZW5hYmxlX2xpYnRvb2xfbG9jaword2l0aF9wdGhyZWFkcworJworICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworQ0MKK0NGTEFHUworTERGTEFHUworTElCUworQ1BQRkxBR1MKK0NYWAorQ1hYRkxBR1MKK0NDQworQ1BQCitDWFhDUFAnCisKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCithY191bnJlY29nbml6ZWRfb3B0cz0KK2FjX3VucmVjb2duaXplZF9zZXA9CisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2RvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCitodG1sZGlyPScke2RvY2Rpcn0nCitkdmlkaXI9JyR7ZG9jZGlyfScKK3BkZmRpcj0nJHtkb2NkaXJ9JworcHNkaXI9JyR7ZG9jZGlyfScKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCittYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKworYWNfcHJldj0KK2FjX2Rhc2hkYXNoPQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisgICo9KSAgIGFjX29wdGFyZz0gOzsKKyAgKikgICAgYWNfb3B0YXJnPXllcyA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisgIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQorICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQorICAgIGFjX3ByZXY9ZG9jZGlyIDs7CisgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKyAgICBhY19wcmV2PWR2aWRpciA7OworICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKyAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCisgIHwgLS1odD0qKQorICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCisgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKyAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCisgICAgYWNfcHJldj1wZGZkaXIgOzsKKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKyAgICBwZGZkaXI9JGFjX29wdGFyZyA7OworCisgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisgICAgYWNfcHJldj1wc2RpciA7OworICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAorICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKKyAgICBlc2FjCisgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKyAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorICAgIG5vKSA7OworICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgorZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAorCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCisJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgKi8gKQorICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworICBlc2FjCisgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisgIGVzYWMKKyAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KKyAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZCIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgorYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKK3Rlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8CiskYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKK2ZpCithY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCithY19hYnNfY29uZmRpcj1gKAorCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCisJcHdkKWAKKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCitpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisgIHNyY2Rpcj0uCitmaQorIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKyMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCitjYXNlICRzcmNkaXIgaW4KKyovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworZXNhYworZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KK2RvbmUKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIDEuNi4wIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCisKK1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKK1ZBUj1WQUxVRS4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCB2YXJpYWJsZXMuCisKK0RlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgorCitDb25maWd1cmF0aW9uOgorICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAgICAgLS1oZWxwPXNob3J0ICAgICAgICBkaXNwbGF5IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBwYWNrYWdlCisgICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcworICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcgLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0tZGF0YXJvb3RkaXI9RElSICAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQorICAtLWxvY2FsZWRpcj1ESVIgICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKyAgLS1kb2NkaXI9RElSICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2MvZ3Rlc3RdCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCitfQUNFT0YKKworICBjYXQgPDxcX0FDRU9GCisKK1Byb2dyYW0gbmFtZXM6CisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisKK1N5c3RlbSB0eXBlczoKKyAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKyAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCisgIGNhc2UgJGFjX2luaXRfaGVscCBpbgorICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAxLjYuMDoiOzsKKyAgIGVzYWMKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAorICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycworICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KKyAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCisgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10KKyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKQorCitPcHRpb25hbCBQYWNrYWdlczoKKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS13aXRoLXBpY1s9UEtHU10gICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgW2RlZmF1bHQ9dXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhdCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10KKyAgLS13aXRoLXN5c3Jvb3Q9RElSIFNlYXJjaCBmb3IgZGVwZW5kZW50IGxpYnJhcmllcyB3aXRoaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAob3IgdGhlIGNvbXBpbGVyJ3Mgc3lzcm9vdCBpZiBub3Qgc3BlY2lmaWVkKS4KKyAgLS13aXRoLXB0aHJlYWRzICAgICAgICAgdXNlIHB0aHJlYWRzIChkZWZhdWx0IGlzIHllcykKKworU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisgIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQorICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+CisgIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KKyAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgorICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KKyAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ1hYRkxBR1MgICAgQysrIGNvbXBpbGVyIGZsYWdzCisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisgIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKKworVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKworUmVwb3J0IGJ1Z3MgdG8gPGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbT4uCitfQUNFT0YKK2FjX3N0YXR1cz0kPworZmkKKworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgorICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgorICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQorICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8CisgICAgICB7IGNkICIkc3JjZGlyIiAmJiBhY19wd2Q9YHB3ZGAgJiYgc3JjZGlyPS4gJiYgdGVzdCAtZCAiJGFjX2RpciI7IH0gfHwKKyAgICAgIGNvbnRpbnVlCisgICAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAorICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CisgIGVzYWMgOzsKK2VzYWMKK2FjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAorYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK2FjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKK2VzYWMKK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKworICAgIGNkICIkYWNfZGlyIiB8fCB7IGFjX3N0YXR1cz0kPzsgY29udGludWU7IH0KKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCisgICAgICBlY2hvICYmCisgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCisgICAgICBlY2hvICYmCisgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlIiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxzZQorICAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKKyAgICBmaSB8fCBhY19zdGF0dXM9JD8KKyAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9CisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cworaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcX0FDRU9GCitHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGNvbmZpZ3VyZSAxLjYuMAorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4CisKK0NvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdAorZmkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY3h4X3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2N4eF90cnlfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2xpbmsgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2xpbmsgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KKyAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAorICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcworICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCisgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfbGluaworCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY190cnlfY3BwIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NwcCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgIGFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jcHAKKworIyBhY19mbl9jX3RyeV9ydW4gTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLiBBc3N1bWVzCisjIHRoYXQgZXhlY3V0YWJsZXMgKmNhbiogYmUgcnVuLgorYWNfZm5fY190cnlfcnVuICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCitmaQorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X3J1bgorCisjIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICQyIGlubm9jdW91c18kMgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkMgorCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICQyICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgorY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkMiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19mdW5jCisKKyMgYWNfZm5fY3h4X3RyeV9jcHAgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jeHhfdHJ5X2NwcCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKKwkgdGVzdCAteiAiJGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY3h4X3RyeV9jcHAKKworIyBhY19mbl9jeHhfdHJ5X2xpbmsgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY3h4X3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KKyAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAorICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcworICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCisgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY3h4X3RyeV9saW5rCitjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrICRhc19tZSAxLjYuMCwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjguICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCit7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Cit7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgorIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisgICAgICBlc2FjCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICMjCisjIyAtLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGNhdCBjb25mZGVmcy5oCisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCithY19zaXRlX2ZpbGUxPU5PTkUKK2FjX3NpdGVfZmlsZTI9Tk9ORQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICAjIFdlIGRvIG5vdCB3YW50IGEgUEFUSCBzZWFyY2ggZm9yIGNvbmZpZy5zaXRlLgorICBjYXNlICRDT05GSUdfU0lURSBpbiAjKCgKKyAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OworICAgICovKikgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEU7OworICAgICopICAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgIGVzYWMKK2VsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgIGFjX3NpdGVfZmlsZTE9JHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitlbHNlCisgIGFjX3NpdGVfZmlsZTE9JGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gIiRhY19zaXRlX2ZpbGUxIiAiJGFjX3NpdGVfZmlsZTIiCitkbworICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIgXAorICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsIGZpbGVzCisgICMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LiAgREpHUFAgZW11bGF0ZXMgaXQgYXMgYSByZWd1bGFyIGZpbGUuCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisgIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCisJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCisJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKwllbHNlCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAorCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CitmaQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCisjIFByb3ZpZGUgdmFyaW91cyBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlIEF1dG9jb25mIGFuZCBjb25maWd1cmUgcHJvY2Vzc2VzLgorCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYnVpbGQtYXV4ICIkc3JjZGlyIi9idWlsZC1hdXg7IGRvCisgIGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC1zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBpbnN0YWxsLXNoLCBpbnN0YWxsLnNoLCBvciBzaHRvb2wgaW4gYnVpbGQtYXV4IFwiJHNyY2RpclwiL2J1aWxkLWF1eCIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCithY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGJ1aWxkLWF1eC9jb25maWcuaCIKKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIgorCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgc2NyaXB0cy9ndGVzdC1jb25maWciCisKKworIyBJbml0aWFsaXplIEF1dG9tYWtlIHdpdGggdmFyaW91cyBvcHRpb25zLiBXZSByZXF1aXJlIGF0IGxlYXN0IHYxLjksIHByZXZlbnQKKyMgcGVkYW50aWMgY29tcGxhaW50cyBhYm91dCBwYWNrYWdlIGZpbGVzLCBhbmQgZW5hYmxlIHZhcmlvdXMgZGlzdHJpYnV0aW9uCisjIHRhcmdldHMuCithbV9fYXBpX3ZlcnNpb249JzEuMTEnCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KKyMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbiAjKCgKKyAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKyAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCisJICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCisJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCisJICAgIHRoZW4KKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgICAgYnJlYWsgMworCSAgICBmaQorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICA7OworZXNhYworCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQorJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICIgPiY2OyB9CisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCisjIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQorIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgorYW1fbGY9JworJworY2FzZSBgcHdkYCBpbgorICAqW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXSopCisgICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lIiAiJExJTkVOTyIgNTs7Citlc2FjCitjYXNlICRzcmNkaXIgaW4KKyAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZlwgXAldKikKKyAgICBhc19mbl9lcnJvciAkPyAidW5zYWZlIHNyY2RpciB2YWx1ZTogXGAkc3JjZGlyJyIgIiRMSU5FTk8iIDU7OworZXNhYworCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgYXNfZm5fZXJyb3IgJD8gImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1CisgICBmaQorCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgYXNfZm5fZXJyb3IgJD8gIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgRG91YmxlIGFueSBcIG9yICQuCisjIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgorYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJworcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisKKyMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKK2FtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKKworaWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9IFwiJGFtX2F1eF9kaXIvbWlzc2luZ1wiIiA7OworICAqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIiA7OworICBlc2FjCitmaQorIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCitpZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgorICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgorZWxzZQorICBhbV9taXNzaW5nX3J1bj0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjI7fQorZmkKKworaWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OworICAqKQorICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgorICBlc2FjCitmaQorCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQorJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAoraWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCisgICAgU1RSSVA9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgU1RSSVA9JGFjX2N0X1NUUklQCisgIGZpCitlbHNlCisgIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKK2ZpCisKK2ZpCitJTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KKyAgaWYgJHthY19jdl9wYXRoX21rZGlyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi9vcHQvc2Z3L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KKwkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisJICAgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfSB8fCBjb250aW51ZQorCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKKwkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCisJICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCisJICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCisJICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAorCSAgICAgICBicmVhayAzOzsKKwkgICBlc2FjCisJIGRvbmUKKyAgICAgICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKKworICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgorICAgIE1LRElSX1A9IiRhY19jdl9wYXRoX21rZGlyIC1wIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIE1LRElSX1Agd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1LRElSX1AiID4mNQorJGFzX2VjaG8gIiRNS0RJUl9QIiA+JjY7IH0KKworbWtkaXJfcD0iJE1LRElSX1AiCitjYXNlICRta2Rpcl9wIGluCisgIFtcXC8kXSogfCA/OltcXC9dKikgOzsKKyAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OworZXNhYworCitmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19BV0srOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVdLPSRhY19jdl9wcm9nX0FXSworaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQorJGFzX2VjaG8gIiRBV0siID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhaworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCisgICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0CisgICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKKyAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKKyAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCisgIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gInNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiAiJExJTkVOTyIgNQorICBmaQorZmkKKworIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCitpZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgorICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCisgIGVsc2UKKyAgICBDWUdQQVRIX1c9ZWNobworICBmaQorZmkKKworCisjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCisgUEFDS0FHRT0nZ3Rlc3QnCisgVkVSU0lPTj0nMS42LjAnCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitfQUNFT0YKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorCitBQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9CisKKworQVVUT01BS0U9JHtBVVRPTUFLRS0iJHthbV9taXNzaW5nX3J1bn1hdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0ifQorCisKK0FVVE9IRUFERVI9JHtBVVRPSEVBREVSLSIke2FtX21pc3NpbmdfcnVufWF1dG9oZWFkZXIifQorCisKK01BS0VJTkZPPSR7TUFLRUlORk8tIiR7YW1fbWlzc2luZ19ydW59bWFrZWluZm8ifQorCisjIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgorIyBzb21lIHBsYXRmb3Jtcy4KKyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIFllcywgaXQncyBzdGlsbCB1c2VkCisjIGluIHRoZSB3aWxkIDotKCAgV2Ugc2hvdWxkIGZpbmQgYSBwcm9wZXIgd2F5IHRvIGRlcHJlY2F0ZSBpdCAuLi4KK0FNVEFSPSckJHtUQVItdGFyfScKKworYW1fX3Rhcj0nJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciInIGFtX191bnRhcj0nJCR7VEFSLXRhcn0geGYgLScKKworCisKKworCisKKyMgQ2hlY2sgZm9yIHByb2dyYW1zIHVzZWQgaW4gYnVpbGRpbmcgR29vZ2xlIFRlc3QuCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICBmaQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisKKyMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKK2FjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCisKK2FjX3JtZmlsZXM9Citmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKK2RvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisgIGVzYWMKK2RvbmUKK3JtIC1mICRhY19ybWZpbGVzCisKK2lmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworIyBBdXRvY29uZi4KK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKwl0aGVuIDo7IGVsc2UKKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwlmaQorCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAorCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJworCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgorCSMgYWN0dWFsbHkgd29ya2luZy4KKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCit0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KKworZWxzZQorICBhY19maWxlPScnCitmaQoraWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiskYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9CithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorCitybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9CitpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQorIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorIyBgcm0nLgorZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKKyByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCisjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bm8KKyAgZWxzZQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKwljcm9zc19jb21waWxpbmc9eWVzCisgICAgZWxzZQorCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgICBmaQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jY19nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6CisKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK0RFUERJUj0iJHthbV9fbGVhZGluZ19kb3R9ZGVwcyIKKworYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlcGZpbGVzIgorCisKK2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCithbV9fZG9pdDoKKwlAZWNobyB0aGlzIGlzIHRoZSBhbV9fZG9pdCB0YXJnZXQKKy5QSE9OWTogYW1fX2RvaXQKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UuLi4gIiA+JjY7IH0KK2FtX19pbmNsdWRlPSIjIgorYW1fX3F1b3RlPQorX2FtX3Jlc3VsdD1ub25lCisjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgorZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgorIyBJZ25vcmUgYWxsIGtpbmRzIG9mIGFkZGl0aW9uYWwgb3V0cHV0IGZyb20gYG1ha2UnLgorY2FzZSBgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAgaW4gIygKKyp0aGVcIGFtX19kb2l0XCB0YXJnZXQqKQorICBhbV9faW5jbHVkZT1pbmNsdWRlCisgIGFtX19xdW90ZT0KKyAgX2FtX3Jlc3VsdD1HTlUKKyAgOzsKK2VzYWMKKyMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgoraWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgorICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgorICAgY2FzZSBgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAgaW4gIygKKyAgICp0aGVcIGFtX19kb2l0XCB0YXJnZXQqKQorICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQorICAgICBhbV9fcXVvdGU9IlwiIgorICAgICBfYW1fcmVzdWx0PUJTRAorICAgICA7OworICAgZXNhYworZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRfYW1fcmVzdWx0IiA+JjY7IH0KK3JtIC1mIGNvbmZpbmMgY29uZm1mCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworICBhbV9fbm9kZXA9J19ubycKK2ZpCisgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIEFNREVQX1RSVUU9CisgIEFNREVQX0ZBTFNFPScjJworZWxzZQorICBBTURFUF9UUlVFPScjJworICBBTURFUF9GQUxTRT0KK2ZpCisKKworCitkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKKyAgZmkKKyAgYW1fX3VuaXZlcnNhbD1mYWxzZQorICBjYXNlICIgJGRlcGNjICIgaW4gIygKKyAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKKyAgICAgZXNhYworCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgZ2NjKQorICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KKyAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCisgICAgICA7OworICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CitpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgorICAgIENYWD0kQ0NDCisgIGVsc2UKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ1hYPSIkQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDWFg9JGFjX2N2X3Byb2dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWCIgPiY1CiskYXNfZWNobyAiJENYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGFjX2N0X0NYWD0kQ1hYCisgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKK2lmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ1hYIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NYWCIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCisgICAgQ1hYPSJnKysiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ1hYPSRhY19jdF9DWFgKKyAgZmkKK2ZpCisKKyAgZmkKK2ZpCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2N4eF9jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2N4eF9jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR1hYPXllcworZWxzZQorICBHWFg9CitmaQorYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KK2FjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY3h4X2crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19zYXZlX2N4eF93ZXJyb3JfZmxhZz0kYWNfY3h4X3dlcnJvcl9mbGFnCisgICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2N4eF9nPW5vCisgICBDWFhGTEFHUz0iLWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZWxzZQorICBDWFhGTEFHUz0iIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCisJIENYWEZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY3h4X2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2N4eF9nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgorICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9CisgIGZpCitmaQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCisgICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCisgICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgorICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQorICAgICAgYW1fX21pbnVzX29iaj0KKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NYWERFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCisKKyBpZgorICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0KKyAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9JyMnCitlbHNlCisgIGFtX19mYXN0ZGVwQ1hYX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ1hYX0ZBTFNFPQorZmkKKworCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCitjYXNlIGBwd2RgIGluCisgICpcICogfCAqXAkqKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIFxgcHdkXGAiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIFxgcHdkXGAiID4mMjt9IDs7Citlc2FjCisKKworCittYWNyb192ZXJzaW9uPScyLjQuMicKK21hY3JvX3JldmlzaW9uPScxLjMzMzcnCisKKworCisKKworCisKKworCisKKworCisKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2J1aWxkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQorYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9CitjYXNlICRhY19jdl9idWlsZCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKK2VzYWMKK2J1aWxkPSRhY19jdl9idWlsZAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2J1aWxkCitzaGlmdAorYnVpbGRfY3B1PSQxCitidWlsZF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CitidWlsZF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9ob3N0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKK2Vsc2UKKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorY2FzZSAkYWNfY3ZfaG9zdCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKKyMgQmFja3NsYXNoaWZ5IG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4KKyMgZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorc2VkX3F1b3RlX3N1YnN0PSdzL1woWyJgJFxcXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbImBcXF1cKS9cXFwxL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCisjIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCitkZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2luZ2xlIHF1b3RlLgorZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0PSdzLydcJycvJ1wnXFxcXFxcXCdcJycvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCitub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKKworRUNITz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcHJpbnQgc3RyaW5ncyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcHJpbnQgc3RyaW5ncy4uLiAiID4mNjsgfQorIyBUZXN0IHByaW50IGZpcnN0LCBiZWNhdXNlIGl0IHdpbGwgYmUgYSBidWlsdGluIGlmIHByZXNlbnQuCitpZiB0ZXN0ICJYYCggcHJpbnQgLXIgLS0gLW4gKSAyPi9kZXYvbnVsbGAiID0gWC1uICYmIFwKKyAgIHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50IC1yIC0tJworZWxpZiB0ZXN0ICJYYHByaW50ZiAlcyAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnRmICVzXG4nCitlbHNlCisgICMgVXNlIHRoaXMgZnVuY3Rpb24gYXMgYSBmYWxsYmFjayB0aGF0IGFsd2F5cyB3b3Jrcy4KKyAgZnVuY19mYWxsYmFja19lY2hvICgpCisgIHsKKyAgICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorJDEKK19MVEVDSE9fRU9GJworICB9CisgIEVDSE89J2Z1bmNfZmFsbGJhY2tfZWNobycKK2ZpCisKKyMgZnVuY19lY2hvX2FsbCBhcmcuLi4KKyMgSW52b2tlICRFQ0hPIHdpdGggYWxsIGFyZ3MsIHNwYWNlLXNlcGFyYXRlZC4KK2Z1bmNfZWNob19hbGwgKCkKK3sKKyAgICAkRUNITyAiIgorfQorCitjYXNlICIkRUNITyIgaW4KKyAgcHJpbnRmKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHByaW50ZiIgPiY1CiskYXNfZWNobyAicHJpbnRmIiA+JjY7IH0gOzsKKyAgcHJpbnQqKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogcHJpbnQgLXIiID4mNQorJGFzX2VjaG8gInByaW50IC1yIiA+JjY7IH0gOzsKKyAgKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGNhdCIgPiY1CiskYXNfZWNobyAiY2F0IiA+JjY7IH0gOzsKK2VzYWMKKworCisKKworCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9TRUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAgICAgICAgICAgYWNfc2NyaXB0PXMvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEvYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiLworICAgICBmb3IgYWNfaSBpbiAxIDIgMyA0IDUgNiA3OyBkbworICAgICAgIGFjX3NjcmlwdD0iJGFjX3NjcmlwdCRhc19ubCRhY19zY3JpcHQiCisgICAgIGRvbmUKKyAgICAgZWNobyAiJGFjX3NjcmlwdCIgMj4vZGV2L251bGwgfCBzZWQgOTlxID5jb25mdGVzdC5zZWQKKyAgICAgeyBhY19zY3JpcHQ9OyB1bnNldCBhY19zY3JpcHQ7fQorICAgICBpZiB0ZXN0IC16ICIkU0VEIjsgdGhlbgorICBhY19wYXRoX1NFRF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX1NFRD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfU0VEIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9TRUQiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9TRUQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX1NFRAorY2FzZSBgIiRhY19wYXRoX1NFRCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9TRUQ9IiRhY19wYXRoX1NFRCIgYWNfcGF0aF9TRURfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJycgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9TRUQiIC1mIGNvbmZ0ZXN0LnNlZCA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfU0VEX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX1NFRD0iJGFjX3BhdGhfU0VEIgorICAgICAgYWNfcGF0aF9TRURfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9TRURfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX1NFRCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBzZWQgY291bGQgYmUgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX1NFRD0kU0VECitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX1NFRCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfU0VEIiA+JjY7IH0KKyBTRUQ9IiRhY19jdl9wYXRoX1NFRCIKKyAgcm0gLWYgY29uZnRlc3Quc2VkCisKK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKKworCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCitjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCitjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKKyAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorZmkKKworICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZmdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZncmVwLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfRkdSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvICdhYipjJyB8ICRHUkVQIC1GICdhYipjJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9GR1JFUD0iJEdSRVAgLUYiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRGR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9GR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGZncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9GR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRkdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0ZHUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRkdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0ZHUkVQCitjYXNlIGAiJGFjX3BhdGhfRkdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfRkdSRVA9IiRhY19wYXRoX0ZHUkVQIiBhY19wYXRoX0ZHUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdGR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9GR1JFUCIgRkdSRVAgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0ZHUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0ZHUkVQPSIkYWNfcGF0aF9GR1JFUCIKKyAgICAgIGFjX3BhdGhfRkdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9GR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRkdSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZmdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0ZHUkVQPSRGR1JFUAorZmkKKworICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRkdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0ZHUkVQIiA+JjY7IH0KKyBGR1JFUD0iJGFjX2N2X3BhdGhfRkdSRVAiCisKKwordGVzdCAteiAiJEdSRVAiICYmIEdSRVA9Z3JlcAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9nbnVfbGQ7IHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcworZWxzZQorICB3aXRoX2dudV9sZD1ubworZmkKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQy4uLiAiID4mNjsgfQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtcXC9dKiB8ID86W1xcL10qKQorICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQorZmkKK2lmICR7bHRfY3ZfcGF0aF9MRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwk7OworICAgICAgKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpCitmaQorCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQiID4mNQorJGFzX2VjaG8gIiRMRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2dudV9sZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KK2Nhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCisgIDs7CisqKQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworICA7OworZXNhYworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Cit3aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlciAobm0pIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX05NKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIDogJHtsdF9jdl9wYXRoX05NPW5vfQorZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3BhdGhfTk0iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wYXRoX05NIiA+JjY7IH0KK2lmIHRlc3QgIiRsdF9jdl9wYXRoX05NIiAhPSAibm8iOyB0aGVuCisgIE5NPSIkbHRfY3ZfcGF0aF9OTSIKK2Vsc2UKKyAgIyBEaWRuJ3QgZmluZCBhbnkgQlNEIGNvbXBhdGlibGUgbmFtZSBsaXN0ZXIsIGxvb2sgZm9yIGR1bXBiaW4uCisgIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbiA6CisgICAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGVsc2UKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGR1bXBiaW4gImxpbmsgLWR1bXAiCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0RVTVBCSU4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19EVU1QQklOPSIkRFVNUEJJTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RVTVBCSU49IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0RVTVBCSU49JGFjX2N2X3Byb2dfRFVNUEJJTgoraWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRFVNUEJJTiIgPiY1CiskYXNfZWNobyAiJERVTVBCSU4iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiREVU1QQklOIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJERVTVBCSU4iOyB0aGVuCisgIGFjX2N0X0RVTVBCSU49JERVTVBCSU4KKyAgZm9yIGFjX3Byb2cgaW4gZHVtcGJpbiAibGluayAtZHVtcCIKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0RVTVBCSU4iOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTj0iJGFjX2N0X0RVTVBCSU4iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9EVU1QQklOPSRhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU4KK2lmIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RVTVBCSU4iID4mNQorJGFzX2VjaG8gIiRhY19jdF9EVU1QQklOIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0RVTVBCSU4iICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9EVU1QQklOIiA9IHg7IHRoZW4KKyAgICBEVU1QQklOPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERVTVBCSU49JGFjX2N0X0RVTVBCSU4KKyAgZmkKK2ZpCisKKyAgICBjYXNlIGAkRFVNUEJJTiAtc3ltYm9scyAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorICAgICpDT0ZGKikKKyAgICAgIERVTVBCSU49IiREVU1QQklOIC1zeW1ib2xzIgorICAgICAgOzsKKyAgICAqKQorICAgICAgRFVNUEJJTj06CisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworICBpZiB0ZXN0ICIkRFVNUEJJTiIgIT0gIjoiOyB0aGVuCisgICAgTk09IiREVU1QQklOIgorICBmaQorZmkKK3Rlc3QgLXogIiROTSIgJiYgTk09bm0KKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X25tX2ludGVyZmFjZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRhY19jb21waWxlXCIiID4mNSkKKyAgKGV2YWwgIiRhY19jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiY1KQorICAoZXZhbCAiJE5NIFwiY29uZnRlc3QuJGFjX29iamV4dFwiIiAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dCkKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86IG91dHB1dFwiIiA+JjUpCisgIGNhdCBjb25mdGVzdC5vdXQgPiY1CisgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgorICBmaQorICBybSAtZiBjb25mdGVzdCoKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X25tX2ludGVyZmFjZSIgPiY1CiskYXNfZWNobyAiJGx0X2N2X25tX2ludGVyZmFjZSIgPiY2OyB9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICIgPiY2OyB9CitMTl9TPSRhc19sbl9zCitpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubywgdXNpbmcgJExOX1MiID4mNQorJGFzX2VjaG8gIm5vLCB1c2luZyAkTE5fUyIgPiY2OyB9CitmaQorCisjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc3lzX21heF9jbWRfbGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbWludCopCisgICAgIyBPbiBNaU5UIHRoaXMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIHJ1biBvdXQgb2YgbWVtb3J5LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQorICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgorICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcworICAgIGZpCisgICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgOzsKKworICBpbnRlcml4KikKKyAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4CisgICAgOzsKKworICBvczIqKQorICAgICMgVGhlIHRlc3QgdGFrZXMgYSBsb25nIHRpbWUgb24gT1MvMi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MgorICAgIDs7CisKKyAgb3NmKikKKyAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKKyAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAorICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCisgICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0CisgICAgIworICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCisgICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgorICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKKyAgICA7OworICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCisgICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qWwkgXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgICMgTWFrZSB0ZXN0c3RyaW5nIGEgbGl0dGxlIGJpZ2dlciBiZWZvcmUgd2UgZG8gYW55dGhpbmcgd2l0aCBpdC4KKyAgICAgICMgYSAxSyBzdHJpbmcgc2hvdWxkIGJlIGEgcmVhc29uYWJsZSBzdGFydC4KKyAgICAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA7IGRvCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KKyAgICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCisgICAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgICAgd2hpbGUgeyB0ZXN0ICJYImBlbnYgZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgICBkbworICAgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCisgICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQorICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworCitmaQorCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUiID4mNQorJGFzX2VjaG8gIm5vbmUiID4mNjsgfQorZmkKK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworCisKKworCisKKzogJHtDUD0iY3AgLWYifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHMuLi4gIiA+JjY7IH0KKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkeHNpX3NoZWxsIiA+JjUKKyRhc19lY2hvICIkeHNpX3NoZWxsIiA+JjY7IH0KKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIFwiKz1cIiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBcIis9XCIuLi4gIiA+JjY7IH0KK2x0X3NoZWxsX2FwcGVuZD1ubworKCBmb289YmFyOyBzZXQgZm9vIGJhejsgZXZhbCAiJDErPVwkMiIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9zaGVsbF9hcHBlbmQiID4mNQorJGFzX2VjaG8gIiRsdF9zaGVsbF9hcHBlbmQiID4mNjsgfQorCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKKworCisKKworCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIGx0X1NQMk5MPSd0ciBcMDQwIFwwMTInCisgIGx0X05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgbHRfU1AyTkw9J3RyIFwxMDAgXG4nCisgIGx0X05MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3RvX2hvc3RfZmlsZV9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKKworZmkKKwordG9faG9zdF9maWxlX2NtZD0kbHRfY3ZfdG9faG9zdF9maWxlX2NtZAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl90b19ob3N0X2ZpbGVfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgPiY2OyB9CisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvIHRvb2xjaGFpbiBmb3JtYXQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfdG9fdG9vbF9maWxlX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCisKK2ZpCisKK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfdG9fdG9vbF9maWxlX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiID4mNjsgfQorCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX3JlbG9hZF9mbGFnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY2OyB9CityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9ZmFsc2UKKyAgICBmaQorICAgIDs7CisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vYmpkdW1wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJE9CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorT0JKRFVNUD0kYWNfY3ZfcHJvZ19PQkpEVU1QCitpZiB0ZXN0IC1uICIkT0JKRFVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQkpEVU1QIiA+JjUKKyRhc19lY2hvICIkT0JKRFVNUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3RfT0JKRFVNUD0kT0JKRFVNUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG9iamR1bXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X09CSkRVTVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSIkYWNfY3RfT0JKRFVNUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9Im9iamR1bXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfT0JKRFVNUD0kYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QCitpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQkpEVU1QIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0JKRFVNUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X09CSkRVTVAiID0geDsgdGhlbgorICAgIE9CSkRVTVA9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9CSkRVTVA9JGFjX2N0X09CSkRVTVAKKyAgZmkKK2Vsc2UKKyAgT0JKRFVNUD0iJGFjX2N2X3Byb2dfT0JKRFVNUCIKK2ZpCisKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeFs0LTldKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbNDVdKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLAorICAjIHVubGVzcyB3ZSBmaW5kICdmaWxlJywgZm9yIGV4YW1wbGUgYmVjYXVzZSB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLgorICAjIGZ1bmNfd2luMzJfbGliaWQgYXNzdW1lcyBCU0Qgbm0sIHNvIGRpc2FsbG93IGl0IGlmIHVzaW5nIE1TIGR1bXBiaW4uCisgIGlmICggdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiQlNEIG5tIiAmJiBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICBlbHNlCisgICAgIyBLZWVwIHRoaXMgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBmdW5jX3dpbjMyX2xpYmlkLgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIGZpCisgIDs7CisKK2NlZ2NjKikKKyAgIyB1c2UgdGhlIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4gU2VlIG1pbmd3Ki4KKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGUtYXJtLS4qbGl0dGxlKC4qYXJjaGl0ZWN0dXJlOiBhcm0pPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaSo4NiApCisgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgorICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KKyAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pWzMtOV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaGFpa3UqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRlsgLV1bMC05XVswLTldKSgtYml0KT8oIFtMTV1TQik/IHNoYXJlZCBvYmplY3QoIGZpbGUpP1ssIC1dKiBQQS1SSVNDIFswLTldXC5bMC05XScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfFBBLVJJU0NbMC05XVwuWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXhbMy05XSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298XC5hKSQnCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJExEIGluCisgICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKKyAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKKyAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICBlc2FjCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIGdsaWJjL0VMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298X3BpY1wuYSkkJworICBmaQorICA7OworCituZXdvczYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK29wZW5ic2QqKQorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCityZG9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVswLTldWzAtOV0qIFZlcnNpb24gWzAtOV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCit0cGYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjY7IH0KKworZmlsZV9tYWdpY19nbG9iPQord2FudF9ub2Nhc2VnbG9iPW5vCitpZiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGlmICggc2hvcHQgfCBncmVwIG5vY2FzZWdsb2IgKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHdhbnRfbm9jYXNlZ2xvYj15ZXMKKyAgICBlbHNlCisgICAgICBmaWxlX21hZ2ljX2dsb2I9YGVjaG8gYUFiQmNDZERlRWZGZ0doSGlJakprS2xMbU1uTm9PcFBxUXJSc1N0VHVVdlZ3V3hYeVl6WiB8ICRTRUQgLWUgInMvXCguLlwpL3NcL1tcMV1cL1tcMV1cL2c7L2ciYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworZmkKKworZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgorICBhY19jdF9ETExUT09MPSRETExUT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9ETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfRExMVE9PTCIgPSB4OyB0aGVuCisgICAgRExMVE9PTD0iZmFsc2UiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAorICBmaQorZWxzZQorICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgorZmkKKwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGFzc29jaWF0ZSBydW50aW1lIGFuZCBsaW5rIGxpYnJhcmllcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSd1bmtub3duJworCitjYXNlICRob3N0X29zIGluCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICMgdHdvIGRpZmZlcmVudCBzaGVsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgIyBkZWNpZGUgd2hpY2ggdG8gdXNlIGJhc2VkIG9uIGNhcGFiaWxpdGllcyBvZiAkRExMVE9PTAorICBjYXNlIGAkRExMVE9PTCAtLWhlbHAgMj4mMWAgaW4KKyAgKi0taWRlbnRpZnktc3RyaWN0KikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIKKyAgICA7OworICAqKQorICAgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPWZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFjaworICAgIDs7CisgIGVzYWMKKyAgOzsKKyopCisgICMgZmFsbGJhY2s6IGFzc3VtZSBsaW5rbGliIElTIHNoYXJlZGxpYgorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0iJEVDSE8iCisgIDs7Citlc2FjCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiID4mNjsgfQorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCit0ZXN0IC16ICIkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiICYmIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRFQ0hPCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBhcgorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19BUis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVI9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FSPSRhY19jdl9wcm9nX0FSCitpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQorJGFzX2VjaG8gIiRBUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJEFSIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJEFSIjsgdGhlbgorICBhY19jdF9BUj0kQVIKKyAgZm9yIGFjX3Byb2cgaW4gYXIKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9BUis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iJGFjX2N0X0FSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0FSPSRhY19jdl9wcm9nX2FjX2N0X0FSCitpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQVIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9BUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9BUiIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0FSIiA9IHg7IHRoZW4KKyAgICBBUj0iZmFsc2UiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQVI9JGFjX2N0X0FSCisgIGZpCitmaQorCis6ICR7QVI9YXJ9Cis6ICR7QVJfRkxBR1M9Y3J1fQorCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFyY2hpdmVyIEBGSUxFIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGFyY2hpdmVyIEBGSUxFIHN1cHBvcnQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXJfYXRfZmlsZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2FyX2F0X2ZpbGU9bm8KKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGVjaG8gY29uZnRlc3QuJGFjX29iamV4dCA+IGNvbmZ0ZXN0LmxzdAorICAgICAgbHRfYXJfdHJ5PSckQVIgJEFSX0ZMQUdTIGxpYmNvbmZ0ZXN0LmEgQGNvbmZ0ZXN0LmxzdCA+JjUnCisgICAgICB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkbHRfYXJfdHJ5XCIiOyB9ID4mNQorICAoZXZhbCAkbHRfYXJfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgaWYgdGVzdCAiJGFjX3N0YXR1cyIgLWVxIDA7IHRoZW4KKwkjIEVuc3VyZSB0aGUgYXJjaGl2ZXIgZmFpbHMgdXBvbiBib2d1cyBmaWxlIG5hbWVzLgorCXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgbGliY29uZnRlc3QuYQorCXsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRsdF9hcl90cnlcIiI7IH0gPiY1CisgIChldmFsICRsdF9hcl90cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisJaWYgdGVzdCAiJGFjX3N0YXR1cyIgLW5lIDA7IHRoZW4KKyAgICAgICAgICBsdF9jdl9hcl9hdF9maWxlPUAKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgICBybSAtZiBjb25mdGVzdC4qIGxpYmNvbmZ0ZXN0LmEKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcl9hdF9maWxlIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXJfYXRfZmlsZSIgPiY2OyB9CisKK2lmIHRlc3QgIngkbHRfY3ZfYXJfYXRfZmlsZSIgPSB4bm87IHRoZW4KKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPQorZWxzZQorICBhcmNoaXZlcl9saXN0X3NwZWM9JGx0X2N2X2FyX2F0X2ZpbGUKK2ZpCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVFJJUCIgPiY1CiskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9TVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KKyAgICBTVFJJUD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBTVFJJUD0kYWNfY3RfU1RSSVAKKyAgZmkKK2Vsc2UKKyAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorZmkKKwordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06CisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQorJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCitpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCisgICAgUkFOTElCPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisgIGZpCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKwordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKKworCisKKworCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG9wZW5ic2QqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCR0b29sX29sZGxpYiIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCR0b29sX29sZGxpYiIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkdG9vbF9vbGRsaWIiCitmaQorCitjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPXllcyA7OworICAqKQorICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj1ubyA7OworZXNhYworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHN5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgc3ltY29kZT0nW0FCQ0RFR1JTVF0nCisgIGZpCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citvc2YqKQorICBzeW1jb2RlPSdbQkNERUdRUlNUXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbQkRSVF0nCisgIDs7CitzY28zLjJ2NSopCisgIHN5bWNvZGU9J1tEVF0nCisgIDs7CitzeXN2NC4ydXcyKikKKyAgc3ltY29kZT0nW0RUXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tBQkRUXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbREZOU1RVXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbQUJDREdJUlNUV10nIDs7Citlc2FjCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24uCisjIFNvbWUgc3lzdGVtcyAoZXNwLiBvbiBpYTY0KSBsaW5rIGRhdGEgYW5kIGNvZGUgc3ltYm9scyBkaWZmZXJlbnRseSwKKyMgc28gdXNlIHRoaXMgZ2VuZXJhbCBhcHByb2FjaC4KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFteIF0qXClbIF0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9InNlZCAtbiAtZSAncy9eOiBcKFteIF0qXClbIF0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChsaWJbXiBdKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gJEVDSE8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcnNjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGlmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgICAgIyBGYWtlIGl0IGZvciBkdW1wYmluIGFuZCBzYXkgVCBmb3IgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24KKyAgICAjIGFuZCBEIGZvciBhbnkgZ2xvYmFsIHZhcmlhYmxlLgorICAgICMgQWxzbyBmaW5kIEMrKyBhbmQgX19mYXN0Y2FsbCBzeW1ib2xzIGZyb20gTVNWQysrLAorICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyAnIlwKKyIgICAgIHtsYXN0X3NlY3Rpb249c2VjdGlvbjsgc2VjdGlvbj1cJCAzfTsiXAorIiAgICAgL15DT0ZGIFNZTUJPTCBUQUJMRS97Zm9yKGkgaW4gaGlkZSkgZGVsZXRlIGhpZGVbaV19OyJcCisiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKKyIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCisiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCisiICAgICB7aWYoaGlkZVtzZWN0aW9uXSkgbmV4dH07IlwKKyIgICAgIHtmPTB9OyBcJCAwfi9cKFwpLipcfC97Zj0xfTsge3ByaW50ZiBmID8gXCJUIFwiIDogXCJEIFwifTsiXAorIiAgICAge3NwbGl0KFwkIDAsIGEsIC9cfHxcci8pOyBzcGxpdChhWzJdLCBzKX07IlwKKyIgICAgIHNbMV1+L15bQD9dL3twcmludCBzWzFdLCBzWzFdOyBuZXh0fTsiXAorIiAgICAgc1sxXX5wcmZ4IHtzcGxpdChzWzFdLHQsXCJAXCIpOyBwcmludCB0WzFdLCBzdWJzdHIodFsxXSxsZW5ndGgocHJmeCkpfSJcCisiICAgICAnIHByZng9XiRhY19zeW1wcmZ4IgorICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsJIF1cKCRzeW1jb2RlJHN5bWNvZGUqXClbCSBdWwkgXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJy8gX19nbnVfbHRvL2QnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK19MVF9FT0YKKworICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdFwiIjsgfSA+JjUKKyAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3QpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgJEdSRVAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiAkR1JFUCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PF9MVF9FT0YgPiBjb25mdGVzdC4kYWNfZXh0CisvKiBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIGJldHdlZW4gbGlidG9vbC5tNCwgbHRtYWluLCBsdF9zeXN0ZW0uaCwgYW5kIHRlc3RzLiAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlIHJ1bnRpbWUKKyAgIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbiBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxzZQorIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QgY29uc3QKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19MVF9FT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCisKKwkgIGNhdCA8PF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCitMVF9ETFNZTV9DT05TVCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICAgICAgICphZGRyZXNzOworfQorbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKKyAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAorX0xUX0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorX0xUX0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfZ2xvYnN5bV9zYXZlX0xJQlM9JExJQlMKKwkgIGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1M9JENGTEFHUworCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKKwkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9JGx0X2dsb2JzeW1fc2F2ZV9MSUJTCisJICBDRkxBR1M9JGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1MKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1CisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZmFpbGVkIiA+JjUKKyRhc19lY2hvICJmYWlsZWQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2siID4mNQorJGFzX2VjaG8gIm9rIiA+JjY7IH0KK2ZpCisKKyMgUmVzcG9uc2UgZmlsZSBzdXBwb3J0LgoraWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitlbGlmICROTSAtLWhlbHAgMj4vZGV2L251bGwgfCBncmVwICdbQF1GSUxFJyA+L2Rldi9udWxsOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN5c3Jvb3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN5c3Jvb3QuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zeXNyb290IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zeXNyb290K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zeXNyb290OworZWxzZQorICB3aXRoX3N5c3Jvb3Q9bm8KK2ZpCisKKworbHRfc3lzcm9vdD0KK2Nhc2UgJHt3aXRoX3N5c3Jvb3R9IGluICMoCisgeWVzKQorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgbHRfc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKKyAgIGZpCisgICA7OyAjKAorIC8qKQorICAgbHRfc3lzcm9vdD1gZWNobyAiJHdpdGhfc3lzcm9vdCIgfCBzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgOzsgIygKKyBub3wnJykKKyAgIDs7ICMoCisgKikKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke3dpdGhfc3lzcm9vdH0iID4mNQorJGFzX2VjaG8gIiR7d2l0aF9zeXNyb290fSIgPiY2OyB9CisgICBhc19mbl9lcnJvciAkPyAiVGhlIHN5c3Jvb3QgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgIDs7Citlc2FjCisKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHtsdF9zeXNyb290Oi1ub30iID4mNQorJGFzX2VjaG8gIiR7bHRfc3lzcm9vdDotbm99IiA+JjY7IH0KKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOworZmkKKwordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICAgKkVMRi0zMiopCisJSFBVWF9JQTY0X01PREU9IjMyIgorCTs7CisgICAgICAqRUxGLTY0KikKKwlIUFVYX0lBNjRfTU9ERT0iNjQiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnI2xpbmUgJyRMSU5FTk8nICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtMzIiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwkgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICA7OworCSAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisJICAgIDs7CisJICBzMzkweC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisJICAgIDs7CisJICBzcGFyYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICo2NC1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjRfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKwkgICAgOzsKKwkgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisJICAgIDs7CisJICBzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfY2NfbmVlZHNfYmVsZis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKK2Vsc2UKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNjsgfQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7OworKi0qc29sYXJpcyopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCisgICAgICB5ZXMqKQorICAgICAgICBjYXNlICRob3N0IGluCisgICAgICAgIGk/ODYtKi1zb2xhcmlzKikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYyotKi1zb2xhcmlzKikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICAjIEdOVSBsZCAyLjIxIGludHJvZHVjZWQgX3NvbDIgZW11bGF0aW9ucy4gIFVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KKyAgICAgICAgaWYgJHtMRC1sZH0gLVYgfCBncmVwIF9zb2wyID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICAgIExEPSIke0xELWxkfV9zb2wyIgorICAgICAgICBmaQorICAgICAgICA7OworICAgICAgKikKKwlpZiAke0xELWxkfSAtNjQgLXIgLW8gY29uZnRlc3QyLm8gY29uZnRlc3QubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIExEPSIke0xELWxkfSAtNjQiCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKK2VzYWMKKworbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW10OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE1BTklGRVNUX1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTD0iJE1BTklGRVNUX1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MPSIke2FjX3Rvb2xfcHJlZml4fW10IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK01BTklGRVNUX1RPT0w9JGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTAoraWYgdGVzdCAtbiAiJE1BTklGRVNUX1RPT0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFOSUZFU1RfVE9PTCIgPiY1CiskYXNfZWNobyAiJE1BTklGRVNUX1RPT0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wiOyB0aGVuCisgIGFjX2N0X01BTklGRVNUX1RPT0w9JE1BTklGRVNUX1RPT0wKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MPSIkYWNfY3RfTUFOSUZFU1RfVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0w9Im10IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X01BTklGRVNUX1RPT0w9JGFjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTAoraWYgdGVzdCAtbiAiJGFjX2N0X01BTklGRVNUX1RPT0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfTUFOSUZFU1RfVE9PTCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X01BTklGRVNUX1RPT0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9NQU5JRkVTVF9UT09MIiA9IHg7IHRoZW4KKyAgICBNQU5JRkVTVF9UT09MPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE1BTklGRVNUX1RPT0w9JGFjX2N0X01BTklGRVNUX1RPT0wKKyAgZmkKK2Vsc2UKKyAgTUFOSUZFU1RfVE9PTD0iJGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTCIKK2ZpCisKK3Rlc3QgLXogIiRNQU5JRkVTVF9UT09MIiAmJiBNQU5JRkVTVF9UT09MPW10Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRNQU5JRkVTVF9UT09MIGlzIGEgbWFuaWZlc3QgdG9vbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2wuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9tYWluZmVzdF90b29sKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPW5vCisgIGVjaG8gIiRhc19tZTokTElORU5POiAkTUFOSUZFU1RfVE9PTCAnLT8nIiA+JjUKKyAgJE1BTklGRVNUX1RPT0wgJy0/JyAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dAorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBpZiAkR1JFUCAnTWFuaWZlc3QgVG9vbCcgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPXllcworICBmaQorICBybSAtZiBjb25mdGVzdCoKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCIgIT0geHllczsgdGhlbgorICBNQU5JRkVTVF9UT09MPToKK2ZpCisKKworCisKKworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4qKQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRzeW11dGlsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRzeW11dGlsOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19EU1lNVVRJTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiREU1lNVVRJTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19EU1lNVVRJTD0iJERTWU1VVElMIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfRFNZTVVUSUw9IiR7YWNfdG9vbF9wcmVmaXh9ZHN5bXV0aWwiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorRFNZTVVUSUw9JGFjX2N2X3Byb2dfRFNZTVVUSUwKK2lmIHRlc3QgLW4gIiREU1lNVVRJTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICREU1lNVVRJTCIgPiY1CiskYXNfZWNobyAiJERTWU1VVElMIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19EU1lNVVRJTCI7IHRoZW4KKyAgYWNfY3RfRFNZTVVUSUw9JERTWU1VVElMCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZHN5bXV0aWwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRzeW11dGlsOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9EU1lNVVRJTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTD0iJGFjX2N0X0RTWU1VVElMIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUw9ImRzeW11dGlsIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0RTWU1VVElMPSRhY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMCitpZiB0ZXN0IC1uICIkYWNfY3RfRFNZTVVUSUwiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfRFNZTVVUSUwiID4mNQorJGFzX2VjaG8gIiRhY19jdF9EU1lNVVRJTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0RTWU1VVElMIiA9IHg7IHRoZW4KKyAgICBEU1lNVVRJTD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBEU1lNVVRJTD0kYWNfY3RfRFNZTVVUSUwKKyAgZmkKK2Vsc2UKKyAgRFNZTVVUSUw9IiRhY19jdl9wcm9nX0RTWU1VVElMIgorZmkKKworICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW5tZWRpdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1ubWVkaXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX05NRURJVCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTUVESVQiOyB0aGVuCisgIGFjX2N2X3Byb2dfTk1FRElUPSIkTk1FRElUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfTk1FRElUPSIke2FjX3Rvb2xfcHJlZml4fW5tZWRpdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitOTUVESVQ9JGFjX2N2X3Byb2dfTk1FRElUCitpZiB0ZXN0IC1uICIkTk1FRElUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE5NRURJVCIgPiY1CiskYXNfZWNobyAiJE5NRURJVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfTk1FRElUIjsgdGhlbgorICBhY19jdF9OTUVESVQ9JE5NRURJVAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm5tZWRpdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbm1lZGl0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9OTUVESVQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfTk1FRElUIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X05NRURJVD0iJGFjX2N0X05NRURJVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X05NRURJVD0ibm1lZGl0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X05NRURJVD0kYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQKK2lmIHRlc3QgLW4gIiRhY19jdF9OTUVESVQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfTk1FRElUIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfTk1FRElUIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfTk1FRElUIiA9IHg7IHRoZW4KKyAgICBOTUVESVQ9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgTk1FRElUPSRhY19jdF9OTUVESVQKKyAgZmkKK2Vsc2UKKyAgTk1FRElUPSIkYWNfY3ZfcHJvZ19OTUVESVQiCitmaQorCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9bGlwbyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1saXBvOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19MSVBPKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJExJUE8iOyB0aGVuCisgIGFjX2N2X3Byb2dfTElQTz0iJExJUE8iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19MSVBPPSIke2FjX3Rvb2xfcHJlZml4fWxpcG8iCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorTElQTz0kYWNfY3ZfcHJvZ19MSVBPCitpZiB0ZXN0IC1uICIkTElQTyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMSVBPIiA+JjUKKyRhc19lY2hvICIkTElQTyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfTElQTyI7IHRoZW4KKyAgYWNfY3RfTElQTz0kTElQTworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxpcG8iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGxpcG87IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0xJUE8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfTElQTyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9MSVBPPSIkYWNfY3RfTElQTyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0xJUE89ImxpcG8iCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfTElQTz0kYWNfY3ZfcHJvZ19hY19jdF9MSVBPCitpZiB0ZXN0IC1uICIkYWNfY3RfTElQTyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9MSVBPIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfTElQTyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0xJUE8iID0geDsgdGhlbgorICAgIExJUE89IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgTElQTz0kYWNfY3RfTElQTworICBmaQorZWxzZQorICBMSVBPPSIkYWNfY3ZfcHJvZ19MSVBPIgorZmkKKworICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW90b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW90b29sOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19PVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PVE9PTD0iJE9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfT1RPT0w9IiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorT1RPT0w9JGFjX2N2X3Byb2dfT1RPT0wKK2lmIHRlc3QgLW4gIiRPVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPVE9PTCIgPiY1CiskYXNfZWNobyAiJE9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PVE9PTCI7IHRoZW4KKyAgYWNfY3RfT1RPT0w9JE9UT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib3Rvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG90b29sOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9PVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PVE9PTD0iJGFjX2N0X09UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w9Im90b29sIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X09UT09MPSRhY19jdl9wcm9nX2FjX2N0X09UT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT1RPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X09UT09MIiA9IHg7IHRoZW4KKyAgICBPVE9PTD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPVE9PTD0kYWNfY3RfT1RPT0wKKyAgZmkKK2Vsc2UKKyAgT1RPT0w9IiRhY19jdl9wcm9nX09UT09MIgorZmkKKworICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW90b29sNjQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w2NDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfT1RPT0w2NCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPVE9PTDY0IjsgdGhlbgorICBhY19jdl9wcm9nX09UT09MNjQ9IiRPVE9PTDY0IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfT1RPT0w2ND0iJHthY190b29sX3ByZWZpeH1vdG9vbDY0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK09UT09MNjQ9JGFjX2N2X3Byb2dfT1RPT0w2NAoraWYgdGVzdCAtbiAiJE9UT09MNjQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1RPT0w2NCIgPiY1CiskYXNfZWNobyAiJE9UT09MNjQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09UT09MNjQiOyB0aGVuCisgIGFjX2N0X09UT09MNjQ9JE9UT09MNjQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvdG9vbDY0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvdG9vbDY0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09UT09MNjQiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w2ND0iJGFjX2N0X09UT09MNjQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0PSJvdG9vbDY0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X09UT09MNjQ9JGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w2NAoraWYgdGVzdCAtbiAiJGFjX2N0X09UT09MNjQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT1RPT0w2NCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09UT09MNjQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9PVE9PTDY0IiA9IHg7IHRoZW4KKyAgICBPVE9PTDY0PSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9UT09MNjQ9JGFjX2N0X09UT09MNjQKKyAgZmkKK2Vsc2UKKyAgT1RPT0w2ND0iJGFjX2N2X3Byb2dfT1RPT0w2NCIKK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBpZiB0ZXN0IC16ICIke0xUX01VTFRJX01PRFVMRX0iOyB0aGVuCisJIyBCeSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSAtc2luZ2xlX21vZHVsZSBmbGFnLiBZb3UgY2FuIG92ZXJyaWRlCisJIyBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTFRfTVVMVElfTU9EVUxFCisJIyBub24tZW1wdHkgYXQgY29uZmlndXJlIHRpbWUsIG9yIGJ5IGFkZGluZyAtbXVsdGlfbW9kdWxlIHRvIHRoZQorCSMgbGluayBmbGFncy4KKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJZWNobyAiaW50IGZvbyh2b2lkKXtyZXR1cm4gMTt9IiA+IGNvbmZ0ZXN0LmMKKwllY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMiID4mNQorCSRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCisJICAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyAyPmNvbmZ0ZXN0LmVycgorICAgICAgICBfbHRfcmVzdWx0PSQ/CisJIyBJZiB0aGVyZSBpcyBhIG5vbi1lbXB0eSBlcnJvciBsb2csIGFuZCAic2luZ2xlX21vZHVsZSIKKwkjIGFwcGVhcnMgaW4gaXQsIGFzc3VtZSB0aGUgZmxhZyBjYXVzZWQgYSBsaW5rZXIgd2FybmluZworICAgICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVyciAmJiAkR1JFUCBzaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmVycjsgdGhlbgorCSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKwkjIE90aGVyd2lzZSwgaWYgdGhlIG91dHB1dCB3YXMgY3JlYXRlZCB3aXRoIGEgMCBleGl0IGNvZGUgZnJvbQorCSMgdGhlIGNvbXBpbGVyLCBpdCB3b3JrZWQuCisJZWxpZiB0ZXN0IC1mIGxpYmNvbmZ0ZXN0LmR5bGliICYmIHRlc3QgJF9sdF9yZXN1bHQgLWVxIDA7IHRoZW4KKwkgIGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKwlmaQorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwlybSAtZiBjb25mdGVzdC4qCisgICAgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID4mNjsgfQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KKyAgICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgZWNobyAiX21haW4iID4gY29uZnRlc3Quc3ltCisgICAgICBMREZMQUdTPSIkTERGTEFHUyAtV2wsLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCxjb25mdGVzdC5zeW0iCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PXllcworZWxzZQorICBsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPiY2OyB9CisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtZm9yY2VfbG9hZCBsaW5rZXIgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfbGRfZm9yY2VfbG9hZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2xkX2ZvcmNlX2xvYWQ9bm8KKyAgICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDwgX0xUX0VPRgoraW50IGZvcmNlZF9sb2FkZWQoKSB7IHJldHVybiAyO30KK19MVF9FT0YKKyAgICAgIGVjaG8gIiRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMiID4mNQorICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyAyPiY1CisgICAgICBlY2hvICIkQVIgY3J1IGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QubyIgPiY1CisgICAgICAkQVIgY3J1IGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QubyAyPiY1CisgICAgICBlY2hvICIkUkFOTElCIGxpYmNvbmZ0ZXN0LmEiID4mNQorICAgICAgJFJBTkxJQiBsaWJjb25mdGVzdC5hIDI+JjUKKyAgICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDwgX0xUX0VPRgoraW50IG1haW4oKSB7IHJldHVybiAwO30KK19MVF9FT0YKKyAgICAgIGVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEiID4mNQorICAgICAgJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSAyPmNvbmZ0ZXN0LmVycgorICAgICAgX2x0X3Jlc3VsdD0kPworICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgZm9yY2VfbG9hZCBjb25mdGVzdC5lcnI7IHRoZW4KKwljYXQgY29uZnRlc3QuZXJyID4mNQorICAgICAgZWxpZiB0ZXN0IC1mIGNvbmZ0ZXN0ICYmIHRlc3QgJF9sdF9yZXN1bHQgLWVxIDAgJiYgJEdSRVAgZm9yY2VkX2xvYWQgY29uZnRlc3QgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCWx0X2N2X2xkX2ZvcmNlX2xvYWQ9eWVzCisgICAgICBlbHNlCisJY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgICAgIGZpCisgICAgICAgIHJtIC1mIGNvbmZ0ZXN0LmVyciBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMKKyAgICAgICAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID4mNjsgfQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbjEuKikKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4qKSAjIGRhcndpbiA1Lnggb24KKyAgICAgICMgaWYgcnVubmluZyBvbiAxMC41IG9yIGxhdGVyLCB0aGUgZGVwbG95bWVudCB0YXJnZXQgZGVmYXVsdHMKKyAgICAgICMgdG8gdGhlIE9TIHZlcnNpb24sIGlmIG9uIHg4NiwgYW5kIDEwLjQsIHRoZSBkZXBsb3ltZW50CisgICAgICAjIHRhcmdldCBkZWZhdWx0cyB0byAxMC40LiBEb24ndCB5b3UgbG92ZSBpdD8KKyAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQtMTAuMH0sJGhvc3QgaW4KKwkxMC4wLCo4NiotZGFyd2luOCp8MTAuMCwqLWRhcndpbls5MV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworCTEwLlswMTJdKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKwkxMC4qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworICAgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9zaW5nbGVfbW9kPSckc2luZ2xlX21vZHVsZScKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9JyAke3dsfS1leHBvcnRlZF9zeW1ib2xzX2xpc3QsJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bScKKyAgICBlbHNlCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPSd+JE5NRURJVCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBmaQorICAgIGlmIHRlc3QgIiREU1lNVVRJTCIgIT0gIjoiICYmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJubyI7IHRoZW4KKyAgICAgIF9sdF9kc3ltdXRpbD0nfiREU1lNVVRJTCAkbGliIHx8IDonCisgICAgZWxzZQorICAgICAgX2x0X2RzeW11dGlsPQorICAgIGZpCisgICAgOzsKKyAgZXNhYworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlmICR7YWNfY3ZfcHJvZ19DUFArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKworZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAorZWxzZQorICBhY19jdl9wcm9nX0NQUD0kQ1BQCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDUFAiID4mNQorJGFzX2VjaG8gIiRDUFAiID4mNjsgfQorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgOgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgorZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCisJCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdAorIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworZm9yIGFjX2hlYWRlciBpbiBkbGZjbi5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJkbGZjbi5oIiAiYWNfY3ZfaGVhZGVyX2RsZmNuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdAorIgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RMRkNOX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisKK2Z1bmNfc3RyaXBuYW1lX2NuZiAoKQoreworICBjYXNlICR7Mn0gaW4KKyAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJSR7Mn1cJCUlImA7OworICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWVfY25mCisKKworCisKKworIyBTZXQgb3B0aW9ucworCisKKworICAgICAgICBlbmFibGVfZGxvcGVuPW5vCisKKworICBlbmFibGVfd2luMzJfZGxsPW5vCisKKworICAgICAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zaGFyZWQ7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OworICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc2hhcmVkPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfc2hhcmVkPXllcworZmkKKworCisKKworCisKKworCisKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9eWVzCitmaQorCisKKworCisKKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9waWM7IGx0X3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkd2l0aHZhbCBpbgorICAgIHllc3xubykgcGljX21vZGU9JHdpdGh2YWwgOzsKKyAgICAqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgbHRfcGtnIGluICR3aXRodmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkbHRfcGtnIiA9ICJYJGx0X3AiOyB0aGVuCisJICBwaWNfbW9kZT15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgcGljX21vZGU9ZGVmYXVsdAorZmkKKworCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKKworCisKKworCisKKworICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbDsgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCitmaQorCisKKworCisKKworCisKKworCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGx0bWFpbiIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgorCisKKworCisKKworCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igb2JqZGlyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfb2JqZGlyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfb2JqZGlyIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfb2JqZGlyIiA+JjY7IH0KK29iamRpcj0kbHRfY3Zfb2JqZGlyCisKKworCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMVF9PQkpESVIgIiRsdF9jdl9vYmpkaXIvIgorX0FDRU9GCisKKworCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIEdsb2JhbCB2YXJpYWJsZXM6CitvZmlsZT1saWJ0b29sCitjYW5fYnVpbGRfc2hhcmVkPXllcworCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTVNWQywKKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KK2xpYmV4dD1hCisKK3dpdGhfZ251X2xkPSIkbHRfY3ZfcHJvZ19nbnVfbGQiCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRDQyIgJiYgQ0M9Y2MKK3Rlc3QgLXogIiRMVENDIiAmJiBMVENDPSRDQwordGVzdCAteiAiJExUQ0ZMQUdTIiAmJiBMVENGTEFHUz0kQ0ZMQUdTCit0ZXN0IC16ICIkTEQiICYmIExEPWxkCit0ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bworCitmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkRUNITyAiJGNjX3RlbXAiIHwgJFNFRCAicyUuKi8lJTsgcyVeJGhvc3RfYWxpYXMtJSUiYAorCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAordGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKK2Nhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCitmaWxlX21hZ2ljKikKKyAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3BhdGhfTUFHSUNfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTUFHSUNfQ01EIGluCitbXFwvKl0gfCAgPzpbXFwvXSopCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyopCisgIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgYWNfZHVtbXk9Ii91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworX0xUX0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWMKK2ZpCisKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorJGFzX2VjaG8gIiRNQUdJQ19DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworCisKKworaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZmlsZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZmlsZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX01BR0lDX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9maWxlOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci9maWxlIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworX0xUX0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWMKK2ZpCisKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorJGFzX2VjaG8gIiRNQUdJQ19DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCisKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKKworbHRfc2F2ZV9DQz0iJENDIgorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitvYmpleHQ9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9JworCisKKworCisKKworCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKyMgU2F2ZSB0aGUgZGVmYXVsdCBjb21waWxlciwgc2luY2UgaXQgZ2V0cyBvdmVyd3JpdHRlbiB3aGVuIHRoZSBvdGhlcgorIyB0YWdzIGFyZSBiZWluZyB0ZXN0ZWQsIGFuZCBfTFRfVEFHVkFSKGNvbXBpbGVyLCBbXSkgaXMgYSBOT1AuCitjb21waWxlcl9ERUZBVUxUPSRDQworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSAtciBjb25mdGVzdCoKKworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIG52Y2MqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLVhjb21waWxlciAtZm5vLWJ1aWx0aW4nIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nIDs7CisgIGVzYWMKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSItZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSB4eWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgorZWxzZQorICAgIDoKK2ZpCisKK2ZpCisKKworCisKKworCisgIGx0X3Byb2dfY29tcGlsZXJfd2w9CitsdF9wcm9nX2NvbXBpbGVyX3BpYz0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9CisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgaW50ZXJpeFszLTldKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgbnZjYyopICMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctWGxpbmtlciAnCisgICAgICBpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSItWGNvbXBpbGVyICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWM9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisgICAgICBlY2MqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBpY2MgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisgICAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KKyAgICAgIGljYyogfCBpZm9ydCopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIExhaGV5IEZvcnRyYW4gOC4xLgorICAgICAgbGY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLS1zaGFyZWQnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy0tc3RhdGljJworCTs7CisgICAgICBuYWdmb3IqKQorCSMgTkFHIEZvcnRyYW4gY29tcGlsZXIKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsLVdsLCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1QSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCTs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZnBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqIHwgYmd4bCogfCBiZ2YqIHwgbXBpeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSwgMTEuMSBvbiBQUEMgYW5kIEJsdWVHZW5lCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXFwaWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1xc3RhdGljbGluaycKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDZXJlc1wgRm9ydHJhbiogfCAqU3VuKkZvcnRyYW4qXCBbMS03XS4qIHwgKlN1bipGb3J0cmFuKlwgOC5bMC0zXSopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPScnCisJICA7OworCSpTdW5cIEYqIHwgKlN1bipGb3J0cmFuKikKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICcKKwkgIDs7CisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCSAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwkgIDs7CisgICAgICAgICpJbnRlbCpcIFtDRl0qQ29tcGlsZXIqKQorCSAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworCSAgOzsKKwkqUG9ydGxhbmRcIEdyb3VwKikKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZwaWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgcmRvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZjc3KiB8IGY5MCogfCBmOTUqIHwgc3VuZjc3KiB8IHN1bmY5MCogfCBzdW5mOTUqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS2NvbmZvcm1fcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKKyAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWM9JGx0X3Byb2dfY29tcGlsZXJfcGljCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljIiA+JjY7IH0KK2x0X3Byb2dfY29tcGlsZXJfcGljPSRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3M9bm8KKyAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpYyBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljIiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworZmkKKworZmkKKworCisKKworCisKKworCisKKworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgorICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KK2ZpCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNjsgfQorCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkUk0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICAkUk0gLXIgY29uZnRlc3QKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2OyB9CisKKworCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQorICBoYXJkX2xpbmtzPXllcworICAkUk0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisKKyAgcnVucGF0aF92YXI9CisgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQorICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgYXJjaGl2ZV9jbWRzPQorICBhcmNoaXZlX2V4cHN5bV9jbWRzPQorICBjb21waWxlcl9uZWVkc19vYmplY3Q9bm8KKyAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubworICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CisgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgaGFyZGNvZGVfYXV0b21hdGljPW5vCisgIGhhcmRjb2RlX2RpcmVjdD1ubworICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9bm8KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKyAgaGFyZGNvZGVfbWludXNfTD1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCisgIGluaGVyaXRfcnBhdGg9bm8KKyAgbGlua19hbGxfZGVwbGlicz11bmtub3duCisgIG1vZHVsZV9jbWRzPQorICBtb2R1bGVfZXhwc3ltX2NtZHM9CisgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9CisgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQorICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9CisgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIGluY2x1ZGVfZXhwc3ltcz0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBleGNsdWRlX2V4cHN5bXM9J19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKicKKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgbGludXgqIHwgaypic2QqLWdudSB8IGdudSopCisgICAgbGlua19hbGxfZGVwbGlicz1ubworICAgIDs7CisgIGVzYWMKKworICBsZF9zaGxpYnM9eWVzCisKKyAgIyBPbiBzb21lIHRhcmdldHMsIEdOVSBsZCBpcyBjb21wYXRpYmxlIGVub3VnaCB3aXRoIHRoZSBuYXRpdmUgbGlua2VyCisgICMgdGhhdCB3ZSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBuYXRpdmUgaW50ZXJmYWNlIGZvciBib3RoLgorICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT1ubworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKwkjIFRoZSBBSVggcG9ydCBvZiBHTlUgbGQgaGFzIGFsd2F5cyBhc3BpcmVkIHRvIGNvbXBhdGliaWxpdHkKKwkjIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIuICBIb3dldmVyLCBhcyB0aGUgd2FybmluZyBpbiB0aGUgR05VIGxkCisJIyBibG9jayBzYXlzLCB2ZXJzaW9ucyBiZWZvcmUgMi4xOS41KiBjb3VsZG4ndCByZWFsbHkgY3JlYXRlIHdvcmtpbmcKKwkjIHNoYXJlZCBsaWJyYXJpZXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGludGVyZmFjZSB1c2VkLgorCWNhc2UgYCRMRCAtdiAyPiYxYCBpbgorCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuMTkuNSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi5bMi05XSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgWzMtOV0qKSA7OworCSAgKikKKwkgICAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqKQorCWx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCTs7CisgICAgZXNhYworICBmaQorCisgIGlmIHRlc3QgIiRsdF91c2VfZ251X2xkX2ludGVyZmFjZSIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGVsc2UKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAqR05VXCBnb2xkKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeFszLTldKikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi4xOSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIGJpbnV0aWxzCisqKiogMi4yMCBvciBhYm92ZSwgb3IgbW9kaWZ5IHlvdXIgUEFUSCBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQuCisqKiogWW91IHdpbGwgdGhlbiBuZWVkIHRvIHJlc3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4KKworX0xUX0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxIERBVEEvO3MvXi4qWyBdX19ubV9fXChbXiBdKlwpWyBdW14gXSovXDEgREFUQS87L15JWyBdL2Q7L15bQUlUV11bIF0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIGV4Y2x1ZGVfZXhwc3ltcz0nW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJYXJjaGl2ZV9leHBzeW1fY21kcz0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgOzsKKworICAgIGludGVyaXhbMy05XSopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICB0bXBfZGlldD1ubworICAgICAgaWYgdGVzdCAiJGhvc3Rfb3MiID0gbGludXgtZGlldGxpYmM7IHRoZW4KKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZGlldFwgKikgdG1wX2RpZXQ9eWVzOzsJIyBsaW51eC1kaWV0bGliYyB3aXRoIHN0YXRpYyBsaW5raW5nICghZGlldC1keW4pCisJZXNhYworICAgICAgZmkKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRFR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsIFwKKwkgJiYgdGVzdCAiJHRtcF9kaWV0IiA9IG5vCisgICAgICB0aGVuCisJdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnCisJY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCisgICAgICAgIHBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorCQkJCQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7CisJZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKKwlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgorCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKKwlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisJICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7CisJeGxbY0NdKiB8IGJneGxbY0NdKiB8IG1waXhsW2NDXSopICMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKKwkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJworCSAgdG1wX2FkZGZsYWc9IDs7CisJbnZjYyopCSMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCisJICA7OworCWVzYWMKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJKlN1blwgRiopCQkJIyBTdW4gRm9ydHJhbiA4LjMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwllc2FjCisJYXJjaGl2ZV9jbWRzPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisgICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgICBmaQorCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwl4bGYqIHwgYmdmKiB8IGJneGxmKiB8IG1waXhsZiopCisJICAjIElCTSBYTCBGb3J0cmFuIDEwLjEgb24gUFBDIGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnMgaXRzZWxmCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLW8gJGxpYicKKwkgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLXZlcnNpb24tc2NyaXB0ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCSAgZmkKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90CisqKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKwk7OworCSopCisJICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCisJICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQorCSAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KKwkgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIGxkX3NobGlicz1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0gbm87IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgIGZpCisgIGVsc2UKKyAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFs0LTldKikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsCisJIyBkZWZpbmVkIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgorCWlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4WzUtOV0qKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kcz0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICBmaWxlX2xpc3Rfc3BlYz0nJHt3bH0tZiwnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKwkgIGZpCisJICA7OworCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCWZpCisJbGlua19hbGxfZGVwbGlicz1ubworICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nLWJlcm9rJworICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKyAgICAgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgICBpZiB0ZXN0ICIke2x0X2N2X2FpeF9saWJwYXRoK3NldH0iID0gc2V0OyB0aGVuCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aAorZWxzZQorICBpZiAke2x0X2N2X2FpeF9saWJwYXRoXys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJICAvXjAvIHsKKwkgICAgICBzL14wICAqXChbXiBdKlwpICokL1wxLworCSAgICAgIHAKKwkgIH0KKyAgICAgIH0nCisgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfCitmaQorCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ii16IG5vZGVmcyIKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisJZWxzZQorCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKwkgIyBlbXB0eSBleGVjdXRhYmxlLgorCSBpZiB0ZXN0ICIke2x0X2N2X2FpeF9saWJwYXRoK3NldH0iID0gc2V0OyB0aGVuCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aAorZWxzZQorICBpZiAke2x0X2N2X2FpeF9saWJwYXRoXys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJICAvXjAvIHsKKwkgICAgICBzL14wICAqXChbXiBdKlwpICokL1wxLworCSAgICAgIHAKKwkgIH0KKyAgICAgIH0nCisgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfCitmaQorCisJIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGVsc2UKKwkgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSckY29udmVuaWVuY2UnCisJICBmaQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVs0NV0qKQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjbCopCisJIyBOYXRpdmUgTVNWQworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKwlhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJZmlsZV9saXN0X3NwZWM9J0AnCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwlsaWJleHQ9bGliCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJc2hyZXh0X2NtZHM9Ii5kbGwiCisJIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCWFyY2hpdmVfY21kcz0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJYXJjaGl2ZV9leHBzeW1fY21kcz0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgc2VkIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGVsc2UKKwkgICAgc2VkIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGZpfgorCSAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgbGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICk9J3RydWUnCisJZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKwlleGNsdWRlX2V4cHN5bXM9J19OVUxMX0lNUE9SVF9ERVNDUklQVE9SfF9JTVBPUlRfREVTQ1JJUFRPUl8uKicKKwlleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU11bIF0vcy8uKlsgXVwoW14gXSpcKS9cMSxEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXVsgXS9zLy4qWyBdLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisJIyBEb24ndCB1c2UgcmFubGliCisJb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworCXBvc3RsaW5rX2NtZHM9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICouZXhlfCouRVhFKSA7OworCSAgICAqKQorCSAgICAgIGx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICBsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCSAgICAgIDs7CisJICBlc2FjfgorCSAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICBmaScKKwk7OworICAgICAgKikKKwkjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwlsaWJleHQ9bGliCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJc2hyZXh0X2NtZHM9Ii5kbGwiCisJIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCWFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBmdW5jX2VjaG9fYWxsICIkZGVwbGlicyIgfCAkU0VEICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKwlvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSd0cnVlJworCSMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisJb2xkX2FyY2hpdmVfY21kcz0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworCWVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorCisKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgaGFyZGNvZGVfZGlyZWN0PW5vCisgIGhhcmRjb2RlX2F1dG9tYXRpYz15ZXMKKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAieWVzIjsgdGhlbgorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSdgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UgJHt3bH0tZm9yY2VfbG9hZCwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCcKKworICBlbHNlCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JycKKyAgZmkKKyAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRfbHRfZGFyX2FsbG93X3VuZGVmaW5lZCIKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgaWZvcnQqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9eWVzIDs7CisgICAgICopIF9sdF9kYXJfY2FuX3NoYXJlZD0kR0NDIDs7CisgIGVzYWMKKyAgaWYgdGVzdCAiJF9sdF9kYXJfY2FuX3NoYXJlZCIgPSAieWVzIjsgdGhlbgorICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKKyAgICBhcmNoaXZlX2NtZHM9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgbW9kdWxlX2NtZHM9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICR7X2x0X2Rhcl9zaW5nbGVfbW9kfSR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisKKyAgZWxzZQorICBsZF9zaGxpYnM9bm8KKyAgZmkKKworICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyLiopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKwloYXJkY29kZV9kaXJlY3Q9eWVzCisJaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCWhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgxMSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisKKwkgICMgT2xkZXIgdmVyc2lvbnMgb2YgdGhlIDExLjAwIGNvbXBpbGVyIGRvIG5vdCB1bmRlcnN0YW5kIC1iIHlldAorCSAgIyAoSFA5MjQ1My0wMSBBLjExLjAxLjIwIGRvZXNuJ3QsIEhQOTI0NTMtMDEgQi4xMS5YLjM1MTc1LTM1MTc2LkdQIGRvZXMpCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyB1bmRlcnN0YW5kcyAtYiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0MgdW5kZXJzdGFuZHMgLWIuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9fYis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAtYiIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRFQ0hPICIkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9fYj15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9fYj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gLXIgY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX19iIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9fYiIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9fYiIgPSB4eWVzOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKK2Vsc2UKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCitmaQorCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwkgIDs7CisJKikKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKwkgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKworCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkjIFRyeSB0byB1c2UgdGhlIC1leHBvcnRlZF9zeW1ib2wgbGQgb3B0aW9uLCBpZiBpdCBkb2VzIG5vdAorCSMgd29yaywgYXNzdW1lIHRoYXQgLWV4cG9ydHNfZmlsZSBkb2VzIG5vdCB3b3JrIGVpdGhlciBhbmQKKwkjIGltcGxpY2l0bHkgZXhwb3J0IGFsbCBzeW1ib2xzLgorCSMgVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBsYW5ndWFnZXMsIHNvIG5vIHBlci10YWcgY2FjaGUgdmFyaWFibGUuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRob3N0X29zIGxpbmtlciBhY2NlcHRzIC1leHBvcnRlZF9zeW1ib2wuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorCSAgIExERkxBR1M9IiRMREZMQUdTIC1zaGFyZWQgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sICR7d2x9Zm9vICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfS9kZXYvbnVsbCIKKwkgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2w9eWVzCitlbHNlCisgIGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID4mNjsgfQorCWlmIHRlc3QgIiRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zICR7d2x9LWV4cG9ydHNfZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCWZpCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLWV4cG9ydHNfZmlsZSAkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz0nbm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGluaGVyaXRfcnBhdGg9eWVzCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCWhhcmRjb2RlX2RpcmVjdD15ZXMKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcworCWlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKwllbHNlCisJICBjYXNlICRob3N0X29zIGluCisJICAgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKKwkgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKwkgICAgIDs7CisJICAgKikKKwkgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgb3MyKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYXJjaGl2ZV9jbWRzPSckRUNITyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSdubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBwcmludGYgIiVzXFxuIiAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkkQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgJGNvbXBpbGVyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRSTSAkbGliLmV4cCcKKworCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz0nbm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogZGVmcycKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworICAgICAgZWxzZQorCWNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSoiQ29tcGlsZXJzIDUuMCIqKQorCSAgd2xhcmM9JycKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCSopCisJICB3bGFyYz0nJHt3bH0nCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKyAgICAgICopCisJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLiAgR0NDIGRpc2NhcmRzIGl0IHdpdGhvdXQgYCR3bCcsCisJIyBidXQgaXMgY2FyZWZ1bCBlbm91Z2ggbm90IHRvIHJlb3JkZXIuCisJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwlpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwllbHNlCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCisJIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubworCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgorCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCkKKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisJc25pKQorCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3Q9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgcmVsb2FkX2NtZHM9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdD1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJbGRfc2hsaWJzPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuWzAyNF0qKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgICAjIGFzIC16IGRlZnMuCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosbm9kZWZzJworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIsJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CZXhwb3J0JworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgeCRob3N0X3ZlbmRvciA9IHhzbmk7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzIiA+JjUKKyRhc19lY2hvICIkbGRfc2hsaWJzIiA+JjY7IH0KK3Rlc3QgIiRsZF9zaGxpYnMiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit3aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKKworCisKKworCisKKworCisKKworCisKKworCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGMiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkYXJjaGl2ZV9jbWRzIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgJFJNIGNvbmZ0ZXN0KgorCWVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisJaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorCSAgc29uYW1lPWNvbmZ0ZXN0CisJICBsaWI9Y29uZnRlc3QKKwkgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorCSAgZGVwbGlicz0KKwkgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsCisJICBwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWMKKwkgIGNvbXBpbGVyX2ZsYWdzPS12CisJICBsaW5rZXJfZmxhZ3M9LXYKKwkgIHZlcnN0cmluZz0KKwkgIG91dHB1dF9vYmpkaXI9LgorCSAgbGlibmFtZT1jb25mdGVzdAorCSAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQorCSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKwkgIHRoZW4KKwkgICAgbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKwkgIGVsc2UKKwkgICAgbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisJICBmaQorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKwlmaQorCSRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY2OyB9CisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz0kbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWRfc3RyaXBfZXE9InMsPVwoW0EtWmEtel06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAorICAgIDs7CisgICopCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgOzsKKyAgZXNhYworICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtsdF9mb29dKys7IH0KKyAgaWYgKGx0X2ZyZXFbbHRfZm9vXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQorfSdgCisgICMgQVdLIHByb2dyYW0gYWJvdmUgZXJyb25lb3VzbHkgcHJlcGVuZHMgJy8nIHRvIEM6L2Rvcy9wYXRocworICAjIGZvciB0aGVzZSBob3N0cy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8XAorICAgICAgJFNFRCAncywvXChbQS1aYS16XTpcKSxcMSxnJ2AgOzsKKyAgZXNhYworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeFs0LTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgcG93ZXJwYykKKyAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCisgICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIDs7CisgIG02OGspCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gZnVuY19lY2hvX2FsbCAiJGxpYiIgfCAkU0VEICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJFJNIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICAgIDs7CisgIGVzYWMKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xpYi93MzJhcGkiCisgICAgICA7OworICAgIG1pbmd3KiB8IGNlZ2NjKikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisKKyAgKixjbCopCisgICAgIyBOYXRpdmUgTVNWQworICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5kbGwubGliJworCisgICAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgICBtaW5ndyopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9CisgICAgICBsdF9zYXZlX2lmcz0kSUZTCisgICAgICBJRlM9JzsnCisgICAgICBmb3IgbHRfcGF0aCBpbiAkTElCCisgICAgICBkbworICAgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAgICMgTGV0IERPUyB2YXJpYWJsZSBleHBhbnNpb24gcHJpbnQgdGhlIHNob3J0IDguMyBzdHlsZSBmaWxlIG5hbWUuCisgICAgICAgIGx0X3BhdGg9YGNkICIkbHRfcGF0aCIgMj4vZGV2L251bGwgJiYgY21kIC8vQyAiZm9yICVpIGluICgiLiIpIGRvIEBlY2hvICV+c2kiYAorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgJGx0X3BhdGgiCisgICAgICBkb25lCisgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAjIENvbnZlcnQgdG8gTVNZUyBzdHlsZS4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgc2VkIC1lICdzfFxcXFx8L3xnJyAtZSAnc3wgXFwoW2EtekEtWl1cXCk6fCAvXFwxfGcnIC1lICdzfF4gfHwnYAorICAgICAgOzsKKyAgICBjeWd3aW4qKQorICAgICAgIyBDb252ZXJ0IHRvIHVuaXggZm9ybSwgdGhlbiB0byBkb3MgZm9ybSwgdGhlbiBiYWNrIHRvIHVuaXggZm9ybQorICAgICAgIyBidXQgdGhpcyB0aW1lIGRvcyBzdHlsZSAobm8gc3BhY2VzISkgc28gdGhhdCB0aGUgdW5peCBmb3JtIGxvb2tzCisgICAgICAjIGxpa2UgL2N5Z2RyaXZlL2MvUFJPR1JBfjE6L2N5Z2RyLi4uCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJExJQiJgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tZG9zICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiAyPi9kZXYvbnVsbGAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICA7OworICAgICopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRMSUIiCisgICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkR1JFUCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgICMgRklYTUU6IGZpbmQgdGhlIHNob3J0IG5hbWUgb3IgdGhlIHBhdGggY29tcG9uZW50cywgYXMgc3BhY2VzIGFyZQorICAgICAgIyBjb21tb24uIChlLmcuICJQcm9ncmFtIEZpbGVzIiAtPiAiUFJPR1JBfjEiKQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGluay5leGUnCisgICAgOzsKKworICAqKQorICAgICMgQXNzdW1lIE1TVkMgd3JhcHBlcgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKyAgZXNhYworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCisKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzIzXS4qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMi4qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hhaWt1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBydW50aW1lX2xvYWRlciIKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvYm9vdC9ob21lL2NvbmZpZy9saWIgL2Jvb3QvY29tbW9uL2xpYiAvYm9vdC9zeXN0ZW0vbGliJworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LCAuLi4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgICMgb3IgZmFpbHMgb3V0cmlnaHQsIHNvIG92ZXJyaWRlIGF0b21pY2FsbHk6CisgIGluc3RhbGxfb3ZlcnJpZGVfbW9kZT01NTUKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBpZiAke2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkbHRfcHJvZ19jb21waWxlcl93bFwiOyBcCisJIExERkxBR1M9XCJcJExERkxBR1MgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIiIKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgaWYgICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbDsgdGhlbiA6CisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKK2ZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgICBsaWJkaXI9JHNhdmVfbGliZGlyCisKK2ZpCisKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZGVsZiotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworcmRvcyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordHBmKikKKyAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1CiskYXNfZWNobyAiJGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8CisgICB0ZXN0IC1uICIkcnVucGF0aF92YXIiIHx8CisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCApIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbiIgPiY1CiskYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbiIgPiY2OyB9CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rIHx8CisgICB0ZXN0ICIkaW5oZXJpdF9ycGF0aCIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKKworCisKKworCisgIGlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKK2Vsc2UKKworICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKworZmkKKworICAgIDs7CisKKyAgKikKKyAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaGxfbG9hZCIgImFjX2N2X2Z1bmNfc2hsX2xvYWQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxkX3NobF9sb2FkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbGQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNobF9sb2FkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2hsX2xvYWQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKK2Vsc2UKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfc3ZsZF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHN2bGQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9zdmxkX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RsZF9kbGRfbGluays6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbGRfbGluayAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsZF9saW5rICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKKworICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorCisgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2Rsb3Blbl9zZWxmKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcworZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisjbGluZSAkTElORU5PICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXaGVuIC1mdmlzYmlsaXR5PWhpZGRlbiBpcyB1c2VkLCBhc3N1bWUgdGhlIGNvZGUgaGFzIGJlZW4gYW5ub3RhdGVkCisgICBjb3JyZXNwb25kaW5nbHkgZm9yIHRoZSBzeW1ib2xzIG5lZWRlZC4gICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiAzKSkKK2ludCBmbm9yZCAoKSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKTsKKyNlbmRpZgorCitpbnQgZm5vcmQgKCkgeyByZXR1cm4gNDI7IH0KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgICAgIGVsc2UgcHV0cyAoZGxlcnJvciAoKSk7CisJfQorICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KK19MVF9FT0YKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNjsgfQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9CitfTFRfRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mNSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OworICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjY7IH0KKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCAkR1JFUCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgorICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKKyAgICAgIG9sZF9zdHJpcGxpYj0iJFNUUklQIC1TIgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICBmaQorICAgIDs7CisgICopCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgOzsKKyAgZXNhYworZmkKKworCisKKworCisKKworCisKKworCisKKyAgIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQorJGFzX2VjaG8gIiRjYW5fYnVpbGRfc2hhcmVkIiA+JjY7IH0KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgZmkKKyAgICA7OworCisgIGFpeFs0LTldKikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQorJGFzX2VjaG8gIiRlbmFibGVfc2hhcmVkIiA+JjY7IH0KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zdGF0aWMiID4mNQorJGFzX2VjaG8gIiRlbmFibGVfc3RhdGljIiA+JjY7IH0KKworCisKKworZmkKK2FjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworICAgICAgaWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKKyAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKKyAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KKyAgYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkQ1hYQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1hYQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENYWENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDWFhDUFAgaW4gIiRDWFggLUUiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKKworZmkKKyAgQ1hYQ1BQPSRhY19jdl9wcm9nX0NYWENQUAorZWxzZQorICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDWFhDUFAiID4mNQorJGFzX2VjaG8gIiRDWFhDUFAiID4mNjsgfQorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQysrIHByZXByb2Nlc3NvciBcIiRDWFhDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitmaQorCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCitlbHNlCisgIF9sdF9jYXVnaHRfQ1hYX2Vycm9yPXllcworZmkKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCithbGxvd191bmRlZmluZWRfZmxhZ19DWFg9CithbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCithcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0KK2NvbXBpbGVyX25lZWRzX29iamVjdF9DWFg9bm8KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9CitoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYPW5vCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQoraGFyZGNvZGVfbWludXNfTF9DWFg9bm8KK2hhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPXVuc3VwcG9ydGVkCitoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPW5vCitpbmhlcml0X3JwYXRoX0NYWD1ubworbW9kdWxlX2NtZHNfQ1hYPQorbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0KK2xpbmtfYWxsX2RlcGxpYnNfQ1hYPXVua25vd24KK29sZF9hcmNoaXZlX2NtZHNfQ1hYPSRvbGRfYXJjaGl2ZV9jbWRzCityZWxvYWRfZmxhZ19DWFg9JHJlbG9hZF9mbGFnCityZWxvYWRfY21kc19DWFg9JHJlbG9hZF9jbWRzCitub191bmRlZmluZWRfZmxhZ19DWFg9Cit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9CitlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jcHAKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X0NYWD0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIENYWCBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oaW50LCBjaGFyICpbXSkgeyByZXR1cm4oMCk7IH0nCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gY29uZnRlc3QqCisKKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIC1yIGNvbmZ0ZXN0KgorCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0kQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBsdF9zYXZlX0xEPSRMRAorICBsdF9zYXZlX0dDQz0kR0NDCisgIEdDQz0kR1hYCisgIGx0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCisgIGx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAorICBpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKKyAgZmkKKyAgdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKKyAgQ0M9JHtDWFgtImMrKyJ9CisgIENGTEFHUz0kQ1hYRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIGNvbXBpbGVyX0NYWD0kQ0MKKyAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKKworCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICAjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2hlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKKyAgICAjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWD0nIC1mbm8tYnVpbHRpbicKKyAgICBlbHNlCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9CisgICAgZmkKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gIiA+JjY7IH0KKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gJEVDSE8gIiRhY19wcm9nInwgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSAkRUNITyAiJGFjX3Byb2ciIHwgJEdSRVAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gJEVDSE8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gIiA+JjY7IH0KK2ZpCitpZiAke2x0X2N2X3BhdGhfTEQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEIiA+JjUKKyRhc19lY2hvICIkTEQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCit0ZXN0IC16ICIkTEQiICYmIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19nbnVfbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfZ251X2xkIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNjsgfQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCisKKworCisKKworCisKKyAgICAgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAgICAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAkcGljX2ZsYWcgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworICAgICAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgICAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCisgICAgICAgIHdsYXJjPScke3dsfScKKworICAgICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwKKwkgICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KKyAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgICAgd2xhcmM9CisKKyAgICAgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KKyAgICAgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKKyAgICAgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCisgICAgICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCisgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgICAgIGZpCisKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKyAgICBlbHNlCisgICAgICBHWFg9bm8KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICB3bGFyYz0KKyAgICBmaQorCisgICAgIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorICAgIGxkX3NobGlic19DWFg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgIDs7CisgICAgICBhaXhbNC05XSopCisgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4WzUtOV0qKQorCSAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgICAgICBjYXNlICRsZF9mbGFnIGluCisJICAgICAgKi1icnRsKikKKwkgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgICAgICBicmVhaworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgICAgZmkKKworICAgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPScnCisgICAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisgICAgICAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9eWVzCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JworICAgICAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKyAgICAgICAgZmlsZV9saXN0X3NwZWNfQ1hYPScke3dsfS1mLCcKKworICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisgICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisgICAgICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICAgIDoKKwkgIGVsc2UKKwkgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXVuc3VwcG9ydGVkCisJICAgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICAgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLUwkbGliZGlyJworCSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KKwkgIGZpCisgICAgICAgICAgZXNhYworICAgICAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCSAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSAgIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKyAgICAgICAgICBlbHNlCisJICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgICBlbHNlCisJICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJleHBhbGwnCisgICAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8KKwkjIGV4cG9ydC4KKyAgICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD15ZXMKKyAgICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisgICAgICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nLWJlcm9rJworICAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eQorICAgICAgICAgICMgZXhlY3V0YWJsZS4KKyAgICAgICAgICBpZiB0ZXN0ICIke2x0X2N2X2FpeF9saWJwYXRoK3NldH0iID0gc2V0OyB0aGVuCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aAorZWxzZQorICBpZiAke2x0X2N2X2FpeF9saWJwYXRoX19DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJICAvXjAvIHsKKwkgICAgICBzL14wICAqXChbXiBdKlwpICokL1wxLworCSAgICAgIHAKKwkgIH0KKyAgICAgIH0nCisgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoX19DWFgiOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWCI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPSIvdXNyL2xpYjovbGliIgorICBmaQorCitmaQorCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aF9fQ1hYCitmaQorCisgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisKKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSIteiBub2RlZnMiCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorICAgICAgICAgIGVsc2UKKwkgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgICAgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF9fQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF9fQ1hYIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoX19DWFgiOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWAorZmkKKworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1iZXJub3RvaycKKwkgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVyb2snCisJICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIGVsc2UKKwkgICAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyRjb252ZW5pZW5jZScKKwkgICAgZmkKKwkgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworCSAgICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQKKwkgICAgIyBsaWJyYXJpZXMuCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgYmVvcyopCisJaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCisJICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJZWxzZQorCSAgbGRfc2hsaWJzX0NYWD1ubworCWZpCisJOzsKKworICAgICAgY2hvcnVzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICAqKQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBsZF9zaGxpYnNfQ1hYPW5vCisJICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKwljYXNlICRHWFgsJGNjX2Jhc2VuYW1lIGluCisJLGNsKiB8IG5vLGNsKikKKwkgICMgTmF0aXZlIE1TVkMKKwkgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKwkgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nICcKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorCSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD15ZXMKKwkgIGZpbGVfbGlzdF9zcGVjX0NYWD0nQCcKKwkgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJICBsaWJleHQ9bGliCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwkgIHNocmV4dF9jbWRzPSIuZGxsIgorCSAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAkU0VEIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZWxzZQorCSAgICAgICRTRUQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgICBmaX4KKwkgICAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgICBsaW5rbmFtZXM9JworCSAgIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSAgIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsIENYWCk9J3RydWUnCisJICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD15ZXMKKwkgICMgRG9uJ3QgdXNlIHJhbmxpYgorCSAgb2xkX3Bvc3RpbnN0YWxsX2NtZHNfQ1hYPSdjaG1vZCA2NDQgJG9sZGxpYicKKwkgIHBvc3RsaW5rX2NtZHNfQ1hYPSdsdF9vdXRwdXRmaWxlPSJAT1VUUFVUQCJ+CisJICAgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICAgIGNhc2UgJGx0X291dHB1dGZpbGUgaW4KKwkgICAgICAqLmV4ZXwqLkVYRSkgOzsKKwkgICAgICAqKQorCQlsdF9vdXRwdXRmaWxlPSIkbHRfb3V0cHV0ZmlsZS5leGUiCisJCWx0X3Rvb2xfb3V0cHV0ZmlsZT0iJGx0X3Rvb2xfb3V0cHV0ZmlsZS5leGUiCisJCTs7CisJICAgIGVzYWN+CisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkbHRfb3V0cHV0ZmlsZSJ+CisJICAgIGlmIHRlc3QgIiRNQU5JRkVTVF9UT09MIiAhPSAiOiIgJiYgdGVzdCAtZiAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOyB0aGVuCisJICAgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgICAkUk0gIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsKKwkgICAgZmknCisJICA7OworCSopCisJICAjIGcrKworCSAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIENYWCkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisJICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKKwkgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9bm8KKwkgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPXllcworCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgIGVsc2UKKwkgICAgICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBmaX4KKwkgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSAgZWxzZQorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICBmaQorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGRhcndpbiogfCByaGFwc29keSopCisKKworICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubworICBoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPXllcworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAorICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAieWVzIjsgdGhlbgorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlICR7d2x9LWZvcmNlX2xvYWQsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAnCisKKyAgZWxzZQorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJworICBmaQorICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisgICAgYXJjaGl2ZV9jbWRzX0NYWD0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKKyAgICBtb2R1bGVfY21kc19DWFg9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFg9InNlZCAtZSAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICAgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgIT0gInllcyI7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kc19DWFg9IlwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kc3ltdXRpbH0iCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBmaQorCisgIGVsc2UKKyAgbGRfc2hsaWJzX0NYWD1ubworICBmaQorCisJOzsKKworICAgICAgZGd1eCopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgZWMrKyopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgICAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBmcmVlYnNkMi4qKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlCisJIyBzd2l0Y2ggdG8gRUxGCisgICAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZC1lbGYqKQorICAgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgICAjIEZyZWVCU0QgMyBhbmQgbGF0ZXIgdXNlIEdOVSBDKysgYW5kIEdOVSBsZCB3aXRoIHN0YW5kYXJkIEVMRgorICAgICAgICAjIGNvbnZlbnRpb25zCisgICAgICAgIGxkX3NobGlic19DWFg9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGdudSopCisgICAgICAgIDs7CisKKyAgICAgIGhhaWt1KikKKyAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworICAgICAgICA7OworCisgICAgICBocHV4OSopCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorICAgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCSAgICAgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCSAgICAgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorICAgICAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgICAgICA7OworICAgICAgICAgIGFDQyopCisgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisgICAgICAgICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorICAgICAgICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorICAgICAgICAgICAgIyBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgJEVHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcGljX2ZsYWcgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgICAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGhwdXgxMCp8aHB1eDExKikKKyAgICAgICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisgICAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKwkgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworICAgICAgICAgICAgICA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKKyAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgICAgICAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlX0NYWD15ZXMKKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJCSAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJCSAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgICAgYUNDKikKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgICBocHBhKjY0KikKKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgICAgaWE2NCopCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgICopCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgJEdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCSAgICA7OworICAgICAgICAgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorCSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgICAgICAgaHBwYSo2NCopCisJICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgIGlhNjQqKQorCSAgICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgKikKKwkgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgIGVzYWMKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGludGVyaXhbMy05XSopCisJaGFyZGNvZGVfZGlyZWN0X0NYWD1ubworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKwkjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisJIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorCSMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKwkjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisJIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworCSMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU0dJIEMrKworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICBlbHNlCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAtbyAkbGliJworCSAgICAgIGZpCisJICAgIGZpCisJICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKyAgICAgICAgaW5oZXJpdF9ycGF0aF9DWFg9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIGFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHM7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKwkgIGljcGMqIHwgZWNwYyogKQorCSAgICAjIEludGVsIEMrKworCSAgICB3aXRoX2dudV9sZD15ZXMKKwkgICAgIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKKwkgICAgIyBpZiB3ZSBhZGQgJHByZWRlcF9vYmplY3RzIGFuZCAkcG9zdGRlcF9vYmplY3RzLCBob3dldmVyIDcuMSBhbmQKKwkgICAgIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KKwkgICAgY2FzZSBgJENDIC1WIDI+JjFgIGluCisJICAgICAgKiJWZXJzaW9uIDcuIiopCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICAgICopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCisJICAgICAgICB0bXBfaWR5bj0KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJCSAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OworCQllc2FjCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgIGVzYWMKKwkgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIDs7CisgICAgICAgICAgcGdDQyogfCBwZ2NwcCopCisgICAgICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgorCSAgICBjYXNlIGAkQ0MgLVZgIGluCisJICAgICpwZ0NDXCBbMS01XS4qIHwgKnBnY3BwXCBbMS01XS4qKQorCSAgICAgIHByZWxpbmtfY21kc19DWFg9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvYmpzICRsaWJvYmpzICRjb21waWxlX2RlcGxpYnN+CisJCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCInCisJICAgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvbGRvYmpzJG9sZF9kZXBsaWJzfgorCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYH4KKwkJJFJBTkxJQiAkb2xkbGliJworCSAgICAgIGFyY2hpdmVfY21kc19DWFg9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICAqKSAjIFZlcnNpb24gNiBhbmQgYWJvdmUgdXNlIHdlYWsgc3ltYm9scworCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgIGVzYWMKKworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICAgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCisJICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKwkgIHhsKiB8IG1waXhsKiB8IGJneGwqKQorCSAgICAjIElCTSBYTCA4LjAgb24gUFBDLCB3aXRoIEdOVSBsZAorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCSRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCSAgICBmaQorCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyAtemRlZnMnCisJICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scycKKwkgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLVIkbGliZGlyJworCSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgICBjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYPXllcworCisJICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHNvbWV0aGluZyBiYXNlZCBvbgorCSAgICAgICMgJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEKKwkgICAgICAjIHdvdWxkIGJlIGJldHRlci4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZnVuY19lY2hvX2FsbCcKKworCSAgICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBseW54b3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKworICAgICAgbTg4ayopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKworICAgICAgbXZzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBjeHgqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworCSAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbmV0YnNkKikKKyAgICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwkgIGFyY2hpdmVfY21kc19DWFg9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworCSAgd2xhcmM9CisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLVIkbGliZGlyJworCSAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJZmkKKwkjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworCTs7CisKKyAgICAgICpudG8qIHwgKnFueCopCisgICAgICAgIGxkX3NobGlic19DWFg9eWVzCisJOzsKKworICAgICAgb3BlbmJzZDIqKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisKKyAgICAgIG9wZW5ic2QqKQorCWlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKwkgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9eWVzCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisJICBmaQorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorCWVsc2UKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIGFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gIiRsaWIiIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgICAqKSBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKyAgICAgICAgICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgIGN4eCopCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikKKwkgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJCTs7CisJICAgICAgKikKKwkgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgorCSAgICAgICAgICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSAgICAgICAgICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+CisJICAgICAgICAgICRSTSAkbGliLmV4cCcKKwkgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctcnBhdGggJGxpYmRpcicKKwkJOzsKKwkgICAgZXNhYworCisJICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiIHwgJEdSRVAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZnVuY19lY2hvX2FsbCAiJHRlbXBsaXN0IiB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAgIG9zZjMqKQorCSAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICAgICopCisJICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkJICA7OworCSAgICAgIGVzYWMKKworCSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKworCSAgICBlbHNlCisJICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHBzb3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworCisgICAgICBzdW5vczQqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHNvbGFyaXMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworCSAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyAtemRlZnMnCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAgICAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwkgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKwkgICAgICAqKQorCQkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCQkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLgorCSAgICAgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwkJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKworCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZnVuY19lY2hvX2FsbCcKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisKKwkgICAgIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCisJICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS16ICR7d2x9ZGVmcycKKwkgICAgICBpZiAkQ0MgLS12ZXJzaW9uIHwgJEdSRVAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisJICAgICAgZWxzZQorCSAgICAgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcworCSAgICAgICAgIyBwbGF0Zm9ybS4KKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKwkgICAgICBmaQorCisJICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIgJHdsJGxpYmRpcicKKwkgICAgICBjYXNlICRob3N0X29zIGluCisJCXNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKwkJKikKKwkJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwkJICA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLlswMjRdKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teix0ZXh0JworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICBDQyopCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisJIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKwkjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisJIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisJIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorCSMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorCSMgYXMgLXogZGVmcy4KKwlub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKKwlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosbm9kZWZzJworCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIsJGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0nOicKKwlsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1CZXhwb3J0JworCXJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkb2xkb2Jqc34KKwkgICAgICAnIiRvbGRfYXJjaGl2ZV9jbWRzX0NYWCIKKwkgICAgcmVsb2FkX2NtZHNfQ1hYPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJHJlbG9hZF9vYmpzfgorCSAgICAgICciJHJlbG9hZF9jbWRzX0NYWCIKKwkgICAgOzsKKwkgICopCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgOzsKKwllc2FjCisgICAgICA7OworCisgICAgICB0YW5kZW0qKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgdnh3b3JrcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKKyRhc19lY2hvICIkbGRfc2hsaWJzX0NYWCIgPiY2OyB9CisgICAgdGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisgICAgR0NDX0NYWD0iJEdYWCIKKyAgICBMRF9DWFg9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgICMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitwcmVkZXBfb2JqZWN0c19DWFg9Citwb3N0ZGVwX29iamVjdHNfQ1hYPQorcHJlZGVwc19DWFg9Citwb3N0ZGVwc19DWFg9Citjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPQorCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorY2xhc3MgRm9vCit7CitwdWJsaWM6CisgIEZvbyAodm9pZCkgeyBhID0gMDsgfQorcHJpdmF0ZToKKyAgaW50IGE7Cit9OworX0xUX0VPRgorCisKK19sdF9saWJkZXBzX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2Nhc2UgIiRDQyAkQ0ZMQUdTICIgaW4gIygKKypcIC1mbHRvKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tbHRvIiA7OworKlwgLWZ3aG9wcipcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLXdob3ByIiA7OworKlwgLWZ1c2UtbGlua2VyLXBsdWdpbipcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLXVzZS1saW5rZXItcGx1Z2luIiA7OworZXNhYworCitpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisgICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorCisgICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKKyAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCisgIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KKworICBmb3IgcCBpbiBgZXZhbCAiJG91dHB1dF92ZXJib3NlX2xpbmtfY21kImA7IGRvCisgICAgY2FzZSAke3ByZXZ9JHtwfSBpbgorCisgICAgLUwqIHwgLVIqIHwgLWwqKQorICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCisgICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgorICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIHx8CisgICAgICAgICAgdGVzdCAkcCA9ICItUiI7IHRoZW4KKwkgcHJldj0kcAorCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICAjIEV4cGFuZCB0aGUgc3lzcm9vdCB0byBlYXNlIGV4dHJhY3RpbmcgdGhlIGRpcmVjdG9yaWVzIGxhdGVyLgorICAgICAgIGlmIHRlc3QgLXogIiRwcmV2IjsgdGhlbgorICAgICAgICAgY2FzZSAkcCBpbgorICAgICAgICAgLUwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1MJyAnJyAiJHAiOyBwcmV2PS1MOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIC1SKikgZnVuY19zdHJpcG5hbWVfY25mICctUicgJycgIiRwIjsgcHJldj0tUjsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtbCopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLWwnICcnICIkcCI7IHByZXY9LWw7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgZXNhYworICAgICAgIGZpCisgICAgICAgY2FzZSAkcCBpbgorICAgICAgID0qKSBmdW5jX3N0cmlwbmFtZV9jbmYgJz0nICcnICIkcCI7IHA9JGx0X3N5c3Jvb3QkZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgZXNhYworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGNhc2UgJHtwcmV2fSBpbgorCSAtTCB8IC1SKQorCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQorCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQorCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgorCSAgIGlmIHRlc3QgLXogIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIjsgdGhlbgorCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtwcmV2fSR7cH0iCisJICAgZWxzZQorCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYfSAke3ByZXZ9JHtwfSIKKwkgICBmaQorCSAgIDs7CisJICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCisJICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgorCSBlc2FjCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkcG9zdGRlcHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBzX0NYWD0iJHtwcmV2fSR7cH0iCisJIGVsc2UKKwkgICBwb3N0ZGVwc19DWFg9IiR7cG9zdGRlcHNfQ1hYfSAke3ByZXZ9JHtwfSIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIHByZXY9CisgICAgICAgOzsKKworICAgICoubHRvLiRvYmpleHQpIDs7ICMgSWdub3JlIEdDQyBMVE8gb2JqZWN0cworICAgICouJG9iamV4dCkKKyAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKKyAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KKyAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KKwkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgaWYgdGVzdCAteiAiJHByZWRlcF9vYmplY3RzX0NYWCI7IHRoZW4KKwkgICBwcmVkZXBfb2JqZWN0c19DWFg9IiRwIgorCSBlbHNlCisJICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcHJlZGVwX29iamVjdHNfQ1hYICRwIgorCSBmaQorICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJHBvc3RkZXBfb2JqZWN0c19DWFgiOyB0aGVuCisJICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHAiCisJIGVsc2UKKwkgICBwb3N0ZGVwX29iamVjdHNfQ1hYPSIkcG9zdGRlcF9vYmplY3RzX0NYWCAkcCIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KKworICAgIGVzYWMKKyAgZG9uZQorCisgICMgQ2xlYW4gdXAuCisgIHJtIC1mIGEub3V0IGEuZXhlCitlbHNlCisgIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyBDWFggdGVzdCBwcm9ncmFtIgorZmkKKworJFJNIC1mIGNvbmZlc3QuJG9iamV4dAorQ0ZMQUdTPSRfbHRfbGliZGVwc19zYXZlX0NGTEFHUworCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgorY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeFszLTldKikKKyAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgorICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgorICBwcmVkZXBfb2JqZWN0c19DWFg9CisgIHBvc3RkZXBfb2JqZWN0c19DWFg9CisgIHBvc3RkZXBzX0NYWD0KKyAgOzsKKworbGludXgqKQorICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKyAgKlN1blwgQyopCisgICAgIyBTdW4gQysrIDUuOQorCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBwb3N0ZGVwc19DWFg9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgOzsKKworc29sYXJpcyopCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIENDKiB8IHN1bkNDKikKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBBZGRpbmcgdGhpcyByZXF1aXJlcyBhIGtub3duLWdvb2Qgc2V0dXAgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IKKyAgICAjIFN1biBjb21waWxlciB2ZXJzaW9ucyBiZWZvcmUgNS42LCBlbHNlIFBJQyBvYmplY3RzIGZyb20gYW4gb2xkCisgICAgIyBhcmNoaXZlIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIG91dHB1dCwgbGVhZGluZyB0byBzdWJ0bGUgYnVncy4KKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgcG9zdGRlcHNfQ1hYPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCisKKworY2FzZSAiICRwb3N0ZGVwc19DWFggIiBpbgorKiIgLWxjICIqKSBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8gOzsKK2VzYWMKKyBjb21waWxlcl9saWJfc2VhcmNoX2RpcnNfQ1hYPQoraWYgdGVzdCAtbiAiJHtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYfSI7IHRoZW4KKyBjb21waWxlcl9saWJfc2VhcmNoX2RpcnNfQ1hYPWBlY2hvICIgJHtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYfSIgfCAke1NFRH0gLWUgJ3MhIC1MISAhZycgLWUgJ3MhXiAhISdgCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9CitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9CisKKworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLURETExfRVhQT1JUJworICAgICAgOzsKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisgICAgKmRqZ3BwKikKKyAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorICAgICAgOzsKKyAgICBoYWlrdSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCisgICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9CisgICAgICA7OworICAgIGludGVyaXhbMy05XSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICpxbngqIHwgKm50byopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4WzQtOV0qKQorCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJZWxzZQorCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisJZmkKKwk7OworICAgICAgY2hvcnVzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCWN4Y2g2OCopCisJICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgIyBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCBDWFgpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCisJICA7OworCWVzYWMKKwk7OworICAgICAgbWluZ3cqIHwgY3lnd2luKiB8IG9zMiogfCBwdzMyKiB8IGNlZ2NjKikKKwkjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisJIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1ERExMX0VYUE9SVCcKKwk7OworICAgICAgZGd1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGVjKysqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICA7OworCSAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBocHBhKjY0KnxpYTY0KikKKwkgICAgICAjICtaIHRoZSBkZWZhdWx0CisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9JytaJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBpbnRlcml4KikKKwkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKKwkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/CisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCisJICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy0tYmFja2VuZCAtV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworCSAgICA7OworCSAgZWNwYyogKQorCSAgICAjIG9sZCBJbnRlbCBDKysgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1zdGF0aWMnCisJICAgIDs7CisJICBpY3BjKiApCisJICAgICMgSW50ZWwgQysrLCB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKwkgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1zdGF0aWMnCisJICAgIDs7CisJICBwZ0NDKiB8IHBnY3BwKikKKwkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZwaWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgIHhsYyogfCB4bEMqIHwgYmd4bFtjQ10qIHwgbXBpeGxbY0NdKikKKwkgICAgIyBJQk0gWEwgOC4wLCA5LjAgb24gUFBDIGFuZCBCbHVlR2VuZQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcXBpYycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctcXN0YXRpY2xpbmsnCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVFvcHRpb24gbGQgJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1XIGMsZXhwb3J0YWxsJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIG5ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKwk7OworICAgICAgKnFueCogfCAqbnRvKikKKyAgICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDIC1zaGFyZWQnCisgICAgICAgIDs7CisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgOzsKKwkgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgRGlnaXRhbC9Db21wYXEgQysrCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHBzb3MqKQorCTs7CisgICAgICBzb2xhcmlzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqIHwgc3VuQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctUW9wdGlvbiBsZCAnCisJICAgIDs7CisJICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1QSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3Vub3M0KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB0YW5kZW0qKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB2eHdvcmtzKikKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgIGZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIDs7Citlc2FjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9waWNfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfQ1hYPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgPiY2OyB9CitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9JGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWAorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWD1ubworICAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggLURQSUMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubworZmkKKworZmkKKworCisKKworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kbHRfcHJvZ19jb21waWxlcl93bF9DWFggZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYXCIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRFQ0hPICIkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9CitmaQorCisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY2OyB9CisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY2OyB9CisKKworCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKKyRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisKKyAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgZXhjbHVkZV9leHBzeW1zX0NYWD0nX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJworICBjYXNlICRob3N0X29zIGluCisgIGFpeFs0LTldKikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsIGRlZmluZWQKKyAgICAjIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgorICAgIGlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGZpCisgICAgOzsKKyAgcHczMiopCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9IiRsdGRsbF9jbWRzIgorICAgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBjbCopCisgICAgICBleGNsdWRlX2V4cHN5bXNfQ1hYPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisgICAgICA7OworICAgICopCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS87cy9eLipbIF1fX25tX19cKFteIF0qXClbIF1bXiBdKi9cMSBEQVRBLzsvXklbIF0vZDsvXltBSVRXXVsgXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgZXhjbHVkZV9leHBzeW1zX0NYWD0nW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbGludXgqIHwgaypic2QqLWdudSB8IGdudSopCisgICAgbGlua19hbGxfZGVwbGlic19DWFg9bm8KKyAgICA7OworICAqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgOzsKKyAgZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQorJGFzX2VjaG8gIiRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KK3Rlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKword2l0aF9nbnVfbGRfQ1hYPSR3aXRoX2dudV9sZAorCisKKworCisKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19DWFggaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgJFJNIGNvbmZ0ZXN0KgorCWVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisJaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorCSAgc29uYW1lPWNvbmZ0ZXN0CisJICBsaWI9Y29uZnRlc3QKKwkgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorCSAgZGVwbGlicz0KKwkgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAorCSAgcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorCSAgY29tcGlsZXJfZmxhZ3M9LXYKKwkgIGxpbmtlcl9mbGFncz0tdgorCSAgdmVyc3RyaW5nPQorCSAgb3V0cHV0X29iamRpcj0uCisJICBsaWJuYW1lPWNvbmZ0ZXN0CisJICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0KKwkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfQ1hYIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKwkgIHRoZW4KKwkgICAgbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisJICBlbHNlCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgIGZpCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKwlmaQorCSRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiA+JjY7IH0KKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD0kbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9CisKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4WzQtOV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8ICRHUkVQIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBjYXNlICRob3N0X2NwdSBpbgorICBwb3dlcnBjKQorICAgICMgU2luY2UgSnVseSAyMDA3IEFtaWdhT1M0IG9mZmljaWFsbHkgc3VwcG9ydHMgLnNvIGxpYnJhcmllcy4KKyAgICAjIFdoZW4gY29tcGlsaW5nIHRoZSBleGVjdXRhYmxlLCBhZGQgLXVzZS1keW5sZCAtTHNvYmpzOiB0byB0aGUgY29tcGlsZWxpbmUuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgOzsKKyAgbTY4aykKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgICAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWBmdW5jX2VjaG9fYWxsICIkbGliIiB8ICRTRUQgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgICAgOzsKKyAgZXNhYworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpWzQ1XSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGNjX2Jhc2VuYW1lIGluCisgIHllcywqKQorICAgICMgZ2NjCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgorICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KKyAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87CisgICAgICBmaScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKworICAgICAgOzsKKyAgICBtaW5ndyogfCBjZWdjYyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworCisgICosY2wqKQorICAgICMgTmF0aXZlIE1TVkMKKyAgICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uZGxsLmxpYicKKworICAgIGNhc2UgJGJ1aWxkX29zIGluCisgICAgbWluZ3cqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPQorICAgICAgbHRfc2F2ZV9pZnM9JElGUworICAgICAgSUZTPSc7JworICAgICAgZm9yIGx0X3BhdGggaW4gJExJQgorICAgICAgZG8KKyAgICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgICAjIExldCBET1MgdmFyaWFibGUgZXhwYW5zaW9uIHByaW50IHRoZSBzaG9ydCA4LjMgc3R5bGUgZmlsZSBuYW1lLgorICAgICAgICBsdF9wYXRoPWBjZCAiJGx0X3BhdGgiIDI+L2Rldi9udWxsICYmIGNtZCAvL0MgImZvciAlaSBpbiAoIi4iKSBkbyBAZWNobyAlfnNpImAKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjICRsdF9wYXRoIgorICAgICAgZG9uZQorICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgIyBDb252ZXJ0IHRvIE1TWVMgc3R5bGUuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IHNlZCAtZSAnc3xcXFxcfC98ZycgLWUgJ3N8IFxcKFthLXpBLVpdXFwpOnwgL1xcMXxnJyAtZSAnc3xeIHx8J2AKKyAgICAgIDs7CisgICAgY3lnd2luKikKKyAgICAgICMgQ29udmVydCB0byB1bml4IGZvcm0sIHRoZW4gdG8gZG9zIGZvcm0sIHRoZW4gYmFjayB0byB1bml4IGZvcm0KKyAgICAgICMgYnV0IHRoaXMgdGltZSBkb3Mgc3R5bGUgKG5vIHNwYWNlcyEpIHNvIHRoYXQgdGhlIHVuaXggZm9ybSBsb29rcworICAgICAgIyBsaWtlIC9jeWdkcml2ZS9jL1BST0dSQX4xOi9jeWdkci4uLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMSUIiYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLWRvcyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgMj4vZGV2L251bGxgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgOzsKKyAgICAqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkTElCIgorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICAjIEZJWE1FOiBmaW5kIHRoZSBzaG9ydCBuYW1lIG9yIHRoZSBwYXRoIGNvbXBvbmVudHMsIGFzIHNwYWNlcyBhcmUKKyAgICAgICMgY29tbW9uLiAoZS5nLiAiUHJvZ3JhbSBGaWxlcyIgLT4gIlBST0dSQX4xIikKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxpbmsuZXhlJworICAgIDs7CisKKyAgKikKKyAgICAjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisgIGVzYWMKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbMjNdLiopIG9iamZvcm1hdD1hb3V0IDs7CisgICAgKikgb2JqZm9ybWF0PWVsZiA7OworICAgIGVzYWMKKyAgZmkKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyLiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaGFpa3UqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIHJ1bnRpbWVfbG9hZGVyIgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy9ib290L2hvbWUvY29uZmlnL2xpYiAvYm9vdC9jb21tb24vbGliIC9ib290L3N5c3RlbS9saWInCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICBocHBhKjY0KikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUsIC4uLgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgIyBvciBmYWlscyBvdXRyaWdodCwgc28gb3ZlcnJpZGUgYXRvbWljYWxseToKKyAgaW5zdGFsbF9vdmVycmlkZV9tb2RlPTU1NQorICA7OworCitpbnRlcml4WzMtOV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisKKyAgIyBTb21lIGJpbnV0aWxzIGxkIGFyZSBwYXRjaGVkIHRvIHNldCBEVF9SVU5QQVRICisgIGlmICR7bHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgICAgc2F2ZV9saWJkaXI9JGxpYmRpcgorICAgIGV2YWwgImxpYmRpcj0vZm9vOyB3bD1cIiRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWFwiOyBcCisJIExERkxBR1M9XCJcJExERkxBR1MgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYXCIiCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgaWYgICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbDsgdGhlbiA6CisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKK2ZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgICBsaWJkaXI9JHNhdmVfbGliZGlyCisKK2ZpCisKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZGVsZiotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworcmRvcyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordHBmKikKKyAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1CiskYXNfZWNobyAiJGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9CitoYXJkY29kZV9hY3Rpb25fQ1hYPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIiB8fAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0NYWCIgfHwKKyAgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljX0NYWCIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X0NYWCIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgQ1hYKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0xfQ1hYIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uX0NYWD11bnN1cHBvcnRlZAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPiY1CiskYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNjsgfQorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPSByZWxpbmsgfHwKKyAgIHRlc3QgIiRpbmhlcml0X3JwYXRoX0NYWCIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKKworCisKKworCisKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgQ0M9JGx0X3NhdmVfQ0MKKyAgQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworICBMRENYWD0kTEQKKyAgTEQ9JGx0X3NhdmVfTEQKKyAgR0NDPSRsdF9zYXZlX0dDQworICB3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorICBsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECisgIGx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAorICBsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK2ZpICMgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXMKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICAgICAgYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGxpYnRvb2wiCisKKworCisKKyMgT25seSBleHBhbmQgb25jZToKKworCisKKyMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IEN1cnJlbnRseSB3ZSBhcmVuJ3QgcnVubmluZyB0aGUgUHl0aG9uIHRlc3RzCisjIGFnYWluc3QgdGhlIGludGVycHJldGVyIGRldGVjdGVkIGJ5IEFNX1BBVEhfUFlUSE9OLCBhbmQgc28gd2UgY29uZGl0aW9uCisjIEhBVkVfUFlUSE9OIGJ5IHJlcXVpcmluZyAicHl0aG9uIiB0byBiZSBpbiB0aGUgUEFUSCwgYW5kIHRoYXQgaW50ZXJwcmV0ZXIncworIyB2ZXJzaW9uIHRvIGJlID49IDIuMy4gVGhpcyB3aWxsIGFsbG93IHRoZSBzY3JpcHRzIHRvIHVzZSBhICIvdXNyL2Jpbi9lbnYiCisjIGhhc2hiYW5nLgorUFlUSE9OPSAgIyBXZSAqZG8gbm90KiBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcHl0aG9uIGludGVycHJldGVyCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInB5dGhvbiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcHl0aG9uOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9QWVRIT04rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRQWVRIT04gaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUFlUSE9OPSIkUFlUSE9OIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QWVRIT049IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUFlUSE9OIiAmJiBhY19jdl9wYXRoX1BZVEhPTj0iOiIKKyAgOzsKK2VzYWMKK2ZpCitQWVRIT049JGFjX2N2X3BhdGhfUFlUSE9OCitpZiB0ZXN0IC1uICIkUFlUSE9OIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBZVEhPTiIgPiY1CiskYXNfZWNobyAiJFBZVEhPTiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitpZiB0ZXN0ICIkUFlUSE9OIiAhPSAiOiI7IHRoZW4gOgorICBwcm9nPSJpbXBvcnQgc3lzCisjIHNwbGl0IHN0cmluZ3MgYnkgJy4nIGFuZCBjb252ZXJ0IHRvIG51bWVyaWMuICBBcHBlbmQgc29tZSB6ZXJvcworIyBiZWNhdXNlIHdlIG5lZWQgYXQgbGVhc3QgNCBkaWdpdHMgZm9yIHRoZSBoZXggY29udmVyc2lvbi4KKyMgbWFwIHJldHVybnMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMuMCBhbmQgYSBsaXN0IGluIDIueAorbWludmVyID0gbGlzdChtYXAoaW50LCAnMi4zJy5zcGxpdCgnLicpKSkgKyBbMCwgMCwgMF0KK21pbnZlcmhleCA9IDAKKyMgeHJhbmdlIGlzIG5vdCBwcmVzZW50IGluIFB5dGhvbiAzLjAgYW5kIHJhbmdlIHJldHVybnMgYW4gaXRlcmF0b3IKK2ZvciBpIGluIGxpc3QocmFuZ2UoMCwgNCkpOiBtaW52ZXJoZXggPSAobWludmVyaGV4IDw8IDgpICsgbWludmVyW2ldCitzeXMuZXhpdChzeXMuaGV4dmVyc2lvbiA8IG1pbnZlcmhleCkiCisgIGlmIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRQWVRIT04gLWMgIiRwcm9nIiIgPiY1CisgICAoJFBZVEhPTiAtYyAiJHByb2ciKSA+JjUgMj4mNQorICAgYWNfc3RhdHVzPSQ/CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgUFlUSE9OPSI6IgorZmkKK2ZpCisgaWYgdGVzdCAiJFBZVEhPTiIgIT0gIjoiOyB0aGVuCisgIEhBVkVfUFlUSE9OX1RSVUU9CisgIEhBVkVfUFlUSE9OX0ZBTFNFPScjJworZWxzZQorICBIQVZFX1BZVEhPTl9UUlVFPScjJworICBIQVZFX1BZVEhPTl9GQUxTRT0KK2ZpCisKKworIyBDb25maWd1cmUgcHRocmVhZHMuCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHRocmVhZHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3B0aHJlYWRzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9wdGhyZWFkczsgd2l0aF9wdGhyZWFkcz0kd2l0aHZhbAorZWxzZQorICB3aXRoX3B0aHJlYWRzPWNoZWNrCitmaQorCisKK2hhdmVfcHRocmVhZHM9bm8KK2lmIHRlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhubyI7IHRoZW4gOgorCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCithY3hfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTLi4uICIgPiY2OyB9CisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwdGhyZWFkX2pvaW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBwdGhyZWFkX2pvaW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWN4X3B0aHJlYWRfb2s9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY3hfcHRocmVhZF9vayIgPiY1CiskYXNfZWNobyAiJGFjeF9wdGhyZWFkX29rIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCithY3hfcHRocmVhZF9mbGFncz0icHRocmVhZHMgbm9uZSAtS3RocmVhZCAta3RocmVhZCBsdGhyZWFkIC1wdGhyZWFkIC1wdGhyZWFkcyAtbXRocmVhZHMgcHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCBwdGhyZWFkLWNvbmZpZyIKKworIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorIyBpbmRpdmlkdWFsIGl0ZW1zIGZvbGxvdzoKKworIyBwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyMgbm9uZTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorIyAgICAgICBvdGhlciBjb21waWxlciBmbGFncyB0byBwcmV2ZW50IGNvbnRpbnVhbCBjb21waWxlciB3YXJuaW5ncworIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisjIC1rdGhyZWFkOiBGcmVlQlNEIGtlcm5lbCB0aHJlYWRzIChwcmVmZXJyZWQgdG8gLXB0aHJlYWQgc2luY2UgU01QLWFibGUpCisjIGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorIyAtcHRocmVhZDogTGludXgvZ2NjIChrZXJuZWwgdGhyZWFkcyksIEJTRC9nY2MgKHVzZXJsYW5kIHRocmVhZHMpCisjIC1wdGhyZWFkczogU29sYXJpcy9nY2MKKyMgLW10aHJlYWRzOiBNaW5ndzMyL2djYywgTHlueC9nY2MKKyMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorIyAgICAgIGRvZXNuJ3QgaHVydCB0byBjaGVjayBzaW5jZSB0aGlzIHNvbWV0aW1lcyBkZWZpbmVzIHB0aHJlYWRzIHRvbzsKKyMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisjIHB0aHJlYWQ6IExpbnV4LCBldGNldGVyYQorIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisjIHB0aHJlYWQtY29uZmlnOiB1c2UgcHRocmVhZC1jb25maWcgcHJvZ3JhbSAoZm9yIEdOVSBQdGggbGlicmFyeSkKKworY2FzZSAiJHtob3N0X2NwdX0tJHtob3N0X29zfSIgaW4KKyAgICAgICAgKnNvbGFyaXMqKQorCisgICAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCisgICAgICAgICMgKG5vbi1mdW5jdGlvbmFsKSB2ZXJzaW9ucyBvZiB0aGUgcHRocmVhZHMgcm91dGluZXMsIHNvIGxpbmstYmFzZWQKKyAgICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCisgICAgICAgICMgYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhpcyBtYWNybywgc28gd2UgY291bGQgY2hlY2sgZm9yIHRoYXQsIGJ1dAorICAgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6CisKKyAgICAgICAgYWN4X3B0aHJlYWRfZmxhZ3M9Ii1wdGhyZWFkcyBwdGhyZWFkIC1tdCAtcHRocmVhZCAkYWN4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7Citlc2FjCisKK2lmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCitmb3IgZmxhZyBpbiAkYWN4X3B0aHJlYWRfZmxhZ3M7IGRvCisKKyAgICAgICAgY2FzZSAkZmxhZyBpbgorICAgICAgICAgICAgICAgIG5vbmUpCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIC0qKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWcuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKworCQlwdGhyZWFkLWNvbmZpZykKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwdGhyZWFkLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcHRocmVhZC1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY3hfcHRocmVhZF9jb25maWciOyB0aGVuCisgIGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnPSIkYWN4X3B0aHJlYWRfY29uZmlnIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnPSJ5ZXMiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnIiAmJiBhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZz0ibm8iCitmaQorZmkKK2FjeF9wdGhyZWFkX2NvbmZpZz0kYWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWcKK2lmIHRlc3QgLW4gIiRhY3hfcHRocmVhZF9jb25maWciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWN4X3B0aHJlYWRfY29uZmlnIiA+JjUKKyRhc19lY2hvICIkYWN4X3B0aHJlYWRfY29uZmlnIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKwkJaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9jb25maWciID0geG5vOyB0aGVuIGNvbnRpbnVlOyBmaQorCQlQVEhSRUFEX0NGTEFHUz0iYHB0aHJlYWQtY29uZmlnIC0tY2ZsYWdzYCIKKwkJUFRIUkVBRF9MSUJTPSJgcHRocmVhZC1jb25maWcgLS1sZGZsYWdzYCBgcHRocmVhZC1jb25maWcgLS1saWJzYCIKKwkJOzsKKworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iLWwkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBDaGVjayBmb3IgdmFyaW91cyBmdW5jdGlvbnMuICBXZSBtdXN0IGluY2x1ZGUgcHRocmVhZC5oLAorICAgICAgICAjIHNpbmNlIHNvbWUgZnVuY3Rpb25zIG1heSBiZSBtYWNyb3MuICAoT24gdGhlIFNlcXVlbnQsIHdlCisgICAgICAgICMgbmVlZCBhIHNwZWNpYWwgZmxhZyAtS3RocmVhZCB0byBtYWtlIHRoaXMgaGVhZGVyIGNvbXBpbGUuKQorICAgICAgICAjIFdlIGNoZWNrIGZvciBwdGhyZWFkX2pvaW4gYmVjYXVzZSBpdCBpcyBpbiAtbHB0aHJlYWQgb24gSVJJWAorICAgICAgICAjIHdoaWxlIHB0aHJlYWRfY3JlYXRlIGlzIGluIGxpYmMuICBXZSBjaGVjayBmb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgICAgICAgIyBkdWUgdG8gREVDIGNyYXppbmVzcyB3aXRoIC1scHRocmVhZHMuICBXZSBjaGVjayBmb3IKKyAgICAgICAgIyBwdGhyZWFkX2NsZWFudXBfcHVzaCBiZWNhdXNlIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHB0aHJlYWQKKyAgICAgICAgIyBmdW5jdGlvbnMgb24gU29sYXJpcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vbi1mdW5jdGlvbmFsIGxpYmMgc3R1Yi4KKyAgICAgICAgIyBXZSB0cnkgcHRocmVhZF9jcmVhdGUgb24gZ2VuZXJhbCBwcmluY2lwbGVzLgorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY3hfcHRocmVhZF9vaz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWN4X3B0aHJlYWRfb2siID4mNQorJGFzX2VjaG8gIiRhY3hfcHRocmVhZF9vayIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorCisgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorZG9uZQorZmkKKworIyBWYXJpb3VzIG90aGVyIGNoZWNrczoKK2lmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogSk9JTkFCTEUgYXR0cmlidXRlIGlzIGNhbGxlZCBVTkRFVEFDSEVELgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGpvaW5hYmxlIHB0aHJlYWQgYXR0cmlidXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZS4uLiAiID4mNjsgfQorCWF0dHJfbmFtZT11bmtub3duCisJZm9yIGF0dHIgaW4gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRDsgZG8KKwkgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworaW50IGF0dHI9JGF0dHI7IHJldHVybiBhdHRyOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGF0dHJfbmFtZT0kYXR0cjsgYnJlYWsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCWRvbmUKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhdHRyX25hbWUiID4mNQorJGFzX2VjaG8gIiRhdHRyX25hbWUiID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICIkYXR0cl9uYW1lIiAhPSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICRhdHRyX25hbWUKK19BQ0VPRgorCisgICAgICAgIGZpCisKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkcy4uLiAiID4mNjsgfQorICAgICAgICBmbGFnPW5vCisgICAgICAgIGNhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICAgICAqLWFpeCogfCAqLWZyZWVic2QqIHwgKi1kYXJ3aW4qKSBmbGFnPSItRF9USFJFQURfU0FGRSI7OworICAgICAgICAgICAgKnNvbGFyaXMqIHwgKi1vc2YqIHwgKi1ocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7CisgICAgICAgIGVzYWMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7ZmxhZ30iID4mNQorJGFzX2VjaG8gIiR7ZmxhZ30iID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGZsYWciICE9IHhubzsgdGhlbgorICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgZmkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBtdXN0IGNvbXBpbGUgd2l0aCB4bGNfciBvciBjY19yCisJaWYgdGVzdCB4IiRHQ0MiICE9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBmb3IgYWNfcHJvZyBpbiB4bGNfciBjY19yCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfUFRIUkVBRF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRQVEhSRUFEX0NDIjsgdGhlbgorICBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiRQVEhSRUFEX0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUFRIUkVBRF9DQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUFRIUkVBRF9DQz0kYWNfY3ZfcHJvZ19QVEhSRUFEX0NDCitpZiB0ZXN0IC1uICIkUFRIUkVBRF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQVEhSRUFEX0NDIiA+JjUKKyRhc19lY2hvICIkUFRIUkVBRF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRQVEhSRUFEX0NDIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJFBUSFJFQURfQ0MiIHx8IFBUSFJFQURfQ0M9IiR7Q0N9IgorCisgICAgICAgIGVsc2UKKyAgICAgICAgICBQVEhSRUFEX0NDPSRDQworCWZpCisKKwkjIFRoZSBuZXh0IHBhcnQgdHJpZXMgdG8gZGV0ZWN0IEdDQyBpbmNvbnNpc3RlbmN5IHdpdGggLXNoYXJlZCBvbiBzb21lCisJIyBhcmNoaXRlY3R1cmVzIGFuZCBzeXN0ZW1zLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGluIGNlcnRhaW4KKwkjIGNvbmZpZ3VyYXRpb25zLCB3aGVuIC1zaGFyZWQgaXMgc3BlY2lmaWVkLCBHQ0MgImZvcmdldHMiIHRvCisJIyBpbnRlcm5hbGx5IHVzZSB2YXJpb3VzIGZsYWdzIHdoaWNoIGFyZSBzdGlsbCBuZWNlc3NhcnkuCisKKwkjCisJIyBQcmVwYXJlIHRoZSBmbGFncworCSMKKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlzYXZlX0xJQlM9IiRMSUJTIgorCXNhdmVfQ0M9IiRDQyIKKworCSMgVHJ5IHdpdGggdGhlIGZsYWdzIGRldGVybWluZWQgYnkgdGhlIGVhcmxpZXIgY2hlY2tzLgorCSMKKwkjIC1XbCwteixkZWZzIGZvcmNlcyBsaW5rLXRpbWUgc3ltYm9sIHJlc29sdXRpb24sIHNvIHRoYXQgdGhlCisJIyBsaW5raW5nIGNoZWNrcyB3aXRoIC1zaGFyZWQgYWN0dWFsbHkgaGF2ZSBhbnkgdmFsdWUKKwkjCisJIyBGSVhNRTogLWZQSUMgaXMgcmVxdWlyZWQgZm9yIC1zaGFyZWQgb24gbWFueSBhcmNoaXRlY3R1cmVzLAorCSMgc28gd2Ugc3BlY2lmeSBpdCBoZXJlLCBidXQgdGhlIHJpZ2h0IHdheSB3b3VsZCBwcm9iYWJseSBiZSB0bworCSMgcHJvcGVybHkgZGV0ZWN0IHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgcmVxdWlyZWQuCisJQ0ZMQUdTPSItc2hhcmVkIC1mUElDIC1XbCwteixkZWZzICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCUxJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisJQ0M9IiRQVEhSRUFEX0NDIgorCisJIyBJbiBvcmRlciBub3QgdG8gY3JlYXRlIHNldmVyYWwgbGV2ZWxzIG9mIGluZGVudGF0aW9uLCB3ZSB0ZXN0CisJIyB0aGUgdmFsdWUgb2YgIiRkb25lIiB1bnRpbCB3ZSBmaW5kIHRoZSBjdXJlIG9yIHJ1biBvdXQgb2YgaWRlYXMuCisJZG9uZT0ibm8iCisKKwkjIEZpcnN0LCBtYWtlIHN1cmUgdGhlIENGTEFHUyB3ZSBhZGRlZCBhcmUgYWN0dWFsbHkgYWNjZXB0ZWQgYnkgb3VyCisJIyBjb21waWxlci4gIElmIG5vdCAoYW5kIE9TIFgncyBsZCwgZm9yIGluc3RhbmNlLCBkb2VzIG5vdCBhY2NlcHQgLXopLAorCSMgdGhlbiB3ZSBjYW4ndCBkbyB0aGlzIHRlc3QuCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBjaGVjayBmb3IgR0NDIHB0aHJlYWQvc2hhcmVkIGluY29uc2lzdGVuY2llcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGNoZWNrIGZvciBHQ0MgcHRocmVhZC9zaGFyZWQgaW5jb25zaXN0ZW5jaWVzLi4uICIgPiY2OyB9CisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgZG9uZT15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXMgOyB0aGVuCisJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJICAgZWxzZQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJICAgZmkKKwlmaQorCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtcHRocmVhZCBpcyBzdWZmaWNpZW50IHdpdGggLXNoYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1wdGhyZWFkIGlzIHN1ZmZpY2llbnQgd2l0aCAtc2hhcmVkLi4uICIgPiY2OyB9CisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBkb25lPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJICAgZWxzZQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSAgIGZpCisJZmkKKworCSMKKwkjIExpbnV4IGdjYyBvbiBzb21lIGFyY2hpdGVjdHVyZXMgc3VjaCBhcyBtaXBzL21pcHNlbCBmb3JnZXRzCisJIyBhYm91dCAtbHB0aHJlYWQKKwkjCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbHB0aHJlYWQgZml4ZXMgdGhhdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1scHRocmVhZCBmaXhlcyB0aGF0Li4uICIgPiY2OyB9CisJICAgTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRvbmU9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkgICAgICBQVEhSRUFEX0xJQlM9Ii1scHRocmVhZCAkUFRIUkVBRF9MSUJTIgorCSAgIGVsc2UKKwkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkgICBmaQorCWZpCisJIworCSMgRnJlZUJTRCA0LjEwIGdjYyBmb3JnZXRzIHRvIHVzZSAtbGNfciBpbnN0ZWFkIG9mIC1sYworCSMKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sY19yIGZpeGVzIHRoYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGNfciBmaXhlcyB0aGF0Li4uICIgPiY2OyB9CisJICAgTElCUz0iLWxjX3IgJFBUSFJFQURfTElCUyAkc2F2ZV9MSUJTIgorCSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRvbmU9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkgICAgICBQVEhSRUFEX0xJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMiCisJICAgZWxzZQorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSAgIGZpCisJZmkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgIyBPSywgd2UgaGF2ZSBydW4gb3V0IG9mIGlkZWFzCisJICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBJbXBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgdG8gdXNlIHB0aHJlYWRzIHdpdGggc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbXBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgdG8gdXNlIHB0aHJlYWRzIHdpdGggc2hhcmVkIGxpYnJhcmllcyIgPiYyO30KKworCSAgICMgc28gaXQncyBub3Qgc2FmZSB0byBhc3N1bWUgdGhhdCB3ZSBtYXkgdXNlIHB0aHJlYWRzCisJICAgYWN4X3B0aHJlYWRfb2s9bm8KKwlmaQorCisJQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisJTElCUz0iJHNhdmVfTElCUyIKKwlDQz0iJHNhdmVfQ0MiCitlbHNlCisgICAgICAgIFBUSFJFQURfQ0M9IiRDQyIKK2ZpCisKKworCisKKworIyBGaW5hbGx5LCBleGVjdXRlIEFDVElPTi1JRi1GT1VORC9BQ1RJT04tSUYtTk9ULUZPVU5EOgoraWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFRIUkVBRCAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICA6CitlbHNlCisgICAgICAgIGFjeF9wdGhyZWFkX29rPW5vCisgICAgICAgIGlmIHRlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhjaGVjayI7IHRoZW4gOgorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICItLXdpdGgtcHRocmVhZHMgd2FzIHNwZWNpZmllZCwgYnV0IHVuYWJsZSB0byBiZSB1c2VkCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK2ZpCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisKKyAgICAgICBoYXZlX3B0aHJlYWRzPSIkYWN4X3B0aHJlYWRfb2siCitmaQorIGlmIHRlc3QgIngkaGF2ZV9wdGhyZWFkcyIgPT0gInh5ZXMiOyB0aGVuCisgIEhBVkVfUFRIUkVBRFNfVFJVRT0KKyAgSEFWRV9QVEhSRUFEU19GQUxTRT0nIycKK2Vsc2UKKyAgSEFWRV9QVEhSRUFEU19UUlVFPScjJworICBIQVZFX1BUSFJFQURTX0ZBTFNFPQorZmkKKworCisKKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayBmb3IgdGhlIG5lY2Vzc2FyeSBzeXN0ZW0gaGVhZGVycy4KKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayB0aGUgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBvdGhlciBjb21waWxlcgorIyBhbmQgYXJjaGl0ZWN0dXJlIGNoYXJhY3RlcmlzdGljcy4KKworIyBPdXRwdXQgdGhlIGdlbmVyYXRlZCBmaWxlcy4gTm8gZnVydGhlciBhdXRvY29uZiBtYWNyb3MgbWF5IGJlIHVzZWQuCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAorIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzOiBkb3VibGUtcXVvdGUKKyAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwuCisgICAgICBzZWQgLW4gXAorCSJzLycvJ1xcXFwnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCisgICAgICA7OworICAgIGVzYWMgfAorICAgIHNvcnQKKykgfAorICBzZWQgJworICAgICAvXmFjX2N2X2Vudl8vYiBlbmQKKyAgICAgdCBjbGVhcgorICAgICA6Y2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKyAgICAgOmVuZCcgPj5jb25mY2FjaGUKK2lmIGRpZmYgIiRjYWNoZV9maWxlIiBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KKwljYXQgY29uZmNhY2hlID4iJGNhY2hlX2ZpbGUiCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4gIygKKyAgICAgICAgKi8qIHwgPzoqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIkJCAmJgorCSAgbXYgLWYgIiRjYWNoZV9maWxlIiQkICIkY2FjaGVfZmlsZSIgOzsgIygKKyAgICAgICAgKikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiIDs7CisJZXNhYworICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9CitVPQorZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCisgIGFjX2k9YCRhc19lY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAorICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCisgICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgorICBhc19mbl9hcHBlbmQgYWNfbGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorICBhc19mbl9hcHBlbmQgYWNfbHRsaWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKK2RvbmUKK0xJQk9CSlM9JGFjX2xpYm9ianMKKworTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKKworCisgaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KKyAgYW1fX0VYRUVYVF9UUlVFPQorICBhbV9fRVhFRVhUX0ZBTFNFPScjJworZWxzZQorICBhbV9fRVhFRVhUX1RSVUU9JyMnCisgIGFtX19FWEVFWFRfRkFMU0U9CitmaQorCitpZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDWFhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0hBVkVfUFlUSE9OX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfUFlUSE9OX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9QWVRIT05cIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0hBVkVfUFRIUkVBRFNfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9QVEhSRUFEU19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfUFRIUkVBRFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCisKKzogIiR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9IgorYWNfd3JpdGVfZmFpbD0wCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cithc193cml0ZV9mYWlsPTAKK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCisKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKworIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNj4mMQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTRU9GCit0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrICRhc19tZSAxLjYuMCwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjguICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKyIKKworX0FDRU9GCisKK2Nhc2UgJGFjX2NvbmZpZ19maWxlcyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfZmlsZXM7IHNoaWZ0OyBhY19jb25maWdfZmlsZXM9JCo7OworZXNhYworCitjYXNlICRhY19jb25maWdfaGVhZGVycyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSQqOzsKK2VzYWMKKworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKK2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCitjb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMiCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBhY3Rpb25zCitmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gIFVubGVzcyB0aGUgZmlsZXMKK2FuZCBhY3Rpb25zIGFyZSBzcGVjaWZpZWQgYXMgVEFHcywgYWxsIGFyZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtUQUddLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKKyAgICAgIC0tY29uZmlnICAgICBwcmludCBjb25maWd1cmF0aW9uLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50CisgICAgICAgICAgICAgICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCisgIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisgICAgICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCisgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGhlYWRlcnM6CiskY29uZmlnX2hlYWRlcnMKKworQ29uZmlndXJhdGlvbiBjb21tYW5kczoKKyRjb25maWdfY29tbWFuZHMKKworUmVwb3J0IGJ1Z3MgdG8gPGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbT4uIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKK2FjX2NzX3ZlcnNpb249IlxcCitHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGNvbmZpZy5zdGF0dXMgMS42LjAKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OCwKKyAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCisKK0NvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKworYWNfcHdkPSckYWNfcHdkJworc3JjZGlyPSckc3JjZGlyJworSU5TVEFMTD0nJElOU1RBTEwnCitNS0RJUl9QPSckTUtESVJfUCcKK0FXSz0nJEFXSycKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPT8qKQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtLSo9KQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPQorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAqKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKKyAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKKyAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKKworICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBzZXQgWCAnJFNIRUxMJyAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCisgIHNoaWZ0CisgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisgIENPTkZJR19TSEVMTD0nJFNIRUxMJworICBleHBvcnQgQ09ORklHX1NIRUxMCisgIGV4ZWMgIlwkQCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCisgICRhc19lY2hvICIkYWNfbG9nIgorfSA+JjUKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMKKyMgSU5JVC1DT01NQU5EUworIworQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIgorCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKK2RvdWJsZV9xdW90ZV9zdWJzdD0nJGRvdWJsZV9xdW90ZV9zdWJzdCcKK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSckZGVsYXlfdmFyaWFibGVfc3Vic3QnCittYWNyb192ZXJzaW9uPSdgJEVDSE8gIiRtYWNyb192ZXJzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21hY3JvX3JldmlzaW9uPSdgJEVDSE8gIiRtYWNyb19yZXZpc2lvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfc2hhcmVkPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zdGF0aWM9J2AkRUNITyAiJGVuYWJsZV9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcGljX21vZGU9J2AkRUNITyAiJHBpY19tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9mYXN0X2luc3RhbGw9J2AkRUNITyAiJGVuYWJsZV9mYXN0X2luc3RhbGwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU0hFTEw9J2AkRUNITyAiJFNIRUxMIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0VDSE89J2AkRUNITyAiJEVDSE8iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworUEFUSF9TRVBBUkFUT1I9J2AkRUNITyAiJFBBVEhfU0VQQVJBVE9SIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hvc3RfYWxpYXM9J2AkRUNITyAiJGhvc3RfYWxpYXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaG9zdD0nYCRFQ0hPICIkaG9zdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitob3N0X29zPSdgJEVDSE8gIiRob3N0X29zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2J1aWxkX2FsaWFzPSdgJEVDSE8gIiRidWlsZF9hbGlhcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitidWlsZD0nYCRFQ0hPICIkYnVpbGQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYnVpbGRfb3M9J2AkRUNITyAiJGJ1aWxkX29zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1NFRD0nYCRFQ0hPICIkU0VEIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1hzZWQ9J2AkRUNITyAiJFhzZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworR1JFUD0nYCRFQ0hPICIkR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitFR1JFUD0nYCRFQ0hPICIkRUdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRkdSRVA9J2AkRUNITyAiJEZHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xEPSdgJEVDSE8gIiRMRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitOTT0nYCRFQ0hPICIkTk0iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTE5fUz0nYCRFQ0hPICIkTE5fUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittYXhfY21kX2xlbj0nYCRFQ0hPICIkbWF4X2NtZF9sZW4iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWNfb2JqZXh0PSdgJEVDSE8gIiRhY19vYmpleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhlZXh0PSdgJEVDSE8gIiRleGVleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfdW5zZXQ9J2AkRUNITyAiJGx0X3Vuc2V0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X1NQMk5MPSdgJEVDSE8gIiRsdF9TUDJOTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9OTDJTUD0nYCRFQ0hPICIkbHRfTkwyU1AiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfdG9faG9zdF9maWxlX2NtZD0nYCRFQ0hPICIkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl90b190b29sX2ZpbGVfY21kPSdgJEVDSE8gIiRsdF9jdl90b190b29sX2ZpbGVfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3JlbG9hZF9mbGFnPSdgJEVDSE8gIiRyZWxvYWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCityZWxvYWRfY21kcz0nYCRFQ0hPICIkcmVsb2FkX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT0JKRFVNUD0nYCRFQ0hPICIkT0JKRFVNUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitkZXBsaWJzX2NoZWNrX21ldGhvZD0nYCRFQ0hPICIkZGVwbGlic19jaGVja19tZXRob2QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9tYWdpY19jbWQ9J2AkRUNITyAiJGZpbGVfbWFnaWNfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbWFnaWNfZ2xvYj0nYCRFQ0hPICIkZmlsZV9tYWdpY19nbG9iIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dhbnRfbm9jYXNlZ2xvYj0nYCRFQ0hPICIkd2FudF9ub2Nhc2VnbG9iIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0RMTFRPT0w9J2AkRUNITyAiJERMTFRPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9J2AkRUNITyAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0FSPSdgJEVDSE8gIiRBUiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitBUl9GTEFHUz0nYCRFQ0hPICIkQVJfRkxBR1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZXJfbGlzdF9zcGVjPSdgJEVDSE8gIiRhcmNoaXZlcl9saXN0X3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU1RSSVA9J2AkRUNITyAiJFNUUklQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1JBTkxJQj0nYCRFQ0hPICIkUkFOTElCIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPSdgJEVDSE8gIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQ0M9J2AkRUNITyAiJENDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0NGTEFHUz0nYCRFQ0hPICIkQ0ZMQUdTIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyPSdgJEVDSE8gIiRjb21waWxlciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitHQ0M9J2AkRUNITyAiJEdDQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitubV9maWxlX2xpc3Rfc3BlYz0nYCRFQ0hPICIkbm1fZmlsZV9saXN0X3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfc3lzcm9vdD0nYCRFQ0hPICIkbHRfc3lzcm9vdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvYmpkaXI9J2AkRUNITyAiJG9iamRpciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitNQUdJQ19DTUQ9J2AkRUNITyAiJE1BR0lDX0NNRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9waWM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfcGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfd2w9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfd2wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vPSdgJEVDSE8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCituZWVkX2xvY2tzPSdgJEVDSE8gIiRuZWVkX2xvY2tzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK01BTklGRVNUX1RPT0w9J2AkRUNITyAiJE1BTklGRVNUX1RPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRFNZTVVUSUw9J2AkRUNITyAiJERTWU1VVElMIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK05NRURJVD0nYCRFQ0hPICIkTk1FRElUIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xJUE89J2AkRUNITyAiJExJUE8iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT1RPT0w9J2AkRUNITyAiJE9UT09MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK09UT09MNjQ9J2AkRUNITyAiJE9UT09MNjQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGliZXh0PSdgJEVDSE8gIiRsaWJleHQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hyZXh0X2NtZHM9J2AkRUNITyAiJHNocmV4dF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4dHJhY3RfZXhwc3ltc19jbWRzPSdgJEVDSE8gIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2NtZHNfbmVlZF9sYz0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX25lZWRfbGMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz0nYCRFQ0hPICIkZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9J2AkRUNITyAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nYCRFQ0hPICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbmVlZHNfb2JqZWN0PSdgJEVDSE8gIiRjb21waWxlcl9uZWVkc19vYmplY3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9jbWRzPSdgJEVDSE8gIiRhcmNoaXZlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9leHBzeW1fY21kcz0nYCRFQ0hPICIkYXJjaGl2ZV9leHBzeW1fY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittb2R1bGVfY21kcz0nYCRFQ0hPICIkbW9kdWxlX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbW9kdWxlX2V4cHN5bV9jbWRzPSdgJEVDSE8gIiRtb2R1bGVfZXhwc3ltX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2l0aF9nbnVfbGQ9J2AkRUNITyAiJHdpdGhfZ251X2xkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FsbG93X3VuZGVmaW5lZF9mbGFnPSdgJEVDSE8gIiRhbGxvd191bmRlZmluZWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitub191bmRlZmluZWRfZmxhZz0nYCRFQ0hPICIkbm9fdW5kZWZpbmVkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYCRFQ0hPICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdD0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX21pbnVzX0w9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWM9J2AkRUNITyAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmhlcml0X3JwYXRoPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpbmtfYWxsX2RlcGxpYnM9J2AkRUNITyAiJGxpbmtfYWxsX2RlcGxpYnMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSdgJEVDSE8gIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X3N5bWJvbHNfY21kcz0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGV4Y2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVsaW5rX2NtZHM9J2AkRUNITyAiJHByZWxpbmtfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0bGlua19jbWRzPSdgJEVDSE8gIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRmaWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0nYCRFQ0hPICIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF9saWJfcHJlZml4PSdgJEVDSE8gIiRuZWVkX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF92ZXJzaW9uPSdgJEVDSE8gIiRuZWVkX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwordmVyc2lvbl90eXBlPSdgJEVDSE8gIiR2ZXJzaW9uX3R5cGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcnVucGF0aF92YXI9J2AkRUNITyAiJHJ1bnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NobGlicGF0aF92YXI9J2AkRUNITyAiJHNobGlicGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSdgJEVDSE8gIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlibmFtZV9zcGVjPSdgJEVDSE8gIiRsaWJuYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlicmFyeV9uYW1lc19zcGVjPSdgJEVDSE8gIiRsaWJyYXJ5X25hbWVzX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc29uYW1lX3NwZWM9J2AkRUNITyAiJHNvbmFtZV9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luc3RhbGxfb3ZlcnJpZGVfbW9kZT0nYCRFQ0hPICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRwb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmluaXNoX2NtZHM9J2AkRUNITyAiJGZpbmlzaF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbmlzaF9ldmFsPSdgJEVDSE8gIiRmaW5pc2hfZXZhbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9pbnRvX2xpYnM9J2AkRUNITyAiJGhhcmRjb2RlX2ludG9fbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9J2AkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfYWN0aW9uPSdgJEVDSE8gIiRoYXJkY29kZV9hY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Rsb3Blbj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3BlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGY9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9zdHJpcGxpYj0nYCRFQ0hPICIkb2xkX3N0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N0cmlwbGliPSdgJEVDSE8gIiRzdHJpcGxpYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9J2AkRUNITyAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0cz0nYCRFQ0hPICIkcHJlZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGRlcF9vYmplY3RzPSdgJEVDSE8gIiRwb3N0ZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcHJlZGVwcz0nYCRFQ0hPICIkcHJlZGVwcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwcz0nYCRFQ0hPICIkcG9zdGRlcHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSdgJEVDSE8gIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTERfQ1hYPSdgJEVDSE8gIiRMRF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRyZWxvYWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2NtZHNfQ1hYPSdgJEVDSE8gIiRyZWxvYWRfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfY21kc19DWFg9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dDQ19DWFg9J2AkRUNITyAiJEdDQ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl93bF9DWFg9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD0nYCRFQ0hPICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPSdgJEVDSE8gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nYCRFQ0hPICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX25lZWRzX29iamVjdF9DWFg9J2AkRUNITyAiJGNvbXBpbGVyX25lZWRzX29iamVjdF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFg9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWD0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19DWFg9J2AkRUNITyAiJGFyY2hpdmVfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2AkRUNITyAiJGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9jbWRzX0NYWD0nYCRFQ0hPICIkbW9kdWxlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9leHBzeW1fY21kc19DWFg9J2AkRUNITyAiJG1vZHVsZV9leHBzeW1fY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2l0aF9nbnVfbGRfQ1hYPSdgJEVDSE8gIiR3aXRoX2dudV9sZF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRub191bmRlZmluZWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9kaXJlY3RfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3RfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbWludXNfTF9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0xfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luaGVyaXRfcnBhdGhfQ1hYPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaW5rX2FsbF9kZXBsaWJzX0NYWD0nYCRFQ0hPICIkbGlua19hbGxfZGVwbGlic19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD0nYCRFQ0hPICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhjbHVkZV9leHBzeW1zX0NYWD0nYCRFQ0hPICIkZXhjbHVkZV9leHBzeW1zX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXNfQ1hYPSdgJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWxpbmtfY21kc19DWFg9J2AkRUNITyAiJHByZWxpbmtfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGxpbmtfY21kc19DWFg9J2AkRUNITyAiJHBvc3RsaW5rX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjX0NYWD0nYCRFQ0hPICIkZmlsZV9saXN0X3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2FjdGlvbl9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0c19DWFg9J2AkRUNITyAiJHByZWRlcF9vYmplY3RzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwX29iamVjdHNfQ1hYPSdgJEVDSE8gIiRwb3N0ZGVwX29iamVjdHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWRlcHNfQ1hYPSdgJEVDSE8gIiRwcmVkZXBzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwc19DWFg9J2AkRUNITyAiJHBvc3RkZXBzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPSdgJEVDSE8gIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKKworTFRDQz0nJExUQ0MnCitMVENGTEFHUz0nJExUQ0ZMQUdTJworY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJworCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisKKyMgUXVvdGUgZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIFNIRUxMIFwKK0VDSE8gXAorUEFUSF9TRVBBUkFUT1IgXAorU0VEIFwKK0dSRVAgXAorRUdSRVAgXAorRkdSRVAgXAorTEQgXAorTk0gXAorTE5fUyBcCitsdF9TUDJOTCBcCitsdF9OTDJTUCBcCityZWxvYWRfZmxhZyBcCitPQkpEVU1QIFwKK2RlcGxpYnNfY2hlY2tfbWV0aG9kIFwKK2ZpbGVfbWFnaWNfY21kIFwKK2ZpbGVfbWFnaWNfZ2xvYiBcCit3YW50X25vY2FzZWdsb2IgXAorRExMVE9PTCBcCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCBcCitBUiBcCitBUl9GTEFHUyBcCithcmNoaXZlcl9saXN0X3NwZWMgXAorU1RSSVAgXAorUkFOTElCIFwKK0NDIFwKK0NGTEFHUyBcCitjb21waWxlciBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXggXAorbm1fZmlsZV9saXN0X3NwZWMgXAorbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgXAorbHRfcHJvZ19jb21waWxlcl9waWMgXAorbHRfcHJvZ19jb21waWxlcl93bCBcCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyBcCitsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCituZWVkX2xvY2tzIFwKK01BTklGRVNUX1RPT0wgXAorRFNZTVVUSUwgXAorTk1FRElUIFwKK0xJUE8gXAorT1RPT0wgXAorT1RPT0w2NCBcCitzaHJleHRfY21kcyBcCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgXAorY29tcGlsZXJfbmVlZHNfb2JqZWN0IFwKK3dpdGhfZ251X2xkIFwKK2FsbG93X3VuZGVmaW5lZF9mbGFnIFwKK25vX3VuZGVmaW5lZF9mbGFnIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCitleGNsdWRlX2V4cHN5bXMgXAoraW5jbHVkZV9leHBzeW1zIFwKK2ZpbGVfbGlzdF9zcGVjIFwKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIFwKK2xpYm5hbWVfc3BlYyBcCitsaWJyYXJ5X25hbWVzX3NwZWMgXAorc29uYW1lX3NwZWMgXAoraW5zdGFsbF9vdmVycmlkZV9tb2RlIFwKK2ZpbmlzaF9ldmFsIFwKK29sZF9zdHJpcGxpYiBcCitzdHJpcGxpYiBcCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgXAorcHJlZGVwX29iamVjdHMgXAorcG9zdGRlcF9vYmplY3RzIFwKK3ByZWRlcHMgXAorcG9zdGRlcHMgXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKK0xEX0NYWCBcCityZWxvYWRfZmxhZ19DWFggXAorY29tcGlsZXJfQ1hYIFwKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWCBcCitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAorbHRfcHJvZ19jb21waWxlcl93bF9DWFggXAorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIFwKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCBcCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIFwKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWCBcCitjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYIFwKK3dpdGhfZ251X2xkX0NYWCBcCithbGxvd191bmRlZmluZWRfZmxhZ19DWFggXAorbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIFwKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYIFwKK2V4Y2x1ZGVfZXhwc3ltc19DWFggXAoraW5jbHVkZV9leHBzeW1zX0NYWCBcCitmaWxlX2xpc3Rfc3BlY19DWFggXAorY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCBcCitwcmVkZXBfb2JqZWN0c19DWFggXAorcG9zdGRlcF9vYmplY3RzX0NYWCBcCitwcmVkZXBzX0NYWCBcCitwb3N0ZGVwc19DWFggXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWDsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1xcXFxcXFxgXFwiXFxcJF0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gcmVsb2FkX2NtZHMgXAorb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAorb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCitvbGRfYXJjaGl2ZV9jbWRzIFwKK2V4dHJhY3RfZXhwc3ltc19jbWRzIFwKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorYXJjaGl2ZV9jbWRzIFwKK2FyY2hpdmVfZXhwc3ltX2NtZHMgXAorbW9kdWxlX2NtZHMgXAorbW9kdWxlX2V4cHN5bV9jbWRzIFwKK2V4cG9ydF9zeW1ib2xzX2NtZHMgXAorcHJlbGlua19jbWRzIFwKK3Bvc3RsaW5rX2NtZHMgXAorcG9zdGluc3RhbGxfY21kcyBcCitwb3N0dW5pbnN0YWxsX2NtZHMgXAorZmluaXNoX2NtZHMgXAorc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIFwKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKK3JlbG9hZF9jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCBcCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAorYXJjaGl2ZV9jbWRzX0NYWCBcCithcmNoaXZlX2V4cHN5bV9jbWRzX0NYWCBcCittb2R1bGVfY21kc19DWFggXAorbW9kdWxlX2V4cHN5bV9jbWRzX0NYWCBcCitleHBvcnRfc3ltYm9sc19jbWRzX0NYWCBcCitwcmVsaW5rX2NtZHNfQ1hYIFwKK3Bvc3RsaW5rX2NtZHNfQ1hYOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInCit4c2lfc2hlbGw9JyR4c2lfc2hlbGwnCitsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnCisKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCisKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJworCisKKworCisKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiYnVpbGQtYXV4L2NvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBidWlsZC1hdXgvY29uZmlnLmgiIDs7CisgICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworICAgICJzY3JpcHRzL2d0ZXN0LWNvbmZpZyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2d0ZXN0LWNvbmZpZyIgOzsKKyAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICAgImxpYnRvb2wiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgbGlidG9vbCIgOzsKKworICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKKyAgZXNhYworZG9uZQorCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKKyMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorJGRlYnVnIHx8Cit7CisgIHRtcD0gYWNfdG1wPQorICB0cmFwICdleGl0X3N0YXR1cz0kPworICA6ICIke2FjX3RtcDo9JHRtcH0iCisgIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorYWNfdG1wPSR0bXAKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgoraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKworCithY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCisjIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCisjIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKKyMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCitpZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KKyAgZXZhbCBhY19jcj1cJFwnXFxyXCcKK2ZpCithY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCitpZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgorICBhY19jc19hd2tfY3I9J1xccicKK2Vsc2UKKyAgYWNfY3NfYXdrX2NyPSRhY19jcgorZmkKKworZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKK19BQ0VPRgorCisKK3sKKyAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKyAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgorICBlY2hvICJfQUNFT0YiCit9ID5jb25mJCRzdWJzLnNoIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK2FjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCisgIC4gLi9jb25mJCRzdWJzLnNoIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCisgIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorcm0gLWYgY29uZiQkc3Vicy5zaAorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKK19BQ0VPRgorc2VkIC1uICcKK2gKK3MvXi9TWyIvOyBzLyEuKi8iXT0vCitwCitnCitzL15bXiFdKiEvLworOnJlcGwKK3QgcmVwbAorcy8nIiRhY19kZWxpbSInJC8vCit0IGRlbGltCis6bmwKK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworcAorbgorYiByZXBsCis6bW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBubAorOmRlbGltCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCitwCitiCis6bW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBkZWxpbQorJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJworL15bXiIiXS97CisgIE4KKyAgcy9cbi8vCit9CisnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCitybSAtZiBjb25mJCRzdWJzLmF3aworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitfQUNBV0sKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCisgIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCisKK30KK3sKKyAgbGluZSA9ICQgMAorICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKKyAgc3Vic3RlZCA9IDAKKyAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQorICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7CisgICAga2V5ID0gZmllbGRbaV0KKyAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQorICAgIGlmIChTX2lzX3NldFtrZXldKSB7CisgICAgICB2YWx1ZSA9IFNba2V5XQorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQorICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKKyAgICAgIHN1YnN0ZWQgPSAxCisgICAgfSBlbHNlCisgICAgICBsZW4gKz0gMSArIGtleWxlbgorICB9CisKKyAgcHJpbnQgbGluZQorfQorCitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQoraWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCitlbHNlCisgIGNhdAorZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorX0FDRU9GCisKKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKK2gKK3MvLy8KK3MvXi86Lworcy9bCSBdKiQvOi8KK3MvOlwkKHNyY2Rpcik6LzovZworcy86XCR7c3JjZGlyfTovOi9nCitzLzpAc3JjZGlyQDovOi9nCitzL146Ki8vCitzLzoqJC8vCit4CitzL1woPVsJIF0qXCkuKi9cMS8KK0cKK3MvXG4vLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCitpZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCitjYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKK0JFR0lOIHsKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bworIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorCisjIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCisjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCisgIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKKyAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCisKKyMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAorIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCisjIG5ld2xpbmUgc2VxdWVuY2VzLgorCithY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorc2VkIC1uICcKK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCByc2V0Cis6cnNldAorcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KK3QgZGVmCitkCis6ZGVmCitzL1xcJC8vCit0IGJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzIi9wCitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAorZAorOmJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCit0IGNvbnQKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCit0IGNvbnQKK2QKKzpjb250CituCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgY2xlYXIKKzpjbGVhcgorcy9cXCQvLwordCBic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCitkCis6YnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAorYiBjb250CisnIDxjb25mZGVmcy5oIHwgc2VkICcKK3MvJyIkYWNfZGVsaW0iJy8iXFxcCisiL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorfQorL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7CisgIGxpbmUgPSBcJCAwCisgIHNwbGl0KGxpbmUsIGFyZywgIiAiKQorICBpZiAoYXJnWzFdID09ICIjIikgeworICAgIGRlZnVuZGVmID0gYXJnWzJdCisgICAgbWFjMSA9IGFyZ1szXQorICB9IGVsc2UgeworICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKKyAgICBtYWMxID0gYXJnWzJdCisgIH0KKyAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQorICBtYWNybyA9IG1hYzJbMV0KKyAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCisgIGlmIChEX2lzX3NldFttYWNyb10pIHsKKyAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgorICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KKyAgICBuZXh0CisgIH0gZWxzZSB7CisgICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAorICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKyAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgeworICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgorICAgICAgbmV4dAorICAgIH0KKyAgfQorfQoreyBwcmludCB9CitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgorCisKK2V2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCitzaGlmdAorZm9yIGFjX3RhZworZG8KKyAgY2FzZSAkYWNfdGFnIGluCisgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworICBlc2FjCisgIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCisgIDpbRkhMXSo6Kik7OworICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKKyAgOltGSF0tKSBhY190YWc9LTotOzsKKyAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKyAgZXNhYworICBhY19zYXZlX0lGUz0kSUZTCisgIElGUz06CisgIHNldCB4ICRhY190YWcKKyAgSUZTPSRhY19zYXZlX0lGUworICBzaGlmdAorICBhY19maWxlPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6TCkgYWNfc291cmNlPSQxOzsKKyAgOltGSF0pCisgICAgYWNfZmlsZV9pbnB1dHM9CisgICAgZm9yIGFjX2YKKyAgICBkbworICAgICAgY2FzZSAkYWNfZiBpbgorICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OworICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKwkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCisJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisJIHRlc3QgLWYgIiRhY19mIiB8fAorCSAgIGNhc2UgJGFjX2YgaW4KKwkgICBbXFwvJF0qKSBmYWxzZTs7CisJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworCSAgIGVzYWMgfHwKKwkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYworICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworCWAnIGJ5IGNvbmZpZ3VyZS4nCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKyAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKKyAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAorICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworICAgIGVzYWMKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworCisgIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisgIGVzYWMKKyAgYWNfTUtESVJfUD0kTUtESVJfUAorICBjYXNlICRNS0RJUl9QIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7CisgIGVzYWMKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCisjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KK2FjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQorYWNfc2VkX2RhdGFyb290PScKKy9kYXRhcm9vdGRpci8geworICBwCisgIHEKK30KKy9AZGF0YWRpckAvcAorL0Bkb2NkaXJAL3AKKy9AaW5mb2RpckAvcAorL0Bsb2NhbGVkaXJAL3AKKy9AbWFuZGlyQC9wJworY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OworKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCisgIHMmQGRvY2RpckAmJGRvY2RpciZnCisgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKKyAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKKyAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKK2VzYWMKK19BQ0VPRgorCisjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKyMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0CitzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CitzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAorcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0CitzJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CitzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0CitzJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0CitzJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0CiskYWNfZGF0YXJvb3RkaXJfaGFjaworIgorZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisKK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKKyAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQorCisgIHJtIC1mICIkYWNfdG1wL3N0ZGluIgorICBjYXNlICRhY19maWxlIGluCisgIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OworICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CisgIGVzYWMgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyA7OworICA6SCkKKyAgIworICAjIENPTkZJR19IRUFERVIKKyAgIworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeworICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKyAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBybSAtZiAiJGFjX2ZpbGUiCisgICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCisJfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CisgIGZpCisjIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9IiRhY19maWxlIgorX2FtX3N0YW1wX2NvdW50PTEKK2ZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbworICBjYXNlICRfYW1faGVhZGVyIGluCisgICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKKyAgICAgIGJyZWFrIDs7CisgICAgKiApCisgICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7CisgIGVzYWMKK2RvbmUKK2VjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gJGFzX2Rpcm5hbWUgLS0gIiRfYW1fYXJnIiB8fAorJGFzX2V4cHIgWCIkX2FtX2FyZyIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkX2FtX2FyZyIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRfYW1fYXJnIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKKyA7OworCisgIDpDKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQorIDs7CisgIGVzYWMKKworCisgIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgorICAgICJzY3JpcHRzL2d0ZXN0LWNvbmZpZyI6RikgY2htb2QgK3ggc2NyaXB0cy9ndGVzdC1jb25maWcgOzsKKyAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IHsKKyAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKKyAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAorICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KKyAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCisgICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7CisgICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OworICBlc2FjCisgIHNoaWZ0CisgIGZvciBtZgorICBkbworICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKKyAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KKyAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAorJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkbWYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgIGVsc2UKKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAorICAgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgICAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICAgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgICAjIGV4cGFuc2lvbi4KKyAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8CiskYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyOyBhc19mbl9ta2Rpcl9wCisgICAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgICAgZG9uZQorICBkb25lCit9CisgOzsKKyAgICAibGlidG9vbCI6QykKKworICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgICBmaQorCisgICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgorICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICAgJFJNICIkY2ZnZmlsZSIKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCisjICAgICAgICAgICAgICAgICBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgorIworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgorIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9IkNYWCAiCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkPworbWFjcm9fdmVyc2lvbj0kbWFjcm9fdmVyc2lvbgorbWFjcm9fcmV2aXNpb249JG1hY3JvX3JldmlzaW9uCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkLgorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzLgorRUNITz0kbHRfRUNITworCisjIFRoZSBQQVRIIHNlcGFyYXRvciBmb3IgdGhlIGJ1aWxkIHN5c3RlbS4KK1BBVEhfU0VQQVJBVE9SPSRsdF9QQVRIX1NFUEFSQVRPUgorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEEgc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCitTRUQ9JGx0X1NFRAorCisjIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgorWHNlZD0iXCRTRUQgLWUgMXMvXlgvLyIKKworIyBBIGdyZXAgcHJvZ3JhbSB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcy4KK0dSRVA9JGx0X0dSRVAKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIEEgbGl0ZXJhbCBzdHJpbmcgbWF0Y2hlci4KK0ZHUkVQPSRsdF9GR1JFUAorCisjIEEgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyLgorTk09JGx0X05NCisKKyMgV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbWF4X2NtZF9sZW4KKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9JGFjX29iamV4dAorCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0kZXhlZXh0CisKKyMgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgInVuc2V0Ii4KK2x0X3Vuc2V0PSRsdF91bnNldAorCisjIHR1cm4gc3BhY2VzIGludG8gbmV3bGluZXMuCitTUDJOTD0kbHRfbHRfU1AyTkwKKworIyB0dXJuIG5ld2xpbmVzIGludG8gc3BhY2VzLgorTkwyU1A9JGx0X2x0X05MMlNQCisKKyMgY29udmVydCBcJGJ1aWxkIGZpbGUgbmFtZXMgdG8gXCRob3N0IGZvcm1hdC4KK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKKworIyBjb252ZXJ0IFwkYnVpbGQgZmlsZXMgdG8gdG9vbGNoYWluIGZvcm1hdC4KK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKKworIyBBbiBvYmplY3Qgc3ltYm9sIGR1bXBlci4KK09CSkRVTVA9JGx0X09CSkRVTVAKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyIuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBIb3cgdG8gZmluZCBwb3RlbnRpYWwgZmlsZXMgd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIi4KK2ZpbGVfbWFnaWNfZ2xvYj0kbHRfZmlsZV9tYWdpY19nbG9iCisKKyMgRmluZCBwb3RlbnRpYWwgZmlsZXMgdXNpbmcgbm9jYXNlZ2xvYiB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiLgord2FudF9ub2Nhc2VnbG9iPSRsdF93YW50X25vY2FzZWdsb2IKKworIyBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9JGx0X0RMTFRPT0wKKworIyBDb21tYW5kIHRvIGFzc29jaWF0ZSBzaGFyZWQgYW5kIGxpbmsgbGlicmFyaWVzLgorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCisKKyMgRmxhZ3MgdG8gY3JlYXRlIGFuIGFyY2hpdmUuCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXIuCithcmNoaXZlcl9saXN0X3NwZWM9JGx0X2FyY2hpdmVyX2xpc3Rfc3BlYworCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtLgorU1RSSVA9JGx0X1NUUklQCisKKyMgQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIFdoZXRoZXIgdG8gdXNlIGEgbG9jayBmb3Igb2xkIGFyY2hpdmUgZXh0cmFjdGlvbi4KK2xvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj0kbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0NGTEFHUworCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIuCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkLgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4CisKKyMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzIGZvciBcJE5NLgorbm1fZmlsZV9saXN0X3NwZWM9JGx0X25tX2ZpbGVfbGlzdF9zcGVjCisKKyMgVGhlIHJvb3Qgd2hlcmUgdG8gc2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzLGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuCitsdF9zeXNyb290PSRsdF9zeXNyb290CisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiLgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBNYW5pZmVzdCB0b29sLgorTUFOSUZFU1RfVE9PTD0kbHRfTUFOSUZFU1RfVE9PTAorCisjIFRvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFguCitEU1lNVVRJTD0kbHRfRFNZTVVUSUwKKworIyBUb29sIHRvIGNoYW5nZSBnbG9iYWwgdG8gbG9jYWwgc3ltYm9scyBvbiBNYWMgT1MgWC4KK05NRURJVD0kbHRfTk1FRElUCisKKyMgVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWC4KK0xJUE89JGx0X0xJUE8KKworIyBsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWC4KK09UT09MPSRsdF9PVE9PTAorCisjIGxkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40LgorT1RPT0w2ND0kbHRfT1RPT0w2NAorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0kbGliZXh0CisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0kbHRfc2hyZXh0X2NtZHMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IGxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSRsdF92YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaworCisjIERvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIFNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRQorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIFBlcm1pc3Npb24gbW9kZSBvdmVycmlkZSBmb3IgaW5zdGFsbGF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMuCitpbnN0YWxsX292ZXJyaWRlX21vZGU9JGx0X2luc3RhbGxfb3ZlcnJpZGVfbW9kZQorCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIGluc3RhbGxhdGlvbiBvZiBhIHNoYXJlZCBhcmNoaXZlLgorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIEFzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorIyBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMuCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzLgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRAorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2NfbworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYy4KK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIFdoZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5LgorY29tcGlsZXJfbmVlZHNfb2JqZWN0PSRsdF9jb21waWxlcl9uZWVkc19vYmplY3QKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworIyBhIHNoYXJlZCBhcmNoaXZlLgorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kcworCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUVcJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyMgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyMgImFic29sdXRlIixpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyBcJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyMgbGlicmFyeSBpcyByZWxvY2F0ZWQuCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9JGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZQorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyMgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljCisKKyMgU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyMgdG8gcnVudGltZSBwYXRoIGxpc3QuCitpbmhlcml0X3JwYXRoPSRpbmhlcml0X3JwYXRoCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlicworCisjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcworCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzLgorcHJlbGlua19jbWRzPSRsdF9wcmVsaW5rX2NtZHMKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zLgorcG9zdGxpbmtfY21kcz0kbHRfcG9zdGxpbmtfY21kcworCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcy4KK2ZpbGVfbGlzdF9zcGVjPSRsdF9maWxlX2xpc3Rfc3BlYworCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KKworIyBUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlycworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworIyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0cworcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHMKK3ByZWRlcHM9JGx0X3ByZWRlcHMKK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwcworCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aAorCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX0xUX0VPRgorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK19MVF9FT0YKKyAgICA7OworICBlc2FjCisKKworbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCisKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgaWYgdGVzdCB4IiR4c2lfc2hlbGwiID0geHllczsgdGhlbgorICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lICgpJC8sL159ICMgZnVuY19kaXJuYW1lIC9jXAorZnVuY19kaXJuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfYmFzZW5hbWUgL2NcCitmdW5jX2Jhc2VuYW1lICgpXAore1wKK1wgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Jhc2VuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgL2NcCitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCitcICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3RyaXBuYW1lICgpJC8sL159ICMgZnVuY19zdHJpcG5hbWUgL2NcCitmdW5jX3N0cmlwbmFtZSAoKVwKK3tcCitcICAgICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmVcCitcICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC5cCitcICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9XAorXCAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifVwKK1wgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zdHJpcG5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3NwbGl0X2xvbmdfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9sb25nX29wdCAvY1wKK2Z1bmNfc3BsaXRfbG9uZ19vcHQgKClcCit7XAorXCAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9JHsxJSU9Kn1cCitcICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPSR7MSMqPX1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zcGxpdF9sb25nX29wdCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3BsaXRfc2hvcnRfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9zaG9ydF9vcHQgL2NcCitmdW5jX3NwbGl0X3Nob3J0X29wdCAoKVwKK3tcCitcICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZz0kezEjPz99XAorXCAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19sbzJvICgpJC8sL159ICMgZnVuY19sbzJvIC9jXAorZnVuY19sbzJvICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICoubG8pIGZ1bmNfbG8yb19yZXN1bHQ9JHsxJS5sb30uJHtvYmpleHR9IDs7XAorXCAgICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7O1wKK1wgICAgZXNhY1wKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xvMm8gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3hmb3JtICgpJC8sL159ICMgZnVuY194Zm9ybSAvY1wKK2Z1bmNfeGZvcm0gKClcCit7XAorICAgIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG9cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY194Zm9ybSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfYXJpdGggKCkkLywvXn0gIyBmdW5jX2FyaXRoIC9jXAorZnVuY19hcml0aCAoKVwKK3tcCisgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICQqICkpXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXJpdGggaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2xlbiAoKSQvLC9efSAjIGZ1bmNfbGVuIC9jXAorZnVuY19sZW4gKClcCit7XAorICAgIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xlbiBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCitmaQorCitpZiB0ZXN0IHgiJGx0X3NoZWxsX2FwcGVuZCIgPSB4eWVzOyB0aGVuCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZCAoKSQvLC9efSAjIGZ1bmNfYXBwZW5kIC9jXAorZnVuY19hcHBlbmQgKClcCit7XAorICAgIGV2YWwgIiR7MX0rPVxcJHsyfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZF9xdW90ZWQgKCkkLywvXn0gIyBmdW5jX2FwcGVuZF9xdW90ZWQgL2NcCitmdW5jX2FwcGVuZF9xdW90ZWQgKClcCit7XAorXCAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IlwKK1wgICAgZXZhbCAiJHsxfSs9XFxcXCBcXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmRfcXVvdGVkIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgd2hlcmUgcG9zc2libGUgYnkgZGlyZWN0IHVzZSBvZiAnKz0nCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFthLXpBLVpfXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW2EtekEtWl9dXHsxLFx9XCkgIiVcMT0iJFwxJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitmaQorCitpZiB0ZXN0IHgiJF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWwiID0geCI6IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFVuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogVW5hYmxlIHRvIHN1YnN0aXR1dGUgZXh0ZW5kZWQgc2hlbGwgZnVuY3Rpb25zIGluICRvZmlsZSIgPiYyO30KK2ZpCisKKworICAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCisgIGNobW9kICt4ICIkb2ZpbGUiCisKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRvZmlsZSIKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBDWFgKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xEX0NYWAorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWdfQ1hYCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfQ1hYCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9DWFgKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0NfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9DWFgKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljLgorYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYCisKKyMgV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHkuCitjb21waWxlcl9uZWVkc19vYmplY3Q9JGx0X2NvbXBpbGVyX25lZWRzX29iamVjdF9DWFgKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFgKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfQ1hYCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0NYWAorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgaWYgZGlmZmVyZW50IGZyb20gYnVpbGRpbmcKKyMgYSBzaGFyZWQgYXJjaGl2ZS4KK21vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19DWFgKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX0NYWAorCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZF9DWFgKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKworIyBGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWAorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAiLXJwYXRoIiBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X0NYWAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyMgImFic29sdXRlIixpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyBcJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyMgbGlicmFyeSBpcyByZWxvY2F0ZWQuCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9JGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyMgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0NYWAorCisjIFNldCB0byB5ZXMgaWYgbGlua2VyIGFkZHMgcnVudGltZSBwYXRocyBvZiBkZXBlbmRlbnQgbGlicmFyaWVzCisjIHRvIHJ1bnRpbWUgcGF0aCBsaXN0LgoraW5oZXJpdF9ycGF0aD0kaW5oZXJpdF9ycGF0aF9DWFgKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX0NYWAorCisjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWAorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0NYWAorCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19DWFgKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19DWFgKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgcHJvZ3JhbXMgKGFnYWluc3QgbGlicmFyaWVzKSB3aXRoIHRlbXBsYXRlcy4KK3ByZWxpbmtfY21kcz0kbHRfcHJlbGlua19jbWRzX0NYWAorCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgZmluaXNoaW5nIGxpbmtpbmcgcHJvZ3JhbXMuCitwb3N0bGlua19jbWRzPSRsdF9wb3N0bGlua19jbWRzX0NYWAorCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcy4KK2ZpbGVfbGlzdF9zcGVjPSRsdF9maWxlX2xpc3Rfc3BlY19DWFgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX0NYWAorCisjIFRoZSBkaXJlY3RvcmllcyBzZWFyY2hlZCBieSB0aGlzIGNvbXBpbGVyIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlycz0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWAorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworIyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19DWFgKK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0NYWAorcHJlZGVwcz0kbHRfcHJlZGVwc19DWFgKK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19DWFgKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYCisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IENYWAorX0xUX0VPRgorCisgOzsKKworICBlc2FjCitkb25lICMgZm9yIGFjX3RhZworCisKK2FzX2ZuX2V4aXQgMAorX0FDRU9GCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCit0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAorICBhc19mbl9lcnJvciAkPyAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCisjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKyMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCisjIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisjIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCisjIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgYWNfY3Nfc3VjY2Vzcz06CisgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAxCitmaQoraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9CitmaQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvbmZpZ3VyZS5hYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YjI5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDY4IEBACittNF9pbmNsdWRlKG00L2FjeF9wdGhyZWFkLm00KQorCisjIEF0IHRoaXMgcG9pbnQsIHRoZSBYY29kZSBwcm9qZWN0IGFzc3VtZXMgdGhlIHZlcnNpb24gc3RyaW5nIHdpbGwgYmUgdGhyZWUKKyMgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMgYW5kIHN1cnJvdW5kZWQgYnkgc3F1YXJlIGJyYWNrZXRzIChlLmcuCisjICJbMS4wLjFdIikuIEl0IGFsc28gYXN1bWVzIHRoYXQgdGhlcmUgd29uJ3QgYmUgYW55IGNsb3NpbmcgcGFyZW50aGVzaXMKKyMgYmV0d2VlbiAiQUNfSU5JVCgiIGFuZCB0aGUgY2xvc2luZyAiKSIgaW5jbHVkaW5nIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgorQUNfSU5JVChbR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29ya10sCisgICAgICAgIFsxLjYuMF0sCisgICAgICAgIFtnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb21dLAorICAgICAgICBbZ3Rlc3RdKQorCisjIFByb3ZpZGUgdmFyaW91cyBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlIEF1dG9jb25mIGFuZCBjb25maWd1cmUgcHJvY2Vzc2VzLgorQUNfUFJFUkVRKFsyLjU5XSkKK0FDX0NPTkZJR19TUkNESVIoWy4vTElDRU5TRV0pCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCitBQ19DT05GSUdfQVVYX0RJUihbYnVpbGQtYXV4XSkKK0FDX0NPTkZJR19IRUFERVJTKFtidWlsZC1hdXgvY29uZmlnLmhdKQorQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCitBQ19DT05GSUdfRklMRVMoW3NjcmlwdHMvZ3Rlc3QtY29uZmlnXSwgW2NobW9kICt4IHNjcmlwdHMvZ3Rlc3QtY29uZmlnXSkKKworIyBJbml0aWFsaXplIEF1dG9tYWtlIHdpdGggdmFyaW91cyBvcHRpb25zLiBXZSByZXF1aXJlIGF0IGxlYXN0IHYxLjksIHByZXZlbnQKKyMgcGVkYW50aWMgY29tcGxhaW50cyBhYm91dCBwYWNrYWdlIGZpbGVzLCBhbmQgZW5hYmxlIHZhcmlvdXMgZGlzdHJpYnV0aW9uCisjIHRhcmdldHMuCitBTV9JTklUX0FVVE9NQUtFKFsxLjkgZGlzdC1iemlwMiBkaXN0LXppcCBmb3JlaWduIHN1YmRpci1vYmplY3RzXSkKKworIyBDaGVjayBmb3IgcHJvZ3JhbXMgdXNlZCBpbiBidWlsZGluZyBHb29nbGUgVGVzdC4KK0FDX1BST0dfQ0MKK0FDX1BST0dfQ1hYCitBQ19MQU5HKFtDKytdKQorQUNfUFJPR19MSUJUT09MCisKKyMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IEN1cnJlbnRseSB3ZSBhcmVuJ3QgcnVubmluZyB0aGUgUHl0aG9uIHRlc3RzCisjIGFnYWluc3QgdGhlIGludGVycHJldGVyIGRldGVjdGVkIGJ5IEFNX1BBVEhfUFlUSE9OLCBhbmQgc28gd2UgY29uZGl0aW9uCisjIEhBVkVfUFlUSE9OIGJ5IHJlcXVpcmluZyAicHl0aG9uIiB0byBiZSBpbiB0aGUgUEFUSCwgYW5kIHRoYXQgaW50ZXJwcmV0ZXIncworIyB2ZXJzaW9uIHRvIGJlID49IDIuMy4gVGhpcyB3aWxsIGFsbG93IHRoZSBzY3JpcHRzIHRvIHVzZSBhICIvdXNyL2Jpbi9lbnYiCisjIGhhc2hiYW5nLgorUFlUSE9OPSAgIyBXZSAqZG8gbm90KiBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcHl0aG9uIGludGVycHJldGVyCitBQ19QQVRIX1BST0coW1BZVEhPTl0sW3B5dGhvbl0sWzpdKQorQVNfSUYoW3Rlc3QgIiRQWVRIT04iICE9ICI6Il0sCisgICAgICBbQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oWyRQWVRIT05dLFsyLjNdLFs6XSxbUFlUSE9OPSI6Il0pXSkKK0FNX0NPTkRJVElPTkFMKFtIQVZFX1BZVEhPTl0sW3Rlc3QgIiRQWVRIT04iICE9ICI6Il0pCisKKyMgQ29uZmlndXJlIHB0aHJlYWRzLgorQUNfQVJHX1dJVEgoW3B0aHJlYWRzXSwKKyAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXB0aHJlYWRzXSwKKyAgICAgICAgICAgICAgIFt1c2UgcHRocmVhZHMgKGRlZmF1bHQgaXMgeWVzKV0pXSwKKyAgICAgICAgICAgIFt3aXRoX3B0aHJlYWRzPSR3aXRodmFsXSwKKyAgICAgICAgICAgIFt3aXRoX3B0aHJlYWRzPWNoZWNrXSkKKworaGF2ZV9wdGhyZWFkcz1ubworQVNfSUYoW3Rlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhubyJdLAorICAgICAgW0FDWF9QVEhSRUFEKAorICAgICAgICBbXSwKKyAgICAgICAgW0FTX0lGKFt0ZXN0ICJ4JHdpdGhfcHRocmVhZHMiICE9ICJ4Y2hlY2siXSwKKyAgICAgICAgICAgICAgIFtBQ19NU0dfRkFJTFVSRSgKKyAgICAgICAgICAgICAgICAgWy0td2l0aC1wdGhyZWFkcyB3YXMgc3BlY2lmaWVkLCBidXQgdW5hYmxlIHRvIGJlIHVzZWRdKV0pXSkKKyAgICAgICBoYXZlX3B0aHJlYWRzPSIkYWN4X3B0aHJlYWRfb2siXSkKK0FNX0NPTkRJVElPTkFMKFtIQVZFX1BUSFJFQURTXSxbdGVzdCAieCRoYXZlX3B0aHJlYWRzIiA9PSAieHllcyJdKQorQUNfU1VCU1QoUFRIUkVBRF9DRkxBR1MpCitBQ19TVUJTVChQVEhSRUFEX0xJQlMpCisKKyMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSkgQ2hlY2sgZm9yIHRoZSBuZWNlc3Nhcnkgc3lzdGVtIGhlYWRlcnMuCisKKyMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSkgQ2hlY2sgdGhlIHR5cGVzLCBzdHJ1Y3R1cmVzLCBhbmQgb3RoZXIgY29tcGlsZXIKKyMgYW5kIGFyY2hpdGVjdHVyZSBjaGFyYWN0ZXJpc3RpY3MuCisKKyMgT3V0cHV0IHRoZSBnZW5lcmF0ZWQgZmlsZXMuIE5vIGZ1cnRoZXIgYXV0b2NvbmYgbWFjcm9zIG1heSBiZSB1c2VkLgorQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4OGNhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYwpAQCAtMCwwICsxLDkyNTEgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGJ1aWxkIEdvb2dsZSBUZXN0IGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBmaWxlLgorLy8gVGhpcyBmaWxlIHNlcnZlcyB0aGlzIHB1cnBvc2UuCisKKy8vIFRoaXMgbGluZSBlbnN1cmVzIHRoYXQgZ3Rlc3QuaCBjYW4gYmUgY29tcGlsZWQgb24gaXRzIG93biwgZXZlbgorLy8gd2hlbiBpdCdzIGZ1c2VkLgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHVsbCBpbiB0aGUgcmVhbCBndGVzdCAqLmNjIGZpbGVzLgorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVXRpbGl0aWVzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZiBhbmQgY29kZSB0aGF0IHVzZXMgR29vZ2xlIFRlc3QKKy8vIChlLmcuIGZyYW1ld29ya3MgYnVpbHQgb24gdG9wIG9mIEdvb2dsZSBUZXN0KS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGhpcyBoZWxwZXIgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbW9jayBvdXQgR29vZ2xlIFRlc3QgZmFpbHVyZSByZXBvcnRpbmcKKy8vIHNvIHRoYXQgd2UgY2FuIHRlc3QgR29vZ2xlIFRlc3Qgb3IgY29kZSB0aGF0IGJ1aWxkcyBvbiBHb29nbGUgVGVzdC4KKy8vCisvLyBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBhcHBlbmRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0IHRvIHRoZQorLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBvYmplY3QgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yIHdoZW5ldmVyIGEgR29vZ2xlIFRlc3QKKy8vIGZhaWx1cmUgaXMgcmVwb3J0ZWQuIEl0IGNhbiBlaXRoZXIgaW50ZXJjZXB0IG9ubHkgZmFpbHVyZXMgdGhhdCBhcmUKKy8vIGdlbmVyYXRlZCBpbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoaXMgb2JqZWN0IG9yIGl0IGNhbiBpbnRlcmNlcHQKKy8vIGFsbCBnZW5lcmF0ZWQgZmFpbHVyZXMuIFRoZSBzY29wZSBvZiB0aGlzIG1vY2sgb2JqZWN0IGNhbiBiZSBjb250cm9sbGVkIHdpdGgKKy8vIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHR3byBhcmd1bWVudHMgY29uc3RydWN0b3IuCitjbGFzcyBHVEVTVF9BUElfIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICAvLyBUaGUgdHdvIHBvc3NpYmxlIG1vY2tpbmcgbW9kZXMgb2YgdGhpcyBvYmplY3QuCisgIGVudW0gSW50ZXJjZXB0TW9kZSB7CisgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICAvLyBJbnRlcmNlcHRzIG9ubHkgdGhyZWFkIGxvY2FsIGZhaWx1cmVzLgorICAgIElOVEVSQ0VQVF9BTExfVEhSRUFEUyAgICAgICAgICAgLy8gSW50ZXJjZXB0cyBhbGwgZmFpbHVyZXMuCisgIH07CisKKyAgLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZAorICAvLyBieSBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKyAgLy8gcmVzdWx0cy4gVGhpcyByZXBvcnRlciB3aWxsIG9ubHkgY2F0Y2ggZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50CisgIC8vIHRocmVhZC4gREVQUkVDQVRFRAorICBleHBsaWNpdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpOworCisgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB5b3UgY2FuIGNob29zZSB0aGUgaW50ZXJjZXB0aW9uIHNjb3BlIG9mIHRoaXMgb2JqZWN0LgorICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpOworCisgIC8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgcHJldmlvdXMgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgdmlydHVhbCB+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKworICAvLyBBcHBlbmRzIHRoZSBUZXN0UGFydFJlc3VsdCBvYmplY3QgdG8gdGhlIFRlc3RQYXJ0UmVzdWx0QXJyYXkKKyAgLy8gcmVjZWl2ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBpcyBmcm9tIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlCisgIC8vIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworIHByaXZhdGU6CisgIHZvaWQgSW5pdCgpOworCisgIGNvbnN0IEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGVfOworICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvbGRfcmVwb3J0ZXJfOworICBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGluZyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIGFuZAorLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKS4gIEl0cyBkZXN0cnVjdG9yIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCisvLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQorLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCitjbGFzcyBHVEVTVF9BUElfIFNpbmdsZUZhaWx1cmVDaGVja2VyIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjb25zdHJ1Y3RvciByZW1lbWJlcnMgdGhlIGFyZ3VtZW50cy4KKyAgU2luZ2xlRmFpbHVyZUNoZWNrZXIoY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpOworICB+U2luZ2xlRmFpbHVyZUNoZWNrZXIoKTsKKyBwcml2YXRlOgorICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRzXzsKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZV87CisgIGNvbnN0IHN0cmluZyBzdWJzdHJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2luZ2xlRmFpbHVyZUNoZWNrZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIEEgc2V0IG9mIG1hY3JvcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkCisvLyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBmYXRhbCBmYWlsdXJlcy4gIEl0IHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSBleGFjdGx5IG9uZSBmYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicKKy8vIGJlaW5nIHBhcnQgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4KKy8vCisvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfRkFUQUxfRkFJTFVSRSBvbmx5CisvLyBhZmZlY3RzIGFuZCBjb25zaWRlcnMgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBhbmQKKy8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4KKy8vCisvLyBUaGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBhc3NlcnRpb24gaXMgZG9uZSBjb3JyZWN0bHkgZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQKKy8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorLy8KKy8vIEtub3duIHJlc3RyaWN0aW9uczoKKy8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsIG5vbi1zdGF0aWMgdmFyaWFibGVzIG9yCisvLyAgICAgbm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KKy8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuCisvLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4KKy8vCisvLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bworLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24KKy8vIGhlbHBlciBtYWNybywgZHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgaW4gaG93IHRoZSBwcmVwcm9jZXNzb3IKKy8vIHdvcmtzLiAgVGhlIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4KKy8vIGd0ZXN0X3VuaXR0ZXN0LmNjIHdpbGwgZmFpbCB0byBjb21waWxlIGlmIHdlIGRvIHRoYXQuCisjZGVmaW5lIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHsgXAorICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcCisgICAgIHB1YmxpYzpcCisgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfTtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAorICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKyNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8geyBcCisgICAgY2xhc3MgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXIge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9O1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX0FMTF9USFJFQURTLCAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIEEgbWFjcm8gZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBvciBjb2RlIHRoYXQncyBleHBlY3RlZCB0bworLy8gZ2VuZXJhdGUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzLiAgSXQgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbgorLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgbm9uLWZhdGFsIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2l0aCAnc3Vic3RyJworLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgbWFjcm8uIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFIG9ubHkKKy8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZAorLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLgorLy8KKy8vICdzdGF0ZW1lbnQnIGlzIGFsbG93ZWQgdG8gcmVmZXJlbmNlIGxvY2FsIHZhcmlhYmxlcyBhbmQgbWVtYmVycyBvZgorLy8gdGhlIGN1cnJlbnQgb2JqZWN0LgorLy8KKy8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudAorLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisvLworLy8gS25vd24gcmVzdHJpY3Rpb25zOgorLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uCisvLworLy8gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28KKy8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uCisvLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yCisvLyB3b3Jrcy4gIElmIHdlIGRvIHRoYXQsIHRoZSBjb2RlIHdvbid0IGNvbXBpbGUgd2hlbiB0aGUgdXNlciBnaXZlcworLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBhIHN0YXRlbWVudCB0aGF0IGNvbnRhaW5zIGEgbWFjcm8gdGhhdAorLy8gZXhwYW5kcyB0byBjb2RlIGNvbnRhaW5pbmcgYW4gdW5wcm90ZWN0ZWQgY29tbWEuICBUaGUKKy8vIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4gZ3Rlc3RfdW5pdHRlc3QuY2MKKy8vIGNhdGNoZXMgdGhhdC4KKy8vCisvLyBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBoYXZlIHRvIHdyaXRlCisvLyAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9CisvLyBpbnN0ZWFkIG9mCisvLyAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQorLy8gdG8gYXZvaWQgYW4gTVNWQyB3YXJuaW5nIG9uIHVucmVhY2hhYmxlIGNvZGUuCisjZGVmaW5lIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCBcCisgICAgICAgIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgXAorICAgICAgICAoc3Vic3RyKSk7XAorICAgIHtcCisgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJTlRFUkNFUFRfQUxMX1RIUkVBRFMsIFwKKyAgICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMpO1wKKyAgICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHdjaGFyLmg+CisjaW5jbHVkZSA8d2N0eXBlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWYgR1RFU1RfT1NfTElOVVgKKworLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyBnZXR0aW1lb2ZkYXkoKS4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKworIyBpbmNsdWRlIDxmY250bC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPGxpbWl0cy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHNjaGVkLmg+ICAvLyBOT0xJTlQKKy8vIERlY2xhcmVzIHZzbnByaW50ZigpLiAgVGhpcyBoZWFkZXIgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN0cmluZz4KKworI2VsaWYgR1RFU1RfT1NfU1lNQklBTgorIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisKKyNlbGlmIEdURVNUX09TX1pPUworIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisKKy8vIE9uIHovT1Mgd2UgYWRkaXRpb25hbGx5IG5lZWQgc3RyaW5ncy5oIGZvciBzdHJjYXNlY21wLgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLgorCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cyBwcm9wZXIuCisKKyMgaW5jbHVkZSA8aW8uaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdGltZWIuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPiAgLy8gTk9MSU5UCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NSU5HVworLy8gTWluR1cgaGFzIGdldHRpbWVvZmRheSgpIGJ1dCBub3QgX2Z0aW1lNjQoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gICBnZXR0aW1lb2ZkYXkoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBUaGVyZSBhcmUgb3RoZXIgd2F5cyB0byBnZXQgdGhlIHRpbWUgb24KKy8vICAgV2luZG93cywgbGlrZSBHZXRUaWNrQ291bnQoKSBvciBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpLiAgTWluR1cKKy8vICAgc3VwcG9ydHMgdGhlc2UuICBjb25zaWRlciB1c2luZyB0aGVtIGluc3RlYWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NSU5HVworCisvLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bworLy8gc2lsZW5jZSBpdC4KKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCisKKyNlbHNlCisKKy8vIEFzc3VtZSBvdGhlciBwbGF0Zm9ybXMgaGF2ZSBnZXR0aW1lb2ZkYXkoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gICBnZXR0aW1lb2ZkYXkoKS4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKworLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KKy8vIHNpbGVuY2UgaXQuCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyMgaW5jbHVkZSA8c3RkZXhjZXB0PgorI2VuZGlmCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB1c2VkIGJ5IHRoZSBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcHVyZWx5IEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uICBQbGVhc2UKKy8vIERPIE5PVCAjSU5DTFVERSBJVCBJTiBBIFVTRVIgUFJPR1JBTS4KKworI2lmbmRlZiBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisjZGVmaW5lIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKworLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fIGlzIGRlZmluZWQgdG8gMSBpZmYgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCBpcworLy8gcGFydCBvZiBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uOyBvdGhlcndpc2UgaXQncyB1bmRlZmluZWQuCisjaWYgIUdURVNUX0lNUExFTUVOVEFUSU9OXworLy8gQSB1c2VyIGlzIHRyeWluZyB0byBpbmNsdWRlIHRoaXMgZnJvbSBoaXMgY29kZSAtIGp1c3Qgc2F5IG5vLgorIyBlcnJvciAiZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiIKKyMgZXJyb3IgIkl0IG11c3Qgbm90IGJlIGluY2x1ZGVkIGV4Y2VwdCBieSBHb29nbGUgVGVzdCBpdHNlbGYuIgorI2VuZGlmICAvLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmbmRlZiBfV0lOMzJfV0NFCisjIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3Igc3RydG9sbC9fc3RydG91bDY0L21hbGxvYy9mcmVlLgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIG1lbW1vdmUuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVjbGFyZXMgdGhlIGZsYWdzLgorLy8KKy8vIFdlIGRvbid0IHdhbnQgdGhlIHVzZXJzIHRvIG1vZGlmeSB0aGlzIGZsYWcgaW4gdGhlIGNvZGUsIGJ1dCB3YW50CisvLyBHb29nbGUgVGVzdCdzIG93biB1bml0IHRlc3RzIHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0LiBUaGVyZWZvcmUgd2UKKy8vIGRlY2xhcmUgaXQgaGVyZSBhcyBvcHBvc2VkIHRvIGluIGd0ZXN0LmguCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgdmFsdWUgb2YgR2V0VGVzdFR5cGVJZCgpIGFzIHNlZW4gZnJvbSB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0CisvLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLgorR1RFU1RfQVBJXyBleHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0OworCisvLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuCitjb25zdCBjaGFyIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWdbXSA9ICJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyI7Citjb25zdCBjaGFyIGtCcmVha09uRmFpbHVyZUZsYWdbXSA9ICJicmVha19vbl9mYWlsdXJlIjsKK2NvbnN0IGNoYXIga0NhdGNoRXhjZXB0aW9uc0ZsYWdbXSA9ICJjYXRjaF9leGNlcHRpb25zIjsKK2NvbnN0IGNoYXIga0NvbG9yRmxhZ1tdID0gImNvbG9yIjsKK2NvbnN0IGNoYXIga0ZpbHRlckZsYWdbXSA9ICJmaWx0ZXIiOworY29uc3QgY2hhciBrTGlzdFRlc3RzRmxhZ1tdID0gImxpc3RfdGVzdHMiOworY29uc3QgY2hhciBrT3V0cHV0RmxhZ1tdID0gIm91dHB1dCI7Citjb25zdCBjaGFyIGtQcmludFRpbWVGbGFnW10gPSAicHJpbnRfdGltZSI7Citjb25zdCBjaGFyIGtSYW5kb21TZWVkRmxhZ1tdID0gInJhbmRvbV9zZWVkIjsKK2NvbnN0IGNoYXIga1JlcGVhdEZsYWdbXSA9ICJyZXBlYXQiOworY29uc3QgY2hhciBrU2h1ZmZsZUZsYWdbXSA9ICJzaHVmZmxlIjsKK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VEZXB0aEZsYWdbXSA9ICJzdGFja190cmFjZV9kZXB0aCI7Citjb25zdCBjaGFyIGtTdHJlYW1SZXN1bHRUb0ZsYWdbXSA9ICJzdHJlYW1fcmVzdWx0X3RvIjsKK2NvbnN0IGNoYXIga1Rocm93T25GYWlsdXJlRmxhZ1tdID0gInRocm93X29uX2ZhaWx1cmUiOworCisvLyBBIHZhbGlkIHJhbmRvbSBzZWVkIG11c3QgYmUgaW4gWzEsIGtNYXhSYW5kb21TZWVkXS4KK2NvbnN0IGludCBrTWF4UmFuZG9tU2VlZCA9IDk5OTk5OworCisvLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCisvLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGJvb2wgZ19oZWxwX2ZsYWc7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitHVEVTVF9BUElfIFRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorR1RFU1RfQVBJXyBib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSk7CisKKy8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpOworCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYSBkYXRlIHN0cmluZyBpbiB0aGUgSVNPIDg2MDEKKy8vIGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uICBOLkIuOiBkdWUgdG8gdGhlIHVzZSB0aGUKKy8vIG5vbi1yZWVudHJhbnQgbG9jYWx0aW1lKCkgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLiAgRG8KKy8vIG5vdCB1c2UgaXQgaW4gYW55IGNvZGUgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKTsKKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZiAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorR1RFU1RfQVBJXyBib29sIFBhcnNlSW50MzJGbGFnKAorICAgIGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgSW50MzIqIHZhbHVlKTsKKworLy8gUmV0dXJucyBhIHJhbmRvbSBzZWVkIGluIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gYmFzZWQgb24gdGhlCisvLyBnaXZlbiAtLWd0ZXN0X3JhbmRvbV9zZWVkIGZsYWcgdmFsdWUuCitpbmxpbmUgaW50IEdldFJhbmRvbVNlZWRGcm9tRmxhZyhJbnQzMiByYW5kb21fc2VlZF9mbGFnKSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCByYXdfc2VlZCA9IChyYW5kb21fc2VlZF9mbGFnID09IDApID8KKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oR2V0VGltZUluTWlsbGlzKCkpIDoKKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmFuZG9tX3NlZWRfZmxhZyk7CisKKyAgLy8gTm9ybWFsaXplcyB0aGUgYWN0dWFsIHNlZWQgdG8gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBzdWNoIHRoYXQKKyAgLy8gaXQncyBlYXN5IHRvIHR5cGUuCisgIGNvbnN0IGludCBub3JtYWxpemVkX3NlZWQgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50PigocmF3X3NlZWQgLSAxVSkgJQorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtNYXhSYW5kb21TZWVkKSkgKyAxOworICByZXR1cm4gbm9ybWFsaXplZF9zZWVkOworfQorCisvLyBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCByYW5kb20gc2VlZCBhZnRlciAnc2VlZCcuICBUaGUgYmVoYXZpb3IgaXMKKy8vIHVuZGVmaW5lZCBpZiAnc2VlZCcgaXMgaW52YWxpZC4gIFRoZSBzZWVkIGFmdGVyIGtNYXhSYW5kb21TZWVkIGlzCisvLyBjb25zaWRlcmVkIHRvIGJlIDEuCitpbmxpbmUgaW50IEdldE5leHRSYW5kb21TZWVkKGludCBzZWVkKSB7CisgIEdURVNUX0NIRUNLXygxIDw9IHNlZWQgJiYgc2VlZCA8PSBrTWF4UmFuZG9tU2VlZCkKKyAgICAgIDw8ICJJbnZhbGlkIHJhbmRvbSBzZWVkICIgPDwgc2VlZCA8PCAiIC0gbXVzdCBiZSBpbiBbMSwgIgorICAgICAgPDwga01heFJhbmRvbVNlZWQgPDwgIl0uIjsKKyAgY29uc3QgaW50IG5leHRfc2VlZCA9IHNlZWQgKyAxOworICByZXR1cm4gKG5leHRfc2VlZCA+IGtNYXhSYW5kb21TZWVkKSA/IDEgOiBuZXh0X3NlZWQ7Cit9CisKKy8vIFRoaXMgY2xhc3Mgc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gaXRzIGMndG9yLCBhbmQKKy8vIHJlc3RvcmVzIHRoZW0gaW4gaXRzIGQndG9yLgorY2xhc3MgR1Rlc3RGbGFnU2F2ZXIgeworIHB1YmxpYzoKKyAgLy8gVGhlIGMndG9yLgorICBHVGVzdEZsYWdTYXZlcigpIHsKKyAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c18gPSBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKKyAgICBicmVha19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7CisgICAgY2F0Y2hfZXhjZXB0aW9uc18gPSBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOworICAgIGNvbG9yXyA9IEdURVNUX0ZMQUcoY29sb3IpOworICAgIGRlYXRoX3Rlc3Rfc3R5bGVfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKKyAgICBkZWF0aF90ZXN0X3VzZV9mb3JrXyA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisgICAgZmlsdGVyXyA9IEdURVNUX0ZMQUcoZmlsdGVyKTsKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF8gPSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKKyAgICBsaXN0X3Rlc3RzXyA9IEdURVNUX0ZMQUcobGlzdF90ZXN0cyk7CisgICAgb3V0cHV0XyA9IEdURVNUX0ZMQUcob3V0cHV0KTsKKyAgICBwcmludF90aW1lXyA9IEdURVNUX0ZMQUcocHJpbnRfdGltZSk7CisgICAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhyYW5kb21fc2VlZCk7CisgICAgcmVwZWF0XyA9IEdURVNUX0ZMQUcocmVwZWF0KTsKKyAgICBzaHVmZmxlXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSk7CisgICAgc3RhY2tfdHJhY2VfZGVwdGhfID0gR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7CisgICAgc3RyZWFtX3Jlc3VsdF90b18gPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOworICAgIHRocm93X29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgfQorCisgIC8vIFRoZSBkJ3RvciBpcyBub3QgdmlydHVhbC4gIERPIE5PVCBJTkhFUklUIEZST00gVEhJUyBDTEFTUy4KKyAgfkdUZXN0RmxhZ1NhdmVyKCkgeworICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOworICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBicmVha19vbl9mYWlsdXJlXzsKKyAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gY2F0Y2hfZXhjZXB0aW9uc187CisgICAgR1RFU1RfRkxBRyhjb2xvcikgPSBjb2xvcl87CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9IGRlYXRoX3Rlc3Rfc3R5bGVfOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKKyAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSBmaWx0ZXJfOworICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID0gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBsaXN0X3Rlc3RzXzsKKyAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSBvdXRwdXRfOworICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBwcmludF90aW1lXzsKKyAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IHJhbmRvbV9zZWVkXzsKKyAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXRfOworICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBzaHVmZmxlXzsKKyAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IHN0YWNrX3RyYWNlX2RlcHRoXzsKKyAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gc3RyZWFtX3Jlc3VsdF90b187CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRocm93X29uX2ZhaWx1cmVfOworICB9CisKKyBwcml2YXRlOgorICAvLyBGaWVsZHMgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzIG9mIGZsYWdzLgorICBib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKKyAgYm9vbCBicmVha19vbl9mYWlsdXJlXzsKKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKKyAgc3RkOjpzdHJpbmcgY29sb3JfOworICBzdGQ6OnN0cmluZyBkZWF0aF90ZXN0X3N0eWxlXzsKKyAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKKyAgc3RkOjpzdHJpbmcgZmlsdGVyXzsKKyAgc3RkOjpzdHJpbmcgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOworICBib29sIGxpc3RfdGVzdHNfOworICBzdGQ6OnN0cmluZyBvdXRwdXRfOworICBib29sIHByaW50X3RpbWVfOworICBib29sIHByZXR0eV87CisgIGludGVybmFsOjpJbnQzMiByYW5kb21fc2VlZF87CisgIGludGVybmFsOjpJbnQzMiByZXBlYXRfOworICBib29sIHNodWZmbGVfOworICBpbnRlcm5hbDo6SW50MzIgc3RhY2tfdHJhY2VfZGVwdGhfOworICBzdGQ6OnN0cmluZyBzdHJlYW1fcmVzdWx0X3RvXzsKKyAgYm9vbCB0aHJvd19vbl9mYWlsdXJlXzsKK30gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87CisKKy8vIENvbnZlcnRzIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIGNvZGVfcG9pbnQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgVUludDMyIGJlY2F1c2Ugd2NoYXJfdCBtYXkgbm90IGJlCisvLyB3aWRlIGVub3VnaCB0byBjb250YWluIGEgY29kZSBwb2ludC4KKy8vIFRoZSBvdXRwdXQgYnVmZmVyIHN0ciBtdXN0IGNvbnRhaW50IGF0IGxlYXN0IDMyIGNoYXJhY3RlcnMuCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKy8vIElmIHRoZSBjb2RlX3BvaW50IGlzIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludAorLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgaXQgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4KK0dURVNUX0FQSV8gY2hhciogQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50LCBjaGFyKiBzdHIpOworCisvLyBDb252ZXJ0cyBhIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIFRoZSB3aWRlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKKy8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpCisvLyAgIFVURi0zMiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gNCAob24gTGludXgpCisvLyBQYXJhbWV0ZXIgc3RyIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4KKy8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyCisvLyBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLiAtMSBpcyB1c2VkIHdoZW4gdGhlIGVudGlyZSBzdHJpbmcKKy8vIHNob3VsZCBiZSBwcm9jZXNzZWQuCisvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzCisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSB0aGV5IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuIElmIHRoZSBzdHJpbmcgaXMgaW4gVVRGMTYgZW5jb2RpbmcKKy8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycworLy8gd2lsbCBiZSBlbmNvZGVkIGFzIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gQmFzaWMgTm9ybWFsIFBsYW5lLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycyk7CisKKy8vIFJlYWRzIHRoZSBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kIGNyZWF0ZXMgdGhlIGZpbGUKKy8vIGlmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LiBJZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbiwgdGhpcworLy8gZnVuY3Rpb24gd2lsbCB3cml0ZSBvdmVyIGl0LiBJZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudCwgYnV0IHRoZSBmaWxlIGNhbm5vdAorLy8gYmUgY3JlYXRlZCwgcHJpbnRzIGFuIGVycm9yIGFuZCBleGl0cy4KK3ZvaWQgV3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoZS5nLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRTaGFyZChjb25zdCBjaGFyKiB0b3RhbF9zaGFyZHNfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOworCisvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHZhciBhcyBhbiBJbnQzMi4gSWYgaXQgaXMgdW5zZXQsCisvLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvciBhbmQKKy8vIGFuZCBhYm9ydHMuCitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUVudk9yRGllKGNvbnN0IGNoYXIqIGVudl92YXIsIEludDMyIGRlZmF1bHRfdmFsKTsKKworLy8gR2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMsIHRoZSBzaGFyZCBpbmRleCwgYW5kIHRoZSB0ZXN0IGlkLAorLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBzaG91bGQgYmUgcnVuIG9uIHRoaXMgc2hhcmQuIFRoZSB0ZXN0IGlkIGlzCisvLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdAorLy8gbWV0aG9kLiBBc3N1bWVzIHRoYXQgMCA8PSBzaGFyZF9pbmRleCA8IHRvdGFsX3NoYXJkcy4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZCgKKyAgICBpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKTsKKworLy8gU1RMIGNvbnRhaW5lciB1dGlsaXRpZXMuCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyIHRoYXQgc2F0aXNmeQorLy8gdGhlIGdpdmVuIHByZWRpY2F0ZS4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIFByZWRpY2F0ZT4KK2lubGluZSBpbnQgQ291bnRJZihjb25zdCBDb250YWluZXImIGMsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKKyAgLy8gSW1wbGVtZW50ZWQgYXMgYW4gZXhwbGljaXQgbG9vcCBzaW5jZSBzdGQ6OmNvdW50X2lmKCkgaW4gbGliQ3N0ZCBvbgorICAvLyBTb2xhcmlzIGhhcyBhIG5vbi1zdGFuZGFyZCBzaWduYXR1cmUuCisgIGludCBjb3VudCA9IDA7CisgIGZvciAodHlwZW5hbWUgQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IGMuYmVnaW4oKTsgaXQgIT0gYy5lbmQoKTsgKytpdCkgeworICAgIGlmIChwcmVkaWNhdGUoKml0KSkKKyAgICAgICsrY291bnQ7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCisvLyBBcHBsaWVzIGEgZnVuY3Rpb24vZnVuY3RvciB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIEZ1bmN0b3I+Cit2b2lkIEZvckVhY2goY29uc3QgQ29udGFpbmVyJiBjLCBGdW5jdG9yIGZ1bmN0b3IpIHsKKyAgc3RkOjpmb3JfZWFjaChjLmJlZ2luKCksIGMuZW5kKCksIGZ1bmN0b3IpOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIGVsZW1lbnQgb2YgdGhlIHZlY3Rvciwgb3IgZGVmYXVsdF92YWx1ZSBpZiBpIGlzIG5vdAorLy8gaW4gcmFuZ2UgWzAsIHYuc2l6ZSgpKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPgoraW5saW5lIEUgR2V0RWxlbWVudE9yKGNvbnN0IHN0ZDo6dmVjdG9yPEU+JiB2LCBpbnQgaSwgRSBkZWZhdWx0X3ZhbHVlKSB7CisgIHJldHVybiAoaSA8IDAgfHwgaSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHYuc2l6ZSgpKSkgPyBkZWZhdWx0X3ZhbHVlIDogdltpXTsKK30KKworLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiBhIHJhbmdlIG9mIHRoZSB2ZWN0b3IncyBlbGVtZW50cy4KKy8vICdiZWdpbicgYW5kICdlbmQnIGFyZSBlbGVtZW50IGluZGljZXMgYXMgYW4gU1RMLXN0eWxlIHJhbmdlOworLy8gaS5lLiBbYmVnaW4sIGVuZCkgYXJlIHNodWZmbGVkLCB3aGVyZSAnZW5kJyA9PSBzaXplKCkgbWVhbnMgdG8KKy8vIHNodWZmbGUgdG8gdGhlIGVuZCBvZiB0aGUgdmVjdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+Cit2b2lkIFNodWZmbGVSYW5nZShpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20sIGludCBiZWdpbiwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEU+KiB2KSB7CisgIGNvbnN0IGludCBzaXplID0gc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpOworICBHVEVTVF9DSEVDS18oMCA8PSBiZWdpbiAmJiBiZWdpbiA8PSBzaXplKQorICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBzdGFydCAiIDw8IGJlZ2luIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWzAsICIKKyAgICAgIDw8IHNpemUgPDwgIl0uIjsKKyAgR1RFU1RfQ0hFQ0tfKGJlZ2luIDw9IGVuZCAmJiBlbmQgPD0gc2l6ZSkKKyAgICAgIDw8ICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoICIgPDwgZW5kIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWyIKKyAgICAgIDw8IGJlZ2luIDw8ICIsICIgPDwgc2l6ZSA8PCAiXS4iOworCisgIC8vIEZpc2hlci1ZYXRlcyBzaHVmZmxlLCBmcm9tCisgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUKKyAgZm9yIChpbnQgcmFuZ2Vfd2lkdGggPSBlbmQgLSBiZWdpbjsgcmFuZ2Vfd2lkdGggPj0gMjsgcmFuZ2Vfd2lkdGgtLSkgeworICAgIGNvbnN0IGludCBsYXN0X2luX3JhbmdlID0gYmVnaW4gKyByYW5nZV93aWR0aCAtIDE7CisgICAgY29uc3QgaW50IHNlbGVjdGVkID0gYmVnaW4gKyByYW5kb20tPkdlbmVyYXRlKHJhbmdlX3dpZHRoKTsKKyAgICBzdGQ6OnN3YXAoKCp2KVtzZWxlY3RlZF0sICgqdilbbGFzdF9pbl9yYW5nZV0pOworICB9Cit9CisKKy8vIFBlcmZvcm1zIGFuIGluLXBsYWNlIHNodWZmbGUgb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+CitpbmxpbmUgdm9pZCBTaHVmZmxlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSwgMCwgc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpLCB2KTsKK30KKworLy8gQSBmdW5jdGlvbiBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LiAgSGFuZHkgZm9yIGJlaW5nIHVzZWQgYXMgYQorLy8gZnVuY3Rvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgRGVsZXRlKFQqIHgpIHsKKyAgZGVsZXRlIHg7Cit9CisKKy8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBrZXkgb2YgYSBUZXN0UHJvcGVydHkgYWdhaW5zdCBhIGtub3duIGtleS4KKy8vCisvLyBUZXN0UHJvcGVydHlLZXlJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3RQcm9wZXJ0eUtleUlzIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICAvLworICAvLyBUZXN0UHJvcGVydHlLZXlJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdFByb3BlcnR5S2V5SXMoY29uc3QgY2hhcioga2V5KQorICAgICAgOiBrZXlfKGtleSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdCBwcm9wZXJ0eSBtYXRjaGVzIG9uIGtleV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9wcm9wZXJ0eS5rZXkoKSA9PSBrZXlfOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBrZXlfOworfTsKKworLy8gQ2xhc3MgVW5pdFRlc3RPcHRpb25zLgorLy8KKy8vIFRoaXMgY2xhc3MgY29udGFpbnMgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIG9wdGlvbnMgdGhlIHVzZXIKKy8vIHNwZWNpZmllcyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLiAgSXQgaGFzIG9ubHkgc3RhdGljIG1lbWJlcnMuCisvLworLy8gSW4gbW9zdCBjYXNlcywgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYW4gb3B0aW9uIHVzaW5nIGVpdGhlciBhbgorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYSBjb21tYW5kIGxpbmUgZmxhZy4gIEUuZy4geW91IGNhbiBzZXQgdGhlCisvLyB0ZXN0IGZpbHRlciB1c2luZyBlaXRoZXIgR1RFU1RfRklMVEVSIG9yIC0tZ3Rlc3RfZmlsdGVyLiAgSWYgYm90aAorLy8gdGhlIHZhcmlhYmxlIGFuZCB0aGUgZmxhZyBhcmUgcHJlc2VudCwgdGhlIGxhdHRlciBvdmVycmlkZXMgdGhlCisvLyBmb3JtZXIuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0T3B0aW9ucyB7CisgcHVibGljOgorICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLgorCisgIC8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRPdXRwdXRGb3JtYXQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZQorICAvLyBkZWZhdWx0ICh0ZXN0X2RldGFpbC54bWwgaW4gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5KSBpZgorICAvLyBub25lIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworCisgIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3RfZmlsdGVyIGZsYWcuCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKyAgLy8gZmlyc3QgJzonIG9yICdcMCcgY2hhcmFjdGVyIGluIHBhdHRlcm4gbWFya3MgdGhlIGVuZCBvZiBpdC4KKyAgLy8KKyAgLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisgIC8vIHdvcmtzIHdlbGwgZW5vdWdoIGZvciBtYXRjaGluZyB0ZXN0IG5hbWVzLCB3aGljaCBhcmUgc2hvcnQuCisgIHN0YXRpYyBib29sIFBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnN0cik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQorICAvLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorICBzdGF0aWMgYm9vbCBGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X25hbWUpOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBGdW5jdGlvbiBmb3Igc3VwcG9ydGluZyB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uIGZsYWcuCisKKyAgLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlCisgIC8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgorICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCisgIHN0YXRpYyBpbnQgR1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiAibmFtZSIgbWF0Y2hlcyB0aGUgJzonIHNlcGFyYXRlZCBsaXN0IG9mIGdsb2Itc3R5bGUKKyAgLy8gZmlsdGVycyBpbiAiZmlsdGVyIi4KKyAgc3RhdGljIGJvb2wgTWF0Y2hlc0ZpbHRlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogZmlsdGVyKTsKK307CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24ncyBuYW1lLCByZW1vdmluZyBkaXJlY3RvcnkgcGF0aCBpZiB0aGF0CisvLyBpcyBwcmVzZW50LiAgVXNlZCBieSBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZpbGUuCitHVEVTVF9BUElfIEZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpOworCisvLyBUaGUgcm9sZSBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIE9TIHN0YWNrIHRyYWNlIGFzIGEgc3RyaW5nLgorY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisgIHZpcnR1YWwgfk9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4gIFBhcmFtZXRlcnM6CisgIC8vCisgIC8vICAgbWF4X2RlcHRoICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQKKyAgLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLgorICAvLyAgIHNraXBfY291bnQgLSB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZDsgZG9lc24ndCBjb3VudAorICAvLyAgICAgICAgICAgICAgICBhZ2FpbnN0IG1heF9kZXB0aC4KKyAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpID0gMDsKKworICAvLyBVcG9uTGVhdmluZ0dUZXN0KCkgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgR29vZ2xlIFRlc3QgY2FsbHMKKyAgLy8gdXNlciBjb2RlLiBJdCBzYXZlcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YWNrIHRoYXQKKyAgLy8gQ3VycmVudFN0YWNrVHJhY2UoKSB3aWxsIHVzZSB0byBmaW5kIGFuZCBoaWRlIEdvb2dsZSBUZXN0IHN0YWNrIGZyYW1lcy4KKyAgdmlydHVhbCB2b2lkIFVwb25MZWF2aW5nR1Rlc3QoKSA9IDA7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSk7Cit9OworCisvLyBBIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSBpbnRlcmZhY2UuCitjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIgOiBwdWJsaWMgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlcigpIDogY2FsbGVyX2ZyYW1lXyhOVUxMKSB7fQorCisgIHZpcnR1YWwgc3RyaW5nIEN1cnJlbnRTdGFja1RyYWNlKGludCBtYXhfZGVwdGgsIGludCBza2lwX2NvdW50KQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gVGhpcyBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2Ygc3RhY2sgZnJhbWVzIHRoYXQgYXJlIHBhcnQgb2YKKyAgLy8gR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbi4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFbGlkZWRGcmFtZXNNYXJrZXI7CisKKyBwcml2YXRlOgorICBNdXRleCBtdXRleF87ICAvLyBwcm90ZWN0cyBhbGwgaW50ZXJuYWwgc3RhdGUKKworICAvLyBXZSBzYXZlIHRoZSBzdGFjayBmcmFtZSBiZWxvdyB0aGUgZnJhbWUgdGhhdCBjYWxscyB1c2VyIGNvZGUuCisgIC8vIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUgaW1tZWRpYXRlbHkgYmVsb3cKKyAgLy8gdGhlIHVzZXIgY29kZSBjaGFuZ2VzIGJldHdlZW4gdGhlIGNhbGwgdG8gVXBvbkxlYXZpbmdHVGVzdCgpCisgIC8vIGFuZCBhbnkgY2FsbHMgdG8gQ3VycmVudFN0YWNrVHJhY2UoKSBmcm9tIHdpdGhpbiB0aGUgdXNlciBjb2RlLgorICB2b2lkKiBjYWxsZXJfZnJhbWVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVyKTsKK307CisKKy8vIEluZm9ybWF0aW9uIGFib3V0IGEgR29vZ2xlIFRlc3QgdHJhY2UgcG9pbnQuCitzdHJ1Y3QgVHJhY2VJbmZvIHsKKyAgY29uc3QgY2hhciogZmlsZTsKKyAgaW50IGxpbmU7CisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7Cit9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4gVW5pdFRlc3RJbXBsLgorLy8gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KK2NsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpOworICAvLyBJbXBsZW1lbnRzIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlLiBSZXBvcnRzIHRoZSB0ZXN0IHBhcnQKKyAgLy8gcmVzdWx0IGluIHRoZSBjdXJyZW50IHRlc3QuCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKworIHByaXZhdGU6CisgIFVuaXRUZXN0SW1wbCogY29uc3QgdW5pdF90ZXN0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKK307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGVyIHRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4KKy8vIFVuaXRUZXN0SW1wbC4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KK2NsYXNzIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7CisgIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBqdXN0CisgIC8vIGRlbGVnYXRlcyB0byB0aGUgY3VycmVudCBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBvZiAqdW5pdF90ZXN0Xy4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworLy8gVGhlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzLiAgV2UgZG9uJ3QgcHJvdGVjdAorLy8gdGhlIG1ldGhvZHMgdW5kZXIgYSBtdXRleCwgYXMgdGhpcyBjbGFzcyBpcyBub3QgYWNjZXNzaWJsZSBieSBhCisvLyB1c2VyIGFuZCB0aGUgVW5pdFRlc3QgY2xhc3MgdGhhdCBkZWxlZ2F0ZXMgd29yayB0byB0aGlzIGNsYXNzIGRvZXMKKy8vIHByb3BlciBsb2NraW5nLgorY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdEltcGwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5pdFRlc3RJbXBsKFVuaXRUZXN0KiBwYXJlbnQpOworICB2aXJ0dWFsIH5Vbml0VGVzdEltcGwoKTsKKworICAvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIHJlZ2lzdGVyIHlvdXIgb3duIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIuCisgIC8vIFlvdSBjYW4gcmVnaXN0ZXIgeW91ciBvd24gcmVwb3RlciB0byBsaXN0ZW4gZWl0aGVyIG9ubHkgZm9yIHRlc3QgcmVzdWx0cworICAvLyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZCBvciBmb3IgcmVzdWx0cyBmcm9tIGFsbCB0aHJlYWRzLgorICAvLyBCeSBkZWZhdWx0LCBlYWNoIHBlci10aHJlYWQgdGVzdCByZXN1bHQgcmVwb3RlciBqdXN0IHBhc3NlcyBhIG5ldworICAvLyBUZXN0UGFydFJlc3VsdCB0byB0aGUgZ2xvYmFsIHRlc3QgcmVzdWx0IHJlcG9ydGVyLCB3aGljaCByZWdpc3RlcnMgdGhlCisgIC8vIHRlc3QgcGFydCByZXN1bHQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LgorCisgIC8vIFJldHVybnMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7CisKKyAgLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIHZvaWQgU2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKTsKKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7CisKKyAgLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICB2b2lkIFNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KKyAgaW50IGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCisgIGludCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisgIC8vIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgorICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgIC8vIFVOSVggZXBvY2guCisgIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBzdGFydF90aW1lc3RhbXBfOyB9CisKKyAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisgIC8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgorICBib29sIEZhaWxlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpID4gMCB8fCBhZF9ob2NfdGVzdF9yZXN1bHQoKS0+RmFpbGVkKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7CisgICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baV07CisgIH0KKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgeworICAgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2Nhc2VfaW5kaWNlc18sIGksIC0xKTsKKyAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2luZGV4XTsKKyAgfQorCisgIC8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXIgbGlzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMoKSB7IHJldHVybiAmbGlzdGVuZXJzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKKyAgLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIFRlc3RSZXN1bHQqIGN1cnJlbnRfdGVzdF9yZXN1bHQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QuCisgIGNvbnN0IFRlc3RSZXN1bHQqIGFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICZhZF9ob2NfdGVzdF9yZXN1bHRfOyB9CisKKyAgLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgorICAvLworICAvLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGlucHV0IGFuZCB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIKKyAgLy8gYXJlIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZQorICAvLyBpbnB1dCB0aGUgY3VycmVudCBnZXR0ZXIuCisgIHZvaWQgc2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcihPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcik7CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgaWYgaXQgaXMgbm90IE5VTEw7CisgIC8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50CisgIC8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KKyAgLy8KKyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKyAgLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKyAgLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisgIC8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisgIC8vCisgIC8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworICAvLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorICAvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KKyAgc3RkOjpzdHJpbmcgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChpbnQgc2tpcF9jb3VudCkgR1RFU1RfTk9fSU5MSU5FXzsKKworICAvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAorICAvLyBleGlzdCwgY3JlYXRlcyBvbmUgYW5kIHJldHVybnMgaXQuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICB0ZXN0X2Nhc2VfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgIC8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKyAgLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICAvLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZSogR2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKKworICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhlIHVuaXQgdGVzdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVzdF9pbmZvOiAgICB0aGUgVGVzdEluZm8gb2JqZWN0CisgIHZvaWQgQWRkVGVzdEluZm8oVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0cywgd2UgbmVlZCB0bworICAgIC8vIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSB0ZXN0IHByb2dyYW0KKyAgICAvLyB3YXMgZmlyc3QgaW52b2tlZC4gIFdlIGNhbm5vdCBkbyB0aGlzIGluIFJVTl9BTExfVEVTVFMoKSwgYXMKKyAgICAvLyB0aGUgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgY2FsbGluZworICAgIC8vIFJVTl9BTExfVEVTVFMoKS4gIFRoZXJlZm9yZSB3ZSBjYXB0dXJlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbgorICAgIC8vIEFkZFRlc3RJbmZvKCksIHdoaWNoIGlzIGNhbGxlZCB0byByZWdpc3RlciBhIFRFU1Qgb3IgVEVTVF9GCisgICAgLy8gYmVmb3JlIG1haW4oKSBpcyByZWFjaGVkLgorICAgIGlmIChvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKSB7CisgICAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8uU2V0KEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkpOworICAgICAgR1RFU1RfQ0hFQ0tfKCFvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKQorICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiI7CisgICAgfQorCisgICAgR2V0VGVzdENhc2UodGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpLAorICAgICAgICAgICAgICAgIHRlc3RfaW5mby0+dHlwZV9wYXJhbSgpLAorICAgICAgICAgICAgICAgIHNldF91cF90YywKKyAgICAgICAgICAgICAgICB0ZWFyX2Rvd25fdGMpLT5BZGRUZXN0SW5mbyh0ZXN0X2luZm8pOworICB9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkgeworICAgIHJldHVybiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgLy8gU2V0cyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9jYXNlKFRlc3RDYXNlKiBhX2N1cnJlbnRfdGVzdF9jYXNlKSB7CisgICAgY3VycmVudF90ZXN0X2Nhc2VfID0gYV9jdXJyZW50X3Rlc3RfY2FzZTsKKyAgfQorCisgIC8vIFNldHMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLiAgSWYKKyAgLy8gY3VycmVudF90ZXN0X2luZm8gaXMgTlVMTCwgdGhlIGFzc2VydGlvbiByZXN1bHRzIHdpbGwgYmUgc3RvcmVkIGluCisgIC8vIGFkX2hvY190ZXN0X3Jlc3VsdF8uCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9pbmZvKFRlc3RJbmZvKiBhX2N1cnJlbnRfdGVzdF9pbmZvKSB7CisgICAgY3VycmVudF90ZXN0X2luZm9fID0gYV9jdXJyZW50X3Rlc3RfaW5mbzsKKyAgfQorCisgIC8vIFJlZ2lzdGVycyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyBkZWZpbmVkIHVzaW5nIFRFU1RfUCBhbmQKKyAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AsIGNyZWF0aW5nIHJlZ3VsYXIgdGVzdHMgZm9yIGVhY2ggdGVzdC9wYXJhbWV0ZXIKKyAgLy8gY29tYmluYXRpb24uIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2U7IGl0IGhhcyBndWFyZHMKKyAgLy8gcHJvdGVjdGluZyBmcm9tIHJlZ2lzdGVyaW5nIHRoZSB0ZXN0cyBtb3JlIHRoZW4gb25jZS4gIElmCisgIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGRpc2FibGVkLCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cyBpcworICAvLyBwcmVzZW50IGJ1dCBkb2VzIG5vdGhpbmcuCisgIHZvaWQgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKKworICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAorICAvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcworICAvLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhpcyB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQKKyAgLy8gdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLgorICBib29sIFJ1bkFsbFRlc3RzKCk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cywgZXhjZXB0IHRoZSBhZCBob2MgdGVzdHMuCisgIHZvaWQgQ2xlYXJOb25BZEhvY1Rlc3RSZXN1bHQoKSB7CisgICAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgVGVzdENhc2U6OkNsZWFyVGVzdENhc2VSZXN1bHQpOworICB9CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFkLWhvYyB0ZXN0IGFzc2VydGlvbnMuCisgIHZvaWQgQ2xlYXJBZEhvY1Rlc3RSZXN1bHQoKSB7CisgICAgYWRfaG9jX3Rlc3RfcmVzdWx0Xy5DbGVhcigpOworICB9CisKKyAgZW51bSBSZWFjdGlvblRvU2hhcmRpbmcgeworICAgIEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLAorICAgIElHTk9SRV9TSEFSRElOR19QUk9UT0NPTAorICB9OworCisgIC8vIE1hdGNoZXMgdGhlIGZ1bGwgbmFtZSBvZiBlYWNoIHRlc3QgYWdhaW5zdCB0aGUgdXNlci1zcGVjaWZpZWQKKyAgLy8gZmlsdGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBydW4sIHRoZW4gcmVjb3JkcyB0aGUKKyAgLy8gcmVzdWx0IGluIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KKyAgLy8gSWYgc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cworICAvLyBiYXNlZCBvbiBzaGFyZGluZyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50LgorICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgRmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKTsKKworICAvLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCisgIHZvaWQgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKKworICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfY2FzZV87IH0KKyAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9CisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KKyAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgorICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+JiBlbnZpcm9ubWVudHMoKSB7IHJldHVybiBlbnZpcm9ubWVudHNfOyB9CisKKyAgLy8gR2V0dGVycyBmb3IgdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgeworICAgIHJldHVybiAqKGd0ZXN0X3RyYWNlX3N0YWNrXy5wb2ludGVyKCkpOworICB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgY29uc3QgeworICAgIHJldHVybiBndGVzdF90cmFjZV9zdGFja18uZ2V0KCk7CisgIH0KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIHZvaWQgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpIHsKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5yZXNldChQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpKTsKKyAgfQorICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QKKyAgLy8gZmxhZywgb3IgTlVMTCBpZiB0aGF0IGZsYWcgd2FzIG5vdCBzcGVjaWZpZWQuCisgIC8vIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisgIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIHRvIEluaXRHb29nbGVUZXN0LgorICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpOworICB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVhdGggdGVzdCBmYWN0b3J5LgorICBpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeSogZGVhdGhfdGVzdF9mYWN0b3J5KCkgeworICAgIHJldHVybiBkZWF0aF90ZXN0X2ZhY3RvcnlfLmdldCgpOworICB9CisKKyAgdm9pZCBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOworCisgIGZyaWVuZCBjbGFzcyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQorICAvLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCisgIHZvaWQgQ29uZmlndXJlWG1sT3V0cHV0KCk7CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byBhIHNvY2tldC4KKyAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KKyAgdm9pZCBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKKyNlbmRpZgorCisgIC8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCisgIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvCisgIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAgLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4KKyAgdm9pZCBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7CisKKyAgLy8gR2V0cyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBpdGVyYXRpb24uCisgIGludCByYW5kb21fc2VlZCgpIGNvbnN0IHsgcmV0dXJuIHJhbmRvbV9zZWVkXzsgfQorCisgIC8vIEdldHMgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICBpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20oKSB7IHJldHVybiAmcmFuZG9tXzsgfQorCisgIC8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKKyAgLy8gbWFraW5nIHN1cmUgdGhhdCBkZWF0aCB0ZXN0cyBhcmUgc3RpbGwgcnVuIGZpcnN0LgorICB2b2lkIFNodWZmbGVUZXN0cygpOworCisgIC8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCisgIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKKworICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQKKyAgLy8gVW5pdFRlc3Q6OlJ1bigpIHN0YXJ0cy4KKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4gY2F0Y2hfZXhjZXB0aW9uc187IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OlVuaXRUZXN0OworCisgIC8vIFVzZWQgYnkgVW5pdFRlc3Q6OlJ1bigpIHRvIGNhcHR1cmUgdGhlIHN0YXRlIG9mCisgIC8vIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBpdCBzdGFydHMuCisgIHZvaWQgc2V0X2NhdGNoX2V4Y2VwdGlvbnMoYm9vbCB2YWx1ZSkgeyBjYXRjaF9leGNlcHRpb25zXyA9IHZhbHVlOyB9CisKKyAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0aGF0IG93bnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCisgIFVuaXRUZXN0KiBjb25zdCBwYXJlbnRfOworCisgIC8vIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCisgIC8vIGV4ZWN1dGVkLgorICBpbnRlcm5hbDo6RmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOworCisgIC8vIFRoZSBkZWZhdWx0IHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXJzLgorICBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKyAgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKworICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKKworICAvLyBQcm90ZWN0cyByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLgorICBpbnRlcm5hbDo6TXV0ZXggZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfOworCisgIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgcGVyLXRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBpbnRlcm5hbDo6VGhyZWFkTG9jYWw8VGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSo+CisgICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCisgIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KKyAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiBlbnZpcm9ubWVudHNfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdENhc2VzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUKKyAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiB0ZXN0X2Nhc2VzXzsKKworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBjYXNlIGxpc3QgdG8gYWxsb3cKKyAgLy8gZWFzeSBzaHVmZmxpbmcgYW5kIHJlc3RvcmluZyB0aGUgdGVzdCBjYXNlIG9yZGVyLiAgVGhlIGktdGgKKyAgLy8gZWxlbWVudCBvZiB0aGlzIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBjYXNlIGluIHRoZQorICAvLyBzaHVmZmxlZCBvcmRlci4KKyAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2Nhc2VfaW5kaWNlc187CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBQYXJhbWV0ZXJpemVkVGVzdFJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIHJlZ2lzdGVyIHZhbHVlLXBhcmFtZXRlcml6ZWQKKyAgLy8gdGVzdHMuCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworCisgIC8vIEluZGljYXRlcyB3aGV0aGVyIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkIGFscmVhZHkuCisgIGJvb2wgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBJbmRleCBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UgcmVnaXN0ZXJlZC4gIEluaXRpYWxseSAtMS4KKyAgaW50IGxhc3RfZGVhdGhfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdENhc2UgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgY2FzZSBhZnRlciBhbm90aGVyLgorICAvLyBXaGVuIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3QKKyAgLy8gc3RvcmVzIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KKyAgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdEluZm8gZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgYWZ0ZXIgYW5vdGhlci4gIFdoZW4KKyAgLy8gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdCBzdG9yZXMKKyAgLy8gYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgorICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm9fOworCisgIC8vIE5vcm1hbGx5LCBhIHVzZXIgb25seSB3cml0ZXMgYXNzZXJ0aW9ucyBpbnNpZGUgYSBURVNUIG9yIFRFU1RfRiwKKyAgLy8gb3IgaW5zaWRlIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IGEgVEVTVCBvciBURVNUX0YuICBTaW5jZSBHb29nbGUKKyAgLy8gVGVzdCBrZWVwcyB0cmFjayBvZiB3aGljaCB0ZXN0IGlzIGN1cnJlbnQgcnVubmluZywgaXQgY2FuCisgIC8vIGFzc29jaWF0ZSBzdWNoIGFuIGFzc2VydGlvbiB3aXRoIHRoZSB0ZXN0IGl0IGJlbG9uZ3MgdG8uCisgIC8vCisgIC8vIElmIGFuIGFzc2VydGlvbiBpcyBlbmNvdW50ZXJlZCB3aGVuIG5vIFRFU1Qgb3IgVEVTVF9GIGlzIHJ1bm5pbmcsCisgIC8vIEdvb2dsZSBUZXN0IGF0dHJpYnV0ZXMgdGhlIGFzc2VydGlvbiByZXN1bHQgdG8gYW4gaW1hZ2luYXJ5ICJhZCBob2MiCisgIC8vIHRlc3QsIGFuZCByZWNvcmRzIHRoZSByZXN1bHQgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KKyAgVGVzdFJlc3VsdCBhZF9ob2NfdGVzdF9yZXN1bHRfOworCisgIC8vIFRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cyBpbnNpZGUKKyAgLy8gR29vZ2xlIFRlc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnNfOworCisgIC8vIFRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuICBXaWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgVW5pdFRlc3QKKyAgLy8gb2JqZWN0IGlzIGRlc3RydWN0ZWQuICBCeSBkZWZhdWx0LCBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIgaXMgdXNlZCwKKyAgLy8gYnV0IHRoZSB1c2VyIGNhbiBzZXQgdGhpcyBmaWVsZCB0byB1c2UgYSBjdXN0b20gZ2V0dGVyIGlmIHRoYXQgaXMKKyAgLy8gZGVzaXJlZC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXJfOworCisgIC8vIFRydWUgaWZmIFBvc3RGbGFnUGFyc2luZ0luaXQoKSBoYXMgYmVlbiBjYWxsZWQuCisgIGJvb2wgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXzsKKworICAvLyBUaGUgcmFuZG9tIG51bWJlciBzZWVkIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVzdCBydW4uCisgIGludCByYW5kb21fc2VlZF87CisKKyAgLy8gT3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICBpbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87CisKKyAgLy8gVGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgIC8vIFVOSVggZXBvY2guCisgIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXBfOworCisgIC8vIEhvdyBsb25nIHRoZSB0ZXN0IHRvb2sgdG8gcnVuLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgLy8gVGhlIGRlY29tcG9zZWQgY29tcG9uZW50cyBvZiB0aGUgZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZywKKyAgLy8gcGFyc2VkIHdoZW4gUlVOX0FMTF9URVNUUyBpcyBjYWxsZWQuCisgIGludGVybmFsOjpzY29wZWRfcHRyPEludGVybmFsUnVuRGVhdGhUZXN0RmxhZz4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ187CisgIGludGVybmFsOjpzY29wZWRfcHRyPGludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5PiBkZWF0aF90ZXN0X2ZhY3RvcnlfOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIC8vIEEgcGVyLXRocmVhZCBzdGFjayBvZiB0cmFjZXMgY3JlYXRlZCBieSB0aGUgU0NPUEVEX1RSQUNFKCkgbWFjcm8uCisgIGludGVybmFsOjpUaHJlYWRMb2NhbDxzdGQ6OnZlY3RvcjxUcmFjZUluZm8+ID4gZ3Rlc3RfdHJhY2Vfc3RhY2tfOworCisgIC8vIFRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQgUnVuQWxsVGVzdHMoKQorICAvLyBzdGFydHMuCisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdEltcGwpOworfTsgIC8vIGNsYXNzIFVuaXRUZXN0SW1wbAorCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWNjZXNzaW5nIHRoZSBnbG9iYWwgVW5pdFRlc3QKKy8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4KK2lubGluZSBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpIHsKKyAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCk7Cit9CisKKyNpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgdGhlIHNpbXBsZSByZWd1bGFyCisvLyBleHByZXNzaW9uIG1hdGNoZXIuCitHVEVTVF9BUElfIGJvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpUHVuY3QoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNSZXBlYXQoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzVmFsaWRFc2NhcGUoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuLCBjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBWYWxpZGF0ZVJlZ2V4KGNvbnN0IGNoYXIqIHJlZ2V4KTsKK0dURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjaCwgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4KK0dURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndik7CitHVEVTVF9BUElfIHZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBsYXN0IHN5c3RlbSBlcnJvciwgcmVnYXJkbGVzcyBvZiB0aGUKKy8vIHBsYXRmb3JtLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFByb3ZpZGVzIGxlYWstc2FmZSBXaW5kb3dzIGtlcm5lbCBoYW5kbGUgb3duZXJzaGlwLgorY2xhc3MgQXV0b0hhbmRsZSB7CisgcHVibGljOgorICBBdXRvSGFuZGxlKCkgOiBoYW5kbGVfKElOVkFMSURfSEFORExFX1ZBTFVFKSB7fQorICBleHBsaWNpdCBBdXRvSGFuZGxlKEhBTkRMRSBoYW5kbGUpIDogaGFuZGxlXyhoYW5kbGUpIHt9CisKKyAgfkF1dG9IYW5kbGUoKSB7IFJlc2V0KCk7IH0KKworICBIQU5ETEUgR2V0KCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQorICB2b2lkIFJlc2V0KCkgeyBSZXNldChJTlZBTElEX0hBTkRMRV9WQUxVRSk7IH0KKyAgdm9pZCBSZXNldChIQU5ETEUgaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSAhPSBoYW5kbGVfKSB7CisgICAgICBpZiAoaGFuZGxlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgOjpDbG9zZUhhbmRsZShoYW5kbGVfKTsKKyAgICAgIGhhbmRsZV8gPSBoYW5kbGU7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBIQU5ETEUgaGFuZGxlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEF1dG9IYW5kbGUpOworfTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gQXR0ZW1wdHMgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBhIHBvc2l0aXZlIGludGVnZXIgcG9pbnRlZCB0byBieSB0aGUKKy8vIG51bWJlciBwYXJhbWV0ZXIuICBSZXR1cm5zIHRydWUgaWYgdGhhdCBpcyBwb3NzaWJsZS4KKy8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UKKy8vIGl0IGhlcmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZWdlcj4KK2Jvb2wgUGFyc2VOYXR1cmFsTnVtYmVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgSW50ZWdlciogbnVtYmVyKSB7CisgIC8vIEZhaWwgZmFzdCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGRvZXMgbm90IGJlZ2luIHdpdGggYSBkaWdpdDsKKyAgLy8gdGhpcyBieXBhc3NlcyBzdHJ0b1hYWCdzICJvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHBsdXMKKyAgLy8gb3IgbWludXMgc2lnbiIgc2VtYW50aWNzLCB3aGljaCBhcmUgdW5kZXNpcmFibGUgaGVyZS4KKyAgaWYgKHN0ci5lbXB0eSgpIHx8ICFJc0RpZ2l0KHN0clswXSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZXJybm8gPSAwOworCisgIGNoYXIqIGVuZDsKKyAgLy8gQmlnZ2VzdENvbnZlcnRpYmxlIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZSB0aGF0IHN5c3RlbS1wcm92aWRlZAorICAvLyBzdHJpbmctdG8tbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMgY2FuIHJldHVybi4KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQorCisgIC8vIE1TVkMgYW5kIEMrKyBCdWlsZGVyIGRlZmluZSBfX2ludDY0IGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGxvbmcgbG9uZy4KKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IEJpZ2dlc3RDb252ZXJ0aWJsZTsKKyAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IF9zdHJ0b3VpNjQoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsKKworIyBlbHNlCisKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdENvbnZlcnRpYmxlOyAgLy8gTk9MSU5UCisgIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBzdHJ0b3VsbChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQorCisgIGNvbnN0IGJvb2wgcGFyc2Vfc3VjY2VzcyA9ICplbmQgPT0gJ1wwJyAmJiBlcnJubyA9PSAwOworCisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IENvbnZlcnQgdGhpcyB0byBjb21waWxlIHRpbWUgYXNzZXJ0aW9uIHdoZW4gaXQgaXMKKyAgLy8gYXZhaWxhYmxlLgorICBHVEVTVF9DSEVDS18oc2l6ZW9mKEludGVnZXIpIDw9IHNpemVvZihwYXJzZWQpKTsKKworICBjb25zdCBJbnRlZ2VyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludGVnZXI+KHBhcnNlZCk7CisgIGlmIChwYXJzZV9zdWNjZXNzICYmIHN0YXRpY19jYXN0PEJpZ2dlc3RDb252ZXJ0aWJsZT4ocmVzdWx0KSA9PSBwYXJzZWQpIHsKKyAgICAqbnVtYmVyID0gcmVzdWx0OworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdFJlc3VsdCBjb250YWlucyBzb21lIHByaXZhdGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gZnJvbQorLy8gR29vZ2xlIFRlc3QgdXNlciBidXQgYXJlIHJlcXVpcmVkIGZvciB0ZXN0aW5nLiBUaGlzIGNsYXNzIGFsbG93IG91ciB0ZXN0cworLy8gdG8gYWNjZXNzIHRoZW0uCisvLworLy8gVGhpcyBjbGFzcyBpcyBzdXBwbGllZCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duCisvLyBjb25zdHJ1Y3RzLiBEbyBub3QgdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5KSB7CisgICAgdGVzdF9yZXN1bHQtPlJlY29yZFByb3BlcnR5KHByb3BlcnR5KTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0KSB7CisgICAgdGVzdF9yZXN1bHQtPkNsZWFyVGVzdFBhcnRSZXN1bHRzKCk7CisgIH0KKworICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygKKyAgICAgIGNvbnN0IFRlc3RSZXN1bHQmIHRlc3RfcmVzdWx0KSB7CisgICAgcmV0dXJuIHRlc3RfcmVzdWx0LnRlc3RfcGFydF9yZXN1bHRzKCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkNvdW50SWY7Cit1c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsKK3VzaW5nIGludGVybmFsOjpHZXRFbGVtZW50T3I7Cit1c2luZyBpbnRlcm5hbDo6U2h1ZmZsZTsKKworLy8gQ29uc3RhbnRzLgorCisvLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMKKy8vIGRpc2FibGVkIGFuZCBub3QgcnVuLgorc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVUZXN0RmlsdGVyW10gPSAiRElTQUJMRURfKjoqL0RJU0FCTEVEXyoiOworCisvLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMgY29uc2lkZXJlZCBhIGRlYXRoCisvLyB0ZXN0IGNhc2UgYW5kIHdpbGwgYmUgcnVuIGJlZm9yZSB0ZXN0IGNhc2VzIHdob3NlIG5hbWUgZG9lc24ndAorLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuCitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0Q2FzZUZpbHRlcltdID0gIipEZWF0aFRlc3Q6KkRlYXRoVGVzdC8qIjsKKworLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4KK3N0YXRpYyBjb25zdCBjaGFyIGtVbml2ZXJzYWxGaWx0ZXJbXSA9ICIqIjsKKworLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE91dHB1dEZpbGVbXSA9ICJ0ZXN0X2RldGFpbC54bWwiOworCisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkSW5kZXhbXSA9ICJHVEVTVF9TSEFSRF9JTkRFWCI7CisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0IHNoYXJkcy4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOworLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlLgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZFN0YXR1c0ZpbGVbXSA9ICJHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXSA9ICJcblN0YWNrIHRyYWNlOlxuIjsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitib29sIGdfaGVscF9mbGFnID0gZmFsc2U7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwgZmFsc2UpLAorICAgICJSdW4gZGlzYWJsZWQgdGVzdHMgdG9vLCBpbiBhZGRpdGlvbiB0byB0aGUgdGVzdHMgbm9ybWFsbHkgYmVpbmcgcnVuLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYnJlYWtfb25fZmFpbHVyZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYnJlYWtfb25fZmFpbHVyZSIsIGZhbHNlKSwKKyAgICAiVHJ1ZSBpZmYgYSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCBiZSBhIGRlYnVnZ2VyIGJyZWFrLXBvaW50LiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgY2F0Y2hfZXhjZXB0aW9ucywKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiY2F0Y2hfZXhjZXB0aW9ucyIsIHRydWUpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyB0ZXN0IGZhaWx1cmVzLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBjb2xvciwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJjb2xvciIsICJhdXRvIiksCisgICAgIldoZXRoZXIgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LiAgVmFsaWQgdmFsdWVzOiB5ZXMsIG5vLCAiCisgICAgImFuZCBhdXRvLiAgJ2F1dG8nIG1lYW5zIHRvIHVzZSBjb2xvcnMgaWYgdGhlIG91dHB1dCBpcyAiCisgICAgImJlaW5nIHNlbnQgdG8gYSB0ZXJtaW5hbCBhbmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgIgorICAgICJpcyBzZXQgdG8geHRlcm0sIHh0ZXJtLWNvbG9yLCB4dGVybS0yNTZjb2xvciwgbGludXggb3IgY3lnd2luLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBmaWx0ZXIsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZmlsdGVyIiwga1VuaXZlcnNhbEZpbHRlciksCisgICAgIkEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYiAobm90IHJlZ2V4KSBwYXR0ZXJucyAiCisgICAgImZvciBmaWx0ZXJpbmcgdGhlIHRlc3RzIHRvIHJ1biwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICIKKyAgICAiJy0nIGFuZCBhIDogc2VwYXJhdGVkIGxpc3Qgb2YgbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvICIKKyAgICAiZXhjbHVkZSkuICBBIHRlc3QgaXMgcnVuIGlmIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSAiCisgICAgInBhdHRlcm5zIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8obGlzdF90ZXN0cywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIkxpc3QgYWxsIHRlc3RzIHdpdGhvdXQgcnVubmluZyB0aGVtLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBvdXRwdXQsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigib3V0cHV0IiwgIiIpLAorICAgICJBIGZvcm1hdCAoY3VycmVudGx5IG11c3QgYmUgXCJ4bWxcIiksIG9wdGlvbmFsbHkgZm9sbG93ZWQgIgorICAgICJieSBhIGNvbG9uIGFuZCBhbiBvdXRwdXQgZmlsZSBuYW1lIG9yIGRpcmVjdG9yeS4gQSBkaXJlY3RvcnkgIgorICAgICJpcyBpbmRpY2F0ZWQgYnkgYSB0cmFpbGluZyBwYXRobmFtZSBzZXBhcmF0b3IuICIKKyAgICAiRXhhbXBsZXM6IFwieG1sOmZpbGVuYW1lLnhtbFwiLCBcInhtbDo6ZGlyZWN0b3J5bmFtZS9cIi4gIgorICAgICJJZiBhIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQsIG91dHB1dCBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQgIgorICAgICJ3aXRoaW4gdGhhdCBkaXJlY3RvcnksIHdpdGggZmlsZS1uYW1lcyBiYXNlZCBvbiB0aGUgdGVzdCAiCisgICAgImV4ZWN1dGFibGUncyBuYW1lIGFuZCwgaWYgbmVjZXNzYXJ5LCBtYWRlIHVuaXF1ZSBieSBhZGRpbmcgIgorICAgICJkaWdpdHMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBwcmludF90aW1lLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJwcmludF90aW1lIiwgdHJ1ZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCBkaXNwbGF5IGVsYXBzZWQgdGltZSBpbiB0ZXh0IG91dHB1dC4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICByYW5kb21fc2VlZCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInJhbmRvbV9zZWVkIiwgMCksCisgICAgIlJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2Ugd2hlbiBzaHVmZmxpbmcgdGVzdCBvcmRlcnMuICBNdXN0IGJlIGluIHJhbmdlICIKKyAgICAiWzEsIDk5OTk5XSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUuIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgcmVwZWF0LAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmVwZWF0IiwgMSksCisgICAgIkhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCBlYWNoIHRlc3QuICBTcGVjaWZ5IGEgbmVnYXRpdmUgbnVtYmVyICIKKyAgICAiZm9yIHJlcGVhdGluZyBmb3JldmVyLiAgVXNlZnVsIGZvciBzaGFraW5nIG91dCBmbGFreSB0ZXN0cy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzLCBmYWxzZSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXyAiIHNob3VsZCBpbmNsdWRlIGludGVybmFsIHN0YWNrIGZyYW1lcyB3aGVuICIKKyAgICAicHJpbnRpbmcgdGVzdCBmYWlsdXJlIHN0YWNrIHRyYWNlcy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHNodWZmbGUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInNodWZmbGUiLCBmYWxzZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCByYW5kb21pemUgdGVzdHMnIG9yZGVyIG9uIGV2ZXJ5IHJ1bi4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICBzdGFja190cmFjZV9kZXB0aCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInN0YWNrX3RyYWNlX2RlcHRoIiwga01heFN0YWNrVHJhY2VEZXB0aCksCisgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gcHJpbnQgd2hlbiBhbiAiCisgICAgImFzc2VydGlvbiBmYWlscy4gIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRocm91Z2ggMTAwLCBpbmNsdXNpdmUuIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIHN0cmVhbV9yZXN1bHRfdG8sCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigic3RyZWFtX3Jlc3VsdF90byIsICIiKSwKKyAgICAiVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgaG9zdCBuYW1lIGFuZCB0aGUgcG9ydCBudW1iZXIgb24gd2hpY2ggdG8gc3RyZWFtICIKKyAgICAidGVzdCByZXN1bHRzLiBFeGFtcGxlOiBcImxvY2FsaG9zdDo1NTVcIi4gVGhlIGZsYWcgaXMgZWZmZWN0aXZlIG9ubHkgb24gIgorICAgICJMaW51eC4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHRocm93X29uX2ZhaWx1cmUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInRocm93X29uX2ZhaWx1cmUiLCBmYWxzZSksCisgICAgIldoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uICIKKyAgICAiaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBvciBleGl0IHRoZSBwcm9ncmFtIHdpdGggYSBub24temVybyBjb2RlICIKKyAgICAib3RoZXJ3aXNlLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKSwgdXNpbmcgYSBMaW5lYXIKKy8vIENvbmdydWVudGlhbCBHZW5lcmF0b3IgKExDRykuICBDcmFzaGVzIGlmICdyYW5nZScgaXMgMCBvciBncmVhdGVyCisvLyB0aGFuIGtNYXhSYW5nZS4KK1VJbnQzMiBSYW5kb206OkdlbmVyYXRlKFVJbnQzMiByYW5nZSkgeworICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRoZSBzYW1lIGFzIGFyZSB1c2VkIGluIGdsaWJjJ3MgcmFuZCgzKS4KKyAgc3RhdGVfID0gKDExMDM1MTUyNDVVKnN0YXRlXyArIDEyMzQ1VSkgJSBrTWF4UmFuZ2U7CisKKyAgR1RFU1RfQ0hFQ0tfKHJhbmdlID4gMCkKKyAgICAgIDw8ICJDYW5ub3QgZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLCAwKS4iOworICBHVEVTVF9DSEVDS18ocmFuZ2UgPD0ga01heFJhbmdlKQorICAgICAgPDwgIkdlbmVyYXRpb24gb2YgYSBudW1iZXIgaW4gWzAsICIgPDwgcmFuZ2UgPDwgIikgd2FzIHJlcXVlc3RlZCwgIgorICAgICAgPDwgImJ1dCB0aGlzIGNhbiBvbmx5IGdlbmVyYXRlIG51bWJlcnMgaW4gWzAsICIgPDwga01heFJhbmdlIDw8ICIpLiI7CisKKyAgLy8gQ29udmVydGluZyB2aWEgbW9kdWx1cyBpbnRyb2R1Y2VzIGEgYml0IG9mIGRvd253YXJkIGJpYXMsIGJ1dAorICAvLyBpdCdzIHNpbXBsZSwgYW5kIGEgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgaXNuJ3QgdG9vIGdvb2QKKyAgLy8gdG8gYmVnaW4gd2l0aC4KKyAgcmV0dXJuIHN0YXRlXyAlIHJhbmdlOworfQorCisvLyBHVGVzdElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBpbml0aWFsaXplZAorLy8gR29vZ2xlIFRlc3QuICBVc2VmdWwgZm9yIGNhdGNoaW5nIHRoZSB1c2VyIG1pc3Rha2Ugb2Ygbm90IGluaXRpYWxpemluZworLy8gR29vZ2xlIFRlc3QgYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEEgdXNlciBtdXN0IGNhbGwgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKSB0byBpbml0aWFsaXplIEdvb2dsZQorLy8gVGVzdC4gIGdfaW5pdF9ndGVzdF9jb3VudCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0aW1lcworLy8gSW5pdEdvb2dsZVRlc3QoKSBoYXMgYmVlbiBjYWxsZWQuICBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdmFyaWFibGUKKy8vIHVuZGVyIGEgbXV0ZXggYXMgaXQgaXMgb25seSBhY2Nlc3NlZCBpbiB0aGUgbWFpbiB0aHJlYWQuCitHVEVTVF9BUElfIGludCBnX2luaXRfZ3Rlc3RfY291bnQgPSAwOworc3RhdGljIGJvb2wgR1Rlc3RJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gZ19pbml0X2d0ZXN0X2NvdW50ICE9IDA7IH0KKworLy8gSXRlcmF0ZXMgb3ZlciBhIHZlY3RvciBvZiBUZXN0Q2FzZXMsIGtlZXBpbmcgYSBydW5uaW5nIHN1bSBvZiB0aGUKKy8vIHJlc3VsdHMgb2YgY2FsbGluZyBhIGdpdmVuIGludC1yZXR1cm5pbmcgbWV0aG9kIG9uIGVhY2guCisvLyBSZXR1cm5zIHRoZSBzdW0uCitzdGF0aWMgaW50IFN1bU92ZXJUZXN0Q2FzZUxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiYgY2FzZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoVGVzdENhc2U6OiptZXRob2QpKCkgY29uc3QpIHsKKyAgaW50IHN1bSA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FzZV9saXN0LnNpemUoKTsgaSsrKSB7CisgICAgc3VtICs9IChjYXNlX2xpc3RbaV0tPiptZXRob2QpKCk7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KK3N0YXRpYyBib29sIFRlc3RDYXNlUGFzc2VkKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpICYmIHRlc3RfY2FzZS0+UGFzc2VkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZUZhaWxlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPkZhaWxlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3RfY2FzZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGVzdCB0aGF0IHNob3VsZAorLy8gcnVuLgorc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdENhc2UoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCk7Cit9CisKKy8vIEFzc2VydEhlbHBlciBjb25zdHJ1Y3Rvci4KK0Fzc2VydEhlbHBlcjo6QXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKQorICAgIDogZGF0YV8obmV3IEFzc2VydEhlbHBlckRhdGEodHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkpIHsKK30KKworQXNzZXJ0SGVscGVyOjp+QXNzZXJ0SGVscGVyKCkgeworICBkZWxldGUgZGF0YV87Cit9CisKKy8vIE1lc3NhZ2UgYXNzaWdubWVudCwgZm9yIGFzc2VydGlvbiBzdHJlYW1pbmcgc3VwcG9ydC4KK3ZvaWQgQXNzZXJ0SGVscGVyOjpvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+CisgICAgQWRkVGVzdFBhcnRSZXN1bHQoZGF0YV8tPnR5cGUsIGRhdGFfLT5maWxlLCBkYXRhXy0+bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShkYXRhXy0+bWVzc2FnZSwgbWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKQorICAgICAgICAgICAgICAgICAgICAgIC0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKQorICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBmdW5jdGlvbiBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgICAgKTsgIC8vIE5PTElOVAorfQorCisvLyBNdXRleCBmb3IgbGlua2VkIHBvaW50ZXJzLgorR1RFU1RfQVBJXyBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisvLyBBcHBsaWNhdGlvbiBwYXRobmFtZSBnb3R0ZW4gaW4gSW5pdEdvb2dsZVRlc3QuCitzdGQ6OnN0cmluZyBnX2V4ZWN1dGFibGVfcGF0aDsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKKy8vIGlzIHByZXNlbnQuCitGaWxlUGF0aCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSB7CisgIEZpbGVQYXRoIHJlc3VsdDsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmVzdWx0LlNldChGaWxlUGF0aChnX2V4ZWN1dGFibGVfcGF0aCkuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKSk7CisjZWxzZQorICByZXN1bHQuU2V0KEZpbGVQYXRoKGdfZXhlY3V0YWJsZV9wYXRoKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gcmVzdWx0LlJlbW92ZURpcmVjdG9yeU5hbWUoKTsKK30KKworLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9vdXRwdXQgZmxhZy4KKworLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KK3N0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkgcmV0dXJuIHN0ZDo6c3RyaW5nKCIiKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBjb2xvbiA9IHN0cmNocihndGVzdF9vdXRwdXRfZmxhZywgJzonKTsKKyAgcmV0dXJuIChjb2xvbiA9PSBOVUxMKSA/CisgICAgICBzdGQ6OnN0cmluZyhndGVzdF9vdXRwdXRfZmxhZykgOgorICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcsIGNvbG9uIC0gZ3Rlc3Rfb3V0cHV0X2ZsYWcpOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vbmUKKy8vIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KK3N0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkKKyAgICByZXR1cm4gIiI7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIGlmIChjb2xvbiA9PSBOVUxMKQorICAgIHJldHVybiBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoCisgICAgICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChrRGVmYXVsdE91dHB1dEZpbGUpKS5zdHJpbmcoKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggb3V0cHV0X25hbWUoY29sb24gKyAxKTsKKyAgaWYgKCFvdXRwdXRfbmFtZS5Jc0Fic29sdXRlUGF0aCgpKQorICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIFxzb21lXHBhdGggaXMgbm90IGFuIGFic29sdXRlCisgICAgLy8gcGF0aCAoYXMgaXRzIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBkcml2ZSksIHlldCB0aGUKKyAgICAvLyBmb2xsb3dpbmcgbG9naWMgZm9yIHR1cm5pbmcgaXQgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlzIHdyb25nLgorICAgIC8vIEZpeCBpdC4KKyAgICBvdXRwdXRfbmFtZSA9IGludGVybmFsOjpGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChjb2xvbiArIDEpKTsKKworICBpZiAoIW91dHB1dF9uYW1lLklzRGlyZWN0b3J5KCkpCisgICAgcmV0dXJuIG91dHB1dF9uYW1lLnN0cmluZygpOworCisgIGludGVybmFsOjpGaWxlUGF0aCByZXN1bHQoaW50ZXJuYWw6OkZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKAorICAgICAgb3V0cHV0X25hbWUsIGludGVybmFsOjpHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSwKKyAgICAgIEdldE91dHB1dEZvcm1hdCgpLmNfc3RyKCkpKTsKKyAgcmV0dXJuIHJlc3VsdC5zdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKy8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCisvLworLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OlBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyKSB7CisgIHN3aXRjaCAoKnBhdHRlcm4pIHsKKyAgICBjYXNlICdcMCc6CisgICAgY2FzZSAnOic6ICAvLyBFaXRoZXIgJzonIG9yICdcMCcgbWFya3MgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KKyAgICAgIHJldHVybiAqc3RyID09ICdcMCc7CisgICAgY2FzZSAnPyc6ICAvLyBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgICAgY2FzZSAnKic6ICAvLyBNYXRjaGVzIGFueSBzdHJpbmcgKHBvc3NpYmx5IGVtcHR5KSBvZiBjaGFyYWN0ZXJzLgorICAgICAgcmV0dXJuICgqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiwgc3RyICsgMSkpIHx8CisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0cik7CisgICAgZGVmYXVsdDogIC8vIE5vbi1zcGVjaWFsIGNoYXJhY3Rlci4gIE1hdGNoZXMgaXRzZWxmLgorICAgICAgcmV0dXJuICpwYXR0ZXJuID09ICpzdHIgJiYKKyAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgIH0KK30KKworYm9vbCBVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGZpbHRlcikgeworICBjb25zdCBjaGFyICpjdXJfcGF0dGVybiA9IGZpbHRlcjsKKyAgZm9yICg7OykgeworICAgIGlmIChQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjdXJfcGF0dGVybiwgbmFtZS5jX3N0cigpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRmluZHMgdGhlIG5leHQgcGF0dGVybiBpbiB0aGUgZmlsdGVyLgorICAgIGN1cl9wYXR0ZXJuID0gc3RyY2hyKGN1cl9wYXR0ZXJuLCAnOicpOworCisgICAgLy8gUmV0dXJucyBpZiBubyBtb3JlIHBhdHRlcm4gY2FuIGJlIGZvdW5kLgorICAgIGlmIChjdXJfcGF0dGVybiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2tpcHMgdGhlIHBhdHRlcm4gc2VwYXJhdGVyICh0aGUgJzonIGNoYXJhY3RlcikuCisgICAgY3VyX3BhdHRlcm4rKzsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCisvLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9uYW1lKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUgPSB0ZXN0X2Nhc2VfbmFtZSArICIuIiArIHRlc3RfbmFtZS5jX3N0cigpOworCisgIC8vIFNwbGl0IC0tZ3Rlc3RfZmlsdGVyIGF0ICctJywgaWYgdGhlcmUgaXMgb25lLCB0byBzZXBhcmF0ZSBpbnRvCisgIC8vIHBvc2l0aXZlIGZpbHRlciBhbmQgbmVnYXRpdmUgZmlsdGVyIHBvcnRpb25zCisgIGNvbnN0IGNoYXIqIGNvbnN0IHAgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3QgZGFzaCA9IHN0cmNocihwLCAnLScpOworICBzdGQ6OnN0cmluZyBwb3NpdGl2ZTsKKyAgc3RkOjpzdHJpbmcgbmVnYXRpdmU7CisgIGlmIChkYXNoID09IE5VTEwpIHsKKyAgICBwb3NpdGl2ZSA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOyAgLy8gV2hvbGUgc3RyaW5nIGlzIGEgcG9zaXRpdmUgZmlsdGVyCisgICAgbmVnYXRpdmUgPSAiIjsKKyAgfSBlbHNlIHsKKyAgICBwb3NpdGl2ZSA9IHN0ZDo6c3RyaW5nKHAsIGRhc2gpOyAgIC8vIEV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGRhc2gKKyAgICBuZWdhdGl2ZSA9IHN0ZDo6c3RyaW5nKGRhc2ggKyAxKTsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGRhc2gKKyAgICBpZiAocG9zaXRpdmUuZW1wdHkoKSkgeworICAgICAgLy8gVHJlYXQgJy10ZXN0MScgYXMgdGhlIHNhbWUgYXMgJyotdGVzdDEnCisgICAgICBwb3NpdGl2ZSA9IGtVbml2ZXJzYWxGaWx0ZXI7CisgICAgfQorICB9CisKKyAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucy4gIEl0IG1hdGNoZXMgYQorICAvLyB0ZXN0IGlmIGFueSBwYXR0ZXJuIGluIGl0IG1hdGNoZXMgdGhlIHRlc3QuCisgIHJldHVybiAoTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIHBvc2l0aXZlLmNfc3RyKCkpICYmCisgICAgICAgICAgIU1hdGNoZXNGaWx0ZXIoZnVsbF9uYW1lLCBuZWdhdGl2ZS5jX3N0cigpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU0VICisvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKKy8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgorLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgYXMgYW4gX19leGNlcHQgY29uZGl0aW9uLgoraW50IFVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKSB7CisgIC8vIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgYSBTRUggZXhjZXB0aW9uIGlmOgorICAvLyAgIDEuIHRoZSB1c2VyIHdhbnRzIGl0IHRvLCBBTkQKKyAgLy8gICAyLiB0aGlzIGlzIG5vdCBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLCBBTkQKKyAgLy8gICAzLiB0aGlzIGlzIG5vdCBhIEMrKyBleGNlcHRpb24gKFZDKysgaW1wbGVtZW50cyB0aGVtIHZpYSBTRUgsCisgIC8vICAgICAgYXBwYXJlbnRseSkuCisgIC8vCisgIC8vIFNFSCBleGNlcHRpb24gY29kZSBmb3IgQysrIGV4Y2VwdGlvbnMuCisgIC8vIChzZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xODUyOTQgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorICBjb25zdCBEV09SRCBrQ3h4RXhjZXB0aW9uQ29kZSA9IDB4ZTA2ZDczNjM7CisKKyAgYm9vbCBzaG91bGRfaGFuZGxlID0gdHJ1ZTsKKworICBpZiAoIUdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCisgICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOworICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBFWENFUFRJT05fQlJFQUtQT0lOVCkKKyAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7CisgIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IGtDeHhFeGNlcHRpb25Db2RlKQorICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKKworICByZXR1cm4gc2hvdWxkX2hhbmRsZSA/IEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgOiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKy8vIHJlc3VsdHMuIEludGVyY2VwdHMgb25seSBmYWlsdXJlcyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZC4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCisgICAgOiBpbnRlcmNlcHRfbW9kZV8oSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQpLAorICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKKyAgSW5pdCgpOworfQorCisvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKy8vIHJlc3VsdHMuCitTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQorICAgIDogaW50ZXJjZXB0X21vZGVfKGludGVyY2VwdF9tb2RlKSwKKyAgICAgIHJlc3VsdF8ocmVzdWx0KSB7CisgIEluaXQoKTsKK30KKwordm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SW5pdCgpIHsKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKKyAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIodGhpcyk7CisgIH0gZWxzZSB7CisgICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7CisgICAgaW1wbC0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7CisgIH0KK30KKworLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkgR29vZ2xlIFRlc3QKKy8vIGJlZm9yZS4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjp+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7CisgICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihvbGRfcmVwb3J0ZXJfKTsKKyAgfSBlbHNlIHsKKyAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZChvbGRfcmVwb3J0ZXJfKTsKKyAgfQorfQorCisvLyBJbmNyZW1lbnRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IGNvdW50IGFuZCByZW1lbWJlcnMgdGhlIHJlc3VsdC4KKy8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgaW50ZXJmYWNlLgordm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXN1bHRfLT5BcHBlbmQocmVzdWx0KTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBXZSBzaG91bGQgYWx3YXlzIGNhbGwgdGhpcworLy8gaW5zdGVhZCBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKKy8vIHRlc3Rpbmc6OlRlc3QuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbgorLy8gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYSBmcmFtZXdvcmsgb24gTWFjIE9TIFguICBUaGUgYnVnIGNhdXNlcworLy8gR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nCisvLyBvbiB3aGV0aGVyIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3IKKy8vIGZyb20gdXNlciB0ZXN0IGNvZGUuICBHZXRUZXN0VHlwZUlkKCkgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMKKy8vIHJldHVybiB0aGUgc2FtZSB2YWx1ZSwgYXMgaXQgYWx3YXlzIGNhbGxzIEdldFR5cGVJZDw+KCkgZnJvbSB0aGUKKy8vIGd0ZXN0LmNjLCB3aGljaCBpcyB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yay4KK1R5cGVJZCBHZXRUZXN0VHlwZUlkKCkgeworICByZXR1cm4gR2V0VHlwZUlkPFRlc3Q+KCk7Cit9CisKKy8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKKy8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCitleHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0ID0gR2V0VGVzdFR5cGVJZCgpOworCisvLyBUaGlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIgY2hlY2tzIHRoYXQgJ3Jlc3VsdHMnIGNvbnRhaW5zIGEgdGVzdCBwYXJ0CisvLyBmYWlsdXJlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMgdGhlCisvLyBnaXZlbiBzdWJzdHJpbmcuCitBc3NlcnRpb25SZXN1bHQgSGFzT25lRmFpbHVyZShjb25zdCBjaGFyKiAvKiByZXN1bHRzX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB0eXBlX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBzdWJzdHJfZXhwciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkmIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBmYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBub24tZmF0YWwgZmFpbHVyZSIpOworICBNZXNzYWdlIG1zZzsKKyAgaWYgKHJlc3VsdHMuc2l6ZSgpICE9IDEpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgbXNnIDw8ICJcbiIgPDwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICB9CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCYgciA9IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCk7CisgIGlmIChyLnR5cGUoKSAhPSB0eXBlKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIGlmIChzdHJzdHIoci5tZXNzYWdlKCksIHN1YnN0ci5jX3N0cigpKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBjb250YWluaW5nIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3Vic3RyIDw8ICJcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cAorLy8gdGVzdCBwYXJ0IHJlc3VsdHMsIHdoYXQgdHlwZSBvZiBmYWlsdXJlIHdlIGV4cGVjdCwgYW5kIHdoYXQKKy8vIHN1YnN0cmluZyB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBjb250YWluLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpCisgICAgOiByZXN1bHRzXyhyZXN1bHRzKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgc3Vic3RyXyhzdWJzdHIpIHt9CisKKy8vIFRoZSBkZXN0cnVjdG9yIG9mIFNpbmdsZUZhaWx1cmVDaGVja2VyIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCisvLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQorLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCitTaW5nbGVGYWlsdXJlQ2hlY2tlcjo6flNpbmdsZUZhaWx1cmVDaGVja2VyKCkgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKEhhc09uZUZhaWx1cmUsICpyZXN1bHRzXywgdHlwZV8sIHN1YnN0cl8pOworfQorCitEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworICB1bml0X3Rlc3RfLT5saXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKS0+T25UZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCitEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgcmV0dXJuIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworfQorCisvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8gPSByZXBvcnRlcjsKK30KKworLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKK1VuaXRUZXN0SW1wbDo6R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSB7CisgIHJldHVybiBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLmdldCgpOworfQorCisvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKKyAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5zZXQocmVwb3J0ZXIpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZVBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFNob3VsZFJ1blRlc3RDYXNlKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRvdGFsX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KTsKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK3N0ZDo6c3RyaW5nIFVuaXRUZXN0SW1wbDo6Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChpbnQgc2tpcF9jb3VudCkgeworICAodm9pZClza2lwX2NvdW50OworICByZXR1cm4gIiI7Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gMTk3MC0wMS0wMSBhbmQgMTYwMS0wMS0wMSBpbiBtaWxsaXNlY29uZHMuCisgIC8vIGh0dHA6Ly9hbmFsb2dvdXMuYmxvZ3Nwb3QuY29tLzIwMDUvMDQvZXBvY2guaHRtbAorICBjb25zdCBUaW1lSW5NaWxsaXMga0phdmFFcG9jaFRvV2luRmlsZVRpbWVEZWx0YSA9CisgICAgc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPigxMTY0NDQ3MzZVTCkgKiAxMDAwMDBVTDsKKyAgY29uc3QgRFdPUkQga1RlbnRoTWljcm9zSW5NaWxsaVNlY29uZCA9IDEwMDAwOworCisgIFNZU1RFTVRJTUUgbm93X3N5c3RpbWU7CisgIEZJTEVUSU1FIG5vd19maWxldGltZTsKKyAgVUxBUkdFX0lOVEVHRVIgbm93X2ludDY0OworICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogU2hvdWxkbid0IHRoaXMganVzdCB1c2UKKyAgLy8gICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpPworICBHZXRTeXN0ZW1UaW1lKCZub3dfc3lzdGltZSk7CisgIGlmIChTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93X3N5c3RpbWUsICZub3dfZmlsZXRpbWUpKSB7CisgICAgbm93X2ludDY0Lkxvd1BhcnQgPSBub3dfZmlsZXRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICBub3dfaW50NjQuSGlnaFBhcnQgPSBub3dfZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgbm93X2ludDY0LlF1YWRQYXJ0ID0gKG5vd19pbnQ2NC5RdWFkUGFydCAvIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQpIC0KKyAgICAgIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGE7CisgICAgcmV0dXJuIG5vd19pbnQ2NC5RdWFkUGFydDsKKyAgfQorICByZXR1cm4gMDsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCisgIF9fdGltZWI2NCBub3c7CisKKyMgaWZkZWYgX01TQ19WRVIKKworICAvLyBNU1ZDIDggZGVwcmVjYXRlcyBfZnRpbWU2NCgpLCBzbyB3ZSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmcgNDk5NgorICAvLyAoZGVwcmVjYXRlZCBmdW5jdGlvbikgdGhlcmUuCisgIC8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgR2V0VGlja0NvdW50KCk/ICBPciB1c2UKKyAgLy8gICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgpCisjICBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2LgorICBfZnRpbWU2NCgmbm93KTsKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorIyBlbHNlCisKKyAgX2Z0aW1lNjQoJm5vdyk7CisKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnRpbWUpICogMTAwMCArIG5vdy5taWxsaXRtOworI2VsaWYgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8KKyAgc3RydWN0IHRpbWV2YWwgbm93OworICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50dl9zZWMpICogMTAwMCArIG5vdy50dl91c2VjIC8gMTAwMDsKKyNlbHNlCisjIGVycm9yICJEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBvbiB5b3VyIHN5c3RlbS4iCisjZW5kaWYKK30KKworLy8gVXRpbGl0aWVzCisKKy8vIGNsYXNzIFN0cmluZy4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nCisvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgd2lkZSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCisvLyBpbnB1dCBpcyBOVUxMLgorTFBDV1NUUiBTdHJpbmc6OkFuc2lUb1V0ZjE2KGNvbnN0IGNoYXIqIGFuc2kpIHsKKyAgaWYgKCFhbnNpKSByZXR1cm4gTlVMTDsKKyAgY29uc3QgaW50IGxlbmd0aCA9IHN0cmxlbihhbnNpKTsKKyAgY29uc3QgaW50IHVuaWNvZGVfbGVuZ3RoID0KKyAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhbnNpLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworICBXQ0hBUiogdW5pY29kZSA9IG5ldyBXQ0hBUlt1bmljb2RlX2xlbmd0aCArIDFdOworICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIHVuaWNvZGVfbGVuZ3RoKTsKKyAgdW5pY29kZVt1bmljb2RlX2xlbmd0aF0gPSAwOworICByZXR1cm4gdW5pY29kZTsKK30KKworLy8gQ3JlYXRlcyBhbiBBTlNJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiB3aWRlIHN0cmluZywgYWxsb2NhdGluZworLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIEFOU0kgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorLy8gaW5wdXQgaXMgTlVMTC4KK2NvbnN0IGNoYXIqIFN0cmluZzo6VXRmMTZUb0Fuc2koTFBDV1NUUiB1dGYxNl9zdHIpICB7CisgIGlmICghdXRmMTZfc3RyKSByZXR1cm4gTlVMTDsKKyAgY29uc3QgaW50IGFuc2lfbGVuZ3RoID0KKyAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgY2hhciogYW5zaSA9IG5ldyBjaGFyW2Fuc2lfbGVuZ3RoICsgMV07CisgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLAorICAgICAgICAgICAgICAgICAgICAgIGFuc2ksIGFuc2lfbGVuZ3RoLCBOVUxMLCBOVUxMKTsKKyAgYW5zaVthbnNpX2xlbmd0aF0gPSAwOworICByZXR1cm4gYW5zaTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudC4KKy8vCisvLyBVbmxpa2Ugc3RyY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQSBOVUxMCisvLyBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KK2Jvb2wgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIgKiBsaHMsIGNvbnN0IGNoYXIgKiByaHMpIHsKKyAgaWYgKCBsaHMgPT0gTlVMTCApIHJldHVybiByaHMgPT0gTlVMTDsKKworICBpZiAoIHJocyA9PSBOVUxMICkgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBzdHJjbXAobGhzLCByaHMpID09IDA7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIENvbnZlcnRzIGFuIGFycmF5IG9mIHdpZGUgY2hhcnMgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIE1lc3NhZ2Ugb2JqZWN0Lgorc3RhdGljIHZvaWQgU3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKGNvbnN0IHdjaGFyX3QqIHdzdHIsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXNnKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGxlbmd0aDsgKSB7ICAvLyBOT0xJTlQKKyAgICBpZiAod3N0cltpXSAhPSBMJ1wwJykgeworICAgICAgKm1zZyA8PCBXaWRlU3RyaW5nVG9VdGY4KHdzdHIgKyBpLCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCAtIGkpKTsKKyAgICAgIHdoaWxlIChpICE9IGxlbmd0aCAmJiB3c3RyW2ldICE9IEwnXDAnKQorICAgICAgICBpKys7CisgICAgfSBlbHNlIHsKKyAgICAgICptc2cgPDwgJ1wwJzsKKyAgICAgIGkrKzsKKyAgICB9CisgIH0KK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKSB7CisgIGludGVybmFsOjpTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2Uod3N0ci5jX3N0cigpLCB3c3RyLmxlbmd0aCgpLCB0aGlzKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCitNZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpIHsKKyAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBBc3NlcnRpb25SZXN1bHQgY29uc3RydWN0b3JzLgorLy8gVXNlZCBpbiBFWFBFQ1RfVFJVRS9GQUxTRShhc3NlcnRpb25fcmVzdWx0KS4KK0Fzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpCisgICAgOiBzdWNjZXNzXyhvdGhlci5zdWNjZXNzXyksCisgICAgICBtZXNzYWdlXyhvdGhlci5tZXNzYWdlXy5nZXQoKSAhPSBOVUxMID8KKyAgICAgICAgICAgICAgIG5ldyA6OnN0ZDo6c3RyaW5nKCpvdGhlci5tZXNzYWdlXykgOgorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPihOVUxMKSkgeworfQorCisvLyBSZXR1cm5zIHRoZSBhc3NlcnRpb24ncyBuZWdhdGlvbi4gVXNlZCB3aXRoIEVYUEVDVC9BU1NFUlRfRkFMU0UuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uUmVzdWx0OjpvcGVyYXRvciEoKSBjb25zdCB7CisgIEFzc2VydGlvblJlc3VsdCBuZWdhdGlvbighc3VjY2Vzc18pOworICBpZiAobWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCkKKyAgICBuZWdhdGlvbiA8PCAqbWVzc2FnZV87CisgIHJldHVybiBuZWdhdGlvbjsKK30KKworLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpIHsKKyAgcmV0dXJuIEFzc2VydGlvblJlc3VsdCh0cnVlKTsKK30KKworLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCkgeworICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KGZhbHNlKTsKK30KKworLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBmYWlsdXJlIG1lc3NhZ2UuCisvLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2UuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbWVzc2FnZTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgYW4gZXF1YWxpdHkgYXNzZXJ0aW9uCisvLyAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9TVFJFUSwgZXRjKSBmYWlsdXJlLgorLy8KKy8vIFRoZSBmaXJzdCBmb3VyIHBhcmFtZXRlcnMgYXJlIHRoZSBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBhc3NlcnRpb24KKy8vIGFuZCB0aGVpciB2YWx1ZXMsIGFzIHN0cmluZ3MuICBGb3IgZXhhbXBsZSwgZm9yIEFTU0VSVF9FUShmb28sIGJhcikKKy8vIHdoZXJlIGZvbyBpcyA1IGFuZCBiYXIgaXMgNiwgd2UgaGF2ZToKKy8vCisvLyAgIGV4cGVjdGVkX2V4cHJlc3Npb246ICJmb28iCisvLyAgIGFjdHVhbF9leHByZXNzaW9uOiAgICJiYXIiCisvLyAgIGV4cGVjdGVkX3ZhbHVlOiAgICAgICI1IgorLy8gICBhY3R1YWxfdmFsdWU6ICAgICAgICAiNiIKKy8vCisvLyBUaGUgaWdub3JpbmdfY2FzZSBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhCisvLyAqX1NUUkNBU0VFUSouICBXaGVuIGl0J3MgdHJ1ZSwgdGhlIHN0cmluZyAiIChpZ25vcmluZyBjYXNlKSIgd2lsbAorLy8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KK0Fzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFjdHVhbF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGFjdHVhbF9leHByZXNzaW9uOworICBpZiAoYWN0dWFsX3ZhbHVlICE9IGFjdHVhbF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF92YWx1ZTsKKyAgfQorCisgIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9leHByZXNzaW9uOworICBpZiAoaWdub3JpbmdfY2FzZSkgeworICAgIG1zZyA8PCAiIChpZ25vcmluZyBjYXNlKSI7CisgIH0KKyAgaWYgKGV4cGVjdGVkX3ZhbHVlICE9IGV4cGVjdGVkX2V4cHJlc3Npb24pIHsKKyAgICBtc2cgPDwgIlxuV2hpY2ggaXM6ICIgPDwgZXhwZWN0ZWRfdmFsdWU7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1zZzsKK30KKworLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCitzdGQ6OnN0cmluZyBHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoCisgICAgY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBhc3NlcnRpb25fcmVzdWx0LAorICAgIGNvbnN0IGNoYXIqIGV4cHJlc3Npb25fdGV4dCwKKyAgICBjb25zdCBjaGFyKiBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlLAorICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZSkgeworICBjb25zdCBjaGFyKiBhY3R1YWxfbWVzc2FnZSA9IGFzc2VydGlvbl9yZXN1bHQubWVzc2FnZSgpOworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBleHByZXNzaW9uX3RleHQKKyAgICAgIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF9wcmVkaWNhdGVfdmFsdWU7CisgIGlmIChhY3R1YWxfbWVzc2FnZVswXSAhPSAnXDAnKQorICAgIG1zZyA8PCAiICgiIDw8IGFjdHVhbF9tZXNzYWdlIDw8ICIpIjsKKyAgbXNnIDw8ICJcbkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZTsKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCitBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcikgeworICBjb25zdCBkb3VibGUgZGlmZiA9IGZhYnModmFsMSAtIHZhbDIpOworICBpZiAoZGlmZiA8PSBhYnNfZXJyb3IpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgLy8gVE9ETyh3YW4pOiBkbyBub3QgcHJpbnQgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gaWYgaXQncworICAvLyBhbHJlYWR5IGEgbGl0ZXJhbC4KKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIiA8PCBleHByMSA8PCAiIGFuZCAiIDw8IGV4cHIyCisgICAgICA8PCAiIGlzICIgPDwgZGlmZiA8PCAiLCB3aGljaCBleGNlZWRzICIgPDwgYWJzX2Vycm9yX2V4cHIgPDwgIiwgd2hlcmVcbiIKKyAgICAgIDw8IGV4cHIxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMSA8PCAiLFxuIgorICAgICAgPDwgZXhwcjIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwyIDw8ICIsIGFuZFxuIgorICAgICAgPDwgYWJzX2Vycm9yX2V4cHIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCBhYnNfZXJyb3IgPDwgIi4iOworfQorCisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIEZsb2F0TEUoKSBhbmQgRG91YmxlTEUoKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IEZsb2F0aW5nUG9pbnRMRShjb25zdCBjaGFyKiBleHByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgdmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwyKSB7CisgIC8vIFJldHVybnMgc3VjY2VzcyBpZiB2YWwxIGlzIGxlc3MgdGhhbiB2YWwyLAorICBpZiAodmFsMSA8IHZhbDIpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgLy8gb3IgaWYgdmFsMSBpcyBhbG1vc3QgZXF1YWwgdG8gdmFsMi4KKyAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHModmFsMSksIHJocyh2YWwyKTsKKyAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICAvLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHR3byBjaGVja3Mgd2lsbCBib3RoIGZhaWwgaWYgZWl0aGVyIHZhbDEgb3IKKyAgLy8gdmFsMiBpcyBOYU4sIGFzIHRoZSBJRUVFIGZsb2F0aW5nLXBvaW50IHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQKKyAgLy8gYW55IHByZWRpY2F0ZSBpbnZvbHZpbmcgYSBOYU4gbXVzdCByZXR1cm4gZmFsc2UuCisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwxX3NzOworICB2YWwxX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICA8PCB2YWwxOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gdmFsMl9zczsKKyAgdmFsMl9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgPDwgdmFsMjsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpIDw9ICgiIDw8IGV4cHIyIDw8ICIpXG4iCisgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnZhbDFfc3MpIDw8ICIgdnMgIgorICAgICAgPDwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnZhbDJfc3MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitBc3NlcnRpb25SZXN1bHQgRmxvYXRMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdQb2ludExFPGZsb2F0PihleHByMSwgZXhwcjIsIHZhbDEsIHZhbDIpOworfQorCisvLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCisvLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KK0Fzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsIGRvdWJsZSB2YWwyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdQb2ludExFPGRvdWJsZT4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRIHdpdGggaW50IG9yIGVudW0KKy8vIGFyZ3VtZW50cy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpIHsKKyAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShhY3R1YWwsIGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisvLyBBU1NFUlRfPz8gYW5kIEVYUEVDVF8/PyB3aXRoIGludGVnZXIgb3IgZW51bSBhcmd1bWVudHMuICBJdCBpcyBoZXJlCisvLyBqdXN0IHRvIGF2b2lkIGNvcHktYW5kLXBhc3RlIG9mIHNpbWlsYXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhvcF9uYW1lLCBvcClcCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IHZhbDEsIEJpZ2dlc3RJbnQgdmFsMikge1wKKyAgaWYgKHZhbDEgb3AgdmFsMikge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpO1wKKyAgfSBlbHNlIHtcCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSBcCisgICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgIiAjb3AgIiAoIiA8PCBleHByMlwKKyAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMilcCisgICAgICAgIDw8ICIgdnMgIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMiwgdmFsMSk7XAorICB9XAorfQorCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9ORSB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xFIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTEUsIDw9KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMVCwgPCApCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HRSB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdFLCA+PSkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dUIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR1QsID4gKQorCisjdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpIHsKKyAgaWYgKFN0cmluZzo6Q1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpIHsKKyAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIHRydWUpOworfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSTkUuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKSB7CisgIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9IGVsc2UgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpLCBhY3R1YWw6IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczEgPDwgIlwiIHZzIFwiIiA8PCBzMiA8PCAiXCIiOworICB9Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRU5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMikgeworICBpZiAoIVN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhzMSwgczIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpIChpZ25vcmluZyBjYXNlKSwgYWN0dWFsOiBcIiIKKyAgICAgICAgPDwgczEgPDwgIlwiIHZzIFwiIiA8PCBzMiA8PCAiXCIiOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgSXNTdWJTdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKS4KKworLy8gVGhpcyBncm91cCBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSBpZmYgbmVlZGxlIGlzIGEKKy8vIHN1YnN0cmluZyBvZiBoYXlzdGFjay4gIE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYKKy8vIG9ubHkuCisKK2Jvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgaWYgKG5lZWRsZSA9PSBOVUxMIHx8IGhheXN0YWNrID09IE5VTEwpCisgICAgcmV0dXJuIG5lZWRsZSA9PSBoYXlzdGFjazsKKworICByZXR1cm4gc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpICE9IE5VTEw7Cit9CisKK2Jvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKKyAgaWYgKG5lZWRsZSA9PSBOVUxMIHx8IGhheXN0YWNrID09IE5VTEwpCisgICAgcmV0dXJuIG5lZWRsZSA9PSBoYXlzdGFjazsKKworICByZXR1cm4gd2Nzc3RyKGhheXN0YWNrLCBuZWVkbGUpICE9IE5VTEw7Cit9CisKKy8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgZWl0aGVyIDo6c3RkOjpzdHJpbmcgb3IgOjpzdGQ6OndzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK2Jvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IFN0cmluZ1R5cGUmIG5lZWRsZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7CisgIHJldHVybiBoYXlzdGFjay5maW5kKG5lZWRsZSkgIT0gU3RyaW5nVHlwZTo6bnBvczsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGVpdGhlciBJc1N1YnN0cmluZygpIG9yIElzTm90U3Vic3RyaW5nKCksCisvLyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcgcGFyYW1ldGVyLgorLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBjb25zdCBjaGFyKiwgY29uc3Qgd2NoYXJfdCosIDo6c3RkOjpzdHJpbmcsCisvLyBvciA6OnN0ZDo6d3N0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nSW1wbCgKKyAgICBib29sIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZywKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7CisgIGlmIChJc1N1YnN0cmluZ1ByZWQobmVlZGxlLCBoYXlzdGFjaykgPT0gZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nKQorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgY29uc3QgYm9vbCBpc193aWRlX3N0cmluZyA9IHNpemVvZihuZWVkbGVbMF0pID4gMTsKKyAgY29uc3QgY2hhciogY29uc3QgYmVnaW5fc3RyaW5nX3F1b3RlID0gaXNfd2lkZV9zdHJpbmcgPyAiTFwiIiA6ICJcIiI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJWYWx1ZSBvZjogIiA8PCBuZWVkbGVfZXhwciA8PCAiXG4iCisgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IG5lZWRsZSA8PCAiXCJcbiIKKyAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCAoZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nID8gIiIgOiAibm90ICIpCisgICAgICA8PCAiYSBzdWJzdHJpbmcgb2YgIiA8PCBoYXlzdGFja19leHByIDw8ICJcbiIKKyAgICAgIDw8ICJXaGljaCBpczogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgaGF5c3RhY2sgPDwgIlwiIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIElzU3Vic3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkgY2hlY2sgd2hldGhlciBuZWVkbGUgaXMgYQorLy8gc3Vic3RyaW5nIG9mIGhheXN0YWNrIChOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmCisvLyBvbmx5KSwgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhleSBmYWlsLgorCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgSXNIUkVTVUxUe1N1Y2Nlc3NGYWlsdXJlfSBwcmVkaWNhdGVzCitBc3NlcnRpb25SZXN1bHQgSFJFU1VMVEZhaWx1cmVIZWxwZXIoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKSB7ICAvLyBOT0xJTlQKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICAvLyBXaW5kb3dzIENFIGRvZXNuJ3Qgc3VwcG9ydCBGb3JtYXRNZXNzYWdlLgorICBjb25zdCBjaGFyIGVycm9yX3RleHRbXSA9ICIiOworCisjIGVsc2UKKworICAvLyBMb29rcyB1cCB0aGUgaHVtYW4tcmVhZGFibGUgc3lzdGVtIG1lc3NhZ2UgZm9yIHRoZSBIUkVTVUxUIGNvZGUKKyAgLy8gYW5kIHNpbmNlIHdlJ3JlIG5vdCBwYXNzaW5nIGFueSBwYXJhbXMgdG8gRm9ybWF0TWVzc2FnZSwgd2UgZG9uJ3QKKyAgLy8gd2FudCBpbnNlcnRzIGV4cGFuZGVkLgorICBjb25zdCBEV09SRCBrRmxhZ3MgPSBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8CisgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTOworICBjb25zdCBEV09SRCBrQnVmU2l6ZSA9IDQwOTY7ICAvLyBTdHJpbmc6OkZvcm1hdCBjYW4ndCBleGNlZWQgdGhpcyBsZW5ndGguCisgIC8vIEdldHMgdGhlIHN5c3RlbSdzIGh1bWFuIHJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGlzIEhSRVNVTFQuCisgIGNoYXIgZXJyb3JfdGV4dFtrQnVmU2l6ZV0gPSB7ICdcMCcgfTsKKyAgRFdPUkQgbWVzc2FnZV9sZW5ndGggPSA6OkZvcm1hdE1lc3NhZ2VBKGtGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBzb3VyY2UsIHdlJ3JlIGFza2luZyBzeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyLCAgLy8gdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gbm8gbGluZSB3aWR0aCByZXN0cmljdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RleHQsICAvLyBvdXRwdXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQnVmU2l6ZSwgIC8vIGJ1ZiBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgIC8vIG5vIGFyZ3VtZW50cyBmb3IgaW5zZXJ0cworICAvLyBUcmltcyB0YWlsaW5nIHdoaXRlIHNwYWNlIChGb3JtYXRNZXNzYWdlIGxlYXZlcyBhIHRyYWlsaW5nIGNyLWxmKQorICBmb3IgKDsgbWVzc2FnZV9sZW5ndGggJiYgSXNTcGFjZShlcnJvcl90ZXh0W21lc3NhZ2VfbGVuZ3RoIC0gMV0pOworICAgICAgICAgIC0tbWVzc2FnZV9sZW5ndGgpIHsKKyAgICBlcnJvcl90ZXh0W21lc3NhZ2VfbGVuZ3RoIC0gMV0gPSAnXDAnOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyb3JfaGV4KFN0cmluZzo6Rm9ybWF0KCIweCUwOFggIiwgaHIpKTsKKyAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBlcnJvcl9oZXggPDwgZXJyb3JfdGV4dCA8PCAiXG4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgInN1Y2NlZWRzIiwgaHIpOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLCBsb25nIGhyKSB7ICAvLyBOT0xJTlQKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisgIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAiZmFpbHMiLCBocik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgVW5pY29kZSB0ZXh0ICh3aWRlIHN0cmluZ3MpIGluCisvLyBVVEYtOC4KKworLy8gQSBVbmljb2RlIGNvZGUtcG9pbnQgY2FuIGhhdmUgdXB0byAyMSBiaXRzLCBhbmQgaXMgZW5jb2RlZCBpbiBVVEYtOAorLy8gbGlrZSB0aGlzOgorLy8KKy8vIENvZGUtcG9pbnQgbGVuZ3RoICAgRW5jb2RpbmcKKy8vICAgMCAtICA3IGJpdHMgICAgICAgMHh4eHh4eHgKKy8vICAgOCAtIDExIGJpdHMgICAgICAgMTEweHh4eHggMTB4eHh4eHgKKy8vICAxMiAtIDE2IGJpdHMgICAgICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKy8vICAxNyAtIDIxIGJpdHMgICAgICAgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIG9uZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDEgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAgNykgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgdHdvLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MiA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg1ICsgNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHRocmVlLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MyA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg0ICsgMio2KSkgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgZm91ci1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDQgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoMyArIDMqNikpIC0gMTsKKworLy8gQ2hvcHMgb2ZmIHRoZSBuIGxvd2VzdCBiaXRzIGZyb20gYSBiaXQgcGF0dGVybi4gIFJldHVybnMgdGhlIG4KKy8vIGxvd2VzdCBiaXRzLiAgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIG9yaWdpbmFsIGJpdCBwYXR0ZXJuIHdpbGwgYmUKKy8vIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IG4gYml0cy4KK2lubGluZSBVSW50MzIgQ2hvcExvd0JpdHMoVUludDMyKiBiaXRzLCBpbnQgbikgeworICBjb25zdCBVSW50MzIgbG93X2JpdHMgPSAqYml0cyAmICgoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCBuKSAtIDEpOworICAqYml0cyA+Pj0gbjsKKyAgcmV0dXJuIGxvd19iaXRzOworfQorCisvLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQorLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCisvLyBUaGUgb3V0cHV0IGJ1ZmZlciBzdHIgbXVzdCBjb250YWludCBhdCBsZWFzdCAzMiBjaGFyYWN0ZXJzLgorLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBidWZmZXIuCisvLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuCitjaGFyKiBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQsIGNoYXIqIHN0cikgeworICBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MSkgeworICAgIHN0clsxXSA9ICdcMCc7CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweHh4eHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDIpIHsKKyAgICBzdHJbMl0gPSAnXDAnOworICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEMwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMHh4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MykgeworICAgIHN0clszXSA9ICdcMCc7CisgICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEUwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMTB4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50NCkgeworICAgIHN0cls0XSA9ICdcMCc7CisgICAgc3RyWzNdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhGMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTExMHh4eAorICB9IGVsc2UgeworICAgIC8vIFRoZSBsb25nZXN0IHN0cmluZyBTdHJpbmc6OkZvcm1hdCBjYW4gcHJvZHVjZSB3aGVuIGludm9rZWQKKyAgICAvLyB3aXRoIHRoZXNlIHBhcmFtZXRlcnMgaXMgMjggY2hhcmFjdGVyIGxvbmcgKG5vdCBpbmNsdWRpbmcKKyAgICAvLyB0aGUgdGVybWluYXRpbmcgbnVsIGNoYXJhY3RlcikuIFdlIGFyZSBhc2tpbmcgZm9yIDMyIGNoYXJhY3RlcgorICAgIC8vIGJ1ZmZlciBqdXN0IGluIGNhc2UuIFRoaXMgaXMgYWxzbyBlbm91Z2ggZm9yIHN0cm5jcHkgdG8KKyAgICAvLyBudWxsLXRlcm1pbmF0ZSB0aGUgZGVzdGluYXRpb24gc3RyaW5nLgorICAgIHBvc2l4OjpTdHJOQ3B5KAorICAgICAgICBzdHIsIFN0cmluZzo6Rm9ybWF0KCIoSW52YWxpZCBVbmljb2RlIDB4JVgpIiwgY29kZV9wb2ludCkuY19zdHIoKSwgMzIpOworICAgIHN0clszMV0gPSAnXDAnOyAgLy8gTWFrZXMgc3VyZSBubyBjaGFuZ2UgaW4gdGhlIGZvcm1hdCB0byBzdHJuY3B5IGxlYXZlcworICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3VsdCB1bnRlcm1pbmF0ZWQuCisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGUgdGhlIHN5c3RlbQorLy8gdXNlcyBVVEYtMTYgZm9yIHdpZGUgc3RyaW5nIGVuY29kaW5nLiBBbGwgc3VwcG9ydGVkIHN5c3RlbXMKKy8vIHdpdGggMTYgYml0IHdjaGFyX3QgKFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykgZG8gdXNlIFVURi0xNi4KKworLy8gRGV0ZXJtaW5lcyBpZiB0aGUgYXJndW1lbnRzIGNvbnN0aXR1dGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisvLyBhbmQgdGh1cyBzaG91bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIHVzaW5nIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIuCitpbmxpbmUgYm9vbCBJc1V0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LCB3Y2hhcl90IHNlY29uZCkgeworICByZXR1cm4gc2l6ZW9mKHdjaGFyX3QpID09IDIgJiYKKyAgICAgIChmaXJzdCAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChzZWNvbmQgJiAweEZDMDApID09IDB4REMwMDsKK30KKworLy8gQ3JlYXRlcyBhIFVuaWNvZGUgY29kZSBwb2ludCBmcm9tIFVURjE2IHN1cnJvZ2F0ZSBwYWlyLgoraW5saW5lIFVJbnQzMiBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCBzZWNvbmQpIHsKKyAgY29uc3QgVUludDMyIG1hc2sgPSAoMSA8PCAxMCkgLSAxOworICByZXR1cm4gKHNpemVvZih3Y2hhcl90KSA9PSAyKSA/CisgICAgICAoKChmaXJzdCAmIG1hc2spIDw8IDEwKSB8IChzZWNvbmQgJiBtYXNrKSkgKyAweDEwMDAwIDoKKyAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgY29uZGl0aW9uIGlzCisgICAgICAvLyBmYWxzZSwgYnV0IHdlIHByb3ZpZGUgYSBzZW5zaWJsZSBkZWZhdWx0IGluIGNhc2UgaXQgaXMuCisgICAgICBzdGF0aWNfY2FzdDxVSW50MzI+KGZpcnN0KTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBUaGUgd2lkZSBzdHJpbmcgaXMgYXNzdW1lZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZW5jb2Rpbmc6CisvLyAgIFVURi0xNiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gMiAob24gV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKQorLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQorLy8gUGFyYW1ldGVyIHN0ciBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuCisvLyBQYXJhbWV0ZXIgbnVtX2NoYXJzIG1heSBhZGRpdGlvbmFsbHkgbGltaXQgdGhlIG51bWJlcgorLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nCisvLyBzaG91bGQgYmUgcHJvY2Vzc2VkLgorLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50cworLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLiBJZiB0aGUgc3RyaW5nIGlzIGluIFVURjE2IGVuY29kaW5nCisvLyBhbmQgY29udGFpbnMgaW52YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLCB2YWx1ZXMgaW4gdGhvc2UgcGFpcnMKKy8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4KK3N0ZDo6c3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKSB7CisgIGlmIChudW1fY2hhcnMgPT0gLTEpCisgICAgbnVtX2NoYXJzID0gc3RhdGljX2Nhc3Q8aW50Pih3Y3NsZW4oc3RyKSk7CisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NoYXJzOyArK2kpIHsKKyAgICBVSW50MzIgdW5pY29kZV9jb2RlX3BvaW50OworCisgICAgaWYgKHN0cltpXSA9PSBMJ1wwJykgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChpICsgMSA8IG51bV9jaGFycyAmJiBJc1V0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sIHN0cltpICsgMV0pKSB7CisgICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyKHN0cltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyW2kgKyAxXSk7CisgICAgICBpKys7CisgICAgfSBlbHNlIHsKKyAgICAgIHVuaWNvZGVfY29kZV9wb2ludCA9IHN0YXRpY19jYXN0PFVJbnQzMj4oc3RyW2ldKTsKKyAgICB9CisKKyAgICBjaGFyIGJ1ZmZlclszMl07ICAvLyBDb2RlUG9pbnRUb1V0ZjggcmVxdWlyZXMgYSBidWZmZXIgdGhpcyBiaWcuCisgICAgc3RyZWFtIDw8IENvZGVQb2ludFRvVXRmOCh1bmljb2RlX2NvZGVfcG9pbnQsIGJ1ZmZlcik7CisgIH0KKyAgcmV0dXJuIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pOworfQorCisvLyBDb252ZXJ0cyBhIHdpZGUgQyBzdHJpbmcgdG8gYW4gc3RkOjpzdHJpbmcgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorLy8gTlVMTCB3aWxsIGJlIGNvbnZlcnRlZCB0byAiKG51bGwpIi4KK3N0ZDo6c3RyaW5nIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKGNvbnN0IHdjaGFyX3QgKiB3aWRlX2Nfc3RyKSB7CisgIGlmICh3aWRlX2Nfc3RyID09IE5VTEwpICByZXR1cm4gIihudWxsKSI7CisKKyAgcmV0dXJuIGludGVybmFsOjpXaWRlU3RyaW5nVG9VdGY4KHdpZGVfY19zdHIsIC0xKTsKK30KKworLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUKKy8vIGNvbnRlbnQuCisvLworLy8gVW5saWtlIHdjc2NtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAorLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCAqIGxocywgY29uc3Qgd2NoYXJfdCAqIHJocykgeworICBpZiAobGhzID09IE5VTEwpIHJldHVybiByaHMgPT0gTlVMTDsKKworICBpZiAocmhzID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gd2NzY21wKGxocywgcmhzKSA9PSAwOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSRVEgb24gd2lkZSBzdHJpbmdzLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogYWN0dWFsKSB7CisgIGlmIChTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMikgeworICBpZiAoIVN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFByaW50VG9TdHJpbmcoczEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB2cyAiIDw8IFByaW50VG9TdHJpbmcoczIpOworfQorCisvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUKKy8vIHRoZSBzYW1lIGNvbnRlbnQuCisvLworLy8gVW5saWtlIHN0cmNhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCisvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciAqIGxocywgY29uc3QgY2hhciAqIHJocykgeworICBpZiAobGhzID09IE5VTEwpCisgICAgcmV0dXJuIHJocyA9PSBOVUxMOworICBpZiAocmhzID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gcG9zaXg6OlN0ckNhc2VDbXAobGhzLCByaHMpID09IDA7Cit9CisKKyAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5CisgIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHdjc2Nhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCisgIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIC8vIE5COiBUaGUgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgc2xpZ2h0bHkgZGlmZmVyLgorICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQorICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcAorICAvLyB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgorICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlCisgIC8vIGN1cnJlbnQgbG9jYWxlLgorYm9vbCBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBfd2NzaWNtcChsaHMsIHJocykgPT0gMDsKKyNlbGlmIEdURVNUX09TX0xJTlVYICYmICFHVEVTVF9PU19MSU5VWF9BTkRST0lECisgIHJldHVybiB3Y3NjYXNlY21wKGxocywgcmhzKSA9PSAwOworI2Vsc2UKKyAgLy8gQW5kcm9pZCwgTWFjIE9TIFggYW5kIEN5Z3dpbiBkb24ndCBkZWZpbmUgd2NzY2FzZWNtcC4KKyAgLy8gT3RoZXIgdW5rbm93biBPU2VzIG1heSBub3QgZGVmaW5lIGl0IGVpdGhlci4KKyAgd2ludF90IGxlZnQsIHJpZ2h0OworICBkbyB7CisgICAgbGVmdCA9IHRvd2xvd2VyKCpsaHMrKyk7CisgICAgcmlnaHQgPSB0b3dsb3dlcigqcmhzKyspOworICB9IHdoaWxlIChsZWZ0ICYmIGxlZnQgPT0gcmlnaHQpOworICByZXR1cm4gbGVmdCA9PSByaWdodDsKKyNlbmRpZiAgLy8gT1Mgc2VsZWN0b3IKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiBzdHIgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGlnbm9yaW5nIGNhc2UuCisvLyBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4LgorYm9vbCBTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpIHsKKyAgY29uc3Qgc2l6ZV90IHN0cl9sZW4gPSBzdHIubGVuZ3RoKCk7CisgIGNvbnN0IHNpemVfdCBzdWZmaXhfbGVuID0gc3VmZml4Lmxlbmd0aCgpOworICByZXR1cm4gKHN0cl9sZW4gPj0gc3VmZml4X2xlbikgJiYKKyAgICAgICAgIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoc3RyLmNfc3RyKCkgKyBzdHJfbGVuIC0gc3VmZml4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4LmNfc3RyKCkpOworfQorCisvLyBGb3JtYXRzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYW4gc3RkOjpzdHJpbmcsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdAorLy8gc3BlYyBzdHJpbmcgYXMgZm9yIHByaW50Zi4KKy8vCisvLyBXZSBkbyBub3QgdXNlIHRoZSBTdHJpbmdQcmludGYgY2xhc3MgYXMgaXQgaXMgbm90IHVuaXZlcnNhbGx5CisvLyBhdmFpbGFibGUuCisvLworLy8gVGhlIHJlc3VsdCBpcyBsaW1pdGVkIHRvIDQwOTYgY2hhcmFjdGVycyAoaW5jbHVkaW5nIHRoZSB0YWlsaW5nIDApLgorLy8gSWYgNDA5NiBjaGFyYWN0ZXJzIGFyZSBub3QgZW5vdWdoIHRvIGZvcm1hdCB0aGUgaW5wdXQsIG9yIGlmCisvLyB0aGVyZSdzIGFuIGVycm9yLCAiPGZvcm1hdHRpbmcgZXJyb3Igb3IgYnVmZmVyIGV4Y2VlZGVkPiIgaXMKKy8vIHJldHVybmVkLgorc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXQoY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKworICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gc2l6ZW9mKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSk7CisKKyAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgdnNucHJpbnRmKCksIHNvIHdlIHdhbnQgdG8gc3VwcHJlc3Mgd2FybmluZworICAvLyA0OTk2IChkZXByZWNhdGVkIGZ1bmN0aW9uKSB0aGVyZS4KKyNpZmRlZiBfTVNDX1ZFUiAgLy8gV2UgYXJlIHVzaW5nIE1TVkMuCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDk5Ni4KKworICBjb25zdCBpbnQgc2l6ZSA9IHZzbnByaW50ZihidWZmZXIsIGtCdWZmZXJTaXplLCBmb3JtYXQsIGFyZ3MpOworCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2Vsc2UgIC8vIFdlIGFyZSBub3QgdXNpbmcgTVNWQy4KKyAgY29uc3QgaW50IHNpemUgPSB2c25wcmludGYoYnVmZmVyLCBrQnVmZmVyU2l6ZSwgZm9ybWF0LCBhcmdzKTsKKyNlbmRpZiAgLy8gX01TQ19WRVIKKyAgdmFfZW5kKGFyZ3MpOworCisgIC8vIHZzbnByaW50ZigpJ3MgYmVoYXZpb3IgaXMgbm90IHBvcnRhYmxlLiAgV2hlbiB0aGUgYnVmZmVyIGlzIG5vdAorICAvLyBiaWcgZW5vdWdoLCBpdCByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaW4gTVNWQywgYW5kIHJldHVybnMgdGhlCisgIC8vIG5lZWRlZCBidWZmZXIgc2l6ZSBvbiBMaW51eC4gIFdoZW4gdGhlcmUgaXMgYW4gb3V0cHV0IGVycm9yLCBpdAorICAvLyBhbHdheXMgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLiAgRm9yIHNpbXBsaWNpdHksIHdlIGx1bXAgdGhlIHR3bworICAvLyBlcnJvciBjYXNlcyB0b2dldGhlci4KKyAgaWYgKHNpemUgPCAwIHx8IHNpemUgPj0ga0J1ZmZlclNpemUpIHsKKyAgICByZXR1cm4gIjxmb3JtYXR0aW5nIGVycm9yIG9yIGJ1ZmZlciBleGNlZWRlZD4iOworICB9IGVsc2UgeworICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmZXIsIHNpemUpOworICB9Cit9CisKKy8vIENvbnZlcnRzIHRoZSBidWZmZXIgaW4gYSBzdHJpbmdzdHJlYW0gdG8gYW4gc3RkOjpzdHJpbmcsIGNvbnZlcnRpbmcgTlVMCisvLyBieXRlcyB0byAiXFwwIiBhbG9uZyB0aGUgd2F5Lgorc3RkOjpzdHJpbmcgU3RyaW5nU3RyZWFtVG9TdHJpbmcoOjpzdGQ6OnN0cmluZ3N0cmVhbSogc3MpIHsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyID0gc3MtPnN0cigpOworICBjb25zdCBjaGFyKiBjb25zdCBzdGFydCA9IHN0ci5jX3N0cigpOworICBjb25zdCBjaGFyKiBjb25zdCBlbmQgPSBzdGFydCArIHN0ci5sZW5ndGgoKTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKDIgKiAoZW5kIC0gc3RhcnQpKTsKKyAgZm9yIChjb25zdCBjaGFyKiBjaCA9IHN0YXJ0OyBjaCAhPSBlbmQ7ICsrY2gpIHsKKyAgICBpZiAoKmNoID09ICdcMCcpIHsKKyAgICAgIHJlc3VsdCArPSAiXFwwIjsgIC8vIFJlcGxhY2VzIE5VTCB3aXRoICJcXDAiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gKmNoOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuCitzdGQ6OnN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgZ3Rlc3RfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpIHsKKyAgLy8gQXBwZW5kcyB0aGUgdXNlciBtZXNzYWdlIGlmIGl0J3Mgbm9uLWVtcHR5LgorICBjb25zdCBzdGQ6OnN0cmluZyB1c2VyX21zZ19zdHJpbmcgPSB1c2VyX21zZy5HZXRTdHJpbmcoKTsKKyAgaWYgKHVzZXJfbXNnX3N0cmluZy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIGd0ZXN0X21zZzsKKyAgfQorCisgIHJldHVybiBndGVzdF9tc2cgKyAiXG4iICsgdXNlcl9tc2dfc3RyaW5nOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gY2xhc3MgVGVzdFJlc3VsdAorCisvLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCitUZXN0UmVzdWx0OjpUZXN0UmVzdWx0KCkKKyAgICA6IGRlYXRoX3Rlc3RfY291bnRfKDApLAorICAgICAgZWxhcHNlZF90aW1lXygwKSB7Cit9CisKKy8vIEQndG9yLgorVGVzdFJlc3VsdDo6flRlc3RSZXN1bHQoKSB7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuCisvLyByYW5nZSBmcm9tIDAgdG8gdG90YWxfcGFydF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwKKy8vIGFib3J0cyB0aGUgcHJvZ3JhbS4KK2NvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UmVzdWx0OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3QgeworICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbF9wYXJ0X2NvdW50KCkpCisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfLmF0KGkpOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzIHRoZQorLy8gcHJvZ3JhbS4KK2NvbnN0IFRlc3RQcm9wZXJ0eSYgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdCB7CisgIGlmIChpIDwgMCB8fCBpID49IHRlc3RfcHJvcGVydHlfY291bnQoKSkKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfLmF0KGkpOworfQorCisvLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLgordm9pZCBUZXN0UmVzdWx0OjpDbGVhclRlc3RQYXJ0UmVzdWx0cygpIHsKKyAgdGVzdF9wYXJ0X3Jlc3VsdHNfLmNsZWFyKCk7Cit9CisKKy8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0Lgordm9pZCBUZXN0UmVzdWx0OjpBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18ucHVzaF9iYWNrKHRlc3RfcGFydF9yZXN1bHQpOworfQorCisvLyBBZGRzIGEgdGVzdCBwcm9wZXJ0eSB0byB0aGUgbGlzdC4gSWYgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSBhcyB0aGUKKy8vIHN1cHBsaWVkIHByb3BlcnR5IGlzIGFscmVhZHkgcmVwcmVzZW50ZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIHRlc3RfcHJvcGVydHkKKy8vIHJlcGxhY2VzIHRoZSBvbGQgdmFsdWUgZm9yIHRoYXQga2V5Lgordm9pZCBUZXN0UmVzdWx0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKKyAgaWYgKCFWYWxpZGF0ZVRlc3RQcm9wZXJ0eSh0ZXN0X3Byb3BlcnR5KSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJnRlc3RfcHJvcGVyaXRlc19tdXRleF8pOworICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+OjppdGVyYXRvciBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9CisgICAgICBzdGQ6OmZpbmRfaWYodGVzdF9wcm9wZXJ0aWVzXy5iZWdpbigpLCB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJcyh0ZXN0X3Byb3BlcnR5LmtleSgpKSk7CisgIGlmIChwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9PSB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpKSB7CisgICAgdGVzdF9wcm9wZXJ0aWVzXy5wdXNoX2JhY2sodGVzdF9wcm9wZXJ0eSk7CisgICAgcmV0dXJuOworICB9CisgIHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5LT5TZXRWYWx1ZSh0ZXN0X3Byb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBBZGRzIGEgZmFpbHVyZSBpZiB0aGUga2V5IGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIG9mIEdvb2dsZSBUZXN0CisvLyB0ZXN0Y2FzZSB0YWdzLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4KK2Jvb2wgVGVzdFJlc3VsdDo6VmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkgPSB0ZXN0X3Byb3BlcnR5LmtleSgpOworICBpZiAoa2V5ID09ICJuYW1lIiB8fCBrZXkgPT0gInN0YXR1cyIgfHwga2V5ID09ICJ0aW1lIiB8fCBrZXkgPT0gImNsYXNzbmFtZSIpIHsKKyAgICBBRERfRkFJTFVSRSgpCisgICAgICAgIDw8ICJSZXNlcnZlZCBrZXkgdXNlZCBpbiBSZWNvcmRQcm9wZXJ0eSgpOiAiCisgICAgICAgIDw8IGtleQorICAgICAgICA8PCAiICgnbmFtZScsICdzdGF0dXMnLCAndGltZScsIGFuZCAnY2xhc3NuYW1lJyBhcmUgcmVzZXJ2ZWQgYnkgIgorICAgICAgICA8PCBHVEVTVF9OQU1FXyA8PCAiKSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBDbGVhcnMgdGhlIG9iamVjdC4KK3ZvaWQgVGVzdFJlc3VsdDo6Q2xlYXIoKSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOworICB0ZXN0X3Byb3BlcnRpZXNfLmNsZWFyKCk7CisgIGRlYXRoX3Rlc3RfY291bnRfID0gMDsKKyAgZWxhcHNlZF90aW1lXyA9IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLgorYm9vbCBUZXN0UmVzdWx0OjpGYWlsZWQoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoR2V0VGVzdFBhcnRSZXN1bHQoaSkuZmFpbGVkKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQuZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzRmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorc3RhdGljIGJvb2wgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmV0dXJuIHJlc3VsdC5ub25mYXRhbGx5X2ZhaWxlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0UmVzdWx0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKSA+IDA7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCisvLyBvZiBzdWNjZXNzZnVsIHRlc3QgcGFydHMgYW5kIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgcGFydHMuCitpbnQgVGVzdFJlc3VsdDo6dG90YWxfcGFydF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wYXJ0X3Jlc3VsdHNfLnNpemUoKSk7Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLgoraW50IFRlc3RSZXN1bHQ6OnRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcHJvcGVydGllc18uc2l6ZSgpKTsKK30KKworLy8gY2xhc3MgVGVzdAorCisvLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCisKKy8vIFRoZSBjJ3RvciBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncy4KK1Rlc3Q6OlRlc3QoKQorICAgIDogZ3Rlc3RfZmxhZ19zYXZlcl8obmV3IGludGVybmFsOjpHVGVzdEZsYWdTYXZlcikgeworfQorCisvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitUZXN0Ojp+VGVzdCgpIHsKKyAgZGVsZXRlIGd0ZXN0X2ZsYWdfc2F2ZXJfOworfQorCisvLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCisvLworLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCit2b2lkIFRlc3Q6OlNldFVwKCkgeworfQorCisvLyBUZWFycyBkb3duIHRoZSB0ZXN0IGZpeHR1cmUuCisvLworLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCit2b2lkIFRlc3Q6OlRlYXJEb3duKCkgeworfQorCisvLyBBbGxvd3MgdXNlciBzdXBwbGllZCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgcmVjb3JkZWQgZm9yIGxhdGVyIG91dHB1dC4KK3ZvaWQgVGVzdDo6UmVjb3JkUHJvcGVydHkoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UmVjb3JkUHJvcGVydHlGb3JDdXJyZW50VGVzdChrZXksIHZhbHVlKTsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgaW50IHZhbHVlKSB7CisgIE1lc3NhZ2UgdmFsdWVfbWVzc2FnZTsKKyAgdmFsdWVfbWVzc2FnZSA8PCB2YWx1ZTsKKyAgUmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit2b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBmcmllbmQgb2YgVW5pdFRlc3QgYW5kIGFzIHN1Y2ggaGFzIGFjY2VzcyB0bworICAvLyBBZGRUZXN0UGFydFJlc3VsdC4KKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPkFkZFRlc3RQYXJ0UmVzdWx0KAorICAgICAgcmVzdWx0X3R5cGUsCisgICAgICBOVUxMLCAgLy8gTm8gaW5mbyBhYm91dCB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgIC0xLCAgICAvLyBXZSBoYXZlIG5vIGluZm8gb24gd2hpY2ggbGluZSBjYXVzZWQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgIG1lc3NhZ2UsCisgICAgICAiIik7ICAgLy8gTm8gc3RhY2sgdHJhY2UsIGVpdGhlci4KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEdvb2dsZSBUZXN0IHJlcXVpcmVzIGFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgdG8gdXNlIHRoZSBzYW1lIHRlc3QKKy8vIGZpeHR1cmUgY2xhc3MuICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY3VycmVudCB0ZXN0IGhhcyB0aGUKKy8vIHNhbWUgZml4dHVyZSBjbGFzcyBhcyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuICBJZgorLy8geWVzLCBpdCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBpdCBnZW5lcmF0ZXMgYSBHb29nbGUgVGVzdCBmYWlsdXJlIGFuZAorLy8gcmV0dXJucyBmYWxzZS4KK2Jvb2wgVGVzdDo6SGFzU2FtZUZpeHR1cmVDbGFzcygpIHsKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IGltcGwtPmN1cnJlbnRfdGVzdF9jYXNlKCk7CisKKyAgLy8gSW5mbyBhYm91dCB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBmaXJzdF90ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbMF07CisgIGNvbnN0IGludGVybmFsOjpUeXBlSWQgZmlyc3RfZml4dHVyZV9pZCA9IGZpcnN0X3Rlc3RfaW5mby0+Zml4dHVyZV9jbGFzc19pZF87CisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpcnN0X3Rlc3RfbmFtZSA9IGZpcnN0X3Rlc3RfaW5mby0+bmFtZSgpOworCisgIC8vIEluZm8gYWJvdXQgdGhlIGN1cnJlbnQgdGVzdC4KKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRoaXNfdGVzdF9pbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCB0aGlzX2ZpeHR1cmVfaWQgPSB0aGlzX3Rlc3RfaW5mby0+Zml4dHVyZV9jbGFzc19pZF87CisgIGNvbnN0IGNoYXIqIGNvbnN0IHRoaXNfdGVzdF9uYW1lID0gdGhpc190ZXN0X2luZm8tPm5hbWUoKTsKKworICBpZiAodGhpc19maXh0dXJlX2lkICE9IGZpcnN0X2ZpeHR1cmVfaWQpIHsKKyAgICAvLyBJcyB0aGUgZmlyc3QgdGVzdCBkZWZpbmVkIHVzaW5nIFRFU1Q/CisgICAgY29uc3QgYm9vbCBmaXJzdF9pc19URVNUID0gZmlyc3RfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOworICAgIC8vIElzIHRoaXMgdGVzdCBkZWZpbmVkIHVzaW5nIFRFU1Q/CisgICAgY29uc3QgYm9vbCB0aGlzX2lzX1RFU1QgPSB0aGlzX2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKKworICAgIGlmIChmaXJzdF9pc19URVNUIHx8IHRoaXNfaXNfVEVTVCkgeworICAgICAgLy8gVGhlIHVzZXIgbWl4ZWQgVEVTVCBhbmQgVEVTVF9GIGluIHRoaXMgdGVzdCBjYXNlIC0gd2UnbGwgdGVsbAorICAgICAgLy8gaGltL2hlciBob3cgdG8gZml4IGl0LgorCisgICAgICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBURVNUIGFuZCB0aGUgbmFtZSBvZiB0aGUgVEVTVF9GLiAgTm90ZQorICAgICAgLy8gdGhhdCBmaXJzdF9pc19URVNUIGFuZCB0aGlzX2lzX1RFU1QgY2Fubm90IGJvdGggYmUgdHJ1ZSwgYXMKKyAgICAgIC8vIHRoZSBmaXh0dXJlIElEcyBhcmUgZGlmZmVyZW50IGZvciB0aGUgdHdvIHRlc3RzLgorICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9uYW1lID0KKyAgICAgICAgICBmaXJzdF9pc19URVNUID8gZmlyc3RfdGVzdF9uYW1lIDogdGhpc190ZXN0X25hbWU7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBURVNUX0ZfbmFtZSA9CisgICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IHRoaXNfdGVzdF9uYW1lIDogZmlyc3RfdGVzdF9uYW1lOworCisgICAgICBBRERfRkFJTFVSRSgpCisgICAgICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICAgICAgPDwgImNsYXNzLCBzbyBtaXhpbmcgVEVTVF9GIGFuZCBURVNUIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBpc1xuIgorICAgICAgICAgIDw8ICJpbGxlZ2FsLiAgSW4gdGVzdCBjYXNlICIgPDwgdGhpc190ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkKKyAgICAgICAgICA8PCAiLFxuIgorICAgICAgICAgIDw8ICJ0ZXN0ICIgPDwgVEVTVF9GX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1RfRiBidXRcbiIKKyAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfbmFtZSA8PCAiIGlzIGRlZmluZWQgdXNpbmcgVEVTVC4gIFlvdSBwcm9iYWJseVxuIgorICAgICAgICAgIDw8ICJ3YW50IHRvIGNoYW5nZSB0aGUgVEVTVCB0byBURVNUX0Ygb3IgbW92ZSBpdCB0byBhbm90aGVyIHRlc3RcbiIKKyAgICAgICAgICA8PCAiY2FzZS4iOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgdXNlciBkZWZpbmVkIHR3byBmaXh0dXJlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGluCisgICAgICAvLyB0d28gbmFtZXNwYWNlcyAtIHdlJ2xsIHRlbGwgaGltL2hlciBob3cgdG8gZml4IGl0LgorICAgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgICAgIDw8ICJjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSAiCisgICAgICAgICAgPDwgdGhpc190ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkgPDwgIixcbiIKKyAgICAgICAgICA8PCAieW91IGRlZmluZWQgdGVzdCAiIDw8IGZpcnN0X3Rlc3RfbmFtZQorICAgICAgICAgIDw8ICIgYW5kIHRlc3QgIiA8PCB0aGlzX3Rlc3RfbmFtZSA8PCAiXG4iCisgICAgICAgICAgPDwgInVzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWZcbiIKKyAgICAgICAgICA8PCAidGhlIHR3byBjbGFzc2VzIGFyZSBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIG9yIHRyYW5zbGF0aW9uXG4iCisgICAgICAgICAgPDwgInVuaXRzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuICBZb3Ugc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBvbmVcbiIKKyAgICAgICAgICA8PCAib2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLiI7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjaWYgR1RFU1RfSEFTX1NFSAorCisvLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuICBUaGlzCisvLyBmdW5jdGlvbiByZXR1cm5zIGl0cyByZXN1bHQgdmlhIGFuIG91dHB1dCBwYXJhbWV0ZXIgcG9pbnRlciBiZWNhdXNlIFZDKysKKy8vIHByb2hpYml0cyBjcmVhdGlvbiBvZiBvYmplY3RzIHdpdGggZGVzdHJ1Y3RvcnMgb24gc3RhY2sgaW4gZnVuY3Rpb25zCisvLyB1c2luZyBfX3RyeSAoc2VlIGVycm9yIEMyNzEyKS4KK3N0YXRpYyBzdGQ6OnN0cmluZyogRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZShEV09SRCBleGNlcHRpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICBNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UgPDwgIlNFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4IiA8PCBzdGQ6OnNldGJhc2UoMTYpIDw8CisgICAgZXhjZXB0aW9uX2NvZGUgPDwgc3RkOjpzZXRiYXNlKDEwKSA8PCAiIHRocm93biBpbiAiIDw8IGxvY2F0aW9uIDw8ICIuIjsKKworICByZXR1cm4gbmV3IHN0ZDo6c3RyaW5nKG1lc3NhZ2UuR2V0U3RyaW5nKCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIEFkZHMgYW4gImV4Y2VwdGlvbiB0aHJvd24iIGZhdGFsIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyAgTWVzc2FnZSBtZXNzYWdlOworICBpZiAoZGVzY3JpcHRpb24gIT0gTlVMTCkgeworICAgIG1lc3NhZ2UgPDwgIkMrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiBcIiIgPDwgZGVzY3JpcHRpb24gPDwgIlwiIjsKKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlIDw8ICJVbmtub3duIEMrKyBleGNlcHRpb24iOworICB9CisgIG1lc3NhZ2UgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7CisKKyAgcmV0dXJuIG1lc3NhZ2UuR2V0U3RyaW5nKCk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpOworCisvLyBBIGZhaWxlZCBHb29nbGUgVGVzdCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gb2YgdGhpcyB0eXBlIHdoZW4KKy8vIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgaXMgdHJ1ZSAoaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCkuICBXZQorLy8gZGVyaXZlIGl0IGZyb20gc3RkOjpydW50aW1lX2Vycm9yLCB3aGljaCBpcyBmb3IgZXJyb3JzIHByZXN1bWFibHkKKy8vIGRldGVjdGFibGUgb25seSBhdCBydW4gdGltZS4gIFNpbmNlIHN0ZDo6cnVudGltZV9lcnJvciBpbmhlcml0cyBmcm9tCisvLyBzdGQ6OmV4Y2VwdGlvbiwgbWFueSB0ZXN0aW5nIGZyYW1ld29ya3Mga25vdyBob3cgdG8gZXh0cmFjdCBhbmQgcHJpbnQgdGhlCisvLyBtZXNzYWdlIGluc2lkZSBpdC4KK2NsYXNzIEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uIDogcHVibGljIDo6c3RkOjpydW50aW1lX2Vycm9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBmYWlsdXJlKQorICAgICAgOiA6OnN0ZDo6cnVudGltZV9lcnJvcihQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoZmFpbHVyZSkuY19zdHIoKSkge30KK307CisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBXZSBwdXQgdGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBpbiB0aGUgaW50ZXJuYWwgbmFtZXNwYWNlIGFzIElCTSdzIHhsQworLy8gY29tcGlsZXIgcmVqZWN0cyB0aGUgY29kZSBpZiB0aGV5IHdlcmUgZGVjbGFyZWQgc3RhdGljLgorCisvLyBSdW5zIHRoZSBnaXZlbiBtZXRob2QgYW5kIGhhbmRsZXMgU0VIIGV4Y2VwdGlvbnMgaXQgdGhyb3dzLCB3aGVuCisvLyBTRUggaXMgc3VwcG9ydGVkOyByZXR1cm5zIHRoZSAwLXZhbHVlIGZvciB0eXBlIFJlc3VsdCBpbiBjYXNlIG9mIGFuCisvLyBTRUggZXhjZXB0aW9uLiAgKE1pY3Jvc29mdCBjb21waWxlcnMgY2Fubm90IGhhbmRsZSBTRUggYW5kIEMrKworLy8gZXhjZXB0aW9ucyBpbiB0aGUgc2FtZSBmdW5jdGlvbi4gIFRoZXJlZm9yZSwgd2UgcHJvdmlkZSBhIHNlcGFyYXRlCisvLyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBTRUggZXhjZXB0aW9ucy4pCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgUmVzdWx0PgorUmVzdWx0IEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworI2lmIEdURVNUX0hBU19TRUgKKyAgX190cnkgeworICAgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOworICB9IF9fZXhjZXB0IChpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoICAvLyBOT0xJTlQKKyAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSkpIHsKKyAgICAvLyBXZSBjcmVhdGUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIG9uIHRoZSBoZWFwIGJlY2F1c2UgVkMrKyBwcm9oaWJpdHMKKyAgICAvLyBjcmVhdGlvbiBvZiBvYmplY3RzIHdpdGggZGVzdHJ1Y3RvcnMgb24gc3RhY2sgaW4gZnVuY3Rpb25zIHVzaW5nIF9fdHJ5CisgICAgLy8gKHNlZSBlcnJvciBDMjcxMikuCisgICAgc3RkOjpzdHJpbmcqIGV4Y2VwdGlvbl9tZXNzYWdlID0gRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZSgKKyAgICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpLCBsb2NhdGlvbik7CisgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleGNlcHRpb25fbWVzc2FnZSk7CisgICAgZGVsZXRlIGV4Y2VwdGlvbl9tZXNzYWdlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworICB9CisjZWxzZQorICAodm9pZClsb2NhdGlvbjsKKyAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKK30KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBjYXRjaGVzIGFuZCByZXBvcnRzIEMrKyBhbmQvb3IgU0VILXN0eWxlCisvLyBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQ7IHJldHVybnMgdGhlIDAtdmFsdWUgZm9yIHR5cGUKKy8vIFJlc3VsdCBpbiBjYXNlIG9mIGFuIFNFSCBleGNlcHRpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgUmVzdWx0PgorUmVzdWx0IEhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICAvLyBOT1RFOiBUaGUgdXNlciBjb2RlIGNhbiBhZmZlY3QgdGhlIHdheSBpbiB3aGljaCBHb29nbGUgVGVzdCBoYW5kbGVzCisgIC8vIGV4Y2VwdGlvbnMgYnkgc2V0dGluZyBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpLCBidXQgb25seSBiZWZvcmUKKyAgLy8gUlVOX0FMTF9URVNUUygpIHN0YXJ0cy4gSXQgaXMgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8gY2hlY2sgdGhlIGZsYWcKKyAgLy8gYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYW5kIGVpdGhlciByZXBvcnQgb3IgcmUtdGhyb3cgdGhlCisgIC8vIGV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgZmxhZydzIHZhbHVlOgorICAvLworICAvLyB0cnkgeworICAvLyAgIC8vIFBlcmZvcm0gdGhlIHRlc3QgbWV0aG9kLgorICAvLyB9IGNhdGNoICguLi4pIHsKKyAgLy8gICBpZiAoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkKKyAgLy8gICAgIC8vIFJlcG9ydCB0aGUgZXhjZXB0aW9uIGFzIGZhaWx1cmUuCisgIC8vICAgZWxzZQorICAvLyAgICAgdGhyb3c7ICAvLyBSZS10aHJvd3MgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4KKyAgLy8gfQorICAvLworICAvLyBIb3dldmVyLCB0aGUgcHVycG9zZSBvZiB0aGlzIGZsYWcgaXMgdG8gYWxsb3cgdGhlIHByb2dyYW0gdG8gZHJvcCBpbnRvCisgIC8vIHRoZSBkZWJ1Z2dlciB3aGVuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBPbiBtb3N0IHBsYXRmb3Jtcywgb25jZSB0aGUKKyAgLy8gY29udHJvbCBlbnRlcnMgdGhlIGNhdGNoIGJsb2NrLCB0aGUgZXhjZXB0aW9uIG9yaWdpbiBpbmZvcm1hdGlvbiBpcworICAvLyBsb3N0IGFuZCB0aGUgZGVidWdnZXIgd2lsbCBzdG9wIHRoZSBwcm9ncmFtIGF0IHRoZSBwb2ludCBvZiB0aGUKKyAgLy8gcmUtdGhyb3cgaW4gdGhpcyBmdW5jdGlvbiAtLSBpbnN0ZWFkIG9mIGF0IHRoZSBwb2ludCBvZiB0aGUgb3JpZ2luYWwKKyAgLy8gdGhyb3cgc3RhdGVtZW50IGluIHRoZSBjb2RlIHVuZGVyIHRlc3QuICBGb3IgdGhpcyByZWFzb24sIHdlIHBlcmZvcm0KKyAgLy8gdGhlIGNoZWNrIGVhcmx5LCBzYWNyaWZpY2luZyB0aGUgYWJpbGl0eSB0byBhZmZlY3QgR29vZ2xlIFRlc3QncworICAvLyBleGNlcHRpb24gaGFuZGxpbmcgaW4gdGhlIG1ldGhvZCB3aGVyZSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgaWYgKGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgICB0cnkgeworICAgICAgcmV0dXJuIEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKG9iamVjdCwgbWV0aG9kLCBsb2NhdGlvbik7CisgICAgfSBjYXRjaCAoY29uc3QgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24mKSB7ICAvLyBOT0xJTlQKKyAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIGRvZXNuJ3Qgb3JpZ2luYXRlIGluIGNvZGUgdW5kZXIgdGVzdC4gSXQgbWFrZXMgbm8KKyAgICAgIC8vIHNlbnNlIHRvIHJlcG9ydCBpdCBhcyBhIHRlc3QgZmFpbHVyZS4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7ICAvLyBOT0xJTlQKKyAgICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShlLndoYXQoKSwgbG9jYXRpb24pKTsKKyAgICB9IGNhdGNoICguLi4pIHsgIC8vIE5PTElOVAorICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKKyAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKE5VTEwsIGxvY2F0aW9uKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworI2Vsc2UKKyAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gUnVucyB0aGUgdGVzdCBhbmQgdXBkYXRlcyB0aGUgdGVzdCByZXN1bHQuCit2b2lkIFRlc3Q6OlJ1bigpIHsKKyAgaWYgKCFIYXNTYW1lRml4dHVyZUNsYXNzKCkpIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQodGhpcywgJlRlc3Q6OlNldFVwLCAiU2V0VXAoKSIpOworICAvLyBXZSB3aWxsIHJ1biB0aGUgdGVzdCBvbmx5IGlmIFNldFVwKCkgd2FzIHN1Y2Nlc3NmdWwuCisgIGlmICghSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICAgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgICAgdGhpcywgJlRlc3Q6OlRlc3RCb2R5LCAidGhlIHRlc3QgYm9keSIpOworICB9CisKKyAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSGVuY2Ugd2Ugd2lsbAorICAvLyBhbHdheXMgY2FsbCBUZWFyRG93bigpLCBldmVuIGlmIFNldFVwKCkgb3IgdGhlIHRlc3QgYm9keSBoYXMKKyAgLy8gZmFpbGVkLgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdDo6VGVhckRvd24sICJUZWFyRG93bigpIik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSB7CisgIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+SGFzRmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgeworICByZXR1cm4gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPgorICAgICAgSGFzTm9uZmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIGNsYXNzIFRlc3RJbmZvCisKKy8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIEl0IGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSB0ZXN0IGZhY3RvcnkKKy8vIG9iamVjdC4KKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1ha2UgYV90ZXN0X2Nhc2VfbmFtZSBhbmQgYV9uYW1lIGNvbnN0IHN0cmluZyYncworLy8gdG8gc2lnbmlmeSB0aGV5IGNhbm5vdCBiZSBOVUxMcy4KK1Rlc3RJbmZvOjpUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkKKyAgICA6IHRlc3RfY2FzZV9uYW1lXyhhX3Rlc3RfY2FzZV9uYW1lKSwKKyAgICAgIG5hbWVfKGFfbmFtZSksCisgICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLAorICAgICAgdmFsdWVfcGFyYW1fKGFfdmFsdWVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV92YWx1ZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIGZpeHR1cmVfY2xhc3NfaWRfKGZpeHR1cmVfY2xhc3NfaWQpLAorICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAorICAgICAgaXNfZGlzYWJsZWRfKGZhbHNlKSwKKyAgICAgIG1hdGNoZXNfZmlsdGVyXyhmYWxzZSksCisgICAgICBmYWN0b3J5XyhmYWN0b3J5KSwKKyAgICAgIHJlc3VsdF8oKSB7fQorCisvLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuCitUZXN0SW5mbzo6flRlc3RJbmZvKCkgeyBkZWxldGUgZmFjdG9yeV87IH0KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OworLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKKy8vICAgdHlwZV9wYXJhbTogICAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorLy8gICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIHZhbHVlX3BhcmFtOiAgICAgIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlc3QncyB2YWx1ZSBwYXJhbWV0ZXIsCisvLyAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK1Rlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KSB7CisgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICAgbmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLCBuYW1lLCB0eXBlX3BhcmFtLCB2YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBmaXh0dXJlX2NsYXNzX2lkLCBmYWN0b3J5KTsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPkFkZFRlc3RJbmZvKHNldF91cF90YywgdGVhcl9kb3duX3RjLCB0ZXN0X2luZm8pOworICByZXR1cm4gdGVzdF9pbmZvOworfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKK3ZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBNZXNzYWdlIGVycm9yczsKKyAgZXJyb3JzCisgICAgICA8PCAiQXR0ZW1wdGVkIHJlZGVmaW5pdGlvbiBvZiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLlxuIgorICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLCB5b3UgdHJpZWRcbiIKKyAgICAgIDw8ICJ0byBkZWZpbmUgYSB0ZXN0IHVzaW5nIGEgZml4dHVyZSBjbGFzcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lXG4iCisgICAgICA8PCAidXNlZCBlYXJsaWVyLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHR3byBmaXh0dXJlIGNsYXNzZXMgYXJlXG4iCisgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiBZb3Ugc2hvdWxkXG4iCisgICAgICA8PCAicHJvYmFibHkgcmVuYW1lIG9uZSBvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50XG4iCisgICAgICA8PCAidGVzdCBjYXNlcy4iOworCisgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICBlcnJvcnMuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgeworCisvLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgdGVzdCBuYW1lIG9mIGEgVGVzdEluZm8gYWdhaW5zdCBhIGtub3duCisvLyB2YWx1ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZXN0Q2FzZSBjbGFzcyBvbmx5LiAgV2UgcHV0CisvLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKKy8vIG5hbWVzcGFjZS4KKy8vCisvLyBUZXN0TmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdE5hbWVJcyB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgLy8KKyAgLy8gVGVzdE5hbWVJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdE5hbWVJcyhjb25zdCBjaGFyKiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0X2luZm8gbWF0Y2hlcyBuYW1lXy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfaW5mbyAmJiB0ZXN0X2luZm8tPm5hbWUoKSA9PSBuYW1lXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBtZXRob2QgZXhwYW5kcyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyByZWdpc3RlcmVkIHdpdGggbWFjcm9zIFRFU1RfUAorLy8gYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIGludG8gcmVndWxhciB0ZXN0cyBhbmQgcmVnaXN0ZXJzIHRob3NlLgorLy8gVGhpcyB3aWxsIGJlIGRvbmUganVzdCBvbmNlIGR1cmluZyB0aGUgcHJvZ3JhbSBydW50aW1lLgordm9pZCBVbml0VGVzdEltcGw6OlJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgeworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIGlmICghcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXykgeworICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8uUmVnaXN0ZXJUZXN0cygpOworICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8gPSB0cnVlOworICB9CisjZW5kaWYKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCisvLyBkZWxldGVzIGl0Lgordm9pZCBUZXN0SW5mbzo6UnVuKCkgeworICBpZiAoIXNob3VsZF9ydW5fKSByZXR1cm47CisKKyAgLy8gVGVsbHMgVW5pdFRlc3Qgd2hlcmUgdG8gc3RvcmUgdGVzdCByZXN1bHQuCisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfaW5mbyh0aGlzKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkucmVwZWF0ZXIoKTsKKworICAvLyBOb3RpZmllcyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgdGVzdCBpcyBhYm91dCB0byBzdGFydC4KKyAgcmVwZWF0ZXItPk9uVGVzdFN0YXJ0KCp0aGlzKTsKKworICBjb25zdCBUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7CisKKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKworICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdC4KKyAgVGVzdCogY29uc3QgdGVzdCA9IGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIGZhY3RvcnlfLCAmaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZTo6Q3JlYXRlVGVzdCwKKyAgICAgICJ0aGUgdGVzdCBmaXh0dXJlJ3MgY29uc3RydWN0b3IiKTsKKworICAvLyBSdW5zIHRoZSB0ZXN0IG9ubHkgaWYgdGhlIHRlc3Qgb2JqZWN0IHdhcyBjcmVhdGVkIGFuZCBpdHMKKyAgLy8gY29uc3RydWN0b3IgZGlkbid0IGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZS4KKyAgaWYgKCh0ZXN0ICE9IE5VTEwpICYmICFUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgeworICAgIC8vIFRoaXMgZG9lc24ndCB0aHJvdyBhcyBhbGwgdXNlciBjb2RlIHRoYXQgY2FuIHRocm93IGFyZSB3cmFwcGVkIGludG8KKyAgICAvLyBleGNlcHRpb24gaGFuZGxpbmcgY29kZS4KKyAgICB0ZXN0LT5SdW4oKTsKKyAgfQorCisgIC8vIERlbGV0ZXMgdGhlIHRlc3Qgb2JqZWN0LgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0ZXN0LCAmVGVzdDo6RGVsZXRlU2VsZl8sICJ0aGUgdGVzdCBmaXh0dXJlJ3MgZGVzdHJ1Y3RvciIpOworCisgIHJlc3VsdF8uc2V0X2VsYXBzZWRfdGltZShpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydCk7CisKKyAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lciB0aGF0IGEgdGVzdCBoYXMganVzdCBmaW5pc2hlZC4KKyAgcmVwZWF0ZXItPk9uVGVzdEVuZCgqdGhpcyk7CisKKyAgLy8gVGVsbHMgVW5pdFRlc3QgdG8gc3RvcCBhc3NvY2lhdGluZyBhc3NlcnRpb24gcmVzdWx0cyB0byB0aGlzCisgIC8vIHRlc3QuCisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfaW5mbyhOVUxMKTsKK30KKworLy8gY2xhc3MgVGVzdENhc2UKKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCitpbnQgVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0UGFzc2VkKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK2ludCBUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdEZhaWxlZCk7Cit9CisKK2ludCBUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0RGlzYWJsZWQpOworfQorCisvLyBHZXQgdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBydW4uCitpbnQgVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFNob3VsZFJ1blRlc3QpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgoraW50IFRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2luZm9fbGlzdF8uc2l6ZSgpKTsKK30KKworLy8gQ3JlYXRlcyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgbmFtZTogICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgYV90eXBlX3BhcmFtOiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlJ3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCitUZXN0Q2FzZTo6VGVzdENhc2UoY29uc3QgY2hhciogYV9uYW1lLCBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykKKyAgICA6IG5hbWVfKGFfbmFtZSksCisgICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLAorICAgICAgc2V0X3VwX3RjXyhzZXRfdXBfdGMpLAorICAgICAgdGVhcl9kb3duX3RjXyh0ZWFyX2Rvd25fdGMpLAorICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAorICAgICAgZWxhcHNlZF90aW1lXygwKSB7Cit9CisKKy8vIERlc3RydWN0b3Igb2YgVGVzdENhc2UuCitUZXN0Q2FzZTo6flRlc3RDYXNlKCkgeworICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3QgaW4gdGhlIGNvbGxlY3Rpb24uCisgIEZvckVhY2godGVzdF9pbmZvX2xpc3RfLCBpbnRlcm5hbDo6RGVsZXRlPFRlc3RJbmZvPik7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KK2NvbnN0IFRlc3RJbmZvKiBUZXN0Q2FzZTo6R2V0VGVzdEluZm8oaW50IGkpIGNvbnN0IHsKKyAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKKyAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitUZXN0SW5mbyogVGVzdENhc2U6OkdldE11dGFibGVUZXN0SW5mbyhpbnQgaSkgeworICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9pbmRpY2VzXywgaSwgLTEpOworICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfaW5mb19saXN0X1tpbmRleF07Cit9CisKKy8vIEFkZHMgYSB0ZXN0IHRvIHRoaXMgdGVzdCBjYXNlLiAgV2lsbCBkZWxldGUgdGhlIHRlc3QgdXBvbgorLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIFRlc3RDYXNlIG9iamVjdC4KK3ZvaWQgVGVzdENhc2U6OkFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKSB7CisgIHRlc3RfaW5mb19saXN0Xy5wdXNoX2JhY2sodGVzdF9pbmZvKTsKKyAgdGVzdF9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2luZGljZXNfLnNpemUoKSkpOworfQorCisvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KK3ZvaWQgVGVzdENhc2U6OlJ1bigpIHsKKyAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOworCisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZSh0aGlzKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkucmVwZWF0ZXIoKTsKKworICByZXBlYXRlci0+T25UZXN0Q2FzZVN0YXJ0KCp0aGlzKTsKKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGhpcywgJlRlc3RDYXNlOjpSdW5TZXRVcFRlc3RDYXNlLCAiU2V0VXBUZXN0Q2FzZSgpIik7CisKKyAgY29uc3QgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBzdGFydCA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbF90ZXN0X2NvdW50KCk7IGkrKykgeworICAgIEdldE11dGFibGVUZXN0SW5mbyhpKS0+UnVuKCk7CisgIH0KKyAgZWxhcHNlZF90aW1lXyA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0OworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuVGVhckRvd25UZXN0Q2FzZSwgIlRlYXJEb3duVGVzdENhc2UoKSIpOworCisgIHJlcGVhdGVyLT5PblRlc3RDYXNlRW5kKCp0aGlzKTsKKyAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9jYXNlKE5VTEwpOworfQorCisvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgordm9pZCBUZXN0Q2FzZTo6Q2xlYXJSZXN1bHQoKSB7CisgIEZvckVhY2godGVzdF9pbmZvX2xpc3RfLCBUZXN0SW5mbzo6Q2xlYXJUZXN0UmVzdWx0KTsKK30KKworLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgordm9pZCBUZXN0Q2FzZTo6U2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSkgeworICBTaHVmZmxlKHJhbmRvbSwgJnRlc3RfaW5kaWNlc18pOworfQorCisvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCit2b2lkIFRlc3RDYXNlOjpVbnNodWZmbGVUZXN0cygpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2luZGljZXNfLnNpemUoKTsgaSsrKSB7CisgICAgdGVzdF9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7CisgIH0KK30KKworLy8gRm9ybWF0cyBhIGNvdW50YWJsZSBub3VuLiAgRGVwZW5kaW5nIG9uIGl0cyBxdWFudGl0eSwgZWl0aGVyIHRoZQorLy8gc2luZ3VsYXIgZm9ybSBvciB0aGUgcGx1cmFsIGZvcm0gaXMgdXNlZC4gZS5nLgorLy8KKy8vIEZvcm1hdENvdW50YWJsZU5vdW4oMSwgImZvcm11bGEiLCAiZm9ybXVsaSIpIHJldHVybnMgIjEgZm9ybXVsYSIuCisvLyBGb3JtYXRDb3VudGFibGVOb3VuKDUsICJib29rIiwgImJvb2tzIikgcmV0dXJucyAiNSBib29rcyIuCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogc2luZ3VsYXJfZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBwbHVyYWxfZm9ybSkgeworICByZXR1cm4gaW50ZXJuYWw6OlN0cmluZzo6Rm9ybWF0KCIlZCAlcyIsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID09IDEgPyBzaW5ndWxhcl9mb3JtIDogcGx1cmFsX2Zvcm0pOworfQorCisvLyBGb3JtYXRzIHRoZSBjb3VudCBvZiB0ZXN0cy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q291bnQoaW50IHRlc3RfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q2FzZUNvdW50KGludCB0ZXN0X2Nhc2VfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlX2NvdW50LCAidGVzdCBjYXNlIiwgInRlc3QgY2FzZXMiKTsKK30KKworLy8gQ29udmVydHMgYSBUZXN0UGFydFJlc3VsdDo6VHlwZSBlbnVtIHRvIGh1bWFuLWZyaWVuZGx5IHN0cmluZworLy8gcmVwcmVzZW50YXRpb24uICBCb3RoIGtOb25GYXRhbEZhaWx1cmUgYW5kIGtGYXRhbEZhaWx1cmUgYXJlIHRyYW5zbGF0ZWQKKy8vIHRvICJGYWlsdXJlIiwgYXMgdGhlIHVzZXIgdXN1YWxseSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UKKy8vIGJldHdlZW4gdGhlIHR3byB3aGVuIHZpZXdpbmcgdGhlIHRlc3QgcmVzdWx0Lgorc3RhdGljIGNvbnN0IGNoYXIgKiBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyhUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzOgorICAgICAgcmV0dXJuICJTdWNjZXNzIjsKKworICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmU6CisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZToKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgcmV0dXJuICJlcnJvcjogIjsKKyNlbHNlCisgICAgICByZXR1cm4gIkZhaWx1cmVcbiI7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJVbmtub3duIHJlc3VsdCB0eXBlIjsKKyAgfQorfQorCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCB0byBhbiBzdGQ6OnN0cmluZy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkKKyAgICAgICAgICA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpCisgICAgICAgICAgPDwgIiAiIDw8IFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQudHlwZSgpKQorICAgICAgICAgIDw8IHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKS5HZXRTdHJpbmcoKTsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQuCitzdGF0aWMgdm9pZCBQcmludFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXN1bHQgPQorICAgICAgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQpOworICBwcmludGYoIiVzXG4iLCByZXN1bHQuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworICAvLyBJZiB0aGUgdGVzdCBwcm9ncmFtIHJ1bnMgaW4gVmlzdWFsIFN0dWRpbyBvciBhIGRlYnVnZ2VyLCB0aGUKKyAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dAorICAvLyB3aW5kb3cgc3VjaCB0aGF0IHRoZSB1c2VyIGNhbiBkb3VibGUtY2xpY2sgb24gaXQgdG8ganVtcCB0byB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBsb2NhdGlvbjsgb3RoZXJ3aXNlIHRoZXkgZG8gbm90aGluZy4KKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXZSBkb24ndCBjYWxsIE91dHB1dERlYnVnU3RyaW5nKigpIG9uIFdpbmRvd3MgTW9iaWxlLCBhcyBwcmludGluZworICAvLyB0byBzdGRvdXQgaXMgZG9uZSBieSBPdXRwdXREZWJ1Z1N0cmluZygpIHRoZXJlIGFscmVhZHkgLSB3ZSBkb24ndAorICAvLyB3YW50IHRoZSBzYW1lIG1lc3NhZ2UgcHJpbnRlZCB0d2ljZS4KKyAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EocmVzdWx0LmNfc3RyKCkpOworICA6Ok91dHB1dERlYnVnU3RyaW5nQSgiXG4iKTsKKyNlbmRpZgorfQorCisvLyBjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworZW51bSBHVGVzdENvbG9yIHsKKyAgQ09MT1JfREVGQVVMVCwKKyAgQ09MT1JfUkVELAorICBDT0xPUl9HUkVFTiwKKyAgQ09MT1JfWUVMTE9XCit9OworCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yLgorV09SRCBHZXRDb2xvckF0dHJpYnV0ZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgcmV0dXJuIEZPUkVHUk9VTkRfUkVEOworICAgIGNhc2UgQ09MT1JfR1JFRU46ICByZXR1cm4gRk9SRUdST1VORF9HUkVFTjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzogcmV0dXJuIEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9HUkVFTjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2Vsc2UKKworLy8gUmV0dXJucyB0aGUgQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gY29sb3IuICBDT0xPUl9ERUZBVUxUIGlzCisvLyBhbiBpbnZhbGlkIGlucHV0LgorY29uc3QgY2hhciogR2V0QW5zaUNvbG9yQ29kZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgIHJldHVybiAiMSI7CisgICAgY2FzZSBDT0xPUl9HUkVFTjogICByZXR1cm4gIjIiOworICAgIGNhc2UgQ09MT1JfWUVMTE9XOiAgcmV0dXJuICIzIjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBOVUxMOworICB9OworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KK2Jvb2wgU2hvdWxkVXNlQ29sb3IoYm9vbCBzdGRvdXRfaXNfdHR5KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X2NvbG9yID0gR1RFU1RfRkxBRyhjb2xvcikuY19zdHIoKTsKKworICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiYXV0byIpKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlCisgICAgLy8gY29uc29sZSB0aGVyZSBkb2VzIHN1cHBvcnQgY29sb3JzLgorICAgIHJldHVybiBzdGRvdXRfaXNfdHR5OworI2Vsc2UKKyAgICAvLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHdlIHJlbHkgb24gdGhlIFRFUk0gdmFyaWFibGUuCisgICAgY29uc3QgY2hhciogY29uc3QgdGVybSA9IHBvc2l4OjpHZXRFbnYoIlRFUk0iKTsKKyAgICBjb25zdCBib29sIHRlcm1fc3VwcG9ydHNfY29sb3IgPQorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS1jb2xvciIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tMjU2Y29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInNjcmVlbiIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAibGludXgiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImN5Z3dpbiIpOworICAgIHJldHVybiBzdGRvdXRfaXNfdHR5ICYmIHRlcm1fc3VwcG9ydHNfY29sb3I7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgfQorCisgIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ5ZXMiKSB8fAorICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidHJ1ZSIpIHx8CisgICAgICBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ0IikgfHwKKyAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgIjEiKTsKKyAgLy8gV2UgdGFrZSAieWVzIiwgInRydWUiLCAidCIsIGFuZCAiMSIgYXMgbWVhbmluZyAieWVzIi4gIElmIHRoZQorICAvLyB2YWx1ZSBpcyBuZWl0aGVyIG9uZSBvZiB0aGVzZSBub3IgImF1dG8iLCB3ZSB0cmVhdCBpdCBhcyAibm8iIHRvCisgIC8vIGJlIGNvbnNlcnZhdGl2ZS4KK30KKworLy8gSGVscGVycyBmb3IgcHJpbnRpbmcgY29sb3JlZCBzdHJpbmdzIHRvIHN0ZG91dC4gTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHdlCisvLyBjYW5ub3Qgc2ltcGx5IGVtaXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBoYXZlIHRoZSB0ZXJtaW5hbCBjaGFuZ2UgY29sb3JzLgorLy8gVGhpcyByb3V0aW5lIG11c3QgYWN0dWFsbHkgZW1pdCB0aGUgY2hhcmFjdGVycyByYXRoZXIgdGhhbiByZXR1cm4gYSBzdHJpbmcKKy8vIHRoYXQgd291bGQgYmUgY29sb3JlZCB3aGVuIHByaW50ZWQsIGFzIGNhbiBiZSBkb25lIG9uIExpbnV4Lgordm9pZCBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfWk9TIHx8IEdURVNUX09TX0lPUworICBjb25zdCBib29sIHVzZV9jb2xvciA9IGZhbHNlOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgaW5fY29sb3JfbW9kZSA9CisgICAgICBTaG91bGRVc2VDb2xvcihwb3NpeDo6SXNBVFRZKHBvc2l4OjpGaWxlTm8oc3Rkb3V0KSkgIT0gMCk7CisgIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gaW5fY29sb3JfbW9kZSAmJiAoY29sb3IgIT0gQ09MT1JfREVGQVVMVCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfWk9TCisgIC8vIFRoZSAnIT0gMCcgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkgdG8gc2F0aXNmeSBNU1ZDIDcuMS4KKworICBpZiAoIXVzZV9jb2xvcikgeworICAgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuOworICB9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBjb25zdCBIQU5ETEUgc3Rkb3V0X2hhbmRsZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisKKyAgLy8gR2V0cyB0aGUgY3VycmVudCB0ZXh0IGNvbG9yLgorICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBidWZmZXJfaW5mbzsKKyAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3Rkb3V0X2hhbmRsZSwgJmJ1ZmZlcl9pbmZvKTsKKyAgY29uc3QgV09SRCBvbGRfY29sb3JfYXR0cnMgPSBidWZmZXJfaW5mby53QXR0cmlidXRlczsKKworICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoCisgIC8vIFNldENvbnNvbGVUZXh0QXR0cmlidXRlIGNhbGwgbGVzdCBpdCBhZmZlY3QgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5CisgIC8vIHByaW50ZWQgYnV0IGhhcyBub3QgeWV0IHJlYWNoZWQgdGhlIGNvbnNvbGUuCisgIGZmbHVzaChzdGRvdXQpOworICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb2xvckF0dHJpYnV0ZShjb2xvcikgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKworICBmZmx1c2goc3Rkb3V0KTsKKyAgLy8gUmVzdG9yZXMgdGhlIHRleHQgY29sb3IuCisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsIG9sZF9jb2xvcl9hdHRycyk7CisjZWxzZQorICBwcmludGYoIlwwMzNbMDszJXNtIiwgR2V0QW5zaUNvbG9yQ29kZShjb2xvcikpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHByaW50ZigiXDAzM1ttIik7ICAvLyBSZXNldHMgdGhlIHRlcm1pbmFsIHRvIGRlZmF1bHQuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfcGFyYW0gPSB0ZXN0X2luZm8udHlwZV9wYXJhbSgpOworICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9wYXJhbSA9IHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpOworCisgIGlmICh0eXBlX3BhcmFtICE9IE5VTEwgfHwgdmFsdWVfcGFyYW0gIT0gTlVMTCkgeworICAgIHByaW50ZigiLCB3aGVyZSAiKTsKKyAgICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICBwcmludGYoIlR5cGVQYXJhbSA9ICVzIiwgdHlwZV9wYXJhbSk7CisgICAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkKKyAgICAgICAgcHJpbnRmKCIgYW5kICIpOworICAgIH0KKyAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJHZXRQYXJhbSgpID0gJXMiLCB2YWx1ZV9wYXJhbSk7CisgICAgfQorICB9Cit9CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlLgorLy8KKy8vIENsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciBpcyBjb3B5YWJsZS4KK2NsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIoKSB7fQorICBzdGF0aWMgdm9pZCBQcmludFRlc3ROYW1lKGNvbnN0IGNoYXIgKiB0ZXN0X2Nhc2UsIGNvbnN0IGNoYXIgKiB0ZXN0KSB7CisgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZSwgdGVzdCk7CisgIH0KKworICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgb3ZlcnJpZGUgd2hhdCdzIGluIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIFByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Cit9OworCisgIC8vIEZpcmVkIGJlZm9yZSBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbikgeworICBpZiAoR1RFU1RfRkxBRyhyZXBlYXQpICE9IDEpCisgICAgcHJpbnRmKCJcblJlcGVhdGluZyBhbGwgdGVzdHMgKGl0ZXJhdGlvbiAlZCkgLiAuIC5cblxuIiwgaXRlcmF0aW9uICsgMSk7CisKKyAgY29uc3QgY2hhciogY29uc3QgZmlsdGVyID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7CisKKyAgLy8gUHJpbnRzIHRoZSBmaWx0ZXIgaWYgaXQncyBub3QgKi4gIFRoaXMgcmVtaW5kcyB0aGUgdXNlciB0aGF0IHNvbWUKKyAgLy8gdGVzdHMgbWF5IGJlIHNraXBwZWQuCisgIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGZpbHRlciwga1VuaXZlcnNhbEZpbHRlcikpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiAlcyBmaWx0ZXIgPSAlc1xuIiwgR1RFU1RfTkFNRV8sIGZpbHRlcik7CisgIH0KKworICBpZiAoaW50ZXJuYWw6OlNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwgZmFsc2UpKSB7CisgICAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKTsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiBUaGlzIGlzIHRlc3Qgc2hhcmQgJWQgb2YgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaGFyZF9pbmRleCkgKyAxLAorICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoa1Rlc3RUb3RhbFNoYXJkcykpOworICB9CisKKyAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKKyAgICAgICAgICAgICAgICAgICJOb3RlOiBSYW5kb21pemluZyB0ZXN0cycgb3JkZXJzIHdpdGggYSBzZWVkIG9mICVkIC5cbiIsCisgICAgICAgICAgICAgICAgICB1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSk7CisgIH0KKworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKKyAgcHJpbnRmKCJSdW5uaW5nICVzIGZyb20gJXMuXG4iLAorICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAorICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1NldFVwU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLlxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2UubmFtZSgpKTsKKyAgaWYgKHRlc3RfY2FzZS50eXBlX3BhcmFtKCkgPT0gTlVMTCkgeworICAgIHByaW50ZigiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIiwgd2hlcmUgVHlwZVBhcmFtID0gJXNcbiIsIHRlc3RfY2FzZS50eXBlX3BhcmFtKCkpOworICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgUlVOICAgICAgXSAiKTsKKyAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIHByaW50ZigiXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIENhbGxlZCBhZnRlciBhbiBhc3NlcnRpb24gZmFpbHVyZS4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCisgIGlmIChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKKyAgICByZXR1cm47CisKKyAgLy8gUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGZyb20gdGhlIGFzc2VydGlvbiAoZS5nLiBleHBlY3RlZCB0aGlzIGFuZCBnb3QgdGhhdCkuCisgIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbICAgICAgIE9LIF0gIik7CisgIH0gZWxzZSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7CisgIH0KKyAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgIGlmICh0ZXN0X2luZm8ucmVzdWx0KCktPkZhaWxlZCgpKQorICAgIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7CisKKyAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKKyAgICBwcmludGYoIiAoJXMgbXMpXG4iLCBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKAorICAgICAgICAgICB0ZXN0X2luZm8ucmVzdWx0KCktPmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgaWYgKCFHVEVTVF9GTEFHKHByaW50X3RpbWUpKSByZXR1cm47CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyAoJXMgbXMgdG90YWwpXG5cbiIsCisgICAgICAgICBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlLm5hbWUoKSwKKyAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duXG4iKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIEludGVybmFsIGhlbHBlciBmb3IgcHJpbnRpbmcgdGhlIGxpc3Qgb2YgZmFpbGVkIHRlc3RzLgordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKGZhaWxlZF90ZXN0X2NvdW50ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisgICAgaWYgKCF0ZXN0X2Nhc2Uuc2hvdWxkX3J1bigpIHx8ICh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSA9PSAwKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytqKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvID0gKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhqKTsKKyAgICAgIGlmICghdGVzdF9pbmZvLnNob3VsZF9ydW4oKSB8fCB0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7CisgICAgICBwcmludGYoIiVzLiVzIiwgdGVzdF9jYXNlLm5hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOworICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsCisgICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCisgICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOworICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgeworICAgIHByaW50ZigiICglcyBtcyB0b3RhbCkiLAorICAgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0KKyAgcHJpbnRmKCJcbiIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgIFBBU1NFRCAgXSAiKTsKKyAgcHJpbnRmKCIlcy5cbiIsIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3Quc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpLmNfc3RyKCkpOworCisgIGludCBudW1fZmFpbHVyZXMgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKCF1bml0X3Rlc3QuUGFzc2VkKCkpIHsKKyAgICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgICJbICBGQUlMRUQgIF0gIik7CisgICAgcHJpbnRmKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsKKyAgICBQcmludEZhaWxlZFRlc3RzKHVuaXRfdGVzdCk7CisgICAgcHJpbnRmKCJcbiUyZCBGQUlMRUQgJXNcbiIsIG51bV9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CisgIH0KKworICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LmRpc2FibGVkX3Rlc3RfY291bnQoKTsKKyAgaWYgKG51bV9kaXNhYmxlZCAmJiAhR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsKKyAgICBpZiAoIW51bV9mYWlsdXJlcykgeworICAgICAgcHJpbnRmKCJcbiIpOyAgLy8gQWRkIGEgc3BhY2VyIGlmIG5vIEZBSUxVUkUgYmFubmVyIGlzIGRpc3BsYXllZC4KKyAgICB9CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiICBZT1UgSEFWRSAlZCBESVNBQkxFRCAlc1xuXG4iLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkLAorICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKTsKKyAgfQorICAvLyBFbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBvdXRwdXQgaXMgcHJpbnRlZCBiZWZvcmUsIGUuZy4sIGhlYXBjaGVja2VyIG91dHB1dC4KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKy8vIEVuZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworLy8gY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIKKy8vCisvLyBUaGlzIGNsYXNzIGZvcndhcmRzIGV2ZW50cyB0byBvdGhlciBldmVudCBsaXN0ZW5lcnMuCitjbGFzcyBUZXN0RXZlbnRSZXBlYXRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBUZXN0RXZlbnRSZXBlYXRlcigpIDogZm9yd2FyZGluZ19lbmFibGVkXyh0cnVlKSB7fQorICB2aXJ0dWFsIH5UZXN0RXZlbnRSZXBlYXRlcigpOworICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOworICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkaW5nX2VuYWJsZWRfOyB9CisgIHZvaWQgc2V0X2ZvcndhcmRpbmdfZW5hYmxlZChib29sIGVuYWJsZSkgeyBmb3J3YXJkaW5nX2VuYWJsZWRfID0gZW5hYmxlOyB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKworIHByaXZhdGU6CisgIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQorICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KKyAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWRfOworICAvLyBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCByZWNlaXZlIGV2ZW50cy4KKyAgc3RkOjp2ZWN0b3I8VGVzdEV2ZW50TGlzdGVuZXIqPiBsaXN0ZW5lcnNfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50UmVwZWF0ZXIpOworfTsKKworVGVzdEV2ZW50UmVwZWF0ZXI6On5UZXN0RXZlbnRSZXBlYXRlcigpIHsKKyAgRm9yRWFjaChsaXN0ZW5lcnNfLCBEZWxldGU8VGVzdEV2ZW50TGlzdGVuZXI+KTsKK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6QXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgeworICBsaXN0ZW5lcnNfLnB1c2hfYmFjayhsaXN0ZW5lcik7Cit9CisKKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEZhY3RvciB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgaW50byBWZWN0b3I6OkZpbmQuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50UmVwZWF0ZXI6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7ICsraSkgeworICAgIGlmIChsaXN0ZW5lcnNfW2ldID09IGxpc3RlbmVyKSB7CisgICAgICBsaXN0ZW5lcnNfLmVyYXNlKGxpc3RlbmVyc18uYmVnaW4oKSArIGkpOworICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvLyBTaW5jZSBtb3N0IG1ldGhvZHMgYXJlIHZlcnkgc2ltaWxhciwgdXNlIG1hY3JvcyB0byByZWR1Y2UgYm9pbGVycGxhdGUuCisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzLgorI2RlZmluZSBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgeyBcCisgICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKKyAgICB9IFwKKyAgfSBcCit9CisvLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzIGluIHJldmVyc2UKKy8vIG9yZGVyLgorI2RlZmluZSBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAorICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsgXAorICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCisgICAgfSBcCisgIH0gXAorfQorCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VTdGFydCwgVGVzdENhc2UpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFN0YXJ0LCBUZXN0SW5mbykKK0dURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UGFydFJlc3VsdCwgVGVzdFBhcnRSZXN1bHQpCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcEVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCwgVW5pdFRlc3QpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0RW5kLCBUZXN0SW5mbykKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlRW5kLCBUZXN0Q2FzZSkKK0dURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtRW5kLCBVbml0VGVzdCkKKworI3VuZGVmIEdURVNUX1JFUEVBVEVSX01FVEhPRF8KKyN1bmRlZiBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgeworICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeworICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25FbmQodW5pdF90ZXN0LCBpdGVyYXRpb24pOworICAgIH0KKyAgfQorfQorCisvLyBFbmQgVGVzdEV2ZW50UmVwZWF0ZXIKKworLy8gVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYW4gWE1MIG91dHB1dCBmaWxlLgorY2xhc3MgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKTsKKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworCisgcHJpdmF0ZToKKyAgLy8gSXMgYyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIHRoYXQgaXMgbm9ybWFsaXplZCB0byBhIHNwYWNlIGNoYXJhY3RlcgorICAvLyB3aGVuIGl0IGFwcGVhcnMgaW4gYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZT8KKyAgc3RhdGljIGJvb2wgSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGNoYXIgYykgeworICAgIHJldHVybiBjID09IDB4OSB8fCBjID09IDB4QSB8fCBjID09IDB4RDsKKyAgfQorCisgIC8vIE1heSBjIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudD8KKyAgc3RhdGljIGJvb2wgSXNWYWxpZFhtbENoYXJhY3RlcihjaGFyIGMpIHsKKyAgICByZXR1cm4gSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGMpIHx8IGMgPj0gMHgyMDsKKyAgfQorCisgIC8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmCisgIC8vIGlzX2F0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlCisgIC8vIHZhbHVlLCBhbmQgbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdAorICAvLyB3aXRoIGNoYXJhY3RlciByZWZlcmVuY2VzLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sKGNvbnN0IGNoYXIqIHN0ciwgYm9vbCBpc19hdHRyaWJ1dGUpOworCisgIC8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuCisgIHN0YXRpYyBzdHJpbmcgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoY29uc3Qgc3RyaW5nJiBzdHIpOworCisgIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIEVzY2FwZVhtbCB3aGVuIHN0ciBpcyBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWxBdHRyaWJ1dGUoY29uc3QgY2hhciogc3RyKSB7CisgICAgcmV0dXJuIEVzY2FwZVhtbChzdHIsIHRydWUpOworICB9CisKKyAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIG5vdCBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWxUZXh0KGNvbnN0IGNoYXIqIHN0cikgeworICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCBmYWxzZSk7CisgIH0KKworICAvLyBTdHJlYW1zIGFuIFhNTCBDREFUQSBzZWN0aW9uLCBlc2NhcGluZyBpbnZhbGlkIENEQVRBIHNlcXVlbmNlcyBhcyBuZWVkZWQuCisgIHN0YXRpYyB2b2lkIE91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBkYXRhKTsKKworICAvLyBTdHJlYW1zIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RJbmZvIG9iamVjdC4KKyAgc3RhdGljIHZvaWQgT3V0cHV0WG1sVGVzdEluZm8oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworCisgIC8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QKKyAgc3RhdGljIHZvaWQgUHJpbnRYbWxUZXN0Q2FzZShGSUxFKiBvdXQsIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworCisgIC8vIFByaW50cyBhbiBYTUwgc3VtbWFyeSBvZiB1bml0X3Rlc3QgdG8gb3V0cHV0IHN0cmVhbSBvdXQuCisgIHN0YXRpYyB2b2lkIFByaW50WG1sVW5pdFRlc3QoRklMRSogb3V0LCBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKworICAvLyBQcm9kdWNlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRlc3QgcHJvcGVydGllcyBpbiBhIHJlc3VsdCBhcyBzcGFjZQorICAvLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLgorICAvLyBXaGVuIHRoZSBzdGQ6OnN0cmluZyBpcyBub3QgZW1wdHksIGl0IGluY2x1ZGVzIGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZywKKyAgLy8gdG8gZGVsaW1pdCB0aGlzIGF0dHJpYnV0ZSBmcm9tIHByaW9yIGF0dHJpYnV0ZXMuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpOworCisgIC8vIFRoZSBvdXRwdXQgZmlsZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0X2ZpbGVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKTsKK307CisKKy8vIENyZWF0ZXMgYSBuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyLgorWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoY29uc3QgY2hhciogb3V0cHV0X2ZpbGUpCisgICAgOiBvdXRwdXRfZmlsZV8ob3V0cHV0X2ZpbGUpIHsKKyAgaWYgKG91dHB1dF9maWxlXy5jX3N0cigpID09IE5VTEwgfHwgb3V0cHV0X2ZpbGVfLmVtcHR5KCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlhNTCBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIG51bGxcbiIpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorfQorCisvLyBDYWxsZWQgYWZ0ZXIgdGhlIHVuaXQgdGVzdCBlbmRzLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICBGSUxFKiB4bWxvdXQgPSBOVUxMOworICBGaWxlUGF0aCBvdXRwdXRfZmlsZShvdXRwdXRfZmlsZV8pOworICBGaWxlUGF0aCBvdXRwdXRfZGlyKG91dHB1dF9maWxlLlJlbW92ZUZpbGVOYW1lKCkpOworCisgIGlmIChvdXRwdXRfZGlyLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSkgeworICAgIHhtbG91dCA9IHBvc2l4OjpGT3BlbihvdXRwdXRfZmlsZV8uY19zdHIoKSwgInciKTsKKyAgfQorICBpZiAoeG1sb3V0ID09IE5VTEwpIHsKKyAgICAvLyBUT0RPKHdhbik6IHJlcG9ydCB0aGUgcmVhc29uIG9mIHRoZSBmYWlsdXJlLgorICAgIC8vCisgICAgLy8gV2UgZG9uJ3QgZG8gaXQgZm9yIG5vdyBhczoKKyAgICAvLworICAgIC8vICAgMS4gVGhlcmUgaXMgbm8gdXJnZW50IG5lZWQgZm9yIGl0LgorICAgIC8vICAgMi4gSXQncyBhIGJpdCBpbnZvbHZlZCB0byBtYWtlIHRoZSBlcnJubyB2YXJpYWJsZSB0aHJlYWQtc2FmZSBvbgorICAgIC8vICAgICAgYWxsIHRocmVlIG9wZXJhdGluZyBzeXN0ZW1zIChMaW51eCwgV2luZG93cywgYW5kIE1hYyBPUykuCisgICAgLy8gICAzLiBUbyBpbnRlcnByZXQgdGhlIG1lYW5pbmcgb2YgZXJybm8gaW4gYSB0aHJlYWQtc2FmZSB3YXksCisgICAgLy8gICAgICB3ZSBuZWVkIHRoZSBzdHJlcnJvcl9yKCkgZnVuY3Rpb24sIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb24KKyAgICAvLyAgICAgIFdpbmRvd3MuCisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVW5hYmxlIHRvIG9wZW4gZmlsZSBcIiVzXCJcbiIsCisgICAgICAgICAgICBvdXRwdXRfZmlsZV8uY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIFByaW50WG1sVW5pdFRlc3QoeG1sb3V0LCB1bml0X3Rlc3QpOworICBmY2xvc2UoeG1sb3V0KTsKK30KKworLy8gUmV0dXJucyBhbiBYTUwtZXNjYXBlZCBjb3B5IG9mIHRoZSBpbnB1dCBzdHJpbmcgc3RyLiAgSWYgaXNfYXR0cmlidXRlCisvLyBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlIHZhbHVlLCBhbmQKKy8vIG5vcm1hbGl6YWJsZSB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBieSByZXBsYWNpbmcgaXQgd2l0aCBjaGFyYWN0ZXIKKy8vIHJlZmVyZW5jZXMuCisvLworLy8gSW52YWxpZCBYTUwgY2hhcmFjdGVycyBpbiBzdHIsIGlmIGFueSwgYXJlIHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dC4KKy8vIEl0IGlzIGV4cGVjdGVkIHRoYXQgbW9zdCwgaWYgbm90IGFsbCwgb2YgdGhlIHRleHQgcHJvY2Vzc2VkIGJ5IHRoaXMKKy8vIG1vZHVsZSB3aWxsIGNvbnNpc3Qgb2Ygb3JkaW5hcnkgRW5nbGlzaCB0ZXh0LgorLy8gSWYgdGhpcyBtb2R1bGUgaXMgZXZlciBtb2RpZmllZCB0byBwcm9kdWNlIHZlcnNpb24gMS4xIFhNTCBvdXRwdXQsCisvLyBtb3N0IGludmFsaWQgY2hhcmFjdGVycyBjYW4gYmUgcmV0YWluZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCisvLyBUT0RPKHdhbik6IEl0IG1pZ2h0IGJlIG5pY2UgdG8gaGF2ZSBhIG1pbmltYWxseSBpbnZhc2l2ZSwgaHVtYW4tcmVhZGFibGUKKy8vIGVzY2FwaW5nIHNjaGVtZSBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzLCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGVtLgorc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpFc2NhcGVYbWwoCisgICAgY29uc3QgY2hhciogc3RyLCBib29sIGlzX2F0dHJpYnV0ZSkgeworICBNZXNzYWdlIG07CisKKyAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgZm9yIChjb25zdCBjaGFyKiBzcmMgPSBzdHI7ICpzcmM7ICsrc3JjKSB7CisgICAgICBzd2l0Y2ggKCpzcmMpIHsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgbSA8PCAiJmx0OyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgIG0gPDwgIiZndDsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICBtIDw8ICImYW1wOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQorICAgICAgICAgICAgbSA8PCAiJmFwb3M7IjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtIDw8ICdcJyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCisgICAgICAgICAgICBtIDw8ICImcXVvdDsiOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG0gPDwgJyInOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKCpzcmMpKSB7CisgICAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlICYmIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZSgqc3JjKSkKKyAgICAgICAgICAgICAgbSA8PCBTdHJpbmc6OkZvcm1hdCgiJiN4JTAyWDsiLCB1bnNpZ25lZCgqc3JjKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG0gPDwgKnNyYzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG0uR2V0U3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuCisvLyBDdXJyZW50bHkgaW52YWxpZCBjaGFyYWN0ZXJzIGFyZSBkcm9wcGVkIGZyb20gdGhlIHN0cmluZy4gQW4KKy8vIGFsdGVybmF0aXZlIGlzIHRvIHJlcGxhY2UgdGhlbSB3aXRoIGNlcnRhaW4gY2hhcmFjdGVycyBzdWNoIGFzIC4gb3IgPy4KK3N0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHN0cmluZyBvdXRwdXQ7CisgIG91dHB1dC5yZXNlcnZlKHN0ci5zaXplKCkpOworICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHIuYmVnaW4oKTsgaXQgIT0gc3RyLmVuZCgpOyArK2l0KQorICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKCppdCkpCisgICAgICBvdXRwdXQucHVzaF9iYWNrKCppdCk7CisKKyAgcmV0dXJuIG91dHB1dDsKK30KKworLy8gVGhlIGZvbGxvd2luZyByb3V0aW5lcyBnZW5lcmF0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBVbml0VGVzdAorLy8gb2JqZWN0LgorLy8KKy8vIFRoaXMgaXMgaG93IEdvb2dsZSBUZXN0IGNvbmNlcHRzIG1hcCB0byB0aGUgRFREOgorLy8KKy8vIDx0ZXN0c3VpdGVzIG5hbWU9IkFsbFRlc3RzIj4gICAgICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFVuaXRUZXN0IG9iamVjdAorLy8gICA8dGVzdHN1aXRlIG5hbWU9InRlc3RjYXNlLW5hbWUiPiAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdENhc2Ugb2JqZWN0CisvLyAgICAgPHRlc3RjYXNlIG5hbWU9InRlc3QtbmFtZSI+ICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBUZXN0SW5mbyBvYmplY3QKKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLSBpbmRpdmlkdWFsIGFzc2VydGlvbiBmYWlsdXJlcworLy8gICAgIDwvdGVzdGNhc2U+CisvLyAgIDwvdGVzdHN1aXRlPgorLy8gPC90ZXN0c3VpdGVzPgorCisvLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgorc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcykgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBtcy8xMDAwLjA7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIElTTworLy8gODYwMSBmb3JtYXQsIHdpdGhvdXQgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLgorc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKSB7CisgIC8vIFVzaW5nIG5vbi1yZWVudHJhbnQgdmVyc2lvbiBhcyBsb2NhbHRpbWVfciBpcyBub3QgcG9ydGFibGUuCisgIHRpbWVfdCBzZWNvbmRzID0gc3RhdGljX2Nhc3Q8dGltZV90PihtcyAvIDEwMDApOworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDk5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZSkuCisgIGNvbnN0IHN0cnVjdCB0bSogY29uc3QgdGltZV9zdHJ1Y3QgPSBsb2NhbHRpbWUoJnNlY29uZHMpOyAgLy8gTk9MSU5UCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlIGFnYWluLgorI2Vsc2UKKyAgY29uc3Qgc3RydWN0IHRtKiBjb25zdCB0aW1lX3N0cnVjdCA9IGxvY2FsdGltZSgmc2Vjb25kcyk7ICAvLyBOT0xJTlQKKyNlbmRpZgorICBpZiAodGltZV9zdHJ1Y3QgPT0gTlVMTCkKKyAgICByZXR1cm4gIiI7ICAvLyBJbnZhbGlkIG1zIHZhbHVlCisKKyAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmQiLCAgLy8gWVlZWS1NTS1ERFRoaDptbTpzcworICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9zdHJ1Y3QtPnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9zdHJ1Y3QtPnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0cnVjdC0+dG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RydWN0LT50bV9ob3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9zdHJ1Y3QtPnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RydWN0LT50bV9zZWMpOworfQorCisvLyBTdHJlYW1zIGFuIFhNTCBDREFUQSBzZWN0aW9uLCBlc2NhcGluZyBpbnZhbGlkIENEQVRBIHNlcXVlbmNlcyBhcyBuZWVkZWQuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEpIHsKKyAgY29uc3QgY2hhciogc2VnbWVudCA9IGRhdGE7CisgICpzdHJlYW0gPDwgIjwhW0NEQVRBWyI7CisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBuZXh0X3NlZ21lbnQgPSBzdHJzdHIoc2VnbWVudCwgIl1dPiIpOworICAgIGlmIChuZXh0X3NlZ21lbnQgIT0gTlVMTCkgeworICAgICAgc3RyZWFtLT53cml0ZSgKKyAgICAgICAgICBzZWdtZW50LCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KG5leHRfc2VnbWVudCAtIHNlZ21lbnQpKTsKKyAgICAgICpzdHJlYW0gPDwgIl1dPl1dJmd0OzwhW0NEQVRBWyI7CisgICAgICBzZWdtZW50ID0gbmV4dF9zZWdtZW50ICsgc3RybGVuKCJdXT4iKTsKKyAgICB9IGVsc2UgeworICAgICAgKnN0cmVhbSA8PCBzZWdtZW50OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpzdHJlYW0gPDwgIl1dPiI7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCisvLyBUT0RPKHdhbik6IFRoZXJlIGlzIGFsc28gdmFsdWUgaW4gcHJpbnRpbmcgcHJvcGVydGllcyB3aXRoIHRoZSBwbGFpbiBwcmludGVyLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQgPSAqdGVzdF9pbmZvLnJlc3VsdCgpOworICAqc3RyZWFtIDw8ICIgICAgPHRlc3RjYXNlIG5hbWU9XCIiCisgICAgICAgICAgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfaW5mby5uYW1lKCkpLmNfc3RyKCkgPDwgIlwiIjsKKworICBpZiAodGVzdF9pbmZvLnZhbHVlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgICpzdHJlYW0gPDwgIiB2YWx1ZV9wYXJhbT1cIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpKQorICAgICAgICAgICAgPDwgIlwiIjsKKyAgfQorICBpZiAodGVzdF9pbmZvLnR5cGVfcGFyYW0oKSAhPSBOVUxMKSB7CisgICAgKnN0cmVhbSA8PCAiIHR5cGVfcGFyYW09XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2luZm8udHlwZV9wYXJhbSgpKQorICAgICAgICAgICAgPDwgIlwiIjsKKyAgfQorCisgICpzdHJlYW0gPDwgIiBzdGF0dXM9XCIiCisgICAgICAgICAgPDwgKHRlc3RfaW5mby5zaG91bGRfcnVuKCkgPyAicnVuIiA6ICJub3RydW4iKQorICAgICAgICAgIDw8ICJcIiB0aW1lPVwiIgorICAgICAgICAgIDw8IEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhyZXN1bHQuZWxhcHNlZF90aW1lKCkpCisgICAgICAgICAgPDwgIlwiIGNsYXNzbmFtZT1cIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfY2FzZV9uYW1lKS5jX3N0cigpCisgICAgICAgICAgPDwgIlwiIiA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhyZXN1bHQpLmNfc3RyKCk7CisKKyAgaW50IGZhaWx1cmVzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQudG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcGFydCA9IHJlc3VsdC5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICBpZiAocGFydC5mYWlsZWQoKSkgeworICAgICAgaWYgKCsrZmFpbHVyZXMgPT0gMSkgeworICAgICAgICAqc3RyZWFtIDw8ICI+XG4iOworICAgICAgfQorICAgICAgY29uc3Qgc3RyaW5nIGxvY2F0aW9uID0gaW50ZXJuYWw6OkZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oCisgICAgICAgICAgcGFydC5maWxlX25hbWUoKSwgcGFydC5saW5lX251bWJlcigpKTsKKyAgICAgIGNvbnN0IHN0cmluZyBzdW1tYXJ5ID0gbG9jYXRpb24gKyAiXG4iICsgcGFydC5zdW1tYXJ5KCk7CisgICAgICAqc3RyZWFtIDw8ICIgICAgICA8ZmFpbHVyZSBtZXNzYWdlPVwiIgorICAgICAgICAgICAgICA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUoc3VtbWFyeS5jX3N0cigpKQorICAgICAgICAgICAgICA8PCAiXCIgdHlwZT1cIlwiPiI7CisgICAgICBjb25zdCBzdHJpbmcgZGV0YWlsID0gbG9jYXRpb24gKyAiXG4iICsgcGFydC5tZXNzYWdlKCk7CisgICAgICBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oc3RyZWFtLCBSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhkZXRhaWwpLmNfc3RyKCkpOworICAgICAgKnN0cmVhbSA8PCAiPC9mYWlsdXJlPlxuIjsKKyAgICB9CisgIH0KKworICBpZiAoZmFpbHVyZXMgPT0gMCkKKyAgICAqc3RyZWFtIDw8ICIgLz5cbiI7CisgIGVsc2UKKyAgICAqc3RyZWFtIDw8ICIgICAgPC90ZXN0Y2FzZT5cbiI7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QKK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFRlc3RDYXNlKEZJTEUqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgZnByaW50ZihvdXQsCisgICAgICAgICAgIiAgPHRlc3RzdWl0ZSBuYW1lPVwiJXNcIiB0ZXN0cz1cIiVkXCIgZmFpbHVyZXM9XCIlZFwiICIKKyAgICAgICAgICAiZGlzYWJsZWQ9XCIlZFwiICIsCisgICAgICAgICAgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfY2FzZS5uYW1lKCkpLmNfc3RyKCksCisgICAgICAgICAgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB0ZXN0X2Nhc2UuZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgZnByaW50ZihvdXQsCisgICAgICAgICAgImVycm9ycz1cIjBcIiB0aW1lPVwiJXNcIj5cbiIsCisgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytpKSB7CisgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgT3V0cHV0WG1sVGVzdEluZm8oJnN0cmVhbSwgdGVzdF9jYXNlLm5hbWUoKSwgKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhpKSk7CisgICAgZnByaW50ZihvdXQsICIlcyIsIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pLmNfc3RyKCkpOworICB9CisgIGZwcmludGYob3V0LCAiICA8L3Rlc3RzdWl0ZT5cbiIpOworfQorCisvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0Lgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVW5pdFRlc3QoRklMRSogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICBmcHJpbnRmKG91dCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIik7CisgIGZwcmludGYob3V0LAorICAgICAgICAgICI8dGVzdHN1aXRlcyB0ZXN0cz1cIiVkXCIgZmFpbHVyZXM9XCIlZFwiIGRpc2FibGVkPVwiJWRcIiAiCisgICAgICAgICAgImVycm9ycz1cIjBcIiB0aW1lc3RhbXA9XCIlc1wiIHRpbWU9XCIlc1wiICIsCisgICAgICAgICAgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB1bml0X3Rlc3QuZGlzYWJsZWRfdGVzdF9jb3VudCgpLAorICAgICAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKHVuaXRfdGVzdC5zdGFydF90aW1lc3RhbXAoKSkuY19zdHIoKSwKKyAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICBmcHJpbnRmKG91dCwgInJhbmRvbV9zZWVkPVwiJWRcIiAiLCB1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSk7CisgIH0KKyAgZnByaW50ZihvdXQsICJuYW1lPVwiQWxsVGVzdHNcIj5cbiIpOworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKQorICAgIFByaW50WG1sVGVzdENhc2Uob3V0LCAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpKTsKKyAgZnByaW50ZihvdXQsICI8L3Rlc3RzdWl0ZXM+XG4iKTsKK30KKworLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKKy8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCitzdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKAorICAgIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCkgeworICBNZXNzYWdlIGF0dHJpYnV0ZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSA9IHJlc3VsdC5HZXRUZXN0UHJvcGVydHkoaSk7CisgICAgYXR0cmlidXRlcyA8PCAiICIgPDwgcHJvcGVydHkua2V5KCkgPDwgIj0iCisgICAgICAgIDw8ICJcIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHByb3BlcnR5LnZhbHVlKCkpIDw8ICJcIiI7CisgIH0KKyAgcmV0dXJuIGF0dHJpYnV0ZXMuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEVuZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworLy8gU3RyZWFtcyB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHBvcnQgb24gdGhlIGdpdmVuIGhvc3QgbWFjaGluZS4KK2NsYXNzIFN0cmVhbWluZ0xpc3RlbmVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgLy8gRXNjYXBlcyAnPScsICcmJywgJyUnLCBhbmQgJ1xuJyBjaGFyYWN0ZXJzIGluIHN0ciBhcyAiJXh4Ii4KKyAgc3RhdGljIHN0cmluZyBVcmxFbmNvZGUoY29uc3QgY2hhciogc3RyKTsKKworICBTdHJlYW1pbmdMaXN0ZW5lcihjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IHN0cmluZyYgcG9ydCkKKyAgICAgIDogc29ja2ZkXygtMSksIGhvc3RfbmFtZV8oaG9zdCksIHBvcnRfbnVtXyhwb3J0KSB7CisgICAgTWFrZUNvbm5lY3Rpb24oKTsKKyAgICBTZW5kKCJndGVzdF9zdHJlYW1pbmdfcHJvdG9jb2xfdmVyc2lvbj0xLjBcbiIpOworICB9CisKKyAgdmlydHVhbCB+U3RyZWFtaW5nTGlzdGVuZXIoKSB7CisgICAgaWYgKHNvY2tmZF8gIT0gLTEpCisgICAgICBDbG9zZUNvbm5lY3Rpb24oKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8pIHsKKyAgICBTZW5kKCJldmVudD1UZXN0UHJvZ3JhbVN0YXJ0XG4iKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7CisgICAgLy8gTm90ZSB0aGF0IEdvb2dsZSBUZXN0IGN1cnJlbnQgb25seSByZXBvcnQgZWxhcHNlZCB0aW1lIGZvciBlYWNoCisgICAgLy8gdGVzdCBpdGVyYXRpb24sIG5vdCBmb3IgdGhlIGVudGlyZSB0ZXN0IHByb2dyYW0uCisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdFByb2dyYW1FbmQmcGFzc2VkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdF90ZXN0LlBhc3NlZCgpKSk7CisKKyAgICAvLyBOb3RpZnkgdGhlIHN0cmVhbWluZyBzZXJ2ZXIgdG8gc3RvcC4KKyAgICBDbG9zZUNvbm5lY3Rpb24oKTsKKyAgfQorCisgIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLywgaW50IGl0ZXJhdGlvbikgeworICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RJdGVyYXRpb25TdGFydCZpdGVyYXRpb249JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb24pKTsKKyAgfQorCisgIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCAvKiBpdGVyYXRpb24gKi8pIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0SXRlcmF0aW9uRW5kJnBhc3NlZD0lZCZlbGFwc2VkX3RpbWU9JXNtc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdGVzdC5QYXNzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0Q2FzZVN0YXJ0Jm5hbWU9JXNcbiIsIHRlc3RfY2FzZS5uYW1lKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdENhc2VFbmQmcGFzc2VkPSVkJmVsYXBzZWRfdGltZT0lc21zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlLlBhc3NlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSkpOworICB9CisKKyAgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdFN0YXJ0Jm5hbWU9JXNcbiIsIHRlc3RfaW5mby5uYW1lKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiZXZlbnQ9VGVzdEVuZCZwYXNzZWQ9JWQmZWxhcHNlZF90aW1lPSVzbXNcbiIsCisgICAgICAgICh0ZXN0X2luZm8ucmVzdWx0KCkpLT5QYXNzZWQoKSwKKyAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKCh0ZXN0X2luZm8ucmVzdWx0KCkpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSkpOworICB9CisKKyAgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgICAgY29uc3QgY2hhciogZmlsZV9uYW1lID0gdGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKTsKKyAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpCisgICAgICBmaWxlX25hbWUgPSAiIjsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0UGFydFJlc3VsdCZmaWxlPSVzJmxpbmU9JWQmbWVzc2FnZT0iLAorICAgICAgICAgICAgICAgICAgICAgICAgVXJsRW5jb2RlKGZpbGVfbmFtZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSkpOworICAgIFNlbmQoVXJsRW5jb2RlKHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKSArICJcbiIpOworICB9CisKKyBwcml2YXRlOgorICAvLyBDcmVhdGVzIGEgY2xpZW50IHNvY2tldCBhbmQgY29ubmVjdHMgdG8gdGhlIHNlcnZlci4KKyAgdm9pZCBNYWtlQ29ubmVjdGlvbigpOworCisgIC8vIENsb3NlcyB0aGUgc29ja2V0LgorICB2b2lkIENsb3NlQ29ubmVjdGlvbigpIHsKKyAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKKyAgICAgICAgPDwgIkNsb3NlQ29ubmVjdGlvbigpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOworCisgICAgY2xvc2Uoc29ja2ZkXyk7CisgICAgc29ja2ZkXyA9IC0xOworICB9CisKKyAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KKyAgdm9pZCBTZW5kKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIEdURVNUX0NIRUNLXyhzb2NrZmRfICE9IC0xKQorICAgICAgICA8PCAiU2VuZCgpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOworCisgICAgY29uc3QgaW50IGxlbiA9IHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5sZW5ndGgoKSk7CisgICAgaWYgKHdyaXRlKHNvY2tmZF8sIG1lc3NhZ2UuY19zdHIoKSwgbGVuKSAhPSBsZW4pIHsKKyAgICAgIEdURVNUX0xPR18oV0FSTklORykKKyAgICAgICAgICA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIHN0cmVhbSB0byAiCisgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOworICAgIH0KKyAgfQorCisgIGludCBzb2NrZmRfOyAgIC8vIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgY29uc3Qgc3RyaW5nIGhvc3RfbmFtZV87CisgIGNvbnN0IHN0cmluZyBwb3J0X251bV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJlYW1pbmdMaXN0ZW5lcik7Cit9OyAgLy8gY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXIKKworLy8gQ2hlY2tzIGlmIHN0ciBjb250YWlucyAnPScsICcmJywgJyUnIG9yICdcbicgY2hhcmFjdGVycy4gSWYgeWVzLAorLy8gcmVwbGFjZXMgdGhlbSBieSAiJXh4IiB3aGVyZSB4eCBpcyB0aGVpciBoZXhhZGVjaW1hbCB2YWx1ZS4gRm9yCisvLyBleGFtcGxlLCByZXBsYWNlcyAiPSIgd2l0aCAiJTNEIi4gIFRoaXMgYWxnb3JpdGhtIGlzIE8oc3RybGVuKHN0cikpCisvLyBpbiBib3RoIHRpbWUgYW5kIHNwYWNlIC0tIGltcG9ydGFudCBhcyB0aGUgaW5wdXQgc3RyIG1heSBjb250YWluIGFuCisvLyBhcmJpdHJhcmlseSBsb25nIHRlc3QgZmFpbHVyZSBtZXNzYWdlIGFuZCBzdGFjayB0cmFjZS4KK3N0cmluZyBTdHJlYW1pbmdMaXN0ZW5lcjo6VXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cikgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShzdHJsZW4oc3RyKSArIDEpOworICBmb3IgKGNoYXIgY2ggPSAqc3RyOyBjaCAhPSAnXDAnOyBjaCA9ICorK3N0cikgeworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgY2FzZSAnPSc6CisgICAgICBjYXNlICcmJzoKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmc6OkZvcm1hdCgiJSUlMDJ4Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN0cmVhbWluZ0xpc3RlbmVyOjpNYWtlQ29ubmVjdGlvbigpIHsKKyAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gPT0gLTEpCisgICAgICA8PCAiTWFrZUNvbm5lY3Rpb24oKSBjYW4ndCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbi4iOworCisgIGFkZHJpbmZvIGhpbnRzOworICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgICAvLyBUbyBhbGxvdyBib3RoIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzLgorICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBhZGRyaW5mbyogc2VydmluZm8gPSBOVUxMOworCisgIC8vIFVzZSB0aGUgZ2V0YWRkcmluZm8oKSB0byBnZXQgYSBsaW5rZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgZm9yCisgIC8vIHRoZSBnaXZlbiBob3N0IG5hbWUuCisgIGNvbnN0IGludCBlcnJvcl9udW0gPSBnZXRhZGRyaW5mbygKKyAgICAgIGhvc3RfbmFtZV8uY19zdHIoKSwgcG9ydF9udW1fLmNfc3RyKCksICZoaW50cywgJnNlcnZpbmZvKTsKKyAgaWYgKGVycm9yX251bSAhPSAwKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZ2V0YWRkcmluZm8oKSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdhaV9zdHJlcnJvcihlcnJvcl9udW0pOworICB9CisKKyAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuLgorICBmb3IgKGFkZHJpbmZvKiBjdXJfYWRkciA9IHNlcnZpbmZvOyBzb2NrZmRfID09IC0xICYmIGN1cl9hZGRyICE9IE5VTEw7CisgICAgICAgY3VyX2FkZHIgPSBjdXJfYWRkci0+YWlfbmV4dCkgeworICAgIHNvY2tmZF8gPSBzb2NrZXQoCisgICAgICAgIGN1cl9hZGRyLT5haV9mYW1pbHksIGN1cl9hZGRyLT5haV9zb2NrdHlwZSwgY3VyX2FkZHItPmFpX3Byb3RvY29sKTsKKyAgICBpZiAoc29ja2ZkXyAhPSAtMSkgeworICAgICAgLy8gQ29ubmVjdCB0aGUgY2xpZW50IHNvY2tldCB0byB0aGUgc2VydmVyIHNvY2tldC4KKyAgICAgIGlmIChjb25uZWN0KHNvY2tmZF8sIGN1cl9hZGRyLT5haV9hZGRyLCBjdXJfYWRkci0+YWlfYWRkcmxlbikgPT0gLTEpIHsKKyAgICAgICAgY2xvc2Uoc29ja2ZkXyk7CisgICAgICAgIHNvY2tmZF8gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmcmVlYWRkcmluZm8oc2VydmluZm8pOyAgLy8gYWxsIGRvbmUgd2l0aCB0aGlzIHN0cnVjdHVyZQorCisgIGlmIChzb2NrZmRfID09IC0xKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIGNvbm5lY3QgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOworICB9Cit9CisKKy8vIEVuZCBvZiBjbGFzcyBTdHJlYW1pbmcgTGlzdGVuZXIKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTX18KKworLy8gQ2xhc3MgU2NvcGVkVHJhY2UKKworLy8gUHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvIGEgcGVyLXRocmVhZAorLy8gdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KK1Njb3BlZFRyYWNlOjpTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4XykgeworICBUcmFjZUluZm8gdHJhY2U7CisgIHRyYWNlLmZpbGUgPSBmaWxlOworICB0cmFjZS5saW5lID0gbGluZTsKKyAgdHJhY2UubWVzc2FnZSA9IG1lc3NhZ2UuR2V0U3RyaW5nKCk7CisKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlB1c2hHVGVzdFRyYWNlKHRyYWNlKTsKK30KKworLy8gUG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgorU2NvcGVkVHJhY2U6On5TY29wZWRUcmFjZSgpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oJlVuaXRUZXN0OjptdXRleF8pIHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlBvcEdUZXN0VHJhY2UoKTsKK30KKworCisvLyBjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4gIFBhcmFtZXRlcnM6CisvLworLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAorLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLgorLy8gICBza2lwX2NvdW50IC0gdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQ7IGRvZXNuJ3QgY291bnQKKy8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgorLy8KK3N0cmluZyBPc1N0YWNrVHJhY2VHZXR0ZXI6OkN1cnJlbnRTdGFja1RyYWNlKGludCAvKiBtYXhfZGVwdGggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2tpcF9jb3VudCAqLykKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgcmV0dXJuICIiOworfQorCit2b2lkIE9zU3RhY2tUcmFjZUdldHRlcjo6VXBvbkxlYXZpbmdHVGVzdCgpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Cit9CisKK2NvbnN0IGNoYXIqIGNvbnN0CitPc1N0YWNrVHJhY2VHZXR0ZXI6OmtFbGlkZWRGcmFtZXNNYXJrZXIgPQorICAgICIuLi4gIiBHVEVTVF9OQU1FXyAiIGludGVybmFsIGZyYW1lcyAuLi4iOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzCisKK1Rlc3RFdmVudExpc3RlbmVyczo6VGVzdEV2ZW50TGlzdGVuZXJzKCkKKyAgICA6IHJlcGVhdGVyXyhuZXcgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKCkpLAorICAgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8oTlVMTCksCisgICAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKE5VTEwpIHsKK30KKworVGVzdEV2ZW50TGlzdGVuZXJzOjp+VGVzdEV2ZW50TGlzdGVuZXJzKCkgeyBkZWxldGUgcmVwZWF0ZXJfOyB9CisKKy8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCisvLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAorLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAorLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSB1c2VyLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgcmVwZWF0ZXJfLT5BcHBlbmQobGlzdGVuZXIpOworfQorCisvLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgorLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucworLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgorVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudExpc3RlbmVyczo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKQorICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gTlVMTDsKKyAgZWxzZSBpZiAobGlzdGVuZXIgPT0gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXykKKyAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gTlVMTDsKKyAgcmV0dXJuIHJlcGVhdGVyXy0+UmVsZWFzZShsaXN0ZW5lcik7Cit9CisKKy8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCisvLyBzdWJzY3JpYmVycy4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OnJlcGVhdGVyKCkgeyByZXR1cm4gcmVwZWF0ZXJfOyB9CisKKy8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KKy8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworLy8gZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KKy8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyAhPSBsaXN0ZW5lcikgeworICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCisgICAgLy8gbGlzdC4KKyAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyk7CisgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBsaXN0ZW5lcjsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKKyAgICAgIEFwcGVuZChsaXN0ZW5lcik7CisgIH0KK30KKworLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUKKy8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChkZWZhdWx0X3htbF9nZW5lcmF0b3JfICE9IGxpc3RlbmVyKSB7CisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyB0aGlzIG1ldGhvZCBhIGxpc3RlbmVyIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUKKyAgICAvLyBsaXN0LgorICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pOworICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gPSBsaXN0ZW5lcjsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKKyAgICAgIEFwcGVuZChsaXN0ZW5lcik7CisgIH0KK30KKworLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQorLy8gbGlzdGVuZXJzIGluIHRoZSBsaXN0LgorYm9vbCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdCB7CisgIHJldHVybiByZXBlYXRlcl8tPmZvcndhcmRpbmdfZW5hYmxlZCgpOworfQorCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKSB7CisgIHJlcGVhdGVyXy0+c2V0X2ZvcndhcmRpbmdfZW5hYmxlZChmYWxzZSk7Cit9CisKKy8vIGNsYXNzIFVuaXRUZXN0CisKKy8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcworLy8gY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuICBDb25zZWN1dGl2ZQorLy8gY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8gYXMgYSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0bworLy8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkgc3RhcnRzLCBmcm9tIHdoaWNoIHBvaW50IG9uIHRoZSByZXR1cm4KKy8vIHZhbHVlIHdpbGwgbmV2ZXIgY2hhbmdlLgorVW5pdFRlc3QgKiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSB7CisgIC8vIFdoZW4gY29tcGlsZWQgd2l0aCBNU1ZDIDcuMSBpbiBvcHRpbWl6ZWQgbW9kZSwgZGVzdHJveWluZyB0aGUKKyAgLy8gVW5pdFRlc3Qgb2JqZWN0IHVwb24gZXhpdGluZyB0aGUgcHJvZ3JhbSBtZXNzZXMgdXAgdGhlIGV4aXQgY29kZSwKKyAgLy8gY2F1c2luZyBzdWNjZXNzZnVsIHRlc3RzIHRvIGFwcGVhciBmYWlsZWQuICBXZSBoYXZlIHRvIHVzZSBhCisgIC8vIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNhc2UgdG8gYnlwYXNzIHRoZSBjb21waWxlciBidWcuCisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5LCBhdCB0aGUgY29zdCBvZgorICAvLyBsZWFraW5nIHRoZSBVbml0VGVzdCBvYmplY3QuCisKKyAgLy8gQ29kZUdlYXIgQysrQnVpbGRlciBpbnNpc3RzIG9uIGEgcHVibGljIGRlc3RydWN0b3IgZm9yIHRoZQorICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgVXNlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8ga2VlcCBnb29kIE9PCisgIC8vIGRlc2lnbiB3aXRoIHByaXZhdGUgZGVzdHJ1Y3Rvci4KKworI2lmIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICBzdGF0aWMgVW5pdFRlc3QqIGNvbnN0IGluc3RhbmNlID0gbmV3IFVuaXRUZXN0OworICByZXR1cm4gaW5zdGFuY2U7CisjZWxzZQorICBzdGF0aWMgVW5pdFRlc3QgaW5zdGFuY2U7CisgIHJldHVybiAmaW5zdGFuY2U7CisjZW5kaWYgIC8vIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+ZmFpbGVkX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmRpc2FibGVkX3Rlc3RfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3Q6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50ZXN0X3RvX3J1bl9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisvLyBVTklYIGVwb2NoLgoraW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6c3RhcnRfdGltZXN0YW1wKCkgY29uc3QgeworICAgIHJldHVybiBpbXBsKCktPnN0YXJ0X3RpbWVzdGFtcCgpOworfQorCisvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KK2ludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OmVsYXBzZWRfdGltZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+ZWxhcHNlZF90aW1lKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KK2Jvb2wgVW5pdFRlc3Q6OlBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+UGFzc2VkKCk7IH0KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKy8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgorYm9vbCBVbml0VGVzdDo6RmFpbGVkKCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5GYWlsZWQoKTsgfQorCisvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPkdldFRlc3RDYXNlKGkpOworfQorCisvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgeworICByZXR1cm4gaW1wbCgpLT5HZXRNdXRhYmxlVGVzdENhc2UoaSk7Cit9CisKKy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCisvLyBpbnNpZGUgR29vZ2xlIFRlc3QuCitUZXN0RXZlbnRMaXN0ZW5lcnMmIFVuaXRUZXN0OjpsaXN0ZW5lcnMoKSB7CisgIHJldHVybiAqaW1wbCgpLT5saXN0ZW5lcnMoKTsKK30KKworLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAorLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4gdGhlCisvLyBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbSBoYXZlCisvLyBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbiB0aGUKKy8vICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KKy8vCisvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKKy8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgorRW52aXJvbm1lbnQqIFVuaXRUZXN0OjpBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7CisgIGlmIChlbnYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaW1wbF8tPmVudmlyb25tZW50cygpLnB1c2hfYmFjayhlbnYpOworICByZXR1cm4gZW52OworfQorCisvLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwgR29vZ2xlIFRlc3QKKy8vIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKSBldmVudHVhbGx5IGNhbGwKKy8vIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlIHNob3VsZCB1c2UgdGhlCisvLyBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5Lgordm9pZCBVbml0VGVzdDo6QWRkVGVzdFBhcnRSZXN1bHQoCisgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAorICAgIGludCBsaW5lX251bWJlciwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpCisgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IG1lc3NhZ2U7CisKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICBpZiAoaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkuc2l6ZSgpID4gMCkgeworICAgIG1zZyA8PCAiXG4iIDw8IEdURVNUX05BTUVfIDw8ICIgdHJhY2U6IjsKKworICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSk7CisgICAgICAgICBpID4gMDsgLS1pKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSA9IGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpW2kgLSAxXTsKKyAgICAgIG1zZyA8PCAiXG4iIDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24odHJhY2UuZmlsZSwgdHJhY2UubGluZSkKKyAgICAgICAgICA8PCAiICIgPDwgdHJhY2UubWVzc2FnZTsKKyAgICB9CisgIH0KKworICBpZiAob3Nfc3RhY2tfdHJhY2UuY19zdHIoKSAhPSBOVUxMICYmICFvc19zdGFja190cmFjZS5lbXB0eSgpKSB7CisgICAgbXNnIDw8IGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlciA8PCBvc19zdGFja190cmFjZTsKKyAgfQorCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHJlc3VsdCA9CisgICAgVGVzdFBhcnRSZXN1bHQocmVzdWx0X3R5cGUsIGZpbGVfbmFtZSwgbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICBpbXBsXy0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKS0+CisgICAgICBSZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworCisgIGlmIChyZXN1bHRfdHlwZSAhPSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpIHsKKyAgICAvLyBndGVzdF9icmVha19vbl9mYWlsdXJlIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgorICAgIC8vIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuICBUaGlzIGFsbG93cyBhIHVzZXIgdG8gc2V0IHRoZSBsYXR0ZXIKKyAgICAvLyBpbiB0aGUgY29kZSAocGVyaGFwcyBpbiBvcmRlciB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucworICAgIC8vIHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yaykgYW5kIHNwZWNpZnkgdGhlIGZvcm1lciBvbiB0aGUKKyAgICAvLyBjb21tYW5kIGxpbmUgZm9yIGRlYnVnZ2luZy4KKyAgICBpZiAoR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgICAgIC8vIFVzaW5nIERlYnVnQnJlYWsgb24gV2luZG93cyBhbGxvd3MgZ3Rlc3QgdG8gc3RpbGwgYnJlYWsgaW50byBhIGRlYnVnZ2VyCisgICAgICAvLyB3aGVuIGEgZmFpbHVyZSBoYXBwZW5zIGFuZCBib3RoIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgYW5kCisgICAgICAvLyB0aGUgLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIGZsYWdzIGFyZSBzcGVjaWZpZWQuCisgICAgICBEZWJ1Z0JyZWFrKCk7CisjZWxzZQorICAgICAgLy8gRGVyZWZlcmVuY2UgTlVMTCB0aHJvdWdoIGEgdm9sYXRpbGUgcG9pbnRlciB0byBwcmV2ZW50IHRoZSBjb21waWxlcgorICAgICAgLy8gZnJvbSByZW1vdmluZy4gV2UgdXNlIHRoaXMgcmF0aGVyIHRoYW4gYWJvcnQoKSBvciBfX2J1aWx0aW5fdHJhcCgpIGZvcgorICAgICAgLy8gcG9ydGFiaWxpdHk6IFN5bWJpYW4gZG9lc24ndCBpbXBsZW1lbnQgYWJvcnQoKSB3ZWxsLCBhbmQgc29tZSBkZWJ1Z2dlcnMKKyAgICAgIC8vIGRvbid0IGNvcnJlY3RseSB0cmFwIGFib3J0KCkuCisgICAgICAqc3RhdGljX2Nhc3Q8dm9sYXRpbGUgaW50Kj4oTlVMTCkgPSAxOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgICAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgICAgIHRocm93IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKHJlc3VsdCk7CisjZWxzZQorICAgICAgLy8gV2UgY2Fubm90IGNhbGwgYWJvcnQoKSBhcyBpdCBnZW5lcmF0ZXMgYSBwb3AtdXAgaW4gZGVidWcgbW9kZQorICAgICAgLy8gdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBpbiBWQyA3LjEgb3IgYmVsb3cuCisgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgfQorICB9Cit9CisKKy8vIENyZWF0ZXMgYW5kIGFkZHMgYSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0LiBJZiBhIHByb3BlcnR5IG1hdGNoaW5nCisvLyB0aGUgc3VwcGxpZWQgdmFsdWUgYWxyZWFkeSBleGlzdHMsIHVwZGF0ZXMgaXRzIHZhbHVlIGluc3RlYWQuCit2b2lkIFVuaXRUZXN0OjpSZWNvcmRQcm9wZXJ0eUZvckN1cnJlbnRUZXN0KGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgY29uc3QgVGVzdFByb3BlcnR5IHRlc3RfcHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgIGltcGxfLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPlJlY29yZFByb3BlcnR5KHRlc3RfcHJvcGVydHkpOworfQorCisvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKKy8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgoraW50IFVuaXRUZXN0OjpSdW4oKSB7CisgIC8vIENhcHR1cmVzIHRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpLiAgVGhpcyB2YWx1ZSB3aWxsIGJlCisgIC8vIHVzZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJvZ3JhbS4KKyAgaW1wbCgpLT5zZXRfY2F0Y2hfZXhjZXB0aW9ucyhHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKTsKKworI2lmIEdURVNUX0hBU19TRUgKKyAgY29uc3QgYm9vbCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPQorICAgICAgaW50ZXJuYWw6OkdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmxlbmd0aCgpID4gMDsKKworICAvLyBFaXRoZXIgdGhlIHVzZXIgd2FudHMgR29vZ2xlIFRlc3QgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlCisgIC8vIHRlc3RzIG9yIHRoaXMgaXMgZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIGRlYXRoIHRlc3QgY2hpbGQKKyAgLy8gcHJvY2Vzcy4gSW4gZWl0aGVyIGNhc2UgdGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0byBzZWUgcG9wLXVwIGRpYWxvZ3MKKyAgLy8gYWJvdXQgY3Jhc2hlcyAtIHRoZXkgYXJlIGV4cGVjdGVkLgorICBpZiAoaW1wbCgpLT5jYXRjaF9leGNlcHRpb25zKCkgfHwgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzKSB7CisjIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIC8vIFNldEVycm9yTW9kZSBkb2Vzbid0IGV4aXN0IG9uIENFLgorICAgIFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTIHwgU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFQgfAorICAgICAgICAgICAgICAgICBTRU1fTk9HUEZBVUxURVJST1JCT1ggfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjIGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBHVEVTVF9PU19XSU5ET1dTX01JTkdXKSAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBEZWF0aCB0ZXN0IGNoaWxkcmVuIGNhbiBiZSB0ZXJtaW5hdGVkIHdpdGggX2Fib3J0KCkuICBPbiBXaW5kb3dzLAorICAgIC8vIF9hYm9ydCgpIGNhbiBzaG93IGEgZGlhbG9nIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIGZvcmNlcyB0aGUKKyAgICAvLyBhYm9ydCBtZXNzYWdlIHRvIGdvIHRvIHN0ZGVyciBpbnN0ZWFkLgorICAgIF9zZXRfZXJyb3JfbW9kZShfT1VUX1RPX1NUREVSUik7CisjIGVuZGlmCisKKyMgaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBJbiB0aGUgZGVidWcgdmVyc2lvbiwgVmlzdWFsIFN0dWRpbyBwb3BzIHVwIGEgc2VwYXJhdGUgZGlhbG9nCisgICAgLy8gb2ZmZXJpbmcgYSBjaG9pY2UgdG8gZGVidWcgdGhlIGFib3J0ZWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBzdXBwcmVzcworICAgIC8vIHRoaXMgZGlhbG9nIG9yIGl0IHdpbGwgcG9wIHVwIGZvciBldmVyeSBFWFBFQ1QvQVNTRVJUX0RFQVRIIHN0YXRlbWVudAorICAgIC8vIGV4ZWN1dGVkLiBHb29nbGUgVGVzdCB3aWxsIG5vdGlmeSB0aGUgdXNlciBvZiBhbnkgdW5leHBlY3RlZAorICAgIC8vIGZhaWx1cmUgdmlhIHN0ZGVyci4KKyAgICAvLworICAgIC8vIFZDKysgZG9lc24ndCBkZWZpbmUgX3NldF9hYm9ydF9iZWhhdmlvcigpIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDguMC4KKyAgICAvLyBVc2VycyBvZiBwcmlvciBWQyB2ZXJzaW9ucyBzaGFsbCBzdWZmZXIgdGhlIGFnb255IGFuZCBwYWluIG9mCisgICAgLy8gY2xpY2tpbmcgdGhyb3VnaCB0aGUgY291bnRsZXNzIGRlYnVnIGRpYWxvZ3MuCisgICAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogZmluZCBhIHdheSB0byBzdXBwcmVzcyB0aGUgYWJvcnQgZGlhbG9nKCkgaW4gdGhlCisgICAgLy8gZGVidWcgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggVkMgNy4xIG9yIGxvd2VyLgorICAgIGlmICghR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkKKyAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoCisgICAgICAgICAgMHgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgX1dSSVRFX0FCT1JUX01TRyB8IF9DQUxMX1JFUE9SVEZBVUxUKTsgIC8vIHBvcC11cCB3aW5kb3csIGNvcmUgZHVtcC4KKyMgZW5kaWYKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyAgcmV0dXJuIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIGltcGwoKSwKKyAgICAgICZpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cywKKyAgICAgICJhdXhpbGlhcnkgdGVzdCBjb2RlIChlbnZpcm9ubWVudHMgb3IgZXZlbnQgbGlzdGVuZXJzKSIpID8gMCA6IDE7Cit9CisKKy8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKKy8vIGV4ZWN1dGVkLgorY29uc3QgY2hhciogVW5pdFRlc3Q6Om9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPm9yaWdpbmFsX3dvcmtpbmdfZGlyXy5jX3N0cigpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorY29uc3QgVGVzdEluZm8qIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfaW5mbygpOworfQorCisvLyBSZXR1cm5zIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KK2ludCBVbml0VGVzdDo6cmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+cmFuZG9tX3NlZWQoKTsgfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKy8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCitpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmCisgICAgVW5pdFRlc3Q6OnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpCisgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICByZXR1cm4gaW1wbF8tPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgorVW5pdFRlc3Q6OlVuaXRUZXN0KCkgeworICBpbXBsXyA9IG5ldyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKHRoaXMpOworfQorCisvLyBEZXN0cnVjdG9yIG9mIFVuaXRUZXN0LgorVW5pdFRlc3Q6On5Vbml0VGVzdCgpIHsKKyAgZGVsZXRlIGltcGxfOworfQorCisvLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCisvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KK3ZvaWQgVW5pdFRlc3Q6OlB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnB1c2hfYmFjayh0cmFjZSk7Cit9CisKKy8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgordm9pZCBVbml0VGVzdDo6UG9wR1Rlc3RUcmFjZSgpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucG9wX2JhY2soKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworVW5pdFRlc3RJbXBsOjpVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCkKKyAgICA6IHBhcmVudF8ocGFyZW50KSwKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzU1KSAgICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDM1NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNpbmcgdGhpcyBpbiBpbml0aWFsaXplcikuCisgICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlIGFnYWluLgorI2Vsc2UKKyAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorI2VuZGlmICAvLyBfTVNDX1ZFUgorICAgICAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8oCisgICAgICAgICAgJmRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKKyAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8oCisgICAgICAgICAgJmRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyksCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8oKSwKKyAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8oZmFsc2UpLAorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAgICAgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfKC0xKSwKKyAgICAgIGN1cnJlbnRfdGVzdF9jYXNlXyhOVUxMKSwKKyAgICAgIGN1cnJlbnRfdGVzdF9pbmZvXyhOVUxMKSwKKyAgICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8oKSwKKyAgICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8oTlVMTCksCisgICAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKGZhbHNlKSwKKyAgICAgIHJhbmRvbV9zZWVkXygwKSwgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgcmFuZG9tXygwKSwgIC8vIFdpbGwgYmUgcmVzZWVkZWQgYmVmb3JlIGZpcnN0IHVzZS4KKyAgICAgIHN0YXJ0X3RpbWVzdGFtcF8oMCksCisgICAgICBlbGFwc2VkX3RpbWVfKDApLAorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgICAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXyhOVUxMKSwKKyAgICAgIGRlYXRoX3Rlc3RfZmFjdG9yeV8obmV3IERlZmF1bHREZWF0aFRlc3RGYWN0b3J5KSwKKyNlbmRpZgorICAgICAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCisgICAgICBjYXRjaF9leGNlcHRpb25zXyhmYWxzZSkgeworICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIobmV3IFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Cit9CisKK1VuaXRUZXN0SW1wbDo6flVuaXRUZXN0SW1wbCgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0Q2FzZS4KKyAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0Q2FzZT4pOworCisgIC8vIERlbGV0ZXMgZXZlcnkgRW52aXJvbm1lbnQuCisgIEZvckVhY2goZW52aXJvbm1lbnRzXywgaW50ZXJuYWw6OkRlbGV0ZTxFbnZpcm9ubWVudD4pOworCisgIGRlbGV0ZSBvc19zdGFja190cmFjZV9nZXR0ZXJfOworfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKy8vIERpc2FibGVzIGV2ZW50IGZvcndhcmRpbmcgaWYgdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IGluIGEgZGVhdGggdGVzdAorLy8gc3VicHJvY2Vzcy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpIHsKKyAgaWYgKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpCisgICAgbGlzdGVuZXJzKCktPlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBwZXJmb3JtaW5nIFhNTCBvdXRwdXQgYXMgc3BlY2lmaWVkIGJ5CisvLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6Q29uZmlndXJlWG1sT3V0cHV0KCkgeworICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2Zvcm1hdCA9IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCk7CisgIGlmIChvdXRwdXRfZm9ybWF0ID09ICJ4bWwiKSB7CisgICAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRYbWxHZW5lcmF0b3IobmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcigKKyAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKS5jX3N0cigpKSk7CisgIH0gZWxzZSBpZiAob3V0cHV0X2Zvcm1hdCAhPSAiIikgeworICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIG91dHB1dCBmb3JtYXQgXCIlc1wiIGlnbm9yZWQuXG4iLAorICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9Cit9CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisvLyBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnMgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgaW4gc3RyaW5nIGZvcm0uCisvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7CisgIGlmICghdGFyZ2V0LmVtcHR5KCkpIHsKKyAgICBjb25zdCBzaXplX3QgcG9zID0gdGFyZ2V0LmZpbmQoJzonKTsKKyAgICBpZiAocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBsaXN0ZW5lcnMoKS0+QXBwZW5kKG5ldyBTdHJlYW1pbmdMaXN0ZW5lcih0YXJnZXQuc3Vic3RyKDAsIHBvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3Vic3RyKHBvcysxKSkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIldBUk5JTkc6IHVucmVjb2duaXplZCBzdHJlYW1pbmcgdGFyZ2V0IFwiJXNcIiBpZ25vcmVkLlxuIiwKKyAgICAgICAgICAgICB0YXJnZXQuY19zdHIoKSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworCisvLyBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBkZXBlbmRlbnQgdXBvbiBmbGFnIHZhbHVlcyBvYnRhaW5lZCBpbgorLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KKy8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKKy8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCisvLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50Lgordm9pZCBVbml0VGVzdEltcGw6OlBvc3RGbGFnUGFyc2luZ0luaXQoKSB7CisgIC8vIEVuc3VyZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4ZWN1dGUgbW9yZSB0aGFuIG9uY2UuCisgIGlmICghcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXykgeworICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8gPSB0cnVlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgICBJbml0RGVhdGhUZXN0U3VicHJvY2Vzc0NvbnRyb2xJbmZvKCk7CisgICAgU3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICAgIC8vIFJlZ2lzdGVycyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBUaGlzIG1ha2VzIHBhcmFtZXRlcml6ZWQgdGVzdHMKKyAgICAvLyBhdmFpbGFibGUgdG8gdGhlIFVuaXRUZXN0IHJlZmxlY3Rpb24gQVBJIHdpdGhvdXQgcnVubmluZworICAgIC8vIFJVTl9BTExfVEVTVFMuCisgICAgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKKworICAgIC8vIENvbmZpZ3VyZXMgbGlzdGVuZXJzIGZvciBYTUwgb3V0cHV0LiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycworICAgIC8vIHRvIHNodXQgZG93biB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0IGJlZm9yZSBpbnZva2luZyBSVU5fQUxMX1RFU1RTLgorICAgIENvbmZpZ3VyZVhtbE91dHB1dCgpOworCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworICAgIC8vIENvbmZpZ3VyZXMgbGlzdGVuZXJzIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyLgorICAgIENvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpOworI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgIH0KK30KKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIG5hbWUgb2YgYSBUZXN0Q2FzZSBhZ2FpbnN0IGEga25vd24KKy8vIHZhbHVlLgorLy8KKy8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzIG9ubHkuICBXZSBwdXQKKy8vIGl0IGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIHRvIHByZXZlbnQgcG9sbHV0aW5nIHRoZSBvdXRlcgorLy8gbmFtZXNwYWNlLgorLy8KKy8vIFRlc3RDYXNlTmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdENhc2VOYW1lSXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3RDYXNlTmFtZUlzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG5hbWUgb2YgdGVzdF9jYXNlIG1hdGNoZXMgbmFtZV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfY2FzZSAhPSBOVUxMICYmIHN0cmNtcCh0ZXN0X2Nhc2UtPm5hbWUoKSwgbmFtZV8uY19zdHIoKSkgPT0gMDsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCisvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAorLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LiAgSXQncyB0aGUgQ0FMTEVSJ1MKKy8vIFJFU1BPTlNJQklMSVRZIHRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgV0hFTiBUSEUKKy8vIFRFU1RTIEFSRSBOT1QgU0hVRkZMRUQuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICB0eXBlX3BhcmFtOiAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2UqIFVuaXRUZXN0SW1wbDo6R2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKSB7CisgIC8vIENhbiB3ZSBmaW5kIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZT8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPjo6Y29uc3RfaXRlcmF0b3IgdGVzdF9jYXNlID0KKyAgICAgIHN0ZDo6ZmluZF9pZih0ZXN0X2Nhc2VzXy5iZWdpbigpLCB0ZXN0X2Nhc2VzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZU5hbWVJcyh0ZXN0X2Nhc2VfbmFtZSkpOworCisgIGlmICh0ZXN0X2Nhc2UgIT0gdGVzdF9jYXNlc18uZW5kKCkpCisgICAgcmV0dXJuICp0ZXN0X2Nhc2U7CisKKyAgLy8gTm8uICBMZXQncyBjcmVhdGUgb25lLgorICBUZXN0Q2FzZSogY29uc3QgbmV3X3Rlc3RfY2FzZSA9CisgICAgICBuZXcgVGVzdENhc2UodGVzdF9jYXNlX25hbWUsIHR5cGVfcGFyYW0sIHNldF91cF90YywgdGVhcl9kb3duX3RjKTsKKworICAvLyBJcyB0aGlzIGEgZGVhdGggdGVzdCBjYXNlPworICBpZiAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlYXRoVGVzdENhc2VGaWx0ZXIpKSB7CisgICAgLy8gWWVzLiAgSW5zZXJ0cyB0aGUgdGVzdCBjYXNlIGFmdGVyIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZQorICAgIC8vIGRlZmluZWQgc28gZmFyLiAgVGhpcyBvbmx5IHdvcmtzIHdoZW4gdGhlIHRlc3QgY2FzZXMgaGF2ZW4ndAorICAgIC8vIGJlZW4gc2h1ZmZsZWQuICBPdGhlcndpc2Ugd2UgbWF5IGVuZCB1cCBydW5uaW5nIGEgZGVhdGggdGVzdAorICAgIC8vIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QuCisgICAgKytsYXN0X2RlYXRoX3Rlc3RfY2FzZV87CisgICAgdGVzdF9jYXNlc18uaW5zZXJ0KHRlc3RfY2FzZXNfLmJlZ2luKCkgKyBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8sCisgICAgICAgICAgICAgICAgICAgICAgIG5ld190ZXN0X2Nhc2UpOworICB9IGVsc2UgeworICAgIC8vIE5vLiAgQXBwZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgIHRlc3RfY2FzZXNfLnB1c2hfYmFjayhuZXdfdGVzdF9jYXNlKTsKKyAgfQorCisgIHRlc3RfY2FzZV9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VfaW5kaWNlc18uc2l6ZSgpKSk7CisgIHJldHVybiBuZXdfdGVzdF9jYXNlOworfQorCisvLyBIZWxwZXJzIGZvciBzZXR0aW5nIHVwIC8gdGVhcmluZyBkb3duIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4gIFRoZXkKKy8vIGFyZSBmb3IgdXNlIGluIHRoZSBGb3JFYWNoKCkgZnVuY3Rpb24uCitzdGF0aWMgdm9pZCBTZXRVcEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5TZXRVcCgpOyB9CitzdGF0aWMgdm9pZCBUZWFyRG93bkVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5UZWFyRG93bigpOyB9CisKKy8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcworLy8gdGhyb3duIGR1cmluZyBhIHRlc3QsIHRoZSB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQgdGhlCisvLyByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4KKy8vCisvLyBXaGVuIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQsIGl0IGV4cGFuZHMgYW5kIHJlZ2lzdGVycworLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBmaXJzdCBpbiBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpLgorLy8gQWxsIG90aGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cygpIG1heSBzYWZlbHkgYXNzdW1lIHRoYXQKKy8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIHJlYWR5IHRvIGJlIGNvdW50ZWQgYW5kIHJ1bi4KK2Jvb2wgVW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cygpIHsKKyAgLy8gTWFrZXMgc3VyZSBJbml0R29vZ2xlVGVzdCgpIHdhcyBjYWxsZWQuCisgIGlmICghR1Rlc3RJc0luaXRpYWxpemVkKCkpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIlxuVGhpcyB0ZXN0IHByb2dyYW0gZGlkIE5PVCBjYWxsIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QgIgorICAgICAgICAgICAiYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLiAgUGxlYXNlIGZpeCBpdC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIERvIG5vdCBydW4gYW55IHRlc3QgaWYgdGhlIC0taGVscCBmbGFnIHdhcyBzcGVjaWZpZWQuCisgIGlmIChnX2hlbHBfZmxhZykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBSZXBlYXRzIHRoZSBjYWxsIHRvIHRoZSBwb3N0LWZsYWcgcGFyc2luZyBpbml0aWFsaXphdGlvbiBpbiBjYXNlIHRoZQorICAvLyB1c2VyIGRpZG4ndCBjYWxsIEluaXRHb29nbGVUZXN0LgorICBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7CisKKyAgLy8gRXZlbiBpZiBzaGFyZGluZyBpcyBub3Qgb24sIHRlc3QgcnVubmVycyBtYXkgd2FudCB0byB1c2UgdGhlCisgIC8vIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIHRvIHF1ZXJ5IHdoZXRoZXIgdGhlIHRlc3Qgc3VwcG9ydHMgdGhlIHNoYXJkaW5nCisgIC8vIHByb3RvY29sLgorICBpbnRlcm5hbDo6V3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKyAgLy8gVHJ1ZSBpZmYgd2UgYXJlIGluIGEgc3VicHJvY2VzcyBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QuCisgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IGZhbHNlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICBjb25zdCBib29sIHNob3VsZF9zaGFyZCA9IFNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KTsKKworICAvLyBDb21wYXJlcyB0aGUgZnVsbCB0ZXN0IG5hbWVzIHdpdGggdGhlIGZpbHRlciB0byBkZWNpZGUgd2hpY2gKKyAgLy8gdGVzdHMgdG8gcnVuLgorICBjb25zdCBib29sIGhhc190ZXN0c190b19ydW4gPSBGaWx0ZXJUZXN0cyhzaG91bGRfc2hhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wpID4gMDsKKworICAvLyBMaXN0cyB0aGUgdGVzdHMgYW5kIGV4aXRzIGlmIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3YXMgc3BlY2lmaWVkLgorICBpZiAoR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgeworICAgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiBGaWx0ZXJUZXN0cygpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhzaHVmZmxlKSA/CisgICAgICBHZXRSYW5kb21TZWVkRnJvbUZsYWcoR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIDogMDsKKworICAvLyBUcnVlIGlmZiBhdCBsZWFzdCBvbmUgdGVzdCBoYXMgZmFpbGVkLgorICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IGxpc3RlbmVycygpLT5yZXBlYXRlcigpOworCisgIHN0YXJ0X3RpbWVzdGFtcF8gPSBHZXRUaW1lSW5NaWxsaXMoKTsKKyAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1TdGFydCgqcGFyZW50Xyk7CisKKyAgLy8gSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IHRoZSB0ZXN0cz8gIFdlIGRvbid0IHdhbnQgdG8gcmVwZWF0IHRoZW0KKyAgLy8gd2hlbiB3ZSBhcmUgaW5zaWRlIHRoZSBzdWJwcm9jZXNzIG9mIGEgZGVhdGggdGVzdC4KKyAgY29uc3QgaW50IHJlcGVhdCA9IGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPyAxIDogR1RFU1RfRkxBRyhyZXBlYXQpOworICAvLyBSZXBlYXRzIGZvcmV2ZXIgaWYgdGhlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZS4KKyAgY29uc3QgYm9vbCBmb3JldmVyID0gcmVwZWF0IDwgMDsKKyAgZm9yIChpbnQgaSA9IDA7IGZvcmV2ZXIgfHwgaSAhPSByZXBlYXQ7IGkrKykgeworICAgIC8vIFdlIHdhbnQgdG8gcHJlc2VydmUgZmFpbHVyZXMgZ2VuZXJhdGVkIGJ5IGFkLWhvYyB0ZXN0CisgICAgLy8gYXNzZXJ0aW9ucyBleGVjdXRlZCBiZWZvcmUgUlVOX0FMTF9URVNUUygpLgorICAgIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCk7CisKKyAgICBjb25zdCBUaW1lSW5NaWxsaXMgc3RhcnQgPSBHZXRUaW1lSW5NaWxsaXMoKTsKKworICAgIC8vIFNodWZmbGVzIHRlc3QgY2FzZXMgYW5kIHRlc3RzIGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1biAmJiBHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgICByYW5kb20oKS0+UmVzZWVkKHJhbmRvbV9zZWVkXyk7CisgICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KCksCisgICAgICAvLyBzdWNoIHRoYXQgYSB0ZXN0IGV2ZW50IGxpc3RlbmVyIGNhbiBzZWUgdGhlIGFjdHVhbCB0ZXN0IG9yZGVyCisgICAgICAvLyBpbiB0aGUgZXZlbnQuCisgICAgICBTaHVmZmxlVGVzdHMoKTsKKyAgICB9CisKKyAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IHRoZSB0ZXN0cyBhcmUgYWJvdXQgdG8gc3RhcnQuCisgICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KCpwYXJlbnRfLCBpKTsKKworICAgIC8vIFJ1bnMgZWFjaCB0ZXN0IGNhc2UgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRlc3QgdG8gcnVuLgorICAgIGlmIChoYXNfdGVzdHNfdG9fcnVuKSB7CisgICAgICAvLyBTZXRzIHVwIGFsbCBlbnZpcm9ubWVudHMgYmVmb3JlaGFuZC4KKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwU3RhcnQoKnBhcmVudF8pOworICAgICAgRm9yRWFjaChlbnZpcm9ubWVudHNfLCBTZXRVcEVudmlyb25tZW50KTsKKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwRW5kKCpwYXJlbnRfKTsKKworICAgICAgLy8gUnVucyB0aGUgdGVzdHMgb25seSBpZiB0aGVyZSB3YXMgbm8gZmF0YWwgZmFpbHVyZSBkdXJpbmcgZ2xvYmFsCisgICAgICAvLyBzZXQtdXAuCisgICAgICBpZiAoIVRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgICAgIGZvciAoaW50IHRlc3RfaW5kZXggPSAwOyB0ZXN0X2luZGV4IDwgdG90YWxfdGVzdF9jYXNlX2NvdW50KCk7CisgICAgICAgICAgICAgdGVzdF9pbmRleCsrKSB7CisgICAgICAgICAgR2V0TXV0YWJsZVRlc3RDYXNlKHRlc3RfaW5kZXgpLT5SdW4oKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBUZWFycyBkb3duIGFsbCBlbnZpcm9ubWVudHMgaW4gcmV2ZXJzZSBvcmRlciBhZnRlcndhcmRzLgorICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCgqcGFyZW50Xyk7CisgICAgICBzdGQ6OmZvcl9lYWNoKGVudmlyb25tZW50c18ucmJlZ2luKCksIGVudmlyb25tZW50c18ucmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBUZWFyRG93bkVudmlyb25tZW50KTsKKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kKCpwYXJlbnRfKTsKKyAgICB9CisKKyAgICBlbGFwc2VkX3RpbWVfID0gR2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICAgIC8vIFRlbGxzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCB0aGUgdGVzdHMgaGF2ZSBqdXN0IGZpbmlzaGVkLgorICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25FbmQoKnBhcmVudF8sIGkpOworCisgICAgLy8gR2V0cyB0aGUgcmVzdWx0IGFuZCBjbGVhcnMgaXQuCisgICAgaWYgKCFQYXNzZWQoKSkgeworICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgdGVzdCBvcmRlciBhZnRlciB0aGUgaXRlcmF0aW9uLiAgVGhpcworICAgIC8vIGFsbG93cyB0aGUgdXNlciB0byBxdWlja2x5IHJlcHJvIGEgZmFpbHVyZSB0aGF0IGhhcHBlbnMgaW4gdGhlCisgICAgLy8gTi10aCBpdGVyYXRpb24gd2l0aG91dCByZXBlYXRpbmcgdGhlIGZpcnN0IChOIC0gMSkgaXRlcmF0aW9ucy4KKyAgICAvLyBUaGlzIGlzIG5vdCBlbmNsb3NlZCBpbiAiaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsgLi4uIH0iLCBpbgorICAgIC8vIGNhc2UgdGhlIHVzZXIgc29tZWhvdyBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBzb21ld2hlcmUKKyAgICAvLyAoaXQncyBhbHdheXMgc2FmZSB0byB1bnNodWZmbGUgdGhlIHRlc3RzKS4KKyAgICBVbnNodWZmbGVUZXN0cygpOworCisgICAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICAgIC8vIFBpY2tzIGEgbmV3IHJhbmRvbSBzZWVkIGZvciBlYWNoIGl0ZXJhdGlvbi4KKyAgICAgIHJhbmRvbV9zZWVkXyA9IEdldE5leHRSYW5kb21TZWVkKHJhbmRvbV9zZWVkXyk7CisgICAgfQorICB9CisKKyAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1FbmQoKnBhcmVudF8pOworCisgIHJldHVybiAhZmFpbGVkOworfQorCisvLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlCisvLyBpZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudC4gSWYgYSBmaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24sIHRoaXMKKy8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QKKy8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuCit2b2lkIFdyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgdGVzdF9zaGFyZF9maWxlID0gcG9zaXg6OkdldEVudihrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgIGlmICh0ZXN0X3NoYXJkX2ZpbGUgIT0gTlVMTCkgeworICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4odGVzdF9zaGFyZF9maWxlLCAidyIpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlIFwiJXNcIiAiCisgICAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgYnkgdGhlICVzIGVudmlyb25tZW50IHZhcmlhYmxlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9zaGFyZF9maWxlLCBrVGVzdFNoYXJkU3RhdHVzRmlsZSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICB9Cit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoaS5lLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK2Jvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX2VudiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfZW52LAorICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgaWYgKGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBJbnQzMkZyb21FbnZPckRpZSh0b3RhbF9zaGFyZHNfZW52LCAtMSk7CisgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoc2hhcmRfaW5kZXhfZW52LCAtMSk7CisKKyAgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggIT0gLTEpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCisgICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA9ICIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsIGJ1dCBoYXZlIGxlZnQgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyAhPSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKKyAgICAgIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiA9ICIgPDwgdG90YWxfc2hhcmRzCisgICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgdW5zZXQuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9IGVsc2UgaWYgKHNoYXJkX2luZGV4IDwgMCB8fCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB3ZSByZXF1aXJlIDAgPD0gIgorICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPCAiIDw8IGtUZXN0VG90YWxTaGFyZHMKKyAgICAgIDw8ICIsIGJ1dCB5b3UgaGF2ZSAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiPSIgPDwgc2hhcmRfaW5kZXgKKyAgICAgIDw8ICIsICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiPSIgPDwgdG90YWxfc2hhcmRzIDw8ICIuXG4iOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisKKyAgcmV0dXJuIHRvdGFsX3NoYXJkcyA+IDE7Cit9CisKKy8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKKy8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yCisvLyBhbmQgYWJvcnRzLgorSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCkgeworICBjb25zdCBjaGFyKiBzdHJfdmFsID0gcG9zaXg6OkdldEVudih2YXIpOworICBpZiAoc3RyX3ZhbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsOworICB9CisKKyAgSW50MzIgcmVzdWx0OworICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCB2YXIsCisgICAgICAgICAgICAgICAgICBzdHJfdmFsLCAmcmVzdWx0KSkgeworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCisvLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKKy8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0CisvLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgorYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZChpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKSB7CisgIHJldHVybiAodGVzdF9pZCAlIHRvdGFsX3NoYXJkcykgPT0gc2hhcmRfaW5kZXg7Cit9CisKKy8vIENvbXBhcmVzIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgdG8KKy8vIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4sIHRoZW4gcmVjb3JkcyB0aGUgcmVzdWx0IGluCisvLyBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCisvLyBJZiBzaGFyZF90ZXN0cyA9PSB0cnVlLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMgYmFzZWQgb24gc2hhcmRpbmcKKy8vIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQgLSBzZWUKKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6RmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKSB7CisgIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0VG90YWxTaGFyZHMsIC0xKSA6IC0xOworICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpIDogLTE7CisKKyAgLy8gbnVtX3J1bm5hYmxlX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgd2lsbAorICAvLyBydW4gYWNyb3NzIGFsbCBzaGFyZHMgKGkuZS4sIG1hdGNoIGZpbHRlciBhbmQgYXJlIG5vdCBkaXNhYmxlZCkuCisgIC8vIG51bV9zZWxlY3RlZF90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBydW4gb24KKyAgLy8gdGhpcyBzaGFyZC4KKyAgaW50IG51bV9ydW5uYWJsZV90ZXN0cyA9IDA7CisgIGludCBudW1fc2VsZWN0ZWRfdGVzdHMgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSA9IHRlc3RfY2FzZS0+bmFtZSgpOworICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4oZmFsc2UpOworCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKKyAgICAgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X25hbWUodGVzdF9pbmZvLT5uYW1lKCkpOworICAgICAgLy8gQSB0ZXN0IGlzIGRpc2FibGVkIGlmIHRlc3QgY2FzZSBuYW1lIG9yIHRlc3QgbmFtZSBtYXRjaGVzCisgICAgICAvLyBrRGlzYWJsZVRlc3RGaWx0ZXIuCisgICAgICBjb25zdCBib29sIGlzX2Rpc2FibGVkID0KKyAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKSB8fAorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKTsKKyAgICAgIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfID0gaXNfZGlzYWJsZWQ7CisKKyAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlc19maWx0ZXIgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk7CisgICAgICB0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXyA9IG1hdGNoZXNfZmlsdGVyOworCisgICAgICBjb25zdCBib29sIGlzX3J1bm5hYmxlID0KKyAgICAgICAgICAoR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgfHwgIWlzX2Rpc2FibGVkKSAmJgorICAgICAgICAgIG1hdGNoZXNfZmlsdGVyOworCisgICAgICBjb25zdCBib29sIGlzX3NlbGVjdGVkID0gaXNfcnVubmFibGUgJiYKKyAgICAgICAgICAoc2hhcmRfdGVzdHMgPT0gSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MIHx8CisgICAgICAgICAgIFNob3VsZFJ1blRlc3RPblNoYXJkKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ydW5uYWJsZV90ZXN0cykpOworCisgICAgICBudW1fcnVubmFibGVfdGVzdHMgKz0gaXNfcnVubmFibGU7CisgICAgICBudW1fc2VsZWN0ZWRfdGVzdHMgKz0gaXNfc2VsZWN0ZWQ7CisKKyAgICAgIHRlc3RfaW5mby0+c2hvdWxkX3J1bl8gPSBpc19zZWxlY3RlZDsKKyAgICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4odGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgfHwgaXNfc2VsZWN0ZWQpOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX3NlbGVjdGVkX3Rlc3RzOworfQorCisvLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCit2b2lkIFVuaXRUZXN0SW1wbDo6TGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gdGVzdF9jYXNlc19baV07CisgICAgYm9vbCBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgeworICAgICAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgICAgICAgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOworICAgICAgaWYgKHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfKSB7CisgICAgICAgIGlmICghcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSkgeworICAgICAgICAgIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSB0cnVlOworICAgICAgICAgIHByaW50ZigiJXMuXG4iLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgICVzXG4iLCB0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisvLworLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGFyZQorLy8gdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlIGlucHV0IHRoZQorLy8gY3VycmVudCBnZXR0ZXIuCit2b2lkIFVuaXRUZXN0SW1wbDo6c2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcigKKyAgICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcikgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyAhPSBnZXR0ZXIpIHsKKyAgICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKKyAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gZ2V0dGVyOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOworLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKy8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCitPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIFVuaXRUZXN0SW1wbDo6b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCkgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9PSBOVUxMKSB7CisgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IG5ldyBPc1N0YWNrVHJhY2VHZXR0ZXI7CisgIH0KKworICByZXR1cm4gb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCitUZXN0UmVzdWx0KiBVbml0VGVzdEltcGw6OmN1cnJlbnRfdGVzdF9yZXN1bHQoKSB7CisgIHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb18gPworICAgICAgJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pIDogJmFkX2hvY190ZXN0X3Jlc3VsdF87Cit9CisKKy8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKKy8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTaHVmZmxlVGVzdHMoKSB7CisgIC8vIFNodWZmbGVzIHRoZSBkZWF0aCB0ZXN0IGNhc2VzLgorICBTaHVmZmxlUmFuZ2UocmFuZG9tKCksIDAsIGxhc3RfZGVhdGhfdGVzdF9jYXNlXyArIDEsICZ0ZXN0X2Nhc2VfaW5kaWNlc18pOworCisgIC8vIFNodWZmbGVzIHRoZSBub24tZGVhdGggdGVzdCBjYXNlcy4KKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VzXy5zaXplKCkpLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKKworICAvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW5zaWRlIGVhY2ggdGVzdCBjYXNlLgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgdGVzdF9jYXNlc19baV0tPlNodWZmbGVUZXN0cyhyYW5kb20oKSk7CisgIH0KK30KKworLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpVbnNodWZmbGVUZXN0cygpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIC8vIFVuc2h1ZmZsZXMgdGhlIHRlc3RzIGluIGVhY2ggdGVzdCBjYXNlLgorICAgIHRlc3RfY2FzZXNfW2ldLT5VbnNodWZmbGVUZXN0cygpOworICAgIC8vIFJlc2V0cyB0aGUgaW5kZXggb2YgZWFjaCB0ZXN0IGNhc2UuCisgICAgdGVzdF9jYXNlX2luZGljZXNfW2ldID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorLy8KKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCisvLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitzdGQ6OnN0cmluZyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKFVuaXRUZXN0KiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcF9jb3VudCkgeworICAvLyBXZSBwYXNzIHNraXBfY291bnQgKyAxIHRvIHNraXAgdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGluIGFkZGl0aW9uCisgIC8vIHRvIHdoYXQgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIHRvIHNraXAuCisgIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChza2lwX2NvdW50ICsgMSk7Cit9CisKKy8vIFVzZWQgYnkgdGhlIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18gbWFjcm8gdG8KKy8vIHN1cHByZXNzIHVucmVhY2hhYmxlIGNvZGUgd2FybmluZ3MuCituYW1lc3BhY2UgeworY2xhc3MgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUge307Cit9CisKK2Jvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKSB7IHJldHVybiBjb25kaXRpb247IH0KKworYm9vbCBBbHdheXNUcnVlKCkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgIC8vIFRoaXMgY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZSBzbyBBbHdheXNUcnVlKCkgbmV2ZXIgYWN0dWFsbHkgdGhyb3dzLAorICAvLyBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoYXQgaXQgbWF5IHRocm93LgorICBpZiAoSXNUcnVlKGZhbHNlKSkKKyAgICB0aHJvdyBDbGFzc1VuaXF1ZVRvQWx3YXlzVHJ1ZSgpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKKy8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAorLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgorYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpIHsKKyAgY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgaWYgKHN0cm5jbXAoKnBzdHIsIHByZWZpeCwgcHJlZml4X2xlbikgPT0gMCkgeworICAgICpwc3RyICs9IHByZWZpeF9sZW47CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgYXMgYSBjb21tYW5kIGxpbmUgZmxhZy4gIFRoZSBzdHJpbmcgc2hvdWxkIGhhdmUKKy8vIHRoZSBmb3JtYXQgIi0tZmxhZz12YWx1ZSIuICBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCB0aGUgIj12YWx1ZSIKKy8vIHBhcnQgY2FuIGJlIG9taXR0ZWQuCisvLworLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcsIG9yIE5VTEwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorY29uc3QgY2hhciogUGFyc2VGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmX29wdGlvbmFsKSB7CisgIC8vIHN0ciBhbmQgZmxhZyBtdXN0IG5vdCBiZSBOVUxMLgorICBpZiAoc3RyID09IE5VTEwgfHwgZmxhZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAvLyBUaGUgZmxhZyBtdXN0IHN0YXJ0IHdpdGggIi0tIiBmb2xsb3dlZCBieSBHVEVTVF9GTEFHX1BSRUZJWF8uCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYWdfc3RyID0gc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBmbGFnOworICBjb25zdCBzaXplX3QgZmxhZ19sZW4gPSBmbGFnX3N0ci5sZW5ndGgoKTsKKyAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgLy8gU2tpcHMgdGhlIGZsYWcgbmFtZS4KKyAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsKKworICAvLyBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCBpdCdzIE9LIHRvIG5vdCBoYXZlIGEgIj12YWx1ZSIgcGFydC4KKyAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHsKKyAgICByZXR1cm4gZmxhZ19lbmQ7CisgIH0KKworICAvLyBJZiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG1vcmUgY2hhcmFjdGVycyBhZnRlciB0aGUKKyAgLy8gZmxhZyBuYW1lLCBvciBpZiBkZWZfb3B0aW9uYWwgaXMgZmFsc2UsIHRoZXJlIG11c3QgYmUgYSAnPScgYWZ0ZXIKKyAgLy8gdGhlIGZsYWcgbmFtZS4KKyAgaWYgKGZsYWdfZW5kWzBdICE9ICc9JykgcmV0dXJuIE5VTEw7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4KKyAgcmV0dXJuIGZsYWdfZW5kICsgMTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIGJvb2wgZmxhZywgaW4gdGhlIGZvcm0gb2YgZWl0aGVyCisvLyAiLS1mbGFnPXZhbHVlIiBvciAiLS1mbGFnIi4KKy8vCisvLyBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlIGFzIGxvbmcgYXMgaXQgZG9lcworLy8gbm90IHN0YXJ0IHdpdGggJzAnLCAnZicsIG9yICdGJy4KKy8vCisvLyBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlQm9vbEZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBib29sKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCB0cnVlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgYm9vbC4KKyAgKnZhbHVlID0gISgqdmFsdWVfc3RyID09ICcwJyB8fCAqdmFsdWVfc3RyID09ICdmJyB8fCAqdmFsdWVfc3RyID09ICdGJyk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUludDMyRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIEludDMyKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgorICByZXR1cm4gUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBmbGFnIC0tIiA8PCBmbGFnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHZhbHVlKTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIHN0cmluZyBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VTdHJpbmdGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgICp2YWx1ZSA9IHZhbHVlX3N0cjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBoYXMgYSBwcmVmaXggdGhhdCBHb29nbGUgVGVzdCB1c2VzIGZvciBpdHMKKy8vIGZsYWdzLCBpLmUuLCBzdGFydHMgd2l0aCBHVEVTVF9GTEFHX1BSRUZJWF8gb3IgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8uCisvLyBJZiBHb29nbGUgVGVzdCBkZXRlY3RzIHRoYXQgYSBjb21tYW5kIGxpbmUgZmxhZyBoYXMgaXRzIHByZWZpeCBidXQgaXMgbm90CisvLyByZWNvZ25pemVkLCBpdCB3aWxsIHByaW50IGl0cyBoZWxwIG1lc3NhZ2UuIEZsYWdzIHN0YXJ0aW5nIHdpdGgKKy8vIEdURVNUX0lOVEVSTkFMX1BSRUZJWF8gZm9sbG93ZWQgYnkgImludGVybmFsXyIgYXJlIGNvbnNpZGVyZWQgR29vZ2xlIFRlc3QKKy8vIGludGVybmFsIGZsYWdzIGFuZCBkbyBub3QgdHJpZ2dlciB0aGUgaGVscCBtZXNzYWdlLgorc3RhdGljIGJvb2wgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiAoU2tpcFByZWZpeCgiLS0iLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoIi0iLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoIi8iLCAmc3RyKSkgJiYKKyAgICAgICAgICFTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXyAiaW50ZXJuYWxfIiwgJnN0cikgJiYKKyAgICAgICAgIChTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXywgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLCAmc3RyKSk7Cit9CisKKy8vIFByaW50cyBhIHN0cmluZyBjb250YWluaW5nIGNvZGUtZW5jb2RlZCB0ZXh0LiAgVGhlIGZvbGxvd2luZyBlc2NhcGUKKy8vIHNlcXVlbmNlcyBjYW4gYmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNvbnRyb2wgdGhlIHRleHQgY29sb3I6CisvLworLy8gICBAQCAgICBwcmludHMgYSBzaW5nbGUgJ0AnIGNoYXJhY3Rlci4KKy8vICAgQFIgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gcmVkLgorLy8gICBARyAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byBncmVlbi4KKy8vICAgQFkgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8geWVsbG93LgorLy8gICBARCAgICBjaGFuZ2VzIHRvIHRoZSBkZWZhdWx0IHRlcm1pbmFsIHRleHQgY29sb3IuCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFdyaXRlIHRlc3RzIGZvciB0aGlzIG9uY2Ugd2UgYWRkIHN0ZG91dAorLy8gY2FwdHVyaW5nIHRvIEdvb2dsZSBUZXN0Lgorc3RhdGljIHZvaWQgUHJpbnRDb2xvckVuY29kZWQoY29uc3QgY2hhciogc3RyKSB7CisgIEdUZXN0Q29sb3IgY29sb3IgPSBDT0xPUl9ERUZBVUxUOyAgLy8gVGhlIGN1cnJlbnQgY29sb3IuCisKKyAgLy8gQ29uY2VwdHVhbGx5LCB3ZSBzcGxpdCB0aGUgc3RyaW5nIGludG8gc2VnbWVudHMgZGl2aWRlZCBieSBlc2NhcGUKKyAgLy8gc2VxdWVuY2VzLiAgVGhlbiB3ZSBwcmludCBvbmUgc2VnbWVudCBhdCBhIHRpbWUuICBBdCB0aGUgZW5kIG9mCisgIC8vIGVhY2ggaXRlcmF0aW9uLCB0aGUgc3RyIHBvaW50ZXIgYWR2YW5jZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgLy8gbmV4dCBzZWdtZW50LgorICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciogcCA9IHN0cmNocihzdHIsICdAJyk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiJXMiLCBzdGQ6OnN0cmluZyhzdHIsIHApLmNfc3RyKCkpOworCisgICAgY29uc3QgY2hhciBjaCA9IHBbMV07CisgICAgc3RyID0gcCArIDI7CisgICAgaWYgKGNoID09ICdAJykgeworICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIkAiKTsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdEJykgeworICAgICAgY29sb3IgPSBDT0xPUl9ERUZBVUxUOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1InKSB7CisgICAgICBjb2xvciA9IENPTE9SX1JFRDsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdHJykgeworICAgICAgY29sb3IgPSBDT0xPUl9HUkVFTjsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdZJykgeworICAgICAgY29sb3IgPSBDT0xPUl9ZRUxMT1c7CisgICAgfSBlbHNlIHsKKyAgICAgIC0tc3RyOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciBrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2VbXSA9CisiVGhpcyBwcm9ncmFtIGNvbnRhaW5zIHRlc3RzIHdyaXR0ZW4gdXNpbmcgIiBHVEVTVF9OQU1FXyAiLiBZb3UgY2FuIHVzZSB0aGVcbiIKKyJmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGZsYWdzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yOlxuIgorIlxuIgorIlRlc3QgU2VsZWN0aW9uOlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQERcbiIKKyIgICAgICBMaXN0IHRoZSBuYW1lcyBvZiBhbGwgdGVzdHMgaW5zdGVhZCBvZiBydW5uaW5nIHRoZW0uIFRoZSBuYW1lIG9mXG4iCisiICAgICAgVEVTVChGb28sIEJhcikgaXMgXCJGb28uQmFyXCIuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImZpbHRlcj1AWVBPU1RJVkVfUEFUVEVSTlMiCisgICAgIltARy1AWU5FR0FUSVZFX1BBVFRFUk5TXUBEXG4iCisiICAgICAgUnVuIG9ubHkgdGhlIHRlc3RzIHdob3NlIG5hbWUgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGJ1dFxuIgorIiAgICAgIG5vbmUgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLiAnPycgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlcjsgJyonXG4iCisiICAgICAgbWF0Y2hlcyBhbnkgc3Vic3RyaW5nOyAnOicgc2VwYXJhdGVzIHR3byBwYXR0ZXJucy5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNARFxuIgorIiAgICAgIFJ1biBhbGwgZGlzYWJsZWQgdGVzdHMgdG9vLlxuIgorIlxuIgorIlRlc3QgRXhlY3V0aW9uOlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyZXBlYXQ9QFlbQ09VTlRdQERcbiIKKyIgICAgICBSdW4gdGhlIHRlc3RzIHJlcGVhdGVkbHk7IHVzZSBhIG5lZ2F0aXZlIGNvdW50IHRvIHJlcGVhdCBmb3JldmVyLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzaHVmZmxlQERcbiIKKyIgICAgICBSYW5kb21pemUgdGVzdHMnIG9yZGVycyBvbiBldmVyeSBpdGVyYXRpb24uXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJhbmRvbV9zZWVkPUBZW05VTUJFUl1ARFxuIgorIiAgICAgIFJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2UgZm9yIHNodWZmbGluZyB0ZXN0IG9yZGVycyAoYmV0d2VlbiAxIGFuZFxuIgorIiAgICAgIDk5OTk5LCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSkuXG4iCisiXG4iCisiVGVzdCBPdXRwdXQ6XG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNvbG9yPUBZKEBHeWVzQFl8QEdub0BZfEBHYXV0b0BZKUBEXG4iCisiICAgICAgRW5hYmxlL2Rpc2FibGUgY29sb3JlZCBvdXRwdXQuIFRoZSBkZWZhdWx0IGlzIEBHYXV0b0BELlxuIgorIiAgLUBHLSIgR1RFU1RfRkxBR19QUkVGSVhfICJwcmludF90aW1lPTBARFxuIgorIiAgICAgIERvbid0IHByaW50IHRoZSBlbGFwc2VkIHRpbWUgb2YgZWFjaCB0ZXN0LlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJvdXRwdXQ9eG1sQFlbQEc6QFlESVJFQ1RPUllfUEFUSEBHIgorICAgIEdURVNUX1BBVEhfU0VQXyAiQFl8QEc6QFlGSUxFX1BBVEhdQERcbiIKKyIgICAgICBHZW5lcmF0ZSBhbiBYTUwgcmVwb3J0IGluIHRoZSBnaXZlbiBkaXJlY3Rvcnkgb3Igd2l0aCB0aGUgZ2l2ZW4gZmlsZVxuIgorIiAgICAgIG5hbWUuIEBZRklMRV9QQVRIQEQgZGVmYXVsdHMgdG8gQEd0ZXN0X2RldGFpbHMueG1sQEQuXG4iCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzdHJlYW1fcmVzdWx0X3RvPUBZSE9TVEBHOkBZUE9SVEBEXG4iCisiICAgICAgU3RyZWFtIHRlc3QgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gc2VydmVyLlxuIgorI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisiXG4iCisiQXNzZXJ0aW9uIEJlaGF2aW9yOlxuIgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImRlYXRoX3Rlc3Rfc3R5bGU9QFkoQEdmYXN0QFl8QEd0aHJlYWRzYWZlQFkpQERcbiIKKyIgICAgICBTZXQgdGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS5cbiIKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgJiYgIUdURVNUX09TX1dJTkRPV1MKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYnJlYWtfb25fZmFpbHVyZUBEXG4iCisiICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBkZWJ1Z2dlciBicmVhay1wb2ludHMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInRocm93X29uX2ZhaWx1cmVARFxuIgorIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gQysrIGV4Y2VwdGlvbnMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNhdGNoX2V4Y2VwdGlvbnM9MEBEXG4iCisiICAgICAgRG8gbm90IHJlcG9ydCBleGNlcHRpb25zIGFzIHRlc3QgZmFpbHVyZXMuIEluc3RlYWQsIGFsbG93IHRoZW1cbiIKKyIgICAgICB0byBjcmFzaCB0aGUgcHJvZ3JhbSBvciB0aHJvdyBhIHBvcC11cCAob24gV2luZG93cykuXG4iCisiXG4iCisiRXhjZXB0IGZvciBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImxpc3RfdGVzdHNARCwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHNldCAiCisgICAgInRoZSBjb3JyZXNwb25kaW5nXG4iCisiZW52aXJvbm1lbnQgdmFyaWFibGUgb2YgYSBmbGFnIChhbGwgbGV0dGVycyBpbiB1cHBlci1jYXNlKS4gRm9yIGV4YW1wbGUsIHRvXG4iCisiZGlzYWJsZSBjb2xvcmVkIHRleHQgb3V0cHV0LCB5b3UgY2FuIGVpdGhlciBzcGVjaWZ5IEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXworICAgICJjb2xvcj1ub0BEIG9yIHNldFxuIgorInRoZSBARyIgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJDT0xPUkBEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIEBHbm9ARC5cbiIKKyJcbiIKKyJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgdGhlICIgR1RFU1RfTkFNRV8gIiBkb2N1bWVudGF0aW9uIGF0XG4iCisiQEciIEdURVNUX1BST0pFQ1RfVVJMXyAiQEQuIElmIHlvdSBmaW5kIGEgYnVnIGluICIgR1RFU1RfTkFNRV8gIlxuIgorIihub3Qgb25lIGluIHlvdXIgb3duIGNvZGUgb3IgdGVzdHMpLCBwbGVhc2UgcmVwb3J0IGl0IHRvXG4iCisiQEc8IiBHVEVTVF9ERVZfRU1BSUxfICI+QEQuXG4iOworCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4gIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvciB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgKmFyZ2M7IGkrKykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFyZ19zdHJpbmcgPSBTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSk7CisgICAgY29uc3QgY2hhciogY29uc3QgYXJnID0gYXJnX3N0cmluZy5jX3N0cigpOworCisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlQm9vbEZsYWc7CisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlSW50MzJGbGFnOworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZVN0cmluZ0ZsYWc7CisKKyAgICAvLyBEbyB3ZSBzZWUgYSBHb29nbGUgVGVzdCBmbGFnPworICAgIGlmIChQYXJzZUJvb2xGbGFnKGFyZywga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQnJlYWtPbkZhaWx1cmVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0NhdGNoRXhjZXB0aW9uc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtDb2xvckZsYWcsICZHVEVTVF9GTEFHKGNvbG9yKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0RlYXRoVGVzdFN0eWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0RlYXRoVGVzdFVzZUZvcmssCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtGaWx0ZXJGbGFnLCAmR1RFU1RfRkxBRyhmaWx0ZXIpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0xpc3RUZXN0c0ZsYWcsICZHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrT3V0cHV0RmxhZywgJkdURVNUX0ZMQUcob3V0cHV0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtQcmludFRpbWVGbGFnLCAmR1RFU1RfRkxBRyhwcmludF90aW1lKSkgfHwKKyAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmFuZG9tU2VlZEZsYWcsICZHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgfHwKKyAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmVwZWF0RmxhZywgJkdURVNUX0ZMQUcocmVwZWF0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtTaHVmZmxlRmxhZywgJkdURVNUX0ZMQUcoc2h1ZmZsZSkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1N0YWNrVHJhY2VEZXB0aEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga1N0cmVhbVJlc3VsdFRvRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1Rocm93T25GYWlsdXJlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSkKKyAgICAgICAgKSB7CisgICAgICAvLyBZZXMuICBTaGlmdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmd2IGxpc3QgbGVmdCBieSBvbmUuICBOb3RlCisgICAgICAvLyB0aGF0IGFyZ3YgaGFzICgqYXJnYyArIDEpIGVsZW1lbnRzLCB0aGUgbGFzdCBvbmUgYWx3YXlzIGJlaW5nCisgICAgICAvLyBOVUxMLiAgVGhlIGZvbGxvd2luZyBsb29wIG1vdmVzIHRoZSB0cmFpbGluZyBOVUxMIGVsZW1lbnQgYXMKKyAgICAgIC8vIHdlbGwuCisgICAgICBmb3IgKGludCBqID0gaTsgaiAhPSAqYXJnYzsgaisrKSB7CisgICAgICAgIGFyZ3Zbal0gPSBhcmd2W2ogKyAxXTsKKyAgICAgIH0KKworICAgICAgLy8gRGVjcmVtZW50cyB0aGUgYXJndW1lbnQgY291bnQuCisgICAgICAoKmFyZ2MpLS07CisKKyAgICAgIC8vIFdlIGFsc28gbmVlZCB0byBkZWNyZW1lbnQgdGhlIGl0ZXJhdG9yIGFzIHdlIGp1c3QgcmVtb3ZlZAorICAgICAgLy8gYW4gZWxlbWVudC4KKyAgICAgIGktLTsKKyAgICB9IGVsc2UgaWYgKGFyZ19zdHJpbmcgPT0gIi0taGVscCIgfHwgYXJnX3N0cmluZyA9PSAiLWgiIHx8CisgICAgICAgICAgICAgICBhcmdfc3RyaW5nID09ICItPyIgfHwgYXJnX3N0cmluZyA9PSAiLz8iIHx8CisgICAgICAgICAgICAgICBIYXNHb29nbGVUZXN0RmxhZ1ByZWZpeChhcmcpKSB7CisgICAgICAvLyBCb3RoIGhlbHAgZmxhZyBhbmQgdW5yZWNvZ25pemVkIEdvb2dsZSBUZXN0IGZsYWdzIChleGNsdWRpbmcKKyAgICAgIC8vIGludGVybmFsIG9uZXMpIHRyaWdnZXIgaGVscCBkaXNwbGF5LgorICAgICAgZ19oZWxwX2ZsYWcgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChnX2hlbHBfZmxhZykgeworICAgIC8vIFdlIHByaW50IHRoZSBoZWxwIGhlcmUgaW5zdGVhZCBvZiBpbiBSVU5fQUxMX1RFU1RTKCksIGFzIHRoZQorICAgIC8vIGxhdHRlciBtYXkgbm90IGJlIGNhbGxlZCBhdCBhbGwgaWYgdGhlIHVzZXIgaXMgdXNpbmcgR29vZ2xlCisgICAgLy8gVGVzdCB3aXRoIGFub3RoZXIgdGVzdGluZyBmcmFtZXdvcmsuCisgICAgUHJpbnRDb2xvckVuY29kZWQoa0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlKTsKKyAgfQorfQorCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4KK3ZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChhcmdjLCBhcmd2KTsKK30KK3ZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChhcmdjLCBhcmd2KTsKK30KKworLy8gVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIEluaXRHb29nbGVUZXN0KCkuCisvLworLy8gVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3IKKy8vIHdjaGFyX3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Cit2b2lkIEluaXRHb29nbGVUZXN0SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgeworICBnX2luaXRfZ3Rlc3RfY291bnQrKzsKKworICAvLyBXZSBkb24ndCB3YW50IHRvIHJ1biB0aGUgaW5pdGlhbGl6YXRpb24gY29kZSB0d2ljZS4KKyAgaWYgKGdfaW5pdF9ndGVzdF9jb3VudCAhPSAxKSByZXR1cm47CisKKyAgaWYgKCphcmdjIDw9IDApIHJldHVybjsKKworICBpbnRlcm5hbDo6Z19leGVjdXRhYmxlX3BhdGggPSBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbMF0pOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICBnX2FyZ3ZzLmNsZWFyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpICE9ICphcmdjOyBpKyspIHsKKyAgICBnX2FyZ3ZzLnB1c2hfYmFjayhTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSkpOworICB9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoYXJnYywgYXJndik7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5Qb3N0RmxhZ1BhcnNpbmdJbml0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKKy8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCisvLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKKy8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCisvLworLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCisvLyB1cGRhdGVkLgorLy8KKy8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCit2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgaW50ZXJuYWw6OkluaXRHb29nbGVUZXN0SW1wbChhcmdjLCBhcmd2KTsKK30KKworLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgorLy8gVU5JQ09ERSBtb2RlLgordm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7CisgIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cy4KKworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9PU19NQUMKKyMgIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKKworIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxmY250bC5oPgorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKworIyBpZiBHVEVTVF9PU19MSU5VWAorIyAgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgIGluY2x1ZGUgPHN5cy93YWl0Lmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyMgaWYgR1RFU1RfT1NfUU5YCisjICBpbmNsdWRlIDxzcGF3bi5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIENvbnN0YW50cy4KKworLy8gVGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGVbXSA9ICJmYXN0IjsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZGVhdGhfdGVzdF9zdHlsZSwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3N0eWxlIiwga0RlZmF1bHREZWF0aFRlc3RTdHlsZSksCisgICAgIkluZGljYXRlcyBob3cgdG8gcnVuIGEgZGVhdGggdGVzdCBpbiBhIGZvcmtlZCBjaGlsZCBwcm9jZXNzOiAiCisgICAgIlwidGhyZWFkc2FmZVwiIChjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB0ZXN0IGJpbmFyeSAiCisgICAgImZyb20gdGhlIGJlZ2lubmluZywgcnVubmluZyBvbmx5IHRoZSBzcGVjaWZpYyBkZWF0aCB0ZXN0KSBvciAiCisgICAgIlwiZmFzdFwiIChjaGlsZCBwcm9jZXNzIHJ1bnMgdGhlIGRlYXRoIHRlc3QgaW1tZWRpYXRlbHkgIgorICAgICJhZnRlciBmb3JraW5nKS4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmssCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3RfdXNlX2ZvcmsiLCBmYWxzZSksCisgICAgIkluc3RydWN0cyB0byB1c2UgZm9yaygpL19leGl0KCkgaW5zdGVhZCBvZiBjbG9uZSgpIGluIGRlYXRoIHRlc3RzLiAiCisgICAgIklnbm9yZWQgYW5kIGFsd2F5cyB1c2VzIGZvcmsoKSBvbiBQT1NJWCBzeXN0ZW1zIHdoZXJlIGNsb25lKCkgaXMgbm90ICIKKyAgICAiaW1wbGVtZW50ZWQuIFVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQgb3Igc2ltaWxhciB0b29scyBpZiAiCisgICAgInRob3NlIGRvIG5vdCBzdXBwb3J0IGNsb25lKCkuIFZhbGdyaW5kIDMuMy4xIHdpbGwganVzdCBmYWlsIGlmICIKKyAgICAiaXQgc2VlcyBhbiB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBjbG9uZSgpIGZsYWdzLiAiCisgICAgIkl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmbGFnIHcvbyB2YWxncmluZCB0aG91Z2ggaXQgd2lsbCAiCisgICAgIndvcmsgaW4gOTklIG9mIHRoZSBjYXNlcy4gT25jZSB2YWxncmluZCBpcyBmaXhlZCwgdGhpcyBmbGFnIHdpbGwgIgorICAgICJtb3N0IGxpa2VseSBiZSByZW1vdmVkLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QsICIiLAorICAgICJJbmRpY2F0ZXMgdGhlIGZpbGUsIGxpbmUgbnVtYmVyLCB0ZW1wb3JhbCBpbmRleCBvZiAiCisgICAgInRoZSBzaW5nbGUgZGVhdGggdGVzdCB0byBydW4sIGFuZCBhIGZpbGUgZGVzY3JpcHRvciB0byAiCisgICAgIndoaWNoIGEgc3VjY2VzcyBjb2RlIG1heSBiZSBzZW50LCBhbGwgc2VwYXJhdGVkIGJ5ICIKKyAgICAidGhlICd8JyBjaGFyYWN0ZXJzLiAgVGhpcyBmbGFnIGlzIHNwZWNpZmllZCBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudCAiCisgICAgInByb2Nlc3MgaXMgYSBzdWItcHJvY2VzcyBsYXVuY2hlZCBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlICIKKyAgICAiZGVhdGggdGVzdC4gIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4iKTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVmFsaWQgb25seSBmb3IgZmFzdCBkZWF0aCB0ZXN0cy4gSW5kaWNhdGVzIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gdGhlCisvLyBjaGlsZCBwcm9jZXNzIG9mIGEgZmFzdCBzdHlsZSBkZWF0aCB0ZXN0Lgorc3RhdGljIGJvb2wgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSBmYWxzZTsKKworLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5CisvLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMKKy8vIFZhbGdyaW5kIGhlYXAgY2hlY2tlcnMgbWF5IG5lZWQgdGhpcyB0byBtb2RpZnkgdGhlaXIgYmVoYXZpb3IgaW4gZGVhdGgKKy8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuCitib29sIEluRGVhdGhUZXN0Q2hpbGQoKSB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICAvLyBPbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyBhcmUgdGhyZWFkLXNhZmUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlCisgIC8vIGRlYXRoX3Rlc3Rfc3R5bGUgZmxhZy4KKyAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworCisjIGVsc2UKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpCisgICAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworICBlbHNlCisgICAgcmV0dXJuIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBFeGl0ZWRXaXRoQ29kZSBjb25zdHJ1Y3Rvci4KK0V4aXRlZFdpdGhDb2RlOjpFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKSA6IGV4aXRfY29kZV8oZXhpdF9jb2RlKSB7Cit9CisKKy8vIEV4aXRlZFdpdGhDb2RlIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IuCitib29sIEV4aXRlZFdpdGhDb2RlOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3QgeworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIGV4aXRfc3RhdHVzID09IGV4aXRfY29kZV87CisKKyMgZWxzZQorCisgIHJldHVybiBXSUZFWElURUQoZXhpdF9zdGF0dXMpICYmIFdFWElUU1RBVFVTKGV4aXRfc3RhdHVzKSA9PSBleGl0X2NvZGVfOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIEtpbGxlZEJ5U2lnbmFsIGNvbnN0cnVjdG9yLgorS2lsbGVkQnlTaWduYWw6OktpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pIDogc2lnbnVtXyhzaWdudW0pIHsKK30KKworLy8gS2lsbGVkQnlTaWduYWwgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KK2Jvb2wgS2lsbGVkQnlTaWduYWw6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7CisgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X3N0YXR1cykgJiYgV1RFUk1TSUcoZXhpdF9zdGF0dXMpID09IHNpZ251bV87Cit9CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVdGlsaXRpZXMgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIGV4aXQgY29kZSwgaW4gdGhlIGZvcm1hdAorLy8gc3BlY2lmaWVkIGJ5IHdhaXQoMikuCitzdGF0aWMgc3RkOjpzdHJpbmcgRXhpdFN1bW1hcnkoaW50IGV4aXRfY29kZSkgeworICBNZXNzYWdlIG07CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgZXhpdF9jb2RlOworCisjIGVsc2UKKworICBpZiAoV0lGRVhJVEVEKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7CisgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIlRlcm1pbmF0ZWQgYnkgc2lnbmFsICIgPDwgV1RFUk1TSUcoZXhpdF9jb2RlKTsKKyAgfQorIyAgaWZkZWYgV0NPUkVEVU1QCisgIGlmIChXQ09SRURVTVAoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIiAoY29yZSBkdW1wZWQpIjsKKyAgfQorIyAgZW5kaWYKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cykgeworICByZXR1cm4gIUV4aXRlZFdpdGhDb2RlKDApKGV4aXRfc3RhdHVzKTsKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiBhIGRlYXRoIHRlc3QgZmluZHMgbW9yZSB0aGFuCisvLyBvbmUgdGhyZWFkIHJ1bm5pbmcsIG9yIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBwcmlvcgorLy8gdG8gZXhlY3V0aW5nIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisvLyBjYWxsZXIgbm90IHRvIHBhc3MgYSB0aHJlYWRfY291bnQgb2YgMS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHNpemVfdCB0aHJlYWRfY291bnQpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiRGVhdGggdGVzdHMgdXNlIGZvcmsoKSwgd2hpY2ggaXMgdW5zYWZlIHBhcnRpY3VsYXJseSIKKyAgICAgIDw8ICIgaW4gYSB0aHJlYWRlZCBjb250ZXh0LiBGb3IgdGhpcyB0ZXN0LCAiIDw8IEdURVNUX05BTUVfIDw8ICIgIjsKKyAgaWYgKHRocmVhZF9jb3VudCA9PSAwKQorICAgIG1zZyA8PCAiY291bGRuJ3QgZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iOworICBlbHNlCisgICAgbXNnIDw8ICJkZXRlY3RlZCAiIDw8IHRocmVhZF9jb3VudCA8PCAiIHRocmVhZHMuIjsKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKKy8vIEZsYWcgY2hhcmFjdGVycyBmb3IgcmVwb3J0aW5nIGEgZGVhdGggdGVzdCB0aGF0IGRpZCBub3QgZGllLgorc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdExpdmVkID0gJ0wnOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFJldHVybmVkID0gJ1InOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFRocmV3ID0gJ1QnOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdEludGVybmFsRXJyb3IgPSAnSSc7CisKKy8vIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBwb3NzaWJsZSB3YXlzIHRoYXQgYSBkZWF0aCB0ZXN0IGNhbgorLy8gY29uY2x1ZGUuICBESUVEIG1lYW5zIHRoYXQgdGhlIHByb2Nlc3MgZGllZCB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QKKy8vIGNvZGU7IExJVkVEIG1lYW5zIHRoYXQgcHJvY2VzcyBsaXZlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgdGVzdCBjb2RlOworLy8gUkVUVVJORUQgbWVhbnMgdGhhdCB0aGUgdGVzdCBzdGF0ZW1lbnQgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgYSByZXR1cm4KKy8vIHN0YXRlbWVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQ7IFRIUkVXIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50CisvLyByZXR1cm5lZCBjb250cm9sIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIElOX1BST0dSRVNTIG1lYW5zIHRoZSB0ZXN0CisvLyBoYXMgbm90IHlldCBjb25jbHVkZWQuCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBVbmlmeSBuYW1lcyBhbmQgcG9zc2libHkgdmFsdWVzIGZvcgorLy8gQWJvcnRSZWFzb24sIERlYXRoVGVzdE91dGNvbWUsIGFuZCBmbGFnIGNoYXJhY3RlcnMgYWJvdmUuCitlbnVtIERlYXRoVGVzdE91dGNvbWUgeyBJTl9QUk9HUkVTUywgRElFRCwgTElWRUQsIFJFVFVSTkVELCBUSFJFVyB9OworCisvLyBSb3V0aW5lIGZvciBhYm9ydGluZyB0aGUgcHJvZ3JhbSB3aGljaCBpcyBzYWZlIHRvIGNhbGwgZnJvbSBhbgorLy8gZXhlYy1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yCisvLyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIHRoZQorLy8gbWVzc2FnZSBpcyBzaW1wbHkgcHJpbnRlZCB0byBzdGRlcnIuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHByb2dyYW0KKy8vIHRoZW4gZXhpdHMgd2l0aCBzdGF0dXMgMS4KK3ZvaWQgRGVhdGhUZXN0QWJvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gT24gYSBQT1NJWCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkc2FmZS1zdHlsZQorICAvLyBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIHdoaWNoIG9wZXJhdGVzIG9uIGEgdmVyeSBzbWFsbCBzdGFjay4gIFVzZQorICAvLyB0aGUgaGVhcCBmb3IgYW55IGFkZGl0aW9uYWwgbm9uLW1pbnVzY3VsZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgorICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgR2V0VW5pdFRlc3RJbXBsKCktPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIEZJTEUqIHBhcmVudCA9IHBvc2l4OjpGRE9wZW4oZmxhZy0+d3JpdGVfZmQoKSwgInciKTsKKyAgICBmcHV0YyhrRGVhdGhUZXN0SW50ZXJuYWxFcnJvciwgcGFyZW50KTsKKyAgICBmcHJpbnRmKHBhcmVudCwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgICBmZmx1c2gocGFyZW50KTsKKyAgICBfZXhpdCgxKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorfQorCisvLyBBIHJlcGxhY2VtZW50IGZvciBDSEVDSyB0aGF0IGNhbGxzIERlYXRoVGVzdEFib3J0IGlmIHRoZSBhc3NlcnRpb24KKy8vIGZhaWxzLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXhwcmVzc2lvbikgXAorICBkbyB7IFwKKyAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShleHByZXNzaW9uKSkgeyBcCisgICAgICBEZWF0aFRlc3RBYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmc6OkZvcm1hdCggICAgICAgXAorICAgICAgICAgICJDSEVDSyBmYWlsZWQ6IEZpbGUgJXMsIGxpbmUgJWQ6ICVzIiwgXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI2V4cHJlc3Npb24pKTsgXAorICAgIH0gXAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBUaGlzIG1hY3JvIGlzIHNpbWlsYXIgdG8gR1RFU1RfREVBVEhfVEVTVF9DSEVDS18sIGJ1dCBpdCBpcyBtZWFudCBmb3IKKy8vIGV2YWx1YXRpbmcgYW55IHN5c3RlbSBjYWxsIHRoYXQgZnVsZmlsbHMgdHdvIGNvbmRpdGlvbnM6IGl0IG11c3QgcmV0dXJuCisvLyAtMSBvbiBmYWlsdXJlLCBhbmQgc2V0IGVycm5vIHRvIEVJTlRSIHdoZW4gaXQgaXMgaW50ZXJydXB0ZWQgYW5kCisvLyBzaG91bGQgYmUgdHJpZWQgYWdhaW4uICBUaGUgbWFjcm8gZXhwYW5kcyB0byBhIGxvb3AgdGhhdCByZXBlYXRlZGx5CisvLyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYXMgbG9uZyBhcyBpdCBldmFsdWF0ZXMgdG8gLTEgYW5kIHNldHMKKy8vIGVycm5vIHRvIEVJTlRSLiAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIC0xIGJ1dCBlcnJubyBpcworLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gRUlOVFIsIERlYXRoVGVzdEFib3J0IGlzIGNhbGxlZC4KKyMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZXhwcmVzc2lvbikgXAorICBkbyB7IFwKKyAgICBpbnQgZ3Rlc3RfcmV0dmFsOyBcCisgICAgZG8geyBcCisgICAgICBndGVzdF9yZXR2YWwgPSAoZXhwcmVzc2lvbik7IFwKKyAgICB9IHdoaWxlIChndGVzdF9yZXR2YWwgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOyBcCisgICAgaWYgKGd0ZXN0X3JldHZhbCA9PSAtMSkgeyBcCisgICAgICBEZWF0aFRlc3RBYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmc6OkZvcm1hdCggICAgICAgXAorICAgICAgICAgICJDSEVDSyBmYWlsZWQ6IEZpbGUgJXMsIGxpbmUgJWQ6ICVzICE9IC0xIiwgXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI2V4cHJlc3Npb24pKTsgXAorICAgIH0gXAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yIGluIGVycm5vLgorc3RkOjpzdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIGVycm5vID09IDAgPyAiIiA6IHBvc2l4OjpTdHJFcnJvcihlcnJubyk7Cit9CisKKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gYSBkZWF0aCB0ZXN0IHBhcmVudCBwcm9jZXNzIHRvIHJlYWQgYSBmYWlsdXJlCisvLyBtZXNzYWdlIGZyb20gdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBhbmQgbG9nIGl0IHdpdGggdGhlIEZBVEFMCisvLyBzZXZlcml0eS4gT24gV2luZG93cywgdGhlIG1lc3NhZ2UgaXMgcmVhZCBmcm9tIGEgcGlwZSBoYW5kbGUuIE9uIG90aGVyCisvLyBwbGF0Zm9ybXMsIGl0IGlzIHJlYWQgZnJvbSBhIGZpbGUgZGVzY3JpcHRvci4KK3N0YXRpYyB2b2lkIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihpbnQgZmQpIHsKKyAgTWVzc2FnZSBlcnJvcjsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgaW50IG51bV9yZWFkOworCisgIGRvIHsKKyAgICB3aGlsZSAoKG51bV9yZWFkID0gcG9zaXg6OlJlYWQoZmQsIGJ1ZmZlciwgMjU1KSkgPiAwKSB7CisgICAgICBidWZmZXJbbnVtX3JlYWRdID0gJ1wwJzsKKyAgICAgIGVycm9yIDw8IGJ1ZmZlcjsKKyAgICB9CisgIH0gd2hpbGUgKG51bV9yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAobnVtX3JlYWQgPT0gMCkgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8IGVycm9yLkdldFN0cmluZygpOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBsYXN0X2Vycm9yID0gZXJybm87CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZGVhdGggdGVzdCBpbnRlcm5hbDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkgPDwgIiBbIiA8PCBsYXN0X2Vycm9yIDw8ICJdIjsKKyAgfQorfQorCisvLyBEZWF0aCB0ZXN0IGNvbnN0cnVjdG9yLiAgSW5jcmVtZW50cyB0aGUgcnVubmluZyBkZWF0aCB0ZXN0IGNvdW50CisvLyBmb3IgdGhlIGN1cnJlbnQgdGVzdC4KK0RlYXRoVGVzdDo6RGVhdGhUZXN0KCkgeworICBUZXN0SW5mbyogY29uc3QgaW5mbyA9IEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIkNhbm5vdCBydW4gYSBkZWF0aCB0ZXN0IG91dHNpZGUgb2YgYSBURVNUIG9yICIKKyAgICAgICAgICAgICAgICAgICAiVEVTVF9GIGNvbnN0cnVjdCIpOworICB9Cit9CisKKy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWF0aCB0ZXN0IGJ5IGRpc3BhdGNoaW5nIHRvIHRoZSBjdXJyZW50CisvLyBkZWF0aCB0ZXN0IGZhY3RvcnkuCitib29sIERlYXRoVGVzdDo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgeworICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPmRlYXRoX3Rlc3RfZmFjdG9yeSgpLT5DcmVhdGUoCisgICAgICBzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lLCB0ZXN0KTsKK30KKworY29uc3QgY2hhciogRGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpIHsKKyAgcmV0dXJuIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXy5jX3N0cigpOworfQorCit2b2lkIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXyA9IG1lc3NhZ2U7Cit9CisKK3N0ZDo6c3RyaW5nIERlYXRoVGVzdDo6bGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfOworCisvLyBQcm92aWRlcyBjcm9zcyBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBmb3Igc29tZSBkZWF0aCBmdW5jdGlvbmFsaXR5LgorY2xhc3MgRGVhdGhUZXN0SW1wbCA6IHB1YmxpYyBEZWF0aFRlc3QgeworIHByb3RlY3RlZDoKKyAgRGVhdGhUZXN0SW1wbChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpCisgICAgICA6IHN0YXRlbWVudF8oYV9zdGF0ZW1lbnQpLAorICAgICAgICByZWdleF8oYV9yZWdleCksCisgICAgICAgIHNwYXduZWRfKGZhbHNlKSwKKyAgICAgICAgc3RhdHVzXygtMSksCisgICAgICAgIG91dGNvbWVfKElOX1BST0dSRVNTKSwKKyAgICAgICAgcmVhZF9mZF8oLTEpLAorICAgICAgICB3cml0ZV9mZF8oLTEpIHt9CisKKyAgLy8gcmVhZF9mZF8gaXMgZXhwZWN0ZWQgdG8gYmUgY2xvc2VkIGFuZCBjbGVhcmVkIGJ5IGEgZGVyaXZlZCBjbGFzcy4KKyAgfkRlYXRoVGVzdEltcGwoKSB7IEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHJlYWRfZmRfID09IC0xKTsgfQorCisgIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKTsKKyAgdmlydHVhbCBib29sIFBhc3NlZChib29sIHN0YXR1c19vayk7CisKKyAgY29uc3QgY2hhciogc3RhdGVtZW50KCkgY29uc3QgeyByZXR1cm4gc3RhdGVtZW50XzsgfQorICBjb25zdCBSRSogcmVnZXgoKSBjb25zdCB7IHJldHVybiByZWdleF87IH0KKyAgYm9vbCBzcGF3bmVkKCkgY29uc3QgeyByZXR1cm4gc3Bhd25lZF87IH0KKyAgdm9pZCBzZXRfc3Bhd25lZChib29sIGlzX3NwYXduZWQpIHsgc3Bhd25lZF8gPSBpc19zcGF3bmVkOyB9CisgIGludCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBzdGF0dXNfOyB9CisgIHZvaWQgc2V0X3N0YXR1cyhpbnQgYV9zdGF0dXMpIHsgc3RhdHVzXyA9IGFfc3RhdHVzOyB9CisgIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZSgpIGNvbnN0IHsgcmV0dXJuIG91dGNvbWVfOyB9CisgIHZvaWQgc2V0X291dGNvbWUoRGVhdGhUZXN0T3V0Y29tZSBhbl9vdXRjb21lKSB7IG91dGNvbWVfID0gYW5fb3V0Y29tZTsgfQorICBpbnQgcmVhZF9mZCgpIGNvbnN0IHsgcmV0dXJuIHJlYWRfZmRfOyB9CisgIHZvaWQgc2V0X3JlYWRfZmQoaW50IGZkKSB7IHJlYWRfZmRfID0gZmQ7IH0KKyAgaW50IHdyaXRlX2ZkKCkgY29uc3QgeyByZXR1cm4gd3JpdGVfZmRfOyB9CisgIHZvaWQgc2V0X3dyaXRlX2ZkKGludCBmZCkgeyB3cml0ZV9mZF8gPSBmZDsgfQorCisgIC8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAorICAvLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfCisgIC8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KKyAgLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgorICB2b2lkIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjb2RlIHRoaXMgb2JqZWN0IGlzIHRlc3RpbmcuICBUaGlzIGNsYXNzCisgIC8vIGRvZXNuJ3Qgb3duIHRoaXMgc3RyaW5nIGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgorICBjb25zdCBjaGFyKiBjb25zdCBzdGF0ZW1lbnRfOworICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIHRlc3Qgb3V0cHV0IG11c3QgbWF0Y2guICBEZWF0aFRlc3RJbXBsCisgIC8vIGRvZXNuJ3Qgb3duIHRoaXMgb2JqZWN0IGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgorICBjb25zdCBSRSogY29uc3QgcmVnZXhfOworICAvLyBUcnVlIGlmIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNwYXduZWQuCisgIGJvb2wgc3Bhd25lZF87CisgIC8vIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4KKyAgaW50IHN0YXR1c187CisgIC8vIEhvdyB0aGUgZGVhdGggdGVzdCBjb25jbHVkZWQuCisgIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZV87CisgIC8vIERlc2NyaXB0b3IgdG8gdGhlIHJlYWQgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLiAgSXQgaXMKKyAgLy8gYWx3YXlzIC0xIGluIHRoZSBjaGlsZCBwcm9jZXNzLiAgVGhlIGNoaWxkIGtlZXBzIGl0cyB3cml0ZSBlbmQgb2YgdGhlCisgIC8vIHBpcGUgaW4gd3JpdGVfZmRfLgorICBpbnQgcmVhZF9mZF87CisgIC8vIERlc2NyaXB0b3IgdG8gdGhlIGNoaWxkJ3Mgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgLy8gSXQgaXMgYWx3YXlzIC0xIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIFRoZSBwYXJlbnQga2VlcHMgaXRzIGVuZCBvZiB0aGUKKyAgLy8gcGlwZSBpbiByZWFkX2ZkXy4KKyAgaW50IHdyaXRlX2ZkXzsKK307CisKKy8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAorLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXworLy8gbWVtYmVyLCBhbmQgY2xvc2VzIHJlYWRfZmRfLiAgT3V0cHV0cyBkaWFnbm9zdGljcyBhbmQgdGVybWluYXRlcyBpbgorLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgordm9pZCBEZWF0aFRlc3RJbXBsOjpSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpIHsKKyAgY2hhciBmbGFnOworICBpbnQgYnl0ZXNfcmVhZDsKKworICAvLyBUaGUgcmVhZCgpIGhlcmUgYmxvY2tzIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlIChzaWduaWZ5aW5nIHRoZQorICAvLyBmYWlsdXJlIG9mIHRoZSBkZWF0aCB0ZXN0KSBvciB1bnRpbCB0aGUgcGlwZSBpcyBjbG9zZWQgKHNpZ25pZnlpbmcKKyAgLy8gaXRzIHN1Y2Nlc3MpLCBzbyBpdCdzIG9rYXkgdG8gY2FsbCB0aGlzIGluIHRoZSBwYXJlbnQgYmVmb3JlCisgIC8vIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBleGl0ZWQuCisgIGRvIHsKKyAgICBieXRlc19yZWFkID0gcG9zaXg6OlJlYWQocmVhZF9mZCgpLCAmZmxhZywgMSk7CisgIH0gd2hpbGUgKGJ5dGVzX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICBzZXRfb3V0Y29tZShESUVEKTsKKyAgfSBlbHNlIGlmIChieXRlc19yZWFkID09IDEpIHsKKyAgICBzd2l0Y2ggKGZsYWcpIHsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdFJldHVybmVkOgorICAgICAgICBzZXRfb3V0Y29tZShSRVRVUk5FRCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0VGhyZXc6CisgICAgICAgIHNldF9vdXRjb21lKFRIUkVXKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGtEZWF0aFRlc3RMaXZlZDoKKyAgICAgICAgc2V0X291dGNvbWUoTElWRUQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdEludGVybmFsRXJyb3I6CisgICAgICAgIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihyZWFkX2ZkKCkpOyAgLy8gRG9lcyBub3QgcmV0dXJuLgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJEZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgcmVwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidW5leHBlY3RlZCBzdGF0dXMgYnl0ZSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGZsYWcpIDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIlJlYWQgZnJvbSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsKKyAgfQorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpDbG9zZShyZWFkX2ZkKCkpKTsKKyAgc2V0X3JlYWRfZmQoLTEpOworfQorCisvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgY29kZSB3aGljaCBzaG91bGQgaGF2ZSBleGl0ZWQsIGRpZG4ndC4KKy8vIFNob3VsZCBiZSBjYWxsZWQgb25seSBpbiBhIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKy8vIFdyaXRlcyBhIHN0YXR1cyBieXRlIHRvIHRoZSBjaGlsZCdzIHN0YXR1cyBmaWxlIGRlc2NyaXB0b3IsIHRoZW4KKy8vIGNhbGxzIF9leGl0KDEpLgordm9pZCBEZWF0aFRlc3RJbXBsOjpBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pIHsKKyAgLy8gVGhlIHBhcmVudCBwcm9jZXNzIGNvbnNpZGVycyB0aGUgZGVhdGggdGVzdCB0byBiZSBhIGZhaWx1cmUgaWYKKyAgLy8gaXQgZmluZHMgYW55IGRhdGEgaW4gb3VyIHBpcGUuICBTbywgaGVyZSB3ZSB3cml0ZSBhIHNpbmdsZSBmbGFnIGJ5dGUKKyAgLy8gdG8gdGhlIHBpcGUsIHRoZW4gZXhpdC4KKyAgY29uc3QgY2hhciBzdGF0dXNfY2ggPQorICAgICAgcmVhc29uID09IFRFU1RfRElEX05PVF9ESUUgPyBrRGVhdGhUZXN0TGl2ZWQgOgorICAgICAgcmVhc29uID09IFRFU1RfVEhSRVdfRVhDRVBUSU9OID8ga0RlYXRoVGVzdFRocmV3IDoga0RlYXRoVGVzdFJldHVybmVkOworCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8ocG9zaXg6OldyaXRlKHdyaXRlX2ZkKCksICZzdGF0dXNfY2gsIDEpKTsKKyAgLy8gV2UgYXJlIGxlYWtpbmcgdGhlIGRlc2NyaXB0b3IgaGVyZSBiZWNhdXNlIG9uIHNvbWUgcGxhdGZvcm1zIChpLmUuLAorICAvLyB3aGVuIGJ1aWx0IGFzIFdpbmRvd3MgRExMKSwgZGVzdHJ1Y3RvcnMgb2YgZ2xvYmFsIG9iamVjdHMgd2lsbCBzdGlsbAorICAvLyBydW4gYWZ0ZXIgY2FsbGluZyBfZXhpdCgpLiBPbiBzdWNoIHN5c3RlbXMsIHdyaXRlX2ZkXyB3aWxsIGJlCisgIC8vIGluZGlyZWN0bHkgY2xvc2VkIGZyb20gdGhlIGRlc3RydWN0b3Igb2YgVW5pdFRlc3RJbXBsLCBjYXVzaW5nIGRvdWJsZQorICAvLyBjbG9zZSBpZiBpdCBpcyBhbHNvIGNsb3NlZCBoZXJlLiBPbiBkZWJ1ZyBjb25maWd1cmF0aW9ucywgZG91YmxlIGNsb3NlCisgIC8vIG1heSBhc3NlcnQuIEFzIHRoZXJlIGFyZSBubyBpbi1wcm9jZXNzIGJ1ZmZlcnMgdG8gZmx1c2ggaGVyZSwgd2UgYXJlCisgIC8vIHJlbHlpbmcgb24gdGhlIE9TIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIGFmdGVyIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMKKyAgLy8gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlIG5vdCBydW4uCisgIF9leGl0KDEpOyAgLy8gRXhpdHMgdy9vIGFueSBub3JtYWwgZXhpdCBob29rcyAod2Ugd2VyZSBzdXBwb3NlZCB0byBjcmFzaCkKK30KKworLy8gUmV0dXJucyBhbiBpbmRlbnRlZCBjb3B5IG9mIHN0ZGVyciBvdXRwdXQgZm9yIGEgZGVhdGggdGVzdC4KKy8vIFRoaXMgbWFrZXMgZGlzdGluZ3Vpc2hpbmcgZGVhdGggdGVzdCBvdXRwdXQgbGluZXMgZnJvbSByZWd1bGFyIGxvZyBsaW5lcworLy8gbXVjaCBlYXNpZXIuCitzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXREZWF0aFRlc3RPdXRwdXQoY29uc3QgOjpzdGQ6OnN0cmluZyYgb3V0cHV0KSB7CisgIDo6c3RkOjpzdHJpbmcgcmV0OworICBmb3IgKHNpemVfdCBhdCA9IDA7IDsgKSB7CisgICAgY29uc3Qgc2l6ZV90IGxpbmVfZW5kID0gb3V0cHV0LmZpbmQoJ1xuJywgYXQpOworICAgIHJldCArPSAiWyAgREVBVEggICBdICI7CisgICAgaWYgKGxpbmVfZW5kID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCArPSBvdXRwdXQuc3Vic3RyKGF0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCwgbGluZV9lbmQgKyAxIC0gYXQpOworICAgIGF0ID0gbGluZV9lbmQgKyAxOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vIEFzc2Vzc2VzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgYSBkZWF0aCB0ZXN0LCB1c2luZyBib3RoIHByaXZhdGUKKy8vIG1lbWJlcnMgd2hpY2ggaGF2ZSBwcmV2aW91c2x5IGJlZW4gc2V0LCBhbmQgb25lIGFyZ3VtZW50OgorLy8KKy8vIFByaXZhdGUgZGF0YSBtZW1iZXJzOgorLy8gICBvdXRjb21lOiAgQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIGRlYXRoIHRlc3QKKy8vICAgICAgICAgICAgIGNvbmNsdWRlZDogRElFRCwgTElWRUQsIFRIUkVXLCBvciBSRVRVUk5FRC4gIFRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBmYWlscyBpbiB0aGUgbGF0dGVyIHRocmVlIGNhc2VzLgorLy8gICBzdGF0dXM6ICAgVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLiBPbiAqbml4LCBpdCBpcyBpbiB0aGUKKy8vICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHdhaXQoMikuIE9uIFdpbmRvd3MsIHRoaXMgaXMgdGhlCisvLyAgICAgICAgICAgICB2YWx1ZSBzdXBwbGllZCB0byB0aGUgRXhpdFByb2Nlc3MoKSBBUEkgb3IgYSBudW1lcmljIGNvZGUKKy8vICAgICAgICAgICAgIG9mIHRoZSBleGNlcHRpb24gdGhhdCB0ZXJtaW5hdGVkIHRoZSBwcm9ncmFtLgorLy8gICByZWdleDogICAgQSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IHRvIGJlIGFwcGxpZWQgdG8KKy8vICAgICAgICAgICAgIHRoZSB0ZXN0J3MgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3Igb3V0cHV0OyB0aGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgZmFpbHMgaWYgaXQgZG9lcyBub3QgbWF0Y2guCisvLworLy8gQXJndW1lbnQ6CisvLyAgIHN0YXR1c19vazogdHJ1ZSBpZiBleGl0X3N0YXR1cyBpcyBhY2NlcHRhYmxlIGluIHRoZSBjb250ZXh0IG9mCisvLyAgICAgICAgICAgICAgdGhpcyBwYXJ0aWN1bGFyIGRlYXRoIHRlc3QsIHdoaWNoIGZhaWxzIGlmIGl0IGlzIGZhbHNlCisvLworLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgYXJlIG1ldC4gIE90aGVyd2lzZSwgdGhlCisvLyBmaXJzdCBmYWlsaW5nIGNvbmRpdGlvbiwgaW4gdGhlIG9yZGVyIGdpdmVuIGFib3ZlLCBpcyB0aGUgb25lIHRoYXQgaXMKKy8vIHJlcG9ydGVkLiBBbHNvIHNldHMgdGhlIGxhc3QgZGVhdGggdGVzdCBtZXNzYWdlIHN0cmluZy4KK2Jvb2wgRGVhdGhUZXN0SW1wbDo6UGFzc2VkKGJvb2wgc3RhdHVzX29rKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKworICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgTWVzc2FnZSBidWZmZXI7CisKKyAgYnVmZmVyIDw8ICJEZWF0aCB0ZXN0OiAiIDw8IHN0YXRlbWVudCgpIDw8ICJcbiI7CisgIHN3aXRjaCAob3V0Y29tZSgpKSB7CisgICAgY2FzZSBMSVZFRDoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZmFpbGVkIHRvIGRpZS5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUSFJFVzoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogdGhyZXcgYW4gZXhjZXB0aW9uLlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFVFVSTkVEOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBpbGxlZ2FsIHJldHVybiBpbiB0ZXN0IHN0YXRlbWVudC5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESUVEOgorICAgICAgaWYgKHN0YXR1c19vaykgeworICAgICAgICBjb25zdCBib29sIG1hdGNoZWQgPSBSRTo6UGFydGlhbE1hdGNoKGVycm9yX21lc3NhZ2UuY19zdHIoKSwgKnJlZ2V4KCkpOworICAgICAgICBpZiAobWF0Y2hlZCkgeworICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXJyb3IuXG4iCisgICAgICAgICAgICAgICAgIDw8ICIgIEV4cGVjdGVkOiAiIDw8IHJlZ2V4KCktPnBhdHRlcm4oKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIgorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICIgPDwgRXhpdFN1bW1hcnkoc3RhdHVzKCkpIDw8ICJcbiIKKyAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElOX1BST0dSRVNTOgorICAgIGRlZmF1bHQ6CisgICAgICBHVEVTVF9MT0dfKEZBVEFMKQorICAgICAgICAgIDw8ICJEZWF0aFRlc3Q6OlBhc3NlZCBzb21laG93IGNhbGxlZCBiZWZvcmUgY29uY2x1c2lvbiBvZiB0ZXN0IjsKKyAgfQorCisgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGJ1ZmZlci5HZXRTdHJpbmcoKSk7CisgIHJldHVybiBzdWNjZXNzOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFdpbmRvd3NEZWF0aFRlc3QgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLiBEdWUgdG8gdGhlCisvLyBzcGVjaWZpY3Mgb2Ygc3RhcnRpbmcgbmV3IHByb2Nlc3NlcyBvbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUKKy8vIGFsd2F5cyB0aHJlYWRzYWZlLCBhbmQgR29vZ2xlIFRlc3QgY29uc2lkZXJzIHRoZQorLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPWZhc3Qgc2V0dGluZyB0byBiZSBlcXVpdmFsZW50IHRvCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9dGhyZWFkc2FmZSB0aGVyZS4KKy8vCisvLyBBIGZldyBpbXBsZW1lbnRhdGlvbiBub3RlczogIExpa2UgdGhlIExpbnV4IHZlcnNpb24sIHRoZSBXaW5kb3dzCisvLyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBpcGVzIGZvciBjaGlsZC10by1wYXJlbnQgY29tbXVuaWNhdGlvbi4gQnV0IGR1ZSB0bworLy8gdGhlIHNwZWNpZmljcyBvZiBwaXBlcyBvbiBXaW5kb3dzLCBzb21lIGV4dHJhIHN0ZXBzIGFyZSByZXF1aXJlZDoKKy8vCisvLyAxLiBUaGUgcGFyZW50IGNyZWF0ZXMgYSBjb21tdW5pY2F0aW9uIHBpcGUgYW5kIHN0b3JlcyBoYW5kbGVzIHRvIGJvdGgKKy8vICAgIGVuZHMgb2YgaXQuCisvLyAyLiBUaGUgcGFyZW50IHN0YXJ0cyB0aGUgY2hpbGQgYW5kIHByb3ZpZGVzIGl0IHdpdGggdGhlIGluZm9ybWF0aW9uCisvLyAgICBuZWNlc3NhcnkgdG8gYWNxdWlyZSB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuCisvLyAzLiBUaGUgY2hpbGQgYWNxdWlyZXMgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBhbmQgc2lnbmFscyB0aGUgcGFyZW50CisvLyAgICB1c2luZyBhIFdpbmRvd3MgZXZlbnQuCisvLyA0LiBOb3cgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9uIGl0cyBzaWRlLiBJZgorLy8gICAgdGhpcyBpcyBkb25lIGJlZm9yZSBzdGVwIDMsIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZ29lcyBkb3duIHRvCisvLyAgICAwIGFuZCBpdCBpcyBkZXN0cm95ZWQsIHByZXZlbnRpbmcgdGhlIGNoaWxkIGZyb20gYWNxdWlyaW5nIGl0LiBUaGUKKy8vICAgIHBhcmVudCBub3cgaGFzIHRvIHJlbGVhc2UgaXQsIG9yIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgcmVhZCBlbmQgb2YKKy8vICAgIHRoZSBwaXBlIHdpbGwgbm90IHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgorLy8gNS4gVGhlIHBhcmVudCByZWFkcyBjaGlsZCdzIG91dHB1dCB0aHJvdWdoIHRoZSBwaXBlIChvdXRjb21lIGNvZGUgYW5kCisvLyAgICBhbnkgcG9zc2libGUgZXJyb3IgbWVzc2FnZXMpIGZyb20gdGhlIHBpcGUsIGFuZCBpdHMgc3RkZXJyIGFuZCB0aGVuCisvLyAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gZmFpbCB0aGUgdGVzdC4KKy8vCisvLyBOb3RlOiB0byBkaXN0aW5ndWlzaCBXaW4zMiBBUEkgY2FsbHMgZnJvbSB0aGUgbG9jYWwgbWV0aG9kIGFuZCBmdW5jdGlvbgorLy8gY2FsbHMsIHRoZSBmb3JtZXIgYXJlIGV4cGxpY2l0bHkgcmVzb2x2ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisvLworY2xhc3MgV2luZG93c0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIFdpbmRvd3NEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUkUqIGFfcmVnZXgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkKKyAgICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7fQorCisgIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgorICB2aXJ0dWFsIGludCBXYWl0KCk7CisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87CisgIC8vIEhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLgorICBBdXRvSGFuZGxlIHdyaXRlX2hhbmRsZV87CisgIC8vIENoaWxkIHByb2Nlc3MgaGFuZGxlLgorICBBdXRvSGFuZGxlIGNoaWxkX2hhbmRsZV87CisgIC8vIEV2ZW50IHRoZSBjaGlsZCBwcm9jZXNzIHVzZXMgdG8gc2lnbmFsIHRoZSBwYXJlbnQgdGhhdCBpdCBoYXMKKyAgLy8gYWNxdWlyZWQgdGhlIGhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLiBBZnRlciBzZWVpbmcgdGhpcworICAvLyBldmVudCB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gaGFuZGxlcyB0byBtYWtlIHN1cmUgaXRzCisgIC8vIFJlYWRGaWxlKCkgY2FsbHMgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCisgIEF1dG9IYW5kbGUgZXZlbnRfaGFuZGxlXzsKK307CisKKy8vIFdhaXRzIGZvciB0aGUgY2hpbGQgaW4gYSBkZWF0aCB0ZXN0IHRvIGV4aXQsIHJldHVybmluZyBpdHMgZXhpdAorLy8gc3RhdHVzLCBvciAwIGlmIG5vIGNoaWxkIHByb2Nlc3MgZXhpc3RzLiAgQXMgYSBzaWRlIGVmZmVjdCwgc2V0cyB0aGUKKy8vIG91dGNvbWUgZGF0YSBtZW1iZXIuCitpbnQgV2luZG93c0RlYXRoVGVzdDo6V2FpdCgpIHsKKyAgaWYgKCFzcGF3bmVkKCkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gV2FpdCB1bnRpbCB0aGUgY2hpbGQgZWl0aGVyIHNpZ25hbHMgdGhhdCBpdCBoYXMgYWNxdWlyZWQgdGhlIHdyaXRlIGVuZAorICAvLyBvZiB0aGUgcGlwZSBvciBpdCBkaWVzLgorICBjb25zdCBIQU5ETEUgd2FpdF9oYW5kbGVzWzJdID0geyBjaGlsZF9oYW5kbGVfLkdldCgpLCBldmVudF9oYW5kbGVfLkdldCgpIH07CisgIHN3aXRjaCAoOjpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBXYWl0cyBmb3IgYW55IG9mIHRoZSBoYW5kbGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpIHsKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzA6CisgICAgY2FzZSBXQUlUX09CSkVDVF8wICsgMToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmYWxzZSk7ICAvLyBTaG91bGQgbm90IGdldCBoZXJlLgorICB9CisKKyAgLy8gVGhlIGNoaWxkIGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9yIGV4aXRlZC4KKyAgLy8gV2UgcmVsZWFzZSB0aGUgaGFuZGxlIG9uIG91ciBzaWRlIGFuZCBjb250aW51ZS4KKyAgd3JpdGVfaGFuZGxlXy5SZXNldCgpOworICBldmVudF9oYW5kbGVfLlJlc2V0KCk7CisKKyAgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKKworICAvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gZXhpdCBpZiBpdCBoYXZlbid0IGFscmVhZHkuIFRoaXMKKyAgLy8gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGUgY2hpbGQgaGFzIGFscmVhZHkgZXhpdGVkLCByZWdhcmRsZXNzIG9mCisgIC8vIHdoZXRoZXIgcHJldmlvdXMgY2FsbHMgdG8gV2FpdEZvck11bHRpcGxlT2JqZWN0cyBzeW5jaHJvbml6ZWQgb24gdGhpcworICAvLyBoYW5kbGUgb3Igbm90LgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIFdBSVRfT0JKRUNUXzAgPT0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGNoaWxkX2hhbmRsZV8uR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpOworICBEV09SRCBzdGF0dXNfY29kZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICA6OkdldEV4aXRDb2RlUHJvY2VzcyhjaGlsZF9oYW5kbGVfLkdldCgpLCAmc3RhdHVzX2NvZGUpICE9IEZBTFNFKTsKKyAgY2hpbGRfaGFuZGxlXy5SZXNldCgpOworICBzZXRfc3RhdHVzKHN0YXRpY19jYXN0PGludD4oc3RhdHVzX2NvZGUpKTsKKyAgcmV0dXJuIHN0YXR1cygpOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIFdpbmRvd3MgZGVhdGggdGVzdC4gIEl0IGNyZWF0ZXMgYSBjaGlsZAorLy8gcHJvY2VzcyB3aXRoIHRoZSBzYW1lIGV4ZWN1dGFibGUgYXMgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBydW4gdGhlCisvLyBkZWF0aCB0ZXN0LiAgVGhlIGNoaWxkIHByb2Nlc3MgaXMgZ2l2ZW4gdGhlIC0tZ3Rlc3RfZmlsdGVyIGFuZAorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFncyBzdWNoIHRoYXQgaXQga25vd3MgdG8gcnVuIHRoZQorLy8gY3VycmVudCBkZWF0aCB0ZXN0IG9ubHkuCitEZWF0aFRlc3Q6OlRlc3RSb2xlIFdpbmRvd3NEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW5mby0+cmVzdWx0KCktPmRlYXRoX3Rlc3RfY291bnQoKTsKKworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgLy8gUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSBoYXMgcGVyZm9ybWVkIGFsbCB0aGUgbmVjZXNzYXJ5CisgICAgLy8gcHJvY2Vzc2luZy4KKyAgICBzZXRfd3JpdGVfZmQoZmxhZy0+d3JpdGVfZmQoKSk7CisgICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsKKyAgfQorCisgIC8vIFdpbmRvd3NEZWF0aFRlc3QgdXNlcyBhbiBhbm9ueW1vdXMgcGlwZSB0byBjb21tdW5pY2F0ZSByZXN1bHRzIG9mCisgIC8vIGEgZGVhdGggdGVzdC4KKyAgU0VDVVJJVFlfQVRUUklCVVRFUyBoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSA9IHsKKyAgICBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUyksIE5VTEwsIFRSVUUgfTsKKyAgSEFORExFIHJlYWRfaGFuZGxlLCB3cml0ZV9oYW5kbGU7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgOjpDcmVhdGVQaXBlKCZyZWFkX2hhbmRsZSwgJndyaXRlX2hhbmRsZSwgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgIDApICAvLyBEZWZhdWx0IGJ1ZmZlciBzaXplLgorICAgICAgIT0gRkFMU0UpOworICBzZXRfcmVhZF9mZCg6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihyZWFkX2hhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZKSk7CisgIHdyaXRlX2hhbmRsZV8uUmVzZXQod3JpdGVfaGFuZGxlKTsKKyAgZXZlbnRfaGFuZGxlXy5SZXNldCg6OkNyZWF0ZUV2ZW50KAorICAgICAgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAorICAgICAgVFJVRSwgICAgLy8gVGhlIGV2ZW50IHdpbGwgYXV0b21hdGljYWxseSByZXNldCB0byBub24tc2lnbmFsZWQgc3RhdGUuCisgICAgICBGQUxTRSwgICAvLyBUaGUgaW5pdGlhbCBzdGF0ZSBpcyBub24tc2lnbmFsbGVkLgorICAgICAgTlVMTCkpOyAgLy8gVGhlIGV2ZW4gaXMgdW5uYW1lZC4KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXZlbnRfaGFuZGxlXy5HZXQoKSAhPSBOVUxMKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IiArCisgICAgICBpbmZvLT50ZXN0X2Nhc2VfbmFtZSgpICsgIi4iICsgaW5mby0+bmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArCisgICAgICAiPSIgKyBmaWxlXyArICJ8IiArIFN0cmluZzo6Rm9ybWF0KCIlZHwlZHwldXwlSXV8JUl1IiwgbGluZV8sCisgICAgICBkZWF0aF90ZXN0X2luZGV4LAorICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pig6OkdldEN1cnJlbnRQcm9jZXNzSWQoKSksCisgICAgICAvLyBzaXplX3QgaGFzIHRoZSBzYW1lIHdpdGggYXMgcG9pbnRlcnMgb24gYm90aCAzMi1iaXQgYW5kIDY0LWJpdAorICAgICAgLy8gV2luZG93cyBwbGF0Zm9ybXMuCisgICAgICAvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3RjeGYxZHc2LmFzcHguCisgICAgICByZWludGVycHJldF9jYXN0PHNpemVfdD4od3JpdGVfaGFuZGxlKSwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihldmVudF9oYW5kbGVfLkdldCgpKSk7CisKKyAgY2hhciBleGVjdXRhYmxlX3BhdGhbX01BWF9QQVRIICsgMV07ICAvLyBOT0xJTlQKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICBfTUFYX1BBVEggKyAxICE9IDo6R2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01BWF9QQVRIKSk7CisKKyAgc3RkOjpzdHJpbmcgY29tbWFuZF9saW5lID0KKyAgICAgIHN0ZDo6c3RyaW5nKDo6R2V0Q29tbWFuZExpbmVBKCkpICsgIiAiICsgZmlsdGVyX2ZsYWcgKyAiIFwiIiArCisgICAgICBpbnRlcm5hbF9mbGFnICsgIlwiIjsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICAvLyBGbHVzaCB0aGUgbG9nIGJ1ZmZlcnMgc2luY2UgdGhlIGxvZyBzdHJlYW1zIGFyZSBzaGFyZWQgd2l0aCB0aGUgY2hpbGQuCisgIEZsdXNoSW5mb0xvZygpOworCisgIC8vIFRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgc2hhcmUgdGhlIHN0YW5kYXJkIGhhbmRsZXMgd2l0aCB0aGUgcGFyZW50LgorICBTVEFSVFVQSU5GT0Egc3RhcnR1cF9pbmZvOworICBtZW1zZXQoJnN0YXJ0dXBfaW5mbywgMCwgc2l6ZW9mKFNUQVJUVVBJTkZPKSk7CisgIHN0YXJ0dXBfaW5mby5kd0ZsYWdzID0gU1RBUlRGX1VTRVNUREhBTkRMRVM7CisgIHN0YXJ0dXBfaW5mby5oU3RkSW5wdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKKyAgc3RhcnR1cF9pbmZvLmhTdGRPdXRwdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisgIHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPSA6OkdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKKworICBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NfaW5mbzsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oOjpDcmVhdGVQcm9jZXNzQSgKKyAgICAgIGV4ZWN1dGFibGVfcGF0aCwKKyAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGNvbW1hbmRfbGluZS5jX3N0cigpKSwKKyAgICAgIE5VTEwsICAgLy8gUmV0dW5lZCBwcm9jZXNzIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCisgICAgICBOVUxMLCAgIC8vIFJldHVuZWQgdGhyZWFkIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCisgICAgICBUUlVFLCAgIC8vIENoaWxkIGluaGVyaXRzIGFsbCBpbmhlcml0YWJsZSBoYW5kbGVzIChmb3Igd3JpdGVfaGFuZGxlXykuCisgICAgICAweDAsICAgIC8vIERlZmF1bHQgY3JlYXRpb24gZmxhZ3MuCisgICAgICBOVUxMLCAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGVudmlyb25tZW50LgorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCksCisgICAgICAmc3RhcnR1cF9pbmZvLAorICAgICAgJnByb2Nlc3NfaW5mbykgIT0gRkFMU0UpOworICBjaGlsZF9oYW5kbGVfLlJlc2V0KHByb2Nlc3NfaW5mby5oUHJvY2Vzcyk7CisgIDo6Q2xvc2VIYW5kbGUocHJvY2Vzc19pbmZvLmhUaHJlYWQpOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKyMgZWxzZSAgLy8gV2UgYXJlIG5vdCBvbiBXaW5kb3dzLgorCisvLyBGb3JraW5nRGVhdGhUZXN0IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgbW9zdCBvZiB0aGUgYWJzdHJhY3QKKy8vIG1ldGhvZHMgb2YgdGhlIERlYXRoVGVzdCBpbnRlcmZhY2UuICBPbmx5IHRoZSBBc3N1bWVSb2xlIG1ldGhvZCBpcworLy8gbGVmdCB1bmRlZmluZWQuCitjbGFzcyBGb3JraW5nRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgeworIHB1YmxpYzoKKyAgRm9ya2luZ0RlYXRoVGVzdChjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCk7CisKKyAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCisgIHZpcnR1YWwgaW50IFdhaXQoKTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBzZXRfY2hpbGRfcGlkKHBpZF90IGNoaWxkX3BpZCkgeyBjaGlsZF9waWRfID0gY2hpbGRfcGlkOyB9CisKKyBwcml2YXRlOgorICAvLyBQSUQgb2YgY2hpbGQgcHJvY2VzcyBkdXJpbmcgZGVhdGggdGVzdDsgMCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBpdHNlbGYuCisgIHBpZF90IGNoaWxkX3BpZF87Cit9OworCisvLyBDb25zdHJ1Y3RzIGEgRm9ya2luZ0RlYXRoVGVzdC4KK0ZvcmtpbmdEZWF0aFRlc3Q6OkZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksCisgICAgICBjaGlsZF9waWRfKC0xKSB7fQorCisvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKKy8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCisvLyBvdXRjb21lIGRhdGEgbWVtYmVyLgoraW50IEZvcmtpbmdEZWF0aFRlc3Q6OldhaXQoKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiAwOworCisgIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyAgaW50IHN0YXR1c192YWx1ZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyh3YWl0cGlkKGNoaWxkX3BpZF8sICZzdGF0dXNfdmFsdWUsIDApKTsKKyAgc2V0X3N0YXR1cyhzdGF0dXNfdmFsdWUpOworICByZXR1cm4gc3RhdHVzX3ZhbHVlOworfQorCisvLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcywgdGhlbiBpbW1lZGlhdGVseSBydW5zIHRoZSB0ZXN0CisvLyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KK2NsYXNzIE5vRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIE5vRXhlY0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpIDoKKyAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpIHsgfQorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKK307CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgZm9yay1hbmQtcnVuIGRlYXRoIHRlc3QuICBJdCBpbXBsZW1lbnRzIGEKKy8vIHN0cmFpZ2h0Zm9yd2FyZCBmb3JrLCB3aXRoIGEgc2ltcGxlIHBpcGUgdG8gdHJhbnNtaXQgdGhlIHN0YXR1cyBieXRlLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IHNpemVfdCB0aHJlYWRfY291bnQgPSBHZXRUaHJlYWRDb3VudCgpOworICBpZiAodGhyZWFkX2NvdW50ICE9IDEpIHsKKyAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8IERlYXRoVGVzdFRocmVhZFdhcm5pbmcodGhyZWFkX2NvdW50KTsKKyAgfQorCisgIGludCBwaXBlX2ZkWzJdOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhwaXBlKHBpcGVfZmQpICE9IC0xKTsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gV2hlbiB3ZSBmb3JrIHRoZSBwcm9jZXNzIGJlbG93LCB0aGUgbG9nIGZpbGUgYnVmZmVycyBhcmUgY29waWVkLCBidXQgdGhlCisgIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHNoYXJlZC4gIFdlIGZsdXNoIGFsbCBsb2cgZmlsZXMgaGVyZSBzbyB0aGF0IGNsb3NpbmcKKyAgLy8gdGhlIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lc24ndCB0aHJvdyBvZmYgdGhlCisgIC8vIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgLy8gVGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgZm9yayBhcyBwb3NzaWJsZSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIGNhc2UKKyAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHRocmVhZHMgcnVubmluZyBiZWZvcmUgdGhlIGRlYXRoIHRlc3QsIGFuZCBhbm90aGVyCisgIC8vIHRocmVhZCB3cml0ZXMgdG8gdGhlIGxvZyBmaWxlLgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBmb3JrKCk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7CisgIHNldF9jaGlsZF9waWQoY2hpbGRfcGlkKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzBdKSk7CisgICAgc2V0X3dyaXRlX2ZkKHBpcGVfZmRbMV0pOworICAgIC8vIFJlZGlyZWN0cyBhbGwgbG9nZ2luZyB0byBzdGRlcnIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgdG8gcHJldmVudAorICAgIC8vIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZXMuICBXZSBjYXB0dXJlIHN0ZGVyciBpbiB0aGUgcGFyZW50CisgICAgLy8gcHJvY2VzcyBhbmQgYXBwZW5kIHRoZSBjaGlsZCBwcm9jZXNzJyBvdXRwdXQgdG8gYSBsb2cuCisgICAgTG9nVG9TdGRlcnIoKTsKKyAgICAvLyBFdmVudCBmb3J3YXJkaW5nIHRvIHRoZSBsaXN0ZW5lcnMgb2YgZXZlbnQgbGlzdGVuZXIgQVBJIG11c2ggYmUgc2h1dAorICAgIC8vIGRvd24gaW4gZGVhdGggdGVzdCBzdWJwcm9jZXNzZXMuCisgICAgR2V0VW5pdFRlc3RJbXBsKCktPmxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOworICAgIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkID0gdHJ1ZTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9IGVsc2UgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICAgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICAgIHNldF9zcGF3bmVkKHRydWUpOworICAgIHJldHVybiBPVkVSU0VFX1RFU1Q7CisgIH0KK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MgYW5kIHJlLWV4ZWN1dGVzIHRoZSBtYWluCisvLyBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3Mgc2V0IHRoYXQgY2F1c2UKKy8vIG9ubHkgdGhpcyBzcGVjaWZpYyBkZWF0aCB0ZXN0IHRvIGJlIHJ1bi4KK2NsYXNzIEV4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBFeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgOgorICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisgcHJpdmF0ZToKKyAgc3RhdGljIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4KKyAgR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSB7CisgICAgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBhcmdzID0gR2V0SW5qZWN0YWJsZUFyZ3ZzKCk7CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87Cit9OworCisvLyBVdGlsaXR5IGNsYXNzIGZvciBhY2N1bXVsYXRpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KK2NsYXNzIEFyZ3VtZW50cyB7CisgcHVibGljOgorICBBcmd1bWVudHMoKSB7CisgICAgYXJnc18ucHVzaF9iYWNrKE5VTEwpOworICB9CisKKyAgfkFyZ3VtZW50cygpIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IGFyZ3NfLmJlZ2luKCk7IGkgIT0gYXJnc18uZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGZyZWUoKmkpOworICAgIH0KKyAgfQorICB2b2lkIEFkZEFyZ3VtZW50KGNvbnN0IGNoYXIqIGFyZ3VtZW50KSB7CisgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChhcmd1bWVudCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KKyAgdm9pZCBBZGRBcmd1bWVudHMoY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHI+JiBhcmd1bWVudHMpIHsKKyAgICBmb3IgKHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8U3RyPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3VtZW50cy5iZWdpbigpOworICAgICAgICAgaSAhPSBhcmd1bWVudHMuZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGFyZ3NfLmluc2VydChhcmdzXy5lbmQoKSAtIDEsIHBvc2l4OjpTdHJEdXAoaS0+Y19zdHIoKSkpOworICAgIH0KKyAgfQorICBjaGFyKiBjb25zdCogQXJndigpIHsKKyAgICByZXR1cm4gJmFyZ3NfWzBdOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxjaGFyKj4gYXJnc187Cit9OworCisvLyBBIHN0cnVjdCB0aGF0IGVuY29tcGFzc2VzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNoaWxkIHByb2Nlc3Mgb2YgYQorLy8gdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IHByb2Nlc3MuCitzdHJ1Y3QgRXhlY0RlYXRoVGVzdEFyZ3MgeworICBjaGFyKiBjb25zdCogYXJndjsgIC8vIENvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjaGlsZCdzIGNhbGwgdG8gZXhlYworICBpbnQgY2xvc2VfZmQ7ICAgICAgIC8vIEZpbGUgZGVzY3JpcHRvciB0byBjbG9zZTsgdGhlIHJlYWQgZW5kIG9mIGEgcGlwZQorfTsKKworIyAgaWYgR1RFU1RfT1NfTUFDCitpbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7CisgIC8vIFdoZW4gR29vZ2xlIFRlc3QgaXMgYnVpbHQgYXMgYSBmcmFtZXdvcmsgb24gTWFjT1MgWCwgdGhlIGVudmlyb24gdmFyaWFibGUKKyAgLy8gaXMgdW5hdmFpbGFibGUuIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbiAobWFuIGVudmlyb24pIHJlY29tbWVuZHMgdXNpbmcKKyAgLy8gX05TR2V0RW52aXJvbigpIGluc3RlYWQuCisgIHJldHVybiAqX05TR2V0RW52aXJvbigpOworfQorIyAgZWxzZQorLy8gU29tZSBQT1NJWCBwbGF0Zm9ybXMgZXhwZWN0IHlvdSB0byBkZWNsYXJlIGVudmlyb24uIGV4dGVybiAiQyIgbWFrZXMKKy8vIGl0IHJlc2lkZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK2V4dGVybiAiQyIgY2hhcioqIGVudmlyb247CitpbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7IHJldHVybiBlbnZpcm9uOyB9CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyMgIGlmICFHVEVTVF9PU19RTlgKKy8vIFRoZSBtYWluIGZ1bmN0aW9uIGZvciBhIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgorLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjbG9uZSgpLWVkIHByb2Nlc3MgYW5kIHRodXMgbXVzdCBhdm9pZAorLy8gYW55IHBvdGVudGlhbGx5IHVuc2FmZSBvcGVyYXRpb25zIGxpa2UgbWFsbG9jIG9yIGxpYmMgZnVuY3Rpb25zLgorc3RhdGljIGludCBFeGVjRGVhdGhUZXN0Q2hpbGRNYWluKHZvaWQqIGNoaWxkX2FyZykgeworICBFeGVjRGVhdGhUZXN0QXJncyogY29uc3QgYXJncyA9IHN0YXRpY19jYXN0PEV4ZWNEZWF0aFRlc3RBcmdzKj4oY2hpbGRfYXJnKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShhcmdzLT5jbG9zZV9mZCkpOworCisgIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlCisgIC8vIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQuICBUaGVyZWZvcmUgd2UgY2hhbmdlIHRvIHRoZSBvcmlnaW5hbAorICAvLyB3b3JraW5nIGRpcmVjdG9yeSBmaXJzdC4KKyAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpOworICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgY2hkaXIoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLgorICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImNoZGlyKFwiIikgKyBvcmlnaW5hbF9kaXIgKyAiXCIpIGZhaWxlZDogIiArCisgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBleGVjdmUoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLiAgV2UKKyAgLy8gY2Fubm90IHVzZSBleGVjdnAoKSBhcyBpdCdzIGEgbGliYyBmdW5jdGlvbiBhbmQgdGh1cyBwb3RlbnRpYWxseQorICAvLyB1bnNhZmUuICBTaW5jZSBleGVjdmUoKSBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSCwgdGhlIHVzZXIgbXVzdAorICAvLyBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSB2YWxpZCBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3QKKyAgLy8gb25lIHBhdGggc2VwYXJhdG9yLgorICBleGVjdmUoYXJncy0+YXJndlswXSwgYXJncy0+YXJndiwgR2V0RW52aXJvbigpKTsKKyAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImV4ZWN2ZSgiKSArIGFyZ3MtPmFyZ3ZbMF0gKyAiLCAuLi4pIGluICIgKworICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kaXIgKyAiIGZhaWxlZDogIiArCisgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkpOworICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorIyAgZW5kaWYgIC8vICFHVEVTVF9PU19RTlgKKworLy8gVHdvIHV0aWxpdHkgcm91dGluZXMgdGhhdCB0b2dldGhlciBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiB0aGUgc3RhY2sKKy8vIGdyb3dzLgorLy8gVGhpcyBjb3VsZCBiZSBhY2NvbXBsaXNoZWQgbW9yZSBlbGVnYW50bHkgYnkgYSBzaW5nbGUgcmVjdXJzaXZlCisvLyBmdW5jdGlvbiwgYnV0IHdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgdW5saWtlbHkgcG9zc2liaWxpdHkgb2YKKy8vIGEgc21hcnQgY29tcGlsZXIgb3B0aW1pemluZyB0aGUgcmVjdXJzaW9uIGF3YXkuCisvLworLy8gR1RFU1RfTk9fSU5MSU5FXyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IEdDQyA0LjYgZnJvbSBpbmxpbmluZworLy8gU3RhY2tMb3dlclRoYW5BZGRyZXNzIGludG8gU3RhY2tHcm93c0Rvd24sIHdoaWNoIHRoZW4gZG9lc24ndCBnaXZlCisvLyBjb3JyZWN0IGFuc3dlci4KK3ZvaWQgU3RhY2tMb3dlclRoYW5BZGRyZXNzKGNvbnN0IHZvaWQqIHB0ciwgYm9vbCogcmVzdWx0KSBHVEVTVF9OT19JTkxJTkVfOwordm9pZCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyLCBib29sKiByZXN1bHQpIHsKKyAgaW50IGR1bW15OworICAqcmVzdWx0ID0gKCZkdW1teSA8IHB0cik7Cit9CisKK2Jvb2wgU3RhY2tHcm93c0Rvd24oKSB7CisgIGludCBkdW1teTsKKyAgYm9vbCByZXN1bHQ7CisgIFN0YWNrTG93ZXJUaGFuQWRkcmVzcygmZHVtbXksICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIGluCisvLyBhIHRocmVhZC1zYWZlIG1hbm5lciBhbmQgaW5zdHJ1Y3RzIGl0IHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoZQorLy8gaW1wbGVtZW50YXRpb24gdXNlcyBmb3JrKDIpICsgZXhlYy4gIE9uIHN5c3RlbXMgd2hlcmUgY2xvbmUoMikgaXMKKy8vIGF2YWlsYWJsZSwgaXQgaXMgdXNlZCBpbnN0ZWFkLCBiZWluZyBzbGlnaHRseSBtb3JlIHRocmVhZC1zYWZlLiAgT24gUU5YLAorLy8gZm9yayBzdXBwb3J0cyBvbmx5IHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHNvIHRoaXMgZnVuY3Rpb24gdXNlcworLy8gc3Bhd24oMikgdGhlcmUgaW5zdGVhZC4gIFRoZSBmdW5jdGlvbiBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZgorLy8gYW55dGhpbmcgZ29lcyB3cm9uZy4KK3N0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07CisgIHBpZF90IGNoaWxkX3BpZCA9IC0xOworCisjICBpZiBHVEVTVF9PU19RTlgKKyAgLy8gT2J0YWlucyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNldHMgaXQgdG8gYmUgY2xvc2VkIGluIHRoZSBjaGlsZAorICAvLyBwcm9jZXNzLgorICBjb25zdCBpbnQgY3dkX2ZkID0gb3BlbigiLiIsIE9fUkRPTkxZKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY3dkX2ZkICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjd2RfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpKTsKKyAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKKyAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCisgIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgorICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7CisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCisgIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKKyAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgaW50IGZkX2ZsYWdzOworICAvLyBTZXQgY2xvc2VfZmQgdG8gYmUgY2xvc2VkIGFmdGVyIHNwYXduLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZkX2ZsYWdzID0gZmNudGwoY2xvc2VfZmQsIEZfR0VURkQpKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjbG9zZV9mZCwgRl9TRVRGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9mbGFncyB8IEZEX0NMT0VYRUMpKTsKKyAgc3RydWN0IGluaGVyaXRhbmNlIGluaGVyaXQgPSB7MH07CisgIC8vIHNwYXduIGlzIGEgc3lzdGVtIGNhbGwuCisgIGNoaWxkX3BpZCA9IHNwYXduKGFyZ3MuYXJndlswXSwgMCwgTlVMTCwgJmluaGVyaXQsIGFyZ3MuYXJndiwgR2V0RW52aXJvbigpKTsKKyAgLy8gUmVzdG9yZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZjaGRpcihjd2RfZmQpICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShjd2RfZmQpKTsKKworIyAgZWxzZSAgIC8vIEdURVNUX09TX1FOWAorIyAgIGlmIEdURVNUX09TX0xJTlVYCisgIC8vIFdoZW4gYSBTSUdQUk9GIHNpZ25hbCBpcyByZWNlaXZlZCB3aGlsZSBmb3JrKCkgb3IgY2xvbmUoKSBhcmUgZXhlY3V0aW5nLAorICAvLyB0aGUgcHJvY2VzcyBtYXkgaGFuZy4gVG8gYXZvaWQgdGhpcywgd2UgaWdub3JlIFNJR1BST0YgaGVyZSBhbmQgcmUtZW5hYmxlCisgIC8vIGl0IGFmdGVyIHRoZSBjYWxsIHRvIGZvcmsoKS9jbG9uZSgpIGlzIGNvbXBsZXRlLgorICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhdmVkX3NpZ3Byb2ZfYWN0aW9uOworICBzdHJ1Y3Qgc2lnYWN0aW9uIGlnbm9yZV9zaWdwcm9mX2FjdGlvbjsKKyAgbWVtc2V0KCZpZ25vcmVfc2lncHJvZl9hY3Rpb24sIDAsIHNpemVvZihpZ25vcmVfc2lncHJvZl9hY3Rpb24pKTsKKyAgc2lnZW1wdHlzZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9tYXNrKTsKKyAgaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHNpZ2FjdGlvbigKKyAgICAgIFNJR1BST0YsICZpZ25vcmVfc2lncHJvZl9hY3Rpb24sICZzYXZlZF9zaWdwcm9mX2FjdGlvbikpOworIyAgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjICAgaWYgR1RFU1RfSEFTX0NMT05FCisgIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCisgIGlmICghdXNlX2ZvcmspIHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzdGFja19ncm93c19kb3duID0gU3RhY2tHcm93c0Rvd24oKTsKKyAgICBjb25zdCBzaXplX3Qgc3RhY2tfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgLy8gTU1BUF9BTk9OWU1PVVMgaXMgbm90IGRlZmluZWQgb24gTWFjLCBzbyB3ZSB1c2UgTUFQX0FOT04gaW5zdGVhZC4KKyAgICB2b2lkKiBjb25zdCBzdGFjayA9IG1tYXAoTlVMTCwgc3RhY2tfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT04gfCBNQVBfUFJJVkFURSwgLTEsIDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrICE9IE1BUF9GQUlMRUQpOworCisgICAgLy8gTWF4aW11bSBzdGFjayBhbGlnbm1lbnQgaW4gYnl0ZXM6ICBGb3IgYSBkb3dud2FyZC1ncm93aW5nIHN0YWNrLCB0aGlzCisgICAgLy8gYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSBzaXplIG9mIHRoZSBzdGFjayBzcGFjZSB0byBnZXQgYW4gYWRkcmVzcworICAgIC8vIHRoYXQgaXMgd2l0aGluIHRoZSBzdGFjayBzcGFjZSBhbmQgaXMgYWxpZ25lZCBvbiBhbGwgc3lzdGVtcyB3ZSBjYXJlCisgICAgLy8gYWJvdXQuICBBcyBmYXIgYXMgSSBrbm93IHRoZXJlIGlzIG5vIEFCSSB3aXRoIHN0YWNrIGFsaWdubWVudCBncmVhdGVyCisgICAgLy8gdGhhbiA2NC4gIFdlIGFzc3VtZSBzdGFjayBhbmQgc3RhY2tfc2l6ZSBhbHJlYWR5IGhhdmUgYWxpZ25tZW50IG9mCisgICAgLy8ga01heFN0YWNrQWxpZ25tZW50LgorICAgIGNvbnN0IHNpemVfdCBrTWF4U3RhY2tBbGlnbm1lbnQgPSA2NDsKKyAgICB2b2lkKiBjb25zdCBzdGFja190b3AgPQorICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhY2spICsKKyAgICAgICAgICAgIChzdGFja19ncm93c19kb3duID8gc3RhY2tfc2l6ZSAtIGtNYXhTdGFja0FsaWdubWVudCA6IDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrX3NpemUgPiBrTWF4U3RhY2tBbGlnbm1lbnQgJiYKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oc3RhY2tfdG9wKSAlIGtNYXhTdGFja0FsaWdubWVudCA9PSAwKTsKKworICAgIGNoaWxkX3BpZCA9IGNsb25lKCZFeGVjRGVhdGhUZXN0Q2hpbGRNYWluLCBzdGFja190b3AsIFNJR0NITEQsICZhcmdzKTsKKworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKG11bm1hcChzdGFjaywgc3RhY2tfc2l6ZSkgIT0gLTEpOworICB9CisjICAgZWxzZQorICBjb25zdCBib29sIHVzZV9mb3JrID0gdHJ1ZTsKKyMgICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKyAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKKyAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOworICAgICAgX2V4aXQoMCk7CisgIH0KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19RTlgKKyMgIGlmIEdURVNUX09TX0xJTlVYCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oCisgICAgICBzaWdhY3Rpb24oU0lHUFJPRiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uLCBOVUxMKSk7CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICByZXR1cm4gY2hpbGRfcGlkOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQorLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKKyAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQorICAgICAgU3RyaW5nOjpGb3JtYXQoIi0tJXMlcz0lcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GTEFHX1BSRUZJWF8sIGtGaWx0ZXJGbGFnLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSwgaW5mby0+bmFtZSgpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgaW50ZXJuYWxfZmxhZyA9CisgICAgICBTdHJpbmc6OkZvcm1hdCgiLS0lcyVzPSVzfCVkfCVkfCVkIiwKKyAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZMQUdfUFJFRklYXywga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVfLCBsaW5lXywgZGVhdGhfdGVzdF9pbmRleCwgcGlwZV9mZFsxXSk7CisgIEFyZ3VtZW50cyBhcmdzOworICBhcmdzLkFkZEFyZ3VtZW50cyhHZXRBcmd2c0ZvckRlYXRoVGVzdENoaWxkUHJvY2VzcygpKTsKKyAgYXJncy5BZGRBcmd1bWVudChmaWx0ZXJfZmxhZy5jX3N0cigpKTsKKyAgYXJncy5BZGRBcmd1bWVudChpbnRlcm5hbF9mbGFnLmNfc3RyKCkpOworCisgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIC8vIFNlZSB0aGUgY29tbWVudCBpbiBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUgZm9yIHdoeSB0aGUgbmV4dCBsaW5lCisgIC8vIGlzIG5lY2Vzc2FyeS4KKyAgRmx1c2hJbmZvTG9nKCk7CisKKyAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gRXhlY0RlYXRoVGVzdFNwYXduQ2hpbGQoYXJncy5Bcmd2KCksIHBpcGVfZmRbMF0pOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKHBpcGVfZmRbMV0pKTsKKyAgc2V0X2NoaWxkX3BpZChjaGlsZF9waWQpOworICBzZXRfcmVhZF9mZChwaXBlX2ZkWzBdKTsKKyAgc2V0X3NwYXduZWQodHJ1ZSk7CisgIHJldHVybiBPVkVSU0VFX1RFU1Q7Cit9CisKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKKy8vIENyZWF0ZXMgYSBjb25jcmV0ZSBEZWF0aFRlc3QtZGVyaXZlZCBjbGFzcyB0aGF0IGRlcGVuZHMgb24gdGhlCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgZmxhZywgYW5kIHNldHMgdGhlIHBvaW50ZXIgcG9pbnRlZCB0bworLy8gYnkgdGhlICJ0ZXN0IiBhcmd1bWVudCB0byBpdHMgYWRkcmVzcy4gIElmIHRoZSB0ZXN0IHNob3VsZCBiZQorLy8gc2tpcHBlZCwgc2V0cyB0aGF0IHBvaW50ZXIgdG8gTlVMTC4gIFJldHVybnMgdHJ1ZSwgdW5sZXNzIHRoZQorLy8gZmxhZyBpcyBzZXQgdG8gYW4gaW52YWxpZCB2YWx1ZS4KK2Jvb2wgRGVmYXVsdERlYXRoVGVzdEZhY3Rvcnk6OkNyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWF0aFRlc3QqKiB0ZXN0KSB7CisgIFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCkKKyAgICAgIC0+aW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKTsKKworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgaWYgKGRlYXRoX3Rlc3RfaW5kZXggPiBmbGFnLT5pbmRleCgpKSB7CisgICAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgICAiRGVhdGggdGVzdCBjb3VudCAoJWQpIHNvbWVob3cgZXhjZWVkZWQgZXhwZWN0ZWQgbWF4aW11bSAoJWQpIiwKKyAgICAgICAgICBkZWF0aF90ZXN0X2luZGV4LCBmbGFnLT5pbmRleCgpKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCEoZmxhZy0+ZmlsZSgpID09IGZpbGUgJiYgZmxhZy0+bGluZSgpID09IGxpbmUgJiYKKyAgICAgICAgICBmbGFnLT5pbmRleCgpID09IGRlYXRoX3Rlc3RfaW5kZXgpKSB7CisgICAgICAqdGVzdCA9IE5VTEw7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiIHx8CisgICAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IFdpbmRvd3NEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSk7CisgIH0KKworIyBlbHNlCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiKSB7CisgICAgKnRlc3QgPSBuZXcgRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKKyAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IE5vRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4KTsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgZWxzZSB7ICAvLyBOT0xJTlQgLSB0aGlzIGlzIG1vcmUgcmVhZGFibGUgdGhhbiB1bmJhbGFuY2VkIGJyYWNrZXRzIGluc2lkZSAjaWYuCisgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJVbmtub3duIGRlYXRoIHRlc3Qgc3R5bGUgXCIlc1wiIGVuY291bnRlcmVkIiwKKyAgICAgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKS5jX3N0cigpKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBvbiBhIGdpdmVuIGRlbGltaXRlciwgcG9wdWxhdGluZyBhIGdpdmVuCisvLyB2ZWN0b3Igd2l0aCB0aGUgZmllbGRzLiAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUKKy8vIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UgaXQgaGVyZS4KK3N0YXRpYyB2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiogZGVzdCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBwYXJzZWQ7CisgIDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7CisgICAgY29uc3QgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gc3RyLmZpbmQoZGVsaW1pdGVyLCBwb3MpOworICAgIGlmIChjb2xvbiA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zKSk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcywgY29sb24gLSBwb3MpKTsKKyAgICAgIHBvcyA9IGNvbG9uICsgMTsKKyAgICB9CisgIH0KKyAgZGVzdC0+c3dhcChwYXJzZWQpOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFJlY3JlYXRlcyB0aGUgcGlwZSBhbmQgZXZlbnQgaGFuZGxlcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLAorLy8gc2lnbmFscyB0aGUgZXZlbnQsIGFuZCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHdyYXBwZWQgYXJvdW5kIHRoZSBwaXBlCisvLyBoYW5kbGUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBjaGlsZCBwcm9jZXNzIG9ubHkuCitpbnQgR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IodW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90KSB7CisgIEF1dG9IYW5kbGUgcGFyZW50X3Byb2Nlc3NfaGFuZGxlKDo6T3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBOb24taW5oZXJpdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcHJvY2Vzc19pZCkpOworICBpZiAocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoIlVuYWJsZSB0byBvcGVuIHBhcmVudCBwcm9jZXNzICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVwbGFjZSB0aGUgZm9sbG93aW5nIGNoZWNrIHdpdGggYQorICAvLyBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHdoZW4gYXZhaWxhYmxlLgorICBHVEVTVF9DSEVDS18oc2l6ZW9mKEhBTkRMRSkgPD0gc2l6ZW9mKHNpemVfdCkpOworCisgIGNvbnN0IEhBTkRMRSB3cml0ZV9oYW5kbGUgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KHdyaXRlX2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX3dyaXRlX2hhbmRsZTsKKworICAvLyBUaGUgbmV3bHkgaW5pdGlhbGl6ZWQgaGFuZGxlIGlzIGFjY2Vzc2libGUgb25seSBpbiBpbiB0aGUgcGFyZW50CisgIC8vIHByb2Nlc3MuIFRvIG9idGFpbiBvbmUgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIGNoaWxkLCB3ZSBuZWVkIHRvIHVzZQorICAvLyBEdXBsaWNhdGVIYW5kbGUuCisgIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCB3cml0ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX3dyaXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDAsICAgIC8vIFJlcXVlc3RlZCBwcml2aWxlZ2VzIGlnbm9yZWQgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERVUExJQ0FURV9TQU1FX0FDQ0VTUyBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gUmVxdWVzdCBub24taW5oZXJpdGFibGUgaGFuZGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBwaXBlIGhhbmRsZSAlSXUgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LCBwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgY29uc3QgSEFORExFIGV2ZW50X2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPihldmVudF9oYW5kbGVfYXNfc2l6ZV90KTsKKyAgSEFORExFIGR1cF9ldmVudF9oYW5kbGU7CisKKyAgaWYgKCE6OkR1cGxpY2F0ZUhhbmRsZShwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCksIGV2ZW50X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfZXZlbnRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBldmVudCBoYW5kbGUgJUl1IGZyb20gdGhlIHBhcmVudCBwcm9jZXNzICV1IiwKKyAgICAgICAgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCwgcGFyZW50X3Byb2Nlc3NfaWQpKTsKKyAgfQorCisgIGNvbnN0IGludCB3cml0ZV9mZCA9CisgICAgICA6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihkdXBfd3JpdGVfaGFuZGxlKSwgT19BUFBFTkQpOworICBpZiAod3JpdGVfZmQgPT0gLTEpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBjb252ZXJ0IHBpcGUgaGFuZGxlICVJdSB0byBhIGZpbGUgZGVzY3JpcHRvciIsCisgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QpKTsKKyAgfQorCisgIC8vIFNpZ25hbHMgdGhlIHBhcmVudCB0aGF0IHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgaGFzIGJlZW4gYWNxdWlyZWQKKyAgLy8gc28gdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIHdyaXRlIGVuZC4KKyAgOjpTZXRFdmVudChkdXBfZXZlbnRfaGFuZGxlKTsKKworICByZXR1cm4gd3JpdGVfZmQ7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyBvYmplY3Qgd2l0aCBmaWVsZHMKKy8vIGluaXRpYWxpemVkIGZyb20gdGhlIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpIGZsYWcgaWYKKy8vIHRoZSBmbGFnIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KK0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgIGlmIChHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9PSAiIikgcmV0dXJuIE5VTEw7CisKKyAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UKKyAgLy8gY2FuIHVzZSBpdCBoZXJlLgorICBpbnQgbGluZSA9IC0xOworICBpbnQgaW5kZXggPSAtMTsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gZmllbGRzOworICBTcGxpdFN0cmluZyhHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpLCAnfCcsICZmaWVsZHMpOworICBpbnQgd3JpdGVfZmQgPSAtMTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgdW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkID0gMDsKKyAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QgPSAwOworICBzaXplX3QgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCA9IDA7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNgorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmcGFyZW50X3Byb2Nlc3NfaWQpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s0XSwgJndyaXRlX2hhbmRsZV9hc19zaXplX3QpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s1XSwgJmV2ZW50X2hhbmRsZV9hc19zaXplX3QpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJCYWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnOiAlcyIsCisgICAgICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmNfc3RyKCkpKTsKKyAgfQorICB3cml0ZV9mZCA9IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7CisjIGVsc2UKKworICBpZiAoZmllbGRzLnNpemUoKSAhPSA0CisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZ3cml0ZV9mZCkpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICVzIiwKKyAgICAgICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuY19zdHIoKSkpOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gbmV3IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyhmaWVsZHNbMF0sIGxpbmUsIGluZGV4LCB3cml0ZV9mZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxpZiBHVEVTVF9PU19TWU1CSUFOCisvLyBTeW1iaWFuIE9wZW5DIGhhcyBQQVRIX01BWCBpbiBzeXMvc3lzbGltaXRzLmgKKyMgaW5jbHVkZSA8c3lzL3N5c2xpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjIGluY2x1ZGUgPGNsaW1pdHM+ICAvLyBTb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgZGVmaW5lIFBBVEhfTUFYIGhlcmUuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX01BWF9QQVRICisjZWxpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIFBBVEhfTUFYCisjZWxpZiBkZWZpbmVkKF9YT1BFTl9QQVRIX01BWCkKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfWE9QRU5fUEFUSF9NQVgKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1BPU0lYX1BBVEhfTUFYCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gT24gV2luZG93cywgJ1xcJyBpcyB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IsIGJ1dCBtYW55IHRvb2xzIGFuZCB0aGUKKy8vIFdpbmRvd3MgQVBJIGFsc28gYWNjZXB0ICcvJyBhcyBhbiBhbHRlcm5hdGUgcGF0aCBzZXBhcmF0b3IuIFVubGVzcyBvdGhlcndpc2UKKy8vIG5vdGVkLCBhIGZpbGUgcGF0aCBjYW4gY29udGFpbiBlaXRoZXIga2luZCBvZiBwYXRoIHNlcGFyYXRvcnMsIG9yIGEgbWl4dHVyZQorLy8gb2YgdGhlbS4KK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnXFwnOworY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvciA9ICcvJzsKK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICJcXCI7Citjb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yU3RyaW5nW10gPSAiLyI7CisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgZGlyZWN0b3J5LiBZb3Ugc2hvdWxkIG5vdCB1c2UKKy8vIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiB0ZXN0cyBvbiBXaW5kb3dzIENFLCBidXQgdGhpcyBhdCBsZWFzdAorLy8gcHJvdmlkZXMgYSByZWFzb25hYmxlIGZhbGxiYWNrLgorY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIlxcIjsKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBkZWZpbmUgSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMKK2NvbnN0IERXT1JEIGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMgPSAweGZmZmZmZmZmOworIyBlbHNlCitjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiLlxcIjsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjZWxzZQorY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICcvJzsKK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuLyI7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBwYXRoIHNlcGFyYXRvci4KK3N0YXRpYyBib29sIElzUGF0aFNlcGFyYXRvcihjaGFyIGMpIHsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICByZXR1cm4gKGMgPT0ga1BhdGhTZXBhcmF0b3IpIHx8IChjID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsKKyNlbHNlCisgIHJldHVybiBjID09IGtQYXRoU2VwYXJhdG9yOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuCisgIC8vIHNvbWV0aGluZyByZWFzb25hYmxlLgorICByZXR1cm4gRmlsZVBhdGgoa0N1cnJlbnREaXJlY3RvcnlTdHJpbmcpOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OworICByZXR1cm4gRmlsZVBhdGgoX2dldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOworI2Vsc2UKKyAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKKyAgcmV0dXJuIEZpbGVQYXRoKGdldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorfQorCisvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gcmVtb3ZlZC4KKy8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKKy8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAorLy8gZm91bmQsIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBGaWxlUGF0aC4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdCB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGRvdF9leHRlbnNpb24gPSBzdGQ6OnN0cmluZygiLiIpICsgZXh0ZW5zaW9uOworICBpZiAoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZShwYXRobmFtZV8sIGRvdF9leHRlbnNpb24pKSB7CisgICAgcmV0dXJuIEZpbGVQYXRoKHBhdGhuYW1lXy5zdWJzdHIoCisgICAgICAgIDAsIHBhdGhuYW1lXy5sZW5ndGgoKSAtIGRvdF9leHRlbnNpb24ubGVuZ3RoKCkpKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHZhbGlkIHBhdGggc2VwYXJhdG9yIGluCisvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCisvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgorY29uc3QgY2hhciogRmlsZVBhdGg6OkZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBzdHJyY2hyKGNfc3RyKCksIGtQYXRoU2VwYXJhdG9yKTsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X2FsdF9zZXAgPSBzdHJyY2hyKGNfc3RyKCksIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsKKyAgLy8gQ29tcGFyaW5nIHR3byBwb2ludGVycyBvZiB3aGljaCBvbmx5IG9uZSBpcyBOVUxMIGlzIHVuZGVmaW5lZC4KKyAgaWYgKGxhc3RfYWx0X3NlcCAhPSBOVUxMICYmCisgICAgICAobGFzdF9zZXAgPT0gTlVMTCB8fCBsYXN0X2FsdF9zZXAgPiBsYXN0X3NlcCkpIHsKKyAgICByZXR1cm4gbGFzdF9hbHRfc2VwOworICB9CisjZW5kaWYKKyAgcmV0dXJuIGxhc3Rfc2VwOworfQorCisvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4KKy8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucworLy8gRmlsZVBhdGgoImZpbGUiKS4gSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IHBhcnQgKCJqdXN0X2FfZmlsZSIpLCBpdCByZXR1cm5zCisvLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdAorLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOworICByZXR1cm4gbGFzdF9zZXAgPyBGaWxlUGF0aChsYXN0X3NlcCArIDEpIDogKnRoaXM7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXRoIHdpdGggdGhlIGZpbGVuYW1lIHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCisvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCisvLyBGaWxlUGF0aCgiLi8iKSBvciwgb24gV2luZG93cywgRmlsZVBhdGgoIi5cXCIpLiBJZiB0aGUgZmlsZXBhdGggZG9lcworLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUZpbGVOYW1lKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOworICBzdGQ6OnN0cmluZyBkaXI7CisgIGlmIChsYXN0X3NlcCkgeworICAgIGRpciA9IHN0ZDo6c3RyaW5nKGNfc3RyKCksIGxhc3Rfc2VwICsgMSAtIGNfc3RyKCkpOworICB9IGVsc2UgeworICAgIGRpciA9IGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nOworICB9CisgIHJldHVybiBGaWxlUGF0aChkaXIpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuYW1pbmcgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIHhtbCBvdXRwdXQuCisKKy8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCisvLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXIKKy8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7CisgIHN0ZDo6c3RyaW5nIGZpbGU7CisgIGlmIChudW1iZXIgPT0gMCkgeworICAgIGZpbGUgPSBiYXNlX25hbWUuc3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247CisgIH0gZWxzZSB7CisgICAgZmlsZSA9IGJhc2VfbmFtZS5zdHJpbmcoKSArICJfIiArIFN0cmluZzo6Rm9ybWF0KCIlZCIsIG51bWJlcikuY19zdHIoKQorICAgICAgICArICIuIiArIGV4dGVuc2lvbjsKKyAgfQorICByZXR1cm4gQ29uY2F0UGF0aHMoZGlyZWN0b3J5LCBGaWxlUGF0aChmaWxlKSk7Cit9CisKKy8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4KKy8vIE9uIFdpbmRvd3MsIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCitGaWxlUGF0aCBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCkgeworICBpZiAoZGlyZWN0b3J5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gcmVsYXRpdmVfcGF0aDsKKyAgY29uc3QgRmlsZVBhdGggZGlyKGRpcmVjdG9yeS5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisgIHJldHVybiBGaWxlUGF0aChkaXIuc3RyaW5nKCkgKyBrUGF0aFNlcGFyYXRvciArIHJlbGF0aXZlX3BhdGguc3RyaW5nKCkpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIHNvbWV0aGluZyBmaW5kYWJsZSBpbiB0aGUgZmlsZS1zeXN0ZW0sCisvLyBlaXRoZXIgYSBmaWxlLCBkaXJlY3RvcnksIG9yIHdoYXRldmVyLgorYm9vbCBGaWxlUGF0aDo6RmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aG5hbWVfLmNfc3RyKCkpOworICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7CisgIGRlbGV0ZSBbXSB1bmljb2RlOworICByZXR1cm4gYXR0cmlidXRlcyAhPSBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzOworI2Vsc2UKKyAgcG9zaXg6OlN0YXRTdHJ1Y3QgZmlsZV9zdGF0OworICByZXR1cm4gcG9zaXg6OlN0YXQocGF0aG5hbWVfLmNfc3RyKCksICZmaWxlX3N0YXQpID09IDA7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGUtc3lzdGVtCisvLyB0aGF0IGV4aXN0cy4KK2Jvb2wgRmlsZVBhdGg6OkRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIERvbid0IHN0cmlwIG9mZiB0cmFpbGluZyBzZXBhcmF0b3IgaWYgcGF0aCBpcyBhIHJvb3QgZGlyZWN0b3J5IG9uCisgIC8vIFdpbmRvd3MgKGxpa2UgIkM6XFwiKS4KKyAgY29uc3QgRmlsZVBhdGgmIHBhdGgoSXNSb290RGlyZWN0b3J5KCkgPyAqdGhpcyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworI2Vsc2UKKyAgY29uc3QgRmlsZVBhdGgmIHBhdGgoKnRoaXMpOworI2VuZGlmCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGguY19zdHIoKSk7CisgIGNvbnN0IERXT1JEIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlcyh1bmljb2RlKTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisgIGlmICgoYXR0cmlidXRlcyAhPSBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzKSAmJgorICAgICAgKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKSB7CisgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgfQorI2Vsc2UKKyAgcG9zaXg6OlN0YXRTdHJ1Y3QgZmlsZV9zdGF0OworICByZXN1bHQgPSBwb3NpeDo6U3RhdChwYXRoLmNfc3RyKCksICZmaWxlX3N0YXQpID09IDAgJiYKKyAgICAgIHBvc2l4OjpJc0RpcihmaWxlX3N0YXQpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSByb290IGRpcmVjdG9yeS4gKFdpbmRvd3MgaGFzIG9uZQorLy8gcm9vdCBkaXJlY3RvcnkgcGVyIGRpc2sgZHJpdmUuKQorYm9vbCBGaWxlUGF0aDo6SXNSb290RGlyZWN0b3J5KCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG9uIFdpbmRvd3MgYSBuZXR3b3JrIHNoYXJlIGxpa2UKKyAgLy8gXFxzZXJ2ZXJcc2hhcmUgY2FuIGJlIGEgcm9vdCBkaXJlY3RvcnksIGFsdGhvdWdoIGl0IGNhbm5vdCBiZSB0aGUKKyAgLy8gY3VycmVudCBkaXJlY3RvcnkuICBIYW5kbGUgdGhpcyBwcm9wZXJseS4KKyAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAzICYmIElzQWJzb2x1dGVQYXRoKCk7CisjZWxzZQorICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID09IDEgJiYgSXNQYXRoU2VwYXJhdG9yKHBhdGhuYW1lXy5jX3N0cigpWzBdKTsKKyNlbmRpZgorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGFuIGFic29sdXRlIHBhdGguCitib29sIEZpbGVQYXRoOjpJc0Fic29sdXRlUGF0aCgpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHBhdGhuYW1lXy5jX3N0cigpOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA+PSAzICYmCisgICAgICgobmFtZVswXSA+PSAnYScgJiYgbmFtZVswXSA8PSAneicpIHx8CisgICAgICAobmFtZVswXSA+PSAnQScgJiYgbmFtZVswXSA8PSAnWicpKSAmJgorICAgICBuYW1lWzFdID09ICc6JyAmJgorICAgICBJc1BhdGhTZXBhcmF0b3IobmFtZVsyXSk7CisjZWxzZQorICByZXR1cm4gSXNQYXRoU2VwYXJhdG9yKG5hbWVbMF0pOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgYSBwYXRobmFtZSBmb3IgYSBmaWxlIHRoYXQgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiBUaGUgcGF0aG5hbWUKKy8vIHdpbGwgYmUgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24gb3IKKy8vIGRpcmVjdG9yeS9iYXNlX25hbWVfPG51bWJlcj4uZXh0ZW5zaW9uIGlmIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uCisvLyBhbHJlYWR5IGV4aXN0cy4gVGhlIG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIHVudGlsIGEgcGF0aG5hbWUgaXMgZm91bmQKKy8vIHRoYXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKy8vIEV4YW1wbGVzOiAnZGlyL2Zvb190ZXN0LnhtbCcgb3IgJ2Rpci9mb29fdGVzdF8xLnhtbCcuCisvLyBUaGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGlmIHR3byBvciBtb3JlIHByb2Nlc3NlcyBhcmUgY2FsbGluZyB0aGlzCisvLyBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lIC0tIHRoZXkgY291bGQgYm90aCBwaWNrIHRoZSBzYW1lIGZpbGVuYW1lLgorRmlsZVBhdGggRmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKKyAgRmlsZVBhdGggZnVsbF9wYXRobmFtZTsKKyAgaW50IG51bWJlciA9IDA7CisgIGRvIHsKKyAgICBmdWxsX3BhdGhuYW1lLlNldChNYWtlRmlsZU5hbWUoZGlyZWN0b3J5LCBiYXNlX25hbWUsIG51bWJlcisrLCBleHRlbnNpb24pKTsKKyAgfSB3aGlsZSAoZnVsbF9wYXRobmFtZS5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7CisgIHJldHVybiBmdWxsX3BhdGhuYW1lOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIHdoaWNoIGluZGljYXRlcyB0aGF0CisvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorLy8gVGhpcyBkb2VzIE5PVCBjaGVjayB0aGF0IGEgZGlyZWN0b3J5IChvciBmaWxlKSBhY3R1YWxseSBleGlzdHMuCitib29sIEZpbGVQYXRoOjpJc0RpcmVjdG9yeSgpIGNvbnN0IHsKKyAgcmV0dXJuICFwYXRobmFtZV8uZW1wdHkoKSAmJgorICAgICAgICAgSXNQYXRoU2VwYXJhdG9yKHBhdGhuYW1lXy5jX3N0cigpW3BhdGhuYW1lXy5sZW5ndGgoKSAtIDFdKTsKK30KKworLy8gQ3JlYXRlIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmCisvLyB0aGUgZGlyZWN0b3JpZXMgYWxyZWFkeSBleGlzdDsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yaWVzCisvLyBmb3IgYW55IHJlYXNvbi4KK2Jvb2wgRmlsZVBhdGg6OkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBjb25zdCB7CisgIGlmICghdGhpcy0+SXNEaXJlY3RvcnkoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMCB8fCB0aGlzLT5EaXJlY3RvcnlFeGlzdHMoKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgRmlsZVBhdGggcGFyZW50KHRoaXMtPlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLlJlbW92ZUZpbGVOYW1lKCkpOworICByZXR1cm4gcGFyZW50LkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSAmJiB0aGlzLT5DcmVhdGVGb2xkZXIoKTsKK30KKworLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IKKy8vIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUKKy8vIGRpcmVjdG9yeSBmb3IgYW55IHJlYXNvbiwgaW5jbHVkaW5nIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGRvZXMgbm90CisvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4KK2Jvb2wgRmlsZVBhdGg6OkNyZWF0ZUZvbGRlcigpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBGaWxlUGF0aCByZW1vdmVkX3NlcCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisgIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocmVtb3ZlZF9zZXAuY19zdHIoKSk7CisgIGludCByZXN1bHQgPSBDcmVhdGVEaXJlY3RvcnkodW5pY29kZSwgTlVMTCkgPyAwIDogLTE7CisgIGRlbGV0ZSBbXSB1bmljb2RlOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICBpbnQgcmVzdWx0ID0gX21rZGlyKHBhdGhuYW1lXy5jX3N0cigpKTsKKyNlbHNlCisgIGludCByZXN1bHQgPSBta2RpcihwYXRobmFtZV8uY19zdHIoKSwgMDc3Nyk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgIHJldHVybiB0aGlzLT5EaXJlY3RvcnlFeGlzdHMoKTsgIC8vIEFuIGVycm9yIGlzIE9LIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICB9CisgIHJldHVybiB0cnVlOyAgLy8gTm8gZXJyb3IuCit9CisKKy8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gdGhlCisvLyBuYW1lLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBuYW1lIHN0cmluZyB1bm1vZGlmaWVkLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IsIG90aGVyIHBsYXRmb3JtcyB1c2UgLy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBjb25zdCB7CisgIHJldHVybiBJc0RpcmVjdG9yeSgpCisgICAgICA/IEZpbGVQYXRoKHBhdGhuYW1lXy5zdWJzdHIoMCwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gMSkpCisgICAgICA6ICp0aGlzOworfQorCisvLyBSZW1vdmVzIGFueSByZWR1bmRhbnQgc2VwYXJhdG9ycyB0aGF0IG1pZ2h0IGJlIGluIHRoZSBwYXRobmFtZS4KKy8vIEZvciBleGFtcGxlLCAiYmFyLy8vZm9vIiBiZWNvbWVzICJiYXIvZm9vIi4gRG9lcyBub3QgZWxpbWluYXRlIG90aGVyCisvLyByZWR1bmRhbmNpZXMgdGhhdCBtaWdodCBiZSBpbiBhIHBhdGhuYW1lIGludm9sdmluZyAiLiIgb3IgIi4uIi4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBoYW5kbGUgV2luZG93cyBuZXR3b3JrIHNoYXJlcyAoZS5nLiBcXHNlcnZlclxzaGFyZSkuCit2b2lkIEZpbGVQYXRoOjpOb3JtYWxpemUoKSB7CisgIGlmIChwYXRobmFtZV8uY19zdHIoKSA9PSBOVUxMKSB7CisgICAgcGF0aG5hbWVfID0gIiI7CisgICAgcmV0dXJuOworICB9CisgIGNvbnN0IGNoYXIqIHNyYyA9IHBhdGhuYW1lXy5jX3N0cigpOworICBjaGFyKiBjb25zdCBkZXN0ID0gbmV3IGNoYXJbcGF0aG5hbWVfLmxlbmd0aCgpICsgMV07CisgIGNoYXIqIGRlc3RfcHRyID0gZGVzdDsKKyAgbWVtc2V0KGRlc3RfcHRyLCAwLCBwYXRobmFtZV8ubGVuZ3RoKCkgKyAxKTsKKworICB3aGlsZSAoKnNyYyAhPSAnXDAnKSB7CisgICAgKmRlc3RfcHRyID0gKnNyYzsKKyAgICBpZiAoIUlzUGF0aFNlcGFyYXRvcigqc3JjKSkgeworICAgICAgc3JjKys7CisgICAgfSBlbHNlIHsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICAgICAgaWYgKCpkZXN0X3B0ciA9PSBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcikgeworICAgICAgICAqZGVzdF9wdHIgPSBrUGF0aFNlcGFyYXRvcjsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgd2hpbGUgKElzUGF0aFNlcGFyYXRvcigqc3JjKSkKKyAgICAgICAgc3JjKys7CisgICAgfQorICAgIGRlc3RfcHRyKys7CisgIH0KKyAgKmRlc3RfcHRyID0gJ1wwJzsKKyAgcGF0aG5hbWVfID0gZGVzdDsKKyAgZGVsZXRlW10gZGVzdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIEZvciBUZXJtaW5hdGVQcm9jZXNzKCkKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8aW8uaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjaWYgR1RFU1RfT1NfTUFDCisjIGluY2x1ZGUgPG1hY2gvbWFjaF9pbml0Lmg+CisjIGluY2x1ZGUgPG1hY2gvdGFzay5oPgorIyBpbmNsdWRlIDxtYWNoL3ZtX21hcC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2lmIEdURVNUX09TX1FOWAorIyBpbmNsdWRlIDxkZXZjdGwuaD4KKyMgaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19RTlgKKworCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisvLyBNU1ZDIGFuZCBDKytCdWlsZGVyIGRvIG5vdCBwcm92aWRlIGEgZGVmaW5pdGlvbiBvZiBTVERFUlJfRklMRU5PLgorY29uc3QgaW50IGtTdGRPdXRGaWxlbm8gPSAxOworY29uc3QgaW50IGtTdGRFcnJGaWxlbm8gPSAyOworI2Vsc2UKK2NvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gU1RET1VUX0ZJTEVOTzsKK2NvbnN0IGludCBrU3RkRXJyRmlsZW5vID0gU1RERVJSX0ZJTEVOTzsKKyNlbmRpZiAgLy8gX01TQ19WRVIKKworI2lmIEdURVNUX09TX01BQworCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKKy8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCitzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgIGNvbnN0IHRhc2tfdCB0YXNrID0gbWFjaF90YXNrX3NlbGYoKTsKKyAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCB0aHJlYWRfY291bnQ7CisgIHRocmVhZF9hY3RfYXJyYXlfdCB0aHJlYWRfbGlzdDsKKyAgY29uc3Qga2Vybl9yZXR1cm5fdCBzdGF0dXMgPSB0YXNrX3RocmVhZHModGFzaywgJnRocmVhZF9saXN0LCAmdGhyZWFkX2NvdW50KTsKKyAgaWYgKHN0YXR1cyA9PSBLRVJOX1NVQ0NFU1MpIHsKKyAgICAvLyB0YXNrX3RocmVhZHMgYWxsb2NhdGVzIHJlc291cmNlcyBpbiB0aHJlYWRfbGlzdCBhbmQgd2UgbmVlZCB0byBmcmVlIHRoZW0KKyAgICAvLyB0byBhdm9pZCBsZWFrcy4KKyAgICB2bV9kZWFsbG9jYXRlKHRhc2ssCisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZtX2FkZHJlc3NfdD4odGhyZWFkX2xpc3QpLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRocmVhZF90KSAqIHRocmVhZF9jb3VudCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4odGhyZWFkX2NvdW50KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisjZWxpZiBHVEVTVF9PU19RTlgKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0CisvLyB3ZSBjYW5ub3QgZGV0ZWN0IGl0Lgorc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworICBjb25zdCBpbnQgZmQgPSBvcGVuKCIvcHJvYy9zZWxmL2FzIiwgT19SRE9OTFkpOworICBpZiAoZmQgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvY2ZzX2luZm8gcHJvY2Vzc19pbmZvOworICBjb25zdCBpbnQgc3RhdHVzID0KKyAgICAgIGRldmN0bChmZCwgRENNRF9QUk9DX0lORk8sICZwcm9jZXNzX2luZm8sIHNpemVvZihwcm9jZXNzX2luZm8pLCBOVUxMKTsKKyAgY2xvc2UoZmQpOworICBpZiAoc3RhdHVzID09IEVPSykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHByb2Nlc3NfaW5mby5udW1fdGhyZWFkcyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2Vsc2UKKworc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworICAvLyBUaGVyZSdzIG5vIHBvcnRhYmxlIHdheSB0byBkZXRlY3QgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBzbyB3ZSBqdXN0CisgIC8vIHJldHVybiAwIHRvIGluZGljYXRlIHRoYXQgd2UgY2Fubm90IGRldGVjdCBpdC4KKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCisKKy8vIEltcGxlbWVudHMgUkUuICBDdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgorCitSRTo6flJFKCkgeworICBpZiAoaXNfdmFsaWRfKSB7CisgICAgLy8gcmVnZnJlZSdpbmcgYW4gaW52YWxpZCByZWdleCBtaWdodCBjcmFzaCBiZWNhdXNlIHRoZSBjb250ZW50CisgICAgLy8gb2YgdGhlIHJlZ2V4IGlzIHVuZGVmaW5lZC4gU2luY2UgdGhlIHJlZ2V4J3MgYXJlIGVzc2VudGlhbGx5CisgICAgLy8gdGhlIHNhbWUsIG9uZSBjYW5ub3QgYmUgdmFsaWQgKG9yIGludmFsaWQpIHdpdGhvdXQgdGhlIG90aGVyCisgICAgLy8gYmVpbmcgc28gdG9vLgorICAgIHJlZ2ZyZWUoJnBhcnRpYWxfcmVnZXhfKTsKKyAgICByZWdmcmVlKCZmdWxsX3JlZ2V4Xyk7CisgIH0KKyAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgorYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7CisKKyAgcmVnbWF0Y2hfdCBtYXRjaDsKKyAgcmV0dXJuIHJlZ2V4ZWMoJnJlLmZ1bGxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIKKy8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCitib29sIFJFOjpQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgaWYgKCFyZS5pc192YWxpZF8pIHJldHVybiBmYWxzZTsKKworICByZWdtYXRjaF90IG1hdGNoOworICByZXR1cm4gcmVnZXhlYygmcmUucGFydGlhbF9yZWdleF8sIHN0ciwgMSwgJm1hdGNoLCAwKSA9PSAwOworfQorCisvLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCit2b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIHBhdHRlcm5fID0gcG9zaXg6OlN0ckR1cChyZWdleCk7CisKKyAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCisgIC8vIGZ1bGwgbWF0Y2guCisgIGNvbnN0IHNpemVfdCBmdWxsX3JlZ2V4X2xlbiA9IHN0cmxlbihyZWdleCkgKyAxMDsKKyAgY2hhciogY29uc3QgZnVsbF9wYXR0ZXJuID0gbmV3IGNoYXJbZnVsbF9yZWdleF9sZW5dOworCisgIHNucHJpbnRmKGZ1bGxfcGF0dGVybiwgZnVsbF9yZWdleF9sZW4sICJeKCVzKSQiLCByZWdleCk7CisgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJmZ1bGxfcmVnZXhfLCBmdWxsX3BhdHRlcm4sIFJFR19FWFRFTkRFRCkgPT0gMDsKKyAgLy8gV2Ugd2FudCB0byBjYWxsIHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCAuLi4pIGV2ZW4gaWYgdGhlCisgIC8vIHByZXZpb3VzIGV4cHJlc3Npb24gcmV0dXJucyBmYWxzZS4gIE90aGVyd2lzZSBwYXJ0aWFsX3JlZ2V4XyBtYXkKKyAgLy8gbm90IGJlIHByb3Blcmx5IGluaXRpYWxpemVkIGNhbiBtYXkgY2F1c2UgdHJvdWJsZSB3aGVuIGl0J3MKKyAgLy8gZnJlZWQuCisgIC8vCisgIC8vIFNvbWUgaW1wbGVtZW50YXRpb24gb2YgUE9TSVggcmVnZXggKGUuZy4gb24gYXQgbGVhc3Qgc29tZQorICAvLyB2ZXJzaW9ucyBvZiBDeWd3aW4pIGRvZXNuJ3QgYWNjZXB0IHRoZSBlbXB0eSBzdHJpbmcgYXMgYSB2YWxpZAorICAvLyByZWdleC4gIFdlIGNoYW5nZSBpdCB0byBhbiBlcXVpdmFsZW50IGZvcm0gIigpIiB0byBiZSBzYWZlLgorICBpZiAoaXNfdmFsaWRfKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgcGFydGlhbF9yZWdleCA9ICgqcmVnZXggPT0gJ1wwJykgPyAiKCkiIDogcmVnZXg7CisgICAgaXNfdmFsaWRfID0gcmVnY29tcCgmcGFydGlhbF9yZWdleF8sIHBhcnRpYWxfcmVnZXgsIFJFR19FWFRFTkRFRCkgPT0gMDsKKyAgfQorICBFWFBFQ1RfVFJVRShpc192YWxpZF8pCisgICAgICA8PCAiUmVndWxhciBleHByZXNzaW9uIFwiIiA8PCByZWdleAorICAgICAgPDwgIlwiIGlzIG5vdCBhIHZhbGlkIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4iOworCisgIGRlbGV0ZVtdIGZ1bGxfcGF0dGVybjsKK30KKworI2VsaWYgR1RFU1RfVVNFU19TSU1QTEVfUkUKKworLy8gUmV0dXJucyB0cnVlIGlmZiBjaCBhcHBlYXJzIGFueXdoZXJlIGluIHN0ciAoZXhjbHVkaW5nIHRoZQorLy8gdGVybWluYXRpbmcgJ1wwJyBjaGFyYWN0ZXIpLgorYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cikgeworICByZXR1cm4gY2ggIT0gJ1wwJyAmJiBzdHJjaHIoc3RyLCBjaCkgIT0gTlVMTDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiBjaCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBjbGFzc2lmaWNhdGlvbi4gIFVubGlrZQorLy8gc2ltaWxhciBmdW5jdGlvbnMgaW4gPGN0eXBlLmg+LCB0aGVzZSBhcmVuJ3QgYWZmZWN0ZWQgYnkgdGhlCisvLyBjdXJyZW50IGxvY2FsZS4KK2Jvb2wgSXNBc2NpaURpZ2l0KGNoYXIgY2gpIHsgcmV0dXJuICcwJyA8PSBjaCAmJiBjaCA8PSAnOSc7IH0KK2Jvb2wgSXNBc2NpaVB1bmN0KGNoYXIgY2gpIHsKKyAgcmV0dXJuIElzSW5TZXQoY2gsICJeLSFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxdX2B7fH1+Iik7Cit9Citib29sIElzUmVwZWF0KGNoYXIgY2gpIHsgcmV0dXJuIElzSW5TZXQoY2gsICI/KisiKTsgfQorYm9vbCBJc0FzY2lpV2hpdGVTcGFjZShjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiIFxmXG5cclx0XHYiKTsgfQorYm9vbCBJc0FzY2lpV29yZENoYXIoY2hhciBjaCkgeworICByZXR1cm4gKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKSB8fAorICAgICAgKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8IGNoID09ICdfJzsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiAiXFxjIiBpcyBhIHN1cHBvcnRlZCBlc2NhcGUgc2VxdWVuY2UuCitib29sIElzVmFsaWRFc2NhcGUoY2hhciBjKSB7CisgIHJldHVybiAoSXNBc2NpaVB1bmN0KGMpIHx8IElzSW5TZXQoYywgImREZm5yc1N0dndXIikpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBhdG9tIChzcGVjaWZpZWQgYnkgZXNjYXBlZCBhbmQgcGF0dGVybikKKy8vIG1hdGNoZXMgY2guICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiB0aGUgYXRvbSBpcyBpbnZhbGlkLgorYm9vbCBBdG9tTWF0Y2hlc0NoYXIoYm9vbCBlc2NhcGVkLCBjaGFyIHBhdHRlcm5fY2hhciwgY2hhciBjaCkgeworICBpZiAoZXNjYXBlZCkgeyAgLy8gIlxccCIgd2hlcmUgcCBpcyBwYXR0ZXJuX2NoYXIuCisgICAgc3dpdGNoIChwYXR0ZXJuX2NoYXIpIHsKKyAgICAgIGNhc2UgJ2QnOiByZXR1cm4gSXNBc2NpaURpZ2l0KGNoKTsKKyAgICAgIGNhc2UgJ0QnOiByZXR1cm4gIUlzQXNjaWlEaWdpdChjaCk7CisgICAgICBjYXNlICdmJzogcmV0dXJuIGNoID09ICdcZic7CisgICAgICBjYXNlICduJzogcmV0dXJuIGNoID09ICdcbic7CisgICAgICBjYXNlICdyJzogcmV0dXJuIGNoID09ICdccic7CisgICAgICBjYXNlICdzJzogcmV0dXJuIElzQXNjaWlXaGl0ZVNwYWNlKGNoKTsKKyAgICAgIGNhc2UgJ1MnOiByZXR1cm4gIUlzQXNjaWlXaGl0ZVNwYWNlKGNoKTsKKyAgICAgIGNhc2UgJ3QnOiByZXR1cm4gY2ggPT0gJ1x0JzsKKyAgICAgIGNhc2UgJ3YnOiByZXR1cm4gY2ggPT0gJ1x2JzsKKyAgICAgIGNhc2UgJ3cnOiByZXR1cm4gSXNBc2NpaVdvcmRDaGFyKGNoKTsKKyAgICAgIGNhc2UgJ1cnOiByZXR1cm4gIUlzQXNjaWlXb3JkQ2hhcihjaCk7CisgICAgfQorICAgIHJldHVybiBJc0FzY2lpUHVuY3QocGF0dGVybl9jaGFyKSAmJiBwYXR0ZXJuX2NoYXIgPT0gY2g7CisgIH0KKworICByZXR1cm4gKHBhdHRlcm5fY2hhciA9PSAnLicgJiYgY2ggIT0gJ1xuJykgfHwgcGF0dGVybl9jaGFyID09IGNoOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBWYWxpZGF0ZVJlZ2V4KCkgdG8gZm9ybWF0IGVycm9yIG1lc3NhZ2VzLgorc3RkOjpzdHJpbmcgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihjb25zdCBjaGFyKiByZWdleCwgaW50IGluZGV4KSB7CisgIHJldHVybiAoTWVzc2FnZSgpIDw8ICJTeW50YXggZXJyb3IgYXQgaW5kZXggIiA8PCBpbmRleAorICAgICAgICAgIDw8ICIgaW4gc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXggPDwgIlwiOiAiKS5HZXRTdHJpbmcoKTsKK30KKworLy8gR2VuZXJhdGVzIG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiByZWdleCBpcyBpbnZhbGlkOworLy8gb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KK2Jvb2wgVmFsaWRhdGVSZWdleChjb25zdCBjaGFyKiByZWdleCkgeworICBpZiAocmVnZXggPT0gTlVMTCkgeworICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBmaXggdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGluIHRoZQorICAgIC8vIGFzc2VydGlvbiBmYWlsdXJlcyB0byBtYXRjaCB3aGVyZSB0aGUgcmVnZXggaXMgdXNlZCBpbiB1c2VyCisgICAgLy8gY29kZS4KKyAgICBBRERfRkFJTFVSRSgpIDw8ICJOVUxMIGlzIG5vdCBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24uIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzX3ZhbGlkID0gdHJ1ZTsKKworICAvLyBUcnVlIGlmZiA/LCAqLCBvciArIGNhbiBmb2xsb3cgdGhlIHByZXZpb3VzIGF0b20uCisgIGJvb2wgcHJldl9yZXBlYXRhYmxlID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyByZWdleFtpXTsgaSsrKSB7CisgICAgaWYgKHJlZ2V4W2ldID09ICdcXCcpIHsgIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZQorICAgICAgaSsrOworICAgICAgaWYgKHJlZ2V4W2ldID09ICdcMCcpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoIUlzVmFsaWRFc2NhcGUocmVnZXhbaV0pKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgPDwgImludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFwiXFwiIDw8IHJlZ2V4W2ldIDw8ICJcIi4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfQorICAgICAgcHJldl9yZXBlYXRhYmxlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeyAgLy8gTm90IGFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgIGNvbnN0IGNoYXIgY2ggPSByZWdleFtpXTsKKworICAgICAgaWYgKGNoID09ICdeJyAmJiBpID4gMCkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZy4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChjaCA9PSAnJCcgJiYgcmVnZXhbaSArIDFdICE9ICdcMCcpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInJCcgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoSXNJblNldChjaCwgIigpW117fXwiKSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGlzIHVuc3VwcG9ydGVkLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKElzUmVwZWF0KGNoKSAmJiAhcHJldl9yZXBlYXRhYmxlKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgY2ggPDwgIicgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbi4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfQorCisgICAgICBwcmV2X3JlcGVhdGFibGUgPSAhSXNJblNldChjaCwgIl4kPyorIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGlzX3ZhbGlkOworfQorCisvLyBNYXRjaGVzIGEgcmVwZWF0ZWQgcmVnZXggYXRvbSBmb2xsb3dlZCBieSBhIHZhbGlkIHNpbXBsZSByZWd1bGFyCisvLyBleHByZXNzaW9uLiAgVGhlIHJlZ2V4IGF0b20gaXMgZGVmaW5lZCBhcyBjIGlmIGVzY2FwZWQgaXMgZmFsc2UsCisvLyBvciBcYyBvdGhlcndpc2UuICByZXBlYXQgaXMgdGhlIHJlcGV0aXRpb24gbWV0YSBjaGFyYWN0ZXIgKD8sICosCisvLyBvciArKS4gIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgc3RyIGNvbnRhaW5zIHRvbyBtYW55CisvLyBjaGFyYWN0ZXJzIHRvIGJlIGluZGV4YWJsZSBieSBzaXplX3QsIGluIHdoaWNoIGNhc2UgdGhlIHRlc3Qgd2lsbAorLy8gcHJvYmFibHkgdGltZSBvdXQgYW55d2F5LiAgV2UgYXJlIGZpbmUgd2l0aCB0aGlzIGxpbWl0YXRpb24gYXMKKy8vIHN0ZDo6c3RyaW5nIGhhcyBpdCB0b28uCitib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsCisgICAgY29uc3QgY2hhciogc3RyKSB7CisgIGNvbnN0IHNpemVfdCBtaW5fY291bnQgPSAocmVwZWF0ID09ICcrJykgPyAxIDogMDsKKyAgY29uc3Qgc2l6ZV90IG1heF9jb3VudCA9IChyZXBlYXQgPT0gJz8nKSA/IDEgOgorICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PigtMSkgLSAxOworICAvLyBXZSBjYW5ub3QgY2FsbCBudW1lcmljX2xpbWl0czo6bWF4KCkgYXMgaXQgY29uZmxpY3RzIHdpdGggdGhlCisgIC8vIG1heCgpIG1hY3JvIG9uIFdpbmRvd3MuCisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gbWF4X2NvdW50OyArK2kpIHsKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGF0b20gbWF0Y2hlcyBlYWNoIG9mIHRoZSBmaXJzdCBpIGNoYXJhY3RlcnMgaW4gc3RyLgorICAgIGlmIChpID49IG1pbl9jb3VudCAmJiBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4LCBzdHIgKyBpKSkgeworICAgICAgLy8gV2UgaGF2ZSBlbm91Z2ggbWF0Y2hlcyBhdCB0aGUgaGVhZCwgYW5kIHRoZSB0YWlsIG1hdGNoZXMgdG9vLgorICAgICAgLy8gU2luY2Ugd2Ugb25seSBjYXJlIGFib3V0ICp3aGV0aGVyKiB0aGUgcGF0dGVybiBtYXRjaGVzIHN0cgorICAgICAgLy8gKGFzIG9wcG9zZWQgdG8gKmhvdyogaXQgbWF0Y2hlcyksIHRoZXJlIGlzIG5vIG5lZWQgdG8gZmluZCBhCisgICAgICAvLyBncmVlZHkgbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHN0cltpXSA9PSAnXDAnIHx8ICFBdG9tTWF0Y2hlc0NoYXIoZXNjYXBlZCwgYywgc3RyW2ldKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhIHByZWZpeCBvZiBzdHIuICByZWdleCBtdXN0IGJlIGEKKy8vIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIG5vdCBzdGFydCB3aXRoICJeIiwgb3IgdGhlCisvLyByZXN1bHQgaXMgdW5kZWZpbmVkLgorYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKCpyZWdleCA9PSAnXDAnKSAgLy8gQW4gZW1wdHkgcmVnZXggbWF0Y2hlcyBhIHByZWZpeCBvZiBhbnl0aGluZy4KKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyAiJCIgb25seSBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcuICBOb3RlIHRoYXQgcmVnZXggYmVpbmcKKyAgLy8gdmFsaWQgZ3VhcmFudGVlcyB0aGF0IHRoZXJlJ3Mgbm90aGluZyBhZnRlciAiJCIgaW4gaXQuCisgIGlmICgqcmVnZXggPT0gJyQnKQorICAgIHJldHVybiAqc3RyID09ICdcMCc7CisKKyAgLy8gSXMgdGhlIGZpcnN0IHRoaW5nIGluIHJlZ2V4IGFuIGVzY2FwZSBzZXF1ZW5jZT8KKyAgY29uc3QgYm9vbCBlc2NhcGVkID0gKnJlZ2V4ID09ICdcXCc7CisgIGlmIChlc2NhcGVkKQorICAgICsrcmVnZXg7CisgIGlmIChJc1JlcGVhdChyZWdleFsxXSkpIHsKKyAgICAvLyBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgpIGNhbGxzIE1hdGNoUmVnZXhBdEhlYWQoKSwgc28KKyAgICAvLyBoZXJlJ3MgYW4gaW5kaXJlY3QgcmVjdXJzaW9uLiAgSXQgdGVybWluYXRlcyBhcyB0aGUgcmVnZXggZ2V0cworICAgIC8vIHNob3J0ZXIgaW4gZWFjaCByZWN1cnNpb24uCisgICAgcmV0dXJuIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAorICAgICAgICBlc2NhcGVkLCByZWdleFswXSwgcmVnZXhbMV0sIHJlZ2V4ICsgMiwgc3RyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyByZWdleCBpc24ndCBlbXB0eSwgaXNuJ3QgIiQiLCBhbmQgZG9lc24ndCBzdGFydCB3aXRoIGEKKyAgICAvLyByZXBldGl0aW9uLiAgV2UgbWF0Y2ggdGhlIGZpcnN0IGF0b20gb2YgcmVnZXggd2l0aCB0aGUgZmlyc3QKKyAgICAvLyBjaGFyYWN0ZXIgb2Ygc3RyIGFuZCByZWN1cnNlLgorICAgIHJldHVybiAoKnN0ciAhPSAnXDAnKSAmJiBBdG9tTWF0Y2hlc0NoYXIoZXNjYXBlZCwgKnJlZ2V4LCAqc3RyKSAmJgorICAgICAgICBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4ICsgMSwgc3RyICsgMSk7CisgIH0KK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWdleCBtYXRjaGVzIGFueSBzdWJzdHJpbmcgb2Ygc3RyLiAgcmVnZXggbXVzdCBiZQorLy8gYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLCBvciB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KKy8vCisvLyBUaGUgYWxnb3JpdGhtIGlzIHJlY3Vyc2l2ZSwgYnV0IHRoZSByZWN1cnNpb24gZGVwdGggZG9lc24ndCBleGNlZWQKKy8vIHRoZSByZWdleCBsZW5ndGgsIHNvIHdlIHdvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgcnVubmluZyBvdXQgb2YKKy8vIHN0YWNrIHNwYWNlIG5vcm1hbGx5LiAgSW4gcmFyZSBjYXNlcyB0aGUgdGltZSBjb21wbGV4aXR5IGNhbiBiZQorLy8gZXhwb25lbnRpYWwgd2l0aCByZXNwZWN0IHRvIHRoZSByZWdleCBsZW5ndGggKyB0aGUgc3RyaW5nIGxlbmd0aCwKKy8vIGJ1dCB1c3VhbGx5IGl0J3MgbXVzdCBmYXN0ZXIgKG9mdGVuIGNsb3NlIHRvIGxpbmVhcikuCitib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7CisgIGlmIChyZWdleCA9PSBOVUxMIHx8IHN0ciA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKnJlZ2V4ID09ICdeJykKKyAgICByZXR1cm4gTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0cik7CisKKyAgLy8gQSBzdWNjZXNzZnVsIG1hdGNoIGNhbiBiZSBhbnl3aGVyZSBpbiBzdHIuCisgIGRvIHsKKyAgICBpZiAoTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9IHdoaWxlICgqc3RyKysgIT0gJ1wwJyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gSW1wbGVtZW50cyB0aGUgUkUgY2xhc3MuCisKK1JFOjp+UkUoKSB7CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKKyAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihmdWxsX3BhdHRlcm5fKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgdGhlIGVudGlyZSBzdHIuCitib29sIFJFOjpGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUuZnVsbF9wYXR0ZXJuXywgc3RyKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIKKy8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCitib29sIFJFOjpQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUucGF0dGVybl8sIHN0cik7Cit9CisKKy8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KK3ZvaWQgUkU6OkluaXQoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgcGF0dGVybl8gPSBmdWxsX3BhdHRlcm5fID0gTlVMTDsKKyAgaWYgKHJlZ2V4ICE9IE5VTEwpIHsKKyAgICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOworICB9CisKKyAgaXNfdmFsaWRfID0gVmFsaWRhdGVSZWdleChyZWdleCk7CisgIGlmICghaXNfdmFsaWRfKSB7CisgICAgLy8gTm8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0dGVybiB3aGVuIHRoZSByZWdleCBpcyBpbnZhbGlkLgorICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IHNpemVfdCBsZW4gPSBzdHJsZW4ocmVnZXgpOworICAvLyBSZXNlcnZlcyBlbm91Z2ggYnl0ZXMgdG8gaG9sZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIGEKKyAgLy8gZnVsbCBtYXRjaDogd2UgbmVlZCBzcGFjZSB0byBwcmVwZW5kIGEgJ14nLCBhcHBlbmQgYSAnJCcsIGFuZAorICAvLyB0ZXJtaW5hdGUgdGhlIHN0cmluZyB3aXRoICdcMCcuCisgIGNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihtYWxsb2MobGVuICsgMykpOworICBmdWxsX3BhdHRlcm5fID0gYnVmZmVyOworCisgIGlmICgqcmVnZXggIT0gJ14nKQorICAgICpidWZmZXIrKyA9ICdeJzsgIC8vIE1ha2VzIHN1cmUgZnVsbF9wYXR0ZXJuXyBzdGFydHMgd2l0aCAnXicuCisKKyAgLy8gV2UgZG9uJ3QgdXNlIHNucHJpbnRmIG9yIHN0cm5jcHksIGFzIHRoZXkgdHJpZ2dlciBhIHdhcm5pbmcgd2hlbgorICAvLyBjb21waWxlZCB3aXRoIFZDKysgOC4wLgorICBtZW1jcHkoYnVmZmVyLCByZWdleCwgbGVuKTsKKyAgYnVmZmVyICs9IGxlbjsKKworICBpZiAobGVuID09IDAgfHwgcmVnZXhbbGVuIC0gMV0gIT0gJyQnKQorICAgICpidWZmZXIrKyA9ICckJzsgIC8vIE1ha2VzIHN1cmUgZnVsbF9wYXR0ZXJuXyBlbmRzIHdpdGggJyQnLgorCisgICpidWZmZXIgPSAnXDAnOworfQorCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfUE9TSVhfUkUKKworY29uc3QgY2hhciBrVW5rbm93bkZpbGVbXSA9ICJ1bmtub3duIGZpbGUiOworCisvLyBGb3JtYXRzIGEgc291cmNlIGZpbGUgcGF0aCBhbmQgYSBsaW5lIG51bWJlciBhcyB0aGV5IHdvdWxkIGFwcGVhcgorLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLgorR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUgPSBmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlOworCisgIGlmIChsaW5lIDwgMCkgeworICAgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJXM6IiwgZmlsZV9uYW1lKS5jX3N0cigpOworICB9CisjaWZkZWYgX01TQ19WRVIKKyAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlcyglZCk6IiwgZmlsZV9uYW1lLCBsaW5lKS5jX3N0cigpOworI2Vsc2UKKyAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlczolZDoiLCBmaWxlX25hbWUsIGxpbmUpLmNfc3RyKCk7CisjZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgorLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bworLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgorLy8gTm90ZSB0aGF0IEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oKSBkb2VzIE5PVCBhcHBlbmQgY29sb24KKy8vIHRvIHRoZSBmaWxlIGxvY2F0aW9uIGl0IHByb2R1Y2VzLCB1bmxpa2UgRm9ybWF0RmlsZUxvY2F0aW9uKCkuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKKyAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUgPSBmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlOworCisgIGlmIChsaW5lIDwgMCkKKyAgICByZXR1cm4gZmlsZV9uYW1lOworICBlbHNlCisgICAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlczolZCIsIGZpbGVfbmFtZSwgbGluZSkuY19zdHIoKTsKK30KKworCitHVGVzdExvZzo6R1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCisgICAgOiBzZXZlcml0eV8oc2V2ZXJpdHkpIHsKKyAgY29uc3QgY2hhciogY29uc3QgbWFya2VyID0KKyAgICAgIHNldmVyaXR5ID09IEdURVNUX0lORk8gPyAgICAiWyAgSU5GTyBdIiA6CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9XQVJOSU5HID8gIltXQVJOSU5HXSIgOgorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfRVJST1IgPyAgICJbIEVSUk9SIF0iIDogIlsgRkFUQUwgXSI7CisgIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsIDw8IG1hcmtlciA8PCAiICIKKyAgICAgICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCkgPDwgIjogIjsKK30KKworLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCitHVGVzdExvZzo6fkdUZXN0TG9nKCkgeworICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbDsKKyAgaWYgKHNldmVyaXR5XyA9PSBHVEVTVF9GQVRBTCkgeworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9Cit9CisvLyBEaXNhYmxlIE1pY3Jvc29mdCBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgUE9TSVggZnVuY3Rpb25zIGNhbGxlZCBmcm9tCisvLyB0aGlzIGNsYXNzIChjcmVhdCwgZHVwLCBkdXAyLCBhbmQgY2xvc2UpCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDk5NikKKyNlbmRpZiAgLy8gX01TQ19WRVIKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gT2JqZWN0IHRoYXQgY2FwdHVyZXMgYW4gb3V0cHV0IHN0cmVhbSAoc3Rkb3V0L3N0ZGVycikuCitjbGFzcyBDYXB0dXJlZFN0cmVhbSB7CisgcHVibGljOgorICAvLyBUaGUgY3RvciByZWRpcmVjdHMgdGhlIHN0cmVhbSB0byBhIHRlbXBvcmFyeSBmaWxlLgorICBleHBsaWNpdCBDYXB0dXJlZFN0cmVhbShpbnQgZmQpIDogZmRfKGZkKSwgdW5jYXB0dXJlZF9mZF8oZHVwKGZkKSkgeworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgY2hhciB0ZW1wX2Rpcl9wYXRoW01BWF9QQVRIICsgMV0gPSB7ICdcMCcgfTsgIC8vIE5PTElOVAorICAgIGNoYXIgdGVtcF9maWxlX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCisKKyAgICA6OkdldFRlbXBQYXRoQShzaXplb2YodGVtcF9kaXJfcGF0aCksIHRlbXBfZGlyX3BhdGgpOworICAgIGNvbnN0IFVJTlQgc3VjY2VzcyA9IDo6R2V0VGVtcEZpbGVOYW1lQSh0ZW1wX2Rpcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Rlc3RfcmVkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gR2VuZXJhdGUgdW5pcXVlIGZpbGUgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9maWxlX3BhdGgpOworICAgIEdURVNUX0NIRUNLXyhzdWNjZXNzICE9IDApCisgICAgICAgIDw8ICJVbmFibGUgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgaW4gIiA8PCB0ZW1wX2Rpcl9wYXRoOworICAgIGNvbnN0IGludCBjYXB0dXJlZF9mZCA9IGNyZWF0KHRlbXBfZmlsZV9wYXRoLCBfU19JUkVBRCB8IF9TX0lXUklURSk7CisgICAgR1RFU1RfQ0hFQ0tfKGNhcHR1cmVkX2ZkICE9IC0xKSA8PCAiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGVtcF9maWxlX3BhdGg7CisgICAgZmlsZW5hbWVfID0gdGVtcF9maWxlX3BhdGg7CisjIGVsc2UKKyAgICAvLyBUaGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGEgdGVzdCBoYXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBjdXJyZW50CisgICAgLy8gZGlyZWN0b3J5LCBzbyB3ZSBjcmVhdGUgdGhlIHRlbXBvcmFyeSBmaWxlIGluIHRoZSAvdG1wIGRpcmVjdG9yeQorICAgIC8vIGluc3RlYWQuIFdlIHVzZSAvdG1wIG9uIG1vc3Qgc3lzdGVtcywgYW5kIC9zZGNhcmQgb24gQW5kcm9pZC4KKyAgICAvLyBUaGF0J3MgYmVjYXVzZSBBbmRyb2lkIGRvZXNuJ3QgaGF2ZSAvdG1wLgorIyAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorICAgIC8vIE5vdGU6IEFuZHJvaWQgYXBwbGljYXRpb25zIGFyZSBleHBlY3RlZCB0byBjYWxsIHRoZSBmcmFtZXdvcmsncworICAgIC8vIENvbnRleHQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgbWV0aG9kIHRocm91Z2ggSk5JIHRvIGdldAorICAgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgd29ybGQtd3JpdGFibGUgU0QgQ2FyZCBkaXJlY3RvcnkuIEhvd2V2ZXIsCisgICAgLy8gdGhpcyByZXF1aXJlcyBhIENvbnRleHQgaGFuZGxlLCB3aGljaCBjYW5ub3QgYmUgcmV0cmlldmVkCisgICAgLy8gZ2xvYmFsbHkgZnJvbSBuYXRpdmUgY29kZS4gRG9pbmcgc28gYWxzbyBwcmVjbHVkZXMgcnVubmluZyB0aGUKKyAgICAvLyBjb2RlIGFzIHBhcnQgb2YgYSByZWd1bGFyIHN0YW5kYWxvbmUgZXhlY3V0YWJsZSwgd2hpY2ggZG9lc24ndAorICAgIC8vIHJ1biBpbiBhIERhbHZpayBwcm9jZXNzIChlLmcuIHdoZW4gcnVubmluZyBpdCB0aHJvdWdoICdhZGIgc2hlbGwnKS4KKyAgICAvLworICAgIC8vIFRoZSBsb2NhdGlvbiAvc2RjYXJkIGlzIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSBuYXRpdmUgY29kZQorICAgIC8vIGFuZCBpcyB0aGUgb25seSBsb2NhdGlvbiAodW5vZmZpY2lhbGx5KSBzdXBwb3J0ZWQgYnkgdGhlIEFuZHJvaWQKKyAgICAvLyB0ZWFtLiBJdCdzIGdlbmVyYWxseSBhIHN5bWxpbmsgdG8gdGhlIHJlYWwgU0QgQ2FyZCBtb3VudCBwb2ludAorICAgIC8vIHdoaWNoIGNhbiBiZSAvbW50L3NkY2FyZCwgL21udC9zZGNhcmQwLCAvc3lzdGVtL21lZGlhL3NkY2FyZCwgb3IKKyAgICAvLyBvdGhlciBPRU0tY3VzdG9taXplZCBsb2NhdGlvbnMuIE5ldmVyIHJlbHkgb24gdGhlc2UsIGFuZCBhbHdheXMKKyAgICAvLyB1c2UgL3NkY2FyZC4KKyAgICBjaGFyIG5hbWVfdGVtcGxhdGVbXSA9ICIvc2RjYXJkL2d0ZXN0X2NhcHR1cmVkX3N0cmVhbS5YWFhYWFgiOworIyAgZWxzZQorICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi90bXAvY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorICAgIGNvbnN0IGludCBjYXB0dXJlZF9mZCA9IG1rc3RlbXAobmFtZV90ZW1wbGF0ZSk7CisgICAgZmlsZW5hbWVfID0gbmFtZV90ZW1wbGF0ZTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICBmZmx1c2goTlVMTCk7CisgICAgZHVwMihjYXB0dXJlZF9mZCwgZmRfKTsKKyAgICBjbG9zZShjYXB0dXJlZF9mZCk7CisgIH0KKworICB+Q2FwdHVyZWRTdHJlYW0oKSB7CisgICAgcmVtb3ZlKGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RyaW5nKCkgeworICAgIGlmICh1bmNhcHR1cmVkX2ZkXyAhPSAtMSkgeworICAgICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgIGZmbHVzaChOVUxMKTsKKyAgICAgIGR1cDIodW5jYXB0dXJlZF9mZF8sIGZkXyk7CisgICAgICBjbG9zZSh1bmNhcHR1cmVkX2ZkXyk7CisgICAgICB1bmNhcHR1cmVkX2ZkXyA9IC0xOworICAgIH0KKworICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4oZmlsZW5hbWVfLmNfc3RyKCksICJyIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudCA9IFJlYWRFbnRpcmVGaWxlKGZpbGUpOworICAgIHBvc2l4OjpGQ2xvc2UoZmlsZSk7CisgICAgcmV0dXJuIGNvbnRlbnQ7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYW4gc3RkOjpzdHJpbmcuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKTsKKworICAvLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgorICBzdGF0aWMgc2l6ZV90IEdldEZpbGVTaXplKEZJTEUqIGZpbGUpOworCisgIGNvbnN0IGludCBmZF87ICAvLyBBIHN0cmVhbSB0byBjYXB0dXJlLgorICBpbnQgdW5jYXB0dXJlZF9mZF87CisgIC8vIE5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGhvbGRpbmcgdGhlIHN0ZGVyciBvdXRwdXQuCisgIDo6c3RkOjpzdHJpbmcgZmlsZW5hbWVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQ2FwdHVyZWRTdHJlYW0pOworfTsKKworLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4KK3NpemVfdCBDYXB0dXJlZFN0cmVhbTo6R2V0RmlsZVNpemUoRklMRSogZmlsZSkgeworICBmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGZ0ZWxsKGZpbGUpKTsKK30KKworLy8gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgZmlsZSBhcyBhIHN0cmluZy4KK3N0ZDo6c3RyaW5nIENhcHR1cmVkU3RyZWFtOjpSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKSB7CisgIGNvbnN0IHNpemVfdCBmaWxlX3NpemUgPSBHZXRGaWxlU2l6ZShmaWxlKTsKKyAgY2hhciogY29uc3QgYnVmZmVyID0gbmV3IGNoYXJbZmlsZV9zaXplXTsKKworICBzaXplX3QgYnl0ZXNfbGFzdF9yZWFkID0gMDsgIC8vICMgb2YgYnl0ZXMgcmVhZCBpbiB0aGUgbGFzdCBmcmVhZCgpCisgIHNpemVfdCBieXRlc19yZWFkID0gMDsgICAgICAgLy8gIyBvZiBieXRlcyByZWFkIHNvIGZhcgorCisgIGZzZWVrKGZpbGUsIDAsIFNFRUtfU0VUKTsKKworICAvLyBLZWVwcyByZWFkaW5nIHRoZSBmaWxlIHVudGlsIHdlIGNhbm5vdCByZWFkIGZ1cnRoZXIgb3IgdGhlCisgIC8vIHByZS1kZXRlcm1pbmVkIGZpbGUgc2l6ZSBpcyByZWFjaGVkLgorICBkbyB7CisgICAgYnl0ZXNfbGFzdF9yZWFkID0gZnJlYWQoYnVmZmVyK2J5dGVzX3JlYWQsIDEsIGZpbGVfc2l6ZS1ieXRlc19yZWFkLCBmaWxlKTsKKyAgICBieXRlc19yZWFkICs9IGJ5dGVzX2xhc3RfcmVhZDsKKyAgfSB3aGlsZSAoYnl0ZXNfbGFzdF9yZWFkID4gMCAmJiBieXRlc19yZWFkIDwgZmlsZV9zaXplKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50KGJ1ZmZlciwgYnl0ZXNfcmVhZCk7CisgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICByZXR1cm4gY29udGVudDsKK30KKworIyBpZmRlZiBfTVNDX1ZFUgorIyAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyBlbmRpZiAgLy8gX01TQ19WRVIKKworc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZGVyciA9IE5VTEw7CitzdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3Rkb3V0ID0gTlVMTDsKKworLy8gU3RhcnRzIGNhcHR1cmluZyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KK3ZvaWQgQ2FwdHVyZVN0cmVhbShpbnQgZmQsIGNvbnN0IGNoYXIqIHN0cmVhbV9uYW1lLCBDYXB0dXJlZFN0cmVhbSoqIHN0cmVhbSkgeworICBpZiAoKnN0cmVhbSAhPSBOVUxMKSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIk9ubHkgb25lICIgPDwgc3RyZWFtX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGNhcHR1cmVyIGNhbiBleGlzdCBhdCBhIHRpbWUuIjsKKyAgfQorICAqc3RyZWFtID0gbmV3IENhcHR1cmVkU3RyZWFtKGZkKTsKK30KKworLy8gU3RvcHMgY2FwdHVyaW5nIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0cmVhbShDYXB0dXJlZFN0cmVhbSoqIGNhcHR1cmVkX3N0cmVhbSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50ID0gKCpjYXB0dXJlZF9zdHJlYW0pLT5HZXRDYXB0dXJlZFN0cmluZygpOworCisgIGRlbGV0ZSAqY2FwdHVyZWRfc3RyZWFtOworICAqY2FwdHVyZWRfc3RyZWFtID0gTlVMTDsKKworICByZXR1cm4gY29udGVudDsKK30KKworLy8gU3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCit2b2lkIENhcHR1cmVTdGRvdXQoKSB7CisgIENhcHR1cmVTdHJlYW0oa1N0ZE91dEZpbGVubywgInN0ZG91dCIsICZnX2NhcHR1cmVkX3N0ZG91dCk7Cit9CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgordm9pZCBDYXB0dXJlU3RkZXJyKCkgeworICBDYXB0dXJlU3RyZWFtKGtTdGRFcnJGaWxlbm8sICJzdGRlcnIiLCAmZ19jYXB0dXJlZF9zdGRlcnIpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpIHsKKyAgcmV0dXJuIEdldENhcHR1cmVkU3RyZWFtKCZnX2NhcHR1cmVkX3N0ZG91dCk7Cit9CisKKy8vIFN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK3N0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RkZXJyKCkgeworICByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3RkZXJyKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KKzo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4gZ19hcmd2czsKKworc3RhdGljIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTDsgIC8vIE93bmVkLgorCit2b2lkIFNldEluamVjdGFibGVBcmd2cyhjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KiBhcmd2cykgeworICBpZiAoZ19pbmplY3RlZF90ZXN0X2FyZ3ZzICE9IGFyZ3ZzKQorICAgIGRlbGV0ZSBnX2luamVjdGVkX3Rlc3RfYXJndnM7CisgIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9IGFyZ3ZzOworfQorCitjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+JiBHZXRJbmplY3RhYmxlQXJndnMoKSB7CisgIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gTlVMTCkgeworICAgIHJldHVybiAqZ19pbmplY3RlZF90ZXN0X2FyZ3ZzOworICB9CisgIHJldHVybiBnX2FyZ3ZzOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK25hbWVzcGFjZSBwb3NpeCB7Cit2b2lkIEFib3J0KCkgeworICBEZWJ1Z0JyZWFrKCk7CisgIFRlcm1pbmF0ZVByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgMSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcG9zaXgKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUKKy8vIGdpdmVuIGZsYWcuICBGb3IgZXhhbXBsZSwgRmxhZ1RvRW52VmFyKCJmb28iKSB3aWxsIHJldHVybgorLy8gIkdURVNUX0ZPTyIgaW4gdGhlIG9wZW4tc291cmNlIHZlcnNpb24uCitzdGF0aWMgc3RkOjpzdHJpbmcgRmxhZ1RvRW52VmFyKGNvbnN0IGNoYXIqIGZsYWcpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZnVsbF9mbGFnID0KKyAgICAgIChNZXNzYWdlKCkgPDwgR1RFU1RfRkxBR19QUkVGSVhfIDw8IGZsYWcpLkdldFN0cmluZygpOworCisgIE1lc3NhZ2UgZW52X3ZhcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gZnVsbF9mbGFnLmxlbmd0aCgpOyBpKyspIHsKKyAgICBlbnZfdmFyIDw8IFRvVXBwZXIoZnVsbF9mbGFnLmNfc3RyKClbaV0pOworICB9CisKKyAgcmV0dXJuIGVudl92YXIuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMKKy8vIHRoZSByZXN1bHQgdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlCisvLyB1bmNoYW5nZWQgYW5kIHJldHVybnMgZmFsc2UuCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKSB7CisgIC8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBkZWNpbWFsIGludGVnZXIuCisgIGNoYXIqIGVuZCA9IE5VTEw7CisgIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVAorCisgIC8vIEhhcyBzdHJ0b2woKSBjb25zdW1lZCBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nPworICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgLy8gTm8gLSBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgZW5jb3VudGVyZWQuCisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0CisgICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgorICAgICAgICA8PCAiIGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7CisgICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KKyAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOworICBpZiAobG9uZ192YWx1ZSA9PSBMT05HX01BWCB8fCBsb25nX3ZhbHVlID09IExPTkdfTUlOIHx8CisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucworICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKKyAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KKyAgICAgICkgeworICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAorICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKKyAgICAgICAgPDwgIiBoYXMgdmFsdWUgIiA8PCBzdHIgPDwgIiwgd2hpY2ggb3ZlcmZsb3dzLlxuIjsKKyAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBCb29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KKy8vCisvLyBUaGUgdmFsdWUgaXMgY29uc2lkZXJlZCB0cnVlIGlmZiBpdCdzIG5vdCAiMCIuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgcmV0dXJuIHN0cmluZ192YWx1ZSA9PSBOVUxMID8KKyAgICAgIGRlZmF1bHRfdmFsdWUgOiBzdHJjbXAoc3RyaW5nX3ZhbHVlLCAiMCIpICE9IDA7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIGEgMzItYml0IGludGVnZXIgc3RvcmVkIGluIHRoZSBlbnZpcm9ubWVudAorLy8gdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQgaXNuJ3Qgc2V0IG9yCisvLyBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIDMyLWJpdCBpbnRlZ2VyLCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitJbnQzMiBJbnQzMkZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgaWYgKHN0cmluZ192YWx1ZSA9PSBOVUxMKSB7CisgICAgLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKworICBJbnQzMiByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOworICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJFbnZpcm9ubWVudCB2YXJpYWJsZSAiIDw8IGVudl92YXIsCisgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWUsICZyZXN1bHQpKSB7CisgICAgcHJpbnRmKCJUaGUgZGVmYXVsdCB2YWx1ZSAlcyBpcyB1c2VkLlxuIiwKKyAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCBkZWZhdWx0X3ZhbHVlKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bworLy8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0J3Mgbm90IHNldCwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorY29uc3QgY2hhciogU3RyaW5nRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiB2YWx1ZSA9PSBOVUxMID8gZGVmYXVsdF92YWx1ZSA6IHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlciB0aGF0IGNhbiBwcmludCBhCisvLyB2YWx1ZSBvZiBhbnkgdHlwZSBUOgorLy8KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpOworLy8KKy8vIEl0IHVzZXMgdGhlIDw8IG9wZXJhdG9yIHdoZW4gcG9zc2libGUsIGFuZCBwcmludHMgdGhlIGJ5dGVzIGluIHRoZQorLy8gb2JqZWN0IG90aGVyd2lzZS4gIEEgdXNlciBjYW4gb3ZlcnJpZGUgaXRzIGJlaGF2aW9yIGZvciBhIGNsYXNzCisvLyB0eXBlIEZvbyBieSBkZWZpbmluZyBlaXRoZXIgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYsIGNvbnN0IEZvbyYpCisvLyBvciB2b2lkIFByaW50VG8oY29uc3QgRm9vJiwgOjpzdGQ6Om9zdHJlYW0qKSBpbiB0aGUgbmFtZXNwYWNlIHRoYXQKKy8vIGRlZmluZXMgRm9vLgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjpzdGQ6Om9zdHJlYW07CisKKy8vIFByaW50cyBhIHNlZ21lbnQgb2YgYnl0ZXMgaW4gdGhlIGdpdmVuIG9iamVjdC4KK3ZvaWQgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgb3N0cmVhbSogb3MpIHsKKyAgY2hhciB0ZXh0WzVdID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKyAgICBjb25zdCBzaXplX3QgaiA9IHN0YXJ0ICsgaTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAvLyBPcmdhbml6ZXMgdGhlIGJ5dGVzIGludG8gZ3JvdXBzIG9mIDIgZm9yIGVhc3kgcGFyc2luZyBieQorICAgICAgLy8gaHVtYW4uCisgICAgICBpZiAoKGogJSAyKSA9PSAwKQorICAgICAgICAqb3MgPDwgJyAnOworICAgICAgZWxzZQorICAgICAgICAqb3MgPDwgJy0nOworICAgIH0KKyAgICBHVEVTVF9TTlBSSU5URl8odGV4dCwgc2l6ZW9mKHRleHQpLCAiJTAyWCIsIG9ial9ieXRlc1tqXSk7CisgICAgKm9zIDw8IHRleHQ7CisgIH0KK30KKworLy8gUHJpbnRzIHRoZSBieXRlcyBpbiB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uCit2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbChjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7CisgIC8vIFRlbGxzIHRoZSB1c2VyIGhvdyBiaWcgdGhlIG9iamVjdCBpcy4KKyAgKm9zIDw8IGNvdW50IDw8ICItYnl0ZSBvYmplY3QgPCI7CisKKyAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxMzI7CisgIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gNjQ7CisgIC8vIElmIHRoZSBvYmplY3Qgc2l6ZSBpcyBiaWdnZXIgdGhhbiBrVGhyZXNob2xkLCB3ZSdsbCBoYXZlIHRvIG9taXQKKyAgLy8gc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBrQ2h1bmtTaXplCisgIC8vIGJ5dGVzLgorICAvLyBUT0RPKHdhbik6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgorICBpZiAoY291bnQgPCBrVGhyZXNob2xkKSB7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBjb3VudCwgb3MpOworICB9IGVsc2UgeworICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgMCwga0NodW5rU2l6ZSwgb3MpOworICAgICpvcyA8PCAiIC4uLiAiOworICAgIC8vIFJvdW5kcyB1cCB0byAyLWJ5dGUgYm91bmRhcnkuCisgICAgY29uc3Qgc2l6ZV90IHJlc3VtZV9wb3MgPSAoY291bnQgLSBrQ2h1bmtTaXplICsgMSkvMioyOworICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgcmVzdW1lX3BvcywgY291bnQgLSByZXN1bWVfcG9zLCBvcyk7CisgIH0KKyAgKm9zIDw8ICI+IjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbDIgeworCisvLyBEZWxlZ2F0ZXMgdG8gUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKCkgdG8gcHJpbnQgdGhlIGJ5dGVzIGluIHRoZQorLy8gZ2l2ZW4gb2JqZWN0LiAgVGhlIGRlbGVnYXRpb24gc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoCisvLyB1c2VzIHRoZSA8PCBvcGVyYXRvciBhbmQgdGh1cyBpcyBlYXNpZXIgZG9uZSBvdXRzaWRlIG9mIHRoZQorLy8gOjp0ZXN0aW5nOjppbnRlcm5hbCBuYW1lc3BhY2UsIHdoaWNoIGNvbnRhaW5zIGEgPDwgb3BlcmF0b3IgdGhhdAorLy8gc29tZXRpbWVzIGNvbmZsaWN0cyB3aXRoIHRoZSBvbmUgaW4gU1RMLgordm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKG9ial9ieXRlcywgY291bnQsIG9zKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGEgY2hhciAob3Igd2NoYXJfdCksIHdlIHByaW50IGl0IGluIG9uZQorLy8gb2YgdGhyZWUgZm9ybWF0czoKKy8vICAgLSBhcyBpcyBpZiBpdCdzIGEgcHJpbnRhYmxlIEFTQ0lJIChlLmcuICdhJywgJzInLCAnICcpLAorLy8gICAtIGFzIGEgaGV4aWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdceDdGJyksIG9yCisvLyAgIC0gYXMgYSBzcGVjaWFsIGVzY2FwZSBzZXF1ZW5jZSAoZS5nLiAnXHInLCAnXG4nKS4KK2VudW0gQ2hhckZvcm1hdCB7CisgIGtBc0lzLAorICBrSGV4RXNjYXBlLAorICBrU3BlY2lhbEVzY2FwZQorfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGMgaXMgYSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyLiAgV2UgdGVzdCB0aGUKKy8vIHZhbHVlIG9mIGMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIGlzcHJpbnQoKSwgd2hpY2ggaXMgYnVnZ3kgb24KKy8vIFdpbmRvd3MgTW9iaWxlLgoraW5saW5lIGJvb2wgSXNQcmludGFibGVBc2NpaSh3Y2hhcl90IGMpIHsKKyAgcmV0dXJuIDB4MjAgPD0gYyAmJiBjIDw9IDB4N0U7Cit9CisKKy8vIFByaW50cyBhIHdpZGUgb3IgbmFycm93IGNoYXIgYyBhcyBhIGNoYXJhY3RlciBsaXRlcmFsIHdpdGhvdXQgdGhlCisvLyBxdW90ZXMsIGVzY2FwaW5nIGl0IHdoZW4gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCisvLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsCisvLyB3aGljaCBpcyB0aGUgdHlwZSBvZiBjLgordGVtcGxhdGUgPHR5cGVuYW1lIFVuc2lnbmVkQ2hhciwgdHlwZW5hbWUgQ2hhcj4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNDaGFyTGl0ZXJhbFRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsKKyAgc3dpdGNoIChzdGF0aWNfY2FzdDx3Y2hhcl90PihjKSkgeworICAgIGNhc2UgTCdcMCc6CisgICAgICAqb3MgPDwgIlxcMCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXCcnOgorICAgICAgKm9zIDw8ICJcXCciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xcJzoKKyAgICAgICpvcyA8PCAiXFxcXCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGEnOgorICAgICAgKm9zIDw8ICJcXGEiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xiJzoKKyAgICAgICpvcyA8PCAiXFxiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcZic6CisgICAgICAqb3MgPDwgIlxcZiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXG4nOgorICAgICAgKm9zIDw8ICJcXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xyJzoKKyAgICAgICpvcyA8PCAiXFxyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcdCc6CisgICAgICAqb3MgPDwgIlxcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXHYnOgorICAgICAgKm9zIDw8ICJcXHYiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChJc1ByaW50YWJsZUFzY2lpKGMpKSB7CisgICAgICAgICpvcyA8PCBzdGF0aWNfY2FzdDxjaGFyPihjKTsKKyAgICAgICAgcmV0dXJuIGtBc0lzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKm9zIDw8IFN0cmluZzo6Rm9ybWF0KCJcXHglWCIsIHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpOworICAgICAgICByZXR1cm4ga0hleEVzY2FwZTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7Cit9CisKKy8vIFByaW50cyBhIHdjaGFyX3QgYyBhcyBpZiBpdCdzIHBhcnQgb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZXNjYXBpbmcgaXQgd2hlbgorLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCitzdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKHdjaGFyX3QgYywgb3N0cmVhbSogb3MpIHsKKyAgc3dpdGNoIChjKSB7CisgICAgY2FzZSBMJ1wnJzoKKyAgICAgICpvcyA8PCAiJyI7CisgICAgICByZXR1cm4ga0FzSXM7CisgICAgY2FzZSBMJyInOgorICAgICAgKm9zIDw8ICJcXFwiIjsKKyAgICAgIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFByaW50QXNDaGFyTGl0ZXJhbFRvPHdjaGFyX3Q+KGMsIG9zKTsKKyAgfQorfQorCisvLyBQcmludHMgYSBjaGFyIGMgYXMgaWYgaXQncyBwYXJ0IG9mIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwaW5nIGl0IHdoZW4KKy8vIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgorc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyhjaGFyIGMsIG9zdHJlYW0qIG9zKSB7CisgIHJldHVybiBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKAorICAgICAgc3RhdGljX2Nhc3Q8d2NoYXJfdD4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYykpLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIHdpZGUgb3IgbmFycm93IGNoYXJhY3RlciBjIGFuZCBpdHMgY29kZS4gICdcMCcgaXMgcHJpbnRlZAorLy8gYXMgIidcXDAnIiwgb3RoZXIgdW5wcmludGFibGUgY2hhcmFjdGVycyBhcmUgYWxzbyBwcm9wZXJseSBlc2NhcGVkCisvLyB1c2luZyB0aGUgc3RhbmRhcmQgQysrIGVzY2FwZSBzZXF1ZW5jZS4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAorLy8gVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsIHdoaWNoIGlzIHRoZSB0eXBlIG9mIGMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPgordm9pZCBQcmludENoYXJBbmRDb2RlVG8oQ2hhciBjLCBvc3RyZWFtKiBvcykgeworICAvLyBGaXJzdCwgcHJpbnQgYyBhcyBhIGxpdGVyYWwgaW4gdGhlIG1vc3QgcmVhZGFibGUgZm9ybSB3ZSBjYW4gZmluZC4KKyAgKm9zIDw8ICgoc2l6ZW9mKGMpID4gMSkgPyAiTCciIDogIiciKTsKKyAgY29uc3QgQ2hhckZvcm1hdCBmb3JtYXQgPSBQcmludEFzQ2hhckxpdGVyYWxUbzxVbnNpZ25lZENoYXI+KGMsIG9zKTsKKyAgKm9zIDw8ICInIjsKKworICAvLyBUbyBhaWQgdXNlciBkZWJ1Z2dpbmcsIHdlIGFsc28gcHJpbnQgYydzIGNvZGUgaW4gZGVjaW1hbCwgdW5sZXNzCisgIC8vIGl0J3MgMCAoaW4gd2hpY2ggY2FzZSBjIHdhcyBwcmludGVkIGFzICdcXDAnLCBtYWtpbmcgdGhlIGNvZGUKKyAgLy8gb2J2aW91cykuCisgIGlmIChjID09IDApCisgICAgcmV0dXJuOworICAqb3MgPDwgIiAoIiA8PCBTdHJpbmc6OkZvcm1hdCgiJWQiLCBjKS5jX3N0cigpOworCisgIC8vIEZvciBtb3JlIGNvbnZlbmllbmNlLCB3ZSBwcmludCBjJ3MgY29kZSBhZ2FpbiBpbiBoZXhpZGVjaW1hbCwKKyAgLy8gdW5sZXNzIGMgd2FzIGFscmVhZHkgcHJpbnRlZCBpbiB0aGUgZm9ybSAnXHgjIycgb3IgdGhlIGNvZGUgaXMgaW4KKyAgLy8gWzEsIDldLgorICBpZiAoZm9ybWF0ID09IGtIZXhFc2NhcGUgfHwgKDEgPD0gYyAmJiBjIDw9IDkpKSB7CisgICAgLy8gRG8gbm90aGluZy4KKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgU3RyaW5nOjpGb3JtYXQoIiwgMHglWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpLmNfc3RyKCk7CisgIH0KKyAgKm9zIDw8ICIpIjsKK30KKwordm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7Cit9Cit2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbAorLy8gY29kZSBvdGhlcndpc2UgYW5kIGFsc28gYXMgaXRzIGNvZGUuICBMJ1wwJyBpcyBwcmludGVkIGFzICJMJ1xcMCciLgordm9pZCBQcmludFRvKHdjaGFyX3Qgd2MsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhckFuZENvZGVUbzx3Y2hhcl90Pih3Yywgb3MpOworfQorCisvLyBQcmludHMgdGhlIGdpdmVuIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gdGhlIG9zdHJlYW0uICBDaGFyVHlwZSBtdXN0IGJlIGVpdGhlcgorLy8gY2hhciBvciB3Y2hhcl90LgorLy8gVGhlIGFycmF5IHN0YXJ0cyBhdCBiZWdpbiwgdGhlIGxlbmd0aCBpcyBsZW4sIGl0IG1heSBpbmNsdWRlICdcMCcgY2hhcmFjdGVycworLy8gYW5kIG1heSBub3QgYmUgTlVMLXRlcm1pbmF0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CitzdGF0aWMgdm9pZCBQcmludENoYXJzQXNTdHJpbmdUbygKKyAgICBjb25zdCBDaGFyVHlwZSogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGtRdW90ZUJlZ2luID0gc2l6ZW9mKENoYXJUeXBlKSA9PSAxID8gIlwiIiA6ICJMXCIiOworICAqb3MgPDwga1F1b3RlQmVnaW47CisgIGJvb2wgaXNfcHJldmlvdXNfaGV4ID0gZmFsc2U7CisgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBsZW47ICsraW5kZXgpIHsKKyAgICBjb25zdCBDaGFyVHlwZSBjdXIgPSBiZWdpbltpbmRleF07CisgICAgaWYgKGlzX3ByZXZpb3VzX2hleCAmJiBJc1hEaWdpdChjdXIpKSB7CisgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgb2YgJ1x4Li4nIGZvcm0gYW5kIHRoaXMgY2hhcmFjdGVyIGNhbiBiZQorICAgICAgLy8gaW50ZXJwcmV0ZWQgYXMgYW5vdGhlciBoZXhhZGVjaW1hbCBkaWdpdCBpbiBpdHMgbnVtYmVyLiBCcmVhayBzdHJpbmcgdG8KKyAgICAgIC8vIGRpc2FtYmlndWF0ZS4KKyAgICAgICpvcyA8PCAiXCIgIiA8PCBrUXVvdGVCZWdpbjsKKyAgICB9CisgICAgaXNfcHJldmlvdXNfaGV4ID0gUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyhjdXIsIG9zKSA9PSBrSGV4RXNjYXBlOworICB9CisgICpvcyA8PCAiXCIiOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIGNoYXIvd2NoYXJfdCBhcnJheSBvZiAnbGVuJyBlbGVtZW50cywgc3RhcnRpbmcgYXQgYWRkcmVzcworLy8gJ2JlZ2luJy4gIENoYXJUeXBlIG11c3QgYmUgZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3N0YXRpYyB2b2lkIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KAorICAgIGNvbnN0IENoYXJUeXBlKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgLy8gVGhlIGNvZGUKKyAgLy8gICBjb25zdCBjaGFyIGtGb29bXSA9ICJmb28iOworICAvLyBnZW5lcmF0ZXMgYW4gYXJyYXkgb2YgNCwgbm90IDMsIGVsZW1lbnRzLCB3aXRoIHRoZSBsYXN0IG9uZSBiZWluZyAnXDAnLgorICAvLworICAvLyBUaGVyZWZvcmUgd2hlbiBwcmludGluZyBhIGNoYXIgYXJyYXksIHdlIGRvbid0IHByaW50IHRoZSBsYXN0IGVsZW1lbnQgaWYKKyAgLy8gaXQncyAnXDAnLCBzdWNoIHRoYXQgdGhlIG91dHB1dCBtYXRjaGVzIHRoZSBzdHJpbmcgbGl0ZXJhbCBhcyBpdCdzCisgIC8vIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBjb2RlLgorICBpZiAobGVuID4gMCAmJiBiZWdpbltsZW4gLSAxXSA9PSAnXDAnKSB7CisgICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8oYmVnaW4sIGxlbiAtIDEsIG9zKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiwgaG93ZXZlciwgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgbm90ICdcMCcsIGUuZy4KKyAgLy8gICAgY29uc3QgY2hhciBrRm9vW10gPSB7ICdmJywgJ28nLCAnbycgfTsKKyAgLy8gd2UgbXVzdCBwcmludCB0aGUgZW50aXJlIGFycmF5LiAgV2UgYWxzbyBwcmludCBhIG1lc3NhZ2UgdG8gaW5kaWNhdGUKKyAgLy8gdGhhdCB0aGUgYXJyYXkgaXMgbm90IE5VTC10ZXJtaW5hdGVkLgorICBQcmludENoYXJzQXNTdHJpbmdUbyhiZWdpbiwgbGVuLCBvcyk7CisgICpvcyA8PCAiIChubyB0ZXJtaW5hdGluZyBOVUwpIjsKK30KKworLy8gUHJpbnRzIGEgKGNvbnN0KSBjaGFyIGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzICdiZWdpbicuCit2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KGJlZ2luLCBsZW4sIG9zKTsKK30KKworLy8gUHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzCisvLyAnYmVnaW4nLgordm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxQcmludENoYXJBcnJheShiZWdpbiwgbGVuLCBvcyk7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gQyBzdHJpbmcgdG8gdGhlIG9zdHJlYW0uCit2b2lkIFByaW50VG8oY29uc3QgY2hhciogcywgb3N0cmVhbSogb3MpIHsKKyAgaWYgKHMgPT0gTlVMTCkgeworICAgICpvcyA8PCAiTlVMTCI7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8IEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpIDw8ICIgcG9pbnRpbmcgdG8gIjsKKyAgICBQcmludENoYXJzQXNTdHJpbmdUbyhzLCBzdHJsZW4ocyksIG9zKTsKKyAgfQorfQorCisvLyBNU1ZDIGNvbXBpbGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIGRlZmluZSB3aGFyX3QgYXMgYSB0eXBlZGVmCisvLyBvZiB1bnNpZ25lZCBzaG9ydC4gRGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0IHdjaGFyX3QqIGluIHRoYXQgY2FzZQorLy8gd291bGQgY2F1c2UgcG9pbnRlcnMgdG8gdW5zaWduZWQgc2hvcnRzIGJlIHByaW50ZWQgYXMgd2lkZSBzdHJpbmdzLAorLy8gcG9zc2libHkgYWNjZXNzaW5nIG1vcmUgbWVtb3J5IHRoYW4gaW50ZW5kZWQgYW5kIGNhdXNpbmcgaW52YWxpZAorLy8gbWVtb3J5IGFjY2Vzc2VzLiBNU1ZDIGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgc3ltYm9sIHdoZW4KKy8vIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYXMgYSBuYXRpdmUgdHlwZS4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKKy8vIFByaW50cyB0aGUgZ2l2ZW4gd2lkZSBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4KK3ZvaWQgUHJpbnRUbyhjb25zdCB3Y2hhcl90KiBzLCBvc3RyZWFtKiBvcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOworICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMsIHdjc2xlbihzKSwgb3MpOworICB9Cit9CisjZW5kaWYgIC8vIHdjaGFyX3QgaXMgbmF0aXZlCisKKy8vIFByaW50cyBhIDo6c3RyaW5nIG9iamVjdC4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwordm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKwordm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOworfQorCisvLyBQcmludHMgYSA6OndzdHJpbmcgb2JqZWN0LgorI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwordm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORwordm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OnN0ZDo6d3N0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbDsKKworLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlIGJ5IG9taXR0aW5nIHRoZSBzdGFjayB0cmFjZQorLy8gaW4gaXQuCitzdGQ6OnN0cmluZyBUZXN0UGFydFJlc3VsdDo6RXh0cmFjdFN1bW1hcnkoY29uc3QgY2hhciogbWVzc2FnZSkgeworICBjb25zdCBjaGFyKiBjb25zdCBzdGFja190cmFjZSA9IHN0cnN0cihtZXNzYWdlLCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIpOworICByZXR1cm4gc3RhY2tfdHJhY2UgPT0gTlVMTCA/IG1lc3NhZ2UgOgorICAgICAgc3RkOjpzdHJpbmcobWVzc2FnZSwgc3RhY2tfdHJhY2UpOworfQorCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gb3MKKyAgICAgIDw8IHJlc3VsdC5maWxlX25hbWUoKSA8PCAiOiIgPDwgcmVzdWx0LmxpbmVfbnVtYmVyKCkgPDwgIjogIgorICAgICAgPDwgKHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzID8gIlN1Y2Nlc3MiIDoKKyAgICAgICAgICByZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlID8gIkZhdGFsIGZhaWx1cmUiIDoKKyAgICAgICAgICAiTm9uLWZhdGFsIGZhaWx1cmUiKSA8PCAiOlxuIgorICAgICAgPDwgcmVzdWx0Lm1lc3NhZ2UoKSA8PCBzdGQ6OmVuZGw7Cit9CisKKy8vIEFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgYXJyYXkuCit2b2lkIFRlc3RQYXJ0UmVzdWx0QXJyYXk6OkFwcGVuZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIGFycmF5Xy5wdXNoX2JhY2socmVzdWx0KTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KK2NvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UGFydFJlc3VsdEFycmF5OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCkpIHsKKyAgICBwcmludGYoIlxuSW52YWxpZCBpbmRleCAoJWQpIGludG8gVGVzdFBhcnRSZXN1bHRBcnJheS5cbiIsIGluZGV4KTsKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIH0KKworICByZXR1cm4gYXJyYXlfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgoraW50IFRlc3RQYXJ0UmVzdWx0QXJyYXk6OnNpemUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGFycmF5Xy5zaXplKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpCisgICAgOiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfKGZhbHNlKSwKKyAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyhHZXRVbml0VGVzdEltcGwoKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSkgeworICBHZXRVbml0VGVzdEltcGwoKS0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7Cit9CisKK0hhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6fkhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpIHsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgICAgb3JpZ2luYWxfcmVwb3J0ZXJfKTsKK30KKwordm9pZCBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgaWYgKHJlc3VsdC5mYXRhbGx5X2ZhaWxlZCgpKQorICAgIGhhc19uZXdfZmF0YWxfZmFpbHVyZV8gPSB0cnVlOworICBvcmlnaW5hbF9yZXBvcnRlcl8tPlJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFNraXBzIHRvIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhciBpbiBzdHIuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHN0cgorLy8gY29udGFpbnMgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCitzdGF0aWMgY29uc3QgY2hhciogU2tpcFNwYWNlcyhjb25zdCBjaGFyKiBzdHIpIHsKKyAgd2hpbGUgKElzU3BhY2UoKnN0cikpCisgICAgc3RyKys7CisgIHJldHVybiBzdHI7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgorLy8gZGVmaW5lZF90ZXN0X25hbWVzXzsgcmV0dXJucyByZWdpc3RlcmVkX3Rlc3RzIGlmIHN1Y2Nlc3NmdWwsIG9yCisvLyBhYm9ydHMgdGhlIHByb2dyYW0gb3RoZXJ3aXNlLgorY29uc3QgY2hhciogVHlwZWRUZXN0Q2FzZVBTdGF0ZTo6VmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKKyAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogcmVnaXN0ZXJlZF90ZXN0cykgeworICB0eXBlZGVmIDo6c3RkOjpzZXQ8Y29uc3QgY2hhcio+Ojpjb25zdF9pdGVyYXRvciBEZWZpbmVkVGVzdEl0ZXI7CisgIHJlZ2lzdGVyZWRfID0gdHJ1ZTsKKworICAvLyBTa2lwIGluaXRpYWwgd2hpdGVzcGFjZSBpbiByZWdpc3RlcmVkX3Rlc3RzIHNpbmNlIHNvbWUKKyAgLy8gcHJlcHJvY2Vzc29ycyBwcmVmaXggc3RyaW5naXppZWQgbGl0ZXJhbHMgd2l0aCB3aGl0ZXNwYWNlLgorICByZWdpc3RlcmVkX3Rlc3RzID0gU2tpcFNwYWNlcyhyZWdpc3RlcmVkX3Rlc3RzKTsKKworICBNZXNzYWdlIGVycm9yczsKKyAgOjpzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGVzdHM7CisgIGZvciAoY29uc3QgY2hhciogbmFtZXMgPSByZWdpc3RlcmVkX3Rlc3RzOyBuYW1lcyAhPSBOVUxMOworICAgICAgIG5hbWVzID0gU2tpcENvbW1hKG5hbWVzKSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUgPSBHZXRQcmVmaXhVbnRpbENvbW1hKG5hbWVzKTsKKyAgICBpZiAodGVzdHMuY291bnQobmFtZSkgIT0gMCkgeworICAgICAgZXJyb3JzIDw8ICJUZXN0ICIgPDwgbmFtZSA8PCAiIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZS5cbiI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yIChEZWZpbmVkVGVzdEl0ZXIgaXQgPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgaWYgKG5hbWUgPT0gKml0KSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKSB7CisgICAgICB0ZXN0cy5pbnNlcnQobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVycm9ycyA8PCAiTm8gdGVzdCBuYW1lZCAiIDw8IG5hbWUKKyAgICAgICAgICAgICA8PCAiIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHRlc3QgY2FzZS5cbiI7CisgICAgfQorICB9CisKKyAgZm9yIChEZWZpbmVkVGVzdEl0ZXIgaXQgPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmJlZ2luKCk7CisgICAgICAgaXQgIT0gZGVmaW5lZF90ZXN0X25hbWVzXy5lbmQoKTsKKyAgICAgICArK2l0KSB7CisgICAgaWYgKHRlc3RzLmNvdW50KCppdCkgPT0gMCkgeworICAgICAgZXJyb3JzIDw8ICJZb3UgZm9yZ290IHRvIGxpc3QgdGVzdCAiIDw8ICppdCA8PCAiLlxuIjsKKyAgICB9CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JzX3N0ciA9IGVycm9ycy5HZXRTdHJpbmcoKTsKKyAgaWYgKGVycm9yc19zdHIgIT0gIiIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzIiwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksCisgICAgICAgICAgICBlcnJvcnNfc3RyLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9CisKKyAgcmV0dXJuIHJlZ2lzdGVyZWRfdGVzdHM7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQ3OTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaApAQCAtMCwwICsxLDIwMDEyIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIEdvb2dsZSBUZXN0LiAgSXQgc2hvdWxkIGJlCisvLyBpbmNsdWRlZCBieSBhbnkgdGVzdCBwcm9ncmFtIHRoYXQgdXNlcyBHb29nbGUgVGVzdC4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKy8vCisvLyBBY2tub3dsZWRnbWVudDogR29vZ2xlIFRlc3QgYm9ycm93ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIHRlc3QKKy8vIHJlZ2lzdHJhdGlvbiBmcm9tIEJhcnRoZWxlbXkgRGFnZW5haXMnIChiYXJ0aGVsZW15QHByb2xvZ2lxdWUuY29tKQorLy8gZWFzeVVuaXQgZnJhbWV3b3JrLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWQgaW50ZXJuYWxseSBieQorLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KKworLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gTG93LWxldmVsIHR5cGVzIGFuZCB1dGlsaXRpZXMgZm9yIHBvcnRpbmcgR29vZ2xlIFRlc3QgdG8gdmFyaW91cworLy8gcGxhdGZvcm1zLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFCisvLyBUSEVNIElOIFVTRVIgQ09ERS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCisKKy8vIFRoZSB1c2VyIGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgaW4gdGhlIGJ1aWxkIHNjcmlwdCB0bworLy8gY29udHJvbCBHb29nbGUgVGVzdCdzIGJlaGF2aW9yLiAgSWYgdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgYSBtYWNybworLy8gaW4gdGhpcyBsaXN0LCBHb29nbGUgVGVzdCB3aWxsIGRlZmluZSBpdC4KKy8vCisvLyAgIEdURVNUX0hBU19DTE9ORSAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBjbG9uZSgyKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19FWENFUFRJT05TICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBleGNlcHRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjpzdHJpbmcpLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6d3N0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6d3N0cmluZykuCisvLyAgIEdURVNUX0hBU19QT1NJWF9SRSAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBQT1NJWCByZWd1bGFyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZS9hcmVuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUFRIUkVBRCAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgPHB0aHJlYWQuaD4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUlRUSSAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUlRUSSBpcy9pc24ndAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfU1REX1dTVFJJTkcgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIGRvZXMvZG9lc24ndCB3b3JrIChHb29nbGUgVGVzdCBjYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB3aGVyZSBzdGQ6OndzdHJpbmcgaXMgdW5hdmFpbGFibGUpLgorLy8gICBHVEVTVF9IQVNfVFIxX1RVUExFICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRyMTo6dHVwbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfU0VIICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzICJTdHJ1Y3R1cmVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBIYW5kbGluZyIuCisvLyAgIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSBzdXBwb3J0cyBJL08gc3RyZWFtIHJlZGlyZWN0aW9uIHVzaW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cCgpIGFuZCBkdXAyKCkuCisvLyAgIEdURVNUX1VTRV9PV05fVFIxX1RVUExFICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciBHb29nbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuICBVbnVzZWQgd2hlbiB0aGUgdXNlciBzZXRzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19UUjFfVFVQTEUgdG8gMC4KKy8vICAgR1RFU1RfTEFOR19DWFgxMSAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IEdvb2dsZSBUZXN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGJ1aWxkaW5nIGluIEMrKzExL0MrKzk4IG1vZGUuCisvLyAgIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyB0ZXN0cyB0aGF0IHVzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGUgVGVzdCBhcyBhIHNoYXJlZCBsaWJyYXJ5IChrbm93biBhcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETEwgb24gV2luZG93cykuCisvLyAgIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBpdHNlbGYKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBzaGFyZWQgbGlicmFyeS4KKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHV0aWxpdGllczoKKy8vCisvLyBNYWNyb3MgaW5kaWNhdGluZyB0aGUgY3VycmVudCBwbGF0Zm9ybSAoZGVmaW5lZCB0byAxIGlmIGNvbXBpbGVkIG9uCisvLyB0aGUgZ2l2ZW4gcGxhdGZvcm07IG90aGVyd2lzZSB1bmRlZmluZWQpOgorLy8gICBHVEVTVF9PU19BSVggICAgICAtIElCTSBBSVgKKy8vICAgR1RFU1RfT1NfQ1lHV0lOICAgLSBDeWd3aW4KKy8vICAgR1RFU1RfT1NfSFBVWCAgICAgLSBIUC1VWAorLy8gICBHVEVTVF9PU19MSU5VWCAgICAtIExpbnV4CisvLyAgICAgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAtIEdvb2dsZSBBbmRyb2lkCisvLyAgIEdURVNUX09TX01BQyAgICAgIC0gTWFjIE9TIFgKKy8vICAgICBHVEVTVF9PU19JT1MgICAgLSBpT1MKKy8vICAgICAgIEdURVNUX09TX0lPU19TSU1VTEFUT1IgLSBpT1Mgc2ltdWxhdG9yCisvLyAgIEdURVNUX09TX05BQ0wgICAgIC0gR29vZ2xlIE5hdGl2ZSBDbGllbnQgKE5hQ2wpCisvLyAgIEdURVNUX09TX09QRU5CU0QgIC0gT3BlbkJTRAorLy8gICBHVEVTVF9PU19RTlggICAgICAtIFFOWAorLy8gICBHVEVTVF9PU19TT0xBUklTICAtIFN1biBTb2xhcmlzCisvLyAgIEdURVNUX09TX1NZTUJJQU4gIC0gU3ltYmlhbgorLy8gICBHVEVTVF9PU19XSU5ET1dTICAtIFdpbmRvd3MgKERlc2t0b3AsIE1pbkdXLCBvciBNb2JpbGUpCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICAtIFdpbmRvd3MgRGVza3RvcAorLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgICAgLSBNaW5HVworLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAgLSBXaW5kb3dzIE1vYmlsZQorLy8gICBHVEVTVF9PU19aT1MgICAgICAtIHovT1MKKy8vCisvLyBBbW9uZyB0aGUgcGxhdGZvcm1zLCBDeWd3aW4sIExpbnV4LCBNYXggT1MgWCwgYW5kIFdpbmRvd3MgaGF2ZSB0aGUKKy8vIG1vc3Qgc3RhYmxlIHN1cHBvcnQuICBTaW5jZSBjb3JlIG1lbWJlcnMgb2YgdGhlIEdvb2dsZSBUZXN0IHByb2plY3QKKy8vIGRvbid0IGhhdmUgYWNjZXNzIHRvIG90aGVyIHBsYXRmb3Jtcywgc3VwcG9ydCBmb3IgdGhlbSBtYXkgYmUgbGVzcworLy8gc3RhYmxlLiAgSWYgeW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQorLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIChwYXRjaGVzIGZvciBmaXhpbmcgdGhlbSBhcmUKKy8vIGV2ZW4gbW9yZSB3ZWxjb21lISkuCisvLworLy8gTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQgbm9uZSBvZiB0aGUgR1RFU1RfT1NfKiBtYWNyb3MgYXJlIGRlZmluZWQuCisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgYXZhaWxhYmxlIEdvb2dsZSBUZXN0IGZlYXR1cmVzIChkZWZpbmVkIHRvIDEgaWYKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgc3VwcG9ydGVkOyBvdGhlcndpc2UgdW5kZWZpbmVkKToKKy8vICAgR1RFU1RfSEFTX0NPTUJJTkUgICAgICAtIHRoZSBDb21iaW5lKCkgZnVuY3Rpb24gKGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKKy8vICAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgICAtIGRlYXRoIHRlc3RzCisvLyAgIEdURVNUX0hBU19QQVJBTV9URVNUICAgLSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX0hBU19UWVBFRF9URVNUICAgLSB0eXBlZCB0ZXN0cworLy8gICBHVEVTVF9IQVNfVFlQRURfVEVTVF9QIC0gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX1VTRVNfUE9TSVhfUkUgICAgLSBlbmhhbmNlZCBQT1NJWCByZWdleCBpcyB1c2VkLiBEbyBub3QgY29uZnVzZSB3aXRoCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9IQVNfUE9TSVhfUkUgKHNlZSBhYm92ZSkgd2hpY2ggdXNlcnMgY2FuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgdGhlbXNlbHZlcy4KKy8vICAgR1RFU1RfVVNFU19TSU1QTEVfUkUgICAtIG91ciBvd24gc2ltcGxlIHJlZ2V4IGlzIHVzZWQ7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWJvdmUgdHdvIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisvLyAgIEdURVNUX0NBTl9DT01QQVJFX05VTEwgLSBhY2NlcHRzIHVudHlwZWQgTlVMTCBpbiBFWFBFQ1RfRVEoKS4KKy8vCisvLyBNYWNyb3MgZm9yIGJhc2ljIEMrKyBjb2Rpbmc6CisvLyAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIC0gZm9yIGRpc2FibGluZyBhIGdjYyB3YXJuaW5nLgorLy8gICBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyAgLSBkZWNsYXJlcyB0aGF0IGEgY2xhc3MnIGluc3RhbmNlcyBvciBhCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGRvbid0IGhhdmUgdG8gYmUgdXNlZC4KKy8vICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyAgIC0gZGlzYWJsZXMgb3BlcmF0b3I9LgorLy8gICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fIC0gZGlzYWJsZXMgY29weSBjdG9yIGFuZCBvcGVyYXRvcj0uCisvLyAgIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gICAtIGRlY2xhcmVzIHRoYXQgYSBmdW5jdGlvbidzIHJlc3VsdCBtdXN0IGJlIHVzZWQuCisvLworLy8gU3luY2hyb25pemF0aW9uOgorLy8gICBNdXRleCwgTXV0ZXhMb2NrLCBUaHJlYWRMb2NhbCwgR2V0VGhyZWFkQ291bnQoKQorLy8gICAgICAgICAgICAgICAgICAtIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgorLy8gICBHVEVTVF9JU19USFJFQURTQUZFIC0gZGVmaW5lZCB0byAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGFib3ZlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBoYXZlIHJlYWwgaW1wbGVtZW50YXRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgR29vZ2xlIFRlc3QgaXMgdGhyZWFkLXNhZmU7IG9yIDAgb3RoZXJ3aXNlLgorLy8KKy8vIFRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmc6CisvLyAgIGlzX3BvaW50ZXIgICAgIC0gYXMgaW4gVFIxOyBuZWVkZWQgb24gU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIG9ubHkuCisvLyAgIEl0ZXJhdG9yVHJhaXRzIC0gcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0cywgd2hpY2gKKy8vICAgICAgICAgICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIGluIGxpYkNzdGQgd2hlbiBjb21waWxlZCB3aXRoIFN1biBDKysuCisvLworLy8gU21hcnQgcG9pbnRlcnM6CisvLyAgIHNjb3BlZF9wdHIgICAgIC0gYXMgaW4gVFIyLgorLy8KKy8vIFJlZ3VsYXIgZXhwcmVzc2lvbnM6CisvLyAgIFJFICAgICAgICAgICAgIC0gYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGNsYXNzIHVzaW5nIHRoZSBQT1NJWAorLy8gICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXggb24gVU5JWC1saWtlCisvLyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zLCBvciBhIHJlZHVjZWQgcmVndWxhciBleGNlcHRpb24gc3ludGF4IG9uCisvLyAgICAgICAgICAgICAgICAgICAgb3RoZXIgcGxhdGZvcm1zLCBpbmNsdWRpbmcgV2luZG93cy4KKy8vCisvLyBMb2dnaW5nOgorLy8gICBHVEVTVF9MT0dfKCkgICAtIGxvZ3MgbWVzc2FnZXMgYXQgdGhlIHNwZWNpZmllZCBzZXZlcml0eSBsZXZlbC4KKy8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCisvLworLy8gU3Rkb3V0IGFuZCBzdGRlcnIgY2FwdHVyaW5nOgorLy8gICBDYXB0dXJlU3Rkb3V0KCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCisvLyAgIEdldENhcHR1cmVkU3Rkb3V0KCkgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgorLy8gICBDYXB0dXJlU3RkZXJyKCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyKCkgLSBzdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgorLy8KKy8vIEludGVnZXIgdHlwZXM6CisvLyAgIFR5cGVXaXRoU2l6ZSAgIC0gbWFwcyBhbiBpbnRlZ2VyIHRvIGEgaW50IHR5cGUuCisvLyAgIEludDMyLCBVSW50MzIsIEludDY0LCBVSW50NjQsIFRpbWVJbk1pbGxpcworLy8gICAgICAgICAgICAgICAgICAtIGludGVnZXJzIG9mIGtub3duIHNpemVzLgorLy8gICBCaWdnZXN0SW50ICAgICAtIHRoZSBiaWdnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuCisvLworLy8gQ29tbWFuZC1saW5lIHV0aWxpdGllczoKKy8vICAgR1RFU1RfRkxBRygpICAgICAgIC0gcmVmZXJlbmNlcyBhIGZsYWcuCisvLyAgIEdURVNUX0RFQ0xBUkVfKigpICAtIGRlY2xhcmVzIGEgZmxhZy4KKy8vICAgR1RFU1RfREVGSU5FXyooKSAgIC0gZGVmaW5lcyBhIGZsYWcuCisvLyAgIEdldEluamVjdGFibGVBcmd2cygpIC0gcmV0dXJucyB0aGUgY29tbWFuZCBsaW5lIGFzIGEgdmVjdG9yIG9mIHN0cmluZ3MuCisvLworLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXRpbGl0aWVzOgorLy8gICBHZXRFbnYoKSAgICAgICAgICAgICAtIGdldHMgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBCb29sRnJvbUdUZXN0RW52KCkgICAtIHBhcnNlcyBhIGJvb2wgZW52aXJvbm1lbnQgdmFyaWFibGUuCisvLyAgIEludDMyRnJvbUdUZXN0RW52KCkgIC0gcGFyc2VzIGFuIEludDMyIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBTdHJpbmdGcm9tR1Rlc3RFbnYoKSAtIHBhcnNlcyBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworI2luY2x1ZGUgPGN0eXBlLmg+ICAgLy8gZm9yIGlzc3BhY2UsIGV0YworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHB0cmRpZmZfdAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisKKyNpZiBkZWZpbmVkIF9fQVBQTEVfXworIyBpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KKyMgaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGlvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN0cmluZz4gIC8vIE5PTElOVAorCisjZGVmaW5lIEdURVNUX0RFVl9FTUFJTF8gImdvb2dsZXRlc3RmcmFtZXdvcmtAQGdvb2dsZWdyb3Vwcy5jb20iCisjZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYXyAiZ3Rlc3RfIgorI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXyAiZ3Rlc3QtIgorI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIkdURVNUXyIKKyNkZWZpbmUgR1RFU1RfTkFNRV8gIkdvb2dsZSBUZXN0IgorI2RlZmluZSBHVEVTVF9QUk9KRUNUX1VSTF8gImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LyIKKworLy8gRGV0ZXJtaW5lcyB0aGUgdmVyc2lvbiBvZiBnY2MgdGhhdCBpcyB1c2VkIHRvIGNvbXBpbGUgdGhpcy4KKyNpZmRlZiBfX0dOVUNfXworLy8gNDAzMDIgbWVhbnMgdmVyc2lvbiA0LjMuMi4KKyMgZGVmaW5lIEdURVNUX0dDQ19WRVJfIFwKKyAgICAoX19HTlVDX18qMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyoxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQorI2VuZGlmICAvLyBfX0dOVUNfXworCisvLyBEZXRlcm1pbmVzIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCBHb29nbGUgVGVzdCBpcyBjb21waWxlZC4KKyNpZmRlZiBfX0NZR1dJTl9fCisjIGRlZmluZSBHVEVTVF9PU19DWUdXSU4gMQorI2VsaWYgZGVmaW5lZCBfX1NZTUJJQU4zMl9fCisjIGRlZmluZSBHVEVTVF9PU19TWU1CSUFOIDEKKyNlbGlmIGRlZmluZWQgX1dJTjMyCisjIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTIDEKKyMgaWZkZWYgX1dJTjMyX1dDRQorIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIDEKKyMgZWxpZiBkZWZpbmVkKF9fTUlOR1dfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX01JTkdXIDEKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAxCisjIGVuZGlmICAvLyBfV0lOMzJfV0NFCisjZWxpZiBkZWZpbmVkIF9fQVBQTEVfXworIyBkZWZpbmUgR1RFU1RfT1NfTUFDIDEKKyMgaWYgVEFSR0VUX09TX0lQSE9ORQorIyAgZGVmaW5lIEdURVNUX09TX0lPUyAxCisjICBpZiBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUgorIyAgIGRlZmluZSBHVEVTVF9PU19JT1NfU0lNVUxBVE9SIDEKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fbGludXhfXworIyBkZWZpbmUgR1RFU1RfT1NfTElOVVggMQorIyBpZiBkZWZpbmVkIF9fQU5EUk9JRF9fCisjICBkZWZpbmUgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAxCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fTVZTX18KKyMgZGVmaW5lIEdURVNUX09TX1pPUyAxCisjZWxpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkKKyMgZGVmaW5lIEdURVNUX09TX1NPTEFSSVMgMQorI2VsaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgR1RFU1RfT1NfQUlYIDEKKyNlbGlmIGRlZmluZWQoX19ocHV4KQorIyBkZWZpbmUgR1RFU1RfT1NfSFBVWCAxCisjZWxpZiBkZWZpbmVkIF9fbmF0aXZlX2NsaWVudF9fCisjIGRlZmluZSBHVEVTVF9PU19OQUNMIDEKKyNlbGlmIGRlZmluZWQgX19PcGVuQlNEX18KKyMgZGVmaW5lIEdURVNUX09TX09QRU5CU0QgMQorI2VsaWYgZGVmaW5lZCBfX1FOWF9fCisjIGRlZmluZSBHVEVTVF9PU19RTlggMQorI2VuZGlmICAvLyBfX0NZR1dJTl9fCisKKyNpZm5kZWYgR1RFU1RfTEFOR19DWFgxMQorLy8gZ2NjIGFuZCBjbGFuZyBkZWZpbmUgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gd2hlbgorLy8gLXN0ZD17YyxnbnV9Kyt7MHgsMTF9IGlzIHBhc3NlZC4gIFRoZSBDKysxMSBzdGFuZGFyZCBzcGVjaWZpZXMgYQorLy8gdmFsdWUgZm9yIF9fY3BsdXNwbHVzLCBhbmQgcmVjZW50IHZlcnNpb25zIG9mIGNsYW5nLCBnY2MsIGFuZAorLy8gcHJvYmFibHkgb3RoZXIgY29tcGlsZXJzIHNldCB0aGF0IHRvbyBpbiBDKysxMSBtb2RlLgorIyBpZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBDb21waWxpbmcgaW4gYXQgbGVhc3QgQysrMTEgbW9kZS4KKyMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDEKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0xBTkdfQ1hYMTEgMAorIyBlbmRpZgorI2VuZGlmCisKKy8vIEJyaW5ncyBpbiBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeAorLy8gbmFtZXNwYWNlIChyZWFkLCB3cml0ZSwgY2xvc2UsIGNoZGlyLCBpc2F0dHksIHN0YXQpLiBXZSBkbyBub3QgY3VycmVudGx5CisvLyB1c2UgdGhlbSBvbiBXaW5kb3dzIE1vYmlsZS4KKyNpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gVGhpcyBhc3N1bWVzIHRoYXQgbm9uLVdpbmRvd3MgT1NlcyBwcm92aWRlIHVuaXN0ZC5oLiBGb3IgT1NlcyB3aGVyZSB0aGlzCisvLyBpcyBub3QgdGhlIGNhc2UsIHdlIG5lZWQgdG8gaW5jbHVkZSBoZWFkZXJzIHRoYXQgcHJvdmlkZSB0aGUgZnVuY3Rpb25zCisvLyBtZW50aW9uZWQgYWJvdmUuCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2lmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKy8vIFVzZWQgdG8gZGVmaW5lIF9fQU5EUk9JRF9BUElfXyBtYXRjaGluZyB0aGUgdGFyZ2V0IE5ESyBBUEkgbGV2ZWwuCisjICBpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gRGVmaW5lcyB0aGlzIHRvIHRydWUgaWZmIEdvb2dsZSBUZXN0IGNhbiB1c2UgUE9TSVggcmVndWxhciBleHByZXNzaW9ucy4KKyNpZm5kZWYgR1RFU1RfSEFTX1BPU0lYX1JFCisjIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKy8vIE9uIEFuZHJvaWQsIDxyZWdleC5oPiBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyB3aXRoIEdpbmdlcmJyZWFkLgorIyAgZGVmaW5lIEdURVNUX0hBU19QT1NJWF9SRSAoX19BTkRST0lEX0FQSV9fID49IDkpCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9IQVNfUE9TSVhfUkUgKCFHVEVTVF9PU19XSU5ET1dTKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfUE9TSVhfUkUKKworLy8gT24gc29tZSBwbGF0Zm9ybXMsIDxyZWdleC5oPiBuZWVkcyBzb21lb25lIHRvIGRlZmluZSBzaXplX3QsIGFuZAorLy8gd29uJ3QgY29tcGlsZSBvdGhlcndpc2UuICBXZSBjYW4gI2luY2x1ZGUgaXQgaGVyZSBhcyB3ZSBhbHJlYWR5CisvLyBpbmNsdWRlZCA8c3RkbGliLmg+LCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGRlZmluZSBzaXplX3QgdGhyb3VnaAorLy8gPHN0ZGRlZi5oPi4KKyMgaW5jbHVkZSA8cmVnZXguaD4gIC8vIE5PTElOVAorCisjIGRlZmluZSBHVEVTVF9VU0VTX1BPU0lYX1JFIDEKKworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyA8cmVnZXguaD4gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLiAgVXNlIG91ciBvd24gc2ltcGxlIHJlZ2V4CisvLyBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgorIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQorCisjZWxzZQorCisvLyA8cmVnZXguaD4gbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4gIFVzZSBvdXIgb3duCisvLyBzaW1wbGUgcmVnZXggaW1wbGVtZW50YXRpb24gaW5zdGVhZC4KKyMgZGVmaW5lIEdURVNUX1VTRVNfU0lNUExFX1JFIDEKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUE9TSVhfUkUKKworI2lmbmRlZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBzbyB3ZSBuZWVkCisvLyB0byBmaWd1cmUgaXQgb3V0LgorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIE1TVkMncyBhbmQgQysrQnVpbGRlcidzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU1RMIHVzZSB0aGUgX0hBU19FWENFUFRJT05TCisvLyBtYWNybyB0byBlbmFibGUgZXhjZXB0aW9ucywgc28gd2UnbGwgZG8gdGhlIHNhbWUuCisvLyBBc3N1bWVzIHRoYXQgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorIyAgaWZuZGVmIF9IQVNfRVhDRVBUSU9OUworIyAgIGRlZmluZSBfSEFTX0VYQ0VQVElPTlMgMQorIyAgZW5kaWYgIC8vIF9IQVNfRVhDRVBUSU9OUworIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIF9IQVNfRVhDRVBUSU9OUworIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fRVhDRVBUSU9OUworLy8gZ2NjIGRlZmluZXMgX19FWENFUFRJT05TIHRvIDEgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBTdW4gUHJvIENDIHN1cHBvcnRzIGV4Y2VwdGlvbnMuICBIb3dldmVyLCB0aGVyZSBpcyBubyBjb21waWxlLXRpbWUgd2F5IG9mCisvLyBkZXRlY3Rpbmcgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG9yIG5vdC4gIFRoZXJlZm9yZSwgd2UgYXNzdW1lIHRoYXQKKy8vIHRoZXkgYXJlIGVuYWJsZWQgdW5sZXNzIHRoZSB1c2VyIHRlbGxzIHVzIG90aGVyd2lzZS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiBfX0VYQ0VQVElPTlMKKy8vIHhsQyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorLy8gRXhjZXB0aW9uIGhhbmRsaW5nIGlzIGluIGVmZmVjdCBieSBkZWZhdWx0IGluIEhQIGFDQyBjb21waWxlci4gSXQgaGFzIHRvCisvLyBiZSB0dXJuZWQgb2YgYnkgK25vZWggY29tcGlsZXIgb3B0aW9uIGlmIGRlc2lyZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbHNlCisvLyBGb3Igb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgdG8gYmUKKy8vIGNvbnNlcnZhdGl2ZS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAwCisjIGVuZGlmICAvLyBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworI2lmICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQorLy8gRXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgbWFjcm8gYW55IGxvbmdlciwgd2Uga2VlcCBpdCBpbiBjYXNlCisvLyBzb21lIGNsaWVudHMgc3RpbGwgZGVwZW5kIG9uIGl0LgorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9TVFJJTkcgMQorI2VsaWYgIUdURVNUX0hBU19TVERfU1RSSU5HCisvLyBUaGUgdXNlciB0b2xkIHVzIHRoYXQgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuCisjIGVycm9yICJHb29nbGUgVGVzdCBjYW5ub3QgYmUgdXNlZCB3aGVyZSA6OnN0ZDo6c3RyaW5nIGlzbid0IGF2YWlsYWJsZS4iCisjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQorCisjaWZuZGVmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKworIyBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyNpZm5kZWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiB1c2VzIGF1dG9jb25mIHRvIGRldGVjdCB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nCisvLyAgIGlzIGF2YWlsYWJsZS4KKworLy8gQ3lnd2luIDEuNyBhbmQgYmVsb3cgZG9lc24ndCBzdXBwb3J0IDo6c3RkOjp3c3RyaW5nLgorLy8gU29sYXJpcycgbGliYysrIGRvZXNuJ3Qgc3VwcG9ydCBpdCBlaXRoZXIuICBBbmRyb2lkIGhhcworLy8gbm8gc3VwcG9ydCBmb3IgaXQgYXQgbGVhc3QgYXMgcmVjZW50IGFzIEZyb3lvICgyLjIpLgorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9XU1RSSU5HIFwKKyAgICAoIShHVEVTVF9PU19MSU5VWF9BTkRST0lEIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTKSkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKyMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyBcCisgICAgKEdURVNUX0hBU19TVERfV1NUUklORyAmJiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORykKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIERldGVybWluZXMgd2hldGhlciBSVFRJIGlzIGF2YWlsYWJsZS4KKyNpZm5kZWYgR1RFU1RfSEFTX1JUVEkKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLCBzbyB3ZSBuZWVkIHRvCisvLyBmaWd1cmUgaXQgb3V0LgorCisjIGlmZGVmIF9NU0NfVkVSCisKKyMgIGlmZGVmIF9DUFBSVFRJICAvLyBNU1ZDIGRlZmluZXMgdGhpcyBtYWNybyBpZmYgUlRUSSBpcyBlbmFibGVkLgorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCisjICBlbHNlCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKKyMgIGVuZGlmCisKKy8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA0LjMuMiwgZ2NjIGRlZmluZXMgX19HWFhfUlRUSSBpZmYgUlRUSSBpcyBlbmFibGVkLgorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDMwMikKKworIyAgaWZkZWYgX19HWFhfUlRUSQorLy8gV2hlbiBidWlsZGluZyBhZ2FpbnN0IFNUTHBvcnQgd2l0aCB0aGUgQW5kcm9pZCBOREsgYW5kIHdpdGgKKy8vIC1mcnR0aSAtZm5vLWV4Y2VwdGlvbnMsIHRoZSBidWlsZCBmYWlscyBhdCBsaW5rIHRpbWUgd2l0aCB1bmRlZmluZWQKKy8vIHJlZmVyZW5jZXMgdG8gX19jeGFfYmFkX3R5cGVpZC4gTm90ZSBzdXJlIGlmIFNUTCBvciB0b29sY2hhaW4gYnVnLAorLy8gc28gZGlzYWJsZSBSVFRJIHdoZW4gZGV0ZWN0ZWQuCisjICAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBkZWZpbmVkKF9TVExQT1JUX01BSk9SKSAmJiBcCisgICAgICAgIWRlZmluZWQoX19FWENFUFRJT05TKQorIyAgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgIGVsc2UKKyMgICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBfX1NUTFBPUlRfTUFKT1IgJiYgIV9fRVhDRVBUSU9OUworIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjICBlbmRpZiAgLy8gX19HWFhfUlRUSQorCisvLyBDbGFuZyBkZWZpbmVzIF9fR1hYX1JUVEkgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuMCwgYnV0IGl0cyBtYW51YWwgcmVjb21tZW5kcworLy8gdXNpbmcgaGFzX2ZlYXR1cmUgaW5zdGVhZC4gaGFzX2ZlYXR1cmUoY3h4X3J0dGkpIGlzIHN1cHBvcnRlZCBzaW5jZSAyLjcsIHRoZQorLy8gZmlyc3QgdmVyc2lvbiB3aXRoIEMrKyBzdXBwb3J0LgorIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorCisjICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgX19oYXNfZmVhdHVyZShjeHhfcnR0aSkKKworLy8gU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDkuMCBJQk0gVmlzdWFsIEFnZSBkZWZpbmVzIF9fUlRUSV9BTExfXyB0byAxIGlmCisvLyBib3RoIHRoZSB0eXBlaWQgYW5kIGR5bmFtaWNfY2FzdCBmZWF0dXJlcyBhcmUgcHJlc2VudC4KKyMgZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDkwMCkKKworIyAgaWZkZWYgX19SVFRJX0FMTF9fCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgZW5kaWYKKworIyBlbHNlCisKKy8vIEZvciBhbGwgb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgUlRUSSBpcyBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKworIyBlbmRpZiAgLy8gX01TQ19WRVIKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQorCisvLyBJdCdzIHRoaXMgaGVhZGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgPHR5cGVpbmZvPiB3aGVuIFJUVEkKKy8vIGlzIGVuYWJsZWQuCisjaWYgR1RFU1RfSEFTX1JUVEkKKyMgaW5jbHVkZSA8dHlwZWluZm8+CisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuCisjaWZuZGVmIEdURVNUX0hBU19QVEhSRUFECisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBleHBsaWNpdGx5LCBzbyB3ZSBhc3N1bWUgcHRocmVhZHMgc3VwcG9ydCBpcworLy8gYXZhaWxhYmxlIG9uIExpbnV4IGFuZCBNYWMuCisvLworLy8gVG8gZGlzYWJsZSB0aHJlYWRpbmcgc3VwcG9ydCBpbiBHb29nbGUgVGVzdCwgYWRkIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAorLy8gdG8geW91ciBjb21waWxlciBmbGFncy4KKyMgZGVmaW5lIEdURVNUX0hBU19QVEhSRUFEIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfSFBVWCBcCisgICAgfHwgR1RFU1RfT1NfUU5YKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUFRIUkVBRAorCisjaWZkZWYgR1RFU1RfT1NfV0lORE9XU19NSU5HVworLy8gRGlzYWJsZSBwdGhyZWFkIHN1cHBvcnQgZm9yIE1pbkdXIGZvciBub3cuIFRvIGVuYWJsZSBpdCwgd2UgbmVlZCB0bzoKKy8vIDEpIEltcGxlbWVudCBUaHJlYWRMb2NhbCBvYmplY3QgdW5kZXIgTWluR1cuIFRoZSBpbnRlcm5hbCBwdGhyZWFkIGNhbGxzIGFyZQorLy8gICAgbm90IGF2YWlsYWJsZSBvbiBNaW5HVy4KKy8vIDIpIFJlcGxhY2UgdGhlIG5hbm9zbGVlcCgpIHdpdGggdXNsZWVwKCkgZm9yIE1pbkdXLgorI3VuZGVmIEdURVNUX0hBU19QVEhSRUFECisjZGVmaW5lIEdURVNUX0hBU19QVEhSRUFEIDAKKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1BUSFJFQUQKKy8vIGd0ZXN0LXBvcnQuaCBndWFyYW50ZWVzIHRvICNpbmNsdWRlIDxwdGhyZWFkLmg+IHdoZW4gR1RFU1RfSEFTX1BUSFJFQUQgaXMKKy8vIHRydWUuCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4gIC8vIE5PTElOVAorCisvLyBGb3IgdGltZXNwZWMgYW5kIG5hbm9zbGVlcCwgdXNlZCBiZWxvdy4KKyMgaW5jbHVkZSA8dGltZS5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdHIxL3R1cGxlLiAgWW91IGNhbiBkZWZpbmUKKy8vIHRoaXMgbWFjcm8gdG8gMCB0byBwcmV2ZW50IEdvb2dsZSBUZXN0IGZyb20gdXNpbmcgdHVwbGUgKGFueQorLy8gZmVhdHVyZSBkZXBlbmRpbmcgb24gdHVwbGUgd2l0aCBiZSBkaXNhYmxlZCBpbiB0aGlzIG1vZGUpLgorI2lmbmRlZiBHVEVTVF9IQVNfVFIxX1RVUExFCisjIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgZGVmaW5lZChfU1RMUE9SVF9NQUpPUikKKy8vIFNUTHBvcnQsIHByb3ZpZGVkIHdpdGggdGhlIEFuZHJvaWQgTkRLLCBoYXMgbmVpdGhlciA8dHIxL3R1cGxlPiBvciA8dHVwbGU+LgorIyAgZGVmaW5lIEdURVNUX0hBU19UUjFfVFVQTEUgMAorIyBlbHNlCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBub3QgdG8gZG8gaXQsIHNvIHdlIGFzc3VtZSBpdCdzIE9LLgorIyAgZGVmaW5lIEdURVNUX0hBU19UUjFfVFVQTEUgMQorIyBlbmRpZgorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24KKy8vIHNob3VsZCBiZSB1c2VkLgorI2lmbmRlZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworLy8gV2UgdXNlIG91ciBvd24gVFIxIHR1cGxlIGlmIHdlIGFyZW4ndCBzdXJlIHRoZSB1c2VyIGhhcyBhbgorLy8gaW1wbGVtZW50YXRpb24gb2YgaXQgYWxyZWFkeS4gIEF0IHRoaXMgdGltZSwgbGlic3RkYysrIDQuMC4wKyBhbmQKKy8vIE1TVkMgMjAxMCBhcmUgdGhlIG9ubHkgbWFpbnN0cmVhbSBzdGFuZGFyZCBsaWJyYXJpZXMgdGhhdCBjb21lCisvLyB3aXRoIGEgVFIxIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgTlZJRElBJ3MgQ1VEQSBOVkNDIGNvbXBpbGVyCisvLyBwcmV0ZW5kcyB0byBiZSBHQ0MgYnkgZGVmaW5pbmcgX19HTlVDX18gYW5kIGZyaWVuZHMsIGJ1dCBjYW5ub3QKKy8vIGNvbXBpbGUgR0NDJ3MgdHVwbGUgaW1wbGVtZW50YXRpb24uICBNU1ZDIDIwMDggKDkuMCkgcHJvdmlkZXMgVFIxCisvLyB0dXBsZSBpbiBhIDMyMyBNQiBGZWF0dXJlIFBhY2sgZG93bmxvYWQsIHdoaWNoIHdlIGNhbm5vdCBhc3N1bWUgdGhlCisvLyB1c2VyIGhhcy4gIFFOWCdzIFFDQyBjb21waWxlciBpcyBhIG1vZGlmaWVkIEdDQyBidXQgaXQgZG9lc24ndAorLy8gc3VwcG9ydCBUUjEgdHVwbGUuICBsaWJjKysgb25seSBwcm92aWRlcyBzdGQ6OnR1cGxlLCBpbiBDKysxMSBtb2RlLAorLy8gYW5kIGl0IGNhbiBiZSB1c2VkIHdpdGggc29tZSBjb21waWxlcnMgdGhhdCBkZWZpbmUgX19HTlVDX18uCisjIGlmIChkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0NVREFDQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApIFwKKyAgICAgICYmICFHVEVTVF9PU19RTlggJiYgIWRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKSkgfHwgX01TQ19WRVIgPj0gMTYwMAorIyAgZGVmaW5lIEdURVNUX0VOVl9IQVNfVFIxX1RVUExFXyAxCisjIGVuZGlmCisKKy8vIEMrKzExIHNwZWNpZmllcyB0aGF0IDx0dXBsZT4gcHJvdmlkZXMgc3RkOjp0dXBsZS4gVXNlIHRoYXQgaWYgZ3Rlc3QgaXMgdXNlZAorLy8gaW4gQysrMTEgbW9kZSBhbmQgbGlic3RkYysrIGlzbid0IHZlcnkgb2xkIChiaW5hcmllcyB0YXJnZXRpbmcgT1MgWCAxMC42CisvLyBjYW4gYnVpbGQgd2l0aCBjbGFuZyBidXQgbmVlZCB0byB1c2UgZ2NjNC4yJ3MgbGlic3RkYysrKS4KKyMgaWYgR1RFU1RfTEFOR19DWFgxMSAmJiAoIWRlZmluZWQoX19HTElCQ1hYX18pIHx8IF9fR0xJQkNYWF9fID4gMjAxMTAzMjUpCisjICBkZWZpbmUgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfIDEKKyMgZW5kaWYKKworIyBpZiBHVEVTVF9FTlZfSEFTX1RSMV9UVVBMRV8gfHwgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfCisjICBkZWZpbmUgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgMAorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgMQorIyBlbmRpZgorCisjZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisKKy8vIFRvIGF2b2lkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGV2ZXJ5d2hlcmUsIHdlIG1ha2UgaXQKKy8vIGd0ZXN0LXBvcnQuaCdzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIHRoZSBoZWFkZXIgaW1wbGVtZW50aW5nCisvLyB0cjEvdHVwbGUuCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorCisjIGlmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHVwbGUuaC5wdW1wCisvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCisKKy8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCisvLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKKy8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCisvLyBwcml2YXRlIGFzIHB1YmxpYy4KKy8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAorICAgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPiBmcmllbmQgY2xhc3MgdHVwbGU7IFwKKyAgIHByaXZhdGU6CisjZW5kaWYKKworLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KKyNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgorI2RlZmluZSBHVEVTVF8xX1RVUExFXyhUKSB0dXBsZTxUIyMwLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfMl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzNfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF80X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfNV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzZfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF83X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfOF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzlfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICBUIyM3LCBUIyM4LCB2b2lkPgorI2RlZmluZSBHVEVTVF8xMF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIFQjIzgsIFQjIzk+CisKKy8vIEdURVNUX25fVFlQRU5BTUVTXyhUKSBkZWNsYXJlcyBhIGxpc3Qgb2YgbiB0eXBlbmFtZXMuCisjZGVmaW5lIEdURVNUXzBfVFlQRU5BTUVTXyhUKQorI2RlZmluZSBHVEVTVF8xX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMAorI2RlZmluZSBHVEVTVF8yX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMQorI2RlZmluZSBHVEVTVF8zX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMgorI2RlZmluZSBHVEVTVF80X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMKKyNkZWZpbmUgR1RFU1RfNV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0CisjZGVmaW5lIEdURVNUXzZfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNQorI2RlZmluZSBHVEVTVF83X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYKKyNkZWZpbmUgR1RFU1RfOF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCB0eXBlbmFtZSBUIyM3CisjZGVmaW5lIEdURVNUXzlfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAorICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgKKyNkZWZpbmUgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAorICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgsIHR5cGVuYW1lIFQjIzkKKworLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAorLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCisvLyBsaWJyYXJ5IHZlbmRvci4KK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIHRyMSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMCA9IHZvaWQsIHR5cGVuYW1lIFQxID0gdm9pZCwgdHlwZW5hbWUgVDIgPSB2b2lkLAorICAgIHR5cGVuYW1lIFQzID0gdm9pZCwgdHlwZW5hbWUgVDQgPSB2b2lkLCB0eXBlbmFtZSBUNSA9IHZvaWQsCisgICAgdHlwZW5hbWUgVDYgPSB2b2lkLCB0eXBlbmFtZSBUNyA9IHZvaWQsIHR5cGVuYW1lIFQ4ID0gdm9pZCwKKyAgICB0eXBlbmFtZSBUOSA9IHZvaWQ+CitjbGFzcyB0dXBsZTsKKworLy8gQW55dGhpbmcgaW4gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIGlzIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKKy8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCisvLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQnlSZWYgeyB0eXBlZGVmIGNvbnN0IFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLgorI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQorCisvLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMKKy8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4KKyNkZWZpbmUgR1RFU1RfQUREX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkFkZFJlZjxUPjo6dHlwZQorCisvLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLgordGVtcGxhdGUgPGludCBrPiBjbGFzcyBHZXQ7CisKKy8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUKKy8vIGlmZiBrIDwgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUgdHlwZSBULgordGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPgorc3RydWN0IFR1cGxlRWxlbWVudDsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDAsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMCB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDEsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMSB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDIsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMiB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDMsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUMyB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDQsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNCB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDUsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNSB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDYsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNiB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDcsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUNyB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDgsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUOCB0eXBlOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDksIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgdHlwZWRlZiBUOSB0eXBlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDw+CitjbGFzcyB0dXBsZTw+IHsKKyBwdWJsaWM6CisgIHR1cGxlKCkge30KKyAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzFfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjApIDogZjBfKGYwKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzJfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSkgOiBmMF8oZjApLAorICAgICAgZjFfKGYxKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+CisgIHR1cGxlKGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIDogZjBfKHAuZmlyc3QpLCBmMV8ocC5zZWNvbmQpIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgeworICAgIGYwXyA9IHAuZmlyc3Q7CisgICAgZjFfID0gcC5zZWNvbmQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfM19UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMikge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNF9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMykge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLAorICAgICAgR1RFU1RfQllfUkVGXyhUNCkgZjQpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF82X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCisgICAgICBmNV8oZjUpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfN19UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCisgICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF84X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LAorICAgICAgR1RFU1RfQllfUkVGXyhUNykgZjcpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNykge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfOV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAorICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgZjhfID0gdC5mOF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187CisgIFQ4IGY4XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgdHVwbGUgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSwKKyAgICAgIGY5XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwgR1RFU1RfQllfUkVGXyhUNykgZjcsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ4KSBmOCwgR1RFU1RfQllfUkVGXyhUOSkgZjkpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCksIGY5XyhmOSkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwgZjlfKHQuZjlfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksCisgICAgICBmOV8odC5mOV8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIGY3XyA9IHQuZjdfOworICAgIGY4XyA9IHQuZjhfOworICAgIGY5XyA9IHQuZjlfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKKyAgVDcgZjdfOworICBUOCBmOF87CisgIFQ5IGY5XzsKK307CisKKy8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLgorCisvLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuCisvLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0CisvLyBpbXBsZW1lbnQgdGllKCkuCisKK2lubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0KKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8xX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCkgeworICByZXR1cm4gR1RFU1RfMV9UVVBMRV8oVCkoZjApOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzJfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEpIHsKKyAgcmV0dXJuIEdURVNUXzJfVFVQTEVfKFQpKGYwLCBmMSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfM19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyKSB7CisgIHJldHVybiBHVEVTVF8zX1RVUExFXyhUKShmMCwgZjEsIGYyKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF80X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzKSB7CisgIHJldHVybiBHVEVTVF80X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMyk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfNV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0KSB7CisgIHJldHVybiBHVEVTVF81X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzZfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1KSB7CisgIHJldHVybiBHVEVTVF82X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF83X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2KSB7CisgIHJldHVybiBHVEVTVF83X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNik7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfOF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3KSB7CisgIHJldHVybiBHVEVTVF84X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzlfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKKyAgICBjb25zdCBUOCYgZjgpIHsKKyAgcmV0dXJuIEdURVNUXzlfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8xMF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LAorICAgIGNvbnN0IFQ4JiBmOCwgY29uc3QgVDkmIGY5KSB7CisgIHJldHVybiBHVEVTVF8xMF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCwgZjkpOworfQorCisvLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IHN0cnVjdCB0dXBsZV9zaXplOworCit0ZW1wbGF0ZSA8R1RFU1RfMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMF9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOworfTsKKwordGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzFfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8yX1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDI7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfM19UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAzOworfTsKKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzRfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF81X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNl9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA2OworfTsKKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzdfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF84X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDg7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOV9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA5OworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxMDsKK307CisKK3RlbXBsYXRlIDxpbnQgaywgY2xhc3MgVHVwbGU+CitzdHJ1Y3QgdHVwbGVfZWxlbWVudCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwKKyAgICAgIGsgPCAodHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwgaywgVHVwbGU+Ojp0eXBlIHR5cGU7Cit9OworCisjZGVmaW5lIEdURVNUX1RVUExFX0VMRU1FTlRfKGssIFR1cGxlKSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PGssIFR1cGxlID46OnR5cGUKKworLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4KKworbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwwPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjBfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDE+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMV87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Mj4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYyXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwzPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjNfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDQ+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNF87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8NT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY1XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw2PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjZfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDc+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mN187IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8OD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY4XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw5PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjlfOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfMTBfVFVQTEVfKFQpKSkKK2dldChHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOworfQorCit0ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8xMF9UVVBMRV8oVCkpKQorZ2V0KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKK30KKworLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycworCisvLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCisKK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKy8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKKy8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCisvLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKKy8vIGsxICE9IGsyLgordGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4geworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+CisgIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGludCBrPgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgorICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7CisgICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKKyAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKSwgR1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHUpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwKKyAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpID46OnZhbHVlLAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVSkgPjo6dmFsdWU+OjpFcSh0LCB1KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KKworLy8gNi4xLjQgUGFpcnMuCisvLyBVbmltcGxlbWVudGVkLgorCit9ICAvLyBuYW1lc3BhY2UgdHIxCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBHVEVTVF8wX1RVUExFXworI3VuZGVmIEdURVNUXzFfVFVQTEVfCisjdW5kZWYgR1RFU1RfMl9UVVBMRV8KKyN1bmRlZiBHVEVTVF8zX1RVUExFXworI3VuZGVmIEdURVNUXzRfVFVQTEVfCisjdW5kZWYgR1RFU1RfNV9UVVBMRV8KKyN1bmRlZiBHVEVTVF82X1RVUExFXworI3VuZGVmIEdURVNUXzdfVFVQTEVfCisjdW5kZWYgR1RFU1RfOF9UVVBMRV8KKyN1bmRlZiBHVEVTVF85X1RVUExFXworI3VuZGVmIEdURVNUXzEwX1RVUExFXworCisjdW5kZWYgR1RFU1RfMF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMl9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfM19UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfNl9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfN19UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfOF9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfOV9UWVBFTkFNRVNfCisjdW5kZWYgR1RFU1RfMTBfVFlQRU5BTUVTXworCisjdW5kZWYgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisjdW5kZWYgR1RFU1RfQllfUkVGXworI3VuZGVmIEdURVNUX0FERF9SRUZfCisjdW5kZWYgR1RFU1RfVFVQTEVfRUxFTUVOVF8KKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisjIGVsaWYgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfCisjICBpbmNsdWRlIDx0dXBsZT4KKy8vIEMrKzExIHB1dHMgaXRzIHR1cGxlIGludG8gdGhlIDo6c3RkIG5hbWVzcGFjZSByYXRoZXIgdGhhbgorLy8gOjpzdGQ6OnRyMS4gIGd0ZXN0IGV4cGVjdHMgdHVwbGUgdG8gbGl2ZSBpbiA6OnN0ZDo6dHIxLCBzbyBwdXQgaXQgdGhlcmUuCisvLyBUaGlzIGNhdXNlcyB1bmRlZmluZWQgYmVoYXZpb3IsIGJ1dCBzdXBwb3J0ZWQgY29tcGlsZXJzIHJlYWN0IGluCisvLyB0aGUgd2F5IHdlIGludGVuZC4KK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIHRyMSB7Cit1c2luZyA6OnN0ZDo6Z2V0OwordXNpbmcgOjpzdGQ6Om1ha2VfdHVwbGU7Cit1c2luZyA6OnN0ZDo6dHVwbGU7Cit1c2luZyA6OnN0ZDo6dHVwbGVfZWxlbWVudDsKK3VzaW5nIDo6c3RkOjp0dXBsZV9zaXplOworfQorfQorCisjIGVsaWYgR1RFU1RfT1NfU1lNQklBTgorCisvLyBPbiBTeW1iaWFuLCBCT09TVF9IQVNfVFIxX1RVUExFIGNhdXNlcyBCb29zdCdzIFRSMSB0dXBsZSBsaWJyYXJ5IHRvCisvLyB1c2UgU1RMcG9ydCdzIHR1cGxlIGltcGxlbWVudGF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QKKy8vIHdvcmsgYXMgdGhlIGNvcHkgb2YgU1RMcG9ydCBkaXN0cmlidXRlZCB3aXRoIFN5bWJpYW4gaXMgaW5jb21wbGV0ZS4KKy8vIEJ5IG1ha2luZyBzdXJlIEJPT1NUX0hBU19UUjFfVFVQTEUgaXMgdW5kZWZpbmVkLCB3ZSBmb3JjZSBCb29zdCB0bworLy8gdXNlIGl0cyBvd24gdHVwbGUgaW1wbGVtZW50YXRpb24uCisjICBpZmRlZiBCT09TVF9IQVNfVFIxX1RVUExFCisjICAgdW5kZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQorIyAgZW5kaWYgIC8vIEJPT1NUX0hBU19UUjFfVFVQTEUKKworLy8gVGhpcyBwcmV2ZW50cyA8Ym9vc3QvdHIxL2RldGFpbC9jb25maWcuaHBwPiwgd2hpY2ggZGVmaW5lcworLy8gQk9PU1RfSEFTX1RSMV9UVVBMRSwgZnJvbSBiZWluZyAjaW5jbHVkZWQgYnkgQm9vc3QncyA8dHVwbGU+LgorIyAgZGVmaW5lIEJPT1NUX1RSMV9ERVRBSUxfQ09ORklHX0hQUF9JTkNMVURFRAorIyAgaW5jbHVkZSA8dHVwbGU+CisKKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApCisvLyBHQ0MgNC4wKyBpbXBsZW1lbnRzIHRyMS90dXBsZSBpbiB0aGUgPHRyMS90dXBsZT4gaGVhZGVyLiAgVGhpcyBkb2VzCisvLyBub3QgY29uZm9ybSB0byB0aGUgVFIxIHNwZWMsIHdoaWNoIHJlcXVpcmVzIHRoZSBoZWFkZXIgdG8gYmUgPHR1cGxlPi4KKworIyAgaWYgIUdURVNUX0hBU19SVFRJICYmIEdURVNUX0dDQ19WRVJfIDwgNDAzMDIKKy8vIFVudGlsIHZlcnNpb24gNC4zLjIsIGdjYyBoYXMgYSBidWcgdGhhdCBjYXVzZXMgPHRyMS9mdW5jdGlvbmFsPiwKKy8vIHdoaWNoIGlzICNpbmNsdWRlZCBieSA8dHIxL3R1cGxlPiwgdG8gbm90IGNvbXBpbGUgd2hlbiBSVFRJIGlzCisvLyBkaXNhYmxlZC4gIF9UUjFfRlVOQ1RJT05BTCBpcyB0aGUgaGVhZGVyIGd1YXJkIGZvcgorLy8gPHRyMS9mdW5jdGlvbmFsPi4gIEhlbmNlIHRoZSBmb2xsb3dpbmcgI2RlZmluZSBpcyBhIGhhY2sgdG8gcHJldmVudAorLy8gPHRyMS9mdW5jdGlvbmFsPiBmcm9tIGJlaW5nIGluY2x1ZGVkLgorIyAgIGRlZmluZSBfVFIxX0ZVTkNUSU9OQUwgMQorIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4KKyMgICB1bmRlZiBfVFIxX0ZVTkNUSU9OQUwgIC8vIEFsbG93cyB0aGUgdXNlciB0byAjaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gPHRyMS9mdW5jdGlvbmFsPiBpZiBoZSBjaG9vc2VzIHRvLgorIyAgZWxzZQorIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4gIC8vIE5PTElOVAorIyAgZW5kaWYgIC8vICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCisKKyMgZWxzZQorLy8gSWYgdGhlIGNvbXBpbGVyIGlzIG5vdCBHQ0MgNC4wKywgd2UgYXNzdW1lIHRoZSB1c2VyIGlzIHVzaW5nIGEKKy8vIHNwZWMtY29uZm9ybWluZyBUUjEgaW1wbGVtZW50YXRpb24uCisjICBpbmNsdWRlIDx0dXBsZT4gIC8vIE5PTElOVAorIyBlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKy8vIERldGVybWluZXMgd2hldGhlciBjbG9uZSgyKSBpcyBzdXBwb3J0ZWQuCisvLyBVc3VhbGx5IGl0IHdpbGwgb25seSBiZSBhdmFpbGFibGUgb24gTGludXgsIGV4Y2x1ZGluZworLy8gTGludXggb24gdGhlIEl0YW5pdW0gYXJjaGl0ZWN0dXJlLgorLy8gQWxzbyBzZWUgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzIvY2xvbmUuCisjaWZuZGVmIEdURVNUX0hBU19DTE9ORQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworIyBpZiBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKKyMgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKy8vIE9uIEFuZHJvaWQsIGNsb25lKCkgaXMgb25seSBhdmFpbGFibGUgb24gQVJNIHN0YXJ0aW5nIHdpdGggR2luZ2VyYnJlYWQuCisjICAgIGlmIGRlZmluZWQoX19hcm1fXykgJiYgX19BTkRST0lEX0FQSV9fID49IDkKKyMgICAgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMQorIyAgICBlbHNlCisjICAgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDAKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDEKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMAorIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVggJiYgIWRlZmluZWQoX19pYTY0X18pCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKy8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IHN0cmVhbSByZWRpcmVjdGlvbi4gVGhpcyBpcyB1c2VkIHRvIHRlc3QKKy8vIG91dHB1dCBjb3JyZWN0bmVzcyBhbmQgdG8gaW1wbGVtZW50IGRlYXRoIHRlc3RzLgorI2lmbmRlZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisvLyBCeSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhhdCBzdHJlYW0gcmVkaXJlY3Rpb24gaXMgc3VwcG9ydGVkIG9uIGFsbAorLy8gcGxhdGZvcm1zIGV4Y2VwdCBrbm93biBtb2JpbGUgb25lcy4KKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTgorIyAgZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04gMAorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTiAxCisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgJiYgIUdURVNUX09TX1NZTUJJQU4KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCBkZWF0aCB0ZXN0cy4KKy8vIEdvb2dsZSBUZXN0IGRvZXMgbm90IHN1cHBvcnQgZGVhdGggdGVzdHMgZm9yIFZDIDcuMSBhbmQgZWFybGllciBhcworLy8gYWJvcnQoKSBpbiBhIFZDIDcuMSBhcHBsaWNhdGlvbiBjb21waWxlZCBhcyBHVUkgaW4gZGVidWcgY29uZmlnCisvLyBwb3BzIHVwIGEgZGlhbG9nIHdpbmRvdyB0aGF0IGNhbm5vdCBiZSBzdXBwcmVzc2VkIHByb2dyYW1tYXRpY2FsbHkuCisjaWYgKEdURVNUX09TX0xJTlVYIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTIHx8IFwKKyAgICAgKEdURVNUX09TX01BQyAmJiAhR1RFU1RfT1NfSU9TKSB8fCBHVEVTVF9PU19JT1NfU0lNVUxBVE9SIHx8IFwKKyAgICAgKEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAmJiBfTVNDX1ZFUiA+PSAxNDAwKSB8fCBcCisgICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgfHwgR1RFU1RfT1NfQUlYIHx8IEdURVNUX09TX0hQVVggfHwgXAorICAgICBHVEVTVF9PU19PUEVOQlNEIHx8IEdURVNUX09TX1FOWCkKKyMgZGVmaW5lIEdURVNUX0hBU19ERUFUSF9URVNUIDEKKyMgaW5jbHVkZSA8dmVjdG9yPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gV2UgZG9uJ3Qgc3VwcG9ydCBNU1ZDIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQgbm93LiAgVGhlcmVmb3JlCisvLyBhbGwgdGhlIGNvbXBpbGVycyB3ZSBjYXJlIGFib3V0IGFyZSBhZGVxdWF0ZSBmb3Igc3VwcG9ydGluZworLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyNkZWZpbmUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgMQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCB0eXBlLWRyaXZlbiB0ZXN0cy4KKworLy8gVHlwZWQgdGVzdHMgbmVlZCA8dHlwZWluZm8+IGFuZCB2YXJpYWRpYyBtYWNyb3MsIHdoaWNoIEdDQywgVkMrKyA4LjAsCisvLyBTdW4gUHJvIENDLCBJQk0gVmlzdWFsIEFnZSwgYW5kIEhQIGFDQyBzdXBwb3J0LgorI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IChfTVNDX1ZFUiA+PSAxNDAwKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSB8fCBcCisgICAgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9fSFBfYUNDKQorIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1QgMQorIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAxCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgQ29tYmluZSgpLiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbgorLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0CisvLyB3b3JrIG9uIFN1biBTdHVkaW8gc2luY2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIHRlbXBsYXRlZCBjb252ZXJzaW9uCisvLyBvcGVyYXRvcnMuCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QgJiYgR1RFU1RfSEFTX1RSMV9UVVBMRSAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKKyMgZGVmaW5lIEdURVNUX0hBU19DT01CSU5FIDEKKyNlbmRpZgorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN5c3RlbSBjb21waWxlciB1c2VzIFVURi0xNiBmb3IgZW5jb2Rpbmcgd2lkZSBzdHJpbmdzLgorI2RlZmluZSBHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XyBcCisgICAgKEdURVNUX09TX1dJTkRPV1MgfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfQUlYKQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGVzdCByZXN1bHRzIGNhbiBiZSBzdHJlYW1lZCB0byBhIHNvY2tldC4KKyNpZiBHVEVTVF9PU19MSU5VWAorIyBkZWZpbmUgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXyAxCisjZW5kaWYKKworLy8gRGVmaW5lcyBzb21lIHV0aWxpdHkgbWFjcm9zLgorCisvLyBUaGUgR05VIGNvbXBpbGVyIGVtaXRzIGEgd2FybmluZyBpZiBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIGFyZSBmb2xsb3dlZCBieQorLy8gYW4gImVsc2UiIHN0YXRlbWVudCBhbmQgYnJhY2VzIGFyZSBub3QgdXNlZCB0byBleHBsaWNpdGx5IGRpc2FtYmlndWF0ZSB0aGUKKy8vICJlbHNlIiBiaW5kaW5nLiAgVGhpcyBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGNvZGUgbGlrZToKKy8vCisvLyAgIGlmIChnYXRlKQorLy8gICAgIEFTU0VSVF8qKGNvbmRpdGlvbikgPDwgIlNvbWUgbWVzc2FnZSI7CisvLworLy8gVGhlICJzd2l0Y2ggKDApIGNhc2UgMDoiIGlkaW9tIGlzIHVzZWQgdG8gc3VwcHJlc3MgdGhpcy4KKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIHN3aXRjaCAoMCkgY2FzZSAwOiBkZWZhdWx0OiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gVXNlIHRoaXMgYW5ub3RhdGlvbiBhdCB0aGUgZW5kIG9mIGEgc3RydWN0L2NsYXNzIGRlZmluaXRpb24gdG8KKy8vIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc3RhbmNlcyB0aGF0IGFyZSBuZXZlcgorLy8gdXNlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gYWxsIGludGVyZXN0aW5nIGxvZ2ljIGhhcHBlbnMgaW5zaWRlIHRoZQorLy8gYyd0b3IgYW5kIC8gb3IgZCd0b3IuICBFeGFtcGxlOgorLy8KKy8vICAgc3RydWN0IEZvbyB7CisvLyAgICAgRm9vKCkgeyAuLi4gfQorLy8gICB9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOworLy8KKy8vIEFsc28gdXNlIGl0IGFmdGVyIGEgdmFyaWFibGUgb3IgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIHRvIHRlbGwgdGhlCisvLyBjb21waWxlciB0aGUgdmFyaWFibGUvcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUgdG8gYmUgdXNlZC4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCisjIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXworI2VuZGlmCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgb3BlcmF0b3I9CisvLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCisjZGVmaW5lIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSlcCisgIHZvaWQgb3BlcmF0b3I9KHR5cGUgY29uc3QgJikKKworLy8gQSBtYWNybyB0byBkaXNhbGxvdyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KKy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcy4KKyNkZWZpbmUgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyh0eXBlKVwKKyAgdHlwZSh0eXBlIGNvbnN0ICYpO1wKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyh0eXBlKQorCisvLyBUZWxsIHRoZSBjb21waWxlciB0byB3YXJuIGFib3V0IHVudXNlZCByZXR1cm4gdmFsdWVzIGZvciBmdW5jdGlvbnMgZGVjbGFyZWQKKy8vIHdpdGggdGhpcyBtYWNyby4gIFRoZSBtYWNybyBzaG91bGQgYmUgdXNlZCBvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKy8vIGZvbGxvd2luZyB0aGUgYXJndW1lbnQgbGlzdDoKKy8vCisvLyAgIFNwcm9ja2V0KiBBbGxvY2F0ZVNwcm9ja2V0KCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFkZWZpbmVkKENPTVBJTEVSX0lDQykKKyMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXworI2VuZGlmICAvLyBfX0dOVUNfXyAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFDT01QSUxFUl9JQ0MKKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzIFN0cnVjdHVyZWQgRXhjZXB0aW9uCisvLyBIYW5kbGluZy4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IHNldmVyYWwgV2luZG93cyBjb21waWxlcnMgYnV0IGdlbmVyYWxseQorLy8gZG9lcyBub3QgZXhpc3Qgb24gYW55IG90aGVyIHN5c3RlbS4KKyNpZm5kZWYgR1RFU1RfSEFTX1NFSAorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIFRoZXNlIHR3byBjb21waWxlcnMgYXJlIGtub3duIHRvIHN1cHBvcnQgU0VILgorIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMQorIyBlbHNlCisvLyBBc3N1bWUgbm8gU0VILgorIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMAorIyBlbmRpZgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworI2lmZGVmIF9NU0NfVkVSCisKKyMgaWYgR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZCisjICBkZWZpbmUgR1RFU1RfQVBJXyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgZWxpZiBHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKKyMgIGRlZmluZSBHVEVTVF9BUElfIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyBlbmRpZgorCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgR1RFU1RfQVBJXworIyBkZWZpbmUgR1RFU1RfQVBJXworI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworLy8gQXNrIHRoZSBjb21waWxlciB0byBuZXZlciBpbmxpbmUgYSBnaXZlbiBmdW5jdGlvbi4KKyMgZGVmaW5lIEdURVNUX05PX0lOTElORV8gX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX05PX0lOTElORV8KKyNlbmRpZgorCisvLyBfTElCQ1BQX1ZFUlNJT04gaXMgZGVmaW5lZCBieSB0aGUgbGliYysrIGxpYnJhcnkgZnJvbSB0aGUgTExWTSBwcm9qZWN0LgorI2lmIGRlZmluZWQoX19HTElCQ1hYX18pIHx8IGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKQorIyBkZWZpbmUgR1RFU1RfSEFTX0NYWEFCSV9IXyAxCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfSEFTX0NYWEFCSV9IXyAwCisjZW5kaWYKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNZXNzYWdlOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgR1RFU1RfQ09NUElMRV9BU1NFUlRfIG1hY3JvIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY29tcGlsZSB0aW1lCisvLyBleHByZXNzaW9uIGlzIHRydWUuIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIGl0IHRvIHZlcmlmeSB0aGUKKy8vIHNpemUgb2YgYSBzdGF0aWMgYXJyYXk6CisvLworLy8gICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oQVJSQVlTSVpFKGNvbnRlbnRfdHlwZV9uYW1lcykgPT0gQ09OVEVOVF9OVU1fVFlQRVMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGVfbmFtZXNfaW5jb3JyZWN0X3NpemUpOworLy8KKy8vIG9yIHRvIG1ha2Ugc3VyZSBhIHN0cnVjdCBpcyBzbWFsbGVyIHRoYW4gYSBjZXJ0YWluIHNpemU6CisvLworLy8gICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oc2l6ZW9mKGZvbykgPCAxMjgsIGZvb190b29fbGFyZ2UpOworLy8KKy8vIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIG1hY3JvIGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gSWYKKy8vIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLCBtb3N0IGNvbXBpbGVycyB3aWxsIGlzc3VlIGEgd2FybmluZy9lcnJvcgorLy8gY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuCisKK3RlbXBsYXRlIDxib29sPgorc3RydWN0IENvbXBpbGVBc3NlcnQgeworfTsKKworI2RlZmluZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZXhwciwgbXNnKSBcCisgIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+IFwKKyAgICAgIG1zZ1tib29sKGV4cHIpID8gMSA6IC0xXQorCisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIEdURVNUX0NPTVBJTEVfQVNTRVJUXzoKKy8vCisvLyAtIEdURVNUX0NPTVBJTEVfQVNTRVJUXyB3b3JrcyBieSBkZWZpbmluZyBhbiBhcnJheSB0eXBlIHRoYXQgaGFzIC0xCisvLyAgIGVsZW1lbnRzIChhbmQgdGh1cyBpcyBpbnZhbGlkKSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLgorLy8KKy8vIC0gVGhlIHNpbXBsZXIgZGVmaW5pdGlvbgorLy8KKy8vICAgICNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdCisvLworLy8gICBkb2VzIG5vdCB3b3JrLCBhcyBnY2Mgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyB3aG9zZSBzaXplcworLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0CisvLyAgIG9mIHRoZSBDKysgc3RhbmRhcmQpLiAgQXMgYSByZXN1bHQsIGdjYyBmYWlscyB0byByZWplY3QgdGhlCisvLyAgIGZvbGxvd2luZyBjb2RlIHdpdGggdGhlIHNpbXBsZSBkZWZpbml0aW9uOgorLy8KKy8vICAgICBpbnQgZm9vOworLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhmb28sIG1zZyk7IC8vIG5vdCBzdXBwb3NlZCB0byBjb21waWxlIGFzIGZvbyBpcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KKy8vCisvLyAtIEJ5IHVzaW5nIHRoZSB0eXBlIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiwgd2UgZW5zdXJlcyB0aGF0CisvLyAgIGV4cHIgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuICAoVGVtcGxhdGUgYXJndW1lbnRzIG11c3QgYmUKKy8vICAgZGV0ZXJtaW5lZCBhdCBjb21waWxlLXRpbWUuKQorLy8KKy8vIC0gVGhlIG91dHRlciBwYXJlbnRoZXNlcyBpbiBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gYXJlIG5lY2Vzc2FyeQorLy8gICB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMy40LjQgYW5kIDQuMC4xLiAgSWYgd2UgaGFkIHdyaXR0ZW4KKy8vCisvLyAgICAgQ29tcGlsZUFzc2VydDxib29sKGV4cHIpPgorLy8KKy8vICAgaW5zdGVhZCwgdGhlc2UgY29tcGlsZXJzIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUKKy8vCisvLyAgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKDUgPiAwLCBzb21lX21lc3NhZ2UpOworLy8KKy8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUKKy8vICAgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4pCisvLworLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5CisvLworLy8gICAgICgoZXhwcikgPyAxIDogLTEpLgorLy8KKy8vICAgVGhpcyBpcyB0byBhdm9pZCBydW5uaW5nIGludG8gYSBidWcgaW4gTVMgVkMgNy4xLCB3aGljaAorLy8gICBjYXVzZXMgKCgwLjApID8gMSA6IC0xKSB0byBpbmNvcnJlY3RseSBldmFsdWF0ZSB0byAxLgorCisvLyBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXIgaXMgdXNlZCBieSBTdGF0aWNBc3NlcnRUeXBlRXEgZGVmaW5lZCBpbiBndGVzdC5oLgorLy8KKy8vIFRoaXMgdGVtcGxhdGUgaXMgZGVjbGFyZWQsIGJ1dCBpbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VCwgVD4ge307CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwordHlwZWRlZiA6OnN0cmluZyBzdHJpbmc7CisjZWxzZQordHlwZWRlZiA6OnN0ZDo6c3RyaW5nIHN0cmluZzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwordHlwZWRlZiA6OndzdHJpbmcgd3N0cmluZzsKKyNlbGlmIEdURVNUX0hBU19TVERfV1NUUklORwordHlwZWRlZiA6OnN0ZDo6d3N0cmluZyB3c3RyaW5nOworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gQSBoZWxwZXIgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIGNvbnN0YW50IGNvbmRpdGlvbi4gIEl0IGp1c3QKKy8vIHJldHVybnMgJ2NvbmRpdGlvbicuCitHVEVTVF9BUElfIGJvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKTsKKworLy8gRGVmaW5lcyBzY29wZWRfcHRyLgorCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHNjb3BlZF9wdHIgaXMgUEFSVElBTCAtIGl0IG9ubHkgY29udGFpbnMKKy8vIGVub3VnaCBzdHVmZiB0byBzYXRpc2Z5IEdvb2dsZSBUZXN0J3MgbmVlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3Mgc2NvcGVkX3B0ciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworCisgIGV4cGxpY2l0IHNjb3BlZF9wdHIoVCogcCA9IE5VTEwpIDogcHRyXyhwKSB7fQorICB+c2NvcGVkX3B0cigpIHsgcmVzZXQoKTsgfQorCisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpwdHJfOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKworICBUKiByZWxlYXNlKCkgeworICAgIFQqIGNvbnN0IHB0ciA9IHB0cl87CisgICAgcHRyXyA9IE5VTEw7CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIHZvaWQgcmVzZXQoVCogcCA9IE5VTEwpIHsKKyAgICBpZiAocCAhPSBwdHJfKSB7CisgICAgICBpZiAoSXNUcnVlKHNpemVvZihUKSA+IDApKSB7ICAvLyBNYWtlcyBzdXJlIFQgaXMgYSBjb21wbGV0ZSB0eXBlLgorICAgICAgICBkZWxldGUgcHRyXzsKKyAgICAgIH0KKyAgICAgIHB0cl8gPSBwOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgVCogcHRyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKHNjb3BlZF9wdHIpOworfTsKKworLy8gRGVmaW5lcyBSRS4KKworLy8gQSBzaW1wbGUgQysrIHdyYXBwZXIgZm9yIDxyZWdleC5oPi4gIEl0IHVzZXMgdGhlIFBPU0lYIEV4dGVuZGVkCisvLyBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4LgorY2xhc3MgR1RFU1RfQVBJXyBSRSB7CisgcHVibGljOgorICAvLyBBIGNvcHkgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgYnkgdGhlIFN0YW5kYXJkIHRvIGluaXRpYWxpemUgb2JqZWN0CisgIC8vIHJlZmVyZW5jZXMgZnJvbSByLXZhbHVlcy4KKyAgUkUoY29uc3QgUkUmIG90aGVyKSB7IEluaXQob3RoZXIucGF0dGVybigpKTsgfQorCisgIC8vIENvbnN0cnVjdHMgYW4gUkUgZnJvbSBhIHN0cmluZy4KKyAgUkUoY29uc3QgOjpzdGQ6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IGNoYXIqIHJlZ2V4KSB7IEluaXQocmVnZXgpOyB9ICAvLyBOT0xJTlQKKyAgflJFKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleC4KKyAgY29uc3QgY2hhciogcGF0dGVybigpIGNvbnN0IHsgcmV0dXJuIHBhdHRlcm5fOyB9CisKKyAgLy8gRnVsbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMKKyAgLy8gdGhlIGVudGlyZSBzdHIuCisgIC8vIFBhcnRpYWxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZQorICAvLyBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0ciAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorICAvLworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogbWFrZSBGdWxsTWF0Y2goKSBhbmQgUGFydGlhbE1hdGNoKCkgd29yaworICAvLyB3aGVuIHN0ciBjb250YWlucyBOVUwgY2hhcmFjdGVycy4KKyAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgeworICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisKKyBwcml2YXRlOgorICB2b2lkIEluaXQoY29uc3QgY2hhciogcmVnZXgpOworCisgIC8vIFdlIHVzZSBhIGNvbnN0IGNoYXIqIGluc3RlYWQgb2YgYW4gc3RkOjpzdHJpbmcsIGFzIEdvb2dsZSBUZXN0IHVzZWQgdG8gYmUKKyAgLy8gdXNlZCB3aGVyZSBzdGQ6OnN0cmluZyBpcyBub3QgYXZhaWxhYmxlLiAgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGNoYW5nZSB0bworICAvLyBzdGQ6OnN0cmluZy4KKyAgY29uc3QgY2hhciogcGF0dGVybl87CisgIGJvb2wgaXNfdmFsaWRfOworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisgIHJlZ2V4X3QgZnVsbF9yZWdleF87ICAgICAvLyBGb3IgRnVsbE1hdGNoKCkuCisgIHJlZ2V4X3QgcGFydGlhbF9yZWdleF87ICAvLyBGb3IgUGFydGlhbE1hdGNoKCkuCisKKyNlbHNlICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisgIGNvbnN0IGNoYXIqIGZ1bGxfcGF0dGVybl87ICAvLyBGb3IgRnVsbE1hdGNoKCk7CisKKyNlbmRpZgorCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUkUpOworfTsKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisvLyBGb3JtYXRzIGEgZmlsZSBsb2NhdGlvbiBmb3IgY29tcGlsZXItaW5kZXBlbmRlbnQgWE1MIG91dHB1dC4KKy8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCwgd2UgcHV0IGl0IG5leHQgdG8KKy8vIEZvcm1hdEZpbGVMb2NhdGlvbiBpbiBvcmRlciB0byBjb250cmFzdCB0aGUgdHdvIGZ1bmN0aW9ucy4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7CisKKy8vIERlZmluZXMgbG9nZ2luZyB1dGlsaXRpZXM6CisvLyAgIEdURVNUX0xPR18oc2V2ZXJpdHkpIC0gbG9ncyBtZXNzYWdlcyBhdCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5IGxldmVsLiBUaGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGl0c2VsZiBpcyBzdHJlYW1lZCBpbnRvIHRoZSBtYWNyby4KKy8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCisKK2VudW0gR1Rlc3RMb2dTZXZlcml0eSB7CisgIEdURVNUX0lORk8sCisgIEdURVNUX1dBUk5JTkcsCisgIEdURVNUX0VSUk9SLAorICBHVEVTVF9GQVRBTAorfTsKKworLy8gRm9ybWF0cyBsb2cgZW50cnkgc2V2ZXJpdHksIHByb3ZpZGVzIGEgc3RyZWFtIG9iamVjdCBmb3Igc3RyZWFtaW5nIHRoZQorLy8gbG9nIG1lc3NhZ2UsIGFuZCB0ZXJtaW5hdGVzIHRoZSBtZXNzYWdlIHdpdGggYSBuZXdsaW5lIHdoZW4gZ29pbmcgb3V0IG9mCisvLyBzY29wZS4KK2NsYXNzIEdURVNUX0FQSV8gR1Rlc3RMb2cgeworIHB1YmxpYzoKKyAgR1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisgIC8vIEZsdXNoZXMgdGhlIGJ1ZmZlcnMgYW5kLCBpZiBzZXZlcml0eSBpcyBHVEVTVF9GQVRBTCwgYWJvcnRzIHRoZSBwcm9ncmFtLgorICB+R1Rlc3RMb2coKTsKKworICA6OnN0ZDo6b3N0cmVhbSYgR2V0U3RyZWFtKCkgeyByZXR1cm4gOjpzdGQ6OmNlcnI7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHlfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RMb2cpOworfTsKKworI2RlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RMb2coOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfIyNzZXZlcml0eSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykuR2V0U3RyZWFtKCkKKworaW5saW5lIHZvaWQgTG9nVG9TdGRlcnIoKSB7fQoraW5saW5lIHZvaWQgRmx1c2hJbmZvTG9nKCkgeyBmZmx1c2goTlVMTCk7IH0KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFLgorLy8KKy8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uCisvLyBpcyBub3Qgc2F0aXNmaWVkLgorLy8gIFN5bm9wc3lzOgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsKKy8vICAgICBvcgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKSA8PCAiQWRkaXRpb25hbCBtZXNzYWdlIjsKKy8vCisvLyAgICBUaGlzIGNoZWNrcyB0aGUgY29uZGl0aW9uIGFuZCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKKy8vICAgIGl0IHByaW50cyBtZXNzYWdlIGFib3V0IHRoZSBjb25kaXRpb24gdmlvbGF0aW9uLCBpbmNsdWRpbmcgdGhlCisvLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksCisvLyAgICBhbmQgdGhlbiBpdCBhYm9ydHMgdGhlIHByb2dyYW0uIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpcnJlc3BlY3RpdmUgb2YKKy8vICAgIHdoZXRoZXIgaXQgaXMgYnVpbHQgaW4gdGhlIGRlYnVnIG1vZGUgb3Igbm90LgorI2RlZmluZSBHVEVTVF9DSEVDS18oY29uZGl0aW9uKSBcCisgICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoY29uZGl0aW9uKSkgXAorICAgICAgOyBcCisgICAgZWxzZSBcCisgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiQ29uZGl0aW9uICIgI2NvbmRpdGlvbiAiIGZhaWxlZC4gIgorCisvLyBBbiBhbGwtbW9kZSBhc3NlcnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFBPU0lYLXN0eWxlIGZ1bmN0aW9uCisvLyBjYWxsIHJldHVybnMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKS4gIEtub3duIGxpbWl0YXRpb246IHRoaXMKKy8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvCisvLyBpbiB7fSBpZiB5b3UgbmVlZCB0byB1c2UgaXQgYXMgdGhlIG9ubHkgc3RhdGVtZW50IGluIGFuICdpZicKKy8vIGJyYW5jaC4KKyNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXAorICBpZiAoY29uc3QgaW50IGd0ZXN0X2Vycm9yID0gKHBvc2l4X2NhbGwpKSBcCisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgI3Bvc2l4X2NhbGwgPDwgImZhaWxlZCB3aXRoIGVycm9yICIgXAorICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVXNlIEltcGxpY2l0Q2FzdF8gYXMgYSBzYWZlIHZlcnNpb24gb2Ygc3RhdGljX2Nhc3QgZm9yIHVwY2FzdGluZyBpbgorLy8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuIGNhc3RpbmcgYSBGb28qIHRvIGEgU3VwZXJjbGFzc09mRm9vKiBvciBhCisvLyBjb25zdCBGb28qKS4gIFdoZW4geW91IHVzZSBJbXBsaWNpdENhc3RfLCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQKKy8vIHRoZSBjYXN0IGlzIHNhZmUuICBTdWNoIGV4cGxpY2l0IEltcGxpY2l0Q2FzdF9zIGFyZSBuZWNlc3NhcnkgaW4KKy8vIHN1cnByaXNpbmdseSBtYW55IHNpdHVhdGlvbnMgd2hlcmUgQysrIGRlbWFuZHMgYW4gZXhhY3QgdHlwZSBtYXRjaAorLy8gaW5zdGVhZCBvZiBhbiBhcmd1bWVudCB0eXBlIGNvbnZlcnRhYmxlIHRvIGEgdGFyZ2V0IHR5cGUuCisvLworLy8gVGhlIHN5bnRheCBmb3IgdXNpbmcgSW1wbGljaXRDYXN0XyBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljX2Nhc3Q6CisvLworLy8gICBJbXBsaWNpdENhc3RfPFRvVHlwZT4oZXhwcikKKy8vCisvLyBJbXBsaWNpdENhc3RfIHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwKKy8vIGJ1dCB0aGUgcHJvcG9zYWwgd2FzIHN1Ym1pdHRlZCB0b28gbGF0ZS4gIEl0IHdpbGwgcHJvYmFibHkgbWFrZQorLy8gaXRzIHdheSBpbnRvIHRoZSBsYW5ndWFnZSBpbiB0aGUgZnV0dXJlLgorLy8KKy8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAorLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGltcGxpY2l0X2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbz4KK2lubGluZSBUbyBJbXBsaWNpdENhc3RfKFRvIHgpIHsgcmV0dXJuIHg7IH0KKworLy8gV2hlbiB5b3UgdXBjYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tIHR5cGUgRm9vIHRvIHR5cGUKKy8vIFN1cGVyY2xhc3NPZkZvbyksIGl0J3MgZmluZSB0byB1c2UgSW1wbGljaXRDYXN0Xzw+LCBzaW5jZSB1cGNhc3RzCisvLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tCisvLyB0eXBlIEZvbyB0byB0eXBlIFN1YmNsYXNzT2ZGb28pLCBzdGF0aWNfY2FzdDw+IGlzbid0IHNhZmUsIGJlY2F1c2UKKy8vIGhvdyBkbyB5b3Uga25vdyB0aGUgcG9pbnRlciBpcyByZWFsbHkgb2YgdHlwZSBTdWJjbGFzc09mRm9vPyAgSXQKKy8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsCisvLyB3aGVuIHlvdSBkb3duY2FzdCwgeW91IHNob3VsZCB1c2UgdGhpcyBtYWNyby4gIEluIGRlYnVnIG1vZGUsIHdlCisvLyB1c2UgZHluYW1pY19jYXN0PD4gdG8gZG91YmxlLWNoZWNrIHRoZSBkb3duY2FzdCBpcyBsZWdhbCAod2UgZGllCisvLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+CisvLyBpbnN0ZWFkLiAgVGh1cywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBpbiBkZWJ1ZyBtb2RlIHRvIG1ha2Ugc3VyZQorLy8gdGhlIGNhc3QgaXMgbGVnYWwhCisvLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uCisvLyBJbiBwYXJ0aWN1bGFyLCB5b3UgU0hPVUxETidUIGJlIHVzaW5nIGR5bmFtaWNfY2FzdDw+IGluIG9yZGVyIHRvCisvLyBkbyBSVFRJIChlZyBjb2RlIGxpa2UgdGhpczoKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7CisvLyAgICBpZiAoZHluYW1pY19jYXN0PFN1YmNsYXNzMj4oZm9vKSkgSGFuZGxlQVN1YmNsYXNzMk9iamVjdChmb28pOworLy8gWW91IHNob3VsZCBkZXNpZ24gdGhlIGNvZGUgc29tZSBvdGhlciB3YXkgbm90IHRvIG5lZWQgdGhpcy4KKy8vCisvLyBUaGlzIHJlbGF0aXZlbHkgdWdseSBuYW1lIGlzIGludGVudGlvbmFsLiBJdCBwcmV2ZW50cyBjbGFzaGVzIHdpdGgKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIHVzZXJzIG1heSBoYXZlIChlLmcuLCBkb3duX2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gIC8vIHVzZSBsaWtlIHRoaXM6IERvd25DYXN0XzxUKj4oZm9vKTsKK2lubGluZSBUbyBEb3duQ2FzdF8oRnJvbSogZikgeyAgLy8gc28gd2Ugb25seSBhY2NlcHQgcG9pbnRlcnMKKyAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQorICAvLyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcsIGFuZCBoYXMgbm8gb3ZlcmhlYWQgaW4gYW4KKyAgLy8gb3B0aW1pemVkIGJ1aWxkIGF0IHJ1bi10aW1lLCBhcyBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5CisgIC8vIGNvbXBsZXRlbHkuCisgIGlmIChmYWxzZSkgeworICAgIGNvbnN0IFRvIHRvID0gTlVMTDsKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7CisgIH0KKworI2lmIEdURVNUX0hBU19SVFRJCisgIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKKyAgR1RFU1RfQ0hFQ0tfKGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Cit9CisKKy8vIERvd25jYXN0cyB0aGUgcG9pbnRlciBvZiB0eXBlIEJhc2UgdG8gRGVyaXZlZC4KKy8vIERlcml2ZWQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEJhc2UuIFRoZSBwYXJhbWV0ZXIgTVVTVAorLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuCisvLyBXaGVuIFJUVEkgaXMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgYSBydW50aW1lCisvLyBjaGVjayB0byBlbmZvcmNlIHRoaXMuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4KK0Rlcml2ZWQqIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZShCYXNlKiBiYXNlKSB7CisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBOT0xJTlQKKyNlbHNlCisgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0LgorI2VuZGlmCit9CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoKKy8vICAgQ2FwdHVyZVN0ZG91dCAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KKy8vICAgR2V0Q2FwdHVyZWRTdGRvdXQgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCisvLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorLy8KK0dURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7CitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7CitHVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOworR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0SW5qZWN0YWJsZUFyZ3ZzKCk7Cit2b2lkIFNldEluamVjdGFibGVBcmd2cyhjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYXJndnMpOworCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KK2V4dGVybiA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGdfYXJndnM7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRGVmaW5lcyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKworI2lmIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFNsZWVwcyBmb3IgKHJvdWdobHkpIG4gbWlsbGktc2Vjb25kcy4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IKKy8vIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gIERvbid0IHVzZSBpdCBpbiB1c2VyIHRlc3RzLAorLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitpbmxpbmUgdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbikgeworICBjb25zdCB0aW1lc3BlYyB0aW1lID0geworICAgIDAsICAgICAgICAgICAgICAgICAgLy8gMCBzZWNvbmRzLgorICAgIG4gKiAxMDAwTCAqIDEwMDBMLCAgLy8gQW5kIG4gbXMuCisgIH07CisgIG5hbm9zbGVlcCgmdGltZSwgTlVMTCk7Cit9CisKKy8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCisvLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCisvLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90CisvLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBOb3RpZmljYXRpb24geworIHB1YmxpYzoKKyAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOworICB9CisgIH5Ob3RpZmljYXRpb24oKSB7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pOworICB9CisKKyAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0CisgIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKyAgdm9pZCBOb3RpZnkoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOworICAgIG5vdGlmaWVkXyA9IHRydWU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgIH0KKworICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAorICAvLyB0aHJlYWQuCisgIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7CisgICAgICBjb25zdCBib29sIG5vdGlmaWVkID0gbm90aWZpZWRfOworICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgICAgICBpZiAobm90aWZpZWQpCisgICAgICAgIGJyZWFrOworICAgICAgU2xlZXBNaWxsaXNlY29uZHMoMTApOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKKyAgYm9vbCBub3RpZmllZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOworfTsKKworLy8gQXMgYSBDLWZ1bmN0aW9uLCBUaHJlYWRGdW5jV2l0aENMaW5rYWdlIGNhbm5vdCBiZSB0ZW1wbGF0ZWQgaXRzZWxmLgorLy8gQ29uc2VxdWVudGx5LCBpdCBjYW5ub3Qgc2VsZWN0IGEgY29ycmVjdCBpbnN0YW50aWF0aW9uIG9mIFRocmVhZFdpdGhQYXJhbQorLy8gaW4gb3JkZXIgdG8gY2FsbCBpdHMgUnVuKCkuIEludHJvZHVjaW5nIFRocmVhZFdpdGhQYXJhbUJhc2UgYXMgYQorLy8gbm9uLXRlbXBsYXRlZCBiYXNlIGNsYXNzIGZvciBUaHJlYWRXaXRoUGFyYW0gYWxsb3dzIHVzIHRvIGJ5cGFzcyB0aGlzCisvLyBwcm9ibGVtLgorY2xhc3MgVGhyZWFkV2l0aFBhcmFtQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRXaXRoUGFyYW1CYXNlKCkge30KKyAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKK307CisKKy8vIHB0aHJlYWRfY3JlYXRlKCkgYWNjZXB0cyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0eXBlIHdpdGggdGhlIEMgbGlua2FnZS4KKy8vIEFjY29yZGluZyB0byB0aGUgU3RhbmRhcmQgKDcuNS8xKSwgZnVuY3Rpb24gdHlwZXMgd2l0aCBkaWZmZXJlbnQgbGlua2FnZXMKKy8vIGFyZSBkaWZmZXJlbnQgZXZlbiBpZiB0aGV5IGFyZSBvdGhlcndpc2UgaWRlbnRpY2FsLiAgU29tZSBjb21waWxlcnMgKGZvcgorLy8gZXhhbXBsZSwgU3VuU3R1ZGlvKSB0cmVhdCB0aGVtIGFzIGRpZmZlcmVudCB0eXBlcy4gIFNpbmNlIGNsYXNzIG1ldGhvZHMKKy8vIGNhbm5vdCBiZSBkZWZpbmVkIHdpdGggQy1saW5rYWdlIHdlIG5lZWQgdG8gZGVmaW5lIGEgZnJlZSBDLWZ1bmN0aW9uIHRvCisvLyBwYXNzIGludG8gcHRocmVhZF9jcmVhdGUoKS4KK2V4dGVybiAiQyIgaW5saW5lIHZvaWQqIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2Uodm9pZCogdGhyZWFkKSB7CisgIHN0YXRpY19jYXN0PFRocmVhZFdpdGhQYXJhbUJhc2UqPih0aHJlYWQpLT5SdW4oKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG11bHRpLXRocmVhZGluZyBjb25zdHJ1Y3RzLgorLy8gVG8gdXNlIGl0LCB3cml0ZToKKy8vCisvLyAgIHZvaWQgVGhyZWFkRnVuYyhpbnQgcGFyYW0pIHsgLyogRG8gdGhpbmdzIHdpdGggcGFyYW0gKi8gfQorLy8gICBOb3RpZmljYXRpb24gdGhyZWFkX2Nhbl9zdGFydDsKKy8vICAgLi4uCisvLyAgIC8vIFRoZSB0aHJlYWRfY2FuX3N0YXJ0IHBhcmFtZXRlciBpcyBvcHRpb25hbDsgeW91IGNhbiBzdXBwbHkgTlVMTC4KKy8vICAgVGhyZWFkV2l0aFBhcmFtPGludD4gdGhyZWFkKCZUaHJlYWRGdW5jLCA1LCAmdGhyZWFkX2Nhbl9zdGFydCk7CisvLyAgIHRocmVhZF9jYW5fc3RhcnQuTm90aWZ5KCk7CisvLworLy8gVGhlc2UgY2xhc3NlcyBhcmUgb25seSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiBEbworLy8gbm90IHVzZSB0aGVtIGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUaHJlYWRXaXRoUGFyYW0gOiBwdWJsaWMgVGhyZWFkV2l0aFBhcmFtQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIHZvaWQgKCpVc2VyVGhyZWFkRnVuYykoVCk7CisKKyAgVGhyZWFkV2l0aFBhcmFtKAorICAgICAgVXNlclRocmVhZEZ1bmMgZnVuYywgVCBwYXJhbSwgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KQorICAgICAgOiBmdW5jXyhmdW5jKSwKKyAgICAgICAgcGFyYW1fKHBhcmFtKSwKKyAgICAgICAgdGhyZWFkX2Nhbl9zdGFydF8odGhyZWFkX2Nhbl9zdGFydCksCisgICAgICAgIGZpbmlzaGVkXyhmYWxzZSkgeworICAgIFRocmVhZFdpdGhQYXJhbUJhc2UqIGNvbnN0IGJhc2UgPSB0aGlzOworICAgIC8vIFRoZSB0aHJlYWQgY2FuIGJlIGNyZWF0ZWQgb25seSBhZnRlciBhbGwgZmllbGRzIGV4Y2VwdCB0aHJlYWRfCisgICAgLy8gaGF2ZSBiZWVuIGluaXRpYWxpemVkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkXywgMCwgJlRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UsIGJhc2UpKTsKKyAgfQorICB+VGhyZWFkV2l0aFBhcmFtKCkgeyBKb2luKCk7IH0KKworICB2b2lkIEpvaW4oKSB7CisgICAgaWYgKCFmaW5pc2hlZF8pIHsKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfam9pbih0aHJlYWRfLCAwKSk7CisgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBSdW4oKSB7CisgICAgaWYgKHRocmVhZF9jYW5fc3RhcnRfICE9IE5VTEwpCisgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xy0+V2FpdEZvck5vdGlmaWNhdGlvbigpOworICAgIGZ1bmNfKHBhcmFtXyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFVzZXJUaHJlYWRGdW5jIGZ1bmNfOyAgLy8gVXNlci1zdXBwbGllZCB0aHJlYWQgZnVuY3Rpb24uCisgIGNvbnN0IFQgcGFyYW1fOyAgLy8gVXNlci1zdXBwbGllZCBwYXJhbWV0ZXIgdG8gdGhlIHRocmVhZCBmdW5jdGlvbi4KKyAgLy8gV2hlbiBub24tTlVMTCwgdXNlZCB0byBibG9jayBleGVjdXRpb24gdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkCisgIC8vIG5vdGlmaWVzLgorICBOb3RpZmljYXRpb24qIGNvbnN0IHRocmVhZF9jYW5fc3RhcnRfOworICBib29sIGZpbmlzaGVkXzsgIC8vIHRydWUgaWZmIHdlIGtub3cgdGhhdCB0aGUgdGhyZWFkIGZ1bmN0aW9uIGhhcyBmaW5pc2hlZC4KKyAgcHRocmVhZF90IHRocmVhZF87ICAvLyBUaGUgbmF0aXZlIHRocmVhZCBvYmplY3QuCisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRXaXRoUGFyYW0pOworfTsKKworLy8gTXV0ZXhCYXNlIGFuZCBNdXRleCBpbXBsZW1lbnQgbXV0ZXggb24gcHRocmVhZHMtYmFzZWQgcGxhdGZvcm1zLiBUaGV5CisvLyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNsYXNzIE11dGV4TG9jazoKKy8vCisvLyAgIE11dGV4IG11dGV4OworLy8gICAuLi4KKy8vICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4KTsgIC8vIEFjcXVpcmVzIHRoZSBtdXRleCBhbmQgcmVsZWFzZXMgaXQgYXQgdGhlIGVuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgc2NvcGUuCisvLworLy8gTXV0ZXhCYXNlIGltcGxlbWVudHMgYmVoYXZpb3IgZm9yIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkKKy8vIGFsbG9jYXRlZCBtdXRleGVzLiAgRG8gbm90IHVzZSBNdXRleEJhc2UgZGlyZWN0bHkuICBJbnN0ZWFkLCB3cml0ZQorLy8gdGhlIGZvbGxvd2luZyB0byBkZWZpbmUgYSBzdGF0aWMgbXV0ZXg6CisvLworLy8gICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFlvdSBjYW4gZm9yd2FyZCBkZWNsYXJlIGEgc3RhdGljIG11dGV4IGxpa2UgdGhpczoKKy8vCisvLyAgIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8KKy8vIFRvIGNyZWF0ZSBhIGR5bmFtaWMgbXV0ZXgsIGp1c3QgZGVmaW5lIGFuIG9iamVjdCBvZiB0eXBlIE11dGV4LgorY2xhc3MgTXV0ZXhCYXNlIHsKKyBwdWJsaWM6CisgIC8vIEFjcXVpcmVzIHRoaXMgbXV0ZXguCisgIHZvaWQgTG9jaygpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm11dGV4XykpOworICAgIG93bmVyXyA9IHB0aHJlYWRfc2VsZigpOworICAgIGhhc19vd25lcl8gPSB0cnVlOworICB9CisKKyAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4KKyAgdm9pZCBVbmxvY2soKSB7CisgICAgLy8gU2luY2UgdGhlIGxvY2sgaXMgYmVpbmcgcmVsZWFzZWQgdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgbm8gbG9uZ2VyIGJlCisgICAgLy8gY29uc2lkZXJlZCB2YWxpZC4gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIGhhc19vd25lcl8gaGVyZSwgYXMgaXQncworICAgIC8vIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCisgICAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KKyAgICBoYXNfb3duZXJfID0gZmFsc2U7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4XykpOworICB9CisKKyAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcworICAvLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsKKyAgICBHVEVTVF9DSEVDS18oaGFzX293bmVyXyAmJiBwdGhyZWFkX2VxdWFsKG93bmVyXywgcHRocmVhZF9zZWxmKCkpKQorICAgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOworICB9CisKKyAgLy8gQSBzdGF0aWMgbXV0ZXggbWF5IGJlIHVzZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLiAgSXQgbWF5IGV2ZW4KKyAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UKKyAgLy8gbXVzdCBiZSBhYmxlIHRvIGluaXRpYWxpemUgYSBzdGF0aWMgbXV0ZXggb2JqZWN0IGF0IGxpbmsgdGltZS4KKyAgLy8gVGhpcyBtZWFucyBNdXRleEJhc2UgaGFzIHRvIGJlIGEgUE9EIGFuZCBpdHMgbWVtYmVyIHZhcmlhYmxlcworICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4KKyBwdWJsaWM6CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87ICAvLyBUaGUgdW5kZXJseWluZyBwdGhyZWFkIG11dGV4LgorICAvLyBoYXNfb3duZXJfIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvd25lcl8gZmllbGQgYmVsb3cgY29udGFpbnMgYSB2YWxpZCB0aHJlYWQKKyAgLy8gSUQgYW5kIGlzIHRoZXJlZm9yZSBzYWZlIHRvIGluc3BlY3QgKGUuZy4sIHRvIHVzZSBpbiBwdGhyZWFkX2VxdWFsKCkpLiBBbGwKKyAgLy8gYWNjZXNzZXMgdG8gdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IGEgY2hlY2sgb2YgdGhpcyBmaWVsZC4KKyAgLy8gQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gbWVtc2V0KCkgb3duZXJfIHRvIGFsbCB6ZXJvcywgYnV0IHRoZXJlJ3Mgbm8KKyAgLy8gZ3VhcmFudGVlIHRoYXQgYSB6ZXJvJ2QgcHRocmVhZF90IGlzIG5lY2Vzc2FyaWx5IGludmFsaWQgb3IgZXZlbiBkaWZmZXJlbnQKKyAgLy8gZnJvbSBwdGhyZWFkX3NlbGYoKS4KKyAgYm9vbCBoYXNfb3duZXJfOworICBwdGhyZWFkX3Qgb3duZXJfOyAgLy8gVGhlIHRocmVhZCBob2xkaW5nIHRoZSBtdXRleC4KK307CisKKy8vIEZvcndhcmQtZGVjbGFyZXMgYSBzdGF0aWMgbXV0ZXguCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4CisKKy8vIERlZmluZXMgYW5kIHN0YXRpY2FsbHkgKGkuZS4gYXQgbGluayB0aW1lKSBpbml0aWFsaXplcyBhIHN0YXRpYyBtdXRleC4KKy8vIFRoZSBpbml0aWFsaXphdGlvbiBsaXN0IGhlcmUgZG9lcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplIGVhY2ggZmllbGQsCisvLyBpbnN0ZWFkIHJlbHlpbmcgb24gZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHVuc3BlY2lmaWVkIGZpZWxkcy4gSW4KKy8vIHBhcnRpY3VsYXIsIHRoZSBvd25lcl8gZmllbGQgKGEgcHRocmVhZF90KSBpcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplZC4KKy8vIFRoaXMgYWxsb3dzIGluaXRpYWxpemF0aW9uIHRvIHdvcmsgd2hldGhlciBwdGhyZWFkX3QgaXMgYSBzY2FsYXIgb3Igc3RydWN0LgorLy8gVGhlIGZsYWcgLVdtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQgZm9yIHRoaXMgdG8gd29yay4KKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4ID0geyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCBmYWxzZSB9CisKKy8vIFRoZSBNdXRleCBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGZvciBtdXRleGVzIGNyZWF0ZWQgYXQgcnVudGltZS4gSXQKKy8vIHNoYXJlcyBpdHMgQVBJIHdpdGggTXV0ZXhCYXNlIG90aGVyd2lzZS4KK2NsYXNzIE11dGV4IDogcHVibGljIE11dGV4QmFzZSB7CisgcHVibGljOgorICBNdXRleCgpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOworICAgIGhhc19vd25lcl8gPSBmYWxzZTsKKyAgfQorICB+TXV0ZXgoKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNdXRleCk7Cit9OworCisvLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBhcyB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAorLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KK2NsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4QmFzZSogbXV0ZXgpCisgICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQorCisgIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXhCYXNlKiBjb25zdCBtdXRleF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdE11dGV4TG9jayk7Cit9OworCit0eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKKworLy8gSGVscGVycyBmb3IgVGhyZWFkTG9jYWwuCisKKy8vIHB0aHJlYWRfa2V5X2NyZWF0ZSgpIHJlcXVpcmVzIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB0byBoYXZlCisvLyBDLWxpbmthZ2UuICBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIHRlbXBsYXRpemVkIHRvIGFjY2VzcworLy8gVGhyZWFkTG9jYWw8VD4uICBIZW5jZSB0aGUgbmVlZCBmb3IgY2xhc3MKKy8vIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlLgorY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UoKSB7fQorfTsKKworLy8gQ2FsbGVkIGJ5IHB0aHJlYWQgdG8gZGVsZXRlIHRocmVhZC1sb2NhbCBkYXRhIHN0b3JlZCBieQorLy8gcHRocmVhZF9zZXRzcGVjaWZpYygpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHZvaWQqIHZhbHVlX2hvbGRlcikgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPih2YWx1ZV9ob2xkZXIpOworfQorCisvLyBJbXBsZW1lbnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlIG9uIHB0aHJlYWRzLWJhc2VkIHN5c3RlbXMuCisvLworLy8gICAvLyBUaHJlYWQgMQorLy8gICBUaHJlYWRMb2NhbDxpbnQ+IHRsKDEwMCk7ICAvLyAxMDAgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorLy8KKy8vICAgLy8gVGhyZWFkIDIKKy8vICAgdGwuc2V0KDE1MCk7ICAvLyBDaGFuZ2VzIHRoZSB2YWx1ZSBmb3IgdGhyZWFkIDIgb25seS4KKy8vICAgRVhQRUNUX0VRKDE1MCwgdGwuZ2V0KCkpOworLy8KKy8vICAgLy8gVGhyZWFkIDEKKy8vICAgRVhQRUNUX0VRKDEwMCwgdGwuZ2V0KCkpOyAgLy8gSW4gdGhyZWFkIDEsIHRsIGhhcyB0aGUgb3JpZ2luYWwgdmFsdWUuCisvLyAgIHRsLnNldCgyMDApOworLy8gICBFWFBFQ1RfRVEoMjAwLCB0bC5nZXQoKSk7CisvLworLy8gVGhlIHRlbXBsYXRlIHR5cGUgYXJndW1lbnQgVCBtdXN0IGhhdmUgYSBwdWJsaWMgY29weSBjb25zdHJ1Y3Rvci4KKy8vIEluIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCBUaHJlYWRMb2NhbCBjb25zdHJ1Y3RvciByZXF1aXJlcyBUIHRvIGhhdmUKKy8vIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuCisvLworLy8gQW4gb2JqZWN0IG1hbmFnZWQgZm9yIGEgdGhyZWFkIGJ5IGEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMgZGVsZXRlZAorLy8gd2hlbiB0aGUgdGhyZWFkIGV4aXRzLiAgT3IsIGlmIHRoZSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBkaWVzIGluCisvLyB0aGF0IHRocmVhZCwgd2hlbiB0aGUgVGhyZWFkTG9jYWwgZGllcy4gIEl0J3MgdGhlIHVzZXIncworLy8gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYWxsIG90aGVyIHRocmVhZHMgdXNpbmcgYSBUaHJlYWRMb2NhbAorLy8gaGF2ZSBleGl0ZWQgd2hlbiBpdCBkaWVzLCBvciB0aGUgcGVyLXRocmVhZCBvYmplY3RzIGZvciB0aG9zZQorLy8gdGhyZWFkcyB3aWxsIG5vdCBiZSBkZWxldGVkLgorLy8KKy8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQorLy8gd2lsbCBkaWUgYWZ0ZXIgbWFpbigpIGhhcyByZXR1cm5lZC4gIFRoZXJlZm9yZSwgbm8gcGVyLXRocmVhZAorLy8gb2JqZWN0IG1hbmFnZWQgYnkgR29vZ2xlIFRlc3Qgd2lsbCBiZSBsZWFrZWQgYXMgbG9uZyBhcyBhbGwgdGhyZWFkcworLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGhyZWFkTG9jYWwgeworIHB1YmxpYzoKKyAgVGhyZWFkTG9jYWwoKSA6IGtleV8oQ3JlYXRlS2V5KCkpLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdF8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiBrZXlfKENyZWF0ZUtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF8odmFsdWUpIHt9CisKKyAgflRocmVhZExvY2FsKCkgeworICAgIC8vIERlc3Ryb3lzIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBpZiBhbnkuCisgICAgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZShwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKworICAgIC8vIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4gIFRoaXMgd2lsbCAqbm90KgorICAgIC8vIGRlbGV0ZSBtYW5hZ2VkIG9iamVjdHMgZm9yIG90aGVyIHRocmVhZHMuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9rZXlfZGVsZXRlKGtleV8pKTsKKyAgfQorCisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KKyAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9CisgIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgLy8gSG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQuCisgIGNsYXNzIFZhbHVlSG9sZGVyIDogcHVibGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyAgICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQorCisgICBwcml2YXRlOgorICAgIFQgdmFsdWVfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOworICB9OworCisgIHN0YXRpYyBwdGhyZWFkX2tleV90IENyZWF0ZUtleSgpIHsKKyAgICBwdGhyZWFkX2tleV90IGtleTsKKyAgICAvLyBXaGVuIGEgdGhyZWFkIGV4aXRzLCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKCkgd2lsbCBiZSBjYWxsZWQgb24KKyAgICAvLyB0aGUgb2JqZWN0IG1hbmFnZWQgZm9yIHRoYXQgdGhyZWFkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmtleSwgJkRlbGV0ZVRocmVhZExvY2FsVmFsdWUpKTsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKyAgICBpZiAoaG9sZGVyICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8VmFsdWVIb2xkZXI+KGhvbGRlciktPnBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBWYWx1ZUhvbGRlciogY29uc3QgbmV3X2hvbGRlciA9IG5ldyBWYWx1ZUhvbGRlcihkZWZhdWx0Xyk7CisgICAgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIGNvbnN0IGhvbGRlcl9iYXNlID0gbmV3X2hvbGRlcjsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX3NldHNwZWNpZmljKGtleV8sIGhvbGRlcl9iYXNlKSk7CisgICAgcmV0dXJuIG5ld19ob2xkZXItPnBvaW50ZXIoKTsKKyAgfQorCisgIC8vIEEga2V5IHB0aHJlYWRzIHVzZXMgZm9yIGxvb2tpbmcgdXAgcGVyLXRocmVhZCB2YWx1ZXMuCisgIGNvbnN0IHB0aHJlYWRfa2V5X3Qga2V5XzsKKyAgY29uc3QgVCBkZWZhdWx0XzsgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4KKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZExvY2FsKTsKK307CisKKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMQorCisjZWxzZSAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAobXV0ZXgsIGxvY2ssCisvLyBhbmQgdGhyZWFkLWxvY2FsIHZhcmlhYmxlKS4gIE5lY2Vzc2FyeSBmb3IgY29tcGlsaW5nIEdvb2dsZSBUZXN0IHdoZXJlCisvLyBtdXRleCBpcyBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgR29vZ2xlIFRlc3QgaW4gbXVsdGlwbGUgdGhyZWFkcyBpcyBub3QKKy8vIHN1cHBvcnRlZCBvbiBzdWNoIHBsYXRmb3Jtcy4KKworY2xhc3MgTXV0ZXggeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7fQorICB2b2lkIExvY2soKSB7fQorICB2b2lkIFVubG9jaygpIHt9CisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHt9Cit9OworCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4CisKKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorCitjbGFzcyBHVGVzdE11dGV4TG9jayB7CisgcHVibGljOgorICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCopIHt9ICAvLyBOT0xJTlQKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgOiB2YWx1ZV8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKworLy8gVGhlIGFib3ZlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGhhdmUgZHVtbXkgaW1wbGVtZW50YXRpb25zLgorLy8gVGhlcmVmb3JlIEdvb2dsZSBUZXN0IGlzIG5vdCB0aHJlYWQtc2FmZS4KKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK0dURVNUX0FQSV8gc2l6ZV90IEdldFRocmVhZENvdW50KCk7CisKKy8vIFBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikgY3Jhc2hlcyB0aGUgQVJNCisvLyBjb21waWxlciBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBpbiBTdW4gU3R1ZGlvLiAgVGhlIE5va2lhIFN5bWJpYW4KKy8vIGFuZCB0aGUgSUJNIFhMIEMvQysrIGNvbXBpbGVyIHRyeSB0byBpbnN0YW50aWF0ZSBhIGNvcHkgY29uc3RydWN0b3IKKy8vIGZvciBvYmplY3RzIHBhc3NlZCB0aHJvdWdoIGVsbGlwc2lzICguLi4pLCBmYWlsaW5nIGZvciB1bmNvcHlhYmxlCisvLyBvYmplY3RzLiAgV2UgZGVmaW5lIHRoaXMgdG8gZW5zdXJlIHRoYXQgb25seSBQT0QgaXMgcGFzc2VkIHRocm91Z2gKKy8vIGVsbGlwc2lzIG9uIHRoZXNlIHN5c3RlbXMuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBXZSBsb3NlIHN1cHBvcnQgZm9yIE5VTEwgZGV0ZWN0aW9uIHdoZXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UKKy8vIHBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikuCisjIGRlZmluZSBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfIDEKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIDEKKyNlbmRpZgorCisvLyBUaGUgTm9raWEgU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIGNvbXBpbGVycyBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKy8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgVGhlc2UgY29tcGlsZXJzCisvLyBfY2FuXyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLAorLy8gc28gYSB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3Jrcy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKKyMgZGVmaW5lIEdURVNUX05FRURTX0lTX1BPSU5URVJfIDEKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPgorc3RydWN0IGJvb2xfY29uc3RhbnQgeworICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT4gdHlwZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBib29sX3ZhbHVlOworfTsKK3RlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+IGNvbnN0IGJvb2wgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPjo6dmFsdWU7CisKK3R5cGVkZWYgYm9vbF9jb25zdGFudDxmYWxzZT4gZmFsc2VfdHlwZTsKK3R5cGVkZWYgYm9vbF9jb25zdGFudDx0cnVlPiB0cnVlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3BvaW50ZXIgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfcG9pbnRlcjxUKj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CitzdHJ1Y3QgSXRlcmF0b3JUcmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIEl0ZXJhdG9yOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJdGVyYXRvclRyYWl0czxUKj4geworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEl0ZXJhdG9yVHJhaXRzPGNvbnN0IFQqPiB7CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiXFwiCisjIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAxCisvLyBUaGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlIHRoZSBjb21waWxlciBzdXBwb3J0cy4KK3R5cGVkZWYgX19pbnQ2NCBCaWdnZXN0SW50OworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiLyIKKyMgZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDAKK3R5cGVkZWYgbG9uZyBsb25nIEJpZ2dlc3RJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXRpZXMgZm9yIGNoYXIuCisKKy8vIGlzc3BhY2UoaW50IGNoKSBhbmQgZnJpZW5kcyBhY2NlcHQgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuICBjaGFyCisvLyBtYXkgYmUgc2lnbmVkLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyIChvciBjb21waWxlciBmbGFncykuCisvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjYXN0IGEgY2hhciB0byB1bnNpZ25lZCBjaGFyIGJlZm9yZSBjYWxsaW5nCisvLyBpc3NwYWNlKCksIGV0Yy4KKworaW5saW5lIGJvb2wgSXNBbHBoYShjaGFyIGNoKSB7CisgIHJldHVybiBpc2FscGhhKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzQWxOdW0oY2hhciBjaCkgeworICByZXR1cm4gaXNhbG51bShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc0RpZ2l0KGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNMb3dlcihjaGFyIGNoKSB7CisgIHJldHVybiBpc2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzU3BhY2UoY2hhciBjaCkgeworICByZXR1cm4gaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc1VwcGVyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQoY2hhciBjaCkgeworICByZXR1cm4gaXN4ZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQod2NoYXJfdCBjaCkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyIGxvd19ieXRlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpOworICByZXR1cm4gY2ggPT0gbG93X2J5dGUgJiYgaXN4ZGlnaXQobG93X2J5dGUpICE9IDA7Cit9CisKK2lubGluZSBjaGFyIFRvTG93ZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG9sb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KK2lubGluZSBjaGFyIFRvVXBwZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG91cHBlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KKworLy8gVGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeCBuYW1lc3BhY2UgaG9sZHMgd3JhcHBlcnMgZm9yIGNvbW1vbgorLy8gUE9TSVggZnVuY3Rpb25zLiAgVGhlc2Ugd3JhcHBlcnMgaGlkZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorLy8gV2luZG93cy9NU1ZDIGFuZCBQT1NJWCBzeXN0ZW1zLiAgU2luY2Ugc29tZSBjb21waWxlcnMgZGVmaW5lIHRoZXNlCisvLyBzdGFuZGFyZCBmdW5jdGlvbnMgYXMgbWFjcm9zLCB0aGUgd3JhcHBlciBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lCisvLyBhcyB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KKworbmFtZXNwYWNlIHBvc2l4IHsKKworLy8gRnVuY3Rpb25zIHdpdGggYSBkaWZmZXJlbnQgbmFtZSBvbiBXaW5kb3dzLgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCit0eXBlZGVmIHN0cnVjdCBfc3RhdCBTdGF0U3RydWN0OworCisjIGlmZGVmIF9fQk9STEFORENfXworaW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBzdHJpY21wKHMxLCBzMik7Cit9CitpbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gc3RyZHVwKHNyYyk7IH0KKyMgZWxzZSAgLy8gIV9fQk9STEFORENfXworIyAgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgSXNBVFRZKGludCAvKiBmZCAqLykgeyByZXR1cm4gMDsgfQorIyAgZWxzZQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBfaXNhdHR5KGZkKTsgfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBfc3RyaWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIF9zdHJkdXAoc3JjKTsgfQorIyBlbmRpZiAgLy8gX19CT1JMQU5EQ19fCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50PihfZmlsZW5vKGZpbGUpKTsgfQorLy8gU3RhdCgpLCBSbURpcigpLCBhbmQgSXNEaXIoKSBhcmUgbm90IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMKKy8vIHRpbWUgYW5kIHRodXMgbm90IGRlZmluZWQgdGhlcmUuCisjIGVsc2UKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIF9maWxlbm8oZmlsZSk7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIF9zdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBfcm1kaXIoZGlyKTsgfQoraW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsKKyAgcmV0dXJuIChfU19JRkRJUiAmIHN0LnN0X21vZGUpICE9IDA7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjZWxzZQorCit0eXBlZGVmIHN0cnVjdCBzdGF0IFN0YXRTdHJ1Y3Q7CisKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIGZpbGVubyhmaWxlKTsgfQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0YXQoY29uc3QgY2hhciogcGF0aCwgU3RhdFN0cnVjdCogYnVmKSB7IHJldHVybiBzdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIHN0cmNhc2VjbXAoczEsIHMyKTsKK30KK2lubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQoraW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIHJtZGlyKGRpcik7IH0KK2lubGluZSBib29sIElzRGlyKGNvbnN0IFN0YXRTdHJ1Y3QmIHN0KSB7IHJldHVybiBTX0lTRElSKHN0LnN0X21vZGUpOyB9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBGdW5jdGlvbnMgZGVwcmVjYXRlZCBieSBNU1ZDIDguMC4KKworI2lmZGVmIF9NU0NfVkVSCisvLyBUZW1wb3JhcmlseSBkaXNhYmxlIHdhcm5pbmcgNDk5NiAoZGVwcmVjYXRlZCBmdW5jdGlvbikuCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCitpbmxpbmUgY29uc3QgY2hhciogU3RyTkNweShjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHNpemVfdCBuKSB7CisgIHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7Cit9CisKKy8vIENoRGlyKCksIEZSZW9wZW4oKSwgRkRPcGVuKCksIFJlYWQoKSwgV3JpdGUoKSwgQ2xvc2UoKSwgYW5kCisvLyBTdHJFcnJvcigpIGFyZW4ndCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzIHRpbWUgYW5kIHRodXMgbm90CisvLyBkZWZpbmVkIHRoZXJlLgorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IENoRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gY2hkaXIoZGlyKTsgfQorI2VuZGlmCitpbmxpbmUgRklMRSogRk9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgeworICByZXR1cm4gZm9wZW4ocGF0aCwgbW9kZSk7Cit9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgRklMRSAqRlJlb3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlLCBGSUxFKiBzdHJlYW0pIHsKKyAgcmV0dXJuIGZyZW9wZW4ocGF0aCwgbW9kZSwgc3RyZWFtKTsKK30KK2lubGluZSBGSUxFKiBGRE9wZW4oaW50IGZkLCBjb25zdCBjaGFyKiBtb2RlKSB7IHJldHVybiBmZG9wZW4oZmQsIG1vZGUpOyB9CisjZW5kaWYKK2lubGluZSBpbnQgRkNsb3NlKEZJTEUqIGZwKSB7IHJldHVybiBmY2xvc2UoZnApOyB9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFJlYWQoaW50IGZkLCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihyZWFkKGZkLCBidWYsIGNvdW50KSk7Cit9CitpbmxpbmUgaW50IFdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4od3JpdGUoZmQsIGJ1ZiwgY291bnQpKTsKK30KK2lubGluZSBpbnQgQ2xvc2UoaW50IGZkKSB7IHJldHVybiBjbG9zZShmZCk7IH0KK2lubGluZSBjb25zdCBjaGFyKiBTdHJFcnJvcihpbnQgZXJybnVtKSB7IHJldHVybiBzdHJlcnJvcihlcnJudW0pOyB9CisjZW5kaWYKK2lubGluZSBjb25zdCBjaGFyKiBHZXRFbnYoY29uc3QgY2hhciogbmFtZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLCB3aGljaCBoYXMgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICByZXR1cm4gTlVMTDsKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQorICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggd2UgcHJvZ3JhbW1hdGljYWxseSBjbGVhciB3aWxsIGJlIHNldCB0byB0aGUKKyAgLy8gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHVuc2V0IChOVUxMKS4gIEhhbmRsZSB0aGF0IGNhc2UuCisgIGNvbnN0IGNoYXIqIGNvbnN0IGVudiA9IGdldGVudihuYW1lKTsKKyAgcmV0dXJuIChlbnYgIT0gTlVMTCAmJiBlbnZbMF0gIT0gJ1wwJykgPyBlbnYgOiBOVUxMOworI2Vsc2UKKyAgcmV0dXJuIGdldGVudihuYW1lKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBXaW5kb3dzIENFIGhhcyBubyBDIGxpYnJhcnkuIFRoZSBhYm9ydCgpIGZ1bmN0aW9uIGlzIHVzZWQgaW4KKy8vIHNldmVyYWwgcGxhY2VzIGluIEdvb2dsZSBUZXN0LiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgcmVhc29uYWJsZQorLy8gaW1pdGF0aW9uIG9mIHN0YW5kYXJkIGJlaGF2aW91ci4KK3ZvaWQgQWJvcnQoKTsKKyNlbHNlCitpbmxpbmUgdm9pZCBBYm9ydCgpIHsgYWJvcnQoKTsgfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCit9ICAvLyBuYW1lc3BhY2UgcG9zaXgKKworLy8gTVNWQyAiZGVwcmVjYXRlcyIgc25wcmludGYgYW5kIGlzc3VlcyB3YXJuaW5ncyB3aGVyZXZlciBpdCBpcyB1c2VkLiAgSW4KKy8vIG9yZGVyIHRvIGF2b2lkIHRoZXNlIHdhcm5pbmdzLCB3ZSBuZWVkIHRvIHVzZSBfc25wcmludGYgb3IgX3NucHJpbnRmX3Mgb24KKy8vIE1TVkMtYmFzZWQgcGxhdGZvcm1zLiAgV2UgbWFwIHRoZSBHVEVTVF9TTlBSSU5URl8gbWFjcm8gdG8gdGhlIGFwcHJvcHJpYXRlCisvLyBmdW5jdGlvbiBpbiBvcmRlciB0byBhY2hpZXZlIHRoYXQuICBXZSB1c2UgbWFjcm8gZGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UKKy8vIHNucHJpbnRmIGlzIGEgdmFyaWFkaWMgZnVuY3Rpb24uCisjaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIE1TVkMgMjAwNSBhbmQgYWJvdmUgc3VwcG9ydCB2YXJpYWRpYyBtYWNyb3MuCisjIGRlZmluZSBHVEVTVF9TTlBSSU5URl8oYnVmZmVyLCBzaXplLCBmb3JtYXQsIC4uLikgXAorICAgICBfc25wcmludGZfcyhidWZmZXIsIHNpemUsIHNpemUsIGZvcm1hdCwgX19WQV9BUkdTX18pCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gV2luZG93cyBDRSBkb2VzIG5vdCBkZWZpbmUgX3NucHJpbnRmX3MgYW5kIE1TVkMgcHJpb3IgdG8gMjAwNSBkb2Vzbid0CisvLyBjb21wbGFpbiBhYm91dCBfc25wcmludGYuCisjIGRlZmluZSBHVEVTVF9TTlBSSU5URl8gX3NucHJpbnRmCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIHNucHJpbnRmCisjZW5kaWYKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIGEgQmlnZ2VzdEludCBjYW4gcmVwcmVzZW50LiAgVGhpcyBkZWZpbml0aW9uCisvLyB3b3JrcyBubyBtYXR0ZXIgQmlnZ2VzdEludCBpcyByZXByZXNlbnRlZCBpbiBvbmUncyBjb21wbGVtZW50IG9yCisvLyB0d28ncyBjb21wbGVtZW50LgorLy8KKy8vIFdlIGNhbm5vdCByZWx5IG9uIG51bWVyaWNfbGltaXRzIGluIFNUTCwgYXMgX19pbnQ2NCBhbmQgbG9uZyBsb25nCisvLyBhcmUgbm90IHBhcnQgb2Ygc3RhbmRhcmQgQysrIGFuZCBudW1lcmljX2xpbWl0cyBkb2Vzbid0IG5lZWQgdG8gYmUKKy8vIGRlZmluZWQgZm9yIHRoZW0uCitjb25zdCBCaWdnZXN0SW50IGtNYXhCaWdnZXN0SW50ID0KKyAgICB+KHN0YXRpY19jYXN0PEJpZ2dlc3RJbnQ+KDEpIDw8ICg4KnNpemVvZihCaWdnZXN0SW50KSAtIDEpKTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBzZXJ2ZXMgYXMgYSBjb21waWxlLXRpbWUgZnVuY3Rpb24gZnJvbSBzaXplIHRvCisvLyB0eXBlLiAgSXQgbWFwcyBhIHNpemUgaW4gYnl0ZXMgdG8gYSBwcmltaXRpdmUgdHlwZSB3aXRoIHRoYXQKKy8vIHNpemUuIGUuZy4KKy8vCisvLyAgIFR5cGVXaXRoU2l6ZTw0Pjo6VUludAorLy8KKy8vIGlzIHR5cGVkZWYtZWQgdG8gYmUgdW5zaWduZWQgaW50ICh1bnNpZ25lZCBpbnRlZ2VyIG1hZGUgdXAgb2YgNAorLy8gYnl0ZXMpLgorLy8KKy8vIFN1Y2ggZnVuY3Rpb25hbGl0eSBzaG91bGQgYmVsb25nIHRvIFNUTCwgYnV0IEkgY2Fubm90IGZpbmQgaXQKKy8vIHRoZXJlLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhpcyBjbGFzcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgZmxvYXRpbmctcG9pbnQKKy8vIGNvbXBhcmlzb24uCisvLworLy8gRm9yIG5vdyBpdCBvbmx5IGhhbmRsZXMgVUludCAodW5zaWduZWQgaW50KSBhcyB0aGF0J3MgYWxsIEdvb2dsZSBUZXN0CisvLyBuZWVkcy4gIE90aGVyIHR5cGVzIGNhbiBiZSBlYXNpbHkgYWRkZWQgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkCisvLyBhcmlzZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IHNpemU+CitjbGFzcyBUeXBlV2l0aFNpemUgeworIHB1YmxpYzoKKyAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIHVzaW5nIFR5cGVXaXRoU2l6ZTxOPiB3aXRoIGluY29ycmVjdAorICAvLyB2YWx1ZXMgb2YgTi4KKyAgdHlwZWRlZiB2b2lkIFVJbnQ7Cit9OworCisvLyBUaGUgc3BlY2lhbGl6YXRpb24gZm9yIHNpemUgNC4KK3RlbXBsYXRlIDw+CitjbGFzcyBUeXBlV2l0aFNpemU8ND4geworIHB1YmxpYzoKKyAgLy8gdW5zaWduZWQgaW50IGhhcyBzaXplIDQgaW4gYm90aCBnY2MgYW5kIE1TVkMuCisgIC8vCisgIC8vIEFzIGJhc2UvYmFzaWN0eXBlcy5oIGRvZXNuJ3QgY29tcGlsZSBvbiBXaW5kb3dzLCB3ZSBjYW5ub3QgdXNlCisgIC8vIHVpbnQzMiwgdWludDY0LCBhbmQgZXRjIGhlcmUuCisgIHR5cGVkZWYgaW50IEludDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUludDsKK307CisKKy8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA4LgordGVtcGxhdGUgPD4KK2NsYXNzIFR5cGVXaXRoU2l6ZTw4PiB7CisgcHVibGljOgorI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgdHlwZWRlZiBfX2ludDY0IEludDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJbnQ7CisjZWxzZQorICB0eXBlZGVmIGxvbmcgbG9uZyBJbnQ7ICAvLyBOT0xJTlQKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDsgIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9OworCisvLyBJbnRlZ2VyIHR5cGVzIG9mIGtub3duIHNpemVzLgordHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OkludCBJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDQ+OjpVSW50IFVJbnQzMjsKK3R5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6VUludCBVSW50NjQ7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6SW50IFRpbWVJbk1pbGxpczsgIC8vIFJlcHJlc2VudHMgdGltZSBpbiBtaWxsaXNlY29uZHMuCisKKy8vIFV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIGZsYWdzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKy8vIE1hY3JvIGZvciByZWZlcmVuY2luZyBmbGFncy4KKyNkZWZpbmUgR1RFU1RfRkxBRyhuYW1lKSBGTEFHU19ndGVzdF8jI25hbWUKKworLy8gTWFjcm9zIGZvciBkZWNsYXJpbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkgR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKKyAgICBHVEVTVF9BUElfIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpCisjZGVmaW5lIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCisgICAgR1RFU1RfQVBJXyBleHRlcm4gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpCisKKy8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyBib29sIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgR1RFU1RfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorCisvLyBUaHJlYWQgYW5ub3RhdGlvbnMKKyNkZWZpbmUgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGxvY2tzKQorI2RlZmluZSBHVEVTVF9MT0NLX0VYQ0xVREVEXyhsb2NrcykKKworLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcyB0aGUgcmVzdWx0CisvLyB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUgdW5jaGFuZ2VkIGFuZCByZXR1cm5zCisvLyBmYWxzZS4KKy8vIFRPRE8oY2hhbmRsZXJjKTogRmluZCBhIGJldHRlciB3YXkgdG8gcmVmYWN0b3IgZmxhZyBhbmQgZW52aXJvbm1lbnQgcGFyc2luZworLy8gb3V0IG9mIGJvdGggZ3Rlc3QtcG9ydC5jYyBhbmQgZ3Rlc3QuY2MgdG8gYXZvaWQgZXhwb3J0aW5nIHRoaXMgdXRpbGl0eQorLy8gZnVuY3Rpb24uCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgYm9vbC9JbnQzMi9zdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbCk7CitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsKTsKK2NvbnN0IGNoYXIqIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbCk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKworI2lmIEdURVNUX09TX0xJTlVYCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNldD4KKworLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyB0aGUgU3RyaW5nIGNsYXNzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiBUaGV5IHNob3VsZCBub3QgdXNlZAorLy8gYnkgY29kZSBleHRlcm5hbCB0byBHb29nbGUgVGVzdC4KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGlzICNpbmNsdWRlZCBieSA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4uCisvLyBJdCBzaG91bGQgbm90IGJlICNpbmNsdWRlZCBieSBvdGhlciBmaWxlcy4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1NUUklOR19IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1NUUklOR19IXworCisjaWZkZWYgX19CT1JMQU5EQ19fCisvLyBzdHJpbmcuaCBpcyBub3QgZ3VhcmFudGVlZCB0byBwcm92aWRlIHN0cmNweSBvbiBDKysgQnVpbGRlci4KKyMgaW5jbHVkZSA8bWVtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTdHJpbmcgLSBhbiBhYnN0cmFjdCBjbGFzcyBob2xkaW5nIHN0YXRpYyBzdHJpbmcgdXRpbGl0aWVzLgorY2xhc3MgR1RFU1RfQVBJXyBTdHJpbmcgeworIHB1YmxpYzoKKyAgLy8gU3RhdGljIHV0aWxpdHkgbWV0aG9kcworCisgIC8vIENsb25lcyBhIDAtdGVybWluYXRlZCBDIHN0cmluZywgYWxsb2NhdGluZyBtZW1vcnkgdXNpbmcgbmV3LiAgVGhlCisgIC8vIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybiB2YWx1ZSB1c2luZworICAvLyBkZWxldGVbXS4gIFJldHVybnMgdGhlIGNsb25lZCBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlIGlucHV0IGlzCisgIC8vIE5VTEwuCisgIC8vCisgIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gc3RyZHVwKCkgaW4gc3RyaW5nLmgsIHdoaWNoIGFsbG9jYXRlcworICAvLyBtZW1vcnkgdXNpbmcgbWFsbG9jKCkuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogY19zdHIpOworCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIHRoZSAnQU5TSScgdmVyc2lvbnMgb2YgV2luMzIgQVBJcy4gVG8gYmUKKyAgLy8gYWJsZSB0byBwYXNzIHN0cmluZ3MgdG8gV2luMzIgQVBJcyBvbiBDRSB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlbQorICAvLyB0byAnVW5pY29kZScsIFVURi0xNi4KKworICAvLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nCisgIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKyAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorICAvLyBpbnB1dCBpcyBOVUxMLgorICAvLworICAvLyBUaGUgd2lkZSBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bworICAvLyBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBTlNJIHZlcnNpb25zIG9mIFdpbjMyIGNhbGxzIGFuZCB0aGUKKyAgLy8gQyBydW50aW1lLgorICBzdGF0aWMgTFBDV1NUUiBBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBjX3N0cik7CisKKyAgLy8gQ3JlYXRlcyBhbiBBTlNJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiB3aWRlIHN0cmluZywgYWxsb2NhdGluZworICAvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisgIC8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKyAgLy8gaW5wdXQgaXMgTlVMTC4KKyAgLy8KKyAgLy8gVGhlIHJldHVybmVkIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCisgIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQorICAvLyBDIHJ1bnRpbWUuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBVdGYxNlRvQW5zaShMUENXU1RSIHV0ZjE2X3N0cik7CisjZW5kaWYKKworICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKyAgLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKTsKKworICAvLyBDb252ZXJ0cyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBTdHJpbmcgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICAvLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nCisgIC8vIHRoZSBjb252ZXJzaW9uLCAiKGZhaWxlZCB0byBjb252ZXJ0IGZyb20gd2lkZSBzdHJpbmcpIiBpcworICAvLyByZXR1cm5lZC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQorICAvLyBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQorICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIHN0YXRpYyBib29sIFdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3Qgd2NoYXJfdCogcmhzKTsKKworICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5CisgIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHN0cmNhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCisgIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHMpOworCisgIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQorICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgorICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIHdpZGUgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4KKyAgLy8gT24gd2luZG93cywgdGhpcyBtZXRob2QgdXNlcyBfd2NzaWNtcCB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUKKyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXAKKyAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgLy8gT24gTWFjT1MgWCwgaXQgdXNlcyB0b3dsb3dlciwgd2hpY2ggYWxzbyB1c2VzIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZQorICAvLyBjdXJyZW50IGxvY2FsZS4KKyAgc3RhdGljIGJvb2wgQ2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcKKyAgLy8gY2FzZS4gQW55IHN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGFuIGVtcHR5IHN1ZmZpeC4KKyAgc3RhdGljIGJvb2wgRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKKworICAvLyBGb3JtYXRzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYW4gc3RkOjpzdHJpbmcsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdAorICAvLyBzcGVjIHN0cmluZyBhcyBmb3IgcHJpbnRmLgorICAvLworICAvLyBXZSBkbyBub3QgdXNlIHRoZSBTdHJpbmdQcmludGYgY2xhc3MgYXMgaXQgaXMgbm90IHVuaXZlcnNhbGx5CisgIC8vIGF2YWlsYWJsZS4KKyAgLy8KKyAgLy8gVGhlIHJlc3VsdCBpcyBsaW1pdGVkIHRvIDQwOTYgY2hhcmFjdGVycyAoaW5jbHVkaW5nIHRoZSB0YWlsaW5nCisgIC8vIDApLiAgSWYgNDA5NiBjaGFyYWN0ZXJzIGFyZSBub3QgZW5vdWdoIHRvIGZvcm1hdCB0aGUgaW5wdXQsCisgIC8vICI8YnVmZmVyIGV4Y2VlZGVkPiIgaXMgcmV0dXJuZWQuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworCisgcHJpdmF0ZToKKyAgU3RyaW5nKCk7ICAvLyBOb3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkLgorfTsgIC8vIGNsYXNzIFN0cmluZworCisvLyBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBzdHJpbmdzdHJlYW0ncyBidWZmZXIgYXMgYW4gc3RkOjpzdHJpbmcuICBFYWNoICdcMCcKKy8vIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHN0cmVhbSk7CisKKy8vIENvbnZlcnRzIGEgc3RyZWFtYWJsZSB2YWx1ZSB0byBhbiBzdGQ6OnN0cmluZy4gIEEgTlVMTCBwb2ludGVyIGlzCisvLyBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBXaGVuIHRoZSBpbnB1dCB2YWx1ZSBpcyBhIDo6c3RyaW5nLAorLy8gOjpzdGQ6OnN0cmluZywgOjp3c3RyaW5nLCBvciA6OnN0ZDo6d3N0cmluZyBvYmplY3QsIGVhY2ggTlVMCisvLyBjaGFyYWN0ZXIgaW4gaXQgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KKworLy8gRGVjbGFyZWQgaGVyZSBidXQgZGVmaW5lZCBpbiBndGVzdC5oLCBzbyB0aGF0IGl0IGhhcyBhY2Nlc3MKKy8vIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBNZXNzYWdlIGNsYXNzLCByZXF1aXJlZCBieSB0aGUgQVJNCisvLyBjb21waWxlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKGNvbnN0IFQmIHN0cmVhbWFibGUpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBHb29nbGUgVGVzdCBmaWxlcGF0aCB1dGlsaXRpZXMKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBpbiA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4uCisvLyBEbyBub3QgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlIHNlcGFyYXRlbHkhCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRmlsZVBhdGggLSBhIGNsYXNzIGZvciBmaWxlIGFuZCBkaXJlY3RvcnkgcGF0aG5hbWUgbWFuaXB1bGF0aW9uIHdoaWNoCisvLyBoYW5kbGVzIHBsYXRmb3JtLXNwZWNpZmljIGNvbnZlbnRpb25zIChsaWtlIHRoZSBwYXRobmFtZSBzZXBhcmF0b3IpLgorLy8gVXNlZCBmb3IgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFtaW5nIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciB4bWwgb3V0cHV0LgorLy8gRXhjZXB0IGZvciBTZXQgbWV0aG9kcywgYWxsIG1ldGhvZHMgYXJlIGNvbnN0IG9yIHN0YXRpYywgd2hpY2ggcHJvdmlkZXMgYW4KKy8vICJpbW11dGFibGUgdmFsdWUgb2JqZWN0IiAtLSB1c2VmdWwgZm9yIHBlYWNlIG9mIG1pbmQuCisvLyBBIEZpbGVQYXRoIHdpdGggYSB2YWx1ZSBlbmRpbmcgaW4gYSBwYXRoIHNlcGFyYXRvciAoImxpa2UvdGhpcy8iKSByZXByZXNlbnRzCisvLyBhIGRpcmVjdG9yeSwgb3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGEgZmlsZS4gSW4gZWl0aGVyIGNhc2UsCisvLyBpdCBtYXkgb3IgbWF5IG5vdCByZXByZXNlbnQgYW4gYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5IGluIHRoZSBmaWxlIHN5c3RlbS4KKy8vIE5hbWVzIGFyZSBOT1QgY2hlY2tlZCBmb3Igc3ludGF4IGNvcnJlY3RuZXNzIC0tIG5vIGNoZWNraW5nIGZvciBpbGxlZ2FsCisvLyBjaGFyYWN0ZXJzLCBtYWxmb3JtZWQgcGF0aHMsIGV0Yy4KKworY2xhc3MgR1RFU1RfQVBJXyBGaWxlUGF0aCB7CisgcHVibGljOgorICBGaWxlUGF0aCgpIDogcGF0aG5hbWVfKCIiKSB7IH0KKyAgRmlsZVBhdGgoY29uc3QgRmlsZVBhdGgmIHJocykgOiBwYXRobmFtZV8ocmhzLnBhdGhuYW1lXykgeyB9CisKKyAgZXhwbGljaXQgRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhuYW1lKSA6IHBhdGhuYW1lXyhwYXRobmFtZSkgeworICAgIE5vcm1hbGl6ZSgpOworICB9CisKKyAgRmlsZVBhdGgmIG9wZXJhdG9yPShjb25zdCBGaWxlUGF0aCYgcmhzKSB7CisgICAgU2V0KHJocyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBTZXQoY29uc3QgRmlsZVBhdGgmIHJocykgeworICAgIHBhdGhuYW1lXyA9IHJocy5wYXRobmFtZV87CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfOyB9CisgIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciAiIiBpZiB1bnN1Y2Nlc3NmdWwuCisgIHN0YXRpYyBGaWxlUGF0aCBHZXRDdXJyZW50RGlyKCk7CisKKyAgLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKKyAgLy8gZXh0ZW5zaW9uID0gInhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuIElmIG51bWJlciBpcyBncmVhdGVyCisgIC8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorICBzdGF0aWMgRmlsZVBhdGggTWFrZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbik7CisKKyAgLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIHJlbGF0aXZlX3BhdGggPSAidGVzdC54bWwiLAorICAvLyByZXR1cm5zICJkaXIvdGVzdC54bWwiLgorICAvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorICBzdGF0aWMgRmlsZVBhdGggQ29uY2F0UGF0aHMoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiByZWxhdGl2ZV9wYXRoKTsKKworICAvLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCisgIC8vIHdpbGwgYmUgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24gb3IKKyAgLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24KKyAgLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCisgIC8vIHRoYXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4KKyAgLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcworICAvLyBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lIC0tIHRoZXkgY291bGQgYm90aCBwaWNrIHRoZSBzYW1lIGZpbGVuYW1lLgorICBzdGF0aWMgRmlsZVBhdGggR2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhdGggaXMgIiIuCisgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXy5lbXB0eSgpOyB9CisKKyAgLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmVzIGl0IGFuZCByZXR1cm5zCisgIC8vIHRoZSBuYW1lLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBuYW1lIHN0cmluZyB1bm1vZGlmaWVkLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgorICBGaWxlUGF0aCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4KKyAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucworICAvLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdAorICAvLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCisgIEZpbGVQYXRoIFJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdDsKKworICAvLyBSZW1vdmVGaWxlTmFtZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCB3aXRoIHRoZSBmaWxlbmFtZSByZW1vdmVkLgorICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCisgIC8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKKyAgLy8gRmlsZVBhdGgoIi4vIikgb3IsIG9uIFdpbmRvd3MsIEZpbGVQYXRoKCIuXFwiKS4gSWYgdGhlIGZpbGVwYXRoIGRvZXMKKyAgLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCisgIEZpbGVQYXRoIFJlbW92ZUZpbGVOYW1lKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIHJlbW92ZWQuCisgIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKKyAgLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90CisgIC8vIGZvdW5kLCByZXR1cm5zIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRmlsZVBhdGguCisgIEZpbGVQYXRoIFJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0OworCisgIC8vIENyZWF0ZXMgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKKyAgLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZQorICAvLyBkaXJlY3RvcmllcyBmb3IgYW55IHJlYXNvbi4gV2lsbCBhbHNvIHJldHVybiBmYWxzZSBpZiB0aGUgRmlsZVBhdGggZG9lcworICAvLyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5ICh0aGF0IGlzLCBpdCBkb2Vzbid0IGVuZCB3aXRoIGEgcGF0aCBzZXBhcmF0b3IpLgorICBib29sIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBjb25zdDsKKworICAvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgorICAvLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCisgIC8vIGRpcmVjdG9yeSBmb3IgYW55IHJlYXNvbiwgaW5jbHVkaW5nIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGRvZXMgbm90CisgIC8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgorICBib29sIENyZWF0ZUZvbGRlcigpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBkZXNjcmliZXMgc29tZXRoaW5nIGluIHRoZSBmaWxlLXN5c3RlbSwKKyAgLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlciwgYW5kIHRoYXQgc29tZXRoaW5nIGV4aXN0cy4KKyAgYm9vbCBGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQorICAvLyB0aGF0IGV4aXN0cy4KKyAgYm9vbCBEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIHdoaWNoIGluZGljYXRlcyB0aGF0CisgIC8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgIC8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgorICBib29sIElzRGlyZWN0b3J5KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCisgIC8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKKyAgYm9vbCBJc1Jvb3REaXJlY3RvcnkoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGFuIGFic29sdXRlIHBhdGguCisgIGJvb2wgSXNBYnNvbHV0ZVBhdGgoKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFJlcGxhY2VzIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3IuCisgIC8vIEZvciBleGFtcGxlLCAiYmFyLy8vZm9vIiBiZWNvbWVzICJiYXIvZm9vIi4gRG9lcyBub3QgZWxpbWluYXRlIG90aGVyCisgIC8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgorICAvLworICAvLyBBIHBhdGhuYW1lIHdpdGggbXVsdGlwbGUgY29uc2VjdXRpdmUgc2VwYXJhdG9ycyBtYXkgb2NjdXIgZWl0aGVyIHRocm91Z2gKKyAgLy8gdXNlciBlcnJvciBvciBhcyBhIHJlc3VsdCBvZiBzb21lIHNjcmlwdHMgb3IgQVBJcyB0aGF0IGdlbmVyYXRlIGEgcGF0aG5hbWUKKyAgLy8gd2l0aCBhIHRyYWlsaW5nIHNlcGFyYXRvci4gT24gb3RoZXIgcGxhdGZvcm1zIHRoZSBzYW1lIEFQSSBvciBzY3JpcHQKKyAgLy8gbWF5IE5PVCBnZW5lcmF0ZSBhIHBhdGhuYW1lIHdpdGggYSB0cmFpbGluZyAiLyIuIFRoZW4gZWxzZXdoZXJlIHRoYXQKKyAgLy8gcGF0aG5hbWUgbWF5IGhhdmUgYW5vdGhlciAiLyIgYW5kIHBhdGhuYW1lIGNvbXBvbmVudHMgYWRkZWQgdG8gaXQsCisgIC8vIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHRoZSBzZXBhcmF0b3IgYWxyZWFkeSBiZWluZyB0aGVyZS4KKyAgLy8gVGhlIHNjcmlwdCBsYW5ndWFnZSBhbmQgb3BlcmF0aW5nIHN5c3RlbSBtYXkgYWxsb3cgcGF0aHMgbGlrZSAiZm9vLy9iYXIiCisgIC8vIGJ1dCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgaW4gRmlsZVBhdGggd2lsbCBub3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LiBJbgorICAvLyBwYXJ0aWN1bGFyLCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBvbmx5IHJlbW92ZXMgb25lIHNlcGFyYXRvciwgYW5kCisgIC8vIGl0IGlzIGNhbGxlZCBpbiBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgYXNzdW1pbmcgdGhhdCBpdCB3aWxsIGNoYW5nZQorICAvLyBhIHBhdGhuYW1lIGZyb20gZGlyZWN0b3J5IHN5bnRheCAodHJhaWxpbmcgc2VwYXJhdG9yKSB0byBmaWxlbmFtZSBzeW50YXguCisgIC8vCisgIC8vIE9uIFdpbmRvd3MgdGhpcyBtZXRob2QgYWxzbyByZXBsYWNlcyB0aGUgYWx0ZXJuYXRlIHBhdGggc2VwYXJhdG9yICcvJyB3aXRoCisgIC8vIHRoZSBwcmltYXJ5IHBhdGggc2VwYXJhdG9yICdcXCcsIHNvIHRoYXQgZm9yIGV4YW1wbGUgImJhclxcL1xcZm9vIiBiZWNvbWVzCisgIC8vICJiYXJcXGZvbyIuCisKKyAgdm9pZCBOb3JtYWxpemUoKTsKKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbgorICAvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCisgIC8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCisgIGNvbnN0IGNoYXIqIEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIHBhdGhuYW1lXzsKK307ICAvLyBjbGFzcyBGaWxlUGF0aAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXworLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGd0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkCisvLyB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgNTAgdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCA1MAorLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIG9uZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgorLy8gUGxlYXNlIGNvbnRhY3QgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCisvLyBtb3JlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisKKworLy8gI2lmZGVmIF9fR05VQ19fIGlzIHRvbyBnZW5lcmFsIGhlcmUuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZ2NjIHdpdGhvdXQgdXNpbmcKKy8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuCisjIGlmIEdURVNUX0hBU19DWFhBQklfSF8KKyMgIGluY2x1ZGUgPGN4eGFiaS5oPgorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisjICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+CisjIGVuZGlmICAvLyBHVEVTVF9IQVNIX0NYWEFCSV9IXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KKy8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKKy8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSB7CisjIGlmIEdURVNUX0hBU19SVFRJCisKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7CisjICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpCisgIGludCBzdGF0dXMgPSAwOworICAvLyBnY2MncyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlaWQoVCkubmFtZSgpIG1hbmdsZXMgdGhlIHR5cGUgbmFtZSwKKyAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4KKyMgICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCisgIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7CisjICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8KKyAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOworICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lX3N0cihzdGF0dXMgPT0gMCA/IHJlYWRhYmxlX25hbWUgOiBuYW1lKTsKKyAgZnJlZShyZWFkYWJsZV9uYW1lKTsKKyAgcmV0dXJuIG5hbWVfc3RyOworIyAgZWxzZQorICByZXR1cm4gbmFtZTsKKyMgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IF9fSFBfYUNDCisKKyMgZWxzZQorCisgIHJldHVybiAiPHR5cGU+IjsKKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKK30KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUKKy8vIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiB0byBlbnN1cmUgdGhhdAorLy8gdHdvIHR5cGVzIGFyZSBlcXVhbC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBBc3NlcnRUeXBlRXE7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFzc2VydFR5cGVFcTxULCBUPiB7CisgIHR5cGVkZWYgYm9vbCB0eXBlOworfTsKKworLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzCisvLyB0ZW1wbGF0ZSBUeXBlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHZhcmlhZGljIHRlbXBsYXRlcworLy8gKGUuZy4gVHlwZXM8aW50PiwgVHlwZTxpbnQsIGRvdWJsZT4sIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndAorLy8gc3VwcG9ydCBkaXJlY3RseS4KK3N0cnVjdCBOb25lIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KKy8vIHJlcHJlc2VudCB0eXBlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVHlwZXNOPFQxLCBUMiwgLi4uLCBUTj4KKy8vIHJlcHJlc2VudHMgYSB0eXBlIGxpc3Qgd2l0aCBOIHR5cGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKSBpbiBpdC4KKy8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBsaXN0LCBhbmQgVGFpbCBmb3IgdGhlIHJlc3Qgb2YgdGhlCisvLyBsaXN0LgorCisvLyBUaGUgZW1wdHkgdHlwZSBsaXN0Lgorc3RydWN0IFR5cGVzMCB7fTsKKworLy8gVHlwZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitzdHJ1Y3QgVHlwZXMxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXMyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTxUMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorc3RydWN0IFR5cGVzMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI8VDIsIFQzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgorc3RydWN0IFR5cGVzNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM8VDIsIFQzLCBUND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitzdHJ1Y3QgVHlwZXM1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitzdHJ1Y3QgVHlwZXM2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK3N0cnVjdCBUeXBlczcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitzdHJ1Y3QgVHlwZXM4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitzdHJ1Y3QgVHlwZXMxMCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzMTEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgorc3RydWN0IFR5cGVzMTIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczEzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgorc3RydWN0IFR5cGVzMTQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzMTUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK3N0cnVjdCBUeXBlczE2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzMTcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzMTggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK3N0cnVjdCBUeXBlczE5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorc3RydWN0IFR5cGVzMjAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitzdHJ1Y3QgVHlwZXMyMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+CitzdHJ1Y3QgVHlwZXMyMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorc3RydWN0IFR5cGVzMjMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitzdHJ1Y3QgVHlwZXMyNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitzdHJ1Y3QgVHlwZXMyNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjY+CitzdHJ1Y3QgVHlwZXMyNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgorc3RydWN0IFR5cGVzMjcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXMyOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitzdHJ1Y3QgVHlwZXMyOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK3N0cnVjdCBUeXBlczMwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorc3RydWN0IFR5cGVzMzEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorc3RydWN0IFR5cGVzMzIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KK3N0cnVjdCBUeXBlczMzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgorc3RydWN0IFR5cGVzMzQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgorc3RydWN0IFR5cGVzMzUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2Pgorc3RydWN0IFR5cGVzMzYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK3N0cnVjdCBUeXBlczM3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgorc3RydWN0IFR5cGVzMzggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgorc3RydWN0IFR5cGVzMzkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK3N0cnVjdCBUeXBlczQwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitzdHJ1Y3QgVHlwZXM0MSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK3N0cnVjdCBUeXBlczQyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczQzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgorc3RydWN0IFR5cGVzNDQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzNDUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzNDYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK3N0cnVjdCBUeXBlczQ3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgorc3RydWN0IFR5cGVzNDggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzNDkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK3N0cnVjdCBUeXBlczUwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCisvLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCisvLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKKy8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+CisvLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCisvLyBlcnJvcnMpLgorLy8KKy8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCisvLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCisvLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQorLy8gVHlwZXMgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDEzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDE5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDI1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDMxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDM3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0NSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ1MCA9IGludGVybmFsOjpOb25lPgorc3RydWN0IFR5cGVzIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVHlwZXM8aW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3N0cnVjdCBUeXBlczxUMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxPFQxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjxUMSwgVDI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM8VDEsIFQyLCBUMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0Mj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIFQ0OCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCisKKy8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCisvLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKKy8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAorLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQorLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KKy8vCisvLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCisvLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgorc3RydWN0IFRlbXBsYXRlU2VsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBCaW5kIHsKKyAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKKyAgfTsKK307CisKKyMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKKyAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQorCisvLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisvLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKKy8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKKy8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTm9uZVQge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKKy8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKKy8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCisvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgorc3RydWN0IFRlbXBsYXRlczAge307CisKKy8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+CitzdHJ1Y3QgVGVtcGxhdGVzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KK3N0cnVjdCBUZW1wbGF0ZXMyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+CitzdHJ1Y3QgVGVtcGxhdGVzMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzxUMiwgVDMsIFQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+CitzdHJ1Y3QgVGVtcGxhdGVzNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KK3N0cnVjdCBUZW1wbGF0ZXM3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+CitzdHJ1Y3QgVGVtcGxhdGVzOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KK3N0cnVjdCBUZW1wbGF0ZXMxMCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgorc3RydWN0IFRlbXBsYXRlczExIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+CitzdHJ1Y3QgVGVtcGxhdGVzMTIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+CitzdHJ1Y3QgVGVtcGxhdGVzMTMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KK3N0cnVjdCBUZW1wbGF0ZXMxNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgorc3RydWN0IFRlbXBsYXRlczE1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczE2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+CitzdHJ1Y3QgVGVtcGxhdGVzMTcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgorc3RydWN0IFRlbXBsYXRlczE4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzMTkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgorc3RydWN0IFRlbXBsYXRlczIwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgorc3RydWN0IFRlbXBsYXRlczIxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXMyMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KK3N0cnVjdCBUZW1wbGF0ZXMyMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgorc3RydWN0IFRlbXBsYXRlczI0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczI1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+CitzdHJ1Y3QgVGVtcGxhdGVzMjYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgorc3RydWN0IFRlbXBsYXRlczI3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+CitzdHJ1Y3QgVGVtcGxhdGVzMjggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXMyOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzMzAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KK3N0cnVjdCBUZW1wbGF0ZXMzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+CitzdHJ1Y3QgVGVtcGxhdGVzMzIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzMzMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgorc3RydWN0IFRlbXBsYXRlczM0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgorc3RydWN0IFRlbXBsYXRlczM1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzMzYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+CitzdHJ1Y3QgVGVtcGxhdGVzMzcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KK3N0cnVjdCBUZW1wbGF0ZXMzOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzMzkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KK3N0cnVjdCBUZW1wbGF0ZXM0MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+CitzdHJ1Y3QgVGVtcGxhdGVzNDEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+CitzdHJ1Y3QgVGVtcGxhdGVzNDIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0Mj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM0MyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNDQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+CitzdHJ1Y3QgVGVtcGxhdGVzNDUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczQ2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczQ3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+CitzdHJ1Y3QgVGVtcGxhdGVzNDggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzNDkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OSwgR1RFU1RfVEVNUExBVEVfIFQ1MD4KK3N0cnVjdCBUZW1wbGF0ZXM1MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+CisvLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNTAgPSBOb25lVD4KK3N0cnVjdCBUZW1wbGF0ZXMgeworICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUZW1wbGF0ZXM8Tm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTxUMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQxLCBUMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0Mz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCisvLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCisvLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKKy8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVMaXN0IHsKKyAgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK3N0cnVjdCBUeXBlTGlzdDxUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+Ojp0eXBlIHR5cGU7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCisKKy8vIER1ZSB0byBDKysgcHJlcHJvY2Vzc29yIHdlaXJkbmVzcywgd2UgbmVlZCBkb3VibGUgaW5kaXJlY3Rpb24gdG8KKy8vIGNvbmNhdGVuYXRlIHR3byB0b2tlbnMgd2hlbiBvbmUgb2YgdGhlbSBpcyBfX0xJTkVfXy4gIFdyaXRpbmcKKy8vCisvLyAgIGZvbyAjIyBfX0xJTkVfXworLy8KKy8vIHdpbGwgcmVzdWx0IGluIHRoZSB0b2tlbiBmb29fX0xJTkVfXywgaW5zdGVhZCBvZiBmb28gZm9sbG93ZWQgYnkKKy8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlCisvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL21pc2MtdGVjaG5pY2FsLWlzc3Vlcy5odG1sI2ZhcS0zOS42CisjZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl8oZm9vLCBiYXIpIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikKKyNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKSBmb28gIyMgYmFyCisKKy8vIEdvb2dsZSBUZXN0IGRlZmluZXMgdGhlIHRlc3Rpbmc6Ok1lc3NhZ2UgY2xhc3MgdG8gYWxsb3cgY29uc3RydWN0aW9uIG9mCisvLyB0ZXN0IG1lc3NhZ2VzIHZpYSB0aGUgPDwgb3BlcmF0b3IuICBUaGUgaWRlYSBpcyB0aGF0IGFueXRoaW5nCisvLyBzdHJlYW1hYmxlIHRvIHN0ZDo6b3N0cmVhbSBjYW4gYmUgc3RyZWFtZWQgdG8gYSB0ZXN0aW5nOjpNZXNzYWdlLgorLy8gVGhpcyBhbGxvd3MgYSB1c2VyIHRvIHVzZSBoaXMgb3duIHR5cGVzIGluIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgYnkKKy8vIG92ZXJsb2FkaW5nIHRoZSA8PCBvcGVyYXRvci4KKy8vCisvLyB1dGlsL2d0bC9zdGxfbG9nZ2luZy5oIG92ZXJsb2FkcyA8PCBmb3IgU1RMIGNvbnRhaW5lcnMuICBUaGVzZQorLy8gb3ZlcmxvYWRzIGNhbm5vdCBiZSBkZWZpbmVkIGluIHRoZSBzdGQgbmFtZXNwYWNlLCBhcyB0aGF0IHdpbGwgYmUKKy8vIHVuZGVmaW5lZCBiZWhhdmlvci4gIFRoZXJlZm9yZSwgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsCisvLyBuYW1lc3BhY2UgaW5zdGVhZC4KKy8vCisvLyBDKysncyBzeW1ib2wgbG9va3VwIHJ1bGUgKGkuZS4gS29lbmlnIGxvb2t1cCkgc2F5cyB0aGF0IHRoZXNlCisvLyBvdmVybG9hZHMgYXJlIHZpc2libGUgaW4gZWl0aGVyIHRoZSBzdGQgbmFtZXNwYWNlIG9yIHRoZSBnbG9iYWwKKy8vIG5hbWVzcGFjZSwgYnV0IG5vdCBvdGhlciBuYW1lc3BhY2VzLCBpbmNsdWRpbmcgdGhlIHRlc3RpbmcKKy8vIG5hbWVzcGFjZSB3aGljaCBHb29nbGUgVGVzdCdzIE1lc3NhZ2UgY2xhc3MgaXMgaW4uCisvLworLy8gVG8gYWxsb3cgU1RMIGNvbnRhaW5lcnMgKGFuZCBvdGhlciB0eXBlcyB0aGF0IGhhcyBhIDw8IG9wZXJhdG9yCisvLyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSB0byBiZSB1c2VkIGluIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMsCisvLyB0ZXN0aW5nOjpNZXNzYWdlIG11c3QgYWNjZXNzIHRoZSBjdXN0b20gPDwgb3BlcmF0b3IgZnJvbSB0aGUgZ2xvYmFsCisvLyBuYW1lc3BhY2UuICBIZW5jZSB0aGlzIGhlbHBlciBmdW5jdGlvbi4KKy8vCisvLyBOb3RlOiBKZWZmcmV5IFlhc3NraW4gc3VnZ2VzdGVkIGFuIGFsdGVybmF0aXZlIGZpeCBieSAidXNpbmcKKy8vIDo6b3BlcmF0b3I8PDsiIGluIHRoZSBkZWZpbml0aW9uIG9mIE1lc3NhZ2UncyBvcGVyYXRvcjw8LiAgVGhhdCBmaXgKKy8vIGRvZXNuJ3QgcmVxdWlyZSBhIGhlbHBlciBmdW5jdGlvbiwgYnV0IHVuZm9ydHVuYXRlbHkgZG9lc24ndAorLy8gY29tcGlsZSB3aXRoIE1TVkMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lkIEdUZXN0U3RyZWFtVG9IZWxwZXIoc3RkOjpvc3RyZWFtKiBvcywgY29uc3QgVCYgdmFsKSB7CisgICpvcyA8PCB2YWw7Cit9CisKK2NsYXNzIFByb3RvY29sTWVzc2FnZTsKK25hbWVzcGFjZSBwcm90bzIgeyBjbGFzcyBNZXNzYWdlOyB9CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisKK2NsYXNzIEFzc2VydGlvblJlc3VsdDsgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhbiBhc3NlcnRpb24uCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmFpbHVyZSBtZXNzYWdlLgorY2xhc3MgVGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIHRlc3QuCitjbGFzcyBUZXN0SW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QuCitjbGFzcyBUZXN0UGFydFJlc3VsdDsgICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYSB0ZXN0IHBhcnQuCitjbGFzcyBVbml0VGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbGxlY3Rpb24gb2YgdGVzdCBjYXNlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50LgorY2xhc3MgU2NvcGVkVHJhY2U7ICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBzY29wZWQgdHJhY2UuCitjbGFzcyBUZXN0SW5mb0ltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVGVzdEluZm8KK2NsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdAorCisvLyBIb3cgbWFueSB0aW1lcyBJbml0R29vZ2xlVGVzdCgpIGhhcyBiZWVuIGNhbGxlZC4KK0dURVNUX0FQSV8gZXh0ZXJuIGludCBnX2luaXRfZ3Rlc3RfY291bnQ7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXTsKKworLy8gQSBzZWNyZXQgdHlwZSB0aGF0IEdvb2dsZSBUZXN0IHVzZXJzIGRvbid0IGtub3cgYWJvdXQuICBJdCBoYXMgbm8KKy8vIGRlZmluaXRpb24gb24gcHVycG9zZS4gIFRoZXJlZm9yZSBpdCdzIGltcG9zc2libGUgdG8gY3JlYXRlIGEKKy8vIFNlY3JldCBvYmplY3QsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4KK2NsYXNzIFNlY3JldDsKKworLy8gVHdvIG92ZXJsb2FkZWQgaGVscGVycyBmb3IgY2hlY2tpbmcgYXQgY29tcGlsZSB0aW1lIHdoZXRoZXIgYW4KKy8vIGV4cHJlc3Npb24gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbCAoaS5lLiBOVUxMIG9yIGFueSAwLXZhbHVlZAorLy8gY29tcGlsZS10aW1lIGludGVncmFsIGNvbnN0YW50KS4gIFRoZWlyIHJldHVybiB2YWx1ZXMgaGF2ZQorLy8gZGlmZmVyZW50IHNpemVzLCBzbyB3ZSBjYW4gdXNlIHNpemVvZigpIHRvIHRlc3Qgd2hpY2ggdmVyc2lvbiBpcworLy8gcGlja2VkIGJ5IHRoZSBjb21waWxlci4gIFRoZXNlIGhlbHBlcnMgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMsIGFzCisvLyB3ZSBvbmx5IG5lZWQgdGhlaXIgc2lnbmF0dXJlcy4KKy8vCisvLyBHaXZlbiBJc051bGxMaXRlcmFsSGVscGVyKHgpLCB0aGUgY29tcGlsZXIgd2lsbCBwaWNrIHRoZSBmaXJzdAorLy8gdmVyc2lvbiBpZiB4IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBTZWNyZXQqLCBhbmQgcGljayB0aGUKKy8vIHNlY29uZCB2ZXJzaW9uIG90aGVyd2lzZS4gIFNpbmNlIFNlY3JldCBpcyBhIHNlY3JldCBhbmQgaW5jb21wbGV0ZQorLy8gdHlwZSwgdGhlIG9ubHkgZXhwcmVzc2lvbiBhIHVzZXIgY2FuIHdyaXRlIHRoYXQgaGFzIHR5cGUgU2VjcmV0KiBpcworLy8gYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4gIFRoZXJlZm9yZSwgd2Uga25vdyB0aGF0IHggaXMgYSBudWxsCisvLyBwb2ludGVyIGxpdGVyYWwgaWYgYW5kIG9ubHkgaWYgdGhlIGZpcnN0IHZlcnNpb24gaXMgcGlja2VkIGJ5IHRoZQorLy8gY29tcGlsZXIuCitjaGFyIElzTnVsbExpdGVyYWxIZWxwZXIoU2VjcmV0KiBwKTsKK2NoYXIgKCZJc051bGxMaXRlcmFsSGVscGVyKC4uLikpWzJdOyAgLy8gTk9MSU5UCisKKy8vIEEgY29tcGlsZS10aW1lIGJvb2wgY29uc3RhbnQgdGhhdCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHggaXMgYQorLy8gbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQgY29tcGlsZS10aW1lCisvLyBpbnRlZ3JhbCBjb25zdGFudCkuCisjaWZkZWYgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlCisvLyBwYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pLgorIyBkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBmYWxzZQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgXAorICAgIChzaXplb2YoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNOdWxsTGl0ZXJhbEhlbHBlcih4KSkgPT0gMSkKKyNlbmRpZiAgLy8gR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ3Rlc3RfbXNnLCBjb25zdCBNZXNzYWdlJiB1c2VyX21zZyk7CisKKy8vIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzY29wZWQgdHJhY2VzIGluIHVzZXIgcHJvZ3JhbXMuCitjbGFzcyBHVEVTVF9BUElfIFNjb3BlZFRyYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjJ3RvciBwdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8KKyAgLy8gYSB0cmFjZSBzdGFjayBtYWludGFpbmVkIGJ5IEdvb2dsZSBUZXN0LgorICBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgLy8gVGhlIGQndG9yIHBvcHMgdGhlIGluZm8gcHVzaGVkIGJ5IHRoZSBjJ3Rvci4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoZSBkJ3RvciBpcyBub3QgdmlydHVhbCBpbiBvcmRlciB0byBiZSBlZmZpY2llbnQuCisgIC8vIERvbid0IGluaGVyaXQgZnJvbSBTY29wZWRUcmFjZSEKKyAgflNjb3BlZFRyYWNlKCk7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZFRyYWNlKTsKK30gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87ICAvLyBBIFNjb3BlZFRyYWNlIG9iamVjdCBkb2VzIGl0cyBqb2IgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYyd0b3IgYW5kIGQndG9yLiAgVGhlcmVmb3JlIGl0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHVzZWQgb3RoZXJ3aXNlLgorCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYW4gc3RkOjpzdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisvLyBEZWNsYXJlZCBoZXJlIGJ1dCBkZWZpbmVkIGluIGd0ZXN0LmgsIHNvIHRoYXQgaXQgaGFzIGFjY2VzcworLy8gdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIE1lc3NhZ2UgY2xhc3MsIHJlcXVpcmVkIGJ5IHRoZSBBUk0KKy8vIGNvbXBpbGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSk7CisKKy8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgorLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCisvLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCisvLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6CisvLworLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgorLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgorLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKKy8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCisvLworLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQorLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKKy8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFjdHVhbF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yaW5nX2Nhc2UpOworCisvLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKAorICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwKKyAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCisgICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpOworCisvLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHJlcHJlc2VudHMgYW4gSUVFRSBmbG9hdGluZy1wb2ludCBudW1iZXIKKy8vIChlaXRoZXIgc2luZ2xlLXByZWNpc2lvbiBvciBkb3VibGUtcHJlY2lzaW9uLCBkZXBlbmRpbmcgb24gdGhlCisvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzKS4KKy8vCisvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGRvIG1vcmUgc29waGlzdGljYXRlZCBudW1iZXIKKy8vIGNvbXBhcmlzb24uICAoRHVlIHRvIHJvdW5kLW9mZiBlcnJvciwgZXRjLCBpdCdzIHZlcnkgdW5saWtlbHkgdGhhdAorLy8gdHdvIGZsb2F0aW5nLXBvaW50cyB3aWxsIGJlIGVxdWFsIGV4YWN0bHkuICBIZW5jZSBhIG5haXZlCisvLyBjb21wYXJpc29uIGJ5IHRoZSA9PSBvcGVyYXRpb24gb2Z0ZW4gZG9lc24ndCB3b3JrLikKKy8vCisvLyBGb3JtYXQgb2YgSUVFRSBmbG9hdGluZy1wb2ludDoKKy8vCisvLyAgIFRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBiZWluZyB0aGUgbGVmdG1vc3QsIGFuIElFRUUKKy8vICAgZmxvYXRpbmctcG9pbnQgbG9va3MgbGlrZQorLy8KKy8vICAgICBzaWduX2JpdCBleHBvbmVudF9iaXRzIGZyYWN0aW9uX2JpdHMKKy8vCisvLyAgIEhlcmUsIHNpZ25fYml0IGlzIGEgc2luZ2xlIGJpdCB0aGF0IGRlc2lnbmF0ZXMgdGhlIHNpZ24gb2YgdGhlCisvLyAgIG51bWJlci4KKy8vCisvLyAgIEZvciBmbG9hdCwgdGhlcmUgYXJlIDggZXhwb25lbnQgYml0cyBhbmQgMjMgZnJhY3Rpb24gYml0cy4KKy8vCisvLyAgIEZvciBkb3VibGUsIHRoZXJlIGFyZSAxMSBleHBvbmVudCBiaXRzIGFuZCA1MiBmcmFjdGlvbiBiaXRzLgorLy8KKy8vICAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBhdAorLy8gICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lFRUVfZmxvYXRpbmctcG9pbnRfc3RhbmRhcmQuCisvLworLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgorLy8KKy8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitjbGFzcyBGbG9hdGluZ1BvaW50IHsKKyBwdWJsaWM6CisgIC8vIERlZmluZXMgdGhlIHVuc2lnbmVkIGludGVnZXIgdHlwZSB0aGF0IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZQorICAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZVdpdGhTaXplPHNpemVvZihSYXdUeXBlKT46OlVJbnQgQml0czsKKworICAvLyBDb25zdGFudHMuCisKKyAgLy8gIyBvZiBiaXRzIGluIGEgbnVtYmVyLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRDb3VudCA9IDgqc2l6ZW9mKFJhd1R5cGUpOworCisgIC8vICMgb2YgZnJhY3Rpb24gYml0cyBpbiBhIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhY3Rpb25CaXRDb3VudCA9CisgICAgc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzIC0gMTsKKworICAvLyAjIG9mIGV4cG9uZW50IGJpdHMgaW4gYSBudW1iZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0V4cG9uZW50Qml0Q291bnQgPSBrQml0Q291bnQgLSAxIC0ga0ZyYWN0aW9uQml0Q291bnQ7CisKKyAgLy8gVGhlIG1hc2sgZm9yIHRoZSBzaWduIGJpdC4KKyAgc3RhdGljIGNvbnN0IEJpdHMga1NpZ25CaXRNYXNrID0gc3RhdGljX2Nhc3Q8Qml0cz4oMSkgPDwgKGtCaXRDb3VudCAtIDEpOworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgZnJhY3Rpb24gYml0cy4KKyAgc3RhdGljIGNvbnN0IEJpdHMga0ZyYWN0aW9uQml0TWFzayA9CisgICAgfnN0YXRpY19jYXN0PEJpdHM+KDApID4+IChrRXhwb25lbnRCaXRDb3VudCArIDEpOworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgZXhwb25lbnQgYml0cy4KKyAgc3RhdGljIGNvbnN0IEJpdHMga0V4cG9uZW50Qml0TWFzayA9IH4oa1NpZ25CaXRNYXNrIHwga0ZyYWN0aW9uQml0TWFzayk7CisKKyAgLy8gSG93IG1hbnkgVUxQJ3MgKFVuaXRzIGluIHRoZSBMYXN0IFBsYWNlKSB3ZSB3YW50IHRvIHRvbGVyYXRlIHdoZW4KKyAgLy8gY29tcGFyaW5nIHR3byBudW1iZXJzLiAgVGhlIGxhcmdlciB0aGUgdmFsdWUsIHRoZSBtb3JlIGVycm9yIHdlCisgIC8vIGFsbG93LiAgQSAwIHZhbHVlIG1lYW5zIHRoYXQgdHdvIG51bWJlcnMgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lCisgIC8vIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwuCisgIC8vCisgIC8vIFRoZSBtYXhpbXVtIGVycm9yIG9mIGEgc2luZ2xlIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbiBpcyAwLjUKKyAgLy8gdW5pdHMgaW4gdGhlIGxhc3QgcGxhY2UuICBPbiBJbnRlbCBDUFUncywgYWxsIGZsb2F0aW5nLXBvaW50CisgIC8vIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSB3aXRoIDgwLWJpdCBwcmVjaXNpb24sIHdoaWxlIGRvdWJsZSBoYXMgNjQKKyAgLy8gYml0cy4gIFRoZXJlZm9yZSwgNCBzaG91bGQgYmUgZW5vdWdoIGZvciBvcmRpbmFyeSB1c2UuCisgIC8vCisgIC8vIFNlZSB0aGUgZm9sbG93aW5nIGFydGljbGUgZm9yIG1vcmUgZGV0YWlscyBvbiBVTFA6CisgIC8vIGh0dHA6Ly93d3cuY3lnbnVzLXNvZnR3YXJlLmNvbS9wYXBlcnMvY29tcGFyaW5nZmxvYXRzL2NvbXBhcmluZ2Zsb2F0cy5odG0uCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFVscHMgPSA0OworCisgIC8vIENvbnN0cnVjdHMgYSBGbG9hdGluZ1BvaW50IGZyb20gYSByYXcgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAvLworICAvLyBPbiBhbiBJbnRlbCBDUFUsIHBhc3NpbmcgYSBub24tbm9ybWFsaXplZCBOQU4gKE5vdCBhIE51bWJlcikKKyAgLy8gYXJvdW5kIG1heSBjaGFuZ2UgaXRzIGJpdHMsIGFsdGhvdWdoIHRoZSBuZXcgdmFsdWUgaXMgZ3VhcmFudGVlZAorICAvLyB0byBiZSBhbHNvIGEgTkFOLiAgVGhlcmVmb3JlLCBkb24ndCBleHBlY3QgdGhpcyBjb25zdHJ1Y3RvciB0bworICAvLyBwcmVzZXJ2ZSB0aGUgYml0cyBpbiB4IHdoZW4geCBpcyBhIE5BTi4KKyAgZXhwbGljaXQgRmxvYXRpbmdQb2ludChjb25zdCBSYXdUeXBlJiB4KSB7IHVfLnZhbHVlXyA9IHg7IH0KKworICAvLyBTdGF0aWMgbWV0aG9kcworCisgIC8vIFJlaW50ZXJwcmV0cyBhIGJpdCBwYXR0ZXJuIGFzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCB0byB0ZXN0IHRoZSBBbG1vc3RFcXVhbHMoKSBtZXRob2QuCisgIHN0YXRpYyBSYXdUeXBlIFJlaW50ZXJwcmV0Qml0cyhjb25zdCBCaXRzIGJpdHMpIHsKKyAgICBGbG9hdGluZ1BvaW50IGZwKDApOworICAgIGZwLnVfLmJpdHNfID0gYml0czsKKyAgICByZXR1cm4gZnAudV8udmFsdWVfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHRoYXQgcmVwcmVzZW50IHBvc2l0aXZlIGluZmluaXR5LgorICBzdGF0aWMgUmF3VHlwZSBJbmZpbml0eSgpIHsKKyAgICByZXR1cm4gUmVpbnRlcnByZXRCaXRzKGtFeHBvbmVudEJpdE1hc2spOworICB9CisKKyAgLy8gTm9uLXN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmV0dXJucyB0aGUgYml0cyB0aGF0IHJlcHJlc2VudHMgdGhpcyBudW1iZXIuCisgIGNvbnN0IEJpdHMgJmJpdHMoKSBjb25zdCB7IHJldHVybiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZXhwb25lbnRfYml0cygpIGNvbnN0IHsgcmV0dXJuIGtFeHBvbmVudEJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZnJhY3Rpb25fYml0cygpIGNvbnN0IHsgcmV0dXJuIGtGcmFjdGlvbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoaXMgbnVtYmVyLgorICBCaXRzIHNpZ25fYml0KCkgY29uc3QgeyByZXR1cm4ga1NpZ25CaXRNYXNrICYgdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgTkFOIChub3QgYSBudW1iZXIpLgorICBib29sIGlzX25hbigpIGNvbnN0IHsKKyAgICAvLyBJdCdzIGEgTkFOIGlmIHRoZSBleHBvbmVudCBiaXRzIGFyZSBhbGwgb25lcyBhbmQgdGhlIGZyYWN0aW9uCisgICAgLy8gYml0cyBhcmUgbm90IGVudGlyZWx5IHplcm9zLgorICAgIHJldHVybiAoZXhwb25lbnRfYml0cygpID09IGtFeHBvbmVudEJpdE1hc2spICYmIChmcmFjdGlvbl9iaXRzKCkgIT0gMCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbnVtYmVyIGlzIGF0IG1vc3Qga01heFVscHMgVUxQJ3MgYXdheSBmcm9tCisgIC8vIHJocy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb246CisgIC8vCisgIC8vICAgLSByZXR1cm5zIGZhbHNlIGlmIGVpdGhlciBudW1iZXIgaXMgKG9yIGJvdGggYXJlKSBOQU4uCisgIC8vICAgLSB0cmVhdHMgcmVhbGx5IGxhcmdlIG51bWJlcnMgYXMgYWxtb3N0IGVxdWFsIHRvIGluZmluaXR5LgorICAvLyAgIC0gdGhpbmtzICswLjAgYW5kIC0wLjAgYXJlIDAgRExQJ3MgYXBhcnQuCisgIGJvb2wgQWxtb3N0RXF1YWxzKGNvbnN0IEZsb2F0aW5nUG9pbnQmIHJocykgY29uc3QgeworICAgIC8vIFRoZSBJRUVFIHN0YW5kYXJkIHNheXMgdGhhdCBhbnkgY29tcGFyaXNvbiBvcGVyYXRpb24gaW52b2x2aW5nCisgICAgLy8gYSBOQU4gbXVzdCByZXR1cm4gZmFsc2UuCisgICAgaWYgKGlzX25hbigpIHx8IHJocy5pc19uYW4oKSkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKHVfLmJpdHNfLCByaHMudV8uYml0c18pCisgICAgICAgIDw9IGtNYXhVbHBzOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIHVuaW9uIEZsb2F0aW5nUG9pbnRVbmlvbiB7CisgICAgUmF3VHlwZSB2YWx1ZV87ICAvLyBUaGUgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBCaXRzIGJpdHNfOyAgICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBudW1iZXIuCisgIH07CisKKyAgLy8gQ29udmVydHMgYW4gaW50ZWdlciBmcm9tIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24gdG8KKyAgLy8gdGhlIGJpYXNlZCByZXByZXNlbnRhdGlvbi4gIE1vcmUgcHJlY2lzZWx5LCBsZXQgTiBiZSAyIHRvIHRoZQorICAvLyBwb3dlciBvZiAoa0JpdENvdW50IC0gMSksIGFuIGludGVnZXIgeCBpcyByZXByZXNlbnRlZCBieSB0aGUKKyAgLy8gdW5zaWduZWQgbnVtYmVyIHggKyBOLgorICAvLworICAvLyBGb3IgaW5zdGFuY2UsCisgIC8vCisgIC8vICAgLU4gKyAxICh0aGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZworICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDE7CisgIC8vICAgMCAgICAgIGlzIHJlcHJlc2VudGVkIGJ5IE47IGFuZAorICAvLyAgIE4gLSAxICAodGhlIGJpZ2dlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcKKyAgLy8gICAgICAgICAgc2lnbi1hbmQtbWFnbml0dWRlKSBpcyByZXByZXNlbnRlZCBieSAyTiAtIDEuCisgIC8vCisgIC8vIFJlYWQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduZWRfbnVtYmVyX3JlcHJlc2VudGF0aW9ucworICAvLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNpZ25lZCBudW1iZXIgcmVwcmVzZW50YXRpb25zLgorICBzdGF0aWMgQml0cyBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoY29uc3QgQml0cyAmc2FtKSB7CisgICAgaWYgKGtTaWduQml0TWFzayAmIHNhbSkgeworICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICByZXR1cm4gfnNhbSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHNhbSByZXByZXNlbnRzIGEgcG9zaXRpdmUgbnVtYmVyLgorICAgICAgcmV0dXJuIGtTaWduQml0TWFzayB8IHNhbTsKKyAgICB9CisgIH0KKworICAvLyBHaXZlbiB0d28gbnVtYmVycyBpbiB0aGUgc2lnbi1hbmQtbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uLAorICAvLyByZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gYXMgYW4gdW5zaWduZWQgbnVtYmVyLgorICBzdGF0aWMgQml0cyBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyhjb25zdCBCaXRzICZzYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRzICZzYW0yKSB7CisgICAgY29uc3QgQml0cyBiaWFzZWQxID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTEpOworICAgIGNvbnN0IEJpdHMgYmlhc2VkMiA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0yKTsKKyAgICByZXR1cm4gKGJpYXNlZDEgPj0gYmlhc2VkMikgPyAoYmlhc2VkMSAtIGJpYXNlZDIpIDogKGJpYXNlZDIgLSBiaWFzZWQxKTsKKyAgfQorCisgIEZsb2F0aW5nUG9pbnRVbmlvbiB1XzsKK307CisKKy8vIFR5cGVkZWZzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgdGhhdCB3ZQorLy8gY2FyZSB0byB1c2UuCit0eXBlZGVmIEZsb2F0aW5nUG9pbnQ8ZmxvYXQ+IEZsb2F0OwordHlwZWRlZiBGbG9hdGluZ1BvaW50PGRvdWJsZT4gRG91YmxlOworCisvLyBJbiBvcmRlciB0byBjYXRjaCB0aGUgbWlzdGFrZSBvZiBwdXR0aW5nIHRlc3RzIHRoYXQgdXNlIGRpZmZlcmVudAorLy8gdGVzdCBmaXh0dXJlIGNsYXNzZXMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlLCB3ZSBuZWVkIHRvIGFzc2lnbgorLy8gdW5pcXVlIElEcyB0byBmaXh0dXJlIGNsYXNzZXMgYW5kIGNvbXBhcmUgdGhlbS4gIFRoZSBUeXBlSWQgdHlwZSBpcworLy8gdXNlZCB0byBob2xkIHN1Y2ggSURzLiAgVGhlIHVzZXIgc2hvdWxkIHRyZWF0IFR5cGVJZCBhcyBhbiBvcGFxdWUKKy8vIHR5cGU6IHRoZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkIG9uIFR5cGVJZCB2YWx1ZXMgaXMgdG8gY29tcGFyZQorLy8gdGhlbSBmb3IgZXF1YWxpdHkgdXNpbmcgdGhlID09IG9wZXJhdG9yLgordHlwZWRlZiBjb25zdCB2b2lkKiBUeXBlSWQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZUlkSGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIGR1bW15XyBtdXN0IG5vdCBoYXZlIGEgY29uc3QgdHlwZS4gIE90aGVyd2lzZSBhbiBvdmVybHkgZWFnZXIKKyAgLy8gY29tcGlsZXIgKGUuZy4gTVNWQyA3LjEgJiA4LjApIG1heSB0cnkgdG8gbWVyZ2UKKyAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gZm9yIGRpZmZlcmVudCBUcyBhcyBhbiAib3B0aW1pemF0aW9uIi4KKyAgc3RhdGljIGJvb2wgZHVtbXlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfID0gZmFsc2U7CisKKy8vIEdldFR5cGVJZDxUPigpIHJldHVybnMgdGhlIElEIG9mIHR5cGUgVC4gIERpZmZlcmVudCB2YWx1ZXMgd2lsbCBiZQorLy8gcmV0dXJuZWQgZm9yIGRpZmZlcmVudCB0eXBlcy4gIENhbGxpbmcgdGhlIGZ1bmN0aW9uIHR3aWNlIHdpdGggdGhlCisvLyBzYW1lIHR5cGUgYXJndW1lbnQgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgSUQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1R5cGVJZCBHZXRUeXBlSWQoKSB7CisgIC8vIFRoZSBjb21waWxlciBpcyByZXF1aXJlZCB0byBhbGxvY2F0ZSBhIGRpZmZlcmVudAorICAvLyBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyB2YXJpYWJsZSBmb3IgZWFjaCBUIHVzZWQgdG8gaW5zdGFudGlhdGUKKyAgLy8gdGhlIHRlbXBsYXRlLiAgVGhlcmVmb3JlLCB0aGUgYWRkcmVzcyBvZiBkdW1teV8gaXMgZ3VhcmFudGVlZCB0bworICAvLyBiZSB1bmlxdWUuCisgIHJldHVybiAmKFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfKTsKK30KKworLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBBbHdheXMgY2FsbCB0aGlzIGluc3RlYWQKKy8vIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgorLy8gOjp0ZXN0aW5nOjpUZXN0LCBhcyB0aGUgbGF0dGVyIG1heSBnaXZlIHRoZSB3cm9uZyByZXN1bHQgZHVlIHRvIGEKKy8vIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0IGFzIGEgTWFjIE9TIFgKKy8vIGZyYW1ld29yay4KK0dURVNUX0FQSV8gVHlwZUlkIEdldFRlc3RUeXBlSWQoKTsKKworLy8gRGVmaW5lcyB0aGUgYWJzdHJhY3QgZmFjdG9yeSBpbnRlcmZhY2UgdGhhdCBjcmVhdGVzIGluc3RhbmNlcworLy8gb2YgYSBUZXN0IG9iamVjdC4KK2NsYXNzIFRlc3RGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UZXN0RmFjdG9yeUJhc2UoKSB7fQorCisgIC8vIENyZWF0ZXMgYSB0ZXN0IGluc3RhbmNlIHRvIHJ1bi4gVGhlIGluc3RhbmNlIGlzIGJvdGggY3JlYXRlZCBhbmQgZGVzdHJveWVkCisgIC8vIHdpdGhpbiBUZXN0SW5mb0ltcGw6OlJ1bigpCisgIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpID0gMDsKKworIHByb3RlY3RlZDoKKyAgVGVzdEZhY3RvcnlCYXNlKCkge30KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEZhY3RvcnlCYXNlKTsKK307CisKKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgVGVhc3RGYWN0b3J5QmFzZSBpbnRlcmZhY2UuCisvLyBJdCBpcyB1c2VkIGluIFRFU1QgYW5kIFRFU1RfRiBtYWNyb3MuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPgorY2xhc3MgVGVzdEZhY3RvcnlJbXBsIDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7IHJldHVybiBuZXcgVGVzdENsYXNzOyB9Cit9OworCisjaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyBQcmVkaWNhdGUtZm9ybWF0dGVycyBmb3IgaW1wbGVtZW50aW5nIHRoZSBIUkVTVUxUIGNoZWNraW5nIG1hY3JvcworLy8ge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9CisvLyBXZSBwYXNzIGEgbG9uZyBpbnN0ZWFkIG9mIEhSRVNVTFQgdG8gYXZvaWQgY2F1c2luZyBhbgorLy8gaW5jbHVkZSBkZXBlbmRlbmN5IGZvciB0aGUgSFJFU1VMVCB0eXBlLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxUU3VjY2Vzcyhjb25zdCBjaGFyKiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVHlwZXMgb2YgU2V0VXBUZXN0Q2FzZSgpIGFuZCBUZWFyRG93blRlc3RDYXNlKCkgZnVuY3Rpb25zLgordHlwZWRlZiB2b2lkICgqU2V0VXBUZXN0Q2FzZUZ1bmMpKCk7Cit0eXBlZGVmIHZvaWQgKCpUZWFyRG93blRlc3RDYXNlRnVuYykoKTsKKworLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OworLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKKy8vICAgdHlwZV9wYXJhbSAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorLy8gICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCAgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICB2YWx1ZV9wYXJhbSAgICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAorLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK0dURVNUX0FQSV8gVGVzdEluZm8qIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLCBjb25zdCBjaGFyKiBuYW1lLAorICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCisgICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sCisgICAgVHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgU2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgIFRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKKyAgICBUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOworCisvLyBJZiAqcHN0ciBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBtb2RpZmllcyAqcHN0ciB0byBiZSByaWdodAorLy8gcGFzdCB0aGUgcHJlZml4IGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnBzdHIgdW5jaGFuZ2VkCisvLyBhbmQgcmV0dXJucyBmYWxzZS4gIE5vbmUgb2YgcHN0ciwgKnBzdHIsIGFuZCBwcmVmaXggY2FuIGJlIE5VTEwuCitHVEVTVF9BUElfIGJvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKTsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gU3RhdGUgb2YgdGhlIGRlZmluaXRpb24gb2YgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgorY2xhc3MgR1RFU1RfQVBJXyBUeXBlZFRlc3RDYXNlUFN0YXRlIHsKKyBwdWJsaWM6CisgIFR5cGVkVGVzdENhc2VQU3RhdGUoKSA6IHJlZ2lzdGVyZWRfKGZhbHNlKSB7fQorCisgIC8vIEFkZHMgdGhlIGdpdmVuIHRlc3QgbmFtZSB0byBkZWZpbmVkX3Rlc3RfbmFtZXNfIGFuZCByZXR1cm4gdHJ1ZQorICAvLyBpZiB0aGUgdGVzdCBjYXNlIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQ7IG90aGVyd2lzZSBhYm9ydHMgdGhlCisgIC8vIHByb2dyYW0uCisgIGJvb2wgQWRkVGVzdE5hbWUoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWUpIHsKKyAgICBpZiAocmVnaXN0ZXJlZF8pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgVGVzdCAlcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlICIKKyAgICAgICAgICAgICAgIlJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKCVzLCAuLi4pLlxuIiwKKyAgICAgICAgICAgICAgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksIHRlc3RfbmFtZSwgY2FzZV9uYW1lKTsKKyAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgcG9zaXg6OkFib3J0KCk7CisgICAgfQorICAgIGRlZmluZWRfdGVzdF9uYW1lc18uaW5zZXJ0KHRlc3RfbmFtZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBWZXJpZmllcyB0aGF0IHJlZ2lzdGVyZWRfdGVzdHMgbWF0Y2ggdGhlIHRlc3QgbmFtZXMgaW4KKyAgLy8gZGVmaW5lZF90ZXN0X25hbWVzXzsgcmV0dXJucyByZWdpc3RlcmVkX3Rlc3RzIGlmIHN1Y2Nlc3NmdWwsIG9yCisgIC8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuCisgIGNvbnN0IGNoYXIqIFZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoCisgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogcmVnaXN0ZXJlZF90ZXN0cyk7CisKKyBwcml2YXRlOgorICBib29sIHJlZ2lzdGVyZWRfOworICA6OnN0ZDo6c2V0PGNvbnN0IGNoYXIqPiBkZWZpbmVkX3Rlc3RfbmFtZXNfOworfTsKKworLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiAnc3RyJzsKKy8vIHJldHVybnMgTlVMTCBpZiBubyBjb21tYSBpcyBmb3VuZCBpbiAnc3RyJy4KK2lubGluZSBjb25zdCBjaGFyKiBTa2lwQ29tbWEoY29uc3QgY2hhciogc3RyKSB7CisgIGNvbnN0IGNoYXIqIGNvbW1hID0gc3RyY2hyKHN0ciwgJywnKTsKKyAgaWYgKGNvbW1hID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB3aGlsZSAoSXNTcGFjZSgqKCsrY29tbWEpKSkge30KKyAgcmV0dXJuIGNvbW1hOworfQorCisvLyBSZXR1cm5zIHRoZSBwcmVmaXggb2YgJ3N0cicgYmVmb3JlIHRoZSBmaXJzdCBjb21tYSBpbiBpdDsgcmV0dXJucworLy8gdGhlIGVudGlyZSBzdHJpbmcgaWYgaXQgY29udGFpbnMgbm8gY29tbWEuCitpbmxpbmUgc3RkOjpzdHJpbmcgR2V0UHJlZml4VW50aWxDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICByZXR1cm4gY29tbWEgPT0gTlVMTCA/IHN0ciA6IHN0ZDo6c3RyaW5nKHN0ciwgY29tbWEpOworfQorCisvLyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXM+OjpSZWdpc3RlcigpCisvLyByZWdpc3RlcnMgYSBsaXN0IG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0LiAgVGhlCisvLyByZXR1cm4gdmFsdWUgaXMgaW5zaWduaWZpY2FudCAtIHdlIGp1c3QgbmVlZCB0byByZXR1cm4gc29tZXRoaW5nCisvLyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4KKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGUgR1RFU1RfVEVNUExBVEVfIG1hY3JvIGRlY2xhcmVzIGEgdGVtcGxhdGUKKy8vIHRlbXBsYXRlIHBhcmFtZXRlci4gIEl0J3MgZGVmaW5lZCBpbiBndGVzdC10eXBlLXV0aWwuaC4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3QgeworIHB1YmxpYzoKKyAgLy8gJ2luZGV4JyBpcyB0aGUgaW5kZXggb2YgdGhlIHRlc3QgaW4gdGhlIHR5cGUgbGlzdCAnVHlwZXMnCisgIC8vIHNwZWNpZmllZCBpbiBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIFRlc3RDYXNlLAorICAvLyBUeXBlcykuICBWYWxpZCB2YWx1ZXMgZm9yICdpbmRleCcgYXJlIFswLCBOIC0gMV0gd2hlcmUgTiBpcyB0aGUKKyAgLy8gbGVuZ3RoIG9mIFR5cGVzLgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lcywgaW50IGluZGV4KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczo6SGVhZCBUeXBlOworICAgIHR5cGVkZWYgRml4dHVyZTxUeXBlPiBGaXh0dXJlQ2xhc3M7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBHVEVTVF9CSU5EXyhUZXN0U2VsLCBUeXBlKSBUZXN0Q2xhc3M7CisKKyAgICAvLyBGaXJzdCwgcmVnaXN0ZXJzIHRoZSBmaXJzdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBpbiB0aGUgdHlwZQorICAgIC8vIGxpc3QuCisgICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgICAgIFN0cmluZzo6Rm9ybWF0KCIlcyVzJXMvJWQiLCBwcmVmaXgsIHByZWZpeFswXSA9PSAnXDAnID8gIiIgOiAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhc2VfbmFtZSwgaW5kZXgpLmNfc3RyKCksCisgICAgICAgIEdldFByZWZpeFVudGlsQ29tbWEodGVzdF9uYW1lcykuY19zdHIoKSwKKyAgICAgICAgR2V0VHlwZU5hbWU8VHlwZT4oKS5jX3N0cigpLAorICAgICAgICBOVUxMLCAgLy8gTm8gdmFsdWUgcGFyYW1ldGVyLgorICAgICAgICBHZXRUeXBlSWQ8Rml4dHVyZUNsYXNzPigpLAorICAgICAgICBUZXN0Q2xhc3M6OlNldFVwVGVzdENhc2UsCisgICAgICAgIFRlc3RDbGFzczo6VGVhckRvd25UZXN0Q2FzZSwKKyAgICAgICAgbmV3IFRlc3RGYWN0b3J5SW1wbDxUZXN0Q2xhc3M+KTsKKworICAgIC8vIE5leHQsIHJlY3Vyc2VzIChhdCBjb21waWxlIHRpbWUpIHdpdGggdGhlIHRhaWwgb2YgdGhlIHR5cGUgbGlzdC4KKyAgICByZXR1cm4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIHR5cGVuYW1lIFR5cGVzOjpUYWlsPgorICAgICAgICA6OlJlZ2lzdGVyKHByZWZpeCwgY2FzZV9uYW1lLCB0ZXN0X25hbWVzLCBpbmRleCArIDEpOworICB9Cit9OworCisvLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbD4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlczA+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIC8qcHJlZml4Ki8sIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovLCBpbnQgLyppbmRleCovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKy8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgVGVzdHMsIFR5cGVzPjo6UmVnaXN0ZXIoKQorLy8gcmVnaXN0ZXJzICphbGwgY29tYmluYXRpb25zKiBvZiAnVGVzdHMnIGFuZCAnVHlwZXMnIHdpdGggR29vZ2xlCisvLyBUZXN0LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybgorLy8gc29tZXRoaW5nIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCB0eXBlbmFtZSBUZXN0cywgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWVzKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0czo6SGVhZCBIZWFkOworCisgICAgLy8gRmlyc3QsIHJlZ2lzdGVyIHRoZSBmaXJzdCB0ZXN0IGluICdUZXN0JyBmb3IgZWFjaCB0eXBlIGluICdUeXBlcycuCisgICAgVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIEhlYWQsIFR5cGVzPjo6UmVnaXN0ZXIoCisgICAgICAgIHByZWZpeCwgY2FzZV9uYW1lLCB0ZXN0X25hbWVzLCAwKTsKKworICAgIC8vIE5leHQsIHJlY3Vyc2VzIChhdCBjb21waWxlIHRpbWUpIHdpdGggdGhlIHRhaWwgb2YgdGhlIHRlc3QgbGlzdC4KKyAgICByZXR1cm4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCB0eXBlbmFtZSBUZXN0czo6VGFpbCwgVHlwZXM+CisgICAgICAgIDo6UmVnaXN0ZXIocHJlZml4LCBjYXNlX25hbWUsIFNraXBDb21tYSh0ZXN0X25hbWVzKSk7CisgIH0KK307CisKKy8vIFRoZSBiYXNlIGNhc2UgZm9yIHRoZSBjb21waWxlIHRpbWUgcmVjdXJzaW9uLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgVGVtcGxhdGVzMCwgVHlwZXM+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIC8qcHJlZml4Ki8sIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorLy8KKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCisvLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoCisgICAgVW5pdFRlc3QqIHVuaXRfdGVzdCwgaW50IHNraXBfY291bnQpOworCisvLyBIZWxwZXJzIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiB1bnJlYWNoYWJsZSBjb2RlIG9yIGNvbnN0YW50CisvLyBjb25kaXRpb24uCisKKy8vIEFsd2F5cyByZXR1cm5zIHRydWUuCitHVEVTVF9BUElfIGJvb2wgQWx3YXlzVHJ1ZSgpOworCisvLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KK2lubGluZSBib29sIEFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gIUFsd2F5c1RydWUoKTsgfQorCisvLyBIZWxwZXIgZm9yIHN1cHByZXNzaW5nIGZhbHNlIHdhcm5pbmcgZnJvbSBDbGFuZyBvbiBhIGNvbnN0IGNoYXIqCisvLyB2YXJpYWJsZSBkZWNsYXJlZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYWx3YXlzIGJlaW5nIE5VTEwgaW4KKy8vIHRoZSBlbHNlIGJyYW5jaC4KK3N0cnVjdCBHVEVTVF9BUElfIENvbnN0Q2hhclB0ciB7CisgIENvbnN0Q2hhclB0cihjb25zdCBjaGFyKiBzdHIpIDogdmFsdWUoc3RyKSB7fQorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBjb25zdCBjaGFyKiB2YWx1ZTsKK307CisKKy8vIEEgc2ltcGxlIExpbmVhciBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHJhbmRvbQorLy8gbnVtYmVycyB3aXRoIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uICBVbmxpa2UgcmFuZCgpIGFuZCBzcmFuZCgpLCBpdAorLy8gZG9lc24ndCB1c2UgZ2xvYmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlIGNhbid0IGludGVyZmVyZSB3aXRoIHVzZXIKKy8vIGNvZGUpLiAgVW5saWtlIHJhbmRfcigpLCBpdCdzIHBvcnRhYmxlLiAgQW4gTENHIGlzbid0IHZlcnkgcmFuZG9tLAorLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KK2NsYXNzIEdURVNUX0FQSV8gUmFuZG9tIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBVSW50MzIga01heFJhbmdlID0gMXUgPDwgMzE7CisKKyAgZXhwbGljaXQgUmFuZG9tKFVJbnQzMiBzZWVkKSA6IHN0YXRlXyhzZWVkKSB7fQorCisgIHZvaWQgUmVzZWVkKFVJbnQzMiBzZWVkKSB7IHN0YXRlXyA9IHNlZWQ7IH0KKworICAvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcworICAvLyAwIG9yIGdyZWF0ZXIgdGhhbiBrTWF4UmFuZ2UuCisgIFVJbnQzMiBHZW5lcmF0ZShVSW50MzIgcmFuZ2UpOworCisgcHJpdmF0ZToKKyAgVUludDMyIHN0YXRlXzsKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSYW5kb20pOworfTsKKworLy8gRGVmaW5pbmcgYSB2YXJpYWJsZSBvZiB0eXBlIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBUMj4gd2lsbCBjYXVzZSBhCisvLyBjb21waWxlciBlcnJvciBpZmYgVDEgYW5kIFQyIGFyZSBkaWZmZXJlbnQgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxULCBUPiB7Cit9OworCisvLyBSZW1vdmVzIHRoZSByZWZlcmVuY2UgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSByZWZlcmVuY2UgdHlwZSwKKy8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcworLy8gdHIxOjpyZW1vdmVfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVSZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBhcm91bmQgUmVtb3ZlUmVmZXJlbmNlIHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKKy8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSBcCisgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlUmVmZXJlbmNlPFQ+Ojp0eXBlCisKKy8vIFJlbW92ZXMgY29uc3QgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSBjb25zdCB0eXBlLCBvdGhlcndpc2UgbGVhdmVzCisvLyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRyMTo6cmVtb3ZlX2NvbnN0LCB3aGljaCBpcyBub3QKKy8vIHdpZGVseSBhdmFpbGFibGUgeWV0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlQ29uc3QgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVD4geyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBNU1ZDIDguMCwgU3VuIEMrKywgYW5kIElCTSBYTCBDKysgaGF2ZSBhIGJ1ZyB3aGljaCBjYXVzZXMgdGhlIGFib3ZlCisvLyBkZWZpbml0aW9uIHRvIGZhaWwgdG8gcmVtb3ZlIHRoZSBjb25zdCBpbiAnY29uc3QgaW50WzNdJyBhbmQgJ2NvbnN0CisvLyBjaGFyWzNdWzRdJy4gIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gd29ya3MgYXJvdW5kIHRoZSBidWcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitzdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVFtOXT4geworICB0eXBlZGVmIHR5cGVuYW1lIFJlbW92ZUNvbnN0PFQ+Ojp0eXBlIHR5cGVbTl07Cit9OworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNDAwCisvLyBUaGlzIGlzIHRoZSBvbmx5IHNwZWNpYWxpemF0aW9uIHRoYXQgYWxsb3dzIFZDKysgNy4xIHRvIHJlbW92ZSBjb25zdCBpbgorLy8gJ2NvbnN0IGludFszXSBhbmQgJ2NvbnN0IGludFszXVs0XScuICBIb3dldmVyLCBpdCBjYXVzZXMgdHJvdWJsZSB3aXRoIEdDQworLy8gYW5kIHRodXMgbmVlZHMgdG8gYmUgY29uZGl0aW9uYWxseSBjb21waWxlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3N0cnVjdCBSZW1vdmVDb25zdDxUW05dPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsKK307CisjZW5kaWYKKworLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVDb25zdCB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50CisvLyBUIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfUkVNT1ZFX0NPTlNUXyhUKSBcCisgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlQ29uc3Q8VD46OnR5cGUKKworLy8gVHVybnMgY29uc3QgVSYsIFUmLCBjb25zdCBVLCBhbmQgVSBhbGwgaW50byBVLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVCkgXAorICAgIEdURVNUX1JFTU9WRV9DT05TVF8oR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCisKKy8vIEFkZHMgcmVmZXJlbmNlIHRvIGEgdHlwZSBpZiBpdCBpcyBub3QgYSByZWZlcmVuY2UgdHlwZSwKKy8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcworLy8gdHIxOjphZGRfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWZlcmVuY2UgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBBZGRSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBUCisvLyBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdURVNUX0FERF9SRUZFUkVOQ0VfKFQpIFwKKyAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpBZGRSZWZlcmVuY2U8VD46OnR5cGUKKworLy8gQWRkcyBhIHJlZmVyZW5jZSB0byBjb25zdCBvbiB0b3Agb2YgVCBhcyBuZWNlc3NhcnkuICBGb3IgZXhhbXBsZSwKKy8vIGl0IHRyYW5zZm9ybXMKKy8vCisvLyAgIGNoYXIgICAgICAgICA9PT4gY29uc3QgY2hhciYKKy8vICAgY29uc3QgY2hhciAgID09PiBjb25zdCBjaGFyJgorLy8gICBjaGFyJiAgICAgICAgPT0+IGNvbnN0IGNoYXImCisvLyAgIGNvbnN0IGNoYXImICA9PT4gY29uc3QgY2hhciYKKy8vCisvLyBUaGUgYXJndW1lbnQgVCBtdXN0IGRlcGVuZCBvbiBzb21lIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oVCkgXAorICAgIEdURVNUX0FERF9SRUZFUkVOQ0VfKGNvbnN0IEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpKQorCisvLyBJbXBsaWNpdGx5Q29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBib29sCisvLyBjb25zdGFudCB0aGF0J3MgdHJ1ZSBpZmYgdHlwZSBGcm9tIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bworLy8gdHlwZSBUby4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK2NsYXNzIEltcGxpY2l0bHlDb252ZXJ0aWJsZSB7CisgcHJpdmF0ZToKKyAgLy8gV2UgbmVlZCB0aGUgZm9sbG93aW5nIGhlbHBlciBmdW5jdGlvbnMgb25seSBmb3IgdGhlaXIgdHlwZXMuCisgIC8vIFRoZXkgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMuCisKKyAgLy8gTWFrZUZyb20oKSBpcyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgRnJvbS4gIFdlIGNhbm5vdCBzaW1wbHkKKyAgLy8gdXNlIEZyb20oKSwgYXMgdGhlIHR5cGUgRnJvbSBtYXkgbm90IGhhdmUgYSBwdWJsaWMgZGVmYXVsdAorICAvLyBjb25zdHJ1Y3Rvci4KKyAgc3RhdGljIEZyb20gTWFrZUZyb20oKTsKKworICAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBvdmVybG9hZGVkLiAgR2l2ZW4gYW4gZXhwcmVzc2lvbgorICAvLyBIZWxwZXIoeCksIHRoZSBjb21waWxlciB3aWxsIHBpY2sgdGhlIGZpcnN0IHZlcnNpb24gaWYgeCBjYW4gYmUKKyAgLy8gaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdHlwZSBUbzsgb3RoZXJ3aXNlIGl0IHdpbGwgcGljayB0aGUKKyAgLy8gc2Vjb25kIHZlcnNpb24uCisgIC8vCisgIC8vIFRoZSBmaXJzdCB2ZXJzaW9uIHJldHVybnMgYSB2YWx1ZSBvZiBzaXplIDEsIGFuZCB0aGUgc2Vjb25kCisgIC8vIHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMi4gIFRoZXJlZm9yZSwgYnkgY2hlY2tpbmcgdGhlCisgIC8vIHNpemUgb2YgSGVscGVyKHgpLCB3aGljaCBjYW4gYmUgZG9uZSBhdCBjb21waWxlIHRpbWUsIHdlIGNhbiB0ZWxsCisgIC8vIHdoaWNoIHZlcnNpb24gb2YgSGVscGVyKCkgaXMgdXNlZCwgYW5kIGhlbmNlIHdoZXRoZXIgeCBjYW4gYmUKKyAgLy8gaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdHlwZSBUby4KKyAgc3RhdGljIGNoYXIgSGVscGVyKFRvKTsKKyAgc3RhdGljIGNoYXIgKCZIZWxwZXIoLi4uKSlbMl07ICAvLyBOT0xJTlQKKworICAvLyBXZSBoYXZlIHRvIHB1dCB0aGUgJ3B1YmxpYycgc2VjdGlvbiBhZnRlciB0aGUgJ3ByaXZhdGUnIHNlY3Rpb24sCisgIC8vIG9yIE1TVkMgcmVmdXNlcyB0byBjb21waWxlIHRoZSBjb2RlLgorIHB1YmxpYzoKKyAgLy8gTVNWQyB3YXJucyBhYm91dCBpbXBsaWNpdGx5IGNvbnZlcnRpbmcgZnJvbSBkb3VibGUgdG8gaW50IGZvcgorICAvLyBwb3NzaWJsZSBsb3NzIG9mIGRhdGEsIHNvIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUKKyAgLy8gd2FybmluZy4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQyNDQpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQyNDQuCisKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc2l6ZW9mKEhlbHBlcihJbXBsaWNpdGx5Q29udmVydGlibGU6Ok1ha2VGcm9tKCkpKSA9PSAxOworIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBDKytCdWlsZGVyIGNhbm5vdCB1c2UgbWVtYmVyIG92ZXJsb2FkIHJlc29sdXRpb24gZHVyaW5nIHRlbXBsYXRlCisgIC8vIGluc3RhbnRpYXRpb24uICBUaGUgc2ltcGxlc3Qgd29ya2Fyb3VuZCBpcyB0byB1c2UgaXRzIEMrKzB4IHR5cGUgdHJhaXRzCisgIC8vIGZ1bmN0aW9ucyAoQysrQnVpbGRlciAyMDA5IGFuZCBhYm92ZSBvbmx5KS4KKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX2lzX2NvbnZlcnRpYmxlKEZyb20sIFRvKTsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIHNpemVvZihIZWxwZXIoSW1wbGljaXRseUNvbnZlcnRpYmxlOjpNYWtlRnJvbSgpKSkgPT0gMTsKKyNlbmRpZiAgLy8gX01TVl9WRVIKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Citjb25zdCBib29sIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxGcm9tLCBUbz46OnZhbHVlOworCisvLyBJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGJvb2wgY29uc3RhbnQgdGhhdCdzCisvLyB0cnVlIGlmZiBUIGlzIHR5cGUgUHJvdG9jb2xNZXNzYWdlLCBwcm90bzI6Ok1lc3NhZ2UsIG9yIGEgc3ViY2xhc3MKKy8vIG9mIHRob3NlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSXNBUHJvdG9jb2xNZXNzYWdlCisgICAgOiBwdWJsaWMgYm9vbF9jb25zdGFudDwKKyAgSW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQqLCBjb25zdCA6OlByb3RvY29sTWVzc2FnZSo+Ojp2YWx1ZSB8fAorICBJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCosIGNvbnN0IDo6cHJvdG8yOjpNZXNzYWdlKj46OnZhbHVlPiB7Cit9OworCisvLyBXaGVuIHRoZSBjb21waWxlciBzZWVzIGV4cHJlc3Npb24gSXNDb250YWluZXJUZXN0PEM+KDApLCBpZiBDIGlzIGFuCisvLyBTVEwtc3R5bGUgY29udGFpbmVyIGNsYXNzLCB0aGUgZmlyc3Qgb3ZlcmxvYWQgb2YgSXNDb250YWluZXJUZXN0CisvLyB3aWxsIGJlIHZpYWJsZSAoc2luY2UgYm90aCBDOjppdGVyYXRvciogYW5kIEM6OmNvbnN0X2l0ZXJhdG9yKiBhcmUKKy8vIHZhbGlkIHR5cGVzIGFuZCBOVUxMIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0aGVtKS4gIEl0IHdpbGwKKy8vIGJlIHBpY2tlZCBvdmVyIHRoZSBzZWNvbmQgb3ZlcmxvYWQgYXMgJ2ludCcgaXMgYSBwZXJmZWN0IG1hdGNoIGZvcgorLy8gdGhlIHR5cGUgb2YgYXJndW1lbnQgMC4gIElmIEM6Oml0ZXJhdG9yIG9yIEM6OmNvbnN0X2l0ZXJhdG9yIGlzIG5vdAorLy8gYSB2YWxpZCB0eXBlLCB0aGUgZmlyc3Qgb3ZlcmxvYWQgaXMgbm90IHZpYWJsZSwgYW5kIHRoZSBzZWNvbmQKKy8vIG92ZXJsb2FkIHdpbGwgYmUgcGlja2VkLiAgVGhlcmVmb3JlLCB3ZSBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgQyBpcworLy8gYSBjb250YWluZXIgY2xhc3MgYnkgY2hlY2tpbmcgdGhlIHR5cGUgb2YgSXNDb250YWluZXJUZXN0PEM+KDApLgorLy8gVGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIGluc2lnbmlmaWNhbnQuCisvLworLy8gTm90ZSB0aGF0IHdlIGxvb2sgZm9yIGJvdGggQzo6aXRlcmF0b3IgYW5kIEM6OmNvbnN0X2l0ZXJhdG9yLiAgVGhlCisvLyByZWFzb24gaXMgdGhhdCBDKysgaW5qZWN0cyB0aGUgbmFtZSBvZiBhIGNsYXNzIGFzIGEgbWVtYmVyIG9mIHRoZQorLy8gY2xhc3MgaXRzZWxmIChlLmcuIHlvdSBjYW4gcmVmZXIgdG8gY2xhc3MgaXRlcmF0b3IgYXMgZWl0aGVyCisvLyAnaXRlcmF0b3InIG9yICdpdGVyYXRvcjo6aXRlcmF0b3InKS4gIElmIHdlIGxvb2sgZm9yIEM6Oml0ZXJhdG9yCisvLyBvbmx5LCBmb3IgZXhhbXBsZSwgd2Ugd291bGQgbWlzdGFrZW5seSB0aGluayB0aGF0IGEgY2xhc3MgbmFtZWQKKy8vIGl0ZXJhdG9yIGlzIGFuIFNUTCBjb250YWluZXIuCisvLworLy8gQWxzbyBub3RlIHRoYXQgdGhlIHNpbXBsZXIgYXBwcm9hY2ggb2Ygb3ZlcmxvYWRpbmcKKy8vIElzQ29udGFpbmVyVGVzdCh0eXBlbmFtZSBDOjpjb25zdF9pdGVyYXRvciopIGFuZAorLy8gSXNDb250YWluZXJUZXN0KC4uLikgZG9lc24ndCB3b3JrIHdpdGggVmlzdWFsIEFnZSBDKysgYW5kIFN1biBDKysuCit0eXBlZGVmIGludCBJc0NvbnRhaW5lcjsKK3RlbXBsYXRlIDxjbGFzcyBDPgorSXNDb250YWluZXIgSXNDb250YWluZXJUZXN0KGludCAvKiBkdW1teSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjppdGVyYXRvciogLyogaXQgKi8gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKiAvKiBjb25zdF9pdCAqLyA9IE5VTEwpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgY2hhciBJc05vdENvbnRhaW5lcjsKK3RlbXBsYXRlIDxjbGFzcyBDPgorSXNOb3RDb250YWluZXIgSXNDb250YWluZXJUZXN0KGxvbmcgLyogZHVtbXkgKi8pIHsgcmV0dXJuICdcMCc7IH0KKworLy8gRW5hYmxlSWY8Y29uZGl0aW9uPjo6dHlwZSBpcyB2b2lkIHdoZW4gJ0NvbmQnIGlzIHRydWUsIGFuZAorLy8gdW5kZWZpbmVkIHdoZW4gJ0NvbmQnIGlzIGZhbHNlLiAgVG8gdXNlIFNGSU5BRSB0byBtYWtlIGEgZnVuY3Rpb24KKy8vIG92ZXJsb2FkIG9ubHkgYXBwbHkgd2hlbiBhIHBhcnRpY3VsYXIgZXhwcmVzc2lvbiBpcyB0cnVlLCBhZGQKKy8vICJ0eXBlbmFtZSBFbmFibGVJZjxleHByZXNzaW9uPjo6dHlwZSogPSAwIiBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIuCit0ZW1wbGF0ZTxib29sPiBzdHJ1Y3QgRW5hYmxlSWY7Cit0ZW1wbGF0ZTw+IHN0cnVjdCBFbmFibGVJZjx0cnVlPiB7IHR5cGVkZWYgdm9pZCB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIFV0aWxpdGllcyBmb3IgbmF0aXZlIGFycmF5cy4KKworLy8gQXJyYXlFcSgpIGNvbXBhcmVzIHR3byBrLWRpbWVuc2lvbmFsIG5hdGl2ZSBhcnJheXMgdXNpbmcgdGhlCisvLyBlbGVtZW50cycgb3BlcmF0b3I9PSwgd2hlcmUgayBjYW4gYmUgYW55IGludGVnZXIgPj0gMC4gIFdoZW4gayBpcworLy8gMCwgQXJyYXlFcSgpIGRlZ2VuZXJhdGVzIGludG8gY29tcGFyaW5nIGEgc2luZ2xlIHBhaXIgb2YgdmFsdWVzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgQXJyYXlFcShjb25zdCBUKiBsaHMsIHNpemVfdCBzaXplLCBjb25zdCBVKiByaHMpOworCisvLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gayBpcyAwLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgYm9vbCBBcnJheUVxKGNvbnN0IFQmIGxocywgY29uc3QgVSYgcmhzKSB7IHJldHVybiBsaHMgPT0gcmhzOyB9CisKKy8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4KK2lubGluZSBib29sIEFycmF5RXEoY29uc3QgVCgmbGhzKVtOXSwgY29uc3QgVSgmcmhzKVtOXSkgeworICByZXR1cm4gaW50ZXJuYWw6OkFycmF5RXEobGhzLCBOLCByaHMpOworfQorCisvLyBUaGlzIGhlbHBlciByZWR1Y2VzIGNvZGUgYmxvYXQuICBJZiB3ZSBpbnN0ZWFkIHB1dCBpdHMgbG9naWMgaW5zaWRlCisvLyB0aGUgcHJldmlvdXMgQXJyYXlFcSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMgd291bGQKKy8vIGxlYWQgdG8gZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgdGVtcGxhdGUgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBBcnJheUVxKGNvbnN0IFQqIGxocywgc2l6ZV90IHNpemUsIGNvbnN0IFUqIHJocykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBzaXplOyBpKyspIHsKKyAgICBpZiAoIWludGVybmFsOjpBcnJheUVxKGxoc1tpXSwgcmhzW2ldKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHJhbmdlIFtiZWdpbiwgZW5kKSB0aGF0CisvLyBlcXVhbHMgZWxlbS4gIEVsZW1lbnQgbWF5IGJlIGEgbmF0aXZlIGFycmF5IHR5cGUgaXRzZWxmLgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXIsIHR5cGVuYW1lIEVsZW1lbnQ+CitJdGVyIEFycmF5QXdhcmVGaW5kKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kLCBjb25zdCBFbGVtZW50JiBlbGVtKSB7CisgIGZvciAoSXRlciBpdCA9IGJlZ2luOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICBpZiAoaW50ZXJuYWw6OkFycmF5RXEoKml0LCBlbGVtKSkKKyAgICAgIHJldHVybiBpdDsKKyAgfQorICByZXR1cm4gZW5kOworfQorCisvLyBDb3B5QXJyYXkoKSBjb3BpZXMgYSBrLWRpbWVuc2lvbmFsIG5hdGl2ZSBhcnJheSB1c2luZyB0aGUgZWxlbWVudHMnCisvLyBvcGVyYXRvcj0sIHdoZXJlIGsgY2FuIGJlIGFueSBpbnRlZ2VyID49IDAuICBXaGVuIGsgaXMgMCwKKy8vIENvcHlBcnJheSgpIGRlZ2VuZXJhdGVzIGludG8gY29weWluZyBhIHNpbmdsZSB2YWx1ZS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Cit2b2lkIENvcHlBcnJheShjb25zdCBUKiBmcm9tLCBzaXplX3Qgc2l6ZSwgVSogdG8pOworCisvLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gayBpcyAwLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgdm9pZCBDb3B5QXJyYXkoY29uc3QgVCYgZnJvbSwgVSogdG8pIHsgKnRvID0gZnJvbTsgfQorCisvLyBUaGlzIG92ZXJsb2FkIGlzIHVzZWQgd2hlbiBrID49IDEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgc2l6ZV90IE4+CitpbmxpbmUgdm9pZCBDb3B5QXJyYXkoY29uc3QgVCgmZnJvbSlbTl0sIFUoKnRvKVtOXSkgeworICBpbnRlcm5hbDo6Q29weUFycmF5KGZyb20sIE4sICp0byk7Cit9CisKKy8vIFRoaXMgaGVscGVyIHJlZHVjZXMgY29kZSBibG9hdC4gIElmIHdlIGluc3RlYWQgcHV0IGl0cyBsb2dpYyBpbnNpZGUKKy8vIHRoZSBwcmV2aW91cyBDb3B5QXJyYXkoKSBmdW5jdGlvbiwgYXJyYXlzIHdpdGggZGlmZmVyZW50IHNpemVzCisvLyB3b3VsZCBsZWFkIHRvIGRpZmZlcmVudCBjb3BpZXMgb2YgdGhlIHRlbXBsYXRlIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3ZvaWQgQ29weUFycmF5KGNvbnN0IFQqIGZyb20sIHNpemVfdCBzaXplLCBVKiB0bykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBzaXplOyBpKyspIHsKKyAgICBpbnRlcm5hbDo6Q29weUFycmF5KGZyb21baV0sIHRvICsgaSk7CisgIH0KK30KKworLy8gVGhlIHJlbGF0aW9uIGJldHdlZW4gYW4gTmF0aXZlQXJyYXkgb2JqZWN0IChzZWUgYmVsb3cpIGFuZCB0aGUKKy8vIG5hdGl2ZSBhcnJheSBpdCByZXByZXNlbnRzLgorZW51bSBSZWxhdGlvblRvU291cmNlIHsKKyAga1JlZmVyZW5jZSwgIC8vIFRoZSBOYXRpdmVBcnJheSByZWZlcmVuY2VzIHRoZSBuYXRpdmUgYXJyYXkuCisgIGtDb3B5ICAgICAgICAvLyBUaGUgTmF0aXZlQXJyYXkgbWFrZXMgYSBjb3B5IG9mIHRoZSBuYXRpdmUgYXJyYXkgYW5kCisgICAgICAgICAgICAgICAvLyBvd25zIHRoZSBjb3B5LgorfTsKKworLy8gQWRhcHRzIGEgbmF0aXZlIGFycmF5IHRvIGEgcmVhZC1vbmx5IFNUTC1zdHlsZSBjb250YWluZXIuICBJbnN0ZWFkCisvLyBvZiB0aGUgY29tcGxldGUgU1RMIGNvbnRhaW5lciBjb25jZXB0LCB0aGlzIGFkYXB0b3Igb25seSBpbXBsZW1lbnRzCisvLyBtZW1iZXJzIHVzZWZ1bCBmb3IgR29vZ2xlIE1vY2sncyBjb250YWluZXIgbWF0Y2hlcnMuICBOZXcgbWVtYmVycworLy8gc2hvdWxkIGJlIGFkZGVkIGFzIG5lZWRlZC4gIFRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiwgd2Ugb25seQorLy8gc3VwcG9ydCBFbGVtZW50IGJlaW5nIGEgcmF3IHR5cGUgKGkuZS4gaGF2aW5nIG5vIHRvcC1sZXZlbCBjb25zdCBvcgorLy8gcmVmZXJlbmNlIG1vZGlmaWVyKS4gIEl0J3MgdGhlIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIHNhdGlzZnkKKy8vIHRoaXMgcmVxdWlyZW1lbnQuICBFbGVtZW50IGNhbiBiZSBhbiBhcnJheSB0eXBlIGl0c2VsZiAoaGVuY2UKKy8vIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgc3VwcG9ydGVkKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgorY2xhc3MgTmF0aXZlQXJyYXkgeworIHB1YmxpYzoKKyAgLy8gU1RMLXN0eWxlIGNvbnRhaW5lciB0eXBlZGVmcy4KKyAgdHlwZWRlZiBFbGVtZW50IHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgRWxlbWVudCogaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgRWxlbWVudCogY29uc3RfaXRlcmF0b3I7CisKKyAgLy8gQ29uc3RydWN0cyBmcm9tIGEgbmF0aXZlIGFycmF5LgorICBOYXRpdmVBcnJheShjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGNvdW50LCBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uKSB7CisgICAgSW5pdChhcnJheSwgY291bnQsIHJlbGF0aW9uKTsKKyAgfQorCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIE5hdGl2ZUFycmF5KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIHsKKyAgICBJbml0KHJocy5hcnJheV8sIHJocy5zaXplXywgcmhzLnJlbGF0aW9uX3RvX3NvdXJjZV8pOworICB9CisKKyAgfk5hdGl2ZUFycmF5KCkgeworICAgIC8vIEVuc3VyZXMgdGhhdCB0aGUgdXNlciBkb2Vzbid0IGluc3RhbnRpYXRlIE5hdGl2ZUFycmF5IHdpdGggYQorICAgIC8vIGNvbnN0IG9yIHJlZmVyZW5jZSB0eXBlLgorICAgIHN0YXRpY19jYXN0PHZvaWQ+KFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjxFbGVtZW50LAorICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oRWxlbWVudCk+KCkpOworICAgIGlmIChyZWxhdGlvbl90b19zb3VyY2VfID09IGtDb3B5KQorICAgICAgZGVsZXRlW10gYXJyYXlfOworICB9CisKKyAgLy8gU1RMLXN0eWxlIGNvbnRhaW5lciBtZXRob2RzLgorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGFycmF5XyArIHNpemVfOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOYXRpdmVBcnJheSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemUoKSA9PSByaHMuc2l6ZSgpICYmCisgICAgICAgIEFycmF5RXEoYmVnaW4oKSwgc2l6ZSgpLCByaHMuYmVnaW4oKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0OyBtYWtlcyBhIGNvcHkgb2YgdGhlIGlucHV0IGFycmF5IGlmCisgIC8vICdyZWxhdGlvbicgaXMga0NvcHkuCisgIHZvaWQgSW5pdChjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGFfc2l6ZSwgUmVsYXRpb25Ub1NvdXJjZSByZWxhdGlvbikgeworICAgIGlmIChyZWxhdGlvbiA9PSBrUmVmZXJlbmNlKSB7CisgICAgICBhcnJheV8gPSBhcnJheTsKKyAgICB9IGVsc2UgeworICAgICAgRWxlbWVudCogY29uc3QgY29weSA9IG5ldyBFbGVtZW50W2Ffc2l6ZV07CisgICAgICBDb3B5QXJyYXkoYXJyYXksIGFfc2l6ZSwgY29weSk7CisgICAgICBhcnJheV8gPSBjb3B5OworICAgIH0KKyAgICBzaXplXyA9IGFfc2l6ZTsKKyAgICByZWxhdGlvbl90b19zb3VyY2VfID0gcmVsYXRpb247CisgIH0KKworICBjb25zdCBFbGVtZW50KiBhcnJheV87CisgIHNpemVfdCBzaXplXzsKKyAgUmVsYXRpb25Ub1NvdXJjZSByZWxhdGlvbl90b19zb3VyY2VfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTmF0aXZlQXJyYXkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZGVmaW5lIEdURVNUX01FU1NBR0VfQVRfKGZpbGUsIGxpbmUsIG1lc3NhZ2UsIHJlc3VsdF90eXBlKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFzc2VydEhlbHBlcihyZXN1bHRfdHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkgXAorICAgID0gOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKworI2RlZmluZSBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCByZXN1bHRfdHlwZSkgXAorICBHVEVTVF9NRVNTQUdFX0FUXyhfX0ZJTEVfXywgX19MSU5FX18sIG1lc3NhZ2UsIHJlc3VsdF90eXBlKQorCisjZGVmaW5lIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKG1lc3NhZ2UpIFwKKyAgcmV0dXJuIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUpCisKKyNkZWZpbmUgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8obWVzc2FnZSkgXAorICBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlKQorCisjZGVmaW5lIEdURVNUX1NVQ0NFU1NfKG1lc3NhZ2UpIFwKKyAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpCisKKy8vIFN1cHByZXNzZXMgTVNWQyB3YXJuaW5ncyA0MDcyICh1bnJlYWNoYWJsZSBjb2RlKSBmb3IgdGhlIGNvZGUgZm9sbG93aW5nCisvLyBzdGF0ZW1lbnQgaWYgaXQgcmV0dXJucyBvciB0aHJvd3MgKG9yIGRvZXNuJ3QgcmV0dXJuIG9yIHRocm93IGluIHNvbWUKKy8vIHNpdHVhdGlvbnMpLgorI2RlZmluZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkgXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfQorCisjZGVmaW5lIEdURVNUX1RFU1RfVEhST1dfKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbnN0Q2hhclB0ciBndGVzdF9tc2cgPSAiIikgeyBcCisgICAgYm9vbCBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSBmYWxzZTsgXAorICAgIHRyeSB7IFwKKyAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICAgIH0gXAorICAgIGNhdGNoIChleHBlY3RlZF9leGNlcHRpb24gY29uc3QmKSB7IFwKKyAgICAgIGd0ZXN0X2NhdWdodF9leHBlY3RlZCA9IHRydWU7IFwKKyAgICB9IFwKKyAgICBjYXRjaCAoLi4uKSB7IFwKKyAgICAgIGd0ZXN0X21zZy52YWx1ZSA9IFwKKyAgICAgICAgICAiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSAiIFwKKyAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50IHR5cGUuIjsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTsgXAorICAgIH0gXAorICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkKSB7IFwKKyAgICAgIGd0ZXN0X21zZy52YWx1ZSA9IFwKKyAgICAgICAgICAiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSAiIFwKKyAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIG5vdGhpbmcuIjsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTsgXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKGd0ZXN0X21zZy52YWx1ZSkKKworI2RlZmluZSBHVEVTVF9URVNUX05PX1RIUk9XXyhzdGF0ZW1lbnQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICB0cnkgeyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICB9IFwKKyAgICBjYXRjaCAoLi4uKSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm90aHJvd18sIF9fTElORV9fKTsgXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vdGhyb3dfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbi5cbiIgXAorICAgICAgICAgICAiICBBY3R1YWw6IGl0IHRocm93cy4iKQorCisjZGVmaW5lIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICBib29sIGd0ZXN0X2NhdWdodF9hbnkgPSBmYWxzZTsgXAorICAgIHRyeSB7IFwKKyAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICAgIH0gXAorICAgIGNhdGNoICguLi4pIHsgXAorICAgICAgZ3Rlc3RfY2F1Z2h0X2FueSA9IHRydWU7IFwKKyAgICB9IFwKKyAgICBpZiAoIWd0ZXN0X2NhdWdodF9hbnkpIHsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rhbnl0aHJvd18sIF9fTElORV9fKTsgXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdGFueXRocm93XywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIgXAorICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXNuJ3QuIikKKworCisvLyBJbXBsZW1lbnRzIEJvb2xlYW4gdGVzdCBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuIGV4cHJlc3Npb24gY2FuIGJlCisvLyBlaXRoZXIgYSBib29sZWFuIGV4cHJlc3Npb24gb3IgYW4gQXNzZXJ0aW9uUmVzdWx0LiB0ZXh0IGlzIGEgdGV4dHVhbAorLy8gcmVwcmVzZW5hdGlvbiBvZiBleHByZXNzaW9uIGFzIGl0IHdhcyBwYXNzZWQgaW50byB0aGUgRVhQRUNUX1RSVUUuCisjZGVmaW5lIEdURVNUX1RFU1RfQk9PTEVBTl8oZXhwcmVzc2lvbiwgdGV4dCwgYWN0dWFsLCBleHBlY3RlZCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hcl8gPSBcCisgICAgICA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdChleHByZXNzaW9uKSkgXAorICAgIDsgXAorICBlbHNlIFwKKyAgICBmYWlsKDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZShcCisgICAgICAgIGd0ZXN0X2FyXywgdGV4dCwgI2FjdHVhbCwgI2V4cGVjdGVkKS5jX3N0cigpKQorCisjZGVmaW5lIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyIGd0ZXN0X2ZhdGFsX2ZhaWx1cmVfY2hlY2tlcjsgXAorICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICAgIGlmIChndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXIuaGFzX25ld19mYXRhbF9mYWlsdXJlKCkpIHsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub2ZhdGFsXywgX19MSU5FX18pOyBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTogXAorICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsICIgXAorICAgICAgICAgICAiZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLlxuIiBcCisgICAgICAgICAgICIgIEFjdHVhbDogaXQgZG9lcy4iKQorCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGdpdmVuIHRlc3QuCisjZGVmaW5lIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAorICB0ZXN0X2Nhc2VfbmFtZSMjXyMjdGVzdF9uYW1lIyNfVGVzdAorCisvLyBIZWxwZXIgbWFjcm8gZm9yIGRlZmluaW5nIHRlc3RzLgorI2RlZmluZSBHVEVTVF9URVNUXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lLCBwYXJlbnRfY2xhc3MsIHBhcmVudF9pZClcCitjbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIDogcHVibGljIHBhcmVudF9jbGFzcyB7XAorIHB1YmxpYzpcCisgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fVwKKyBwcml2YXRlOlwKKyAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7XAorICBzdGF0aWMgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXztcCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXAorICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7XAorfTtcCitcCis6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAorICA6OnRlc3RfaW5mb18gPVwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyhcCisgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgI3Rlc3RfbmFtZSwgTlVMTCwgTlVMTCwgXAorICAgICAgICAocGFyZW50X2lkKSwgXAorICAgICAgICBwYXJlbnRfY2xhc3M6OlNldFVwVGVzdENhc2UsIFwKKyAgICAgICAgcGFyZW50X2NsYXNzOjpUZWFyRG93blRlc3RDYXNlLCBcCisgICAgICAgIG5ldyA6OnRlc3Rpbmc6OmludGVybmFsOjpUZXN0RmFjdG9yeUltcGw8XAorICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4pO1wKK3ZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6VGVzdEJvZHkoKQorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljIEFQSSBmb3IgZGVhdGggdGVzdHMuICBJdCBpcworLy8gI2luY2x1ZGVkIGJ5IGd0ZXN0Lmggc28gYSB1c2VyIGRvZXNuJ3QgbmVlZCB0byBpbmNsdWRlIHRoaXMKKy8vIGRpcmVjdGx5LgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KKworLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGludGVybmFsIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZworLy8gZGVhdGggdGVzdHMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCk7CisKKy8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KK2NvbnN0IGNoYXIga0RlYXRoVGVzdFN0eWxlRmxhZ1tdID0gImRlYXRoX3Rlc3Rfc3R5bGUiOworY29uc3QgY2hhciBrRGVhdGhUZXN0VXNlRm9ya1tdID0gImRlYXRoX3Rlc3RfdXNlX2ZvcmsiOworY29uc3QgY2hhciBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnW10gPSAiaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QiOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRGVhdGhUZXN0IGlzIGEgY2xhc3MgdGhhdCBoaWRlcyBtdWNoIG9mIHRoZSBjb21wbGV4aXR5IG9mIHRoZQorLy8gR1RFU1RfREVBVEhfVEVTVF8gbWFjcm8uICBJdCBpcyBhYnN0cmFjdDsgaXRzIHN0YXRpYyBDcmVhdGUgbWV0aG9kCisvLyByZXR1cm5zIGEgY29uY3JldGUgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZSBwcmV2YWlsaW5nIGRlYXRoIHRlc3QKKy8vIHN0eWxlLCBhcyBkZWZpbmVkIGJ5IHRoZSAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgYW5kL29yCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzLgorCisvLyBJbiBkZXNjcmliaW5nIHRoZSByZXN1bHRzIG9mIGRlYXRoIHRlc3RzLCB0aGVzZSB0ZXJtcyBhcmUgdXNlZCB3aXRoCisvLyB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uczoKKy8vCisvLyBleGl0IHN0YXR1czogIFRoZSBpbnRlZ2VyIGV4aXQgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQKKy8vICAgICAgICAgICAgICAgYnkgd2FpdCgyKQorLy8gZXhpdCBjb2RlOiAgICBUaGUgaW50ZWdlciBjb2RlIHBhc3NlZCB0byBleGl0KDMpLCBfZXhpdCgyKSwgb3IKKy8vICAgICAgICAgICAgICAgcmV0dXJuZWQgZnJvbSBtYWluKCkKK2NsYXNzIEdURVNUX0FQSV8gRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkZXRlcm1pbmluZyB0aGUKKyAgLy8gYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHRha2UgZm9yIHRoZSBjdXJyZW50IGRlYXRoIHRlc3Q7IGZvciBleGFtcGxlLAorICAvLyBpZiB0aGUgZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgorICAvLyBUaGUgTGFzdE1lc3NhZ2UgbWV0aG9kIHdpbGwgcmV0dXJuIGEgbW9yZSBkZXRhaWxlZCBtZXNzYWdlIGluIHRoYXQKKyAgLy8gY2FzZS4gIE90aGVyd2lzZSwgdGhlIERlYXRoVGVzdCBwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlICJ0ZXN0IgorICAvLyBhcmd1bWVudCBpcyBzZXQuICBJZiB0aGUgZGVhdGggdGVzdCBzaG91bGQgYmUgc2tpcHBlZCwgdGhlIHBvaW50ZXIKKyAgLy8gaXMgc2V0IHRvIE5VTEw7IG90aGVyd2lzZSwgaXQgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3IGNvbmNyZXRlCisgIC8vIERlYXRoVGVzdCBvYmplY3QgdGhhdCBjb250cm9scyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHRlc3QuCisgIHN0YXRpYyBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKKyAgRGVhdGhUZXN0KCk7CisgIHZpcnR1YWwgfkRlYXRoVGVzdCgpIHsgfQorCisgIC8vIEEgaGVscGVyIGNsYXNzIHRoYXQgYWJvcnRzIGEgZGVhdGggdGVzdCB3aGVuIGl0J3MgZGVsZXRlZC4KKyAgY2xhc3MgUmV0dXJuU2VudGluZWwgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFJldHVyblNlbnRpbmVsKERlYXRoVGVzdCogdGVzdCkgOiB0ZXN0Xyh0ZXN0KSB7IH0KKyAgICB+UmV0dXJuU2VudGluZWwoKSB7IHRlc3RfLT5BYm9ydChURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQpOyB9CisgICBwcml2YXRlOgorICAgIERlYXRoVGVzdCogY29uc3QgdGVzdF87CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSZXR1cm5TZW50aW5lbCk7CisgIH0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87CisKKyAgLy8gQW4gZW51bWVyYXRpb24gb2YgcG9zc2libGUgcm9sZXMgdGhhdCBtYXkgYmUgdGFrZW4gd2hlbiBhIGRlYXRoCisgIC8vIHRlc3QgaXMgZW5jb3VudGVyZWQuICBFWEVDVVRFIG1lYW5zIHRoYXQgdGhlIGRlYXRoIHRlc3QgbG9naWMgc2hvdWxkCisgIC8vIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiAgT1ZFUlNFRSBtZWFucyB0aGF0IHRoZSBwcm9ncmFtIHNob3VsZCBwcmVwYXJlCisgIC8vIHRoZSBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCBmb3IgYSBjaGlsZCBwcm9jZXNzIHRvIGV4ZWN1dGUgdGhlIGRlYXRoCisgIC8vIHRlc3QsIHRoZW4gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCisgIGVudW0gVGVzdFJvbGUgeyBPVkVSU0VFX1RFU1QsIEVYRUNVVEVfVEVTVCB9OworCisgIC8vIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB0aHJlZSByZWFzb25zIHRoYXQgYSB0ZXN0IG1pZ2h0IGJlIGFib3J0ZWQuCisgIGVudW0gQWJvcnRSZWFzb24geworICAgIFRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCwKKyAgICBURVNUX1RIUkVXX0VYQ0VQVElPTiwKKyAgICBURVNUX0RJRF9OT1RfRElFCisgIH07CisKKyAgLy8gQXNzdW1lcyBvbmUgb2YgdGhlIGFib3ZlIHJvbGVzLgorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKSA9IDA7CisKKyAgLy8gV2FpdHMgZm9yIHRoZSBkZWF0aCB0ZXN0IHRvIGZpbmlzaCBhbmQgcmV0dXJucyBpdHMgc3RhdHVzLgorICB2aXJ0dWFsIGludCBXYWl0KCkgPSAwOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBwYXNzZWQ7IHRoYXQgaXMsIHRoZSB0ZXN0IHByb2Nlc3MKKyAgLy8gZXhpdGVkIGR1cmluZyB0aGUgdGVzdCwgaXRzIGV4aXQgc3RhdHVzIG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkCisgIC8vIHByZWRpY2F0ZSwgYW5kIGl0cyBzdGRlcnIgb3V0cHV0IG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkIHJlZ3VsYXIKKyAgLy8gZXhwcmVzc2lvbi4KKyAgLy8gVGhlIHVzZXItc3VwcGxpZWQgcHJlZGljYXRlIG1heSBiZSBhIG1hY3JvIGV4cHJlc3Npb24gcmF0aGVyCisgIC8vIHRoYW4gYSBmdW5jdGlvbiBwb2ludGVyIG9yIGZ1bmN0b3IsIG9yIGVsc2UgV2FpdCBhbmQgUGFzc2VkIGNvdWxkCisgIC8vIGJlIGNvbWJpbmVkLgorICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgZXhpdF9zdGF0dXNfb2spID0gMDsKKworICAvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgZGlkIG5vdCBkaWUgYXMgZXhwZWN0ZWQuCisgIHZpcnR1YWwgdm9pZCBBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pID0gMDsKKworICAvLyBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgb3V0Y29tZSBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgb3V0Y29tZSBvZgorICAvLyB0aGUgbGFzdCBkZWF0aCB0ZXN0LgorICBzdGF0aWMgY29uc3QgY2hhciogTGFzdE1lc3NhZ2UoKTsKKworICBzdGF0aWMgdm9pZCBzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCisgcHJpdmF0ZToKKyAgLy8gQSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvdXRjb21lIG9mIHRoZSBsYXN0IGRlYXRoIHRlc3QuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWF0aFRlc3QpOworfTsKKworLy8gRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGRlYXRoIHRlc3RzLiAgTWF5IGJlIG1vY2tlZCBvdXQgZm9yIHRlc3RpbmcuCitjbGFzcyBEZWF0aFRlc3RGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkRlYXRoVGVzdEZhY3RvcnkoKSB7IH0KKyAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgPSAwOworfTsKKworLy8gQSBjb25jcmV0ZSBEZWF0aFRlc3RGYWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciBub3JtYWwgdXNlLgorY2xhc3MgRGVmYXVsdERlYXRoVGVzdEZhY3RvcnkgOiBwdWJsaWMgRGVhdGhUZXN0RmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKK307CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBleGl0X3N0YXR1cyBkZXNjcmliZXMgYSBwcm9jZXNzIHRoYXQgd2FzIHRlcm1pbmF0ZWQKKy8vIGJ5IGEgc2lnbmFsLCBvciBleGl0ZWQgbm9ybWFsbHkgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlLgorR1RFU1RfQVBJXyBib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cyk7CisKKy8vIFRyYXBzIEMrKyBleGNlcHRpb25zIGVzY2FwaW5nIHN0YXRlbWVudCBhbmQgcmVwb3J0cyB0aGVtIGFzIHRlc3QKKy8vIGZhaWx1cmVzLiBOb3RlIHRoYXQgdHJhcHBpbmcgU0VIIGV4Y2VwdGlvbnMgaXMgbm90IGltcGxlbWVudGVkIGhlcmUuCisjIGlmIEdURVNUX0hBU19FWENFUFRJT05TCisjICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCisgIHRyeSB7IFwKKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgfSBjYXRjaCAoY29uc3QgOjpzdGQ6OmV4Y2VwdGlvbiYgZ3Rlc3RfZXhjZXB0aW9uKSB7IFwKKyAgICBmcHJpbnRmKFwKKyAgICAgICAgc3RkZXJyLCBcCisgICAgICAgICJcbiVzOiBDYXVnaHQgc3RkOjpleGNlcHRpb24tZGVyaXZlZCBleGNlcHRpb24gZXNjYXBpbmcgdGhlICIgXAorICAgICAgICAiZGVhdGggdGVzdCBzdGF0ZW1lbnQuIEV4Y2VwdGlvbiBtZXNzYWdlOiAlc1xuIiwgXAorICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKS5jX3N0cigpLCBcCisgICAgICAgIGd0ZXN0X2V4Y2VwdGlvbi53aGF0KCkpOyBcCisgICAgZmZsdXNoKHN0ZGVycik7IFwKKyAgICBkZWF0aF90ZXN0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfVEhSRVdfRVhDRVBUSU9OKTsgXAorICB9IGNhdGNoICguLi4pIHsgXAorICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcCisgIH0KKworIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCisgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQorCisjIGVuZGlmCisKKy8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlRfREVBVEgqLCBFWFBFQ1RfREVBVEgqLAorLy8gQVNTRVJUX0VYSVQqLCBhbmQgRVhQRUNUX0VYSVQqLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUmIGd0ZXN0X3JlZ2V4ID0gKHJlZ2V4KTsgXAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdCogZ3Rlc3RfZHQ7IFwKKyAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6Q3JlYXRlKCNzdGF0ZW1lbnQsICZndGVzdF9yZWdleCwgXAorICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICZndGVzdF9kdCkpIHsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcCisgICAgfSBcCisgICAgaWYgKGd0ZXN0X2R0ICE9IE5VTEwpIHsgXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0PiBcCisgICAgICAgICAgZ3Rlc3RfZHRfcHRyKGd0ZXN0X2R0KTsgXAorICAgICAgc3dpdGNoIChndGVzdF9kdC0+QXNzdW1lUm9sZSgpKSB7IFwKKyAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVDogXAorICAgICAgICAgIGlmICghZ3Rlc3RfZHQtPlBhc3NlZChwcmVkaWNhdGUoZ3Rlc3RfZHQtPldhaXQoKSkpKSB7IFwKKyAgICAgICAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTsgXAorICAgICAgICAgIH0gXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIGNhc2UgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpFWEVDVVRFX1RFU1Q6IHsgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6UmV0dXJuU2VudGluZWwgXAorICAgICAgICAgICAgICBndGVzdF9zZW50aW5lbChndGVzdF9kdCk7IFwKKyAgICAgICAgICBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGd0ZXN0X2R0KTsgXAorICAgICAgICAgIGd0ZXN0X2R0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfRElEX05PVF9ESUUpOyBcCisgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGRlZmF1bHQ6IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTogXAorICAgICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkpCisvLyBUaGUgc3ltYm9sICJmYWlsIiBoZXJlIGV4cGFuZHMgdG8gc29tZXRoaW5nIGludG8gd2hpY2ggYSBtZXNzYWdlCisvLyBjYW4gYmUgc3RyZWFtZWQuCisKKy8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlQvRVhQRUNUX0RFQlVHX0RFQVRIIHdoZW4gY29tcGlsZWQgaW4KKy8vIE5ERUJVRyBtb2RlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0aGUgc3RhdGVtZW50cyB0byBiZSBleGVjdXRlZCwgdGhlIHJlZ2V4IGlzCisvLyBpZ25vcmVkLCBhbmQgdGhlIG1hY3JvIG11c3QgYWNjZXB0IGEgc3RyZWFtZWQgbWVzc2FnZSBldmVuIHRob3VnaCB0aGUgbWVzc2FnZQorLy8gaXMgbmV2ZXIgcHJpbnRlZC4KKyMgZGVmaW5lIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICB9IGVsc2UgXAorICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpCisKKy8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgY29udGVudHMgb2YgdGhlCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWcsIGFzIGl0IGV4aXN0ZWQgd2hlbgorLy8gUlVOX0FMTF9URVNUUyB3YXMgY2FsbGVkLgorY2xhc3MgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIHsKKyBwdWJsaWM6CisgIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyhjb25zdCBzdGQ6OnN0cmluZyYgYV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhX3dyaXRlX2ZkKQorICAgICAgOiBmaWxlXyhhX2ZpbGUpLCBsaW5lXyhhX2xpbmUpLCBpbmRleF8oYW5faW5kZXgpLAorICAgICAgICB3cml0ZV9mZF8oYV93cml0ZV9mZCkge30KKworICB+SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgeworICAgIGlmICh3cml0ZV9mZF8gPj0gMCkKKyAgICAgIHBvc2l4OjpDbG9zZSh3cml0ZV9mZF8pOworICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQorICBpbnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVfOyB9CisgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4XzsgfQorICBpbnQgd3JpdGVfZmQoKSBjb25zdCB7IHJldHVybiB3cml0ZV9mZF87IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGZpbGVfOworICBpbnQgbGluZV87CisgIGludCBpbmRleF87CisgIGludCB3cml0ZV9mZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcpOworfTsKKworLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcworLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgorLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgorSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpOworCisjZWxzZSAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGhpcyBtYWNybyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgbWFjcm9zIHN1Y2ggYXMKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgYW5kIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgb24gc3lzdGVtcyB3aGVyZQorLy8gZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRob3NlIG1hY3JvcyBtdXN0IGNvbXBpbGUgb24gc3VjaCBzeXN0ZW1zCisvLyBpZmYgRVhQRUNUX0RFQVRIIGFuZCBBU1NFUlRfREVBVEggY29tcGlsZSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb24KKy8vIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGRlYXRoIHRlc3RzLiBUaGlzIGFsbG93cyBvbmUgdG8gd3JpdGUgc3VjaCBhIG1hY3JvCisvLyBvbiBhIHN5c3RlbSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgZGVhdGggdGVzdHMgYW5kIGJlIHN1cmUgdGhhdCBpdCB3aWxsCisvLyBjb21waWxlIG9uIGEgZGVhdGgtdGVzdCBzdXBwb3J0aW5nIHN5c3RlbS4KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gICBzdGF0ZW1lbnQgLSAgQSBzdGF0ZW1lbnQgdGhhdCBhIG1hY3JvIHN1Y2ggYXMgRVhQRUNUX0RFQVRIIHdvdWxkIHRlc3QKKy8vICAgICAgICAgICAgICAgIGZvciBwcm9ncmFtIHRlcm1pbmF0aW9uLiBUaGlzIG1hY3JvIGhhcyB0byBtYWtlIHN1cmUgdGhpcworLy8gICAgICAgICAgICAgICAgc3RhdGVtZW50IGlzIGNvbXBpbGVkIGJ1dCBub3QgZXhlY3V0ZWQsIHRvIGVuc3VyZSB0aGF0CisvLyAgICAgICAgICAgICAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEIGNvbXBpbGVzIHdpdGggYSBjZXJ0YWluCisvLyAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaWZmIEVYUEVDVF9ERUFUSCBjb21waWxlcyB3aXRoIGl0LgorLy8gICByZWdleCAgICAgLSAgQSByZWdleCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdXNlIHRvIHRlc3QKKy8vICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgb2Ygc3RhdGVtZW50LiAgVGhpcyBwYXJhbWV0ZXIgaGFzIHRvIGJlCisvLyAgICAgICAgICAgICAgICBjb21waWxlZCBidXQgbm90IGV2YWx1YXRlZCBieSB0aGlzIG1hY3JvLCB0byBlbnN1cmUgdGhhdAorLy8gICAgICAgICAgICAgICAgdGhpcyBtYWNybyBvbmx5IGFjY2VwdHMgZXhwcmVzc2lvbnMgdGhhdCBhIG1hY3JvIHN1Y2ggYXMKKy8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSCB3b3VsZCBhY2NlcHQuCisvLyAgIHRlcm1pbmF0b3IgLSBNdXN0IGJlIGFuIGVtcHR5IHN0YXRlbWVudCBmb3IgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRAorLy8gICAgICAgICAgICAgICAgYW5kIGEgcmV0dXJuIHN0YXRlbWVudCBmb3IgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRC4KKy8vICAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgd2lsbCBub3QKKy8vICAgICAgICAgICAgICAgIGNvbXBpbGUgaW5zaWRlIGZ1bmN0aW9ucyB3aGVyZSBBU1NFUlRfREVBVEggZG9lc24ndAorLy8gICAgICAgICAgICAgICAgY29tcGlsZS4KKy8vCisvLyAgVGhlIGJyYW5jaCB0aGF0IGhhcyBhbiBhbHdheXMgZmFsc2UgY29uZGl0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKKy8vICBzdGF0ZW1lbnQgYW5kIHJlZ2V4IGFyZSBjb21waWxlZCAoYW5kIHRodXMgc3ludGFjdGljYWxseSBjb3JyZWN0KSBidXQKKy8vICBuZXZlciBleGVjdXRlZC4gVGhlIHVucmVhY2hhYmxlIGNvZGUgbWFjcm8gcHJvdGVjdHMgdGhlIHRlcm1pbmF0b3IKKy8vICBzdGF0ZW1lbnQgZnJvbSBnZW5lcmF0aW5nIGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGluIGNhc2UKKy8vICBzdGF0ZW1lbnQgdW5jb25kaXRpb25hbGx5IHJldHVybnMgb3IgdGhyb3dzLiBUaGUgTWVzc2FnZSBjb25zdHJ1Y3RvciBhdAorLy8gIHRoZSBlbmQgYWxsb3dzIHRoZSBzeW50YXggb2Ygc3RyZWFtaW5nIGFkZGl0aW9uYWwgbWVzc2FnZXMgaW50byB0aGUKKy8vICBtYWNybywgZm9yIGNvbXBpbGF0aW9uYWwgY29tcGF0aWJpbGl0eSB3aXRoIEVYUEVDVF9ERUFUSC9BU1NFUlRfREVBVEguCisjIGRlZmluZSBHVEVTVF9VTlNVUFBPUlRFRF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHJlZ2V4LCB0ZXJtaW5hdG9yKSBcCisgICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSBcCisgICAgICAgICAgPDwgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uXG4iIFwKKyAgICAgICAgICA8PCAiU3RhdGVtZW50ICciICNzdGF0ZW1lbnQgIicgY2Fubm90IGJlIHZlcmlmaWVkLiI7IFwKKyAgICB9IGVsc2UgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpIHsgXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkU6OlBhcnRpYWxNYXRjaCgiLioiLCAocmVnZXgpKTsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgICB0ZXJtaW5hdG9yOyBcCisgICAgfSBlbHNlIFwKKyAgICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB0aGUgc3R5bGUgb2YgZGVhdGggdGVzdHMuICBWYWxpZCB2YWx1ZXMgYXJlICJ0aHJlYWRzYWZlIiwKKy8vIG1lYW5pbmcgdGhhdCB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHdpbGwgcmUtZXhlY3V0ZSB0aGUgdGVzdCBiaW5hcnkKKy8vIGZyb20gdGhlIHN0YXJ0LCBydW5uaW5nIG9ubHkgYSBzaW5nbGUgZGVhdGggdGVzdCwgb3IgImZhc3QiLAorLy8gbWVhbmluZyB0aGF0IHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZXhlY3V0ZSB0aGUgdGVzdCBsb2dpYyBpbW1lZGlhdGVseQorLy8gYWZ0ZXIgZm9ya2luZy4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFJldHVybnMgYSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2FsbGVyIGlzIGN1cnJlbnRseQorLy8gZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuICBUb29scyBzdWNoIGFzCisvLyBWYWxncmluZCBoZWFwIGNoZWNrZXJzIG1heSBuZWVkIHRoaXMgdG8gbW9kaWZ5IHRoZWlyIGJlaGF2aW9yIGluIGRlYXRoCisvLyB0ZXN0cy4gIElNUE9SVEFOVDogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5LiAgVXNpbmcgaXQgbWF5IGJyZWFrIHRoZQorLy8gaW1wbGVtZW50YXRpb24gb2YgZGVhdGggdGVzdHMuICBVc2VyIGNvZGUgTVVTVCBOT1QgdXNlIGl0LgorR1RFU1RfQVBJXyBib29sIEluRGVhdGhUZXN0Q2hpbGQoKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVhdGggdGVzdHMuCisKKy8vIEhlcmUncyB3aGF0IGhhcHBlbnMgd2hlbiBhbiBBU1NFUlRfREVBVEgqIG9yIEVYUEVDVF9ERUFUSCogaXMKKy8vIGV4ZWN1dGVkOgorLy8KKy8vICAgMS4gSXQgZ2VuZXJhdGVzIGEgd2FybmluZyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFjdGl2ZQorLy8gICB0aHJlYWQuICBUaGlzIGlzIGJlY2F1c2UgaXQncyBzYWZlIHRvIGZvcmsoKSBvciBjbG9uZSgpIG9ubHkKKy8vICAgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0aHJlYWQuCisvLworLy8gICAyLiBUaGUgcGFyZW50IHByb2Nlc3MgY2xvbmUoKXMgYSBzdWItcHJvY2VzcyBhbmQgcnVucyB0aGUgZGVhdGgKKy8vICAgdGVzdCBpbiBpdDsgdGhlIHN1Yi1wcm9jZXNzIGV4aXRzIHdpdGggY29kZSAwIGF0IHRoZSBlbmQgb2YgdGhlCisvLyAgIGRlYXRoIHRlc3QsIGlmIGl0IGhhc24ndCBleGl0ZWQgYWxyZWFkeS4KKy8vCisvLyAgIDMuIFRoZSBwYXJlbnQgcHJvY2VzcyB3YWl0cyBmb3IgdGhlIHN1Yi1wcm9jZXNzIHRvIHRlcm1pbmF0ZS4KKy8vCisvLyAgIDQuIFRoZSBwYXJlbnQgcHJvY2VzcyBjaGVja3MgdGhlIGV4aXQgY29kZSBhbmQgZXJyb3IgbWVzc2FnZSBvZgorLy8gICB0aGUgc3ViLXByb2Nlc3MuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBBU1NFUlRfREVBVEgoc2VydmVyLlNlbmRNZXNzYWdlKDU2LCAiSGVsbG8iKSwgIkludmFsaWQgcG9ydCBudW1iZXIiKTsKKy8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKy8vICAgICBFWFBFQ1RfREVBVEgoc2VydmVyLlByb2Nlc3NSZXF1ZXN0KGkpLAorLy8gICAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1ZXN0IC4qIGluIFByb2Nlc3NSZXF1ZXN0KCkiKQorLy8gICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGRpZSBvbiByZXF1ZXN0ICIgPDwgaTsKKy8vICAgfQorLy8KKy8vICAgQVNTRVJUX0VYSVQoc2VydmVyLkV4aXROb3coKSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIkV4aXRpbmciKTsKKy8vCisvLyAgIGJvb2wgS2lsbGVkQnlTSUdIVVAoaW50IGV4aXRfY29kZSkgeworLy8gICAgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X2NvZGUpICYmIFdURVJNU0lHKGV4aXRfY29kZSkgPT0gU0lHSFVQOworLy8gICB9CisvLworLy8gICBBU1NFUlRfRVhJVChjbGllbnQuSGFuZ1VwU2VydmVyKCksIEtpbGxlZEJ5U0lHSFVQLCAiSGFuZ2luZyB1cCEiKTsKKy8vCisvLyBPbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGluIGRlYXRoIHRlc3RzOgorLy8KKy8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LAorLy8gICB3aGljaCB1c2VzIHRoZSBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguCisvLworLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleAorLy8gICBzeW50YXggaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBHb29nbGUgVGVzdC4gIFRoaXMgbGltaXRlZAorLy8gICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZW5vdWdoIG1vc3Qgb2YgdGhlIHRpbWUgd2hlbiB3cml0aW5nCisvLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQorLy8gICBvciBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydAorLy8gICB1bmlvbiAoInh8eSIpLCBncm91cGluZyAoIih4eSkiKSwgYnJhY2tldHMgKCJbeHldIiksIGFuZAorLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4KKy8vCisvLyAgIEJlbG93IGlzIHRoZSBzeW50YXggdGhhdCB3ZSBkbyBzdXBwb3J0LiAgV2UgY2hvc2UgaXQgdG8gYmUgYQorLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvCisvLyAgIGxlYXJuIHdoZXJldmVyIHlvdSBjb21lIGZyb20uICBJbiB0aGUgZm9sbG93aW5nOiAnQScgZGVub3RlcyBhCisvLyAgIGxpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKC4pLCBvciBhIHNpbmdsZSBcXCBlc2NhcGUgc2VxdWVuY2U7CisvLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yCisvLyAgIG5hdHVyYWwgbnVtYmVycy4KKy8vCisvLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYworLy8gICAgIFxcZCAgIG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXEQgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXGYgICBtYXRjaGVzIFxmCisvLyAgICAgXFxuICAgbWF0Y2hlcyBcbgorLy8gICAgIFxcciAgIG1hdGNoZXMgXHIKKy8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4KKy8vICAgICBcXFMgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UKKy8vICAgICBcXHQgICBtYXRjaGVzIFx0CisvLyAgICAgXFx2ICAgbWF0Y2hlcyBcdgorLy8gICAgIFxcdyAgIG1hdGNoZXMgYW55IGxldHRlciwgXywgb3IgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcVyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IFxcdyBkb2Vzbid0IG1hdGNoCisvLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uCisvLyAgICAgLiAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgXG4KKy8vICAgICBBPyAgICBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBBCisvLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQorLy8gICAgIEErICAgIG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIEEKKy8vICAgICBeICAgICBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICB4eSAgICBtYXRjaGVzIHggZm9sbG93ZWQgYnkgeQorLy8KKy8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcworLy8gICBub3QgaW1wbGVtZW50ZWQgYnkgdXMsIHlvdSB3aWxsIGdldCBhIHJ1bi10aW1lIGZhaWx1cmUuICBJbiB0aGF0CisvLyAgIGNhc2UsIHBsZWFzZSB0cnkgdG8gcmV3cml0ZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gdGhlCisvLyAgIGFib3ZlIHN5bnRheC4KKy8vCisvLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgKm5vdCogbWVhbnQgdG8gYmUgYXMgaGlnaGx5IHR1bmVkIG9yIHJvYnVzdAorLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQorLy8gICBkZWF0aCB0ZXN0LCB3aGljaCBhbHJlYWR5IGluY3VycyBzaWduaWZpY2FudCBvdmVyaGVhZCBieSBsYXVuY2hpbmcKKy8vICAgYSBjaGlsZCBwcm9jZXNzLgorLy8KKy8vIEtub3duIGNhdmVhdHM6CisvLworLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QKKy8vICAgcHJvZ3JhbSBmcm9tIGFyZ3ZbMF0gYW5kIHJlLWV4ZWN1dGVzIGl0IGluIHRoZSBzdWItcHJvY2Vzcy4gIEZvcgorLy8gICBzaW1wbGljaXR5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSAorLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdAorLy8gICBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lCisvLyAgIHBhdGggc2VwYXJhdG9yIChlLmcuIHBhdGgvdG8vZm9vX3Rlc3QgYW5kCisvLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMKKy8vICAgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBwZW9wbGUgdXN1YWxseSBkb24ndCBwdXQgdGhlIHRlc3QgYmluYXJ5CisvLyAgIGRpcmVjdG9yeSBpbiBQQVRILgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzIHNlYXJjaCB0aGUgUEFUSC4KKworLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuCisvLyBpbnRlZ2VyIGV4aXQgc3RhdHVzIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dAorLy8gdGhhdCBtYXRjaGVzIHJlZ2V4LgorIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCisgICAgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQorLy8gdGVzdCBjYXNlLCBpZiBhbnk6CisjIGRlZmluZSBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKKyAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIGVpdGhlciBieQorLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQorLy8gc2lnbmFsLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0IHRoYXQgbWF0Y2hlcyByZWdleC4KKyMgZGVmaW5lIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIExpa2UgQVNTRVJUX0RFQVRILCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCisvLyB0ZXN0IGNhc2UsIGlmIGFueToKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIFR3byBwcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHtBU1NFUlQsRVhQRUNUfV9FWElUKjoKKworLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4KK2NsYXNzIEdURVNUX0FQSV8gRXhpdGVkV2l0aENvZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXhpdGVkV2l0aENvZGUmIG90aGVyKTsKKworICBjb25zdCBpbnQgZXhpdF9jb2RlXzsKK307CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHRoYXQgYW4gZXhpdCBjb2RlIGRlc2NyaWJlcyBhbiBleGl0IGR1ZSB0byB0ZXJtaW5hdGlvbiBieSBhCisvLyBnaXZlbiBzaWduYWwuCitjbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEtpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pOworICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsKKyBwcml2YXRlOgorICBjb25zdCBpbnQgc2lnbnVtXzsKK307CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgorLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAorLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKKy8vIGluIGRlYnVnIG1vZGUuCisvLworLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQorLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKKy8vCisvLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7CisvLyAgIGlmIChzaWRlZWZmZWN0KSB7CisvLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKKy8vICAgfQorLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOworLy8gICByZXR1cm4gMTI7CisvLyB9CisvLworLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7CisvLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKKy8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KKy8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7CisvLworLy8gI2lmZGVmIE5ERUJVRworLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgorLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworLy8gI2Vsc2UKKy8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgorLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisvLyAjZW5kaWYKKy8vIH0KKy8vCisvLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCisvLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCisvLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91CisvLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0CisvLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCisvLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgorLy8KKy8vIEVYUEVDVF9ERUJVR19ERUFUSCh7CisvLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KKy8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCisvLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKKy8vIH0sICJkZWF0aCIpOworLy8KKyMgaWZkZWYgTkRFQlVHCisKKyMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBHVEVTVF9FWEVDVVRFX1NUQVRFTUVOVF8oc3RhdGVtZW50LCByZWdleCkKKworIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KQorCisjIGVsc2UKKworIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorCisjICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisKKyMgZW5kaWYgIC8vIE5ERUJVRyBmb3IgRVhQRUNUX0RFQlVHX0RFQVRICisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgYW5kCisvLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmCisvLyBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgdGhleSBqdXN0IGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMKKy8vIHVzZWZ1bCB3aGVuIHlvdSBhcmUgY29tYmluaW5nIGRlYXRoIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIG5vcm1hbCB0ZXN0CisvLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0LgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisjIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorI2Vsc2UKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsICkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBNZXNzYWdlIGNsYXNzLgorLy8KKy8vIElNUE9SVEFOVCBOT1RFOiBEdWUgdG8gbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlLCB3ZSBoYXZlIHRvCisvLyBsZWF2ZSBzb21lIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaW4gdGhpcyBoZWFkZXIgZmlsZS4KKy8vIFRoZXkgYXJlIGNsZWFybHkgbWFya2VkIGJ5IGNvbW1lbnRzIGxpa2UgdGhpczoKKy8vCisvLyAgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKy8vCisvLyBTdWNoIGNvZGUgaXMgTk9UIG1lYW50IHRvIGJlIHVzZWQgYnkgYSB1c2VyIGRpcmVjdGx5LCBhbmQgaXMgc3ViamVjdAorLy8gdG8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLiAgVGhlcmVmb3JlIERPIE5PVCBERVBFTkQgT04gSVQgaW4gYSB1c2VyCisvLyBwcm9ncmFtIQorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKworI2luY2x1ZGUgPGxpbWl0cz4KKworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSBNZXNzYWdlIGNsYXNzIHdvcmtzIGxpa2UgYW4gb3N0cmVhbSByZXBlYXRlci4KKy8vCisvLyBUeXBpY2FsIHVzYWdlOgorLy8KKy8vICAgMS4gWW91IHN0cmVhbSBhIGJ1bmNoIG9mIHZhbHVlcyB0byBhIE1lc3NhZ2Ugb2JqZWN0LgorLy8gICAgICBJdCB3aWxsIHJlbWVtYmVyIHRoZSB0ZXh0IGluIGEgc3RyaW5nc3RyZWFtLgorLy8gICAyLiBUaGVuIHlvdSBzdHJlYW0gdGhlIE1lc3NhZ2Ugb2JqZWN0IHRvIGFuIG9zdHJlYW0uCisvLyAgICAgIFRoaXMgY2F1c2VzIHRoZSB0ZXh0IGluIHRoZSBNZXNzYWdlIHRvIGJlIHN0cmVhbWVkCisvLyAgICAgIHRvIHRoZSBvc3RyZWFtLgorLy8KKy8vIEZvciBleGFtcGxlOworLy8KKy8vICAgdGVzdGluZzo6TWVzc2FnZSBmb287CisvLyAgIGZvbyA8PCAxIDw8ICIgIT0gIiA8PCAyOworLy8gICBzdGQ6OmNvdXQgPDwgZm9vOworLy8KKy8vIHdpbGwgcHJpbnQgIjEgIT0gMiIuCisvLworLy8gTWVzc2FnZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5oZXJpdGVkIGZyb20uICBJbiBwYXJ0aWN1bGFyLCBpdHMKKy8vIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCisvLworLy8gTm90ZSB0aGF0IHN0cmluZ3N0cmVhbSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGdjYyBhbmQgaW4gTVNWQy4gIFlvdQorLy8gY2FuIHN0cmVhbSBhIE5VTEwgY2hhciBwb2ludGVyIHRvIGl0IGluIHRoZSBmb3JtZXIsIGJ1dCBub3QgaW4gdGhlCisvLyBsYXR0ZXIgKGl0IGNhdXNlcyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHlvdSBkbykuICBUaGUgTWVzc2FnZQorLy8gY2xhc3MgaGlkZXMgdGhpcyBkaWZmZXJlbmNlIGJ5IHRyZWF0aW5nIGEgTlVMTCBjaGFyIHBvaW50ZXIgYXMKKy8vICIobnVsbCkiLgorY2xhc3MgR1RFU1RfQVBJXyBNZXNzYWdlIHsKKyBwcml2YXRlOgorICAvLyBUaGUgdHlwZSBvZiBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgZm9yCisgIC8vIG5hcnJvdyBzdHJlYW1zLgorICB0eXBlZGVmIHN0ZDo6b3N0cmVhbSYgKCpCYXNpY05hcnJvd0lvTWFuaXApKHN0ZDo6b3N0cmVhbSYpOworCisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCisgIC8vIFdlIGFsbG9jYXRlIHRoZSBzdHJpbmdzdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIG90aGVyd2lzZSBlYWNoIHVzZSBvZgorICAvLyBBU1NFUlQvRVhQRUNUIGluIGEgcHJvY2VkdXJlIGFkZHMgb3ZlciAyMDAgYnl0ZXMgdG8gdGhlIHByb2NlZHVyZSdzCisgIC8vIHN0YWNrIGZyYW1lIGxlYWRpbmcgdG8gaHVnZSBzdGFjayBmcmFtZXMgaW4gc29tZSBjYXNlczsgZ2NjIGRvZXMgbm90IHJldXNlCisgIC8vIHRoZSBzdGFjayBzcGFjZS4KKyAgTWVzc2FnZSgpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7CisgICAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKKyAgICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCisgICAgKnNzXyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMik7CisgIH0KKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1zZykgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsgIC8vIE5PTElOVAorICAgICpzc18gPDwgbXNnLkdldFN0cmluZygpOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorICBleHBsaWNpdCBNZXNzYWdlKGNvbnN0IGNoYXIqIHN0cikgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsKKyAgICAqc3NfIDw8IHN0cjsKKyAgfQorCisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAvLyBTdHJlYW1zIGEgdmFsdWUgKGVpdGhlciBhIHBvaW50ZXIgb3Igbm90KSB0byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJiB2YWx1ZSkgeworICAgIFN0cmVhbUhlbHBlcih0eXBlbmFtZSBpbnRlcm5hbDo6aXNfcG9pbnRlcjxUPjo6dHlwZSgpLCB2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZWxzZQorICAvLyBTdHJlYW1zIGEgbm9uLXBvaW50ZXIgdmFsdWUgdG8gdGhpcyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsKSB7CisgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXy5nZXQoKSwgdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTdHJlYW1zIGEgcG9pbnRlciB2YWx1ZSB0byB0aGlzIG9iamVjdC4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBvdmVybG9hZCBvZiB0aGUgcHJldmlvdXMgb25lLiAgV2hlbiB5b3UKKyAgLy8gc3RyZWFtIGEgcG9pbnRlciB0byBhIE1lc3NhZ2UsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQgYXMgaXQKKyAgLy8gaXMgbW9yZSBzcGVjaWFsaXplZC4gIChUaGUgQysrIFN0YW5kYXJkLCBzZWN0aW9uCisgIC8vIFt0ZW1wLmZ1bmMub3JkZXJdLikgIElmIHlvdSBzdHJlYW0gYSBub24tcG9pbnRlciwgdGhlbiB0aGUKKyAgLy8gcHJldmlvdXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQuCisgIC8vCisgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgb3ZlcmxvYWQgaXMgdGhhdCBzdHJlYW1pbmcgYSBOVUxMIHBvaW50ZXIgdG8KKyAgLy8gb3N0cmVhbSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuICBEZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLCB5b3UKKyAgLy8gbWF5IGdldCAiMCIsICIobmlsKSIsICIobnVsbCkiLCBvciBhbiBhY2Nlc3MgdmlvbGF0aW9uLiAgVG8KKyAgLy8gZW5zdXJlIGNvbnNpc3RlbnQgcmVzdWx0IGFjcm9zcyBjb21waWxlcnMsIHdlIGFsd2F5cyB0cmVhdCBOVUxMCisgIC8vIGFzICIobnVsbCkiLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KFQqIGNvbnN0JiBwb2ludGVyKSB7ICAvLyBOT0xJTlQKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAqc3NfIDw8ICIobnVsbCkiOworICAgIH0gZWxzZSB7CisgICAgICA6OkdUZXN0U3RyZWFtVG9IZWxwZXIoc3NfLmdldCgpLCBwb2ludGVyKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBTaW5jZSB0aGUgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIGFyZSBvdmVybG9hZGVkIGZvciBib3RoIG5hcnJvdworICAvLyBhbmQgd2lkZSBzdHJlYW1zLCB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyBzcGVjaWFsaXplZCBkZWZpbml0aW9uCisgIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgLy8gdGVtcGxhdGl6ZWQgdmVyc2lvbiBhYm92ZS4gIFdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLCBzdHJlYW1pbmcKKyAgLy8gZW5kbCBvciBvdGhlciBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgdG8gTWVzc2FnZSB3aWxsIGNvbmZ1c2UgdGhlCisgIC8vIGNvbXBpbGVyLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChCYXNpY05hcnJvd0lvTWFuaXAgdmFsKSB7CisgICAgKnNzXyA8PCB2YWw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChib29sIGIpIHsKKyAgICByZXR1cm4gKnRoaXMgPDwgKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorCisgIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKKyAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorICBNZXNzYWdlJiBvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisgIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisgIC8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKyAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKyAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyAgLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYW4gc3RkOjpzdHJpbmcuCisgIC8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorICAvLworICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisgIHN0ZDo6c3RyaW5nIEdldFN0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKHNzXy5nZXQoKSk7CisgIH0KKworIHByaXZhdGU6CisKKyNpZiBHVEVTVF9PU19TWU1CSUFOCisgIC8vIFRoZXNlIGFyZSBuZWVkZWQgYXMgdGhlIE5va2lhIFN5bWJpYW4gQ29tcGlsZXIgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCisgIC8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiBUaGUgTm9raWEgY29tcGlsZXIgX2Nhbl8KKyAgLy8gZGVjaWRlIGJldHdlZW4gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBUIGFuZCBUKiwgc28gYQorICAvLyB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3JrcywgYW5kIHdlIGNhbiBvdmVybG9hZCBvbiB0aGF0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgU3RyZWFtSGVscGVyKGludGVybmFsOjp0cnVlX3R5cGUgLypkdW1teSovLCBUKiBwb2ludGVyKSB7CisgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgKnNzXyA8PCAiKG51bGwpIjsKKyAgICB9IGVsc2UgeworICAgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXy5nZXQoKSwgcG9pbnRlcik7CisgICAgfQorICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OmZhbHNlX3R5cGUgLypkdW1teSovLCBjb25zdCBUJiB2YWx1ZSkgeworICAgIDo6R1Rlc3RTdHJlYW1Ub0hlbHBlcihzc18uZ2V0KCksIHZhbHVlKTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCisKKyAgLy8gV2UnbGwgaG9sZCB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBoZXJlLgorICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjpzdGQ6OnN0cmluZ3N0cmVhbT4gc3NfOworCisgIC8vIFdlIGRlY2xhcmUgKGJ1dCBkb24ndCBpbXBsZW1lbnQpIHRoaXMgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgLy8gZnJvbSBpbXBsZW1lbnRpbmcgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmKTsKK307CisKKy8vIFN0cmVhbXMgYSBNZXNzYWdlIHRvIGFuIG9zdHJlYW0uCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNZXNzYWdlJiBzYikgeworICByZXR1cm4gb3MgPDwgc2IuR2V0U3RyaW5nKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gTWFjcm9zIGFuZCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzCisvLyBpbiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KKworCisvLyBWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFsbG93IHlvdSB0byB0ZXN0IHlvdXIgY29kZSB3aXRoIGRpZmZlcmVudAorLy8gcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuCisvLworLy8gSGVyZSBpcyBob3cgeW91IHVzZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzOgorCisjaWYgMAorCisvLyBUbyB3cml0ZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCBmaXJzdCB5b3Ugc2hvdWxkIGRlZmluZSBhIGZpeHR1cmUKKy8vIGNsYXNzLiBJdCBpcyB1c3VhbGx5IGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFQ+IChzZWUgYmVsb3cgZm9yCisvLyBhbm90aGVyIGluaGVyaXRhbmNlIHNjaGVtZSB0aGF0J3Mgc29tZXRpbWVzIHVzZWZ1bCBpbiBtb3JlIGNvbXBsaWNhdGVkCisvLyBjbGFzcyBoaWVyYXJjaGllcyksIHdoZXJlIHRoZSB0eXBlIG9mIHlvdXIgcGFyYW1ldGVyIHZhbHVlcy4KKy8vIFRlc3RXaXRoUGFyYW08VD4gaXMgaXRzZWxmIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0LiBUIGNhbiBiZSBhbnkKKy8vIGNvcHlhYmxlIHR5cGUuIElmIGl0J3MgYSByYXcgcG9pbnRlciwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisvLyBsaWZlc3BhbiBvZiB0aGUgcG9pbnRlZCB2YWx1ZXMuCisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7CisgIC8vIFlvdSBjYW4gaW1wbGVtZW50IGFsbCB0aGUgdXN1YWwgY2xhc3MgZml4dHVyZSBtZW1iZXJzIGhlcmUuCit9OworCisvLyBUaGVuLCB1c2UgdGhlIFRFU1RfUCBtYWNybyB0byBkZWZpbmUgYXMgbWFueSBwYXJhbWV0ZXJpemVkIHRlc3RzCisvLyBmb3IgdGhpcyBmaXh0dXJlIGFzIHlvdSB3YW50LiBUaGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIKKy8vIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdSBwcmVmZXIgdG8gdGhpbmsuCisKK1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyIHdpdGggdGhlIEdldFBhcmFtKCkgbWV0aG9kCisgIC8vIG9mIHRoZSBUZXN0V2l0aFBhcmFtPFQ+IGNsYXNzOgorICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7CisgIC4uLgorfQorCitURVNUX1AoRm9vVGVzdCwgSGFzQmxhaEJsYWgpIHsKKyAgLi4uCit9CisKKy8vIEZpbmFsbHksIHlvdSBjYW4gdXNlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0CisvLyBjYXNlIHdpdGggYW55IHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3YW50LiBHb29nbGUgVGVzdCBkZWZpbmVzIGEgbnVtYmVyCisvLyBvZiBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGVzdCBwYXJhbWV0ZXJzLiBUaGV5IHJldHVybiB3aGF0IHdlIGNhbGwKKy8vIChzdXJwcmlzZSEpIHBhcmFtZXRlciBnZW5lcmF0b3JzLiBIZXJlIGlzIGEgIHN1bW1hcnkgb2YgdGhlbSwgd2hpY2gKKy8vIGFyZSBhbGwgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlOgorLy8KKy8vCisvLyAgUmFuZ2UoYmVnaW4sIGVuZCBbLCBzdGVwXSkgLSBZaWVsZHMgdmFsdWVzIHtiZWdpbiwgYmVnaW4rc3RlcCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luK3N0ZXArc3RlcCwgLi4ufS4gVGhlIHZhbHVlcyBkbyBub3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZW5kLiBzdGVwIGRlZmF1bHRzIHRvIDEuCisvLyAgVmFsdWVzKHYxLCB2MiwgLi4uLCB2TikgICAgLSBZaWVsZHMgdmFsdWVzIHt2MSwgdjIsIC4uLiwgdk59LgorLy8gIFZhbHVlc0luKGNvbnRhaW5lcikgICAgICAgIC0gWWllbGRzIHZhbHVlcyBmcm9tIGEgQy1zdHlsZSBhcnJheSwgYW4gU1RMCisvLyAgVmFsdWVzSW4oYmVnaW4sZW5kKSAgICAgICAgICBjb250YWluZXIsIG9yIGFuIGl0ZXJhdG9yIHJhbmdlIFtiZWdpbiwgZW5kKS4KKy8vICBCb29sKCkgICAgICAgICAgICAgICAgICAgICAtIFlpZWxkcyBzZXF1ZW5jZSB7ZmFsc2UsIHRydWV9LgorLy8gIENvbWJpbmUoZzEsIGcyLCAuLi4sIGdOKSAgIC0gWWllbGRzIGFsbCBjb21iaW5hdGlvbnMgKHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtYXRoIHNhdnZ5KSBvZiB0aGUgdmFsdWVzIGdlbmVyYXRlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIE4gZ2VuZXJhdG9ycy4KKy8vCisvLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBiZWxvdworLy8gaW4gdGhpcyBmaWxlLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgZnJvbSB0aGUgRm9vVGVzdCB0ZXN0IGNhc2UKKy8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJtZWVueSIsICJtaW55IiwgYW5kICJtb2UiLgorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvb1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoIm1lZW55IiwgIm1pbnkiLCAibW9lIikpOworCisvLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCAoeWVzLCB5b3UKKy8vIGNhbiBpbnN0YW50aWF0ZSBpdCBtb3JlIHRoZW4gb25jZSkgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQorLy8gYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IgZGlmZmVyZW50CisvLyBpbnN0YW50aWF0aW9ucy4gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlCisvLyB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgIm1lZW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJtaW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzIgZm9yICJtb2UiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgIm1lZW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJtaW55IgorLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzIgZm9yICJtb2UiCisvLworLy8gWW91IGNhbiB1c2UgdGhlc2UgbmFtZXMgaW4gLS1ndGVzdF9maWx0ZXIuCisvLworLy8gVGhpcyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMgZnJvbSBGb29UZXN0IGFnYWluLCBlYWNoCisvLyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgImNhdCIgYW5kICJkb2ciOgorCitjb25zdCBjaGFyKiBwZXRzW10gPSB7ImNhdCIsICJkb2cifTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZSwgRm9vVGVzdCwgVmFsdWVzSW4ocGV0cykpOworCisvLyBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUgdGhlc2UgbmFtZXM6CisvLworLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAiY2F0IgorLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAiZG9nIgorLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAiY2F0IgorLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAiZG9nIgorLy8KKy8vIFBsZWFzZSBub3RlIHRoYXQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMKKy8vIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UsIHdoZXRoZXIgdGhlaXIgZGVmaW5pdGlvbnMgY29tZSBiZWZvcmUgb3IKKy8vIEFGVEVSIHRoZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBzdGF0ZW1lbnQuCisvLworLy8gUGxlYXNlIGFsc28gbm90ZSB0aGF0IGdlbmVyYXRvciBleHByZXNzaW9ucyAoaW5jbHVkaW5nIHBhcmFtZXRlcnMgdG8gdGhlCisvLyBnZW5lcmF0b3JzKSBhcmUgZXZhbHVhdGVkIGluIEluaXRHb29nbGVUZXN0KCksIGFmdGVyIG1haW4oKSBoYXMgc3RhcnRlZC4KKy8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIG9uIG9uZSBoYW5kLCB0byBhZGp1c3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgaW4gb3JkZXIKKy8vIHRvIGR5bmFtaWNhbGx5IGRldGVybWluZSBhIHNldCBvZiB0ZXN0cyB0byBydW4gYW5kIG9uIHRoZSBvdGhlciBoYW5kLAorLy8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBpbnNwZWN0IHRoZSBnZW5lcmF0ZWQgdGVzdHMgd2l0aCBHb29nbGUgVGVzdAorLy8gcmVmbGVjdGlvbiBBUEkgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBleGVjdXRlZC4KKy8vCisvLyBZb3UgY2FuIHNlZSBzYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgYW5kIHNhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYworLy8gZm9yIG1vcmUgZXhhbXBsZXMuCisvLworLy8gSW4gdGhlIGZ1dHVyZSwgd2UgcGxhbiB0byBwdWJsaXNoIHRoZSBBUEkgZm9yIGRlZmluaW5nIG5ldyBwYXJhbWV0ZXIKKy8vIGdlbmVyYXRvcnMuIEJ1dCBmb3Igbm93IHRoaXMgaW50ZXJmYWNlIHJlbWFpbnMgcGFydCBvZiB0aGUgaW50ZXJuYWwKKy8vIGltcGxlbWVudGF0aW9uIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKy8vCisvLworLy8gQSBwYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0IGFuZCBmcm9tCisvLyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8VD4sIHdoZXJlIFQgaXMgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgorLy8gdmFsdWVzLiBJbmhlcml0aW5nIGZyb20gVGVzdFdpdGhQYXJhbTxUPiBzYXRpc2ZpZXMgdGhhdCByZXF1aXJlbWVudCBiZWNhdXNlCisvLyBUZXN0V2l0aFBhcmFtPFQ+IGluaGVyaXRzIGZyb20gYm90aCBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vcmUKKy8vIGNvbXBsaWNhdGVkIGhpZXJhcmNoaWVzLCBob3dldmVyLCBpdCBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsIHRvIGluaGVyaXQKKy8vIHNlcGFyYXRlbHkgZnJvbSBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEZvciBleGFtcGxlOgorCitjbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAvLyBZb3UgY2FuIGluaGVyaXQgYWxsIHRoZSB1c3VhbCBtZW1iZXJzIGZvciBhIG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QKKyAgLy8gZml4dHVyZSBoZXJlLgorfTsKKworY2xhc3MgRGVyaXZlZFRlc3QgOiBwdWJsaWMgQmFzZVRlc3QsIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQ+IHsKKyAgLy8gVGhlIHVzdWFsIHRlc3QgZml4dHVyZSBtZW1iZXJzIGdvIGhlcmUgdG9vLgorfTsKKworVEVTVF9GKEJhc2VUZXN0LCBIYXNGb28pIHsKKyAgLy8gVGhpcyBpcyBhbiBvcmRpbmFyeSBub24tcGFyYW1ldGVyaXplZCB0ZXN0LgorfQorCitURVNUX1AoRGVyaXZlZFRlc3QsIERvZXNCbGFoKSB7CisgIC8vIEdldFBhcmFtIHdvcmtzIGp1c3QgdGhlIHNhbWUgaGVyZSBhcyBpZiB5b3UgaW5oZXJpdCBmcm9tIFRlc3RXaXRoUGFyYW0uCisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKK30KKworI2VuZGlmICAvLyAwCisKKworI2lmICFHVEVTVF9PU19TWU1CSUFOCisjIGluY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKy8vIENvcHlyaWdodCAyMDAzIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IERhbiBFZ25vciAoZWdub3JAZ29vZ2xlLmNvbSkKKy8vCisvLyBBICJzbWFydCIgcG9pbnRlciB0eXBlIHdpdGggcmVmZXJlbmNlIHRyYWNraW5nLiAgRXZlcnkgcG9pbnRlciB0byBhCisvLyBwYXJ0aWN1bGFyIG9iamVjdCBpcyBrZXB0IG9uIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuICBXaGVuIHRoZSBsYXN0IHBvaW50ZXIKKy8vIHRvIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQgb3IgcmVhc3NpZ25lZCwgdGhlIG9iamVjdCBpcyBkZWxldGVkLgorLy8KKy8vIFVzZWQgcHJvcGVybHksIHRoaXMgZGVsZXRlcyB0aGUgb2JqZWN0IHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGdvZXMgYXdheS4KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIGNhdmVhdHM6CisvLyAtIExpa2UgYWxsIHJlZmVyZW5jZSBjb3VudGluZyBzY2hlbWVzLCBjeWNsZXMgbGVhZCB0byBsZWFrcy4KKy8vIC0gRWFjaCBzbWFydCBwb2ludGVyIGlzIGFjdHVhbGx5IHR3byBwb2ludGVycyAoOCBieXRlcyBpbnN0ZWFkIG9mIDQpLgorLy8gLSBFdmVyeSB0aW1lIGEgcG9pbnRlciBpcyBhc3NpZ25lZCwgdGhlIGVudGlyZSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoYXQKKy8vICAgb2JqZWN0IGlzIHRyYXZlcnNlZC4gIFRoaXMgY2xhc3MgaXMgdGhlcmVmb3JlIE5PVCBTVUlUQUJMRSB3aGVuIHRoZXJlCisvLyAgIHdpbGwgb2Z0ZW4gYmUgbW9yZSB0aGFuIHR3byBvciB0aHJlZSBwb2ludGVycyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0LgorLy8gLSBSZWZlcmVuY2VzIGFyZSBvbmx5IHRyYWNrZWQgYXMgbG9uZyBhcyBsaW5rZWRfcHRyPD4gb2JqZWN0cyBhcmUgY29waWVkLgorLy8gICBJZiBhIGxpbmtlZF9wdHI8PiBpcyBjb252ZXJ0ZWQgdG8gYSByYXcgcG9pbnRlciBhbmQgYmFjaywgQkFEIFRISU5HUworLy8gICB3aWxsIGhhcHBlbiAoZG91YmxlIGRlbGV0aW9uKS4KKy8vCisvLyBBIGdvb2QgdXNlIG9mIHRoaXMgY2xhc3MgaXMgc3RvcmluZyBvYmplY3QgcmVmZXJlbmNlcyBpbiBTVEwgY29udGFpbmVycy4KKy8vIFlvdSBjYW4gc2FmZWx5IHB1dCBsaW5rZWRfcHRyPD4gaW4gYSB2ZWN0b3I8Pi4KKy8vIE90aGVyIHVzZXMgbWF5IG5vdCBiZSBhcyBnb29kLgorLy8KKy8vIE5vdGU6IElmIHlvdSB1c2UgYW4gaW5jb21wbGV0ZSB0eXBlIHdpdGggbGlua2VkX3B0cjw+LCB0aGUgY2xhc3MKKy8vICpjb250YWluaW5nKiBsaW5rZWRfcHRyPD4gbXVzdCBoYXZlIGEgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgKGV2ZW4KKy8vIGlmIHRoZXkgZG8gbm90aGluZyEpLgorLy8KKy8vIEJpbGwgR2liYm9ucyBzdWdnZXN0ZWQgd2UgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCisvLworLy8gVGhyZWFkIFNhZmV0eToKKy8vICAgVW5saWtlIG90aGVyIGxpbmtlZF9wdHIgaW1wbGVtZW50YXRpb25zLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisvLyAgIGEgbGlua2VkX3B0ciBvYmplY3QgaXMgdGhyZWFkLXNhZmUgaW4gdGhlIHNlbnNlIHRoYXQ6CisvLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSBsaW5rZWRfcHRyIG9iamVjdHMgY29uY3VycmVudGx5LAorLy8gICAgIC0gaXQncyBzYWZlIHRvIGNvcHkgKmZyb20qIGEgbGlua2VkX3B0ciBhbmQgcmVhZCBpdHMgdW5kZXJseWluZworLy8gICAgICAgcmF3IHBvaW50ZXIgKGUuZy4gdmlhIGdldCgpKSBjb25jdXJyZW50bHksIGFuZAorLy8gICAgIC0gaXQncyBzYWZlIHRvIHdyaXRlIHRvIHR3byBsaW5rZWRfcHRycyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lCisvLyAgICAgICBzaGFyZWQgb2JqZWN0IGNvbmN1cnJlbnRseS4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZW5hbWUgdGhpcyB0byBzYWZlX2xpbmtlZF9wdHIgdG8gYXZvaWQKKy8vIGNvbmZ1c2lvbiB3aXRoIG5vcm1hbCBsaW5rZWRfcHRyLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFByb3RlY3RzIGNvcHlpbmcgb2YgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4KK0dURVNUX0FQSV8gR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfbGlua2VkX3B0cl9tdXRleCk7CisKKy8vIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGFsbCBpbnN0YW5jZXMgb2YgbGlua2VkX3B0cjw+LiAgSXQgbmVlZHMgdG8gYmUKKy8vIGEgbm9uLXRlbXBsYXRlIGNsYXNzIGJlY2F1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHI8PiBjYW4gcmVmZXIgdG8KKy8vIHRoZSBzYW1lIG9iamVjdCAobGlua2VkX3B0cjxTdXBlcmNsYXNzPihvYmopIHZzIGxpbmtlZF9wdHI8U3ViY2xhc3M+KG9iaikpLgorLy8gU28sIGl0IG5lZWRzIHRvIGJlIHBvc3NpYmxlIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciB0byBwYXJ0aWNpcGF0ZQorLy8gaW4gdGhlIHNhbWUgY2lyY3VsYXIgbGlua2VkIGxpc3QsIHNvIHdlIG5lZWQgYSBzaW5nbGUgY2xhc3MgdHlwZSBoZXJlLgorLy8KKy8vIERPIE5PVCBVU0UgVEhJUyBDTEFTUyBESVJFQ1RMWSBZT1VSU0VMRi4gIFVzZSBsaW5rZWRfcHRyPFQ+LgorY2xhc3MgbGlua2VkX3B0cl9pbnRlcm5hbCB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBuZXcgY2lyY2xlIHRoYXQgaW5jbHVkZXMgb25seSB0aGlzIGluc3RhbmNlLgorICB2b2lkIGpvaW5fbmV3KCkgeworICAgIG5leHRfID0gdGhpczsKKyAgfQorCisgIC8vIE1hbnkgbGlua2VkX3B0ciBvcGVyYXRpb25zIG1heSBjaGFuZ2UgcC5saW5rXyBmb3Igc29tZSBsaW5rZWRfcHRyCisgIC8vIHZhcmlhYmxlIHAgaW4gdGhlIHNhbWUgY2lyY2xlIGFzIHRoaXMgb2JqZWN0LiAgVGhlcmVmb3JlIHdlIG5lZWQKKyAgLy8gdG8gcHJldmVudCB0d28gc3VjaCBvcGVyYXRpb25zIGZyb20gb2NjdXJyaW5nIGNvbmN1cnJlbnRseS4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIG9iamVjdHMgY2FuIGNvZXhpc3QgaW4gYQorICAvLyBjaXJjbGUgKGUuZy4gbGlua2VkX3B0cjxCYXNlPiwgbGlua2VkX3B0cjxEZXJpdmVkMT4sIGFuZAorICAvLyBsaW5rZWRfcHRyPERlcml2ZWQyPikuICBUaGVyZWZvcmUgd2UgbXVzdCB1c2UgYSBzaW5nbGUgbXV0ZXggdG8KKyAgLy8gcHJvdGVjdCBhbGwgbGlua2VkX3B0ciBvYmplY3RzLiAgVGhpcyBjYW4gY3JlYXRlIHNlcmlvdXMKKyAgLy8gY29udGVudGlvbiBpbiBwcm9kdWN0aW9uIGNvZGUsIGJ1dCBpcyBhY2NlcHRhYmxlIGluIGEgdGVzdGluZworICAvLyBmcmFtZXdvcmsuCisKKyAgLy8gSm9pbiBhbiBleGlzdGluZyBjaXJjbGUuCisgIHZvaWQgam9pbihsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwdHIpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2xpbmtlZF9wdHJfbXV0ZXgpIHsKKyAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsKKworICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBwdHI7CisgICAgd2hpbGUgKHAtPm5leHRfICE9IHB0cikgcCA9IHAtPm5leHRfOworICAgIHAtPm5leHRfID0gdGhpczsKKyAgICBuZXh0XyA9IHB0cjsKKyAgfQorCisgIC8vIExlYXZlIHdoYXRldmVyIGNpcmNsZSB3ZSdyZSBwYXJ0IG9mLiAgUmV0dXJucyB0cnVlIGlmIHdlIHdlcmUgdGhlCisgIC8vIGxhc3QgbWVtYmVyIG9mIHRoZSBjaXJjbGUuICBPbmNlIHRoaXMgaXMgZG9uZSwgeW91IGNhbiBqb2luKCkgYW5vdGhlci4KKyAgYm9vbCBkZXBhcnQoKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19saW5rZWRfcHRyX211dGV4KSB7CisgICAgTXV0ZXhMb2NrIGxvY2soJmdfbGlua2VkX3B0cl9tdXRleCk7CisKKyAgICBpZiAobmV4dF8gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgICAgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcCA9IG5leHRfOworICAgIHdoaWxlIChwLT5uZXh0XyAhPSB0aGlzKSBwID0gcC0+bmV4dF87CisgICAgcC0+bmV4dF8gPSBuZXh0XzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworIHByaXZhdGU6CisgIG11dGFibGUgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogbmV4dF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIGxpbmtlZF9wdHIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKworICAvLyBUYWtlIG92ZXIgb3duZXJzaGlwIG9mIGEgcmF3IHBvaW50ZXIuICBUaGlzIHNob3VsZCBoYXBwZW4gYXMgc29vbiBhcworICAvLyBwb3NzaWJsZSBhZnRlciB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuCisgIGV4cGxpY2l0IGxpbmtlZF9wdHIoVCogcHRyID0gTlVMTCkgeyBjYXB0dXJlKHB0cik7IH0KKyAgfmxpbmtlZF9wdHIoKSB7IGRlcGFydCgpOyB9CisKKyAgLy8gQ29weSBhbiBleGlzdGluZyBsaW5rZWRfcHRyPD4sIGFkZGluZyBvdXJzZWx2ZXMgdG8gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGxpbmtlZF9wdHIobGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7IGNvcHkoJnB0cik7IH0KKyAgbGlua2VkX3B0cihsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsgIC8vIE5PTElOVAorICAgIGFzc2VydCgmcHRyICE9IHRoaXMpOworICAgIGNvcHkoJnB0cik7CisgIH0KKworICAvLyBBc3NpZ25tZW50IHJlbGVhc2VzIHRoZSBvbGQgdmFsdWUgYW5kIGFjcXVpcmVzIHRoZSBuZXcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7CisgICAgZGVwYXJ0KCk7CisgICAgY29weSgmcHRyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0ciBjb25zdCYgcHRyKSB7CisgICAgaWYgKCZwdHIgIT0gdGhpcykgeworICAgICAgZGVwYXJ0KCk7CisgICAgICBjb3B5KCZwdHIpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTbWFydCBwb2ludGVyIG1lbWJlcnMuCisgIHZvaWQgcmVzZXQoVCogcHRyID0gTlVMTCkgeworICAgIGRlcGFydCgpOworICAgIGNhcHR1cmUocHRyKTsKKyAgfQorICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqdmFsdWVfOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyA9PSBwOyB9CisgIGJvb2wgb3BlcmF0b3IhPShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gIT0gcDsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvcj09KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gPT0gcHRyLmdldCgpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBib29sIG9wZXJhdG9yIT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyAhPSBwdHIuZ2V0KCk7CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBmcmllbmQgY2xhc3MgbGlua2VkX3B0cjsKKworICBUKiB2YWx1ZV87CisgIGxpbmtlZF9wdHJfaW50ZXJuYWwgbGlua187CisKKyAgdm9pZCBkZXBhcnQoKSB7CisgICAgaWYgKGxpbmtfLmRlcGFydCgpKSBkZWxldGUgdmFsdWVfOworICB9CisKKyAgdm9pZCBjYXB0dXJlKFQqIHB0cikgeworICAgIHZhbHVlXyA9IHB0cjsKKyAgICBsaW5rXy5qb2luX25ldygpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IHZvaWQgY29weShsaW5rZWRfcHRyPFU+IGNvbnN0KiBwdHIpIHsKKyAgICB2YWx1ZV8gPSBwdHItPmdldCgpOworICAgIGlmICh2YWx1ZV8pCisgICAgICBsaW5rXy5qb2luKCZwdHItPmxpbmtfKTsKKyAgICBlbHNlCisgICAgICBsaW5rXy5qb2luX25ldygpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKK2Jvb2wgb3BlcmF0b3I9PShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKKyAgcmV0dXJuIHB0ciA9PSB4LmdldCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKK2Jvb2wgb3BlcmF0b3IhPShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKKyAgcmV0dXJuIHB0ciAhPSB4LmdldCgpOworfQorCisvLyBBIGZ1bmN0aW9uIHRvIGNvbnZlcnQgVCogaW50byBsaW5rZWRfcHRyPFQ+CisvLyBEb2luZyBlLmcuIG1ha2VfbGlua2VkX3B0cihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpIGlzIGEgc2hvcnRlciBub3RhdGlvbgorLy8gZm9yIGxpbmtlZF9wdHI8Rm9vQmFyQmF6PHR5cGU+ID4obmV3IEZvb0JhckJhejx0eXBlPihhcmcpKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitsaW5rZWRfcHRyPFQ+IG1ha2VfbGlua2VkX3B0cihUKiBwdHIpIHsKKyAgcmV0dXJuIGxpbmtlZF9wdHI8VD4ocHRyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIFRlc3QgLSBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgdGhhdCBjYW4gcHJpbnQgYQorLy8gdmFsdWUgb2YgYW55IHR5cGUgVDoKKy8vCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKTsKKy8vCisvLyBBIHVzZXIgY2FuIHRlYWNoIHRoaXMgZnVuY3Rpb24gaG93IHRvIHByaW50IGEgY2xhc3MgdHlwZSBUIGJ5CisvLyBkZWZpbmluZyBlaXRoZXIgb3BlcmF0b3I8PCgpIG9yIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHRoYXQKKy8vIGRlZmluZXMgVC4gIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgRklSU1QgZGVmaW5lZCBmdW5jdGlvbiBpbiB0aGUKKy8vIGZvbGxvd2luZyBsaXN0IHdpbGwgYmUgdXNlZCAoYXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZQorLy8gZm9vKToKKy8vCisvLyAgIDEuIGZvbzo6UHJpbnRUbyhjb25zdCBUJiwgb3N0cmVhbSopCisvLyAgIDIuIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IFQmKSBkZWZpbmVkIGluIGVpdGhlciBmb28gb3IgdGhlCisvLyAgICAgIGdsb2JhbCBuYW1lc3BhY2UuCisvLworLy8gSWYgbm9uZSBvZiB0aGUgYWJvdmUgaXMgZGVmaW5lZCwgaXQgd2lsbCBwcmludCB0aGUgZGVidWcgc3RyaW5nIG9mCisvLyB0aGUgdmFsdWUgaWYgaXQgaXMgYSBwcm90b2NvbCBidWZmZXIsIG9yIHByaW50IHRoZSByYXcgYnl0ZXMgaW4gdGhlCisvLyB2YWx1ZSBvdGhlcndpc2UuCisvLworLy8gVG8gYWlkIGRlYnVnZ2luZzogd2hlbiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSBhZGRyZXNzIG9mIHRoZQorLy8gdmFsdWUgaXMgYWxzbyBwcmludGVkOyB3aGVuIFQgaXMgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgYm90aCB0aGUKKy8vIHBvaW50ZXIgdmFsdWUgYW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaXQgcG9pbnRzIHRvIGFyZQorLy8gcHJpbnRlZC4KKy8vCisvLyBXZSBhbHNvIHByb3ZpZGUgc29tZSBjb252ZW5pZW50IHdyYXBwZXJzOgorLy8KKy8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcuICBGb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyCisvLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzCisvLyAgIC8vIHByaW50ZWQuCisvLyAgIHN0ZDo6c3RyaW5nIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSk7CisvLworLy8gICAvLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQKKy8vICAgLy8gdmFsdWUgKGJ1dCBub3QgdGhlIGFkZHJlc3MpIGlzIHByaW50ZWQ7IGZvciBhIChjb25zdCBvciBub3QpIGNoYXIKKy8vICAgLy8gcG9pbnRlciwgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyAoYnV0IG5vdCB0aGUgcG9pbnRlcikgaXMKKy8vICAgLy8gcHJpbnRlZC4KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50KGNvbnN0IFQmIHZhbHVlLCBvc3RyZWFtKik7CisvLworLy8gICAvLyBQcmludHMgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlIGRpZmZlcmVuY2UKKy8vICAgLy8gZnJvbSBVbml2ZXJzYWxUZXJzZVByaW50KCkgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHByaW50cyBib3RoIHRoZQorLy8gICAvLyBwb2ludGVyIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZvciBhIChjb25zdCBvciBub3QpIGNoYXIgcG9pbnRlci4KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgb3N0cmVhbSopOworLy8KKy8vICAgLy8gUHJpbnRzIHRoZSBmaWVsZHMgb2YgYSB0dXBsZSB0ZXJzZWx5IHRvIGEgc3RyaW5nIHZlY3Rvciwgb25lCisvLyAgIC8vIGVsZW1lbnQgZm9yIGVhY2ggZmllbGQuIFR1cGxlIHN1cHBvcnQgbXVzdCBiZSBlbmFibGVkIGluCisvLyAgIC8vIGd0ZXN0LXBvcnQuaC4KKy8vICAgc3RkOjp2ZWN0b3I8c3RyaW5nPiBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCisvLyAgICAgICBjb25zdCBUdXBsZSYgdmFsdWUpOworLy8KKy8vIEtub3duIGxpbWl0YXRpb246CisvLworLy8gVGhlIHByaW50IHByaW1pdGl2ZXMgcHJpbnQgdGhlIGVsZW1lbnRzIG9mIGFuIFNUTC1zdHlsZSBjb250YWluZXIKKy8vIHVzaW5nIHRoZSBjb21waWxlci1pbmZlcnJlZCB0eXBlIG9mICppdGVyIHdoZXJlIGl0ZXIgaXMgYQorLy8gY29uc3RfaXRlcmF0b3Igb2YgdGhlIGNvbnRhaW5lci4gIFdoZW4gY29uc3RfaXRlcmF0b3IgaXMgYW4gaW5wdXQKKy8vIGl0ZXJhdG9yIGJ1dCBub3QgYSBmb3J3YXJkIGl0ZXJhdG9yLCB0aGlzIGluZmVycmVkIHR5cGUgbWF5IG5vdAorLy8gbWF0Y2ggdmFsdWVfdHlwZSwgYW5kIHRoZSBwcmludCBvdXRwdXQgbWF5IGJlIGluY29ycmVjdC4gIEluCisvLyBwcmFjdGljZSwgdGhpcyBpcyByYXJlbHkgYSBwcm9ibGVtIGFzIGZvciBtb3N0IGNvbnRhaW5lcnMKKy8vIGNvbnN0X2l0ZXJhdG9yIGlzIGEgZm9yd2FyZCBpdGVyYXRvci4gIFdlJ2xsIGZpeCB0aGlzIGlmIHRoZXJlJ3MgYW4KKy8vIGFjdHVhbCBuZWVkIGZvciBpdC4gIE5vdGUgdGhhdCB0aGlzIGZpeCBjYW5ub3QgcmVseSBvbiB2YWx1ZV90eXBlCisvLyBiZWluZyBkZWZpbmVkIGFzIG1hbnkgdXNlci1kZWZpbmVkIGNvbnRhaW5lciB0eXBlcyBkb24ndCBoYXZlCisvLyB2YWx1ZV90eXBlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXworCisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlZmluaXRpb25zIGluIHRoZSAnaW50ZXJuYWwnIGFuZCAnaW50ZXJuYWwyJyBuYW1lIHNwYWNlcyBhcmUKKy8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBUSEVNIElOIFVTRVIgQ09ERSEKK25hbWVzcGFjZSBpbnRlcm5hbDIgeworCisvLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBnaXZlbgorLy8gb3N0cmVhbS4KK0dURVNUX0FQSV8gdm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIEZvciBzZWxlY3Rpbmcgd2hpY2ggcHJpbnRlciB0byB1c2Ugd2hlbiBhIGdpdmVuIHR5cGUgaGFzIG5laXRoZXIgPDwKKy8vIG5vciBQcmludFRvKCkuCitlbnVtIFR5cGVLaW5kIHsKKyAga1Byb3RvYnVmLCAgICAgICAgICAgICAgLy8gYSBwcm90b2J1ZiB0eXBlCisgIGtDb252ZXJ0aWJsZVRvSW50ZWdlciwgIC8vIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYSBuYW1lZCBvciB1bm5hbWVkIGVudW0gdHlwZSkKKyAga090aGVyVHlwZSAgICAgICAgICAgICAgLy8gYW55dGhpbmcgZWxzZQorfTsKKworLy8gVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga1R5cGVLaW5kPjo6UHJpbnRWYWx1ZSh2YWx1ZSwgb3MpIGlzIGNhbGxlZAorLy8gYnkgdGhlIHVuaXZlcnNhbCBwcmludGVyIHRvIHByaW50IGEgdmFsdWUgb2YgdHlwZSBUIHdoZW4gbmVpdGhlcgorLy8gb3BlcmF0b3I8PCBub3IgUHJpbnRUbygpIGlzIGRlZmluZWQgZm9yIFQsIHdoZXJlIGtUeXBlS2luZCBpcyB0aGUKKy8vICJraW5kIiBvZiBUIGFzIGRlZmluZWQgYnkgZW51bSBUeXBlS2luZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBUeXBlS2luZCBrVHlwZUtpbmQ+CitjbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlciB7CisgcHVibGljOgorICAvLyBUaGlzIGRlZmF1bHQgdmVyc2lvbiBpcyBjYWxsZWQgd2hlbiBrVHlwZUtpbmQgaXMga090aGVyVHlwZS4KKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgUHJpbnRCeXRlc0luT2JqZWN0VG8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oJnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWUpLCBvcyk7CisgIH0KK307CisKKy8vIFdlIHByaW50IGEgcHJvdG9idWYgdXNpbmcgaXRzIFNob3J0RGVidWdTdHJpbmcoKSB3aGVuIHRoZSBzdHJpbmcKKy8vIGRvZXNuJ3QgZXhjZWVkIHRoaXMgbWFueSBjaGFyYWN0ZXJzOyBvdGhlcndpc2Ugd2UgcHJpbnQgaXQgdXNpbmcKKy8vIERlYnVnU3RyaW5nKCkgZm9yIGJldHRlciByZWFkYWJpbGl0eS4KK2NvbnN0IHNpemVfdCBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA9IDUwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtQcm90b2J1Zj4geworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHNob3J0X3N0ciA9IHZhbHVlLlNob3J0RGVidWdTdHJpbmcoKTsKKyAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgcHJldHR5X3N0ciA9CisgICAgICAgIHNob3J0X3N0ci5sZW5ndGgoKSA8PSBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA/CisgICAgICAgIHNob3J0X3N0ciA6ICgiXG4iICsgdmFsdWUuRGVidWdTdHJpbmcoKSk7CisgICAgKm9zIDw8ICgiPCIgKyBwcmV0dHlfc3RyICsgIj4iKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrQ29udmVydGlibGVUb0ludGVnZXI+IHsKKyBwdWJsaWM6CisgIC8vIFNpbmNlIFQgaGFzIG5vIDw8IG9wZXJhdG9yIG9yIFByaW50VG8oKSBidXQgY2FuIGJlIGltcGxpY2l0bHkKKyAgLy8gY29udmVydGVkIHRvIEJpZ2dlc3RJbnQsIHdlIHByaW50IGl0IGFzIGEgQmlnZ2VzdEludC4KKyAgLy8KKyAgLy8gTW9zdCBsaWtlbHkgVCBpcyBhbiBlbnVtIHR5cGUgKGVpdGhlciBuYW1lZCBvciB1bm5hbWVkKSwgaW4gd2hpY2gKKyAgLy8gY2FzZSBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBkZXNpcmVkIGJlaGF2aW9yLiAgSW4gY2FzZQorICAvLyBUIGlzIG5vdCBhbiBlbnVtLCBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBiZXN0IHdlIGNhbiBkbworICAvLyBnaXZlbiB0aGF0IGl0IGhhcyBubyB1c2VyLWRlZmluZWQgcHJpbnRlci4KKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgY29uc3QgaW50ZXJuYWw6OkJpZ2dlc3RJbnQga0JpZ0ludCA9IHZhbHVlOworICAgICpvcyA8PCBrQmlnSW50OworICB9Cit9OworCisvLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLiAgSWYgdGhlIHZhbHVlIGlzIGEKKy8vIHByb3RvY29sIG1lc3NhZ2UsIGl0cyBkZWJ1ZyBzdHJpbmcgaXMgcHJpbnRlZDsgaWYgaXQncyBhbiBlbnVtIG9yCisvLyBvZiBhIHR5cGUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LCBpdCdzIHByaW50ZWQgYXMgYW4KKy8vIGludGVnZXI7IG90aGVyd2lzZSB0aGUgYnl0ZXMgaW4gdGhlIHZhbHVlIGFyZSBwcmludGVkLiAgVGhpcyBpcworLy8gd2hhdCBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBpdCBrbm93cyBub3RoaW5nIGFib3V0CisvLyB0eXBlIFQgYW5kIFQgaGFzIG5laXRoZXIgPDwgb3BlcmF0b3Igbm9yIFByaW50VG8oKS4KKy8vCisvLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKKy8vIGEgPDwgb3BlcmF0b3IgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4KKy8vCisvLyBXZSBwdXQgdGhpcyBvcGVyYXRvciBpbiBuYW1lc3BhY2UgJ2ludGVybmFsMicgaW5zdGVhZCBvZiAnaW50ZXJuYWwnCisvLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIGFzIG11Y2ggY29kZSBpbiAnaW50ZXJuYWwnIG5lZWRzIHRvCisvLyB1c2UgPDwgaW4gU1RMLCB3aGljaCB3b3VsZCBjb25mbGljdCB3aXRoIG91ciBvd24gPDwgd2VyZSBpdCBkZWZpbmVkCisvLyBpbiAnaW50ZXJuYWwnLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIG9wZXJhdG9yPDwgdGFrZXMgYSBnZW5lcmljIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLAorLy8gQ2hhclRyYWl0cz4gdHlwZSBpbnN0ZWFkIG9mIHRoZSBtb3JlIHJlc3RyaWN0ZWQgc3RkOjpvc3RyZWFtLiAgSWYKKy8vIHdlIGRlZmluZSBpdCB0byB0YWtlIGFuIHN0ZDo6b3N0cmVhbSBpbnN0ZWFkLCB3ZSdsbCBnZXQgYW4KKy8vICJhbWJpZ3VvdXMgb3ZlcmxvYWRzIiBjb21waWxlciBlcnJvciB3aGVuIHRyeWluZyB0byBwcmludCBhIHR5cGUKKy8vIEZvbyB0aGF0IHN1cHBvcnRzIHN0cmVhbWluZyB0byBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwKKy8vIENoYXJUcmFpdHM+LCBhcyB0aGUgY29tcGlsZXIgY2Fubm90IHRlbGwgd2hldGhlcgorLy8gb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mLCBjb25zdCBUJikgb3IKKy8vIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4sIGNvbnN0IEZvbyYpIGlzIG1vcmUKKy8vIHNwZWNpZmljLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+Cis6OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICA6OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsIGNvbnN0IFQmIHgpIHsKKyAgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwKKyAgICAgIChpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSA/IGtQcm90b2J1ZiA6CisgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUJiwgaW50ZXJuYWw6OkJpZ2dlc3RJbnQ+Ojp2YWx1ZSA/CisgICAgICAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyIDoga090aGVyVHlwZSk+OjpQcmludFZhbHVlKHgsICZvcyk7CisgIHJldHVybiBvczsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gVGhpcyBuYW1lc3BhY2UgTVVTVCBOT1QgQkUgTkVTVEVEIElOIDo6dGVzdGluZywgb3IgdGhlIG5hbWUgbG9vay11cAorLy8gbWFnaWMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgVW5pdmVyc2FsUHJpbnRlciB3b24ndCB3b3JrLgorbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwgeworCisvLyBVc2VkIHRvIHByaW50IGEgdmFsdWUgdGhhdCBpcyBub3QgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZQorLy8gdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludE5vbkNvbnRhaW5lclRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgLy8gV2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCwgZHVyaW5nIHVucXVhbGlmaWVkIG5hbWUgbG9va3VwLAorICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgYXBwZWFycyBhcyBpZiBpdCB3YXMgZGVjbGFyZWQgaW4KKyAgLy8gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGJvdGgKKyAgLy8gOjp0ZXN0aW5nX2ludGVybmFsIGFuZCA6OnRlc3Rpbmc6OmludGVybmFsMiwgaS5lLiB0aGUgZ2xvYmFsCisgIC8vIG5hbWVzcGFjZS4gIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIHRoZSBDKysgU3RhbmRhcmQgc2VjdGlvbgorICAvLyA3LjMuNC0xIFtuYW1lc3BhY2UudWRpcl0uICBUaGlzIGFsbG93cyB1cyB0byBmYWxsIGJhY2sgb250bworICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgaW4gY2FzZSBUIGRvZXNuJ3QgY29tZSB3aXRoIGEgPDwKKyAgLy8gb3BlcmF0b3IuCisgIC8vCisgIC8vIFdlIGNhbm5vdCB3cml0ZSAndXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDw7Jywgd2hpY2gKKyAgLy8gZ2NjIDMuMyBmYWlscyB0byBjb21waWxlIGR1ZSB0byBhIGNvbXBpbGVyIGJ1Zy4KKyAgdXNpbmcgbmFtZXNwYWNlIDo6dGVzdGluZzo6aW50ZXJuYWwyOyAgLy8gTk9MSU5UCisKKyAgLy8gQXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZSBmb28sIGluIHRoZSBuZXh0IHN0YXRlbWVudCwKKyAgLy8gdGhlIGNvbXBpbGVyIHdpbGwgY29uc2lkZXIgYWxsIG9mOgorICAvLworICAvLyAgIDEuIGZvbzo6b3BlcmF0b3I8PCAodGhhbmtzIHRvIEtvZW5pZyBsb29rLXVwKSwKKyAgLy8gICAyLiA6Om9wZXJhdG9yPDwgKGFzIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpcyBlbmNsb3NlZCBpbiA6OiksCisgIC8vICAgMy4gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gdGhlIHVzaW5nIHN0YXRlbWVudCBhYm92ZSkuCisgIC8vCisgIC8vIFRoZSBvcGVyYXRvcjw8IHdob3NlIHR5cGUgbWF0Y2hlcyBUIGJlc3Qgd2lsbCBiZSBwaWNrZWQuCisgIC8vCisgIC8vIFdlIGRlbGliZXJhdGVseSBhbGxvdyAjMiB0byBiZSBhIGNhbmRpZGF0ZSwgYXMgc29tZXRpbWVzIGl0J3MKKyAgLy8gaW1wb3NzaWJsZSB0byBkZWZpbmUgIzEgKGUuZy4gd2hlbiBmb28gaXMgOjpzdGQsIGRlZmluaW5nCisgIC8vIGFueXRoaW5nIGluIGl0IGlzIHVuZGVmaW5lZCBiZWhhdmlvciB1bmxlc3MgeW91IGFyZSBhIGNvbXBpbGVyCisgIC8vIHZlbmRvci4pLgorICAqb3MgPDwgdmFsdWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nX2ludGVybmFsCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cikgcHJpbnRzIHRoZSBnaXZlbgorLy8gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQKKy8vICdvc3RyZWFtX3B0cicgaXMgbm90IE5VTEwsIG9yIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisvLworLy8gV2UgZGVmaW5lIFVuaXZlcnNhbFByaW50ZXIgYXMgYSBjbGFzcyB0ZW1wbGF0ZSAoYXMgb3Bwb3NlZCB0byBhCisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSksIGFzIHdlIG5lZWQgdG8gcGFydGlhbGx5IHNwZWNpYWxpemUgaXQgZm9yCisvLyByZWZlcmVuY2UgdHlwZXMsIHdoaWNoIGNhbm5vdCBiZSBkb25lIHdpdGggZnVuY3Rpb24gdGVtcGxhdGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIFVzZWQgdG8gcHJpbnQgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lCisvLyBhIFByaW50VG8oKSBmb3IgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4KK3ZvaWQgRGVmYXVsdFByaW50VG8oSXNDb250YWluZXIgLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlX3R5cGUgLyogaXMgbm90IGEgcG9pbnRlciAqLywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQyYgY29udGFpbmVyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgY29uc3Qgc2l6ZV90IGtNYXhDb3VudCA9IDMyOyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHByaW50LgorICAqb3MgPDwgJ3snOworICBzaXplX3QgY291bnQgPSAwOworICBmb3IgKHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgaXQgIT0gY29udGFpbmVyLmVuZCgpOyArK2l0LCArK2NvdW50KSB7CisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgKm9zIDw8ICcsJzsKKyAgICAgIGlmIChjb3VudCA9PSBrTWF4Q291bnQpIHsgIC8vIEVub3VnaCBoYXMgYmVlbiBwcmludGVkLgorICAgICAgICAqb3MgPDwgIiAuLi4iOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICcgJzsKKyAgICAvLyBXZSBjYW5ub3QgY2FsbCBQcmludFRvKCppdCwgb3MpIGhlcmUgYXMgUHJpbnRUbygpIGRvZXNuJ3QKKyAgICAvLyBoYW5kbGUgKml0IGJlaW5nIGEgbmF0aXZlIGFycmF5LgorICAgIGludGVybmFsOjpVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsKKyAgfQorCisgIGlmIChjb3VudCA+IDApIHsKKyAgICAqb3MgPDwgJyAnOworICB9CisgICpvcyA8PCAnfSc7Cit9CisKKy8vIFVzZWQgdG8gcHJpbnQgYSBwb2ludGVyIHRoYXQgaXMgbmVpdGhlciBhIGNoYXIgcG9pbnRlciBub3IgYSBtZW1iZXIKKy8vIHBvaW50ZXIsIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4gIChBIG1lbWJlcgorLy8gdmFyaWFibGUgcG9pbnRlciBvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBkb2Vzbid0IHJlYWxseSBwb2ludCB0bworLy8gYSBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4gIFRoZWlyIHJlcHJlc2VudGF0aW9uIGlzCisvLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGhlcmVmb3JlIHRoZXkgd2lsbCBiZSBwcmludGVkIGFzIHJhdworLy8gYnl0ZXMuKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICB0cnVlX3R5cGUgLyogaXMgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBUKiBwLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgICpvcyA8PCAiTlVMTCI7CisgIH0gZWxzZSB7CisgICAgLy8gQysrIGRvZXNuJ3QgYWxsb3cgY2FzdGluZyBmcm9tIGEgZnVuY3Rpb24gcG9pbnRlciB0byBhbnkgb2JqZWN0CisgICAgLy8gcG9pbnRlci4KKyAgICAvLworICAgIC8vIElzVHJ1ZSgpIHNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwKKyAgICAvLyAidW5yZWFjaGFibGUgY29kZSIuCisgICAgaWYgKElzVHJ1ZShJbXBsaWNpdGx5Q29udmVydGlibGU8VCosIGNvbnN0IHZvaWQqPjo6dmFsdWUpKSB7CisgICAgICAvLyBUIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUuICBXZSBqdXN0IGNhbGwgPDwgdG8gcHJpbnQgcCwKKyAgICAgIC8vIHJlbHlpbmcgb24gQURMIHRvIHBpY2sgdXAgdXNlci1kZWZpbmVkIDw8IGZvciB0aGVpciBwb2ludGVyCisgICAgICAvLyB0eXBlcywgaWYgYW55LgorICAgICAgKm9zIDw8IHA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFQgaXMgYSBmdW5jdGlvbiB0eXBlLCBzbyAnKm9zIDw8IHAnIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50CisgICAgICAvLyAoaXQganVzdCBwcmludHMgcCBhcyBib29sKS4gIFdlIHdhbnQgdG8gcHJpbnQgcCBhcyBhIGNvbnN0CisgICAgICAvLyB2b2lkKi4gIEhvd2V2ZXIsIHdlIGNhbm5vdCBjYXN0IGl0IHRvIGNvbnN0IHZvaWQqIGRpcmVjdGx5LAorICAgICAgLy8gZXZlbiB1c2luZyByZWludGVycHJldF9jYXN0LCBhcyBlYXJsaWVyIHZlcnNpb25zIG9mIGdjYworICAgICAgLy8gKGUuZy4gMy40LjUpIGNhbm5vdCBjb21waWxlIHRoZSBjYXN0IHdoZW4gcCBpcyBhIGZ1bmN0aW9uCisgICAgICAvLyBwb2ludGVyLiAgQ2FzdGluZyB0byBVSW50NjQgZmlyc3Qgc29sdmVzIHRoZSBwcm9ibGVtLgorICAgICAgKm9zIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OlVJbnQ2ND4ocCkpOworICAgIH0KKyAgfQorfQorCisvLyBVc2VkIHRvIHByaW50IGEgbm9uLWNvbnRhaW5lciwgbm9uLXBvaW50ZXIgdmFsdWUgd2hlbiB0aGUgdXNlcgorLy8gZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBEZWZhdWx0UHJpbnRUbyhJc05vdENvbnRhaW5lciAvKiBkdW1teSAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIDo6dGVzdGluZ19pbnRlcm5hbDo6RGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8odmFsdWUsIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiB2YWx1ZSB1c2luZyB0aGUgPDwgb3BlcmF0b3IgaWYgaXQgaGFzIG9uZTsKKy8vIG90aGVyd2lzZSBwcmludHMgdGhlIGJ5dGVzIGluIGl0LiAgVGhpcyBpcyB3aGF0CisvLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBQcmludFRvKCkgaXMgbm90IHNwZWNpYWxpemVkCisvLyBvciBvdmVybG9hZGVkIGZvciB0eXBlIFQuCisvLworLy8gQSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGZvciBhIGNsYXNzIHR5cGUgRm9vIGJ5IGRlZmluaW5nCisvLyBhbiBvdmVybG9hZCBvZiBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4gIFdlCisvLyBnaXZlIHRoZSB1c2VyIHRoaXMgb3B0aW9uIGFzIHNvbWV0aW1lcyBkZWZpbmluZyBhIDw8IG9wZXJhdG9yIGZvcgorLy8gRm9vIGlzIG5vdCBkZXNpcmFibGUgKGUuZy4gdGhlIGNvZGluZyBzdHlsZSBtYXkgcHJldmVudCBkb2luZyBpdCwKKy8vIG9yIHRoZXJlIGlzIGFscmVhZHkgYSA8PCBvcGVyYXRvciBidXQgaXQgZG9lc24ndCBkbyB3aGF0IHRoZSB1c2VyCisvLyB3YW50cykuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUbyhjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIERlZmF1bHRQcmludFRvKCkgaXMgb3ZlcmxvYWRlZC4gIFRoZSB0eXBlIG9mIGl0cyBmaXJzdCB0d28KKyAgLy8gYXJndW1lbnRzIGRldGVybWluZSB3aGljaCB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkLiAgSWYgVCBpcyBhbgorICAvLyBTVEwtc3R5bGUgY29udGFpbmVyLCB0aGUgdmVyc2lvbiBmb3IgY29udGFpbmVyIHdpbGwgYmUgY2FsbGVkOyBpZgorICAvLyBUIGlzIGEgcG9pbnRlciwgdGhlIHBvaW50ZXIgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZDsgb3RoZXJ3aXNlIHRoZQorICAvLyBnZW5lcmljIHZlcnNpb24gd2lsbCBiZSBjYWxsZWQuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUsIHByaW9yIHRvIHdlIGNoZWNrCisgIC8vIGZvciBwcm90b2NvbCBtZXNzYWdlIHR5cGVzIGluIG91ciBvcGVyYXRvcjw8LiAgVGhlIHJhdGlvbmFsZSBpczoKKyAgLy8KKyAgLy8gRm9yIHByb3RvY29sIG1lc3NhZ2VzLCB3ZSB3YW50IHRvIGdpdmUgcGVvcGxlIGEgY2hhbmNlIHRvCisgIC8vIG92ZXJyaWRlIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGJ5IGRlZmluaW5nIGEgUHJpbnRUbygpIG9yCisgIC8vIG9wZXJhdG9yPDwuICBGb3IgU1RMIGNvbnRhaW5lcnMsIG90aGVyIGZvcm1hdHMgY2FuIGJlCisgIC8vIGluY29tcGF0aWJsZSB3aXRoIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGZvciB0aGUgY29udGFpbmVyCisgIC8vIGVsZW1lbnRzOyB0aGVyZWZvcmUgd2UgY2hlY2sgZm9yIGNvbnRhaW5lciB0eXBlcyBoZXJlIHRvIGVuc3VyZQorICAvLyB0aGF0IG91ciBmb3JtYXQgaXMgdXNlZC4KKyAgLy8KKyAgLy8gVGhlIHNlY29uZCBhcmd1bWVudCBvZiBEZWZhdWx0UHJpbnRUbygpIGlzIG5lZWRlZCB0byBieXBhc3MgYSBidWcKKyAgLy8gaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciB0aGF0IHByZXZlbnRzIGl0IGZyb20gcGlja2luZyB0aGUgcmlnaHQKKyAgLy8gb3ZlcmxvYWQgYmV0d2VlbjoKKyAgLy8KKyAgLy8gICBQcmludFRvKGNvbnN0IFQmIHgsIC4uLik7CisgIC8vICAgUHJpbnRUbyhUKiB4LCAuLi4pOworICBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lclRlc3Q8VD4oMCksIGlzX3BvaW50ZXI8VD4oKSwgdmFsdWUsIG9zKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyBsaXN0IG9mIFByaW50VG8oKSBvdmVybG9hZHMgdGVsbHMKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgaG93IHRvIHByaW50IHN0YW5kYXJkIHR5cGVzIChidWlsdC1pbgorLy8gdHlwZXMsIHN0cmluZ3MsIHBsYWluIGFycmF5cywgYW5kIHBvaW50ZXJzKS4KKworLy8gT3ZlcmxvYWRzIGZvciB2YXJpb3VzIGNoYXIgdHlwZXMuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBXaGVuIHByaW50aW5nIGEgcGxhaW4gY2hhciwgd2UgYWx3YXlzIHRyZWF0IGl0IGFzIHVuc2lnbmVkLiAgVGhpcworICAvLyB3YXksIHRoZSBvdXRwdXQgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGUgY29tcGlsZXIgdGhpbmtzCisgIC8vIGNoYXIgaXMgc2lnbmVkIG9yIG5vdC4KKyAgUHJpbnRUbyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSwgb3MpOworfQorCisvLyBPdmVybG9hZHMgZm9yIG90aGVyIHNpbXBsZSBidWlsdC1pbiB0eXBlcy4KK2lubGluZSB2b2lkIFByaW50VG8oYm9vbCB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICh4ID8gInRydWUiIDogImZhbHNlIik7Cit9CisKKy8vIE92ZXJsb2FkIGZvciB3Y2hhcl90IHR5cGUuCisvLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwKKy8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBkZWNpbWFsIGNvZGUgKGV4Y2VwdCBmb3IgTCdcMCcpLgorLy8gVGhlIEwnXDAnIGNoYXIgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4gVGhlIGRlY2ltYWwgY29kZSBpcyBwcmludGVkCisvLyBhcyBzaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbXBpbGVyCisvLyBhcyBhIHNpZ25lZCB0eXBlIGFuZCBpcyBwcmludGVkIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgd2hlbiB3Y2hhcl90CisvLyBpcyBpbXBsZW1lbnRlZCBhcyBhbiB1bnNpZ25lZCB0eXBlLgorR1RFU1RfQVBJXyB2b2lkIFByaW50VG8od2NoYXJfdCB3YywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gT3ZlcmxvYWRzIGZvciBDIHN0cmluZ3MuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IGNoYXIqPihzKSwgb3MpOworfQorCisvLyBzaWduZWQvdW5zaWduZWQgY2hhciBpcyBvZnRlbiB1c2VkIGZvciByZXByZXNlbnRpbmcgYmluYXJ5IGRhdGEsIHNvCisvLyB3ZSBwcmludCBwb2ludGVycyB0byBpdCBhcyB2b2lkKiB0byBiZSBzYWZlLgoraW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KK2lubGluZSB2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CisKKy8vIE1TVkMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdjaGFyX3QgYXMgYSB0eXBlZGVmIG9mIHVuc2lnbmVkCisvLyBzaG9ydC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgd2hlbiB3Y2hhcl90IGlzIGEgbmF0aXZlCisvLyB0eXBlLiAgV2hlbiB3Y2hhcl90IGlzIGEgdHlwZWRlZiwgZGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0CisvLyB3Y2hhcl90KiB3b3VsZCBjYXVzZSB1bnNpZ25lZCBzaG9ydCogYmUgcHJpbnRlZCBhcyBhIHdpZGUgc3RyaW5nLAorLy8gcG9zc2libHkgY2F1c2luZyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Nlcy4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKKy8vIE92ZXJsb2FkcyBmb3Igd2lkZSBDIHN0cmluZ3MKK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgd2NoYXJfdCo+KHMpLCBvcyk7Cit9CisjZW5kaWYKKworLy8gT3ZlcmxvYWQgZm9yIEMgYXJyYXlzLiAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBwcmludGVkCisvLyBwcm9wZXJseS4KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXksIHdpdGhvdXQgcHJpbnRpbmcKKy8vIHRoZSBjdXJseSBicmFjZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRSYXdBcnJheVRvKGNvbnN0IFQgYVtdLCBzaXplX3QgY291bnQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxQcmludChhWzBdLCBvcyk7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpICE9IGNvdW50OyBpKyspIHsKKyAgICAqb3MgPDwgIiwgIjsKKyAgICBVbml2ZXJzYWxQcmludChhW2ldLCBvcyk7CisgIH0KK30KKworLy8gT3ZlcmxvYWRzIGZvciA6OnN0cmluZyBhbmQgOjpzdGQ6OnN0cmluZy4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFN0cmluZ1RvKHMsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdGQ6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRTdHJpbmdUbyhzLCBvcyk7Cit9CisKKy8vIE92ZXJsb2FkcyBmb3IgOjp3c3RyaW5nIGFuZCA6OnN0ZDo6d3N0cmluZy4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK0dURVNUX0FQSV8gdm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKKy8vIE92ZXJsb2FkIGZvciA6OnN0ZDo6dHIxOjp0dXBsZS4gIE5lZWRlZCBmb3IgcHJpbnRpbmcgZnVuY3Rpb24gYXJndW1lbnRzLAorLy8gd2hpY2ggYXJlIHBhY2tlZCBhcyB0dXBsZXMuCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSB0dXBsZS4gIFQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gYSB0dXBsZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VHVwbGVUbyhjb25zdCBUJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBPdmVybG9hZGVkIFByaW50VG8oKSBmb3IgdHVwbGVzIG9mIHZhcmlvdXMgYXJpdGllcy4gIFdlIHN1cHBvcnQKKy8vIHR1cGxlcyBvZiB1cC10byAxMCBmaWVsZHMuICBUaGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIHdvcmtzCisvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdHIxOjp0dXBsZSBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUKKy8vIG5vbi1zdGFuZGFyZCB2YXJpYWRpYyB0ZW1wbGF0ZSBmZWF0dXJlIG9yIG5vdC4KKworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTw+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNj4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgordm9pZCBQcmludFRvKAorICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4mIHQsCisgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworLy8gT3ZlcmxvYWQgZm9yIHN0ZDo6cGFpci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnBhaXI8VDEsIFQyPiYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgJygnOworICAvLyBXZSBjYW5ub3QgdXNlIFVuaXZlcnNhbFByaW50KHZhbHVlLmZpcnN0LCBvcykgaGVyZSwgYXMgVDEgbWF5IGJlCisgIC8vIGEgcmVmZXJlbmNlIHR5cGUuICBUaGUgc2FtZSBmb3IgcHJpbnRpbmcgdmFsdWUuc2Vjb25kLgorICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUuZmlyc3QsIG9zKTsKKyAgKm9zIDw8ICIsICI7CisgIFVuaXZlcnNhbFByaW50ZXI8VDI+OjpQcmludCh2YWx1ZS5zZWNvbmQsIG9zKTsKKyAgKm9zIDw8ICcpJzsKK30KKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIGJ5IGxldHRpbmcgdGhlIGNvbXBpbGVyCisvLyBwaWNrIHRoZSByaWdodCBvdmVybG9hZCBvZiBQcmludFRvKCkgZm9yIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXIgeworIHB1YmxpYzoKKyAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCisgIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTgwKSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MTgwLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisgIC8vIE5vdGU6IHdlIGRlbGliZXJhdGVseSBkb24ndCBjYWxsIHRoaXMgUHJpbnRUbygpLCBhcyB0aGF0IG5hbWUKKyAgLy8gY29uZmxpY3RzIHdpdGggOjp0ZXN0aW5nOjppbnRlcm5hbDo6UHJpbnRUbyBpbiB0aGUgYm9keSBvZiB0aGUKKyAgLy8gZnVuY3Rpb24uCisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAvLyBCeSBkZWZhdWx0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvKCkgaXMgdXNlZCBmb3IgcHJpbnRpbmcKKyAgICAvLyB0aGUgdmFsdWUuCisgICAgLy8KKyAgICAvLyBUaGFua3MgdG8gS29lbmlnIGxvb2stdXAsIGlmIFQgaXMgYSBjbGFzcyBhbmQgaGFzIGl0cyBvd24KKyAgICAvLyBQcmludFRvKCkgZnVuY3Rpb24gZGVmaW5lZCBpbiBpdHMgbmFtZXNwYWNlLCB0aGF0IGZ1bmN0aW9uIHdpbGwKKyAgICAvLyBiZSB2aXNpYmxlIGhlcmUuICBTaW5jZSBpdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIGdlbmVyaWMgb25lcworICAgIC8vIGluIDo6dGVzdGluZzo6aW50ZXJuYWwsIGl0IHdpbGwgYmUgcGlja2VkIGJ5IHRoZSBjb21waWxlciBpbiB0aGUKKyAgICAvLyBmb2xsb3dpbmcgc3RhdGVtZW50IC0gZXhhY3RseSB3aGF0IHdlIHdhbnQuCisgICAgUHJpbnRUbyh2YWx1ZSwgb3MpOworICB9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbmRpZiAgLy8gX01TQ19WRVIKK307CisKKy8vIFVuaXZlcnNhbFByaW50QXJyYXkoYmVnaW4sIGxlbiwgb3MpIHByaW50cyBhbiBhcnJheSBvZiAnbGVuJworLy8gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IFQqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgKm9zIDw8ICJ7fSI7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8ICJ7ICI7CisgICAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxODsKKyAgICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDg7CisgICAgLy8gSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4ga1RocmVzaG9sZCBlbGVtZW50cywgd2UnbGwgaGF2ZSB0bworICAgIC8vIG9taXQgc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdAorICAgIC8vIGtDaHVua1NpemUgZWxlbWVudHMuCisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgorICAgIGlmIChsZW4gPD0ga1RocmVzaG9sZCkgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBsZW4sIG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgICAqb3MgPDwgIiwgLi4uLCAiOworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luICsgbGVuIC0ga0NodW5rU2l6ZSwga0NodW5rU2l6ZSwgb3MpOworICAgIH0KKyAgICAqb3MgPDwgIiB9IjsKKyAgfQorfQorLy8gVGhpcyBvdmVybG9hZCBwcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgY29tcGFjdGx5LgorR1RFU1RfQVBJXyB2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoCisgICAgY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IGNvbXBhY3RseS4KK0dURVNUX0FQSV8gdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KAorICAgIGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBJbXBsZW1lbnRzIHByaW50aW5nIGFuIGFycmF5IHR5cGUgVFtOXS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXI8VFtOXT4geworIHB1YmxpYzoKKyAgLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSwgb21pdHRpbmcgc29tZSBlbGVtZW50cyB3aGVuIHRoZXJlIGFyZSB0b28KKyAgLy8gbWFueS4KKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCAoJmEpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludEFycmF5KGEsIE4sIG9zKTsKKyAgfQorfTsKKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIHJlZmVyZW5jZSB0eXBlIFQmLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyPFQmPiB7CisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8KKyAgLy8gZGlzYWJsZSB0aGUgd2FybmluZy4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxODApICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQxODAuCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIC8vIFByaW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUuICBXZSB1c2UgcmVpbnRlcnByZXRfY2FzdCBoZXJlCisgICAgLy8gYXMgc3RhdGljX2Nhc3QgZG9lc24ndCBjb21waWxlIHdoZW4gVCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgKm9zIDw8ICJAIiA8PCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmdmFsdWUpIDw8ICIgIjsKKworICAgIC8vIFRoZW4gcHJpbnRzIHRoZSB2YWx1ZSBpdHNlbGYuCisgICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKKyAgfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYgIC8vIF9NU0NfVkVSCit9OworCisvLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQgdmFsdWUKKy8vIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhlCisvLyBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzIHByaW50ZWQuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VCY+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFRbTl0+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZ2YWx1ZSlbTl0sIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFByaW50ZXI8VFtOXT46OlByaW50KHZhbHVlLCBvcyk7CisgIH0KK307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IGNoYXIqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgKm9zIDw8ICJOVUxMIjsKKyAgICB9IGVsc2UgeworICAgICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nKHN0ciksIG9zKTsKKyAgICB9CisgIH0KK307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNoYXIqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCBjaGFyKj46OlByaW50KHN0ciwgb3MpOworICB9Cit9OworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IHdjaGFyX3QqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCB3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgKm9zIDw8ICJOVUxMIjsKKyAgICB9IGVsc2UgeworICAgICAgVW5pdmVyc2FsUHJpbnQoOjpzdGQ6OndzdHJpbmcoc3RyKSwgb3MpOworICAgIH0KKyAgfQorfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPHdjaGFyX3QqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludCh3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj46OlByaW50KHN0ciwgb3MpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zKTsKK30KKworLy8gUHJpbnRzIGEgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlCisvLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgZm9yIGEKKy8vIChjb25zdCkgY2hhciBwb2ludGVyLCB0aGlzIHByaW50cyBib3RoIHRoZSBwb2ludGVyIGFuZCB0aGUKKy8vIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIEEgd29ya2Fyb25kIGZvciB0aGUgYnVnIGluIFZDKysgNy4xIHRoYXQgcHJldmVudHMgdXMgZnJvbSBpbnN0YW50aWF0aW5nCisgIC8vIFVuaXZlcnNhbFByaW50ZXIgd2l0aCBUIGRpcmVjdGx5LgorICB0eXBlZGVmIFQgVDE7CisgIFVuaXZlcnNhbFByaW50ZXI8VDE+OjpQcmludCh2YWx1ZSwgb3MpOworfQorCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQordHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0cmluZz4gU3RyaW5nczsKKworLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgYWxsb3dzIFByaW50VG8oKSBmb3IgdHVwbGVzIGFuZAorLy8gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKCkgdG8gYmUgZGVmaW5lZCBieQorLy8gaW5kdWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgdHVwbGUgZmllbGRzLiAgVGhlIGlkZWEgaXMgdGhhdAorLy8gVHVwbGVQcmVmaXhQcmludGVyPE4+OjpQcmludFByZWZpeFRvKHQsIG9zKSBwcmludHMgdGhlIGZpcnN0IE4KKy8vIGZpZWxkcyBpbiB0dXBsZSB0LCBhbmQgY2FuIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKKy8vIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT4uCisKKy8vIFRoZSBpbmR1Y3RpdmUgY2FzZS4KK3RlbXBsYXRlIDxzaXplX3QgTj4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXIgeworICAvLyBQcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6UHJpbnRQcmVmaXhUbyh0LCBvcyk7CisgICAgKm9zIDw8ICIsICI7CisgICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PE4gLSAxLCBUdXBsZT46OnR5cGU+CisgICAgICAgIDo6UHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PE4gLSAxPih0KSwgb3MpOworICB9CisKKyAgLy8gVGVyc2VseSBwcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUgdG8gYSBzdHJpbmcgdmVjdG9yLAorICAvLyBvbmUgZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB0LCBTdHJpbmdzKiBzdHJpbmdzKSB7CisgICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6VGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyh0LCBzdHJpbmdzKTsKKyAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PE4gLSAxPih0KSwgJnNzKTsKKyAgICBzdHJpbmdzLT5wdXNoX2JhY2soc3Muc3RyKCkpOworICB9Cit9OworCisvLyBCYXNlIGNhc2VzLgordGVtcGxhdGUgPD4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MD4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmLCA6OnN0ZDo6b3N0cmVhbSopIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiwgU3RyaW5ncyopIHt9Cit9OworLy8gV2UgaGF2ZSB0byBzcGVjaWFsaXplIHRoZSBlbnRpcmUgVHVwbGVQcmVmaXhQcmludGVyPD4gY2xhc3MKKy8vIHRlbXBsYXRlIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mCisvLyBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKCkgaXMgdGhlIHNhbWUgYXMgdGhlIGdlbmVyaWMgdmVyc2lvbiwgYXMKKy8vIEVtYmFyY2FkZXJvIChmb3JtZXJseSBDb2RlR2VhciwgZm9ybWVybHkgQm9ybGFuZCkgQysrIGRvZXNuJ3QKKy8vIHN1cHBvcnQgc3BlY2lhbGl6aW5nIGEgbWV0aG9kIHRlbXBsYXRlIG9mIGEgY2xhc3MgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlcjwxPiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PDAsIFR1cGxlPjo6dHlwZT46OgorICAgICAgICBQcmludCg6OnN0ZDo6dHIxOjpnZXQ8MD4odCksIG9zKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYgdCwgU3RyaW5ncyogc3RyaW5ncykgeworICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgVW5pdmVyc2FsVGVyc2VQcmludCg6OnN0ZDo6dHIxOjpnZXQ8MD4odCksICZzcyk7CisgICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKKyAgfQorfTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoCisvLyBhIHR1cGxlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIigiOworICBUdXBsZVByZWZpeFByaW50ZXI8IDo6c3RkOjp0cjE6OnR1cGxlX3NpemU8VD46OnZhbHVlPjo6CisgICAgICBQcmludFByZWZpeFRvKHQsIG9zKTsKKyAgKm9zIDw8ICIpIjsKK30KKworLy8gUHJpbnRzIHRoZSBmaWVsZHMgb2YgYSB0dXBsZSB0ZXJzZWx5IHRvIGEgc3RyaW5nIHZlY3Rvciwgb25lCisvLyBlbGVtZW50IGZvciBlYWNoIGZpZWxkLiAgU2VlIHRoZSBjb21tZW50IGJlZm9yZQorLy8gVW5pdmVyc2FsVGVyc2VQcmludCgpIGZvciBob3cgd2UgZGVmaW5lICJ0ZXJzZWx5Ii4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KK1N0cmluZ3MgVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB2YWx1ZSkgeworICBTdHJpbmdzIHJlc3VsdDsKKyAgVHVwbGVQcmVmaXhQcmludGVyPCA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU+OjoKKyAgICAgIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModmFsdWUsICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBpbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gT3V0cHV0cyBhIG1lc3NhZ2UgZXhwbGFpbmluZyBpbnZhbGlkIHJlZ2lzdHJhdGlvbiBvZiBkaWZmZXJlbnQKKy8vIGZpeHR1cmUgY2xhc3MgZm9yIHRoZSBzYW1lIHRlc3QgY2FzZS4gVGhpcyBtYXkgaGFwcGVuIHdoZW4KKy8vIFRFU1RfUCBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSB0d28gdGVzdHMgd2l0aCB0aGUgc2FtZSBuYW1lCisvLyBidXQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCitHVEVTVF9BUElfIHZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTsKK3RlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3I7CisKKy8vIEludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgZWxlbWVudHMgcHJvdmlkZWQgYnkgYW4gaW1wbGVtZW50YXRpb24KKy8vIG9mIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflBhcmFtSXRlcmF0b3JJbnRlcmZhY2UoKSB7fQorICAvLyBBIHBvaW50ZXIgdG8gdGhlIGJhc2UgZ2VuZXJhdG9yIGluc3RhbmNlLgorICAvLyBVc2VkIG9ubHkgZm9yIHRoZSBwdXJwb3NlcyBvZiBpdGVyYXRvciBjb21wYXJpc29uCisgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHR3byBpdGVyYXRvcnMgYmVsb25nIHRvIHRoZSBzYW1lIGdlbmVyYXRvci4KKyAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0ID0gMDsKKyAgLy8gQWR2YW5jZXMgaXRlcmF0b3IgdG8gcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudAorICAvLyBwcm92aWRlZCBieSB0aGUgZ2VuZXJhdG9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgIC8vIGZvciBub3QgY2FsbGluZyBBZHZhbmNlKCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8KKyAgLy8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KKyAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSA9IDA7CisgIC8vIENsb25lcyB0aGUgaXRlcmF0b3Igb2JqZWN0LiBVc2VkIGZvciBpbXBsZW1lbnRpbmcgY29weSBzZW1hbnRpY3MKKyAgLy8gb2YgUGFyYW1JdGVyYXRvcjxUPi4KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKiBDbG9uZSgpIGNvbnN0ID0gMDsKKyAgLy8gRGVyZWZlcmVuY2VzIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGFuZCBwcm92aWRlcyAocmVhZC1vbmx5KSBhY2Nlc3MKKyAgLy8gdG8gdGhlIHBvaW50ZWQgdmFsdWUuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSBub3QgdG8gY2FsbAorICAvLyBDdXJyZW50KCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KKyAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvciooKS4KKyAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgPSAwOworICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCBvdGhlciBwb2ludCB0byB0aGUgc2FtZQorICAvLyBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGdlbmVyYXRvci4KKyAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvcj09KCkuCisgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZSYgb3RoZXIpIGNvbnN0ID0gMDsKK307CisKKy8vIENsYXNzIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4gSXQgd3JhcHMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPgorLy8gYW5kIGltcGxlbWVudHMgdGhlIGNvbnN0IGZvcndhcmQgaXRlcmF0b3IgY29uY2VwdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1JdGVyYXRvciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBUJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICAvLyBQYXJhbUl0ZXJhdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBpbXBsXyBwb2ludGVyLgorICBQYXJhbUl0ZXJhdG9yKGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSA6IGltcGxfKG90aGVyLmltcGxfLT5DbG9uZSgpKSB7fQorICBQYXJhbUl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIHsKKyAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgICBpbXBsXy5yZXNldChvdGhlci5pbXBsXy0+Q2xvbmUoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmltcGxfLT5DdXJyZW50KCk7IH0KKyAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5DdXJyZW50KCk7IH0KKyAgLy8gUHJlZml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KKyAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICBpbXBsXy0+QWR2YW5jZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLyBQb3N0Zml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KKyAgUGFyYW1JdGVyYXRvciBvcGVyYXRvcisrKGludCAvKnVudXNlZCovKSB7CisgICAgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogY2xvbmUgPSBpbXBsXy0+Q2xvbmUoKTsKKyAgICBpbXBsXy0+QWR2YW5jZSgpOworICAgIHJldHVybiBQYXJhbUl0ZXJhdG9yKGNsb25lKTsKKyAgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbF8uZ2V0KCkgPT0gb3RoZXIuaW1wbF8uZ2V0KCkgfHwgaW1wbF8tPkVxdWFscygqb3RoZXIuaW1wbF8pOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFBhcmFtR2VuZXJhdG9yPFQ+OworICBleHBsaWNpdCBQYXJhbUl0ZXJhdG9yKFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGltcGwpIDogaW1wbF8oaW1wbCkge30KKyAgc2NvcGVkX3B0cjxQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+ID4gaW1wbF87Cit9OworCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpcyB0aGUgYmluYXJ5IGludGVyZmFjZSB0byBhY2Nlc3MgZ2VuZXJhdG9ycworLy8gZGVmaW5lZCBpbiBvdGhlciB0cmFuc2xhdGlvbiB1bml0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIFBhcmFtVHlwZTsKKworICB2aXJ0dWFsIH5QYXJhbUdlbmVyYXRvckludGVyZmFjZSgpIHt9CisKKyAgLy8gR2VuZXJhdG9yIGludGVyZmFjZSBkZWZpbml0aW9uCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgPSAwOworfTsKKworLy8gV3JhcHMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gYW5kIHByb3ZpZGVzIGdlbmVyYWwgZ2VuZXJhdG9yIHN5bnRheAorLy8gY29tcGF0aWJsZSB3aXRoIHRoZSBTVEwgQ29udGFpbmVyIGNvbmNlcHQuCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgY29weSBpbml0aWFsaXphdGlvbiBzZW1hbnRpY3MgYW5kIHRoZSBjb250YWluZWQKKy8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGluc3RhbmNlIGlzIHNoYXJlZCBhbW9uZyBhbGwgY29waWVzCisvLyBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhhdCBpbnN0YW5jZSBpcyBpbW11dGFibGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1HZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBQYXJhbUl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOworCisgIGV4cGxpY2l0IFBhcmFtR2VuZXJhdG9yKFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisgIFBhcmFtR2VuZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXykge30KKworICBQYXJhbUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgeworICAgIGltcGxfID0gb3RoZXIuaW1wbF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihpbXBsXy0+QmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkVuZCgpKTsgfQorCisgcHJpdmF0ZToKKyAgbGlua2VkX3B0cjxjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOworfTsKKworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcmFuZ2Ugb2YgdHdvIGNvbXBhcmFibGUgdmFsdWVzLiBDYW4gYmUgdXNlZCB0bworLy8gZ2VuZXJhdGUgc2VxdWVuY2VzIG9mIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGltcGxlbWVudCBvcGVyYXRvcisoKSBhbmQKKy8vIG9wZXJhdG9yPCgpLgorLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSBSYW5nZSgpIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+CitjbGFzcyBSYW5nZUdlbmVyYXRvciA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiB7CisgcHVibGljOgorICBSYW5nZUdlbmVyYXRvcihUIGJlZ2luLCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKQorICAgICAgOiBiZWdpbl8oYmVnaW4pLCBlbmRfKGVuZCksCisgICAgICAgIHN0ZXBfKHN0ZXApLCBlbmRfaW5kZXhfKENhbGN1bGF0ZUVuZEluZGV4KGJlZ2luLCBlbmQsIHN0ZXApKSB7fQorICB2aXJ0dWFsIH5SYW5nZUdlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGJlZ2luXywgMCwgc3RlcF8pOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZW5kXywgZW5kX2luZGV4Xywgc3RlcF8pOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwgVCB2YWx1ZSwgaW50IGluZGV4LAorICAgICAgICAgICAgIEluY3JlbWVudFQgc3RlcCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwgdmFsdWVfKHZhbHVlKSwgaW5kZXhfKGluZGV4KSwgc3RlcF8oc3RlcCkge30KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIHZhbHVlXyA9IHZhbHVlXyArIHN0ZXBfOworICAgICAgaW5kZXhfKys7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IGludCBvdGhlcl9pbmRleCA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pbmRleF87CisgICAgICByZXR1cm4gaW5kZXhfID09IG90aGVyX2luZGV4OworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAorICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwgdmFsdWVfKG90aGVyLnZhbHVlXyksIGluZGV4XyhvdGhlci5pbmRleF8pLAorICAgICAgICAgIHN0ZXBfKG90aGVyLnN0ZXBfKSB7fQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogY29uc3QgYmFzZV87CisgICAgVCB2YWx1ZV87CisgICAgaW50IGluZGV4XzsKKyAgICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOworICB9OyAgLy8gY2xhc3MgUmFuZ2VHZW5lcmF0b3I6Okl0ZXJhdG9yCisKKyAgc3RhdGljIGludCBDYWxjdWxhdGVFbmRJbmRleChjb25zdCBUJiBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5jcmVtZW50VCYgc3RlcCkgeworICAgIGludCBlbmRfaW5kZXggPSAwOworICAgIGZvciAoVCBpID0gYmVnaW47IGkgPCBlbmQ7IGkgPSBpICsgc3RlcCkKKyAgICAgIGVuZF9pbmRleCsrOworICAgIHJldHVybiBlbmRfaW5kZXg7CisgIH0KKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJhbmdlR2VuZXJhdG9yJiBvdGhlcik7CisKKyAgY29uc3QgVCBiZWdpbl87CisgIGNvbnN0IFQgZW5kXzsKKyAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKKyAgLy8gVGhlIGluZGV4IGZvciB0aGUgZW5kKCkgaXRlcmF0b3IuIEFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGdlbmVyYXRlZAorICAvLyBzZXF1ZW5jZSBhcmUgaW5kZXhlZCAoMC1iYXNlZCkgdG8gYWlkIGl0ZXJhdG9yIGNvbXBhcmlzb24uCisgIGNvbnN0IGludCBlbmRfaW5kZXhfOworfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yCisKKworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBVc2VkIGluIHRoZQorLy8gVmFsdWVzSW4oKSBmdW5jdGlvbi4gVGhlIGVsZW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgc291cmNlIHJhbmdlCisvLyBzaW5jZSB0aGUgc291cmNlIGNhbiBiZSBsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHRoZSBnZW5lcmF0b3IKKy8vIGlzIGxpa2VseSB0byBwZXJzaXN0IGJleW9uZCB0aGF0IHN0YWNrIGZyYW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KKyAgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkKKyAgICAgIDogY29udGFpbmVyXyhiZWdpbiwgZW5kKSB7fQorICB2aXJ0dWFsIH5WYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBjb250YWluZXJfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxUPiBDb250YWluZXJUeXBlOworCisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLAorICAgICAgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yKQorICAgICAgICA6IGJhc2VfKGJhc2UpLCBpdGVyYXRvcl8oaXRlcmF0b3IpIHt9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICArK2l0ZXJhdG9yXzsKKyAgICAgIHZhbHVlXy5yZXNldCgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIC8vIFdlIG5lZWQgdG8gdXNlIGNhY2hlZCB2YWx1ZSByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yXyBiZWNhdXNlICppdGVyYXRvcl8KKyAgICAvLyBjYW4gcmV0dXJuIGEgdGVtcG9yYXJ5IG9iamVjdCAoYW5kIG9mIHR5cGUgb3RoZXIgdGhlbiBUKSwgc28ganVzdAorICAgIC8vIGhhdmluZyAicmV0dXJuICYqaXRlcmF0b3JfOyIgZG9lc24ndCB3b3JrLgorICAgIC8vIHZhbHVlXyBpcyB1cGRhdGVkIGhlcmUgYW5kIG5vdCBpbiBBZHZhbmNlKCkgYmVjYXVzZSBBZHZhbmNlKCkKKyAgICAvLyBjYW4gYWR2YW5jZSBpdGVyYXRvcl8gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJhbmdlLCBhbmQgd2UgY2Fubm90CisgICAgLy8gZGV0ZWN0IHRoYXQgZmFjdC4gVGhlIGNsaWVudCBjb2RlLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMKKyAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90IGNhbGxpbmcgQ3VycmVudCgpIG9uIGFuIG91dC1vZi1yYW5nZSBpdGVyYXRvci4KKyAgICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCB7CisgICAgICBpZiAodmFsdWVfLmdldCgpID09IE5VTEwpCisgICAgICAgIHZhbHVlXy5yZXNldChuZXcgVCgqaXRlcmF0b3JfKSk7CisgICAgICByZXR1cm4gdmFsdWVfLmdldCgpOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gaXRlcmF0b3JfID09CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pdGVyYXRvcl87CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgICAvLyBUaGUgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCBzdXBwcmVzc2VzIGEgZmFsc2Ugd2FybmluZworICAgICAgICAgIC8vIGVtaXR0ZWQgYnkgZ2NjIHdoZW4gc3VwcGxpZWQgd2l0aCB0aGUgLVdleHRyYSBvcHRpb24uCisgICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAorICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgICBpdGVyYXRvcl8ob3RoZXIuaXRlcmF0b3JfKSB7fQorCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOworICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yXzsKKyAgICAvLyBBIGNhY2hlZCB2YWx1ZSBvZiAqaXRlcmF0b3JfLiBXZSBrZWVwIGl0IGhlcmUgdG8gYWxsb3cgYWNjZXNzIGJ5CisgICAgLy8gcG9pbnRlciBpbiB0aGUgd3JhcHBpbmcgaXRlcmF0b3IncyBvcGVyYXRvci0+KCkuCisgICAgLy8gdmFsdWVfIG5lZWRzIHRvIGJlIG11dGFibGUgdG8gYmUgYWNjZXNzZWQgaW4gQ3VycmVudCgpLgorICAgIC8vIFVzZSBvZiBzY29wZWRfcHRyIGhlbHBzIG1hbmFnZSBjYWNoZWQgdmFsdWUncyBsaWZldGltZSwKKyAgICAvLyB3aGljaCBpcyBib3VuZCBieSB0aGUgbGlmZXNwYW4gb2YgdGhlIGl0ZXJhdG9yIGl0c2VsZi4KKyAgICBtdXRhYmxlIHNjb3BlZF9wdHI8Y29uc3QgVD4gdmFsdWVfOworICB9OyAgLy8gY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yJiBvdGhlcik7CisKKyAgY29uc3QgQ29udGFpbmVyVHlwZSBjb250YWluZXJfOworfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcgorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFN0b3JlcyBhIHBhcmFtZXRlciB2YWx1ZSBhbmQgbGF0ZXIgY3JlYXRlcyB0ZXN0cyBwYXJhbWV0ZXJpemVkIHdpdGggdGhhdAorLy8gdmFsdWUuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5IDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDbGFzczo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKKyAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIDoKKyAgICAgIHBhcmFtZXRlcl8ocGFyYW1ldGVyKSB7fQorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7CisgICAgVGVzdENsYXNzOjpTZXRQYXJhbSgmcGFyYW1ldGVyXyk7CisgICAgcmV0dXJuIG5ldyBUZXN0Q2xhc3MoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgUGFyYW1UeXBlIHBhcmFtZXRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkpOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBUZXN0TWV0YUZhY3RvcnlCYXNlIGlzIGEgYmFzZSBjbGFzcyBmb3IgbWV0YS1mYWN0b3JpZXMgdGhhdCBjcmVhdGUKKy8vIHRlc3QgZmFjdG9yaWVzIGZvciBwYXNzaW5nIGludG8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgorY2xhc3MgVGVzdE1ldGFGYWN0b3J5QmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UZXN0TWV0YUZhY3RvcnlCYXNlKCkge30KKworICB2aXJ0dWFsIFRlc3RGYWN0b3J5QmFzZSogQ3JlYXRlVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgPSAwOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBUZXN0TWV0YUZhY3RvcnkgY3JlYXRlcyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvCisvLyBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyBmdW5jdGlvbi4gU2luY2UgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gcmVjZWl2ZXMKKy8vIG93bmVyc2hpcCBvZiB0ZXN0IGZhY3RvcnkgcG9pbnRlciwgc2FtZSBmYWN0b3J5IG9iamVjdCBjYW5ub3QgYmUgcGFzc2VkCisvLyBpbnRvIHRoYXQgbWV0aG9kIHR3aWNlLiBCdXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBpcyBnb2luZyB0byBjYWxsCisvLyBpdCBmb3IgZWFjaCBUZXN0L1BhcmFtZXRlciB2YWx1ZSBjb21iaW5hdGlvbi4gVGh1cyBpdCBuZWVkcyBtZXRhIGZhY3RvcnkKKy8vIGNyZWF0b3IgY2xhc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+CitjbGFzcyBUZXN0TWV0YUZhY3RvcnkKKyAgICA6IHB1YmxpYyBUZXN0TWV0YUZhY3RvcnlCYXNlPHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGU+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZSBQYXJhbVR5cGU7CisKKyAgVGVzdE1ldGFGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIFRlc3RGYWN0b3J5QmFzZSogQ3JlYXRlVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgeworICAgIHJldHVybiBuZXcgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5PFRlc3RDYXNlPihwYXJhbWV0ZXIpOworICB9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RNZXRhRmFjdG9yeSk7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGlzIGEgZ2VuZXJpYyBpbnRlcmZhY2UKKy8vIHRvIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gY2xhc3Nlcy4gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UKKy8vIGFjY3VtdWxhdGVzIHRlc3QgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgVEVTVF9QIG1hY3JvIGludm9jYXRpb25zCisvLyBhbmQgZ2VuZXJhdG9ycyBwcm92aWRlZCBieSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucworLy8gYW5kIHVzZXMgdGhhdCBpbmZvcm1hdGlvbiB0byByZWdpc3RlciBhbGwgcmVzdWx0aW5nIHRlc3QgaW5zdGFuY2VzCisvLyBpbiBSZWdpc3RlclRlc3RzIG1ldGhvZC4gVGhlIFBhcmFtZXRlcml6ZVRlc3RDYXNlUmVnaXN0cnkgY2xhc3MgaG9sZHMKKy8vIGEgY29sbGVjdGlvbiBvZiBwb2ludGVycyB0byB0aGUgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBvYmplY3RzCisvLyBhbmQgY2FsbHMgUmVnaXN0ZXJUZXN0cygpIG9uIGVhY2ggb2YgdGhlbSB3aGVuIGFza2VkLgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UoKSB7fQorCisgIC8vIEJhc2UgcGFydCBvZiB0ZXN0IGNhc2UgbmFtZSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEdldFRlc3RDYXNlTmFtZSgpIGNvbnN0ID0gMDsKKyAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4KKyAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCA9IDA7CisgIC8vIFVuaXRUZXN0IGNsYXNzIGludm9rZXMgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgdGVzdHMgaW4gdGhpcworICAvLyB0ZXN0IGNhc2UgcmlnaHQgYmVmb3JlIHJ1bm5pbmcgdGhlbSBpbiBSVU5fQUxMX1RFU1RTIG1hY3JvLgorICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZSBvbiBhbnkgc2luZ2xlCisgIC8vIGluc3RhbmNlIG9mIGEgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgZGVyaXZlZCBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVGVzdHMoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UpOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGFjY3VtdWxhdGVzIHRlc3RzIG9idGFpbmVkIGZyb20gVEVTVF9QCisvLyBtYWNybyBpbnZvY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZSBhbmQgZ2VuZXJhdG9ycworLy8gb2J0YWluZWQgZnJvbSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucyBmb3IgdGhhdAorLy8gdGVzdCBjYXNlLiBJdCByZWdpc3RlcnMgdGVzdHMgd2l0aCBhbGwgdmFsdWVzIGdlbmVyYXRlZCBieSBhbGwKKy8vIGdlbmVyYXRvcnMgd2hlbiBhc2tlZC4KK3RlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gOiBwdWJsaWMgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgeworIHB1YmxpYzoKKyAgLy8gUGFyYW1UeXBlIGFuZCBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMgYXJlIHByaXZhdGUgdHlwZXMgYnV0IGFyZSByZXF1aXJlZAorICAvLyBmb3IgZGVjbGFyYXRpb25zIG9mIHB1YmxpYyBtZXRob2RzIEFkZFRlc3RQYXR0ZXJuKCkgYW5kCisgIC8vIEFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbigpLgorICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOworICAvLyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhcHByb3ByaWF0ZSBnZW5lcmF0b3IgdHlwZS4KKyAgdHlwZWRlZiBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+KEdlbmVyYXRvckNyZWF0aW9uRnVuYykoKTsKKworICBleHBsaWNpdCBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgICA6IHRlc3RfY2FzZV9uYW1lXyhuYW1lKSB7fQorCisgIC8vIFRlc3QgY2FzZSBiYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCB7IHJldHVybiB0ZXN0X2Nhc2VfbmFtZV87IH0KKyAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4KKyAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCB7IHJldHVybiBHZXRUeXBlSWQ8VGVzdENhc2U+KCk7IH0KKyAgLy8gVEVTVF9QIG1hY3JvIHVzZXMgQWRkVGVzdFBhdHRlcm4oKSB0byByZWNvcmQgaW5mb3JtYXRpb24KKyAgLy8gYWJvdXQgYSBzaW5nbGUgdGVzdCBpbiBhIExvY2FsVGVzdEluZm8gc3RydWN0dXJlLgorICAvLyB0ZXN0X2Nhc2VfbmFtZSBpcyB0aGUgYmFzZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgKHdpdGhvdXQgaW52b2NhdGlvbgorICAvLyBwcmVmaXgpLiB0ZXN0X2Jhc2VfbmFtZSBpcyB0aGUgbmFtZSBvZiBhbiBpbmRpdmlkdWFsIHRlc3Qgd2l0aG91dAorICAvLyBwYXJhbWV0ZXIgaW5kZXguIEZvciB0aGUgdGVzdCBTZXF1ZW5jZUEvRm9vVGVzdC5Eb0Jhci8xIEZvb1Rlc3QgaXMKKyAgLy8gdGVzdCBjYXNlIGJhc2UgbmFtZSBhbmQgRG9CYXIgaXMgdGVzdCBiYXNlIG5hbWUuCisgIHZvaWQgQWRkVGVzdFBhdHRlcm4oY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9iYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgVGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+KiBtZXRhX2ZhY3RvcnkpIHsKKyAgICB0ZXN0c18ucHVzaF9iYWNrKGxpbmtlZF9wdHI8VGVzdEluZm8+KG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2ZhY3RvcnkpKSk7CisgIH0KKyAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gdXNlcyBBZGRHZW5lcmF0b3IoKSB0byByZWNvcmQgaW5mb3JtYXRpb24KKyAgLy8gYWJvdXQgYSBnZW5lcmF0b3IuCisgIGludCBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oY29uc3Qgc3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIGZpbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGxpbmUgKi8pIHsKKyAgICBpbnN0YW50aWF0aW9uc18ucHVzaF9iYWNrKDo6c3RkOjptYWtlX3BhaXIoaW5zdGFudGlhdGlvbl9uYW1lLCBmdW5jKSk7CisgICAgcmV0dXJuIDA7ICAvLyBSZXR1cm4gdmFsdWUgdXNlZCBvbmx5IHRvIHJ1biB0aGlzIG1ldGhvZCBpbiBuYW1lc3BhY2Ugc2NvcGUuCisgIH0KKyAgLy8gVW5pdFRlc3QgY2xhc3MgaW52b2tlcyB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZQorICAvLyB0ZXN0IGNhc2VzIHJpZ2h0IGJlZm9yZSBydW5uaW5nIHRlc3RzIGluIFJVTl9BTExfVEVTVFMgbWFjcm8uCisgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlIG9uIGFueSBzaW5nbGUKKyAgLy8gaW5zdGFuY2Ugb2YgYSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBkZXJpdmVkIGNsYXNzLgorICAvLyBVbml0VGVzdCBoYXMgYSBndWFyZCB0byBwcmV2ZW50IGZyb20gY2FsbGluZyB0aGlzIG1ldGhvZCBtb3JlIHRoZW4gb25jZS4KKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7CisgICAgZm9yICh0eXBlbmFtZSBUZXN0SW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgdGVzdF9pdCA9IHRlc3RzXy5iZWdpbigpOworICAgICAgICAgdGVzdF9pdCAhPSB0ZXN0c18uZW5kKCk7ICsrdGVzdF9pdCkgeworICAgICAgbGlua2VkX3B0cjxUZXN0SW5mbz4gdGVzdF9pbmZvID0gKnRlc3RfaXQ7CisgICAgICBmb3IgKHR5cGVuYW1lIEluc3RhbnRpYXRpb25Db250YWluZXI6Oml0ZXJhdG9yIGdlbl9pdCA9CisgICAgICAgICAgICAgICBpbnN0YW50aWF0aW9uc18uYmVnaW4oKTsgZ2VuX2l0ICE9IGluc3RhbnRpYXRpb25zXy5lbmQoKTsKKyAgICAgICAgICAgICAgICsrZ2VuX2l0KSB7CisgICAgICAgIGNvbnN0IHN0cmluZyYgaW5zdGFudGlhdGlvbl9uYW1lID0gZ2VuX2l0LT5maXJzdDsKKyAgICAgICAgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPiBnZW5lcmF0b3IoKCpnZW5faXQtPnNlY29uZCkoKSk7CisKKyAgICAgICAgTWVzc2FnZSB0ZXN0X2Nhc2VfbmFtZV9zdHJlYW07CisgICAgICAgIGlmICggIWluc3RhbnRpYXRpb25fbmFtZS5lbXB0eSgpICkKKyAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZV9zdHJlYW0gPDwgaW5zdGFudGlhdGlvbl9uYW1lIDw8ICIvIjsKKyAgICAgICAgdGVzdF9jYXNlX25hbWVfc3RyZWFtIDw8IHRlc3RfaW5mby0+dGVzdF9jYXNlX2Jhc2VfbmFtZTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAodHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPjo6aXRlcmF0b3IgcGFyYW1faXQgPQorICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgICAgICAgICAgICBwYXJhbV9pdCAhPSBnZW5lcmF0b3IuZW5kKCk7ICsrcGFyYW1faXQsICsraSkgeworICAgICAgICAgIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsKKyAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtIDw8IHRlc3RfaW5mby0+dGVzdF9iYXNlX25hbWUgPDwgIi8iIDw8IGk7CisgICAgICAgICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lX3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgIE5VTEwsICAvLyBObyB0eXBlIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZygqcGFyYW1faXQpLmNfc3RyKCksCisgICAgICAgICAgICAgIEdldFRlc3RDYXNlVHlwZUlkKCksCisgICAgICAgICAgICAgIFRlc3RDYXNlOjpTZXRVcFRlc3RDYXNlLAorICAgICAgICAgICAgICBUZXN0Q2FzZTo6VGVhckRvd25UZXN0Q2FzZSwKKyAgICAgICAgICAgICAgdGVzdF9pbmZvLT50ZXN0X21ldGFfZmFjdG9yeS0+Q3JlYXRlVGVzdEZhY3RvcnkoKnBhcmFtX2l0KSk7CisgICAgICAgIH0gIC8vIGZvciBwYXJhbV9pdAorICAgICAgfSAgLy8gZm9yIGdlbl9pdAorICAgIH0gIC8vIGZvciB0ZXN0X2l0CisgIH0gIC8vIFJlZ2lzdGVyVGVzdHMKKworIHByaXZhdGU6CisgIC8vIExvY2FsVGVzdEluZm8gc3RydWN0dXJlIGtlZXBzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHRlc3QgcmVnaXN0ZXJlZAorICAvLyB3aXRoIFRFU1RfUCBtYWNyby4KKyAgc3RydWN0IFRlc3RJbmZvIHsKKyAgICBUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9iYXNlX25hbWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogYV90ZXN0X2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICBUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4qIGFfdGVzdF9tZXRhX2ZhY3RvcnkpIDoKKyAgICAgICAgdGVzdF9jYXNlX2Jhc2VfbmFtZShhX3Rlc3RfY2FzZV9iYXNlX25hbWUpLAorICAgICAgICB0ZXN0X2Jhc2VfbmFtZShhX3Rlc3RfYmFzZV9uYW1lKSwKKyAgICAgICAgdGVzdF9tZXRhX2ZhY3RvcnkoYV90ZXN0X21ldGFfZmFjdG9yeSkge30KKworICAgIGNvbnN0IHN0cmluZyB0ZXN0X2Nhc2VfYmFzZV9uYW1lOworICAgIGNvbnN0IHN0cmluZyB0ZXN0X2Jhc2VfbmFtZTsKKyAgICBjb25zdCBzY29wZWRfcHRyPFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiA+IHRlc3RfbWV0YV9mYWN0b3J5OworICB9OworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8bGlua2VkX3B0cjxUZXN0SW5mbz4gPiBUZXN0SW5mb0NvbnRhaW5lcjsKKyAgLy8gS2VlcHMgcGFpcnMgb2YgPEluc3RhbnRpYXRpb24gbmFtZSwgU2VxdWVuY2UgZ2VuZXJhdG9yIGNyZWF0aW9uIGZ1bmN0aW9uPgorICAvLyByZWNlaXZlZCBmcm9tIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3Jvcy4KKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdHJpbmcsIEdlbmVyYXRvckNyZWF0aW9uRnVuYyo+ID4KKyAgICAgIEluc3RhbnRpYXRpb25Db250YWluZXI7CisKKyAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsKKyAgVGVzdEluZm9Db250YWluZXIgdGVzdHNfOworICBJbnN0YW50aWF0aW9uQ29udGFpbmVyIGluc3RhbnRpYXRpb25zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8pOworfTsgIC8vIGNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBjb250YWlucyBhIG1hcCBvZiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQorLy8gY2xhc3NlcyBhY2Nlc3NlZCBieSB0ZXN0IGNhc2UgbmFtZXMuIFRFU1RfUCBhbmQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AKKy8vIG1hY3JvcyB1c2UgaXQgdG8gbG9jYXRlIHRoZWlyIGNvcnJlc3BvbmRpbmcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbworLy8gZGVzY3JpcHRvcnMuCitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSB7CisgcHVibGljOgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHt9CisgIH5QYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICBkZWxldGUgKml0OworICAgIH0KKyAgfQorCisgIC8vIExvb2tzIHVwIG9yIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dAorICAvLyB0ZXN0cyBhbmQgaW5zdGFudGlhdGlvbnMgb2YgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyKAorICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgaW50IGxpbmUpIHsKKyAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogdHlwZWRfdGVzdF9pbmZvID0gTlVMTDsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlTmFtZSgpID09IHRlc3RfY2FzZV9uYW1lKSB7CisgICAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VUeXBlSWQoKSAhPSBHZXRUeXBlSWQ8VGVzdENhc2U+KCkpIHsKKyAgICAgICAgICAvLyBDb21wbGFpbiBhYm91dCBpbmNvcnJlY3QgdXNhZ2Ugb2YgR29vZ2xlIFRlc3QgZmFjaWxpdGllcworICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gc2luY2Ugd2UgY2Fubm90IGd1YXJhbnR5IGNvcnJlY3QKKyAgICAgICAgICAvLyB0ZXN0IGNhc2Ugc2V0dXAgYW5kIHRlYXItZG93biBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZSh0ZXN0X2Nhc2VfbmFtZSwgIGZpbGUsIGxpbmUpOworICAgICAgICAgIHBvc2l4OjpBYm9ydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCB0aGUgb2JqZWN0IHdlIGZvdW5kIGlzIG9mIHRoZSBzYW1lCisgICAgICAgICAgLy8gdHlwZSB3ZSBhcmUgbG9va2luZyBmb3IsIHNvIHdlIGRvd25jYXN0IGl0IHRvIHRoYXQgdHlwZQorICAgICAgICAgIC8vIHdpdGhvdXQgZnVydGhlciBjaGVja3MuCisgICAgICAgICAgdHlwZWRfdGVzdF9pbmZvID0gQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPAorICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiA+KCppdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlZF90ZXN0X2luZm8gPT0gTlVMTCkgeworICAgICAgdHlwZWRfdGVzdF9pbmZvID0gbmV3IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KHRlc3RfY2FzZV9uYW1lKTsKKyAgICAgIHRlc3RfY2FzZV9pbmZvc18ucHVzaF9iYWNrKHR5cGVkX3Rlc3RfaW5mbyk7CisgICAgfQorICAgIHJldHVybiB0eXBlZF90ZXN0X2luZm87CisgIH0KKyAgdm9pZCBSZWdpc3RlclRlc3RzKCkgeworICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKKyAgICAgICgqaXQpLT5SZWdpc3RlclRlc3RzKCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8UGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UqPiBUZXN0Q2FzZUluZm9Db250YWluZXI7CisKKyAgVGVzdENhc2VJbmZvQ29udGFpbmVyIHRlc3RfY2FzZV9pbmZvc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wCisvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSBHb29nbGUgVGVzdCBzdXBwb3J0cyBhdCBtb3N0IDUwIGFyZ3VtZW50cyBpbiBWYWx1ZXMsCisvLyBhbmQgYXQgbW9zdCAxMCBhcmd1bWVudHMgaW4gQ29tYmluZS4gUGxlYXNlIGNvbnRhY3QKKy8vIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZCBtb3JlLgorLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBDb21iaW5lIGlzIGxpbWl0ZWQKKy8vIGJ5IHRoZSBtYXhpbXVtIGFyaXR5IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0cjE6OnR1cGxlIHdoaWNoIGlzCisvLyBjdXJyZW50bHkgc2V0IGF0IDEwLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBWYWx1ZXNJbigpLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBpbgorLy8gaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmguCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgorVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pOworCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVc2VkIGluIHRoZSBWYWx1ZXMoKSBmdW5jdGlvbiB0byBwcm92aWRlIHBvbHltb3JwaGljIGNhcGFiaWxpdGllcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2NsYXNzIFZhbHVlQXJyYXkxIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlQXJyYXkxKFQxIHYxKSA6IHYxXyh2MSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7IHJldHVybiBWYWx1ZXNJbigmdjFfLCAmdjFfICsgMSk7IH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorY2xhc3MgVmFsdWVBcnJheTIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIoVDEgdjEsIFQyIHYyKSA6IHYxXyh2MSksIHYyXyh2Mikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorY2xhc3MgVmFsdWVBcnJheTMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMoVDEgdjEsIFQyIHYyLCBUMyB2MykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2NsYXNzIFZhbHVlQXJyYXk0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2NsYXNzIFZhbHVlQXJyYXk1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK2NsYXNzIFZhbHVlQXJyYXk2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2Nikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitjbGFzcyBWYWx1ZUFycmF5NyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2NsYXNzIFZhbHVlQXJyYXk4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgICAgVDggdjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitjbGFzcyBWYWx1ZUFycmF5OSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5OShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCisgICAgICBUOSB2OSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5OSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitjbGFzcyBWYWx1ZUFycmF5MTAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK2NsYXNzIFZhbHVlQXJyYXkxMSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTExJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgorY2xhc3MgVmFsdWVBcnJheTEyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitjbGFzcyBWYWx1ZUFycmF5MTMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitjbGFzcyBWYWx1ZUFycmF5MTQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitjbGFzcyBWYWx1ZUFycmF5MTUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK2NsYXNzIFZhbHVlQXJyYXkxNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK2NsYXNzIFZhbHVlQXJyYXkxNyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCisgICAgICBUMTcgdjE3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KK2NsYXNzIFZhbHVlQXJyYXkxOCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK2NsYXNzIFZhbHVlQXJyYXkxOSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCisgICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK2NsYXNzIFZhbHVlQXJyYXkyMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK2NsYXNzIFZhbHVlQXJyYXkyMSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK2NsYXNzIFZhbHVlQXJyYXkyMiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK2NsYXNzIFZhbHVlQXJyYXkyMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitjbGFzcyBWYWx1ZUFycmF5MjQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1PgorY2xhc3MgVmFsdWVBcnJheTI1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCisgICAgICBUMjUgdjI1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2PgorY2xhc3MgVmFsdWVBcnJheTI2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3PgorY2xhc3MgVmFsdWVBcnJheTI3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCisgICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAorICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKKyAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK2NsYXNzIFZhbHVlQXJyYXkyOCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAorICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitjbGFzcyBWYWx1ZUFycmF5MjkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCisgICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgorY2xhc3MgVmFsdWVBcnJheTMwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK2NsYXNzIFZhbHVlQXJyYXkzMSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitjbGFzcyBWYWx1ZUFycmF5MzIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKKyAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCisgICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgorY2xhc3MgVmFsdWVBcnJheTMzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLAorICAgICAgVDMzIHYzMykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitjbGFzcyBWYWx1ZUFycmF5MzQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK2NsYXNzIFZhbHVlQXJyYXkzNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwKKyAgICAgIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitjbGFzcyBWYWx1ZUFycmF5MzYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLAorICAgICAgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3PgorY2xhc3MgVmFsdWVBcnJheTM3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAorICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKKyAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksCisgICAgICB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLAorICAgICAgdjM2Xyh2MzYpLCB2MzdfKHYzNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+CitjbGFzcyBWYWx1ZUFycmF5MzggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KK2NsYXNzIFZhbHVlQXJyYXkzOSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgorY2xhc3MgVmFsdWVBcnJheTQwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksCisgICAgICB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLAorICAgICAgdjQwXyh2NDApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitjbGFzcyBWYWx1ZUFycmF5NDEgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAorICAgICAgVDQxIHY0MSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAorICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK2NsYXNzIFZhbHVlQXJyYXk0MiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0Mikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgorY2xhc3MgVmFsdWVBcnJheTQzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwKKyAgICAgIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksCisgICAgICB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitjbGFzcyBWYWx1ZUFycmF5NDQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAorICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwKKyAgICAgIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksCisgICAgICB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLAorICAgICAgdjQzXyh2NDMpLCB2NDRfKHY0NCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+CitjbGFzcyBWYWx1ZUFycmF5NDUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAorICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKKyAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksCisgICAgICB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLAorICAgICAgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwKKyAgICAgIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0Nj4KK2NsYXNzIFZhbHVlQXJyYXk0NiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwKKyAgICAgIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLCB2NDZfKHY0Nikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgorY2xhc3MgVmFsdWVBcnJheTQ3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAorICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSwKKyAgICAgIHY0N18odjQ3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4PgorY2xhc3MgVmFsdWVBcnJheTQ4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0OChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgpIDogdjFfKHYxKSwKKyAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCisgICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAorICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKKyAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCisgICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLAorICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwKKyAgICAgIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksCisgICAgICB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0OF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0OCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKKyAgY29uc3QgVDQ4IHY0OF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5PgorY2xhc3MgVmFsdWVBcnJheTQ5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0OShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsCisgICAgICBUNDkgdjQ5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLAorICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4XyksIHN0YXRpY19jYXN0PFQ+KHY0OV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0OSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKKyAgY29uc3QgVDQ4IHY0OF87CisgIGNvbnN0IFQ0OSB2NDlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgorY2xhc3MgVmFsdWVBcnJheTUwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk1MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDksCisgICAgICBUNTAgdjUwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLAorICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSksIHY1MF8odjUwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKSwgc3RhdGljX2Nhc3Q8VD4odjQ5XyksIHN0YXRpY19jYXN0PFQ+KHY1MF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk1MCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87CisgIGNvbnN0IFQ0NiB2NDZfOworICBjb25zdCBUNDcgdjQ3XzsKKyAgY29uc3QgVDQ4IHY0OF87CisgIGNvbnN0IFQ0OSB2NDlfOworICBjb25zdCBUNTAgdjUwXzsKK307CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB2YWx1ZXMgcHJvZHVjZWQKKy8vIGJ5IHRoZSBhcmd1bWVudCBnZW5lcmF0b3JzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDJfOworICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyJiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMygpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MykgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50M187CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1CisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDVfOworICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjU6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LAorICAgICAgICBUNj4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNworICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNz4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNygpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAorICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKKyAgICAgICAgVDcsIFQ4PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCisgICAgICAgICAgZzhfKGc4KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCisgICAgICAgIGc4Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDhfOworICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjg6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKKyAgICAgICAgVDcsIFQ4LCBUOT4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOShjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAorICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQ5XzsKKyAgICAgIGlmIChjdXJyZW50OV8gPT0gZW5kOV8pIHsKKyAgICAgICAgY3VycmVudDlfID0gYmVnaW45XzsKKyAgICAgICAgKytjdXJyZW50OF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7CisgICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87CisgICAgICAgICsrY3VycmVudDdfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKKyAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4XyAmJgorICAgICAgICAgIGN1cnJlbnQ5XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDlfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKKyAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKKyAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAorICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKKyAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKKyAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAorICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKKyAgICAgICAgICAgICpjdXJyZW50OV8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKKyAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+IGc5XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5LCBUMTA+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+JiBnMTApCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSwgZzlfLCBnOV8uYmVnaW4oKSwgZzEwXywgZzEwXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSwgZzEwXywgZzEwXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yJiBjdXJyZW50MTApCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLAorICAgICAgICAgIGJlZ2luOF8oZzguYmVnaW4oKSksIGVuZDhfKGc4LmVuZCgpKSwgY3VycmVudDhfKGN1cnJlbnQ4KSwKKyAgICAgICAgICBiZWdpbjlfKGc5LmJlZ2luKCkpLCBlbmQ5XyhnOS5lbmQoKSksIGN1cnJlbnQ5XyhjdXJyZW50OSksCisgICAgICAgICAgYmVnaW4xMF8oZzEwLmJlZ2luKCkpLCBlbmQxMF8oZzEwLmVuZCgpKSwgY3VycmVudDEwXyhjdXJyZW50MTApICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDEwXzsKKyAgICAgIGlmIChjdXJyZW50MTBfID09IGVuZDEwXykgeworICAgICAgICBjdXJyZW50MTBfID0gYmVnaW4xMF87CisgICAgICAgICsrY3VycmVudDlfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgeworICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOworICAgICAgICArK2N1cnJlbnQ4XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKKyAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKKyAgICAgICAgKytjdXJyZW50N187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7CisgICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187CisgICAgICAgICsrY3VycmVudDZfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKKyAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgorICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCisgICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8gJiYKKyAgICAgICAgICBjdXJyZW50MTBfID09IHR5cGVkX290aGVyLT5jdXJyZW50MTBfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKKyAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKKyAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAorICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKKyAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKKyAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAorICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKKyAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKKyAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAorICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKKyAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKKyAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAorICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKKyAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKKyAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAorICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKKyAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKKyAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAorICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSwKKyAgICAgICAgYmVnaW4xMF8ob3RoZXIuYmVnaW4xMF8pLAorICAgICAgICBlbmQxMF8ob3RoZXIuZW5kMTBfKSwKKyAgICAgICAgY3VycmVudDEwXyhvdGhlci5jdXJyZW50MTBfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAorICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKKyAgICAgICAgICAgICpjdXJyZW50OV8sICpjdXJyZW50MTBfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfIHx8CisgICAgICAgICAgY3VycmVudDlfID09IGVuZDlfIHx8CisgICAgICAgICAgY3VycmVudDEwXyA9PSBlbmQxMF87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBiZWdpbjEwXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBlbmQxMF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3IgY3VycmVudDEwXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+IGcxMF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCisKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cKKy8vIGNhc3RpbmcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvck48VD4gdG8gUGFyYW1HZW5lcmF0b3I8VT4gaWYgVCBpcworLy8gY29udmVydGlibGUgdG8gVS4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMikge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyPFQxLCBUMj4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMiYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMgorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzPFQxLCBUMiwgVDM+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzCisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQ+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ8VDEsIFQyLCBUMywgVDQ+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNAorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI1KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTxUMSwgVDIsIFQzLCBUNCwgVDU+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDY+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjc+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgVDc+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI3JiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKKyAgY29uc3QgR2VuZXJhdG9yNCBnNF87CisgIGNvbnN0IEdlbmVyYXRvcjUgZzVfOworICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKKyAgY29uc3QgR2VuZXJhdG9yNyBnN187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjggeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI4KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCisgICAgICAgICAgZzhfKGc4KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LAorICAgICAgVDg+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI5KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsCisgICAgY29uc3QgR2VuZXJhdG9yOSYgZzkpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICBUOT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgICAgVDk+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDg+ID4oZzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDk+ID4oZzlfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI5JiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKKyAgY29uc3QgR2VuZXJhdG9yNCBnNF87CisgIGNvbnN0IEdlbmVyYXRvcjUgZzVfOworICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKKyAgY29uc3QgR2VuZXJhdG9yNyBnN187CisgIGNvbnN0IEdlbmVyYXRvcjggZzhfOworICBjb25zdCBHZW5lcmF0b3I5IGc5XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOQorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjksIGNsYXNzIEdlbmVyYXRvcjEwPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKKyAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSwgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICBUOSwgVDEwPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAorICAgICAgICBUOSwgVDEwPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksCisgICAgICAgICAgICBUMTA+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMTA+ID4oZzEwXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87CisgIGNvbnN0IEdlbmVyYXRvcjkgZzlfOworICBjb25zdCBHZW5lcmF0b3IxMCBnMTBfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMAorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAorLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCisvLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgorLy8KKy8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKKy8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07CisvLworLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7CisvLyB9CisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKKy8vCisKKy8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCisvLworLy8gU3lub3BzaXM6CisvLyBSYW5nZShzdGFydCwgZW5kKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKKy8vICAgICBzdGFydCsyLCAuLi4sIH0uCisvLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKKy8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KKy8vIE5vdGVzOgorLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCisvLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKKy8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgorLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCisvLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KKy8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgorLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KKy8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKKy8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCisgICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKKyAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOworfQorCisvLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQorLy8gYSBjb250YWluZXIuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhIEMtc3R5bGUgYXJyYXkuCisvLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KKy8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCisvLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCisvLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6CisvLworLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0CisvLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6CisvLworLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKKy8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKKy8vICAgdi5wdXNoX2JhY2soImEiKTsKKy8vICAgdi5wdXNoX2JhY2soImIiKTsKKy8vICAgcmV0dXJuIHY7CisvLyB9CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOworLy8KKy8vCisvLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0CisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKKy8vCisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKKy8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKKy8vICAgcmV0dXJuIGxpc3Q7CisvLyB9CisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOworLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+CisgICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOworICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCisgICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKKyAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOworfQorCisvLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKKy8vIHBhcmFtZXRlcnMuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCisvLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KKy8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKKy8vCisvLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byA1MCBwYXJhbWV0ZXJzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4gVmFsdWVzKFQxIHYxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE8VDE+KHYxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+IFZhbHVlcyhUMSB2MSwgVDIgdjIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+KHYxLCB2Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzPFQxLCBUMiwgVDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4odjEsIHYyLCB2Myk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ8VDEsIFQyLCBUMywgVDQ+KHYxLCB2MiwgdjMsIHY0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NTxUMSwgVDIsIFQzLCBUNCwgVDU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4odjEsIHYyLCB2MywgdjQsIHY1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsCisgICAgICB2NiwgdjcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBWYWx1ZXMoVDEgdjEsCisgICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwKKyAgICBUMTE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAorICAgICAgVDExPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgVDEyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgVDEzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAorICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LAorICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCisgICAgICB2MjAsIHYyMSwgdjIyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4odjEsIHYyLCB2MywKKyAgICAgIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+KHYxLCB2MiwKKyAgICAgIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LAorICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFZhbHVlcyhUMSB2MSwKKyAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsCisgICAgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwKKyAgICBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+KHYxLAorICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywKKyAgICAgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgVDI2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAorICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgVDI3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LAorICAgICAgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICBUMjg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywKKyAgICAgIHYyOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LAorICAgICAgdjI3LCB2MjgsIHYyOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCisgICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCisgICAgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCisgICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwKKyAgICAgIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsCisgICAgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsCisgICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwKKyAgICBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLAorICAgIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsCisgICAgICB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwKKyAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsCisgICAgICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCisgICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2LCB2MzcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcsIFQzOCB2MzgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4odjEsIHYyLAorICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCisgICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwKKyAgICAgIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAorICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsCisgICAgICB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVmFsdWVzKFQxIHYxLAorICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKKyAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAorICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsCisgICAgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwKKyAgICBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwKKyAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LAorICAgICAgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgIFQ0MT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCisgICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwKKyAgICAgIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgIFQ0Mj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAorICAgICAgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsCisgICAgICB2NDIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgVDQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCisgICAgICB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwKKyAgICAgIHY0MSwgdjQyLCB2NDMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0ND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKKyAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAorICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksCisgICAgICB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKKyAgICBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsCisgICAgICB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksCisgICAgICB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LAorICAgICAgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCisgICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LAorICAgIFQ0OCB2NDgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKKyAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LAorICAgICAgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsIHY0OCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAorICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCisgICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwKKyAgICBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LAorICAgIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKKyAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LAorICAgICAgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LAorICAgIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsCisgICAgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSwgVDUwIHY1MCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsCisgICAgICB2NDgsIHY0OSwgdjUwKTsKK30KKworLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgorLy8KKy8vIFN5bm9wc2lzOgorLy8gQm9vbCgpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KKy8vCisvLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucworLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCisvLyBDb21iaW5lKCkgZnVuY3Rpb24uCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0CisvLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKKy8vCitpbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7CisgIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisvLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKKy8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCisvLworLy8gU3lub3BzaXM6CisvLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQorLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5CisvLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgorLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKKy8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCisvLworLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAxMCBhcmd1bWVudHMuIFRoaXMgbnVtYmVyIGlzIGN1cnJlbnRseSBsaW1pdGVkCisvLyBieSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHR1cGxlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgR29vZ2xlCisvLyBUZXN0LgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIHRlc3QgY2FzZSBBbmltYWxUZXN0IGVhY2ggb25lIHdpdGgKKy8vIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHR1cGxlKCJjYXQiLCBCTEFDSyksIHR1cGxlKCJjYXQiLCBXSElURSksCisvLyB0dXBsZSgiZG9nIiwgQkxBQ0spLCBhbmQgdHVwbGUoImRvZyIsIFdISVRFKToKKy8vCisvLyBlbnVtIENvbG9yIHsgQkxBQ0ssIEdSQVksIFdISVRFIH07CisvLyBjbGFzcyBBbmltYWxUZXN0CisvLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxjb25zdCBjaGFyKiwgQ29sb3I+ID4gey4uLn07CisvLworLy8gVEVTVF9QKEFuaW1hbFRlc3QsIEFuaW1hbExvb2tzTmljZSkgey4uLn0KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbmltYWxWYXJpYXRpb25zLCBBbmltYWxUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShWYWx1ZXMoImNhdCIsICJkb2ciKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEJMQUNLLCBXSElURSkpKTsKKy8vCisvLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gRmxhZ0RlcGVuZGVudFRlc3Qgd2l0aCBhbGwgdmFyaWF0aW9ucyBvZiB0d28KKy8vIEJvb2xlYW4gZmxhZ3M6CisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QKKy8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGJvb2wsIGJvb2w+ID4geworLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisvLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7CisvLyAgIH0KKy8vIH07CisvLworLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKKy8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjI+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPigKKyAgICAgIGcxLCBnMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMykgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+KAorICAgICAgZzEsIGcyLCBnMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQ+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQ+KAorICAgICAgZzEsIGcyLCBnMywgZzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNz4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwKKyAgICBHZW5lcmF0b3I5PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjEwPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCisgICAgR2VuZXJhdG9yMTA+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKKyAgICAgIEdlbmVyYXRvcjEwPigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisKKworIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKKyAgIHB1YmxpYzogXAorICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgIHByaXZhdGU6IFwKKyAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdFBhdHRlcm4oXAorICAgICAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4oKSk7IFwKKyAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgc3RhdGljIGludCBndGVzdF9yZWdpc3RlcmluZ19kdW1teV87IFwKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKKyAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwKKyAgfTsgXAorICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpBZGRUb1JlZ2lzdHJ5KCk7IFwKKyAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvcikgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCisgICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCisgIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gPSBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCisgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKKyAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGRlZmluaXRpb25zIHVzZWZ1bCBpbiBwcm9kdWN0aW9uIGNvZGUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworCisvLyBXaGVuIHlvdSBuZWVkIHRvIHRlc3QgdGhlIHByaXZhdGUgb3IgcHJvdGVjdGVkIG1lbWJlcnMgb2YgYSBjbGFzcywKKy8vIHVzZSB0aGUgRlJJRU5EX1RFU1QgbWFjcm8gdG8gZGVjbGFyZSB5b3VyIHRlc3RzIGFzIGZyaWVuZHMgb2YgdGhlCisvLyBjbGFzcy4gIEZvciBleGFtcGxlOgorLy8KKy8vIGNsYXNzIE15Q2xhc3MgeworLy8gIHByaXZhdGU6CisvLyAgIHZvaWQgTXlNZXRob2QoKTsKKy8vICAgRlJJRU5EX1RFU1QoTXlDbGFzc1Rlc3QsIE15TWV0aG9kKTsKKy8vIH07CisvLworLy8gY2xhc3MgTXlDbGFzc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisvLyAgIC8vIC4uLgorLy8gfTsKKy8vCisvLyBURVNUX0YoTXlDbGFzc1Rlc3QsIE15TWV0aG9kKSB7CisvLyAgIC8vIENhbiBjYWxsIE15Q2xhc3M6Ok15TWV0aG9kKCkgaGVyZS4KKy8vIH0KKworI2RlZmluZSBGUklFTkRfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKK2ZyaWVuZCBjbGFzcyB0ZXN0X2Nhc2VfbmFtZSMjXyMjdGVzdF9uYW1lIyNfVGVzdAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4KKy8vIGFzc2VydGlvbiBvciBhbiBleHBsaWNpdCBGQUlMKCksIEFERF9GQUlMVVJFKCksIG9yIFNVQ0NFU1MoKSkuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdCB7CisgcHVibGljOgorICAvLyBUaGUgcG9zc2libGUgb3V0Y29tZXMgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4gYXNzZXJ0aW9uIG9yIGFuCisgIC8vIGV4cGxpY2l0IFNVQ0NFRUQoKSwgRkFJTCgpLCBvciBBRERfRkFJTFVSRSgpKS4KKyAgZW51bSBUeXBlIHsKKyAgICBrU3VjY2VzcywgICAgICAgICAgLy8gU3VjY2VlZGVkLgorICAgIGtOb25GYXRhbEZhaWx1cmUsICAvLyBGYWlsZWQgYnV0IHRoZSB0ZXN0IGNhbiBjb250aW51ZS4KKyAgICBrRmF0YWxGYWlsdXJlICAgICAgLy8gRmFpbGVkIGFuZCB0aGUgdGVzdCBzaG91bGQgYmUgdGVybWluYXRlZC4KKyAgfTsKKworICAvLyBDJ3Rvci4gIFRlc3RQYXJ0UmVzdWx0IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKKyAgLy8gVGVzdFBhcnRSZXN1bHQgb2JqZWN0LgorICBUZXN0UGFydFJlc3VsdChUeXBlIGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgIGludCBhX2xpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX21lc3NhZ2UpCisgICAgICA6IHR5cGVfKGFfdHlwZSksCisgICAgICAgIGZpbGVfbmFtZV8oYV9maWxlX25hbWUgPT0gTlVMTCA/ICIiIDogYV9maWxlX25hbWUpLAorICAgICAgICBsaW5lX251bWJlcl8oYV9saW5lX251bWJlciksCisgICAgICAgIHN1bW1hcnlfKEV4dHJhY3RTdW1tYXJ5KGFfbWVzc2FnZSkpLAorICAgICAgICBtZXNzYWdlXyhhX21lc3NhZ2UpIHsKKyAgfQorCisgIC8vIEdldHMgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgcGFydC4KKyAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgaXQncyB1bmtub3duLgorICBjb25zdCBjaGFyKiBmaWxlX25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbGVfbmFtZV8uZW1wdHkoKSA/IE5VTEwgOiBmaWxlX25hbWVfLmNfc3RyKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsCisgIC8vIG9yIC0xIGlmIGl0J3MgdW5rbm93bi4KKyAgaW50IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbGluZV9udW1iZXJfOyB9CisKKyAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorICBjb25zdCBjaGFyKiBzdW1tYXJ5KCkgY29uc3QgeyByZXR1cm4gc3VtbWFyeV8uY19zdHIoKTsgfQorCisgIC8vIEdldHMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IHBhcnQuCisgIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IHBhc3NlZC4KKyAgYm9vbCBwYXNzZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrU3VjY2VzczsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYWlsZWQuCisgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gIT0ga1N1Y2Nlc3M7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorICBib29sIG5vbmZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga05vbkZhdGFsRmFpbHVyZTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBmYXRhbGx5X2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtGYXRhbEZhaWx1cmU7IH0KKworIHByaXZhdGU6CisgIFR5cGUgdHlwZV87CisKKyAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlIGJ5IG9taXR0aW5nIHRoZSBzdGFjaworICAvLyB0cmFjZSBpbiBpdC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vICIiIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyB1bmtub3duLgorICBzdGQ6OnN0cmluZyBmaWxlX25hbWVfOworICAvLyBUaGUgbGluZSBpbiB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIHRlc3QgcGFydCB0b29rIHBsYWNlLCBvciAtMQorICAvLyBpZiB0aGUgbGluZSBudW1iZXIgaXMgdW5rbm93bi4KKyAgaW50IGxpbmVfbnVtYmVyXzsKKyAgc3RkOjpzdHJpbmcgc3VtbWFyeV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIHN1bW1hcnkuCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOyAgLy8gVGhlIHRlc3QgZmFpbHVyZSBtZXNzYWdlLgorfTsKKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisvLyBBbiBhcnJheSBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzLgorLy8KKy8vIERvbid0IGluaGVyaXQgZnJvbSBUZXN0UGFydFJlc3VsdEFycmF5IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdAorLy8gdmlydHVhbC4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdFBhcnRSZXN1bHRBcnJheSB7CisgcHVibGljOgorICBUZXN0UGFydFJlc3VsdEFycmF5KCkge30KKworICAvLyBBcHBlbmRzIHRoZSBnaXZlbiBUZXN0UGFydFJlc3VsdCB0byB0aGUgYXJyYXkuCisgIHZvaWQgQXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RQYXJ0UmVzdWx0IGF0IHRoZSBnaXZlbiBpbmRleCAoMC1iYXNlZCkuCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzIGluIHRoZSBhcnJheS4KKyAgaW50IHNpemUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiBhcnJheV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0UGFydFJlc3VsdEFycmF5KTsKK307CisKKy8vIFRoaXMgaW50ZXJmYWNlIGtub3dzIGhvdyB0byByZXBvcnQgYSB0ZXN0IHBhcnQgcmVzdWx0LgorY2xhc3MgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKCkge30KKworICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgPSAwOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgdXNlZCBieSB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRSB0byBjaGVjayBpZiBhCisvLyBzdGF0ZW1lbnQgZ2VuZXJhdGVzIG5ldyBmYXRhbCBmYWlsdXJlcy4gVG8gZG8gc28gaXQgcmVnaXN0ZXJzIGl0c2VsZiBhcyB0aGUKKy8vIGN1cnJlbnQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4gQmVzaWRlcyBjaGVja2luZyBpZiBmYXRhbCBmYWlsdXJlcyB3ZXJlCisvLyByZXBvcnRlZCwgaXQgb25seSBkZWxlZ2F0ZXMgdGhlIHJlcG9ydGluZyB0byB0aGUgZm9ybWVyIHJlc3VsdCByZXBvcnRlci4KKy8vIFRoZSBvcmlnaW5hbCByZXN1bHQgcmVwb3J0ZXIgaXMgcmVzdG9yZWQgaW4gdGhlIGRlc3RydWN0b3IuCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitjbGFzcyBHVEVTVF9BUElfIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcgorICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7CisgIHZpcnR1YWwgfkhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpOworICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIGJvb2wgaGFzX25ld19mYXRhbF9mYWlsdXJlKCkgY29uc3QgeyByZXR1cm4gaGFzX25ld19mYXRhbF9mYWlsdXJlXzsgfQorIHByaXZhdGU6CisgIGJvb2wgaGFzX25ld19mYXRhbF9mYWlsdXJlXzsKKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogb3JpZ2luYWxfcmVwb3J0ZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIHR5cGVkIHRlc3RzIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKy8vIFR5cGVkIChha2EgdHlwZS1kcml2ZW4pIHRlc3RzIHJlcGVhdCB0aGUgc2FtZSB0ZXN0IGZvciB0eXBlcyBpbiBhCisvLyBsaXN0LiAgWW91IG11c3Qga25vdyB3aGljaCB0eXBlcyB5b3Ugd2FudCB0byB0ZXN0IHdpdGggd2hlbiB3cml0aW5nCisvLyB0eXBlZCB0ZXN0cy4gSGVyZSdzIGhvdyB5b3UgZG8gaXQ6CisKKyNpZiAwCisKKy8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICAuLi4KKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8VD4gTGlzdDsKKyAgc3RhdGljIFQgc2hhcmVkXzsKKyAgVCB2YWx1ZV87Cit9OworCisvLyBOZXh0LCBhc3NvY2lhdGUgYSBsaXN0IG9mIHR5cGVzIHdpdGggdGhlIHRlc3QgY2FzZSwgd2hpY2ggd2lsbCBiZQorLy8gcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBpbiB0aGUgbGlzdC4gIFRoZSB0eXBlZGVmIGlzIG5lY2Vzc2FyeSBmb3IKKy8vIHRoZSBtYWNybyB0byBwYXJzZSBjb3JyZWN0bHkuCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOworVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIE15VHlwZXMpOworCisvLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlCisvLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46CisvLyAgIFRZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBpbnQpOworCisvLyBUaGVuLCB1c2UgVFlQRURfVEVTVCgpIGluc3RlYWQgb2YgVEVTVF9GKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZWQKKy8vIHRlc3RzIGZvciB0aGlzIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1QoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIC8vIFNpbmNlIHdlIGFyZSBpbnNpZGUgYSBkZXJpdmVkIGNsYXNzIHRlbXBsYXRlLCBDKysgcmVxdWlyZXMgdXNlIHRvCisgIC8vIHZpc2l0IHRoZSBtZW1iZXJzIG9mIEZvb1Rlc3QgdmlhICd0aGlzJy4KKyAgVHlwZVBhcmFtIG4gPSB0aGlzLT52YWx1ZV87CisKKyAgLy8gVG8gdmlzaXQgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUsIGFkZCB0aGUgVGVzdEZpeHR1cmU6OgorICAvLyBwcmVmaXguCisgIG4gKz0gVGVzdEZpeHR1cmU6OnNoYXJlZF87CisKKyAgLy8gVG8gcmVmZXIgdG8gdHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUsIGFkZCB0aGUgInR5cGVuYW1lCisgIC8vIFRlc3RGaXh0dXJlOjoiIHByZWZpeC4KKyAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6Okxpc3QgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKG4pOworICAuLi4KK30KKworVFlQRURfVEVTVChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KKworI2VuZGlmICAvLyAwCisKKy8vIFR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgYWJzdHJhY3QgdGVzdCBwYXR0ZXJucyBwYXJhbWV0ZXJpemVkCisvLyBieSBhIHR5cGUuICBDb21wYXJlZCB3aXRoIHR5cGVkIHRlc3RzLCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGFsbG93IHlvdSB0byBkZWZpbmUgdGhlIHRlc3QgcGF0dGVybiB3aXRob3V0IGtub3dpbmcgd2hhdCB0aGUgdHlwZQorLy8gcGFyYW1ldGVycyBhcmUuICBUaGUgZGVmaW5lZCBwYXR0ZXJuIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gZGlmZmVyZW50IHR5cGVzIGFueSBudW1iZXIgb2YgdGltZXMsIGluIGFueSBudW1iZXIgb2YgdHJhbnNsYXRpb24KKy8vIHVuaXRzLgorLy8KKy8vIElmIHlvdSBhcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSBvciBjb25jZXB0LCB5b3UgY2FuIGRlZmluZSBhCisvLyBzdWl0ZSBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgdG8gdmVyaWZ5IHByb3BlcnRpZXMgdGhhdCBhbnkKKy8vIHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UvY29uY2VwdCBzaG91bGQgaGF2ZS4gIFRoZW4sCisvLyBlYWNoIGltcGxlbWVudGF0aW9uIGNhbiBlYXNpbHkgaW5zdGFudGlhdGUgdGhlIHRlc3Qgc3VpdGUgdG8gdmVyaWZ5CisvLyB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSByZXF1aXJlbWVudHMsIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlCisvLyBzaW1pbGFyIHRlc3RzIHJlcGVhdGVkbHkuICBIZXJlJ3MgYW4gZXhhbXBsZToKKworI2lmIDAKKworLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAorLy8gYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gdGVzdGluZzo6VGVzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyAgLi4uCit9OworCisvLyBOZXh0LCBkZWNsYXJlIHRoYXQgeW91IHdpbGwgZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZQorLy8gKHRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UKKy8vIHByZWZlcik6CitUWVBFRF9URVNUX0NBU0VfUChGb29UZXN0KTsKKworLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1RfUCgpIHRvIGRlZmluZSBhcyBtYW55IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gZm9yIHRoaXMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBhcyB5b3Ugd2FudC4KK1RZUEVEX1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgVHlwZVBhcmFtIG4gPSAwOworICAuLi4KK30KKworVFlQRURfVEVTVF9QKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorCisvLyBOb3cgdGhlIHRyaWNreSBwYXJ0OiB5b3UgbmVlZCB0byByZWdpc3RlciBhbGwgdGVzdCBwYXR0ZXJucyBiZWZvcmUKKy8vIHlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbS4gIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgbWFjcm8gaXMgdGhlCisvLyB0ZXN0IGNhc2UgbmFtZTsgdGhlIHJlc3QgYXJlIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0CisvLyBjYXNlLgorUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvZXNCbGFoLCBIYXNQcm9wZXJ0eUEpOworCisvLyBGaW5hbGx5LCB5b3UgYXJlIGZyZWUgdG8gaW5zdGFudGlhdGUgdGhlIHBhdHRlcm4gd2l0aCB0aGUgdHlwZXMgeW91CisvLyB3YW50LiAgSWYgeW91IHB1dCB0aGUgYWJvdmUgY29kZSBpbiBhIGhlYWRlciBmaWxlLCB5b3UgY2FuICNpbmNsdWRlCisvLyBpdCBpbiBtdWx0aXBsZSBDKysgc291cmNlIGZpbGVzIGFuZCBpbnN0YW50aWF0ZSBpdCBtdWx0aXBsZSB0aW1lcy4KKy8vCisvLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCB0aGUgZmlyc3QKKy8vIGFyZ3VtZW50IHRvIHRoZSBJTlNUQU5USUFURV8qIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZAorLy8gdG8gdGhlIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvcgorLy8gZGlmZmVyZW50IGluc3RhbmNlcy4KK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgTXlUeXBlcyk7CisKKy8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUKKy8vIGRpcmVjdGx5IHdpdGhvdXQgVHlwZXM8Li4uPjoKKy8vICAgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIGludCk7CisKKyNlbmRpZiAgLy8gMAorCisKKy8vIEltcGxlbWVudHMgdHlwZWQgdGVzdHMuCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlCisvLyBnaXZlbiB0ZXN0IGNhc2UuCisjIGRlZmluZSBHVEVTVF9UWVBFX1BBUkFNU18oVGVzdENhc2VOYW1lKSBndGVzdF90eXBlX3BhcmFtc18jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBUaGUgJ1R5cGVzJyB0ZW1wbGF0ZSBhcmd1bWVudCBiZWxvdyBtdXN0IGhhdmUgc3BhY2VzIGFyb3VuZCBpdAorLy8gc2luY2Ugc29tZSBjb21waWxlcnMgbWF5IGNob2tlIG9uICc+Picgd2hlbiBwYXNzaW5nIGEgdGVtcGxhdGUKKy8vIGluc3RhbmNlIChlLmcuIFR5cGVzPGludD4pCisjIGRlZmluZSBUWVBFRF9URVNUX0NBU0UoQ2FzZU5hbWUsIFR5cGVzKSBcCisgIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZUxpc3Q8IFR5cGVzID46OnR5cGUgXAorICAgICAgR1RFU1RfVFlQRV9QQVJBTVNfKENhc2VOYW1lKQorCisjIGRlZmluZSBUWVBFRF9URVNUKENhc2VOYW1lLCBUZXN0TmFtZSkgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICBjbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSkgXAorICAgICAgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCisgICBwcml2YXRlOiBcCisgICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAorICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKKyAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAorICB9OyBcCisgIGJvb2wgZ3Rlc3RfIyNDYXNlTmFtZSMjXyMjVGVzdE5hbWUjI19yZWdpc3RlcmVkXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVQYXJhbWV0ZXJpemVkVGVzdDwgXAorICAgICAgICAgIENhc2VOYW1lLCBcCisgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVtcGxhdGVTZWw8IFwKKyAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpPiwgXAorICAgICAgICAgIEdURVNUX1RZUEVfUEFSQU1TXyhDYXNlTmFtZSk+OjpSZWdpc3RlcihcCisgICAgICAgICAgICAgICIiLCAjQ2FzZU5hbWUsICNUZXN0TmFtZSwgMCk7IFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk8Z3Rlc3RfVHlwZVBhcmFtXz46OlRlc3RCb2R5KCkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBJbXBsZW1lbnRzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lc3BhY2UgbmFtZSB0aGF0IHRoZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgZm9yCisvLyB0aGUgZ2l2ZW4gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBhcmUgZGVmaW5lZCBpbi4gIFRoZSBleGFjdAorLy8gbmFtZSBvZiB0aGUgbmFtZXNwYWNlIGlzIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorIyBkZWZpbmUgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKFRlc3RDYXNlTmFtZSkgXAorICBndGVzdF9jYXNlXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdXNlZCB0byByZW1lbWJlciB0aGUgbmFtZXMgb2YKKy8vIHRoZSBkZWZpbmVkIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCisjIGRlZmluZSBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oVGVzdENhc2VOYW1lKSBcCisgIGd0ZXN0X3R5cGVkX3Rlc3RfY2FzZV9wX3N0YXRlXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUgRElSRUNUTFkuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdXNlZCB0byByZW1lbWJlciB0aGUgbmFtZXMgb2YKKy8vIHRoZSByZWdpc3RlcmVkIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCisjIGRlZmluZSBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKFRlc3RDYXNlTmFtZSkgXAorICBndGVzdF9yZWdpc3RlcmVkX3Rlc3RfbmFtZXNfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gVGhlIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBtYWNyb3MgYXJlCisvLyBzdGF0aWMgYXMgdHlwaWNhbGx5IHRoZXNlIG1hY3JvcyBhcmUgdXNlZCBpbiBhIC5oIGZpbGUgdGhhdCBjYW4gYmUKKy8vICNpbmNsdWRlZCBpbiBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCisjIGRlZmluZSBUWVBFRF9URVNUX0NBU0VfUChDYXNlTmFtZSkgXAorICBzdGF0aWMgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZWRUZXN0Q2FzZVBTdGF0ZSBcCisgICAgICBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpCisKKyMgZGVmaW5lIFRZUEVEX1RFU1RfUChDYXNlTmFtZSwgVGVzdE5hbWUpIFwKKyAgbmFtZXNwYWNlIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSkgeyBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIGNsYXNzIFRlc3ROYW1lIDogcHVibGljIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IHsgXAorICAgcHJpdmF0ZTogXAorICAgIHR5cGVkZWYgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4gVGVzdEZpeHR1cmU7IFwKKyAgICB0eXBlZGVmIGd0ZXN0X1R5cGVQYXJhbV8gVHlwZVBhcmFtOyBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgfTsgXAorICBzdGF0aWMgYm9vbCBndGVzdF8jI1Rlc3ROYW1lIyNfZGVmaW5lZF8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCisgICAgICBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpLkFkZFRlc3ROYW1lKFwKKyAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNDYXNlTmFtZSwgI1Rlc3ROYW1lKTsgXAorICB9IFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgdm9pZCBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpOjpUZXN0TmFtZTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQorCisjIGRlZmluZSBSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChDYXNlTmFtZSwgLi4uKSBcCisgIG5hbWVzcGFjZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpIHsgXAorICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlbXBsYXRlczxfX1ZBX0FSR1NfXz46OnR5cGUgZ3Rlc3RfQWxsVGVzdHNfOyBcCisgIH0gXAorICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkgPSBcCisgICAgICBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI19fVkFfQVJHU19fKQorCisvLyBUaGUgJ1R5cGVzJyB0ZW1wbGF0ZSBhcmd1bWVudCBiZWxvdyBtdXN0IGhhdmUgc3BhY2VzIGFyb3VuZCBpdAorLy8gc2luY2Ugc29tZSBjb21waWxlcnMgbWF5IGNob2tlIG9uICc+Picgd2hlbiBwYXNzaW5nIGEgdGVtcGxhdGUKKy8vIGluc3RhbmNlIChlLmcuIFR5cGVzPGludD4pCisjIGRlZmluZSBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIENhc2VOYW1lLCBUeXBlcykgXAorICBib29sIGd0ZXN0XyMjUHJlZml4IyNfIyNDYXNlTmFtZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Q2FzZU5hbWUsIFwKKyAgICAgICAgICBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpOjpndGVzdF9BbGxUZXN0c18sIFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZT46OlJlZ2lzdGVyKFwKKyAgICAgICAgICAgICAgI1ByZWZpeCwgI0Nhc2VOYW1lLCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCisKKy8vIERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0sIGRpZmZlcmVudCBzdHJpbmcgY2xhc3NlcyBhcmUgYXZhaWxhYmxlLgorLy8gT24gTGludXgsIGluIGFkZGl0aW9uIHRvIDo6c3RkOjpzdHJpbmcsIEdvb2dsZSBhbHNvIG1ha2VzIHVzZSBvZgorLy8gY2xhc3MgOjpzdHJpbmcsIHdoaWNoIGhhcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgOjpzdGQ6OnN0cmluZywgYnV0CisvLyBoYXMgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCisvLworLy8gVGhlIHVzZXIgY2FuIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyB0byAxIHRvIGluZGljYXRlIHRoYXQKKy8vIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSBBTkQgaXMgYSBkaXN0aW5jdCB0eXBlIHRvIDo6c3RkOjpzdHJpbmcsIG9yCisvLyBkZWZpbmUgaXQgdG8gMCB0byBpbmRpY2F0ZSBvdGhlcndpc2UuCisvLworLy8gSWYgdGhlIHVzZXIncyA6OnN0ZDo6c3RyaW5nIGFuZCA6OnN0cmluZyBhcmUgdGhlIHNhbWUgY2xhc3MgZHVlIHRvCisvLyBhbGlhc2luZywgaGUgc2hvdWxkIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyB0byAwLgorLy8KKy8vIElmIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HLCBpdCBpcyBkZWZpbmVkCisvLyBoZXVyaXN0aWNhbGx5LgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlY2xhcmVzIHRoZSBmbGFncy4KKworLy8gVGhpcyBmbGFnIHRlbXBvcmFyeSBlbmFibGVzIHRoZSBkaXNhYmxlZCB0ZXN0cy4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOworCisvLyBUaGlzIGZsYWcgYnJpbmdzIHRoZSBkZWJ1Z2dlciBvbiBhbiBhc3NlcnRpb24gZmFpbHVyZS4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oYnJlYWtfb25fZmFpbHVyZSk7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhdGNoZXMgYWxsIHRlc3QtdGhyb3duIGV4Y2VwdGlvbnMKKy8vIGFuZCBsb2dzIHRoZW0gYXMgZmFpbHVyZXMuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGNhdGNoX2V4Y2VwdGlvbnMpOworCisvLyBUaGlzIGZsYWcgZW5hYmxlcyB1c2luZyBjb2xvcnMgaW4gdGVybWluYWwgb3V0cHV0LiBBdmFpbGFibGUgdmFsdWVzIGFyZQorLy8gInllcyIgdG8gZW5hYmxlIGNvbG9ycywgIm5vIiAoZGlzYWJsZSBjb2xvcnMpLCBvciAiYXV0byIgKHRoZSBkZWZhdWx0KQorLy8gdG8gbGV0IEdvb2dsZSBUZXN0IGRlY2lkZS4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhjb2xvcik7CisKKy8vIFRoaXMgZmxhZyBzZXRzIHVwIHRoZSBmaWx0ZXIgdG8gc2VsZWN0IGJ5IG5hbWUgdXNpbmcgYSBnbG9iIHBhdHRlcm4KKy8vIHRoZSB0ZXN0cyB0byBydW4uIElmIHRoZSBmaWx0ZXIgaXMgbm90IGdpdmVuIGFsbCB0ZXN0cyBhcmUgZXhlY3V0ZWQuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oZmlsdGVyKTsKKworLy8gVGhpcyBmbGFnIGNhdXNlcyB0aGUgR29vZ2xlIFRlc3QgdG8gbGlzdCB0ZXN0cy4gTm9uZSBvZiB0aGUgdGVzdHMgbGlzdGVkCisvLyBhcmUgYWN0dWFsbHkgcnVuIGlmIHRoZSBmbGFnIGlzIHByb3ZpZGVkLgorR1RFU1RfREVDTEFSRV9ib29sXyhsaXN0X3Rlc3RzKTsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgZW1pdHMgYSBkZXRhaWxlZCBYTUwgcmVwb3J0IHRvIGEgZmlsZQorLy8gaW4gYWRkaXRpb24gdG8gaXRzIG5vcm1hbCB0ZXh0dWFsIG91dHB1dC4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhvdXRwdXQpOworCisvLyBUaGlzIGZsYWdzIGNvbnRyb2wgd2hldGhlciBHb29nbGUgVGVzdCBwcmludHMgdGhlIGVsYXBzZWQgdGltZSBmb3IgZWFjaAorLy8gdGVzdC4KK0dURVNUX0RFQ0xBUkVfYm9vbF8ocHJpbnRfdGltZSk7CisKKy8vIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIHJhbmRvbSBudW1iZXIgc2VlZC4KK0dURVNUX0RFQ0xBUkVfaW50MzJfKHJhbmRvbV9zZWVkKTsKKworLy8gVGhpcyBmbGFnIHNldHMgaG93IG1hbnkgdGltZXMgdGhlIHRlc3RzIGFyZSByZXBlYXRlZC4gVGhlIGRlZmF1bHQgdmFsdWUKKy8vIGlzIDEuIElmIHRoZSB2YWx1ZSBpcyAtMSB0aGUgdGVzdHMgYXJlIHJlcGVhdGluZyBmb3JldmVyLgorR1RFU1RfREVDTEFSRV9pbnQzMl8ocmVwZWF0KTsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgaW5jbHVkZXMgR29vZ2xlIFRlc3QgaW50ZXJuYWwKKy8vIHN0YWNrIGZyYW1lcyBpbiBmYWlsdXJlIHN0YWNrIHRyYWNlcy4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMpOworCisvLyBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRlc3RzJyBvcmRlciBpcyByYW5kb21pemVkIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oc2h1ZmZsZSk7CisKKy8vIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZQorLy8gcHJpbnRlZCBpbiBhIGZhaWx1cmUgbWVzc2FnZS4KK0dURVNUX0RFQ0xBUkVfaW50MzJfKHN0YWNrX3RyYWNlX2RlcHRoKTsKKworLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbgorLy8gZXhjZXB0aW9uIGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhCisvLyBub24temVybyBjb2RlIG90aGVyd2lzZS4KK0dURVNUX0RFQ0xBUkVfYm9vbF8odGhyb3dfb25fZmFpbHVyZSk7CisKKy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB3aXRoIGEgImhvc3Q6cG9ydCIgc3RyaW5nLCBvbiBzdXBwb3J0ZWQKKy8vIHBsYXRmb3JtcyB0ZXN0IHJlc3VsdHMgYXJlIHN0cmVhbWVkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBvbgorLy8gdGhlIHNwZWNpZmllZCBob3N0IG1hY2hpbmUuCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oc3RyZWFtX3Jlc3VsdF90byk7CisKKy8vIFRoZSB1cHBlciBsaW1pdCBmb3IgdmFsaWQgc3RhY2sgdHJhY2UgZGVwdGhzLgorY29uc3QgaW50IGtNYXhTdGFja1RyYWNlRGVwdGggPSAxMDA7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIEFzc2VydEhlbHBlcjsKK2NsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworY2xhc3MgRXhlY0RlYXRoVGVzdDsKK2NsYXNzIE5vRXhlY0RlYXRoVGVzdDsKK2NsYXNzIEZpbmFsU3VjY2Vzc0NoZWNrZXI7CitjbGFzcyBHVGVzdEZsYWdTYXZlcjsKK2NsYXNzIFRlc3RSZXN1bHRBY2Nlc3NvcjsKK2NsYXNzIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOworY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXI7CitjbGFzcyBXaW5kb3dzRGVhdGhUZXN0OworY2xhc3MgVW5pdFRlc3RJbXBsKiBHZXRVbml0VGVzdEltcGwoKTsKK3ZvaWQgUmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYW4gc3RkOjpzdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisvLyBEZWNsYXJlZCBpbiBndGVzdC1pbnRlcm5hbC5oIGJ1dCBkZWZpbmVkIGhlcmUsIHNvIHRoYXQgaXQgaGFzIGFjY2VzcworLy8gdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIE1lc3NhZ2UgY2xhc3MsIHJlcXVpcmVkIGJ5IHRoZSBBUk0KKy8vIGNvbXBpbGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSkgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCBzdHJlYW1hYmxlKS5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBmcmllbmQgcmVsYXRpb25zaGlwIG9mIHNvbWUgb2YgdGhlc2UgY2xhc3NlcyBpcyBjeWNsaWMuCisvLyBJZiB3ZSBkb24ndCBmb3J3YXJkIGRlY2xhcmUgdGhlbSB0aGUgY29tcGlsZXIgbWlnaHQgY29uZnVzZSB0aGUgY2xhc3NlcworLy8gaW4gZnJpZW5kc2hpcCBjbGF1c2VzIHdpdGggc2FtZSBuYW1lZCBjbGFzc2VzIG9uIHRoZSBzY29wZS4KK2NsYXNzIFRlc3Q7CitjbGFzcyBUZXN0Q2FzZTsKK2NsYXNzIFRlc3RJbmZvOworY2xhc3MgVW5pdFRlc3Q7CisKKy8vIEEgY2xhc3MgZm9yIGluZGljYXRpbmcgd2hldGhlciBhbiBhc3NlcnRpb24gd2FzIHN1Y2Nlc3NmdWwuICBXaGVuCisvLyB0aGUgYXNzZXJ0aW9uIHdhc24ndCBzdWNjZXNzZnVsLCB0aGUgQXNzZXJ0aW9uUmVzdWx0IG9iamVjdAorLy8gcmVtZW1iZXJzIGEgbm9uLWVtcHR5IG1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgaG93IGl0IGZhaWxlZC4KKy8vCisvLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdXNlIG9uZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbnMKKy8vIChBc3NlcnRpb25TdWNjZXNzKCkgYW5kIEFzc2VydGlvbkZhaWx1cmUoKSkuCisvLworLy8gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIHR3byBwdXJwb3NlczoKKy8vICAgMS4gRGVmaW5pbmcgcHJlZGljYXRlIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHdpdGggQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMKKy8vICAgICAgRVhQRUNUX1RSVUUvRVhQRUNUX0ZBTFNFIGFuZCB0aGVpciBBU1NFUlRfIGNvdW50ZXJwYXJ0cworLy8gICAyLiBEZWZpbmluZyBwcmVkaWNhdGUtZm9ybWF0IGZ1bmN0aW9ucyB0byBiZQorLy8gICAgICB1c2VkIHdpdGggcHJlZGljYXRlIGFzc2VydGlvbnMgKEFTU0VSVF9QUkVEX0ZPUk1BVCosIGV0YykuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUgSXNFdmVuIHByZWRpY2F0ZToKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKy8vICAgICBlbHNlCisvLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworLy8gICB9CisvLworLy8gVGhlbiB0aGUgZmFpbGVkIGV4cGVjdGF0aW9uIEVYUEVDVF9UUlVFKElzRXZlbihGaWIoNSkpKQorLy8gd2lsbCBwcmludCB0aGUgbWVzc2FnZQorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCisvLyAgICAgQWN0dWFsOiBmYWxzZSAoNSBpcyBvZGQpCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW5zdGVhZCBvZiBhIG1vcmUgb3BhcXVlCisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkKKy8vICAgICBBY3R1YWw6IGZhbHNlCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW4gY2FzZSBJc0V2ZW4gaXMgYSBzaW1wbGUgQm9vbGVhbiBwcmVkaWNhdGUuCisvLworLy8gSWYgeW91IGV4cGVjdCB5b3VyIHByZWRpY2F0ZSB0byBiZSByZXVzZWQgYW5kIHdhbnQgdG8gc3VwcG9ydCBpbmZvcm1hdGl2ZQorLy8gbWVzc2FnZXMgaW4gRVhQRUNUX0ZBTFNFIGFuZCBBU1NFUlRfRkFMU0UgKG5lZ2F0aXZlIGFzc2VydGlvbnMgc2hvdyB1cAorLy8gYWJvdXQgaGFsZiBhcyBvZnRlbiBhcyBwb3NpdGl2ZSBvbmVzIGluIG91ciB0ZXN0cyksIHN1cHBseSBtZXNzYWdlcyBmb3IKKy8vIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBjYXNlczoKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKSA8PCBuIDw8ICIgaXMgZXZlbiI7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKKy8vICAgfQorLy8KKy8vIFRoZW4gYSBzdGF0ZW1lbnQgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKSB3aWxsIHByaW50CisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig2KSkKKy8vICAgICBBY3R1YWw6IHRydWUgKDggaXMgZXZlbikKKy8vICAgRXhwZWN0ZWQ6IGZhbHNlCisvLworLy8gTkI6IFByZWRpY2F0ZXMgdGhhdCBzdXBwb3J0IG5lZ2F0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucyBoYXZlIHJlZHVjZWQKKy8vIHBlcmZvcm1hbmNlIGluIHBvc2l0aXZlIG9uZXMgc28gYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRoZW0gaW4gdGVzdHMKKy8vIHRoYXQgaGF2ZSBsb3RzICh0ZW5zIG9mIHRob3VzYW5kcykgb2YgcG9zaXRpdmUgQm9vbGVhbiBhc3NlcnRpb25zLgorLy8KKy8vIFRvIHVzZSB0aGlzIGNsYXNzIHdpdGggRVhQRUNUX1BSRURfRk9STUFUIGFzc2VydGlvbnMgc3VjaCBhczoKKy8vCisvLyAgIC8vIFZlcmlmaWVzIHRoYXQgRm9vKCkgcmV0dXJucyBhbiBldmVuIG51bWJlci4KKy8vICAgRVhQRUNUX1BSRURfRk9STUFUMShJc0V2ZW4sIEZvbygpKTsKKy8vCisvLyB5b3UgbmVlZCB0byBkZWZpbmU6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGNvbnN0IGNoYXIqIGV4cHIsIGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorLy8gICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiIGlzIGV2ZW5cbiAgQWN0dWFsOiBpdCdzICIgPDwgbjsKKy8vICAgfQorLy8KKy8vIElmIEZvbygpIHJldHVybnMgNSwgeW91IHdpbGwgc2VlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKKy8vCisvLyAgIEV4cGVjdGVkOiBGb28oKSBpcyBldmVuCisvLyAgICAgQWN0dWFsOiBpdCdzIDUKKy8vCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCB7CisgcHVibGljOgorICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICAvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorICBBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcik7CisgIC8vIFVzZWQgaW4gdGhlIEVYUEVDVF9UUlVFL0ZBTFNFKGJvb2xfZXhwcmVzc2lvbikuCisgIGV4cGxpY2l0IEFzc2VydGlvblJlc3VsdChib29sIHN1Y2Nlc3MpIDogc3VjY2Vzc18oc3VjY2Vzcykge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gc3VjY2VlZGVkLgorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc187IH0gIC8vIE5PTElOVAorCisgIC8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yISgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHRleHQgc3RyZWFtZWQgaW50byB0aGlzIEFzc2VydGlvblJlc3VsdC4gVGVzdCBhc3NlcnRpb25zCisgIC8vIHVzZSBpdCB3aGVuIHRoZXkgZmFpbCAoaS5lLiwgdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUgZG9lc24ndCBtYXRjaCB0aGUKKyAgLy8gYXNzZXJ0aW9uJ3MgZXhwZWN0YXRpb24pLiBXaGVuIG5vdGhpbmcgaGFzIGJlZW4gc3RyZWFtZWQgaW50byB0aGUKKyAgLy8gb2JqZWN0LCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCA/ICBtZXNzYWdlXy0+Y19zdHIoKSA6ICIiOworICB9CisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlbW92ZSB0aGlzIGFmdGVyIG1ha2luZyBzdXJlIG5vIGNsaWVudHMgdXNlIGl0LgorICAvLyBEZXByZWNhdGVkOyBwbGVhc2UgdXNlIG1lc3NhZ2UoKSBpbnN0ZWFkLgorICBjb25zdCBjaGFyKiBmYWlsdXJlX21lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlKCk7IH0KKworICAvLyBTdHJlYW1zIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSBpbnRvIHRoaXMgb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KGNvbnN0IFQmIHZhbHVlKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFsbG93cyBzdHJlYW1pbmcgYmFzaWMgb3V0cHV0IG1hbmlwdWxhdG9ycyBzdWNoIGFzIGVuZGwgb3IgZmx1c2ggaW50bworICAvLyB0aGlzIG9iamVjdC4KKyAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KAorICAgICAgOjpzdGQ6Om9zdHJlYW0mICgqYmFzaWNfbWFuaXB1bGF0b3IpKDo6c3RkOjpvc3RyZWFtJiBzdHJlYW0pKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgYmFzaWNfbWFuaXB1bGF0b3IpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQXBwZW5kcyB0aGUgY29udGVudHMgb2YgbWVzc2FnZSB0byBtZXNzYWdlXy4KKyAgdm9pZCBBcHBlbmRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIGFfbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlXy5nZXQoKSA9PSBOVUxMKQorICAgICAgbWVzc2FnZV8ucmVzZXQobmV3IDo6c3RkOjpzdHJpbmcpOworICAgIG1lc3NhZ2VfLT5hcHBlbmQoYV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOworICB9CisKKyAgLy8gU3RvcmVzIHJlc3VsdCBvZiB0aGUgYXNzZXJ0aW9uIHByZWRpY2F0ZS4KKyAgYm9vbCBzdWNjZXNzXzsKKyAgLy8gU3RvcmVzIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiBpbiBjYXNlIHRoZSBleHBlY3RhdGlvbgorICAvLyBjb25zdHJ1Y3QgaXMgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lLgorICAvLyBSZWZlcmVuY2VkIHZpYSBhIHBvaW50ZXIgdG8gYXZvaWQgdGFraW5nIHRvbyBtdWNoIHN0YWNrIGZyYW1lIHNwYWNlCisgIC8vIHdpdGggdGVzdCBhc3NlcnRpb25zLgorICBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjpzdGQ6OnN0cmluZz4gbWVzc2FnZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBc3NlcnRpb25SZXN1bHQpOworfTsKKworLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgorLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2cuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1zZyk7CisKKy8vIFRoZSBhYnN0cmFjdCBjbGFzcyB0aGF0IGFsbCB0ZXN0cyBpbmhlcml0IGZyb20uCisvLworLy8gSW4gR29vZ2xlIFRlc3QsIGEgdW5pdCB0ZXN0IHByb2dyYW0gY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdENhc2VzLCBhbmQKKy8vIGVhY2ggVGVzdENhc2UgY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdHMuCisvLworLy8gV2hlbiB5b3UgZGVmaW5lIGEgdGVzdCB1c2luZyB0aGUgVEVTVCBtYWNybywgeW91IGRvbid0IG5lZWQgdG8KKy8vIGV4cGxpY2l0bHkgZGVyaXZlIGZyb20gVGVzdCAtIHRoZSBURVNUIG1hY3JvIGF1dG9tYXRpY2FsbHkgZG9lcworLy8gdGhpcyBmb3IgeW91LgorLy8KKy8vIFRoZSBvbmx5IHRpbWUgeW91IGRlcml2ZSBmcm9tIFRlc3QgaXMgd2hlbiBkZWZpbmluZyBhIHRlc3QgZml4dHVyZQorLy8gdG8gYmUgdXNlZCBhIFRFU1RfRi4gIEZvciBleGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgIHByb3RlY3RlZDoKKy8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IC4uLiB9CisvLyAgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyAuLi4gfQorLy8gICAgIC4uLgorLy8gICB9OworLy8KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEJhcikgeyAuLi4gfQorLy8gICBURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisvLworLy8gVGVzdCBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3QgeworIHB1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworCisgIC8vIERlZmluZXMgdHlwZXMgZm9yIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IHNldCB1cCBhbmQgdGVhciBkb3duCisgIC8vIGEgdGVzdCBjYXNlLgorICB0eXBlZGVmIGludGVybmFsOjpTZXRVcFRlc3RDYXNlRnVuYyBTZXRVcFRlc3RDYXNlRnVuYzsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgVGVhckRvd25UZXN0Q2FzZUZ1bmM7CisKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgaW50ZW5kIHRvIGluaGVyaXQgZnJvbSBUZXN0LgorICB2aXJ0dWFsIH5UZXN0KCk7CisKKyAgLy8gU2V0cyB1cCB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6U2V0VXBUZXN0Q2FzZSgpIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdAorICAvLyB0ZXN0IGluIHRlc3QgY2FzZSBGb28uICBIZW5jZSBhIHN1Yi1jbGFzcyBjYW4gZGVmaW5lIGl0cyBvd24KKyAgLy8gU2V0VXBUZXN0Q2FzZSgpIG1ldGhvZCB0byBzaGFkb3cgdGhlIG9uZSBkZWZpbmVkIGluIHRoZSBzdXBlcgorICAvLyBjbGFzcy4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHt9CisKKyAgLy8gVGVhcnMgZG93biB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8KKyAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6VGVhckRvd25UZXN0Q2FzZSgpIGFmdGVyIHJ1bm5pbmcgdGhlIGxhc3QKKyAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCisgIC8vIFRlYXJEb3duVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKKyAgLy8gY2xhc3MuCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorICBzdGF0aWMgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCisgIHN0YXRpYyBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSAoZWl0aGVyIGZhdGFsIG9yCisgIC8vIG5vbi1mYXRhbCkgZmFpbHVyZS4KKyAgc3RhdGljIGJvb2wgSGFzRmFpbHVyZSgpIHsgcmV0dXJuIEhhc0ZhdGFsRmFpbHVyZSgpIHx8IEhhc05vbmZhdGFsRmFpbHVyZSgpOyB9CisKKyAgLy8gTG9ncyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudCB0ZXN0LiAgT25seSB0aGUgbGFzdCB2YWx1ZSBmb3IgYSBnaXZlbgorICAvLyBrZXkgaXMgcmVtZW1iZXJlZC4KKyAgLy8gVGhlc2UgYXJlIHB1YmxpYyBzdGF0aWMgc28gdGhleSBjYW4gYmUgY2FsbGVkIGZyb20gdXRpbGl0eSBmdW5jdGlvbnMKKyAgLy8gdGhhdCBhcmUgbm90IG1lbWJlcnMgb2YgdGhlIHRlc3QgZml4dHVyZS4KKyAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgY29uc3QgY2hhciogaW5zdGVhZCBzdHJpbmdzLCBhcyBHb29nbGUgVGVzdCBpcyB1c2VkCisgIC8vIG9uIHBsYXRmb3JtcyB3aGVyZSBzdHJpbmcgZG9lc24ndCBjb21waWxlLgorICAvLworICAvLyBOb3RlIHRoYXQgYSBkcml2aW5nIGNvbnNpZGVyYXRpb24gZm9yIHRoZXNlIFJlY29yZFByb3BlcnR5IG1ldGhvZHMKKyAgLy8gd2FzIHRvIHByb2R1Y2UgeG1sIG91dHB1dCBzdWl0ZWQgdG8gdGhlIEdyZWVuc3BhbiBjaGFydGluZyB1dGlsaXR5LAorICAvLyB3aGljaCBhdCBwcmVzZW50IHdpbGwgb25seSBjaGFydCB2YWx1ZXMgdGhhdCBmaXQgaW4gYSAzMi1iaXQgaW50LiBJdAorICAvLyBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIHJlc3RyaWN0IHRoZWlyIHZhbHVlcyB0byAzMi1iaXQgaW50cworICAvLyBpZiB0aGV5IGludGVuZCB0aGVtIHRvIGJlIHVzZWQgd2l0aCBHcmVlbnNwYW4uCisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIENyZWF0ZXMgYSBUZXN0IG9iamVjdC4KKyAgVGVzdCgpOworCisgIC8vIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisKKyAgLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlIHNhbWUgZml4dHVyZSBjbGFzcyBhcworICAvLyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCisgIHN0YXRpYyBib29sIEhhc1NhbWVGaXh0dXJlQ2xhc3MoKTsKKworICAvLyBSdW5zIHRoZSB0ZXN0IGFmdGVyIHRoZSB0ZXN0IGZpeHR1cmUgaGFzIGJlZW4gc2V0IHVwLgorICAvLworICAvLyBBIHN1Yi1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGUgdGVzdCBsb2dpYy4KKyAgLy8KKyAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgRlVOQ1RJT04gRElSRUNUTFkgSU4gQSBVU0VSIFBST0dSQU0uCisgIC8vIEluc3RlYWQsIHVzZSB0aGUgVEVTVCBvciBURVNUX0YgbWFjcm8uCisgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpID0gMDsKKworICAvLyBTZXRzIHVwLCBleGVjdXRlcywgYW5kIHRlYXJzIGRvd24gdGhlIHRlc3QuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gRGVsZXRlcyBzZWxmLiAgV2UgZGVsaWJlcmF0ZWx5IHBpY2sgYW4gdW51c3VhbCBuYW1lIGZvciB0aGlzCisgIC8vIGludGVybmFsIG1ldGhvZCB0byBhdm9pZCBjbGFzaGluZyB3aXRoIG5hbWVzIHVzZWQgaW4gdXNlciBURVNUcy4KKyAgdm9pZCBEZWxldGVTZWxmXygpIHsgZGVsZXRlIHRoaXM7IH0KKworICAvLyBVc2VzIGEgR1Rlc3RGbGFnU2F2ZXIgdG8gc2F2ZSBhbmQgcmVzdG9yZSBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCisgIGNvbnN0IGludGVybmFsOjpHVGVzdEZsYWdTYXZlciogY29uc3QgZ3Rlc3RfZmxhZ19zYXZlcl87CisKKyAgLy8gT2Z0ZW4gYSB1c2VyIG1pcy1zcGVsbHMgU2V0VXAoKSBhcyBTZXR1cCgpIGFuZCBzcGVuZHMgYSBsb25nIHRpbWUKKyAgLy8gd29uZGVyaW5nIHdoeSBpdCBpcyBuZXZlciBjYWxsZWQgYnkgR29vZ2xlIFRlc3QuICBUaGUgZGVjbGFyYXRpb24gb2YKKyAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgc29sZWx5IGZvciBjYXRjaGluZyBzdWNoIGFuIGVycm9yIGF0CisgIC8vIGNvbXBpbGUgdGltZToKKyAgLy8KKyAgLy8gICAtIFRoZSByZXR1cm4gdHlwZSBpcyBkZWxpYmVyYXRlbHkgY2hvc2VuIHRvIGJlIG5vdCB2b2lkLCBzbyBpdAorICAvLyAgIHdpbGwgYmUgYSBjb25mbGljdCBpZiBhIHVzZXIgZGVjbGFyZXMgdm9pZCBTZXR1cCgpIGluIGhpcyB0ZXN0CisgIC8vICAgZml4dHVyZS4KKyAgLy8KKyAgLy8gICAtIFRoaXMgbWV0aG9kIGlzIHByaXZhdGUsIHNvIGl0IHdpbGwgYmUgYW5vdGhlciBjb21waWxlciBlcnJvcgorICAvLyAgIGlmIGEgdXNlciBjYWxscyBpdCBmcm9tIGhpcyB0ZXN0IGZpeHR1cmUuCisgIC8vCisgIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OLgorICAvLworICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcgorICAvLyBhYm91dCBpdCBiZWluZyBwcml2YXRlLCB5b3UgaGF2ZSBtaXMtc3BlbGxlZCBTZXRVcCgpIGFzIFNldHVwKCkuCisgIHN0cnVjdCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCB7fTsKKyAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0cy4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0KTsKK307CisKK3R5cGVkZWYgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBUaW1lSW5NaWxsaXM7CisKKy8vIEEgY29weWFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHVzZXIgc3BlY2lmaWVkIHRlc3QgcHJvcGVydHkgd2hpY2ggY2FuIGJlCisvLyBvdXRwdXQgYXMgYSBrZXkvdmFsdWUgc3RyaW5nIHBhaXIuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQcm9wZXJ0eSBhcyBpdHMgZGVzdHJ1Y3RvciBpcyBub3QgdmlydHVhbC4KK2NsYXNzIFRlc3RQcm9wZXJ0eSB7CisgcHVibGljOgorICAvLyBDJ3Rvci4gIFRlc3RQcm9wZXJ0eSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgLy8gQWx3YXlzIHVzZSB0aGlzIGNvbnN0cnVjdG9yICh3aXRoIHBhcmFtZXRlcnMpIHRvIGNyZWF0ZSBhCisgIC8vIFRlc3RQcm9wZXJ0eSBvYmplY3QuCisgIFRlc3RQcm9wZXJ0eShjb25zdCBjaGFyKiBhX2tleSwgY29uc3QgY2hhciogYV92YWx1ZSkgOgorICAgIGtleV8oYV9rZXkpLCB2YWx1ZV8oYV92YWx1ZSkgeworICB9CisKKyAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCBrZXkuCisgIGNvbnN0IGNoYXIqIGtleSgpIGNvbnN0IHsKKyAgICByZXR1cm4ga2V5Xy5jX3N0cigpOworICB9CisKKyAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCB2YWx1ZS4KKyAgY29uc3QgY2hhciogdmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXy5jX3N0cigpOworICB9CisKKyAgLy8gU2V0cyBhIG5ldyB2YWx1ZSwgb3ZlcnJpZGluZyB0aGUgb25lIHN1cHBsaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBTZXRWYWx1ZShjb25zdCBjaGFyKiBuZXdfdmFsdWUpIHsKKyAgICB2YWx1ZV8gPSBuZXdfdmFsdWU7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRoZSBrZXkgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisgIHN0ZDo6c3RyaW5nIGtleV87CisgIC8vIFRoZSB2YWx1ZSBzdXBwbGllZCBieSB0aGUgdXNlci4KKyAgc3RkOjpzdHJpbmcgdmFsdWVfOworfTsKKworLy8gVGhlIHJlc3VsdCBvZiBhIHNpbmdsZSBUZXN0LiAgVGhpcyBpbmNsdWRlcyBhIGxpc3Qgb2YKKy8vIFRlc3RQYXJ0UmVzdWx0cywgYSBsaXN0IG9mIFRlc3RQcm9wZXJ0aWVzLCBhIGNvdW50IG9mIGhvdyBtYW55CisvLyBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUgaW4gdGhlIFRlc3QsIGFuZCBob3cgbXVjaCB0aW1lIGl0IHRvb2sgdG8gcnVuCisvLyB0aGUgVGVzdC4KKy8vCisvLyBUZXN0UmVzdWx0IGlzIG5vdCBjb3B5YWJsZS4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdFJlc3VsdCB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCisgIFRlc3RSZXN1bHQoKTsKKworICAvLyBEJ3Rvci4gIERvIG5vdCBpbmhlcml0IGZyb20gVGVzdFJlc3VsdC4KKyAgflRlc3RSZXN1bHQoKTsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorICAvLyBvZiBzdWNjZXNzZnVsIHRlc3QgcGFydHMgYW5kIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgcGFydHMuCisgIGludCB0b3RhbF9wYXJ0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0ZXN0IHByb3BlcnRpZXMuCisgIGludCB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXNzZWQgKGkuZS4gbm8gdGVzdCBwYXJ0IGZhaWxlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYWlsZWQuCisgIGJvb2wgRmFpbGVkKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuIHJhbmdlCisgIC8vIGZyb20gMCB0byB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMKKyAgLy8gdGhlIHByb2dyYW0uCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzIHRoZQorICAvLyBwcm9ncmFtLgorICBjb25zdCBUZXN0UHJvcGVydHkmIEdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdEluZm87CisgIGZyaWVuZCBjbGFzcyBVbml0VGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpFeGVjRGVhdGhUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRlc3RSZXN1bHRBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6V2luZG93c0RlYXRoVGVzdDsKKworICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3BhcnRfcmVzdWx0c187CisgIH0KKworICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4mIHRlc3RfcHJvcGVydGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXzsKKyAgfQorCisgIC8vIFNldHMgdGhlIGVsYXBzZWQgdGltZS4KKyAgdm9pZCBzZXRfZWxhcHNlZF90aW1lKFRpbWVJbk1pbGxpcyBlbGFwc2VkKSB7IGVsYXBzZWRfdGltZV8gPSBlbGFwc2VkOyB9CisKKyAgLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIFRoZSBwcm9wZXJ0eSBpcyB2YWxpZGF0ZWQgYW5kIG1heSBhZGQKKyAgLy8gYSBub24tZmF0YWwgZmFpbHVyZSBpZiBpbnZhbGlkIChlLmcuLCBpZiBpdCBjb25mbGljdHMgd2l0aCByZXNlcnZlZAorICAvLyBrZXkgbmFtZXMpLiBJZiBhIHByb3BlcnR5IGlzIGFscmVhZHkgcmVjb3JkZWQgZm9yIHRoZSBzYW1lIGtleSwgdGhlCisgIC8vIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCwgcmF0aGVyIHRoYW4gc3RvcmluZyBtdWx0aXBsZSB2YWx1ZXMgZm9yIHRoZSBzYW1lCisgIC8vIGtleS4KKyAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOworCisgIC8vIEFkZHMgYSBmYWlsdXJlIGlmIHRoZSBrZXkgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgb2YgR29vZ2xlIFRlc3QKKyAgLy8gdGVzdGNhc2UgdGFncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCisgIC8vIFRPRE8ocnVzc3IpOiBWYWxpZGF0ZSBhdHRyaWJ1dGUgbmFtZXMgYXJlIGxlZ2FsIGFuZCBodW1hbiByZWFkYWJsZS4KKyAgc3RhdGljIGJvb2wgVmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKKworICAvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KKyAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgZGVhdGggdGVzdCBjb3VudC4KKyAgaW50IGRlYXRoX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBkZWF0aF90ZXN0X2NvdW50XzsgfQorCisgIC8vIEluY3JlbWVudHMgdGhlIGRlYXRoIHRlc3QgY291bnQsIHJldHVybmluZyB0aGUgbmV3IGNvdW50LgorICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7IHJldHVybiArK2RlYXRoX3Rlc3RfY291bnRfOyB9CisKKyAgLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KKyAgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cygpOworCisgIC8vIENsZWFycyB0aGUgb2JqZWN0LgorICB2b2lkIENsZWFyKCk7CisKKyAgLy8gUHJvdGVjdHMgbXV0YWJsZSBzdGF0ZSBvZiB0aGUgcHJvcGVydHkgdmVjdG9yIGFuZCBvZiBvd25lZAorICAvLyBwcm9wZXJ0aWVzLCB3aG9zZSB2YWx1ZXMgbWF5IGJlIHVwZGF0ZWQuCisgIGludGVybmFsOjpNdXRleCB0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzCisgIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiB0ZXN0X3BhcnRfcmVzdWx0c187CisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMKKyAgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiB0ZXN0X3Byb3BlcnRpZXNfOworICAvLyBSdW5uaW5nIGNvdW50IG9mIGRlYXRoIHRlc3RzLgorICBpbnQgZGVhdGhfdGVzdF9jb3VudF87CisgIC8vIFRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0UmVzdWx0LgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RSZXN1bHQpOworfTsgIC8vIGNsYXNzIFRlc3RSZXN1bHQKKworLy8gQSBUZXN0SW5mbyBvYmplY3Qgc3RvcmVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSB0ZXN0OgorLy8KKy8vICAgVGVzdCBjYXNlIG5hbWUKKy8vICAgVGVzdCBuYW1lCisvLyAgIFdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1bgorLy8gICBBIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBjcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCB3aGVuIGludm9rZWQKKy8vICAgVGVzdCByZXN1bHQKKy8vCisvLyBUaGUgY29uc3RydWN0b3Igb2YgVGVzdEluZm8gcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSBVbml0VGVzdAorLy8gc2luZ2xldG9uIHN1Y2ggdGhhdCB0aGUgUlVOX0FMTF9URVNUUygpIG1hY3JvIGtub3dzIHdoaWNoIHRlc3RzIHRvCisvLyBydW4uCitjbGFzcyBHVEVTVF9BUElfIFRlc3RJbmZvIHsKKyBwdWJsaWM6CisgIC8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZpcnR1YWwsIHNvCisgIC8vIGRvbid0IGluaGVyaXQgZnJvbSBUZXN0SW5mby4KKyAgflRlc3RJbmZvKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUuCisgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IG5hbWUuCisgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZAorICAvLyBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtKCkgY29uc3QgeworICAgIGlmICh0eXBlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQorICAgICAgcmV0dXJuIHR5cGVfcGFyYW1fLT5jX3N0cigpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgcGFyYW1ldGVyLCBvciBOVUxMIGlmIHRoaXMKKyAgLy8gaXMgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodmFsdWVfcGFyYW1fLmdldCgpICE9IE5VTEwpCisgICAgICByZXR1cm4gdmFsdWVfcGFyYW1fLT5jX3N0cigpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdGVzdCBzaG91bGQgcnVuLCB0aGF0IGlzIGlmIHRoZSB0ZXN0IGlzIG5vdCBkaXNhYmxlZAorICAvLyAob3IgaXQgaXMgZGlzYWJsZWQgYnV0IHRoZSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIGhhcyBiZWVuIHNwZWNpZmllZCkKKyAgLy8gYW5kIGl0cyBmdWxsIG5hbWUgbWF0Y2hlcyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICAvLworICAvLyBHb29nbGUgVGVzdCBhbGxvd3MgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSB0ZXN0cyBieSB0aGVpciBmdWxsIG5hbWVzLgorICAvLyBUaGUgZnVsbCBuYW1lIG9mIGEgdGVzdCBCYXIgaW4gdGVzdCBjYXNlIEZvbyBpcyBkZWZpbmVkIGFzCisgIC8vICJGb28uQmFyIi4gIE9ubHkgdGhlIHRlc3RzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlciB3aWxsIHJ1bi4KKyAgLy8KKyAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zLAorICAvLyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgJy0nIGFuZCBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mCisgIC8vIG5lZ2F0aXZlIHBhdHRlcm5zICh0ZXN0cyB0byBleGNsdWRlKS4gIEEgdGVzdCBpcyBydW4gaWYgaXQKKyAgLy8gbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YKKyAgLy8gdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgKkEqOkZvby4qIGlzIGEgZmlsdGVyIHRoYXQgbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQKKyAgLy8gY29udGFpbnMgdGhlIGNoYXJhY3RlciAnQScgb3Igc3RhcnRzIHdpdGggIkZvby4iLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4KKyAgY29uc3QgVGVzdFJlc3VsdCogcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJnJlc3VsdF87IH0KKworIHByaXZhdGU6CisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgZnJpZW5kIGNsYXNzIFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisgIGZyaWVuZCBUZXN0SW5mbyogaW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sCisgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworICAvLyBDb25zdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiBUaGUgbmV3bHkgY29uc3RydWN0ZWQgaW5zdGFuY2UgYXNzdW1lcworICAvLyBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgorICBUZXN0SW5mbyhjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICBjb25zdCBjaGFyKiBhX3ZhbHVlX3BhcmFtLAorICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOworCisgIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiBkZWF0aCB0ZXN0cyBlbmNvdW50ZXJlZCBpbiB0aGlzIHRlc3Qgc28KKyAgLy8gZmFyLgorICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7CisgICAgcmV0dXJuIHJlc3VsdF8uaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCisgIC8vIGRlbGV0ZXMgaXQuCisgIHZvaWQgUnVuKCk7CisKKyAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UmVzdWx0KFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICB0ZXN0X2luZm8tPnJlc3VsdF8uQ2xlYXIoKTsKKyAgfQorCisgIC8vIFRoZXNlIGZpZWxkcyBhcmUgaW1tdXRhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHRlc3QuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsgICAgIC8vIFRlc3QgY2FzZSBuYW1lCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOyAgICAgICAgICAgICAgIC8vIFRlc3QgbmFtZQorICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOworICAvLyBUZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHZhbHVlX3BhcmFtXzsKKyAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkXzsgICAvLyBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCisgIGJvb2wgc2hvdWxkX3J1bl87ICAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1bgorICBib29sIGlzX2Rpc2FibGVkXzsgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IGlzIGRpc2FibGVkCisgIGJvb2wgbWF0Y2hlc19maWx0ZXJfOyAgICAgICAgICAgICAvLyBUcnVlIGlmIHRoaXMgdGVzdCBtYXRjaGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBjb25zdCBmYWN0b3J5XzsgIC8vIFRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXN0IG9iamVjdAorCisgIC8vIFRoaXMgZmllbGQgaXMgbXV0YWJsZSBhbmQgbmVlZHMgdG8gYmUgcmVzZXQgYmVmb3JlIHJ1bm5pbmcgdGhlCisgIC8vIHRlc3QgZm9yIHRoZSBzZWNvbmQgdGltZS4KKyAgVGVzdFJlc3VsdCByZXN1bHRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEluZm8pOworfTsKKworLy8gQSB0ZXN0IGNhc2UsIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RJbmZvcy4KKy8vCisvLyBUZXN0Q2FzZSBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLworICAvLyBUZXN0Q2FzZSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIEFsd2F5cyB1c2UgdGhpcworICAvLyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBUZXN0Q2FzZSBvYmplY3QuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICBuYW1lOiAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorICAvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKKworICAvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorICB2aXJ0dWFsIH5UZXN0Q2FzZSgpOworCisgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRlc3RDYXNlLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKyAgY29uc3QgY2hhciogdHlwZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgcGFzc2VkLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkX3Rlc3RfY291bnQoKSA+IDA7IH0KKworICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdEluZm8qIEdldFRlc3RJbmZvKGludCBpKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKKworICAvLyBHZXRzIHRoZSAobXV0YWJsZSkgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGlzIFRlc3RDYXNlLgorICBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+JiB0ZXN0X2luZm9fbGlzdCgpIHsgcmV0dXJuIHRlc3RfaW5mb19saXN0XzsgfQorCisgIC8vIEdldHMgdGhlIChpbW11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfaW5mb19saXN0XzsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBUZXN0SW5mbyogR2V0TXV0YWJsZVRlc3RJbmZvKGludCBpKTsKKworICAvLyBTZXRzIHRoZSBzaG91bGRfcnVuIG1lbWJlci4KKyAgdm9pZCBzZXRfc2hvdWxkX3J1bihib29sIHNob3VsZCkgeyBzaG91bGRfcnVuXyA9IHNob3VsZDsgfQorCisgIC8vIEFkZHMgYSBUZXN0SW5mbyB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSBUZXN0SW5mbyB1cG9uCisgIC8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCisgIHZvaWQgQWRkVGVzdEluZm8oVGVzdEluZm8gKiB0ZXN0X2luZm8pOworCisgIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHZvaWQgQ2xlYXJSZXN1bHQoKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCisgIHN0YXRpYyB2b2lkIENsZWFyVGVzdENhc2VSZXN1bHQoVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICAgIHRlc3RfY2FzZS0+Q2xlYXJSZXN1bHQoKTsKKyAgfQorCisgIC8vIFJ1bnMgZXZlcnkgdGVzdCBpbiB0aGlzIFRlc3RDYXNlLgorICB2b2lkIFJ1bigpOworCisgIC8vIFJ1bnMgU2V0VXBUZXN0Q2FzZSgpIGZvciB0aGlzIFRlc3RDYXNlLiAgVGhpcyB3cmFwcGVyIGlzIG5lZWRlZAorICAvLyBmb3IgY2F0Y2hpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBTZXRVcFRlc3RDYXNlKCkuCisgIHZvaWQgUnVuU2V0VXBUZXN0Q2FzZSgpIHsgKCpzZXRfdXBfdGNfKSgpOyB9CisKKyAgLy8gUnVucyBUZWFyRG93blRlc3RDYXNlKCkgZm9yIHRoaXMgVGVzdENhc2UuICBUaGlzIHdyYXBwZXIgaXMKKyAgLy8gbmVlZGVkIGZvciBjYXRjaGluZyBleGNlcHRpb25zIHRocm93biBmcm9tIFRlYXJEb3duVGVzdENhc2UoKS4KKyAgdm9pZCBSdW5UZWFyRG93blRlc3RDYXNlKCkgeyAoKnRlYXJfZG93bl90Y18pKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgcGFzc2VkLgorICBzdGF0aWMgYm9vbCBUZXN0UGFzc2VkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9pbmZvLT5yZXN1bHQoKS0+UGFzc2VkKCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgZmFpbGVkLgorICBzdGF0aWMgYm9vbCBUZXN0RmFpbGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9pbmZvLT5yZXN1bHQoKS0+RmFpbGVkKCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgaXMgZGlzYWJsZWQuCisgIHN0YXRpYyBib29sIFRlc3REaXNhYmxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0ZXN0IHNob3VsZCBydW4uCisgIHN0YXRpYyBib29sIFNob3VsZFJ1blRlc3QoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKTsKKyAgfQorCisgIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgdm9pZCBTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKTsKKworICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCisgIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKKworICAvLyBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UuCisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCisgIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4gdGVzdF9pbmZvX2xpc3RfOworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBsaXN0IHRvIGFsbG93IGVhc3kKKyAgLy8gc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3Qgb3JkZXIuICBUaGUgaS10aCBlbGVtZW50IGluIHRoaXMKKyAgLy8gdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGluIHRoZSBzaHVmZmxlZCB0ZXN0IGxpc3QuCisgIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9pbmRpY2VzXzsKKyAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UuCisgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90Y187CisgIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlLgorICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGNfOworICAvLyBUcnVlIGlmZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW5fOworICAvLyBFbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0Q2FzZXMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdENhc2UpOworfTsKKworLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGlzIGNhcGFibGUgb2Ygc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIGFuCisvLyBlbnZpcm9ubWVudC4gIFRoZSB1c2VyIHNob3VsZCBzdWJjbGFzcyB0aGlzIHRvIGRlZmluZSBoaXMgb3duCisvLyBlbnZpcm9ubWVudChzKS4KKy8vCisvLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgZG9lcyB0aGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gaW4gdmlydHVhbAorLy8gbWV0aG9kcyBTZXRVcCgpIGFuZCBUZWFyRG93bigpIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUKKy8vIGRlc3RydWN0b3IsIGFzOgorLy8KKy8vICAgMS4gWW91IGNhbm5vdCBzYWZlbHkgdGhyb3cgZnJvbSBhIGRlc3RydWN0b3IuICBUaGlzIGlzIGEgcHJvYmxlbQorLy8gICAgICBhcyBpbiBzb21lIGNhc2VzIEdvb2dsZSBUZXN0IGlzIHVzZWQgd2hlcmUgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgYW5kCisvLyAgICAgIHdlIG1heSB3YW50IHRvIGltcGxlbWVudCBBU1NFUlRfKiB1c2luZyBleGNlcHRpb25zIHdoZXJlIHRoZXkgYXJlCisvLyAgICAgIGF2YWlsYWJsZS4KKy8vICAgMi4gWW91IGNhbm5vdCB1c2UgQVNTRVJUXyogZGlyZWN0bHkgaW4gYSBjb25zdHJ1Y3RvciBvcgorLy8gICAgICBkZXN0cnVjdG9yLgorY2xhc3MgRW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgbmVlZCB0byBzdWJjbGFzcyBFbnZpcm9ubWVudC4KKyAgdmlydHVhbCB+RW52aXJvbm1lbnQoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byB0ZWFyIGRvd24gdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorIHByaXZhdGU6CisgIC8vIElmIHlvdSBzZWUgYW4gZXJyb3IgYWJvdXQgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG9yCisgIC8vIGFib3V0IGl0IGJlaW5nIHByaXZhdGUsIHlvdSBoYXZlIG1pcy1zcGVsbGVkIFNldFVwKCkgYXMgU2V0dXAoKS4KKyAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9OworICB2aXJ0dWFsIFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwKiBTZXR1cCgpIHsgcmV0dXJuIE5VTEw7IH0KK307CisKKy8vIFRoZSBpbnRlcmZhY2UgZm9yIHRyYWNpbmcgZXhlY3V0aW9uIG9mIHRlc3RzLiBUaGUgbWV0aG9kcyBhcmUgb3JnYW5pemVkIGluCisvLyB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGFyZSBmaXJlZC4KK2NsYXNzIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RFdmVudExpc3RlbmVyKCkge30KKworICAvLyBGaXJlZCBiZWZvcmUgYW55IHRlc3QgYWN0aXZpdHkgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLiAgVGhlcmUgbWF5IGJlIG1vcmUgdGhhbgorICAvLyBvbmUgaXRlcmF0aW9uIGlmIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBzZXQuIGl0ZXJhdGlvbiBpcyB0aGUgaXRlcmF0aW9uCisgIC8vIGluZGV4LCBzdGFydGluZyBmcm9tIDAuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2Ugc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3Qgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCB0ZWFyLWRvd24gZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZmluaXNoZXMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgYWxsIHRlc3QgYWN0aXZpdGllcyBoYXZlIGVuZGVkLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Cit9OworCisvLyBUaGUgY29udmVuaWVuY2UgY2xhc3MgZm9yIHVzZXJzIHdobyBuZWVkIHRvIG92ZXJyaWRlIGp1c3Qgb25lIG9yIHR3bworLy8gbWV0aG9kcyBhbmQgYXJlIG5vdCBjb25jZXJuZWQgdGhhdCBhIHBvc3NpYmxlIGNoYW5nZSB0byBhIHNpZ25hdHVyZSBvZgorLy8gdGhlIG1ldGhvZHMgdGhleSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYXVnaHQgZHVyaW5nIHRoZSBidWlsZC4gIEZvcgorLy8gY29tbWVudHMgYWJvdXQgZWFjaCBtZXRob2QgcGxlYXNlIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiBUZXN0RXZlbnRMaXN0ZW5lcgorLy8gYWJvdmUuCitjbGFzcyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgLyp0ZXN0X3BhcnRfcmVzdWx0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Cit9OworCisvLyBUZXN0RXZlbnRMaXN0ZW5lcnMgbGV0cyB1c2VycyBhZGQgbGlzdGVuZXJzIHRvIHRyYWNrIGV2ZW50cyBpbiBHb29nbGUgVGVzdC4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdEV2ZW50TGlzdGVuZXJzIHsKKyBwdWJsaWM6CisgIFRlc3RFdmVudExpc3RlbmVycygpOworICB+VGVzdEV2ZW50TGlzdGVuZXJzKCk7CisKKyAgLy8gQXBwZW5kcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBHb29nbGUgVGVzdCBhc3N1bWVzCisgIC8vIHRoZSBvd25lcnNoaXAgb2YgdGhlIGxpc3RlbmVyIChpLmUuIGl0IHdpbGwgZGVsZXRlIHRoZSBsaXN0ZW5lciB3aGVuCisgIC8vIHRoZSB0ZXN0IHByb2dyYW0gZmluaXNoZXMpLgorICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBJdCB0aGVuCisgIC8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKKyAgLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCisgIC8vIG91dHB1dC4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3RlbmVycyBsaXN0IHRvIHNodXQgZG93biBkZWZhdWx0CisgIC8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKKyAgLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIgYW5kIG1ha2VzIHRoaXMKKyAgLy8gZnVuY3Rpb24gcmV0dXJuIE5VTEwgdGhlIG5leHQgdGltZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQKKyAgLy8gY29udHJvbGxlZCBieSB0aGUgLS1ndGVzdF9vdXRwdXQ9eG1sIGZsYWcuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQorICAvLyBsaXN0ZW5lcnMgbGlzdCBieSB1c2VycyB3aG8gd2FudCB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dAorICAvLyBjb250cm9sbGVkIGJ5IHRoaXMgZmxhZyBhbmQgc3Vic3RpdHV0ZSBpdCB3aXRoIGN1c3RvbSBvbmUuICBOb3RlIHRoYXQKKyAgLy8gcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdCB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cworICAvLyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dAorICAvLyB0aW1lLgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdENhc2U7CisgIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpOb0V4ZWNEZWF0aFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworCisgIC8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCisgIC8vIHN1YnNjcmliZXJzLgorICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisgIC8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworICAvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCisgIHZvaWQgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4gIFRoZQorICAvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisgIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisgIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KKyAgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQorICAvLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuCisgIGJvb2wgRXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpIGNvbnN0OworICB2b2lkIFN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7CisKKyAgLy8gVGhlIGFjdHVhbCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKiByZXBlYXRlcl87CisgIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgc3RhbmRhcmQgcmVzdWx0IG91dHB1dC4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOworICAvLyBMaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBYTUwgb3V0cHV0IGZpbGUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdEV2ZW50TGlzdGVuZXJzLgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudExpc3RlbmVycyk7Cit9OworCisvLyBBIFVuaXRUZXN0IGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RDYXNlcy4KKy8vCisvLyBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgVW5pdFRlc3QgaXMKKy8vIGNyZWF0ZWQgd2hlbiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSBpcyBmaXJzdCBjYWxsZWQuICBUaGlzCisvLyBpbnN0YW5jZSBpcyBuZXZlciBkZWxldGVkLgorLy8KKy8vIFVuaXRUZXN0IGlzIG5vdCBjb3B5YWJsZS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlIGFzIGxvbmcgYXMgdGhlIG1ldGhvZHMgYXJlIGNhbGxlZAorLy8gYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb24uCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0IHsKKyBwdWJsaWM6CisgIC8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZAorICAvLyBpcyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4KKyAgLy8gQ29uc2VjdXRpdmUgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgorICBzdGF0aWMgVW5pdFRlc3QqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgorICAvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBpbnQgUnVuKCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKKworICAvLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkKKyAgLy8gd2FzIGV4ZWN1dGVkLiAgVGhlIFVuaXRUZXN0IG9iamVjdCBvd25zIHRoZSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIG9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisgIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdAorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKyAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0CisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIC8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgorICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdDsKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFJldHVybnMgdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIC8vCisgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCisgIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgorICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorICAvLyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgorICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCisgIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorICAvLyBVTklYIGVwb2NoLgorICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wKCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKyAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCisgIGJvb2wgRmFpbGVkKCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIGNvbnN0IFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMKKyAgLy8gaW5zaWRlIEdvb2dsZSBUZXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycygpOworCisgcHJpdmF0ZToKKyAgLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAorICAvLyBwcm9ncmFtIGlzIHJ1biwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHNldC11cCBpbgorICAvLyB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuICBBZnRlciBhbGwgdGVzdHMgaW4gdGhlIHByb2dyYW0KKyAgLy8gaGF2ZSBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbgorICAvLyB0aGUgKnJldmVyc2UqIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLgorICAvLworICAvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgRW52aXJvbm1lbnQqIEFkZEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOworCisgIC8vIEFkZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdC4gIEFsbAorICAvLyBHb29nbGUgVGVzdCBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykKKyAgLy8gZXZlbnR1YWxseSBjYWxsIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlCisgIC8vIHNob3VsZCB1c2UgdGhlIGFzc2VydGlvbiBtYWNyb3MgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuCisgIHZvaWQgQWRkVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuIElmIHRoZSByZXN1bHQgYWxyZWFkeQorICAvLyBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgorICB2b2lkIFJlY29yZFByb3BlcnR5Rm9yQ3VycmVudFRlc3QoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpOworCisgIC8vIEFjY2Vzc29ycyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9CisgIGNvbnN0IGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQorCisgIC8vIFRoZXNlIGNsYXNzZXMgYW5kIGZ1bmNpb25zIGFyZSBmcmllbmRzIGFzIHRoZXkgbmVlZCB0byBhY2Nlc3MgcHJpdmF0ZQorICAvLyBtZW1iZXJzIG9mIFVuaXRUZXN0LgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBc3NlcnRIZWxwZXI7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U2NvcGVkVHJhY2U7CisgIGZyaWVuZCBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOworICBmcmllbmQgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBmcmllbmQgdm9pZCBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAorICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisKKyAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBVbml0VGVzdC4KKyAgVW5pdFRlc3QoKTsKKworICAvLyBEJ3RvcgorICB2aXJ0dWFsIH5Vbml0VGVzdCgpOworCisgIC8vIFB1c2hlcyBhIHRyYWNlIGRlZmluZWQgYnkgU0NPUEVEX1RSQUNFKCkgb24gdG8gdGhlIHBlci10aHJlYWQKKyAgLy8gR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHZvaWQgUHVzaEdUZXN0VHJhY2UoY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIC8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgorICB2b2lkIFBvcEdUZXN0VHJhY2UoKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBQcm90ZWN0cyBtdXRhYmxlIHN0YXRlIGluICppbXBsXy4gIFRoaXMgaXMgbXV0YWJsZSBhcyBzb21lIGNvbnN0CisgIC8vIG1ldGhvZHMgbmVlZCB0byBsb2NrIGl0IHRvby4KKyAgbXV0YWJsZSBpbnRlcm5hbDo6TXV0ZXggbXV0ZXhfOworCisgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuICBUaGlzIGZpZWxkIGlzIG5ldmVyIGNoYW5nZWQgb25jZQorICAvLyB0aGUgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLiAgV2UgZG9uJ3QgbWFyayBpdCBhcyBjb25zdCBoZXJlLCBhcworICAvLyBkb2luZyBzbyB3aWxsIGNhdXNlIGEgd2FybmluZyBpbiB0aGUgY29uc3RydWN0b3Igb2YgVW5pdFRlc3QuCisgIC8vIE11dGFibGUgc3RhdGUgaW4gKmltcGxfIGlzIHByb3RlY3RlZCBieSBtdXRleF8uCisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGxfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVW5pdFRlc3QuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVW5pdFRlc3QpOworfTsKKworLy8gQSBjb252ZW5pZW50IHdyYXBwZXIgZm9yIGFkZGluZyBhbiBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QKKy8vIHByb2dyYW0uCisvLworLy8gWW91IHNob3VsZCBjYWxsIHRoaXMgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBjYWxsZWQsIHByb2JhYmx5IGluCisvLyBtYWluKCkuICBJZiB5b3UgdXNlIGd0ZXN0X21haW4sIHlvdSBuZWVkIHRvIGNhbGwgdGhpcyBiZWZvcmUgbWFpbigpCisvLyBzdGFydHMgZm9yIGl0IHRvIHRha2UgZWZmZWN0LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIGEgZ2xvYmFsCisvLyB2YXJpYWJsZSBsaWtlIHRoaXM6CisvLworLy8gICB0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgZm9vX2VudiA9CisvLyAgICAgICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEZvb0Vudmlyb25tZW50KTsKKy8vCisvLyBIb3dldmVyLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgeW91IHRvIHdyaXRlIHlvdXIgb3duIG1haW4oKSBhbmQKKy8vIGNhbGwgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KCkgdGhlcmUsIGFzIHJlbHlpbmcgb24gaW5pdGlhbGl6YXRpb24KKy8vIG9mIGdsb2JhbCB2YXJpYWJsZXMgbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQgYW5kIG1heSBjYXVzZQorLy8gcHJvYmxlbXMgd2hlbiB5b3UgcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnRzIGZyb20gZGlmZmVyZW50CisvLyB0cmFuc2xhdGlvbiB1bml0cyBhbmQgdGhlIGVudmlyb25tZW50cyBoYXZlIGRlcGVuZGVuY2llcyBhbW9uZyB0aGVtCisvLyAocmVtZW1iZXIgdGhhdCB0aGUgY29tcGlsZXIgZG9lc24ndCBndWFyYW50ZWUgdGhlIG9yZGVyIGluIHdoaWNoCisvLyBnbG9iYWwgdmFyaWFibGVzIGZyb20gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGFyZSBpbml0aWFsaXplZCkuCitpbmxpbmUgRW52aXJvbm1lbnQqIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7CisgIHJldHVybiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkRW52aXJvbm1lbnQoZW52KTsKK30KKworLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCisvLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQorLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCisvLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgorLy8KKy8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQorLy8gdXBkYXRlZC4KKy8vCisvLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0LgorR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgY2hhcioqIGFyZ3YpOworCisvLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCisvLyBVTklDT0RFIG1vZGUuCitHVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEZvcm1hdEZvckNvbXBhcmlzb248VG9QcmludCwgT3RoZXJPcGVyYW5kPjo6Rm9ybWF0KHZhbHVlKSBmb3JtYXRzIGEKKy8vIHZhbHVlIG9mIHR5cGUgVG9QcmludCB0aGF0IGlzIGFuIG9wZXJhbmQgb2YgYSBjb21wYXJpc29uIGFzc2VydGlvbgorLy8gKGUuZy4gQVNTRVJUX0VRKS4gIE90aGVyT3BlcmFuZCBpcyB0aGUgdHlwZSBvZiB0aGUgb3RoZXIgb3BlcmFuZCBpbgorLy8gdGhlIGNvbXBhcmlzb24sIGFuZCBpcyB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBiZXN0IHdheSB0bworLy8gZm9ybWF0IHRoZSB2YWx1ZS4gIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIHZhbHVlIGlzIGEgQyBzdHJpbmcKKy8vIChjaGFyIHBvaW50ZXIpIGFuZCB0aGUgb3RoZXIgb3BlcmFuZCBpcyBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2UKKy8vIHdhbnQgdG8gZm9ybWF0IHRoZSBDIHN0cmluZyBhcyBhIHN0cmluZywgc2luY2Ugd2Uga25vdyBpdCBpcworLy8gY29tcGFyZWQgYnkgdmFsdWUgd2l0aCB0aGUgc3RyaW5nIG9iamVjdC4gIElmIHRoZSB2YWx1ZSBpcyBhIGNoYXIKKy8vIHBvaW50ZXIgYnV0IHRoZSBvdGhlciBvcGVyYW5kIGlzIG5vdCBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2UgZG9uJ3QKKy8vIGtub3cgd2hldGhlciB0aGUgcG9pbnRlciBpcyBzdXBwb3NlZCB0byBwb2ludCB0byBhIE5VTC10ZXJtaW5hdGVkCisvLyBzdHJpbmcsIGFuZCB0aHVzIHdhbnQgdG8gcHJpbnQgaXQgYXMgYSBwb2ludGVyIHRvIGJlIHNhZmUuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorCisvLyBUaGUgZGVmYXVsdCBjYXNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFRvUHJpbnQsIHR5cGVuYW1lIE90aGVyT3BlcmFuZD4KK2NsYXNzIEZvcm1hdEZvckNvbXBhcmlzb24geworIHB1YmxpYzoKKyAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KGNvbnN0IFRvUHJpbnQmIHZhbHVlKSB7CisgICAgcmV0dXJuIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyh2YWx1ZSk7CisgIH0KK307CisKKy8vIEFycmF5LgordGVtcGxhdGUgPHR5cGVuYW1lIFRvUHJpbnQsIHNpemVfdCBOLCB0eXBlbmFtZSBPdGhlck9wZXJhbmQ+CitjbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uPFRvUHJpbnRbTl0sIE90aGVyT3BlcmFuZD4geworIHB1YmxpYzoKKyAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KGNvbnN0IFRvUHJpbnQqIHZhbHVlKSB7CisgICAgcmV0dXJuIEZvcm1hdEZvckNvbXBhcmlzb248Y29uc3QgVG9QcmludCosIE90aGVyT3BlcmFuZD46OkZvcm1hdCh2YWx1ZSk7CisgIH0KK307CisKKy8vIEJ5IGRlZmF1bHQsIHByaW50IEMgc3RyaW5nIGFzIHBvaW50ZXJzIHRvIGJlIHNhZmUsIGFzIHdlIGRvbid0IGtub3cKKy8vIHdoZXRoZXIgdGhleSBhY3R1YWxseSBwb2ludCB0byBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KKworI2RlZmluZSBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhDaGFyVHlwZSkgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJPcGVyYW5kPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uPENoYXJUeXBlKiwgT3RoZXJPcGVyYW5kPiB7ICAgICAgICAgICAgICAgICAgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChDaGFyVHlwZSogdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odmFsdWUpKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNoYXIpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY29uc3QgY2hhcik7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyh3Y2hhcl90KTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNvbnN0IHdjaGFyX3QpOworCisjdW5kZWYgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8KKworLy8gSWYgYSBDIHN0cmluZyBpcyBjb21wYXJlZCB3aXRoIGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZSBrbm93IGl0J3MgbWVhbnQKKy8vIHRvIHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLCBhbmQgdGh1cyBjYW4gcHJpbnQgaXQgYXMgYSBzdHJpbmcuCisKKyNkZWZpbmUgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhDaGFyVHlwZSwgT3RoZXJTdHJpbmdUeXBlKSBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248Q2hhclR5cGUqLCBPdGhlclN0cmluZ1R5cGU+IHsgICAgICAgICAgICAgICBcCisgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KENoYXJUeXBlKiB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjaGFyLCA6OnN0ZDo6c3RyaW5nKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3QgY2hhciwgOjpzdGQ6OnN0cmluZyk7CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjaGFyLCA6OnN0cmluZyk7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IGNoYXIsIDo6c3RyaW5nKTsKKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKHdjaGFyX3QsIDo6d3N0cmluZyk7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IHdjaGFyX3QsIDo6d3N0cmluZyk7CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyh3Y2hhcl90LCA6OnN0ZDo6d3N0cmluZyk7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IHdjaGFyX3QsIDo6c3RkOjp3c3RyaW5nKTsKKyNlbmRpZgorCisjdW5kZWYgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXworCisvLyBGb3JtYXRzIGEgY29tcGFyaXNvbiBhc3NlcnRpb24gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfTFQsIGFuZCBldGMpCisvLyBvcGVyYW5kIHRvIGJlIHVzZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuICBUaGUgdHlwZSAoYnV0IG5vdCB2YWx1ZSkKKy8vIG9mIHRoZSBvdGhlciBvcGVyYW5kIG1heSBhZmZlY3QgdGhlIGZvcm1hdC4gIFRoaXMgYWxsb3dzIHVzIHRvCisvLyBwcmludCBhIGNoYXIqIGFzIGEgcmF3IHBvaW50ZXIgd2hlbiBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IGFub3RoZXIKKy8vIGNoYXIqIG9yIHZvaWQqLCBhbmQgcHJpbnQgaXQgYXMgYSBDIHN0cmluZyB3aGVuIGl0IGlzIGNvbXBhcmVkCisvLyBhZ2FpbnN0IGFuIHN0ZDo6c3RyaW5nIG9iamVjdCwgZm9yIGV4YW1wbGUuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0ZDo6c3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgKKyAgICBjb25zdCBUMSYgdmFsdWUsIGNvbnN0IFQyJiAvKiBvdGhlcl9vcGVyYW5kICovKSB7CisgIHJldHVybiBGb3JtYXRGb3JDb21wYXJpc29uPFQxLCBUMj46OkZvcm1hdCh2YWx1ZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIGFjdHVhbCkgeworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM4OSkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoLgorI2VuZGlmCisKKyAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYKKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShhY3R1YWwsIGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIFdpdGggdGhpcyBvdmVybG9hZGVkIHZlcnNpb24sIHdlIGFsbG93IGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkCisvLyBpbiB7QVNTRVJUfEVYUEVDVH1fRVEgd2hlbiBjb21waWxlZCB3aXRoIGdjYyA0LCBhcyBhbm9ueW1vdXMgZW51bXMKKy8vIGNhbiBiZSBpbXBsaWNpdGx5IGNhc3QgdG8gQmlnZ2VzdEludC4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCk7CisKKy8vIFRoZSBoZWxwZXIgY2xhc3MgZm9yIHtBU1NFUlR8RVhQRUNUfV9FUS4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAorLy8gbGhzX2lzX251bGxfbGl0ZXJhbCBpcyB0cnVlIGlmZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkKKy8vIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGUgZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMKKy8vIGZvciBsaHNfaXNfbnVsbF9saXRlcmFsIGJlaW5nIGZhbHNlLgordGVtcGxhdGUgPGJvb2wgbGhzX2lzX251bGxfbGl0ZXJhbD4KK2NsYXNzIEVxSGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIFRoaXMgdGVtcGxhdGl6ZWQgdmVyc2lvbiBpcyBmb3IgdGhlIGdlbmVyYWwgY2FzZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiBhY3R1YWwpIHsKKyAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICB9CisKKyAgLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQKKyAgLy8gaW4ge0FTU0VSVHxFWFBFQ1R9X0VRIHdoZW4gY29tcGlsZWQgd2l0aCBnY2MgNCwgYXMgYW5vbnltb3VzCisgIC8vIGVudW1zIGNhbiBiZSBpbXBsaWNpdGx5IGNhc3QgdG8gQmlnZ2VzdEludC4KKyAgLy8KKyAgLy8gRXZlbiB0aG91Z2ggaXRzIGJvZHkgbG9va3MgdGhlIHNhbWUgYXMgdGhlIGFib3ZlIHZlcnNpb24sIHdlCisgIC8vIGNhbm5vdCBtZXJnZSB0aGUgdHdvLCBhcyBpdCB3aWxsIG1ha2UgYW5vbnltb3VzIGVudW1zIHVuaGFwcHkuCisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpIHsKKyAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICB9Cit9OworCisvLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkKKy8vIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwsIGxpa2UgTlVMTCwgZmFsc2UsIG9yIDAuCit0ZW1wbGF0ZSA8PgorY2xhc3MgRXFIZWxwZXI8dHJ1ZT4geworIHB1YmxpYzoKKyAgLy8gV2UgZGVmaW5lIHR3byBvdmVybG9hZGVkIHZlcnNpb25zIG9mIENvbXBhcmUoKS4gIFRoZSBmaXJzdAorICAvLyB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKSBpcworICAvLyBOT1QgYSBwb2ludGVyLCBlLmcuIEFTU0VSVF9FUSgwLCBBbkludEZ1bmN0aW9uKCkpIG9yCisgIC8vIEVYUEVDVF9FUShmYWxzZSwgYV9ib29sKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKAorICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAorICAgICAgY29uc3QgVDImIGFjdHVhbCwKKyAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBwcmV2ZW50cyB0aGlzIG92ZXJsb2FkIGZyb20gYmVpbmcgY29uc2lkZXJlZCBpZiBUMgorICAgICAgLy8gaXMgbm90IGEgcG9pbnRlciB0eXBlLiAgV2UgbmVlZCB0aGlzIGJlY2F1c2UgQVNTRVJUX0VRKE5VTEwsIG15X3B0cikKKyAgICAgIC8vIGV4cGFuZHMgdG8gQ29tcGFyZSgiIiwgIiIsIE5VTEwsIG15X3B0ciksIHdoaWNoIHJlcXVpcmVzIGEgY29udmVyc2lvbgorICAgICAgLy8gdG8gbWF0Y2ggdGhlIFNlY3JldCogaW4gdGhlIG90aGVyIG92ZXJsb2FkLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgbWFrZQorICAgICAgLy8gdGhpcyB0ZW1wbGF0ZSBtYXRjaCBiZXR0ZXIuCisgICAgICB0eXBlbmFtZSBFbmFibGVJZjwhaXNfcG9pbnRlcjxUMj46OnZhbHVlPjo6dHlwZSogPSAwKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorCisgIC8vIFRoaXMgdmVyc2lvbiB3aWxsIGJlIHBpY2tlZCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkgaXMgYQorICAvLyBwb2ludGVyLCBlLmcuIEFTU0VSVF9FUShOVUxMLCBhX3BvaW50ZXIpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKAorICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgLy8gV2UgdXNlZCB0byBoYXZlIGEgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciBpbnN0ZWFkIG9mIFNlY3JldCouICBUaGF0CisgICAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgd291bGQgZGVkdWNlIHRvICdsb25nJywgbWFraW5nIHRoaXMgYSBiZXR0ZXIgbWF0Y2gKKyAgICAgIC8vIHRoYW4gdGhlIGZpcnN0IG92ZXJsb2FkIGV2ZW4gd2l0aG91dCB0aGUgZmlyc3Qgb3ZlcmxvYWQncyBFbmFibGVJZi4KKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIGdjYyB3aXRoIC1XY29udmVyc2lvbi1udWxsIHdhcm5zIHdoZW4gInBhc3NpbmcgTlVMTCB0bworICAgICAgLy8gbm9uLXBvaW50ZXIgYXJndW1lbnQiIChldmVuIGEgZGVkdWNlZCBpbnRlZ3JhbCBhcmd1bWVudCksIHNvIHRoZSBvbGQKKyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGNhdXNlZCB3YXJuaW5ncyBpbiB1c2VyIGNvZGUuCisgICAgICBTZWNyZXQqIC8qIGV4cGVjdGVkIChOVUxMKSAqLywKKyAgICAgIFQqIGFjdHVhbCkgeworICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGF0ICdleHBlY3RlZCcgaXMgYSBudWxsIHBvaW50ZXIuCisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxUKj4oTlVMTCksIGFjdHVhbCk7CisgIH0KK307CisKKy8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisvLyBBU1NFUlRfPz8gYW5kIEVYUEVDVF8/Py4gIEl0IGlzIGhlcmUganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZQorLy8gb2Ygc2ltaWxhciBjb2RlLgorLy8KKy8vIEZvciBlYWNoIHRlbXBsYXRpemVkIGhlbHBlciBmdW5jdGlvbiwgd2UgYWxzbyBkZWZpbmUgYW4gb3ZlcmxvYWRlZAorLy8gdmVyc2lvbiBmb3IgQmlnZ2VzdEludCBpbiBvcmRlciB0byByZWR1Y2UgY29kZSBibG9hdCBhbmQgYWxsb3cKKy8vIGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkIHdpdGgge0FTU0VSVHxFWFBFQ1R9Xz8/IHdoZW4gY29tcGlsZWQKKy8vIHdpdGggZ2NjIDQuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+XAorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHZhbDEsIGNvbnN0IFQyJiB2YWwyKSB7XAorICBpZiAodmFsMSBvcCB2YWwyKSB7XAorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAorICB9IGVsc2Uge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIFwKKyAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAorICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKKyAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCisgIH1cCit9XAorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKFwKKyAgICBjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwpOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR0UKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dUCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdULCA+KTsKKworI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkVRLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKTsKKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSTkUuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSRVEgb24gd2lkZSBzdHJpbmdzLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogYWN0dWFsKTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gSXNTdWJzdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUKKy8vIGZpcnN0IGFyZ3VtZW50IHRvIHtFWFBFQ1QsQVNTRVJUfV9QUkVEX0ZPUk1BVDIoKSwgbm90IGJ5CisvLyB0aGVtc2VsdmVzLiAgVGhleSBjaGVjayB3aGV0aGVyIG5lZWRsZSBpcyBhIHN1YnN0cmluZyBvZiBoYXlzdGFjaworLy8gKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYgb25seSksIGFuZCByZXR1cm4gYW4KKy8vIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuCisvLworLy8gVGhlIHtuZWVkbGUsaGF5c3RhY2t9X2V4cHIgYXJndW1lbnRzIGFyZSB0aGUgc3RyaW5naWZpZWQKKy8vIGV4cHJlc3Npb25zIHRoYXQgZ2VuZXJhdGVkIHRoZSB0d28gcmVhbCBhcmd1bWVudHMuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gSGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnRzLgorLy8KKy8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKKy8vCisvLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgYWN0dWFsKSB7CisgIGNvbnN0IEZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gbGhzKGV4cGVjdGVkKSwgcmhzKGFjdHVhbCk7CisKKyAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGV4cGVjdGVkX3NzOworICBleHBlY3RlZF9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgICAgIDw8IGV4cGVjdGVkOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gYWN0dWFsX3NzOworICBhY3R1YWxfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgICAgPDwgYWN0dWFsOworCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdTdHJlYW1Ub1N0cmluZygmZXhwZWN0ZWRfc3MpLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZhY3R1YWxfc3MpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpOworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8gQSBjbGFzcyB0aGF0IGVuYWJsZXMgb25lIHRvIHN0cmVhbSBtZXNzYWdlcyB0byBhc3NlcnRpb24gbWFjcm9zCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydEhlbHBlciB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgQXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKTsKKyAgfkFzc2VydEhlbHBlcigpOworCisgIC8vIE1lc3NhZ2UgYXNzaWdubWVudCBpcyBhIHNlbWFudGljIHRyaWNrIHRvIGVuYWJsZSBhc3NlcnRpb24KKyAgLy8gc3RyZWFtaW5nOyBzZWUgdGhlIEdURVNUX01FU1NBR0VfIG1hY3JvIGJlbG93LgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFdlIHB1dCBvdXIgZGF0YSBpbiBhIHN0cnVjdCBzbyB0aGF0IHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MgY2FuCisgIC8vIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBnY2MgaXMgaW5jYXBhYmxlIG9mCisgIC8vIHJlLXVzaW5nIHN0YWNrIHNwYWNlIGV2ZW4gZm9yIHRlbXBvcmFyeSB2YXJpYWJsZXMsIHNvIGV2ZXJ5IEVYUEVDVF9FUQorICAvLyByZXNlcnZlcyBzdGFjayBzcGFjZSBmb3IgYW5vdGhlciBBc3NlcnRIZWxwZXIuCisgIHN0cnVjdCBBc3NlcnRIZWxwZXJEYXRhIHsKKyAgICBBc3NlcnRIZWxwZXJEYXRhKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzcmNmaWxlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnKQorICAgICAgICA6IHR5cGUodCksIGZpbGUoc3JjZmlsZSksIGxpbmUobGluZV9udW0pLCBtZXNzYWdlKG1zZykgeyB9CisKKyAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSBjb25zdCB0eXBlOworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGU7CisgICAgaW50IGNvbnN0IGxpbmU7CisgICAgc3RkOjpzdHJpbmcgY29uc3QgbWVzc2FnZTsKKworICAgcHJpdmF0ZToKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFzc2VydEhlbHBlckRhdGEpOworICB9OworCisgIEFzc2VydEhlbHBlckRhdGEqIGNvbnN0IGRhdGFfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKy8vIFRoZSBwdXJlIGludGVyZmFjZSBjbGFzcyB0aGF0IGFsbCB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluaGVyaXQgZnJvbS4KKy8vIEEgdmFsdWUtcGFyYW1ldGVyaXplZCBjbGFzcyBtdXN0IGluaGVyaXQgZnJvbSBib3RoIDo6dGVzdGluZzo6VGVzdCBhbmQKKy8vIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3N0IGNhc2VzIHRoYXQganVzdCBtZWFucyBpbmhlcml0aW5nCisvLyBmcm9tIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbSwgYnV0IG1vcmUgY29tcGxpY2F0ZWQgdGVzdCBoaWVyYXJjaGllcworLy8gbWF5IG5lZWQgdG8gaW5oZXJpdCBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZSBhdCBkaWZmZXJlbnQgbGV2ZWxzLgorLy8KKy8vIFRoaXMgaW50ZXJmYWNlIGhhcyBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIHRlc3QgcGFyYW1ldGVyIHZhbHVlIHZpYQorLy8gdGhlIEdldFBhcmFtKCkgbWV0aG9kLgorLy8KKy8vIFVzZSBpdCB3aXRoIG9uZSBvZiB0aGUgcGFyYW1ldGVyIGdlbmVyYXRvciBkZWZpbmluZyBmdW5jdGlvbnMsIGxpa2UgUmFuZ2UoKSwKKy8vIFZhbHVlcygpLCBWYWx1ZXNJbigpLCBCb29sKCksIGFuZCBDb21iaW5lKCkuCisvLworLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7CisvLyAgcHJvdGVjdGVkOgorLy8gICBGb29UZXN0KCkgeworLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgorLy8gICB9CisvLyAgIHZpcnR1YWwgfkZvb1Rlc3QoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgorLy8gICB9CisvLyAgIHZpcnR1YWwgdm9pZCBUZWFyRG93biB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vIH07CisvLyBURVNUX1AoRm9vVGVzdCwgRG9lc0JhcikgeworLy8gICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgbWV0aG9kIGhlcmUuCisvLyAgIEZvbyBmb287CisvLyAgIEFTU0VSVF9UUlVFKGZvby5Eb2VzQmFyKEdldFBhcmFtKCkpKTsKKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE9uZVRvVGVuUmFuZ2UsIEZvb1Rlc3QsIDo6dGVzdGluZzo6UmFuZ2UoMSwgMTApKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBXaXRoUGFyYW1JbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIFBhcmFtVHlwZTsKKyAgdmlydHVhbCB+V2l0aFBhcmFtSW50ZXJmYWNlKCkge30KKworICAvLyBUaGUgY3VycmVudCBwYXJhbWV0ZXIgdmFsdWUuIElzIGFsc28gYXZhaWxhYmxlIGluIHRoZSB0ZXN0IGZpeHR1cmUncworICAvLyBjb25zdHJ1Y3Rvci4gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgbm9uLXN0YXRpYywgZXZlbiB0aG91Z2ggaXQgb25seQorICAvLyByZWZlcmVuY2VzIHN0YXRpYyBkYXRhLCB0byByZWR1Y2UgdGhlIG9wcG9ydHVuaXR5IGZvciBpbmNvcnJlY3QgdXNlcworICAvLyBsaWtlIHdyaXRpbmcgJ1dpdGhQYXJhbUludGVyZmFjZTxib29sPjo6R2V0UGFyYW0oKScgZm9yIGEgdGVzdCB0aGF0CisgIC8vIHVzZXMgYSBmaXh0dXJlIHdob3NlIHBhcmFtZXRlciB0eXBlIGlzIGludC4KKyAgY29uc3QgUGFyYW1UeXBlJiBHZXRQYXJhbSgpIGNvbnN0IHsgcmV0dXJuICpwYXJhbWV0ZXJfOyB9CisKKyBwcml2YXRlOgorICAvLyBTZXRzIHBhcmFtZXRlciB2YWx1ZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhlIHZhbHVlCisgIC8vIHJlbWFpbnMgYWxpdmUgYW5kIHVuY2hhbmdlZCB0aHJvdWdob3V0IHRoZSBjdXJyZW50IHRlc3QuCisgIHN0YXRpYyB2b2lkIFNldFBhcmFtKGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyKSB7CisgICAgcGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKKyAgfQorCisgIC8vIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBhY2Nlc3NpbmcgcGFyYW1ldGVyIGR1cmluZyBhIHRlc3QgbGlmZXRpbWUuCisgIHN0YXRpYyBjb25zdCBQYXJhbVR5cGUqIHBhcmFtZXRlcl87CisKKyAgLy8gVGVzdENsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBXaXRoUGFyYW1JbnRlcmZhY2U8VD4gYW5kIFRlc3QuCisgIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+IGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBXaXRoUGFyYW1JbnRlcmZhY2U8VD46OnBhcmFtZXRlcl8gPSBOVUxMOworCisvLyBNb3N0IHZhbHVlLXBhcmFtZXRlcml6ZWQgY2xhc3NlcyBjYW4gaWdub3JlIHRoZSBleGlzdGVuY2Ugb2YKKy8vIFdpdGhQYXJhbUludGVyZmFjZSwgYW5kIGNhbiBqdXN0IGluaGVyaXQgZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGVzdFdpdGhQYXJhbSA6IHB1YmxpYyBUZXN0LCBwdWJsaWMgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IHsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gTWFjcm9zIGZvciBpbmRpY2F0aW5nIHN1Y2Nlc3MvZmFpbHVyZSBpbiB0ZXN0IGNvZGUuCisKKy8vIEFERF9GQUlMVVJFIHVuY29uZGl0aW9uYWxseSBhZGRzIGEgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LgorLy8gU1VDQ0VFRCBnZW5lcmF0ZXMgYSBzdWNjZXNzIC0gaXQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlCisvLyBjdXJyZW50IHRlc3Qgc3VjY2Vzc2Z1bCwgYXMgYSB0ZXN0IGlzIG9ubHkgc3VjY2Vzc2Z1bCB3aGVuIGl0IGhhcworLy8gbm8gZmFpbHVyZS4KKy8vCisvLyBFWFBFQ1RfKiB2ZXJpZmllcyB0aGF0IGEgY2VydGFpbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLiAgSWYgbm90LAorLy8gaXQgYmVoYXZlcyBsaWtlIEFERF9GQUlMVVJFLiAgSW4gcGFydGljdWxhcjoKKy8vCisvLyAgIEVYUEVDVF9UUlVFICB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgdHJ1ZS4KKy8vICAgRVhQRUNUX0ZBTFNFIHZlcmlmaWVzIHRoYXQgYSBCb29sZWFuIGNvbmRpdGlvbiBpcyBmYWxzZS4KKy8vCisvLyBGQUlMIGFuZCBBU1NFUlRfKiBhcmUgc2ltaWxhciB0byBBRERfRkFJTFVSRSBhbmQgRVhQRUNUXyosIGV4Y2VwdAorLy8gdGhhdCB0aGV5IHdpbGwgYWxzbyBhYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbiBvbiBmYWlsdXJlLiAgUGVvcGxlCisvLyB1c3VhbGx5IHdhbnQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBGQUlMIGFuZCBBU1NFUlRfKiwgYnV0IHRob3NlCisvLyB3cml0aW5nIGRhdGEtZHJpdmVuIHRlc3RzIG9mdGVuIGZpbmQgdGhlbXNlbHZlcyB1c2luZyBBRERfRkFJTFVSRQorLy8gYW5kIEVYUEVDVF8qIG1vcmUuCisKKy8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgQUREX0ZBSUxVUkUoKSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXygiRmFpbGVkIikKKworLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZSBhdCB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gd2l0aAorLy8gYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEFERF9GQUlMVVJFX0FUKGZpbGUsIGxpbmUpIFwKKyAgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgIkZhaWxlZCIsIFwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKKworLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9GQUlMKCkgR1RFU1RfRkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBGQUlMKCksIHdoaWNoIGlzIGEKKy8vIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9GQUlMCisjIGRlZmluZSBGQUlMKCkgR1RFU1RfRkFJTCgpCisjZW5kaWYKKworLy8gR2VuZXJhdGVzIGEgc3VjY2VzcyB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9TVUNDRUVEKCkgR1RFU1RfU1VDQ0VTU18oIlN1Y2NlZWRlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBTVUNDRUVEKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9TVUNDRUVECisjIGRlZmluZSBTVUNDRUVEKCkgR1RFU1RfU1VDQ0VFRCgpCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGV4Y2VwdGlvbnMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIHRoZSBleHBlY3RlZCBleGNlcHRpb24uCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9OT19USFJPVyhzdGF0ZW1lbnQpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgZG9lc24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fQU5ZX1RIUk9XKHN0YXRlbWVudCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorCisjZGVmaW5lIEVYUEVDVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKy8vIEJvb2xlYW4gYXNzZXJ0aW9ucy4gQ29uZGl0aW9uIGNhbiBiZSBlaXRoZXIgYSBCb29sZWFuIGV4cHJlc3Npb24gb3IgYW4KKy8vIEFzc2VydGlvblJlc3VsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBBc3NlcnRpb25SZXN1bHQgd2l0aAorLy8gdGhlc2UgbWFjcm9zIHNlZSBjb21tZW50cyBvbiB0aGF0IGNsYXNzLgorI2RlZmluZSBFWFBFQ1RfVFJVRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyhjb25kaXRpb24sICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9GQUxTRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9UUlVFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0ZBTFNFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gSW5jbHVkZXMgdGhlIGF1dG8tZ2VuZXJhdGVkIGhlYWRlciB0aGF0IGltcGxlbWVudHMgYSBmYW1pbHkgb2YKKy8vIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAxMC8zMS8yMDExIGJ5IGNvbW1hbmQKKy8vICdnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IDUnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBJbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKworLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyMgZXJyb3IgRG8gbm90IGluY2x1ZGUgZ3Rlc3RfcHJlZF9pbXBsLmggZGlyZWN0bHkuICBJbmNsdWRlIGd0ZXN0LmggaW5zdGVhZC4KKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbgorLy8gbWFjcm9zOgorLy8KKy8vICAgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZF9mb3JtYXQgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgdGFrZXMgbiAoaW4gdGhlCisvLyBjYXNlIG9mIEFTU0VSVF9QUkVEX0ZPUk1BVG4pIHZhbHVlcyBhbmQgdGhlaXIgc291cmNlIGV4cHJlc3Npb24KKy8vIHRleHQsIGFuZCByZXR1cm5zIGEgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LiAgU2VlIHRoZSBkZWZpbml0aW9uCisvLyBvZiBBU1NFUlRfRVEgaW4gZ3Rlc3QuaCBmb3IgYW4gZXhhbXBsZS4KKy8vCisvLyBJZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBmb3JtYXR0aW5nLCB5b3UgY2FuIHVzZSB0aGUgbW9yZQorLy8gcmVzdHJpY3RpdmUgdmVyc2lvbjoKKy8vCisvLyAgIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkKKy8vICAgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZCBpcyBhbiBuLWFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgcmV0dXJucyBib29sLAorLy8gYW5kIHRoZSB2YWx1ZXMgdjEsIHYyLCAuLi4sIG11c3Qgc3VwcG9ydCB0aGUgPDwgb3BlcmF0b3IgZm9yCisvLyBzdHJlYW1pbmcgdG8gc3RkOjpvc3RyZWFtLgorLy8KKy8vIFdlIGFsc28gZGVmaW5lIHRoZSBFWFBFQ1RfKiB2YXJpYXRpb25zLgorLy8KKy8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHByZWRpY2F0ZXMgd2hvc2UgYXJpdHkgaXMgYXQgbW9zdCA1LgorLy8gUGxlYXNlIGVtYWlsIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAorLy8gc3VwcG9ydCBmb3IgaGlnaGVyIGFyaXRpZXMuCisKKy8vIEdURVNUX0FTU0VSVF8gaXMgdGhlIGJhc2ljIHN0YXRlbWVudCB0byB3aGljaCBhbGwgb2YgdGhlIGFzc2VydGlvbnMKKy8vIGluIHRoaXMgZmlsZSByZWR1Y2UuICBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisKKyNkZWZpbmUgR1RFU1RfQVNTRVJUXyhleHByZXNzaW9uLCBvbl9mYWlsdXJlKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gKGV4cHJlc3Npb24pKSBcCisgICAgOyBcCisgIGVsc2UgXAorICAgIG9uX2ZhaWx1cmUoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQxSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSB7CisgIGlmIChwcmVkKHYxKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQxLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCB2MSksIFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMUhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSksIG9uX2ZhaWx1cmUpCisKKy8vIFVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMShwcmVkLCB2MSkgXAorICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkgXAorICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQySGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgeworICBpZiAocHJlZCh2MSwgdjIpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MjsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQyLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCB2MSwgdjIpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQySGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyKSwgb25fZmFpbHVyZSkKKworLy8gQmluYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQyKHByZWQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCisgICAgICAgICAgdHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDM+CitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDNIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgeworICBpZiAocHJlZCh2MSwgdjIsIHYzKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzOworfQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDMuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsIHYxLCB2MiwgdjMpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkM0hlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MyksIG9uX2ZhaWx1cmUpCisKKy8vIFRlcm5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDMocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQzKHByZWQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzLAorICAgICAgICAgIHR5cGVuYW1lIFQ0PgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ0SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0KSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNCA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NDsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ0LgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCB2MSwgdjIsIHYzLCB2NCksIFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNEhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCksIG9uX2ZhaWx1cmUpCisKKy8vIDQtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzLAorICAgICAgICAgIHR5cGVuYW1lIFQ0LAorICAgICAgICAgIHR5cGVuYW1lIFQ1PgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ1SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgeworICBpZiAocHJlZCh2MSwgdjIsIHYzLCB2NCwgdjUpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU0IDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTUgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ1LgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsICN2NCwgI3Y1LCB2MSwgdjIsIHYzLCB2NCwgdjUpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ1SGVscGVyKCNwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY1KSwgb25fZmFpbHVyZSkKKworLy8gNS1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDUocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ1KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKworLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGVxdWFsaXRpZXMgYW5kIGluZXF1YWxpdGllcy4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9FUShleHBlY3RlZCwgYWN0dWFsKTogVGVzdHMgdGhhdCBleHBlY3RlZCA9PSBhY3R1YWwKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05FKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxICE9IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9MVCh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA8IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9MRSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA8PSB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fR1QodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPiB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fR0UodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPj0gdjIKKy8vCisvLyBXaGVuIHRoZXkgYXJlIG5vdCwgR29vZ2xlIFRlc3QgcHJpbnRzIGJvdGggdGhlIHRlc3RlZCBleHByZXNzaW9ucyBhbmQKKy8vIHRoZWlyIGFjdHVhbCB2YWx1ZXMuICBUaGUgdmFsdWVzIG11c3QgYmUgY29tcGF0aWJsZSBidWlsdC1pbiB0eXBlcywKKy8vIG9yIHlvdSB3aWxsIGdldCBhIGNvbXBpbGVyIGVycm9yLiAgQnkgImNvbXBhdGlibGUiIHdlIG1lYW4gdGhhdCB0aGUKKy8vIHZhbHVlcyBjYW4gYmUgY29tcGFyZWQgYnkgdGhlIHJlc3BlY3RpdmUgb3BlcmF0b3IuCisvLworLy8gTm90ZToKKy8vCisvLyAgIDEuIEl0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYSB1c2VyLWRlZmluZWQgdHlwZSB3b3JrIHdpdGgKKy8vICAge0FTU0VSVHxFWFBFQ1R9Xz8/KCksIGJ1dCB0aGF0IHJlcXVpcmVzIG92ZXJsb2FkaW5nIHRoZQorLy8gICBjb21wYXJpc29uIG9wZXJhdG9ycyBhbmQgaXMgdGh1cyBkaXNjb3VyYWdlZCBieSB0aGUgR29vZ2xlIEMrKworLy8gICBVc2FnZSBHdWlkZS4gIFRoZXJlZm9yZSwgeW91IGFyZSBhZHZpc2VkIHRvIHVzZSB0aGUKKy8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUoKSBtYWNybyB0byBhc3NlcnQgdGhhdCB0d28gb2JqZWN0cyBhcmUKKy8vICAgZXF1YWwuCisvLworLy8gICAyLiBUaGUge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zIGRvIHBvaW50ZXIgY29tcGFyaXNvbnMgb24KKy8vICAgcG9pbnRlcnMgKGluIHBhcnRpY3VsYXIsIEMgc3RyaW5ncykuICBUaGVyZWZvcmUsIGlmIHlvdSB1c2UgaXQKKy8vICAgd2l0aCB0d28gQyBzdHJpbmdzLCB5b3UgYXJlIHRlc3RpbmcgaG93IHRoZWlyIGxvY2F0aW9ucyBpbiBtZW1vcnkKKy8vICAgYXJlIHJlbGF0ZWQsIG5vdCBob3cgdGhlaXIgY29udGVudCBpcyByZWxhdGVkLiAgVG8gY29tcGFyZSB0d28gQworLy8gICBzdHJpbmdzIGJ5IGNvbnRlbnQsIHVzZSB7QVNTRVJUfEVYUEVDVH1fU1RSKigpLgorLy8KKy8vICAgMy4ge0FTU0VSVHxFWFBFQ1R9X0VRKGV4cGVjdGVkLCBhY3R1YWwpIGlzIHByZWZlcnJlZCB0bworLy8gICB7QVNTRVJUfEVYUEVDVH1fVFJVRShleHBlY3RlZCA9PSBhY3R1YWwpLCBhcyB0aGUgZm9ybWVyIHRlbGxzIHlvdQorLy8gICB3aGF0IHRoZSBhY3R1YWwgdmFsdWUgaXMgd2hlbiBpdCBmYWlscywgYW5kIHNpbWlsYXJseSBmb3IgdGhlCisvLyAgIG90aGVyIGNvbXBhcmlzb25zLgorLy8KKy8vICAgNC4gRG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2gge0FTU0VSVHxFWFBFQ1R9Xz8/KCkKKy8vICAgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzLCB3aGljaCBpcyB1bmRlZmluZWQuCisvLworLy8gICA1LiBUaGVzZSBtYWNyb3MgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzIGV4YWN0bHkgb25jZS4KKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEVYUEVDVF9ORSg1LCBGb28oKSk7CisvLyAgIEVYUEVDVF9FUShOVUxMLCBhX3BvaW50ZXIpOworLy8gICBBU1NFUlRfTFQoaSwgYXJyYXlfc2l6ZSk7CisvLyAgIEFTU0VSVF9HVChyZWNvcmRzLnNpemUoKSwgMCkgPDwgIlRoZXJlIGlzIG5vIHJlY29yZCBsZWZ0LiI7CisKKyNkZWZpbmUgRVhQRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjogXAorICAgICAgICAgICAgICAgICAgICAgIEVxSGVscGVyPEdURVNUX0lTX05VTExfTElURVJBTF8oZXhwZWN0ZWQpPjo6Q29tcGFyZSwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9ORShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTkUsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9MRSh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTEUsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9MVCh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTFQsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9HRSh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR0UsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9HVCh2YWwxLCB2YWwyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR1QsIHZhbDEsIHZhbDIpCisKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0VRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjogXAorICAgICAgICAgICAgICAgICAgICAgIEVxSGVscGVyPEdURVNUX0lTX05VTExfTElURVJBTF8oZXhwZWN0ZWQpPjo6Q29tcGFyZSwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTkUsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEdURVNUX0FTU0VSVF9MRSh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTEUsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEdURVNUX0FTU0VSVF9MVCh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTFQsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR0UsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEdURVNUX0FTU0VSVF9HVCh2YWwxLCB2YWwyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR1QsIHZhbDEsIHZhbDIpCisKKy8vIERlZmluZSBtYWNybyBHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfWFkgdG8gMSB0byBvbWl0IHRoZSBkZWZpbml0aW9uIG9mCisvLyBBU1NFUlRfWFkoKSwgd2hpY2ggY2xhc2hlcyB3aXRoIHNvbWUgdXNlcnMnIG93biBjb2RlLgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9FUQorIyBkZWZpbmUgQVNTRVJUX0VRKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9FUSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX05FCisjIGRlZmluZSBBU1NFUlRfTkUodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX05FKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTEUKKyMgZGVmaW5lIEFTU0VSVF9MRSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTEUodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9MVAorIyBkZWZpbmUgQVNTRVJUX0xUKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9MVCh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dFCisjIGRlZmluZSBBU1NFUlRfR0UodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0dFKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfR1QKKyMgZGVmaW5lIEFTU0VSVF9HVCh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfR1QodmFsMSwgdmFsMikKKyNlbmRpZgorCisvLyBDLXN0cmluZyBDb21wYXJpc29ucy4gIEFsbCB0ZXN0cyB0cmVhdCBOVUxMIGFuZCBhbnkgbm9uLU5VTEwgc3RyaW5nCisvLyBhcyBkaWZmZXJlbnQuICBUd28gTlVMTHMgYXJlIGVxdWFsLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkVRKHMxLCBzMik6ICAgICBUZXN0cyB0aGF0IHMxID09IHMyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJORShzMSwgczIpOiAgICAgVGVzdHMgdGhhdCBzMSAhPSBzMgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRKHMxLCBzMik6IFRlc3RzIHRoYXQgczEgPT0gczIsIGlnbm9yaW5nIGNhc2UKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORShzMSwgczIpOiBUZXN0cyB0aGF0IHMxICE9IHMyLCBpZ25vcmluZyBjYXNlCisvLworLy8gRm9yIHdpZGUgb3IgbmFycm93IHN0cmluZyBvYmplY3RzLCB5b3UgY2FuIHVzZSB0aGUKKy8vIHtBU1NFUlR8RVhQRUNUfV8/PygpIG1hY3Jvcy4KKy8vCisvLyBEb24ndCBkZXBlbmQgb24gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCwKKy8vIHdoaWNoIGlzIHVuZGVmaW5lZC4KKy8vCisvLyBUaGVzZSBtYWNyb3MgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzIGV4YWN0bHkgb25jZS4KKworI2RlZmluZSBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfU1RSTkUoczEsIHMyKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSTkUsIHMxLCBzMikKKyNkZWZpbmUgRVhQRUNUX1NUUkNBU0VFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRU5FKHMxLCBzMilcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRU5FLCBzMSwgczIpCisKKyNkZWZpbmUgQVNTRVJUX1NUUkVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgQVNTRVJUX1NUUk5FKHMxLCBzMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUk5FLCBzMSwgczIpCisjZGVmaW5lIEFTU0VSVF9TVFJDQVNFRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgQVNTRVJUX1NUUkNBU0VORShzMSwgczIpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VORSwgczEsIHMyKQorCisvLyBNYWNyb3MgZm9yIGNvbXBhcmluZyBmbG9hdGluZy1wb2ludCBudW1iZXJzLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0ZMT0FUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBmbG9hdCB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbC4KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0d28gZG91YmxlIHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTkVBUih2MSwgdjIsIGFic19lcnJvcik6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdjEgYW5kIHYyIGFyZSB3aXRoaW4gdGhlIGdpdmVuIGRpc3RhbmNlIHRvIGVhY2ggb3RoZXIuCisvLworLy8gR29vZ2xlIFRlc3QgdXNlcyBVTFAtYmFzZWQgY29tcGFyaXNvbiB0byBhdXRvbWF0aWNhbGx5IHBpY2sgYSBkZWZhdWx0CisvLyBlcnJvciBib3VuZCB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgb3BlcmFuZHMuICBTZWUgdGhlCisvLyBGbG9hdGluZ1BvaW50IHRlbXBsYXRlIGNsYXNzIGluIGd0ZXN0LWludGVybmFsLmggaWYgeW91IGFyZQorLy8gaW50ZXJlc3RlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KKworI2RlZmluZSBFWFBFQ1RfRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgRVhQRUNUX0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZG91YmxlPiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgQVNTRVJUX0ZMT0FUX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxmbG9hdD4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEFTU0VSVF9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGRvdWJsZT4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEVYUEVDVF9ORUFSKHZhbDEsIHZhbDIsIGFic19lcnJvcilcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RG91YmxlTmVhclByZWRGb3JtYXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCBhYnNfZXJyb3IpCisKKyNkZWZpbmUgQVNTRVJUX05FQVIodmFsMSwgdmFsMiwgYWJzX2Vycm9yKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMyg6OnRlc3Rpbmc6OmludGVybmFsOjpEb3VibGVOZWFyUHJlZEZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikKKworLy8gVGhlc2UgcHJlZGljYXRlIGZvcm1hdCBmdW5jdGlvbnMgd29yayBvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMsIGFuZAorLy8gY2FuIGJlIHVzZWQgaW4ge0FTU0VSVHxFWFBFQ1R9X1BSRURfRk9STUFUMiooKSwgZS5nLgorLy8KKy8vICAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpEb3VibGVMRSwgRm9vKCksIDUuMCk7CisKKy8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKKy8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRmxvYXRMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbDEsIGZsb2F0IHZhbDIpOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRG91YmxlTEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsIGRvdWJsZSB2YWwyKTsKKworCisjaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyBNYWNyb3MgdGhhdCB0ZXN0IGZvciBIUkVTVUxUIGZhaWx1cmUgYW5kIHN1Y2Nlc3MsIHRoZXNlIGFyZSBvbmx5IHVzZWZ1bAorLy8gb24gV2luZG93cywgYW5kIHJlbHkgb24gV2luZG93cyBTREsgbWFjcm9zIGFuZCBBUElzIHRvIGNvbXBpbGUuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fSFJFU1VMVF97U1VDQ0VFREVEfEZBSUxFRH0oZXhwcikKKy8vCisvLyBXaGVuIGV4cHIgdW5leHBlY3RlZGx5IGZhaWxzIG9yIHN1Y2NlZWRzLCBHb29nbGUgVGVzdCBwcmludHMgdGhlCisvLyBleHBlY3RlZCByZXN1bHQgYW5kIHRoZSBhY3R1YWwgcmVzdWx0IHdpdGggYm90aCBhIGh1bWFuLXJlYWRhYmxlCisvLyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yLCBpZiBhdmFpbGFibGUsIGFzIHdlbGwgYXMgdGhlCisvLyBoZXggcmVzdWx0IGNvZGUuCisjIGRlZmluZSBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoZXhwcikgXAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxUU3VjY2VzcywgKGV4cHIpKQorCisjIGRlZmluZSBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoZXhwcikgXAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxUU3VjY2VzcywgKGV4cHIpKQorCisjIGRlZmluZSBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoZXhwcikgXAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxURmFpbHVyZSwgKGV4cHIpKQorCisjIGRlZmluZSBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoZXhwcikgXAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxURmFpbHVyZSwgKGV4cHIpKQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gTWFjcm9zIHRoYXQgZXhlY3V0ZSBzdGF0ZW1lbnQgYW5kIGNoZWNrIHRoYXQgaXQgZG9lc24ndCBnZW5lcmF0ZSBuZXcgZmF0YWwKKy8vIGZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZC4KKy8vCisvLyAgICoge0FTU0VSVHxFWFBFQ1R9X05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KTsKKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKFByb2Nlc3MoKSk7CisvLyAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFByb2Nlc3MoKSkgPDwgIlByb2Nlc3MoKSBmYWlsZWQiOworLy8KKyNkZWZpbmUgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KSBcCisgICAgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpIFwKKyAgICBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisKKy8vIENhdXNlcyBhIHRyYWNlIChpbmNsdWRpbmcgdGhlIHNvdXJjZSBmaWxlIHBhdGgsIHRoZSBjdXJyZW50IGxpbmUKKy8vIG51bWJlciwgYW5kIHRoZSBnaXZlbiBtZXNzYWdlKSB0byBiZSBpbmNsdWRlZCBpbiBldmVyeSB0ZXN0IGZhaWx1cmUKKy8vIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IGNvZGUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBUaGUgZWZmZWN0IGlzCisvLyB1bmRvbmUgd2hlbiB0aGUgY29udHJvbCBsZWF2ZXMgdGhlIGN1cnJlbnQgc2NvcGUuCisvLworLy8gVGhlIG1lc3NhZ2UgYXJndW1lbnQgY2FuIGJlIGFueXRoaW5nIHN0cmVhbWFibGUgdG8gc3RkOjpvc3RyZWFtLgorLy8KKy8vIEluIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2UgaW5jbHVkZSB0aGUgY3VycmVudCBsaW5lIG51bWJlciBhcyBwYXJ0CisvLyBvZiB0aGUgZHVtbXkgdmFyaWFibGUgbmFtZSwgdGh1cyBhbGxvd2luZyBtdWx0aXBsZSBTQ09QRURfVFJBQ0UoKXMKKy8vIHRvIGFwcGVhciBpbiB0aGUgc2FtZSBibG9jayAtIGFzIGxvbmcgYXMgdGhleSBhcmUgb24gZGlmZmVyZW50CisvLyBsaW5lcy4KKyNkZWZpbmUgU0NPUEVEX1RSQUNFKG1lc3NhZ2UpIFwKKyAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2NvcGVkVHJhY2UgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF90cmFjZV8sIF9fTElORV9fKShcCisgICAgX19GSUxFX18sIF9fTElORV9fLCA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAobWVzc2FnZSkpCisKKy8vIENvbXBpbGUtdGltZSBhc3NlcnRpb24gZm9yIHR5cGUgZXF1YWxpdHkuCisvLyBTdGF0aWNBc3NlcnRUeXBlRXE8dHlwZTEsIHR5cGUyPigpIGNvbXBpbGVzIGlmZiB0eXBlMSBhbmQgdHlwZTIgYXJlCisvLyB0aGUgc2FtZSB0eXBlLiAgVGhlIHZhbHVlIGl0IHJldHVybnMgaXMgbm90IGludGVyZXN0aW5nLgorLy8KKy8vIEluc3RlYWQgb2YgbWFraW5nIFN0YXRpY0Fzc2VydFR5cGVFcSBhIGNsYXNzIHRlbXBsYXRlLCB3ZSBtYWtlIGl0IGEKKy8vIGZ1bmN0aW9uIHRlbXBsYXRlIHRoYXQgaW52b2tlcyBhIGhlbHBlciBjbGFzcyB0ZW1wbGF0ZS4gIFRoaXMKKy8vIHByZXZlbnRzIGEgdXNlciBmcm9tIG1pc3VzaW5nIFN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+IGJ5CisvLyBkZWZpbmluZyBvYmplY3RzIG9mIHRoYXQgdHlwZS4KKy8vCisvLyBDQVZFQVQ6CisvLworLy8gV2hlbiB1c2VkIGluc2lkZSBhIG1ldGhvZCBvZiBhIGNsYXNzIHRlbXBsYXRlLAorLy8gU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4oKSBpcyBlZmZlY3RpdmUgT05MWSBJRiB0aGUgbWV0aG9kIGlzCisvLyBpbnN0YW50aWF0ZWQuICBGb3IgZXhhbXBsZSwgZ2l2ZW46CisvLworLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgRm9vIHsKKy8vICAgIHB1YmxpYzoKKy8vICAgICB2b2lkIEJhcigpIHsgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPGludCwgVD4oKTsgfQorLy8gICB9OworLy8KKy8vIHRoZSBjb2RlOgorLy8KKy8vICAgdm9pZCBUZXN0MSgpIHsgRm9vPGJvb2w+IGZvbzsgfQorLy8KKy8vIHdpbGwgTk9UIGdlbmVyYXRlIGEgY29tcGlsZXIgZXJyb3IsIGFzIEZvbzxib29sPjo6QmFyKCkgaXMgbmV2ZXIKKy8vIGFjdHVhbGx5IGluc3RhbnRpYXRlZC4gIEluc3RlYWQsIHlvdSBuZWVkOgorLy8KKy8vICAgdm9pZCBUZXN0MigpIHsgRm9vPGJvb2w+IGZvbzsgZm9vLkJhcigpOyB9CisvLworLy8gdG8gY2F1c2UgYSBjb21waWxlciBlcnJvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Citib29sIFN0YXRpY0Fzc2VydFR5cGVFcSgpIHsKKyAgKHZvaWQpaW50ZXJuYWw6OlN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjxUMSwgVDI+KCk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBEZWZpbmVzIGEgdGVzdC4KKy8vCisvLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UsIGFuZCB0aGUgc2Vjb25kCisvLyBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3Qgd2l0aGluIHRoZSB0ZXN0IGNhc2UuCisvLworLy8gVGhlIGNvbnZlbnRpb24gaXMgdG8gZW5kIHRoZSB0ZXN0IGNhc2UgbmFtZSB3aXRoICJUZXN0Ii4gIEZvcgorLy8gZXhhbXBsZSwgYSB0ZXN0IGNhc2UgZm9yIHRoZSBGb28gY2xhc3MgY2FuIGJlIG5hbWVkIEZvb1Rlc3QuCisvLworLy8gVGhlIHVzZXIgc2hvdWxkIHB1dCBoaXMgdGVzdCBjb2RlIGJldHdlZW4gYnJhY2VzIGFmdGVyIHVzaW5nIHRoaXMKKy8vIG1hY3JvLiAgRXhhbXBsZToKKy8vCisvLyAgIFRFU1QoRm9vVGVzdCwgSW5pdGlhbGl6ZXNDb3JyZWN0bHkpIHsKKy8vICAgICBGb28gZm9vOworLy8gICAgIEVYUEVDVF9UUlVFKGZvby5TdGF0dXNJc09LKCkpOworLy8gICB9CisKKy8vIE5vdGUgdGhhdCB3ZSBjYWxsIEdldFRlc3RUeXBlSWQoKSBpbnN0ZWFkIG9mIEdldFR5cGVJZDwKKy8vIDo6dGVzdGluZzo6VGVzdD4oKSBoZXJlIHRvIGdldCB0aGUgdHlwZSBJRCBvZiB0ZXN0aW5nOjpUZXN0LiAgVGhpcworLy8gaXMgdG8gd29yayBhcm91bmQgYSBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIHVzaW5nIEdvb2dsZSBUZXN0IGFzCisvLyBhIGZyYW1ld29yayBvbiBNYWMgT1MgWC4gIFRoZSBidWcgY2F1c2VzIEdldFR5cGVJZDwKKy8vIDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcgb24gd2hldGhlcgorLy8gdGhlIGNhbGwgaXMgZnJvbSB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrIGl0c2VsZiBvciBmcm9tIHVzZXIgdGVzdAorLy8gY29kZS4gIEdldFRlc3RUeXBlSWQoKSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUKKy8vIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZSBHb29nbGUgVGVzdAorLy8gZnJhbWV3b3JrLgorI2RlZmluZSBHVEVTVF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAorICBHVEVTVF9URVNUXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpKQorCisvLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgVEVTVCgpLCB3aGljaAorLy8gaXMgYSBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfVEVTVAorIyBkZWZpbmUgVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBHVEVTVF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpCisjZW5kaWYKKworLy8gRGVmaW5lcyBhIHRlc3QgdGhhdCB1c2VzIGEgdGVzdCBmaXh0dXJlLgorLy8KKy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcywgd2hpY2gKKy8vIGFsc28gZG91YmxlcyBhcyB0aGUgdGVzdCBjYXNlIG5hbWUuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUKKy8vIG5hbWUgb2YgdGhlIHRlc3Qgd2l0aGluIHRoZSB0ZXN0IGNhc2UuCisvLworLy8gQSB0ZXN0IGZpeHR1cmUgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBlYXJsaWVyLiAgVGhlIHVzZXIgc2hvdWxkIHB1dAorLy8gaGlzIHRlc3QgY29kZSBiZXR3ZWVuIGJyYWNlcyBhZnRlciB1c2luZyB0aGlzIG1hY3JvLiAgRXhhbXBsZToKKy8vCisvLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisvLyAgICBwcm90ZWN0ZWQ6CisvLyAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyBiXy5BZGRFbGVtZW50KDMpOyB9CisvLworLy8gICAgIEZvbyBhXzsKKy8vICAgICBGb28gYl87CisvLyAgIH07CisvLworLy8gICBURVNUX0YoRm9vVGVzdCwgSW5pdGlhbGl6ZXNDb3JyZWN0bHkpIHsKKy8vICAgICBFWFBFQ1RfVFJVRShhXy5TdGF0dXNJc09LKCkpOworLy8gICB9CisvLworLy8gICBURVNUX0YoRm9vVGVzdCwgUmV0dXJuc0VsZW1lbnRDb3VudENvcnJlY3RseSkgeworLy8gICAgIEVYUEVDVF9FUSgwLCBhXy5zaXplKCkpOworLy8gICAgIEVYUEVDVF9FUSgxLCBiXy5zaXplKCkpOworLy8gICB9CisKKyNkZWZpbmUgVEVTVF9GKHRlc3RfZml4dHVyZSwgdGVzdF9uYW1lKVwKKyAgR1RFU1RfVEVTVF8odGVzdF9maXh0dXJlLCB0ZXN0X25hbWUsIHRlc3RfZml4dHVyZSwgXAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUeXBlSWQ8dGVzdF9maXh0dXJlPigpKQorCisvLyBVc2UgdGhpcyBtYWNybyBpbiBtYWluKCkgdG8gcnVuIGFsbCB0ZXN0cy4gIEl0IHJldHVybnMgMCBpZiBhbGwKKy8vIHRlc3RzIGFyZSBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KKy8vCisvLyBSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGNvbW1hbmQgbGluZSBoYXMgYmVlbgorLy8gcGFyc2VkIGJ5IEluaXRHb29nbGVUZXN0KCkuCisKKyNkZWZpbmUgUlVOX0FMTF9URVNUUygpXAorICAoOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UnVuKCkpCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwMjgyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK0dURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHByaW50ZigiUnVubmluZyBtYWluKCkgZnJvbSBndGVzdF9tYWluLmNjXG4iKTsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tNC9hY3hfcHRocmVhZC5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbTQvYWN4X3B0aHJlYWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMjBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbTQvYWN4X3B0aHJlYWQubTQKQEAgLTAsMCArMSwzNjMgQEAKKyMgVGhpcyB3YXMgcmV0cmlldmVkIGZyb20KKyMgICAgaHR0cDovL3N2bi4wcG9pbnRlci5kZS92aWV3dmMvdHJ1bmsvY29tbW9uL2FjeF9wdGhyZWFkLm00P3JldmlzaW9uPTEyNzcmcm9vdD1hdmFoaQorIyBTZWUgYWxzbyAocGVyaGFwcyBmb3IgbmV3IHZlcnNpb25zPykKKyMgICAgaHR0cDovL3N2bi4wcG9pbnRlci5kZS92aWV3dmMvdHJ1bmsvY29tbW9uL2FjeF9wdGhyZWFkLm00P3Jvb3Q9YXZhaGkKKyMKKyMgV2UndmUgcmV3cml0dGVuIHRoZSBpbmNvbnNpc3RlbmN5IGNoZWNrIGNvZGUgKGZyb20gYXZhaGkpLCB0byB3b3JrCisjIG1vcmUgYnJvYWRseS4gIEluIHBhcnRpY3VsYXIsIGl0IG5vIGxvbmdlciBhc3N1bWVzIGxkIGFjY2VwdHMgLXpkZWZzLgorIyBUaGlzIGNhdXNlZCBhIHJlc3RydWN0aW5nIG9mIHRoZSBjb2RlLCBidXQgdGhlIGZ1bmN0aW9uYWxpdHkgaGFzIG9ubHkKKyMgY2hhbmdlZCBhIGxpdHRsZS4KKworZG5sIEBzeW5vcHNpcyBBQ1hfUFRIUkVBRChbQUNUSU9OLUlGLUZPVU5EWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dKQorZG5sCitkbmwgQHN1bW1hcnkgZmlndXJlIG91dCBob3cgdG8gYnVpbGQgQyBwcm9ncmFtcyB1c2luZyBQT1NJWCB0aHJlYWRzCitkbmwKK2RubCBUaGlzIG1hY3JvIGZpZ3VyZXMgb3V0IGhvdyB0byBidWlsZCBDIHByb2dyYW1zIHVzaW5nIFBPU0lYIHRocmVhZHMuCitkbmwgSXQgc2V0cyB0aGUgUFRIUkVBRF9MSUJTIG91dHB1dCB2YXJpYWJsZSB0byB0aGUgdGhyZWFkcyBsaWJyYXJ5IGFuZAorZG5sIGxpbmtlciBmbGFncywgYW5kIHRoZSBQVEhSRUFEX0NGTEFHUyBvdXRwdXQgdmFyaWFibGUgdG8gYW55IHNwZWNpYWwKK2RubCBDIGNvbXBpbGVyIGZsYWdzIHRoYXQgYXJlIG5lZWRlZC4gKFRoZSB1c2VyIGNhbiBhbHNvIGZvcmNlIGNlcnRhaW4KK2RubCBjb21waWxlciBmbGFncy9saWJzIHRvIGJlIHRlc3RlZCBieSBzZXR0aW5nIHRoZXNlIGVudmlyb25tZW50CitkbmwgdmFyaWFibGVzLikKK2RubAorZG5sIEFsc28gc2V0cyBQVEhSRUFEX0NDIHRvIGFueSBzcGVjaWFsIEMgY29tcGlsZXIgdGhhdCBpcyBuZWVkZWQgZm9yCitkbmwgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMgKGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBDQyBvdGhlcndpc2UpLgorZG5sIChUaGlzIGlzIG5lY2Vzc2FyeSBvbiBBSVggdG8gdXNlIHRoZSBzcGVjaWFsIGNjX3IgY29tcGlsZXIgYWxpYXMuKQorZG5sCitkbmwgTk9URTogWW91IGFyZSBhc3N1bWVkIHRvIG5vdCBvbmx5IGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggdGhlc2UKK2RubCBmbGFncywgYnV0IGFsc28gbGluayBpdCB3aXRoIHRoZW0gYXMgd2VsbC4gZS5nLiB5b3Ugc2hvdWxkIGxpbmsKK2RubCB3aXRoICRQVEhSRUFEX0NDICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTICRMREZMQUdTIC4uLiAkUFRIUkVBRF9MSUJTCitkbmwgJExJQlMKK2RubAorZG5sIElmIHlvdSBhcmUgb25seSBidWlsZGluZyB0aHJlYWRzIHByb2dyYW1zLCB5b3UgbWF5IHdpc2ggdG8gdXNlCitkbmwgdGhlc2UgdmFyaWFibGVzIGluIHlvdXIgZGVmYXVsdCBMSUJTLCBDRkxBR1MsIGFuZCBDQzoKK2RubAorZG5sICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorZG5sICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorZG5sICAgICAgICBDQz0iJFBUSFJFQURfQ0MiCitkbmwKK2RubCBJbiBhZGRpdGlvbiwgaWYgdGhlIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRocmVhZC1hdHRyaWJ1dGUKK2RubCBjb25zdGFudCBoYXMgYSBub25zdGFuZGFyZCBuYW1lLCBkZWZpbmVzIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRvCitkbmwgdGhhdCBuYW1lIChlLmcuIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQgb24gQUlYKS4KK2RubAorZG5sIEFDVElPTi1JRi1GT1VORCBpcyBhIGxpc3Qgb2Ygc2hlbGwgY29tbWFuZHMgdG8gcnVuIGlmIGEgdGhyZWFkcworZG5sIGxpYnJhcnkgaXMgZm91bmQsIGFuZCBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGEgbGlzdCBvZiBjb21tYW5kcyB0bworZG5sIHJ1biBpdCBpZiBpdCBpcyBub3QgZm91bmQuIElmIEFDVElPTi1JRi1GT1VORCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKK2RubCBkZWZhdWx0IGFjdGlvbiB3aWxsIGRlZmluZSBIQVZFX1BUSFJFQUQuCitkbmwKK2RubCBQbGVhc2UgbGV0IHRoZSBhdXRob3JzIGtub3cgaWYgdGhpcyBtYWNybyBmYWlscyBvbiBhbnkgcGxhdGZvcm0sIG9yCitkbmwgaWYgeW91IGhhdmUgYW55IG90aGVyIHN1Z2dlc3Rpb25zIG9yIGNvbW1lbnRzLiBUaGlzIG1hY3JvIHdhcyBiYXNlZAorZG5sIG9uIHdvcmsgYnkgU0dKIG9uIGF1dG9jb25mIHNjcmlwdHMgZm9yIEZGVFcgKHd3dy5mZnR3Lm9yZykgKHdpdGgKK2RubCBoZWxwIGZyb20gTS4gRnJpZ28pLCBhcyB3ZWxsIGFzIGFjX3B0aHJlYWQgYW5kIGhiX3B0aHJlYWQgbWFjcm9zCitkbmwgcG9zdGVkIGJ5IEFsZWphbmRybyBGb3Jlcm8gQ3VlcnZvIHRvIHRoZSBhdXRvY29uZiBtYWNybyByZXBvc2l0b3J5LgorZG5sIFdlIGFyZSBhbHNvIGdyYXRlZnVsIGZvciB0aGUgaGVscGZ1bCBmZWVkYmFjayBvZiBudW1lcm91cyB1c2Vycy4KK2RubAorZG5sIEBjYXRlZ29yeSBJbnN0YWxsZWRQYWNrYWdlcworZG5sIEBhdXRob3IgU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorZG5sIEB2ZXJzaW9uIDIwMDYtMDUtMjkKK2RubCBAbGljZW5zZSBHUExXaXRoQUNFeGNlcHRpb24KK2RubCAKK2RubCBDaGVja3MgZm9yIEdDQyBzaGFyZWQvcHRocmVhZCBpbmNvbnNpc3RlbmN5IGJhc2VkIG9uIHdvcmsgYnkKK2RubCBNYXJjaW4gT3dzaWFueSA8bWFyY2luQG93c2lhbnkucGw+CisKKworQUNfREVGVU4oW0FDWF9QVEhSRUFEXSwgWworQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKK2FjeF9wdGhyZWFkX29rPW5vCisKKyMgV2UgdXNlZCB0byBjaGVjayBmb3IgcHRocmVhZC5oIGZpcnN0LCBidXQgdGhpcyBmYWlscyBpZiBwdGhyZWFkLmgKKyMgcmVxdWlyZXMgc3BlY2lhbCBjb21waWxlciBmbGFncyAoZS5nLiBvbiBUcnVlNjQgb3IgU2VxdWVudCkuCisjIEl0IGdldHMgY2hlY2tlZCBmb3IgaW4gdGhlIGxpbmsgdGVzdCBhbnl3YXkuCisKKyMgRmlyc3Qgb2YgYWxsLCBjaGVjayBpZiB0aGUgdXNlciBoYXMgc2V0IGFueSBvZiB0aGUgUFRIUkVBRF9MSUJTLAorIyBldGNldGVyYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGFuZCBpZiB0aHJlYWRzIGxpbmtpbmcgd29ya3MgdXNpbmcKKyMgdGhlbToKK2lmIHRlc3QgeCIkUFRIUkVBRF9MSUJTJFBUSFJFQURfQ0ZMQUdTIiAhPSB4OyB0aGVuCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwdGhyZWFkX2pvaW4gaW4gTElCUz0kUFRIUkVBRF9MSUJTIHdpdGggQ0ZMQUdTPSRQVEhSRUFEX0NGTEFHU10pCisgICAgICAgIEFDX1RSWV9MSU5LX0ZVTkMocHRocmVhZF9qb2luLCBhY3hfcHRocmVhZF9vaz15ZXMpCisgICAgICAgIEFDX01TR19SRVNVTFQoJGFjeF9wdGhyZWFkX29rKQorICAgICAgICBpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCisgICAgICAgIGZpCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorZmkKKworIyBXZSBtdXN0IGNoZWNrIGZvciB0aGUgdGhyZWFkcyBsaWJyYXJ5IHVuZGVyIGEgbnVtYmVyIG9mIGRpZmZlcmVudAorIyBuYW1lczsgdGhlIG9yZGVyaW5nIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBzeXN0ZW1zCisjIChlLmcuIERFQykgaGF2ZSBib3RoIC1scHRocmVhZCBhbmQgLWxwdGhyZWFkcywgd2hlcmUgb25lIG9mIHRoZQorIyBsaWJyYXJpZXMgaXMgYnJva2VuIChub24tUE9TSVgpLgorCisjIENyZWF0ZSBhIGxpc3Qgb2YgdGhyZWFkIGZsYWdzIHRvIHRyeS4gIEl0ZW1zIHN0YXJ0aW5nIHdpdGggYSAiLSIgYXJlCisjIEMgY29tcGlsZXIgZmxhZ3MsIGFuZCBvdGhlciBpdGVtcyBhcmUgbGlicmFyeSBuYW1lcywgZXhjZXB0IGZvciAibm9uZSIKKyMgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2UgdHJ5IHdpdGhvdXQgYW55IGZsYWdzIGF0IGFsbCwgYW5kICJwdGhyZWFkLWNvbmZpZyIKKyMgd2hpY2ggaXMgYSBwcm9ncmFtIHJldHVybmluZyB0aGUgZmxhZ3MgZm9yIHRoZSBQdGggZW11bGF0aW9uIGxpYnJhcnkuCisKK2FjeF9wdGhyZWFkX2ZsYWdzPSJwdGhyZWFkcyBub25lIC1LdGhyZWFkIC1rdGhyZWFkIGx0aHJlYWQgLXB0aHJlYWQgLXB0aHJlYWRzIC1tdGhyZWFkcyBwdGhyZWFkIC0tdGhyZWFkLXNhZmUgLW10IHB0aHJlYWQtY29uZmlnIgorCisjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorCisjIHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorIyBub25lOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyMgbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisjIC1wdGhyZWFkOiBMaW51eC9nY2MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL2djYyAodXNlcmxhbmQgdGhyZWFkcykKKyMgLXB0aHJlYWRzOiBTb2xhcmlzL2djYworIyAtbXRocmVhZHM6IE1pbmd3MzIvZ2NjLCBMeW54L2djYworIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworIyAgICAgIGFsc28gZGVmaW5lcyAtRF9SRUVOVFJBTlQpCisjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyMgcHRocmVhZDogTGludXgsIGV0Y2V0ZXJhCisjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyMgcHRocmVhZC1jb25maWc6IHVzZSBwdGhyZWFkLWNvbmZpZyBwcm9ncmFtIChmb3IgR05VIFB0aCBsaWJyYXJ5KQorCitjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAqc29sYXJpcyopCisKKyAgICAgICAgIyBPbiBTb2xhcmlzIChhdCBsZWFzdCwgZm9yIHNvbWUgdmVyc2lvbnMpLCBsaWJjIGNvbnRhaW5zIHN0dWJiZWQKKyAgICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgICAjIC1scHRocmVhZC4pICAoVGhlIHN0dWJzIGFyZSBtaXNzaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLCBvciByYXRoZXIKKyAgICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAgICMgd2UnbGwganVzdCBsb29rIGZvciAtcHRocmVhZHMgYW5kIC1scHRocmVhZCBmaXJzdDoKKworICAgICAgICBhY3hfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIHB0aHJlYWQgLW10IC1wdGhyZWFkICRhY3hfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKK2VzYWMKKworaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KK2ZvciBmbGFnIGluICRhY3hfcHRocmVhZF9mbGFnczsgZG8KKworICAgICAgICBjYXNlICRmbGFnIGluCisgICAgICAgICAgICAgICAgbm9uZSkKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFnc10pCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIC0qKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworCisJCXB0aHJlYWQtY29uZmlnKQorCQlBQ19DSEVDS19QUk9HKGFjeF9wdGhyZWFkX2NvbmZpZywgcHRocmVhZC1jb25maWcsIHllcywgbm8pCisJCWlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfY29uZmlnIiA9IHhubzsgdGhlbiBjb250aW51ZTsgZmkKKwkJUFRIUkVBRF9DRkxBR1M9ImBwdGhyZWFkLWNvbmZpZyAtLWNmbGFnc2AiCisJCVBUSFJFQURfTElCUz0iYHB0aHJlYWQtY29uZmlnIC0tbGRmbGFnc2AgYHB0aHJlYWQtY29uZmlnIC0tbGlic2AiCisJCTs7CisKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iLWwkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBDaGVjayBmb3IgdmFyaW91cyBmdW5jdGlvbnMuICBXZSBtdXN0IGluY2x1ZGUgcHRocmVhZC5oLAorICAgICAgICAjIHNpbmNlIHNvbWUgZnVuY3Rpb25zIG1heSBiZSBtYWNyb3MuICAoT24gdGhlIFNlcXVlbnQsIHdlCisgICAgICAgICMgbmVlZCBhIHNwZWNpYWwgZmxhZyAtS3RocmVhZCB0byBtYWtlIHRoaXMgaGVhZGVyIGNvbXBpbGUuKQorICAgICAgICAjIFdlIGNoZWNrIGZvciBwdGhyZWFkX2pvaW4gYmVjYXVzZSBpdCBpcyBpbiAtbHB0aHJlYWQgb24gSVJJWAorICAgICAgICAjIHdoaWxlIHB0aHJlYWRfY3JlYXRlIGlzIGluIGxpYmMuICBXZSBjaGVjayBmb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgICAgICAgIyBkdWUgdG8gREVDIGNyYXppbmVzcyB3aXRoIC1scHRocmVhZHMuICBXZSBjaGVjayBmb3IKKyAgICAgICAgIyBwdGhyZWFkX2NsZWFudXBfcHVzaCBiZWNhdXNlIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHB0aHJlYWQKKyAgICAgICAgIyBmdW5jdGlvbnMgb24gU29sYXJpcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vbi1mdW5jdGlvbmFsIGxpYmMgc3R1Yi4KKyAgICAgICAgIyBXZSB0cnkgcHRocmVhZF9jcmVhdGUgb24gZ2VuZXJhbCBwcmluY2lwbGVzLgorICAgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgICAgICAgICAgICAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisgICAgICAgICAgICAgICAgICAgIFthY3hfcHRocmVhZF9vaz15ZXNdKQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIEFDX01TR19SRVNVTFQoJGFjeF9wdGhyZWFkX29rKQorICAgICAgICBpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBEZXRlY3QgQUlYIGxvc3NhZ2U6IEpPSU5BQkxFIGF0dHJpYnV0ZSBpcyBjYWxsZWQgVU5ERVRBQ0hFRC4KKwlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZV0pCisJYXR0cl9uYW1lPXVua25vd24KKwlmb3IgYXR0ciBpbiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEOyBkbworCSAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLCBbaW50IGF0dHI9JGF0dHI7IHJldHVybiBhdHRyO10sCisgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cl9uYW1lPSRhdHRyOyBicmVha10pCisJZG9uZQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRhdHRyX25hbWUpCisgICAgICAgIGlmIHRlc3QgIiRhdHRyX25hbWUiICE9IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUsICRhdHRyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lIG9uIHlvdXIgc3lzdGVtLl0pCisgICAgICAgIGZpCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkc10pCisgICAgICAgIGZsYWc9bm8KKyAgICAgICAgY2FzZSAiJHtob3N0X2NwdX0tJHtob3N0X29zfSIgaW4KKyAgICAgICAgICAgICotYWl4KiB8ICotZnJlZWJzZCogfCAqLWRhcndpbiopIGZsYWc9Ii1EX1RIUkVBRF9TQUZFIjs7CisgICAgICAgICAgICAqc29sYXJpcyogfCAqLW9zZiogfCAqLWhwdXgqKSBmbGFnPSItRF9SRUVOVFJBTlQiOzsKKyAgICAgICAgZXNhYworICAgICAgICBBQ19NU0dfUkVTVUxUKCR7ZmxhZ30pCisgICAgICAgIGlmIHRlc3QgIngkZmxhZyIgIT0geG5vOyB0aGVuCisgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWcgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBmaQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICAgICAgICAjIE1vcmUgQUlYIGxvc3NhZ2U6IG11c3QgY29tcGlsZSB3aXRoIHhsY19yIG9yIGNjX3IKKwlpZiB0ZXN0IHgiJEdDQyIgIT0geHllczsgdGhlbgorICAgICAgICAgIEFDX0NIRUNLX1BST0dTKFBUSFJFQURfQ0MsIHhsY19yIGNjX3IsICR7Q0N9KQorICAgICAgICBlbHNlCisgICAgICAgICAgUFRIUkVBRF9DQz0kQ0MKKwlmaQorCisJIyBUaGUgbmV4dCBwYXJ0IHRyaWVzIHRvIGRldGVjdCBHQ0MgaW5jb25zaXN0ZW5jeSB3aXRoIC1zaGFyZWQgb24gc29tZQorCSMgYXJjaGl0ZWN0dXJlcyBhbmQgc3lzdGVtcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBpbiBjZXJ0YWluCisJIyBjb25maWd1cmF0aW9ucywgd2hlbiAtc2hhcmVkIGlzIHNwZWNpZmllZCwgR0NDICJmb3JnZXRzIiB0bworCSMgaW50ZXJuYWxseSB1c2UgdmFyaW91cyBmbGFncyB3aGljaCBhcmUgc3RpbGwgbmVjZXNzYXJ5LgorCQorCSMKKwkjIFByZXBhcmUgdGhlIGZsYWdzCisJIworCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCXNhdmVfTElCUz0iJExJQlMiCisJc2F2ZV9DQz0iJENDIgorCQorCSMgVHJ5IHdpdGggdGhlIGZsYWdzIGRldGVybWluZWQgYnkgdGhlIGVhcmxpZXIgY2hlY2tzLgorCSMKKwkjIC1XbCwteixkZWZzIGZvcmNlcyBsaW5rLXRpbWUgc3ltYm9sIHJlc29sdXRpb24sIHNvIHRoYXQgdGhlCisJIyBsaW5raW5nIGNoZWNrcyB3aXRoIC1zaGFyZWQgYWN0dWFsbHkgaGF2ZSBhbnkgdmFsdWUKKwkjCisJIyBGSVhNRTogLWZQSUMgaXMgcmVxdWlyZWQgZm9yIC1zaGFyZWQgb24gbWFueSBhcmNoaXRlY3R1cmVzLAorCSMgc28gd2Ugc3BlY2lmeSBpdCBoZXJlLCBidXQgdGhlIHJpZ2h0IHdheSB3b3VsZCBwcm9iYWJseSBiZSB0bworCSMgcHJvcGVybHkgZGV0ZWN0IHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgcmVxdWlyZWQuCisJQ0ZMQUdTPSItc2hhcmVkIC1mUElDIC1XbCwteixkZWZzICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCUxJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisJQ0M9IiRQVEhSRUFEX0NDIgorCQorCSMgSW4gb3JkZXIgbm90IHRvIGNyZWF0ZSBzZXZlcmFsIGxldmVscyBvZiBpbmRlbnRhdGlvbiwgd2UgdGVzdAorCSMgdGhlIHZhbHVlIG9mICIkZG9uZSIgdW50aWwgd2UgZmluZCB0aGUgY3VyZSBvciBydW4gb3V0IG9mIGlkZWFzLgorCWRvbmU9Im5vIgorCQorCSMgRmlyc3QsIG1ha2Ugc3VyZSB0aGUgQ0ZMQUdTIHdlIGFkZGVkIGFyZSBhY3R1YWxseSBhY2NlcHRlZCBieSBvdXIKKwkjIGNvbXBpbGVyLiAgSWYgbm90IChhbmQgT1MgWCdzIGxkLCBmb3IgaW5zdGFuY2UsIGRvZXMgbm90IGFjY2VwdCAteiksCisJIyB0aGVuIHdlIGNhbid0IGRvIHRoaXMgdGVzdC4KKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGNoZWNrIGZvciBHQ0MgcHRocmVhZC9zaGFyZWQgaW5jb25zaXN0ZW5jaWVzXSkKKwkgICBBQ19UUllfTElOSygsLCAsIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXMgOyB0aGVuCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgIGZpCisJZmkKKwkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1wdGhyZWFkIGlzIHN1ZmZpY2llbnQgd2l0aCAtc2hhcmVkXSkKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorCSAgICAgIFtkb25lPXllc10pCisJICAgCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgZmkKKwlmaQorCQorCSMKKwkjIExpbnV4IGdjYyBvbiBzb21lIGFyY2hpdGVjdHVyZXMgc3VjaCBhcyBtaXBzL21pcHNlbCBmb3JnZXRzCisJIyBhYm91dCAtbHB0aHJlYWQKKwkjCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbHB0aHJlYWQgZml4ZXMgdGhhdF0pCisJICAgTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorCSAgICAgIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgICAgIFBUSFJFQURfTElCUz0iLWxwdGhyZWFkICRQVEhSRUFEX0xJQlMiCisJICAgZWxzZQorCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKwkgICBmaQorCWZpCisJIworCSMgRnJlZUJTRCA0LjEwIGdjYyBmb3JnZXRzIHRvIHVzZSAtbGNfciBpbnN0ZWFkIG9mIC1sYworCSMKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1sY19yIGZpeGVzIHRoYXRdKQorCSAgIExJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMgJHNhdmVfTElCUyIKKwkgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorCSAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisJICAgICAgIFtkb25lPXllc10pCisJCisJICAgaWYgdGVzdCAieCRkb25lIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgICAgIFBUSFJFQURfTElCUz0iLWxjX3IgJFBUSFJFQURfTElCUyIKKwkgICBlbHNlCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGZpCisJZmkKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgIyBPSywgd2UgaGF2ZSBydW4gb3V0IG9mIGlkZWFzCisJICAgQUNfTVNHX1dBUk4oW0ltcG9zc2libGUgdG8gZGV0ZXJtaW5lIGhvdyB0byB1c2UgcHRocmVhZHMgd2l0aCBzaGFyZWQgbGlicmFyaWVzXSkKKwkKKwkgICAjIHNvIGl0J3Mgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UgbWF5IHVzZSBwdGhyZWFkcworCSAgIGFjeF9wdGhyZWFkX29rPW5vCisJZmkKKwkKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwlMSUJTPSIkc2F2ZV9MSUJTIgorCUNDPSIkc2F2ZV9DQyIKK2Vsc2UKKyAgICAgICAgUFRIUkVBRF9DQz0iJENDIgorZmkKKworQUNfU1VCU1QoUFRIUkVBRF9MSUJTKQorQUNfU1VCU1QoUFRIUkVBRF9DRkxBR1MpCitBQ19TVUJTVChQVEhSRUFEX0NDKQorCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskMV0sLEFDX0RFRklORShIQVZFX1BUSFJFQUQsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuXSksWyQxXSkKKyAgICAgICAgOgorZWxzZQorICAgICAgICBhY3hfcHRocmVhZF9vaz1ubworICAgICAgICAkMgorZmkKK0FDX0xBTkdfUkVTVE9SRQorXSlkbmwgQUNYX1BUSFJFQUQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbTQvZ3Rlc3QubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2d0ZXN0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OThiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2d0ZXN0Lm00CkBAIC0wLDAgKzEsNzQgQEAKK2RubCBHVEVTVF9MSUJfQ0hFQ0soW21pbmltdW0gdmVyc2lvbiBbLAorZG5sICAgICAgICAgICAgICAgICAgYWN0aW9uIGlmIGZvdW5kIFssYWN0aW9uIGlmIG5vdCBmb3VuZF1dXSkKK2RubAorZG5sIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIEdvb2dsZSBUZXN0IGxpYnJhcnksIG9wdGlvbmFsbHkgYXQgYSBtaW5pbXVtCitkbmwgdmVyc2lvbiwgYW5kIGluZGljYXRlIGEgdmlhYmxlIHZlcnNpb24gd2l0aCB0aGUgSEFWRV9HVEVTVCBmbGFnLiBJdCBkZWZpbmVzCitkbmwgc3RhbmRhcmQgdmFyaWFibGVzIGZvciBzdWJzdGl0dXRpb24gaW5jbHVkaW5nIEdURVNUX0NQUEZMQUdTLAorZG5sIEdURVNUX0NYWEZMQUdTLCBHVEVTVF9MREZMQUdTLCBhbmQgR1RFU1RfTElCUy4gSXQgYWxzbyBkZWZpbmVzCitkbmwgR1RFU1RfVkVSU0lPTiBhcyB0aGUgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCBmb3VuZC4gRmluYWxseSwgaXQgcHJvdmlkZXMKK2RubCBvcHRpb25hbCBjdXN0b20gYWN0aW9uIHNsb3RzIGluIHRoZSBldmVudCBHVEVTVCBpcyBmb3VuZCBvciBub3QuCitBQ19ERUZVTihbR1RFU1RfTElCX0NIRUNLXSwKK1sKK2RubCBQcm92aWRlIGEgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBHb29nbGUgVGVzdCB1c2FnZS4KK0FDX0FSR19FTkFCTEUoW2d0ZXN0XSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ndGVzdF0sCisgICAgICAgICAgICAgICAgICBbRW5hYmxlIHRlc3RzIHVzaW5nIHRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgorICAgICAgICAgICAgICAgICAgKERlZmF1bHQgaXMgZW5hYmxlZC4pXSldLAorICBbXSwKKyAgW2VuYWJsZV9ndGVzdD1dKQorQUNfQVJHX1ZBUihbR1RFU1RfQ09ORklHXSwKKyAgICAgICAgICAgW1RoZSBleGFjdCBwYXRoIG9mIEdvb2dsZSBUZXN0J3MgJ2d0ZXN0LWNvbmZpZycgc2NyaXB0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9DUFBGTEFHU10sCisgICAgICAgICAgIFtDLWxpa2UgcHJlcHJvY2Vzc29yIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQorQUNfQVJHX1ZBUihbR1RFU1RfQ1hYRkxBR1NdLAorICAgICAgICAgICBbQysrIGNvbXBpbGUgZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9MREZMQUdTXSwKKyAgICAgICAgICAgW0xpbmtlciBwYXRoIGFuZCBvcHRpb24gZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9MSUJTXSwKKyAgICAgICAgICAgW0xpYnJhcnkgbGlua2luZyBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKK0FDX0FSR19WQVIoW0dURVNUX1ZFUlNJT05dLAorICAgICAgICAgICBbVGhlIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QgYXZhaWxhYmxlLl0pCitIQVZFX0dURVNUPSJubyIKK0FTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiAhPSAieG5vIl0sCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAnZ3Rlc3QtY29uZmlnJ10pCisgICBBU19JRihbdGVzdCAieCR7ZW5hYmxlX2d0ZXN0fSIgIT0gInh5ZXMiXSwKKyAgICAgW0FTX0lGKFt0ZXN0IC14ICIke2VuYWJsZV9ndGVzdH0vc2NyaXB0cy9ndGVzdC1jb25maWciXSwKKyAgICAgICAgW0dURVNUX0NPTkZJRz0iJHtlbmFibGVfZ3Rlc3R9L3NjcmlwdHMvZ3Rlc3QtY29uZmlnIl0sCisgICAgICAgIFtHVEVTVF9DT05GSUc9IiR7ZW5hYmxlX2d0ZXN0fS9iaW4vZ3Rlc3QtY29uZmlnIl0pCisgICAgICBBU19JRihbdGVzdCAteCAiJHtHVEVTVF9DT05GSUd9Il0sIFtdLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgQUNfTVNHX0VSUk9SKFtkbmwKK1VuYWJsZSB0byBsb2NhdGUgZWl0aGVyIGEgYnVpbHQgb3IgaW5zdGFsbGVkIEdvb2dsZSBUZXN0LgorVGhlIHNwZWNpZmljIGxvY2F0aW9uICcke2VuYWJsZV9ndGVzdH0nIHdhcyBwcm92aWRlZCBmb3IgYSBidWlsdCBvciBpbnN0YWxsZWQKK0dvb2dsZSBUZXN0LCBidXQgbm8gJ2d0ZXN0LWNvbmZpZycgc2NyaXB0IGNvdWxkIGJlIGZvdW5kIGF0IHRoaXMgbG9jYXRpb24uXSkKKyAgICAgICAgIF0pXSwKKyAgICAgW0FDX1BBVEhfUFJPRyhbR1RFU1RfQ09ORklHXSwgW2d0ZXN0LWNvbmZpZ10pXSkKKyAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwKKyAgICAgW0FDX01TR19SRVNVTFQoWyR7R1RFU1RfQ09ORklHfV0pCisgICAgICBtNF9pZnZhbChbJDFdLAorICAgICAgICBbX2d0ZXN0X21pbl92ZXJzaW9uPSItLW1pbi12ZXJzaW9uPSQxIgorICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR29vZ2xlIFRlc3QgYXQgbGVhc3QgdmVyc2lvbiA+PSAkMV0pXSwKKyAgICAgICAgW19ndGVzdF9taW5fdmVyc2lvbj0iLS1taW4tdmVyc2lvbj0wIgorICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR29vZ2xlIFRlc3RdKV0pCisgICAgICBBU19JRihbJHtHVEVTVF9DT05GSUd9ICR7X2d0ZXN0X21pbl92ZXJzaW9ufV0sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgSEFWRV9HVEVTVD0neWVzJ10sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSldLAorICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICBBU19JRihbdGVzdCAieCR7SEFWRV9HVEVTVH0iID0gInh5ZXMiXSwKKyAgICAgW0dURVNUX0NQUEZMQUdTPWAke0dURVNUX0NPTkZJR30gLS1jcHBmbGFnc2AKKyAgICAgIEdURVNUX0NYWEZMQUdTPWAke0dURVNUX0NPTkZJR30gLS1jeHhmbGFnc2AKKyAgICAgIEdURVNUX0xERkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWxkZmxhZ3NgCisgICAgICBHVEVTVF9MSUJTPWAke0dURVNUX0NPTkZJR30gLS1saWJzYAorICAgICAgR1RFU1RfVkVSU0lPTj1gJHtHVEVTVF9DT05GSUd9IC0tdmVyc2lvbmAKKyAgICAgIEFDX0RFRklORShbSEFWRV9HVEVTVF0sWzFdLFtEZWZpbmVkIHdoZW4gR29vZ2xlIFRlc3QgaXMgYXZhaWxhYmxlLl0pXSwKKyAgICAgW0FTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiA9ICJ4eWVzIl0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW2RubAorR29vZ2xlIFRlc3Qgd2FzIGVuYWJsZWQsIGJ1dCBubyB2aWFibGUgdmVyc2lvbiBjb3VsZCBiZSBmb3VuZC5dKQorICAgICAgICAgXSldKV0pCitBQ19TVUJTVChbSEFWRV9HVEVTVF0pCitBTV9DT05ESVRJT05BTChbSEFWRV9HVEVTVF0sW3Rlc3QgIngkSEFWRV9HVEVTVCIgPSAieHllcyJdKQorQVNfSUYoW3Rlc3QgIngkSEFWRV9HVEVTVCIgPSAieHllcyJdLAorICBbbTRfaWZ2YWwoWyQyXSwgWyQyXSldLAorICBbbTRfaWZ2YWwoWyQzXSwgWyQzXSldKQorXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbTQvbGlidG9vbC5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbTQvbGlidG9vbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjgxMDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tNC9saWJ0b29sLm00CkBAIC0wLDAgKzEsODAwMSBAQAorIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworbTRfZGVmaW5lKFtfTFRfQ09QWUlOR10sIFtkbmwKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wuCisjCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIGlmIHlvdSBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSBvciBsaWJyYXJ5IHRoYXQKKyMgaXMgYnVpbHQgdXNpbmcgR05VIExpYnRvb2wsIHlvdSBtYXkgaW5jbHVkZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisjIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBHTlUgTGlidG9vbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR05VIExpYnRvb2w7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBhIGNvcHkKKyMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwsIG9yCisjIG9idGFpbmVkIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCitdKQorCisjIHNlcmlhbCA1NyBMVF9JTklUCisKKworIyBMVF9QUkVSRVEoVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGFuZCBleGl0IGlmIHRoaXMgbGlidG9vbCB2ZXJzaW9uIGlzIGxlc3MgdGhhdCBWRVJTSU9OLgorbTRfZGVmdW4oW0xUX1BSRVJFUV0sCitbbTRfaWYobTRfdmVyc2lvbl9jb21wYXJlKG00X2RlZm4oW0xUX1BBQ0tBR0VfVkVSU0lPTl0pLCBbJDFdKSwgLTEsCisgICAgICAgW200X2RlZmF1bHQoWyQzXSwKKwkJICAgW200X2ZhdGFsKFtMaWJ0b29sIHZlcnNpb24gJDEgb3IgaGlnaGVyIGlzIHJlcXVpcmVkXSwKKwkJICAgICAgICAgICAgIDYzKV0pXSwKKyAgICAgICBbJDJdKV0pCisKKworIyBfTFRfQ0hFQ0tfQlVJTERESVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGlmIHRoZSBhYnNvbHV0ZSBidWlsZCBkaXJlY3RvcnkgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMKK200X2RlZnVuKFtfTFRfQ0hFQ0tfQlVJTERESVJdLAorW2Nhc2UgYHB3ZGAgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgQUNfTVNHX1dBUk4oW0xpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBgcHdkYF0pIDs7Citlc2FjCitdKQorCisKKyMgTFRfSU5JVChbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0lOSVRdLAorW0FDX1BSRVJFUShbMi41OF0pZG5sIFdlIHVzZSBBQ19JTkNMVURFU19ERUZBVUxUCitBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRfTEFOR10pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xUX09VVFBVVF0pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfQlVJTERESVJdKWRubAorCitkbmwgQXV0b2NvbmYgZG9lc24ndCBjYXRjaCB1bmV4cGFuZGVkIExUXyBtYWNyb3MgYnkgZGVmYXVsdDoKK200X3BhdHRlcm5fZm9yYmlkKFteXz9MVF9bQS1aX10rJF0pZG5sCittNF9wYXR0ZXJuX2FsbG93KFteKF9MVF9FT0Z8TFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PV3xMVF9NVUxUSV9NT0RVTEUpJF0pZG5sCitkbmwgYWNsb2NhbCBkb2Vzbid0IHB1bGwgbHRvcHRpb25zLm00LCBsdHN1Z2FyLm00LCBvciBsdHZlcnNpb24ubTQKK2RubCB1bmxlc3Mgd2UgcmVxdWlyZSBhbiBBQ19ERUZVTmVkIG1hY3JvOgorQUNfUkVRVUlSRShbTFRPUFRJT05TX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRTVUdBUl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUVkVSU0lPTl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUT0JTT0xFVEVfVkVSU0lPTl0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19MVE1BSU5dKWRubAorCitfTFRfU0hFTExfSU5JVChbU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH1dKQorCitkbmwgUGFyc2UgT1BUSU9OUworX0xUX1NFVF9PUFRJT05TKFskMF0sIFskMV0pCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGx0bWFpbiIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworX0xUX1NFVFVQCisKKyMgT25seSBleHBhbmQgb25jZToKK200X2RlZmluZShbTFRfSU5JVF0pCitdKSMgTFRfSU5JVAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBQ19QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitBVV9BTElBUyhbQU1fUFJPR19MSUJUT09MXSwgW0xUX0lOSVRdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgW10pCisKKworIyBfTFRfQ0NfQkFTRU5BTUUoQ0MpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsY3VsYXRlIGNjX2Jhc2VuYW1lLiAgU2tpcCBrbm93biBjb21waWxlciB3cmFwcGVycyBhbmQgY3Jvc3MtcHJlZml4LgorbTRfZGVmdW4oW19MVF9DQ19CQVNFTkFNRV0sCitbZm9yIGNjX3RlbXAgaW4gJDEiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1tcXC9dXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1tcXC9dXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltbXFwvXV1kaXN0Y2MgfCBwdXJpZnkgfCAqW1tcXC9dXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCitdKQorCisKKyMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEl0IGlzIG9rYXkgdG8gdXNlIHRoZXNlIGZpbGUgY29tbWFuZHMgYW5kIGFzc3VtZSB0aGV5IGhhdmUgYmVlbiBzZXQKKyMgc2Vuc2libHkgYWZ0ZXIgYG00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKScuCittNF9kZWZ1bihbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10sCitbOiAke0NQPSJjcCAtZiJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorXSkjIF9MVF9GSUxFVVRJTFNfREVGQVVMVFMKKworCisjIF9MVF9TRVRVUAorIyAtLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfU0VUVVBdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCisKK19MVF9ERUNMKFtdLCBbUEFUSF9TRVBBUkFUT1JdLCBbMV0sIFtUaGUgUEFUSCBzZXBhcmF0b3IgZm9yIHRoZSBidWlsZCBzeXN0ZW1dKWRubAorZG5sCitfTFRfREVDTChbXSwgW2hvc3RfYWxpYXNdLCBbMF0sIFtUaGUgaG9zdCBzeXN0ZW1dKWRubAorX0xUX0RFQ0woW10sIFtob3N0XSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtob3N0X29zXSwgWzBdKWRubAorZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX2FsaWFzXSwgWzBdLCBbVGhlIGJ1aWxkIHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkXSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtidWlsZF9vc10sIFswXSlkbmwKK2RubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgorX0xUX0RFQ0woW10sIFtMTl9TXSwgWzFdLCBbV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rc10pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0xUX0NNRF9NQVhfTEVOXSlkbmwKK19MVF9ERUNMKFtvYmpleHRdLCBbYWNfb2JqZXh0XSwgWzBdLCBbT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXhlZXh0XSwgWzBdLCBbRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpXSlkbmwKK2RubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9SRUxPQURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQl0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX09MRF9BUkNISVZFXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1dJVEhfU1lTUk9PVF0pZG5sCisKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorXSkKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworX0xUX0NIRUNLX09CSkRJUgorCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKKword2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Cit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgX0xUX1BBVEhfTUFHSUMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK0xUX1NVUFBPUlRFRF9UQUcoW0NDXSkKK19MVF9MQU5HX0NfQ09ORklHCitfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworX0xUX0NPTkZJR19DT01NQU5EUworXSkjIF9MVF9TRVRVUAorCisKKyMgX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGEgZmV3IHNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwIHVzIGRvIHJvYnVzdCBxdW90aW5nLgorbTRfZGVmdW4oW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSwKK1sjIEJhY2tzbGFzaGlmeSBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluCisjIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtbImAkXFxdXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbWyJgXFxdXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworXSkKKworIyBfTFRfUFJPR19MVE1BSU4KKyMgLS0tLS0tLS0tLS0tLS0tCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgY2FsbGVkIGJvdGggZnJvbSBgY29uZmlndXJlJywgYW5kIGBjb25maWcuc3RhdHVzJworIyBub3cgdGhhdCB3ZSB1c2UgQUNfQ09ORklHX0NPTU1BTkRTIHRvIGdlbmVyYXRlIGxpYnRvb2wuICBOb3RhYmx5LAorIyBgY29uZmlnLnN0YXR1cycgaGFzIG5vIHZhbHVlIGZvciBhY19hdXhfZGlyIHVubGVzcyB3ZSBhcmUgdXNpbmcgQXV0b21ha2UsCisjIHNvIHdlIHBhc3MgYSBjb3B5IGFsb25nIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBzZW5zaWJsZSB2YWx1ZSBhbnl3YXkuCittNF9kZWZ1bihbX0xUX1BST0dfTFRNQUlOXSwKK1ttNF9pZmRlZihbQUNfUkVRVUlSRV9BVVhfRklMRV0sIFtBQ19SRVFVSVJFX0FVWF9GSUxFKFtsdG1haW4uc2hdKV0pZG5sCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInXSkKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorXSkjIF9MVF9QUk9HX0xUTUFJTgorCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEFjY3VtdWxhdGUgY29kZSBmb3IgY3JlYXRpbmcgbGlidG9vbC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBTbyB0aGF0IHdlIGNhbiByZWNyZWF0ZSBhIGZ1bGwgbGlidG9vbCBzY3JpcHQgaW5jbHVkaW5nIGFkZGl0aW9uYWwKKyMgdGFncywgd2UgYWNjdW11bGF0ZSB0aGUgY2h1bmtzIG9mIGNvZGUgdG8gc2VuZCB0byBBQ19DT05GSUdfQ09NTUFORFMKKyMgaW4gbWFjcm9zIGFuZCB0aGVuIG1ha2UgYSBzaW5nbGUgY2FsbCBhdCB0aGUgZW5kIHVzaW5nIHRoZSBgbGlidG9vbCcKKyMgbGFiZWwuCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbSU5JVC1DT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgSU5JVC1DT01NQU5EUyB0byBiZSBwYXNzZWQgdG8gQUNfQ09ORklHX0NPTU1BTkRTIGxhdGVyLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX0xJQlRPT0xfSU5JVF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9JTklUXSkKKworCisjIF9MVF9DT05GSUdfTElCVE9PTChbQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MXSwKK1ttNF9pZnZhbChbJDFdLAorICAgICAgICAgIFttNF9hcHBlbmQoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10pCisKKworIyBfTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoW0NPTU1BTkRTXSwgW0lOSVRfQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT05GSUdfU0FWRV9DT01NQU5EU10sCitbX0xUX0NPTkZJR19MSUJUT09MKFskMV0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbJDJdKQorXSkKKworCisjIF9MVF9GT1JNQVRfQ09NTUVOVChbQ09NTUVOVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBsZWFkaW5nIGNvbW1lbnQgbWFya3MgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggbGluZSwgYW5kIGEgdHJhaWxpbmcKKyMgZnVsbC1zdG9wIHRvIHRoZSB3aG9sZSBjb21tZW50IGlmIG9uZSBpcyBub3QgcHJlc2VudCBhbHJlYWR5LgorbTRfZGVmaW5lKFtfTFRfRk9STUFUX0NPTU1FTlRdLAorW200X2lmdmFsKFskMV0sIFsKK200X2JwYXRzdWJzdChbbTRfYnBhdHN1YnN0KFskMV0sIFteICpdLCBbIyBdKV0sCisgICAgICAgICAgICAgIFtbJ2AkXF1dLCBbXFxcJl0pXW00X2JtYXRjaChbJDFdLCBbWyE/Ll0kXSwgW10sIFsuXSkKKyldKQorCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGSVhNRTogRWxpbWluYXRlIFZBUk5BTUUgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisKKyMgX0xUX0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSwgW0lTLVRBR0dFRD9dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENPTkZJR05BTUUgaXMgdGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIHZhbHVlIGluIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyMgVkFSTkFNRSBpcyB0aGUgKGJhc2UpIG5hbWUgdXNlZCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KKyMgVkFMVUUgbWF5IGJlIDAsIDEgb3IgMiBmb3IgYSBjb21wdXRlZCBxdW90ZSBlc2NhcGVkIHZhbHVlIGJhc2VkIG9uCisjIFZBUk5BTUUuICBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZSB1c2VkIGRpcmVjdGx5LgorbTRfZGVmaW5lKFtfTFRfREVDTF0sCitbbHRfaWZfYXBwZW5kX3VuaXEoW2x0X2RlY2xfdmFybmFtZXNdLCBbJDJdLCBbLCBdLAorICAgIFtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtsaWJ0b29sX25hbWVdLAorCVttNF9pZnZhbChbJDFdLCBbJDFdLCBbJDJdKV0pCisgICAgbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbdmFsdWVdLCBbJDNdKQorICAgIG00X2lmdmFsKFskNF0sCisJW2x0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW2Rlc2NyaXB0aW9uXSwgWyQ0XSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwKKwlbdGFnZ2VkP10sIFttNF9pZnZhbChbJDVdLCBbeWVzXSwgW25vXSldKV0pCitdKQorCisKKyMgX0xUX1RBR0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR0RFQ0xdLCBbX0xUX0RFQ0woWyQxXSwgWyQyXSwgWyQzXSwgWyQ0XSwgW3llc10pXSkKKworCisjIGx0X2RlY2xfdGFnX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF90YWdfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFt5ZXNdLCAkQCldKQorCisKKyMgX2x0X2RlY2xfZmlsdGVyKFNVQktFWSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfbHRfZGVjbF9maWx0ZXJdLAorW200X2Nhc2UoWyQjXSwKKyAgWzBdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCisgIFsxXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKKyAgWzJdLCBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sIFskMV0sIFskMl0sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFszXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbJDNdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgJEApXSlbXWRubAorXSkKKworCisjIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfcXVvdGVfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdmFsdWVdLCBbMV0sICRAKV0pCisKKworIyBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzJdLCAkQCldKQorCisKKyMgbHRfZGVjbF92YXJuYW1lc190YWdnZWQoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZF0sCitbbTRfYXNzZXJ0KFskIyA8PSAyXSlkbmwKK18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgIG00X2lmdmFsKFskMl0sIFtbJDJdXSwgW200X2RxdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyldKSwKKyAgICBtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfcXVvdGUoX0xUX1RBR1MpKSwgWyBdKSldKQorbTRfZGVmaW5lKFtfbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2lmdmFsKFskM10sIFtsdF9jb21iaW5lKFskMV0sIFskMl0sIFtfXSwgJDMpXSldKQorCisKKyMgbHRfZGVjbF9hbGxfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2FsbF92YXJuYW1lc10sCitbXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCisgICAgIG00X2lmKFskMl0sIFtdLAorCSAgIG00X3F1b3RlKGx0X2RlY2xfdmFybmFtZXMpLAorCW00X3F1b3RlKG00X3NoaWZ0KCRAKSkpKVtdZG5sCitdKQorbTRfZGVmaW5lKFtfbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW2x0X2pvaW4oJEAsIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFskMV0sCisJCQlsdF9kZWNsX3RhZ192YXJuYW1lcyhbWywgXV0sIG00X3NoaWZ0KCRAKSkpKWRubAorXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoW1ZBUk5BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUXVvdGUgYSB2YXJpYWJsZSB2YWx1ZSwgYW5kIGZvcndhcmQgaXQgdG8gYGNvbmZpZy5zdGF0dXMnIHNvIHRoYXQgaXRzCisjIGRlY2xhcmF0aW9uIHRoZXJlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpbiBgY29uZmlndXJlJy4gIFZBUk5BTUUKKyMgbXVzdCBoYXZlIGEgc2luZ2xlIHF1b3RlIGRlbGltaXRlZCB2YWx1ZSBmb3IgdGhpcyB0byB3b3JrLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFXSwKK1skMT0nYCRFQ0hPICIkXVskMSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2UgZGVsaW1pdCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgd2l0aCBzaW5nbGUgcXVvdGVzLCBzbyB3aGVuCisjIHdlIHdyaXRlIHRoZW0gdG8gY29uZmlnLnN0YXR1cywgd2UgaGF2ZSB0byBiZSBzdXJlIHRvIHF1b3RlIGFsbAorIyBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIHByb3Blcmx5LiAgSW4gY29uZmlndXJlLCB0aGlzIG1hY3JvIGV4cGFuZHMKKyMgZWFjaCB2YXJpYWJsZSBkZWNsYXJlZCB3aXRoIF9MVF9ERUNMIChhbmQgX0xUX1RBR0RFQ0wpIGludG86CisjCisjICAgIDx2YXI+PSdgJEVDSE8gIiQ8dmFyPiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittNF9kZWZ1bihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF9hbGxfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdTCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0IGNvbW1lbnQgYW5kIGxpc3Qgb2YgdGFncyBzdXBwb3J0ZWQgYnkgdGhlIHNjcmlwdAorbTRfZGVmdW4oW19MVF9MSUJUT09MX1RBR1NdLAorW19MVF9GT1JNQVRfQ09NTUVOVChbVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0XSlkbmwKK2F2YWlsYWJsZV90YWdzPSJfTFRfVEFHUyJkbmwKK10pCisKKworIyBfTFRfTElCVE9PTF9ERUNMQVJFKFZBUk5BTUUsIFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRyYWN0IHRoZSBkaWN0aW9uYXJ5IHZhbHVlcyBmb3IgVkFSTkFNRSAob3B0aW9uYWxseSB3aXRoIFRBRykgYW5kCisjIGV4cGFuZCB0byBhIGNvbW1lbnRlZCBzaGVsbCB2YXJpYWJsZSBzZXR0aW5nOgorIworIyAgICAjIFNvbWUgY29tbWVudCBhYm91dCB3aGF0IFZBUiBpcyBmb3IuCisjICAgIHZpc2libGVfbmFtZT0kbHRfaW50ZXJuYWxfbmFtZQorbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9ERUNMQVJFXSwKK1tfTFRfRk9STUFUX0NPTU1FTlQobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwKKwkJCQkJICAgW2Rlc2NyaXB0aW9uXSkpKVtdZG5sCittNF9wdXNoZGVmKFtfbGlidG9vbF9uYW1lXSwKKyAgICBtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbbGlidG9vbF9uYW1lXSkpKVtdZG5sCittNF9jYXNlKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pKSwKKyAgICBbMF0sIFtfbGlidG9vbF9uYW1lPVskXSQxXSwKKyAgICBbMV0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbMl0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbX2xpYnRvb2xfbmFtZT1sdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKV0pW11kbmwKK200X2lmdmFsKFskMl0sIFtfJDJdKVtdbTRfcG9wZGVmKFtfbGlidG9vbF9uYW1lXSlbXWRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0NPTkZJR19WQVJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgY29tbWVudGVkIGRlY2xhcmF0aW9ucyBvZiBub24tdGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcworIyBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGluIHRoZSBMSUJUT09MIENPTkZJRyBzZWN0aW9uIG9mIHRoZSBgbGlidG9vbCcKKyMgc2NyaXB0LiAgVGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyAoZXZlbiBmb3IgdGhlIExJQlRPT0wgQ09ORklHCisjIHNlY3Rpb24pIGFyZSBwcm9kdWNlZCBieSBfTFRfTElCVE9PTF9UQUdfVkFSUy4KK200X2RlZnVuKFtfTFRfTElCVE9PTF9DT05GSUdfVkFSU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sCisgICAgbTRfcXVvdGUoX2x0X2RlY2xfZmlsdGVyKFt0YWdnZWQ/XSwgW25vXSwgW10sIGx0X2RlY2xfdmFybmFtZXMpKSwKKyAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyKV0pXSldKQorCisKKyMgX0xUX0xJQlRPT0xfVEFHX1ZBUlMoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9MSUJUT09MX1RBR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIsIFskMV0pXSldKV0pCisKKworIyBfTFRfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdWQVJdLCBbbTRfaWZ2YWwoWyQyXSwgWyQxXyQyXSwgWyQxXSldKQorCisKKyMgX0xUX0NPTkZJR19DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlbmQgYWNjdW11bGF0ZWQgb3V0cHV0IHRvICRDT05GSUdfU1RBVFVTLiAgVGhhbmtzIHRvIHRoZSBsaXN0cyBvZgorIyB2YXJpYWJsZXMgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlIGVzY2FwaW5nIHdlIHNhdmVkIGZyb20gY2FsbHMKKyMgdG8gX0xUX0RFQ0wsIHdlIGNhbiBwdXQgcXVvdGUgZXNjYXBlZCB2YXJpYWJsZXMgZGVjbGFyYXRpb25zCisjIGludG8gYGNvbmZpZy5zdGF0dXMnLCBhbmQgdGhlbiB0aGUgc2hlbGwgY29kZSB0byBxdW90ZSBlc2NhcGUgdGhlbSBpbgorIyBmb3IgbG9vcHMgaW4gYGNvbmZpZy5zdGF0dXMnLiAgRmluYWxseSwgYW55IGFkZGl0aW9uYWwgY29kZSBhY2N1bXVsYXRlZAorIyBmcm9tIGNhbGxzIHRvIF9MVF9DT05GSUdfTElCVE9PTF9JTklUIGlzIGV4cGFuZGVkLgorbTRfZGVmdW4oW19MVF9DT05GSUdfQ09NTUFORFNdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9PVVRQVVRdLAorCWRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaGFzIGJlZW4gcGxhY2VkIGluICRDT05GSUdfTFQsCisJZG5sIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQgYWxsIG92ZXIgYWdhaW4gaW50byBjb25maWcuc3RhdHVzLAorCWRubCB0aGVuIHdlIHdpbGwgaGF2ZSBjb25maWcuc3RhdHVzIHJ1biAkQ09ORklHX0xUIGxhdGVyLCBzbyBpdAorCWRubCBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSBpcyBzdG9yZWQgdGhlcmU6CisgICAgICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICAgICAgWyRTSEVMTCAkQ09ORklHX0xUIHx8IEFTX0VYSVQoMSldLCBbQ09ORklHX0xUPSckQ09ORklHX0xUJ10pXSwKKyAgICBkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGlzIGRlc3RpbmVkIGZvciBjb25maWcuc3RhdHVzLAorICAgIGRubCBleHBhbmQgdGhlIGFjY3VtdWxhdGVkIGNvbW1hbmRzIGFuZCBpbml0IGNvZGUgbm93OgorICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSwgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSldKQorXSkjX0xUX0NPTkZJR19DT01NQU5EUworCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdLAorWworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCitkb3VibGVfcXVvdGVfc3Vic3Q9JyRkb3VibGVfcXVvdGVfc3Vic3QnCitkZWxheV92YXJpYWJsZV9zdWJzdD0nJGRlbGF5X3ZhcmlhYmxlX3N1YnN0JworX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCitMVENDPSckTFRDQycKK0xUQ0ZMQUdTPSckTFRDRkxBR1MnCitjb21waWxlcj0nJGNvbXBpbGVyX0RFRkFVTFQnCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorXCRbXTEKK19MVEVDSE9fRU9GJworfQorCisjIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCitdXSwgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyk7IGRvCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyBcXFxcIiJcXFxcXCRcJHZhciJcXFxcIlxgIGluCisgICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworX0xUX09VVFBVVF9MSUJUT09MX0lOSVQKK10pCisKKyMgX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoRklMRSwgW0NPTU1FTlRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgR2VuZXJhdGUgYSBjaGlsZCBzY3JpcHQgRklMRSB3aXRoIGFsbCBpbml0aWFsaXphdGlvbiBuZWNlc3NhcnkgdG8KKyMgcmV1c2UgdGhlIGVudmlyb25tZW50IGxlYXJuZWQgYnkgdGhlIHBhcmVudCBzY3JpcHQsIGFuZCBtYWtlIHRoZQorIyBmaWxlIGV4ZWN1dGFibGUuICBJZiBDT01NRU5UIGlzIHN1cHBsaWVkLCBpdCBpcyBpbnNlcnRlZCBhZnRlciB0aGUKKyMgYCMhJyBzZXF1ZW5jZSBidXQgYmVmb3JlIGluaXRpYWxpemF0aW9uIHRleHQgYmVnaW5zLiAgQWZ0ZXIgdGhpcworIyBtYWNybywgYWRkaXRpb25hbCB0ZXh0IGNhbiBiZSBhcHBlbmRlZCB0byBGSUxFIHRvIGZvcm0gdGhlIGJvZHkgb2YKKyMgdGhlIGNoaWxkIHNjcmlwdC4gIFRoZSBtYWNybyBlbmRzIHdpdGggbm9uLXplcm8gc3RhdHVzIGlmIHRoZQorIyBmaWxlIGNvdWxkIG5vdCBiZSBmdWxseSB3cml0dGVuIChzdWNoIGFzIGlmIHRoZSBkaXNrIGlzIGZ1bGwpLgorbTRfaWZkZWYoW0FTX0lOSVRfR0VORVJBVEVEXSwKK1ttNF9kZWZ1bihbX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVRdLFtBU19JTklUX0dFTkVSQVRFRCgkQCldKV0sCitbbTRfZGVmdW4oW19MVF9HRU5FUkFURURfRklMRV9JTklUXSwKK1ttNF9yZXF1aXJlKFtBU19QUkVQQVJFXSldZG5sCitbbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV1kbmwKK1tsdF93cml0ZV9mYWlsPTAKK2NhdCA+JDEgPDxfQVNFT0YgfHwgbHRfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyQyCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorZXhwb3J0IFNIRUxMCitfQVNFT0YKK2NhdCA+PiQxIDw8XF9BU0VPRiB8fCBsdF93cml0ZV9mYWlsPTEKK0FTX1NIRUxMX1NBTklUSVpFCitfQVNfUFJFUEFSRQorZXhlYyBBU19NRVNTQUdFX0ZEPiYxCitfQVNFT0YKK3Rlc3QgJGx0X3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICQxW11kbmwKK200X3BvcGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV0pXSkjIF9MVF9HRU5FUkFURURfRklMRV9JTklUCisKKyMgTFRfT1VUUFVUCisjIC0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIGFsbG93cyBlYXJseSBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdCAoYmVmb3JlCisjIEFDX09VVFBVVCBpcyBjYWxsZWQpLCBpbmNhc2UgaXQgaXMgdXNlZCBpbiBjb25maWd1cmUgZm9yIGNvbXBpbGF0aW9uCisjIHRlc3RzLgorQUNfREVGVU4oW0xUX09VVFBVVF0sCitbOiAke0NPTkZJR19MVD0uL2NvbmZpZy5sdH0KK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRDT05GSUdfTFRdKQorX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoWyIkQ09ORklHX0xUIl0sCitbIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIGEgbGlidG9vbCBzdHViIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5dKQorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitsdF9jbF9zaWxlbnQ9ZmFsc2UKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBBU19CT1goW1J1bm5pbmcgJGFzX21lLl0pCit9ID4mQVNfTUVTU0FHRV9MT0dfRkQKKworbHRfY2xfaGVscD0iXAorXGAkYXNfbWUnIGNyZWF0ZXMgYSBsb2NhbCBsaWJ0b29sIHN0dWIgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLAorZm9yIHVzZSBpbiBmdXJ0aGVyIGNvbmZpZ3VyZSB0aW1lIHRlc3RzIGJlZm9yZSB0aGUgcmVhbCBsaWJ0b29sIGlzCitnZW5lcmF0ZWQuCisKK1VzYWdlOiAkWzBdIFtbT1BUSU9OU11dCisKKyAgLWgsIC0taGVscCAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0ICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKKworbHRfY2xfdmVyc2lvbj0iXAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWcubHRbXWRubAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKK2NvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLgorCitDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5sdCBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCit3aGlsZSB0ZXN0ICRbI10gIT0gMAorZG8KKyAgY2FzZSAkWzFdIGluCisgICAgLS12ZXJzaW9uIHwgLS12KiB8IC1WICkKKyAgICAgIGVjaG8gIiRsdF9jbF92ZXJzaW9uIjsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgIGVjaG8gIiRsdF9jbF9oZWxwIjsgZXhpdCAwIDs7CisgICAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgICBkZWJ1Zz06IDs7CisgICAgLS1xdWlldCB8IC0tcSogfCAtLXNpbGVudCB8IC0tcyogfCAtcSApCisgICAgICBsdF9jbF9zaWxlbnQ9OiA7OworCisgICAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisKKyAgICAqKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBhcmd1bWVudDogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgJGx0X2NsX3NpbGVudDsgdGhlbgorICBleGVjIEFTX01FU1NBR0VfRkQ+L2Rldi9udWxsCitmaQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PF9MVEVPRgorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVQKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkb2ZpbGVdKQorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTCitBU19FWElUKDApCitfTFRFT0YKK2NobW9kICt4ICIkQ09ORklHX0xUIgorCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGJ1dCBjb25maWcubHQgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLAorIyBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZywgd2hpY2ggZmFpbHMgb24gRE9TLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQKKyMgb3BlbiBieSBjb25maWd1cmUuICBIZXJlIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwgZWZmZWN0aXZlbHkgY2xvc2luZworIyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gYnkgY29uZmlnLmx0LgorbHRfY2xfc3VjY2Vzcz06Cit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICBsdF9jb25maWdfbHRfYXJncz0iJGx0X2NvbmZpZ19sdF9hcmdzIC0tcXVpZXQiCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPi9kZXYvbnVsbAorJFNIRUxMICIkQ09ORklHX0xUIiAkbHRfY29uZmlnX2x0X2FyZ3MgfHwgbHRfY2xfc3VjY2Vzcz1mYWxzZQorZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZworJGx0X2NsX3N1Y2Nlc3MgfHwgQVNfRVhJVCgxKQorXSkjIExUX09VVFBVVAorCisKKyMgX0xUX0NPTkZJRyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBJZiBUQUcgaXMgdGhlIGJ1aWx0LWluIHRhZywgY3JlYXRlIGFuIGluaXRpYWwgbGlidG9vbCBzY3JpcHQgd2l0aCBhCisjIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB1bnRhZ2dlZCBjb25maWcgdmFycy4gIE90aGVyd2lzZSBhZGQgY29kZQorIyB0byBjb25maWcuc3RhdHVzIGZvciBhcHBlbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZWQgYnkgVEFHIGZyb20gdGhlCisjIG1hdGNoaW5nIHRhZ2dlZCBjb25maWcgdmFycy4KK200X2RlZnVuKFtfTFRfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT05GSUdfU0FWRV9DT01NQU5EUyhbCisgIG00X2RlZmluZShbX0xUX1RBR10sIG00X2lmKFskMV0sIFtdLCBbQ10sIFskMV0pKWRubAorICBtNF9pZihfTFRfVEFHLCBbQ10sIFsKKyAgICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisgICAgIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgICAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgICAgZmkKKworICAgIGNmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgICB0cmFwICIkUk0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAgICRSTSAiJGNmZ2ZpbGUiCisKKyAgICBjYXQgPDxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkRUNITyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkYXNfbWUgKCRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworX0xUX0NPUFlJTkcKK19MVF9MSUJUT09MX1RBR1MKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKK19MVF9MSUJUT09MX0NPTkZJR19WQVJTCitfTFRfTElCVE9PTF9UQUdfVkFSUworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19MVF9FT0YKKworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitfTFRfRU9GCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9QUk9HX0xUTUFJTgorCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisKKyAgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSwKK1tjYXQgPDxfTFRfRU9GID4+ICIkb2ZpbGUiCisKK2RubCBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlICQxIGhlcmUsIHNpbmNlIF9MVF9UQUcgaXMgbm90IGV4cGFuZGVkCitkbmwgaW4gYSBjb21tZW50IChpZSBhZnRlciBhICMpLgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0xJQlRPT0xfVEFHX1ZBUlMoX0xUX1RBRykKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfRU9GCitdKWRubCAvbTRfaWYKK10sCitbbTRfaWYoWyQxXSwgW10sIFsKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJ10sIFtdKQorXSlkbmwgL19MVF9DT05GSUdfU0FWRV9DT01NQU5EUworXSkjIF9MVF9DT05GSUcKKworCisjIExUX1NVUFBPUlRFRF9UQUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJhY2UgdGhpcyBtYWNybyB0byBkaXNjb3ZlciB3aGF0IHRhZ3MgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGlidG9vbAorIyAtLXRhZyBvcHRpb24sIHVzaW5nOgorIyAgICBhdXRvY29uZiAtLXRyYWNlICdMVF9TVVBQT1JURURfVEFHOiQxJworQUNfREVGVU4oW0xUX1NVUFBPUlRFRF9UQUddLCBbXSkKKworCisjIEMgc3VwcG9ydCBpcyBidWlsdC1pbiBmb3Igbm93CittNF9kZWZpbmUoW19MVF9MQU5HX0NfZW5hYmxlZF0sIFtdKQorbTRfZGVmaW5lKFtfTFRfVEFHU10sIFtdKQorCisKKyMgTFRfTEFORyhMQU5HKQorIyAtLS0tLS0tLS0tLS0tCisjIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLgorQUNfREVGVU4oW0xUX0xBTkddLAorW0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK200X2Nhc2UoWyQxXSwKKyAgW0NdLAkJCVtfTFRfTEFORyhDKV0sCisgIFtDKytdLAkJW19MVF9MQU5HKENYWCldLAorICBbR29dLAkJCVtfTFRfTEFORyhHTyldLAorICBbSmF2YV0sCQlbX0xUX0xBTkcoR0NKKV0sCisgIFtGb3J0cmFuIDc3XSwJCVtfTFRfTEFORyhGNzcpXSwKKyAgW0ZvcnRyYW5dLAkJW19MVF9MQU5HKEZDKV0sCisgIFtXaW5kb3dzIFJlc291cmNlXSwJW19MVF9MQU5HKFJDKV0sCisgIFttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19DT05GSUddLAorICAgIFtfTFRfTEFORygkMSldLAorICAgIFttNF9mYXRhbChbJDA6IHVuc3VwcG9ydGVkIGxhbmd1YWdlOiAiJDEiXSldKV0pZG5sCitdKSMgTFRfTEFORworCisKKyMgX0xUX0xBTkcoTEFOR05BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HXSwKK1ttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10sCisgIFtMVF9TVVBQT1JURURfVEFHKFskMV0pZG5sCisgIG00X2FwcGVuZChbX0xUX1RBR1NdLCBbJDEgXSlkbmwKKyAgbTRfZGVmaW5lKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSlkbmwKKyAgX0xUX0xBTkdfJDFfQ09ORklHKCQxKV0pZG5sCitdKSMgX0xUX0xBTkcKKworCittNF9pZm5kZWYoW0FDX1BST0dfR09dLCBbCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9URTogVGhpcyBtYWNybyBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbnRvICAgIworIyAgR05VIEF1dG9jb25mIGFzIEFDX1BST0dfR08uICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICAjCisjICBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXV0b2NvbmYgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzICAgICMKKyMgIG1hY3JvIGFuZCB1c2UgaXQgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCittNF9kZWZ1bihbQUNfUFJPR19HT10sCitbQUNfTEFOR19QVVNIKEdvKWRubAorQUNfQVJHX1ZBUihbR09DXSwgICAgIFtHbyBjb21waWxlciBjb21tYW5kXSlkbmwKK0FDX0FSR19WQVIoW0dPRkxBR1NdLCBbR28gY29tcGlsZXIgZmxhZ3NdKWRubAorX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCitBQ19DSEVDS19UT09MKEdPQywgZ2NjZ28pCitpZiB0ZXN0IC16ICIkR09DIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgQUNfQ0hFQ0tfUFJPRyhHT0MsIFske2FjX3Rvb2xfcHJlZml4fWdjY2dvXSwgWyR7YWNfdG9vbF9wcmVmaXh9Z2NjZ29dKQorICBmaQorZmkKK2lmIHRlc3QgLXogIiRHT0MiOyB0aGVuCisgIEFDX0NIRUNLX1BST0coR09DLCBnY2NnbywgZ2NjZ28sIGZhbHNlKQorZmkKK10pI200X2RlZnVuCitdKSNtNF9pZm5kZWYKKworCisjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkdfREVGQVVMVF9DT05GSUddLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgIFtMVF9MQU5HKENYWCldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbTFRfTEFORyhDWFgpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAorICBbTFRfTEFORyhGNzcpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0xUX0xBTkcoRjc3KV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRkNdLAorICBbTFRfTEFORyhGQyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0ZDXSwgZGVmbihbQUNfUFJPR19GQ10pW0xUX0xBTkcoRkMpXSldKQorCitkbmwgVGhlIGNhbGwgdG8gW0FdW01fUFJPR19HQ0pdIGlzIHF1b3RlZCBsaWtlIHRoYXQgdG8gc3RvcCBhY2xvY2FsCitkbmwgcHVsbGluZyB0aGluZ3MgaW4gbmVlZGxlc3NseS4KK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCisgIFtMVF9MQU5HKEdDSildLAorICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAorICAgIFtMVF9MQU5HKEdDSildLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19HQ0pdLAorICAgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgICBbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbTFRfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0xUX1BST0dfR0NKXSwgZGVmbihbTFRfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pXSldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dPXSwKKyAgW0xUX0xBTkcoR08pXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19HT10sIGRlZm4oW0FDX1BST0dfR09dKVtMVF9MQU5HKEdPKV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfUkNdLAorICBbTFRfTEFORyhSQyldLAorICBbbTRfZGVmaW5lKFtMVF9QUk9HX1JDXSwgZGVmbihbTFRfUFJPR19SQ10pW0xUX0xBTkcoUkMpXSldKQorXSkjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisKKyMgT2Jzb2xldGUgbWFjcm9zOgorQVVfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW0xUX0xBTkcoQysrKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbTFRfTEFORyhGb3J0cmFuIDc3KV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtMVF9MQU5HKEZvcnRyYW4pXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtMVF9MQU5HKEphdmEpXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwgW0xUX0xBTkcoV2luZG93cyBSZXNvdXJjZSldKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbXSkKKworCisjIF9MVF9UQUdfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UQUdfQ09NUElMRVJdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorCitfTFRfREVDTChbTFRDQ10sIFtDQ10sIFsxXSwgW0EgQyBjb21waWxlcl0pZG5sCitfTFRfREVDTChbTFRDRkxBR1NdLCBbQ0ZMQUdTXSwgWzFdLCBbTFRDQyBjb21waWxlciBmbGFnc10pZG5sCitfTFRfVEFHREVDTChbQ0NdLCBbY29tcGlsZXJdLCBbMV0sIFtBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyXSlkbmwKK19MVF9UQUdERUNMKFt3aXRoX2djY10sIFtHQ0NdLCBbMF0sIFtJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj9dKWRubAorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCitdKSMgX0xUX1RBR19DT01QSUxFUgorCisKKyMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gY29uZnRlc3QqCitdKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCitdKSMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIF9MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuX29uY2UoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSxbCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4qKQorICAgIEFDX0NIRUNLX1RPT0woW0RTWU1VVElMXSwgW2RzeW11dGlsXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW05NRURJVF0sIFtubWVkaXRdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTElQT10sIFtsaXBvXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MXSwgW290b29sXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MNjRdLCBbb3Rvb2w2NF0sIFs6XSkKKyAgICBfTFRfREVDTChbXSwgW0RTWU1VVElMXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTk1FRElUXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW0xJUE9dLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTF0sIFsxXSwKKyAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTDY0XSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40XSkKKworICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWddLFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kXSwKKyAgICAgIFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBpZiB0ZXN0IC16ICIke0xUX01VTFRJX01PRFVMRX0iOyB0aGVuCisJIyBCeSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSAtc2luZ2xlX21vZHVsZSBmbGFnLiBZb3UgY2FuIG92ZXJyaWRlCisJIyBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTFRfTVVMVElfTU9EVUxFCisJIyBub24tZW1wdHkgYXQgY29uZmlndXJlIHRpbWUsIG9yIGJ5IGFkZGluZyAtbXVsdGlfbW9kdWxlIHRvIHRoZQorCSMgbGluayBmbGFncy4KKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJZWNobyAiaW50IGZvbyh2b2lkKXtyZXR1cm4gMTt9IiA+IGNvbmZ0ZXN0LmMKKwllY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCSMgSWYgdGhlcmUgaXMgYSBub24tZW1wdHkgZXJyb3IgbG9nLCBhbmQgInNpbmdsZV9tb2R1bGUiCisJIyBhcHBlYXJzIGluIGl0LCBhc3N1bWUgdGhlIGZsYWcgY2F1c2VkIGEgbGlua2VyIHdhcm5pbmcKKyAgICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgc2luZ2xlX21vZHVsZSBjb25mdGVzdC5lcnI7IHRoZW4KKwkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorCSMgT3RoZXJ3aXNlLCBpZiB0aGUgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggYSAwIGV4aXQgY29kZSBmcm9tCisJIyB0aGUgY29tcGlsZXIsIGl0IHdvcmtlZC4KKwllbGlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAkX2x0X3Jlc3VsdCAtZXEgMDsgdGhlbgorCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwlybSAtZiBjb25mdGVzdC4qCisgICAgICBmaV0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWddLAorICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdF0sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9eWVzXSwKKwlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vXSkKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIF0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnXSxbbHRfY3ZfbGRfZm9yY2VfbG9hZF0sCisgICAgICBbbHRfY3ZfbGRfZm9yY2VfbG9hZD1ubworICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgZm9yY2VkX2xvYWRlZCgpIHsgcmV0dXJuIDI7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBlY2hvICIkUkFOTElCIGxpYmNvbmZ0ZXN0LmEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSAyPmNvbmZ0ZXN0LmVycgorICAgICAgX2x0X3Jlc3VsdD0kPworICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgZm9yY2VfbG9hZCBjb25mdGVzdC5lcnI7IHRoZW4KKwljYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGVsaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICAgICAgcm0gLWYgY29uZnRlc3QuZXJyIGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QgY29uZnRlc3QuYworICAgICAgICBybSAtcmYgY29uZnRlc3QuZFNZTQorICAgIF0pCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bWzkxXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworCTEwLltbMDEyXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworCTEwLiopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisgICAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX3NpbmdsZV9tb2Q9JyRzaW5nbGVfbW9kdWxlJworICAgIGZpCisgICAgaWYgdGVzdCAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nICR7d2x9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltJworICAgIGVsc2UKKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9J34kTk1FRElUIC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiIgJiYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gIm5vIjsgdGhlbgorICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKKyAgICBlbHNlCisgICAgICBfbHRfZHN5bXV0aWw9CisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQorCisKKyMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVja3MgZm9yIGxpbmtlciBhbmQgY29tcGlsZXIgZmVhdHVyZXMgb24gZGFyd2luCittNF9kZWZ1bihbX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVNdLAorWworICBtNF9yZXF1aXJlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIGlmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJ5ZXMiOyB0aGVuCisgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSdgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UgJHt3bH0tZm9yY2VfbG9hZCwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCcKKyAgICBtNF9jYXNlKFskMV0sIFtGNzddLCBbX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXNdLAorICAgICAgICAgICAgICAgICAgW0ZDXSwgIFtfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllc10pCisgIGVsc2UKKyAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgZmkKKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbTRfaWYoWyQxXSwgW0NYWF0sCitbICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgZmkKK10sW10pCisgIGVsc2UKKyAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICBmaQorXSkKKworIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KKyMgU3RvcmUgdGhlIHJlc3VsdHMgZnJvbSB0aGUgZGlmZmVyZW50IGNvbXBpbGVycyBmb3IgZWFjaCBUQUdOQU1FLgorIyBBbGxvdyB0byBvdmVycmlkZSB0aGVtIGZvciBhbGwgdGFncyB0aHJvdWdoIGx0X2N2X2FpeF9saWJwYXRoLgorbTRfZGVmdW4oW19MVF9TWVNfTU9EVUxFX1BBVEhfQUlYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAoraWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgQUNfQ0FDSEVfVkFMKFtfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKV0sCisgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNXSxbCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nWworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9XScKKyAgX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSk9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pIjsgdGhlbgorICAgIF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaV0sW10pCisgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKSI7IHRoZW4KKyAgICBfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKT0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKyAgXSkKKyAgYWl4X2xpYnBhdGg9JF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pCitmaQorXSkjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisKKworIyBfTFRfU0hFTExfSU5JVChBUkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1NIRUxMX0lOSVRdLAorW200X2RpdmVydF90ZXh0KFtNNFNILUlOSVRdLCBbJDEKK10pXSkjIF9MVF9TSEVMTF9JTklUCisKKworCisjIF9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgaG93IHdlIGNhbiBmYWtlIGFuIGVjaG8gY29tbWFuZCB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2guCisjIEluIHBhcnRpY3VsYXIsIHdpdGggQXV0b2NvbmYgMi42MCBvciBsYXRlciB3ZSBhZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydAorIyBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBmaW5kIGEgc2hlbGwgd2l0aCBhIGJ1aWx0aW4KKyMgcHJpbnRmICh3aGljaCB3ZSBjYW4gdXNlIGFzIGFuIGVjaG8gY29tbWFuZCkuCittNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAorW0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIHByaW50IHN0cmluZ3NdKQorIyBUZXN0IHByaW50IGZpcnN0LCBiZWNhdXNlIGl0IHdpbGwgYmUgYSBidWlsdGluIGlmIHByZXNlbnQuCitpZiB0ZXN0ICJYYCggcHJpbnQgLXIgLS0gLW4gKSAyPi9kZXYvbnVsbGAiID0gWC1uICYmIFwKKyAgIHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50IC1yIC0tJworZWxpZiB0ZXN0ICJYYHByaW50ZiAlcyAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnRmICVzXG4nCitlbHNlCisgICMgVXNlIHRoaXMgZnVuY3Rpb24gYXMgYSBmYWxsYmFjayB0aGF0IGFsd2F5cyB3b3Jrcy4KKyAgZnVuY19mYWxsYmFja19lY2hvICgpCisgIHsKKyAgICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorJFtdMQorX0xURUNIT19FT0YnCisgIH0KKyAgRUNITz0nZnVuY19mYWxsYmFja19lY2hvJworZmkKKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIgCit9CisKK2Nhc2UgIiRFQ0hPIiBpbgorICBwcmludGYqKSBBQ19NU0dfUkVTVUxUKFtwcmludGZdKSA7OworICBwcmludCopIEFDX01TR19SRVNVTFQoW3ByaW50IC1yXSkgOzsKKyAgKikgQUNfTVNHX1JFU1VMVChbY2F0XSkgOzsKK2VzYWMKKworbTRfaWZkZWYoW19BU19ERVRFQ1RfU1VHR0VTVEVEXSwKK1tfQVNfREVURUNUX1NVR0dFU1RFRChbCisgIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSR7QkFTSF9WRVJTSU9OK3NldH0iIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPYCIgPSAiWCRFQ0hPIiBcCisgICAgICB8fCB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPYCIgPSAiWCRFQ0hPIiApXSldKQorCitfTFRfREVDTChbXSwgW1NIRUxMXSwgWzFdLCBbU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0c10pCitfTFRfREVDTChbXSwgW0VDSE9dLCBbMV0sIFtBbiBlY2hvIHByb2dyYW0gdGhhdCBwcm90ZWN0cyBiYWNrc2xhc2hlc10pCitdKSMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKworCisjIF9MVF9XSVRIX1NZU1JPT1QKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9XSVRIX1NZU1JPT1RdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIHN5c3Jvb3RdKQorQUNfQVJHX1dJVEgoW3N5c3Jvb3RdLAorWyAgLS13aXRoLXN5c3Jvb3RbPURJUl0gU2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzIHdpdGhpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgIChvciB0aGUgY29tcGlsZXIncyBzeXNyb290IGlmIG5vdCBzcGVjaWZpZWQpLl0sCitbXSwgW3dpdGhfc3lzcm9vdD1ub10pCisKK2RubCBsdF9zeXNyb290IHdpbGwgYWx3YXlzIGJlIHBhc3NlZCB1bnF1b3RlZC4gIFdlIHF1b3RlIGl0IGhlcmUKK2RubCBpbiBjYXNlIHRoZSB1c2VyIHBhc3NlZCBhIGRpcmVjdG9yeSBuYW1lLgorbHRfc3lzcm9vdD0KK2Nhc2UgJHt3aXRoX3N5c3Jvb3R9IGluICMoCisgeWVzKQorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgbHRfc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKKyAgIGZpCisgICA7OyAjKAorIC8qKQorICAgbHRfc3lzcm9vdD1gZWNobyAiJHdpdGhfc3lzcm9vdCIgfCBzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgOzsgIygKKyBub3wnJykKKyAgIDs7ICMoCisgKikKKyAgIEFDX01TR19SRVNVTFQoWyR7d2l0aF9zeXNyb290fV0pCisgICBBQ19NU0dfRVJST1IoW1RoZSBzeXNyb290IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC5dKQorICAgOzsKK2VzYWMKKworIEFDX01TR19SRVNVTFQoWyR7bHRfc3lzcm9vdDotbm99XSkKK19MVF9ERUNMKFtdLCBbbHRfc3lzcm9vdF0sIFswXSwgW1RoZSByb290IHdoZXJlIHRvIHNlYXJjaCBmb3IgXWRubAorW2RlcGVuZGVudCBsaWJyYXJpZXMsIGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuXSldKQorCisjIF9MVF9FTkFCTEVfTE9DSworIyAtLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfRU5BQkxFX0xPQ0tdLAorW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCisgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisgICAgW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICAgKkVMRi0zMiopCisJSFBVWF9JQTY0X01PREU9IjMyIgorCTs7CisgICAgICAqRUxGLTY0KikKKwlIUFVYX0lBNjRfTU9ERT0iNjQiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSAnJExJTkVOTycgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtMzIiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwkgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgICAqMzItYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgOzsKKwkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfTEFOR19QVVNIKEMpCisgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSxbW11dKV0sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCisgICAgIEFDX0xBTkdfUE9QXSkKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopCisgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgaT84Ni0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjKi0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgICMgR05VIGxkIDIuMjEgaW50cm9kdWNlZCBfc29sMiBlbXVsYXRpb25zLiAgVXNlIHRoZW0gaWYgYXZhaWxhYmxlLgorICAgICAgICBpZiAke0xELWxkfSAtViB8IGdyZXAgX3NvbDIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgTEQ9IiR7TEQtbGR9X3NvbDIiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKK10pIyBfTFRfRU5BQkxFX0xPQ0sKKworCisjIF9MVF9QUk9HX0FSCisjIC0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BST0dfQVJdLAorW0FDX0NIRUNLX1RPT0xTKEFSLCBbYXJdLCBmYWxzZSkKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CitfTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKK19MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0sIFtGbGFncyB0byBjcmVhdGUgYW4gYXJjaGl2ZV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydF0sIFtsdF9jdl9hcl9hdF9maWxlXSwKKyAgW2x0X2N2X2FyX2F0X2ZpbGU9bm8KKyAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLAorICAgICBbZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCisgICAgICBBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKyAgICAgIGlmIHRlc3QgIiRhY19zdGF0dXMiIC1lcSAwOyB0aGVuCisJIyBFbnN1cmUgdGhlIGFyY2hpdmVyIGZhaWxzIHVwb24gYm9ndXMgZmlsZSBuYW1lcy4KKwlybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGxpYmNvbmZ0ZXN0LmEKKwlBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorICAgICBdKQorICBdKQorCitpZiB0ZXN0ICJ4JGx0X2N2X2FyX2F0X2ZpbGUiID0geG5vOyB0aGVuCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0KK2Vsc2UKKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9jdl9hcl9hdF9maWxlCitmaQorX0xUX0RFQ0woW10sIFthcmNoaXZlcl9saXN0X3NwZWNdLCBbMV0sCisgIFtIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXJdKQorXSkjIF9MVF9QUk9HX0FSCisKKworIyBfTFRfQ01EX09MRF9BUkNISVZFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX09MRF9BUkNISVZFXSwKK1tfTFRfUFJPR19BUgorCitBQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgorX0xUX0RFQ0woW10sIFtTVFJJUF0sIFsxXSwgW0Egc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtXSkKKworQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06CitfTFRfREVDTChbXSwgW1JBTkxJQl0sIFsxXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCR0b29sX29sZGxpYiIKK2ZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249eWVzIDs7CisgICopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPW5vIDs7Citlc2FjCitfTFRfREVDTChbXSwgW29sZF9wb3N0aW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX0RFQ0woW10sIFtvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKK19MVF9ERUNMKFtdLCBbbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uXSwgWzBdLAorICAgIFtXaGV0aGVyIHRvIHVzZSBhIGxvY2sgZm9yIG9sZCBhcmNoaXZlIGV4dHJhY3Rpb25dKQorXSkjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKworCisjIF9MVF9DT01QSUxFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjCQlbT1VUUFVULUZJTEVdLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9DT01QSUxFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgbTRfaWYoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitlbHNlCisgICAgbTRfaWYoWyQ2XSwgLCA6LCBbJDZdKQorZmkKK10pIyBfTFRfQ09NUElMRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbX0xUX0NPTVBJTEVSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW10pCisKKworIyBfTFRfTElOS0VSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmtlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfTElOS0VSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJDMiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAkMj15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgbTRfaWYoWyQ0XSwgLCA6LCBbJDRdKQorZWxzZQorICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKK2ZpCitdKSMgX0xUX0xJTktFUl9PUFRJT04KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbX0xUX0xJTktFUl9PUFRJT05dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbXSkKKworCisjIExUX0NNRF9NQVhfTEVOCisjLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfQ01EX01BWF9MRU5dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworQUNfTVNHX0NIRUNLSU5HKFt0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50c10pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19tYXhfY21kX2xlbl0sIFtkbmwKKyAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG1pbnQqKQorICAgICMgT24gTWlOVCB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3MyKikKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGEgbG9uZyB0aW1lIG9uIE9TLzIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTIKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbCSBdXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgICMgTWFrZSB0ZXN0c3RyaW5nIGEgbGl0dGxlIGJpZ2dlciBiZWZvcmUgd2UgZG8gYW55dGhpbmcgd2l0aCBpdC4KKyAgICAgICMgYSAxSyBzdHJpbmcgc2hvdWxkIGJlIGEgcmVhc29uYWJsZSBzdGFydC4KKyAgICAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA7IGRvCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KKyAgICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCisgICAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgICAgd2hpbGUgeyB0ZXN0ICJYImBlbnYgZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgICBkbworICAgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCisgICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQorICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworXSkKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkbHRfY3Zfc3lzX21heF9jbWRfbGVuKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorX0xUX0RFQ0woW10sIFttYXhfY21kX2xlbl0sIFswXSwKKyAgICBbV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kP10pCitdKSMgTFRfQ01EX01BWF9MRU4KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFtMVF9DTURfTUFYX0xFTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW10pCisKKworIyBfTFRfSEVBREVSX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfSEVBREVSX0RMRkNOXSwKK1tBQ19DSEVDS19IRUFERVJTKFtkbGZjbi5oXSwgW10sIFtdLCBbQUNfSU5DTFVERVNfREVGQVVMVF0pZG5sCitdKSMgX0xUX0hFQURFUl9ETEZDTgorCisKKyMgX0xUX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAorIyAgICAgICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRkFMU0UsIEFDVElPTi1JRi1DUk9TUy1DT01QSUxJTkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfVFJZX0RMT1BFTl9TRUxGXSwKK1ttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgWyQ0XQorZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitbI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9XQorX0xUX0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgJDMKKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCitdKSMgX0xUX1RSWV9ETE9QRU5fU0VMRgorCisKKyMgTFRfU1lTX0RMT1BFTl9TRUxGCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgXSkKKyAgICA7OworCisgICopCisgICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKKyAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSwKKwlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKKwkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKKwkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKKwkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCQkgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCJdLAorCSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCisJCSAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0pCisJICAgICAgXSkKKwkgICAgXSkKKwkgIF0pCisJXSkKKyAgICAgIF0pCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKKyAgICBdKQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMsIFtkbmwKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubywgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcykKKyAgICAgIF0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW2Rsb3Blbl9zdXBwb3J0XSwgW2VuYWJsZV9kbG9wZW5dLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWRdKQorX0xUX0RFQ0woW2Rsb3Blbl9zZWxmXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZfc3RhdGljXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWNdLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQorXSkjIExUX1NZU19ETE9QRU5fU0VMRgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbTFRfU1lTX0RMT1BFTl9TRUxGXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlci4KKyMgVGhpcyBtYWNybyBkb2VzIG5vdCBoYXJkIGNvZGUgdGhlIGNvbXBpbGVyIGxpa2UgQUNfUFJPR19DQ19DX08uCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0NfT10sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCitdKQorX0xUX1RBR0RFQ0woW2NvbXBpbGVyX2Nfb10sIFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFsxXSwKKwlbRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zP10pCitdKSMgX0xUX0NPTVBJTEVSX0NfTworCisKKyMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1NdLAorW200X3JlcXVpcmUoW19MVF9FTkFCTEVfTE9DS10pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT01QSUxFUl9DX08oWyQxXSkKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKK19MVF9ERUNMKFtdLCBbbmVlZF9sb2Nrc10sIFsxXSwgW011c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uP10pCitdKSMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MKKworCisjIF9MVF9DSEVDS19PQkpESVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DSEVDS19PQkpESVJdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCitbcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCitvYmpkaXI9JGx0X2N2X29iamRpcgorX0xUX0RFQ0woW10sIFtvYmpkaXJdLCBbMF0sCisgICAgICAgICBbVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW0xUX09CSkRJUl0pZG5sCitBQ19ERUZJTkVfVU5RVU9URUQoTFRfT0JKRElSLCAiJGx0X2N2X29iamRpci8iLAorICBbRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy5dKQorXSkjIF9MVF9DSEVDS19PQkpESVIKKworCisjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEhdLAorW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCitfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQoraWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fAorICAgdGVzdCAtbiAiJF9MVF9UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwKKyAgIHRlc3QgIlgkX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKSIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCitmaQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQorCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbmsgfHwKKyAgIHRlc3QgIiRfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKSIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2FjdGlvbl0sIFswXSwKKyAgICBbSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGVdKQorXSkjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSAorCisKKyMgX0xUX0NNRF9TVFJJUExJQgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9TVFJJUExJQl0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgOzsKKyAgZXNhYworZmkKK19MVF9ERUNMKFtdLCBbb2xkX3N0cmlwbGliXSwgWzFdLCBbQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3RyaXBsaWJdLCBbMV0pCitdKSMgX0xUX0NNRF9TVFJJUExJQgorCisKKyMgX0xUX1NZU19EWU5BTUlDX0xJTktFUihbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCittNF9pZihbJDFdLAorCVtdLCBbCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OworICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7CisgIGVzYWMKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VkX3N0cmlwX2VxPSJzLD1cKFtbQS1aYS16XV06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAorICAgIDs7CisgICopCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgOzsKKyAgZXNhYworICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtbbHRfZm9vXV0rKzsgfQorICBpZiAobHRfZnJlcVtbbHRfZm9vXV0gPT0gMSkgeyBwcmludCBsdF9mb287IH0KK30nYAorICAjIEFXSyBwcm9ncmFtIGFib3ZlIGVycm9uZW91c2x5IHByZXBlbmRzICcvJyB0byBDOi9kb3MvcGF0aHMKKyAgIyBmb3IgdGhlc2UgaG9zdHMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfFwKKyAgICAgICRTRUQgJ3MsL1woW1tBLVphLXpdXTpcKSxcMSxnJ2AgOzsKKyAgZXNhYworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpXSkKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4W1s0LTldXSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bWzAxXV0gfCBhaXg0LltbMDFdXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8ICRHUkVQIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBjYXNlICRob3N0X2NwdSBpbgorICBwb3dlcnBjKQorICAgICMgU2luY2UgSnVseSAyMDA3IEFtaWdhT1M0IG9mZmljaWFsbHkgc3VwcG9ydHMgLnNvIGxpYnJhcmllcy4KKyAgICAjIFdoZW4gY29tcGlsaW5nIHRoZSBleGVjdXRhYmxlLCBhZGQgLXVzZS1keW5sZCAtTHNvYmpzOiB0byB0aGUgY29tcGlsZWxpbmUuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgOzsKKyAgbTY4aykKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgICAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWBmdW5jX2VjaG9fYWxsICIkbGliIiB8ICRTRUQgJ1wnJ3MlXi4qL1woW1teL11dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKK200X2lmKFskMV0sIFtdLFsKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xpYi93MzJhcGkiXSkKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY2VnY2MqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisKKyAgKixjbCopCisgICAgIyBOYXRpdmUgTVNWQworICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbW2EtekEtWl1dXFwpOnwgL1xcMXxnJyAtZSAnc3xeIHx8J2AKKyAgICAgIDs7CisgICAgY3lnd2luKikKKyAgICAgICMgQ29udmVydCB0byB1bml4IGZvcm0sIHRoZW4gdG8gZG9zIGZvcm0sIHRoZW4gYmFjayB0byB1bml4IGZvcm0KKyAgICAgICMgYnV0IHRoaXMgdGltZSBkb3Mgc3R5bGUgKG5vIHNwYWNlcyEpIHNvIHRoYXQgdGhlIHVuaXggZm9ybSBsb29rcworICAgICAgIyBsaWtlIC9jeWdkcml2ZS9jL1BST0dSQX4xOi9jeWdkci4uLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMSUIiYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLWRvcyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgMj4vZGV2L251bGxgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgOzsKKyAgICAqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkTElCIgorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgWyRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgICMgRklYTUU6IGZpbmQgdGhlIHNob3J0IG5hbWUgb3IgdGhlIHBhdGggY29tcG9uZW50cywgYXMgc3BhY2VzIGFyZQorICAgICAgIyBjb21tb24uIChlLmcuICJQcm9ncmFtIEZpbGVzIiAtPiAiUFJPR1JBfjEiKQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGluay5leGUnCisgICAgOzsKKworICAqKQorICAgICMgQXNzdW1lIE1TVkMgd3JhcHBlcgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworICBlc2FjCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKK200X2lmKFskMV0sIFtdLFsKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIl0pCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbWzIzXV0uKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIuKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzItOV1dKiB8IGZyZWVic2RlbGYzLltbMi05XV0qIHwgXAorICBmcmVlYnNkNC5bWzAtNV1dIHwgZnJlZWJzZGVsZjQuW1swLTVdXSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgKikgIyBmcm9tIDQuNiBvbiwgYW5kIERyYWdvbkZseQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitoYWlrdSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NSwgLi4uCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICAjIG9yIGZhaWxzIG91dHJpZ2h0LCBzbyBvdmVycmlkZSBhdG9taWNhbGx5OgorICBpbnN0YWxsX292ZXJyaWRlX21vZGU9NTU1CisgIDs7CisKK2ludGVyaXhbWzMtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBBQ19DQUNIRV9WQUwoW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sCisgICAgW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSlcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKVwiIgorICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKKyAgICAgIFtBU19JRihbICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbF0sCisJIFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzXSldKQorICAgIExERkxBR1M9JHNhdmVfTERGTEFHUworICAgIGxpYmRpcj0kc2F2ZV9saWJkaXIKKyAgICBdKQorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZGVsZiotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRkeW5hbWljX2xpbmtlcl0pCit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCitfTFRfREVDTChbXSwgW3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rXSwgWzFdLAorICAgIFtWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyAgICByZXN0b3JlZCBhdCBsaW5rIHRpbWVdKQorX0xUX0RFQ0woW10sIFtuZWVkX2xpYl9wcmVmaXhdLCBbMF0sCisgICAgW0RvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz9dKQorX0xUX0RFQ0woW10sIFtuZWVkX3ZlcnNpb25dLCBbMF0sIFtEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzP10pCitfTFRfREVDTChbXSwgW3ZlcnNpb25fdHlwZV0sIFswXSwgW0xpYnJhcnkgdmVyc2lvbmluZyB0eXBlXSkKK19MVF9ERUNMKFtdLCBbcnVucGF0aF92YXJdLCBbMF0sICBbU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX3Zhcl0sIFswXSxbU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZV0pCitfTFRfREVDTChbXSwgW3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sIFswXSwKKyAgICBbSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoP10pCitfTFRfREVDTChbXSwgW2xpYm5hbWVfc3BlY10sIFsxXSwgW0Zvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4XSkKK19MVF9ERUNMKFtdLCBbbGlicmFyeV9uYW1lc19zcGVjXSwgWzFdLAorICAgIFtbTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyAgICBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FXV0pCitfTFRfREVDTChbXSwgW3NvbmFtZV9zcGVjXSwgWzFdLAorICAgIFtbVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWVdXSkKK19MVF9ERUNMKFtdLCBbaW5zdGFsbF9vdmVycmlkZV9tb2RlXSwgWzFdLAorICAgIFtQZXJtaXNzaW9uIG1vZGUgb3ZlcnJpZGUgZm9yIGluc3RhbGxhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbcG9zdGluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5XSkKK19MVF9ERUNMKFtdLCBbZmluaXNoX2V2YWxdLCBbMV0sCisgICAgW1tBcyAiZmluaXNoX2NtZHMiLCBleGNlcHQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQKKyAgICBub3Qgc2hvd25dXSkKK19MVF9ERUNMKFtdLCBbaGFyZGNvZGVfaW50b19saWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY10sIFsyXSwKKyAgICBbUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorXSkjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIKKworCisjIF9MVF9QQVRIX1RPT0xfUFJFRklYKFRPT0wpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyeQorQUNfREVGVU4oW19MVF9QQVRIX1RPT0xfUFJFRklYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9NQUdJQ19DTUQsCitbY2FzZSAkTUFHSUNfQ01EIGluCitbW1xcLypdIHwgID86W1xcL10qXSkKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCitkbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCitkbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgorICBhY19kdW1teT0ibTRfaWYoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjXSkKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK19MVF9ERUNMKFtdLCBbTUFHSUNfQ01EXSwgWzBdLAorCSBbVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyB3aXRoICJmaWxlIl0pZG5sCitdKSMgX0xUX1BBVEhfVE9PTF9QUkVGSVgKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW19MVF9QQVRIX1RPT0xfUFJFRklYXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTUFHSUMKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIGEgc2hhcmVkIGxpYnJhcnkKK200X2RlZnVuKFtfTFRfUEFUSF9NQUdJQ10sCitbX0xUX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQoraWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgX0xUX1BBVEhfVE9PTF9QUkVGSVgoZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorXSkjIF9MVF9QQVRIX01BR0lDCisKKworIyBMVF9QQVRIX0xECisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oW0xUX1BBVEhfTERdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCisKK0FDX0FSR19XSVRIKFtnbnUtbGRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCisJW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCisgICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCisgICAgW3dpdGhfZ251X2xkPW5vXSlkbmwKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCisgICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorX0xUX1BBVEhfTERfR05VCitBQ19TVUJTVChbTERdKQorCitfTFRfVEFHREVDTChbXSwgW0xEXSwgWzFdLCBbVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllc10pCitdKSMgTFRfUEFUSF9MRAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBTV9QUk9HX0xEXSwgW0xUX1BBVEhfTERdKQorQVVfQUxJQVMoW0FDX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX1BST0dfTERdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfUFJPR19MRF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTERfR05VCisjLSAtLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9QQVRIX0xEX0dOVV0sCitbQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCitbIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjXSkKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorXSkjIF9MVF9QQVRIX0xEX0dOVQorCisKKyMgX0xUX0NNRF9SRUxPQUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK200X2RlZnVuKFtfTFRfQ01EX1JFTE9BRF0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAorICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKKyAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPWZhbHNlCisgICAgZmkKKyAgICA7OworICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2ZsYWddLCBbMV0sIFtIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzXSlkbmwKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2NtZHNdLCBbMl0pZG5sCitdKSMgX0xUX0NNRF9SRUxPQUQKKworCisjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gY2hlY2sgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorbTRfcmVxdWlyZShbX0xUX0RFQ0xfT0JKRFVNUF0pCitBQ19DQUNIRV9DSEVDSyhbaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzXSwKK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kLAorW2x0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeFtbNC05XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitiZW9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKKyAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGFzc3VtZXMgQlNEIG5tLCBzbyBkaXNhbGxvdyBpdCBpZiB1c2luZyBNUyBkdW1wYmluLgorICBpZiAoIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIkJTRCBubSIgJiYgZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgICMgS2VlcCB0aGlzIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gZnVuY193aW4zMl9saWJpZC4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICBmaQorICA7OworCitjZWdjYyopCisgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVtbMy05XV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaGFpa3UqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxFTEYtW1swLTldXVtbMC05XV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGWyAtXVswLTldWzAtOV0pKC1iaXQpPyggW0xNXVNCKT8gc2hhcmVkIG9iamVjdCggZmlsZSk/WywgLV0qIFBBLVJJU0MgWzAtOV1cLlswLTldJ10KKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dXC5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4W1szLTldXSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCisqbnRvKiB8ICpxbngqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKwordHBmKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKK10pCisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bW1wxXV1cL1tbXDFdXVwvZzsvZyJgCisgICAgZmkKKyAgICA7OworICBlc2FjCitmaQorCitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCisKK19MVF9ERUNMKFtdLCBbZGVwbGlic19jaGVja19tZXRob2RdLCBbMV0sCisgICAgW01ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzXSkKK19MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19jbWRdLCBbMV0sCisgICAgW0NvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorX0xUX0RFQ0woW10sIFtmaWxlX21hZ2ljX2dsb2JdLCBbMV0sCisgICAgW0hvdyB0byBmaW5kIHBvdGVudGlhbCBmaWxlcyB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiXSkKK19MVF9ERUNMKFtdLCBbd2FudF9ub2Nhc2VnbG9iXSwgWzFdLAorICAgIFtGaW5kIHBvdGVudGlhbCBmaWxlcyB1c2luZyBub2Nhc2VnbG9iIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorXSkjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKworCisjIExUX1BBVEhfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oW0xUX1BBVEhfTk1dLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKV0sIGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIDogJHtsdF9jdl9wYXRoX05NPW5vfQorZmldKQoraWYgdGVzdCAiJGx0X2N2X3BhdGhfTk0iICE9ICJubyI7IHRoZW4KKyAgTk09IiRsdF9jdl9wYXRoX05NIgorZWxzZQorICAjIERpZG4ndCBmaW5kIGFueSBCU0QgY29tcGF0aWJsZSBuYW1lIGxpc3RlciwgbG9vayBmb3IgZHVtcGJpbi4KKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuIDoKKyAgICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgZWxzZQorICAgIEFDX0NIRUNLX1RPT0xTKERVTVBCSU4sIFtkdW1wYmluICJsaW5rIC1kdW1wIl0sIDopCisgICAgY2FzZSBgJERVTVBCSU4gLXN5bWJvbHMgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKyAgICAqQ09GRiopCisgICAgICBEVU1QQklOPSIkRFVNUEJJTiAtc3ltYm9scyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIERVTVBCSU49OgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIEFDX1NVQlNUKFtEVU1QQklOXSkKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCitBQ19TVUJTVChbTk1dKQorX0xUX0RFQ0woW10sIFtOTV0sIFsxXSwgW0EgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyXSlkbmwKKworQUNfQ0FDSEVfQ0hFQ0soW3RoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2VdLCBbbHRfY3Zfbm1faW50ZXJmYWNlXSwKKyAgW2x0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRhY19jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJE5NIFxcXCJjb25mdGVzdC4kYWNfb2JqZXh0XFxcIlwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAoZXZhbCAiJE5NIFwiY29uZnRlc3QuJGFjX29iamV4dFwiIiAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dCkKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiBvdXRwdXRcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgY2F0IGNvbmZ0ZXN0Lm91dCA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgorICBmaQorICBybSAtZiBjb25mdGVzdCpdKQorXSkjIExUX1BBVEhfTk0KKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQU1fUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK0FVX0FMSUFTKFtBQ19QUk9HX05NXSwgW0xUX1BBVEhfTk1dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX05NXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1BST0dfTk1dLCBbXSkKKworIyBfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeQorIyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBsaW5rIGxpYnJhcnkuCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUJdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKQorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRExMVE9PTF0pCitBQ19DQUNIRV9DSEVDSyhbaG93IHRvIGFzc29jaWF0ZSBydW50aW1lIGFuZCBsaW5rIGxpYnJhcmllc10sCitsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCwKK1tsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0ndW5rbm93bicKKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAjIHR3byBkaWZmZXJlbnQgc2hlbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gbHRtYWluLnNoCisgICMgZGVjaWRlIHdoaWNoIHRvIHVzZSBiYXNlZCBvbiBjYXBhYmlsaXRpZXMgb2YgJERMTFRPT0wKKyAgY2FzZSBgJERMTFRPT0wgLS1oZWxwIDI+JjFgIGluCisgICotLWlkZW50aWZ5LXN0cmljdCopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sKKyAgICA7OworICBlc2FjCisgIDs7CisqKQorICAjIGZhbGxiYWNrOiBhc3N1bWUgbGlua2xpYiBJUyBzaGFyZWRsaWIKKyAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9IiRFQ0hPIgorICA7OworZXNhYworXSkKK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAordGVzdCAteiAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiAmJiBzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kRUNITworCitfTFRfREVDTChbXSwgW3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kXSwgWzFdLAorICAgIFtDb21tYW5kIHRvIGFzc29jaWF0ZSBzaGFyZWQgYW5kIGxpbmsgbGlicmFyaWVzXSkKK10pIyBfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQgorCisKKyMgX0xUX1BBVEhfTUFOSUZFU1RfVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGxvY2F0ZSB0aGUgbWFuaWZlc3QgdG9vbAorbTRfZGVmdW4oW19MVF9QQVRIX01BTklGRVNUX1RPT0xdLAorW0FDX0NIRUNLX1RPT0woTUFOSUZFU1RfVE9PTCwgbXQsIDopCit0ZXN0IC16ICIkTUFOSUZFU1RfVE9PTCIgJiYgTUFOSUZFU1RfVE9PTD1tdAorQUNfQ0FDSEVfQ0hFQ0soW2lmICRNQU5JRkVTVF9UT09MIGlzIGEgbWFuaWZlc3QgdG9vbF0sIFtsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2xdLAorICBbbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPW5vCisgIGVjaG8gIiRhc19tZTokTElORU5POiAkTUFOSUZFU1RfVE9PTCAnLT8nIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICRNQU5JRkVTVF9UT09MICctPycgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdNYW5pZmVzdCBUb29sJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9eWVzCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0Kl0pCitpZiB0ZXN0ICJ4JGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCIgIT0geHllczsgdGhlbgorICBNQU5JRkVTVF9UT09MPToKK2ZpCitfTFRfREVDTChbXSwgW01BTklGRVNUX1RPT0xdLCBbMV0sIFtNYW5pZmVzdCB0b29sXSlkbmwKK10pIyBfTFRfUEFUSF9NQU5JRkVTVF9UT09MCisKKworIyBMVF9MSUJfTQorIyAtLS0tLS0tLQorIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihbTFRfTElCX01dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0xJQk09CitjYXNlICRob3N0IGluCisqLSotYmVvcyogfCAqLSotY2VnY2MqIHwgKi0qLWN5Z3dpbiogfCAqLSotaGFpa3UqIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCisgICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAorICA7OworKi1uY3Itc3lzdjQuMyopCisgIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQorICA7OworKikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKKyAgOzsKK2VzYWMKK0FDX1NVQlNUKFtMSUJNXSkKK10pIyBMVF9MSUJfTQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0NIRUNLX0xJQk1dLCBbTFRfTElCX01dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfTk9fUlRUSV0sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgbnZjYyopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLVhjb21waWxlciAtZm5vLWJ1aWx0aW4nIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zLAorICAgIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sCisgICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCitmaQorX0xUX1RBR0RFQ0woW25vX2J1aWx0aW5fZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9uc10pCitdKSMgX0xUX0NPTVBJTEVSX05PX1JUVEkKKworCisjIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK0FDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdF0pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLAorWworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbW0JDRFRdXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKKyAgOzsKK2hwdXgqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCisgIGZpCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW1tCRFJUXV0nCisgIDs7CitzY28zLjJ2NSopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y0LjJ1dzIqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbW0FCRFRdXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbW0RGTlNUVV1dJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2Nhc2UgYCROTSAtViAyPiYxYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJyA7OworZXNhYworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCisjIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXClbWyBdXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKVtbIF1dKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChsaWJbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gJEVDSE8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcnNjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGlmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgICAgIyBGYWtlIGl0IGZvciBkdW1wYmluIGFuZCBzYXkgVCBmb3IgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24KKyAgICAjIGFuZCBEIGZvciBhbnkgZ2xvYmFsIHZhcmlhYmxlLgorICAgICMgQWxzbyBmaW5kIEMrKyBhbmQgX19mYXN0Y2FsbCBzeW1ib2xzIGZyb20gTVNWQysrLAorICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyBbJyJcCisiICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKKyIgICAgIC9eQ09GRiBTWU1CT0wgVEFCTEUve2ZvcihpIGluIGhpZGUpIGRlbGV0ZSBoaWRlW2ldfTsiXAorIiAgICAgL1NlY3Rpb24gbGVuZ3RoIC4qI3JlbG9jcy4qKHBpY2sgYW55KS97aGlkZVtsYXN0X3NlY3Rpb25dPTF9OyJcCisiICAgICBcJCAwIX4vRXh0ZXJuYWwgKlx8L3tuZXh0fTsiXAorIiAgICAgLyAwKyBVTkRFRiAve25leHR9OyAvIFVOREVGIFwoW158XVwpKigpL3tuZXh0fTsiXAorIiAgICAge2lmKGhpZGVbc2VjdGlvbl0pIG5leHR9OyJcCisiICAgICB7Zj0wfTsgXCQgMH4vXChcKS4qXHwve2Y9MX07IHtwcmludGYgZiA/IFwiVCBcIiA6IFwiRCBcIn07IlwKKyIgICAgIHtzcGxpdChcJCAwLCBhLCAvXHx8XHIvKTsgc3BsaXQoYVsyXSwgcyl9OyJcCisiICAgICBzWzFdfi9eW0A/XS97cHJpbnQgc1sxXSwgc1sxXTsgbmV4dH07IlwKKyIgICAgIHNbMV1+cHJmeCB7c3BsaXQoc1sxXSx0LFwiQFwiKTsgcHJpbnQgdFsxXSwgc3Vic3RyKHRbMV0sbGVuZ3RoKHByZngpKX0iXAorIiAgICAgJyBwcmZ4PV4kYWNfc3ltcHJmeF0iCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qW1sJIF1dXCgkc3ltY29kZSRzeW1jb2RlKlwpW1sJIF1dW1sJIF1dKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnLyBfX2dudV9sdG8vZCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKTsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorX0xUX0VPRgorCisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmICRHUkVQICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgJEdSRVAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxfTFRfRU9GID4gY29uZnRlc3QuJGFjX2V4dAorLyogS2VlcCB0aGlzIGNvZGUgaW4gc3luYyBiZXR3ZWVuIGxpYnRvb2wubTQsIGx0bWFpbiwgbHRfc3lzdGVtLmgsIGFuZCB0ZXN0cy4gICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZSBydW50aW1lCisgICByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24gb24gcHNldWRvLXJlbG9jcy4gICovCisjIGRlZmluZSBMVEAmdEBfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRAJnRAX0RMU1lNX0NPTlNUCisjZWxzZQorIyBkZWZpbmUgTFRAJnRAX0RMU1lNX0NPTlNUIGNvbnN0CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfTFRfRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLworTFRAJnRAX0RMU1lNX0NPTlNUIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHZvaWQgICAgICAgKmFkZHJlc3M7Cit9CitsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Cit7CisgIHsgIkBQUk9HUkFNQCIsICh2b2lkICopIDAgfSwKK19MVF9FT0YKKwkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sLyIgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKHZvaWQgKikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK19MVF9FT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X2dsb2JzeW1fc2F2ZV9MSUJTPSRMSUJTCisJICBsdF9nbG9ic3ltX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgorCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9JGx0X2dsb2JzeW1fc2F2ZV9MSUJTCisJICBDRkxBR1M9JGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1MKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KiBjb25mdHN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCitdKQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChvaykKK2ZpCisKKyMgUmVzcG9uc2UgZmlsZSBzdXBwb3J0LgoraWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitlbGlmICROTSAtLWhlbHAgMj4vZGV2L251bGwgfCBncmVwICdbW0BdXUZJTEUnID4vZGV2L251bGw7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitmaQorCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF9waXBlXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLCBbMV0sCisgICAgW1Rha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXNdKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY2RlY2xdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2xdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb25dKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NdLAorICAgIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLAorICAgIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIgd2hlbiBsaWIgcHJlZml4IGlzIG5lZWRlZF0pCitfTFRfREVDTChbXSwgW25tX2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXMgZm9yICROTV0pCitdKSAjIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKKworCisjIF9MVF9DT01QSUxFUl9QSUMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfUElDXSwKK1ttNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPQorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQorCittNF9pZihbJDFdLCBbQ1hYXSwgWworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgIDs7CisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQorICAgICAgOzsKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICpxbngqIHwgKm50byopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4W1s0LTldXSopCisJIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwllbHNlCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKwlmaQorCTs7CisgICAgICBjaG9ydXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJY3hjaDY4KikKKwkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAjIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisJIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworCSMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisJbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCSAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisJOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKKwk7OworICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgIGZpCisJICAgIDs7CisJICBhQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCp8aWE2NCopCisJICAgICAgIyArWiB0aGUgZGVmYXVsdAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgaW50ZXJpeCopCisJIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCisJIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PworCTs7CisgICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgOzsKKwkgIGVjcGMqICkKKwkgICAgIyBvbGQgSW50ZWwgQysrIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgaWNwYyogKQorCSAgICAjIEludGVsIEMrKywgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisJICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyogfCBwZ2NwcCopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICB4bGMqIHwgeGxDKiB8IGJneGxbW2NDXV0qIHwgbXBpeGxbW2NDXV0qKQorCSAgICAjIElCTSBYTCA4LjAsIDkuMCBvbiBQUEMgYW5kIEJsdWVHZW5lCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbHlueG9zKikKKwk7OworICAgICAgbTg4ayopCisJOzsKKyAgICAgIG12cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGN4eCopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorCTs7CisgICAgICAqcW54KiB8ICpudG8qKQorICAgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICA7OworCSAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgcHNvcyopCisJOzsKKyAgICAgIHNvbGFyaXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyogfCBzdW5DQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgICAgOzsKKwkgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzdW5vczQqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCSAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHRhbmRlbSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHZ4d29ya3MqKQorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgZmkKK10sCitbCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBudmNjKikgIyBDdWRhIENvbXBpbGVyIERyaXZlciAyLjIKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctWGxpbmtlciAnCisgICAgICBpZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIjsgdGhlbgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ii1YY29tcGlsZXIgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorICAgICAgZWNjKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgaWNjIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorICAgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisgICAgICBpY2MqIHwgaWZvcnQqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBMYWhleSBGb3J0cmFuIDguMS4KKyAgICAgIGxmOTUqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLS1zaGFyZWQnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctLXN0YXRpYycKKwk7OworICAgICAgbmFnZm9yKikKKwkjIE5BRyBGb3J0cmFuIGNvbXBpbGVyCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwtV2wsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqIHwgYmd4bCogfCBiZ2YqIHwgbXBpeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSwgMTEuMSBvbiBQUEMgYW5kIEJsdWVHZW5lCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDZXJlc1wgRm9ydHJhbiogfCAqU3VuKkZvcnRyYW4qXCBbWzEtN11dLiogfCAqU3VuKkZvcnRyYW4qXCA4LltbMC0zXV0qKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nJworCSAgOzsKKwkqU3VuXCBGKiB8ICpTdW4qRm9ydHJhbiopCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICA7OworCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICA7OworICAgICAgICAqSW50ZWwqXCBbW0NGXV0qQ29tcGlsZXIqKQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgOzsKKwkqUG9ydGxhbmRcIEdyb3VwKikKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICByZG9zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSogfCBzdW5mNzcqIHwgc3VuZjkwKiB8IHN1bmY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitdKQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlAJnRAbTRfaWYoWyQxXSxbXSxbIC1EUElDXSxbbTRfaWYoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKSIKKyAgICA7OworZXNhYworCitBQ19DQUNIRV9DSEVDSyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgJDEpXSwKKyAgICBbJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pXSwgW10sCisgICAgW2Nhc2UgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiIDs7CisgICAgIGVzYWNdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm9dKQorZmkKK19MVF9UQUdERUNMKFtwaWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFsxXSwKKwlbQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzXSkKKworX0xUX1RBR0RFQ0woW3dsXSwgW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbMV0sCisJW0hvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXJdKQorIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCitfTFRfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLAorICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAkMSksCisgICRsdF90bXBfc3RhdGljX2ZsYWcsCisgIFtdLAorICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPV0pCitfTFRfVEFHREVDTChbbGlua19zdGF0aWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZ10pCitdKSMgX0xUX0NPTVBJTEVSX1BJQworCisKKyMgX0xUX0xJTktFUl9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCittNF9kZWZ1bihbX0xUX0xJTktFUl9TSExJQlNdLAorW0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCittNF9yZXF1aXJlKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCittNF9pZihbJDFdLCBbQ1hYXSwgWworICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbWzQtOV1dKikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsIGRlZmluZWQKKyAgICAjIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgorICAgIGlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgY2wqKQorICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT0nX05VTExfSU1QT1JUX0RFU0NSSVBUT1J8X0lNUE9SVF9ERVNDUklQVE9SXy4qJworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS87cy9eLipbWyBdXV9fbm1fX1woW1teIF1dKlwpW1sgXV1bW14gXV0qL1wxIERBVEEvOy9eSVtbIF1dL2Q7L15bW0FJVFddXVtbIF1dL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJ10KKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgIDs7CisgIGVzYWMKK10sIFsKKyAgcnVucGF0aF92YXI9CisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCisgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KKyAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgX0xUX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KK2RubCBOb3RlIGFsc28gYWRqdXN0IGV4Y2x1ZGVfZXhwc3ltcyBmb3IgQysrIGFib3ZlLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBsaW51eCogfCBrKmJzZCotZ251IHwgZ251KikKKyAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT1ubworICAgIDs7CisgIGVzYWMKKworICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworCisgICMgT24gc29tZSB0YXJnZXRzLCBHTlUgbGQgaXMgY29tcGF0aWJsZSBlbm91Z2ggd2l0aCB0aGUgbmF0aXZlIGxpbmtlcgorICAjIHRoYXQgd2UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgbmF0aXZlIGludGVyZmFjZSBmb3IgYm90aC4KKyAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9bm8KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisJIyBUaGUgQUlYIHBvcnQgb2YgR05VIGxkIGhhcyBhbHdheXMgYXNwaXJlZCB0byBjb21wYXRpYmlsaXR5CisJIyB3aXRoIHRoZSBuYXRpdmUgbGlua2VyLiAgSG93ZXZlciwgYXMgdGhlIHdhcm5pbmcgaW4gdGhlIEdOVSBsZAorCSMgYmxvY2sgc2F5cywgdmVyc2lvbnMgYmVmb3JlIDIuMTkuNSogY291bGRuJ3QgcmVhbGx5IGNyZWF0ZSB3b3JraW5nCisJIyBzaGFyZWQgbGlicmFyaWVzLCByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNlZC4KKwljYXNlIGAkTEQgLXYgMj4mMWAgaW4KKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLjE5LjUqKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuW1syLTldXSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgW1szLTldXSopIDs7CisJICAqKQorCSAgICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICopCisJbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgZWxzZQorICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAqR05VXCBnb2xkKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXhbWzMtOV1dKikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuMTksIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBiaW51dGlscworKioqIDIuMjAgb3IgYWJvdmUsIG9yIG1vZGlmeSB5b3VyIFBBVEggc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLgorKioqIFlvdSB3aWxsIHRoZW4gbmVlZCB0byByZXN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCisKK19MVF9FT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1hbGwtc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLztzL14uKltbIF1dX19ubV9fXChbW14gXV0qXClbWyBdXVtbXiBdXSovXDEgREFUQS87L15JW1sgXV0vZDsvXltbQUlUV11dW1sgXV0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydbX10rR0xPQkFMX09GRlNFVF9UQUJMRV98W19dK0dMT0JBTF9fW0ZJRF1fLip8W19dK2hlYWRfW0EtWmEtejAtOV9dK19kbGx8W0EtWmEtejAtOV9dK19kbGxfaW5hbWUnXQorCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgdG1wX2RpZXQ9bm8KKyAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQorCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCisJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubworICAgICAgdGhlbgorCXRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJworCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisJCQkJCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7CisJZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKKwlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgorCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKKwlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorCSAgdG1wX3NoYXJlZGZsYWc9Jy0tc2hhcmVkJyA7OworCXhsW1tjQ11dKiB8IGJneGxbW2NDXV0qIHwgbXBpeGxbW2NDXV0qKSAjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCisJICB0bXBfc2hhcmVkZmxhZz0nLXFta3Nocm9iaicKKwkgIHRtcF9hZGRmbGFnPSA7OworCW52Y2MqKQkjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCisJICA7OworCWVzYWMKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCWVzYWMKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisgICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKyAgICAgICAgZmkKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJeGxmKiB8IGJnZiogfCBiZ3hsZiogfCBtcGl4bGYqKQorCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFtbNC05XV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwkjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwKKwkjIGRlZmluZWQgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisJIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBlbHNlCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgIGZpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVtbNDVdXSopCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjbCopCisJIyBOYXRpdmUgTVNWQworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCV9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPSdAJworCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgc2VkIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGVsc2UKKwkgICAgc2VkIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGZpfgorCSAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgbGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwlfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisJX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEsREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXVtbIF1dL3MvLipbWyBdXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCSMgRG9uJ3QgdXNlIHJhbmxpYgorCV9MVF9UQUdWQVIob2xkX3Bvc3RpbnN0YWxsX2NtZHMsICQxKT0nY2htb2QgNjQ0ICRvbGRsaWInCisJX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICouZXhlfCouRVhFKSA7OworCSAgICAqKQorCSAgICAgIGx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICBsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCSAgICAgIDs7CisJICBlc2FjfgorCSAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICBmaScKKwk7OworICAgICAgKikKKwkjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBmdW5jX2VjaG9fYWxsICIkZGVwbGlicyIgfCAkU0VEICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKwlfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorCV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisJX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyLiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCW00X2lmKCQxLCBbXSwgWworCSAgIyBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgMTEuMDAgY29tcGlsZXIgZG8gbm90IHVuZGVyc3RhbmQgLWIgeWV0CisJICAjIChIUDkyNDUzLTAxIEEuMTEuMDEuMjAgZG9lc24ndCwgSFA5MjQ1My0wMSBCLjExLlguMzUxNzUtMzUxNzYuR1AgZG9lcykKKwkgIF9MVF9MSU5LRVJfT1BUSU9OKFtpZiAkQ0MgdW5kZXJzdGFuZHMgLWJdLAorCSAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfX2IsICQxKSwgWy1iXSwKKwkgICAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJ10sCisJICAgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJ10pXSwKKwkgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyddKQorCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sXSwKKwkgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbF0sCisJICBbc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgQUNfTElOS19JRkVMU0UoCisJICAgICBbQUNfTEFOR19TT1VSQ0UoCisJICAgICAgICBbQUNfTEFOR19DQVNFKFtDXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbQysrXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbRm9ydHJhbiA3N10sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0sCisJCQkgICAgICBbRm9ydHJhbl0sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0pXSldLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXNdLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ub10pCisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiXSkKKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwlpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkqIkNvbXBpbGVycyA1LjAiKikKKwkgIHdsYXJjPScnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCSopCisJICB3bGFyYz0nJHt3bH0nCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworICAgICAgKikKKwkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKKwkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KKwkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwllbHNlCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SLCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgeCRob3N0X3ZlbmRvciA9IHhzbmk7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CbGFyZ2VkeW5zeW0nCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorXSkKK0FDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKK3Rlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworX0xUX1RBR1ZBUih3aXRoX2dudV9sZCwgJDEpPSR3aXRoX2dudV9sZAorCitfTFRfREVDTChbXSwgW2xpYmV4dF0sIFswXSwgW09sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKV0pZG5sCitfTFRfREVDTChbXSwgW3NocmV4dF9jbWRzXSwgWzFdLCBbU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIildKWRubAorX0xUX0RFQ0woW10sIFtleHRyYWN0X2V4cHN5bXNfY21kc10sIFsyXSwKKyAgICBbVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0sCisJW2x0X2N2X11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSksCisJWyRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworCWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB0aGVuCisJICBzb25hbWU9Y29uZnRlc3QKKwkgIGxpYj1jb25mdGVzdAorCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisJICBkZXBsaWJzPQorCSAgd2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCisJICBwaWNfZmxhZz0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisJICBjb21waWxlcl9mbGFncz0tdgorCSAgbGlua2VyX2ZsYWdzPS12CisJICB2ZXJzdHJpbmc9CisJICBvdXRwdXRfb2JqZGlyPS4KKwkgIGxpYm5hbWU9Y29uZnRlc3QKKwkgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorCSAgaWYgQUNfVFJZX0VWQUwoX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkKKwkgIHRoZW4KKwkgICAgbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwkgIGVsc2UKKwkgICAgbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICBmaQorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisJZmkKKwkkUk0gY29uZnRlc3QqCisJXSkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0kbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitfTFRfVEFHREVDTChbYnVpbGRfbGlidG9vbF9uZWVkX2xjXSwgW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFthbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXNdLAorICAgIFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljXSkKK19MVF9UQUdERUNMKFtdLCBbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zXSkKK19MVF9UQUdERUNMKFtdLCBbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlc10pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX25lZWRzX29iamVjdF0sIFsxXSwKKyAgICBbV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHldKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW0NyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfY21kc10sIFsyXSwgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW21vZHVsZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCisgICAgYSBzaGFyZWQgYXJjaGl2ZS5dKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW3dpdGhfZ251X2xkXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIGFyZSBidWlsZGluZyB3aXRoIEdOVSBsZCBvciBub3RdKQorX0xUX1RBR0RFQ0woW10sIFthbGxvd191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHRdKQorX0xUX1RBR0RFQ0woW10sIFtub191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbRmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisgICAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFsxXSwKKyAgICBbV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyAgICAiYWJzb2x1dGUiLCBpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyAke3NobGlicGF0aF92YXJ9IGlmIHRoZQorICAgIGxpYnJhcnkgaXMgcmVsb2NhdGVkXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbWludXNfTF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYXV0b21hdGljXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAorICAgIGFnYWluc3QgaXRdKQorX0xUX1RBR0RFQ0woW10sIFtpbmhlcml0X3JwYXRoXSwgWzBdLAorICAgIFtTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcworICAgIHRvIHJ1bnRpbWUgcGF0aCBsaXN0XSkKK19MVF9UQUdERUNMKFtdLCBbbGlua19hbGxfZGVwbGlic10sIFswXSwKKyAgICBbV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFtdLCBbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWRdKQorX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfc3ltYm9sc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbZXhjbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaW5jbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVsaW5rX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBmaW5pc2hpbmcgbGlua2luZyBwcm9ncmFtc10pCitfTFRfVEFHREVDTChbXSwgW2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXNdKQorZG5sIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCitkbmwgX0xUX1RBR0RFQ0woW10sIFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbMV0sCitkbmwgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkIHNhZmUgb2JqZWN0c10pCitdKSMgX0xUX0xJTktFUl9TSExJQlMKKworCisjIF9MVF9MQU5HX0NfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitsdF9zYXZlX0NDPSIkQ0MiCitBQ19MQU5HX1BVU0goQykKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9JworCitfTFRfVEFHX0NPTVBJTEVSCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorICBMVF9TWVNfRExPUEVOX1NFTEYKKyAgX0xUX0NNRF9TVFJJUExJQgorCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbWzQtOV1dKikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKK0FDX0xBTkdfUE9QCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfQ19DT05GSUcKKworCisjIF9MVF9MQU5HX0NYWF9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDKysgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NYWF9DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfTUFOSUZFU1RfVE9PTF0pZG5sCitpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorICBBQ19QUk9HX0NYWENQUAorZWxzZQorICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKK2ZpCisKK0FDX0xBTkdfUFVTSChDKyspCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWNwcAorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgQ1hYIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltbXV0pIHsgcmV0dXJuKDApOyB9JworCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0kQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBsdF9zYXZlX0xEPSRMRAorICBsdF9zYXZlX0dDQz0kR0NDCisgIEdDQz0kR1hYCisgIGx0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCisgIGx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAorICBpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKKyAgZmkKKyAgdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKKyAgQ0M9JHtDWFgtImMrKyJ9CisgIENGTEFHUz0kQ1hYRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICAjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2hlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKKyAgICAjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisgICAgZmkKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisgICAgICBMVF9QQVRIX0xECisKKyAgICAgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAgICAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkcGljX2ZsYWcgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworICAgICAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgICAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCisgICAgICAgIHdsYXJjPScke3dsfScKKworICAgICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwKKwkgICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgICAgd2xhcmM9CisKKyAgICAgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KKyAgICAgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKKyAgICAgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCisgICAgICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgICAgIGZpCisKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKyAgICBlbHNlCisgICAgICBHWFg9bm8KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICB3bGFyYz0KKyAgICBmaQorCisgICAgIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeFtbNS05XV0qKQorCSAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgICAgICBjYXNlICRsZF9mbGFnIGluCisJICAgICAgKi1icnRsKikKKwkgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgICAgICBicmVhaworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgICAgZmkKKworICAgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgoWyQxXSkKKyAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgICBlbHNlCisgICAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisgICAgICAgICAgZWxzZQorCSAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKwkgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorCSAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKKwkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIGVsc2UKKwkgICAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgICAgZmkKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQKKwkgICAgIyBsaWJyYXJpZXMuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgYmVvcyopCisJaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKworICAgICAgY2hvcnVzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICAqKQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKwljYXNlICRHWFgsJGNjX2Jhc2VuYW1lIGluCisJLGNsKiB8IG5vLGNsKikKKwkgICMgTmF0aXZlIE1TVkMKKwkgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKwkgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nQCcKKwkgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJICBsaWJleHQ9bGliCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwkgIHNocmV4dF9jbWRzPSIuZGxsIgorCSAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAkU0VEIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZWxzZQorCSAgICAgICRTRUQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgICBmaX4KKwkgICAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgICBsaW5rbmFtZXM9JworCSAgIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSAgIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCSAgIyBEb24ndCB1c2UgcmFubGliCisJICBfTFRfVEFHVkFSKG9sZF9wb3N0aW5zdGFsbF9jbWRzLCAkMSk9J2NobW9kIDY0NCAkb2xkbGliJworCSAgX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgICAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAgICouZXhlfCouRVhFKSA7OworCSAgICAgICopCisJCWx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkJbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkJOzsKKwkgICAgZXNhY34KKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRsdF9vdXRwdXRmaWxlIn4KKwkgICAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgICBmaScKKwkgIDs7CisJKikKKwkgICMgZysrCisJICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorCSAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisJICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKworCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBlbHNlCisJICAgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgZml+CisJICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKKwk7OworCisgICAgICBkZ3V4KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBlYysrKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QyLiopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUKKwkjIHN3aXRjaCB0byBFTEYKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkLWVsZiopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCisgICAgICAgICMgY29udmVudGlvbnMKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgZ251KikKKyAgICAgICAgOzsKKworICAgICAgaGFpa3UqKQorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGhwdXg5KikKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJICAgICAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJICAgICAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgYUNDKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkRUdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDEwKnxocHV4MTEqKQorICAgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKyAgICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBmaQorICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBhQ0MqKQorCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICBpYTY0KikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgICAgICBocHBhKjY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgaWE2NCopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICAqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgZXNhYworCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaW50ZXJpeFtbMy05XV0qKQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8ICRHUkVQICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworCSAgaWNwYyogfCBlY3BjKiApCisJICAgICMgSW50ZWwgQysrCisJICAgIHdpdGhfZ251X2xkPXllcworCSAgICAjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scworCSAgICAjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAorCSAgICAjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkgICAgICAqIlZlcnNpb24gNy4iKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgICAgKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKKwkgICAgICAgIHRtcF9pZHluPQorCSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkJICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7CisJCWVzYWMKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgZXNhYworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgOzsKKyAgICAgICAgICBwZ0NDKiB8IHBnY3BwKikKKyAgICAgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIGNhc2UgYCRDQyAtVmAgaW4KKwkgICAgKnBnQ0NcIFtbMS01XV0uKiB8ICpwZ2NwcFwgW1sxLTVdXS4qKQorCSAgICAgIF9MVF9UQUdWQVIocHJlbGlua19jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvYmpzICRsaWJvYmpzICRjb21waWxlX2RlcGxpYnN+CisJCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCInCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvbGRvYmpzJG9sZF9kZXBsaWJzfgorCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYH4KKwkJJFJBTkxJQiAkb2xkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICAqKSAjIFZlcnNpb24gNiBhbmQgYWJvdmUgdXNlIHdlYWsgc3ltYm9scworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICAgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKwkgIHhsKiB8IG1waXhsKiB8IGJneGwqKQorCSAgICAjIElCTSBYTCA4LjAgb24gUFBDLCB3aXRoIEdOVSBsZAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCSRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCSAgICBmaQorCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scycKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCisJICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHNvbWV0aGluZyBiYXNlZCBvbgorCSAgICAgICMgJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEKKwkgICAgICAjIHdvdWxkIGJlIGJldHRlci4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZnVuY19lY2hvX2FsbCcKKworCSAgICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBseW54b3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbTg4ayopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbXZzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBjeHgqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCSAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbmV0YnNkKikKKyAgICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworCSAgd2xhcmM9CisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJZmkKKwkjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworCTs7CisKKyAgICAgICpudG8qIHwgKnFueCopCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisJOzsKKworICAgICAgb3BlbmJzZDIqKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG9wZW5ic2QqKQorCWlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisJICBmaQorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAiJGxpYiIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICAgICopIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgZXNhYworCSAgICA7OworICAgICAgICAgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgY3h4KikKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkJOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CisJICAgICAgICAgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJICAgICAgICAgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICAgICAgICAgJFJNICRsaWIuZXhwJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCQk7OworCSAgICBlc2FjCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCIgfCAkR1JFUCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBmdW5jX2VjaG9fYWxsICIkdGVtcGxpc3QiIHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICAgb3NmMyopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkJICA7OworCSAgICAgICAgKikKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgZXNhYworCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgcHNvcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIHN1bm9zNCopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgc29sYXJpcyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqIHwgc3VuQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgICAgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCSAgICAgICopCisJCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuCisJICAgICAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCQlfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdmdW5jX2VjaG9fYWxsJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKworCSAgICAjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgICAgIGlmICRDQyAtLXZlcnNpb24gfCAkR1JFUCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKwkgICAgICBlbHNlCisJICAgICAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICAgICAjIHBsYXRmb3JtLgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGZpCisKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJworCSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkJc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKwkJKikKKwkJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwkJICA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICBDQyopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisJIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKwkjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisJIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisJIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorCSMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorCSMgYXMgLXogZGVmcy4KKwlfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKwlfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworCXJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkb2xkb2Jqc34KKwkgICAgICAnIiRfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKSIKKwkgICAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJHJlbG9hZF9vYmpzfgorCSAgICAgICciJF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKSIKKwkgICAgOzsKKwkgICopCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgOzsKKwllc2FjCisgICAgICA7OworCisgICAgICB0YW5kZW0qKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgdnh3b3JrcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQorICAgIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKKyAgTERDWFg9JExECisgIExEPSRsdF9zYXZlX0xECisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKyAgbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorICBsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKKyAgbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitmaSAjIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfQ1hYX0NPTkZJRworCisKKyMgX0xUX0ZVTkNfU1RSSVBOQU1FX0NORgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZ1bmNfc3RyaXBuYW1lX2NuZiBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCisjCisjIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSAobm9uLVhTSSkgdmVyc2lvbiBvZiBmdW5jX3N0cmlwbmFtZSwKKyMgZXhjZXB0IHRoaXMgb25lIGNhbiBiZSB1c2VkIGJ5IG00IGNvZGUgdGhhdCBtYXkgYmUgZXhlY3V0ZWQgYnkgY29uZmlndXJlLAorIyByYXRoZXIgdGhhbiB0aGUgbGlidG9vbCBzY3JpcHQuCittNF9kZWZ1bihbX0xUX0ZVTkNfU1RSSVBOQU1FX0NORl0sW2RubAorQUNfUkVRVUlSRShbX0xUX0RFQ0xfU0VEXSkKK0FDX1JFUVVJUkUoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSkKK2Z1bmNfc3RyaXBuYW1lX2NuZiAoKQoreworICBjYXNlICR7Mn0gaW4KKyAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJSR7Mn1cJCUlImA7OworICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWVfY25mCitdKSMgX0xUX0ZVTkNfU1RSSVBOQU1FX0NORgorCisjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlndXJlIG91dCAiaGlkZGVuIiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmcm9tIHZlcmJvc2UKKyMgY29tcGlsZXIgb3V0cHV0IHdoZW4gbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorbTRfZGVmdW4oW19MVF9TWVNfSElEREVOX0xJQkRFUFNdLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorQUNfUkVRVUlSRShbX0xUX0ZVTkNfU1RSSVBOQU1FX0NORl0pZG5sCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KK19MVF9UQUdWQVIocHJlZGVwcywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KKworZG5sIHdlIGNhbid0IHVzZSB0aGUgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIGhlcmUsCitkbmwgYmVjYXVzZSBpdCBjb250YWlucyBjb2RlIGludGVuZGVkIGZvciBhbiBleGVjdXRhYmxlLAorZG5sIG5vdCBhIGxpYnJhcnkuICBJdCdzIHBvc3NpYmxlIHdlIHNob3VsZCBsZXQgZWFjaAorZG5sIHRhZyBkZWZpbmUgYSBuZXcgbHRfPz8/P19saW5rX3Rlc3RfY29kZSB2YXJpYWJsZSwKK2RubCBidXQgaXQncyBvbmx5IHVzZWQgaGVyZS4uLgorbTRfaWYoWyQxXSwgW10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgoraW50IGE7Cit2b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQorX0xUX0VPRgorXSwgWyQxXSwgW0NYWF0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorY2xhc3MgRm9vCit7CitwdWJsaWM6CisgIEZvbyAodm9pZCkgeyBhID0gMDsgfQorcHJpdmF0ZToKKyAgaW50IGE7Cit9OworX0xUX0VPRgorXSwgWyQxXSwgW0Y3N10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIqNCBhCisgICAgICBhPTAKKyAgICAgIHJldHVybgorICAgICAgZW5kCitfTFRfRU9GCitdLCBbJDFdLCBbRkNdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtHQ0pdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3B1YmxpYyBjbGFzcyBmb28geworICBwcml2YXRlIGludCBhOworICBwdWJsaWMgdm9pZCBiYXIgKHZvaWQpIHsKKyAgICBhID0gMDsKKyAgfQorfTsKK19MVF9FT0YKK10sIFskMV0sIFtHT10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorcGFja2FnZSBmb28KK2Z1bmMgZm9vKCkgeworfQorX0xUX0VPRgorXSkKKworX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1M9JENGTEFHUworY2FzZSAiJENDICRDRkxBR1MgIiBpbiAjKAorKlwgLWZsdG8qXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby1sdG8iIDs7CisqXCAtZndob3ByKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8td2hvcHIiIDs7CisqXCAtZnVzZS1saW5rZXItcGx1Z2luKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tdXNlLWxpbmtlci1wbHVnaW4iIDs7Citlc2FjCisKK2RubCBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKK2RubCBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHtwcmV2fSR7cH0gaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgIyBFeHBhbmQgdGhlIHN5c3Jvb3QgdG8gZWFzZSBleHRyYWN0aW5nIHRoZSBkaXJlY3RvcmllcyBsYXRlci4KKyAgICAgICBpZiB0ZXN0IC16ICIkcHJldiI7IHRoZW4KKyAgICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWVfY25mICctTCcgJycgIiRwIjsgcHJldj0tTDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLVInICcnICIkcCI7IHByZXY9LVI7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLWwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1sJyAnJyAiJHAiOyBwcmV2PS1sOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBmaQorICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICA9KikgZnVuY19zdHJpcG5hbWVfY25mICc9JyAnJyAiJHAiOyBwPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICR7cHJldn0gaW4KKwkgLUwgfCAtUikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICBwcmV2PQorICAgICAgIDs7CisKKyAgICAqLmx0by4kb2JqZXh0KSA7OyAjIElnbm9yZSBHQ0MgTFRPIG9iamVjdHMKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgJDEgdGVzdCBwcm9ncmFtIgorZmkKKworJFJNIC1mIGNvbmZlc3QuJG9iamV4dAorQ0ZMQUdTPSRfbHRfbGliZGVwc19zYXZlX0NGTEFHUworCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgorbTRfaWYoWyQxXSwgW0NYWF0sCitbY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeFtbMy05XV0qKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPQorICA7OworCitsaW51eCopCisgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorICAqU3VuXCBDKikKKyAgICAjIFN1biBDKysgNS45CisKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyogfCBzdW5DQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCitdKQorCitjYXNlICIgJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSAiIGluCisqIiAtbGMgIiopIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubyA7OworZXNhYworIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9CitpZiB0ZXN0IC1uICIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IjsgdGhlbgorIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9YGVjaG8gIiAke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IiB8ICR7U0VEfSAtZSAncyEgLUwhICFnJyAtZSAncyFeICEhJ2AKK2ZpCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc10sIFsxXSwKKyAgICBbVGhlIGRpcmVjdG9yaWVzIHNlYXJjaGVkIGJ5IHRoaXMgY29tcGlsZXIgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwX29iamVjdHNdLCBbMV0sCisgICAgW0RlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworICAgIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcF9vYmplY3RzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgWzFdLAorICAgIFtUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworICAgIGEgc2hhcmVkIGxpYnJhcnldKQorXSkjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMKKworCisjIF9MVF9MQU5HX0Y3N19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIDc3IGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GNzdfQ09ORklHXSwKK1tBQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKK2lmIHRlc3QgLXogIiRGNzciIHx8IHRlc3QgIlgkRjc3IiA9ICJYbm8iOyB0aGVuCisgIF9sdF9kaXNhYmxlX0Y3Nz15ZXMKK2ZpCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KK2FjX2V4dD1mCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBGNzcgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBDQz0ke0Y3Ny0iZjc3In0KKyAgQ0ZMQUdTPSRGRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorICBHQ0M9JEc3NworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEc3NyIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9IiRsdF9zYXZlX0NDIgorICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKK2ZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfRjc3X0NPTkZJRworCisKKyMgX0xUX0xBTkdfRkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GQ19DT05GSUddLAorW0FDX0xBTkdfUFVTSChGb3J0cmFuKQorCitpZiB0ZXN0IC16ICIkRkMiIHx8IHRlc3QgIlgkRkMiID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRkM9eWVzCitmaQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGZjIHRlc3Qgc291cmNlcy4KK2FjX2V4dD0ke2FjX2ZjX3NyY2V4dC1mfQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZmMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBGQyBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9kaXNhYmxlX0ZDIiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJcCisgICAgICBzdWJyb3V0aW5lIHQKKyAgICAgIHJldHVybgorICAgICAgZW5kCisiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSJcCisgICAgICBwcm9ncmFtIHQKKyAgICAgIGVuZAorIgorCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0iJENDIgorICBsdF9zYXZlX0dDQz0kR0NDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgQ0M9JHtGQy0iZjk1In0KKyAgQ0ZMQUdTPSRGQ0ZMQUdTCisgIGNvbXBpbGVyPSRDQworICBHQ0M9JGFjX2N2X2ZjX2NvbXBpbGVyX2dudQorCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgICAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisJICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworCWZpCisgICAgICAgIDs7CisgICAgZXNhYworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkYWNfY3ZfZmNfY29tcGlsZXJfZ251IgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX1NZU19ISURERU5fTElCREVQUygkMSkKKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBHQ0M9JGx0X3NhdmVfR0NDCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK2ZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0ZDIiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19GQ19DT05GSUcKKworCisjIF9MVF9MQU5HX0dDSl9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIEdOVSBKYXZhIENvbXBpbGVyIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19HQ0pfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtMVF9QUk9HX0dDSl0pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWphdmEKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge30iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J3B1YmxpYyBjbGFzcyBjb25mdGVzdCB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tbXV0gYXJndikge307IH0nCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0kQ0MKK2x0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz15ZXMKK0NDPSR7R0NKLSJnY2oifQorQ0ZMQUdTPSRHQ0pGTEFHUworY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisKK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgoraWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0FDX0xBTkdfUkVTVE9SRQorCitHQ0M9JGx0X3NhdmVfR0NDCitDQz0kbHRfc2F2ZV9DQworQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworXSkjIF9MVF9MQU5HX0dDSl9DT05GSUcKKworCisjIF9MVF9MQU5HX0dPX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgR05VIEdvIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19HT19DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfR09dKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBHbyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Z28KKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEdvIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0icGFja2FnZSBtYWluOyBmdW5jIG1haW4oKSB7IH0iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J3BhY2thZ2UgbWFpbjsgZnVuYyBtYWluKCkgeyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9eWVzCitDQz0ke0dPQy0iZ2NjZ28ifQorQ0ZMQUdTPSRHT0ZMQUdTCitjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIEdvIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorCitBQ19MQU5HX1JFU1RPUkUKKworR0NDPSRsdF9zYXZlX0dDQworQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK10pIyBfTFRfTEFOR19HT19DT05GSUcKKworCisjIF9MVF9MQU5HX1JDX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19SQ19DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfUkNdKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9cmMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfScKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9CitDQz0ke1JDLSJ3aW5kcmVzIn0KK0NGTEFHUz0KK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcworCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIDoKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK0FDX0xBTkdfUkVTVE9SRQorQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK10pIyBfTFRfTEFOR19SQ19DT05GSUcKKworCisjIExUX1BST0dfR0NKCisjIC0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19HQ0pdLAorW200X2lmZGVmKFtBQ19QUk9HX0dDSl0sIFtBQ19QUk9HX0dDSl0sCisgIFttNF9pZmRlZihbQV1bTV9QUk9HX0dDSl0sIFtBXVtNX1BST0dfR0NKXSwKKyAgICBbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwpCisgICAgICB0ZXN0ICJ4JHtHQ0pGTEFHUytzZXR9IiA9IHhzZXQgfHwgR0NKRkxBR1M9Ii1nIC1PMiIKKyAgICAgIEFDX1NVQlNUKEdDSkZMQUdTKV0pXSlbXWRubAorXSkKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX0dDSl0sIFtMVF9QUk9HX0dDSl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfR0NKXSwgW10pCisKKworIyBMVF9QUk9HX0dPCisjIC0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9QUk9HX0dPXSwKK1tBQ19DSEVDS19UT09MKEdPQywgZ2NjZ28sKQorXSkKKworCisjIExUX1BST0dfUkMKKyMgLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfUkNdLAorW0FDX0NIRUNLX1RPT0woUkMsIHdpbmRyZXMsKQorXSkKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1JDXSwgW0xUX1BST0dfUkNdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwgW10pCisKKworIyBfTFRfREVDTF9FR1JFUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3QgZ3JlcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9FR1JFUF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0ZHUkVQXSlkbmwKK3Rlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKK19MVF9ERUNMKFtdLCBbR1JFUF0sIFsxXSwgW0EgZ3JlcCBwcm9ncmFtIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzXSkKK19MVF9ERUNMKFtdLCBbRUdSRVBdLCBbMV0sIFtBbiBFUkUgbWF0Y2hlcl0pCitfTFRfREVDTChbXSwgW0ZHUkVQXSwgWzFdLCBbQSBsaXRlcmFsIHN0cmluZyBtYXRjaGVyXSkKK2RubCBOb24tYmxlZWRpbmctZWRnZSBhdXRvY29uZiBkb2Vzbid0IHN1YnN0IEdSRVAsIHNvIGRvIGl0IGhlcmUgdG9vCitBQ19TVUJTVChbR1JFUF0pCitdKQorCisKKyMgX0xUX0RFQ0xfT0JKRFVNUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3Qgb2JqZHVtcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9PQkpEVU1QXSwKK1tBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzFdLCBbQW4gb2JqZWN0IHN5bWJvbCBkdW1wZXJdKQorQUNfU1VCU1QoW09CSkRVTVBdKQorXSkKKworIyBfTFRfREVDTF9ETExUT09MCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIERMTFRPT0wgdmFyaWFibGUgaXMgc2V0LgorbTRfZGVmdW4oW19MVF9ERUNMX0RMTFRPT0xdLAorW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCitfTFRfREVDTChbXSwgW0RMTFRPT0xdLCBbMV0sIFtETEwgY3JlYXRpb24gcHJvZ3JhbV0pCitBQ19TVUJTVChbRExMVE9PTF0pCitdKQorCisjIF9MVF9ERUNMX1NFRAorIyAtLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KK200X2RlZnVuKFtfTFRfREVDTF9TRURdLAorW0FDX1BST0dfU0VECit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCitfTFRfREVDTChbXSwgW1NFRF0sIFsxXSwgW0Egc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorX0xUX0RFQ0woW10sIFtYc2VkXSwgWyJcJFNFRCAtZSAxcy9eWC8vIl0sCisgICAgW1NlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uXSkKK10pIyBfTFRfREVDTF9TRUQKKworbTRfaWZuZGVmKFtBQ19QUk9HX1NFRF0sIFsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbTRfZGVmdW4oW0FDX1BST0dfU0VEXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9TRUQsCitbIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCisjIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCitdKQorU0VEPSRsdF9jdl9wYXRoX1NFRAorQUNfU1VCU1QoW1NFRF0pCitBQ19NU0dfUkVTVUxUKFskU0VEXSkKK10pI0FDX1BST0dfU0VECitdKSNtNF9pZm5kZWYKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1NFRF0sIFtBQ19QUk9HX1NFRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSwgW10pCisKKworIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgb3V0IHdoZXRoZXIgdGhlIHNoZWxsIGlzIEJvdXJuZSBvciBYU0kgY29tcGF0aWJsZSwKKyMgb3IgaGFzIHNvbWUgb3RoZXIgdXNlZnVsIGZlYXR1cmVzLgorbTRfZGVmdW4oW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzXSkKKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK0FDX01TR19SRVNVTFQoWyR4c2lfc2hlbGxdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW3hzaV9zaGVsbD0nJHhzaV9zaGVsbCddKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICIrPSJdKQorbHRfc2hlbGxfYXBwZW5kPW5vCisoIGZvbz1iYXI7IHNldCBmb28gYmF6OyBldmFsICIkWzFdKz1cJFsyXSIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworQUNfTVNHX1JFU1VMVChbJGx0X3NoZWxsX2FwcGVuZF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbbHRfc2hlbGxfYXBwZW5kPSckbHRfc2hlbGxfYXBwZW5kJ10pCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKK19MVF9ERUNMKFtdLCBbbHRfdW5zZXRdLCBbMF0sIFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiXSlkbmwKKworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJworICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIGx0X1NQMk5MPSd0ciBcMTAwIFxuJworICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKK19MVF9ERUNMKFtTUDJOTF0sIFtsdF9TUDJOTF0sIFsxXSwgW3R1cm4gc3BhY2VzIGludG8gbmV3bGluZXNdKWRubAorX0xUX0RFQ0woW05MMlNQXSwgW2x0X05MMlNQXSwgWzFdLCBbdHVybiBuZXdsaW5lcyBpbnRvIHNwYWNlc10pZG5sCitdKSMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCisKKworIyBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFIChGVU5DTkFNRSwgUkVQTEFDRU1FTlQtQk9EWSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluIGAkY2ZnZmlsZScsIGxvb2sgZm9yIGZ1bmN0aW9uIEZVTkNOQU1FIGRlbGltaXRlZCBieSBgXkZVTkNOQU1FICgpJCcgYW5kCisjICdefSBGVU5DTkFNRSAnLCBhbmQgcmVwbGFjZSBpdHMgYm9keSB3aXRoIFJFUExBQ0VNRU5ULUJPRFkuCittNF9kZWZ1bihbX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRV0sCitbZG5sIHsKK3NlZCAtZSAnL14kMSAoKSQvLC9efSAjICQxIC9jXAorJDEgKClcCit7XAorbTRfYnBhdHN1YnN0cyhbJDJdLCBbJF0sIFtcXF0sIFteXChbCSBdXCldLCBbXFxcMV0pCit9ICMgRXh0ZW5kZWQtc2hlbGwgJDEgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK10pCisKKworIyBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVwbGFjZSBleGlzdGluZyBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2V2ZXJhbCBzaGVsbCBmdW5jdGlvbnMgd2l0aAorIyBlcXVpdmFsZW50IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aG9zZSBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLi4KK200X2RlZnVuKFtfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TXSwKK1tpZiB0ZXN0IHgiJHhzaV9zaGVsbCIgPSB4eWVzOyB0aGVuCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfZGlybmFtZV0sIFtkbmwKKyAgICBjYXNlICR7MX0gaW4KKyAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19iYXNlbmFtZV0sIFtkbmwKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lXSwgW2RubAorICAgIGNhc2UgJHsxfSBpbgorICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgICBlc2FjCisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zdHJpcG5hbWVdLCBbZG5sCisgICAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQorICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC4KKyAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfQorICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9CisgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfc3BsaXRfbG9uZ19vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lPSR7MSUlPSp9CisgICAgZnVuY19zcGxpdF9sb25nX29wdF9hcmc9JHsxIyo9fV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zcGxpdF9zaG9ydF9vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPSR7MSM/P30KKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2xvMm9dLCBbZG5sCisgICAgY2FzZSAkezF9IGluCisgICAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OworICAgICAgKikgICAgZnVuY19sbzJvX3Jlc3VsdD0kezF9IDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY194Zm9ybV0sIFsgICAgZnVuY194Zm9ybV9yZXN1bHQ9JHsxJS4qfS5sb10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcml0aF0sIFsgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICRbKl0gKSldKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfbGVuXSwgWyAgICBmdW5jX2xlbl9yZXN1bHQ9JHsjMX1dKQorZmkKKworaWYgdGVzdCB4IiRsdF9zaGVsbF9hcHBlbmQiID0geHllczsgdGhlbgorICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FwcGVuZF0sIFsgICAgZXZhbCAiJHsxfSs9XFwkezJ9Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcHBlbmRfcXVvdGVkXSwgW2RubAorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR7Mn0iCitkbmwgbTQgZXhwYW5zaW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHRoZW4gdGhlIHNoZWxsIGV2YWwgdHVybnMgdGhhdCBpbnRvIFwKKyAgICBldmFsICIkezF9Kz1cXFxcIFxcJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0Il0pCisKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIHdoZXJlIHBvc3NpYmxlIGJ5IGRpcmVjdCB1c2Ugb2YgJys9JworICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbW2EtekEtWl9dXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW1thLXpBLVpfXV1cezEsXH1cKSAiJVwxPSIkXDElZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2ZpCisKK2lmIHRlc3QgeCIkX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbCIgPSB4IjoiOyB0aGVuCisgIEFDX01TR19XQVJOKFtVbmFibGUgdG8gc3Vic3RpdHV0ZSBleHRlbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gJG9maWxlXSkKK2ZpCitdKQorCisjIF9MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERldGVybWluZSB3aGljaCBmaWxlIG5hbWUgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgYnkKKyMgZnVuY190b19ob3N0X2ZpbGUgKGFuZCwgaW1wbGljaXRseSwgYnkgZnVuY190b19ob3N0X3BhdGgpLiAgVGhlc2UgYXJlIG5lZWRlZAorIyBmb3IgY2VydGFpbiBjcm9zcy1jb21waWxlIGNvbmZpZ3VyYXRpb25zIGFuZCBuYXRpdmUgbWluZ3cuCittNF9kZWZ1bihbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfdG9faG9zdF9maWxlX2NtZCwKK1tjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKK10pCit0b19ob3N0X2ZpbGVfY21kPSRsdF9jdl90b19ob3N0X2ZpbGVfY21kCitBQ19NU0dfUkVTVUxUKFskbHRfY3ZfdG9faG9zdF9maWxlX2NtZF0pCitfTFRfREVDTChbdG9faG9zdF9maWxlX2NtZF0sIFtsdF9jdl90b19ob3N0X2ZpbGVfY21kXSwKKyAgICAgICAgIFswXSwgW2NvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0XSlkbmwKKworQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl90b190b29sX2ZpbGVfY21kLAorWyNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCitdKQordG9fdG9vbF9maWxlX2NtZD0kbHRfY3ZfdG9fdG9vbF9maWxlX2NtZAorQUNfTVNHX1JFU1VMVChbJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWRdKQorX0xUX0RFQ0woW3RvX3Rvb2xfZmlsZV9jbWRdLCBbbHRfY3ZfdG9fdG9vbF9maWxlX2NtZF0sCisgICAgICAgICBbMF0sIFtjb252ZXJ0ICRidWlsZCBmaWxlcyB0byB0b29sY2hhaW4gZm9ybWF0XSlkbmwKK10pIyBfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tNC9sdG9wdGlvbnMubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2x0b3B0aW9ucy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDlhY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tNC9sdG9wdGlvbnMubTQKQEAgLTAsMCArMSwzODQgQEAKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNyBsdG9wdGlvbnMubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworCisjIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAorW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisKKyMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQorIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQorIyBzYXZlZCBhcyBhIGZsYWcuCittNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCittNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCitdKQorCisKKyMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK200X2RlZmluZShbX0xUX0lGX09QVElPTl0sCitbbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKKworCisjIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCisjIGFyZSBzZXQuCittNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCitbbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisJICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKKwkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAorbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCitdKVtdZG5sCitdKQorCisKKyMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKKyMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKKyMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0CisjIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KK200X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAorWyMgU2V0IG9wdGlvbnMKK200X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAorICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCisKK200X2lmKFskMV0sW0xUX0lOSVRdLFsKKyAgZG5sCisgIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAorICBkbmwgc3BlY2lmaWVkOgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KKyAgXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCisgIF0pCisgIGRubAorICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgorICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgorICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAorICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAorICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCisgIF0pCitdKSMgX0xUX1NFVF9PUFRJT05TCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWNyb3MgdG8gaGFuZGxlIExUX0lOSVQgb3B0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAorW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCisKKworIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAorXSkjIExUX09QVElPTl9ERUZJTkUKKworCisjIGRsb3BlbgorIyAtLS0tLS0KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCitdKQorCitBVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCisKKworIyB3aW4zMi1kbGwKKyMgLS0tLS0tLS0tCisjIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKK1tlbmFibGVfd2luMzJfZGxsPXllcworCitjYXNlICRob3N0IGluCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotY2VnY2MqKQorICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCisgIDs7Citlc2FjCisKK3Rlc3QgLXogIiRBUyIgJiYgQVM9YXMKK19MVF9ERUNMKFtdLCBbQVNdLCAgICAgIFsxXSwgW0Fzc2VtYmxlciBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzFdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKWRubAorCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtPYmplY3QgZHVtcGVyIHByb2dyYW1dKWRubAorXSkjIHdpbjMyLWRsbAorCitBVV9ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgd2luMzItZGxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW10pCisKKworIyBfTFRfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZywgYW5kIHN1cHBvcnRzIHRoZSBgc2hhcmVkJyBhbmQKKyMgYGRpc2FibGUtc2hhcmVkJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3NoYXJlZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc2hhcmVkPV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQorCisgICAgX0xUX0RFQ0woW2J1aWxkX2xpYnRvb2xfbGlic10sIFtlbmFibGVfc2hhcmVkXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NIQVJFRAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3NoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc2hhcmVkXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX1NUQVRJQyhbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBzdGF0aWMnIGFuZAorIyBgZGlzYWJsZS1zdGF0aWMnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ10sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY0A8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3N0YXRpYz1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9vbGRfbGlic10sIFtlbmFibGVfc3RhdGljXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NUQVRJQworCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3N0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc3RhdGljXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NUQVRJQ10sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBmYXN0LWluc3RhbGwnCisjIGFuZCBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbZmFzdC1pbnN0YWxsXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkBdLAorICAgIFtvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX2Zhc3RfaW5zdGFsbD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKKworX0xUX0RFQ0woW2Zhc3RfaW5zdGFsbF0sIFtlbmFibGVfZmFzdF9pbnN0YWxsXSwgWzBdLAorCSBbV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uXSlkbmwKK10pIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQVVfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBmYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK0FVX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Cit0aGUgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKKworCisjIF9MVF9XSVRIX1BJQyhbTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS13aXRoLXBpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHBpYy1vbmx5JyBhbmQgYG5vLXBpYycKKyMgTFRfSU5JVCBvcHRpb25zLgorIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgorbTRfZGVmaW5lKFtfTFRfV0lUSF9QSUNdLAorW0FDX0FSR19XSVRIKFtwaWNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBpY0A8OkA9UEtHU0A6PkBdLAorCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCisgICAgW2x0X3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkd2l0aHZhbCBpbgorICAgIHllc3xubykgcGljX21vZGU9JHdpdGh2YWwgOzsKKyAgICAqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgbHRfcGtnIGluICR3aXRodmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkbHRfcGtnIiA9ICJYJGx0X3AiOyB0aGVuCisJICBwaWNfbW9kZT15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtwaWNfbW9kZT1kZWZhdWx0XSkKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1tNF9kZWZhdWx0KFskMV0sIFtkZWZhdWx0XSkKKworX0xUX0RFQ0woW10sIFtwaWNfbW9kZV0sIFswXSwgW1doYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkXSlkbmwKK10pIyBfTFRfV0lUSF9QSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtwaWMtb25seV0sIFtfTFRfV0lUSF9QSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbbm8tcGljXSwgW19MVF9XSVRIX1BJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWU6CitBVV9ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtwaWMtb25seV0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgcGljLW9ubHknIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwgW10pCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBMVERMX0lOSVQgT3B0aW9ucyAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbbm9ucmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbbm9ucmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3JlY3Vyc2l2ZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3JlY3Vyc2l2ZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtzdWJwcm9qZWN0XSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbc3VicHJvamVjdF0pXSkKKworbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbaW5zdGFsbGFibGVdLAorCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtpbnN0YWxsYWJsZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtjb252ZW5pZW5jZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2NvbnZlbmllbmNlXSldKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tNC9sdHN1Z2FyLm00IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tNC9sdHN1Z2FyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDBhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2x0c3VnYXIubTQKQEAgLTAsMCArMSwxMjMgQEAKKyMgbHRzdWdhci5tNCAtLSBsaWJ0b29sIG00IGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgIC0qLUF1dG9jb25mLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA2IGx0c3VnYXIubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVFNVR0FSX1ZFUlNJT05dLCBbbTRfaWYoWzAuMV0pXSkKKworCisjIGx0X2pvaW4oU0VQLCBBUkcxLCBbQVJHMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgQVJHMVNFUEFSRzIuLi5TRVBBUkduLCBvbWl0dGluZyBbXSBhcmd1bWVudHMgYW5kIHRoZWlyCisjIGFzc29jaWF0ZWQgc2VwYXJhdG9yLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfam9pbiBmcm9tIEF1dG9jb25mIDIuNjIsIHNpbmNlIGFsbCBlYXJsaWVyCisjIHZlcnNpb25zIGluIG00c3VnYXIgaGFkIGJ1Z3MuCittNF9kZWZpbmUoW2x0X2pvaW5dLAorW200X2lmKFskI10sIFsxXSwgW10sCisgICAgICAgWyQjXSwgWzJdLCBbWyQyXV0sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMl1fXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKK200X2RlZmluZShbX2x0X2pvaW5dLAorW200X2lmKFskIyQyXSwgWzJdLCBbXSwKKyAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQxJDJdXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKKworCisjIGx0X2NhcihMSVNUKQorIyBsdF9jZHIoTElTVCkKKyMgLS0tLS0tLS0tLS0tCisjIE1hbmlwdWxhdGUgbTQgbGlzdHMuCisjIFRoZXNlIG1hY3JvcyBhcmUgbmVjZXNzYXJ5IGFzIGxvbmcgYXMgd2lsbCBzdGlsbCBuZWVkIHRvIHN1cHBvcnQKKyMgQXV0b2NvbmYtMi41OSB3aGljaCBxdW90ZXMgZGlmZmVyZW50bHkuCittNF9kZWZpbmUoW2x0X2Nhcl0sIFtbJDFdXSkKK200X2RlZmluZShbbHRfY2RyXSwKK1ttNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzXSldLAorICAgICAgIFskI10sIDEsIFtdLAorICAgICAgIFttNF9kcXVvdGUobTRfc2hpZnQoJEApKV0pXSkKK200X2RlZmluZShbbHRfdW5xdW90ZV0sICQxKQorCisKKyMgbHRfYXBwZW5kKE1BQ1JPLU5BTUUsIFNUUklORywgW1NFUEFSQVRPUl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWRlZmluZSBNQUNSTy1OQU1FIHRvIGhvbGQgaXRzIGZvcm1lciBjb250ZW50IHBsdXMgYFNFUEFSQVRPUidgU1RSSU5HJy4KKyMgTm90ZSB0aGF0IG5laXRoZXIgU0VQQVJBVE9SIG5vciBTVFJJTkcgYXJlIGV4cGFuZGVkOyB0aGV5IGFyZSBhcHBlbmRlZAorIyB0byBNQUNSTy1OQU1FIGFzIGlzIChsZWF2aW5nIHRoZSBleHBhbnNpb24gZm9yIHdoZW4gTUFDUk8tTkFNRSBpcyBpbnZva2VkKS4KKyMgTm8gU0VQQVJBVE9SIGlzIG91dHB1dCBpZiBNQUNSTy1OQU1FIHdhcyBwcmV2aW91c2x5IHVuZGVmaW5lZCAoZGlmZmVyZW50CisjIHRoYW4gZGVmaW5lZCBhbmQgZW1wdHkpLgorIworIyBUaGlzIG1hY3JvIGlzIG5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBBdXRvY29uZiAyLjYyLCBzaW5jZSBlYXJsaWVyCisjIHZlcnNpb25zIG9mIG00c3VnYXIgbWlzdGFrZW5seSBleHBhbmRlZCBTRVBBUkFUT1IgYnV0IG5vdCBTVFJJTkcuCittNF9kZWZpbmUoW2x0X2FwcGVuZF0sCitbbTRfZGVmaW5lKFskMV0sCisJICAgbTRfaWZkZWYoWyQxXSwgW200X2RlZm4oWyQxXSlbJDNdXSlbJDJdKV0pCisKKworCisjIGx0X2NvbWJpbmUoU0VQLCBQUkVGSVgtTElTVCwgSU5GSVgsIFNVRkZJWDEsIFtTVUZGSVgyLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIGEgU0VQIGRlbGltaXRlZCBsaXN0IG9mIGFsbCBwYWlyZWQgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIG9mCisjIFBSRUZJWC1MSVNUIHdpdGggU1VGRklYMSB0aHJvdWdoIFNVRkZJWG4uICBFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QKKyMgaGFzIHRoZSBmb3JtIFBSRUZJWG1JTkZJWFNVRkZJWG4uCisjIE5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBtNF9jb21iaW5lIGFkZGVkIGluIEF1dG9jb25mIDIuNjIuCittNF9kZWZpbmUoW2x0X2NvbWJpbmVdLAorW200X2lmKG00X2V2YWwoWyQjID4gM10pLCBbMV0sCisgICAgICAgW200X3B1c2hkZWYoW19MdF9zZXBdLCBbbTRfZGVmaW5lKFtfTHRfc2VwXSwgbTRfZGVmbihbbHRfY2FyXSkpXSldXWRubAorW1ttNF9mb3JlYWNoKFtfTHRfcHJlZml4XSwgWyQyXSwKKwkgICAgIFttNF9mb3JlYWNoKFtfTHRfc3VmZml4XSwKKwkJXW00X2RxdW90ZShtNF9kcXVvdGUobTRfc2hpZnQobTRfc2hpZnQobTRfc2hpZnQoJEApKSkpKVssCisJW19MdF9zZXAoWyQxXSlbXW00X2RlZm4oW19MdF9wcmVmaXhdKVskM11tNF9kZWZuKFtfTHRfc3VmZml4XSldKV0pXSldKQorCisKKyMgbHRfaWZfYXBwZW5kX3VuaXEoTUFDUk8tTkFNRSwgVkFSTkFNRSwgW1NFUEFSQVRPUl0sIFtVTklRXSwgW05PVC1VTklRXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWZmIE1BQ1JPLU5BTUUgZG9lcyBub3QgeWV0IGNvbnRhaW4gVkFSTkFNRSwgdGhlbiBhcHBlbmQgaXQgKGRlbGltaXRlZAorIyBieSBTRVBBUkFUT1IgaWYgc3VwcGxpZWQpIGFuZCBleHBhbmQgVU5JUSwgZWxzZSBOT1QtVU5JUS4KK200X2RlZmluZShbbHRfaWZfYXBwZW5kX3VuaXFdLAorW200X2lmZGVmKFskMV0sCisJICBbbTRfaWYobTRfaW5kZXgoWyQzXW00X2RlZm4oWyQxXSlbJDNdLCBbJDMkMiQzXSksIFstMV0sCisJCSBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdLAorCQkgWyQ1XSldLAorCSAgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSldKQorCisKKyMgbHRfZGljdF9hZGQoRElDVCwgS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRdLAorW200X2RlZmluZShbJDEoJDIpXSwgWyQzXSldKQorCisKKyMgbHRfZGljdF9hZGRfc3Via2V5KERJQ1QsIEtFWSwgU1VCS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRfc3Via2V5XSwKK1ttNF9kZWZpbmUoWyQxKCQyOiQzKV0sIFskNF0pXSkKKworCisjIGx0X2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZldGNoXSwKK1ttNF9pZnZhbChbJDNdLAorCW00X2lmZGVmKFskMSgkMjokMyldLCBbbTRfZGVmbihbJDEoJDI6JDMpXSldKSwKKyAgICBtNF9pZmRlZihbJDEoJDIpXSwgW200X2RlZm4oWyQxKCQyKV0pXSkpXSkKKworCisjIGx0X2lmX2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSwgVkFMVUUsIElGLVRSVUUsIFtJRi1GQUxTRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2lmX2RpY3RfZmV0Y2hdLAorW200X2lmKGx0X2RpY3RfZmV0Y2goWyQxXSwgWyQyXSwgWyQzXSksIFskNF0sCisJWyQ1XSwKKyAgICBbJDZdKV0pCisKKworIyBsdF9kaWN0X2ZpbHRlcihESUNULCBbU1VCS0VZXSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBLRVksIFsuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZpbHRlcl0sCitbbTRfaWYoWyQ1XSwgW10sIFtdLAorICBbbHRfam9pbihtNF9xdW90ZShtNF9kZWZhdWx0KFskNF0sIFtbLCBdXSkpLAorICAgICAgICAgICBsdF91bnF1b3RlKG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9mb3JlYWNoKF9MdF9rZXksIGx0X2NhcihbbTRfc2hpZnRuKDQsICRAKV0pLAorCQkgICAgICBbbHRfaWZfZGljdF9mZXRjaChbJDFdLCBfTHRfa2V5LCBbJDJdLCBbJDNdLCBbX0x0X2tleSBdKV0pKSkpKV0pW11kbmwKK10pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2x0dmVyc2lvbi5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbTQvbHR2ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTg2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2x0dmVyc2lvbi5tNApAQCAtMCwwICsxLDIzIEBACisjIGx0dmVyc2lvbi5tNCAtLSB2ZXJzaW9uIG51bWJlcnMJCQktKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNAorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBzZXJpYWwgMzMzNyBsdHZlcnNpb24ubTQKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wKKworbTRfZGVmaW5lKFtMVF9QQUNLQUdFX1ZFUlNJT05dLCBbMi40LjJdKQorbTRfZGVmaW5lKFtMVF9QQUNLQUdFX1JFVklTSU9OXSwgWzEuMzMzN10pCisKK0FDX0RFRlVOKFtMVFZFUlNJT05fVkVSU0lPTl0sCitbbWFjcm9fdmVyc2lvbj0nMi40LjInCittYWNyb19yZXZpc2lvbj0nMS4zMzM3JworX0xUX0RFQ0woLCBtYWNyb192ZXJzaW9uLCAwLCBbV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkP10pCitfTFRfREVDTCgsIG1hY3JvX3JldmlzaW9uLCAwKQorXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbTQvbHR+b2Jzb2xldGUubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2x0fm9ic29sZXRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzNkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L200L2x0fm9ic29sZXRlLm00CkBAIC0wLDAgKzEsOTggQEAKKyMgbHR+b2Jzb2xldGUubTQgLS0gYWNsb2NhbCBzYXRpc2Z5aW5nIG9ic29sZXRlIGRlZmluaXRpb25zLiAgICAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQsIDIwMDQuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNSBsdH5vYnNvbGV0ZS5tNAorCisjIFRoZXNlIGV4aXN0IGVudGlyZWx5IHRvIGZvb2wgYWNsb2NhbCB3aGVuIGJvb3RzdHJhcHBpbmcgbGlidG9vbC4KKyMKKyMgSW4gdGhlIHBhc3QgbGlidG9vbC5tNCBoYXMgcHJvdmlkZWQgbWFjcm9zIHZpYSBBQ19ERUZVTiAob3IgQVVfREVGVU4pCisjIHdoaWNoIGhhdmUgbGF0ZXIgYmVlbiBjaGFuZ2VkIHRvIG00X2RlZmluZSBhcyB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZQorIyBleHBvcnRlZCBBUEksIG9yIG1vdmVkIHRvIEF1dG9jb25mIG9yIEF1dG9tYWtlIHdoZXJlIHRoZXkgYmVsb25nLgorIworIyBUaGUgdHJvdWJsZSBpcywgYWNsb2NhbCBpcyBhIGJpdCB0aGljay4gIEl0J2xsIHNlZSB0aGUgb2xkIEFDX0RFRlVOCisjIGluIC91c3Ivc2hhcmUvYWNsb2NhbC9saWJ0b29sLm00IGFuZCByZW1lbWJlciBpdCwgdGhlbiB3aGVuIGl0IHNlZXMgdXMKKyMgdXNpbmcgYSBtYWNybyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gb3VyIGxvY2FsIG00L2xpYnRvb2wubTQgaXQnbGwKKyMgcHVsbCB0aGUgb2xkIGxpYnRvb2wubTQgaW4gKGl0IGRvZXNuJ3Qgc2VlIG91ciBzaGlueSBuZXcgbTRfZGVmaW5lCisjIGFuZCBkb2Vzbid0IGtub3cgYWJvdXQgQXV0b2NvbmYgbWFjcm9zIGF0IGFsbC4pCisjCisjIFNvIHdlIHByb3ZpZGUgdGhpcyBmaWxlLCB3aGljaCBoYXMgYSBzaWxseSBmaWxlbmFtZSBzbyBpdCdzIGFsd2F5cworIyBpbmNsdWRlZCBhZnRlciBldmVyeXRoaW5nIGVsc2UuICBUaGlzIHByb3ZpZGVzIGFjbG9jYWwgd2l0aCB0aGUKKyMgQUNfREVGVU5zIGl0IHdhbnRzLCBidXQgd2hlbiBtNCBwcm9jZXNzZXMgaXQsIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcKKyMgYmVjYXVzZSB0aG9zZSBtYWNyb3MgYWxyZWFkeSBleGlzdCwgb3Igd2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlci4KKyMgV2UgdXNlIEFDX0RFRlVOIG92ZXIgQVVfREVGVU4gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhY2xvY2FsLTEuNi4gCisjCisjIEFueXRpbWUgd2Ugd2l0aGRyYXcgYW4gQUNfREVGVU4gb3IgQVVfREVGVU4sIHJlbWVtYmVyIHRvIGFkZCBpdCBoZXJlLgorIyBZZXMsIHRoYXQgbWVhbnMgZXZlcnkgbmFtZSBvbmNlIHRha2VuIHdpbGwgbmVlZCB0byByZW1haW4gaGVyZSB1bnRpbAorIyB3ZSBnaXZlIHVwIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBiZWZvcmUgMS43LCBhdCB3aGljaCBwb2ludAorIyB3ZSBuZWVkIHRvIGtlZXAgb25seSB0aG9zZSBuYW1lcyB3aGljaCB3ZSBzdGlsbCByZWZlciB0by4KKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9CU09MRVRFX1ZFUlNJT05dLCBbbTRfaWYoWzFdKV0pCisKK200X2lmbmRlZihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dKV0pCittNF9pZm5kZWYoW0FDX1BST0dfRUdSRVBdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0VHUkVQXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCVtBQ19ERUZVTihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdKV0pCittNF9pZm5kZWYoW19MVF9BQ19TSEVMTF9JTklUXSwJCVtBQ19ERUZVTihbX0xUX0FDX1NIRUxMX0lOSVRdKV0pCittNF9pZm5kZWYoW19MVF9BQ19TWVNfTElCUEFUSF9BSVhdLAlbQUNfREVGVU4oW19MVF9BQ19TWVNfTElCUEFUSF9BSVhdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0xUTUFJTl0sCQlbQUNfREVGVU4oW19MVF9QUk9HX0xUTUFJTl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RBR1ZBUl0sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdWQVJdKV0pCittNF9pZm5kZWYoW0FDX0xURExfRU5BQkxFX0lOU1RBTExdLAlbQUNfREVGVU4oW0FDX0xURExfRU5BQkxFX0lOU1RBTExdKV0pCittNF9pZm5kZWYoW0FDX0xURExfUFJFT1BFTl0sCQlbQUNfREVGVU4oW0FDX0xURExfUFJFT1BFTl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NZU19DT01QSUxFUl0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19DT01QSUxFUl0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xPQ0tdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTE9DS10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX09MRF9BUkNISVZFXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSwJW0FDX0RFRlVOKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9PQkpESVJdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX09CSkRJUl0pXSkKK200X2lmbmRlZihbQUNfTFRETF9PQkpESVJdLAkJW0FDX0RFRlVOKFtBQ19MVERMX09CSkRJUl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0pXSkKK200X2lmbmRlZihbQUNfUEFUSF9NQUdJQ10sCQlbQUNfREVGVU4oW0FDX1BBVEhfTUFHSUNdKV0pCittNF9pZm5kZWYoW0FDX1BST0dfTERfR05VXSwJCVtBQ19ERUZVTihbQUNfUFJPR19MRF9HTlVdKV0pCittNF9pZm5kZWYoW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddLAlbQUNfREVGVU4oW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddKV0pCittNF9pZm5kZWYoW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSwJW0FDX0RFRlVOKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0pXSkKK200X2lmbmRlZihbTFRfQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0xUX0FDX1BST0dfRUdSRVBdKV0pCittNF9pZm5kZWYoW0xUX0FDX1BST0dfU0VEXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19TRURdKV0pCittNF9pZm5kZWYoW19MVF9DQ19CQVNFTkFNRV0sCQlbQUNfREVGVU4oW19MVF9DQ19CQVNFTkFNRV0pXSkKK200X2lmbmRlZihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwJW0FDX0RFRlVOKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdKV0pCittNF9pZm5kZWYoW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdKV0pCittNF9pZm5kZWYoW19BQ19QUk9HX0xJQlRPT0xdLAkJW0FDX0RFRlVOKFtfQUNfUFJPR19MSUJUT09MXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NFVFVQXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TRVRVUF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0NIRUNLX0RMRkNOXSwJCVtBQ19ERUZVTihbX0xUX0FDX0NIRUNLX0RMRkNOXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdKV0pCittNF9pZm5kZWYoW19MVF9BQ19UQUdDT05GSUddLAkJW0FDX0RFRlVOKFtfTFRfQUNfVEFHQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NYWF0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfRjc3XSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3XSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19HQ0pdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0NPTkZJR10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfRklMRV9MVERMTF9DXSwJW0FDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSldKQorbTRfaWZuZGVmKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10sCVtBQ19ERUZVTihbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdKV0pCittNF9pZm5kZWYoW19MVF9BQ19QUk9HX0NYWENQUF0sCQlbQUNfREVGVU4oW19MVF9BQ19QUk9HX0NYWENQUF0pXSkKK200X2lmbmRlZihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdLAlbQUNfREVGVU4oW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCVtBQ19ERUZVTihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9QUk9HX0Y3N10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfRkNdLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19GQ10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfQ1hYXSldKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tYWtlL01ha2VmaWxlIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tYWtlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjdiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21ha2UvTWFrZWZpbGUKQEAgLTAsMCArMSw4MCBAQAorIyBBIHNhbXBsZSBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QgYW5kIHVzaW5nIGl0IGluIHVzZXIKKyMgdGVzdHMuICBQbGVhc2UgdHdlYWsgaXQgdG8gc3VpdCB5b3VyIGVudmlyb25tZW50IGFuZCBwcm9qZWN0LiAgWW91CisjIG1heSB3YW50IHRvIG1vdmUgaXQgdG8geW91ciBwcm9qZWN0J3Mgcm9vdCBkaXJlY3RvcnkuCisjCisjIFNZTk9QU0lTOgorIworIyAgIG1ha2UgW2FsbF0gIC0gbWFrZXMgZXZlcnl0aGluZy4KKyMgICBtYWtlIFRBUkdFVCAtIG1ha2VzIHRoZSBnaXZlbiB0YXJnZXQuCisjICAgbWFrZSBjbGVhbiAgLSByZW1vdmVzIGFsbCBmaWxlcyBnZW5lcmF0ZWQgYnkgbWFrZS4KKworIyBQbGVhc2UgdHdlYWsgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBkZWZpbml0aW9ucyBhcyBuZWVkZWQgYnkgeW91cgorIyBwcm9qZWN0LCBleGNlcHQgR1RFU1RfSEVBREVSUywgd2hpY2ggeW91IGNhbiB1c2UgaW4geW91ciBvd24gdGFyZ2V0cworIyBidXQgc2hvdWxkbid0IG1vZGlmeS4KKworIyBQb2ludHMgdG8gdGhlIHJvb3Qgb2YgR29vZ2xlIFRlc3QsIHJlbGF0aXZlIHRvIHdoZXJlIHRoaXMgZmlsZSBpcy4KKyMgUmVtZW1iZXIgdG8gdHdlYWsgdGhpcyBpZiB5b3UgbW92ZSB0aGlzIGZpbGUuCitHVEVTVF9ESVIgPSAuLgorCisjIFdoZXJlIHRvIGZpbmQgdXNlciBjb2RlLgorVVNFUl9ESVIgPSAuLi9zYW1wbGVzCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBwcmVwcm9jZXNzb3IuCitDUFBGTEFHUyArPSAtSSQoR1RFU1RfRElSKS9pbmNsdWRlCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBDKysgY29tcGlsZXIuCitDWFhGTEFHUyArPSAtZyAtV2FsbCAtV2V4dHJhCisKKyMgQWxsIHRlc3RzIHByb2R1Y2VkIGJ5IHRoaXMgTWFrZWZpbGUuICBSZW1lbWJlciB0byBhZGQgbmV3IHRlc3RzIHlvdQorIyBjcmVhdGVkIHRvIHRoZSBsaXN0LgorVEVTVFMgPSBzYW1wbGUxX3VuaXR0ZXN0CisKKyMgQWxsIEdvb2dsZSBUZXN0IGhlYWRlcnMuICBVc3VhbGx5IHlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoaXMKKyMgZGVmaW5pdGlvbi4KK0dURVNUX0hFQURFUlMgPSAkKEdURVNUX0RJUikvaW5jbHVkZS9ndGVzdC8qLmggXAorICAgICAgICAgICAgICAgICQoR1RFU1RfRElSKS9pbmNsdWRlL2d0ZXN0L2ludGVybmFsLyouaAorCisjIEhvdXNlLWtlZXBpbmcgYnVpbGQgdGFyZ2V0cy4KKworYWxsIDogJChURVNUUykKKworY2xlYW4gOgorCXJtIC1mICQoVEVTVFMpIGd0ZXN0LmEgZ3Rlc3RfbWFpbi5hICoubworCisjIEJ1aWxkcyBndGVzdC5hIGFuZCBndGVzdF9tYWluLmEuCisKKyMgVXN1YWxseSB5b3Ugc2hvdWxkbid0IHR3ZWFrIHN1Y2ggaW50ZXJuYWwgdmFyaWFibGVzLCBpbmRpY2F0ZWQgYnkgYQorIyB0cmFpbGluZyBfLgorR1RFU1RfU1JDU18gPSAkKEdURVNUX0RJUikvc3JjLyouY2MgJChHVEVTVF9ESVIpL3NyYy8qLmggJChHVEVTVF9IRUFERVJTKQorCisjIEZvciBzaW1wbGljaXR5IGFuZCB0byBhdm9pZCBkZXBlbmRpbmcgb24gR29vZ2xlIFRlc3QncworIyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCB0aGUgZGVwZW5kZW5jaWVzIHNwZWNpZmllZCBiZWxvdyBhcmUKKyMgY29uc2VydmF0aXZlIGFuZCBub3Qgb3B0aW1pemVkLiAgVGhpcyBpcyBmaW5lIGFzIEdvb2dsZSBUZXN0CisjIGNvbXBpbGVzIGZhc3QgYW5kIGZvciBvcmRpbmFyeSB1c2VycyBpdHMgc291cmNlIHJhcmVseSBjaGFuZ2VzLgorZ3Rlc3QtYWxsLm8gOiAkKEdURVNUX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAkKENYWEZMQUdTKSAtYyBcCisgICAgICAgICAgICAkKEdURVNUX0RJUikvc3JjL2d0ZXN0LWFsbC5jYworCitndGVzdF9tYWluLm8gOiAkKEdURVNUX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAkKENYWEZMQUdTKSAtYyBcCisgICAgICAgICAgICAkKEdURVNUX0RJUikvc3JjL2d0ZXN0X21haW4uY2MKKworZ3Rlc3QuYSA6IGd0ZXN0LWFsbC5vCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitndGVzdF9tYWluLmEgOiBndGVzdC1hbGwubyBndGVzdF9tYWluLm8KKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKKyMgQnVpbGRzIGEgc2FtcGxlIHRlc3QuICBBIHRlc3Qgc2hvdWxkIGxpbmsgd2l0aCBlaXRoZXIgZ3Rlc3QuYSBvcgorIyBndGVzdF9tYWluLmEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGRlZmluZXMgaXRzIG93biBtYWluKCkKKyMgZnVuY3Rpb24uCisKK3NhbXBsZTEubyA6ICQoVVNFUl9ESVIpL3NhbXBsZTEuY2MgJChVU0VSX0RJUikvc2FtcGxlMS5oICQoR1RFU1RfSEVBREVSUykKKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChVU0VSX0RJUikvc2FtcGxlMS5jYworCitzYW1wbGUxX3VuaXR0ZXN0Lm8gOiAkKFVTRVJfRElSKS9zYW1wbGUxX3VuaXR0ZXN0LmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICQoVVNFUl9ESVIpL3NhbXBsZTEuaCAkKEdURVNUX0hFQURFUlMpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoVVNFUl9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MKKworc2FtcGxlMV91bml0dGVzdCA6IHNhbXBsZTEubyBzYW1wbGUxX3VuaXR0ZXN0Lm8gZ3Rlc3RfbWFpbi5hCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1scHRocmVhZCAkXiAtbyAkQApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0LW1kLnNsbiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbXN2Yy9ndGVzdC1tZC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5MDhkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbXN2Yy9ndGVzdC1tZC5zbG4KQEAgLTAsMCArMSw0NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOC4wMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3QtbWQiLCAiZ3Rlc3QtbWQudmNwcm9qIiwgIntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfbWFpbi1tZCIsICJndGVzdF9tYWluLW1kLnZjcHJvaiIsICJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3Byb2RfdGVzdC1tZCIsICJndGVzdF9wcm9kX3Rlc3QtbWQudmNwcm9qIiwgInsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfdW5pdHRlc3QtbWQiLCAiZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIiwgIns0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvbikgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWcgPSBEZWJ1Zw0KKwkJUmVsZWFzZSA9IFJlbGVhc2UNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU4fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUEyfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlBZGRJbnMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21zdmMvZ3Rlc3QtbWQudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0LW1kLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRkMzZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0LW1kIg0KKwlQcm9qZWN0R1VJRD0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtfREVCVUc7X0xJQiINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0ZC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSImcXVvdDsuLlxpbmNsdWRlJnF1b3Q7OyZxdW90Oy4uJnF1b3Q7Ij4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0LmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xndGVzdC1hbGwuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0LnNsbiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbXN2Yy9ndGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0YjA1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbXN2Yy9ndGVzdC5zbG4KQEAgLTAsMCArMSw0NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOC4wMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3QiLCAiZ3Rlc3QudmNwcm9qIiwgIntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfbWFpbiIsICJndGVzdF9tYWluLnZjcHJvaiIsICJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3VuaXR0ZXN0IiwgImd0ZXN0X3VuaXR0ZXN0LnZjcHJvaiIsICJ7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3Byb2RfdGVzdCIsICJndGVzdF9wcm9kX3Rlc3QudmNwcm9qIiwgInsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvbikgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWcgPSBEZWJ1Zw0KKwkJUmVsZWFzZSA9IFJlbGVhc2UNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlBZGRJbnMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21zdmMvZ3Rlc3QudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGFkMTBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0LnZjcHJvagpAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0Ig0KKwlQcm9qZWN0R1VJRD0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtfREVCVUc7X0xJQiINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0ZC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSImcXVvdDsuLlxpbmNsdWRlJnF1b3Q7OyZxdW90Oy4uJnF1b3Q7Ij4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0LmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xndGVzdC1hbGwuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDJmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21zdmMvZ3Rlc3RfbWFpbi1tZC52Y3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF9tYWluLW1kIg0KKwlQcm9qZWN0R1VJRD0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtfREVCVUc7X0xJQiINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpZC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSImcXVvdDsuLlxpbmNsdWRlJnF1b3Q7OyZxdW90Oy4uJnF1b3Q7Ij4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQorCQkJTmFtZT0iZ3Rlc3QtbWQiLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X21haW4udmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X21haW4udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzQ5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21zdmMvZ3Rlc3RfbWFpbi52Y3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF9tYWluIg0KKwlQcm9qZWN0R1VJRD0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtfREVCVUc7X0xJQiINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpZC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSImcXVvdDsuLlxpbmNsdWRlJnF1b3Q7OyZxdW90Oy4uJnF1b3Q7Ij4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30iDQorCQkJTmFtZT0iZ3Rlc3QiLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2ogYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDA4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2oKQEAgLTAsMCArMSwxNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF9wcm9kX3Rlc3QtbWQiDQorCVByb2plY3RHVUlEPSJ7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZBUklBRElDX01BWD0xMDtXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJCTxQcm9qZWN0UmVmZXJlbmNlDQorCQkJUmVmZXJlbmNlZFByb2plY3RJZGVudGlmaWVyPSJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCisJCQlOYW1lPSJndGVzdF9tYWluLW1kIi8+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RcZ3Rlc3RfcHJvZF90ZXN0LmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XHByb2R1Y3Rpb24uY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XHByb2R1Y3Rpb24uaCI+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiZGIzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qCkBAIC0wLDAgKzEsMTY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3RfcHJvZF90ZXN0Ig0KKwlQcm9qZWN0R1VJRD0iezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9WQVJJQURJQ19NQVg9MTA7V0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9WQVJJQURJQ19NQVg9MTA7V0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbiIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3Byb2RfdGVzdC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21zdmMvZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM5ZTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDE0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3VuaXR0ZXN0LW1kIg0KKwlQcm9qZWN0R1VJRD0iezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9WQVJJQURJQ19NQVg9MTA7V0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfVkFSSUFESUNfTUFYPTEwO1dJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbi1tZCIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIxIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L21zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTJmYWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvagpAQCAtMCwwICsxLDE0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3VuaXR0ZXN0Ig0KKwlQcm9qZWN0R1VJRD0iezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9WQVJJQURJQ19NQVg9MTA7V0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfVkFSSUFESUNfTUFYPTEwO1dJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbiIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIxIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvcHJpbWVfdGFibGVzLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvcHJpbWVfdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjZTE2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9wcmltZV90YWJsZXMuaApAQCAtMCwwICsxLDEyMyBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUaGlzIHByb3ZpZGVzIGludGVyZmFjZSBQcmltZVRhYmxlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgbnVtYmVyIGlzIGEKKy8vIHByaW1lIGFuZCBkZXRlcm1pbmVzIGEgbmV4dCBwcmltZSBudW1iZXIuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQKKy8vIGluIEdvb2dsZSBUZXN0IHNhbXBsZXMgZGVtb25zdHJhdGluZyB1c2Ugb2YgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1BSSU1FX1RBQkxFU19IXworI2RlZmluZSBHVEVTVF9TQU1QTEVTX1BSSU1FX1RBQkxFU19IXworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvLyBUaGUgcHJpbWUgdGFibGUgaW50ZXJmYWNlLgorY2xhc3MgUHJpbWVUYWJsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5QcmltZVRhYmxlKCkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIG4gaXMgYSBwcmltZSBudW1iZXIuCisgIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3QgcHJpbWUgbnVtYmVyIGdyZWF0ZXIgdGhhbiBwOyBvciByZXR1cm5zIC0xCisgIC8vIGlmIHRoZSBuZXh0IHByaW1lIGlzIGJleW9uZCB0aGUgY2FwYWNpdHkgb2YgdGhlIHRhYmxlLgorICB2aXJ0dWFsIGludCBHZXROZXh0UHJpbWUoaW50IHApIGNvbnN0ID0gMDsKK307CisKKy8vIEltcGxlbWVudGF0aW9uICMxIGNhbGN1bGF0ZXMgdGhlIHByaW1lcyBvbi10aGUtZmx5LgorY2xhc3MgT25UaGVGbHlQcmltZVRhYmxlIDogcHVibGljIFByaW1lVGFibGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIElzUHJpbWUoaW50IG4pIGNvbnN0IHsKKyAgICBpZiAobiA8PSAxKSByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKGludCBpID0gMjsgaSppIDw9IG47IGkrKykgeworICAgICAgLy8gbiBpcyBkaXZpc2libGUgYnkgYW4gaW50ZWdlciBvdGhlciB0aGFuIDEgYW5kIGl0c2VsZi4KKyAgICAgIGlmICgobiAlIGkpID09IDApIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgaW50IEdldE5leHRQcmltZShpbnQgcCkgY29uc3QgeworICAgIGZvciAoaW50IG4gPSBwICsgMTsgbiA+IDA7IG4rKykgeworICAgICAgaWYgKElzUHJpbWUobikpIHJldHVybiBuOworICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorfTsKKworLy8gSW1wbGVtZW50YXRpb24gIzIgcHJlLWNhbGN1bGF0ZXMgdGhlIHByaW1lcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQKKy8vIGluIGFuIGFycmF5LgorY2xhc3MgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUgOiBwdWJsaWMgUHJpbWVUYWJsZSB7CisgcHVibGljOgorICAvLyAnbWF4JyBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIHRoZSBwcmltZSB0YWJsZSBob2xkcy4KKyAgZXhwbGljaXQgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUoaW50IG1heCkKKyAgICAgIDogaXNfcHJpbWVfc2l6ZV8obWF4ICsgMSksIGlzX3ByaW1lXyhuZXcgYm9vbFttYXggKyAxXSkgeworICAgIENhbGN1bGF0ZVByaW1lc1VwVG8obWF4KTsKKyAgfQorICB2aXJ0dWFsIH5QcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSgpIHsgZGVsZXRlW10gaXNfcHJpbWVfOyB9CisKKyAgdmlydHVhbCBib29sIElzUHJpbWUoaW50IG4pIGNvbnN0IHsKKyAgICByZXR1cm4gMCA8PSBuICYmIG4gPCBpc19wcmltZV9zaXplXyAmJiBpc19wcmltZV9bbl07CisgIH0KKworICB2aXJ0dWFsIGludCBHZXROZXh0UHJpbWUoaW50IHApIGNvbnN0IHsKKyAgICBmb3IgKGludCBuID0gcCArIDE7IG4gPCBpc19wcmltZV9zaXplXzsgbisrKSB7CisgICAgICBpZiAoaXNfcHJpbWVfW25dKSByZXR1cm4gbjsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgQ2FsY3VsYXRlUHJpbWVzVXBUbyhpbnQgbWF4KSB7CisgICAgOjpzdGQ6OmZpbGwoaXNfcHJpbWVfLCBpc19wcmltZV8gKyBpc19wcmltZV9zaXplXywgdHJ1ZSk7CisgICAgaXNfcHJpbWVfWzBdID0gaXNfcHJpbWVfWzFdID0gZmFsc2U7CisKKyAgICBmb3IgKGludCBpID0gMjsgaSA8PSBtYXg7IGkrKykgeworICAgICAgaWYgKCFpc19wcmltZV9baV0pIGNvbnRpbnVlOworCisgICAgICAvLyBNYXJrcyBhbGwgbXVsdGlwbGVzIG9mIGkgKGV4Y2VwdCBpIGl0c2VsZikgYXMgbm9uLXByaW1lLgorICAgICAgZm9yIChpbnQgaiA9IDIqaTsgaiA8PSBtYXg7IGogKz0gaSkgeworICAgICAgICBpc19wcmltZV9bal0gPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjb25zdCBpbnQgaXNfcHJpbWVfc2l6ZV87CisgIGJvb2wqIGNvbnN0IGlzX3ByaW1lXzsKKworICAvLyBEaXNhYmxlcyBjb21waWxlciB3YXJuaW5nICJhc3NpZ25tZW50IG9wZXJhdG9yIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQuIgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSYgcmhzKTsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfU0FNUExFU19QUklNRV9UQUJMRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTEuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3MWUyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxLmNjCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAic2FtcGxlMS5oIgorCisvLyBSZXR1cm5zIG4hICh0aGUgZmFjdG9yaWFsIG9mIG4pLiAgRm9yIG5lZ2F0aXZlIG4sIG4hIGlzIGRlZmluZWQgdG8gYmUgMS4KK2ludCBGYWN0b3JpYWwoaW50IG4pIHsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgeworICAgIHJlc3VsdCAqPSBpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiBuIGlzIGEgcHJpbWUgbnVtYmVyLgorYm9vbCBJc1ByaW1lKGludCBuKSB7CisgIC8vIFRyaXZpYWwgY2FzZSAxOiBzbWFsbCBudW1iZXJzCisgIGlmIChuIDw9IDEpIHJldHVybiBmYWxzZTsKKworICAvLyBUcml2aWFsIGNhc2UgMjogZXZlbiBudW1iZXJzCisgIGlmIChuICUgMiA9PSAwKSByZXR1cm4gbiA9PSAyOworCisgIC8vIE5vdywgd2UgaGF2ZSB0aGF0IG4gaXMgb2RkIGFuZCBuID49IDMuCisKKyAgLy8gVHJ5IHRvIGRpdmlkZSBuIGJ5IGV2ZXJ5IG9kZCBudW1iZXIgaSwgc3RhcnRpbmcgZnJvbSAzCisgIGZvciAoaW50IGkgPSAzOyA7IGkgKz0gMikgeworICAgIC8vIFdlIG9ubHkgaGF2ZSB0byB0cnkgaSB1cCB0byB0aGUgc3F1cmUgcm9vdCBvZiBuCisgICAgaWYgKGkgPiBuL2kpIGJyZWFrOworCisgICAgLy8gTm93LCB3ZSBoYXZlIGkgPD0gbi9pIDwgbi4KKyAgICAvLyBJZiBuIGlzIGRpdmlzaWJsZSBieSBpLCBuIGlzIG5vdCBwcmltZS4KKyAgICBpZiAobiAlIGkgPT0gMCkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gbiBoYXMgbm8gaW50ZWdlciBmYWN0b3IgaW4gdGhlIHJhbmdlICgxLCBuKSwgYW5kIHRodXMgaXMgcHJpbWUuCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTEuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmZWI5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxLmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfU0FNUExFU19TQU1QTEUxX0hfCisjZGVmaW5lIEdURVNUX1NBTVBMRVNfU0FNUExFMV9IXworCisvLyBSZXR1cm5zIG4hICh0aGUgZmFjdG9yaWFsIG9mIG4pLiAgRm9yIG5lZ2F0aXZlIG4sIG4hIGlzIGRlZmluZWQgdG8gYmUgMS4KK2ludCBGYWN0b3JpYWwoaW50IG4pOworCisvLyBSZXR1cm5zIHRydWUgaWZmIG4gaXMgYSBwcmltZSBudW1iZXIuCitib29sIElzUHJpbWUoaW50IG4pOworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFMV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTFjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNDQgQEAKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdXNlIEdvb2dsZSBUZXN0IGxpc3RlbmVyIEFQSSB0byBpbXBsZW1lbnQKKy8vIGEgcHJpbWl0aXZlIGxlYWsgY2hlY2tlci4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXI7Cit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0Q2FzZTsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0SW5mbzsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ7Cit1c2luZyA6OnRlc3Rpbmc6OlVuaXRUZXN0OworCituYW1lc3BhY2UgeworCisvLyBXZSB3aWxsIHRyYWNrIG1lbW9yeSB1c2VkIGJ5IHRoaXMgY2xhc3MuCitjbGFzcyBXYXRlciB7CisgcHVibGljOgorICAvLyBOb3JtYWwgV2F0ZXIgZGVjbGFyYXRpb25zIGdvIGhlcmUuCisKKyAgLy8gb3BlcmF0b3IgbmV3IGFuZCBvcGVyYXRvciBkZWxldGUgaGVscCB1cyBjb250cm9sIHdhdGVyIGFsbG9jYXRpb24uCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QgYWxsb2NhdGlvbl9zaXplKSB7CisgICAgYWxsb2NhdGVkXysrOworICAgIHJldHVybiBtYWxsb2MoYWxsb2NhdGlvbl9zaXplKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIGJsb2NrLCBzaXplX3QgLyogYWxsb2NhdGlvbl9zaXplICovKSB7CisgICAgYWxsb2NhdGVkXy0tOworICAgIGZyZWUoYmxvY2spOworICB9CisKKyAgc3RhdGljIGludCBhbGxvY2F0ZWQoKSB7IHJldHVybiBhbGxvY2F0ZWRfOyB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IGFsbG9jYXRlZF87Cit9OworCitpbnQgV2F0ZXI6OmFsbG9jYXRlZF8gPSAwOworCisvLyBUaGlzIGV2ZW50IGxpc3RlbmVyIG1vbml0b3JzIGhvdyBtYW55IFdhdGVyIG9iamVjdHMgYXJlIGNyZWF0ZWQgYW5kCisvLyBkZXN0cm95ZWQgYnkgZWFjaCB0ZXN0LCBhbmQgcmVwb3J0cyBhIGZhaWx1cmUgaWYgYSB0ZXN0IGxlYWtzIHNvbWUgV2F0ZXIKKy8vIG9iamVjdHMuIEl0IGRvZXMgdGhpcyBieSBjb21wYXJpbmcgdGhlIG51bWJlciBvZiBsaXZlIFdhdGVyIG9iamVjdHMgYXQKKy8vIHRoZSBiZWdpbm5pbmcgb2YgYSB0ZXN0IGFuZCBhdCB0aGUgZW5kIG9mIGEgdGVzdC4KK2NsYXNzIExlYWtDaGVja2VyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHByaXZhdGU6CisgIC8vIENhbGxlZCBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiAvKiB0ZXN0X2luZm8gKi8pIHsKKyAgICBpbml0aWFsbHlfYWxsb2NhdGVkXyA9IFdhdGVyOjphbGxvY2F0ZWQoKTsKKyAgfQorCisgIC8vIENhbGxlZCBhZnRlciBhIHRlc3QgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgLyogdGVzdF9pbmZvICovKSB7CisgICAgaW50IGRpZmZlcmVuY2UgPSBXYXRlcjo6YWxsb2NhdGVkKCkgLSBpbml0aWFsbHlfYWxsb2NhdGVkXzsKKworICAgIC8vIFlvdSBjYW4gZ2VuZXJhdGUgYSBmYWlsdXJlIGluIGFueSBldmVudCBoYW5kbGVyIGV4Y2VwdAorICAgIC8vIE9uVGVzdFBhcnRSZXN1bHQuIEp1c3QgdXNlIGFuIGFwcHJvcHJpYXRlIEdvb2dsZSBUZXN0IGFzc2VydGlvbiB0byBkbworICAgIC8vIGl0LgorICAgIEVYUEVDVF9MRShkaWZmZXJlbmNlLCAwKSA8PCAiTGVha2VkICIgPDwgZGlmZmVyZW5jZSA8PCAiIHVuaXQocykgb2YgV2F0ZXIhIjsKKyAgfQorCisgIGludCBpbml0aWFsbHlfYWxsb2NhdGVkXzsKK307CisKK1RFU1QoTGlzdGVuZXJzVGVzdCwgRG9lc05vdExlYWspIHsKKyAgV2F0ZXIqIHdhdGVyID0gbmV3IFdhdGVyOworICBkZWxldGUgd2F0ZXI7Cit9CisKKy8vIFRoaXMgc2hvdWxkIGZhaWwgd2hlbiB0aGUgLS1jaGVja19mb3JfbGVha3MgY29tbWFuZCBsaW5lIGZsYWcgaXMKKy8vIHNwZWNpZmllZC4KK1RFU1QoTGlzdGVuZXJzVGVzdCwgTGVha3NXYXRlcikgeworICBXYXRlciogd2F0ZXIgPSBuZXcgV2F0ZXI7CisgIEVYUEVDVF9UUlVFKHdhdGVyICE9IE5VTEwpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBib29sIGNoZWNrX2Zvcl9sZWFrcyA9IGZhbHNlOworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWNoZWNrX2Zvcl9sZWFrcyIpID09IDAgKQorICAgIGNoZWNrX2Zvcl9sZWFrcyA9IHRydWU7CisgIGVsc2UKKyAgICBwcmludGYoIiVzXG4iLCAiUnVuIHRoaXMgcHJvZ3JhbSB3aXRoIC0tY2hlY2tfZm9yX2xlYWtzIHRvIGVuYWJsZSAiCisgICAgICAgICAgICJjdXN0b20gbGVhayBjaGVja2luZyBpbiB0aGUgdGVzdHMuIik7CisKKyAgLy8gSWYgd2UgYXJlIGdpdmVuIHRoZSAtLWNoZWNrX2Zvcl9sZWFrcyBjb21tYW5kIGxpbmUgZmxhZywgaW5zdGFsbHMgdGhlCisgIC8vIGxlYWsgY2hlY2tlci4KKyAgaWYgKGNoZWNrX2Zvcl9sZWFrcykgeworICAgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOworCisgICAgLy8gQWRkcyB0aGUgbGVhayBjaGVja2VyIHRvIHRoZSBlbmQgb2YgdGhlIHRlc3QgZXZlbnQgbGlzdGVuZXIgbGlzdCwKKyAgICAvLyBhZnRlciB0aGUgZGVmYXVsdCB0ZXh0IG91dHB1dCBwcmludGVyIGFuZCB0aGUgZGVmYXVsdCBYTUwgcmVwb3J0CisgICAgLy8gZ2VuZXJhdG9yLgorICAgIC8vCisgICAgLy8gVGhlIG9yZGVyIGlzIGltcG9ydGFudCAtIGl0IGVuc3VyZXMgdGhhdCBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlCisgICAgLy8gbGVhayBjaGVja2VyJ3MgT25UZXN0RW5kKCkgbWV0aG9kIGFyZSBwcm9jZXNzZWQgYnkgdGhlIHRleHQgYW5kIFhNTAorICAgIC8vIHByaW50ZXJzICpiZWZvcmUqIHRoZWlyIE9uVGVzdEVuZCgpIG1ldGhvZHMgYXJlIGNhbGxlZCwgc3VjaCB0aGF0CisgICAgLy8gdGhleSBhcmUgYXR0cmlidXRlZCB0byB0aGUgcmlnaHQgdGVzdC4gUmVtZW1iZXIgdGhhdCBhIGxpc3RlbmVyCisgICAgLy8gcmVjZWl2ZXMgYW4gT25YeXpTdGFydCBldmVudCAqYWZ0ZXIqIGxpc3RlbmVycyBwcmVjZWRpbmcgaXQgaW4gdGhlCisgICAgLy8gbGlzdCByZWNlaXZlZCB0aGF0IGV2ZW50LCBhbmQgcmVjZWl2ZXMgYW4gT25YeXpFbmQgZXZlbnQgKmJlZm9yZSoKKyAgICAvLyBsaXN0ZW5lcnMgcHJlY2VkaW5nIGl0LgorICAgIC8vCisgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBkZWxldGluZyB0aGUgbmV3IGxpc3RlbmVyIGxhdGVyLCBhcworICAgIC8vIEdvb2dsZSBUZXN0IHdpbGwgZG8gaXQuCisgICAgbGlzdGVuZXJzLkFwcGVuZChuZXcgTGVha0NoZWNrZXIpOworICB9CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmM0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE1MyBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHdyaXRlIGEgc2ltcGxlIHVuaXQgdGVzdCBmb3IgYSBmdW5jdGlvbiwKKy8vIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gV3JpdGluZyBhIHVuaXQgdGVzdCB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrIGlzIGVhc3kgYXMgMS0yLTM6CisKKworLy8gU3RlcCAxLiBJbmNsdWRlIG5lY2Vzc2FyeSBoZWFkZXIgZmlsZXMgc3VjaCB0aGF0IHRoZSBzdHVmZiB5b3VyCisvLyB0ZXN0IGxvZ2ljIG5lZWRzIGlzIGRlY2xhcmVkLgorLy8KKy8vIERvbid0IGZvcmdldCBndGVzdC5oLCB3aGljaCBkZWNsYXJlcyB0aGUgdGVzdGluZyBmcmFtZXdvcmsuCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJzYW1wbGUxLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworCisvLyBTdGVwIDIuIFVzZSB0aGUgVEVTVCBtYWNybyB0byBkZWZpbmUgeW91ciB0ZXN0cy4KKy8vCisvLyBURVNUIGhhcyB0d28gcGFyYW1ldGVyczogdGhlIHRlc3QgY2FzZSBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorLy8gQWZ0ZXIgdXNpbmcgdGhlIG1hY3JvLCB5b3Ugc2hvdWxkIGRlZmluZSB5b3VyIHRlc3QgbG9naWMgYmV0d2VlbiBhCisvLyBwYWlyIG9mIGJyYWNlcy4gIFlvdSBjYW4gdXNlIGEgYnVuY2ggb2YgbWFjcm9zIHRvIGluZGljYXRlIHRoZQorLy8gc3VjY2VzcyBvciBmYWlsdXJlIG9mIGEgdGVzdC4gIEVYUEVDVF9UUlVFIGFuZCBFWFBFQ1RfRVEgYXJlCisvLyBleGFtcGxlcyBvZiBzdWNoIG1hY3Jvcy4gIEZvciBhIGNvbXBsZXRlIGxpc3QsIHNlZSBndGVzdC5oLgorLy8KKy8vIDxUZWNobmljYWxEZXRhaWxzPgorLy8KKy8vIEluIEdvb2dsZSBUZXN0LCB0ZXN0cyBhcmUgZ3JvdXBlZCBpbnRvIHRlc3QgY2FzZXMuICBUaGlzIGlzIGhvdyB3ZQorLy8ga2VlcCB0ZXN0IGNvZGUgb3JnYW5pemVkLiAgWW91IHNob3VsZCBwdXQgbG9naWNhbGx5IHJlbGF0ZWQgdGVzdHMKKy8vIGludG8gdGhlIHNhbWUgdGVzdCBjYXNlLgorLy8KKy8vIFRoZSB0ZXN0IGNhc2UgbmFtZSBhbmQgdGhlIHRlc3QgbmFtZSBzaG91bGQgYm90aCBiZSB2YWxpZCBDKysKKy8vIGlkZW50aWZpZXJzLiAgQW5kIHlvdSBzaG91bGQgbm90IHVzZSB1bmRlcnNjb3JlIChfKSBpbiB0aGUgbmFtZXMuCisvLworLy8gR29vZ2xlIFRlc3QgZ3VhcmFudGVlcyB0aGF0IGVhY2ggdGVzdCB5b3UgZGVmaW5lIGlzIHJ1biBleGFjdGx5CisvLyBvbmNlLCBidXQgaXQgbWFrZXMgbm8gZ3VhcmFudGVlIG9uIHRoZSBvcmRlciB0aGUgdGVzdHMgYXJlCisvLyBleGVjdXRlZC4gIFRoZXJlZm9yZSwgeW91IHNob3VsZCB3cml0ZSB5b3VyIHRlc3RzIGluIHN1Y2ggYSB3YXkKKy8vIHRoYXQgdGhlaXIgcmVzdWx0cyBkb24ndCBkZXBlbmQgb24gdGhlaXIgb3JkZXIuCisvLworLy8gPC9UZWNobmljYWxEZXRhaWxzPgorCisKKy8vIFRlc3RzIEZhY3RvcmlhbCgpLgorCisvLyBUZXN0cyBmYWN0b3JpYWwgb2YgbmVnYXRpdmUgbnVtYmVycy4KK1RFU1QoRmFjdG9yaWFsVGVzdCwgTmVnYXRpdmUpIHsKKyAgLy8gVGhpcyB0ZXN0IGlzIG5hbWVkICJOZWdhdGl2ZSIsIGFuZCBiZWxvbmdzIHRvIHRoZSAiRmFjdG9yaWFsVGVzdCIKKyAgLy8gdGVzdCBjYXNlLgorICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKC01KSk7CisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoLTEpKTsKKyAgRVhQRUNUX0dUKEZhY3RvcmlhbCgtMTApLCAwKTsKKworICAvLyA8VGVjaG5pY2FsRGV0YWlscz4KKyAgLy8KKyAgLy8gRVhQRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpIGlzIHRoZSBzYW1lIGFzCisgIC8vCisgIC8vICAgRVhQRUNUX1RSVUUoKGV4cGVjdGVkKSA9PSAoYWN0dWFsKSkKKyAgLy8KKyAgLy8gZXhjZXB0IHRoYXQgaXQgd2lsbCBwcmludCBib3RoIHRoZSBleHBlY3RlZCB2YWx1ZSBhbmQgdGhlIGFjdHVhbAorICAvLyB2YWx1ZSB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuICBUaGlzIGlzIHZlcnkgaGVscGZ1bCBmb3IKKyAgLy8gZGVidWdnaW5nLiAgVGhlcmVmb3JlIGluIHRoaXMgY2FzZSBFWFBFQ1RfRVEgaXMgcHJlZmVycmVkLgorICAvLworICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgRVhQRUNUX1RSVUUgYWNjZXB0cyBhbnkgQm9vbGVhbiBleHByZXNzaW9uLAorICAvLyBhbmQgaXMgdGh1cyBtb3JlIGdlbmVyYWwuCisgIC8vCisgIC8vIDwvVGVjaG5pY2FsRGV0YWlscz4KK30KKworLy8gVGVzdHMgZmFjdG9yaWFsIG9mIDAuCitURVNUKEZhY3RvcmlhbFRlc3QsIFplcm8pIHsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgwKSk7Cit9CisKKy8vIFRlc3RzIGZhY3RvcmlhbCBvZiBwb3NpdGl2ZSBudW1iZXJzLgorVEVTVChGYWN0b3JpYWxUZXN0LCBQb3NpdGl2ZSkgeworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDEpKTsKKyAgRVhQRUNUX0VRKDIsIEZhY3RvcmlhbCgyKSk7CisgIEVYUEVDVF9FUSg2LCBGYWN0b3JpYWwoMykpOworICBFWFBFQ1RfRVEoNDAzMjAsIEZhY3RvcmlhbCg4KSk7Cit9CisKKworLy8gVGVzdHMgSXNQcmltZSgpCisKKy8vIFRlc3RzIG5lZ2F0aXZlIGlucHV0LgorVEVTVChJc1ByaW1lVGVzdCwgTmVnYXRpdmUpIHsKKyAgLy8gVGhpcyB0ZXN0IGJlbG9uZ3MgdG8gdGhlIElzUHJpbWVUZXN0IHRlc3QgY2FzZS4KKworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgtMSkpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgtMikpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZShJTlRfTUlOKSk7Cit9CisKKy8vIFRlc3RzIHNvbWUgdHJpdmlhbCBjYXNlcy4KK1RFU1QoSXNQcmltZVRlc3QsIFRyaXZpYWwpIHsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgxKSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDMpKTsKK30KKworLy8gVGVzdHMgcG9zaXRpdmUgaW5wdXQuCitURVNUKElzUHJpbWVUZXN0LCBQb3NpdGl2ZSkgeworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSg0KSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoNSkpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSg2KSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoMjMpKTsKK30KKworLy8gU3RlcCAzLiBDYWxsIFJVTl9BTExfVEVTVFMoKSBpbiBtYWluKCkuCisvLworLy8gV2UgZG8gdGhpcyBieSBsaW5raW5nIGluIHNyYy9ndGVzdF9tYWluLmNjIGZpbGUsIHdoaWNoIGNvbnNpc3RzIG9mCisvLyBhIG1haW4oKSBmdW5jdGlvbiB3aGljaCBjYWxscyBSVU5fQUxMX1RFU1RTKCkgZm9yIHVzLgorLy8KKy8vIFRoaXMgcnVucyBhbGwgdGhlIHRlc3RzIHlvdSd2ZSBkZWZpbmVkLCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisvLyByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gRGlkIHlvdSBub3RpY2UgdGhhdCB3ZSBkaWRuJ3QgcmVnaXN0ZXIgdGhlIHRlc3RzPyAgVGhlCisvLyBSVU5fQUxMX1RFU1RTKCkgbWFjcm8gbWFnaWNhbGx5IGtub3dzIGFib3V0IGFsbCB0aGUgdGVzdHMgd2UKKy8vIGRlZmluZWQuICBJc24ndCB0aGlzIGNvbnZlbmllbnQ/CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNzYzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMi5jYwpAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgInNhbXBsZTIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4KK2NvbnN0IGNoYXIqIE15U3RyaW5nOjpDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogYV9jX3N0cmluZykgeworICBpZiAoYV9jX3N0cmluZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKGFfY19zdHJpbmcpOworICBjaGFyKiBjb25zdCBjbG9uZSA9IG5ldyBjaGFyWyBsZW4gKyAxIF07CisgIG1lbWNweShjbG9uZSwgYV9jX3N0cmluZywgbGVuICsgMSk7CisKKyAgcmV0dXJuIGNsb25lOworfQorCisvLyBTZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBNeVN0cmluZyBvYmplY3QKKy8vIHJlcHJlc2VudHMuCit2b2lkIE15U3RyaW5nOjpTZXQoY29uc3QgY2hhciogYV9jX3N0cmluZykgeworICAvLyBNYWtlcyBzdXJlIHRoaXMgd29ya3Mgd2hlbiBjX3N0cmluZyA9PSBjX3N0cmluZ18KKyAgY29uc3QgY2hhciogY29uc3QgdGVtcCA9IE15U3RyaW5nOjpDbG9uZUNTdHJpbmcoYV9jX3N0cmluZyk7CisgIGRlbGV0ZVtdIGNfc3RyaW5nXzsKKyAgY19zdHJpbmdfID0gdGVtcDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUyLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDg1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMi5oCkBAIC0wLDAgKzEsODUgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFMl9IXworI2RlZmluZSBHVEVTVF9TQU1QTEVTX1NBTVBMRTJfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKy8vIEEgc2ltcGxlIHN0cmluZyBjbGFzcy4KK2NsYXNzIE15U3RyaW5nIHsKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBjX3N0cmluZ187CisgIGNvbnN0IE15U3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgTXlTdHJpbmcmIHJocyk7CisKKyBwdWJsaWM6CisgIC8vIENsb25lcyBhIDAtdGVybWluYXRlZCBDIHN0cmluZywgYWxsb2NhdGluZyBtZW1vcnkgdXNpbmcgbmV3LgorICBzdGF0aWMgY29uc3QgY2hhciogQ2xvbmVDU3RyaW5nKGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpOworCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLworICAvLyBDJ3RvcnMKKworICAvLyBUaGUgZGVmYXVsdCBjJ3RvciBjb25zdHJ1Y3RzIGEgTlVMTCBzdHJpbmcuCisgIE15U3RyaW5nKCkgOiBjX3N0cmluZ18oTlVMTCkge30KKworICAvLyBDb25zdHJ1Y3RzIGEgTXlTdHJpbmcgYnkgY2xvbmluZyBhIDAtdGVybWluYXRlZCBDIHN0cmluZy4KKyAgZXhwbGljaXQgTXlTdHJpbmcoY29uc3QgY2hhciogYV9jX3N0cmluZykgOiBjX3N0cmluZ18oTlVMTCkgeworICAgIFNldChhX2Nfc3RyaW5nKTsKKyAgfQorCisgIC8vIENvcHkgYyd0b3IKKyAgTXlTdHJpbmcoY29uc3QgTXlTdHJpbmcmIHN0cmluZykgOiBjX3N0cmluZ18oTlVMTCkgeworICAgIFNldChzdHJpbmcuY19zdHJpbmdfKTsKKyAgfQorCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLworICAvLyBEJ3Rvci4gIE15U3RyaW5nIGlzIGludGVuZGVkIHRvIGJlIGEgZmluYWwgY2xhc3MsIHNvIHRoZSBkJ3RvcgorICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgdmlydHVhbC4KKyAgfk15U3RyaW5nKCkgeyBkZWxldGVbXSBjX3N0cmluZ187IH0KKworICAvLyBHZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBNeVN0cmluZyBvYmplY3QgcmVwcmVzZW50cy4KKyAgY29uc3QgY2hhciogY19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBjX3N0cmluZ187IH0KKworICBzaXplX3QgTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBjX3N0cmluZ18gPT0gTlVMTCA/IDAgOiBzdHJsZW4oY19zdHJpbmdfKTsKKyAgfQorCisgIC8vIFNldHMgdGhlIDAtdGVybWluYXRlZCBDIHN0cmluZyB0aGlzIE15U3RyaW5nIG9iamVjdCByZXByZXNlbnRzLgorICB2b2lkIFNldChjb25zdCBjaGFyKiBjX3N0cmluZyk7Cit9OworCisKKyNlbmRpZiAgLy8gR1RFU1RfU0FNUExFU19TQU1QTEUyX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTE5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHdyaXRlIGEgbW9yZSBjb21wbGV4IHVuaXQgdGVzdCBmb3IgYSBjbGFzcworLy8gdGhhdCBoYXMgbXVsdGlwbGUgbWVtYmVyIGZ1bmN0aW9ucy4KKy8vCisvLyBVc3VhbGx5LCBpdCdzIGEgZ29vZCBpZGVhIHRvIGhhdmUgb25lIHRlc3QgZm9yIGVhY2ggbWV0aG9kIGluIHlvdXIKKy8vIGNsYXNzLiAgWW91IGRvbid0IGhhdmUgdG8gZG8gdGhhdCBleGFjdGx5LCBidXQgaXQgaGVscHMgdG8ga2VlcAorLy8geW91ciB0ZXN0cyBvcmdhbml6ZWQuICBZb3UgbWF5IGFsc28gdGhyb3cgaW4gYWRkaXRpb25hbCB0ZXN0cyBhcworLy8gbmVlZGVkLgorCisjaW5jbHVkZSAic2FtcGxlMi5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEluIHRoaXMgZXhhbXBsZSwgd2UgdGVzdCB0aGUgTXlTdHJpbmcgY2xhc3MgKGEgc2ltcGxlIHN0cmluZykuCisKKy8vIFRlc3RzIHRoZSBkZWZhdWx0IGMndG9yLgorVEVTVChNeVN0cmluZywgRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE15U3RyaW5nIHM7CisKKyAgLy8gQXNzZXJ0cyB0aGF0IHMuY19zdHJpbmcoKSByZXR1cm5zIE5VTEwuCisgIC8vCisgIC8vIDxUZWNobmljYWxEZXRhaWxzPgorICAvLworICAvLyBJZiB3ZSB3cml0ZSBOVUxMIGluc3RlYWQgb2YKKyAgLy8KKyAgLy8gICBzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KE5VTEwpCisgIC8vCisgIC8vIGluIHRoaXMgYXNzZXJ0aW9uLCBpdCB3aWxsIGdlbmVyYXRlIGEgd2FybmluZyBvbiBnY2MgMy40LiAgVGhlCisgIC8vIHJlYXNvbiBpcyB0aGF0IEVYUEVDVF9FUSBuZWVkcyB0byBrbm93IHRoZSB0eXBlcyBvZiBpdHMKKyAgLy8gYXJndW1lbnRzIGluIG9yZGVyIHRvIHByaW50IHRoZW0gd2hlbiBpdCBmYWlscy4gIFNpbmNlIE5VTEwgaXMKKyAgLy8gI2RlZmluZWQgYXMgMCwgdGhlIGNvbXBpbGVyIHdpbGwgdXNlIHRoZSBmb3JtYXR0ZXIgZnVuY3Rpb24gZm9yCisgIC8vIGludCB0byBwcmludCBpdC4gIEhvd2V2ZXIsIGdjYyB0aGlua3MgdGhhdCBOVUxMIHNob3VsZCBiZSB1c2VkIGFzCisgIC8vIGEgcG9pbnRlciwgbm90IGFuIGludCwgYW5kIHRoZXJlZm9yZSBjb21wbGFpbnMuCisgIC8vCisgIC8vIFRoZSByb290IG9mIHRoZSBwcm9ibGVtIGlzIEMrKydzIGxhY2sgb2YgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUKKyAgLy8gaW50ZWdlciBudW1iZXIgMCBhbmQgdGhlIG51bGwgcG9pbnRlciBjb25zdGFudC4gIFVuZm9ydHVuYXRlbHksCisgIC8vIHdlIGhhdmUgdG8gbGl2ZSB3aXRoIHRoaXMgZmFjdC4KKyAgLy8KKyAgLy8gPC9UZWNobmljYWxEZXRhaWxzPgorICBFWFBFQ1RfU1RSRVEoTlVMTCwgcy5jX3N0cmluZygpKTsKKworICBFWFBFQ1RfRVEoMHUsIHMuTGVuZ3RoKCkpOworfQorCitjb25zdCBjaGFyIGtIZWxsb1N0cmluZ1tdID0gIkhlbGxvLCB3b3JsZCEiOworCisvLyBUZXN0cyB0aGUgYyd0b3IgdGhhdCBhY2NlcHRzIGEgQyBzdHJpbmcuCitURVNUKE15U3RyaW5nLCBDb25zdHJ1Y3RvckZyb21DU3RyaW5nKSB7CisgIGNvbnN0IE15U3RyaW5nIHMoa0hlbGxvU3RyaW5nKTsKKyAgRVhQRUNUX0VRKDAsIHN0cmNtcChzLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykpOworICBFWFBFQ1RfRVEoc2l6ZW9mKGtIZWxsb1N0cmluZykvc2l6ZW9mKGtIZWxsb1N0cmluZ1swXSkgLSAxLAorICAgICAgICAgICAgcy5MZW5ndGgoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBjb3B5IGMndG9yLgorVEVTVChNeVN0cmluZywgQ29weUNvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE15U3RyaW5nIHMxKGtIZWxsb1N0cmluZyk7CisgIGNvbnN0IE15U3RyaW5nIHMyID0gczE7CisgIEVYUEVDVF9FUSgwLCBzdHJjbXAoczIuY19zdHJpbmcoKSwga0hlbGxvU3RyaW5nKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBTZXQgbWV0aG9kLgorVEVTVChNeVN0cmluZywgU2V0KSB7CisgIE15U3RyaW5nIHM7CisKKyAgcy5TZXQoa0hlbGxvU3RyaW5nKTsKKyAgRVhQRUNUX0VRKDAsIHN0cmNtcChzLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykpOworCisgIC8vIFNldCBzaG91bGQgd29yayB3aGVuIHRoZSBpbnB1dCBwb2ludGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUKKyAgLy8gYWxyZWFkeSBpbiB0aGUgTXlTdHJpbmcgb2JqZWN0LgorICBzLlNldChzLmNfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoMCwgc3RyY21wKHMuY19zdHJpbmcoKSwga0hlbGxvU3RyaW5nKSk7CisKKyAgLy8gQ2FuIHdlIHNldCB0aGUgTXlTdHJpbmcgdG8gTlVMTD8KKyAgcy5TZXQoTlVMTCk7CisgIEVYUEVDVF9TVFJFUShOVUxMLCBzLmNfc3RyaW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTMtaW5sLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMy1pbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTMwODRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTMtaW5sLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFM19JTkxfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEUzX0lOTF9IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworLy8gUXVldWUgaXMgYSBzaW1wbGUgcXVldWUgaW1wbGVtZW50ZWQgYXMgYSBzaW5nbGVkLWxpbmtlZCBsaXN0LgorLy8KKy8vIFRoZSBlbGVtZW50IHR5cGUgbXVzdCBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4gIC8vIEUgaXMgdGhlIGVsZW1lbnQgdHlwZQorY2xhc3MgUXVldWU7CisKKy8vIFF1ZXVlTm9kZSBpcyBhIG5vZGUgaW4gYSBRdWV1ZSwgd2hpY2ggY29uc2lzdHMgb2YgYW4gZWxlbWVudCBvZgorLy8gdHlwZSBFIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPiAgLy8gRSBpcyB0aGUgZWxlbWVudCB0eXBlCitjbGFzcyBRdWV1ZU5vZGUgeworICBmcmllbmQgY2xhc3MgUXVldWU8RT47CisKKyBwdWJsaWM6CisgIC8vIEdldHMgdGhlIGVsZW1lbnQgaW4gdGhpcyBub2RlLgorICBjb25zdCBFJiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZWxlbWVudF87IH0KKworICAvLyBHZXRzIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHF1ZXVlLgorICBRdWV1ZU5vZGUqIG5leHQoKSB7IHJldHVybiBuZXh0XzsgfQorICBjb25zdCBRdWV1ZU5vZGUqIG5leHQoKSBjb25zdCB7IHJldHVybiBuZXh0XzsgfQorCisgcHJpdmF0ZToKKyAgLy8gQ3JlYXRlcyBhIG5vZGUgd2l0aCBhIGdpdmVuIGVsZW1lbnQgdmFsdWUuICBUaGUgbmV4dCBwb2ludGVyIGlzCisgIC8vIHNldCB0byBOVUxMLgorICBleHBsaWNpdCBRdWV1ZU5vZGUoY29uc3QgRSYgYW5fZWxlbWVudCkgOiBlbGVtZW50Xyhhbl9lbGVtZW50KSwgbmV4dF8oTlVMTCkge30KKworICAvLyBXZSBkaXNhYmxlIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgb3BlcmF0b3IgYW5kIGNvcHkgYyd0b3IuCisgIGNvbnN0IFF1ZXVlTm9kZSYgb3BlcmF0b3IgPSAoY29uc3QgUXVldWVOb2RlJik7CisgIFF1ZXVlTm9kZShjb25zdCBRdWV1ZU5vZGUmKTsKKworICBFIGVsZW1lbnRfOworICBRdWV1ZU5vZGUqIG5leHRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEU+ICAvLyBFIGlzIHRoZSBlbGVtZW50IHR5cGUuCitjbGFzcyBRdWV1ZSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGFuIGVtcHR5IHF1ZXVlLgorICBRdWV1ZSgpIDogaGVhZF8oTlVMTCksIGxhc3RfKE5VTEwpLCBzaXplXygwKSB7fQorCisgIC8vIEQndG9yLiAgQ2xlYXJzIHRoZSBxdWV1ZS4KKyAgflF1ZXVlKCkgeyBDbGVhcigpOyB9CisKKyAgLy8gQ2xlYXJzIHRoZSBxdWV1ZS4KKyAgdm9pZCBDbGVhcigpIHsKKyAgICBpZiAoc2l6ZV8gPiAwKSB7CisgICAgICAvLyAxLiBEZWxldGVzIGV2ZXJ5IG5vZGUuCisgICAgICBRdWV1ZU5vZGU8RT4qIG5vZGUgPSBoZWFkXzsKKyAgICAgIFF1ZXVlTm9kZTxFPiogbmV4dCA9IG5vZGUtPm5leHQoKTsKKyAgICAgIGZvciAoOyA7KSB7CisgICAgICAgIGRlbGV0ZSBub2RlOworICAgICAgICBub2RlID0gbmV4dDsKKyAgICAgICAgaWYgKG5vZGUgPT0gTlVMTCkgYnJlYWs7CisgICAgICAgIG5leHQgPSBub2RlLT5uZXh0KCk7CisgICAgICB9CisKKyAgICAgIC8vIDIuIFJlc2V0cyB0aGUgbWVtYmVyIHZhcmlhYmxlcy4KKyAgICAgIGhlYWRfID0gbGFzdF8gPSBOVUxMOworICAgICAgc2l6ZV8gPSAwOworICAgIH0KKyAgfQorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KKyAgc2l6ZV90IFNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorCisgIC8vIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHF1ZXVlLCBvciBOVUxMIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgUXVldWVOb2RlPEU+KiBIZWFkKCkgeyByZXR1cm4gaGVhZF87IH0KKyAgY29uc3QgUXVldWVOb2RlPEU+KiBIZWFkKCkgY29uc3QgeyByZXR1cm4gaGVhZF87IH0KKworICAvLyBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHF1ZXVlLCBvciBOVUxMIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgUXVldWVOb2RlPEU+KiBMYXN0KCkgeyByZXR1cm4gbGFzdF87IH0KKyAgY29uc3QgUXVldWVOb2RlPEU+KiBMYXN0KCkgY29uc3QgeyByZXR1cm4gbGFzdF87IH0KKworICAvLyBBZGRzIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuICBBIGNvcHkgb2YgdGhlIGVsZW1lbnQgaXMKKyAgLy8gY3JlYXRlZCB1c2luZyB0aGUgY29weSBjb25zdHJ1Y3RvciwgYW5kIHRoZW4gc3RvcmVkIGluIHRoZSBxdWV1ZS4KKyAgLy8gQ2hhbmdlcyBtYWRlIHRvIHRoZSBlbGVtZW50IGluIHRoZSBxdWV1ZSBkb2Vzbid0IGFmZmVjdCB0aGUgc291cmNlCisgIC8vIG9iamVjdCwgYW5kIHZpY2UgdmVyc2EuCisgIHZvaWQgRW5xdWV1ZShjb25zdCBFJiBlbGVtZW50KSB7CisgICAgUXVldWVOb2RlPEU+KiBuZXdfbm9kZSA9IG5ldyBRdWV1ZU5vZGU8RT4oZWxlbWVudCk7CisKKyAgICBpZiAoc2l6ZV8gPT0gMCkgeworICAgICAgaGVhZF8gPSBsYXN0XyA9IG5ld19ub2RlOworICAgICAgc2l6ZV8gPSAxOworICAgIH0gZWxzZSB7CisgICAgICBsYXN0Xy0+bmV4dF8gPSBuZXdfbm9kZTsKKyAgICAgIGxhc3RfID0gbmV3X25vZGU7CisgICAgICBzaXplXysrOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZXMgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGFuZCByZXR1cm5zIGl0LiAgUmV0dXJucyBOVUxMIGlmCisgIC8vIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgRSogRGVxdWV1ZSgpIHsKKyAgICBpZiAoc2l6ZV8gPT0gMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgUXVldWVOb2RlPEU+KiBjb25zdCBvbGRfaGVhZCA9IGhlYWRfOworICAgIGhlYWRfID0gaGVhZF8tPm5leHRfOworICAgIHNpemVfLS07CisgICAgaWYgKHNpemVfID09IDApIHsKKyAgICAgIGxhc3RfID0gTlVMTDsKKyAgICB9CisKKyAgICBFKiBlbGVtZW50ID0gbmV3IEUob2xkX2hlYWQtPmVsZW1lbnQoKSk7CisgICAgZGVsZXRlIG9sZF9oZWFkOworCisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0KKworICAvLyBBcHBsaWVzIGEgZnVuY3Rpb24vZnVuY3RvciBvbiBlYWNoIGVsZW1lbnQgb2YgdGhlIHF1ZXVlLCBhbmQKKyAgLy8gcmV0dXJucyB0aGUgcmVzdWx0IGluIGEgbmV3IHF1ZXVlLiAgVGhlIG9yaWdpbmFsIHF1ZXVlIGlzIG5vdAorICAvLyBhZmZlY3RlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgIFF1ZXVlKiBNYXAoRiBmdW5jdGlvbikgY29uc3QgeworICAgIFF1ZXVlKiBuZXdfcXVldWUgPSBuZXcgUXVldWUoKTsKKyAgICBmb3IgKGNvbnN0IFF1ZXVlTm9kZTxFPiogbm9kZSA9IGhlYWRfOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0XykgeworICAgICAgbmV3X3F1ZXVlLT5FbnF1ZXVlKGZ1bmN0aW9uKG5vZGUtPmVsZW1lbnQoKSkpOworICAgIH0KKworICAgIHJldHVybiBuZXdfcXVldWU7CisgIH0KKworIHByaXZhdGU6CisgIFF1ZXVlTm9kZTxFPiogaGVhZF87ICAvLyBUaGUgZmlyc3Qgbm9kZSBvZiB0aGUgcXVldWUuCisgIFF1ZXVlTm9kZTxFPiogbGFzdF87ICAvLyBUaGUgbGFzdCBub2RlIG9mIHRoZSBxdWV1ZS4KKyAgc2l6ZV90IHNpemVfOyAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUuCisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBhIHF1ZXVlLgorICBRdWV1ZShjb25zdCBRdWV1ZSYpOworICBjb25zdCBRdWV1ZSYgb3BlcmF0b3IgPSAoY29uc3QgUXVldWUmKTsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfU0FNUExFU19TQU1QTEUzX0lOTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlM191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjM4NzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTEgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisKKy8vIEluIHRoaXMgZXhhbXBsZSwgd2UgdXNlIGEgbW9yZSBhZHZhbmNlZCBmZWF0dXJlIG9mIEdvb2dsZSBUZXN0IGNhbGxlZAorLy8gdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgdGVzdCBmaXh0dXJlIGlzIGEgcGxhY2UgdG8gaG9sZCBvYmplY3RzIGFuZCBmdW5jdGlvbnMgc2hhcmVkIGJ5CisvLyBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UuICBVc2luZyBhIHRlc3QgZml4dHVyZSBhdm9pZHMgZHVwbGljYXRpbmcKKy8vIHRoZSB0ZXN0IGNvZGUgbmVjZXNzYXJ5IHRvIGluaXRpYWxpemUgYW5kIGNsZWFudXAgdGhvc2UgY29tbW9uCisvLyBvYmplY3RzIGZvciBlYWNoIHRlc3QuICBJdCBpcyBhbHNvIHVzZWZ1bCBmb3IgZGVmaW5pbmcgc3ViLXJvdXRpbmVzCisvLyB0aGF0IHlvdXIgdGVzdHMgbmVlZCB0byBpbnZva2UgYSBsb3QuCisvLworLy8gPFRlY2huaWNhbERldGFpbHM+CisvLworLy8gVGhlIHRlc3RzIHNoYXJlIHRoZSB0ZXN0IGZpeHR1cmUgaW4gdGhlIHNlbnNlIG9mIGNvZGUgc2hhcmluZywgbm90CisvLyBkYXRhIHNoYXJpbmcuICBFYWNoIHRlc3QgaXMgZ2l2ZW4gaXRzIG93biBmcmVzaCBjb3B5IG9mIHRoZQorLy8gZml4dHVyZS4gIFlvdSBjYW5ub3QgZXhwZWN0IHRoZSBkYXRhIG1vZGlmaWVkIGJ5IG9uZSB0ZXN0IHRvIGJlCisvLyBwYXNzZWQgb24gdG8gYW5vdGhlciB0ZXN0LCB3aGljaCBpcyBhIGJhZCBpZGVhLgorLy8KKy8vIFRoZSByZWFzb24gZm9yIHRoaXMgZGVzaWduIGlzIHRoYXQgdGVzdHMgc2hvdWxkIGJlIGluZGVwZW5kZW50IGFuZAorLy8gcmVwZWF0YWJsZS4gIEluIHBhcnRpY3VsYXIsIGEgdGVzdCBzaG91bGQgbm90IGZhaWwgYXMgdGhlIHJlc3VsdCBvZgorLy8gYW5vdGhlciB0ZXN0J3MgZmFpbHVyZS4gIElmIG9uZSB0ZXN0IGRlcGVuZHMgb24gaW5mbyBwcm9kdWNlZCBieQorLy8gYW5vdGhlciB0ZXN0LCB0aGVuIHRoZSB0d28gdGVzdHMgc2hvdWxkIHJlYWxseSBiZSBvbmUgYmlnIHRlc3QuCisvLworLy8gVGhlIG1hY3JvcyBmb3IgaW5kaWNhdGluZyB0aGUgc3VjY2Vzcy9mYWlsdXJlIG9mIGEgdGVzdAorLy8gKEVYUEVDVF9UUlVFLCBGQUlMLCBldGMpIG5lZWQgdG8ga25vdyB3aGF0IHRoZSBjdXJyZW50IHRlc3QgaXMKKy8vICh3aGVuIEdvb2dsZSBUZXN0IHByaW50cyB0aGUgdGVzdCByZXN1bHQsIGl0IHRlbGxzIHlvdSB3aGljaCB0ZXN0CisvLyBlYWNoIGZhaWx1cmUgYmVsb25ncyB0bykuICBUZWNobmljYWxseSwgdGhlc2UgbWFjcm9zIGludm9rZSBhCisvLyBtZW1iZXIgZnVuY3Rpb24gb2YgdGhlIFRlc3QgY2xhc3MuICBUaGVyZWZvcmUsIHlvdSBjYW5ub3QgdXNlIHRoZW0KKy8vIGluIGEgZ2xvYmFsIGZ1bmN0aW9uLiAgVGhhdCdzIHdoeSB5b3Ugc2hvdWxkIHB1dCB0ZXN0IHN1Yi1yb3V0aW5lcworLy8gaW4gYSB0ZXN0IGZpeHR1cmUuCisvLworLy8gPC9UZWNobmljYWxEZXRhaWxzPgorCisjaW5jbHVkZSAic2FtcGxlMy1pbmwuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBUbyB1c2UgYSB0ZXN0IGZpeHR1cmUsIGRlcml2ZSBhIGNsYXNzIGZyb20gdGVzdGluZzo6VGVzdC4KK2NsYXNzIFF1ZXVlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6ICAvLyBZb3Ugc2hvdWxkIG1ha2UgdGhlIG1lbWJlcnMgcHJvdGVjdGVkIHMudC4gdGhleSBjYW4gYmUKKyAgICAgICAgICAgICAvLyBhY2Nlc3NlZCBmcm9tIHN1Yi1jbGFzc2VzLgorCisgIC8vIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBlYWNoIHRlc3QgaXMgcnVuLiAgWW91CisgIC8vIHNob3VsZCBkZWZpbmUgaXQgaWYgeW91IG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdmFyYWlibGVzLgorICAvLyBPdGhlcndpc2UsIHRoaXMgY2FuIGJlIHNraXBwZWQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBxMV8uRW5xdWV1ZSgxKTsKKyAgICBxMl8uRW5xdWV1ZSgyKTsKKyAgICBxMl8uRW5xdWV1ZSgzKTsKKyAgfQorCisgIC8vIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGVhY2ggdGVzdCBpcyBydW4uCisgIC8vIFlvdSBzaG91bGQgZGVmaW5lIGl0IGlmIHRoZXJlIGlzIGNsZWFudXAgd29yayB0byBkby4gIE90aGVyd2lzZSwKKyAgLy8geW91IGRvbid0IGhhdmUgdG8gcHJvdmlkZSBpdC4KKyAgLy8KKyAgLy8gdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAvLyB9CisKKyAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBzb21lIHRlc3QgdXNlcy4KKyAgc3RhdGljIGludCBEb3VibGUoaW50IG4pIHsKKyAgICByZXR1cm4gMipuOworICB9CisKKyAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRlc3RpbmcgUXVldWU6Ok1hcCgpLgorICB2b2lkIE1hcFRlc3Rlcihjb25zdCBRdWV1ZTxpbnQ+ICogcSkgeworICAgIC8vIENyZWF0ZXMgYSBuZXcgcXVldWUsIHdoZXJlIGVhY2ggZWxlbWVudCBpcyB0d2ljZSBhcyBiaWcgYXMgdGhlCisgICAgLy8gY29ycmVzcG9uZGluZyBvbmUgaW4gcS4KKyAgICBjb25zdCBRdWV1ZTxpbnQ+ICogY29uc3QgbmV3X3EgPSBxLT5NYXAoRG91YmxlKTsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIG5ldyBxdWV1ZSBoYXMgdGhlIHNhbWUgc2l6ZSBhcyBxLgorICAgIEFTU0VSVF9FUShxLT5TaXplKCksIG5ld19xLT5TaXplKCkpOworCisgICAgLy8gVmVyaWZpZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBlbGVtZW50cyBvZiB0aGUgdHdvIHF1ZXVlcy4KKyAgICBmb3IgKCBjb25zdCBRdWV1ZU5vZGU8aW50PiAqIG4xID0gcS0+SGVhZCgpLCAqIG4yID0gbmV3X3EtPkhlYWQoKTsKKyAgICAgICAgICBuMSAhPSBOVUxMOyBuMSA9IG4xLT5uZXh0KCksIG4yID0gbjItPm5leHQoKSApIHsKKyAgICAgIEVYUEVDVF9FUSgyICogbjEtPmVsZW1lbnQoKSwgbjItPmVsZW1lbnQoKSk7CisgICAgfQorCisgICAgZGVsZXRlIG5ld19xOworICB9CisKKyAgLy8gRGVjbGFyZXMgdGhlIHZhcmlhYmxlcyB5b3VyIHRlc3RzIHdhbnQgdG8gdXNlLgorICBRdWV1ZTxpbnQ+IHEwXzsKKyAgUXVldWU8aW50PiBxMV87CisgIFF1ZXVlPGludD4gcTJfOworfTsKKworLy8gV2hlbiB5b3UgaGF2ZSBhIHRlc3QgZml4dHVyZSwgeW91IGRlZmluZSBhIHRlc3QgdXNpbmcgVEVTVF9GCisvLyBpbnN0ZWFkIG9mIFRFU1QuCisKKy8vIFRlc3RzIHRoZSBkZWZhdWx0IGMndG9yLgorVEVTVF9GKFF1ZXVlVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgIC8vIFlvdSBjYW4gYWNjZXNzIGRhdGEgaW4gdGhlIHRlc3QgZml4dHVyZSBoZXJlLgorICBFWFBFQ1RfRVEoMHUsIHEwXy5TaXplKCkpOworfQorCisvLyBUZXN0cyBEZXF1ZXVlKCkuCitURVNUX0YoUXVldWVUZXN0LCBEZXF1ZXVlKSB7CisgIGludCAqIG4gPSBxMF8uRGVxdWV1ZSgpOworICBFWFBFQ1RfVFJVRShuID09IE5VTEwpOworCisgIG4gPSBxMV8uRGVxdWV1ZSgpOworICBBU1NFUlRfVFJVRShuICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMSwgKm4pOworICBFWFBFQ1RfRVEoMHUsIHExXy5TaXplKCkpOworICBkZWxldGUgbjsKKworICBuID0gcTJfLkRlcXVldWUoKTsKKyAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDIsICpuKTsKKyAgRVhQRUNUX0VRKDF1LCBxMl8uU2l6ZSgpKTsKKyAgZGVsZXRlIG47Cit9CisKKy8vIFRlc3RzIHRoZSBRdWV1ZTo6TWFwKCkgZnVuY3Rpb24uCitURVNUX0YoUXVldWVUZXN0LCBNYXApIHsKKyAgTWFwVGVzdGVyKCZxMF8pOworICBNYXBUZXN0ZXIoJnExXyk7CisgIE1hcFRlc3RlcigmcTJfKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NGJkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU0LmNjCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInNhbXBsZTQuaCIKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLCBhbmQgaW5jcmVtZW50cyBpdC4KK2ludCBDb3VudGVyOjpJbmNyZW1lbnQoKSB7CisgIHJldHVybiBjb3VudGVyXysrOworfQorCisvLyBQcmludHMgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSB0byBTVERPVVQuCit2b2lkIENvdW50ZXI6OlByaW50KCkgY29uc3QgeworICBwcmludGYoIiVkIiwgY291bnRlcl8pOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTQuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MGYwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU0LmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfU0FNUExFU19TQU1QTEU0X0hfCisjZGVmaW5lIEdURVNUX1NBTVBMRVNfU0FNUExFNF9IXworCisvLyBBIHNpbXBsZSBtb25vdG9uaWMgY291bnRlci4KK2NsYXNzIENvdW50ZXIgeworIHByaXZhdGU6CisgIGludCBjb3VudGVyXzsKKworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIGNvdW50ZXIgdGhhdCBzdGFydHMgYXQgMC4KKyAgQ291bnRlcigpIDogY291bnRlcl8oMCkge30KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUsIGFuZCBpbmNyZW1lbnRzIGl0LgorICBpbnQgSW5jcmVtZW50KCk7CisKKyAgLy8gUHJpbnRzIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgdG8gU1RET1VULgorICB2b2lkIFByaW50KCkgY29uc3Q7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFNF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVhZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAic2FtcGxlNC5oIgorCisvLyBUZXN0cyB0aGUgSW5jcmVtZW50KCkgbWV0aG9kLgorVEVTVChDb3VudGVyLCBJbmNyZW1lbnQpIHsKKyAgQ291bnRlciBjOworCisgIC8vIEVYUEVDVF9FUSgpIGV2YWx1YXRlcyBpdHMgYXJndW1lbnRzIGV4YWN0bHkgb25jZSwgc28gdGhleQorICAvLyBjYW4gaGF2ZSBzaWRlIGVmZmVjdHMuCisKKyAgRVhQRUNUX0VRKDAsIGMuSW5jcmVtZW50KCkpOworICBFWFBFQ1RfRVEoMSwgYy5JbmNyZW1lbnQoKSk7CisgIEVYUEVDVF9FUSgyLCBjLkluY3JlbWVudCgpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTVfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkOGU1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTk5IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUaGlzIHNhbXBsZSB0ZWFjaGVzIGhvdyB0byByZXVzZSBhIHRlc3QgZml4dHVyZSBpbiBtdWx0aXBsZSB0ZXN0CisvLyBjYXNlcyBieSBkZXJpdmluZyBzdWItZml4dHVyZXMgZnJvbSBpdC4KKy8vCisvLyBXaGVuIHlvdSBkZWZpbmUgYSB0ZXN0IGZpeHR1cmUsIHlvdSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSB0ZXN0CisvLyBjYXNlIHRoYXQgd2lsbCB1c2UgdGhpcyBmaXh0dXJlLiAgVGhlcmVmb3JlLCBhIHRlc3QgZml4dHVyZSBjYW4KKy8vIGJlIHVzZWQgYnkgb25seSBvbmUgdGVzdCBjYXNlLgorLy8KKy8vIFNvbWV0aW1lcywgbW9yZSB0aGFuIG9uZSB0ZXN0IGNhc2VzIG1heSB3YW50IHRvIHVzZSB0aGUgc2FtZSBvcgorLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRlc3QgZml4dHVyZXMuICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvCisvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGVzdHMgZm9yIGEgR1VJIGxpYnJhcnkgZG9uJ3QgbGVhayBpbXBvcnRhbnQKKy8vIHN5c3RlbSByZXNvdXJjZXMgbGlrZSBmb250cyBhbmQgYnJ1c2hlcy4gIEluIEdvb2dsZSBUZXN0LCB5b3UgZG8KKy8vIHRoaXMgYnkgcHV0dGluZyB0aGUgc2hhcmVkIGxvZ2ljIGluIGEgc3VwZXIgKGFzIGluICJzdXBlciBjbGFzcyIpCisvLyB0ZXN0IGZpeHR1cmUsIGFuZCB0aGVuIGhhdmUgZWFjaCB0ZXN0IGNhc2UgdXNlIGEgZml4dHVyZSBkZXJpdmVkCisvLyBmcm9tIHRoaXMgc3VwZXIgZml4dHVyZS4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJzYW1wbGUzLWlubC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAic2FtcGxlMS5oIgorCisvLyBJbiB0aGlzIHNhbXBsZSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCBldmVyeSB0ZXN0IGZpbmlzaGVzIHdpdGhpbgorLy8gfjUgc2Vjb25kcy4gIElmIGEgdGVzdCB0YWtlcyBsb25nZXIgdG8gcnVuLCB3ZSBjb25zaWRlciBpdCBhCisvLyBmYWlsdXJlLgorLy8KKy8vIFdlIHB1dCB0aGUgY29kZSBmb3IgdGltaW5nIGEgdGVzdCBpbiBhIHRlc3QgZml4dHVyZSBjYWxsZWQKKy8vICJRdWlja1Rlc3QiLiAgUXVpY2tUZXN0IGlzIGludGVuZGVkIHRvIGJlIHRoZSBzdXBlciBmaXh0dXJlIHRoYXQKKy8vIG90aGVyIGZpeHR1cmVzIGRlcml2ZSBmcm9tLCB0aGVyZWZvcmUgdGhlcmUgaXMgbm8gdGVzdCBjYXNlIHdpdGgKKy8vIHRoZSBuYW1lICJRdWlja1Rlc3QiLiAgVGhpcyBpcyBPSy4KKy8vCisvLyBMYXRlciwgd2Ugd2lsbCBkZXJpdmUgbXVsdGlwbGUgdGVzdCBmaXh0dXJlcyBmcm9tIFF1aWNrVGVzdC4KK2NsYXNzIFF1aWNrVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFJlbWVtYmVyIHRoYXQgU2V0VXAoKSBpcyBydW4gaW1tZWRpYXRlbHkgYmVmb3JlIGEgdGVzdCBzdGFydHMuCisgIC8vIFRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIHJlY29yZCB0aGUgc3RhcnQgdGltZS4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHN0YXJ0X3RpbWVfID0gdGltZShOVUxMKTsKKyAgfQorCisgIC8vIFRlYXJEb3duKCkgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciBhIHRlc3QgZmluaXNoZXMuICBIZXJlIHdlCisgIC8vIGNoZWNrIGlmIHRoZSB0ZXN0IHdhcyB0b28gc2xvdy4KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIEdldHMgdGhlIHRpbWUgd2hlbiB0aGUgdGVzdCBmaW5pc2hlcworICAgIGNvbnN0IHRpbWVfdCBlbmRfdGltZSA9IHRpbWUoTlVMTCk7CisKKyAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIHRlc3QgdG9vayBubyBtb3JlIHRoYW4gfjUgc2Vjb25kcy4gIERpZCB5b3UKKyAgICAvLyBrbm93IHRoYXQgeW91IGNhbiB1c2UgYXNzZXJ0aW9ucyBpbiBTZXRVcCgpIGFuZCBUZWFyRG93bigpIGFzCisgICAgLy8gd2VsbD8KKyAgICBFWFBFQ1RfVFJVRShlbmRfdGltZSAtIHN0YXJ0X3RpbWVfIDw9IDUpIDw8ICJUaGUgdGVzdCB0b29rIHRvbyBsb25nLiI7CisgIH0KKworICAvLyBUaGUgVVRDIHRpbWUgKGluIHNlY29uZHMpIHdoZW4gdGhlIHRlc3Qgc3RhcnRzCisgIHRpbWVfdCBzdGFydF90aW1lXzsKK307CisKKworLy8gV2UgZGVyaXZlIGEgZml4dHVyZSBuYW1lZCBJbnRlZ2VyRnVuY3Rpb25UZXN0IGZyb20gdGhlIFF1aWNrVGVzdAorLy8gZml4dHVyZS4gIEFsbCB0ZXN0cyB1c2luZyB0aGlzIGZpeHR1cmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisvLyByZXF1aXJlZCB0byBiZSBxdWljay4KK2NsYXNzIEludGVnZXJGdW5jdGlvblRlc3QgOiBwdWJsaWMgUXVpY2tUZXN0IHsKKyAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgbW9yZSBsb2dpYyB0aGFuIGFscmVhZHkgaW4gdGhlIFF1aWNrVGVzdCBmaXh0dXJlLgorICAvLyBUaGVyZWZvcmUgdGhlIGJvZHkgaXMgZW1wdHkuCit9OworCisKKy8vIE5vdyB3ZSBjYW4gd3JpdGUgdGVzdHMgaW4gdGhlIEludGVnZXJGdW5jdGlvblRlc3QgdGVzdCBjYXNlLgorCisvLyBUZXN0cyBGYWN0b3JpYWwoKQorVEVTVF9GKEludGVnZXJGdW5jdGlvblRlc3QsIEZhY3RvcmlhbCkgeworICAvLyBUZXN0cyBmYWN0b3JpYWwgb2YgbmVnYXRpdmUgbnVtYmVycy4KKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgtNSkpOworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKC0xKSk7CisgIEVYUEVDVF9HVChGYWN0b3JpYWwoLTEwKSwgMCk7CisKKyAgLy8gVGVzdHMgZmFjdG9yaWFsIG9mIDAuCisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMCkpOworCisgIC8vIFRlc3RzIGZhY3RvcmlhbCBvZiBwb3NpdGl2ZSBudW1iZXJzLgorICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDEpKTsKKyAgRVhQRUNUX0VRKDIsIEZhY3RvcmlhbCgyKSk7CisgIEVYUEVDVF9FUSg2LCBGYWN0b3JpYWwoMykpOworICBFWFBFQ1RfRVEoNDAzMjAsIEZhY3RvcmlhbCg4KSk7Cit9CisKKworLy8gVGVzdHMgSXNQcmltZSgpCitURVNUX0YoSW50ZWdlckZ1bmN0aW9uVGVzdCwgSXNQcmltZSkgeworICAvLyBUZXN0cyBuZWdhdGl2ZSBpbnB1dC4KKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoLTEpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoLTIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoSU5UX01JTikpOworCisgIC8vIFRlc3RzIHNvbWUgdHJpdmlhbCBjYXNlcy4KKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgxKSk7CisgIEVYUEVDVF9UUlVFKElzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDMpKTsKKworICAvLyBUZXN0cyBwb3NpdGl2ZSBpbnB1dC4KKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoNCkpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDUpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoNikpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDIzKSk7Cit9CisKKworLy8gVGhlIG5leHQgdGVzdCBjYXNlIChuYW1lZCAiUXVldWVUZXN0IikgYWxzbyBuZWVkcyB0byBiZSBxdWljaywgc28KKy8vIHdlIGRlcml2ZSBhbm90aGVyIGZpeHR1cmUgZnJvbSBRdWlja1Rlc3QuCisvLworLy8gVGhlIFF1ZXVlVGVzdCB0ZXN0IGZpeHR1cmUgaGFzIHNvbWUgbG9naWMgYW5kIHNoYXJlZCBvYmplY3RzIGluCisvLyBhZGRpdGlvbiB0byB3aGF0J3MgaW4gUXVpY2tUZXN0IGFscmVhZHkuICBXZSBkZWZpbmUgdGhlIGFkZGl0aW9uYWwKKy8vIHN0dWZmIGluc2lkZSB0aGUgYm9keSBvZiB0aGUgdGVzdCBmaXh0dXJlLCBhcyB1c3VhbC4KK2NsYXNzIFF1ZXVlVGVzdCA6IHB1YmxpYyBRdWlja1Rlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIHNldCB1cCB0aGUgc3VwZXIgZml4dHVyZSAoUXVpY2tUZXN0KS4KKyAgICBRdWlja1Rlc3Q6OlNldFVwKCk7CisKKyAgICAvLyBTZWNvbmQsIHNvbWUgYWRkaXRpb25hbCBzZXR1cCBmb3IgdGhpcyBmaXh0dXJlLgorICAgIHExXy5FbnF1ZXVlKDEpOworICAgIHEyXy5FbnF1ZXVlKDIpOworICAgIHEyXy5FbnF1ZXVlKDMpOworICB9CisKKyAgLy8gQnkgZGVmYXVsdCwgVGVhckRvd24oKSBpbmhlcml0cyB0aGUgYmVoYXZpb3Igb2YKKyAgLy8gUXVpY2tUZXN0OjpUZWFyRG93bigpLiAgQXMgd2UgaGF2ZSBubyBhZGRpdGlvbmFsIGNsZWFuaW5nIHdvcmsKKyAgLy8gZm9yIFF1ZXVlVGVzdCwgd2Ugb21pdCBpdCBoZXJlLgorICAvLworICAvLyB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgIC8vICAgUXVpY2tUZXN0OjpUZWFyRG93bigpOworICAvLyB9CisKKyAgUXVldWU8aW50PiBxMF87CisgIFF1ZXVlPGludD4gcTFfOworICBRdWV1ZTxpbnQ+IHEyXzsKK307CisKKworLy8gTm93LCBsZXQncyB3cml0ZSB0ZXN0cyB1c2luZyB0aGUgUXVldWVUZXN0IGZpeHR1cmUuCisKKy8vIFRlc3RzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorVEVTVF9GKFF1ZXVlVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgIEVYUEVDVF9FUSgwdSwgcTBfLlNpemUoKSk7Cit9CisKKy8vIFRlc3RzIERlcXVldWUoKS4KK1RFU1RfRihRdWV1ZVRlc3QsIERlcXVldWUpIHsKKyAgaW50KiBuID0gcTBfLkRlcXVldWUoKTsKKyAgRVhQRUNUX1RSVUUobiA9PSBOVUxMKTsKKworICBuID0gcTFfLkRlcXVldWUoKTsKKyAgRVhQRUNUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDEsICpuKTsKKyAgRVhQRUNUX0VRKDB1LCBxMV8uU2l6ZSgpKTsKKyAgZGVsZXRlIG47CisKKyAgbiA9IHEyXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgyLCAqbik7CisgIEVYUEVDVF9FUSgxdSwgcTJfLlNpemUoKSk7CisgIGRlbGV0ZSBuOworfQorCisvLyBJZiBuZWNlc3NhcnksIHlvdSBjYW4gZGVyaXZlIGZ1cnRoZXIgdGVzdCBmaXh0dXJlcyBmcm9tIGEgZGVyaXZlZAorLy8gZml4dHVyZSBpdHNlbGYuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkZXJpdmUgYW5vdGhlciBmaXh0dXJlIGZyb20KKy8vIFF1ZXVlVGVzdC4gIEdvb2dsZSBUZXN0IGltcG9zZXMgbm8gbGltaXQgb24gaG93IGRlZXAgdGhlIGhpZXJhcmNoeQorLy8gY2FuIGJlLiAgSW4gcHJhY3RpY2UsIGhvd2V2ZXIsIHlvdSBwcm9iYWJseSBkb24ndCB3YW50IGl0IHRvIGJlIHRvbworLy8gZGVlcCBhcyB0byBiZSBjb25mdXNpbmcuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjAzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDIyNCBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdGVzdCBjb21tb24gcHJvcGVydGllcyBvZiBtdWx0aXBsZQorLy8gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzYW1lIGludGVyZmFjZSAoYWthIGludGVyZmFjZSB0ZXN0cykuCisKKy8vIFRoZSBpbnRlcmZhY2UgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIHRoaXMgaGVhZGVyLgorI2luY2x1ZGUgInByaW1lX3RhYmxlcy5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gRmlyc3QsIHdlIGRlZmluZSBzb21lIGZhY3RvcnkgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YKKy8vIHRoZSBpbXBsZW1lbnRhdGlvbnMuICBZb3UgbWF5IGJlIGFibGUgdG8gc2tpcCB0aGlzIHN0ZXAgaWYgYWxsIHlvdXIKKy8vIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgY29uc3RydWN0ZWQgdGhlIHNhbWUgd2F5LgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1ByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGUoKTsKKwordGVtcGxhdGUgPD4KK1ByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGU8T25UaGVGbHlQcmltZVRhYmxlPigpIHsKKyAgcmV0dXJuIG5ldyBPblRoZUZseVByaW1lVGFibGU7Cit9CisKK3RlbXBsYXRlIDw+CitQcmltZVRhYmxlKiBDcmVhdGVQcmltZVRhYmxlPFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlPigpIHsKKyAgcmV0dXJuIG5ldyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSgxMDAwMCk7Cit9CisKKy8vIFRoZW4gd2UgZGVmaW5lIGEgdGVzdCBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLgordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBQcmltZVRhYmxlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFRoZSBjdG9yIGNhbGxzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHByaW1lIHRhYmxlCisgIC8vIGltcGxlbWVudGVkIGJ5IFQuCisgIFByaW1lVGFibGVUZXN0KCkgOiB0YWJsZV8oQ3JlYXRlUHJpbWVUYWJsZTxUPigpKSB7fQorCisgIHZpcnR1YWwgflByaW1lVGFibGVUZXN0KCkgeyBkZWxldGUgdGFibGVfOyB9CisKKyAgLy8gTm90ZSB0aGF0IHdlIHRlc3QgYW4gaW1wbGVtZW50YXRpb24gdmlhIHRoZSBiYXNlIGludGVyZmFjZQorICAvLyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gY2xhc3MuICBUaGlzIGlzIGltcG9ydGFudAorICAvLyBmb3Iga2VlcGluZyB0aGUgdGVzdHMgY2xvc2UgdG8gdGhlIHJlYWwgd29ybGQgc2NlbmFyaW8sIHdoZXJlIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBpcyBpbnZva2VkIHZpYSB0aGUgYmFzZSBpbnRlcmZhY2UuICBJdCBhdm9pZHMKKyAgLy8gZ290LXlhcyB3aGVyZSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgaGFzIGEgbWV0aG9kIHRoYXQgc2hhZG93cworICAvLyBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgKGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQgYXJndW1lbnQKKyAgLy8gdHlwZXMpIGluIHRoZSBiYXNlIGludGVyZmFjZSwgZm9yIGV4YW1wbGUuCisgIFByaW1lVGFibGUqIGNvbnN0IHRhYmxlXzsKK307CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCit1c2luZyB0ZXN0aW5nOjpUeXBlczsKKworLy8gR29vZ2xlIFRlc3Qgb2ZmZXJzIHR3byB3YXlzIGZvciByZXVzaW5nIHRlc3RzIGZvciBkaWZmZXJlbnQgdHlwZXMuCisvLyBUaGUgZmlyc3QgaXMgY2FsbGVkICJ0eXBlZCB0ZXN0cyIuICBZb3Ugc2hvdWxkIHVzZSBpdCBpZiB5b3UKKy8vIGFscmVhZHkga25vdyAqYWxsKiB0aGUgdHlwZXMgeW91IGFyZSBnb25uYSBleGVyY2lzZSB3aGVuIHlvdSB3cml0ZQorLy8gdGhlIHRlc3RzLgorCisvLyBUbyB3cml0ZSBhIHR5cGVkIHRlc3QgY2FzZSwgZmlyc3QgdXNlCisvLworLy8gICBUWVBFRF9URVNUX0NBU0UoVGVzdENhc2VOYW1lLCBUeXBlTGlzdCk7CisvLworLy8gdG8gZGVjbGFyZSBpdCBhbmQgc3BlY2lmeSB0aGUgdHlwZSBwYXJhbWV0ZXJzLiAgQXMgd2l0aCBURVNUX0YsCisvLyBUZXN0Q2FzZU5hbWUgbXVzdCBtYXRjaCB0aGUgdGVzdCBmaXh0dXJlIG5hbWUuCisKKy8vIFRoZSBsaXN0IG9mIHR5cGVzIHdlIHdhbnQgdG8gdGVzdC4KK3R5cGVkZWYgVHlwZXM8T25UaGVGbHlQcmltZVRhYmxlLCBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZT4gSW1wbGVtZW50YXRpb25zOworCitUWVBFRF9URVNUX0NBU0UoUHJpbWVUYWJsZVRlc3QsIEltcGxlbWVudGF0aW9ucyk7CisKKy8vIFRoZW4gdXNlIFRZUEVEX1RFU1QoVGVzdENhc2VOYW1lLCBUZXN0TmFtZSkgdG8gZGVmaW5lIGEgdHlwZWQgdGVzdCwKKy8vIHNpbWlsYXIgdG8gVEVTVF9GLgorVFlQRURfVEVTVChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzKSB7CisgIC8vIEluc2lkZSB0aGUgdGVzdCBib2R5LCB5b3UgY2FuIHJlZmVyIHRvIHRoZSB0eXBlIHBhcmFtZXRlciBieQorICAvLyBUeXBlUGFyYW0sIGFuZCByZWZlciB0byB0aGUgZml4dHVyZSBjbGFzcyBieSBUZXN0Rml4dHVyZS4gIFdlCisgIC8vIGRvbid0IG5lZWQgdGhlbSBpbiB0aGlzIGV4YW1wbGUuCisKKyAgLy8gU2luY2Ugd2UgYXJlIGluIHRoZSB0ZW1wbGF0ZSB3b3JsZCwgQysrIHJlcXVpcmVzIGV4cGxpY2l0bHkKKyAgLy8gd3JpdGluZyAndGhpcy0+JyB3aGVuIHJlZmVycmluZyB0byBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzLgorICAvLyBUaGlzIGlzIHNvbWV0aGluZyB5b3UgaGF2ZSB0byBsZWFybiB0byBsaXZlIHdpdGguCisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoLTUpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgwKSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMSkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDQpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg2KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTAwKSk7Cit9CisKK1RZUEVEX1RFU1QoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgyKSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgzKSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg1KSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg3KSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMSkpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTMxKSk7Cit9CisKK1RZUEVEX1RFU1QoUHJpbWVUYWJsZVRlc3QsIENhbkdldE5leHRQcmltZSkgeworICBFWFBFQ1RfRVEoMiwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMCkpOworICBFWFBFQ1RfRVEoMywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMikpOworICBFWFBFQ1RfRVEoNSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMykpOworICBFWFBFQ1RfRVEoNywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoNSkpOworICBFWFBFQ1RfRVEoMTEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDcpKTsKKyAgRVhQRUNUX0VRKDEzMSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMTI4KSk7Cit9CisKKy8vIFRoYXQncyBpdCEgIEdvb2dsZSBUZXN0IHdpbGwgcmVwZWF0IGVhY2ggVFlQRURfVEVTVCBmb3IgZWFjaCB0eXBlCisvLyBpbiB0aGUgdHlwZSBsaXN0IHNwZWNpZmllZCBpbiBUWVBFRF9URVNUX0NBU0UuICBTaXQgYmFjayBhbmQgYmUKKy8vIGhhcHB5IHRoYXQgeW91IGRvbid0IGhhdmUgdG8gZGVmaW5lIHRoZW0gbXVsdGlwbGUgdGltZXMuCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKwordXNpbmcgdGVzdGluZzo6VHlwZXM7CisKKy8vIFNvbWV0aW1lcywgaG93ZXZlciwgeW91IGRvbid0IHlldCBrbm93IGFsbCB0aGUgdHlwZXMgdGhhdCB5b3Ugd2FudAorLy8gdG8gdGVzdCB3aGVuIHlvdSB3cml0ZSB0aGUgdGVzdHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB0aGUKKy8vIGF1dGhvciBvZiBhbiBpbnRlcmZhY2UgYW5kIGV4cGVjdCBvdGhlciBwZW9wbGUgdG8gaW1wbGVtZW50IGl0LCB5b3UKKy8vIG1pZ2h0IHdhbnQgdG8gd3JpdGUgYSBzZXQgb2YgdGVzdHMgdG8gbWFrZSBzdXJlIGVhY2ggaW1wbGVtZW50YXRpb24KKy8vIGNvbmZvcm1zIHRvIHNvbWUgYmFzaWMgcmVxdWlyZW1lbnRzLCBidXQgeW91IGRvbid0IGtub3cgd2hhdAorLy8gaW1wbGVtZW50YXRpb25zIHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgZnV0dXJlLgorLy8KKy8vIEhvdyBjYW4geW91IHdyaXRlIHRoZSB0ZXN0cyB3aXRob3V0IGNvbW1pdHRpbmcgdG8gdGhlIHR5cGUKKy8vIHBhcmFtZXRlcnM/ICBUaGF0J3Mgd2hhdCAidHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIiBjYW4gZG8gZm9yIHlvdS4KKy8vIEl0IGlzIGEgYml0IG1vcmUgaW52b2x2ZWQgdGhhbiB0eXBlZCB0ZXN0cywgYnV0IGluIHJldHVybiB5b3UgZ2V0IGEKKy8vIHRlc3QgcGF0dGVybiB0aGF0IGNhbiBiZSByZXVzZWQgaW4gbWFueSBjb250ZXh0cywgd2hpY2ggaXMgYSBiaWcKKy8vIHdpbi4gIEhlcmUncyBob3cgeW91IGRvIGl0OgorCisvLyBGaXJzdCwgZGVmaW5lIGEgdGVzdCBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSGVyZSB3ZSBqdXN0IHJldXNlCisvLyB0aGUgUHJpbWVUYWJsZVRlc3QgZml4dHVyZSBkZWZpbmVkIGVhcmxpZXI6CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgUHJpbWVUYWJsZVRlc3QyIDogcHVibGljIFByaW1lVGFibGVUZXN0PFQ+IHsKK307CisKKy8vIFRoZW4sIGRlY2xhcmUgdGhlIHRlc3QgY2FzZS4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdAorLy8gZml4dHVyZSwgYW5kIGFsc28gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSAoYXMgdXN1YWwpLiAgVGhlIF9QCisvLyBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIuCitUWVBFRF9URVNUX0NBU0VfUChQcmltZVRhYmxlVGVzdDIpOworCisvLyBOZXh0LCB1c2UgVFlQRURfVEVTVF9QKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpIHRvIGRlZmluZSBhIHRlc3QsCisvLyBzaW1pbGFyIHRvIHdoYXQgeW91IGRvIHdpdGggVEVTVF9GLgorVFlQRURfVEVTVF9QKFByaW1lVGFibGVUZXN0MiwgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzKSB7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoLTUpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgwKSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMSkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDQpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg2KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTAwKSk7Cit9CisKK1RZUEVEX1RFU1RfUChQcmltZVRhYmxlVGVzdDIsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgyKSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgzKSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg1KSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg3KSk7CisgIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMSkpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTMxKSk7Cit9CisKK1RZUEVEX1RFU1RfUChQcmltZVRhYmxlVGVzdDIsIENhbkdldE5leHRQcmltZSkgeworICBFWFBFQ1RfRVEoMiwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMCkpOworICBFWFBFQ1RfRVEoMywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMikpOworICBFWFBFQ1RfRVEoNSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMykpOworICBFWFBFQ1RfRVEoNywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoNSkpOworICBFWFBFQ1RfRVEoMTEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDcpKTsKKyAgRVhQRUNUX0VRKDEzMSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMTI4KSk7Cit9CisKKy8vIFR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbnZvbHZlIG9uZSBleHRyYSBzdGVwOiB5b3UgaGF2ZSB0bworLy8gZW51bWVyYXRlIHRoZSB0ZXN0cyB5b3UgZGVmaW5lZDoKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKAorICAgIFByaW1lVGFibGVUZXN0MiwgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdGVzdCBjYXNlIG5hbWUuCisgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcmUgdGhlIHRlc3QgbmFtZXMuCisgICAgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzLCBSZXR1cm5zVHJ1ZUZvclByaW1lcywgQ2FuR2V0TmV4dFByaW1lKTsKKworLy8gQXQgdGhpcyBwb2ludCB0aGUgdGVzdCBwYXR0ZXJuIGlzIGRvbmUuICBIb3dldmVyLCB5b3UgZG9uJ3QgaGF2ZQorLy8gYW55IHJlYWwgdGVzdCB5ZXQgYXMgeW91IGhhdmVuJ3Qgc2FpZCB3aGljaCB0eXBlcyB5b3Ugd2FudCB0byBydW4KKy8vIHRoZSB0ZXN0cyB3aXRoLgorCisvLyBUbyB0dXJuIHRoZSBhYnN0cmFjdCB0ZXN0IHBhdHRlcm4gaW50byByZWFsIHRlc3RzLCB5b3UgaW5zdGFudGlhdGUKKy8vIGl0IHdpdGggYSBsaXN0IG9mIHR5cGVzLiAgVXN1YWxseSB0aGUgdGVzdCBwYXR0ZXJuIHdpbGwgYmUgZGVmaW5lZAorLy8gaW4gYSAuaCBmaWxlLCBhbmQgYW55b25lIGNhbiAjaW5jbHVkZSBhbmQgaW5zdGFudGlhdGUgaXQuICBZb3UgY2FuCisvLyBldmVuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHByb2dyYW0uICBUbyB0ZWxsCisvLyBkaWZmZXJlbnQgaW5zdGFuY2VzIGFwYXJ0LCB5b3UgZ2l2ZSBlYWNoIG9mIHRoZW0gYSBuYW1lLCB3aGljaCB3aWxsCisvLyBiZWNvbWUgcGFydCBvZiB0aGUgdGVzdCBjYXNlIG5hbWUgYW5kIGNhbiBiZSB1c2VkIGluIHRlc3QgZmlsdGVycy4KKworLy8gVGhlIGxpc3Qgb2YgdHlwZXMgd2Ugd2FudCB0byB0ZXN0LiAgTm90ZSB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZQorLy8gZGVmaW5lZCBhdCB0aGUgdGltZSB3ZSB3cml0ZSB0aGUgVFlQRURfVEVTVF9QKClzLgordHlwZWRlZiBUeXBlczxPblRoZUZseVByaW1lVGFibGUsIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlPgorICAgIFByaW1lVGFibGVJbXBsZW1lbnRhdGlvbnM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChPblRoZUZseUFuZFByZUNhbGN1bGF0ZWQsICAgIC8vIEluc3RhbmNlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lVGFibGVUZXN0MiwgICAgICAgICAgICAgLy8gVGVzdCBjYXNlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lVGFibGVJbXBsZW1lbnRhdGlvbnMpOyAgLy8gVHlwZSBsaXN0CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY1MWEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzAgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHRlc3QgY29tbW9uIHByb3BlcnRpZXMgb2YgbXVsdGlwbGUKKy8vIGltcGxlbWVudGF0aW9ucyBvZiBhbiBpbnRlcmZhY2UgKGFrYSBpbnRlcmZhY2UgdGVzdHMpIHVzaW5nCisvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLiBFYWNoIHRlc3QgaW4gdGhlIHRlc3QgY2FzZSBoYXMKKy8vIGEgcGFyYW1ldGVyIHRoYXQgaXMgYW4gaW50ZXJmYWNlIHBvaW50ZXIgdG8gYW4gaW1wbGVtZW50YXRpb24KKy8vIHRlc3RlZC4KKworLy8gVGhlIGludGVyZmFjZSBhbmQgaXRzIGltcGxlbWVudGF0aW9ucyBhcmUgaW4gdGhpcyBoZWFkZXIuCisjaW5jbHVkZSAicHJpbWVfdGFibGVzLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtOwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7CisKKy8vIEFzIGEgZ2VuZXJhbCBydWxlLCB0byBwcmV2ZW50IGEgdGVzdCBmcm9tIGFmZmVjdGluZyB0aGUgdGVzdHMgdGhhdCBjb21lCisvLyBhZnRlciBpdCwgeW91IHNob3VsZCBjcmVhdGUgYW5kIGRlc3Ryb3kgdGhlIHRlc3RlZCBvYmplY3RzIGZvciBlYWNoIHRlc3QKKy8vIGluc3RlYWQgb2YgcmV1c2luZyB0aGVtLiAgSW4gdGhpcyBzYW1wbGUgd2Ugd2lsbCBkZWZpbmUgYSBzaW1wbGUgZmFjdG9yeQorLy8gZnVuY3Rpb24gZm9yIFByaW1lVGFibGUgb2JqZWN0cy4gIFdlIHdpbGwgaW5zdGFudGlhdGUgb2JqZWN0cyBpbiB0ZXN0J3MKKy8vIFNldFVwKCkgbWV0aG9kIGFuZCBkZWxldGUgdGhlbSBpbiBUZWFyRG93bigpIG1ldGhvZC4KK3R5cGVkZWYgUHJpbWVUYWJsZSogQ3JlYXRlUHJpbWVUYWJsZUZ1bmMoKTsKKworUHJpbWVUYWJsZSogQ3JlYXRlT25UaGVGbHlQcmltZVRhYmxlKCkgeworICByZXR1cm4gbmV3IE9uVGhlRmx5UHJpbWVUYWJsZSgpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IG1heF9wcmVjYWxjdWxhdGVkPgorUHJpbWVUYWJsZSogQ3JlYXRlUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUoKSB7CisgIHJldHVybiBuZXcgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUobWF4X3ByZWNhbGN1bGF0ZWQpOworfQorCisvLyBJbnNpZGUgdGhlIHRlc3QgYm9keSwgZml4dHVyZSBjb25zdHJ1Y3RvciwgU2V0VXAoKSwgYW5kIFRlYXJEb3duKCkgeW91CisvLyBjYW4gcmVmZXIgdG8gdGhlIHRlc3QgcGFyYW1ldGVyIGJ5IEdldFBhcmFtKCkuICBJbiB0aGlzIGNhc2UsIHRoZSB0ZXN0CisvLyBwYXJhbWV0ZXIgaXMgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIHdlIGNhbGwgaW4gZml4dHVyZSdzIFNldFVwKCkgdG8KKy8vIGNyZWF0ZSBhbmQgc3RvcmUgYW4gaW5zdGFuY2Ugb2YgUHJpbWVUYWJsZS4KK2NsYXNzIFByaW1lVGFibGVUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08Q3JlYXRlUHJpbWVUYWJsZUZ1bmMqPiB7CisgcHVibGljOgorICB2aXJ0dWFsIH5QcmltZVRhYmxlVGVzdCgpIHsgZGVsZXRlIHRhYmxlXzsgfQorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IHRhYmxlXyA9ICgqR2V0UGFyYW0oKSkoKTsgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgZGVsZXRlIHRhYmxlXzsKKyAgICB0YWJsZV8gPSBOVUxMOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIFByaW1lVGFibGUqIHRhYmxlXzsKK307CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzKSB7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoLTUpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgwKSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMSkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDQpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSg2KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMTAwKSk7Cit9CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc1RydWVGb3JQcmltZXMpIHsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDMpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDUpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDcpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDExKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgxMzEpKTsKK30KKworVEVTVF9QKFByaW1lVGFibGVUZXN0LCBDYW5HZXROZXh0UHJpbWUpIHsKKyAgRVhQRUNUX0VRKDIsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDApKTsKKyAgRVhQRUNUX0VRKDMsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDIpKTsKKyAgRVhQRUNUX0VRKDUsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDMpKTsKKyAgRVhQRUNUX0VRKDcsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDUpKTsKKyAgRVhQRUNUX0VRKDExLCB0YWJsZV8tPkdldE5leHRQcmltZSg3KSk7CisgIEVYUEVDVF9FUSgxMzEsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDEyOCkpOworfQorCisvLyBJbiBvcmRlciB0byBydW4gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgeW91IG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlbSwKKy8vIG9yIGJpbmQgdGhlbSB0byBhIGxpc3Qgb2YgdmFsdWVzIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0ZXN0IHBhcmFtZXRlcnMuCisvLyBZb3UgY2FuIGluc3RhbnRpYXRlIHRoZW0gaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gbW9kdWxlLCBvciBldmVuCisvLyBpbnN0YW50aWF0ZSB0aGVtIHNldmVyYWwgdGltZXMuCisvLworLy8gSGVyZSwgd2UgaW5zdGFudGlhdGUgb3VyIHRlc3RzIHdpdGggYSBsaXN0IG9mIHR3byBQcmltZVRhYmxlIG9iamVjdAorLy8gZmFjdG9yeSBmdW5jdGlvbnM6CitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBPblRoZUZseUFuZFByZUNhbGN1bGF0ZWQsCisgICAgUHJpbWVUYWJsZVRlc3QsCisgICAgVmFsdWVzKCZDcmVhdGVPblRoZUZseVByaW1lVGFibGUsICZDcmVhdGVQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZTwxMDAwPikpOworCisjZWxzZQorCisvLyBHb29nbGUgVGVzdCBtYXkgbm90IHN1cHBvcnQgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIHNvbWUKKy8vIGNvbXBpbGVycy4gSWYgd2UgdXNlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIGNvbXBpbGUgb3V0IGFsbAorLy8gY29kZSByZWZlcnJpbmcgdG8gdGhlIGd0ZXN0X21haW4gbGlicmFyeSwgTVNWQyBsaW5rZXIgd2lsbCBub3QgbGluaworLy8gdGhhdCBsaWJyYXJ5IGF0IGFsbCBhbmQgY29uc2VxdWVudGx5IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZW50cnkKKy8vIHBvaW50IGRlZmluZWQgaW4gdGhhdCBsaWJyYXJ5IChmYXRhbCBlcnJvciBMTksxNTYxOiBlbnRyeSBwb2ludAorLy8gbXVzdCBiZSBkZWZpbmVkKS4gVGhpcyBkdW1teSB0ZXN0IGtlZXBzIGd0ZXN0X21haW4gbGlua2VkIGluLgorVEVTVChEdW1teVRlc3QsIFZhbHVlUGFyYW1ldGVyaXplZFRlc3RzQXJlTm90U3VwcG9ydGVkT25UaGlzUGxhdGZvcm0pIHt9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkMmUyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTczIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB0ZXN0IGNvZGUgcmVseWluZyBvbiBzb21lIGdsb2JhbCBmbGFnIHZhcmlhYmxlcy4KKy8vIENvbWJpbmUoKSBoZWxwcyB3aXRoIGdlbmVyYXRpbmcgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBzdWNoIGZsYWdzLAorLy8gYW5kIGVhY2ggdGVzdCBpcyBnaXZlbiBvbmUgY29tYmluYXRpb24gYXMgYSBwYXJhbWV0ZXIuCisKKy8vIFVzZSBjbGFzcyBkZWZpbml0aW9ucyB0byB0ZXN0IGZyb20gdGhpcyBoZWFkZXIuCisjaW5jbHVkZSAicHJpbWVfdGFibGVzLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX0NPTUJJTkUKKworLy8gU3VwcG9zZSB3ZSB3YW50IHRvIGludHJvZHVjZSBhIG5ldywgaW1wcm92ZWQgaW1wbGVtZW50YXRpb24gb2YgUHJpbWVUYWJsZQorLy8gd2hpY2ggY29tYmluZXMgc3BlZWQgb2YgUHJlY2FsY1ByaW1lVGFibGUgYW5kIHZlcnNhdGlsaXR5IG9mCisvLyBPblRoZUZseVByaW1lVGFibGUgKHNlZSBwcmltZV90YWJsZXMuaCkuIEluc2lkZSBpdCBpbnN0YW50aWF0ZXMgYm90aAorLy8gUHJlY2FsY1ByaW1lVGFibGUgYW5kIE9uVGhlRmx5UHJpbWVUYWJsZSBhbmQgdXNlcyB0aGUgb25lIHRoYXQgaXMgbW9yZQorLy8gYXBwcm9wcmlhdGUgdW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMuIEJ1dCBpbiBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsIGl0IGNhbiBiZQorLy8gdG9sZCB0byBpbnN0YW50aWF0ZSB3aXRob3V0IFByZWNhbGNQcmltZVRhYmxlIGluc3RhbmNlIGF0IGFsbCBhbmQgdXNlIG9ubHkKKy8vIE9uVGhlRmx5UHJpbWVUYWJsZS4KK2NsYXNzIEh5YnJpZFByaW1lVGFibGUgOiBwdWJsaWMgUHJpbWVUYWJsZSB7CisgcHVibGljOgorICBIeWJyaWRQcmltZVRhYmxlKGJvb2wgZm9yY2Vfb25fdGhlX2ZseSwgaW50IG1heF9wcmVjYWxjdWxhdGVkKQorICAgICAgOiBvbl90aGVfZmx5X2ltcGxfKG5ldyBPblRoZUZseVByaW1lVGFibGUpLAorICAgICAgICBwcmVjYWxjX2ltcGxfKGZvcmNlX29uX3RoZV9mbHkgPyBOVUxMIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKG1heF9wcmVjYWxjdWxhdGVkKSksCisgICAgICAgIG1heF9wcmVjYWxjdWxhdGVkXyhtYXhfcHJlY2FsY3VsYXRlZCkge30KKyAgdmlydHVhbCB+SHlicmlkUHJpbWVUYWJsZSgpIHsKKyAgICBkZWxldGUgb25fdGhlX2ZseV9pbXBsXzsKKyAgICBkZWxldGUgcHJlY2FsY19pbXBsXzsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCB7CisgICAgaWYgKHByZWNhbGNfaW1wbF8gIT0gTlVMTCAmJiBuIDwgbWF4X3ByZWNhbGN1bGF0ZWRfKQorICAgICAgcmV0dXJuIHByZWNhbGNfaW1wbF8tPklzUHJpbWUobik7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG9uX3RoZV9mbHlfaW1wbF8tPklzUHJpbWUobik7CisgIH0KKworICB2aXJ0dWFsIGludCBHZXROZXh0UHJpbWUoaW50IHApIGNvbnN0IHsKKyAgICBpbnQgbmV4dF9wcmltZSA9IC0xOworICAgIGlmIChwcmVjYWxjX2ltcGxfICE9IE5VTEwgJiYgcCA8IG1heF9wcmVjYWxjdWxhdGVkXykKKyAgICAgIG5leHRfcHJpbWUgPSBwcmVjYWxjX2ltcGxfLT5HZXROZXh0UHJpbWUocCk7CisKKyAgICByZXR1cm4gbmV4dF9wcmltZSAhPSAtMSA/IG5leHRfcHJpbWUgOiBvbl90aGVfZmx5X2ltcGxfLT5HZXROZXh0UHJpbWUocCk7CisgIH0KKworIHByaXZhdGU6CisgIE9uVGhlRmx5UHJpbWVUYWJsZSogb25fdGhlX2ZseV9pbXBsXzsKKyAgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUqIHByZWNhbGNfaW1wbF87CisgIGludCBtYXhfcHJlY2FsY3VsYXRlZF87Cit9OworCit1c2luZyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW07Cit1c2luZyA6OnRlc3Rpbmc6OkJvb2w7Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlczsKK3VzaW5nIDo6dGVzdGluZzo6Q29tYmluZTsKKworLy8gVG8gdGVzdCBhbGwgY29kZSBwYXRocyBmb3IgSHlicmlkUHJpbWVUYWJsZSB3ZSBtdXN0IHRlc3QgaXQgd2l0aCBudW1iZXJzCisvLyBib3RoIHdpdGhpbiBhbmQgb3V0c2lkZSBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSdzIGNhcGFjaXR5IGFuZCBhbHNvIHdpdGgKKy8vIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlIGRpc2FibGVkLiBXZSBkbyB0aGlzIGJ5IGRlZmluaW5nIGZpeHR1cmUgd2hpY2ggd2lsbAorLy8gYWNjZXB0IGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgcGFyYW1ldGVycyBmb3IgaW5zdGFudGlhdGluZyBhCisvLyBIeWJyaWRQcmltZVRhYmxlIGluc3RhbmNlLgorY2xhc3MgUHJpbWVUYWJsZVRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTwgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgaW50PiA+IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBUaGlzIGNhbiBiZSB3cml0dGVuIGFzCisgICAgLy8KKyAgICAvLyBib29sIGZvcmNlX29uX3RoZV9mbHk7CisgICAgLy8gaW50IG1heF9wcmVjYWxjdWxhdGVkOworICAgIC8vIHRpZShmb3JjZV9vbl90aGVfZmx5LCBtYXhfcHJlY2FsY3VsYXRlZCkgPSBHZXRQYXJhbSgpOworICAgIC8vCisgICAgLy8gb25jZSB0aGUgR29vZ2xlIEMrKyBTdHlsZSBHdWlkZSBhbGxvd3MgdXNlIG9mIDo6c3RkOjp0cjE6OnRpZS4KKyAgICAvLworICAgIGJvb2wgZm9yY2Vfb25fdGhlX2ZseSA9IDo6c3RkOjp0cjE6OmdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBpbnQgbWF4X3ByZWNhbGN1bGF0ZWQgPSA6OnN0ZDo6dHIxOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgdGFibGVfID0gbmV3IEh5YnJpZFByaW1lVGFibGUoZm9yY2Vfb25fdGhlX2ZseSwgbWF4X3ByZWNhbGN1bGF0ZWQpOworICB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBkZWxldGUgdGFibGVfOworICAgIHRhYmxlXyA9IE5VTEw7CisgIH0KKyAgSHlicmlkUHJpbWVUYWJsZSogdGFibGVfOworfTsKKworVEVTVF9QKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zRmFsc2VGb3JOb25QcmltZXMpIHsKKyAgLy8gSW5zaWRlIHRoZSB0ZXN0IGJvZHksIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHRlc3QgcGFyYW1ldGVyIGJ5IEdldFBhcmFtKCkuCisgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHRlc3QgcGFyYW1ldGVyIGlzIGEgUHJpbWVUYWJsZSBpbnRlcmZhY2UgcG9pbnRlciB3aGljaAorICAvLyB3ZSBjYW4gdXNlIGRpcmVjdGx5LgorICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBzYXZlIGl0IGluIHRoZSBmaXh0dXJlJ3MgU2V0VXAoKSBtZXRob2QKKyAgLy8gb3IgY29uc3RydWN0b3IgYW5kIHVzZSBzYXZlZCBjb3B5IGluIHRoZSB0ZXN0cy4KKworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKC01KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSg0KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoNikpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEwMCkpOworfQorCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgyKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgzKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg1KSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg3KSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgxMSkpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMTMxKSk7Cit9CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgQ2FuR2V0TmV4dFByaW1lKSB7CisgIEVYUEVDVF9FUSgyLCB0YWJsZV8tPkdldE5leHRQcmltZSgwKSk7CisgIEVYUEVDVF9FUSgzLCB0YWJsZV8tPkdldE5leHRQcmltZSgyKSk7CisgIEVYUEVDVF9FUSg1LCB0YWJsZV8tPkdldE5leHRQcmltZSgzKSk7CisgIEVYUEVDVF9FUSg3LCB0YWJsZV8tPkdldE5leHRQcmltZSg1KSk7CisgIEVYUEVDVF9FUSgxMSwgdGFibGVfLT5HZXROZXh0UHJpbWUoNykpOworICBFWFBFQ1RfRVEoMTMxLCB0YWJsZV8tPkdldE5leHRQcmltZSgxMjgpKTsKK30KKworLy8gSW4gb3JkZXIgdG8gcnVuIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIHlvdSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZW0sCisvLyBvciBiaW5kIHRoZW0gdG8gYSBsaXN0IG9mIHZhbHVlcyB3aGljaCB3aWxsIGJlIHVzZWQgYXMgdGVzdCBwYXJhbWV0ZXJzLgorLy8gWW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtIGluIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIG1vZHVsZSwgb3IgZXZlbgorLy8gaW5zdGFudGlhdGUgdGhlbSBzZXZlcmFsIHRpbWVzLgorLy8KKy8vIEhlcmUsIHdlIGluc3RhbnRpYXRlIG91ciB0ZXN0cyB3aXRoIGEgbGlzdCBvZiBwYXJhbWV0ZXJzLiBXZSBtdXN0IGNvbWJpbmUKKy8vIGFsbCB2YXJpYXRpb25zIG9mIHRoZSBib29sZWFuIGZsYWcgc3VwcHJlc3NpbmcgUHJlY2FsY1ByaW1lVGFibGUgYW5kIHNvbWUKKy8vIG1lYW5pbmdmdWwgdmFsdWVzIGZvciB0ZXN0cy4gV2UgY2hvb3NlIGEgc21hbGwgdmFsdWUgKDEpLCBhbmQgYSB2YWx1ZSB0aGF0CisvLyB3aWxsIHB1dCBzb21lIG9mIHRoZSB0ZXN0ZWQgbnVtYmVycyBiZXlvbmQgdGhlIGNhcGFiaWxpdHkgb2YgdGhlCisvLyBQcmVjYWxjUHJpbWVUYWJsZSBpbnN0YW5jZSBhbmQgc29tZSBpbnNpZGUgaXQgKDEwKS4gQ29tYmluZSB3aWxsIHByb2R1Y2UgYWxsCisvLyBwb3NzaWJsZSBjb21iaW5hdGlvbnMuCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChNZWFuaW5nZnVsVGVzdFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBQcmltZVRhYmxlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoQm9vbCgpLCBWYWx1ZXMoMSwgMTApKSk7CisKKyNlbHNlCisKKy8vIEdvb2dsZSBUZXN0IG1heSBub3Qgc3VwcG9ydCBDb21iaW5lKCkgd2l0aCBzb21lIGNvbXBpbGVycy4gSWYgd2UKKy8vIHVzZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBjb21waWxlIG91dCBhbGwgY29kZSByZWZlcnJpbmcgdG8KKy8vIHRoZSBndGVzdF9tYWluIGxpYnJhcnksIE1TVkMgbGlua2VyIHdpbGwgbm90IGxpbmsgdGhhdCBsaWJyYXJ5IGF0CisvLyBhbGwgYW5kIGNvbnNlcXVlbnRseSBjb21wbGFpbiBhYm91dCBtaXNzaW5nIGVudHJ5IHBvaW50IGRlZmluZWQgaW4KKy8vIHRoYXQgbGlicmFyeSAoZmF0YWwgZXJyb3IgTE5LMTU2MTogZW50cnkgcG9pbnQgbXVzdCBiZQorLy8gZGVmaW5lZCkuIFRoaXMgZHVtbXkgdGVzdCBrZWVwcyBndGVzdF9tYWluIGxpbmtlZCBpbi4KK1RFU1QoRHVtbXlUZXN0LCBDb21iaW5lSXNOb3RTdXBwb3J0ZWRPblRoaXNQbGF0Zm9ybSkge30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NhbXBsZXMvc2FtcGxlOV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmUyMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNjAgQEAKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdXNlIEdvb2dsZSBUZXN0IGxpc3RlbmVyIEFQSSB0byBpbXBsZW1lbnQKKy8vIGFuIGFsdGVybmF0aXZlIGNvbnNvbGUgb3V0cHV0IGFuZCBob3cgdG8gdXNlIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSQorLy8gdG8gZW51bWVyYXRlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIGFuZCB0byBpbnNwZWN0IHRoZWlyIHJlc3VsdHMuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdENhc2U7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwordXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKKworbmFtZXNwYWNlIHsKKworLy8gUHJvdmlkZXMgYWx0ZXJuYXRpdmUgb3V0cHV0IG1vZGUgd2hpY2ggcHJvZHVjZXMgbWluaW1hbCBhbW91bnQgb2YKKy8vIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzLgorY2xhc3MgVGVyc2VQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworIHByaXZhdGU6CisgIC8vIENhbGxlZCBiZWZvcmUgYW55IHRlc3QgYWN0aXZpdHkgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8pIHt9CisKKyAgLy8gQ2FsbGVkIGFmdGVyIGFsbCB0ZXN0IGFjdGl2aXRpZXMgaGF2ZSBlbmRlZC4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICAgIGZwcmludGYoc3Rkb3V0LCAiVEVTVCAlc1xuIiwgdW5pdF90ZXN0LlBhc3NlZCgpID8gIlBBU1NFRCIgOiAiRkFJTEVEIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KKworICAvLyBDYWxsZWQgYmVmb3JlIGEgdGVzdCBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgZnByaW50ZihzdGRvdXQsCisgICAgICAgICAgICAiKioqIFRlc3QgJXMuJXMgc3RhcnRpbmcuXG4iLAorICAgICAgICAgICAgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksCisgICAgICAgICAgICB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgfQorCisgIC8vIENhbGxlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwKKyAgICAgICAgICAgICIlcyBpbiAlczolZFxuJXNcbiIsCisgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmZhaWxlZCgpID8gIioqKiBGYWlsdXJlIiA6ICJTdWNjZXNzIiwKKyAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCisgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCksCisgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LnN1bW1hcnkoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KKworICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIGZwcmludGYoc3Rkb3V0LAorICAgICAgICAgICAgIioqKiBUZXN0ICVzLiVzIGVuZGluZy5cbiIsCisgICAgICAgICAgICB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwKKyAgICAgICAgICAgIHRlc3RfaW5mby5uYW1lKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9Cit9OyAgLy8gY2xhc3MgVGVyc2VQcmludGVyCisKK1RFU1QoQ3VzdG9tT3V0cHV0VGVzdCwgUHJpbnRzTWVzc2FnZSkgeworICBwcmludGYoIlByaW50aW5nIHNvbWV0aGluZyBmcm9tIHRoZSB0ZXN0IGJvZHkuLi5cbiIpOworfQorCitURVNUKEN1c3RvbU91dHB1dFRlc3QsIFN1Y2NlZWRzKSB7CisgIFNVQ0NFRUQoKSA8PCAiU1VDQ0VFRCgpIGhhcyBiZWVuIGludm9rZWQgZnJvbSBoZXJlIjsKK30KKworVEVTVChDdXN0b21PdXRwdXRUZXN0LCBGYWlscykgeworICBFWFBFQ1RfRVEoMSwgMikKKyAgICAgIDw8ICJUaGlzIHRlc3QgZmFpbHMgaW4gb3JkZXIgdG8gZGVtb25zdHJhdGUgYWx0ZXJuYXRpdmUgZmFpbHVyZSBtZXNzYWdlcyI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGJvb2wgdGVyc2Vfb3V0cHV0ID0gZmFsc2U7CisgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi0tdGVyc2Vfb3V0cHV0IikgPT0gMCApCisgICAgdGVyc2Vfb3V0cHV0ID0gdHJ1ZTsKKyAgZWxzZQorICAgIHByaW50ZigiJXNcbiIsICJSdW4gdGhpcyBwcm9ncmFtIHdpdGggLS10ZXJzZV9vdXRwdXQgdG8gY2hhbmdlIHRoZSB3YXkgIgorICAgICAgICAgICAiaXQgcHJpbnRzIGl0cyBvdXRwdXQuIik7CisKKyAgVW5pdFRlc3QmIHVuaXRfdGVzdCA9ICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKKworICAvLyBJZiB3ZSBhcmUgZ2l2ZW4gdGhlIC0tdGVyc2Vfb3V0cHV0IGNvbW1hbmQgbGluZSBmbGFnLCBzdXBwcmVzc2VzIHRoZQorICAvLyBzdGFuZGFyZCBvdXRwdXQgYW5kIGF0dGFjaGVzIG93biByZXN1bHQgcHJpbnRlci4KKyAgaWYgKHRlcnNlX291dHB1dCkgeworICAgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0gdW5pdF90ZXN0Lmxpc3RlbmVycygpOworCisgICAgLy8gUmVtb3ZlcyB0aGUgZGVmYXVsdCBjb25zb2xlIG91dHB1dCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IHNvIGl0IHdpbGwKKyAgICAvLyBub3QgcmVjZWl2ZSBldmVudHMgZnJvbSBHb29nbGUgVGVzdCBhbmQgd29uJ3QgcHJpbnQgYW55IG91dHB1dC4gU2luY2UKKyAgICAvLyB0aGlzIG9wZXJhdGlvbiB0cmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoZSBsaXN0ZW5lciB0byB0aGUgY2FsbGVyIHdlCisgICAgLy8gaGF2ZSB0byBkZWxldGUgaXQgYXMgd2VsbC4KKyAgICBkZWxldGUgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSk7CisKKyAgICAvLyBBZGRzIHRoZSBjdXN0b20gb3V0cHV0IGxpc3RlbmVyIHRvIHRoZSBsaXN0LiBJdCB3aWxsIG5vdyByZWNlaXZlCisgICAgLy8gZXZlbnRzIGZyb20gR29vZ2xlIFRlc3QgYW5kIHByaW50IHRoZSBhbHRlcm5hdGl2ZSBvdXRwdXQuIFdlIGRvbid0CisgICAgLy8gaGF2ZSB0byB3b3JyeSBhYm91dCBkZWxldGluZyBpdCBzaW5jZSBHb29nbGUgVGVzdCBhc3N1bWVzIG93bmVyc2hpcAorICAgIC8vIG92ZXIgaXQgYWZ0ZXIgYWRkaW5nIGl0IHRvIHRoZSBsaXN0LgorICAgIGxpc3RlbmVycy5BcHBlbmQobmV3IFRlcnNlUHJpbnRlcik7CisgIH0KKyAgaW50IHJldF92YWwgPSBSVU5fQUxMX1RFU1RTKCk7CisKKyAgLy8gVGhpcyBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSSB0byBpbnNwZWN0IHRlc3QKKyAgLy8gcmVzdWx0cy4gSGVyZSB3ZSBkaXNjb3VudCBmYWlsdXJlcyBmcm9tIHRoZSB0ZXN0cyB3ZSBleHBlY3RlZCB0byBmYWlsLgorICBpbnQgdW5leHBlY3RlZGx5X2ZhaWxlZF90ZXN0cyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlID0gKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraikgeworICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7CisgICAgICAvLyBDb3VudHMgZmFpbGVkIHRlc3RzIHRoYXQgd2VyZSBub3QgbWVhbnQgdG8gZmFpbCAodGhvc2Ugd2l0aG91dAorICAgICAgLy8gJ0ZhaWxzJyBpbiB0aGUgbmFtZSkuCisgICAgICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5GYWlsZWQoKSAmJgorICAgICAgICAgIHN0cmNtcCh0ZXN0X2luZm8ubmFtZSgpLCAiRmFpbHMiKSAhPSAwKSB7CisgICAgICAgIHVuZXhwZWN0ZWRseV9mYWlsZWRfdGVzdHMrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBUZXN0IHRoYXQgd2VyZSBtZWFudCB0byBmYWlsIHNob3VsZCBub3QgYWZmZWN0IHRoZSB0ZXN0IHByb2dyYW0gb3V0Y29tZS4KKyAgaWYgKHVuZXhwZWN0ZWRseV9mYWlsZWRfdGVzdHMgPT0gMCkKKyAgICByZXRfdmFsID0gMDsKKworICByZXR1cm4gcmV0X3ZhbDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTdlZjcyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5CkBAIC0wLDAgKzEsMjUwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJmdXNlX2d0ZXN0X2ZpbGVzLnB5IHYwLjIuMAorRnVzZXMgR29vZ2xlIFRlc3Qgc291cmNlIGNvZGUgaW50byBhIC5oIGZpbGUgYW5kIGEgLmNjIGZpbGUuCisKK1NZTk9QU0lTCisgICAgICAgZnVzZV9ndGVzdF9maWxlcy5weSBbR1RFU1RfUk9PVF9ESVJdIE9VVFBVVF9ESVIKKworICAgICAgIFNjYW5zIEdURVNUX1JPT1RfRElSIGZvciBHb29nbGUgVGVzdCBzb3VyY2UgY29kZSwgYW5kIGdlbmVyYXRlcworICAgICAgIHR3byBmaWxlczogT1VUUFVUX0RJUi9ndGVzdC9ndGVzdC5oIGFuZCBPVVRQVVRfRElSL2d0ZXN0L2d0ZXN0LWFsbC5jYy4KKyAgICAgICBUaGVuIHlvdSBjYW4gYnVpbGQgeW91ciB0ZXN0cyBieSBhZGRpbmcgT1VUUFVUX0RJUiB0byB0aGUgaW5jbHVkZQorICAgICAgIHNlYXJjaCBwYXRoIGFuZCBsaW5raW5nIHdpdGggT1VUUFVUX0RJUi9ndGVzdC9ndGVzdC1hbGwuY2MuICBUaGVzZQorICAgICAgIHR3byBmaWxlcyBjb250YWluIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gdXNlIEdvb2dsZSBUZXN0LiAgSGVuY2UKKyAgICAgICB5b3UgY2FuICJpbnN0YWxsIiBHb29nbGUgVGVzdCBieSBjb3B5aW5nIHRoZW0gdG8gd2hlcmV2ZXIgeW91IHdhbnQuCisKKyAgICAgICBHVEVTVF9ST09UX0RJUiBjYW4gYmUgb21pdHRlZCBhbmQgZGVmYXVsdHMgdG8gdGhlIHBhcmVudAorICAgICAgIGRpcmVjdG9yeSBvZiB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgdGhpcyBzY3JpcHQuCisKK0VYQU1QTEVTCisgICAgICAgLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5IGZ1c2VkX2d0ZXN0CisgICAgICAgLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5IHBhdGgvdG8vdW5wYWNrZWQvZ3Rlc3QgZnVzZWRfZ3Rlc3QKKworVGhpcyB0b29sIGlzIGV4cGVyaW1lbnRhbC4gIEluIHBhcnRpY3VsYXIsIGl0IGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBubworY29uZGl0aW9uYWwgaW5jbHVzaW9uIG9mIEdvb2dsZSBUZXN0IGhlYWRlcnMuICBQbGVhc2UgcmVwb3J0IGFueQorcHJvYmxlbXMgdG8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLiAgWW91IGNhbiByZWFkCitodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3RBZHZhbmNlZEd1aWRlIGZvcgorbW9yZSBpbmZvcm1hdGlvbi4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNldHMKK2ltcG9ydCBzeXMKKworIyBXZSBhc3N1bWUgdGhhdCB0aGlzIGZpbGUgaXMgaW4gdGhlIHNjcmlwdHMvIGRpcmVjdG9yeSBpbiB0aGUgR29vZ2xlCisjIFRlc3Qgcm9vdCBkaXJlY3RvcnkuCitERUZBVUxUX0dURVNUX1JPT1RfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicpCisKKyMgUmVnZXggZm9yIG1hdGNoaW5nICcjaW5jbHVkZSAiZ3Rlc3QvLi4uIicuCitJTkNMVURFX0dURVNUX0ZJTEVfUkVHRVggPSByZS5jb21waWxlKHInXlxzKiNccyppbmNsdWRlXHMqIihndGVzdC8uKykiJykKKworIyBSZWdleCBmb3IgbWF0Y2hpbmcgJyNpbmNsdWRlICJzcmMvLi4uIicuCitJTkNMVURFX1NSQ19GSUxFX1JFR0VYID0gcmUuY29tcGlsZShyJ15ccyojXHMqaW5jbHVkZVxzKiIoc3JjLy4rKSInKQorCisjIFdoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBzZWVkIGZpbGVzLgorR1RFU1RfSF9TRUVEID0gJ2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCcKK0dURVNUX1NQSV9IX1NFRUQgPSAnaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaCcKK0dURVNUX0FMTF9DQ19TRUVEID0gJ3NyYy9ndGVzdC1hbGwuY2MnCisKKyMgV2hlcmUgdG8gcHV0IHRoZSBnZW5lcmF0ZWQgZmlsZXMuCitHVEVTVF9IX09VVFBVVCA9ICdndGVzdC9ndGVzdC5oJworR1RFU1RfQUxMX0NDX09VVFBVVCA9ICdndGVzdC9ndGVzdC1hbGwuY2MnCisKKworZGVmIFZlcmlmeUZpbGVFeGlzdHMoZGlyZWN0b3J5LCByZWxhdGl2ZV9wYXRoKToKKyAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gZmlsZSBleGlzdHM7IGFib3J0cyBvbiBmYWlsdXJlLgorCisgIHJlbGF0aXZlX3BhdGggaXMgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAiIiIKKworICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKGRpcmVjdG9yeSwgcmVsYXRpdmVfcGF0aCkpOgorICAgIHByaW50ICdFUlJPUjogQ2Fubm90IGZpbmQgJXMgaW4gZGlyZWN0b3J5ICVzLicgJSAocmVsYXRpdmVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSkKKyAgICBwcmludCAoJ1BsZWFzZSBlaXRoZXIgc3BlY2lmeSBhIHZhbGlkIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkgJworICAgICAgICAgICAnb3Igb21pdCBpdCBvbiB0aGUgY29tbWFuZCBsaW5lLicpCisgICAgc3lzLmV4aXQoMSkKKworCitkZWYgVmFsaWRhdGVHVGVzdFJvb3REaXIoZ3Rlc3Rfcm9vdCk6CisgICIiIk1ha2VzIHN1cmUgZ3Rlc3Rfcm9vdCBwb2ludHMgdG8gYSB2YWxpZCBndGVzdCByb290IGRpcmVjdG9yeS4KKworICBUaGUgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtIG9uIGZhaWx1cmUuCisgICIiIgorCisgIFZlcmlmeUZpbGVFeGlzdHMoZ3Rlc3Rfcm9vdCwgR1RFU1RfSF9TRUVEKQorICBWZXJpZnlGaWxlRXhpc3RzKGd0ZXN0X3Jvb3QsIEdURVNUX0FMTF9DQ19TRUVEKQorCisKK2RlZiBWZXJpZnlPdXRwdXRGaWxlKG91dHB1dF9kaXIsIHJlbGF0aXZlX3BhdGgpOgorICAiIiJWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBwYXRoIGlzIHZhbGlkLgorCisgIHJlbGF0aXZlX3BhdGggaXMgcmVsYXRpdmUgdG8gdGhlIG91dHB1dF9kaXIgZGlyZWN0b3J5LgorICAiIiIKKworICAjIE1ha2VzIHN1cmUgdGhlIG91dHB1dCBmaWxlIGVpdGhlciBkb2Vzbid0IGV4aXN0IG9yIGNhbiBiZSBvdmVyd3JpdHRlbi4KKyAgb3V0cHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgcmVsYXRpdmVfcGF0aCkKKyAgaWYgb3MucGF0aC5leGlzdHMob3V0cHV0X2ZpbGUpOgorICAgICMgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFRoZSBmb2xsb3dpbmcgdXNlci1pbnRlcmFjdGlvbiBkb2Vzbid0CisgICAgIyB3b3JrIHdpdGggYXV0b21hdGVkIHByb2Nlc3Nlcy4gIFdlIHNob3VsZCBwcm92aWRlIGEgd2F5IGZvciB0aGUKKyAgICAjIE1ha2VmaWxlIHRvIGZvcmNlIG92ZXJ3cml0aW5nIHRoZSBmaWxlcy4KKyAgICBwcmludCAoJyVzIGFscmVhZHkgZXhpc3RzIGluIGRpcmVjdG9yeSAlcyAtIG92ZXJ3cml0ZSBpdD8gKHkvTikgJyAlCisgICAgICAgICAgIChyZWxhdGl2ZV9wYXRoLCBvdXRwdXRfZGlyKSkKKyAgICBhbnN3ZXIgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKS5zdHJpcCgpCisgICAgaWYgYW5zd2VyIG5vdCBpbiBbJ3knLCAnWSddOgorICAgICAgcHJpbnQgJ0FCT1JURUQuJworICAgICAgc3lzLmV4aXQoMSkKKworICAjIE1ha2VzIHN1cmUgdGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBvdXRwdXQgZmlsZSBleGlzdHM7IGNyZWF0ZXMKKyAgIyBpdCBhbmQgYWxsIGl0cyBhbmNlc3RvcnMgaWYgbmVjZXNzYXJ5LgorICBwYXJlbnRfZGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlKQorICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXJlbnRfZGlyZWN0b3J5KToKKyAgICBvcy5tYWtlZGlycyhwYXJlbnRfZGlyZWN0b3J5KQorCisKK2RlZiBWYWxpZGF0ZU91dHB1dERpcihvdXRwdXRfZGlyKToKKyAgIiIiTWFrZXMgc3VyZSBvdXRwdXRfZGlyIHBvaW50cyB0byBhIHZhbGlkIG91dHB1dCBkaXJlY3RvcnkuCisKKyAgVGhlIGZ1bmN0aW9uIGFib3J0cyB0aGUgcHJvZ3JhbSBvbiBmYWlsdXJlLgorICAiIiIKKworICBWZXJpZnlPdXRwdXRGaWxlKG91dHB1dF9kaXIsIEdURVNUX0hfT1VUUFVUKQorICBWZXJpZnlPdXRwdXRGaWxlKG91dHB1dF9kaXIsIEdURVNUX0FMTF9DQ19PVVRQVVQpCisKKworZGVmIEZ1c2VHVGVzdEgoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2Rpcik6CisgICIiIlNjYW5zIGZvbGRlciBndGVzdF9yb290IHRvIGdlbmVyYXRlIGd0ZXN0L2d0ZXN0LmggaW4gb3V0cHV0X2Rpci4iIiIKKworICBvdXRwdXRfZmlsZSA9IGZpbGUob3MucGF0aC5qb2luKG91dHB1dF9kaXIsIEdURVNUX0hfT1VUUFVUKSwgJ3cnKQorICBwcm9jZXNzZWRfZmlsZXMgPSBzZXRzLlNldCgpICAjIEhvbGRzIGFsbCBndGVzdCBoZWFkZXJzIHdlJ3ZlIHByb2Nlc3NlZC4KKworICBkZWYgUHJvY2Vzc0ZpbGUoZ3Rlc3RfaGVhZGVyX3BhdGgpOgorICAgICIiIlByb2Nlc3NlcyB0aGUgZ2l2ZW4gZ3Rlc3QgaGVhZGVyIGZpbGUuIiIiCisKKyAgICAjIFdlIGRvbid0IHByb2Nlc3MgdGhlIHNhbWUgaGVhZGVyIHR3aWNlLgorICAgIGlmIGd0ZXN0X2hlYWRlcl9wYXRoIGluIHByb2Nlc3NlZF9maWxlczoKKyAgICAgIHJldHVybgorCisgICAgcHJvY2Vzc2VkX2ZpbGVzLmFkZChndGVzdF9oZWFkZXJfcGF0aCkKKworICAgICMgUmVhZHMgZWFjaCBsaW5lIGluIHRoZSBnaXZlbiBndGVzdCBoZWFkZXIuCisgICAgZm9yIGxpbmUgaW4gZmlsZShvcy5wYXRoLmpvaW4oZ3Rlc3Rfcm9vdCwgZ3Rlc3RfaGVhZGVyX3BhdGgpLCAncicpOgorICAgICAgbSA9IElOQ0xVREVfR1RFU1RfRklMRV9SRUdFWC5tYXRjaChsaW5lKQorICAgICAgaWYgbToKKyAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAiZ3Rlc3QvLi4uIicgLSBsZXQncyBwcm9jZXNzIGl0IHJlY3Vyc2l2ZWx5LgorICAgICAgICBQcm9jZXNzRmlsZSgnaW5jbHVkZS8nICsgbS5ncm91cCgxKSkKKyAgICAgIGVsc2U6CisgICAgICAgICMgT3RoZXJ3aXNlIHdlIGNvcHkgdGhlIGxpbmUgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUobGluZSkKKworICBQcm9jZXNzRmlsZShHVEVTVF9IX1NFRUQpCisgIG91dHB1dF9maWxlLmNsb3NlKCkKKworCitkZWYgRnVzZUdUZXN0QWxsQ2NUb0ZpbGUoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2ZpbGUpOgorICAiIiJTY2FucyBmb2xkZXIgZ3Rlc3Rfcm9vdCB0byBnZW5lcmF0ZSBndGVzdC9ndGVzdC1hbGwuY2MgaW4gb3V0cHV0X2ZpbGUuIiIiCisKKyAgcHJvY2Vzc2VkX2ZpbGVzID0gc2V0cy5TZXQoKQorCisgIGRlZiBQcm9jZXNzRmlsZShndGVzdF9zb3VyY2VfZmlsZSk6CisgICAgIiIiUHJvY2Vzc2VzIHRoZSBnaXZlbiBndGVzdCBzb3VyY2UgZmlsZS4iIiIKKworICAgICMgV2UgZG9uJ3QgcHJvY2VzcyB0aGUgc2FtZSAjaW5jbHVkZWQgZmlsZSB0d2ljZS4KKyAgICBpZiBndGVzdF9zb3VyY2VfZmlsZSBpbiBwcm9jZXNzZWRfZmlsZXM6CisgICAgICByZXR1cm4KKworICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoZ3Rlc3Rfc291cmNlX2ZpbGUpCisKKyAgICAjIFJlYWRzIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZ3Rlc3Qgc291cmNlIGZpbGUuCisgICAgZm9yIGxpbmUgaW4gZmlsZShvcy5wYXRoLmpvaW4oZ3Rlc3Rfcm9vdCwgZ3Rlc3Rfc291cmNlX2ZpbGUpLCAncicpOgorICAgICAgbSA9IElOQ0xVREVfR1RFU1RfRklMRV9SRUdFWC5tYXRjaChsaW5lKQorICAgICAgaWYgbToKKyAgICAgICAgaWYgJ2luY2x1ZGUvJyArIG0uZ3JvdXAoMSkgPT0gR1RFU1RfU1BJX0hfU0VFRDoKKyAgICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCInLiAgVGhpcyBmaWxlIGlzIG5vdAorICAgICAgICAgICMgI2luY2x1ZGVkIGJ5ICJndGVzdC9ndGVzdC5oIiwgc28gd2UgbmVlZCB0byBwcm9jZXNzIGl0LgorICAgICAgICAgIFByb2Nlc3NGaWxlKEdURVNUX1NQSV9IX1NFRUQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAiZ3Rlc3QvZm9vLmgiJyB3aGVyZSBmb28gaXMgbm90IGd0ZXN0LXNwaS4KKyAgICAgICAgICAjIFdlIHRyZWF0IGl0IGFzICcjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCInLCBhcyBhbGwgb3RoZXIKKyAgICAgICAgICAjIGd0ZXN0IGhlYWRlcnMgYXJlIGJlaW5nIGZ1c2VkIGludG8gZ3Rlc3QuaCBhbmQgY2Fubm90IGJlCisgICAgICAgICAgIyAjaW5jbHVkZWQgZGlyZWN0bHkuCisKKyAgICAgICAgICAjIFRoZXJlIGlzIG5vIG5lZWQgdG8gI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICAgIGlmIG5vdCBHVEVTVF9IX1NFRUQgaW4gcHJvY2Vzc2VkX2ZpbGVzOgorICAgICAgICAgICAgcHJvY2Vzc2VkX2ZpbGVzLmFkZChHVEVTVF9IX1NFRUQpCisgICAgICAgICAgICBvdXRwdXRfZmlsZS53cml0ZSgnI2luY2x1ZGUgIiVzIlxuJyAlIChHVEVTVF9IX09VVFBVVCwpKQorICAgICAgZWxzZToKKyAgICAgICAgbSA9IElOQ0xVREVfU1JDX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJzcmMvZm9vIicgLSBsZXQncyBwcm9jZXNzIGl0IHJlY3Vyc2l2ZWx5LgorICAgICAgICAgIFByb2Nlc3NGaWxlKG0uZ3JvdXAoMSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUobGluZSkKKworICBQcm9jZXNzRmlsZShHVEVTVF9BTExfQ0NfU0VFRCkKKworCitkZWYgRnVzZUdUZXN0QWxsQ2MoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2Rpcik6CisgICIiIlNjYW5zIGZvbGRlciBndGVzdF9yb290IHRvIGdlbmVyYXRlIGd0ZXN0L2d0ZXN0LWFsbC5jYyBpbiBvdXRwdXRfZGlyLiIiIgorCisgIG91dHB1dF9maWxlID0gZmlsZShvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgR1RFU1RfQUxMX0NDX09VVFBVVCksICd3JykKKyAgRnVzZUdUZXN0QWxsQ2NUb0ZpbGUoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2ZpbGUpCisgIG91dHB1dF9maWxlLmNsb3NlKCkKKworCitkZWYgRnVzZUdUZXN0KGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpOgorICAiIiJGdXNlcyBndGVzdC5oIGFuZCBndGVzdC1hbGwuY2MuIiIiCisKKyAgVmFsaWRhdGVHVGVzdFJvb3REaXIoZ3Rlc3Rfcm9vdCkKKyAgVmFsaWRhdGVPdXRwdXREaXIob3V0cHV0X2RpcikKKworICBGdXNlR1Rlc3RIKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpCisgIEZ1c2VHVGVzdEFsbENjKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpCisKKworZGVmIG1haW4oKToKKyAgYXJnYyA9IGxlbihzeXMuYXJndikKKyAgaWYgYXJnYyA9PSAyOgorICAgICMgZnVzZV9ndGVzdF9maWxlcy5weSBPVVRQVVRfRElSCisgICAgRnVzZUdUZXN0KERFRkFVTFRfR1RFU1RfUk9PVF9ESVIsIHN5cy5hcmd2WzFdKQorICBlbGlmIGFyZ2MgPT0gMzoKKyAgICAjIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgR1RFU1RfUk9PVF9ESVIgT1VUUFVUX0RJUgorICAgIEZ1c2VHVGVzdChzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0pCisgIGVsc2U6CisgICAgcHJpbnQgX19kb2NfXworICAgIHN5cy5leGl0KDEpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2NyaXB0cy9nZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlN2FiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weQpAQCAtMCwwICsxLDczMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSB2MC4xCisKK0dlbmVyYXRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgR29vZ2xlIFRlc3QgcHJlZGljYXRlIGFzc2VydGlvbnMgYW5kCithY2NvbXBhbnlpbmcgdGVzdHMuCisKK1VzYWdlOgorCisgIGdlbl9ndGVzdF9wcmVkX2ltcGwucHkgTUFYX0FSSVRZCisKK3doZXJlIE1BWF9BUklUWSBpcyBhIHBvc2l0aXZlIGludGVnZXIuCisKK1RoZSBjb21tYW5kIGdlbmVyYXRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdXAtdG8gTUFYX0FSSVRZLWFyeQorcHJlZGljYXRlIGFzc2VydGlvbnMsIGFuZCB3cml0ZXMgaXQgdG8gZmlsZSBndGVzdF9wcmVkX2ltcGwuaCBpbiB0aGUKK2RpcmVjdG9yeSB3aGVyZSB0aGUgc2NyaXB0IGlzLiAgSXQgYWxzbyBnZW5lcmF0ZXMgdGhlIGFjY29tcGFueWluZwordW5pdCB0ZXN0IGluIGZpbGUgZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworIyBXaGVyZSB0aGlzIHNjcmlwdCBpcy4KK1NDUklQVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pCisKKyMgV2hlcmUgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCBoZWFkZXIuCitIRUFERVIgPSBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgJy4uL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgnKQorCisjIFdoZXJlIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgdW5pdCB0ZXN0LgorVU5JVF9URVNUID0gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsICcuLi90ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYycpCisKKworZGVmIEhlYWRlclByZWFtYmxlKG4pOgorICAiIiJSZXR1cm5zIHRoZSBwcmVhbWJsZSBmb3IgdGhlIGhlYWRlciBmaWxlLgorCisgIEFyZ3M6CisgICAgbjogIHRoZSBtYXhpbXVtIGFyaXR5IG9mIHRoZSBwcmVkaWNhdGUgbWFjcm9zIHRvIGJlIGdlbmVyYXRlZC4KKyAgIiIiCisKKyAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSBwcmVhbWJsZSB0ZW1wbGF0ZS4KKyAgREVGUyA9IHsKKyAgICAndG9kYXknIDogdGltZS5zdHJmdGltZSgnJW0vJWQvJVknKSwKKyAgICAneWVhcicgOiB0aW1lLnN0cmZ0aW1lKCclWScpLAorICAgICdjb21tYW5kJyA6ICclcyAlcycgJSAob3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSksIG4pLAorICAgICduJyA6IG4KKyAgICB9CisKKyAgcmV0dXJuICgKKyIiIi8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIG9uICUodG9kYXkpcyBieSBjb21tYW5kCisvLyAnJShjb21tYW5kKXMnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBJbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKworLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyMgZXJyb3IgRG8gbm90IGluY2x1ZGUgZ3Rlc3RfcHJlZF9pbXBsLmggZGlyZWN0bHkuICBJbmNsdWRlIGd0ZXN0LmggaW5zdGVhZC4KKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbgorLy8gbWFjcm9zOgorLy8KKy8vICAgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZF9mb3JtYXQgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgdGFrZXMgbiAoaW4gdGhlCisvLyBjYXNlIG9mIEFTU0VSVF9QUkVEX0ZPUk1BVG4pIHZhbHVlcyBhbmQgdGhlaXIgc291cmNlIGV4cHJlc3Npb24KKy8vIHRleHQsIGFuZCByZXR1cm5zIGEgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LiAgU2VlIHRoZSBkZWZpbml0aW9uCisvLyBvZiBBU1NFUlRfRVEgaW4gZ3Rlc3QuaCBmb3IgYW4gZXhhbXBsZS4KKy8vCisvLyBJZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBmb3JtYXR0aW5nLCB5b3UgY2FuIHVzZSB0aGUgbW9yZQorLy8gcmVzdHJpY3RpdmUgdmVyc2lvbjoKKy8vCisvLyAgIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkKKy8vICAgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZCBpcyBhbiBuLWFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgcmV0dXJucyBib29sLAorLy8gYW5kIHRoZSB2YWx1ZXMgdjEsIHYyLCAuLi4sIG11c3Qgc3VwcG9ydCB0aGUgPDwgb3BlcmF0b3IgZm9yCisvLyBzdHJlYW1pbmcgdG8gc3RkOjpvc3RyZWFtLgorLy8KKy8vIFdlIGFsc28gZGVmaW5lIHRoZSBFWFBFQ1RfKiB2YXJpYXRpb25zLgorLy8KKy8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHByZWRpY2F0ZXMgd2hvc2UgYXJpdHkgaXMgYXQgbW9zdCAlKG4pcy4KKy8vIFBsZWFzZSBlbWFpbCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIHN1cHBvcnQgZm9yIGhpZ2hlciBhcml0aWVzLgorCisvLyBHVEVTVF9BU1NFUlRfIGlzIHRoZSBiYXNpYyBzdGF0ZW1lbnQgdG8gd2hpY2ggYWxsIG9mIHRoZSBhc3NlcnRpb25zCisvLyBpbiB0aGlzIGZpbGUgcmVkdWNlLiAgRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorCisjZGVmaW5lIEdURVNUX0FTU0VSVF8oZXhwcmVzc2lvbiwgb25fZmFpbHVyZSkgXFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gKGV4cHJlc3Npb24pKSBcXAorICAgIDsgXFwKKyAgZWxzZSBcXAorICAgIG9uX2ZhaWx1cmUoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpCisiIiIgJSBERUZTKQorCisKK2RlZiBBcml0eShuKToKKyAgIiIiUmV0dXJucyB0aGUgRW5nbGlzaCBuYW1lIG9mIHRoZSBnaXZlbiBhcml0eS4iIiIKKworICBpZiBuIDwgMDoKKyAgICByZXR1cm4gTm9uZQorICBlbGlmIG4gPD0gMzoKKyAgICByZXR1cm4gWydudWxsYXJ5JywgJ3VuYXJ5JywgJ2JpbmFyeScsICd0ZXJuYXJ5J11bbl0KKyAgZWxzZToKKyAgICByZXR1cm4gJyVzLWFyeScgJSBuCisKKworZGVmIFRpdGxlKHdvcmQpOgorICAiIiJSZXR1cm5zIHRoZSBnaXZlbiB3b3JkIGluIHRpdGxlIGNhc2UuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgIHRoaXMgYW5kIHN0cmluZydzIHRpdGxlKCkgbWV0aG9kIGlzIHRoYXQgVGl0bGUoJzQtYXJ5JykgaXMgJzQtYXJ5JworICB3aGlsZSAnNC1hcnknLnRpdGxlKCkgaXMgJzQtQXJ5Jy4iIiIKKworICByZXR1cm4gd29yZFswXS51cHBlcigpICsgd29yZFsxOl0KKworCitkZWYgT25lVG8obik6CisgICIiIlJldHVybnMgdGhlIGxpc3QgWzEsIDIsIDMsIC4uLiwgbl0uIiIiCisKKyAgcmV0dXJuIHJhbmdlKDEsIG4gKyAxKQorCisKK2RlZiBJdGVyKG4sIGZvcm1hdCwgc2VwPScnKToKKyAgIiIiR2l2ZW4gYSBwb3NpdGl2ZSBpbnRlZ2VyIG4sIGEgZm9ybWF0IHN0cmluZyB0aGF0IGNvbnRhaW5zIDAgb3IKKyAgbW9yZSAnJXMnIGZvcm1hdCBzcGVjcywgYW5kIG9wdGlvbmFsbHkgYSBzZXBhcmF0b3Igc3RyaW5nLCByZXR1cm5zCisgIHRoZSBqb2luIG9mIG4gc3RyaW5ncywgZWFjaCBmb3JtYXR0ZWQgd2l0aCB0aGUgZm9ybWF0IHN0cmluZyBvbiBhbgorICBpdGVyYXRvciByYW5nZWQgZnJvbSAxIHRvIG4uCisKKyAgRXhhbXBsZToKKworICBJdGVyKDMsICd2JXMnLCBzZXA9JywgJykgcmV0dXJucyAndjEsIHYyLCB2MycuCisgICIiIgorCisgICMgSG93IG1hbnkgJyVzJyBzcGVjcyBhcmUgaW4gZm9ybWF0PworICBzcGVjX2NvdW50ID0gbGVuKGZvcm1hdC5zcGxpdCgnJXMnKSkgLSAxCisgIHJldHVybiBzZXAuam9pbihbZm9ybWF0ICUgKHNwZWNfY291bnQgKiAoaSwpKSBmb3IgaSBpbiBPbmVUbyhuKV0pCisKKworZGVmIEltcGxlbWVudGF0aW9uRm9yQXJpdHkobik6CisgICIiIlJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIG4tYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgICMgQSBtYXAgdGhlIGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiB0ZW1wbGF0ZS4KKyAgREVGUyA9IHsKKyAgICAnbicgOiBzdHIobiksCisgICAgJ3ZzJyA6IEl0ZXIobiwgJ3YlcycsIHNlcD0nLCAnKSwKKyAgICAndnRzJyA6IEl0ZXIobiwgJyN2JXMnLCBzZXA9JywgJyksCisgICAgJ2FyaXR5JyA6IEFyaXR5KG4pLAorICAgICdBcml0eScgOiBUaXRsZShBcml0eShuKSkKKyAgICB9CisKKyAgaW1wbCA9ICIiIgorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRCUobilzLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkIiIiICUgREVGUworCisgIGltcGwgKz0gSXRlcihuLCAiIiIsCisgICAgICAgICAgdHlwZW5hbWUgVCVzIiIiKQorCisgIGltcGwgKz0gIiIiPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQlKG4pc0hlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQiIiIgJSBERUZTCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlJXMiIiIpCisKKyAgaW1wbCArPSAiIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkIiIiCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJXMmIHYlcyIiIikKKworICBpbXBsICs9ICIiIikgeworICBpZiAocHJlZCglKHZzKXMpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisiIiIgJSBERUZTCisKKyAgaW1wbCArPSAnICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCInCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUlcyIiIiwgc2VwPScgPDwgIiwgIicpCisKKyAgaW1wbCArPSAnIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiJworCisgIGltcGwgKz0gSXRlcihuLCAiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXFxuIiA8PCBlJXMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2JXMiIiIpCisKKyAgaW1wbCArPSAiIiI7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUJShuKXMuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUJShuKXNfKHByZWRfZm9ybWF0LCAlKHZzKXMsIG9uX2ZhaWx1cmUpXFwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCglKHZ0cylzLCAlKHZzKXMpLCBcXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQlKG4pcy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQlKG4pc18ocHJlZCwgJSh2cylzLCBvbl9mYWlsdXJlKVxcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkJShuKXNIZWxwZXIoI3ByZWQiIiIgJSBERUZTCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwgXFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2JXMiIiIpCisKKyAgaW1wbCArPSAiIiIsIFxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkIiIiCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwgXFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYlcyIiIikKKworICBpbXBsICs9ICIiIiksIG9uX2ZhaWx1cmUpCisKKy8vICUoQXJpdHkpcyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUJShuKXMocHJlZF9mb3JtYXQsICUodnMpcykgXFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQlKG4pc18ocHJlZF9mb3JtYXQsICUodnMpcywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEJShuKXMocHJlZCwgJSh2cylzKSBcXAorICBHVEVTVF9QUkVEJShuKXNfKHByZWQsICUodnMpcywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVCUobilzKHByZWRfZm9ybWF0LCAlKHZzKXMpIFxcCisgIEdURVNUX1BSRURfRk9STUFUJShuKXNfKHByZWRfZm9ybWF0LCAlKHZzKXMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRCUobilzKHByZWQsICUodnMpcykgXFwKKyAgR1RFU1RfUFJFRCUobilzXyhwcmVkLCAlKHZzKXMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisiIiIgJSBERUZTCisKKyAgcmV0dXJuIGltcGwKKworCitkZWYgSGVhZGVyUG9zdGFtYmxlKCk6CisgICIiIlJldHVybnMgdGhlIHBvc3RhbWJsZSBmb3IgdGhlIGhlYWRlciBmaWxlLiIiIgorCisgIHJldHVybiAiIiIKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworIiIiCisKKworZGVmIEdlbmVyYXRlRmlsZShwYXRoLCBjb250ZW50KToKKyAgIiIiR2l2ZW4gYSBmaWxlIHBhdGggYW5kIGEgY29udGVudCBzdHJpbmcsIG92ZXJ3cml0ZXMgaXQgd2l0aCB0aGUKKyAgZ2l2ZW4gY29udGVudC4iIiIKKworICBwcmludCAnVXBkYXRpbmcgZmlsZSAlcyAuIC4gLicgJSBwYXRoCisKKyAgZiA9IGZpbGUocGF0aCwgJ3crJykKKyAgcHJpbnQgPj5mLCBjb250ZW50LAorICBmLmNsb3NlKCkKKworICBwcmludCAnRmlsZSAlcyBoYXMgYmVlbiB1cGRhdGVkLicgJSBwYXRoCisKKworZGVmIEdlbmVyYXRlSGVhZGVyKG4pOgorICAiIiJHaXZlbiB0aGUgbWF4aW11bSBhcml0eSBuLCB1cGRhdGVzIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGltcGxlbWVudHMKKyAgdGhlIHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgIEdlbmVyYXRlRmlsZShIRUFERVIsCisgICAgICAgICAgICAgICBIZWFkZXJQcmVhbWJsZShuKQorICAgICAgICAgICAgICAgKyAnJy5qb2luKFtJbXBsZW1lbnRhdGlvbkZvckFyaXR5KGkpIGZvciBpIGluIE9uZVRvKG4pXSkKKyAgICAgICAgICAgICAgICsgSGVhZGVyUG9zdGFtYmxlKCkpCisKKworZGVmIFVuaXRUZXN0UHJlYW1ibGUoKToKKyAgIiIiUmV0dXJucyB0aGUgcHJlYW1ibGUgZm9yIHRoZSB1bml0IHRlc3QgZmlsZS4iIiIKKworICAjIEEgbWFwIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHByZWFtYmxlIHRlbXBsYXRlLgorICBERUZTID0geworICAgICd0b2RheScgOiB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWScpLAorICAgICd5ZWFyJyA6IHRpbWUuc3RyZnRpbWUoJyVZJyksCisgICAgJ2NvbW1hbmQnIDogJyVzICVzJyAlIChvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSwgc3lzLmFyZ3ZbMV0pLAorICAgIH0KKworICByZXR1cm4gKAorIiIiLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gJSh0b2RheSlzIGJ5IGNvbW1hbmQKKy8vICclKGNvbW1hbmQpcycuICBETyBOT1QgRURJVCBCWSBIQU5EIQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGd0ZXN0X3ByZWRfaW1wbC5oCisvLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIHNjcmlwdCBhbmQgcXVpdGUgbG9uZy4gIElmIHlvdSBpbnRlbmQgdG8KKy8vIGxlYXJuIGhvdyBHb29nbGUgVGVzdCB3b3JrcyBieSByZWFkaW5nIGl0cyB1bml0IHRlc3RzLCByZWFkCisvLyBndGVzdF91bml0dGVzdC5jYyBpbnN0ZWFkLgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBHb29nbGUgVGVzdCBwcmVkaWNhdGUKKy8vIGFzc2VydGlvbnMuICBXZSBjb21waWxlIGl0IGFzIHBhcnQgb2YgdGhlIGd0ZXN0X3VuaXR0ZXN0IHRhcmdldAorLy8gb25seSB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiB0aWR5IGFuZCBjb21wYWN0LCBhcyBpdCBpcyBxdWl0ZQorLy8gaW52b2x2ZWQgdG8gc2V0IHVwIHRoZSBzdGFnZSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCB1c2luZyBHb29nbGUKKy8vIFRlc3QgaXRzZWxmLgorLy8KKy8vIEN1cnJlbnRseSwgZ3Rlc3RfdW5pdHRlc3QgdGFrZXMgfjExIHNlY29uZHMgdG8gcnVuIGluIHRoZSB0ZXN0aW5nCisvLyBkYWVtb24uICBJbiB0aGUgZnV0dXJlLCBpZiBpdCBncm93cyB0b28gbGFyZ2UgYW5kIG5lZWRzIG11Y2ggbW9yZQorLy8gdGltZSB0byBmaW5pc2gsIHdlIHNob3VsZCBjb25zaWRlciBzZXBhcmF0aW5nIHRoaXMgZmlsZSBpbnRvIGEKKy8vIHN0YW5kLWFsb25lIHJlZ3Jlc3Npb24gdGVzdC4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gQSB1c2VyLWRlZmluZWQgZGF0YSB0eXBlLgorc3RydWN0IEJvb2wgeworICBleHBsaWNpdCBCb29sKGludCB2YWwpIDogdmFsdWUodmFsICE9IDApIHt9CisKKyAgYm9vbCBvcGVyYXRvcj4oaW50IG4pIGNvbnN0IHsgcmV0dXJuIHZhbHVlID4gQm9vbChuKS52YWx1ZTsgfQorCisgIEJvb2wgb3BlcmF0b3IrKGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gQm9vbCh2YWx1ZSArIHJocy52YWx1ZSk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQm9vbCYgcmhzKSBjb25zdCB7IHJldHVybiB2YWx1ZSA9PSByaHMudmFsdWU7IH0KKworICBib29sIHZhbHVlOworfTsKKworLy8gRW5hYmxlcyBCb29sIHRvIGJlIHVzZWQgaW4gYXNzZXJ0aW9ucy4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCb29sJiB4KSB7CisgIHJldHVybiBvcyA8PCAoeC52YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCisiIiIgJSBERUZTKQorCisKK2RlZiBUZXN0c0ZvckFyaXR5KG4pOgorICAiIiJSZXR1cm5zIHRoZSB0ZXN0cyBmb3Igbi1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuIiIiCisKKyAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzLgorICBERUZTID0geworICAgICduJyA6IG4sCisgICAgJ2VzJyA6IEl0ZXIobiwgJ2UlcycsIHNlcD0nLCAnKSwKKyAgICAndnMnIDogSXRlcihuLCAndiVzJywgc2VwPScsICcpLAorICAgICd2dHMnIDogSXRlcihuLCAnI3YlcycsIHNlcD0nLCAnKSwKKyAgICAndHZzJyA6IEl0ZXIobiwgJ1QlcyB2JXMnLCBzZXA9JywgJyksCisgICAgJ2ludF92cycgOiBJdGVyKG4sICdpbnQgdiVzJywgc2VwPScsICcpLAorICAgICdCb29sX3ZzJyA6IEl0ZXIobiwgJ0Jvb2wgdiVzJywgc2VwPScsICcpLAorICAgICd0eXBlcycgOiBJdGVyKG4sICd0eXBlbmFtZSBUJXMnLCBzZXA9JywgJyksCisgICAgJ3Zfc3VtJyA6IEl0ZXIobiwgJ3YlcycsIHNlcD0nICsgJyksCisgICAgJ2FyaXR5JyA6IEFyaXR5KG4pLAorICAgICdBcml0eScgOiBUaXRsZShBcml0eShuKSksCisgICAgfQorCisgIHRlc3RzID0gKAorIiIiLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyAlKGFyaXR5KXMgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgJShhcml0eSlzIHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDwlKHR5cGVzKXM+Citib29sIFByZWRGdW5jdGlvbiUobilzKCUodHZzKXMpIHsKKyAgcmV0dXJuICUodl9zdW0pcyA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbiUobilzSW50KCUoaW50X3ZzKXMpIHsKKyAgcmV0dXJuICUodl9zdW0pcyA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbiUobilzQm9vbCglKEJvb2xfdnMpcykgeworICByZXR1cm4gJSh2X3N1bSlzID4gMDsKK30KKyIiIiAlIERFRlMpCisKKyAgdGVzdHMgKz0gIiIiCisvLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvciUobilzIHsKKyAgdGVtcGxhdGUgPCUodHlwZXMpcz4KKyAgYm9vbCBvcGVyYXRvcigpKCIiIiAlIERFRlMKKworICB0ZXN0cyArPSBJdGVyKG4sICdjb25zdCBUJXMmIHYlcycsIHNlcD0iIiIsCisgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgdGVzdHMgKz0gIiIiKSB7CisgICAgcmV0dXJuICUodl9zdW0pcyA+IDA7CisgIH0KK307CisiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gIiIiCisvLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPCUodHlwZXMpcz4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24lKG4pcygiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnY29uc3QgY2hhciogZSVzJywgc2VwPSIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIikKKworICB0ZXN0cyArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQlcyYgdiVzIiIiKQorCisgIHRlc3RzICs9ICIiIikgeworICBpZiAoUHJlZEZ1bmN0aW9uJShuKXMoJSh2cylzKSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICIiIiAlIERFRlMKKworICB0ZXN0cyArPSBJdGVyKG4sICdlJXMnLCBzZXA9JyA8PCAiICsgIiA8PCAnKQorCisgIHRlc3RzICs9ICIiIgorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCAlKHZfc3VtKXMgPDwgIi4iOworfQorIiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorLy8gQSAlKGFyaXR5KXMgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yJShuKXMgeworICB0ZW1wbGF0ZSA8JSh0eXBlcylzPgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKSgiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnY29uc3QgY2hhciogZSVzJywgc2VwPSIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCisgIHRlc3RzICs9IEl0ZXIobiwgIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJXMmIHYlcyIiIikKKworICB0ZXN0cyArPSAiIiIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uJShuKXMoJShlcylzLCAlKHZzKXMpOworICB9Cit9OworIiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVCUobilzLgorCitjbGFzcyBQcmVkaWNhdGUlKG4pc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7IiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorICAgICIiIiArIEl0ZXIobiwgJ24lc18gPSAnKSArICIiIjA7CisgIH0KKyIiIgorCisgIHRlc3RzICs9ICIiIgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4iIiIKKworICB0ZXN0cyArPSAnJy5qb2luKFsiIiIKKyAgICBFWFBFQ1RfRVEoMSwgbiVzXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAlcyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsiIiIgJSAoaSwgaSArIDEpIGZvciBpIGluIE9uZVRvKG4pXSkKKworICB0ZXN0cyArPSAiIiIKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworIiIiICUgREVGUworCisgIHRlc3RzICs9IEl0ZXIobiwgIiIiCisgIHN0YXRpYyBpbnQgbiVzXzsiIiIpCisKKyAgdGVzdHMgKz0gIiIiCit9OworCitib29sIFByZWRpY2F0ZSUobilzVGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlJShuKXNUZXN0OjpmaW5pc2hlZF87CisiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAiIiJpbnQgUHJlZGljYXRlJSUobilzVGVzdDo6biVzXzsKKyIiIikgJSBERUZTCisKKyAgdGVzdHMgKz0gIiIiCit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQlKG4pc1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQlKG4pc1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBFWFBFQ1RfUFJFRCUobilzVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlJShuKXNUZXN0IEFTU0VSVF9QUkVEJShuKXNUZXN0OworIiIiICUgREVGUworCisgIGRlZiBHZW5UZXN0KHVzZV9mb3JtYXQsIHVzZV9hc3NlcnQsIGV4cGVjdF9mYWlsdXJlLAorICAgICAgICAgICAgICB1c2VfZnVuY3RvciwgdXNlX3VzZXJfdHlwZSk6CisgICAgIiIiUmV0dXJucyB0aGUgdGVzdCBmb3IgYSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3JvLgorCisgICAgQXJnczoKKyAgICAgIHVzZV9mb3JtYXQ6ICAgICB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEgKl9QUkVEX0ZPUk1BVCouCisgICAgICB1c2VfYXNzZXJ0OiAgICAgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhIEFTU0VSVF8qLgorICAgICAgZXhwZWN0X2ZhaWx1cmU6IHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgZXhwZWN0ZWQgdG8gZmFpbC4KKyAgICAgIHVzZV9mdW5jdG9yOiAgICB0cnVlIGlmZiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGFzc2VydGlvbiBpcworICAgICAgICAgICAgICAgICAgICAgIGEgZnVuY3RvciAoYXMgb3Bwb3NlZCB0byBhIGZ1bmN0aW9uKQorICAgICAgdXNlX3VzZXJfdHlwZTogIHRydWUgaWZmIHRoZSBwcmVkaWNhdGUgZnVuY3Rvci9mdW5jdGlvbiB0YWtlcworICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50KHMpIG9mIGEgdXNlci1kZWZpbmVkIHR5cGUuCisKKyAgICBFeGFtcGxlOgorCisgICAgICBHZW5UZXN0KDEsIDAsIDAsIDEsIDApIHJldHVybnMgYSB0ZXN0IHRoYXQgdGVzdHMgdGhlIGJlaGF2aW9yCisgICAgICBvZiBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUbigpIHRoYXQgdGFrZXMgYSBmdW5jdG9yCisgICAgICB3aG9zZSBhcmd1bWVudHMgaGF2ZSBidWlsdC1pbiB0eXBlcy4iIiIKKworICAgIGlmIHVzZV9hc3NlcnQ6CisgICAgICBhc3NydCA9ICdBU1NFUlQnICAjICdhc3NlcnQnIGlzIHJlc2VydmVkLCBzbyB3ZSBjYW5ub3QgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoYXQgaWRlbnRpZmllciBoZXJlLgorICAgIGVsc2U6CisgICAgICBhc3NydCA9ICdFWFBFQ1QnCisKKyAgICBhc3NlcnRpb24gPSBhc3NydCArICdfUFJFRCcKKworICAgIGlmIHVzZV9mb3JtYXQ6CisgICAgICBwcmVkX2Zvcm1hdCA9ICdQcmVkRm9ybWF0JworICAgICAgYXNzZXJ0aW9uICs9ICdfRk9STUFUJworICAgIGVsc2U6CisgICAgICBwcmVkX2Zvcm1hdCA9ICdQcmVkJworCisgICAgYXNzZXJ0aW9uICs9ICclKG4pcycgJSBERUZTCisKKyAgICBpZiB1c2VfZnVuY3RvcjoKKyAgICAgIHByZWRfZm9ybWF0X3R5cGUgPSAnZnVuY3RvcicKKyAgICAgIHByZWRfZm9ybWF0ICs9ICdGdW5jdG9yJShuKXMoKScKKyAgICBlbHNlOgorICAgICAgcHJlZF9mb3JtYXRfdHlwZSA9ICdmdW5jdGlvbicKKyAgICAgIHByZWRfZm9ybWF0ICs9ICdGdW5jdGlvbiUobilzJworICAgICAgaWYgbm90IHVzZV9mb3JtYXQ6CisgICAgICAgIGlmIHVzZV91c2VyX3R5cGU6CisgICAgICAgICAgcHJlZF9mb3JtYXQgKz0gJ0Jvb2wnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJlZF9mb3JtYXQgKz0gJ0ludCcKKworICAgIHRlc3RfbmFtZSA9IHByZWRfZm9ybWF0X3R5cGUudGl0bGUoKQorCisgICAgaWYgdXNlX3VzZXJfdHlwZToKKyAgICAgIGFyZ190eXBlID0gJ3VzZXItZGVmaW5lZCB0eXBlIChCb29sKScKKyAgICAgIHRlc3RfbmFtZSArPSAnT25Vc2VyVHlwZScKKyAgICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgICBhcmcgPSAnQm9vbChuJXNfKyspJworICAgICAgZWxzZToKKyAgICAgICAgYXJnID0gJ0Jvb2woKytuJXNfKScKKyAgICBlbHNlOgorICAgICAgYXJnX3R5cGUgPSAnYnVpbHQtaW4gdHlwZSAoaW50KScKKyAgICAgIHRlc3RfbmFtZSArPSAnT25CdWlsdEluVHlwZScKKyAgICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgICBhcmcgPSAnbiVzXysrJworICAgICAgZWxzZToKKyAgICAgICAgYXJnID0gJysrbiVzXycKKworICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgc3VjY2Vzc2Z1bF9vcl9mYWlsZWQgPSAnZmFpbGVkJworICAgICAgZXhwZWN0ZWRfb3Jfbm90ID0gJ2V4cGVjdGVkLicKKyAgICAgIHRlc3RfbmFtZSArPSAgJ0ZhaWx1cmUnCisgICAgZWxzZToKKyAgICAgIHN1Y2Nlc3NmdWxfb3JfZmFpbGVkID0gJ3N1Y2Nlc3NmdWwnCisgICAgICBleHBlY3RlZF9vcl9ub3QgPSAnVU5FWFBFQ1RFRCEnCisgICAgICB0ZXN0X25hbWUgKz0gICdTdWNjZXNzJworCisgICAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSB0ZXN0IHRlbXBsYXRlLgorICAgIGRlZnMgPSBERUZTLmNvcHkoKQorICAgIGRlZnMudXBkYXRlKHsKKyAgICAgICdhc3NlcnQnIDogYXNzcnQsCisgICAgICAnYXNzZXJ0aW9uJyA6IGFzc2VydGlvbiwKKyAgICAgICd0ZXN0X25hbWUnIDogdGVzdF9uYW1lLAorICAgICAgJ3BmX3R5cGUnIDogcHJlZF9mb3JtYXRfdHlwZSwKKyAgICAgICdwZicgOiBwcmVkX2Zvcm1hdCwKKyAgICAgICdhcmdfdHlwZScgOiBhcmdfdHlwZSwKKyAgICAgICdhcmcnIDogYXJnLAorICAgICAgJ3N1Y2Nlc3NmdWwnIDogc3VjY2Vzc2Z1bF9vcl9mYWlsZWQsCisgICAgICAnZXhwZWN0ZWQnIDogZXhwZWN0ZWRfb3Jfbm90LAorICAgICAgfSkKKworICAgIHRlc3QgPSAiIiIKKy8vIFRlc3RzIGEgJShzdWNjZXNzZnVsKXMgJShhc3NlcnRpb24pcyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSAlKHBmX3R5cGUpcyBvbiBhICUoYXJnX3R5cGUpcy4KK1RFU1RfRiglKGFzc2VydGlvbilzVGVzdCwgJSh0ZXN0X25hbWUpcykgeyIiIiAlIGRlZnMKKworICAgIGluZGVudCA9IChsZW4oYXNzZXJ0aW9uKSArIDMpKicgJworICAgIGV4dHJhX2luZGVudCA9ICcnCisKKyAgICBpZiBleHBlY3RfZmFpbHVyZToKKyAgICAgIGV4dHJhX2luZGVudCA9ICcgICcKKyAgICAgIGlmIHVzZV9hc3NlcnQ6CisgICAgICAgIHRlc3QgKz0gIiIiCisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UIiIiCisgICAgICBlbHNlOgorICAgICAgICB0ZXN0ICs9ICIiIgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQiIiIKKworICAgIHRlc3QgKz0gJ1xuJyArIGV4dHJhX2luZGVudCArICIiIiAgJShhc3NlcnRpb24pcyglKHBmKXMiIiIgJSBkZWZzCisKKyAgICB0ZXN0ID0gdGVzdCAlIGRlZnMKKyAgICB0ZXN0ICs9IEl0ZXIobiwgJyxcbicgKyBpbmRlbnQgKyBleHRyYV9pbmRlbnQgKyAnJShhcmcpcycgJSBkZWZzKQorICAgIHRlc3QgKz0gJyk7XG4nICsgZXh0cmFfaW5kZW50ICsgJyAgZmluaXNoZWRfID0gdHJ1ZTtcbicKKworICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgdGVzdCArPSAnICB9LCAiIik7XG4nCisKKyAgICB0ZXN0ICs9ICd9XG4nCisgICAgcmV0dXJuIHRlc3QKKworICAjIEdlbmVyYXRlcyB0ZXN0cyBmb3IgYWxsIDIqKjYgPSA2NCBjb21iaW5hdGlvbnMuCisgIHRlc3RzICs9ICcnLmpvaW4oW0dlblRlc3QodXNlX2Zvcm1hdCwgdXNlX2Fzc2VydCwgZXhwZWN0X2ZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2Z1bmN0b3IsIHVzZV91c2VyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIGZvciB1c2VfZm9ybWF0IGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX2Fzc2VydCBpbiBbMCwgMV0KKyAgICAgICAgICAgICAgICAgICAgZm9yIGV4cGVjdF9mYWlsdXJlIGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX2Z1bmN0b3IgaW4gWzAsIDFdCisgICAgICAgICAgICAgICAgICAgIGZvciB1c2VfdXNlcl90eXBlIGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBdKQorCisgIHJldHVybiB0ZXN0cworCisKK2RlZiBVbml0VGVzdFBvc3RhbWJsZSgpOgorICAiIiJSZXR1cm5zIHRoZSBwb3N0YW1ibGUgZm9yIHRoZSB0ZXN0cy4iIiIKKworICByZXR1cm4gJycKKworCitkZWYgR2VuZXJhdGVVbml0VGVzdChuKToKKyAgIiIiUmV0dXJucyB0aGUgdGVzdHMgZm9yIHVwLXRvIG4tYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgIEdlbmVyYXRlRmlsZShVTklUX1RFU1QsCisgICAgICAgICAgICAgICBVbml0VGVzdFByZWFtYmxlKCkKKyAgICAgICAgICAgICAgICsgJycuam9pbihbVGVzdHNGb3JBcml0eShpKSBmb3IgaSBpbiBPbmVUbyhuKV0pCisgICAgICAgICAgICAgICArIFVuaXRUZXN0UG9zdGFtYmxlKCkpCisKKworZGVmIF9NYWluKCk6CisgICIiIlRoZSBlbnRyeSBwb2ludCBvZiB0aGUgc2NyaXB0LiAgR2VuZXJhdGVzIHRoZSBoZWFkZXIgZmlsZSBhbmQgaXRzCisgIHVuaXQgdGVzdC4iIiIKKworICBpZiBsZW4oc3lzLmFyZ3YpICE9IDI6CisgICAgcHJpbnQgX19kb2NfXworICAgIHByaW50ICdBdXRob3I6ICcgKyBfX2F1dGhvcl9fCisgICAgc3lzLmV4aXQoMSkKKworICBuID0gaW50KHN5cy5hcmd2WzFdKQorICBHZW5lcmF0ZUhlYWRlcihuKQorICBHZW5lcmF0ZVVuaXRUZXN0KG4pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgX01haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zY3JpcHRzL2d0ZXN0LWNvbmZpZy5pbiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2NyaXB0cy9ndGVzdC1jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM3MjYzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2NyaXB0cy9ndGVzdC1jb25maWcuaW4KQEAgLTAsMCArMSwyNzQgQEAKKyMhL2Jpbi9zaAorCisjIFRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCituYW1lPSJAUEFDS0FHRV9UQVJOQU1FQCIKK3ZlcnNpb249IkBQQUNLQUdFX1ZFUlNJT05AIgorCitzaG93X3VzYWdlKCkKK3sKKyAgZWNobyAiVXNhZ2U6IGd0ZXN0LWNvbmZpZyBbT1BUSU9OUy4uLl0iCit9CisKK3Nob3dfaGVscCgpCit7CisgIHNob3dfdXNhZ2UKKyAgY2F0IDw8XEVPRgorCitUaGUgYGd0ZXN0LWNvbmZpZycgc2NyaXB0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbmVjZXNzYXJ5IGNvbXBpbGUgYW5kIGxpbmtpbmcKK2ZsYWdzIHRvIGNvbm5lY3Qgd2l0aCBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLCBib3RoIGluIGEgYnVpbGQgcHJpb3IgdG8KK2luc3RhbGxhdGlvbiwgYW5kIG9uIHRoZSBzeXN0ZW0gcHJvcGVyIGFmdGVyIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbgorb3ZlcnJpZGVzIG1heSBiZSBpc3N1ZWQgaW4gY29tYmluYXRpb24gd2l0aCBhbnkgb3RoZXIgcXVlcmllcywgYnV0IHdpbGwgb25seQorYWZmZWN0IGluc3RhbGxhdGlvbiBxdWVyaWVzIGlmIGNhbGxlZCBvbiBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIGd0ZXN0LiBUaGUKK2luc3RhbGxhdGlvbiBxdWVyaWVzIG1heSBub3QgYmUgaXNzdWVkIHdpdGggYW55IG90aGVyIHR5cGVzIG9mIHF1ZXJpZXMsIGFuZAorb25seSBvbmUgaW5zdGFsbGF0aW9uIHF1ZXJ5IG1heSBiZSBtYWRlIGF0IGEgdGltZS4gVGhlIHZlcnNpb24gcXVlcmllcyBhbmQKK2NvbXBpbGVyIGZsYWcgcXVlcmllcyBtYXkgYmUgY29tYmluZWQgYXMgZGVzaXJlZCBidXQgbm90IG1peGVkLiBEaWZmZXJlbnQKK3ZlcnNpb24gcXVlcmllcyBhcmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggbG9naWNhbCAiYW5kIiBzZW1hbnRpY3MsIGFuZCBvbmx5IHRoZQorbGFzdCBvZiBhbnkgcGFydGljdWxhciBxdWVyeSBpcyB1c2VkIHdoaWxlIGFsbCBwcmV2aW91cyBvbmVzIGlnbm9yZWQuIEFsbAordmVyc2lvbnMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIHNlcGFyYXRlZCBieSBwZXJpb2RzLgorQ29tcGlsZXIgZmxhZyBxdWVyaWVzIG91dHB1dCB0aGUgdW5pb24gb2YgdGhlIHNldHMgb2YgZmxhZ3Mgd2hlbiBjb21iaW5lZC4KKworIEV4YW1wbGVzOgorICBndGVzdC1jb25maWcgLS1taW4tdmVyc2lvbj0xLjAgfHwgZWNobyAiSW5zdWZmaWNpZW50IEdvb2dsZSBUZXN0IHZlcnNpb24uIgorCisgIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWNwcGZsYWdzIC0tY3h4ZmxhZ3MpIC1vIGZvby5vIC1jIGZvby5jcHAKKyAgZysrICQoZ3Rlc3QtY29uZmlnIC0tbGRmbGFncyAtLWxpYnMpIC1vIGZvbyBmb28ubworCisgICMgV2hlbiB1c2luZyBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIEdvb2dsZSBUZXN0OgorICBnKysgJCguLi8uLi9teV9ndGVzdF9idWlsZC9zY3JpcHRzL2d0ZXN0LWNvbmZpZyAuLi4pIC4uLgorCisgICMgV2hlbiB1c2luZyBhbiBpbnN0YWxsZWQgR29vZ2xlIFRlc3QsIGJ1dCB3aXRoIGluc3RhbGxhdGlvbiBvdmVycmlkZXM6CisgIGV4cG9ydCBHVEVTVF9QUkVGSVg9Ii9vcHQiCisgIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWxpYmRpcj0iL29wdC9saWI2NCIgLi4uKSAuLi4KKworIEhlbHA6CisgIC0tdXNhZ2UgICAgICAgICAgICAgICAgICAgIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UKKworIEluc3RhbGxhdGlvbiBPdmVycmlkZXM6CisgIC0tcHJlZml4PTxkaXI+ICAgICAgICAgICAgIG92ZXJyaWRlcyB0aGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWV4ZWMtcHJlZml4PTxkaXI+ICAgICAgICBvdmVycmlkZXMgdGhlIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWxpYmRpcj08ZGlyPiAgICAgICAgICAgICBvdmVycmlkZXMgdGhlIGxpYnJhcnkgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWluY2x1ZGVkaXI9PGRpcj4gICAgICAgICBvdmVycmlkZXMgdGhlIGhlYWRlciBmaWxlIGluc3RhbGxhdGlvbiBwcmVmaXgKKworIEluc3RhbGxhdGlvbiBRdWVyaWVzOgorICAtLXByZWZpeCAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24gcHJlZml4CisgIC0tZXhlYy1wcmVmaXggICAgICAgICAgICAgIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWxpYmRpciAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKKyAgLS1pbmNsdWRlZGlyICAgICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQorICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFRlc3QgaW5zdGFsbGF0aW9uCisKKyBWZXJzaW9uIFF1ZXJpZXM6CisgIC0tbWluLXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IGxlYXN0IFZFUlNJT04KKyAgLS1leGFjdC12ZXJzaW9uPVZFUlNJT04gICAgcmV0dXJuIDAgaWYgdGhlIHZlcnNpb24gaXMgZXhhY3RseSBWRVJTSU9OCisgIC0tbWF4LXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IG1vc3QgVkVSU0lPTgorCisgQ29tcGlsYXRpb24gRmxhZyBRdWVyaWVzOgorICAtLWNwcGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIHNwZWNpZmljIHRvIHRoZSBDLWxpa2UgcHJlcHJvY2Vzc29ycworICAtLWN4eGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIGFwcHJvcHJpYXRlIGZvciBDKysgcHJvZ3JhbXMKKyAgLS1sZGZsYWdzICAgICAgICAgICAgICAgICAgbGlua2VyIGZsYWdzCisgIC0tbGlicyAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyBmb3IgbGlua2luZworCitFT0YKK30KKworIyBUaGlzIGZ1bmN0aW9uIGJvdW5kcyBvdXIgdmVyc2lvbiB3aXRoIGEgbWluIGFuZCBhIG1heC4gSXQgdXNlcyBzb21lIGNsZXZlcgorIyBQT1NJWC1jb21wbGlhbnQgdmFyaWFibGUgZXhwYW5zaW9uIHRvIHBvcnRhYmx5IGRvIGFsbCB0aGUgd29yayBpbiB0aGUgc2hlbGwKKyMgYW5kIGF2b2lkIGFueSBkZXBlbmRlbmN5IG9uIGEgcGFydGljdWxhciAic2VkIiBvciAiYXdrIiBpbXBsZW1lbnRhdGlvbi4KKyMgTm90YWJsZSBpcyB0aGF0IGl0IHdpbGwgb25seSBldmVyIGNvbXBhcmUgdGhlIGZpcnN0IDMgY29tcG9uZW50cyBvZiB2ZXJzaW9ucy4KKyMgRnVydGhlciBjb21wb25lbnRzIHdpbGwgYmUgY2xlYW5seSBzdHJpcHBlZCBvZmYuIEFsbCB2ZXJzaW9ucyBtdXN0IGJlCisjIHVuYWRvcm5lZCwgc28gInYxLjAiIHdpbGwgKm5vdCogd29yay4gVGhlIG1pbmltdW0gdmVyc2lvbiBtdXN0IGJlIGluICQxLCBhbmQKKyMgdGhlIG1heCBpbiAkMi4gVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IElmIHRoaXMgZXZlciBicmVha3MsIHdlIHNob3VsZAorIyBpbnZlc3RpZ2F0ZSBleHBhbmRpbmcgdGhpcyB2aWEgYXV0b200dGUgZnJvbSBBU19WRVJTSU9OX0NPTVBBUkUgcmF0aGVyIHRoYW4KKyMgY29udGludWluZyB0byBtYWludGFpbiBvdXIgb3duIHNoZWxsIHZlcnNpb24uCitjaGVja192ZXJzaW9ucygpCit7CisgIG1ham9yX3ZlcnNpb249JHt2ZXJzaW9uJSUuKn0KKyAgbWlub3JfdmVyc2lvbj0iMCIKKyAgcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHt2ZXJzaW9uIyoufSIgIT0gIiR7dmVyc2lvbn0iOyB0aGVuCisgICAgbWlub3JfdmVyc2lvbj0ke3ZlcnNpb24jKi59CisgICAgbWlub3JfdmVyc2lvbj0ke21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke3ZlcnNpb24jKi4qLn0iICE9ICIke3ZlcnNpb259IjsgdGhlbgorICAgIHBvaW50X3ZlcnNpb249JHt2ZXJzaW9uIyouKi59CisgICAgcG9pbnRfdmVyc2lvbj0ke3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIG1pbl92ZXJzaW9uPSIkMSIKKyAgbWluX21ham9yX3ZlcnNpb249JHttaW5fdmVyc2lvbiUlLip9CisgIG1pbl9taW5vcl92ZXJzaW9uPSIwIgorICBtaW5fcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHttaW5fdmVyc2lvbiMqLn0iICE9ICIke21pbl92ZXJzaW9ufSI7IHRoZW4KKyAgICBtaW5fbWlub3JfdmVyc2lvbj0ke21pbl92ZXJzaW9uIyoufQorICAgIG1pbl9taW5vcl92ZXJzaW9uPSR7bWluX21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke21pbl92ZXJzaW9uIyouKi59IiAhPSAiJHttaW5fdmVyc2lvbn0iOyB0aGVuCisgICAgbWluX3BvaW50X3ZlcnNpb249JHttaW5fdmVyc2lvbiMqLioufQorICAgIG1pbl9wb2ludF92ZXJzaW9uPSR7bWluX3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIG1heF92ZXJzaW9uPSIkMiIKKyAgbWF4X21ham9yX3ZlcnNpb249JHttYXhfdmVyc2lvbiUlLip9CisgIG1heF9taW5vcl92ZXJzaW9uPSIwIgorICBtYXhfcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHttYXhfdmVyc2lvbiMqLn0iICE9ICIke21heF92ZXJzaW9ufSI7IHRoZW4KKyAgICBtYXhfbWlub3JfdmVyc2lvbj0ke21heF92ZXJzaW9uIyoufQorICAgIG1heF9taW5vcl92ZXJzaW9uPSR7bWF4X21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke21heF92ZXJzaW9uIyouKi59IiAhPSAiJHttYXhfdmVyc2lvbn0iOyB0aGVuCisgICAgbWF4X3BvaW50X3ZlcnNpb249JHttYXhfdmVyc2lvbiMqLioufQorICAgIG1heF9wb2ludF92ZXJzaW9uPSR7bWF4X3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSkgJiYgZXhpdCAxCisgIGlmIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSk7IHRoZW4KKyAgICB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fbWlub3JfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGlmIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9taW5vcl92ZXJzaW9uKSk7IHRoZW4KKyAgICAgIHRlc3QgJCgoJHBvaW50X3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9wb2ludF92ZXJzaW9uKSkgJiYgZXhpdCAxCisgICAgZmkKKyAgZmkKKworICB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpICYmIGV4aXQgMQorICBpZiB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpOyB0aGVuCisgICAgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1ndCAkKCgkbWF4X21pbm9yX3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgICBpZiB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWlub3JfdmVyc2lvbikpOyB0aGVuCisgICAgICB0ZXN0ICQoKCRwb2ludF92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfcG9pbnRfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgZXhpdCAwCit9CisKKyMgU2hvdyB0aGUgdXNhZ2UgbGluZSB3aGVuIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLgoraWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBzaG93X3VzYWdlCisgIGV4aXQgMQorZmkKKword2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdXNhZ2UpICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAwOzsKKyAgICAtLWhlbHApICAgICAgICAgICBzaG93X2hlbHA7ICAgICAgICAgIGV4aXQgMDs7CisKKyAgICAjIEluc3RhbGxhdGlvbiBvdmVycmlkZXMKKyAgICAtLXByZWZpeD0qKSAgICAgICBHVEVTVF9QUkVGSVg9JHsxIy0tcHJlZml4PX07OworICAgIC0tZXhlYy1wcmVmaXg9KikgIEdURVNUX0VYRUNfUFJFRklYPSR7MSMtLWV4ZWMtcHJlZml4PX07OworICAgIC0tbGliZGlyPSopICAgICAgIEdURVNUX0xJQkRJUj0kezEjLS1saWJkaXI9fTs7CisgICAgLS1pbmNsdWRlZGlyPSopICAgR1RFU1RfSU5DTFVERURJUj0kezEjLS1pbmNsdWRlZGlyPX07OworCisgICAgIyBJbnN0YWxsYXRpb24gcXVlcmllcworICAgIC0tcHJlZml4fC0tZXhlYy1wcmVmaXh8LS1saWJkaXJ8LS1pbmNsdWRlZGlyfC0tdmVyc2lvbikKKyAgICAgIGlmIHRlc3QgLW4gIiR7ZG9fcXVlcnl9IjsgdGhlbgorICAgICAgICBzaG93X3VzYWdlCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKyAgICAgIGRvX3F1ZXJ5PSR7MSMtLX0KKyAgICAgIDs7CisKKyAgICAjIFZlcnNpb24gY2hlY2tpbmcKKyAgICAtLW1pbi12ZXJzaW9uPSopCisgICAgICBkb19jaGVja192ZXJzaW9ucz15ZXMKKyAgICAgIG1pbl92ZXJzaW9uPSR7MSMtLW1pbi12ZXJzaW9uPX0KKyAgICAgIDs7CisgICAgLS1tYXgtdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBtYXhfdmVyc2lvbj0kezEjLS1tYXgtdmVyc2lvbj19CisgICAgICA7OworICAgIC0tZXhhY3QtdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBleGFjdF92ZXJzaW9uPSR7MSMtLWV4YWN0LXZlcnNpb249fQorICAgICAgOzsKKworICAgICMgQ29tcGlsZXIgZmxhZyBvdXRwdXQKKyAgICAtLWNwcGZsYWdzKSAgICAgICBlY2hvX2NwcGZsYWdzPXllczs7CisgICAgLS1jeHhmbGFncykgICAgICAgZWNob19jeHhmbGFncz15ZXM7OworICAgIC0tbGRmbGFncykgICAgICAgIGVjaG9fbGRmbGFncz15ZXM7OworICAgIC0tbGlicykgICAgICAgICAgIGVjaG9fbGlicz15ZXM7OworCisgICAgIyBFdmVyeXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IKKyAgICAqKSAgICAgICAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMTs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworIyBUaGVzZSBoYXZlIGRlZmF1bHRzIGZpbGxlZCBpbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBidXQgY2FuIGFsc28gYmUKKyMgb3ZlcnJpZGRlbiBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCitwcmVmaXg9IiR7R1RFU1RfUFJFRklYOi1AcHJlZml4QH0iCitleGVjX3ByZWZpeD0iJHtHVEVTVF9FWEVDX1BSRUZJWDotQGV4ZWNfcHJlZml4QH0iCitsaWJkaXI9IiR7R1RFU1RfTElCRElSOi1AbGliZGlyQH0iCitpbmNsdWRlZGlyPSIke0dURVNUX0lOQ0xVREVESVI6LUBpbmNsdWRlZGlyQH0iCisKKyMgV2UgdHJ5IGFuZCBkZXRlY3QgaWYgb3VyIGJpbmFyeSBpcyBub3QgbG9jYXRlZCBhdCBpdHMgaW5zdGFsbGVkIGxvY2F0aW9uLiBJZgorIyBpdCdzIG5vdCwgd2UgcHJvdmlkZSB2YXJpYWJsZXMgcG9pbnRpbmcgdG8gdGhlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZSByYXRoZXIKKyMgdGhhbiB0byB0aGUgaW5zdGFsbCB0cmVlLiBUaGlzIGFsbG93cyBidWlsZGluZyBhZ2FpbnN0IGEganVzdC1idWlsdCBndGVzdAorIyByYXRoZXIgdGhhbiBhbiBpbnN0YWxsZWQgZ3Rlc3QuCitiaW5kaXI9IkBiaW5kaXJAIgordGhpc19yZWxhdGl2ZV9iaW5kaXI9YGRpcm5hbWUgJDBgCit0aGlzX2JpbmRpcj1gY2QgJHt0aGlzX3JlbGF0aXZlX2JpbmRpcn07IHB3ZCAtUGAKK2lmIHRlc3QgIiR7dGhpc19iaW5kaXJ9IiA9ICIke3RoaXNfYmluZGlyJSR7YmluZGlyfX0iOyB0aGVuCisgICMgVGhlIHBhdGggdG8gdGhlIHNjcmlwdCBkb2Vzbid0IGVuZCBpbiB0aGUgYmluZGlyIHNlcXVlbmNlIGZyb20gQXV0b2NvbmYsCisgICMgYXNzdW1lIHRoYXQgd2UgYXJlIGluIGEgYnVpbGQgdHJlZS4KKyAgYnVpbGRfZGlyPWBkaXJuYW1lICR7dGhpc19iaW5kaXJ9YAorICBzcmNfZGlyPWBjZCAke3RoaXNfYmluZGlyfS9AdG9wX3NyY2RpckA7IHB3ZCAtUGAKKworICAjIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBUaGlzIGlzIGEgZGFuZ2Vyb3VzIGRlcGVuZGVuY3kgb24gbGlidG9vbCwgd2UKKyAgIyBzaG91bGQgd29yayB0byByZW1vdmUgaXQsIGFuZC9vciByZW1vdmUgbGlidG9vbCBhbHRvZ2V0aGVyLCByZXBsYWNpbmcgaXQKKyAgIyB3aXRoIGRpcmVjdCByZWZlcmVuY2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCBhIGxpbmsgcGF0aC4KKyAgZ3Rlc3RfbGlicz0iJHtidWlsZF9kaXJ9L2xpYi9saWJndGVzdC5sYSBAUFRIUkVBRF9DRkxBR1NAIEBQVEhSRUFEX0xJQlNAIgorICBndGVzdF9sZGZsYWdzPSIiCisKKyAgIyBXZSBwcm92aWRlIGhvb2tzIHRvIGluY2x1ZGUgZnJvbSBlaXRoZXIgdGhlIHNvdXJjZSBvciBidWlsZCBkaXIsIHdoZXJlIHRoZQorICAjIGJ1aWxkIGRpciBpcyBhbHdheXMgcHJlZmVycmVkLiBUaGlzIHdpbGwgcG90ZW50aWFsbHkgYWxsb3cgdXMgdG8gd3JpdGUKKyAgIyBidWlsZCBydWxlcyBmb3IgZ2VuZXJhdGVkIGhlYWRlcnMgYW5kIGhhdmUgdGhlbSBhdXRvbWF0aWNhbGx5IGJlIHByZWZlcnJlZAorICAjIG92ZXIgcHJvdmlkZWQgdmVyc2lvbnMuCisgIGd0ZXN0X2NwcGZsYWdzPSItSSR7YnVpbGRfZGlyfS9pbmNsdWRlIC1JJHtzcmNfZGlyfS9pbmNsdWRlIgorICBndGVzdF9jeHhmbGFncz0iQFBUSFJFQURfQ0ZMQUdTQCIKK2Vsc2UKKyAgIyBXZSdyZSB1c2luZyBhbiBpbnN0YWxsZWQgZ3Rlc3QsIGFsdGhvdWdoIGl0IG1heSBiZSBzdGFnZWQgdW5kZXIgc29tZQorICAjIHByZWZpeC4gQXNzdW1lIChhcyBvdXIgb3duIGxpYnJhcmllcyBkbykgdGhhdCB3ZSBjYW4gcmVzb2x2ZSB0aGUgcHJlZml4LAorICAjIGFuZCBhcmUgcHJlc2VudCBpbiB0aGUgZHluYW1pYyBsaW5rIHBhdGhzLgorICBndGVzdF9sZGZsYWdzPSItTCR7bGliZGlyfSIKKyAgZ3Rlc3RfbGlicz0iLWwke25hbWV9IEBQVEhSRUFEX0NGTEFHU0AgQFBUSFJFQURfTElCU0AiCisgIGd0ZXN0X2NwcGZsYWdzPSItSSR7aW5jbHVkZWRpcn0iCisgIGd0ZXN0X2N4eGZsYWdzPSJAUFRIUkVBRF9DRkxBR1NAIgorZmkKKworIyBEbyBhbiBpbnN0YWxsYXRpb24gcXVlcnkgaWYgcmVxdWVzdGVkLgoraWYgdGVzdCAtbiAiJGRvX3F1ZXJ5IjsgdGhlbgorICBjYXNlICRkb19xdWVyeSBpbgorICAgIHByZWZpeCkgICAgICAgICAgIGVjaG8gJHByZWZpeDsgICAgICAgZXhpdCAwOzsKKyAgICBleGVjLXByZWZpeCkgICAgICBlY2hvICRleGVjX3ByZWZpeDsgIGV4aXQgMDs7CisgICAgbGliZGlyKSAgICAgICAgICAgZWNobyAkbGliZGlyOyAgICAgICBleGl0IDA7OworICAgIGluY2x1ZGVkaXIpICAgICAgIGVjaG8gJGluY2x1ZGVkaXI7ICAgZXhpdCAwOzsKKyAgICB2ZXJzaW9uKSAgICAgICAgICBlY2hvICR2ZXJzaW9uOyAgICAgIGV4aXQgMDs7CisgICAgKikgICAgICAgICAgICAgICAgc2hvd191c2FnZTsgICAgICAgICBleGl0IDE7OworICBlc2FjCitmaQorCisjIERvIGEgdmVyc2lvbiBjaGVjayBpZiByZXF1ZXN0ZWQuCitpZiB0ZXN0ICIkZG9fY2hlY2tfdmVyc2lvbnMiID0gInllcyI7IHRoZW4KKyAgIyBNYWtlIHN1cmUgd2UgZGlkbid0IHJlY2VpdmUgYSBiYWQgY29tYmluYXRpb24gb2YgcGFyYW1ldGVycy4KKyAgdGVzdCAiJGVjaG9fY3BwZmxhZ3MiID0gInllcyIgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKyAgdGVzdCAiJGVjaG9fY3h4ZmxhZ3MiID0gInllcyIgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKyAgdGVzdCAiJGVjaG9fbGRmbGFncyIgPSAieWVzIiAgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKyAgdGVzdCAiJGVjaG9fbGlicyIgPSAieWVzIiAgICAgJiYgc2hvd191c2FnZSAmJiBleGl0IDEKKworICBpZiB0ZXN0ICIkZXhhY3RfdmVyc2lvbiIgIT0gIiI7IHRoZW4KKyAgICBjaGVja192ZXJzaW9ucyAkZXhhY3RfdmVyc2lvbiAkZXhhY3RfdmVyc2lvbgorICAgICMgdW5yZWFjaGFibGUKKyAgZWxzZQorICAgIGNoZWNrX3ZlcnNpb25zICR7bWluX3ZlcnNpb246LTAuMC4wfSAke21heF92ZXJzaW9uOi05OTk5Ljk5OTkuOTk5OX0KKyAgICAjIHVucmVhY2hhYmxlCisgIGZpCitmaQorCisjIERvIHRoZSBvdXRwdXQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgc28gdGhhdCB0aGVzZSBjYW4gYmUgdXNlZCBpbi1saW5lIG9mCisjIGEgY29tcGlsZXIgaW52b2NhdGlvbi4KK291dHB1dD0iIgordGVzdCAiJGVjaG9fY3BwZmxhZ3MiID0gInllcyIgJiYgb3V0cHV0PSIkb3V0cHV0ICRndGVzdF9jcHBmbGFncyIKK3Rlc3QgIiRlY2hvX2N4eGZsYWdzIiA9ICJ5ZXMiICYmIG91dHB1dD0iJG91dHB1dCAkZ3Rlc3RfY3h4ZmxhZ3MiCit0ZXN0ICIkZWNob19sZGZsYWdzIiA9ICJ5ZXMiICAmJiBvdXRwdXQ9IiRvdXRwdXQgJGd0ZXN0X2xkZmxhZ3MiCit0ZXN0ICIkZWNob19saWJzIiA9ICJ5ZXMiICAgICAmJiBvdXRwdXQ9IiRvdXRwdXQgJGd0ZXN0X2xpYnMiCitlY2hvICRvdXRwdXQKKworZXhpdCAwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NjcmlwdHMvcHVtcC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc2NyaXB0cy9wdW1wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlZmI2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NjcmlwdHMvcHVtcC5weQpAQCAtMCwwICsxLDg1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIicHVtcCB2MC4yLjAgLSBQcmV0dHkgVXNlZnVsIGZvciBNZXRhIFByb2dyYW1taW5nLgorCitBIHRvb2wgZm9yIHByZXByb2Nlc3NvciBtZXRhIHByb2dyYW1taW5nLiAgVXNlZnVsIGZvciBnZW5lcmF0aW5nCityZXBldGl0aXZlIGJvaWxlcnBsYXRlIGNvZGUuICBFc3BlY2lhbGx5IHVzZWZ1bCBmb3Igd3JpdGluZyBDKysKK2NsYXNzZXMsIGZ1bmN0aW9ucywgbWFjcm9zLCBhbmQgdGVtcGxhdGVzIHRoYXQgbmVlZCB0byB3b3JrIHdpdGgKK3ZhcmlvdXMgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKworVVNBR0U6CisgICAgICAgcHVtcC5weSBTT1VSQ0VfRklMRQorCitFWEFNUExFUzoKKyAgICAgICBwdW1wLnB5IGZvby5jYy5wdW1wCisgICAgICAgICBDb252ZXJ0cyBmb28uY2MucHVtcCB0byBmb28uY2MuCisKK0dSQU1NQVI6CisgICAgICAgQ09ERSA6Oj0gQVRPTUlDX0NPREUqCisgICAgICAgQVRPTUlDX0NPREUgOjo9ICR2YXIgSUQgPSBFWFBSRVNTSU9OCisgICAgICAgICAgIHwgJHZhciBJRCA9IFtbIENPREUgXV0KKyAgICAgICAgICAgfCAkcmFuZ2UgSUQgRVhQUkVTU0lPTi4uRVhQUkVTU0lPTgorICAgICAgICAgICB8ICRmb3IgSUQgU0VQQVJBVE9SIFtbIENPREUgXV0KKyAgICAgICAgICAgfCAkKCQpCisgICAgICAgICAgIHwgJElECisgICAgICAgICAgIHwgJChFWFBSRVNTSU9OKQorICAgICAgICAgICB8ICRpZiBFWFBSRVNTSU9OIFtbIENPREUgXV0gRUxTRV9CUkFOQ0gKKyAgICAgICAgICAgfCBbWyBDT0RFIF1dCisgICAgICAgICAgIHwgUkFXX0NPREUKKyAgICAgICBTRVBBUkFUT1IgOjo9IFJBV19DT0RFIHwgRU1QVFkKKyAgICAgICBFTFNFX0JSQU5DSCA6Oj0gJGVsc2UgW1sgQ09ERSBdXQorICAgICAgICAgICB8ICRlbGlmIEVYUFJFU1NJT04gW1sgQ09ERSBdXSBFTFNFX0JSQU5DSAorICAgICAgICAgICB8IEVNUFRZCisgICAgICAgRVhQUkVTU0lPTiBoYXMgUHl0aG9uIHN5bnRheC4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCisKK1RPS0VOX1RBQkxFID0gWworICAgIChyZS5jb21waWxlKHInXCR2YXJccysnKSwgJyR2YXInKSwKKyAgICAocmUuY29tcGlsZShyJ1wkZWxpZlxzKycpLCAnJGVsaWYnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkZWxzZVxzKycpLCAnJGVsc2UnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkZm9yXHMrJyksICckZm9yJyksCisgICAgKHJlLmNvbXBpbGUocidcJGlmXHMrJyksICckaWYnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkcmFuZ2VccysnKSwgJyRyYW5nZScpLAorICAgIChyZS5jb21waWxlKHInXCRbX0EtWmEtel1cdyonKSwgJyRpZCcpLAorICAgIChyZS5jb21waWxlKHInXCRcKFwkXCknKSwgJyQoJCknKSwKKyAgICAocmUuY29tcGlsZShyJ1wkJyksICckJyksCisgICAgKHJlLmNvbXBpbGUocidcW1xbXG4/JyksICdbWycpLAorICAgIChyZS5jb21waWxlKHInXF1cXVxuPycpLCAnXV0nKSwKKyAgICBdCisKKworY2xhc3MgQ3Vyc29yOgorICAiIiJSZXByZXNlbnRzIGEgcG9zaXRpb24gKGxpbmUgYW5kIGNvbHVtbikgaW4gYSB0ZXh0IGZpbGUuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmU9LTEsIGNvbHVtbj0tMSk6CisgICAgc2VsZi5saW5lID0gbGluZQorICAgIHNlbGYuY29sdW1uID0gY29sdW1uCisKKyAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiBzZWxmLmxpbmUgPT0gcmhzLmxpbmUgYW5kIHNlbGYuY29sdW1uID09IHJocy5jb2x1bW4KKworICBkZWYgX19uZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIG5vdCBzZWxmID09IHJocworCisgIGRlZiBfX2x0X18oc2VsZiwgcmhzKToKKyAgICByZXR1cm4gc2VsZi5saW5lIDwgcmhzLmxpbmUgb3IgKAorICAgICAgICBzZWxmLmxpbmUgPT0gcmhzLmxpbmUgYW5kIHNlbGYuY29sdW1uIDwgcmhzLmNvbHVtbikKKworICBkZWYgX19sZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHNlbGYgPCByaHMgb3Igc2VsZiA9PSByaHMKKworICBkZWYgX19ndF9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHJocyA8IHNlbGYKKworICBkZWYgX19nZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHJocyA8PSBzZWxmCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgaWYgc2VsZiA9PSBFb2YoKToKKyAgICAgIHJldHVybiAnRU9GJworICAgIGVsc2U6CisgICAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5saW5lICsgMSwgc2VsZi5jb2x1bW4pCisKKyAgZGVmIF9fYWRkX18oc2VsZiwgb2Zmc2V0KToKKyAgICByZXR1cm4gQ3Vyc29yKHNlbGYubGluZSwgc2VsZi5jb2x1bW4gKyBvZmZzZXQpCisKKyAgZGVmIF9fc3ViX18oc2VsZiwgb2Zmc2V0KToKKyAgICByZXR1cm4gQ3Vyc29yKHNlbGYubGluZSwgc2VsZi5jb2x1bW4gLSBvZmZzZXQpCisKKyAgZGVmIENsb25lKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBjb3B5IG9mIHNlbGYuIiIiCisKKyAgICByZXR1cm4gQ3Vyc29yKHNlbGYubGluZSwgc2VsZi5jb2x1bW4pCisKKworIyBTcGVjaWFsIGN1cnNvciB0byBpbmRpY2F0ZSB0aGUgZW5kLW9mLWZpbGUuCitkZWYgRW9mKCk6CisgICIiIlJldHVybnMgdGhlIHNwZWNpYWwgY3Vyc29yIHRvIGRlbm90ZSB0aGUgZW5kLW9mLWZpbGUuIiIiCisgIHJldHVybiBDdXJzb3IoLTEsIC0xKQorCisKK2NsYXNzIFRva2VuOgorICAiIiJSZXByZXNlbnRzIGEgdG9rZW4gaW4gYSBQdW1wIHNvdXJjZSBmaWxlLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydD1Ob25lLCBlbmQ9Tm9uZSwgdmFsdWU9Tm9uZSwgdG9rZW5fdHlwZT1Ob25lKToKKyAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgc2VsZi5zdGFydCA9IEVvZigpCisgICAgZWxzZToKKyAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgc2VsZi5lbmQgPSBFb2YoKQorICAgIGVsc2U6CisgICAgICBzZWxmLmVuZCA9IGVuZAorICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgIHNlbGYudG9rZW5fdHlwZSA9IHRva2VuX3R5cGUKKworICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICByZXR1cm4gJ1Rva2VuIEAlczogXCclc1wnIHR5cGU9JXMnICUgKAorICAgICAgICBzZWxmLnN0YXJ0LCBzZWxmLnZhbHVlLCBzZWxmLnRva2VuX3R5cGUpCisKKyAgZGVmIENsb25lKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBjb3B5IG9mIHNlbGYuIiIiCisKKyAgICByZXR1cm4gVG9rZW4oc2VsZi5zdGFydC5DbG9uZSgpLCBzZWxmLmVuZC5DbG9uZSgpLCBzZWxmLnZhbHVlLAorICAgICAgICAgICAgICAgICBzZWxmLnRva2VuX3R5cGUpCisKKworZGVmIFN0YXJ0c1dpdGgobGluZXMsIHBvcywgc3RyaW5nKToKKyAgIiIiUmV0dXJucyBUcnVlIGlmZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gbGluZXMgc3RhcnRzIHdpdGggJ3N0cmluZycuIiIiCisKKyAgcmV0dXJuIGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0uc3RhcnRzd2l0aChzdHJpbmcpCisKKworZGVmIEZpbmRGaXJzdEluTGluZShsaW5lLCB0b2tlbl90YWJsZSk6CisgIGJlc3RfbWF0Y2hfc3RhcnQgPSAtMQorICBmb3IgKHJlZ2V4LCB0b2tlbl90eXBlKSBpbiB0b2tlbl90YWJsZToKKyAgICBtID0gcmVnZXguc2VhcmNoKGxpbmUpCisgICAgaWYgbToKKyAgICAgICMgV2UgZm91bmQgcmVnZXggaW4gbGluZXMKKyAgICAgIGlmIGJlc3RfbWF0Y2hfc3RhcnQgPCAwIG9yIG0uc3RhcnQoKSA8IGJlc3RfbWF0Y2hfc3RhcnQ6CisgICAgICAgIGJlc3RfbWF0Y2hfc3RhcnQgPSBtLnN0YXJ0KCkKKyAgICAgICAgYmVzdF9tYXRjaF9sZW5ndGggPSBtLmVuZCgpIC0gbS5zdGFydCgpCisgICAgICAgIGJlc3RfbWF0Y2hfdG9rZW5fdHlwZSA9IHRva2VuX3R5cGUKKworICBpZiBiZXN0X21hdGNoX3N0YXJ0IDwgMDoKKyAgICByZXR1cm4gTm9uZQorCisgIHJldHVybiAoYmVzdF9tYXRjaF9zdGFydCwgYmVzdF9tYXRjaF9sZW5ndGgsIGJlc3RfbWF0Y2hfdG9rZW5fdHlwZSkKKworCitkZWYgRmluZEZpcnN0KGxpbmVzLCB0b2tlbl90YWJsZSwgY3Vyc29yKToKKyAgIiIiRmluZHMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW55IHN0cmluZyBpbiBzdHJpbmdzIGluIGxpbmVzLiIiIgorCisgIHN0YXJ0ID0gY3Vyc29yLkNsb25lKCkKKyAgY3VyX2xpbmVfbnVtYmVyID0gY3Vyc29yLmxpbmUKKyAgZm9yIGxpbmUgaW4gbGluZXNbc3RhcnQubGluZTpdOgorICAgIGlmIGN1cl9saW5lX251bWJlciA9PSBzdGFydC5saW5lOgorICAgICAgbGluZSA9IGxpbmVbc3RhcnQuY29sdW1uOl0KKyAgICBtID0gRmluZEZpcnN0SW5MaW5lKGxpbmUsIHRva2VuX3RhYmxlKQorICAgIGlmIG06CisgICAgICAjIFdlIGZvdW5kIGEgcmVnZXggaW4gbGluZS4KKyAgICAgIChzdGFydF9jb2x1bW4sIGxlbmd0aCwgdG9rZW5fdHlwZSkgPSBtCisgICAgICBpZiBjdXJfbGluZV9udW1iZXIgPT0gc3RhcnQubGluZToKKyAgICAgICAgc3RhcnRfY29sdW1uICs9IHN0YXJ0LmNvbHVtbgorICAgICAgZm91bmRfc3RhcnQgPSBDdXJzb3IoY3VyX2xpbmVfbnVtYmVyLCBzdGFydF9jb2x1bW4pCisgICAgICBmb3VuZF9lbmQgPSBmb3VuZF9zdGFydCArIGxlbmd0aAorICAgICAgcmV0dXJuIE1ha2VUb2tlbihsaW5lcywgZm91bmRfc3RhcnQsIGZvdW5kX2VuZCwgdG9rZW5fdHlwZSkKKyAgICBjdXJfbGluZV9udW1iZXIgKz0gMQorICAjIFdlIGZhaWxlZCB0byBmaW5kIHN0ciBpbiBsaW5lcworICByZXR1cm4gTm9uZQorCisKK2RlZiBTdWJTdHJpbmcobGluZXMsIHN0YXJ0LCBlbmQpOgorICAiIiJSZXR1cm5zIGEgc3Vic3RyaW5nIGluIGxpbmVzLiIiIgorCisgIGlmIGVuZCA9PSBFb2YoKToKKyAgICBlbmQgPSBDdXJzb3IobGVuKGxpbmVzKSAtIDEsIGxlbihsaW5lc1stMV0pKQorCisgIGlmIHN0YXJ0ID49IGVuZDoKKyAgICByZXR1cm4gJycKKworICBpZiBzdGFydC5saW5lID09IGVuZC5saW5lOgorICAgIHJldHVybiBsaW5lc1tzdGFydC5saW5lXVtzdGFydC5jb2x1bW46ZW5kLmNvbHVtbl0KKworICByZXN1bHRfbGluZXMgPSAoW2xpbmVzW3N0YXJ0LmxpbmVdW3N0YXJ0LmNvbHVtbjpdXSArCisgICAgICAgICAgICAgICAgICBsaW5lc1tzdGFydC5saW5lICsgMTplbmQubGluZV0gKworICAgICAgICAgICAgICAgICAgW2xpbmVzW2VuZC5saW5lXVs6ZW5kLmNvbHVtbl1dKQorICByZXR1cm4gJycuam9pbihyZXN1bHRfbGluZXMpCisKKworZGVmIFN0cmlwTWV0YUNvbW1lbnRzKHN0cik6CisgICIiIlN0cmlwIG1ldGEgY29tbWVudHMgZnJvbSBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIHN0cmluZy4iIiIKKworICAjIEZpcnN0LCBjb21wbGV0ZWx5IHJlbW92ZSBsaW5lcyBjb250YWluaW5nIG5vdGhpbmcgYnV0IGEgbWV0YQorICAjIGNvbW1lbnQsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgXG4uCisgIHN0ciA9IHJlLnN1YihyJ15ccypcJFwkLipcbicsICcnLCBzdHIpCisKKyAgIyBUaGVuLCByZW1vdmUgbWV0YSBjb21tZW50cyBmcm9tIGNvbnRlbnRmdWwgbGluZXMuCisgIHJldHVybiByZS5zdWIocidccypcJFwkLionLCAnJywgc3RyKQorCisKK2RlZiBNYWtlVG9rZW4obGluZXMsIHN0YXJ0LCBlbmQsIHRva2VuX3R5cGUpOgorICAiIiJDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFRva2VuLiIiIgorCisgIHJldHVybiBUb2tlbihzdGFydCwgZW5kLCBTdWJTdHJpbmcobGluZXMsIHN0YXJ0LCBlbmQpLCB0b2tlbl90eXBlKQorCisKK2RlZiBQYXJzZVRva2VuKGxpbmVzLCBwb3MsIHJlZ2V4LCB0b2tlbl90eXBlKToKKyAgbGluZSA9IGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0KKyAgbSA9IHJlZ2V4LnNlYXJjaChsaW5lKQorICBpZiBtIGFuZCBub3QgbS5zdGFydCgpOgorICAgIHJldHVybiBNYWtlVG9rZW4obGluZXMsIHBvcywgcG9zICsgbS5lbmQoKSwgdG9rZW5fdHlwZSkKKyAgZWxzZToKKyAgICBwcmludCAnRVJST1I6ICVzIGV4cGVjdGVkIGF0ICVzLicgJSAodG9rZW5fdHlwZSwgcG9zKQorICAgIHN5cy5leGl0KDEpCisKKworSURfUkVHRVggPSByZS5jb21waWxlKHInW19BLVphLXpdXHcqJykKK0VRX1JFR0VYID0gcmUuY29tcGlsZShyJz0nKQorUkVTVF9PRl9MSU5FX1JFR0VYID0gcmUuY29tcGlsZShyJy4qPyg/PSR8XCRcJCknKQorT1BUSU9OQUxfV0hJVEVfU1BBQ0VTX1JFR0VYID0gcmUuY29tcGlsZShyJ1xzKicpCitXSElURV9TUEFDRV9SRUdFWCA9IHJlLmNvbXBpbGUocidccycpCitET1RfRE9UX1JFR0VYID0gcmUuY29tcGlsZShyJ1wuXC4nKQorCisKK2RlZiBTa2lwKGxpbmVzLCBwb3MsIHJlZ2V4KToKKyAgbGluZSA9IGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0KKyAgbSA9IHJlLnNlYXJjaChyZWdleCwgbGluZSkKKyAgaWYgbSBhbmQgbm90IG0uc3RhcnQoKToKKyAgICByZXR1cm4gcG9zICsgbS5lbmQoKQorICBlbHNlOgorICAgIHJldHVybiBwb3MKKworCitkZWYgU2tpcFVudGlsKGxpbmVzLCBwb3MsIHJlZ2V4LCB0b2tlbl90eXBlKToKKyAgbGluZSA9IGxpbmVzW3Bvcy5saW5lXVtwb3MuY29sdW1uOl0KKyAgbSA9IHJlLnNlYXJjaChyZWdleCwgbGluZSkKKyAgaWYgbToKKyAgICByZXR1cm4gcG9zICsgbS5zdGFydCgpCisgIGVsc2U6CisgICAgcHJpbnQgKCdFUlJPUjogJXMgZXhwZWN0ZWQgb24gbGluZSAlcyBhZnRlciBjb2x1bW4gJXMuJyAlCisgICAgICAgICAgICh0b2tlbl90eXBlLCBwb3MubGluZSArIDEsIHBvcy5jb2x1bW4pKQorICAgIHN5cy5leGl0KDEpCisKKworZGVmIFBhcnNlRXhwVG9rZW5JblBhcmVucyhsaW5lcywgcG9zKToKKyAgZGVmIFBhcnNlSW5QYXJlbnMocG9zKToKKyAgICBwb3MgPSBTa2lwKGxpbmVzLCBwb3MsIE9QVElPTkFMX1dISVRFX1NQQUNFU19SRUdFWCkKKyAgICBwb3MgPSBTa2lwKGxpbmVzLCBwb3MsIHInXCgnKQorICAgIHBvcyA9IFBhcnNlKHBvcykKKyAgICBwb3MgPSBTa2lwKGxpbmVzLCBwb3MsIHInXCknKQorICAgIHJldHVybiBwb3MKKworICBkZWYgUGFyc2UocG9zKToKKyAgICBwb3MgPSBTa2lwVW50aWwobGluZXMsIHBvcywgcidcKHxcKScsICcpJykKKyAgICBpZiBTdWJTdHJpbmcobGluZXMsIHBvcywgcG9zICsgMSkgPT0gJygnOgorICAgICAgcG9zID0gUGFyc2UocG9zICsgMSkKKyAgICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgcidcKScpCisgICAgICByZXR1cm4gUGFyc2UocG9zKQorICAgIGVsc2U6CisgICAgICByZXR1cm4gcG9zCisKKyAgc3RhcnQgPSBwb3MuQ2xvbmUoKQorICBwb3MgPSBQYXJzZUluUGFyZW5zKHBvcykKKyAgcmV0dXJuIE1ha2VUb2tlbihsaW5lcywgc3RhcnQsIHBvcywgJ2V4cCcpCisKKworZGVmIFJTdHJpcE5ld0xpbmVGcm9tVG9rZW4odG9rZW4pOgorICBpZiB0b2tlbi52YWx1ZS5lbmRzd2l0aCgnXG4nKToKKyAgICByZXR1cm4gVG9rZW4odG9rZW4uc3RhcnQsIHRva2VuLmVuZCwgdG9rZW4udmFsdWVbOi0xXSwgdG9rZW4udG9rZW5fdHlwZSkKKyAgZWxzZToKKyAgICByZXR1cm4gdG9rZW4KKworCitkZWYgVG9rZW5pemVMaW5lcyhsaW5lcywgcG9zKToKKyAgd2hpbGUgVHJ1ZToKKyAgICBmb3VuZCA9IEZpbmRGaXJzdChsaW5lcywgVE9LRU5fVEFCTEUsIHBvcykKKyAgICBpZiBub3QgZm91bmQ6CisgICAgICB5aWVsZCBNYWtlVG9rZW4obGluZXMsIHBvcywgRW9mKCksICdjb2RlJykKKyAgICAgIHJldHVybgorCisgICAgaWYgZm91bmQuc3RhcnQgPT0gcG9zOgorICAgICAgcHJldl90b2tlbiA9IE5vbmUKKyAgICAgIHByZXZfdG9rZW5fcnN0cmlwcGVkID0gTm9uZQorICAgIGVsc2U6CisgICAgICBwcmV2X3Rva2VuID0gTWFrZVRva2VuKGxpbmVzLCBwb3MsIGZvdW5kLnN0YXJ0LCAnY29kZScpCisgICAgICBwcmV2X3Rva2VuX3JzdHJpcHBlZCA9IFJTdHJpcE5ld0xpbmVGcm9tVG9rZW4ocHJldl90b2tlbikKKworICAgIGlmIGZvdW5kLnRva2VuX3R5cGUgPT0gJyR2YXInOgorICAgICAgaWYgcHJldl90b2tlbl9yc3RyaXBwZWQ6CisgICAgICAgIHlpZWxkIHByZXZfdG9rZW5fcnN0cmlwcGVkCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgaWRfdG9rZW4gPSBQYXJzZVRva2VuKGxpbmVzLCBmb3VuZC5lbmQsIElEX1JFR0VYLCAnaWQnKQorICAgICAgeWllbGQgaWRfdG9rZW4KKyAgICAgIHBvcyA9IFNraXAobGluZXMsIGlkX3Rva2VuLmVuZCwgT1BUSU9OQUxfV0hJVEVfU1BBQ0VTX1JFR0VYKQorCisgICAgICBlcV90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIHBvcywgRVFfUkVHRVgsICc9JykKKyAgICAgIHlpZWxkIGVxX3Rva2VuCisgICAgICBwb3MgPSBTa2lwKGxpbmVzLCBlcV90b2tlbi5lbmQsIHInXHMqJykKKworICAgICAgaWYgU3ViU3RyaW5nKGxpbmVzLCBwb3MsIHBvcyArIDIpICE9ICdbWyc6CisgICAgICAgIGV4cF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIHBvcywgUkVTVF9PRl9MSU5FX1JFR0VYLCAnZXhwJykKKyAgICAgICAgeWllbGQgZXhwX3Rva2VuCisgICAgICAgIHBvcyA9IEN1cnNvcihleHBfdG9rZW4uZW5kLmxpbmUgKyAxLCAwKQorICAgIGVsaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJGZvcic6CisgICAgICBpZiBwcmV2X3Rva2VuX3JzdHJpcHBlZDoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbl9yc3RyaXBwZWQKKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBpZF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIGZvdW5kLmVuZCwgSURfUkVHRVgsICdpZCcpCisgICAgICB5aWVsZCBpZF90b2tlbgorICAgICAgcG9zID0gU2tpcChsaW5lcywgaWRfdG9rZW4uZW5kLCBXSElURV9TUEFDRV9SRUdFWCkKKyAgICBlbGlmIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRyYW5nZSc6CisgICAgICBpZiBwcmV2X3Rva2VuX3JzdHJpcHBlZDoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbl9yc3RyaXBwZWQKKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBpZF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIGZvdW5kLmVuZCwgSURfUkVHRVgsICdpZCcpCisgICAgICB5aWVsZCBpZF90b2tlbgorICAgICAgcG9zID0gU2tpcChsaW5lcywgaWRfdG9rZW4uZW5kLCBPUFRJT05BTF9XSElURV9TUEFDRVNfUkVHRVgpCisKKyAgICAgIGRvdHNfcG9zID0gU2tpcFVudGlsKGxpbmVzLCBwb3MsIERPVF9ET1RfUkVHRVgsICcuLicpCisgICAgICB5aWVsZCBNYWtlVG9rZW4obGluZXMsIHBvcywgZG90c19wb3MsICdleHAnKQorICAgICAgeWllbGQgTWFrZVRva2VuKGxpbmVzLCBkb3RzX3BvcywgZG90c19wb3MgKyAyLCAnLi4nKQorICAgICAgcG9zID0gZG90c19wb3MgKyAyCisgICAgICBuZXdfcG9zID0gQ3Vyc29yKHBvcy5saW5lICsgMSwgMCkKKyAgICAgIHlpZWxkIE1ha2VUb2tlbihsaW5lcywgcG9zLCBuZXdfcG9zLCAnZXhwJykKKyAgICAgIHBvcyA9IG5ld19wb3MKKyAgICBlbGlmIGZvdW5kLnRva2VuX3R5cGUgPT0gJyQnOgorICAgICAgaWYgcHJldl90b2tlbjoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbgorICAgICAgeWllbGQgZm91bmQKKyAgICAgIGV4cF90b2tlbiA9IFBhcnNlRXhwVG9rZW5JblBhcmVucyhsaW5lcywgZm91bmQuZW5kKQorICAgICAgeWllbGQgZXhwX3Rva2VuCisgICAgICBwb3MgPSBleHBfdG9rZW4uZW5kCisgICAgZWxpZiAoZm91bmQudG9rZW5fdHlwZSA9PSAnXV0nIG9yIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRpZicgb3IKKyAgICAgICAgICBmb3VuZC50b2tlbl90eXBlID09ICckZWxpZicgb3IgZm91bmQudG9rZW5fdHlwZSA9PSAnJGVsc2UnKToKKyAgICAgIGlmIHByZXZfdG9rZW5fcnN0cmlwcGVkOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuX3JzdHJpcHBlZAorICAgICAgeWllbGQgZm91bmQKKyAgICAgIHBvcyA9IGZvdW5kLmVuZAorICAgIGVsc2U6CisgICAgICBpZiBwcmV2X3Rva2VuOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgcG9zID0gZm91bmQuZW5kCisKKworZGVmIFRva2VuaXplKHMpOgorICAiIiJBIGdlbmVyYXRvciB0aGF0IHlpZWxkcyB0aGUgdG9rZW5zIGluIHRoZSBnaXZlbiBzdHJpbmcuIiIiCisgIGlmIHMgIT0gJyc6CisgICAgbGluZXMgPSBzLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICBmb3IgdG9rZW4gaW4gVG9rZW5pemVMaW5lcyhsaW5lcywgQ3Vyc29yKDAsIDApKToKKyAgICAgIHlpZWxkIHRva2VuCisKKworY2xhc3MgQ29kZU5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBhdG9taWNfY29kZV9saXN0PU5vbmUpOgorICAgIHNlbGYuYXRvbWljX2NvZGUgPSBhdG9taWNfY29kZV9saXN0CisKKworY2xhc3MgVmFyTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGlkZW50aWZpZXI9Tm9uZSwgYXRvbWljX2NvZGU9Tm9uZSk6CisgICAgc2VsZi5pZGVudGlmaWVyID0gaWRlbnRpZmllcgorICAgIHNlbGYuYXRvbWljX2NvZGUgPSBhdG9taWNfY29kZQorCisKK2NsYXNzIFJhbmdlTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGlkZW50aWZpZXI9Tm9uZSwgZXhwMT1Ob25lLCBleHAyPU5vbmUpOgorICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKKyAgICBzZWxmLmV4cDEgPSBleHAxCisgICAgc2VsZi5leHAyID0gZXhwMgorCisKK2NsYXNzIEZvck5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZGVudGlmaWVyPU5vbmUsIHNlcD1Ob25lLCBjb2RlPU5vbmUpOgorICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKKyAgICBzZWxmLnNlcCA9IHNlcAorICAgIHNlbGYuY29kZSA9IGNvZGUKKworCitjbGFzcyBFbHNlTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGVsc2VfYnJhbmNoPU5vbmUpOgorICAgIHNlbGYuZWxzZV9icmFuY2ggPSBlbHNlX2JyYW5jaAorCisKK2NsYXNzIElmTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cD1Ob25lLCB0aGVuX2JyYW5jaD1Ob25lLCBlbHNlX2JyYW5jaD1Ob25lKToKKyAgICBzZWxmLmV4cCA9IGV4cAorICAgIHNlbGYudGhlbl9icmFuY2ggPSB0aGVuX2JyYW5jaAorICAgIHNlbGYuZWxzZV9icmFuY2ggPSBlbHNlX2JyYW5jaAorCisKK2NsYXNzIFJhd0NvZGVOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW49Tm9uZSk6CisgICAgc2VsZi5yYXdfY29kZSA9IHRva2VuCisKKworY2xhc3MgTGl0ZXJhbERvbGxhck5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlbik6CisgICAgc2VsZi50b2tlbiA9IHRva2VuCisKKworY2xhc3MgRXhwTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuLCBweXRob25fZXhwKToKKyAgICBzZWxmLnRva2VuID0gdG9rZW4KKyAgICBzZWxmLnB5dGhvbl9leHAgPSBweXRob25fZXhwCisKKworZGVmIFBvcEZyb250KGFfbGlzdCk6CisgIGhlYWQgPSBhX2xpc3RbMF0KKyAgYV9saXN0WzoxXSA9IFtdCisgIHJldHVybiBoZWFkCisKKworZGVmIFB1c2hGcm9udChhX2xpc3QsIGVsZW0pOgorICBhX2xpc3RbOjBdID0gW2VsZW1dCisKKworZGVmIFBvcFRva2VuKGFfbGlzdCwgdG9rZW5fdHlwZT1Ob25lKToKKyAgdG9rZW4gPSBQb3BGcm9udChhX2xpc3QpCisgIGlmIHRva2VuX3R5cGUgaXMgbm90IE5vbmUgYW5kIHRva2VuLnRva2VuX3R5cGUgIT0gdG9rZW5fdHlwZToKKyAgICBwcmludCAnRVJST1I6ICVzIGV4cGVjdGVkIGF0ICVzJyAlICh0b2tlbl90eXBlLCB0b2tlbi5zdGFydCkKKyAgICBwcmludCAnRVJST1I6ICVzIGZvdW5kIGluc3RlYWQnICUgKHRva2VuLCkKKyAgICBzeXMuZXhpdCgxKQorCisgIHJldHVybiB0b2tlbgorCisKK2RlZiBQZWVrVG9rZW4oYV9saXN0KToKKyAgaWYgbm90IGFfbGlzdDoKKyAgICByZXR1cm4gTm9uZQorCisgIHJldHVybiBhX2xpc3RbMF0KKworCitkZWYgUGFyc2VFeHBOb2RlKHRva2VuKToKKyAgcHl0aG9uX2V4cCA9IHJlLnN1YihyJyhbX0EtWmEtel1cdyopJywgcidzZWxmLkdldFZhbHVlKCJcMSIpJywgdG9rZW4udmFsdWUpCisgIHJldHVybiBFeHBOb2RlKHRva2VuLCBweXRob25fZXhwKQorCisKK2RlZiBQYXJzZUVsc2VOb2RlKHRva2Vucyk6CisgIGRlZiBQb3AodG9rZW5fdHlwZT1Ob25lKToKKyAgICByZXR1cm4gUG9wVG9rZW4odG9rZW5zLCB0b2tlbl90eXBlKQorCisgIG5leHQgPSBQZWVrVG9rZW4odG9rZW5zKQorICBpZiBub3QgbmV4dDoKKyAgICByZXR1cm4gTm9uZQorICBpZiBuZXh0LnRva2VuX3R5cGUgPT0gJyRlbHNlJzoKKyAgICBQb3AoJyRlbHNlJykKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICByZXR1cm4gY29kZV9ub2RlCisgIGVsaWYgbmV4dC50b2tlbl90eXBlID09ICckZWxpZic6CisgICAgUG9wKCckZWxpZicpCisgICAgZXhwID0gUG9wKCdjb2RlJykKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICBpbm5lcl9lbHNlX25vZGUgPSBQYXJzZUVsc2VOb2RlKHRva2VucykKKyAgICByZXR1cm4gQ29kZU5vZGUoW0lmTm9kZShQYXJzZUV4cE5vZGUoZXhwKSwgY29kZV9ub2RlLCBpbm5lcl9lbHNlX25vZGUpXSkKKyAgZWxpZiBub3QgbmV4dC52YWx1ZS5zdHJpcCgpOgorICAgIFBvcCgnY29kZScpCisgICAgcmV0dXJuIFBhcnNlRWxzZU5vZGUodG9rZW5zKQorICBlbHNlOgorICAgIHJldHVybiBOb25lCisKKworZGVmIFBhcnNlQXRvbWljQ29kZU5vZGUodG9rZW5zKToKKyAgZGVmIFBvcCh0b2tlbl90eXBlPU5vbmUpOgorICAgIHJldHVybiBQb3BUb2tlbih0b2tlbnMsIHRva2VuX3R5cGUpCisKKyAgaGVhZCA9IFBvcEZyb250KHRva2VucykKKyAgdCA9IGhlYWQudG9rZW5fdHlwZQorICBpZiB0ID09ICdjb2RlJzoKKyAgICByZXR1cm4gUmF3Q29kZU5vZGUoaGVhZCkKKyAgZWxpZiB0ID09ICckdmFyJzoKKyAgICBpZF90b2tlbiA9IFBvcCgnaWQnKQorICAgIFBvcCgnPScpCisgICAgbmV4dCA9IFBlZWtUb2tlbih0b2tlbnMpCisgICAgaWYgbmV4dC50b2tlbl90eXBlID09ICdleHAnOgorICAgICAgZXhwX3Rva2VuID0gUG9wKCkKKyAgICAgIHJldHVybiBWYXJOb2RlKGlkX3Rva2VuLCBQYXJzZUV4cE5vZGUoZXhwX3Rva2VuKSkKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICByZXR1cm4gVmFyTm9kZShpZF90b2tlbiwgY29kZV9ub2RlKQorICBlbGlmIHQgPT0gJyRmb3InOgorICAgIGlkX3Rva2VuID0gUG9wKCdpZCcpCisgICAgbmV4dF90b2tlbiA9IFBlZWtUb2tlbih0b2tlbnMpCisgICAgaWYgbmV4dF90b2tlbi50b2tlbl90eXBlID09ICdjb2RlJzoKKyAgICAgIHNlcF90b2tlbiA9IG5leHRfdG9rZW4KKyAgICAgIFBvcCgnY29kZScpCisgICAgZWxzZToKKyAgICAgIHNlcF90b2tlbiA9IE5vbmUKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICByZXR1cm4gRm9yTm9kZShpZF90b2tlbiwgc2VwX3Rva2VuLCBjb2RlX25vZGUpCisgIGVsaWYgdCA9PSAnJGlmJzoKKyAgICBleHBfdG9rZW4gPSBQb3AoJ2NvZGUnKQorICAgIFBvcCgnW1snKQorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIGVsc2Vfbm9kZSA9IFBhcnNlRWxzZU5vZGUodG9rZW5zKQorICAgIHJldHVybiBJZk5vZGUoUGFyc2VFeHBOb2RlKGV4cF90b2tlbiksIGNvZGVfbm9kZSwgZWxzZV9ub2RlKQorICBlbGlmIHQgPT0gJyRyYW5nZSc6CisgICAgaWRfdG9rZW4gPSBQb3AoJ2lkJykKKyAgICBleHAxX3Rva2VuID0gUG9wKCdleHAnKQorICAgIFBvcCgnLi4nKQorICAgIGV4cDJfdG9rZW4gPSBQb3AoJ2V4cCcpCisgICAgcmV0dXJuIFJhbmdlTm9kZShpZF90b2tlbiwgUGFyc2VFeHBOb2RlKGV4cDFfdG9rZW4pLAorICAgICAgICAgICAgICAgICAgICAgUGFyc2VFeHBOb2RlKGV4cDJfdG9rZW4pKQorICBlbGlmIHQgPT0gJyRpZCc6CisgICAgcmV0dXJuIFBhcnNlRXhwTm9kZShUb2tlbihoZWFkLnN0YXJ0ICsgMSwgaGVhZC5lbmQsIGhlYWQudmFsdWVbMTpdLCAnaWQnKSkKKyAgZWxpZiB0ID09ICckKCQpJzoKKyAgICByZXR1cm4gTGl0ZXJhbERvbGxhck5vZGUoaGVhZCkKKyAgZWxpZiB0ID09ICckJzoKKyAgICBleHBfdG9rZW4gPSBQb3AoJ2V4cCcpCisgICAgcmV0dXJuIFBhcnNlRXhwTm9kZShleHBfdG9rZW4pCisgIGVsaWYgdCA9PSAnW1snOgorICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICAgIFBvcCgnXV0nKQorICAgIHJldHVybiBjb2RlX25vZGUKKyAgZWxzZToKKyAgICBQdXNoRnJvbnQodG9rZW5zLCBoZWFkKQorICAgIHJldHVybiBOb25lCisKKworZGVmIFBhcnNlQ29kZU5vZGUodG9rZW5zKToKKyAgYXRvbWljX2NvZGVfbGlzdCA9IFtdCisgIHdoaWxlIFRydWU6CisgICAgaWYgbm90IHRva2VuczoKKyAgICAgIGJyZWFrCisgICAgYXRvbWljX2NvZGVfbm9kZSA9IFBhcnNlQXRvbWljQ29kZU5vZGUodG9rZW5zKQorICAgIGlmIGF0b21pY19jb2RlX25vZGU6CisgICAgICBhdG9taWNfY29kZV9saXN0LmFwcGVuZChhdG9taWNfY29kZV9ub2RlKQorICAgIGVsc2U6CisgICAgICBicmVhaworICByZXR1cm4gQ29kZU5vZGUoYXRvbWljX2NvZGVfbGlzdCkKKworCitkZWYgUGFyc2VUb0FTVChwdW1wX3NyY190ZXh0KToKKyAgIiIiQ29udmVydCB0aGUgZ2l2ZW4gUHVtcCBzb3VyY2UgdGV4dCBpbnRvIGFuIEFTVC4iIiIKKyAgdG9rZW5zID0gbGlzdChUb2tlbml6ZShwdW1wX3NyY190ZXh0KSkKKyAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgIHJldHVybiBjb2RlX25vZGUKKworCitjbGFzcyBFbnY6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnZhcmlhYmxlcyA9IFtdCisgICAgc2VsZi5yYW5nZXMgPSBbXQorCisgIGRlZiBDbG9uZShzZWxmKToKKyAgICBjbG9uZSA9IEVudigpCisgICAgY2xvbmUudmFyaWFibGVzID0gc2VsZi52YXJpYWJsZXNbOl0KKyAgICBjbG9uZS5yYW5nZXMgPSBzZWxmLnJhbmdlc1s6XQorICAgIHJldHVybiBjbG9uZQorCisgIGRlZiBQdXNoVmFyaWFibGUoc2VsZiwgdmFyLCB2YWx1ZSk6CisgICAgIyBJZiB2YWx1ZSBsb29rcyBsaWtlIGFuIGludCwgc3RvcmUgaXQgYXMgYW4gaW50LgorICAgIHRyeToKKyAgICAgIGludF92YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgIGlmICgnJXMnICUgaW50X3ZhbHVlKSA9PSB2YWx1ZToKKyAgICAgICAgdmFsdWUgPSBpbnRfdmFsdWUKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgcGFzcworICAgIHNlbGYudmFyaWFibGVzWzowXSA9IFsodmFyLCB2YWx1ZSldCisKKyAgZGVmIFBvcFZhcmlhYmxlKHNlbGYpOgorICAgIHNlbGYudmFyaWFibGVzWzoxXSA9IFtdCisKKyAgZGVmIFB1c2hSYW5nZShzZWxmLCB2YXIsIGxvd2VyLCB1cHBlcik6CisgICAgc2VsZi5yYW5nZXNbOjBdID0gWyh2YXIsIGxvd2VyLCB1cHBlcildCisKKyAgZGVmIFBvcFJhbmdlKHNlbGYpOgorICAgIHNlbGYucmFuZ2VzWzoxXSA9IFtdCisKKyAgZGVmIEdldFZhbHVlKHNlbGYsIGlkZW50aWZpZXIpOgorICAgIGZvciAodmFyLCB2YWx1ZSkgaW4gc2VsZi52YXJpYWJsZXM6CisgICAgICBpZiBpZGVudGlmaWVyID09IHZhcjoKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBwcmludCAnRVJST1I6IG1ldGEgdmFyaWFibGUgJXMgaXMgdW5kZWZpbmVkLicgJSAoaWRlbnRpZmllciwpCisgICAgc3lzLmV4aXQoMSkKKworICBkZWYgRXZhbEV4cChzZWxmLCBleHApOgorICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IGV2YWwoZXhwLnB5dGhvbl9leHApCisgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgIHByaW50ICdFUlJPUjogY2F1Z2h0IGV4Y2VwdGlvbiAlczogJXMnICUgKGUuX19jbGFzc19fLl9fbmFtZV9fLCBlKQorICAgICAgcHJpbnQgKCdFUlJPUjogZmFpbGVkIHRvIGV2YWx1YXRlIG1ldGEgZXhwcmVzc2lvbiAlcyBhdCAlcycgJQorICAgICAgICAgICAgIChleHAucHl0aG9uX2V4cCwgZXhwLnRva2VuLnN0YXJ0KSkKKyAgICAgIHN5cy5leGl0KDEpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBHZXRSYW5nZShzZWxmLCBpZGVudGlmaWVyKToKKyAgICBmb3IgKHZhciwgbG93ZXIsIHVwcGVyKSBpbiBzZWxmLnJhbmdlczoKKyAgICAgIGlmIGlkZW50aWZpZXIgPT0gdmFyOgorICAgICAgICByZXR1cm4gKGxvd2VyLCB1cHBlcikKKworICAgIHByaW50ICdFUlJPUjogcmFuZ2UgJXMgaXMgdW5kZWZpbmVkLicgJSAoaWRlbnRpZmllciwpCisgICAgc3lzLmV4aXQoMSkKKworCitjbGFzcyBPdXRwdXQ6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnN0cmluZyA9ICcnCisKKyAgZGVmIEdldExhc3RMaW5lKHNlbGYpOgorICAgIGluZGV4ID0gc2VsZi5zdHJpbmcucmZpbmQoJ1xuJykKKyAgICBpZiBpbmRleCA8IDA6CisgICAgICByZXR1cm4gJycKKworICAgIHJldHVybiBzZWxmLnN0cmluZ1tpbmRleCArIDE6XQorCisgIGRlZiBBcHBlbmQoc2VsZiwgcyk6CisgICAgc2VsZi5zdHJpbmcgKz0gcworCisKK2RlZiBSdW5BdG9taWNDb2RlKGVudiwgbm9kZSwgb3V0cHV0KToKKyAgaWYgaXNpbnN0YW5jZShub2RlLCBWYXJOb2RlKToKKyAgICBpZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyLnZhbHVlLnN0cmlwKCkKKyAgICByZXN1bHQgPSBPdXRwdXQoKQorICAgIFJ1bkF0b21pY0NvZGUoZW52LkNsb25lKCksIG5vZGUuYXRvbWljX2NvZGUsIHJlc3VsdCkKKyAgICB2YWx1ZSA9IHJlc3VsdC5zdHJpbmcKKyAgICBlbnYuUHVzaFZhcmlhYmxlKGlkZW50aWZpZXIsIHZhbHVlKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgUmFuZ2VOb2RlKToKKyAgICBpZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyLnZhbHVlLnN0cmlwKCkKKyAgICBsb3dlciA9IGludChlbnYuRXZhbEV4cChub2RlLmV4cDEpKQorICAgIHVwcGVyID0gaW50KGVudi5FdmFsRXhwKG5vZGUuZXhwMikpCisgICAgZW52LlB1c2hSYW5nZShpZGVudGlmaWVyLCBsb3dlciwgdXBwZXIpCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBGb3JOb2RlKToKKyAgICBpZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyLnZhbHVlLnN0cmlwKCkKKyAgICBpZiBub2RlLnNlcCBpcyBOb25lOgorICAgICAgc2VwID0gJycKKyAgICBlbHNlOgorICAgICAgc2VwID0gbm9kZS5zZXAudmFsdWUKKyAgICAobG93ZXIsIHVwcGVyKSA9IGVudi5HZXRSYW5nZShpZGVudGlmaWVyKQorICAgIGZvciBpIGluIHJhbmdlKGxvd2VyLCB1cHBlciArIDEpOgorICAgICAgbmV3X2VudiA9IGVudi5DbG9uZSgpCisgICAgICBuZXdfZW52LlB1c2hWYXJpYWJsZShpZGVudGlmaWVyLCBpKQorICAgICAgUnVuQ29kZShuZXdfZW52LCBub2RlLmNvZGUsIG91dHB1dCkKKyAgICAgIGlmIGkgIT0gdXBwZXI6CisgICAgICAgIG91dHB1dC5BcHBlbmQoc2VwKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgUmF3Q29kZU5vZGUpOgorICAgIG91dHB1dC5BcHBlbmQobm9kZS5yYXdfY29kZS52YWx1ZSkKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIElmTm9kZSk6CisgICAgY29uZCA9IGVudi5FdmFsRXhwKG5vZGUuZXhwKQorICAgIGlmIGNvbmQ6CisgICAgICBSdW5Db2RlKGVudi5DbG9uZSgpLCBub2RlLnRoZW5fYnJhbmNoLCBvdXRwdXQpCisgICAgZWxpZiBub2RlLmVsc2VfYnJhbmNoIGlzIG5vdCBOb25lOgorICAgICAgUnVuQ29kZShlbnYuQ2xvbmUoKSwgbm9kZS5lbHNlX2JyYW5jaCwgb3V0cHV0KQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRXhwTm9kZSk6CisgICAgdmFsdWUgPSBlbnYuRXZhbEV4cChub2RlKQorICAgIG91dHB1dC5BcHBlbmQoJyVzJyAlICh2YWx1ZSwpKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgTGl0ZXJhbERvbGxhck5vZGUpOgorICAgIG91dHB1dC5BcHBlbmQoJyQnKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29kZU5vZGUpOgorICAgIFJ1bkNvZGUoZW52LkNsb25lKCksIG5vZGUsIG91dHB1dCkKKyAgZWxzZToKKyAgICBwcmludCAnQkFEJworICAgIHByaW50IG5vZGUKKyAgICBzeXMuZXhpdCgxKQorCisKK2RlZiBSdW5Db2RlKGVudiwgY29kZV9ub2RlLCBvdXRwdXQpOgorICBmb3IgYXRvbWljX2NvZGUgaW4gY29kZV9ub2RlLmF0b21pY19jb2RlOgorICAgIFJ1bkF0b21pY0NvZGUoZW52LCBhdG9taWNfY29kZSwgb3V0cHV0KQorCisKK2RlZiBJc1NpbmdsZUxpbmVDb21tZW50KGN1cl9saW5lKToKKyAgcmV0dXJuICcvLycgaW4gY3VyX2xpbmUKKworCitkZWYgSXNJblByZXByb2Nlc3NvckRpcmVjdGl2ZShwcmV2X2xpbmVzLCBjdXJfbGluZSk6CisgIGlmIGN1cl9saW5lLmxzdHJpcCgpLnN0YXJ0c3dpdGgoJyMnKToKKyAgICByZXR1cm4gVHJ1ZQorICByZXR1cm4gcHJldl9saW5lcyBhbmQgcHJldl9saW5lc1stMV0uZW5kc3dpdGgoJ1xcJykKKworCitkZWYgV3JhcENvbW1lbnQobGluZSwgb3V0cHV0KToKKyAgbG9jID0gbGluZS5maW5kKCcvLycpCisgIGJlZm9yZV9jb21tZW50ID0gbGluZVs6bG9jXS5yc3RyaXAoKQorICBpZiBiZWZvcmVfY29tbWVudCA9PSAnJzoKKyAgICBpbmRlbnQgPSBsb2MKKyAgZWxzZToKKyAgICBvdXRwdXQuYXBwZW5kKGJlZm9yZV9jb21tZW50KQorICAgIGluZGVudCA9IGxlbihiZWZvcmVfY29tbWVudCkgLSBsZW4oYmVmb3JlX2NvbW1lbnQubHN0cmlwKCkpCisgIHByZWZpeCA9IGluZGVudConICcgKyAnLy8gJworICBtYXhfbGVuID0gODAgLSBsZW4ocHJlZml4KQorICBjb21tZW50ID0gbGluZVtsb2MgKyAyOl0uc3RyaXAoKQorICBzZWdzID0gW3NlZyBmb3Igc2VnIGluIHJlLnNwbGl0KHInKFx3K1xXKiknLCBjb21tZW50KSBpZiBzZWcgIT0gJyddCisgIGN1cl9saW5lID0gJycKKyAgZm9yIHNlZyBpbiBzZWdzOgorICAgIGlmIGxlbigoY3VyX2xpbmUgKyBzZWcpLnJzdHJpcCgpKSA8IG1heF9sZW46CisgICAgICBjdXJfbGluZSArPSBzZWcKKyAgICBlbHNlOgorICAgICAgaWYgY3VyX2xpbmUuc3RyaXAoKSAhPSAnJzoKKyAgICAgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBjdXJfbGluZS5yc3RyaXAoKSkKKyAgICAgIGN1cl9saW5lID0gc2VnLmxzdHJpcCgpCisgIGlmIGN1cl9saW5lLnN0cmlwKCkgIT0gJyc6CisgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBjdXJfbGluZS5zdHJpcCgpKQorCisKK2RlZiBXcmFwQ29kZShsaW5lLCBsaW5lX2NvbmNhdCwgb3V0cHV0KToKKyAgaW5kZW50ID0gbGVuKGxpbmUpIC0gbGVuKGxpbmUubHN0cmlwKCkpCisgIHByZWZpeCA9IGluZGVudConICcgICMgUHJlZml4IG9mIHRoZSBjdXJyZW50IGxpbmUKKyAgbWF4X2xlbiA9IDgwIC0gaW5kZW50IC0gbGVuKGxpbmVfY29uY2F0KSAgIyBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgY3VycmVudCBsaW5lCisgIG5ld19wcmVmaXggPSBwcmVmaXggKyA0KicgJyAgIyBQcmVmaXggb2YgYSBjb250aW51YXRpb24gbGluZQorICBuZXdfbWF4X2xlbiA9IG1heF9sZW4gLSA0ICAjIE1heGltdW0gbGVuZ3RoIG9mIGEgY29udGludWF0aW9uIGxpbmUKKyAgIyBQcmVmZXJzIHRvIHdyYXAgYSBsaW5lIGFmdGVyIGEgJywnIG9yICc7Jy4KKyAgc2VncyA9IFtzZWcgZm9yIHNlZyBpbiByZS5zcGxpdChyJyhbXiw7XStbLDtdPyknLCBsaW5lLnN0cmlwKCkpIGlmIHNlZyAhPSAnJ10KKyAgY3VyX2xpbmUgPSAnJyAgIyBUaGUgY3VycmVudCBsaW5lIHdpdGhvdXQgbGVhZGluZyBzcGFjZXMuCisgIGZvciBzZWcgaW4gc2VnczoKKyAgICAjIElmIHRoZSBsaW5lIGlzIHN0aWxsIHRvbyBsb25nLCB3cmFwIGF0IGEgc3BhY2UuCisgICAgd2hpbGUgY3VyX2xpbmUgPT0gJycgYW5kIGxlbihzZWcuc3RyaXAoKSkgPiBtYXhfbGVuOgorICAgICAgc2VnID0gc2VnLmxzdHJpcCgpCisgICAgICBzcGxpdF9hdCA9IHNlZy5yZmluZCgnICcsIDAsIG1heF9sZW4pCisgICAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIHNlZ1s6c3BsaXRfYXRdLnN0cmlwKCkgKyBsaW5lX2NvbmNhdCkKKyAgICAgIHNlZyA9IHNlZ1tzcGxpdF9hdCArIDE6XQorICAgICAgcHJlZml4ID0gbmV3X3ByZWZpeAorICAgICAgbWF4X2xlbiA9IG5ld19tYXhfbGVuCisKKyAgICBpZiBsZW4oKGN1cl9saW5lICsgc2VnKS5yc3RyaXAoKSkgPCBtYXhfbGVuOgorICAgICAgY3VyX2xpbmUgPSAoY3VyX2xpbmUgKyBzZWcpLmxzdHJpcCgpCisgICAgZWxzZToKKyAgICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgY3VyX2xpbmUucnN0cmlwKCkgKyBsaW5lX2NvbmNhdCkKKyAgICAgIHByZWZpeCA9IG5ld19wcmVmaXgKKyAgICAgIG1heF9sZW4gPSBuZXdfbWF4X2xlbgorICAgICAgY3VyX2xpbmUgPSBzZWcubHN0cmlwKCkKKyAgaWYgY3VyX2xpbmUuc3RyaXAoKSAhPSAnJzoKKyAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIGN1cl9saW5lLnN0cmlwKCkpCisKKworZGVmIFdyYXBQcmVwcm9jZXNzb3JEaXJlY3RpdmUobGluZSwgb3V0cHV0KToKKyAgV3JhcENvZGUobGluZSwgJyBcXCcsIG91dHB1dCkKKworCitkZWYgV3JhcFBsYWluQ29kZShsaW5lLCBvdXRwdXQpOgorICBXcmFwQ29kZShsaW5lLCAnJywgb3V0cHV0KQorCisKK2RlZiBJc011bHRpTGluZUlXWVVQcmFnbWEobGluZSk6CisgIHJldHVybiByZS5zZWFyY2gocicvXCogSVdZVSBwcmFnbWE6ICcsIGxpbmUpCisKKworZGVmIElzSGVhZGVyR3VhcmRJbmNsdWRlT3JPbmVMaW5lSVdZVVByYWdtYShsaW5lKToKKyAgcmV0dXJuIChyZS5tYXRjaChyJ14jKGlmbmRlZnxkZWZpbmV8ZW5kaWZccyovLylccypbXHdfXStccyokJywgbGluZSkgb3IKKyAgICAgICAgICByZS5tYXRjaChyJ14jaW5jbHVkZVxzJywgbGluZSkgb3IKKyAgICAgICAgICAjIERvbid0IGJyZWFrIElXWVUgcHJhZ21hcywgZWl0aGVyOyB0aGF0IGNhdXNlcyBpd3l1LnB5IHByb2JsZW1zLgorICAgICAgICAgIHJlLnNlYXJjaChyJy8vIElXWVUgcHJhZ21hOiAnLCBsaW5lKSkKKworCitkZWYgV3JhcExvbmdMaW5lKGxpbmUsIG91dHB1dCk6CisgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgIGlmIGxlbihsaW5lKSA8PSA4MDoKKyAgICBvdXRwdXQuYXBwZW5kKGxpbmUpCisgIGVsaWYgSXNTaW5nbGVMaW5lQ29tbWVudChsaW5lKToKKyAgICBpZiBJc0hlYWRlckd1YXJkSW5jbHVkZU9yT25lTGluZUlXWVVQcmFnbWEobGluZSk6CisgICAgICAjIFRoZSBzdHlsZSBndWlkZSBtYWRlIGFuIGV4Y2VwdGlvbiB0byBhbGxvdyBsb25nIGhlYWRlciBndWFyZCBsaW5lcywKKyAgICAgICMgaW5jbHVkZXMgYW5kIElXWVUgcHJhZ21hcy4KKyAgICAgIG91dHB1dC5hcHBlbmQobGluZSkKKyAgICBlbHNlOgorICAgICAgV3JhcENvbW1lbnQobGluZSwgb3V0cHV0KQorICBlbGlmIElzSW5QcmVwcm9jZXNzb3JEaXJlY3RpdmUob3V0cHV0LCBsaW5lKToKKyAgICBpZiBJc0hlYWRlckd1YXJkSW5jbHVkZU9yT25lTGluZUlXWVVQcmFnbWEobGluZSk6CisgICAgICAjIFRoZSBzdHlsZSBndWlkZSBtYWRlIGFuIGV4Y2VwdGlvbiB0byBhbGxvdyBsb25nIGhlYWRlciBndWFyZCBsaW5lcywKKyAgICAgICMgaW5jbHVkZXMgYW5kIElXWVUgcHJhZ21hcy4KKyAgICAgIG91dHB1dC5hcHBlbmQobGluZSkKKyAgICBlbHNlOgorICAgICAgV3JhcFByZXByb2Nlc3NvckRpcmVjdGl2ZShsaW5lLCBvdXRwdXQpCisgIGVsaWYgSXNNdWx0aUxpbmVJV1lVUHJhZ21hKGxpbmUpOgorICAgIG91dHB1dC5hcHBlbmQobGluZSkKKyAgZWxzZToKKyAgICBXcmFwUGxhaW5Db2RlKGxpbmUsIG91dHB1dCkKKworCitkZWYgQmVhdXRpZnlDb2RlKHN0cmluZyk6CisgIGxpbmVzID0gc3RyaW5nLnNwbGl0bGluZXMoKQorICBvdXRwdXQgPSBbXQorICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICBXcmFwTG9uZ0xpbmUobGluZSwgb3V0cHV0KQorICBvdXRwdXQyID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gb3V0cHV0XQorICByZXR1cm4gJ1xuJy5qb2luKG91dHB1dDIpICsgJ1xuJworCisKK2RlZiBDb252ZXJ0RnJvbVB1bXBTb3VyY2Uoc3JjX3RleHQpOgorICAiIiJSZXR1cm4gdGhlIHRleHQgZ2VuZXJhdGVkIGZyb20gdGhlIGdpdmVuIFB1bXAgc291cmNlIHRleHQuIiIiCisgIGFzdCA9IFBhcnNlVG9BU1QoU3RyaXBNZXRhQ29tbWVudHMoc3JjX3RleHQpKQorICBvdXRwdXQgPSBPdXRwdXQoKQorICBSdW5Db2RlKEVudigpLCBhc3QsIG91dHB1dCkKKyAgcmV0dXJuIEJlYXV0aWZ5Q29kZShvdXRwdXQuc3RyaW5nKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBpZiBsZW4oYXJndikgPT0gMToKKyAgICBwcmludCBfX2RvY19fCisgICAgc3lzLmV4aXQoMSkKKworICBmaWxlX3BhdGggPSBhcmd2Wy0xXQorICBvdXRwdXRfc3RyID0gQ29udmVydEZyb21QdW1wU291cmNlKGZpbGUoZmlsZV9wYXRoLCAncicpLnJlYWQoKSkKKyAgaWYgZmlsZV9wYXRoLmVuZHN3aXRoKCcucHVtcCcpOgorICAgIG91dHB1dF9maWxlX3BhdGggPSBmaWxlX3BhdGhbOi01XQorICBlbHNlOgorICAgIG91dHB1dF9maWxlX3BhdGggPSAnLScKKyAgaWYgb3V0cHV0X2ZpbGVfcGF0aCA9PSAnLSc6CisgICAgcHJpbnQgb3V0cHV0X3N0ciwKKyAgZWxzZToKKyAgICBvdXRwdXRfZmlsZSA9IGZpbGUob3V0cHV0X2ZpbGVfcGF0aCwgJ3cnKQorICAgIG91dHB1dF9maWxlLndyaXRlKCcvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOlxuJykKKyAgICBvdXRwdXRfZmlsZS53cml0ZSgnLy8gICAgICVzICVzXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5iYXNlbmFtZShfX2ZpbGVfXyksIG9zLnBhdGguYmFzZW5hbWUoZmlsZV9wYXRoKSkpCisgICAgb3V0cHV0X2ZpbGUud3JpdGUoJy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISFcblxuJykKKyAgICBvdXRwdXRfZmlsZS53cml0ZShvdXRwdXRfc3RyKQorICAgIG91dHB1dF9maWxlLmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NjcmlwdHMvdGVzdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGZmNTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUKQEAgLTAsMCArMSw1OSBAQAorIyBBIE1ha2VmaWxlIGZvciBmdXNpbmcgR29vZ2xlIFRlc3QgYW5kIGJ1aWxkaW5nIGEgc2FtcGxlIHRlc3QgYWdhaW5zdCBpdC4KKyMKKyMgU1lOT1BTSVM6CisjCisjICAgbWFrZSBbYWxsXSAgLSBtYWtlcyBldmVyeXRoaW5nLgorIyAgIG1ha2UgVEFSR0VUIC0gbWFrZXMgdGhlIGdpdmVuIHRhcmdldC4KKyMgICBtYWtlIGNoZWNrICAtIG1ha2VzIGV2ZXJ5dGhpbmcgYW5kIHJ1bnMgdGhlIGJ1aWx0IHNhbXBsZSB0ZXN0LgorIyAgIG1ha2UgY2xlYW4gIC0gcmVtb3ZlcyBhbGwgZmlsZXMgZ2VuZXJhdGVkIGJ5IG1ha2UuCisKKyMgUG9pbnRzIHRvIHRoZSByb290IG9mIGZ1c2VkIEdvb2dsZSBUZXN0LCByZWxhdGl2ZSB0byB3aGVyZSB0aGlzIGZpbGUgaXMuCitGVVNFRF9HVEVTVF9ESVIgPSBvdXRwdXQKKworIyBQYXRocyB0byB0aGUgZnVzZWQgZ3Rlc3QgZmlsZXMuCitGVVNFRF9HVEVTVF9IID0gJChGVVNFRF9HVEVTVF9ESVIpL2d0ZXN0L2d0ZXN0LmgKK0ZVU0VEX0dURVNUX0FMTF9DQyA9ICQoRlVTRURfR1RFU1RfRElSKS9ndGVzdC9ndGVzdC1hbGwuY2MKKworIyBXaGVyZSB0byBmaW5kIHRoZSBzYW1wbGUgdGVzdC4KK1NBTVBMRV9ESVIgPSAuLi8uLi9zYW1wbGVzCisKKyMgV2hlcmUgdG8gZmluZCBndGVzdF9tYWluLmNjLgorR1RFU1RfTUFJTl9DQyA9IC4uLy4uL3NyYy9ndGVzdF9tYWluLmNjCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBwcmVwcm9jZXNzb3IuCisjIFdlIGhhdmUgbm8gaWRlYSBoZXJlIHdoZXRoZXIgcHRocmVhZHMgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0sIHNvCisjIGRpc2FibGUgaXRzIHVzZS4KK0NQUEZMQUdTICs9IC1JJChGVVNFRF9HVEVTVF9ESVIpIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAorCisjIEZsYWdzIHBhc3NlZCB0byB0aGUgQysrIGNvbXBpbGVyLgorQ1hYRkxBR1MgKz0gLWcKKworYWxsIDogc2FtcGxlMV91bml0dGVzdAorCitjaGVjayA6IGFsbAorCS4vc2FtcGxlMV91bml0dGVzdAorCitjbGVhbiA6CisJcm0gLXJmICQoRlVTRURfR1RFU1RfRElSKSBzYW1wbGUxX3VuaXR0ZXN0ICoubworCiskKEZVU0VEX0dURVNUX0gpIDoKKwkuLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5ICQoRlVTRURfR1RFU1RfRElSKQorCiskKEZVU0VEX0dURVNUX0FMTF9DQykgOgorCS4uL2Z1c2VfZ3Rlc3RfZmlsZXMucHkgJChGVVNFRF9HVEVTVF9ESVIpCisKK2d0ZXN0LWFsbC5vIDogJChGVVNFRF9HVEVTVF9IKSAkKEZVU0VEX0dURVNUX0FMTF9DQykKKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChGVVNFRF9HVEVTVF9ESVIpL2d0ZXN0L2d0ZXN0LWFsbC5jYworCitndGVzdF9tYWluLm8gOiAkKEZVU0VEX0dURVNUX0gpICQoR1RFU1RfTUFJTl9DQykKKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChHVEVTVF9NQUlOX0NDKQorCitzYW1wbGUxLm8gOiAkKFNBTVBMRV9ESVIpL3NhbXBsZTEuY2MgJChTQU1QTEVfRElSKS9zYW1wbGUxLmgKKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChTQU1QTEVfRElSKS9zYW1wbGUxLmNjCisKK3NhbXBsZTFfdW5pdHRlc3QubyA6ICQoU0FNUExFX0RJUikvc2FtcGxlMV91bml0dGVzdC5jYyBcCisgICAgICAgICAgICAgICAgICAgICAkKFNBTVBMRV9ESVIpL3NhbXBsZTEuaCAkKEZVU0VEX0dURVNUX0gpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoU0FNUExFX0RJUikvc2FtcGxlMV91bml0dGVzdC5jYworCitzYW1wbGUxX3VuaXR0ZXN0IDogc2FtcGxlMS5vIHNhbXBsZTFfdW5pdHRlc3QubyBndGVzdC1hbGwubyBndGVzdF9tYWluLm8KKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgJF4gLW8gJEAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LWFsbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LWFsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTljZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtYWxsLmNjCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGJ1aWxkIEdvb2dsZSBUZXN0IGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBmaWxlLgorLy8gVGhpcyBmaWxlIHNlcnZlcyB0aGlzIHB1cnBvc2UuCisKKy8vIFRoaXMgbGluZSBlbnN1cmVzIHRoYXQgZ3Rlc3QuaCBjYW4gYmUgY29tcGlsZWQgb24gaXRzIG93biwgZXZlbgorLy8gd2hlbiBpdCdzIGZ1c2VkLgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHVsbCBpbiB0aGUgcmVhbCBndGVzdCAqLmNjIGZpbGVzLgorI2luY2x1ZGUgInNyYy9ndGVzdC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtZmlsZXBhdGguY2MiCisjaW5jbHVkZSAic3JjL2d0ZXN0LXBvcnQuY2MiCisjaW5jbHVkZSAic3JjL2d0ZXN0LXByaW50ZXJzLmNjIgorI2luY2x1ZGUgInNyYy9ndGVzdC10ZXN0LXBhcnQuY2MiCisjaW5jbHVkZSAic3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUyNDMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYwpAQCAtMCwwICsxLDEzNDEgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRlYXRoIHRlc3RzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyMgaWYgR1RFU1RfT1NfTUFDCisjICBpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyMgaW5jbHVkZSA8ZXJybm8uaD4KKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisKKyMgaWYgR1RFU1RfT1NfTElOVVgKKyMgIGluY2x1ZGUgPHNpZ25hbC5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworIyBpbmNsdWRlIDxzdGRhcmcuaD4KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisjICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjICBpbmNsdWRlIDxzeXMvd2FpdC5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjIGlmIEdURVNUX09TX1FOWAorIyAgaW5jbHVkZSA8c3Bhd24uaD4KKyMgZW5kaWYgIC8vIEdURVNUX09TX1FOWAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIENvbnN0YW50cy4KKworLy8gVGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGVbXSA9ICJmYXN0IjsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZGVhdGhfdGVzdF9zdHlsZSwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3N0eWxlIiwga0RlZmF1bHREZWF0aFRlc3RTdHlsZSksCisgICAgIkluZGljYXRlcyBob3cgdG8gcnVuIGEgZGVhdGggdGVzdCBpbiBhIGZvcmtlZCBjaGlsZCBwcm9jZXNzOiAiCisgICAgIlwidGhyZWFkc2FmZVwiIChjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB0ZXN0IGJpbmFyeSAiCisgICAgImZyb20gdGhlIGJlZ2lubmluZywgcnVubmluZyBvbmx5IHRoZSBzcGVjaWZpYyBkZWF0aCB0ZXN0KSBvciAiCisgICAgIlwiZmFzdFwiIChjaGlsZCBwcm9jZXNzIHJ1bnMgdGhlIGRlYXRoIHRlc3QgaW1tZWRpYXRlbHkgIgorICAgICJhZnRlciBmb3JraW5nKS4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmssCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3RfdXNlX2ZvcmsiLCBmYWxzZSksCisgICAgIkluc3RydWN0cyB0byB1c2UgZm9yaygpL19leGl0KCkgaW5zdGVhZCBvZiBjbG9uZSgpIGluIGRlYXRoIHRlc3RzLiAiCisgICAgIklnbm9yZWQgYW5kIGFsd2F5cyB1c2VzIGZvcmsoKSBvbiBQT1NJWCBzeXN0ZW1zIHdoZXJlIGNsb25lKCkgaXMgbm90ICIKKyAgICAiaW1wbGVtZW50ZWQuIFVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQgb3Igc2ltaWxhciB0b29scyBpZiAiCisgICAgInRob3NlIGRvIG5vdCBzdXBwb3J0IGNsb25lKCkuIFZhbGdyaW5kIDMuMy4xIHdpbGwganVzdCBmYWlsIGlmICIKKyAgICAiaXQgc2VlcyBhbiB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBjbG9uZSgpIGZsYWdzLiAiCisgICAgIkl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmbGFnIHcvbyB2YWxncmluZCB0aG91Z2ggaXQgd2lsbCAiCisgICAgIndvcmsgaW4gOTklIG9mIHRoZSBjYXNlcy4gT25jZSB2YWxncmluZCBpcyBmaXhlZCwgdGhpcyBmbGFnIHdpbGwgIgorICAgICJtb3N0IGxpa2VseSBiZSByZW1vdmVkLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QsICIiLAorICAgICJJbmRpY2F0ZXMgdGhlIGZpbGUsIGxpbmUgbnVtYmVyLCB0ZW1wb3JhbCBpbmRleCBvZiAiCisgICAgInRoZSBzaW5nbGUgZGVhdGggdGVzdCB0byBydW4sIGFuZCBhIGZpbGUgZGVzY3JpcHRvciB0byAiCisgICAgIndoaWNoIGEgc3VjY2VzcyBjb2RlIG1heSBiZSBzZW50LCBhbGwgc2VwYXJhdGVkIGJ5ICIKKyAgICAidGhlICd8JyBjaGFyYWN0ZXJzLiAgVGhpcyBmbGFnIGlzIHNwZWNpZmllZCBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudCAiCisgICAgInByb2Nlc3MgaXMgYSBzdWItcHJvY2VzcyBsYXVuY2hlZCBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlICIKKyAgICAiZGVhdGggdGVzdC4gIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4iKTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVmFsaWQgb25seSBmb3IgZmFzdCBkZWF0aCB0ZXN0cy4gSW5kaWNhdGVzIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gdGhlCisvLyBjaGlsZCBwcm9jZXNzIG9mIGEgZmFzdCBzdHlsZSBkZWF0aCB0ZXN0Lgorc3RhdGljIGJvb2wgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSBmYWxzZTsKKworLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5CisvLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMKKy8vIFZhbGdyaW5kIGhlYXAgY2hlY2tlcnMgbWF5IG5lZWQgdGhpcyB0byBtb2RpZnkgdGhlaXIgYmVoYXZpb3IgaW4gZGVhdGgKKy8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuCitib29sIEluRGVhdGhUZXN0Q2hpbGQoKSB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICAvLyBPbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyBhcmUgdGhyZWFkLXNhZmUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlCisgIC8vIGRlYXRoX3Rlc3Rfc3R5bGUgZmxhZy4KKyAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworCisjIGVsc2UKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpCisgICAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworICBlbHNlCisgICAgcmV0dXJuIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBFeGl0ZWRXaXRoQ29kZSBjb25zdHJ1Y3Rvci4KK0V4aXRlZFdpdGhDb2RlOjpFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKSA6IGV4aXRfY29kZV8oZXhpdF9jb2RlKSB7Cit9CisKKy8vIEV4aXRlZFdpdGhDb2RlIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IuCitib29sIEV4aXRlZFdpdGhDb2RlOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3QgeworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIGV4aXRfc3RhdHVzID09IGV4aXRfY29kZV87CisKKyMgZWxzZQorCisgIHJldHVybiBXSUZFWElURUQoZXhpdF9zdGF0dXMpICYmIFdFWElUU1RBVFVTKGV4aXRfc3RhdHVzKSA9PSBleGl0X2NvZGVfOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIEtpbGxlZEJ5U2lnbmFsIGNvbnN0cnVjdG9yLgorS2lsbGVkQnlTaWduYWw6OktpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pIDogc2lnbnVtXyhzaWdudW0pIHsKK30KKworLy8gS2lsbGVkQnlTaWduYWwgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KK2Jvb2wgS2lsbGVkQnlTaWduYWw6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7CisgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X3N0YXR1cykgJiYgV1RFUk1TSUcoZXhpdF9zdGF0dXMpID09IHNpZ251bV87Cit9CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVdGlsaXRpZXMgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIGV4aXQgY29kZSwgaW4gdGhlIGZvcm1hdAorLy8gc3BlY2lmaWVkIGJ5IHdhaXQoMikuCitzdGF0aWMgc3RkOjpzdHJpbmcgRXhpdFN1bW1hcnkoaW50IGV4aXRfY29kZSkgeworICBNZXNzYWdlIG07CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgZXhpdF9jb2RlOworCisjIGVsc2UKKworICBpZiAoV0lGRVhJVEVEKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7CisgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIlRlcm1pbmF0ZWQgYnkgc2lnbmFsICIgPDwgV1RFUk1TSUcoZXhpdF9jb2RlKTsKKyAgfQorIyAgaWZkZWYgV0NPUkVEVU1QCisgIGlmIChXQ09SRURVTVAoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIiAoY29yZSBkdW1wZWQpIjsKKyAgfQorIyAgZW5kaWYKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cykgeworICByZXR1cm4gIUV4aXRlZFdpdGhDb2RlKDApKGV4aXRfc3RhdHVzKTsKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiBhIGRlYXRoIHRlc3QgZmluZHMgbW9yZSB0aGFuCisvLyBvbmUgdGhyZWFkIHJ1bm5pbmcsIG9yIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBwcmlvcgorLy8gdG8gZXhlY3V0aW5nIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisvLyBjYWxsZXIgbm90IHRvIHBhc3MgYSB0aHJlYWRfY291bnQgb2YgMS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHNpemVfdCB0aHJlYWRfY291bnQpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiRGVhdGggdGVzdHMgdXNlIGZvcmsoKSwgd2hpY2ggaXMgdW5zYWZlIHBhcnRpY3VsYXJseSIKKyAgICAgIDw8ICIgaW4gYSB0aHJlYWRlZCBjb250ZXh0LiBGb3IgdGhpcyB0ZXN0LCAiIDw8IEdURVNUX05BTUVfIDw8ICIgIjsKKyAgaWYgKHRocmVhZF9jb3VudCA9PSAwKQorICAgIG1zZyA8PCAiY291bGRuJ3QgZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iOworICBlbHNlCisgICAgbXNnIDw8ICJkZXRlY3RlZCAiIDw8IHRocmVhZF9jb3VudCA8PCAiIHRocmVhZHMuIjsKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKKy8vIEZsYWcgY2hhcmFjdGVycyBmb3IgcmVwb3J0aW5nIGEgZGVhdGggdGVzdCB0aGF0IGRpZCBub3QgZGllLgorc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdExpdmVkID0gJ0wnOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFJldHVybmVkID0gJ1InOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFRocmV3ID0gJ1QnOworc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdEludGVybmFsRXJyb3IgPSAnSSc7CisKKy8vIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBwb3NzaWJsZSB3YXlzIHRoYXQgYSBkZWF0aCB0ZXN0IGNhbgorLy8gY29uY2x1ZGUuICBESUVEIG1lYW5zIHRoYXQgdGhlIHByb2Nlc3MgZGllZCB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QKKy8vIGNvZGU7IExJVkVEIG1lYW5zIHRoYXQgcHJvY2VzcyBsaXZlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgdGVzdCBjb2RlOworLy8gUkVUVVJORUQgbWVhbnMgdGhhdCB0aGUgdGVzdCBzdGF0ZW1lbnQgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgYSByZXR1cm4KKy8vIHN0YXRlbWVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQ7IFRIUkVXIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50CisvLyByZXR1cm5lZCBjb250cm9sIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIElOX1BST0dSRVNTIG1lYW5zIHRoZSB0ZXN0CisvLyBoYXMgbm90IHlldCBjb25jbHVkZWQuCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBVbmlmeSBuYW1lcyBhbmQgcG9zc2libHkgdmFsdWVzIGZvcgorLy8gQWJvcnRSZWFzb24sIERlYXRoVGVzdE91dGNvbWUsIGFuZCBmbGFnIGNoYXJhY3RlcnMgYWJvdmUuCitlbnVtIERlYXRoVGVzdE91dGNvbWUgeyBJTl9QUk9HUkVTUywgRElFRCwgTElWRUQsIFJFVFVSTkVELCBUSFJFVyB9OworCisvLyBSb3V0aW5lIGZvciBhYm9ydGluZyB0aGUgcHJvZ3JhbSB3aGljaCBpcyBzYWZlIHRvIGNhbGwgZnJvbSBhbgorLy8gZXhlYy1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yCisvLyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIHRoZQorLy8gbWVzc2FnZSBpcyBzaW1wbHkgcHJpbnRlZCB0byBzdGRlcnIuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHByb2dyYW0KKy8vIHRoZW4gZXhpdHMgd2l0aCBzdGF0dXMgMS4KK3ZvaWQgRGVhdGhUZXN0QWJvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gT24gYSBQT1NJWCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkc2FmZS1zdHlsZQorICAvLyBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIHdoaWNoIG9wZXJhdGVzIG9uIGEgdmVyeSBzbWFsbCBzdGFjay4gIFVzZQorICAvLyB0aGUgaGVhcCBmb3IgYW55IGFkZGl0aW9uYWwgbm9uLW1pbnVzY3VsZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgorICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgR2V0VW5pdFRlc3RJbXBsKCktPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIEZJTEUqIHBhcmVudCA9IHBvc2l4OjpGRE9wZW4oZmxhZy0+d3JpdGVfZmQoKSwgInciKTsKKyAgICBmcHV0YyhrRGVhdGhUZXN0SW50ZXJuYWxFcnJvciwgcGFyZW50KTsKKyAgICBmcHJpbnRmKHBhcmVudCwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgICBmZmx1c2gocGFyZW50KTsKKyAgICBfZXhpdCgxKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorfQorCisvLyBBIHJlcGxhY2VtZW50IGZvciBDSEVDSyB0aGF0IGNhbGxzIERlYXRoVGVzdEFib3J0IGlmIHRoZSBhc3NlcnRpb24KKy8vIGZhaWxzLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXhwcmVzc2lvbikgXAorICBkbyB7IFwKKyAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShleHByZXNzaW9uKSkgeyBcCisgICAgICBEZWF0aFRlc3RBYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmc6OkZvcm1hdCggICAgICAgXAorICAgICAgICAgICJDSEVDSyBmYWlsZWQ6IEZpbGUgJXMsIGxpbmUgJWQ6ICVzIiwgXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI2V4cHJlc3Npb24pKTsgXAorICAgIH0gXAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBUaGlzIG1hY3JvIGlzIHNpbWlsYXIgdG8gR1RFU1RfREVBVEhfVEVTVF9DSEVDS18sIGJ1dCBpdCBpcyBtZWFudCBmb3IKKy8vIGV2YWx1YXRpbmcgYW55IHN5c3RlbSBjYWxsIHRoYXQgZnVsZmlsbHMgdHdvIGNvbmRpdGlvbnM6IGl0IG11c3QgcmV0dXJuCisvLyAtMSBvbiBmYWlsdXJlLCBhbmQgc2V0IGVycm5vIHRvIEVJTlRSIHdoZW4gaXQgaXMgaW50ZXJydXB0ZWQgYW5kCisvLyBzaG91bGQgYmUgdHJpZWQgYWdhaW4uICBUaGUgbWFjcm8gZXhwYW5kcyB0byBhIGxvb3AgdGhhdCByZXBlYXRlZGx5CisvLyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYXMgbG9uZyBhcyBpdCBldmFsdWF0ZXMgdG8gLTEgYW5kIHNldHMKKy8vIGVycm5vIHRvIEVJTlRSLiAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIC0xIGJ1dCBlcnJubyBpcworLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gRUlOVFIsIERlYXRoVGVzdEFib3J0IGlzIGNhbGxlZC4KKyMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZXhwcmVzc2lvbikgXAorICBkbyB7IFwKKyAgICBpbnQgZ3Rlc3RfcmV0dmFsOyBcCisgICAgZG8geyBcCisgICAgICBndGVzdF9yZXR2YWwgPSAoZXhwcmVzc2lvbik7IFwKKyAgICB9IHdoaWxlIChndGVzdF9yZXR2YWwgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOyBcCisgICAgaWYgKGd0ZXN0X3JldHZhbCA9PSAtMSkgeyBcCisgICAgICBEZWF0aFRlc3RBYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmc6OkZvcm1hdCggICAgICAgXAorICAgICAgICAgICJDSEVDSyBmYWlsZWQ6IEZpbGUgJXMsIGxpbmUgJWQ6ICVzICE9IC0xIiwgXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI2V4cHJlc3Npb24pKTsgXAorICAgIH0gXAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisvLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yIGluIGVycm5vLgorc3RkOjpzdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIGVycm5vID09IDAgPyAiIiA6IHBvc2l4OjpTdHJFcnJvcihlcnJubyk7Cit9CisKKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gYSBkZWF0aCB0ZXN0IHBhcmVudCBwcm9jZXNzIHRvIHJlYWQgYSBmYWlsdXJlCisvLyBtZXNzYWdlIGZyb20gdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBhbmQgbG9nIGl0IHdpdGggdGhlIEZBVEFMCisvLyBzZXZlcml0eS4gT24gV2luZG93cywgdGhlIG1lc3NhZ2UgaXMgcmVhZCBmcm9tIGEgcGlwZSBoYW5kbGUuIE9uIG90aGVyCisvLyBwbGF0Zm9ybXMsIGl0IGlzIHJlYWQgZnJvbSBhIGZpbGUgZGVzY3JpcHRvci4KK3N0YXRpYyB2b2lkIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihpbnQgZmQpIHsKKyAgTWVzc2FnZSBlcnJvcjsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgaW50IG51bV9yZWFkOworCisgIGRvIHsKKyAgICB3aGlsZSAoKG51bV9yZWFkID0gcG9zaXg6OlJlYWQoZmQsIGJ1ZmZlciwgMjU1KSkgPiAwKSB7CisgICAgICBidWZmZXJbbnVtX3JlYWRdID0gJ1wwJzsKKyAgICAgIGVycm9yIDw8IGJ1ZmZlcjsKKyAgICB9CisgIH0gd2hpbGUgKG51bV9yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAobnVtX3JlYWQgPT0gMCkgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8IGVycm9yLkdldFN0cmluZygpOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBsYXN0X2Vycm9yID0gZXJybm87CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZGVhdGggdGVzdCBpbnRlcm5hbDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkgPDwgIiBbIiA8PCBsYXN0X2Vycm9yIDw8ICJdIjsKKyAgfQorfQorCisvLyBEZWF0aCB0ZXN0IGNvbnN0cnVjdG9yLiAgSW5jcmVtZW50cyB0aGUgcnVubmluZyBkZWF0aCB0ZXN0IGNvdW50CisvLyBmb3IgdGhlIGN1cnJlbnQgdGVzdC4KK0RlYXRoVGVzdDo6RGVhdGhUZXN0KCkgeworICBUZXN0SW5mbyogY29uc3QgaW5mbyA9IEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIkNhbm5vdCBydW4gYSBkZWF0aCB0ZXN0IG91dHNpZGUgb2YgYSBURVNUIG9yICIKKyAgICAgICAgICAgICAgICAgICAiVEVTVF9GIGNvbnN0cnVjdCIpOworICB9Cit9CisKKy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWF0aCB0ZXN0IGJ5IGRpc3BhdGNoaW5nIHRvIHRoZSBjdXJyZW50CisvLyBkZWF0aCB0ZXN0IGZhY3RvcnkuCitib29sIERlYXRoVGVzdDo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgeworICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPmRlYXRoX3Rlc3RfZmFjdG9yeSgpLT5DcmVhdGUoCisgICAgICBzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lLCB0ZXN0KTsKK30KKworY29uc3QgY2hhciogRGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpIHsKKyAgcmV0dXJuIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXy5jX3N0cigpOworfQorCit2b2lkIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXyA9IG1lc3NhZ2U7Cit9CisKK3N0ZDo6c3RyaW5nIERlYXRoVGVzdDo6bGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfOworCisvLyBQcm92aWRlcyBjcm9zcyBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBmb3Igc29tZSBkZWF0aCBmdW5jdGlvbmFsaXR5LgorY2xhc3MgRGVhdGhUZXN0SW1wbCA6IHB1YmxpYyBEZWF0aFRlc3QgeworIHByb3RlY3RlZDoKKyAgRGVhdGhUZXN0SW1wbChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpCisgICAgICA6IHN0YXRlbWVudF8oYV9zdGF0ZW1lbnQpLAorICAgICAgICByZWdleF8oYV9yZWdleCksCisgICAgICAgIHNwYXduZWRfKGZhbHNlKSwKKyAgICAgICAgc3RhdHVzXygtMSksCisgICAgICAgIG91dGNvbWVfKElOX1BST0dSRVNTKSwKKyAgICAgICAgcmVhZF9mZF8oLTEpLAorICAgICAgICB3cml0ZV9mZF8oLTEpIHt9CisKKyAgLy8gcmVhZF9mZF8gaXMgZXhwZWN0ZWQgdG8gYmUgY2xvc2VkIGFuZCBjbGVhcmVkIGJ5IGEgZGVyaXZlZCBjbGFzcy4KKyAgfkRlYXRoVGVzdEltcGwoKSB7IEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHJlYWRfZmRfID09IC0xKTsgfQorCisgIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKTsKKyAgdmlydHVhbCBib29sIFBhc3NlZChib29sIHN0YXR1c19vayk7CisKKyAgY29uc3QgY2hhciogc3RhdGVtZW50KCkgY29uc3QgeyByZXR1cm4gc3RhdGVtZW50XzsgfQorICBjb25zdCBSRSogcmVnZXgoKSBjb25zdCB7IHJldHVybiByZWdleF87IH0KKyAgYm9vbCBzcGF3bmVkKCkgY29uc3QgeyByZXR1cm4gc3Bhd25lZF87IH0KKyAgdm9pZCBzZXRfc3Bhd25lZChib29sIGlzX3NwYXduZWQpIHsgc3Bhd25lZF8gPSBpc19zcGF3bmVkOyB9CisgIGludCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBzdGF0dXNfOyB9CisgIHZvaWQgc2V0X3N0YXR1cyhpbnQgYV9zdGF0dXMpIHsgc3RhdHVzXyA9IGFfc3RhdHVzOyB9CisgIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZSgpIGNvbnN0IHsgcmV0dXJuIG91dGNvbWVfOyB9CisgIHZvaWQgc2V0X291dGNvbWUoRGVhdGhUZXN0T3V0Y29tZSBhbl9vdXRjb21lKSB7IG91dGNvbWVfID0gYW5fb3V0Y29tZTsgfQorICBpbnQgcmVhZF9mZCgpIGNvbnN0IHsgcmV0dXJuIHJlYWRfZmRfOyB9CisgIHZvaWQgc2V0X3JlYWRfZmQoaW50IGZkKSB7IHJlYWRfZmRfID0gZmQ7IH0KKyAgaW50IHdyaXRlX2ZkKCkgY29uc3QgeyByZXR1cm4gd3JpdGVfZmRfOyB9CisgIHZvaWQgc2V0X3dyaXRlX2ZkKGludCBmZCkgeyB3cml0ZV9mZF8gPSBmZDsgfQorCisgIC8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAorICAvLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfCisgIC8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KKyAgLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgorICB2b2lkIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjb2RlIHRoaXMgb2JqZWN0IGlzIHRlc3RpbmcuICBUaGlzIGNsYXNzCisgIC8vIGRvZXNuJ3Qgb3duIHRoaXMgc3RyaW5nIGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgorICBjb25zdCBjaGFyKiBjb25zdCBzdGF0ZW1lbnRfOworICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIHRlc3Qgb3V0cHV0IG11c3QgbWF0Y2guICBEZWF0aFRlc3RJbXBsCisgIC8vIGRvZXNuJ3Qgb3duIHRoaXMgb2JqZWN0IGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgorICBjb25zdCBSRSogY29uc3QgcmVnZXhfOworICAvLyBUcnVlIGlmIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNwYXduZWQuCisgIGJvb2wgc3Bhd25lZF87CisgIC8vIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4KKyAgaW50IHN0YXR1c187CisgIC8vIEhvdyB0aGUgZGVhdGggdGVzdCBjb25jbHVkZWQuCisgIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZV87CisgIC8vIERlc2NyaXB0b3IgdG8gdGhlIHJlYWQgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLiAgSXQgaXMKKyAgLy8gYWx3YXlzIC0xIGluIHRoZSBjaGlsZCBwcm9jZXNzLiAgVGhlIGNoaWxkIGtlZXBzIGl0cyB3cml0ZSBlbmQgb2YgdGhlCisgIC8vIHBpcGUgaW4gd3JpdGVfZmRfLgorICBpbnQgcmVhZF9mZF87CisgIC8vIERlc2NyaXB0b3IgdG8gdGhlIGNoaWxkJ3Mgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgLy8gSXQgaXMgYWx3YXlzIC0xIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIFRoZSBwYXJlbnQga2VlcHMgaXRzIGVuZCBvZiB0aGUKKyAgLy8gcGlwZSBpbiByZWFkX2ZkXy4KKyAgaW50IHdyaXRlX2ZkXzsKK307CisKKy8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAorLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXworLy8gbWVtYmVyLCBhbmQgY2xvc2VzIHJlYWRfZmRfLiAgT3V0cHV0cyBkaWFnbm9zdGljcyBhbmQgdGVybWluYXRlcyBpbgorLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgordm9pZCBEZWF0aFRlc3RJbXBsOjpSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpIHsKKyAgY2hhciBmbGFnOworICBpbnQgYnl0ZXNfcmVhZDsKKworICAvLyBUaGUgcmVhZCgpIGhlcmUgYmxvY2tzIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlIChzaWduaWZ5aW5nIHRoZQorICAvLyBmYWlsdXJlIG9mIHRoZSBkZWF0aCB0ZXN0KSBvciB1bnRpbCB0aGUgcGlwZSBpcyBjbG9zZWQgKHNpZ25pZnlpbmcKKyAgLy8gaXRzIHN1Y2Nlc3MpLCBzbyBpdCdzIG9rYXkgdG8gY2FsbCB0aGlzIGluIHRoZSBwYXJlbnQgYmVmb3JlCisgIC8vIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBleGl0ZWQuCisgIGRvIHsKKyAgICBieXRlc19yZWFkID0gcG9zaXg6OlJlYWQocmVhZF9mZCgpLCAmZmxhZywgMSk7CisgIH0gd2hpbGUgKGJ5dGVzX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICBzZXRfb3V0Y29tZShESUVEKTsKKyAgfSBlbHNlIGlmIChieXRlc19yZWFkID09IDEpIHsKKyAgICBzd2l0Y2ggKGZsYWcpIHsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdFJldHVybmVkOgorICAgICAgICBzZXRfb3V0Y29tZShSRVRVUk5FRCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0VGhyZXc6CisgICAgICAgIHNldF9vdXRjb21lKFRIUkVXKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGtEZWF0aFRlc3RMaXZlZDoKKyAgICAgICAgc2V0X291dGNvbWUoTElWRUQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdEludGVybmFsRXJyb3I6CisgICAgICAgIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihyZWFkX2ZkKCkpOyAgLy8gRG9lcyBub3QgcmV0dXJuLgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJEZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgcmVwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidW5leHBlY3RlZCBzdGF0dXMgYnl0ZSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGZsYWcpIDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIlJlYWQgZnJvbSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsKKyAgfQorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpDbG9zZShyZWFkX2ZkKCkpKTsKKyAgc2V0X3JlYWRfZmQoLTEpOworfQorCisvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgY29kZSB3aGljaCBzaG91bGQgaGF2ZSBleGl0ZWQsIGRpZG4ndC4KKy8vIFNob3VsZCBiZSBjYWxsZWQgb25seSBpbiBhIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKy8vIFdyaXRlcyBhIHN0YXR1cyBieXRlIHRvIHRoZSBjaGlsZCdzIHN0YXR1cyBmaWxlIGRlc2NyaXB0b3IsIHRoZW4KKy8vIGNhbGxzIF9leGl0KDEpLgordm9pZCBEZWF0aFRlc3RJbXBsOjpBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pIHsKKyAgLy8gVGhlIHBhcmVudCBwcm9jZXNzIGNvbnNpZGVycyB0aGUgZGVhdGggdGVzdCB0byBiZSBhIGZhaWx1cmUgaWYKKyAgLy8gaXQgZmluZHMgYW55IGRhdGEgaW4gb3VyIHBpcGUuICBTbywgaGVyZSB3ZSB3cml0ZSBhIHNpbmdsZSBmbGFnIGJ5dGUKKyAgLy8gdG8gdGhlIHBpcGUsIHRoZW4gZXhpdC4KKyAgY29uc3QgY2hhciBzdGF0dXNfY2ggPQorICAgICAgcmVhc29uID09IFRFU1RfRElEX05PVF9ESUUgPyBrRGVhdGhUZXN0TGl2ZWQgOgorICAgICAgcmVhc29uID09IFRFU1RfVEhSRVdfRVhDRVBUSU9OID8ga0RlYXRoVGVzdFRocmV3IDoga0RlYXRoVGVzdFJldHVybmVkOworCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8ocG9zaXg6OldyaXRlKHdyaXRlX2ZkKCksICZzdGF0dXNfY2gsIDEpKTsKKyAgLy8gV2UgYXJlIGxlYWtpbmcgdGhlIGRlc2NyaXB0b3IgaGVyZSBiZWNhdXNlIG9uIHNvbWUgcGxhdGZvcm1zIChpLmUuLAorICAvLyB3aGVuIGJ1aWx0IGFzIFdpbmRvd3MgRExMKSwgZGVzdHJ1Y3RvcnMgb2YgZ2xvYmFsIG9iamVjdHMgd2lsbCBzdGlsbAorICAvLyBydW4gYWZ0ZXIgY2FsbGluZyBfZXhpdCgpLiBPbiBzdWNoIHN5c3RlbXMsIHdyaXRlX2ZkXyB3aWxsIGJlCisgIC8vIGluZGlyZWN0bHkgY2xvc2VkIGZyb20gdGhlIGRlc3RydWN0b3Igb2YgVW5pdFRlc3RJbXBsLCBjYXVzaW5nIGRvdWJsZQorICAvLyBjbG9zZSBpZiBpdCBpcyBhbHNvIGNsb3NlZCBoZXJlLiBPbiBkZWJ1ZyBjb25maWd1cmF0aW9ucywgZG91YmxlIGNsb3NlCisgIC8vIG1heSBhc3NlcnQuIEFzIHRoZXJlIGFyZSBubyBpbi1wcm9jZXNzIGJ1ZmZlcnMgdG8gZmx1c2ggaGVyZSwgd2UgYXJlCisgIC8vIHJlbHlpbmcgb24gdGhlIE9TIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIGFmdGVyIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMKKyAgLy8gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlIG5vdCBydW4uCisgIF9leGl0KDEpOyAgLy8gRXhpdHMgdy9vIGFueSBub3JtYWwgZXhpdCBob29rcyAod2Ugd2VyZSBzdXBwb3NlZCB0byBjcmFzaCkKK30KKworLy8gUmV0dXJucyBhbiBpbmRlbnRlZCBjb3B5IG9mIHN0ZGVyciBvdXRwdXQgZm9yIGEgZGVhdGggdGVzdC4KKy8vIFRoaXMgbWFrZXMgZGlzdGluZ3Vpc2hpbmcgZGVhdGggdGVzdCBvdXRwdXQgbGluZXMgZnJvbSByZWd1bGFyIGxvZyBsaW5lcworLy8gbXVjaCBlYXNpZXIuCitzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXREZWF0aFRlc3RPdXRwdXQoY29uc3QgOjpzdGQ6OnN0cmluZyYgb3V0cHV0KSB7CisgIDo6c3RkOjpzdHJpbmcgcmV0OworICBmb3IgKHNpemVfdCBhdCA9IDA7IDsgKSB7CisgICAgY29uc3Qgc2l6ZV90IGxpbmVfZW5kID0gb3V0cHV0LmZpbmQoJ1xuJywgYXQpOworICAgIHJldCArPSAiWyAgREVBVEggICBdICI7CisgICAgaWYgKGxpbmVfZW5kID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCArPSBvdXRwdXQuc3Vic3RyKGF0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCwgbGluZV9lbmQgKyAxIC0gYXQpOworICAgIGF0ID0gbGluZV9lbmQgKyAxOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vIEFzc2Vzc2VzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgYSBkZWF0aCB0ZXN0LCB1c2luZyBib3RoIHByaXZhdGUKKy8vIG1lbWJlcnMgd2hpY2ggaGF2ZSBwcmV2aW91c2x5IGJlZW4gc2V0LCBhbmQgb25lIGFyZ3VtZW50OgorLy8KKy8vIFByaXZhdGUgZGF0YSBtZW1iZXJzOgorLy8gICBvdXRjb21lOiAgQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIGRlYXRoIHRlc3QKKy8vICAgICAgICAgICAgIGNvbmNsdWRlZDogRElFRCwgTElWRUQsIFRIUkVXLCBvciBSRVRVUk5FRC4gIFRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBmYWlscyBpbiB0aGUgbGF0dGVyIHRocmVlIGNhc2VzLgorLy8gICBzdGF0dXM6ICAgVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLiBPbiAqbml4LCBpdCBpcyBpbiB0aGUKKy8vICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHdhaXQoMikuIE9uIFdpbmRvd3MsIHRoaXMgaXMgdGhlCisvLyAgICAgICAgICAgICB2YWx1ZSBzdXBwbGllZCB0byB0aGUgRXhpdFByb2Nlc3MoKSBBUEkgb3IgYSBudW1lcmljIGNvZGUKKy8vICAgICAgICAgICAgIG9mIHRoZSBleGNlcHRpb24gdGhhdCB0ZXJtaW5hdGVkIHRoZSBwcm9ncmFtLgorLy8gICByZWdleDogICAgQSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IHRvIGJlIGFwcGxpZWQgdG8KKy8vICAgICAgICAgICAgIHRoZSB0ZXN0J3MgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3Igb3V0cHV0OyB0aGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgZmFpbHMgaWYgaXQgZG9lcyBub3QgbWF0Y2guCisvLworLy8gQXJndW1lbnQ6CisvLyAgIHN0YXR1c19vazogdHJ1ZSBpZiBleGl0X3N0YXR1cyBpcyBhY2NlcHRhYmxlIGluIHRoZSBjb250ZXh0IG9mCisvLyAgICAgICAgICAgICAgdGhpcyBwYXJ0aWN1bGFyIGRlYXRoIHRlc3QsIHdoaWNoIGZhaWxzIGlmIGl0IGlzIGZhbHNlCisvLworLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgYXJlIG1ldC4gIE90aGVyd2lzZSwgdGhlCisvLyBmaXJzdCBmYWlsaW5nIGNvbmRpdGlvbiwgaW4gdGhlIG9yZGVyIGdpdmVuIGFib3ZlLCBpcyB0aGUgb25lIHRoYXQgaXMKKy8vIHJlcG9ydGVkLiBBbHNvIHNldHMgdGhlIGxhc3QgZGVhdGggdGVzdCBtZXNzYWdlIHN0cmluZy4KK2Jvb2wgRGVhdGhUZXN0SW1wbDo6UGFzc2VkKGJvb2wgc3RhdHVzX29rKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKworICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgTWVzc2FnZSBidWZmZXI7CisKKyAgYnVmZmVyIDw8ICJEZWF0aCB0ZXN0OiAiIDw8IHN0YXRlbWVudCgpIDw8ICJcbiI7CisgIHN3aXRjaCAob3V0Y29tZSgpKSB7CisgICAgY2FzZSBMSVZFRDoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZmFpbGVkIHRvIGRpZS5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUSFJFVzoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogdGhyZXcgYW4gZXhjZXB0aW9uLlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFVFVSTkVEOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBpbGxlZ2FsIHJldHVybiBpbiB0ZXN0IHN0YXRlbWVudC5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESUVEOgorICAgICAgaWYgKHN0YXR1c19vaykgeworICAgICAgICBjb25zdCBib29sIG1hdGNoZWQgPSBSRTo6UGFydGlhbE1hdGNoKGVycm9yX21lc3NhZ2UuY19zdHIoKSwgKnJlZ2V4KCkpOworICAgICAgICBpZiAobWF0Y2hlZCkgeworICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXJyb3IuXG4iCisgICAgICAgICAgICAgICAgIDw8ICIgIEV4cGVjdGVkOiAiIDw8IHJlZ2V4KCktPnBhdHRlcm4oKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIgorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICIgPDwgRXhpdFN1bW1hcnkoc3RhdHVzKCkpIDw8ICJcbiIKKyAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElOX1BST0dSRVNTOgorICAgIGRlZmF1bHQ6CisgICAgICBHVEVTVF9MT0dfKEZBVEFMKQorICAgICAgICAgIDw8ICJEZWF0aFRlc3Q6OlBhc3NlZCBzb21laG93IGNhbGxlZCBiZWZvcmUgY29uY2x1c2lvbiBvZiB0ZXN0IjsKKyAgfQorCisgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGJ1ZmZlci5HZXRTdHJpbmcoKSk7CisgIHJldHVybiBzdWNjZXNzOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFdpbmRvd3NEZWF0aFRlc3QgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLiBEdWUgdG8gdGhlCisvLyBzcGVjaWZpY3Mgb2Ygc3RhcnRpbmcgbmV3IHByb2Nlc3NlcyBvbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUKKy8vIGFsd2F5cyB0aHJlYWRzYWZlLCBhbmQgR29vZ2xlIFRlc3QgY29uc2lkZXJzIHRoZQorLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPWZhc3Qgc2V0dGluZyB0byBiZSBlcXVpdmFsZW50IHRvCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9dGhyZWFkc2FmZSB0aGVyZS4KKy8vCisvLyBBIGZldyBpbXBsZW1lbnRhdGlvbiBub3RlczogIExpa2UgdGhlIExpbnV4IHZlcnNpb24sIHRoZSBXaW5kb3dzCisvLyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBpcGVzIGZvciBjaGlsZC10by1wYXJlbnQgY29tbXVuaWNhdGlvbi4gQnV0IGR1ZSB0bworLy8gdGhlIHNwZWNpZmljcyBvZiBwaXBlcyBvbiBXaW5kb3dzLCBzb21lIGV4dHJhIHN0ZXBzIGFyZSByZXF1aXJlZDoKKy8vCisvLyAxLiBUaGUgcGFyZW50IGNyZWF0ZXMgYSBjb21tdW5pY2F0aW9uIHBpcGUgYW5kIHN0b3JlcyBoYW5kbGVzIHRvIGJvdGgKKy8vICAgIGVuZHMgb2YgaXQuCisvLyAyLiBUaGUgcGFyZW50IHN0YXJ0cyB0aGUgY2hpbGQgYW5kIHByb3ZpZGVzIGl0IHdpdGggdGhlIGluZm9ybWF0aW9uCisvLyAgICBuZWNlc3NhcnkgdG8gYWNxdWlyZSB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuCisvLyAzLiBUaGUgY2hpbGQgYWNxdWlyZXMgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBhbmQgc2lnbmFscyB0aGUgcGFyZW50CisvLyAgICB1c2luZyBhIFdpbmRvd3MgZXZlbnQuCisvLyA0LiBOb3cgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9uIGl0cyBzaWRlLiBJZgorLy8gICAgdGhpcyBpcyBkb25lIGJlZm9yZSBzdGVwIDMsIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZ29lcyBkb3duIHRvCisvLyAgICAwIGFuZCBpdCBpcyBkZXN0cm95ZWQsIHByZXZlbnRpbmcgdGhlIGNoaWxkIGZyb20gYWNxdWlyaW5nIGl0LiBUaGUKKy8vICAgIHBhcmVudCBub3cgaGFzIHRvIHJlbGVhc2UgaXQsIG9yIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgcmVhZCBlbmQgb2YKKy8vICAgIHRoZSBwaXBlIHdpbGwgbm90IHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgorLy8gNS4gVGhlIHBhcmVudCByZWFkcyBjaGlsZCdzIG91dHB1dCB0aHJvdWdoIHRoZSBwaXBlIChvdXRjb21lIGNvZGUgYW5kCisvLyAgICBhbnkgcG9zc2libGUgZXJyb3IgbWVzc2FnZXMpIGZyb20gdGhlIHBpcGUsIGFuZCBpdHMgc3RkZXJyIGFuZCB0aGVuCisvLyAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gZmFpbCB0aGUgdGVzdC4KKy8vCisvLyBOb3RlOiB0byBkaXN0aW5ndWlzaCBXaW4zMiBBUEkgY2FsbHMgZnJvbSB0aGUgbG9jYWwgbWV0aG9kIGFuZCBmdW5jdGlvbgorLy8gY2FsbHMsIHRoZSBmb3JtZXIgYXJlIGV4cGxpY2l0bHkgcmVzb2x2ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisvLworY2xhc3MgV2luZG93c0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIFdpbmRvd3NEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUkUqIGFfcmVnZXgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkKKyAgICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7fQorCisgIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgorICB2aXJ0dWFsIGludCBXYWl0KCk7CisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87CisgIC8vIEhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLgorICBBdXRvSGFuZGxlIHdyaXRlX2hhbmRsZV87CisgIC8vIENoaWxkIHByb2Nlc3MgaGFuZGxlLgorICBBdXRvSGFuZGxlIGNoaWxkX2hhbmRsZV87CisgIC8vIEV2ZW50IHRoZSBjaGlsZCBwcm9jZXNzIHVzZXMgdG8gc2lnbmFsIHRoZSBwYXJlbnQgdGhhdCBpdCBoYXMKKyAgLy8gYWNxdWlyZWQgdGhlIGhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLiBBZnRlciBzZWVpbmcgdGhpcworICAvLyBldmVudCB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gaGFuZGxlcyB0byBtYWtlIHN1cmUgaXRzCisgIC8vIFJlYWRGaWxlKCkgY2FsbHMgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCisgIEF1dG9IYW5kbGUgZXZlbnRfaGFuZGxlXzsKK307CisKKy8vIFdhaXRzIGZvciB0aGUgY2hpbGQgaW4gYSBkZWF0aCB0ZXN0IHRvIGV4aXQsIHJldHVybmluZyBpdHMgZXhpdAorLy8gc3RhdHVzLCBvciAwIGlmIG5vIGNoaWxkIHByb2Nlc3MgZXhpc3RzLiAgQXMgYSBzaWRlIGVmZmVjdCwgc2V0cyB0aGUKKy8vIG91dGNvbWUgZGF0YSBtZW1iZXIuCitpbnQgV2luZG93c0RlYXRoVGVzdDo6V2FpdCgpIHsKKyAgaWYgKCFzcGF3bmVkKCkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gV2FpdCB1bnRpbCB0aGUgY2hpbGQgZWl0aGVyIHNpZ25hbHMgdGhhdCBpdCBoYXMgYWNxdWlyZWQgdGhlIHdyaXRlIGVuZAorICAvLyBvZiB0aGUgcGlwZSBvciBpdCBkaWVzLgorICBjb25zdCBIQU5ETEUgd2FpdF9oYW5kbGVzWzJdID0geyBjaGlsZF9oYW5kbGVfLkdldCgpLCBldmVudF9oYW5kbGVfLkdldCgpIH07CisgIHN3aXRjaCAoOjpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBXYWl0cyBmb3IgYW55IG9mIHRoZSBoYW5kbGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpIHsKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzA6CisgICAgY2FzZSBXQUlUX09CSkVDVF8wICsgMToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmYWxzZSk7ICAvLyBTaG91bGQgbm90IGdldCBoZXJlLgorICB9CisKKyAgLy8gVGhlIGNoaWxkIGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9yIGV4aXRlZC4KKyAgLy8gV2UgcmVsZWFzZSB0aGUgaGFuZGxlIG9uIG91ciBzaWRlIGFuZCBjb250aW51ZS4KKyAgd3JpdGVfaGFuZGxlXy5SZXNldCgpOworICBldmVudF9oYW5kbGVfLlJlc2V0KCk7CisKKyAgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKKworICAvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gZXhpdCBpZiBpdCBoYXZlbid0IGFscmVhZHkuIFRoaXMKKyAgLy8gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGUgY2hpbGQgaGFzIGFscmVhZHkgZXhpdGVkLCByZWdhcmRsZXNzIG9mCisgIC8vIHdoZXRoZXIgcHJldmlvdXMgY2FsbHMgdG8gV2FpdEZvck11bHRpcGxlT2JqZWN0cyBzeW5jaHJvbml6ZWQgb24gdGhpcworICAvLyBoYW5kbGUgb3Igbm90LgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIFdBSVRfT0JKRUNUXzAgPT0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGNoaWxkX2hhbmRsZV8uR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpOworICBEV09SRCBzdGF0dXNfY29kZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICA6OkdldEV4aXRDb2RlUHJvY2VzcyhjaGlsZF9oYW5kbGVfLkdldCgpLCAmc3RhdHVzX2NvZGUpICE9IEZBTFNFKTsKKyAgY2hpbGRfaGFuZGxlXy5SZXNldCgpOworICBzZXRfc3RhdHVzKHN0YXRpY19jYXN0PGludD4oc3RhdHVzX2NvZGUpKTsKKyAgcmV0dXJuIHN0YXR1cygpOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIFdpbmRvd3MgZGVhdGggdGVzdC4gIEl0IGNyZWF0ZXMgYSBjaGlsZAorLy8gcHJvY2VzcyB3aXRoIHRoZSBzYW1lIGV4ZWN1dGFibGUgYXMgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBydW4gdGhlCisvLyBkZWF0aCB0ZXN0LiAgVGhlIGNoaWxkIHByb2Nlc3MgaXMgZ2l2ZW4gdGhlIC0tZ3Rlc3RfZmlsdGVyIGFuZAorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFncyBzdWNoIHRoYXQgaXQga25vd3MgdG8gcnVuIHRoZQorLy8gY3VycmVudCBkZWF0aCB0ZXN0IG9ubHkuCitEZWF0aFRlc3Q6OlRlc3RSb2xlIFdpbmRvd3NEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW5mby0+cmVzdWx0KCktPmRlYXRoX3Rlc3RfY291bnQoKTsKKworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgLy8gUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSBoYXMgcGVyZm9ybWVkIGFsbCB0aGUgbmVjZXNzYXJ5CisgICAgLy8gcHJvY2Vzc2luZy4KKyAgICBzZXRfd3JpdGVfZmQoZmxhZy0+d3JpdGVfZmQoKSk7CisgICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsKKyAgfQorCisgIC8vIFdpbmRvd3NEZWF0aFRlc3QgdXNlcyBhbiBhbm9ueW1vdXMgcGlwZSB0byBjb21tdW5pY2F0ZSByZXN1bHRzIG9mCisgIC8vIGEgZGVhdGggdGVzdC4KKyAgU0VDVVJJVFlfQVRUUklCVVRFUyBoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSA9IHsKKyAgICBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUyksIE5VTEwsIFRSVUUgfTsKKyAgSEFORExFIHJlYWRfaGFuZGxlLCB3cml0ZV9oYW5kbGU7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgOjpDcmVhdGVQaXBlKCZyZWFkX2hhbmRsZSwgJndyaXRlX2hhbmRsZSwgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgIDApICAvLyBEZWZhdWx0IGJ1ZmZlciBzaXplLgorICAgICAgIT0gRkFMU0UpOworICBzZXRfcmVhZF9mZCg6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihyZWFkX2hhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZKSk7CisgIHdyaXRlX2hhbmRsZV8uUmVzZXQod3JpdGVfaGFuZGxlKTsKKyAgZXZlbnRfaGFuZGxlXy5SZXNldCg6OkNyZWF0ZUV2ZW50KAorICAgICAgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAorICAgICAgVFJVRSwgICAgLy8gVGhlIGV2ZW50IHdpbGwgYXV0b21hdGljYWxseSByZXNldCB0byBub24tc2lnbmFsZWQgc3RhdGUuCisgICAgICBGQUxTRSwgICAvLyBUaGUgaW5pdGlhbCBzdGF0ZSBpcyBub24tc2lnbmFsbGVkLgorICAgICAgTlVMTCkpOyAgLy8gVGhlIGV2ZW4gaXMgdW5uYW1lZC4KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXZlbnRfaGFuZGxlXy5HZXQoKSAhPSBOVUxMKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IiArCisgICAgICBpbmZvLT50ZXN0X2Nhc2VfbmFtZSgpICsgIi4iICsgaW5mby0+bmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArCisgICAgICAiPSIgKyBmaWxlXyArICJ8IiArIFN0cmluZzo6Rm9ybWF0KCIlZHwlZHwldXwlSXV8JUl1IiwgbGluZV8sCisgICAgICBkZWF0aF90ZXN0X2luZGV4LAorICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pig6OkdldEN1cnJlbnRQcm9jZXNzSWQoKSksCisgICAgICAvLyBzaXplX3QgaGFzIHRoZSBzYW1lIHdpdGggYXMgcG9pbnRlcnMgb24gYm90aCAzMi1iaXQgYW5kIDY0LWJpdAorICAgICAgLy8gV2luZG93cyBwbGF0Zm9ybXMuCisgICAgICAvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3RjeGYxZHc2LmFzcHguCisgICAgICByZWludGVycHJldF9jYXN0PHNpemVfdD4od3JpdGVfaGFuZGxlKSwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihldmVudF9oYW5kbGVfLkdldCgpKSk7CisKKyAgY2hhciBleGVjdXRhYmxlX3BhdGhbX01BWF9QQVRIICsgMV07ICAvLyBOT0xJTlQKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICBfTUFYX1BBVEggKyAxICE9IDo6R2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01BWF9QQVRIKSk7CisKKyAgc3RkOjpzdHJpbmcgY29tbWFuZF9saW5lID0KKyAgICAgIHN0ZDo6c3RyaW5nKDo6R2V0Q29tbWFuZExpbmVBKCkpICsgIiAiICsgZmlsdGVyX2ZsYWcgKyAiIFwiIiArCisgICAgICBpbnRlcm5hbF9mbGFnICsgIlwiIjsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICAvLyBGbHVzaCB0aGUgbG9nIGJ1ZmZlcnMgc2luY2UgdGhlIGxvZyBzdHJlYW1zIGFyZSBzaGFyZWQgd2l0aCB0aGUgY2hpbGQuCisgIEZsdXNoSW5mb0xvZygpOworCisgIC8vIFRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgc2hhcmUgdGhlIHN0YW5kYXJkIGhhbmRsZXMgd2l0aCB0aGUgcGFyZW50LgorICBTVEFSVFVQSU5GT0Egc3RhcnR1cF9pbmZvOworICBtZW1zZXQoJnN0YXJ0dXBfaW5mbywgMCwgc2l6ZW9mKFNUQVJUVVBJTkZPKSk7CisgIHN0YXJ0dXBfaW5mby5kd0ZsYWdzID0gU1RBUlRGX1VTRVNUREhBTkRMRVM7CisgIHN0YXJ0dXBfaW5mby5oU3RkSW5wdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKKyAgc3RhcnR1cF9pbmZvLmhTdGRPdXRwdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisgIHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPSA6OkdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKKworICBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NfaW5mbzsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oOjpDcmVhdGVQcm9jZXNzQSgKKyAgICAgIGV4ZWN1dGFibGVfcGF0aCwKKyAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGNvbW1hbmRfbGluZS5jX3N0cigpKSwKKyAgICAgIE5VTEwsICAgLy8gUmV0dW5lZCBwcm9jZXNzIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCisgICAgICBOVUxMLCAgIC8vIFJldHVuZWQgdGhyZWFkIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCisgICAgICBUUlVFLCAgIC8vIENoaWxkIGluaGVyaXRzIGFsbCBpbmhlcml0YWJsZSBoYW5kbGVzIChmb3Igd3JpdGVfaGFuZGxlXykuCisgICAgICAweDAsICAgIC8vIERlZmF1bHQgY3JlYXRpb24gZmxhZ3MuCisgICAgICBOVUxMLCAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGVudmlyb25tZW50LgorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCksCisgICAgICAmc3RhcnR1cF9pbmZvLAorICAgICAgJnByb2Nlc3NfaW5mbykgIT0gRkFMU0UpOworICBjaGlsZF9oYW5kbGVfLlJlc2V0KHByb2Nlc3NfaW5mby5oUHJvY2Vzcyk7CisgIDo6Q2xvc2VIYW5kbGUocHJvY2Vzc19pbmZvLmhUaHJlYWQpOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKyMgZWxzZSAgLy8gV2UgYXJlIG5vdCBvbiBXaW5kb3dzLgorCisvLyBGb3JraW5nRGVhdGhUZXN0IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgbW9zdCBvZiB0aGUgYWJzdHJhY3QKKy8vIG1ldGhvZHMgb2YgdGhlIERlYXRoVGVzdCBpbnRlcmZhY2UuICBPbmx5IHRoZSBBc3N1bWVSb2xlIG1ldGhvZCBpcworLy8gbGVmdCB1bmRlZmluZWQuCitjbGFzcyBGb3JraW5nRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgeworIHB1YmxpYzoKKyAgRm9ya2luZ0RlYXRoVGVzdChjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCk7CisKKyAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCisgIHZpcnR1YWwgaW50IFdhaXQoKTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBzZXRfY2hpbGRfcGlkKHBpZF90IGNoaWxkX3BpZCkgeyBjaGlsZF9waWRfID0gY2hpbGRfcGlkOyB9CisKKyBwcml2YXRlOgorICAvLyBQSUQgb2YgY2hpbGQgcHJvY2VzcyBkdXJpbmcgZGVhdGggdGVzdDsgMCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBpdHNlbGYuCisgIHBpZF90IGNoaWxkX3BpZF87Cit9OworCisvLyBDb25zdHJ1Y3RzIGEgRm9ya2luZ0RlYXRoVGVzdC4KK0ZvcmtpbmdEZWF0aFRlc3Q6OkZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksCisgICAgICBjaGlsZF9waWRfKC0xKSB7fQorCisvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKKy8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCisvLyBvdXRjb21lIGRhdGEgbWVtYmVyLgoraW50IEZvcmtpbmdEZWF0aFRlc3Q6OldhaXQoKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiAwOworCisgIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyAgaW50IHN0YXR1c192YWx1ZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyh3YWl0cGlkKGNoaWxkX3BpZF8sICZzdGF0dXNfdmFsdWUsIDApKTsKKyAgc2V0X3N0YXR1cyhzdGF0dXNfdmFsdWUpOworICByZXR1cm4gc3RhdHVzX3ZhbHVlOworfQorCisvLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcywgdGhlbiBpbW1lZGlhdGVseSBydW5zIHRoZSB0ZXN0CisvLyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KK2NsYXNzIE5vRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIE5vRXhlY0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpIDoKKyAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpIHsgfQorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKK307CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgZm9yay1hbmQtcnVuIGRlYXRoIHRlc3QuICBJdCBpbXBsZW1lbnRzIGEKKy8vIHN0cmFpZ2h0Zm9yd2FyZCBmb3JrLCB3aXRoIGEgc2ltcGxlIHBpcGUgdG8gdHJhbnNtaXQgdGhlIHN0YXR1cyBieXRlLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7CisgIGNvbnN0IHNpemVfdCB0aHJlYWRfY291bnQgPSBHZXRUaHJlYWRDb3VudCgpOworICBpZiAodGhyZWFkX2NvdW50ICE9IDEpIHsKKyAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8IERlYXRoVGVzdFRocmVhZFdhcm5pbmcodGhyZWFkX2NvdW50KTsKKyAgfQorCisgIGludCBwaXBlX2ZkWzJdOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhwaXBlKHBpcGVfZmQpICE9IC0xKTsKKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gV2hlbiB3ZSBmb3JrIHRoZSBwcm9jZXNzIGJlbG93LCB0aGUgbG9nIGZpbGUgYnVmZmVycyBhcmUgY29waWVkLCBidXQgdGhlCisgIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHNoYXJlZC4gIFdlIGZsdXNoIGFsbCBsb2cgZmlsZXMgaGVyZSBzbyB0aGF0IGNsb3NpbmcKKyAgLy8gdGhlIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lc24ndCB0aHJvdyBvZmYgdGhlCisgIC8vIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgLy8gVGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgZm9yayBhcyBwb3NzaWJsZSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIGNhc2UKKyAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHRocmVhZHMgcnVubmluZyBiZWZvcmUgdGhlIGRlYXRoIHRlc3QsIGFuZCBhbm90aGVyCisgIC8vIHRocmVhZCB3cml0ZXMgdG8gdGhlIGxvZyBmaWxlLgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBmb3JrKCk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7CisgIHNldF9jaGlsZF9waWQoY2hpbGRfcGlkKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzBdKSk7CisgICAgc2V0X3dyaXRlX2ZkKHBpcGVfZmRbMV0pOworICAgIC8vIFJlZGlyZWN0cyBhbGwgbG9nZ2luZyB0byBzdGRlcnIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgdG8gcHJldmVudAorICAgIC8vIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZXMuICBXZSBjYXB0dXJlIHN0ZGVyciBpbiB0aGUgcGFyZW50CisgICAgLy8gcHJvY2VzcyBhbmQgYXBwZW5kIHRoZSBjaGlsZCBwcm9jZXNzJyBvdXRwdXQgdG8gYSBsb2cuCisgICAgTG9nVG9TdGRlcnIoKTsKKyAgICAvLyBFdmVudCBmb3J3YXJkaW5nIHRvIHRoZSBsaXN0ZW5lcnMgb2YgZXZlbnQgbGlzdGVuZXIgQVBJIG11c2ggYmUgc2h1dAorICAgIC8vIGRvd24gaW4gZGVhdGggdGVzdCBzdWJwcm9jZXNzZXMuCisgICAgR2V0VW5pdFRlc3RJbXBsKCktPmxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOworICAgIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkID0gdHJ1ZTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9IGVsc2UgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICAgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICAgIHNldF9zcGF3bmVkKHRydWUpOworICAgIHJldHVybiBPVkVSU0VFX1RFU1Q7CisgIH0KK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MgYW5kIHJlLWV4ZWN1dGVzIHRoZSBtYWluCisvLyBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3Mgc2V0IHRoYXQgY2F1c2UKKy8vIG9ubHkgdGhpcyBzcGVjaWZpYyBkZWF0aCB0ZXN0IHRvIGJlIHJ1bi4KK2NsYXNzIEV4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBFeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgOgorICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisgcHJpdmF0ZToKKyAgc3RhdGljIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4KKyAgR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSB7CisgICAgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBhcmdzID0gR2V0SW5qZWN0YWJsZUFyZ3ZzKCk7CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87Cit9OworCisvLyBVdGlsaXR5IGNsYXNzIGZvciBhY2N1bXVsYXRpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KK2NsYXNzIEFyZ3VtZW50cyB7CisgcHVibGljOgorICBBcmd1bWVudHMoKSB7CisgICAgYXJnc18ucHVzaF9iYWNrKE5VTEwpOworICB9CisKKyAgfkFyZ3VtZW50cygpIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IGFyZ3NfLmJlZ2luKCk7IGkgIT0gYXJnc18uZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGZyZWUoKmkpOworICAgIH0KKyAgfQorICB2b2lkIEFkZEFyZ3VtZW50KGNvbnN0IGNoYXIqIGFyZ3VtZW50KSB7CisgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChhcmd1bWVudCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KKyAgdm9pZCBBZGRBcmd1bWVudHMoY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHI+JiBhcmd1bWVudHMpIHsKKyAgICBmb3IgKHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8U3RyPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3VtZW50cy5iZWdpbigpOworICAgICAgICAgaSAhPSBhcmd1bWVudHMuZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGFyZ3NfLmluc2VydChhcmdzXy5lbmQoKSAtIDEsIHBvc2l4OjpTdHJEdXAoaS0+Y19zdHIoKSkpOworICAgIH0KKyAgfQorICBjaGFyKiBjb25zdCogQXJndigpIHsKKyAgICByZXR1cm4gJmFyZ3NfWzBdOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxjaGFyKj4gYXJnc187Cit9OworCisvLyBBIHN0cnVjdCB0aGF0IGVuY29tcGFzc2VzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNoaWxkIHByb2Nlc3Mgb2YgYQorLy8gdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IHByb2Nlc3MuCitzdHJ1Y3QgRXhlY0RlYXRoVGVzdEFyZ3MgeworICBjaGFyKiBjb25zdCogYXJndjsgIC8vIENvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjaGlsZCdzIGNhbGwgdG8gZXhlYworICBpbnQgY2xvc2VfZmQ7ICAgICAgIC8vIEZpbGUgZGVzY3JpcHRvciB0byBjbG9zZTsgdGhlIHJlYWQgZW5kIG9mIGEgcGlwZQorfTsKKworIyAgaWYgR1RFU1RfT1NfTUFDCitpbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7CisgIC8vIFdoZW4gR29vZ2xlIFRlc3QgaXMgYnVpbHQgYXMgYSBmcmFtZXdvcmsgb24gTWFjT1MgWCwgdGhlIGVudmlyb24gdmFyaWFibGUKKyAgLy8gaXMgdW5hdmFpbGFibGUuIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbiAobWFuIGVudmlyb24pIHJlY29tbWVuZHMgdXNpbmcKKyAgLy8gX05TR2V0RW52aXJvbigpIGluc3RlYWQuCisgIHJldHVybiAqX05TR2V0RW52aXJvbigpOworfQorIyAgZWxzZQorLy8gU29tZSBQT1NJWCBwbGF0Zm9ybXMgZXhwZWN0IHlvdSB0byBkZWNsYXJlIGVudmlyb24uIGV4dGVybiAiQyIgbWFrZXMKKy8vIGl0IHJlc2lkZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK2V4dGVybiAiQyIgY2hhcioqIGVudmlyb247CitpbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7IHJldHVybiBlbnZpcm9uOyB9CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyMgIGlmICFHVEVTVF9PU19RTlgKKy8vIFRoZSBtYWluIGZ1bmN0aW9uIGZvciBhIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgorLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjbG9uZSgpLWVkIHByb2Nlc3MgYW5kIHRodXMgbXVzdCBhdm9pZAorLy8gYW55IHBvdGVudGlhbGx5IHVuc2FmZSBvcGVyYXRpb25zIGxpa2UgbWFsbG9jIG9yIGxpYmMgZnVuY3Rpb25zLgorc3RhdGljIGludCBFeGVjRGVhdGhUZXN0Q2hpbGRNYWluKHZvaWQqIGNoaWxkX2FyZykgeworICBFeGVjRGVhdGhUZXN0QXJncyogY29uc3QgYXJncyA9IHN0YXRpY19jYXN0PEV4ZWNEZWF0aFRlc3RBcmdzKj4oY2hpbGRfYXJnKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShhcmdzLT5jbG9zZV9mZCkpOworCisgIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlCisgIC8vIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQuICBUaGVyZWZvcmUgd2UgY2hhbmdlIHRvIHRoZSBvcmlnaW5hbAorICAvLyB3b3JraW5nIGRpcmVjdG9yeSBmaXJzdC4KKyAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpOworICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgY2hkaXIoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLgorICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImNoZGlyKFwiIikgKyBvcmlnaW5hbF9kaXIgKyAiXCIpIGZhaWxlZDogIiArCisgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBleGVjdmUoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLiAgV2UKKyAgLy8gY2Fubm90IHVzZSBleGVjdnAoKSBhcyBpdCdzIGEgbGliYyBmdW5jdGlvbiBhbmQgdGh1cyBwb3RlbnRpYWxseQorICAvLyB1bnNhZmUuICBTaW5jZSBleGVjdmUoKSBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSCwgdGhlIHVzZXIgbXVzdAorICAvLyBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSB2YWxpZCBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3QKKyAgLy8gb25lIHBhdGggc2VwYXJhdG9yLgorICBleGVjdmUoYXJncy0+YXJndlswXSwgYXJncy0+YXJndiwgR2V0RW52aXJvbigpKTsKKyAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImV4ZWN2ZSgiKSArIGFyZ3MtPmFyZ3ZbMF0gKyAiLCAuLi4pIGluICIgKworICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kaXIgKyAiIGZhaWxlZDogIiArCisgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkpOworICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorIyAgZW5kaWYgIC8vICFHVEVTVF9PU19RTlgKKworLy8gVHdvIHV0aWxpdHkgcm91dGluZXMgdGhhdCB0b2dldGhlciBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiB0aGUgc3RhY2sKKy8vIGdyb3dzLgorLy8gVGhpcyBjb3VsZCBiZSBhY2NvbXBsaXNoZWQgbW9yZSBlbGVnYW50bHkgYnkgYSBzaW5nbGUgcmVjdXJzaXZlCisvLyBmdW5jdGlvbiwgYnV0IHdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgdW5saWtlbHkgcG9zc2liaWxpdHkgb2YKKy8vIGEgc21hcnQgY29tcGlsZXIgb3B0aW1pemluZyB0aGUgcmVjdXJzaW9uIGF3YXkuCisvLworLy8gR1RFU1RfTk9fSU5MSU5FXyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IEdDQyA0LjYgZnJvbSBpbmxpbmluZworLy8gU3RhY2tMb3dlclRoYW5BZGRyZXNzIGludG8gU3RhY2tHcm93c0Rvd24sIHdoaWNoIHRoZW4gZG9lc24ndCBnaXZlCisvLyBjb3JyZWN0IGFuc3dlci4KK3ZvaWQgU3RhY2tMb3dlclRoYW5BZGRyZXNzKGNvbnN0IHZvaWQqIHB0ciwgYm9vbCogcmVzdWx0KSBHVEVTVF9OT19JTkxJTkVfOwordm9pZCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyLCBib29sKiByZXN1bHQpIHsKKyAgaW50IGR1bW15OworICAqcmVzdWx0ID0gKCZkdW1teSA8IHB0cik7Cit9CisKK2Jvb2wgU3RhY2tHcm93c0Rvd24oKSB7CisgIGludCBkdW1teTsKKyAgYm9vbCByZXN1bHQ7CisgIFN0YWNrTG93ZXJUaGFuQWRkcmVzcygmZHVtbXksICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIGluCisvLyBhIHRocmVhZC1zYWZlIG1hbm5lciBhbmQgaW5zdHJ1Y3RzIGl0IHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoZQorLy8gaW1wbGVtZW50YXRpb24gdXNlcyBmb3JrKDIpICsgZXhlYy4gIE9uIHN5c3RlbXMgd2hlcmUgY2xvbmUoMikgaXMKKy8vIGF2YWlsYWJsZSwgaXQgaXMgdXNlZCBpbnN0ZWFkLCBiZWluZyBzbGlnaHRseSBtb3JlIHRocmVhZC1zYWZlLiAgT24gUU5YLAorLy8gZm9yayBzdXBwb3J0cyBvbmx5IHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHNvIHRoaXMgZnVuY3Rpb24gdXNlcworLy8gc3Bhd24oMikgdGhlcmUgaW5zdGVhZC4gIFRoZSBmdW5jdGlvbiBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZgorLy8gYW55dGhpbmcgZ29lcyB3cm9uZy4KK3N0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07CisgIHBpZF90IGNoaWxkX3BpZCA9IC0xOworCisjICBpZiBHVEVTVF9PU19RTlgKKyAgLy8gT2J0YWlucyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNldHMgaXQgdG8gYmUgY2xvc2VkIGluIHRoZSBjaGlsZAorICAvLyBwcm9jZXNzLgorICBjb25zdCBpbnQgY3dkX2ZkID0gb3BlbigiLiIsIE9fUkRPTkxZKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY3dkX2ZkICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjd2RfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpKTsKKyAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKKyAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCisgIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgorICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7CisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCisgIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKKyAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgaW50IGZkX2ZsYWdzOworICAvLyBTZXQgY2xvc2VfZmQgdG8gYmUgY2xvc2VkIGFmdGVyIHNwYXduLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZkX2ZsYWdzID0gZmNudGwoY2xvc2VfZmQsIEZfR0VURkQpKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjbG9zZV9mZCwgRl9TRVRGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9mbGFncyB8IEZEX0NMT0VYRUMpKTsKKyAgc3RydWN0IGluaGVyaXRhbmNlIGluaGVyaXQgPSB7MH07CisgIC8vIHNwYXduIGlzIGEgc3lzdGVtIGNhbGwuCisgIGNoaWxkX3BpZCA9IHNwYXduKGFyZ3MuYXJndlswXSwgMCwgTlVMTCwgJmluaGVyaXQsIGFyZ3MuYXJndiwgR2V0RW52aXJvbigpKTsKKyAgLy8gUmVzdG9yZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZjaGRpcihjd2RfZmQpICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShjd2RfZmQpKTsKKworIyAgZWxzZSAgIC8vIEdURVNUX09TX1FOWAorIyAgIGlmIEdURVNUX09TX0xJTlVYCisgIC8vIFdoZW4gYSBTSUdQUk9GIHNpZ25hbCBpcyByZWNlaXZlZCB3aGlsZSBmb3JrKCkgb3IgY2xvbmUoKSBhcmUgZXhlY3V0aW5nLAorICAvLyB0aGUgcHJvY2VzcyBtYXkgaGFuZy4gVG8gYXZvaWQgdGhpcywgd2UgaWdub3JlIFNJR1BST0YgaGVyZSBhbmQgcmUtZW5hYmxlCisgIC8vIGl0IGFmdGVyIHRoZSBjYWxsIHRvIGZvcmsoKS9jbG9uZSgpIGlzIGNvbXBsZXRlLgorICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhdmVkX3NpZ3Byb2ZfYWN0aW9uOworICBzdHJ1Y3Qgc2lnYWN0aW9uIGlnbm9yZV9zaWdwcm9mX2FjdGlvbjsKKyAgbWVtc2V0KCZpZ25vcmVfc2lncHJvZl9hY3Rpb24sIDAsIHNpemVvZihpZ25vcmVfc2lncHJvZl9hY3Rpb24pKTsKKyAgc2lnZW1wdHlzZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9tYXNrKTsKKyAgaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHNpZ2FjdGlvbigKKyAgICAgIFNJR1BST0YsICZpZ25vcmVfc2lncHJvZl9hY3Rpb24sICZzYXZlZF9zaWdwcm9mX2FjdGlvbikpOworIyAgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjICAgaWYgR1RFU1RfSEFTX0NMT05FCisgIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCisgIGlmICghdXNlX2ZvcmspIHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzdGFja19ncm93c19kb3duID0gU3RhY2tHcm93c0Rvd24oKTsKKyAgICBjb25zdCBzaXplX3Qgc3RhY2tfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgLy8gTU1BUF9BTk9OWU1PVVMgaXMgbm90IGRlZmluZWQgb24gTWFjLCBzbyB3ZSB1c2UgTUFQX0FOT04gaW5zdGVhZC4KKyAgICB2b2lkKiBjb25zdCBzdGFjayA9IG1tYXAoTlVMTCwgc3RhY2tfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT04gfCBNQVBfUFJJVkFURSwgLTEsIDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrICE9IE1BUF9GQUlMRUQpOworCisgICAgLy8gTWF4aW11bSBzdGFjayBhbGlnbm1lbnQgaW4gYnl0ZXM6ICBGb3IgYSBkb3dud2FyZC1ncm93aW5nIHN0YWNrLCB0aGlzCisgICAgLy8gYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSBzaXplIG9mIHRoZSBzdGFjayBzcGFjZSB0byBnZXQgYW4gYWRkcmVzcworICAgIC8vIHRoYXQgaXMgd2l0aGluIHRoZSBzdGFjayBzcGFjZSBhbmQgaXMgYWxpZ25lZCBvbiBhbGwgc3lzdGVtcyB3ZSBjYXJlCisgICAgLy8gYWJvdXQuICBBcyBmYXIgYXMgSSBrbm93IHRoZXJlIGlzIG5vIEFCSSB3aXRoIHN0YWNrIGFsaWdubWVudCBncmVhdGVyCisgICAgLy8gdGhhbiA2NC4gIFdlIGFzc3VtZSBzdGFjayBhbmQgc3RhY2tfc2l6ZSBhbHJlYWR5IGhhdmUgYWxpZ25tZW50IG9mCisgICAgLy8ga01heFN0YWNrQWxpZ25tZW50LgorICAgIGNvbnN0IHNpemVfdCBrTWF4U3RhY2tBbGlnbm1lbnQgPSA2NDsKKyAgICB2b2lkKiBjb25zdCBzdGFja190b3AgPQorICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhY2spICsKKyAgICAgICAgICAgIChzdGFja19ncm93c19kb3duID8gc3RhY2tfc2l6ZSAtIGtNYXhTdGFja0FsaWdubWVudCA6IDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrX3NpemUgPiBrTWF4U3RhY2tBbGlnbm1lbnQgJiYKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oc3RhY2tfdG9wKSAlIGtNYXhTdGFja0FsaWdubWVudCA9PSAwKTsKKworICAgIGNoaWxkX3BpZCA9IGNsb25lKCZFeGVjRGVhdGhUZXN0Q2hpbGRNYWluLCBzdGFja190b3AsIFNJR0NITEQsICZhcmdzKTsKKworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKG11bm1hcChzdGFjaywgc3RhY2tfc2l6ZSkgIT0gLTEpOworICB9CisjICAgZWxzZQorICBjb25zdCBib29sIHVzZV9mb3JrID0gdHJ1ZTsKKyMgICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKyAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKKyAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOworICAgICAgX2V4aXQoMCk7CisgIH0KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19RTlgKKyMgIGlmIEdURVNUX09TX0xJTlVYCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oCisgICAgICBzaWdhY3Rpb24oU0lHUFJPRiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uLCBOVUxMKSk7CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICByZXR1cm4gY2hpbGRfcGlkOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQorLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKKyAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQorICAgICAgU3RyaW5nOjpGb3JtYXQoIi0tJXMlcz0lcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GTEFHX1BSRUZJWF8sIGtGaWx0ZXJGbGFnLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSwgaW5mby0+bmFtZSgpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgaW50ZXJuYWxfZmxhZyA9CisgICAgICBTdHJpbmc6OkZvcm1hdCgiLS0lcyVzPSVzfCVkfCVkfCVkIiwKKyAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZMQUdfUFJFRklYXywga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVfLCBsaW5lXywgZGVhdGhfdGVzdF9pbmRleCwgcGlwZV9mZFsxXSk7CisgIEFyZ3VtZW50cyBhcmdzOworICBhcmdzLkFkZEFyZ3VtZW50cyhHZXRBcmd2c0ZvckRlYXRoVGVzdENoaWxkUHJvY2VzcygpKTsKKyAgYXJncy5BZGRBcmd1bWVudChmaWx0ZXJfZmxhZy5jX3N0cigpKTsKKyAgYXJncy5BZGRBcmd1bWVudChpbnRlcm5hbF9mbGFnLmNfc3RyKCkpOworCisgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIC8vIFNlZSB0aGUgY29tbWVudCBpbiBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUgZm9yIHdoeSB0aGUgbmV4dCBsaW5lCisgIC8vIGlzIG5lY2Vzc2FyeS4KKyAgRmx1c2hJbmZvTG9nKCk7CisKKyAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gRXhlY0RlYXRoVGVzdFNwYXduQ2hpbGQoYXJncy5Bcmd2KCksIHBpcGVfZmRbMF0pOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKHBpcGVfZmRbMV0pKTsKKyAgc2V0X2NoaWxkX3BpZChjaGlsZF9waWQpOworICBzZXRfcmVhZF9mZChwaXBlX2ZkWzBdKTsKKyAgc2V0X3NwYXduZWQodHJ1ZSk7CisgIHJldHVybiBPVkVSU0VFX1RFU1Q7Cit9CisKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKKy8vIENyZWF0ZXMgYSBjb25jcmV0ZSBEZWF0aFRlc3QtZGVyaXZlZCBjbGFzcyB0aGF0IGRlcGVuZHMgb24gdGhlCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgZmxhZywgYW5kIHNldHMgdGhlIHBvaW50ZXIgcG9pbnRlZCB0bworLy8gYnkgdGhlICJ0ZXN0IiBhcmd1bWVudCB0byBpdHMgYWRkcmVzcy4gIElmIHRoZSB0ZXN0IHNob3VsZCBiZQorLy8gc2tpcHBlZCwgc2V0cyB0aGF0IHBvaW50ZXIgdG8gTlVMTC4gIFJldHVybnMgdHJ1ZSwgdW5sZXNzIHRoZQorLy8gZmxhZyBpcyBzZXQgdG8gYW4gaW52YWxpZCB2YWx1ZS4KK2Jvb2wgRGVmYXVsdERlYXRoVGVzdEZhY3Rvcnk6OkNyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWF0aFRlc3QqKiB0ZXN0KSB7CisgIFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQorICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCkKKyAgICAgIC0+aW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKTsKKworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgaWYgKGRlYXRoX3Rlc3RfaW5kZXggPiBmbGFnLT5pbmRleCgpKSB7CisgICAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgICAiRGVhdGggdGVzdCBjb3VudCAoJWQpIHNvbWVob3cgZXhjZWVkZWQgZXhwZWN0ZWQgbWF4aW11bSAoJWQpIiwKKyAgICAgICAgICBkZWF0aF90ZXN0X2luZGV4LCBmbGFnLT5pbmRleCgpKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCEoZmxhZy0+ZmlsZSgpID09IGZpbGUgJiYgZmxhZy0+bGluZSgpID09IGxpbmUgJiYKKyAgICAgICAgICBmbGFnLT5pbmRleCgpID09IGRlYXRoX3Rlc3RfaW5kZXgpKSB7CisgICAgICAqdGVzdCA9IE5VTEw7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiIHx8CisgICAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IFdpbmRvd3NEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSk7CisgIH0KKworIyBlbHNlCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiKSB7CisgICAgKnRlc3QgPSBuZXcgRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKKyAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IE5vRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4KTsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgZWxzZSB7ICAvLyBOT0xJTlQgLSB0aGlzIGlzIG1vcmUgcmVhZGFibGUgdGhhbiB1bmJhbGFuY2VkIGJyYWNrZXRzIGluc2lkZSAjaWYuCisgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJVbmtub3duIGRlYXRoIHRlc3Qgc3R5bGUgXCIlc1wiIGVuY291bnRlcmVkIiwKKyAgICAgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKS5jX3N0cigpKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBvbiBhIGdpdmVuIGRlbGltaXRlciwgcG9wdWxhdGluZyBhIGdpdmVuCisvLyB2ZWN0b3Igd2l0aCB0aGUgZmllbGRzLiAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUKKy8vIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UgaXQgaGVyZS4KK3N0YXRpYyB2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiogZGVzdCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBwYXJzZWQ7CisgIDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7CisgICAgY29uc3QgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gc3RyLmZpbmQoZGVsaW1pdGVyLCBwb3MpOworICAgIGlmIChjb2xvbiA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zKSk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcywgY29sb24gLSBwb3MpKTsKKyAgICAgIHBvcyA9IGNvbG9uICsgMTsKKyAgICB9CisgIH0KKyAgZGVzdC0+c3dhcChwYXJzZWQpOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFJlY3JlYXRlcyB0aGUgcGlwZSBhbmQgZXZlbnQgaGFuZGxlcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLAorLy8gc2lnbmFscyB0aGUgZXZlbnQsIGFuZCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHdyYXBwZWQgYXJvdW5kIHRoZSBwaXBlCisvLyBoYW5kbGUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBjaGlsZCBwcm9jZXNzIG9ubHkuCitpbnQgR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IodW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90KSB7CisgIEF1dG9IYW5kbGUgcGFyZW50X3Byb2Nlc3NfaGFuZGxlKDo6T3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBOb24taW5oZXJpdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcHJvY2Vzc19pZCkpOworICBpZiAocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoIlVuYWJsZSB0byBvcGVuIHBhcmVudCBwcm9jZXNzICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVwbGFjZSB0aGUgZm9sbG93aW5nIGNoZWNrIHdpdGggYQorICAvLyBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHdoZW4gYXZhaWxhYmxlLgorICBHVEVTVF9DSEVDS18oc2l6ZW9mKEhBTkRMRSkgPD0gc2l6ZW9mKHNpemVfdCkpOworCisgIGNvbnN0IEhBTkRMRSB3cml0ZV9oYW5kbGUgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KHdyaXRlX2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX3dyaXRlX2hhbmRsZTsKKworICAvLyBUaGUgbmV3bHkgaW5pdGlhbGl6ZWQgaGFuZGxlIGlzIGFjY2Vzc2libGUgb25seSBpbiBpbiB0aGUgcGFyZW50CisgIC8vIHByb2Nlc3MuIFRvIG9idGFpbiBvbmUgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIGNoaWxkLCB3ZSBuZWVkIHRvIHVzZQorICAvLyBEdXBsaWNhdGVIYW5kbGUuCisgIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCB3cml0ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX3dyaXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDAsICAgIC8vIFJlcXVlc3RlZCBwcml2aWxlZ2VzIGlnbm9yZWQgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERVUExJQ0FURV9TQU1FX0FDQ0VTUyBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gUmVxdWVzdCBub24taW5oZXJpdGFibGUgaGFuZGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBwaXBlIGhhbmRsZSAlSXUgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LCBwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgY29uc3QgSEFORExFIGV2ZW50X2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPihldmVudF9oYW5kbGVfYXNfc2l6ZV90KTsKKyAgSEFORExFIGR1cF9ldmVudF9oYW5kbGU7CisKKyAgaWYgKCE6OkR1cGxpY2F0ZUhhbmRsZShwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCksIGV2ZW50X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfZXZlbnRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBldmVudCBoYW5kbGUgJUl1IGZyb20gdGhlIHBhcmVudCBwcm9jZXNzICV1IiwKKyAgICAgICAgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCwgcGFyZW50X3Byb2Nlc3NfaWQpKTsKKyAgfQorCisgIGNvbnN0IGludCB3cml0ZV9mZCA9CisgICAgICA6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihkdXBfd3JpdGVfaGFuZGxlKSwgT19BUFBFTkQpOworICBpZiAod3JpdGVfZmQgPT0gLTEpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBjb252ZXJ0IHBpcGUgaGFuZGxlICVJdSB0byBhIGZpbGUgZGVzY3JpcHRvciIsCisgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QpKTsKKyAgfQorCisgIC8vIFNpZ25hbHMgdGhlIHBhcmVudCB0aGF0IHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgaGFzIGJlZW4gYWNxdWlyZWQKKyAgLy8gc28gdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIHdyaXRlIGVuZC4KKyAgOjpTZXRFdmVudChkdXBfZXZlbnRfaGFuZGxlKTsKKworICByZXR1cm4gd3JpdGVfZmQ7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyBvYmplY3Qgd2l0aCBmaWVsZHMKKy8vIGluaXRpYWxpemVkIGZyb20gdGhlIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpIGZsYWcgaWYKKy8vIHRoZSBmbGFnIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KK0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgIGlmIChHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9PSAiIikgcmV0dXJuIE5VTEw7CisKKyAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UKKyAgLy8gY2FuIHVzZSBpdCBoZXJlLgorICBpbnQgbGluZSA9IC0xOworICBpbnQgaW5kZXggPSAtMTsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gZmllbGRzOworICBTcGxpdFN0cmluZyhHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpLCAnfCcsICZmaWVsZHMpOworICBpbnQgd3JpdGVfZmQgPSAtMTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgdW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkID0gMDsKKyAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QgPSAwOworICBzaXplX3QgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCA9IDA7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNgorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmcGFyZW50X3Byb2Nlc3NfaWQpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s0XSwgJndyaXRlX2hhbmRsZV9hc19zaXplX3QpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s1XSwgJmV2ZW50X2hhbmRsZV9hc19zaXplX3QpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICJCYWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnOiAlcyIsCisgICAgICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmNfc3RyKCkpKTsKKyAgfQorICB3cml0ZV9mZCA9IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7CisjIGVsc2UKKworICBpZiAoZmllbGRzLnNpemUoKSAhPSA0CisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZ3cml0ZV9mZCkpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICVzIiwKKyAgICAgICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuY19zdHIoKSkpOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gbmV3IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyhmaWVsZHNbMF0sIGxpbmUsIGluZGV4LCB3cml0ZV9mZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LWZpbGVwYXRoLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDBjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYwpAQCAtMCwwICsxLDM4MSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxpby5oPgorI2VsaWYgR1RFU1RfT1NfU1lNQklBTgorLy8gU3ltYmlhbiBPcGVuQyBoYXMgUEFUSF9NQVggaW4gc3lzL3N5c2xpbWl0cy5oCisjIGluY2x1ZGUgPHN5cy9zeXNsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorIyBpbmNsdWRlIDxjbGltaXRzPiAgLy8gU29tZSBMaW51eCBkaXN0cmlidXRpb25zIGRlZmluZSBQQVRIX01BWCBoZXJlLgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIF9NQVhfUEFUSAorI2VsaWYgZGVmaW5lZChQQVRIX01BWCkKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBQQVRIX01BWAorI2VsaWYgZGVmaW5lZChfWE9QRU5fUEFUSF9NQVgpCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1hPUEVOX1BBVEhfTUFYCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIF9QT1NJWF9QQVRIX01BWAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKy8vIE9uIFdpbmRvd3MsICdcXCcgaXMgdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yLCBidXQgbWFueSB0b29scyBhbmQgdGhlCisvLyBXaW5kb3dzIEFQSSBhbHNvIGFjY2VwdCAnLycgYXMgYW4gYWx0ZXJuYXRlIHBhdGggc2VwYXJhdG9yLiBVbmxlc3Mgb3RoZXJ3aXNlCisvLyBub3RlZCwgYSBmaWxlIHBhdGggY2FuIGNvbnRhaW4gZWl0aGVyIGtpbmQgb2YgcGF0aCBzZXBhcmF0b3JzLCBvciBhIG1peHR1cmUKKy8vIG9mIHRoZW0uCitjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJ1xcJzsKK2NvbnN0IGNoYXIga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IgPSAnLyc7Citjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yU3RyaW5nW10gPSAiXFwiOworY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIi8iOworIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeS4gWW91IHNob3VsZCBub3QgdXNlCisvLyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4gdGVzdHMgb24gV2luZG93cyBDRSwgYnV0IHRoaXMgYXQgbGVhc3QKKy8vIHByb3ZpZGVzIGEgcmVhc29uYWJsZSBmYWxsYmFjay4KK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICJcXCI7CisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgZGVmaW5lIElOVkFMSURfRklMRV9BVFRSSUJVVEVTCitjb25zdCBEV09SRCBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzID0gMHhmZmZmZmZmZjsKKyMgZWxzZQorY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi5cXCI7CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorI2Vsc2UKK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnLyc7Citjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yU3RyaW5nW10gPSAiLyI7Citjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiLi8iOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IuCitzdGF0aWMgYm9vbCBJc1BhdGhTZXBhcmF0b3IoY2hhciBjKSB7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgcmV0dXJuIChjID09IGtQYXRoU2VwYXJhdG9yKSB8fCAoYyA9PSBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcik7CisjZWxzZQorICByZXR1cm4gYyA9PSBrUGF0aFNlcGFyYXRvcjsKKyNlbmRpZgorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciAiIiBpZiB1bnN1Y2Nlc3NmdWwuCitGaWxlUGF0aCBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgZGlyZWN0b3J5LCBzbyB3ZSBqdXN0IHJldHVybgorICAvLyBzb21ldGhpbmcgcmVhc29uYWJsZS4KKyAgcmV0dXJuIEZpbGVQYXRoKGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nKTsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKKyAgcmV0dXJuIEZpbGVQYXRoKF9nZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkgPT0gTlVMTCA/ICIiIDogY3dkKTsKKyNlbHNlCisgIGNoYXIgY3dkW0dURVNUX1BBVEhfTUFYXyArIDFdID0geyAnXDAnIH07CisgIHJldHVybiBGaWxlUGF0aChnZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkgPT0gTlVMTCA/ICIiIDogY3dkKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK30KKworLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgiZGlyL2ZpbGUuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJFWEUiKSByZXR1cm5zCisvLyBGaWxlUGF0aCgiZGlyL2ZpbGUiKS4gSWYgYSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiBpcyBub3QKKy8vIGZvdW5kLCByZXR1cm5zIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRmlsZVBhdGguCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgY29uc3QgeworICBjb25zdCBzdGQ6OnN0cmluZyBkb3RfZXh0ZW5zaW9uID0gc3RkOjpzdHJpbmcoIi4iKSArIGV4dGVuc2lvbjsKKyAgaWYgKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUocGF0aG5hbWVfLCBkb3RfZXh0ZW5zaW9uKSkgeworICAgIHJldHVybiBGaWxlUGF0aChwYXRobmFtZV8uc3Vic3RyKAorICAgICAgICAwLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSBkb3RfZXh0ZW5zaW9uLmxlbmd0aCgpKSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbgorLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAorLy8gc2VwYXJhdG9ycy4gUmV0dXJucyBOVUxMIGlmIG5vIHBhdGggc2VwYXJhdG9yIHdhcyBmb3VuZC4KK2NvbnN0IGNoYXIqIEZpbGVQYXRoOjpGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gc3RycmNocihjX3N0cigpLCBrUGF0aFNlcGFyYXRvcik7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9hbHRfc2VwID0gc3RycmNocihjX3N0cigpLCBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcik7CisgIC8vIENvbXBhcmluZyB0d28gcG9pbnRlcnMgb2Ygd2hpY2ggb25seSBvbmUgaXMgTlVMTCBpcyB1bmRlZmluZWQuCisgIGlmIChsYXN0X2FsdF9zZXAgIT0gTlVMTCAmJgorICAgICAgKGxhc3Rfc2VwID09IE5VTEwgfHwgbGFzdF9hbHRfc2VwID4gbGFzdF9zZXApKSB7CisgICAgcmV0dXJuIGxhc3RfYWx0X3NlcDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBsYXN0X3NlcDsKK30KKworLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpIHJldHVybnMKKy8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucworLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKKy8vIHJldHVybnMgYW4gZW1wdHkgRmlsZVBhdGggKCIiKS4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRGlyZWN0b3J5TmFtZSgpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKTsKKyAgcmV0dXJuIGxhc3Rfc2VwID8gRmlsZVBhdGgobGFzdF9zZXAgKyAxKSA6ICp0aGlzOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCB3aXRoIHRoZSBmaWxlbmFtZSByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkgcmV0dXJucyAicGF0aC90by8iLgorLy8gSWYgdGhlIEZpbGVQYXRoIGlzICJhX2ZpbGUiIG9yICIvYV9maWxlIiwgUmVtb3ZlRmlsZU5hbWUgcmV0dXJucworLy8gRmlsZVBhdGgoIi4vIikgb3IsIG9uIFdpbmRvd3MsIEZpbGVQYXRoKCIuXFwiKS4gSWYgdGhlIGZpbGVwYXRoIGRvZXMKKy8vIG5vdCBoYXZlIGEgZmlsZSwgbGlrZSAianVzdC9hL2Rpci8iLCBpdCByZXR1cm5zIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLgorLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVGaWxlTmFtZSgpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKTsKKyAgc3RkOjpzdHJpbmcgZGlyOworICBpZiAobGFzdF9zZXApIHsKKyAgICBkaXIgPSBzdGQ6OnN0cmluZyhjX3N0cigpLCBsYXN0X3NlcCArIDEgLSBjX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBkaXIgPSBrQ3VycmVudERpcmVjdG9yeVN0cmluZzsKKyAgfQorICByZXR1cm4gRmlsZVBhdGgoZGlyKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFtaW5nIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciB4bWwgb3V0cHV0LgorCisvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgYmFzZV9uYW1lID0gInRlc3QiLCBudW1iZXIgPSAwLAorLy8gZXh0ZW5zaW9uID0gInhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuIElmIG51bWJlciBpcyBncmVhdGVyCisvLyB0aGFuIHplcm8gKGUuZy4sIDEyKSwgcmV0dXJucyAiZGlyL3Rlc3RfMTIueG1sIi4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCitGaWxlUGF0aCBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgeworICBzdGQ6OnN0cmluZyBmaWxlOworICBpZiAobnVtYmVyID09IDApIHsKKyAgICBmaWxlID0gYmFzZV9uYW1lLnN0cmluZygpICsgIi4iICsgZXh0ZW5zaW9uOworICB9IGVsc2UgeworICAgIGZpbGUgPSBiYXNlX25hbWUuc3RyaW5nKCkgKyAiXyIgKyBTdHJpbmc6OkZvcm1hdCgiJWQiLCBudW1iZXIpLmNfc3RyKCkKKyAgICAgICAgKyAiLiIgKyBleHRlbnNpb247CisgIH0KKyAgcmV0dXJuIENvbmNhdFBhdGhzKGRpcmVjdG9yeSwgRmlsZVBhdGgoZmlsZSkpOworfQorCisvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuCisvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6OkNvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKKyAgaWYgKGRpcmVjdG9yeS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHJlbGF0aXZlX3BhdGg7CisgIGNvbnN0IEZpbGVQYXRoIGRpcihkaXJlY3RvcnkuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworICByZXR1cm4gRmlsZVBhdGgoZGlyLnN0cmluZygpICsga1BhdGhTZXBhcmF0b3IgKyByZWxhdGl2ZV9wYXRoLnN0cmluZygpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBzb21ldGhpbmcgZmluZGFibGUgaW4gdGhlIGZpbGUtc3lzdGVtLAorLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlci4KK2Jvb2wgRmlsZVBhdGg6OkZpbGVPckRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGhuYW1lXy5jX3N0cigpKTsKKyAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOworICBkZWxldGUgW10gdW5pY29kZTsKKyAgcmV0dXJuIGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlczsKKyNlbHNlCisgIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKKyAgcmV0dXJuIHBvc2l4OjpTdGF0KHBhdGhuYW1lXy5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQorLy8gdGhhdCBleGlzdHMuCitib29sIEZpbGVQYXRoOjpEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7CisgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBEb24ndCBzdHJpcCBvZmYgdHJhaWxpbmcgc2VwYXJhdG9yIGlmIHBhdGggaXMgYSByb290IGRpcmVjdG9yeSBvbgorICAvLyBXaW5kb3dzIChsaWtlICJDOlxcIikuCisgIGNvbnN0IEZpbGVQYXRoJiBwYXRoKElzUm9vdERpcmVjdG9yeSgpID8gKnRoaXMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKyNlbHNlCisgIGNvbnN0IEZpbGVQYXRoJiBwYXRoKCp0aGlzKTsKKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRoLmNfc3RyKCkpOworICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7CisgIGRlbGV0ZSBbXSB1bmljb2RlOworICBpZiAoKGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlcykgJiYKKyAgICAgIChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgeworICAgIHJlc3VsdCA9IHRydWU7CisgIH0KKyNlbHNlCisgIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKKyAgcmVzdWx0ID0gcG9zaXg6OlN0YXQocGF0aC5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwICYmCisgICAgICBwb3NpeDo6SXNEaXIoZmlsZV9zdGF0KTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUKKy8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKK2Jvb2wgRmlsZVBhdGg6OklzUm9vdERpcmVjdG9yeSgpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIGEgbmV0d29yayBzaGFyZSBsaWtlCisgIC8vIFxcc2VydmVyXHNoYXJlIGNhbiBiZSBhIHJvb3QgZGlyZWN0b3J5LCBhbHRob3VnaCBpdCBjYW5ub3QgYmUgdGhlCisgIC8vIGN1cnJlbnQgZGlyZWN0b3J5LiAgSGFuZGxlIHRoaXMgcHJvcGVybHkuCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMyAmJiBJc0Fic29sdXRlUGF0aCgpOworI2Vsc2UKKyAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAxICYmIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVswXSk7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgorYm9vbCBGaWxlUGF0aDo6SXNBYnNvbHV0ZVBhdGgoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSBwYXRobmFtZV8uY19zdHIoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPj0gMyAmJgorICAgICAoKG5hbWVbMF0gPj0gJ2EnICYmIG5hbWVbMF0gPD0gJ3onKSB8fAorICAgICAgKG5hbWVbMF0gPj0gJ0EnICYmIG5hbWVbMF0gPD0gJ1onKSkgJiYKKyAgICAgbmFtZVsxXSA9PSAnOicgJiYKKyAgICAgSXNQYXRoU2VwYXJhdG9yKG5hbWVbMl0pOworI2Vsc2UKKyAgcmV0dXJuIElzUGF0aFNlcGFyYXRvcihuYW1lWzBdKTsKKyNlbmRpZgorfQorCisvLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCisvLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCisvLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgorLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCisvLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisvLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgorLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcworLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7CisgIEZpbGVQYXRoIGZ1bGxfcGF0aG5hbWU7CisgIGludCBudW1iZXIgPSAwOworICBkbyB7CisgICAgZnVsbF9wYXRobmFtZS5TZXQoTWFrZUZpbGVOYW1lKGRpcmVjdG9yeSwgYmFzZV9uYW1lLCBudW1iZXIrKywgZXh0ZW5zaW9uKSk7CisgIH0gd2hpbGUgKGZ1bGxfcGF0aG5hbWUuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworICByZXR1cm4gZnVsbF9wYXRobmFtZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorLy8gaXQgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgZGlyZWN0b3J5LiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKy8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgorYm9vbCBGaWxlUGF0aDo6SXNEaXJlY3RvcnkoKSBjb25zdCB7CisgIHJldHVybiAhcGF0aG5hbWVfLmVtcHR5KCkgJiYKKyAgICAgICAgIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVtwYXRobmFtZV8ubGVuZ3RoKCkgLSAxXSk7Cit9CisKKy8vIENyZWF0ZSBkaXJlY3RvcmllcyBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBpZgorLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcmllcworLy8gZm9yIGFueSByZWFzb24uCitib29sIEZpbGVQYXRoOjpDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3QgeworICBpZiAoIXRoaXMtPklzRGlyZWN0b3J5KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAocGF0aG5hbWVfLmxlbmd0aCgpID09IDAgfHwgdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IEZpbGVQYXRoIHBhcmVudCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5SZW1vdmVGaWxlTmFtZSgpKTsKKyAgcmV0dXJuIHBhcmVudC5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgJiYgdGhpcy0+Q3JlYXRlRm9sZGVyKCk7Cit9CisKKy8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yCisvLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCisvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAorLy8gZXhpc3QuIE5vdCBuYW1lZCAiQ3JlYXRlRGlyZWN0b3J5IiBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIG9uIFdpbmRvd3MuCitib29sIEZpbGVQYXRoOjpDcmVhdGVGb2xkZXIoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgRmlsZVBhdGggcmVtb3ZlZF9zZXAodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHJlbW92ZWRfc2VwLmNfc3RyKCkpOworICBpbnQgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5KHVuaWNvZGUsIE5VTEwpID8gMCA6IC0xOworICBkZWxldGUgW10gdW5pY29kZTsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyAgaW50IHJlc3VsdCA9IF9ta2RpcihwYXRobmFtZV8uY19zdHIoKSk7CisjZWxzZQorICBpbnQgcmVzdWx0ID0gbWtkaXIocGF0aG5hbWVfLmNfc3RyKCksIDA3NzcpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICByZXR1cm4gdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCk7ICAvLyBBbiBlcnJvciBpcyBPSyBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgfQorICByZXR1cm4gdHJ1ZTsgIC8vIE5vIGVycm9yLgorfQorCisvLyBJZiBpbnB1dCBuYW1lIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIsIHJlbW92ZSBpdCBhbmQgcmV0dXJuIHRoZQorLy8gbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yLCBvdGhlciBwbGF0Zm9ybXMgdXNlIC8uCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3QgeworICByZXR1cm4gSXNEaXJlY3RvcnkoKQorICAgICAgPyBGaWxlUGF0aChwYXRobmFtZV8uc3Vic3RyKDAsIHBhdGhuYW1lXy5sZW5ndGgoKSAtIDEpKQorICAgICAgOiAqdGhpczsKK30KKworLy8gUmVtb3ZlcyBhbnkgcmVkdW5kYW50IHNlcGFyYXRvcnMgdGhhdCBtaWdodCBiZSBpbiB0aGUgcGF0aG5hbWUuCisvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgorLy8gcmVkdW5kYW5jaWVzIHRoYXQgbWlnaHQgYmUgaW4gYSBwYXRobmFtZSBpbnZvbHZpbmcgIi4iIG9yICIuLiIuCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogaGFuZGxlIFdpbmRvd3MgbmV0d29yayBzaGFyZXMgKGUuZy4gXFxzZXJ2ZXJcc2hhcmUpLgordm9pZCBGaWxlUGF0aDo6Tm9ybWFsaXplKCkgeworICBpZiAocGF0aG5hbWVfLmNfc3RyKCkgPT0gTlVMTCkgeworICAgIHBhdGhuYW1lXyA9ICIiOworICAgIHJldHVybjsKKyAgfQorICBjb25zdCBjaGFyKiBzcmMgPSBwYXRobmFtZV8uY19zdHIoKTsKKyAgY2hhciogY29uc3QgZGVzdCA9IG5ldyBjaGFyW3BhdGhuYW1lXy5sZW5ndGgoKSArIDFdOworICBjaGFyKiBkZXN0X3B0ciA9IGRlc3Q7CisgIG1lbXNldChkZXN0X3B0ciwgMCwgcGF0aG5hbWVfLmxlbmd0aCgpICsgMSk7CisKKyAgd2hpbGUgKCpzcmMgIT0gJ1wwJykgeworICAgICpkZXN0X3B0ciA9ICpzcmM7CisgICAgaWYgKCFJc1BhdGhTZXBhcmF0b3IoKnNyYykpIHsKKyAgICAgIHNyYysrOworICAgIH0gZWxzZSB7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgICAgIGlmICgqZGVzdF9wdHIgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpIHsKKyAgICAgICAgKmRlc3RfcHRyID0ga1BhdGhTZXBhcmF0b3I7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHdoaWxlIChJc1BhdGhTZXBhcmF0b3IoKnNyYykpCisgICAgICAgIHNyYysrOworICAgIH0KKyAgICBkZXN0X3B0cisrOworICB9CisgICpkZXN0X3B0ciA9ICdcMCc7CisgIHBhdGhuYW1lXyA9IGRlc3Q7CisgIGRlbGV0ZVtdIGRlc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3MTdjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oCkBAIC0wLDAgKzEsMTA1NiBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB1c2VkIGJ5IHRoZSBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcHVyZWx5IEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uICBQbGVhc2UKKy8vIERPIE5PVCAjSU5DTFVERSBJVCBJTiBBIFVTRVIgUFJPR1JBTS4KKworI2lmbmRlZiBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisjZGVmaW5lIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKworLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fIGlzIGRlZmluZWQgdG8gMSBpZmYgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCBpcworLy8gcGFydCBvZiBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uOyBvdGhlcndpc2UgaXQncyB1bmRlZmluZWQuCisjaWYgIUdURVNUX0lNUExFTUVOVEFUSU9OXworLy8gQSB1c2VyIGlzIHRyeWluZyB0byBpbmNsdWRlIHRoaXMgZnJvbSBoaXMgY29kZSAtIGp1c3Qgc2F5IG5vLgorIyBlcnJvciAiZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiIKKyMgZXJyb3IgIkl0IG11c3Qgbm90IGJlIGluY2x1ZGVkIGV4Y2VwdCBieSBHb29nbGUgVGVzdCBpdHNlbGYuIgorI2VuZGlmICAvLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmbmRlZiBfV0lOMzJfV0NFCisjIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3Igc3RydG9sbC9fc3RydG91bDY0L21hbGxvYy9mcmVlLgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIG1lbW1vdmUuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiICAvLyBOT0xJTlQKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCisvLworLy8gV2UgZG9uJ3Qgd2FudCB0aGUgdXNlcnMgdG8gbW9kaWZ5IHRoaXMgZmxhZyBpbiB0aGUgY29kZSwgYnV0IHdhbnQKKy8vIEdvb2dsZSBUZXN0J3Mgb3duIHVuaXQgdGVzdHMgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQuIFRoZXJlZm9yZSB3ZQorLy8gZGVjbGFyZSBpdCBoZXJlIGFzIG9wcG9zZWQgdG8gaW4gZ3Rlc3QuaC4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oZGVhdGhfdGVzdF91c2VfZm9yayk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKKy8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCitHVEVTVF9BUElfIGV4dGVybiBjb25zdCBUeXBlSWQga1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3Q7CisKKy8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KK2NvbnN0IGNoYXIga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1tdID0gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIjsKK2NvbnN0IGNoYXIga0JyZWFrT25GYWlsdXJlRmxhZ1tdID0gImJyZWFrX29uX2ZhaWx1cmUiOworY29uc3QgY2hhciBrQ2F0Y2hFeGNlcHRpb25zRmxhZ1tdID0gImNhdGNoX2V4Y2VwdGlvbnMiOworY29uc3QgY2hhciBrQ29sb3JGbGFnW10gPSAiY29sb3IiOworY29uc3QgY2hhciBrRmlsdGVyRmxhZ1tdID0gImZpbHRlciI7Citjb25zdCBjaGFyIGtMaXN0VGVzdHNGbGFnW10gPSAibGlzdF90ZXN0cyI7Citjb25zdCBjaGFyIGtPdXRwdXRGbGFnW10gPSAib3V0cHV0IjsKK2NvbnN0IGNoYXIga1ByaW50VGltZUZsYWdbXSA9ICJwcmludF90aW1lIjsKK2NvbnN0IGNoYXIga1JhbmRvbVNlZWRGbGFnW10gPSAicmFuZG9tX3NlZWQiOworY29uc3QgY2hhciBrUmVwZWF0RmxhZ1tdID0gInJlcGVhdCI7Citjb25zdCBjaGFyIGtTaHVmZmxlRmxhZ1tdID0gInNodWZmbGUiOworY29uc3QgY2hhciBrU3RhY2tUcmFjZURlcHRoRmxhZ1tdID0gInN0YWNrX3RyYWNlX2RlcHRoIjsKK2NvbnN0IGNoYXIga1N0cmVhbVJlc3VsdFRvRmxhZ1tdID0gInN0cmVhbV9yZXN1bHRfdG8iOworY29uc3QgY2hhciBrVGhyb3dPbkZhaWx1cmVGbGFnW10gPSAidGhyb3dfb25fZmFpbHVyZSI7CisKKy8vIEEgdmFsaWQgcmFuZG9tIHNlZWQgbXVzdCBiZSBpbiBbMSwga01heFJhbmRvbVNlZWRdLgorY29uc3QgaW50IGtNYXhSYW5kb21TZWVkID0gOTk5OTk7CisKKy8vIGdfaGVscF9mbGFnIGlzIHRydWUgaWZmIHRoZSAtLWhlbHAgZmxhZyBvciBhbiBlcXVpdmFsZW50IGZvcm0gaXMKKy8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBnX2hlbHBfZmxhZzsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KK0dURVNUX0FQSV8gVGltZUluTWlsbGlzIEdldFRpbWVJbk1pbGxpcygpOworCisvLyBSZXR1cm5zIHRydWUgaWZmIEdvb2dsZSBUZXN0IHNob3VsZCB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCitHVEVTVF9BUElfIGJvb2wgU2hvdWxkVXNlQ29sb3IoYm9vbCBzdGRvdXRfaXNfdHR5KTsKKworLy8gRm9ybWF0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgYXMgc2Vjb25kcy4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcyk7CisKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhIGRhdGUgc3RyaW5nIGluIHRoZSBJU08gODYwMQorLy8gZm9ybWF0LCB3aXRob3V0IHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbi4gIE4uQi46IGR1ZSB0byB0aGUgdXNlIHRoZQorLy8gbm9uLXJlZW50cmFudCBsb2NhbHRpbWUoKSBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuICBEbworLy8gbm90IHVzZSBpdCBpbiBhbnkgY29kZSB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMShUaW1lSW5NaWxsaXMgbXMpOworCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitHVEVTVF9BUElfIGJvb2wgUGFyc2VJbnQzMkZsYWcoCisgICAgY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpOworCisvLyBSZXR1cm5zIGEgcmFuZG9tIHNlZWQgaW4gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBiYXNlZCBvbiB0aGUKKy8vIGdpdmVuIC0tZ3Rlc3RfcmFuZG9tX3NlZWQgZmxhZyB2YWx1ZS4KK2lubGluZSBpbnQgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEludDMyIHJhbmRvbV9zZWVkX2ZsYWcpIHsKKyAgY29uc3QgdW5zaWduZWQgaW50IHJhd19zZWVkID0gKHJhbmRvbV9zZWVkX2ZsYWcgPT0gMCkgPworICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihHZXRUaW1lSW5NaWxsaXMoKSkgOgorICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyYW5kb21fc2VlZF9mbGFnKTsKKworICAvLyBOb3JtYWxpemVzIHRoZSBhY3R1YWwgc2VlZCB0byByYW5nZSBbMSwga01heFJhbmRvbVNlZWRdIHN1Y2ggdGhhdAorICAvLyBpdCdzIGVhc3kgdG8gdHlwZS4KKyAgY29uc3QgaW50IG5vcm1hbGl6ZWRfc2VlZCA9CisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KChyYXdfc2VlZCAtIDFVKSAlCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oa01heFJhbmRvbVNlZWQpKSArIDE7CisgIHJldHVybiBub3JtYWxpemVkX3NlZWQ7Cit9CisKKy8vIFJldHVybnMgdGhlIGZpcnN0IHZhbGlkIHJhbmRvbSBzZWVkIGFmdGVyICdzZWVkJy4gIFRoZSBiZWhhdmlvciBpcworLy8gdW5kZWZpbmVkIGlmICdzZWVkJyBpcyBpbnZhbGlkLiAgVGhlIHNlZWQgYWZ0ZXIga01heFJhbmRvbVNlZWQgaXMKKy8vIGNvbnNpZGVyZWQgdG8gYmUgMS4KK2lubGluZSBpbnQgR2V0TmV4dFJhbmRvbVNlZWQoaW50IHNlZWQpIHsKKyAgR1RFU1RfQ0hFQ0tfKDEgPD0gc2VlZCAmJiBzZWVkIDw9IGtNYXhSYW5kb21TZWVkKQorICAgICAgPDwgIkludmFsaWQgcmFuZG9tIHNlZWQgIiA8PCBzZWVkIDw8ICIgLSBtdXN0IGJlIGluIFsxLCAiCisgICAgICA8PCBrTWF4UmFuZG9tU2VlZCA8PCAiXS4iOworICBjb25zdCBpbnQgbmV4dF9zZWVkID0gc2VlZCArIDE7CisgIHJldHVybiAobmV4dF9zZWVkID4ga01heFJhbmRvbVNlZWQpID8gMSA6IG5leHRfc2VlZDsKK30KKworLy8gVGhpcyBjbGFzcyBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncyBpbiBpdHMgYyd0b3IsIGFuZAorLy8gcmVzdG9yZXMgdGhlbSBpbiBpdHMgZCd0b3IuCitjbGFzcyBHVGVzdEZsYWdTYXZlciB7CisgcHVibGljOgorICAvLyBUaGUgYyd0b3IuCisgIEdUZXN0RmxhZ1NhdmVyKCkgeworICAgIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXyA9IEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOworICAgIGJyZWFrX29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKTsKKyAgICBjYXRjaF9leGNlcHRpb25zXyA9IEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyk7CisgICAgY29sb3JfID0gR1RFU1RfRkxBRyhjb2xvcik7CisgICAgZGVhdGhfdGVzdF9zdHlsZV8gPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpOworICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmtfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKKyAgICBmaWx0ZXJfID0gR1RFU1RfRkxBRyhmaWx0ZXIpOworICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0XyA9IEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpOworICAgIGxpc3RfdGVzdHNfID0gR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKTsKKyAgICBvdXRwdXRfID0gR1RFU1RfRkxBRyhvdXRwdXQpOworICAgIHByaW50X3RpbWVfID0gR1RFU1RfRkxBRyhwcmludF90aW1lKTsKKyAgICByYW5kb21fc2VlZF8gPSBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKKyAgICByZXBlYXRfID0gR1RFU1RfRkxBRyhyZXBlYXQpOworICAgIHNodWZmbGVfID0gR1RFU1RfRkxBRyhzaHVmZmxlKTsKKyAgICBzdGFja190cmFjZV9kZXB0aF8gPSBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKTsKKyAgICBzdHJlYW1fcmVzdWx0X3RvXyA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7CisgICAgdGhyb3dfb25fZmFpbHVyZV8gPSBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpOworICB9CisKKyAgLy8gVGhlIGQndG9yIGlzIG5vdCB2aXJ0dWFsLiAgRE8gTk9UIElOSEVSSVQgRlJPTSBUSElTIENMQVNTLgorICB+R1Rlc3RGbGFnU2F2ZXIoKSB7CisgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187CisgICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IGJyZWFrX29uX2ZhaWx1cmVfOworICAgIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBjYXRjaF9leGNlcHRpb25zXzsKKyAgICBHVEVTVF9GTEFHKGNvbG9yKSA9IGNvbG9yXzsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gZGVhdGhfdGVzdF9zdHlsZV87CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IGRlYXRoX3Rlc3RfdXNlX2ZvcmtfOworICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9IGZpbHRlcl87CisgICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgPSBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF87CisgICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IGxpc3RfdGVzdHNfOworICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9IG91dHB1dF87CisgICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IHByaW50X3RpbWVfOworICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gcmFuZG9tX3NlZWRfOworICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IHJlcGVhdF87CisgICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IHNodWZmbGVfOworICAgIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID0gc3RhY2tfdHJhY2VfZGVwdGhfOworICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSBzdHJlYW1fcmVzdWx0X3RvXzsKKyAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdGhyb3dfb25fZmFpbHVyZV87CisgIH0KKworIHByaXZhdGU6CisgIC8vIEZpZWxkcyBmb3Igc2F2aW5nIHRoZSBvcmlnaW5hbCB2YWx1ZXMgb2YgZmxhZ3MuCisgIGJvb2wgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOworICBib29sIGJyZWFrX29uX2ZhaWx1cmVfOworICBib29sIGNhdGNoX2V4Y2VwdGlvbnNfOworICBzdGQ6OnN0cmluZyBjb2xvcl87CisgIHN0ZDo6c3RyaW5nIGRlYXRoX3Rlc3Rfc3R5bGVfOworICBib29sIGRlYXRoX3Rlc3RfdXNlX2ZvcmtfOworICBzdGQ6OnN0cmluZyBmaWx0ZXJfOworICBzdGQ6OnN0cmluZyBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF87CisgIGJvb2wgbGlzdF90ZXN0c187CisgIHN0ZDo6c3RyaW5nIG91dHB1dF87CisgIGJvb2wgcHJpbnRfdGltZV87CisgIGJvb2wgcHJldHR5XzsKKyAgaW50ZXJuYWw6OkludDMyIHJhbmRvbV9zZWVkXzsKKyAgaW50ZXJuYWw6OkludDMyIHJlcGVhdF87CisgIGJvb2wgc2h1ZmZsZV87CisgIGludGVybmFsOjpJbnQzMiBzdGFja190cmFjZV9kZXB0aF87CisgIHN0ZDo6c3RyaW5nIHN0cmVhbV9yZXN1bHRfdG9fOworICBib29sIHRocm93X29uX2ZhaWx1cmVfOworfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gVGhlIG91dHB1dCBidWZmZXIgc3RyIG11c3QgY29udGFpbnQgYXQgbGVhc3QgMzIgY2hhcmFjdGVycy4KKy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLgorR1RFU1RfQVBJXyBjaGFyKiBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQsIGNoYXIqIHN0cik7CisKKy8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKKy8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKKy8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgorLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKKy8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZworLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KKy8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZworLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCisvLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKTsKKworLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQorLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCisvLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90CisvLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgordm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKKworLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50CisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCisvLyBidXQgaW5jb25zaXN0ZW50IChlLmcuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKKy8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKKy8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKKy8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgorR1RFU1RfQVBJXyBib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7CisKKy8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKKy8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yIGFuZAorLy8gYW5kIGFib3J0cy4KK0dURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogZW52X3ZhciwgSW50MzIgZGVmYXVsdF92YWwpOworCisvLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCisvLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKKy8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0CisvLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgorR1RFU1RfQVBJXyBib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKAorICAgIGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpOworCisvLyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBjb250YWluZXIgdGhhdCBzYXRpc2Z5CisvLyB0aGUgZ2l2ZW4gcHJlZGljYXRlLgordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgUHJlZGljYXRlPgoraW5saW5lIGludCBDb3VudElmKGNvbnN0IENvbnRhaW5lciYgYywgUHJlZGljYXRlIHByZWRpY2F0ZSkgeworICAvLyBJbXBsZW1lbnRlZCBhcyBhbiBleHBsaWNpdCBsb29wIHNpbmNlIHN0ZDo6Y291bnRfaWYoKSBpbiBsaWJDc3RkIG9uCisgIC8vIFNvbGFyaXMgaGFzIGEgbm9uLXN0YW5kYXJkIHNpZ25hdHVyZS4KKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYy5iZWdpbigpOyBpdCAhPSBjLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKHByZWRpY2F0ZSgqaXQpKQorICAgICAgKytjb3VudDsKKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKy8vIEFwcGxpZXMgYSBmdW5jdGlvbi9mdW5jdG9yIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLgordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgRnVuY3Rvcj4KK3ZvaWQgRm9yRWFjaChjb25zdCBDb250YWluZXImIGMsIEZ1bmN0b3IgZnVuY3RvcikgeworICBzdGQ6OmZvcl9lYWNoKGMuYmVnaW4oKSwgYy5lbmQoKSwgZnVuY3Rvcik7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggZWxlbWVudCBvZiB0aGUgdmVjdG9yLCBvciBkZWZhdWx0X3ZhbHVlIGlmIGkgaXMgbm90CisvLyBpbiByYW5nZSBbMCwgdi5zaXplKCkpLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+CitpbmxpbmUgRSBHZXRFbGVtZW50T3IoY29uc3Qgc3RkOjp2ZWN0b3I8RT4mIHYsIGludCBpLCBFIGRlZmF1bHRfdmFsdWUpIHsKKyAgcmV0dXJuIChpIDwgMCB8fCBpID49IHN0YXRpY19jYXN0PGludD4odi5zaXplKCkpKSA/IGRlZmF1bHRfdmFsdWUgOiB2W2ldOworfQorCisvLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIGEgcmFuZ2Ugb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgorLy8gJ2JlZ2luJyBhbmQgJ2VuZCcgYXJlIGVsZW1lbnQgaW5kaWNlcyBhcyBhbiBTVEwtc3R5bGUgcmFuZ2U7CisvLyBpLmUuIFtiZWdpbiwgZW5kKSBhcmUgc2h1ZmZsZWQsIHdoZXJlICdlbmQnID09IHNpemUoKSBtZWFucyB0bworLy8gc2h1ZmZsZSB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK3ZvaWQgU2h1ZmZsZVJhbmdlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgaW50IGJlZ2luLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKKyAgY29uc3QgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSk7CisgIEdURVNUX0NIRUNLXygwIDw9IGJlZ2luICYmIGJlZ2luIDw9IHNpemUpCisgICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0ICIgPDwgYmVnaW4gPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbMCwgIgorICAgICAgPDwgc2l6ZSA8PCAiXS4iOworICBHVEVTVF9DSEVDS18oYmVnaW4gPD0gZW5kICYmIGVuZCA8PSBzaXplKQorICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggIiA8PCBlbmQgPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbIgorICAgICAgPDwgYmVnaW4gPDwgIiwgIiA8PCBzaXplIDw8ICJdLiI7CisKKyAgLy8gRmlzaGVyLVlhdGVzIHNodWZmbGUsIGZyb20KKyAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZQorICBmb3IgKGludCByYW5nZV93aWR0aCA9IGVuZCAtIGJlZ2luOyByYW5nZV93aWR0aCA+PSAyOyByYW5nZV93aWR0aC0tKSB7CisgICAgY29uc3QgaW50IGxhc3RfaW5fcmFuZ2UgPSBiZWdpbiArIHJhbmdlX3dpZHRoIC0gMTsKKyAgICBjb25zdCBpbnQgc2VsZWN0ZWQgPSBiZWdpbiArIHJhbmRvbS0+R2VuZXJhdGUocmFuZ2Vfd2lkdGgpOworICAgIHN0ZDo6c3dhcCgoKnYpW3NlbGVjdGVkXSwgKCp2KVtsYXN0X2luX3JhbmdlXSk7CisgIH0KK30KKworLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK2lubGluZSB2b2lkIFNodWZmbGUoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tLCBzdGQ6OnZlY3RvcjxFPiogdikgeworICBTaHVmZmxlUmFuZ2UocmFuZG9tLCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSksIHYpOworfQorCisvLyBBIGZ1bmN0aW9uIGZvciBkZWxldGluZyBhbiBvYmplY3QuICBIYW5keSBmb3IgYmVpbmcgdXNlZCBhcyBhCisvLyBmdW5jdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBEZWxldGUoVCogeCkgeworICBkZWxldGUgeDsKK30KKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIGtleSBvZiBhIFRlc3RQcm9wZXJ0eSBhZ2FpbnN0IGEga25vd24ga2V5LgorLy8KKy8vIFRlc3RQcm9wZXJ0eUtleUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdFByb3BlcnR5S2V5SXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRlc3RQcm9wZXJ0eUtleUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBUZXN0UHJvcGVydHlLZXlJcyhjb25zdCBjaGFyKiBrZXkpCisgICAgICA6IGtleV8oa2V5KSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0IHByb3BlcnR5IG1hdGNoZXMgb24ga2V5Xy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3Byb3BlcnR5LmtleSgpID09IGtleV87CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGtleV87Cit9OworCisvLyBDbGFzcyBVbml0VGVzdE9wdGlvbnMuCisvLworLy8gVGhpcyBjbGFzcyBjb250YWlucyBmdW5jdGlvbnMgZm9yIHByb2Nlc3Npbmcgb3B0aW9ucyB0aGUgdXNlcgorLy8gc3BlY2lmaWVzIHdoZW4gcnVubmluZyB0aGUgdGVzdHMuICBJdCBoYXMgb25seSBzdGF0aWMgbWVtYmVycy4KKy8vCisvLyBJbiBtb3N0IGNhc2VzLCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhbiBvcHRpb24gdXNpbmcgZWl0aGVyIGFuCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhIGNvbW1hbmQgbGluZSBmbGFnLiAgRS5nLiB5b3UgY2FuIHNldCB0aGUKKy8vIHRlc3QgZmlsdGVyIHVzaW5nIGVpdGhlciBHVEVTVF9GSUxURVIgb3IgLS1ndGVzdF9maWx0ZXIuICBJZiBib3RoCisvLyB0aGUgdmFyaWFibGUgYW5kIHRoZSBmbGFnIGFyZSBwcmVzZW50LCB0aGUgbGF0dGVyIG92ZXJyaWRlcyB0aGUKKy8vIGZvcm1lci4KK2NsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RPcHRpb25zIHsKKyBwdWJsaWM6CisgIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCisKKyAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldE91dHB1dEZvcm1hdCgpOworCisgIC8vIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBvdXRwdXQgZmlsZSwgb3IgdGhlCisgIC8vIGRlZmF1bHQgKHRlc3RfZGV0YWlsLnhtbCBpbiB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3RvcnkpIGlmCisgIC8vIG5vbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7CisKKyAgLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9maWx0ZXIgZmxhZy4KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB3aWxkY2FyZCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHN0cmluZy4gIFRoZQorICAvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgorICAvLworICAvLyBUaGlzIHJlY3Vyc2l2ZSBhbGdvcml0aG0gaXNuJ3QgdmVyeSBlZmZpY2llbnQsIGJ1dCBpcyBjbGVhciBhbmQKKyAgLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KKyAgc3RhdGljIGJvb2wgUGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCisgIC8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCisgIHN0YXRpYyBib29sIEZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIEZ1bmN0aW9uIGZvciBzdXBwb3J0aW5nIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb24gZmxhZy4KKworICAvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKKyAgLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KKyAgc3RhdGljIGludCBHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmICJuYW1lIiBtYXRjaGVzIHRoZSAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYi1zdHlsZQorICAvLyBmaWx0ZXJzIGluICJmaWx0ZXIiLgorICBzdGF0aWMgYm9vbCBNYXRjaGVzRmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpOworfTsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKKy8vIGlzIHByZXNlbnQuICBVc2VkIGJ5IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0RmlsZS4KK0dURVNUX0FQSV8gRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCk7CisKKy8vIFRoZSByb2xlIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgT1Mgc3RhY2sgdHJhY2UgYXMgYSBzdHJpbmcuCitjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KKyAgdmlydHVhbCB+T3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLiAgUGFyYW1ldGVyczoKKyAgLy8KKyAgLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAorICAvLyAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UuCisgIC8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50CisgIC8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgorICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCkgPSAwOworCisgIC8vIFVwb25MZWF2aW5nR1Rlc3QoKSBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBHb29nbGUgVGVzdCBjYWxscworICAvLyB1c2VyIGNvZGUuIEl0IHNhdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhY2sgdGhhdAorICAvLyBDdXJyZW50U3RhY2tUcmFjZSgpIHdpbGwgdXNlIHRvIGZpbmQgYW5kIGhpZGUgR29vZ2xlIFRlc3Qgc3RhY2sgZnJhbWVzLgorICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpID0gMDsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKTsKK307CisKKy8vIEEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIGludGVyZmFjZS4KK2NsYXNzIE9zU3RhY2tUcmFjZUdldHRlciA6IHB1YmxpYyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgT3NTdGFja1RyYWNlR2V0dGVyKCkgOiBjYWxsZXJfZnJhbWVfKE5VTEwpIHt9CisKKyAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCkgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBUaGlzIHN0cmluZyBpcyBpbnNlcnRlZCBpbiBwbGFjZSBvZiBzdGFjayBmcmFtZXMgdGhhdCBhcmUgcGFydCBvZgorICAvLyBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uLgorICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0VsaWRlZEZyYW1lc01hcmtlcjsKKworIHByaXZhdGU6CisgIE11dGV4IG11dGV4XzsgIC8vIHByb3RlY3RzIGFsbCBpbnRlcm5hbCBzdGF0ZQorCisgIC8vIFdlIHNhdmUgdGhlIHN0YWNrIGZyYW1lIGJlbG93IHRoZSBmcmFtZSB0aGF0IGNhbGxzIHVzZXIgY29kZS4KKyAgLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBpbW1lZGlhdGVseSBiZWxvdworICAvLyB0aGUgdXNlciBjb2RlIGNoYW5nZXMgYmV0d2VlbiB0aGUgY2FsbCB0byBVcG9uTGVhdmluZ0dUZXN0KCkKKyAgLy8gYW5kIGFueSBjYWxscyB0byBDdXJyZW50U3RhY2tUcmFjZSgpIGZyb20gd2l0aGluIHRoZSB1c2VyIGNvZGUuCisgIHZvaWQqIGNhbGxlcl9mcmFtZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhPc1N0YWNrVHJhY2VHZXR0ZXIpOworfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBHb29nbGUgVGVzdCB0cmFjZSBwb2ludC4KK3N0cnVjdCBUcmFjZUluZm8geworICBjb25zdCBjaGFyKiBmaWxlOworICBpbnQgbGluZTsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKK307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbiBVbml0VGVzdEltcGwuCisvLyBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7CisgIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFJlcG9ydHMgdGhlIHRlc3QgcGFydAorICAvLyByZXN1bHQgaW4gdGhlIGN1cnJlbnQgdGVzdC4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBwZXIgdGhyZWFkIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbgorLy8gVW5pdFRlc3RJbXBsLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsKKyAgLy8gSW1wbGVtZW50cyB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZS4gVGhlIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgLy8gZGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIG9mICp1bml0X3Rlc3RfLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyBwcml2YXRlOgorICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCisvLyBUaGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdFRlc3QgY2xhc3MuICBXZSBkb24ndCBwcm90ZWN0CisvLyB0aGUgbWV0aG9kcyB1bmRlciBhIG11dGV4LCBhcyB0aGlzIGNsYXNzIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IGEKKy8vIHVzZXIgYW5kIHRoZSBVbml0VGVzdCBjbGFzcyB0aGF0IGRlbGVnYXRlcyB3b3JrIHRvIHRoaXMgY2xhc3MgZG9lcworLy8gcHJvcGVyIGxvY2tpbmcuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0SW1wbCB7CisgcHVibGljOgorICBleHBsaWNpdCBVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCk7CisgIHZpcnR1YWwgflVuaXRUZXN0SW1wbCgpOworCisgIC8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gcmVnaXN0ZXIgeW91ciBvd24gVGVzdFBhcnRSZXN1bHRSZXBvcnRlci4KKyAgLy8gWW91IGNhbiByZWdpc3RlciB5b3VyIG93biByZXBvdGVyIHRvIGxpc3RlbiBlaXRoZXIgb25seSBmb3IgdGVzdCByZXN1bHRzCisgIC8vIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIGZvciByZXN1bHRzIGZyb20gYWxsIHRocmVhZHMuCisgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggcGVyLXRocmVhZCB0ZXN0IHJlc3VsdCByZXBvdGVyIGp1c3QgcGFzc2VzIGEgbmV3CisgIC8vIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBnbG9iYWwgdGVzdCByZXN1bHQgcmVwb3J0ZXIsIHdoaWNoIHJlZ2lzdGVycyB0aGUKKyAgLy8gdGVzdCBwYXJ0IHJlc3VsdCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuCisKKyAgLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgdm9pZCBTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOworCisgIC8vIFJldHVybnMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKKworICAvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIHZvaWQgU2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgorICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KKyAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKyAgLy8gdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgorICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCisgIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gVU5JWCBlcG9jaC4KKyAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0X3RpbWVzdGFtcF87IH0KKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKyAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeworICAgIHJldHVybiBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgPiAwIHx8IGFkX2hvY190ZXN0X3Jlc3VsdCgpLT5GYWlsZWQoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0IHsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7CisgICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2Nhc2VzX1tpXTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBUZXN0Q2FzZSogR2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKSB7CisgICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baW5kZXhdOworICB9CisKKyAgLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycygpIHsgcmV0dXJuICZsaXN0ZW5lcnNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorICAvLyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0IGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKyAgVGVzdFJlc3VsdCogY3VycmVudF90ZXN0X3Jlc3VsdCgpOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdC4KKyAgY29uc3QgVGVzdFJlc3VsdCogYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJmFkX2hvY190ZXN0X3Jlc3VsdF87IH0KKworICAvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisgIC8vCisgIC8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlcgorICAvLyBhcmUgdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlCisgIC8vIGlucHV0IHRoZSBjdXJyZW50IGdldHRlci4KKyAgdm9pZCBzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBpZiBpdCBpcyBub3QgTlVMTDsKKyAgLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKyAgLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXIoKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorICAvLworICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorICAvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorICAvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKyAgLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisgIC8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisgIC8vIHRyYWNlIGJ1dCBCYXIoKSBhbmQgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0LgorICBzdGQ6OnN0cmluZyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKGludCBza2lwX2NvdW50KSBHVEVTVF9OT19JTkxJTkVfOworCisgIC8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0CisgIC8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0eXBlX3BhcmFtOiAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorICAvLyAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIC8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisgIFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpOworCisgIC8vIEFkZHMgYSBUZXN0SW5mbyB0byB0aGUgdW5pdCB0ZXN0LgorICAvLworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZXN0X2luZm86ICAgIHRoZSBUZXN0SW5mbyBvYmplY3QKKyAgdm9pZCBBZGRUZXN0SW5mbyhUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzLCB3ZSBuZWVkIHRvCisgICAgLy8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIHRlc3QgcHJvZ3JhbQorICAgIC8vIHdhcyBmaXJzdCBpbnZva2VkLiAgV2UgY2Fubm90IGRvIHRoaXMgaW4gUlVOX0FMTF9URVNUUygpLCBhcworICAgIC8vIHRoZSB1c2VyIG1heSBoYXZlIGNoYW5nZWQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBjYWxsaW5nCisgICAgLy8gUlVOX0FMTF9URVNUUygpLiAgVGhlcmVmb3JlIHdlIGNhcHR1cmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluCisgICAgLy8gQWRkVGVzdEluZm8oKSwgd2hpY2ggaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGEgVEVTVCBvciBURVNUX0YKKyAgICAvLyBiZWZvcmUgbWFpbigpIGlzIHJlYWNoZWQuCisgICAgaWYgKG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpIHsKKyAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5TZXQoRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSk7CisgICAgICBHVEVTVF9DSEVDS18oIW9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpCisgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIjsKKyAgICB9CisKKyAgICBHZXRUZXN0Q2FzZSh0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCksCisgICAgICAgICAgICAgICAgdGVzdF9pbmZvLT50eXBlX3BhcmFtKCksCisgICAgICAgICAgICAgICAgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgIHRlYXJfZG93bl90YyktPkFkZFRlc3RJbmZvKHRlc3RfaW5mbyk7CisgIH0KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKSB7CisgICAgcmV0dXJuIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV87CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBTZXRzIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZy4KKyAgdm9pZCBzZXRfY3VycmVudF90ZXN0X2Nhc2UoVGVzdENhc2UqIGFfY3VycmVudF90ZXN0X2Nhc2UpIHsKKyAgICBjdXJyZW50X3Rlc3RfY2FzZV8gPSBhX2N1cnJlbnRfdGVzdF9jYXNlOworICB9CisKKyAgLy8gU2V0cyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuICBJZgorICAvLyBjdXJyZW50X3Rlc3RfaW5mbyBpcyBOVUxMLCB0aGUgYXNzZXJ0aW9uIHJlc3VsdHMgd2lsbCBiZSBzdG9yZWQgaW4KKyAgLy8gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KKyAgdm9pZCBzZXRfY3VycmVudF90ZXN0X2luZm8oVGVzdEluZm8qIGFfY3VycmVudF90ZXN0X2luZm8pIHsKKyAgICBjdXJyZW50X3Rlc3RfaW5mb18gPSBhX2N1cnJlbnRfdGVzdF9pbmZvOworICB9CisKKyAgLy8gUmVnaXN0ZXJzIGFsbCBwYXJhbWV0ZXJpemVkIHRlc3RzIGRlZmluZWQgdXNpbmcgVEVTVF9QIGFuZAorICAvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCwgY3JlYXRpbmcgcmVndWxhciB0ZXN0cyBmb3IgZWFjaCB0ZXN0L3BhcmFtZXRlcgorICAvLyBjb21iaW5hdGlvbi4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZTsgaXQgaGFzIGd1YXJkcworICAvLyBwcm90ZWN0aW5nIGZyb20gcmVnaXN0ZXJpbmcgdGhlIHRlc3RzIG1vcmUgdGhlbiBvbmNlLiAgSWYKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZGlzYWJsZWQsIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzIGlzCisgIC8vIHByZXNlbnQgYnV0IGRvZXMgbm90aGluZy4KKyAgdm9pZCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOworCisgIC8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisgIC8vIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgYXJlIHN1Y2Nlc3NmdWwuICBJZiBhbnkgZXhjZXB0aW9uIGlzCisgIC8vIHRocm93biBkdXJpbmcgYSB0ZXN0LCB0aGlzIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dAorICAvLyB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBzdGlsbCBiZSBydW4uCisgIGJvb2wgUnVuQWxsVGVzdHMoKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzLCBleGNlcHQgdGhlIGFkIGhvYyB0ZXN0cy4KKyAgdm9pZCBDbGVhck5vbkFkSG9jVGVzdFJlc3VsdCgpIHsKKyAgICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZTo6Q2xlYXJUZXN0Q2FzZVJlc3VsdCk7CisgIH0KKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWQtaG9jIHRlc3QgYXNzZXJ0aW9ucy4KKyAgdm9pZCBDbGVhckFkSG9jVGVzdFJlc3VsdCgpIHsKKyAgICBhZF9ob2NfdGVzdF9yZXN1bHRfLkNsZWFyKCk7CisgIH0KKworICBlbnVtIFJlYWN0aW9uVG9TaGFyZGluZyB7CisgICAgSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsCisgICAgSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MCisgIH07CisKKyAgLy8gTWF0Y2hlcyB0aGUgZnVsbCBuYW1lIG9mIGVhY2ggdGVzdCBhZ2FpbnN0IHRoZSB1c2VyLXNwZWNpZmllZAorICAvLyBmaWx0ZXIgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIHJ1biwgdGhlbiByZWNvcmRzIHRoZQorICAvLyByZXN1bHQgaW4gZWFjaCBUZXN0Q2FzZSBhbmQgVGVzdEluZm8gb2JqZWN0LgorICAvLyBJZiBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCwgZnVydGhlciBmaWx0ZXJzIHRlc3RzCisgIC8vIGJhc2VkIG9uIHNoYXJkaW5nIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQuCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCBGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpOworCisgIC8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KKyAgdm9pZCBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOworCisgIGNvbnN0IFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9jYXNlXzsgfQorICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSB7IHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb187IH0KKyAgY29uc3QgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdmVjdG9yIG9mIGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gYmUgc2V0LXVwL3Rvcm4tZG93bgorICAvLyBiZWZvcmUvYWZ0ZXIgdGhlIHRlc3RzIGFyZSBydW4uCisgIHN0ZDo6dmVjdG9yPEVudmlyb25tZW50Kj4mIGVudmlyb25tZW50cygpIHsgcmV0dXJuIGVudmlyb25tZW50c187IH0KKworICAvLyBHZXR0ZXJzIGZvciB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSB7CisgICAgcmV0dXJuICooZ3Rlc3RfdHJhY2Vfc3RhY2tfLnBvaW50ZXIoKSk7CisgIH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIGd0ZXN0X3RyYWNlX3N0YWNrXy5nZXQoKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgdm9pZCBJbml0RGVhdGhUZXN0U3VicHJvY2Vzc0NvbnRyb2xJbmZvKCkgeworICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLnJlc2V0KFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkpOworICB9CisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdAorICAvLyBmbGFnLCBvciBOVUxMIGlmIHRoYXQgZmxhZyB3YXMgbm90IHNwZWNpZmllZC4KKyAgLy8gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgb25seSBpbiBhIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKyAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBhIGNhbGwgdG8gSW5pdEdvb2dsZVRlc3QuCisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCk7CisgIH0KKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkZWF0aCB0ZXN0IGZhY3RvcnkuCisgIGludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5KiBkZWF0aF90ZXN0X2ZhY3RvcnkoKSB7CisgICAgcmV0dXJuIGRlYXRoX3Rlc3RfZmFjdG9yeV8uZ2V0KCk7CisgIH0KKworICB2b2lkIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7CisKKyAgZnJpZW5kIGNsYXNzIFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5OworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBwZXJmb3JtaW5nIFhNTCBvdXRwdXQgYXMgc3BlY2lmaWVkIGJ5CisgIC8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KKyAgdm9pZCBDb25maWd1cmVYbWxPdXRwdXQoKTsKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyAgLy8gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIHRvIGEgc29ja2V0LgorICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0LgorICB2b2lkIENvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpOworI2VuZGlmCisKKyAgLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorICAvLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50LgorICB2b2lkIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKKworICAvLyBHZXRzIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IGl0ZXJhdGlvbi4KKyAgaW50IHJhbmRvbV9zZWVkKCkgY29uc3QgeyByZXR1cm4gcmFuZG9tX3NlZWRfOyB9CisKKyAgLy8gR2V0cyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIGludGVybmFsOjpSYW5kb20qIHJhbmRvbSgpIHsgcmV0dXJuICZyYW5kb21fOyB9CisKKyAgLy8gU2h1ZmZsZXMgYWxsIHRlc3QgY2FzZXMsIGFuZCB0aGUgdGVzdHMgd2l0aGluIGVhY2ggdGVzdCBjYXNlLAorICAvLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCisgIHZvaWQgU2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KKyAgdm9pZCBVbnNodWZmbGVUZXN0cygpOworCisgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudAorICAvLyBVbml0VGVzdDo6UnVuKCkgc3RhcnRzLgorICBib29sIGNhdGNoX2V4Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiBjYXRjaF9leGNlcHRpb25zXzsgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKKyAgLy8gVXNlZCBieSBVbml0VGVzdDo6UnVuKCkgdG8gY2FwdHVyZSB0aGUgc3RhdGUgb2YKKyAgLy8gR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50IGl0IHN0YXJ0cy4KKyAgdm9pZCBzZXRfY2F0Y2hfZXhjZXB0aW9ucyhib29sIHZhbHVlKSB7IGNhdGNoX2V4Y2VwdGlvbnNfID0gdmFsdWU7IH0KKworICAvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRoYXQgb3ducyB0aGlzIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgVW5pdFRlc3QqIGNvbnN0IHBhcmVudF87CisKKyAgLy8gVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKKyAgLy8gZXhlY3V0ZWQuCisgIGludGVybmFsOjpGaWxlUGF0aCBvcmlnaW5hbF93b3JraW5nX2Rpcl87CisKKyAgLy8gVGhlIGRlZmF1bHQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlcnMuCisgIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworICBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworCisgIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworCisgIC8vIFByb3RlY3RzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uCisgIGludGVybmFsOjpNdXRleCBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl9tdXRleF87CisKKyAgLy8gUG9pbnRzIHRvIChidXQgZG9lc24ndCBvd24pIHRoZSBwZXItdGhyZWFkIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIGludGVybmFsOjpUaHJlYWRMb2NhbDxUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKj4KKyAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87CisKKyAgLy8gVGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KKyAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgorICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+IGVudmlyb25tZW50c187CisKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0Q2FzZXMgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuICBJdCBvd25zIHRoZQorICAvLyBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZSo+IHRlc3RfY2FzZXNfOworCisgIC8vIFByb3ZpZGVzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHRoZSB0ZXN0IGNhc2UgbGlzdCB0byBhbGxvdworICAvLyBlYXN5IHNodWZmbGluZyBhbmQgcmVzdG9yaW5nIHRoZSB0ZXN0IGNhc2Ugb3JkZXIuICBUaGUgaS10aAorICAvLyBlbGVtZW50IG9mIHRoaXMgdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGNhc2UgaW4gdGhlCisgIC8vIHNodWZmbGVkIG9yZGVyLgorICBzdGQ6OnZlY3RvcjxpbnQ+IHRlc3RfY2FzZV9pbmRpY2VzXzsKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFBhcmFtZXRlcml6ZWRUZXN0UmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8gcmVnaXN0ZXIgdmFsdWUtcGFyYW1ldGVyaXplZAorICAvLyB0ZXN0cy4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV87CisKKyAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQgYWxyZWFkeS4KKyAgYm9vbCBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIC8vIEluZGV4IG9mIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZSByZWdpc3RlcmVkLiAgSW5pdGlhbGx5IC0xLgorICBpbnQgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfOworCisgIC8vIFRoaXMgcG9pbnRzIHRvIHRoZSBUZXN0Q2FzZSBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuICBJdAorICAvLyBjaGFuZ2VzIGFzIEdvb2dsZSBUZXN0IGdvZXMgdGhyb3VnaCBvbmUgdGVzdCBjYXNlIGFmdGVyIGFub3RoZXIuCisgIC8vIFdoZW4gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdAorICAvLyBzdG9yZXMgYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgorICBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2VfOworCisgIC8vIFRoaXMgcG9pbnRzIHRvIHRoZSBUZXN0SW5mbyBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuICBJdAorICAvLyBjaGFuZ2VzIGFzIEdvb2dsZSBUZXN0IGdvZXMgdGhyb3VnaCBvbmUgdGVzdCBhZnRlciBhbm90aGVyLiAgV2hlbgorICAvLyBubyB0ZXN0IGlzIHJ1bm5pbmcsIHRoaXMgaXMgc2V0IHRvIE5VTEwgYW5kIEdvb2dsZSBUZXN0IHN0b3JlcworICAvLyBhc3NlcnRpb24gcmVzdWx0cyBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLiAgSW5pdGlhbGx5IE5VTEwuCisgIFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mb187CisKKyAgLy8gTm9ybWFsbHksIGEgdXNlciBvbmx5IHdyaXRlcyBhc3NlcnRpb25zIGluc2lkZSBhIFRFU1Qgb3IgVEVTVF9GLAorICAvLyBvciBpbnNpZGUgYSBmdW5jdGlvbiBjYWxsZWQgYnkgYSBURVNUIG9yIFRFU1RfRi4gIFNpbmNlIEdvb2dsZQorICAvLyBUZXN0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIHRlc3QgaXMgY3VycmVudCBydW5uaW5nLCBpdCBjYW4KKyAgLy8gYXNzb2NpYXRlIHN1Y2ggYW4gYXNzZXJ0aW9uIHdpdGggdGhlIHRlc3QgaXQgYmVsb25ncyB0by4KKyAgLy8KKyAgLy8gSWYgYW4gYXNzZXJ0aW9uIGlzIGVuY291bnRlcmVkIHdoZW4gbm8gVEVTVCBvciBURVNUX0YgaXMgcnVubmluZywKKyAgLy8gR29vZ2xlIFRlc3QgYXR0cmlidXRlcyB0aGUgYXNzZXJ0aW9uIHJlc3VsdCB0byBhbiBpbWFnaW5hcnkgImFkIGhvYyIKKyAgLy8gdGVzdCwgYW5kIHJlY29yZHMgdGhlIHJlc3VsdCBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLgorICBUZXN0UmVzdWx0IGFkX2hvY190ZXN0X3Jlc3VsdF87CisKKyAgLy8gVGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzIGluc2lkZQorICAvLyBHb29nbGUgVGVzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyc187CisKKyAgLy8gVGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4gIFdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBVbml0VGVzdAorICAvLyBvYmplY3QgaXMgZGVzdHJ1Y3RlZC4gIEJ5IGRlZmF1bHQsIGFuIE9zU3RhY2tUcmFjZUdldHRlciBpcyB1c2VkLAorICAvLyBidXQgdGhlIHVzZXIgY2FuIHNldCB0aGlzIGZpZWxkIHRvIHVzZSBhIGN1c3RvbSBnZXR0ZXIgaWYgdGhhdCBpcworICAvLyBkZXNpcmVkLgorICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87CisKKyAgLy8gVHJ1ZSBpZmYgUG9zdEZsYWdQYXJzaW5nSW5pdCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgYm9vbCBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfOworCisgIC8vIFRoZSByYW5kb20gbnVtYmVyIHNlZWQgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0IHJ1bi4KKyAgaW50IHJhbmRvbV9zZWVkXzsKKworICAvLyBPdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIGludGVybmFsOjpSYW5kb20gcmFuZG9tXzsKKworICAvLyBUaGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gVU5JWCBlcG9jaC4KKyAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcF87CisKKyAgLy8gSG93IGxvbmcgdGhlIHRlc3QgdG9vayB0byBydW4sIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAvLyBUaGUgZGVjb21wb3NlZCBjb21wb25lbnRzIG9mIHRoZSBndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLAorICAvLyBwYXJzZWQgd2hlbiBSVU5fQUxMX1RFU1RTIGlzIGNhbGxlZC4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnPiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXzsKKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8aW50ZXJuYWw6OkRlYXRoVGVzdEZhY3Rvcnk+IGRlYXRoX3Rlc3RfZmFjdG9yeV87CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgLy8gQSBwZXItdGhyZWFkIHN0YWNrIG9mIHRyYWNlcyBjcmVhdGVkIGJ5IHRoZSBTQ09QRURfVFJBQ0UoKSBtYWNyby4KKyAgaW50ZXJuYWw6OlRocmVhZExvY2FsPHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4gPiBndGVzdF90cmFjZV9zdGFja187CisKKyAgLy8gVGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBSdW5BbGxUZXN0cygpCisgIC8vIHN0YXJ0cy4KKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0SW1wbCk7Cit9OyAgLy8gY2xhc3MgVW5pdFRlc3RJbXBsCisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcgdGhlIGdsb2JhbCBVbml0VGVzdAorLy8gaW1wbGVtZW50YXRpb24gb2JqZWN0LgoraW5saW5lIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCkgeworICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKTsKK30KKworI2lmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyB0aGUgc2ltcGxlIHJlZ3VsYXIKKy8vIGV4cHJlc3Npb24gbWF0Y2hlci4KK0dURVNUX0FQSV8gYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaURpZ2l0KGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc1JlcGVhdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV2hpdGVTcGFjZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV29yZENoYXIoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNWYWxpZEVzY2FwZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBBdG9tTWF0Y2hlc0NoYXIoYm9vbCBlc2NhcGVkLCBjaGFyIHBhdHRlcm4sIGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBdEhlYWQoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgYm9vbCBlc2NhcGVkLCBjaGFyIGNoLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZWdleEFueXdoZXJlKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKKy8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0LgorR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKK0dURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yLCByZWdhcmRsZXNzIG9mIHRoZQorLy8gcGxhdGZvcm0uCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworLy8gUHJvdmlkZXMgbGVhay1zYWZlIFdpbmRvd3Mga2VybmVsIGhhbmRsZSBvd25lcnNoaXAuCitjbGFzcyBBdXRvSGFuZGxlIHsKKyBwdWJsaWM6CisgIEF1dG9IYW5kbGUoKSA6IGhhbmRsZV8oSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHt9CisgIGV4cGxpY2l0IEF1dG9IYW5kbGUoSEFORExFIGhhbmRsZSkgOiBoYW5kbGVfKGhhbmRsZSkge30KKworICB+QXV0b0hhbmRsZSgpIHsgUmVzZXQoKTsgfQorCisgIEhBTkRMRSBHZXQoKSBjb25zdCB7IHJldHVybiBoYW5kbGVfOyB9CisgIHZvaWQgUmVzZXQoKSB7IFJlc2V0KElOVkFMSURfSEFORExFX1ZBTFVFKTsgfQorICB2b2lkIFJlc2V0KEhBTkRMRSBoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlICE9IGhhbmRsZV8pIHsKKyAgICAgIGlmIChoYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZV8pOworICAgICAgaGFuZGxlXyA9IGhhbmRsZTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIEhBTkRMRSBoYW5kbGVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXV0b0hhbmRsZSk7Cit9OworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBBdHRlbXB0cyB0byBwYXJzZSBhIHN0cmluZyBpbnRvIGEgcG9zaXRpdmUgaW50ZWdlciBwb2ludGVkIHRvIGJ5IHRoZQorLy8gbnVtYmVyIHBhcmFtZXRlci4gIFJldHVybnMgdHJ1ZSBpZiB0aGF0IGlzIHBvc3NpYmxlLgorLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UgY2FuIHVzZQorLy8gaXQgaGVyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRlZ2VyPgorYm9vbCBQYXJzZU5hdHVyYWxOdW1iZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBJbnRlZ2VyKiBudW1iZXIpIHsKKyAgLy8gRmFpbCBmYXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0OworICAvLyB0aGlzIGJ5cGFzc2VzIHN0cnRvWFhYJ3MgIm9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgcGx1cworICAvLyBvciBtaW51cyBzaWduIiBzZW1hbnRpY3MsIHdoaWNoIGFyZSB1bmRlc2lyYWJsZSBoZXJlLgorICBpZiAoc3RyLmVtcHR5KCkgfHwgIUlzRGlnaXQoc3RyWzBdKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBlcnJubyA9IDA7CisKKyAgY2hhciogZW5kOworICAvLyBCaWdnZXN0Q29udmVydGlibGUgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciB0eXBlIHRoYXQgc3lzdGVtLXByb3ZpZGVkCisgIC8vIHN0cmluZy10by1udW1iZXIgY29udmVyc2lvbiByb3V0aW5lcyBjYW4gcmV0dXJuLgorCisjIGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19HTlVDX18pCisKKyAgLy8gTVNWQyBhbmQgQysrIEJ1aWxkZXIgZGVmaW5lIF9faW50NjQgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgbG9uZyBsb25nLgorICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgQmlnZ2VzdENvbnZlcnRpYmxlOworICBjb25zdCBCaWdnZXN0Q29udmVydGlibGUgcGFyc2VkID0gX3N0cnRvdWk2NChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworCisjIGVsc2UKKworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBCaWdnZXN0Q29udmVydGlibGU7ICAvLyBOT0xJTlQKKyAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IHN0cnRvdWxsKHN0ci5jX3N0cigpLCAmZW5kLCAxMCk7CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19HTlVDX18pCisKKyAgY29uc3QgYm9vbCBwYXJzZV9zdWNjZXNzID0gKmVuZCA9PSAnXDAnICYmIGVycm5vID09IDA7CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogQ29udmVydCB0aGlzIHRvIGNvbXBpbGUgdGltZSBhc3NlcnRpb24gd2hlbiBpdCBpcworICAvLyBhdmFpbGFibGUuCisgIEdURVNUX0NIRUNLXyhzaXplb2YoSW50ZWdlcikgPD0gc2l6ZW9mKHBhcnNlZCkpOworCisgIGNvbnN0IEludGVnZXIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50ZWdlcj4ocGFyc2VkKTsKKyAgaWYgKHBhcnNlX3N1Y2Nlc3MgJiYgc3RhdGljX2Nhc3Q8QmlnZ2VzdENvbnZlcnRpYmxlPihyZXN1bHQpID09IHBhcnNlZCkgeworICAgICpudW1iZXIgPSByZXN1bHQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBUZXN0UmVzdWx0IGNvbnRhaW5zIHNvbWUgcHJpdmF0ZSBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGhpZGRlbiBmcm9tCisvLyBHb29nbGUgVGVzdCB1c2VyIGJ1dCBhcmUgcmVxdWlyZWQgZm9yIHRlc3RpbmcuIFRoaXMgY2xhc3MgYWxsb3cgb3VyIHRlc3RzCisvLyB0byBhY2Nlc3MgdGhlbS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHN1cHBsaWVkIG9ubHkgZm9yIHRoZSBwdXJwb3NlIG9mIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24KKy8vIGNvbnN0cnVjdHMuIERvIG5vdCB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBUZXN0UmVzdWx0QWNjZXNzb3IgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkpIHsKKyAgICB0ZXN0X3Jlc3VsdC0+UmVjb3JkUHJvcGVydHkocHJvcGVydHkpOworICB9CisKKyAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UGFydFJlc3VsdHMoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQpIHsKKyAgICB0ZXN0X3Jlc3VsdC0+Q2xlYXJUZXN0UGFydFJlc3VsdHMoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKAorICAgICAgY29uc3QgVGVzdFJlc3VsdCYgdGVzdF9yZXN1bHQpIHsKKyAgICByZXR1cm4gdGVzdF9yZXN1bHQudGVzdF9wYXJ0X3Jlc3VsdHMoKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LXBvcnQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOGYyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjCkBAIC0wLDAgKzEsODA1IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIEZvciBUZXJtaW5hdGVQcm9jZXNzKCkKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8aW8uaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjaWYgR1RFU1RfT1NfTUFDCisjIGluY2x1ZGUgPG1hY2gvbWFjaF9pbml0Lmg+CisjIGluY2x1ZGUgPG1hY2gvdGFzay5oPgorIyBpbmNsdWRlIDxtYWNoL3ZtX21hcC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2lmIEdURVNUX09TX1FOWAorIyBpbmNsdWRlIDxkZXZjdGwuaD4KKyMgaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19RTlgKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorLy8gTVNWQyBhbmQgQysrQnVpbGRlciBkbyBub3QgcHJvdmlkZSBhIGRlZmluaXRpb24gb2YgU1RERVJSX0ZJTEVOTy4KK2NvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gMTsKK2NvbnN0IGludCBrU3RkRXJyRmlsZW5vID0gMjsKKyNlbHNlCitjb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IFNURE9VVF9GSUxFTk87Citjb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IFNUREVSUl9GSUxFTk87CisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNpZiBHVEVTVF9PU19NQUMKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0CisvLyB3ZSBjYW5ub3QgZGV0ZWN0IGl0Lgorc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworICBjb25zdCB0YXNrX3QgdGFzayA9IG1hY2hfdGFza19zZWxmKCk7CisgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgdGhyZWFkX2NvdW50OworICB0aHJlYWRfYWN0X2FycmF5X3QgdGhyZWFkX2xpc3Q7CisgIGNvbnN0IGtlcm5fcmV0dXJuX3Qgc3RhdHVzID0gdGFza190aHJlYWRzKHRhc2ssICZ0aHJlYWRfbGlzdCwgJnRocmVhZF9jb3VudCk7CisgIGlmIChzdGF0dXMgPT0gS0VSTl9TVUNDRVNTKSB7CisgICAgLy8gdGFza190aHJlYWRzIGFsbG9jYXRlcyByZXNvdXJjZXMgaW4gdGhyZWFkX2xpc3QgYW5kIHdlIG5lZWQgdG8gZnJlZSB0aGVtCisgICAgLy8gdG8gYXZvaWQgbGVha3MuCisgICAgdm1fZGVhbGxvY2F0ZSh0YXNrLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2bV9hZGRyZXNzX3Q+KHRocmVhZF9saXN0KSwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0aHJlYWRfdCkgKiB0aHJlYWRfY291bnQpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHRocmVhZF9jb3VudCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2VsaWYgR1RFU1RfT1NfUU5YCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgY29uc3QgaW50IGZkID0gb3BlbigiL3Byb2Mvc2VsZi9hcyIsIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHByb2Nmc19pbmZvIHByb2Nlc3NfaW5mbzsKKyAgY29uc3QgaW50IHN0YXR1cyA9CisgICAgICBkZXZjdGwoZmQsIERDTURfUFJPQ19JTkZPLCAmcHJvY2Vzc19pbmZvLCBzaXplb2YocHJvY2Vzc19pbmZvKSwgTlVMTCk7CisgIGNsb3NlKGZkKTsKKyAgaWYgKHN0YXR1cyA9PSBFT0spIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pihwcm9jZXNzX2luZm8ubnVtX3RocmVhZHMpOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKKyNlbHNlCisKK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgLy8gVGhlcmUncyBubyBwb3J0YWJsZSB3YXkgdG8gZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcywgc28gd2UganVzdAorICAvLyByZXR1cm4gMCB0byBpbmRpY2F0ZSB0aGF0IHdlIGNhbm5vdCBkZXRlY3QgaXQuCisgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX01BQworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisvLyBJbXBsZW1lbnRzIFJFLiAgQ3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworUkU6On5SRSgpIHsKKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIC8vIHJlZ2ZyZWUnaW5nIGFuIGludmFsaWQgcmVnZXggbWlnaHQgY3Jhc2ggYmVjYXVzZSB0aGUgY29udGVudAorICAgIC8vIG9mIHRoZSByZWdleCBpcyB1bmRlZmluZWQuIFNpbmNlIHRoZSByZWdleCdzIGFyZSBlc3NlbnRpYWxseQorICAgIC8vIHRoZSBzYW1lLCBvbmUgY2Fubm90IGJlIHZhbGlkIChvciBpbnZhbGlkKSB3aXRob3V0IHRoZSBvdGhlcgorICAgIC8vIGJlaW5nIHNvIHRvby4KKyAgICByZWdmcmVlKCZwYXJ0aWFsX3JlZ2V4Xyk7CisgICAgcmVnZnJlZSgmZnVsbF9yZWdleF8pOworICB9CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KK2Jvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOworCisgIHJlZ21hdGNoX3QgbWF0Y2g7CisgIHJldHVybiByZWdleGVjKCZyZS5mdWxsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7CisKKyAgcmVnbWF0Y2hfdCBtYXRjaDsKKyAgcmV0dXJuIHJlZ2V4ZWMoJnJlLnBhcnRpYWxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKK30KKworLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgordm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgeworICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOworCisgIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQorICAvLyBmdWxsIG1hdGNoLgorICBjb25zdCBzaXplX3QgZnVsbF9yZWdleF9sZW4gPSBzdHJsZW4ocmVnZXgpICsgMTA7CisgIGNoYXIqIGNvbnN0IGZ1bGxfcGF0dGVybiA9IG5ldyBjaGFyW2Z1bGxfcmVnZXhfbGVuXTsKKworICBzbnByaW50ZihmdWxsX3BhdHRlcm4sIGZ1bGxfcmVnZXhfbGVuLCAiXiglcykkIiwgcmVnZXgpOworICBpc192YWxpZF8gPSByZWdjb21wKCZmdWxsX3JlZ2V4XywgZnVsbF9wYXR0ZXJuLCBSRUdfRVhURU5ERUQpID09IDA7CisgIC8vIFdlIHdhbnQgdG8gY2FsbCByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgLi4uKSBldmVuIGlmIHRoZQorICAvLyBwcmV2aW91cyBleHByZXNzaW9uIHJldHVybnMgZmFsc2UuICBPdGhlcndpc2UgcGFydGlhbF9yZWdleF8gbWF5CisgIC8vIG5vdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBjYW4gbWF5IGNhdXNlIHRyb3VibGUgd2hlbiBpdCdzCisgIC8vIGZyZWVkLgorICAvLworICAvLyBTb21lIGltcGxlbWVudGF0aW9uIG9mIFBPU0lYIHJlZ2V4IChlLmcuIG9uIGF0IGxlYXN0IHNvbWUKKyAgLy8gdmVyc2lvbnMgb2YgQ3lnd2luKSBkb2Vzbid0IGFjY2VwdCB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgdmFsaWQKKyAgLy8gcmVnZXguICBXZSBjaGFuZ2UgaXQgdG8gYW4gZXF1aXZhbGVudCBmb3JtICIoKSIgdG8gYmUgc2FmZS4KKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IHBhcnRpYWxfcmVnZXggPSAoKnJlZ2V4ID09ICdcMCcpID8gIigpIiA6IHJlZ2V4OworICAgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCBwYXJ0aWFsX3JlZ2V4LCBSRUdfRVhURU5ERUQpID09IDA7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXNfdmFsaWRfKQorICAgICAgPDwgIlJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXgKKyAgICAgIDw8ICJcIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIjsKKworICBkZWxldGVbXSBmdWxsX3BhdHRlcm47Cit9CisKKyNlbGlmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYXBwZWFycyBhbnl3aGVyZSBpbiBzdHIgKGV4Y2x1ZGluZyB0aGUKKy8vIHRlcm1pbmF0aW5nICdcMCcgY2hhcmFjdGVyKS4KK2Jvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIGNoICE9ICdcMCcgJiYgc3RyY2hyKHN0ciwgY2gpICE9IE5VTEw7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3NpZmljYXRpb24uICBVbmxpa2UKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiwgdGhlc2UgYXJlbid0IGFmZmVjdGVkIGJ5IHRoZQorLy8gY3VycmVudCBsb2NhbGUuCitib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9Citib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKSB7CisgIHJldHVybiBJc0luU2V0KGNoLCAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiIpOworfQorYm9vbCBJc1JlcGVhdChjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiPyorIik7IH0KK2Jvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIiBcZlxuXHJcdFx2Iik7IH0KK2Jvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpIHsKKyAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKKyAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAnXyc7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgIlxcYyIgaXMgYSBzdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlLgorYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgeworICByZXR1cm4gKElzQXNjaWlQdW5jdChjKSB8fCBJc0luU2V0KGMsICJkRGZucnNTdHZ3VyIpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXRvbSAoc3BlY2lmaWVkIGJ5IGVzY2FwZWQgYW5kIHBhdHRlcm4pCisvLyBtYXRjaGVzIGNoLiAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdGhlIGF0b20gaXMgaW52YWxpZC4KK2Jvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuX2NoYXIsIGNoYXIgY2gpIHsKKyAgaWYgKGVzY2FwZWQpIHsgIC8vICJcXHAiIHdoZXJlIHAgaXMgcGF0dGVybl9jaGFyLgorICAgIHN3aXRjaCAocGF0dGVybl9jaGFyKSB7CisgICAgICBjYXNlICdkJzogcmV0dXJuIElzQXNjaWlEaWdpdChjaCk7CisgICAgICBjYXNlICdEJzogcmV0dXJuICFJc0FzY2lpRGlnaXQoY2gpOworICAgICAgY2FzZSAnZic6IHJldHVybiBjaCA9PSAnXGYnOworICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOworICAgICAgY2FzZSAncic6IHJldHVybiBjaCA9PSAnXHInOworICAgICAgY2FzZSAncyc6IHJldHVybiBJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICdTJzogcmV0dXJuICFJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICd0JzogcmV0dXJuIGNoID09ICdcdCc7CisgICAgICBjYXNlICd2JzogcmV0dXJuIGNoID09ICdcdic7CisgICAgICBjYXNlICd3JzogcmV0dXJuIElzQXNjaWlXb3JkQ2hhcihjaCk7CisgICAgICBjYXNlICdXJzogcmV0dXJuICFJc0FzY2lpV29yZENoYXIoY2gpOworICAgIH0KKyAgICByZXR1cm4gSXNBc2NpaVB1bmN0KHBhdHRlcm5fY2hhcikgJiYgcGF0dGVybl9jaGFyID09IGNoOworICB9CisKKyAgcmV0dXJuIChwYXR0ZXJuX2NoYXIgPT0gJy4nICYmIGNoICE9ICdcbicpIHx8IHBhdHRlcm5fY2hhciA9PSBjaDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVmFsaWRhdGVSZWdleCgpIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlcy4KK3N0ZDo6c3RyaW5nIEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IoY29uc3QgY2hhciogcmVnZXgsIGludCBpbmRleCkgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCAiU3ludGF4IGVycm9yIGF0IGluZGV4ICIgPDwgaW5kZXgKKyAgICAgICAgICA8PCAiIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4IDw8ICJcIjogIikuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEdlbmVyYXRlcyBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgcmVnZXggaXMgaW52YWxpZDsKKy8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCitib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgaWYgKHJlZ2V4ID09IE5VTEwpIHsKKyAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZml4IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBpbiB0aGUKKyAgICAvLyBhc3NlcnRpb24gZmFpbHVyZXMgdG8gbWF0Y2ggd2hlcmUgdGhlIHJlZ2V4IGlzIHVzZWQgaW4gdXNlcgorICAgIC8vIGNvZGUuCisgICAgQUREX0ZBSUxVUkUoKSA8PCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc192YWxpZCA9IHRydWU7CisKKyAgLy8gVHJ1ZSBpZmYgPywgKiwgb3IgKyBjYW4gZm9sbG93IHRoZSBwcmV2aW91cyBhdG9tLgorICBib29sIHByZXZfcmVwZWF0YWJsZSA9IGZhbHNlOworICBmb3IgKGludCBpID0gMDsgcmVnZXhbaV07IGkrKykgeworICAgIGlmIChyZWdleFtpXSA9PSAnXFwnKSB7ICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UKKyAgICAgIGkrKzsKKyAgICAgIGlmIChyZWdleFtpXSA9PSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFJc1ZhbGlkRXNjYXBlKHJlZ2V4W2ldKSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcIiA8PCByZWdleFtpXSA8PCAiXCIuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHByZXZfcmVwZWF0YWJsZSA9IHRydWU7CisgICAgfSBlbHNlIHsgIC8vIE5vdCBhbiBlc2NhcGUgc2VxdWVuY2UuCisgICAgICBjb25zdCBjaGFyIGNoID0gcmVnZXhbaV07CisKKyAgICAgIGlmIChjaCA9PSAnXicgJiYgaSA+IDApIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyQnICYmIHJlZ2V4W2kgKyAxXSAhPSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKElzSW5TZXQoY2gsICIoKVtde318IikpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBpcyB1bnN1cHBvcnRlZC4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChJc1JlcGVhdChjaCkgJiYgIXByZXZfcmVwZWF0YWJsZSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4uIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHJldl9yZXBlYXRhYmxlID0gIUlzSW5TZXQoY2gsICJeJD8qKyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpc192YWxpZDsKK30KKworLy8gTWF0Y2hlcyBhIHJlcGVhdGVkIHJlZ2V4IGF0b20gZm9sbG93ZWQgYnkgYSB2YWxpZCBzaW1wbGUgcmVndWxhcgorLy8gZXhwcmVzc2lvbi4gIFRoZSByZWdleCBhdG9tIGlzIGRlZmluZWQgYXMgYyBpZiBlc2NhcGVkIGlzIGZhbHNlLAorLy8gb3IgXGMgb3RoZXJ3aXNlLiAgcmVwZWF0IGlzIHRoZSByZXBldGl0aW9uIG1ldGEgY2hhcmFjdGVyICg/LCAqLAorLy8gb3IgKykuICBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHN0ciBjb250YWlucyB0b28gbWFueQorLy8gY2hhcmFjdGVycyB0byBiZSBpbmRleGFibGUgYnkgc2l6ZV90LCBpbiB3aGljaCBjYXNlIHRoZSB0ZXN0IHdpbGwKKy8vIHByb2JhYmx5IHRpbWUgb3V0IGFueXdheS4gIFdlIGFyZSBmaW5lIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFzCisvLyBzdGQ6OnN0cmluZyBoYXMgaXQgdG9vLgorYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICBib29sIGVzY2FwZWQsIGNoYXIgYywgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LAorICAgIGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBzaXplX3QgbWluX2NvdW50ID0gKHJlcGVhdCA9PSAnKycpID8gMSA6IDA7CisgIGNvbnN0IHNpemVfdCBtYXhfY291bnQgPSAocmVwZWF0ID09ICc/JykgPyAxIDoKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oLTEpIC0gMTsKKyAgLy8gV2UgY2Fubm90IGNhbGwgbnVtZXJpY19saW1pdHM6Om1heCgpIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZQorICAvLyBtYXgoKSBtYWNybyBvbiBXaW5kb3dzLgorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IG1heF9jb3VudDsgKytpKSB7CisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBhdG9tIG1hdGNoZXMgZWFjaCBvZiB0aGUgZmlyc3QgaSBjaGFyYWN0ZXJzIGluIHN0ci4KKyAgICBpZiAoaSA+PSBtaW5fY291bnQgJiYgTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyICsgaSkpIHsKKyAgICAgIC8vIFdlIGhhdmUgZW5vdWdoIG1hdGNoZXMgYXQgdGhlIGhlYWQsIGFuZCB0aGUgdGFpbCBtYXRjaGVzIHRvby4KKyAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCAqd2hldGhlciogdGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHIKKyAgICAgIC8vIChhcyBvcHBvc2VkIHRvICpob3cqIGl0IG1hdGNoZXMpLCB0aGVyZSBpcyBubyBuZWVkIHRvIGZpbmQgYQorICAgICAgLy8gZ3JlZWR5IG1hdGNoLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChzdHJbaV0gPT0gJ1wwJyB8fCAhQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsIGMsIHN0cltpXSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2Ygc3RyLiAgcmVnZXggbXVzdCBiZSBhCisvLyB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBub3Qgc3RhcnQgd2l0aCAiXiIsIG9yIHRoZQorLy8gcmVzdWx0IGlzIHVuZGVmaW5lZC4KK2Jvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7CisgIGlmICgqcmVnZXggPT0gJ1wwJykgIC8vIEFuIGVtcHR5IHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2YgYW55dGhpbmcuCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gIiQiIG9ubHkgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHJlZ2V4IGJlaW5nCisgIC8vIHZhbGlkIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSdzIG5vdGhpbmcgYWZ0ZXIgIiQiIGluIGl0LgorICBpZiAoKnJlZ2V4ID09ICckJykKKyAgICByZXR1cm4gKnN0ciA9PSAnXDAnOworCisgIC8vIElzIHRoZSBmaXJzdCB0aGluZyBpbiByZWdleCBhbiBlc2NhcGUgc2VxdWVuY2U/CisgIGNvbnN0IGJvb2wgZXNjYXBlZCA9ICpyZWdleCA9PSAnXFwnOworICBpZiAoZXNjYXBlZCkKKyAgICArK3JlZ2V4OworICBpZiAoSXNSZXBlYXQocmVnZXhbMV0pKSB7CisgICAgLy8gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoKSBjYWxscyBNYXRjaFJlZ2V4QXRIZWFkKCksIHNvCisgICAgLy8gaGVyZSdzIGFuIGluZGlyZWN0IHJlY3Vyc2lvbi4gIEl0IHRlcm1pbmF0ZXMgYXMgdGhlIHJlZ2V4IGdldHMKKyAgICAvLyBzaG9ydGVyIGluIGVhY2ggcmVjdXJzaW9uLgorICAgIHJldHVybiBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICAgICAgZXNjYXBlZCwgcmVnZXhbMF0sIHJlZ2V4WzFdLCByZWdleCArIDIsIHN0cik7CisgIH0gZWxzZSB7CisgICAgLy8gcmVnZXggaXNuJ3QgZW1wdHksIGlzbid0ICIkIiwgYW5kIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCisgICAgLy8gcmVwZXRpdGlvbi4gIFdlIG1hdGNoIHRoZSBmaXJzdCBhdG9tIG9mIHJlZ2V4IHdpdGggdGhlIGZpcnN0CisgICAgLy8gY2hhcmFjdGVyIG9mIHN0ciBhbmQgcmVjdXJzZS4KKyAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJykgJiYgQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsICpyZWdleCwgKnN0cikgJiYKKyAgICAgICAgTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0ciArIDEpOworICB9Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhbnkgc3Vic3RyaW5nIG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUKKy8vIGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisvLworLy8gVGhlIGFsZ29yaXRobSBpcyByZWN1cnNpdmUsIGJ1dCB0aGUgcmVjdXJzaW9uIGRlcHRoIGRvZXNuJ3QgZXhjZWVkCisvLyB0aGUgcmVnZXggbGVuZ3RoLCBzbyB3ZSB3b24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJ1bm5pbmcgb3V0IG9mCisvLyBzdGFjayBzcGFjZSBub3JtYWxseS4gIEluIHJhcmUgY2FzZXMgdGhlIHRpbWUgY29tcGxleGl0eSBjYW4gYmUKKy8vIGV4cG9uZW50aWFsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVnZXggbGVuZ3RoICsgdGhlIHN0cmluZyBsZW5ndGgsCisvLyBidXQgdXN1YWxseSBpdCdzIG11c3QgZmFzdGVyIChvZnRlbiBjbG9zZSB0byBsaW5lYXIpLgorYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgeworICBpZiAocmVnZXggPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCpyZWdleCA9PSAnXicpCisgICAgcmV0dXJuIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIpOworCisgIC8vIEEgc3VjY2Vzc2Z1bCBtYXRjaCBjYW4gYmUgYW55d2hlcmUgaW4gc3RyLgorICBkbyB7CisgICAgaWYgKE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0cikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfSB3aGlsZSAoKnN0cisrICE9ICdcMCcpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEltcGxlbWVudHMgdGhlIFJFIGNsYXNzLgorCitSRTo6flJFKCkgeworICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhdHRlcm5fKSk7CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZnVsbF9wYXR0ZXJuXykpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgorYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLmZ1bGxfcGF0dGVybl8sIHN0cik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLnBhdHRlcm5fLCBzdHIpOworfQorCisvLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCit2b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIHBhdHRlcm5fID0gZnVsbF9wYXR0ZXJuXyA9IE5VTEw7CisgIGlmIChyZWdleCAhPSBOVUxMKSB7CisgICAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsKKyAgfQorCisgIGlzX3ZhbGlkXyA9IFZhbGlkYXRlUmVnZXgocmVnZXgpOworICBpZiAoIWlzX3ZhbGlkXykgeworICAgIC8vIE5vIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdHRlcm4gd2hlbiB0aGUgcmVnZXggaXMgaW52YWxpZC4KKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKHJlZ2V4KTsKKyAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCisgIC8vIGZ1bGwgbWF0Y2g6IHdlIG5lZWQgc3BhY2UgdG8gcHJlcGVuZCBhICdeJywgYXBwZW5kIGEgJyQnLCBhbmQKKyAgLy8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCAnXDAnLgorICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKGxlbiArIDMpKTsKKyAgZnVsbF9wYXR0ZXJuXyA9IGJ1ZmZlcjsKKworICBpZiAoKnJlZ2V4ICE9ICdeJykKKyAgICAqYnVmZmVyKysgPSAnXic7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gc3RhcnRzIHdpdGggJ14nLgorCisgIC8vIFdlIGRvbid0IHVzZSBzbnByaW50ZiBvciBzdHJuY3B5LCBhcyB0aGV5IHRyaWdnZXIgYSB3YXJuaW5nIHdoZW4KKyAgLy8gY29tcGlsZWQgd2l0aCBWQysrIDguMC4KKyAgbWVtY3B5KGJ1ZmZlciwgcmVnZXgsIGxlbik7CisgIGJ1ZmZlciArPSBsZW47CisKKyAgaWYgKGxlbiA9PSAwIHx8IHJlZ2V4W2xlbiAtIDFdICE9ICckJykKKyAgICAqYnVmZmVyKysgPSAnJCc7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gZW5kcyB3aXRoICckJy4KKworICAqYnVmZmVyID0gJ1wwJzsKK30KKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCisKK2NvbnN0IGNoYXIga1Vua25vd25GaWxlW10gPSAidW5rbm93biBmaWxlIjsKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lID0gZmlsZSA9PSBOVUxMID8ga1Vua25vd25GaWxlIDogZmlsZTsKKworICBpZiAobGluZSA8IDApIHsKKyAgICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIiVzOiIsIGZpbGVfbmFtZSkuY19zdHIoKTsKKyAgfQorI2lmZGVmIF9NU0NfVkVSCisgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJXMoJWQpOiIsIGZpbGVfbmFtZSwgbGluZSkuY19zdHIoKTsKKyNlbHNlCisgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJXM6JWQ6IiwgZmlsZV9uYW1lLCBsaW5lKS5jX3N0cigpOworI2VuZGlmICAvLyBfTVNDX1ZFUgorfQorCisvLyBGb3JtYXRzIGEgZmlsZSBsb2NhdGlvbiBmb3IgY29tcGlsZXItaW5kZXBlbmRlbnQgWE1MIG91dHB1dC4KKy8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCwgd2UgcHV0IGl0IG5leHQgdG8KKy8vIEZvcm1hdEZpbGVMb2NhdGlvbiBpbiBvcmRlciB0byBjb250cmFzdCB0aGUgdHdvIGZ1bmN0aW9ucy4KKy8vIE5vdGUgdGhhdCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKCkgZG9lcyBOT1QgYXBwZW5kIGNvbG9uCisvLyB0byB0aGUgZmlsZSBsb2NhdGlvbiBpdCBwcm9kdWNlcywgdW5saWtlIEZvcm1hdEZpbGVMb2NhdGlvbigpLgorR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oCisgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lID0gZmlsZSA9PSBOVUxMID8ga1Vua25vd25GaWxlIDogZmlsZTsKKworICBpZiAobGluZSA8IDApCisgICAgcmV0dXJuIGZpbGVfbmFtZTsKKyAgZWxzZQorICAgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJXM6JWQiLCBmaWxlX25hbWUsIGxpbmUpLmNfc3RyKCk7Cit9CisKKworR1Rlc3RMb2c6OkdUZXN0TG9nKEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKQorICAgIDogc2V2ZXJpdHlfKHNldmVyaXR5KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IG1hcmtlciA9CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9JTkZPID8gICAgIlsgIElORk8gXSIgOgorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfV0FSTklORyA/ICJbV0FSTklOR10iIDoKKyAgICAgIHNldmVyaXR5ID09IEdURVNUX0VSUk9SID8gICAiWyBFUlJPUiBdIiA6ICJbIEZBVEFMIF0iOworICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbCA8PCBtYXJrZXIgPDwgIiAiCisgICAgICAgICAgICAgIDw8IEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpIDw8ICI6ICI7Cit9CisKKy8vIEZsdXNoZXMgdGhlIGJ1ZmZlcnMgYW5kLCBpZiBzZXZlcml0eSBpcyBHVEVTVF9GQVRBTCwgYWJvcnRzIHRoZSBwcm9ncmFtLgorR1Rlc3RMb2c6On5HVGVzdExvZygpIHsKKyAgR2V0U3RyZWFtKCkgPDwgOjpzdGQ6OmVuZGw7CisgIGlmIChzZXZlcml0eV8gPT0gR1RFU1RfRkFUQUwpIHsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorfQorLy8gRGlzYWJsZSBNaWNyb3NvZnQgZGVwcmVjYXRpb24gd2FybmluZ3MgZm9yIFBPU0lYIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbQorLy8gdGhpcyBjbGFzcyAoY3JlYXQsIGR1cCwgZHVwMiwgYW5kIGNsb3NlKQorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ5OTYpCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIE9iamVjdCB0aGF0IGNhcHR1cmVzIGFuIG91dHB1dCBzdHJlYW0gKHN0ZG91dC9zdGRlcnIpLgorY2xhc3MgQ2FwdHVyZWRTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gVGhlIGN0b3IgcmVkaXJlY3RzIHRoZSBzdHJlYW0gdG8gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgZXhwbGljaXQgQ2FwdHVyZWRTdHJlYW0oaW50IGZkKSA6IGZkXyhmZCksIHVuY2FwdHVyZWRfZmRfKGR1cChmZCkpIHsKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworICAgIGNoYXIgdGVtcF9kaXJfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKKyAgICBjaGFyIHRlbXBfZmlsZV9wYXRoW01BWF9QQVRIICsgMV0gPSB7ICdcMCcgfTsgIC8vIE5PTElOVAorCisgICAgOjpHZXRUZW1wUGF0aEEoc2l6ZW9mKHRlbXBfZGlyX3BhdGgpLCB0ZW1wX2Rpcl9wYXRoKTsKKyAgICBjb25zdCBVSU5UIHN1Y2Nlc3MgPSA6OkdldFRlbXBGaWxlTmFtZUEodGVtcF9kaXJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd0ZXN0X3JlZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIEdlbmVyYXRlIHVuaXF1ZSBmaWxlIG5hbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZmlsZV9wYXRoKTsKKyAgICBHVEVTVF9DSEVDS18oc3VjY2VzcyAhPSAwKQorICAgICAgICA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluICIgPDwgdGVtcF9kaXJfcGF0aDsKKyAgICBjb25zdCBpbnQgY2FwdHVyZWRfZmQgPSBjcmVhdCh0ZW1wX2ZpbGVfcGF0aCwgX1NfSVJFQUQgfCBfU19JV1JJVEUpOworICAgIEdURVNUX0NIRUNLXyhjYXB0dXJlZF9mZCAhPSAtMSkgPDwgIlVuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRlbXBfZmlsZV9wYXRoOworICAgIGZpbGVuYW1lXyA9IHRlbXBfZmlsZV9wYXRoOworIyBlbHNlCisgICAgLy8gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHRlc3QgaGFzIHdyaXRlIGFjY2VzcyB0byB0aGUgY3VycmVudAorICAgIC8vIGRpcmVjdG9yeSwgc28gd2UgY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgL3RtcCBkaXJlY3RvcnkKKyAgICAvLyBpbnN0ZWFkLiBXZSB1c2UgL3RtcCBvbiBtb3N0IHN5c3RlbXMsIGFuZCAvc2RjYXJkIG9uIEFuZHJvaWQuCisgICAgLy8gVGhhdCdzIGJlY2F1c2UgQW5kcm9pZCBkb2Vzbid0IGhhdmUgL3RtcC4KKyMgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgICAvLyBOb3RlOiBBbmRyb2lkIGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gY2FsbCB0aGUgZnJhbWV3b3JrJ3MKKyAgICAvLyBDb250ZXh0LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpIG1ldGhvZCB0aHJvdWdoIEpOSSB0byBnZXQKKyAgICAvLyB0aGUgbG9jYXRpb24gb2YgdGhlIHdvcmxkLXdyaXRhYmxlIFNEIENhcmQgZGlyZWN0b3J5LiBIb3dldmVyLAorICAgIC8vIHRoaXMgcmVxdWlyZXMgYSBDb250ZXh0IGhhbmRsZSwgd2hpY2ggY2Fubm90IGJlIHJldHJpZXZlZAorICAgIC8vIGdsb2JhbGx5IGZyb20gbmF0aXZlIGNvZGUuIERvaW5nIHNvIGFsc28gcHJlY2x1ZGVzIHJ1bm5pbmcgdGhlCisgICAgLy8gY29kZSBhcyBwYXJ0IG9mIGEgcmVndWxhciBzdGFuZGFsb25lIGV4ZWN1dGFibGUsIHdoaWNoIGRvZXNuJ3QKKyAgICAvLyBydW4gaW4gYSBEYWx2aWsgcHJvY2VzcyAoZS5nLiB3aGVuIHJ1bm5pbmcgaXQgdGhyb3VnaCAnYWRiIHNoZWxsJykuCisgICAgLy8KKyAgICAvLyBUaGUgbG9jYXRpb24gL3NkY2FyZCBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gbmF0aXZlIGNvZGUKKyAgICAvLyBhbmQgaXMgdGhlIG9ubHkgbG9jYXRpb24gKHVub2ZmaWNpYWxseSkgc3VwcG9ydGVkIGJ5IHRoZSBBbmRyb2lkCisgICAgLy8gdGVhbS4gSXQncyBnZW5lcmFsbHkgYSBzeW1saW5rIHRvIHRoZSByZWFsIFNEIENhcmQgbW91bnQgcG9pbnQKKyAgICAvLyB3aGljaCBjYW4gYmUgL21udC9zZGNhcmQsIC9tbnQvc2RjYXJkMCwgL3N5c3RlbS9tZWRpYS9zZGNhcmQsIG9yCisgICAgLy8gb3RoZXIgT0VNLWN1c3RvbWl6ZWQgbG9jYXRpb25zLiBOZXZlciByZWx5IG9uIHRoZXNlLCBhbmQgYWx3YXlzCisgICAgLy8gdXNlIC9zZGNhcmQuCisgICAgY2hhciBuYW1lX3RlbXBsYXRlW10gPSAiL3NkY2FyZC9ndGVzdF9jYXB0dXJlZF9zdHJlYW0uWFhYWFhYIjsKKyMgIGVsc2UKKyAgICBjaGFyIG5hbWVfdGVtcGxhdGVbXSA9ICIvdG1wL2NhcHR1cmVkX3N0cmVhbS5YWFhYWFgiOworIyAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgICBjb25zdCBpbnQgY2FwdHVyZWRfZmQgPSBta3N0ZW1wKG5hbWVfdGVtcGxhdGUpOworICAgIGZpbGVuYW1lXyA9IG5hbWVfdGVtcGxhdGU7CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgICAgZmZsdXNoKE5VTEwpOworICAgIGR1cDIoY2FwdHVyZWRfZmQsIGZkXyk7CisgICAgY2xvc2UoY2FwdHVyZWRfZmQpOworICB9CisKKyAgfkNhcHR1cmVkU3RyZWFtKCkgeworICAgIHJlbW92ZShmaWxlbmFtZV8uY19zdHIoKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0cmluZygpIHsKKyAgICBpZiAodW5jYXB0dXJlZF9mZF8gIT0gLTEpIHsKKyAgICAgIC8vIFJlc3RvcmVzIHRoZSBvcmlnaW5hbCBzdHJlYW0uCisgICAgICBmZmx1c2goTlVMTCk7CisgICAgICBkdXAyKHVuY2FwdHVyZWRfZmRfLCBmZF8pOworICAgICAgY2xvc2UodW5jYXB0dXJlZF9mZF8pOworICAgICAgdW5jYXB0dXJlZF9mZF8gPSAtMTsKKyAgICB9CisKKyAgICBGSUxFKiBjb25zdCBmaWxlID0gcG9zaXg6OkZPcGVuKGZpbGVuYW1lXy5jX3N0cigpLCAiciIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSBSZWFkRW50aXJlRmlsZShmaWxlKTsKKyAgICBwb3NpeDo6RkNsb3NlKGZpbGUpOworICAgIHJldHVybiBjb250ZW50OworICB9CisKKyBwcml2YXRlOgorICAvLyBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBmaWxlIGFzIGFuIHN0ZDo6c3RyaW5nLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgUmVhZEVudGlyZUZpbGUoRklMRSogZmlsZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4KKyAgc3RhdGljIHNpemVfdCBHZXRGaWxlU2l6ZShGSUxFKiBmaWxlKTsKKworICBjb25zdCBpbnQgZmRfOyAgLy8gQSBzdHJlYW0gdG8gY2FwdHVyZS4KKyAgaW50IHVuY2FwdHVyZWRfZmRfOworICAvLyBOYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBob2xkaW5nIHRoZSBzdGRlcnIgb3V0cHV0LgorICA6OnN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKENhcHR1cmVkU3RyZWFtKTsKK307CisKKy8vIFJldHVybnMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIGZpbGUuCitzaXplX3QgQ2FwdHVyZWRTdHJlYW06OkdldEZpbGVTaXplKEZJTEUqIGZpbGUpIHsKKyAgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihmdGVsbChmaWxlKSk7Cit9CisKKy8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYSBzdHJpbmcuCitzdGQ6OnN0cmluZyBDYXB0dXJlZFN0cmVhbTo6UmVhZEVudGlyZUZpbGUoRklMRSogZmlsZSkgeworICBjb25zdCBzaXplX3QgZmlsZV9zaXplID0gR2V0RmlsZVNpemUoZmlsZSk7CisgIGNoYXIqIGNvbnN0IGJ1ZmZlciA9IG5ldyBjaGFyW2ZpbGVfc2l6ZV07CisKKyAgc2l6ZV90IGJ5dGVzX2xhc3RfcmVhZCA9IDA7ICAvLyAjIG9mIGJ5dGVzIHJlYWQgaW4gdGhlIGxhc3QgZnJlYWQoKQorICBzaXplX3QgYnl0ZXNfcmVhZCA9IDA7ICAgICAgIC8vICMgb2YgYnl0ZXMgcmVhZCBzbyBmYXIKKworICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7CisKKyAgLy8gS2VlcHMgcmVhZGluZyB0aGUgZmlsZSB1bnRpbCB3ZSBjYW5ub3QgcmVhZCBmdXJ0aGVyIG9yIHRoZQorICAvLyBwcmUtZGV0ZXJtaW5lZCBmaWxlIHNpemUgaXMgcmVhY2hlZC4KKyAgZG8geworICAgIGJ5dGVzX2xhc3RfcmVhZCA9IGZyZWFkKGJ1ZmZlcitieXRlc19yZWFkLCAxLCBmaWxlX3NpemUtYnl0ZXNfcmVhZCwgZmlsZSk7CisgICAgYnl0ZXNfcmVhZCArPSBieXRlc19sYXN0X3JlYWQ7CisgIH0gd2hpbGUgKGJ5dGVzX2xhc3RfcmVhZCA+IDAgJiYgYnl0ZXNfcmVhZCA8IGZpbGVfc2l6ZSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudChidWZmZXIsIGJ5dGVzX3JlYWQpOworICBkZWxldGVbXSBidWZmZXI7CisKKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCisKK3N0YXRpYyBDYXB0dXJlZFN0cmVhbSogZ19jYXB0dXJlZF9zdGRlcnIgPSBOVUxMOworc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZG91dCA9IE5VTEw7CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgYW4gb3V0cHV0IHN0cmVhbSAoc3Rkb3V0L3N0ZGVycikuCit2b2lkIENhcHR1cmVTdHJlYW0oaW50IGZkLCBjb25zdCBjaGFyKiBzdHJlYW1fbmFtZSwgQ2FwdHVyZWRTdHJlYW0qKiBzdHJlYW0pIHsKKyAgaWYgKCpzdHJlYW0gIT0gTlVMTCkgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJPbmx5IG9uZSAiIDw8IHN0cmVhbV9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBjYXB0dXJlciBjYW4gZXhpc3QgYXQgYSB0aW1lLiI7CisgIH0KKyAgKnN0cmVhbSA9IG5ldyBDYXB0dXJlZFN0cmVhbShmZCk7Cit9CisKKy8vIFN0b3BzIGNhcHR1cmluZyB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdHJlYW0oQ2FwdHVyZWRTdHJlYW0qKiBjYXB0dXJlZF9zdHJlYW0pIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudCA9ICgqY2FwdHVyZWRfc3RyZWFtKS0+R2V0Q2FwdHVyZWRTdHJpbmcoKTsKKworICBkZWxldGUgKmNhcHR1cmVkX3N0cmVhbTsKKyAgKmNhcHR1cmVkX3N0cmVhbSA9IE5VTEw7CisKKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0Lgordm9pZCBDYXB0dXJlU3Rkb3V0KCkgeworICBDYXB0dXJlU3RyZWFtKGtTdGRPdXRGaWxlbm8sICJzdGRvdXQiLCAmZ19jYXB0dXJlZF9zdGRvdXQpOworfQorCisvLyBTdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KK3ZvaWQgQ2FwdHVyZVN0ZGVycigpIHsKKyAgQ2FwdHVyZVN0cmVhbShrU3RkRXJyRmlsZW5vLCAic3RkZXJyIiwgJmdfY2FwdHVyZWRfc3RkZXJyKTsKK30KKworLy8gU3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdGRvdXQoKSB7CisgIHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRvdXQpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpIHsKKyAgcmV0dXJuIEdldENhcHR1cmVkU3RyZWFtKCZnX2NhcHR1cmVkX3N0ZGVycik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gQSBjb3B5IG9mIGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgU2V0IGJ5IEluaXRHb29nbGVUZXN0KCkuCis6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGdfYXJndnM7CisKK3N0YXRpYyBjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KiBnX2luamVjdGVkX3Rlc3RfYXJndnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEw7ICAvLyBPd25lZC4KKwordm9pZCBTZXRJbmplY3RhYmxlQXJndnMoY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiogYXJndnMpIHsKKyAgaWYgKGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyAhPSBhcmd2cykKKyAgICBkZWxldGUgZ19pbmplY3RlZF90ZXN0X2FyZ3ZzOworICBnX2luamVjdGVkX3Rlc3RfYXJndnMgPSBhcmd2czsKK30KKworY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0SW5qZWN0YWJsZUFyZ3ZzKCkgeworICBpZiAoZ19pbmplY3RlZF90ZXN0X2FyZ3ZzICE9IE5VTEwpIHsKKyAgICByZXR1cm4gKmdfaW5qZWN0ZWRfdGVzdF9hcmd2czsKKyAgfQorICByZXR1cm4gZ19hcmd2czsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCituYW1lc3BhY2UgcG9zaXggewordm9pZCBBYm9ydCgpIHsKKyAgRGVidWdCcmVhaygpOworICBUZXJtaW5hdGVQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIDEpOworfQorfSAgLy8gbmFtZXNwYWNlIHBvc2l4CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisvLyBnaXZlbiBmbGFnLiAgRm9yIGV4YW1wbGUsIEZsYWdUb0VudlZhcigiZm9vIikgd2lsbCByZXR1cm4KKy8vICJHVEVTVF9GT08iIGluIHRoZSBvcGVuLXNvdXJjZSB2ZXJzaW9uLgorc3RhdGljIHN0ZDo6c3RyaW5nIEZsYWdUb0VudlZhcihjb25zdCBjaGFyKiBmbGFnKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZ1bGxfZmxhZyA9CisgICAgICAoTWVzc2FnZSgpIDw8IEdURVNUX0ZMQUdfUFJFRklYXyA8PCBmbGFnKS5HZXRTdHJpbmcoKTsKKworICBNZXNzYWdlIGVudl92YXI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGZ1bGxfZmxhZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgZW52X3ZhciA8PCBUb1VwcGVyKGZ1bGxfZmxhZy5jX3N0cigpW2ldKTsKKyAgfQorCisgIHJldHVybiBlbnZfdmFyLkdldFN0cmluZygpOworfQorCisvLyBQYXJzZXMgJ3N0cicgZm9yIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLiAgSWYgc3VjY2Vzc2Z1bCwgd3JpdGVzCisvLyB0aGUgcmVzdWx0IHRvICp2YWx1ZSBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICp2YWx1ZQorLy8gdW5jaGFuZ2VkIGFuZCByZXR1cm5zIGZhbHNlLgorYm9vbCBQYXJzZUludDMyKGNvbnN0IE1lc3NhZ2UmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIEludDMyKiB2YWx1ZSkgeworICAvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLgorICBjaGFyKiBlbmQgPSBOVUxMOworICBjb25zdCBsb25nIGxvbmdfdmFsdWUgPSBzdHJ0b2woc3RyLCAmZW5kLCAxMCk7ICAvLyBOT0xJTlQKKworICAvLyBIYXMgc3RydG9sKCkgY29uc3VtZWQgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZz8KKyAgaWYgKCplbmQgIT0gJ1wwJykgeworICAgIC8vIE5vIC0gYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2FzIGVuY291bnRlcmVkLgorICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAorICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKKyAgICAgICAgPDwgIiBoYXMgdmFsdWUgXCIiIDw8IHN0ciA8PCAiXCIuXG4iOworICAgIHByaW50ZigiJXMiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSXMgdGhlIHBhcnNlZCB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgYW4gSW50MzI/CisgIGNvbnN0IEludDMyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludDMyPihsb25nX3ZhbHVlKTsKKyAgaWYgKGxvbmdfdmFsdWUgPT0gTE9OR19NQVggfHwgbG9uZ192YWx1ZSA9PSBMT05HX01JTiB8fAorICAgICAgLy8gVGhlIHBhcnNlZCB2YWx1ZSBvdmVyZmxvd3MgYXMgYSBsb25nLiAgKHN0cnRvbCgpIHJldHVybnMKKyAgICAgIC8vIExPTkdfTUFYIG9yIExPTkdfTUlOIHdoZW4gdGhlIGlucHV0IG92ZXJmbG93cy4pCisgICAgICByZXN1bHQgIT0gbG9uZ192YWx1ZQorICAgICAgLy8gVGhlIHBhcnNlZCB2YWx1ZSBvdmVyZmxvd3MgYXMgYW4gSW50MzIuCisgICAgICApIHsKKyAgICBNZXNzYWdlIG1zZzsKKyAgICBtc2cgPDwgIldBUk5JTkc6ICIgPDwgc3JjX3RleHQKKyAgICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBidXQgYWN0dWFsbHkiCisgICAgICAgIDw8ICIgaGFzIHZhbHVlICIgPDwgc3RyIDw8ICIsIHdoaWNoIG92ZXJmbG93cy5cbiI7CisgICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqdmFsdWUgPSByZXN1bHQ7CisgIHJldHVybiB0cnVlOworfQorCisvLyBSZWFkcyBhbmQgcmV0dXJucyB0aGUgQm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCisvLworLy8gVGhlIHZhbHVlIGlzIGNvbnNpZGVyZWQgdHJ1ZSBpZmYgaXQncyBub3QgIjAiLgorYm9vbCBCb29sRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOworICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiBzdHJpbmdfdmFsdWUgPT0gTlVMTCA/CisgICAgICBkZWZhdWx0X3ZhbHVlIDogc3RyY21wKHN0cmluZ192YWx1ZSwgIjAiKSAhPSAwOworfQorCisvLyBSZWFkcyBhbmQgcmV0dXJucyBhIDMyLWJpdCBpbnRlZ2VyIHN0b3JlZCBpbiB0aGUgZW52aXJvbm1lbnQKKy8vIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0IGlzbid0IHNldCBvcgorLy8gZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAzMi1iaXQgaW50ZWdlciwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOworICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIGlmIChzdHJpbmdfdmFsdWUgPT0gTlVMTCkgeworICAgIC8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisKKyAgSW50MzIgcmVzdWx0ID0gZGVmYXVsdF92YWx1ZTsKKyAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiRW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCBlbnZfdmFyLAorICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlLCAmcmVzdWx0KSkgeworICAgIHByaW50ZigiVGhlIGRlZmF1bHQgdmFsdWUgJXMgaXMgdXNlZC5cbiIsCisgICAgICAgICAgIChNZXNzYWdlKCkgPDwgZGVmYXVsdF92YWx1ZSkuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZWFkcyBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KK2NvbnN0IGNoYXIqIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICByZXR1cm4gdmFsdWUgPT0gTlVMTCA/IGRlZmF1bHRfdmFsdWUgOiB2YWx1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtcHJpbnRlcnMuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC1wcmludGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThkNjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtcHJpbnRlcnMuY2MKQEAgLTAsMCArMSwzNjQgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKKy8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6CisvLworLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7CisvLworLy8gSXQgdXNlcyB0aGUgPDwgb3BlcmF0b3Igd2hlbiBwb3NzaWJsZSwgYW5kIHByaW50cyB0aGUgYnl0ZXMgaW4gdGhlCisvLyBvYmplY3Qgb3RoZXJ3aXNlLiAgQSB1c2VyIGNhbiBvdmVycmlkZSBpdHMgYmVoYXZpb3IgZm9yIGEgY2xhc3MKKy8vIHR5cGUgRm9vIGJ5IGRlZmluaW5nIGVpdGhlciBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiwgY29uc3QgRm9vJikKKy8vIG9yIHZvaWQgUHJpbnRUbyhjb25zdCBGb28mLCA6OnN0ZDo6b3N0cmVhbSopIGluIHRoZSBuYW1lc3BhY2UgdGhhdAorLy8gZGVmaW5lcyBGb28uCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCit1c2luZyA6OnN0ZDo6b3N0cmVhbTsKKworLy8gUHJpbnRzIGEgc2VnbWVudCBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0Lgordm9pZCBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBvc3RyZWFtKiBvcykgeworICBjaGFyIHRleHRbNV0gPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworICAgIGNvbnN0IHNpemVfdCBqID0gc3RhcnQgKyBpOworICAgIGlmIChpICE9IDApIHsKKyAgICAgIC8vIE9yZ2FuaXplcyB0aGUgYnl0ZXMgaW50byBncm91cHMgb2YgMiBmb3IgZWFzeSBwYXJzaW5nIGJ5CisgICAgICAvLyBodW1hbi4KKyAgICAgIGlmICgoaiAlIDIpID09IDApCisgICAgICAgICpvcyA8PCAnICc7CisgICAgICBlbHNlCisgICAgICAgICpvcyA8PCAnLSc7CisgICAgfQorICAgIEdURVNUX1NOUFJJTlRGXyh0ZXh0LCBzaXplb2YodGV4dCksICIlMDJYIiwgb2JqX2J5dGVzW2pdKTsKKyAgICAqb3MgPDwgdGV4dDsKKyAgfQorfQorCisvLyBQcmludHMgdGhlIGJ5dGVzIGluIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4KK3ZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKKyAgLy8gVGVsbHMgdGhlIHVzZXIgaG93IGJpZyB0aGUgb2JqZWN0IGlzLgorICAqb3MgPDwgY291bnQgPDwgIi1ieXRlIG9iamVjdCA8IjsKKworICBjb25zdCBzaXplX3Qga1RocmVzaG9sZCA9IDEzMjsKKyAgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA2NDsKKyAgLy8gSWYgdGhlIG9iamVjdCBzaXplIGlzIGJpZ2dlciB0aGFuIGtUaHJlc2hvbGQsIHdlJ2xsIGhhdmUgdG8gb21pdAorICAvLyBzb21lIGRldGFpbHMgYnkgcHJpbnRpbmcgb25seSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGtDaHVua1NpemUKKyAgLy8gYnl0ZXMuCisgIC8vIFRPRE8od2FuKTogbGV0IHRoZSB1c2VyIGNvbnRyb2wgdGhlIHRocmVzaG9sZCB1c2luZyBhIGZsYWcuCisgIGlmIChjb3VudCA8IGtUaHJlc2hvbGQpIHsKKyAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGNvdW50LCBvcyk7CisgIH0gZWxzZSB7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgKm9zIDw8ICIgLi4uICI7CisgICAgLy8gUm91bmRzIHVwIHRvIDItYnl0ZSBib3VuZGFyeS4KKyAgICBjb25zdCBzaXplX3QgcmVzdW1lX3BvcyA9IChjb3VudCAtIGtDaHVua1NpemUgKyAxKS8yKjI7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCByZXN1bWVfcG9zLCBjb3VudCAtIHJlc3VtZV9wb3MsIG9zKTsKKyAgfQorICAqb3MgPDwgIj4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGludGVybmFsMiB7CisKKy8vIERlbGVnYXRlcyB0byBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwoKSB0byBwcmludCB0aGUgYnl0ZXMgaW4gdGhlCisvLyBnaXZlbiBvYmplY3QuICBUaGUgZGVsZWdhdGlvbiBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKKy8vIHVzZXMgdGhlIDw8IG9wZXJhdG9yIGFuZCB0aHVzIGlzIGVhc2llciBkb25lIG91dHNpZGUgb2YgdGhlCisvLyA6OnRlc3Rpbmc6OmludGVybmFsIG5hbWVzcGFjZSwgd2hpY2ggY29udGFpbnMgYSA8PCBvcGVyYXRvciB0aGF0CisvLyBzb21ldGltZXMgY29uZmxpY3RzIHdpdGggdGhlIG9uZSBpbiBTVEwuCit2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgeworICBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwob2JqX2J5dGVzLCBjb3VudCwgb3MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwyCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYSBjaGFyIChvciB3Y2hhcl90KSwgd2UgcHJpbnQgaXQgaW4gb25lCisvLyBvZiB0aHJlZSBmb3JtYXRzOgorLy8gICAtIGFzIGlzIGlmIGl0J3MgYSBwcmludGFibGUgQVNDSUkgKGUuZy4gJ2EnLCAnMicsICcgJyksCisvLyAgIC0gYXMgYSBoZXhpZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2UgKGUuZy4gJ1x4N0YnKSwgb3IKKy8vICAgLSBhcyBhIHNwZWNpYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdccicsICdcbicpLgorZW51bSBDaGFyRm9ybWF0IHsKKyAga0FzSXMsCisgIGtIZXhFc2NhcGUsCisgIGtTcGVjaWFsRXNjYXBlCit9OworCisvLyBSZXR1cm5zIHRydWUgaWYgYyBpcyBhIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXIuICBXZSB0ZXN0IHRoZQorLy8gdmFsdWUgb2YgYyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgaXNwcmludCgpLCB3aGljaCBpcyBidWdneSBvbgorLy8gV2luZG93cyBNb2JpbGUuCitpbmxpbmUgYm9vbCBJc1ByaW50YWJsZUFzY2lpKHdjaGFyX3QgYykgeworICByZXR1cm4gMHgyMCA8PSBjICYmIGMgPD0gMHg3RTsKK30KKworLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhciBjIGFzIGEgY2hhcmFjdGVyIGxpdGVyYWwgd2l0aG91dCB0aGUKKy8vIHF1b3RlcywgZXNjYXBpbmcgaXQgd2hlbiBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KKy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwKKy8vIHdoaWNoIGlzIHRoZSB0eXBlIG9mIGMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPgorc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc0NoYXJMaXRlcmFsVG8oQ2hhciBjLCBvc3RyZWFtKiBvcykgeworICBzd2l0Y2ggKHN0YXRpY19jYXN0PHdjaGFyX3Q+KGMpKSB7CisgICAgY2FzZSBMJ1wwJzoKKyAgICAgICpvcyA8PCAiXFwwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcJyc6CisgICAgICAqb3MgPDwgIlxcJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXFwnOgorICAgICAgKm9zIDw8ICJcXFxcIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcYSc6CisgICAgICAqb3MgPDwgIlxcYSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGInOgorICAgICAgKm9zIDw8ICJcXGIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xmJzoKKyAgICAgICpvcyA8PCAiXFxmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcbic6CisgICAgICAqb3MgPDwgIlxcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXHInOgorICAgICAgKm9zIDw8ICJcXHIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1x0JzoKKyAgICAgICpvcyA8PCAiXFx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcdic6CisgICAgICAqb3MgPDwgIlxcdiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKElzUHJpbnRhYmxlQXNjaWkoYykpIHsKKyAgICAgICAgKm9zIDw8IHN0YXRpY19jYXN0PGNoYXI+KGMpOworICAgICAgICByZXR1cm4ga0FzSXM7CisgICAgICB9IGVsc2UgeworICAgICAgICAqb3MgPDwgU3RyaW5nOjpGb3JtYXQoIlxceCVYIiwgc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSk7CisgICAgICAgIHJldHVybiBrSGV4RXNjYXBlOworICAgICAgfQorICB9CisgIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKK30KKworLy8gUHJpbnRzIGEgd2NoYXJfdCBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuCisvLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNTdHJpbmdMaXRlcmFsVG8od2NoYXJfdCBjLCBvc3RyZWFtKiBvcykgeworICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlIEwnXCcnOgorICAgICAgKm9zIDw8ICInIjsKKyAgICAgIHJldHVybiBrQXNJczsKKyAgICBjYXNlIEwnIic6CisgICAgICAqb3MgPDwgIlxcXCIiOworICAgICAgcmV0dXJuIGtTcGVjaWFsRXNjYXBlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gUHJpbnRBc0NoYXJMaXRlcmFsVG88d2NoYXJfdD4oYywgb3MpOworICB9Cit9CisKKy8vIFByaW50cyBhIGNoYXIgYyBhcyBpZiBpdCdzIHBhcnQgb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZXNjYXBpbmcgaXQgd2hlbgorLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCitzdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKGNoYXIgYywgb3N0cmVhbSogb3MpIHsKKyAgcmV0dXJuIFByaW50QXNTdHJpbmdMaXRlcmFsVG8oCisgICAgICBzdGF0aWNfY2FzdDx3Y2hhcl90PihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSksIG9zKTsKK30KKworLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhcmFjdGVyIGMgYW5kIGl0cyBjb2RlLiAgJ1wwJyBpcyBwcmludGVkCisvLyBhcyAiJ1xcMCciLCBvdGhlciB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBhbHNvIHByb3Blcmx5IGVzY2FwZWQKKy8vIHVzaW5nIHRoZSBzdGFuZGFyZCBDKysgZXNjYXBlIHNlcXVlbmNlLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50CisvLyBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBVbnNpZ25lZENoYXIsIHR5cGVuYW1lIENoYXI+Cit2b2lkIFByaW50Q2hhckFuZENvZGVUbyhDaGFyIGMsIG9zdHJlYW0qIG9zKSB7CisgIC8vIEZpcnN0LCBwcmludCBjIGFzIGEgbGl0ZXJhbCBpbiB0aGUgbW9zdCByZWFkYWJsZSBmb3JtIHdlIGNhbiBmaW5kLgorICAqb3MgPDwgKChzaXplb2YoYykgPiAxKSA/ICJMJyIgOiAiJyIpOworICBjb25zdCBDaGFyRm9ybWF0IGZvcm1hdCA9IFByaW50QXNDaGFyTGl0ZXJhbFRvPFVuc2lnbmVkQ2hhcj4oYywgb3MpOworICAqb3MgPDwgIiciOworCisgIC8vIFRvIGFpZCB1c2VyIGRlYnVnZ2luZywgd2UgYWxzbyBwcmludCBjJ3MgY29kZSBpbiBkZWNpbWFsLCB1bmxlc3MKKyAgLy8gaXQncyAwIChpbiB3aGljaCBjYXNlIGMgd2FzIHByaW50ZWQgYXMgJ1xcMCcsIG1ha2luZyB0aGUgY29kZQorICAvLyBvYnZpb3VzKS4KKyAgaWYgKGMgPT0gMCkKKyAgICByZXR1cm47CisgICpvcyA8PCAiICgiIDw8IFN0cmluZzo6Rm9ybWF0KCIlZCIsIGMpLmNfc3RyKCk7CisKKyAgLy8gRm9yIG1vcmUgY29udmVuaWVuY2UsIHdlIHByaW50IGMncyBjb2RlIGFnYWluIGluIGhleGlkZWNpbWFsLAorICAvLyB1bmxlc3MgYyB3YXMgYWxyZWFkeSBwcmludGVkIGluIHRoZSBmb3JtICdceCMjJyBvciB0aGUgY29kZSBpcyBpbgorICAvLyBbMSwgOV0uCisgIGlmIChmb3JtYXQgPT0ga0hleEVzY2FwZSB8fCAoMSA8PSBjICYmIGMgPD0gOSkpIHsKKyAgICAvLyBEbyBub3RoaW5nLgorICB9IGVsc2UgeworICAgICpvcyA8PCBTdHJpbmc6OkZvcm1hdCgiLCAweCVYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSkuY19zdHIoKTsKKyAgfQorICAqb3MgPDwgIikiOworfQorCit2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKK30KK3ZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKK30KKworLy8gUHJpbnRzIGEgd2NoYXJfdCBhcyBhIHN5bWJvbCBpZiBpdCBpcyBwcmludGFibGUgb3IgYXMgaXRzIGludGVybmFsCisvLyBjb2RlIG90aGVyd2lzZSBhbmQgYWxzbyBhcyBpdHMgY29kZS4gIEwnXDAnIGlzIHByaW50ZWQgYXMgIkwnXFwwJyIuCit2b2lkIFByaW50VG8od2NoYXJfdCB3Yywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHdjaGFyX3Q+KHdjLCBvcyk7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0byB0aGUgb3N0cmVhbS4gIENoYXJUeXBlIG11c3QgYmUgZWl0aGVyCisvLyBjaGFyIG9yIHdjaGFyX3QuCisvLyBUaGUgYXJyYXkgc3RhcnRzIGF0IGJlZ2luLCB0aGUgbGVuZ3RoIGlzIGxlbiwgaXQgbWF5IGluY2x1ZGUgJ1wwJyBjaGFyYWN0ZXJzCisvLyBhbmQgbWF5IG5vdCBiZSBOVUwtdGVybWluYXRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3N0YXRpYyB2b2lkIFByaW50Q2hhcnNBc1N0cmluZ1RvKAorICAgIGNvbnN0IENoYXJUeXBlKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgY29uc3QgY2hhciogY29uc3Qga1F1b3RlQmVnaW4gPSBzaXplb2YoQ2hhclR5cGUpID09IDEgPyAiXCIiIDogIkxcIiI7CisgICpvcyA8PCBrUXVvdGVCZWdpbjsKKyAgYm9vbCBpc19wcmV2aW91c19oZXggPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgKytpbmRleCkgeworICAgIGNvbnN0IENoYXJUeXBlIGN1ciA9IGJlZ2luW2luZGV4XTsKKyAgICBpZiAoaXNfcHJldmlvdXNfaGV4ICYmIElzWERpZ2l0KGN1cikpIHsKKyAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciBpcyBvZiAnXHguLicgZm9ybSBhbmQgdGhpcyBjaGFyYWN0ZXIgY2FuIGJlCisgICAgICAvLyBpbnRlcnByZXRlZCBhcyBhbm90aGVyIGhleGFkZWNpbWFsIGRpZ2l0IGluIGl0cyBudW1iZXIuIEJyZWFrIHN0cmluZyB0bworICAgICAgLy8gZGlzYW1iaWd1YXRlLgorICAgICAgKm9zIDw8ICJcIiAiIDw8IGtRdW90ZUJlZ2luOworICAgIH0KKyAgICBpc19wcmV2aW91c19oZXggPSBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKGN1ciwgb3MpID09IGtIZXhFc2NhcGU7CisgIH0KKyAgKm9zIDw8ICJcIiI7Cit9CisKKy8vIFByaW50cyBhIChjb25zdCkgY2hhci93Y2hhcl90IGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzCisvLyAnYmVnaW4nLiAgQ2hhclR5cGUgbXVzdCBiZSBlaXRoZXIgY2hhciBvciB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgorc3RhdGljIHZvaWQgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoCisgICAgY29uc3QgQ2hhclR5cGUqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICAvLyBUaGUgY29kZQorICAvLyAgIGNvbnN0IGNoYXIga0Zvb1tdID0gImZvbyI7CisgIC8vIGdlbmVyYXRlcyBhbiBhcnJheSBvZiA0LCBub3QgMywgZWxlbWVudHMsIHdpdGggdGhlIGxhc3Qgb25lIGJlaW5nICdcMCcuCisgIC8vCisgIC8vIFRoZXJlZm9yZSB3aGVuIHByaW50aW5nIGEgY2hhciBhcnJheSwgd2UgZG9uJ3QgcHJpbnQgdGhlIGxhc3QgZWxlbWVudCBpZgorICAvLyBpdCdzICdcMCcsIHN1Y2ggdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIHN0cmluZyBsaXRlcmFsIGFzIGl0J3MKKyAgLy8gd3JpdHRlbiBpbiB0aGUgc291cmNlIGNvZGUuCisgIGlmIChsZW4gPiAwICYmIGJlZ2luW2xlbiAtIDFdID09ICdcMCcpIHsKKyAgICBQcmludENoYXJzQXNTdHJpbmdUbyhiZWdpbiwgbGVuIC0gMSwgb3MpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmLCBob3dldmVyLCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBub3QgJ1wwJywgZS5nLgorICAvLyAgICBjb25zdCBjaGFyIGtGb29bXSA9IHsgJ2YnLCAnbycsICdvJyB9OworICAvLyB3ZSBtdXN0IHByaW50IHRoZSBlbnRpcmUgYXJyYXkuICBXZSBhbHNvIHByaW50IGEgbWVzc2FnZSB0byBpbmRpY2F0ZQorICAvLyB0aGF0IHRoZSBhcnJheSBpcyBub3QgTlVMLXRlcm1pbmF0ZWQuCisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4sIG9zKTsKKyAgKm9zIDw8ICIgKG5vIHRlcm1pbmF0aW5nIE5VTCkiOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3ZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBjaGFyKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoYmVnaW4sIGxlbiwgb3MpOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIHdjaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MKKy8vICdiZWdpbicuCit2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3Qgd2NoYXJfdCogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KGJlZ2luLCBsZW4sIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4KK3ZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCBvc3RyZWFtKiBvcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOworICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMsIHN0cmxlbihzKSwgb3MpOworICB9Cit9CisKKy8vIE1TVkMgY29tcGlsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdoYXJfdCBhcyBhIHR5cGVkZWYKKy8vIG9mIHVuc2lnbmVkIHNob3J0LiBEZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3Qgd2NoYXJfdCogaW4gdGhhdCBjYXNlCisvLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsCisvLyBwb3NzaWJseSBhY2Nlc3NpbmcgbW9yZSBtZW1vcnkgdGhhbiBpbnRlbmRlZCBhbmQgY2F1c2luZyBpbnZhbGlkCisvLyBtZW1vcnkgYWNjZXNzZXMuIE1TVkMgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCBzeW1ib2wgd2hlbgorLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorLy8gUHJpbnRzIHRoZSBnaXZlbiB3aWRlIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgordm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIG9zdHJlYW0qIG9zKSB7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICAqb3MgPDwgIk5VTEwiOworICB9IGVsc2UgeworICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7CisgICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocywgd2NzbGVuKHMpLCBvcyk7CisgIH0KK30KKyNlbmRpZiAgLy8gd2NoYXJfdCBpcyBuYXRpdmUKKworLy8gUHJpbnRzIGEgOjpzdHJpbmcgb2JqZWN0LgorI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCit2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCit2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdGQ6OnN0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIDo6d3N0cmluZyBvYmplY3QuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCit2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6d3N0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCit2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGVlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKK3VzaW5nIGludGVybmFsOjpHZXRVbml0VGVzdEltcGw7CisKKy8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sgdHJhY2UKKy8vIGluIGl0Lgorc3RkOjpzdHJpbmcgVGVzdFBhcnRSZXN1bHQ6OkV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RhY2tfdHJhY2UgPSBzdHJzdHIobWVzc2FnZSwgaW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyKTsKKyAgcmV0dXJuIHN0YWNrX3RyYWNlID09IE5VTEwgPyBtZXNzYWdlIDoKKyAgICAgIHN0ZDo6c3RyaW5nKG1lc3NhZ2UsIHN0YWNrX3RyYWNlKTsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmV0dXJuIG9zCisgICAgICA8PCByZXN1bHQuZmlsZV9uYW1lKCkgPDwgIjoiIDw8IHJlc3VsdC5saW5lX251bWJlcigpIDw8ICI6ICIKKyAgICAgIDw8IChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcyA/ICJTdWNjZXNzIiA6CisgICAgICAgICAgcmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/ICJGYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgIk5vbi1mYXRhbCBmYWlsdXJlIikgPDwgIjpcbiIKKyAgICAgIDw8IHJlc3VsdC5tZXNzYWdlKCkgPDwgc3RkOjplbmRsOworfQorCisvLyBBcHBlbmRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGFycmF5Lgordm9pZCBUZXN0UGFydFJlc3VsdEFycmF5OjpBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICBhcnJheV8ucHVzaF9iYWNrKHJlc3VsdCk7Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RQYXJ0UmVzdWx0IGF0IHRoZSBnaXZlbiBpbmRleCAoMC1iYXNlZCkuCitjb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFBhcnRSZXN1bHRBcnJheTo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGluZGV4KSBjb25zdCB7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSgpKSB7CisgICAgcHJpbnRmKCJcbkludmFsaWQgaW5kZXggKCVkKSBpbnRvIFRlc3RQYXJ0UmVzdWx0QXJyYXkuXG4iLCBpbmRleCk7CisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICB9CisKKyAgcmV0dXJuIGFycmF5X1tpbmRleF07Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzIGluIHRoZSBhcnJheS4KK2ludCBUZXN0UGFydFJlc3VsdEFycmF5OjpzaXplKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhcnJheV8uc2l6ZSgpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKQorICAgIDogaGFzX25ld19mYXRhbF9mYWlsdXJlXyhmYWxzZSksCisgICAgICBvcmlnaW5hbF9yZXBvcnRlcl8oR2V0VW5pdFRlc3RJbXBsKCktPgorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkpIHsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOworfQorCitIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6On5IYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKSB7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKKyAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyk7Cit9CisKK3ZvaWQgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIGlmIChyZXN1bHQuZmF0YWxseV9mYWlsZWQoKSkKKyAgICBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfID0gdHJ1ZTsKKyAgb3JpZ2luYWxfcmVwb3J0ZXJfLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDc5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGluIHN0ci4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgc3RyCisvLyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KK3N0YXRpYyBjb25zdCBjaGFyKiBTa2lwU3BhY2VzKGNvbnN0IGNoYXIqIHN0cikgeworICB3aGlsZSAoSXNTcGFjZSgqc3RyKSkKKyAgICBzdHIrKzsKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluCisvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKy8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuCitjb25zdCBjaGFyKiBUeXBlZFRlc3RDYXNlUFN0YXRlOjpWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAorICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnNldDxjb25zdCBjaGFyKj46OmNvbnN0X2l0ZXJhdG9yIERlZmluZWRUZXN0SXRlcjsKKyAgcmVnaXN0ZXJlZF8gPSB0cnVlOworCisgIC8vIFNraXAgaW5pdGlhbCB3aGl0ZXNwYWNlIGluIHJlZ2lzdGVyZWRfdGVzdHMgc2luY2Ugc29tZQorICAvLyBwcmVwcm9jZXNzb3JzIHByZWZpeCBzdHJpbmdpemllZCBsaXRlcmFscyB3aXRoIHdoaXRlc3BhY2UuCisgIHJlZ2lzdGVyZWRfdGVzdHMgPSBTa2lwU3BhY2VzKHJlZ2lzdGVyZWRfdGVzdHMpOworCisgIE1lc3NhZ2UgZXJyb3JzOworICA6OnN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0ZXN0czsKKyAgZm9yIChjb25zdCBjaGFyKiBuYW1lcyA9IHJlZ2lzdGVyZWRfdGVzdHM7IG5hbWVzICE9IE5VTEw7CisgICAgICAgbmFtZXMgPSBTa2lwQ29tbWEobmFtZXMpKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9IEdldFByZWZpeFVudGlsQ29tbWEobmFtZXMpOworICAgIGlmICh0ZXN0cy5jb3VudChuYW1lKSAhPSAwKSB7CisgICAgICBlcnJvcnMgPDwgIlRlc3QgIiA8PCBuYW1lIDw8ICIgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLlxuIjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKERlZmluZWRUZXN0SXRlciBpdCA9IGRlZmluZWRfdGVzdF9uYW1lc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGRlZmluZWRfdGVzdF9uYW1lc18uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAobmFtZSA9PSAqaXQpIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmQpIHsKKyAgICAgIHRlc3RzLmluc2VydChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgZXJyb3JzIDw8ICJObyB0ZXN0IG5hbWVkICIgPDwgbmFtZQorICAgICAgICAgICAgIDw8ICIgY2FuIGJlIGZvdW5kIGluIHRoaXMgdGVzdCBjYXNlLlxuIjsKKyAgICB9CisgIH0KKworICBmb3IgKERlZmluZWRUZXN0SXRlciBpdCA9IGRlZmluZWRfdGVzdF9uYW1lc18uYmVnaW4oKTsKKyAgICAgICBpdCAhPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmVuZCgpOworICAgICAgICsraXQpIHsKKyAgICBpZiAodGVzdHMuY291bnQoKml0KSA9PSAwKSB7CisgICAgICBlcnJvcnMgPDwgIllvdSBmb3Jnb3QgdG8gbGlzdCB0ZXN0ICIgPDwgKml0IDw8ICIuXG4iOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcnNfc3RyID0gZXJyb3JzLkdldFN0cmluZygpOworICBpZiAoZXJyb3JzX3N0ciAhPSAiIikgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICAgIGVycm9yc19zdHIuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkFib3J0KCk7CisgIH0KKworICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0czsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2N2U4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0LmNjCkBAIC0wLDAgKzEsNDgzOCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8d2NoYXIuaD4KKyNpbmNsdWRlIDx3Y3R5cGUuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZiBHVEVTVF9PU19MSU5VWAorCisvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YKKy8vIGdldHRpbWVvZmRheSgpLgorIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorCisjIGluY2x1ZGUgPGZjbnRsLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8bGltaXRzLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c2NoZWQuaD4gIC8vIE5PTElOVAorLy8gRGVjbGFyZXMgdnNucHJpbnRmKCkuICBUaGlzIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvbW1hbi5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3RyaW5nPgorCisjZWxpZiBHVEVTVF9PU19TWU1CSUFOCisjIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfWk9TCisjIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKworLy8gT24gei9PUyB3ZSBhZGRpdGlvbmFsbHkgbmVlZCBzdHJpbmdzLmggZm9yIHN0cmNhc2VjbXAuCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UuCisKKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCisKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIHByb3Blci4KKworIyBpbmNsdWRlIDxpby5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90aW1lYi5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBOT0xJTlQKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTX01JTkdXCisvLyBNaW5HVyBoYXMgZ2V0dGltZW9mZGF5KCkgYnV0IG5vdCBfZnRpbWU2NCgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyAgIGdldHRpbWVvZmRheSgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgdGltZSBvbgorLy8gICBXaW5kb3dzLCBsaWtlIEdldFRpY2tDb3VudCgpIG9yIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCkuICBNaW5HVworLy8gICBzdXBwb3J0cyB0aGVzZS4gIGNvbnNpZGVyIHVzaW5nIHRoZW0gaW5zdGVhZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01JTkdXCisKKy8vIGNwcGxpbnQgdGhpbmtzIHRoYXQgdGhlIGhlYWRlciBpcyBhbHJlYWR5IGluY2x1ZGVkLCBzbyB3ZSB3YW50IHRvCisvLyBzaWxlbmNlIGl0LgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKworI2Vsc2UKKworLy8gQXNzdW1lIG90aGVyIHBsYXRmb3JtcyBoYXZlIGdldHRpbWVvZmRheSgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyAgIGdldHRpbWVvZmRheSgpLgorIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorCisvLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bworLy8gc2lsZW5jZSBpdC4KKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAorCisjZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyBpbmNsdWRlIDxzdGRleGNlcHQ+CisjZW5kaWYKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8bmV0ZGIuaD4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBkZWZpbmUgdnNucHJpbnRmIF92c25wcmludGYKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgdGVzdGluZyB7CisKK3VzaW5nIGludGVybmFsOjpDb3VudElmOwordXNpbmcgaW50ZXJuYWw6OkZvckVhY2g7Cit1c2luZyBpbnRlcm5hbDo6R2V0RWxlbWVudE9yOwordXNpbmcgaW50ZXJuYWw6OlNodWZmbGU7CisKKy8vIENvbnN0YW50cy4KKworLy8gQSB0ZXN0IHdob3NlIHRlc3QgY2FzZSBuYW1lIG9yIHRlc3QgbmFtZSBtYXRjaGVzIHRoaXMgZmlsdGVyIGlzCisvLyBkaXNhYmxlZCBhbmQgbm90IHJ1bi4KK3N0YXRpYyBjb25zdCBjaGFyIGtEaXNhYmxlVGVzdEZpbHRlcltdID0gIkRJU0FCTEVEXyo6Ki9ESVNBQkxFRF8qIjsKKworLy8gQSB0ZXN0IGNhc2Ugd2hvc2UgbmFtZSBtYXRjaGVzIHRoaXMgZmlsdGVyIGlzIGNvbnNpZGVyZWQgYSBkZWF0aAorLy8gdGVzdCBjYXNlIGFuZCB3aWxsIGJlIHJ1biBiZWZvcmUgdGVzdCBjYXNlcyB3aG9zZSBuYW1lIGRvZXNuJ3QKKy8vIG1hdGNoIHRoaXMgZmlsdGVyLgorc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdENhc2VGaWx0ZXJbXSA9ICIqRGVhdGhUZXN0OipEZWF0aFRlc3QvKiI7CisKKy8vIEEgdGVzdCBmaWx0ZXIgdGhhdCBtYXRjaGVzIGV2ZXJ5dGhpbmcuCitzdGF0aWMgY29uc3QgY2hhciBrVW5pdmVyc2FsRmlsdGVyW10gPSAiKiI7CisKKy8vIFRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGZvciBYTUwgb3V0cHV0Lgorc3RhdGljIGNvbnN0IGNoYXIga0RlZmF1bHRPdXRwdXRGaWxlW10gPSAidGVzdF9kZXRhaWwueG1sIjsKKworLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIGluZGV4Lgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZEluZGV4W10gPSAiR1RFU1RfU0hBUkRfSU5ERVgiOworLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdCBzaGFyZHMuCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFRvdGFsU2hhcmRzW10gPSAiR1RFU1RfVE9UQUxfU0hBUkRTIjsKKy8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdGVzdCBzaGFyZCBzdGF0dXMgZmlsZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0U2hhcmRTdGF0dXNGaWxlW10gPSAiR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUiOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgdGV4dCB1c2VkIGluIGZhaWx1cmUgbWVzc2FnZXMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIHRoZQorLy8gc3RhY2sgdHJhY2UuCitjb25zdCBjaGFyIGtTdGFja1RyYWNlTWFya2VyW10gPSAiXG5TdGFjayB0cmFjZTpcbiI7CisKKy8vIGdfaGVscF9mbGFnIGlzIHRydWUgaWZmIHRoZSAtLWhlbHAgZmxhZyBvciBhbiBlcXVpdmFsZW50IGZvcm0gaXMKKy8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorYm9vbCBnX2hlbHBfZmxhZyA9IGZhbHNlOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyIsIGZhbHNlKSwKKyAgICAiUnVuIGRpc2FibGVkIHRlc3RzIHRvbywgaW4gYWRkaXRpb24gdG8gdGhlIHRlc3RzIG5vcm1hbGx5IGJlaW5nIHJ1bi4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGJyZWFrX29uX2ZhaWx1cmUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImJyZWFrX29uX2ZhaWx1cmUiLCBmYWxzZSksCisgICAgIlRydWUgaWZmIGEgZmFpbGVkIGFzc2VydGlvbiBzaG91bGQgYmUgYSBkZWJ1Z2dlciBicmVhay1wb2ludC4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGNhdGNoX2V4Y2VwdGlvbnMsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImNhdGNoX2V4Y2VwdGlvbnMiLCB0cnVlKSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXworICAgICIgc2hvdWxkIGNhdGNoIGV4Y2VwdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgdGVzdCBmYWlsdXJlcy4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgY29sb3IsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiY29sb3IiLCAiYXV0byIpLAorICAgICJXaGV0aGVyIHRvIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4gIFZhbGlkIHZhbHVlczogeWVzLCBubywgIgorICAgICJhbmQgYXV0by4gICdhdXRvJyBtZWFucyB0byB1c2UgY29sb3JzIGlmIHRoZSBvdXRwdXQgaXMgIgorICAgICJiZWluZyBzZW50IHRvIGEgdGVybWluYWwgYW5kIHRoZSBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlICIKKyAgICAiaXMgc2V0IHRvIHh0ZXJtLCB4dGVybS1jb2xvciwgeHRlcm0tMjU2Y29sb3IsIGxpbnV4IG9yIGN5Z3dpbi4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZmlsdGVyLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImZpbHRlciIsIGtVbml2ZXJzYWxGaWx0ZXIpLAorICAgICJBIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMgIgorICAgICJmb3IgZmlsdGVyaW5nIHRoZSB0ZXN0cyB0byBydW4sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAiCisgICAgIictJyBhbmQgYSA6IHNlcGFyYXRlZCBsaXN0IG9mIG5lZ2F0aXZlIHBhdHRlcm5zICh0ZXN0cyB0byAiCisgICAgImV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdCBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgIgorICAgICJwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKGxpc3RfdGVzdHMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICJMaXN0IGFsbCB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcgdGhlbS4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgb3V0cHV0LAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoIm91dHB1dCIsICIiKSwKKyAgICAiQSBmb3JtYXQgKGN1cnJlbnRseSBtdXN0IGJlIFwieG1sXCIpLCBvcHRpb25hbGx5IGZvbGxvd2VkICIKKyAgICAiYnkgYSBjb2xvbiBhbmQgYW4gb3V0cHV0IGZpbGUgbmFtZSBvciBkaXJlY3RvcnkuIEEgZGlyZWN0b3J5ICIKKyAgICAiaXMgaW5kaWNhdGVkIGJ5IGEgdHJhaWxpbmcgcGF0aG5hbWUgc2VwYXJhdG9yLiAiCisgICAgIkV4YW1wbGVzOiBcInhtbDpmaWxlbmFtZS54bWxcIiwgXCJ4bWw6OmRpcmVjdG9yeW5hbWUvXCIuICIKKyAgICAiSWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCBvdXRwdXQgZmlsZXMgd2lsbCBiZSBjcmVhdGVkICIKKyAgICAid2l0aGluIHRoYXQgZGlyZWN0b3J5LCB3aXRoIGZpbGUtbmFtZXMgYmFzZWQgb24gdGhlIHRlc3QgIgorICAgICJleGVjdXRhYmxlJ3MgbmFtZSBhbmQsIGlmIG5lY2Vzc2FyeSwgbWFkZSB1bmlxdWUgYnkgYWRkaW5nICIKKyAgICAiZGlnaXRzLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgcHJpbnRfdGltZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigicHJpbnRfdGltZSIsIHRydWUpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgZGlzcGxheSBlbGFwc2VkIHRpbWUgaW4gdGV4dCBvdXRwdXQuIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgcmFuZG9tX3NlZWQsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyYW5kb21fc2VlZCIsIDApLAorICAgICJSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIHdoZW4gc2h1ZmZsaW5nIHRlc3Qgb3JkZXJzLiAgTXVzdCBiZSBpbiByYW5nZSAiCisgICAgIlsxLCA5OTk5OV0sIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lLiIpOworCitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHJlcGVhdCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInJlcGVhdCIsIDEpLAorICAgICJIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgZWFjaCB0ZXN0LiAgU3BlY2lmeSBhIG5lZ2F0aXZlIG51bWJlciAiCisgICAgImZvciByZXBlYXRpbmcgZm9yZXZlci4gIFVzZWZ1bCBmb3Igc2hha2luZyBvdXQgZmxha3kgdGVzdHMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcywgZmFsc2UsCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8gIiBzaG91bGQgaW5jbHVkZSBpbnRlcm5hbCBzdGFjayBmcmFtZXMgd2hlbiAiCisgICAgInByaW50aW5nIHRlc3QgZmFpbHVyZSBzdGFjayB0cmFjZXMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBzaHVmZmxlLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJzaHVmZmxlIiwgZmFsc2UpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgcmFuZG9taXplIHRlc3RzJyBvcmRlciBvbiBldmVyeSBydW4uIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgc3RhY2tfdHJhY2VfZGVwdGgsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJzdGFja190cmFjZV9kZXB0aCIsIGtNYXhTdGFja1RyYWNlRGVwdGgpLAorICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIHByaW50IHdoZW4gYW4gIgorICAgICJhc3NlcnRpb24gZmFpbHMuICBUaGUgdmFsaWQgcmFuZ2UgaXMgMCB0aHJvdWdoIDEwMCwgaW5jbHVzaXZlLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBzdHJlYW1fcmVzdWx0X3RvLAorICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoInN0cmVhbV9yZXN1bHRfdG8iLCAiIiksCisgICAgIlRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIGhvc3QgbmFtZSBhbmQgdGhlIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRvIHN0cmVhbSAiCisgICAgInRlc3QgcmVzdWx0cy4gRXhhbXBsZTogXCJsb2NhbGhvc3Q6NTU1XCIuIFRoZSBmbGFnIGlzIGVmZmVjdGl2ZSBvbmx5IG9uICIKKyAgICAiTGludXguIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICB0aHJvd19vbl9mYWlsdXJlLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJ0aHJvd19vbl9mYWlsdXJlIiwgZmFsc2UpLAorICAgICJXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGEgZmFpbGVkIGFzc2VydGlvbiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiAiCisgICAgImlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgb3IgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIGEgbm9uLXplcm8gY29kZSAiCisgICAgIm90aGVyd2lzZS4iKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gR2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBmcm9tIFswLCByYW5nZSksIHVzaW5nIGEgTGluZWFyCisvLyBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIChMQ0cpLiAgQ3Jhc2hlcyBpZiAncmFuZ2UnIGlzIDAgb3IgZ3JlYXRlcgorLy8gdGhhbiBrTWF4UmFuZ2UuCitVSW50MzIgUmFuZG9tOjpHZW5lcmF0ZShVSW50MzIgcmFuZ2UpIHsKKyAgLy8gVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgc2FtZSBhcyBhcmUgdXNlZCBpbiBnbGliYydzIHJhbmQoMykuCisgIHN0YXRlXyA9ICgxMTAzNTE1MjQ1VSpzdGF0ZV8gKyAxMjM0NVUpICUga01heFJhbmdlOworCisgIEdURVNUX0NIRUNLXyhyYW5nZSA+IDApCisgICAgICA8PCAiQ2Fubm90IGdlbmVyYXRlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgMCkuIjsKKyAgR1RFU1RfQ0hFQ0tfKHJhbmdlIDw9IGtNYXhSYW5nZSkKKyAgICAgIDw8ICJHZW5lcmF0aW9uIG9mIGEgbnVtYmVyIGluIFswLCAiIDw8IHJhbmdlIDw8ICIpIHdhcyByZXF1ZXN0ZWQsICIKKyAgICAgIDw8ICJidXQgdGhpcyBjYW4gb25seSBnZW5lcmF0ZSBudW1iZXJzIGluIFswLCAiIDw8IGtNYXhSYW5nZSA8PCAiKS4iOworCisgIC8vIENvbnZlcnRpbmcgdmlhIG1vZHVsdXMgaW50cm9kdWNlcyBhIGJpdCBvZiBkb3dud2FyZCBiaWFzLCBidXQKKyAgLy8gaXQncyBzaW1wbGUsIGFuZCBhIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIGlzbid0IHRvbyBnb29kCisgIC8vIHRvIGJlZ2luIHdpdGguCisgIHJldHVybiBzdGF0ZV8gJSByYW5nZTsKK30KKworLy8gR1Rlc3RJc0luaXRpYWxpemVkKCkgcmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBoYXMgaW5pdGlhbGl6ZWQKKy8vIEdvb2dsZSBUZXN0LiAgVXNlZnVsIGZvciBjYXRjaGluZyB0aGUgdXNlciBtaXN0YWtlIG9mIG5vdCBpbml0aWFsaXppbmcKKy8vIEdvb2dsZSBUZXN0IGJlZm9yZSBjYWxsaW5nIFJVTl9BTExfVEVTVFMoKS4KKy8vCisvLyBBIHVzZXIgbXVzdCBjYWxsIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkgdG8gaW5pdGlhbGl6ZSBHb29nbGUKKy8vIFRlc3QuICBnX2luaXRfZ3Rlc3RfY291bnQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdGltZXMKKy8vIEluaXRHb29nbGVUZXN0KCkgaGFzIGJlZW4gY2FsbGVkLiAgV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHZhcmlhYmxlCisvLyB1bmRlciBhIG11dGV4IGFzIGl0IGlzIG9ubHkgYWNjZXNzZWQgaW4gdGhlIG1haW4gdGhyZWFkLgorR1RFU1RfQVBJXyBpbnQgZ19pbml0X2d0ZXN0X2NvdW50ID0gMDsKK3N0YXRpYyBib29sIEdUZXN0SXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIGdfaW5pdF9ndGVzdF9jb3VudCAhPSAwOyB9CisKKy8vIEl0ZXJhdGVzIG92ZXIgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLCBrZWVwaW5nIGEgcnVubmluZyBzdW0gb2YgdGhlCisvLyByZXN1bHRzIG9mIGNhbGxpbmcgYSBnaXZlbiBpbnQtcmV0dXJuaW5nIG1ldGhvZCBvbiBlYWNoLgorLy8gUmV0dXJucyB0aGUgc3VtLgorc3RhdGljIGludCBTdW1PdmVyVGVzdENhc2VMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4mIGNhc2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKFRlc3RDYXNlOjoqbWV0aG9kKSgpIGNvbnN0KSB7CisgIGludCBzdW0gPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhc2VfbGlzdC5zaXplKCk7IGkrKykgeworICAgIHN1bSArPSAoY2FzZV9saXN0W2ldLT4qbWV0aG9kKSgpOworICB9CisgIHJldHVybiBzdW07Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZVBhc3NlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPlBhc3NlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgorc3RhdGljIGJvb2wgVGVzdENhc2VGYWlsZWQoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5GYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0X2Nhc2UgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRlc3QgdGhhdCBzaG91bGQKKy8vIHJ1bi4KK3N0YXRpYyBib29sIFNob3VsZFJ1blRlc3RDYXNlKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpOworfQorCisvLyBBc3NlcnRIZWxwZXIgY29uc3RydWN0b3IuCitBc3NlcnRIZWxwZXI6OkFzc2VydEhlbHBlcihUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSkKKyAgICA6IGRhdGFfKG5ldyBBc3NlcnRIZWxwZXJEYXRhKHR5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpKSB7Cit9CisKK0Fzc2VydEhlbHBlcjo6fkFzc2VydEhlbHBlcigpIHsKKyAgZGVsZXRlIGRhdGFfOworfQorCisvLyBNZXNzYWdlIGFzc2lnbm1lbnQsIGZvciBhc3NlcnRpb24gc3RyZWFtaW5nIHN1cHBvcnQuCit2b2lkIEFzc2VydEhlbHBlcjo6b3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPgorICAgIEFkZFRlc3RQYXJ0UmVzdWx0KGRhdGFfLT50eXBlLCBkYXRhXy0+ZmlsZSwgZGF0YV8tPmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kVXNlck1lc3NhZ2UoZGF0YV8tPm1lc3NhZ2UsIG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCkKKyAgICAgICAgICAgICAgICAgICAgICAtPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSkKKyAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgorICAgICAgICAgICAgICAgICAgICAgICk7ICAvLyBOT0xJTlQKK30KKworLy8gTXV0ZXggZm9yIGxpbmtlZCBwb2ludGVycy4KK0dURVNUX0FQSV8gR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKKworLy8gQXBwbGljYXRpb24gcGF0aG5hbWUgZ290dGVuIGluIEluaXRHb29nbGVUZXN0Lgorc3RkOjpzdHJpbmcgZ19leGVjdXRhYmxlX3BhdGg7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24ncyBuYW1lLCByZW1vdmluZyBkaXJlY3RvcnkgcGF0aCBpZiB0aGF0CisvLyBpcyBwcmVzZW50LgorRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkgeworICBGaWxlUGF0aCByZXN1bHQ7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJlc3VsdC5TZXQoRmlsZVBhdGgoZ19leGVjdXRhYmxlX3BhdGgpLlJlbW92ZUV4dGVuc2lvbigiZXhlIikpOworI2Vsc2UKKyAgcmVzdWx0LlNldChGaWxlUGF0aChnX2V4ZWN1dGFibGVfcGF0aCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIHJlc3VsdC5SZW1vdmVEaXJlY3RvcnlOYW1lKCk7Cit9CisKKy8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCisKKy8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuCitzdGQ6OnN0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKKyAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpIHJldHVybiBzdGQ6OnN0cmluZygiIik7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIHJldHVybiAoY29sb24gPT0gTlVMTCkgPworICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcpIDoKKyAgICAgIHN0ZDo6c3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnLCBjb2xvbiAtIGd0ZXN0X291dHB1dF9mbGFnKTsKK30KKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIG91dHB1dCBmaWxlLCBvciB0aGUgZGVmYXVsdCBpZiBub25lCisvLyB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCitzdGQ6OnN0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKKyAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpCisgICAgcmV0dXJuICIiOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGNvbG9uID0gc3RyY2hyKGd0ZXN0X291dHB1dF9mbGFnLCAnOicpOworICBpZiAoY29sb24gPT0gTlVMTCkKKyAgICByZXR1cm4gaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKKyAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKAorICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkpLAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoa0RlZmF1bHRPdXRwdXRGaWxlKSkuc3RyaW5nKCk7CisKKyAgaW50ZXJuYWw6OkZpbGVQYXRoIG91dHB1dF9uYW1lKGNvbG9uICsgMSk7CisgIGlmICghb3V0cHV0X25hbWUuSXNBYnNvbHV0ZVBhdGgoKSkKKyAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBcc29tZVxwYXRoIGlzIG5vdCBhbiBhYnNvbHV0ZQorICAgIC8vIHBhdGggKGFzIGl0cyBtZWFuaW5nIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZHJpdmUpLCB5ZXQgdGhlCisgICAgLy8gZm9sbG93aW5nIGxvZ2ljIGZvciB0dXJuaW5nIGl0IGludG8gYW4gYWJzb2x1dGUgcGF0aCBpcyB3cm9uZy4KKyAgICAvLyBGaXggaXQuCisgICAgb3V0cHV0X25hbWUgPSBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkpLAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoY29sb24gKyAxKSk7CisKKyAgaWYgKCFvdXRwdXRfbmFtZS5Jc0RpcmVjdG9yeSgpKQorICAgIHJldHVybiBvdXRwdXRfbmFtZS5zdHJpbmcoKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggcmVzdWx0KGludGVybmFsOjpGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSgKKyAgICAgIG91dHB1dF9uYW1lLCBpbnRlcm5hbDo6R2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCksCisgICAgICBHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKSk7CisgIHJldHVybiByZXN1bHQuc3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHdpbGRjYXJkIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLiAgVGhlCisvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgorLy8KKy8vIFRoaXMgcmVjdXJzaXZlIGFsZ29yaXRobSBpc24ndCB2ZXJ5IGVmZmljaWVudCwgYnV0IGlzIGNsZWFyIGFuZAorLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjb25zdCBjaGFyICpwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cikgeworICBzd2l0Y2ggKCpwYXR0ZXJuKSB7CisgICAgY2FzZSAnXDAnOgorICAgIGNhc2UgJzonOiAgLy8gRWl0aGVyICc6JyBvciAnXDAnIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uCisgICAgICByZXR1cm4gKnN0ciA9PSAnXDAnOworICAgIGNhc2UgJz8nOiAgLy8gTWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICAgIHJldHVybiAqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOworICAgIGNhc2UgJyonOiAgLy8gTWF0Y2hlcyBhbnkgc3RyaW5nIChwb3NzaWJseSBlbXB0eSkgb2YgY2hhcmFjdGVycy4KKyAgICAgIHJldHVybiAoKnN0ciAhPSAnXDAnICYmIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4sIHN0ciArIDEpKSB8fAorICAgICAgICAgIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4gKyAxLCBzdHIpOworICAgIGRlZmF1bHQ6ICAvLyBOb24tc3BlY2lhbCBjaGFyYWN0ZXIuICBNYXRjaGVzIGl0c2VsZi4KKyAgICAgIHJldHVybiAqcGF0dGVybiA9PSAqc3RyICYmCisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOworICB9Cit9CisKK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpIHsKKyAgY29uc3QgY2hhciAqY3VyX3BhdHRlcm4gPSBmaWx0ZXI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoUGF0dGVybk1hdGNoZXNTdHJpbmcoY3VyX3BhdHRlcm4sIG5hbWUuY19zdHIoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZpbmRzIHRoZSBuZXh0IHBhdHRlcm4gaW4gdGhlIGZpbHRlci4KKyAgICBjdXJfcGF0dGVybiA9IHN0cmNocihjdXJfcGF0dGVybiwgJzonKTsKKworICAgIC8vIFJldHVybnMgaWYgbm8gbW9yZSBwYXR0ZXJuIGNhbiBiZSBmb3VuZC4KKyAgICBpZiAoY3VyX3BhdHRlcm4gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNraXBzIHRoZSBwYXR0ZXJuIHNlcGFyYXRlciAodGhlICc6JyBjaGFyYWN0ZXIpLgorICAgIGN1cl9wYXR0ZXJuKys7CisgIH0KK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQorLy8gbmFtZSBhbmQgdGhlIHRlc3QgbmFtZS4KK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lID0gdGVzdF9jYXNlX25hbWUgKyAiLiIgKyB0ZXN0X25hbWUuY19zdHIoKTsKKworICAvLyBTcGxpdCAtLWd0ZXN0X2ZpbHRlciBhdCAnLScsIGlmIHRoZXJlIGlzIG9uZSwgdG8gc2VwYXJhdGUgaW50bworICAvLyBwb3NpdGl2ZSBmaWx0ZXIgYW5kIG5lZ2F0aXZlIGZpbHRlciBwb3J0aW9ucworICBjb25zdCBjaGFyKiBjb25zdCBwID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGRhc2ggPSBzdHJjaHIocCwgJy0nKTsKKyAgc3RkOjpzdHJpbmcgcG9zaXRpdmU7CisgIHN0ZDo6c3RyaW5nIG5lZ2F0aXZlOworICBpZiAoZGFzaCA9PSBOVUxMKSB7CisgICAgcG9zaXRpdmUgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsgIC8vIFdob2xlIHN0cmluZyBpcyBhIHBvc2l0aXZlIGZpbHRlcgorICAgIG5lZ2F0aXZlID0gIiI7CisgIH0gZWxzZSB7CisgICAgcG9zaXRpdmUgPSBzdGQ6OnN0cmluZyhwLCBkYXNoKTsgICAvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBkYXNoCisgICAgbmVnYXRpdmUgPSBzdGQ6OnN0cmluZyhkYXNoICsgMSk7ICAvLyBFdmVyeXRoaW5nIGFmdGVyIHRoZSBkYXNoCisgICAgaWYgKHBvc2l0aXZlLmVtcHR5KCkpIHsKKyAgICAgIC8vIFRyZWF0ICctdGVzdDEnIGFzIHRoZSBzYW1lIGFzICcqLXRlc3QxJworICAgICAgcG9zaXRpdmUgPSBrVW5pdmVyc2FsRmlsdGVyOworICAgIH0KKyAgfQorCisgIC8vIEEgZmlsdGVyIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMuICBJdCBtYXRjaGVzIGEKKyAgLy8gdGVzdCBpZiBhbnkgcGF0dGVybiBpbiBpdCBtYXRjaGVzIHRoZSB0ZXN0LgorICByZXR1cm4gKE1hdGNoZXNGaWx0ZXIoZnVsbF9uYW1lLCBwb3NpdGl2ZS5jX3N0cigpKSAmJgorICAgICAgICAgICFNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgbmVnYXRpdmUuY19zdHIoKSkpOworfQorCisjaWYgR1RFU1RfSEFTX1NFSAorLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlCisvLyBnaXZlbiBTRUggZXhjZXB0aW9uLCBvciBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIIG90aGVyd2lzZS4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KK2ludCBVbml0VGVzdE9wdGlvbnM6OkdUZXN0U2hvdWxkUHJvY2Vzc1NFSChEV09SRCBleGNlcHRpb25fY29kZSkgeworICAvLyBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIGEgU0VIIGV4Y2VwdGlvbiBpZjoKKyAgLy8gICAxLiB0aGUgdXNlciB3YW50cyBpdCB0bywgQU5ECisgIC8vICAgMi4gdGhpcyBpcyBub3QgYSBicmVha3BvaW50IGV4Y2VwdGlvbiwgQU5ECisgIC8vICAgMy4gdGhpcyBpcyBub3QgYSBDKysgZXhjZXB0aW9uIChWQysrIGltcGxlbWVudHMgdGhlbSB2aWEgU0VILAorICAvLyAgICAgIGFwcGFyZW50bHkpLgorICAvLworICAvLyBTRUggZXhjZXB0aW9uIGNvZGUgZm9yIEMrKyBleGNlcHRpb25zLgorICAvLyAoc2VlIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTg1Mjk0IGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKyAgY29uc3QgRFdPUkQga0N4eEV4Y2VwdGlvbkNvZGUgPSAweGUwNmQ3MzYzOworCisgIGJvb2wgc2hvdWxkX2hhbmRsZSA9IHRydWU7CisKKyAgaWYgKCFHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKQorICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKKyAgZWxzZSBpZiAoZXhjZXB0aW9uX2NvZGUgPT0gRVhDRVBUSU9OX0JSRUFLUE9JTlQpCisgICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOworICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBrQ3h4RXhjZXB0aW9uQ29kZSkKKyAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7CisKKyAgcmV0dXJuIHNob3VsZF9oYW5kbGUgPyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIDogRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieQorLy8gR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCisvLyByZXN1bHRzLiBJbnRlcmNlcHRzIG9ubHkgZmFpbHVyZXMgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQuCitTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQorICAgIDogaW50ZXJjZXB0X21vZGVfKElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFEKSwKKyAgICAgIHJlc3VsdF8ocmVzdWx0KSB7CisgIEluaXQoKTsKK30KKworLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieQorLy8gR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCisvLyByZXN1bHRzLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkKKyAgICA6IGludGVyY2VwdF9tb2RlXyhpbnRlcmNlcHRfbW9kZSksCisgICAgICByZXN1bHRfKHJlc3VsdCkgeworICBJbml0KCk7Cit9CisKK3ZvaWQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkluaXQoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7CisgICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKyAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKHRoaXMpOworICB9IGVsc2UgeworICAgIG9sZF9yZXBvcnRlcl8gPSBpbXBsLT5HZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpOworICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOworICB9Cit9CisKKy8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5IEdvb2dsZSBUZXN0CisvLyBiZWZvcmUuCitTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6flNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgeworICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIob2xkX3JlcG9ydGVyXyk7CisgIH0gZWxzZSB7CisgICAgaW1wbC0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQob2xkX3JlcG9ydGVyXyk7CisgIH0KK30KKworLy8gSW5jcmVtZW50cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCBjb3VudCBhbmQgcmVtZW1iZXJzIHRoZSByZXN1bHQuCisvLyBUaGlzIG1ldGhvZCBpcyBmcm9tIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIGludGVyZmFjZS4KK3ZvaWQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmVzdWx0Xy0+QXBwZW5kKHJlc3VsdCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgV2Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoaXMKKy8vIGluc3RlYWQgb2YgR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gZ2V0IHRoZSB0eXBlIElEIG9mCisvLyB0ZXN0aW5nOjpUZXN0LiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4KKy8vIHVzaW5nIEdvb2dsZSBUZXN0IGFzIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMKKy8vIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZworLy8gb24gd2hldGhlciB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yCisvLyBmcm9tIHVzZXIgdGVzdCBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzCisvLyByZXR1cm4gdGhlIHNhbWUgdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlCisvLyBndGVzdC5jYywgd2hpY2ggaXMgd2l0aGluIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsuCitUeXBlSWQgR2V0VGVzdFR5cGVJZCgpIHsKKyAgcmV0dXJuIEdldFR5cGVJZDxUZXN0PigpOworfQorCisvLyBUaGUgdmFsdWUgb2YgR2V0VGVzdFR5cGVJZCgpIGFzIHNlZW4gZnJvbSB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0CisvLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLgorZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdCA9IEdldFRlc3RUeXBlSWQoKTsKKworLy8gVGhpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGNoZWNrcyB0aGF0ICdyZXN1bHRzJyBjb250YWlucyBhIHRlc3QgcGFydAorLy8gZmFpbHVyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zIHRoZQorLy8gZ2l2ZW4gc3Vic3RyaW5nLgorQXNzZXJ0aW9uUmVzdWx0IEhhc09uZUZhaWx1cmUoY29uc3QgY2hhciogLyogcmVzdWx0c19leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogdHlwZV9leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogc3Vic3RyX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5JiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkKHR5cGUgPT0gVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgPworICAgICAgICAgICAgICAgICAgICAgICAgIjEgZmF0YWwgZmFpbHVyZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgIjEgbm9uLWZhdGFsIGZhaWx1cmUiKTsKKyAgTWVzc2FnZSBtc2c7CisgIGlmIChyZXN1bHRzLnNpemUoKSAhPSAxKSB7CisgICAgbXNnIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiXG4iCisgICAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCByZXN1bHRzLnNpemUoKSA8PCAiIGZhaWx1cmVzIjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIG1zZyA8PCAiXG4iIDw8IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoaSk7CisgICAgfQorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnOworICB9CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHIgPSByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApOworICBpZiAoci50eXBlKCkgIT0gdHlwZSkgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHI7CisgIH0KKworICBpZiAoc3Ryc3RyKHIubWVzc2FnZSgpLCBzdWJzdHIuY19zdHIoKSkgPT0gTlVMTCkgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgY29udGFpbmluZyBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN1YnN0ciA8PCAiXCJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHI7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworfQorCisvLyBUaGUgY29uc3RydWN0b3Igb2YgU2luZ2xlRmFpbHVyZUNoZWNrZXIgcmVtZW1iZXJzIHdoZXJlIHRvIGxvb2sgdXAKKy8vIHRlc3QgcGFydCByZXN1bHRzLCB3aGF0IHR5cGUgb2YgZmFpbHVyZSB3ZSBleHBlY3QsIGFuZCB3aGF0CisvLyBzdWJzdHJpbmcgdGhlIGZhaWx1cmUgbWVzc2FnZSBzaG91bGQgY29udGFpbi4KK1NpbmdsZUZhaWx1cmVDaGVja2VyOjogU2luZ2xlRmFpbHVyZUNoZWNrZXIoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0cywKKyAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKQorICAgIDogcmVzdWx0c18ocmVzdWx0cyksCisgICAgICB0eXBlXyh0eXBlKSwKKyAgICAgIHN1YnN0cl8oc3Vic3RyKSB7fQorCisvLyBUaGUgZGVzdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgorLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbgorLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGEKKy8vIG5vbi1mYXRhbCBmYWlsdXJlIHdpbGwgYmUgZ2VuZXJhdGVkLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6On5TaW5nbGVGYWlsdXJlQ2hlY2tlcigpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhIYXNPbmVGYWlsdXJlLCAqcmVzdWx0c18sIHR5cGVfLCBzdWJzdHJfKTsKK30KKworRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KSA6IHVuaXRfdGVzdF8odW5pdF90ZXN0KSB7fQorCit2b2lkIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHVuaXRfdGVzdF8tPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+QWRkVGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKyAgdW5pdF90ZXN0Xy0+bGlzdGVuZXJzKCktPnJlcGVhdGVyKCktPk9uVGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKK30KKworRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KSA6IHVuaXRfdGVzdF8odW5pdF90ZXN0KSB7fQorCit2b2lkIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHVuaXRfdGVzdF8tPkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKS0+UmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKK30KKworLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCitUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKgorVW5pdFRlc3RJbXBsOjpHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCkgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJmdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4Xyk7CisgIHJldHVybiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKK30KKworLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcikgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJmdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4Xyk7CisgIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfID0gcmVwb3J0ZXI7Cit9CisKKy8vIFJldHVybnMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkgeworICByZXR1cm4gcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5nZXQoKTsKK30KKworLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgordm9pZCBVbml0VGVzdEltcGw6OlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uc2V0KHJlcG9ydGVyKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgVGVzdENhc2VQYXNzZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgVGVzdENhc2VGYWlsZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZXNfLnNpemUoKSk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKy8vIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBTaG91bGRSdW5UZXN0Q2FzZSk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgoraW50IFVuaXRUZXN0SW1wbDo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgoraW50IFVuaXRUZXN0SW1wbDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorLy8gdHJhY2UgYnV0IEJhcigpIGFuZCBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitzdGQ6OnN0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsKKyAgKHZvaWQpc2tpcF9jb3VudDsKKyAgcmV0dXJuICIiOworfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorVGltZUluTWlsbGlzIEdldFRpbWVJbk1pbGxpcygpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIDE5NzAtMDEtMDEgYW5kIDE2MDEtMDEtMDEgaW4gbWlsbGlzZWNvbmRzLgorICAvLyBodHRwOi8vYW5hbG9nb3VzLmJsb2dzcG90LmNvbS8yMDA1LzA0L2Vwb2NoLmh0bWwKKyAgY29uc3QgVGltZUluTWlsbGlzIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGEgPQorICAgIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4oMTE2NDQ0NzM2VUwpICogMTAwMDAwVUw7CisgIGNvbnN0IERXT1JEIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQgPSAxMDAwMDsKKworICBTWVNURU1USU1FIG5vd19zeXN0aW1lOworICBGSUxFVElNRSBub3dfZmlsZXRpbWU7CisgIFVMQVJHRV9JTlRFR0VSIG5vd19pbnQ2NDsKKyAgLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFNob3VsZG4ndCB0aGlzIGp1c3QgdXNlCisgIC8vICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKT8KKyAgR2V0U3lzdGVtVGltZSgmbm93X3N5c3RpbWUpOworICBpZiAoU3lzdGVtVGltZVRvRmlsZVRpbWUoJm5vd19zeXN0aW1lLCAmbm93X2ZpbGV0aW1lKSkgeworICAgIG5vd19pbnQ2NC5Mb3dQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3TG93RGF0ZVRpbWU7CisgICAgbm93X2ludDY0LkhpZ2hQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3SGlnaERhdGVUaW1lOworICAgIG5vd19pbnQ2NC5RdWFkUGFydCA9IChub3dfaW50NjQuUXVhZFBhcnQgLyBrVGVudGhNaWNyb3NJbk1pbGxpU2Vjb25kKSAtCisgICAgICBrSmF2YUVwb2NoVG9XaW5GaWxlVGltZURlbHRhOworICAgIHJldHVybiBub3dfaW50NjQuUXVhZFBhcnQ7CisgIH0KKyAgcmV0dXJuIDA7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9IQVNfR0VUVElNRU9GREFZXworICBfX3RpbWViNjQgbm93OworCisjIGlmZGVmIF9NU0NfVkVSCisKKyAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgX2Z0aW1lNjQoKSwgc28gd2Ugd2FudCB0byBzdXBwcmVzcyB3YXJuaW5nIDQ5OTYKKyAgLy8gKGRlcHJlY2F0ZWQgZnVuY3Rpb24pIHRoZXJlLgorICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIEdldFRpY2tDb3VudCgpPyAgT3IgdXNlCisgIC8vICAgU3lzdGVtVGltZVRvRmlsZVRpbWUoKQorIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDk5Ni4KKyAgX2Z0aW1lNjQoJm5vdyk7CisjICBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyMgZWxzZQorCisgIF9mdGltZTY0KCZub3cpOworCisjIGVuZGlmICAvLyBfTVNDX1ZFUgorCisgIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50aW1lKSAqIDEwMDAgKyBub3cubWlsbGl0bTsKKyNlbGlmIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCisgIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPihub3cudHZfc2VjKSAqIDEwMDAgKyBub3cudHZfdXNlYyAvIDEwMDA7CisjZWxzZQorIyBlcnJvciAiRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgb24geW91ciBzeXN0ZW0uIgorI2VuZGlmCit9CisKKy8vIFV0aWxpdGllcworCisvLyBjbGFzcyBTdHJpbmcuCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZworLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorLy8gaW5wdXQgaXMgTlVMTC4KK0xQQ1dTVFIgU3RyaW5nOjpBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBhbnNpKSB7CisgIGlmICghYW5zaSkgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYW5zaSk7CisgIGNvbnN0IGludCB1bmljb2RlX2xlbmd0aCA9CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKyAgV0NIQVIqIHVuaWNvZGUgPSBuZXcgV0NIQVJbdW5pY29kZV9sZW5ndGggKyAxXTsKKyAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCB1bmljb2RlX2xlbmd0aCk7CisgIHVuaWNvZGVbdW5pY29kZV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIHVuaWNvZGU7Cit9CisKKy8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKKy8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKy8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKy8vIGlucHV0IGlzIE5VTEwuCitjb25zdCBjaGFyKiBTdHJpbmc6OlV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKSAgeworICBpZiAoIXV0ZjE2X3N0cikgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBhbnNpX2xlbmd0aCA9CisgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgIGNoYXIqIGFuc2kgPSBuZXcgY2hhclthbnNpX2xlbmd0aCArIDFdOworICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICBhbnNpLCBhbnNpX2xlbmd0aCwgTlVMTCwgTlVMTCk7CisgIGFuc2lbYW5zaV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIGFuc2k7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisvLworLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAorLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmICggbGhzID09IE5VTEwgKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKCByaHMgPT0gTlVMTCApIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RyY21wKGxocywgcmhzKSA9PSAwOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBDb252ZXJ0cyBhbiBhcnJheSBvZiB3aWRlIGNoYXJzIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoZSBnaXZlbiBNZXNzYWdlIG9iamVjdC4KK3N0YXRpYyB2b2lkIFN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZShjb25zdCB3Y2hhcl90KiB3c3RyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1zZykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBsZW5ndGg7ICkgeyAgLy8gTk9MSU5UCisgICAgaWYgKHdzdHJbaV0gIT0gTCdcMCcpIHsKKyAgICAgICptc2cgPDwgV2lkZVN0cmluZ1RvVXRmOCh3c3RyICsgaSwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGggLSBpKSk7CisgICAgICB3aGlsZSAoaSAhPSBsZW5ndGggJiYgd3N0cltpXSAhPSBMJ1wwJykKKyAgICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICAqbXNnIDw8ICdcMCc7CisgICAgICBpKys7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCitNZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCA6OnN0ZDo6d3N0cmluZyYgd3N0cikgeworICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7CisgIHJldHVybiAqdGhpczsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKSB7CisgIGludGVybmFsOjpTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2Uod3N0ci5jX3N0cigpLCB3c3RyLmxlbmd0aCgpLCB0aGlzKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworLy8gQXNzZXJ0aW9uUmVzdWx0IGNvbnN0cnVjdG9ycy4KKy8vIFVzZWQgaW4gRVhQRUNUX1RSVUUvRkFMU0UoYXNzZXJ0aW9uX3Jlc3VsdCkuCitBc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdChjb25zdCBBc3NlcnRpb25SZXN1bHQmIG90aGVyKQorICAgIDogc3VjY2Vzc18ob3RoZXIuc3VjY2Vzc18pLAorICAgICAgbWVzc2FnZV8ob3RoZXIubWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCA/CisgICAgICAgICAgICAgICBuZXcgOjpzdGQ6OnN0cmluZygqb3RoZXIubWVzc2FnZV8pIDoKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oTlVMTCkpIHsKK30KKworLy8gUmV0dXJucyB0aGUgYXNzZXJ0aW9uJ3MgbmVnYXRpb24uIFVzZWQgd2l0aCBFWFBFQ1QvQVNTRVJUX0ZBTFNFLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblJlc3VsdDo6b3BlcmF0b3IhKCkgY29uc3QgeworICBBc3NlcnRpb25SZXN1bHQgbmVnYXRpb24oIXN1Y2Nlc3NfKTsKKyAgaWYgKG1lc3NhZ2VfLmdldCgpICE9IE5VTEwpCisgICAgbmVnYXRpb24gPDwgKm1lc3NhZ2VfOworICByZXR1cm4gbmVnYXRpb247Cit9CisKKy8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKSB7CisgIHJldHVybiBBc3NlcnRpb25SZXN1bHQodHJ1ZSk7Cit9CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpIHsKKyAgcmV0dXJuIEFzc2VydGlvblJlc3VsdChmYWxzZSk7Cit9CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgorLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2U7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgorLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KKy8vCisvLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCisvLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCisvLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6CisvLworLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgorLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgorLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKKy8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCisvLworLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQorLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKKy8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCitBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JpbmdfY2FzZSkgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBhY3R1YWxfZXhwcmVzc2lvbjsKKyAgaWYgKGFjdHVhbF92YWx1ZSAhPSBhY3R1YWxfZXhwcmVzc2lvbikgeworICAgIG1zZyA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsdWU7CisgIH0KKworICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfZXhwcmVzc2lvbjsKKyAgaWYgKGlnbm9yaW5nX2Nhc2UpIHsKKyAgICBtc2cgPDwgIiAoaWdub3JpbmcgY2FzZSkiOworICB9CisgIGlmIChleHBlY3RlZF92YWx1ZSAhPSBleHBlY3RlZF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbldoaWNoIGlzOiAiIDw8IGV4cGVjdGVkX3ZhbHVlOworICB9CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7Cit9CisKKy8vIENvbnN0cnVjdHMgYSBmYWlsdXJlIG1lc3NhZ2UgZm9yIEJvb2xlYW4gYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLgorc3RkOjpzdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKAorICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwKKyAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCisgICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpIHsKKyAgY29uc3QgY2hhciogYWN0dWFsX21lc3NhZ2UgPSBhc3NlcnRpb25fcmVzdWx0Lm1lc3NhZ2UoKTsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiVmFsdWUgb2Y6ICIgPDwgZXhwcmVzc2lvbl90ZXh0CisgICAgICA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlOworICBpZiAoYWN0dWFsX21lc3NhZ2VbMF0gIT0gJ1wwJykKKyAgICBtc2cgPDwgIiAoIiA8PCBhY3R1YWxfbWVzc2FnZSA8PCAiKSI7CisgIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWU7CisgIHJldHVybiBtc2cuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ORUFSLgorQXNzZXJ0aW9uUmVzdWx0IERvdWJsZU5lYXJQcmVkRm9ybWF0KGNvbnN0IGNoYXIqIGV4cHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpIHsKKyAgY29uc3QgZG91YmxlIGRpZmYgPSBmYWJzKHZhbDEgLSB2YWwyKTsKKyAgaWYgKGRpZmYgPD0gYWJzX2Vycm9yKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIC8vIFRPRE8od2FuKTogZG8gbm90IHByaW50IHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uIGlmIGl0J3MKKyAgLy8gYWxyZWFkeSBhIGxpdGVyYWwuCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIgPDwgZXhwcjEgPDwgIiBhbmQgIiA8PCBleHByMgorICAgICAgPDwgIiBpcyAiIDw8IGRpZmYgPDwgIiwgd2hpY2ggZXhjZWVkcyAiIDw8IGFic19lcnJvcl9leHByIDw8ICIsIHdoZXJlXG4iCisgICAgICA8PCBleHByMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDEgPDwgIixcbiIKKyAgICAgIDw8IGV4cHIyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMiA8PCAiLCBhbmRcbiIKKyAgICAgIDw8IGFic19lcnJvcl9leHByIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgYWJzX2Vycm9yIDw8ICIuIjsKK30KKworCisvLyBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBGbG9hdExFKCkgYW5kIERvdWJsZUxFKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK0Fzc2VydGlvblJlc3VsdCBGbG9hdGluZ1BvaW50TEUoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgdmFsMikgeworICAvLyBSZXR1cm5zIHN1Y2Nlc3MgaWYgdmFsMSBpcyBsZXNzIHRoYW4gdmFsMiwKKyAgaWYgKHZhbDEgPCB2YWwyKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vIG9yIGlmIHZhbDEgaXMgYWxtb3N0IGVxdWFsIHRvIHZhbDIuCisgIGNvbnN0IEZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gbGhzKHZhbDEpLCByaHModmFsMik7CisgIGlmIChsaHMuQWxtb3N0RXF1YWxzKHJocykpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBhYm92ZSB0d28gY2hlY2tzIHdpbGwgYm90aCBmYWlsIGlmIGVpdGhlciB2YWwxIG9yCisgIC8vIHZhbDIgaXMgTmFOLCBhcyB0aGUgSUVFRSBmbG9hdGluZy1wb2ludCBzdGFuZGFyZCByZXF1aXJlcyB0aGF0CisgIC8vIGFueSBwcmVkaWNhdGUgaW52b2x2aW5nIGEgTmFOIG11c3QgcmV0dXJuIGZhbHNlLgorCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gdmFsMV9zczsKKyAgdmFsMV9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgPDwgdmFsMTsKKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDJfc3M7CisgIHZhbDJfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgIDw8IHZhbDI7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSA8PSAoIiA8PCBleHByMiA8PCAiKVxuIgorICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZ2YWwxX3NzKSA8PCAiIHZzICIKKyAgICAgIDw8IFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZ2YWwyX3NzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKKy8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgorQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxmbG9hdD4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsKK30KKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitBc3NlcnRpb25SZXN1bHQgRG91YmxlTEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxkb3VibGU+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUSB3aXRoIGludCBvciBlbnVtCisvLyBhcmd1bWVudHMuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7CisgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoYWN0dWFsLCBleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8gd2l0aCBpbnRlZ2VyIG9yIGVudW0gYXJndW1lbnRzLiAgSXQgaXMgaGVyZQorLy8ganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZSBvZiBzaW1pbGFyIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCB2YWwxLCBCaWdnZXN0SW50IHZhbDIpIHtcCisgIGlmICh2YWwxIG9wIHZhbDIpIHtcCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCisgIH0gZWxzZSB7XAorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgXAorICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpICIgI29wICIgKCIgPDwgZXhwcjJcCisgICAgICAgIDw8ICIpLCBhY3R1YWw6ICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDEsIHZhbDIpXAorICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpO1wKKyAgfVwKK30KKworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTkUgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhORSwgIT0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRSB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExFLCA8PSkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xUIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwgKQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR0Ugd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HVCB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdULCA+ICkKKworI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkVRLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKSB7CisgIGlmIChTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKSB7CisgIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICB0cnVlKTsKK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUk5FLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMikgeworICBpZiAoIVN0cmluZzo6Q1N0cmluZ0VxdWFscyhzMSwgczIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKKyAgfQorfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKKyAgaWYgKCFTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKKyAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSAoaWdub3JpbmcgY2FzZSksIGFjdHVhbDogXCIiCisgICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIElzU3ViU3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkuCisKKy8vIFRoaXMgZ3JvdXAgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcmV0dXJuIHRydWUgaWZmIG5lZWRsZSBpcyBhCisvLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2suICBOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmCisvLyBvbmx5LgorCitib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7CisgIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7CisKKyAgcmV0dXJuIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOworfQorCitib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7CisKKyAgcmV0dXJuIHdjc3N0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOworfQorCisvLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGVpdGhlciA6OnN0ZDo6c3RyaW5nIG9yIDo6c3RkOjp3c3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Citib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgeworICByZXR1cm4gaGF5c3RhY2suZmluZChuZWVkbGUpICE9IFN0cmluZ1R5cGU6Om5wb3M7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBlaXRoZXIgSXNTdWJzdHJpbmcoKSBvciBJc05vdFN1YnN0cmluZygpLAorLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nIHBhcmFtZXRlci4KKy8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgY29uc3QgY2hhciosIGNvbnN0IHdjaGFyX3QqLCA6OnN0ZDo6c3RyaW5nLAorLy8gb3IgOjpzdGQ6OndzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZ0ltcGwoCisgICAgYm9vbCBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcsCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLCBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgeworICBpZiAoSXNTdWJzdHJpbmdQcmVkKG5lZWRsZSwgaGF5c3RhY2spID09IGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZykKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIGNvbnN0IGJvb2wgaXNfd2lkZV9zdHJpbmcgPSBzaXplb2YobmVlZGxlWzBdKSA+IDE7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGJlZ2luX3N0cmluZ19xdW90ZSA9IGlzX3dpZGVfc3RyaW5nID8gIkxcIiIgOiAiXCIiOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiVmFsdWUgb2Y6ICIgPDwgbmVlZGxlX2V4cHIgPDwgIlxuIgorICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBuZWVkbGUgPDwgIlwiXG4iCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgKGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyA/ICIiIDogIm5vdCAiKQorICAgICAgPDwgImEgc3Vic3RyaW5nIG9mICIgPDwgaGF5c3RhY2tfZXhwciA8PCAiXG4iCisgICAgICA8PCAiV2hpY2ggaXM6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IGhheXN0YWNrIDw8ICJcIiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEKKy8vIHN1YnN0cmluZyBvZiBoYXlzdGFjayAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgorLy8gb25seSksIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIElzSFJFU1VMVHtTdWNjZXNzRmFpbHVyZX0gcHJlZGljYXRlcworQXNzZXJ0aW9uUmVzdWx0IEhSRVNVTFRGYWlsdXJlSGVscGVyKGNvbnN0IGNoYXIqIGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocikgeyAgLy8gTk9MSU5UCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgLy8gV2luZG93cyBDRSBkb2Vzbid0IHN1cHBvcnQgRm9ybWF0TWVzc2FnZS4KKyAgY29uc3QgY2hhciBlcnJvcl90ZXh0W10gPSAiIjsKKworIyBlbHNlCisKKyAgLy8gTG9va3MgdXAgdGhlIGh1bWFuLXJlYWRhYmxlIHN5c3RlbSBtZXNzYWdlIGZvciB0aGUgSFJFU1VMVCBjb2RlCisgIC8vIGFuZCBzaW5jZSB3ZSdyZSBub3QgcGFzc2luZyBhbnkgcGFyYW1zIHRvIEZvcm1hdE1lc3NhZ2UsIHdlIGRvbid0CisgIC8vIHdhbnQgaW5zZXJ0cyBleHBhbmRlZC4KKyAgY29uc3QgRFdPUkQga0ZsYWdzID0gRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUzsKKyAgY29uc3QgRFdPUkQga0J1ZlNpemUgPSA0MDk2OyAgLy8gU3RyaW5nOjpGb3JtYXQgY2FuJ3QgZXhjZWVkIHRoaXMgbGVuZ3RoLgorICAvLyBHZXRzIHRoZSBzeXN0ZW0ncyBodW1hbiByZWFkYWJsZSBtZXNzYWdlIHN0cmluZyBmb3IgdGhpcyBIUkVTVUxULgorICBjaGFyIGVycm9yX3RleHRba0J1ZlNpemVdID0geyAnXDAnIH07CisgIERXT1JEIG1lc3NhZ2VfbGVuZ3RoID0gOjpGb3JtYXRNZXNzYWdlQShrRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gbm8gc291cmNlLCB3ZSdyZSBhc2tpbmcgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBociwgIC8vIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIGxpbmUgd2lkdGggcmVzdHJpY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0LCAgLy8gb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0J1ZlNpemUsICAvLyBidWYgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvLyBubyBhcmd1bWVudHMgZm9yIGluc2VydHMKKyAgLy8gVHJpbXMgdGFpbGluZyB3aGl0ZSBzcGFjZSAoRm9ybWF0TWVzc2FnZSBsZWF2ZXMgYSB0cmFpbGluZyBjci1sZikKKyAgZm9yICg7IG1lc3NhZ2VfbGVuZ3RoICYmIElzU3BhY2UoZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdKTsKKyAgICAgICAgICAtLW1lc3NhZ2VfbGVuZ3RoKSB7CisgICAgZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdID0gJ1wwJzsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVycm9yX2hleChTdHJpbmc6OkZvcm1hdCgiMHglMDhYICIsIGhyKSk7CisgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cHIgPDwgIiAiIDw8IGV4cGVjdGVkIDw8ICIuXG4iCisgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgZXJyb3JfaGV4IDw8IGVycm9yX3RleHQgPDwgIlxuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0Fzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRTdWNjZXNzKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVAorICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKyAgcmV0dXJuIEhSRVNVTFRGYWlsdXJlSGVscGVyKGV4cHIsICJzdWNjZWVkcyIsIGhyKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgImZhaWxzIiwgaHIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIFVuaWNvZGUgdGV4dCAod2lkZSBzdHJpbmdzKSBpbgorLy8gVVRGLTguCisKKy8vIEEgVW5pY29kZSBjb2RlLXBvaW50IGNhbiBoYXZlIHVwdG8gMjEgYml0cywgYW5kIGlzIGVuY29kZWQgaW4gVVRGLTgKKy8vIGxpa2UgdGhpczoKKy8vCisvLyBDb2RlLXBvaW50IGxlbmd0aCAgIEVuY29kaW5nCisvLyAgIDAgLSAgNyBiaXRzICAgICAgIDB4eHh4eHh4CisvLyAgIDggLSAxMSBiaXRzICAgICAgIDExMHh4eHh4IDEweHh4eHh4CisvLyAgMTIgLSAxNiBiaXRzICAgICAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4CisvLyAgMTcgLSAyMSBiaXRzICAgICAgIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSBvbmUtYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQxID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgIDcpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHR3by1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDIgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNSArIDYpKSAtIDE7CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSB0aHJlZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDMgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNCArIDIqNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIGZvdXItYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQ0ID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgKDMgKyAzKjYpKSAtIDE7CisKKy8vIENob3BzIG9mZiB0aGUgbiBsb3dlc3QgYml0cyBmcm9tIGEgYml0IHBhdHRlcm4uICBSZXR1cm5zIHRoZSBuCisvLyBsb3dlc3QgYml0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBvcmlnaW5hbCBiaXQgcGF0dGVybiB3aWxsIGJlCisvLyBzaGlmdGVkIHRvIHRoZSByaWdodCBieSBuIGJpdHMuCitpbmxpbmUgVUludDMyIENob3BMb3dCaXRzKFVJbnQzMiogYml0cywgaW50IG4pIHsKKyAgY29uc3QgVUludDMyIGxvd19iaXRzID0gKmJpdHMgJiAoKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgbikgLSAxKTsKKyAgKmJpdHMgPj49IG47CisgIHJldHVybiBsb3dfYml0czsKK30KKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gVGhlIG91dHB1dCBidWZmZXIgc3RyIG11c3QgY29udGFpbnQgYXQgbGVhc3QgMzIgY2hhcmFjdGVycy4KKy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLgorY2hhciogQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50LCBjaGFyKiBzdHIpIHsKKyAgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDEpIHsKKyAgICBzdHJbMV0gPSAnXDAnOworICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHh4eHh4eHgKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQyKSB7CisgICAgc3RyWzJdID0gJ1wwJzsKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhDMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTB4eHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDMpIHsKKyAgICBzdHJbM10gPSAnXDAnOworICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhFMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTEweHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDQpIHsKKyAgICBzdHJbNF0gPSAnXDAnOworICAgIHN0clszXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RjAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMTB4eHgKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgbG9uZ2VzdCBzdHJpbmcgU3RyaW5nOjpGb3JtYXQgY2FuIHByb2R1Y2Ugd2hlbiBpbnZva2VkCisgICAgLy8gd2l0aCB0aGVzZSBwYXJhbWV0ZXJzIGlzIDI4IGNoYXJhY3RlciBsb25nIChub3QgaW5jbHVkaW5nCisgICAgLy8gdGhlIHRlcm1pbmF0aW5nIG51bCBjaGFyYWN0ZXIpLiBXZSBhcmUgYXNraW5nIGZvciAzMiBjaGFyYWN0ZXIKKyAgICAvLyBidWZmZXIganVzdCBpbiBjYXNlLiBUaGlzIGlzIGFsc28gZW5vdWdoIGZvciBzdHJuY3B5IHRvCisgICAgLy8gbnVsbC10ZXJtaW5hdGUgdGhlIGRlc3RpbmF0aW9uIHN0cmluZy4KKyAgICBwb3NpeDo6U3RyTkNweSgKKyAgICAgICAgc3RyLCBTdHJpbmc6OkZvcm1hdCgiKEludmFsaWQgVW5pY29kZSAweCVYKSIsIGNvZGVfcG9pbnQpLmNfc3RyKCksIDMyKTsKKyAgICBzdHJbMzFdID0gJ1wwJzsgIC8vIE1ha2VzIHN1cmUgbm8gY2hhbmdlIGluIHRoZSBmb3JtYXQgdG8gc3RybmNweSBsZWF2ZXMKKyAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHQgdW50ZXJtaW5hdGVkLgorICB9CisgIHJldHVybiBzdHI7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaWYgdGhlIHRoZSBzeXN0ZW0KKy8vIHVzZXMgVVRGLTE2IGZvciB3aWRlIHN0cmluZyBlbmNvZGluZy4gQWxsIHN1cHBvcnRlZCBzeXN0ZW1zCisvLyB3aXRoIDE2IGJpdCB3Y2hhcl90IChXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpIGRvIHVzZSBVVEYtMTYuCisKKy8vIERldGVybWluZXMgaWYgdGhlIGFyZ3VtZW50cyBjb25zdGl0dXRlIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorLy8gYW5kIHRodXMgc2hvdWxkIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgVW5pY29kZSBjb2RlIHBvaW50CisvLyB1c2luZyBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyLgoraW5saW5lIGJvb2wgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwgd2NoYXJfdCBzZWNvbmQpIHsKKyAgcmV0dXJuIHNpemVvZih3Y2hhcl90KSA9PSAyICYmCisgICAgICAoZmlyc3QgJiAweEZDMDApID09IDB4RDgwMCAmJiAoc2Vjb25kICYgMHhGQzAwKSA9PSAweERDMDA7Cit9CisKKy8vIENyZWF0ZXMgYSBVbmljb2RlIGNvZGUgcG9pbnQgZnJvbSBVVEYxNiBzdXJyb2dhdGUgcGFpci4KK2lubGluZSBVSW50MzIgQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgc2Vjb25kKSB7CisgIGNvbnN0IFVJbnQzMiBtYXNrID0gKDEgPDwgMTApIC0gMTsKKyAgcmV0dXJuIChzaXplb2Yod2NoYXJfdCkgPT0gMikgPworICAgICAgKCgoZmlyc3QgJiBtYXNrKSA8PCAxMCkgfCAoc2Vjb25kICYgbWFzaykpICsgMHgxMDAwMCA6CisgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbmRpdGlvbiBpcworICAgICAgLy8gZmFsc2UsIGJ1dCB3ZSBwcm92aWRlIGEgc2Vuc2libGUgZGVmYXVsdCBpbiBjYXNlIGl0IGlzLgorICAgICAgc3RhdGljX2Nhc3Q8VUludDMyPihmaXJzdCk7Cit9CisKKy8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKKy8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKKy8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgorLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKKy8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZworLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KKy8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZworLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCisvLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCitzdGQ6OnN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycykgeworICBpZiAobnVtX2NoYXJzID09IC0xKQorICAgIG51bV9jaGFycyA9IHN0YXRpY19jYXN0PGludD4od2NzbGVuKHN0cikpOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7CisgICAgVUludDMyIHVuaWNvZGVfY29kZV9wb2ludDsKKworICAgIGlmIChzdHJbaV0gPT0gTCdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoaSArIDEgPCBudW1fY2hhcnMgJiYgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLCBzdHJbaSArIDFdKSkgeworICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpICsgMV0pOworICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHN0cltpXSk7CisgICAgfQorCisgICAgY2hhciBidWZmZXJbMzJdOyAgLy8gQ29kZVBvaW50VG9VdGY4IHJlcXVpcmVzIGEgYnVmZmVyIHRoaXMgYmlnLgorICAgIHN0cmVhbSA8PCBDb2RlUG9pbnRUb1V0ZjgodW5pY29kZV9jb2RlX3BvaW50LCBidWZmZXIpOworICB9CisgIHJldHVybiBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGFuIHN0ZDo6c3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KKy8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuCitzdGQ6OnN0cmluZyBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90ICogd2lkZV9jX3N0cikgeworICBpZiAod2lkZV9jX3N0ciA9PSBOVUxMKSAgcmV0dXJuICIobnVsbCkiOworCisgIHJldHVybiBpbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmOCh3aWRlX2Nfc3RyLCAtMSk7Cit9CisKKy8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCisvLyBjb250ZW50LgorLy8KKy8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKKy8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QgKiBsaHMsIGNvbnN0IHdjaGFyX3QgKiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHdjc2NtcChsaHMsIHJocykgPT0gMDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpIHsKKyAgaWYgKCFTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpLCBhY3R1YWw6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBQcmludFRvU3RyaW5nKHMxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCBQcmludFRvU3RyaW5nKHMyKTsKK30KKworLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlCisvLyB0aGUgc2FtZSBjb250ZW50LgorLy8KKy8vIFVubGlrZSBzdHJjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQorLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KK2Jvb2wgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIgKiBsaHMsIGNvbnN0IGNoYXIgKiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKQorICAgIHJldHVybiByaHMgPT0gTlVMTDsKKyAgaWYgKHJocyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHBvc2l4OjpTdHJDYXNlQ21wKGxocywgcmhzKSA9PSAwOworfQorCisgIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQorICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgorICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIHdpZGUgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4KKyAgLy8gT24gd2luZG93cywgdGhpcyBtZXRob2QgdXNlcyBfd2NzaWNtcCB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUKKyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXAKKyAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgLy8gT24gTWFjT1MgWCwgaXQgdXNlcyB0b3dsb3dlciwgd2hpY2ggYWxzbyB1c2VzIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZQorICAvLyBjdXJyZW50IGxvY2FsZS4KK2Jvb2wgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkgcmV0dXJuIHJocyA9PSBOVUxMOworCisgIGlmIChyaHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXR1cm4gX3djc2ljbXAobGhzLCByaHMpID09IDA7CisjZWxpZiBHVEVTVF9PU19MSU5VWCAmJiAhR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorICByZXR1cm4gd2NzY2FzZWNtcChsaHMsIHJocykgPT0gMDsKKyNlbHNlCisgIC8vIEFuZHJvaWQsIE1hYyBPUyBYIGFuZCBDeWd3aW4gZG9uJ3QgZGVmaW5lIHdjc2Nhc2VjbXAuCisgIC8vIE90aGVyIHVua25vd24gT1NlcyBtYXkgbm90IGRlZmluZSBpdCBlaXRoZXIuCisgIHdpbnRfdCBsZWZ0LCByaWdodDsKKyAgZG8geworICAgIGxlZnQgPSB0b3dsb3dlcigqbGhzKyspOworICAgIHJpZ2h0ID0gdG93bG93ZXIoKnJocysrKTsKKyAgfSB3aGlsZSAobGVmdCAmJiBsZWZ0ID09IHJpZ2h0KTsKKyAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7CisjZW5kaWYgIC8vIE9TIHNlbGVjdG9yCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgc3RyIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBpZ25vcmluZyBjYXNlLgorLy8gQW55IHN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGFuIGVtcHR5IHN1ZmZpeC4KK2Jvb2wgU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KSB7CisgIGNvbnN0IHNpemVfdCBzdHJfbGVuID0gc3RyLmxlbmd0aCgpOworICBjb25zdCBzaXplX3Qgc3VmZml4X2xlbiA9IHN1ZmZpeC5sZW5ndGgoKTsKKyAgcmV0dXJuIChzdHJfbGVuID49IHN1ZmZpeF9sZW4pICYmCisgICAgICAgICBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHN0ci5jX3N0cigpICsgc3RyX2xlbiAtIHN1ZmZpeF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeC5jX3N0cigpKTsKK30KKworLy8gRm9ybWF0cyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIGFuIHN0ZDo6c3RyaW5nLCB1c2luZyB0aGUgc2FtZSBmb3JtYXQKKy8vIHNwZWMgc3RyaW5nIGFzIGZvciBwcmludGYuCisvLworLy8gV2UgZG8gbm90IHVzZSB0aGUgU3RyaW5nUHJpbnRmIGNsYXNzIGFzIGl0IGlzIG5vdCB1bml2ZXJzYWxseQorLy8gYXZhaWxhYmxlLgorLy8KKy8vIFRoZSByZXN1bHQgaXMgbGltaXRlZCB0byA0MDk2IGNoYXJhY3RlcnMgKGluY2x1ZGluZyB0aGUgdGFpbGluZyAwKS4KKy8vIElmIDQwOTYgY2hhcmFjdGVycyBhcmUgbm90IGVub3VnaCB0byBmb3JtYXQgdGhlIGlucHV0LCBvciBpZgorLy8gdGhlcmUncyBhbiBlcnJvciwgIjxmb3JtYXR0aW5nIGVycm9yIG9yIGJ1ZmZlciBleGNlZWRlZD4iIGlzCisvLyByZXR1cm5lZC4KK3N0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0KGNvbnN0IGNoYXIgKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgY2hhciBidWZmZXJbNDA5Nl07CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IHNpemVvZihidWZmZXIpL3NpemVvZihidWZmZXJbMF0pOworCisgIC8vIE1TVkMgOCBkZXByZWNhdGVzIHZzbnByaW50ZigpLCBzbyB3ZSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmcKKyAgLy8gNDk5NiAoZGVwcmVjYXRlZCBmdW5jdGlvbikgdGhlcmUuCisjaWZkZWYgX01TQ19WRVIgIC8vIFdlIGFyZSB1c2luZyBNU1ZDLgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYuCisKKyAgY29uc3QgaW50IHNpemUgPSB2c25wcmludGYoYnVmZmVyLCBrQnVmZmVyU2l6ZSwgZm9ybWF0LCBhcmdzKTsKKworIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbHNlICAvLyBXZSBhcmUgbm90IHVzaW5nIE1TVkMuCisgIGNvbnN0IGludCBzaXplID0gdnNucHJpbnRmKGJ1ZmZlciwga0J1ZmZlclNpemUsIGZvcm1hdCwgYXJncyk7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisgIHZhX2VuZChhcmdzKTsKKworICAvLyB2c25wcmludGYoKSdzIGJlaGF2aW9yIGlzIG5vdCBwb3J0YWJsZS4gIFdoZW4gdGhlIGJ1ZmZlciBpcyBub3QKKyAgLy8gYmlnIGVub3VnaCwgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGluIE1TVkMsIGFuZCByZXR1cm5zIHRoZQorICAvLyBuZWVkZWQgYnVmZmVyIHNpemUgb24gTGludXguICBXaGVuIHRoZXJlIGlzIGFuIG91dHB1dCBlcnJvciwgaXQKKyAgLy8gYWx3YXlzIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4gIEZvciBzaW1wbGljaXR5LCB3ZSBsdW1wIHRoZSB0d28KKyAgLy8gZXJyb3IgY2FzZXMgdG9nZXRoZXIuCisgIGlmIChzaXplIDwgMCB8fCBzaXplID49IGtCdWZmZXJTaXplKSB7CisgICAgcmV0dXJuICI8Zm9ybWF0dGluZyBlcnJvciBvciBidWZmZXIgZXhjZWVkZWQ+IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyLCBzaXplKTsKKyAgfQorfQorCisvLyBDb252ZXJ0cyB0aGUgYnVmZmVyIGluIGEgc3RyaW5nc3RyZWFtIHRvIGFuIHN0ZDo6c3RyaW5nLCBjb252ZXJ0aW5nIE5VTAorLy8gYnl0ZXMgdG8gIlxcMCIgYWxvbmcgdGhlIHdheS4KK3N0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHNzKSB7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciA9IHNzLT5zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RhcnQgPSBzdHIuY19zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3RhcnQgKyBzdHIubGVuZ3RoKCk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZSgyICogKGVuZCAtIHN0YXJ0KSk7CisgIGZvciAoY29uc3QgY2hhciogY2ggPSBzdGFydDsgY2ggIT0gZW5kOyArK2NoKSB7CisgICAgaWYgKCpjaCA9PSAnXDAnKSB7CisgICAgICByZXN1bHQgKz0gIlxcMCI7ICAvLyBSZXBsYWNlcyBOVUwgd2l0aCAiXFwwIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICpjaDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorc3RkOjpzdHJpbmcgQXBwZW5kVXNlck1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGd0ZXN0X21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKSB7CisgIC8vIEFwcGVuZHMgdGhlIHVzZXIgbWVzc2FnZSBpZiBpdCdzIG5vbi1lbXB0eS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgdXNlcl9tc2dfc3RyaW5nID0gdXNlcl9tc2cuR2V0U3RyaW5nKCk7CisgIGlmICh1c2VyX21zZ19zdHJpbmcuZW1wdHkoKSkgeworICAgIHJldHVybiBndGVzdF9tc2c7CisgIH0KKworICByZXR1cm4gZ3Rlc3RfbXNnICsgIlxuIiArIHVzZXJfbXNnX3N0cmluZzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RSZXN1bHQKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgorVGVzdFJlc3VsdDo6VGVzdFJlc3VsdCgpCisgICAgOiBkZWF0aF90ZXN0X2NvdW50XygwKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEJ3Rvci4KK1Rlc3RSZXN1bHQ6On5UZXN0UmVzdWx0KCkgeworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbgorLy8gcmFuZ2UgZnJvbSAwIHRvIHRvdGFsX3BhcnRfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsCisvLyBhYm9ydHMgdGhlIHByb2dyYW0uCitjb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0IHsKKyAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxfcGFydF9jb3VudCgpKQorICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXy5hdChpKTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKKy8vIHByb2dyYW0uCitjb25zdCBUZXN0UHJvcGVydHkmIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3QgeworICBpZiAoaSA8IDAgfHwgaSA+PSB0ZXN0X3Byb3BlcnR5X2NvdW50KCkpCisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXy5hdChpKTsKK30KKworLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KK3ZvaWQgVGVzdFJlc3VsdDo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoKSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOworfQorCisvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KK3ZvaWQgVGVzdFJlc3VsdDo6QWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgdGVzdF9wYXJ0X3Jlc3VsdHNfLnB1c2hfYmFjayh0ZXN0X3BhcnRfcmVzdWx0KTsKK30KKworLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIElmIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXkgYXMgdGhlCisvLyBzdXBwbGllZCBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlcHJlc2VudGVkLCB0aGUgdmFsdWUgb2YgdGhpcyB0ZXN0X3Byb3BlcnR5CisvLyByZXBsYWNlcyB0aGUgb2xkIHZhbHVlIGZvciB0aGF0IGtleS4KK3ZvaWQgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7CisgIGlmICghVmFsaWRhdGVUZXN0UHJvcGVydHkodGVzdF9wcm9wZXJ0eSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZ0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6aXRlcmF0b3IgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPQorICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfcHJvcGVydGllc18uYmVnaW4oKSwgdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdFByb3BlcnR5S2V5SXModGVzdF9wcm9wZXJ0eS5rZXkoKSkpOworICBpZiAocHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPT0gdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSkgeworICAgIHRlc3RfcHJvcGVydGllc18ucHVzaF9iYWNrKHRlc3RfcHJvcGVydHkpOworICAgIHJldHVybjsKKyAgfQorICBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleS0+U2V0VmFsdWUodGVzdF9wcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiBHb29nbGUgVGVzdAorLy8gdGVzdGNhc2UgdGFncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCitib29sIFRlc3RSZXN1bHQ6OlZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgeworICBjb25zdCBzdGQ6OnN0cmluZyYga2V5ID0gdGVzdF9wcm9wZXJ0eS5rZXkoKTsKKyAgaWYgKGtleSA9PSAibmFtZSIgfHwga2V5ID09ICJzdGF0dXMiIHx8IGtleSA9PSAidGltZSIgfHwga2V5ID09ICJjbGFzc25hbWUiKSB7CisgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICA8PCAiUmVzZXJ2ZWQga2V5IHVzZWQgaW4gUmVjb3JkUHJvcGVydHkoKTogIgorICAgICAgICA8PCBrZXkKKyAgICAgICAgPDwgIiAoJ25hbWUnLCAnc3RhdHVzJywgJ3RpbWUnLCBhbmQgJ2NsYXNzbmFtZScgYXJlIHJlc2VydmVkIGJ5ICIKKyAgICAgICAgPDwgR1RFU1RfTkFNRV8gPDwgIikiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ2xlYXJzIHRoZSBvYmplY3QuCit2b2lkIFRlc3RSZXN1bHQ6OkNsZWFyKCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsKKyAgdGVzdF9wcm9wZXJ0aWVzXy5jbGVhcigpOworICBkZWF0aF90ZXN0X2NvdW50XyA9IDA7CisgIGVsYXBzZWRfdGltZV8gPSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6RmFpbGVkKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEdldFRlc3RQYXJ0UmVzdWx0KGkpLmZhaWxlZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmF0YWxseSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0UGFydEZhdGFsbHlGYWlsZWQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gcmVzdWx0LmZhdGFsbHlfZmFpbGVkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCitib29sIFRlc3RSZXN1bHQ6Okhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9wYXJ0X3Jlc3VsdHNfLCBUZXN0UGFydEZhdGFsbHlGYWlsZWQpID4gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IG5vbi1mYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQubm9uZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgoraW50IFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcGFydF9yZXN1bHRzXy5zaXplKCkpOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KK2ludCBUZXN0UmVzdWx0Ojp0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X3Byb3BlcnRpZXNfLnNpemUoKSk7Cit9CisKKy8vIGNsYXNzIFRlc3QKKworLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0LgorCisvLyBUaGUgYyd0b3Igc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitUZXN0OjpUZXN0KCkKKyAgICA6IGd0ZXN0X2ZsYWdfc2F2ZXJfKG5ldyBpbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIpIHsKK30KKworLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorVGVzdDo6flRlc3QoKSB7CisgIGRlbGV0ZSBndGVzdF9mbGFnX3NhdmVyXzsKK30KKworLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpTZXRVcCgpIHsKK30KKworLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpUZWFyRG93bigpIHsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJlY29yZFByb3BlcnR5Rm9yQ3VycmVudFRlc3Qoa2V5LCB2YWx1ZSk7Cit9CisKKy8vIEFsbG93cyB1c2VyIHN1cHBsaWVkIGtleSB2YWx1ZSBwYWlycyB0byBiZSByZWNvcmRlZCBmb3IgbGF0ZXIgb3V0cHV0Lgordm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSkgeworICBNZXNzYWdlIHZhbHVlX21lc3NhZ2U7CisgIHZhbHVlX21lc3NhZ2UgPDwgdmFsdWU7CisgIFJlY29yZFByb3BlcnR5KGtleSwgdmFsdWVfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgZnJpZW5kIG9mIFVuaXRUZXN0IGFuZCBhcyBzdWNoIGhhcyBhY2Nlc3MgdG8KKyAgLy8gQWRkVGVzdFBhcnRSZXN1bHQuCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRUZXN0UGFydFJlc3VsdCgKKyAgICAgIHJlc3VsdF90eXBlLAorICAgICAgTlVMTCwgIC8vIE5vIGluZm8gYWJvdXQgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICAtMSwgICAgLy8gV2UgaGF2ZSBubyBpbmZvIG9uIHdoaWNoIGxpbmUgY2F1c2VkIHRoZSBleGNlcHRpb24uCisgICAgICBtZXNzYWdlLAorICAgICAgIiIpOyAgIC8vIE5vIHN0YWNrIHRyYWNlLCBlaXRoZXIuCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBHb29nbGUgVGVzdCByZXF1aXJlcyBhbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIHRvIHVzZSB0aGUgc2FtZSB0ZXN0CisvLyBmaXh0dXJlIGNsYXNzLiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlCisvLyBzYW1lIGZpeHR1cmUgY2xhc3MgYXMgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLiAgSWYKKy8vIHllcywgaXQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgaXQgZ2VuZXJhdGVzIGEgR29vZ2xlIFRlc3QgZmFpbHVyZSBhbmQKKy8vIHJldHVybnMgZmFsc2UuCitib29sIFRlc3Q6Okhhc1NhbWVGaXh0dXJlQ2xhc3MoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBpbXBsLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworCisgIC8vIEluZm8gYWJvdXQgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgZmlyc3RfdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpWzBdOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpcnN0X2ZpeHR1cmVfaWQgPSBmaXJzdF90ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCBmaXJzdF90ZXN0X25hbWUgPSBmaXJzdF90ZXN0X2luZm8tPm5hbWUoKTsKKworICAvLyBJbmZvIGFib3V0IHRoZSBjdXJyZW50IHRlc3QuCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0aGlzX3Rlc3RfaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludGVybmFsOjpUeXBlSWQgdGhpc19maXh0dXJlX2lkID0gdGhpc190ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCB0aGlzX3Rlc3RfbmFtZSA9IHRoaXNfdGVzdF9pbmZvLT5uYW1lKCk7CisKKyAgaWYgKHRoaXNfZml4dHVyZV9pZCAhPSBmaXJzdF9maXh0dXJlX2lkKSB7CisgICAgLy8gSXMgdGhlIGZpcnN0IHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgZmlyc3RfaXNfVEVTVCA9IGZpcnN0X2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKKyAgICAvLyBJcyB0aGlzIHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgdGhpc19pc19URVNUID0gdGhpc19maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7CisKKyAgICBpZiAoZmlyc3RfaXNfVEVTVCB8fCB0aGlzX2lzX1RFU1QpIHsKKyAgICAgIC8vIFRoZSB1c2VyIG1peGVkIFRFU1QgYW5kIFRFU1RfRiBpbiB0aGlzIHRlc3QgY2FzZSAtIHdlJ2xsIHRlbGwKKyAgICAgIC8vIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKworICAgICAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVEVTVCBhbmQgdGhlIG5hbWUgb2YgdGhlIFRFU1RfRi4gIE5vdGUKKyAgICAgIC8vIHRoYXQgZmlyc3RfaXNfVEVTVCBhbmQgdGhpc19pc19URVNUIGNhbm5vdCBib3RoIGJlIHRydWUsIGFzCisgICAgICAvLyB0aGUgZml4dHVyZSBJRHMgYXJlIGRpZmZlcmVudCBmb3IgdGhlIHR3byB0ZXN0cy4KKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfbmFtZSA9CisgICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IGZpcnN0X3Rlc3RfbmFtZSA6IHRoaXNfdGVzdF9uYW1lOworICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9GX25hbWUgPQorICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyB0aGlzX3Rlc3RfbmFtZSA6IGZpcnN0X3Rlc3RfbmFtZTsKKworICAgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgICAgIDw8ICJjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXNcbiIKKyAgICAgICAgICA8PCAiaWxsZWdhbC4gIEluIHRlc3QgY2FzZSAiIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpCisgICAgICAgICAgPDwgIixcbiIKKyAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfRl9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0XG4iCisgICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHlcbiIKKyAgICAgICAgICA8PCAid2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0XG4iCisgICAgICAgICAgPDwgImNhc2UuIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhlIHVzZXIgZGVmaW5lZCB0d28gZml4dHVyZSBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBpbgorICAgICAgLy8gdHdvIG5hbWVzcGFjZXMgLSB3ZSdsbCB0ZWxsIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKyAgICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKKyAgICAgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIsXG4iCisgICAgICAgICAgPDwgInlvdSBkZWZpbmVkIHRlc3QgIiA8PCBmaXJzdF90ZXN0X25hbWUKKyAgICAgICAgICA8PCAiIGFuZCB0ZXN0ICIgPDwgdGhpc190ZXN0X25hbWUgPDwgIlxuIgorICAgICAgICAgIDw8ICJ1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmXG4iCisgICAgICAgICAgPDwgInRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvblxuIgorICAgICAgICAgIDw8ICJ1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lXG4iCisgICAgICAgICAgPDwgIm9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4iOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEdURVNUX0hBU19TRUgKKworLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LiAgVGhpcworLy8gZnVuY3Rpb24gcmV0dXJucyBpdHMgcmVzdWx0IHZpYSBhbiBvdXRwdXQgcGFyYW1ldGVyIHBvaW50ZXIgYmVjYXVzZSBWQysrCisvLyBwcm9oaWJpdHMgY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucworLy8gdXNpbmcgX190cnkgKHNlZSBlcnJvciBDMjcxMikuCitzdGF0aWMgc3RkOjpzdHJpbmcqIEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoRFdPUkQgZXhjZXB0aW9uX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyAgTWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlIDw8ICJTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweCIgPDwgc3RkOjpzZXRiYXNlKDE2KSA8PAorICAgIGV4Y2VwdGlvbl9jb2RlIDw8IHN0ZDo6c2V0YmFzZSgxMCkgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7CisKKyAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhtZXNzYWdlLkdldFN0cmluZygpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7CisgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgaWYgKGRlc2NyaXB0aW9uICE9IE5VTEwpIHsKKyAgICBtZXNzYWdlIDw8ICJDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gXCIiIDw8IGRlc2NyaXB0aW9uIDw8ICJcIiI7CisgIH0gZWxzZSB7CisgICAgbWVzc2FnZSA8PCAiVW5rbm93biBDKysgZXhjZXB0aW9uIjsKKyAgfQorICBtZXNzYWdlIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOworCisgIHJldHVybiBtZXNzYWdlLkdldFN0cmluZygpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKKworLy8gQSBmYWlsZWQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9mIHRoaXMgdHlwZSB3aGVuCisvLyBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpIGlzIHRydWUgKGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQpLiAgV2UKKy8vIGRlcml2ZSBpdCBmcm9tIHN0ZDo6cnVudGltZV9lcnJvciwgd2hpY2ggaXMgZm9yIGVycm9ycyBwcmVzdW1hYmx5CisvLyBkZXRlY3RhYmxlIG9ubHkgYXQgcnVuIHRpbWUuICBTaW5jZSBzdGQ6OnJ1bnRpbWVfZXJyb3IgaW5oZXJpdHMgZnJvbQorLy8gc3RkOjpleGNlcHRpb24sIG1hbnkgdGVzdGluZyBmcmFtZXdvcmtzIGtub3cgaG93IHRvIGV4dHJhY3QgYW5kIHByaW50IHRoZQorLy8gbWVzc2FnZSBpbnNpZGUgaXQuCitjbGFzcyBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiA6IHB1YmxpYyA6OnN0ZDo6cnVudGltZV9lcnJvciB7CisgcHVibGljOgorICBleHBsaWNpdCBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihjb25zdCBUZXN0UGFydFJlc3VsdCYgZmFpbHVyZSkKKyAgICAgIDogOjpzdGQ6OnJ1bnRpbWVfZXJyb3IoUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKGZhaWx1cmUpLmNfc3RyKCkpIHt9Cit9OworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gV2UgcHV0IHRoZXNlIGhlbHBlciBmdW5jdGlvbnMgaW4gdGhlIGludGVybmFsIG5hbWVzcGFjZSBhcyBJQk0ncyB4bEMKKy8vIGNvbXBpbGVyIHJlamVjdHMgdGhlIGNvZGUgaWYgdGhleSB3ZXJlIGRlY2xhcmVkIHN0YXRpYy4KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBoYW5kbGVzIFNFSCBleGNlcHRpb25zIGl0IHRocm93cywgd2hlbgorLy8gU0VIIGlzIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZSBSZXN1bHQgaW4gY2FzZSBvZiBhbgorLy8gU0VIIGV4Y2VwdGlvbi4gIChNaWNyb3NvZnQgY29tcGlsZXJzIGNhbm5vdCBoYW5kbGUgU0VIIGFuZCBDKysKKy8vIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUaGVyZWZvcmUsIHdlIHByb3ZpZGUgYSBzZXBhcmF0ZQorLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgU0VIIGV4Y2VwdGlvbnMuKQordGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KK1Jlc3VsdCBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyNpZiBHVEVTVF9IQVNfU0VICisgIF9fdHJ5IHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfSBfX2V4Y2VwdCAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKCAgLy8gTk9MSU5UCisgICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7CisgICAgLy8gV2UgY3JlYXRlIHRoZSBleGNlcHRpb24gbWVzc2FnZSBvbiB0aGUgaGVhcCBiZWNhdXNlIFZDKysgcHJvaGliaXRzCisgICAgLy8gY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucyB1c2luZyBfX3RyeQorICAgIC8vIChzZWUgZXJyb3IgQzI3MTIpLgorICAgIHN0ZDo6c3RyaW5nKiBleGNlcHRpb25fbWVzc2FnZSA9IEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoCisgICAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSwgbG9jYXRpb24pOworICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uX21lc3NhZ2UpOworICAgIGRlbGV0ZSBleGNlcHRpb25fbWVzc2FnZTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PigwKTsKKyAgfQorI2Vsc2UKKyAgKHZvaWQpbG9jYXRpb247CisgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICit9CisKKy8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgY2F0Y2hlcyBhbmQgcmVwb3J0cyBDKysgYW5kL29yIFNFSC1zdHlsZQorLy8gZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgc3VwcG9ydGVkOyByZXR1cm5zIHRoZSAwLXZhbHVlIGZvciB0eXBlCisvLyBSZXN1bHQgaW4gY2FzZSBvZiBhbiBTRUggZXhjZXB0aW9uLgordGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KK1Jlc3VsdCBIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyAgLy8gTk9URTogVGhlIHVzZXIgY29kZSBjYW4gYWZmZWN0IHRoZSB3YXkgaW4gd2hpY2ggR29vZ2xlIFRlc3QgaGFuZGxlcworICAvLyBleGNlcHRpb25zIGJ5IHNldHRpbmcgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSwgYnV0IG9ubHkgYmVmb3JlCisgIC8vIFJVTl9BTExfVEVTVFMoKSBzdGFydHMuIEl0IGlzIHRlY2huaWNhbGx5IHBvc3NpYmxlIHRvIGNoZWNrIHRoZSBmbGFnCisgIC8vIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGFuZCBlaXRoZXIgcmVwb3J0IG9yIHJlLXRocm93IHRoZQorICAvLyBleGNlcHRpb24gYmFzZWQgb24gdGhlIGZsYWcncyB2YWx1ZToKKyAgLy8KKyAgLy8gdHJ5IHsKKyAgLy8gICAvLyBQZXJmb3JtIHRoZSB0ZXN0IG1ldGhvZC4KKyAgLy8gfSBjYXRjaCAoLi4uKSB7CisgIC8vICAgaWYgKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCisgIC8vICAgICAvLyBSZXBvcnQgdGhlIGV4Y2VwdGlvbiBhcyBmYWlsdXJlLgorICAvLyAgIGVsc2UKKyAgLy8gICAgIHRocm93OyAgLy8gUmUtdGhyb3dzIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uCisgIC8vIH0KKyAgLy8KKyAgLy8gSG93ZXZlciwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmbGFnIGlzIHRvIGFsbG93IHRoZSBwcm9ncmFtIHRvIGRyb3AgaW50bworICAvLyB0aGUgZGVidWdnZXIgd2hlbiB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gT24gbW9zdCBwbGF0Zm9ybXMsIG9uY2UgdGhlCisgIC8vIGNvbnRyb2wgZW50ZXJzIHRoZSBjYXRjaCBibG9jaywgdGhlIGV4Y2VwdGlvbiBvcmlnaW4gaW5mb3JtYXRpb24gaXMKKyAgLy8gbG9zdCBhbmQgdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCB0aGUgcHJvZ3JhbSBhdCB0aGUgcG9pbnQgb2YgdGhlCisgIC8vIHJlLXRocm93IGluIHRoaXMgZnVuY3Rpb24gLS0gaW5zdGVhZCBvZiBhdCB0aGUgcG9pbnQgb2YgdGhlIG9yaWdpbmFsCisgIC8vIHRocm93IHN0YXRlbWVudCBpbiB0aGUgY29kZSB1bmRlciB0ZXN0LiAgRm9yIHRoaXMgcmVhc29uLCB3ZSBwZXJmb3JtCisgIC8vIHRoZSBjaGVjayBlYXJseSwgc2FjcmlmaWNpbmcgdGhlIGFiaWxpdHkgdG8gYWZmZWN0IEdvb2dsZSBUZXN0J3MKKyAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGluIHRoZSBtZXRob2Qgd2hlcmUgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgIGlmIChpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmNhdGNoX2V4Y2VwdGlvbnMoKSkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZChvYmplY3QsIG1ldGhvZCwgbG9jYXRpb24pOworICAgIH0gY2F0Y2ggKGNvbnN0IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uJikgeyAgLy8gTk9MSU5UCisgICAgICAvLyBUaGlzIGV4Y2VwdGlvbiBkb2Vzbid0IG9yaWdpbmF0ZSBpbiBjb2RlIHVuZGVyIHRlc3QuIEl0IG1ha2VzIG5vCisgICAgICAvLyBzZW5zZSB0byByZXBvcnQgaXQgYXMgYSB0ZXN0IGZhaWx1cmUuCisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeyAgLy8gTk9MSU5UCisgICAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAorICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoZS53aGF0KCksIGxvY2F0aW9uKSk7CisgICAgfSBjYXRjaCAoLi4uKSB7ICAvLyBOT0xJTlQKKyAgICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShOVUxMLCBsb2NhdGlvbikpOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PigwKTsKKyNlbHNlCisgICAgcmV0dXJuIEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKG9iamVjdCwgbWV0aG9kLCBsb2NhdGlvbik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFJ1bnMgdGhlIHRlc3QgYW5kIHVwZGF0ZXMgdGhlIHRlc3QgcmVzdWx0Lgordm9pZCBUZXN0OjpSdW4oKSB7CisgIGlmICghSGFzU2FtZUZpeHR1cmVDbGFzcygpKSByZXR1cm47CisKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKHRoaXMsICZUZXN0OjpTZXRVcCwgIlNldFVwKCkiKTsKKyAgLy8gV2Ugd2lsbCBydW4gdGhlIHRlc3Qgb25seSBpZiBTZXRVcCgpIHdhcyBzdWNjZXNzZnVsLgorICBpZiAoIUhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICAgIHRoaXMsICZUZXN0OjpUZXN0Qm9keSwgInRoZSB0ZXN0IGJvZHkiKTsKKyAgfQorCisgIC8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY2xlYW4gdXAgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIEhlbmNlIHdlIHdpbGwKKyAgLy8gYWx3YXlzIGNhbGwgVGVhckRvd24oKSwgZXZlbiBpZiBTZXRVcCgpIG9yIHRoZSB0ZXN0IGJvZHkgaGFzCisgIC8vIGZhaWxlZC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGhpcywgJlRlc3Q6OlRlYXJEb3duLCAiVGVhckRvd24oKSIpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkgeworICByZXR1cm4gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPkhhc0ZhdGFsRmFpbHVyZSgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCitib29sIFRlc3Q6Okhhc05vbmZhdGFsRmFpbHVyZSgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT4KKyAgICAgIEhhc05vbmZhdGFsRmFpbHVyZSgpOworfQorCisvLyBjbGFzcyBUZXN0SW5mbworCisvLyBDb25zdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiBJdCBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgdGVzdCBmYWN0b3J5CisvLyBvYmplY3QuCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBNYWtlIGFfdGVzdF9jYXNlX25hbWUgYW5kIGFfbmFtZSBjb25zdCBzdHJpbmcmJ3MKKy8vIHRvIHNpZ25pZnkgdGhleSBjYW5ub3QgYmUgTlVMTHMuCitUZXN0SW5mbzo6VGVzdEluZm8oY29uc3QgY2hhciogYV90ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpCisgICAgOiB0ZXN0X2Nhc2VfbmFtZV8oYV90ZXN0X2Nhc2VfbmFtZSksCisgICAgICBuYW1lXyhhX25hbWUpLAorICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIHZhbHVlX3BhcmFtXyhhX3ZhbHVlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdmFsdWVfcGFyYW0pIDogTlVMTCksCisgICAgICBmaXh0dXJlX2NsYXNzX2lkXyhmaXh0dXJlX2NsYXNzX2lkKSwKKyAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKKyAgICAgIGlzX2Rpc2FibGVkXyhmYWxzZSksCisgICAgICBtYXRjaGVzX2ZpbHRlcl8oZmFsc2UpLAorICAgICAgZmFjdG9yeV8oZmFjdG9yeSksCisgICAgICByZXN1bHRfKCkge30KKworLy8gRGVzdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LgorVGVzdEluZm86On5UZXN0SW5mbygpIHsgZGVsZXRlIGZhY3RvcnlfOyB9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKKy8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0CisvLyAgIHR5cGVfcGFyYW06ICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICB2YWx1ZV9wYXJhbTogICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAorLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICBmaXh0dXJlX2NsYXNzX2lkOiBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCisvLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisvLyAgIGZhY3Rvcnk6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdGVzdCBvYmplY3QuCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lCisvLyAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCitUZXN0SW5mbyogTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKKyAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgVGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkgeworICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgIG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwgbmFtZSwgdHlwZV9wYXJhbSwgdmFsdWVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgZml4dHVyZV9jbGFzc19pZCwgZmFjdG9yeSk7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5BZGRUZXN0SW5mbyhzZXRfdXBfdGMsIHRlYXJfZG93bl90YywgdGVzdF9pbmZvKTsKKyAgcmV0dXJuIHRlc3RfaW5mbzsKK30KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCit2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgTWVzc2FnZSBlcnJvcnM7CisgIGVycm9ycworICAgICAgPDwgIkF0dGVtcHRlZCByZWRlZmluaXRpb24gb2YgdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIi5cbiIKKyAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIiwgeW91IHRyaWVkXG4iCisgICAgICA8PCAidG8gZGVmaW5lIGEgdGVzdCB1c2luZyBhIGZpeHR1cmUgY2xhc3MgZGlmZmVyZW50IGZyb20gdGhlIG9uZVxuIgorICAgICAgPDwgInVzZWQgZWFybGllci4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB0d28gZml4dHVyZSBjbGFzc2VzIGFyZVxuIgorICAgICAgPDwgImZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gWW91IHNob3VsZFxuIgorICAgICAgPDwgInByb2JhYmx5IHJlbmFtZSBvbmUgb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudFxuIgorICAgICAgPDwgInRlc3QgY2FzZXMuIjsKKworICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzIiwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksCisgICAgICAgICAgZXJyb3JzLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIHsKKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIHRlc3QgbmFtZSBvZiBhIFRlc3RJbmZvIGFnYWluc3QgYSBrbm93bgorLy8gdmFsdWUuCisvLworLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVzdENhc2UgY2xhc3Mgb25seS4gIFdlIHB1dAorLy8gaXQgaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UgdG8gcHJldmVudCBwb2xsdXRpbmcgdGhlIG91dGVyCisvLyBuYW1lc3BhY2UuCisvLworLy8gVGVzdE5hbWVJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3ROYW1lSXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRlc3ROYW1lSXMgaGFzIE5PIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3ROYW1lSXMoY29uc3QgY2hhciogbmFtZSkKKyAgICAgIDogbmFtZV8obmFtZSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdF9pbmZvIG1hdGNoZXMgbmFtZV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0SW5mbyAqIHRlc3RfaW5mbykgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2luZm8gJiYgdGVzdF9pbmZvLT5uYW1lKCkgPT0gbmFtZV87CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoaXMgbWV0aG9kIGV4cGFuZHMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgcmVnaXN0ZXJlZCB3aXRoIG1hY3JvcyBURVNUX1AKKy8vIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBpbnRvIHJlZ3VsYXIgdGVzdHMgYW5kIHJlZ2lzdGVycyB0aG9zZS4KKy8vIFRoaXMgd2lsbCBiZSBkb25lIGp1c3Qgb25jZSBkdXJpbmcgdGhlIHByb2dyYW0gcnVudGltZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIHsKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBpZiAoIXBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8pIHsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfLlJlZ2lzdGVyVGVzdHMoKTsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKKyAgfQorI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgorLy8gZGVsZXRlcyBpdC4KK3ZvaWQgVGVzdEluZm86OlJ1bigpIHsKKyAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHdoZXJlIHRvIHN0b3JlIHRlc3QgcmVzdWx0LgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8odGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHRlc3QgaXMgYWJvdXQgdG8gc3RhcnQuCisgIHJlcGVhdGVyLT5PblRlc3RTdGFydCgqdGhpcyk7CisKKyAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpOworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QuCisgIFRlc3QqIGNvbnN0IHRlc3QgPSBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICBmYWN0b3J5XywgJmludGVybmFsOjpUZXN0RmFjdG9yeUJhc2U6OkNyZWF0ZVRlc3QsCisgICAgICAidGhlIHRlc3QgZml4dHVyZSdzIGNvbnN0cnVjdG9yIik7CisKKyAgLy8gUnVucyB0aGUgdGVzdCBvbmx5IGlmIHRoZSB0ZXN0IG9iamVjdCB3YXMgY3JlYXRlZCBhbmQgaXRzCisgIC8vIGNvbnN0cnVjdG9yIGRpZG4ndCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUuCisgIGlmICgodGVzdCAhPSBOVUxMKSAmJiAhVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAvLyBUaGlzIGRvZXNuJ3QgdGhyb3cgYXMgYWxsIHVzZXIgY29kZSB0aGF0IGNhbiB0aHJvdyBhcmUgd3JhcHBlZCBpbnRvCisgICAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUuCisgICAgdGVzdC0+UnVuKCk7CisgIH0KKworICAvLyBEZWxldGVzIHRoZSB0ZXN0IG9iamVjdC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGVzdCwgJlRlc3Q6OkRlbGV0ZVNlbGZfLCAidGhlIHRlc3QgZml4dHVyZSdzIGRlc3RydWN0b3IiKTsKKworICByZXN1bHRfLnNldF9lbGFwc2VkX3RpbWUoaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQpOworCisgIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCBhIHRlc3QgaGFzIGp1c3QgZmluaXNoZWQuCisgIHJlcGVhdGVyLT5PblRlc3RFbmQoKnRoaXMpOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHRvIHN0b3AgYXNzb2NpYXRpbmcgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhpcworICAvLyB0ZXN0LgorICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7Cit9CisKKy8vIGNsYXNzIFRlc3RDYXNlCisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgoraW50IFRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCitpbnQgVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RGYWlsZWQpOworfQorCitpbnQgVGVzdENhc2U6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdERpc2FibGVkKTsKK30KKworLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgoraW50IFRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBTaG91bGRSdW5UZXN0KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9pbmZvX2xpc3RfLnNpemUoKSk7Cit9CisKKy8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2U6OlRlc3RDYXNlKGNvbnN0IGNoYXIqIGFfbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpCisgICAgOiBuYW1lXyhhX25hbWUpLAorICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIHNldF91cF90Y18oc2V0X3VwX3RjKSwKKyAgICAgIHRlYXJfZG93bl90Y18odGVhcl9kb3duX3RjKSwKKyAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorVGVzdENhc2U6On5UZXN0Q2FzZSgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0IGluIHRoZSBjb2xsZWN0aW9uLgorICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0SW5mbz4pOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0SW5mbyogVGVzdENhc2U6OkdldFRlc3RJbmZvKGludCBpKSBjb25zdCB7CisgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7CisgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpIHsKKyAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKKyAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOworfQorCisvLyBBZGRzIGEgdGVzdCB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSB0ZXN0IHVwb24KKy8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCit2b2lkIFRlc3RDYXNlOjpBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbykgeworICB0ZXN0X2luZm9fbGlzdF8ucHVzaF9iYWNrKHRlc3RfaW5mbyk7CisgIHRlc3RfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9pbmRpY2VzXy5zaXplKCkpKTsKK30KKworLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCit2b2lkIFRlc3RDYXNlOjpSdW4oKSB7CisgIGlmICghc2hvdWxkX3J1bl8pIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UodGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgcmVwZWF0ZXItPk9uVGVzdENhc2VTdGFydCgqdGhpcyk7CisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuU2V0VXBUZXN0Q2FzZSwgIlNldFVwVGVzdENhc2UoKSIpOworCisgIGNvbnN0IGludGVybmFsOjpUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfdGVzdF9jb3VudCgpOyBpKyspIHsKKyAgICBHZXRNdXRhYmxlVGVzdEluZm8oaSktPlJ1bigpOworICB9CisgIGVsYXBzZWRfdGltZV8gPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdENhc2U6OlJ1blRlYXJEb3duVGVzdENhc2UsICJUZWFyRG93blRlc3RDYXNlKCkiKTsKKworICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZShOVUxMKTsKK30KKworLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OkNsZWFyUmVzdWx0KCkgeworICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgVGVzdEluZm86OkNsZWFyVGVzdFJlc3VsdCk7Cit9CisKKy8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OlNodWZmbGVUZXN0cyhpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20pIHsKKyAgU2h1ZmZsZShyYW5kb20sICZ0ZXN0X2luZGljZXNfKTsKK30KKworLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgordm9pZCBUZXN0Q2FzZTo6VW5zaHVmZmxlVGVzdHMoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9pbmRpY2VzXy5zaXplKCk7IGkrKykgeworICAgIHRlc3RfaW5kaWNlc19baV0gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOworICB9Cit9CisKKy8vIEZvcm1hdHMgYSBjb3VudGFibGUgbm91bi4gIERlcGVuZGluZyBvbiBpdHMgcXVhbnRpdHksIGVpdGhlciB0aGUKKy8vIHNpbmd1bGFyIGZvcm0gb3IgdGhlIHBsdXJhbCBmb3JtIGlzIHVzZWQuIGUuZy4KKy8vCisvLyBGb3JtYXRDb3VudGFibGVOb3VuKDEsICJmb3JtdWxhIiwgImZvcm11bGkiKSByZXR1cm5zICIxIGZvcm11bGEiLgorLy8gRm9ybWF0Q291bnRhYmxlTm91big1LCAiYm9vayIsICJib29rcyIpIHJldHVybnMgIjUgYm9va3MiLgorc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdENvdW50YWJsZU5vdW4oaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHNpbmd1bGFyX2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogcGx1cmFsX2Zvcm0pIHsKKyAgcmV0dXJuIGludGVybmFsOjpTdHJpbmc6OkZvcm1hdCgiJWQgJXMiLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9PSAxID8gc2luZ3VsYXJfZm9ybSA6IHBsdXJhbF9mb3JtKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdHMuCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0VGVzdENvdW50KGludCB0ZXN0X2NvdW50KSB7CisgIHJldHVybiBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY291bnQsICJ0ZXN0IiwgInRlc3RzIik7Cit9CisKKy8vIEZvcm1hdHMgdGhlIGNvdW50IG9mIHRlc3QgY2FzZXMuCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0VGVzdENhc2VDb3VudChpbnQgdGVzdF9jYXNlX2NvdW50KSB7CisgIHJldHVybiBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZV9jb3VudCwgInRlc3QgY2FzZSIsICJ0ZXN0IGNhc2VzIik7Cit9CisKKy8vIENvbnZlcnRzIGEgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgZW51bSB0byBodW1hbi1mcmllbmRseSBzdHJpbmcKKy8vIHJlcHJlc2VudGF0aW9uLiAgQm90aCBrTm9uRmF0YWxGYWlsdXJlIGFuZCBrRmF0YWxGYWlsdXJlIGFyZSB0cmFuc2xhdGVkCisvLyB0byAiRmFpbHVyZSIsIGFzIHRoZSB1c2VyIHVzdWFsbHkgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBkaWZmZXJlbmNlCisvLyBiZXR3ZWVuIHRoZSB0d28gd2hlbiB2aWV3aW5nIHRoZSB0ZXN0IHJlc3VsdC4KK3N0YXRpYyBjb25zdCBjaGFyICogVGVzdFBhcnRSZXN1bHRUeXBlVG9TdHJpbmcoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzczoKKyAgICAgIHJldHVybiAiU3VjY2VzcyI7CisKKyAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlOgorICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmU6CisjaWZkZWYgX01TQ19WRVIKKyAgICAgIHJldHVybiAiZXJyb3I6ICI7CisjZWxzZQorICAgICAgcmV0dXJuICJGYWlsdXJlXG4iOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiVW5rbm93biByZXN1bHQgdHlwZSI7CisgIH0KK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gYW4gc3RkOjpzdHJpbmcuCitzdGF0aWMgc3RkOjpzdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIHJldHVybiAoTWVzc2FnZSgpCisgICAgICAgICAgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbih0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpKQorICAgICAgICAgIDw8ICIgIiA8PCBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LnR5cGUoKSkKKyAgICAgICAgICA8PCB0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0Lgorc3RhdGljIHZvaWQgUHJpbnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzdWx0ID0KKyAgICAgIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0KTsKKyAgcHJpbnRmKCIlc1xuIiwgcmVzdWx0LmNfc3RyKCkpOworICBmZmx1c2goc3Rkb3V0KTsKKyAgLy8gSWYgdGhlIHRlc3QgcHJvZ3JhbSBydW5zIGluIFZpc3VhbCBTdHVkaW8gb3IgYSBkZWJ1Z2dlciwgdGhlCisgIC8vIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGFkZCB0aGUgdGVzdCBwYXJ0IHJlc3VsdCBtZXNzYWdlIHRvIHRoZSBPdXRwdXQKKyAgLy8gd2luZG93IHN1Y2ggdGhhdCB0aGUgdXNlciBjYW4gZG91YmxlLWNsaWNrIG9uIGl0IHRvIGp1bXAgdG8gdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbG9jYXRpb247IG90aGVyd2lzZSB0aGV5IGRvIG5vdGhpbmcuCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2UgZG9uJ3QgY2FsbCBPdXRwdXREZWJ1Z1N0cmluZyooKSBvbiBXaW5kb3dzIE1vYmlsZSwgYXMgcHJpbnRpbmcKKyAgLy8gdG8gc3Rkb3V0IGlzIGRvbmUgYnkgT3V0cHV0RGVidWdTdHJpbmcoKSB0aGVyZSBhbHJlYWR5IC0gd2UgZG9uJ3QKKyAgLy8gd2FudCB0aGUgc2FtZSBtZXNzYWdlIHByaW50ZWQgdHdpY2UuCisgIDo6T3V0cHV0RGVidWdTdHJpbmdBKHJlc3VsdC5jX3N0cigpKTsKKyAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EoIlxuIik7CisjZW5kaWYKK30KKworLy8gY2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2VudW0gR1Rlc3RDb2xvciB7CisgIENPTE9SX0RFRkFVTFQsCisgIENPTE9SX1JFRCwKKyAgQ09MT1JfR1JFRU4sCisgIENPTE9SX1lFTExPVworfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBjb2xvci4KK1dPUkQgR2V0Q29sb3JBdHRyaWJ1dGUoR1Rlc3RDb2xvciBjb2xvcikgeworICBzd2l0Y2ggKGNvbG9yKSB7CisgICAgY2FzZSBDT0xPUl9SRUQ6ICAgIHJldHVybiBGT1JFR1JPVU5EX1JFRDsKKyAgICBjYXNlIENPTE9SX0dSRUVOOiAgcmV0dXJuIEZPUkVHUk9VTkRfR1JFRU47CisgICAgY2FzZSBDT0xPUl9ZRUxMT1c6IHJldHVybiBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfR1JFRU47CisgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiAwOworICB9Cit9CisKKyNlbHNlCisKKy8vIFJldHVybnMgdGhlIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIGNvbG9yLiAgQ09MT1JfREVGQVVMVCBpcworLy8gYW4gaW52YWxpZCBpbnB1dC4KK2NvbnN0IGNoYXIqIEdldEFuc2lDb2xvckNvZGUoR1Rlc3RDb2xvciBjb2xvcikgeworICBzd2l0Y2ggKGNvbG9yKSB7CisgICAgY2FzZSBDT0xPUl9SRUQ6ICAgICByZXR1cm4gIjEiOworICAgIGNhc2UgQ09MT1JfR1JFRU46ICAgcmV0dXJuICIyIjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzogIHJldHVybiAiMyI7CisgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgfTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBSZXR1cm5zIHRydWUgaWZmIEdvb2dsZSBUZXN0IHNob3VsZCB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCitib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9jb2xvciA9IEdURVNUX0ZMQUcoY29sb3IpLmNfc3RyKCk7CisKKyAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgImF1dG8iKSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgICAvLyBPbiBXaW5kb3dzIHRoZSBURVJNIHZhcmlhYmxlIGlzIHVzdWFsbHkgbm90IHNldCwgYnV0IHRoZQorICAgIC8vIGNvbnNvbGUgdGhlcmUgZG9lcyBzdXBwb3J0IGNvbG9ycy4KKyAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eTsKKyNlbHNlCisgICAgLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBURVJNIHZhcmlhYmxlLgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IHRlcm0gPSBwb3NpeDo6R2V0RW52KCJURVJNIik7CisgICAgY29uc3QgYm9vbCB0ZXJtX3N1cHBvcnRzX2NvbG9yID0KKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybSIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tY29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLTI1NmNvbG9yIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4iKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImxpbnV4IikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJjeWd3aW4iKTsKKyAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eSAmJiB0ZXJtX3N1cHBvcnRzX2NvbG9yOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIH0KKworICByZXR1cm4gU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAieWVzIikgfHwKKyAgICAgIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInRydWUiKSB8fAorICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidCIpIHx8CisgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICIxIik7CisgIC8vIFdlIHRha2UgInllcyIsICJ0cnVlIiwgInQiLCBhbmQgIjEiIGFzIG1lYW5pbmcgInllcyIuICBJZiB0aGUKKyAgLy8gdmFsdWUgaXMgbmVpdGhlciBvbmUgb2YgdGhlc2Ugbm9yICJhdXRvIiwgd2UgdHJlYXQgaXQgYXMgIm5vIiB0bworICAvLyBiZSBjb25zZXJ2YXRpdmUuCit9CisKKy8vIEhlbHBlcnMgZm9yIHByaW50aW5nIGNvbG9yZWQgc3RyaW5ncyB0byBzdGRvdXQuIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCB3ZQorLy8gY2Fubm90IHNpbXBseSBlbWl0IHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgaGF2ZSB0aGUgdGVybWluYWwgY2hhbmdlIGNvbG9ycy4KKy8vIFRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5IGVtaXQgdGhlIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gcmV0dXJuIGEgc3RyaW5nCisvLyB0aGF0IHdvdWxkIGJlIGNvbG9yZWQgd2hlbiBwcmludGVkLCBhcyBjYW4gYmUgZG9uZSBvbiBMaW51eC4KK3ZvaWQgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUyB8fCBHVEVTVF9PU19JT1MKKyAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBmYWxzZTsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCBib29sIGluX2NvbG9yX21vZGUgPQorICAgICAgU2hvdWxkVXNlQ29sb3IocG9zaXg6OklzQVRUWShwb3NpeDo6RmlsZU5vKHN0ZG91dCkpICE9IDApOworICBjb25zdCBib29sIHVzZV9jb2xvciA9IGluX2NvbG9yX21vZGUgJiYgKGNvbG9yICE9IENPTE9SX0RFRkFVTFQpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUworICAvLyBUaGUgJyE9IDAnIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgTVNWQyA3LjEuCisKKyAgaWYgKCF1c2VfY29sb3IpIHsKKyAgICB2cHJpbnRmKGZtdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybjsKKyAgfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgY29uc3QgSEFORExFIHN0ZG91dF9oYW5kbGUgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworCisgIC8vIEdldHMgdGhlIGN1cnJlbnQgdGV4dCBjb2xvci4KKyAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gYnVmZmVyX2luZm87CisgIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKHN0ZG91dF9oYW5kbGUsICZidWZmZXJfaW5mbyk7CisgIGNvbnN0IFdPUkQgb2xkX2NvbG9yX2F0dHJzID0gYnVmZmVyX2luZm8ud0F0dHJpYnV0ZXM7CisKKyAgLy8gV2UgbmVlZCB0byBmbHVzaCB0aGUgc3RyZWFtIGJ1ZmZlcnMgaW50byB0aGUgY29uc29sZSBiZWZvcmUgZWFjaAorICAvLyBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSBjYWxsIGxlc3QgaXQgYWZmZWN0IHRoZSB0ZXh0IHRoYXQgaXMgYWxyZWFkeQorICAvLyBwcmludGVkIGJ1dCBoYXMgbm90IHlldCByZWFjaGVkIHRoZSBjb25zb2xlLgorICBmZmx1c2goc3Rkb3V0KTsKKyAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29sb3JBdHRyaWJ1dGUoY29sb3IpIHwgRk9SRUdST1VORF9JTlRFTlNJVFkpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisKKyAgZmZsdXNoKHN0ZG91dCk7CisgIC8vIFJlc3RvcmVzIHRoZSB0ZXh0IGNvbG9yLgorICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLCBvbGRfY29sb3JfYXR0cnMpOworI2Vsc2UKKyAgcHJpbnRmKCJcMDMzWzA7MyVzbSIsIEdldEFuc2lDb2xvckNvZGUoY29sb3IpKTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICBwcmludGYoIlwwMzNbbSIpOyAgLy8gUmVzZXRzIHRoZSB0ZXJtaW5hbCB0byBkZWZhdWx0LgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICBjb25zdCBjaGFyKiBjb25zdCB0eXBlX3BhcmFtID0gdGVzdF9pbmZvLnR5cGVfcGFyYW0oKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfcGFyYW0gPSB0ZXN0X2luZm8udmFsdWVfcGFyYW0oKTsKKworICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMIHx8IHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKKyAgICBwcmludGYoIiwgd2hlcmUgIik7CisgICAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJUeXBlUGFyYW0gPSAlcyIsIHR5cGVfcGFyYW0pOworICAgICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpCisgICAgICAgIHByaW50ZigiIGFuZCAiKTsKKyAgICB9CisgICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKKyAgICAgIHByaW50ZigiR2V0UGFyYW0oKSA9ICVzIiwgdmFsdWVfcGFyYW0pOworICAgIH0KKyAgfQorfQorCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGludGVyZmFjZS4KKy8vCisvLyBDbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIgaXMgY29weWFibGUuCitjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyKCkge30KKyAgc3RhdGljIHZvaWQgUHJpbnRUZXN0TmFtZShjb25zdCBjaGFyICogdGVzdF9jYXNlLCBjb25zdCBjaGFyICogdGVzdCkgeworICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X2Nhc2UsIHRlc3QpOworICB9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIG92ZXJyaWRlIHdoYXQncyBpbiB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworfTsKKworICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvblN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKEdURVNUX0ZMQUcocmVwZWF0KSAhPSAxKQorICAgIHByaW50ZigiXG5SZXBlYXRpbmcgYWxsIHRlc3RzIChpdGVyYXRpb24gJWQpIC4gLiAuXG5cbiIsIGl0ZXJhdGlvbiArIDEpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbHRlciA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOworCisgIC8vIFByaW50cyB0aGUgZmlsdGVyIGlmIGl0J3Mgbm90ICouICBUaGlzIHJlbWluZHMgdGhlIHVzZXIgdGhhdCBzb21lCisgIC8vIHRlc3RzIG1heSBiZSBza2lwcGVkLgorICBpZiAoIVN0cmluZzo6Q1N0cmluZ0VxdWFscyhmaWx0ZXIsIGtVbml2ZXJzYWxGaWx0ZXIpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogJXMgZmlsdGVyID0gJXNcbiIsIEdURVNUX05BTUVfLCBmaWx0ZXIpOworICB9CisKKyAgaWYgKGludGVybmFsOjpTaG91bGRTaGFyZChrVGVzdFRvdGFsU2hhcmRzLCBrVGVzdFNoYXJkSW5kZXgsIGZhbHNlKSkgeworICAgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RTaGFyZEluZGV4LCAtMSk7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogVGhpcyBpcyB0ZXN0IHNoYXJkICVkIG9mICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2hhcmRfaW5kZXgpICsgMSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6R2V0RW52KGtUZXN0VG90YWxTaGFyZHMpKTsKKyAgfQorCisgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogUmFuZG9taXppbmcgdGVzdHMnIG9yZGVycyB3aXRoIGEgc2VlZCBvZiAlZCAuXG4iLAorICAgICAgICAgICAgICAgICAgdW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpOworICB9CisKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbPT09PT09PT09PV0gIik7CisgIHByaW50ZigiUnVubmluZyAlcyBmcm9tICVzLlxuIiwKKyAgICAgICAgIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3QudGVzdF90b19ydW5fY291bnQoKSkuY19zdHIoKSwKKyAgICAgICAgIEZvcm1hdFRlc3RDYXNlQ291bnQodW5pdF90ZXN0LnRlc3RfY2FzZV90b19ydW5fY291bnQoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC5cbiIpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9CisgICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMiLCBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlLm5hbWUoKSk7CisgIGlmICh0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpID09IE5VTEwpIHsKKyAgICBwcmludGYoIlxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCIsIHdoZXJlIFR5cGVQYXJhbSA9ICVzXG4iLCB0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpKTsKKyAgfQorICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbIFJVTiAgICAgIF0gIik7CisgIFByaW50VGVzdE5hbWUodGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICBwcmludGYoIlxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBDYWxsZWQgYWZ0ZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIC8vIElmIHRoZSB0ZXN0IHBhcnQgc3VjY2VlZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorICBpZiAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpCisgICAgcmV0dXJuOworCisgIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBhc3NlcnRpb24gKGUuZy4gZXhwZWN0ZWQgdGhpcyBhbmQgZ290IHRoYXQpLgorICBQcmludFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+UGFzc2VkKCkpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWyAgICAgICBPSyBdICIpOworICB9IGVsc2UgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOworICB9CisgIFByaW50VGVzdE5hbWUodGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5GYWlsZWQoKSkKKyAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOworCisgIGlmIChHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7CisgICAgcHJpbnRmKCIgKCVzIG1zKVxuIiwgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZygKKyAgICAgICAgICAgdGVzdF9pbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGlmICghR1RFU1RfRkxBRyhwcmludF90aW1lKSkgcmV0dXJuOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9CisgICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMgKCVzIG1zIHRvdGFsKVxuXG4iLAorICAgICAgICAgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCksCisgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93blxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIHByaW50aW5nIHRoZSBsaXN0IG9mIGZhaWxlZCB0ZXN0cy4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmIChmYWlsZWRfdGVzdF9jb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworICAgIGlmICghdGVzdF9jYXNlLnNob3VsZF9ydW4oKSB8fCAodGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCkgPT0gMCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraikgeworICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7CisgICAgICBpZiAoIXRlc3RfaW5mby5zaG91bGRfcnVuKCkgfHwgdGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOworICAgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZS5uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgICAgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQodGVzdF9pbmZvKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKKyAgcHJpbnRmKCIlcyBmcm9tICVzIHJhbi4iLAorICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAorICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKKyAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKKyAgICBwcmludGYoIiAoJXMgbXMgdG90YWwpIiwKKyAgICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOworICB9CisgIHByaW50ZigiXG4iKTsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbICBQQVNTRUQgIF0gIik7CisgIHByaW50ZigiJXMuXG4iLCBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKS5jX3N0cigpKTsKKworICBpbnQgbnVtX2ZhaWx1cmVzID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmICghdW5pdF90ZXN0LlBhc3NlZCgpKSB7CisgICAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICAiWyAgRkFJTEVEICBdICIpOworICAgIHByaW50ZigiJXMsIGxpc3RlZCBiZWxvdzpcbiIsIEZvcm1hdFRlc3RDb3VudChmYWlsZWRfdGVzdF9jb3VudCkuY19zdHIoKSk7CisgICAgUHJpbnRGYWlsZWRUZXN0cyh1bml0X3Rlc3QpOworICAgIHByaW50ZigiXG4lMmQgRkFJTEVEICVzXG4iLCBudW1fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fZmFpbHVyZXMgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpOworICB9CisKKyAgaW50IG51bV9kaXNhYmxlZCA9IHVuaXRfdGVzdC5kaXNhYmxlZF90ZXN0X2NvdW50KCk7CisgIGlmIChudW1fZGlzYWJsZWQgJiYgIUdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB7CisgICAgaWYgKCFudW1fZmFpbHVyZXMpIHsKKyAgICAgIHByaW50ZigiXG4iKTsgIC8vIEFkZCBhIHNwYWNlciBpZiBubyBGQUlMVVJFIGJhbm5lciBpcyBkaXNwbGF5ZWQuCisgICAgfQorICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAorICAgICAgICAgICAgICAgICAgIiAgWU9VIEhBVkUgJWQgRElTQUJMRUQgJXNcblxuIiwKKyAgICAgICAgICAgICAgICAgIG51bV9kaXNhYmxlZCwKKyAgICAgICAgICAgICAgICAgIG51bV9kaXNhYmxlZCA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CisgIH0KKyAgLy8gRW5zdXJlIHRoYXQgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIHByaW50ZWQgYmVmb3JlLCBlLmcuLCBoZWFwY2hlY2tlciBvdXRwdXQuCisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBFbmQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyCisKKy8vIGNsYXNzIFRlc3RFdmVudFJlcGVhdGVyCisvLworLy8gVGhpcyBjbGFzcyBmb3J3YXJkcyBldmVudHMgdG8gb3RoZXIgZXZlbnQgbGlzdGVuZXJzLgorY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgVGVzdEV2ZW50UmVwZWF0ZXIoKSA6IGZvcndhcmRpbmdfZW5hYmxlZF8odHJ1ZSkge30KKyAgdmlydHVhbCB+VGVzdEV2ZW50UmVwZWF0ZXIoKTsKKyAgdm9pZCBBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIFJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCB0byBsaXN0ZW5lcnNfLiBTZXQgdG8gZmFsc2UKKyAgLy8gaW4gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzZXMuCisgIGJvb2wgZm9yd2FyZGluZ19lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZm9yd2FyZGluZ19lbmFibGVkXzsgfQorICB2b2lkIHNldF9mb3J3YXJkaW5nX2VuYWJsZWQoYm9vbCBlbmFibGUpIHsgZm9yd2FyZGluZ19lbmFibGVkXyA9IGVuYWJsZTsgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisKKyBwcml2YXRlOgorICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCB0byBsaXN0ZW5lcnNfLiBTZXQgdG8gZmFsc2UKKyAgLy8gaW4gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzZXMuCisgIGJvb2wgZm9yd2FyZGluZ19lbmFibGVkXzsKKyAgLy8gVGhlIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgcmVjZWl2ZSBldmVudHMuCisgIHN0ZDo6dmVjdG9yPFRlc3RFdmVudExpc3RlbmVyKj4gbGlzdGVuZXJzXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudFJlcGVhdGVyKTsKK307CisKK1Rlc3RFdmVudFJlcGVhdGVyOjp+VGVzdEV2ZW50UmVwZWF0ZXIoKSB7CisgIEZvckVhY2gobGlzdGVuZXJzXywgRGVsZXRlPFRlc3RFdmVudExpc3RlbmVyPik7Cit9CisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpIHsKKyAgbGlzdGVuZXJzXy5wdXNoX2JhY2sobGlzdGVuZXIpOworfQorCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBGYWN0b3IgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGludG8gVmVjdG9yOjpGaW5kLgorVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudFJlcGVhdGVyOjpSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobGlzdGVuZXJzX1tpXSA9PSBsaXN0ZW5lcikgeworICAgICAgbGlzdGVuZXJzXy5lcmFzZShsaXN0ZW5lcnNfLmJlZ2luKCkgKyBpKTsKKyAgICAgIHJldHVybiBsaXN0ZW5lcjsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLy8gU2luY2UgbW9zdCBtZXRob2RzIGFyZSB2ZXJ5IHNpbWlsYXIsIHVzZSBtYWNyb3MgdG8gcmVkdWNlIGJvaWxlcnBsYXRlLgorLy8gVGhpcyBkZWZpbmVzIGEgbWVtYmVyIHRoYXQgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYWxsIGxpc3RlbmVycy4KKyNkZWZpbmUgR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcCit2b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpOYW1lKGNvbnN0IFR5cGUmIHBhcmFtZXRlcikgeyBcCisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7IFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsgXAorICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCisgICAgfSBcCisgIH0gXAorfQorLy8gVGhpcyBkZWZpbmVzIGEgbWVtYmVyIHRoYXQgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYWxsIGxpc3RlbmVycyBpbiByZXZlcnNlCisvLyBvcmRlci4KKyNkZWZpbmUgR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAorICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7IFwKKyAgICAgIGxpc3RlbmVyc19baV0tPk5hbWUocGFyYW1ldGVyKTsgXAorICAgIH0gXAorICB9IFwKK30KKworR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1NldFVwU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlU3RhcnQsIFRlc3RDYXNlKQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RTdGFydCwgVGVzdEluZm8pCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFBhcnRSZXN1bHQsIFRlc3RQYXJ0UmVzdWx0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBFbmQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdEVuZCwgVGVzdEluZm8pCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0Q2FzZUVuZCwgVGVzdENhc2UpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UHJvZ3JhbUVuZCwgVW5pdFRlc3QpCisKKyN1bmRlZiBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfCisjdW5kZWYgR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfCisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25TdGFydCh1bml0X3Rlc3QsIGl0ZXJhdGlvbik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihsaXN0ZW5lcnNfLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgbGlzdGVuZXJzX1tpXS0+T25UZXN0SXRlcmF0aW9uRW5kKHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKworLy8gRW5kIFRlc3RFdmVudFJlcGVhdGVyCisKKy8vIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIGFuIFhNTCBvdXRwdXQgZmlsZS4KK2NsYXNzIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSk7CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKworIHByaXZhdGU6CisgIC8vIElzIGMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciB0aGF0IGlzIG5vcm1hbGl6ZWQgdG8gYSBzcGFjZSBjaGFyYWN0ZXIKKyAgLy8gd2hlbiBpdCBhcHBlYXJzIGluIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWU/CisgIHN0YXRpYyBib29sIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAweDkgfHwgYyA9PSAweEEgfHwgYyA9PSAweEQ7CisgIH0KKworICAvLyBNYXkgYyBhcHBlYXIgaW4gYSB3ZWxsLWZvcm1lZCBYTUwgZG9jdW1lbnQ/CisgIHN0YXRpYyBib29sIElzVmFsaWRYbWxDaGFyYWN0ZXIoY2hhciBjKSB7CisgICAgcmV0dXJuIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjKSB8fCBjID49IDB4MjA7CisgIH0KKworICAvLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZgorICAvLyBpc19hdHRyaWJ1dGUgaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZQorICAvLyB2YWx1ZSwgYW5kIG5vcm1hbGl6YWJsZSB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBieSByZXBsYWNpbmcgaXQKKyAgLy8gd2l0aCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbChjb25zdCBjaGFyKiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKTsKKworICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgorICBzdGF0aWMgc3RyaW5nIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IHN0cmluZyYgc3RyKTsKKworICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgYW4gYXR0cmlidXRlIHZhbHVlLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sQXR0cmlidXRlKGNvbnN0IGNoYXIqIHN0cikgeworICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCB0cnVlKTsKKyAgfQorCisgIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIEVzY2FwZVhtbCB3aGVuIHN0ciBpcyBub3QgYW4gYXR0cmlidXRlIHZhbHVlLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sVGV4dChjb25zdCBjaGFyKiBzdHIpIHsKKyAgICByZXR1cm4gRXNjYXBlWG1sKHN0ciwgZmFsc2UpOworICB9CisKKyAgLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgorICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZGF0YSk7CisKKyAgLy8gU3RyZWFtcyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCisgIHN0YXRpYyB2b2lkIE91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKworICAvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdENhc2Ugb2JqZWN0CisgIHN0YXRpYyB2b2lkIFByaW50WG1sVGVzdENhc2UoRklMRSogb3V0LCBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKworICAvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0LgorICBzdGF0aWMgdm9pZCBQcmludFhtbFVuaXRUZXN0KEZJTEUqIG91dCwgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisKKyAgLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKKyAgLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4KKyAgLy8gV2hlbiB0aGUgc3RkOjpzdHJpbmcgaXMgbm90IGVtcHR5LCBpdCBpbmNsdWRlcyBhIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcsCisgIC8vIHRvIGRlbGltaXQgdGhpcyBhdHRyaWJ1dGUgZnJvbSBwcmlvciBhdHRyaWJ1dGVzLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KTsKKworICAvLyBUaGUgb3V0cHV0IGZpbGUuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dF9maWxlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Cit9OworCisvLyBDcmVhdGVzIGEgbmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlci4KK1htbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6WG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKQorICAgIDogb3V0cHV0X2ZpbGVfKG91dHB1dF9maWxlKSB7CisgIGlmIChvdXRwdXRfZmlsZV8uY19zdHIoKSA9PSBOVUxMIHx8IG91dHB1dF9maWxlXy5lbXB0eSgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJYTUwgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBudWxsXG4iKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KK30KKworLy8gQ2FsbGVkIGFmdGVyIHRoZSB1bml0IHRlc3QgZW5kcy4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyAgRklMRSogeG1sb3V0ID0gTlVMTDsKKyAgRmlsZVBhdGggb3V0cHV0X2ZpbGUob3V0cHV0X2ZpbGVfKTsKKyAgRmlsZVBhdGggb3V0cHV0X2RpcihvdXRwdXRfZmlsZS5SZW1vdmVGaWxlTmFtZSgpKTsKKworICBpZiAob3V0cHV0X2Rpci5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpIHsKKyAgICB4bWxvdXQgPSBwb3NpeDo6Rk9wZW4ob3V0cHV0X2ZpbGVfLmNfc3RyKCksICJ3Iik7CisgIH0KKyAgaWYgKHhtbG91dCA9PSBOVUxMKSB7CisgICAgLy8gVE9ETyh3YW4pOiByZXBvcnQgdGhlIHJlYXNvbiBvZiB0aGUgZmFpbHVyZS4KKyAgICAvLworICAgIC8vIFdlIGRvbid0IGRvIGl0IGZvciBub3cgYXM6CisgICAgLy8KKyAgICAvLyAgIDEuIFRoZXJlIGlzIG5vIHVyZ2VudCBuZWVkIGZvciBpdC4KKyAgICAvLyAgIDIuIEl0J3MgYSBiaXQgaW52b2x2ZWQgdG8gbWFrZSB0aGUgZXJybm8gdmFyaWFibGUgdGhyZWFkLXNhZmUgb24KKyAgICAvLyAgICAgIGFsbCB0aHJlZSBvcGVyYXRpbmcgc3lzdGVtcyAoTGludXgsIFdpbmRvd3MsIGFuZCBNYWMgT1MpLgorICAgIC8vICAgMy4gVG8gaW50ZXJwcmV0IHRoZSBtZWFuaW5nIG9mIGVycm5vIGluIGEgdGhyZWFkLXNhZmUgd2F5LAorICAgIC8vICAgICAgd2UgbmVlZCB0aGUgc3RyZXJyb3JfcigpIGZ1bmN0aW9uLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uCisgICAgLy8gICAgICBXaW5kb3dzLgorICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLAorICAgICAgICAgICAgb3V0cHV0X2ZpbGVfLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBQcmludFhtbFVuaXRUZXN0KHhtbG91dCwgdW5pdF90ZXN0KTsKKyAgZmNsb3NlKHhtbG91dCk7Cit9CisKKy8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmIGlzX2F0dHJpYnV0ZQorLy8gaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgYW5kCisvLyBub3JtYWxpemFibGUgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgYnkgcmVwbGFjaW5nIGl0IHdpdGggY2hhcmFjdGVyCisvLyByZWZlcmVuY2VzLgorLy8KKy8vIEludmFsaWQgWE1MIGNoYXJhY3RlcnMgaW4gc3RyLCBpZiBhbnksIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQuCisvLyBJdCBpcyBleHBlY3RlZCB0aGF0IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRoZSB0ZXh0IHByb2Nlc3NlZCBieSB0aGlzCisvLyBtb2R1bGUgd2lsbCBjb25zaXN0IG9mIG9yZGluYXJ5IEVuZ2xpc2ggdGV4dC4KKy8vIElmIHRoaXMgbW9kdWxlIGlzIGV2ZXIgbW9kaWZpZWQgdG8gcHJvZHVjZSB2ZXJzaW9uIDEuMSBYTUwgb3V0cHV0LAorLy8gbW9zdCBpbnZhbGlkIGNoYXJhY3RlcnMgY2FuIGJlIHJldGFpbmVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLgorLy8gVE9ETyh3YW4pOiBJdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBtaW5pbWFsbHkgaW52YXNpdmUsIGh1bWFuLXJlYWRhYmxlCisvLyBlc2NhcGluZyBzY2hlbWUgZm9yIGludmFsaWQgY2hhcmFjdGVycywgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlbS4KK3N0ZDo6c3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6RXNjYXBlWG1sKAorICAgIGNvbnN0IGNoYXIqIHN0ciwgYm9vbCBpc19hdHRyaWJ1dGUpIHsKKyAgTWVzc2FnZSBtOworCisgIGlmIChzdHIgIT0gTlVMTCkgeworICAgIGZvciAoY29uc3QgY2hhciogc3JjID0gc3RyOyAqc3JjOyArK3NyYykgeworICAgICAgc3dpdGNoICgqc3JjKSB7CisgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgIG0gPDwgIiZsdDsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICBtIDw8ICImZ3Q7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgbSA8PCAiJmFtcDsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkKKyAgICAgICAgICAgIG0gPDwgIiZhcG9zOyI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbSA8PCAnXCcnOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQorICAgICAgICAgICAgbSA8PCAiJnF1b3Q7IjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtIDw8ICciJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3Rlcigqc3JjKSkgeworICAgICAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSAmJiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoKnNyYykpCisgICAgICAgICAgICAgIG0gPDwgU3RyaW5nOjpGb3JtYXQoIiYjeCUwMlg7IiwgdW5zaWduZWQoKnNyYykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtIDw8ICpzcmM7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBtLkdldFN0cmluZygpOworfQorCisvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgorLy8gQ3VycmVudGx5IGludmFsaWQgY2hhcmFjdGVycyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBzdHJpbmcuIEFuCisvLyBhbHRlcm5hdGl2ZSBpcyB0byByZXBsYWNlIHRoZW0gd2l0aCBjZXJ0YWluIGNoYXJhY3RlcnMgc3VjaCBhcyAuIG9yID8uCitzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhjb25zdCBzdHJpbmcmIHN0cikgeworICBzdHJpbmcgb3V0cHV0OworICBvdXRwdXQucmVzZXJ2ZShzdHIuc2l6ZSgpKTsKKyAgZm9yIChzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RyLmJlZ2luKCk7IGl0ICE9IHN0ci5lbmQoKTsgKytpdCkKKyAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcigqaXQpKQorICAgICAgb3V0cHV0LnB1c2hfYmFjaygqaXQpOworCisgIHJldHVybiBvdXRwdXQ7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZ2VuZXJhdGUgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVW5pdFRlc3QKKy8vIG9iamVjdC4KKy8vCisvLyBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBjb25jZXB0cyBtYXAgdG8gdGhlIERURDoKKy8vCisvLyA8dGVzdHN1aXRlcyBuYW1lPSJBbGxUZXN0cyI+ICAgICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBVbml0VGVzdCBvYmplY3QKKy8vICAgPHRlc3RzdWl0ZSBuYW1lPSJ0ZXN0Y2FzZS1uYW1lIj4gIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RDYXNlIG9iamVjdAorLy8gICAgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0LW5hbWUiPiAgICAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdEluZm8gb2JqZWN0CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0gaW5kaXZpZHVhbCBhc3NlcnRpb24gZmFpbHVyZXMKKy8vICAgICA8L3Rlc3RjYXNlPgorLy8gICA8L3Rlc3RzdWl0ZT4KKy8vIDwvdGVzdHN1aXRlcz4KKworLy8gRm9ybWF0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgYXMgc2Vjb25kcy4KK3N0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgbXMvMTAwMC4wOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiBlcG9jaCB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhIGRhdGUgc3RyaW5nIGluIHRoZSBJU08KKy8vIDg2MDEgZm9ybWF0LCB3aXRob3V0IHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbi4KK3N0ZDo6c3RyaW5nIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKFRpbWVJbk1pbGxpcyBtcykgeworICAvLyBVc2luZyBub24tcmVlbnRyYW50IHZlcnNpb24gYXMgbG9jYWx0aW1lX3IgaXMgbm90IHBvcnRhYmxlLgorICB0aW1lX3Qgc2Vjb25kcyA9IHN0YXRpY19jYXN0PHRpbWVfdD4obXMgLyAxMDAwKTsKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUpLgorICBjb25zdCBzdHJ1Y3QgdG0qIGNvbnN0IHRpbWVfc3RydWN0ID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsgIC8vIE5PTElOVAorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZSBhZ2Fpbi4KKyNlbHNlCisgIGNvbnN0IHN0cnVjdCB0bSogY29uc3QgdGltZV9zdHJ1Y3QgPSBsb2NhbHRpbWUoJnNlY29uZHMpOyAgLy8gTk9MSU5UCisjZW5kaWYKKyAgaWYgKHRpbWVfc3RydWN0ID09IE5VTEwpCisgICAgcmV0dXJuICIiOyAgLy8gSW52YWxpZCBtcyB2YWx1ZQorCisgIHJldHVybiBTdHJpbmc6OkZvcm1hdCgiJWQtJTAyZC0lMDJkVCUwMmQ6JTAyZDolMDJkIiwgIC8vIFlZWVktTU0tRERUaGg6bW06c3MKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RydWN0LT50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RydWN0LT50bV9tb24gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9zdHJ1Y3QtPnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0cnVjdC0+dG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RydWN0LT50bV9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0cnVjdC0+dG1fc2VjKTsKK30KKworLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhKSB7CisgIGNvbnN0IGNoYXIqIHNlZ21lbnQgPSBkYXRhOworICAqc3RyZWFtIDw8ICI8IVtDREFUQVsiOworICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciogY29uc3QgbmV4dF9zZWdtZW50ID0gc3Ryc3RyKHNlZ21lbnQsICJdXT4iKTsKKyAgICBpZiAobmV4dF9zZWdtZW50ICE9IE5VTEwpIHsKKyAgICAgIHN0cmVhbS0+d3JpdGUoCisgICAgICAgICAgc2VnbWVudCwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihuZXh0X3NlZ21lbnQgLSBzZWdtZW50KSk7CisgICAgICAqc3RyZWFtIDw8ICJdXT5dXSZndDs8IVtDREFUQVsiOworICAgICAgc2VnbWVudCA9IG5leHRfc2VnbWVudCArIHN0cmxlbigiXV0+Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICpzdHJlYW0gPDwgc2VnbWVudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAqc3RyZWFtIDw8ICJdXT4iOworfQorCisvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgorLy8gVE9ETyh3YW4pOiBUaGVyZSBpcyBhbHNvIHZhbHVlIGluIHByaW50aW5nIHByb3BlcnRpZXMgd2l0aCB0aGUgcGxhaW4gcHJpbnRlci4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0ID0gKnRlc3RfaW5mby5yZXN1bHQoKTsKKyAgKnN0cmVhbSA8PCAiICAgIDx0ZXN0Y2FzZSBuYW1lPVwiIgorICAgICAgICAgIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2luZm8ubmFtZSgpKS5jX3N0cigpIDw8ICJcIiI7CisKKyAgaWYgKHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsKKyAgICAqc3RyZWFtIDw8ICIgdmFsdWVfcGFyYW09XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2luZm8udmFsdWVfcGFyYW0oKSkKKyAgICAgICAgICAgIDw8ICJcIiI7CisgIH0KKyAgaWYgKHRlc3RfaW5mby50eXBlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgICpzdHJlYW0gPDwgIiB0eXBlX3BhcmFtPVwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUodGVzdF9pbmZvLnR5cGVfcGFyYW0oKSkKKyAgICAgICAgICAgIDw8ICJcIiI7CisgIH0KKworICAqc3RyZWFtIDw8ICIgc3RhdHVzPVwiIgorICAgICAgICAgIDw8ICh0ZXN0X2luZm8uc2hvdWxkX3J1bigpID8gInJ1biIgOiAibm90cnVuIikKKyAgICAgICAgICA8PCAiXCIgdGltZT1cIiIKKyAgICAgICAgICA8PCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMocmVzdWx0LmVsYXBzZWRfdGltZSgpKQorICAgICAgICAgIDw8ICJcIiBjbGFzc25hbWU9XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2Nhc2VfbmFtZSkuY19zdHIoKQorICAgICAgICAgIDw8ICJcIiIgPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMocmVzdWx0KS5jX3N0cigpOworCisgIGludCBmYWlsdXJlcyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHBhcnQgPSByZXN1bHQuR2V0VGVzdFBhcnRSZXN1bHQoaSk7CisgICAgaWYgKHBhcnQuZmFpbGVkKCkpIHsKKyAgICAgIGlmICgrK2ZhaWx1cmVzID09IDEpIHsKKyAgICAgICAgKnN0cmVhbSA8PCAiPlxuIjsKKyAgICAgIH0KKyAgICAgIGNvbnN0IHN0cmluZyBsb2NhdGlvbiA9IGludGVybmFsOjpGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKAorICAgICAgICAgIHBhcnQuZmlsZV9uYW1lKCksIHBhcnQubGluZV9udW1iZXIoKSk7CisgICAgICBjb25zdCBzdHJpbmcgc3VtbWFyeSA9IGxvY2F0aW9uICsgIlxuIiArIHBhcnQuc3VtbWFyeSgpOworICAgICAgKnN0cmVhbSA8PCAiICAgICAgPGZhaWx1cmUgbWVzc2FnZT1cIiIKKyAgICAgICAgICAgICAgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHN1bW1hcnkuY19zdHIoKSkKKyAgICAgICAgICAgICAgPDwgIlwiIHR5cGU9XCJcIj4iOworICAgICAgY29uc3Qgc3RyaW5nIGRldGFpbCA9IGxvY2F0aW9uICsgIlxuIiArIHBhcnQubWVzc2FnZSgpOworICAgICAgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKHN0cmVhbSwgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoZGV0YWlsKS5jX3N0cigpKTsKKyAgICAgICpzdHJlYW0gPDwgIjwvZmFpbHVyZT5cbiI7CisgICAgfQorICB9CisKKyAgaWYgKGZhaWx1cmVzID09IDApCisgICAgKnN0cmVhbSA8PCAiIC8+XG4iOworICBlbHNlCisgICAgKnN0cmVhbSA8PCAiICAgIDwvdGVzdGNhc2U+XG4iOworfQorCisvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdENhc2Ugb2JqZWN0Cit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRYbWxUZXN0Q2FzZShGSUxFKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGZwcmludGYob3V0LAorICAgICAgICAgICIgIDx0ZXN0c3VpdGUgbmFtZT1cIiVzXCIgdGVzdHM9XCIlZFwiIGZhaWx1cmVzPVwiJWRcIiAiCisgICAgICAgICAgImRpc2FibGVkPVwiJWRcIiAiLAorICAgICAgICAgIEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2Nhc2UubmFtZSgpKS5jX3N0cigpLAorICAgICAgICAgIHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCksCisgICAgICAgICAgdGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCksCisgICAgICAgICAgdGVzdF9jYXNlLmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIGZwcmludGYob3V0LAorICAgICAgICAgICJlcnJvcnM9XCIwXCIgdGltZT1cIiVzXCI+XG4iLAorICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraSkgeworICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIE91dHB1dFhtbFRlc3RJbmZvKCZzdHJlYW0sIHRlc3RfY2FzZS5uYW1lKCksICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSkpOworICAgIGZwcmludGYob3V0LCAiJXMiLCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKS5jX3N0cigpKTsKKyAgfQorICBmcHJpbnRmKG91dCwgIiAgPC90ZXN0c3VpdGU+XG4iKTsKK30KKworLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFVuaXRUZXN0KEZJTEUqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgZnByaW50ZihvdXQsICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOworICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAiPHRlc3RzdWl0ZXMgdGVzdHM9XCIlZFwiIGZhaWx1cmVzPVwiJWRcIiBkaXNhYmxlZD1cIiVkXCIgIgorICAgICAgICAgICJlcnJvcnM9XCIwXCIgdGltZXN0YW1wPVwiJXNcIiB0aW1lPVwiJXNcIiAiLAorICAgICAgICAgIHVuaXRfdGVzdC50b3RhbF90ZXN0X2NvdW50KCksCisgICAgICAgICAgdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCksCisgICAgICAgICAgdW5pdF90ZXN0LmRpc2FibGVkX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSh1bml0X3Rlc3Quc3RhcnRfdGltZXN0YW1wKCkpLmNfc3RyKCksCisgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgZnByaW50ZihvdXQsICJyYW5kb21fc2VlZD1cIiVkXCIgIiwgdW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpOworICB9CisgIGZwcmludGYob3V0LCAibmFtZT1cIkFsbFRlc3RzXCI+XG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkKKyAgICBQcmludFhtbFRlc3RDYXNlKG91dCwgKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKSk7CisgIGZwcmludGYob3V0LCAiPC90ZXN0c3VpdGVzPlxuIik7Cit9CisKKy8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCisvLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLgorc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcygKKyAgICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpIHsKKyAgTWVzc2FnZSBhdHRyaWJ1dGVzOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkgPSByZXN1bHQuR2V0VGVzdFByb3BlcnR5KGkpOworICAgIGF0dHJpYnV0ZXMgPDwgIiAiIDw8IHByb3BlcnR5LmtleSgpIDw8ICI9IgorICAgICAgICA8PCAiXCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZShwcm9wZXJ0eS52YWx1ZSgpKSA8PCAiXCIiOworICB9CisgIHJldHVybiBhdHRyaWJ1dGVzLkdldFN0cmluZygpOworfQorCisvLyBFbmQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKKy8vIFN0cmVhbXMgdGVzdCByZXN1bHRzIHRvIHRoZSBnaXZlbiBwb3J0IG9uIHRoZSBnaXZlbiBob3N0IG1hY2hpbmUuCitjbGFzcyBTdHJlYW1pbmdMaXN0ZW5lciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIC8vIEVzY2FwZXMgJz0nLCAnJicsICclJywgYW5kICdcbicgY2hhcmFjdGVycyBpbiBzdHIgYXMgIiV4eCIuCisgIHN0YXRpYyBzdHJpbmcgVXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cik7CisKKyAgU3RyZWFtaW5nTGlzdGVuZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpCisgICAgICA6IHNvY2tmZF8oLTEpLCBob3N0X25hbWVfKGhvc3QpLCBwb3J0X251bV8ocG9ydCkgeworICAgIE1ha2VDb25uZWN0aW9uKCk7CisgICAgU2VuZCgiZ3Rlc3Rfc3RyZWFtaW5nX3Byb3RvY29sX3ZlcnNpb249MS4wXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgflN0cmVhbWluZ0xpc3RlbmVyKCkgeworICAgIGlmIChzb2NrZmRfICE9IC0xKQorICAgICAgQ2xvc2VDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovKSB7CisgICAgU2VuZCgiZXZlbnQ9VGVzdFByb2dyYW1TdGFydFxuIik7CisgIH0KKworICB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICAgIC8vIE5vdGUgdGhhdCBHb29nbGUgVGVzdCBjdXJyZW50IG9ubHkgcmVwb3J0IGVsYXBzZWQgdGltZSBmb3IgZWFjaAorICAgIC8vIHRlc3QgaXRlcmF0aW9uLCBub3QgZm9yIHRoZSBlbnRpcmUgdGVzdCBwcm9ncmFtLgorICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RQcm9ncmFtRW5kJnBhc3NlZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdGVzdC5QYXNzZWQoKSkpOworCisgICAgLy8gTm90aWZ5IHRoZSBzdHJlYW1pbmcgc2VydmVyIHRvIHN0b3AuCisgICAgQ2xvc2VDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8sIGludCBpdGVyYXRpb24pIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0SXRlcmF0aW9uU3RhcnQmaXRlcmF0aW9uPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uKSk7CisgIH0KKworICB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgLyogaXRlcmF0aW9uICovKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdEl0ZXJhdGlvbkVuZCZwYXNzZWQ9JWQmZWxhcHNlZF90aW1lPSVzbXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0X3Rlc3QuUGFzc2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKSk7CisgIH0KKworICB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdENhc2VTdGFydCZuYW1lPSVzXG4iLCB0ZXN0X2Nhc2UubmFtZSgpKSk7CisgIH0KKworICB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RDYXNlRW5kJnBhc3NlZD0lZCZlbGFwc2VkX3RpbWU9JXNtc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2FzZS5QYXNzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RTdGFydCZuYW1lPSVzXG4iLCB0ZXN0X2luZm8ubmFtZSgpKSk7CisgIH0KKworICB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgImV2ZW50PVRlc3RFbmQmcGFzc2VkPSVkJmVsYXBzZWRfdGltZT0lc21zXG4iLAorICAgICAgICAodGVzdF9pbmZvLnJlc3VsdCgpKS0+UGFzc2VkKCksCisgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZygodGVzdF9pbmZvLnJlc3VsdCgpKS0+ZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSA9IHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCk7CisgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKQorICAgICAgZmlsZV9uYW1lID0gIiI7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdFBhcnRSZXN1bHQmZmlsZT0lcyZsaW5lPSVkJm1lc3NhZ2U9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVybEVuY29kZShmaWxlX25hbWUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpKTsKKyAgICBTZW5kKFVybEVuY29kZSh0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkgKyAiXG4iKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQ3JlYXRlcyBhIGNsaWVudCBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIuCisgIHZvaWQgTWFrZUNvbm5lY3Rpb24oKTsKKworICAvLyBDbG9zZXMgdGhlIHNvY2tldC4KKyAgdm9pZCBDbG9zZUNvbm5lY3Rpb24oKSB7CisgICAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gIT0gLTEpCisgICAgICAgIDw8ICJDbG9zZUNvbm5lY3Rpb24oKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKKworICAgIGNsb3NlKHNvY2tmZF8pOworICAgIHNvY2tmZF8gPSAtMTsKKyAgfQorCisgIC8vIFNlbmRzIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCisgIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKKyAgICAgICAgPDwgIlNlbmQoKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKKworICAgIGNvbnN0IGludCBsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2UubGVuZ3RoKCkpOworICAgIGlmICh3cml0ZShzb2NrZmRfLCBtZXNzYWdlLmNfc3RyKCksIGxlbikgIT0gbGVuKSB7CisgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpCisgICAgICAgICAgPDwgInN0cmVhbV9yZXN1bHRfdG86IGZhaWxlZCB0byBzdHJlYW0gdG8gIgorICAgICAgICAgIDw8IGhvc3RfbmFtZV8gPDwgIjoiIDw8IHBvcnRfbnVtXzsKKyAgICB9CisgIH0KKworICBpbnQgc29ja2ZkXzsgICAvLyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgIGNvbnN0IHN0cmluZyBob3N0X25hbWVfOworICBjb25zdCBzdHJpbmcgcG9ydF9udW1fOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyZWFtaW5nTGlzdGVuZXIpOworfTsgIC8vIGNsYXNzIFN0cmVhbWluZ0xpc3RlbmVyCisKKy8vIENoZWNrcyBpZiBzdHIgY29udGFpbnMgJz0nLCAnJicsICclJyBvciAnXG4nIGNoYXJhY3RlcnMuIElmIHllcywKKy8vIHJlcGxhY2VzIHRoZW0gYnkgIiV4eCIgd2hlcmUgeHggaXMgdGhlaXIgaGV4YWRlY2ltYWwgdmFsdWUuIEZvcgorLy8gZXhhbXBsZSwgcmVwbGFjZXMgIj0iIHdpdGggIiUzRCIuICBUaGlzIGFsZ29yaXRobSBpcyBPKHN0cmxlbihzdHIpKQorLy8gaW4gYm90aCB0aW1lIGFuZCBzcGFjZSAtLSBpbXBvcnRhbnQgYXMgdGhlIGlucHV0IHN0ciBtYXkgY29udGFpbiBhbgorLy8gYXJiaXRyYXJpbHkgbG9uZyB0ZXN0IGZhaWx1cmUgbWVzc2FnZSBhbmQgc3RhY2sgdHJhY2UuCitzdHJpbmcgU3RyZWFtaW5nTGlzdGVuZXI6OlVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoc3RybGVuKHN0cikgKyAxKTsKKyAgZm9yIChjaGFyIGNoID0gKnN0cjsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHIpIHsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlICclJzoKKyAgICAgIGNhc2UgJz0nOgorICAgICAgY2FzZSAnJic6CisgICAgICBjYXNlICdcbic6CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nOjpGb3JtYXQoIiUlJTAyeCIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTdHJlYW1pbmdMaXN0ZW5lcjo6TWFrZUNvbm5lY3Rpb24oKSB7CisgIEdURVNUX0NIRUNLXyhzb2NrZmRfID09IC0xKQorICAgICAgPDwgIk1ha2VDb25uZWN0aW9uKCkgY2FuJ3QgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24uIjsKKworICBhZGRyaW5mbyBoaW50czsKKyAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgICAgLy8gVG8gYWxsb3cgYm90aCBJUHY0IGFuZCBJUHY2IGFkZHJlc3Nlcy4KKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgYWRkcmluZm8qIHNlcnZpbmZvID0gTlVMTDsKKworICAvLyBVc2UgdGhlIGdldGFkZHJpbmZvKCkgdG8gZ2V0IGEgbGlua2VkIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIGZvcgorICAvLyB0aGUgZ2l2ZW4gaG9zdCBuYW1lLgorICBjb25zdCBpbnQgZXJyb3JfbnVtID0gZ2V0YWRkcmluZm8oCisgICAgICBob3N0X25hbWVfLmNfc3RyKCksIHBvcnRfbnVtXy5jX3N0cigpLCAmaGludHMsICZzZXJ2aW5mbyk7CisgIGlmIChlcnJvcl9udW0gIT0gMCkgeworICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgInN0cmVhbV9yZXN1bHRfdG86IGdldGFkZHJpbmZvKCkgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBnYWlfc3RyZXJyb3IoZXJyb3JfbnVtKTsKKyAgfQorCisgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHJlc3VsdHMgYW5kIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHdlIGNhbi4KKyAgZm9yIChhZGRyaW5mbyogY3VyX2FkZHIgPSBzZXJ2aW5mbzsgc29ja2ZkXyA9PSAtMSAmJiBjdXJfYWRkciAhPSBOVUxMOworICAgICAgIGN1cl9hZGRyID0gY3VyX2FkZHItPmFpX25leHQpIHsKKyAgICBzb2NrZmRfID0gc29ja2V0KAorICAgICAgICBjdXJfYWRkci0+YWlfZmFtaWx5LCBjdXJfYWRkci0+YWlfc29ja3R5cGUsIGN1cl9hZGRyLT5haV9wcm90b2NvbCk7CisgICAgaWYgKHNvY2tmZF8gIT0gLTEpIHsKKyAgICAgIC8vIENvbm5lY3QgdGhlIGNsaWVudCBzb2NrZXQgdG8gdGhlIHNlcnZlciBzb2NrZXQuCisgICAgICBpZiAoY29ubmVjdChzb2NrZmRfLCBjdXJfYWRkci0+YWlfYWRkciwgY3VyX2FkZHItPmFpX2FkZHJsZW4pID09IC0xKSB7CisgICAgICAgIGNsb3NlKHNvY2tmZF8pOworICAgICAgICBzb2NrZmRfID0gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnJlZWFkZHJpbmZvKHNlcnZpbmZvKTsgIC8vIGFsbCBkb25lIHdpdGggdGhpcyBzdHJ1Y3R1cmUKKworICBpZiAoc29ja2ZkXyA9PSAtMSkgeworICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgInN0cmVhbV9yZXN1bHRfdG86IGZhaWxlZCB0byBjb25uZWN0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGhvc3RfbmFtZV8gPDwgIjoiIDw8IHBvcnRfbnVtXzsKKyAgfQorfQorCisvLyBFbmQgb2YgY2xhc3MgU3RyZWFtaW5nIExpc3RlbmVyCisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU19fCisKKy8vIENsYXNzIFNjb3BlZFRyYWNlCisKKy8vIFB1c2hlcyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gYW5kIG1lc3NhZ2Ugb250byBhIHBlci10aHJlYWQKKy8vIHRyYWNlIHN0YWNrIG1haW50YWluZWQgYnkgR29vZ2xlIFRlc3QuCitTY29wZWRUcmFjZTo6U2NvcGVkVHJhY2UoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oJlVuaXRUZXN0OjptdXRleF8pIHsKKyAgVHJhY2VJbmZvIHRyYWNlOworICB0cmFjZS5maWxlID0gZmlsZTsKKyAgdHJhY2UubGluZSA9IGxpbmU7CisgIHRyYWNlLm1lc3NhZ2UgPSBtZXNzYWdlLkdldFN0cmluZygpOworCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5QdXNoR1Rlc3RUcmFjZSh0cmFjZSk7Cit9CisKKy8vIFBvcHMgdGhlIGluZm8gcHVzaGVkIGJ5IHRoZSBjJ3Rvci4KK1Njb3BlZFRyYWNlOjp+U2NvcGVkVHJhY2UoKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKCZVbml0VGVzdDo6bXV0ZXhfKSB7CisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5Qb3BHVGVzdFRyYWNlKCk7Cit9CisKKworLy8gY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVyCisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuICBQYXJhbWV0ZXJzOgorLy8KKy8vICAgbWF4X2RlcHRoICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQKKy8vICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZS4KKy8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50CisvLyAgICAgICAgICAgICAgICBhZ2FpbnN0IG1heF9kZXB0aC4KKy8vCitzdHJpbmcgT3NTdGFja1RyYWNlR2V0dGVyOjpDdXJyZW50U3RhY2tUcmFjZShpbnQgLyogbWF4X2RlcHRoICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNraXBfY291bnQgKi8pCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIHJldHVybiAiIjsKK30KKwordm9pZCBPc1N0YWNrVHJhY2VHZXR0ZXI6OlVwb25MZWF2aW5nR1Rlc3QoKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworfQorCitjb25zdCBjaGFyKiBjb25zdAorT3NTdGFja1RyYWNlR2V0dGVyOjprRWxpZGVkRnJhbWVzTWFya2VyID0KKyAgICAiLi4uICIgR1RFU1RfTkFNRV8gIiBpbnRlcm5hbCBmcmFtZXMgLi4uIjsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RFdmVudExpc3RlbmVycworCitUZXN0RXZlbnRMaXN0ZW5lcnM6OlRlc3RFdmVudExpc3RlbmVycygpCisgICAgOiByZXBlYXRlcl8obmV3IGludGVybmFsOjpUZXN0RXZlbnRSZXBlYXRlcigpKSwKKyAgICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKE5VTEwpLAorICAgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyhOVUxMKSB7Cit9CisKK1Rlc3RFdmVudExpc3RlbmVyczo6flRlc3RFdmVudExpc3RlbmVycygpIHsgZGVsZXRlIHJlcGVhdGVyXzsgfQorCisvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQorLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQKKy8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKKy8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgdXNlci4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIHJlcGVhdGVyXy0+QXBwZW5kKGxpc3RlbmVyKTsKK30KKworLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4KKy8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKKy8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChsaXN0ZW5lciA9PSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXykKKyAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyA9IE5VTEw7CisgIGVsc2UgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pCisgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyA9IE5VTEw7CisgIHJldHVybiByZXBlYXRlcl8tPlJlbGVhc2UobGlzdGVuZXIpOworfQorCisvLyBSZXR1cm5zIHJlcGVhdGVyIHRoYXQgYnJvYWRjYXN0cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgZXZlbnRzIHRvIGFsbAorLy8gc3Vic2NyaWJlcnMuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50TGlzdGVuZXJzOjpyZXBlYXRlcigpIHsgcmV0dXJuIHJlcGVhdGVyXzsgfQorCisvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisvLyBUaGUgbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKKy8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gIT0gbGlzdGVuZXIpIHsKKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBwYXNzIHRoaXMgbWV0aG9kIGEgbGlzdGVuZXIgdGhhdCBpcyBhbHJlYWR5IGluIHRoZQorICAgIC8vIGxpc3QuCisgICAgZGVsZXRlIFJlbGVhc2UoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8pOworICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIFNldHMgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLiAgVGhlCisvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworLy8gZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKy8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyAhPSBsaXN0ZW5lcikgeworICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCisgICAgLy8gbGlzdC4KKyAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3htbF9nZW5lcmF0b3JfKTsKKyAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIGJ5IHRoZSByZXBlYXRlciB0byB0aGUKKy8vIGxpc3RlbmVycyBpbiB0aGUgbGlzdC4KK2Jvb2wgVGVzdEV2ZW50TGlzdGVuZXJzOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gcmVwZWF0ZXJfLT5mb3J3YXJkaW5nX2VuYWJsZWQoKTsKK30KKwordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCkgeworICByZXBlYXRlcl8tPnNldF9mb3J3YXJkaW5nX2VuYWJsZWQoZmFsc2UpOworfQorCisvLyBjbGFzcyBVbml0VGVzdAorCisvLyBHZXRzIHRoZSBzaW5nbGV0b24gVW5pdFRlc3Qgb2JqZWN0LiAgVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMKKy8vIGNhbGxlZCwgYSBVbml0VGVzdCBvYmplY3QgaXMgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLiAgQ29uc2VjdXRpdmUKKy8vIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIG9iamVjdC4KKy8vCisvLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfIGFzIGEgdXNlciBpcyBub3Qgc3VwcG9zZWQgdG8KKy8vIGNhbGwgdGhpcyBiZWZvcmUgbWFpbigpIHN0YXJ0cywgZnJvbSB3aGljaCBwb2ludCBvbiB0aGUgcmV0dXJuCisvLyB2YWx1ZSB3aWxsIG5ldmVyIGNoYW5nZS4KK1VuaXRUZXN0ICogVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkgeworICAvLyBXaGVuIGNvbXBpbGVkIHdpdGggTVNWQyA3LjEgaW4gb3B0aW1pemVkIG1vZGUsIGRlc3Ryb3lpbmcgdGhlCisgIC8vIFVuaXRUZXN0IG9iamVjdCB1cG9uIGV4aXRpbmcgdGhlIHByb2dyYW0gbWVzc2VzIHVwIHRoZSBleGl0IGNvZGUsCisgIC8vIGNhdXNpbmcgc3VjY2Vzc2Z1bCB0ZXN0cyB0byBhcHBlYXIgZmFpbGVkLiAgV2UgaGF2ZSB0byB1c2UgYQorICAvLyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBjYXNlIHRvIGJ5cGFzcyB0aGUgY29tcGlsZXIgYnVnLgorICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHRoZSBjb21waWxlciBoYXBweSwgYXQgdGhlIGNvc3Qgb2YKKyAgLy8gbGVha2luZyB0aGUgVW5pdFRlc3Qgb2JqZWN0LgorCisgIC8vIENvZGVHZWFyIEMrK0J1aWxkZXIgaW5zaXN0cyBvbiBhIHB1YmxpYyBkZXN0cnVjdG9yIGZvciB0aGUKKyAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gIFVzZSB0aGlzIGltcGxlbWVudGF0aW9uIHRvIGtlZXAgZ29vZCBPTworICAvLyBkZXNpZ24gd2l0aCBwcml2YXRlIGRlc3RydWN0b3IuCisKKyNpZiAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgc3RhdGljIFVuaXRUZXN0KiBjb25zdCBpbnN0YW5jZSA9IG5ldyBVbml0VGVzdDsKKyAgcmV0dXJuIGluc3RhbmNlOworI2Vsc2UKKyAgc3RhdGljIFVuaXRUZXN0IGluc3RhbmNlOworICByZXR1cm4gJmluc3RhbmNlOworI2VuZGlmICAvLyAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3Q6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKy8vIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2NvdW50KCk7IH0KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgoraW50IFVuaXRUZXN0OjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5kaXNhYmxlZF90ZXN0X2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dGVzdF90b19ydW5fY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorLy8gVU5JWCBlcG9jaC4KK2ludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OnN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbCgpLT5zdGFydF90aW1lc3RhbXAoKTsKK30KKworLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCitpbnRlcm5hbDo6VGltZUluTWlsbGlzIFVuaXRUZXN0OjplbGFwc2VkX3RpbWUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmVsYXBzZWRfdGltZSgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCitib29sIFVuaXRUZXN0OjpQYXNzZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPlBhc3NlZCgpOyB9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KK2Jvb2wgVW5pdFRlc3Q6OkZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+RmFpbGVkKCk7IH0KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5HZXRUZXN0Q2FzZShpKTsKK30KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpIHsKKyAgcmV0dXJuIGltcGwoKS0+R2V0TXV0YWJsZVRlc3RDYXNlKGkpOworfQorCisvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cworLy8gaW5zaWRlIEdvb2dsZSBUZXN0LgorVGVzdEV2ZW50TGlzdGVuZXJzJiBVbml0VGVzdDo6bGlzdGVuZXJzKCkgeworICByZXR1cm4gKmltcGwoKS0+bGlzdGVuZXJzKCk7Cit9CisKKy8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QKKy8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluIHRoZQorLy8gb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuICBBZnRlciBhbGwgdGVzdHMgaW4gdGhlIHByb2dyYW0gaGF2ZQorLy8gZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4gdGhlCisvLyAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisvLworLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50LgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8sIGFzIHdlIG9ubHkgc3VwcG9ydCBjYWxsaW5nIGl0CisvLyBmcm9tIHRoZSBtYWluIHRocmVhZC4KK0Vudmlyb25tZW50KiBVbml0VGVzdDo6QWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeworICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGltcGxfLT5lbnZpcm9ubWVudHMoKS5wdXNoX2JhY2soZW52KTsKKyAgcmV0dXJuIGVudjsKK30KKworLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsIEdvb2dsZSBUZXN0CisvLyBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykgZXZlbnR1YWxseSBjYWxsCisvLyB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZSBzaG91bGQgdXNlIHRoZQorLy8gYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KK3ZvaWQgVW5pdFRlc3Q6OkFkZFRlc3RQYXJ0UmVzdWx0KAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwKKyAgICBpbnQgbGluZV9udW1iZXIsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX3N0YWNrX3RyYWNlKQorICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBtZXNzYWdlOworCisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaWYgKGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSA+IDApIHsKKyAgICBtc2cgPDwgIlxuIiA8PCBHVEVTVF9OQU1FXyA8PCAiIHRyYWNlOiI7CisKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkpOworICAgICAgICAgaSA+IDA7IC0taSkgeworICAgICAgY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UgPSBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKVtpIC0gMV07CisgICAgICBtc2cgPDwgIlxuIiA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRyYWNlLmZpbGUsIHRyYWNlLmxpbmUpCisgICAgICAgICAgPDwgIiAiIDw8IHRyYWNlLm1lc3NhZ2U7CisgICAgfQorICB9CisKKyAgaWYgKG9zX3N0YWNrX3RyYWNlLmNfc3RyKCkgIT0gTlVMTCAmJiAhb3Nfc3RhY2tfdHJhY2UuZW1wdHkoKSkgeworICAgIG1zZyA8PCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIgPDwgb3Nfc3RhY2tfdHJhY2U7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCByZXN1bHQgPQorICAgIFRlc3RQYXJ0UmVzdWx0KHJlc3VsdF90eXBlLCBmaWxlX25hbWUsIGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgaW1wbF8tPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCktPgorICAgICAgUmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKworICBpZiAocmVzdWx0X3R5cGUgIT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKSB7CisgICAgLy8gZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKyAgICAvLyBndGVzdF90aHJvd19vbl9mYWlsdXJlLiAgVGhpcyBhbGxvd3MgYSB1c2VyIHRvIHNldCB0aGUgbGF0dGVyCisgICAgLy8gaW4gdGhlIGNvZGUgKHBlcmhhcHMgaW4gb3JkZXIgdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMKKyAgICAvLyB3aXRoIGFub3RoZXIgdGVzdGluZyBmcmFtZXdvcmspIGFuZCBzcGVjaWZ5IHRoZSBmb3JtZXIgb24gdGhlCisgICAgLy8gY29tbWFuZCBsaW5lIGZvciBkZWJ1Z2dpbmcuCisgICAgaWYgKEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgICAgICAvLyBVc2luZyBEZWJ1Z0JyZWFrIG9uIFdpbmRvd3MgYWxsb3dzIGd0ZXN0IHRvIHN0aWxsIGJyZWFrIGludG8gYSBkZWJ1Z2dlcgorICAgICAgLy8gd2hlbiBhIGZhaWx1cmUgaGFwcGVucyBhbmQgYm90aCB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGFuZAorICAgICAgLy8gdGhlIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBmbGFncyBhcmUgc3BlY2lmaWVkLgorICAgICAgRGVidWdCcmVhaygpOworI2Vsc2UKKyAgICAgIC8vIERlcmVmZXJlbmNlIE5VTEwgdGhyb3VnaCBhIHZvbGF0aWxlIHBvaW50ZXIgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgICAgIC8vIGZyb20gcmVtb3ZpbmcuIFdlIHVzZSB0aGlzIHJhdGhlciB0aGFuIGFib3J0KCkgb3IgX19idWlsdGluX3RyYXAoKSBmb3IKKyAgICAgIC8vIHBvcnRhYmlsaXR5OiBTeW1iaWFuIGRvZXNuJ3QgaW1wbGVtZW50IGFib3J0KCkgd2VsbCwgYW5kIHNvbWUgZGVidWdnZXJzCisgICAgICAvLyBkb24ndCBjb3JyZWN0bHkgdHJhcCBhYm9ydCgpLgorICAgICAgKnN0YXRpY19jYXN0PHZvbGF0aWxlIGludCo+KE5VTEwpID0gMTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICAgIH0gZWxzZSBpZiAoR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgICAgICB0aHJvdyBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihyZXN1bHQpOworI2Vsc2UKKyAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIGFib3J0KCkgYXMgaXQgZ2VuZXJhdGVzIGEgcG9wLXVwIGluIGRlYnVnIG1vZGUKKyAgICAgIC8vIHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgaW4gVkMgNy4xIG9yIGJlbG93LgorICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgIH0KKyAgfQorfQorCisvLyBDcmVhdGVzIGFuZCBhZGRzIGEgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdC4gSWYgYSBwcm9wZXJ0eSBtYXRjaGluZworLy8gdGhlIHN1cHBsaWVkIHZhbHVlIGFscmVhZHkgZXhpc3RzLCB1cGRhdGVzIGl0cyB2YWx1ZSBpbnN0ZWFkLgordm9pZCBVbml0VGVzdDo6UmVjb3JkUHJvcGVydHlGb3JDdXJyZW50VGVzdChjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSB0ZXN0X3Byb3BlcnR5KGtleSwgdmFsdWUpOworICBpbXBsXy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5SZWNvcmRQcm9wZXJ0eSh0ZXN0X3Byb3BlcnR5KTsKK30KKworLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgorLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8sIGFzIHdlIG9ubHkgc3VwcG9ydCBjYWxsaW5nIGl0CisvLyBmcm9tIHRoZSBtYWluIHRocmVhZC4KK2ludCBVbml0VGVzdDo6UnVuKCkgeworICAvLyBDYXB0dXJlcyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKS4gIFRoaXMgdmFsdWUgd2lsbCBiZQorICAvLyB1c2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByb2dyYW0uCisgIGltcGwoKS0+c2V0X2NhdGNoX2V4Y2VwdGlvbnMoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7CisKKyNpZiBHVEVTVF9IQVNfU0VICisgIGNvbnN0IGJvb2wgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzID0KKyAgICAgIGludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5sZW5ndGgoKSA+IDA7CisKKyAgLy8gRWl0aGVyIHRoZSB1c2VyIHdhbnRzIEdvb2dsZSBUZXN0IHRvIGNhdGNoIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZQorICAvLyB0ZXN0cyBvciB0aGlzIGlzIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiBkZWF0aCB0ZXN0IGNoaWxkCisgIC8vIHByb2Nlc3MuIEluIGVpdGhlciBjYXNlIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gc2VlIHBvcC11cCBkaWFsb2dzCisgIC8vIGFib3V0IGNyYXNoZXMgLSB0aGV5IGFyZSBleHBlY3RlZC4KKyAgaWYgKGltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpIHx8IGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcykgeworIyBpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBTZXRFcnJvck1vZGUgZG9lc24ndCBleGlzdCBvbiBDRS4KKyAgICBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyB8IFNFTV9OT0FMSUdOTUVOVEZBVUxURVhDRVBUIHwKKyAgICAgICAgICAgICAgICAgU0VNX05PR1BGQVVMVEVSUk9SQk9YIHwgU0VNX05PT1BFTkZJTEVFUlJPUkJPWCk7CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworIyBpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgR1RFU1RfT1NfV0lORE9XU19NSU5HVykgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgICAgLy8gRGVhdGggdGVzdCBjaGlsZHJlbiBjYW4gYmUgdGVybWluYXRlZCB3aXRoIF9hYm9ydCgpLiAgT24gV2luZG93cywKKyAgICAvLyBfYWJvcnQoKSBjYW4gc2hvdyBhIGRpYWxvZyB3aXRoIGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBmb3JjZXMgdGhlCisgICAgLy8gYWJvcnQgbWVzc2FnZSB0byBnbyB0byBzdGRlcnIgaW5zdGVhZC4KKyAgICBfc2V0X2Vycm9yX21vZGUoX09VVF9UT19TVERFUlIpOworIyBlbmRpZgorCisjIGlmIF9NU0NfVkVSID49IDE0MDAgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgICAgLy8gSW4gdGhlIGRlYnVnIHZlcnNpb24sIFZpc3VhbCBTdHVkaW8gcG9wcyB1cCBhIHNlcGFyYXRlIGRpYWxvZworICAgIC8vIG9mZmVyaW5nIGEgY2hvaWNlIHRvIGRlYnVnIHRoZSBhYm9ydGVkIHByb2dyYW0uIFdlIG5lZWQgdG8gc3VwcHJlc3MKKyAgICAvLyB0aGlzIGRpYWxvZyBvciBpdCB3aWxsIHBvcCB1cCBmb3IgZXZlcnkgRVhQRUNUL0FTU0VSVF9ERUFUSCBzdGF0ZW1lbnQKKyAgICAvLyBleGVjdXRlZC4gR29vZ2xlIFRlc3Qgd2lsbCBub3RpZnkgdGhlIHVzZXIgb2YgYW55IHVuZXhwZWN0ZWQKKyAgICAvLyBmYWlsdXJlIHZpYSBzdGRlcnIuCisgICAgLy8KKyAgICAvLyBWQysrIGRvZXNuJ3QgZGVmaW5lIF9zZXRfYWJvcnRfYmVoYXZpb3IoKSBwcmlvciB0byB0aGUgdmVyc2lvbiA4LjAuCisgICAgLy8gVXNlcnMgb2YgcHJpb3IgVkMgdmVyc2lvbnMgc2hhbGwgc3VmZmVyIHRoZSBhZ29ueSBhbmQgcGFpbiBvZgorICAgIC8vIGNsaWNraW5nIHRocm91Z2ggdGhlIGNvdW50bGVzcyBkZWJ1ZyBkaWFsb2dzLgorICAgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IGZpbmQgYSB3YXkgdG8gc3VwcHJlc3MgdGhlIGFib3J0IGRpYWxvZygpIGluIHRoZQorICAgIC8vIGRlYnVnIG1vZGUgd2hlbiBjb21waWxlZCB3aXRoIFZDIDcuMSBvciBsb3dlci4KKyAgICBpZiAoIUdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpCisgICAgICBfc2V0X2Fib3J0X2JlaGF2aW9yKAorICAgICAgICAgIDB4MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICAgICAgIF9XUklURV9BQk9SVF9NU0cgfCBfQ0FMTF9SRVBPUlRGQVVMVCk7ICAvLyBwb3AtdXAgd2luZG93LCBjb3JlIGR1bXAuCisjIGVuZGlmCisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAorCisgIHJldHVybiBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICBpbXBsKCksCisgICAgICAmaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDo6UnVuQWxsVGVzdHMsCisgICAgICAiYXV4aWxpYXJ5IHRlc3QgY29kZSAoZW52aXJvbm1lbnRzIG9yIGV2ZW50IGxpc3RlbmVycykiKSA/IDAgOiAxOworfQorCisvLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCisvLyBleGVjdXRlZC4KK2NvbnN0IGNoYXIqIFVuaXRUZXN0OjpvcmlnaW5hbF93b3JraW5nX2RpcigpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5vcmlnaW5hbF93b3JraW5nX2Rpcl8uY19zdHIoKTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KK2NvbnN0IFRlc3RDYXNlKiBVbml0VGVzdDo6Y3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdAorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIHJldHVybiBpbXBsXy0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KK2NvbnN0IFRlc3RJbmZvKiBVbml0VGVzdDo6Y3VycmVudF90ZXN0X2luZm8oKSBjb25zdAorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIHJldHVybiBpbXBsXy0+Y3VycmVudF90ZXN0X2luZm8oKTsKK30KKworLy8gUmV0dXJucyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBydW4uCitpbnQgVW5pdFRlc3Q6OnJhbmRvbV9zZWVkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnJhbmRvbV9zZWVkKCk7IH0KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgoraW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JgorICAgIFVuaXRUZXN0OjpwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKQorICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgcmV0dXJuIGltcGxfLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBVbml0VGVzdC4KK1VuaXRUZXN0OjpVbml0VGVzdCgpIHsKKyAgaW1wbF8gPSBuZXcgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCh0aGlzKTsKK30KKworLy8gRGVzdHJ1Y3RvciBvZiBVbml0VGVzdC4KK1VuaXRUZXN0Ojp+VW5pdFRlc3QoKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KKworLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZAorLy8gR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCit2b2lkIFVuaXRUZXN0OjpQdXNoR1Rlc3RUcmFjZShjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSkKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5wdXNoX2JhY2sodHJhY2UpOworfQorCisvLyBQb3BzIGEgdHJhY2UgZnJvbSB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KK3ZvaWQgVW5pdFRlc3Q6OlBvcEdUZXN0VHJhY2UoKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnBvcF9iYWNrKCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK1VuaXRUZXN0SW1wbDo6VW5pdFRlc3RJbXBsKFVuaXRUZXN0KiBwYXJlbnQpCisgICAgOiBwYXJlbnRfKHBhcmVudCksCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM1NSkgICAgICAgICAgICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQzNTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHVzaW5nIHRoaXMgaW4gaW5pdGlhbGl6ZXIpLgorICAgICAgZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCisgICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZSBhZ2Fpbi4KKyNlbHNlCisgICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyNlbmRpZiAgLy8gX01TQ19WRVIKKyAgICAgIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfKAorICAgICAgICAgICZkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyksCisgICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKAorICAgICAgICAgICZkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLAorI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgICAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfKCksCisgICAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfKGZhbHNlKSwKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgICAgIGxhc3RfZGVhdGhfdGVzdF9jYXNlXygtMSksCisgICAgICBjdXJyZW50X3Rlc3RfY2FzZV8oTlVMTCksCisgICAgICBjdXJyZW50X3Rlc3RfaW5mb18oTlVMTCksCisgICAgICBhZF9ob2NfdGVzdF9yZXN1bHRfKCksCisgICAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfKE5VTEwpLAorICAgICAgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXyhmYWxzZSksCisgICAgICByYW5kb21fc2VlZF8oMCksICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZsYWcgYmVmb3JlIGZpcnN0IHVzZS4KKyAgICAgIHJhbmRvbV8oMCksICAvLyBXaWxsIGJlIHJlc2VlZGVkIGJlZm9yZSBmaXJzdCB1c2UuCisgICAgICBzdGFydF90aW1lc3RhbXBfKDApLAorICAgICAgZWxhcHNlZF90aW1lXygwKSwKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18oTlVMTCksCisgICAgICBkZWF0aF90ZXN0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSksCisjZW5kaWYKKyAgICAgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgY2F0Y2hfZXhjZXB0aW9uc18oZmFsc2UpIHsKKyAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRSZXN1bHRQcmludGVyKG5ldyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIpOworfQorCitVbml0VGVzdEltcGw6On5Vbml0VGVzdEltcGwoKSB7CisgIC8vIERlbGV0ZXMgZXZlcnkgVGVzdENhc2UuCisgIEZvckVhY2godGVzdF9jYXNlc18sIGludGVybmFsOjpEZWxldGU8VGVzdENhc2U+KTsKKworICAvLyBEZWxldGVzIGV2ZXJ5IEVudmlyb25tZW50LgorICBGb3JFYWNoKGVudmlyb25tZW50c18sIGludGVybmFsOjpEZWxldGU8RW52aXJvbm1lbnQ+KTsKKworICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKK30KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisvLyBEaXNhYmxlcyBldmVudCBmb3J3YXJkaW5nIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSBpbiBhIGRlYXRoIHRlc3QKKy8vIHN1YnByb2Nlc3MuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6U3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKSB7CisgIGlmIChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKQorICAgIGxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnMgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQorLy8gVW5pdFRlc3RPcHRpb25zLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVhtbE91dHB1dCgpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dF9mb3JtYXQgPSBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpOworICBpZiAob3V0cHV0X2Zvcm1hdCA9PSAieG1sIikgeworICAgIGxpc3RlbmVycygpLT5TZXREZWZhdWx0WG1sR2VuZXJhdG9yKG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoCisgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkuY19zdHIoKSkpOworICB9IGVsc2UgaWYgKG91dHB1dF9mb3JtYXQgIT0gIiIpIHsKKyAgICBwcmludGYoIldBUk5JTkc6IHVucmVjb2duaXplZCBvdXRwdXQgZm9ybWF0IFwiJXNcIiBpZ25vcmVkLlxuIiwKKyAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgfQorfQorCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIGluIHN0cmluZyBmb3JtLgorLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQgPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOworICBpZiAoIXRhcmdldC5lbXB0eSgpKSB7CisgICAgY29uc3Qgc2l6ZV90IHBvcyA9IHRhcmdldC5maW5kKCc6Jyk7CisgICAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgbGlzdGVuZXJzKCktPkFwcGVuZChuZXcgU3RyZWFtaW5nTGlzdGVuZXIodGFyZ2V0LnN1YnN0cigwLCBwb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnN1YnN0cihwb3MrMSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJXQVJOSU5HOiB1bnJlY29nbml6ZWQgc3RyZWFtaW5nIHRhcmdldCBcIiVzXCIgaWdub3JlZC5cbiIsCisgICAgICAgICAgICAgdGFyZ2V0LmNfc3RyKCkpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorICB9Cit9CisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4KKy8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvCisvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0CisvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpQb3N0RmxhZ1BhcnNpbmdJbml0KCkgeworICAvLyBFbnN1cmVzIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBleGVjdXRlIG1vcmUgdGhhbiBvbmNlLgorICBpZiAoIXBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8pIHsKKyAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfID0gdHJ1ZTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgICAgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpOworICAgIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgICAvLyBSZWdpc3RlcnMgcGFyYW1ldGVyaXplZCB0ZXN0cy4gVGhpcyBtYWtlcyBwYXJhbWV0ZXJpemVkIHRlc3RzCisgICAgLy8gYXZhaWxhYmxlIHRvIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSSB3aXRob3V0IHJ1bm5pbmcKKyAgICAvLyBSVU5fQUxMX1RFU1RTLgorICAgIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7CisKKyAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3IgWE1MIG91dHB1dC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXNlcnMKKyAgICAvLyB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dCBiZWZvcmUgaW52b2tpbmcgUlVOX0FMTF9URVNUUy4KKyAgICBDb25maWd1cmVYbWxPdXRwdXQoKTsKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4KKyAgICBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworICB9Cit9CisKKy8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBuYW1lIG9mIGEgVGVzdENhc2UgYWdhaW5zdCBhIGtub3duCisvLyB2YWx1ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcyBvbmx5LiAgV2UgcHV0CisvLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKKy8vIG5hbWVzcGFjZS4KKy8vCisvLyBUZXN0Q2FzZU5hbWVJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3RDYXNlTmFtZUlzIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICBleHBsaWNpdCBUZXN0Q2FzZU5hbWVJcyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKKyAgICAgIDogbmFtZV8obmFtZSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBuYW1lIG9mIHRlc3RfY2FzZSBtYXRjaGVzIG5hbWVfLgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2Nhc2UgIT0gTlVMTCAmJiBzdHJjbXAodGVzdF9jYXNlLT5uYW1lKCksIG5hbWVfLmNfc3RyKCkpID09IDA7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworLy8gRmluZHMgYW5kIHJldHVybnMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgb25lIGRvZXNuJ3QKKy8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4gIEl0J3MgdGhlIENBTExFUidTCisvLyBSRVNQT05TSUJJTElUWSB0byBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIFdIRU4gVEhFCisvLyBURVNUUyBBUkUgTk9UIFNIVUZGTEVELgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKK1Rlc3RDYXNlKiBVbml0VGVzdEltcGw6OkdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykgeworICAvLyBDYW4gd2UgZmluZCBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWU/CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj46OmNvbnN0X2l0ZXJhdG9yIHRlc3RfY2FzZSA9CisgICAgICBzdGQ6OmZpbmRfaWYodGVzdF9jYXNlc18uYmVnaW4oKSwgdGVzdF9jYXNlc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgVGVzdENhc2VOYW1lSXModGVzdF9jYXNlX25hbWUpKTsKKworICBpZiAodGVzdF9jYXNlICE9IHRlc3RfY2FzZXNfLmVuZCgpKQorICAgIHJldHVybiAqdGVzdF9jYXNlOworCisgIC8vIE5vLiAgTGV0J3MgY3JlYXRlIG9uZS4KKyAgVGVzdENhc2UqIGNvbnN0IG5ld190ZXN0X2Nhc2UgPQorICAgICAgbmV3IFRlc3RDYXNlKHRlc3RfY2FzZV9uYW1lLCB0eXBlX3BhcmFtLCBzZXRfdXBfdGMsIHRlYXJfZG93bl90Yyk7CisKKyAgLy8gSXMgdGhpcyBhIGRlYXRoIHRlc3QgY2FzZT8KKyAgaWYgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWF0aFRlc3RDYXNlRmlsdGVyKSkgeworICAgIC8vIFllcy4gIEluc2VydHMgdGhlIHRlc3QgY2FzZSBhZnRlciB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UKKyAgICAvLyBkZWZpbmVkIHNvIGZhci4gIFRoaXMgb25seSB3b3JrcyB3aGVuIHRoZSB0ZXN0IGNhc2VzIGhhdmVuJ3QKKyAgICAvLyBiZWVuIHNodWZmbGVkLiAgT3RoZXJ3aXNlIHdlIG1heSBlbmQgdXAgcnVubmluZyBhIGRlYXRoIHRlc3QKKyAgICAvLyBhZnRlciBhIG5vbi1kZWF0aCB0ZXN0LgorICAgICsrbGFzdF9kZWF0aF90ZXN0X2Nhc2VfOworICAgIHRlc3RfY2FzZXNfLmluc2VydCh0ZXN0X2Nhc2VzXy5iZWdpbigpICsgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdfdGVzdF9jYXNlKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBOby4gIEFwcGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICB0ZXN0X2Nhc2VzXy5wdXNoX2JhY2sobmV3X3Rlc3RfY2FzZSk7CisgIH0KKworICB0ZXN0X2Nhc2VfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlX2luZGljZXNfLnNpemUoKSkpOworICByZXR1cm4gbmV3X3Rlc3RfY2FzZTsKK30KKworLy8gSGVscGVycyBmb3Igc2V0dGluZyB1cCAvIHRlYXJpbmcgZG93biB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuICBUaGV5CisvLyBhcmUgZm9yIHVzZSBpbiB0aGUgRm9yRWFjaCgpIGZ1bmN0aW9uLgorc3RhdGljIHZvaWQgU2V0VXBFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7IGVudi0+U2V0VXAoKTsgfQorc3RhdGljIHZvaWQgVGVhckRvd25FbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7IGVudi0+VGVhckRvd24oKTsgfQorCisvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAorLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMKKy8vIHRocm93biBkdXJpbmcgYSB0ZXN0LCB0aGUgdGVzdCBpcyBjb25zaWRlcmVkIHRvIGJlIGZhaWxlZCwgYnV0IHRoZQorLy8gcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBzdGlsbCBiZSBydW4uCisvLworLy8gV2hlbiBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBlbmFibGVkLCBpdCBleHBhbmRzIGFuZCByZWdpc3RlcnMKKy8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgZmlyc3QgaW4gUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKS4KKy8vIEFsbCBvdGhlciBmdW5jdGlvbnMgY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMoKSBtYXkgc2FmZWx5IGFzc3VtZSB0aGF0CisvLyBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSByZWFkeSB0byBiZSBjb3VudGVkIGFuZCBydW4uCitib29sIFVuaXRUZXN0SW1wbDo6UnVuQWxsVGVzdHMoKSB7CisgIC8vIE1ha2VzIHN1cmUgSW5pdEdvb2dsZVRlc3QoKSB3YXMgY2FsbGVkLgorICBpZiAoIUdUZXN0SXNJbml0aWFsaXplZCgpKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJcblRoaXMgdGVzdCBwcm9ncmFtIGRpZCBOT1QgY2FsbCA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0ICIKKyAgICAgICAgICAgImJlZm9yZSBjYWxsaW5nIFJVTl9BTExfVEVTVFMoKS4gIFBsZWFzZSBmaXggaXQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBEbyBub3QgcnVuIGFueSB0ZXN0IGlmIHRoZSAtLWhlbHAgZmxhZyB3YXMgc3BlY2lmaWVkLgorICBpZiAoZ19oZWxwX2ZsYWcpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gUmVwZWF0cyB0aGUgY2FsbCB0byB0aGUgcG9zdC1mbGFnIHBhcnNpbmcgaW5pdGlhbGl6YXRpb24gaW4gY2FzZSB0aGUKKyAgLy8gdXNlciBkaWRuJ3QgY2FsbCBJbml0R29vZ2xlVGVzdC4KKyAgUG9zdEZsYWdQYXJzaW5nSW5pdCgpOworCisgIC8vIEV2ZW4gaWYgc2hhcmRpbmcgaXMgbm90IG9uLCB0ZXN0IHJ1bm5lcnMgbWF5IHdhbnQgdG8gdXNlIHRoZQorICAvLyBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSB0byBxdWVyeSB3aGV0aGVyIHRoZSB0ZXN0IHN1cHBvcnRzIHRoZSBzaGFyZGluZworICAvLyBwcm90b2NvbC4KKyAgaW50ZXJuYWw6OldyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpOworCisgIC8vIFRydWUgaWZmIHdlIGFyZSBpbiBhIHN1YnByb2Nlc3MgZm9yIHJ1bm5pbmcgYSB0aHJlYWQtc2FmZS1zdHlsZQorICAvLyBkZWF0aCB0ZXN0LgorICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPSBmYWxzZTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPSAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgY29uc3QgYm9vbCBzaG91bGRfc2hhcmQgPSBTaG91bGRTaGFyZChrVGVzdFRvdGFsU2hhcmRzLCBrVGVzdFNoYXJkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7CisKKyAgLy8gQ29tcGFyZXMgdGhlIGZ1bGwgdGVzdCBuYW1lcyB3aXRoIHRoZSBmaWx0ZXIgdG8gZGVjaWRlIHdoaWNoCisgIC8vIHRlc3RzIHRvIHJ1bi4KKyAgY29uc3QgYm9vbCBoYXNfdGVzdHNfdG9fcnVuID0gRmlsdGVyVGVzdHMoc2hvdWxkX3NoYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBIT05PUl9TSEFSRElOR19QUk9UT0NPTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MKSA+IDA7CisKKyAgLy8gTGlzdHMgdGhlIHRlc3RzIGFuZCBleGl0cyBpZiB0aGUgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgKEdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHsKKyAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkICphZnRlciogRmlsdGVyVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQuCisgICAgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSkgPworICAgICAgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKSA6IDA7CisKKyAgLy8gVHJ1ZSBpZmYgYXQgbGVhc3Qgb25lIHRlc3QgaGFzIGZhaWxlZC4KKyAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBsaXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKTsKKworICBzdGFydF90aW1lc3RhbXBfID0gR2V0VGltZUluTWlsbGlzKCk7CisgIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtU3RhcnQoKnBhcmVudF8pOworCisgIC8vIEhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgdGVzdHM/ICBXZSBkb24ndCB3YW50IHRvIHJlcGVhdCB0aGVtCisgIC8vIHdoZW4gd2UgYXJlIGluc2lkZSB0aGUgc3VicHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QuCisgIGNvbnN0IGludCByZXBlYXQgPSBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID8gMSA6IEdURVNUX0ZMQUcocmVwZWF0KTsKKyAgLy8gUmVwZWF0cyBmb3JldmVyIGlmIHRoZSByZXBlYXQgY291bnQgaXMgbmVnYXRpdmUuCisgIGNvbnN0IGJvb2wgZm9yZXZlciA9IHJlcGVhdCA8IDA7CisgIGZvciAoaW50IGkgPSAwOyBmb3JldmVyIHx8IGkgIT0gcmVwZWF0OyBpKyspIHsKKyAgICAvLyBXZSB3YW50IHRvIHByZXNlcnZlIGZhaWx1cmVzIGdlbmVyYXRlZCBieSBhZC1ob2MgdGVzdAorICAgIC8vIGFzc2VydGlvbnMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKS4KKyAgICBDbGVhck5vbkFkSG9jVGVzdFJlc3VsdCgpOworCisgICAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gR2V0VGltZUluTWlsbGlzKCk7CisKKyAgICAvLyBTaHVmZmxlcyB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyBpZiByZXF1ZXN0ZWQuCisgICAgaWYgKGhhc190ZXN0c190b19ydW4gJiYgR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgICAgcmFuZG9tKCktPlJlc2VlZChyYW5kb21fc2VlZF8pOworICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBPblRlc3RJdGVyYXRpb25TdGFydCgpLAorICAgICAgLy8gc3VjaCB0aGF0IGEgdGVzdCBldmVudCBsaXN0ZW5lciBjYW4gc2VlIHRoZSBhY3R1YWwgdGVzdCBvcmRlcgorICAgICAgLy8gaW4gdGhlIGV2ZW50LgorICAgICAgU2h1ZmZsZVRlc3RzKCk7CisgICAgfQorCisgICAgLy8gVGVsbHMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCB0aGUgdGVzdHMgYXJlIGFib3V0IHRvIHN0YXJ0LgorICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25TdGFydCgqcGFyZW50XywgaSk7CisKKyAgICAvLyBSdW5zIGVhY2ggdGVzdCBjYXNlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB0ZXN0IHRvIHJ1bi4KKyAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1bikgeworICAgICAgLy8gU2V0cyB1cCBhbGwgZW52aXJvbm1lbnRzIGJlZm9yZWhhbmQuCisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KCpwYXJlbnRfKTsKKyAgICAgIEZvckVhY2goZW52aXJvbm1lbnRzXywgU2V0VXBFbnZpcm9ubWVudCk7CisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcEVuZCgqcGFyZW50Xyk7CisKKyAgICAgIC8vIFJ1bnMgdGhlIHRlc3RzIG9ubHkgaWYgdGhlcmUgd2FzIG5vIGZhdGFsIGZhaWx1cmUgZHVyaW5nIGdsb2JhbAorICAgICAgLy8gc2V0LXVwLgorICAgICAgaWYgKCFUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgeworICAgICAgICBmb3IgKGludCB0ZXN0X2luZGV4ID0gMDsgdGVzdF9pbmRleCA8IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOworICAgICAgICAgICAgIHRlc3RfaW5kZXgrKykgeworICAgICAgICAgIEdldE11dGFibGVUZXN0Q2FzZSh0ZXN0X2luZGV4KS0+UnVuKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVGVhcnMgZG93biBhbGwgZW52aXJvbm1lbnRzIGluIHJldmVyc2Ugb3JkZXIgYWZ0ZXJ3YXJkcy4KKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoKnBhcmVudF8pOworICAgICAgc3RkOjpmb3JfZWFjaChlbnZpcm9ubWVudHNfLnJiZWdpbigpLCBlbnZpcm9ubWVudHNfLnJlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgVGVhckRvd25FbnZpcm9ubWVudCk7CisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCgqcGFyZW50Xyk7CisgICAgfQorCisgICAgZWxhcHNlZF90aW1lXyA9IEdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQ7CisKKyAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVyIHRoYXQgdGhlIHRlc3RzIGhhdmUganVzdCBmaW5pc2hlZC4KKyAgICByZXBlYXRlci0+T25UZXN0SXRlcmF0aW9uRW5kKCpwYXJlbnRfLCBpKTsKKworICAgIC8vIEdldHMgdGhlIHJlc3VsdCBhbmQgY2xlYXJzIGl0LgorICAgIGlmICghUGFzc2VkKCkpIHsKKyAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHRlc3Qgb3JkZXIgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi4gIFRoaXMKKyAgICAvLyBhbGxvd3MgdGhlIHVzZXIgdG8gcXVpY2tseSByZXBybyBhIGZhaWx1cmUgdGhhdCBoYXBwZW5zIGluIHRoZQorICAgIC8vIE4tdGggaXRlcmF0aW9uIHdpdGhvdXQgcmVwZWF0aW5nIHRoZSBmaXJzdCAoTiAtIDEpIGl0ZXJhdGlvbnMuCisgICAgLy8gVGhpcyBpcyBub3QgZW5jbG9zZWQgaW4gImlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7IC4uLiB9IiwgaW4KKyAgICAvLyBjYXNlIHRoZSB1c2VyIHNvbWVob3cgY2hhbmdlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgc29tZXdoZXJlCisgICAgLy8gKGl0J3MgYWx3YXlzIHNhZmUgdG8gdW5zaHVmZmxlIHRoZSB0ZXN0cykuCisgICAgVW5zaHVmZmxlVGVzdHMoKTsKKworICAgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgICAvLyBQaWNrcyBhIG5ldyByYW5kb20gc2VlZCBmb3IgZWFjaCBpdGVyYXRpb24uCisgICAgICByYW5kb21fc2VlZF8gPSBHZXROZXh0UmFuZG9tU2VlZChyYW5kb21fc2VlZF8pOworICAgIH0KKyAgfQorCisgIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtRW5kKCpwYXJlbnRfKTsKKworICByZXR1cm4gIWZhaWxlZDsKK30KKworLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQorLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCisvLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90CisvLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgordm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHRlc3Rfc2hhcmRfZmlsZSA9IHBvc2l4OjpHZXRFbnYoa1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOworICBpZiAodGVzdF9zaGFyZF9maWxlICE9IE5VTEwpIHsKKyAgICBGSUxFKiBjb25zdCBmaWxlID0gcG9zaXg6OkZPcGVuKHRlc3Rfc2hhcmRfZmlsZSwgInciKTsKKyAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CisgICAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byB0aGUgdGVzdCBzaGFyZCBzdGF0dXMgZmlsZSBcIiVzXCIgIgorICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIGJ5IHRoZSAlcyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiIsCisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc2hhcmRfZmlsZSwga1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICAgIGZjbG9zZShmaWxlKTsKKyAgfQorfQorCisvLyBDaGVja3Mgd2hldGhlciBzaGFyZGluZyBpcyBlbmFibGVkIGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcy4gSWYgdGhlIHZhcmlhYmxlcyBhcmUgcHJlc2VudCwKKy8vIGJ1dCBpbmNvbnNpc3RlbnQgKGkuZS4sIHNoYXJkX2luZGV4ID49IHRvdGFsX3NoYXJkcyksIHByaW50cworLy8gYW4gZXJyb3IgYW5kIGV4aXRzLiBJZiBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0LCBzaGFyZGluZyBpcworLy8gZGlzYWJsZWQgYmVjYXVzZSBpdCBtdXN0IG9ubHkgYmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgdGVzdAorLy8gcHJvY2Vzcy4gT3RoZXJ3aXNlLCB3ZSBjb3VsZCBmaWx0ZXIgb3V0IGRlYXRoIHRlc3RzIHdlIGludGVuZGVkIHRvIGV4ZWN1dGUuCitib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19lbnYsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X2VudiwKKyAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KSB7CisgIGlmIChpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gSW50MzJGcm9tRW52T3JEaWUodG90YWxfc2hhcmRzX2VudiwgLTEpOworICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKHNoYXJkX2luZGV4X2VudiwgLTEpOworCisgIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodG90YWxfc2hhcmRzID09IC0xICYmIHNoYXJkX2luZGV4ICE9IC0xKSB7CisgICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKKyAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogeW91IGhhdmUgIgorICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPSAiIDw8IHNoYXJkX2luZGV4CisgICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiIHVuc2V0LlxuIjsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgIT0gLTEgJiYgc2hhcmRfaW5kZXggPT0gLTEpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCisgICAgICA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgPSAiIDw8IHRvdGFsX3NoYXJkcworICAgICAgPDwgIiwgYnV0IGhhdmUgbGVmdCAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIHVuc2V0LlxuIjsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfSBlbHNlIGlmIChzaGFyZF9pbmRleCA8IDAgfHwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSB7CisgICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKKyAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogd2UgcmVxdWlyZSAwIDw9ICIKKyAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIDwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzCisgICAgICA8PCAiLCBidXQgeW91IGhhdmUgIiA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIj0iIDw8IHNoYXJkX2luZGV4CisgICAgICA8PCAiLCAiIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIj0iIDw8IHRvdGFsX3NoYXJkcyA8PCAiLlxuIjsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorCisgIHJldHVybiB0b3RhbF9zaGFyZHMgPiAxOworfQorCisvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHZhciBhcyBhbiBJbnQzMi4gSWYgaXQgaXMgdW5zZXQsCisvLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvcgorLy8gYW5kIGFib3J0cy4KK0ludDMyIEludDMyRnJvbUVudk9yRGllKGNvbnN0IGNoYXIqIHZhciwgSW50MzIgZGVmYXVsdF92YWwpIHsKKyAgY29uc3QgY2hhciogc3RyX3ZhbCA9IHBvc2l4OjpHZXRFbnYodmFyKTsKKyAgaWYgKHN0cl92YWwgPT0gTlVMTCkgeworICAgIHJldHVybiBkZWZhdWx0X3ZhbDsKKyAgfQorCisgIEludDMyIHJlc3VsdDsKKyAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiVGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgdmFyLAorICAgICAgICAgICAgICAgICAgc3RyX3ZhbCwgJnJlc3VsdCkpIHsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gR2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMsIHRoZSBzaGFyZCBpbmRleCwgYW5kIHRoZSB0ZXN0IGlkLAorLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBzaG91bGQgYmUgcnVuIG9uIHRoaXMgc2hhcmQuIFRoZSB0ZXN0IGlkIGlzCisvLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdAorLy8gbWV0aG9kLiBBc3N1bWVzIHRoYXQgMCA8PSBzaGFyZF9pbmRleCA8IHRvdGFsX3NoYXJkcy4KK2Jvb2wgU2hvdWxkUnVuVGVzdE9uU2hhcmQoaW50IHRvdGFsX3NoYXJkcywgaW50IHNoYXJkX2luZGV4LCBpbnQgdGVzdF9pZCkgeworICByZXR1cm4gKHRlc3RfaWQgJSB0b3RhbF9zaGFyZHMpID09IHNoYXJkX2luZGV4OworfQorCisvLyBDb21wYXJlcyB0aGUgbmFtZSBvZiBlYWNoIHRlc3Qgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIHRvCisvLyBkZWNpZGUgd2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgcnVuLCB0aGVuIHJlY29yZHMgdGhlIHJlc3VsdCBpbgorLy8gZWFjaCBUZXN0Q2FzZSBhbmQgVGVzdEluZm8gb2JqZWN0LgorLy8gSWYgc2hhcmRfdGVzdHMgPT0gdHJ1ZSwgZnVydGhlciBmaWx0ZXJzIHRlc3RzIGJhc2VkIG9uIHNoYXJkaW5nCisvLyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50IC0gc2VlCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3RBZHZhbmNlZEd1aWRlLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OkZpbHRlclRlc3RzKFJlYWN0aW9uVG9TaGFyZGluZyBzaGFyZF90ZXN0cykgeworICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCA/CisgICAgICBJbnQzMkZyb21FbnZPckRpZShrVGVzdFRvdGFsU2hhcmRzLCAtMSkgOiAtMTsKKyAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCA/CisgICAgICBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKSA6IC0xOworCisgIC8vIG51bV9ydW5uYWJsZV90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHdpbGwKKyAgLy8gcnVuIGFjcm9zcyBhbGwgc2hhcmRzIChpLmUuLCBtYXRjaCBmaWx0ZXIgYW5kIGFyZSBub3QgZGlzYWJsZWQpLgorICAvLyBudW1fc2VsZWN0ZWRfdGVzdHMgYXJlIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcnVuIG9uCisgIC8vIHRoaXMgc2hhcmQuCisgIGludCBudW1fcnVubmFibGVfdGVzdHMgPSAwOworICBpbnQgbnVtX3NlbGVjdGVkX3Rlc3RzID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VzX1tpXTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUgPSB0ZXN0X2Nhc2UtPm5hbWUoKTsKKyAgICB0ZXN0X2Nhc2UtPnNldF9zaG91bGRfcnVuKGZhbHNlKTsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7CisgICAgICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGVzdF9uYW1lKHRlc3RfaW5mby0+bmFtZSgpKTsKKyAgICAgIC8vIEEgdGVzdCBpcyBkaXNhYmxlZCBpZiB0ZXN0IGNhc2UgbmFtZSBvciB0ZXN0IG5hbWUgbWF0Y2hlcworICAgICAgLy8ga0Rpc2FibGVUZXN0RmlsdGVyLgorICAgICAgY29uc3QgYm9vbCBpc19kaXNhYmxlZCA9CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXNhYmxlVGVzdEZpbHRlcikgfHwKKyAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXNhYmxlVGVzdEZpbHRlcik7CisgICAgICB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXyA9IGlzX2Rpc2FibGVkOworCisgICAgICBjb25zdCBib29sIG1hdGNoZXNfZmlsdGVyID0KKyAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdCh0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOworICAgICAgdGVzdF9pbmZvLT5tYXRjaGVzX2ZpbHRlcl8gPSBtYXRjaGVzX2ZpbHRlcjsKKworICAgICAgY29uc3QgYm9vbCBpc19ydW5uYWJsZSA9CisgICAgICAgICAgKEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpIHx8ICFpc19kaXNhYmxlZCkgJiYKKyAgICAgICAgICBtYXRjaGVzX2ZpbHRlcjsKKworICAgICAgY29uc3QgYm9vbCBpc19zZWxlY3RlZCA9IGlzX3J1bm5hYmxlICYmCisgICAgICAgICAgKHNoYXJkX3Rlc3RzID09IElHTk9SRV9TSEFSRElOR19QUk9UT0NPTCB8fAorICAgICAgICAgICBTaG91bGRSdW5UZXN0T25TaGFyZCh0b3RhbF9zaGFyZHMsIHNoYXJkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcnVubmFibGVfdGVzdHMpKTsKKworICAgICAgbnVtX3J1bm5hYmxlX3Rlc3RzICs9IGlzX3J1bm5hYmxlOworICAgICAgbnVtX3NlbGVjdGVkX3Rlc3RzICs9IGlzX3NlbGVjdGVkOworCisgICAgICB0ZXN0X2luZm8tPnNob3VsZF9ydW5fID0gaXNfc2VsZWN0ZWQ7CisgICAgICB0ZXN0X2Nhc2UtPnNldF9zaG91bGRfcnVuKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpIHx8IGlzX3NlbGVjdGVkKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9zZWxlY3RlZF90ZXN0czsKK30KKworLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgbWF0Y2hpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBmbGFnLgordm9pZCBVbml0VGVzdEltcGw6Okxpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOworICAgIGJvb2wgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IGZhbHNlOworCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKKyAgICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICAgICAgIHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsKKyAgICAgIGlmICh0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXykgeworICAgICAgICBpZiAoIXByaW50ZWRfdGVzdF9jYXNlX25hbWUpIHsKKyAgICAgICAgICBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gdHJ1ZTsKKyAgICAgICAgICBwcmludGYoIiVzLlxuIiwgdGVzdF9jYXNlLT5uYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiICAlc1xuIiwgdGVzdF9pbmZvLT5uYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgfQorICBmZmx1c2goc3Rkb3V0KTsKK30KKworLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgorLy8KKy8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBhcmUKKy8vIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZSBpbnB1dCB0aGUKKy8vIGN1cnJlbnQgZ2V0dGVyLgordm9pZCBVbml0VGVzdEltcGw6OnNldF9vc19zdGFja190cmFjZV9nZXR0ZXIoCisgICAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBnZXR0ZXIpIHsKKyAgaWYgKG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gIT0gZ2V0dGVyKSB7CisgICAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87CisgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IGdldHRlcjsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBpZiBpdCBpcyBub3QgTlVMTDsKKy8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50CisvLyBnZXR0ZXIsIGFuZCByZXR1cm5zIGl0LgorT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBVbml0VGVzdEltcGw6Om9zX3N0YWNrX3RyYWNlX2dldHRlcigpIHsKKyAgaWYgKG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPT0gTlVMTCkgeworICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBuZXcgT3NTdGFja1RyYWNlR2V0dGVyOworICB9CisKKyAgcmV0dXJuIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKKy8vIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorVGVzdFJlc3VsdCogVW5pdFRlc3RJbXBsOjpjdXJyZW50X3Rlc3RfcmVzdWx0KCkgeworICByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fID8KKyAgICAgICYoY3VycmVudF90ZXN0X2luZm9fLT5yZXN1bHRfKSA6ICZhZF9ob2NfdGVzdF9yZXN1bHRfOworfQorCisvLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCisvLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2h1ZmZsZVRlc3RzKCkgeworICAvLyBTaHVmZmxlcyB0aGUgZGVhdGggdGVzdCBjYXNlcy4KKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCAwLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKKworICAvLyBTaHVmZmxlcyB0aGUgbm9uLWRlYXRoIHRlc3QgY2FzZXMuCisgIFNodWZmbGVSYW5nZShyYW5kb20oKSwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKSwgJnRlc3RfY2FzZV9pbmRpY2VzXyk7CisKKyAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluc2lkZSBlYWNoIHRlc3QgY2FzZS4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIHRlc3RfY2FzZXNfW2ldLT5TaHVmZmxlVGVzdHMocmFuZG9tKCkpOworICB9Cit9CisKKy8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCit2b2lkIFVuaXRUZXN0SW1wbDo6VW5zaHVmZmxlVGVzdHMoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBVbnNodWZmbGVzIHRoZSB0ZXN0cyBpbiBlYWNoIHRlc3QgY2FzZS4KKyAgICB0ZXN0X2Nhc2VzX1tpXS0+VW5zaHVmZmxlVGVzdHMoKTsKKyAgICAvLyBSZXNldHMgdGhlIGluZGV4IG9mIGVhY2ggdGVzdCBjYXNlLgorICAgIHRlc3RfY2FzZV9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7CisgIH0KK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoLi4uLCAxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbgorLy8gdGhlIHRyYWNlIGJ1dCBCYXIoKSBhbmQgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0Lgorc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChVbml0VGVzdCogLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQpIHsKKyAgLy8gV2UgcGFzcyBza2lwX2NvdW50ICsgMSB0byBza2lwIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpbiBhZGRpdGlvbgorICAvLyB0byB3aGF0IHRoZSB1c2VyIHJlYWxseSB3YW50cyB0byBza2lwLgorICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3Aoc2tpcF9jb3VudCArIDEpOworfQorCisvLyBVc2VkIGJ5IHRoZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfIG1hY3JvIHRvCisvLyBzdXBwcmVzcyB1bnJlYWNoYWJsZSBjb2RlIHdhcm5pbmdzLgorbmFtZXNwYWNlIHsKK2NsYXNzIENsYXNzVW5pcXVlVG9BbHdheXNUcnVlIHt9OworfQorCitib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbikgeyByZXR1cm4gY29uZGl0aW9uOyB9CisKK2Jvb2wgQWx3YXlzVHJ1ZSgpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICAvLyBUaGlzIGNvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2Ugc28gQWx3YXlzVHJ1ZSgpIG5ldmVyIGFjdHVhbGx5IHRocm93cywKKyAgLy8gYnV0IGl0IG1ha2VzIHRoZSBjb21waWxlciB0aGluayB0aGF0IGl0IG1heSB0aHJvdy4KKyAgaWYgKElzVHJ1ZShmYWxzZSkpCisgICAgdGhyb3cgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0CisvLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKKy8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KK2Jvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKSB7CisgIGNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7CisgIGlmIChzdHJuY21wKCpwc3RyLCBwcmVmaXgsIHByZWZpeF9sZW4pID09IDApIHsKKyAgICAqcHN0ciArPSBwcmVmaXhfbGVuOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlCisvLyB0aGUgZm9ybWF0ICItLWZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlICI9dmFsdWUiCisvLyBwYXJ0IGNhbiBiZSBvbWl0dGVkLgorLy8KKy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBOVUxMIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KK2NvbnN0IGNoYXIqIFBhcnNlRmxhZ1ZhbHVlKGNvbnN0IGNoYXIqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgeworICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4KKyAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLSIgZm9sbG93ZWQgYnkgR1RFU1RfRkxBR19QUkVGSVhfLgorICBjb25zdCBzdGQ6OnN0cmluZyBmbGFnX3N0ciA9IHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsgZmxhZzsKKyAgY29uc3Qgc2l6ZV90IGZsYWdfbGVuID0gZmxhZ19zdHIubGVuZ3RoKCk7CisgIGlmIChzdHJuY21wKHN0ciwgZmxhZ19zdHIuY19zdHIoKSwgZmxhZ19sZW4pICE9IDApIHJldHVybiBOVUxMOworCisgIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCisgIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47CisKKyAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCisgIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSB7CisgICAgcmV0dXJuIGZsYWdfZW5kOworICB9CisKKyAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCisgIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCisgIC8vIHRoZSBmbGFnIG5hbWUuCisgIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOworCisgIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCisgIHJldHVybiBmbGFnX2VuZCArIDE7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mIGVpdGhlcgorLy8gIi0tZmxhZz12YWx1ZSIgb3IgIi0tZmxhZyIuCisvLworLy8gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZSBhcyBsb25nIGFzIGl0IGRvZXMKKy8vIG5vdCBzdGFydCB3aXRoICcwJywgJ2YnLCBvciAnRicuCisvLworLy8gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZS4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZUJvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgYm9vbCogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIGJvb2wuCisgICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VJbnQzMkZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgcmV0dXJuIFBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZmxhZyAtLSIgPDwgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZSk7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgorICAqdmFsdWUgPSB2YWx1ZV9zdHI7CisgIHJldHVybiB0cnVlOworfQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgaGFzIGEgcHJlZml4IHRoYXQgR29vZ2xlIFRlc3QgdXNlcyBmb3IgaXRzCisvLyBmbGFncywgaS5lLiwgc3RhcnRzIHdpdGggR1RFU1RfRkxBR19QUkVGSVhfIG9yIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLgorLy8gSWYgR29vZ2xlIFRlc3QgZGV0ZWN0cyB0aGF0IGEgY29tbWFuZCBsaW5lIGZsYWcgaGFzIGl0cyBwcmVmaXggYnV0IGlzIG5vdAorLy8gcmVjb2duaXplZCwgaXQgd2lsbCBwcmludCBpdHMgaGVscCBtZXNzYWdlLiBGbGFncyBzdGFydGluZyB3aXRoCisvLyBHVEVTVF9JTlRFUk5BTF9QUkVGSVhfIGZvbGxvd2VkIGJ5ICJpbnRlcm5hbF8iIGFyZSBjb25zaWRlcmVkIEdvb2dsZSBUZXN0CisvLyBpbnRlcm5hbCBmbGFncyBhbmQgZG8gbm90IHRyaWdnZXIgdGhlIGhlbHAgbWVzc2FnZS4KK3N0YXRpYyBib29sIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGNvbnN0IGNoYXIqIHN0cikgeworICByZXR1cm4gKFNraXBQcmVmaXgoIi0tIiwgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KCItIiwgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KCIvIiwgJnN0cikpICYmCisgICAgICAgICAhU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8gImludGVybmFsXyIsICZzdHIpICYmCisgICAgICAgICAoU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8sICZzdHIpIHx8CisgICAgICAgICAgU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXywgJnN0cikpOworfQorCisvLyBQcmludHMgYSBzdHJpbmcgY29udGFpbmluZyBjb2RlLWVuY29kZWQgdGV4dC4gIFRoZSBmb2xsb3dpbmcgZXNjYXBlCisvLyBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjb250cm9sIHRoZSB0ZXh0IGNvbG9yOgorLy8KKy8vICAgQEAgICAgcHJpbnRzIGEgc2luZ2xlICdAJyBjaGFyYWN0ZXIuCisvLyAgIEBSICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHJlZC4KKy8vICAgQEcgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gZ3JlZW4uCisvLyAgIEBZICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHllbGxvdy4KKy8vICAgQEQgICAgY2hhbmdlcyB0byB0aGUgZGVmYXVsdCB0ZXJtaW5hbCB0ZXh0IGNvbG9yLgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBXcml0ZSB0ZXN0cyBmb3IgdGhpcyBvbmNlIHdlIGFkZCBzdGRvdXQKKy8vIGNhcHR1cmluZyB0byBHb29nbGUgVGVzdC4KK3N0YXRpYyB2b2lkIFByaW50Q29sb3JFbmNvZGVkKGNvbnN0IGNoYXIqIHN0cikgeworICBHVGVzdENvbG9yIGNvbG9yID0gQ09MT1JfREVGQVVMVDsgIC8vIFRoZSBjdXJyZW50IGNvbG9yLgorCisgIC8vIENvbmNlcHR1YWxseSwgd2Ugc3BsaXQgdGhlIHN0cmluZyBpbnRvIHNlZ21lbnRzIGRpdmlkZWQgYnkgZXNjYXBlCisgIC8vIHNlcXVlbmNlcy4gIFRoZW4gd2UgcHJpbnQgb25lIHNlZ21lbnQgYXQgYSB0aW1lLiAgQXQgdGhlIGVuZCBvZgorICAvLyBlYWNoIGl0ZXJhdGlvbiwgdGhlIHN0ciBwb2ludGVyIGFkdmFuY2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vIG5leHQgc2VnbWVudC4KKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIqIHAgPSBzdHJjaHIoc3RyLCAnQCcpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICIlcyIsIHN0cik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RkOjpzdHJpbmcoc3RyLCBwKS5jX3N0cigpKTsKKworICAgIGNvbnN0IGNoYXIgY2ggPSBwWzFdOworICAgIHN0ciA9IHAgKyAyOworICAgIGlmIChjaCA9PSAnQCcpIHsKKyAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICJAIik7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnRCcpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfREVGQVVMVDsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdSJykgeworICAgICAgY29sb3IgPSBDT0xPUl9SRUQ7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnRycpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfR1JFRU47CisgICAgfSBlbHNlIGlmIChjaCA9PSAnWScpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfWUVMTE9XOworICAgIH0gZWxzZSB7CisgICAgICAtLXN0cjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIga0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlW10gPQorIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nICIgR1RFU1RfTkFNRV8gIi4gWW91IGNhbiB1c2UgdGhlXG4iCisiZm9sbG93aW5nIGNvbW1hbmQgbGluZSBmbGFncyB0byBjb250cm9sIGl0cyBiZWhhdmlvcjpcbiIKKyJcbiIKKyJUZXN0IFNlbGVjdGlvbjpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAibGlzdF90ZXN0c0BEXG4iCisiICAgICAgTGlzdCB0aGUgbmFtZXMgb2YgYWxsIHRlc3RzIGluc3RlYWQgb2YgcnVubmluZyB0aGVtLiBUaGUgbmFtZSBvZlxuIgorIiAgICAgIFRFU1QoRm9vLCBCYXIpIGlzIFwiRm9vLkJhclwiLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJmaWx0ZXI9QFlQT1NUSVZFX1BBVFRFUk5TIgorICAgICJbQEctQFlORUdBVElWRV9QQVRURVJOU11ARFxuIgorIiAgICAgIFJ1biBvbmx5IHRoZSB0ZXN0cyB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBidXRcbiIKKyIgICAgICBub25lIG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4gJz8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXI7ICcqJ1xuIgorIiAgICAgIG1hdGNoZXMgYW55IHN1YnN0cmluZzsgJzonIHNlcGFyYXRlcyB0d28gcGF0dGVybnMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzQERcbiIKKyIgICAgICBSdW4gYWxsIGRpc2FibGVkIHRlc3RzIHRvby5cbiIKKyJcbiIKKyJUZXN0IEV4ZWN1dGlvbjpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAicmVwZWF0PUBZW0NPVU5UXUBEXG4iCisiICAgICAgUnVuIHRoZSB0ZXN0cyByZXBlYXRlZGx5OyB1c2UgYSBuZWdhdGl2ZSBjb3VudCB0byByZXBlYXQgZm9yZXZlci5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic2h1ZmZsZUBEXG4iCisiICAgICAgUmFuZG9taXplIHRlc3RzJyBvcmRlcnMgb24gZXZlcnkgaXRlcmF0aW9uLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyYW5kb21fc2VlZD1AWVtOVU1CRVJdQERcbiIKKyIgICAgICBSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIGZvciBzaHVmZmxpbmcgdGVzdCBvcmRlcnMgKGJldHdlZW4gMSBhbmRcbiIKKyIgICAgICA5OTk5OSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUpLlxuIgorIlxuIgorIlRlc3QgT3V0cHV0OlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjb2xvcj1AWShAR3llc0BZfEBHbm9AWXxAR2F1dG9AWSlARFxuIgorIiAgICAgIEVuYWJsZS9kaXNhYmxlIGNvbG9yZWQgb3V0cHV0LiBUaGUgZGVmYXVsdCBpcyBAR2F1dG9ARC5cbiIKKyIgIC1ARy0iIEdURVNUX0ZMQUdfUFJFRklYXyAicHJpbnRfdGltZT0wQERcbiIKKyIgICAgICBEb24ndCBwcmludCB0aGUgZWxhcHNlZCB0aW1lIG9mIGVhY2ggdGVzdC5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAib3V0cHV0PXhtbEBZW0BHOkBZRElSRUNUT1JZX1BBVEhARyIKKyAgICBHVEVTVF9QQVRIX1NFUF8gIkBZfEBHOkBZRklMRV9QQVRIXUBEXG4iCisiICAgICAgR2VuZXJhdGUgYW4gWE1MIHJlcG9ydCBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IG9yIHdpdGggdGhlIGdpdmVuIGZpbGVcbiIKKyIgICAgICBuYW1lLiBAWUZJTEVfUEFUSEBEIGRlZmF1bHRzIHRvIEBHdGVzdF9kZXRhaWxzLnhtbEBELlxuIgorI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic3RyZWFtX3Jlc3VsdF90bz1AWUhPU1RARzpAWVBPUlRARFxuIgorIiAgICAgIFN0cmVhbSB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHNlcnZlci5cbiIKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworIlxuIgorIkFzc2VydGlvbiBCZWhhdmlvcjpcbiIKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJkZWF0aF90ZXN0X3N0eWxlPUBZKEBHZmFzdEBZfEBHdGhyZWFkc2FmZUBZKUBEXG4iCisiICAgICAgU2V0IHRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuXG4iCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImJyZWFrX29uX2ZhaWx1cmVARFxuIgorIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gZGVidWdnZXIgYnJlYWstcG9pbnRzLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJ0aHJvd19vbl9mYWlsdXJlQERcbiIKKyIgICAgICBUdXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvIEMrKyBleGNlcHRpb25zLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjYXRjaF9leGNlcHRpb25zPTBARFxuIgorIiAgICAgIERvIG5vdCByZXBvcnQgZXhjZXB0aW9ucyBhcyB0ZXN0IGZhaWx1cmVzLiBJbnN0ZWFkLCBhbGxvdyB0aGVtXG4iCisiICAgICAgdG8gY3Jhc2ggdGhlIHByb2dyYW0gb3IgdGhyb3cgYSBwb3AtdXAgKG9uIFdpbmRvd3MpLlxuIgorIlxuIgorIkV4Y2VwdCBmb3IgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQEQsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQgIgorICAgICJ0aGUgY29ycmVzcG9uZGluZ1xuIgorImVudmlyb25tZW50IHZhcmlhYmxlIG9mIGEgZmxhZyAoYWxsIGxldHRlcnMgaW4gdXBwZXItY2FzZSkuIEZvciBleGFtcGxlLCB0b1xuIgorImRpc2FibGUgY29sb3JlZCB0ZXh0IG91dHB1dCwgeW91IGNhbiBlaXRoZXIgc3BlY2lmeSBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8KKyAgICAiY29sb3I9bm9ARCBvciBzZXRcbiIKKyJ0aGUgQEciIEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiQ09MT1JARCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBAR25vQEQuXG4iCisiXG4iCisiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkIHRoZSAiIEdURVNUX05BTUVfICIgZG9jdW1lbnRhdGlvbiBhdFxuIgorIkBHIiBHVEVTVF9QUk9KRUNUX1VSTF8gIkBELiBJZiB5b3UgZmluZCBhIGJ1ZyBpbiAiIEdURVNUX05BTUVfICJcbiIKKyIobm90IG9uZSBpbiB5b3VyIG93biBjb2RlIG9yIHRlc3RzKSwgcGxlYXNlIHJlcG9ydCBpdCB0b1xuIgorIkBHPCIgR1RFU1RfREVWX0VNQUlMXyAiPkBELlxuIjsKKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuICBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlCisvLyBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3ZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgeworICBmb3IgKGludCBpID0gMTsgaSA8ICphcmdjOyBpKyspIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGFyZyA9IGFyZ19zdHJpbmcuY19zdHIoKTsKKworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUJvb2xGbGFnOworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUludDMyRmxhZzsKKyAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VTdHJpbmdGbGFnOworCisgICAgLy8gRG8gd2Ugc2VlIGEgR29vZ2xlIFRlc3QgZmxhZz8KKyAgICBpZiAoUGFyc2VCb29sRmxhZyhhcmcsIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0JyZWFrT25GYWlsdXJlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtDYXRjaEV4Y2VwdGlvbnNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrQ29sb3JGbGFnLCAmR1RFU1RfRkxBRyhjb2xvcikpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtEZWF0aFRlc3RTdHlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtEZWF0aFRlc3RVc2VGb3JrLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRmlsdGVyRmxhZywgJkdURVNUX0ZMQUcoZmlsdGVyKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtMaXN0VGVzdHNGbGFnLCAmR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga091dHB1dEZsYWcsICZHVEVTVF9GTEFHKG91dHB1dCkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrUHJpbnRUaW1lRmxhZywgJkdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JhbmRvbVNlZWRGbGFnLCAmR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JlcGVhdEZsYWcsICZHVEVTVF9GTEFHKHJlcGVhdCkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrU2h1ZmZsZUZsYWcsICZHVEVTVF9GTEFHKHNodWZmbGUpKSB8fAorICAgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtTdGFja1RyYWNlRGVwdGhGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtTdHJlYW1SZXN1bHRUb0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtUaHJvd09uRmFpbHVyZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpCisgICAgICAgICkgeworICAgICAgLy8gWWVzLiAgU2hpZnQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndiBsaXN0IGxlZnQgYnkgb25lLiAgTm90ZQorICAgICAgLy8gdGhhdCBhcmd2IGhhcyAoKmFyZ2MgKyAxKSBlbGVtZW50cywgdGhlIGxhc3Qgb25lIGFsd2F5cyBiZWluZworICAgICAgLy8gTlVMTC4gIFRoZSBmb2xsb3dpbmcgbG9vcCBtb3ZlcyB0aGUgdHJhaWxpbmcgTlVMTCBlbGVtZW50IGFzCisgICAgICAvLyB3ZWxsLgorICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2M7IGorKykgeworICAgICAgICBhcmd2W2pdID0gYXJndltqICsgMV07CisgICAgICB9CisKKyAgICAgIC8vIERlY3JlbWVudHMgdGhlIGFyZ3VtZW50IGNvdW50LgorICAgICAgKCphcmdjKS0tOworCisgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gZGVjcmVtZW50IHRoZSBpdGVyYXRvciBhcyB3ZSBqdXN0IHJlbW92ZWQKKyAgICAgIC8vIGFuIGVsZW1lbnQuCisgICAgICBpLS07CisgICAgfSBlbHNlIGlmIChhcmdfc3RyaW5nID09ICItLWhlbHAiIHx8IGFyZ19zdHJpbmcgPT0gIi1oIiB8fAorICAgICAgICAgICAgICAgYXJnX3N0cmluZyA9PSAiLT8iIHx8IGFyZ19zdHJpbmcgPT0gIi8/IiB8fAorICAgICAgICAgICAgICAgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoYXJnKSkgeworICAgICAgLy8gQm90aCBoZWxwIGZsYWcgYW5kIHVucmVjb2duaXplZCBHb29nbGUgVGVzdCBmbGFncyAoZXhjbHVkaW5nCisgICAgICAvLyBpbnRlcm5hbCBvbmVzKSB0cmlnZ2VyIGhlbHAgZGlzcGxheS4KKyAgICAgIGdfaGVscF9mbGFnID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoZ19oZWxwX2ZsYWcpIHsKKyAgICAvLyBXZSBwcmludCB0aGUgaGVscCBoZXJlIGluc3RlYWQgb2YgaW4gUlVOX0FMTF9URVNUUygpLCBhcyB0aGUKKyAgICAvLyBsYXR0ZXIgbWF5IG5vdCBiZSBjYWxsZWQgYXQgYWxsIGlmIHRoZSB1c2VyIGlzIHVzaW5nIEdvb2dsZQorICAgIC8vIFRlc3Qgd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrLgorICAgIFByaW50Q29sb3JFbmNvZGVkKGtDb2xvckVuY29kZWRIZWxwTWVzc2FnZSk7CisgIH0KK30KKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuCit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9Cit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBJbml0R29vZ2xlVGVzdCgpLgorLy8KKy8vIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yCisvLyB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBJbml0R29vZ2xlVGVzdEltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKKyAgZ19pbml0X2d0ZXN0X2NvdW50Kys7CisKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUgdHdpY2UuCisgIGlmIChnX2luaXRfZ3Rlc3RfY291bnQgIT0gMSkgcmV0dXJuOworCisgIGlmICgqYXJnYyA8PSAwKSByZXR1cm47CisKKyAgaW50ZXJuYWw6OmdfZXhlY3V0YWJsZV9wYXRoID0gaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhhcmd2WzBdKTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgZ19hcmd2cy5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSAhPSAqYXJnYzsgaSsrKSB7CisgICAgZ19hcmd2cy5wdXNoX2JhY2soU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pKTsKKyAgfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGFyZ2MsIGFyZ3YpOworICBHZXRVbml0VGVzdEltcGwoKS0+UG9zdEZsYWdQYXJzaW5nSW5pdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCisvLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQorLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCisvLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgorLy8KKy8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQorLy8gdXBkYXRlZC4KKy8vCisvLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0Lgordm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KKy8vIFVOSUNPREUgbW9kZS4KK3ZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgeworICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0X21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwMjgyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3Qvc3JjL2d0ZXN0X21haW4uY2MKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK0dURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHByaW50ZigiUnVubmluZyBtYWluKCkgZnJvbSBndGVzdF9tYWluLmNjXG4iKTsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwYTEzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTAsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUZXN0cyB0aGF0IHZlcmlmeSBpbnRlcmFjdGlvbiBvZiBleGNlcHRpb25zIGFuZCBkZWF0aCB0ZXN0cy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9IQVNfU0VICisjICBpbmNsdWRlIDx3aW5kb3dzLmg+ICAgICAgICAgIC8vIEZvciBSYWlzZUV4Y2VwdGlvbigpLgorIyBlbmRpZgorCisjIGluY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisjIGlmIEdURVNUX0hBU19FWENFUFRJT05TCisKKyMgIGluY2x1ZGUgPGV4Y2VwdGlvbj4gIC8vIEZvciBzdGQ6OmV4Y2VwdGlvbi4KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyByZXBvcnQgdGhyb3duIGV4Y2VwdGlvbnMgYXMgZmFpbHVyZXMgYW5kIHRoYXQgdGhlCisvLyBleGNlcHRpb25zIGRvIG5vdCBlc2NhcGUgZGVhdGggdGVzdCBtYWNyb3MuCitURVNUKEN4eEV4Y2VwdGlvbkRlYXRoVGVzdCwgRXhjZXB0aW9uSXNGYWlsdXJlKSB7CisgIHRyeSB7CisgICAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKHRocm93IDEsICIiKSwgInRocmV3IGFuIGV4Y2VwdGlvbiIpOworICB9IGNhdGNoICguLi4pIHsgIC8vIE5PTElOVAorICAgIEZBSUwoKSA8PCAiQW4gZXhjZXB0aW9uIGVzY2FwZWQgYSBkZWF0aCB0ZXN0IG1hY3JvIGludm9jYXRpb24gIgorICAgICAgICAgICA8PCAid2l0aCBjYXRjaF9leGNlcHRpb25zICIKKyAgICAgICAgICAgPDwgKHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgfQorfQorCitjbGFzcyBUZXN0RXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeyByZXR1cm4gImV4Y2VwdGlvbmFsIG1lc3NhZ2UiOyB9Cit9OworCitURVNUKEN4eEV4Y2VwdGlvbkRlYXRoVGVzdCwgUHJpbnRzTWVzc2FnZUZvclN0ZEV4Y2VwdGlvbnMpIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgaXMgcXVvdGVkIGluIHRoZSBmYWlsdXJlIHRleHQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSCh0aHJvdyBUZXN0RXhjZXB0aW9uKCksICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbmFsIG1lc3NhZ2UiKTsKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgbG9jYXRpb24gaXMgbWVudGlvbmVkIGluIHRoZSBmYWlsdXJlIHRleHQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSCh0aHJvdyBUZXN0RXhjZXB0aW9uKCksICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImd0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYyIpOworfQorIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworIyBpZiBHVEVTVF9IQVNfU0VICisvLyBUZXN0cyB0aGF0IGVuYWJsaW5nIGludGVyY2VwdGlvbiBvZiBTRUggZXhjZXB0aW9ucyB3aXRoIHRoZQorLy8gY2F0Y2hfZXhjZXB0aW9ucyBmbGFnIGRvZXMgbm90IGludGVyZmVyZSB3aXRoIFNFSCBleGNlcHRpb25zIGJlaW5nCisvLyB0cmVhdGVkIGFzIGRlYXRoIGJ5IGRlYXRoIHRlc3RzLgorVEVTVChTZWhFeGNlcHRpb25EZWFzVGVzdCwgQ2F0Y2hFeGNlcHRpb25zRG9lc05vdEludGVyZmVyZSkgeworICBFWFBFQ1RfREVBVEgoUmFpc2VFeGNlcHRpb24oNDIsIDB4MCwgMCwgTlVMTCksICIiKQorICAgICAgPDwgIndpdGggY2F0Y2hfZXhjZXB0aW9ucyAiCisgICAgICA8PCAodGVzdGluZzo6R1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworfQorIyBlbmRpZgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBHVEVTVF9FTkFCTEVfQ0FUQ0hfRVhDRVBUSU9OU18gIT0gMDsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmMwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjCkBAIC0wLDAgKzEsMTM2OCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgZGVhdGggdGVzdHMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIgorCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+ICAgICAgICAgIC8vIEZvciBjaGRpcigpLgorIyBlbHNlCisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgIGluY2x1ZGUgPHN5cy93YWl0Lmg+ICAgICAgICAvLyBGb3Igd2FpdHBpZC4KKyMgIGluY2x1ZGUgPGxpbWl0cz4gICAgICAgICAgICAvLyBGb3Igc3RkOjpudW1lcmljX2xpbWl0cy4KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGluY2x1ZGUgPHN0ZGlvLmg+CisKKyMgaWYgR1RFU1RfT1NfTElOVVgKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjIGluY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorIyBkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyMgaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorIyB1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHBvc2l4ID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg7CisKK3VzaW5nIHRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdEZhY3Rvcnk7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RmlsZVBhdGg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0TGFzdEVycm5vRGVzY3JpcHRpb247Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkluRGVhdGhUZXN0Q2hpbGQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UGFyc2VOYXR1cmFsTnVtYmVyOworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIGhlbHBlciBjbGFzcyB3aG9zZSBvYmplY3RzIHJlcGxhY2UgdGhlIGRlYXRoIHRlc3QgZmFjdG9yeSBmb3IgYQorLy8gc2luZ2xlIFVuaXRUZXN0IG9iamVjdCBkdXJpbmcgdGhlaXIgbGlmZXRpbWVzLgorY2xhc3MgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkoRGVhdGhUZXN0RmFjdG9yeSogbmV3X2ZhY3RvcnkpCisgICAgICA6IHVuaXRfdGVzdF9pbXBsXyhHZXRVbml0VGVzdEltcGwoKSkgeworICAgIG9sZF9mYWN0b3J5XyA9IHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZWxlYXNlKCk7CisgICAgdW5pdF90ZXN0X2ltcGxfLT5kZWF0aF90ZXN0X2ZhY3RvcnlfLnJlc2V0KG5ld19mYWN0b3J5KTsKKyAgfQorCisgIH5SZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSgpIHsKKyAgICB1bml0X3Rlc3RfaW1wbF8tPmRlYXRoX3Rlc3RfZmFjdG9yeV8ucmVsZWFzZSgpOworICAgIHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZXNldChvbGRfZmFjdG9yeV8pOworICB9CisgcHJpdmF0ZToKKyAgLy8gUHJldmVudHMgY29weWluZyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSBvYmplY3RzLgorICBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeShjb25zdCBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSYpOworCisgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0X2ltcGxfOworICBEZWF0aFRlc3RGYWN0b3J5KiBvbGRfZmFjdG9yeV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3ZvaWQgRGllV2l0aE1lc3NhZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZGVycik7ICAvLyBNYWtlIHN1cmUgdGhlIHRleHQgaXMgcHJpbnRlZCBiZWZvcmUgdGhlIHByb2Nlc3MgZXhpdHMuCisKKyAgLy8gV2UgY2FsbCBfZXhpdCgpIGluc3RlYWQgb2YgZXhpdCgpLCBhcyB0aGUgZm9ybWVyIGlzIGEgZGlyZWN0CisgIC8vIHN5c3RlbSBjYWxsIGFuZCB0aHVzIHNhZmVyIGluIHRoZSBwcmVzZW5jZSBvZiB0aHJlYWRzLiAgZXhpdCgpCisgIC8vIHdpbGwgaW52b2tlIHVzZXItZGVmaW5lZCBleGl0LWhvb2tzLCB3aGljaCBtYXkgZG8gZGFuZ2Vyb3VzCisgIC8vIHRoaW5ncyB0aGF0IGNvbmZsaWN0IHdpdGggZGVhdGggdGVzdHMuCisgIC8vCisgIC8vIFNvbWUgY29tcGlsZXJzIGNhbiByZWNvZ25pemUgdGhhdCBfZXhpdCgpIG5ldmVyIHJldHVybnMgYW5kIGlzc3VlIHRoZQorICAvLyAndW5yZWFjaGFibGUgY29kZScgd2FybmluZyBmb3IgY29kZSBmb2xsb3dpbmcgdGhpcyBmdW5jdGlvbiwgdW5sZXNzCisgIC8vIGZvb2xlZCBieSBhIGZha2UgY29uZGl0aW9uLgorICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIF9leGl0KDEpOworfQorCit2b2lkIERpZUluc2lkZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBmdW5jdGlvbikgeworICBEaWVXaXRoTWVzc2FnZSgiZGVhdGggaW5zaWRlICIgKyBmdW5jdGlvbiArICIoKS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyB3b3JrLgorCitjbGFzcyBUZXN0Rm9yRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgVGVzdEZvckRlYXRoVGVzdCgpIDogb3JpZ2luYWxfZGlyXyhGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpKSB7fQorCisgIHZpcnR1YWwgflRlc3RGb3JEZWF0aFRlc3QoKSB7CisgICAgcG9zaXg6OkNoRGlyKG9yaWdpbmFsX2Rpcl8uY19zdHIoKSk7CisgIH0KKworICAvLyBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gdGhhdCdzIGV4cGVjdGVkIHRvIGRpZS4KKyAgc3RhdGljIHZvaWQgU3RhdGljTWVtYmVyRnVuY3Rpb24oKSB7IERpZUluc2lkZSgiU3RhdGljTWVtYmVyRnVuY3Rpb24iKTsgfQorCisgIC8vIEEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgdGhhdCBtYXkgZGllLgorICB2b2lkIE1lbWJlckZ1bmN0aW9uKCkgeworICAgIGlmIChzaG91bGRfZGllXykKKyAgICAgIERpZUluc2lkZSgiTWVtYmVyRnVuY3Rpb24iKTsKKyAgfQorCisgIC8vIFRydWUgaWZmIE1lbWJlckZ1bmN0aW9uKCkgc2hvdWxkIGRpZS4KKyAgYm9vbCBzaG91bGRfZGllXzsKKyAgY29uc3QgRmlsZVBhdGggb3JpZ2luYWxfZGlyXzsKK307CisKKy8vIEEgY2xhc3Mgd2l0aCBhIG1lbWJlciBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCitjbGFzcyBNYXlEaWUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWF5RGllKGJvb2wgc2hvdWxkX2RpZSkgOiBzaG91bGRfZGllXyhzaG91bGRfZGllKSB7fQorCisgIC8vIEEgbWVtYmVyIGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KKyAgdm9pZCBNZW1iZXJGdW5jdGlvbigpIGNvbnN0IHsKKyAgICBpZiAoc2hvdWxkX2RpZV8pCisgICAgICBEaWVJbnNpZGUoIk1heURpZTo6TWVtYmVyRnVuY3Rpb24iKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVHJ1ZSBpZmYgTWVtYmVyRnVuY3Rpb24oKSBzaG91bGQgZGllLgorICBib29sIHNob3VsZF9kaWVfOworfTsKKworLy8gQSBnbG9iYWwgZnVuY3Rpb24gdGhhdCdzIGV4cGVjdGVkIHRvIGRpZS4KK3ZvaWQgR2xvYmFsRnVuY3Rpb24oKSB7IERpZUluc2lkZSgiR2xvYmFsRnVuY3Rpb24iKTsgfQorCisvLyBBIG5vbi12b2lkIGZ1bmN0aW9uIHRoYXQncyBleHBlY3RlZCB0byBkaWUuCitpbnQgTm9uVm9pZEZ1bmN0aW9uKCkgeworICBEaWVJbnNpZGUoIk5vblZvaWRGdW5jdGlvbiIpOworICByZXR1cm4gMTsKK30KKworLy8gQSB1bmFyeSBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCit2b2lkIERpZUlmKGJvb2wgc2hvdWxkX2RpZSkgeworICBpZiAoc2hvdWxkX2RpZSkKKyAgICBEaWVJbnNpZGUoIkRpZUlmIik7Cit9CisKKy8vIEEgYmluYXJ5IGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KK2Jvb2wgRGllSWZMZXNzVGhhbihpbnQgeCwgaW50IHkpIHsKKyAgaWYgKHggPCB5KSB7CisgICAgRGllSW5zaWRlKCJEaWVJZkxlc3NUaGFuIik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIIGNhbiBiZSB1c2VkIG91dHNpZGUgYSBURVNULCBURVNUX0YsIG9yIHRlc3QgZml4dHVyZS4KK3ZvaWQgRGVhdGhUZXN0U3Vicm91dGluZSgpIHsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJkZWF0aC4qR2xvYmFsRnVuY3Rpb24iKTsKKyAgQVNTRVJUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJkZWF0aC4qR2xvYmFsRnVuY3Rpb24iKTsKK30KKworLy8gRGVhdGggaW4gZGJnLCBub3Qgb3B0LgoraW50IERpZUluRGVidWdFbHNlMTIoaW50KiBzaWRlZWZmZWN0KSB7CisgIGlmIChzaWRlZWZmZWN0KSAqc2lkZWVmZmVjdCA9IDEyOworCisjIGlmbmRlZiBOREVCVUcKKworICBEaWVJbnNpZGUoIkRpZUluRGVidWdFbHNlMTIiKTsKKworIyBlbmRpZiAgLy8gTkRFQlVHCisKKyAgcmV0dXJuIDEyOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhlIEV4aXRlZFdpdGhDb2RlIHByZWRpY2F0ZS4KK1RFU1QoRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QsIEV4aXRlZFdpdGhDb2RlKSB7CisgIC8vIE9uIFdpbmRvd3MsIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlzIHRoZSBzYW1lIGFzIGl0cyBleGl0IHN0YXR1cywKKyAgLy8gc28gdGhlIHByZWRpY2F0ZSBqdXN0IGNvbXBhcmVzIHRoZSBpdHMgaW5wdXQgd2l0aCBpdHMgcGFyYW1ldGVyLgorICBFWFBFQ1RfVFJVRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSgwKSk7CisgIEVYUEVDVF9UUlVFKHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpKDEpKTsKKyAgRVhQRUNUX1RSVUUodGVzdGluZzo6RXhpdGVkV2l0aENvZGUoNDIpKDQyKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSgwKSk7Cit9CisKKyMgZWxzZQorCisvLyBSZXR1cm5zIHRoZSBleGl0IHN0YXR1cyBvZiBhIHByb2Nlc3MgdGhhdCBjYWxscyBfZXhpdCgyKSB3aXRoIGEKKy8vIGdpdmVuIGV4aXQgY29kZS4gIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZQorLy8gRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QgdGVzdCBzdWl0ZS4KK3N0YXRpYyBpbnQgTm9ybWFsRXhpdFN0YXR1cyhpbnQgZXhpdF9jb2RlKSB7CisgIHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgX2V4aXQoZXhpdF9jb2RlKTsKKyAgfQorICBpbnQgc3RhdHVzOworICB3YWl0cGlkKGNoaWxkX3BpZCwgJnN0YXR1cywgMCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIFJldHVybnMgdGhlIGV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyB0aGF0IHJhaXNlcyBhIGdpdmVuIHNpZ25hbC4KKy8vIElmIHRoZSBzaWduYWwgZG9lcyBub3QgY2F1c2UgdGhlIHByb2Nlc3MgdG8gZGllLCB0aGVuIGl0IHJldHVybnMKKy8vIGluc3RlYWQgdGhlIGV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyB0aGF0IGV4aXRzIG5vcm1hbGx5IHdpdGggZXhpdAorLy8gY29kZSAxLiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0CisvLyB0ZXN0IHN1aXRlLgorc3RhdGljIGludCBLaWxsZWRFeGl0U3RhdHVzKGludCBzaWdudW0pIHsKKyAgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOworICBpZiAoY2hpbGRfcGlkID09IDApIHsKKyAgICByYWlzZShzaWdudW0pOworICAgIF9leGl0KDEpOworICB9CisgIGludCBzdGF0dXM7CisgIHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gVGVzdHMgdGhlIEV4aXRlZFdpdGhDb2RlIHByZWRpY2F0ZS4KK1RFU1QoRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QsIEV4aXRlZFdpdGhDb2RlKSB7CisgIGNvbnN0IGludCBzdGF0dXMwICA9IE5vcm1hbEV4aXRTdGF0dXMoMCk7CisgIGNvbnN0IGludCBzdGF0dXMxICA9IE5vcm1hbEV4aXRTdGF0dXMoMSk7CisgIGNvbnN0IGludCBzdGF0dXM0MiA9IE5vcm1hbEV4aXRTdGF0dXMoNDIpOworICBjb25zdCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSBwcmVkMCgwKTsKKyAgY29uc3QgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUgcHJlZDEoMSk7CisgIGNvbnN0IHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlIHByZWQ0Mig0Mik7CisgIEVYUEVDVF9QUkVEMShwcmVkMCwgIHN0YXR1czApOworICBFWFBFQ1RfUFJFRDEocHJlZDEsICBzdGF0dXMxKTsKKyAgRVhQRUNUX1BSRUQxKHByZWQ0Miwgc3RhdHVzNDIpOworICBFWFBFQ1RfRkFMU0UocHJlZDAoc3RhdHVzMSkpOworICBFWFBFQ1RfRkFMU0UocHJlZDQyKHN0YXR1czApKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWQxKHN0YXR1czQyKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBLaWxsZWRCeVNpZ25hbCBwcmVkaWNhdGUuCitURVNUKEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0LCBLaWxsZWRCeVNpZ25hbCkgeworICBjb25zdCBpbnQgc3RhdHVzX3NlZ3YgPSBLaWxsZWRFeGl0U3RhdHVzKFNJR1NFR1YpOworICBjb25zdCBpbnQgc3RhdHVzX2tpbGwgPSBLaWxsZWRFeGl0U3RhdHVzKFNJR0tJTEwpOworICBjb25zdCB0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbCBwcmVkX3NlZ3YoU0lHU0VHVik7CisgIGNvbnN0IHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsIHByZWRfa2lsbChTSUdLSUxMKTsKKyAgRVhQRUNUX1BSRUQxKHByZWRfc2Vndiwgc3RhdHVzX3NlZ3YpOworICBFWFBFQ1RfUFJFRDEocHJlZF9raWxsLCBzdGF0dXNfa2lsbCk7CisgIEVYUEVDVF9GQUxTRShwcmVkX3NlZ3Yoc3RhdHVzX2tpbGwpKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWRfa2lsbChzdGF0dXNfc2VndikpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIHRoYXQgdGhlIGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIG1heSBvciBtYXkgbm90CisvLyBiZSBmb2xsb3dlZCBieSBvcGVyYXRvcjw8LCBhbmQgdGhhdCBpbiBlaXRoZXIgY2FzZSB0aGUgY29tcGxldGUgdGV4dAorLy8gY29tcHJpc2VzIG9ubHkgYSBzaW5nbGUgQysrIHN0YXRlbWVudC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgLy8gVGhpcyB3b3VsZCBmYWlsIGlmIGV4ZWN1dGVkOyB0aGlzIGlzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5CisgICAgQVNTRVJUX0RFQVRIKHJldHVybiwgIiIpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7CisgIGVsc2UKKyAgICAvLyBUaGlzIGVtcHR5ICJlbHNlIiBicmFuY2ggaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgRVhQRUNUX0RFQVRICisgICAgLy8gZG9lc24ndCBleHBhbmQgaW50byBhbiAiaWYiIHN0YXRlbWVudCB3aXRob3V0IGFuICJlbHNlIgorICAgIDsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfREVBVEgocmV0dXJuLCAiIikgPDwgImRpZCBub3QgZGllIjsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7CisgIGVsc2UKKyAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAxIDw8IDIgPDwgMzsKK30KKwordm9pZCBEaWVXaXRoRW1iZWRkZWROdWwoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiSGVsbG8lY215IG51bGwgd29ybGQuXG4iLCAnXDAnKTsKKyAgZmZsdXNoKHN0ZGVycik7CisgIF9leGl0KDEpOworfQorCisjIGlmIEdURVNUX1VTRVNfUENSRQorLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCB3b3JrIHdoZW4gdGhlIGVycm9yCisvLyBtZXNzYWdlIGhhcyBhIE5VTCBjaGFyYWN0ZXIgaW4gaXQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRW1iZWRkZWROdWxJbk1lc3NhZ2UpIHsKKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IDxyZWdleC5oPiBkb2Vzbid0IHN1cHBvcnQgbWF0Y2hpbmcgc3RyaW5ncworICAvLyB3aXRoIGVtYmVkZGVkIE5VTCBjaGFyYWN0ZXJzIC0gZmluZCBhIHdheSB0byB3b3JrYXJvdW5kIGl0LgorICBFWFBFQ1RfREVBVEgoRGllV2l0aEVtYmVkZGVkTnVsKCksICJteSBudWxsIHdvcmxkIik7CisgIEFTU0VSVF9ERUFUSChEaWVXaXRoRW1iZWRkZWROdWwoKSwgIm15IG51bGwgd29ybGQiKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX1VTRVNfUENSRQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIGludGVyYWN0cyB3ZWxsIHdpdGggc3dpdGNoCisvLyBzdGF0ZW1lbnRzLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN3aXRjaFN0YXRlbWVudCkgeworLy8gTWljcm9zb2Z0IGNvbXBpbGVyIHVzdWFsbHkgY29tcGxhaW5zIGFib3V0IHN3aXRjaCBzdGF0ZW1lbnRzIHdpdGhvdXQKKy8vIGNhc2UgbGFiZWxzLiBXZSBzdXBwcmVzcyB0aGF0IHdhcm5pbmcgZm9yIHRoaXMgdGVzdC4KKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDY1KQorIyBlbmRpZiAgLy8gX01TQ19WRVIKKworICBzd2l0Y2ggKDApCisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJleGl0IGluIGRlZmF1bHQgc3dpdGNoIGhhbmRsZXIiOworCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAiZXhpdCBpbiBzd2l0Y2ggY2FzZSI7CisKKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIFRlc3RzIHRoYXQgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgImZhc3QiIHN0eWxlCisvLyBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN0YXRpY01lbWJlckZ1bmN0aW9uRmFzdFN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEFTU0VSVF9ERUFUSChTdGF0aWNNZW1iZXJGdW5jdGlvbigpLCAiZGVhdGguKlN0YXRpY01lbWJlciIpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2FuIGJlIHVzZWQgaW4gYSAiZmFzdCIKKy8vIHN0eWxlIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWVtYmVyRnVuY3Rpb25GYXN0U3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgc2hvdWxkX2RpZV8gPSB0cnVlOworICBFWFBFQ1RfREVBVEgoTWVtYmVyRnVuY3Rpb24oKSwgImluc2lkZS4qTWVtYmVyRnVuY3Rpb24iKTsKK30KKwordm9pZCBDaGFuZ2VUb1Jvb3REaXIoKSB7IHBvc2l4OjpDaERpcihHVEVTVF9QQVRIX1NFUF8pOyB9CisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgd29yayBldmVuIGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBoYXMgYmVlbgorLy8gY2hhbmdlZC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBGYXN0RGVhdGhUZXN0SW5DaGFuZ2VkRGlyKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisKKyAgQ2hhbmdlVG9Sb290RGlyKCk7CisgIEVYUEVDVF9FWElUKF9leGl0KDEpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSwgIiIpOworCisgIENoYW5nZVRvUm9vdERpcigpOworICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKTsKK30KKworIyBpZiBHVEVTVF9PU19MSU5VWAordm9pZCBTaWdwcm9mQWN0aW9uKGludCwgc2lnaW5mb190Kiwgdm9pZCopIHsgLyogbm8gb3AgKi8gfQorCisvLyBTZXRzIFNJR1BST0YgYWN0aW9uIGFuZCBJVElNRVJfUFJPRiB0aW1lciAoaW50ZXJ2YWw6IDFtcykuCit2b2lkIFNldFNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigpIHsKKyAgc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKKyAgdGltZXIuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKyAgdGltZXIuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDE7CisgIHRpbWVyLml0X3ZhbHVlID0gdGltZXIuaXRfaW50ZXJ2YWw7CisgIEFTU0VSVF9FUSgwLCBzZXRpdGltZXIoSVRJTUVSX1BST0YsICZ0aW1lciwgTlVMTCkpOworICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ25hbF9hY3Rpb247CisgIG1lbXNldCgmc2lnbmFsX2FjdGlvbiwgMCwgc2l6ZW9mKHNpZ25hbF9hY3Rpb24pKTsKKyAgc2lnZW1wdHlzZXQoJnNpZ25hbF9hY3Rpb24uc2FfbWFzayk7CisgIHNpZ25hbF9hY3Rpb24uc2Ffc2lnYWN0aW9uID0gU2lncHJvZkFjdGlvbjsKKyAgc2lnbmFsX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU1RBUlQgfCBTQV9TSUdJTkZPOworICBBU1NFUlRfRVEoMCwgc2lnYWN0aW9uKFNJR1BST0YsICZzaWduYWxfYWN0aW9uLCBOVUxMKSk7Cit9CisKKy8vIERpc2FibGVzIElUSU1FUl9QUk9GIHRpbWVyIGFuZCBpZ25vcmVzIFNJR1BST0Ygc2lnbmFsLgordm9pZCBEaXNhYmxlU2lncHJvZkFjdGlvbkFuZFRpbWVyKHN0cnVjdCBzaWdhY3Rpb24qIG9sZF9zaWduYWxfYWN0aW9uKSB7CisgIHN0cnVjdCBpdGltZXJ2YWwgdGltZXI7CisgIHRpbWVyLml0X2ludGVydmFsLnR2X3NlYyA9IDA7CisgIHRpbWVyLml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworICB0aW1lci5pdF92YWx1ZSA9IHRpbWVyLml0X2ludGVydmFsOworICBBU1NFUlRfRVEoMCwgc2V0aXRpbWVyKElUSU1FUl9QUk9GLCAmdGltZXIsIE5VTEwpKTsKKyAgc3RydWN0IHNpZ2FjdGlvbiBzaWduYWxfYWN0aW9uOworICBtZW1zZXQoJnNpZ25hbF9hY3Rpb24sIDAsIHNpemVvZihzaWduYWxfYWN0aW9uKSk7CisgIHNpZ2VtcHR5c2V0KCZzaWduYWxfYWN0aW9uLnNhX21hc2spOworICBzaWduYWxfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworICBBU1NFUlRfRVEoMCwgc2lnYWN0aW9uKFNJR1BST0YsICZzaWduYWxfYWN0aW9uLCBvbGRfc2lnbmFsX2FjdGlvbikpOworfQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHdvcmsgd2hlbiBTSUdQUk9GIGhhbmRsZXIgYW5kIHRpbWVyIGFyZSBzZXQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRmFzdFNpZ3Byb2ZBY3Rpb25TZXQpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgU2V0U2lncHJvZkFjdGlvbkFuZFRpbWVyKCk7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZF9zaWduYWxfYWN0aW9uOworICBEaXNhYmxlU2lncHJvZkFjdGlvbkFuZFRpbWVyKCZvbGRfc2lnbmFsX2FjdGlvbik7CisgIEVYUEVDVF9UUlVFKG9sZF9zaWduYWxfYWN0aW9uLnNhX3NpZ2FjdGlvbiA9PSBTaWdwcm9mQWN0aW9uKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFRocmVhZFNhZmVTaWdwcm9mQWN0aW9uU2V0KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIFNldFNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigpOworICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKKyAgc3RydWN0IHNpZ2FjdGlvbiBvbGRfc2lnbmFsX2FjdGlvbjsKKyAgRGlzYWJsZVNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigmb2xkX3NpZ25hbF9hY3Rpb24pOworICBFWFBFQ1RfVFJVRShvbGRfc2lnbmFsX2FjdGlvbi5zYV9zaWdhY3Rpb24gPT0gU2lncHJvZkFjdGlvbik7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisvLyBSZXBlYXRzIGEgcmVwcmVzZW50YXRpdmUgc2FtcGxlIG9mIGRlYXRoIHRlc3RzIGluIHRoZSAidGhyZWFkc2FmZSIgc3R5bGU6CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTdGF0aWNNZW1iZXJGdW5jdGlvblRocmVhZHNhZmVTdHlsZSkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworICBBU1NFUlRfREVBVEgoU3RhdGljTWVtYmVyRnVuY3Rpb24oKSwgImRlYXRoLipTdGF0aWNNZW1iZXIiKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE1lbWJlckZ1bmN0aW9uVGhyZWFkc2FmZVN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIHNob3VsZF9kaWVfID0gdHJ1ZTsKKyAgRVhQRUNUX0RFQVRIKE1lbWJlckZ1bmN0aW9uKCksICJpbnNpZGUuKk1lbWJlckZ1bmN0aW9uIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUaHJlYWRzYWZlRGVhdGhUZXN0SW5Mb29wKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpCisgICAgRVhQRUNUX0VYSVQoX2V4aXQoaSksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKGkpLCAiIikgPDwgIjogaSA9ICIgPDwgaTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFRocmVhZHNhZmVEZWF0aFRlc3RJbkNoYW5nZWREaXIpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKworICBDaGFuZ2VUb1Jvb3REaXIoKTsKKyAgRVhQRUNUX0VYSVQoX2V4aXQoMSksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpLCAiIik7CisKKyAgQ2hhbmdlVG9Sb290RGlyKCk7CisgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWl4ZWRTdHlsZXMpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworfQorCituYW1lc3BhY2UgeworCitib29sIHB0aHJlYWRfZmxhZzsKKwordm9pZCBTZXRQdGhyZWFkRmxhZygpIHsKKyAgcHRocmVhZF9mbGFnID0gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKyMgaWYgR1RFU1RfSEFTX0NMT05FICYmIEdURVNUX0hBU19QVEhSRUFECisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEb2VzTm90RXhlY3V0ZUF0Zm9ya0hvb2tzKSB7CisgIGlmICghdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSkgeworICAgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgICAgcHRocmVhZF9mbGFnID0gZmFsc2U7CisgICAgQVNTRVJUX0VRKDAsIHB0aHJlYWRfYXRmb3JrKCZTZXRQdGhyZWFkRmxhZywgTlVMTCwgTlVMTCkpOworICAgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICAgIEFTU0VSVF9GQUxTRShwdGhyZWFkX2ZsYWcpOworICB9Cit9CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DTE9ORSAmJiBHVEVTVF9IQVNfUFRIUkVBRAorCisvLyBUZXN0cyB0aGF0IGEgbWV0aG9kIG9mIGFub3RoZXIgY2xhc3MgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE1ldGhvZE9mQW5vdGhlckNsYXNzKSB7CisgIGNvbnN0IE1heURpZSB4KHRydWUpOworICBBU1NFUlRfREVBVEgoeC5NZW1iZXJGdW5jdGlvbigpLCAiTWF5RGllXFw6XFw6TWVtYmVyRnVuY3Rpb24iKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGdsb2JhbCBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgR2xvYmFsRnVuY3Rpb24pIHsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJHbG9iYWxGdW5jdGlvbiIpOworfQorCisvLyBUZXN0cyB0aGF0IGFueSB2YWx1ZSBjb252ZXJ0aWJsZSB0byBhbiBSRSB3b3JrcyBhcyBhIHNlY29uZAorLy8gYXJndW1lbnQgdG8gRVhQRUNUX0RFQVRILgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFjY2VwdHNBbnl0aGluZ0NvbnZlcnRpYmxlVG9SRSkgeworICBzdGF0aWMgY29uc3QgY2hhciByZWdleF9jX3N0cltdID0gIkdsb2JhbEZ1bmN0aW9uIjsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksIHJlZ2V4X2Nfc3RyKTsKKworICBjb25zdCB0ZXN0aW5nOjppbnRlcm5hbDo6UkUgcmVnZXgocmVnZXhfY19zdHIpOworICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgcmVnZXgpOworCisjIGlmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgY29uc3Qgc3RyaW5nIHJlZ2V4X3N0cihyZWdleF9jX3N0cik7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleF9zdHIpOworCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgcmVnZXhfc3RkX3N0cihyZWdleF9jX3N0cik7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleF9zdGRfc3RyKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIG5vbi12b2lkIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgZGVhdGggdGVzdC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBOb25Wb2lkRnVuY3Rpb24pIHsKKyAgQVNTRVJUX0RFQVRIKE5vblZvaWRGdW5jdGlvbigpLCAiTm9uVm9pZEZ1bmN0aW9uIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgZnVuY3Rpb25zIHRoYXQgdGFrZSBwYXJhbWV0ZXIocykgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEZ1bmN0aW9uV2l0aFBhcmFtZXRlcikgeworICBFWFBFQ1RfREVBVEgoRGllSWYodHJ1ZSksICJEaWVJZlxcKFxcKSIpOworICBFWFBFQ1RfREVBVEgoRGllSWZMZXNzVGhhbigyLCAzKSwgIkRpZUlmTGVzc1RoYW4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVBVEggY2FuIGJlIHVzZWQgb3V0c2lkZSBhIFRFU1QsIFRFU1RfRiwgb3IgdGVzdCBmaXh0dXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE91dHNpZGVGaXh0dXJlKSB7CisgIERlYXRoVGVzdFN1YnJvdXRpbmUoKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyBjYW4gYmUgZG9uZSBpbnNpZGUgYSBsb29wLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEluc2lkZUxvb3ApIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBFWFBFQ1RfREVBVEgoRGllSWZMZXNzVGhhbigtMSwgaSksICJEaWVJZkxlc3NUaGFuIikgPDwgIndoZXJlIGkgPT0gIiA8PCBpOworICB9Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBjb21wb3VuZCBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIENvbXBvdW5kU3RhdGVtZW50KSB7CisgIEVYUEVDVF9ERUFUSCh7ICAvLyBOT0xJTlQKKyAgICBjb25zdCBpbnQgeCA9IDI7CisgICAgY29uc3QgaW50IHkgPSB4ICsgMTsKKyAgICBEaWVJZkxlc3NUaGFuKHgsIHkpOworICB9LAorICAiRGllSWZMZXNzVGhhbiIpOworfQorCisvLyBUZXN0cyB0aGF0IGNvZGUgdGhhdCBkb2Vzbid0IGRpZSBjYXVzZXMgYSBkZWF0aCB0ZXN0IHRvIGZhaWwuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRG9lc05vdERpZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgoRGllSWYoZmFsc2UpLCAiRGllSWYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBkaWUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGRlYXRoIHRlc3QgZmFpbHMgd2hlbiB0aGUgZXJyb3IgbWVzc2FnZSBpc24ndCBleHBlY3RlZC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFcnJvck1lc3NhZ2VNaXNtYXRjaCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfREVBVEgoRGllSWYodHJ1ZSksICJEaWVJZkxlc3NUaGFuIikgPDwgIkVuZCBvZiBkZWF0aCB0ZXN0IG1lc3NhZ2UuIjsKKyAgfSwgImRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGVycm9yIik7Cit9CisKKy8vIE9uIGV4aXQsICphYm9ydGVkIHdpbGwgYmUgdHJ1ZSBpZmYgdGhlIEVYUEVDVF9ERUFUSCgpIHN0YXRlbWVudAorLy8gYWJvcnRlZCB0aGUgZnVuY3Rpb24uCit2b2lkIEV4cGVjdERlYXRoVGVzdEhlbHBlcihib29sKiBhYm9ydGVkKSB7CisgICphYm9ydGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0RFQVRIKERpZUlmKGZhbHNlKSwgIkRpZUlmIik7ICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbC4KKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEggZG9lc24ndCBhYm9ydCB0aGUgdGVzdCBvbiBmYWlsdXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEVYUEVDVF9ERUFUSCkgeworICBib29sIGFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFeHBlY3REZWF0aFRlc3RIZWxwZXIoJmFib3J0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRpZSIpOworICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIIGRvZXMgYWJvcnQgdGhlIHRlc3Qgb24gZmFpbHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBU1NFUlRfREVBVEgpIHsKKyAgc3RhdGljIGJvb2wgYWJvcnRlZDsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgYWJvcnRlZCA9IHRydWU7CisgICAgQVNTRVJUX0RFQVRIKERpZUlmKGZhbHNlKSwgIkRpZUlmIik7ICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbC4KKyAgICBhYm9ydGVkID0gZmFsc2U7CisgIH0sICJmYWlsZWQgdG8gZGllIik7CisgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSCBldmFsdWF0ZXMgdGhlIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgU2luZ2xlRXZhbHVhdGlvbikgeworICBpbnQgeCA9IDM7CisgIEVYUEVDVF9ERUFUSChEaWVJZigoKyt4KSA9PSA0KSwgIkRpZUlmIik7CisKKyAgY29uc3QgY2hhciogcmVnZXggPSAiRGllSWYiOworICBjb25zdCBjaGFyKiByZWdleF9zYXZlID0gcmVnZXg7CisgIEVYUEVDVF9ERUFUSChEaWVJZkxlc3NUaGFuKDMsIDQpLCByZWdleCsrKTsKKyAgRVhQRUNUX0VRKHJlZ2V4X3NhdmUgKyAxLCByZWdleCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgcnVuLWF3YXkgZGVhdGggdGVzdHMgYXJlIHJlcG9ydGVkIGFzIGZhaWx1cmVzLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFJ1bmF3YXlJc0ZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKHN0YXRpY19jYXN0PHZvaWQ+KDApLCAiRm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGllLiIpOworfQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHJlcG9ydCBleGVjdXRpbmcgJ3JldHVybicgaW4gdGhlIHN0YXRlbWVudCBhcworLy8gZmFpbHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBSZXR1cm5Jc0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0RFQVRIKHJldHVybiwgIkJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQlVHX0RFQVRIIHdvcmtzIGFzIGV4cGVjdGVkLCB0aGF0IGlzLCB5b3UgY2FuIHN0cmVhbSBhCisvLyBtZXNzYWdlIHRvIGl0LCBhbmQgaW4gZGVidWcgbW9kZSBpdDoKKy8vIDEuIEFzc2VydHMgb24gZGVhdGguCisvLyAyLiBIYXMgbm8gc2lkZSBlZmZlY3QuCisvLworLy8gQW5kIGluIG9wdCBtb2RlLCBpdDoKKy8vIDEuICBIYXMgc2lkZSBlZmZlY3RzIGJ1dCBkb2VzIG5vdCBhc3NlcnQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGVzdEV4cGVjdERlYnVnRGVhdGgpIHsKKyAgaW50IHNpZGVlZmZlY3QgPSAwOworCisgIEVYUEVDVF9ERUJVR19ERUFUSChEaWVJbkRlYnVnRWxzZTEyKCZzaWRlZWZmZWN0KSwgImRlYXRoLipEaWVJbkRlYnVnRWxzZTEyIikKKyAgICAgIDw8ICJNdXN0IGFjY2VwdCBhIHN0cmVhbWVkIG1lc3NhZ2UiOworCisjIGlmZGVmIE5ERUJVRworCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9jY3VycyBpbiBvcHQgbW9kZSAoc2lkZWVmZmVjdCkuCisgIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7CisKKyMgZWxzZQorCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IGRvZXMgbm90IG9jY3VyIGluIGRiZyBtb2RlIChubyBzaWRlZWZmZWN0KS4KKyAgRVhQRUNUX0VRKDAsIHNpZGVlZmZlY3QpOworCisjIGVuZGlmCit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQlVHX0RFQVRIIHdvcmtzIGFzIGV4cGVjdGVkLCB0aGF0IGlzLCB5b3UgY2FuIHN0cmVhbSBhCisvLyBtZXNzYWdlIHRvIGl0LCBhbmQgaW4gZGVidWcgbW9kZSBpdDoKKy8vIDEuIEFzc2VydHMgb24gZGVhdGguCisvLyAyLiBIYXMgbm8gc2lkZSBlZmZlY3QuCisvLworLy8gQW5kIGluIG9wdCBtb2RlLCBpdDoKKy8vIDEuICBIYXMgc2lkZSBlZmZlY3RzIGJ1dCBkb2VzIG5vdCBhc3NlcnQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGVzdEFzc2VydERlYnVnRGVhdGgpIHsKKyAgaW50IHNpZGVlZmZlY3QgPSAwOworCisgIEFTU0VSVF9ERUJVR19ERUFUSChEaWVJbkRlYnVnRWxzZTEyKCZzaWRlZWZmZWN0KSwgImRlYXRoLipEaWVJbkRlYnVnRWxzZTEyIikKKyAgICAgIDw8ICJNdXN0IGFjY2VwdCBhIHN0cmVhbWVkIG1lc3NhZ2UiOworCisjIGlmZGVmIE5ERUJVRworCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9jY3VycyBpbiBvcHQgbW9kZSAoc2lkZWVmZmVjdCkuCisgIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7CisKKyMgZWxzZQorCisgIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IGRvZXMgbm90IG9jY3VyIGluIGRiZyBtb2RlIChubyBzaWRlZWZmZWN0KS4KKyAgRVhQRUNUX0VRKDAsIHNpZGVlZmZlY3QpOworCisjIGVuZGlmCit9CisKKyMgaWZuZGVmIE5ERUJVRworCit2b2lkIEV4cGVjdERlYnVnRGVhdGhIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICAqYWJvcnRlZCA9IHRydWU7CisgIEVYUEVDVF9ERUJVR19ERUFUSChyZXR1cm4sICIiKSA8PCAiVGhpcyBpcyBleHBlY3RlZCB0byBmYWlsLiI7CisgICphYm9ydGVkID0gZmFsc2U7Cit9CisKKyMgIGlmIEdURVNUX09TX1dJTkRPV1MKK1RFU1QoUG9wVXBEZWF0aFRlc3QsIERvZXNOb3RTaG93UG9wVXBPbkFib3J0KSB7CisgIHByaW50ZigiVGhpcyB0ZXN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZhaWxpbmcgaWYgaXQgc2hvd3MgIgorICAgICAgICAgImFueSBwb3AtdXAgZGlhbG9ncy5cbiIpOworICBmZmx1c2goc3Rkb3V0KTsKKworICBFWFBFQ1RfREVBVEgoeworICAgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBmYWxzZTsKKyAgICBhYm9ydCgpOworICB9LCAiIik7Cit9CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUJVR19ERUFUSCBpbiBkZWJ1ZyBtb2RlIGRvZXMgbm90IGFib3J0CisvLyB0aGUgZnVuY3Rpb24uCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhwZWN0RGVidWdEZWF0aERvZXNOb3RBYm9ydCkgeworICBib29sIGFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFeHBlY3REZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOworICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Cit9CisKK3ZvaWQgQXNzZXJ0RGVidWdEZWF0aEhlbHBlcihib29sKiBhYm9ydGVkKSB7CisgICphYm9ydGVkID0gdHJ1ZTsKKyAgQVNTRVJUX0RFQlVHX0RFQVRIKHJldHVybiwgIiIpIDw8ICJUaGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwuIjsKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVCVUdfREVBVEggaW4gZGVidWcgbW9kZSBhYm9ydHMgdGhlIGZ1bmN0aW9uIG9uCisvLyBmYWlsdXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHMpIHsKKyAgc3RhdGljIGJvb2wgYWJvcnRlZDsKKyAgYWJvcnRlZCA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOworICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworIyBlbmRpZiAgLy8gX05ERUJVRworCisvLyBUZXN0cyB0aGUgKl9FWElUIGZhbWlseSBvZiBtYWNyb3MsIHVzaW5nIGEgdmFyaWV0eSBvZiBwcmVkaWNhdGVzLgorc3RhdGljIHZvaWQgVGVzdEV4aXRNYWNyb3MoKSB7CisgIEVYUEVDVF9FWElUKF9leGl0KDEpLCAgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMSksICAiIik7CisgIEFTU0VSVF9FWElUKF9leGl0KDQyKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoNDIpLCAiIik7CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIC8vIE9mIGFsbCBzaWduYWxzIGVmZmVjdHMgb24gdGhlIHByb2Nlc3MgZXhpdCBjb2RlLCBvbmx5IHRob3NlIG9mIFNJR0FCUlQKKyAgLy8gYXJlIGRvY3VtZW50ZWQgb24gV2luZG93cy4KKyAgLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kd3d6a3Q0YyhWUy43MSkuYXNweC4KKyAgRVhQRUNUX0VYSVQocmFpc2UoU0lHQUJSVCksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDMpLCAiIikgPDwgImJfYXIiOworCisjIGVsc2UKKworICBFWFBFQ1RfRVhJVChyYWlzZShTSUdLSUxMKSwgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHS0lMTCksICIiKSA8PCAiZm9vIjsKKyAgQVNTRVJUX0VYSVQocmFpc2UoU0lHVVNSMiksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1VTUjIpLCAiIikgPDwgImJhciI7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0VYSVQoX2V4aXQoMCksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1NFR1YpLCAiIikKKyAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIHRvby4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCB0b28uIik7CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfRVhJVChyYWlzZShTSUdTRUdWKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKQorICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhpdE1hY3JvcykgeworICBUZXN0RXhpdE1hY3JvcygpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhpdE1hY3Jvc1VzaW5nRm9yaykgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gdHJ1ZTsKKyAgVGVzdEV4aXRNYWNyb3MoKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEludmFsaWRTdHlsZSkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInJvY29jbyI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9ERUFUSChfZXhpdCgwKSwgIiIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERlYXRoVGVzdEZhaWxlZE91dHB1dCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9ERUFUSChEaWVXaXRoTWVzc2FnZSgiZGVhdGhcbiIpLAorICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBtZXNzYWdlIiksCisgICAgICAiQWN0dWFsIG1zZzpcbiIKKyAgICAgICJbICBERUFUSCAgIF0gZGVhdGhcbiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRGVhdGhUZXN0VW5leHBlY3RlZFJldHVybk91dHB1dCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9ERUFUSCh7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZXR1cm5pbmdcbiIpOworICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSwgIiIpLAorICAgICAgIiAgICBSZXN1bHQ6IGlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LlxuIgorICAgICAgIiBFcnJvciBtc2c6XG4iCisgICAgICAiWyAgREVBVEggICBdIHJldHVybmluZ1xuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RCYWRFeGl0Q29kZU91dHB1dCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9FWElUKERpZVdpdGhNZXNzYWdlKCJleGl0aW5nIHdpdGggcmMgMVxuIiksCisgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgzKSwKKyAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBtZXNzYWdlIiksCisgICAgICAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIgorICAgICAgIiAgICAgICAgICAgIEV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzIDFcbiIKKyAgICAgICJBY3R1YWwgbXNnOlxuIgorICAgICAgIlsgIERFQVRIICAgXSBleGl0aW5nIHdpdGggcmMgMVxuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RNdWx0aUxpbmVNYXRjaEZhaWwpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfREVBVEgoRGllV2l0aE1lc3NhZ2UoImxpbmUgMVxubGluZSAyXG5saW5lIDNcbiIpLAorICAgICAgICAgICAgICAgICAgICJsaW5lIDFcbnh5elxubGluZSAzXG4iKSwKKyAgICAgICJBY3R1YWwgbXNnOlxuIgorICAgICAgIlsgIERFQVRIICAgXSBsaW5lIDFcbiIKKyAgICAgICJbICBERUFUSCAgIF0gbGluZSAyXG4iCisgICAgICAiWyAgREVBVEggICBdIGxpbmUgM1xuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RNdWx0aUxpbmVNYXRjaFBhc3MpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX0RFQVRIKERpZVdpdGhNZXNzYWdlKCJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iKSwKKyAgICAgICAgICAgICAgICJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iKTsKK30KKworLy8gQSBEZWF0aFRlc3RGYWN0b3J5IHRoYXQgcmV0dXJucyBNb2NrRGVhdGhUZXN0cy4KK2NsYXNzIE1vY2tEZWF0aFRlc3RGYWN0b3J5IDogcHVibGljIERlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgTW9ja0RlYXRoVGVzdEZhY3RvcnkoKTsKKyAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKKworICAvLyBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIENyZWF0ZS4KKyAgdm9pZCBTZXRQYXJhbWV0ZXJzKGJvb2wgY3JlYXRlLCBEZWF0aFRlc3Q6OlRlc3RSb2xlIHJvbGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCk7CisKKyAgLy8gQWNjZXNzb3JzLgorICBpbnQgQXNzdW1lUm9sZUNhbGxzKCkgY29uc3QgeyByZXR1cm4gYXNzdW1lX3JvbGVfY2FsbHNfOyB9CisgIGludCBXYWl0Q2FsbHMoKSBjb25zdCB7IHJldHVybiB3YWl0X2NhbGxzXzsgfQorICBpbnQgUGFzc2VkQ2FsbHMoKSBjb25zdCB7IHJldHVybiBwYXNzZWRfYXJnc18uc2l6ZSgpOyB9CisgIGJvb2wgUGFzc2VkQXJndW1lbnQoaW50IG4pIGNvbnN0IHsgcmV0dXJuIHBhc3NlZF9hcmdzX1tuXTsgfQorICBpbnQgQWJvcnRDYWxscygpIGNvbnN0IHsgcmV0dXJuIGFib3J0X2FyZ3NfLnNpemUoKTsgfQorICBEZWF0aFRlc3Q6OkFib3J0UmVhc29uIEFib3J0QXJndW1lbnQoaW50IG4pIGNvbnN0IHsKKyAgICByZXR1cm4gYWJvcnRfYXJnc19bbl07CisgIH0KKyAgYm9vbCBUZXN0RGVsZXRlZCgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfZGVsZXRlZF87IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNb2NrRGVhdGhUZXN0OworICAvLyBJZiB0cnVlLCBDcmVhdGUgd2lsbCByZXR1cm4gYSBNb2NrRGVhdGhUZXN0OyBvdGhlcndpc2UgaXQgcmV0dXJucworICAvLyBOVUxMLgorICBib29sIGNyZWF0ZV87CisgIC8vIFRoZSB2YWx1ZSBhIE1vY2tEZWF0aFRlc3Qgd2lsbCByZXR1cm4gZnJvbSBpdHMgQXNzdW1lUm9sZSBtZXRob2QuCisgIERlYXRoVGVzdDo6VGVzdFJvbGUgcm9sZV87CisgIC8vIFRoZSB2YWx1ZSBhIE1vY2tEZWF0aFRlc3Qgd2lsbCByZXR1cm4gZnJvbSBpdHMgV2FpdCBtZXRob2QuCisgIGludCBzdGF0dXNfOworICAvLyBUaGUgdmFsdWUgYSBNb2NrRGVhdGhUZXN0IHdpbGwgcmV0dXJuIGZyb20gaXRzIFBhc3NlZCBtZXRob2QuCisgIGJvb2wgcGFzc2VkXzsKKworICAvLyBOdW1iZXIgb2YgdGltZXMgQXNzdW1lUm9sZSB3YXMgY2FsbGVkLgorICBpbnQgYXNzdW1lX3JvbGVfY2FsbHNfOworICAvLyBOdW1iZXIgb2YgdGltZXMgV2FpdCB3YXMgY2FsbGVkLgorICBpbnQgd2FpdF9jYWxsc187CisgIC8vIFRoZSBhcmd1bWVudHMgdG8gdGhlIGNhbGxzIHRvIFBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisgIC8vIFNldFBhcmFtZXRlcnMuCisgIHN0ZDo6dmVjdG9yPGJvb2w+IHBhc3NlZF9hcmdzXzsKKyAgLy8gVGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbHMgdG8gQWJvcnQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworICAvLyBTZXRQYXJhbWV0ZXJzLgorICBzdGQ6OnZlY3RvcjxEZWF0aFRlc3Q6OkFib3J0UmVhc29uPiBhYm9ydF9hcmdzXzsKKyAgLy8gVHJ1ZSBpZiB0aGUgbGFzdCBNb2NrRGVhdGhUZXN0IHJldHVybmVkIGJ5IENyZWF0ZSBoYXMgYmVlbgorICAvLyBkZWxldGVkLgorICBib29sIHRlc3RfZGVsZXRlZF87Cit9OworCisKKy8vIEEgRGVhdGhUZXN0IGltcGxlbWVudGF0aW9uIHVzZWZ1bCBpbiB0ZXN0aW5nLiAgSXQgcmV0dXJucyB2YWx1ZXMgc2V0CisvLyBhdCBpdHMgY3JlYXRpb24gZnJvbSBpdHMgdmFyaW91cyBpbmhlcml0ZWQgRGVhdGhUZXN0IG1ldGhvZHMsIGFuZAorLy8gcmVwb3J0cyBjYWxscyB0byB0aG9zZSBtZXRob2RzIHRvIGl0cyBwYXJlbnQgTW9ja0RlYXRoVGVzdEZhY3RvcnkKKy8vIG9iamVjdC4KK2NsYXNzIE1vY2tEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0IHsKKyBwdWJsaWM6CisgIE1vY2tEZWF0aFRlc3QoTW9ja0RlYXRoVGVzdEZhY3RvcnkgKnBhcmVudCwKKyAgICAgICAgICAgICAgICBUZXN0Um9sZSByb2xlLCBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCkgOgorICAgICAgcGFyZW50XyhwYXJlbnQpLCByb2xlXyhyb2xlKSwgc3RhdHVzXyhzdGF0dXMpLCBwYXNzZWRfKHBhc3NlZCkgeworICB9CisgIHZpcnR1YWwgfk1vY2tEZWF0aFRlc3QoKSB7CisgICAgcGFyZW50Xy0+dGVzdF9kZWxldGVkXyA9IHRydWU7CisgIH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCkgeworICAgICsrcGFyZW50Xy0+YXNzdW1lX3JvbGVfY2FsbHNfOworICAgIHJldHVybiByb2xlXzsKKyAgfQorICB2aXJ0dWFsIGludCBXYWl0KCkgeworICAgICsrcGFyZW50Xy0+d2FpdF9jYWxsc187CisgICAgcmV0dXJuIHN0YXR1c187CisgIH0KKyAgdmlydHVhbCBib29sIFBhc3NlZChib29sIGV4aXRfc3RhdHVzX29rKSB7CisgICAgcGFyZW50Xy0+cGFzc2VkX2FyZ3NfLnB1c2hfYmFjayhleGl0X3N0YXR1c19vayk7CisgICAgcmV0dXJuIHBhc3NlZF87CisgIH0KKyAgdmlydHVhbCB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgeworICAgIHBhcmVudF8tPmFib3J0X2FyZ3NfLnB1c2hfYmFjayhyZWFzb24pOworICB9CisKKyBwcml2YXRlOgorICBNb2NrRGVhdGhUZXN0RmFjdG9yeSogY29uc3QgcGFyZW50XzsKKyAgY29uc3QgVGVzdFJvbGUgcm9sZV87CisgIGNvbnN0IGludCBzdGF0dXNfOworICBjb25zdCBib29sIHBhc3NlZF87Cit9OworCisKKy8vIE1vY2tEZWF0aFRlc3RGYWN0b3J5IGNvbnN0cnVjdG9yLgorTW9ja0RlYXRoVGVzdEZhY3Rvcnk6Ok1vY2tEZWF0aFRlc3RGYWN0b3J5KCkKKyAgICA6IGNyZWF0ZV8odHJ1ZSksCisgICAgICByb2xlXyhEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCksCisgICAgICBzdGF0dXNfKDApLAorICAgICAgcGFzc2VkXyh0cnVlKSwKKyAgICAgIGFzc3VtZV9yb2xlX2NhbGxzXygwKSwKKyAgICAgIHdhaXRfY2FsbHNfKDApLAorICAgICAgcGFzc2VkX2FyZ3NfKCksCisgICAgICBhYm9ydF9hcmdzXygpIHsKK30KKworCisvLyBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIENyZWF0ZS4KK3ZvaWQgTW9ja0RlYXRoVGVzdEZhY3Rvcnk6OlNldFBhcmFtZXRlcnMoYm9vbCBjcmVhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdDo6VGVzdFJvbGUgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgYm9vbCBwYXNzZWQpIHsKKyAgY3JlYXRlXyA9IGNyZWF0ZTsKKyAgcm9sZV8gPSByb2xlOworICBzdGF0dXNfID0gc3RhdHVzOworICBwYXNzZWRfID0gcGFzc2VkOworCisgIGFzc3VtZV9yb2xlX2NhbGxzXyA9IDA7CisgIHdhaXRfY2FsbHNfID0gMDsKKyAgcGFzc2VkX2FyZ3NfLmNsZWFyKCk7CisgIGFib3J0X2FyZ3NfLmNsZWFyKCk7Cit9CisKKworLy8gU2V0cyB0ZXN0IHRvIE5VTEwgKGlmIGNyZWF0ZV8gaXMgZmFsc2UpIG9yIHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3CisvLyBNb2NrRGVhdGhUZXN0IG9iamVjdCB3aXRoIHBhcmFtZXRlcnMgdGFrZW4gZnJvbSB0aGUgbGFzdCBjYWxsCisvLyB0byBTZXRQYXJhbWV0ZXJzIChpZiBjcmVhdGVfIGlzIHRydWUpLiAgQWx3YXlzIHJldHVybnMgdHJ1ZS4KK2Jvb2wgTW9ja0RlYXRoVGVzdEZhY3Rvcnk6OkNyZWF0ZShjb25zdCBjaGFyKiAvKnN0YXRlbWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFKiAvKnJlZ2V4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLypmaWxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qbGluZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKKyAgdGVzdF9kZWxldGVkXyA9IGZhbHNlOworICBpZiAoY3JlYXRlXykgeworICAgICp0ZXN0ID0gbmV3IE1vY2tEZWF0aFRlc3QodGhpcywgcm9sZV8sIHN0YXR1c18sIHBhc3NlZF8pOworICB9IGVsc2UgeworICAgICp0ZXN0ID0gTlVMTDsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQSB0ZXN0IGZpeHR1cmUgZm9yIHRlc3RpbmcgdGhlIGxvZ2ljIG9mIHRoZSBHVEVTVF9ERUFUSF9URVNUXyBtYWNyby4KKy8vIEl0IGluc3RhbGxzIGEgTW9ja0RlYXRoVGVzdEZhY3RvcnkgdGhhdCBpcyB1c2VkIGZvciB0aGUgZHVyYXRpb24KKy8vIG9mIHRoZSB0ZXN0IGNhc2UuCitjbGFzcyBNYWNyb0xvZ2ljRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIHRlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSogcmVwbGFjZXJfOworICBzdGF0aWMgTW9ja0RlYXRoVGVzdEZhY3RvcnkqIGZhY3RvcnlfOworCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgZmFjdG9yeV8gPSBuZXcgTW9ja0RlYXRoVGVzdEZhY3Rvcnk7CisgICAgcmVwbGFjZXJfID0gbmV3IHRlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeShmYWN0b3J5Xyk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGRlbGV0ZSByZXBsYWNlcl87CisgICAgcmVwbGFjZXJfID0gTlVMTDsKKyAgICBkZWxldGUgZmFjdG9yeV87CisgICAgZmFjdG9yeV8gPSBOVUxMOworICB9CisKKyAgLy8gUnVucyBhIGRlYXRoIHRlc3QgdGhhdCBicmVha3MgdGhlIHJ1bGVzIGJ5IHJldHVybmluZy4gIFN1Y2ggYSBkZWF0aAorICAvLyB0ZXN0IGNhbm5vdCBiZSBydW4gZGlyZWN0bHkgZnJvbSBhIHRlc3Qgcm91dGluZSB0aGF0IHVzZXMgYQorICAvLyBNb2NrRGVhdGhUZXN0LCBvciB0aGUgcmVtYWluZGVyIG9mIHRoZSByb3V0aW5lIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgorICBzdGF0aWMgdm9pZCBSdW5SZXR1cm5pbmdEZWF0aFRlc3QoYm9vbCogZmxhZykgeworICAgIEFTU0VSVF9ERUFUSCh7ICAvLyBOT0xJTlQKKyAgICAgICpmbGFnID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9LCAiIik7CisgIH0KK307CisKK3Rlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSogTWFjcm9Mb2dpY0RlYXRoVGVzdDo6cmVwbGFjZXJfCisgICAgPSBOVUxMOworTW9ja0RlYXRoVGVzdEZhY3RvcnkqIE1hY3JvTG9naWNEZWF0aFRlc3Q6OmZhY3RvcnlfID0gTlVMTDsKKworCisvLyBUZXN0IHRoYXQgbm90aGluZyBoYXBwZW5zIHdoZW4gdGhlIGZhY3RvcnkgZG9lc24ndCByZXR1cm4gYSBEZWF0aFRlc3Q6CitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgTm90aGluZ0hhcHBlbnMpIHsKKyAgYm9vbCBmbGFnID0gZmFsc2U7CisgIGZhY3RvcnlfLT5TZXRQYXJhbWV0ZXJzKGZhbHNlLCBEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCwgMCwgdHJ1ZSk7CisgIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOworICBFWFBFQ1RfRkFMU0UoZmxhZyk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfRkFMU0UoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0IHRoYXQgdGhlIHBhcmVudCBwcm9jZXNzIGRvZXNuJ3QgcnVuIHRoZSBkZWF0aCB0ZXN0IGNvZGUsCisvLyBhbmQgdGhhdCB0aGUgUGFzc2VkIG1ldGhvZCByZXR1cm5zIGZhbHNlIHdoZW4gdGhlIChzaW11bGF0ZWQpCisvLyBjaGlsZCBwcm9jZXNzIGV4aXRzIHdpdGggc3RhdHVzIDA6CitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGRFeGl0c1N1Y2Nlc3NmdWxseSkgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpPVkVSU0VFX1RFU1QsIDAsIHRydWUpOworICBFWFBFQ1RfREVBVEgoZmxhZyA9IHRydWUsICIiKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEFTU0VSVF9FUSgxLCBmYWN0b3J5Xy0+UGFzc2VkQ2FsbHMoKSk7CisgIEVYUEVDVF9GQUxTRShmYWN0b3J5Xy0+UGFzc2VkQXJndW1lbnQoMCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgUGFzc2VkIG1ldGhvZCB3YXMgZ2l2ZW4gdGhlIGFyZ3VtZW50ICJ0cnVlIiB3aGVuCisvLyB0aGUgKHNpbXVsYXRlZCkgY2hpbGQgcHJvY2VzcyBleGl0cyB3aXRoIHN0YXR1cyAxOgorVEVTVF9GKE1hY3JvTG9naWNEZWF0aFRlc3QsIENoaWxkRXhpdHNVbnN1Y2Nlc3NmdWxseSkgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpPVkVSU0VFX1RFU1QsIDEsIHRydWUpOworICBFWFBFQ1RfREVBVEgoZmxhZyA9IHRydWUsICIiKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEFTU0VSVF9FUSgxLCBmYWN0b3J5Xy0+UGFzc2VkQ2FsbHMoKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5QYXNzZWRBcmd1bWVudCgwKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKKyAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSAoc2ltdWxhdGVkKSBjaGlsZCBwcm9jZXNzIGV4ZWN1dGVzIHRoZSBkZWF0aCB0ZXN0CisvLyBjb2RlLCBhbmQgaXMgYWJvcnRlZCB3aXRoIHRoZSBjb3JyZWN0IEFib3J0UmVhc29uIGlmIGl0CisvLyBleGVjdXRlcyBhIHJldHVybiBzdGF0ZW1lbnQuCitURVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGRQZXJmb3Jtc1JldHVybikgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpFWEVDVVRFX1RFU1QsIDAsIHRydWUpOworICBSdW5SZXR1cm5pbmdEZWF0aFRlc3QoJmZsYWcpOworICBFWFBFQ1RfVFJVRShmbGFnKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPlBhc3NlZENhbGxzKCkpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7CisgIEVYUEVDVF9FUShEZWF0aFRlc3Q6OlRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCwKKyAgICAgICAgICAgIGZhY3RvcnlfLT5BYm9ydEFyZ3VtZW50KDApKTsKKyAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSAoc2ltdWxhdGVkKSBjaGlsZCBwcm9jZXNzIGlzIGFib3J0ZWQgd2l0aCB0aGUKKy8vIGNvcnJlY3QgQWJvcnRSZWFzb24gaWYgaXQgZG9lcyBub3QgZGllLgorVEVTVF9GKE1hY3JvTG9naWNEZWF0aFRlc3QsIENoaWxkRG9lc05vdERpZSkgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpFWEVDVVRFX1RFU1QsIDAsIHRydWUpOworICBFWFBFQ1RfREVBVEgoZmxhZyA9IHRydWUsICIiKTsKKyAgRVhQRUNUX1RSVUUoZmxhZyk7CisgIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOworICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgLy8gVGhpcyB0aW1lIHRoZXJlIGFyZSB0d28gY2FsbHMgdG8gQWJvcnQ6IG9uZSBzaW5jZSB0aGUgdGVzdCBkaWRuJ3QKKyAgLy8gZGllLCBhbmQgYW5vdGhlciBmcm9tIHRoZSBSZXR1cm5TZW50aW5lbCB3aGVuIGl0J3MgZGVzdHJveWVkLiAgVGhlCisgIC8vIHNlbnRpbmVsIG5vcm1hbGx5IGlzbid0IGRlc3Ryb3llZCBpZiBhIHRlc3QgZG9lc24ndCBkaWUsIHNpbmNlCisgIC8vIF9leGl0KDIpIGlzIGNhbGxlZCBpbiB0aGF0IGNhc2UgYnkgRm9ya2luZ0RlYXRoVGVzdCwgYnV0IG5vdCBieQorICAvLyBvdXIgTW9ja0RlYXRoVGVzdC4KKyAgQVNTRVJUX0VRKDIsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfRVEoRGVhdGhUZXN0OjpURVNUX0RJRF9OT1RfRElFLAorICAgICAgICAgICAgZmFjdG9yeV8tPkFib3J0QXJndW1lbnQoMCkpOworICBFWFBFQ1RfRVEoRGVhdGhUZXN0OjpURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQsCisgICAgICAgICAgICBmYWN0b3J5Xy0+QWJvcnRBcmd1bWVudCgxKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIHN1Y2Nlc3NmdWwgZGVhdGggdGVzdCBkb2VzIG5vdCByZWdpc3RlciBhIHN1Y2Nlc3NmdWwKKy8vIHRlc3QgcGFydC4KK1RFU1QoU3VjY2Vzc1JlZ2lzdHJhdGlvbkRlYXRoVGVzdCwgTm9TdWNjZXNzUGFydCkgeworICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKKyAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc0RlYXRoVGVzdCwgRGVhdGhUZXN0KSB7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDApLCAiIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiOworICB9LCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfREVBVEgoX2V4aXQoMCksICIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSI7CisgIH0sICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUKKy8vIGxhc3QgZXJyb3IgaXMgMCBhbmQgbm9uLWVtcHR5IHN0cmluZyB3aGVuIGl0IGlzIG5vbi16ZXJvLgorVEVTVChHZXRMYXN0RXJybm9EZXNjcmlwdGlvbiwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb25Xb3JrcykgeworICBlcnJubyA9IEVOT0VOVDsKKyAgRVhQRUNUX1NUUk5FKCIiLCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICBlcnJubyA9IDA7CisgIEVYUEVDVF9TVFJFUSgiIiwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKS5jX3N0cigpKTsKK30KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCitURVNUKEF1dG9IYW5kbGVUZXN0LCBBdXRvSGFuZGxlV29ya3MpIHsKKyAgSEFORExFIGhhbmRsZSA9IDo6Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgQVNTRVJUX05FKElOVkFMSURfSEFORExFX1ZBTFVFLCBoYW5kbGUpOworCisgIC8vIFRlc3RzIHRoYXQgdGhlIEF1dG9IYW5kbGUgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIHdpdGggYSBoYW5kbGUuCisgIHRlc3Rpbmc6OmludGVybmFsOjpBdXRvSGFuZGxlIGF1dG9faGFuZGxlKGhhbmRsZSk7CisgIEVYUEVDVF9FUShoYW5kbGUsIGF1dG9faGFuZGxlLkdldCgpKTsKKworICAvLyBUZXN0cyB0aGF0IFJlc2V0IGFzc2lnbnMgSU5WQUxJRF9IQU5ETEVfVkFMVUUuCisgIC8vIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCB2ZXJpZnkgd2hldGhlciB0aGUgb3JpZ2luYWwgaGFuZGxlIGlzIGNsb3NlZC4KKyAgYXV0b19oYW5kbGUuUmVzZXQoKTsKKyAgRVhQRUNUX0VRKElOVkFMSURfSEFORExFX1ZBTFVFLCBhdXRvX2hhbmRsZS5HZXQoKSk7CisKKyAgLy8gVGVzdHMgdGhhdCBSZXNldCBhc3NpZ25zIHRoZSBuZXcgaGFuZGxlLgorICAvLyBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgdmVyaWZ5IHdoZXRoZXIgdGhlIG9yaWdpbmFsIGhhbmRsZSBpcyBjbG9zZWQuCisgIGhhbmRsZSA9IDo6Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgQVNTRVJUX05FKElOVkFMSURfSEFORExFX1ZBTFVFLCBoYW5kbGUpOworICBhdXRvX2hhbmRsZS5SZXNldChoYW5kbGUpOworICBFWFBFQ1RfRVEoaGFuZGxlLCBhdXRvX2hhbmRsZS5HZXQoKSk7CisKKyAgLy8gVGVzdHMgdGhhdCBBdXRvSGFuZGxlIGNvbnRhaW5zIElOVkFMSURfSEFORExFX1ZBTFVFIGJ5IGRlZmF1bHQuCisgIHRlc3Rpbmc6OmludGVybmFsOjpBdXRvSGFuZGxlIGF1dG9faGFuZGxlMjsKKyAgRVhQRUNUX0VRKElOVkFMSURfSEFORExFX1ZBTFVFLCBhdXRvX2hhbmRsZTIuR2V0KCkpOworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBCaWdnZXN0UGFyc2FibGU7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IEJpZ2dlc3RTaWduZWRQYXJzYWJsZTsKK2NvbnN0IEJpZ2dlc3RQYXJzYWJsZSBrQmlnZ2VzdFBhcnNhYmxlTWF4ID0gVUxMT05HX01BWDsKK2NvbnN0IEJpZ2dlc3RTaWduZWRQYXJzYWJsZSBrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4ID0gTExPTkdfTUFYOworIyBlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBCaWdnZXN0UGFyc2FibGU7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdFNpZ25lZFBhcnNhYmxlOworY29uc3QgQmlnZ2VzdFBhcnNhYmxlIGtCaWdnZXN0UGFyc2FibGVNYXggPQorICAgIDo6c3RkOjpudW1lcmljX2xpbWl0czxCaWdnZXN0UGFyc2FibGU+OjptYXgoKTsKK2NvbnN0IEJpZ2dlc3RTaWduZWRQYXJzYWJsZSBrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4ID0KKyAgICA6OnN0ZDo6bnVtZXJpY19saW1pdHM8QmlnZ2VzdFNpZ25lZFBhcnNhYmxlPjo6bWF4KCk7CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgUmVqZWN0c0ludmFsaWRGb3JtYXQpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgLy8gUmVqZWN0cyBub24tbnVtYmVycy4KKyAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigibm9uLW51bWJlciBzdHJpbmciLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBudW1iZXJzIHdpdGggd2hpdGVzcGFjZSBwcmVmaXguCisgIEVYUEVDVF9GQUxTRShQYXJzZU5hdHVyYWxOdW1iZXIoIiAxMjMiLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBuZWdhdGl2ZSBudW1iZXJzLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCItMTIzIiwgJnJlc3VsdCkpOworCisgIC8vIFJlamVjdHMgbnVtYmVycyBzdGFydGluZyB3aXRoIGEgcGx1cyBzaWduLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCIrMTIzIiwgJnJlc3VsdCkpOworICBlcnJubyA9IDA7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgUmVqZWN0c092ZXJmbG93bk51bWJlcnMpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiLCAmcmVzdWx0KSk7CisKKyAgc2lnbmVkIGNoYXIgY2hhcl9yZXN1bHQgPSAwOworICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCIyMDAiLCAmY2hhcl9yZXN1bHQpKTsKKyAgZXJybm8gPSAwOworfQorCitURVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIEFjY2VwdHNWYWxpZE51bWJlcnMpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgcmVzdWx0ID0gMDsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIxMjMiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxMjNVLCByZXN1bHQpOworCisgIC8vIENoZWNrIDAgYXMgYW4gZWRnZSBjYXNlLgorICByZXN1bHQgPSAxOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjAiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgwVSwgcmVzdWx0KTsKKworICByZXN1bHQgPSAxOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjAwMDAwIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRVEoMFUsIHJlc3VsdCk7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgQWNjZXB0c1R5cGVMaW1pdHMpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBrQmlnZ2VzdFBhcnNhYmxlTWF4OworCisgIEJpZ2dlc3RQYXJzYWJsZSByZXN1bHQgPSAwOworICBFWFBFQ1RfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIobXNnLkdldFN0cmluZygpLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUShrQmlnZ2VzdFBhcnNhYmxlTWF4LCByZXN1bHQpOworCisgIE1lc3NhZ2UgbXNnMjsKKyAgbXNnMiA8PCBrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4OworCisgIEJpZ2dlc3RTaWduZWRQYXJzYWJsZSBzaWduZWRfcmVzdWx0ID0gMDsKKyAgRVhQRUNUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKG1zZzIuR2V0U3RyaW5nKCksICZzaWduZWRfcmVzdWx0KSk7CisgIEVYUEVDVF9FUShrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4LCBzaWduZWRfcmVzdWx0KTsKKworICBNZXNzYWdlIG1zZzM7CisgIG1zZzMgPDwgSU5UX01BWDsKKworICBpbnQgaW50X3Jlc3VsdCA9IDA7CisgIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2czLkdldFN0cmluZygpLCAmaW50X3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoSU5UX01BWCwgaW50X3Jlc3VsdCk7CisKKyAgTWVzc2FnZSBtc2c0OworICBtc2c0IDw8IFVJTlRfTUFYOworCisgIHVuc2lnbmVkIGludCB1aW50X3Jlc3VsdCA9IDA7CisgIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2c0LkdldFN0cmluZygpLCAmdWludF9yZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFVJTlRfTUFYLCB1aW50X3Jlc3VsdCk7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgV29ya3NGb3JTaG9ydGVySW50ZWdlcnMpIHsKKyAgc2hvcnQgc2hvcnRfcmVzdWx0ID0gMDsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIxMjMiLCAmc2hvcnRfcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxMjMsIHNob3J0X3Jlc3VsdCk7CisKKyAgc2lnbmVkIGNoYXIgY2hhcl9yZXN1bHQgPSAwOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjEyMyIsICZjaGFyX3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoMTIzLCBjaGFyX3Jlc3VsdCk7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworVEVTVChFbnZpcm9ubWVudFRlc3QsIEhhbmRsZUZpdHNJbnRvU2l6ZVQpIHsKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVtb3ZlIHRoaXMgdGVzdCBhZnRlciB0aGlzIGNvbmRpdGlvbiBpcyB2ZXJpZmllZAorICAvLyBpbiBhIHN0YXRpYyBhc3NlcnRpb24gaW4gZ3Rlc3QtZGVhdGgtdGVzdC5jYyBpbiB0aGUgZnVuY3Rpb24KKyAgLy8gR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IuCisgIEFTU0VSVF9UUlVFKHNpemVvZihIQU5ETEUpIDw9IHNpemVvZihzaXplX3QpKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEL0FTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgdHJpZ2dlcgorLy8gZmFpbHVyZXMgd2hlbiBkZWF0aCB0ZXN0cyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0uCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NEZWF0aFRlc3QsIEV4cGVjdHNEZWF0aFdoZW5EZWF0aFRlc3RzQXZhaWxhYmxlKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoRGllSW5zaWRlKCJDb25kRGVhdGhUZXN0RXhwZWN0TWFjcm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVhdGggaW5zaWRlIENvbmREZWF0aFRlc3RFeHBlY3RNYWNybyIpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKERpZUluc2lkZSgiQ29uZERlYXRoVGVzdEFzc2VydE1hY3JvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlYXRoIGluc2lkZSBDb25kRGVhdGhUZXN0QXNzZXJ0TWFjcm8iKTsKKworICAvLyBFbXB0eSBzdGF0ZW1lbnQgd2lsbCBub3QgY3Jhc2gsIHdoaWNoIG11c3QgdHJpZ2dlciBhIGZhaWx1cmUuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7Cit9CisKKyNlbHNlCisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDYXB0dXJlU3RkZXJyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldENhcHR1cmVkU3RkZXJyOworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQvQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBhcmUgc3RpbGwKKy8vIGRlZmluZWQgYnV0IGRvIG5vdCB0cmlnZ2VyIGZhaWx1cmVzIHdoZW4gZGVhdGggdGVzdHMgYXJlIG5vdCBhdmFpbGFibGUgb24KKy8vIHRoZSBzeXN0ZW0uCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NUZXN0LCBXYXJuc1doZW5EZWF0aFRlc3RzTm90QXZhaWxhYmxlKSB7CisgIC8vIEVtcHR5IHN0YXRlbWVudCB3aWxsIG5vdCBjcmFzaCwgYnV0IHRoYXQgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgZmFpbHVyZQorICAvLyB3aGVuIGRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkLgorICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpOworICBzdGQ6OnN0cmluZyBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKSk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gc3Ryc3RyKG91dHB1dC5jX3N0cigpLCAiOyIpKTsKKworICAvLyBUaGUgc3RyZWFtZWQgbWVzc2FnZSBzaG91bGQgbm90IGJlIHByaW50ZWQgYXMgdGhlcmUgaXMgbm8gdGVzdCBmYWlsdXJlLgorICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpIDw8ICJzdHJlYW1lZCBtZXNzYWdlIjsKKyAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCA9PSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICJzdHJlYW1lZCBtZXNzYWdlIikpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCg7LCAiIik7ICAvLyBOT0xJTlQKKyAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSBzdHJzdHIob3V0cHV0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIikpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwgIjsiKSk7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKSA8PCAic3RyZWFtZWQgbWVzc2FnZSI7ICAvLyBOT0xJTlQKKyAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCA9PSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICJzdHJlYW1lZCBtZXNzYWdlIikpOworfQorCit2b2lkIEZ1bmNXaXRoQXNzZXJ0KGludCogbikgeworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybjssICIiKTsKKyAgKCpuKSsrOworfQorCisvLyBUZXN0cyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgZG9lcyBub3QgcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQKKy8vIGZ1bmN0aW9uIChhcyBBU1NFUlRfREVBVEggZG9lcykgaWYgZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NUZXN0LCBBc3NlcnREZWF0RG9lc05vdFJldHVybmhJZlVuc3VwcG9ydGVkKSB7CisgIGludCBuID0gMDsKKyAgRnVuY1dpdGhBc3NlcnQoJm4pOworICBFWFBFQ1RfRVEoMSwgbik7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFRlc3RzIHRoYXQgdGhlIGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIG1heSBvciBtYXkgbm90CisvLyBiZSBmb2xsb3dlZCBieSBvcGVyYXRvcjw8LCBhbmQgdGhhdCBpbiBlaXRoZXIgY2FzZSB0aGUgY29tcGxldGUgdGV4dAorLy8gY29tcHJpc2VzIG9ubHkgYSBzaW5nbGUgQysrIHN0YXRlbWVudC4KKy8vCisvLyBUaGUgc3ludGF4IHNob3VsZCB3b3JrIHdoZXRoZXIgZGVhdGggdGVzdHMgYXJlIGF2YWlsYWJsZSBvciBub3QuCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NTeW50YXhEZWF0aFRlc3QsIFNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICAvLyBUaGlzIHdvdWxkIGZhaWwgaWYgZXhlY3V0ZWQ7IHRoaXMgaXMgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkKKyAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybiwgIiIpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChfZXhpdCgxKSwgIiIpOworICBlbHNlCisgICAgLy8gVGhpcyBlbXB0eSAiZWxzZSIgYnJhbmNoIGlzIG1lYW50IHRvIGVuc3VyZSB0aGF0IEVYUEVDVF9ERUFUSAorICAgIC8vIGRvZXNuJ3QgZXhwYW5kIGludG8gYW4gImlmIiBzdGF0ZW1lbnQgd2l0aG91dCBhbiAiZWxzZSIKKyAgICA7ICAvLyBOT0xJTlQKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybiwgIiIpIDw8ICJkaWQgbm90IGRpZSI7CisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgOyAgLy8gTk9MSU5UCisgIGVsc2UKKyAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIikgPDwgMSA8PCAyIDw8IDM7Cit9CisKKy8vIFRlc3RzIHRoYXQgY29uZGl0aW9uYWwgZGVhdGggdGVzdCBtYWNyb3MgZXhwYW5kIHRvIGNvZGUgd2hpY2ggaW50ZXJhY3RzCisvLyB3ZWxsIHdpdGggc3dpdGNoIHN0YXRlbWVudHMuCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NTeW50YXhEZWF0aFRlc3QsIFN3aXRjaFN0YXRlbWVudCkgeworLy8gTWljcm9zb2Z0IGNvbXBpbGVyIHVzdWFsbHkgY29tcGxhaW5zIGFib3V0IHN3aXRjaCBzdGF0ZW1lbnRzIHdpdGhvdXQKKy8vIGNhc2UgbGFiZWxzLiBXZSBzdXBwcmVzcyB0aGF0IHdhcm5pbmcgZm9yIHRoaXMgdGVzdC4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDY1KQorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisgIHN3aXRjaCAoMCkKKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChfZXhpdCgxKSwgIiIpCisgICAgICAgICAgPDwgImV4aXQgaW4gZGVmYXVsdCBzd2l0Y2ggaGFuZGxlciI7CisKKyAgc3dpdGNoICgwKQorICAgIGNhc2UgMDoKKyAgICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoX2V4aXQoMSksICIiKSA8PCAiZXhpdCBpbiBzd2l0Y2ggY2FzZSI7CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKK1RFU1QoSW5EZWF0aFRlc3RDaGlsZERlYXRoVGVzdCwgUmVwb3J0c0RlYXRoVGVzdENvcnJlY3RseUluRmFzdFN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9GQUxTRShJbkRlYXRoVGVzdENoaWxkKCkpOworICBFWFBFQ1RfREVBVEgoeworICAgIGZwcmludGYoc3RkZXJyLCBJbkRlYXRoVGVzdENoaWxkKCkgPyAiSW5zaWRlIiA6ICJPdXRzaWRlIik7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgX2V4aXQoMSk7CisgIH0sICJJbnNpZGUiKTsKK30KKworVEVTVChJbkRlYXRoVGVzdENoaWxkRGVhdGhUZXN0LCBSZXBvcnRzRGVhdGhUZXN0Q29ycmVjdGx5SW5UaHJlYWRTYWZlU3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgRVhQRUNUX0ZBTFNFKEluRGVhdGhUZXN0Q2hpbGQoKSk7CisgIEVYUEVDVF9ERUFUSCh7CisgICAgZnByaW50ZihzdGRlcnIsIEluRGVhdGhUZXN0Q2hpbGQoKSA/ICJJbnNpZGUiIDogIk91dHNpZGUiKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBfZXhpdCgxKTsKKyAgfSwgIkluc2lkZSIpOworfQorCisvLyBUZXN0cyB0aGF0IGEgdGVzdCBjYXNlIHdob3NlIG5hbWUgZW5kcyB3aXRoICJEZWF0aFRlc3QiIHdvcmtzIGZpbmUKKy8vIG9uIFdpbmRvd3MuCitURVNUKE5vdEFEZWF0aFRlc3QsIFRlc3QpIHsKKyAgU1VDQ0VFRCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTlmNTVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MKQEAgLTAsMCArMSw2ODAgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisvLworLy8gR29vZ2xlIFRlc3QgZmlsZXBhdGggdXRpbGl0aWVzCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBmcm9tIGd0ZXN0X3VuaXR0ZXN0LmNjLCB0byBhdm9pZCBjaGFuZ2luZworLy8gYnVpbGQgb3IgbWFrZS1maWxlcyBmb3Igc29tZSBleGlzdGluZyBHb29nbGUgVGVzdCBjbGllbnRzLiBEbyBub3QKKy8vICNpbmNsdWRlIHRoaXMgZmlsZSBhbnl3aGVyZSBlbHNlIQorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDxkaXJlY3QuaD4gIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogTW92ZSB0aGVzZSB0byB0aGUgUE9TSVggYWRhcHRlciBzZWN0aW9uIGluCisvLyBndGVzdC1wb3J0LmguCisKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIHRoZSByZW1vdmUgQyBmdW5jdGlvbi4KK2ludCByZW1vdmUoY29uc3QgY2hhciogcGF0aCkgeworICBMUENXU1RSIHdwYXRoID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRoKTsKKyAgaW50IHJldCA9IERlbGV0ZUZpbGUod3BhdGgpID8gMCA6IC0xOworICBkZWxldGUgW10gd3BhdGg7CisgIHJldHVybiByZXQ7Cit9CisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSB0aGUgX3JtZGlyIEMgZnVuY3Rpb24uCitpbnQgX3JtZGlyKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgRmlsZVBhdGggZmlsZXBhdGgocGF0aCk7CisgIExQQ1dTVFIgd3BhdGggPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KAorICAgICAgZmlsZXBhdGguUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuY19zdHIoKSk7CisgIGludCByZXQgPSBSZW1vdmVEaXJlY3Rvcnkod3BhdGgpID8gMCA6IC0xOworICBkZWxldGUgW10gd3BhdGg7CisgIHJldHVybiByZXQ7Cit9CisKKyNlbHNlCisKK1RFU1QoR2V0Q3VycmVudERpclRlc3QsIFJldHVybnNDdXJyZW50RGlyKSB7CisgIGNvbnN0IEZpbGVQYXRoIG9yaWdpbmFsX2RpciA9IEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCk7CisgIEVYUEVDVF9GQUxTRShvcmlnaW5hbF9kaXIuSXNFbXB0eSgpKTsKKworICBwb3NpeDo6Q2hEaXIoR1RFU1RfUEFUSF9TRVBfKTsKKyAgY29uc3QgRmlsZVBhdGggY3dkID0gRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKTsKKyAgcG9zaXg6OkNoRGlyKG9yaWdpbmFsX2Rpci5jX3N0cigpKTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgLy8gU2tpcHMgdGhlICI6Ii4KKyAgY29uc3QgY2hhciogY29uc3QgY3dkX3dpdGhvdXRfZHJpdmUgPSBzdHJjaHIoY3dkLmNfc3RyKCksICc6Jyk7CisgIEFTU0VSVF9UUlVFKGN3ZF93aXRob3V0X2RyaXZlICE9IE5VTEwpOworICBFWFBFQ1RfU1RSRVEoR1RFU1RfUEFUSF9TRVBfLCBjd2Rfd2l0aG91dF9kcml2ZSArIDEpOworCisjIGVsc2UKKworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfLCBjd2Quc3RyaW5nKCkpOworCisjIGVuZGlmCit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworVEVTVChJc0VtcHR5VGVzdCwgUmV0dXJuc1RydWVGb3JFbXB0eVBhdGgpIHsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIiIpLklzRW1wdHkoKSk7Cit9CisKK1RFU1QoSXNFbXB0eVRlc3QsIFJldHVybnNGYWxzZUZvck5vbkVtcHR5UGF0aCkgeworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImEiKS5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIi4iKS5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImEvYiIpLklzRW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYVxcYlxcIikuSXNFbXB0eSgpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiIiAtPiAiIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgV2hlbkVtcHR5TmFtZSkgeworICBFWFBFQ1RfRVEoIiIsIEZpbGVQYXRoKCIiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICJhZmlsZSIgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgQnV0Tm9EaXJlY3RvcnkpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICBGaWxlUGF0aCgiYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICIvYWZpbGUiIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFJvb3RGaWxlU2hvdWxkR2l2ZUZpbGVOYW1lKSB7CisgIEVYUEVDVF9FUSgiYWZpbGUiLAorICAgICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvIiAtPiAiIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgV2hlcmVUaGVyZUlzTm9GaWxlTmFtZSkgeworICBFWFBFQ1RfRVEoIiIsCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICJhZGlyL2FmaWxlIiAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBTaG91bGRHaXZlRmlsZU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvc3ViZGlyL2FmaWxlIiAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBTaG91bGRBbHNvR2l2ZUZpbGVOYW1lKSB7CisgIEVYUEVDVF9FUSgiYWZpbGUiLAorICAgICAgRmlsZVBhdGgoImFkaXIiIEdURVNUX1BBVEhfU0VQXyAic3ViZGlyIiBHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikKKyAgICAgIC5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgd29ya3Mgd2l0aCB0aGUgYWx0ZXJuYXRlIHNlcGFyYXRvcgorLy8gb24gV2luZG93cy4KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSgiL2FmaWxlIikgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgUm9vdEZpbGVTaG91bGRHaXZlRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsIEZpbGVQYXRoKCIvYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyLyIpIC0+ICIiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBXaGVyZVRoZXJlSXNOb0ZpbGVOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiIiwgRmlsZVBhdGgoImFkaXIvIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSgiYWRpci9hZmlsZSIpIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEdpdmVGaWxlTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImFmaWxlIiwgRmlsZVBhdGgoImFkaXIvYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyL3N1YmRpci9hZmlsZSIpIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEFsc29HaXZlRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICAgICAgICBGaWxlUGF0aCgiYWRpci9zdWJkaXIvYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisjZW5kaWYKKworLy8gUmVtb3ZlRmlsZU5hbWUgIiIgLT4gIi4vIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEVtcHR5TmFtZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIE9uIFdpbmRvd3MgQ0UsIHdlIHVzZSB0aGUgcm9vdCBhcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8sIEZpbGVQYXRoKCIiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKKyNlbHNlCisgIEVYUEVDVF9FUSgiLiIgR1RFU1RfUEFUSF9TRVBfLCBGaWxlUGF0aCgiIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7CisjZW5kaWYKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgImFkaXIvIiAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgQnV0Tm9GaWxlKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgRmlsZVBhdGgoImFkaXIiIEdURVNUX1BBVEhfU0VQXykuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lICJhZGlyL2FmaWxlIiAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJOYW1lKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIiIEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgImFkaXIvc3ViZGlyL2FmaWxlIiAtPiAiYWRpci9zdWJkaXIvIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzRGlyQW5kU3ViRGlyTmFtZSkgeworICBFWFBFQ1RfRVEoImFkaXIiIEdURVNUX1BBVEhfU0VQXyAic3ViZGlyIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKQorICAgICAgLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSAiL2FmaWxlIiAtPiAiLyIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc1Jvb3REaXIpIHsKKyAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXywKKyAgICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlRmlsZU5hbWUoKSB3b3JrcyB3aXRoIHRoZSBhbHRlcm5hdGUgc2VwYXJhdG9yIG9uCisvLyBXaW5kb3dzLgorCisvLyBSZW1vdmVGaWxlTmFtZSgiYWRpci8iKSAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgQnV0Tm9GaWxlRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lKCJhZGlyL2FmaWxlIikgLT4gImFkaXIvIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzRGlyTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImFkaXIiIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyL2FmaWxlIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lKCJhZGlyL3N1YmRpci9hZmlsZSIpIC0+ICJhZGlyL3N1YmRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJBbmRTdWJEaXJOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyL3N1YmRpci9hZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSgiL2FmaWxlIikgLT4gIlwiCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNSb290RGlyRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8sIEZpbGVQYXRoKCIvYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworI2VuZGlmCisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVXaGVuTnVtYmVySXNaZXJvKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoImZvbyIpLCBGaWxlUGF0aCgiYmFyIiksCisgICAgICAwLCAieG1sIik7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlRmlsZU5hbWVOdW1iZXJHdFplcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiksIEZpbGVQYXRoKCJiYXIiKSwKKyAgICAgIDEyLCAieG1sIik7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhcl8xMi54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlRmlsZU5hbWVXaXRoU2xhc2hOdW1iZXJJc1plcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLAorICAgICAgRmlsZVBhdGgoImJhciIpLCAwLCAieG1sIik7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlRmlsZU5hbWVXaXRoU2xhc2hOdW1iZXJHdFplcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLAorICAgICAgRmlsZVBhdGgoImJhciIpLCAxMiwgInhtbCIpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXJfMTIueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChNYWtlRmlsZU5hbWVUZXN0LCBHZW5lcmF0ZVdoZW5OdW1iZXJJc1plcm9BbmREaXJJc0VtcHR5KSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoIiIpLCBGaWxlUGF0aCgiYmFyIiksCisgICAgICAwLCAieG1sIik7CisgIEVYUEVDVF9FUSgiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVXaGVuTnVtYmVySXNOb3RaZXJvQW5kRGlySXNFbXB0eSkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCIiKSwgRmlsZVBhdGgoImJhciIpLAorICAgICAgMTQsICJ4bWwiKTsKKyAgRVhQRUNUX0VRKCJiYXJfMTQueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIFdvcmtzV2hlbkRpckRvZXNOb3RFbmRXaXRoUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImJhci54bWwiKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgV29ya3NXaGVuUGF0aDFFbmRzV2l0aFBhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiYmFyLnhtbCIpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMUJlaW5nRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIueG1sIikpOworICBFWFBFQ1RfRVEoImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDJCZWluZ0VtcHR5KSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiZm9vIiksIEZpbGVQYXRoKCIiKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBCb3RoUGF0aEJlaW5nRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCIiKSk7CisgIEVYUEVDVF9FUSgiIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIFBhdGgxQ29udGFpbnNQYXRoU2VwKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImZvb2Jhci54bWwiKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfICJmb29iYXIueG1sIiwKKyAgICAgICAgICAgIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMkNvbnRhaW5zUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLAorICAgICAgRmlsZVBhdGgoImJhciIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIikpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsCisgICAgICAgICAgICBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDJFbmRzV2l0aFBhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIiIEdURVNUX1BBVEhfU0VQXykpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXywgYWN0dWFsLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICIiIC0+ICIiCitURVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIEVtcHR5U3RyaW5nKSB7CisgIEVYUEVDVF9FUSgiIiwgRmlsZVBhdGgoIiIpLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICJmb28iIC0+ICJmb28iCitURVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIEZpbGVOb1NsYXNoU3RyaW5nKSB7CisgIEVYUEVDVF9FUSgiZm9vIiwgRmlsZVBhdGgoImZvbyIpLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICJmb28vIiAtPiAiZm9vIgorVEVTVChSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JUZXN0LCBTaG91bGRSZW1vdmVUcmFpbGluZ1NlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImZvbyIsCisgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICBFWFBFQ1RfRVEoImZvbyIsIEZpbGVQYXRoKCJmb28vIikuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworI2VuZGlmCit9CisKKy8vIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvciAiZm9vL2Jhci8iIC0+ICJmb28vYmFyLyIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgU2hvdWxkUmVtb3ZlTGFzdFNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXykKKyAgICAgICAgICAgICAgICAuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvby9iYXIiIC0+ICJmb28vYmFyIgorVEVTVChSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JUZXN0LCBTaG91bGRSZXR1cm5Vbm1vZGlmaWVkKSB7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIpCisgICAgICAgICAgICAgICAgLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKK30KKworVEVTVChEaXJlY3RvcnlUZXN0LCBSb290RGlyZWN0b3J5RXhpc3RzKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MuCisgIGNoYXIgY3VycmVudF9kcml2ZVtfTUFYX1BBVEhdOyAgLy8gTk9MSU5UCisgIGN1cnJlbnRfZHJpdmVbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihfZ2V0ZHJpdmUoKSArICdBJyAtIDEpOworICBjdXJyZW50X2RyaXZlWzFdID0gJzonOworICBjdXJyZW50X2RyaXZlWzJdID0gJ1xcJzsKKyAgY3VycmVudF9kcml2ZVszXSA9ICdcMCc7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKGN1cnJlbnRfZHJpdmUpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyNlbHNlCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIvIikuRGlyZWN0b3J5RXhpc3RzKCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCitURVNUKERpcmVjdG9yeVRlc3QsIFJvb3RPZldyb25nRHJpdmVEb2VzTm90RXhpc3RzKSB7CisgIGNvbnN0IGludCBzYXZlZF9kcml2ZV8gPSBfZ2V0ZHJpdmUoKTsKKyAgLy8gRmluZCBhIGRyaXZlIHRoYXQgZG9lc24ndCBleGlzdC4gU3RhcnQgd2l0aCAnWicgdG8gYXZvaWQgY29tbW9uIG9uZXMuCisgIGZvciAoY2hhciBkcml2ZSA9ICdaJzsgZHJpdmUgPj0gJ0EnOyBkcml2ZS0tKQorICAgIGlmIChfY2hkcml2ZShkcml2ZSAtICdBJyArIDEpID09IC0xKSB7CisgICAgICBjaGFyIG5vbl9kcml2ZVtfTUFYX1BBVEhdOyAgLy8gTk9MSU5UCisgICAgICBub25fZHJpdmVbMF0gPSBkcml2ZTsKKyAgICAgIG5vbl9kcml2ZVsxXSA9ICc6JzsKKyAgICAgIG5vbl9kcml2ZVsyXSA9ICdcXCc7CisgICAgICBub25fZHJpdmVbM10gPSAnXDAnOworICAgICAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKG5vbl9kcml2ZSkuRGlyZWN0b3J5RXhpc3RzKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICBfY2hkcml2ZShzYXZlZF9kcml2ZV8pOworfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFdpbmRvd3MgQ0UgX2RvZXNfIGNvbnNpZGVyIGFuIGVtcHR5IGRpcmVjdG9yeSB0byBleGlzdC4KK1RFU1QoRGlyZWN0b3J5VGVzdCwgRW1wdHlQYXRoRGlyZWN0b3J5RG9lc05vdEV4aXN0KSB7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiIikuRGlyZWN0b3J5RXhpc3RzKCkpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworVEVTVChEaXJlY3RvcnlUZXN0LCBDdXJyZW50RGlyZWN0b3J5RXhpc3RzKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MuCisjIGlmbmRlZiBfV0lOMzJfQ0UgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnkuCisKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi4iKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIuXFwiKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisKKyMgZW5kaWYgIC8vIF9XSU4zMl9DRQorI2Vsc2UKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi4iKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIuLyIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworfQorCisvLyAiZm9vL2JhciIgPT0gZm9vLy9iYXIiID09ICJmb28vLy9iYXIiCitURVNUKE5vcm1hbGl6ZVRlc3QsIE11bHRpcGxlQ29uc2VjdXRpdmVTZXBhcGFyYXRvcnNJbk1pZHN0cmluZykgeworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfCisgICAgICAgICAgICAgICAgICAgICBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKK30KKworLy8gIi9iYXIiID09IC8vYmFyIiA9PSAiLy8vYmFyIgorVEVTVChOb3JtYWxpemVUZXN0LCBNdWx0aXBsZUNvbnNlY3V0aXZlU2VwYXBhcmF0b3JzQXRTdHJpbmdTdGFydCkgeworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICBGaWxlUGF0aChHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOworfQorCisvLyAiZm9vLyIgPT0gZm9vLy8iID09ICJmb28vLy8iCitURVNUKE5vcm1hbGl6ZVRlc3QsIE11bHRpcGxlQ29uc2VjdXRpdmVTZXBhcGFyYXRvcnNBdFN0cmluZ0VuZCkgeworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXykuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8pLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXykuc3RyaW5nKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKworLy8gVGVzdHMgdGhhdCBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBhcmUgbm9ybWFsaXplZAorLy8gcmVnYXJkbGVzcyBvZiB0aGVpciBjb21iaW5hdGlvbiAoZS5nLiAiZm9vXCIgPT0iZm9vL1wiID09CisvLyAiZm9vXFwvIikuCitURVNUKE5vcm1hbGl6ZVRlc3QsIE1peEFsdGVybmF0ZVNlcGFyYXRvckF0U3RyaW5nRW5kKSB7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vLyIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiLyIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28vLyIgR1RFU1RfUEFUSF9TRVBfKS5zdHJpbmcoKSk7Cit9CisKKyNlbmRpZgorCitURVNUKEFzc2lnbm1lbnRPcGVyYXRvclRlc3QsIERlZmF1bHRBc3NpZ25lZFRvTm9uRGVmYXVsdCkgeworICBGaWxlUGF0aCBkZWZhdWx0X3BhdGg7CisgIEZpbGVQYXRoIG5vbl9kZWZhdWx0X3BhdGgoInBhdGgiKTsKKyAgbm9uX2RlZmF1bHRfcGF0aCA9IGRlZmF1bHRfcGF0aDsKKyAgRVhQRUNUX0VRKCIiLCBub25fZGVmYXVsdF9wYXRoLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCIiLCBkZWZhdWx0X3BhdGguc3RyaW5nKCkpOyAgLy8gUkhTIHZhciBpcyB1bmNoYW5nZWQuCit9CisKK1RFU1QoQXNzaWdubWVudE9wZXJhdG9yVGVzdCwgTm9uRGVmYXVsdEFzc2lnbmVkVG9EZWZhdWx0KSB7CisgIEZpbGVQYXRoIG5vbl9kZWZhdWx0X3BhdGgoInBhdGgiKTsKKyAgRmlsZVBhdGggZGVmYXVsdF9wYXRoOworICBkZWZhdWx0X3BhdGggPSBub25fZGVmYXVsdF9wYXRoOworICBFWFBFQ1RfRVEoInBhdGgiLCBkZWZhdWx0X3BhdGguc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBub25fZGVmYXVsdF9wYXRoLnN0cmluZygpKTsgIC8vIFJIUyB2YXIgaXMgdW5jaGFuZ2VkLgorfQorCitURVNUKEFzc2lnbm1lbnRPcGVyYXRvclRlc3QsIENvbnN0QXNzaWduZWRUb05vbkNvbnN0KSB7CisgIGNvbnN0IEZpbGVQYXRoIGNvbnN0X2RlZmF1bHRfcGF0aCgiY29uc3RfcGF0aCIpOworICBGaWxlUGF0aCBub25fZGVmYXVsdF9wYXRoKCJwYXRoIik7CisgIG5vbl9kZWZhdWx0X3BhdGggPSBjb25zdF9kZWZhdWx0X3BhdGg7CisgIEVYUEVDVF9FUSgiY29uc3RfcGF0aCIsIG5vbl9kZWZhdWx0X3BhdGguc3RyaW5nKCkpOworfQorCitjbGFzcyBEaXJlY3RvcnlDcmVhdGlvblRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgdGVzdGRhdGFfcGF0aF8uU2V0KEZpbGVQYXRoKAorICAgICAgICBUZW1wRGlyKCkgKyBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArCisgICAgICAgICJfZGlyZWN0b3J5X2NyZWF0aW9uIiBHVEVTVF9QQVRIX1NFUF8gInRlc3QiIEdURVNUX1BBVEhfU0VQXykpOworICAgIHRlc3RkYXRhX2ZpbGVfLlNldCh0ZXN0ZGF0YV9wYXRoXy5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisKKyAgICB1bmlxdWVfZmlsZTBfLlNldChGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLCBGaWxlUGF0aCgidW5pcXVlIiksCisgICAgICAgIDAsICJ0eHQiKSk7CisgICAgdW5pcXVlX2ZpbGUxXy5TZXQoRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZSh0ZXN0ZGF0YV9wYXRoXywgRmlsZVBhdGgoInVuaXF1ZSIpLAorICAgICAgICAxLCAidHh0IikpOworCisgICAgcmVtb3ZlKHRlc3RkYXRhX2ZpbGVfLmNfc3RyKCkpOworICAgIHJlbW92ZSh1bmlxdWVfZmlsZTBfLmNfc3RyKCkpOworICAgIHJlbW92ZSh1bmlxdWVfZmlsZTFfLmNfc3RyKCkpOworICAgIHBvc2l4OjpSbURpcih0ZXN0ZGF0YV9wYXRoXy5jX3N0cigpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICByZW1vdmUodGVzdGRhdGFfZmlsZV8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMF8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMV8uY19zdHIoKSk7CisgICAgcG9zaXg6OlJtRGlyKHRlc3RkYXRhX3BhdGhfLmNfc3RyKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgVGVtcERpcigpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAgIHJldHVybiAiXFx0ZW1wXFwiOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICAgIGNvbnN0IGNoYXIqIHRlbXBfZGlyID0gcG9zaXg6OkdldEVudigiVEVNUCIpOworICAgIGlmICh0ZW1wX2RpciA9PSBOVUxMIHx8IHRlbXBfZGlyWzBdID09ICdcMCcpCisgICAgICByZXR1cm4gIlxcdGVtcFxcIjsKKyAgICBlbHNlIGlmICh0ZW1wX2RpcltzdHJsZW4odGVtcF9kaXIpIC0gMV0gPT0gJ1xcJykKKyAgICAgIHJldHVybiB0ZW1wX2RpcjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcodGVtcF9kaXIpICsgIlxcIjsKKyNlbGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgICByZXR1cm4gIi9zZGNhcmQvIjsKKyNlbHNlCisgICAgcmV0dXJuICIvdG1wLyI7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIH0KKworICB2b2lkIENyZWF0ZVRleHRGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgICAgRklMRSogZiA9IHBvc2l4OjpGT3BlbihmaWxlbmFtZSwgInciKTsKKyAgICBmcHJpbnRmKGYsICJ0ZXh0XG4iKTsKKyAgICBmY2xvc2UoZik7CisgIH0KKworICAvLyBTdHJpbmdzIHJlcHJlc2VudGluZyBhIGRpcmVjdG9yeSBhbmQgYSBmaWxlLCB3aXRoIGlkZW50aWNhbCBwYXRocworICAvLyBleGNlcHQgZm9yIHRoZSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyIHRoYXQgZGlzdGlucXVpc2hlcworICAvLyBhIGRpcmVjdG9yeSBuYW1lZCAndGVzdCcgZnJvbSBhIGZpbGUgbmFtZWQgJ3Rlc3QnLiBFeGFtcGxlIG5hbWVzOgorICBGaWxlUGF0aCB0ZXN0ZGF0YV9wYXRoXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0LyIKKyAgRmlsZVBhdGggdGVzdGRhdGFfZmlsZV87ICAvLyAiL3RtcC9kaXJlY3RvcnlfY3JlYXRpb24vdGVzdCIKKyAgRmlsZVBhdGggdW5pcXVlX2ZpbGUwXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0L3VuaXF1ZS50eHQiCisgIEZpbGVQYXRoIHVuaXF1ZV9maWxlMV87ICAvLyAiL3RtcC9kaXJlY3RvcnlfY3JlYXRpb24vdGVzdC91bmlxdWVfMS50eHQiCit9OworCitURVNUX0YoRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KSB7CisgIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9wYXRoXy5EaXJlY3RvcnlFeGlzdHMoKSkgPDwgdGVzdGRhdGFfcGF0aF8uc3RyaW5nKCk7CisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7CisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkRpcmVjdG9yeUV4aXN0cygpKTsKK30KKworVEVTVF9GKERpcmVjdG9yeUNyZWF0aW9uVGVzdCwgQ3JlYXRlRGlyZWN0b3JpZXNGb3JBbHJlYWR5RXhpc3RpbmdQYXRoKSB7CisgIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9wYXRoXy5EaXJlY3RvcnlFeGlzdHMoKSkgPDwgdGVzdGRhdGFfcGF0aF8uc3RyaW5nKCk7CisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7CisgIC8vIENhbGwgJ2NyZWF0ZScgYWdhaW4uLi4gc2hvdWxkIHN0aWxsIHN1Y2NlZWQuCisgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Cit9CisKK1RFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzQW5kVW5pcXVlRmlsZW5hbWUpIHsKKyAgRmlsZVBhdGggZmlsZV9wYXRoKEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLAorICAgICAgRmlsZVBhdGgoInVuaXF1ZSIpLCAidHh0IikpOworICBFWFBFQ1RfRVEodW5pcXVlX2ZpbGUwXy5zdHJpbmcoKSwgZmlsZV9wYXRoLnN0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKGZpbGVfcGF0aC5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7ICAvLyBmaWxlIG5vdCB0aGVyZQorCisgIHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKTsKKyAgRVhQRUNUX0ZBTFNFKGZpbGVfcGF0aC5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7ICAvLyBmaWxlIHN0aWxsIG5vdCB0aGVyZQorICBDcmVhdGVUZXh0RmlsZShmaWxlX3BhdGguY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKGZpbGVfcGF0aC5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7CisKKyAgRmlsZVBhdGggZmlsZV9wYXRoMihGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSh0ZXN0ZGF0YV9wYXRoXywKKyAgICAgIEZpbGVQYXRoKCJ1bmlxdWUiKSwgInR4dCIpKTsKKyAgRVhQRUNUX0VRKHVuaXF1ZV9maWxlMV8uc3RyaW5nKCksIGZpbGVfcGF0aDIuc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UoZmlsZV9wYXRoMi5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7ICAvLyBmaWxlIG5vdCB0aGVyZQorICBDcmVhdGVUZXh0RmlsZShmaWxlX3BhdGgyLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShmaWxlX3BhdGgyLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKK30KKworVEVTVF9GKERpcmVjdG9yeUNyZWF0aW9uVGVzdCwgQ3JlYXRlRGlyZWN0b3JpZXNGYWlsKSB7CisgIC8vIGZvcmNlIGEgZmFpbHVyZSBieSBwdXR0aW5nIGEgZmlsZSB3aGVyZSB3ZSB3aWxsIHRyeSB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisgIENyZWF0ZVRleHRGaWxlKHRlc3RkYXRhX2ZpbGVfLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9maWxlXy5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9maWxlXy5EaXJlY3RvcnlFeGlzdHMoKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9maWxlXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOworfQorCitURVNUKE5vRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVOb0RpcmVjdG9yaWVzRm9yRGVmYXVsdFhtbEZpbGUpIHsKKyAgY29uc3QgRmlsZVBhdGggdGVzdF9kZXRhaWxfeG1sKCJ0ZXN0X2RldGFpbC54bWwiKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RfZGV0YWlsX3htbC5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgIEZpbGVQYXRoIGZwOworICBFWFBFQ1RfRVEoIiIsIGZwLnN0cmluZygpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIENoYXJBbmRDb3B5Q29uc3RydWN0b3JzKSB7CisgIGNvbnN0IEZpbGVQYXRoIGZwKCJzcGljeSIpOworICBFWFBFQ1RfRVEoInNwaWN5IiwgZnAuc3RyaW5nKCkpOworCisgIGNvbnN0IEZpbGVQYXRoIGZwX2NvcHkoZnApOworICBFWFBFQ1RfRVEoInNwaWN5IiwgZnBfY29weS5zdHJpbmcoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBTdHJpbmdDb25zdHJ1Y3RvcikgeworICBjb25zdCBGaWxlUGF0aCBmcChzdGQ6OnN0cmluZygiY2lkZXIiKSk7CisgIEVYUEVDVF9FUSgiY2lkZXIiLCBmcC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBTZXQpIHsKKyAgY29uc3QgRmlsZVBhdGggYXBwbGUoImFwcGxlIik7CisgIEZpbGVQYXRoIG1hYygibWFjIik7CisgIG1hYy5TZXQoYXBwbGUpOyAgLy8gSW1wbGVtZW50IFNldCgpIHNpbmNlIG92ZXJsb2FkaW5nIG9wZXJhdG9yPSBpcyBmb3JiaWRkZW4uCisgIEVYUEVDVF9FUSgiYXBwbGUiLCBtYWMuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImFwcGxlIiwgYXBwbGUuc3RyaW5nKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgVG9TdHJpbmcpIHsKKyAgY29uc3QgRmlsZVBhdGggZmlsZSgiZHJpbmsiKTsKKyAgRVhQRUNUX0VRKCJkcmluayIsIGZpbGUuc3RyaW5nKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgUmVtb3ZlRXh0ZW5zaW9uKSB7CisgIEVYUEVDVF9FUSgiYXBwIiwgRmlsZVBhdGgoImFwcC5jYyIpLlJlbW92ZUV4dGVuc2lvbigiY2MiKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiYXBwIiwgRmlsZVBhdGgoImFwcC5leGUiKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJBUFAiLCBGaWxlUGF0aCgiQVBQLkVYRSIpLlJlbW92ZUV4dGVuc2lvbigiZXhlIikuc3RyaW5nKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgUmVtb3ZlRXh0ZW5zaW9uV2hlblRoZXJlSXNOb0V4dGVuc2lvbikgeworICBFWFBFQ1RfRVEoImFwcCIsIEZpbGVQYXRoKCJhcHAiKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpLnN0cmluZygpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIElzRGlyZWN0b3J5KSB7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiY29sYSIpLklzRGlyZWN0b3J5KCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgia29hbGEiIEdURVNUX1BBVEhfU0VQXykuSXNEaXJlY3RvcnkoKSk7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImtvYWxhLyIpLklzRGlyZWN0b3J5KCkpOworI2VuZGlmCit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBJc0Fic29sdXRlUGF0aCkgeworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImlzIiBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikuSXNBYnNvbHV0ZVBhdGgoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiIikuSXNBYnNvbHV0ZVBhdGgoKSk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiYzpcXCIgR1RFU1RfUEFUSF9TRVBfICJpc19ub3QiCisgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJjOmZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImM6LyIgR1RFU1RfUEFUSF9TRVBfICJpc19ub3QiCisgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKS5Jc0Fic29sdXRlUGF0aCgpKTsKKyNlbHNlCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiaXNfbm90IiBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikKKyAgICAgICAgICAgICAgLklzQWJzb2x1dGVQYXRoKCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBJc1Jvb3REaXJlY3RvcnkpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJhOlxcIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiWjovIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiZTovLyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYjoiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYjphIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIjg6LyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJjfC8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisjZWxzZQorICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi8vIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIiIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJcXCIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIveCIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmY2Y1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjCkBAIC0wLDAgKzEsMTU0IEBACisvLyBDb3B5cmlnaHQgMjAwMywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogRGFuIEVnbm9yIChlZ25vckBnb29nbGUuY29tKQorLy8gUG9ydGVkIHRvIFdpbmRvd3M6IFZhZGltIEJlcm1hbiAodmFkaW1iQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCit1c2luZyB0ZXN0aW5nOjpNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmxpbmtlZF9wdHI7CisKK2ludCBudW07CitNZXNzYWdlKiBoaXN0b3J5ID0gTlVMTDsKKworLy8gQ2xhc3Mgd2hpY2ggdHJhY2tzIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCitjbGFzcyBBIHsKKyBwdWJsaWM6CisgIEEoKTogbXludW0obnVtKyspIHsgKmhpc3RvcnkgPDwgIkEiIDw8IG15bnVtIDw8ICIgY3RvclxuIjsgfQorICB2aXJ0dWFsIH5BKCkgeyAqaGlzdG9yeSA8PCAiQSIgPDwgbXludW0gPDwgIiBkdG9yXG4iOyB9CisgIHZpcnR1YWwgdm9pZCBVc2UoKSB7ICpoaXN0b3J5IDw8ICJBIiA8PCBteW51bSA8PCAiIHVzZVxuIjsgfQorIHByb3RlY3RlZDoKKyAgaW50IG15bnVtOworfTsKKworLy8gU3ViY2xhc3MKK2NsYXNzIEIgOiBwdWJsaWMgQSB7CisgcHVibGljOgorICBCKCkgeyAqaGlzdG9yeSA8PCAiQiIgPDwgbXludW0gPDwgIiBjdG9yXG4iOyB9CisgIH5CKCkgeyAqaGlzdG9yeSA8PCAiQiIgPDwgbXludW0gPDwgIiBkdG9yXG4iOyB9CisgIHZpcnR1YWwgdm9pZCBVc2UoKSB7ICpoaXN0b3J5IDw8ICJCIiA8PCBteW51bSA8PCAiIHVzZVxuIjsgfQorfTsKKworY2xhc3MgTGlua2VkUHRyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIExpbmtlZFB0clRlc3QoKSB7CisgICAgbnVtID0gMDsKKyAgICBoaXN0b3J5ID0gbmV3IE1lc3NhZ2U7CisgIH0KKworICB2aXJ0dWFsIH5MaW5rZWRQdHJUZXN0KCkgeworICAgIGRlbGV0ZSBoaXN0b3J5OworICAgIGhpc3RvcnkgPSBOVUxMOworICB9Cit9OworCitURVNUX0YoTGlua2VkUHRyVGVzdCwgR2VuZXJhbFRlc3QpIHsKKyAgeworICAgIGxpbmtlZF9wdHI8QT4gYTAsIGExLCBhMjsKKyAgICAvLyBVc2UgZXhwbGljaXQgZnVuY3Rpb24gY2FsbCBub3RhdGlvbiBoZXJlIHRvIHN1cHByZXNzIHNlbGYtYXNzaWduIHdhcm5pbmcuCisgICAgYTAub3BlcmF0b3I9KGEwKTsKKyAgICBhMSA9IGEyOworICAgIEFTU0VSVF9FUShhMC5nZXQoKSwgc3RhdGljX2Nhc3Q8QSo+KE5VTEwpKTsKKyAgICBBU1NFUlRfRVEoYTEuZ2V0KCksIHN0YXRpY19jYXN0PEEqPihOVUxMKSk7CisgICAgQVNTRVJUX0VRKGEyLmdldCgpLCBzdGF0aWNfY2FzdDxBKj4oTlVMTCkpOworICAgIEFTU0VSVF9UUlVFKGEwID09IE5VTEwpOworICAgIEFTU0VSVF9UUlVFKGExID09IE5VTEwpOworICAgIEFTU0VSVF9UUlVFKGEyID09IE5VTEwpOworCisgICAgeworICAgICAgbGlua2VkX3B0cjxBPiBhMyhuZXcgQSk7CisgICAgICBhMCA9IGEzOworICAgICAgQVNTRVJUX1RSVUUoYTAgPT0gYTMpOworICAgICAgQVNTRVJUX1RSVUUoYTAgIT0gTlVMTCk7CisgICAgICBBU1NFUlRfVFJVRShhMC5nZXQoKSA9PSBhMyk7CisgICAgICBBU1NFUlRfVFJVRShhMCA9PSBhMy5nZXQoKSk7CisgICAgICBsaW5rZWRfcHRyPEE+IGE0KGEwKTsKKyAgICAgIGExID0gYTQ7CisgICAgICBsaW5rZWRfcHRyPEE+IGE1KG5ldyBBKTsKKyAgICAgIEFTU0VSVF9UUlVFKGE1LmdldCgpICE9IGEzKTsKKyAgICAgIEFTU0VSVF9UUlVFKGE1ICE9IGEzLmdldCgpKTsKKyAgICAgIGEyID0gYTU7CisgICAgICBsaW5rZWRfcHRyPEI+IGIwKG5ldyBCKTsKKyAgICAgIGxpbmtlZF9wdHI8QT4gYTYoYjApOworICAgICAgQVNTRVJUX1RSVUUoYjAgPT0gYTYpOworICAgICAgQVNTRVJUX1RSVUUoYTYgPT0gYjApOworICAgICAgQVNTRVJUX1RSVUUoYjAgIT0gTlVMTCk7CisgICAgICBhNSA9IGIwOworICAgICAgYTUgPSBiMDsKKyAgICAgIGEzLT5Vc2UoKTsKKyAgICAgIGE0LT5Vc2UoKTsKKyAgICAgIGE1LT5Vc2UoKTsKKyAgICAgIGE2LT5Vc2UoKTsKKyAgICAgIGIwLT5Vc2UoKTsKKyAgICAgICgqYjApLlVzZSgpOworICAgICAgYjAuZ2V0KCktPlVzZSgpOworICAgIH0KKworICAgIGEwLT5Vc2UoKTsKKyAgICBhMS0+VXNlKCk7CisgICAgYTItPlVzZSgpOworCisgICAgYTEgPSBhMjsKKyAgICBhMi5yZXNldChuZXcgQSk7CisgICAgYTAucmVzZXQoKTsKKworICAgIGxpbmtlZF9wdHI8QT4gYTc7CisgIH0KKworICBBU1NFUlRfU1RSRVEoCisgICAgIkEwIGN0b3JcbiIKKyAgICAiQTEgY3RvclxuIgorICAgICJBMiBjdG9yXG4iCisgICAgIkIyIGN0b3JcbiIKKyAgICAiQTAgdXNlXG4iCisgICAgIkEwIHVzZVxuIgorICAgICJCMiB1c2VcbiIKKyAgICAiQjIgdXNlXG4iCisgICAgIkIyIHVzZVxuIgorICAgICJCMiB1c2VcbiIKKyAgICAiQjIgdXNlXG4iCisgICAgIkIyIGR0b3JcbiIKKyAgICAiQTIgZHRvclxuIgorICAgICJBMCB1c2VcbiIKKyAgICAiQTAgdXNlXG4iCisgICAgIkExIHVzZVxuIgorICAgICJBMyBjdG9yXG4iCisgICAgIkEwIGR0b3JcbiIKKyAgICAiQTMgZHRvclxuIgorICAgICJBMSBkdG9yXG4iLAorICAgIGhpc3RvcnktPkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCit9ICAvLyBVbm5hbWVkIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LWxpc3RlbmVyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtbGlzdGVuZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY2MmNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LWxpc3RlbmVyX3Rlc3QuY2MKQEAgLTAsMCArMSwzMTAgQEAKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGZpbGUgdmVyaWZpZXMgR29vZ2xlIFRlc3QgZXZlbnQgbGlzdGVuZXJzIHJlY2VpdmUgZXZlbnRzIGF0IHRoZQorLy8gcmlnaHQgdGltZXMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQ7Cit1c2luZyA6OnRlc3Rpbmc6OkVudmlyb25tZW50OwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdENhc2U7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0SW5mbzsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ7Cit1c2luZyA6OnRlc3Rpbmc6OlVuaXRUZXN0OworCisvLyBVc2VkIGJ5IHRlc3RzIHRvIHJlZ2lzdGVyIHRoZWlyIGV2ZW50cy4KK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZ19ldmVudHMgPSBOVUxMOworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBFdmVudFJlY29yZGluZ0xpc3RlbmVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEV2ZW50UmVjb3JkaW5nTGlzdGVuZXIoY29uc3QgY2hhciogbmFtZSkgOiBuYW1lXyhuYW1lKSB7fQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0UHJvZ3JhbVN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgeworICAgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlIDw8IEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RJdGVyYXRpb25TdGFydCIpCisgICAgICAgICAgICA8PCAiKCIgPDwgaXRlcmF0aW9uIDw8ICIpIjsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKG1lc3NhZ2UuR2V0U3RyaW5nKCkpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNTZXRVcEVuZCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RDYXNlU3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RTdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiAvKnRlc3RfcGFydF9yZXN1bHQqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdFBhcnRSZXN1bHQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0RW5kIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RDYXNlRW5kIikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgeworICAgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlIDw8IEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RJdGVyYXRpb25FbmQiKQorICAgICAgICAgICAgPDwgIigiICA8PCBpdGVyYXRpb24gPDwgIikiOworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2sobWVzc2FnZS5HZXRTdHJpbmcoKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdFByb2dyYW1FbmQiKSk7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEdldEZ1bGxNZXRob2ROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gbmFtZV8gKyAiLiIgKyBuYW1lOworICB9CisKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCitjbGFzcyBFbnZpcm9ubWVudEludm9jYXRpb25DYXRjaGVyIDogcHVibGljIEVudmlyb25tZW50IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJFbnZpcm9ubWVudDo6U2V0VXAiKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJFbnZpcm9ubWVudDo6VGVhckRvd24iKTsKKyAgfQorfTsKKworY2xhc3MgTGlzdGVuZXJUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OlNldFVwVGVzdENhc2UiKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjpUZWFyRG93blRlc3RDYXNlIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjpTZXRVcCIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkxpc3RlbmVyVGVzdDo6VGVhckRvd24iKTsKKyAgfQorfTsKKworVEVTVF9GKExpc3RlbmVyVGVzdCwgRG9lc0ZvbykgeworICAvLyBUZXN0IGV4ZWN1dGlvbiBvcmRlciB3aXRoaW4gYSB0ZXN0IGNhc2UgaXMgbm90IGd1YXJhbnRlZWQgc28gd2UgYXJlIG5vdAorICAvLyByZWNvcmRpbmcgdGhlIHRlc3QgbmFtZS4KKyAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIpOworICBTVUNDRUVEKCk7ICAvLyBUcmlnZ2VycyBPblRlc3RQYXJ0UmVzdWx0LgorfQorCitURVNUX0YoTGlzdGVuZXJUZXN0LCBEb2VzQmFyKSB7CisgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiKTsKKyAgU1VDQ0VFRCgpOyAgLy8gVHJpZ2dlcnMgT25UZXN0UGFydFJlc3VsdC4KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkVudmlyb25tZW50SW52b2NhdGlvbkNhdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpFdmVudFJlY29yZGluZ0xpc3RlbmVyOworCit2b2lkIFZlcmlmeVJlc3VsdHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkYXRhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBleHBlY3RlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9kYXRhX3NpemUpIHsKKyAgY29uc3QgaW50IGFjdHVhbF9zaXplID0gZGF0YS5zaXplKCk7CisgIC8vIElmIHRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIGZhaWxzLCBhIG5ldyBlbnRyeSB3aWxsIGJlIGFwcGVuZGVkIHRvCisgIC8vIGRhdGEuICBIZW5jZSB3ZSBzYXZlIGRhdGEuc2l6ZSgpIGZpcnN0LgorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZGF0YV9zaXplLCBhY3R1YWxfc2l6ZSk7CisKKyAgLy8gQ29tcGFyZXMgdGhlIGNvbW1vbiBwcmVmaXguCisgIGNvbnN0IGludCBzaG9ydGVyX3NpemUgPSBleHBlY3RlZF9kYXRhX3NpemUgPD0gYWN0dWFsX3NpemUgPworICAgICAgZXhwZWN0ZWRfZGF0YV9zaXplIDogYWN0dWFsX3NpemU7CisgIGludCBpID0gMDsKKyAgZm9yICg7IGkgPCBzaG9ydGVyX3NpemU7ICsraSkgeworICAgIEFTU0VSVF9TVFJFUShleHBlY3RlZF9kYXRhW2ldLCBkYXRhW2ldLmNfc3RyKCkpCisgICAgICAgIDw8ICJhdCBwb3NpdGlvbiAiIDw8IGk7CisgIH0KKworICAvLyBQcmludHMgZXh0cmEgZWxlbWVudHMgaW4gdGhlIGFjdHVhbCBkYXRhLgorICBmb3IgKDsgaSA8IGFjdHVhbF9zaXplOyArK2kpIHsKKyAgICBwcmludGYoIiAgQWN0dWFsIGV2ZW50ICMlZDogJXNcbiIsIGksIGRhdGFbaV0uY19zdHIoKSk7CisgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBldmVudHM7CisgIGdfZXZlbnRzID0gJmV2ZW50czsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5BcHBlbmQoCisgICAgICBuZXcgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lcigiMXN0IikpOworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkuQXBwZW5kKAorICAgICAgbmV3IEV2ZW50UmVjb3JkaW5nTGlzdGVuZXIoIjJuZCIpKTsKKworICBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEVudmlyb25tZW50SW52b2NhdGlvbkNhdGNoZXIpOworCisgIEdURVNUX0NIRUNLXyhldmVudHMuc2l6ZSgpID09IDApCisgICAgICA8PCAiQWRkR2xvYmFsVGVzdEVudmlyb25tZW50IHNob3VsZCBub3QgZ2VuZXJhdGUgYW55IGV2ZW50cyBpdHNlbGYuIjsKKworICA6OnRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KSA9IDI7CisgIGludCByZXRfdmFsID0gUlVOX0FMTF9URVNUUygpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGV4cGVjdGVkX2V2ZW50c1tdID0geworICAgICIxc3QuT25UZXN0UHJvZ3JhbVN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdFByb2dyYW1TdGFydCIsCisgICAgIjFzdC5PblRlc3RJdGVyYXRpb25TdGFydCgwKSIsCisgICAgIjJuZC5PblRlc3RJdGVyYXRpb25TdGFydCgwKSIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1NldFVwU3RhcnQiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IiwKKyAgICAiRW52aXJvbm1lbnQ6OlNldFVwIiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzU2V0VXBFbmQiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNTZXRVcEVuZCIsCisgICAgIjFzdC5PblRlc3RDYXNlU3RhcnQiLAorICAgICIybmQuT25UZXN0Q2FzZVN0YXJ0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcFRlc3RDYXNlIiwKKyAgICAiMXN0Lk9uVGVzdFN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdFN0YXJ0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcCIsCisgICAgIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiLAorICAgICIxc3QuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIjJuZC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIsCisgICAgIjJuZC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0RW5kIiwKKyAgICAiMXN0Lk9uVGVzdFN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdFN0YXJ0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcCIsCisgICAgIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiLAorICAgICIxc3QuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIjJuZC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIsCisgICAgIjJuZC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0RW5kIiwKKyAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93blRlc3RDYXNlIiwKKyAgICAiMm5kLk9uVGVzdENhc2VFbmQiLAorICAgICIxc3QuT25UZXN0Q2FzZUVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IiwKKyAgICAiRW52aXJvbm1lbnQ6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIsCisgICAgIjJuZC5PblRlc3RJdGVyYXRpb25FbmQoMCkiLAorICAgICIxc3QuT25UZXN0SXRlcmF0aW9uRW5kKDApIiwKKyAgICAiMXN0Lk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDEpIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDEpIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1NldFVwU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6U2V0VXAiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNTZXRVcEVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1NldFVwRW5kIiwKKyAgICAiMXN0Lk9uVGVzdENhc2VTdGFydCIsCisgICAgIjJuZC5PblRlc3RDYXNlU3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwVGVzdENhc2UiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duVGVzdENhc2UiLAorICAgICIybmQuT25UZXN0Q2FzZUVuZCIsCisgICAgIjFzdC5PblRlc3RDYXNlRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6VGVhckRvd24iLAorICAgICIybmQuT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvbkVuZCgxKSIsCisgICAgIjFzdC5PblRlc3RJdGVyYXRpb25FbmQoMSkiLAorICAgICIybmQuT25UZXN0UHJvZ3JhbUVuZCIsCisgICAgIjFzdC5PblRlc3RQcm9ncmFtRW5kIgorICB9OworICBWZXJpZnlSZXN1bHRzKGV2ZW50cywKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9ldmVudHMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGV4cGVjdGVkX2V2ZW50cykvc2l6ZW9mKGV4cGVjdGVkX2V2ZW50c1swXSkpOworCisgIC8vIFdlIG5lZWQgdG8gY2hlY2sgbWFudWFsbHkgZm9yIGFkIGhvYyB0ZXN0IGZhaWx1cmVzIHRoYXQgaGFwcGVuIGFmdGVyCisgIC8vIFJVTl9BTExfVEVTVFMgZmluaXNoZXMuCisgIGlmIChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+RmFpbGVkKCkpCisgICAgcmV0X3ZhbCA9IDE7CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzUyMzhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYwpAQCAtMCwwICsxLDE1OSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgdGhlIE1lc3NhZ2UgY2xhc3MuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCit1c2luZyA6OnRlc3Rpbmc6Ok1lc3NhZ2U7CisKKy8vIFRlc3RzIHRoZSB0ZXN0aW5nOjpNZXNzYWdlIGNsYXNzCisKKy8vIFRlc3RzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorVEVTVChNZXNzYWdlVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE1lc3NhZ2UgbXNnOworICBFWFBFQ1RfRVEoIiIsIG1zZy5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorVEVTVChNZXNzYWdlVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE1lc3NhZ2UgbXNnMSgiSGVsbG8iKTsKKyAgY29uc3QgTWVzc2FnZSBtc2cyKG1zZzEpOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgbXNnMi5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorVEVTVChNZXNzYWdlVGVzdCwgQ29uc3RydWN0c0Zyb21DU3RyaW5nKSB7CisgIE1lc3NhZ2UgbXNnKCJIZWxsbyIpOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgbXNnLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgZmxvYXQuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zRmxvYXQpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcyA9IChNZXNzYWdlKCkgPDwgMS4yMzQ1NkYgPDwgIiAiIDw8IDIuMzQ1NjdGKS5HZXRTdHJpbmcoKTsKKyAgLy8gQm90aCBudW1iZXJzIHNob3VsZCBiZSBwcmludGVkIHdpdGggZW5vdWdoIHByZWNpc2lvbi4KKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIjEuMjM0NTYwIiwgcy5jX3N0cigpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIiAyLjM0NTY2OSIsIHMuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIGRvdWJsZS4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNEb3VibGUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcyA9IChNZXNzYWdlKCkgPDwgMTI2MDU3MDg4MC40NTU1NDk3IDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDEyNjA1NzIyNjUuMTk1NDUzNCkuR2V0U3RyaW5nKCk7CisgIC8vIEJvdGggbnVtYmVycyBzaG91bGQgYmUgcHJpbnRlZCB3aXRoIGVub3VnaCBwcmVjaXNpb24uCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICIxMjYwNTcwODgwLjQ1Iiwgcy5jX3N0cigpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIiAxMjYwNTcyMjY1LjE5Iiwgcy5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgbm9uLWNoYXIgcG9pbnRlci4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNQb2ludGVyKSB7CisgIGludCBuID0gMDsKKyAgaW50KiBwID0gJm47CisgIEVYUEVDVF9ORSgiKG51bGwpIiwgKE1lc3NhZ2UoKSA8PCBwKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIE5VTEwgbm9uLWNoYXIgcG9pbnRlci4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNOdWxsUG9pbnRlcikgeworICBpbnQqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIihudWxsKSIsIChNZXNzYWdlKCkgPDwgcCkuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBDIHN0cmluZy4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNDU3RyaW5nKSB7CisgIEVYUEVDVF9FUSgiRm9vIiwgKE1lc3NhZ2UoKSA8PCAiRm9vIikuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBOVUxMIEMgc3RyaW5nLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc051bGxDU3RyaW5nKSB7CisgIGNoYXIqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIihudWxsKSIsIChNZXNzYWdlKCkgPDwgcCkuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgc3RkOjpzdHJpbmcuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zU3RyaW5nKSB7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyKCJIZWxsbyIpOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgKE1lc3NhZ2UoKSA8PCBzdHIpLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gb3V0cHV0IHN0cmluZ3MgY29udGFpbmluZyBlbWJlZGRlZCBOVUxzLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc1N0cmluZ1dpdGhFbWJlZGRlZE5VTCkgeworICBjb25zdCBjaGFyIGNoYXJfYXJyYXlfd2l0aF9udWxbXSA9CisgICAgICAiSGVyZSdzIGEgTlVMXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciOworICBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cmluZ193aXRoX251bChjaGFyX2FycmF5X3dpdGhfbnVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcl9hcnJheV93aXRoX251bCkgLSAxKTsKKyAgRVhQRUNUX0VRKCJIZXJlJ3MgYSBOVUxcXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciLAorICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCBzdHJpbmdfd2l0aF9udWwpLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgTlVMIGNoYXIuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zTlVMQ2hhcikgeworICBFWFBFQ1RfRVEoIlxcMCIsIChNZXNzYWdlKCkgPDwgJ1wwJykuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgaW50LgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0ludCkgeworICBFWFBFQ1RfRVEoIjEyMyIsIChNZXNzYWdlKCkgPDwgMTIzKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIChlbmRsLCBlbmRzLCBhbmQgZmx1c2gpIGNhbiBiZQorLy8gc3RyZWFtZWQgdG8gTWVzc2FnZS4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNCYXNpY0lvTWFuaXApIHsKKyAgRVhQRUNUX0VRKCJMaW5lIDEuXG5BIE5VTCBjaGFyIFxcMCBpbiBsaW5lIDIuIiwKKyAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgIkxpbmUgMS4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJBIE5VTCBjaGFyICIgPDwgc3RkOjplbmRzIDw8IHN0ZDo6Zmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGluIGxpbmUgMi4iKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIE1lc3NhZ2U6OkdldFN0cmluZygpCitURVNUKE1lc3NhZ2VUZXN0LCBHZXRTdHJpbmcpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAxIDw8ICIgbGFtYiI7CisgIEVYUEVDVF9FUSgiMSBsYW1iIiwgbXNnLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgTWVzc2FnZSBvYmplY3QgdG8gYW4gb3N0cmVhbS4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNUb09TdHJlYW0pIHsKKyAgTWVzc2FnZSBtc2coIkhlbGxvIik7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IG1zZzsKKyAgRVhQRUNUX0VRKCJIZWxsbyIsIHRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3MpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIE1lc3NhZ2Ugb2JqZWN0IGRvZXNuJ3QgdGFrZSB1cCB0b28gbXVjaCBzdGFjayBzcGFjZS4KK1RFU1QoTWVzc2FnZVRlc3QsIERvZXNOb3RUYWtlVXBNdWNoU3RhY2tTcGFjZSkgeworICBFWFBFQ1RfTEUoc2l6ZW9mKE1lc3NhZ2UpLCAxNlUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1vcHRpb25zX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Qtb3B0aW9uc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODZkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Qtb3B0aW9uc190ZXN0LmNjCkBAIC0wLDAgKzEsMjE1IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIEdvb2dsZSBUZXN0IFVuaXRUZXN0T3B0aW9ucyB0ZXN0cworLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgZnJvbSBndGVzdC5jYywgdG8gYXZvaWQgY2hhbmdpbmcgYnVpbGQgb3IKKy8vIG1ha2UtZmlsZXMgb24gV2luZG93cyBhbmQgb3RoZXIgcGxhdGZvcm1zLiBEbyBub3QgI2luY2x1ZGUgdGhpcyBmaWxlCisvLyBhbnl3aGVyZSBlbHNlIQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworLy8gVHVybnMgdGhlIGdpdmVuIHJlbGF0aXZlIHBhdGggaW50byBhbiBhYnNvbHV0ZSBwYXRoLgorRmlsZVBhdGggR2V0QWJzb2x1dGVQYXRoT2YoY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKKyAgcmV0dXJuIEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpLCByZWxhdGl2ZV9wYXRoKTsKK30KKworLy8gVGVzdGluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdC9HZXRPdXRwdXRGaWxlLgorCitURVNUKFhtbE91dHB1dFRlc3QsIEdldE91dHB1dEZvcm1hdERlZmF1bHQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgIEVYUEVDVF9TVFJFUSgiIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGb3JtYXQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpmaWxlbmFtZSI7CisgIEVYUEVDVF9TVFJFUSgieG1sIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlRGVmYXVsdCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgRVhQRUNUX0VRKEdldEFic29sdXRlUGF0aE9mKEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlU2luZ2xlRmlsZSkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZpbGVuYW1lLmFiYyI7CisgIEVYUEVDVF9FUShHZXRBYnNvbHV0ZVBhdGhPZihGaWxlUGF0aCgiZmlsZW5hbWUuYWJjIikpLnN0cmluZygpLAorICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSk7Cit9CisKK1RFU1QoWG1sT3V0cHV0VGVzdCwgR2V0T3V0cHV0RmlsZUZyb21EaXJlY3RvcnlQYXRoKSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6cGF0aCIgR1RFU1RfUEFUSF9TRVBfOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9CisgICAgICBHZXRBYnNvbHV0ZVBhdGhPZigKKyAgICAgICAgICBGaWxlUGF0aChzdGQ6OnN0cmluZygicGF0aCIpICsgR1RFU1RfUEFUSF9TRVBfICsKKyAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArICIueG1sIikpLnN0cmluZygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUgPQorICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZWxzZQorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2VuZGlmCit9CisKK1RFU1QoT3V0cHV0RmlsZUhlbHBlcnNUZXN0LCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhlX3N0ciA9IEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgY29uc3QgYm9vbCBzdWNjZXNzID0KKyAgICAgIF9zdHJjbXBpKCJndGVzdC1vcHRpb25zX3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDAgfHwKKyAgICAgIF9zdHJjbXBpKCJndGVzdC1vcHRpb25zLWV4X3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDAgfHwKKyAgICAgIF9zdHJjbXBpKCJndGVzdF9hbGxfdGVzdCIsIGV4ZV9zdHIuY19zdHIoKSkgPT0gMCB8fAorICAgICAgX3N0cmNtcGkoImd0ZXN0X2RsbF90ZXN0IiwgZXhlX3N0ci5jX3N0cigpKSA9PSAwOworI2Vsc2UKKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbW92ZSB0aGUgaGFyZC1jb2RlZCAibHQtIiBwcmVmaXggd2hlbgorICAvLyAgIENoYW5kbGVyIENhcnJ1dGgncyBsaWJ0b29sIHJlcGxhY2VtZW50IGlzIHJlYWR5LgorICBjb25zdCBib29sIHN1Y2Nlc3MgPQorICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3Qtb3B0aW9uc190ZXN0IiB8fAorICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3RfYWxsX3Rlc3QiIHx8CisgICAgICBleGVfc3RyID09ICJsdC1ndGVzdF9hbGxfdGVzdCIgfHwKKyAgICAgIGV4ZV9zdHIgPT0gImd0ZXN0X2RsbF90ZXN0IjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICBpZiAoIXN1Y2Nlc3MpCisgICAgRkFJTCgpIDw8ICJHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSByZXR1cm5zICIgPDwgZXhlX3N0cjsKK30KKworY2xhc3MgWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8gPSBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpOworICAgIHBvc2l4OjpDaERpcigiLi4iKTsKKyAgICAvLyBUaGlzIHdpbGwgbWFrZSB0aGUgdGVzdCBmYWlsIGlmIHJ1biBmcm9tIHRoZSByb290IGRpcmVjdG9yeS4KKyAgICBFWFBFQ1RfTkUob3JpZ2luYWxfd29ya2luZ19kaXJfLnN0cmluZygpLAorICAgICAgICAgICAgICBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpLnN0cmluZygpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwb3NpeDo6Q2hEaXIob3JpZ2luYWxfd29ya2luZ19kaXJfLnN0cmluZygpLmNfc3RyKCkpOworICB9CisKKyAgRmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOworfTsKKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aERlZmF1bHQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aERlZmF1bHRYTUwpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbCI7CisgIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aFJlbGF0aXZlRmlsZSkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZpbGVuYW1lLmFiYyI7CisgIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJmaWxlbmFtZS5hYmMiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aFJlbGF0aXZlUGF0aCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOnBhdGgiIEdURVNUX1BBVEhfU0VQXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfb3V0cHV0X2ZpbGUgPQorICAgICAgRmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXywKKyAgICAgICAgICBGaWxlUGF0aChzdGQ6OnN0cmluZygicGF0aCIpICsgR1RFU1RfUEFUSF9TRVBfICsKKyAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArICIueG1sIikpLnN0cmluZygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUgPQorICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZWxzZQorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2VuZGlmCit9CisKK1RFU1RfRihYbWxPdXRwdXRDaGFuZ2VEaXJUZXN0LCBQcmVzZXJ2ZU9yaWdpbmFsV29ya2luZ0RpcldpdGhBYnNvbHV0ZUZpbGUpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6YzpcXHRtcFxcZmlsZW5hbWUuYWJjIjsKKyAgRVhQRUNUX0VRKEZpbGVQYXRoKCJjOlxcdG1wXFxmaWxlbmFtZS5hYmMiKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkpOworI2Vsc2UKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0ieG1sOi90bXAvZmlsZW5hbWUuYWJjIjsKKyAgRVhQRUNUX0VRKEZpbGVQYXRoKCIvdG1wL2ZpbGVuYW1lLmFiYyIpLnN0cmluZygpLAorICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSk7CisjZW5kaWYKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aEFic29sdXRlUGF0aCkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICJjOlxcdG1wXFwiOworI2Vsc2UKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICIvdG1wLyI7CisjZW5kaWYKKworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOiIgKyBwYXRoOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9CisgICAgICBwYXRoICsgR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkuc3RyaW5nKCkgKyAiLnhtbCI7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZmlsZSA9CisgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkX291dHB1dF9maWxlLmNfc3RyKCksIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2Vsc2UKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX291dHB1dF9maWxlLCBvdXRwdXRfZmlsZS5jX3N0cigpKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3ODJmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjCkBAIC0wLDAgKzEsNjUgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZi4gIFRoaXMgdmVyaWZpZXMgdGhhdCB0aGUgYmFzaWMgY29uc3RydWN0cyBvZgorLy8gR29vZ2xlIFRlc3Qgd29yay4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjsKKworLy8gVGVzdHMgdGhhdCBnZW5lcmF0b3JzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdAorLy8gYXJlIGZ1bmN0aW9uYWwuIFRoZSB0ZXN0IHVzaW5nIGV4dGVybl9nZW4gaXMgZGVmaW5lZAorLy8gaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjLgorUGFyYW1HZW5lcmF0b3I8aW50PiBleHRlcm5fZ2VuID0gVmFsdWVzKDMzKTsKKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBkZWZpbmVkIGluIG9uZSB0cmFuc2xhdGlvbiB1bml0CisvLyBhbmQgaW5zdGFudGlhdGVkIGluIGFub3RoZXIuIFRoZSB0ZXN0IGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjCisvLyBhbmQgRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCBmaXh0dXJlIGNsYXNzIGlzIGRlZmluZWQgaW4KKy8vIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oLgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTXVsdGlwbGVzT2YzMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMzMsIDY2KSk7CisKKy8vIFRlc3RzIHRoYXQgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgaW5zdGFudGlhdGVkCisvLyBpbiBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cy4gQW5vdGhlciBpbnN0YW50aWF0aW9uIGlzIGRlZmluZWQKKy8vIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyBhbmQgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0CisvLyBmaXh0dXJlIGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYWlvblVuaXRzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg0MiozLCA0Mio0LCA0Mio1KSk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmY3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjCkBAIC0wLDAgKzEsODk3IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYuIFRoaXMgZmlsZSB2ZXJpZmllcyB0aGF0IHRoZSBwYXJhbWV0ZXIKKy8vIGdlbmVyYXRvcnMgb2JqZWN0cyBwcm9kdWNlIGNvcnJlY3QgcGFyYW1ldGVyIHNlcXVlbmNlcyBhbmQgdGhhdAorLy8gR29vZ2xlIFRlc3QgcnVudGltZSBpbnN0YW50aWF0ZXMgY29ycmVjdCB0ZXN0cyBmcm9tIHRob3NlIHNlcXVlbmNlcy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjIGluY2x1ZGUgPGFsZ29yaXRobT4KKyMgaW5jbHVkZSA8aW9zdHJlYW0+CisjIGluY2x1ZGUgPGxpc3Q+CisjIGluY2x1ZGUgPHNzdHJlYW0+CisjIGluY2x1ZGUgPHN0cmluZz4KKyMgaW5jbHVkZSA8dmVjdG9yPgorCisvLyBUbyBpbmNsdWRlIGd0ZXN0LWludGVybmFsLWlubC5oLgorIyBkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyMgaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIiAgLy8gZm9yIFVuaXRUZXN0T3B0aW9ucworIyB1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworIyBpbmNsdWRlICJ0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIgorCit1c2luZyA6OnN0ZDo6dmVjdG9yOwordXNpbmcgOjpzdGQ6OnNvcnQ7CisKK3VzaW5nIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50OwordXNpbmcgOjp0ZXN0aW5nOjpCb29sOwordXNpbmcgOjp0ZXN0aW5nOjpNZXNzYWdlOwordXNpbmcgOjp0ZXN0aW5nOjpSYW5nZTsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKK3VzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXNJbjsKKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQordXNpbmcgOjp0ZXN0aW5nOjpDb21iaW5lOwordXNpbmcgOjpzdGQ6OnRyMTo6Z2V0OwordXNpbmcgOjpzdGQ6OnRyMTo6bWFrZV90dXBsZTsKK3VzaW5nIDo6c3RkOjp0cjE6OnR1cGxlOworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKKwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml0VGVzdE9wdGlvbnM7CisKKy8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nLgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZW1vdmUgUHJpbnRWYWx1ZSgpIHdoZW4gd2UgbW92ZSBtYXRjaGVycyBhbmQKKy8vIEVYUEVDVF9USEFUKCkgZnJvbSBHb29nbGUgTW9jayB0byBHb29nbGUgVGVzdC4gIEF0IHRoYXQgdGltZSwgd2UKKy8vIGNhbiB3cml0ZSBFWFBFQ1RfVEhBVCh4LCBFcSh5KSkgdG8gY29tcGFyZSB0d28gdHVwbGVzIHggYW5kIHksIGFzCisvLyBFWFBFQ1RfVEhBVCgpIGFuZCB0aGUgbWF0Y2hlcnMga25vdyBob3cgdG8gcHJpbnQgdHVwbGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6c3RyaW5nIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgIHN0cmVhbSA8PCB2YWx1ZTsKKyAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKK30KKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorCisvLyBUaGVzZSBvdmVybG9hZHMgYWxsb3cgcHJpbnRpbmcgdHVwbGVzIGluIG91ciB0ZXN0cy4gIFdlIGNhbm5vdAorLy8gZGVmaW5lIGFuIG9wZXJhdG9yPDwgZm9yIHR1cGxlcywgYXMgdGhhdCBkZWZpbml0aW9uIG5lZWRzIHRvIGJlIGluCisvLyB0aGUgc3RkIG5hbWVzcGFjZSBpbiBvcmRlciB0byBiZSBwaWNrZWQgdXAgYnkgR29vZ2xlIFRlc3QgdmlhCisvLyBBcmd1bWVudC1EZXBlbmRlbnQgTG9va3VwLCB5ZXQgZGVmaW5pbmcgYW55dGhpbmcgaW4gdGhlIHN0ZAorLy8gbmFtZXNwYWNlIGluIG5vbi1TVEwgY29kZSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cis6OnN0ZDo6c3RyaW5nIFByaW50VmFsdWUoY29uc3QgdHVwbGU8VDEsIFQyPiYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgIHN0cmVhbSA8PCAiKCIgPDwgZ2V0PDA+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwxPih2YWx1ZSkgPDwgIikiOworICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKzo6c3RkOjpzdHJpbmcgUHJpbnRWYWx1ZShjb25zdCB0dXBsZTxUMSwgVDIsIFQzPiYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgIHN0cmVhbSA8PCAiKCIgPDwgZ2V0PDA+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwxPih2YWx1ZSkKKyAgICAgICAgIDw8ICIsICI8PCBnZXQ8Mj4odmFsdWUpIDw8ICIpIjsKKyAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorOjpzdGQ6OnN0cmluZyBQcmludFZhbHVlKAorICAgIGNvbnN0IHR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4mIHZhbHVlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBzdHJlYW0gPDwgIigiIDw8IGdldDwwPih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8MT4odmFsdWUpCisgICAgICAgICA8PCAiLCAiPDwgZ2V0PDI+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwzPih2YWx1ZSkKKyAgICAgICAgIDw8ICIsICI8PCBnZXQ8ND4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDU+KHZhbHVlKQorICAgICAgICAgPDwgIiwgIjw8IGdldDw2Pih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8Nz4odmFsdWUpCisgICAgICAgICA8PCAiLCAiPDwgZ2V0PDg+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDw5Pih2YWx1ZSkgPDwgIikiOworICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisvLyBWZXJpZmllcyB0aGF0IGEgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IgYW5kIGFjY2Vzc2VkCisvLyB2aWEgdGhlIGl0ZXJhdG9yIG9iamVjdCBtYXRjaGVzIHRoZSBleHBlY3RlZCBvbmUgdXNpbmcgR29vZ2xlIFRlc3QKKy8vIGFzc2VydGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Cit2b2lkIFZlcmlmeUdlbmVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvcjxUPiYgZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCAoJmV4cGVjdGVkX3ZhbHVlcylbTl0pIHsKKyAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VD46Oml0ZXJhdG9yIGl0ID0gZ2VuZXJhdG9yLmJlZ2luKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgQVNTRVJUX0ZBTFNFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKKyAgICAgICAgPDwgIkF0IGVsZW1lbnQgIiA8PCBpIDw8ICIgd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKKyAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3Rvci5cbiI7CisgICAgLy8gV2UgY2Fubm90IHVzZSBFWFBFQ1RfRVEoKSBoZXJlIGFzIHRoZSB2YWx1ZXMgbWF5IGJlIHR1cGxlcywKKyAgICAvLyB3aGljaCBkb24ndCBzdXBwb3J0IDw8LgorICAgIEVYUEVDVF9UUlVFKGV4cGVjdGVkX3ZhbHVlc1tpXSA9PSAqaXQpCisgICAgICAgIDw8ICJ3aGVyZSBpIGlzICIgPDwgaQorICAgICAgICA8PCAiLCBleHBlY3RlZF92YWx1ZXNbaV0gaXMgIiA8PCBQcmludFZhbHVlKGV4cGVjdGVkX3ZhbHVlc1tpXSkKKyAgICAgICAgPDwgIiwgKml0IGlzICIgPDwgUHJpbnRWYWx1ZSgqaXQpCisgICAgICAgIDw8ICIsIGFuZCAnaXQnIGlzIGFuIGl0ZXJhdG9yIGNyZWF0ZWQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3Rvci5cbiI7CisgICAgaXQrKzsKKyAgfQorICBFWFBFQ1RfVFJVRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpCisgICAgICAgIDw8ICJBdCB0aGUgcHJlc3VtZWQgZW5kIG9mIHNlcXVlbmNlIHdoZW4gYWNjZXNzaW5nIHZpYSBhbiBpdGVyYXRvciAiCisgICAgICAgIDw8ICJjcmVhdGVkIHdpdGggdGhlIGNvcHkgY29uc3RydWN0b3IuXG4iOworCisgIC8vIFRlc3QgdGhlIGl0ZXJhdG9yIGFzc2lnbm1lbnQuIFRoZSBmb2xsb3dpbmcgbGluZXMgdmVyaWZ5IHRoYXQKKyAgLy8gdGhlIHNlcXVlbmNlIGFjY2Vzc2VkIHZpYSBhbiBpdGVyYXRvciBpbml0aWFsaXplZCB2aWEgdGhlCisgIC8vIGFzc2lnbm1lbnQgb3BlcmF0b3IgKGFzIG9wcG9zZWQgdG8gYSBjb3B5IGNvbnN0cnVjdG9yKSBtYXRjaGVzCisgIC8vIGp1c3QgdGhlIHNhbWUuCisgIGl0ID0gZ2VuZXJhdG9yLmJlZ2luKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgQVNTRVJUX0ZBTFNFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKKyAgICAgICAgPDwgIkF0IGVsZW1lbnQgIiA8PCBpIDw8ICIgd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKKyAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudCBvcGVyYXRvci5cbiI7CisgICAgRVhQRUNUX1RSVUUoZXhwZWN0ZWRfdmFsdWVzW2ldID09ICppdCkKKyAgICAgICAgPDwgIndoZXJlIGkgaXMgIiA8PCBpCisgICAgICAgIDw8ICIsIGV4cGVjdGVkX3ZhbHVlc1tpXSBpcyAiIDw8IFByaW50VmFsdWUoZXhwZWN0ZWRfdmFsdWVzW2ldKQorICAgICAgICA8PCAiLCAqaXQgaXMgIiA8PCBQcmludFZhbHVlKCppdCkKKyAgICAgICAgPDwgIiwgYW5kICdpdCcgaXMgYW4gaXRlcmF0b3IgY3JlYXRlZCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yLlxuIjsKKyAgICBpdCsrOworICB9CisgIEVYUEVDVF9UUlVFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKKyAgICAgICAgPDwgIkF0IHRoZSBwcmVzdW1lZCBlbmQgb2Ygc2VxdWVuY2Ugd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKKyAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudCBvcGVyYXRvci5cbiI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ+JiBnZW5lcmF0b3IpIHsKKyAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VD46Oml0ZXJhdG9yIGl0ID0gZ2VuZXJhdG9yLmJlZ2luKCk7CisgIEVYUEVDVF9UUlVFKGl0ID09IGdlbmVyYXRvci5lbmQoKSk7CisKKyAgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKKyAgRVhQRUNUX1RSVUUoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKTsKK30KKworLy8gR2VuZXJhdG9yIHRlc3RzLiBUaGV5IHRlc3QgdGhhdCBlYWNoIG9mIHRoZSBwcm92aWRlZCBnZW5lcmF0b3IgZnVuY3Rpb25zCisvLyBnZW5lcmF0ZXMgYW4gZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgdmFsdWVzLiBUaGUgZ2VuZXJhbCB0ZXN0IHBhdHRlcm4KKy8vIGluc3RhbnRpYXRlcyBhIGdlbmVyYXRvciB1c2luZyBvbmUgb2YgdGhlIGdlbmVyYXRvciBmdW5jdGlvbnMsCisvLyBjaGVja3MgdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IgdXNpbmcgaXRzIGl0ZXJhdG9yIEFQSSwKKy8vIGFuZCB0aGVuIHJlc2V0cyB0aGUgaXRlcmF0b3IgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXF1ZW5jZQorLy8gYW5kIGNoZWNrcyB0aGUgc2VxdWVuY2UgYWdhaW4uCisKKy8vIFRlc3RzIHRoYXQgaXRlcmF0b3JzIHByb2R1Y2VkIGJ5IGdlbmVyYXRvciBmdW5jdGlvbnMgY29uZm9ybSB0byB0aGUKKy8vIEZvcndhcmRJdGVyYXRvciBjb25jZXB0LgorVEVTVChJdGVyYXRvclRlc3QsIFBhcmFtSXRlcmF0b3JDb25mb3Jtc1RvRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdCkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDEwKTsKKyAgUGFyYW1HZW5lcmF0b3I8aW50Pjo6aXRlcmF0b3IgaXQgPSBnZW4uYmVnaW4oKTsKKworICAvLyBWZXJpZmllcyB0aGF0IGl0ZXJhdG9yIGluaXRpYWxpemF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkLgorICBQYXJhbUdlbmVyYXRvcjxpbnQ+OjppdGVyYXRvciBpdDIgPSBpdDsKKyAgRVhQRUNUX1RSVUUoKml0ID09ICppdDIpIDw8ICJJbml0aWFsaXplZCBpdGVyYXRvcnMgbXVzdCBwb2ludCB0byB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImVsZW1lbnQgc2FtZSBhcyBpdHMgc291cmNlIHBvaW50cyB0byI7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBpdGVyYXRvciBhc3NpZ25tZW50IHdvcmtzIGFzIGV4cGVjdGVkLgorICBpdCsrOworICBFWFBFQ1RfRkFMU0UoKml0ID09ICppdDIpOworICBpdDIgPSBpdDsKKyAgRVhQRUNUX1RSVUUoKml0ID09ICppdDIpIDw8ICJBc3NpZ25lZCBpdGVyYXRvcnMgbXVzdCBwb2ludCB0byB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImVsZW1lbnQgc2FtZSBhcyBpdHMgc291cmNlIHBvaW50cyB0byI7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBwcmVmaXggb3BlcmF0b3IrKygpIHJldHVybnMgKnRoaXMuCisgIEVYUEVDVF9FUSgmaXQsICYoKytpdCkpIDw8ICJSZXN1bHQgb2YgdGhlIHByZWZpeCBvcGVyYXRvcisrIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVmZXIgdG8gdGhlIG9yaWdpbmFsIG9iamVjdCI7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgcmVzdWx0IG9mIHRoZSBwb3N0Zml4IG9wZXJhdG9yKysgcG9pbnRzIHRvIHRoZSB2YWx1ZQorICAvLyBwb2ludGVkIHRvIGJ5IHRoZSBvcmlnaW5hbCBpdGVyYXRvci4KKyAgaW50IG9yaWdpbmFsX3ZhbHVlID0gKml0OyAgLy8gSGF2ZSB0byBjb21wdXRlIGl0IG91dHNpZGUgb2YgbWFjcm8gY2FsbCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmFmZmVjdGVkIGJ5IHRoZSBwYXJhbWV0ZXIgZXZhbHVhdGlvbiBvcmRlci4KKyAgRVhQRUNUX0VRKG9yaWdpbmFsX3ZhbHVlLCAqKGl0KyspKTsKKworICAvLyBWZXJpZmllcyB0aGF0IHByZWZpeCBhbmQgcG9zdGZpeCBvcGVyYXRvcisrKCkgYWR2YW5jZSBhbiBpdGVyYXRvcgorICAvLyBhbGwgdGhlIHNhbWUuCisgIGl0MiA9IGl0OworICBpdCsrOworICArK2l0MjsKKyAgRVhQRUNUX1RSVUUoKml0ID09ICppdDIpOworfQorCisvLyBUZXN0cyB0aGF0IFJhbmdlKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVdpdGhEZWZhdWx0U3RlcCkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDMpOworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MCwgMSwgMn07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBSYW5nZSgpIGdlbmVyYXRlcyB0aGUgc2luZ2xlIGVsZW1lbnQgc2VxdWVuY2UKKy8vIGFzIGV4cGVjdGVkIHdoZW4gcHJvdmlkZWQgd2l0aCByYW5nZSBsaW1pdHMgdGhhdCBhcmUgZXF1YWwuCitURVNUKFJhbmdlVGVzdCwgSW50UmFuZ2VTaW5nbGVWYWx1ZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDEpOworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBSYW5nZSgpIHdpdGggZ2VuZXJhdGVzIGVtcHR5IHNlcXVlbmNlIHdoZW4KKy8vIHN1cHBsaWVkIHdpdGggYW4gZW1wdHkgcmFuZ2UuCitURVNUKFJhbmdlVGVzdCwgSW50UmFuZ2VFbXB0eSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDApOworICBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGdlbik7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmFuZ2UoKSB3aXRoIGN1c3RvbSBzdGVwIChncmVhdGVyIHRoZW4gb25lKSBnZW5lcmF0ZXMKKy8vIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVdpdGhDdXN0b21TdGVwKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgOSwgMyk7CisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHswLCAzLCA2fTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCBSYW5nZSgpIHdpdGggY3VzdG9tIHN0ZXAgKGdyZWF0ZXIgdGhlbiBvbmUpIGdlbmVyYXRlcworLy8gdGhlIGV4cGVjdGVkIHNlcXVlbmNlIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBkb2VzIG5vdCBmYWxsIG9uIHRoZQorLy8gdXBwZXIgcmFuZ2UgbGltaXQuIFNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkgUmFuZ2UoKSBtdXN0IG5vdCBoYXZlCisvLyBlbGVtZW50cyBiZXlvbmQgdGhlIHJhbmdlIGxpbWl0cy4KK1RFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVdpdGhDdXN0b21TdGVwT3ZlclVwcGVyQm91bmQpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCA0LCAzKTsKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezAsIDN9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBWZXJpZmllcyB0aGF0IFJhbmdlIHdvcmtzIHdpdGggdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgZGVmaW5lCisvLyBjb3B5IGNvbnN0cnVjdG9yLCBvcGVyYXRvcj0oKSwgb3BlcmF0b3IrKCksIGFuZCBvcGVyYXRvcjwoKS4KK2NsYXNzIERvZ0FkZGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERvZ0FkZGVyKGNvbnN0IGNoYXIqIGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9CisgIERvZ0FkZGVyKGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgOiB2YWx1ZV8ob3RoZXIudmFsdWVfLmNfc3RyKCkpIHt9CisKKyAgRG9nQWRkZXIgb3BlcmF0b3I9KGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgeworICAgIGlmICh0aGlzICE9ICZvdGhlcikKKyAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgRG9nQWRkZXIgb3BlcmF0b3IrKGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgY29uc3QgeworICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCB2YWx1ZV8uY19zdHIoKSA8PCBvdGhlci52YWx1ZV8uY19zdHIoKTsKKyAgICByZXR1cm4gRG9nQWRkZXIobXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gPCBvdGhlci52YWx1ZV87CisgIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyB2YWx1ZV87Cit9OworCitURVNUKFJhbmdlVGVzdCwgV29ya3NXaXRoQUN1c3RvbVR5cGUpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8RG9nQWRkZXI+IGdlbiA9CisgICAgICBSYW5nZShEb2dBZGRlcigiY2F0IiksIERvZ0FkZGVyKCJjYXRkb2dkb2ciKSwgRG9nQWRkZXIoImRvZyIpKTsKKyAgUGFyYW1HZW5lcmF0b3I8RG9nQWRkZXI+OjppdGVyYXRvciBpdCA9IGdlbi5iZWdpbigpOworCisgIEFTU0VSVF9GQUxTRShpdCA9PSBnZW4uZW5kKCkpOworICBFWFBFQ1RfU1RSRVEoImNhdCIsIGl0LT52YWx1ZSgpLmNfc3RyKCkpOworCisgIEFTU0VSVF9GQUxTRSgrK2l0ID09IGdlbi5lbmQoKSk7CisgIEVYUEVDVF9TVFJFUSgiY2F0ZG9nIiwgaXQtPnZhbHVlKCkuY19zdHIoKSk7CisKKyAgRVhQRUNUX1RSVUUoKytpdCA9PSBnZW4uZW5kKCkpOworfQorCitjbGFzcyBJbnRXcmFwcGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEludFdyYXBwZXIoaW50IGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9CisgIEludFdyYXBwZXIoY29uc3QgSW50V3JhcHBlciYgb3RoZXIpIDogdmFsdWVfKG90aGVyLnZhbHVlXykge30KKworICBJbnRXcmFwcGVyIG9wZXJhdG9yPShjb25zdCBJbnRXcmFwcGVyJiBvdGhlcikgeworICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgLy8gb3BlcmF0b3IrKCkgYWRkcyBhIGRpZmZlcmVudCB0eXBlLgorICBJbnRXcmFwcGVyIG9wZXJhdG9yKyhpbnQgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIEludFdyYXBwZXIodmFsdWVfICsgb3RoZXIpOyB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEludFdyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyA8IG90aGVyLnZhbHVlXzsKKyAgfQorICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworIHByaXZhdGU6CisgIGludCB2YWx1ZV87Cit9OworCitURVNUKFJhbmdlVGVzdCwgV29ya3NXaXRoQUN1c3RvbVR5cGVXaXRoRGlmZmVyZW50SW5jcmVtZW50VHlwZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxJbnRXcmFwcGVyPiBnZW4gPSBSYW5nZShJbnRXcmFwcGVyKDApLCBJbnRXcmFwcGVyKDIpKTsKKyAgUGFyYW1HZW5lcmF0b3I8SW50V3JhcHBlcj46Oml0ZXJhdG9yIGl0ID0gZ2VuLmJlZ2luKCk7CisKKyAgQVNTRVJUX0ZBTFNFKGl0ID09IGdlbi5lbmQoKSk7CisgIEVYUEVDVF9FUSgwLCBpdC0+dmFsdWUoKSk7CisKKyAgQVNTRVJUX0ZBTFNFKCsraXQgPT0gZ2VuLmVuZCgpKTsKKyAgRVhQRUNUX0VRKDEsIGl0LT52YWx1ZSgpKTsKKworICBFWFBFQ1RfVFJVRSgrK2l0ID09IGdlbi5lbmQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSB3aXRoIGFuIGFycmF5IHBhcmFtZXRlciBnZW5lcmF0ZXMKKy8vIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJbkFycmF5KSB7CisgIGludCBhcnJheVtdID0gezMsIDUsIDh9OworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKGFycmF5KTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgYXJyYXkpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlc0luKCkgd2l0aCBhIGNvbnN0IGFycmF5IHBhcmFtZXRlciBnZW5lcmF0ZXMKKy8vIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJbkNvbnN0QXJyYXkpIHsKKyAgY29uc3QgaW50IGFycmF5W10gPSB7MywgNSwgOH07CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4oYXJyYXkpOworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBhcnJheSk7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHdpdGggYW4gYXJyYXkgcGFyYW1ldGVyIGNvbnRhaW5pbmcgYQorLy8gc2luZ2xlIGVsZW1lbnQgZ2VuZXJhdGVzIHRoZSBzaW5nbGUgZWxlbWVudCBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJblNpbmdsZUVsZW1lbnRBcnJheSkgeworICBpbnQgYXJyYXlbXSA9IHs0Mn07CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4oYXJyYXkpOworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBhcnJheSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlIGZvciBhbiBTVEwKKy8vIGNvbnRhaW5lciAodmVjdG9yKS4KK1RFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJblZlY3RvcikgeworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8aW50PiBDb250YWluZXJUeXBlOworICBDb250YWluZXJUeXBlIHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjaygzKTsKKyAgdmFsdWVzLnB1c2hfYmFjayg1KTsKKyAgdmFsdWVzLnB1c2hfYmFjayg4KTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbih2YWx1ZXMpOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA1LCA4fTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5JdGVyYXRvclJhbmdlKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxpbnQ+IENvbnRhaW5lclR5cGU7CisgIENvbnRhaW5lclR5cGUgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKDMpOworICB2YWx1ZXMucHVzaF9iYWNrKDUpOworICB2YWx1ZXMucHVzaF9iYWNrKDgpOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA1LCA4fTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFZhbHVlc0luKCkgcHJvdmlkZWQgd2l0aCBhbiBpdGVyYXRvciByYW5nZSBzcGVjaWZ5aW5nIGEKKy8vIHNpbmdsZSB2YWx1ZSBnZW5lcmF0ZXMgYSBzaW5nbGUtZWxlbWVudCBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJblNpbmdsZUVsZW1lbnRJdGVyYXRvclJhbmdlKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxpbnQ+IENvbnRhaW5lclR5cGU7CisgIENvbnRhaW5lclR5cGUgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKDQyKTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7NDJ9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSBwcm92aWRlZCB3aXRoIGFuIGVtcHR5IGl0ZXJhdG9yIHJhbmdlCisvLyBnZW5lcmF0ZXMgYW4gZW1wdHkgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5FbXB0eUl0ZXJhdG9yUmFuZ2UpIHsKKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGludD4gQ29udGFpbmVyVHlwZTsKKyAgQ29udGFpbmVyVHlwZSB2YWx1ZXM7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4odmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisKKyAgVmVyaWZ5R2VuZXJhdG9ySXNFbXB0eShnZW4pOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBWYWx1ZXMoKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChWYWx1ZXNUZXN0LCBWYWx1ZXNXb3JrcykgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcygzLCA1LCA4KTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MywgNSwgOH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVmFsdWVzKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZXMgZnJvbSBlbGVtZW50cyBvZgorLy8gZGlmZmVyZW50IHR5cGVzIGNvbnZlcnRpYmxlIHRvIFBhcmFtR2VuZXJhdG9yJ3MgcGFyYW1ldGVyIHR5cGUuCitURVNUKFZhbHVlc1Rlc3QsIFZhbHVlc1dvcmtzRm9yVmFsdWVzT2ZDb21wYXRpYmxlVHlwZXMpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8ZG91YmxlPiBnZW4gPSBWYWx1ZXMoMywgNS4wZiwgOC4wKTsKKworICBjb25zdCBkb3VibGUgZXhwZWN0ZWRfdmFsdWVzW10gPSB7My4wLCA1LjAsIDguMH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKK1RFU1QoVmFsdWVzVGVzdCwgVmFsdWVzV29ya3NGb3JNYXhMZW5ndGhMaXN0KSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzKAorICAgICAgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwLAorICAgICAgMTEwLCAxMjAsIDEzMCwgMTQwLCAxNTAsIDE2MCwgMTcwLCAxODAsIDE5MCwgMjAwLAorICAgICAgMjEwLCAyMjAsIDIzMCwgMjQwLCAyNTAsIDI2MCwgMjcwLCAyODAsIDI5MCwgMzAwLAorICAgICAgMzEwLCAzMjAsIDMzMCwgMzQwLCAzNTAsIDM2MCwgMzcwLCAzODAsIDM5MCwgNDAwLAorICAgICAgNDEwLCA0MjAsIDQzMCwgNDQwLCA0NTAsIDQ2MCwgNDcwLCA0ODAsIDQ5MCwgNTAwKTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7CisgICAgICAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsIDkwLCAxMDAsCisgICAgICAxMTAsIDEyMCwgMTMwLCAxNDAsIDE1MCwgMTYwLCAxNzAsIDE4MCwgMTkwLCAyMDAsCisgICAgICAyMTAsIDIyMCwgMjMwLCAyNDAsIDI1MCwgMjYwLCAyNzAsIDI4MCwgMjkwLCAzMDAsCisgICAgICAzMTAsIDMyMCwgMzMwLCAzNDAsIDM1MCwgMzYwLCAzNzAsIDM4MCwgMzkwLCA0MDAsCisgICAgICA0MTAsIDQyMCwgNDMwLCA0NDAsIDQ1MCwgNDYwLCA0NzAsIDQ4MCwgNDkwLCA1MDB9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBFZGdlIGNhc2UgdGVzdC4gVGVzdHMgdGhhdCBzaW5nbGUtcGFyYW1ldGVyIFZhbHVlcygpIGdlbmVyYXRlcyB0aGUgc2VxdWVuY2UKKy8vIHdpdGggdGhlIHNpbmdsZSB2YWx1ZS4KK1RFU1QoVmFsdWVzVGVzdCwgVmFsdWVzV2l0aFNpbmdsZVBhcmFtZXRlcikgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcyg0Mik7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezQyfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCBCb29sKCkgZ2VuZXJhdGVzIHNlcXVlbmNlIChmYWxzZSwgdHJ1ZSkuCitURVNUKEJvb2xUZXN0LCBCb29sV29ya3MpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8Ym9vbD4gZ2VuID0gQm9vbCgpOworCisgIGNvbnN0IGJvb2wgZXhwZWN0ZWRfdmFsdWVzW10gPSB7ZmFsc2UsIHRydWV9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFRlc3RzIHRoYXQgQ29tYmluZSgpIHdpdGggdHdvIHBhcmFtZXRlcnMgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoVHdvUGFyYW1ldGVycykgeworICBjb25zdCBjaGFyKiBmb28gPSAiZm9vIjsKKyAgY29uc3QgY2hhciogYmFyID0gImJhciI7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGNvbnN0IGNoYXIqLCBpbnQ+ID4gZ2VuID0KKyAgICAgIENvbWJpbmUoVmFsdWVzKGZvbywgYmFyKSwgVmFsdWVzKDMsIDQpKTsKKworICB0dXBsZTxjb25zdCBjaGFyKiwgaW50PiBleHBlY3RlZF92YWx1ZXNbXSA9IHsKKyAgICBtYWtlX3R1cGxlKGZvbywgMyksIG1ha2VfdHVwbGUoZm9vLCA0KSwKKyAgICBtYWtlX3R1cGxlKGJhciwgMyksIG1ha2VfdHVwbGUoYmFyLCA0KX07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQ29tYmluZSgpIHdpdGggdGhyZWUgcGFyYW1ldGVycyBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhUaHJlZVBhcmFtZXRlcnMpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcygwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygzLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg1LCA2KSk7CisgIHR1cGxlPGludCwgaW50LCBpbnQ+IGV4cGVjdGVkX3ZhbHVlc1tdID0geworICAgIG1ha2VfdHVwbGUoMCwgMywgNSksIG1ha2VfdHVwbGUoMCwgMywgNiksCisgICAgbWFrZV90dXBsZSgwLCA0LCA1KSwgbWFrZV90dXBsZSgwLCA0LCA2KSwKKyAgICBtYWtlX3R1cGxlKDEsIDMsIDUpLCBtYWtlX3R1cGxlKDEsIDMsIDYpLAorICAgIG1ha2VfdHVwbGUoMSwgNCwgNSksIG1ha2VfdHVwbGUoMSwgNCwgNil9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBDb21iaW5lKCkgd2l0aCB0aGUgZmlyc3QgcGFyYW1ldGVyIGdlbmVyYXRpbmcgYSBzaW5nbGUgdmFsdWUKKy8vIHNlcXVlbmNlIGdlbmVyYXRlcyBhIHNlcXVlbmNlIHdpdGggdGhlIG51bWJlciBvZiBlbGVtZW50cyBlcXVhbCB0byB0aGUKKy8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLgorVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhGaXJzdFBhcmFtZXRlclNpbmdsZVZhbHVlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoVmFsdWVzKDQyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMCwgMSkpOworCisgIHR1cGxlPGludCwgaW50PiBleHBlY3RlZF92YWx1ZXNbXSA9IHttYWtlX3R1cGxlKDQyLCAwKSwgbWFrZV90dXBsZSg0MiwgMSl9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBDb21iaW5lKCkgd2l0aCB0aGUgc2Vjb25kIHBhcmFtZXRlciBnZW5lcmF0aW5nIGEgc2luZ2xlIHZhbHVlCisvLyBzZXF1ZW5jZSBnZW5lcmF0ZXMgYSBzZXF1ZW5jZSB3aXRoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXF1YWwgdG8gdGhlCisvLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgZmlyc3QgcGFyYW1ldGVyLgorVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhTZWNvbmRQYXJhbWV0ZXJTaW5nbGVWYWx1ZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcygwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNDIpKTsKKworICB0dXBsZTxpbnQsIGludD4gZXhwZWN0ZWRfdmFsdWVzW10gPSB7bWFrZV90dXBsZSgwLCA0MiksIG1ha2VfdHVwbGUoMSwgNDIpfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIHRoZSBmaXJzdCBwYXJhbWV0ZXIgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsCisvLyBDb21iaW5lKCkgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsIHRvby4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoRmlyc3RQYXJhbWV0ZXJFbXB0eVJhbmdlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoUmFuZ2UoMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDAsIDEpKTsKKyAgVmVyaWZ5R2VuZXJhdG9ySXNFbXB0eShnZW4pOworfQorCisvLyBUZXN0cyB0aGF0IHdoZW4gdGhlIHNlY29uZCBwYXJhbWV0ZXIgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsCisvLyBDb21iaW5lKCkgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsIHRvby4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoU2Vjb25kUGFyYW1ldGVyRW1wdHlSYW5nZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcygwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSgxLCAxKSk7CisgIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IGNvbWJpbmUgd29ya3Mgd2l0aCB0aGUgbWF4aW11bSBudW1iZXIKKy8vIG9mIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5IEdvb2dsZSBUZXN0IChjdXJyZW50bHkgMTApLgorVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhNYXhOdW1iZXJPZlBhcmFtZXRlcnMpIHsKKyAgY29uc3QgY2hhciogZm9vID0gImZvbyI7CisgIGNvbnN0IGNoYXIqIGJhciA9ICJiYXIiOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxjb25zdCBjaGFyKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcyhmb28sIGJhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDEpLCBWYWx1ZXMoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDMpLCBWYWx1ZXMoNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDUpLCBWYWx1ZXMoNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDcpLCBWYWx1ZXMoOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDkpKTsKKworICB0dXBsZTxjb25zdCBjaGFyKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludD4KKyAgICAgIGV4cGVjdGVkX3ZhbHVlc1tdID0ge21ha2VfdHVwbGUoZm9vLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoYmFyLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KX07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFRlc3RzIHRoYXQgYW4gZ2VuZXJhdG9yIHByb2R1Y2VzIGNvcnJlY3Qgc2VxdWVuY2UgYWZ0ZXIgYmVpbmcKKy8vIGFzc2lnbmVkIGZyb20gYW5vdGhlciBnZW5lcmF0b3IuCitURVNUKFBhcmFtR2VuZXJhdG9yVGVzdCwgQXNzaWdubWVudFdvcmtzKSB7CisgIFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzKDEsIDIpOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbjIgPSBWYWx1ZXMoMywgNCk7CisgIGdlbiA9IGdlbjI7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezMsIDR9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgdGVzdHMgYXJlIGV4cGFuZGVkIGFuZCBydW4gYXMgc3BlY2lmaWVkOgorLy8gb25lIHRlc3QgcGVyIGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvcgorLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QLiBJdCBhbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHRlc3QncworLy8gZml4dHVyZSBjb25zdHJ1Y3RvciwgU2V0VXAoKSwgYW5kIFRlYXJEb3duKCkgaGF2ZSBydW4gYW5kIGhhdmUgYmVlbgorLy8gc3VwcGxpZWQgd2l0aCB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzLgorCisvLyBUaGUgdXNlIG9mIGVudmlyb25tZW50IG9iamVjdCBhbGxvd3MgZGV0ZWN0aW9uIG9mIHRoZSBjYXNlIHdoZXJlIG5vIHRlc3QKKy8vIGNhc2UgZnVuY3Rpb25hbGl0eSBpcyBydW4gYXQgYWxsLiBJbiB0aGlzIGNhc2UgVGVzdENhc2VUZWFyRG93biB3aWxsIG5vdAorLy8gYmUgYWJsZSB0byBkZXRlY3QgbWlzc2luZyB0ZXN0cywgbmF0dXJhbGx5LgordGVtcGxhdGUgPGludCBrRXhwZWN0ZWRDYWxscz4KK2NsYXNzIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICBzdGF0aWMgVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudCogSW5zdGFuY2UoKSB7CisgICAgc3RhdGljIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQqIGluc3RhbmNlID0gbmV3IFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQ7CisgICAgcmV0dXJuIGluc3RhbmNlOworICB9CisKKyAgdm9pZCBGaXh0dXJlQ29uc3RydWN0b3JFeGVjdXRlZCgpIHsgZml4dHVyZV9jb25zdHJ1Y3Rvcl9jb3VudF8rKzsgfQorICB2b2lkIFNldFVwRXhlY3V0ZWQoKSB7IHNldF91cF9jb3VudF8rKzsgfQorICB2b2lkIFRlYXJEb3duRXhlY3V0ZWQoKSB7IHRlYXJfZG93bl9jb3VudF8rKzsgfQorICB2b2lkIFRlc3RCb2R5RXhlY3V0ZWQoKSB7IHRlc3RfYm9keV9jb3VudF8rKzsgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBJZiBhbGwgTXVsdGlwbGVUZXN0R2VuZXJhdGlvblRlc3QgdGVzdHMgaGF2ZSBiZWVuIGRlLXNlbGVjdGVkCisgICAgLy8gYnkgdGhlIGZpbHRlciBmbGFnLCB0aGUgZm9sbG93aW5nIGNoZWNrcyBtYWtlIG5vIHNlbnNlLgorICAgIGJvb2wgcGVyZm9ybV9jaGVjayA9IGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRXhwZWN0ZWRDYWxsczsgKytpKSB7CisgICAgICBNZXNzYWdlIG1zZzsKKyAgICAgIG1zZyA8PCAiVGVzdHNFeHBhbmRlZEFuZFJ1bi8iIDw8IGk7CisgICAgICBpZiAoVW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdCgKKyAgICAgICAgICAgICAiVGVzdEV4cGFuc2lvbk1vZHVsZS9NdWx0aXBsZVRlc3RHZW5lcmF0aW9uVGVzdCIsCisgICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKSkgeworICAgICAgICBwZXJmb3JtX2NoZWNrID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBlcmZvcm1fY2hlY2spIHsKKyAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRDYWxscywgZml4dHVyZV9jb25zdHJ1Y3Rvcl9jb3VudF8pCisgICAgICAgICAgPDwgIkZpeHR1cmUgY29uc3RydWN0b3Igb2YgUGFyYW1UZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCAiaGFzIG5vdCBiZWVuIHJ1biBhcyBleHBlY3RlZC4iOworICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZENhbGxzLCBzZXRfdXBfY291bnRfKQorICAgICAgICAgIDw8ICJGaXh0dXJlIFNldFVwIG1ldGhvZCBvZiBQYXJhbVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8ICJoYXMgbm90IGJlZW4gcnVuIGFzIGV4cGVjdGVkLiI7CisgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkQ2FsbHMsIHRlYXJfZG93bl9jb3VudF8pCisgICAgICAgICAgPDwgIkZpeHR1cmUgVGVhckRvd24gbWV0aG9kIG9mIFBhcmFtVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSAiCisgICAgICAgICAgPDwgImhhcyBub3QgYmVlbiBydW4gYXMgZXhwZWN0ZWQuIjsKKyAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRDYWxscywgdGVzdF9ib2R5X2NvdW50XykKKyAgICAgICAgICA8PCAiVGVzdCBpbiBQYXJhbVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8ICJoYXMgbm90IGJlZW4gcnVuIGFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50KCkgOiBmaXh0dXJlX2NvbnN0cnVjdG9yX2NvdW50XygwKSwgc2V0X3VwX2NvdW50XygwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhcl9kb3duX2NvdW50XygwKSwgdGVzdF9ib2R5X2NvdW50XygwKSB7fQorCisgIGludCBmaXh0dXJlX2NvbnN0cnVjdG9yX2NvdW50XzsKKyAgaW50IHNldF91cF9jb3VudF87CisgIGludCB0ZWFyX2Rvd25fY291bnRfOworICBpbnQgdGVzdF9ib2R5X2NvdW50XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQpOworfTsKKworY29uc3QgaW50IHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXNbXSA9IHszNiwgNDIsIDcyfTsKKworY2xhc3MgVGVzdEdlbmVyYXRpb25UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7CisgcHVibGljOgorICBlbnVtIHsKKyAgICBQQVJBTUVURVJfQ09VTlQgPQorICAgICAgICBzaXplb2YodGVzdF9nZW5lcmF0aW9uX3BhcmFtcykvc2l6ZW9mKHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXNbMF0pCisgIH07CisKKyAgdHlwZWRlZiBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50PFBBUkFNRVRFUl9DT1VOVD4gRW52aXJvbm1lbnQ7CisKKyAgVGVzdEdlbmVyYXRpb25UZXN0KCkgeworICAgIEVudmlyb25tZW50OjpJbnN0YW5jZSgpLT5GaXh0dXJlQ29uc3RydWN0b3JFeGVjdXRlZCgpOworICAgIGN1cnJlbnRfcGFyYW1ldGVyXyA9IEdldFBhcmFtKCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEVudmlyb25tZW50OjpJbnN0YW5jZSgpLT5TZXRVcEV4ZWN1dGVkKCk7CisgICAgRVhQRUNUX0VRKGN1cnJlbnRfcGFyYW1ldGVyXywgR2V0UGFyYW0oKSk7CisgIH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEVudmlyb25tZW50OjpJbnN0YW5jZSgpLT5UZWFyRG93bkV4ZWN1dGVkKCk7CisgICAgRVhQRUNUX0VRKGN1cnJlbnRfcGFyYW1ldGVyXywgR2V0UGFyYW0oKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIGJvb2wgYWxsX3Rlc3RzX2luX3Rlc3RfY2FzZV9zZWxlY3RlZCA9IHRydWU7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBBUkFNRVRFUl9DT1VOVDsgKytpKSB7CisgICAgICBNZXNzYWdlIHRlc3RfbmFtZTsKKyAgICAgIHRlc3RfbmFtZSA8PCAiVGVzdHNFeHBhbmRlZEFuZFJ1bi8iIDw8IGk7CisgICAgICBpZiAoICFVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KAorICAgICAgICAgICAgICAgICJUZXN0RXhwYW5zaW9uTW9kdWxlL011bHRpcGxlVGVzdEdlbmVyYXRpb25UZXN0IiwKKyAgICAgICAgICAgICAgICB0ZXN0X25hbWUuR2V0U3RyaW5nKCkpKSB7CisgICAgICAgIGFsbF90ZXN0c19pbl90ZXN0X2Nhc2Vfc2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgRVhQRUNUX1RSVUUoYWxsX3Rlc3RzX2luX3Rlc3RfY2FzZV9zZWxlY3RlZCkKKyAgICAgICAgPDwgIldoZW4gcnVubmluZyB0aGUgVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSBhbGwgb2YgaXRzIHRlc3RzXG4iCisgICAgICAgIDw8ICJtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBmaWx0ZXIgZmxhZyBmb3IgdGhlIHRlc3QgY2FzZSB0byBwYXNzLlxuIgorICAgICAgICA8PCAiSWYgbm90IGFsbCBvZiB0aGVtIGFyZSBlbmFibGVkLCB3ZSBjYW4ndCByZWxpYWJseSBjb25jbHVkZVxuIgorICAgICAgICA8PCAidGhhdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGVzdHMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4iOworCisgICAgY29sbGVjdGVkX3BhcmFtZXRlcnNfLmNsZWFyKCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHZlY3RvcjxpbnQ+IGV4cGVjdGVkX3ZhbHVlcyh0ZXN0X2dlbmVyYXRpb25fcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2dlbmVyYXRpb25fcGFyYW1zICsgUEFSQU1FVEVSX0NPVU5UKTsKKyAgICAvLyBUZXN0IGV4ZWN1dGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBieSBHb29nbGUgVGVzdCwKKyAgICAvLyBzbyB0aGUgb3JkZXIgb2YgdmFsdWVzIGluIGNvbGxlY3RlZF9wYXJhbWV0ZXJzXyBjYW4gYmUKKyAgICAvLyBkaWZmZXJlbnQgYW5kIHdlIGhhdmUgdG8gc29ydCB0byBjb21wYXJlLgorICAgIHNvcnQoZXhwZWN0ZWRfdmFsdWVzLmJlZ2luKCksIGV4cGVjdGVkX3ZhbHVlcy5lbmQoKSk7CisgICAgc29ydChjb2xsZWN0ZWRfcGFyYW1ldGVyc18uYmVnaW4oKSwgY29sbGVjdGVkX3BhcmFtZXRlcnNfLmVuZCgpKTsKKworICAgIEVYUEVDVF9UUlVFKGNvbGxlY3RlZF9wYXJhbWV0ZXJzXyA9PSBleHBlY3RlZF92YWx1ZXMpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGludCBjdXJyZW50X3BhcmFtZXRlcl87CisgIHN0YXRpYyB2ZWN0b3I8aW50PiBjb2xsZWN0ZWRfcGFyYW1ldGVyc187CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RHZW5lcmF0aW9uVGVzdCk7Cit9OwordmVjdG9yPGludD4gVGVzdEdlbmVyYXRpb25UZXN0Ojpjb2xsZWN0ZWRfcGFyYW1ldGVyc187CisKK1RFU1RfUChUZXN0R2VuZXJhdGlvblRlc3QsIFRlc3RzRXhwYW5kZWRBbmRSdW4pIHsKKyAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPlRlc3RCb2R5RXhlY3V0ZWQoKTsKKyAgRVhQRUNUX0VRKGN1cnJlbnRfcGFyYW1ldGVyXywgR2V0UGFyYW0oKSk7CisgIGNvbGxlY3RlZF9wYXJhbWV0ZXJzXy5wdXNoX2JhY2soR2V0UGFyYW0oKSk7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChUZXN0RXhwYW5zaW9uTW9kdWxlLCBUZXN0R2VuZXJhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbih0ZXN0X2dlbmVyYXRpb25fcGFyYW1zKSk7CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBlbGVtZW50IHNlcXVlbmNlICh0aGlyZCBwYXJhbWV0ZXIgb2YKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKSBpcyBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSBhbmQgbmVpdGhlciBhdAorLy8gdGhlIGNhbGwgc2l0ZSBvZiBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBub3IgaW4gUlVOX0FMTF9URVNUUygpLiAgRm9yCisvLyB0aGF0LCB3ZSBkZWNsYXJlIHBhcmFtX3ZhbHVlXyB0byBiZSBhIHN0YXRpYyBtZW1iZXIgb2YKKy8vIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0IGFuZCBpbml0aWFsaXplIGl0IHRvIDAuICBXZSBzZXQgaXQgdG8gMSBpbgorLy8gbWFpbigpLCBqdXN0IGJlZm9yZSBpbnZvY2F0aW9uIG9mIEluaXRHb29nbGVUZXN0KCkuICBBZnRlciBjYWxsaW5nCisvLyBJbml0R29vZ2xlVGVzdCgpLCB3ZSBzZXQgdGhlIHZhbHVlIHRvIDIuICBJZiB0aGUgc2VxdWVuY2UgaXMgZXZhbHVhdGVkCisvLyBiZWZvcmUgb3IgYWZ0ZXIgSW5pdEdvb2dsZVRlc3QsIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHdpbGwgY3JlYXRlIGEKKy8vIHRlc3Qgd2l0aCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiAxLCBhbmQgdGhlIHRlc3QgYm9keSB3aWxsIGZhaWwgdGhlCisvLyBhc3NlcnRpb24uCitjbGFzcyBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geworIHB1YmxpYzoKKyAgc3RhdGljIGludCBwYXJhbV92YWx1ZSgpIHsgcmV0dXJuIHBhcmFtX3ZhbHVlXzsgfQorICBzdGF0aWMgdm9pZCBzZXRfcGFyYW1fdmFsdWUoaW50IHBhcmFtX3ZhbHVlKSB7IHBhcmFtX3ZhbHVlXyA9IHBhcmFtX3ZhbHVlOyB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IHBhcmFtX3ZhbHVlXzsKK307CitpbnQgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnBhcmFtX3ZhbHVlXyA9IDA7CisKK1RFU1RfUChHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCwgR2VuZXJhdG9yc0V2YWx1YXRlZEluTWFpbikgeworICBFWFBFQ1RfRVEoMSwgR2V0UGFyYW0oKSk7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChHZW5FdmFsTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnBhcmFtX3ZhbHVlKCkpKTsKKworLy8gVGVzdHMgdGhhdCBnZW5lcmF0b3JzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdCBhcmUKKy8vIGZ1bmN0aW9uYWwuIEdlbmVyYXRvciBleHRlcm5fZ2VuIGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4KK2V4dGVybiBQYXJhbUdlbmVyYXRvcjxpbnQ+IGV4dGVybl9nZW47CitjbGFzcyBFeHRlcm5hbEdlbmVyYXRvclRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworVEVTVF9QKEV4dGVybmFsR2VuZXJhdG9yVGVzdCwgRXh0ZXJuYWxHZW5lcmF0b3IpIHsKKyAgLy8gU2VxdWVuY2UgcHJvZHVjZWQgYnkgZXh0ZXJuX2dlbiBjb250YWlucyBvbmx5IGEgc2luZ2xlIHZhbHVlCisgIC8vIHdoaWNoIHdlIHZlcmlmeSBoZXJlLgorICBFWFBFQ1RfRVEoR2V0UGFyYW0oKSwgMzMpOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRXh0ZXJuYWxHZW5lcmF0b3JNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbEdlbmVyYXRvclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fZ2VuKTsKKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBkZWZpbmVkIGluIG9uZSB0cmFuc2xhdGlvbgorLy8gdW5pdCBhbmQgaW5zdGFudGlhdGVkIGluIGFub3RoZXIuIFRoaXMgdGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZCBpbgorLy8gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4gRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCBmaXh0dXJlIGNsYXNzIGlzCisvLyBkZWZpbmVkIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oLgorVEVTVF9QKEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QsIElzTXVsdGlwbGVPZjMzKSB7CisgIEVYUEVDVF9FUSgwLCBHZXRQYXJhbSgpICUgMzMpOworfQorCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIG11bHRpcGxlCisvLyBnZW5lcmF0b3JzLgorY2xhc3MgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4ge307CitURVNUX1AoTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgQWxsb3dzTXVsdGlwbGVJbnN0YW5jZXMpIHsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMSwgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgVmFsdWVzKDEsIDIpKTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMiwgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgUmFuZ2UoMywgNSkpOworCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGluc3RhbnRpYXRlZAorLy8gaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMuIFRoaXMgdGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZAorLy8gaGVyZSBhbmQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4KKy8vIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYXRpb25Vbml0c1Rlc3QgZml4dHVyZSBjbGFzcworLy8gaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaC4KK1RFU1RfUChJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QsIElzTXVsdGlwbGVPZjQyKSB7CisgIEVYUEVDVF9FUSgwLCBHZXRQYXJhbSgpICUgNDIpOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDQyLCA0MioyKSk7CisKKy8vIFRlc3RzIHRoYXQgZWFjaCBpdGVyYXRpb24gb2YgcGFyYW1ldGVyaXplZCB0ZXN0IHJ1bnMgaW4gYSBzZXBhcmF0ZSB0ZXN0CisvLyBvYmplY3QuCitjbGFzcyBTZXBhcmF0ZUluc3RhbmNlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geworIHB1YmxpYzoKKyAgU2VwYXJhdGVJbnN0YW5jZVRlc3QoKSA6IGNvdW50XygwKSB7fQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgRVhQRUNUX0dFKGdsb2JhbF9jb3VudF8sIDIpCisgICAgICAgIDw8ICJJZiBzb21lIChidXQgbm90IGFsbCkgU2VwYXJhdGVJbnN0YW5jZVRlc3QgdGVzdHMgaGF2ZSBiZWVuICIKKyAgICAgICAgPDwgImZpbHRlcmVkIG91dCB0aGlzIHRlc3Qgd2lsbCBmYWlsLiBNYWtlIHN1cmUgdGhhdCBhbGwgIgorICAgICAgICA8PCAiR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgYXJlIHNlbGVjdGVkIG9yIGRlLXNlbGVjdGVkIHRvZ2V0aGVyICIKKyAgICAgICAgPDwgImJ5IHRoZSB0ZXN0IGZpbHRlci4iOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGludCBjb3VudF87CisgIHN0YXRpYyBpbnQgZ2xvYmFsX2NvdW50XzsKK307CitpbnQgU2VwYXJhdGVJbnN0YW5jZVRlc3Q6Omdsb2JhbF9jb3VudF8gPSAwOworCitURVNUX1AoU2VwYXJhdGVJbnN0YW5jZVRlc3QsIFRlc3RzUnVuSW5TZXBhcmF0ZUluc3RhbmNlcykgeworICBFWFBFQ1RfRVEoMCwgY291bnRfKyspOworICBnbG9iYWxfY291bnRfKys7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChGb3VyRWxlbVNlcXVlbmNlLCBTZXBhcmF0ZUluc3RhbmNlVGVzdCwgUmFuZ2UoMSwgNCkpOworCisvLyBUZXN0cyB0aGF0IGFsbCBpbnN0YW50aWF0aW9ucyBvZiBhIHRlc3QgaGF2ZSBuYW1lZCBhcHByb3ByaWF0ZWx5LiBUZXN0CisvLyBkZWZpbmVkIHdpdGggVEVTVF9QKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpIGFuZCBpbnN0YW50aWF0ZWQgd2l0aAorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2VOYW1lLCBUZXN0Q2FzZU5hbWUsIGdlbmVyYXRvcikgbXVzdCBiZSBuYW1lZAorLy8gU2VxdWVuY2VOYW1lL1Rlc3RDYXNlTmFtZS5UZXN0TmFtZS9pLCB3aGVyZSBpIGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZQorLy8gc2VxdWVuY2UgZWxlbWVudCB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0LgorY2xhc3MgTmFtaW5nVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4ge307CisKK1RFU1RfUChOYW1pbmdUZXN0LCBUZXN0c1JlcG9ydENvcnJlY3ROYW1lc0FuZFBhcmFtZXRlcnMpIHsKKyAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKworICBFWFBFQ1RfU1RSRVEoIlplcm9Ub0ZpdmVTZXF1ZW5jZS9OYW1pbmdUZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKworICBNZXNzYWdlIGluZGV4X3N0cmVhbTsKKyAgaW5kZXhfc3RyZWFtIDw8ICJUZXN0c1JlcG9ydENvcnJlY3ROYW1lc0FuZFBhcmFtZXRlcnMvIiA8PCBHZXRQYXJhbSgpOworICBFWFBFQ1RfU1RSRVEoaW5kZXhfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksIHRlc3RfaW5mby0+bmFtZSgpKTsKKworICBFWFBFQ1RfRVEoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLCB0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChaZXJvVG9GaXZlU2VxdWVuY2UsIE5hbWluZ1Rlc3QsIFJhbmdlKDAsIDUpKTsKKworLy8gQ2xhc3MgdGhhdCBjYW5ub3QgYmUgc3RyZWFtZWQgaW50byBhbiBvc3RyZWFtLiAgSXQgbmVlZHMgdG8gYmUgY29weWFibGUKKy8vIChhbmQsIGluIGNhc2Ugb2YgTVNWQywgYWxzbyBhc3NpZ25hYmxlKSBpbiBvcmRlciB0byBiZSBhIHRlc3QgcGFyYW1ldGVyCisvLyB0eXBlLiAgSXRzIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBkbyBleGFjdGx5CisvLyB3aGF0IHdlIG5lZWQuCitjbGFzcyBVbnN0cmVhbWFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5zdHJlYW1hYmxlKGludCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyBwcml2YXRlOgorICBpbnQgdmFsdWVfOworfTsKKworY2xhc3MgQ29tbWVudFRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxVbnN0cmVhbWFibGU+IHt9OworCitURVNUX1AoQ29tbWVudFRlc3QsIFRlc3RzQ29ycmVjdGx5UmVwb3J0VW5zdHJlYW1hYmxlUGFyYW1zKSB7CisgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisKKyAgRVhQRUNUX0VRKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhHZXRQYXJhbSgpKSwgdGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbldpdGhDb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKFVuc3RyZWFtYWJsZSgxKSkpOworCisvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgaGllcmFyY2h5IG9mIHRlc3QgZml4dHVyZXMsIHdoZXJlIHRoZSBiYXNlCisvLyBjbGFzcyBmaXh0dXJlIGlzIG5vdCBwYXJhbWV0ZXJpemVkIGFuZCB0aGUgZGVyaXZlZCBjbGFzcyBpcy4gSW4gdGhpcyBjYXNlCisvLyBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QgaW5oZXJpdHMgZnJvbSBOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QuICBXZQorLy8gcGVyZm9ybSBzaW1wbGUgdGVzdHMgb24gYm90aC4KK2NsYXNzIE5vblBhcmFtZXRlcml6ZWRCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0KCkgOiBuXygxNykgeyB9CisgcHJvdGVjdGVkOgorICBpbnQgbl87Cit9OworCitjbGFzcyBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QgOiBwdWJsaWMgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworIHByb3RlY3RlZDoKKyAgUGFyYW1ldGVyaXplZERlcml2ZWRUZXN0KCkgOiBjb3VudF8oMCkgeyB9CisgIGludCBjb3VudF87CisgIHN0YXRpYyBpbnQgZ2xvYmFsX2NvdW50XzsKK307CisKK2ludCBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3Q6Omdsb2JhbF9jb3VudF8gPSAwOworCitURVNUX0YoTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0LCBGaXh0dXJlSXNJbml0aWFsaXplZCkgeworICBFWFBFQ1RfRVEoMTcsIG5fKTsKK30KKworVEVTVF9QKFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCwgU2Vlc1NlcXVlbmNlKSB7CisgIEVYUEVDVF9FUSgxNywgbl8pOworICBFWFBFQ1RfRVEoMCwgY291bnRfKyspOworICBFWFBFQ1RfRVEoR2V0UGFyYW0oKSwgZ2xvYmFsX2NvdW50XysrKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUmFuZ2VaZXJvVG9GaXZlLCBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QsIFJhbmdlKDAsIDUpKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCitURVNUKENvbXBpbGVUZXN0LCBDb21iaW5lSXNEZWZpbmVkT25seVdoZW5HdGVzdEhhc1BhcmFtVGVzdElzRGVmaW5lZCkgeworI2lmIEdURVNUX0hBU19DT01CSU5FICYmICFHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBGQUlMKCkgPDwgIkdURVNUX0hBU19DT01CSU5FIGlzIGRlZmluZWQgd2hpbGUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgaXMgbm90XG4iCisjZW5kaWYKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gVXNlZCBpbiBUZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlLgorICBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoVGVzdEdlbmVyYXRpb25UZXN0OjpFbnZpcm9ubWVudDo6SW5zdGFuY2UoKSk7CisgIC8vIFVzZWQgaW4gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgdGVzdCBjYXNlLiBUZXN0cyB0aGF0IHRoZSB1cGRhdGVkIHZhbHVlCisgIC8vIHdpbGwgYmUgcGlja2VkIHVwIGZvciBpbnN0YW50aWF0aW5nIHRlc3RzIGluIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0LgorICBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdDo6c2V0X3BhcmFtX3ZhbHVlKDEpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gVXNlZCBpbiBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCB0ZXN0IGNhc2UuIFRlc3RzIHRoYXQgdmFsdWUgdXBkYXRlZAorICAvLyBoZXJlIHdpbGwgTk9UIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgdGVzdHMgaW4KKyAgLy8gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QuCisgIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0OjpzZXRfcGFyYW1fdmFsdWUoMik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmVhMTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIHByb3ZpZGVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkKKy8vIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZi4KKworI2lmbmRlZiBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXworI2RlZmluZSBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIFRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBkZWZpbml0aW9uIGFuZCBpbnN0YW50aWF0aW9uIG9mIGEgdGVzdAorLy8gaW4gc2VwYXJhdGUgdHJhbnNsYXRpb24gdW5pdHMuCitjbGFzcyBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKK307CisKKy8vIFRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBpbnN0YW50aWF0aW9uIG9mIGEgdGVzdCBpbiBtdWx0aXBsZQorLy8gdHJhbnNsYXRpb24gdW5pdHMuCitjbGFzcyBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfVEVTVF9HVEVTVF9QQVJBTV9URVNUX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjFmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjCkBAIC0wLDAgKzEsMTI1MyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpLCB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgaW50ZXJuYWwgY3Jvc3MtcGxhdGZvcm0gc3VwcG9ydCB1dGlsaXRpZXMuCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWYgR1RFU1RfT1NfTUFDCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3Igc3RkOjpwYWlyIGFuZCBzdGQ6Om1ha2VfcGFpci4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKwordXNpbmcgc3RkOjptYWtlX3BhaXI7Cit1c2luZyBzdGQ6OnBhaXI7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK1RFU1QoSXNYRGlnaXRUZXN0LCBXb3Jrc0Zvck5hcnJvd0FzY2lpKSB7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KCcwJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnOScpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJ0EnKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KCdGJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnYScpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJ2YnKSk7CisKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KCctJykpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoJ2cnKSk7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdCgnRycpKTsKK30KKworVEVTVChJc1hEaWdpdFRlc3QsIFJldHVybnNGYWxzZUZvck5hcnJvd05vbkFzY2lpKSB7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdChzdGF0aWNfY2FzdDxjaGFyPigweDgwKSkpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnIHwgMHg4MCkpKTsKK30KKworVEVTVChJc1hEaWdpdFRlc3QsIFdvcmtzRm9yV2lkZUFzY2lpKSB7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnMCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCc5JykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJ0EnKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnRicpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCdhJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJ2YnKSk7CisKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KEwnLScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KEwnZycpKTsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KEwnRycpKTsKK30KKworVEVTVChJc1hEaWdpdFRlc3QsIFJldHVybnNGYWxzZUZvcldpZGVOb25Bc2NpaSkgeworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg4MCkpKTsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KHN0YXRpY19jYXN0PHdjaGFyX3Q+KEwnMCcgfCAweDgwKSkpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oTCcwJyB8IDB4MTAwKSkpOworfQorCitjbGFzcyBCYXNlIHsKKyBwdWJsaWM6CisgIC8vIENvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgZG8gZXhhY3RseSB3aGF0IHdlIG5lZWQsIHNvIHdlCisgIC8vIHVzZSB0aGVtLgorICBCYXNlKCkgOiBtZW1iZXJfKDApIHt9CisgIGV4cGxpY2l0IEJhc2UoaW50IG4pIDogbWVtYmVyXyhuKSB7fQorICB2aXJ0dWFsIH5CYXNlKCkge30KKyAgaW50IG1lbWJlcigpIHsgcmV0dXJuIG1lbWJlcl87IH0KKworIHByaXZhdGU6CisgIGludCBtZW1iZXJfOworfTsKKworY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERlcml2ZWQoaW50IG4pIDogQmFzZShuKSB7fQorfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDb252ZXJ0c1BvaW50ZXJzKSB7CisgIERlcml2ZWQgZGVyaXZlZCgwKTsKKyAgRVhQRUNUX1RSVUUoJmRlcml2ZWQgPT0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlKj4oJmRlcml2ZWQpKTsKK30KKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VJbmhlcml0YW5jZSkgeworICBEZXJpdmVkIGRlcml2ZWQoMSk7CisgIEJhc2UgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oZGVyaXZlZCk7CisgIEVYUEVDVF9FUShkZXJpdmVkLm1lbWJlcigpLCBiYXNlLm1lbWJlcigpKTsKK30KKworY2xhc3MgQ2FzdGFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ2FzdGFibGUoYm9vbCogY29udmVydGVkKSA6IGNvbnZlcnRlZF8oY29udmVydGVkKSB7fQorICBvcGVyYXRvciBCYXNlKCkgeworICAgICpjb252ZXJ0ZWRfID0gdHJ1ZTsKKyAgICByZXR1cm4gQmFzZSgpOworICB9CisKKyBwcml2YXRlOgorICBib29sKiBjb252ZXJ0ZWRfOworfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VOb25Db25zdENhc3RPcGVyYXRvcikgeworICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICBDYXN0YWJsZSBjYXN0YWJsZSgmY29udmVydGVkKTsKKyAgQmFzZSBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjYXN0YWJsZSk7CisgIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCk7Cit9CisKK2NsYXNzIENvbnN0Q2FzdGFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ29uc3RDYXN0YWJsZShib29sKiBjb252ZXJ0ZWQpIDogY29udmVydGVkXyhjb252ZXJ0ZWQpIHt9CisgIG9wZXJhdG9yIEJhc2UoKSBjb25zdCB7CisgICAgKmNvbnZlcnRlZF8gPSB0cnVlOworICAgIHJldHVybiBCYXNlKCk7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wqIGNvbnZlcnRlZF87Cit9OworCitURVNUKEltcGxpY2l0Q2FzdFRlc3QsIENhblVzZUNvbnN0Q2FzdE9wZXJhdG9yT25Db25zdFZhbHVlcykgeworICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICBjb25zdCBDb25zdENhc3RhYmxlIGNvbnN0X2Nhc3RhYmxlKCZjb252ZXJ0ZWQpOworICBCYXNlIGJhc2UgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2U+KGNvbnN0X2Nhc3RhYmxlKTsKKyAgRVhQRUNUX1RSVUUoY29udmVydGVkKTsKK30KKworY2xhc3MgQ29uc3RBbmROb25Db25zdENhc3RhYmxlIHsKKyBwdWJsaWM6CisgIENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZShib29sKiBjb252ZXJ0ZWQsIGJvb2wqIGNvbnN0X2NvbnZlcnRlZCkKKyAgICAgIDogY29udmVydGVkXyhjb252ZXJ0ZWQpLCBjb25zdF9jb252ZXJ0ZWRfKGNvbnN0X2NvbnZlcnRlZCkge30KKyAgb3BlcmF0b3IgQmFzZSgpIHsKKyAgICAqY29udmVydGVkXyA9IHRydWU7CisgICAgcmV0dXJuIEJhc2UoKTsKKyAgfQorICBvcGVyYXRvciBCYXNlKCkgY29uc3QgeworICAgICpjb25zdF9jb252ZXJ0ZWRfID0gdHJ1ZTsKKyAgICByZXR1cm4gQmFzZSgpOworICB9CisKKyBwcml2YXRlOgorICBib29sKiBjb252ZXJ0ZWRfOworICBib29sKiBjb25zdF9jb252ZXJ0ZWRfOworfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5TZWxlY3RCZXR3ZWVuQ29uc3RBbmROb25Db25zdENhc3JBcHByb3ByaWF0ZWx5KSB7CisgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgIGJvb2wgY29uc3RfY29udmVydGVkID0gZmFsc2U7CisgIENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZSBjYXN0YWJsZSgmY29udmVydGVkLCAmY29uc3RfY29udmVydGVkKTsKKyAgQmFzZSBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjYXN0YWJsZSk7CisgIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCk7CisgIEVYUEVDVF9GQUxTRShjb25zdF9jb252ZXJ0ZWQpOworCisgIGNvbnZlcnRlZCA9IGZhbHNlOworICBjb25zdF9jb252ZXJ0ZWQgPSBmYWxzZTsKKyAgY29uc3QgQ29uc3RBbmROb25Db25zdENhc3RhYmxlIGNvbnN0X2Nhc3RhYmxlKCZjb252ZXJ0ZWQsICZjb25zdF9jb252ZXJ0ZWQpOworICBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjb25zdF9jYXN0YWJsZSk7CisgIEVYUEVDVF9GQUxTRShjb252ZXJ0ZWQpOworICBFWFBFQ1RfVFJVRShjb25zdF9jb252ZXJ0ZWQpOworfQorCitjbGFzcyBUbyB7CisgcHVibGljOgorICBUbyhib29sKiBjb252ZXJ0ZWQpIHsgKmNvbnZlcnRlZCA9IHRydWU7IH0gIC8vIE5PTElOVAorfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VJbXBsaWNpdENvbnN0cnVjdG9yKSB7CisgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgIFRvIHRvID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxUbz4oJmNvbnZlcnRlZCk7CisgICh2b2lkKXRvOworICBFWFBFQ1RfVFJVRShjb252ZXJ0ZWQpOworfQorCitURVNUKEl0ZXJhdG9yVHJhaXRzVGVzdCwgV29ya3NGb3JTVExDb250YWluZXJJdGVyYXRvcnMpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCwKKyAgICAgIEl0ZXJhdG9yVHJhaXRzPCA6OnN0ZDo6dmVjdG9yPGludD46OmNvbnN0X2l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGJvb2wsCisgICAgICBJdGVyYXRvclRyYWl0czwgOjpzdGQ6Omxpc3Q8Ym9vbD46Oml0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKTsKK30KKworVEVTVChJdGVyYXRvclRyYWl0c1Rlc3QsIFdvcmtzRm9yUG9pbnRlclRvTm9uQ29uc3QpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIEl0ZXJhdG9yVHJhaXRzPGNoYXIqPjo6dmFsdWVfdHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IHZvaWQqLCBJdGVyYXRvclRyYWl0czxjb25zdCB2b2lkKio+Ojp2YWx1ZV90eXBlPigpOworfQorCitURVNUKEl0ZXJhdG9yVHJhaXRzVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Db25zdCkgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y2hhciwgSXRlcmF0b3JUcmFpdHM8Y29uc3QgY2hhcio+Ojp2YWx1ZV90eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3Qgdm9pZCosCisgICAgICBJdGVyYXRvclRyYWl0czxjb25zdCB2b2lkKiBjb25zdCo+Ojp2YWx1ZV90eXBlPigpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBlbGVtZW50X3R5cGUgdHlwZWRlZiBpcyBhdmFpbGFibGUgaW4gc2NvcGVkX3B0ciBhbmQgcmVmZXJzCisvLyB0byB0aGUgcGFyYW1ldGVyIHR5cGUuCitURVNUKFNjb3BlZFB0clRlc3QsIERlZmluZXNFbGVtZW50VHlwZSkgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyPGludD46OmVsZW1lbnRfdHlwZT4oKTsKK30KKworLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogSW1wbGVtZW50IFRIRSBSRVNUIG9mIHNjb3BlZF9wdHIgdGVzdHMuCisKK1RFU1QoR3Rlc3RDaGVja1N5bnRheFRlc3QsIEJlaGF2ZXNMaWtlQVNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBHVEVTVF9DSEVDS18oZmFsc2UpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSBleGVjdXRlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0J3MgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkuIjsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEdURVNUX0NIRUNLXyh0cnVlKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgR1RFU1RfQ0hFQ0tfKHRydWUpIDw8ICIiOworfQorCitURVNUKEd0ZXN0Q2hlY2tTeW50YXhUZXN0LCBXb3Jrc1dpdGhTd2l0Y2gpIHsKKyAgc3dpdGNoICgwKSB7CisgICAgY2FzZSAxOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0NIRUNLXyh0cnVlKTsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBHVEVTVF9DSEVDS18odHJ1ZSkgPDwgIkNoZWNrIGZhaWxlZCBpbiBzd2l0Y2ggY2FzZSI7Cit9CisKKy8vIFZlcmlmaWVzIGJlaGF2aW9yIG9mIEZvcm1hdEZpbGVMb2NhdGlvbi4KK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c0ZpbGVMb2NhdGlvbikgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiZm9vLmNjIiwgRm9ybWF0RmlsZUxvY2F0aW9uKCJmb28uY2MiLCA0MikpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiNDIiLCBGb3JtYXRGaWxlTG9jYXRpb24oImZvby5jYyIsIDQyKSk7Cit9CisKK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vua25vd25GaWxlKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoCisgICAgICBJc1N1YnN0cmluZywgInVua25vd24gZmlsZSIsIEZvcm1hdEZpbGVMb2NhdGlvbihOVUxMLCA0MikpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiNDIiLCBGb3JtYXRGaWxlTG9jYXRpb24oTlVMTCwgNDIpKTsKK30KKworVEVTVChGb3JtYXRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duTGluZSkgeworICBFWFBFQ1RfRVEoImZvby5jYzoiLCBGb3JtYXRGaWxlTG9jYXRpb24oImZvby5jYyIsIC0xKSk7Cit9CisKK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkZpbGVBbmRMaW5lKSB7CisgIEVYUEVDVF9FUSgidW5rbm93biBmaWxlOiIsIEZvcm1hdEZpbGVMb2NhdGlvbihOVUxMLCAtMSkpOworfQorCisvLyBWZXJpZmllcyBiZWhhdmlvciBvZiBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uLgorVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c0ZpbGVMb2NhdGlvbikgeworICBFWFBFQ1RfRVEoImZvby5jYzo0MiIsIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oImZvby5jYyIsIDQyKSk7Cit9CisKK1RFU1QoRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVa25vd25GaWxlKSB7CisgIEVYUEVDVF9FUSgidW5rbm93biBmaWxlOjQyIiwKKyAgICAgICAgICAgIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oTlVMTCwgNDIpKTsKK30KKworVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkxpbmUpIHsKKyAgRVhQRUNUX0VRKCJmb28uY2MiLCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKCJmb28uY2MiLCAtMSkpOworfQorCitURVNUKEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duRmlsZUFuZExpbmUpIHsKKyAgRVhQRUNUX0VRKCJ1bmtub3duIGZpbGUiLCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKE5VTEwsIC0xKSk7Cit9CisKKyNpZiBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfUU5YCit2b2lkKiBUaHJlYWRGdW5jKHZvaWQqIGRhdGEpIHsKKyAgcHRocmVhZF9tdXRleF90KiBtdXRleCA9IHN0YXRpY19jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KGRhdGEpOworICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOworICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7CisgIHJldHVybiBOVUxMOworfQorCitURVNUKEdldFRocmVhZENvdW50VGVzdCwgUmV0dXJuc0NvcnJlY3RWYWx1ZSkgeworICBFWFBFQ1RfRVEoMVUsIEdldFRocmVhZENvdW50KCkpOworICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisgIHB0aHJlYWRfYXR0cl90ICBhdHRyOworICBwdGhyZWFkX3QgICAgICAgdGhyZWFkX2lkOworCisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IHR1cm4gbXV0ZXggaW50byBpbnRlcm5hbDo6TXV0ZXggZm9yIGF1dG9tYXRpYworICAvLyBkZXN0cnVjdGlvbi4KKyAgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleCwgTlVMTCk7CisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOworICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpKTsKKyAgQVNTRVJUX0VRKDAsIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpKTsKKworICBjb25zdCBpbnQgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZF9pZCwgJmF0dHIsICZUaHJlYWRGdW5jLCAmbXV0ZXgpOworICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpKTsKKyAgQVNTRVJUX0VRKDAsIHN0YXR1cyk7CisgIEVYUEVDVF9FUSgyVSwgR2V0VGhyZWFkQ291bnQoKSk7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CisKKyAgdm9pZCogZHVtbXk7CisgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2pvaW4odGhyZWFkX2lkLCAmZHVtbXkpKTsKKworIyBpZiBHVEVTVF9PU19NQUMKKworICAvLyBNYWNPUyBYIG1heSBub3QgaW1tZWRpYXRlbHkgcmVwb3J0IHRoZSB1cGRhdGVkIHRocmVhZCBjb3VudCBhZnRlcgorICAvLyBqb2luaW5nIGEgdGhyZWFkLCBjYXVzaW5nIGZsYWtpbmVzcyBpbiB0aGlzIHRlc3QuIFRvIGNvdW50ZXIgdGhhdCwgd2UKKyAgLy8gd2FpdCBmb3IgdXAgdG8gLjUgc2Vjb25kcyBmb3IgdGhlIE9TIHRvIHJlcG9ydCB0aGUgY29ycmVjdCB2YWx1ZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBpZiAoR2V0VGhyZWFkQ291bnQoKSA9PSAxKQorICAgICAgYnJlYWs7CisKKyAgICBTbGVlcE1pbGxpc2Vjb25kcygxMDApOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX01BQworCisgIEVYUEVDVF9FUSgxVSwgR2V0VGhyZWFkQ291bnQoKSk7CisgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgpOworfQorI2Vsc2UKK1RFU1QoR2V0VGhyZWFkQ291bnRUZXN0LCBSZXR1cm5zWmVyb1doZW5VbmFibGVUb0NvdW50VGhyZWFkcykgeworICBFWFBFQ1RfRVEoMFUsIEdldFRocmVhZENvdW50KCkpOworfQorI2VuZGlmICAvLyBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfUU5YCisKK1RFU1QoR3Rlc3RDaGVja0RlYXRoVGVzdCwgRGllc1dpdGhDb3JyZWN0T3V0cHV0T25GYWlsdXJlKSB7CisgIGNvbnN0IGJvb2wgYV9mYWxzZV9jb25kaXRpb24gPSBmYWxzZTsKKyAgY29uc3QgY2hhciByZWdleFtdID0KKyNpZmRlZiBfTVNDX1ZFUgorICAgICAiZ3Rlc3QtcG9ydF90ZXN0XFwuY2NcXChcXGQrXFwpOiIKKyNlbGlmIEdURVNUX1VTRVNfUE9TSVhfUkUKKyAgICAgImd0ZXN0LXBvcnRfdGVzdFxcLmNjOlswLTldKyIKKyNlbHNlCisgICAgICJndGVzdC1wb3J0X3Rlc3RcXC5jYzpcXGQrIgorI2VuZGlmICAvLyBfTVNDX1ZFUgorICAgICAiLiphX2ZhbHNlX2NvbmRpdGlvbi4qRXh0cmEgaW5mby4qIjsKKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKEdURVNUX0NIRUNLXyhhX2ZhbHNlX2NvbmRpdGlvbikgPDwgIkV4dHJhIGluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4KTsKK30KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKK1RFU1QoR3Rlc3RDaGVja0RlYXRoVGVzdCwgTGl2ZXNTaWxlbnRseU9uU3VjY2VzcykgeworICBFWFBFQ1RfRVhJVCh7CisgICAgICBHVEVTVF9DSEVDS18odHJ1ZSkgPDwgIkV4dHJhIGluZm8iOworICAgICAgOjpzdGQ6OmNlcnIgPDwgIlN1Y2Nlc3NcbiI7CisgICAgICBleGl0KDApOyB9LAorICAgICAgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIlN1Y2Nlc3MiKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IGNob29zZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGFwcHJvcHJpYXRlIHRvCisvLyB0aGUgcGxhdGZvcm0uIFRoZSB0ZXN0IHdpbGwgcHJvZHVjZSBjb21waWxlciBlcnJvcnMgaW4gY2FzZSBvZiBmYWlsdXJlLgorLy8gRm9yIHNpbXBsaWNpdHksIHdlIG9ubHkgY292ZXIgdGhlIG1vc3QgaW1wb3J0YW50IHBsYXRmb3JtcyBoZXJlLgorVEVTVChSZWdleEVuZ2luZVNlbGVjdGlvblRlc3QsIFNlbGVjdHNDb3JyZWN0UmVnZXhFbmdpbmUpIHsKKyNpZiBHVEVTVF9IQVNfUE9TSVhfUkUKKworICBFWFBFQ1RfVFJVRShHVEVTVF9VU0VTX1BPU0lYX1JFKTsKKworI2Vsc2UKKworICBFWFBFQ1RfVFJVRShHVEVTVF9VU0VTX1NJTVBMRV9SRSk7CisKKyNlbmRpZgorfQorCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisjIGlmIEdURVNUX0hBU19UWVBFRF9URVNUCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHI+CitjbGFzcyBSRVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OworCisvLyBEZWZpbmVzIFN0cmluZ1R5cGVzIGFzIHRoZSBsaXN0IG9mIGFsbCBzdHJpbmcgdHlwZXMgdGhhdCBjbGFzcyBSRQorLy8gc3VwcG9ydHMuCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPAorICAgIDo6c3RkOjpzdHJpbmcsCisjICBpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworICAgIDo6c3RyaW5nLAorIyAgZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisgICAgY29uc3QgY2hhcio+IFN0cmluZ1R5cGVzOworCitUWVBFRF9URVNUX0NBU0UoUkVUZXN0LCBTdHJpbmdUeXBlcyk7CisKKy8vIFRlc3RzIFJFJ3MgaW1wbGljaXQgY29uc3RydWN0b3JzLgorVFlQRURfVEVTVChSRVRlc3QsIEltcGxpY2l0Q29uc3RydWN0b3JXb3JrcykgeworICBjb25zdCBSRSBlbXB0eShUeXBlUGFyYW0oIiIpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBlbXB0eS5wYXR0ZXJuKCkpOworCisgIGNvbnN0IFJFIHNpbXBsZShUeXBlUGFyYW0oImhlbGxvIikpOworICBFWFBFQ1RfU1RSRVEoImhlbGxvIiwgc2ltcGxlLnBhdHRlcm4oKSk7CisKKyAgY29uc3QgUkUgbm9ybWFsKFR5cGVQYXJhbSgiLiooXFx3KykiKSk7CisgIEVYUEVDVF9TVFJFUSgiLiooXFx3KykiLCBub3JtYWwucGF0dGVybigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBSRSdzIGNvbnN0cnVjdG9ycyByZWplY3QgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25zLgorVFlQRURfVEVTVChSRVRlc3QsIFJlamVjdHNJbnZhbGlkUmVnZXgpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIGNvbnN0IFJFIGludmFsaWQoVHlwZVBhcmFtKCI/IikpOworICB9LCAiXCI/XCIgaXMgbm90IGEgdmFsaWQgUE9TSVggRXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uLiIpOworfQorCisvLyBUZXN0cyBSRTo6RnVsbE1hdGNoKCkuCitUWVBFRF9URVNUKFJFVGVzdCwgRnVsbE1hdGNoV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoVHlwZVBhcmFtKCIiKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCIiKSwgZW1wdHkpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCJhIiksIGVtcHR5KSk7CisKKyAgY29uc3QgUkUgcmUoVHlwZVBhcmFtKCJhLip6IikpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYXoiKSwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImF4eXoiKSwgcmUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCJiYXoiKSwgcmUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCJhenkiKSwgcmUpKTsKK30KKworLy8gVGVzdHMgUkU6OlBhcnRpYWxNYXRjaCgpLgorVFlQRURfVEVTVChSRVRlc3QsIFBhcnRpYWxNYXRjaFdvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KFR5cGVQYXJhbSgiIikpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiIiksIGVtcHR5KSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJhIiksIGVtcHR5KSk7CisKKyAgY29uc3QgUkUgcmUoVHlwZVBhcmFtKCJhLip6IikpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYXoiKSwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImF4eXoiKSwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImJheiIpLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYXp5IiksIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgienphIiksIHJlKSk7Cit9CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyNlbGlmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKK1RFU1QoSXNJblNldFRlc3QsIE51bENoYXJJc05vdEluQW55U2V0KSB7CisgIEVYUEVDVF9GQUxTRShJc0luU2V0KCdcMCcsICIiKSk7CisgIEVYUEVDVF9GQUxTRShJc0luU2V0KCdcMCcsICJcMCIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ1wwJywgImEiKSk7Cit9CisKK1RFU1QoSXNJblNldFRlc3QsIFdvcmtzRm9yTm9uTnVsQ2hhcnMpIHsKKyAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ2EnLCAiQWIiKSk7CisgIEVYUEVDVF9GQUxTRShJc0luU2V0KCdjJywgIiIpKTsKKworICBFWFBFQ1RfVFJVRShJc0luU2V0KCdiJywgImJjZCIpKTsKKyAgRVhQRUNUX1RSVUUoSXNJblNldCgnYicsICJhYiIpKTsKK30KKworVEVTVChJc0FzY2lpRGlnaXRUZXN0LCBJc0ZhbHNlRm9yTm9uRGlnaXQpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpRGlnaXQoJyAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpRGlnaXQoJysnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpRGlnaXQoJy0nKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpRGlnaXQoJy4nKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpRGlnaXQoJ2EnKSk7Cit9CisKK1RFU1QoSXNBc2NpaURpZ2l0VGVzdCwgSXNUcnVlRm9yRGlnaXQpIHsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaURpZ2l0KCcwJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpRGlnaXQoJzEnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlEaWdpdCgnNScpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaURpZ2l0KCc5JykpOworfQorCitURVNUKElzQXNjaWlQdW5jdFRlc3QsIElzRmFsc2VGb3JOb25QdW5jdCkgeworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnXG4nKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJzAnKSk7Cit9CisKK1RFU1QoSXNBc2NpaVB1bmN0VGVzdCwgSXNUcnVlRm9yUHVuY3QpIHsKKyAgZm9yIChjb25zdCBjaGFyKiBwID0gIl4tIVwiIyQlJicoKSorLC4vOjs8PT4/QFtcXF1fYHt8fX4iOyAqcDsgcCsrKSB7CisgICAgRVhQRUNUX1BSRUQxKElzQXNjaWlQdW5jdCwgKnApOworICB9Cit9CisKK1RFU1QoSXNSZXBlYXRUZXN0LCBJc0ZhbHNlRm9yTm9uUmVwZWF0Q2hhcikgeworICBFWFBFQ1RfRkFMU0UoSXNSZXBlYXQoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNSZXBlYXQoJyAnKSk7CisgIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCcxJykpOworICBFWFBFQ1RfRkFMU0UoSXNSZXBlYXQoJy0nKSk7Cit9CisKK1RFU1QoSXNSZXBlYXRUZXN0LCBJc1RydWVGb3JSZXBlYXRDaGFyKSB7CisgIEVYUEVDVF9UUlVFKElzUmVwZWF0KCc/JykpOworICBFWFBFQ1RfVFJVRShJc1JlcGVhdCgnKicpKTsKKyAgRVhQRUNUX1RSVUUoSXNSZXBlYXQoJysnKSk7Cit9CisKK1RFU1QoSXNBc2NpaVdoaXRlU3BhY2VUZXN0LCBJc0ZhbHNlRm9yTm9uV2hpdGVTcGFjZSkgeworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdoaXRlU3BhY2UoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdoaXRlU3BhY2UoJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnMScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCcrJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdoaXRlU3BhY2UoJ18nKSk7Cit9CisKK1RFU1QoSXNBc2NpaVdoaXRlU3BhY2VUZXN0LCBJc1RydWVGb3JXaGl0ZVNwYWNlKSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCcgJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXG4nKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdccicpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1x0JykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXHYnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdcZicpKTsKK30KKworVEVTVChJc0FzY2lpV29yZENoYXJUZXN0LCBJc0ZhbHNlRm9yTm9uV29yZENoYXIpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV29yZENoYXIoJysnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV29yZENoYXIoJy4nKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV29yZENoYXIoJyAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV29yZENoYXIoJ1xuJykpOworfQorCitURVNUKElzQXNjaWlXb3JkQ2hhclRlc3QsIElzVHJ1ZUZvckxldHRlcikgeworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ2EnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignYicpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdBJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ1onKSk7Cit9CisKK1RFU1QoSXNBc2NpaVdvcmRDaGFyVGVzdCwgSXNUcnVlRm9yRGlnaXQpIHsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCcwJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJzEnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignNycpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCc5JykpOworfQorCitURVNUKElzQXNjaWlXb3JkQ2hhclRlc3QsIElzVHJ1ZUZvclVuZGVyc2NvcmUpIHsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdfJykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc0ZhbHNlRm9yTm9uUHJpbnRhYmxlKSB7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ1wwMDcnKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzRmFsc2VGb3JEaWdpdCkgeworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJzknKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzRmFsc2VGb3JXaGl0ZVNwYWNlKSB7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnXG4nKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzRmFsc2VGb3JTb21lTGV0dGVyKSB7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdhJykpOworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnWicpKTsKK30KKworVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNUcnVlRm9yUHVuY3QpIHsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnLicpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnLScpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnXicpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnJCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnKCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnXScpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgneycpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnfCcpKTsKK30KKworVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNUcnVlRm9yU29tZUxldHRlcikgeworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCdkJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCdEJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCdzJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCdTJykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCd3JykpOworICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCdXJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRQdW5jdCkgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdcXCcsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXFwnLCAnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXycsICcuJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICcuJywgJ2EnKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdcXCcsICdcXCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdfJywgJ18nKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnKycsICcrJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJy4nLCAnLicpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX2QpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZCcsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZCcsICdhJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJy4nKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJzAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZCcsICc5JykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfRCkgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJzAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ0QnLCAnOScpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ0QnLCAnXDAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICdhJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ0QnLCAnLScpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX3MpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICdhJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJy4nKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnOScpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnICcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJ1xuJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnXHQnKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9TKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1MnLCAnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICdccicpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1MnLCAnXDAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICdhJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1MnLCAnOScpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX3cpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICcrJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJyAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnXG4nKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJzAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdiJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnQycpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ18nKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9XKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnQScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdiJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJzknKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnXycpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnXDAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICcqJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnXG4nKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZFdoaXRlU3BhY2UpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZicsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZicsICdcbicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnbicsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnbicsICdccicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncicsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncicsICdhJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd0JywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd0JywgJ3QnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3YnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3YnLCAnXGYnKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdmJywgJ1xmJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ24nLCAnXG4nKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncicsICdccicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd0JywgJ1x0JykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3YnLCAnXHYnKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgVW5lc2NhcGVkRG90KSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJ1xuJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnXDAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnLicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICdhJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJyAnKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgVW5lc2NhcGVkQ2hhcikgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnYScsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJ2EnLCAnYicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJyQnLCAnYScpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICckJywgJyQnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJzUnLCAnNScpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnWicsICdaJykpOworfQorCitURVNUKFZhbGlkYXRlUmVnZXhUZXN0LCBHZW5lcmF0ZXNGYWlsdXJlQW5kUmV0dXJuc0ZhbHNlRm9ySW52YWxpZCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleChOVUxMKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIGlzIG5vdCBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYVxcIikpLAorICAgICAgIlN5bnRheCBlcnJvciBhdCBpbmRleCAxIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCJhXFxcIjogIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJhXFwiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInXFwnIGNhbm5vdCBhcHBlYXIgYXQgdGhlIGVuZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiXFxuXFwiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInXFwnIGNhbm5vdCBhcHBlYXIgYXQgdGhlIGVuZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiXFxzXFxoYiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFwiXFxoXCIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIl5eIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ14nIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCIuKl5iIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ14nIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCIkJCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIickJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiXiRhIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJhKGIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInKCcgaXMgdW5zdXBwb3J0ZWQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImFiKSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicpJyBpcyB1bnN1cHBvcnRlZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiW2FiIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1snIGlzIHVuc3VwcG9ydGVkIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJhezIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIneycgaXMgdW5zdXBwb3J0ZWQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIj8iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInPycgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiXioiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInKicgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiNSorIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJysnIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4iKTsKK30KKworVEVTVChWYWxpZGF0ZVJlZ2V4VGVzdCwgUmV0dXJuc1RydWVGb3JWYWxpZCkgeworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCIiKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoImEiKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIi4qIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJeYV8rIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJeYVxcdFxcJj8iKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIjA5KiQiKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIl5aJCIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiYVxcXlpcXCRcXChcXClcXHxcXFtcXF1cXHtcXH0iKSk7Cit9CisKK1RFU1QoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc0Zvclplcm9Pck9uZSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICdhJywgJz8nLCAiYSIsICJiYSIpKTsKKyAgLy8gUmVwZWF0aW5nIG1vcmUgdGhhbiBvbmNlLgorICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICdhJywgJz8nLCAiYiIsICJhYWIiKSk7CisKKyAgLy8gUmVwZWF0aW5nIHplcm8gdGltZXMuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnYScsICc/JywgImIiLCAiYmEiKSk7CisgIC8vIFJlcGVhdGluZyBvbmNlLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJ2EnLCAnPycsICJiIiwgImFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJyMnLCAnPycsICIuIiwgIiMjIikpOworfQorCitURVNUKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NGb3JaZXJvT3JNYW55KSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKicsICJhJCIsICJiYWFiIikpOworCisgIC8vIFJlcGVhdGluZyB6ZXJvIHRpbWVzLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKicsICJiIiwgImJjIikpOworICAvLyBSZXBlYXRpbmcgb25jZS4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJyonLCAiYiIsICJhYmMiKSk7CisgIC8vIFJlcGVhdGluZyBtb3JlIHRoYW4gb25jZS4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQodHJ1ZSwgJ3cnLCAnKicsICItIiwgImFiXzEtZyIpKTsKK30KKworVEVTVChNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZFRlc3QsIFdvcmtzRm9yT25lT3JNYW55KSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKycsICJhJCIsICJiYWFiIikpOworICAvLyBSZXBlYXRpbmcgemVybyB0aW1lcy4KKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcrJywgImIiLCAiYmMiKSk7CisKKyAgLy8gUmVwZWF0aW5nIG9uY2UuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcrJywgImIiLCAiYWJjIikpOworICAvLyBSZXBlYXRpbmcgbW9yZSB0aGFuIG9uY2UuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKHRydWUsICd3JywgJysnLCAiLSIsICJhYl8xLWciKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsIFJldHVybnNUcnVlRm9yRW1wdHlSZWdleCkgeworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCIiLCAiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCIiLCAiYWIiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsIFdvcmtzV2hlbkRvbGxhcklzSW5SZWdleCkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiJCIsICJhIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIiQiLCAiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJhJCIsICJhIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc1doZW5SZWdleFN0YXJ0c1dpdGhFc2NhcGVTZXF1ZW5jZSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiXFx3IiwgIisiKSk7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJcXFciLCAiYWIiKSk7CisKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxzYSIsICJcbmFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXGQiLCAiMWEiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsIFdvcmtzV2hlblJlZ2V4U3RhcnRzV2l0aFJlcGV0aXRpb24pIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIi4rYSIsICJhYmMiKSk7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJhP2IiLCAiYWFiIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIi4qYSIsICJiYzEyLWFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJhP2IiLCAiYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiYT9iIiwgImFiIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LAorICAgICBXb3Jrc1doZW5SZWdleFN0YXJ0c1dpdGhSZXBldGlvbk9mRXNjYXBlU2VxdWVuY2UpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIlxcLithIiwgImFiYyIpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIlxccz9iIiwgIiAgYiIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXCgqYSIsICIoKCgoYWIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcXj9iIiwgIl5iIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXFxcP2IiLCAiYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxcXD9iIiwgIlxcYiIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgTWF0Y2hlc1NlcXVlbnRpYWxseSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiYWIuKmMiLCAiYWNhYmMiKSk7CisKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiYWIuKmMiLCAiYWItZnNjIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5TdHJpbmdJc051bGwpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiIiwgTlVMTCkpOworfQorCitURVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFdvcmtzV2hlblJlZ2V4U3RhcnRzV2l0aENhcmV0KSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoIl5hIiwgImJhIikpOworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCJeJCIsICJhIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXmEiLCAiYWIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXiIsICJhYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJeJCIsICIiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlbk5vTWF0Y2gpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiYSIsICJiY2RlMTIzIikpOworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCJhLithIiwgIi0tYWE4ODg4ODg4OCIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5NYXRjaGluZ1ByZWZpeCkgeworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIlxcdysiLCAiYWIxXyAtIDUiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiLio9IiwgIj0iKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgieC4qYWI/LipiYyIsICJ4YWFhYmMiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuTWF0Y2hpbmdOb25QcmVmaXgpIHsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJcXHcrIiwgIiQkJCBhYjFfIC0gNSIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJcXC4rPSIsICI9ICAuLi49IikpOworfQorCisvLyBUZXN0cyBSRSdzIGltcGxpY2l0IGNvbnN0cnVjdG9ycy4KK1RFU1QoUkVUZXN0LCBJbXBsaWNpdENvbnN0cnVjdG9yV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoIiIpOworICBFWFBFQ1RfU1RSRVEoIiIsIGVtcHR5LnBhdHRlcm4oKSk7CisKKyAgY29uc3QgUkUgc2ltcGxlKCJoZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoImhlbGxvIiwgc2ltcGxlLnBhdHRlcm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUkUncyBjb25zdHJ1Y3RvcnMgcmVqZWN0IGludmFsaWQgcmVndWxhciBleHByZXNzaW9ucy4KK1RFU1QoUkVUZXN0LCBSZWplY3RzSW52YWxpZFJlZ2V4KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBjb25zdCBSRSBub3JtYWwoTlVMTCk7CisgIH0sICJOVUxMIGlzIG5vdCBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24iKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgY29uc3QgUkUgbm9ybWFsKCIuKihcXHcrIik7CisgIH0sICInKCcgaXMgdW5zdXBwb3J0ZWQiKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgY29uc3QgUkUgaW52YWxpZCgiXj8iKTsKKyAgfSwgIic/JyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuIik7Cit9CisKKy8vIFRlc3RzIFJFOjpGdWxsTWF0Y2goKS4KK1RFU1QoUkVUZXN0LCBGdWxsTWF0Y2hXb3JrcykgeworICBjb25zdCBSRSBlbXB0eSgiIik7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goIiIsIGVtcHR5KSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKCJhIiwgZW1wdHkpKTsKKworICBjb25zdCBSRSByZTEoImEiKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaCgiYSIsIHJlMSkpOworCisgIGNvbnN0IFJFIHJlKCJhLip6Iik7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goImF6IiwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaCgiYXh5eiIsIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKCJiYXoiLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaCgiYXp5IiwgcmUpKTsKK30KKworLy8gVGVzdHMgUkU6OlBhcnRpYWxNYXRjaCgpLgorVEVTVChSRVRlc3QsIFBhcnRpYWxNYXRjaFdvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KCIiKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaCgiIiwgZW1wdHkpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaCgiYSIsIGVtcHR5KSk7CisKKyAgY29uc3QgUkUgcmUoImEuKnoiKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaCgiYXoiLCByZSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJheHl6IiwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaCgiYmF6IiwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaCgiYXp5IiwgcmUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpQYXJ0aWFsTWF0Y2goInp6YSIsIHJlKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfVVNFU19QT1NJWF9SRQorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKK1RFU1QoQ2FwdHVyZVRlc3QsIENhcHR1cmVzU3Rkb3V0KSB7CisgIENhcHR1cmVTdGRvdXQoKTsKKyAgZnByaW50ZihzdGRvdXQsICJhYmMiKTsKKyAgRVhQRUNUX1NUUkVRKCJhYmMiLCBHZXRDYXB0dXJlZFN0ZG91dCgpLmNfc3RyKCkpOworCisgIENhcHR1cmVTdGRvdXQoKTsKKyAgZnByaW50ZihzdGRvdXQsICJkZWYlY2doaSIsICdcMCcpOworICBFWFBFQ1RfRVEoOjpzdGQ6OnN0cmluZygiZGVmXDBnaGkiLCA3KSwgOjpzdGQ6OnN0cmluZyhHZXRDYXB0dXJlZFN0ZG91dCgpKSk7Cit9CisKK1RFU1QoQ2FwdHVyZVRlc3QsIENhcHR1cmVzU3RkZXJyKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgZnByaW50ZihzdGRlcnIsICJqa2wiKTsKKyAgRVhQRUNUX1NUUkVRKCJqa2wiLCBHZXRDYXB0dXJlZFN0ZGVycigpLmNfc3RyKCkpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgZnByaW50ZihzdGRlcnIsICJqa2wlY21ubyIsICdcMCcpOworICBFWFBFQ1RfRVEoOjpzdGQ6OnN0cmluZygiamtsXDBtbm8iLCA3KSwgOjpzdGQ6OnN0cmluZyhHZXRDYXB0dXJlZFN0ZGVycigpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3Rkb3V0IGFuZCBzdGRlcnIgY2FwdHVyZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLgorVEVTVChDYXB0dXJlVGVzdCwgQ2FwdHVyZXNTdGRvdXRBbmRTdGRlcnIpIHsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIGZwcmludGYoc3Rkb3V0LCAicHFyIik7CisgIGZwcmludGYoc3RkZXJyLCAic3R1Iik7CisgIEVYUEVDVF9TVFJFUSgicHFyIiwgR2V0Q2FwdHVyZWRTdGRvdXQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHUiLCBHZXRDYXB0dXJlZFN0ZGVycigpLmNfc3RyKCkpOworfQorCitURVNUKENhcHR1cmVEZWF0aFRlc3QsIENhbm5vdFJlZW50ZXJTdGRvdXRDYXB0dXJlKSB7CisgIENhcHR1cmVTdGRvdXQoKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChDYXB0dXJlU3Rkb3V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgb25lIHN0ZG91dCBjYXB0dXJlciBjYW4gZXhpc3QgYXQgYSB0aW1lIik7CisgIEdldENhcHR1cmVkU3Rkb3V0KCk7CisKKyAgLy8gV2UgY2Fubm90IHRlc3Qgc3RkZXJyIGNhcHR1cmluZyB1c2luZyBkZWF0aCB0ZXN0cyBhcyB0aGV5IHVzZSBpdAorICAvLyB0aGVtc2VsdmVzLgorfQorCisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9ySW5pdGlhbGl6ZXNUb0RlZmF1bHRWYWx1ZXMpIHsKKyAgVGhyZWFkTG9jYWw8aW50PiB0MTsKKyAgRVhQRUNUX0VRKDAsIHQxLmdldCgpKTsKKworICBUaHJlYWRMb2NhbDx2b2lkKj4gdDI7CisgIEVYUEVDVF9UUlVFKHQyLmdldCgpID09IE5VTEwpOworfQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgU2luZ2xlUGFyYW1Db25zdHJ1Y3RvckluaXRpYWxpemVzVG9QYXJhbSkgeworICBUaHJlYWRMb2NhbDxpbnQ+IHQxKDEyMyk7CisgIEVYUEVDVF9FUSgxMjMsIHQxLmdldCgpKTsKKworICBpbnQgaSA9IDA7CisgIFRocmVhZExvY2FsPGludCo+IHQyKCZpKTsKKyAgRVhQRUNUX0VRKCZpLCB0Mi5nZXQoKSk7Cit9CisKK2NsYXNzIE5vRGVmYXVsdENvbnRydWN0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTm9EZWZhdWx0Q29udHJ1Y3Rvcihjb25zdCBjaGFyKikge30KKyAgTm9EZWZhdWx0Q29udHJ1Y3Rvcihjb25zdCBOb0RlZmF1bHRDb250cnVjdG9yJikge30KK307CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBWYWx1ZURlZmF1bHRDb250cnVjdG9ySXNOb3RSZXF1aXJlZEZvclBhcmFtVmVyc2lvbikgeworICBUaHJlYWRMb2NhbDxOb0RlZmF1bHRDb250cnVjdG9yPiBiYXIoTm9EZWZhdWx0Q29udHJ1Y3RvcigiZm9vIikpOworICBiYXIucG9pbnRlcigpOworfQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgR2V0QW5kUG9pbnRlclJldHVyblNhbWVWYWx1ZSkgeworICBUaHJlYWRMb2NhbDxzdGQ6OnN0cmluZz4gdGhyZWFkX2xvY2FsX3N0cmluZzsKKworICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCksICYodGhyZWFkX2xvY2FsX3N0cmluZy5nZXQoKSkpOworCisgIC8vIFZlcmlmaWVzIHRoZSBjb25kaXRpb24gc3RpbGwgaG9sZHMgYWZ0ZXIgY2FsbGluZyBzZXQuCisgIHRocmVhZF9sb2NhbF9zdHJpbmcuc2V0KCJmb28iKTsKKyAgRVhQRUNUX0VRKHRocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpLCAmKHRocmVhZF9sb2NhbF9zdHJpbmcuZ2V0KCkpKTsKK30KKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIFBvaW50ZXJBbmRDb25zdFBvaW50ZXJSZXR1cm5TYW1lVmFsdWUpIHsKKyAgVGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+IHRocmVhZF9sb2NhbF9zdHJpbmc7CisgIGNvbnN0IFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiYgY29uc3RfdGhyZWFkX2xvY2FsX3N0cmluZyA9CisgICAgICB0aHJlYWRfbG9jYWxfc3RyaW5nOworCisgIEVYUEVDVF9FUSh0aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSwgY29uc3RfdGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCkpOworCisgIHRocmVhZF9sb2NhbF9zdHJpbmcuc2V0KCJmb28iKTsKKyAgRVhQRUNUX0VRKHRocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpLCBjb25zdF90aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSk7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisKK3ZvaWQgQWRkVHdvKGludCogcGFyYW0pIHsgKnBhcmFtICs9IDI7IH0KKworVEVTVChUaHJlYWRXaXRoUGFyYW1UZXN0LCBDb25zdHJ1Y3RvckV4ZWN1dGVzVGhyZWFkRnVuYykgeworICBpbnQgaSA9IDQwOworICBUaHJlYWRXaXRoUGFyYW08aW50Kj4gdGhyZWFkKCZBZGRUd28sICZpLCBOVUxMKTsKKyAgdGhyZWFkLkpvaW4oKTsKKyAgRVhQRUNUX0VRKDQyLCBpKTsKK30KKworVEVTVChNdXRleERlYXRoVGVzdCwgQXNzZXJ0SGVsZFNob3VsZEFzc2VydFdoZW5Ob3RMb2NrZWQpIHsKKyAgLy8gQXNzZXJ0SGVsZCgpIGlzIGZsYWt5IG9ubHkgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlIHRocmVhZHMgYWNjZXNzaW5nCisgIC8vIHRoZSBsb2NrLiBJbiB0aGlzIGNhc2UsIHRoZSB0ZXN0IGlzIHJvYnVzdC4KKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7CisgICAgTXV0ZXggbTsKKyAgICB7IE11dGV4TG9jayBsb2NrKCZtKTsgfQorICAgIG0uQXNzZXJ0SGVsZCgpOworICB9LAorICAidGhyZWFkIC4qaG9sZCIpOworfQorCitURVNUKE11dGV4VGVzdCwgQXNzZXJ0SGVsZFNob3VsZE5vdEFzc2VydFdoZW5Mb2NrZWQpIHsKKyAgTXV0ZXggbTsKKyAgTXV0ZXhMb2NrIGxvY2soJm0pOworICBtLkFzc2VydEhlbGQoKTsKK30KKworY2xhc3MgQXRvbWljQ291bnRlcldpdGhNdXRleCB7CisgcHVibGljOgorICBleHBsaWNpdCBBdG9taWNDb3VudGVyV2l0aE11dGV4KE11dGV4KiBtdXRleCkgOgorICAgIHZhbHVlXygwKSwgbXV0ZXhfKG11dGV4KSwgcmFuZG9tXyg0Mikge30KKworICB2b2lkIEluY3JlbWVudCgpIHsKKyAgICBNdXRleExvY2sgbG9jayhtdXRleF8pOworICAgIGludCB0ZW1wID0gdmFsdWVfOworICAgIHsKKyAgICAgIC8vIExvY2tpbmcgYSBtdXRleCBwdXRzIHVwIGEgbWVtb3J5IGJhcnJpZXIsIHByZXZlbnRpbmcgcmVhZHMgYW5kCisgICAgICAvLyB3cml0ZXMgdG8gdmFsdWVfIHJlYXJyYW5nZWQgd2hlbiBvYnNlcnZlZCBmcm9tIG90aGVyIHRocmVhZHMuCisgICAgICAvLworICAgICAgLy8gV2UgY2Fubm90IHVzZSBNdXRleCBhbmQgTXV0ZXhMb2NrIGhlcmUgb3IgcmVseSBvbiB0aGVpciBtZW1vcnkKKyAgICAgIC8vIGJhcnJpZXIgZnVuY3Rpb25hbGl0eSBhcyB3ZSBhcmUgdGVzdGluZyB0aGVtIGhlcmUuCisgICAgICBwdGhyZWFkX211dGV4X3QgbWVtb3J5X2JhcnJpZXJfbXV0ZXg7CisgICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXygKKyAgICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm1lbW9yeV9iYXJyaWVyX211dGV4LCBOVUxMKSk7CisgICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm1lbW9yeV9iYXJyaWVyX211dGV4KSk7CisKKyAgICAgIFNsZWVwTWlsbGlzZWNvbmRzKHJhbmRvbV8uR2VuZXJhdGUoMzApKTsKKworICAgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm1lbW9yeV9iYXJyaWVyX211dGV4KSk7CisgICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1lbW9yeV9iYXJyaWVyX211dGV4KSk7CisgICAgfQorICAgIHZhbHVlXyA9IHRlbXAgKyAxOworICB9CisgIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgcHJpdmF0ZToKKyAgdm9sYXRpbGUgaW50IHZhbHVlXzsKKyAgTXV0ZXgqIGNvbnN0IG11dGV4XzsgIC8vIFByb3RlY3RzIHZhbHVlXy4KKyAgUmFuZG9tICAgICAgIHJhbmRvbV87Cit9OworCit2b2lkIENvdW50aW5nVGhyZWFkRnVuYyhwYWlyPEF0b21pY0NvdW50ZXJXaXRoTXV0ZXgqLCBpbnQ+IHBhcmFtKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW0uc2Vjb25kOyArK2kpCisgICAgICBwYXJhbS5maXJzdC0+SW5jcmVtZW50KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIG11dGV4IG9ubHkgbGV0cyBvbmUgdGhyZWFkIGF0IGEgdGltZSB0byBsb2NrIGl0LgorVEVTVChNdXRleFRlc3QsIE9ubHlPbmVUaHJlYWRDYW5Mb2NrQXRBVGltZSkgeworICBNdXRleCBtdXRleDsKKyAgQXRvbWljQ291bnRlcldpdGhNdXRleCBsb2NrZWRfY291bnRlcigmbXV0ZXgpOworCisgIHR5cGVkZWYgVGhyZWFkV2l0aFBhcmFtPHBhaXI8QXRvbWljQ291bnRlcldpdGhNdXRleCosIGludD4gPiBUaHJlYWRUeXBlOworICBjb25zdCBpbnQga0N5Y2xlQ291bnQgPSAyMDsKKyAgY29uc3QgaW50IGtUaHJlYWRDb3VudCA9IDc7CisgIHNjb3BlZF9wdHI8VGhyZWFkVHlwZT4gY291bnRpbmdfdGhyZWFkc1trVGhyZWFkQ291bnRdOworICBOb3RpZmljYXRpb24gdGhyZWFkc19jYW5fc3RhcnQ7CisgIC8vIENyZWF0ZXMgYW5kIHJ1bnMga1RocmVhZENvdW50IHRocmVhZHMgdGhhdCBpbmNyZW1lbnQgbG9ja2VkX2NvdW50ZXIKKyAgLy8ga0N5Y2xlQ291bnQgdGltZXMgZWFjaC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkQ291bnQ7ICsraSkgeworICAgIGNvdW50aW5nX3RocmVhZHNbaV0ucmVzZXQobmV3IFRocmVhZFR5cGUoJkNvdW50aW5nVGhyZWFkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigmbG9ja2VkX2NvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0N5Y2xlQ291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocmVhZHNfY2FuX3N0YXJ0KSk7CisgIH0KKyAgdGhyZWFkc19jYW5fc3RhcnQuTm90aWZ5KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZENvdW50OyArK2kpCisgICAgY291bnRpbmdfdGhyZWFkc1tpXS0+Sm9pbigpOworCisgIC8vIElmIHRoZSBtdXRleCBsZXRzIG1vcmUgdGhhbiBvbmUgdGhyZWFkIHRvIGluY3JlbWVudCB0aGUgY291bnRlciBhdCBhCisgIC8vIHRpbWUsIHRoZXkgYXJlIGxpa2VseSB0byBlbmNvdW50ZXIgYSByYWNlIGNvbmRpdGlvbiBhbmQgaGF2ZSBzb21lCisgIC8vIGluY3JlbWVudHMgb3ZlcndyaXR0ZW4sIHJlc3VsdGluZyBpbiB0aGUgbG93ZXIgdGhlbiBleHBlY3RlZCBjb3VudGVyCisgIC8vIHZhbHVlLgorICBFWFBFQ1RfRVEoa0N5Y2xlQ291bnQgKiBrVGhyZWFkQ291bnQsIGxvY2tlZF9jb3VudGVyLnZhbHVlKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUnVuRnJvbVRocmVhZCh2b2lkIChmdW5jKShUKSwgVCBwYXJhbSkgeworICBUaHJlYWRXaXRoUGFyYW08VD4gdGhyZWFkKGZ1bmMsIHBhcmFtLCBOVUxMKTsKKyAgdGhyZWFkLkpvaW4oKTsKK30KKwordm9pZCBSZXRyaWV2ZVRocmVhZExvY2FsVmFsdWUoCisgICAgcGFpcjxUaHJlYWRMb2NhbDxzdGQ6OnN0cmluZz4qLCBzdGQ6OnN0cmluZyo+IHBhcmFtKSB7CisgICpwYXJhbS5zZWNvbmQgPSBwYXJhbS5maXJzdC0+Z2V0KCk7Cit9CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBQYXJhbWV0ZXJpemVkQ29uc3RydWN0b3JTZXRzRGVmYXVsdCkgeworICBUaHJlYWRMb2NhbDxzdGQ6OnN0cmluZz4gdGhyZWFkX2xvY2FsX3N0cmluZygiZm9vIik7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiwgdGhyZWFkX2xvY2FsX3N0cmluZy5nZXQoKS5jX3N0cigpKTsKKworICB0aHJlYWRfbG9jYWxfc3RyaW5nLnNldCgiYmFyIik7CisgIEVYUEVDVF9TVFJFUSgiYmFyIiwgdGhyZWFkX2xvY2FsX3N0cmluZy5nZXQoKS5jX3N0cigpKTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIFJ1bkZyb21UaHJlYWQoJlJldHJpZXZlVGhyZWFkTG9jYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoJnRocmVhZF9sb2NhbF9zdHJpbmcsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLCByZXN1bHQuY19zdHIoKSk7Cit9CisKKy8vIERlc3RydWN0b3JUcmFja2VyIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgaXRzIGluc3RhbmNlcyBoYXZlIGJlZW4KKy8vIGRlc3Ryb3llZC4KK3N0YXRpYyBzdGQ6OnZlY3Rvcjxib29sPiBnX2Rlc3Ryb3llZDsKKworY2xhc3MgRGVzdHJ1Y3RvclRyYWNrZXIgeworIHB1YmxpYzoKKyAgRGVzdHJ1Y3RvclRyYWNrZXIoKSA6IGluZGV4XyhHZXROZXdJbmRleCgpKSB7fQorICBEZXN0cnVjdG9yVHJhY2tlcihjb25zdCBEZXN0cnVjdG9yVHJhY2tlciYgLyogcmhzICovKQorICAgICAgOiBpbmRleF8oR2V0TmV3SW5kZXgoKSkge30KKyAgfkRlc3RydWN0b3JUcmFja2VyKCkgeworICAgIC8vIFdlIG5ldmVyIGFjY2VzcyBnX2Rlc3Ryb3llZCBjb25jdXJyZW50bHksIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAvLyBwcm90ZWN0IHRoZSB3cml0ZSBvcGVyYXRpb24gdW5kZXIgYSBtdXRleC4KKyAgICBnX2Rlc3Ryb3llZFtpbmRleF9dID0gdHJ1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBHZXROZXdJbmRleCgpIHsKKyAgICBnX2Rlc3Ryb3llZC5wdXNoX2JhY2soZmFsc2UpOworICAgIHJldHVybiBnX2Rlc3Ryb3llZC5zaXplKCkgLSAxOworICB9CisgIGNvbnN0IGludCBpbmRleF87Cit9OworCit0eXBlZGVmIFRocmVhZExvY2FsPERlc3RydWN0b3JUcmFja2VyPiogVGhyZWFkUGFyYW07CisKK3ZvaWQgQ2FsbFRocmVhZExvY2FsR2V0KFRocmVhZFBhcmFtIHRocmVhZF9sb2NhbF9wYXJhbSkgeworICB0aHJlYWRfbG9jYWxfcGFyYW0tPmdldCgpOworfQorCisvLyBUZXN0cyB0aGF0IHdoZW4gYSBUaHJlYWRMb2NhbCBvYmplY3QgZGllcyBpbiBhIHRocmVhZCwgaXQgZGVzdHJveXMKKy8vIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhhdCB0aHJlYWQuCitURVNUKFRocmVhZExvY2FsVGVzdCwgRGVzdHJveXNNYW5hZ2VkT2JqZWN0Rm9yT3duVGhyZWFkV2hlbkR5aW5nKSB7CisgIGdfZGVzdHJveWVkLmNsZWFyKCk7CisKKyAgeworICAgIC8vIFRoZSBuZXh0IGxpbmUgZGVmYXVsdCBjb25zdHJ1Y3RzIGEgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGFzCisgICAgLy8gdGhlIGRlZmF1bHQgdmFsdWUgb2Ygb2JqZWN0cyBtYW5hZ2VkIGJ5IHRocmVhZF9sb2NhbF90cmFja2VyLgorICAgIFRocmVhZExvY2FsPERlc3RydWN0b3JUcmFja2VyPiB0aHJlYWRfbG9jYWxfdHJhY2tlcjsKKyAgICBBU1NFUlRfRVEoMVUsIGdfZGVzdHJveWVkLnNpemUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKGdfZGVzdHJveWVkWzBdKTsKKworICAgIC8vIFRoaXMgY3JlYXRlcyBhbm90aGVyIERlc3RydWN0b3JUcmFja2VyIG9iamVjdCBmb3IgdGhlIG1haW4gdGhyZWFkLgorICAgIHRocmVhZF9sb2NhbF90cmFja2VyLmdldCgpOworICAgIEFTU0VSVF9FUSgyVSwgZ19kZXN0cm95ZWQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UoZ19kZXN0cm95ZWRbMF0pOworICAgIEFTU0VSVF9GQUxTRShnX2Rlc3Ryb3llZFsxXSk7CisgIH0KKworICAvLyBOb3cgdGhyZWFkX2xvY2FsX3RyYWNrZXIgaGFzIGRpZWQuICBJdCBzaG91bGQgaGF2ZSBkZXN0cm95ZWQgYm90aCB0aGUKKyAgLy8gZGVmYXVsdCB2YWx1ZSBzaGFyZWQgYnkgYWxsIHRocmVhZHMgYW5kIHRoZSB2YWx1ZSBmb3IgdGhlIG1haW4KKyAgLy8gdGhyZWFkLgorICBBU1NFUlRfRVEoMlUsIGdfZGVzdHJveWVkLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKGdfZGVzdHJveWVkWzBdKTsKKyAgRVhQRUNUX1RSVUUoZ19kZXN0cm95ZWRbMV0pOworCisgIGdfZGVzdHJveWVkLmNsZWFyKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBhIHRocmVhZCBleGl0cywgdGhlIHRocmVhZC1sb2NhbCBvYmplY3QgZm9yIHRoYXQKKy8vIHRocmVhZCBpcyBkZXN0cm95ZWQuCitURVNUKFRocmVhZExvY2FsVGVzdCwgRGVzdHJveXNNYW5hZ2VkT2JqZWN0QXRUaHJlYWRFeGl0KSB7CisgIGdfZGVzdHJveWVkLmNsZWFyKCk7CisKKyAgeworICAgIC8vIFRoZSBuZXh0IGxpbmUgZGVmYXVsdCBjb25zdHJ1Y3RzIGEgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGFzCisgICAgLy8gdGhlIGRlZmF1bHQgdmFsdWUgb2Ygb2JqZWN0cyBtYW5hZ2VkIGJ5IHRocmVhZF9sb2NhbF90cmFja2VyLgorICAgIFRocmVhZExvY2FsPERlc3RydWN0b3JUcmFja2VyPiB0aHJlYWRfbG9jYWxfdHJhY2tlcjsKKyAgICBBU1NFUlRfRVEoMVUsIGdfZGVzdHJveWVkLnNpemUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKGdfZGVzdHJveWVkWzBdKTsKKworICAgIC8vIFRoaXMgY3JlYXRlcyBhbm90aGVyIERlc3RydWN0b3JUcmFja2VyIG9iamVjdCBpbiB0aGUgbmV3IHRocmVhZC4KKyAgICBUaHJlYWRXaXRoUGFyYW08VGhyZWFkUGFyYW0+IHRocmVhZCgKKyAgICAgICAgJkNhbGxUaHJlYWRMb2NhbEdldCwgJnRocmVhZF9sb2NhbF90cmFja2VyLCBOVUxMKTsKKyAgICB0aHJlYWQuSm9pbigpOworCisgICAgLy8gTm93IHRoZSBuZXcgdGhyZWFkIGhhcyBleGl0ZWQuICBUaGUgcGVyLXRocmVhZCBvYmplY3QgZm9yIGl0CisgICAgLy8gc2hvdWxkIGhhdmUgYmVlbiBkZXN0cm95ZWQuCisgICAgQVNTRVJUX0VRKDJVLCBnX2Rlc3Ryb3llZC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShnX2Rlc3Ryb3llZFswXSk7CisgICAgQVNTRVJUX1RSVUUoZ19kZXN0cm95ZWRbMV0pOworICB9CisKKyAgLy8gTm93IHRocmVhZF9sb2NhbF90cmFja2VyIGhhcyBkaWVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbgorICAvLyBkZXN0cm95ZWQgdG9vLgorICBBU1NFUlRfRVEoMlUsIGdfZGVzdHJveWVkLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKGdfZGVzdHJveWVkWzBdKTsKKyAgRVhQRUNUX1RSVUUoZ19kZXN0cm95ZWRbMV0pOworCisgIGdfZGVzdHJveWVkLmNsZWFyKCk7Cit9CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBUaHJlYWRMb2NhbE11dGF0aW9uc0FmZmVjdE9ubHlDdXJyZW50VGhyZWFkKSB7CisgIFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiB0aHJlYWRfbG9jYWxfc3RyaW5nOworICB0aHJlYWRfbG9jYWxfc3RyaW5nLnNldCgiRm9vIik7CisgIEVYUEVDVF9TVFJFUSgiRm9vIiwgdGhyZWFkX2xvY2FsX3N0cmluZy5nZXQoKS5jX3N0cigpKTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIFJ1bkZyb21UaHJlYWQoJlJldHJpZXZlVGhyZWFkTG9jYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoJnRocmVhZF9sb2NhbF9zdHJpbmcsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0LmVtcHR5KCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtcHJpbnRlcnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYxMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MKQEAgLTAsMCArMSwxNTYxIEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlci4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBoYXNoX21hcCBhbmQgaGFzaF9zZXQgYXJlIGF2YWlsYWJsZSB1bmRlciBWaXN1YWwgQysrLgorI2lmIF9NU0NfVkVSCisjIGRlZmluZSBHVEVTVF9IQVNfSEFTSF9NQVBfIDEgIC8vIEluZGljYXRlcyB0aGF0IGhhc2hfbWFwIGlzIGF2YWlsYWJsZS4KKyMgaW5jbHVkZSA8aGFzaF9tYXA+ICAgICAgICAgICAgLy8gTk9MSU5UCisjIGRlZmluZSBHVEVTVF9IQVNfSEFTSF9TRVRfIDEgIC8vIEluZGljYXRlcyB0aGF0IGhhc2hfc2V0IGlzIGF2YWlsYWJsZS4KKyMgaW5jbHVkZSA8aGFzaF9zZXQ+ICAgICAgICAgICAgLy8gTk9MSU5UCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gU29tZSB1c2VyLWRlZmluZWQgdHlwZXMgZm9yIHRlc3RpbmcgdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyLgorCisvLyBBbiBhbm9ueW1vdXMgZW51bSB0eXBlLgorZW51bSBBbm9ueW1vdXNFbnVtIHsKKyAga0FFMSA9IC0xLAorICBrQUUyID0gMQorfTsKKworLy8gQW4gZW51bSB3aXRob3V0IGEgdXNlci1kZWZpbmVkIHByaW50ZXIuCitlbnVtIEVudW1XaXRob3V0UHJpbnRlciB7CisgIGtFV1AxID0gLTIsCisgIGtFV1AyID0gNDIKK307CisKKy8vIEFuIGVudW0gd2l0aCBhIDw8IG9wZXJhdG9yLgorZW51bSBFbnVtV2l0aFN0cmVhbWluZyB7CisgIGtFV1MxID0gMTAKK307CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBFbnVtV2l0aFN0cmVhbWluZyBlKSB7CisgIHJldHVybiBvcyA8PCAoZSA9PSBrRVdTMSA/ICJrRVdTMSIgOiAiaW52YWxpZCIpOworfQorCisvLyBBbiBlbnVtIHdpdGggYSBQcmludFRvKCkgZnVuY3Rpb24uCitlbnVtIEVudW1XaXRoUHJpbnRUbyB7CisgIGtFV1BUMSA9IDEKK307CisKK3ZvaWQgUHJpbnRUbyhFbnVtV2l0aFByaW50VG8gZSwgc3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgKGUgPT0ga0VXUFQxID8gImtFV1BUMSIgOiAiaW52YWxpZCIpOworfQorCisvLyBBIGNsYXNzIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludC4KK2NsYXNzIEJpZ2dlc3RJbnRDb252ZXJ0aWJsZSB7CisgcHVibGljOgorICBvcGVyYXRvciA6OnRlc3Rpbmc6OmludGVybmFsOjpCaWdnZXN0SW50KCkgY29uc3QgeyByZXR1cm4gNDI7IH0KK307CisKKy8vIEEgdXNlci1kZWZpbmVkIHVucHJpbnRhYmxlIGNsYXNzIHRlbXBsYXRlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbnByaW50YWJsZVRlbXBsYXRlSW5HbG9iYWwgeworIHB1YmxpYzoKKyAgVW5wcmludGFibGVUZW1wbGF0ZUluR2xvYmFsKCkgOiB2YWx1ZV8oKSB7fQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKworLy8gQSB1c2VyLWRlZmluZWQgc3RyZWFtYWJsZSB0eXBlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorY2xhc3MgU3RyZWFtYWJsZUluR2xvYmFsIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflN0cmVhbWFibGVJbkdsb2JhbCgpIHt9Cit9OworCitpbmxpbmUgdm9pZCBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywgY29uc3QgU3RyZWFtYWJsZUluR2xvYmFsJiAvKiB4ICovKSB7CisgIG9zIDw8ICJTdHJlYW1hYmxlSW5HbG9iYWwiOworfQorCit2b2lkIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJlYW1hYmxlSW5HbG9iYWwqIC8qIHggKi8pIHsKKyAgb3MgPDwgIlN0cmVhbWFibGVJbkdsb2JhbCoiOworfQorCituYW1lc3BhY2UgZm9vIHsKKworLy8gQSB1c2VyLWRlZmluZWQgdW5wcmludGFibGUgdHlwZSBpbiBhIHVzZXIgbmFtZXNwYWNlLgorY2xhc3MgVW5wcmludGFibGVJbkZvbyB7CisgcHVibGljOgorICBVbnByaW50YWJsZUluRm9vKCkgOiB6XygwKSB7IG1lbWNweSh4eV8sICJceEVGXHgxMlx4MFx4MFx4MzRceEFCXHgwXHgwIiwgOCk7IH0KKyBwcml2YXRlOgorICBjaGFyIHh5X1s4XTsKKyAgZG91YmxlIHpfOworfTsKKworLy8gQSB1c2VyLWRlZmluZWQgcHJpbnRhYmxlIHR5cGUgaW4gYSB1c2VyLWNob3NlbiBuYW1lc3BhY2UuCitzdHJ1Y3QgUHJpbnRhYmxlVmlhUHJpbnRUbyB7CisgIFByaW50YWJsZVZpYVByaW50VG8oKSA6IHZhbHVlKCkge30KKyAgaW50IHZhbHVlOworfTsKKwordm9pZCBQcmludFRvKGNvbnN0IFByaW50YWJsZVZpYVByaW50VG8mIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIlByaW50YWJsZVZpYVByaW50VG86ICIgPDwgeC52YWx1ZTsKK30KKworLy8gQSB0eXBlIHdpdGggYSB1c2VyLWRlZmluZWQgPDwgZm9yIHByaW50aW5nIGl0cyBwb2ludGVyLgorc3RydWN0IFBvaW50ZXJQcmludGFibGUgeworfTsKKworOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlclByaW50YWJsZSogLyogeCAqLykgeworICByZXR1cm4gb3MgPDwgIlBvaW50ZXJQcmludGFibGUqIjsKK30KKworLy8gQSB1c2VyLWRlZmluZWQgcHJpbnRhYmxlIGNsYXNzIHRlbXBsYXRlIGluIGEgdXNlci1jaG9zZW4gbmFtZXNwYWNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlKGNvbnN0IFQmIGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9CisKKyAgY29uc3QgVCYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyBwcml2YXRlOgorICBUIHZhbHVlXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQcmludFRvKGNvbnN0IFByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZTxUPiYgeCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAiUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlOiAiIDw8IHgudmFsdWUoKTsKK30KKworLy8gQSB1c2VyLWRlZmluZWQgc3RyZWFtYWJsZSBjbGFzcyB0ZW1wbGF0ZSBpbiBhIHVzZXIgbmFtZXNwYWNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbyB7CisgcHVibGljOgorICBTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbygpIDogdmFsdWVfKCkge30KKworICBjb25zdCBUJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbWFibGVUZW1wbGF0ZUluRm9vPFQ+JiB4KSB7CisgIHJldHVybiBvcyA8PCAiU3RyZWFtYWJsZVRlbXBsYXRlSW5Gb286ICIgPDwgeC52YWx1ZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZm9vCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBndGVzdF9wcmludGVyc190ZXN0IHsKKwordXNpbmcgOjpzdGQ6OmRlcXVlOwordXNpbmcgOjpzdGQ6Omxpc3Q7Cit1c2luZyA6OnN0ZDo6bWFrZV9wYWlyOwordXNpbmcgOjpzdGQ6Om1hcDsKK3VzaW5nIDo6c3RkOjptdWx0aW1hcDsKK3VzaW5nIDo6c3RkOjptdWx0aXNldDsKK3VzaW5nIDo6c3RkOjpwYWlyOwordXNpbmcgOjpzdGQ6OnNldDsKK3VzaW5nIDo6c3RkOjp2ZWN0b3I7Cit1c2luZyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmc7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2U7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZ3M7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludDsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6a1JlZmVyZW5jZTsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZzsKKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKK3VzaW5nIDo6c3RkOjp0cjE6Om1ha2VfdHVwbGU7Cit1c2luZyA6OnN0ZDo6dHIxOjp0dXBsZTsKKyNlbmRpZgorCisjaWYgX01TQ19WRVIKKy8vIE1TVkMgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMgaW4gdGhlIDo6c3RkZXh0IG5hbWVzcGFjZSB3aGlsZQorLy8gZ2NjIGRlZmluZXMgdGhlbSBpbiB0aGUgOjogbmFtZXNwYWNlLiAgTm90ZSB0aGF0IHRoZXkgYXJlIG5vdCBwYXJ0CisvLyBvZiB0aGUgQysrIHN0YW5kYXJkLgordXNpbmcgOjpzdGRleHQ6Omhhc2hfbWFwOwordXNpbmcgOjpzdGRleHQ6Omhhc2hfc2V0OwordXNpbmcgOjpzdGRleHQ6Omhhc2hfbXVsdGltYXA7Cit1c2luZyA6OnN0ZGV4dDo6aGFzaF9tdWx0aXNldDsKKyNlbmRpZgorCisvLyBQcmludHMgYSB2YWx1ZSB0byBhIHN0cmluZyB1c2luZyB0aGUgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIuICBUaGlzCisvLyBpcyBhIGhlbHBlciBmb3IgdGVzdGluZyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGZvciB2YXJpb3VzIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJpbmcgUHJpbnQoY29uc3QgVCYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsICZzcyk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gUHJpbnRzIGEgdmFsdWUgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byBhIHN0cmluZywgdXNpbmcgdGhlIHVuaXZlcnNhbAorLy8gdmFsdWUgcHJpbnRlci4gIFRoaXMgaXMgYSBoZWxwZXIgZm9yIHRlc3RpbmcKKy8vIFVuaXZlcnNhbFByaW50ZXI8VCY+OjpQcmludCgpIGZvciB2YXJpb3VzIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJpbmcgUHJpbnRCeVJlZihjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxQcmludGVyPFQmPjo6UHJpbnQodmFsdWUsICZzcyk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdmFyaW91cyBlbnVtIHR5cGVzLgorCitURVNUKFByaW50RW51bVRlc3QsIEFub255bW91c0VudW0pIHsKKyAgRVhQRUNUX0VRKCItMSIsIFByaW50KGtBRTEpKTsKKyAgRVhQRUNUX0VRKCIxIiwgUHJpbnQoa0FFMikpOworfQorCitURVNUKFByaW50RW51bVRlc3QsIEVudW1XaXRob3V0UHJpbnRlcikgeworICBFWFBFQ1RfRVEoIi0yIiwgUHJpbnQoa0VXUDEpKTsKKyAgRVhQRUNUX0VRKCI0MiIsIFByaW50KGtFV1AyKSk7Cit9CisKK1RFU1QoUHJpbnRFbnVtVGVzdCwgRW51bVdpdGhTdHJlYW1pbmcpIHsKKyAgRVhQRUNUX0VRKCJrRVdTMSIsIFByaW50KGtFV1MxKSk7CisgIEVYUEVDVF9FUSgiaW52YWxpZCIsIFByaW50KHN0YXRpY19jYXN0PEVudW1XaXRoU3RyZWFtaW5nPigwKSkpOworfQorCitURVNUKFByaW50RW51bVRlc3QsIEVudW1XaXRoUHJpbnRUbykgeworICBFWFBFQ1RfRVEoImtFV1BUMSIsIFByaW50KGtFV1BUMSkpOworICBFWFBFQ1RfRVEoImludmFsaWQiLCBQcmludChzdGF0aWNfY2FzdDxFbnVtV2l0aFByaW50VG8+KDApKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgY2xhc3MgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LgorCitURVNUKFByaW50Q2xhc3NUZXN0LCBCaWdnZXN0SW50Q29udmVydGlibGUpIHsKKyAgRVhQRUNUX0VRKCI0MiIsIFByaW50KEJpZ2dlc3RJbnRDb252ZXJ0aWJsZSgpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHZhcmlvdXMgY2hhciB0eXBlcy4KKworLy8gY2hhci4KK1RFU1QoUHJpbnRDaGFyVGVzdCwgUGxhaW5DaGFyKSB7CisgIEVYUEVDVF9FUSgiJ1xcMCciLCBQcmludCgnXDAnKSk7CisgIEVYUEVDVF9FUSgiJ1xcJycgKDM5LCAweDI3KSIsIFByaW50KCdcJycpKTsKKyAgRVhQRUNUX0VRKCInXCInICgzNCwgMHgyMikiLCBQcmludCgnIicpKTsKKyAgRVhQRUNUX0VRKCInPycgKDYzLCAweDNGKSIsIFByaW50KCc/JykpOworICBFWFBFQ1RfRVEoIidcXFxcJyAoOTIsIDB4NUMpIiwgUHJpbnQoJ1xcJykpOworICBFWFBFQ1RfRVEoIidcXGEnICg3KSIsIFByaW50KCdcYScpKTsKKyAgRVhQRUNUX0VRKCInXFxiJyAoOCkiLCBQcmludCgnXGInKSk7CisgIEVYUEVDVF9FUSgiJ1xcZicgKDEyLCAweEMpIiwgUHJpbnQoJ1xmJykpOworICBFWFBFQ1RfRVEoIidcXG4nICgxMCwgMHhBKSIsIFByaW50KCdcbicpKTsKKyAgRVhQRUNUX0VRKCInXFxyJyAoMTMsIDB4RCkiLCBQcmludCgnXHInKSk7CisgIEVYUEVDVF9FUSgiJ1xcdCcgKDkpIiwgUHJpbnQoJ1x0JykpOworICBFWFBFQ1RfRVEoIidcXHYnICgxMSwgMHhCKSIsIFByaW50KCdcdicpKTsKKyAgRVhQRUNUX0VRKCInXFx4N0YnICgxMjcpIiwgUHJpbnQoJ1x4N0YnKSk7CisgIEVYUEVDVF9FUSgiJ1xceEZGJyAoMjU1KSIsIFByaW50KCdceEZGJykpOworICBFWFBFQ1RfRVEoIicgJyAoMzIsIDB4MjApIiwgUHJpbnQoJyAnKSk7CisgIEVYUEVDVF9FUSgiJ2EnICg5NywgMHg2MSkiLCBQcmludCgnYScpKTsKK30KKworLy8gc2lnbmVkIGNoYXIuCitURVNUKFByaW50Q2hhclRlc3QsIFNpZ25lZENoYXIpIHsKKyAgRVhQRUNUX0VRKCInXFwwJyIsIFByaW50KHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPignXDAnKSkpOworICBFWFBFQ1RfRVEoIidcXHhDRScgKC01MCkiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KC01MCkpKTsKK30KKworLy8gdW5zaWduZWQgY2hhci4KK1RFU1QoUHJpbnRDaGFyVGVzdCwgVW5zaWduZWRDaGFyKSB7CisgIEVYUEVDVF9FUSgiJ1xcMCciLCBQcmludChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPignXDAnKSkpOworICBFWFBFQ1RfRVEoIidiJyAoOTgsIDB4NjIpIiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCdiJykpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgb3RoZXIgc2ltcGxlLCBidWlsdC1pbiB0eXBlcy4KKworLy8gYm9vbC4KK1RFU1QoUHJpbnRCdWlsdEluVHlwZVRlc3QsIEJvb2wpIHsKKyAgRVhQRUNUX0VRKCJmYWxzZSIsIFByaW50KGZhbHNlKSk7CisgIEVYUEVDVF9FUSgidHJ1ZSIsIFByaW50KHRydWUpKTsKK30KKworLy8gd2NoYXJfdC4KK1RFU1QoUHJpbnRCdWlsdEluVHlwZVRlc3QsIFdjaGFyX3QpIHsKKyAgRVhQRUNUX0VRKCJMJ1xcMCciLCBQcmludChMJ1wwJykpOworICBFWFBFQ1RfRVEoIkwnXFwnJyAoMzksIDB4MjcpIiwgUHJpbnQoTCdcJycpKTsKKyAgRVhQRUNUX0VRKCJMJ1wiJyAoMzQsIDB4MjIpIiwgUHJpbnQoTCciJykpOworICBFWFBFQ1RfRVEoIkwnPycgKDYzLCAweDNGKSIsIFByaW50KEwnPycpKTsKKyAgRVhQRUNUX0VRKCJMJ1xcXFwnICg5MiwgMHg1QykiLCBQcmludChMJ1xcJykpOworICBFWFBFQ1RfRVEoIkwnXFxhJyAoNykiLCBQcmludChMJ1xhJykpOworICBFWFBFQ1RfRVEoIkwnXFxiJyAoOCkiLCBQcmludChMJ1xiJykpOworICBFWFBFQ1RfRVEoIkwnXFxmJyAoMTIsIDB4QykiLCBQcmludChMJ1xmJykpOworICBFWFBFQ1RfRVEoIkwnXFxuJyAoMTAsIDB4QSkiLCBQcmludChMJ1xuJykpOworICBFWFBFQ1RfRVEoIkwnXFxyJyAoMTMsIDB4RCkiLCBQcmludChMJ1xyJykpOworICBFWFBFQ1RfRVEoIkwnXFx0JyAoOSkiLCBQcmludChMJ1x0JykpOworICBFWFBFQ1RfRVEoIkwnXFx2JyAoMTEsIDB4QikiLCBQcmludChMJ1x2JykpOworICBFWFBFQ1RfRVEoIkwnXFx4N0YnICgxMjcpIiwgUHJpbnQoTCdceDdGJykpOworICBFWFBFQ1RfRVEoIkwnXFx4RkYnICgyNTUpIiwgUHJpbnQoTCdceEZGJykpOworICBFWFBFQ1RfRVEoIkwnICcgKDMyLCAweDIwKSIsIFByaW50KEwnICcpKTsKKyAgRVhQRUNUX0VRKCJMJ2EnICg5NywgMHg2MSkiLCBQcmludChMJ2EnKSk7CisgIEVYUEVDVF9FUSgiTCdcXHg1NzYnICgxMzk4KSIsIFByaW50KHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4NTc2KSkpOworICBFWFBFQ1RfRVEoIkwnXFx4Qzc0RCcgKDUxMDIxKSIsIFByaW50KHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4Qzc0RCkpKTsKK30KKworLy8gVGVzdCB0aGF0IEludDY0IHByb3ZpZGVzIG1vcmUgc3RvcmFnZSB0aGFuIHdjaGFyX3QuCitURVNUKFByaW50VHlwZVNpemVUZXN0LCBXY2hhcl90KSB7CisgIEVYUEVDVF9MVChzaXplb2Yod2NoYXJfdCksIHNpemVvZih0ZXN0aW5nOjppbnRlcm5hbDo6SW50NjQpKTsKK30KKworLy8gVmFyaW91cyBpbnRlZ2VyIHR5cGVzLgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgSW50ZWdlcikgeworICBFWFBFQ1RfRVEoIidcXHhGRicgKDI1NSkiLCBQcmludChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigyNTUpKSk7ICAvLyB1aW50OAorICBFWFBFQ1RfRVEoIidcXHg4MCcgKC0xMjgpIiwgUHJpbnQoc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KC0xMjgpKSk7ICAvLyBpbnQ4CisgIEVYUEVDVF9FUSgiNjU1MzUiLCBQcmludChVU0hSVF9NQVgpKTsgIC8vIHVpbnQxNgorICBFWFBFQ1RfRVEoIi0zMjc2OCIsIFByaW50KFNIUlRfTUlOKSk7ICAvLyBpbnQxNgorICBFWFBFQ1RfRVEoIjQyOTQ5NjcyOTUiLCBQcmludChVSU5UX01BWCkpOyAgLy8gdWludDMyCisgIEVYUEVDVF9FUSgiLTIxNDc0ODM2NDgiLCBQcmludChJTlRfTUlOKSk7ICAvLyBpbnQzMgorICBFWFBFQ1RfRVEoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PHRlc3Rpbmc6OmludGVybmFsOjpVSW50NjQ+KC0xKSkpOyAgLy8gdWludDY0CisgIEVYUEVDVF9FUSgiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8dGVzdGluZzo6aW50ZXJuYWw6OkludDY0PigxKSA8PCA2MykpOyAgLy8gaW50NjQKK30KKworLy8gU2l6ZSB0eXBlcy4KK1RFU1QoUHJpbnRCdWlsdEluVHlwZVRlc3QsIFNpemVfdCkgeworICBFWFBFQ1RfRVEoIjEiLCBQcmludChzaXplb2YoJ2EnKSkpOyAgLy8gc2l6ZV90LgorI2lmICFHVEVTVF9PU19XSU5ET1dTCisgIC8vIFdpbmRvd3MgaGFzIG5vIHNzaXplX3QgdHlwZS4KKyAgRVhQRUNUX0VRKCItMiIsIFByaW50KHN0YXRpY19jYXN0PHNzaXplX3Q+KC0yKSkpOyAgLy8gc3NpemVfdC4KKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKK30KKworLy8gRmxvYXRpbmctcG9pbnRzLgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgRmxvYXRpbmdQb2ludHMpIHsKKyAgRVhQRUNUX0VRKCIxLjUiLCBQcmludCgxLjVmKSk7ICAgLy8gZmxvYXQKKyAgRVhQRUNUX0VRKCItMi41IiwgUHJpbnQoLTIuNSkpOyAgLy8gZG91YmxlCit9CisKKy8vIFNpbmNlIDo6c3RkOjpzdHJpbmdzdHJlYW06Om9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqKSBmb3JtYXRzIHRoZSBwb2ludGVyCisvLyBvdXRwdXQgZGlmZmVyZW50bHkgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzLCB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGUgZXhwZWN0ZWQKKy8vIG91dHB1dCBmaXJzdCBhbmQgdXNlIGl0IGFzIG91ciBleHBlY3RhdGlvbi4KK3N0YXRpYyBzdHJpbmcgUHJpbnRQb2ludGVyKGNvbnN0IHZvaWQgKnApIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBleHBlY3RlZF9yZXN1bHRfc3RyZWFtOworICBleHBlY3RlZF9yZXN1bHRfc3RyZWFtIDw8IHA7CisgIHJldHVybiBleHBlY3RlZF9yZXN1bHRfc3RyZWFtLnN0cigpOworfQorCisvLyBUZXN0cyBwcmludGluZyBDIHN0cmluZ3MuCisKKy8vIGNvbnN0IGNoYXIqLgorVEVTVChQcmludENTdHJpbmdUZXN0LCBDb25zdCkgeworICBjb25zdCBjaGFyKiBwID0gIldvcmxkIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gXCJXb3JsZFwiIiwgUHJpbnQocCkpOworfQorCisvLyBjaGFyKi4KK1RFU1QoUHJpbnRDU3RyaW5nVGVzdCwgTm9uQ29uc3QpIHsKKyAgY2hhciBwW10gPSAiSGkiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBcIkhpXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8Y2hhcio+KHApKSk7Cit9CisKKy8vIE5VTEwgQyBzdHJpbmcuCitURVNUKFByaW50Q1N0cmluZ1Rlc3QsIE51bGwpIHsKKyAgY29uc3QgY2hhciogcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gVGVzdHMgdGhhdCBDIHN0cmluZ3MgYXJlIGVzY2FwZWQgcHJvcGVybHkuCitURVNUKFByaW50Q1N0cmluZ1Rlc3QsIEVzY2FwZXNQcm9wZXJseSkgeworICBjb25zdCBjaGFyKiBwID0gIidcIj9cXFxhXGJcZlxuXHJcdFx2XHg3Rlx4RkYgYSI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIFwiJ1xcXCI/XFxcXFxcYVxcYlxcZiIKKyAgICAgICAgICAgICJcXG5cXHJcXHRcXHZcXHg3RlxceEZGIGFcIiIsCisgICAgICAgICAgICBQcmludChwKSk7Cit9CisKKworCisvLyBNU1ZDIGNvbXBpbGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIGRlZmluZSB3aGFyX3QgYXMgYSB0eXBlZGVmCisvLyBvZiB1bnNpZ25lZCBzaG9ydC4gRGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0IHdjaGFyX3QqIGluIHRoYXQgY2FzZQorLy8gd291bGQgY2F1c2UgcG9pbnRlcnMgdG8gdW5zaWduZWQgc2hvcnRzIGJlIHByaW50ZWQgYXMgd2lkZSBzdHJpbmdzLAorLy8gcG9zc2libHkgYWNjZXNzaW5nIG1vcmUgbWVtb3J5IHRoYW4gaW50ZW5kZWQgYW5kIGNhdXNpbmcgaW52YWxpZAorLy8gbWVtb3J5IGFjY2Vzc2VzLiBNU1ZDIGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgc3ltYm9sIHdoZW4KKy8vIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYXMgYSBuYXRpdmUgdHlwZS4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKKworLy8gY29uc3Qgd2NoYXJfdCouCitURVNUKFByaW50V2lkZUNTdHJpbmdUZXN0LCBDb25zdCkgeworICBjb25zdCB3Y2hhcl90KiBwID0gTCJXb3JsZCI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIExcIldvcmxkXCIiLCBQcmludChwKSk7Cit9CisKKy8vIHdjaGFyX3QqLgorVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgTm9uQ29uc3QpIHsKKyAgd2NoYXJfdCBwW10gPSBMIkhpIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gTFwiSGlcIiIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx3Y2hhcl90Kj4ocCkpKTsKK30KKworLy8gTlVMTCB3aWRlIEMgc3RyaW5nLgorVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgTnVsbCkgeworICBjb25zdCB3Y2hhcl90KiBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyB0aGF0IHdpZGUgQyBzdHJpbmdzIGFyZSBlc2NhcGVkIHByb3Blcmx5LgorVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgRXNjYXBlc1Byb3Blcmx5KSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0geydcJycsICciJywgJz8nLCAnXFwnLCAnXGEnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLAorICAgICAgICAgICAgICAgICAgICAgICAnXHQnLCAnXHYnLCAweEQzLCAweDU3NiwgMHg4RDMsIDB4Qzc0RCwgJyAnLCAnYScsICdcMCd9OworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHMpICsgIiBwb2ludGluZyB0byBMXCInXFxcIj9cXFxcXFxhXFxiXFxmIgorICAgICAgICAgICAgIlxcblxcclxcdFxcdlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RCBhXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KHMpKSk7Cit9CisjZW5kaWYgIC8vIG5hdGl2ZSB3Y2hhcl90CisKKy8vIFRlc3RzIHByaW50aW5nIHBvaW50ZXJzIHRvIG90aGVyIGNoYXIgdHlwZXMuCisKKy8vIHNpZ25lZCBjaGFyKi4KK1RFU1QoUHJpbnRDaGFyUG9pbnRlclRlc3QsIFNpZ25lZENoYXIpIHsKKyAgc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PHNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBjb25zdCBzaWduZWQgY2hhciouCitURVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBDb25zdFNpZ25lZENoYXIpIHsKKyAgc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PHNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyB1bnNpZ25lZCBjaGFyKi4KK1RFU1QoUHJpbnRDaGFyUG9pbnRlclRlc3QsIFVuc2lnbmVkQ2hhcikgeworICB1bnNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBjb25zdCB1bnNpZ25lZCBjaGFyKi4KK1RFU1QoUHJpbnRDaGFyUG9pbnRlclRlc3QsIENvbnN0VW5zaWduZWRDaGFyKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigweDEyMzQpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHBvaW50ZXJzIHRvIHNpbXBsZSwgYnVpbHQtaW4gdHlwZXMuCisKKy8vIGJvb2wqLgorVEVTVChQcmludFBvaW50ZXJUb0J1aWx0SW5UeXBlVGVzdCwgQm9vbCkgeworICBib29sKiBwID0gcmVpbnRlcnByZXRfY2FzdDxib29sKj4oMHhBQkNEKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyB2b2lkKi4KK1RFU1QoUHJpbnRQb2ludGVyVG9CdWlsdEluVHlwZVRlc3QsIFZvaWQpIHsKKyAgdm9pZCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KDB4QUJDRCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gY29uc3Qgdm9pZCouCitURVNUKFByaW50UG9pbnRlclRvQnVpbHRJblR5cGVUZXN0LCBDb25zdFZvaWQpIHsKKyAgY29uc3Qgdm9pZCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KDB4QUJDRCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgcG9pbnRlcnMgdG8gcG9pbnRlcnMuCitURVNUKFByaW50UG9pbnRlclRvUG9pbnRlclRlc3QsIEludFBvaW50ZXJQb2ludGVyKSB7CisgIGludCoqIHAgPSByZWludGVycHJldF9jYXN0PGludCoqPigweEFCQ0QpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIChub24tbWVtYmVyKSBmdW5jdGlvbiBwb2ludGVycy4KKwordm9pZCBNeUZ1bmN0aW9uKGludCAvKiBuICovKSB7fQorCitURVNUKFByaW50UG9pbnRlclRlc3QsIE5vbk1lbWJlckZ1bmN0aW9uUG9pbnRlcikgeworICAvLyBXZSBjYW5ub3QgZGlyZWN0bHkgY2FzdCAmTXlGdW5jdGlvbiB0byBjb25zdCB2b2lkKiBiZWNhdXNlIHRoZQorICAvLyBzdGFuZGFyZCBkaXNhbGxvd3MgY2FzdGluZyBiZXR3ZWVuIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBhbmQKKyAgLy8gcG9pbnRlcnMgdG8gb2JqZWN0cywgYW5kIHNvbWUgY29tcGlsZXJzIChlLmcuIEdDQyAzLjQpIGVuZm9yY2UKKyAgLy8gdGhpcyBsaW1pdGF0aW9uLgorICBFWFBFQ1RfRVEoCisgICAgICBQcmludFBvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6QmlnZ2VzdEludD4oJk15RnVuY3Rpb24pKSksCisgICAgICBQcmludCgmTXlGdW5jdGlvbikpOworICBpbnQgKCpwKShib29sKSA9IE5VTEw7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBBbiBhc3NlcnRpb24gcHJlZGljYXRlIGRldGVybWluaW5nIHdoZXRoZXIgYSBvbmUgc3RyaW5nIGlzIGEgcHJlZml4IGZvcgorLy8gYW5vdGhlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IEhhc1ByZWZpeChjb25zdCBTdHJpbmdUeXBlJiBzdHIsIGNvbnN0IFN0cmluZ1R5cGUmIHByZWZpeCkgeworICBpZiAoc3RyLmZpbmQocHJlZml4LCAwKSA9PSAwKQorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgY29uc3QgYm9vbCBpc193aWRlX3N0cmluZyA9IHNpemVvZihwcmVmaXhbMF0pID4gMTsKKyAgY29uc3QgY2hhciogY29uc3QgYmVnaW5fc3RyaW5nX3F1b3RlID0gaXNfd2lkZV9zdHJpbmcgPyAiTFwiIiA6ICJcIiI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBwcmVmaXggPDwgIlwiIGlzIG5vdCBhIHByZWZpeCBvZiAiCisgICAgICA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgc3RyIDw8ICJcIlxuIjsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgbWVtYmVyIHZhcmlhYmxlIHBvaW50ZXJzLiAgQWx0aG91Z2ggdGhleSBhcmUgY2FsbGVkCisvLyBwb2ludGVycywgdGhleSBkb24ndCBwb2ludCB0byBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLgorLy8gVGhlaXIgcmVwcmVzZW50YXRpb24gaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIFRodXMgdGhleSB3aWxsIGJlCisvLyBwcmludGVkIGFzIHJhdyBieXRlcy4KKworc3RydWN0IEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Gb28oKSB7fQorICBpbnQgTXlNZXRob2QoY2hhciB4KSB7IHJldHVybiB4ICsgMTsgfQorICB2aXJ0dWFsIGNoYXIgTXlWaXJ0dWFsTWV0aG9kKGludCAvKiBuICovKSB7IHJldHVybiAnYSc7IH0KKworICBpbnQgdmFsdWU7Cit9OworCitURVNUKFByaW50UG9pbnRlclRlc3QsIE1lbWJlclZhcmlhYmxlUG9pbnRlcikgeworICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoUHJpbnQoJkZvbzo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKCZGb286OnZhbHVlKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKKyAgaW50IChGb286OipwKSA9IE5VTEw7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KHApLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKHApKSArICItYnl0ZSBvYmplY3QgIikpOworfQorCisvLyBUZXN0cyBwcmludGluZyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuICBBbHRob3VnaCB0aGV5IGFyZSBjYWxsZWQKKy8vIHBvaW50ZXJzLCB0aGV5IGRvbid0IHBvaW50IHRvIGEgbG9jYXRpb24gaW4gdGhlIGFkZHJlc3Mgc3BhY2UuCisvLyBUaGVpciByZXByZXNlbnRhdGlvbiBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGh1cyB0aGV5IHdpbGwgYmUKKy8vIHByaW50ZWQgYXMgcmF3IGJ5dGVzLgorVEVTVChQcmludFBvaW50ZXJUZXN0LCBNZW1iZXJGdW5jdGlvblBvaW50ZXIpIHsKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KCZGb286Ok15TWV0aG9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZigmRm9vOjpNeU1ldGhvZCkpICsgIi1ieXRlIG9iamVjdCAiKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzUHJlZml4KFByaW50KCZGb286Ok15VmlydHVhbE1ldGhvZCksCisgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKCgmRm9vOjpNeVZpcnR1YWxNZXRob2QpKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKKyAgaW50IChGb286OipwKShjaGFyKSA9IE5VTEw7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KHApLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKHApKSArICItYnl0ZSBvYmplY3QgIikpOworfQorCisvLyBUZXN0cyBwcmludGluZyBDIGFycmF5cy4KKworLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBQcmludCgpIGlzIHRoYXQgaXQgZW5zdXJlcyB0aGF0IHRoZQorLy8gYXJndW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitzdHJpbmcgUHJpbnRBcnJheUhlbHBlcihUICgmYSlbTl0pIHsKKyAgcmV0dXJuIFByaW50KGEpOworfQorCisvLyBPbmUtZGltZW5zaW9uYWwgYXJyYXkuCitURVNUKFByaW50QXJyYXlUZXN0LCBPbmVEaW1lbnNpb25hbEFycmF5KSB7CisgIGludCBhWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CisgIEVYUEVDVF9FUSgieyAxLCAyLCAzLCA0LCA1IH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gVHdvLWRpbWVuc2lvbmFsIGFycmF5LgorVEVTVChQcmludEFycmF5VGVzdCwgVHdvRGltZW5zaW9uYWxBcnJheSkgeworICBpbnQgYVsyXVs1XSA9IHsKKyAgICB7IDEsIDIsIDMsIDQsIDUgfSwKKyAgICB7IDYsIDcsIDgsIDksIDAgfQorICB9OworICBFWFBFQ1RfRVEoInsgeyAxLCAyLCAzLCA0LCA1IH0sIHsgNiwgNywgOCwgOSwgMCB9IH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gQXJyYXkgb2YgY29uc3QgZWxlbWVudHMuCitURVNUKFByaW50QXJyYXlUZXN0LCBDb25zdEFycmF5KSB7CisgIGNvbnN0IGJvb2wgYVsxXSA9IHsgZmFsc2UgfTsKKyAgRVhQRUNUX0VRKCJ7IGZhbHNlIH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gY2hhciBhcnJheSB3aXRob3V0IHRlcm1pbmF0aW5nIE5VTC4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIENoYXJBcnJheVdpdGhOb1Rlcm1pbmF0aW5nTnVsKSB7CisgIC8vIEFycmF5IGEgY29udGFpbnMgJ1wwJyBpbiB0aGUgbWlkZGxlIGFuZCBkb2Vzbid0IGVuZCB3aXRoICdcMCcuCisgIGNoYXIgYVtdID0geyAnSCcsICdcMCcsICdpJyB9OworICBFWFBFQ1RfRVEoIlwiSFxcMGlcIiAobm8gdGVybWluYXRpbmcgTlVMKSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBjb25zdCBjaGFyIGFycmF5IHdpdGggdGVybWluYXRpbmcgTlVMLgorVEVTVChQcmludEFycmF5VGVzdCwgQ29uc3RDaGFyQXJyYXlXaXRoVGVybWluYXRpbmdOdWwpIHsKKyAgY29uc3QgY2hhciBhW10gPSAiXDBIaSI7CisgIEVYUEVDVF9FUSgiXCJcXDBIaVwiIiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIGNvbnN0IHdjaGFyX3QgYXJyYXkgd2l0aG91dCB0ZXJtaW5hdGluZyBOVUwuCitURVNUKFByaW50QXJyYXlUZXN0LCBXQ2hhckFycmF5V2l0aE5vVGVybWluYXRpbmdOdWwpIHsKKyAgLy8gQXJyYXkgYSBjb250YWlucyAnXDAnIGluIHRoZSBtaWRkbGUgYW5kIGRvZXNuJ3QgZW5kIHdpdGggJ1wwJy4KKyAgY29uc3Qgd2NoYXJfdCBhW10gPSB7IEwnSCcsIEwnXDAnLCBMJ2knIH07CisgIEVYUEVDVF9FUSgiTFwiSFxcMGlcIiAobm8gdGVybWluYXRpbmcgTlVMKSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyB3Y2hhcl90IGFycmF5IHdpdGggdGVybWluYXRpbmcgTlVMLgorVEVTVChQcmludEFycmF5VGVzdCwgV0NvbnN0Q2hhckFycmF5V2l0aFRlcm1pbmF0aW5nTnVsKSB7CisgIGNvbnN0IHdjaGFyX3QgYVtdID0gTCJcMEhpIjsKKyAgRVhQRUNUX0VRKCJMXCJcXDBIaVwiIiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIEFycmF5IG9mIG9iamVjdHMuCitURVNUKFByaW50QXJyYXlUZXN0LCBPYmplY3RBcnJheSkgeworICBzdHJpbmcgYVszXSA9IHsgIkhpIiwgIkhlbGxvIiwgIk5pIGhhbyIgfTsKKyAgRVhQRUNUX0VRKCJ7IFwiSGlcIiwgXCJIZWxsb1wiLCBcIk5pIGhhb1wiIH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gQXJyYXkgd2l0aCBtYW55IGVsZW1lbnRzLgorVEVTVChQcmludEFycmF5VGVzdCwgQmlnQXJyYXkpIHsKKyAgaW50IGFbMTAwXSA9IHsgMSwgMiwgMyB9OworICBFWFBFQ1RfRVEoInsgMSwgMiwgMywgMCwgMCwgMCwgMCwgMCwgLi4uLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0iLAorICAgICAgICAgICAgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIDo6c3RyaW5nIGFuZCA6OnN0ZDo6c3RyaW5nLgorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKy8vIDo6c3RyaW5nLgorVEVTVChQcmludFN0cmluZ1Rlc3QsIFN0cmluZ0luR2xvYmFsTmFtZXNwYWNlKSB7CisgIGNvbnN0IGNoYXIgc1tdID0gIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceDdGXHhGRiBhIjsKKyAgY29uc3QgOjpzdHJpbmcgc3RyKHMsIHNpemVvZihzKSk7CisgIEVYUEVDVF9FUSgiXCInXFxcIj9cXFxcXFxhXFxiXFxmXFxuXFwwXFxyXFx0XFx2XFx4N0ZcXHhGRiBhXFwwXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RyKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKy8vIDo6c3RkOjpzdHJpbmcuCitURVNUKFByaW50U3RyaW5nVGVzdCwgU3RyaW5nSW5TdGROYW1lc3BhY2UpIHsKKyAgY29uc3QgY2hhciBzW10gPSAiJ1wiP1xcXGFcYlxmXG5cMFxyXHRcdlx4N0ZceEZGIGEiOworICBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cihzLCBzaXplb2YocykpOworICBFWFBFQ1RfRVEoIlwiJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcMFxcclxcdFxcdlxceDdGXFx4RkYgYVxcMFwiIiwKKyAgICAgICAgICAgIFByaW50KHN0cikpOworfQorCitURVNUKFByaW50U3RyaW5nVGVzdCwgU3RyaW5nQW1iaWd1b3VzSGV4KSB7CisgIC8vICJceDZCQU5BTkEiIGlzIGFtYmlndW91cywgaXQgY2FuIGJlIGludGVycHJldGVkIGFzIHN0YXJ0aW5nIHdpdGggZWl0aGVyIG9mOgorICAvLyAnXHg2JywgJ1x4NkInLCBvciAnXHg2QkEnLgorCisgIC8vIGEgaGV4IGVzY2FwaW5nIHNlcXVlbmNlIGZvbGxvd2luZyBieSBhIGRlY2ltYWwgZGlnaXQKKyAgRVhQRUNUX0VRKCJcIjBcXHgxMlwiIFwiM1wiIiwgUHJpbnQoOjpzdGQ6OnN0cmluZygiMFx4MTIiICIzIikpKTsKKyAgLy8gYSBoZXggZXNjYXBpbmcgc2VxdWVuY2UgZm9sbG93aW5nIGJ5IGEgaGV4IGRpZ2l0IChsb3dlci1jYXNlKQorICBFWFBFQ1RfRVEoIlwibW1cXHg2XCIgXCJiYW5hbmFzXCIiLCBQcmludCg6OnN0ZDo6c3RyaW5nKCJtbVx4NiIgImJhbmFuYXMiKSkpOworICAvLyBhIGhleCBlc2NhcGluZyBzZXF1ZW5jZSBmb2xsb3dpbmcgYnkgYSBoZXggZGlnaXQgKHVwcGVyLWNhc2UpCisgIEVYUEVDVF9FUSgiXCJOT01cXHg2XCIgXCJCQU5BTkFcIiIsIFByaW50KDo6c3RkOjpzdHJpbmcoIk5PTVx4NiIgIkJBTkFOQSIpKSk7CisgIC8vIGEgaGV4IGVzY2FwaW5nIHNlcXVlbmNlIGZvbGxvd2luZyBieSBhIG5vbi14ZGlnaXQKKyAgRVhQRUNUX0VRKCJcIiFcXHg1LSFcIiIsIFByaW50KDo6c3RkOjpzdHJpbmcoIiFceDUtISIpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIDo6d3N0cmluZyBhbmQgOjpzdGQ6OndzdHJpbmcuCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIDo6d3N0cmluZy4KK1RFU1QoUHJpbnRXaWRlU3RyaW5nVGVzdCwgU3RyaW5nSW5HbG9iYWxOYW1lc3BhY2UpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSBMIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceEQzXHg1NzZceDhEM1x4Qzc0RCBhIjsKKyAgY29uc3QgOjp3c3RyaW5nIHN0cihzLCBzaXplb2Yocykvc2l6ZW9mKHdjaGFyX3QpKTsKKyAgRVhQRUNUX0VRKCJMXCInXFxcIj9cXFxcXFxhXFxiXFxmXFxuXFwwXFxyXFx0XFx2IgorICAgICAgICAgICAgIlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RCBhXFwwXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RyKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyA6OnN0ZDo6d3N0cmluZy4KK1RFU1QoUHJpbnRXaWRlU3RyaW5nVGVzdCwgU3RyaW5nSW5TdGROYW1lc3BhY2UpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSBMIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceEQzXHg1NzZceDhEM1x4Qzc0RCBhIjsKKyAgY29uc3QgOjpzdGQ6OndzdHJpbmcgc3RyKHMsIHNpemVvZihzKS9zaXplb2Yod2NoYXJfdCkpOworICBFWFBFQ1RfRVEoIkxcIidcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXDBcXHJcXHRcXHYiCisgICAgICAgICAgICAiXFx4RDNcXHg1NzZcXHg4RDNcXHhDNzREIGFcXDBcIiIsCisgICAgICAgICAgICBQcmludChzdHIpKTsKK30KKworVEVTVChQcmludFdpZGVTdHJpbmdUZXN0LCBTdHJpbmdBbWJpZ3VvdXNIZXgpIHsKKyAgLy8gc2FtZSBmb3Igd2lkZSBzdHJpbmdzLgorICBFWFBFQ1RfRVEoIkxcIjBcXHgxMlwiIExcIjNcIiIsIFByaW50KDo6c3RkOjp3c3RyaW5nKEwiMFx4MTIiIEwiMyIpKSk7CisgIEVYUEVDVF9FUSgiTFwibW1cXHg2XCIgTFwiYmFuYW5hc1wiIiwKKyAgICAgICAgICAgIFByaW50KDo6c3RkOjp3c3RyaW5nKEwibW1ceDYiIEwiYmFuYW5hcyIpKSk7CisgIEVYUEVDVF9FUSgiTFwiTk9NXFx4NlwiIExcIkJBTkFOQVwiIiwKKyAgICAgICAgICAgIFByaW50KDo6c3RkOjp3c3RyaW5nKEwiTk9NXHg2IiBMIkJBTkFOQSIpKSk7CisgIEVYUEVDVF9FUSgiTFwiIVxceDUtIVwiIiwgUHJpbnQoOjpzdGQ6OndzdHJpbmcoTCIhXHg1LSEiKSkpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgcHJpbnRpbmcgdHlwZXMgdGhhdCBzdXBwb3J0IGdlbmVyaWMgc3RyZWFtaW5nIChpLmUuIHN0cmVhbWluZworLy8gdG8gc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+IGZvciBhbnkgdmFsaWQgQ2hhciBhbmQKKy8vIENoYXJUcmFpdHMgdHlwZXMpLgorCisvLyBUZXN0cyBwcmludGluZyBhIG5vbi10ZW1wbGF0ZSB0eXBlIHRoYXQgc3VwcG9ydHMgZ2VuZXJpYyBzdHJlYW1pbmcuCisKK2NsYXNzIEFsbG93c0dlbmVyaWNTdHJlYW1pbmcge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyVHJhaXRzPgorc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsCisgICAgY29uc3QgQWxsb3dzR2VuZXJpY1N0cmVhbWluZyYgLyogYSAqLykgeworICByZXR1cm4gb3MgPDwgIkFsbG93c0dlbmVyaWNTdHJlYW1pbmciOworfQorCitURVNUKFByaW50VHlwZVdpdGhHZW5lcmljU3RyZWFtaW5nVGVzdCwgTm9uVGVtcGxhdGVUeXBlKSB7CisgIEFsbG93c0dlbmVyaWNTdHJlYW1pbmcgYTsKKyAgRVhQRUNUX0VRKCJBbGxvd3NHZW5lcmljU3RyZWFtaW5nIiwgUHJpbnQoYSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBhIHRlbXBsYXRlIHR5cGUgdGhhdCBzdXBwb3J0cyBnZW5lcmljIHN0cmVhbWluZy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGUge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyVHJhaXRzLCB0eXBlbmFtZSBUPgorc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsCisgICAgY29uc3QgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlPFQ+JiAvKiBhICovKSB7CisgIHJldHVybiBvcyA8PCAiQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlIjsKK30KKworVEVTVChQcmludFR5cGVXaXRoR2VuZXJpY1N0cmVhbWluZ1Rlc3QsIFRlbXBsYXRlVHlwZSkgeworICBBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGU8aW50PiBhOworICBFWFBFQ1RfRVEoIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZSIsIFByaW50KGEpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgYSB0eXBlIHRoYXQgc3VwcG9ydHMgZ2VuZXJpYyBzdHJlYW1pbmcgYW5kIGNhbiBiZQorLy8gaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYW5vdGhlciBwcmludGFibGUgdHlwZS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGUgeworIHB1YmxpYzoKKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cywgdHlwZW5hbWUgVD4KK3N0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLAorICAgIGNvbnN0IEFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZTxUPiYgLyogYSAqLykgeworICByZXR1cm4gb3MgPDwgIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZSI7Cit9CisKK1RFU1QoUHJpbnRUeXBlV2l0aEdlbmVyaWNTdHJlYW1pbmdUZXN0LCBUeXBlSW1wbGljaXRseUNvbnZlcnRpYmxlKSB7CisgIEFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZTxpbnQ+IGE7CisgIEVYUEVDVF9FUSgiQWxsb3dzR2VuZXJpY1N0cmVhbWluZ0FuZEltcGxpY2l0Q29udmVyc2lvblRlbXBsYXRlIiwgUHJpbnQoYSkpOworfQorCisjaWYgR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KKworLy8gVGVzdHMgcHJpbnRpbmcgU3RyaW5nUGllY2UuCisKK1RFU1QoUHJpbnRTdHJpbmdQaWVjZVRlc3QsIFNpbXBsZVN0cmluZ1BpZWNlKSB7CisgIGNvbnN0IFN0cmluZ1BpZWNlIHNwID0gIkhlbGxvIjsKKyAgRVhQRUNUX0VRKCJcIkhlbGxvXCIiLCBQcmludChzcCkpOworfQorCitURVNUKFByaW50U3RyaW5nUGllY2VUZXN0LCBVbnByaW50YWJsZUNoYXJhY3RlcnMpIHsKKyAgY29uc3QgY2hhciBzdHJbXSA9ICJOVUwgKFwwKSBhbmQgXHJcdCI7CisgIGNvbnN0IFN0cmluZ1BpZWNlIHNwKHN0ciwgc2l6ZW9mKHN0cikgLSAxKTsKKyAgRVhQRUNUX0VRKCJcIk5VTCAoXFwwKSBhbmQgXFxyXFx0XCIiLCBQcmludChzcCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCisKKy8vIFRlc3RzIHByaW50aW5nIFNUTCBjb250YWluZXJzLgorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgRW1wdHlEZXF1ZSkgeworICBkZXF1ZTxjaGFyPiBlbXB0eTsKKyAgRVhQRUNUX0VRKCJ7fSIsIFByaW50KGVtcHR5KSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBOb25FbXB0eURlcXVlKSB7CisgIGRlcXVlPGludD4gbm9uX2VtcHR5OworICBub25fZW1wdHkucHVzaF9iYWNrKDEpOworICBub25fZW1wdHkucHVzaF9iYWNrKDMpOworICBFWFBFQ1RfRVEoInsgMSwgMyB9IiwgUHJpbnQobm9uX2VtcHR5KSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfSEFTSF9NQVBfCisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBPbmVFbGVtZW50SGFzaE1hcCkgeworICBoYXNoX21hcDxpbnQsIGNoYXI+IG1hcDE7CisgIG1hcDFbMV0gPSAnYSc7CisgIEVYUEVDVF9FUSgieyAoMSwgJ2EnICg5NywgMHg2MSkpIH0iLCBQcmludChtYXAxKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBIYXNoTXVsdGlNYXApIHsKKyAgaGFzaF9tdWx0aW1hcDxpbnQsIGJvb2w+IG1hcDE7CisgIG1hcDEuaW5zZXJ0KG1ha2VfcGFpcig1LCB0cnVlKSk7CisgIG1hcDEuaW5zZXJ0KG1ha2VfcGFpcig1LCBmYWxzZSkpOworCisgIC8vIEVsZW1lbnRzIG9mIGhhc2hfbXVsdGltYXAgY2FuIGJlIHByaW50ZWQgaW4gYW55IG9yZGVyLgorICBjb25zdCBzdHJpbmcgcmVzdWx0ID0gUHJpbnQobWFwMSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdCA9PSAieyAoNSwgdHJ1ZSksICg1LCBmYWxzZSkgfSIgfHwKKyAgICAgICAgICAgICAgcmVzdWx0ID09ICJ7ICg1LCBmYWxzZSksICg1LCB0cnVlKSB9IikKKyAgICAgICAgICAgICAgICAgIDw8ICIgd2hlcmUgUHJpbnQobWFwMSkgcmV0dXJucyBcIiIgPDwgcmVzdWx0IDw8ICJcIi4iOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19IQVNIX01BUF8KKworI2lmIEdURVNUX0hBU19IQVNIX1NFVF8KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEhhc2hTZXQpIHsKKyAgaGFzaF9zZXQ8c3RyaW5nPiBzZXQxOworICBzZXQxLmluc2VydCgiaGVsbG8iKTsKKyAgRVhQRUNUX0VRKCJ7IFwiaGVsbG9cIiB9IiwgUHJpbnQoc2V0MSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgSGFzaE11bHRpU2V0KSB7CisgIGNvbnN0IGludCBrU2l6ZSA9IDU7CisgIGludCBhW2tTaXplXSA9IHsgMSwgMSwgMiwgNSwgMSB9OworICBoYXNoX211bHRpc2V0PGludD4gc2V0MShhLCBhICsga1NpemUpOworCisgIC8vIEVsZW1lbnRzIG9mIGhhc2hfbXVsdGlzZXQgY2FuIGJlIHByaW50ZWQgaW4gYW55IG9yZGVyLgorICBjb25zdCBzdHJpbmcgcmVzdWx0ID0gUHJpbnQoc2V0MSk7CisgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9wYXR0ZXJuID0gInsgZCwgZCwgZCwgZCwgZCB9IjsgIC8vIGQgbWVhbnMgYSBkaWdpdC4KKworICAvLyBWZXJpZmllcyB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIHBhdHRlcm47IGFsc28gZXh0cmFjdHMKKyAgLy8gdGhlIG51bWJlcnMgaW4gdGhlIHJlc3VsdC4KKyAgQVNTRVJUX0VRKGV4cGVjdGVkX3BhdHRlcm4ubGVuZ3RoKCksIHJlc3VsdC5sZW5ndGgoKSk7CisgIHN0ZDo6dmVjdG9yPGludD4gbnVtYmVyczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gcmVzdWx0Lmxlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAoZXhwZWN0ZWRfcGF0dGVybltpXSA9PSAnZCcpIHsKKyAgICAgIEFTU0VSVF9ORShpc2RpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHJlc3VsdFtpXSkpLCAwKTsKKyAgICAgIG51bWJlcnMucHVzaF9iYWNrKHJlc3VsdFtpXSAtICcwJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVYUEVDVF9FUShleHBlY3RlZF9wYXR0ZXJuW2ldLCByZXN1bHRbaV0pIDw8ICIgd2hlcmUgcmVzdWx0IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdDsKKyAgICB9CisgIH0KKworICAvLyBNYWtlcyBzdXJlIHRoZSByZXN1bHQgY29udGFpbnMgdGhlIHJpZ2h0IG51bWJlcnMuCisgIHN0ZDo6c29ydChudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCkpOworICBzdGQ6OnNvcnQoYSwgYSArIGtTaXplKTsKKyAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChhLCBhICsga1NpemUsIG51bWJlcnMuYmVnaW4oKSkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19IQVNIX1NFVF8KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIExpc3QpIHsKKyAgY29uc3Qgc3RyaW5nIGFbXSA9IHsKKyAgICAiaGVsbG8iLAorICAgICJ3b3JsZCIKKyAgfTsKKyAgY29uc3QgbGlzdDxzdHJpbmc+IHN0cmluZ3MoYSwgYSArIDIpOworICBFWFBFQ1RfRVEoInsgXCJoZWxsb1wiLCBcIndvcmxkXCIgfSIsIFByaW50KHN0cmluZ3MpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE1hcCkgeworICBtYXA8aW50LCBib29sPiBtYXAxOworICBtYXAxWzFdID0gdHJ1ZTsKKyAgbWFwMVs1XSA9IGZhbHNlOworICBtYXAxWzNdID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKCJ7ICgxLCB0cnVlKSwgKDMsIHRydWUpLCAoNSwgZmFsc2UpIH0iLCBQcmludChtYXAxKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBNdWx0aU1hcCkgeworICBtdWx0aW1hcDxib29sLCBpbnQ+IG1hcDE7CisgIC8vIFRoZSBtYWtlX3BhaXIgdGVtcGxhdGUgZnVuY3Rpb24gd291bGQgZGVkdWNlIHRoZSB0eXBlIGFzCisgIC8vIHBhaXI8Ym9vbCwgaW50PiBoZXJlLCBhbmQgc2luY2UgdGhlIGtleSBwYXJ0IGluIGEgbXVsdGltYXAgaGFzIHRvCisgIC8vIGJlIGNvbnN0YW50LCB3aXRob3V0IGEgdGVtcGxhdGVkIGN0b3IgaW4gdGhlIHBhaXIgY2xhc3MgKGFzIGluCisgIC8vIGxpYkNzdGQgb24gU29sYXJpcyksIG1ha2VfcGFpciBjYWxsIHdvdWxkIGZhaWwgdG8gY29tcGlsZSBhcyBubworICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGZvdW5kLiAgVGh1cyBleHBsaWNpdCB0eXBlbmFtZSBpcyB1c2VkCisgIC8vIGhlcmUgaW5zdGVhZC4KKyAgbWFwMS5pbnNlcnQocGFpcjxjb25zdCBib29sLCBpbnQ+KHRydWUsIDApKTsKKyAgbWFwMS5pbnNlcnQocGFpcjxjb25zdCBib29sLCBpbnQ+KHRydWUsIDEpKTsKKyAgbWFwMS5pbnNlcnQocGFpcjxjb25zdCBib29sLCBpbnQ+KGZhbHNlLCAyKSk7CisgIEVYUEVDVF9FUSgieyAoZmFsc2UsIDIpLCAodHJ1ZSwgMCksICh0cnVlLCAxKSB9IiwgUHJpbnQobWFwMSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgU2V0KSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCBhW10gPSB7IDMsIDAsIDUgfTsKKyAgc2V0PHVuc2lnbmVkIGludD4gc2V0MShhLCBhICsgMyk7CisgIEVYUEVDVF9FUSgieyAwLCAzLCA1IH0iLCBQcmludChzZXQxKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBNdWx0aVNldCkgeworICBjb25zdCBpbnQgYVtdID0geyAxLCAxLCAyLCA1LCAxIH07CisgIG11bHRpc2V0PGludD4gc2V0MShhLCBhICsgNSk7CisgIEVYUEVDVF9FUSgieyAxLCAxLCAxLCAyLCA1IH0iLCBQcmludChzZXQxKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBQYWlyKSB7CisgIHBhaXI8Y29uc3QgYm9vbCwgaW50PiBwKHRydWUsIDUpOworICBFWFBFQ1RfRVEoIih0cnVlLCA1KSIsIFByaW50KHApKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFZlY3RvcikgeworICB2ZWN0b3I8aW50PiB2OworICB2LnB1c2hfYmFjaygxKTsKKyAgdi5wdXNoX2JhY2soMik7CisgIEVYUEVDVF9FUSgieyAxLCAyIH0iLCBQcmludCh2KSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBMb25nU2VxdWVuY2UpIHsKKyAgY29uc3QgaW50IGFbMTAwXSA9IHsgMSwgMiwgMyB9OworICBjb25zdCB2ZWN0b3I8aW50PiB2KGEsIGEgKyAxMDApOworICBFWFBFQ1RfRVEoInsgMSwgMiwgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIgorICAgICAgICAgICAgIjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC4uLiB9IiwgUHJpbnQodikpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTmVzdGVkQ29udGFpbmVyKSB7CisgIGNvbnN0IGludCBhMVtdID0geyAxLCAyIH07CisgIGNvbnN0IGludCBhMltdID0geyAzLCA0LCA1IH07CisgIGNvbnN0IGxpc3Q8aW50PiBsMShhMSwgYTEgKyAyKTsKKyAgY29uc3QgbGlzdDxpbnQ+IGwyKGEyLCBhMiArIDMpOworCisgIHZlY3RvcjxsaXN0PGludD4gPiB2OworICB2LnB1c2hfYmFjayhsMSk7CisgIHYucHVzaF9iYWNrKGwyKTsKKyAgRVhQRUNUX0VRKCJ7IHsgMSwgMiB9LCB7IDMsIDQsIDUgfSB9IiwgUHJpbnQodikpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgT25lRGltZW5zaW9uYWxOYXRpdmVBcnJheSkgeworICBjb25zdCBpbnQgYVszXSA9IHsgMSwgMiwgMyB9OworICBOYXRpdmVBcnJheTxpbnQ+IGIoYSwgMywga1JlZmVyZW5jZSk7CisgIEVYUEVDVF9FUSgieyAxLCAyLCAzIH0iLCBQcmludChiKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBUd29EaW1lbnNpb25hbE5hdGl2ZUFycmF5KSB7CisgIGNvbnN0IGludCBhWzJdWzNdID0geyB7IDEsIDIsIDMgfSwgeyA0LCA1LCA2IH0gfTsKKyAgTmF0aXZlQXJyYXk8aW50WzNdPiBiKGEsIDIsIGtSZWZlcmVuY2UpOworICBFWFBFQ1RfRVEoInsgeyAxLCAyLCAzIH0sIHsgNCwgNSwgNiB9IH0iLCBQcmludChiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBjbGFzcyBuYW1lZCBpdGVyYXRvciBpc24ndCB0cmVhdGVkIGFzIGEgY29udGFpbmVyLgorCitzdHJ1Y3QgaXRlcmF0b3IgeworICBjaGFyIHg7Cit9OworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgSXRlcmF0b3IpIHsKKyAgaXRlcmF0b3IgaXQgPSB7fTsKKyAgRVhQRUNUX0VRKCIxLWJ5dGUgb2JqZWN0IDwwMD4iLCBQcmludChpdCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgY2xhc3MgbmFtZWQgY29uc3RfaXRlcmF0b3IgaXNuJ3QgdHJlYXRlZCBhcyBhIGNvbnRhaW5lci4KKworc3RydWN0IGNvbnN0X2l0ZXJhdG9yIHsKKyAgY2hhciB4OworfTsKKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIENvbnN0SXRlcmF0b3IpIHsKKyAgY29uc3RfaXRlcmF0b3IgaXQgPSB7fTsKKyAgRVhQRUNUX0VRKCIxLWJ5dGUgb2JqZWN0IDwwMD4iLCBQcmludChpdCkpOworfQorCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorLy8gVGVzdHMgcHJpbnRpbmcgdHVwbGVzLgorCisvLyBUdXBsZXMgb2YgdmFyaW91cyBhcml0aWVzLgorVEVTVChQcmludFR1cGxlVGVzdCwgVmFyaW91c1NpemVzKSB7CisgIHR1cGxlPD4gdDA7CisgIEVYUEVDVF9FUSgiKCkiLCBQcmludCh0MCkpOworCisgIHR1cGxlPGludD4gdDEoNSk7CisgIEVYUEVDVF9FUSgiKDUpIiwgUHJpbnQodDEpKTsKKworICB0dXBsZTxjaGFyLCBib29sPiB0MignYScsIHRydWUpOworICBFWFBFQ1RfRVEoIignYScgKDk3LCAweDYxKSwgdHJ1ZSkiLCBQcmludCh0MikpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50PiB0MyhmYWxzZSwgMiwgMyk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzKSIsIFByaW50KHQzKSk7CisKKyAgdHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludD4gdDQoZmFsc2UsIDIsIDMsIDQpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCkiLCBQcmludCh0NCkpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2w+IHQ1KGZhbHNlLCAyLCAzLCA0LCB0cnVlKTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUpIiwgUHJpbnQodDUpKTsKKworICB0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQ+IHQ2KGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2KTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYpIiwgUHJpbnQodDYpKTsKKworICB0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQsIGludD4gdDcoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNykiLCBQcmludCh0NykpOworCisgIHR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50LCBib29sPiB0OCgKKyAgICAgIGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlKTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUpIiwgUHJpbnQodDgpKTsKKworICB0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQsIGludCwgYm9vbCwgaW50PiB0OSgKKyAgICAgIGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlLCA5KTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUsIDkpIiwgUHJpbnQodDkpKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBzdHIgPSAiOCI7CisgIC8vIFZDKysgMjAxMCdzIGltcGxlbWVudGF0aW9uIG9mIHR1cGxlIG9mIEMrKzB4IGlzIGRlZmljaWVudCwgcmVxdWlyaW5nCisgIC8vIGFuIGV4cGxpY2l0IHR5cGUgY2FzdCBvZiBOVUxMIHRvIGJlIHVzZWQuCisgIHR1cGxlPGJvb2wsIGNoYXIsIHNob3J0LCB0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIsICAvLyBOT0xJTlQKKyAgICAgIHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2NCwgZmxvYXQsIGRvdWJsZSwgY29uc3QgY2hhciosIHZvaWQqLCBzdHJpbmc+CisgICAgICB0MTAoZmFsc2UsICdhJywgMywgNCwgNSwgMS41RiwgLTIuNSwgc3RyLAorICAgICAgICAgIEltcGxpY2l0Q2FzdF88dm9pZCo+KE5VTEwpLCAiMTAiKTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsICdhJyAoOTcsIDB4NjEpLCAzLCA0LCA1LCAxLjUsIC0yLjUsICIgKyBQcmludFBvaW50ZXIoc3RyKSArCisgICAgICAgICAgICAiIHBvaW50aW5nIHRvIFwiOFwiLCBOVUxMLCBcIjEwXCIpIiwKKyAgICAgICAgICAgIFByaW50KHQxMCkpOworfQorCisvLyBOZXN0ZWQgdHVwbGVzLgorVEVTVChQcmludFR1cGxlVGVzdCwgTmVzdGVkVHVwbGUpIHsKKyAgdHVwbGU8dHVwbGU8aW50LCBib29sPiwgY2hhcj4gbmVzdGVkKG1ha2VfdHVwbGUoNSwgdHJ1ZSksICdhJyk7CisgIEVYUEVDVF9FUSgiKCg1LCB0cnVlKSwgJ2EnICg5NywgMHg2MSkpIiwgUHJpbnQobmVzdGVkKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisvLyBUZXN0cyBwcmludGluZyB1c2VyLWRlZmluZWQgdW5wcmludGFibGUgdHlwZXMuCisKKy8vIFVucHJpbnRhYmxlIHR5cGVzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorVEVTVChQcmludFVucHJpbnRhYmxlVHlwZVRlc3QsIEluR2xvYmFsTmFtZXNwYWNlKSB7CisgIEVYUEVDVF9FUSgiMS1ieXRlIG9iamVjdCA8MDA+IiwKKyAgICAgICAgICAgIFByaW50KFVucHJpbnRhYmxlVGVtcGxhdGVJbkdsb2JhbDxjaGFyPigpKSk7Cit9CisKKy8vIFVucHJpbnRhYmxlIHR5cGVzIGluIGEgdXNlciBuYW1lc3BhY2UuCitURVNUKFByaW50VW5wcmludGFibGVUeXBlVGVzdCwgSW5Vc2VyTmFtZXNwYWNlKSB7CisgIEVYUEVDVF9FUSgiMTYtYnl0ZSBvYmplY3QgPEVGLTEyIDAwLTAwIDM0LUFCIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwPiIsCisgICAgICAgICAgICBQcmludCg6OmZvbzo6VW5wcmludGFibGVJbkZvbygpKSk7Cit9CisKKy8vIFVucHJpbnRhYmxlIHR5cGVzIGFyZSB0aGF0IHRvbyBiaWcgdG8gYmUgcHJpbnRlZCBjb21wbGV0ZWx5LgorCitzdHJ1Y3QgQmlnIHsKKyAgQmlnKCkgeyBtZW1zZXQoYXJyYXksIDAsIHNpemVvZihhcnJheSkpOyB9CisgIGNoYXIgYXJyYXlbMjU3XTsKK307CisKK1RFU1QoUHJpbnRVbnByaXRhYmxlVHlwZVRlc3QsIEJpZ09iamVjdCkgeworICBFWFBFQ1RfRVEoIjI1Ny1ieXRlIG9iamVjdCA8MDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgLi4uIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwPiIsCisgICAgICAgICAgICBQcmludChCaWcoKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyB1c2VyLWRlZmluZWQgc3RyZWFtYWJsZSB0eXBlcy4KKworLy8gU3RyZWFtYWJsZSB0eXBlcyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK1RFU1QoUHJpbnRTdHJlYW1hYmxlVHlwZVRlc3QsIEluR2xvYmFsTmFtZXNwYWNlKSB7CisgIFN0cmVhbWFibGVJbkdsb2JhbCB4OworICBFWFBFQ1RfRVEoIlN0cmVhbWFibGVJbkdsb2JhbCIsIFByaW50KHgpKTsKKyAgRVhQRUNUX0VRKCJTdHJlYW1hYmxlSW5HbG9iYWwqIiwgUHJpbnQoJngpKTsKK30KKworLy8gUHJpbnRhYmxlIHRlbXBsYXRlIHR5cGVzIGluIGEgdXNlciBuYW1lc3BhY2UuCitURVNUKFByaW50U3RyZWFtYWJsZVR5cGVUZXN0LCBUZW1wbGF0ZVR5cGVJblVzZXJOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCJTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbzogMCIsCisgICAgICAgICAgICBQcmludCg6OmZvbzo6U3RyZWFtYWJsZVRlbXBsYXRlSW5Gb288aW50PigpKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGhhdmUgYSBQcmludFRvKCkgZnVuY3Rpb24uCitURVNUKFByaW50UHJpbnRhYmxlVHlwZVRlc3QsIEluVXNlck5hbWVzcGFjZSkgeworICBFWFBFQ1RfRVEoIlByaW50YWJsZVZpYVByaW50VG86IDAiLAorICAgICAgICAgICAgUHJpbnQoOjpmb286OlByaW50YWJsZVZpYVByaW50VG8oKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBhIHBvaW50ZXIgdG8gYSB1c2VyLWRlZmluZWQgdHlwZSB0aGF0IGhhcyBhIDw8CisvLyBvcGVyYXRvciBmb3IgaXRzIHBvaW50ZXIuCitURVNUKFByaW50UHJpbnRhYmxlVHlwZVRlc3QsIFBvaW50ZXJJblVzZXJOYW1lc3BhY2UpIHsKKyAgOjpmb286OlBvaW50ZXJQcmludGFibGUgeDsKKyAgRVhQRUNUX0VRKCJQb2ludGVyUHJpbnRhYmxlKiIsIFByaW50KCZ4KSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCBjbGFzcyB0ZW1wbGF0ZSB0aGF0IGhhdmUgYSBQcmludFRvKCkgZnVuY3Rpb24uCitURVNUKFByaW50UHJpbnRhYmxlVHlwZVRlc3QsIFRlbXBsYXRlSW5Vc2VyTmFtZXNwYWNlKSB7CisgIEVYUEVDVF9FUSgiUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlOiA1IiwKKyAgICAgICAgICAgIFByaW50KDo6Zm9vOjpQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGU8aW50Pig1KSkpOworfQorCisjaWYgR1RFU1RfSEFTX1BST1RPQlVGXworCisvLyBUZXN0cyBwcmludGluZyBhIHByb3RvY29sIG1lc3NhZ2UuCitURVNUKFByaW50UHJvdG9jb2xNZXNzYWdlVGVzdCwgUHJpbnRzU2hvcnREZWJ1Z1N0cmluZykgeworICB0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1lc3NhZ2UgbXNnOworICBtc2cuc2V0X21lbWJlcigieWVzIik7CisgIEVYUEVDVF9FUSgiPG1lbWJlcjpcInllc1wiPiIsIFByaW50KG1zZykpOworfQorCisvLyBUZXN0cyBwcmludGluZyBhIHNob3J0IHByb3RvMiBtZXNzYWdlLgorVEVTVChQcmludFByb3RvMk1lc3NhZ2VUZXN0LCBQcmludHNTaG9ydERlYnVnU3RyaW5nV2hlbkl0SXNTaG9ydCkgeworICB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9vTWVzc2FnZSBtc2c7CisgIG1zZy5zZXRfaW50X2ZpZWxkKDIpOworICBtc2cuc2V0X3N0cmluZ19maWVsZCgiaGVsbG8iKTsKKyAgRVhQRUNUX1BSRUQyKFJFOjpGdWxsTWF0Y2gsIFByaW50KG1zZyksCisgICAgICAgICAgICAgICAiPGludF9maWVsZDpcXHMqMlxccytzdHJpbmdfZmllbGQ6XFxzKlwiaGVsbG9cIj4iKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgYSBsb25nIHByb3RvMiBtZXNzYWdlLgorVEVTVChQcmludFByb3RvMk1lc3NhZ2VUZXN0LCBQcmludHNEZWJ1Z1N0cmluZ1doZW5JdElzTG9uZykgeworICB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9vTWVzc2FnZSBtc2c7CisgIG1zZy5zZXRfaW50X2ZpZWxkKDIpOworICBtc2cuc2V0X3N0cmluZ19maWVsZCgiaGVsbG8iKTsKKyAgbXNnLmFkZF9uYW1lcygicGV0ZXIiKTsKKyAgbXNnLmFkZF9uYW1lcygicGF1bCIpOworICBtc2cuYWRkX25hbWVzKCJtYXJ5Iik7CisgIEVYUEVDVF9QUkVEMihSRTo6RnVsbE1hdGNoLCBQcmludChtc2cpLAorICAgICAgICAgICAgICAgIjxcbiIKKyAgICAgICAgICAgICAgICJpbnRfZmllbGQ6XFxzKjJcbiIKKyAgICAgICAgICAgICAgICJzdHJpbmdfZmllbGQ6XFxzKlwiaGVsbG9cIlxuIgorICAgICAgICAgICAgICAgIm5hbWVzOlxccypcInBldGVyXCJcbiIKKyAgICAgICAgICAgICAgICJuYW1lczpcXHMqXCJwYXVsXCJcbiIKKyAgICAgICAgICAgICAgICJuYW1lczpcXHMqXCJtYXJ5XCJcbiIKKyAgICAgICAgICAgICAgICI+Iik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BST1RPQlVGXworCisvLyBUZXN0cyB0aGF0IHRoZSB1bml2ZXJzYWwgcHJpbnRlciBwcmludHMgYm90aCB0aGUgYWRkcmVzcyBhbmQgdGhlCisvLyB2YWx1ZSBvZiBhIHJlZmVyZW5jZS4KK1RFU1QoUHJpbnRSZWZlcmVuY2VUZXN0LCBQcmludHNBZGRyZXNzQW5kVmFsdWUpIHsKKyAgaW50IG4gPSA1OworICBFWFBFQ1RfRVEoIkAiICsgUHJpbnRQb2ludGVyKCZuKSArICIgNSIsIFByaW50QnlSZWYobikpOworCisgIGludCBhWzJdWzNdID0geworICAgIHsgMCwgMSwgMiB9LAorICAgIHsgMywgNCwgNSB9CisgIH07CisgIEVYUEVDVF9FUSgiQCIgKyBQcmludFBvaW50ZXIoYSkgKyAiIHsgeyAwLCAxLCAyIH0sIHsgMywgNCwgNSB9IH0iLAorICAgICAgICAgICAgUHJpbnRCeVJlZihhKSk7CisKKyAgY29uc3QgOjpmb286OlVucHJpbnRhYmxlSW5Gb28geDsKKyAgRVhQRUNUX0VRKCJAIiArIFByaW50UG9pbnRlcigmeCkgKyAiIDE2LWJ5dGUgb2JqZWN0ICIKKyAgICAgICAgICAgICI8RUYtMTIgMDAtMDAgMzQtQUIgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDA+IiwKKyAgICAgICAgICAgIFByaW50QnlSZWYoeCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSB1bml2ZXJzYWwgcHJpbnRlciBwcmludHMgYSBmdW5jdGlvbiBwb2ludGVyIHBhc3NlZCBieQorLy8gcmVmZXJlbmNlLgorVEVTVChQcmludFJlZmVyZW5jZVRlc3QsIEhhbmRsZXNGdW5jdGlvblBvaW50ZXIpIHsKKyAgdm9pZCAoKmZwKShpbnQgbikgPSAmTXlGdW5jdGlvbjsKKyAgY29uc3Qgc3RyaW5nIGZwX3BvaW50ZXJfc3RyaW5nID0KKyAgICAgIFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmZnApKTsKKyAgLy8gV2UgY2Fubm90IGRpcmVjdGx5IGNhc3QgJk15RnVuY3Rpb24gdG8gY29uc3Qgdm9pZCogYmVjYXVzZSB0aGUKKyAgLy8gc3RhbmRhcmQgZGlzYWxsb3dzIGNhc3RpbmcgYmV0d2VlbiBwb2ludGVycyB0byBmdW5jdGlvbnMgYW5kCisgIC8vIHBvaW50ZXJzIHRvIG9iamVjdHMsIGFuZCBzb21lIGNvbXBpbGVycyAoZS5nLiBHQ0MgMy40KSBlbmZvcmNlCisgIC8vIHRoaXMgbGltaXRhdGlvbi4KKyAgY29uc3Qgc3RyaW5nIGZwX3N0cmluZyA9IFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OkJpZ2dlc3RJbnQ+KGZwKSkpOworICBFWFBFQ1RfRVEoIkAiICsgZnBfcG9pbnRlcl9zdHJpbmcgKyAiICIgKyBmcF9zdHJpbmcsCisgICAgICAgICAgICBQcmludEJ5UmVmKGZwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHVuaXZlcnNhbCBwcmludGVyIHByaW50cyBhIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyCisvLyBwYXNzZWQgYnkgcmVmZXJlbmNlLgorVEVTVChQcmludFJlZmVyZW5jZVRlc3QsIEhhbmRsZXNNZW1iZXJGdW5jdGlvblBvaW50ZXIpIHsKKyAgaW50IChGb286OipwKShjaGFyIGNoKSA9ICZGb286Ok15TWV0aG9kOworICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoCisgICAgICBQcmludEJ5UmVmKHApLAorICAgICAgIkAiICsgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZwKSkgKyAiICIgKworICAgICAgICAgIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKKworICBjaGFyIChGb286OipwMikoaW50IG4pID0gJkZvbzo6TXlWaXJ0dWFsTWV0aG9kOworICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoCisgICAgICBQcmludEJ5UmVmKHAyKSwKKyAgICAgICJAIiArIFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmcDIpKSArICIgIiArCisgICAgICAgICAgUHJpbnQoc2l6ZW9mKHAyKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgdW5pdmVyc2FsIHByaW50ZXIgcHJpbnRzIGEgbWVtYmVyIHZhcmlhYmxlIHBvaW50ZXIKKy8vIHBhc3NlZCBieSByZWZlcmVuY2UuCitURVNUKFByaW50UmVmZXJlbmNlVGVzdCwgSGFuZGxlc01lbWJlclZhcmlhYmxlUG9pbnRlcikgeworICBpbnQgKEZvbzo6KnApID0gJkZvbzo6dmFsdWU7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KAorICAgICAgUHJpbnRCeVJlZihwKSwKKyAgICAgICJAIiArIFByaW50UG9pbnRlcigmcCkgKyAiICIgKyBQcmludChzaXplb2YocCkpICsgIi1ieXRlIG9iamVjdCAiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKCksIHdoaWNoIGlzIHVzZWQgdG8gcHJpbnQKKy8vIGFuIG9wZXJhbmQgaW4gYSBjb21wYXJpc29uIGFzc2VydGlvbiAoZS5nLiBBU1NFUlRfRVEpIHdoZW4gdGhlIGFzc2VydGlvbgorLy8gZmFpbHMsIGZvcm1hdHMgdGhlIG9wZXJhbmQgaW4gdGhlIGRlc2lyZWQgd2F5LgorCisvLyBzY2FsYXIKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JTY2FsYXIpIHsKKyAgRVhQRUNUX1NUUkVRKCIxMjMiLAorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKDEyMywgMTI0KS5jX3N0cigpKTsKK30KKworLy8gbm9uLWNoYXIgcG9pbnRlcgorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0Zvck5vbkNoYXJQb2ludGVyKSB7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcigmbiksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoJm4sICZuKS5jX3N0cigpKTsKK30KKworLy8gbm9uLWNoYXIgYXJyYXkKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgRm9ybWF0c05vbkNoYXJBcnJheUFzUG9pbnRlcikgeworICAvLyBJbiBleHByZXNzaW9uICdhcnJheSA9PSB4JywgJ2FycmF5JyBpcyBjb21wYXJlZCBieSBwb2ludGVyLgorICAvLyBUaGVyZWZvcmUgd2Ugd2FudCB0byBwcmludCBhbiBhcnJheSBvcGVyYW5kIGFzIGEgcG9pbnRlci4KKyAgaW50IG5bXSA9IHsgMSwgMiwgMyB9OworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKG4pLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKG4sIG4pLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBmb3JtYXR0aW5nIGEgY2hhciBwb2ludGVyIHdoZW4gaXQncyBjb21wYXJlZCB3aXRoIGFub3RoZXIgcG9pbnRlci4KKy8vIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHByaW50IGl0IGFzIGEgcmF3IHBvaW50ZXIsIGFzIHRoZSBjb21wYXJpc2lvbiBpcyBieQorLy8gcG9pbnRlci4KKworLy8gY2hhciBwb2ludGVyIHZzIHBvaW50ZXIKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyUG9pbnRlclZzUG9pbnRlcikgeworICAvLyBJbiBleHByZXNzaW9uICdwID09IHgnLCB3aGVyZSAncCcgYW5kICd4JyBhcmUgKGNvbnN0IG9yIG5vdCkgY2hhcgorICAvLyBwb2ludGVycywgdGhlIG9wZXJhbmRzIGFyZSBjb21wYXJlZCBieSBwb2ludGVyLiAgVGhlcmVmb3JlIHdlCisgIC8vIHdhbnQgdG8gcHJpbnQgJ3AnIGFzIGEgcG9pbnRlciBpbnN0ZWFkIG9mIGEgQyBzdHJpbmcgKHdlIGRvbid0CisgIC8vIGV2ZW4ga25vdyBpZiBpdCdzIHN1cHBvc2VkIHRvIHBvaW50IHRvIGEgdmFsaWQgQyBzdHJpbmcpLgorCisgIC8vIGNvbnN0IGNoYXIqCisgIGNvbnN0IGNoYXIqIHMgPSAiaGVsbG8iOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHMpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHMsIHMpLmNfc3RyKCkpOworCisgIC8vIGNoYXIqCisgIGNoYXIgY2ggPSAnYSc7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoJmNoKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgmY2gsICZjaCkuY19zdHIoKSk7Cit9CisKKy8vIHdjaGFyX3QgcG9pbnRlciB2cyBwb2ludGVyCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJQb2ludGVyVnNQb2ludGVyKSB7CisgIC8vIEluIGV4cHJlc3Npb24gJ3AgPT0geCcsIHdoZXJlICdwJyBhbmQgJ3gnIGFyZSAoY29uc3Qgb3Igbm90KSBjaGFyCisgIC8vIHBvaW50ZXJzLCB0aGUgb3BlcmFuZHMgYXJlIGNvbXBhcmVkIGJ5IHBvaW50ZXIuICBUaGVyZWZvcmUgd2UKKyAgLy8gd2FudCB0byBwcmludCAncCcgYXMgYSBwb2ludGVyIGluc3RlYWQgb2YgYSB3aWRlIEMgc3RyaW5nICh3ZSBkb24ndAorICAvLyBldmVuIGtub3cgaWYgaXQncyBzdXBwb3NlZCB0byBwb2ludCB0byBhIHZhbGlkIHdpZGUgQyBzdHJpbmcpLgorCisgIC8vIGNvbnN0IHdjaGFyX3QqCisgIGNvbnN0IHdjaGFyX3QqIHMgPSBMImhlbGxvIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCBzKS5jX3N0cigpKTsKKworICAvLyB3Y2hhcl90KgorICB3Y2hhcl90IGNoID0gTCdhJzsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcigmY2gpLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKCZjaCwgJmNoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgZm9ybWF0dGluZyBhIGNoYXIgcG9pbnRlciB3aGVuIGl0J3MgY29tcGFyZWQgdG8gYSBzdHJpbmcgb2JqZWN0LgorLy8gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcHJpbnQgdGhlIGNoYXIgcG9pbnRlciBhcyBhIEMgc3RyaW5nLgorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKy8vIGNoYXIgcG9pbnRlciB2cyA6OnN0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJQb2ludGVyVnNTdHJpbmcpIHsKKyAgY29uc3QgY2hhciogcyA9ICJoZWxsbyBcIndvcmxkIjsKKyAgRVhQRUNUX1NUUkVRKCJcImhlbGxvIFxcXCJ3b3JsZFwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCA6OnN0cmluZygpKS5jX3N0cigpKTsKKworICAvLyBjaGFyKgorICBjaGFyIHN0cltdID0gImhpXDEiOworICBjaGFyKiBwID0gc3RyOworICBFWFBFQ1RfU1RSRVEoIlwiaGlcXHgxXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHAsIDo6c3RyaW5nKCkpLmNfc3RyKCkpOworfQorI2VuZGlmCisKKy8vIGNoYXIgcG9pbnRlciB2cyBzdGQ6OnN0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJQb2ludGVyVnNTdGRTdHJpbmcpIHsKKyAgY29uc3QgY2hhciogcyA9ICJoZWxsbyBcIndvcmxkIjsKKyAgRVhQRUNUX1NUUkVRKCJcImhlbGxvIFxcXCJ3b3JsZFwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCA6OnN0ZDo6c3RyaW5nKCkpLmNfc3RyKCkpOworCisgIC8vIGNoYXIqCisgIGNoYXIgc3RyW10gPSAiaGlcMSI7CisgIGNoYXIqIHAgPSBzdHI7CisgIEVYUEVDVF9TVFJFUSgiXCJoaVxceDFcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocCwgOjpzdGQ6OnN0cmluZygpKS5jX3N0cigpKTsKK30KKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworLy8gd2NoYXJfdCBwb2ludGVyIHZzIDo6d3N0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyUG9pbnRlclZzV1N0cmluZykgeworICBjb25zdCB3Y2hhcl90KiBzID0gTCJoaSBcIndvcmxkIjsKKyAgRVhQRUNUX1NUUkVRKCJMXCJoaSBcXFwid29ybGRcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgOjp3c3RyaW5nKCkpLmNfc3RyKCkpOworCisgIC8vIHdjaGFyX3QqCisgIHdjaGFyX3Qgc3RyW10gPSBMImhpXDEiOworICB3Y2hhcl90KiBwID0gc3RyOworICBFWFBFQ1RfU1RSRVEoIkxcImhpXFx4MVwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShwLCA6OndzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gd2NoYXJfdCBwb2ludGVyIHZzIHN0ZDo6d3N0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyUG9pbnRlclZzU3RkV1N0cmluZykgeworICBjb25zdCB3Y2hhcl90KiBzID0gTCJoaSBcIndvcmxkIjsKKyAgRVhQRUNUX1NUUkVRKCJMXCJoaSBcXFwid29ybGRcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgOjpzdGQ6OndzdHJpbmcoKSkuY19zdHIoKSk7CisKKyAgLy8gd2NoYXJfdCoKKyAgd2NoYXJfdCBzdHJbXSA9IEwiaGlcMSI7CisgIHdjaGFyX3QqIHAgPSBzdHI7CisgIEVYUEVDVF9TVFJFUSgiTFwiaGlcXHgxXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHAsIDo6c3RkOjp3c3RyaW5nKCkpLmNfc3RyKCkpOworfQorI2VuZGlmCisKKy8vIFRlc3RzIGZvcm1hdHRpbmcgYSBjaGFyIGFycmF5IHdoZW4gaXQncyBjb21wYXJlZCB3aXRoIGEgcG9pbnRlciBvciBhcnJheS4KKy8vIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHByaW50IHRoZSBhcnJheSBhcyBhIHJvdyBwb2ludGVyLCBhcyB0aGUgY29tcGFyaXNvbgorLy8gaXMgYnkgcG9pbnRlci4KKworLy8gY2hhciBhcnJheSB2cyBwb2ludGVyCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhckFycmF5VnNQb2ludGVyKSB7CisgIGNoYXIgc3RyW10gPSAiaGkgXCJ3b3JsZFwiIjsKKyAgY2hhciogcCA9IE5VTEw7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHApLmNfc3RyKCkpOworfQorCisvLyBjaGFyIGFycmF5IHZzIGNoYXIgYXJyYXkKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyQXJyYXlWc0NoYXJBcnJheSkgeworICBjb25zdCBjaGFyIHN0cltdID0gImhpIFwid29ybGRcIiI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHN0cikuY19zdHIoKSk7Cit9CisKKy8vIHdjaGFyX3QgYXJyYXkgdnMgcG9pbnRlcgorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyQXJyYXlWc1BvaW50ZXIpIHsKKyAgd2NoYXJfdCBzdHJbXSA9IEwiaGkgXCJ3b3JsZFwiIjsKKyAgd2NoYXJfdCogcCA9IE5VTEw7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHApLmNfc3RyKCkpOworfQorCisvLyB3Y2hhcl90IGFycmF5IHZzIHdjaGFyX3QgYXJyYXkKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhckFycmF5VnNXQ2hhckFycmF5KSB7CisgIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSBMImhpIFwid29ybGRcIiI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHN0cikuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIGZvcm1hdHRpbmcgYSBjaGFyIGFycmF5IHdoZW4gaXQncyBjb21wYXJlZCB3aXRoIGEgc3RyaW5nIG9iamVjdC4KKy8vIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHByaW50IHRoZSBhcnJheSBhcyBhIEMgc3RyaW5nLgorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKy8vIGNoYXIgYXJyYXkgdnMgc3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhckFycmF5VnNTdHJpbmcpIHsKKyAgY29uc3QgY2hhciBzdHJbXSA9ICJoaSBcIndcMHJsZFwiIjsKKyAgRVhQRUNUX1NUUkVRKCJcImhpIFxcXCJ3XCIiLCAgLy8gVGhlIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtYmVkZGVkIE5VTCB0ZXJtaW5hdGVzIHRoZSBzdHJpbmcuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCA6OnN0cmluZygpKS5jX3N0cigpKTsKK30KKyNlbmRpZgorCisvLyBjaGFyIGFycmF5IHZzIHN0ZDo6c3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhckFycmF5VnNTdGRTdHJpbmcpIHsKKyAgY29uc3QgY2hhciBzdHJbXSA9ICJoaSBcIndvcmxkXCIiOworICBFWFBFQ1RfU1RSRVEoIlwiaGkgXFxcIndvcmxkXFxcIlwiIiwgIC8vIFRoZSBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgOjpzdGQ6OnN0cmluZygpKS5jX3N0cigpKTsKK30KKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworLy8gd2NoYXJfdCBhcnJheSB2cyB3c3RyaW5nCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJBcnJheVZzV1N0cmluZykgeworICBjb25zdCB3Y2hhcl90IHN0cltdID0gTCJoaSBcIndvcmxkXCIiOworICBFWFBFQ1RfU1RSRVEoIkxcImhpIFxcXCJ3b3JsZFxcXCJcIiIsICAvLyBUaGUgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIDo6d3N0cmluZygpKS5jX3N0cigpKTsKK30KKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyB3Y2hhcl90IGFycmF5IHZzIHN0ZDo6d3N0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyQXJyYXlWc1N0ZFdTdHJpbmcpIHsKKyAgY29uc3Qgd2NoYXJfdCBzdHJbXSA9IEwiaGkgXCJ3XDBybGRcIiI7CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJMXCJoaSBcXFwid1wiIiwgIC8vIFRoZSBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1iZWRkZWQgTlVMIHRlcm1pbmF0ZXMgdGhlIHN0cmluZy4KKyAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIDo6c3RkOjp3c3RyaW5nKCkpLmNfc3RyKCkpOworfQorI2VuZGlmCisKKy8vIFVzZWZ1bCBmb3IgdGVzdGluZyBQcmludFRvU3RyaW5nKCkuICBXZSBjYW5ub3QgdXNlIEVYUEVDVF9FUSgpCisvLyB0aGVyZSBhcyBpdHMgaW1wbGVtZW50YXRpb24gdXNlcyBQcmludFRvU3RyaW5nKCkuICBUaGUgY2FsbGVyIG11c3QKKy8vIGVuc3VyZSB0aGF0ICd2YWx1ZScgaGFzIG5vIHNpZGUgZWZmZWN0LgorI2RlZmluZSBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyh2YWx1ZSwgZXhwZWN0ZWRfc3RyaW5nKSAgICAgICAgIFwKKyAgRVhQRUNUX1RSVUUoUHJpbnRUb1N0cmluZyh2YWx1ZSkgPT0gKGV4cGVjdGVkX3N0cmluZykpICAgICAgICBcCisgICAgICA8PCAiIHdoZXJlICIgI3ZhbHVlICIgcHJpbnRzIGFzICIgPDwgKFByaW50VG9TdHJpbmcodmFsdWUpKQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvclNjYWxhcikgeworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXygxMjMsICIxMjMiKTsKK30KKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Db25zdENoYXIpIHsKKyAgY29uc3QgY2hhciogcCA9ICJoZWxsbyI7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHAsICJcImhlbGxvXCIiKTsKK30KKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Ob25Db25zdENoYXIpIHsKKyAgY2hhciBzW10gPSAiaGVsbG8iOworICBjaGFyKiBwID0gczsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocCwgIlwiaGVsbG9cIiIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBFc2NhcGVzRm9yUG9pbnRlclRvQ29uc3RDaGFyKSB7CisgIGNvbnN0IGNoYXIqIHAgPSAiaGVsbG9cbiI7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHAsICJcImhlbGxvXFxuXCIiKTsKK30KKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgRXNjYXBlc0ZvclBvaW50ZXJUb05vbkNvbnN0Q2hhcikgeworICBjaGFyIHNbXSA9ICJoZWxsb1wxIjsKKyAgY2hhciogcCA9IHM7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHAsICJcImhlbGxvXFx4MVwiIik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yQXJyYXkpIHsKKyAgaW50IG5bM10gPSB7IDEsIDIsIDMgfTsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18obiwgInsgMSwgMiwgMyB9Iik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yQ2hhckFycmF5KSB7CisgIGNoYXIgc1tdID0gImhlbGxvIjsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocywgIlwiaGVsbG9cIiIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheVdpdGhFbWJlZGRlZE51bCkgeworICBjb25zdCBjaGFyIHN0cl93aXRoX251bFtdID0gImhlbGxvXDAgd29ybGQiOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhzdHJfd2l0aF9udWwsICJcImhlbGxvXFwwIHdvcmxkXCIiKTsKKworICBjaGFyIG11dGFibGVfc3RyX3dpdGhfbnVsW10gPSAiaGVsbG9cMCB3b3JsZCI7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKG11dGFibGVfc3RyX3dpdGhfbnVsLCAiXCJoZWxsb1xcMCB3b3JsZFwiIik7Cit9CisKKyN1bmRlZiBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXworCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUZXN0LCBXb3Jrc0Zvck5vblJlZmVyZW5jZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxUZXJzZVByaW50KDEyMywgJnNzKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7CisgIGNvbnN0IGludCYgbiA9IDEyMzsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsVGVyc2VQcmludChuLCAmc3MpOworICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VGVzdCwgV29ya3NGb3JDU3RyaW5nKSB7CisgIGNvbnN0IGNoYXIqIHMxID0gImFiYyI7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MxOworICBVbml2ZXJzYWxUZXJzZVByaW50KHMxLCAmc3MxKTsKKyAgRVhQRUNUX0VRKCJcImFiY1wiIiwgc3MxLnN0cigpKTsKKworICBjaGFyKiBzMiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHMxKTsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczI7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnQoczIsICZzczIpOworICBFWFBFQ1RfRVEoIlwiYWJjXCIiLCBzczIuc3RyKCkpOworCisgIGNvbnN0IGNoYXIqIHMzID0gTlVMTDsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczM7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnQoczMsICZzczMpOworICBFWFBFQ1RfRVEoIk5VTEwiLCBzczMuc3RyKCkpOworfQorCitURVNUKFVuaXZlcnNhbFByaW50VGVzdCwgV29ya3NGb3JOb25SZWZlcmVuY2UpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsUHJpbnQoMTIzLCAmc3MpOworICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxQcmludFRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7CisgIGNvbnN0IGludCYgbiA9IDEyMzsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsUHJpbnQobiwgJnNzKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsUHJpbnRUZXN0LCBXb3Jrc0ZvckNTdHJpbmcpIHsKKyAgY29uc3QgY2hhciogczEgPSAiYWJjIjsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczE7CisgIFVuaXZlcnNhbFByaW50KHMxLCAmc3MxKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzMSkgKyAiIHBvaW50aW5nIHRvIFwiYWJjXCIiLCBzdHJpbmcoc3MxLnN0cigpKSk7CisKKyAgY2hhciogczIgPSBjb25zdF9jYXN0PGNoYXIqPihzMSk7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MyOworICBVbml2ZXJzYWxQcmludChzMiwgJnNzMik7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoczIpICsgIiBwb2ludGluZyB0byBcImFiY1wiIiwgc3RyaW5nKHNzMi5zdHIoKSkpOworCisgIGNvbnN0IGNoYXIqIHMzID0gTlVMTDsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczM7CisgIFVuaXZlcnNhbFByaW50KHMzLCAmc3MzKTsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgc3MzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxQcmludFRlc3QsIFdvcmtzRm9yQ2hhckFycmF5KSB7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAiXCJMaW5lXDAgMVwiXG5MaW5lIDIiOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMTsKKyAgVW5pdmVyc2FsUHJpbnQoc3RyLCAmc3MxKTsKKyAgRVhQRUNUX0VRKCJcIlxcXCJMaW5lXFwwIDFcXFwiXFxuTGluZSAyXCIiLCBzczEuc3RyKCkpOworCisgIGNvbnN0IGNoYXIgbXV0YWJsZV9zdHJbXSA9ICJcIkxpbmVcMCAxXCJcbkxpbmUgMiI7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MyOworICBVbml2ZXJzYWxQcmludChtdXRhYmxlX3N0ciwgJnNzMik7CisgIEVYUEVDVF9FUSgiXCJcXFwiTGluZVxcMCAxXFxcIlxcbkxpbmUgMlwiIiwgc3MyLnN0cigpKTsKK30KKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0LCBQcmludHNFbXB0eVR1cGxlKSB7CisgIFN0cmluZ3MgcmVzdWx0ID0gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdCwgUHJpbnRzT25lVHVwbGUpIHsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MobWFrZV90dXBsZSgxKSk7CisgIEFTU0VSVF9FUSgxdSwgcmVzdWx0LnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdCwgUHJpbnRzVHdvVHVwbGUpIHsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MobWFrZV90dXBsZSgxLCAnYScpKTsKKyAgQVNTRVJUX0VRKDJ1LCByZXN1bHQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCIxIiwgcmVzdWx0WzBdKTsKKyAgRVhQRUNUX0VRKCInYScgKDk3LCAweDYxKSIsIHJlc3VsdFsxXSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdCwgUHJpbnRzVGVyc2VseSkgeworICBjb25zdCBpbnQgbiA9IDE7CisgIFN0cmluZ3MgcmVzdWx0ID0gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAorICAgICAgdHVwbGU8Y29uc3QgaW50JiwgY29uc3QgY2hhcio+KG4sICJhIikpOworICBBU1NFUlRfRVEoMnUsIHJlc3VsdC5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCByZXN1bHRbMF0pOworICBFWFBFQ1RfRVEoIlwiYVwiIiwgcmVzdWx0WzFdKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9wcmludGVyc190ZXN0Cit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOGJhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MKQEAgLTAsMCArMSwyMDggQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIHRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjpUZXN0OwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5OworCituYW1lc3BhY2UgeworCisvLyBUZXN0cyB0aGUgVGVzdFBhcnRSZXN1bHQgY2xhc3MuCisKKy8vIFRoZSB0ZXN0IGZpeHR1cmUgZm9yIHRlc3RpbmcgVGVzdFBhcnRSZXN1bHQuCitjbGFzcyBUZXN0UGFydFJlc3VsdFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICBUZXN0UGFydFJlc3VsdFRlc3QoKQorICAgICAgOiByMV8oVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLCAiZm9vL2Jhci5jYyIsIDEwLCAiU3VjY2VzcyEiKSwKKyAgICAgICAgcjJfKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCAiZm9vL2Jhci5jYyIsIC0xLCAiRmFpbHVyZSEiKSwKKyAgICAgICAgcjNfKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCBOVUxMLCAtMSwgIkZhaWx1cmUhIikge30KKworICBUZXN0UGFydFJlc3VsdCByMV8sIHIyXywgcjNfOworfTsKKworCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBDb25zdHJ1Y3RvcldvcmtzKSB7CisgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgbWVzc2FnZSA8PCAic29tZXRoaW5nIGlzIHRlcnJpYmx5IHdyb25nIjsKKyAgbWVzc2FnZSA8PCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4odGVzdGluZzo6aW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyKTsKKyAgbWVzc2FnZSA8PCAic29tZSB1bmltcG9ydGFudCBzdGFjayB0cmFjZSI7CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgcmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvbWVfZmlsZS5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCByZXN1bHQudHlwZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJzb21lX2ZpbGUuY2MiLCByZXN1bHQuZmlsZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoNDIsIHJlc3VsdC5saW5lX251bWJlcigpKTsKKyAgRVhQRUNUX1NUUkVRKG1lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSwgcmVzdWx0Lm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9TVFJFUSgic29tZXRoaW5nIGlzIHRlcnJpYmx5IHdyb25nIiwgcmVzdWx0LnN1bW1hcnkoKSk7Cit9CisKK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIFJlc3VsdEFjY2Vzc29yc1dvcmspIHsKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgc3VjY2VzcyhUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIik7CisgIEVYUEVDVF9UUlVFKHN1Y2Nlc3MucGFzc2VkKCkpOworICBFWFBFQ1RfRkFMU0Uoc3VjY2Vzcy5mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShzdWNjZXNzLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfRkFMU0Uoc3VjY2Vzcy5mYXRhbGx5X2ZhaWxlZCgpKTsKKworICBjb25zdCBUZXN0UGFydFJlc3VsdCBub25mYXRhbF9mYWlsdXJlKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIpOworICBFWFBFQ1RfRkFMU0Uobm9uZmF0YWxfZmFpbHVyZS5wYXNzZWQoKSk7CisgIEVYUEVDVF9UUlVFKG5vbmZhdGFsX2ZhaWx1cmUuZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShub25mYXRhbF9mYWlsdXJlLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfRkFMU0Uobm9uZmF0YWxfZmFpbHVyZS5mYXRhbGx5X2ZhaWxlZCgpKTsKKworICBjb25zdCBUZXN0UGFydFJlc3VsdCBmYXRhbF9mYWlsdXJlKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIpOworICBFWFBFQ1RfRkFMU0UoZmF0YWxfZmFpbHVyZS5wYXNzZWQoKSk7CisgIEVYUEVDVF9UUlVFKGZhdGFsX2ZhaWx1cmUuZmFpbGVkKCkpOworICBFWFBFQ1RfRkFMU0UoZmF0YWxfZmFpbHVyZS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUoZmF0YWxfZmFpbHVyZS5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OnR5cGUoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIHR5cGUpIHsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcywgcjFfLnR5cGUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgcjJfLnR5cGUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgcjNfLnR5cGUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpmaWxlX25hbWUoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIGZpbGVfbmFtZSkgeworICBFWFBFQ1RfU1RSRVEoImZvby9iYXIuY2MiLCByMV8uZmlsZV9uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoTlVMTCwgcjNfLmZpbGVfbmFtZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OmxpbmVfbnVtYmVyKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBsaW5lX251bWJlcikgeworICBFWFBFQ1RfRVEoMTAsIHIxXy5saW5lX251bWJlcigpKTsKKyAgRVhQRUNUX0VRKC0xLCByMl8ubGluZV9udW1iZXIoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjptZXNzYWdlKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBtZXNzYWdlKSB7CisgIEVYUEVDVF9TVFJFUSgiU3VjY2VzcyEiLCByMV8ubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OnBhc3NlZCgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgUGFzc2VkKSB7CisgIEVYUEVDVF9UUlVFKHIxXy5wYXNzZWQoKSk7CisgIEVYUEVDVF9GQUxTRShyMl8ucGFzc2VkKCkpOworICBFWFBFQ1RfRkFMU0UocjNfLnBhc3NlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OmZhaWxlZCgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgRmFpbGVkKSB7CisgIEVYUEVDVF9GQUxTRShyMV8uZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShyMl8uZmFpbGVkKCkpOworICBFWFBFQ1RfVFJVRShyM18uZmFpbGVkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6ZmF0YWxseV9mYWlsZWQoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIEZhdGFsbHlGYWlsZWQpIHsKKyAgRVhQRUNUX0ZBTFNFKHIxXy5mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHIyXy5mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocjNfLmZhdGFsbHlfZmFpbGVkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6bm9uZmF0YWxseV9mYWlsZWQoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIE5vbmZhdGFsbHlGYWlsZWQpIHsKKyAgRVhQRUNUX0ZBTFNFKHIxXy5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocjJfLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICBFWFBFQ1RfRkFMU0UocjNfLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworfQorCisvLyBUZXN0cyB0aGUgVGVzdFBhcnRSZXN1bHRBcnJheSBjbGFzcy4KKworY2xhc3MgVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICBUZXN0UGFydFJlc3VsdEFycmF5VGVzdCgpCisgICAgICA6IHIxXyhUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgImZvby9iYXIuY2MiLCAtMSwgIkZhaWx1cmUgMSIpLAorICAgICAgICByMl8oVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsICJmb28vYmFyLmNjIiwgLTEsICJGYWlsdXJlIDIiKSB7fQorCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHIxXywgcjJfOworfTsKKworLy8gVGVzdHMgdGhhdCBUZXN0UGFydFJlc3VsdEFycmF5IGluaXRpYWxseSBoYXMgc2l6ZSAwLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0LCBJbml0aWFsU2l6ZUlzWmVybykgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIEVYUEVDVF9FUSgwLCByZXN1bHRzLnNpemUoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyB0aGUgZ2l2ZW4gVGVzdFBhcnRSZXN1bHQKKy8vIGFmdGVyIG9uZSBBcHBlbmQoKSBvcGVyYXRpb24uCitURVNUX0YoVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QsIENvbnRhaW5zR2l2ZW5SZXN1bHRBZnRlckFwcGVuZCkgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHJlc3VsdHMuQXBwZW5kKHIxXyk7CisgIEVYUEVDVF9FUSgxLCByZXN1bHRzLnNpemUoKSk7CisgIEVYUEVDVF9TVFJFUSgiRmFpbHVyZSAxIiwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0cworLy8gYWZ0ZXIgdHdvIEFwcGVuZCgpIG9wZXJhdGlvbnMuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QsIENvbnRhaW5zR2l2ZW5SZXN1bHRzQWZ0ZXJUd29BcHBlbmRzKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgcmVzdWx0cy5BcHBlbmQocjFfKTsKKyAgcmVzdWx0cy5BcHBlbmQocjJfKTsKKyAgRVhQRUNUX0VRKDIsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJGYWlsdXJlIDEiLCByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9TVFJFUSgiRmFpbHVyZSAyIiwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKS5tZXNzYWdlKCkpOworfQorCit0eXBlZGVmIFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0IFRlc3RQYXJ0UmVzdWx0QXJyYXlEZWF0aFRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgdGhlIHByb2dyYW0gZGllcyB3aGVuIEdldFRlc3RQYXJ0UmVzdWx0KCkgaXMgY2FsbGVkIHdpdGgKKy8vIGFuIGludmFsaWQgaW5kZXguCitURVNUX0YoVGVzdFBhcnRSZXN1bHRBcnJheURlYXRoVGVzdCwgRGllc1doZW5JbmRleElzT3V0T2ZCb3VuZCkgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHJlc3VsdHMuQXBwZW5kKHIxXyk7CisKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KC0xKSwgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMSksICIiKTsKK30KKworLy8gVE9ETyhtaGV1bGVAZ29vZ2xlLmNvbSk6IEFkZCBhIHRlc3QgZm9yIHRoZSBjbGFzcyBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIuCisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXR1cGxlX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmFhM2UwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXR1cGxlX3Rlc3QuY2MKQEAgLTAsMCArMSwzMjAgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjpzdGQ6OnRyMTo6Z2V0OwordXNpbmcgOjpzdGQ6OnRyMTo6bWFrZV90dXBsZTsKK3VzaW5nIDo6c3RkOjp0cjE6OnR1cGxlOwordXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDsKK3VzaW5nIDo6c3RkOjp0cjE6OnR1cGxlX3NpemU7Cit1c2luZyA6OnRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTsKKworLy8gVGVzdHMgdGhhdCB0dXBsZV9lbGVtZW50PEssIHR1cGxlPFQwLCBUMSwgLi4uLCBUTj4gPjo6dHlwZSByZXR1cm5zIFRLLgorVEVTVCh0dXBsZV9lbGVtZW50X1Rlc3QsIFJldHVybnNFbGVtZW50VHlwZSkgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCB0dXBsZV9lbGVtZW50PDAsIHR1cGxlPGludCwgY2hhcj4gPjo6dHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCYsIHR1cGxlX2VsZW1lbnQ8MSwgdHVwbGU8ZG91YmxlLCBpbnQmPiA+Ojp0eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Ym9vbCwgdHVwbGVfZWxlbWVudDwyLCB0dXBsZTxkb3VibGUsIGludCwgYm9vbD4gPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCB0dXBsZV9zaXplPFQ+Ojp2YWx1ZSBnaXZlcyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0dXBsZQorLy8gdHlwZSBULgorVEVTVCh0dXBsZV9zaXplX1Rlc3QsIFJldHVybnNOdW1iZXJPZkZpZWxkcykgeworICBFWFBFQ1RfRVEoMCwgK3R1cGxlX3NpemU8dHVwbGU8PiA+Ojp2YWx1ZSk7CisgIEVYUEVDVF9FUSgxLCArdHVwbGVfc2l6ZTx0dXBsZTx2b2lkKj4gPjo6dmFsdWUpOworICBFWFBFQ1RfRVEoMSwgK3R1cGxlX3NpemU8dHVwbGU8Y2hhcj4gPjo6dmFsdWUpOworICBFWFBFQ1RfRVEoMSwgKyh0dXBsZV9zaXplPHR1cGxlPHR1cGxlPGludCwgZG91YmxlPiA+ID46OnZhbHVlKSk7CisgIEVYUEVDVF9FUSgyLCArKHR1cGxlX3NpemU8dHVwbGU8aW50JiwgY29uc3QgY2hhcj4gPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0VRKDMsICsodHVwbGVfc2l6ZTx0dXBsZTxjaGFyKiwgdm9pZCwgY29uc3QgYm9vbCY+ID46OnZhbHVlKSk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBhIHR1cGxlIHdpdGggaXRzZWxmLgorVEVTVChDb21wYXJpc29uVGVzdCwgQ29tcGFyZXNXaXRoU2VsZikgeworICBjb25zdCB0dXBsZTxpbnQsIGNoYXIsIGJvb2w+IGEoNSwgJ2EnLCBmYWxzZSk7CisKKyAgRVhQRUNUX1RSVUUoYSA9PSBhKTsKKyAgRVhQRUNUX0ZBTFNFKGEgIT0gYSk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB0d28gdHVwbGVzIHdpdGggdGhlIHNhbWUgdmFsdWUuCitURVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc0VxdWFsVHVwbGVzKSB7CisgIGNvbnN0IHR1cGxlPGludCwgYm9vbD4gYSg1LCB0cnVlKSwgYig1LCB0cnVlKTsKKworICBFWFBFQ1RfVFJVRShhID09IGIpOworICBFWFBFQ1RfRkFMU0UoYSAhPSBiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHR3byBkaWZmZXJlbnQgdHVwbGVzIHRoYXQgaGF2ZSBubyByZWZlcmVuY2UgZmllbGRzLgorVEVTVChDb21wYXJpc29uVGVzdCwgQ29tcGFyZXNVbmVxdWFsVHVwbGVzV2l0aG91dFJlZmVyZW5jZUZpZWxkcykgeworICB0eXBlZGVmIHR1cGxlPGNvbnN0IGludCwgY2hhcj4gRm9vVHVwbGU7CisKKyAgY29uc3QgRm9vVHVwbGUgYSgwLCAneCcpOworICBjb25zdCBGb29UdXBsZSBiKDEsICdhJyk7CisKKyAgRVhQRUNUX1RSVUUoYSAhPSBiKTsKKyAgRVhQRUNUX0ZBTFNFKGEgPT0gYik7CisKKyAgY29uc3QgRm9vVHVwbGUgYygxLCAnYicpOworCisgIEVYUEVDVF9UUlVFKGIgIT0gYyk7CisgIEVYUEVDVF9GQUxTRShiID09IGMpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgdHdvIGRpZmZlcmVudCB0dXBsZXMgdGhhdCBoYXZlIHJlZmVyZW5jZSBmaWVsZHMuCitURVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc1VuZXF1YWxUdXBsZXNXaXRoUmVmZXJlbmNlRmllbGRzKSB7CisgIHR5cGVkZWYgdHVwbGU8aW50JiwgY29uc3QgY2hhciY+IEZvb1R1cGxlOworCisgIGludCBpID0gNTsKKyAgY29uc3QgY2hhciBjaCA9ICdhJzsKKyAgY29uc3QgRm9vVHVwbGUgYShpLCBjaCk7CisKKyAgaW50IGogPSA2OworICBjb25zdCBGb29UdXBsZSBiKGosIGNoKTsKKworICBFWFBFQ1RfVFJVRShhICE9IGIpOworICBFWFBFQ1RfRkFMU0UoYSA9PSBiKTsKKworICBqID0gNTsKKyAgY29uc3QgY2hhciBjaDIgPSAnYic7CisgIGNvbnN0IEZvb1R1cGxlIGMoaiwgY2gyKTsKKworICBFWFBFQ1RfVFJVRShiICE9IGMpOworICBFWFBFQ1RfRkFMU0UoYiA9PSBjKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIHR1cGxlIGZpZWxkIHdpdGggYSByZWZlcmVuY2UgdHlwZSBpcyBhbiBhbGlhcyBvZiB0aGUKKy8vIHZhcmlhYmxlIGl0J3Mgc3VwcG9zZWQgdG8gcmVmZXJlbmNlLgorVEVTVChSZWZlcmVuY2VGaWVsZFRlc3QsIElzQWxpYXNPZlJlZmVyZW5jZWRWYXJpYWJsZSkgeworICBpbnQgbiA9IDA7CisgIHR1cGxlPGJvb2wsIGludCY+IHQodHJ1ZSwgbik7CisKKyAgbiA9IDE7CisgIEVYUEVDVF9FUShuLCBnZXQ8MT4odCkpCisgICAgICA8PCAiQ2hhbmdpbmcgYSB1bmRlcmx5aW5nIHZhcmlhYmxlIHNob3VsZCB1cGRhdGUgdGhlIHJlZmVyZW5jZSBmaWVsZC4iOworCisgIC8vIE1ha2VzIHN1cmUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBhbnl0aGluZyBmdW5ueSB3aXRoCisgIC8vIHRoZSAmIG9wZXJhdG9yIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgZ2V0PD4oKS4KKyAgRVhQRUNUX0VRKCZuLCAmKGdldDwxPih0KSkpCisgICAgICA8PCAiVGhlIGFkZHJlc3Mgb2YgYSByZWZlcmVuY2UgZmllbGQgc2hvdWxkIGVxdWFsIHRoZSBhZGRyZXNzIG9mICIKKyAgICAgIDw8ICJ0aGUgdW5kZXJseWluZyB2YXJpYWJsZS4iOworCisgIGdldDwxPih0KSA9IDI7CisgIEVYUEVDVF9FUSgyLCBuKQorICAgICAgPDwgIkNoYW5naW5nIGEgcmVmZXJlbmNlIGZpZWxkIHNob3VsZCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFyaWFibGUuIjsKK30KKworLy8gVGVzdHMgdGhhdCB0dXBsZSdzIGRlZmF1bHQgY29uc3RydWN0b3IgZGVmYXVsdCBpbml0aWFsaXplcyBlYWNoIGZpZWxkLgorLy8gVGhpcyB0ZXN0IG5lZWRzIHRvIGNvbXBpbGUgd2l0aG91dCBnZW5lcmF0aW5nIHdhcm5pbmdzLgorVEVTVChUdXBsZUNvbnN0cnVjdG9yVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9yRGVmYXVsdEluaXRpYWxpemVzRWFjaEZpZWxkKSB7CisgIC8vIFRoZSBUUjEgcmVwb3J0IHJlcXVpcmVzIHRoYXQgdHVwbGUncyBkZWZhdWx0IGNvbnN0cnVjdG9yIGRlZmF1bHQKKyAgLy8gaW5pdGlhbGl6ZXMgZWFjaCBmaWVsZCwgZXZlbiBpZiBpdCdzIGEgcHJpbWl0aXZlIHR5cGUuICBJZiB0aGUKKyAgLy8gaW1wbGVtZW50YXRpb24gZm9yZ2V0cyB0byBkbyB0aGlzLCB0aGlzIHRlc3Qgd2lsbCBjYXRjaCBpdCBieQorICAvLyBnZW5lcmF0aW5nIHdhcm5pbmdzIGFib3V0IHVzaW5nIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIChhc3N1bWluZworICAvLyBhIGRlY2VudCBjb21waWxlcikuCisKKyAgdHVwbGU8PiBlbXB0eTsKKworICB0dXBsZTxpbnQ+IGExLCBiMTsKKyAgYjEgPSBhMTsKKyAgRVhQRUNUX0VRKDAsIGdldDwwPihiMSkpOworCisgIHR1cGxlPGludCwgZG91YmxlPiBhMiwgYjI7CisgIGIyID0gYTI7CisgIEVYUEVDVF9FUSgwLCBnZXQ8MD4oYjIpKTsKKyAgRVhQRUNUX0VRKDAuMCwgZ2V0PDE+KGIyKSk7CisKKyAgdHVwbGU8ZG91YmxlLCBjaGFyLCBib29sKj4gYTMsIGIzOworICBiMyA9IGEzOworICBFWFBFQ1RfRVEoMC4wLCBnZXQ8MD4oYjMpKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGdldDwxPihiMykpOworICBFWFBFQ1RfVFJVRShnZXQ8Mj4oYjMpID09IE5VTEwpOworCisgIHR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludD4gYTEwLCBiMTA7CisgIGIxMCA9IGExMDsKKyAgRVhQRUNUX0VRKDAsIGdldDwwPihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDwxPihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDwyPihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDwzPihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDw0PihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDw1PihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDw2PihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDw3PihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDw4PihiMTApKTsKKyAgRVhQRUNUX0VRKDAsIGdldDw5PihiMTApKTsKK30KKworLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgdHVwbGUgZnJvbSBpdHMgZmllbGRzLgorVEVTVChUdXBsZUNvbnN0cnVjdG9yVGVzdCwgQ29uc3RydWN0c0Zyb21GaWVsZHMpIHsKKyAgaW50IG4gPSAxOworICAvLyBSZWZlcmVuY2UgZmllbGQuCisgIHR1cGxlPGludCY+IGEobik7CisgIEVYUEVDVF9FUSgmbiwgJihnZXQ8MD4oYSkpKTsKKworICAvLyBOb24tcmVmZXJlbmNlIGZpZWxkcy4KKyAgdHVwbGU8aW50LCBjaGFyPiBiKDUsICdhJyk7CisgIEVYUEVDVF9FUSg1LCBnZXQ8MD4oYikpOworICBFWFBFQ1RfRVEoJ2EnLCBnZXQ8MT4oYikpOworCisgIC8vIENvbnN0IHJlZmVyZW5jZSBmaWVsZC4KKyAgY29uc3QgaW50IG0gPSAyOworICB0dXBsZTxib29sLCBjb25zdCBpbnQmPiBjKHRydWUsIG0pOworICBFWFBFQ1RfVFJVRShnZXQ8MD4oYykpOworICBFWFBFQ1RfRVEoJm0sICYoZ2V0PDE+KGMpKSk7Cit9CisKKy8vIFRlc3RzIHR1cGxlJ3MgY29weSBjb25zdHJ1Y3Rvci4KK1RFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvcHlDb25zdHJ1Y3RvcikgeworICB0dXBsZTxkb3VibGUsIGJvb2w+IGEoMC4wLCB0cnVlKTsKKyAgdHVwbGU8ZG91YmxlLCBib29sPiBiKGEpOworCisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCBnZXQ8MD4oYikpOworICBFWFBFQ1RfVFJVRShnZXQ8MT4oYikpOworfQorCisvLyBUZXN0cyBjb25zdHJ1Y3RpbmcgYSB0dXBsZSBmcm9tIGFub3RoZXIgdHVwbGUgdGhhdCBoYXMgYSBjb21wYXRpYmxlCisvLyBidXQgZGlmZmVyZW50IHR5cGUuCitURVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBDb25zdHJ1Y3RzRnJvbURpZmZlcmVudFR1cGxlVHlwZSkgeworICB0dXBsZTxpbnQsIGludCwgY2hhcj4gYSgwLCAxLCAnYScpOworICB0dXBsZTxkb3VibGUsIGxvbmcsIGludD4gYihhKTsKKworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX0VRKDEsIGdldDwxPihiKSk7CisgIEVYUEVDVF9FUSgnYScsIGdldDwyPihiKSk7Cit9CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBhIDItdHVwbGUgZnJvbSBhbiBzdGQ6OnBhaXIuCitURVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBDb25zdHJ1Y3RzRnJvbVBhaXIpIHsKKyAgOjpzdGQ6OnBhaXI8aW50LCBjaGFyPiBhKDEsICdhJyk7CisgIHR1cGxlPGludCwgY2hhcj4gYihhKTsKKyAgdHVwbGU8aW50LCBjb25zdCBjaGFyJj4gYyhhKTsKK30KKworLy8gVGVzdHMgYXNzaWduaW5nIGEgdHVwbGUgdG8gYW5vdGhlciB0dXBsZSB3aXRoIHRoZSBzYW1lIHR5cGUuCitURVNUKFR1cGxlQXNzaWdubWVudFRlc3QsIEFzc2lnbnNUb1NhbWVUdXBsZVR5cGUpIHsKKyAgY29uc3QgdHVwbGU8aW50LCBsb25nPiBhKDUsIDdMKTsKKyAgdHVwbGU8aW50LCBsb25nPiBiOworICBiID0gYTsKKyAgRVhQRUNUX0VRKDUsIGdldDwwPihiKSk7CisgIEVYUEVDVF9FUSg3TCwgZ2V0PDE+KGIpKTsKK30KKworLy8gVGVzdHMgYXNzaWduaW5nIGEgdHVwbGUgdG8gYW5vdGhlciB0dXBsZSB3aXRoIGEgZGlmZmVyZW50IGJ1dAorLy8gY29tcGF0aWJsZSB0eXBlLgorVEVTVChUdXBsZUFzc2lnbm1lbnRUZXN0LCBBc3NpZ25zVG9EaWZmZXJlbnRUdXBsZVR5cGUpIHsKKyAgY29uc3QgdHVwbGU8aW50LCBsb25nLCBib29sPiBhKDEsIDdMLCB0cnVlKTsKKyAgdHVwbGU8bG9uZywgaW50LCBib29sPiBiOworICBiID0gYTsKKyAgRVhQRUNUX0VRKDFMLCBnZXQ8MD4oYikpOworICBFWFBFQ1RfRVEoNywgZ2V0PDE+KGIpKTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDI+KGIpKTsKK30KKworLy8gVGVzdHMgYXNzaWduaW5nIGFuIHN0ZDo6cGFpciB0byBhIDItdHVwbGUuCitURVNUKFR1cGxlQXNzaWdubWVudFRlc3QsIEFzc2lnbnNGcm9tUGFpcikgeworICBjb25zdCA6OnN0ZDo6cGFpcjxpbnQsIGJvb2w+IGEoNSwgdHJ1ZSk7CisgIHR1cGxlPGludCwgYm9vbD4gYjsKKyAgYiA9IGE7CisgIEVYUEVDVF9FUSg1LCBnZXQ8MD4oYikpOworICBFWFBFQ1RfVFJVRShnZXQ8MT4oYikpOworCisgIHR1cGxlPGxvbmcsIGJvb2w+IGM7CisgIGMgPSBhOworICBFWFBFQ1RfRVEoNUwsIGdldDwwPihjKSk7CisgIEVYUEVDVF9UUlVFKGdldDwxPihjKSk7Cit9CisKKy8vIEEgZml4dHVyZSBmb3IgdGVzdGluZyBiaWcgdHVwbGVzLgorY2xhc3MgQmlnVHVwbGVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdHlwZWRlZiB0dXBsZTxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQ+IEJpZ1R1cGxlOworCisgIEJpZ1R1cGxlVGVzdCgpIDoKKyAgICAgIGFfKDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIpLAorICAgICAgYl8oMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMykge30KKworICBCaWdUdXBsZSBhXywgYl87Cit9OworCisvLyBUZXN0cyBjb25zdHJ1Y3RpbmcgYmlnIHR1cGxlcy4KK1RFU1RfRihCaWdUdXBsZVRlc3QsIENvbnN0cnVjdGlvbikgeworICBCaWdUdXBsZSBhOworICBCaWdUdXBsZSBiKGJfKTsKK30KKworLy8gVGVzdHMgdGhhdCBnZXQ8Tj4odCkgcmV0dXJucyB0aGUgTi10aCAoMC1iYXNlZCkgZmllbGQgb2YgdHVwbGUgdC4KK1RFU1RfRihCaWdUdXBsZVRlc3QsIGdldCkgeworICBFWFBFQ1RfRVEoMSwgZ2V0PDA+KGFfKSk7CisgIEVYUEVDVF9FUSgyLCBnZXQ8OT4oYV8pKTsKKworICAvLyBUZXN0cyB0aGF0IGdldCgpIHdvcmtzIG9uIGEgY29uc3QgdHVwbGUgdG9vLgorICBjb25zdCBCaWdUdXBsZSBhKGFfKTsKKyAgRVhQRUNUX0VRKDEsIGdldDwwPihhKSk7CisgIEVYUEVDVF9FUSgyLCBnZXQ8OT4oYSkpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgYmlnIHR1cGxlcy4KK1RFU1RfRihCaWdUdXBsZVRlc3QsIENvbXBhcmlzb25zKSB7CisgIEVYUEVDVF9UUlVFKGFfID09IGFfKTsKKyAgRVhQRUNUX0ZBTFNFKGFfICE9IGFfKTsKKworICBFWFBFQ1RfVFJVRShhXyAhPSBiXyk7CisgIEVYUEVDVF9GQUxTRShhXyA9PSBiXyk7Cit9CisKK1RFU1QoTWFrZVR1cGxlVGVzdCwgV29ya3NGb3JTY2FsYXJUeXBlcykgeworICB0dXBsZTxib29sLCBpbnQ+IGE7CisgIGEgPSBtYWtlX3R1cGxlKHRydWUsIDUpOworICBFWFBFQ1RfVFJVRShnZXQ8MD4oYSkpOworICBFWFBFQ1RfRVEoNSwgZ2V0PDE+KGEpKTsKKworICB0dXBsZTxjaGFyLCBpbnQsIGxvbmc+IGI7CisgIGIgPSBtYWtlX3R1cGxlKCdhJywgJ2InLCA1KTsKKyAgRVhQRUNUX0VRKCdhJywgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX0VRKCdiJywgZ2V0PDE+KGIpKTsKKyAgRVhQRUNUX0VRKDUsIGdldDwyPihiKSk7Cit9CisKK1RFU1QoTWFrZVR1cGxlVGVzdCwgV29ya3NGb3JQb2ludGVycykgeworICBpbnQgYVtdID0geyAxLCAyLCAzLCA0IH07CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICJoaSI7CisgIGludCogY29uc3QgcCA9IGE7CisKKyAgdHVwbGU8Y29uc3QgY2hhciosIGludCo+IHQ7CisgIHQgPSBtYWtlX3R1cGxlKHN0ciwgcCk7CisgIEVYUEVDVF9FUShzdHIsIGdldDwwPih0KSk7CisgIEVYUEVDVF9FUShwLCBnZXQ8MT4odCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NDcwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gVGVzdHMgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQorLy8gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCisvLyAoQ29udGFpbmVyVGVzdCBpcyBhbHNvIGluc3RhbnRpYXRlZCBpbiBndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MuKQorSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoVmVjdG9yLCBDb250YWluZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VHlwZXM8c3RkOjp2ZWN0b3I8aW50PiA+KTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRiYTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYwpAQCAtMCwwICsxLDM2MCBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgdGVzdGluZzo6VGVzdDsKKworLy8gVXNlZCBmb3IgdGVzdGluZyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUKKy8vIGN0b3IvZHRvciwgYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlZCB0ZXN0cyBhbmQKKy8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDb21tb25UZXN0IDogcHVibGljIFRlc3QgeworICAvLyBGb3Igc29tZSB0ZWNobmljYWwgcmVhc29uLCBTZXRVcFRlc3RDYXNlKCkgYW5kIFRlYXJEb3duVGVzdENhc2UoKQorICAvLyBtdXN0IGJlIHB1YmxpYy4KKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgc2hhcmVkXyA9IG5ldyBUKDUpOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBkZWxldGUgc2hhcmVkXzsKKyAgICBzaGFyZWRfID0gTlVMTDsKKyAgfQorCisgIC8vIFRoaXMgJ3Byb3RlY3RlZDonIGlzIG9wdGlvbmFsLiAgVGhlcmUncyBubyBoYXJtIGluIG1ha2luZyBhbGwKKyAgLy8gbWVtYmVycyBvZiB0aGlzIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgcHVibGljLgorIHByb3RlY3RlZDoKKyAgLy8gV2UgdXNlZCB0byB1c2Ugc3RkOjpsaXN0IGhlcmUsIGJ1dCBzd2l0Y2hlZCB0byBzdGQ6OnZlY3RvciBzaW5jZQorICAvLyBNU1ZDJ3MgPGxpc3Q+IGRvZXNuJ3QgY29tcGlsZSBjbGVhbmx5IHdpdGggL1c0LgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFQ+IFZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnNldDxpbnQ+IEludFNldDsKKworICBDb21tb25UZXN0KCkgOiB2YWx1ZV8oMSkge30KKworICB2aXJ0dWFsIH5Db21tb25UZXN0KCkgeyBFWFBFQ1RfRVEoMywgdmFsdWVfKTsgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBFWFBFQ1RfRVEoMSwgdmFsdWVfKTsKKyAgICB2YWx1ZV8rKzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBFWFBFQ1RfRVEoMiwgdmFsdWVfKTsKKyAgICB2YWx1ZV8rKzsKKyAgfQorCisgIFQgdmFsdWVfOworICBzdGF0aWMgVCogc2hhcmVkXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogQ29tbW9uVGVzdDxUPjo6c2hhcmVkXyA9IE5VTEw7CisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHR5cGVkIHRlc3RzLgorI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKK3VzaW5nIHRlc3Rpbmc6OlR5cGVzOworCisvLyBUZXN0cyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUgY3Rvci9kdG9yLAorLy8gYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlZCB0ZXN0cworCit0eXBlZGVmIFR5cGVzPGNoYXIsIGludD4gVHdvVHlwZXM7CitUWVBFRF9URVNUX0NBU0UoQ29tbW9uVGVzdCwgVHdvVHlwZXMpOworCitUWVBFRF9URVNUKENvbW1vblRlc3QsIFZhbHVlc0FyZUNvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhCisgIC8vIHRoZSBUZXN0Rml4dHVyZTo6IHByZWZpeC4KKyAgRVhQRUNUX0VRKDUsICpUZXN0Rml4dHVyZTo6c2hhcmVkXyk7CisKKyAgLy8gVHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhIHRoZQorICAvLyAidHlwZW5hbWUgVGVzdEZpeHR1cmU6OiIgcHJlZml4LgorICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6VmVjdG9yIGVtcHR5OworICBFWFBFQ1RfRVEoMFUsIGVtcHR5LnNpemUoKSk7CisKKyAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6OkludFNldCBlbXB0eTI7CisgIEVYUEVDVF9FUSgwVSwgZW1wdHkyLnNpemUoKSk7CisKKyAgLy8gTm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzIG11c3QgYmUgdmlzaXRlZCB2aWEKKyAgLy8gJ3RoaXMnLCBhcyByZXF1aXJlZCBieSBDKysgZm9yIGNsYXNzIHRlbXBsYXRlcy4KKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnZhbHVlXyk7Cit9CisKKy8vIFRoZSBzZWNvbmQgdGVzdCBtYWtlcyBzdXJlIHNoYXJlZF8gaXMgbm90IGRlbGV0ZWQgYWZ0ZXIgdGhlIGZpcnN0CisvLyB0ZXN0LgorVFlQRURfVEVTVChDb21tb25UZXN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGFsc28gYmUgdmlzaXRlZAorICAvLyB2aWEgJ3RoaXMnLgorICBBU1NFUlRfVFJVRSh0aGlzLT5zaGFyZWRfICE9IE5VTEwpOworICBFWFBFQ1RfRVEoNSwgKnRoaXMtPnNoYXJlZF8pOworCisgIC8vIFR5cGVQYXJhbSBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxUeXBlUGFyYW0+KDIpLCB0aGlzLT52YWx1ZV8pOworfQorCisvLyBUZXN0cyB0aGF0IG11bHRpcGxlIFRZUEVEX1RFU1RfQ0FTRSdzIGNhbiBiZSBkZWZpbmVkIGluIHRoZSBzYW1lCisvLyB0cmFuc2xhdGlvbiB1bml0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdDEgOiBwdWJsaWMgVGVzdCB7Cit9OworCisvLyBWZXJpZmllcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgVFlQRURfVEVTVF9DQVNFIGNhbiBiZSBhCisvLyBzaW5nbGUgdHlwZS4KK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QxLCBpbnQpOworVFlQRURfVEVTVChUeXBlZFRlc3QxLCBBKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdDIgOiBwdWJsaWMgVGVzdCB7Cit9OworCisvLyBWZXJpZmllcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgVFlQRURfVEVTVF9DQVNFIGNhbiBiZSBhCisvLyBUeXBlczwuLi4+IHR5cGUgbGlzdC4KK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QyLCBUeXBlczxpbnQ+KTsKKworLy8gVGhpcyBhbHNvIHZlcmlmaWVzIHRoYXQgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdHlwZWQgdGVzdCBjYXNlcyBjYW4KKy8vIHNoYXJlIHRoZSBzYW1lIG5hbWUuCitUWVBFRF9URVNUKFR5cGVkVGVzdDIsIEEpIHt9CisKKy8vIFRlc3RzIHRoYXQgYSB0eXBlZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgaW4gYSBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSBsaWJyYXJ5MSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTnVtZXJpY1Rlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCit0eXBlZGVmIFR5cGVzPGludCwgbG9uZz4gTnVtZXJpY1R5cGVzOworVFlQRURfVEVTVF9DQVNFKE51bWVyaWNUZXN0LCBOdW1lcmljVHlwZXMpOworCitUWVBFRF9URVNUKE51bWVyaWNUZXN0LCBEZWZhdWx0SXNaZXJvKSB7CisgIEVYUEVDVF9FUSgwLCBUeXBlUGFyYW0oKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsaWJyYXJ5MQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3VzaW5nIHRlc3Rpbmc6OlR5cGVzOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlR5cGVkVGVzdENhc2VQU3RhdGU7CisKKy8vIFRlc3RzIFR5cGVkVGVzdENhc2VQU3RhdGUuCisKK2NsYXNzIFR5cGVkVGVzdENhc2VQU3RhdGVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQSIpOworICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQiIpOworICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQyIpOworICB9CisKKyAgVHlwZWRUZXN0Q2FzZVBTdGF0ZSBzdGF0ZV87Cit9OworCitURVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QsIFN1Y2NlZWRzRm9yTWF0Y2hpbmdMaXN0KSB7CisgIGNvbnN0IGNoYXIqIHRlc3RzID0gIkEsIEIsIEMiOworICBFWFBFQ1RfRVEodGVzdHMsCisgICAgICAgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgdGVzdHMpKTsKK30KKworLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgdGVzdHMgYW5kIHNwYWNlcyBhcm91bmQgdGhlIG5hbWVzCisvLyBkb24ndCBtYXR0ZXIuCitURVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QsIElnbm9yZXNPcmRlckFuZFNwYWNlcykgeworICBjb25zdCBjaGFyKiB0ZXN0cyA9ICJBLEMsICAgQiI7CisgIEVYUEVDVF9FUSh0ZXN0cywKKyAgICAgICAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCB0ZXN0cykpOworfQorCit0eXBlZGVmIFR5cGVkVGVzdENhc2VQU3RhdGVUZXN0IFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3Q7CisKK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzRHVwbGljYXRlcykgeworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgc3RhdGVfLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoImZvby5jYyIsIDEsICJBLCBCLCBBLCBDIiksCisgICAgICAiZm9vXFwuY2MuMS4/OiBUZXN0IEEgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlXFwuIik7Cit9CisKK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzRXh0cmFUZXN0KSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEIsIEMsIEQiKSwKKyAgICAgICJmb29cXC5jYy4xLj86IE5vIHRlc3QgbmFtZWQgRCBjYW4gYmUgZm91bmQgaW4gdGhpcyB0ZXN0IGNhc2VcXC4iKTsKK30KKworVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNNaXNzZWRUZXN0KSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEMiKSwKKyAgICAgICJmb29cXC5jYy4xLj86IFlvdSBmb3Jnb3QgdG8gbGlzdCB0ZXN0IEJcXC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWZpbmluZyBhIHRlc3QgZm9yIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgZ2VuZXJhdGVzCisvLyBhIHJ1bi10aW1lIGVycm9yIGlmIHRoZSB0ZXN0IGNhc2UgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzVGVzdEFmdGVyUmVnaXN0cmF0aW9uKSB7CisgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCAiQSwgQiwgQyIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAyLCAiRm9vVGVzdCIsICJEIiksCisgICAgICAiZm9vXFwuY2MuMi4/OiBUZXN0IEQgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCIKKyAgICAgICJcXChGb29UZXN0LCBcXC5cXC5cXC5cXClcXC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBTZXRVcFRlc3RDYXNlKCkvVGVhckRvd25UZXN0Q2FzZSgpLCBmaXh0dXJlIGN0b3IvZHRvciwKKy8vIGFuZCBTZXRVcCgpL1RlYXJEb3duKCkgd29yayBjb3JyZWN0bHkgaW4gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERlcml2ZWRUZXN0IDogcHVibGljIENvbW1vblRlc3Q8VD4geworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoRGVyaXZlZFRlc3QpOworCitUWVBFRF9URVNUX1AoRGVyaXZlZFRlc3QsIFZhbHVlc0FyZUNvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhCisgIC8vIHRoZSBUZXN0Rml4dHVyZTo6IHByZWZpeC4KKyAgRVhQRUNUX0VRKDUsICpUZXN0Rml4dHVyZTo6c2hhcmVkXyk7CisKKyAgLy8gTm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzIG11c3QgYmUgdmlzaXRlZCB2aWEKKyAgLy8gJ3RoaXMnLCBhcyByZXF1aXJlZCBieSBDKysgZm9yIGNsYXNzIHRlbXBsYXRlcy4KKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnZhbHVlXyk7Cit9CisKKy8vIFRoZSBzZWNvbmQgdGVzdCBtYWtlcyBzdXJlIHNoYXJlZF8gaXMgbm90IGRlbGV0ZWQgYWZ0ZXIgdGhlIGZpcnN0CisvLyB0ZXN0LgorVFlQRURfVEVTVF9QKERlcml2ZWRUZXN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGFsc28gYmUgdmlzaXRlZAorICAvLyB2aWEgJ3RoaXMnLgorICBBU1NFUlRfVFJVRSh0aGlzLT5zaGFyZWRfICE9IE5VTEwpOworICBFWFBFQ1RfRVEoNSwgKnRoaXMtPnNoYXJlZF8pOworICBFWFBFQ1RfRVEoMiwgdGhpcy0+dmFsdWVfKTsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRGVyaXZlZFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNBcmVDb3JyZWN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpOworCit0eXBlZGVmIFR5cGVzPHNob3J0LCBsb25nPiBNeVR3b1R5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIERlcml2ZWRUZXN0LCBNeVR3b1R5cGVzKTsKKworLy8gVGVzdHMgdGhhdCBtdWx0aXBsZSBUWVBFRF9URVNUX0NBU0VfUCdzIGNhbiBiZSBkZWZpbmVkIGluIHRoZSBzYW1lCisvLyB0cmFuc2xhdGlvbiB1bml0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdFAxIDogcHVibGljIFRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UDEpOworCisvLyBGb3IgdGVzdGluZyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9DQVNFX1AoKSBhbmQKKy8vIFRZUEVEX1RFU1RfUCgpIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG5hbWVzcGFjZS4KK3R5cGVkZWYgaW50IEludEFmdGVyVHlwZWRUZXN0Q2FzZVA7CisKK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQMSwgQSkge30KK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQMSwgQikge30KKworLy8gRm9yIHRlc3RpbmcgdGhhdCB0aGUgY29kZSBiZXR3ZWVuIFRZUEVEX1RFU1RfUCgpIGFuZAorLy8gUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoKSBpcyBub3QgZW5jbG9zZWQgaW4gYSBuYW1lc3BhY2UuCit0eXBlZGVmIGludCBJbnRCZWZvcmVSZWdpc3RlclR5cGVkVGVzdENhc2VQOworCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMSwgQSwgQik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0UDIgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMik7CisKKy8vIFRoaXMgYWxzbyB2ZXJpZmllcyB0aGF0IHRlc3RzIGZyb20gZGlmZmVyZW50IHR5cGUtcGFyYW1ldGVyaXplZAorLy8gdGVzdCBjYXNlcyBjYW4gc2hhcmUgdGhlIHNhbWUgbmFtZS4KK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQMiwgQSkge30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UDIsIEEpOworCisvLyBWZXJpZmllcyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9DQVNFX1AoKSBhbmQKKy8vIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKCkgaXMgbm90IGVuY2xvc2VkIGluIGEgbmFtZXNwYWNlLgorSW50QWZ0ZXJUeXBlZFRlc3RDYXNlUCBhZnRlciA9IDA7CitJbnRCZWZvcmVSZWdpc3RlclR5cGVkVGVzdENhc2VQIGJlZm9yZSA9IDA7CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGxhc3QgYXJndW1lbnQgb2YgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoKQorLy8gY2FuIGJlIGVpdGhlciBhIHNpbmdsZSB0eXBlIG9yIGEgVHlwZXM8Li4uPiB0eXBlIGxpc3QuCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChJbnQsIFR5cGVkVGVzdFAxLCBpbnQpOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoSW50LCBUeXBlZFRlc3RQMiwgVHlwZXM8aW50Pik7CisKKy8vIFRlc3RzIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LgorSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoRG91YmxlLCBUeXBlZFRlc3RQMiwgVHlwZXM8ZG91YmxlPik7CisKKy8vIFRlc3RzIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorLy8gKENvbnRhaW5lclRlc3QgaXMgYWxzbyBpbnN0YW50aWF0ZWQgaW4gZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjLikKK3R5cGVkZWYgVHlwZXM8c3RkOjp2ZWN0b3I8ZG91YmxlPiwgc3RkOjpzZXQ8Y2hhcj4gPiBNeUNvbnRhaW5lcnM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgQ29udGFpbmVyVGVzdCwgTXlDb250YWluZXJzKTsKKworLy8gVGVzdHMgdGhhdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgYW5kCisvLyBpbnN0YW50aWF0ZWQgaW4gYSBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSBsaWJyYXJ5MiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTnVtZXJpY1Rlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChOdW1lcmljVGVzdCk7CisKK1RZUEVEX1RFU1RfUChOdW1lcmljVGVzdCwgRGVmYXVsdElzWmVybykgeworICBFWFBFQ1RfRVEoMCwgVHlwZVBhcmFtKCkpOworfQorCitUWVBFRF9URVNUX1AoTnVtZXJpY1Rlc3QsIFplcm9Jc0xlc3NUaGFuT25lKSB7CisgIEVYUEVDVF9MVChUeXBlUGFyYW0oMCksIFR5cGVQYXJhbSgxKSk7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKE51bWVyaWNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElzWmVybywgWmVyb0lzTGVzc1RoYW5PbmUpOwordHlwZWRlZiBUeXBlczxpbnQsIGRvdWJsZT4gTnVtZXJpY1R5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIE51bWVyaWNUZXN0LCBOdW1lcmljVHlwZXMpOworCit9ICAvLyBuYW1lc3BhY2UgbGlicmFyeTIKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNpZiAhZGVmaW5lZChHVEVTVF9IQVNfVFlQRURfVEVTVCkgJiYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCkKKworLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIHNvbWUKKy8vIGNvbXBpbGVycy4gSWYgd2UgdXNlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIGNvbXBpbGUgb3V0IGFsbAorLy8gY29kZSByZWZlcnJpbmcgdG8gdGhlIGd0ZXN0X21haW4gbGlicmFyeSwgTVNWQyBsaW5rZXIgd2lsbCBub3QgbGluaworLy8gdGhhdCBsaWJyYXJ5IGF0IGFsbCBhbmQgY29uc2VxdWVudGx5IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZW50cnkKKy8vIHBvaW50IGRlZmluZWQgaW4gdGhhdCBsaWJyYXJ5IChmYXRhbCBlcnJvciBMTksxNTYxOiBlbnRyeSBwb2ludAorLy8gbXVzdCBiZSBkZWZpbmVkKS4gVGhpcyBkdW1teSB0ZXN0IGtlZXBzIGd0ZXN0X21haW4gbGlua2VkIGluLgorVEVTVChEdW1teVRlc3QsIFR5cGVkVGVzdHNBcmVOb3RTdXBwb3J0ZWRPblRoaXNQbGF0Zm9ybSkge30KKworI2VuZGlmICAvLyAjaWYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1QpICYmICFkZWZpbmVkKEdURVNUX0hBU19UWVBFRF9URVNUX1ApCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkNzU3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfVEVTVF9HVEVTVF9UWVBFRF9URVNUX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfVEVTVF9HVEVTVF9UWVBFRF9URVNUX1RFU1RfSF8KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3VzaW5nIHRlc3Rpbmc6OlRlc3Q7CisKKy8vIEZvciB0ZXN0aW5nIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorLy8gQ29udGFpbmVyVGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZCBpbiBib3RoIGd0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYworLy8gYW5kIGd0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQ29udGFpbmVyVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKENvbnRhaW5lclRlc3QpOworCitUWVBFRF9URVNUX1AoQ29udGFpbmVyVGVzdCwgQ2FuQmVEZWZhdWx0Q29uc3RydWN0ZWQpIHsKKyAgVHlwZVBhcmFtIGNvbnRhaW5lcjsKK30KKworVFlQRURfVEVTVF9QKENvbnRhaW5lclRlc3QsIEluaXRpYWxTaXplSXNaZXJvKSB7CisgIFR5cGVQYXJhbSBjb250YWluZXI7CisgIEVYUEVDVF9FUSgwVSwgY29udGFpbmVyLnNpemUoKSk7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENvbnRhaW5lclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5CZURlZmF1bHRDb25zdHJ1Y3RlZCwgSW5pdGlhbFNpemVJc1plcm8pOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2VuZGlmICAvLyBHVEVTVF9URVNUX0dURVNUX1RZUEVEX1RFU1RfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXVuaXR0ZXN0LWFwaV90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0LXVuaXR0ZXN0LWFwaV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDgzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MKQEAgLTAsMCArMSwzNDEgQEAKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRlc3RzIHZlcmlmeWluZyBjb3JyZWN0bmVzcyBvZiBkYXRhIHByb3ZpZGVkIHZpYQorLy8gVW5pdFRlc3QncyBwdWJsaWMgbWV0aG9kcy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIEZvciBzdHJjbXAuCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBMZXNzQnlOYW1lIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQqIGEsIGNvbnN0IFQqIGIpIHsKKyAgICByZXR1cm4gc3RyY21wKGEtPm5hbWUoKSwgYi0+bmFtZSgpKSA8IDA7CisgIH0KK307CisKK2NsYXNzIFVuaXRUZXN0SGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdGhlIGFycmF5IG9mIHBvaW50ZXJzIHRvIGFsbCB0ZXN0IGNhc2VzIHNvcnRlZCBieSB0aGUgdGVzdCBjYXNlCisgIC8vIG5hbWUuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgYXJyYXkuCisgIHN0YXRpYyBUZXN0Q2FzZSBjb25zdCoqIGNvbnN0IEdldFNvcnRlZFRlc3RDYXNlcygpIHsKKyAgICBVbml0VGVzdCYgdW5pdF90ZXN0ID0gKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworICAgIFRlc3RDYXNlIGNvbnN0KiogY29uc3QgdGVzdF9jYXNlcyA9CisgICAgICAgIG5ldyBjb25zdCBUZXN0Q2FzZSpbdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpXTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpCisgICAgICB0ZXN0X2Nhc2VzW2ldID0gdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworCisgICAgc3RkOjpzb3J0KHRlc3RfY2FzZXMsCisgICAgICAgICAgICAgIHRlc3RfY2FzZXMgKyB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCksCisgICAgICAgICAgICAgIExlc3NCeU5hbWU8VGVzdENhc2U+KCkpOworICAgIHJldHVybiB0ZXN0X2Nhc2VzOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIGJ5IGl0cyBuYW1lLiAgVGhlIGNhbGxlciBkb2Vzbid0IG93biB0aGUgcmV0dXJuZWQKKyAgLy8gcG9pbnRlci4KKyAgc3RhdGljIGNvbnN0IFRlc3RDYXNlKiBGaW5kVGVzdENhc2UoY29uc3QgY2hhciogbmFtZSkgeworICAgIFVuaXRUZXN0JiB1bml0X3Rlc3QgPSAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgICAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IHVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKTsKKyAgICAgIGlmICgwID09IHN0cmNtcCh0ZXN0X2Nhc2UtPm5hbWUoKSwgbmFtZSkpCisgICAgICAgIHJldHVybiB0ZXN0X2Nhc2U7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIHRlc3RzIGluIGEgcGFydGljdWxhciB0ZXN0IGNhc2UKKyAgLy8gc29ydGVkIGJ5IHRoZSB0ZXN0IG5hbWUuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUKKyAgLy8gYXJyYXkuCisgIHN0YXRpYyBUZXN0SW5mbyBjb25zdCoqIGNvbnN0IEdldFNvcnRlZFRlc3RzKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgICBUZXN0SW5mbyBjb25zdCoqIGNvbnN0IHRlc3RzID0KKyAgICAgICAgbmV3IGNvbnN0IFRlc3RJbmZvKlt0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKV07CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpOyArK2kpCisgICAgICB0ZXN0c1tpXSA9IHRlc3RfY2FzZS0+R2V0VGVzdEluZm8oaSk7CisKKyAgICBzdGQ6OnNvcnQodGVzdHMsIHRlc3RzICsgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCksCisgICAgICAgICAgICAgIExlc3NCeU5hbWU8VGVzdEluZm8+KCkpOworICAgIHJldHVybiB0ZXN0czsKKyAgfQorfTsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgVGVzdENhc2VXaXRoQ29tbWVudFRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKK1RZUEVEX1RFU1RfQ0FTRShUZXN0Q2FzZVdpdGhDb21tZW50VGVzdCwgVHlwZXM8aW50Pik7CitUWVBFRF9URVNUKFRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LCBEdW1teSkge30KKworY29uc3QgaW50IGtUeXBlZFRlc3RDYXNlcyA9IDE7Citjb25zdCBpbnQga1R5cGVkVGVzdHMgPSAxOworI2Vsc2UKK2NvbnN0IGludCBrVHlwZWRUZXN0Q2FzZXMgPSAwOworY29uc3QgaW50IGtUeXBlZFRlc3RzID0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gV2UgY2FuIG9ubHkgdGVzdCB0aGUgYWNjZXNzb3JzIHRoYXQgZG8gbm90IGNoYW5nZSB2YWx1ZSB3aGlsZSB0ZXN0cyBydW4uCisvLyBTaW5jZSB0ZXN0cyBjYW4gYmUgcnVuIGluIGFueSBvcmRlciwgdGhlIHZhbHVlcyB0aGUgYWNjZXNzb3JzIHRoYXQgdHJhY2sKKy8vIHRlc3QgZXhlY3V0aW9uIChzdWNoIGFzIGZhaWxlZF90ZXN0X2NvdW50KSBjYW4gbm90IGJlIHByZWRpY3RlZC4KK1RFU1QoQXBpVGVzdCwgVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrKSB7CisgIFVuaXRUZXN0KiB1bml0X3Rlc3QgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKKworICBBU1NFUlRfRVEoMiArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxICsga1R5cGVkVGVzdENhc2VzLCB1bml0X3Rlc3QtPnRlc3RfY2FzZV90b19ydW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgyLCB1bml0X3Rlc3QtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSg1ICsga1R5cGVkVGVzdHMsIHVuaXRfdGVzdC0+dG90YWxfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDMgKyBrVHlwZWRUZXN0cywgdW5pdF90ZXN0LT50ZXN0X3RvX3J1bl9jb3VudCgpKTsKKworICBjb25zdCBUZXN0Q2FzZSoqIGNvbnN0IHRlc3RfY2FzZXMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdENhc2VzKCk7CisKKyAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdF9jYXNlc1swXS0+bmFtZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlc1sxXS0+bmFtZSgpKTsKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0X2Nhc2VzWzJdLT5uYW1lKCkpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisgIGRlbGV0ZVtdIHRlc3RfY2FzZXM7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBpbml0aWF0ZSBhY3Rpb25zIHRvIHZlcmlmeSBjZXJ0YWluIG1ldGhvZHMgaW4KKyAgLy8gRmluYWxTdWNjZXNzQ2hlY2tlcjo6VGVhckRvd24uCisKKyAgLy8gUmVjb3JkcyBhIHRlc3QgcHJvcGVydHkgdG8gdmVyaWZ5IFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eSgpLgorICBSZWNvcmRQcm9wZXJ0eSgia2V5IiwgInZhbHVlIik7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc051bGwoY29uc3QgY2hhciogc3RyKSB7CisgIGlmIChzdHIgIT0gTlVMTCkgeworICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgImFyZ3VtZW50IGlzICIgPDwgc3RyOworICB9CisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKK1RFU1QoQXBpVGVzdCwgVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrKSB7CisgIGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UgPSBVbml0VGVzdEhlbHBlcjo6RmluZFRlc3RDYXNlKCJBcGlUZXN0Iik7CisgIEFTU0VSVF9UUlVFKHRlc3RfY2FzZSAhPSBOVUxMKTsKKworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSk7CisgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2UtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSgzLCB0ZXN0X2Nhc2UtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworICBBU1NFUlRfRVEoNCwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCkpOworCisgIGNvbnN0IFRlc3RJbmZvKiogdGVzdHMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdHModGVzdF9jYXNlKTsKKworICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX0R1bW15MSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMF0tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfRkFMU0UodGVzdHNbMF0tPnNob3VsZF9ydW4oKSk7CisKKyAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZURpc2FibGVkQWNjZXNzb3JzV29yayIsIHRlc3RzWzFdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1sxXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMV0tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1sxXS0+c2hvdWxkX3J1bigpKTsKKworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlSW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzJdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1syXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMl0tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1syXS0+c2hvdWxkX3J1bigpKTsKKworICBFWFBFQ1RfU1RSRVEoIlVuaXRUZXN0SW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzNdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1szXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbM10tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1szXS0+c2hvdWxkX3J1bigpKTsKKworICBkZWxldGVbXSB0ZXN0czsKKyAgdGVzdHMgPSBOVUxMOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIpOworICBBU1NFUlRfVFJVRSh0ZXN0X2Nhc2UgIT0gTlVMTCk7CisKKyAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIiwgdGVzdF9jYXNlLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpKTsKKyAgRVhQRUNUX1RSVUUodGVzdF9jYXNlLT5zaG91bGRfcnVuKCkpOworICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgdGVzdF9jYXNlLT50ZXN0X3RvX3J1bl9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpKTsKKworICB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOworCisgIEVYUEVDVF9TVFJFUSgiRHVtbXkiLCB0ZXN0c1swXS0+bmFtZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIiwgdGVzdHNbMF0tPnRlc3RfY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMF0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgRVhQRUNUX1NUUkVRKEdldFR5cGVOYW1lPGludD4oKS5jX3N0cigpLCB0ZXN0c1swXS0+dHlwZV9wYXJhbSgpKTsKKyAgRVhQRUNUX1RSVUUodGVzdHNbMF0tPnNob3VsZF9ydW4oKSk7CisKKyAgZGVsZXRlW10gdGVzdHM7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCit9CisKK1RFU1QoQXBpVGVzdCwgVGVzdENhc2VEaXNhYmxlZEFjY2Vzc29yc1dvcmspIHsKKyAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIkRJU0FCTEVEX1Rlc3QiKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9jYXNlICE9IE5VTEwpOworCisgIEVYUEVDVF9TVFJFUSgiRElTQUJMRURfVGVzdCIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSk7CisgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2UtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2UtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCkpOworCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPkdldFRlc3RJbmZvKDApOworICBFWFBFQ1RfU1RSRVEoIkR1bW15MiIsIHRlc3RfaW5mby0+bmFtZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfaW5mby0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9pbmZvLT50eXBlX3BhcmFtKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RfaW5mby0+c2hvdWxkX3J1bigpKTsKK30KKworLy8gVGhlc2UgdHdvIHRlc3RzIGFyZSBoZXJlIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGVzdGluZworLy8gdGVzdF9jYXNlX3RvX3J1bl9jb3VudCwgZGlzYWJsZWRfdGVzdF9jb3VudCwgYW5kIHRlc3RfdG9fcnVuX2NvdW50LgorVEVTVChBcGlUZXN0LCBESVNBQkxFRF9EdW1teTEpIHt9CitURVNUKERJU0FCTEVEX1Rlc3QsIER1bW15Mikge30KKworY2xhc3MgRmluYWxTdWNjZXNzQ2hlY2tlciA6IHB1YmxpYyBFbnZpcm9ubWVudCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgVW5pdFRlc3QqIHVuaXRfdGVzdCA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgICAgRVhQRUNUX0VRKDEgKyBrVHlwZWRUZXN0Q2FzZXMsIHVuaXRfdGVzdC0+c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDMgKyBrVHlwZWRUZXN0cywgdW5pdF90ZXN0LT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHVuaXRfdGVzdC0+ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdW5pdF90ZXN0LT5mYWlsZWRfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh1bml0X3Rlc3QtPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodW5pdF90ZXN0LT5GYWlsZWQoKSk7CisgICAgQVNTRVJUX0VRKDIgKyBrVHlwZWRUZXN0Q2FzZXMsIHVuaXRfdGVzdC0+dG90YWxfdGVzdF9jYXNlX2NvdW50KCkpOworCisgICAgY29uc3QgVGVzdENhc2UqKiBjb25zdCB0ZXN0X2Nhc2VzID0gVW5pdFRlc3RIZWxwZXI6OkdldFNvcnRlZFRlc3RDYXNlcygpOworCisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdF9jYXNlc1swXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlc1swXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9jYXNlc1swXS0+c2hvdWxkX3J1bigpKTsKKyAgICBFWFBFQ1RfRVEoMSwgdGVzdF9jYXNlc1swXS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNCwgdGVzdF9jYXNlc1swXS0+dG90YWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMywgdGVzdF9jYXNlc1swXS0+c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2VzWzBdLT5mYWlsZWRfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VzWzBdLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZXNbMF0tPkZhaWxlZCgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiRElTQUJMRURfVGVzdCIsIHRlc3RfY2FzZXNbMV0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfY2FzZXNbMV0tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2VzWzFdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2VzWzFdLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICAgIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2VzWzFdLT50b3RhbF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2VzWzFdLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMV0tPmZhaWxlZF90ZXN0X2NvdW50KCkpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0X2Nhc2VzWzJdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUShHZXRUeXBlTmFtZTxpbnQ+KCkuY19zdHIoKSwgdGVzdF9jYXNlc1syXS0+dHlwZV9wYXJhbSgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VzWzJdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2VzWzJdLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICAgIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2VzWzJdLT50b3RhbF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2VzWzJdLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMl0tPmZhaWxlZF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMl0tPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGVzdF9jYXNlc1syXS0+RmFpbGVkKCkpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisgICAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIkFwaVRlc3QiKTsKKyAgICBjb25zdCBUZXN0SW5mbyoqIHRlc3RzID0gVW5pdFRlc3RIZWxwZXI6OkdldFNvcnRlZFRlc3RzKHRlc3RfY2FzZSk7CisgICAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9EdW1teTEiLCB0ZXN0c1swXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3RzWzBdLT5zaG91bGRfcnVuKCkpOworCisgICAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZURpc2FibGVkQWNjZXNzb3JzV29yayIsIHRlc3RzWzFdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzFdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMV0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMV0tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzFdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzFdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0c1sxXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlSW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzJdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzJdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMl0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMl0tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzJdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzJdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0c1syXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlVuaXRUZXN0SW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzNdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzNdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbM10tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbM10tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzNdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzNdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0c1szXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSA9IHRlc3RzWzNdLT5yZXN1bHQoKS0+R2V0VGVzdFByb3BlcnR5KDApOworICAgIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOworICAgIEVYUEVDVF9TVFJFUSgidmFsdWUiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKKworICAgIGRlbGV0ZVtdIHRlc3RzOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgICB0ZXN0X2Nhc2UgPSBVbml0VGVzdEhlbHBlcjo6RmluZFRlc3RDYXNlKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIik7CisgICAgdGVzdHMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdHModGVzdF9jYXNlKTsKKworICAgIEVYUEVDVF9TVFJFUSgiRHVtbXkiLCB0ZXN0c1swXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgICAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzBdLT52YWx1ZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1NUUkVRKEdldFR5cGVOYW1lPGludD4oKS5jX3N0cigpLCB0ZXN0c1swXS0+dHlwZV9wYXJhbSgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0c1swXS0+cmVzdWx0KCktPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGVzdHNbMF0tPnJlc3VsdCgpLT50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworCisgICAgZGVsZXRlW10gdGVzdHM7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisgICAgZGVsZXRlW10gdGVzdF9jYXNlczsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgdGVzdGluZzo6aW50ZXJuYWw6OkZpbmFsU3VjY2Vzc0NoZWNrZXIoKSk7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9hbGxfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9hbGxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVhYTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFNvbWV0aW1lcyBpdCdzIGRlc2lyYWJsZSB0byBidWlsZCBtb3N0IG9mIEdvb2dsZSBUZXN0J3Mgb3duIHRlc3RzCisvLyBieSBjb21waWxpbmcgYSBzaW5nbGUgZmlsZS4gIFRoaXMgZmlsZSBzZXJ2ZXMgdGhpcyBwdXJwb3NlLgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXBvcnRfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvcHJvZHVjdGlvbi5jYyIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzgxOTE4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMjE4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorCitBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBzZWctZmF1bHQgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHMsIHVzaW5nCitlaXRoZXIgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlCistLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZy4gIFRoaXMgc2NyaXB0IHRlc3RzIHN1Y2ggZnVuY3Rpb25hbGl0eQorYnkgaW52b2tpbmcgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGgKK0dvb2dsZSBUZXN0KSB3aXRoIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYW5kIGNvbW1hbmQgbGluZSBmbGFncy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKKworIyBDb25zdGFudHMuCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorQlJFQUtfT05fRkFJTFVSRV9FTlZfVkFSID0gJ0dURVNUX0JSRUFLX09OX0ZBSUxVUkUnCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIGJyZWFrLW9uLWZhaWx1cmUgbW9kZS4KK0JSRUFLX09OX0ZBSUxVUkVfRkxBRyA9ICdndGVzdF9icmVha19vbl9mYWlsdXJlJworCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuCitUSFJPV19PTl9GQUlMVVJFX0VOVl9WQVIgPSAnR1RFU1RfVEhST1dfT05fRkFJTFVSRScKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgY2F0Y2gtZXhjZXB0aW9ucyBtb2RlLgorQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSID0gJ0dURVNUX0NBVENIX0VYQ0VQVElPTlMnCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8gcHJvZ3JhbS4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgJ2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfJykKKworCisjIFV0aWxpdGllcy4KKworCitlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKworCitkZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKKyAgIiIiU2V0cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIGdpdmVuIHZhbHVlOyB1bnNldHMgaXQgd2hlbiB0aGUKKyAgZ2l2ZW4gdmFsdWUgaXMgTm9uZS4KKyAgIiIiCisKKyAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCisgIGVsaWYgZW52X3ZhciBpbiBlbnZpcm9uOgorICAgIGRlbCBlbnZpcm9uW2Vudl92YXJdCisKKworZGVmIFJ1bihjb21tYW5kKToKKyAgIiIiUnVucyBhIGNvbW1hbmQ7IHJldHVybnMgMSBpZiBpdCB3YXMga2lsbGVkIGJ5IGEgc2lnbmFsLCBvciAwIG90aGVyd2lzZS4iIiIKKworICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQsIGVudj1lbnZpcm9uKQorICBpZiBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsOgorICAgIHJldHVybiAxCisgIGVsc2U6CisgICAgcmV0dXJuIDAKKworCisjIFRoZSB0ZXN0cy4KKworCitjbGFzcyBHVGVzdEJyZWFrT25GYWlsdXJlVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHVzaW5nIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlIG9yCisgIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZyB0byB0dXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvCisgIHNlZ21lbnRhdGlvbiBmYXVsdHMuCisgICIiIgorCisgIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZW52X3Zhcl92YWx1ZSwgZmxhZ192YWx1ZSwgZXhwZWN0X3NlZ19mYXVsdCk6CisgICAgIiIiUnVucyBndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XyBhbmQgdmVyaWZpZXMgdGhhdCBpdCBkb2VzCisgICAgKG9yIGRvZXMgbm90KSBoYXZlIGEgc2VnLWZhdWx0LgorCisgICAgQXJnczoKKyAgICAgIGVudl92YXJfdmFsdWU6ICAgIHZhbHVlIG9mIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTsgTm9uZSBpZiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHVuc2V0LgorICAgICAgZmxhZ192YWx1ZTogICAgICAgdmFsdWUgb2YgdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnOworICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSBpZiB0aGUgZmxhZyBzaG91bGQgbm90IGJlIHByZXNlbnQuCisgICAgICBleHBlY3Rfc2VnX2ZhdWx0OiAxIGlmIHRoZSBwcm9ncmFtIGlzIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGEgc2VnLWZhdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgMCBvdGhlcndpc2UuCisgICAgIiIiCisKKyAgICBTZXRFbnZWYXIoQlJFQUtfT05fRkFJTFVSRV9FTlZfVkFSLCBlbnZfdmFyX3ZhbHVlKQorCisgICAgaWYgZW52X3Zhcl92YWx1ZSBpcyBOb25lOgorICAgICAgZW52X3Zhcl92YWx1ZV9tc2cgPSAnIGlzIG5vdCBzZXQnCisgICAgZWxzZToKKyAgICAgIGVudl92YXJfdmFsdWVfbXNnID0gJz0nICsgZW52X3Zhcl92YWx1ZQorCisgICAgaWYgZmxhZ192YWx1ZSBpcyBOb25lOgorICAgICAgZmxhZyA9ICcnCisgICAgZWxpZiBmbGFnX3ZhbHVlID09ICcwJzoKKyAgICAgIGZsYWcgPSAnLS0lcz0wJyAlIEJSRUFLX09OX0ZBSUxVUkVfRkxBRworICAgIGVsc2U6CisgICAgICBmbGFnID0gJy0tJXMnICUgQlJFQUtfT05fRkFJTFVSRV9GTEFHCisKKyAgICBjb21tYW5kID0gW0VYRV9QQVRIXQorICAgIGlmIGZsYWc6CisgICAgICBjb21tYW5kLmFwcGVuZChmbGFnKQorCisgICAgaWYgZXhwZWN0X3NlZ19mYXVsdDoKKyAgICAgIHNob3VsZF9vcl9ub3QgPSAnc2hvdWxkJworICAgIGVsc2U6CisgICAgICBzaG91bGRfb3Jfbm90ID0gJ3Nob3VsZCBub3QnCisKKyAgICBoYXNfc2VnX2ZhdWx0ID0gUnVuKGNvbW1hbmQpCisKKyAgICBTZXRFbnZWYXIoQlJFQUtfT05fRkFJTFVSRV9FTlZfVkFSLCBOb25lKQorCisgICAgbXNnID0gKCd3aGVuICVzJXMsIGFuIGFzc2VydGlvbiBmYWlsdXJlIGluICIlcyIgJXMgY2F1c2UgYSBzZWctZmF1bHQuJyAlCisgICAgICAgICAgIChCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIsIGVudl92YXJfdmFsdWVfbXNnLCAnICcuam9pbihjb21tYW5kKSwKKyAgICAgICAgICAgIHNob3VsZF9vcl9ub3QpKQorICAgIHNlbGYuYXNzZXJ0XyhoYXNfc2VnX2ZhdWx0ID09IGV4cGVjdF9zZWdfZmF1bHQsIG1zZykKKworICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgbW9kZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQorCisgIGRlZiB0ZXN0RW52VmFyKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MCkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQorCisgIGRlZiB0ZXN0RmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWcuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisKKyAgZGVmIHRlc3RGbGFnT3ZlcnJpZGVzRW52VmFyKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgdGhlIGZsYWcgb3ZlcnJpZGVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MCkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKworICBkZWYgdGVzdEJyZWFrT25GYWlsdXJlT3ZlcnJpZGVzVGhyb3dPbkZhaWx1cmUoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCBndGVzdF9icmVha19vbl9mYWlsdXJlIG92ZXJyaWRlcyBndGVzdF90aHJvd19vbl9mYWlsdXJlLiIiIgorCisgICAgU2V0RW52VmFyKFRIUk9XX09OX0ZBSUxVUkVfRU5WX1ZBUiwgJzEnKQorICAgIHRyeToKKyAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQorICAgIGZpbmFsbHk6CisgICAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRV9FTlZfVkFSLCBOb25lKQorCisgIGlmIElTX1dJTkRPV1M6CisgICAgZGVmIHRlc3RDYXRjaEV4Y2VwdGlvbnNEb2VzTm90SW50ZXJmZXJlKHNlbGYpOgorICAgICAgIiIiVGVzdHMgdGhhdCBndGVzdF9jYXRjaF9leGNlcHRpb25zIGRvZXNuJ3QgaW50ZXJmZXJlLiIiIgorCisgICAgICBTZXRFbnZWYXIoQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSLCAnMScpCisgICAgICB0cnk6CisgICAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQorICAgICAgZmluYWxseToKKyAgICAgICAgU2V0RW52VmFyKENBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUiwgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDc0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8uY2MKQEAgLTAsMCArMSw4OCBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIGJyZWFrLW9uLWZhaWx1cmUgbW9kZS4KKy8vCisvLyBBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBzZWctZmF1bHQgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHMsIHVzaW5nCisvLyBlaXRoZXIgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlCisvLyAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZy4gIFRoaXMgZmlsZSBpcyB1c2VkIGZvciB0ZXN0aW5nIHN1Y2gKKy8vIGZ1bmN0aW9uYWxpdHkuCisvLworLy8gVGhpcyBwcm9ncmFtIHdpbGwgYmUgaW52b2tlZCBmcm9tIGEgUHl0aG9uIHVuaXQgdGVzdC4gIEl0IGlzCisvLyBleHBlY3RlZCB0byBmYWlsLiAgRG9uJ3QgcnVuIGl0IGRpcmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgeworCisvLyBBIHRlc3QgdGhhdCdzIGV4cGVjdGVkIHRvIGZhaWwuCitURVNUKEZvbywgQmFyKSB7CisgIEVYUEVDVF9FUSgyLCAzKTsKK30KKworI2lmIEdURVNUX0hBU19TRUggJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBPbiBXaW5kb3dzIE1vYmlsZSBnbG9iYWwgZXhjZXB0aW9uIGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgorTE9ORyBXSU5BUEkgRXhpdFdpdGhFeGNlcHRpb25Db2RlKAorICAgIHN0cnVjdCBfRVhDRVBUSU9OX1BPSU5URVJTKiBleGNlcHRpb25fcG9pbnRlcnMpIHsKKyAgZXhpdChleGNlcHRpb25fcG9pbnRlcnMtPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZSk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gU3VwcHJlc3NlcyBkaXNwbGF5IG9mIHRoZSBXaW5kb3dzIGVycm9yIGRpYWxvZyB1cG9uIGVuY291bnRlcmluZworICAvLyBhIGdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCAoc2VnbWVudCB2aW9sYXRpb24pLgorICBTZXRFcnJvck1vZGUoU0VNX05PR1BGQVVMVEVSUk9SQk9YIHwgU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7CisKKyMgaWYgR1RFU1RfSEFTX1NFSCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICAvLyBUaGUgZGVmYXVsdCB1bmhhbmRsZWQgZXhjZXB0aW9uIGZpbHRlciBkb2VzIG5vdCBhbHdheXMgZXhpdAorICAvLyB3aXRoIHRoZSBleGNlcHRpb24gY29kZSBhcyBleGl0IGNvZGUgLSBmb3IgZXhhbXBsZSBpdCBleGl0cyB3aXRoCisgIC8vIDAgZm9yIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OIGFuZCAxIGZvciBFWENFUFRJT05fQlJFQUtQT0lOVAorICAvLyBpZiB0aGUgYXBwbGljYXRpb24gaXMgY29tcGlsZWQgaW4gZGVidWcgbW9kZS4gVGh1cyB3ZSB1c2Ugb3VyIG93bgorICAvLyBmaWx0ZXIgd2hpY2ggYWx3YXlzIGV4aXRzIHdpdGggdGhlIGV4Y2VwdGlvbiBjb2RlIGZvciB1bmhhbmRsZWQKKyAgLy8gZXhjZXB0aW9ucy4KKyAgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKEV4aXRXaXRoRXhjZXB0aW9uQ29kZSk7CisKKyMgZW5kaWYKKyNlbmRpZgorCisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDdlZjEwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkKQEAgLTAsMCArMSwyMjMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIEdvb2dsZSBUZXN0J3MgZXhjZXB0aW9uIGNhdGNoaW5nIGJlaGF2aW9yLgorCitUaGlzIHNjcmlwdCBpbnZva2VzIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8gYW5kCitndGVzdF9jYXRjaF9leGNlcHRpb25zX2V4X3Rlc3RfIChwcm9ncmFtcyB3cml0dGVuIHdpdGgKK0dvb2dsZSBUZXN0KSBhbmQgdmVyaWZpZXMgdGhlaXIgb3V0cHV0LgorIiIiCisKK19fYXV0aG9yX18gPSAndmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldiknCisKK2ltcG9ydCBvcworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisjIENvbnN0YW50cy4KK0ZMQUdfUFJFRklYID0gJy0tZ3Rlc3RfJworTElTVF9URVNUU19GTEFHID0gRkxBR19QUkVGSVggKyAnbGlzdF90ZXN0cycKK05PX0NBVENIX0VYQ0VQVElPTlNfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2NhdGNoX2V4Y2VwdGlvbnM9MCcKK0ZJTFRFUl9GTEFHID0gRkxBR19QUkVGSVggKyAnZmlsdGVyJworCisjIFBhdGggdG8gdGhlIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfZXhfdGVzdF8gYmluYXJ5LCBjb21waWxlZCB3aXRoCisjIGV4Y2VwdGlvbnMgZW5hYmxlZC4KK0VYX0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgJ2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfZXhfdGVzdF8nKQorCisjIFBhdGggdG8gdGhlIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8gYmluYXJ5LCBjb21waWxlZCB3aXRoCisjIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCitFWEVfUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKAorICAgICdndGVzdF9jYXRjaF9leGNlcHRpb25zX25vX2V4X3Rlc3RfJykKKworVEVTVF9MSVNUID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtFWEVfUEFUSCwgTElTVF9URVNUU19GTEFHXSkub3V0cHV0CisKK1NVUFBPUlRTX1NFSF9FWENFUFRJT05TID0gJ1Rocm93c1NlaEV4Y2VwdGlvbicgaW4gVEVTVF9MSVNUCisKK2lmIFNVUFBPUlRTX1NFSF9FWENFUFRJT05TOgorICBCSU5BUllfT1VUUFVUID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtFWEVfUEFUSF0pLm91dHB1dAorCitFWF9CSU5BUllfT1VUUFVUID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtFWF9FWEVfUEFUSF0pLm91dHB1dAorCisjIFRoZSB0ZXN0cy4KK2lmIFNVUFBPUlRTX1NFSF9FWENFUFRJT05TOgorICAjIHB5bGludDpkaXNhYmxlLW1zZz1DNjMwMgorICBjbGFzcyBDYXRjaFNlaEV4Y2VwdGlvbnNUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGV4Y2VwdGlvbi1jYXRjaGluZyBiZWhhdmlvci4iIiIKKworCisgICAgZGVmIFRlc3RTZWhFeGNlcHRpb25zKHNlbGYsIHRlc3Rfb3V0cHV0KToKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gJworICAgICAgICAgICAgICAgICAgICdpbiB0aGUgdGVzdCBmaXh0dXJlXCdzIGNvbnN0cnVjdG9yJworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgZGVzdHJ1Y3RvcicKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gU2V0VXBUZXN0Q2FzZSgpJworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biBpbiBUZWFyRG93blRlc3RDYXNlKCknCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duIGluIFNldFVwKCknCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duIGluIFRlYXJEb3duKCknCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duIGluIHRoZSB0ZXN0IGJvZHknCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisKKyAgICBkZWYgdGVzdENhdGNoZXNTZWhFeGNlcHRpb25zV2l0aEN4eEV4Y2VwdGlvbnNFbmFibGVkKHNlbGYpOgorICAgICAgc2VsZi5UZXN0U2VoRXhjZXB0aW9ucyhFWF9CSU5BUllfT1VUUFVUKQorCisgICAgZGVmIHRlc3RDYXRjaGVzU2VoRXhjZXB0aW9uc1dpdGhDeHhFeGNlcHRpb25zRGlzYWJsZWQoc2VsZik6CisgICAgICBzZWxmLlRlc3RTZWhFeGNlcHRpb25zKEJJTkFSWV9PVVRQVVQpCisKKworY2xhc3MgQ2F0Y2hDeHhFeGNlcHRpb25zVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgQysrIGV4Y2VwdGlvbi1jYXRjaGluZyBiZWhhdmlvci4KKworICAgICBUZXN0cyBpbiB0aGlzIHRlc3QgY2FzZSB2ZXJpZnkgdGhhdDoKKyAgICAgKiBDKysgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCBsb2dnZWQgYXMgQysrIChub3QgU0VIKSBleGNlcHRpb25zCisgICAgICogRXhjZXB0aW9uIHRocm93biBhZmZlY3QgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVzdCB3b3JrIGZsb3cgaW4gdGhlCisgICAgICAgZXhwZWN0ZWQgbWFubmVyLgorICAiIiIKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5GaXh0dXJlQ29uc3RydWN0b3Ioc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gJworICAgICAgICAgICAgICAgICAnIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iIHRocm93biAnCisgICAgICAgICAgICAgICAgICdpbiB0aGUgdGVzdCBmaXh0dXJlXCdzIGNvbnN0cnVjdG9yJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygndW5leHBlY3RlZCcgbm90IGluIEVYX0JJTkFSWV9PVVRQVVQsCisgICAgICAgICAgICAgICAgICdUaGlzIGZhaWx1cmUgYmVsb25ncyBpbiB0aGlzIHRlc3Qgb25seSBpZiAnCisgICAgICAgICAgICAgICAgICciQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QiIChubyBxdW90ZXMpICcKKyAgICAgICAgICAgICAgICAgJ2FwcGVhcnMgb24gdGhlIHNhbWUgbGluZSBhcyB3b3JkcyAiY2FsbGVkIHVuZXhwZWN0ZWRseSInKQorCisgIGlmICgnQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdC5UaHJvd3NFeGNlcHRpb25JbkRlc3RydWN0b3InIGluCisgICAgICBFWF9CSU5BUllfT1VUUFVUKToKKworICAgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJbkZpeHR1cmVEZXN0cnVjdG9yKHNlbGYpOgorICAgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gJworICAgICAgICAgICAgICAgICAgICciU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIgdGhyb3duICcKKyAgICAgICAgICAgICAgICAgICAnaW4gdGhlIHRlc3QgZml4dHVyZVwncyBkZXN0cnVjdG9yJworICAgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5TZXRVcFRlc3RDYXNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIicKKyAgICAgICAgICAgICAgICAgJyB0aHJvd24gaW4gU2V0VXBUZXN0Q2FzZSgpJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBjb25zdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBkZXN0cnVjdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpTZXRVcCgpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpUZWFyRG93bigpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IHRlc3QgYm9keSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblRlYXJEb3duVGVzdENhc2Uoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiBUZWFyRG93blRlc3RDYXNlKCknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luU2V0VXAoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiBTZXRVcCgpJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgZGVzdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3Q6OlRlYXJEb3duKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ3VuZXhwZWN0ZWQnIG5vdCBpbiBFWF9CSU5BUllfT1VUUFVULAorICAgICAgICAgICAgICAgICAnVGhpcyBmYWlsdXJlIGJlbG9uZ3MgaW4gdGhpcyB0ZXN0IG9ubHkgaWYgJworICAgICAgICAgICAgICAgICAnIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IiAobm8gcXVvdGVzKSAnCisgICAgICAgICAgICAgICAgICdhcHBlYXJzIG9uIHRoZSBzYW1lIGxpbmUgYXMgd29yZHMgImNhbGxlZCB1bmV4cGVjdGVkbHkiJykKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5UZWFyRG93bihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCisgICAgICAgICAgICAgICAgICcgdGhyb3duIGluIFRlYXJEb3duKCknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCBkZXN0cnVjdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luVGVzdEJvZHkoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiB0aGUgdGVzdCBib2R5JworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QgZGVzdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdENhdGNoZXNOb25TdGRDeHhFeGNlcHRpb25zKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnVW5rbm93biBDKysgZXhjZXB0aW9uIHRocm93biBpbiB0aGUgdGVzdCBib2R5JworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0VW5oYW5kbGVkQ3h4RXhjZXB0aW9uc0Fib3J0VGhlUHJvZ3JhbShzZWxmKToKKyAgICAjIEZpbHRlcnMgb3V0IFNFSCBleGNlcHRpb24gdGVzdHMgb24gV2luZG93cy4gVW5oYW5kbGVkIFNFSCBleGNlcHRpb25zCisgICAgIyBjYXVzZSB0ZXN0cyB0byBzaG93IHBvcC11cCB3aW5kb3dzIHRoZXJlLgorICAgIEZJVExFUl9PVVRfU0VIX1RFU1RTX0ZMQUcgPSBGSUxURVJfRkxBRyArICc9LSpTZWgqJworICAgICMgQnkgZGVmYXVsdCwgR29vZ2xlIFRlc3QgZG9lc24ndCBjYXRjaCB0aGUgZXhjZXB0aW9ucy4KKyAgICB1bmNhdWdodF9leGNlcHRpb25zX2V4X2JpbmFyeV9vdXRwdXQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgICAgIFtFWF9FWEVfUEFUSCwKKyAgICAgICAgIE5PX0NBVENIX0VYQ0VQVElPTlNfRkxBRywKKyAgICAgICAgIEZJVExFUl9PVVRfU0VIX1RFU1RTX0ZMQUddKS5vdXRwdXQKKworICAgIHNlbGYuYXNzZXJ0XygnVW5oYW5kbGVkIEMrKyBleGNlcHRpb24gdGVybWluYXRpbmcgdGhlIHByb2dyYW0nCisgICAgICAgICAgICAgICAgIGluIHVuY2F1Z2h0X2V4Y2VwdGlvbnNfZXhfYmluYXJ5X291dHB1dCkKKyAgICBzZWxmLmFzc2VydF8oJ3VuZXhwZWN0ZWQnIG5vdCBpbiB1bmNhdWdodF9leGNlcHRpb25zX2V4X2JpbmFyeV9vdXRwdXQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmYzgyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMzExIEBACisvLyBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYuIFRlc3RzIGluIHRoaXMgZmlsZSB0aHJvdyBDKysgb3IgU0VICisvLyBleGNlcHRpb25zLCBhbmQgdGhlIG91dHB1dCBpcyB2ZXJpZmllZCBieSBndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIGV4aXQoKS4KKworI2lmIEdURVNUX0hBU19TRUgKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyBpbmNsdWRlIDxleGNlcHRpb24+ICAvLyBGb3Igc2V0X3Rlcm1pbmF0ZSgpLgorIyBpbmNsdWRlIDxzdGRleGNlcHQ+CisjZW5kaWYKKwordXNpbmcgdGVzdGluZzo6VGVzdDsKKworI2lmIEdURVNUX0hBU19TRUgKKworY2xhc3MgU2VoRXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBTZWhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QsIFRocm93c0V4Y2VwdGlvbkluQ29uc3RydWN0b3IpIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICB+U2VoRXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5EZXN0cnVjdG9yKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblNldFVwVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3QsIFRocm93c0V4Y2VwdGlvbkluU2V0VXApIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93bikge30KKworVEVTVChTZWhFeGNlcHRpb25UZXN0LCBUaHJvd3NTZWhFeGNlcHRpb24pIHsKKyAgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QoKSB7CisgICAgLy8gV2l0aG91dCB0aGlzIG1hY3JvIFZDKysgY29tcGxhaW5zIGFib3V0IHVucmVhY2hhYmxlIGNvZGUgYXQgdGhlIGVuZCBvZgorICAgIC8vIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKAorICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgZGVzdHJ1Y3RvciAiCisgICAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0OjpTZXRVcCgpICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjYWxsZWQgdW5leHBlY3RlZGx5LiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0LCBUaHJvd3NFeGNlcHRpb25JbkNvbnN0cnVjdG9yKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IHRlc3QgYm9keSAiCisgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKK30KKworLy8gRXhjZXB0aW9ucyBpbiBkZXN0cnVjdG9ycyBhcmUgbm90IHN1cHBvcnRlZCBpbiBDKysxMS4KKyNpZiAhZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykgJiYgIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorY2xhc3MgQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgfkN4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QoKSB7CisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXygKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIikpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5EZXN0cnVjdG9yKSB7fQorI2VuZGlmICAvLyBDKysxMSBtb2RlCisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0KCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBjb25zdHJ1Y3RvciAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5DeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0KCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdDo6U2V0VXAoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0LCBUaHJvd3NFeGNlcHRpb25JblNldFVwVGVzdENhc2UpIHsKKyAgcHJpbnRmKCIlcyIsCisgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCB0ZXN0IGJvZHkgIgorICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworfQorCitjbGFzcyBDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZVRlc3QsIFRocm93c0V4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZSkge30KKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0OjpUZWFyRG93bigpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QsIFRocm93c0V4Y2VwdGlvbkluU2V0VXApIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgdGVzdCBib2R5ICIKKyAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOworfQorCitjbGFzcyBDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5DeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IGRlc3RydWN0b3IgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93bikge30KKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCwgVGhyb3dzU3RkQ3h4RXhjZXB0aW9uKSB7CisgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOworfQorCitURVNUKEN4eEV4Y2VwdGlvblRlc3QsIFRocm93c05vblN0ZEN4eEV4Y2VwdGlvbikgeworICB0aHJvdyAiQy1zdHJpbmciOworfQorCisvLyBUaGlzIHRlcm1pbmF0ZSBoYW5kbGVyIGFib3J0cyB0aGUgcHJvZ3JhbSB1c2luZyBleGl0KCkgcmF0aGVyIHRoYW4gYWJvcnQoKS4KKy8vIFRoaXMgYXZvaWRzIHNob3dpbmcgcG9wLXVwcyBvbiBXaW5kb3dzIHN5c3RlbXMgYW5kIGNvcmUgZHVtcHMgb24gVW5peC1saWtlCisvLyBvbmVzLgordm9pZCBUZXJtaW5hdGVIYW5kbGVyKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCAiVW5oYW5kbGVkIEMrKyBleGNlcHRpb24gdGVybWluYXRpbmcgdGhlIHByb2dyYW0uIik7CisgIGZmbHVzaChOVUxMKTsKKyAgZXhpdCgzKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICBzdGQ6OnNldF90ZXJtaW5hdGUoJlRlcm1pbmF0ZUhhbmRsZXIpOworI2VuZGlmCisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDAyYTUzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5CkBAIC0wLDAgKzEsMTMwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IGNvcnJlY3RseSBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGNvbG9ycy4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID0gJ250JworCitDT0xPUl9FTlZfVkFSID0gJ0dURVNUX0NPTE9SJworQ09MT1JfRkxBRyA9ICdndGVzdF9jb2xvcicKK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfY29sb3JfdGVzdF8nKQorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIHRoZSBlbnYgdmFyaWFibGUgdG8gJ3ZhbHVlJzsgdW5zZXRzIGl0IHdoZW4gJ3ZhbHVlJyBpcyBOb25lLiIiIgorCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIG9zLmVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gb3MuZW52aXJvbjoKKyAgICBkZWwgb3MuZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBVc2VzQ29sb3IodGVybSwgY29sb3JfZW52X3ZhciwgY29sb3JfZmxhZyk6CisgICIiIlJ1bnMgZ3Rlc3RfY29sb3JfdGVzdF8gYW5kIHJldHVybnMgaXRzIGV4aXQgY29kZS4iIiIKKworICBTZXRFbnZWYXIoJ1RFUk0nLCB0ZXJtKQorICBTZXRFbnZWYXIoQ09MT1JfRU5WX1ZBUiwgY29sb3JfZW52X3ZhcikKKworICBpZiBjb2xvcl9mbGFnIGlzIE5vbmU6CisgICAgYXJncyA9IFtdCisgIGVsc2U6CisgICAgYXJncyA9IFsnLS0lcz0lcycgJSAoQ09MT1JfRkxBRywgY29sb3JfZmxhZyldCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgYXJncykKKyAgcmV0dXJuIG5vdCBwLmV4aXRlZCBvciBwLmV4aXRfY29kZQorCisKK2NsYXNzIEdUZXN0Q29sb3JUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgdGVzdE5vRW52VmFyTm9GbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUncyBuZWl0aGVyIEdURVNUX0NPTE9SIG5vciAtLWd0ZXN0X2NvbG9yLiIiIgorCisgICAgaWYgbm90IElTX1dJTkRPV1M6CisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsIE5vbmUsIE5vbmUpKQorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2VtYWNzJywgTm9uZSwgTm9uZSkpCisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0tbW9ubycsIE5vbmUsIE5vbmUpKQorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3Vua25vd24nLCBOb25lLCBOb25lKSkKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKE5vbmUsIE5vbmUsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2xpbnV4JywgTm9uZSwgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignY3lnd2luJywgTm9uZSwgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsIE5vbmUsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLTI1NmNvbG9yJywgTm9uZSwgTm9uZSkpCisKKyAgZGVmIHRlc3RGbGFnT25seShzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlJ3MgLS1ndGVzdF9jb2xvciBidXQgbm90IEdURVNUX0NPTE9SLiIiIgorCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAnbm8nKSkKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0tY29sb3InLCBOb25lLCAnbm8nKSkKKyAgICBpZiBub3QgSVNfV0lORE9XUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdlbWFjcycsIE5vbmUsICdhdXRvJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAnYXV0bycpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAneWVzJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAneWVzJykpCisKKyAgZGVmIHRlc3RFbnZWYXJPbmx5KHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUncyBHVEVTVF9DT0xPUiBidXQgbm90IC0tZ3Rlc3RfY29sb3IuIiIiCisKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsICdubycsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsICdubycsIE5vbmUpKQorICAgIGlmIG5vdCBJU19XSU5ET1dTOgorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2R1bWInLCAnYXV0bycsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ2F1dG8nLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgJ3llcycsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ3llcycsIE5vbmUpKQorCisgIGRlZiB0ZXN0RW52VmFyQW5kRmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlIGFyZSBib3RoIEdURVNUX0NPTE9SIGFuZCAtLWd0ZXN0X2NvbG9yLiIiIgorCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ25vJywgJ25vJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsICdubycsICd5ZXMnKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsICdubycsICdhdXRvJykpCisKKyAgZGVmIHRlc3RBbGlhc2VzT2ZZZXNBbmRObyhzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyBhbGlhc2VzIGluIHNwZWNpZnlpbmcgLS1ndGVzdF9jb2xvci4iIiIKKworICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAndHJ1ZScpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAnWUVTJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICdUJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICcxJykpCisKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAnZicpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICdmYWxzZScpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICcwJykpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJ3Vua25vd24nKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3RfLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWViYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gQSBoZWxwZXIgcHJvZ3JhbSBmb3IgdGVzdGluZyBob3cgR29vZ2xlIFRlc3QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZQorLy8gY29sb3JzIGluIHRoZSBvdXRwdXQuICBJdCBwcmludHMgIllFUyIgYW5kIHJldHVybnMgMSBpZiBHb29nbGUgVGVzdAorLy8gZGVjaWRlcyB0byB1c2UgY29sb3JzLCBhbmQgcHJpbnRzICJOTyIgYW5kIHJldHVybnMgMCBvdGhlcndpc2UuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaG91bGRVc2VDb2xvcjsKKworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgVW5pdFRlc3Qgc2luZ2xldG9uIGlzCisvLyBjcmVhdGVkIGJlZm9yZSBtYWluKCkgaXMgZW50ZXJlZCwgYW5kIHRodXMgdGhhdCBTaG91bGRVc2VDb2xvcigpCisvLyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgaW4gYSByZWFsIEdvb2dsZS1UZXN0LWJhc2VkIHRlc3QuICBXZSBkb24ndCBhY3R1YWwKKy8vIHJ1biB0aGUgVEVTVCBpdHNlbGYuCitURVNUKEdUZXN0Q29sb3JUZXN0LCBEdW1teSkgeworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGlmIChTaG91bGRVc2VDb2xvcih0cnVlKSkgeworICAgIC8vIEdvb2dsZSBUZXN0IGRlY2lkZXMgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0IChhc3N1bWluZyBpdAorICAgIC8vIGdvZXMgdG8gYSBUVFkpLgorICAgIHByaW50ZigiWUVTXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICAvLyBHb29nbGUgVGVzdCBkZWNpZGVzIG5vdCB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCisgICAgcHJpbnRmKCJOT1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjMjQzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0LnB5CkBAIC0wLDAgKzEsMTAzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IGNvcnJlY3RseSBwYXJzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworSVNfTElOVVggPSBvcy5uYW1lID09ICdwb3NpeCcgYW5kIG9zLnVuYW1lKClbMF0gPT0gJ0xpbnV4JworCitDT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2Vudl92YXJfdGVzdF8nKQorCitlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKworCitkZWYgQXNzZXJ0RXEoZXhwZWN0ZWQsIGFjdHVhbCk6CisgIGlmIGV4cGVjdGVkICE9IGFjdHVhbDoKKyAgICBwcmludCAnRXhwZWN0ZWQ6ICVzJyAlIChleHBlY3RlZCwpCisgICAgcHJpbnQgJyAgQWN0dWFsOiAlcycgJSAoYWN0dWFsLCkKKyAgICByYWlzZSBBc3NlcnRpb25FcnJvcgorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIHRoZSBlbnYgdmFyaWFibGUgdG8gJ3ZhbHVlJzsgdW5zZXRzIGl0IHdoZW4gJ3ZhbHVlJyBpcyBOb25lLiIiIgorCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIGVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gZW52aXJvbjoKKyAgICBkZWwgZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBHZXRGbGFnKGZsYWcpOgorICAiIiJSdW5zIGd0ZXN0X2Vudl92YXJfdGVzdF8gYW5kIHJldHVybnMgaXRzIG91dHB1dC4iIiIKKworICBhcmdzID0gW0NPTU1BTkRdCisgIGlmIGZsYWcgaXMgbm90IE5vbmU6CisgICAgYXJncyArPSBbZmxhZ10KKyAgcmV0dXJuIGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhhcmdzLCBlbnY9ZW52aXJvbikub3V0cHV0CisKKworZGVmIFRlc3RGbGFnKGZsYWcsIHRlc3RfdmFsLCBkZWZhdWx0X3ZhbCk6CisgICIiIlZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIGZsYWcgaXMgYWZmZWN0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZW52IHZhci4iIiIKKworICBlbnZfdmFyID0gJ0dURVNUXycgKyBmbGFnLnVwcGVyKCkKKyAgU2V0RW52VmFyKGVudl92YXIsIHRlc3RfdmFsKQorICBBc3NlcnRFcSh0ZXN0X3ZhbCwgR2V0RmxhZyhmbGFnKSkKKyAgU2V0RW52VmFyKGVudl92YXIsIE5vbmUpCisgIEFzc2VydEVxKGRlZmF1bHRfdmFsLCBHZXRGbGFnKGZsYWcpKQorCisKK2NsYXNzIEdUZXN0RW52VmFyVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgZGVmIHRlc3RFbnZWYXJBZmZlY3RzRmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlIHNob3VsZCBhZmZlY3QgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZy4iIiIKKworICAgIFRlc3RGbGFnKCdicmVha19vbl9mYWlsdXJlJywgJzEnLCAnMCcpCisgICAgVGVzdEZsYWcoJ2NvbG9yJywgJ3llcycsICdhdXRvJykKKyAgICBUZXN0RmxhZygnZmlsdGVyJywgJ0Zvb1Rlc3QuQmFyJywgJyonKQorICAgIFRlc3RGbGFnKCdvdXRwdXQnLCAneG1sOnRtcC9mb28ueG1sJywgJycpCisgICAgVGVzdEZsYWcoJ3ByaW50X3RpbWUnLCAnMCcsICcxJykKKyAgICBUZXN0RmxhZygncmVwZWF0JywgJzk5OScsICcxJykKKyAgICBUZXN0RmxhZygndGhyb3dfb25fZmFpbHVyZScsICcxJywgJzAnKQorICAgIFRlc3RGbGFnKCdkZWF0aF90ZXN0X3N0eWxlJywgJ3RocmVhZHNhZmUnLCAnZmFzdCcpCisgICAgVGVzdEZsYWcoJ2NhdGNoX2V4Y2VwdGlvbnMnLCAnMCcsICcxJykKKworICAgIGlmIElTX0xJTlVYOgorICAgICAgVGVzdEZsYWcoJ2RlYXRoX3Rlc3RfdXNlX2ZvcmsnLCAnMScsICcwJykKKyAgICAgIFRlc3RGbGFnKCdzdGFja190cmFjZV9kZXB0aCcsICcwJywgJzEwMCcpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5YWZjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBBIGhlbHBlciBwcm9ncmFtIGZvciB0ZXN0aW5nIHRoYXQgR29vZ2xlIFRlc3QgcGFyc2VzIHRoZSBlbnZpcm9ubWVudAorLy8gdmFyaWFibGVzIGNvcnJlY3RseS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKwordXNpbmcgOjpzdGQ6OmNvdXQ7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBtYWtlIHRoZSB0ZXN0IG1vcmUgcmVhbGlzdGljIGJ5IGVuc3VyaW5nCisvLyB0aGF0IHRoZSBVbml0VGVzdCBzaW5nbGV0b24gaXMgY3JlYXRlZCBiZWZvcmUgbWFpbigpIGlzIGVudGVyZWQuCisvLyBXZSBkb24ndCBhY3R1YWwgcnVuIHRoZSBURVNUIGl0c2VsZi4KK1RFU1QoR1Rlc3RFbnZWYXJUZXN0LCBEdW1teSkgeworfQorCit2b2lkIFByaW50RmxhZyhjb25zdCBjaGFyKiBmbGFnKSB7CisgIGlmIChzdHJjbXAoZmxhZywgImJyZWFrX29uX2ZhaWx1cmUiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgImNhdGNoX2V4Y2VwdGlvbnMiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgImNvbG9yIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhjb2xvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiZGVhdGhfdGVzdF9zdHlsZSIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiZGVhdGhfdGVzdF91c2VfZm9yayIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiZmlsdGVyIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhmaWx0ZXIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgIm91dHB1dCIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcob3V0cHV0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJwcmludF90aW1lIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhwcmludF90aW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJyZXBlYXQiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKHJlcGVhdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAic3RhY2tfdHJhY2VfZGVwdGgiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJ0aHJvd19vbl9mYWlsdXJlIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb3V0IDw8ICJJbnZhbGlkIGZsYWcgbmFtZSAiIDw8IGZsYWcKKyAgICAgICA8PCAiLiAgVmFsaWQgbmFtZXMgYXJlIGJyZWFrX29uX2ZhaWx1cmUsIGNvbG9yLCBmaWx0ZXIsIGV0Yy5cbiI7CisgIGV4aXQoMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgaWYgKGFyZ2MgIT0gMikgeworICAgIGNvdXQgPDwgIlVzYWdlOiBndGVzdF9lbnZfdmFyX3Rlc3RfIE5BTUVfT0ZfRkxBR1xuIjsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHRlc3Rpbmc6OlByaW50RmxhZyhhcmd2WzFdKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZpcm9ubWVudF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZmYxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdC5jYwpAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyB1c2luZyBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMuCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEgIC8vIFJlcXVpcmVkIGZvciB0aGUgbmV4dCAjaW5jbHVkZS4KKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOworfQorCituYW1lc3BhY2UgeworCitlbnVtIEZhaWx1cmVUeXBlIHsKKyAgTk9fRkFJTFVSRSwgTk9OX0ZBVEFMX0ZBSUxVUkUsIEZBVEFMX0ZBSUxVUkUKK307CisKKy8vIEZvciB0ZXN0aW5nIHVzaW5nIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cy4KK2NsYXNzIE15RW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgTXlFbnZpcm9ubWVudCgpIHsgUmVzZXQoKTsgfQorCisgIC8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgZmFpbHVyZV9pbl9zZXRfdXBfLCBTZXRVcCgpIHdpbGwKKyAgLy8gZ2VuZXJhdGUgYSBub24tZmF0YWwgZmFpbHVyZSwgZ2VuZXJhdGUgYSBmYXRhbCBmYWlsdXJlLCBvcgorICAvLyBzdWNjZWVkLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgc2V0X3VwX3dhc19ydW5fID0gdHJ1ZTsKKworICAgIHN3aXRjaCAoZmFpbHVyZV9pbl9zZXRfdXBfKSB7CisgICAgICBjYXNlIE5PTl9GQVRBTF9GQUlMVVJFOgorICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSBpbiBnbG9iYWwgc2V0LXVwLiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGQVRBTF9GQUlMVVJFOgorICAgICAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUgaW4gZ2xvYmFsIHNldC11cC4iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgdGVhcl9kb3duX3dhc19ydW5fID0gdHJ1ZTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSBpbiBnbG9iYWwgdGVhci1kb3duLiI7CisgIH0KKworICAvLyBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBlbnZpcm9ubWVudCBzLnQuIGl0IGNhbiBiZSByZXVzZWQuCisgIHZvaWQgUmVzZXQoKSB7CisgICAgZmFpbHVyZV9pbl9zZXRfdXBfID0gTk9fRkFJTFVSRTsKKyAgICBzZXRfdXBfd2FzX3J1bl8gPSBmYWxzZTsKKyAgICB0ZWFyX2Rvd25fd2FzX3J1bl8gPSBmYWxzZTsKKyAgfQorCisgIC8vIFdlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb2YgZmFpbHVyZSBTZXRVcCgpIHNob3VsZAorICAvLyBnZW5lcmF0ZS4KKyAgdm9pZCBzZXRfZmFpbHVyZV9pbl9zZXRfdXAoRmFpbHVyZVR5cGUgdHlwZSkgeworICAgIGZhaWx1cmVfaW5fc2V0X3VwXyA9IHR5cGU7CisgIH0KKworICAvLyBXYXMgU2V0VXAoKSBydW4/CisgIGJvb2wgc2V0X3VwX3dhc19ydW4oKSBjb25zdCB7IHJldHVybiBzZXRfdXBfd2FzX3J1bl87IH0KKworICAvLyBXYXMgVGVhckRvd24oKSBydW4/CisgIGJvb2wgdGVhcl9kb3duX3dhc19ydW4oKSBjb25zdCB7IHJldHVybiB0ZWFyX2Rvd25fd2FzX3J1bl87IH0KKworIHByaXZhdGU6CisgIEZhaWx1cmVUeXBlIGZhaWx1cmVfaW5fc2V0X3VwXzsKKyAgYm9vbCBzZXRfdXBfd2FzX3J1bl87CisgIGJvb2wgdGVhcl9kb3duX3dhc19ydW5fOworfTsKKworLy8gV2FzIHRoZSBURVNUIHJ1bj8KK2Jvb2wgdGVzdF93YXNfcnVuOworCisvLyBUaGUgc29sZSBwdXJwb3NlIG9mIHRoaXMgVEVTVCBpcyB0byBlbmFibGUgdXMgdG8gY2hlY2sgd2hldGhlciBpdAorLy8gd2FzIHJ1bi4KK1RFU1QoRm9vVGVzdCwgQmFyKSB7CisgIHRlc3Rfd2FzX3J1biA9IHRydWU7Cit9CisKKy8vIFByaW50cyB0aGUgbWVzc2FnZSBhbmQgYWJvcnRzIHRoZSBwcm9ncmFtIGlmIGNvbmRpdGlvbiBpcyBmYWxzZS4KK3ZvaWQgQ2hlY2soYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIG1zZykgeworICBpZiAoIWNvbmRpdGlvbikgeworICAgIHByaW50ZigiRkFJTEVEOiAlc1xuIiwgbXNnKTsKKyAgICB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIH0KK30KKworLy8gUnVucyB0aGUgdGVzdHMuICBSZXR1cm4gdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKy8vCisvLyBUaGUgJ2ZhaWx1cmUnIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgZmFpbHVyZSB0aGF0IHNob3VsZAorLy8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBnbG9iYWwgc2V0LXVwLgoraW50IFJ1bkFsbFRlc3RzKE15RW52aXJvbm1lbnQqIGVudiwgRmFpbHVyZVR5cGUgZmFpbHVyZSkgeworICBlbnYtPlJlc2V0KCk7CisgIGVudi0+c2V0X2ZhaWx1cmVfaW5fc2V0X3VwKGZhaWx1cmUpOworICB0ZXN0X3dhc19ydW4gPSBmYWxzZTsKKyAgdGVzdGluZzo6aW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5DbGVhckFkSG9jVGVzdFJlc3VsdCgpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAvLyBSZWdpc3RlcnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudCwgYW5kIHZlcmlmaWVzIHRoYXQgdGhlCisgIC8vIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiByZXR1cm5zIGl0cyBhcmd1bWVudC4KKyAgTXlFbnZpcm9ubWVudCogY29uc3QgZW52ID0gbmV3IE15RW52aXJvbm1lbnQ7CisgIENoZWNrKHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChlbnYpID09IGVudiwKKyAgICAgICAgIkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpIHNob3VsZCByZXR1cm4gaXRzIGFyZ3VtZW50LiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgdGhlIHRlc3RzIHdoZW4gdGhlIGdsb2JhbAorICAvLyBzZXQtdXAgaXMgc3VjY2Vzc2Z1bC4KKyAgQ2hlY2soUnVuQWxsVGVzdHMoZW52LCBOT19GQUlMVVJFKSAhPSAwLAorICAgICAgICAiUlVOX0FMTF9URVNUUygpIHNob3VsZCByZXR1cm4gbm9uLXplcm8sIGFzIHRoZSBnbG9iYWwgdGVhci1kb3duICIKKyAgICAgICAgInNob3VsZCBnZW5lcmF0ZSBhIGZhaWx1cmUuIik7CisgIENoZWNrKHRlc3Rfd2FzX3J1biwKKyAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgbm8gIgorICAgICAgICAiZmFpbHVyZSIpOworICBDaGVjayhlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCB3YXMgcnVuLiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgdGhlIHRlc3RzIHdoZW4gdGhlIGdsb2JhbAorICAvLyBzZXQtdXAgZ2VuZXJhdGVzIG5vIGZhdGFsIGZhaWx1cmUuCisgIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgTk9OX0ZBVEFMX0ZBSUxVUkUpICE9IDAsCisgICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgYm90aCB0aGUgZ2xvYmFsIHNldC11cCAiCisgICAgICAgICJhbmQgdGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIGdlbmVyYXRlIGEgbm9uLWZhdGFsIGZhaWx1cmUuIik7CisgIENoZWNrKHRlc3Rfd2FzX3J1biwKKyAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgbm8gIgorICAgICAgICAiZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2soZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIHJ1bi4iKTsKKworICAvLyBWZXJpZmllcyB0aGF0IFJVTl9BTExfVEVTVFMoKSBydW5zIG5vIHRlc3Qgd2hlbiB0aGUgZ2xvYmFsIHNldC11cAorICAvLyBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlLgorICBDaGVjayhSdW5BbGxUZXN0cyhlbnYsIEZBVEFMX0ZBSUxVUkUpICE9IDAsCisgICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgdGhlIGdsb2JhbCBzZXQtdXAgIgorICAgICAgICAic2hvdWxkIGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2soIXRlc3Rfd2FzX3J1biwKKyAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgbm90IHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgc2hvdWxkIGdlbmVyYXRlICIKKyAgICAgICAgImEgZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2soZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIHJ1bi4iKTsKKworICAvLyBWZXJpZmllcyB0aGF0IFJVTl9BTExfVEVTVFMoKSBkb2Vzbid0IGRvIGdsb2JhbCBzZXQtdXAgb3IKKyAgLy8gdGVhci1kb3duIHdoZW4gdGhlcmUgaXMgbm8gdGVzdCB0byBydW4uCisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKSA9ICItKiI7CisgIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgTk9fRkFJTFVSRSkgPT0gMCwKKyAgICAgICAgIlJVTl9BTExfVEVTVFMoKSBzaG91bGQgcmV0dXJuIHplcm8sIGFzIHRoZXJlIGlzIG5vIHRlc3QgdG8gcnVuLiIpOworICBDaGVjayghZW52LT5zZXRfdXBfd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCBzZXQtdXAgc2hvdWxkIG5vdCBydW4sIGFzIHRoZXJlIGlzIG5vIHRlc3QgdG8gcnVuLiIpOworICBDaGVjayghZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIG5vdCBydW4sICIKKyAgICAgICAgImFzIHRoZSBnbG9iYWwgc2V0LXVwIHdhcyBub3QgcnVuLiIpOworCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQxYTc3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw2MzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCB0ZXN0IGZpbHRlcnMuCisKK0EgdXNlciBjYW4gc3BlY2lmeSB3aGljaCB0ZXN0KHMpIGluIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSB0byBydW4gdmlhIGVpdGhlcgordGhlIEdURVNUX0ZJTFRFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgLS1ndGVzdF9maWx0ZXIgZmxhZy4KK1RoaXMgc2NyaXB0IHRlc3RzIHN1Y2ggZnVuY3Rpb25hbGl0eSBieSBpbnZva2luZworZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyAoYSBwcm9ncmFtIHdyaXR0ZW4gd2l0aCBHb29nbGUgVGVzdCkgd2l0aCBkaWZmZXJlbnQKK2Vudmlyb25tZW50cyBhbmQgY29tbWFuZCBsaW5lIGZsYWdzLgorCitOb3RlIHRoYXQgdGVzdCBzaGFyZGluZyBtYXkgYWxzbyBpbmZsdWVuY2Ugd2hpY2ggdGVzdHMgYXJlIGZpbHRlcmVkLiBUaGVyZWZvcmUsCit3ZSB0ZXN0IHRoYXQgaGVyZSBhbHNvLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc2V0cworaW1wb3J0IHN5cworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisjIENvbnN0YW50cy4KKworIyBDaGVja3MgaWYgdGhpcyBwbGF0Zm9ybSBjYW4gcGFzcyBlbXB0eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gY2hpbGQKKyMgcHJvY2Vzc2VzLiAgV2Ugc2V0IGFuIGVudiB2YXJpYWJsZSB0byBhbiBlbXB0eSBzdHJpbmcgYW5kIGludm9rZSBhIHB5dGhvbgorIyBzY3JpcHQgaW4gYSBzdWJwcm9jZXNzIHRvIHByaW50IHdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIFNUSUxMIGluCisjIG9zLmVudmlyb24uICBXZSB0aGVuIHVzZSAnZXZhbCcgdG8gcGFyc2UgdGhlIGNoaWxkJ3Mgb3V0cHV0IHNvIHRoYXQgYW4KKyMgZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgaW5wdXQgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiAnVHJ1ZScgbm9yICdGYWxzZScuCitvcy5lbnZpcm9uWydFTVBUWV9WQVInXSA9ICcnCitjaGlsZCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICBbc3lzLmV4ZWN1dGFibGUsICctYycsICdpbXBvcnQgb3M7IHByaW50IFwnRU1QVFlfVkFSXCcgaW4gb3MuZW52aXJvbiddKQorQ0FOX1BBU1NfRU1QVFlfRU5WID0gZXZhbChjaGlsZC5vdXRwdXQpCisKKworIyBDaGVjayBpZiB0aGlzIHBsYXRmb3JtIGNhbiB1bnNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gY2hpbGQgcHJvY2Vzc2VzLgorIyBXZSBzZXQgYW4gZW52IHZhcmlhYmxlIHRvIGEgbm9uLWVtcHR5IHN0cmluZywgdW5zZXQgaXQsIGFuZCBpbnZva2UKKyMgYSBweXRob24gc2NyaXB0IGluIGEgc3VicHJvY2VzcyB0byBwcmludCB3aGV0aGVyIHRoZSB2YXJpYWJsZQorIyBpcyBOTyBMT05HRVIgaW4gb3MuZW52aXJvbi4KKyMgV2UgdXNlICdldmFsJyB0byBwYXJzZSB0aGUgY2hpbGQncyBvdXRwdXQgc28gdGhhdCBhbiBleGNlcHRpb24KKyMgaXMgdGhyb3duIGlmIHRoZSBpbnB1dCBpcyBuZWl0aGVyICdUcnVlJyBub3IgJ0ZhbHNlJy4KK29zLmVudmlyb25bJ1VOU0VUX1ZBUiddID0gJ1gnCitkZWwgb3MuZW52aXJvblsnVU5TRVRfVkFSJ10KK2NoaWxkID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ2ltcG9ydCBvczsgcHJpbnQgXCdVTlNFVF9WQVJcJyBub3QgaW4gb3MuZW52aXJvbiddKQorQ0FOX1VOU0VUX0VOViA9IGV2YWwoY2hpbGQub3V0cHV0KQorCisKKyMgQ2hlY2tzIGlmIHdlIHNob3VsZCB0ZXN0IHdpdGggYW4gZW1wdHkgZmlsdGVyLiBUaGlzIGRvZXNuJ3QKKyMgbWFrZSBzZW5zZSBvbiBwbGF0Zm9ybXMgdGhhdCBjYW5ub3QgcGFzcyBlbXB0eSBlbnYgdmFyaWFibGVzIChXaW4zMikKKyMgYW5kIG9uIHBsYXRmb3JtcyB0aGF0IGNhbm5vdCB1bnNldCB2YXJpYWJsZXMgKHNpbmNlIHdlIGNhbm5vdCB0ZWxsCisjIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIiIgYW5kIE5VTEwgLS0gQm9ybGFuZCBhbmQgU29sYXJpcyA8IDUuMTApCitDQU5fVEVTVF9FTVBUWV9GSUxURVIgPSAoQ0FOX1BBU1NfRU1QVFlfRU5WIGFuZCBDQU5fVU5TRVRfRU5WKQorCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBzcGVjaWZ5aW5nIHRoZSB0ZXN0IGZpbHRlcnMuCitGSUxURVJfRU5WX1ZBUiA9ICdHVEVTVF9GSUxURVInCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGVzdCBzaGFyZGluZy4KK1RPVEFMX1NIQVJEU19FTlZfVkFSID0gJ0dURVNUX1RPVEFMX1NIQVJEUycKK1NIQVJEX0lOREVYX0VOVl9WQVIgPSAnR1RFU1RfU0hBUkRfSU5ERVgnCitTSEFSRF9TVEFUVVNfRklMRV9FTlZfVkFSID0gJ0dURVNUX1NIQVJEX1NUQVRVU19GSUxFJworCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3Igc3BlY2lmeWluZyB0aGUgdGVzdCBmaWx0ZXJzLgorRklMVEVSX0ZMQUcgPSAnZ3Rlc3RfZmlsdGVyJworCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3IgaW5jbHVkaW5nIGRpc2FibGVkIHRlc3RzLgorQUxTT19SVU5fRElTQUJFRF9URVNUU19GTEFHID0gJ2d0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzJworCisjIENvbW1hbmQgdG8gcnVuIHRoZSBndGVzdF9maWx0ZXJfdW5pdHRlc3RfIHByb2dyYW0uCitDT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8nKQorCisjIFJlZ2V4IGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQgaW4gdGhlIGJpbmFyeS4KK1BBUkFNX1RFU1RfUkVHRVggPSByZS5jb21waWxlKHInL1BhcmFtVGVzdCcpCisKKyMgUmVnZXggZm9yIHBhcnNpbmcgdGVzdCBjYXNlIG5hbWVzIGZyb20gR29vZ2xlIFRlc3QncyBvdXRwdXQuCitURVNUX0NBU0VfUkVHRVggPSByZS5jb21waWxlKHInXlxbXC0rXF0gXGQrIHRlc3RzPyBmcm9tIChcdysoL1x3Kyk/KScpCisKKyMgUmVnZXggZm9yIHBhcnNpbmcgdGVzdCBuYW1lcyBmcm9tIEdvb2dsZSBUZXN0J3Mgb3V0cHV0LgorVEVTVF9SRUdFWCA9IHJlLmNvbXBpbGUocideXFtccypSVU5ccypcXS4qXC4oXHcrKC9cdyspPyknKQorCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyB0byB0ZWxsIEdvb2dsZSBUZXN0IHRvIG91dHB1dCB0aGUgbGlzdCBvZiB0ZXN0cyBpdAorIyB3aWxsIHJ1bi4KK0xJU1RfVEVTVFNfRkxBRyA9ICctLWd0ZXN0X2xpc3RfdGVzdHMnCisKKyMgSW5kaWNhdGVzIHdoZXRoZXIgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgZGVhdGggdGVzdHMuCitTVVBQT1JUU19ERUFUSF9URVNUUyA9ICdIYXNEZWF0aFRlc3QnIGluIGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICBbQ09NTUFORCwgTElTVF9URVNUU19GTEFHXSkub3V0cHV0CisKKyMgRnVsbCBuYW1lcyBvZiBhbGwgdGVzdHMgaW4gZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0c18uCitQQVJBTV9URVNUUyA9IFsKKyAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzEnLAorICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMScsCisgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WC8xJywKKyAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFkvMCcsCisgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RZLzEnLAorICAgIF0KKworRElTQUJMRURfVEVTVFMgPSBbCisgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZvdXInLAorICAgICdCYXJUZXN0LkRJU0FCTEVEX1Rlc3RGaXZlJywKKyAgICAnQmF6VGVzdC5ESVNBQkxFRF9UZXN0QycsCisgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnLAorICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LkRJU0FCTEVEX1Rlc3QyJywKKyAgICAnRElTQUJMRURfRm9vYmFyYmF6VGVzdC5UZXN0QScsCisgICAgXQorCitpZiBTVVBQT1JUU19ERUFUSF9URVNUUzoKKyAgREVBVEhfVEVTVFMgPSBbCisgICAgJ0hhc0RlYXRoVGVzdC5UZXN0MScsCisgICAgJ0hhc0RlYXRoVGVzdC5UZXN0MicsCisgICAgXQorZWxzZToKKyAgREVBVEhfVEVTVFMgPSBbXQorCisjIEFsbCB0aGUgbm9uLWRpc2FibGVkIHRlc3RzLgorQUNUSVZFX1RFU1RTID0gWworICAgICdGb29UZXN0LkFiYycsCisgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisKKyAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgJ0JhelRlc3QuVGVzdEInLAorICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTCisKK3BhcmFtX3Rlc3RzX3ByZXNlbnQgPSBOb25lCisKKyMgVXRpbGl0aWVzLgorCitlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKworCitkZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKKyAgIiIiU2V0cyB0aGUgZW52IHZhcmlhYmxlIHRvICd2YWx1ZSc7IHVuc2V0cyBpdCB3aGVuICd2YWx1ZScgaXMgTm9uZS4iIiIKKworICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICBlbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKKyAgZWxpZiBlbnZfdmFyIGluIGVudmlyb246CisgICAgZGVsIGVudmlyb25bZW52X3Zhcl0KKworCitkZWYgUnVuQW5kUmV0dXJuT3V0cHV0KGFyZ3MgPSBOb25lKToKKyAgIiIiUnVucyB0aGUgdGVzdCBwcm9ncmFtIGFuZCByZXR1cm5zIGl0cyBvdXRwdXQuIiIiCisKKyAgcmV0dXJuIGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhbQ09NTUFORF0gKyAoYXJncyBvciBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLm91dHB1dAorCisKK2RlZiBSdW5BbmRFeHRyYWN0VGVzdExpc3QoYXJncyA9IE5vbmUpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgaXRzIGV4aXQgY29kZSBhbmQgYSBsaXN0IG9mIHRlc3RzIHJ1bi4iIiIKKworICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtDT01NQU5EXSArIChhcmdzIG9yIFtdKSwgZW52PWVudmlyb24pCisgIHRlc3RzX3J1biA9IFtdCisgIHRlc3RfY2FzZSA9ICcnCisgIHRlc3QgPSAnJworICBmb3IgbGluZSBpbiBwLm91dHB1dC5zcGxpdCgnXG4nKToKKyAgICBtYXRjaCA9IFRFU1RfQ0FTRV9SRUdFWC5tYXRjaChsaW5lKQorICAgIGlmIG1hdGNoIGlzIG5vdCBOb25lOgorICAgICAgdGVzdF9jYXNlID0gbWF0Y2guZ3JvdXAoMSkKKyAgICBlbHNlOgorICAgICAgbWF0Y2ggPSBURVNUX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKKyAgICAgICAgdGVzdCA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIHRlc3RzX3J1bi5hcHBlbmQodGVzdF9jYXNlICsgJy4nICsgdGVzdCkKKyAgcmV0dXJuICh0ZXN0c19ydW4sIHAuZXhpdF9jb2RlKQorCisKK2RlZiBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LCBmdW5jdGlvbiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgIiIiUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYW5kIGFyZ3VtZW50cyBpbiBhIG1vZGlmaWVkIGVudmlyb25tZW50LiIiIgorICB0cnk6CisgICAgb3JpZ2luYWxfZW52ID0gZW52aXJvbi5jb3B5KCkKKyAgICBlbnZpcm9uLnVwZGF0ZShleHRyYV9lbnYpCisgICAgcmV0dXJuIGZ1bmN0aW9uKCphcmdzLCAqKmt3YXJncykKKyAgZmluYWxseToKKyAgICBlbnZpcm9uLmNsZWFyKCkKKyAgICBlbnZpcm9uLnVwZGF0ZShvcmlnaW5hbF9lbnYpCisKKworZGVmIFJ1bldpdGhTaGFyZGluZyh0b3RhbF9zaGFyZHMsIHNoYXJkX2luZGV4LCBjb21tYW5kKToKKyAgIiIiUnVucyBhIHRlc3QgcHJvZ3JhbSBzaGFyZCBhbmQgcmV0dXJucyBleGl0IGNvZGUgYW5kIGEgbGlzdCBvZiB0ZXN0cyBydW4uIiIiCisKKyAgZXh0cmFfZW52ID0ge1NIQVJEX0lOREVYX0VOVl9WQVI6IHN0cihzaGFyZF9pbmRleCksCisgICAgICAgICAgICAgICBUT1RBTF9TSEFSRFNfRU5WX1ZBUjogc3RyKHRvdGFsX3NoYXJkcyl9CisgIHJldHVybiBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LCBSdW5BbmRFeHRyYWN0VGVzdExpc3QsIGNvbW1hbmQpCisKKyMgVGhlIHVuaXQgdGVzdC4KKworCitjbGFzcyBHVGVzdEZpbHRlclVuaXRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiJUZXN0cyB0aGUgZW52IHZhcmlhYmxlIG9yIHRoZSBjb21tYW5kIGxpbmUgZmxhZyB0byBmaWx0ZXIgdGVzdHMuIiIiCisKKyAgIyBVdGlsaXRpZXMuCisKKyAgZGVmIEFzc2VydFNldEVxdWFsKHNlbGYsIGxocywgcmhzKToKKyAgICAiIiJBc3NlcnRzIHRoYXQgdHdvIHNldHMgYXJlIGVxdWFsLiIiIgorCisgICAgZm9yIGVsZW0gaW4gbGhzOgorICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gaW4gcmhzLCAnJXMgaW4gJXMnICUgKGVsZW0sIHJocykpCisKKyAgICBmb3IgZWxlbSBpbiByaHM6CisgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBsaHMsICclcyBpbiAlcycgJSAoZWxlbSwgbGhzKSkKKworICBkZWYgQXNzZXJ0UGFydGl0aW9uSXNWYWxpZChzZWxmLCBzZXRfdmFyLCBsaXN0X29mX3NldHMpOgorICAgICIiIkFzc2VydHMgdGhhdCBsaXN0X29mX3NldHMgaXMgYSB2YWxpZCBwYXJ0aXRpb24gb2Ygc2V0X3Zhci4iIiIKKworICAgIGZ1bGxfcGFydGl0aW9uID0gW10KKyAgICBmb3Igc2xpY2VfdmFyIGluIGxpc3Rfb2Zfc2V0czoKKyAgICAgIGZ1bGxfcGFydGl0aW9uLmV4dGVuZChzbGljZV92YXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0X3ZhciksIGxlbihmdWxsX3BhcnRpdGlvbikpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZXRzLlNldChzZXRfdmFyKSwgc2V0cy5TZXQoZnVsbF9wYXJ0aXRpb24pKQorCisgIGRlZiBBZGp1c3RGb3JQYXJhbWV0ZXJpemVkVGVzdHMoc2VsZiwgdGVzdHNfdG9fcnVuKToKKyAgICAiIiJBZGp1c3QgdGVzdHNfdG9fcnVuIGluIGNhc2UgdmFsdWUgcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZGlzYWJsZWQuIiIiCisKKyAgICBnbG9iYWwgcGFyYW1fdGVzdHNfcHJlc2VudAorICAgIGlmIG5vdCBwYXJhbV90ZXN0c19wcmVzZW50OgorICAgICAgcmV0dXJuIGxpc3Qoc2V0cy5TZXQodGVzdHNfdG9fcnVuKSAtIHNldHMuU2V0KFBBUkFNX1RFU1RTKSkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIHRlc3RzX3RvX3J1bgorCisgIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZ3Rlc3RfZmlsdGVyLCB0ZXN0c190b19ydW4pOgorICAgICIiIkNoZWNrcyB0aGF0IHRoZSBiaW5hcnkgcnVucyBjb3JyZWN0IHNldCBvZiB0ZXN0cyBmb3IgYSBnaXZlbiBmaWx0ZXIuIiIiCisKKyAgICB0ZXN0c190b19ydW4gPSBzZWxmLkFkanVzdEZvclBhcmFtZXRlcml6ZWRUZXN0cyh0ZXN0c190b19ydW4pCisKKyAgICAjIEZpcnN0LCB0ZXN0cyB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyAgICAjIFdpbmRvd3MgcmVtb3ZlcyBlbXB0eSB2YXJpYWJsZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQgd2hlbiBwYXNzaW5nIGl0CisgICAgIyB0byBhIG5ldyBwcm9jZXNzLiAgVGhpcyBtZWFucyBpdCBpcyBpbXBvc3NpYmxlIHRvIHBhc3MgYW4gZW1wdHkgZmlsdGVyCisgICAgIyBpbnRvIGEgcHJvY2VzcyB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuICBIb3dldmVyLCB3ZSBjYW4gc3RpbGwKKyAgICAjIHRlc3QgdGhlIGNhc2Ugd2hlbiB0aGUgdmFyaWFibGUgaXMgbm90IHN1cHBsaWVkIChpLmUuLCBndGVzdF9maWx0ZXIgaXMKKyAgICAjIE5vbmUpLgorICAgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjQwMworICAgIGlmIENBTl9URVNUX0VNUFRZX0ZJTFRFUiBvciBndGVzdF9maWx0ZXIgIT0gJyc6CisgICAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIGd0ZXN0X2ZpbHRlcikKKyAgICAgIHRlc3RzX3J1biA9IFJ1bkFuZEV4dHJhY3RUZXN0TGlzdCgpWzBdCisgICAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIE5vbmUpCisgICAgICBzZWxmLkFzc2VydFNldEVxdWFsKHRlc3RzX3J1biwgdGVzdHNfdG9fcnVuKQorICAgICMgcHlsaW50OiBlbmFibGUtbXNnPUM2NDAzCisKKyAgICAjIE5leHQsIHRlc3RzIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgZmxhZy4KKworICAgIGlmIGd0ZXN0X2ZpbHRlciBpcyBOb25lOgorICAgICAgYXJncyA9IFtdCisgICAgZWxzZToKKyAgICAgIGFyZ3MgPSBbJy0tJXM9JXMnICUgKEZJTFRFUl9GTEFHLCBndGVzdF9maWx0ZXIpXQorCisgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KGFyZ3MpWzBdCisgICAgc2VsZi5Bc3NlcnRTZXRFcXVhbCh0ZXN0c19ydW4sIHRlc3RzX3RvX3J1bikKKworICBkZWYgUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKHNlbGYsIGd0ZXN0X2ZpbHRlciwgdG90YWxfc2hhcmRzLCB0ZXN0c190b19ydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz1Ob25lLCBjaGVja19leGl0XzA9RmFsc2UpOgorICAgICIiIkNoZWNrcyB0aGF0IGJpbmFyeSBydW5zIGNvcnJlY3QgdGVzdHMgZm9yIHRoZSBnaXZlbiBmaWx0ZXIgYW5kIHNoYXJkLgorCisgICAgUnVucyBhbGwgc2hhcmRzIG9mIGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gd2l0aCB0aGUgZ2l2ZW4gZmlsdGVyLCBhbmQKKyAgICB2ZXJpZmllcyB0aGF0IHRoZSByaWdodCBzZXQgb2YgdGVzdHMgd2VyZSBydW4uIFRoZSB1bmlvbiBvZiB0ZXN0cyBydW4KKyAgICBvbiBlYWNoIHNoYXJkIHNob3VsZCBiZSBpZGVudGljYWwgdG8gdGVzdHNfdG9fcnVuLCB3aXRob3V0IGR1cGxpY2F0ZXMuCisKKyAgICBBcmdzOgorICAgICAgZ3Rlc3RfZmlsdGVyOiBBIGZpbHRlciB0byBhcHBseSB0byB0aGUgdGVzdHMuCisgICAgICB0b3RhbF9zaGFyZHM6IEEgdG90YWwgbnVtYmVyIG9mIHNoYXJkcyB0byBzcGxpdCB0ZXN0IHJ1biBpbnRvLgorICAgICAgdGVzdHNfdG9fcnVuOiBBIHNldCBvZiB0ZXN0cyBleHBlY3RlZCB0byBydW4uCisgICAgICBhcmdzICAgOiAgICAgIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0byB0aGUgdGVzdCBiaW5hcnkuCisgICAgICBjaGVja19leGl0XzA6IFdoZW4gc2V0IHRvIGEgdHJ1ZSB2YWx1ZSwgbWFrZSBzdXJlIHRoYXQgYWxsIHNoYXJkcworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMC4KKyAgICAiIiIKKworICAgIHRlc3RzX3RvX3J1biA9IHNlbGYuQWRqdXN0Rm9yUGFyYW1ldGVyaXplZFRlc3RzKHRlc3RzX3RvX3J1bikKKworICAgICMgV2luZG93cyByZW1vdmVzIGVtcHR5IHZhcmlhYmxlcyBmcm9tIHRoZSBlbnZpcm9ubWVudCB3aGVuIHBhc3NpbmcgaXQKKyAgICAjIHRvIGEgbmV3IHByb2Nlc3MuICBUaGlzIG1lYW5zIGl0IGlzIGltcG9zc2libGUgdG8gcGFzcyBhbiBlbXB0eSBmaWx0ZXIKKyAgICAjIGludG8gYSBwcm9jZXNzIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEhvd2V2ZXIsIHdlIGNhbiBzdGlsbAorICAgICMgdGVzdCB0aGUgY2FzZSB3aGVuIHRoZSB2YXJpYWJsZSBpcyBub3Qgc3VwcGxpZWQgKGkuZS4sIGd0ZXN0X2ZpbHRlciBpcworICAgICMgTm9uZSkuCisgICAgIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2NDAzCisgICAgaWYgQ0FOX1RFU1RfRU1QVFlfRklMVEVSIG9yIGd0ZXN0X2ZpbHRlciAhPSAnJzoKKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgZ3Rlc3RfZmlsdGVyKQorICAgICAgcGFydGl0aW9uID0gW10KKyAgICAgIGZvciBpIGluIHJhbmdlKDAsIHRvdGFsX3NoYXJkcyk6CisgICAgICAgICh0ZXN0c19ydW4sIGV4aXRfY29kZSkgPSBSdW5XaXRoU2hhcmRpbmcodG90YWxfc2hhcmRzLCBpLCBhcmdzKQorICAgICAgICBpZiBjaGVja19leGl0XzA6CisgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleGl0X2NvZGUpCisgICAgICAgIHBhcnRpdGlvbi5hcHBlbmQodGVzdHNfcnVuKQorCisgICAgICBzZWxmLkFzc2VydFBhcnRpdGlvbklzVmFsaWQodGVzdHNfdG9fcnVuLCBwYXJ0aXRpb24pCisgICAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIE5vbmUpCisgICAgIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzY0MDMKKworICBkZWYgUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZChzZWxmLCBndGVzdF9maWx0ZXIsIHRlc3RzX3RvX3J1bik6CisgICAgIiIiQ2hlY2tzIHRoYXQgdGhlIGJpbmFyeSBydW5zIGNvcnJlY3Qgc2V0IG9mIHRlc3RzIGZvciB0aGUgZ2l2ZW4gZmlsdGVyLgorCisgICAgUnVucyBndGVzdF9maWx0ZXJfdW5pdHRlc3RfIHdpdGggdGhlIGdpdmVuIGZpbHRlciwgYW5kIGVuYWJsZXMKKyAgICBkaXNhYmxlZCB0ZXN0cy4gVmVyaWZpZXMgdGhhdCB0aGUgcmlnaHQgc2V0IG9mIHRlc3RzIHdlcmUgcnVuLgorCisgICAgQXJnczoKKyAgICAgIGd0ZXN0X2ZpbHRlcjogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gdGhlIHRlc3RzLgorICAgICAgdGVzdHNfdG9fcnVuOiBBIHNldCBvZiB0ZXN0cyBleHBlY3RlZCB0byBydW4uCisgICAgIiIiCisKKyAgICB0ZXN0c190b19ydW4gPSBzZWxmLkFkanVzdEZvclBhcmFtZXRlcml6ZWRUZXN0cyh0ZXN0c190b19ydW4pCisKKyAgICAjIENvbnN0cnVjdCB0aGUgY29tbWFuZCBsaW5lLgorICAgIGFyZ3MgPSBbJy0tJXMnICUgQUxTT19SVU5fRElTQUJFRF9URVNUU19GTEFHXQorICAgIGlmIGd0ZXN0X2ZpbHRlciBpcyBub3QgTm9uZToKKyAgICAgIGFyZ3MuYXBwZW5kKCctLSVzPSVzJyAlIChGSUxURVJfRkxBRywgZ3Rlc3RfZmlsdGVyKSkKKworICAgIHRlc3RzX3J1biA9IFJ1bkFuZEV4dHJhY3RUZXN0TGlzdChhcmdzKVswXQorICAgIHNlbGYuQXNzZXJ0U2V0RXF1YWwodGVzdHNfcnVuLCB0ZXN0c190b19ydW4pCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgICIiIlNldHMgdXAgdGVzdCBjYXNlLgorCisgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQgaW4gdGhlIGJpbmFyeSBhbmQKKyAgICBzZXRzIHRoZSBmbGFncyBhY2NvcmRpbmdseS4KKyAgICAiIiIKKworICAgIGdsb2JhbCBwYXJhbV90ZXN0c19wcmVzZW50CisgICAgaWYgcGFyYW1fdGVzdHNfcHJlc2VudCBpcyBOb25lOgorICAgICAgcGFyYW1fdGVzdHNfcHJlc2VudCA9IFBBUkFNX1RFU1RfUkVHRVguc2VhcmNoKAorICAgICAgICAgIFJ1bkFuZFJldHVybk91dHB1dCgpKSBpcyBub3QgTm9uZQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciBvZiBub3Qgc3BlY2lmeWluZyB0aGUgZmlsdGVyLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoTm9uZSwgQUNUSVZFX1RFU1RTKQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yV2l0aFNoYXJkcyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igd2l0aG91dCB0aGUgZmlsdGVyLCB3aXRoIHNoYXJkaW5nIGVuYWJsZWQuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCAxLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgMiwgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIGxlbihBQ1RJVkVfVEVTVFMpIC0gMSwgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIGxlbihBQ1RJVkVfVEVTVFMpLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgbGVuKEFDVElWRV9URVNUUykgKyAxLCBBQ1RJVkVfVEVTVFMpCisKKyAgZGVmIHRlc3RFbXB0eUZpbHRlcihzZWxmKToKKyAgICAiIiJUZXN0cyBhbiBlbXB0eSBmaWx0ZXIuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJycsIDEsIFtdKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKCcnLCAyLCBbXSkKKworICBkZWYgdGVzdEJhZEZpbHRlcihzZWxmKToKKyAgICAiIiJUZXN0cyBhIGZpbHRlciB0aGF0IG1hdGNoZXMgbm90aGluZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdCYWRGaWx0ZXInLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0JhZEZpbHRlcicsIFtdKQorCisgIGRlZiB0ZXN0RnVsbE5hbWUoc2VsZik6CisgICAgIiIiVGVzdHMgZmlsdGVyaW5nIGJ5IGZ1bGwgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdGb29UZXN0Llh5eicsIFsnRm9vVGVzdC5YeXonXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0Zvb1Rlc3QuWHl6JywgWydGb29UZXN0Llh5eiddKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKCdGb29UZXN0Llh5eicsIDUsIFsnRm9vVGVzdC5YeXonXSkKKworICBkZWYgdGVzdFVuaXZlcnNhbEZpbHRlcnMoc2VsZik6CisgICAgIiIiVGVzdHMgZmlsdGVycyB0aGF0IG1hdGNoIGV2ZXJ5dGhpbmcuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKicsIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi4qJywgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKCcqLionLCBsZW4oQUNUSVZFX1RFU1RTKSAtIDMsIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJyonLCBBQ1RJVkVfVEVTVFMgKyBESVNBQkxFRF9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJyouKicsIEFDVElWRV9URVNUUyArIERJU0FCTEVEX1RFU1RTKQorCisgIGRlZiB0ZXN0RmlsdGVyQnlUZXN0Q2FzZShzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJpbmcgYnkgdGVzdCBjYXNlIG5hbWUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnRm9vVGVzdC4qJywgWydGb29UZXN0LkFiYycsICdGb29UZXN0Llh5eiddKQorCisgICAgQkFaX1RFU1RTID0gWydCYXpUZXN0LlRlc3RPbmUnLCAnQmF6VGVzdC5UZXN0QScsICdCYXpUZXN0LlRlc3RCJ10KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnQmF6VGVzdC4qJywgQkFaX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnQmF6VGVzdC4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFaX1RFU1RTICsgWydCYXpUZXN0LkRJU0FCTEVEX1Rlc3RDJ10pCisKKyAgZGVmIHRlc3RGaWx0ZXJCeVRlc3Qoc2VsZik6CisgICAgIiIiVGVzdHMgZmlsdGVyaW5nIGJ5IHRlc3QgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLlRlc3RPbmUnLCBbJ0JhclRlc3QuVGVzdE9uZScsICdCYXpUZXN0LlRlc3RPbmUnXSkKKworICBkZWYgdGVzdEZpbHRlckRpc2FibGVkVGVzdHMoc2VsZik6CisgICAgIiIiU2VsZWN0IG9ubHkgdGhlIGRpc2FibGVkIHRlc3RzIHRvIHJ1bi4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJ10pCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKkRJU0FCTEVEXyonLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJypESVNBQkxFRF8qJywgRElTQUJMRURfVEVTVFMpCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi5ESVNBQkxFRF8qJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCcqLkRJU0FCTEVEXyonLCBbCisgICAgICAgICdCYXJUZXN0LkRJU0FCTEVEX1Rlc3RGb3VyJywKKyAgICAgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZpdmUnLAorICAgICAgICAnQmF6VGVzdC5ESVNBQkxFRF9UZXN0QycsCisgICAgICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LkRJU0FCTEVEX1Rlc3QyJywKKyAgICAgICAgXSkKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdESVNBQkxFRF8qJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdESVNBQkxFRF8qJywgWworICAgICAgICAnRElTQUJMRURfRm9vYmFyVGVzdC5UZXN0MScsCisgICAgICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LkRJU0FCTEVEX1Rlc3QyJywKKyAgICAgICAgJ0RJU0FCTEVEX0Zvb2JhcmJhelRlc3QuVGVzdEEnLAorICAgICAgICBdKQorCisgIGRlZiB0ZXN0V2lsZGNhcmRJblRlc3RDYXNlTmFtZShzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB3aWxkY2FyZCBpbiB0aGUgdGVzdCBjYXNlIG5hbWUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKmEqLionLCBbCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKworICAgICAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QicsIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgIGRlZiB0ZXN0V2lsZGNhcmRJblRlc3ROYW1lKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHdpbGRjYXJkIGluIHRoZSB0ZXN0IG5hbWUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi4qQSonLCBbJ0Zvb1Rlc3QuQWJjJywgJ0JhelRlc3QuVGVzdEEnXSkKKworICBkZWYgdGVzdEZpbHRlcldpdGhvdXREb3Qoc2VsZik6CisgICAgIiIiVGVzdHMgYSBmaWx0ZXIgdGhhdCBoYXMgbm8gJy4nIGluIGl0LiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyp6KicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QicsCisgICAgICAgIF0pCisKKyAgZGVmIHRlc3RUd29QYXR0ZXJucyhzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJzIHRoYXQgY29uc2lzdCBvZiB0d28gcGF0dGVybnMuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnRm9vKi4qOipBKicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgIF0pCisKKyAgICAjIEFuIGVtcHR5IHBhdHRlcm4gKyBhIG5vbi1lbXB0eSBvbmUKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnOipBKicsIFsnRm9vVGVzdC5BYmMnLCAnQmF6VGVzdC5UZXN0QSddKQorCisgIGRlZiB0ZXN0VGhyZWVQYXR0ZXJucyhzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJzIHRoYXQgY29uc2lzdCBvZiB0aHJlZSBwYXR0ZXJucy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqb28qOipBKjoqT25lJywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgIF0pCisKKyAgICAjIFRoZSAybmQgcGF0dGVybiBpcyBlbXB0eS4KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKm9vKjo6Kk9uZScsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKworICAgICAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAgICAgXSkKKworICAgICMgVGhlIGxhc3QgMiBwYXR0ZXJucyBhcmUgZW1wdHkuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJypvbyo6OicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKyAgICAgICAgXSkKKworICBkZWYgdGVzdE5lZ2F0aXZlRmlsdGVycyhzZWxmKToKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi1CYXpUZXN0LlRlc3RPbmUnLCBbCisgICAgICAgICdGb29UZXN0LkFiYycsCisgICAgICAgICdGb29UZXN0Llh5eicsCisKKyAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCisgICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAgICAgJ0JhelRlc3QuVGVzdEInLAorICAgICAgICBdICsgREVBVEhfVEVTVFMgKyBQQVJBTV9URVNUUykKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLUZvb1Rlc3QuQWJjOkJhelRlc3QuKicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisgICAgICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0JhclRlc3QuKi1CYXJUZXN0LlRlc3RPbmUnLCBbCisgICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAorICAgICAgICBdKQorCisgICAgIyBUZXN0cyB3aXRob3V0IGxlYWRpbmcgJyonLgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCctRm9vVGVzdC5BYmM6Rm9vVGVzdC5YeXo6QmF6VGVzdC4qJywgWworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisgICAgICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgICAgIyBWYWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzLgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLyonLCBQQVJBTV9URVNUUykKKworICAgICMgVmFsdWUgcGFyYW1ldGVyaXplZCB0ZXN0cyBmaWx0ZXJpbmcgYnkgdGhlIHNlcXVlbmNlIG5hbWUuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ1NlcVAvKicsIFsKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMScsCisgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzEnLAorICAgICAgICBdKQorCisgICAgIyBWYWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzIGZpbHRlcmluZyBieSB0aGUgdGVzdCBuYW1lLgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLzAnLCBbCisgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAgICAgXSkKKworICBkZWYgdGVzdEZsYWdPdmVycmlkZXNFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCB0aGUgZmlsdGVyIGZsYWcgb3ZlcnJpZGVzIHRoZSBmaWx0ZXJpbmcgZW52LiB2YXJpYWJsZS4iIiIKKworICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgJ0ZvbyonKQorICAgIGFyZ3MgPSBbJy0tJXM9JXMnICUgKEZJTFRFUl9GTEFHLCAnKk9uZScpXQorICAgIHRlc3RzX3J1biA9IFJ1bkFuZEV4dHJhY3RUZXN0TGlzdChhcmdzKVswXQorICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgTm9uZSkKKworICAgIHNlbGYuQXNzZXJ0U2V0RXF1YWwodGVzdHNfcnVuLCBbJ0JhclRlc3QuVGVzdE9uZScsICdCYXpUZXN0LlRlc3RPbmUnXSkKKworICBkZWYgdGVzdFNoYXJkU3RhdHVzRmlsZUlzQ3JlYXRlZChzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBzaGFyZCBmaWxlIGlzIGNyZWF0ZWQgaWYgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudC4iIiIKKworICAgIHNoYXJkX3N0YXR1c19maWxlID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFyZF9zdGF0dXNfZmlsZScpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzaGFyZF9zdGF0dXNfZmlsZSkpCisKKyAgICBleHRyYV9lbnYgPSB7U0hBUkRfU1RBVFVTX0ZJTEVfRU5WX1ZBUjogc2hhcmRfc3RhdHVzX2ZpbGV9CisgICAgdHJ5OgorICAgICAgSW52b2tlV2l0aE1vZGlmaWVkRW52KGV4dHJhX2VudiwgUnVuQW5kUmV0dXJuT3V0cHV0KQorICAgIGZpbmFsbHk6CisgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoc2hhcmRfc3RhdHVzX2ZpbGUpKQorICAgICAgb3MucmVtb3ZlKHNoYXJkX3N0YXR1c19maWxlKQorCisgIGRlZiB0ZXN0U2hhcmRTdGF0dXNGaWxlSXNDcmVhdGVkV2l0aExpc3RUZXN0cyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBzaGFyZCBmaWxlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgImxpc3RfdGVzdHMiIGZsYWcuIiIiCisKKyAgICBzaGFyZF9zdGF0dXNfZmlsZSA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhcmRfc3RhdHVzX2ZpbGUyJykKKyAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHNoYXJkX3N0YXR1c19maWxlKSkKKworICAgIGV4dHJhX2VudiA9IHtTSEFSRF9TVEFUVVNfRklMRV9FTlZfVkFSOiBzaGFyZF9zdGF0dXNfZmlsZX0KKyAgICB0cnk6CisgICAgICBvdXRwdXQgPSBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkFuZFJldHVybk91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTElTVF9URVNUU19GTEFHXSkKKyAgICBmaW5hbGx5OgorICAgICAgIyBUaGlzIGFzc2VydGlvbiBlbnN1cmVzIHRoYXQgR29vZ2xlIFRlc3QgZW51bWVyYXRlZCB0aGUgdGVzdHMgYXMKKyAgICAgICMgb3Bwb3NlZCB0byBydW5uaW5nIHRoZW0uCisgICAgICBzZWxmLmFzc2VydF8oJ1s9PT09PT09PT09XScgbm90IGluIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBvdXRwdXQgZHVyaW5nIHRlc3QgZW51bWVyYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBlbnN1cmUgdGhhdCBMSVNUX1RFU1RTX0ZMQUcgaXMgYXNzaWduZWQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2NvcnJlY3QgZmxhZyB2YWx1ZSBmb3IgbGlzdGluZyBHb29nbGUgVGVzdCB0ZXN0cy4nKQorCisgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoc2hhcmRfc3RhdHVzX2ZpbGUpKQorICAgICAgb3MucmVtb3ZlKHNoYXJkX3N0YXR1c19maWxlKQorCisgIGlmIFNVUFBPUlRTX0RFQVRIX1RFU1RTOgorICAgIGRlZiB0ZXN0U2hhcmRpbmdXb3Jrc1dpdGhEZWF0aFRlc3RzKHNlbGYpOgorICAgICAgIiIiVGVzdHMgaW50ZWdyYXRpb24gd2l0aCBkZWF0aCB0ZXN0cyBhbmQgc2hhcmRpbmcuIiIiCisKKyAgICAgIGd0ZXN0X2ZpbHRlciA9ICdIYXNEZWF0aFRlc3QuKjpTZXFQLyonCisgICAgICBleHBlY3RlZF90ZXN0cyA9IFsKKyAgICAgICAgICAnSGFzRGVhdGhUZXN0LlRlc3QxJywKKyAgICAgICAgICAnSGFzRGVhdGhUZXN0LlRlc3QyJywKKworICAgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMScsCisgICAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8xJywKKyAgICAgICAgICBdCisKKyAgICAgIGZvciBmbGFnIGluIFsnLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPXRocmVhZHNhZmUnLAorICAgICAgICAgICAgICAgICAgICctLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9ZmFzdCddOgorICAgICAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhndGVzdF9maWx0ZXIsIDMsIGV4cGVjdGVkX3Rlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGl0XzA9VHJ1ZSwgYXJncz1bZmxhZ10pCisgICAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKGd0ZXN0X2ZpbHRlciwgNSwgZXhwZWN0ZWRfdGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2V4aXRfMD1UcnVlLCBhcmdzPVtmbGFnXSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZWZmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjCkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0IHRlc3QgZmlsdGVycy4KKy8vCisvLyBBIHVzZXIgY2FuIHNwZWNpZnkgd2hpY2ggdGVzdChzKSBpbiBhIEdvb2dsZSBUZXN0IHByb2dyYW0gdG8gcnVuIHZpYQorLy8gZWl0aGVyIHRoZSBHVEVTVF9GSUxURVIgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlIC0tZ3Rlc3RfZmlsdGVyCisvLyBmbGFnLiAgVGhpcyBpcyB1c2VkIGZvciB0ZXN0aW5nIHN1Y2ggZnVuY3Rpb25hbGl0eS4KKy8vCisvLyBUaGUgcHJvZ3JhbSB3aWxsIGJlIGludm9rZWQgZnJvbSBhIFB5dGhvbiB1bml0IHRlc3QuICBEb24ndCBydW4gaXQKKy8vIGRpcmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworLy8gVGVzdCBjYXNlIEZvb1Rlc3QuCisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoRm9vVGVzdCwgQWJjKSB7Cit9CisKK1RFU1RfRihGb29UZXN0LCBYeXopIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBCYXJUZXN0LgorCitURVNUKEJhclRlc3QsIFRlc3RPbmUpIHsKK30KKworVEVTVChCYXJUZXN0LCBUZXN0VHdvKSB7Cit9CisKK1RFU1QoQmFyVGVzdCwgVGVzdFRocmVlKSB7Cit9CisKK1RFU1QoQmFyVGVzdCwgRElTQUJMRURfVGVzdEZvdXIpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKK1RFU1QoQmFyVGVzdCwgRElTQUJMRURfVGVzdEZpdmUpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBCYXpUZXN0LgorCitURVNUKEJhelRlc3QsIFRlc3RPbmUpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKK1RFU1QoQmF6VGVzdCwgVGVzdEEpIHsKK30KKworVEVTVChCYXpUZXN0LCBUZXN0QikgeworfQorCitURVNUKEJhelRlc3QsIERJU0FCTEVEX1Rlc3RDKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOworfQorCisvLyBUZXN0IGNhc2UgSGFzRGVhdGhUZXN0CisKK1RFU1QoSGFzRGVhdGhUZXN0LCBUZXN0MSkgeworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKGV4aXQoMSksICIuKiIpOworfQorCisvLyBXZSBuZWVkIGF0IGxlYXN0IHR3byBkZWF0aCB0ZXN0cyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYWxsIGRlYXRoIHRlc3RzCisvLyBhcmVuJ3Qgb24gdGhlIGZpcnN0IHNoYXJkLgorVEVTVChIYXNEZWF0aFRlc3QsIFRlc3QyKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoZXhpdCgxKSwgIi4qIik7Cit9CisKKy8vIFRlc3QgY2FzZSBGb29iYXJUZXN0CisKK1RFU1QoRElTQUJMRURfRm9vYmFyVGVzdCwgVGVzdDEpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKK1RFU1QoRElTQUJMRURfRm9vYmFyVGVzdCwgRElTQUJMRURfVGVzdDIpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBGb29iYXJiYXpUZXN0CisKK1RFU1QoRElTQUJMRURfRm9vYmFyYmF6VGVzdCwgVGVzdEEpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorY2xhc3MgUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Cit9OworCitURVNUX1AoUGFyYW1UZXN0LCBUZXN0WCkgeworfQorCitURVNUX1AoUGFyYW1UZXN0LCBUZXN0WSkgeworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXFQLCBQYXJhbVRlc3QsIHRlc3Rpbmc6OlZhbHVlcygxLCAyKSk7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXFRLCBQYXJhbVRlc3QsIHRlc3Rpbmc6OlZhbHVlcyg1LCA2KSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfaGVscF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5M2M4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfaGVscF90ZXN0LnB5CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyB0aGUgLS1oZWxwIGZsYWcgb2YgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yay4KKworU1lOT1BTSVMKKyAgICAgICBndGVzdF9oZWxwX3Rlc3QucHkgLS1idWlsZF9kaXI9QlVJTEQvRElSCisgICAgICAgICAjIHdoZXJlIEJVSUxEL0RJUiBjb250YWlucyB0aGUgYnVpbHQgZ3Rlc3RfaGVscF90ZXN0XyBmaWxlLgorICAgICAgIGd0ZXN0X2hlbHBfdGVzdC5weQorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0lTX0xJTlVYID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy51bmFtZSgpWzBdID09ICdMaW51eCcKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKKworUFJPR1JBTV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2hlbHBfdGVzdF8nKQorRkxBR19QUkVGSVggPSAnLS1ndGVzdF8nCitERUFUSF9URVNUX1NUWUxFX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdkZWF0aF90ZXN0X3N0eWxlJworU1RSRUFNX1JFU1VMVF9UT19GTEFHID0gRkxBR19QUkVGSVggKyAnc3RyZWFtX3Jlc3VsdF90bycKK1VOS05PV05fRkxBRyA9IEZMQUdfUFJFRklYICsgJ3Vua25vd25fZmxhZ19mb3JfdGVzdGluZycKK0xJU1RfVEVTVFNfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2xpc3RfdGVzdHMnCitJTkNPUlJFQ1RfRkxBR19WQVJJQU5UUyA9IFtyZS5zdWIoJ14tLScsICctJywgTElTVF9URVNUU19GTEFHKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLnN1YignXi0tJywgJy8nLCBMSVNUX1RFU1RTX0ZMQUcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuc3ViKCdfJywgJy0nLCBMSVNUX1RFU1RTX0ZMQUcpXQorSU5URVJOQUxfRkxBR19GT1JfVEVTVElORyA9IEZMQUdfUFJFRklYICsgJ2ludGVybmFsX2ZsYWdfZm9yX3Rlc3RpbmcnCisKK1NVUFBPUlRTX0RFQVRIX1RFU1RTID0gIkRlYXRoVGVzdCIgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtQUk9HUkFNX1BBVEgsIExJU1RfVEVTVFNfRkxBR10pLm91dHB1dAorCisjIFRoZSBoZWxwIG1lc3NhZ2UgbXVzdCBtYXRjaCB0aGlzIHJlZ2V4LgorSEVMUF9SRUdFWCA9IHJlLmNvbXBpbGUoCisgICAgRkxBR19QUkVGSVggKyByJ2xpc3RfdGVzdHMuKicgKworICAgIEZMQUdfUFJFRklYICsgcidmaWx0ZXI9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMuKicgKworICAgIEZMQUdfUFJFRklYICsgcidyZXBlYXQ9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInc2h1ZmZsZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3JhbmRvbV9zZWVkPS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ2NvbG9yPS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3ByaW50X3RpbWUuKicgKworICAgIEZMQUdfUFJFRklYICsgcidvdXRwdXQ9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInYnJlYWtfb25fZmFpbHVyZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3Rocm93X29uX2ZhaWx1cmUuKicgKworICAgIEZMQUdfUFJFRklYICsgcidjYXRjaF9leGNlcHRpb25zPTAuKicsCisgICAgcmUuRE9UQUxMKQorCisKK2RlZiBSdW5XaXRoRmxhZyhmbGFnKToKKyAgIiIiUnVucyBndGVzdF9oZWxwX3Rlc3RfIHdpdGggdGhlIGdpdmVuIGZsYWcuCisKKyAgUmV0dXJuczoKKyAgICB0aGUgZXhpdCBjb2RlIGFuZCB0aGUgdGV4dCBvdXRwdXQgYXMgYSB0dXBsZS4KKyAgQXJnczoKKyAgICBmbGFnOiB0aGUgY29tbWFuZC1saW5lIGZsYWcgdG8gcGFzcyB0byBndGVzdF9oZWxwX3Rlc3RfLCBvciBOb25lLgorICAiIiIKKworICBpZiBmbGFnIGlzIE5vbmU6CisgICAgY29tbWFuZCA9IFtQUk9HUkFNX1BBVEhdCisgIGVsc2U6CisgICAgY29tbWFuZCA9IFtQUk9HUkFNX1BBVEgsIGZsYWddCisgIGNoaWxkID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCisgIHJldHVybiBjaGlsZC5leGl0X2NvZGUsIGNoaWxkLm91dHB1dAorCisKK2NsYXNzIEdUZXN0SGVscFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRoZSAtLWhlbHAgZmxhZyBhbmQgaXRzIGVxdWl2YWxlbnQgZm9ybXMuIiIiCisKKyAgZGVmIFRlc3RIZWxwRmxhZyhzZWxmLCBmbGFnKToKKyAgICAiIiJWZXJpZmllcyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gaGVscCBmbGFnIGlzIHNwZWNpZmllZC4KKworICAgIFRoZSByaWdodCBtZXNzYWdlIG11c3QgYmUgcHJpbnRlZCBhbmQgdGhlIHRlc3RzIG11c3QKKyAgICBza2lwcGVkIHdoZW4gdGhlIGdpdmVuIGZsYWcgaXMgc3BlY2lmaWVkLgorCisgICAgQXJnczoKKyAgICAgIGZsYWc6ICBBIGZsYWcgdG8gcGFzcyB0byB0aGUgYmluYXJ5IG9yIE5vbmUuCisgICAgIiIiCisKKyAgICBleGl0X2NvZGUsIG91dHB1dCA9IFJ1bldpdGhGbGFnKGZsYWcpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgZXhpdF9jb2RlKQorICAgIHNlbGYuYXNzZXJ0XyhIRUxQX1JFR0VYLnNlYXJjaChvdXRwdXQpLCBvdXRwdXQpCisKKyAgICBpZiBJU19MSU5VWDoKKyAgICAgIHNlbGYuYXNzZXJ0XyhTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgaW4gb3V0cHV0LCBvdXRwdXQpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0XyhTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgbm90IGluIG91dHB1dCwgb3V0cHV0KQorCisgICAgaWYgU1VQUE9SVFNfREVBVEhfVEVTVFMgYW5kIG5vdCBJU19XSU5ET1dTOgorICAgICAgc2VsZi5hc3NlcnRfKERFQVRIX1RFU1RfU1RZTEVfRkxBRyBpbiBvdXRwdXQsIG91dHB1dCkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKERFQVRIX1RFU1RfU1RZTEVfRkxBRyBub3QgaW4gb3V0cHV0LCBvdXRwdXQpCisKKyAgZGVmIFRlc3ROb25IZWxwRmxhZyhzZWxmLCBmbGFnKToKKyAgICAiIiJWZXJpZmllcyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gbm8gaGVscCBmbGFnIGlzIHNwZWNpZmllZC4KKworICAgIFZlcmlmaWVzIHRoYXQgd2hlbiBubyBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgdGVzdHMgYXJlIHJ1bgorICAgIGFuZCB0aGUgaGVscCBtZXNzYWdlIGlzIG5vdCBwcmludGVkLgorCisgICAgQXJnczoKKyAgICAgIGZsYWc6ICBBIGZsYWcgdG8gcGFzcyB0byB0aGUgYmluYXJ5IG9yIE5vbmUuCisgICAgIiIiCisKKyAgICBleGl0X2NvZGUsIG91dHB1dCA9IFJ1bldpdGhGbGFnKGZsYWcpCisgICAgc2VsZi5hc3NlcnRfKGV4aXRfY29kZSAhPSAwKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgSEVMUF9SRUdFWC5zZWFyY2gob3V0cHV0KSwgb3V0cHV0KQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhGdWxsRmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZygnLS1oZWxwJykKKworICBkZWYgdGVzdFByaW50c0hlbHBXaXRoU2hvcnRGbGFnKHNlbGYpOgorICAgIHNlbGYuVGVzdEhlbHBGbGFnKCctaCcpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aFF1ZXN0aW9uRmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZygnLT8nKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhXaW5kb3dzU3R5bGVRdWVzdGlvbkZsYWcoc2VsZik6CisgICAgc2VsZi5UZXN0SGVscEZsYWcoJy8/JykKKworICBkZWYgdGVzdFByaW50c0hlbHBXaXRoVW5yZWNvZ25pemVkR29vZ2xlVGVzdEZsYWcoc2VsZik6CisgICAgc2VsZi5UZXN0SGVscEZsYWcoVU5LTk9XTl9GTEFHKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhJbmNvcnJlY3RGbGFnU3R5bGUoc2VsZik6CisgICAgZm9yIGluY29ycmVjdF9mbGFnIGluIElOQ09SUkVDVF9GTEFHX1ZBUklBTlRTOgorICAgICAgc2VsZi5UZXN0SGVscEZsYWcoaW5jb3JyZWN0X2ZsYWcpCisKKyAgZGVmIHRlc3RSdW5zVGVzdHNXaXRob3V0SGVscEZsYWcoc2VsZik6CisgICAgIiIiVmVyaWZpZXMgdGhhdCB3aGVuIG5vIGhlbHAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSB0ZXN0cyBhcmUgcnVuCisgICAgYW5kIHRoZSBoZWxwIG1lc3NhZ2UgaXMgbm90IHByaW50ZWQuIiIiCisKKyAgICBzZWxmLlRlc3ROb25IZWxwRmxhZyhOb25lKQorCisgIGRlZiB0ZXN0UnVuc1Rlc3RzV2l0aEd0ZXN0SW50ZXJuYWxGbGFnKHNlbGYpOgorICAgICIiIlZlcmlmaWVzIHRoYXQgdGhlIHRlc3RzIGFyZSBydW4gYW5kIG5vIGhlbHAgbWVzc2FnZSBpcyBwcmludGVkIHdoZW4KKyAgICBhIGZsYWcgc3RhcnRpbmcgd2l0aCBHb29nbGUgVGVzdCBwcmVmaXggYW5kICdpbnRlcm5hbF8nIGlzIHN1cHBsaWVkLiIiIgorCisgICAgc2VsZi5UZXN0Tm9uSGVscEZsYWcoSU5URVJOQUxfRkxBR19GT1JfVEVTVElORykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWY3OGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGhpcyBwcm9ncmFtIGlzIG1lYW50IHRvIGJlIHJ1biBieSBndGVzdF9oZWxwX3Rlc3QucHkuICBEbyBub3QgcnVuCisvLyBpdCBkaXJlY3RseS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFdoZW4gYSBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGlzIHByb2dyYW0gc2hvdWxkIHNraXAgdGhlIHRlc3RzCisvLyBhbmQgZXhpdCB3aXRoIDA7IG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIHRlc3Qgd2lsbCBiZSBleGVjdXRlZCwKKy8vIGNhdXNpbmcgdGhpcyBwcm9ncmFtIHRvIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGNvZGUuCitURVNUKEhlbHBGbGFnVGVzdCwgU2hvdWxkTm90QmVSdW4pIHsKKyAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJUZXN0cyBzaG91bGRuJ3QgYmUgcnVuIHdoZW4gLS1oZWxwIGlzIHNwZWNpZmllZC4iOworfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKK1RFU1QoRGVhdGhUZXN0LCBVc2VkQnlQeXRob25TY3JpcHRUb0RldGVjdFN1cHBvcnRGb3JEZWF0aFRlc3RzSW5UaGlzQmluYXJ5KSB7fQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlOGMzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdC5weQpAQCAtMCwwICsxLDE3NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnLgorCitBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBsaXN0IGFsbCB0ZXN0cyBieSBzcGVjaWZ5aW5nIHRoZQorLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcuICBUaGlzIHNjcmlwdCB0ZXN0cyBzdWNoIGZ1bmN0aW9uYWxpdHkKK2J5IGludm9raW5nIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIChhIHByb2dyYW0gd3JpdHRlbiB3aXRoCitHb29nbGUgVGVzdCkgdGhlIGNvbW1hbmQgbGluZSBmbGFncy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3BoYW5uYUBnb29nbGUuY29tIChQYXRyaWNrIEhhbm5hKScKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworCisjIENvbnN0YW50cy4KKworIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBsaXN0aW5nIGFsbCB0ZXN0cy4KK0xJU1RfVEVTVFNfRkxBRyA9ICdndGVzdF9saXN0X3Rlc3RzJworCisjIFBhdGggdG8gdGhlIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIHByb2dyYW0uCitFWEVfUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XycpCisKKyMgVGhlIGV4cGVjdGVkIG91dHB1dCB3aGVuIHJ1bm5pbmcgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gd2l0aAorIyAtLWd0ZXN0X2xpc3RfdGVzdHMKK0VYUEVDVEVEX09VVFBVVF9OT19GSUxURVIgPSAiIiJGb29EZWF0aFRlc3QuCisgIFRlc3QxCitGb28uCisgIEJhcjEKKyAgQmFyMgorICBESVNBQkxFRF9CYXIzCitBYmMuCisgIFh5egorICBEZWYKK0Zvb0Jhci4KKyAgQmF6CitGb29UZXN0LgorICBUZXN0MQorICBESVNBQkxFRF9UZXN0MgorICBUZXN0MworIiIiCisKKyMgVGhlIGV4cGVjdGVkIG91dHB1dCB3aGVuIHJ1bm5pbmcgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gd2l0aAorIyAtLWd0ZXN0X2xpc3RfdGVzdHMgYW5kIC0tZ3Rlc3RfZmlsdGVyPUZvbyouCitFWFBFQ1RFRF9PVVRQVVRfRklMVEVSX0ZPTyA9ICIiIkZvb0RlYXRoVGVzdC4KKyAgVGVzdDEKK0Zvby4KKyAgQmFyMQorICBCYXIyCisgIERJU0FCTEVEX0JhcjMKK0Zvb0Jhci4KKyAgQmF6CitGb29UZXN0LgorICBUZXN0MQorICBESVNBQkxFRF9UZXN0MgorICBUZXN0MworIiIiCisKKyMgVXRpbGl0aWVzLgorCisKK2RlZiBSdW4oYXJncyk6CisgICIiIlJ1bnMgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgdGVzdHMgcHJpbnRlZC4iIiIKKworICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtFWEVfUEFUSF0gKyBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVfc3RkZXJyPUZhbHNlKS5vdXRwdXQKKworCisjIFRoZSB1bml0IHRlc3QuCisKK2NsYXNzIEdUZXN0TGlzdFRlc3RzVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB0byBsaXN0IGFsbCB0ZXN0cy4iIiIKKworICBkZWYgUnVuQW5kVmVyaWZ5KHNlbGYsIGZsYWdfdmFsdWUsIGV4cGVjdGVkX291dHB1dCwgb3RoZXJfZmxhZyk6CisgICAgIiIiUnVucyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyBhbmQgdmVyaWZpZXMgdGhhdCBpdCBwcmludHMKKyAgICB0aGUgY29ycmVjdCB0ZXN0cy4KKworICAgIEFyZ3M6CisgICAgICBmbGFnX3ZhbHVlOiAgICAgICB2YWx1ZSBvZiB0aGUgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWc7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KKworICAgICAgZXhwZWN0ZWRfb3V0cHV0OiAgdGhlIGV4cGVjdGVkIG91dHB1dCBhZnRlciBydW5uaW5nIGNvbW1hbmQ7CisKKyAgICAgIG90aGVyX2ZsYWc6ICAgICAgIGEgZGlmZmVyZW50IGZsYWcgdG8gYmUgcGFzc2VkIHRvIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsb25nIHdpdGggZ3Rlc3RfbGlzdF90ZXN0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgaWYgdGhlIGZsYWcgc2hvdWxkIG5vdCBiZSBwcmVzZW50LgorICAgICIiIgorCisgICAgaWYgZmxhZ192YWx1ZSBpcyBOb25lOgorICAgICAgZmxhZyA9ICcnCisgICAgICBmbGFnX2V4cHJlc3Npb24gPSAnbm90IHNldCcKKyAgICBlbGlmIGZsYWdfdmFsdWUgPT0gJzAnOgorICAgICAgZmxhZyA9ICctLSVzPTAnICUgTElTVF9URVNUU19GTEFHCisgICAgICBmbGFnX2V4cHJlc3Npb24gPSAnMCcKKyAgICBlbHNlOgorICAgICAgZmxhZyA9ICctLSVzJyAlIExJU1RfVEVTVFNfRkxBRworICAgICAgZmxhZ19leHByZXNzaW9uID0gJzEnCisKKyAgICBhcmdzID0gW2ZsYWddCisKKyAgICBpZiBvdGhlcl9mbGFnIGlzIG5vdCBOb25lOgorICAgICAgYXJncyArPSBbb3RoZXJfZmxhZ10KKworICAgIG91dHB1dCA9IFJ1bihhcmdzKQorCisgICAgbXNnID0gKCd3aGVuICVzIGlzICVzLCB0aGUgb3V0cHV0IG9mICIlcyIgaXMgIiVzIi4nICUKKyAgICAgICAgICAgKExJU1RfVEVTVFNfRkxBRywgZmxhZ19leHByZXNzaW9uLCAnICcuam9pbihhcmdzKSwgb3V0cHV0KSkKKworICAgIGlmIGV4cGVjdGVkX291dHB1dCBpcyBub3QgTm9uZToKKyAgICAgIHNlbGYuYXNzZXJ0XyhvdXRwdXQgPT0gZXhwZWN0ZWRfb3V0cHV0LCBtc2cpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0XyhvdXRwdXQgIT0gRVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUiwgbXNnKQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBtb2RlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZmxhZ192YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Tm9uZSkKKworICBkZWYgdGVzdEZsYWcoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz1Ob25lKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dD1FWFBFQ1RFRF9PVVRQVVRfTk9fRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Tm9uZSkKKworICBkZWYgdGVzdE92ZXJyaWRlTm9uRmlsdGVyRmxhZ3Moc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCAtLWd0ZXN0X2xpc3RfdGVzdHMgb3ZlcnJpZGVzIHRoZSBub24tZmlsdGVyIGZsYWdzLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0PUVYUEVDVEVEX09VVFBVVF9OT19GSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz0nLS1ndGVzdF9icmVha19vbl9mYWlsdXJlJykKKworICBkZWYgdGVzdFdpdGhGaWx0ZXJGbGFncyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IC0tZ3Rlc3RfbGlzdF90ZXN0cyB0YWtlcyBpbnRvIGFjY291bnQgdGhlCisgICAgLS1ndGVzdF9maWx0ZXIgZmxhZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dD1FWFBFQ1RFRF9PVVRQVVRfRklMVEVSX0ZPTywKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPSctLWd0ZXN0X2ZpbHRlcj1Gb28qJykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWQwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8uY2MKQEAgLTAsMCArMSw4NSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcGhhbm5hQGdvb2dsZS5jb20gKFBhdHJpY2sgSGFubmEpCisKKy8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4KKy8vCisvLyBBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBsaXN0IGFsbCB0ZXN0cyB0aGF0IHdpbGwgcnVuCisvLyBzbyB0aGF0IHdoZW4gdXNpbmcgYSBmaWx0ZXIsIGEgdXNlciB3aWxsIGtub3cgd2hhdAorLy8gdGVzdHMgdG8gbG9vayBmb3IuIFRoZSB0ZXN0cyB3aWxsIG5vdCBiZSBydW4gYWZ0ZXIgbGlzdGluZy4KKy8vCisvLyBUaGlzIHByb2dyYW0gd2lsbCBiZSBpbnZva2VkIGZyb20gYSBQeXRob24gdW5pdCB0ZXN0LgorLy8gRG9uJ3QgcnVuIGl0IGRpcmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworLy8gU2V2ZXJhbCBkaWZmZXJlbnQgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdGhhdCB3aWxsIGJlIGxpc3RlZC4KK1RFU1QoRm9vLCBCYXIxKSB7Cit9CisKK1RFU1QoRm9vLCBCYXIyKSB7Cit9CisKK1RFU1QoRm9vLCBESVNBQkxFRF9CYXIzKSB7Cit9CisKK1RFU1QoQWJjLCBYeXopIHsKK30KKworVEVTVChBYmMsIERlZikgeworfQorCitURVNUKEZvb0JhciwgQmF6KSB7Cit9CisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKK30KKworVEVTVF9GKEZvb1Rlc3QsIERJU0FCTEVEX1Rlc3QyKSB7Cit9CisKK1RFU1RfRihGb29UZXN0LCBUZXN0MykgeworfQorCitURVNUKEZvb0RlYXRoVGVzdCwgVGVzdDEpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfbWFpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Q5YmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFRlc3RzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBkZWZpbmUgbWFpbigpIHdoZW4gd2UgbGluayB0bworLy8gZ3Rlc3RfbWFpbiBpbnN0ZWFkIG9mIGd0ZXN0LgorCituYW1lc3BhY2UgeworCitURVNUKEdUZXN0TWFpblRlc3QsIFNob3VsZFN1Y2NlZWQpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFdlIGFyZSB1c2luZyB0aGUgbWFpbigpIGZ1bmN0aW9uIGRlZmluZWQgaW4gc3JjL2d0ZXN0X21haW4uY2MsIHNvCisvLyB3ZSBkb24ndCBkZWZpbmUgaXQgaGVyZS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9ub190ZXN0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyNTk5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9ub190ZXN0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGVzdHMgdGhhdCBhIEdvb2dsZSBUZXN0IHByb2dyYW0gdGhhdCBoYXMgbm8gdGVzdCBkZWZpbmVkIGNhbiBydW4KKy8vIHN1Y2Nlc3NmdWxseS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIEFuIGFkLWhvYyBhc3NlcnRpb24gb3V0c2lkZSBvZiBhbGwgdGVzdHMuCisgIC8vCisgIC8vIFRoaXMgc2VydmVzIHRocmVlIHB1cnBvc2VzOgorICAvLworICAvLyAxLiBJdCB2ZXJpZmllcyB0aGF0IGFuIGFkLWhvYyBhc3NlcnRpb24gY2FuIGJlIGV4ZWN1dGVkIGV2ZW4gaWYKKyAgLy8gICAgbm8gdGVzdCBpcyBkZWZpbmVkLgorICAvLyAyLiBJdCB2ZXJpZmllcyB0aGF0IGEgZmFpbGVkIGFkLWhvYyBhc3NlcnRpb24gY2F1c2VzIHRoZSB0ZXN0CisgIC8vICAgIHByb2dyYW0gdG8gZmFpbC4KKyAgLy8gMy4gV2UgaGFkIGEgYnVnIHdoZXJlIHRoZSBYTUwgb3V0cHV0IHdvbid0IGJlIGdlbmVyYXRlZCBpZiBhbgorICAvLyAgICBhc3NlcnRpb24gaXMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBjYWxsZWQsIGV2ZW4KKyAgLy8gICAgdGhvdWdoIC0tZ3Rlc3Rfb3V0cHV0PXhtbCBpcyBzcGVjaWZpZWQuICBUaGlzIG1ha2VzIHN1cmUgdGhlCisgIC8vICAgIGJ1ZyBpcyBmaXhlZCBhbmQgZG9lc24ndCByZWdyZXNzLgorICBFWFBFQ1RfRVEoMSwgMik7CisKKyAgLy8gVGhlIGFib3ZlIEVYUEVDVF9FUSgpIHNob3VsZCBjYXVzZSBSVU5fQUxMX1RFU1RTKCkgdG8gcmV0dXJuIG5vbi16ZXJvLgorICByZXR1cm4gUlVOX0FMTF9URVNUUygpID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQwOWUyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdC5weQpAQCAtMCwwICsxLDMzNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgdGhlIHRleHQgb3V0cHV0IG9mIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsuCisKK1NZTk9QU0lTCisgICAgICAgZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgLS1idWlsZF9kaXI9QlVJTEQvRElSIC0tZ2VuZ29sZGVuCisgICAgICAgICAjIHdoZXJlIEJVSUxEL0RJUiBjb250YWlucyB0aGUgYnVpbHQgZ3Rlc3Rfb3V0cHV0X3Rlc3RfIGZpbGUuCisgICAgICAgZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgLS1nZW5nb2xkZW4KKyAgICAgICBndGVzdF9vdXRwdXRfdGVzdC5weQorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKKyMgVGhlIGZsYWcgZm9yIGdlbmVyYXRpbmcgdGhlIGdvbGRlbiBmaWxlCitHRU5HT0xERU5fRkxBRyA9ICctLWdlbmdvbGRlbicKK0NBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUl9OQU1FID0gJ0dURVNUX0NBVENIX0VYQ0VQVElPTlMnCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKKworIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiByZW1vdmUgdGhlIF9saW4gc3VmZml4LgorR09MREVOX05BTUUgPSAnZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQnCisKK1BST0dSQU1fUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9vdXRwdXRfdGVzdF8nKQorCisjIEF0IGxlYXN0IG9uZSBjb21tYW5kIHdlIGV4ZXJjaXNlIG11c3Qgbm90IGhhdmUgdGhlCisjIC0tZ3Rlc3RfaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzIGZsYWcuCitDT01NQU5EX0xJU1RfVEVTVFMgPSAoe30sIFtQUk9HUkFNX1BBVEgsICctLWd0ZXN0X2xpc3RfdGVzdHMnXSkKK0NPTU1BTkRfV0lUSF9DT0xPUiA9ICh7fSwgW1BST0dSQU1fUEFUSCwgJy0tZ3Rlc3RfY29sb3I9eWVzJ10pCitDT01NQU5EX1dJVEhfVElNRSA9ICh7fSwgW1BST0dSQU1fUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tZ3Rlc3RfcHJpbnRfdGltZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICctLWd0ZXN0X2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICctLWd0ZXN0X2ZpbHRlcj1GYXRhbEZhaWx1cmVUZXN0Lio6TG9nZ2luZ1Rlc3QuKiddKQorQ09NTUFORF9XSVRIX0RJU0FCTEVEID0gKAorICAgIHt9LCBbUFJPR1JBTV9QQVRILAorICAgICAgICAgJy0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMnLAorICAgICAgICAgJy0tZ3Rlc3RfaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzJywKKyAgICAgICAgICctLWd0ZXN0X2ZpbHRlcj0qRElTQUJMRURfKiddKQorQ09NTUFORF9XSVRIX1NIQVJESU5HID0gKAorICAgIHsnR1RFU1RfU0hBUkRfSU5ERVgnOiAnMScsICdHVEVTVF9UT1RBTF9TSEFSRFMnOiAnMid9LAorICAgIFtQUk9HUkFNX1BBVEgsCisgICAgICctLWd0ZXN0X2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycsCisgICAgICctLWd0ZXN0X2ZpbHRlcj1QYXNzaW5nVGVzdC4qJ10pCisKK0dPTERFTl9QQVRIID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksIEdPTERFTl9OQU1FKQorCisKK2RlZiBUb1VuaXhMaW5lRW5kaW5nKHMpOgorICAiIiJDaGFuZ2VzIGFsbCBXaW5kb3dzL01hYyBsaW5lIGVuZGluZ3MgaW4gcyB0byBVTklYIGxpbmUgZW5kaW5ncy4iIiIKKworICByZXR1cm4gcy5yZXBsYWNlKCdcclxuJywgJ1xuJykucmVwbGFjZSgnXHInLCAnXG4nKQorCisKK2RlZiBSZW1vdmVMb2NhdGlvbnModGVzdF9vdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gZnJvbSBhIEdvb2dsZSBUZXN0IHByb2dyYW0ncyBvdXRwdXQuCisKKyAgQXJnczoKKyAgICAgICB0ZXN0X291dHB1dDogIHRoZSBvdXRwdXQgb2YgYSBHb29nbGUgVGVzdCBwcm9ncmFtLgorCisgIFJldHVybnM6CisgICAgICAgb3V0cHV0IHdpdGggYWxsIGZpbGUgbG9jYXRpb24gaW5mbyAoaW4gdGhlIGZvcm0gb2YKKyAgICAgICAnRElSRUNUT1JZL0ZJTEVfTkFNRTpMSU5FX05VTUJFUjogJ29yCisgICAgICAgJ0RJUkVDVE9SWVxcRklMRV9OQU1FKExJTkVfTlVNQkVSKTogJykgcmVwbGFjZWQgYnkKKyAgICAgICAnRklMRV9OQU1FOiM6ICcuCisgICIiIgorCisgIHJldHVybiByZS5zdWIocicuKlsvXFxdKC4rKShcOlxkK3xcKFxkK1wpKVw6ICcsIHInXDE6IzogJywgdGVzdF9vdXRwdXQpCisKKworZGVmIFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCk6CisgICIiIlJlbW92ZXMgYWxsIHN0YWNrIHRyYWNlcyBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4iIiIKKworICAjICo/IG1lYW5zICJmaW5kIHRoZSBzaG9ydGVzdCBzdHJpbmcgdGhhdCBtYXRjaGVzIi4KKyAgcmV0dXJuIHJlLnN1YihyJ1N0YWNrIHRyYWNlOigufFxuKSo/XG5cbicsCisgICAgICAgICAgICAgICAgJ1N0YWNrIHRyYWNlOiAob21pdHRlZClcblxuJywgb3V0cHV0KQorCisKK2RlZiBSZW1vdmVTdGFja1RyYWNlcyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCB0cmFjZXMgb2Ygc3RhY2sgdHJhY2VzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgICMgKj8gbWVhbnMgImZpbmQgdGhlIHNob3J0ZXN0IHN0cmluZyB0aGF0IG1hdGNoZXMiLgorICByZXR1cm4gcmUuc3ViKHInU3RhY2sgdHJhY2U6KC58XG4pKj9cblxuJywgJycsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlVGltZShvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCB0aW1lIGluZm9ybWF0aW9uIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgIHJldHVybiByZS5zdWIocidcKFxkKyBtcycsICcoPyBtcycsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlVHlwZUluZm9EZXRhaWxzKHRlc3Rfb3V0cHV0KToKKyAgIiIiUmVtb3ZlcyBjb21waWxlci1zcGVjaWZpYyB0eXBlIGluZm8gZnJvbSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgorCisgIEFyZ3M6CisgICAgICAgdGVzdF9vdXRwdXQ6ICB0aGUgb3V0cHV0IG9mIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbS4KKworICBSZXR1cm5zOgorICAgICAgIG91dHB1dCB3aXRoIHR5cGUgaW5mb3JtYXRpb24gbm9ybWFsaXplZCB0byBjYW5vbmljYWwgZm9ybS4KKyAgIiIiCisKKyAgIyBzb21lIGNvbXBpbGVycyBvdXRwdXQgdGhlIG5hbWUgb2YgdHlwZSAndW5zaWduZWQgaW50JyBhcyAndW5zaWduZWQnCisgIHJldHVybiByZS5zdWIocid1bnNpZ25lZCBpbnQnLCAndW5zaWduZWQnLCB0ZXN0X291dHB1dCkKKworCitkZWYgTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0odGVzdF9vdXRwdXQpOgorICAiIiJOb3JtYWxpemVzIHBsYXRmb3JtIHNwZWNpZmljIG91dHB1dCBkZXRhaWxzIGZvciBlYXNpZXIgY29tcGFyaXNvbi4iIiIKKworICBpZiBJU19XSU5ET1dTOgorICAgICMgUmVtb3ZlcyB0aGUgY29sb3IgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcHJlc2VudCBvbiBXaW5kb3dzLgorICAgIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKCdceDFiXFxbKDA7M1xkKT9tJywgJycsIHRlc3Rfb3V0cHV0KQorICAgICMgQ2hhbmdlcyBmYWlsdXJlIG1lc3NhZ2UgaGVhZGVycyBpbnRvIHRoZSBXaW5kb3dzIGZvcm1hdC4KKyAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJzogRmFpbHVyZVxuJywgcic6IGVycm9yOiAnLCB0ZXN0X291dHB1dCkKKyAgICAjIENoYW5nZXMgZmlsZShsaW5lX251bWJlcikgdG8gZmlsZTpsaW5lX251bWJlci4KKyAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJygoXHd8XC4pKylcKChcZCspXCk6JywgcidcMTpcMzonLCB0ZXN0X291dHB1dCkKKworICByZXR1cm4gdGVzdF9vdXRwdXQKKworCitkZWYgUmVtb3ZlVGVzdENvdW50cyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIHRlc3QgY291bnRzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgIG91dHB1dCA9IHJlLnN1YihyJ1xkKyB0ZXN0cz8sIGxpc3RlZCBiZWxvdycsCisgICAgICAgICAgICAgICAgICAnPyB0ZXN0cywgbGlzdGVkIGJlbG93Jywgb3V0cHV0KQorICBvdXRwdXQgPSByZS5zdWIocidcZCsgRkFJTEVEIFRFU1RTJywKKyAgICAgICAgICAgICAgICAgICc/IEZBSUxFRCBURVNUUycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIFxkKyB0ZXN0IGNhc2VzPycsCisgICAgICAgICAgICAgICAgICAnPyB0ZXN0cyBmcm9tID8gdGVzdCBjYXNlcycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIChbYS16QS1aX10pJywKKyAgICAgICAgICAgICAgICAgIHInPyB0ZXN0cyBmcm9tIFwxJywgb3V0cHV0KQorICByZXR1cm4gcmUuc3ViKHInXGQrIHRlc3RzP1wuJywgJz8gdGVzdHMuJywgb3V0cHV0KQorCisKK2RlZiBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCBwYXR0ZXJuKToKKyAgIiIiUmVtb3ZlcyBvdXRwdXQgb2Ygc3BlY2lmaWVkIHRlc3RzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgorCisgIFRoaXMgZnVuY3Rpb24gc3RyaXBzIG5vdCBvbmx5IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgYSB0ZXN0IGJ1dCBhbHNvCisgIGFsbCBvdXRwdXQgaW4gYmV0d2Vlbi4KKworICBBcmdzOgorICAgIHRlc3Rfb3V0cHV0OiAgICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSB0ZXN0IG91dHB1dC4KKyAgICBwYXR0ZXJuOiAgICAgICAgICAgQSByZWdleCBzdHJpbmcgdGhhdCBtYXRjaGVzIG5hbWVzIG9mIHRlc3QgY2FzZXMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgdG8gcmVtb3ZlLgorCisgIFJldHVybnM6CisgICAgQ29udGVudHMgb2YgdGVzdF9vdXRwdXQgd2l0aCB0ZXN0cyB3aG9zZSBuYW1lcyBtYXRjaCBwYXR0ZXJuIHJlbW92ZWQuCisgICIiIgorCisgIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKAorICAgICAgcicuKlxbIFJVTiAgICAgIFxdIC4qJXMoLnxcbikqP1xbKCAgRkFJTEVEICB8ICAgICAgIE9LIClcXSAuKiVzLipcbicgJSAoCisgICAgICAgICAgcGF0dGVybiwgcGF0dGVybiksCisgICAgICAnJywKKyAgICAgIHRlc3Rfb3V0cHV0KQorICByZXR1cm4gcmUuc3ViKHInLiolcy4qXG4nICUgcGF0dGVybiwgJycsIHRlc3Rfb3V0cHV0KQorCisKK2RlZiBOb3JtYWxpemVPdXRwdXQob3V0cHV0KToKKyAgIiIiTm9ybWFsaXplcyBvdXRwdXQgKHRoZSBvdXRwdXQgb2YgZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmV4ZSkuIiIiCisKKyAgb3V0cHV0ID0gVG9Vbml4TGluZUVuZGluZyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCkKKyAgb3V0cHV0ID0gUmVtb3ZlVGltZShvdXRwdXQpCisgIHJldHVybiBvdXRwdXQKKworCitkZWYgR2V0U2hlbGxDb21tYW5kT3V0cHV0KGVudl9jbWQpOgorICAiIiJSdW5zIGEgY29tbWFuZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgcmV0dXJucyBpdHMgb3V0cHV0IGluIGEgc3RyaW5nLgorCisgIEFyZ3M6CisgICAgZW52X2NtZDogVGhlIHNoZWxsIGNvbW1hbmQuIEEgMi10dXBsZSB3aGVyZSBlbGVtZW50IDAgaXMgYSBkaWN0IG9mIGV4dHJhCisgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCwgYW5kIGVsZW1lbnQgMSBpcyBhIHN0cmluZyB3aXRoCisgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KKworICBSZXR1cm5zOgorICAgIEEgc3RyaW5nIHdpdGggdGhlIGNvbW1hbmQncyBjb21iaW5lZCBzdGFuZGFyZCBhbmQgZGlhZ25vc3RpYyBvdXRwdXQuCisgICIiIgorCisgICMgU3Bhd25zIGNtZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgZ2V0cyBpdHMgc3RhbmRhcmQgSS9PIGZpbGUgb2JqZWN0cy4KKyAgIyBTZXQgYW5kIHNhdmUgdGhlIGVudmlyb25tZW50IHByb3Blcmx5LgorICBlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgZW52aXJvbi51cGRhdGUoZW52X2NtZFswXSkKKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhlbnZfY21kWzFdLCBlbnY9ZW52aXJvbikKKworICByZXR1cm4gcC5vdXRwdXQKKworCitkZWYgR2V0Q29tbWFuZE91dHB1dChlbnZfY21kKToKKyAgIiIiUnVucyBhIGNvbW1hbmQgYW5kIHJldHVybnMgaXRzIG91dHB1dCB3aXRoIGFsbCBmaWxlIGxvY2F0aW9uCisgIGluZm8gc3RyaXBwZWQgb2ZmLgorCisgIEFyZ3M6CisgICAgZW52X2NtZDogIFRoZSBzaGVsbCBjb21tYW5kLiBBIDItdHVwbGUgd2hlcmUgZWxlbWVudCAwIGlzIGEgZGljdCBvZiBleHRyYQorICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0LCBhbmQgZWxlbWVudCAxIGlzIGEgc3RyaW5nIHdpdGgKKyAgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KKyAgIiIiCisKKyAgIyBEaXNhYmxlcyBleGNlcHRpb24gcG9wLXVwcyBvbiBXaW5kb3dzLgorICBlbnZpcm9uLCBjbWRsaW5lID0gZW52X2NtZAorICBlbnZpcm9uID0gZGljdChlbnZpcm9uKSAgIyBFbnN1cmVzIHdlIGFyZSBtb2RpZnlpbmcgYSBjb3B5LgorICBlbnZpcm9uW0NBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUl9OQU1FXSA9ICcxJworICByZXR1cm4gTm9ybWFsaXplT3V0cHV0KEdldFNoZWxsQ29tbWFuZE91dHB1dCgoZW52aXJvbiwgY21kbGluZSkpKQorCisKK2RlZiBHZXRPdXRwdXRPZkFsbENvbW1hbmRzKCk6CisgICIiIlJldHVybnMgY29uY2F0ZW5hdGVkIG91dHB1dCBmcm9tIHNldmVyYWwgcmVwcmVzZW50YXRpdmUgY29tbWFuZHMuIiIiCisKKyAgcmV0dXJuIChHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9DT0xPUikgKworICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1RJTUUpICsKKyAgICAgICAgICBHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9ESVNBQkxFRCkgKworICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1NIQVJESU5HKSkKKworCit0ZXN0X2xpc3QgPSBHZXRTaGVsbENvbW1hbmRPdXRwdXQoQ09NTUFORF9MSVNUX1RFU1RTKQorU1VQUE9SVFNfREVBVEhfVEVTVFMgPSAnRGVhdGhUZXN0JyBpbiB0ZXN0X2xpc3QKK1NVUFBPUlRTX1RZUEVEX1RFU1RTID0gJ1R5cGVkVGVzdCcgaW4gdGVzdF9saXN0CitTVVBQT1JUU19USFJFQURTID0gJ0V4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QnIGluIHRlc3RfbGlzdAorU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTID0gRmFsc2UKKworQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFID0gKFNVUFBPUlRTX0RFQVRIX1RFU1RTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RZUEVEX1RFU1RTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RIUkVBRFMpCisKKworY2xhc3MgR1Rlc3RPdXRwdXRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgUmVtb3ZlVW5zdXBwb3J0ZWRUZXN0cyhzZWxmLCB0ZXN0X291dHB1dCk6CisgICAgaWYgbm90IFNVUFBPUlRTX0RFQVRIX1RFU1RTOgorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnRGVhdGhUZXN0JykKKyAgICBpZiBub3QgU1VQUE9SVFNfVFlQRURfVEVTVFM6CisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsICdUeXBlZFRlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnVHlwZWREZWF0aFRlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnVHlwZVBhcmFtRGVhdGhUZXN0JykKKyAgICBpZiBub3QgU1VQUE9SVFNfVEhSRUFEUzoKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCcpCisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCcpCisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtzQ29uY3VycmVudGx5JykKKyAgICBpZiBub3QgU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTOgorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVTdGFja1RyYWNlcyh0ZXN0X291dHB1dCkKKworICAgIHJldHVybiB0ZXN0X291dHB1dAorCisgIGRlZiB0ZXN0T3V0cHV0KHNlbGYpOgorICAgIG91dHB1dCA9IEdldE91dHB1dE9mQWxsQ29tbWFuZHMoKQorCisgICAgZ29sZGVuX2ZpbGUgPSBvcGVuKEdPTERFTl9QQVRILCAncmInKQorICAgICMgQSBtaXMtY29uZmlndXJlZCBzb3VyY2UgY29udHJvbCBzeXN0ZW0gY2FuIGNhdXNlIFxyIGFwcGVhciBpbiBFT0wKKyAgICAjIHNlcXVlbmNlcyB3aGVuIHdlIHJlYWQgdGhlIGdvbGRlbiBmaWxlIGlycmVzcGVjdGl2ZSBvZiBhbiBvcGVyYXRpbmcKKyAgICAjIHN5c3RlbSB1c2VkLiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gc3RyaXAgdGhvc2UgXHIncyBmcm9tIG5ld2xpbmVzCisgICAgIyB1bmNvbmRpdGlvbmFsbHkuCisgICAgZ29sZGVuID0gVG9Vbml4TGluZUVuZGluZyhnb2xkZW5fZmlsZS5yZWFkKCkpCisgICAgZ29sZGVuX2ZpbGUuY2xvc2UoKQorCisgICAgIyBXZSB3YW50IHRoZSB0ZXN0IHRvIHBhc3MgcmVnYXJkbGVzcyBvZiBjZXJ0YWluIGZlYXR1cmVzIGJlaW5nCisgICAgIyBzdXBwb3J0ZWQgb3Igbm90LgorCisgICAgIyBXZSBzdGlsbCBoYXZlIHRvIHJlbW92ZSB0eXBlIG5hbWUgc3BlY2lmaWNzIGluIGFsbCBjYXNlcy4KKyAgICBub3JtYWxpemVkX2FjdHVhbCA9IFJlbW92ZVR5cGVJbmZvRGV0YWlscyhvdXRwdXQpCisgICAgbm9ybWFsaXplZF9nb2xkZW4gPSBSZW1vdmVUeXBlSW5mb0RldGFpbHMoZ29sZGVuKQorCisgICAgaWYgQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtYWxpemVkX2dvbGRlbiwgbm9ybWFsaXplZF9hY3R1YWwpCisgICAgZWxzZToKKyAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsID0gTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0oCisgICAgICAgICAgUmVtb3ZlVGVzdENvdW50cyhub3JtYWxpemVkX2FjdHVhbCkpCisgICAgICBub3JtYWxpemVkX2dvbGRlbiA9IE5vcm1hbGl6ZVRvQ3VycmVudFBsYXRmb3JtKAorICAgICAgICAgIFJlbW92ZVRlc3RDb3VudHMoc2VsZi5SZW1vdmVVbnN1cHBvcnRlZFRlc3RzKG5vcm1hbGl6ZWRfZ29sZGVuKSkpCisKKyAgICAgICMgVGhpcyBjb2RlIGlzIHZlcnkgaGFuZHkgd2hlbiBkZWJ1Z2dpbmcgZ29sZGVuIGZpbGUgZGlmZmVyZW5jZXM6CisgICAgICBpZiBvcy5nZXRlbnYoJ0RFQlVHX0dURVNUX09VVFBVVF9URVNUJyk6CisgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKAorICAgICAgICAgICAgZ3Rlc3RfdGVzdF91dGlscy5HZXRTb3VyY2VEaXIoKSwKKyAgICAgICAgICAgICdfZ3Rlc3Rfb3V0cHV0X3Rlc3Rfbm9ybWFsaXplZF9hY3R1YWwudHh0JyksICd3YicpLndyaXRlKAorICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsKQorICAgICAgICBvcGVuKG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksCisgICAgICAgICAgICAnX2d0ZXN0X291dHB1dF90ZXN0X25vcm1hbGl6ZWRfZ29sZGVuLnR4dCcpLCAnd2InKS53cml0ZSgKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkX2dvbGRlbikKKworICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtYWxpemVkX2dvbGRlbiwgbm9ybWFsaXplZF9hY3R1YWwpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgaWYgc3lzLmFyZ3ZbMTpdID09IFtHRU5HT0xERU5fRkxBR106CisgICAgaWYgQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFOgorICAgICAgb3V0cHV0ID0gR2V0T3V0cHV0T2ZBbGxDb21tYW5kcygpCisgICAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICd3YicpCisgICAgICBnb2xkZW5fZmlsZS53cml0ZShvdXRwdXQpCisgICAgICBnb2xkZW5fZmlsZS5jbG9zZSgpCisgICAgZWxzZToKKyAgICAgIG1lc3NhZ2UgPSAoCisgICAgICAgICAgIiIiVW5hYmxlIHRvIHdyaXRlIGEgZ29sZGVuIGZpbGUgd2hlbiBjb21waWxlZCBpbiBhbiBlbnZpcm9ubWVudAordGhhdCBkb2VzIG5vdCBzdXBwb3J0IGFsbCB0aGUgcmVxdWlyZWQgZmVhdHVyZXMgKGRlYXRoIHRlc3RzLCB0eXBlZCB0ZXN0cywKK2FuZCBtdWx0aXBsZSB0aHJlYWRzKS4gIFBsZWFzZSBnZW5lcmF0ZSB0aGUgZ29sZGVuIGZpbGUgdXNpbmcgYSBiaW5hcnkgYnVpbHQKK3dpdGggdGhvc2UgZmVhdHVyZXMgZW5hYmxlZC4iIiIpCisKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUobWVzc2FnZSkKKyAgICAgIHN5cy5leGl0KDEpCisgIGVsc2U6CisgICAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWI2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTAzNCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBvdXRwdXQgdW5kZXIKKy8vIHZhcmlvdXMgY29uZGl0aW9ucy4gIFRoZSBvdXRwdXQgd2lsbCB0aGVuIGJlIHZlcmlmaWVkIGJ5CisvLyBndGVzdF9vdXRwdXRfdGVzdC5weSB0byBlbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBnZW5lcmF0ZXMgdGhlCisvLyBkZXNpcmVkIG1lc3NhZ2VzLiAgVGhlcmVmb3JlLCBtb3N0IHRlc3RzIGluIHRoaXMgZmlsZSBhcmUgTUVBTlQgVE8KKy8vIEZBSUwuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKK3VzaW5nIHRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheTsKKwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6Ok5vdGlmaWNhdGlvbjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07CisjZW5kaWYKKworbmFtZXNwYWNlIHBvc2l4ID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjsKKworLy8gVGVzdHMgY2F0Y2hpbmcgZmF0YWwgZmFpbHVyZXMuCisKKy8vIEEgc3Vicm91dGluZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdC4KK3ZvaWQgVGVzdEVxMShpbnQgeCkgeworICBBU1NFUlRfRVEoMSwgeCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSB0ZXN0IHN1YnJvdXRpbmUsIGNhdGNoZXMgdGhlIGZhdGFsIGZhaWx1cmUgaXQKKy8vIGdlbmVyYXRlcywgYW5kIHRoZW4gcmV0dXJucyBlYXJseS4KK3ZvaWQgVHJ5VGVzdFN1YnJvdXRpbmUoKSB7CisgIC8vIENhbGxzIGEgc3Vicm91bnRpbmUgdGhhdCB5aWVsZHMgYSBmYXRhbCBmYWlsdXJlLgorICBUZXN0RXExKDIpOworCisgIC8vIENhdGNoZXMgdGhlIGZhdGFsIGZhaWx1cmUgYW5kIGFib3J0cyB0aGUgdGVzdC4KKyAgLy8KKyAgLy8gVGhlIHRlc3Rpbmc6OlRlc3Q6OiBwcmVmaXggaXMgbmVjZXNzYXJ5IHdoZW4gY2FsbGluZworICAvLyBIYXNGYXRhbEZhaWx1cmUoKSBvdXRzaWRlIG9mIGEgVEVTVCwgVEVTVF9GLCBvciB0ZXN0IGZpeHR1cmUuCisgIGlmICh0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworCisgIC8vIElmIHdlIGdldCBoZXJlLCBzb21ldGhpbmcgaXMgd3JvbmcuCisgIEZBSUwoKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZC4iOworfQorCitURVNUKFBhc3NpbmdUZXN0LCBQYXNzaW5nVGVzdDEpIHsKK30KKworVEVTVChQYXNzaW5nVGVzdCwgUGFzc2luZ1Rlc3QyKSB7Cit9CisKKy8vIFRlc3RzIHRoYXQgcGFyYW1ldGVycyBvZiBmYWlsaW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIHByaW50ZWQgaW4gdGhlCisvLyBmYWlsaW5nIHRlc3Qgc3VtbWFyeS4KK2NsYXNzIEZhaWxpbmdQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworCitURVNUX1AoRmFpbGluZ1BhcmFtVGVzdCwgRmFpbHMpIHsKKyAgRVhQRUNUX0VRKDEsIEdldFBhcmFtKCkpOworfQorCisvLyBUaGlzIGdlbmVyYXRlcyBhIHRlc3Qgd2hpY2ggd2lsbCBmYWlsLiBHb29nbGUgVGVzdCBpcyBleHBlY3RlZCB0byBwcmludAorLy8gaXRzIHBhcmFtZXRlciB3aGVuIGl0IG91dHB1dHMgdGhlIGxpc3Qgb2YgYWxsIGZhaWxlZCB0ZXN0cy4KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFByaW50aW5nRmFpbGluZ1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxpbmdQYXJhbVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoMikpOworCitzdGF0aWMgY29uc3QgY2hhciBrR29sZGVuU3RyaW5nW10gPSAiXCJMaW5lXDAgMVwiXG5MaW5lIDIiOworCitURVNUKE5vbmZhdGFsRmFpbHVyZVRlc3QsIEVzY2FwZXNTdHJpbmdPcGVyYW5kcykgeworICBzdGQ6OnN0cmluZyBhY3R1YWwgPSAiYWN0dWFsIFwic3RyaW5nXCIiOworICBFWFBFQ1RfRVEoa0dvbGRlblN0cmluZywgYWN0dWFsKTsKKworICBjb25zdCBjaGFyKiBnb2xkZW4gPSBrR29sZGVuU3RyaW5nOworICBFWFBFQ1RfRVEoZ29sZGVuLCBhY3R1YWwpOworfQorCisvLyBUZXN0cyBjYXRjaGluZyBhIGZhdGFsIGZhaWx1cmUgaW4gYSBzdWJyb3V0aW5lLgorVEVTVChGYXRhbEZhaWx1cmVUZXN0LCBGYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpXG4iKTsKKworICBUcnlUZXN0U3Vicm91dGluZSgpOworfQorCisvLyBUZXN0cyBjYXRjaGluZyBhIGZhdGFsIGZhaWx1cmUgaW4gYSBuZXN0ZWQgc3Vicm91dGluZS4KK1RFU1QoRmF0YWxGYWlsdXJlVGVzdCwgRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKVxuIik7CisKKyAgLy8gQ2FsbHMgYSBzdWJyb3VudGluZSB0aGF0IHlpZWxkcyBhIGZhdGFsIGZhaWx1cmUuCisgIFRyeVRlc3RTdWJyb3V0aW5lKCk7CisKKyAgLy8gQ2F0Y2hlcyB0aGUgZmF0YWwgZmFpbHVyZSBhbmQgYWJvcnRzIHRoZSB0ZXN0LgorICAvLworICAvLyBXaGVuIGNhbGxpbmcgSGFzRmF0YWxGYWlsdXJlKCkgaW5zaWRlIGEgVEVTVCwgVEVTVF9GLCBvciB0ZXN0CisgIC8vIGZpeHR1cmUsIHRoZSB0ZXN0aW5nOjpUZXN0OjogcHJlZml4IGlzIG5vdCBuZWVkZWQuCisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworCisgIC8vIElmIHdlIGdldCBoZXJlLCBzb21ldGhpbmcgaXMgd3JvbmcuCisgIEZBSUwoKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZC4iOworfQorCisvLyBUZXN0cyBIYXNGYXRhbEZhaWx1cmUoKSBhZnRlciBhIGZhaWxlZCBFWFBFQ1QgY2hlY2suCitURVNUKEZhdGFsRmFpbHVyZVRlc3QsIE5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlIG9uIGZhbHNlKVxuIik7CisgIEVYUEVDVF9UUlVFKGZhbHNlKTsgIC8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUKKyAgQVNTRVJUX0ZBTFNFKEhhc0ZhdGFsRmFpbHVyZSgpKTsgIC8vIFRoaXMgc2hvdWxkIHN1Y2NlZWQuCit9CisKKy8vIFRlc3RzIGludGVybGVhdmluZyB1c2VyIGxvZ2dpbmcgYW5kIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMuCitURVNUKExvZ2dpbmdUZXN0LCBJbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucykgeworICBzdGF0aWMgY29uc3QgaW50IGFbNF0gPSB7CisgICAgMywgOSwgMiwgNgorICB9OworCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzIG9uICgzKSA+PSAoYVtpXSkpXG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihhKS9zaXplb2YoKmEpKTsgaSsrKSB7CisgICAgcHJpbnRmKCJpID09ICVkXG4iLCBpKTsKKyAgICBFWFBFQ1RfR0UoMywgYVtpXSk7CisgIH0KK30KKworLy8gVGVzdHMgdGhlIFNDT1BFRF9UUkFDRSBtYWNyby4KKworLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRlc3RpbmcgU0NPUEVEX1RSQUNFLgordm9pZCBTdWJXaXRob3V0VHJhY2UoaW50IG4pIHsKKyAgRVhQRUNUX0VRKDEsIG4pOworICBBU1NFUlRfRVEoMiwgbik7Cit9CisKKy8vIEFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIFNDT1BFRF9UUkFDRS4KK3ZvaWQgU3ViV2l0aFRyYWNlKGludCBuKSB7CisgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIm4gPSAiIDw8IG4pOworCisgIFN1YldpdGhvdXRUcmFjZShuKTsKK30KKworLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0UoKSBvYmV5cyBsZXhpY2FsIHNjb3Blcy4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgT2JleXNTY29wZXMpIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyB0cmFjZSBiZWZvcmUgU0NPUEVEX1RSQUNFKCkgaXMgaW52b2tlZC4KKyAgQUREX0ZBSUxVUkUoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkbid0IGhhdmUgYSB0cmFjZS4iOworCisgIHsKKyAgICBTQ09QRURfVFJBQ0UoIkV4cGVjdGVkIHRyYWNlIik7CisgICAgLy8gQWZ0ZXIgU0NPUEVEX1RSQUNFKCksIGEgZmFpbHVyZSBpbiB0aGUgY3VycmVudCBzY29wZSBzaG91bGQgY29udGFpbgorICAgIC8vIHRoZSB0cmFjZS4KKyAgICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgaGF2ZSBhIHRyYWNlLiI7CisgIH0KKworICAvLyBPbmNlIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgc2NvcGUgb2YgdGhlIFNDT1BFRF9UUkFDRSgpLCB0aGVyZQorICAvLyBzaG91bGQgYmUgbm8gdHJhY2UgYWdhaW4uCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZG4ndCBoYXZlIGEgdHJhY2UuIjsKK30KKworLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0Ugd29ya3MgaW5zaWRlIGEgbG9vcC4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgV29ya3NJbkxvb3ApIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIGZvciAoaW50IGkgPSAxOyBpIDw9IDI7IGkrKykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImkgPSAiIDw8IGkpOworCisgICAgU3ViV2l0aG91dFRyYWNlKGkpOworICB9Cit9CisKKy8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFIHdvcmtzIGluIGEgc3Vicm91dGluZS4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgV29ya3NJblN1YnJvdXRpbmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIFN1YldpdGhUcmFjZSgxKTsKKyAgU3ViV2l0aFRyYWNlKDIpOworfQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSBjYW4gYmUgbmVzdGVkLgorVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBDYW5CZU5lc3RlZCkgeworICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7CisKKyAgU0NPUEVEX1RSQUNFKCIiKTsgIC8vIEEgdHJhY2Ugd2l0aG91dCBhIG1lc3NhZ2UuCisKKyAgU3ViV2l0aFRyYWNlKDIpOworfQorCisvLyBUZXN0cyB0aGF0IG11bHRpcGxlIFNDT1BFRF9UUkFDRXMgY2FuIGJlIHVzZWQgaW4gdGhlIHNhbWUgc2NvcGUuCitURVNUKFNDT1BFRF9UUkFDRVRlc3QsIENhbkJlUmVwZWF0ZWQpIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIFNDT1BFRF9UUkFDRSgiQSIpOworICBBRERfRkFJTFVSRSgpCisgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQS4iOworCisgIFNDT1BFRF9UUkFDRSgiQiIpOworICBBRERfRkFJTFVSRSgpCisgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSBhbmQgQi4iOworCisgIHsKKyAgICBTQ09QRURfVFJBQ0UoIkMiKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgPDwgImNvbnRhaW4gdHJhY2UgcG9pbnQgQSwgQiwgYW5kIEMuIjsKKyAgfQorCisgIFNDT1BFRF9UUkFDRSgiRCIpOworICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgIgorICAgICAgICAgICAgICAgIDw8ICJjb250YWluIHRyYWNlIHBvaW50IEEsIEIsIGFuZCBELiI7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSgpcyBjYW4gYmUgdXNlZCBjb25jdXJyZW50bHkgZnJvbSBtdWx0aXBsZQorLy8gdGhyZWFkcy4gIE5hbWVseSwgYW4gYXNzZXJ0aW9uIHNob3VsZCBiZSBhZmZlY3RlZCBieQorLy8gU0NPUEVEX1RSQUNFKClzIGluIGl0cyBvd24gdGhyZWFkIG9ubHkuCisKKy8vIEhlcmUncyB0aGUgc2VxdWVuY2Ugb2YgYWN0aW9ucyB0aGF0IGhhcHBlbiBpbiB0aGUgdGVzdDoKKy8vCisvLyAgIFRocmVhZCBBIChtYWluKSAgICAgICAgICAgICAgICB8IFRocmVhZCBCIChzcGF3bmVkKQorLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIHNwYXducyB0aHJlYWQgQiAgICAgICAgICAgICAgICB8CisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgd2FpdHMgZm9yIG4xICAgICAgICAgICAgICAgICAgIHwgU0NPUEVEX1RSQUNFKCJUcmFjZSBCIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlcyBmYWlsdXJlICMxCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdGlmaWVzIG4xCisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgU0NPUEVEX1RSQUNFKCJUcmFjZSBBIik7ICAgICAgIHwgd2FpdHMgZm9yIG4yCisvLyAgIGdlbmVyYXRlcyBmYWlsdXJlICMyICAgICAgICAgICB8CisvLyAgIG5vdGlmaWVzIG4yICAgICAgICAgICAgICAgICAgICB8CisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgd2FpdHMgZm9yIG4zICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVzIGZhaWx1cmUgIzMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhY2UgQiBkaWVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlcyBmYWlsdXJlICM0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdGlmaWVzIG4zCisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgZ2VuZXJhdGVzIGZhaWx1cmUgIzUgICAgICAgICAgIHwgZmluaXNoZXMKKy8vICAgdHJhY2UgQSBkaWVzICAgICAgICAgICAgICAgICAgIHwKKy8vICAgZ2VuZXJhdGVzIGZhaWx1cmUgIzYgICAgICAgICAgIHwKKy8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICB3YWl0cyBmb3IgdGhyZWFkIEIgdG8gZmluaXNoICAgfAorCitzdHJ1Y3QgQ2hlY2tQb2ludHMgeworICBOb3RpZmljYXRpb24gbjE7CisgIE5vdGlmaWNhdGlvbiBuMjsKKyAgTm90aWZpY2F0aW9uIG4zOworfTsKKworc3RhdGljIHZvaWQgVGhyZWFkV2l0aFNjb3BlZFRyYWNlKENoZWNrUG9pbnRzKiBjaGVja19wb2ludHMpIHsKKyAgeworICAgIFNDT1BFRF9UUkFDRSgiVHJhY2UgQiIpOworICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEIgYWxpdmUpLiI7CisgICAgY2hlY2tfcG9pbnRzLT5uMS5Ob3RpZnkoKTsKKyAgICBjaGVja19wb2ludHMtPm4yLldhaXRGb3JOb3RpZmljYXRpb24oKTsKKworICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzMgKGluIHRocmVhZCBCLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4iOworICB9ICAvLyBUcmFjZSBCIGRpZXMgaGVyZS4KKyAgQUREX0ZBSUxVUkUoKQorICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzQgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEEgYWxpdmUpLiI7CisgIGNoZWNrX3BvaW50cy0+bjMuTm90aWZ5KCk7Cit9CisKK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgV29ya3NDb25jdXJyZW50bHkpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDYgZmFpbHVyZXMpXG4iKTsKKworICBDaGVja1BvaW50cyBjaGVja19wb2ludHM7CisgIFRocmVhZFdpdGhQYXJhbTxDaGVja1BvaW50cyo+IHRocmVhZCgmVGhyZWFkV2l0aFNjb3BlZFRyYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBjaGVja19wb2ludHMubjEuV2FpdEZvck5vdGlmaWNhdGlvbigpOworCisgIHsKKyAgICBTQ09QRURfVFJBQ0UoIlRyYWNlIEEiKTsKKyAgICBBRERfRkFJTFVSRSgpCisgICAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyIChpbiB0aHJlYWQgQSwgdHJhY2UgQSAmIEIgYm90aCBhbGl2ZSkuIjsKKyAgICBjaGVja19wb2ludHMubjIuTm90aWZ5KCk7CisgICAgY2hlY2tfcG9pbnRzLm4zLldhaXRGb3JOb3RpZmljYXRpb24oKTsKKworICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzUgKGluIHRocmVhZCBBLCBvbmx5IHRyYWNlIEEgYWxpdmUpLiI7CisgIH0gIC8vIFRyYWNlIEEgZGllcyBoZXJlLgorICBBRERfRkFJTFVSRSgpCisgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNiAoaW4gdGhyZWFkIEEsIG5vIHRyYWNlIGFsaXZlKS4iOworICB0aHJlYWQuSm9pbigpOworfQorI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKK1RFU1QoRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0LAorICAgICBESVNBQkxFRF9BbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWdTdXBwcmVzc2VzV2FybmluZykgeworICAvLyBUaGlzIHRlc3QgYm9keSBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LiAgSXRzIHNvbGUgcHVycG9zZSBpcyBmb3IKKyAgLy8gdmVyaWZ5aW5nIHRoYXQgdGhlIC0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZworICAvLyBzdXBwcmVzc2VzIHRoZSAiWU9VIEhBVkUgMTIgRElTQUJMRUQgVEVTVFMiIHdhcm5pbmcgYXQgdGhlIGVuZCBvZgorICAvLyB0aGUgdGVzdCBvdXRwdXQuCit9CisKKy8vIFRlc3RzIHVzaW5nIGFzc2VydGlvbnMgb3V0c2lkZSBvZiBURVNUIGFuZCBURVNUX0YuCisvLworLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHR3byBmYWlsdXJlcyBpbnRlbnRpb25hbGx5Lgordm9pZCBBZEhvY1Rlc3QoKSB7CisgIHByaW50ZigiVGhlIG5vbi10ZXN0IHBhcnQgb2YgdGhlIGNvZGUgaXMgZXhwZWN0ZWQgdG8gaGF2ZSAyIGZhaWx1cmVzLlxuXG4iKTsKKyAgRVhQRUNUX1RSVUUoZmFsc2UpOworICBFWFBFQ1RfRVEoMiwgMyk7Cit9CisKKy8vIFJ1bnMgYWxsIFRFU1RzLCBhbGwgVEVTVF9GcywgYW5kIHRoZSBhZCBob2MgdGVzdC4KK2ludCBSdW5BbGxUZXN0cygpIHsKKyAgQWRIb2NUZXN0KCk7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CisKKy8vIFRlc3RzIG5vbi1mYXRhbCBmYWlsdXJlcyBpbiB0aGUgZml4dHVyZSBjb25zdHJ1Y3Rvci4KK2NsYXNzIE5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIE5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICBwcmludGYoIihleHBlY3RpbmcgNSBmYWlsdXJlcylcbiIpOworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuIjsKKyAgfQorCisgIH5Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNSwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIsIGluIFNldFVwKCkuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM0LCBpbiBUZWFyRG93bi4iOworICB9Cit9OworCitURVNUX0YoTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LCBGYWlsdXJlSW5Db25zdHJ1Y3RvcikgeworICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBib2R5LiI7Cit9CisKKy8vIFRlc3RzIGZhdGFsIGZhaWx1cmVzIGluIHRoZSBmaXh0dXJlIGNvbnN0cnVjdG9yLgorY2xhc3MgRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0KCkgeworICAgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgICAgSW5pdCgpOworICB9CisKKyAgfkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIFNldFVwKCkuICAiCisgICAgICAgICAgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyB0aGUgdGVzdCBmaXh0dXJlIGMndG9yICIKKyAgICAgICAgICAgICAgICAgIDw8ICJoYWQgYSBmYXRhbCBmYWlsdXJlLiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIFRlYXJEb3duKCkuICAiCisgICAgICAgICAgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyB0aGUgdGVzdCBmaXh0dXJlIGMndG9yICIKKyAgICAgICAgICAgICAgICAgIDw8ICJoYWQgYSBmYXRhbCBmYWlsdXJlLiI7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgSW5pdCgpIHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuIjsKKyAgfQorfTsKKworVEVTVF9GKEZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCwgRmFpbHVyZUluQ29uc3RydWN0b3IpIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIHRoZSB0ZXN0IGJvZHkuICAiCisgICAgICAgICAgICAgICAgPDwgIldlIHNob3VsZCBuZXZlciBnZXQgaGVyZSwgYXMgdGhlIHRlc3QgZml4dHVyZSBjJ3RvciAiCisgICAgICAgICAgICAgICAgPDwgImhhZCBhIGZhdGFsIGZhaWx1cmUuIjsKK30KKworLy8gVGVzdHMgbm9uLWZhdGFsIGZhaWx1cmVzIGluIFNldFVwKCkuCitjbGFzcyBOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfk5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0KCkgeworICAgIERlaW5pdCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiKGV4cGVjdGluZyA0IGZhaWx1cmVzKVxuIik7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gVGVhckRvd24oKS4iOworICB9CisgcHJpdmF0ZToKKyAgdm9pZCBEZWluaXQoKSB7CisgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM0LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KK307CisKK1RFU1RfRihOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdCwgRmFpbHVyZUluU2V0VXApIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmdW5jdGlvbi4iOworfQorCisvLyBUZXN0cyBmYXRhbCBmYWlsdXJlcyBpbiBTZXRVcCgpLgorY2xhc3MgRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5GYXRhbEZhaWx1cmVJblNldFVwVGVzdCgpIHsKKyAgICBEZWluaXQoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcmludGYoIihleHBlY3RpbmcgMyBmYWlsdXJlcylcbiIpOworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gVGVhckRvd24oKS4iOworICB9CisgcHJpdmF0ZToKKyAgdm9pZCBEZWluaXQoKSB7CisgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7CisgIH0KK307CisKK1RFU1RfRihGYXRhbEZhaWx1cmVJblNldFVwVGVzdCwgRmFpbHVyZUluU2V0VXApIHsKKyAgRkFJTCgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gdGhlIHRlc3QgZnVuY3Rpb24uICAiCisgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyBTZXRVcCgpIGZhaWxlZC4iOworfQorCitURVNUKEFkZEZhaWx1cmVBdFRlc3QsIE1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyKSB7CisgIEFERF9GQUlMVVJFX0FUKCJmb28uY2MiLCA0MikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgaW4gZm9vLmNjIjsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gQSB1bmFyeSBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCit2b2lkIERpZUlmKGJvb2wgc2hvdWxkX2RpZSkgeworICBHVEVTVF9DSEVDS18oIXNob3VsZF9kaWUpIDw8ICIgLSBkZWF0aCBpbnNpZGUgRGllSWYoKS4iOworfQorCisvLyBUZXN0cyBydW5uaW5nIGRlYXRoIHRlc3RzIGluIGEgbXVsdGktdGhyZWFkZWQgY29udGV4dC4KKworLy8gVXNlZCBmb3IgY29vcmRpbmF0aW9uIGJldHdlZW4gdGhlIG1haW4gYW5kIHRoZSBzcGF3biB0aHJlYWQuCitzdHJ1Y3QgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zIHsKKyAgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zKCkge30KKworICBOb3RpZmljYXRpb24gc3Bhd25fdGhyZWFkX3N0YXJ0ZWQ7CisgIE5vdGlmaWNhdGlvbiBzcGF3bl90aHJlYWRfb2tfdG9fdGVybWluYXRlOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMpOworfTsKKworLy8gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSB0aHJlYWQgc3Bhd24gYnkgdGhlCisvLyBNdWx0aXBsZVRocmVhZHMgdGVzdCAoYmVsb3cpLgorc3RhdGljIHZvaWQgVGhyZWFkUm91dGluZShTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqIG5vdGlmaWNhdGlvbnMpIHsKKyAgLy8gU2lnbmFscyB0aGUgbWFpbiB0aHJlYWQgdGhhdCB0aGlzIHRocmVhZCBoYXMgc3RhcnRlZC4KKyAgbm90aWZpY2F0aW9ucy0+c3Bhd25fdGhyZWFkX3N0YXJ0ZWQuTm90aWZ5KCk7CisKKyAgLy8gV2FpdHMgZm9yIHBlcm1pc3Npb24gdG8gZmluaXNoIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICBub3RpZmljYXRpb25zLT5zcGF3bl90aHJlYWRfb2tfdG9fdGVybWluYXRlLldhaXRGb3JOb3RpZmljYXRpb24oKTsKK30KKworLy8gVGhpcyBpcyBhIGRlYXRoLXRlc3QgdGVzdCwgYnV0IGl0J3Mgbm90IG5hbWVkIHdpdGggYSBEZWF0aFRlc3QKKy8vIHN1ZmZpeC4gIEl0IHN0YXJ0cyB0aHJlYWRzIHdoaWNoIG1pZ2h0IGludGVyZmVyZSB3aXRoIGxhdGVyCisvLyBkZWF0aCB0ZXN0cywgc28gaXQgbXVzdCBydW4gYWZ0ZXIgYWxsIG90aGVyIGRlYXRoIHRlc3RzLgorY2xhc3MgRGVhdGhUZXN0QW5kTXVsdGlUaHJlYWRzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFN0YXJ0cyBhIHRocmVhZCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlZ2luLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgdGhyZWFkXy5yZXNldChuZXcgVGhyZWFkV2l0aFBhcmFtPFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyo+KAorICAgICAgICAmVGhyZWFkUm91dGluZSwgJm5vdGlmaWNhdGlvbnNfLCBOVUxMKSk7CisgICAgbm90aWZpY2F0aW9uc18uc3Bhd25fdGhyZWFkX3N0YXJ0ZWQuV2FpdEZvck5vdGlmaWNhdGlvbigpOworICB9CisgIC8vIFRlbGxzIHRoZSB0aHJlYWQgdG8gZmluaXNoLCBhbmQgcmVhcHMgaXQuCisgIC8vIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgdGhyZWFkIGxpYnJhcnkgaW4gdXNlLAorICAvLyBhIG1hbmFnZXIgdGhyZWFkIG1pZ2h0IHN0aWxsIGJlIGxlZnQgcnVubmluZyB0aGF0IHdpbGwgaW50ZXJmZXJlCisgIC8vIHdpdGggbGF0ZXIgZGVhdGggdGVzdHMuICBUaGlzIGlzIHVuZm9ydHVuYXRlLCBidXQgdGhpcyBjbGFzcworICAvLyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIGFzIGJlc3QgaXQgY2FuLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgbm90aWZpY2F0aW9uc18uc3Bhd25fdGhyZWFkX29rX3RvX3Rlcm1pbmF0ZS5Ob3RpZnkoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3Bhd25UaHJlYWROb3RpZmljYXRpb25zIG5vdGlmaWNhdGlvbnNfOworICBzY29wZWRfcHRyPFRocmVhZFdpdGhQYXJhbTxTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqPiA+IHRocmVhZF87Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gVGhlIE1peGVkVXBUZXN0Q2FzZVRlc3QgdGVzdCBjYXNlIHZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3Qgd2lsbCBmYWlsIGEKKy8vIHRlc3QgaWYgaXQgdXNlcyBhIGRpZmZlcmVudCBmaXh0dXJlIGNsYXNzIHRoYW4gd2hhdCBvdGhlciB0ZXN0cyBpbgorLy8gdGhlIHNhbWUgdGVzdCBjYXNlIHVzZS4gIEl0IGRlbGliZXJhdGVseSBjb250YWlucyB0d28gZml4dHVyZQorLy8gY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRlZmluZWQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCisKKy8vIFRoZSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCB0ZXN0IGNhc2UgdmVyaWZpZXMgdGhhdAorLy8gd2hlbiB0aGUgdXNlciBkZWZpbmVzIHR3byB0ZXN0cyB3aXRoIHRoZSBzYW1lIHRlc3QgY2FzZSBuYW1lIEFORAorLy8gc2FtZSB0ZXN0IG5hbWUgKGJ1dCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyksIHRoZSBzZWNvbmQgdGVzdCB3aWxsCisvLyBmYWlsLgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VUZXN0LCBGaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCwKKyAgICAgICBUaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbCkge30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworCituYW1lc3BhY2UgYmFyIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUKKy8vIGdvbGRlbiBmaWxlIHRvIGNoZWNrIHRoYXQgR29vZ2xlIFRlc3QgZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsVG9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUX0YoTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QsCisgICAgICAgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBiYXIKKworLy8gVGhlIGZvbGxvd2luZyB0d28gdGVzdCBjYXNlcyB2ZXJpZnkgdGhhdCBHb29nbGUgVGVzdCBjYXRjaGVzIHRoZSB1c2VyCisvLyBlcnJvciBvZiBtaXhpbmcgVEVTVCBhbmQgVEVTVF9GIGluIHRoZSBzYW1lIHRlc3QgY2FzZS4gIFRoZSBmaXJzdAorLy8gdGVzdCBjYXNlIGNoZWNrcyB0aGUgc2NlbmFyaW8gd2hlcmUgVEVTVF9GIGFwcGVhcnMgYmVmb3JlIFRFU1QsIGFuZAorLy8gdGhlIHNlY29uZCBvbmUgY2hlY2tzIHdoZXJlIFRFU1QgYXBwZWFycyBiZWZvcmUgVEVTVF9GLgorCitjbGFzcyBURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUX0YpIHt9CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUKFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwpIHt9CisKK2NsYXNzIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1QoVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUKSB7fQorCisvLyBFeHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUgZ29sZGVuIGZpbGUgdG8gY2hlY2sgdGhhdCBHb29nbGUgVGVzdAorLy8gZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbCkgeworfQorCisvLyBVc2VkIGZvciB0ZXN0aW5nIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgYW5kIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkuCitpbnQgZ2xvYmFsX2ludGVnZXIgPSAwOworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBnbG9iYWwgdmFyaWFibGVzLgorVEVTVChFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMpIHsKKyAgZ2xvYmFsX2ludGVnZXIgPSAwOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKDEsIGdsb2JhbF9pbnRlZ2VyKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCB2YXJpYWJsZXMKKy8vIChzdGF0aWMgb3Igbm90KS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxWYXJpYWJsZXMpIHsKKyAgaW50IG0gPSAwOworICBzdGF0aWMgaW50IG47CisgIG4gPSAxOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKG0sIG4pIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBzdWNjZWVkcyB3aGVuIHRoZXJlIGlzIGV4YWN0bHkKKy8vIG9uZSBub24tZmF0YWwgZmFpbHVyZSBhbmQgbm8gZmF0YWwgZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBpcyBubworLy8gbm9uLWZhdGFsIGZhaWx1cmUuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBub24tZmF0YWwgZmFpbHVyZXMuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSAxLiI7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMi4iOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBmYXRhbAorLy8gZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBjYW4gcmVmZXJlbmNlIGdsb2JhbCB2YXJpYWJsZXMuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcykgeworICBnbG9iYWxfaW50ZWdlciA9IDA7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBBU1NFUlRfRVEoMSwgZ2xvYmFsX2ludGVnZXIpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7CisgIH0sICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCBzdGF0aWMKKy8vIHZhcmlhYmxlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxTdGF0aWNWYXJpYWJsZXMpIHsKKyAgc3RhdGljIGludCBuOworICBuID0gMTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEFTU0VSVF9FUSgwLCBuKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIHN1Y2NlZWRzIHdoZW4gdGhlcmUgaXMgZXhhY3RseQorLy8gb25lIGZhdGFsIGZhaWx1cmUgYW5kIG5vIG5vbi1mYXRhbCBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBTdWNjZWVkc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG5vIGZhdGFsCisvLyBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgIH0sICIiKTsKK30KKworLy8gQSBoZWxwZXIgZm9yIGdlbmVyYXRpbmcgYSBmYXRhbCBmYWlsdXJlLgordm9pZCBGYXRhbEZhaWx1cmUoKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBmYXRhbCBmYWlsdXJlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEZhdGFsRmFpbHVyZSgpOworICAgIEZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBub24tZmF0YWwKKy8vIGZhaWx1cmUuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHRoZSBvdXRwdXQgb2YgdHlwZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0UoVHlwZWRUZXN0LCB0ZXN0aW5nOjpUeXBlczxpbnQ+KTsKKworVFlQRURfVEVTVChUeXBlZFRlc3QsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDAsIFR5cGVQYXJhbSgpKTsKK30KKworVFlQRURfVEVTVChUeXBlZFRlc3QsIEZhaWx1cmUpIHsKKyAgRVhQRUNUX0VRKDEsIFR5cGVQYXJhbSgpKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSI7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdGhlIG91dHB1dCBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdFAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQKTsKKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDBVLCBUeXBlUGFyYW0oKSk7Cit9CisKK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQLCBGYWlsdXJlKSB7CisgIEVYUEVDVF9FUSgxVSwgVHlwZVBhcmFtKCkpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UCwgU3VjY2VzcywgRmFpbHVyZSk7CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8dW5zaWduZWQgY2hhciwgdW5zaWduZWQgaW50PiBVbnNpZ25lZFR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoVW5zaWduZWQsIFR5cGVkVGVzdFAsIFVuc2lnbmVkVHlwZXMpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFdlIHJlbHkgb24gdGhlIGdvbGRlbiBmaWxlIHRvIHZlcmlmeSB0aGF0IHRlc3RzIHdob3NlIHRlc3QgY2FzZQorLy8gbmFtZSBlbmRzIHdpdGggRGVhdGhUZXN0IGFyZSBydW4gZmlyc3QuCisKK1RFU1QoQURlYXRoVGVzdCwgU2hvdWxkUnVuRmlyc3QpIHsKK30KKworIyBpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlZCB0ZXN0cyB3aG9zZSB0ZXN0CisvLyBjYXNlIG5hbWUgZW5kcyB3aXRoIERlYXRoVGVzdCBhcmUgcnVuIGZpcnN0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFUeXBlZERlYXRoVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8aW50LCBkb3VibGU+IE51bWVyaWNUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShBVHlwZWREZWF0aFRlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoQVR5cGVkRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgeworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisjIGlmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworCisvLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIHdob3NlIHRlc3QgY2FzZSBuYW1lIGVuZHMgd2l0aCBEZWF0aFRlc3QgYXJlIHJ1biBmaXJzdC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBBVHlwZVBhcmFtRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoQVR5cGVQYXJhbURlYXRoVGVzdCk7CisKK1RZUEVEX1RFU1RfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgeworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCk7CisKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBBVHlwZVBhcmFtRGVhdGhUZXN0LCBOdW1lcmljVHlwZXMpOworCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdHMgdmFyaW91cyBmYWlsdXJlIGNvbmRpdGlvbnMgb2YKKy8vIEVYUEVDVF97LE5PTn1GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9LgorY2xhc3MgRXhwZWN0RmFpbHVyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOiAgLy8gTXVzdCBiZSBwdWJsaWMgYW5kIG5vdCBwcm90ZWN0ZWQgZHVlIHRvIGEgYnVnIGluIGcrKyAzLjQuMi4KKyAgZW51bSBGYWlsdXJlTW9kZSB7CisgICAgRkFUQUxfRkFJTFVSRSwKKyAgICBOT05GQVRBTF9GQUlMVVJFCisgIH07CisgIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmUoRmFpbHVyZU1vZGUgZmFpbHVyZSkgeworICAgIGlmIChmYWlsdXJlID09IEZBVEFMX0ZBSUxVUkUpIHsKKyAgICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICAgIH0gZWxzZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICAgIH0KKyAgfQorfTsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmUpIHsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLCAiRXhwZWN0ZWQgbm9uLWZhdGFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmUpIHsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworICAvLyBXcm9uZyBtZXNzYWdlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksICJTb21lIG90aGVyIG5vbi1mYXRhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCitjbGFzcyBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0IDogcHVibGljIEV4cGVjdEZhaWx1cmVUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZhaWx1cmVNb2RlIGZhaWx1cmUpIHsKKyAgICBUaHJlYWRXaXRoUGFyYW08RmFpbHVyZU1vZGU+IHRocmVhZCgmQWRkRmFpbHVyZSwgZmFpbHVyZSwgTlVMTCk7CisgICAgdGhyZWFkLkpvaW4oKTsKKyAgfQorfTsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZSkgeworICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdE5vbkZhdGFsRmFpbHVyZSkgeworICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKK3R5cGVkZWYgRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgdGhlIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIG9ubHkgY2F0Y2hlcyBmYWlsdXJlcyBmcm9tCisvLyB0aGUgY3VycmVudCB0aHJlYWQgaWYgaXQgaXMgaW5zdGFudGlhdGVkIHdpdGggSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQuCitURVNUX0YoU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LCBJbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZCkgeworICBwcmludGYoIihleHBlY3RpbmcgMiBmYWlsdXJlcylcbiIpOworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKKyAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELAorICAgICAgICAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRkFUQUxfRkFJTFVSRSk7CisgICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoTk9ORkFUQUxfRkFJTFVSRSk7CisgIH0KKyAgLy8gVGhlIHR3byBmYWlsdXJlcyBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnRlcmNlcHRlZC4KKyAgRVhQRUNUX0VRKDAsIHJlc3VsdHMuc2l6ZSgpKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSBleHBlY3RlZC4iKTsKK30KKworVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworICAvLyBXcm9uZyBtZXNzYWdlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIG90aGVyIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisKKy8vIFR3byB0ZXN0IGVudmlyb25tZW50cyBmb3IgdGVzdGluZyB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKS4KKworY2xhc3MgRm9vRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLCAiRm9vRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsICJGb29FbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfQorfTsKKworY2xhc3MgQmFyRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLCAiQmFyRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgcHJpbnRmKCIlcyIsICJCYXJFbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICB9Cit9OworCitib29sIEdURVNUX0ZMQUcoaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzKSA9IGZhbHNlOworCisvLyBUaGUgbWFpbiBmdW5jdGlvbi4KKy8vCisvLyBUaGUgaWRlYSBpcyB0byB1c2UgR29vZ2xlIFRlc3QgdG8gcnVuIGFsbCB0aGUgdGVzdHMgd2UgaGF2ZSBkZWZpbmVkIChzb21lCisvLyBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsKSwgYW5kIHRoZW4gY29tcGFyZSB0aGUgdGVzdCByZXN1bHRzCisvLyB3aXRoIHRoZSAiZ29sZGVuIiBmaWxlLgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBmYWxzZTsKKworICAvLyBXZSBqdXN0IHJ1biB0aGUgdGVzdHMsIGtub3dpbmcgc29tZSBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsLgorICAvLyBXZSB3aWxsIHVzZSBhIHNlcGFyYXRlIFB5dGhvbiBzY3JpcHQgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mCisgIC8vIHRoaXMgcHJvZ3JhbSB3aXRoIHRoZSBnb2xkZW4gZmlsZS4KKworICAvLyBJdCdzIGhhcmQgdG8gdGVzdCBJbml0R29vZ2xlVGVzdCgpIGRpcmVjdGx5LCBhcyBpdCBoYXMgbWFueQorICAvLyBnbG9iYWwgc2lkZSBlZmZlY3RzLiAgVGhlIGZvbGxvd2luZyBsaW5lIHNlcnZlcyBhcyBhIHNhbml0eSB0ZXN0CisgIC8vIGZvciBpdC4KKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpZiAoYXJnYyA+PSAyICYmCisgICAgICAoc3RkOjpzdHJpbmcoYXJndlsxXSkgPT0KKyAgICAgICAiLS1ndGVzdF9pbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMiKSkKKyAgICBHVEVTVF9GTEFHKGludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cykgPSB0cnVlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaWYgKHRlc3Rpbmc6OmludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSAhPSAiIikgeworICAgIC8vIFNraXAgdGhlIHVzdWFsIG91dHB1dCBjYXB0dXJpbmcgaWYgd2UncmUgcnVubmluZyBhcyB0aGUgY2hpbGQKKyAgICAvLyBwcm9jZXNzIG9mIGFuIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdC4KKyMgaWYgR1RFU1RfT1NfV0lORE9XUworICAgIHBvc2l4OjpGUmVvcGVuKCJudWw6IiwgInciLCBzdGRvdXQpOworIyBlbHNlCisgICAgcG9zaXg6OkZSZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3Rkb3V0KTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgaWYgKEdURVNUX0ZMQUcoaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzKSkKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworCisgIC8vIFJlZ2lzdGVycyB0d28gZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzLgorICAvLyBUaGUgZ29sZGVuIGZpbGUgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBzZXQgdXAgaW4gdGhlIG9yZGVyIHRoZXkKKyAgLy8gYXJlIHJlZ2lzdGVyZWQsIGFuZCB0b3JuIGRvd24gaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEJhckVudmlyb25tZW50KTsKKworICByZXR1cm4gUnVuQWxsVGVzdHMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI2ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0CkBAIC0wLDAgKzEsNzI1IEBACitUaGUgbm9uLXRlc3QgcGFydCBvZiB0aGUgY29kZSBpcyBleHBlY3RlZCB0byBoYXZlIDIgZmFpbHVyZXMuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogZmFsc2UKKyAgQWN0dWFsOiBmYWxzZQorRXhwZWN0ZWQ6IHRydWUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogMworRXhwZWN0ZWQ6IDIKKxtbMDszMm1bPT09PT09PT09PV0gG1ttUnVubmluZyA2MyB0ZXN0cyBmcm9tIDI4IHRlc3QgY2FzZXMuCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbUdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK0Zvb0Vudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KK0JhckVudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQURlYXRoVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21BRGVhdGhUZXN0LlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFEZWF0aFRlc3QuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQVR5cGVkRGVhdGhUZXN0LzAsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMybVsgUlVOICAgICAgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBVHlwZWREZWF0aFRlc3QvMSwgd2hlcmUgVHlwZVBhcmFtID0gZG91YmxlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMCwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21NeS9BVHlwZVBhcmFtRGVhdGhUZXN0LzAuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLCB3aGVyZSBUeXBlUGFyYW0gPSBkb3VibGUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMS5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gUGFzc2luZ1Rlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QxCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MQorG1swOzMybVsgUlVOICAgICAgXSAbW21QYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE5vbmZhdGFsRmFpbHVyZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogYWN0dWFsCisgIEFjdHVhbDogImFjdHVhbCBcInN0cmluZ1wiIgorRXhwZWN0ZWQ6IGtHb2xkZW5TdHJpbmcKK1doaWNoIGlzOiAiXCJMaW5lIgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBhY3R1YWwKKyAgQWN0dWFsOiAiYWN0dWFsIFwic3RyaW5nXCIiCitFeHBlY3RlZDogZ29sZGVuCitXaGljaCBpczogIlwiTGluZSIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogeAorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lCisoZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IHgKKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZQorG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgb24gZmFsc2UpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IGZhbHNlCisgIEFjdHVhbDogZmFsc2UKK0V4cGVjdGVkOiB0cnVlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIExvZ2dpbmdUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUxvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMgb24gKDMpID49IChhW2ldKSkKK2kgPT0gMAoraSA9PSAxCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6ICgzKSA+PSAoYVtpXSksIGFjdHVhbDogMyB2cyA5CitpID09IDIKK2kgPT0gMworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgNgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Mb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucworG1swOzMybVstLS0tLS0tLS0tXSAbW202IHRlc3RzIGZyb20gU0NPUEVEX1RSQUNFVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0Lk9iZXlzU2NvcGVzCisoZXhwZWN0ZWQgdG8gZmFpbCkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZG4ndCBoYXZlIGEgdHJhY2UuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgaGF2ZSBhIHRyYWNlLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRXhwZWN0ZWQgdHJhY2UKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZG4ndCBoYXZlIGEgdHJhY2UuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuT2JleXNTY29wZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luTG9vcAorKGV4cGVjdGVkIHRvIGZhaWwpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IG4KKyAgQWN0dWFsOiAxCitFeHBlY3RlZDogMgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogaSA9IDEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogbgorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBpID0gMgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5Mb29wCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJblN1YnJvdXRpbmUKKyhleHBlY3RlZCB0byBmYWlsKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBuCisgIEFjdHVhbDogMQorRXhwZWN0ZWQ6IDIKK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IG4gPSAxCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IG4KKyAgQWN0dWFsOiAyCitFeHBlY3RlZDogMQorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogbiA9IDIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luU3Vicm91dGluZQorG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlTmVzdGVkCisoZXhwZWN0ZWQgdG8gZmFpbCkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogbgorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBuID0gMgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlTmVzdGVkCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVSZXBlYXRlZAorKGV4cGVjdGVkIHRvIGZhaWwpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSBhbmQgQi4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBBCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBLCBCLCBhbmQgQy4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBCCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSwgQiwgYW5kIEQuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBECitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEEKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZVJlcGVhdGVkCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NDb25jdXJyZW50bHkKKyhleHBlY3RpbmcgNiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzEgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEIgYWxpdmUpLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogVHJhY2UgQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMiAoaW4gdGhyZWFkIEEsIHRyYWNlIEEgJiBCIGJvdGggYWxpdmUpLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogVHJhY2UgQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMyAoaW4gdGhyZWFkIEIsIHRyYWNlIEEgJiBCIGJvdGggYWxpdmUpLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogVHJhY2UgQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNCAoaW4gdGhyZWFkIEIsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM1IChpbiB0aHJlYWQgQSwgb25seSB0cmFjZSBBIGFsaXZlKS4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzYgKGluIHRocmVhZCBBLCBubyB0cmFjZSBhbGl2ZSkuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NDb25jdXJyZW50bHkKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorKGV4cGVjdGluZyA1IGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gdGhlIHRlc3QgZml4dHVyZSBjJ3Rvci4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIsIGluIFNldFVwKCkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBib2R5LgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNCwgaW4gVGVhckRvd24uCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM1LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorKGV4cGVjdGluZyAyIGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gdGhlIHRlc3QgZml4dHVyZSBjJ3Rvci4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBOb25GYXRhbEZhaWx1cmVJblNldFVwVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21Ob25GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorKGV4cGVjdGluZyA0IGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzIsIGluIHRoZSB0ZXN0IGZ1bmN0aW9uLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gVGVhckRvd24oKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzQsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIEZhdGFsRmFpbHVyZUluU2V0VXBUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisoZXhwZWN0aW5nIDMgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiBTZXRVcCgpLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gVGVhckRvd24oKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzMsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIEFkZEZhaWx1cmVBdFRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttQWRkRmFpbHVyZUF0VGVzdC5NZXNzYWdlQ29udGFpbnNTcGVjaWZpZWRGaWxlQW5kTGluZU51bWJlcgorZm9vLmNjOjQyOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgaW4gZm9vLmNjCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUFkZEZhaWx1cmVBdFRlc3QuTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttNCB0ZXN0cyBmcm9tIE1peGVkVXBUZXN0Q2FzZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5GaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbworG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuU2Vjb25kVGVzdEZyb21OYW1lc3BhY2VGb28KKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbAorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRmFpbGVkCitBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQorY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgTWl4ZWRVcFRlc3RDYXNlVGVzdCwKK3lvdSBkZWZpbmVkIHRlc3QgRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbyBhbmQgdGVzdCBUaGlzU2hvdWxkRmFpbAordXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZgordGhlIHR3byBjbGFzc2VzIGFyZSBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIG9yIHRyYW5zbGF0aW9uCit1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lCitvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWwKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbFRvbworZ3Rlc3QuY2M6IzogRmFpbHVyZQorRmFpbGVkCitBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQorY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgTWl4ZWRVcFRlc3RDYXNlVGVzdCwKK3lvdSBkZWZpbmVkIHRlc3QgRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbyBhbmQgdGVzdCBUaGlzU2hvdWxkRmFpbFRvbwordXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZgordGhlIHR3byBjbGFzc2VzIGFyZSBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIG9yIHRyYW5zbGF0aW9uCit1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lCitvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWxUb28KKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIE1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCitndGVzdC5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0FsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCitjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCwKK3lvdSBkZWZpbmVkIHRlc3QgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwgYW5kIHRlc3QgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwKK3VzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWYKK3RoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvbgordW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZQorb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUX0YKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRgorG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKK2NsYXNzLCBzbyBtaXhpbmcgVEVTVF9GIGFuZCBURVNUIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBpcworaWxsZWdhbC4gIEluIHRlc3QgY2FzZSBURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UsCit0ZXN0IERlZmluZWRVc2luZ1RFU1RfRiBpcyBkZWZpbmVkIHVzaW5nIFRFU1RfRiBidXQKK3Rlc3QgRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwgaXMgZGVmaW5lZCB1c2luZyBURVNULiAgWW91IHByb2JhYmx5Cit3YW50IHRvIGNoYW5nZSB0aGUgVEVTVCB0byBURVNUX0Ygb3IgbW92ZSBpdCB0byBhbm90aGVyIHRlc3QKK2Nhc2UuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUQW5kU2hvdWxkRmFpbAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUX0ZBbmRTaG91bGRGYWlsCitndGVzdC5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0FsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCitjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXMKK2lsbGVnYWwuICBJbiB0ZXN0IGNhc2UgVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLAordGVzdCBEZWZpbmVkVXNpbmdURVNUX0ZBbmRTaG91bGRGYWlsIGlzIGRlZmluZWQgdXNpbmcgVEVTVF9GIGJ1dAordGVzdCBEZWZpbmVkVXNpbmdURVNUIGlzIGRlZmluZWQgdXNpbmcgVEVTVC4gIFlvdSBwcm9iYWJseQord2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0CitjYXNlLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbAorG1swOzMybVstLS0tLS0tLS0tXSAbW204IHRlc3RzIGZyb20gRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsVmFyaWFibGVzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlTG9jYWxWYXJpYWJsZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5TdWNjZWVkc1doZW5UaGVyZUlzT25lTm9uZmF0YWxGYWlsdXJlCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9Ob25mYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b05vbmZhdGFsRmFpbHVyZXMKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAyIGZhaWx1cmVzCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlIDEuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMi4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cworG1swOzMybVstLS0tLS0tLS0tXSAbW204IHRlc3RzIGZyb20gRXhwZWN0RmF0YWxGYWlsdXJlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsU3RhdGljVmFyaWFibGVzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlTG9jYWxTdGF0aWNWYXJpYWJsZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5TdWNjZWVkc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb0ZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb0ZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvRmF0YWxGYWlsdXJlcworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMiBmYWlsdXJlcworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lTm9uZmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFR5cGVkVGVzdC8wLCB3aGVyZSBUeXBlUGFyYW0gPSBpbnQKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVHlwZWRUZXN0LzAuU3VjY2VzcworG1swOzMybVsgICAgICAgT0sgXSAbW21UeXBlZFRlc3QvMC5TdWNjZXNzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVR5cGVkVGVzdC8wLkZhaWx1cmUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogVHlwZVBhcmFtKCkKKyAgQWN0dWFsOiAwCitFeHBlY3RlZDogMQorRXhwZWN0ZWQgZmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21UeXBlZFRlc3QvMC5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSBpbnQKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFVuc2lnbmVkL1R5cGVkVGVzdFAvMCwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgY2hhcgorG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuU3VjY2VzcworG1swOzMybVsgICAgICAgT0sgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuU3VjY2VzcworG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuRmFpbHVyZQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBUeXBlUGFyYW0oKQorICBBY3R1YWw6ICdcMCcKK0V4cGVjdGVkOiAxVQorV2hpY2ggaXM6IDEKK0V4cGVjdGVkIGZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLkZhaWx1cmUsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGNoYXIKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFVuc2lnbmVkL1R5cGVkVGVzdFAvMSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgaW50CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5TdWNjZXNzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5TdWNjZXNzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5GYWlsdXJlCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IFR5cGVQYXJhbSgpCisgIEFjdHVhbDogMAorRXhwZWN0ZWQ6IDFVCitXaGljaCBpczogMQorRXhwZWN0ZWQgZmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgaW50CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTQgdGVzdHMgZnJvbSBFeHBlY3RGYWlsdXJlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogU3VjY2VzczoKK1N1Y2NlZWRlZAorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlIGNvbnRhaW5pbmcgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSBleHBlY3RlZC4iCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFN1Y2Nlc3M6CitTdWNjZWVkZWQKKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZSBjb250YWluaW5nICJTb21lIG90aGVyIG5vbi1mYXRhbCBmYWlsdXJlLiIKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFN1Y2Nlc3M6CitTdWNjZWVkZWQKKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZSBjb250YWluaW5nICJTb21lIG90aGVyIGZhdGFsIGZhaWx1cmUgZXhwZWN0ZWQuIgorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBTdWNjZXNzOgorU3VjY2VlZGVkCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUgY29udGFpbmluZyAiU29tZSBvdGhlciBub24tZmF0YWwgZmFpbHVyZS4iCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgMiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QuSW50ZXJjZXB0T25seUN1cnJlbnRUaHJlYWQKKyhleHBlY3RpbmcgMiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LkludGVyY2VwdE9ubHlDdXJyZW50VGhyZWFkCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIFByaW50aW5nRmFpbGluZ1BhcmFtcy9GYWlsaW5nUGFyYW1UZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVByaW50aW5nRmFpbGluZ1BhcmFtcy9GYWlsaW5nUGFyYW1UZXN0LkZhaWxzLzAKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogR2V0UGFyYW0oKQorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVByaW50aW5nRmFpbGluZ1BhcmFtcy9GYWlsaW5nUGFyYW1UZXN0LkZhaWxzLzAsIHdoZXJlIEdldFBhcmFtKCkgPSAyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbUdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgorQmFyRW52aXJvbm1lbnQ6OlRlYXJEb3duKCkgY2FsbGVkLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCitGb29FbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorG1swOzMybVs9PT09PT09PT09XSAbW202MyB0ZXN0cyBmcm9tIDI4IHRlc3QgY2FzZXMgcmFuLgorG1swOzMybVsgIFBBU1NFRCAgXSAbW20yMSB0ZXN0cy4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttNDIgdGVzdHMsIGxpc3RlZCBiZWxvdzoKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTG9nZ2luZ1Rlc3QuSW50ZXJsZWF2aW5nTG9nZ2luZ0FuZEFzc2VydGlvbnMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5PYmV5c1Njb3BlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5Mb29wCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJblN1YnJvdXRpbmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZU5lc3RlZAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlUmVwZWF0ZWQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0NvbmN1cnJlbnRseQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUFkZEZhaWx1cmVBdFRlc3QuTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsVG9vCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUQW5kU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vRmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVHlwZWRUZXN0LzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBjaGFyCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBpbnQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdC5JbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21QcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdC5GYWlscy8wLCB3aGVyZSBHZXRQYXJhbSgpID0gMgorCis0MiBGQUlMRUQgVEVTVFMKKxtbMDszM20gIFlPVSBIQVZFIDEgRElTQUJMRUQgVEVTVAorCisbW21Ob3RlOiBHb29nbGUgVGVzdCBmaWx0ZXIgPSBGYXRhbEZhaWx1cmVUZXN0Lio6TG9nZ2luZ1Rlc3QuKgorWz09PT09PT09PT1dIFJ1bm5pbmcgNCB0ZXN0cyBmcm9tIDIgdGVzdCBjYXNlcy4KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuCitbLS0tLS0tLS0tLV0gMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QKK1sgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiB4CisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZSAoPyBtcykKK1sgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiB4CisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZSAoPyBtcykKK1sgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgb24gZmFsc2UpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IGZhbHNlCisgIEFjdHVhbDogZmFsc2UKK0V4cGVjdGVkOiB0cnVlCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUgKD8gbXMpCitbLS0tLS0tLS0tLV0gMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QgKD8gbXMgdG90YWwpCisKK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBMb2dnaW5nVGVzdAorWyBSVU4gICAgICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMgb24gKDMpID49IChhW2ldKSkKK2kgPT0gMAoraSA9PSAxCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6ICgzKSA+PSAoYVtpXSksIGFjdHVhbDogMyB2cyA5CitpID09IDIKK2kgPT0gMworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgNgorWyAgRkFJTEVEICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zICg/IG1zKQorWy0tLS0tLS0tLS1dIDEgdGVzdCBmcm9tIExvZ2dpbmdUZXN0ICg/IG1zIHRvdGFsKQorCitbLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duCitbPT09PT09PT09PV0gNCB0ZXN0cyBmcm9tIDIgdGVzdCBjYXNlcyByYW4uICg/IG1zIHRvdGFsKQorWyAgUEFTU0VEICBdIDAgdGVzdHMuCitbICBGQUlMRUQgIF0gNCB0ZXN0cywgbGlzdGVkIGJlbG93OgorWyAgRkFJTEVEICBdIEZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorWyAgRkFJTEVEICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisKKyA0IEZBSUxFRCBURVNUUworICBZT1UgSEFWRSAxIERJU0FCTEVEIFRFU1QKKworTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gKkRJU0FCTEVEXyoKK1s9PT09PT09PT09XSBSdW5uaW5nIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlLgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QKK1sgUlVOICAgICAgXSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QuRElTQUJMRURfQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnU3VwcHJlc3Nlc1dhcm5pbmcKK1sgICAgICAgT0sgXSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QuRElTQUJMRURfQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnU3VwcHJlc3Nlc1dhcm5pbmcKK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK1s9PT09PT09PT09XSAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZSByYW4uCitbICBQQVNTRUQgIF0gMSB0ZXN0LgorTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gUGFzc2luZ1Rlc3QuKgorTm90ZTogVGhpcyBpcyB0ZXN0IHNoYXJkIDIgb2YgMi4KK1s9PT09PT09PT09XSBSdW5uaW5nIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlLgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBQYXNzaW5nVGVzdAorWyBSVU4gICAgICBdIFBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MgorWyAgICAgICBPSyBdIFBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgorWz09PT09PT09PT1dIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlIHJhbi4KK1sgIFBBU1NFRCAgXSAxIHRlc3QuCisKKyAgWU9VIEhBVkUgMSBESVNBQkxFRCBURVNUCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGVmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMjQyNyBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gMTAvMzEvMjAxMSBieSBjb21tYW5kCisvLyAnZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSA1Jy4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgZ3Rlc3RfcHJlZF9pbXBsLmgKKy8vCisvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgc2NyaXB0IGFuZCBxdWl0ZSBsb25nLiAgSWYgeW91IGludGVuZCB0bworLy8gbGVhcm4gaG93IEdvb2dsZSBUZXN0IHdvcmtzIGJ5IHJlYWRpbmcgaXRzIHVuaXQgdGVzdHMsIHJlYWQKKy8vIGd0ZXN0X3VuaXR0ZXN0LmNjIGluc3RlYWQuCisvLworLy8gVGhpcyBpcyBpbnRlbmRlZCBhcyBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhlIEdvb2dsZSBUZXN0IHByZWRpY2F0ZQorLy8gYXNzZXJ0aW9ucy4gIFdlIGNvbXBpbGUgaXQgYXMgcGFydCBvZiB0aGUgZ3Rlc3RfdW5pdHRlc3QgdGFyZ2V0CisvLyBvbmx5IHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIHRpZHkgYW5kIGNvbXBhY3QsIGFzIGl0IGlzIHF1aXRlCisvLyBpbnZvbHZlZCB0byBzZXQgdXAgdGhlIHN0YWdlIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IHVzaW5nIEdvb2dsZQorLy8gVGVzdCBpdHNlbGYuCisvLworLy8gQ3VycmVudGx5LCBndGVzdF91bml0dGVzdCB0YWtlcyB+MTEgc2Vjb25kcyB0byBydW4gaW4gdGhlIHRlc3RpbmcKKy8vIGRhZW1vbi4gIEluIHRoZSBmdXR1cmUsIGlmIGl0IGdyb3dzIHRvbyBsYXJnZSBhbmQgbmVlZHMgbXVjaCBtb3JlCisvLyB0aW1lIHRvIGZpbmlzaCwgd2Ugc2hvdWxkIGNvbnNpZGVyIHNlcGFyYXRpbmcgdGhpcyBmaWxlIGludG8gYQorLy8gc3RhbmQtYWxvbmUgcmVncmVzc2lvbiB0ZXN0LgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBBIHVzZXItZGVmaW5lZCBkYXRhIHR5cGUuCitzdHJ1Y3QgQm9vbCB7CisgIGV4cGxpY2l0IEJvb2woaW50IHZhbCkgOiB2YWx1ZSh2YWwgIT0gMCkge30KKworICBib29sIG9wZXJhdG9yPihpbnQgbikgY29uc3QgeyByZXR1cm4gdmFsdWUgPiBCb29sKG4pLnZhbHVlOyB9CisKKyAgQm9vbCBvcGVyYXRvcisoY29uc3QgQm9vbCYgcmhzKSBjb25zdCB7IHJldHVybiBCb29sKHZhbHVlICsgcmhzLnZhbHVlKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCb29sJiByaHMpIGNvbnN0IHsgcmV0dXJuIHZhbHVlID09IHJocy52YWx1ZTsgfQorCisgIGJvb2wgdmFsdWU7Cit9OworCisvLyBFbmFibGVzIEJvb2wgdG8gYmUgdXNlZCBpbiBhc3NlcnRpb25zLgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEJvb2wmIHgpIHsKKyAgcmV0dXJuIG9zIDw8ICh4LnZhbHVlID8gInRydWUiIDogImZhbHNlIik7Cit9CisKKy8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgdW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorYm9vbCBQcmVkRnVuY3Rpb24xKFQxIHYxKSB7CisgIHJldHVybiB2MSA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbjFJbnQoaW50IHYxKSB7CisgIHJldHVybiB2MSA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbjFCb29sKEJvb2wgdjEpIHsKKyAgcmV0dXJuIHYxID4gMDsKK30KKworLy8gQSB1bmFyeSBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvcjEgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEpIHsKKyAgICByZXR1cm4gdjEgPiAwOworICB9Cit9OworCisvLyBBIHVuYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Cit0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uMShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSkgeworICBpZiAoUHJlZEZ1bmN0aW9uMSh2MSkpCisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBlMQorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCB2MSA8PCAiLiI7Cit9CisKKy8vIEEgdW5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yMSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KKyAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSkgY29uc3QgeworICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb24xKGUxLCB2MSk7CisgIH0KK307CisKKy8vIFRlc3RzIGZvciB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQxLgorCitjbGFzcyBQcmVkaWNhdGUxVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBleHBlY3RlZF90b19maW5pc2hfID0gdHJ1ZTsKKyAgICBmaW5pc2hlZF8gPSBmYWxzZTsKKyAgICBuMV8gPSAwOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIFZlcmlmaWVzIHRoYXQgZWFjaCBvZiB0aGUgcHJlZGljYXRlJ3MgYXJndW1lbnRzIHdhcyBldmFsdWF0ZWQKKyAgICAvLyBleGFjdGx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDEsIG4xXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAyICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgorICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKKyAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKKyAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKKyAgICB9CisgIH0KKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOworCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87CisKKyAgc3RhdGljIGludCBuMV87Cit9OworCitib29sIFByZWRpY2F0ZTFUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOworYm9vbCBQcmVkaWNhdGUxVGVzdDo6ZmluaXNoZWRfOworaW50IFByZWRpY2F0ZTFUZXN0OjpuMV87CisKK3R5cGVkZWYgUHJlZGljYXRlMVRlc3QgRVhQRUNUX1BSRURfRk9STUFUMVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTFUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUxVGVzdCBFWFBFQ1RfUFJFRDFUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUxVGVzdCBBU1NFUlRfUFJFRDFUZXN0OworCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3Rpb24xSW50LAorICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdGlvbjFCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdGlvbjFJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3Rpb24xQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdGlvbjFJbnQsCisgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0aW9uMUJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3Rpb24xSW50LAorICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3Rpb24xQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyBiaW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgYmluYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Citib29sIFByZWRGdW5jdGlvbjIoVDEgdjEsIFQyIHYyKSB7CisgIHJldHVybiB2MSArIHYyID4gMDsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgorLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCisvLyBmdW5jdGlvbi4KK2Jvb2wgUHJlZEZ1bmN0aW9uMkludChpbnQgdjEsIGludCB2MikgeworICByZXR1cm4gdjEgKyB2MiA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbjJCb29sKEJvb2wgdjEsIEJvb2wgdjIpIHsKKyAgcmV0dXJuIHYxICsgdjIgPiAwOworfQorCisvLyBBIGJpbmFyeSBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvcjIgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSB7CisgICAgcmV0dXJuIHYxICsgdjIgPiAwOworICB9Cit9OworCisvLyBBIGJpbmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24yKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjIodjEsIHYyKSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IGUxIDw8ICIgKyAiIDw8IGUyCisgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKKyAgICAgIDw8IHYxICsgdjIgPDwgIi4iOworfQorCisvLyBBIGJpbmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3IyIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgY29uc3QgeworICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb24yKGUxLCBlMiwgdjEsIHYyKTsKKyAgfQorfTsKKworLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDIuCisKK2NsYXNzIFByZWRpY2F0ZTJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOworICAgIGZpbmlzaGVkXyA9IGZhbHNlOworICAgIG4xXyA9IG4yXyA9IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4yXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAzICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgorICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKKyAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKKyAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKKyAgICB9CisgIH0KKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOworCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87CisKKyAgc3RhdGljIGludCBuMV87CisgIHN0YXRpYyBpbnQgbjJfOworfTsKKworYm9vbCBQcmVkaWNhdGUyVGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlMlRlc3Q6OmZpbmlzaGVkXzsKK2ludCBQcmVkaWNhdGUyVGVzdDo6bjFfOworaW50IFByZWRpY2F0ZTJUZXN0OjpuMl87CisKK3R5cGVkZWYgUHJlZGljYXRlMlRlc3QgRVhQRUNUX1BSRURfRk9STUFUMlRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTJUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUyVGVzdCBFWFBFQ1RfUFJFRDJUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUyVGVzdCBBU1NFUlRfUFJFRDJUZXN0OworCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3Rpb24ySW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0aW9uMkJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0aW9uMkludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3Rpb24yQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdGlvbjJJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3Rpb24yQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdGlvbjJJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3Rpb24yQm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKy8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgdGVybmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KKworLy8gQSB0ZXJuYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorYm9vbCBQcmVkRnVuY3Rpb24zKFQxIHYxLCBUMiB2MiwgVDMgdjMpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbjNJbnQoaW50IHYxLCBpbnQgdjIsIGludCB2MykgeworICByZXR1cm4gdjEgKyB2MiArIHYzID4gMDsKK30KK2Jvb2wgUHJlZEZ1bmN0aW9uM0Jvb2woQm9vbCB2MSwgQm9vbCB2MiwgQm9vbCB2MykgeworICByZXR1cm4gdjEgKyB2MiArIHYzID4gMDsKK30KKworLy8gQSB0ZXJuYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgorc3RydWN0IFByZWRGdW5jdG9yMyB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzKSB7CisgICAgcmV0dXJuIHYxICsgdjIgKyB2MyA+IDA7CisgIH0KK307CisKKy8vIEEgdGVybmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Cit0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uMyhjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIHsKKyAgaWYgKFByZWRGdW5jdGlvbjModjEsIHYyLCB2MykpCisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBlMSA8PCAiICsgIiA8PCBlMiA8PCAiICsgIiA8PCBlMworICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCB2MSArIHYyICsgdjMgPDwgIi4iOworfQorCisvLyBBIHRlcm5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yMyB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjMoZTEsIGUyLCBlMywgdjEsIHYyLCB2Myk7CisgIH0KK307CisKKy8vIFRlc3RzIGZvciB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQzLgorCitjbGFzcyBQcmVkaWNhdGUzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBleHBlY3RlZF90b19maW5pc2hfID0gdHJ1ZTsKKyAgICBmaW5pc2hlZF8gPSBmYWxzZTsKKyAgICBuMV8gPSBuMl8gPSBuM18gPSAwOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIFZlcmlmaWVzIHRoYXQgZWFjaCBvZiB0aGUgcHJlZGljYXRlJ3MgYXJndW1lbnRzIHdhcyBldmFsdWF0ZWQKKyAgICAvLyBleGFjdGx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDEsIG4xXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAyICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuMl8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjNfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDQgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCisgICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOworICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgorICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKKworICBzdGF0aWMgaW50IG4xXzsKKyAgc3RhdGljIGludCBuMl87CisgIHN0YXRpYyBpbnQgbjNfOworfTsKKworYm9vbCBQcmVkaWNhdGUzVGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlM1Rlc3Q6OmZpbmlzaGVkXzsKK2ludCBQcmVkaWNhdGUzVGVzdDo6bjFfOworaW50IFByZWRpY2F0ZTNUZXN0OjpuMl87CitpbnQgUHJlZGljYXRlM1Rlc3Q6Om4zXzsKKwordHlwZWRlZiBQcmVkaWNhdGUzVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlM1Rlc3QgQVNTRVJUX1BSRURfRk9STUFUM1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTNUZXN0IEVYUEVDVF9QUkVEM1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTNUZXN0IEFTU0VSVF9QUkVEM1Rlc3Q7CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdGlvbjNJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdGlvbjNCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdGlvbjNJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdGlvbjNCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0aW9uM0ludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0aW9uM0Jvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3Rpb24zSW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdGlvbjNCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKy8vIFNhbXBsZSBmdW5jdGlvbnMvZnVuY3RvcnMgZm9yIHRlc3RpbmcgNC1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgNC1hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorYm9vbCBQcmVkRnVuY3Rpb240KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbjRJbnQoaW50IHYxLCBpbnQgdjIsIGludCB2MywgaW50IHY0KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbjRCb29sKEJvb2wgdjEsIEJvb2wgdjIsIEJvb2wgdjMsIEJvb2wgdjQpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ID4gMDsKK30KKworLy8gQSA0LWFyeSBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvcjQgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIHsKKyAgICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgPiAwOworICB9Cit9OworCisvLyBBIDQtYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Cit0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uNChjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgeworICBpZiAoUHJlZEZ1bmN0aW9uNCh2MSwgdjIsIHYzLCB2NCkpCisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBlMSA8PCAiICsgIiA8PCBlMiA8PCAiICsgIiA8PCBlMyA8PCAiICsgIiA8PCBlNAorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCB2MSArIHYyICsgdjMgKyB2NCA8PCAiLiI7Cit9CisKKy8vIEEgNC1hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yNCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgY29uc3QgeworICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb240KGUxLCBlMiwgZTMsIGU0LCB2MSwgdjIsIHYzLCB2NCk7CisgIH0KK307CisKKy8vIFRlc3RzIGZvciB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ0LgorCitjbGFzcyBQcmVkaWNhdGU0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBleHBlY3RlZF90b19maW5pc2hfID0gdHJ1ZTsKKyAgICBmaW5pc2hlZF8gPSBmYWxzZTsKKyAgICBuMV8gPSBuMl8gPSBuM18gPSBuNF8gPSAwOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIFZlcmlmaWVzIHRoYXQgZWFjaCBvZiB0aGUgcHJlZGljYXRlJ3MgYXJndW1lbnRzIHdhcyBldmFsdWF0ZWQKKyAgICAvLyBleGFjdGx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDEsIG4xXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAyICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuMl8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjNfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDQgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG40XykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA1ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgorICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKKyAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKKyAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKKyAgICB9CisgIH0KKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOworCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87CisKKyAgc3RhdGljIGludCBuMV87CisgIHN0YXRpYyBpbnQgbjJfOworICBzdGF0aWMgaW50IG4zXzsKKyAgc3RhdGljIGludCBuNF87Cit9OworCitib29sIFByZWRpY2F0ZTRUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOworYm9vbCBQcmVkaWNhdGU0VGVzdDo6ZmluaXNoZWRfOworaW50IFByZWRpY2F0ZTRUZXN0OjpuMV87CitpbnQgUHJlZGljYXRlNFRlc3Q6Om4yXzsKK2ludCBQcmVkaWNhdGU0VGVzdDo6bjNfOworaW50IFByZWRpY2F0ZTRUZXN0OjpuNF87CisKK3R5cGVkZWYgUHJlZGljYXRlNFRlc3QgRVhQRUNUX1BSRURfRk9STUFUNFRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTRUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0OwordHlwZWRlZiBQcmVkaWNhdGU0VGVzdCBFWFBFQ1RfUFJFRDRUZXN0OwordHlwZWRlZiBQcmVkaWNhdGU0VGVzdCBBU1NFUlRfUFJFRDRUZXN0OworCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENChQcmVkRnVuY3Rpb240SW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdGlvbjRCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdGlvbjRJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENChQcmVkRnVuY3Rpb240Qm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdGlvbjRJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0aW9uNEJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENChQcmVkRnVuY3Rpb240SW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENChQcmVkRnVuY3Rpb240Qm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyA1LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KKworLy8gQSA1LWFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorYm9vbCBQcmVkRnVuY3Rpb241KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgKyB2NSA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbjVJbnQoaW50IHYxLCBpbnQgdjIsIGludCB2MywgaW50IHY0LCBpbnQgdjUpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb241Qm9vbChCb29sIHYxLCBCb29sIHYyLCBCb29sIHYzLCBCb29sIHY0LCBCb29sIHY1KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCArIHY1ID4gMDsKK30KKworLy8gQSA1LWFyeSBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvcjUgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAorICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSB7CisgICAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPiAwOworICB9Cit9OworCisvLyBBIDUtYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjUoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgeworICBpZiAoUHJlZEZ1bmN0aW9uNSh2MSwgdjIsIHYzLCB2NCwgdjUpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMgPDwgIiArICIgPDwgZTQgPDwgIiArICIgPDwgZTUKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgKyB2MiArIHYzICsgdjQgKyB2NSA8PCAiLiI7Cit9CisKKy8vIEEgNS1hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yNSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNSYgdjUpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uNShlMSwgZTIsIGUzLCBlNCwgZTUsIHYxLCB2MiwgdjMsIHY0LCB2NSk7CisgIH0KK307CisKKy8vIFRlc3RzIGZvciB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ1LgorCitjbGFzcyBQcmVkaWNhdGU1VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBleHBlY3RlZF90b19maW5pc2hfID0gdHJ1ZTsKKyAgICBmaW5pc2hlZF8gPSBmYWxzZTsKKyAgICBuMV8gPSBuMl8gPSBuM18gPSBuNF8gPSBuNV8gPSAwOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIFZlcmlmaWVzIHRoYXQgZWFjaCBvZiB0aGUgcHJlZGljYXRlJ3MgYXJndW1lbnRzIHdhcyBldmFsdWF0ZWQKKyAgICAvLyBleGFjdGx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDEsIG4xXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAyICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuMl8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjNfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDQgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG40XykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA1ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuNV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworICBzdGF0aWMgaW50IG4yXzsKKyAgc3RhdGljIGludCBuM187CisgIHN0YXRpYyBpbnQgbjRfOworICBzdGF0aWMgaW50IG41XzsKK307CisKK2Jvb2wgUHJlZGljYXRlNVRlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZTVUZXN0OjpmaW5pc2hlZF87CitpbnQgUHJlZGljYXRlNVRlc3Q6Om4xXzsKK2ludCBQcmVkaWNhdGU1VGVzdDo6bjJfOworaW50IFByZWRpY2F0ZTVUZXN0OjpuM187CitpbnQgUHJlZGljYXRlNVRlc3Q6Om40XzsKK2ludCBQcmVkaWNhdGU1VGVzdDo6bjVfOworCit0eXBlZGVmIFByZWRpY2F0ZTVUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0OwordHlwZWRlZiBQcmVkaWNhdGU1VGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNVRlc3QgRVhQRUNUX1BSRUQ1VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNVRlc3QgQVNTRVJUX1BSRUQ1VGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0aW9uNUludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdGlvbjVCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdGlvbjVJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0aW9uNUJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENShQcmVkRnVuY3Rpb241SW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0aW9uNUJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENShQcmVkRnVuY3Rpb241SW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0aW9uNUJvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICAgICAgICAgKytuNV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjBhYmNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYwpAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFVuaXQgdGVzdCBmb3IgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmguCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3QvcHJvZHVjdGlvbi5oIgorCisvLyBUZXN0cyB0aGF0IHByaXZhdGUgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgZnJvbSBhIFRFU1QgZGVjbGFyZWQgYXMKKy8vIGEgZnJpZW5kIG9mIHRoZSBjbGFzcy4KK1RFU1QoUHJpdmF0ZUNvZGVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycykgeworICBQcml2YXRlQ29kZSBhOworICBFWFBFQ1RfRVEoMCwgYS54Xyk7CisKKyAgYS5zZXRfeCgxKTsKKyAgRVhQRUNUX0VRKDEsIGEueF8pOworfQorCit0eXBlZGVmIHRlc3Rpbmc6OlRlc3QgUHJpdmF0ZUNvZGVGaXh0dXJlVGVzdDsKKworLy8gVGVzdHMgdGhhdCBwcml2YXRlIG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gYSBURVNUX0YgZGVjbGFyZWQKKy8vIGFzIGEgZnJpZW5kIG9mIHRoZSBjbGFzcy4KK1RFU1RfRihQcml2YXRlQ29kZUZpeHR1cmVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycykgeworICBQcml2YXRlQ29kZSBhOworICBFWFBFQ1RfRVEoMCwgYS54Xyk7CisKKyAgYS5zZXRfeCgyKTsKKyAgRVhQRUNUX0VRKDIsIGEueF8pOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTAxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MKQEAgLTAsMCArMSwyNTMgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFRlc3RzIHRoZSAtLWd0ZXN0X3JlcGVhdD1udW1iZXIgZmxhZy4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOworR1RFU1RfREVDTEFSRV9pbnQzMl8ocmVwZWF0KTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KTsKKworbmFtZXNwYWNlIHsKKworLy8gV2UgbmVlZCB0aGlzIHdoZW4gd2UgYXJlIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmIGFuZCB0aGVyZWZvcmUKKy8vIGNhbm5vdCB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucy4KKyNkZWZpbmUgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgYWN0dWFsKSBcCisgIGRvIHtcCisgICAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbCA9IChleHBlY3RlZCk7XAorICAgIGNvbnN0IGludCBhY3R1YWxfdmFsID0gKGFjdHVhbCk7XAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoZXhwZWN0ZWRfdmFsICE9IGFjdHVhbF92YWwpKSB7XAorICAgICAgOjpzdGQ6OmNvdXQgPDwgIlZhbHVlIG9mOiAiICNhY3R1YWwgIlxuIlwKKyAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsIDw8ICJcbiJcCisgICAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgI2V4cGVjdGVkICJcbiJcCisgICAgICAgICAgICAgICAgICA8PCAiV2hpY2ggaXM6ICIgPDwgZXhwZWN0ZWRfdmFsIDw8ICJcbiI7XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKworLy8gVXNlZCBmb3IgdmVyaWZ5aW5nIHRoYXQgZ2xvYmFsIGVudmlyb25tZW50IHNldC11cCBhbmQgdGVhci1kb3duIGFyZQorLy8gaW5zaWRlIHRoZSBndGVzdF9yZXBlYXQgbG9vcC4KKworaW50IGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKK2ludCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCA9IDA7CisKK2NsYXNzIE15RW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgTXlFbnZpcm9ubWVudCgpIHt9CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgZ19lbnZpcm9ubWVudF9zZXRfdXBfY291bnQrKzsgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50Kys7IH0KK307CisKKy8vIEEgdGVzdCB0aGF0IHNob3VsZCBmYWlsLgorCitpbnQgZ19zaG91bGRfZmFpbF9jb3VudCA9IDA7CisKK1RFU1QoRm9vVGVzdCwgU2hvdWxkRmFpbCkgeworICBnX3Nob3VsZF9mYWlsX2NvdW50Kys7CisgIEVYUEVDVF9FUSgwLCAxKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOworfQorCisvLyBBIHRlc3QgdGhhdCBzaG91bGQgcGFzcy4KKworaW50IGdfc2hvdWxkX3Bhc3NfY291bnQgPSAwOworCitURVNUKEZvb1Rlc3QsIFNob3VsZFBhc3MpIHsKKyAgZ19zaG91bGRfcGFzc19jb3VudCsrOworfQorCisvLyBBIHRlc3QgdGhhdCBjb250YWlucyBhIHRocmVhZC1zYWZlIGRlYXRoIHRlc3QgYW5kIGEgZmFzdCBkZWF0aAorLy8gdGVzdC4gIEl0IHNob3VsZCBwYXNzLgorCitpbnQgZ19kZWF0aF90ZXN0X2NvdW50ID0gMDsKKworVEVTVChCYXJEZWF0aFRlc3QsIFRocmVhZFNhZmVBbmRGYXN0KSB7CisgIGdfZGVhdGhfdGVzdF9jb3VudCsrOworCisgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCksICIiKTsKKworICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpLCAiIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAoraW50IGdfcGFyYW1fdGVzdF9jb3VudCA9IDA7CisKK2NvbnN0IGludCBrTnVtYmVyT2ZQYXJhbVRlc3RzID0gMTA7CisKK2NsYXNzIE15UGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7fTsKKworVEVTVF9QKE15UGFyYW1UZXN0LCBTaG91bGRQYXNzKSB7CisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1ha2UgcGFyYW1ldGVyIHZhbHVlIGNoZWNraW5nIHJvYnVzdAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBXUlQgb3JkZXIgb2YgdGVzdHMuCisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZ19wYXJhbV90ZXN0X2NvdW50ICUga051bWJlck9mUGFyYW1UZXN0cywgR2V0UGFyYW0oKSk7CisgIGdfcGFyYW1fdGVzdF9jb3VudCsrOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTXlQYXJhbVNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXlQYXJhbVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpSYW5nZSgwLCBrTnVtYmVyT2ZQYXJhbVRlc3RzKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIFJlc2V0cyB0aGUgY291bnQgZm9yIGVhY2ggdGVzdC4KK3ZvaWQgUmVzZXRDb3VudHMoKSB7CisgIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKKyAgZ19lbnZpcm9ubWVudF90ZWFyX2Rvd25fY291bnQgPSAwOworICBnX3Nob3VsZF9mYWlsX2NvdW50ID0gMDsKKyAgZ19zaG91bGRfcGFzc19jb3VudCA9IDA7CisgIGdfZGVhdGhfdGVzdF9jb3VudCA9IDA7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgZ19wYXJhbV90ZXN0X2NvdW50ID0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKK30KKworLy8gQ2hlY2tzIHRoYXQgdGhlIGNvdW50IGZvciBlYWNoIHRlc3QgaXMgZXhwZWN0ZWQuCit2b2lkIENoZWNrQ291bnRzKGludCBleHBlY3RlZCkgeworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgZ19zaG91bGRfZmFpbF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfc2hvdWxkX3Bhc3NfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2RlYXRoX3Rlc3RfY291bnQpOworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCisvLyBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgR29vZ2xlIFRlc3Qgd2hlbiAtLWd0ZXN0X3JlcGVhdCBpcyBub3Qgc3BlY2lmaWVkLgordm9pZCBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKSB7CisgIFJlc2V0Q291bnRzKCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKKyAgQ2hlY2tDb3VudHMoMSk7Cit9CisKKy8vIFRlc3RzIHRoZSBiZWhhdmlvciBvZiBHb29nbGUgVGVzdCB3aGVuIC0tZ3Rlc3RfcmVwZWF0IGhhcyB0aGUgZ2l2ZW4gdmFsdWUuCit2b2lkIFRlc3RSZXBlYXQoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisKKyAgUmVzZXRDb3VudHMoKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgPiAwID8gMSA6IDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIENoZWNrQ291bnRzKHJlcGVhdCk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIC0tZ3Rlc3RfcmVwZWF0IHdoZW4gLS1ndGVzdF9maWx0ZXIgc3BlY2lmaWVzIGFuIGVtcHR5CisvLyBzZXQgb2YgdGVzdHMuCit2b2lkIFRlc3RSZXBlYXRXaXRoRW1wdHlGaWx0ZXIoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICJOb25lIjsKKworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIENoZWNrQ291bnRzKDApOworfQorCisvLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgorLy8gc3VjY2Vzc2Z1bCB0ZXN0cy4KK3ZvaWQgVGVzdFJlcGVhdFdpdGhGaWx0ZXJGb3JTdWNjZXNzZnVsVGVzdHMoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIqLSpTaG91bGRGYWlsIjsKKworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMCwgZ19zaG91bGRfZmFpbF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX3Nob3VsZF9wYXNzX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZGVhdGhfdGVzdF9jb3VudCk7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCisvLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgorLy8gZmFpbGVkIHRlc3RzLgordm9pZCBUZXN0UmVwZWF0V2l0aEZpbHRlckZvckZhaWxlZFRlc3RzKGludCByZXBlYXQpIHsKKyAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0OworICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiKlNob3VsZEZhaWwiOworCisgIFJlc2V0Q291bnRzKCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfc2hvdWxkX2ZhaWxfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfc2hvdWxkX3Bhc3NfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfZGVhdGhfdGVzdF9jb3VudCk7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBNeUVudmlyb25tZW50KTsKKworICBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKTsKKyAgVGVzdFJlcGVhdCgwKTsKKyAgVGVzdFJlcGVhdCgxKTsKKyAgVGVzdFJlcGVhdCg1KTsKKworICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDIpOworICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDMpOworCisgIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yU3VjY2Vzc2Z1bFRlc3RzKDMpOworCisgIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yRmFpbGVkVGVzdHMoNCk7CisKKyAgLy8gSXQgd291bGQgYmUgbmljZSB0byB2ZXJpZnkgdGhhdCB0aGUgdGVzdHMgaW5kZWVkIGxvb3AgZm9yZXZlcgorICAvLyB3aGVuIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBuZWdhdGl2ZSwgYnV0IHRoaXMgdGVzdCB3aWxsIGJlIHF1aXRlCisgIC8vIGNvbXBsaWNhdGVkIHRvIHdyaXRlLiAgU2luY2UgdGhpcyBmbGFnIGlzIGZvciBpbnRlcmFjdGl2ZQorICAvLyBkZWJ1Z2dpbmcgb25seSBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIG5vcm1hbCB0ZXN0IHJlc3VsdCwgc3VjaCBhCisgIC8vIHRlc3Qgd291bGQgYmUgYW4gb3ZlcmtpbGwuCisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMGQwMzAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weQpAQCAtMCwwICsxLDMyNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IHRlc3Qgc2h1ZmZsaW5nIHdvcmtzLiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKyMgQ29tbWFuZCB0byBydW4gdGhlIGd0ZXN0X3NodWZmbGVfdGVzdF8gcHJvZ3JhbS4KK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3Rfc2h1ZmZsZV90ZXN0XycpCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGVzdCBzaGFyZGluZy4KK1RPVEFMX1NIQVJEU19FTlZfVkFSID0gJ0dURVNUX1RPVEFMX1NIQVJEUycKK1NIQVJEX0lOREVYX0VOVl9WQVIgPSAnR1RFU1RfU0hBUkRfSU5ERVgnCisKK1RFU1RfRklMVEVSID0gJ0EqLkE6QSouQjpDKicKKworQUxMX1RFU1RTID0gW10KK0FDVElWRV9URVNUUyA9IFtdCitGSUxURVJFRF9URVNUUyA9IFtdCitTSEFSREVEX1RFU1RTID0gW10KKworU0hVRkZMRURfQUxMX1RFU1RTID0gW10KK1NIVUZGTEVEX0FDVElWRV9URVNUUyA9IFtdCitTSFVGRkxFRF9GSUxURVJFRF9URVNUUyA9IFtdCitTSFVGRkxFRF9TSEFSREVEX1RFU1RTID0gW10KKworCitkZWYgQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCk6CisgIHJldHVybiAnLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cycKKworCitkZWYgRmlsdGVyRmxhZyh0ZXN0X2ZpbHRlcik6CisgIHJldHVybiAnLS1ndGVzdF9maWx0ZXI9JXMnICUgKHRlc3RfZmlsdGVyLCkKKworCitkZWYgUmVwZWF0RmxhZyhuKToKKyAgcmV0dXJuICctLWd0ZXN0X3JlcGVhdD0lcycgJSAobiwpCisKKworZGVmIFNodWZmbGVGbGFnKCk6CisgIHJldHVybiAnLS1ndGVzdF9zaHVmZmxlJworCisKK2RlZiBSYW5kb21TZWVkRmxhZyhuKToKKyAgcmV0dXJuICctLWd0ZXN0X3JhbmRvbV9zZWVkPSVzJyAlIChuLCkKKworCitkZWYgUnVuQW5kUmV0dXJuT3V0cHV0KGV4dHJhX2VudiwgYXJncyk6CisgICIiIlJ1bnMgdGhlIHRlc3QgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgb3V0cHV0LiIiIgorCisgIGVudmlyb25fY29weSA9IG9zLmVudmlyb24uY29weSgpCisgIGVudmlyb25fY29weS51cGRhdGUoZXh0cmFfZW52KQorCisgIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgYXJncywgZW52PWVudmlyb25fY29weSkub3V0cHV0CisKKworZGVmIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyhleHRyYV9lbnYsIGFyZ3MpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgYSBsaXN0IG9mIHRlc3QgbGlzdHMuCisKKyAgQXJnczoKKyAgICBleHRyYV9lbnY6IGEgbWFwIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZWlyIHZhbHVlcworICAgIGFyZ3M6IGNvbW1hbmQgbGluZSBmbGFncyB0byBwYXNzIHRvIGd0ZXN0X3NodWZmbGVfdGVzdF8KKworICBSZXR1cm5zOgorICAgIEEgbGlzdCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IGlzIHRoZSBsaXN0IG9mIHRlc3RzIHJ1biBpbiB0aGUgaS10aAorICAgIHRlc3QgaXRlcmF0aW9uLgorICAiIiIKKworICB0ZXN0X2l0ZXJhdGlvbnMgPSBbXQorICBmb3IgbGluZSBpbiBSdW5BbmRSZXR1cm5PdXRwdXQoZXh0cmFfZW52LCBhcmdzKS5zcGxpdCgnXG4nKToKKyAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy0tLS0nKToKKyAgICAgIHRlc3RzID0gW10KKyAgICAgIHRlc3RfaXRlcmF0aW9ucy5hcHBlbmQodGVzdHMpCisgICAgZWxpZiBsaW5lLnN0cmlwKCk6CisgICAgICB0ZXN0cy5hcHBlbmQobGluZS5zdHJpcCgpKSAgIyAnVGVzdENhc2VOYW1lLlRlc3ROYW1lJworCisgIHJldHVybiB0ZXN0X2l0ZXJhdGlvbnMKKworCitkZWYgR2V0VGVzdENhc2VzKHRlc3RzKToKKyAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgdGVzdCBjYXNlcyBpbiB0aGUgZ2l2ZW4gZnVsbCB0ZXN0IG5hbWVzLgorCisgIEFyZ3M6CisgICAgdGVzdHM6IGEgbGlzdCBvZiBmdWxsIHRlc3QgbmFtZXMKKworICBSZXR1cm5zOgorICAgIEEgbGlzdCBvZiB0ZXN0IGNhc2VzIGZyb20gJ3Rlc3RzJywgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuCisgICAgQ29uc2VjdXRpdmUgZHVwbGljYXRlcyBhcmUgcmVtb3ZlZC4KKyAgIiIiCisKKyAgdGVzdF9jYXNlcyA9IFtdCisgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgIHRlc3RfY2FzZSA9IHRlc3Quc3BsaXQoJy4nKVswXQorICAgIGlmIG5vdCB0ZXN0X2Nhc2UgaW4gdGVzdF9jYXNlczoKKyAgICAgIHRlc3RfY2FzZXMuYXBwZW5kKHRlc3RfY2FzZSkKKworICByZXR1cm4gdGVzdF9jYXNlcworCisKK2RlZiBDYWxjdWxhdGVUZXN0TGlzdHMoKToKKyAgIiIiQ2FsY3VsYXRlcyB0aGUgbGlzdCBvZiB0ZXN0cyBydW4gdW5kZXIgZGlmZmVyZW50IGZsYWdzLiIiIgorCisgIGlmIG5vdCBBTExfVEVTVFM6CisgICAgQUxMX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCldKVswXSkKKworICBpZiBub3QgQUNUSVZFX1RFU1RTOgorICAgIEFDVElWRV9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbXSlbMF0pCisKKyAgaWYgbm90IEZJTFRFUkVEX1RFU1RTOgorICAgIEZJTFRFUkVEX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbRmlsdGVyRmxhZyhURVNUX0ZJTFRFUildKVswXSkKKworICBpZiBub3QgU0hBUkRFRF9URVNUUzoKKyAgICBTSEFSREVEX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQVJEX0lOREVYX0VOVl9WQVI6ICcxJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX0FMTF9URVNUUzoKKyAgICBTSFVGRkxFRF9BTExfVEVTVFMuZXh0ZW5kKEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcoKSwgU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKVswXSkKKworICBpZiBub3QgU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgIFNIVUZGTEVEX0FDVElWRV9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTOgorICAgIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLmV4dGVuZChHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSksIEZpbHRlckZsYWcoVEVTVF9GSUxURVIpXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgU0hVRkZMRURfU0hBUkRFRF9URVNUUy5leHRlbmQoCisgICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCisKKworY2xhc3MgR1Rlc3RTaHVmZmxlVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRlc3Qgc2h1ZmZsaW5nLiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBDYWxjdWxhdGVUZXN0TGlzdHMoKQorCisgIGRlZiB0ZXN0U2h1ZmZsZVByZXNlcnZlc051bWJlck9mVGVzdHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQUxMX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0FMTF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQUNUSVZFX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0FDVElWRV9URVNUUykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oRklMVEVSRURfVEVTVFMpLCBsZW4oU0hVRkZMRURfRklMVEVSRURfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFNIQVJERURfVEVTVFMpLCBsZW4oU0hVRkZMRURfU0hBUkRFRF9URVNUUykpCisKKyAgZGVmIHRlc3RTaHVmZmxlQ2hhbmdlc1Rlc3RPcmRlcihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfQUxMX1RFU1RTICE9IEFMTF9URVNUUywgU0hVRkZMRURfQUxMX1RFU1RTKQorICAgIHNlbGYuYXNzZXJ0XyhTSFVGRkxFRF9BQ1RJVkVfVEVTVFMgIT0gQUNUSVZFX1RFU1RTLCBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5hc3NlcnRfKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTICE9IEZJTFRFUkVEX1RFU1RTLAorICAgICAgICAgICAgICAgICBTSFVGRkxFRF9GSUxURVJFRF9URVNUUykKKyAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfU0hBUkRFRF9URVNUUyAhPSBTSEFSREVEX1RFU1RTLAorICAgICAgICAgICAgICAgICBTSFVGRkxFRF9TSEFSREVEX1RFU1RTKQorCisgIGRlZiB0ZXN0U2h1ZmZsZUNoYW5nZXNUZXN0Q2FzZU9yZGVyKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XyhHZXRUZXN0Q2FzZXMoU0hVRkZMRURfQUxMX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoQUxMX1RFU1RTKSwKKyAgICAgICAgICAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FMTF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfQUNUSVZFX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoQUNUSVZFX1RFU1RTKSwKKyAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FDVElWRV9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpICE9IEdldFRlc3RDYXNlcyhGSUxURVJFRF9URVNUUyksCisgICAgICAgIEdldFRlc3RDYXNlcyhTSFVGRkxFRF9GSUxURVJFRF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfU0hBUkRFRF9URVNUUykgIT0gR2V0VGVzdENhc2VzKFNIQVJERURfVEVTVFMpLAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfU0hBUkRFRF9URVNUUykpCisKKyAgZGVmIHRlc3RTaHVmZmxlRG9lc05vdFJlcGVhdFRlc3Qoc2VsZik6CisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9BTExfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLmNvdW50KHRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFNIVUZGTEVEX1NIQVJERURfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlRG9lc05vdENyZWF0ZU5ld1Rlc3Qoc2VsZik6CisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gQUxMX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gQUNUSVZFX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBGSUxURVJFRF9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSEFSREVEX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlSW5jbHVkZXNBbGxUZXN0cyhzZWxmKToKKyAgICBmb3IgdGVzdCBpbiBBTExfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSFVGRkxFRF9BTExfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIEZJTFRFUkVEX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hBUkRFRF9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlTGVhdmVzRGVhdGhUZXN0c0F0RnJvbnQoc2VsZik6CisgICAgbm9uX2RlYXRoX3Rlc3RfZm91bmQgPSBGYWxzZQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUzoKKyAgICAgIGlmICdEZWF0aFRlc3QuJyBpbiB0ZXN0OgorICAgICAgICBzZWxmLmFzc2VydF8obm90IG5vbl9kZWF0aF90ZXN0X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgJyVzIGFwcGVhcnMgYWZ0ZXIgYSBub24tZGVhdGggdGVzdCcgJSAodGVzdCwpKQorICAgICAgZWxzZToKKyAgICAgICAgbm9uX2RlYXRoX3Rlc3RfZm91bmQgPSBUcnVlCisKKyAgZGVmIF9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoc2VsZiwgdGVzdHMpOgorICAgIHRlc3RfY2FzZXMgPSBbXQorICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgW3Rlc3RfY2FzZSwgX10gPSB0ZXN0LnNwbGl0KCcuJykKKyAgICAgIGlmIHRlc3RfY2FzZXMgYW5kIHRlc3RfY2FzZXNbLTFdICE9IHRlc3RfY2FzZToKKyAgICAgICAgdGVzdF9jYXNlcy5hcHBlbmQodGVzdF9jYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHRlc3RfY2FzZXMuY291bnQodGVzdF9jYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdCBjYXNlICVzIGlzIG5vdCBncm91cGVkIHRvZ2V0aGVyIGluICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfY2FzZSwgdGVzdHMpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZURvZXNOb3RJbnRlcmxlYXZlVGVzdENhc2VzKHNlbGYpOgorICAgIHNlbGYuX1ZlcmlmeVRlc3RDYXNlc0RvTm90SW50ZXJsZWF2ZShTSFVGRkxFRF9BTExfVEVTVFMpCisgICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX0FDVElWRV9URVNUUykKKyAgICBzZWxmLl9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpCisgICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpCisKKyAgZGVmIHRlc3RTaHVmZmxlUmVzdG9yZXNPcmRlckFmdGVyRWFjaEl0ZXJhdGlvbihzZWxmKToKKyAgICAjIEdldCB0aGUgdGVzdCBsaXN0cyBpbiBhbGwgMyBpdGVyYXRpb25zLCB1c2luZyByYW5kb20gc2VlZCAxLCAyLAorICAgICMgYW5kIDMgcmVzcGVjdGl2ZWx5LiAgR29vZ2xlIFRlc3QgcGlja3MgYSBkaWZmZXJlbnQgc2VlZCBpbiBlYWNoCisgICAgIyBpdGVyYXRpb24sIGFuZCB0aGlzIHRlc3QgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgICMgcGlja2luZyBzdWNjZXNzaXZlIG51bWJlcnMuICBUaGlzIGRlcGVuZGVuY3kgaXMgbm90IGlkZWFsLCBidXQKKyAgICAjIG1ha2VzIHRoZSB0ZXN0IG11Y2ggZWFzaWVyIHRvIHdyaXRlLgorICAgIFt0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c19pbl9pdGVyYXRpb24yLCB0ZXN0c19pbl9pdGVyYXRpb24zXSA9ICgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKSwgUmVwZWF0RmxhZygzKV0pKQorCisgICAgIyBNYWtlIHN1cmUgcnVubmluZyB0aGUgdGVzdHMgd2l0aCByYW5kb20gc2VlZCAxIGdldHMgdGhlIHNhbWUKKyAgICAjIG9yZGVyIGFzIGluIGl0ZXJhdGlvbiAxIGFib3ZlLgorICAgIFt0ZXN0c193aXRoX3NlZWQxXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c193aXRoX3NlZWQxKQorCisgICAgIyBNYWtlIHN1cmUgcnVubmluZyB0aGUgdGVzdHMgd2l0aCByYW5kb20gc2VlZCAyIGdldHMgdGhlIHNhbWUKKyAgICAjIG9yZGVyIGFzIGluIGl0ZXJhdGlvbiAyIGFib3ZlLiAgU3VjY2VzcyBtZWFucyB0aGF0IEdvb2dsZSBUZXN0CisgICAgIyBjb3JyZWN0bHkgcmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgYmVmb3JlIHJlLXNodWZmbGluZyBhdCB0aGUKKyAgICAjIGJlZ2lubmluZyBvZiBpdGVyYXRpb24gMi4KKyAgICBbdGVzdHNfd2l0aF9zZWVkMl0gPSBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMildKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHNfaW5faXRlcmF0aW9uMiwgdGVzdHNfd2l0aF9zZWVkMikKKworICAgICMgTWFrZSBzdXJlIHJ1bm5pbmcgdGhlIHRlc3RzIHdpdGggcmFuZG9tIHNlZWQgMyBnZXRzIHRoZSBzYW1lCisgICAgIyBvcmRlciBhcyBpbiBpdGVyYXRpb24gMyBhYm92ZS4gIFN1Y2Nlc3MgbWVhbnMgdGhhdCBHb29nbGUgVGVzdAorICAgICMgY29ycmVjdGx5IHJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIGJlZm9yZSByZS1zaHVmZmxpbmcgYXQgdGhlCisgICAgIyBiZWdpbm5pbmcgb2YgaXRlcmF0aW9uIDMuCisgICAgW3Rlc3RzX3dpdGhfc2VlZDNdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDMpXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RzX2luX2l0ZXJhdGlvbjMsIHRlc3RzX3dpdGhfc2VlZDMpCisKKyAgZGVmIHRlc3RTaHVmZmxlR2VuZXJhdGVzTmV3T3JkZXJJbkVhY2hJdGVyYXRpb24oc2VsZik6CisgICAgW3Rlc3RzX2luX2l0ZXJhdGlvbjEsIHRlc3RzX2luX2l0ZXJhdGlvbjIsIHRlc3RzX2luX2l0ZXJhdGlvbjNdID0gKAorICAgICAgICBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpLCBSZXBlYXRGbGFnKDMpXSkpCisKKyAgICBzZWxmLmFzc2VydF8odGVzdHNfaW5faXRlcmF0aW9uMSAhPSB0ZXN0c19pbl9pdGVyYXRpb24yLAorICAgICAgICAgICAgICAgICB0ZXN0c19pbl9pdGVyYXRpb24xKQorICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0c19pbl9pdGVyYXRpb24xICE9IHRlc3RzX2luX2l0ZXJhdGlvbjMsCisgICAgICAgICAgICAgICAgIHRlc3RzX2luX2l0ZXJhdGlvbjEpCisgICAgc2VsZi5hc3NlcnRfKHRlc3RzX2luX2l0ZXJhdGlvbjIgIT0gdGVzdHNfaW5faXRlcmF0aW9uMywKKyAgICAgICAgICAgICAgICAgdGVzdHNfaW5faXRlcmF0aW9uMikKKworICBkZWYgdGVzdFNodWZmbGVTaGFyZGVkVGVzdHNQcmVzZXJ2ZXNQYXJ0aXRpb24oc2VsZik6CisgICAgIyBJZiB3ZSBydW4gTSB0ZXN0cyBvbiBOIHNoYXJkcywgdGhlIHNhbWUgTSB0ZXN0cyBzaG91bGQgYmUgcnVuIGluCisgICAgIyB0b3RhbCwgcmVnYXJkbGVzcyBvZiB0aGUgcmFuZG9tIHNlZWRzIHVzZWQgYnkgdGhlIHNoYXJkcy4KKyAgICBbdGVzdHMxXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzAnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKQorICAgIFt0ZXN0czJdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygyMCldKQorICAgIFt0ZXN0czNdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMid9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygyNSldKQorICAgIHNvcnRlZF9zaGFyZGVkX3Rlc3RzID0gdGVzdHMxICsgdGVzdHMyICsgdGVzdHMzCisgICAgc29ydGVkX3NoYXJkZWRfdGVzdHMuc29ydCgpCisgICAgc29ydGVkX2FjdGl2ZV90ZXN0cyA9IFtdCisgICAgc29ydGVkX2FjdGl2ZV90ZXN0cy5leHRlbmQoQUNUSVZFX1RFU1RTKQorICAgIHNvcnRlZF9hY3RpdmVfdGVzdHMuc29ydCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWRfYWN0aXZlX3Rlc3RzLCBzb3J0ZWRfc2hhcmRlZF90ZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiNDQxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBWZXJpZmllcyB0aGF0IHRlc3Qgc2h1ZmZsaW5nIHdvcmtzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0SW5mbzsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyOworCisvLyBUaGUgdGVzdCBtZXRob2RzIGFyZSBlbXB0eSwgYXMgdGhlIHNvbGUgcHVycG9zZSBvZiB0aGlzIHByb2dyYW0gaXMKKy8vIHRvIHByaW50IHRoZSB0ZXN0IG5hbWVzIGJlZm9yZS9hZnRlciBzaHVmZmxpbmcuCisKK2NsYXNzIEEgOiBwdWJsaWMgVGVzdCB7fTsKK1RFU1RfRihBLCBBKSB7fQorVEVTVF9GKEEsIEIpIHt9CisKK1RFU1QoQURlYXRoVGVzdCwgQSkge30KK1RFU1QoQURlYXRoVGVzdCwgQikge30KK1RFU1QoQURlYXRoVGVzdCwgQykge30KKworVEVTVChCLCBBKSB7fQorVEVTVChCLCBCKSB7fQorVEVTVChCLCBDKSB7fQorVEVTVChCLCBESVNBQkxFRF9EKSB7fQorVEVTVChCLCBESVNBQkxFRF9FKSB7fQorCitURVNUKEJEZWF0aFRlc3QsIEEpIHt9CitURVNUKEJEZWF0aFRlc3QsIEIpIHt9CisKK1RFU1QoQywgQSkge30KK1RFU1QoQywgQikge30KK1RFU1QoQywgQykge30KK1RFU1QoQywgRElTQUJMRURfRCkge30KKworVEVTVChDRGVhdGhUZXN0LCBBKSB7fQorCitURVNUKERJU0FCTEVEX0QsIEEpIHt9CitURVNUKERJU0FCTEVEX0QsIERJU0FCTEVEX0IpIHt9CisKKy8vIFRoaXMgcHJpbnRlciBwcmludHMgdGhlIGZ1bGwgdGVzdCBuYW1lcyBvbmx5LCBzdGFydGluZyBlYWNoIHRlc3QKKy8vIGl0ZXJhdGlvbiB3aXRoIGEgIi0tLS0iIG1hcmtlci4KK2NsYXNzIFRlc3ROYW1lUHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGl0ZXJhdGlvbiAqLykgeworICAgIHByaW50ZigiLS0tLVxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIHByaW50ZigiJXMuJXNcbiIsIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLy8gUmVwbGFjZXMgdGhlIGRlZmF1bHQgcHJpbnRlciB3aXRoIFRlc3ROYW1lUHJpbnRlciwgd2hpY2ggcHJpbnRzCisgIC8vIHRoZSB0ZXN0IG5hbWUgb25seS4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCk7CisgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgVGVzdE5hbWVQcmludGVyKTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2QwOTFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBHb29nbGUgVGVzdCBieSBpbmNsdWRpbmcKKy8vIHRoZSBndGVzdC5oIGhlYWRlciBmaWxlIGFsb25lLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordm9pZCBTdWJyb3V0aW5lKCkgeworICBFWFBFQ1RfRVEoNDIsIDQyKTsKK30KKworVEVTVChOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlKSB7CisgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKDspOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTVUNDRUVEKCkpOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTdWJyb3V0aW5lKCkpOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRSh7IFNVQ0NFRUQoKTsgfSk7Cit9CisKK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZSkgeworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSg7KTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3Vicm91dGluZSgpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoeyBTVUNDRUVEKCk7IH0pOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9zdHJlc3NfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF9zdHJlc3NfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RhYTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3N0cmVzc190ZXN0LmNjCkBAIC0wLDAgKzEsMjU2IEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSgpIGFuZCB2YXJpb3VzIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgY2FuIGJlCisvLyB1c2VkIGluIGEgbGFyZ2UgbnVtYmVyIG9mIHRocmVhZHMgY29uY3VycmVudGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gV2UgbXVzdCBkZWZpbmUgdGhpcyBtYWNybyBpbiBvcmRlciB0byAjaW5jbHVkZQorLy8gZ3Rlc3QtaW50ZXJuYWwtaW5sLmguICBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBwcmV2ZW50cyBhIHVzZXIgZnJvbQorLy8gYWNjaWRlbnRhbGx5IGRlcGVuZGluZyBvbiBpdHMgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgeworCit1c2luZyBpbnRlcm5hbDo6Tm90aWZpY2F0aW9uOwordXNpbmcgaW50ZXJuYWw6OlRlc3RQcm9wZXJ0eUtleUlzOwordXNpbmcgaW50ZXJuYWw6OlRocmVhZFdpdGhQYXJhbTsKK3VzaW5nIGludGVybmFsOjpzY29wZWRfcHRyOworCisvLyBJbiBvcmRlciB0byBydW4gdGVzdHMgaW4gdGhpcyBmaWxlLCBmb3IgcGxhdGZvcm1zIHdoZXJlIEdvb2dsZSBUZXN0IGlzCisvLyB0aHJlYWQgc2FmZSwgaW1wbGVtZW50IFRocmVhZFdpdGhQYXJhbS4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBpdHMgQVBJCisvLyBpbiBndGVzdC1wb3J0LmgsIHdoZXJlIGl0IGlzIGRlZmluZWQgZm9yIGFscmVhZHkgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKworLy8gSG93IG1hbnkgdGhyZWFkcyB0byBjcmVhdGU/Citjb25zdCBpbnQga1RocmVhZENvdW50ID0gNTA7CisKK3N0ZDo6c3RyaW5nIElkVG9LZXkoaW50IGlkLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgTWVzc2FnZSBrZXk7CisgIGtleSA8PCAia2V5XyIgPDwgaWQgPDwgIl8iIDw8IHN1ZmZpeDsKKyAgcmV0dXJuIGtleS5HZXRTdHJpbmcoKTsKK30KKworc3RkOjpzdHJpbmcgSWRUb1N0cmluZyhpbnQgaWQpIHsKKyAgTWVzc2FnZSBpZF9tZXNzYWdlOworICBpZF9tZXNzYWdlIDw8IGlkOworICByZXR1cm4gaWRfbWVzc2FnZS5HZXRTdHJpbmcoKTsKK30KKwordm9pZCBFeHBlY3RLZXlBbmRWYWx1ZVdlcmVSZWNvcmRlZEZvcklkKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4mIHByb3BlcnRpZXMsCisgICAgaW50IGlkLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgVGVzdFByb3BlcnR5S2V5SXMgbWF0Y2hlc19rZXkoSWRUb0tleShpZCwgc3VmZml4KS5jX3N0cigpKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6Y29uc3RfaXRlcmF0b3IgcHJvcGVydHkgPQorICAgICAgc3RkOjpmaW5kX2lmKHByb3BlcnRpZXMuYmVnaW4oKSwgcHJvcGVydGllcy5lbmQoKSwgbWF0Y2hlc19rZXkpOworICBBU1NFUlRfVFJVRShwcm9wZXJ0eSAhPSBwcm9wZXJ0aWVzLmVuZCgpKQorICAgICAgPDwgImV4cGVjdGluZyAiIDw8IHN1ZmZpeCA8PCAiIHZhbHVlIGZvciBpZCAiIDw8IGlkOworICBFWFBFQ1RfU1RSRVEoSWRUb1N0cmluZyhpZCkuY19zdHIoKSwgcHJvcGVydHktPnZhbHVlKCkpOworfQorCisvLyBDYWxscyBhIGxhcmdlIG51bWJlciBvZiBHb29nbGUgVGVzdCBhc3NlcnRpb25zLCB3aGVyZSBleGFjdGx5IG9uZSBvZiB0aGVtCisvLyB3aWxsIGZhaWwuCit2b2lkIE1hbnlBc3NlcnRzKGludCBpZCkgeworICBHVEVTVF9MT0dfKElORk8pIDw8ICJUaHJlYWQgIyIgPDwgaWQgPDwgIiBydW5uaW5nLi4uIjsKKworICBTQ09QRURfVFJBQ0UoTWVzc2FnZSgpIDw8ICJUaHJlYWQgIyIgPDwgaWQpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZENvdW50OyBpKyspIHsKKyAgICBTQ09QRURfVFJBQ0UoTWVzc2FnZSgpIDw8ICJJdGVyYXRpb24gIyIgPDwgaSk7CisKKyAgICAvLyBBIGJ1bmNoIG9mIGFzc2VydGlvbnMgdGhhdCBzaG91bGQgc3VjY2VlZC4KKyAgICBFWFBFQ1RfVFJVRSh0cnVlKTsKKyAgICBBU1NFUlRfRkFMU0UoZmFsc2UpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7CisgICAgRVhQRUNUX1NUUkVRKCJhIiwgImEiKTsKKyAgICBBU1NFUlRfTEUoNSwgNik7CisgICAgRVhQRUNUX0VRKGksIGkpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7CisKKyAgICAvLyBSZWNvcmRQcm9wZXJ0eSgpIHNob3VsZCBpbnRlcmFjdCBzYWZlbHkgd2l0aCBvdGhlciB0aHJlYWRzIGFzIHdlbGwuCisgICAgLy8gVGhlIHNoYXJlZF9rZXkgZm9yY2VzIHByb3BlcnR5IHVwZGF0ZXMuCisgICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoSWRUb0tleShpZCwgInN0cmluZyIpLmNfc3RyKCksIElkVG9TdHJpbmcoaWQpLmNfc3RyKCkpOworICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KElkVG9LZXkoaWQsICJpbnQiKS5jX3N0cigpLCBpZCk7CisgICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoInNoYXJlZF9rZXkiLCBJZFRvU3RyaW5nKGlkKS5jX3N0cigpKTsKKworICAgIC8vIFRoaXMgYXNzZXJ0aW9uIHNob3VsZCBmYWlsIGtUaHJlYWRDb3VudCB0aW1lcyBwZXIgdGhyZWFkLiAgSXQKKyAgICAvLyBpcyBmb3IgdGVzdGluZyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiBoYW5kbGUgZmFpbGVkIGFzc2VydGlvbnMgaW4gYQorICAgIC8vIG11bHRpLXRocmVhZGVkIGNvbnRleHQuCisgICAgRVhQRUNUX0xUKGksIDApIDw8ICJUaGlzIHNob3VsZCBhbHdheXMgZmFpbC4iOworICB9Cit9CisKK3ZvaWQgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KGludCBleHBlY3RlZF9mYWlsdXJlcykgeworICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBUZXN0UmVzdWx0KiBjb25zdCByZXN1bHQgPSBpbmZvLT5yZXN1bHQoKTsKKyAgR1RFU1RfQ0hFQ0tfKGV4cGVjdGVkX2ZhaWx1cmVzID09IHJlc3VsdC0+dG90YWxfcGFydF9jb3VudCgpKQorICAgICAgPDwgIkxvZ2dlZCAiIDw8IHJlc3VsdC0+dG90YWxfcGFydF9jb3VudCgpIDw8ICIgZmFpbHVyZXMgIgorICAgICAgPDwgIiB2cy4gIiA8PCBleHBlY3RlZF9mYWlsdXJlcyA8PCAiIGV4cGVjdGVkIjsKK30KKworLy8gVGVzdHMgdXNpbmcgU0NPUEVEX1RSQUNFKCkgYW5kIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4gbWFueSB0aHJlYWRzCisvLyBjb25jdXJyZW50bHkuCitURVNUKFN0cmVzc1Rlc3QsIENhblVzZVNjb3BlZFRyYWNlQW5kQXNzZXJ0aW9uc0luTWFueVRocmVhZHMpIHsKKyAgeworICAgIHNjb3BlZF9wdHI8VGhyZWFkV2l0aFBhcmFtPGludD4gPiB0aHJlYWRzW2tUaHJlYWRDb3VudF07CisgICAgTm90aWZpY2F0aW9uIHRocmVhZHNfY2FuX3N0YXJ0OworICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGtUaHJlYWRDb3VudDsgaSsrKQorICAgICAgdGhyZWFkc1tpXS5yZXNldChuZXcgVGhyZWFkV2l0aFBhcmFtPGludD4oJk1hbnlBc3NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRzX2Nhbl9zdGFydCkpOworCisgICAgdGhyZWFkc19jYW5fc3RhcnQuTm90aWZ5KCk7CisKKyAgICAvLyBCbG9ja3MgdW50aWwgYWxsIHRoZSB0aHJlYWRzIGFyZSBkb25lLgorICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGtUaHJlYWRDb3VudDsgaSsrKQorICAgICAgdGhyZWFkc1tpXS0+Sm9pbigpOworICB9CisKKyAgLy8gRW5zdXJlcyB0aGF0IGtUaHJlYWRDb3VudCprVGhyZWFkQ291bnQgZmFpbHVyZXMgaGF2ZSBiZWVuIHJlcG9ydGVkLgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBUZXN0UmVzdWx0KiBjb25zdCByZXN1bHQgPSBpbmZvLT5yZXN1bHQoKTsKKworICBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+IHByb3BlcnRpZXM7CisgIC8vIFdlIGhhdmUgbm8gYWNjZXNzIHRvIHRoZSBUZXN0UmVzdWx0J3MgbGlzdCBvZiBwcm9wZXJ0aWVzIGJ1dCB3ZSBjYW4KKyAgLy8gY29weSB0aGVtIG9uZSBieSBvbmUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT50ZXN0X3Byb3BlcnR5X2NvdW50KCk7ICsraSkKKyAgICBwcm9wZXJ0aWVzLnB1c2hfYmFjayhyZXN1bHQtPkdldFRlc3RQcm9wZXJ0eShpKSk7CisKKyAgRVhQRUNUX0VRKGtUaHJlYWRDb3VudCAqIDIgKyAxLCByZXN1bHQtPnRlc3RfcHJvcGVydHlfY291bnQoKSkKKyAgICAgIDw8ICJTdHJpbmcgYW5kIGludCB2YWx1ZXMgcmVjb3JkZWQgb24gZWFjaCB0aHJlYWQsICIKKyAgICAgIDw8ICJhcyB3ZWxsIGFzIG9uZSBzaGFyZWRfa2V5IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkQ291bnQ7ICsraSkgeworICAgIEV4cGVjdEtleUFuZFZhbHVlV2VyZVJlY29yZGVkRm9ySWQocHJvcGVydGllcywgaSwgInN0cmluZyIpOworICAgIEV4cGVjdEtleUFuZFZhbHVlV2VyZVJlY29yZGVkRm9ySWQocHJvcGVydGllcywgaSwgImludCIpOworICB9CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudChrVGhyZWFkQ291bnQqa1RocmVhZENvdW50KTsKK30KKwordm9pZCBGYWlsaW5nVGhyZWFkKGJvb2wgaXNfZmF0YWwpIHsKKyAgaWYgKGlzX2ZhdGFsKQorICAgIEZBSUwoKSA8PCAiRmF0YWwgZmFpbHVyZSBpbiBzb21lIG90aGVyIHRocmVhZC4gIgorICAgICAgICAgICA8PCAiKFRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4pIjsKKyAgZWxzZQorICAgIEFERF9GQUlMVVJFKCkgPDwgIk5vbi1mYXRhbCBmYWlsdXJlIGluIHNvbWUgb3RoZXIgdGhyZWFkLiAiCisgICAgICAgICAgICAgICAgICA8PCAiKFRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4pIjsKK30KKwordm9pZCBHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZChib29sIGlzX2ZhdGFsKSB7CisgIFRocmVhZFdpdGhQYXJhbTxib29sPiB0aHJlYWQoJkZhaWxpbmdUaHJlYWQsIGlzX2ZhdGFsLCBOVUxMKTsKKyAgdGhyZWFkLkpvaW4oKTsKK30KKworVEVTVChOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMpIHsKKyAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQodHJ1ZSkpOworICAvLyBXZSBzaG91bGQgb25seSBoYXZlIG9uZSBmYWlsdXJlICh0aGUgb25lIGZyb20KKyAgLy8gR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoKSksIHNpbmNlIHRoZSBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRQorICAvLyBzaG91bGQgc3VjY2VlZC4KKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDEpOworfQorCit2b2lkIEFzc2VydE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMoKSB7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpKTsKK30KK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7CisgIC8vIFVzaW5nIGEgc3Vicm91dGluZSwgdG8gbWFrZSBzdXJlLCB0aGF0IHRoZSB0ZXN0IGNvbnRpbnVlcy4KKyAgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcygpOworICAvLyBXZSBzaG91bGQgb25seSBoYXZlIG9uZSBmYWlsdXJlICh0aGUgb25lIGZyb20KKyAgLy8gR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoKSksIHNpbmNlIHRoZSBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRQorICAvLyBzaG91bGQgc3VjY2VlZC4KKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDEpOworfQorCitURVNUKEZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7CisgIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBmYWlsLCBzaW5jZSB0aGUgY3VycmVudCB0aHJlYWQgZG9lc24ndCBnZW5lcmF0ZSBhCisgIC8vIGZhdGFsIGZhaWx1cmUsIG9ubHkgYW5vdGhlciBvbmUgZG9lcy4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQodHJ1ZSksICJleHBlY3RlZCIpOworICBDaGVja1Rlc3RGYWlsdXJlQ291bnQoMik7Cit9CisKK1RFU1QoRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzVGVzdCwgRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBzdWNjZWVkLCBiZWNhdXNlIGZhaWx1cmVzIGluIGFsbCB0aHJlYWRzIGFyZQorICAvLyBjb25zaWRlcmVkLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUygKKyAgICAgIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpLCAiZXhwZWN0ZWQiKTsKKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDApOworICAvLyBXZSBuZWVkIHRvIGFkZCBhIGZhaWx1cmUsIGJlY2F1c2UgbWFpbigpIGNoZWNrcyB0aGF0IHRoZXJlIGFyZSBmYWlsdXJlcy4KKyAgLy8gQnV0IHdoZW4gb25seSB0aGlzIHRlc3QgaXMgcnVuLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkgZmFpbHVyZXMuCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgaXMgYW4gZXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKK30KKworVEVTVChOb25GYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcykgeworICAvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgZmFpbCwgc2luY2UgdGhlIGN1cnJlbnQgdGhyZWFkIGRvZXNuJ3QgZ2VuZXJhdGUgYQorICAvLyBmYXRhbCBmYWlsdXJlLCBvbmx5IGFub3RoZXIgb25lIGRvZXMuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIik7CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudCgyKTsKK30KKworVEVTVChOb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHNUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIHN1Y2NlZWQsIGJlY2F1c2UgZmFpbHVyZXMgaW4gYWxsIHRocmVhZHMgYXJlCisgIC8vIGNvbnNpZGVyZWQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKAorICAgICAgR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoZmFsc2UpLCAiZXhwZWN0ZWQiKTsKKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDApOworICAvLyBXZSBuZWVkIHRvIGFkZCBhIGZhaWx1cmUsIGJlY2F1c2UgbWFpbigpIGNoZWNrcyB0aGF0IHRoZXJlIGFyZSBmYWlsdXJlcywKKyAgLy8gQnV0IHdoZW4gb25seSB0aGlzIHRlc3QgaXMgcnVuLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkgZmFpbHVyZXMuCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgaXMgYW4gZXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGNvbnN0IGludCByZXN1bHQgPSBSVU5fQUxMX1RFU1RTKCk7ICAvLyBFeHBlY3RlZCB0byBmYWlsLgorICBHVEVTVF9DSEVDS18ocmVzdWx0ID09IDEpIDw8ICJSVU5fQUxMX1RFU1RTKCkgZGlkIG5vdCBmYWlsIGFzIGV4cGVjdGVkIjsKKworICBwcmludGYoIlxuUEFTU1xuIik7CisgIHJldHVybiAwOworfQorCisjZWxzZQorVEVTVChTdHJlc3NUZXN0LAorICAgICBESVNBQkxFRF9UaHJlYWRTYWZldHlUZXN0c0FyZVNraXBwZWRXaGVuR29vZ2xlVGVzdElzTm90VGhyZWFkU2FmZSkgeworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF90ZXN0X3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkZDhkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQpAQCAtMCwwICsxLDMwNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IHV0aWxpdGllcyBmb3IgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yay4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IGF0ZXhpdAoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorX3Rlc3RfbW9kdWxlID0gdW5pdHRlc3QKKworIyBTdXBwcmVzc2VzIHRoZSAnSW1wb3J0IG5vdCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlJyBsaW50IGNvbXBsYWludC4KKyMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjIwNAordHJ5OgorICBpbXBvcnQgc3VicHJvY2VzcworICBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFID0gVHJ1ZQorZXhjZXB0OgorICBpbXBvcnQgcG9wZW4yCisgIF9TVUJQUk9DRVNTX01PRFVMRV9BVkFJTEFCTEUgPSBGYWxzZQorIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzYyMDQKKworR1RFU1RfT1VUUFVUX1ZBUl9OQU1FID0gJ0dURVNUX09VVFBVVCcKKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworSVNfQ1lHV0lOID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCAnQ1lHV0lOJyBpbiBvcy51bmFtZSgpWzBdCisKKyMgSGVyZSB3ZSBleHBvc2UgYSBjbGFzcyBmcm9tIGEgcGFydGljdWxhciBtb2R1bGUsIGRlcGVuZGluZyBvbiB0aGUKKyMgZW52aXJvbm1lbnQuIFRoZSBjb21tZW50IHN1cHByZXNzZXMgdGhlICdJbnZhbGlkIHZhcmlhYmxlIG5hbWUnIGxpbnQKKyMgY29tcGxhaW50LgorVGVzdENhc2UgPSBfdGVzdF9tb2R1bGUuVGVzdENhc2UgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjQwOQorCisjIEluaXRpYWxseSBtYXBzIGEgZmxhZyB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gQWZ0ZXIKKyMgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKCkgaXMgY2FsbGVkLCBtYXBzIGEgZmxhZyB0byBpdHMgYWN0dWFsIHZhbHVlLgorX2ZsYWdfbWFwID0geydzb3VyY2VfZGlyJzogb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwKKyAgICAgICAgICAgICAnYnVpbGRfZGlyJzogb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKX0KK19ndGVzdF9mbGFnc19hcmVfcGFyc2VkID0gRmFsc2UKKworCitkZWYgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKGFyZ3YpOgorICAiIiJQYXJzZXMgYW5kIHN0cmlwcyBHb29nbGUgVGVzdCBmbGFncyBmcm9tIGFyZ3YuICBUaGlzIGlzIGlkZW1wb3RlbnQuIiIiCisKKyAgIyBTdXBwcmVzc2VzIHRoZSBsaW50IGNvbXBsYWludCBhYm91dCBhIGdsb2JhbCB2YXJpYWJsZSBzaW5jZSB3ZSBuZWVkIGl0CisgICMgaGVyZSB0byBtYWludGFpbiBtb2R1bGUtd2lkZSBzdGF0ZS4KKyAgZ2xvYmFsIF9ndGVzdF9mbGFnc19hcmVfcGFyc2VkICAjIHB5bGludDogZGlzYWJsZS1tc2c9VzA2MDMKKyAgaWYgX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQ6CisgICAgcmV0dXJuCisKKyAgX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQgPSBUcnVlCisgIGZvciBmbGFnIGluIF9mbGFnX21hcDoKKyAgICAjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgaWYgZmxhZy51cHBlcigpIGluIG9zLmVudmlyb246CisgICAgICBfZmxhZ19tYXBbZmxhZ10gPSBvcy5lbnZpcm9uW2ZsYWcudXBwZXIoKV0KKworICAgICMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgaSA9IDEgICMgU2tpcHMgdGhlIHByb2dyYW0gbmFtZS4KKyAgICB3aGlsZSBpIDwgbGVuKGFyZ3YpOgorICAgICAgcHJlZml4ID0gJy0tJyArIGZsYWcgKyAnPScKKyAgICAgIGlmIGFyZ3ZbaV0uc3RhcnRzd2l0aChwcmVmaXgpOgorICAgICAgICBfZmxhZ19tYXBbZmxhZ10gPSBhcmd2W2ldW2xlbihwcmVmaXgpOl0KKyAgICAgICAgZGVsIGFyZ3ZbaV0KKyAgICAgICAgYnJlYWsKKyAgICAgIGVsc2U6CisgICAgICAgICMgV2UgZG9uJ3QgaW5jcmVtZW50IGkgaW4gY2FzZSB3ZSBqdXN0IGZvdW5kIGEgLS1ndGVzdF8qIGZsYWcKKyAgICAgICAgIyBhbmQgcmVtb3ZlZCBpdCBmcm9tIGFyZ3YuCisgICAgICAgIGkgKz0gMQorCisKK2RlZiBHZXRGbGFnKGZsYWcpOgorICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmxhZy4iIiIKKworICAjIEluIGNhc2UgR2V0RmxhZygpIGlzIGNhbGxlZCBiZWZvcmUgTWFpbigpLCB3ZSBhbHdheXMgY2FsbAorICAjIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncygpIGhlcmUgdG8gbWFrZSBzdXJlIHRoZSAtLWd0ZXN0XyogZmxhZ3MKKyAgIyBhcmUgcGFyc2VkLgorICBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3Moc3lzLmFyZ3YpCisKKyAgcmV0dXJuIF9mbGFnX21hcFtmbGFnXQorCisKK2RlZiBHZXRTb3VyY2VEaXIoKToKKyAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSAucHkgZmlsZXMgYXJlLiIiIgorCisgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoR2V0RmxhZygnc291cmNlX2RpcicpKQorCisKK2RlZiBHZXRCdWlsZERpcigpOgorICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRlc3QgYmluYXJpZXMgYXJlLiIiIgorCisgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoR2V0RmxhZygnYnVpbGRfZGlyJykpCisKKworX3RlbXBfZGlyID0gTm9uZQorCitkZWYgX1JlbW92ZVRlbXBEaXIoKToKKyAgaWYgX3RlbXBfZGlyOgorICAgIHNodXRpbC5ybXRyZWUoX3RlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKK2F0ZXhpdC5yZWdpc3RlcihfUmVtb3ZlVGVtcERpcikKKworCitkZWYgR2V0VGVtcERpcigpOgorICAiIiJSZXR1cm5zIGEgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgZmlsZXMuIiIiCisKKyAgZ2xvYmFsIF90ZW1wX2RpcgorICBpZiBub3QgX3RlbXBfZGlyOgorICAgIF90ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICByZXR1cm4gX3RlbXBfZGlyCisKKworZGVmIEdldFRlc3RFeGVjdXRhYmxlUGF0aChleGVjdXRhYmxlX25hbWUsIGJ1aWxkX2Rpcj1Ob25lKToKKyAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGVzdCBiaW5hcnkgZ2l2ZW4gaXRzIG5hbWUuCisKKyAgVGhlIGZ1bmN0aW9uIHdpbGwgcHJpbnQgYSBtZXNzYWdlIGFuZCBhYm9ydCB0aGUgcHJvZ3JhbSBpZiB0aGUgcmVzdWx0aW5nIGZpbGUKKyAgZG9lc24ndCBleGlzdC4KKworICBBcmdzOgorICAgIGV4ZWN1dGFibGVfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBiaW5hcnkgdGhhdCB0aGUgdGVzdCBzY3JpcHQgcnVucy4KKyAgICBidWlsZF9kaXI6ICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBsb29rIGZvciBleGVjdXRhYmxlcywgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiBHZXRCdWlsZERpcigpLgorCisgIFJldHVybnM6CisgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRlc3QgYmluYXJ5LgorICAiIiIKKworICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihidWlsZF9kaXIgb3IgR2V0QnVpbGREaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9uYW1lKSkKKyAgaWYgKElTX1dJTkRPV1Mgb3IgSVNfQ1lHV0lOKSBhbmQgbm90IHBhdGguZW5kc3dpdGgoJy5leGUnKToKKyAgICBwYXRoICs9ICcuZXhlJworCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICBtZXNzYWdlID0gKAorICAgICAgICAnVW5hYmxlIHRvIGZpbmQgdGhlIHRlc3QgYmluYXJ5LiBQbGVhc2UgbWFrZSBzdXJlIHRvIHByb3ZpZGUgcGF0aFxuJworICAgICAgICAndG8gdGhlIGJpbmFyeSB2aWEgdGhlIC0tYnVpbGRfZGlyIGZsYWcgb3IgdGhlIEJVSUxEX0RJUlxuJworICAgICAgICAnZW52aXJvbm1lbnQgdmFyaWFibGUuJykKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtZXNzYWdlCisgICAgc3lzLmV4aXQoMSkKKworICByZXR1cm4gcGF0aAorCisKK2RlZiBHZXRFeGl0U3RhdHVzKGV4aXRfY29kZSk6CisgICIiIlJldHVybnMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSwgb3IgLTEgaWYgZXhpdCgpIHdhc24ndCBjYWxsZWQuCisKKyAgQXJnczoKKyAgICBleGl0X2NvZGU6IHRoZSByZXN1bHQgdmFsdWUgb2Ygb3Muc3lzdGVtKGNvbW1hbmQpLgorICAiIiIKKworICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgIyBPbiBXaW5kb3dzLCBvcy5XRVhJVFNUQVRVUygpIGRvZXNuJ3Qgd29yayBhbmQgb3Muc3lzdGVtKCkgcmV0dXJucworICAgICMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSBkaXJlY3RseS4KKyAgICByZXR1cm4gZXhpdF9jb2RlCisgIGVsc2U6CisgICAgIyBPbiBVbml4LCBvcy5XRVhJVFNUQVRVUygpIG11c3QgYmUgdXNlZCB0byBleHRyYWN0IHRoZSBleGl0IHN0YXR1cworICAgICMgZnJvbSB0aGUgcmVzdWx0IG9mIG9zLnN5c3RlbSgpLgorICAgIGlmIG9zLldJRkVYSVRFRChleGl0X2NvZGUpOgorICAgICAgcmV0dXJuIG9zLldFWElUU1RBVFVTKGV4aXRfY29kZSkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIC0xCisKKworY2xhc3MgU3VicHJvY2VzczoKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIHdvcmtpbmdfZGlyPU5vbmUsIGNhcHR1cmVfc3RkZXJyPVRydWUsIGVudj1Ob25lKToKKyAgICAiIiJDaGFuZ2VzIGludG8gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBpZiBwcm92aWRlZCwgYW5kIGV4ZWN1dGVzIGEgY29tbWFuZC4KKworICAgIFJlc3RvcmVzIHRoZSBvbGQgZGlyZWN0b3J5IGFmdGVyd2FyZHMuCisKKyAgICBBcmdzOgorICAgICAgY29tbWFuZDogICAgICAgIFRoZSBjb21tYW5kIHRvIHJ1biwgaW4gdGhlIGZvcm0gb2Ygc3lzLmFyZ3YuCisgICAgICB3b3JraW5nX2RpcjogICAgVGhlIGRpcmVjdG9yeSB0byBjaGFuZ2UgaW50by4KKyAgICAgIGNhcHR1cmVfc3RkZXJyOiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY2FwdHVyZSBzdGRlcnIgaW4gdGhlIG91dHB1dCBtZW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICBvciB0byBkaXNjYXJkIGl0LgorICAgICAgZW52OiAgICAgICAgICAgIERpY3Rpb25hcnkgd2l0aCBlbnZpcm9ubWVudCB0byBwYXNzIHRvIHRoZSBzdWJwcm9jZXNzLgorCisgICAgUmV0dXJuczoKKyAgICAgIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgb3V0Y29tZSBvZiB0aGUgZXhlY3V0ZWQgcHJvY2Vzcy4gSXQgaGFzIHRoZQorICAgICAgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAgICAgIHRlcm1pbmF0ZWRfYnlfc2lnbmFsICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gdGVybWluYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGEgc2lnbmFsLgorICAgICAgICBzaWduYWwgICAgICAgICAgICAgICAgIFN5Z25hbCB0aGF0IHRlcm1pbmF0ZWQgdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICAgIGV4aXRlZCAgICAgICAgICAgICAgICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkIG5vcm1hbGx5LgorICAgICAgICBleGl0X2NvZGUgICAgICAgICAgICAgIFRoZSBjb2RlIHdpdGggd2hpY2ggdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkLgorICAgICAgICBvdXRwdXQgICAgICAgICAgICAgICAgIENoaWxkIHByb2Nlc3MncyBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCBpbiBhIHN0cmluZy4KKyAgICAiIiIKKworICAgICMgVGhlIHN1YnByb2Nlc3MgbW9kdWxlIGlzIHRoZSBwcmVmZXJyYWJsZSB3YXkgb2YgcnVubmluZyBwcm9ncmFtcworICAgICMgc2luY2UgaXQgaXMgYXZhaWxhYmxlIGFuZCBiZWhhdmVzIGNvbnNpc3RlbnRseSBvbiBhbGwgcGxhdGZvcm1zLAorICAgICMgaW5jbHVkaW5nIFdpbmRvd3MuIEJ1dCBpdCBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyBpbiBweXRob24gMi40LgorICAgICMgSW4gZWFybGllciBweXRob24gdmVyc2lvbnMsIHdlIHJldmVydCB0byB0aGUgcG9wZW4yIG1vZHVsZSwgd2hpY2ggaXMKKyAgICAjIGF2YWlsYWJsZSBpbiBweXRob24gMi4wIGFuZCBsYXRlciBidXQgZG9lc24ndCBwcm92aWRlIHJlcXVpcmVkCisgICAgIyBmdW5jdGlvbmFsaXR5IChQb3BlbjQpIHVuZGVyIFdpbmRvd3MuIFRoaXMgYWxsb3dzIHVzIHRvIHN1cHBvcnQgTWFjCisgICAgIyBPUyBYIDEwLjQgVGlnZXIsIHdoaWNoIGhhcyBweXRob24gMi4zIGluc3RhbGxlZC4KKyAgICBpZiBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFOgorICAgICAgaWYgY2FwdHVyZV9zdGRlcnI6CisgICAgICAgIHN0ZGVyciA9IHN1YnByb2Nlc3MuU1RET1VUCisgICAgICBlbHNlOgorICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlBJUEUKKworICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9d29ya2luZ19kaXIsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLCBlbnY9ZW52KQorICAgICAgIyBjb21tdW5pY2F0ZSByZXR1cm5zIGEgdHVwbGUgd2l0aCB0aGUgZmlsZSBvYmVjdCBmb3IgdGhlIGNoaWxkJ3MKKyAgICAgICMgb3V0cHV0LgorICAgICAgc2VsZi5vdXRwdXQgPSBwLmNvbW11bmljYXRlKClbMF0KKyAgICAgIHNlbGYuX3JldHVybl9jb2RlID0gcC5yZXR1cm5jb2RlCisgICAgZWxzZToKKyAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorCisgICAgICBkZWYgX1JlcGxhY2VFbnZEaWN0KGRlc3QsIHNyYyk6CisgICAgICAgICMgQ2hhbmdlcyBtYWRlIGJ5IG9zLmVudmlyb24uY2xlYXIgYXJlIG5vdCBpbmhlcml0YWJsZSBieSBjaGlsZAorICAgICAgICAjIHByb2Nlc3NlcyB1bnRpbCBQeXRob24gMi42LiBUbyBwcm9kdWNlIGluaGVyaXRhYmxlIGNoYW5nZXMgd2UgaGF2ZQorICAgICAgICAjIHRvIGRlbGV0ZSBlbnZpcm9ubWVudCBpdGVtcyB3aXRoIHRoZSBkZWwgc3RhdGVtZW50LgorICAgICAgICBmb3Iga2V5IGluIGRlc3Qua2V5cygpOgorICAgICAgICAgIGRlbCBkZXN0W2tleV0KKyAgICAgICAgZGVzdC51cGRhdGUoc3JjKQorCisgICAgICAjIFdoZW4gJ2VudicgaXMgbm90IE5vbmUsIGJhY2t1cCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCByZXBsYWNlCisgICAgICAjIHRoZW0gd2l0aCB0aGUgcGFzc2VkICdlbnYnLiBXaGVuICdlbnYnIGlzIE5vbmUsIHdlIHNpbXBseSB1c2UgdGhlCisgICAgICAjIGN1cnJlbnQgJ29zLmVudmlyb24nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHN1YnByb2Nlc3MuUG9wZW4KKyAgICAgICMgc2VtYW50aWNzIHVzZWQgYWJvdmUuCisgICAgICBpZiBlbnYgaXMgbm90IE5vbmU6CisgICAgICAgIG9sZF9lbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgX1JlcGxhY2VFbnZEaWN0KG9zLmVudmlyb24sIGVudikKKworICAgICAgdHJ5OgorICAgICAgICBpZiB3b3JraW5nX2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICBvcy5jaGRpcih3b3JraW5nX2RpcikKKyAgICAgICAgaWYgY2FwdHVyZV9zdGRlcnI6CisgICAgICAgICAgcCA9IHBvcGVuMi5Qb3BlbjQoY29tbWFuZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwID0gcG9wZW4yLlBvcGVuMyhjb21tYW5kKQorICAgICAgICBwLnRvY2hpbGQuY2xvc2UoKQorICAgICAgICBzZWxmLm91dHB1dCA9IHAuZnJvbWNoaWxkLnJlYWQoKQorICAgICAgICByZXRfY29kZSA9IHAud2FpdCgpCisgICAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgICMgUmVzdG9yZSB0aGUgb2xkIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgICAjIGlmIHRoZXkgd2VyZSByZXBsYWNlZC4KKyAgICAgICAgaWYgZW52IGlzIG5vdCBOb25lOgorICAgICAgICAgIF9SZXBsYWNlRW52RGljdChvcy5lbnZpcm9uLCBvbGRfZW52aXJvbikKKworICAgICAgIyBDb252ZXJ0cyByZXRfY29kZSB0byBtYXRjaCB0aGUgc2VtYW50aWNzIG9mCisgICAgICAjIHN1YnByb2Nlc3MuUG9wZW4ucmV0dXJuY29kZS4KKyAgICAgIGlmIG9zLldJRlNJR05BTEVEKHJldF9jb2RlKToKKyAgICAgICAgc2VsZi5fcmV0dXJuX2NvZGUgPSAtb3MuV1RFUk1TSUcocmV0X2NvZGUpCisgICAgICBlbHNlOiAgIyBvcy5XSUZFWElURUQocmV0X2NvZGUpIHNob3VsZCByZXR1cm4gVHJ1ZSBoZXJlLgorICAgICAgICBzZWxmLl9yZXR1cm5fY29kZSA9IG9zLldFWElUU1RBVFVTKHJldF9jb2RlKQorCisgICAgaWYgc2VsZi5fcmV0dXJuX2NvZGUgPCAwOgorICAgICAgc2VsZi50ZXJtaW5hdGVkX2J5X3NpZ25hbCA9IFRydWUKKyAgICAgIHNlbGYuZXhpdGVkID0gRmFsc2UKKyAgICAgIHNlbGYuc2lnbmFsID0gLXNlbGYuX3JldHVybl9jb2RlCisgICAgZWxzZToKKyAgICAgIHNlbGYudGVybWluYXRlZF9ieV9zaWduYWwgPSBGYWxzZQorICAgICAgc2VsZi5leGl0ZWQgPSBUcnVlCisgICAgICBzZWxmLmV4aXRfY29kZSA9IHNlbGYuX3JldHVybl9jb2RlCisKKworZGVmIE1haW4oKToKKyAgIiIiUnVucyB0aGUgdW5pdCB0ZXN0LiIiIgorCisgICMgV2UgbXVzdCBjYWxsIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncygpIGJlZm9yZSBjYWxsaW5nCisgICMgdW5pdHRlc3QubWFpbigpLiAgT3RoZXJ3aXNlIHRoZSBsYXR0ZXIgd2lsbCBiZSBjb25mdXNlZCBieSB0aGUKKyAgIyAtLWd0ZXN0XyogZmxhZ3MuCisgIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncyhzeXMuYXJndikKKyAgIyBUaGUgdGVzdGVkIGJpbmFyaWVzIHNob3VsZCBub3QgYmUgd3JpdGluZyBYTUwgb3V0cHV0IGZpbGVzIHVubGVzcyB0aGUKKyAgIyBzY3JpcHQgZXhwbGljaXRseSBpbnN0cnVjdHMgdGhlbSB0by4KKyAgIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBNb3ZlIHRoaXMgaW50byBTdWJwcm9jZXNzIHdoZW4gd2UgaW1wbGVtZW50CisgICMgcGFzc2luZyBlbnZpcm9ubWVudCBpbnRvIGl0IGFzIGEgcGFyYW1ldGVyLgorICBpZiBHVEVTVF9PVVRQVVRfVkFSX05BTUUgaW4gb3MuZW52aXJvbjoKKyAgICBkZWwgb3MuZW52aXJvbltHVEVTVF9PVVRQVVRfVkFSX05BTUVdCisKKyAgX3Rlc3RfbW9kdWxlLm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NmM3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGVzdHMgR29vZ2xlIFRlc3QncyB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGVuYWJsZWQuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cyB0aGUgcHJvZ3JhbSB3aXRoCisvLyBub24temVyby4gIFdlIHVzZSB0aGlzIGluc3RlYWQgb2YgYSBHb29nbGUgVGVzdCBhc3NlcnRpb24gdG8KKy8vIGluZGljYXRlIGEgZmFpbHVyZSwgYXMgdGhlIGxhdHRlciBpcyBiZWVuIHRlc3RlZCBhbmQgY2Fubm90IGJlCisvLyByZWxpZWQgb24uCit2b2lkIEZhaWwoY29uc3QgY2hhciogbXNnKSB7CisgIHByaW50ZigiRkFJTFVSRTogJXNcbiIsIG1zZyk7CisgIGZmbHVzaChzdGRvdXQpOworICBleGl0KDEpOworfQorCisvLyBUZXN0cyB0aGF0IGFuIGFzc2VydGlvbiBmYWlsdXJlIHRocm93cyBhIHN1YmNsYXNzIG9mCisvLyBzdGQ6OnJ1bnRpbWVfZXJyb3IuCit2b2lkIFRlc3RGYWlsdXJlVGhyb3dzUnVudGltZUVycm9yKCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTsKKworICAvLyBBIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHNob3VsZG4ndCB0aHJvdy4KKyAgdHJ5IHsKKyAgICBFWFBFQ1RfRVEoMywgMyk7CisgIH0gY2F0Y2goLi4uKSB7CisgICAgRmFpbCgiQSBzdWNjZXNzZnVsIGFzc2VydGlvbiB3cm9uZ2Z1bGx5IHRocmV3LiIpOworICB9CisKKyAgLy8gQSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCB0aHJvdyBhIHN1YmNsYXNzIG9mIHN0ZDo6cnVudGltZV9lcnJvci4KKyAgdHJ5IHsKKyAgICBFWFBFQ1RfRVEoMiwgMykgPDwgIkV4cGVjdGVkIGZhaWx1cmUiOworICB9IGNhdGNoKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYgZSkgeworICAgIGlmIChzdHJzdHIoZS53aGF0KCksICJFeHBlY3RlZCBmYWlsdXJlIikgIT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQSBmYWlsZWQgYXNzZXJ0aW9uIGRpZCB0aHJvdyBhbiBleGNlcHRpb24gb2YgdGhlIHJpZ2h0IHR5cGUsICIKKyAgICAgICAgICAgImJ1dCB0aGUgbWVzc2FnZSBpcyBpbmNvcnJlY3QuICBJbnN0ZWFkIG9mIGNvbnRhaW5pbmcgXCJFeHBlY3RlZCAiCisgICAgICAgICAgICJmYWlsdXJlXCIsIGl0IGlzOlxuIik7CisgICAgRmFpbChlLndoYXQoKSk7CisgIH0gY2F0Y2goLi4uKSB7CisgICAgRmFpbCgiQSBmYWlsZWQgYXNzZXJ0aW9uIHRocmV3IHRoZSB3cm9uZyB0eXBlIG9mIGV4Y2VwdGlvbi4iKTsKKyAgfQorICBGYWlsKCJBIGZhaWxlZCBhc3NlcnRpb24gc2hvdWxkJ3ZlIHRocm93biBidXQgZGlkbid0LiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgcGVvcGxlIGNhbiB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbgorICAvLyBvdGhlciB0ZXN0aW5nIGZyYW1ld29ya3MsIGFzIGxvbmcgYXMgdGhleSBpbml0aWFsaXplIEdvb2dsZSBUZXN0CisgIC8vIHByb3Blcmx5IGFuZCBzZXQgdGhlIHRocm93bi1vbi1mYWlsdXJlIG1vZGUuICBUaGVyZWZvcmUsIHdlIGRvbid0CisgIC8vIHVzZSBHb29nbGUgVGVzdCdzIGNvbnN0cnVjdHMgZm9yIGRlZmluaW5nIGFuZCBydW5uaW5nIHRlc3RzCisgIC8vIChlLmcuIFRFU1QgYW5kIFJVTl9BTExfVEVTVFMpIGhlcmUuCisKKyAgVGVzdEZhaWx1cmVUaHJvd3NSdW50aW1lRXJyb3IoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Njc4ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weQpAQCAtMCwwICsxLDE3MSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgR29vZ2xlIFRlc3QncyB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorCitUaGlzIHNjcmlwdCBpbnZva2VzIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGgKK0dvb2dsZSBUZXN0KSB3aXRoIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYW5kIGNvbW1hbmQgbGluZSBmbGFncy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworIyBDb25zdGFudHMuCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZS4KK1RIUk9XX09OX0ZBSUxVUkUgPSAnZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZScKKworIyBQYXRoIHRvIHRoZSBndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfIHByb2dyYW0sIGNvbXBpbGVkIHdpdGgKKyMgZXhjZXB0aW9ucyBkaXNhYmxlZC4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgJ2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8nKQorCisKKyMgVXRpbGl0aWVzLgorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgZ2l2ZW4gdmFsdWU7IHVuc2V0cyBpdCB3aGVuIHRoZQorICBnaXZlbiB2YWx1ZSBpcyBOb25lLgorICAiIiIKKworICBlbnZfdmFyID0gZW52X3Zhci51cHBlcigpCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIG9zLmVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gb3MuZW52aXJvbjoKKyAgICBkZWwgb3MuZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBSdW4oY29tbWFuZCk6CisgICIiIlJ1bnMgYSBjb21tYW5kOyByZXR1cm5zIFRydWUvRmFsc2UgaWYgaXRzIGV4aXQgY29kZSBpcy9pc24ndCAwLiIiIgorCisgIHByaW50ICdSdW5uaW5nICIlcyIuIC4gLicgJSAnICcuam9pbihjb21tYW5kKQorICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCisgIHJldHVybiBwLmV4aXRlZCBhbmQgcC5leGl0X2NvZGUgPT0gMAorCisKKyMgVGhlIHRlc3RzLiAgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlZmFjdG9yIHRoZSBjbGFzcyB0byBzaGFyZSBjb21tb24KKyMgbG9naWMgd2l0aCBjb2RlIGluIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkuCitjbGFzcyBUaHJvd09uRmFpbHVyZVRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuIiIiCisKKyAgZGVmIFJ1bkFuZFZlcmlmeShzZWxmLCBlbnZfdmFyX3ZhbHVlLCBmbGFnX3ZhbHVlLCBzaG91bGRfZmFpbCk6CisgICAgIiIiUnVucyBndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfIGFuZCB2ZXJpZmllcyB0aGF0IGl0IGRvZXMKKyAgICAob3IgZG9lcyBub3QpIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGNvZGUuCisKKyAgICBBcmdzOgorICAgICAgZW52X3Zhcl92YWx1ZTogICAgdmFsdWUgb2YgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOyBOb25lIGlmIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgdW5zZXQuCisgICAgICBmbGFnX3ZhbHVlOiAgICAgICB2YWx1ZSBvZiB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWc7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KKyAgICAgIHNob3VsZF9mYWlsOiAgICAgIFRydWUgaWZmIHRoZSBwcm9ncmFtIGlzIGV4cGVjdGVkIHRvIGZhaWwuCisgICAgIiIiCisKKyAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRSwgZW52X3Zhcl92YWx1ZSkKKworICAgIGlmIGVudl92YXJfdmFsdWUgaXMgTm9uZToKKyAgICAgIGVudl92YXJfdmFsdWVfbXNnID0gJyBpcyBub3Qgc2V0JworICAgIGVsc2U6CisgICAgICBlbnZfdmFyX3ZhbHVlX21zZyA9ICc9JyArIGVudl92YXJfdmFsdWUKKworICAgIGlmIGZsYWdfdmFsdWUgaXMgTm9uZToKKyAgICAgIGZsYWcgPSAnJworICAgIGVsaWYgZmxhZ192YWx1ZSA9PSAnMCc6CisgICAgICBmbGFnID0gJy0tJXM9MCcgJSBUSFJPV19PTl9GQUlMVVJFCisgICAgZWxzZToKKyAgICAgIGZsYWcgPSAnLS0lcycgJSBUSFJPV19PTl9GQUlMVVJFCisKKyAgICBjb21tYW5kID0gW0VYRV9QQVRIXQorICAgIGlmIGZsYWc6CisgICAgICBjb21tYW5kLmFwcGVuZChmbGFnKQorCisgICAgaWYgc2hvdWxkX2ZhaWw6CisgICAgICBzaG91bGRfb3Jfbm90ID0gJ3Nob3VsZCcKKyAgICBlbHNlOgorICAgICAgc2hvdWxkX29yX25vdCA9ICdzaG91bGQgbm90JworCisgICAgZmFpbGVkID0gbm90IFJ1bihjb21tYW5kKQorCisgICAgU2V0RW52VmFyKFRIUk9XX09OX0ZBSUxVUkUsIE5vbmUpCisKKyAgICBtc2cgPSAoJ3doZW4gJXMlcywgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaW4gIiVzIiAlcyBjYXVzZSBhIG5vbi16ZXJvICcKKyAgICAgICAgICAgJ2V4aXQgY29kZS4nICUKKyAgICAgICAgICAgKFRIUk9XX09OX0ZBSUxVUkUsIGVudl92YXJfdmFsdWVfbXNnLCAnICcuam9pbihjb21tYW5kKSwKKyAgICAgICAgICAgIHNob3VsZF9vcl9ub3QpKQorICAgIHNlbGYuYXNzZXJ0XyhmYWlsZWQgPT0gc2hvdWxkX2ZhaWwsIG1zZykKKworICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgbW9kZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwgZmxhZ192YWx1ZT1Ob25lLCBzaG91bGRfZmFpbD1GYWxzZSkKKworICBkZWYgdGVzdFRocm93T25GYWlsdXJlRW52VmFyKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSBHVEVTVF9USFJPV19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPUZhbHNlKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1UcnVlKQorCisgIGRlZiB0ZXN0VGhyb3dPbkZhaWx1cmVGbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUgZmxhZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1GYWxzZSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9VHJ1ZSkKKworICBkZWYgdGVzdFRocm93T25GYWlsdXJlRmxhZ092ZXJyaWRlc0VudlZhcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBvdmVycmlkZXMgR1RFU1RfVEhST1dfT05fRkFJTFVSRS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPUZhbHNlKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPVRydWUpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9RmFsc2UpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9VHJ1ZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg4ZmUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGVzdHMgR29vZ2xlIFRlc3QncyB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBtdXN0IGJlIGNvbXBpbGVkIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZC4gIEl0IHdpbGwgYmUKKy8vIGludm9rZWQgYnkgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5LCBhbmQgaXMgZXhwZWN0ZWQgdG8gZXhpdAorLy8gd2l0aCBub24temVybyBpbiB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlIG9yIDAgb3RoZXJ3aXNlLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBmZmx1c2gsIGZwcmludGYsIE5VTEwsIGV0Yy4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhpdAorI2luY2x1ZGUgPGV4Y2VwdGlvbj4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBzZXRfdGVybWluYXRlCisKKy8vIFRoaXMgdGVybWluYXRlIGhhbmRsZXIgYWJvcnRzIHRoZSBwcm9ncmFtIHVzaW5nIGV4aXQoKSByYXRoZXIgdGhhbiBhYm9ydCgpLgorLy8gVGhpcyBhdm9pZHMgc2hvd2luZyBwb3AtdXBzIG9uIFdpbmRvd3Mgc3lzdGVtcyBhbmQgY29yZSBkdW1wcyBvbiBVbml4LWxpa2UKKy8vIG9uZXMuCit2b2lkIFRlcm1pbmF0ZUhhbmRsZXIoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsICJVbmhhbmRsZWQgQysrIGV4Y2VwdGlvbiB0ZXJtaW5hdGluZyB0aGUgcHJvZ3JhbS4iKTsKKyAgZmZsdXNoKE5VTEwpOworICBleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICBzdGQ6OnNldF90ZXJtaW5hdGUoJlRlcm1pbmF0ZUhhbmRsZXIpOworI2VuZGlmCisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHBlb3BsZSBjYW4gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4KKyAgLy8gb3RoZXIgdGVzdGluZyBmcmFtZXdvcmtzLCBhcyBsb25nIGFzIHRoZXkgaW5pdGlhbGl6ZSBHb29nbGUgVGVzdAorICAvLyBwcm9wZXJseSBhbmQgc2V0IHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuICBUaGVyZWZvcmUsIHdlIGRvbid0CisgIC8vIHVzZSBHb29nbGUgVGVzdCdzIGNvbnN0cnVjdHMgZm9yIGRlZmluaW5nIGFuZCBydW5uaW5nIHRlc3RzCisgIC8vIChlLmcuIFRFU1QgYW5kIFJVTl9BTExfVEVTVFMpIGhlcmUuCisKKyAgLy8gSW4gdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQsIHRoaXMKKyAgLy8gYXNzZXJ0aW9uIHdpbGwgY2F1c2UgdGhlIHByb2dyYW0gdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KKyAgRVhQRUNUX0VRKDIsIDMpOworCisgIC8vIFdoZW4gbm90IGluIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUsIHRoZSBjb250cm9sIHdpbGwgcmVhY2gKKyAgLy8gaGVyZS4KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YWU1N2VlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IHdhcm5zIHRoZSB1c2VyIHdoZW4gbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0XycpCisKKworZGVmIEFzc2VydChjb25kaXRpb24pOgorICBpZiBub3QgY29uZGl0aW9uOgorICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisKKworZGVmIEFzc2VydEVxKGV4cGVjdGVkLCBhY3R1YWwpOgorICBpZiBleHBlY3RlZCAhPSBhY3R1YWw6CisgICAgcHJpbnQgJ0V4cGVjdGVkOiAlcycgJSAoZXhwZWN0ZWQsKQorICAgIHByaW50ICcgIEFjdHVhbDogJXMnICUgKGFjdHVhbCwpCisgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKworCitkZWYgVGVzdEV4aXRDb2RlQW5kT3V0cHV0KGNvbW1hbmQpOgorICAiIiJSdW5zIHRoZSBnaXZlbiBjb21tYW5kIGFuZCB2ZXJpZmllcyBpdHMgZXhpdCBjb2RlIGFuZCBvdXRwdXQuIiIiCisKKyAgIyBWZXJpZmllcyB0aGF0ICdjb21tYW5kJyBleGl0cyB3aXRoIGNvZGUgMS4KKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQorICBBc3NlcnQocC5leGl0ZWQpCisgIEFzc2VydEVxKDEsIHAuZXhpdF9jb2RlKQorICBBc3NlcnQoJ0luaXRHb29nbGVUZXN0JyBpbiBwLm91dHB1dCkKKworCitjbGFzcyBHVGVzdFVuaW5pdGlhbGl6ZWRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgdGVzdEV4aXRDb2RlQW5kT3V0cHV0KHNlbGYpOgorICAgIFRlc3RFeGl0Q29kZUFuZE91dHB1dChDT01NQU5EKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzE2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYwpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworVEVTVChEdW1teVRlc3QsIER1bW15KSB7CisgIC8vIFRoaXMgdGVzdCBkb2Vzbid0IHZlcmlmeSBhbnl0aGluZy4gIFdlIGp1c3QgbmVlZCBpdCB0byBjcmVhdGUgYQorICAvLyByZWFsaXN0aWMgc3RhZ2UgZm9yIHRlc3RpbmcgdGhlIGJlaGF2aW9yIG9mIEdvb2dsZSBUZXN0IHdoZW4KKyAgLy8gUlVOX0FMTF9URVNUUygpIGlzIGNhbGxlZCB3aXRob3V0IHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkgYmVpbmcKKyAgLy8gY2FsbGVkIGZpcnN0LgorfQorCitpbnQgbWFpbigpIHsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGYzMDQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNzI0MCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBiYXNpYyBjb25zdHJ1Y3RzIG9mCisvLyBHb29nbGUgVGVzdCB3b3JrLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29tbWFuZCBsaW5lIGZsYWcgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZAorLy8gaW4gY29kZSBvbmNlIDxndGVzdC9ndGVzdC5oPiBoYXMgYmVlbiAjaW5jbHVkZWQuCisvLyBEbyBub3QgbW92ZSBpdCBhZnRlciBvdGhlciAjaW5jbHVkZXMuCitURVNUKENvbW1hbmRMaW5lRmxhZ3NUZXN0LCBDYW5CZUFjY2Vzc2VkSW5Db2RlT25jZUdUZXN0SElzSW5jbHVkZWQpIHsKKyAgYm9vbCBkdW1teSA9IHRlc3Rpbmc6OkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNvbG9yKSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcobGlzdF90ZXN0cykKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcob3V0cHV0KSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCkgPiAwCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzaHVmZmxlKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPiAwCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pICE9ICJ1bmtub3duIgorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgRVhQRUNUX1RSVUUoZHVtbXkgfHwgIWR1bW15KTsgIC8vIFN1cHByZXNzZXMgd2FybmluZyB0aGF0IGR1bW15IGlzIHVudXNlZC4KK30KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gRm9yIElOVF9NQVguCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcm92aWRlcyBhY2Nlc3MgdG8gb3RoZXJ3aXNlIHByaXZhdGUgcGFydHMgb2YgdGhlIFRlc3RFdmVudExpc3RlbmVycyBjbGFzcworLy8gdGhhdCBhcmUgbmVlZGVkIHRvIHRlc3QgaXQuCitjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvciB7CisgcHVibGljOgorICBzdGF0aWMgVGVzdEV2ZW50TGlzdGVuZXIqIEdldFJlcGVhdGVyKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzKSB7CisgICAgcmV0dXJuIGxpc3RlbmVycy0+cmVwZWF0ZXIoKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgICBsaXN0ZW5lcnMtPlNldERlZmF1bHRSZXN1bHRQcmludGVyKGxpc3RlbmVyKTsKKyAgfQorICBzdGF0aWMgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICAgIGxpc3RlbmVycy0+U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihsaXN0ZW5lcik7CisgIH0KKworICBzdGF0aWMgYm9vbCBFdmVudEZvcndhcmRpbmdFbmFibGVkKGNvbnN0IFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzKSB7CisgICAgcmV0dXJuIGxpc3RlbmVycy5FdmVudEZvcndhcmRpbmdFbmFibGVkKCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZyhUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycykgeworICAgIGxpc3RlbmVycy0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0OwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzczsKK3VzaW5nIHRlc3Rpbmc6OkRvdWJsZUxFOwordXNpbmcgdGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIHRlc3Rpbmc6OkZsb2F0TEU7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhjb2xvcik7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhmaWx0ZXIpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhsaXN0X3Rlc3RzKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcob3V0cHV0KTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzaHVmZmxlKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7Cit1c2luZyB0ZXN0aW5nOjpJc05vdFN1YnN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6OklzU3Vic3RyaW5nOwordXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOwordXNpbmcgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOwordXNpbmcgdGVzdGluZzo6VGVzdDsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RDYXNlOwordXNpbmcgdGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5OwordXNpbmcgdGVzdGluZzo6VGVzdFByb3BlcnR5OwordXNpbmcgdGVzdGluZzo6VGVzdFJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OlRpbWVJbk1pbGxpczsKK3VzaW5nIHRlc3Rpbmc6OlVuaXRUZXN0OwordXNpbmcgdGVzdGluZzo6a01heFN0YWNrVHJhY2VEZXB0aDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBZGRSZWZlcmVuY2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBcHBlbmRVc2VyTWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBcnJheUF3YXJlRmluZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBcnJheUVxOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNvZGVQb2ludFRvVXRmODsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDb3B5QXJyYXk7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q291bnRJZjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpFcUZhaWx1cmU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RmxvYXRpbmdQb2ludDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb3JFYWNoOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kczsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHVGVzdEZsYWdTYXZlcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldEVsZW1lbnRPcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXROZXh0UmFuZG9tU2VlZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRSYW5kb21TZWVkRnJvbUZsYWc7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VGVzdFR5cGVJZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRUaW1lSW5NaWxsaXM7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VHlwZUlkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdGx5Q29udmVydGlibGU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzJGcm9tRW52T3JEaWU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OklzQ29udGFpbmVyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OklzQ29udGFpbmVyVGVzdDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc05vdENvbnRhaW5lcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpOYXRpdmVBcnJheTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpQYXJzZUludDMyRmxhZzsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVDb25zdDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVSZWZlcmVuY2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2hvdWxkUnVuVGVzdE9uU2hhcmQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2hvdWxkU2hhcmQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2hvdWxkVXNlQ29sb3I7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2h1ZmZsZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaHVmZmxlUmFuZ2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2tpcFByZWZpeDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlRlc3RSZXN1bHRBY2Nlc3NvcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpVSW50MzI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmODsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjprQ29weTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjprTWF4UmFuZG9tU2VlZDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjprUmVmZXJlbmNlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI7CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q2FwdHVyZVN0ZG91dDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRDYXB0dXJlZFN0ZG91dDsKKyNlbmRpZgorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlRocmVhZFdpdGhQYXJhbTsKKyNlbmRpZgorCitjbGFzcyBUZXN0aW5nVmVjdG9yIDogcHVibGljIHN0ZDo6dmVjdG9yPGludD4geworfTsKKworOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7CisgIG9zIDw8ICJ7ICI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgb3MgPDwgdmVjdG9yW2ldIDw8ICIgIjsKKyAgfQorICBvcyA8PCAifSI7CisgIHJldHVybiBvczsKK30KKworLy8gVGhpcyBsaW5lIHRlc3RzIHRoYXQgd2UgY2FuIGRlZmluZSB0ZXN0cyBpbiBhbiB1bm5hbWVkIG5hbWVzcGFjZS4KK25hbWVzcGFjZSB7CisKK1RFU1QoR2V0UmFuZG9tU2VlZEZyb21GbGFnVGVzdCwgSGFuZGxlc1plcm8pIHsKKyAgY29uc3QgaW50IHNlZWQgPSBHZXRSYW5kb21TZWVkRnJvbUZsYWcoMCk7CisgIEVYUEVDVF9MRSgxLCBzZWVkKTsKKyAgRVhQRUNUX0xFKHNlZWQsIHN0YXRpY19jYXN0PGludD4oa01heFJhbmRvbVNlZWQpKTsKK30KKworVEVTVChHZXRSYW5kb21TZWVkRnJvbUZsYWdUZXN0LCBQcmVzZXJ2ZXNWYWxpZFNlZWQpIHsKKyAgRVhQRUNUX0VRKDEsIEdldFJhbmRvbVNlZWRGcm9tRmxhZygxKSk7CisgIEVYUEVDVF9FUSgyLCBHZXRSYW5kb21TZWVkRnJvbUZsYWcoMikpOworICBFWFBFQ1RfRVEoa01heFJhbmRvbVNlZWQgLSAxLCBHZXRSYW5kb21TZWVkRnJvbUZsYWcoa01heFJhbmRvbVNlZWQgLSAxKSk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSwKKyAgICAgICAgICAgIEdldFJhbmRvbVNlZWRGcm9tRmxhZyhrTWF4UmFuZG9tU2VlZCkpOworfQorCitURVNUKEdldFJhbmRvbVNlZWRGcm9tRmxhZ1Rlc3QsIE5vcm1hbGl6ZXNJbnZhbGlkU2VlZCkgeworICBjb25zdCBpbnQgc2VlZDEgPSBHZXRSYW5kb21TZWVkRnJvbUZsYWcoLTEpOworICBFWFBFQ1RfTEUoMSwgc2VlZDEpOworICBFWFBFQ1RfTEUoc2VlZDEsIHN0YXRpY19jYXN0PGludD4oa01heFJhbmRvbVNlZWQpKTsKKworICBjb25zdCBpbnQgc2VlZDIgPSBHZXRSYW5kb21TZWVkRnJvbUZsYWcoa01heFJhbmRvbVNlZWQgKyAxKTsKKyAgRVhQRUNUX0xFKDEsIHNlZWQyKTsKKyAgRVhQRUNUX0xFKHNlZWQyLCBzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSk7Cit9CisKK1RFU1QoR2V0TmV4dFJhbmRvbVNlZWRUZXN0LCBXb3Jrc0ZvclZhbGlkSW5wdXQpIHsKKyAgRVhQRUNUX0VRKDIsIEdldE5leHRSYW5kb21TZWVkKDEpKTsKKyAgRVhQRUNUX0VRKDMsIEdldE5leHRSYW5kb21TZWVkKDIpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa01heFJhbmRvbVNlZWQpLAorICAgICAgICAgICAgR2V0TmV4dFJhbmRvbVNlZWQoa01heFJhbmRvbVNlZWQgLSAxKSk7CisgIEVYUEVDVF9FUSgxLCBHZXROZXh0UmFuZG9tU2VlZChrTWF4UmFuZG9tU2VlZCkpOworCisgIC8vIFdlIGRlbGliZXJhdGVseSBkb24ndCB0ZXN0IEdldE5leHRSYW5kb21TZWVkKCkgd2l0aCBpbnZhbGlkCisgIC8vIGlucHV0cywgYXMgdGhhdCByZXF1aXJlcyBkZWF0aCB0ZXN0cywgd2hpY2ggYXJlIGV4cGVuc2l2ZS4gIFRoaXMKKyAgLy8gaXMgZmluZSBhcyBHZXROZXh0UmFuZG9tU2VlZCgpIGlzIGludGVybmFsIGFuZCBoYXMgYQorICAvLyBzdHJhaWdodGZvcndhcmQgZGVmaW5pdGlvbi4KK30KKworc3RhdGljIHZvaWQgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCkgeworICBUZXN0UmVzdWx0QWNjZXNzb3I6OkNsZWFyVGVzdFBhcnRSZXN1bHRzKAorICAgICAgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKSk7Cit9CisKKy8vIFRlc3RzIEdldFR5cGVJZC4KKworVEVTVChHZXRUeXBlSWRUZXN0LCBSZXR1cm5zU2FtZVZhbHVlRm9yU2FtZVR5cGUpIHsKKyAgRVhQRUNUX0VRKEdldFR5cGVJZDxpbnQ+KCksIEdldFR5cGVJZDxpbnQ+KCkpOworICBFWFBFQ1RfRVEoR2V0VHlwZUlkPFRlc3Q+KCksIEdldFR5cGVJZDxUZXN0PigpKTsKK30KKworY2xhc3MgU3ViQ2xhc3NPZlRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKK2NsYXNzIEFub3RoZXJTdWJDbGFzc09mVGVzdCA6IHB1YmxpYyBUZXN0IHt9OworCitURVNUKEdldFR5cGVJZFRlc3QsIFJldHVybnNEaWZmZXJlbnRWYWx1ZXNGb3JEaWZmZXJlbnRUeXBlcykgeworICBFWFBFQ1RfTkUoR2V0VHlwZUlkPGludD4oKSwgR2V0VHlwZUlkPGNvbnN0IGludD4oKSk7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8aW50PigpLCBHZXRUeXBlSWQ8Y2hhcj4oKSk7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8aW50PigpLCBHZXRUZXN0VHlwZUlkKCkpOworICBFWFBFQ1RfTkUoR2V0VHlwZUlkPFN1YkNsYXNzT2ZUZXN0PigpLCBHZXRUZXN0VHlwZUlkKCkpOworICBFWFBFQ1RfTkUoR2V0VHlwZUlkPEFub3RoZXJTdWJDbGFzc09mVGVzdD4oKSwgR2V0VGVzdFR5cGVJZCgpKTsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxBbm90aGVyU3ViQ2xhc3NPZlRlc3Q+KCksIEdldFR5cGVJZDxTdWJDbGFzc09mVGVzdD4oKSk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgR2V0VGVzdFR5cGVJZCgpIHJldHVybnMgdGhlIHNhbWUgdmFsdWUsIG5vIG1hdHRlciBpdAorLy8gaXMgY2FsbGVkIGZyb20gaW5zaWRlIEdvb2dsZSBUZXN0IG9yIG91dHNpZGUgb2YgaXQuCitURVNUKEdldFRlc3RUeXBlSWRUZXN0LCBSZXR1cm5zVGhlU2FtZVZhbHVlSW5zaWRlT3JPdXRzaWRlT2ZHb29nbGVUZXN0KSB7CisgIEVYUEVDVF9FUShrVGVzdFR5cGVJZEluR29vZ2xlVGVzdCwgR2V0VGVzdFR5cGVJZCgpKTsKK30KKworLy8gVGVzdHMgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKCkuCisKK1RFU1QoRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzVGVzdCwgRm9ybWF0c1plcm8pIHsKKyAgRVhQRUNUX0VRKCIwIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDApKTsKK30KKworVEVTVChGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHNUZXN0LCBGb3JtYXRzUG9zaXRpdmVOdW1iZXIpIHsKKyAgRVhQRUNUX0VRKCIwLjAwMyIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygzKSk7CisgIEVYUEVDVF9FUSgiMC4wMSIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygxMCkpOworICBFWFBFQ1RfRVEoIjAuMiIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygyMDApKTsKKyAgRVhQRUNUX0VRKCIxLjIiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMTIwMCkpOworICBFWFBFQ1RfRVEoIjMiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMzAwMCkpOworfQorCitURVNUKEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kc1Rlc3QsIEZvcm1hdHNOZWdhdGl2ZU51bWJlcikgeworICBFWFBFQ1RfRVEoIi0wLjAwMyIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMykpOworICBFWFBFQ1RfRVEoIi0wLjAxIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0xMCkpOworICBFWFBFQ1RfRVEoIi0wLjIiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTIwMCkpOworICBFWFBFQ1RfRVEoIi0xLjIiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTEyMDApKTsKKyAgRVhQRUNUX0VRKCItMyIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMzAwMCkpOworfQorCisvLyBUZXN0cyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSgpLiAgVGhlIGNvcnJlY3RuZXNzIG9mIGNvbnZlcnNpb24KKy8vIGZvciBwYXJ0aWN1bGFyIGRhdGVzIGJlbG93IHdhcyB2ZXJpZmllZCBpbiBQeXRob24gdXNpbmcKKy8vIGRhdGV0aW1lLmRhdGV0aW1lLmZyb211dGN0aW1lc3RhbXAoPHRpbWV0YW1wPi8xMDAwKS4KKworLy8gRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEgZGVwZW5kcyBvbiB0aGUgY3VycmVudCB0aW1lem9uZSwgc28gd2UKKy8vIGhhdmUgdG8gc2V0IHVwIGEgcGFydGljdWxhciB0aW1lem9uZSB0byBvYnRhaW4gcHJlZGljdGFibGUgcmVzdWx0cy4KK2NsYXNzIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIC8vIE9uIEN5Z3dpbiwgR0NDIGRvZXNuJ3QgYWxsb3cgdW5xdWFsaWZpZWQgaW50ZWdlciBsaXRlcmFscyB0byBleGNlZWQKKyAgLy8gMzIgYml0cywgZXZlbiB3aGVuIDY0LWJpdCBpbnRlZ2VyIHR5cGVzIGFyZSBhdmFpbGFibGUuICBXZSBoYXZlIHRvCisgIC8vIGZvcmNlIHRoZSBjb25zdGFudHMgdG8gaGF2ZSBhIDY0LWJpdCB0eXBlIGhlcmUuCisgIHN0YXRpYyBjb25zdCBUaW1lSW5NaWxsaXMga01pbGxpc1BlclNlYyA9IDEwMDA7CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgc2F2ZWRfdHpfID0gTlVMTDsKKyNpZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGdldGVudiwgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZHVwKS4KKyAgICBpZiAoZ2V0ZW52KCJUWiIpKQorICAgICAgc2F2ZWRfdHpfID0gc3RyZHVwKGdldGVudigiVFoiKSk7CisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlIGFnYWluLgorI2Vsc2UKKyAgICBpZiAoZ2V0ZW52KCJUWiIpKQorICAgICAgc2F2ZWRfdHpfID0gc3RyZHVwKGdldGVudigiVFoiKSk7CisjZW5kaWYKKworICAgIC8vIFNldCB1cCB0aGUgdGltZSB6b25lIGZvciBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSB0byB1c2UuICBXZQorICAgIC8vIGNhbm5vdCB1c2UgdGhlIGxvY2FsIHRpbWUgem9uZSBiZWNhdXNlIHRoZSBmdW5jdGlvbidzIG91dHB1dCBkZXBlbmRzCisgICAgLy8gb24gdGhlIHRpbWUgem9uZS4KKyAgICBTZXRUaW1lWm9uZSgiVVRDKzAwIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgU2V0VGltZVpvbmUoc2F2ZWRfdHpfKTsKKyAgICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHNhdmVkX3R6XykpOworICAgIHNhdmVkX3R6XyA9IE5VTEw7CisgIH0KKworICBzdGF0aWMgdm9pZCBTZXRUaW1lWm9uZShjb25zdCBjaGFyKiB0aW1lX3pvbmUpIHsKKyAgICAvLyB0enNldCgpIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0aGUgVFogdmFyaWFibGUgYmVpbmcgcHJlc2VudCBhbmQgZW1wdHkKKyAgICAvLyBhbmQgbm90IGJlaW5nIHByZXNlbnQsIHNvIHdlIGhhdmUgdG8gY29uc2lkZXIgdGhlIGNhc2Ugb2YgdGltZV96b25lCisgICAgLy8gYmVpbmcgTlVMTC4KKyNpZiBfTVNDX1ZFUgorICAgIC8vIC4uLlVubGVzcyBpdCdzIE1TVkMsIHdob3NlIHN0YW5kYXJkIGxpYnJhcnkncyBfcHV0ZW52IGRvZXNuJ3QKKyAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuIGVtcHR5IGFuZCBhIG1pc3NpbmcgdmFyaWFibGUuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9CisgICAgICAgIHN0ZDo6c3RyaW5nKCJUWj0iKSArICh0aW1lX3pvbmUgPyB0aW1lX3pvbmUgOiAiIik7CisgICAgX3B1dGVudihlbnZfdmFyLmNfc3RyKCkpOworIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQpLgorICAgIHR6c2V0KCk7CisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlIGFnYWluLgorI2Vsc2UKKyAgICBpZiAodGltZV96b25lKSB7CisgICAgICBzZXRlbnYoKCJUWiIpLCB0aW1lX3pvbmUsIDEpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNldGVudigiVFoiKTsKKyAgICB9CisgICAgdHpzZXQoKTsKKyNlbmRpZgorICB9CisKKyAgY29uc3QgY2hhciogc2F2ZWRfdHpfOworfTsKKworY29uc3QgVGltZUluTWlsbGlzIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdDo6a01pbGxpc1BlclNlYzsKKworVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzVHdvRGlnaXRTZWdtZW50cykgeworICBFWFBFQ1RfRVEoIjIwMTEtMTAtMzFUMTg6NTI6NDIiLAorICAgICAgICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMyMDA4NzE2MiAqIGtNaWxsaXNQZXJTZWMpKTsKK30KKworVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgTWlsbGlzZWNvbmRzRG9Ob3RBZmZlY3RSZXN1bHQpIHsKKyAgRVhQRUNUX0VRKAorICAgICAgIjIwMTEtMTAtMzFUMTg6NTI6NDIiLAorICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMyMDA4NzE2MiAqIGtNaWxsaXNQZXJTZWMgKyAyMzQpKTsKK30KKworVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzTGVhZGluZ1plcm9lcykgeworICBFWFBFQ1RfRVEoIjIwMTEtMDktMDNUMDU6MDc6MDIiLAorICAgICAgICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMxNTAyNjQyMiAqIGtNaWxsaXNQZXJTZWMpKTsKK30KKworVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzMjRIb3VyVGltZSkgeworICBFWFBFQ1RfRVEoIjIwMTEtMDktMjhUMTc6MDg6MjIiLAorICAgICAgICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMxNzIyOTcwMiAqIGtNaWxsaXNQZXJTZWMpKTsKK30KKworVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzRXBvY2hTdGFydCkgeworICBFWFBFQ1RfRVEoIjE5NzAtMDEtMDFUMDA6MDA6MDAiLCBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSgwKSk7Cit9CisKKyNpZiBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisKKyMgaWZkZWYgX19CT1JMQU5EQ19fCisvLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsICJVbnJlYWNoYWJsZSBjb2RlIgorIyAgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyMgZW5kaWYKKworLy8gVGVzdHMgdGhhdCBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGlzIHRydWUgd2hlbiB4IGlzIGEgbnVsbAorLy8gcG9pbnRlciBsaXRlcmFsLgorVEVTVChOdWxsTGl0ZXJhbFRlc3QsIElzVHJ1ZUZvck51bGxMaXRlcmFscykgeworICBFWFBFQ1RfVFJVRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKE5VTEwpKTsKKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwKSk7CisgIEVYUEVDVF9UUlVFKEdURVNUX0lTX05VTExfTElURVJBTF8oMFUpKTsKKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwTCkpOworCisjIGlmbmRlZiBfX0JPUkxBTkRDX18KKworICAvLyBTb21lIGNvbXBpbGVycyBtYXkgZmFpbCB0byBkZXRlY3Qgc29tZSBudWxsIHBvaW50ZXIgbGl0ZXJhbHM7CisgIC8vIGFzIGxvbmcgYXMgdXNlcnMgb2YgdGhlIGZyYW1ld29yayBkb24ndCB1c2Ugc3VjaCBsaXRlcmFscywgdGhpcworICAvLyBpcyBoYXJtbGVzcy4KKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygxIC0gMSkpOworCisjIGVuZGlmCit9CisKKy8vIFRlc3RzIHRoYXQgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBpcyBmYWxzZSB3aGVuIHggaXMgbm90IGEgbnVsbAorLy8gcG9pbnRlciBsaXRlcmFsLgorVEVTVChOdWxsTGl0ZXJhbFRlc3QsIElzRmFsc2VGb3JOb25OdWxsTGl0ZXJhbHMpIHsKKyAgRVhQRUNUX0ZBTFNFKEdURVNUX0lTX05VTExfTElURVJBTF8oMSkpOworICBFWFBFQ1RfRkFMU0UoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwLjApKTsKKyAgRVhQRUNUX0ZBTFNFKEdURVNUX0lTX05VTExfTElURVJBTF8oJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHN0YXRpY19jYXN0PHZvaWQqPihOVUxMKSkpOworfQorCisjIGlmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHByZXNzZWQgdGhlbS4KKyMgIHByYWdtYSBvcHRpb24gcG9wCisjIGVuZGlmCisKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorLy8KKy8vIFRlc3RzIENvZGVQb2ludFRvVXRmOCgpLgorCisvLyBUZXN0cyB0aGF0IHRoZSBOVUwgY2hhcmFjdGVyIEwnXDAnIGlzIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGVOdWwpIHsKKyAgY2hhciBidWZmZXJbMzJdOworICBFWFBFQ1RfU1RSRVEoIiIsIENvZGVQb2ludFRvVXRmOChMJ1wwJywgYnVmZmVyKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNDSUkgY2hhcmFjdGVycyBhcmUgZW5jb2RlZCBjb3JyZWN0bHkuCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZUFzY2lpKSB7CisgIGNoYXIgYnVmZmVyWzMyXTsKKyAgRVhQRUNUX1NUUkVRKCJhIiwgQ29kZVBvaW50VG9VdGY4KEwnYScsIGJ1ZmZlcikpOworICBFWFBFQ1RfU1RSRVEoIloiLCBDb2RlUG9pbnRUb1V0ZjgoTCdaJywgYnVmZmVyKSk7CisgIEVYUEVDVF9TVFJFUSgiJiIsIENvZGVQb2ludFRvVXRmOChMJyYnLCBidWZmZXIpKTsKKyAgRVhQRUNUX1NUUkVRKCJceDdGIiwgQ29kZVBvaW50VG9VdGY4KEwnXHg3RicsIGJ1ZmZlcikpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDggdG8gMTEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTEweHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZThUbzExQml0cykgeworICBjaGFyIGJ1ZmZlclszMl07CisgIC8vIDAwMCAxMTAxIDAwMTEgPT4gMTEwLTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfU1RSRVEoIlx4QzNceDkzIiwgQ29kZVBvaW50VG9VdGY4KEwnXHhEMycsIGJ1ZmZlcikpOworCisgIC8vIDEwMSAwMTExIDAxMTAgPT4gMTEwLTEwMTAxIDEwLTExMDExMAorICAvLyBTb21lIGNvbXBpbGVycyAoZS5nLiwgR0NDIG9uIE1pbkdXKSBjYW5ub3QgaGFuZGxlIG5vbi1BU0NJSSBjb2RlcG9pbnRzCisgIC8vIGluIHdpZGUgc3RyaW5ncyBhbmQgd2lkZSBjaGFycy4gSW4gb3JkZXIgdG8gYWNjb21vZGF0ZSB0aGVtLCB3ZSBoYXZlIHRvCisgIC8vIGludHJvZHVjZSBzdWNoIGNoYXJhY3RlciBjb25zdGFudHMgYXMgaW50ZWdlcnMuCisgIEVYUEVDVF9TVFJFUSgiXHhENVx4QjYiLAorICAgICAgICAgICAgICAgQ29kZVBvaW50VG9VdGY4KHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4NTc2KSwgYnVmZmVyKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTIgdG8gMTYgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZTEyVG8xNkJpdHMpIHsKKyAgY2hhciBidWZmZXJbMzJdOworICAvLyAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTAtMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhFMFx4QTNceDkzIiwKKyAgICAgICAgICAgICAgIENvZGVQb2ludFRvVXRmOChzdGF0aWNfY2FzdDx3Y2hhcl90PigweDhEMyksIGJ1ZmZlcikpOworCisgIC8vIDExMDAgMDExMSAwMTAwIDExMDEgPT4gMTExMC0xMTAwIDEwLTAxMTEwMSAxMC0wMDExMDEKKyAgRVhQRUNUX1NUUkVRKCJceEVDXHg5RFx4OEQiLAorICAgICAgICAgICAgICAgQ29kZVBvaW50VG9VdGY4KHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4Qzc0RCksIGJ1ZmZlcikpOworfQorCisjaWYgIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisvLyBUZXN0cyBpbiB0aGlzIGdyb3VwIHJlcXVpcmUgYSB3Y2hhcl90IHRvIGhvbGQgPiAxNiBiaXRzLCBhbmQgdGh1cworLy8gYXJlIHNraXBwZWQgb24gV2luZG93cywgQ3lnd2luLCBhbmQgU3ltYmlhbiwgd2hlcmUgYSB3Y2hhcl90IGlzCisvLyAxNi1iaXQgd2lkZS4gVGhpcyBjb2RlIG1heSBub3QgY29tcGlsZSBvbiB0aG9zZSBzeXN0ZW1zLgorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDE3IHRvIDIxIGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGUxN1RvMjFCaXRzKSB7CisgIGNoYXIgYnVmZmVyWzMyXTsKKyAgLy8gMCAwMDAxIDAwMDAgMTAwMCAxMTAxIDAwMTEgPT4gMTExMTAtMDAwIDEwLTAxMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceEEzXHg5MyIsIENvZGVQb2ludFRvVXRmOChMJ1x4MTA4RDMnLCBidWZmZXIpKTsKKworICAvLyAwIDAwMDEgMDAwMCAwMTAwIDAwMDAgMDAwMCA9PiAxMTExMC0wMDAgMTAtMDEwMDAwIDEwLTAxMDAwMCAxMC0wMDAwMDAKKyAgRVhQRUNUX1NUUkVRKCJceEYwXHg5MFx4OTBceDgwIiwgQ29kZVBvaW50VG9VdGY4KEwnXHgxMDQwMCcsIGJ1ZmZlcikpOworCisgIC8vIDEgMDAwMCAxMDAwIDAxMTAgMDAxMSAwMTAwID0+IDExMTEwLTEwMCAxMC0wMDEwMDAgMTAtMDExMDAwIDEwLTExMDEwMAorICBFWFBFQ1RfU1RSRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwODYzNCcsIGJ1ZmZlcikpOworfQorCisvLyBUZXN0cyB0aGF0IGVuY29kaW5nIGFuIGludmFsaWQgY29kZS1wb2ludCBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KK1RFU1QoQ29kZVBvaW50VG9VdGY4VGVzdCwgQ2FuRW5jb2RlSW52YWxpZENvZGVQb2ludCkgeworICBjaGFyIGJ1ZmZlclszMl07CisgIEVYUEVDVF9TVFJFUSgiKEludmFsaWQgVW5pY29kZSAweDEyMzRBQkNEKSIsCisgICAgICAgICAgICAgICBDb2RlUG9pbnRUb1V0ZjgoTCdceDEyMzRBQkNEJywgYnVmZmVyKSk7Cit9CisKKyNlbmRpZiAgLy8gIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisKKy8vIFRlc3RzIFdpZGVTdHJpbmdUb1V0ZjgoKS4KKworLy8gVGVzdHMgdGhhdCB0aGUgTlVMIGNoYXJhY3RlciBMJ1wwJyBpcyBlbmNvZGVkIGNvcnJlY3RseS4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZU51bCkgeworICBFWFBFQ1RfU1RSRVEoIiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCIiLCAwKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBXaWRlU3RyaW5nVG9VdGY4KEwiIiwgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IEFTQ0lJIHN0cmluZ3MgYXJlIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlQXNjaWkpIHsKKyAgRVhQRUNUX1NUUkVRKCJhIiwgV2lkZVN0cmluZ1RvVXRmOChMImEiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJhYiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJhYiIsIDIpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImEiLCBXaWRlU3RyaW5nVG9VdGY4KEwiYSIsIC0xKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJhYiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJhYiIsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBVbmljb2RlIGNvZGUtcG9pbnRzIHRoYXQgaGF2ZSA4IHRvIDExIGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMHh4eHh4IDEweHh4eHh4LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlOFRvMTFCaXRzKSB7CisgIC8vIDAwMCAxMTAxIDAwMTEgPT4gMTEwLTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfU1RSRVEoIlx4QzNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4RDMiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEMzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceEQzIiwgLTEpLmNfc3RyKCkpOworCisgIC8vIDEwMSAwMTExIDAxMTAgPT4gMTEwLTEwMTAxIDEwLTExMDExMAorICBjb25zdCB3Y2hhcl90IHNbXSA9IHsgMHg1NzYsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEQ1XHhCNiIsIFdpZGVTdHJpbmdUb1V0ZjgocywgMSkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiXHhENVx4QjYiLCBXaWRlU3RyaW5nVG9VdGY4KHMsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBVbmljb2RlIGNvZGUtcG9pbnRzIHRoYXQgaGF2ZSAxMiB0byAxNiBiaXRzIGFyZSBlbmNvZGVkCisvLyBhcyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eC4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZTEyVG8xNkJpdHMpIHsKKyAgLy8gMDAwMCAxMDAwIDExMDEgMDAxMSA9PiAxMTEwLTAwMDAgMTAtMTAwMDExIDEwLTAxMDAxMQorICBjb25zdCB3Y2hhcl90IHMxW10gPSB7IDB4OEQzLCAnXDAnIH07CisgIEVYUEVDVF9TVFJFUSgiXHhFMFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChzMSwgMSkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiXHhFMFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChzMSwgLTEpLmNfc3RyKCkpOworCisgIC8vIDExMDAgMDExMSAwMTAwIDExMDEgPT4gMTExMC0xMTAwIDEwLTAxMTEwMSAxMC0wMDExMDEKKyAgY29uc3Qgd2NoYXJfdCBzMltdID0geyAweEM3NEQsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVDXHg5RFx4OEQiLCBXaWRlU3RyaW5nVG9VdGY4KHMyLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEVDXHg5RFx4OEQiLCBXaWRlU3RyaW5nVG9VdGY4KHMyLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGNvbnZlcnNpb24gc3RvcHMgd2hlbiB0aGUgZnVuY3Rpb24gZW5jb3VudGVycyBcMCBjaGFyYWN0ZXIuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBTdG9wc09uTnVsQ2hhcmFjdGVyKSB7CisgIEVYUEVDVF9TVFJFUSgiQUJDIiwgV2lkZVN0cmluZ1RvVXRmOChMIkFCQ1wwWFlaIiwgMTAwKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgY29udmVyc2lvbiBzdG9wcyB3aGVuIHRoZSBmdW5jdGlvbiByZWFjaGVzIHRoZSBsaW1pdAorLy8gc3BlY2lmaWVkIGJ5IHRoZSAnbGVuZ3RoJyBwYXJhbWV0ZXIuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBTdG9wc1doZW5MZW5ndGhMaW1pdFJlYWNoZWQpIHsKKyAgRVhQRUNUX1NUUkVRKCJBQkMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiQUJDREVGIiwgMykuY19zdHIoKSk7Cit9CisKKyNpZiAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKy8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTcgdG8gMjEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHguIFRoaXMgY29kZSBtYXkgbm90IGNvbXBpbGUKKy8vIG9uIHRoZSBzeXN0ZW1zIHVzaW5nIFVURi0xNiBlbmNvZGluZy4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZTE3VG8yMUJpdHMpIHsKKyAgLy8gMCAwMDAxIDAwMDAgMTAwMCAxMTAxIDAwMTEgPT4gMTExMTAtMDAwIDEwLTAxMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceEEzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceDEwOEQzIiwgMSkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceEEzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceDEwOEQzIiwgLTEpLmNfc3RyKCkpOworCisgIC8vIDEgMDAwMCAxMDAwIDAxMTAgMDAxMSAwMTAwID0+IDExMTEwLTEwMCAxMC0wMDEwMDAgMTAtMDExMDAwIDEwLTExMDEwMAorICBFWFBFQ1RfU1RSRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHgxMDg2MzQiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEY0XHg4OFx4OThceEI0IiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4MTA4NjM0IiwgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGVuY29kaW5nIGFuIGludmFsaWQgY29kZS1wb2ludCBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZUludmFsaWRDb2RlUG9pbnQpIHsKKyAgRVhQRUNUX1NUUkVRKCIoSW52YWxpZCBVbmljb2RlIDB4QUJDREZGKSIsCisgICAgICAgICAgICAgICBXaWRlU3RyaW5nVG9VdGY4KEwiXHhBQkNERkYiLCAtMSkuY19zdHIoKSk7Cit9CisjZWxzZSAgLy8gIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisvLyBUZXN0cyB0aGF0IHN1cnJvZ2F0ZSBwYWlycyBhcmUgZW5jb2RlZCBjb3JyZWN0bHkgb24gdGhlIHN5c3RlbXMgdXNpbmcKKy8vIFVURi0xNiBlbmNvZGluZyBpbiB0aGUgd2lkZSBzdHJpbmdzLgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlVmFsaWRVdGYxNlNVcnJvZ2F0ZVBhaXJzKSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0geyAweEQ4MDEsIDB4REMwMCwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RjBceDkwXHg5MFx4ODAiLCBXaWRlU3RyaW5nVG9VdGY4KHMsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBlbmNvZGluZyBhbiBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorLy8gZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCByZXN1bHQuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVJbnZhbGlkVXRmMTZTdXJyb2dhdGVQYWlyKSB7CisgIC8vIExlYWRpbmcgc3Vycm9nYXRlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgY29uc3Qgd2NoYXJfdCBzMVtdID0geyAweEQ4MDAsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVEXHhBMFx4ODAiLCBXaWRlU3RyaW5nVG9VdGY4KHMxLCAtMSkuY19zdHIoKSk7CisgIC8vIExlYWRpbmcgc3Vycm9nYXRlIGlzIG5vdCBmb2xsb3dlZCBieSB0aGUgdHJhaWxpbmcgc3Vycm9nYXRlLgorICBjb25zdCB3Y2hhcl90IHMyW10gPSB7IDB4RDgwMCwgJ00nLCAnXDAnIH07CisgIEVYUEVDVF9TVFJFUSgiXHhFRFx4QTBceDgwTSIsIFdpZGVTdHJpbmdUb1V0ZjgoczIsIC0xKS5jX3N0cigpKTsKKyAgLy8gVHJhaWxpbmcgc3Vycm9nYXRlIGFwcGVhcmFzIHdpdGhvdXQgYSBsZWFkaW5nIHN1cnJvZ2F0ZS4KKyAgY29uc3Qgd2NoYXJfdCBzM1tdID0geyAweERDMDAsICdQJywgJ1EnLCAnUicsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVEXHhCMFx4ODBQUVIiLCBXaWRlU3RyaW5nVG9VdGY4KHMzLCAtMSkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworCisvLyBUZXN0cyB0aGF0IGNvZGVwb2ludCBjb25jYXRlbmF0aW9uIHdvcmtzIGNvcnJlY3RseS4KKyNpZiAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENvbmNhdGVuYXRlc0NvZGVwb2ludHNDb3JyZWN0bHkpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSB7IDB4MTA4NjM0LCAweEM3NEQsICdcbicsIDB4NTc2LCAweDhEMywgMHgxMDg2MzQsICdcMCd9OworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiXHhGNFx4ODhceDk4XHhCNCIKKyAgICAgICAgICAiXHhFQ1x4OURceDhEIgorICAgICAgICAgICJcbiIKKyAgICAgICAgICAiXHhENVx4QjYiCisgICAgICAgICAgIlx4RTBceEEzXHg5MyIKKyAgICAgICAgICAiXHhGNFx4ODhceDk4XHhCNCIsCisgICAgICBXaWRlU3RyaW5nVG9VdGY4KHMsIC0xKS5jX3N0cigpKTsKK30KKyNlbHNlCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDb25jYXRlbmF0ZXNDb2RlcG9pbnRzQ29ycmVjdGx5KSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0geyAweEM3NEQsICdcbicsIDB4NTc2LCAweDhEMywgJ1wwJ307CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJceEVDXHg5RFx4OEQiICJcbiIgIlx4RDVceEI2IiAiXHhFMFx4QTNceDkzIiwKKyAgICAgIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorI2VuZGlmICAvLyAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKworLy8gVGVzdHMgdGhlIFJhbmRvbSBjbGFzcy4KKworVEVTVChSYW5kb21EZWF0aFRlc3QsIEdlbmVyYXRlc0NyYXNoZXNPbkludmFsaWRSYW5nZSkgeworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbSg0Mik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICByYW5kb20uR2VuZXJhdGUoMCksCisgICAgICAiQ2Fubm90IGdlbmVyYXRlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBcXFswLCAwXFwpIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICByYW5kb20uR2VuZXJhdGUodGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbTo6a01heFJhbmdlICsgMSksCisgICAgICAiR2VuZXJhdGlvbiBvZiBhIG51bWJlciBpbiBcXFswLCAyMTQ3NDgzNjQ5XFwpIHdhcyByZXF1ZXN0ZWQsICIKKyAgICAgICJidXQgdGhpcyBjYW4gb25seSBnZW5lcmF0ZSBudW1iZXJzIGluIFxcWzAsIDIxNDc0ODM2NDhcXCkiKTsKK30KKworVEVTVChSYW5kb21UZXN0LCBHZW5lcmF0ZXNOdW1iZXJzV2l0aGluUmFuZ2UpIHsKKyAgY29uc3QgVUludDMyIGtSYW5nZSA9IDEwMDAwOworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbSgxMjM0NSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEVYUEVDVF9MVChyYW5kb20uR2VuZXJhdGUoa1JhbmdlKSwga1JhbmdlKSA8PCAiIGZvciBpdGVyYXRpb24gIiA8PCBpOworICB9CisKKyAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb20yKHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb206OmtNYXhSYW5nZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEVYUEVDVF9MVChyYW5kb20yLkdlbmVyYXRlKGtSYW5nZSksIGtSYW5nZSkgPDwgIiBmb3IgaXRlcmF0aW9uICIgPDwgaTsKKyAgfQorfQorCitURVNUKFJhbmRvbVRlc3QsIFJlcGVhdHNXaGVuUmVzZWVkZWQpIHsKKyAgY29uc3QgaW50IGtTZWVkID0gMTIzOworICBjb25zdCBpbnQga0FycmF5U2l6ZSA9IDEwOworICBjb25zdCBVSW50MzIga1JhbmdlID0gMTAwMDA7CisgIFVJbnQzMiB2YWx1ZXNba0FycmF5U2l6ZV07CisKKyAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb20oa1NlZWQpOworICBmb3IgKGludCBpID0gMDsgaSA8IGtBcnJheVNpemU7IGkrKykgeworICAgIHZhbHVlc1tpXSA9IHJhbmRvbS5HZW5lcmF0ZShrUmFuZ2UpOworICB9CisKKyAgcmFuZG9tLlJlc2VlZChrU2VlZCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0FycmF5U2l6ZTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKHZhbHVlc1tpXSwgcmFuZG9tLkdlbmVyYXRlKGtSYW5nZSkpIDw8ICIgZm9yIGl0ZXJhdGlvbiAiIDw8IGk7CisgIH0KK30KKworLy8gVGVzdHMgU1RMIGNvbnRhaW5lciB1dGlsaXRpZXMuCisKKy8vIFRlc3RzIENvdW50SWYoKS4KKworc3RhdGljIGJvb2wgSXNQb3NpdGl2ZShpbnQgbikgeyByZXR1cm4gbiA+IDA7IH0KKworVEVTVChDb250YWluZXJVdGlsaXR5VGVzdCwgQ291bnRJZikgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIEVYUEVDVF9FUSgwLCBDb3VudElmKHYsIElzUG9zaXRpdmUpKTsgIC8vIFdvcmtzIGZvciBhbiBlbXB0eSBjb250YWluZXIuCisKKyAgdi5wdXNoX2JhY2soLTEpOworICB2LnB1c2hfYmFjaygwKTsKKyAgRVhQRUNUX0VRKDAsIENvdW50SWYodiwgSXNQb3NpdGl2ZSkpOyAgLy8gV29ya3Mgd2hlbiBubyB2YWx1ZSBzYXRpc2ZpZXMuCisKKyAgdi5wdXNoX2JhY2soMik7CisgIHYucHVzaF9iYWNrKC0xMCk7CisgIHYucHVzaF9iYWNrKDEwKTsKKyAgRVhQRUNUX0VRKDIsIENvdW50SWYodiwgSXNQb3NpdGl2ZSkpOworfQorCisvLyBUZXN0cyBGb3JFYWNoKCkuCisKK3N0YXRpYyBpbnQgZ19zdW0gPSAwOworc3RhdGljIHZvaWQgQWNjdW11bGF0ZShpbnQgbikgeyBnX3N1bSArPSBuOyB9CisKK1RFU1QoQ29udGFpbmVyVXRpbGl0eVRlc3QsIEZvckVhY2gpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworICBnX3N1bSA9IDA7CisgIEZvckVhY2godiwgQWNjdW11bGF0ZSk7CisgIEVYUEVDVF9FUSgwLCBnX3N1bSk7ICAvLyBXb3JrcyBmb3IgYW4gZW1wdHkgY29udGFpbmVyOworCisgIGdfc3VtID0gMDsKKyAgdi5wdXNoX2JhY2soMSk7CisgIEZvckVhY2godiwgQWNjdW11bGF0ZSk7CisgIEVYUEVDVF9FUSgxLCBnX3N1bSk7ICAvLyBXb3JrcyBmb3IgYSBjb250YWluZXIgd2l0aCBvbmUgZWxlbWVudC4KKworICBnX3N1bSA9IDA7CisgIHYucHVzaF9iYWNrKDIwKTsKKyAgdi5wdXNoX2JhY2soMzAwKTsKKyAgRm9yRWFjaCh2LCBBY2N1bXVsYXRlKTsKKyAgRVhQRUNUX0VRKDMyMSwgZ19zdW0pOworfQorCisvLyBUZXN0cyBHZXRFbGVtZW50T3IoKS4KK1RFU1QoQ29udGFpbmVyVXRpbGl0eVRlc3QsIEdldEVsZW1lbnRPcikgeworICBzdGQ6OnZlY3RvcjxjaGFyPiBhOworICBFWFBFQ1RfRVEoJ3gnLCBHZXRFbGVtZW50T3IoYSwgMCwgJ3gnKSk7CisKKyAgYS5wdXNoX2JhY2soJ2EnKTsKKyAgYS5wdXNoX2JhY2soJ2InKTsKKyAgRVhQRUNUX0VRKCdhJywgR2V0RWxlbWVudE9yKGEsIDAsICd4JykpOworICBFWFBFQ1RfRVEoJ2InLCBHZXRFbGVtZW50T3IoYSwgMSwgJ3gnKSk7CisgIEVYUEVDVF9FUSgneCcsIEdldEVsZW1lbnRPcihhLCAtMiwgJ3gnKSk7CisgIEVYUEVDVF9FUSgneCcsIEdldEVsZW1lbnRPcihhLCAyLCAneCcpKTsKK30KKworVEVTVChDb250YWluZXJVdGlsaXR5RGVhdGhUZXN0LCBTaHVmZmxlUmFuZ2UpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBhOworICBhLnB1c2hfYmFjaygwKTsKKyAgYS5wdXNoX2JhY2soMSk7CisgIGEucHVzaF9iYWNrKDIpOworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbSgxKTsKKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIC0xLCAxLCAmYSksCisgICAgICAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0IC0xOiBtdXN0IGJlIGluIHJhbmdlIFxcWzAsIDNcXF0iKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIFNodWZmbGVSYW5nZSgmcmFuZG9tLCA0LCA0LCAmYSksCisgICAgICAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0IDQ6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMCwgM1xcXSIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIDMsIDIsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoIDI6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMywgM1xcXSIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIDMsIDQsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoIDQ6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMywgM1xcXSIpOworfQorCitjbGFzcyBWZWN0b3JTaHVmZmxlVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBpbnQga1ZlY3RvclNpemUgPSAyMDsKKworICBWZWN0b3JTaHVmZmxlVGVzdCgpIDogcmFuZG9tXygxKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVmVjdG9yU2l6ZTsgaSsrKSB7CisgICAgICB2ZWN0b3JfLnB1c2hfYmFjayhpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc0NvcnJ1cHQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7CisgICAgaWYgKGtWZWN0b3JTaXplICE9IHN0YXRpY19jYXN0PGludD4odmVjdG9yLnNpemUoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZm91bmRfaW5fdmVjdG9yW2tWZWN0b3JTaXplXSA9IHsgZmFsc2UgfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgY29uc3QgaW50IGUgPSB2ZWN0b3JbaV07CisgICAgICBpZiAoZSA8IDAgfHwgZSA+PSBrVmVjdG9yU2l6ZSB8fCBmb3VuZF9pbl92ZWN0b3JbZV0pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBmb3VuZF9pbl92ZWN0b3JbZV0gPSB0cnVlOworICAgIH0KKworICAgIC8vIFZlY3RvciBzaXplIGlzIGNvcnJlY3QsIGVsZW1lbnRzJyByYW5nZSBpcyBjb3JyZWN0LCBubworICAgIC8vIGR1cGxpY2F0ZSBlbGVtZW50cy4gIFRoZXJlZm9yZSBubyBjb3JydXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc05vdENvcnJ1cHQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7CisgICAgcmV0dXJuICFWZWN0b3JJc0NvcnJ1cHQodmVjdG9yKTsKKyAgfQorCisgIHN0YXRpYyBib29sIFJhbmdlSXNTaHVmZmxlZChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IsIGludCBiZWdpbiwgaW50IGVuZCkgeworICAgIGZvciAoaW50IGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICBpZiAoaSAhPSB2ZWN0b3JbaV0pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBib29sIFJhbmdlSXNVbnNodWZmbGVkKAorICAgICAgY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yLCBpbnQgYmVnaW4sIGludCBlbmQpIHsKKyAgICByZXR1cm4gIVJhbmdlSXNTaHVmZmxlZCh2ZWN0b3IsIGJlZ2luLCBlbmQpOworICB9CisKKyAgc3RhdGljIGJvb2wgVmVjdG9ySXNTaHVmZmxlZChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICByZXR1cm4gUmFuZ2VJc1NodWZmbGVkKHZlY3RvciwgMCwgc3RhdGljX2Nhc3Q8aW50Pih2ZWN0b3Iuc2l6ZSgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc1Vuc2h1ZmZsZWQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7CisgICAgcmV0dXJuICFWZWN0b3JJc1NodWZmbGVkKHZlY3Rvcik7CisgIH0KKworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87CisgIFRlc3RpbmdWZWN0b3IgdmVjdG9yXzsKK307ICAvLyBjbGFzcyBWZWN0b3JTaHVmZmxlVGVzdAorCitjb25zdCBpbnQgVmVjdG9yU2h1ZmZsZVRlc3Q6OmtWZWN0b3JTaXplOworCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIEhhbmRsZXNFbXB0eVJhbmdlKSB7CisgIC8vIFRlc3RzIGFuIGVtcHR5IHJhbmdlIGF0IHRoZSBiZWdpbm5pbmcuLi4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCAwLCAwLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5pbiB0aGUgbWlkZGxlLi4uCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUvMiwga1ZlY3RvclNpemUvMiwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7CisKKyAgLy8gLi4uYXQgdGhlIGVuZC4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplIC0gMSwga1ZlY3RvclNpemUgLSAxLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5hbmQgcGFzdCB0aGUgZW5kLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplLCBrVmVjdG9yU2l6ZSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7Cit9CisKK1RFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgSGFuZGxlc1JhbmdlT2ZTaXplT25lKSB7CisgIC8vIFRlc3RzIGEgc2l6ZSBvbmUgcmFuZ2UgYXQgdGhlIGJlZ2lubmluZy4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIDAsIDEsICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOworCisgIC8vIC4uLmluIHRoZSBtaWRkbGUuLi4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZS8yLCBrVmVjdG9yU2l6ZS8yICsgMSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7CisKKyAgLy8gLi4uYW5kIGF0IHRoZSBlbmQuCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUgLSAxLCBrVmVjdG9yU2l6ZSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7Cit9CisKKy8vIEJlY2F1c2Ugd2UgdXNlIG91ciBvd24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYW5kIGEgZml4ZWQgc2VlZCwKKy8vIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUgZm9sbG93aW5nICJyYW5kb20iIHRlc3RzIHdpbGwgc3VjY2VlZC4KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc0VudGlyZVZlY3RvcikgeworICBTaHVmZmxlKCZyYW5kb21fLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBFWFBFQ1RfRkFMU0UoVmVjdG9ySXNVbnNodWZmbGVkKHZlY3Rvcl8pKSA8PCB2ZWN0b3JfOworCisgIC8vIFRlc3RzIHRoZSBmaXJzdCBhbmQgbGFzdCBlbGVtZW50cyBpbiBwYXJ0aWN1bGFyIHRvIGVuc3VyZSB0aGF0CisgIC8vIHRoZXJlIGFyZSBubyBvZmYtYnktb25lIHByb2JsZW1zIGluIG91ciBzaHVmZmxlIGFsZ29yaXRobS4KKyAgRVhQRUNUX05FKDAsIHZlY3Rvcl9bMF0pOworICBFWFBFQ1RfTkUoa1ZlY3RvclNpemUgLSAxLCB2ZWN0b3JfW2tWZWN0b3JTaXplIC0gMV0pOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzU3RhcnRPZlZlY3RvcikgeworICBjb25zdCBpbnQga1JhbmdlU2l6ZSA9IGtWZWN0b3JTaXplLzI7CisKKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCAwLCBrUmFuZ2VTaXplLCAmdmVjdG9yXyk7CisKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzU2h1ZmZsZWQsIHZlY3Rvcl8sIDAsIGtSYW5nZVNpemUpOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8sIGtSYW5nZVNpemUsIGtWZWN0b3JTaXplKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc0VuZE9mVmVjdG9yKSB7CisgIGNvbnN0IGludCBrUmFuZ2VTaXplID0ga1ZlY3RvclNpemUgLyAyOworICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtSYW5nZVNpemUsIGtWZWN0b3JTaXplLCAmdmVjdG9yXyk7CisKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzVW5zaHVmZmxlZCwgdmVjdG9yXywgMCwga1JhbmdlU2l6ZSk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzU2h1ZmZsZWQsIHZlY3Rvcl8sIGtSYW5nZVNpemUsIGtWZWN0b3JTaXplKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc01pZGRsZU9mVmVjdG9yKSB7CisgIGludCBrUmFuZ2VTaXplID0ga1ZlY3RvclNpemUvMzsKKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrUmFuZ2VTaXplLCAyKmtSYW5nZVNpemUsICZ2ZWN0b3JfKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNVbnNodWZmbGVkLCB2ZWN0b3JfLCAwLCBrUmFuZ2VTaXplKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNTaHVmZmxlZCwgdmVjdG9yXywga1JhbmdlU2l6ZSwgMiprUmFuZ2VTaXplKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNVbnNodWZmbGVkLCB2ZWN0b3JfLCAyKmtSYW5nZVNpemUsIGtWZWN0b3JTaXplKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc1JlcGVhdGFibHkpIHsKKyAgVGVzdGluZ1ZlY3RvciB2ZWN0b3IyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtWZWN0b3JTaXplOyBpKyspIHsKKyAgICB2ZWN0b3IyLnB1c2hfYmFjayhpKTsKKyAgfQorCisgIHJhbmRvbV8uUmVzZWVkKDEyMzQpOworICBTaHVmZmxlKCZyYW5kb21fLCAmdmVjdG9yXyk7CisgIHJhbmRvbV8uUmVzZWVkKDEyMzQpOworICBTaHVmZmxlKCZyYW5kb21fLCAmdmVjdG9yMik7CisKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3RvcjIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1ZlY3RvclNpemU7IGkrKykgeworICAgIEVYUEVDVF9FUSh2ZWN0b3JfW2ldLCB2ZWN0b3IyW2ldKSA8PCAiIHdoZXJlIGkgaXMgIiA8PCBpOworICB9Cit9CisKKy8vIFRlc3RzIHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MuCisKK1RFU1QoQXNzZXJ0SGVscGVyVGVzdCwgQXNzZXJ0SGVscGVySXNTbWFsbCkgeworICAvLyBUbyBhdm9pZCBicmVha2luZyBjbGllbnRzIHRoYXQgdXNlIGxvdHMgb2YgYXNzZXJ0aW9ucyBpbiBvbmUKKyAgLy8gZnVuY3Rpb24sIHdlIGNhbm5vdCBncm93IHRoZSBzaXplIG9mIEFzc2VydEhlbHBlci4KKyAgRVhQRUNUX0xFKHNpemVvZih0ZXN0aW5nOjppbnRlcm5hbDo6QXNzZXJ0SGVscGVyKSwgc2l6ZW9mKHZvaWQqKSk7Cit9CisKKy8vIFRlc3RzIFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoKS4KK1RFU1QoU3RyaW5nVGVzdCwgRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUpIHsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiZm9vYmFyIiwgIkJBUiIpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiZm9vYmFSIiwgImJhciIpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiZm9vYmFyIiwgIiIpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiIiwgIiIpKTsKKworICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiRm9vYmFyIiwgImZvbyIpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoImZvb2JhciIsICJGb28iKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCIiLCAiZm9vIikpOworfQorCisvLyBDKytCdWlsZGVyJ3MgcHJlcHJvY2Vzc29yIGlzIGJ1Z2d5OyBpdCBmYWlscyB0byBleHBhbmQgbWFjcm9zIHRoYXQKKy8vIGFwcGVhciBpbiBtYWNybyBwYXJhbWV0ZXJzIGFmdGVyIHdpZGUgY2hhciBsaXRlcmFscy4gIFByb3ZpZGUgYW4gYWxpYXMKKy8vIGZvciBOVUxMIGFzIGEgd29ya2Fyb3VuZC4KK3N0YXRpYyBjb25zdCB3Y2hhcl90KiBjb25zdCBrTnVsbCA9IE5VTEw7CisKKy8vIFRlc3RzIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMKK1RFU1QoU3RyaW5nVGVzdCwgQ2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMpIHsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhOVUxMLCBOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGtOdWxsLCBMIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCIiLCBrTnVsbCkpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhrTnVsbCwgTCJmb29iYXIiKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiZm9vYmFyIiwga051bGwpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMImZvb2JhciIsIEwiZm9vYmFyIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiZm9vYmFyIiwgTCJGT09CQVIiKSk7CisgIEVYUEVDVF9UUlVFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCJGT09CQVIiLCBMImZvb2JhciIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBTdHJpbmc6OkZvcm1hdCgpIHdvcmtzLgorVEVTVChTdHJpbmdUZXN0LCBGb3JtYXRXb3JrcykgeworICAvLyBOb3JtYWwgY2FzZTogdGhlIGZvcm1hdCBzcGVjIGlzIHZhbGlkLCB0aGUgYXJndW1lbnRzIG1hdGNoIHRoZQorICAvLyBzcGVjLCBhbmQgdGhlIHJlc3VsdCBpcyA8IDQwOTUgY2hhcmFjdGVycy4KKyAgRVhQRUNUX1NUUkVRKCJIZWxsbywgNDIiLCBTdHJpbmc6OkZvcm1hdCgiJXMsICVkIiwgIkhlbGxvIiwgNDIpLmNfc3RyKCkpOworCisgIC8vIEVkZ2UgY2FzZTogdGhlIHJlc3VsdCBpcyA0MDk1IGNoYXJhY3RlcnMuCisgIGNoYXIgYnVmZmVyWzQwOTZdOworICBjb25zdCBzaXplX3Qga1NpemUgPSBzaXplb2YoYnVmZmVyKTsKKyAgbWVtc2V0KGJ1ZmZlciwgJ2EnLCBrU2l6ZSAtIDEpOworICBidWZmZXJba1NpemUgLSAxXSA9ICdcMCc7CisgIEVYUEVDVF9FUShidWZmZXIsIFN0cmluZzo6Rm9ybWF0KCIlcyIsIGJ1ZmZlcikpOworCisgIC8vIFRoZSByZXN1bHQgbmVlZHMgdG8gYmUgNDA5NiBjaGFyYWN0ZXJzLCBleGNlZWRpbmcgRm9ybWF0KCkncyBsaW1pdC4KKyAgRVhQRUNUX0VRKCI8Zm9ybWF0dGluZyBlcnJvciBvciBidWZmZXIgZXhjZWVkZWQ+IiwKKyAgICAgICAgICAgIFN0cmluZzo6Rm9ybWF0KCJ4JXMiLCBidWZmZXIpKTsKKworI2lmIEdURVNUX09TX0xJTlVYICYmICFHVEVTVF9PU19MSU5VWF9BTkRST0lECisgIC8vIE9uIExpbnV4LCBpbnZhbGlkIGZvcm1hdCBzcGVjIHNob3VsZCBsZWFkIHRvIGFuIGVycm9yIG1lc3NhZ2UuCisgIC8vIEluIG90aGVyIGVudmlyb25tZW50IChlLmcuIE1TVkMgb24gV2luZG93cyksIFN0cmluZzo6Rm9ybWF0KCkgbWF5CisgIC8vIHNpbXBseSBpZ25vcmUgYSBiYWQgZm9ybWF0IHNwZWMsIHNvIHRoaXMgYXNzZXJ0aW9uIGlzIHJ1biBvbgorICAvLyBMaW51eCBvbmx5LgorICBFWFBFQ1RfRVEoIjxmb3JtYXR0aW5nIGVycm9yIG9yIGJ1ZmZlciBleGNlZWRlZD4iLAorICAgICAgICAgICAgU3RyaW5nOjpGb3JtYXQoIiUiKSk7CisjZW5kaWYKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoKS4KK1RFU1QoU3RyaW5nVGVzdCwgU2hvd1dpZGVDU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwKKyAgICAgICAgICAgICAgIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKE5VTEwpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIiIsIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKEwiIikuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiwgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoTCJmb28iKS5jX3N0cigpKTsKK30KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorVEVTVChTdHJpbmdUZXN0LCBBbnNpQW5kVXRmMTZOdWxsKSB7CisgIEVYUEVDVF9FUShOVUxMLCBTdHJpbmc6OkFuc2lUb1V0ZjE2KE5VTEwpKTsKKyAgRVhQRUNUX0VRKE5VTEwsIFN0cmluZzo6VXRmMTZUb0Fuc2koTlVMTCkpOworfQorCitURVNUKFN0cmluZ1Rlc3QsIEFuc2lBbmRVdGYxNkNvbnZlcnRCYXNpYykgeworICBjb25zdCBjaGFyKiBhbnNpID0gU3RyaW5nOjpVdGYxNlRvQW5zaShMInN0ciIpOworICBFWFBFQ1RfU1RSRVEoInN0ciIsIGFuc2kpOworICBkZWxldGUgW10gYW5zaTsKKyAgY29uc3QgV0NIQVIqIHV0ZjE2ID0gU3RyaW5nOjpBbnNpVG9VdGYxNigic3RyIik7CisgIEVYUEVDVF9FUSgwLCB3Y3NuY21wKEwic3RyIiwgdXRmMTYsIDMpKTsKKyAgZGVsZXRlIFtdIHV0ZjE2OworfQorCitURVNUKFN0cmluZ1Rlc3QsIEFuc2lBbmRVdGYxNkNvbnZlcnRQYXRoQ2hhcnMpIHsKKyAgY29uc3QgY2hhciogYW5zaSA9IFN0cmluZzo6VXRmMTZUb0Fuc2koTCIuOlxcIFwiKj8iKTsKKyAgRVhQRUNUX1NUUkVRKCIuOlxcIFwiKj8iLCBhbnNpKTsKKyAgZGVsZXRlIFtdIGFuc2k7CisgIGNvbnN0IFdDSEFSKiB1dGYxNiA9IFN0cmluZzo6QW5zaVRvVXRmMTYoIi46XFwgXCIqPyIpOworICBFWFBFQ1RfRVEoMCwgd2NzbmNtcChMIi46XFwgXCIqPyIsIHV0ZjE2LCAzKSk7CisgIGRlbGV0ZSBbXSB1dGYxNjsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyBUZXN0UHJvcGVydHkgY29uc3RydWN0aW9uLgorVEVTVChUZXN0UHJvcGVydHlUZXN0LCBTdHJpbmdWYWx1ZSkgeworICBUZXN0UHJvcGVydHkgcHJvcGVydHkoImtleSIsICIxIik7CisgIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFByb3BlcnR5IHJlcGxhY2luZyBhIHZhbHVlLgorVEVTVChUZXN0UHJvcGVydHlUZXN0LCBSZXBsYWNlU3RyaW5nVmFsdWUpIHsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5KCJrZXkiLCAiMSIpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKKyAgcHJvcGVydHkuU2V0VmFsdWUoIjIiKTsKKyAgRVhQRUNUX1NUUkVRKCIyIiwgcHJvcGVydHkudmFsdWUoKSk7Cit9CisKKy8vIEFkZEZhdGFsRmFpbHVyZSgpIGFuZCBBZGROb25mYXRhbEZhaWx1cmUoKSBtdXN0IGJlIHN0YW5kLWFsb25lCisvLyBmdW5jdGlvbnMgKGkuZS4gdGhlaXIgZGVmaW5pdGlvbnMgY2Fubm90IGJlIGlubGluZWQgYXQgdGhlIGNhbGwKKy8vIHNpdGVzKSwgb3IgQysrQnVpbGRlciB3b24ndCBjb21waWxlIHRoZSBjb2RlLgorc3RhdGljIHZvaWQgQWRkRmF0YWxGYWlsdXJlKCkgeworICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKK30KKworc3RhdGljIHZvaWQgQWRkTm9uZmF0YWxGYWlsdXJlKCkgeworICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworfQorCitjbGFzcyBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOiAgLy8gTXVzdCBiZSBwdWJsaWMgYW5kIG5vdCBwcm90ZWN0ZWQgZHVlIHRvIGEgYnVnIGluIGcrKyAzLjQuMi4KKyAgZW51bSBGYWlsdXJlTW9kZSB7CisgICAgRkFUQUxfRkFJTFVSRSwKKyAgICBOT05GQVRBTF9GQUlMVVJFCisgIH07CisgIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmUoRmFpbHVyZU1vZGUgZmFpbHVyZSkgeworICAgIGlmIChmYWlsdXJlID09IEZBVEFMX0ZBSUxVUkUpIHsKKyAgICAgIEFkZEZhdGFsRmFpbHVyZSgpOworICAgIH0gZWxzZSB7CisgICAgICBBZGROb25mYXRhbEZhaWx1cmUoKTsKKyAgICB9CisgIH0KK307CisKKy8vIFRlc3RzIHRoYXQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgaW50ZXJjZXB0cyB0ZXN0CisvLyBmYWlsdXJlcy4KK1RFU1RfRihTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QsIEludGVyY2VwdHNUZXN0RmFpbHVyZXMpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOworICB7CisgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgcmVwb3J0ZXIoCisgICAgICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwKKyAgICAgICAgJnJlc3VsdHMpOworICAgIEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSk7CisgICAgQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKTsKKyAgfQorCisgIEVYUEVDVF9FUSgyLCByZXN1bHRzLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMSkuZmF0YWxseV9mYWlsZWQoKSk7Cit9CisKK1RFU1RfRihTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QsIERlcHJlY2F0ZWRDb25zdHJ1Y3RvcikgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICAvLyBUZXN0cywgdGhhdCB0aGUgZGVwcmVjYXRlZCBjb25zdHJ1Y3RvciBzdGlsbCB3b3Jrcy4KKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgcmVzdWx0cy5zaXplKCkpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCitjbGFzcyBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcldpdGhUaHJlYWRzVGVzdAorICA6IHB1YmxpYyBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRmFpbHVyZU1vZGUgZmFpbHVyZSkgeworICAgIFRocmVhZFdpdGhQYXJhbTxGYWlsdXJlTW9kZT4gdGhyZWFkKCZBZGRGYWlsdXJlLCBmYWlsdXJlLCBOVUxMKTsKKyAgICB0aHJlYWQuSm9pbigpOworICB9Cit9OworCitURVNUX0YoU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJXaXRoVGhyZWFkc1Rlc3QsCisgICAgICAgSW50ZXJjZXB0c1Rlc3RGYWlsdXJlc0luQWxsVGhyZWFkcykgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKKyAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9BTExfVEhSRUFEUywgJnJlc3VsdHMpOworICAgIEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSk7CisgICAgQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChOT05GQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGQVRBTF9GQUlMVVJFKTsKKyAgfQorCisgIEVYUEVDVF9FUSg0LCByZXN1bHRzLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMSkuZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMikubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMykuZmF0YWxseV9mYWlsZWQoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQorCisvLyBUZXN0cyBFWFBFQ1RfRkFUQUxfRkFJTFVSRXssT05fQUxMX1RIUkVBRFN9LiAgTWFrZXMgc3VyZSB0aGF0IHRoZXkKKy8vIHdvcmsgZXZlbiBpZiB0aGUgZmFpbHVyZSBpcyBnZW5lcmF0ZWQgaW4gYSBjYWxsZWQgZnVuY3Rpb24gcmF0aGVyIHRoYW4KKy8vIHRoZSBjdXJyZW50IGNvbnRleHQuCisKK3R5cGVkZWYgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0IEV4cGVjdEZhdGFsRmFpbHVyZVRlc3Q7CisKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBDYXRjaGVzRmF0YWxGYWxpdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhdGFsRmFpbHVyZSgpLCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c1N0cmluZ09iamVjdCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYXRhbEZhaWx1cmUoKSwgOjpzdHJpbmcoIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIikpOworfQorI2VuZGlmCisKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RkU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpKTsKK30KKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhdGNoZXNGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gV2UgaGF2ZSBhbm90aGVyIHRlc3QgYmVsb3cgdG8gdmVyaWZ5IHRoYXQgdGhlIG1hY3JvIGNhdGNoZXMgZmF0YWwKKyAgLy8gZmFpbHVyZXMgZ2VuZXJhdGVkIG9uIGFub3RoZXIgdGhyZWFkLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYXRhbEZhaWx1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIgorIyBwcmFnbWEgb3B0aW9uIHB1c2ggLXctY2NjCisjZW5kaWYKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIGNhbiBiZSB1c2VkIGluIGEgbm9uLXZvaWQKKy8vIGZ1bmN0aW9uIGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50IGluIGl0IGNvbnRhaW5zIEFTU0VSVF8qLgorCitpbnQgTm9uVm9pZEZ1bmN0aW9uKCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShmYWxzZSksICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoRkFJTCgpLCAiIik7CisgIHJldHVybiAwOworfQorCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2FuQmVVc2VkSW5Ob25Wb2lkRnVuY3Rpb24pIHsKKyAgTm9uVm9pZEZ1bmN0aW9uKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50LCAuLi4pIGRvZXNuJ3QgYWJvcnQgdGhlCisvLyBjdXJyZW50IGZ1bmN0aW9uIGV2ZW4gdGhvdWdoICdzdGF0ZW1lbnQnIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUuCisKK3ZvaWQgRG9lc05vdEFib3J0SGVscGVyKGJvb2wqIGFib3J0ZWQpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoZmFsc2UpLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEZBSUwoKSwgIiIpOworCisgICphYm9ydGVkID0gZmFsc2U7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXBwcmVzc2VkIHRoZW0uCisjIHByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIERvZXNOb3RBYm9ydCkgeworICBib29sIGFib3J0ZWQgPSB0cnVlOworICBEb2VzTm90QWJvcnRIZWxwZXIoJmFib3J0ZWQpOworICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIEVYUEVDVF9GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9IGFjY2VwdHMgYQorLy8gc3RhdGVtZW50IHRoYXQgY29udGFpbnMgYSBtYWNybyB3aGljaCBleHBhbmRzIHRvIGNvZGUgY29udGFpbmluZyBhbgorLy8gdW5wcm90ZWN0ZWQgY29tbWEuCisKK3N0YXRpYyBpbnQgZ2xvYmFsX3ZhciA9IDA7CisjZGVmaW5lIEdURVNUX1VTRV9VTlBST1RFQ1RFRF9DT01NQV8gZ2xvYmFsX3ZhcisrLCBnbG9iYWxfdmFyKysKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hKSB7CisjaWZuZGVmIF9fQk9STEFORENfXworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKKyAgICBBZGRGYXRhbEZhaWx1cmUoKTsKKyAgfSwgIiIpOworI2VuZGlmCisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoeworICAgIEdURVNUX1VTRV9VTlBST1RFQ1RFRF9DT01NQV87CisgICAgQWRkRmF0YWxGYWlsdXJlKCk7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkV7LE9OX0FMTF9USFJFQURTfS4KKwordHlwZWRlZiBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QgRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdDsKKworVEVTVF9GKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIENhdGNoZXNOb25mYXRhbEZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkTm9uZmF0YWxGYWlsdXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKK30KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c1N0cmluZ09iamVjdCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBZGROb25mYXRhbEZhaWx1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdHJpbmcoIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpKTsKK30KKyNlbmRpZgorCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c1N0ZFN0cmluZ09iamVjdCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBZGROb25mYXRhbEZhaWx1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnN0cmluZygiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIikpOworfQorCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc05vbmZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICAvLyBXZSBoYXZlIGFub3RoZXIgdGVzdCBiZWxvdyB0byB2ZXJpZnkgdGhhdCB0aGUgbWFjcm8gY2F0Y2hlcworICAvLyBub24tZmF0YWwgZmFpbHVyZXMgZ2VuZXJhdGVkIG9uIGFub3RoZXIgdGhyZWFkLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGROb25mYXRhbEZhaWx1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRXssX09OX0FMTF9USFJFQURTfSBhY2NlcHRzIGEKKy8vIHN0YXRlbWVudCB0aGF0IGNvbnRhaW5zIGEgbWFjcm8gd2hpY2ggZXhwYW5kcyB0byBjb2RlIGNvbnRhaW5pbmcgYW4KKy8vIHVucHJvdGVjdGVkIGNvbW1hLgorVEVTVF9GKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBHVEVTVF9VU0VfVU5QUk9URUNURURfQ09NTUFfOworICAgIEFkZE5vbmZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoeworICAgIEdURVNUX1VTRV9VTlBST1RFQ1RFRF9DT01NQV87CisgICAgQWRkTm9uZmF0YWxGYWlsdXJlKCk7CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKKwordHlwZWRlZiBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcldpdGhUaHJlYWRzVGVzdAorICAgIEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3Q7CisKK1RFU1RfRihFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCitURVNUX0YoRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCwgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKAorICAgICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoTk9ORkFUQUxfRkFJTFVSRSksICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKKy8vIFRlc3RzIHRoZSBUZXN0UHJvcGVydHkgY2xhc3MuCisKK1RFU1QoVGVzdFByb3BlcnR5VGVzdCwgQ29uc3RydWN0b3JXb3JrcykgeworICBjb25zdCBUZXN0UHJvcGVydHkgcHJvcGVydHkoImtleSIsICJ2YWx1ZSIpOworICBFWFBFQ1RfU1RSRVEoImtleSIsIHByb3BlcnR5LmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJ2YWx1ZSIsIHByb3BlcnR5LnZhbHVlKCkpOworfQorCitURVNUKFRlc3RQcm9wZXJ0eVRlc3QsIFNldFZhbHVlKSB7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgInZhbHVlXzEiKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgIHByb3BlcnR5LlNldFZhbHVlKCJ2YWx1ZV8yIik7CisgIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoInZhbHVlXzIiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gVGVzdHMgdGhlIFRlc3RSZXN1bHQgY2xhc3MKKworLy8gVGhlIHRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBUZXN0UmVzdWx0LgorY2xhc3MgVGVzdFJlc3VsdFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiBUUFJWZWN0b3I7CisKKyAgLy8gV2UgbWFrZSB1c2Ugb2YgMiBUZXN0UGFydFJlc3VsdCBvYmplY3RzLAorICBUZXN0UGFydFJlc3VsdCAqIHByMSwgKiBwcjI7CisKKyAgLy8gLi4uIGFuZCAzIFRlc3RSZXN1bHQgb2JqZWN0cy4KKyAgVGVzdFJlc3VsdCAqIHIwLCAqIHIxLCAqIHIyOworCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBwcjEgaXMgZm9yIHN1Y2Nlc3MuCisgICAgcHIxID0gbmV3IFRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby9iYXIuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1Y2Nlc3MhIik7CisKKyAgICAvLyBwcjIgaXMgZm9yIGZhdGFsIGZhaWx1cmUuCisgICAgcHIyID0gbmV3IFRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vL2Jhci5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAgLy8gVGhpcyBsaW5lIG51bWJlciBtZWFucyAidW5rbm93biIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUhIik7CisKKyAgICAvLyBDcmVhdGVzIHRoZSBUZXN0UmVzdWx0IG9iamVjdHMuCisgICAgcjAgPSBuZXcgVGVzdFJlc3VsdCgpOworICAgIHIxID0gbmV3IFRlc3RSZXN1bHQoKTsKKyAgICByMiA9IG5ldyBUZXN0UmVzdWx0KCk7CisKKyAgICAvLyBJbiBvcmRlciB0byB0ZXN0IFRlc3RSZXN1bHQsIHdlIG5lZWQgdG8gbW9kaWZ5IGl0cyBpbnRlcm5hbAorICAgIC8vIHN0YXRlLCBpbiBwYXJ0aWN1bGFyIHRoZSBUZXN0UGFydFJlc3VsdCB2ZWN0b3IgaXQgaG9sZHMuCisgICAgLy8gdGVzdF9wYXJ0X3Jlc3VsdHMoKSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLgorICAgIC8vIFdlIGNhc3QgaXQgdG8gYSBub24tY29uc3Qgb2JqZWN0IHMudC4gaXQgY2FuIGJlIG1vZGlmaWVkICh5ZXMsCisgICAgLy8gdGhpcyBpcyBhIGhhY2spLgorICAgIFRQUlZlY3RvciogcmVzdWx0czEgPSBjb25zdF9jYXN0PFRQUlZlY3Rvcio+KAorICAgICAgICAmVGVzdFJlc3VsdEFjY2Vzc29yOjp0ZXN0X3BhcnRfcmVzdWx0cygqcjEpKTsKKyAgICBUUFJWZWN0b3IqIHJlc3VsdHMyID0gY29uc3RfY2FzdDxUUFJWZWN0b3IqPigKKyAgICAgICAgJlRlc3RSZXN1bHRBY2Nlc3Nvcjo6dGVzdF9wYXJ0X3Jlc3VsdHMoKnIyKSk7CisKKyAgICAvLyByMCBpcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgorCisgICAgLy8gcjEgY29udGFpbnMgYSBzaW5nbGUgU1VDQ0VTUyBUZXN0UGFydFJlc3VsdC4KKyAgICByZXN1bHRzMS0+cHVzaF9iYWNrKCpwcjEpOworCisgICAgLy8gcjIgY29udGFpbnMgYSBTVUNDRVNTLCBhbmQgYSBGQUlMVVJFLgorICAgIHJlc3VsdHMyLT5wdXNoX2JhY2soKnByMSk7CisgICAgcmVzdWx0czItPnB1c2hfYmFjaygqcHIyKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBkZWxldGUgcHIxOworICAgIGRlbGV0ZSBwcjI7CisKKyAgICBkZWxldGUgcjA7CisgICAgZGVsZXRlIHIxOworICAgIGRlbGV0ZSByMjsKKyAgfQorCisgIC8vIEhlbHBlciB0aGF0IGNvbXBhcmVzIHR3byB0d28gVGVzdFBhcnRSZXN1bHRzLgorICBzdGF0aWMgdm9pZCBDb21wYXJlVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIGFjdHVhbCkgeworICAgIEVYUEVDVF9FUShleHBlY3RlZC50eXBlKCksIGFjdHVhbC50eXBlKCkpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5maWxlX25hbWUoKSwgYWN0dWFsLmZpbGVfbmFtZSgpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQubGluZV9udW1iZXIoKSwgYWN0dWFsLmxpbmVfbnVtYmVyKCkpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5zdW1tYXJ5KCksIGFjdHVhbC5zdW1tYXJ5KCkpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5tZXNzYWdlKCksIGFjdHVhbC5tZXNzYWdlKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5wYXNzZWQoKSwgYWN0dWFsLnBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuZmFpbGVkKCksIGFjdHVhbC5mYWlsZWQoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLm5vbmZhdGFsbHlfZmFpbGVkKCksIGFjdHVhbC5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuZmF0YWxseV9mYWlsZWQoKSwgYWN0dWFsLmZhdGFsbHlfZmFpbGVkKCkpOworICB9Cit9OworCisvLyBUZXN0cyBUZXN0UmVzdWx0Ojp0b3RhbF9wYXJ0X2NvdW50KCkuCitURVNUX0YoVGVzdFJlc3VsdFRlc3QsIHRvdGFsX3BhcnRfY291bnQpIHsKKyAgQVNTRVJUX0VRKDAsIHIwLT50b3RhbF9wYXJ0X2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgcjEtPnRvdGFsX3BhcnRfY291bnQoKSk7CisgIEFTU0VSVF9FUSgyLCByMi0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6UGFzc2VkKCkuCitURVNUX0YoVGVzdFJlc3VsdFRlc3QsIFBhc3NlZCkgeworICBBU1NFUlRfVFJVRShyMC0+UGFzc2VkKCkpOworICBBU1NFUlRfVFJVRShyMS0+UGFzc2VkKCkpOworICBBU1NFUlRfRkFMU0UocjItPlBhc3NlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6RmFpbGVkKCkuCitURVNUX0YoVGVzdFJlc3VsdFRlc3QsIEZhaWxlZCkgeworICBBU1NFUlRfRkFMU0UocjAtPkZhaWxlZCgpKTsKKyAgQVNTRVJUX0ZBTFNFKHIxLT5GYWlsZWQoKSk7CisgIEFTU0VSVF9UUlVFKHIyLT5GYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OkdldFRlc3RQYXJ0UmVzdWx0KCkuCisKK3R5cGVkZWYgVGVzdFJlc3VsdFRlc3QgVGVzdFJlc3VsdERlYXRoVGVzdDsKKworVEVTVF9GKFRlc3RSZXN1bHREZWF0aFRlc3QsIEdldFRlc3RQYXJ0UmVzdWx0KSB7CisgIENvbXBhcmVUZXN0UGFydFJlc3VsdCgqcHIxLCByMi0+R2V0VGVzdFBhcnRSZXN1bHQoMCkpOworICBDb21wYXJlVGVzdFBhcnRSZXN1bHQoKnByMiwgcjItPkdldFRlc3RQYXJ0UmVzdWx0KDEpKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChyMi0+R2V0VGVzdFBhcnRSZXN1bHQoMiksICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChyMi0+R2V0VGVzdFBhcnRSZXN1bHQoLTEpLCAiIik7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIG5vIHByb3BlcnRpZXMgd2hlbiBub25lIGFyZSBhZGRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgTm9Qcm9wZXJ0aWVzRm91bmRXaGVuTm9uZUFyZUFkZGVkKSB7CisgIFRlc3RSZXN1bHQgdGVzdF9yZXN1bHQ7CisgIEFTU0VSVF9FUSgwLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0IGhhcyB0aGUgZXhwZWN0ZWQgcHJvcGVydHkgd2hlbiBhZGRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgT25lUHJvcGVydHlGb3VuZFdoZW5BZGRlZCkgeworICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OworICBUZXN0UHJvcGVydHkgcHJvcGVydHkoImtleV8xIiwgIjEiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5KTsKKyAgQVNTRVJUX0VRKDEsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgYWN0dWFsX3Byb3BlcnR5ID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDApOworICBFWFBFQ1RfU1RSRVEoImtleV8xIiwgYWN0dWFsX3Byb3BlcnR5LmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIxIiwgYWN0dWFsX3Byb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0IGhhcyBtdWx0aXBsZSBwcm9wZXJ0aWVzIHdoZW4gYWRkZWQuCitURVNUKFRlc3RSZXN1bHRQcm9wZXJ0eVRlc3QsIE11bHRpcGxlUHJvcGVydGllc0ZvdW5kV2hlbkFkZGVkKSB7CisgIFRlc3RSZXN1bHQgdGVzdF9yZXN1bHQ7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8xKCJrZXlfMSIsICIxIik7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8yKCJrZXlfMiIsICIyIik7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCBwcm9wZXJ0eV8xKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5XzIpOworICBBU1NFUlRfRVEoMiwgdGVzdF9yZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBhY3R1YWxfcHJvcGVydHlfMSA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgwKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsIGFjdHVhbF9wcm9wZXJ0eV8xLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIxIiwgYWN0dWFsX3Byb3BlcnR5XzEudmFsdWUoKSk7CisKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBhY3R1YWxfcHJvcGVydHlfMiA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgxKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMiIsIGFjdHVhbF9wcm9wZXJ0eV8yLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIyIiwgYWN0dWFsX3Byb3BlcnR5XzIudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OlJlY29yZFByb3BlcnR5KCkgb3ZlcnJpZGVzIHZhbHVlcyBmb3IgZHVwbGljYXRlIGtleXMuCitURVNUKFRlc3RSZXN1bHRQcm9wZXJ0eVRlc3QsIE92ZXJyaWRlc1ZhbHVlc0ZvckR1cGxpY2F0ZUtleXMpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzFfMSgia2V5XzEiLCAiMSIpOworICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMl8xKCJrZXlfMiIsICIyIik7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8xXzIoImtleV8xIiwgIjEyIik7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8yXzIoImtleV8yIiwgIjIyIik7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCBwcm9wZXJ0eV8xXzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgcHJvcGVydHlfMl8xKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5XzFfMik7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCBwcm9wZXJ0eV8yXzIpOworCisgIEFTU0VSVF9FUSgyLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8xID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDApOworICBFWFBFQ1RfU1RSRVEoImtleV8xIiwgYWN0dWFsX3Byb3BlcnR5XzEua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEyIiwgYWN0dWFsX3Byb3BlcnR5XzEudmFsdWUoKSk7CisKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBhY3R1YWxfcHJvcGVydHlfMiA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgxKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMiIsIGFjdHVhbF9wcm9wZXJ0eV8yLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIyMiIsIGFjdHVhbF9wcm9wZXJ0eV8yLnZhbHVlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0OjpHZXRUZXN0UHJvcGVydHkoKS4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5RGVhdGhUZXN0LCBHZXRUZXN0UHJvcGVydHkpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzEoImtleV8xIiwgIjEiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzIoImtleV8yIiwgIjIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzMoImtleV8zIiwgIjMiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsIHByb3BlcnR5XzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgcHJvcGVydHlfMik7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCBwcm9wZXJ0eV8zKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGZldGNoZWRfcHJvcGVydHlfMSA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgwKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBmZXRjaGVkX3Byb3BlcnR5XzIgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMSk7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgZmV0Y2hlZF9wcm9wZXJ0eV8zID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDIpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBmZXRjaGVkX3Byb3BlcnR5XzEua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBmZXRjaGVkX3Byb3BlcnR5XzEudmFsdWUoKSk7CisKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMiIsIGZldGNoZWRfcHJvcGVydHlfMi5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMiIsIGZldGNoZWRfcHJvcGVydHlfMi52YWx1ZSgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8zIiwgZmV0Y2hlZF9wcm9wZXJ0eV8zLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIzIiwgZmV0Y2hlZF9wcm9wZXJ0eV8zLnZhbHVlKCkpOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQodGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDMpLCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQodGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KC0xKSwgIiIpOworfQorCisvLyBXaGVuIGEgcHJvcGVydHkgdXNpbmcgYSByZXNlcnZlZCBrZXkgaXMgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiwgaXQgdGVzdHMKKy8vIHRoYXQgYSBub24tZmF0YWwgZmFpbHVyZSBpcyBhZGRlZCwgYSBmYXRhbCBmYWlsdXJlIGlzIG5vdCBhZGRlZCwgYW5kIHRoYXQgdGhlCisvLyBwcm9wZXJ0eSBpcyBub3QgcmVjb3JkZWQuCit2b2lkIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KGNvbnN0IGNoYXIqIGtleSkgeworICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OworICBUZXN0UHJvcGVydHkgcHJvcGVydHkoa2V5LCAiMSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCBwcm9wZXJ0eSksCisgICAgICAiUmVzZXJ2ZWQga2V5Iik7CisgIEFTU0VSVF9FUSgwLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpIDw8ICJOb3QgcmVjb3JkZWQiOworfQorCisvLyBBdHRlbXB0aW5nIHRvIHJlY29yZGluZyBhIHByb3BlcnR5IHdpdGggdGhlIFJlc2VydmVkIGxpdGVyYWwgIm5hbWUiCisvLyBzaG91bGQgYWRkIGEgbm9uLWZhdGFsIGZhaWx1cmUgYW5kIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHJlY29yZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBBZGRGYWlsdXJlV2hlblVzaW5nUmVzZXJ2ZWRLZXlDYWxsZWROYW1lKSB7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KCJuYW1lIik7Cit9CisKKy8vIEF0dGVtcHRpbmcgdG8gcmVjb3JkaW5nIGEgcHJvcGVydHkgd2l0aCB0aGUgUmVzZXJ2ZWQgbGl0ZXJhbCAic3RhdHVzIgorLy8gc2hvdWxkIGFkZCBhIG5vbi1mYXRhbCBmYWlsdXJlIGFuZCB0aGUgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSByZWNvcmRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgQWRkRmFpbHVyZVdoZW5Vc2luZ1Jlc2VydmVkS2V5Q2FsbGVkU3RhdHVzKSB7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KCJzdGF0dXMiKTsKK30KKworLy8gQXR0ZW1wdGluZyB0byByZWNvcmRpbmcgYSBwcm9wZXJ0eSB3aXRoIHRoZSBSZXNlcnZlZCBsaXRlcmFsICJ0aW1lIgorLy8gc2hvdWxkIGFkZCBhIG5vbi1mYXRhbCBmYWlsdXJlIGFuZCB0aGUgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSByZWNvcmRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgQWRkRmFpbHVyZVdoZW5Vc2luZ1Jlc2VydmVkS2V5Q2FsbGVkVGltZSkgeworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleSgidGltZSIpOworfQorCisvLyBBdHRlbXB0aW5nIHRvIHJlY29yZGluZyBhIHByb3BlcnR5IHdpdGggdGhlIFJlc2VydmVkIGxpdGVyYWwgImNsYXNzbmFtZSIKKy8vIHNob3VsZCBhZGQgYSBub24tZmF0YWwgZmFpbHVyZSBhbmQgdGhlIHByb3BlcnR5IHNob3VsZCBub3QgYmUgcmVjb3JkZWQuCitURVNUKFRlc3RSZXN1bHRQcm9wZXJ0eVRlc3QsIEFkZEZhaWx1cmVXaGVuVXNpbmdSZXNlcnZlZEtleUNhbGxlZENsYXNzbmFtZSkgeworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleSgiY2xhc3NuYW1lIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgR1Rlc3RGbGFnU2F2ZXIgd29ya3Mgb24gV2luZG93cyBhbmQgTWFjLgorCitjbGFzcyBHVGVzdEZsYWdTYXZlclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBTYXZlcyB0aGUgR29vZ2xlIFRlc3QgZmxhZ3Mgc3VjaCB0aGF0IHdlIGNhbiByZXN0b3JlIHRoZW0gbGF0ZXIsIGFuZAorICAvLyB0aGVuIHNldHMgdGhlbSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgd2lsbCBiZSBjYWxsZWQKKyAgLy8gYmVmb3JlIHRoZSBmaXJzdCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIGlzIHJ1bi4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBzYXZlcl8gPSBuZXcgR1Rlc3RGbGFnU2F2ZXI7CisKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoY29sb3IpID0gImF1dG8iOworICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIiOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IDA7CisgICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gMTsKKyAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBrTWF4U3RhY2tUcmFjZURlcHRoOworICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSAiIjsKKyAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gZmFsc2U7CisgIH0KKworICAvLyBSZXN0b3JlcyB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgdGhhdCB0aGUgdGVzdHMgaGF2ZSBtb2RpZmllZC4gIFRoaXMgd2lsbAorICAvLyBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBpcyBydW4uCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgZGVsZXRlIHNhdmVyXzsKKyAgICBzYXZlcl8gPSBOVUxMOworICB9CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZW4KKyAgLy8gbW9kaWZpZXMgZWFjaCBvZiB0aGVtLgorICB2b2lkIFZlcmlmeUFuZE1vZGlmeUZsYWdzKCkgeworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSk7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImF1dG8iLCBHVEVTVF9GTEFHKGNvbG9yKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcobGlzdF90ZXN0cykpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgR1RFU1RfRkxBRyhvdXRwdXQpLmNfc3RyKCkpOworICAgIEVYUEVDVF9UUlVFKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpOworICAgIEVYUEVDVF9FUSgwLCBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSk7CisgICAgRVhQRUNUX0VRKDEsIEdURVNUX0ZMQUcocmVwZWF0KSk7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoc2h1ZmZsZSkpOworICAgIEVYUEVDVF9FUShrTWF4U3RhY2tUcmFjZURlcHRoLCBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pLmNfc3RyKCkpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKTsKKworICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJubyI7CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gImFiYyI7CisgICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpmb28ueG1sIjsKKyAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSAxOworICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IDEwMDsKKyAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IDE7CisgICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSA9ICJsb2NhbGhvc3Q6MTIzNCI7CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEZvciBzYXZpbmcgR29vZ2xlIFRlc3QgZmxhZ3MgZHVyaW5nIHRoaXMgdGVzdCBjYXNlLgorICBzdGF0aWMgR1Rlc3RGbGFnU2F2ZXIqIHNhdmVyXzsKK307CisKK0dUZXN0RmxhZ1NhdmVyKiBHVGVzdEZsYWdTYXZlclRlc3Q6OnNhdmVyXyA9IE5VTEw7CisKKy8vIEdvb2dsZSBUZXN0IGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBvZiB0ZXN0cy4gIFRoZSBmb2xsb3dpbmcgdHdvCisvLyB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gd29yayByZWdhcmRsZXNzIG9mIHRoZWlyIG9yZGVyLgorCisvLyBNb2RpZmllcyB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gdGhlIHRlc3QgYm9keS4KK1RFU1RfRihHVGVzdEZsYWdTYXZlclRlc3QsIE1vZGlmeUdUZXN0RmxhZ3MpIHsKKyAgVmVyaWZ5QW5kTW9kaWZ5RmxhZ3MoKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gdGhlIGJvZHkgb2YgdGhlIHByZXZpb3VzIHRlc3Qgd2VyZQorLy8gcmVzdG9yZWQgdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLgorVEVTVF9GKEdUZXN0RmxhZ1NhdmVyVGVzdCwgVmVyaWZ5R1Rlc3RGbGFncykgeworICBWZXJpZnlBbmRNb2RpZnlGbGFncygpOworfQorCisvLyBTZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhlIGdpdmVuCisvLyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBhcmd1bWVudCBpcyAiIiwgdW5zZXRzIHRoZSBlbnZpcm9ubWVudAorLy8gdmFyaWFibGUuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgYm90aCBhcmd1bWVudHMgYXJlIG5vdCBOVUxMLgorc3RhdGljIHZvaWQgU2V0RW52KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCisgIHJldHVybjsKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQorICAvLyBDKytCdWlsZGVyJ3MgcHV0ZW52IG9ubHkgc3RvcmVzIGEgcG9pbnRlciB0byBpdHMgcGFyYW1ldGVyOyB3ZSBoYXZlIHRvCisgIC8vIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIGl0IG1pZ2h0IGJlIG5lZWRlZC4KKyAgLy8gV2UgdXNlIGFuIHN0ZDo6bWFwIHRvIGRvIHNvLgorICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nKj4gYWRkZWRfZW52OworCisgIC8vIEJlY2F1c2UgcHV0ZW52IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBidWZmZXIsIHdlIGNhbid0IGRlbGV0ZSB0aGUKKyAgLy8gcHJldmlvdXMgc3RyaW5nIChpZiBwcmVzZW50KSB1bnRpbCBhZnRlciBpdCdzIHJlcGxhY2VkLgorICBzdGQ6OnN0cmluZyAqcHJldl9lbnYgPSBOVUxMOworICBpZiAoYWRkZWRfZW52LmZpbmQobmFtZSkgIT0gYWRkZWRfZW52LmVuZCgpKSB7CisgICAgcHJldl9lbnYgPSBhZGRlZF9lbnZbbmFtZV07CisgIH0KKyAgYWRkZWRfZW52W25hbWVdID0gbmV3IHN0ZDo6c3RyaW5nKAorICAgICAgKE1lc3NhZ2UoKSA8PCBuYW1lIDw8ICI9IiA8PCB2YWx1ZSkuR2V0U3RyaW5nKCkpOworCisgIC8vIFRoZSBzdGFuZGFyZCBzaWduYXR1cmUgb2YgcHV0ZW52IGFjY2VwdHMgYSAnY2hhcionIGFyZ3VtZW50LiBPdGhlcgorICAvLyBpbXBsZW1lbnRhdGlvbnMsIGxpa2UgQysrQnVpbGRlcidzLCBhY2NlcHQgYSAnY29uc3QgY2hhcionLgorICAvLyBXZSBjYXN0IGF3YXkgdGhlICdjb25zdCcgc2luY2UgdGhhdCB3b3VsZCB3b3JrIGZvciBib3RoIHZhcmlhbnRzLgorICBwdXRlbnYoY29uc3RfY2FzdDxjaGFyKj4oYWRkZWRfZW52W25hbWVdLT5jX3N0cigpKSk7CisgIGRlbGV0ZSBwcmV2X2VudjsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgIC8vIElmIHdlIGFyZSBvbiBXaW5kb3dzIHByb3Blci4KKyAgX3B1dGVudigoTWVzc2FnZSgpIDw8IG5hbWUgPDwgIj0iIDw8IHZhbHVlKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyNlbHNlCisgIGlmICgqdmFsdWUgPT0gJ1wwJykgeworICAgIHVuc2V0ZW52KG5hbWUpOworICB9IGVsc2UgeworICAgIHNldGVudihuYW1lLCB2YWx1ZSwgMSk7CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK30KKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudjsKKworLy8gVGVzdHMgSW50MzJGcm9tR1Rlc3RFbnYoKS4KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21HVGVzdEVudigpIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuCitURVNUKEludDMyRnJvbUdUZXN0RW52VGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFyaWFibGVJc05vdFNldCkgeworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIiIpOworICBFWFBFQ1RfRVEoMTAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMTApKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21HVGVzdEVudigpIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KK1RFU1QoSW50MzJGcm9tR1Rlc3RFbnZUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZU92ZXJmbG93cykgeworICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiMTIzNDU2Nzg5ODc2NTQzMjEiKTsKKyAgRVhQRUNUX0VRKDIwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDIwKSk7CisKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICItMTIzNDU2Nzg5ODc2NTQzMjEiKTsKKyAgRVhQRUNUX0VRKDMwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDMwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tR1Rlc3RFbnYoKSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBkZWNpbWFsIGludGVnZXIuCitURVNUKEludDMyRnJvbUdUZXN0RW52VGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFsdWVJc0ludmFsaWQpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgd2FybmluZ3MpXG4iKTsKKworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIkExIik7CisgIEVYUEVDVF9FUSg0MCwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCA0MCkpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiMTJYIik7CisgIEVYUEVDVF9FUSg1MCwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCA1MCkpOworfQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUdUZXN0RW52KCkgcGFyc2VzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gaXQgcmVwcmVzZW50cyBhIHZhbGlkIGRlY2ltYWwgaW50ZWdlciBpbgorLy8gdGhlIHJhbmdlIG9mIGFuIEludDMyLgorVEVTVChJbnQzMkZyb21HVGVzdEVudlRlc3QsIFBhcnNlc0FuZFJldHVybnNWYWxpZFZhbHVlKSB7CisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiMTIzIik7CisgIEVYUEVDVF9FUSgxMjMsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMCkpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiLTMyMSIpOworICBFWFBFQ1RfRVEoLTMyMSwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCAwKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBUZXN0cyBQYXJzZUludDMyRmxhZygpLgorCisvLyBUZXN0cyB0aGF0IFBhcnNlSW50MzJGbGFnKCkgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCBjaGFuZ2UgdGhlCisvLyBvdXRwdXQgdmFsdWUgd2hlbiB0aGUgZmxhZyBoYXMgd3JvbmcgZm9ybWF0CitURVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUmV0dXJuc0ZhbHNlRm9ySW52YWxpZEZsYWcpIHsKKyAgSW50MzIgdmFsdWUgPSAxMjM7CisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hPTEwMCIsICJiIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKKworICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoImE9MTAwIiwgImEiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IFBhcnNlSW50MzJGbGFnKCkgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCBjaGFuZ2UgdGhlCisvLyBvdXRwdXQgdmFsdWUgd2hlbiB0aGUgZmxhZyBvdmVyZmxvd3MgYXMgYW4gSW50MzIuCitURVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFsdWVPdmVyZmxvd3MpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgd2FybmluZ3MpXG4iKTsKKworICBJbnQzMiB2YWx1ZSA9IDEyMzsKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz0xMjM0NTY3ODk4NzY1NDMyMSIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hYmM9LTEyMzQ1Njc4OTg3NjU0MzIxIiwgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IGNoYW5nZSB0aGUKKy8vIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBmbGFnIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGRlY2ltYWwKKy8vIGludGVnZXIuCitURVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFsdWVJc0ludmFsaWQpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgd2FybmluZ3MpXG4iKTsKKworICBJbnQzMiB2YWx1ZSA9IDEyMzsKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz1BMSIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hYmM9MTJYIiwgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSBwYXJzZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFuZAorLy8gcmV0dXJucyB0cnVlIHdoZW4gdGhlIGZsYWcgcmVwcmVzZW50cyBhIHZhbGlkIGRlY2ltYWwgaW50ZWdlciBpbgorLy8gdGhlIHJhbmdlIG9mIGFuIEludDMyLgorVEVTVChQYXJzZUludDMyRmxhZ1Rlc3QsIFBhcnNlc0FuZFJldHVybnNWYWxpZFZhbHVlKSB7CisgIEludDMyIHZhbHVlID0gMTIzOworICBFWFBFQ1RfVFJVRShQYXJzZUludDMyRmxhZygiLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYWJjPTQ1NiIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDQ1NiwgdmFsdWUpOworCisgIEVYUEVDVF9UUlVFKFBhcnNlSW50MzJGbGFnKCItLSIgR1RFU1RfRkxBR19QUkVGSVhfICJhYmM9LTc4OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKC03ODksIHZhbHVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21FbnZPckRpZSgpIHBhcnNlcyB0aGUgdmFsdWUgb2YgdGhlIHZhciBvcgorLy8gcmV0dXJucyB0aGUgY29ycmVjdCBkZWZhdWx0LgorLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitURVNUKEludDMyRnJvbUVudk9yRGllVGVzdCwgUGFyc2VzQW5kUmV0dXJuc1ZhbGlkVmFsdWUpIHsKKyAgRVhQRUNUX0VRKDMzMywgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsIDMzMykpOworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsICIxMjMiKTsKKyAgRVhQRUNUX0VRKDEyMywgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsIDMzMykpOworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsICItMTIzIik7CisgIEVYUEVDVF9FUSgtMTIzLCBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgMzMzKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUVudk9yRGllKCkgYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZQorLy8gaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbiBJbnQzMi4KK1RFU1QoSW50MzJGcm9tRW52T3JEaWVEZWF0aFRlc3QsIEFib3J0c09uRmFpbHVyZSkgeworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJWQVIiLCAieHh4Iik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsIDEyMyksCisgICAgICAiLioiKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21FbnZPckRpZSgpIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKKy8vIGlmIHRoZSB2YXJpYWJsZSBjYW5ub3QgYmUgcmVwcmVzbnRlZCBieSBhbiBJbnQzMi4KK1RFU1QoSW50MzJGcm9tRW52T3JEaWVEZWF0aFRlc3QsIEFib3J0c09uSW50MzJPdmVyZmxvdykgeworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJWQVIiLCAiMTIzNDU2Nzg5MTIzNDU2Nzg5MTIzNCIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJWQVIiLCAxMjMpLAorICAgICAgIi4qIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2hvdWxkUnVuVGVzdE9uU2hhcmQoKSBzZWxlY3RzIGFsbCB0ZXN0cworLy8gd2hlcmUgdGhlcmUgaXMgMSBzaGFyZC4KK1RFU1QoU2hvdWxkUnVuVGVzdE9uU2hhcmRUZXN0LCBJc1BhcnRpdGlvbldoZW5UaGVyZUlzT25lU2hhcmQpIHsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgMCkpOworICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCAxKSk7CisgIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDIpKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgMykpOworICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCA0KSk7Cit9CisKK2NsYXNzIFNob3VsZFNoYXJkVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBpbmRleF92YXJfID0gR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJJTkRFWCI7CisgICAgdG90YWxfdmFyXyA9IEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVE9UQUwiOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIFNldEVudihpbmRleF92YXJfLCAiIik7CisgICAgU2V0RW52KHRvdGFsX3Zhcl8sICIiKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIGluZGV4X3Zhcl87CisgIGNvbnN0IGNoYXIqIHRvdGFsX3Zhcl87Cit9OworCisvLyBUZXN0cyB0aGF0IHNoYXJkaW5nIGlzIGRpc2FibGVkIGlmIG5laXRoZXIgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworLy8gYXJlIHNldC4KK1RFU1RfRihTaG91bGRTaGFyZFRlc3QsIFJldHVybnNGYWxzZVdoZW5OZWl0aGVyRW52VmFySXNTZXQpIHsKKyAgU2V0RW52KGluZGV4X3Zhcl8sICIiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICIiKTsKKworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKK30KKworLy8gVGVzdHMgdGhhdCBzaGFyZGluZyBpcyBub3QgZW5hYmxlZCBpZiB0b3RhbF9zaGFyZHMgID09IDEuCitURVNUX0YoU2hvdWxkU2hhcmRUZXN0LCBSZXR1cm5zRmFsc2VXaGVuVG90YWxTaGFyZElzT25lKSB7CisgIFNldEVudihpbmRleF92YXJfLCAiMCIpOworICBTZXRFbnYodG90YWxfdmFyXywgIjEiKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc2hhcmRpbmcgaXMgZW5hYmxlZCBpZiB0b3RhbF9zaGFyZHMgPiAxIGFuZAorLy8gd2UgYXJlIG5vdCBpbiBhIGRlYXRoIHRlc3Qgc3VicHJvY2Vzcy4KKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLgorI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorVEVTVF9GKFNob3VsZFNoYXJkVGVzdCwgV29ya3NXaGVuU2hhcmRFbnZWYXJzQXJlVmFsaWQpIHsKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI0Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiMjIiKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKKworICBTZXRFbnYoaW5kZXhfdmFyXywgIjgiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICI5Iik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICIwIik7CisgIFNldEVudih0b3RhbF92YXJfLCAiOSIpOworICBFWFBFQ1RfVFJVRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gVGVzdHMgdGhhdCB3ZSBleGl0IGluIGVycm9yIGlmIHRoZSBzaGFyZGluZyB2YWx1ZXMgYXJlIG5vdCB2YWxpZC4KKwordHlwZWRlZiBTaG91bGRTaGFyZFRlc3QgU2hvdWxkU2hhcmREZWF0aFRlc3Q7CisKK1RFU1RfRihTaG91bGRTaGFyZERlYXRoVGVzdCwgQWJvcnRzV2hlblNoYXJkaW5nRW52VmFyc0FyZUludmFsaWQpIHsKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI0Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiNCIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSwgIi4qIik7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI0Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiLTIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSksICIuKiIpOworCisgIFNldEVudihpbmRleF92YXJfLCAiNSIpOworICBTZXRFbnYodG90YWxfdmFyXywgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSwgIi4qIik7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICIiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICI1Iik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpLCAiLioiKTsKK30KKworLy8gVGVzdHMgdGhhdCBTaG91bGRSdW5UZXN0T25TaGFyZCBpcyBhIHBhcnRpdGlvbiB3aGVuIDUKKy8vIHNoYXJkcyBhcmUgdXNlZC4KK1RFU1QoU2hvdWxkUnVuVGVzdE9uU2hhcmRUZXN0LCBJc1BhcnRpdGlvbldoZW5UaGVyZUFyZUZpdmVTaGFyZHMpIHsKKyAgLy8gQ2hvb3NlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdGVzdHMgYW5kIHNoYXJkcy4KKyAgY29uc3QgaW50IG51bV90ZXN0cyA9IDE3OworICBjb25zdCBpbnQgbnVtX3NoYXJkcyA9IDU7CisKKyAgLy8gQ2hlY2sgcGFydGl0aW9uaW5nOiBlYWNoIHRlc3Qgc2hvdWxkIGJlIG9uIGV4YWN0bHkgMSBzaGFyZC4KKyAgZm9yIChpbnQgdGVzdF9pZCA9IDA7IHRlc3RfaWQgPCBudW1fdGVzdHM7IHRlc3RfaWQrKykgeworICAgIGludCBwcmV2X3NlbGVjdGVkX3NoYXJkX2luZGV4ID0gLTE7CisgICAgZm9yIChpbnQgc2hhcmRfaW5kZXggPSAwOyBzaGFyZF9pbmRleCA8IG51bV9zaGFyZHM7IHNoYXJkX2luZGV4KyspIHsKKyAgICAgIGlmIChTaG91bGRSdW5UZXN0T25TaGFyZChudW1fc2hhcmRzLCBzaGFyZF9pbmRleCwgdGVzdF9pZCkpIHsKKyAgICAgICAgaWYgKHByZXZfc2VsZWN0ZWRfc2hhcmRfaW5kZXggPCAwKSB7CisgICAgICAgICAgcHJldl9zZWxlY3RlZF9zaGFyZF9pbmRleCA9IHNoYXJkX2luZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIlNoYXJkICIgPDwgcHJldl9zZWxlY3RlZF9zaGFyZF9pbmRleCA8PCAiIGFuZCAiCisgICAgICAgICAgICA8PCBzaGFyZF9pbmRleCA8PCAiIGFyZSBib3RoIHNlbGVjdGVkIHRvIHJ1biB0ZXN0ICIgPDwgdGVzdF9pZDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGJhbGFuY2U6IFRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBzaGFyZGluZyBwcm90b2NvbCwgYnV0IGlzIGEKKyAgLy8gZGVzaXJhYmxlIHByb3BlcnR5IGZvciBwZXJmb3JtYW5jZS4KKyAgZm9yIChpbnQgc2hhcmRfaW5kZXggPSAwOyBzaGFyZF9pbmRleCA8IG51bV9zaGFyZHM7IHNoYXJkX2luZGV4KyspIHsKKyAgICBpbnQgbnVtX3Rlc3RzX29uX3NoYXJkID0gMDsKKyAgICBmb3IgKGludCB0ZXN0X2lkID0gMDsgdGVzdF9pZCA8IG51bV90ZXN0czsgdGVzdF9pZCsrKSB7CisgICAgICBudW1fdGVzdHNfb25fc2hhcmQgKz0KKyAgICAgICAgU2hvdWxkUnVuVGVzdE9uU2hhcmQobnVtX3NoYXJkcywgc2hhcmRfaW5kZXgsIHRlc3RfaWQpOworICAgIH0KKyAgICBFWFBFQ1RfR0UobnVtX3Rlc3RzX29uX3NoYXJkLCBudW1fdGVzdHMgLyBudW1fc2hhcmRzKTsKKyAgfQorfQorCisvLyBGb3IgdGhlIHNhbWUgcmVhc29uIHdlIGFyZSBub3QgZXhwbGljaXRseSB0ZXN0aW5nIGV2ZXJ5dGhpbmcgaW4gdGhlCisvLyBUZXN0IGNsYXNzLCB0aGVyZSBhcmUgbm8gc2VwYXJhdGUgdGVzdHMgZm9yIHRoZSBmb2xsb3dpbmcgY2xhc3NlcworLy8gKGV4Y2VwdCBmb3Igc29tZSB0cml2aWFsIGNhc2VzKToKKy8vCisvLyAgIFRlc3RDYXNlLCBVbml0VGVzdCwgVW5pdFRlc3RSZXN1bHRQcmludGVyLgorLy8KKy8vIFNpbWlsYXJseSwgdGhlcmUgYXJlIG5vIHNlcGFyYXRlIHRlc3RzIGZvciB0aGUgZm9sbG93aW5nIG1hY3JvczoKKy8vCisvLyAgIFRFU1QsIFRFU1RfRiwgUlVOX0FMTF9URVNUUworCitURVNUKFVuaXRUZXN0VGVzdCwgQ2FuR2V0T3JpZ2luYWxXb3JraW5nRGlyKSB7CisgIEFTU0VSVF9UUlVFKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpICE9IE5VTEwpOworICBFWFBFQ1RfU1RSTkUoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCksICIiKTsKK30KKworVEVTVChVbml0VGVzdFRlc3QsIFJldHVybnNQbGF1c2libGVUaW1lc3RhbXApIHsKKyAgRVhQRUNUX0xUKDAsIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5zdGFydF90aW1lc3RhbXAoKSk7CisgIEVYUEVDVF9MRShVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+c3RhcnRfdGltZXN0YW1wKCksIEdldFRpbWVJbk1pbGxpcygpKTsKK30KKworLy8gVGhpcyBncm91cCBvZiB0ZXN0cyBpcyBmb3IgcHJlZGljYXRlIGFzc2VydGlvbnMgKEFTU0VSVF9QUkVEKiwgZXRjKQorLy8gb2YgdmFyaW91cyBhcml0aWVzLiAgVGhleSBkbyBub3QgYXR0ZW1wdCB0byBiZSBleGhhdXN0aXZlLiAgUmF0aGVyLAorLy8gdmlldyB0aGVtIGFzIHNtb2tlIHRlc3RzIHRoYXQgY2FuIGJlIGVhc2lseSByZXZpZXdlZCBhbmQgdmVyaWZpZWQuCisvLyBBIG1vcmUgY29tcGxldGUgc2V0IG9mIHRlc3RzIGZvciBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBjYW4gYmUgZm91bmQKKy8vIGluIGd0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYy4KKworLy8gRmlyc3QsIHNvbWUgcHJlZGljYXRlcyBhbmQgcHJlZGljYXRlLWZvcm1hdHRlcnMgbmVlZGVkIGJ5IHRoZSB0ZXN0cy4KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgYXJndW1lbnQgaXMgYW4gZXZlbiBudW1iZXIuCitib29sIElzRXZlbihpbnQgbikgeworICByZXR1cm4gKG4gJSAyKSA9PSAwOworfQorCisvLyBBIGZ1bmN0b3IgdGhhdCByZXR1cm5zIHRydWUgaWZmIHRoZSBhcmd1bWVudCBpcyBhbiBldmVuIG51bWJlci4KK3N0cnVjdCBJc0V2ZW5GdW5jdG9yIHsKKyAgYm9vbCBvcGVyYXRvcigpKGludCBuKSB7IHJldHVybiBJc0V2ZW4obik7IH0KK307CisKKy8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbiB0aGF0IGFzc2VydHMgdGhlIGFyZ3VtZW50IGlzIGFuIGV2ZW4KKy8vIG51bWJlci4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRJc0V2ZW4oY29uc3QgY2hhciogZXhwciwgaW50IG4pIHsKKyAgaWYgKElzRXZlbihuKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IGV4cHIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCBuIDw8ICIsIHdoaWNoIGlzIG5vdCBldmVuLiI7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Cit9CisKKy8vIEEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBBc3NlcnRpb25SZXN1bHQgZm9yIHVzZSBpbgorLy8gRVhQRUNUL0FTU0VSVF9UUlVFL0ZBTFNFLgorQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdElzRXZlbihpbnQgbikgeworICBpZiAoSXNFdmVuKG4pKQorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOworICBlbHNlCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKK30KKworLy8gQSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIEFzc2VydGlvblJlc3VsdCBidXQgZ2l2ZXMgbm8KKy8vIGV4cGxhbmF0aW9uIHdoeSBpdCBzdWNjZWVkcy4gTmVlZGVkIGZvciB0ZXN0aW5nIHRoYXQKKy8vIEVYUEVDVC9BU1NFUlRfRkFMU0UgaGFuZGxlcyBzdWNoIGZ1bmN0aW9ucyBjb3JyZWN0bHkuCitBc3NlcnRpb25SZXN1bHQgUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbihpbnQgbikgeworICBpZiAoSXNFdmVuKG4pKQorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIGVsc2UKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworfQorCisvLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3RvciB0aGF0IGFzc2VydHMgdGhlIGFyZ3VtZW50IGlzIGFuIGV2ZW4KKy8vIG51bWJlci4KK3N0cnVjdCBBc3NlcnRJc0V2ZW5GdW5jdG9yIHsKKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZXhwciwgaW50IG4pIHsKKyAgICByZXR1cm4gQXNzZXJ0SXNFdmVuKGV4cHIsIG4pOworICB9Cit9OworCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBzdW0gb2YgdGhlIGFyZ3VtZW50cyBpcyBhbiBldmVuIG51bWJlci4KK2Jvb2wgU3VtSXNFdmVuMihpbnQgbjEsIGludCBuMikgeworICByZXR1cm4gSXNFdmVuKG4xICsgbjIpOworfQorCisvLyBBIGZ1bmN0b3IgdGhhdCByZXR1cm5zIHRydWUgaWZmIHRoZSBzdW0gb2YgdGhlIGFyZ3VtZW50cyBpcyBhbiBldmVuCisvLyBudW1iZXIuCitzdHJ1Y3QgU3VtSXNFdmVuM0Z1bmN0b3IgeworICBib29sIG9wZXJhdG9yKCkoaW50IG4xLCBpbnQgbjIsIGludCBuMykgeworICAgIHJldHVybiBJc0V2ZW4objEgKyBuMiArIG4zKTsKKyAgfQorfTsKKworLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uIHRoYXQgYXNzZXJ0cyB0aGUgc3VtIG9mIHRoZQorLy8gYXJndW1lbnRzIGlzIGFuIGV2ZW4gbnVtYmVyLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFN1bUlzRXZlbjQoCisgICAgY29uc3QgY2hhciogZTEsIGNvbnN0IGNoYXIqIGUyLCBjb25zdCBjaGFyKiBlMywgY29uc3QgY2hhciogZTQsCisgICAgaW50IG4xLCBpbnQgbjIsIGludCBuMywgaW50IG40KSB7CisgIGNvbnN0IGludCBzdW0gPSBuMSArIG4yICsgbjMgKyBuNDsKKyAgaWYgKElzRXZlbihzdW0pKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMgPDwgIiArICIgPDwgZTQKKyAgICAgIDw8ICIgKCIgPDwgbjEgPDwgIiArICIgPDwgbjIgPDwgIiArICIgPDwgbjMgPDwgIiArICIgPDwgbjQKKyAgICAgIDw8ICIpIGV2YWx1YXRlcyB0byAiIDw8IHN1bSA8PCAiLCB3aGljaCBpcyBub3QgZXZlbi4iOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZShtc2cpOworfQorCisvLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3RvciB0aGF0IGFzc2VydHMgdGhlIHN1bSBvZiB0aGUgYXJndW1lbnRzCisvLyBpcyBhbiBldmVuIG51bWJlci4KK3N0cnVjdCBBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvciB7CisgIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKAorICAgICAgY29uc3QgY2hhciogZTEsIGNvbnN0IGNoYXIqIGUyLCBjb25zdCBjaGFyKiBlMywgY29uc3QgY2hhciogZTQsCisgICAgICBjb25zdCBjaGFyKiBlNSwgaW50IG4xLCBpbnQgbjIsIGludCBuMywgaW50IG40LCBpbnQgbjUpIHsKKyAgICBjb25zdCBpbnQgc3VtID0gbjEgKyBuMiArIG4zICsgbjQgKyBuNTsKKyAgICBpZiAoSXNFdmVuKHN1bSkpIHsKKyAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgICAgfQorCisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzIDw8ICIgKyAiIDw8IGU0IDw8ICIgKyAiIDw8IGU1CisgICAgICAgIDw8ICIgKCIKKyAgICAgICAgPDwgbjEgPDwgIiArICIgPDwgbjIgPDwgIiArICIgPDwgbjMgPDwgIiArICIgPDwgbjQgPDwgIiArICIgPDwgbjUKKyAgICAgICAgPDwgIikgZXZhbHVhdGVzIHRvICIgPDwgc3VtIDw8ICIsIHdoaWNoIGlzIG5vdCBldmVuLiI7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKKyAgfQorfTsKKworCisvLyBUZXN0cyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KKworLy8gVGVzdHMgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMgdGhhdCBkb24ndCB1c2UgYSBjdXN0b20gZm9ybWF0dGVyLgorVEVTVChQcmVkMVRlc3QsIFdpdGhvdXRGb3JtYXQpIHsKKyAgLy8gU3VjY2VzcyBjYXNlcy4KKyAgRVhQRUNUX1BSRUQxKElzRXZlbkZ1bmN0b3IoKSwgMikgPDwgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7CisgIEFTU0VSVF9QUkVEMShJc0V2ZW4sIDQpOworCisgIC8vIEZhaWx1cmUgY2FzZXMuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMShJc0V2ZW4sIDUpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1BSRUQxKElzRXZlbkZ1bmN0b3IoKSwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICJldmFsdWF0ZXMgdG8gZmFsc2UiKTsKK30KKworLy8gVGVzdHMgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMgdGhhdCB1c2UgYSBjdXN0b20gZm9ybWF0dGVyLgorVEVTVChQcmVkMVRlc3QsIFdpdGhGb3JtYXQpIHsKKyAgLy8gU3VjY2VzcyBjYXNlcy4KKyAgRVhQRUNUX1BSRURfRk9STUFUMShBc3NlcnRJc0V2ZW4sIDIpOworICBBU1NFUlRfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbkZ1bmN0b3IoKSwgNCkKKyAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKKworICAvLyBGYWlsdXJlIGNhc2VzLgorICBjb25zdCBpbnQgbiA9IDU7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuRnVuY3RvcigpLCBuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm4gZXZhbHVhdGVzIHRvIDUsIHdoaWNoIGlzIG5vdCBldmVuLiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbiwgNSkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworfQorCisvLyBUZXN0cyB0aGF0IHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zIGV2YWx1YXRlcyB0aGVpciBhcmd1bWVudHMKKy8vIGV4YWN0bHkgb25jZS4KK1RFU1QoUHJlZDFUZXN0LCBTaW5nbGVFdmFsdWF0aW9uT25GYWlsdXJlKSB7CisgIC8vIEEgc3VjY2VzcyBjYXNlLgorICBzdGF0aWMgaW50IG4gPSAwOworICBFWFBFQ1RfUFJFRDEoSXNFdmVuLCBuKyspOworICBFWFBFQ1RfRVEoMSwgbikgPDwgIlRoZSBhcmd1bWVudCBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworCisgIC8vIEEgZmFpbHVyZSBjYXNlLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbkZ1bmN0b3IoKSwgbisrKQorICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9FUSgyLCBuKSA8PCAiVGhlIGFyZ3VtZW50IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7Cit9CisKKworLy8gVGVzdHMgcHJlZGljYXRlIGFzc2VydGlvbnMgd2hvc2UgYXJpdHkgaXMgPj0gMi4KKworLy8gVGVzdHMgcHJlZGljYXRlIGFzc2VydGlvbnMgdGhhdCBkb24ndCB1c2UgYSBjdXN0b20gZm9ybWF0dGVyLgorVEVTVChQcmVkVGVzdCwgV2l0aG91dEZvcm1hdCkgeworICAvLyBTdWNjZXNzIGNhc2VzLgorICBBU1NFUlRfUFJFRDIoU3VtSXNFdmVuMiwgMiwgNCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7CisgIEVYUEVDVF9QUkVEMyhTdW1Jc0V2ZW4zRnVuY3RvcigpLCA0LCA2LCA4KTsKKworICAvLyBGYWlsdXJlIGNhc2VzLgorICBjb25zdCBpbnQgbjEgPSAxOworICBjb25zdCBpbnQgbjIgPSAyOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDIoU3VtSXNFdmVuMiwgbjEsIG4yKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMyhTdW1Jc0V2ZW4zRnVuY3RvcigpLCAxLCAyLCA0KTsKKyAgfSwgImV2YWx1YXRlcyB0byBmYWxzZSIpOworfQorCisvLyBUZXN0cyBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCitURVNUKFByZWRUZXN0LCBXaXRoRm9ybWF0KSB7CisgIC8vIFN1Y2Nlc3MgY2FzZXMuCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoQXNzZXJ0U3VtSXNFdmVuNCwgNCwgNiwgOCwgMTApIDw8CisgICAgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoQXNzZXJ0U3VtSXNFdmVuNUZ1bmN0b3IoKSwgMiwgNCwgNiwgOCwgMTApOworCisgIC8vIEZhaWx1cmUgY2FzZXMuCisgIGNvbnN0IGludCBuMSA9IDE7CisgIGNvbnN0IGludCBuMiA9IDI7CisgIGNvbnN0IGludCBuMyA9IDQ7CisgIGNvbnN0IGludCBuNCA9IDY7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoQXNzZXJ0U3VtSXNFdmVuNCwgbjEsIG4yLCBuMywgbjQpOworICB9LCAiZXZhbHVhdGVzIHRvIDEzLCB3aGljaCBpcyBub3QgZXZlbi4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNShBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvcigpLCAxLCAyLCA0LCA2LCA4KQorICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgcHJlZGljYXRlIGFzc2VydGlvbnMgZXZhbHVhdGVzIHRoZWlyIGFyZ3VtZW50cworLy8gZXhhY3RseSBvbmNlLgorVEVTVChQcmVkVGVzdCwgU2luZ2xlRXZhbHVhdGlvbk9uRmFpbHVyZSkgeworICAvLyBBIHN1Y2Nlc3MgY2FzZS4KKyAgaW50IG4xID0gMDsKKyAgaW50IG4yID0gMDsKKyAgRVhQRUNUX1BSRUQyKFN1bUlzRXZlbjIsIG4xKyssIG4yKyspOworICBFWFBFQ1RfRVEoMSwgbjEpIDw8ICJBcmd1bWVudCAxIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMikgPDwgIkFyZ3VtZW50IDIgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKworICAvLyBBbm90aGVyIHN1Y2Nlc3MgY2FzZS4KKyAgbjEgPSBuMiA9IDA7CisgIGludCBuMyA9IDA7CisgIGludCBuNCA9IDA7CisgIGludCBuNSA9IDA7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoQXNzZXJ0U3VtSXNFdmVuNUZ1bmN0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICBuMSsrLCBuMisrLCBuMysrLCBuNCsrLCBuNSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7CisgIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjMpIDw8ICJBcmd1bWVudCAzIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuNCkgPDwgIkFyZ3VtZW50IDQgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG41KSA8PCAiQXJndW1lbnQgNSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworCisgIC8vIEEgZmFpbHVyZSBjYXNlLgorICBuMSA9IG4yID0gbjMgPSAwOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDMoU3VtSXNFdmVuM0Z1bmN0b3IoKSwgKytuMSwgbjIrKywgbjMrKykKKyAgICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworICBFWFBFQ1RfRVEoMSwgbjEpIDw8ICJBcmd1bWVudCAxIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMikgPDwgIkFyZ3VtZW50IDIgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4zKSA8PCAiQXJndW1lbnQgMyBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworCisgIC8vIEFub3RoZXIgZmFpbHVyZSBjYXNlLgorICBuMSA9IG4yID0gbjMgPSBuNCA9IDA7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoQXNzZXJ0U3VtSXNFdmVuNCwgKytuMSwgbjIrKywgbjMrKywgbjQrKyk7CisgIH0sICJldmFsdWF0ZXMgdG8gMSwgd2hpY2ggaXMgbm90IGV2ZW4uIik7CisgIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjMpIDw8ICJBcmd1bWVudCAzIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuNCkgPDwgIkFyZ3VtZW50IDQgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKK30KKworCisvLyBTb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgdXNpbmcgb3ZlcmxvYWRlZC90ZW1wbGF0ZQorLy8gZnVuY3Rpb25zIHdpdGggQVNTRVJUX1BSRURuIGFuZCBFWFBFQ1RfUFJFRG4uCisKK2Jvb2wgSXNQb3NpdGl2ZShkb3VibGUgeCkgeworICByZXR1cm4geCA+IDA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBJc05lZ2F0aXZlKFQgeCkgeworICByZXR1cm4geCA8IDA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Citib29sIEdyZWF0ZXJUaGFuKFQxIHgxLCBUMiB4MikgeworICByZXR1cm4geDEgPiB4MjsKK30KKworLy8gVGVzdHMgdGhhdCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRUQqIGFzIGxvbmcgYXMKKy8vIHRoZWlyIHR5cGVzIGFyZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KK1RFU1QoUHJlZGljYXRlQXNzZXJ0aW9uVGVzdCwgQWNjZXB0c092ZXJsb2FkZWRGdW5jdGlvbikgeworICAvLyBDKytCdWlsZGVyIHJlcXVpcmVzIEMtc3R5bGUgY2FzdHMgcmF0aGVyIHRoYW4gc3RhdGljX2Nhc3QuCisgIEVYUEVDVF9QUkVEMSgoYm9vbCAoKikoaW50KSkoSXNQb3NpdGl2ZSksIDUpOyAgLy8gTk9MSU5UCisgIEFTU0VSVF9QUkVEMSgoYm9vbCAoKikoZG91YmxlKSkoSXNQb3NpdGl2ZSksIDYuMCk7ICAvLyBOT0xJTlQKK30KKworLy8gVGVzdHMgdGhhdCB0ZW1wbGF0ZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gKl9QUkVEKiBhcyBsb25nIGFzCisvLyB0aGVpciB0eXBlcyBhcmUgZXhwbGljaXRseSBzcGVjaWZpZWQuCitURVNUKFByZWRpY2F0ZUFzc2VydGlvblRlc3QsIEFjY2VwdHNUZW1wbGF0ZUZ1bmN0aW9uKSB7CisgIEVYUEVDVF9QUkVEMShJc05lZ2F0aXZlPGludD4sIC01KTsKKyAgLy8gTWFrZXMgc3VyZSB0aGF0IHdlIGNhbiBoYW5kbGUgdGVtcGxhdGVzIHdpdGggbW9yZSB0aGFuIG9uZQorICAvLyBwYXJhbWV0ZXIuCisgIEFTU0VSVF9QUkVEMigoR3JlYXRlclRoYW48aW50LCBpbnQ+KSwgNSwgMCk7Cit9CisKKworLy8gU29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB0ZXN0aW5nIHVzaW5nIG92ZXJsb2FkZWQvdGVtcGxhdGUKKy8vIGZ1bmN0aW9ucyB3aXRoIEFTU0VSVF9QUkVEX0ZPUk1BVG4gYW5kIEVYUEVDVF9QUkVEX0ZPUk1BVG4uCisKK0Fzc2VydGlvblJlc3VsdCBJc1Bvc2l0aXZlRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIgKi8sIGludCBuKSB7CisgIHJldHVybiBuID4gMCA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6CisgICAgICBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiRmFpbHVyZSIpOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNQb3NpdGl2ZUZvcm1hdChjb25zdCBjaGFyKiAvKiBleHByICovLCBkb3VibGUgeCkgeworICByZXR1cm4geCA+IDAgPyBBc3NlcnRpb25TdWNjZXNzKCkgOgorICAgICAgQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgIkZhaWx1cmUiKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitBc3NlcnRpb25SZXN1bHQgSXNOZWdhdGl2ZUZvcm1hdChjb25zdCBjaGFyKiAvKiBleHByICovLCBUIHgpIHsKKyAgcmV0dXJuIHggPCAwID8gQXNzZXJ0aW9uU3VjY2VzcygpIDoKKyAgICAgIEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJGYWlsdXJlIik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgRXF1YWxzRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIxICovLCBjb25zdCBjaGFyKiAvKiBleHByMiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHgxLCBjb25zdCBUMiYgeDIpIHsKKyAgcmV0dXJuIHgxID09IHgyID8gQXNzZXJ0aW9uU3VjY2VzcygpIDoKKyAgICAgIEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJGYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gKl9QUkVEX0ZPUk1BVCoKKy8vIHdpdGhvdXQgZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZWlyIHR5cGVzLgorVEVTVChQcmVkaWNhdGVGb3JtYXRBc3NlcnRpb25UZXN0LCBBY2NlcHRzT3ZlcmxvYWRlZEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNQb3NpdGl2ZUZvcm1hdCwgNSk7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoSXNQb3NpdGl2ZUZvcm1hdCwgNi4wKTsKK30KKworLy8gVGVzdHMgdGhhdCB0ZW1wbGF0ZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gKl9QUkVEX0ZPUk1BVCogd2l0aG91dAorLy8gZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZWlyIHR5cGVzLgorVEVTVChQcmVkaWNhdGVGb3JtYXRBc3NlcnRpb25UZXN0LCBBY2NlcHRzVGVtcGxhdGVGdW5jdGlvbikgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQxKElzTmVnYXRpdmVGb3JtYXQsIC01KTsKKyAgQVNTRVJUX1BSRURfRk9STUFUMihFcXVhbHNGb3JtYXQsIDMsIDMpOworfQorCisKKy8vIFRlc3RzIHN0cmluZyBhc3NlcnRpb25zLgorCisvLyBUZXN0cyBBU1NFUlRfU1RSRVEgd2l0aCBub24tTlVMTCBhcmd1bWVudHMuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJFUSkgeworICBjb25zdCBjaGFyICogY29uc3QgcDEgPSAiZ29vZCI7CisgIEFTU0VSVF9TVFJFUShwMSwgcDEpOworCisgIC8vIExldCBwMiBoYXZlIHRoZSBzYW1lIGNvbnRlbnQgYXMgcDEsIGJ1dCBiZSBhdCBhIGRpZmZlcmVudCBhZGRyZXNzLgorICBjb25zdCBjaGFyIHAyW10gPSAiZ29vZCI7CisgIEFTU0VSVF9TVFJFUShwMSwgcDIpOworCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJFUSgiYmFkIiwgImdvb2QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBcImJhZFwiIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9TVFJFUSB3aXRoIE5VTEwgYXJndW1lbnRzLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSRVFfTnVsbCkgeworICBBU1NFUlRfU1RSRVEoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihOVUxMKSwgTlVMTCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJFUShOVUxMLCAibm9uLW51bGwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1udWxsIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9TVFJFUSB3aXRoIE5VTEwgYXJndW1lbnRzLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSRVFfTnVsbDIpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkVRKCJub24tbnVsbCIsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAibm9uLW51bGwiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1NUUk5FLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSTkUpIHsKKyAgQVNTRVJUX1NUUk5FKCJoaSIsICJIaSIpOworICBBU1NFUlRfU1RSTkUoIkhpIiwgTlVMTCk7CisgIEFTU0VSVF9TVFJORShOVUxMLCAiSGkiKTsKKyAgQVNTRVJUX1NUUk5FKCIiLCBOVUxMKTsKKyAgQVNTRVJUX1NUUk5FKE5VTEwsICIiKTsKKyAgQVNTRVJUX1NUUk5FKCIiLCAiSGkiKTsKKyAgQVNTRVJUX1NUUk5FKCJIaSIsICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUk5FKCJIaSIsICJIaSIpLAorICAgICAgICAgICAgICAgICAgICAgICAiXCJIaVwiIHZzIFwiSGlcIiIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfU1RSQ0FTRUVRLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSQ0FTRUVRKSB7CisgIEFTU0VSVF9TVFJDQVNFRVEoImhpIiwgIkhpIik7CisgIEFTU0VSVF9TVFJDQVNFRVEoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihOVUxMKSwgTlVMTCk7CisKKyAgQVNTRVJUX1NUUkNBU0VFUSgiIiwgIiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRUVRKCJIaSIsICJoaTIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIihpZ25vcmluZyBjYXNlKSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfU1RSQ0FTRU5FLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSQ0FTRU5FKSB7CisgIEFTU0VSVF9TVFJDQVNFTkUoImhpMSIsICJIaTIiKTsKKyAgQVNTRVJUX1NUUkNBU0VORSgiSGkiLCBOVUxMKTsKKyAgQVNTRVJUX1NUUkNBU0VORShOVUxMLCAiSGkiKTsKKyAgQVNTRVJUX1NUUkNBU0VORSgiIiwgTlVMTCk7CisgIEFTU0VSVF9TVFJDQVNFTkUoTlVMTCwgIiIpOworICBBU1NFUlRfU1RSQ0FTRU5FKCIiLCAiSGkiKTsKKyAgQVNTRVJUX1NUUkNBU0VORSgiSGkiLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFTkUoIkhpIiwgImhpIiksCisgICAgICAgICAgICAgICAgICAgICAgICIoaWdub3JpbmcgY2FzZSkiKTsKK30KKworLy8gVGVzdHMgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIFNUUkVRX1dpZGUpIHsKKyAgLy8gTlVMTCBzdHJpbmdzLgorICBBU1NFUlRfU1RSRVEoc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCAqPihOVUxMKSwgTlVMTCk7CisKKyAgLy8gRW1wdHkgc3RyaW5ncy4KKyAgQVNTRVJUX1NUUkVRKEwiIiwgTCIiKTsKKworICAvLyBOb24tbnVsbCB2cyBOVUxMLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSRVEoTCJub24tbnVsbCIsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLW51bGwiKTsKKworICAvLyBFcXVhbCBzdHJpbmdzLgorICBFWFBFQ1RfU1RSRVEoTCJIaSIsIEwiSGkiKTsKKworICAvLyBVbmVxdWFsIHN0cmluZ3MuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJFUShMImFiYyIsIEwiQWJjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBYmMiKTsKKworICAvLyBTdHJpbmdzIGNvbnRhaW5pbmcgd2lkZSBjaGFyYWN0ZXJzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSRVEoTCJhYmNceDgxMTkiLCBMImFiY1x4ODEyMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIik7CisKKyAgLy8gVGhlIHN0cmVhbWluZyB2YXJpYXRpb24uCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9TVFJFUShMImFiY1x4ODExOSIsIEwiYWJjXHg4MTIxIikgPDwgIkV4cGVjdGVkIGZhaWx1cmUiOworICB9LCAiRXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisvLyBUZXN0cyAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgU1RSTkVfV2lkZSkgeworICAvLyBOVUxMIHN0cmluZ3MuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9TVFJORShzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90ICo+KE5VTEwpLCBOVUxMKTsKKyAgfSwgIiIpOworCisgIC8vIEVtcHR5IHN0cmluZ3MuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORShMIiIsIEwiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJMXCJcIiIpOworCisgIC8vIE5vbi1udWxsIHZzIE5VTEwuCisgIEFTU0VSVF9TVFJORShMIm5vbi1udWxsIiwgTlVMTCk7CisKKyAgLy8gRXF1YWwgc3RyaW5ncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKEwiSGkiLCBMIkhpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJMXCJIaVwiIik7CisKKyAgLy8gVW5lcXVhbCBzdHJpbmdzLgorICBFWFBFQ1RfU1RSTkUoTCJhYmMiLCBMIkFiYyIpOworCisgIC8vIFN0cmluZ3MgY29udGFpbmluZyB3aWRlIGNoYXJhY3RlcnMuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORShMImFiY1x4ODExOSIsIEwiYWJjXHg4MTE5IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMiKTsKKworICAvLyBUaGUgc3RyZWFtaW5nIHZhcmlhdGlvbi4KKyAgQVNTRVJUX1NUUk5FKEwiYWJjXHg4MTE5IiwgTCJhYmNceDgxMjAiKSA8PCAiVGhpcyBzaG91bGRuJ3QgaGFwcGVuIjsKK30KKworLy8gVGVzdHMgZm9yIDo6dGVzdGluZzo6SXNTdWJzdHJpbmcoKS4KKworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IGNoYXIqLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yQ1N0cmluZykgeworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBOVUxMLCAiYSIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgImIiLCBOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsICJuZWVkbGUiLCAiaGF5c3RhY2siKSk7CisKKyAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oTlVMTCksIE5VTEwpKTsKKyAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCAibmVlZGxlIiwgInR3byBuZWVkbGVzIikpOworfQorCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nKCkgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3Qgd2NoYXJfdCouCitURVNUKElzU3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JXaWRlQ1N0cmluZykgeworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBrTnVsbCwgTCJhIikpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBMImIiLCBrTnVsbCkpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwiaGF5c3RhY2siKSk7CisKKyAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCBzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4oTlVMTCksIE5VTEwpKTsKKyAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwidHdvIG5lZWRsZXMiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcoKSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgbWVzc2FnZSB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCBjaGFyKi4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvckNTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKKyAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJuZWVkbGVcIlxuIgorICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBhIHN1YnN0cmluZyBvZiBoYXlzdGFja19leHByXG4iCisgICAgICAgICAgICAgICAiV2hpY2ggaXM6IFwiaGF5c3RhY2tcIiIsCisgICAgICAgICAgICAgICBJc1N1YnN0cmluZygibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZGxlIiwgImhheXN0YWNrIikuZmFpbHVyZV9tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjpzdHJpbmcuCitURVNUKElzU3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRzRm9yU3RkU3RyaW5nKSB7CisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgc3RkOjpzdHJpbmcoImhlbGxvIiksICJhaGVsbG9iIikpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCAiaGVsbG8iLCBzdGQ6OnN0cmluZygid29ybGQiKSkpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjp3c3RyaW5nLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yU3RkV3N0cmluZykgeworICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsIDo6c3RkOjp3c3RyaW5nKEwibmVlZGxlIiksIEwidHdvIG5lZWRsZXMiKSk7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgOjpzdGQ6OndzdHJpbmcoTCJoYXlzdGFjayIpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcoKSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgbWVzc2FnZSB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6d3N0cmluZy4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvcldzdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKKyAgICAgICAgICAgICAgICIgIEFjdHVhbDogTFwibmVlZGxlXCJcbiIKKyAgICAgICAgICAgICAgICJFeHBlY3RlZDogYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2tfZXhwclxuIgorICAgICAgICAgICAgICAgIldoaWNoIGlzOiBMXCJoYXlzdGFja1wiIiwKKyAgICAgICAgICAgICAgIElzU3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICJuZWVkbGVfZXhwciIsICJoYXlzdGFja19leHByIiwKKyAgICAgICAgICAgICAgICAgICA6OnN0ZDo6d3N0cmluZyhMIm5lZWRsZSIpLCBMImhheXN0YWNrIikuZmFpbHVyZV9tZXNzYWdlKCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisvLyBUZXN0cyBmb3IgOjp0ZXN0aW5nOjpJc05vdFN1YnN0cmluZygpLgorCisvLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nKCkgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3QgY2hhciouCitURVNUKElzTm90U3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JDU3RyaW5nKSB7CisgIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgIm5lZWRsZSIsICJoYXlzdGFjayIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgIm5lZWRsZSIsICJ0d28gbmVlZGxlcyIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IHdjaGFyX3QqLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yV2lkZUNTdHJpbmcpIHsKKyAgRVhQRUNUX1RSVUUoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwiaGF5c3RhY2siKSk7CisgIEVYUEVDVF9GQUxTRShJc05vdFN1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgTCJ0d28gbmVlZGxlcyIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBtZXNzYWdlIHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IHdjaGFyX3QqLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIEdlbmVyYXRlc0NvcnJlY3RNZXNzYWdlRm9yV2lkZUNTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKKyAgICAgICAgICAgICAgICIgIEFjdHVhbDogTFwibmVlZGxlXCJcbiIKKyAgICAgICAgICAgICAgICJFeHBlY3RlZDogbm90IGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrX2V4cHJcbiIKKyAgICAgICAgICAgICAgICJXaGljaCBpczogTFwidHdvIG5lZWRsZXNcIiIsCisgICAgICAgICAgICAgICBJc05vdFN1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCisgICAgICAgICAgICAgICAgICAgTCJuZWVkbGUiLCBMInR3byBuZWVkbGVzIikuZmFpbHVyZV9tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjpzdHJpbmcuCitURVNUKElzTm90U3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRzRm9yU3RkU3RyaW5nKSB7CisgIEVYUEVDVF9GQUxTRShJc05vdFN1YnN0cmluZygiIiwgIiIsIHN0ZDo6c3RyaW5nKCJoZWxsbyIpLCAiYWhlbGxvYiIpKTsKKyAgRVhQRUNUX1RSVUUoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCAiaGVsbG8iLCBzdGQ6OnN0cmluZygid29ybGQiKSkpOworfQorCisvLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nKCkgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OnN0cmluZy4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvclN0ZFN0cmluZykgeworICBFWFBFQ1RfU1RSRVEoIlZhbHVlIG9mOiBuZWVkbGVfZXhwclxuIgorICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBcIm5lZWRsZVwiXG4iCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IG5vdCBhIHN1YnN0cmluZyBvZiBoYXlzdGFja19leHByXG4iCisgICAgICAgICAgICAgICAiV2hpY2ggaXM6IFwidHdvIG5lZWRsZXNcIiIsCisgICAgICAgICAgICAgICBJc05vdFN1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCisgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnN0cmluZygibmVlZGxlIiksICJ0d28gbmVlZGxlcyIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworCisvLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjp3c3RyaW5nLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yU3RkV3N0cmluZykgeworICBFWFBFQ1RfRkFMU0UoCisgICAgICBJc05vdFN1YnN0cmluZygiIiwgIiIsIDo6c3RkOjp3c3RyaW5nKEwibmVlZGxlIiksIEwidHdvIG5lZWRsZXMiKSk7CisgIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCA6OnN0ZDo6d3N0cmluZyhMImhheXN0YWNrIikpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgZmxvYXRpbmctcG9pbnQgYXNzZXJ0aW9ucy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitjbGFzcyBGbG9hdGluZ1BvaW50VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFByZS1jYWxjdWxhdGVkIG51bWJlcnMgdG8gYmUgdXNlZCBieSB0aGUgdGVzdHMuCisgIHN0cnVjdCBUZXN0VmFsdWVzIHsKKyAgICBSYXdUeXBlIGNsb3NlX3RvX3Bvc2l0aXZlX3plcm87CisgICAgUmF3VHlwZSBjbG9zZV90b19uZWdhdGl2ZV96ZXJvOworICAgIFJhd1R5cGUgZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm87CisKKyAgICBSYXdUeXBlIGNsb3NlX3RvX29uZTsKKyAgICBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9vbmU7CisKKyAgICBSYXdUeXBlIGluZmluaXR5OworICAgIFJhd1R5cGUgY2xvc2VfdG9faW5maW5pdHk7CisgICAgUmF3VHlwZSBmdXJ0aGVyX2Zyb21faW5maW5pdHk7CisKKyAgICBSYXdUeXBlIG5hbjE7CisgICAgUmF3VHlwZSBuYW4yOworICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgdGVzdGluZzo6aW50ZXJuYWw6OkZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gRmxvYXRpbmc7CisgIHR5cGVkZWYgdHlwZW5hbWUgRmxvYXRpbmc6OkJpdHMgQml0czsKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgY29uc3Qgc2l6ZV90IG1heF91bHBzID0gRmxvYXRpbmc6OmtNYXhVbHBzOworCisgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMC4wLgorICAgIGNvbnN0IEJpdHMgemVyb19iaXRzID0gRmxvYXRpbmcoMCkuYml0cygpOworCisgICAgLy8gTWFrZXMgc29tZSBudW1iZXJzIGNsb3NlIHRvIDAuMC4KKyAgICB2YWx1ZXNfLmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8gPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICB6ZXJvX2JpdHMgKyBtYXhfdWxwcy8yKTsKKyAgICB2YWx1ZXNfLmNsb3NlX3RvX25lZ2F0aXZlX3plcm8gPSAtRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgemVyb19iaXRzICsgbWF4X3VscHMgLSBtYXhfdWxwcy8yKTsKKyAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvID0gLUZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIHplcm9fYml0cyArIG1heF91bHBzICsgMSAtIG1heF91bHBzLzIpOworCisgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMS4wLgorICAgIGNvbnN0IEJpdHMgb25lX2JpdHMgPSBGbG9hdGluZygxKS5iaXRzKCk7CisKKyAgICAvLyBNYWtlcyBzb21lIG51bWJlcnMgY2xvc2UgdG8gMS4wLgorICAgIHZhbHVlc18uY2xvc2VfdG9fb25lID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhvbmVfYml0cyArIG1heF91bHBzKTsKKyAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICBvbmVfYml0cyArIG1heF91bHBzICsgMSk7CisKKyAgICAvLyAraW5maW5pdHkuCisgICAgdmFsdWVzXy5pbmZpbml0eSA9IEZsb2F0aW5nOjpJbmZpbml0eSgpOworCisgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgK2luZmluaXR5LgorICAgIGNvbnN0IEJpdHMgaW5maW5pdHlfYml0cyA9IEZsb2F0aW5nKHZhbHVlc18uaW5maW5pdHkpLmJpdHMoKTsKKworICAgIC8vIE1ha2VzIHNvbWUgbnVtYmVycyBjbG9zZSB0byBpbmZpbml0eS4KKyAgICB2YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5ID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgaW5maW5pdHlfYml0cyAtIG1heF91bHBzKTsKKyAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9pbmZpbml0eSA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIGluZmluaXR5X2JpdHMgLSBtYXhfdWxwcyAtIDEpOworCisgICAgLy8gTWFrZXMgc29tZSBOQU4ncy4gIFNldHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmcmFjdGlvbiBzbyB0aGF0CisgICAgLy8gb3VyIE5hTidzIGFyZSBxdWlldDsgdHJ5aW5nIHRvIHByb2Nlc3MgYSBzaWduYWxpbmcgTmFOIHdvdWxkIHJhaXNlIGFuCisgICAgLy8gZXhjZXB0aW9uIGlmIG91ciBlbnZpcm9ubWVudCBlbmFibGVzIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMuCisgICAgdmFsdWVzXy5uYW4xID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhGbG9hdGluZzo6a0V4cG9uZW50Qml0TWFzaworICAgICAgICB8IChzdGF0aWNfY2FzdDxCaXRzPigxKSA8PCAoRmxvYXRpbmc6OmtGcmFjdGlvbkJpdENvdW50IC0gMSkpIHwgMSk7CisgICAgdmFsdWVzXy5uYW4yID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhGbG9hdGluZzo6a0V4cG9uZW50Qml0TWFzaworICAgICAgICB8IChzdGF0aWNfY2FzdDxCaXRzPigxKSA8PCAoRmxvYXRpbmc6OmtGcmFjdGlvbkJpdENvdW50IC0gMSkpIHwgMjAwKTsKKyAgfQorCisgIHZvaWQgVGVzdFNpemUoKSB7CisgICAgRVhQRUNUX0VRKHNpemVvZihSYXdUeXBlKSwgc2l6ZW9mKEJpdHMpKTsKKyAgfQorCisgIHN0YXRpYyBUZXN0VmFsdWVzIHZhbHVlc187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK3R5cGVuYW1lIEZsb2F0aW5nUG9pbnRUZXN0PFJhd1R5cGU+OjpUZXN0VmFsdWVzCisgICAgRmxvYXRpbmdQb2ludFRlc3Q8UmF3VHlwZT46OnZhbHVlc187CisKKy8vIEluc3RhbnRpYXRlcyBGbG9hdGluZ1BvaW50VGVzdCBmb3IgdGVzdGluZyAqX0ZMT0FUX0VRLgordHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxmbG9hdD4gRmxvYXRUZXN0OworCisvLyBUZXN0cyB0aGF0IHRoZSBzaXplIG9mIEZsb2F0OjpCaXRzIG1hdGNoZXMgdGhlIHNpemUgb2YgZmxvYXQuCitURVNUX0YoRmxvYXRUZXN0LCBTaXplKSB7CisgIFRlc3RTaXplKCk7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB3aXRoICswIGFuZCAtMC4KK1RFU1RfRihGbG9hdFRlc3QsIFplcm9zKSB7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjAsIC0wLjApOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoLTAuMCwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkxPQVRfRVEoMC4wLCAxLjUpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS41Iik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIDAuCisvLworLy8gVGhpcyBlbnN1cmVzIHRoYXQgKl9GTE9BVF9FUSBoYW5kbGVzIHRoZSBzaWduIGNvcnJlY3RseSBhbmQgbm8KKy8vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlIGFic29sdXRlIHZhbHVlIGlzIHZlcnkKKy8vIHNtYWxsLgorVEVTVF9GKEZsb2F0VGVzdCwgQWxtb3N0WmVyb3MpIHsKKyAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQorICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCisgIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgorICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCisgIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKKyAgLy8gKHBhcmVudGhlc2VzKS4KKyAgc3RhdGljIGNvbnN0IEZsb2F0VGVzdDo6VGVzdFZhbHVlcyYgdiA9IHRoaXMtPnZhbHVlc187CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMCwgdi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0wLjAsIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7CisgIEVYUEVDVF9GTE9BVF9FUSh2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0ZMT0FUX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywKKyAgICAgICAgICAgICAgICAgICAgdi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyk7CisgIH0sICJ2LmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIGVhY2ggb3RoZXIuCitURVNUX0YoRmxvYXRUZXN0LCBTbWFsbERpZmYpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGZhciBhcGFydC4KK1RFU1RfRihGbG9hdFRlc3QsIExhcmdlRGlmZikgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMi41LCAzLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMy4wIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB3aXRoIGluZmluaXR5LgorLy8KKy8vIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlCisvLyBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5IGxhcmdlLgorVEVTVF9GKEZsb2F0VGVzdCwgSW5maW5pdHkpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uY2xvc2VfdG9faW5maW5pdHkpOworICBFWFBFQ1RfRkxPQVRfRVEoLXZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmluZmluaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi12YWx1ZXNfLmluZmluaXR5Iik7CisKKyAgLy8gVGhpcyBpcyBpbnRlcmVzdGluZyBhcyB0aGUgcmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IGFuZCBuYW4xCisgIC8vIGFyZSBvbmx5IDEgRExQIGFwYXJ0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18ubmFuMSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0IGNvbXBhcmluZyB3aXRoIE5BTiBhbHdheXMgcmV0dXJucyBmYWxzZS4KK1RFU1RfRihGbG9hdFRlc3QsIE5hTikgeworI2lmICFHVEVTVF9PU19TWU1CSUFOCisvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKworICAvLyBJbiBDKytCdWlsZGVyLCBuYW1lcyB3aXRoaW4gbG9jYWwgY2xhc3NlcyAoc3VjaCBhcyB1c2VkIGJ5CisgIC8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFKSBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUKKyAgLy8gc2NvcGluZyBjbGFzcy4gIFVzZSBhIHN0YXRpYyBsb2NhbCBhbGlhcyBhcyBhIHdvcmthcm91bmQuCisgIC8vIFdlIHVzZSB0aGUgYXNzaWdubWVudCBzeW50YXggc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgU3VuIFN0dWRpbywKKyAgLy8gZG9uJ3QgYWxsb3cgaW5pdGlhbGl6aW5nIHJlZmVyZW5jZXMgdXNpbmcgY29uc3RydWN0aW9uIHN5bnRheAorICAvLyAocGFyZW50aGVzZXMpLgorICBzdGF0aWMgY29uc3QgRmxvYXRUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodi5uYW4xLCB2Lm5hbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidi5uYW4xIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSh2Lm5hbjEsIHYubmFuMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Lm5hbjIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdi5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMSIpOworCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GTE9BVF9FUSh2Lm5hbjEsIHYuaW5maW5pdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAidi5pbmZpbml0eSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0ICpfRkxPQVRfRVEgYXJlIHJlZmxleGl2ZS4KK1RFU1RfRihGbG9hdFRlc3QsIFJlZmxleGl2ZSkgeworICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCAwLjApOworICBFWFBFQ1RfRkxPQVRfRVEoMS4wLCAxLjApOworICBBU1NFUlRfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5pbmZpbml0eSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgKl9GTE9BVF9FUSBhcmUgY29tbXV0YXRpdmUuCitURVNUX0YoRmxvYXRUZXN0LCBDb21tdXRhdGl2ZSkgeworICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmNsb3NlX3RvX29uZSkuCisgIEVYUEVDVF9GTE9BVF9FUSh2YWx1ZXNfLmNsb3NlX3RvX29uZSwgMS4wKTsKKworICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4wIik7Cit9CisKKy8vIFRlc3RzIEVYUEVDVF9ORUFSLgorVEVTVF9GKEZsb2F0VGVzdCwgRVhQRUNUX05FQVIpIHsKKyAgRVhQRUNUX05FQVIoLTEuMGYsIC0xLjFmLCAwLjJmKTsKKyAgRVhQRUNUX05FQVIoMi4wZiwgMy4wZiwgMS4wZik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORUFSKDEuMGYsMS41ZiwgMC4yNWYpLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMGYgYW5kIDEuNWYgaXMgMC41LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjVmIik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBsaW5lLgorfQorCisvLyBUZXN0cyBBU1NFUlRfTkVBUi4KK1RFU1RfRihGbG9hdFRlc3QsIEFTU0VSVF9ORUFSKSB7CisgIEFTU0VSVF9ORUFSKC0xLjBmLCAtMS4xZiwgMC4yZik7CisgIEFTU0VSVF9ORUFSKDIuMGYsIDMuMGYsIDEuMGYpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLjBmLDEuNWYsIDAuMjVmKSwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjBmIGFuZCAxLjVmIGlzIDAuNSwgIgorICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1ZiIpOworICAvLyBUbyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMi45NS4wLCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vCisgIC8vIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiB0aGUgcHJldmlvdXMgbGluZS4KK30KKworLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIEZsb2F0TEUoKSBzaG91bGQgc3VjY2VlZC4KK1RFU1RfRihGbG9hdFRlc3QsIEZsb2F0TEVTdWNjZWVkcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIDEuMGYsIDIuMGYpOyAgLy8gV2hlbiB2YWwxIDwgdmFsMiwKKyAgQVNTRVJUX1BSRURfRk9STUFUMihGbG9hdExFLCAxLjBmLCAxLjBmKTsgIC8vIHZhbDEgPT0gdmFsMiwKKworICAvLyBvciB3aGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuLCBidXQgYWxtb3N0IGVxdWFscyB0bywgdmFsMi4KKyAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIDAuMGYpOworfQorCisvLyBUZXN0cyB0aGUgY2FzZXMgd2hlcmUgRmxvYXRMRSgpIHNob3VsZCBmYWlsLgorVEVTVF9GKEZsb2F0VGVzdCwgRmxvYXRMRUZhaWxzKSB7CisgIC8vIFdoZW4gdmFsMSBpcyBncmVhdGVyIHRoYW4gdmFsMiBieSBhIGxhcmdlIG1hcmdpbiwKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCAyLjBmLCAxLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyLjBmKSA8PSAoMS4wZikiKTsKKworICAvLyBvciBieSBhIHNtYWxsIHlldCBub24tbmVnbGlnaWJsZSBtYXJnaW4sCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjBmKTsKKyAgfSwgIih2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpIDw9ICgxLjBmKSIpOworCisjaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgLy8gQysrQnVpbGRlciBnaXZlcyBiYWQgcmVzdWx0cyBmb3Igb3JkZXJlZCBjb21wYXJpc29ucyBpbnZvbHZpbmcgTmFOcworICAvLyBkdWUgdG8gY29tcGlsZXIgYnVncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLm5hbjEsIHZhbHVlc18uaW5maW5pdHkpOworICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18uaW5maW5pdHkpIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgLXZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSk7CisgIH0sICIoLXZhbHVlc18uaW5maW5pdHkpIDw9ICh2YWx1ZXNfLm5hbjEpIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLm5hbjEpOworICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18ubmFuMSkiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorfQorCisvLyBJbnN0YW50aWF0ZXMgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgKl9ET1VCTEVfRVEuCit0eXBlZGVmIEZsb2F0aW5nUG9pbnRUZXN0PGRvdWJsZT4gRG91YmxlVGVzdDsKKworLy8gVGVzdHMgdGhhdCB0aGUgc2l6ZSBvZiBEb3VibGU6OkJpdHMgbWF0Y2hlcyB0aGUgc2l6ZSBvZiBkb3VibGUuCitURVNUX0YoRG91YmxlVGVzdCwgU2l6ZSkgeworICBUZXN0U2l6ZSgpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgd2l0aCArMCBhbmQgLTAuCitURVNUX0YoRG91YmxlVGVzdCwgWmVyb3MpIHsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIC0wLjApOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKC0wLjAsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0RPVUJMRV9FUSgwLjAsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgY2xvc2UgdG8gMC4KKy8vCisvLyBUaGlzIGVuc3VyZXMgdGhhdCAqX0RPVUJMRV9FUSBoYW5kbGVzIHRoZSBzaWduIGNvcnJlY3RseSBhbmQgbm8KKy8vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlIGFic29sdXRlIHZhbHVlIGlzIHZlcnkKKy8vIHNtYWxsLgorVEVTVF9GKERvdWJsZVRlc3QsIEFsbW9zdFplcm9zKSB7CisgIC8vIEluIEMrK0J1aWxkZXIsIG5hbWVzIHdpdGhpbiBsb2NhbCBjbGFzc2VzIChzdWNoIGFzIHVzZWQgYnkKKyAgLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUpIGNhbm5vdCBiZSByZXNvbHZlZCBhZ2FpbnN0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZQorICAvLyBzY29waW5nIGNsYXNzLiAgVXNlIGEgc3RhdGljIGxvY2FsIGFsaWFzIGFzIGEgd29ya2Fyb3VuZC4KKyAgLy8gV2UgdXNlIHRoZSBhc3NpZ25tZW50IHN5bnRheCBzaW5jZSBzb21lIGNvbXBpbGVycywgbGlrZSBTdW4gU3R1ZGlvLAorICAvLyBkb24ndCBhbGxvdyBpbml0aWFsaXppbmcgcmVmZXJlbmNlcyB1c2luZyBjb25zdHJ1Y3Rpb24gc3ludGF4CisgIC8vIChwYXJlbnRoZXNlcykuCisgIHN0YXRpYyBjb25zdCBEb3VibGVUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKKworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgdi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgtMC4wLCB2LmNsb3NlX3RvX25lZ2F0aXZlX3plcm8pOworICBFWFBFQ1RfRE9VQkxFX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywgdi5jbG9zZV90b19uZWdhdGl2ZV96ZXJvKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRE9VQkxFX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywKKyAgICAgICAgICAgICAgICAgICAgIHYuZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm8pOworICB9LCAidi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBjbG9zZSB0byBlYWNoIG90aGVyLgorVEVTVF9GKERvdWJsZVRlc3QsIFNtYWxsRGlmZikgeworICBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18uZnVydGhlcl9mcm9tX29uZSIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBmYXIgYXBhcnQuCitURVNUX0YoRG91YmxlVGVzdCwgTGFyZ2VEaWZmKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoMi4wLCAzLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMy4wIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB3aXRoIGluZmluaXR5LgorLy8KKy8vIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlCisvLyBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5IGxhcmdlLgorVEVTVF9GKERvdWJsZVRlc3QsIEluZmluaXR5KSB7CisgIEVYUEVDVF9ET1VCTEVfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5jbG9zZV90b19pbmZpbml0eSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLXZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSh2YWx1ZXNfLmluZmluaXR5LCAtdmFsdWVzXy5pbmZpbml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICItdmFsdWVzXy5pbmZpbml0eSIpOworCisgIC8vIFRoaXMgaXMgaW50ZXJlc3RpbmcgYXMgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiBpbmZpbml0eV8gYW5kIG5hbjFfCisgIC8vIGFyZSBvbmx5IDEgRExQIGFwYXJ0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXNfLm5hbjEiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KK30KKworLy8gVGVzdHMgdGhhdCBjb21wYXJpbmcgd2l0aCBOQU4gYWx3YXlzIHJldHVybnMgZmFsc2UuCitURVNUX0YoRG91YmxlVGVzdCwgTmFOKSB7CisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQorICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCisgIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgorICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCisgIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKKyAgLy8gKHBhcmVudGhlc2VzKS4KKyAgc3RhdGljIGNvbnN0IERvdWJsZVRlc3Q6OlRlc3RWYWx1ZXMmIHYgPSB0aGlzLT52YWx1ZXNfOworCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHYubmFuMSwgdi5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHYubmFuMSwgdi5uYW4yKSwgInYubmFuMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdi5uYW4xKSwgInYubmFuMSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRE9VQkxFX0VRKHYubmFuMSwgdi5pbmZpbml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICJ2LmluZmluaXR5Iik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOCit9CisKKy8vIFRlc3RzIHRoYXQgKl9ET1VCTEVfRVEgYXJlIHJlZmxleGl2ZS4KK1RFU1RfRihEb3VibGVUZXN0LCBSZWZsZXhpdmUpIHsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIDAuMCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCAxLjApOworI2lmICFHVEVTVF9PU19TWU1CSUFOCisgIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgorICBBU1NFUlRfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uaW5maW5pdHkpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0ICpfRE9VQkxFX0VRIGFyZSBjb21tdXRhdGl2ZS4KK1RFU1RfRihEb3VibGVUZXN0LCBDb21tdXRhdGl2ZSkgeworICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpLgorICBFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uY2xvc2VfdG9fb25lLCAxLjApOworCisgIC8vIFdlIGFscmVhZHkgdGVzdGVkIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTkVBUi4KK1RFU1RfRihEb3VibGVUZXN0LCBFWFBFQ1RfTkVBUikgeworICBFWFBFQ1RfTkVBUigtMS4wLCAtMS4xLCAwLjIpOworICBFWFBFQ1RfTkVBUigyLjAsIDMuMCwgMS4wKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FQVIoMS4wLCAxLjUsIDAuMjUpLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMCBhbmQgMS41IGlzIDAuNSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1Iik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQuCit9CisKKy8vIFRlc3RzIEFTU0VSVF9ORUFSLgorVEVTVF9GKERvdWJsZVRlc3QsIEFTU0VSVF9ORUFSKSB7CisgIEFTU0VSVF9ORUFSKC0xLjAsIC0xLjEsIDAuMik7CisgIEFTU0VSVF9ORUFSKDIuMCwgMy4wLCAxLjApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLjAsIDEuNSwgMC4yNSksICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wIGFuZCAxLjUgaXMgMC41LCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjUiKTsKKyAgLy8gVG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDIuOTUuMCwgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubworICAvLyBzcGFjZSBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gdGhlIHByZXZpb3VzIHN0YXRlbWVudC4KK30KKworLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIERvdWJsZUxFKCkgc2hvdWxkIHN1Y2NlZWQuCitURVNUX0YoRG91YmxlVGVzdCwgRG91YmxlTEVTdWNjZWVkcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAxLjAsIDIuMCk7ICAvLyBXaGVuIHZhbDEgPCB2YWwyLAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAxLjAsIDEuMCk7ICAvLyB2YWwxID09IHZhbDIsCisKKyAgLy8gb3Igd2hlbiB2YWwxIGlzIGdyZWF0ZXIgdGhhbiwgYnV0IGFsbW9zdCBlcXVhbHMgdG8sIHZhbDIuCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18uY2xvc2VfdG9fcG9zaXRpdmVfemVybywgMC4wKTsKK30KKworLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIERvdWJsZUxFKCkgc2hvdWxkIGZhaWwuCitURVNUX0YoRG91YmxlVGVzdCwgRG91YmxlTEVGYWlscykgeworICAvLyBXaGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuIHZhbDIgYnkgYSBsYXJnZSBtYXJnaW4sCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIDIuMCwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyLjApIDw9ICgxLjApIik7CisKKyAgLy8gb3IgYnkgYSBzbWFsbCB5ZXQgbm9uLW5lZ2xpZ2libGUgbWFyZ2luLAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUsIDEuMCk7CisgIH0sICIodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSA8PSAoMS4wKSIpOworCisjaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgLy8gQysrQnVpbGRlciBnaXZlcyBiYWQgcmVzdWx0cyBmb3Igb3JkZXJlZCBjb21wYXJpc29ucyBpbnZvbHZpbmcgTmFOcworICAvLyBkdWUgdG8gY29tcGlsZXIgYnVncy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLmluZmluaXR5KTsKKyAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLmluZmluaXR5KSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAtdmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKTsKKyAgfSwgIiAoLXZhbHVlc18uaW5maW5pdHkpIDw9ICh2YWx1ZXNfLm5hbjEpIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18ubmFuMSwgdmFsdWVzXy5uYW4xKTsKKyAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLm5hbjEpIik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKK30KKworCisvLyBWZXJpZmllcyB0aGF0IGEgdGVzdCBvciB0ZXN0IGNhc2Ugd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBESVNBQkxFRF8gaXMKKy8vIG5vdCBydW4uCisKKy8vIEEgdGVzdCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIERJU0FCTEVEXy4KKy8vIFNob3VsZCBub3QgcnVuLgorVEVTVChEaXNhYmxlZFRlc3QsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4uIjsKK30KKworLy8gQSB0ZXN0IHdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCBESVNBQkxFRF8uCisvLyBTaG91bGQgcnVuLgorVEVTVChEaXNhYmxlZFRlc3QsIE5vdERJU0FCTEVEX1Rlc3RTaG91bGRSdW4pIHsKKyAgRVhQRUNUX0VRKDEsIDEpOworfQorCisvLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIERJU0FCTEVEXy4KKy8vIFNob3VsZCBub3QgcnVuLgorVEVTVChESVNBQkxFRF9UZXN0Q2FzZSwgVGVzdFNob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogVGVzdCBpbiBkaXNhYmxlZCB0ZXN0IGNhc2Ugc2hvdWxkIG5vdCBiZSBydW4uIjsKK30KKworLy8gQSB0ZXN0IGNhc2UgYW5kIHRlc3Qgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBESVNBQkxFRF8uCisvLyBTaG91bGQgbm90IHJ1bi4KK1RFU1QoRElTQUJMRURfVGVzdENhc2UsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IFRlc3QgaW4gZGlzYWJsZWQgdGVzdCBjYXNlIHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKKy8vIENoZWNrIHRoYXQgd2hlbiBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UgYXJlIGRpc2FibGVkLCBTZXR1cFRlc3RDYXNlKCkgYW5kCisvLyBUZWFyRG93blRlc3RDYXNlKCkgYXJlIG5vdCBjYWxsZWQuCitjbGFzcyBEaXNhYmxlZFRlc3RzVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IEFsbCB0ZXN0cyBkaXNhYmxlZCBpbiB0ZXN0IGNhc2UuICIKKyAgICAgICAgICAgICAgIlNldHVwVGVzdENhc2UoKSBzaG91bGQgbm90IGJlIGNhbGxlZC4iOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogQWxsIHRlc3RzIGRpc2FibGVkIGluIHRlc3QgY2FzZS4gIgorICAgICAgICAgICAgICAiVGVhckRvd25UZXN0Q2FzZSgpIHNob3VsZCBub3QgYmUgY2FsbGVkLiI7CisgIH0KK307CisKK1RFU1RfRihEaXNhYmxlZFRlc3RzVGVzdCwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bl8xKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKK1RFU1RfRihEaXNhYmxlZFRlc3RzVGVzdCwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bl8yKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKKy8vIFRlc3RzIHRoYXQgZGlzYWJsZWQgdHlwZWQgdGVzdHMgYXJlbid0IHJ1bi4KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0IDogcHVibGljIFRlc3QgeworfTsKKwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGRvdWJsZT4gTnVtZXJpY1R5cGVzOworVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdCwgTnVtZXJpY1R5cGVzKTsKKworVFlQRURfVEVTVChUeXBlZFRlc3QsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdHlwZWQgdGVzdCBzaG91bGQgbm90IHJ1bi4iOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERJU0FCTEVEX1R5cGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRShESVNBQkxFRF9UeXBlZFRlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoRElTQUJMRURfVHlwZWRUZXN0LCBTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHR5cGVkIHRlc3Qgc2hvdWxkIG5vdCBydW4uIjsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBUZXN0cyB0aGF0IGRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmVuJ3QgcnVuLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdFAgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQKTsKKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIgorICAgICAgICAgPDwgIkRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFAsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bik7CisKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBUeXBlZFRlc3RQLCBOdW1lcmljVHlwZXMpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERJU0FCTEVEX1R5cGVkVGVzdFAgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChESVNBQkxFRF9UeXBlZFRlc3RQKTsKKworVFlQRURfVEVTVF9QKERJU0FCTEVEX1R5cGVkVGVzdFAsIFNob3VsZE5vdFJ1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIgorICAgICAgICAgPDwgIkRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKERJU0FCTEVEX1R5cGVkVGVzdFAsIFNob3VsZE5vdFJ1bik7CisKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBESVNBQkxFRF9UeXBlZFRlc3RQLCBOdW1lcmljVHlwZXMpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gVGVzdHMgdGhhdCBhc3NlcnRpb24gbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisKK2NsYXNzIFNpbmdsZUV2YWx1YXRpb25UZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzogIC8vIE11c3QgYmUgcHVibGljIGFuZCBub3QgcHJvdGVjdGVkIGR1ZSB0byBhIGJ1ZyBpbiBnKysgMy40LjIuCisgIC8vIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSB0aGUgRmFpbGVkQVNTRVJUX1NUUkVRIHRlc3QKKyAgLy8gYmVsb3cuICBJdCdzIHB1YmxpYyB0byB3b3JrIGFyb3VuZCBDKytCdWlsZGVyJ3MgYnVnIHdpdGggc2NvcGluZyBsb2NhbAorICAvLyBjbGFzc2VzLgorICBzdGF0aWMgdm9pZCBDb21wYXJlQW5kSW5jcmVtZW50Q2hhclB0cnMoKSB7CisgICAgQVNTRVJUX1NUUkVRKHAxXysrLCBwMl8rKyk7CisgIH0KKworICAvLyBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyBuZWVkZWQgYnkgdGhlIEZhaWxlZEFTU0VSVF9ORSB0ZXN0IGJlbG93LiAgSXQncworICAvLyBwdWJsaWMgdG8gd29yayBhcm91bmQgQysrQnVpbGRlcidzIGJ1ZyB3aXRoIHNjb3BpbmcgbG9jYWwgY2xhc3Nlcy4KKyAgc3RhdGljIHZvaWQgQ29tcGFyZUFuZEluY3JlbWVudEludHMoKSB7CisgICAgQVNTRVJUX05FKGFfKyssIGJfKyspOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIFNpbmdsZUV2YWx1YXRpb25UZXN0KCkgeworICAgIHAxXyA9IHMxXzsKKyAgICBwMl8gPSBzMl87CisgICAgYV8gPSAwOworICAgIGJfID0gMDsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzMV87CisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzMl87CisgIHN0YXRpYyBjb25zdCBjaGFyKiBwMV87CisgIHN0YXRpYyBjb25zdCBjaGFyKiBwMl87CisKKyAgc3RhdGljIGludCBhXzsKKyAgc3RhdGljIGludCBiXzsKK307CisKK2NvbnN0IGNoYXIqIGNvbnN0IFNpbmdsZUV2YWx1YXRpb25UZXN0OjpzMV8gPSAiMDEyMzQiOworY29uc3QgY2hhciogY29uc3QgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnMyXyA9ICJhYmNkZSI7Citjb25zdCBjaGFyKiBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6cDFfOworY29uc3QgY2hhciogU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnAyXzsKK2ludCBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6YV87CitpbnQgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OmJfOworCisvLyBUZXN0cyB0aGF0IHdoZW4gQVNTRVJUX1NUUkVRIGZhaWxzLCBpdCBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cworLy8gZXhhY3RseSBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBGYWlsZWRBU1NFUlRfU1RSRVEpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoU2luZ2xlRXZhbHVhdGlvblRlc3Q6OkNvbXBhcmVBbmRJbmNyZW1lbnRDaGFyUHRycygpLAorICAgICAgICAgICAgICAgICAgICAgICAicDJfKysiKTsKKyAgRVhQRUNUX0VRKHMxXyArIDEsIHAxXyk7CisgIEVYUEVDVF9FUShzMl8gKyAxLCBwMl8pOworfQorCisvLyBUZXN0cyB0aGF0IHN0cmluZyBhc3NlcnRpb24gYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBBU1NFUlRfU1RSKSB7CisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX1NUUk5FCisgIEVYUEVDVF9TVFJORShwMV8rKywgcDJfKyspOworICBFWFBFQ1RfRVEoczFfICsgMSwgcDFfKTsKKyAgRVhQRUNUX0VRKHMyXyArIDEsIHAyXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9TVFJDQVNFRVEKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VFUShwMV8rKywgcDJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JpbmcgY2FzZSIpOworICBFWFBFQ1RfRVEoczFfICsgMiwgcDFfKTsKKyAgRVhQRUNUX0VRKHMyXyArIDIsIHAyXyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBBU1NFUlRfTkUgZmFpbHMsIGl0IGV2YWx1YXRlcyBpdHMgYXJndW1lbnRzIGV4YWN0bHkKKy8vIG9uY2UuCitURVNUX0YoU2luZ2xlRXZhbHVhdGlvblRlc3QsIEZhaWxlZEFTU0VSVF9ORSkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShTaW5nbGVFdmFsdWF0aW9uVGVzdDo6Q29tcGFyZUFuZEluY3JlbWVudEludHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIihhXysrKSAhPSAoYl8rKykiKTsKKyAgRVhQRUNUX0VRKDEsIGFfKTsKKyAgRVhQRUNUX0VRKDEsIGJfKTsKK30KKworLy8gVGVzdHMgdGhhdCBhc3NlcnRpb24gYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBPdGhlckNhc2VzKSB7CisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX1RSVUUKKyAgRVhQRUNUX1RSVUUoMCA9PSBhXysrKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoMSwgYV8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfVFJVRQorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRSgtMSA9PSBhXysrKSwgIi0xID09IGFfKysiKTsKKyAgRVhQRUNUX0VRKDIsIGFfKTsKKworICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9HVAorICBFWFBFQ1RfR1QoYV8rKywgYl8rKyk7CisgIEVYUEVDVF9FUSgzLCBhXyk7CisgIEVYUEVDVF9FUSgxLCBiXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9MVAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoYV8rKywgYl8rKyksICIoYV8rKykgPCAoYl8rKykiKTsKKyAgRVhQRUNUX0VRKDQsIGFfKTsKKyAgRVhQRUNUX0VRKDIsIGJfKTsKKworICAvLyBzdWNjZXNzZnVsIEFTU0VSVF9UUlVFCisgIEFTU0VSVF9UUlVFKDAgPCBhXysrKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoNSwgYV8pOworCisgIC8vIHN1Y2Nlc3NmdWwgQVNTRVJUX0dUCisgIEFTU0VSVF9HVChhXysrLCBiXysrKTsKKyAgRVhQRUNUX0VRKDYsIGFfKTsKKyAgRVhQRUNUX0VRKDMsIGJfKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK3ZvaWQgVGhyb3dBbkludGVnZXIoKSB7CisgIHRocm93IDE7Cit9CisKKy8vIFRlc3RzIHRoYXQgYXNzZXJ0aW9uIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4KK1RFU1RfRihTaW5nbGVFdmFsdWF0aW9uVGVzdCwgRXhjZXB0aW9uVGVzdHMpIHsKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfVEhST1cKKyAgRVhQRUNUX1RIUk9XKHsgIC8vIE5PTElOVAorICAgIGFfKys7CisgICAgVGhyb3dBbkludGVnZXIoKTsKKyAgfSwgaW50KTsKKyAgRVhQRUNUX0VRKDEsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX1RIUk9XLCB0aHJvd3MgZGlmZmVyZW50CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyh7ICAvLyBOT0xJTlQKKyAgICBhXysrOworICAgIFRocm93QW5JbnRlZ2VyKCk7CisgIH0sIGJvb2wpLCAidGhyb3dzIGEgZGlmZmVyZW50IHR5cGUiKTsKKyAgRVhQRUNUX0VRKDIsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX1RIUk9XLCB0aHJvd3Mgbm90aGluZworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1coYV8rKywgYm9vbCksICJ0aHJvd3Mgbm90aGluZyIpOworICBFWFBFQ1RfRVEoMywgYV8pOworCisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX05PX1RIUk9XCisgIEVYUEVDVF9OT19USFJPVyhhXysrKTsKKyAgRVhQRUNUX0VRKDQsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX05PX1RIUk9XCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyh7ICAvLyBOT0xJTlQKKyAgICBhXysrOworICAgIFRocm93QW5JbnRlZ2VyKCk7CisgIH0pLCAiaXQgdGhyb3dzIik7CisgIEVYUEVDVF9FUSg1LCBhXyk7CisKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfQU5ZX1RIUk9XCisgIEVYUEVDVF9BTllfVEhST1coeyAgLy8gTk9MSU5UCisgICAgYV8rKzsKKyAgICBUaHJvd0FuSW50ZWdlcigpOworICB9KTsKKyAgRVhQRUNUX0VRKDYsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX0FOWV9USFJPVworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKGFfKyspLCAiaXQgZG9lc24ndCIpOworICBFWFBFQ1RfRVEoNywgYV8pOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFLgorY2xhc3MgTm9GYXRhbEZhaWx1cmVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTdWNjZWVkcygpIHt9CisgIHZvaWQgRmFpbHNOb25GYXRhbCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJzb21lIG5vbi1mYXRhbCBmYWlsdXJlIjsKKyAgfQorICB2b2lkIEZhaWxzKCkgeworICAgIEZBSUwoKSA8PCAic29tZSBmYXRhbCBmYWlsdXJlIjsKKyAgfQorCisgIHZvaWQgRG9Bc3NlcnROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHMoKSk7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAic2hvbGQgbm90IHJlYWNoIGhlcmUuIjsKKyAgfQorCisgIHZvaWQgRG9FeHBlY3ROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKSB7CisgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHMoKSk7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAib3RoZXIgZmFpbHVyZSI7CisgIH0KK307CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE5vRmFpbHVyZSkgeworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTdWNjZWVkcygpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3VjY2VlZHMoKSk7Cit9CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE5vbkZhdGFsSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShGYWlsc05vbkZhdGFsKCkpLAorICAgICAgInNvbWUgbm9uLWZhdGFsIGZhaWx1cmUiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShGYWlsc05vbkZhdGFsKCkpLAorICAgICAgInNvbWUgbm9uLWZhdGFsIGZhaWx1cmUiKTsKK30KKworVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVPbkZhdGFsRmFpbHVyZSkgeworICBUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzOworICB7CisgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoJmd0ZXN0X2ZhaWx1cmVzKTsKKyAgICBEb0Fzc2VydE5vRmF0YWxGYWlsdXJlT25GYWlscygpOworICB9CisgIEFTU0VSVF9FUSgyLCBndGVzdF9mYWlsdXJlcy5zaXplKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS50eXBlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAic29tZSBmYXRhbCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiaXQgZG9lcyIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKK30KKworVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgRXhwZWN0Tm9GYXRhbEZhaWx1cmVPbkZhdGFsRmFpbHVyZSkgeworICBUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzOworICB7CisgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoJmd0ZXN0X2ZhaWx1cmVzKTsKKyAgICBEb0V4cGVjdE5vRmF0YWxGYWlsdXJlT25GYWlscygpOworICB9CisgIEFTU0VSVF9FUSgzLCBndGVzdF9mYWlsdXJlcy5zaXplKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgyKS50eXBlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAic29tZSBmYXRhbCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiaXQgZG9lcyIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIm90aGVyIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDIpLm1lc3NhZ2UoKSk7Cit9CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE1lc3NhZ2VJc1N0cmVhbWFibGUpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlczsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKCZndGVzdF9mYWlsdXJlcyk7CisgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8ICJmb28iKSA8PCAibXkgbWVzc2FnZSI7CisgIH0KKyAgQVNTRVJUX0VRKDIsIGd0ZXN0X2ZhaWx1cmVzLnNpemUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLnR5cGUoKSk7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLnR5cGUoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJmb28iLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJteSBtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyBub24tc3RyaW5nIGFzc2VydGlvbnMuCisKKy8vIFRlc3RzIEVxRmFpbHVyZSgpLCB1c2VkIGZvciBpbXBsZW1lbnRpbmcgKkVRKiBhc3NlcnRpb25zLgorVEVTVChBc3NlcnRpb25UZXN0LCBFcUZhaWx1cmUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZm9vX3ZhbCgiNSIpLCBiYXJfdmFsKCI2Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzEoCisgICAgICBFcUZhaWx1cmUoImZvbyIsICJiYXIiLCBmb29fdmFsLCBiYXJfdmFsLCBmYWxzZSkKKyAgICAgIC5mYWlsdXJlX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJWYWx1ZSBvZjogYmFyXG4iCisgICAgICAiICBBY3R1YWw6IDZcbiIKKyAgICAgICJFeHBlY3RlZDogZm9vXG4iCisgICAgICAiV2hpY2ggaXM6IDUiLAorICAgICAgbXNnMS5jX3N0cigpKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBtc2cyKAorICAgICAgRXFGYWlsdXJlKCJmb28iLCAiNiIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKQorICAgICAgLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiA2XG4iCisgICAgICAiRXhwZWN0ZWQ6IGZvb1xuIgorICAgICAgIldoaWNoIGlzOiA1IiwKKyAgICAgIG1zZzIuY19zdHIoKSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnMygKKyAgICAgIEVxRmFpbHVyZSgiNSIsICJiYXIiLCBmb29fdmFsLCBiYXJfdmFsLCBmYWxzZSkKKyAgICAgIC5mYWlsdXJlX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJWYWx1ZSBvZjogYmFyXG4iCisgICAgICAiICBBY3R1YWw6IDZcbiIKKyAgICAgICJFeHBlY3RlZDogNSIsCisgICAgICBtc2czLmNfc3RyKCkpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzQoCisgICAgICBFcUZhaWx1cmUoIjUiLCAiNiIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKS5mYWlsdXJlX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJWYWx1ZSBvZjogNlxuIgorICAgICAgIkV4cGVjdGVkOiA1IiwKKyAgICAgIG1zZzQuY19zdHIoKSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnNSgKKyAgICAgIEVxRmFpbHVyZSgiZm9vIiwgImJhciIsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoIlwieFwiIiksIHN0ZDo6c3RyaW5nKCJcInlcIiIpLAorICAgICAgICAgICAgICAgIHRydWUpLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiBiYXJcbiIKKyAgICAgICIgIEFjdHVhbDogXCJ5XCJcbiIKKyAgICAgICJFeHBlY3RlZDogZm9vIChpZ25vcmluZyBjYXNlKVxuIgorICAgICAgIldoaWNoIGlzOiBcInhcIiIsCisgICAgICBtc2c1LmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBBcHBlbmRVc2VyTWVzc2FnZSgpLCB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlICpFUSogbWFjcm9zLgorVEVTVChBc3NlcnRpb25UZXN0LCBBcHBlbmRVc2VyTWVzc2FnZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBmb28oImZvbyIpOworCisgIE1lc3NhZ2UgbXNnOworICBFWFBFQ1RfU1RSRVEoImZvbyIsCisgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShmb28sIG1zZykuY19zdHIoKSk7CisKKyAgbXNnIDw8ICJiYXIiOworICBFWFBFQ1RfU1RSRVEoImZvb1xuYmFyIiwKKyAgICAgICAgICAgICAgIEFwcGVuZFVzZXJNZXNzYWdlKGZvbywgbXNnKS5jX3N0cigpKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyNlbmRpZgorCisvLyBUZXN0cyBBU1NFUlRfVFJVRS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1RSVUUpIHsKKyAgQVNTRVJUX1RSVUUoMiA+IDEpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKDIgPCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjIgPCAxIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9UUlVFKHByZWRpY2F0ZSkgZm9yIHByZWRpY2F0ZXMgcmV0dXJuaW5nIEFzc2VydGlvblJlc3VsdC4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQXNzZXJ0VHJ1ZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKKyAgQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuKDIpKTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKFJlc3VsdElzRXZlbigzKSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuKDMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKKyNlbmRpZgorICBBU1NFUlRfVFJVRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlICgzIGlzIG9kZClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9GQUxTRS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0ZBTFNFKSB7CisgIEFTU0VSVF9GQUxTRSgyIDwgMSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKDIgPiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyID4gMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfRkFMU0UocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgorVEVTVChBc3NlcnRpb25UZXN0LCBBc3NlcnRGYWxzZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKKyAgQVNTRVJUX0ZBTFNFKFJlc3VsdElzRXZlbigzKSk7CisjaWZuZGVmIF9fQk9STEFORENfXworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW4oMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlICgyIGlzIGV2ZW4pXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKKyNlbmRpZgorICBBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXByZXNzZWQgdGhlbQorIyBwcmFnbWEgb3B0aW9uIHBvcAorI2VuZGlmCisKKy8vIFRlc3RzIHVzaW5nIEFTU0VSVF9FUSBvbiBkb3VibGUgdmFsdWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gbWFrZQorLy8gc3VyZSB0aGF0IHRoZSBzcGVjaWFsaXphdGlvbiB3ZSBkaWQgZm9yIGludGVnZXIgYW5kIGFub255bW91cyBlbnVtcworLy8gaXNuJ3QgdXNlZCBmb3IgZG91YmxlIGFyZ3VtZW50cy4KK1RFU1QoRXhwZWN0VGVzdCwgQVNTRVJUX0VRX0RvdWJsZSkgeworICAvLyBBIHN1Y2Nlc3MuCisgIEFTU0VSVF9FUSg1LjYsIDUuNik7CisKKyAgLy8gQSBmYWlsdXJlLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoNS4xLCA1LjIpLAorICAgICAgICAgICAgICAgICAgICAgICAiNS4xIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9FUS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0VRKSB7CisgIEFTU0VSVF9FUSg1LCAyICsgMyk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSg1LCAyKjMpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIqM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IDZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiA1Iik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9FUShOVUxMLCBwb2ludGVyKS4KKyNpZiBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9FUV9OVUxMKSB7CisgIC8vIEEgc3VjY2Vzcy4KKyAgY29uc3QgY2hhciogcCA9IE5VTEw7CisgIC8vIFNvbWUgb2xkZXIgR0NDIHZlcnNpb25zIG1heSBpc3N1ZSBhIHNwdXJpb3VzIHdhcmluZyBpbiB0aGlzIG9yIHRoZSBuZXh0CisgIC8vIGFzc2VydGlvbiBzdGF0ZW1lbnQuIFRoaXMgd2FybmluZyBzaG91bGQgbm90IGJlIHN1cHByZXNzZWQgd2l0aAorICAvLyBzdGF0aWNfY2FzdCBzaW5jZSB0aGUgdGVzdCB2ZXJpZmllcyB0aGUgYWJpbGl0eSB0byB1c2UgYmFyZSBOVUxMIGFzIHRoZQorICAvLyBleHBlY3RlZCBwYXJhbWV0ZXIgdG8gdGhlIG1hY3JvLgorICBBU1NFUlRfRVEoTlVMTCwgcCk7CisKKyAgLy8gQSBmYWlsdXJlLgorICBzdGF0aWMgaW50IG4gPSAwOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoTlVMTCwgJm4pLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6ICZuXG4iKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorCisvLyBUZXN0cyBBU1NFUlRfRVEoMCwgbm9uX3BvaW50ZXIpLiAgU2luY2UgdGhlIGxpdGVyYWwgMCBjYW4gYmUKKy8vIHRyZWF0ZWQgYXMgYSBudWxsIHBvaW50ZXIgYnkgdGhlIGNvbXBpbGVyLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCBBU1NFUlRfRVEoMCwgbm9uX3BvaW50ZXIpIGlzbid0IGludGVycHJldGVkIGJ5IEdvb2dsZSBUZXN0IGFzCisvLyBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8dm9pZCo+KE5VTEwpLCBub25fcG9pbnRlcikuCitURVNUKEV4cGVjdFRlc3QsIEFTU0VSVF9FUV8wKSB7CisgIGludCBuID0gMDsKKworICAvLyBBIHN1Y2Nlc3MuCisgIEFTU0VSVF9FUSgwLCBuKTsKKworICAvLyBBIGZhaWx1cmUuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSgwLCA1LjYpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDAiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX05FLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTkUpIHsKKyAgQVNTRVJUX05FKDYsIDcpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkUoJ2EnLCAnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgnYScpICE9ICgnYScpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJhY3R1YWw6ICdhJyAoOTcsIDB4NjEpIHZzICdhJyAoOTcsIDB4NjEpIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9MRS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0xFKSB7CisgIEFTU0VSVF9MRSgyLCAzKTsKKyAgQVNTRVJUX0xFKDIsIDIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTEUoMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDw9ICgwKSwgYWN0dWFsOiAyIHZzIDAiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0xULgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTFQpIHsKKyAgQVNTRVJUX0xUKDIsIDMpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTFQoMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDwgKDIpLCBhY3R1YWw6IDIgdnMgMiIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfR0UuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9HRSkgeworICBBU1NFUlRfR0UoMiwgMSk7CisgIEFTU0VSVF9HRSgyLCAyKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dFKDIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+PSAoMyksIGFjdHVhbDogMiB2cyAzIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9HVC4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0dUKSB7CisgIEFTU0VSVF9HVCgyLCAxKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dUKDIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK3ZvaWQgVGhyb3dOb3RoaW5nKCkge30KKworLy8gVGVzdHMgQVNTRVJUX1RIUk9XLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfVEhST1cpIHsKKyAgQVNTRVJUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCk7CisKKyMgaWZuZGVmIF9fQk9STEFORENfXworCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIgMjAwNyBhbmQgMjAwOS4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCisgICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiIpOworIyBlbmRpZgorCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKAorICAgICAgQVNTRVJUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKSwKKyAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCisgICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfTk9fVEhST1cuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9OT19USFJPVykgeworICBBU1NFUlRfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogVGhyb3dBbkludGVnZXIoKSBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbi4iCisgICAgICAgICAgICAgICAgICAgICAgICJcbiAgQWN0dWFsOiBpdCB0aHJvd3MuIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9BTllfVEhST1cuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9BTllfVEhST1cpIHsKKyAgQVNTRVJUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBBU1NFUlRfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSwKKyAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIKKyAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBNYWtlcyBzdXJlIHdlIGRlYWwgd2l0aCB0aGUgcHJlY2VkZW5jZSBvZiA8PC4gIFRoaXMgdGVzdCBzaG91bGQKKy8vIGNvbXBpbGUuCitURVNUKEFzc2VydGlvblRlc3QsIEFzc2VydFByZWNlZGVuY2UpIHsKKyAgQVNTRVJUX0VRKDEgPCAyLCB0cnVlKTsKKyAgYm9vbCBmYWxzZV92YWx1ZSA9IGZhbHNlOworICBBU1NFUlRfRVEodHJ1ZSAmJiBmYWxzZV92YWx1ZSwgZmFsc2UpOworfQorCisvLyBBIHN1YnJvdXRpbmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIHRlc3QuCit2b2lkIFRlc3RFcTEoaW50IHgpIHsKKyAgQVNTRVJUX0VRKDEsIHgpOworfQorCisvLyBUZXN0cyBjYWxsaW5nIGEgdGVzdCBzdWJyb3V0aW5lIHRoYXQncyBub3QgcGFydCBvZiBhIGZpeHR1cmUuCitURVNUKEFzc2VydGlvblRlc3QsIE5vbkZpeHR1cmVTdWJyb3V0aW5lKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFRlc3RFcTEoMiksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogeCIpOworfQorCisvLyBBbiB1bmNvcHlhYmxlIGNsYXNzLgorY2xhc3MgVW5jb3B5YWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBVbmNvcHlhYmxlKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorCisgIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5jb3B5YWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlKCkgPT0gcmhzLnZhbHVlKCk7CisgIH0KKyBwcml2YXRlOgorICAvLyBUaGlzIGNvbnN0cnVjdG9yIGRlbGliZXJhdGVseSBoYXMgbm8gaW1wbGVtZW50YXRpb24sIGFzIHdlIGRvbid0CisgIC8vIHdhbnQgdGhpcyBjbGFzcyB0byBiZSBjb3B5YWJsZS4KKyAgVW5jb3B5YWJsZShjb25zdCBVbmNvcHlhYmxlJik7ICAvLyBOT0xJTlQKKworICBpbnQgdmFsdWVfOworfTsKKworOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBVbmNvcHlhYmxlJiB2YWx1ZSkgeworICByZXR1cm4gb3MgPDwgdmFsdWUudmFsdWUoKTsKK30KKworCitib29sIElzUG9zaXRpdmVVbmNvcHlhYmxlKGNvbnN0IFVuY29weWFibGUmIHgpIHsKKyAgcmV0dXJuIHgudmFsdWUoKSA+IDA7Cit9CisKKy8vIEEgc3Vicm91dGluZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdC4KK3ZvaWQgVGVzdEFzc2VydE5vblBvc2l0aXZlKCkgeworICBVbmNvcHlhYmxlIHkoLTEpOworICBBU1NFUlRfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHkpOworfQorLy8gQSBzdWJyb3V0aW5lIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0Lgordm9pZCBUZXN0QXNzZXJ0RXF1YWxzVW5jb3B5YWJsZSgpIHsKKyAgVW5jb3B5YWJsZSB4KDUpOworICBVbmNvcHlhYmxlIHkoLTEpOworICBBU1NFUlRfRVEoeCwgeSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdW5jb3B5YWJsZSBvYmplY3RzIGNhbiBiZSB1c2VkIGluIGFzc2VydGlvbnMuCitURVNUKEFzc2VydGlvblRlc3QsIEFzc2VydFdvcmtzV2l0aFVuY29weWFibGVPYmplY3QpIHsKKyAgVW5jb3B5YWJsZSB4KDUpOworICBBU1NFUlRfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHgpOworICBBU1NFUlRfRVEoeCwgeCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFRlc3RBc3NlcnROb25Qb3NpdGl2ZSgpLAorICAgICJJc1Bvc2l0aXZlVW5jb3B5YWJsZSh5KSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlXG55IGV2YWx1YXRlcyB0byAtMSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShUZXN0QXNzZXJ0RXF1YWxzVW5jb3B5YWJsZSgpLAorICAgICJWYWx1ZSBvZjogeVxuICBBY3R1YWw6IC0xXG5FeHBlY3RlZDogeFxuV2hpY2ggaXM6IDUiKTsKK30KKworLy8gVGVzdHMgdGhhdCB1bmNvcHlhYmxlIG9iamVjdHMgY2FuIGJlIHVzZWQgaW4gZXhwZWN0cy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgRXhwZWN0V29ya3NXaXRoVW5jb3B5YWJsZU9iamVjdCkgeworICBVbmNvcHlhYmxlIHgoNSk7CisgIEVYUEVDVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeCk7CisgIFVuY29weWFibGUgeSgtMSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeSksCisgICAgIklzUG9zaXRpdmVVbmNvcHlhYmxlKHkpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmVcbnkgZXZhbHVhdGVzIHRvIC0xIik7CisgIEVYUEVDVF9FUSh4LCB4KTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHgsIHkpLAorICAgICJWYWx1ZSBvZjogeVxuICBBY3R1YWw6IC0xXG5FeHBlY3RlZDogeFxuV2hpY2ggaXM6IDUiKTsKK30KKworZW51bSBOYW1lZEVudW0geworICBrRTEgPSAwLAorICBrRTIgPSAxCit9OworCitURVNUKEFzc2VydGlvblRlc3QsIE5hbWVkRW51bSkgeworICBFWFBFQ1RfRVEoa0UxLCBrRTEpOworICBFWFBFQ1RfTFQoa0UxLCBrRTIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoa0UxLCBrRTIpLCAiV2hpY2ggaXM6IDAiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKGtFMSwga0UyKSwgIkFjdHVhbDogMSIpOworfQorCisvLyBUaGUgdmVyc2lvbiBvZiBnY2MgdXNlZCBpbiBYQ29kZSAyLjIgaGFzIGEgYnVnIGFuZCBkb2Vzbid0IGFsbG93CisvLyBhbm9ueW1vdXMgZW51bXMgaW4gYXNzZXJ0aW9ucy4gIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHRlc3QgaXMgbm90CisvLyBkb25lIG9uIE1hYy4KKy8vIFN1biBTdHVkaW8gYW5kIEhQIGFDQyBhbHNvIHJlamVjdCB0aGlzIGNvZGUuCisjaWYgIUdURVNUX09TX01BQyAmJiAhZGVmaW5lZChfX1NVTlBST19DQykgJiYgIWRlZmluZWQoX19IUF9hQ0MpCisKKy8vIFRlc3RzIHVzaW5nIGFzc2VydGlvbnMgd2l0aCBhbm9ueW1vdXMgZW51bXMuCitlbnVtIHsKKyAga0Nhc2VBID0gLTEsCisKKyMgaWYgR1RFU1RfT1NfTElOVVgKKworICAvLyBXZSB3YW50IHRvIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIHNpemUgb2YgdGhlIGFub255bW91cyBlbnVtIGlzCisgIC8vIGxhcmdlciB0aGFuIHNpemVvZihpbnQpLCB0byBtYWtlIHN1cmUgb3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAvLyBhc3NlcnRpb25zIGRvZXNuJ3QgdHJ1bmNhdGUgdGhlIGVudW1zLiAgSG93ZXZlciwgTVNWQworICAvLyAoaW5jb3JyZWN0bHkpIGRvZXNuJ3QgYWxsb3cgYW4gZW51bSB2YWx1ZSB0byBleGNlZWQgdGhlIHJhbmdlIG9mCisgIC8vIGFuIGludCwgc28gdGhpcyBoYXMgdG8gYmUgY29uZGl0aW9uYWxseSBjb21waWxlZC4KKyAgLy8KKyAgLy8gT24gTGludXgsIGtDYXNlQiBhbmQga0Nhc2VBIGhhdmUgdGhlIHNhbWUgdmFsdWUgd2hlbiB0cnVuY2F0ZWQgdG8KKyAgLy8gaW50IHNpemUuICBXZSB3YW50IHRvIHRlc3Qgd2hldGhlciB0aGlzIHdpbGwgY29uZnVzZSB0aGUKKyAgLy8gYXNzZXJ0aW9ucy4KKyAga0Nhc2VCID0gdGVzdGluZzo6aW50ZXJuYWw6OmtNYXhCaWdnZXN0SW50LAorCisjIGVsc2UKKworICBrQ2FzZUIgPSBJTlRfTUFYLAorCisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisgIGtDYXNlQyA9IDQyCit9OworCitURVNUKEFzc2VydGlvblRlc3QsIEFub255bW91c0VudW0pIHsKKyMgaWYgR1RFU1RfT1NfTElOVVgKKworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrQ2FzZUEpLCBzdGF0aWNfY2FzdDxpbnQ+KGtDYXNlQikpOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisgIEVYUEVDVF9FUShrQ2FzZUEsIGtDYXNlQSk7CisgIEVYUEVDVF9ORShrQ2FzZUEsIGtDYXNlQik7CisgIEVYUEVDVF9MVChrQ2FzZUEsIGtDYXNlQik7CisgIEVYUEVDVF9MRShrQ2FzZUEsIGtDYXNlQik7CisgIEVYUEVDVF9HVChrQ2FzZUIsIGtDYXNlQSk7CisgIEVYUEVDVF9HRShrQ2FzZUEsIGtDYXNlQSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HRShrQ2FzZUEsIGtDYXNlQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoa0Nhc2VBKSA+PSAoa0Nhc2VCKSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR0Uoa0Nhc2VBLCBrQ2FzZUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiLTEgdnMgNDIiKTsKKworICBBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUEpOworICBBU1NFUlRfTkUoa0Nhc2VBLCBrQ2FzZUIpOworICBBU1NFUlRfTFQoa0Nhc2VBLCBrQ2FzZUIpOworICBBU1NFUlRfTEUoa0Nhc2VBLCBrQ2FzZUIpOworICBBU1NFUlRfR1Qoa0Nhc2VCLCBrQ2FzZUEpOworICBBU1NFUlRfR0Uoa0Nhc2VBLCBrQ2FzZUEpOworCisjIGlmbmRlZiBfX0JPUkxBTkRDX18KKworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUIpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IGtDYXNlQiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsOiA0MiIpOworIyBlbmRpZgorCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShrQ2FzZUEsIGtDYXNlQyksCisgICAgICAgICAgICAgICAgICAgICAgICJXaGljaCBpczogLTEiKTsKK30KKworI2VuZGlmICAvLyAhR1RFU1RfT1NfTUFDICYmICFkZWZpbmVkKF9fU1VOUFJPX0NDKQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCitzdGF0aWMgSFJFU1VMVCBVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSB7CisgIHJldHVybiBFX1VORVhQRUNURUQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIE9rSFJFU1VMVFN1Y2Nlc3MoKSB7CisgIHJldHVybiBTX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBGYWxzZUhSRVNVTFRTdWNjZXNzKCkgeworICByZXR1cm4gU19GQUxTRTsKK30KKworLy8gSFJFU1VMVCBhc3NlcnRpb24gdGVzdHMgdGVzdCBib3RoIHplcm8gYW5kIG5vbi16ZXJvCisvLyBzdWNjZXNzIGNvZGVzIGFzIHdlbGwgYXMgZmFpbHVyZSBtZXNzYWdlIGZvciBlYWNoLgorLy8KKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBzdXBwb3J0IG1lc3NhZ2UgdGV4dHMuCitURVNUKEhSRVNVTFRBc3NlcnRpb25UZXN0LCBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQpIHsKKyAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFNfT0spOworICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoU19GQUxTRSk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSwKKyAgICAiRXhwZWN0ZWQ6IChVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSkgc3VjY2VlZHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDgwMDBGRkZGIik7Cit9CisKK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRCkgeworICBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoU19PSyk7CisgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChTX0ZBTFNFKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoVW5leHBlY3RlZEhSRVNVTFRGYWlsdXJlKCkpLAorICAgICJFeHBlY3RlZDogKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSBzdWNjZWVkcy5cbiIKKyAgICAiICBBY3R1YWw6IDB4ODAwMEZGRkYiKTsKK30KKworVEVTVChIUkVTVUxUQXNzZXJ0aW9uVGVzdCwgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKSB7CisgIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChPa0hSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKE9rSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDAwMDAwMDAwIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDAwMDAwMDAxIik7Cit9CisKK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRCkgeworICBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoRV9VTkVYUEVDVEVEKTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlciAyMDA3IGFuZCAyMDA5LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfSFJFU1VMVF9GQUlMRUQoT2tIUkVTVUxUU3VjY2VzcygpKSwKKyAgICAiRXhwZWN0ZWQ6IChPa0hSRVNVTFRTdWNjZXNzKCkpIGZhaWxzLlxuIgorICAgICIgIEFjdHVhbDogMHgwMDAwMDAwMCIpOworIyBlbmRpZgorCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDAwMDAwMDAxIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RyZWFtaW5nIHRvIHRoZSBIUkVTVUxUIG1hY3JvcyB3b3Jrcy4KK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIFN0cmVhbWluZykgeworICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoU19PSykgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChTX09LKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKEVfVU5FWFBFQ1RFRCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKEVfVU5FWFBFQ1RFRCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlciAyMDA3IGFuZCAyMDA5LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChFX1VORVhQRUNURUQpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisjIGVuZGlmCisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoU19PSykgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChTX09LKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyNlbmRpZgorCisvLyBUZXN0cyB0aGF0IHRoZSBhc3NlcnRpb24gbWFjcm9zIGJlaGF2ZSBsaWtlIHNpbmdsZSBzdGF0ZW1lbnRzLgorVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBCYXNpY0Fzc2VydGlvbnNCZWhhdmVzTGlrZVNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCdzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5LiI7CisKKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBFWFBFQ1RfRkFMU0UoZmFsc2UpOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX0xUKDEsIDMpOworCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgRVhQRUNUX0dUKDMsIDIpIDw8ICIiOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKy8vIFRlc3RzIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgbm90IGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIGNvZGUgaW4gdGhlCisvLyBFWFBFQ1RfVEhST1cvRVhQRUNUX0FOWV9USFJPVy9FWFBFQ1RfTk9fVEhST1cgbWFjcm9zLgorVEVTVChFeHBlY3RUaHJvd1Rlc3QsIERvZXNOb3RHZW5lcmF0ZVVucmVhY2hhYmxlQ29kZVdhcm5pbmcpIHsKKyAgaW50IG4gPSAwOworCisgIEVYUEVDVF9USFJPVyh0aHJvdyAxLCBpbnQpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1cobisrLCBpbnQpLCAiIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyh0aHJvdyAxLCBjb25zdCBjaGFyKiksICIiKTsKKyAgRVhQRUNUX05PX1RIUk9XKG4rKyk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyh0aHJvdyAxKSwgIiIpOworICBFWFBFQ1RfQU5ZX1RIUk9XKHRocm93IDEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKG4rKyksICIiKTsKK30KKworVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBFeGNlcHRpb25Bc3NlcnRpb25zQmVoYXZlc0xpa2VTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgRVhQRUNUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKTsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgRVhQRUNUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX05PX1RIUk9XKFRocm93Tm90aGluZygpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCitURVNUKEFzc2VydGlvblN5bnRheFRlc3QsIE5vRmF0YWxGYWlsdXJlQXNzZXJ0aW9uc0JlaGF2ZXNMaWtlU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEZBSUwoKSkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiSXQncyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seS4iOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpKSA8PCAiIjsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgYXNzZXJ0aW9uIG1hY3JvcyB3b3JrIHdlbGwgd2l0aCBzd2l0Y2ggc3RhdGVtZW50cy4KK1RFU1QoQXNzZXJ0aW9uU3ludGF4VGVzdCwgV29ya3NXaXRoU3dpdGNoKSB7CisgIHN3aXRjaCAoMCkgeworICAgIGNhc2UgMToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlRfVFJVRSh0cnVlKTsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfRkFMU0UoZmFsc2UpIDw8ICJFWFBFQ1RfRkFMU0UgZmFpbGVkIGluIHN3aXRjaCBjYXNlIjsKKworICAvLyBCaW5hcnkgYXNzZXJ0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgYSBkaWZmZXJlbnQgY29kZSBwYXRoCisgIC8vIHRoYW4gdGhlIEJvb2xlYW4gYXNzZXJ0aW9ucy4gIEhlbmNlIHdlIHRlc3QgdGhlbSBzZXBhcmF0ZWx5LgorICBzd2l0Y2ggKDApIHsKKyAgICBjYXNlIDE6CisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVF9FUSgxLCAxKSA8PCAiQVNTRVJUX0VRIGZhaWxlZCBpbiBkZWZhdWx0IHN3aXRjaCBoYW5kbGVyIjsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfTkUoMSwgMik7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCit2b2lkIFRocm93QVN0cmluZygpIHsKKyAgICB0aHJvdyAic3RkOjpzdHJpbmciOworfQorCisvLyBUZXN0IHRoYXQgdGhlIGV4Y2VwdGlvbiBhc3NlcnRpb24gbWFjcm9zIGNvbXBpbGUgYW5kIHdvcmsgd2l0aCBjb25zdAorLy8gdHlwZSBxdWFsaWZpZXIuCitURVNUKEFzc2VydGlvblN5bnRheFRlc3QsIFdvcmtzV2l0aENvbnN0KSB7CisgICAgQVNTRVJUX1RIUk9XKFRocm93QVN0cmluZygpLCBjb25zdCBjaGFyKik7CisKKyAgICBFWFBFQ1RfVEhST1coVGhyb3dBU3RyaW5nKCksIGNvbnN0IGNoYXIqKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IHRyYWNrcyBTVUNDRUVEKi4KK1RFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIFNVQ0NFRUQpIHsKKyAgU1VDQ0VFRCgpOworICBTVUNDRUVEKCkgPDwgIk9LIjsKKyAgRVhQRUNUX0VRKDIsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cmFjayBzdWNjZXNzZnVsIEVYUEVDVF8qLgorVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgRVhQRUNUKSB7CisgIEVYUEVDVF9UUlVFKHRydWUpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3NmdWwgRVhQRUNUX1NUUiouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBFWFBFQ1RfU1RSKSB7CisgIEVYUEVDVF9TVFJFUSgiIiwgIiIpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3NmdWwgQVNTRVJUXyouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBBU1NFUlQpIHsKKyAgQVNTRVJUX1RSVUUodHJ1ZSk7CisgIEVYUEVDVF9FUSgwLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJhY2sgc3VjY2Vzc2Z1bCBBU1NFUlRfU1RSKi4KK1RFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIEFTU0VSVF9TVFIpIHsKKyAgQVNTRVJUX1NUUkVRKCIiLCAiIik7CisgIEVYUEVDVF9FUSgwLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCituYW1lc3BhY2UgeworCisvLyBUZXN0cyB0aGUgbWVzc2FnZSBzdHJlYW1pbmcgdmFyaWF0aW9uIG9mIGFzc2VydGlvbnMuCisKK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBFWFBFQ1QpIHsKKyAgRVhQRUNUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORSgxLCAxKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjMSIpOworICBFWFBFQ1RfTEUoMSwgMikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDEsIDApIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICMyLiIpOworICBFWFBFQ1RfR0UoMSwgMCkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKDEsIDIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICMzLiIpOworCisgIEVYUEVDVF9TVFJFUSgiMSIsICIxIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKCIxIiwgIjEiKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjNC4iKTsKKyAgRVhQRUNUX1NUUkNBU0VFUSgiYSIsICJBIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VORSgiYSIsICJBIikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUgIzUuIik7CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoMSwgMS4yKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjNi4iKTsKKyAgRVhQRUNUX05FQVIoMSwgMS4xLCAwLjIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7Cit9CisKK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlQpIHsKKyAgQVNTRVJUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9ORSgxLCAyKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBBU1NFUlRfTEUoMSwgMikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX0xUKDEsIDIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9HRSgxLCAwKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfR1QoMSwgMikgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUuIik7Cit9CisKK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlRfU1RSKSB7CisgIEFTU0VSVF9TVFJFUSgiMSIsICIxIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX1NUUk5FKCIxIiwgIjIiKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBBU1NFUlRfU1RSQ0FTRUVRKCJhIiwgIkEiKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRU5FKCJhIiwgIkEiKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZS4iKTsKK30KKworVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEFTU0VSVF9GTE9BVElORykgeworICBBU1NFUlRfRkxPQVRfRVEoMSwgMSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX0RPVUJMRV9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLDEuMiwgMC4xKSA8PCAiRXhwZWN0IGZhaWx1cmUuIiwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0IGZhaWx1cmUuIik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQuCit9CisKKy8vIFRlc3RzIHVzaW5nIEFTU0VSVF9GQUxTRSB3aXRoIGEgc3RyZWFtZWQgbWVzc2FnZS4KK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlRfRkFMU0UpIHsKKyAgQVNTRVJUX0ZBTFNFKGZhbHNlKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRkFMU0UodHJ1ZSkgPDwgIkV4cGVjdGVkIGZhaWx1cmU6ICIgPDwgMiA8PCAiID4gIiA8PCAxCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdHJ1ZTsKKyAgfSwgIkV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgRkFJTCB3aXRoIGEgc3RyZWFtZWQgbWVzc2FnZS4KK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBGQUlMKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiMCIpOworfQorCisvLyBUZXN0cyB1c2luZyBTVUNDRUVEIHdpdGggYSBzdHJlYW1lZCBtZXNzYWdlLgorVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIFNVQ0NFRUQpIHsKKyAgU1VDQ0VFRCgpIDw8ICJTdWNjZXNzID09ICIgPDwgMTsKK30KKworLy8gVGVzdHMgdXNpbmcgQVNTRVJUX1RSVUUgd2l0aCBhIHN0cmVhbWVkIG1lc3NhZ2UuCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgQVNTRVJUX1RSVUUpIHsKKyAgQVNTRVJUX1RSVUUodHJ1ZSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX1RSVUUodHJ1ZSkgPDwgdHJ1ZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8Y2hhciAqPihOVUxMKTsKKyAgfSwgIihudWxsKShudWxsKSIpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gVGVzdHMgdXNpbmcgd2lkZSBzdHJpbmdzIGluIGFzc2VydGlvbiBtZXNzYWdlcy4KK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBXaWRlU3RyaW5nTWVzc2FnZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfVFJVRShmYWxzZSkgPDwgTCJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuXHg4MTE5IjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0VRKDEsIDIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgIgorICAgICAgICAgICAgICAgICAgICA8PCBMImV4cGVjdGVkIHRvby5ceDgxMjAiOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkIHRvby4iKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyBFWFBFQ1RfVFJVRS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX1RSVUUpIHsKKyAgRVhQRUNUX1RSVUUodHJ1ZSkgPDwgIkludGVudGlvbmFsIHN1Y2Nlc3MiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShmYWxzZSkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKGZhbHNlKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iKTsKKyAgRVhQRUNUX1RSVUUoMiA+IDEpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKDIgPCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyIDwgMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogdHJ1ZSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRSgyID4gMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIyID4gMyIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfVFJVRShwcmVkaWNhdGUpIGZvciBwcmVkaWNhdGVzIHJldHVybmluZyBBc3NlcnRpb25SZXN1bHQuCitURVNUKEV4cGVjdFRlc3QsIEV4cGVjdFRydWVXaXRoQXNzZXJ0aW9uUmVzdWx0KSB7CisgIEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbigyKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbigzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuKDMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKKyAgRVhQRUNUX1RSVUUoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBmYWxzZSAoMyBpcyBvZGQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogdHJ1ZSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfRkFMU0Ugd2l0aCBhIHN0cmVhbWVkIG1lc3NhZ2UuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9GQUxTRSkgeworICBFWFBFQ1RfRkFMU0UoMiA8IDEpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQUxTRShmYWxzZSkgPDwgIkludGVudGlvbmFsIHN1Y2Nlc3MiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UodHJ1ZSkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSh0cnVlKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKDIgPiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyID4gMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoMiA8IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMiA8IDMiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0ZBTFNFKHByZWRpY2F0ZSkgZm9yIHByZWRpY2F0ZXMgcmV0dXJuaW5nIEFzc2VydGlvblJlc3VsdC4KK1RFU1QoRXhwZWN0VGVzdCwgRXhwZWN0RmFsc2VXaXRoQXNzZXJ0aW9uUmVzdWx0KSB7CisgIEVYUEVDVF9GQUxTRShSZXN1bHRJc0V2ZW4oMykpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoUmVzdWx0SXNFdmVuKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW4oMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlICgyIGlzIGV2ZW4pXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKKyAgRVhQRUNUX0ZBTFNFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMykpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworfQorCisjaWZkZWYgX19CT1JMQU5EQ19fCisvLyBSZXN0b3JlcyB3YXJuaW5ncyBhZnRlciBwcmV2aW91cyAiI3ByYWdtYSBvcHRpb24gcHVzaCIgc3VwcmVzc2VkIHRoZW0KKyMgcHJhZ21hIG9wdGlvbiBwb3AKKyNlbmRpZgorCisvLyBUZXN0cyBFWFBFQ1RfRVEuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9FUSkgeworICBFWFBFQ1RfRVEoNSwgMiArIDMpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoNSwgMiozKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyKjNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiA2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogNSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoNSwgMiAtIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMiAtIDMiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgRVhQRUNUX0VRIG9uIGRvdWJsZSB2YWx1ZXMuICBUaGUgcHVycG9zZSBpcyB0byBtYWtlCisvLyBzdXJlIHRoYXQgdGhlIHNwZWNpYWxpemF0aW9uIHdlIGRpZCBmb3IgaW50ZWdlciBhbmQgYW5vbnltb3VzIGVudW1zCisvLyBpc24ndCB1c2VkIGZvciBkb3VibGUgYXJndW1lbnRzLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRVFfRG91YmxlKSB7CisgIC8vIEEgc3VjY2Vzcy4KKyAgRVhQRUNUX0VRKDUuNiwgNS42KTsKKworICAvLyBBIGZhaWx1cmUuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg1LjEsIDUuMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICI1LjEiKTsKK30KKworI2lmIEdURVNUX0NBTl9DT01QQVJFX05VTEwKKy8vIFRlc3RzIEVYUEVDVF9FUShOVUxMLCBwb2ludGVyKS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0VRX05VTEwpIHsKKyAgLy8gQSBzdWNjZXNzLgorICBjb25zdCBjaGFyKiBwID0gTlVMTDsKKyAgLy8gU29tZSBvbGRlciBHQ0MgdmVyc2lvbnMgbWF5IGlzc3VlIGEgc3B1cmlvdXMgd2FybmluZyBpbiB0aGlzIG9yIHRoZSBuZXh0CisgIC8vIGFzc2VydGlvbiBzdGF0ZW1lbnQuIFRoaXMgd2FybmluZyBzaG91bGQgbm90IGJlIHN1cHByZXNzZWQgd2l0aAorICAvLyBzdGF0aWNfY2FzdCBzaW5jZSB0aGUgdGVzdCB2ZXJpZmllcyB0aGUgYWJpbGl0eSB0byB1c2UgYmFyZSBOVUxMIGFzIHRoZQorICAvLyBleHBlY3RlZCBwYXJhbWV0ZXIgdG8gdGhlIG1hY3JvLgorICBFWFBFQ1RfRVEoTlVMTCwgcCk7CisKKyAgLy8gQSBmYWlsdXJlLgorICBpbnQgbiA9IDA7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShOVUxMLCAmbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogJm5cbiIpOworfQorI2VuZGlmICAvLyBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisKKy8vIFRlc3RzIEVYUEVDVF9FUSgwLCBub25fcG9pbnRlcikuICBTaW5jZSB0aGUgbGl0ZXJhbCAwIGNhbiBiZQorLy8gdHJlYXRlZCBhcyBhIG51bGwgcG9pbnRlciBieSB0aGUgY29tcGlsZXIsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IEVYUEVDVF9FUSgwLCBub25fcG9pbnRlcikgaXNuJ3QgaW50ZXJwcmV0ZWQgYnkgR29vZ2xlIFRlc3QgYXMKKy8vIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx2b2lkKj4oTlVMTCksIG5vbl9wb2ludGVyKS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0VRXzApIHsKKyAgaW50IG4gPSAwOworCisgIC8vIEEgc3VjY2Vzcy4KKyAgRVhQRUNUX0VRKDAsIG4pOworCisgIC8vIEEgZmFpbHVyZS4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDAsIDUuNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogMCIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTkUuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9ORSkgeworICBFWFBFQ1RfTkUoNiwgNyk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKCdhJywgJ2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoJ2EnKSAhPSAoJ2EnKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0dWFsOiAnYScgKDk3LCAweDYxKSB2cyAnYScgKDk3LCAweDYxKSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUoMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIyIik7CisgIGNoYXIqIGNvbnN0IHAwID0gTlVMTDsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKHAwLCBwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMCIpOworICAvLyBPbmx5IHdheSB0byBnZXQgdGhlIE5va2lhIGNvbXBpbGVyIHRvIGNvbXBpbGUgdGhlIGNhc3QKKyAgLy8gaXMgdG8gaGF2ZSBhIHNlcGFyYXRlIHZvaWQqIHZhcmlhYmxlIGZpcnN0LiBQdXR0aW5nCisgIC8vIHRoZSB0d28gY2FzdHMgb24gdGhlIHNhbWUgbGluZSBkb2Vzbid0IHdvcmssIG5laXRoZXIgZG9lcworICAvLyBhIGRpcmVjdCBDLXN0eWxlIHRvIGNoYXIqLgorICB2b2lkKiBwdjEgPSAodm9pZCopMHgxMjM0OyAgLy8gTk9MSU5UCisgIGNoYXIqIGNvbnN0IHAxID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocHYxKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKHAxLCBwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTEUuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9MRSkgeworICBFWFBFQ1RfTEUoMiwgMyk7CisgIEVYUEVDVF9MRSgyLCAyKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xFKDIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA8PSAoMCksIGFjdHVhbDogMiB2cyAwIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MRSgxLjEsIDAuOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMS4xKSA8PSAoMC45KSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTFQuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9MVCkgeworICBFWFBFQ1RfTFQoMiwgMyk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVCgyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPCAoMiksIGFjdHVhbDogMiB2cyAyIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVCgyLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSA8ICgxKSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfR0UuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9HRSkgeworICBFWFBFQ1RfR0UoMiwgMSk7CisgIEVYUEVDVF9HRSgyLCAyKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dFKDIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+PSAoMyksIGFjdHVhbDogMiB2cyAzIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HRSgwLjksIDEuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMC45KSA+PSAoMS4xKSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfR1QuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9HVCkgeworICBFWFBFQ1RfR1QoMiwgMSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCgyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPiAoMiksIGFjdHVhbDogMiB2cyAyIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCgyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSA+ICgzKSIpOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gVGVzdHMgRVhQRUNUX1RIUk9XLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfVEhST1cpIHsKKyAgRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBib29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBUaHJvd0FuSW50ZWdlcigpIHRocm93cyBhbiBleGNlcHRpb24gb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSBib29sLlxuICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9USFJPVyhUaHJvd05vdGhpbmcoKSwgYm9vbCksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93Tm90aGluZygpIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSBib29sLlxuIgorICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3Mgbm90aGluZy4iKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX05PX1RIUk9XLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfTk9fVEhST1cpIHsKKyAgRVhQRUNUX05PX1RIUk9XKFRocm93Tm90aGluZygpKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgZG9lc24ndCB0aHJvdyBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24uXG4gIEFjdHVhbDogaXQgdGhyb3dzLiIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfQU5ZX1RIUk9XLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfQU5ZX1RIUk9XKSB7CisgIEVYUEVDVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd05vdGhpbmcoKSksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93Tm90aGluZygpIHRocm93cyBhbiBleGNlcHRpb24uXG4iCisgICAgICAiICBBY3R1YWw6IGl0IGRvZXNuJ3QuIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gTWFrZSBzdXJlIHdlIGRlYWwgd2l0aCB0aGUgcHJlY2VkZW5jZSBvZiA8PC4KK1RFU1QoRXhwZWN0VGVzdCwgRXhwZWN0UHJlY2VkZW5jZSkgeworICBFWFBFQ1RfRVEoMSA8IDIsIHRydWUpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEodHJ1ZSwgdHJ1ZSAmJiBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogdHJ1ZSAmJiBmYWxzZSIpOworfQorCisKKy8vIFRlc3RzIHRoZSBTdHJlYW1hYmxlVG9TdHJpbmcoKSBmdW5jdGlvbi4KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBzY2FsYXIuCitURVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIFNjYWxhcikgeworICBFWFBFQ1RfU1RSRVEoIjUiLCBTdHJlYW1hYmxlVG9TdHJpbmcoNSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFN0cmVhbWFibGVUb1N0cmluZygpIG9uIGEgbm9uLWNoYXIgcG9pbnRlci4KK1RFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgUG9pbnRlcikgeworICBpbnQgbiA9IDA7CisgIGludCogcCA9ICZuOworICBFWFBFQ1RfU1RSTkUoIihudWxsKSIsIFN0cmVhbWFibGVUb1N0cmluZyhwKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBOVUxMIG5vbi1jaGFyIHBvaW50ZXIuCitURVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIE51bGxQb2ludGVyKSB7CisgIGludCogcCA9IE5VTEw7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwgU3RyZWFtYWJsZVRvU3RyaW5nKHApLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIEMgc3RyaW5nLgorVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBDU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiRm9vIiwgU3RyZWFtYWJsZVRvU3RyaW5nKCJGb28iKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBOVUxMIEMgc3RyaW5nLgorVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBOdWxsQ1N0cmluZykgeworICBjaGFyKiBwID0gTlVMTDsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLCBTdHJlYW1hYmxlVG9TdHJpbmcocCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIHN0cmVhbWFibGUgdmFsdWVzIGFzIGFzc2VydGlvbiBtZXNzYWdlcy4KKworLy8gVGVzdHMgdXNpbmcgc3RkOjpzdHJpbmcgYXMgYW4gYXNzZXJ0aW9uIG1lc3NhZ2UuCitURVNUKFN0cmVhbWFibGVUZXN0LCBzdHJpbmcpIHsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cigKKyAgICAgICJUaGlzIGZhaWx1cmUgbWVzc2FnZSBpcyBhIHN0ZDo6c3RyaW5nLCBhbmQgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ci5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gb3V0cHV0IHN0cmluZ3MgY29udGFpbmluZyBlbWJlZGRlZCBOVUxzLgorLy8gTGltaXRlZCB0byBMaW51eCBiZWNhdXNlIHdlIGNhbiBvbmx5IGRvIHRoaXMgd2l0aCBzdGQ6OnN0cmluZydzLgorVEVTVChTdHJlYW1hYmxlVGVzdCwgc3RyaW5nV2l0aEVtYmVkZGVkTlVMKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGNoYXJfYXJyYXlfd2l0aF9udWxbXSA9CisgICAgICAiSGVyZSdzIGEgTlVMXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciOworICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nX3dpdGhfbnVsKGNoYXJfYXJyYXlfd2l0aF9udWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYXJfYXJyYXlfd2l0aF9udWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxKTsgIC8vIGRyb3BzIHRoZSB0cmFpbGluZyBOVUwKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8IHN0cmluZ193aXRoX251bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkhlcmUncyBhIE5VTFxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyIpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBvdXRwdXQgYSBOVUwgY2hhci4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIE5VTENoYXIpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRkFJTCgpIDw8ICJBIE5VTCIgPDwgJ1wwJyA8PCAiIGFuZCBzb21lIG1vcmUgc3RyaW5nIjsKKyAgfSwgIkEgTlVMXFwwIGFuZCBzb21lIG1vcmUgc3RyaW5nIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIGludCBhcyBhbiBhc3NlcnRpb24gbWVzc2FnZS4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIGludCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgOTAwOTEzLAorICAgICAgICAgICAgICAgICAgICAgICAiOTAwOTEzIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIE5VTEwgY2hhciBwb2ludGVyIGFzIGFuIGFzc2VydGlvbiBtZXNzYWdlLgorLy8KKy8vIEluIE1TVkMsIHN0cmVhbWluZyBhIE5VTEwgY2hhciAqIGNhdXNlcyBhY2Nlc3MgdmlvbGF0aW9uLiAgR29vZ2xlIFRlc3QKKy8vIGltcGxlbWVudGVkIGEgd29ya2Fyb3VuZCAoc3Vic3RpdHV0aW5nICIobnVsbCkiIGZvciBOVUxMKS4gIFRoaXMKKy8vIHRlc3RzIHdoZXRoZXIgdGhlIHdvcmthcm91bmQgd29ya3MuCitURVNUKFN0cmVhbWFibGVUZXN0LCBOdWxsQ2hhclB0cikgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAiKG51bGwpIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIChlbmRsLCBlbmRzLCBhbmQgZmx1c2gpIGNhbiBiZQorLy8gc3RyZWFtZWQgdG8gdGVzdGluZzo6TWVzc2FnZS4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIEJhc2ljSW9NYW5pcCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBGQUlMKCkgPDwgIkxpbmUgMS4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICA8PCAiQSBOVUwgY2hhciAiIDw8IHN0ZDo6ZW5kcyA8PCBzdGQ6OmZsdXNoIDw8ICIgaW4gbGluZSAyLiI7CisgIH0sICJMaW5lIDEuXG5BIE5VTCBjaGFyIFxcMCBpbiBsaW5lIDIuIik7Cit9CisKKy8vIFRlc3RzIHRoZSBtYWNyb3MgdGhhdCBoYXZlbid0IGJlZW4gY292ZXJlZCBzbyBmYXIuCisKK3ZvaWQgQWRkRmFpbHVyZUhlbHBlcihib29sKiBhYm9ydGVkKSB7CisgICphYm9ydGVkID0gdHJ1ZTsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZS4iOworICAqYWJvcnRlZCA9IGZhbHNlOworfQorCisvLyBUZXN0cyBBRERfRkFJTFVSRS4KK1RFU1QoTWFjcm9UZXN0LCBBRERfRkFJTFVSRSkgeworICBib29sIGFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBZGRGYWlsdXJlSGVscGVyKCZhYm9ydGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUuIik7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgQUREX0ZBSUxVUkVfQVQuCitURVNUKE1hY3JvVGVzdCwgQUREX0ZBSUxVUkVfQVQpIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCBBRERfRkFJTFVSRV9BVCBkb2VzIGdlbmVyYXRlIGEgbm9uZmF0YWwgZmFpbHVyZSBhbmQKKyAgLy8gdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUgdXNlci1zdHJlYW1lZCBwYXJ0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBRERfRkFJTFVSRV9BVCgiZm9vLmNjIiwgNDIpIDw8ICJXcm9uZyEiLCAiV3JvbmchIik7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgdXNlci1zdHJlYW1lZCBwYXJ0IGlzIG9wdGlvbmFsLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBRERfRkFJTFVSRV9BVCgiZm9vLmNjIiwgNDIpLCAiRmFpbGVkIik7CisKKyAgLy8gVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IHZlcmlmeSB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMKKyAgLy8gdGhlIHJpZ2h0IGZpbGUgcGF0aCBhbmQgbGluZSBudW1iZXIgdGhlIHNhbWUgd2F5LCBhcworICAvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGRvZXNuJ3QgZ2V0IHRvIHNlZSB0aGUgZmlsZSBwYXRoIGFuZAorICAvLyBsaW5lIG51bWJlci4gIEluc3RlYWQsIHdlIGRvIHRoYXQgaW4gZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjLgorfQorCisvLyBUZXN0cyBGQUlMLgorVEVTVChNYWNyb1Rlc3QsIEZBSUwpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZS4iKTsKK30KKworLy8gVGVzdHMgU1VDQ0VFRAorVEVTVChNYWNyb1Rlc3QsIFNVQ0NFRUQpIHsKKyAgU1VDQ0VFRCgpOworICBTVUNDRUVEKCkgPDwgIkV4cGxpY2l0IHN1Y2Nlc3MuIjsKK30KKworLy8gVGVzdHMgZm9yIEVYUEVDVF9FUSgpIGFuZCBBU1NFUlRfRVEoKS4KKy8vCisvLyBUaGVzZSB0ZXN0cyBmYWlsICppbnRlbnRpb25hbGx5Kiwgcy50LiB0aGUgZmFpbHVyZSBtZXNzYWdlcyBjYW4gYmUKKy8vIGdlbmVyYXRlZCBhbmQgdGVzdGVkLgorLy8KKy8vIFdlIGhhdmUgZGlmZmVyZW50IHRlc3RzIGZvciBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMuCisKKy8vIFRlc3RzIHVzaW5nIGJvb2wgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBCb29sKSB7CisgIEVYUEVDVF9FUSh0cnVlLCAgdHJ1ZSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICAgIGJvb2wgZmFsc2VfdmFsdWUgPSBmYWxzZTsKKyAgICAgIEFTU0VSVF9FUShmYWxzZV92YWx1ZSwgdHJ1ZSk7CisgICAgfSwgIlZhbHVlIG9mOiB0cnVlIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIGludCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIEludCkgeworICBBU1NFUlRfRVEoMzIsIDMyKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDMyLCAzMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIzMyIpOworfQorCisvLyBUZXN0cyB1c2luZyB0aW1lX3QgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBUaW1lX1QpIHsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHRpbWVfdD4oMCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx0aW1lX3Q+KDApKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHN0YXRpY19jYXN0PHRpbWVfdD4oMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0aW1lX3Q+KDEyMzQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEyMzQiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgY2hhciB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIENoYXIpIHsKKyAgQVNTRVJUX0VRKCd6JywgJ3onKTsKKyAgY29uc3QgY2hhciBjaCA9ICdiJzsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKCdcMCcsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgnYScsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIHdjaGFyX3QgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBXaWRlQ2hhcikgeworICBFWFBFQ1RfRVEoTCdiJywgTCdiJyk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKEwnXDAnLCBMJ3gnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBMJ3gnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogTCd4JyAoMTIwLCAweDc4KVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IEwnXDAnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGljaCBpczogTCdcMCcgKDAsIDB4MCkiKTsKKworICBzdGF0aWMgd2NoYXJfdCB3Y2hhcjsKKyAgd2NoYXIgPSBMJ2InOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoTCdhJywgd2NoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAid2NoYXIiKTsKKyAgd2NoYXIgPSAweDgxMTk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShzdGF0aWNfY2FzdDx3Y2hhcl90PigweDgxMjApLCB3Y2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogd2NoYXIiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgOjpzdGQ6OnN0cmluZyB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIFN0ZFN0cmluZykgeworICAvLyBDb21wYXJlcyBhIGNvbnN0IGNoYXIqIHRvIGFuIHN0ZDo6c3RyaW5nIHRoYXQgaGFzIGlkZW50aWNhbAorICAvLyBjb250ZW50LgorICBBU1NFUlRfRVEoIlRlc3QiLCA6OnN0ZDo6c3RyaW5nKCJUZXN0IikpOworCisgIC8vIENvbXBhcmVzIHR3byBpZGVudGljYWwgc3RkOjpzdHJpbmdzLgorICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIxKCJBICogaW4gdGhlIG1pZGRsZSIpOworICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIyKHN0cjEpOworICBFWFBFQ1RfRVEoc3RyMSwgc3RyMik7CisKKyAgLy8gQ29tcGFyZXMgYSBjb25zdCBjaGFyKiB0byBhbiBzdGQ6OnN0cmluZyB0aGF0IGhhcyBkaWZmZXJlbnQKKyAgLy8gY29udGVudAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoIlRlc3QiLCA6OnN0ZDo6c3RyaW5nKCJ0ZXN0IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiOjpzdGQ6OnN0cmluZyhcInRlc3RcIikiKTsKKworICAvLyBDb21wYXJlcyBhbiBzdGQ6OnN0cmluZyB0byBhIGNoYXIqIHRoYXQgaGFzIGRpZmZlcmVudCBjb250ZW50LgorICBjaGFyKiBjb25zdCBwMSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KCJmb28iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoImJhciIpLCBwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMSIpOworCisgIC8vIENvbXBhcmVzIHR3byBzdGQ6OnN0cmluZ3MgdGhhdCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgb25lIG9mCisgIC8vIHdoaWNoIGhhdmluZyBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIG1pZGRsZS4gIFRoaXMgc2hvdWxkIGZhaWwuCisgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIHN0cjMoc3RyMSk7CisgIHN0cjMuYXQoMikgPSAnXDAnOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoc3RyMSwgc3RyMyksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogc3RyM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IFwiQSBcXDAgaW4gdGhlIG1pZGRsZVwiIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgdXNpbmcgOjpzdGQ6OndzdHJpbmcgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBTdGRXaWRlU3RyaW5nKSB7CisgIC8vIENvbXBhcmVzIHR3byBpZGVudGljYWwgc3RkOjp3c3RyaW5ncy4KKyAgY29uc3QgOjpzdGQ6OndzdHJpbmcgd3N0cjEoTCJBICogaW4gdGhlIG1pZGRsZSIpOworICBjb25zdCA6OnN0ZDo6d3N0cmluZyB3c3RyMih3c3RyMSk7CisgIEFTU0VSVF9FUSh3c3RyMSwgd3N0cjIpOworCisgIC8vIENvbXBhcmVzIGFuIHN0ZDo6d3N0cmluZyB0byBhIGNvbnN0IHdjaGFyX3QqIHRoYXQgaGFzIGlkZW50aWNhbAorICAvLyBjb250ZW50LgorICBjb25zdCB3Y2hhcl90IGtUZXN0WDgxMTlbXSA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAweDgxMTksICdcMCcgfTsKKyAgRVhQRUNUX0VRKDo6c3RkOjp3c3RyaW5nKGtUZXN0WDgxMTkpLCBrVGVzdFg4MTE5KTsKKworICAvLyBDb21wYXJlcyBhbiBzdGQ6OndzdHJpbmcgdG8gYSBjb25zdCB3Y2hhcl90KiB0aGF0IGhhcyBkaWZmZXJlbnQKKyAgLy8gY29udGVudC4KKyAgY29uc3Qgd2NoYXJfdCBrVGVzdFg4MTIwW10gPSB7ICdUJywgJ2UnLCAncycsICd0JywgMHg4MTIwLCAnXDAnIH07CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9FUSg6OnN0ZDo6d3N0cmluZyhrVGVzdFg4MTE5KSwga1Rlc3RYODEyMCk7CisgIH0sICJrVGVzdFg4MTIwIik7CisKKyAgLy8gQ29tcGFyZXMgdHdvIHN0ZDo6d3N0cmluZ3MgdGhhdCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgb25lIG9mCisgIC8vIHdoaWNoIGhhdmluZyBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIG1pZGRsZS4KKyAgOjpzdGQ6OndzdHJpbmcgd3N0cjMod3N0cjEpOworICB3c3RyMy5hdCgyKSA9IEwnXDAnOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEod3N0cjEsIHdzdHIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndzdHIzIik7CisKKyAgLy8gQ29tcGFyZXMgYSB3Y2hhcl90KiB0byBhbiBzdGQ6OndzdHJpbmcgdGhhdCBoYXMgZGlmZmVyZW50CisgIC8vIGNvbnRlbnQuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9FUShjb25zdF9jYXN0PHdjaGFyX3QqPihMImZvbyIpLCA6OnN0ZDo6d3N0cmluZyhMImJhciIpKTsKKyAgfSwgIiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKy8vIFRlc3RzIHVzaW5nIDo6c3RyaW5nIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgR2xvYmFsU3RyaW5nKSB7CisgIC8vIENvbXBhcmVzIGEgY29uc3QgY2hhciogdG8gYSA6OnN0cmluZyB0aGF0IGhhcyBpZGVudGljYWwgY29udGVudC4KKyAgRVhQRUNUX0VRKCJUZXN0IiwgOjpzdHJpbmcoIlRlc3QiKSk7CisKKyAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCA6OnN0cmluZ3MuCisgIGNvbnN0IDo6c3RyaW5nIHN0cjEoIkEgKiBpbiB0aGUgbWlkZGxlIik7CisgIGNvbnN0IDo6c3RyaW5nIHN0cjIoc3RyMSk7CisgIEFTU0VSVF9FUShzdHIxLCBzdHIyKTsKKworICAvLyBDb21wYXJlcyBhIDo6c3RyaW5nIHRvIGEgY29uc3QgY2hhciogdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg6OnN0cmluZygiVGVzdCIpLCAidGVzdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIpOworCisgIC8vIENvbXBhcmVzIHR3byA6OnN0cmluZ3MgdGhhdCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgb25lIG9mIHdoaWNoCisgIC8vIGhhdmluZyBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIG1pZGRsZS4KKyAgOjpzdHJpbmcgc3RyMyhzdHIxKTsKKyAgc3RyMy5hdCgyKSA9ICdcMCc7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShzdHIxLCBzdHIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cjMiKTsKKworICAvLyBDb21wYXJlcyBhIDo6c3RyaW5nIHRvIGEgY2hhciogdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9FUSg6OnN0cmluZygiYmFyIiksIGNvbnN0X2Nhc3Q8Y2hhcio+KCJmb28iKSk7CisgIH0sICIiKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIFRlc3RzIHVzaW5nIDo6d3N0cmluZyB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIEdsb2JhbFdpZGVTdHJpbmcpIHsKKyAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCA6OndzdHJpbmdzLgorICBzdGF0aWMgY29uc3QgOjp3c3RyaW5nIHdzdHIxKEwiQSAqIGluIHRoZSBtaWRkbGUiKTsKKyAgc3RhdGljIGNvbnN0IDo6d3N0cmluZyB3c3RyMih3c3RyMSk7CisgIEVYUEVDVF9FUSh3c3RyMSwgd3N0cjIpOworCisgIC8vIENvbXBhcmVzIGEgY29uc3Qgd2NoYXJfdCogdG8gYSA6OndzdHJpbmcgdGhhdCBoYXMgaWRlbnRpY2FsIGNvbnRlbnQuCisgIGNvbnN0IHdjaGFyX3Qga1Rlc3RYODExOVtdID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDB4ODExOSwgJ1wwJyB9OworICBBU1NFUlRfRVEoa1Rlc3RYODExOSwgOjp3c3RyaW5nKGtUZXN0WDgxMTkpKTsKKworICAvLyBDb21wYXJlcyBhIGNvbnN0IHdjaGFyX3QqIHRvIGEgOjp3c3RyaW5nIHRoYXQgaGFzIGRpZmZlcmVudAorICAvLyBjb250ZW50LgorICBjb25zdCB3Y2hhcl90IGtUZXN0WDgxMjBbXSA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAweDgxMjAsICdcMCcgfTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0VRKGtUZXN0WDgxMjAsIDo6d3N0cmluZyhrVGVzdFg4MTE5KSk7CisgIH0sICJUZXN0XFx4ODExOSIpOworCisgIC8vIENvbXBhcmVzIGEgd2NoYXJfdCogdG8gYSA6OndzdHJpbmcgdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCisgIHdjaGFyX3QqIGNvbnN0IHAxID0gY29uc3RfY2FzdDx3Y2hhcl90Kj4oTCJmb28iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAxLCA6OndzdHJpbmcoTCJiYXIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIiKTsKKworICAvLyBDb21wYXJlcyB0d28gOjp3c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2Ygd2hpY2gKKyAgLy8gaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLgorICBzdGF0aWMgOjp3c3RyaW5nIHdzdHIzOworICB3c3RyMyA9IHdzdHIxOworICB3c3RyMy5hdCgyKSA9IEwnXDAnOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEod3N0cjEsIHdzdHIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIndzdHIzIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIFRlc3RzIHVzaW5nIGNoYXIgcG9pbnRlcnMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIENoYXJQb2ludGVyKSB7CisgIGNoYXIqIGNvbnN0IHAwID0gTlVMTDsKKyAgLy8gT25seSB3YXkgdG8gZ2V0IHRoZSBOb2tpYSBjb21waWxlciB0byBjb21waWxlIHRoZSBjYXN0CisgIC8vIGlzIHRvIGhhdmUgYSBzZXBhcmF0ZSB2b2lkKiB2YXJpYWJsZSBmaXJzdC4gUHV0dGluZworICAvLyB0aGUgdHdvIGNhc3RzIG9uIHRoZSBzYW1lIGxpbmUgZG9lc24ndCB3b3JrLCBuZWl0aGVyIGRvZXMKKyAgLy8gYSBkaXJlY3QgQy1zdHlsZSB0byBjaGFyKi4KKyAgdm9pZCogcHYxID0gKHZvaWQqKTB4MTIzNDsgIC8vIE5PTElOVAorICB2b2lkKiBwdjIgPSAodm9pZCopMHhBQkMwOyAgLy8gTk9MSU5UCisgIGNoYXIqIGNvbnN0IHAxID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocHYxKTsKKyAgY2hhciogY29uc3QgcDIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwdjIpOworICBBU1NFUlRfRVEocDEsIHAxKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDAsIHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBwMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDEsIHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInAyIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShyZWludGVycHJldF9jYXN0PGNoYXIqPigweDEyMzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oMHhBQkMwKSksCisgICAgICAgICAgICAgICAgICAgICAgICJBQkMwIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIHdjaGFyX3QgcG9pbnRlcnMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIFdpZGVDaGFyUG9pbnRlcikgeworICB3Y2hhcl90KiBjb25zdCBwMCA9IE5VTEw7CisgIC8vIE9ubHkgd2F5IHRvIGdldCB0aGUgTm9raWEgY29tcGlsZXIgdG8gY29tcGlsZSB0aGUgY2FzdAorICAvLyBpcyB0byBoYXZlIGEgc2VwYXJhdGUgdm9pZCogdmFyaWFibGUgZmlyc3QuIFB1dHRpbmcKKyAgLy8gdGhlIHR3byBjYXN0cyBvbiB0aGUgc2FtZSBsaW5lIGRvZXNuJ3Qgd29yaywgbmVpdGhlciBkb2VzCisgIC8vIGEgZGlyZWN0IEMtc3R5bGUgdG8gY2hhciouCisgIHZvaWQqIHB2MSA9ICh2b2lkKikweDEyMzQ7ICAvLyBOT0xJTlQKKyAgdm9pZCogcHYyID0gKHZvaWQqKTB4QUJDMDsgIC8vIE5PTElOVAorICB3Y2hhcl90KiBjb25zdCBwMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8d2NoYXJfdCo+KHB2MSk7CisgIHdjaGFyX3QqIGNvbnN0IHAyID0gcmVpbnRlcnByZXRfY2FzdDx3Y2hhcl90Kj4ocHYyKTsKKyAgRVhQRUNUX0VRKHAwLCBwMCk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAwLCBwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogcDIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAxLCBwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMiIpOworICB2b2lkKiBwdjMgPSAodm9pZCopMHgxMjM0OyAgLy8gTk9MSU5UCisgIHZvaWQqIHB2NCA9ICh2b2lkKikweEFCQzA7ICAvLyBOT0xJTlQKKyAgY29uc3Qgd2NoYXJfdCogcDMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHdjaGFyX3QqPihwdjMpOworICBjb25zdCB3Y2hhcl90KiBwNCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KHB2NCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMywgcDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicDQiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgb3RoZXIgdHlwZXMgb2YgcG9pbnRlcnMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIE90aGVyUG9pbnRlcikgeworICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8Y29uc3QgaW50Kj4oTlVMTCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBpbnQqPihOVUxMKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShzdGF0aWNfY2FzdDxjb25zdCBpbnQqPihOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50Kj4oMHgxMjM0KSksCisgICAgICAgICAgICAgICAgICAgICAgICIweDEyMzQiKTsKK30KKworLy8gQSBjbGFzcyB0aGF0IHN1cHBvcnRzIGJpbmFyeSBjb21wYXJpc29uIG9wZXJhdG9ycyBidXQgbm90IHN0cmVhbWluZy4KK2NsYXNzIFVucHJpbnRhYmxlQ2hhciB7CisgcHVibGljOgorICBleHBsaWNpdCBVbnByaW50YWJsZUNoYXIoY2hhciBjaCkgOiBjaGFyXyhjaCkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPT0gcmhzLmNoYXJfOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyAhPSByaHMuY2hhcl87CisgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPCByaHMuY2hhcl87CisgIH0KKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNoYXJfIDw9IHJocy5jaGFyXzsKKyAgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyA+IHJocy5jaGFyXzsKKyAgfQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPj0gcmhzLmNoYXJfOworICB9CisKKyBwcml2YXRlOgorICBjaGFyIGNoYXJfOworfTsKKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfRVEoKSBhbmQgZnJpZW5kcyBkb24ndCByZXF1aXJlIHRoZSBhcmd1bWVudHMgdG8KKy8vIGJlIHByaW50YWJsZS4KK1RFU1QoQ29tcGFyaXNvbkFzc2VydGlvblRlc3QsIEFjY2VwdHNVbnByaW50YWJsZUFyZ3MpIHsKKyAgY29uc3QgVW5wcmludGFibGVDaGFyIHgoJ3gnKSwgeSgneScpOworICBBU1NFUlRfRVEoeCwgeCk7CisgIEVYUEVDVF9ORSh4LCB5KTsKKyAgQVNTRVJUX0xUKHgsIHkpOworICBFWFBFQ1RfTEUoeCwgeSk7CisgIEFTU0VSVF9HVCh5LCB4KTsKKyAgRVhQRUNUX0dFKHgsIHgpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoeCwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKHksIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR1QoeCwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKKworICAvLyBDb2RlIHRlc3RlZCBieSBFWFBFQ1RfRkFUQUxfRkFJTFVSRSBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsCisgIC8vIHZhcmlhYmxlcywgc28gd2UgaGF2ZSB0byB3cml0ZSBVbnByaW50YWJsZUNoYXIoJ3gnKSBpbnN0ZWFkIG9mIHguCisjaWZuZGVmIF9fQk9STEFORENfXworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkUoVW5wcmludGFibGVDaGFyKCd4JyksIFVucHJpbnRhYmxlQ2hhcigneCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTEUoVW5wcmludGFibGVDaGFyKCd5JyksIFVucHJpbnRhYmxlQ2hhcigneCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworI2VuZGlmCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9MRShVbnByaW50YWJsZUNoYXIoJ3knKSwgVW5wcmludGFibGVDaGFyKCd4JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9HRShVbnByaW50YWJsZUNoYXIoJ3gnKSwgVW5wcmludGFibGVDaGFyKCd5JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9HRShVbnByaW50YWJsZUNoYXIoJ3gnKSwgVW5wcmludGFibGVDaGFyKCd5JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7Cit9CisKKy8vIFRlc3RzIHRoZSBGUklFTkRfVEVTVCBtYWNyby4KKworLy8gVGhpcyBjbGFzcyBoYXMgYSBwcml2YXRlIG1lbWJlciB3ZSB3YW50IHRvIHRlc3QuICBXZSB3aWxsIHRlc3QgaXQKKy8vIGJvdGggaW4gYSBURVNUIGFuZCBpbiBhIFRFU1RfRi4KK2NsYXNzIEZvbyB7CisgcHVibGljOgorICBGb28oKSB7fQorCisgcHJpdmF0ZToKKyAgaW50IEJhcigpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKworICAvLyBEZWNsYXJlcyB0aGUgZnJpZW5kIHRlc3RzIHRoYXQgY2FuIGFjY2VzcyB0aGUgcHJpdmF0ZSBtZW1iZXIKKyAgLy8gQmFyKCkuCisgIEZSSUVORF9URVNUKEZSSUVORF9URVNUX1Rlc3QsIFRFU1QpOworICBGUklFTkRfVEVTVChGUklFTkRfVEVTVF9UZXN0MiwgVEVTVF9GKTsKK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIEZSSUVORF9URVNUIGRlY2xhcmF0aW9uIGFsbG93cyBhIFRFU1QgdG8gYWNjZXNzIGEKKy8vIGNsYXNzJ3MgcHJpdmF0ZSBtZW1iZXJzLiAgVGhpcyBzaG91bGQgY29tcGlsZS4KK1RFU1QoRlJJRU5EX1RFU1RfVGVzdCwgVEVTVCkgeworICBBU1NFUlRfRVEoMSwgRm9vKCkuQmFyKCkpOworfQorCisvLyBUaGUgZml4dHVyZSBuZWVkZWQgdG8gdGVzdCB1c2luZyBGUklFTkRfVEVTVCB3aXRoIFRFU1RfRi4KK2NsYXNzIEZSSUVORF9URVNUX1Rlc3QyIDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgRm9vIGZvbzsKK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIEZSSUVORF9URVNUIGRlY2xhcmF0aW9uIGFsbG93cyBhIFRFU1RfRiB0byBhY2Nlc3MgYQorLy8gY2xhc3MncyBwcml2YXRlIG1lbWJlcnMuICBUaGlzIHNob3VsZCBjb21waWxlLgorVEVTVF9GKEZSSUVORF9URVNUX1Rlc3QyLCBURVNUX0YpIHsKKyAgQVNTRVJUX0VRKDEsIGZvby5CYXIoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaWZlIGN5Y2xlIG9mIFRlc3Qgb2JqZWN0cy4KKworLy8gVGhlIHRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyB0aGUgbGlmZSBjeWNsZSBvZiBUZXN0IG9iamVjdHMuCisvLworLy8gVGhpcyBjbGFzcyBjb3VudHMgdGhlIG51bWJlciBvZiBsaXZlIHRlc3Qgb2JqZWN0cyB0aGF0IHVzZXMgdGhpcworLy8gZml4dHVyZS4KK2NsYXNzIFRlc3RMaWZlQ3ljbGVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gQ29uc3RydWN0b3IuICBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdGVzdCBvYmplY3RzIHRoYXQgdXNlcworICAvLyB0aGlzIGZpeHR1cmUuCisgIFRlc3RMaWZlQ3ljbGVUZXN0KCkgeyBjb3VudF8rKzsgfQorCisgIC8vIERlc3RydWN0b3IuICBEZWNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdGVzdCBvYmplY3RzIHRoYXQgdXNlcyB0aGlzCisgIC8vIGZpeHR1cmUuCisgIH5UZXN0TGlmZUN5Y2xlVGVzdCgpIHsgY291bnRfLS07IH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSB0ZXN0IG9iamVjdHMgdGhhdCB1c2VzIHRoaXMgZml4dHVyZS4KKyAgaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gY291bnRfOyB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IGNvdW50XzsKK307CisKK2ludCBUZXN0TGlmZUN5Y2xlVGVzdDo6Y291bnRfID0gMDsKKworLy8gVGVzdHMgdGhlIGxpZmUgY3ljbGUgb2YgdGVzdCBvYmplY3RzLgorVEVTVF9GKFRlc3RMaWZlQ3ljbGVUZXN0LCBUZXN0MSkgeworICAvLyBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgdGVzdCBvYmplY3QgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCdzCisgIC8vIGN1cnJlbnRseSBhbGl2ZS4KKyAgQVNTRVJUX0VRKDEsIGNvdW50KCkpOworfQorCisvLyBUZXN0cyB0aGUgbGlmZSBjeWNsZSBvZiB0ZXN0IG9iamVjdHMuCitURVNUX0YoVGVzdExpZmVDeWNsZVRlc3QsIFRlc3QyKSB7CisgIC8vIEFmdGVyIFRlc3QxIGlzIGRvbmUgYW5kIFRlc3QyIGlzIHN0YXJ0ZWQsIHRoZXJlIHNob3VsZCBzdGlsbCBiZQorICAvLyBvbmx5IG9uZSBsaXZlIHRlc3Qgb2JqZWN0LCBhcyB0aGUgb2JqZWN0IGZvciBUZXN0MSBzaG91bGQndmUgYmVlbgorICAvLyBkZWxldGVkLgorICBBU1NFUlRfRVEoMSwgY291bnQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUZXN0cyB0aGF0IHRoZSBjb3B5IGNvbnN0cnVjdG9yIHdvcmtzIHdoZW4gaXQgaXMgTk9UIG9wdGltaXplZCBhd2F5IGJ5CisvLyB0aGUgY29tcGlsZXIuCitURVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIENvcHlDb25zdHJ1Y3RvcldvcmtzV2hlbk5vdE9wdGltaWVkKSB7CisgIC8vIENoZWNrcyB0aGF0IHRoZSBjb3B5IGNvbnN0cnVjdG9yIGRvZXNuJ3QgdHJ5IHRvIGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcnMKKyAgLy8gaW4gdGhlIHNvdXJjZSBvYmplY3QuCisgIEFzc2VydGlvblJlc3VsdCByMSA9IEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgQXNzZXJ0aW9uUmVzdWx0IHIyID0gcjE7CisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhZGRlZCB0byBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcKKyAgLy8gYXdheSB0aGUgY29uc3RydWN0b3IgY2FsbC4KKyAgcjEgPDwgImFiYyI7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHIzID0gcjE7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxib29sPihyMyksIHN0YXRpY19jYXN0PGJvb2w+KHIxKSk7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgcjEubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBBc3NlcnRpb25TdWNjZXNzIGFuZCBBc3NlcnRpb25GYWlsdXJlIGNvbnN0cnVjdAorLy8gQXNzZXJ0aW9uUmVzdWx0IG9iamVjdHMgYXMgZXhwZWN0ZWQuCitURVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIENvbnN0cnVjdGlvbldvcmtzKSB7CisgIEFzc2VydGlvblJlc3VsdCByMSA9IEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgRVhQRUNUX1RSVUUocjEpOworICBFWFBFQ1RfU1RSRVEoIiIsIHIxLm1lc3NhZ2UoKSk7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHIyID0gQXNzZXJ0aW9uU3VjY2VzcygpIDw8ICJhYmMiOworICBFWFBFQ1RfVFJVRShyMik7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgcjIubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjMgPSBBc3NlcnRpb25GYWlsdXJlKCk7CisgIEVYUEVDVF9GQUxTRShyMyk7CisgIEVYUEVDVF9TVFJFUSgiIiwgcjMubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjQgPSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgImRlZiI7CisgIEVYUEVDVF9GQUxTRShyNCk7CisgIEVYUEVDVF9TVFJFUSgiZGVmIiwgcjQubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjUgPSBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiZ2hpIik7CisgIEVYUEVDVF9GQUxTRShyNSk7CisgIEVYUEVDVF9TVFJFUSgiZ2hpIiwgcjUubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbmVnYXRpb24gZmxpcHMgdGhlIHByZWRpY2F0ZSByZXN1bHQgYnV0IGtlZXBzIHRoZSBtZXNzYWdlLgorVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBOZWdhdGlvbldvcmtzKSB7CisgIEFzc2VydGlvblJlc3VsdCByMSA9IEFzc2VydGlvblN1Y2Nlc3MoKSA8PCAiYWJjIjsKKyAgRVhQRUNUX0ZBTFNFKCFyMSk7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgKCFyMSkubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjIgPSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgImRlZiI7CisgIEVYUEVDVF9UUlVFKCFyMik7CisgIEVYUEVDVF9TVFJFUSgiZGVmIiwgKCFyMikubWVzc2FnZSgpKTsKK30KKworVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBTdHJlYW1pbmdXb3JrcykgeworICBBc3NlcnRpb25SZXN1bHQgciA9IEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgciA8PCAiYWJjIiA8PCAnZCcgPDwgMCA8PCB0cnVlOworICBFWFBFQ1RfU1RSRVEoImFiY2QwdHJ1ZSIsIHIubWVzc2FnZSgpKTsKK30KKworVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBDYW5TdHJlYW1Pc3RyZWFtTWFuaXB1bGF0b3JzKSB7CisgIEFzc2VydGlvblJlc3VsdCByID0gQXNzZXJ0aW9uU3VjY2VzcygpOworICByIDw8ICJEYXRhIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjpmbHVzaCA8PCBzdGQ6OmVuZHMgPDwgIldpbGwgYmUgdmlzaWJsZSI7CisgIEVYUEVDVF9TVFJFUSgiRGF0YVxuXFwwV2lsbCBiZSB2aXNpYmxlIiwgci5tZXNzYWdlKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSB1c2VyIHR5cGUgd2hvc2UgZGVmaW5pdGlvbiBhbmQgb3BlcmF0b3IgPDwgYXJlCisvLyBib3RoIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorY2xhc3MgQmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBCYXNlKGludCBhbl94KSA6IHhfKGFuX3gpIHt9CisgIGludCB4KCkgY29uc3QgeyByZXR1cm4geF87IH0KKyBwcml2YXRlOgorICBpbnQgeF87Cit9Oworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzZSYgdmFsKSB7CisgIHJldHVybiBvcyA8PCB2YWwueCgpOworfQorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzZSogcG9pbnRlcikgeworICByZXR1cm4gb3MgPDwgIigiIDw8IHBvaW50ZXItPngoKSA8PCAiKSI7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIENhblN0cmVhbVVzZXJUeXBlSW5HbG9iYWxOYW1lU3BhY2UpIHsKKyAgTWVzc2FnZSBtc2c7CisgIEJhc2UgYSgxKTsKKworICBtc2cgPDwgYSA8PCAmYTsgIC8vIFVzZXMgOjpvcGVyYXRvcjw8LgorICBFWFBFQ1RfU1RSRVEoIjEoMSkiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIHVzZXIgdHlwZSB3aG9zZSBkZWZpbml0aW9uIGFuZCBvcGVyYXRvcjw8IGFyZQorLy8gYm90aCBpbiBhbiB1bm5hbWVkIG5hbWVzcGFjZS4KK25hbWVzcGFjZSB7CitjbGFzcyBNeVR5cGVJblVubmFtZWROYW1lU3BhY2UgOiBwdWJsaWMgQmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBNeVR5cGVJblVubmFtZWROYW1lU3BhY2UoaW50IGFuX3gpOiBCYXNlKGFuX3gpIHt9Cit9Oworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlJiB2YWwpIHsKKyAgcmV0dXJuIG9zIDw8IHZhbC54KCk7Cit9CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNeVR5cGVJblVubmFtZWROYW1lU3BhY2UqIHBvaW50ZXIpIHsKKyAgcmV0dXJuIG9zIDw8ICIoIiA8PCBwb2ludGVyLT54KCkgPDwgIikiOworfQorfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoTWVzc2FnZVRlc3QsIENhblN0cmVhbVVzZXJUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBNeVR5cGVJblVubmFtZWROYW1lU3BhY2UgYSgxKTsKKworICBtc2cgPDwgYSA8PCAmYTsgIC8vIFVzZXMgPHVubmFtZWRfbmFtZXNwYWNlPjo6b3BlcmF0b3I8PC4KKyAgRVhQRUNUX1NUUkVRKCIxKDEpIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSB1c2VyIHR5cGUgd2hvc2UgZGVmaW5pdGlvbiBhbmQgb3BlcmF0b3I8PCBhcmUKKy8vIGJvdGggaW4gYSB1c2VyIG5hbWVzcGFjZS4KK25hbWVzcGFjZSBuYW1lc3BhY2UxIHsKK2NsYXNzIE15VHlwZUluTmFtZVNwYWNlMSA6IHB1YmxpYyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE15VHlwZUluTmFtZVNwYWNlMShpbnQgYW5feCk6IEJhc2UoYW5feCkge30KK307CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNeVR5cGVJbk5hbWVTcGFjZTEmIHZhbCkgeworICByZXR1cm4gb3MgPDwgdmFsLngoKTsKK30KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE15VHlwZUluTmFtZVNwYWNlMSogcG9pbnRlcikgeworICByZXR1cm4gb3MgPDwgIigiIDw8IHBvaW50ZXItPngoKSA8PCAiKSI7Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmFtZXNwYWNlMQorCitURVNUKE1lc3NhZ2VUZXN0LCBDYW5TdHJlYW1Vc2VyVHlwZUluVXNlck5hbWVTcGFjZSkgeworICBNZXNzYWdlIG1zZzsKKyAgbmFtZXNwYWNlMTo6TXlUeXBlSW5OYW1lU3BhY2UxIGEoMSk7CisKKyAgbXNnIDw8IGEgPDwgJmE7ICAvLyBVc2VzIG5hbWVzcGFjZTE6Om9wZXJhdG9yPDwuCisgIEVYUEVDVF9TVFJFUSgiMSgxKSIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgdXNlciB0eXBlIHdob3NlIGRlZmluaXRpb24gaXMgaW4gYSB1c2VyIG5hbWVzcGFjZQorLy8gYnV0IHdob3NlIG9wZXJhdG9yPDwgaXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCituYW1lc3BhY2UgbmFtZXNwYWNlMiB7CitjbGFzcyBNeVR5cGVJbk5hbWVTcGFjZTIgOiBwdWJsaWMgOjpCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE15VHlwZUluTmFtZVNwYWNlMihpbnQgYW5feCk6IEJhc2UoYW5feCkge30KK307Cit9ICAvLyBuYW1lc3BhY2UgbmFtZXNwYWNlMgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlMjo6TXlUeXBlSW5OYW1lU3BhY2UyJiB2YWwpIHsKKyAgcmV0dXJuIG9zIDw8IHZhbC54KCk7Cit9CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2UyOjpNeVR5cGVJbk5hbWVTcGFjZTIqIHBvaW50ZXIpIHsKKyAgcmV0dXJuIG9zIDw8ICIoIiA8PCBwb2ludGVyLT54KCkgPDwgIikiOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBDYW5TdHJlYW1Vc2VyVHlwZUluVXNlck5hbWVTcGFjZVdpdGhTdHJlYW1PcGVyYXRvckluR2xvYmFsKSB7CisgIE1lc3NhZ2UgbXNnOworICBuYW1lc3BhY2UyOjpNeVR5cGVJbk5hbWVTcGFjZTIgYSgxKTsKKworICBtc2cgPDwgYSA8PCAmYTsgIC8vIFVzZXMgOjpvcGVyYXRvcjw8LgorICBFWFBFQ1RfU1RSRVEoIjEoMSkiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBOVUxMIHBvaW50ZXJzIHRvIHRlc3Rpbmc6Ok1lc3NhZ2UuCitURVNUKE1lc3NhZ2VUZXN0LCBOdWxsUG9pbnRlcnMpIHsKKyAgTWVzc2FnZSBtc2c7CisgIGNoYXIqIGNvbnN0IHAxID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciogY29uc3QgcDIgPSBOVUxMOworICBpbnQqIHAzID0gTlVMTDsKKyAgZG91YmxlKiBwNCA9IE5VTEw7CisgIGJvb2wqIHA1ID0gTlVMTDsKKyAgTWVzc2FnZSogcDYgPSBOVUxMOworCisgIG1zZyA8PCBwMSA8PCBwMiA8PCBwMyA8PCBwNCA8PCBwNSA8PCBwNjsKKyAgQVNTRVJUX1NUUkVRKCIobnVsbCkobnVsbCkobnVsbCkobnVsbCkobnVsbCkobnVsbCkiLAorICAgICAgICAgICAgICAgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgd2lkZSBzdHJpbmdzIHRvIHRlc3Rpbmc6Ok1lc3NhZ2UuCitURVNUKE1lc3NhZ2VUZXN0LCBXaWRlU3RyaW5ncykgeworICAvLyBTdHJlYW1zIGEgTlVMTCBvZiB0eXBlIGNvbnN0IHdjaGFyX3QqLgorICBjb25zdCB3Y2hhcl90KiBjb25zdF93c3RyID0gTlVMTDsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLAorICAgICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCBjb25zdF93c3RyKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKworICAvLyBTdHJlYW1zIGEgTlVMTCBvZiB0eXBlIHdjaGFyX3QqLgorICB3Y2hhcl90KiB3c3RyID0gTlVMTDsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLAorICAgICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCB3c3RyKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKworICAvLyBTdHJlYW1zIGEgbm9uLU5VTEwgb2YgdHlwZSBjb25zdCB3Y2hhcl90Ki4KKyAgY29uc3Rfd3N0ciA9IEwiYWJjXHg4MTE5IjsKKyAgRVhQRUNUX1NUUkVRKCJhYmNceGU4XHg4NFx4OTkiLAorICAgICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCBjb25zdF93c3RyKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKworICAvLyBTdHJlYW1zIGEgbm9uLU5VTEwgb2YgdHlwZSB3Y2hhcl90Ki4KKyAgd3N0ciA9IGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KGNvbnN0X3dzdHIpOworICBFWFBFQ1RfU1RSRVEoImFiY1x4ZThceDg0XHg5OSIsCisgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IHdzdHIpLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCisKKy8vIFRoaXMgbGluZSB0ZXN0cyB0aGF0IHdlIGNhbiBkZWZpbmUgdGVzdHMgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlLgorbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUZXN0cyB0aGUgVGVzdEluZm8gY2xhc3MuCisKK2NsYXNzIFRlc3RJbmZvVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBUZXN0SW5mbyogR2V0VGVzdEluZm8oY29uc3QgY2hhciogdGVzdF9uYW1lKSB7CisgICAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IEdldFVuaXRUZXN0SW1wbCgpLT4KKyAgICAgICAgR2V0VGVzdENhc2UoIlRlc3RJbmZvVGVzdCIsICIiLCBOVUxMLCBOVUxMKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCk7ICsraSkgeworICAgICAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+R2V0VGVzdEluZm8oaSk7CisgICAgICBpZiAoc3RyY21wKHRlc3RfbmFtZSwgdGVzdF9pbmZvLT5uYW1lKCkpID09IDApCisgICAgICAgIHJldHVybiB0ZXN0X2luZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc3RhdGljIGNvbnN0IFRlc3RSZXN1bHQqIEdldFRlc3RSZXN1bHQoCisgICAgICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+cmVzdWx0KCk7CisgIH0KK307CisKKy8vIFRlc3RzIFRlc3RJbmZvOjp0ZXN0X2Nhc2VfbmFtZSgpIGFuZCBUZXN0SW5mbzo6bmFtZSgpLgorVEVTVF9GKFRlc3RJbmZvVGVzdCwgTmFtZXMpIHsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IEdldFRlc3RJbmZvKCJOYW1lcyIpOworCisgIEFTU0VSVF9TVFJFUSgiVGVzdEluZm9UZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgQVNTRVJUX1NUUkVRKCJOYW1lcyIsIHRlc3RfaW5mby0+bmFtZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdEluZm86OnJlc3VsdCgpLgorVEVTVF9GKFRlc3RJbmZvVGVzdCwgcmVzdWx0KSB7CisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSBHZXRUZXN0SW5mbygicmVzdWx0Iik7CisKKyAgLy8gSW5pdGlhbGx5LCB0aGVyZSBpcyBubyBUZXN0UGFydFJlc3VsdCBmb3IgdGhpcyB0ZXN0LgorICBBU1NFUlRfRVEoMCwgR2V0VGVzdFJlc3VsdCh0ZXN0X2luZm8pLT50b3RhbF9wYXJ0X2NvdW50KCkpOworCisgIC8vIEFmdGVyIHRoZSBwcmV2aW91cyBhc3NlcnRpb24sIHRoZXJlIGlzIHN0aWxsIG5vbmUuCisgIEFTU0VSVF9FUSgwLCBHZXRUZXN0UmVzdWx0KHRlc3RfaW5mbyktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHNldHRpbmcgdXAgYW5kIHRlYXJpbmcgZG93biBhIHRlc3QgY2FzZS4KKworY2xhc3MgU2V0VXBUZXN0Q2FzZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlCisgIC8vIGlzIHJ1bi4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBwcmludGYoIlNldHRpbmcgdXAgdGhlIHRlc3QgY2FzZSAuIC4gLlxuIik7CisKKyAgICAvLyBJbml0aWFsaXplcyBzb21lIHNoYXJlZCByZXNvdXJjZS4gIEluIHRoaXMgc2ltcGxlIGV4YW1wbGUsIHdlCisgICAgLy8ganVzdCBjcmVhdGUgYSBDIHN0cmluZy4gIE1vcmUgY29tcGxleCBzdHVmZiBjYW4gYmUgZG9uZSBpZgorICAgIC8vIGRlc2lyZWQuCisgICAgc2hhcmVkX3Jlc291cmNlXyA9ICIxMjMiOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCBoYXZlIGJlZW4gc2V0IHVwLgorICAgIGNvdW50ZXJfKys7CisKKyAgICAvLyBTZXRVcFRlc3RDYXNlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuCisgICAgRVhQRUNUX0VRKDEsIGNvdW50ZXJfKTsKKyAgfQorCisgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSBhZnRlciB0aGUgbGFzdCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIGlzCisgIC8vIHJ1bi4KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBwcmludGYoIlRlYXJpbmcgZG93biB0aGUgdGVzdCBjYXNlIC4gLiAuXG4iKTsKKworICAgIC8vIERlY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHNldCB1cC4KKyAgICBjb3VudGVyXy0tOworCisgICAgLy8gVGVhckRvd25UZXN0Q2FzZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLgorICAgIEVYUEVDVF9FUSgwLCBjb3VudGVyXyk7CisKKyAgICAvLyBDbGVhbnMgdXAgdGhlIHNoYXJlZCByZXNvdXJjZS4KKyAgICBzaGFyZWRfcmVzb3VyY2VfID0gTlVMTDsKKyAgfQorCisgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdCBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIFNldFVwVGVzdENhc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSwgc28gY291bnRlcl8gc2hvdWxkCisgICAgLy8gYWx3YXlzIGJlIDEuCisgICAgRVhQRUNUX0VRKDEsIGNvdW50ZXJfKTsKKyAgfQorCisgIC8vIE51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHNldCB1cC4KKyAgc3RhdGljIGludCBjb3VudGVyXzsKKworICAvLyBTb21lIHJlc291cmNlIHRvIGJlIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBzaGFyZWRfcmVzb3VyY2VfOworfTsKKworaW50IFNldFVwVGVzdENhc2VUZXN0Ojpjb3VudGVyXyA9IDA7Citjb25zdCBjaGFyKiBTZXRVcFRlc3RDYXNlVGVzdDo6c2hhcmVkX3Jlc291cmNlXyA9IE5VTEw7CisKKy8vIEEgdGVzdCB0aGF0IHVzZXMgdGhlIHNoYXJlZCByZXNvdXJjZS4KK1RFU1RfRihTZXRVcFRlc3RDYXNlVGVzdCwgVGVzdDEpIHsKKyAgRVhQRUNUX1NUUk5FKE5VTEwsIHNoYXJlZF9yZXNvdXJjZV8pOworfQorCisvLyBBbm90aGVyIHRlc3QgdGhhdCB1c2VzIHRoZSBzaGFyZWQgcmVzb3VyY2UuCitURVNUX0YoU2V0VXBUZXN0Q2FzZVRlc3QsIFRlc3QyKSB7CisgIEVYUEVDVF9TVFJFUSgiMTIzIiwgc2hhcmVkX3Jlc291cmNlXyk7Cit9CisKKy8vIFRoZSBJbml0R29vZ2xlVGVzdFRlc3QgdGVzdCBjYXNlIHRlc3RzIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkuCisKKy8vIFRoZSBGbGFncyBzdHJ1Y3Qgc3RvcmVzIGEgY29weSBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitzdHJ1Y3QgRmxhZ3MgeworICAvLyBDb25zdHJ1Y3RzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIGVhY2ggZmxhZyBoYXMgaXRzIGRlZmF1bHQgdmFsdWUuCisgIEZsYWdzKCkgOiBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyhmYWxzZSksCisgICAgICAgICAgICBicmVha19vbl9mYWlsdXJlKGZhbHNlKSwKKyAgICAgICAgICAgIGNhdGNoX2V4Y2VwdGlvbnMoZmFsc2UpLAorICAgICAgICAgICAgZGVhdGhfdGVzdF91c2VfZm9yayhmYWxzZSksCisgICAgICAgICAgICBmaWx0ZXIoIiIpLAorICAgICAgICAgICAgbGlzdF90ZXN0cyhmYWxzZSksCisgICAgICAgICAgICBvdXRwdXQoIiIpLAorICAgICAgICAgICAgcHJpbnRfdGltZSh0cnVlKSwKKyAgICAgICAgICAgIHJhbmRvbV9zZWVkKDApLAorICAgICAgICAgICAgcmVwZWF0KDEpLAorICAgICAgICAgICAgc2h1ZmZsZShmYWxzZSksCisgICAgICAgICAgICBzdGFja190cmFjZV9kZXB0aChrTWF4U3RhY2tUcmFjZURlcHRoKSwKKyAgICAgICAgICAgIHN0cmVhbV9yZXN1bHRfdG8oIiIpLAorICAgICAgICAgICAgdGhyb3dfb25fZmFpbHVyZShmYWxzZSkge30KKworICAvLyBGYWN0b3J5IG1ldGhvZHMuCisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgQWxzb1J1bkRpc2FibGVkVGVzdHMoYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzID0gYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBCcmVha09uRmFpbHVyZShib29sIGJyZWFrX29uX2ZhaWx1cmUpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5icmVha19vbl9mYWlsdXJlID0gYnJlYWtfb25fZmFpbHVyZTsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb25zIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIENhdGNoRXhjZXB0aW9ucyhib29sIGNhdGNoX2V4Y2VwdGlvbnMpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5jYXRjaF9leGNlcHRpb25zID0gY2F0Y2hfZXhjZXB0aW9uczsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9kZWF0aF90ZXN0X3VzZV9mb3JrIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIERlYXRoVGVzdFVzZUZvcmsoYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuZGVhdGhfdGVzdF91c2VfZm9yayA9IGRlYXRoX3Rlc3RfdXNlX2Zvcms7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfZmlsdGVyIGZsYWcgaGFzIHRoZSBnaXZlbgorICAvLyB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIEZpbHRlcihjb25zdCBjaGFyKiBmaWx0ZXIpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5maWx0ZXIgPSBmaWx0ZXI7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIGhhcyB0aGUKKyAgLy8gZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBMaXN0VGVzdHMoYm9vbCBsaXN0X3Rlc3RzKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MubGlzdF90ZXN0cyA9IGxpc3RfdGVzdHM7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcgaGFzIHRoZSBnaXZlbgorICAvLyB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIE91dHB1dChjb25zdCBjaGFyKiBvdXRwdXQpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5vdXRwdXQgPSBvdXRwdXQ7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfcHJpbnRfdGltZSBmbGFnIGhhcyB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBQcmludFRpbWUoYm9vbCBwcmludF90aW1lKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MucHJpbnRfdGltZSA9IHByaW50X3RpbWU7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfcmFuZG9tX3NlZWQgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgUmFuZG9tU2VlZChJbnQzMiByYW5kb21fc2VlZCkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnJhbmRvbV9zZWVkID0gcmFuZG9tX3NlZWQ7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfcmVwZWF0IGZsYWcgaGFzIHRoZSBnaXZlbgorICAvLyB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFJlcGVhdChJbnQzMiByZXBlYXQpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5yZXBlYXQgPSByZXBlYXQ7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3Rfc2h1ZmZsZSBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBTaHVmZmxlKGJvb2wgc2h1ZmZsZSkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnNodWZmbGUgPSBzaHVmZmxlOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFN0YWNrVHJhY2VEZXB0aChJbnQzMiBzdGFja190cmFjZV9kZXB0aCkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnN0YWNrX3RyYWNlX2RlcHRoID0gc3RhY2tfdHJhY2VfZGVwdGg7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBTdHJlYW1SZXN1bHRUbyhjb25zdCBjaGFyKiBzdHJlYW1fcmVzdWx0X3RvKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3Muc3RyZWFtX3Jlc3VsdF90byA9IHN0cmVhbV9yZXN1bHRfdG87CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBUaHJvd09uRmFpbHVyZShib29sIHRocm93X29uX2ZhaWx1cmUpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy50aHJvd19vbl9mYWlsdXJlID0gdGhyb3dfb25fZmFpbHVyZTsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBUaGVzZSBmaWVsZHMgc3RvcmUgdGhlIGZsYWcgdmFsdWVzLgorICBib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzOworICBib29sIGJyZWFrX29uX2ZhaWx1cmU7CisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uczsKKyAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrOworICBjb25zdCBjaGFyKiBmaWx0ZXI7CisgIGJvb2wgbGlzdF90ZXN0czsKKyAgY29uc3QgY2hhciogb3V0cHV0OworICBib29sIHByaW50X3RpbWU7CisgIEludDMyIHJhbmRvbV9zZWVkOworICBJbnQzMiByZXBlYXQ7CisgIGJvb2wgc2h1ZmZsZTsKKyAgSW50MzIgc3RhY2tfdHJhY2VfZGVwdGg7CisgIGNvbnN0IGNoYXIqIHN0cmVhbV9yZXN1bHRfdG87CisgIGJvb2wgdGhyb3dfb25fZmFpbHVyZTsKK307CisKKy8vIEZpeHR1cmUgZm9yIHRlc3RpbmcgSW5pdEdvb2dsZVRlc3QoKS4KK2NsYXNzIEluaXRHb29nbGVUZXN0VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIENsZWFycyB0aGUgZmxhZ3MgYmVmb3JlIGVhY2ggdGVzdC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gIiI7CisgICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICIiOworICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSB0cnVlOworICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gMDsKKyAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSAxOworICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IGtNYXhTdGFja1RyYWNlRGVwdGg7CisgICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSA9ICIiOworICAgIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSBmYWxzZTsKKyAgfQorCisgIC8vIEFzc2VydHMgdGhhdCB0d28gbmFycm93IG9yIHdpZGUgc3RyaW5nIGFycmF5cyBhcmUgZXF1YWwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KKyAgc3RhdGljIHZvaWQgQXNzZXJ0U3RyaW5nQXJyYXlFcShzaXplX3Qgc2l6ZTEsIENoYXJUeXBlKiogYXJyYXkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplMiwgQ2hhclR5cGUqKiBhcnJheTIpIHsKKyAgICBBU1NFUlRfRVEoc2l6ZTEsIHNpemUyKSA8PCAiIEFycmF5IHNpemVzIGRpZmZlcmVudC4iOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc2l6ZTE7IGkrKykgeworICAgICAgQVNTRVJUX1NUUkVRKGFycmF5MVtpXSwgYXJyYXkyW2ldKSA8PCAiIHdoZXJlIGkgPT0gIiA8PCBpOworICAgIH0KKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGZsYWcgdmFsdWVzIG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZXMuCisgIHN0YXRpYyB2b2lkIENoZWNrRmxhZ3MoY29uc3QgRmxhZ3MmIGV4cGVjdGVkKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLmFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzLAorICAgICAgICAgICAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLmJyZWFrX29uX2ZhaWx1cmUsIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5jYXRjaF9leGNlcHRpb25zLCBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuZGVhdGhfdGVzdF91c2VfZm9yaywgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLmZpbHRlciwgR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5saXN0X3Rlc3RzLCBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKTsKKyAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQub3V0cHV0LCBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnByaW50X3RpbWUsIEdURVNUX0ZMQUcocHJpbnRfdGltZSkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5yYW5kb21fc2VlZCwgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5yZXBlYXQsIEdURVNUX0ZMQUcocmVwZWF0KSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnNodWZmbGUsIEdURVNUX0ZMQUcoc2h1ZmZsZSkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5zdGFja190cmFjZV9kZXB0aCwgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5zdHJlYW1fcmVzdWx0X3RvLAorICAgICAgICAgICAgICAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC50aHJvd19vbl9mYWlsdXJlLCBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKTsKKyAgfQorCisgIC8vIFBhcnNlcyBhIGNvbW1hbmQgbGluZSAoc3BlY2lmaWVkIGJ5IGFyZ2MxIGFuZCBhcmd2MSksIHRoZW4KKyAgLy8gdmVyaWZpZXMgdGhhdCB0aGUgZmxhZyB2YWx1ZXMgYXJlIGV4cGVjdGVkIGFuZCB0aGF0IHRoZQorICAvLyByZWNvZ25pemVkIGZsYWdzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgorICBzdGF0aWMgdm9pZCBUZXN0UGFyc2luZ0ZsYWdzKGludCBhcmdjMSwgY29uc3QgQ2hhclR5cGUqKiBhcmd2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYzIsIGNvbnN0IENoYXJUeXBlKiogYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxhZ3MmIGV4cGVjdGVkLCBib29sIHNob3VsZF9wcmludF9oZWxwKSB7CisgICAgY29uc3QgYm9vbCBzYXZlZF9oZWxwX2ZsYWcgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpnX2hlbHBfZmxhZzsKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpnX2hlbHBfZmxhZyA9IGZhbHNlOworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorICAgIENhcHR1cmVTdGRvdXQoKTsKKyNlbmRpZgorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUuCisgICAgaW50ZXJuYWw6OlBhcnNlR29vZ2xlVGVzdEZsYWdzT25seSgmYXJnYzEsIGNvbnN0X2Nhc3Q8Q2hhclR5cGUqKj4oYXJndjEpKTsKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjYXB0dXJlZF9zdGRvdXQgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOworI2VuZGlmCisKKyAgICAvLyBWZXJpZmllcyB0aGUgZmxhZyB2YWx1ZXMuCisgICAgQ2hlY2tGbGFncyhleHBlY3RlZCk7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSByZWNvZ25pemVkIGZsYWdzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbW1hbmQKKyAgICAvLyBsaW5lLgorICAgIEFzc2VydFN0cmluZ0FycmF5RXEoYXJnYzEgKyAxLCBhcmd2MSwgYXJnYzIgKyAxLCBhcmd2Mik7CisKKyAgICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkgc2hvdWxkIG5laXRoZXIgc2V0IGdfaGVscF9mbGFnIG5vciBwcmludCB0aGUKKyAgICAvLyBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBmbGFncyBpdCByZWNvZ25pemVzLgorICAgIEVYUEVDVF9FUShzaG91bGRfcHJpbnRfaGVscCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Z19oZWxwX2ZsYWcpOworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IGV4cGVjdGVkX2hlbHBfZnJhZ21lbnQgPQorICAgICAgICAiVGhpcyBwcm9ncmFtIGNvbnRhaW5zIHRlc3RzIHdyaXR0ZW4gdXNpbmciOworICAgIGlmIChzaG91bGRfcHJpbnRfaGVscCkgeworICAgICAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgZXhwZWN0ZWRfaGVscF9mcmFnbWVudCwgY2FwdHVyZWRfc3Rkb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgRVhQRUNUX1BSRURfRk9STUFUMihJc05vdFN1YnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaGVscF9mcmFnbWVudCwgY2FwdHVyZWRfc3Rkb3V0KTsKKyAgICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OmdfaGVscF9mbGFnID0gc2F2ZWRfaGVscF9mbGFnOworICB9CisKKyAgLy8gVGhpcyBtYWNybyB3cmFwcyBUZXN0UGFyc2luZ0ZsYWdzIHMudC4gdGhlIHVzZXIgZG9lc24ndCBuZWVkCisgIC8vIHRvIHNwZWNpZnkgdGhlIGFycmF5IHNpemVzLgorCisjZGVmaW5lIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndjEsIGFyZ3YyLCBleHBlY3RlZCwgc2hvdWxkX3ByaW50X2hlbHApIFwKKyAgVGVzdFBhcnNpbmdGbGFncyhzaXplb2YoYXJndjEpL3NpemVvZigqYXJndjEpIC0gMSwgYXJndjEsIFwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoYXJndjIpL3NpemVvZigqYXJndjIpIC0gMSwgYXJndjIsIFwKKyAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgc2hvdWxkX3ByaW50X2hlbHApCit9OworCisvLyBUZXN0cyBwYXJzaW5nIGFuIGVtcHR5IGNvbW1hbmQgbGluZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEVtcHR5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3MoKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIGEgY29tbWFuZCBsaW5lIHRoYXQgaGFzIG5vIGZsYWcuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBOb0ZsYWcpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzKCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIGJhZCAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyQmFkKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiIiksIHRydWUpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIGFuIGVtcHR5IC0tZ3Rlc3RfZmlsdGVyIGZsYWcuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBGaWx0ZXJFbXB0eSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2ZpbHRlcj0iLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiIiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIG5vbi1lbXB0eSAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyTm9uRW1wdHkpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9maWx0ZXI9YWJjIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoImFiYyIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVXaXRob3V0VmFsdWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKKyAgICBOVUxMCit9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MC4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlRmFsc2VfMCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPWYuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBCcmVha09uRmFpbHVyZUZhbHNlX2YpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPWYiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkJyZWFrT25GYWlsdXJlKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1GLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVGYWxzZV9GKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1GIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCisvLyBkZWZpbml0aW9uLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVUcnVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT0xIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucy4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIENhdGNoRXhjZXB0aW9ucykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkNhdGNoRXhjZXB0aW9ucyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfZGVhdGhfdGVzdF91c2VfZm9yay4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIERlYXRoVGVzdFVzZUZvcmspIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9kZWF0aF90ZXN0X3VzZV9mb3JrIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpEZWF0aFRlc3RVc2VGb3JrKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyB0aGUgc2FtZSBmbGFnIHR3aWNlIHdpdGggZGlmZmVyZW50IHZhbHVlcy4gIFRoZQorLy8gZXhwZWN0ZWQgYmVoYXZpb3IgaXMgdGhhdCB0aGUgb25lIGNvbWluZyBsYXN0IHRha2VzIHByZWNlZGVuY2UuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBEdXBsaWNhdGVkRmxhZ3MpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9maWx0ZXI9YSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyPWIiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiYiIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhbiB1bnJlY29nbml6ZWQgZmxhZyBvbiB0aGUgY29tbWFuZCBsaW5lLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVW5yZWNvZ25pemVkRmxhZykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUiLAorICAgICJiYXIiLCAgLy8gVW5yZWNvZ25pemVkIGJ5IEdvb2dsZSBUZXN0LgorICAgICItLWd0ZXN0X2ZpbHRlcj1iIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgImJhciIsCisgICAgTlVMTAorICB9OworCisgIEZsYWdzIGZsYWdzOworICBmbGFncy5icmVha19vbl9mYWlsdXJlID0gdHJ1ZTsKKyAgZmxhZ3MuZmlsdGVyID0gImIiOworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBmbGFncywgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZworVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmxhZykgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2xpc3RfdGVzdHMiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdpdGggYSAidHJ1ZSIgdmFsdWUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIExpc3RUZXN0c1RydWUpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9saXN0X3Rlc3RzPTEiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdpdGggYSAiZmFsc2UiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2xpc3RfdGVzdHM9MCIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9saXN0X3Rlc3RzPWYuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZV9mKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz1mIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9saXN0X3Rlc3RzPUYuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZV9GKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz1GIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQgKGludmFsaWQpLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0RW1wdHkpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFncygpLCB0cnVlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X291dHB1dD14bWwKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dFhtbCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X291dHB1dD14bWwiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Ok91dHB1dCgieG1sIiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X291dHB1dD14bWw6ZmlsZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0WG1sRmlsZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X291dHB1dD14bWw6ZmlsZSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6T3V0cHV0KCJ4bWw6ZmlsZSIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQ9eG1sOmRpcmVjdG9yeS9wYXRoLworVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0WG1sRGlyZWN0b3J5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfb3V0cHV0PXhtbDpkaXJlY3RvcnkvcGF0aC8iLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6T3V0cHV0KCJ4bWw6ZGlyZWN0b3J5L3BhdGgvIiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9wcmludF90aW1lIGZsYWcKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZsYWcpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9wcmludF90aW1lIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X3ByaW50X3RpbWUgZmxhZyB3aXRoIGEgInRydWUiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBQcmludFRpbWVUcnVlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfcHJpbnRfdGltZT0xIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X3ByaW50X3RpbWUgZmxhZyB3aXRoIGEgImZhbHNlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2UpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9wcmludF90aW1lPTAiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcHJpbnRfdGltZT1mLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2VfZikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3ByaW50X3RpbWU9ZiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcHJpbnRfdGltZT1GLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2VfRikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3ByaW50X3RpbWU9RiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcmFuZG9tX3NlZWQ9bnVtYmVyCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBSYW5kb21TZWVkKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfcmFuZG9tX3NlZWQ9MTAwMCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UmFuZG9tU2VlZCgxMDAwKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcmVwZWF0PW51bWJlcgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUmVwZWF0KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfcmVwZWF0PTEwMDAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlJlcGVhdCgxMDAwKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEFsc29SdW5EaXNhYmxlZFRlc3RzRmxhZykgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOjpBbHNvUnVuRGlzYWJsZWRUZXN0cyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgd2l0aCBhICJ0cnVlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQWxzb1J1bkRpc2FibGVkVGVzdHNUcnVlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM9MSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHModHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIHdpdGggYSAiZmFsc2UiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBBbHNvUnVuRGlzYWJsZWRUZXN0c0ZhbHNlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM9MCIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHMoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zaHVmZmxlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZVdpdGhvdXRWYWx1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3NodWZmbGUiLAorICAgIE5VTEwKK307CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpTaHVmZmxlKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zaHVmZmxlPTAuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTaHVmZmxlRmFsc2VfMCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3NodWZmbGU9MCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6U2h1ZmZsZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3Rfc2h1ZmZsZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCisvLyBkZWZpbml0aW9uLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZVRydWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zaHVmZmxlPTEiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlNodWZmbGUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoPW51bWJlci4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFN0YWNrVHJhY2VEZXB0aCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoPTUiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlN0YWNrVHJhY2VEZXB0aCg1KSwgZmFsc2UpOworfQorCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTdHJlYW1SZXN1bHRUbykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3N0cmVhbV9yZXN1bHRfdG89bG9jYWxob3N0OjEyMzQiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXygKKyAgICAgIGFyZ3YsIGFyZ3YyLCBGbGFnczo6U3RyZWFtUmVzdWx0VG8oImxvY2FsaG9zdDoxMjM0IiksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBUaHJvd09uRmFpbHVyZVdpdGhvdXRWYWx1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUiLAorICAgIE5VTEwKK307CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0wLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVGYWxzZV8wKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0wIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCisvLyBkZWZpbml0aW9uLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVUcnVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0xIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gVGVzdHMgcGFyc2luZyB3aWRlIHN0cmluZ3MuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBXaWRlU3RyaW5ncykgeworICBjb25zdCB3Y2hhcl90KiBhcmd2W10gPSB7CisgICAgTCJmb28uZXhlIiwKKyAgICBMIi0tZ3Rlc3RfZmlsdGVyPUZvbyoiLAorICAgIEwiLS1ndGVzdF9saXN0X3Rlc3RzPTEiLAorICAgIEwiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKKyAgICBMIi0tbm9uX2d0ZXN0X2ZsYWciLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCB3Y2hhcl90KiBhcmd2MltdID0geworICAgIEwiZm9vLmV4ZSIsCisgICAgTCItLW5vbl9ndGVzdF9mbGFnIiwKKyAgICBOVUxMCisgIH07CisKKyAgRmxhZ3MgZXhwZWN0ZWRfZmxhZ3M7CisgIGV4cGVjdGVkX2ZsYWdzLmJyZWFrX29uX2ZhaWx1cmUgPSB0cnVlOworICBleHBlY3RlZF9mbGFncy5maWx0ZXIgPSAiRm9vKiI7CisgIGV4cGVjdGVkX2ZsYWdzLmxpc3RfdGVzdHMgPSB0cnVlOworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIGV4cGVjdGVkX2ZsYWdzLCBmYWxzZSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgY3VycmVudF90ZXN0X2luZm8oKSBpbiBVbml0VGVzdC4KK2NsYXNzIEN1cnJlbnRUZXN0SW5mb1Rlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBOVUxMIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbgorICAvLyB0aGUgdGVzdCBjYXNlIGlzIHJ1bi4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gdGVzdHMgcnVubmluZyBhdCB0aGlzIHBvaW50LgorICAgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9pbmZvID09IE5VTEwpCisgICAgICAgIDw8ICJUaGVyZSBzaG91bGQgYmUgbm8gdGVzdHMgcnVubmluZyBhdCB0aGlzIHBvaW50LiI7CisgIH0KKworICAvLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBOVUxMIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4KKyAgLy8gdGhlIHRlc3QgY2FzZSBoYXMgcnVuLgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9pbmZvID09IE5VTEwpCisgICAgICAgIDw8ICJUaGVyZSBzaG91bGQgYmUgbm8gdGVzdHMgcnVubmluZyBhdCB0aGlzIHBvaW50LiI7CisgIH0KK307CisKKy8vIFRlc3RzIHRoYXQgY3VycmVudF90ZXN0X2luZm8oKSByZXR1cm5zIFRlc3RJbmZvIGZvciBjdXJyZW50bHkgcnVubmluZworLy8gdGVzdCBieSBjaGVja2luZyB0aGUgZXhwZWN0ZWQgdGVzdCBuYW1lIGFnYWluc3QgdGhlIGFjdHVhbCBvbmUuCitURVNUX0YoQ3VycmVudFRlc3RJbmZvVGVzdCwgV29ya3NGb3JGaXJzdFRlc3RJbkFUZXN0Q2FzZSkgeworICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KKyAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSB0ZXN0X2luZm8pCisgICAgICA8PCAiVGhlcmUgaXMgYSB0ZXN0IHJ1bm5pbmcgc28gd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBUZXN0SW5mby4iOworICBFWFBFQ1RfU1RSRVEoIkN1cnJlbnRUZXN0SW5mb1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpCisgICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QgY2FzZS4iOworICBFWFBFQ1RfU1RSRVEoIldvcmtzRm9yRmlyc3RUZXN0SW5BVGVzdENhc2UiLCB0ZXN0X2luZm8tPm5hbWUoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4iOworfQorCisvLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBUZXN0SW5mbyBmb3IgY3VycmVudGx5IHJ1bm5pbmcKKy8vIHRlc3QgYnkgY2hlY2tpbmcgdGhlIGV4cGVjdGVkIHRlc3QgbmFtZSBhZ2FpbnN0IHRoZSBhY3R1YWwgb25lLiAgV2UKKy8vIHVzZSB0aGlzIHRlc3QgdG8gc2VlIHRoYXQgdGhlIFRlc3RJbmZvIG9iamVjdCBhY3R1YWxseSBjaGFuZ2VkIGZyb20KKy8vIHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uLgorVEVTVF9GKEN1cnJlbnRUZXN0SW5mb1Rlc3QsIFdvcmtzRm9yU2Vjb25kVGVzdEluQVRlc3RDYXNlKSB7CisgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPQorICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHRlc3RfaW5mbykKKyAgICAgIDw8ICJUaGVyZSBpcyBhIHRlc3QgcnVubmluZyBzbyB3ZSBzaG91bGQgaGF2ZSBhIHZhbGlkIFRlc3RJbmZvLiI7CisgIEVYUEVDVF9TVFJFUSgiQ3VycmVudFRlc3RJbmZvVGVzdCIsIHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdCBjYXNlLiI7CisgIEVYUEVDVF9TVFJFUSgiV29ya3NGb3JTZWNvbmRUZXN0SW5BVGVzdENhc2UiLCB0ZXN0X2luZm8tPm5hbWUoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4iOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBUaGVzZSB0d28gbGluZXMgdGVzdCB0aGF0IHdlIGNhbiBkZWZpbmUgdGVzdHMgaW4gYSBuYW1lc3BhY2UgdGhhdAorLy8gaGFzIHRoZSBuYW1lICJ0ZXN0aW5nIiBhbmQgaXMgbmVzdGVkIGluIGFub3RoZXIgbmFtZXNwYWNlLgorbmFtZXNwYWNlIG15X25hbWVzcGFjZSB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIE1ha2VzIHN1cmUgdGhhdCBURVNUIGtub3dzIHRvIHVzZSA6OnRlc3Rpbmc6OlRlc3QgaW5zdGVhZCBvZgorLy8gOjpteV9uYW1lc3BhY2U6OnRlc3Rpbmc6OlRlc3QuCitjbGFzcyBUZXN0IHt9OworCisvLyBNYWtlcyBzdXJlIHRoYXQgYW4gYXNzZXJ0aW9uIGtub3dzIHRvIHVzZSA6OnRlc3Rpbmc6Ok1lc3NhZ2UgaW5zdGVhZCBvZgorLy8gOjpteV9uYW1lc3BhY2U6OnRlc3Rpbmc6Ok1lc3NhZ2UuCitjbGFzcyBNZXNzYWdlIHt9OworCisvLyBNYWtlcyBzdXJlIHRoYXQgYW4gYXNzZXJ0aW9uIGtub3dzIHRvIHVzZQorLy8gOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgaW5zdGVhZCBvZgorLy8gOjpteV9uYW1lc3BhY2U6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdC4KK2NsYXNzIEFzc2VydGlvblJlc3VsdCB7fTsKKworLy8gVGVzdHMgdGhhdCBhbiBhc3NlcnRpb24gdGhhdCBzaG91bGQgc3VjY2VlZCB3b3JrcyBhcyBleHBlY3RlZC4KK1RFU1QoTmVzdGVkVGVzdGluZ05hbWVzcGFjZVRlc3QsIFN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW4gYXNzZXJ0aW9uIHRoYXQgc2hvdWxkIGZhaWwgd29ya3MgYXMgZXhwZWN0ZWQuCitURVNUKE5lc3RlZFRlc3RpbmdOYW1lc3BhY2VUZXN0LCBGYWlsdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgbXlfbmFtZXNwYWNlCisKKy8vIFRlc3RzIHRoYXQgb25lIGNhbiBjYWxsIHN1cGVyY2xhc3MgU2V0VXAgYW5kIFRlYXJEb3duIG1ldGhvZHMtLQorLy8gdGhhdCBpcywgdGhhdCB0aGV5IGFyZSBub3QgcHJpdmF0ZS4KKy8vIE5vIHRlc3RzIGFyZSBiYXNlZCBvbiB0aGlzIGZpeHR1cmU7IHRoZSB0ZXN0ICJwYXNzZXMiIGlmIGl0IGNvbXBpbGVzCisvLyBzdWNjZXNzZnVsbHkuCitjbGFzcyBQcm90ZWN0ZWRGaXh0dXJlTWV0aG9kc1Rlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgVGVzdDo6U2V0VXAoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgVGVzdDo6VGVhckRvd24oKTsKKyAgfQorfTsKKworLy8gU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QgdGVzdHMgdGhlIHN0cmVhbWluZyB2ZXJzaW9ucyBvZiBhIHJlcHJlc2VudGF0aXZlCisvLyBzYW1wbGUgb2YgYXNzZXJ0aW9ucy4KK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFVuY29uZGl0aW9uYWwpIHsKKyAgU1VDQ0VFRCgpIDw8ICJleHBlY3RlZCBzdWNjZXNzIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQUREX0ZBSUxVUkUoKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwgIlVucmVhY2hhYmxlIGNvZGUiCisjIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MgLXctcmNoCisjZW5kaWYKKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgVHJ1dGgpIHsKKyAgRVhQRUNUX1RSVUUodHJ1ZSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9UUlVFKHRydWUpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShmYWxzZSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShmYWxzZSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBUcnV0aDIpIHsKKyAgRVhQRUNUX0ZBTFNFKGZhbHNlKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0ZBTFNFKGZhbHNlKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKHRydWUpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKHRydWUpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHJlc3NlZCB0aGVtCisjIHByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgSW50ZWdlckVxdWFscykgeworICBFWFBFQ1RfRVEoMSwgMSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9FUSgxLCAxKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDEsIDIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKDEsIDIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgSW50ZWdlckxlc3NUaGFuKSB7CisgIEVYUEVDVF9MVCgxLCAyKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0xUKDEsIDIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoMiwgMSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTFQoMiwgMSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBTdHJpbmdzRXF1YWwpIHsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLCAiZm9vIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9TVFJFUSgiZm9vIiwgImZvbyIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJFUSgiZm9vIiwgImJhciIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgU3RyaW5nc05vdEVxdWFsKSB7CisgIEVYUEVDVF9TVFJORSgiZm9vIiwgImJhciIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfU1RSTkUoImZvbyIsICJiYXIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKCJmb28iLCAiZm9vIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSTkUoImZvbyIsICJmb28iKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFN0cmluZ3NFcXVhbElnbm9yaW5nQ2FzZSkgeworICBFWFBFQ1RfU1RSQ0FTRUVRKCJmb28iLCAiRk9PIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9TVFJDQVNFRVEoImZvbyIsICJGT08iKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VFUSgiZm9vIiwgImJhciIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkNBU0VFUSgiZm9vIiwgImJhciIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgU3RyaW5nTm90RXF1YWxJZ25vcmluZ0Nhc2UpIHsKKyAgRVhQRUNUX1NUUkNBU0VORSgiZm9vIiwgImJhciIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfU1RSQ0FTRU5FKCJmb28iLCAiYmFyIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJDQVNFTkUoImZvbyIsICJGT08iKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFTkUoImJhciIsICJCQVIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEZsb2F0aW5nUG9pbnRFcXVhbHMpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgMS4wKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0ZMT0FUX0VRKDEuMCwgMS4wKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKDAuMCwgMS4wKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GTE9BVF9FUSgwLjAsIDEuMCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgVGhyb3cpIHsKKyAgRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBOb1Rocm93KSB7CisgIEVYUEVDVF9OT19USFJPVyhUaHJvd05vdGhpbmcoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9OT19USFJPVyhUaHJvd05vdGhpbmcoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyhUaHJvd0FuSW50ZWdlcigpKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9OT19USFJPVyhUaHJvd0FuSW50ZWdlcigpKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEFueVRocm93KSB7CisgIEVYUEVDVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0FOWV9USFJPVyhUaHJvd05vdGhpbmcoKSkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgY29ycmVjdGx5IGRlY2lkZXMgd2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuR1Rlc3RDb2xvckZsYWdJc1llcykgeworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJ5ZXMiOworCisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KK30KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc0NvbG9yc1doZW5HVGVzdENvbG9yRmxhZ0lzQWxpYXNPZlllcykgeworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorCisgIEdURVNUX0ZMQUcoY29sb3IpID0gIlRydWUiOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KKworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJ0IjsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiMSI7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorfQorCitURVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzTm9Db2xvcldoZW5HVGVzdENvbG9yRmxhZ0lzTm8pIHsKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAibm8iOworCisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCit9CisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNOb0NvbG9yV2hlbkdUZXN0Q29sb3JGbGFnSXNJbnZhbGlkKSB7CisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiRiI7CisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiMCI7CisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAidW5rbm93biI7CisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCit9CisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuU3Rkb3V0SXNUdHkpIHsKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiYXV0byI7CisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAgIC8vIFN0ZG91dCBpcyBhIFRUWS4KK30KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc0NvbG9yc1doZW5UZXJtU3VwcG9ydHNDb2xvcnMpIHsKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiYXV0byI7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIE9uIFdpbmRvd3MsIHdlIGlnbm9yZSB0aGUgVEVSTSB2YXJpYWJsZSBhcyBpdCdzIHVzdWFsbHkgbm90IHNldC4KKworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgIiIpOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKyNlbHNlCisgIC8vIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcywgd2UgcmVseSBvbiBURVJNIHRvIGRldGVybWluZSBpZiB0aGUKKyAgLy8gdGVybWluYWwgc3VwcG9ydHMgY29sb3JzLgorCisgIFNldEVudigiVEVSTSIsICJkdW1iIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgImVtYWNzIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInZ0MTAwIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtLW1vbm8iKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtLWNvbG9yIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJ4dGVybS0yNTZjb2xvciIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAic2NyZWVuIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJsaW51eCIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiY3lnd2luIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKy8vIFZlcmlmaWVzIHRoYXQgU3RhdGljQXNzZXJ0VHlwZUVxIHdvcmtzIGluIGEgbmFtZXNwYWNlIHNjb3BlLgorCitzdGF0aWMgYm9vbCBkdW1teTEgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBTdGF0aWNBc3NlcnRUeXBlRXE8Ym9vbCwgYm9vbD4oKTsKK3N0YXRpYyBib29sIGR1bW15MiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9CisgICAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IGludCwgY29uc3QgaW50PigpOworCisvLyBWZXJpZmllcyB0aGF0IFN0YXRpY0Fzc2VydFR5cGVFcSB3b3JrcyBpbiBhIGNsYXNzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFN0YXRpY0Fzc2VydFR5cGVFcVRlc3RIZWxwZXIgeworIHB1YmxpYzoKKyAgU3RhdGljQXNzZXJ0VHlwZUVxVGVzdEhlbHBlcigpIHsgU3RhdGljQXNzZXJ0VHlwZUVxPGJvb2wsIFQ+KCk7IH0KK307CisKK1RFU1QoU3RhdGljQXNzZXJ0VHlwZUVxVGVzdCwgV29ya3NJbkNsYXNzKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcVRlc3RIZWxwZXI8Ym9vbD4oKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBTdGF0aWNBc3NlcnRUeXBlRXEgd29ya3MgaW5zaWRlIGEgZnVuY3Rpb24uCisKK3R5cGVkZWYgaW50IEludEFsaWFzOworCitURVNUKFN0YXRpY0Fzc2VydFR5cGVFcVRlc3QsIENvbXBpbGVzRm9yRXF1YWxUeXBlcykgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBJbnRBbGlhcz4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCosIEludEFsaWFzKj4oKTsKK30KKworVEVTVChHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wVGVzdCwgUmV0dXJuc1RoZVN0YWNrVHJhY2UpIHsKKyAgdGVzdGluZzo6VW5pdFRlc3QqIGNvbnN0IHVuaXRfdGVzdCA9IHRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgIC8vIFdlIGRvbid0IGhhdmUgYSBzdGFjayB3YWxrZXIgaW4gR29vZ2xlIFRlc3QgeWV0LgorICBFWFBFQ1RfU1RSRVEoIiIsIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AodW5pdF90ZXN0LCAwKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKHVuaXRfdGVzdCwgMSkuY19zdHIoKSk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRoZXJlSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBTFNFKEhhc05vbmZhdGFsRmFpbHVyZSgpKTsKK30KKworc3RhdGljIHZvaWQgRmFpbEZhdGFsbHkoKSB7IEZBSUwoKTsgfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5UaGVyZUlzT25seUZhdGFsRmFpbHVyZSkgeworICBGYWlsRmF0YWxseSgpOworICBjb25zdCBib29sIGhhc19ub25mYXRhbF9mYWlsdXJlID0gSGFzTm9uZmF0YWxGYWlsdXJlKCk7CisgIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOworICBFWFBFQ1RfRkFMU0UoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlSXNOb25mYXRhbEZhaWx1cmUpIHsKKyAgQUREX0ZBSUxVUkUoKTsKKyAgY29uc3QgYm9vbCBoYXNfbm9uZmF0YWxfZmFpbHVyZSA9IEhhc05vbmZhdGFsRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlQXJlRmF0YWxBbmROb25mYXRhbEZhaWx1cmVzKSB7CisgIEZhaWxGYXRhbGx5KCk7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmUoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKK30KKworLy8gQSB3cmFwcGVyIGZvciBjYWxsaW5nIEhhc05vbmZhdGFsRmFpbHVyZSBvdXRzaWRlIG9mIGEgdGVzdCBib2R5Lgorc3RhdGljIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlSGVscGVyKCkgeworICByZXR1cm4gdGVzdGluZzo6VGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgV29ya3NPdXRzaWRlT2ZUZXN0Qm9keSkgeworICBFWFBFQ1RfRkFMU0UoSGFzTm9uZmF0YWxGYWlsdXJlSGVscGVyKCkpOworfQorCitURVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFdvcmtzT3V0c2lkZU9mVGVzdEJvZHkyKSB7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKK30KKworVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRoZXJlSXNOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBTFNFKEhhc0ZhaWx1cmUoKSk7Cit9CisKK1RFU1QoSGFzRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlSXNGYXRhbEZhaWx1cmUpIHsKKyAgRmFpbEZhdGFsbHkoKTsKKyAgY29uc3QgYm9vbCBoYXNfZmFpbHVyZSA9IEhhc0ZhaWx1cmUoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9UUlVFKGhhc19mYWlsdXJlKTsKK30KKworVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuVGhlcmVJc05vbmZhdGFsRmFpbHVyZSkgeworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5UaGVyZUFyZUZhdGFsQW5kTm9uZmF0YWxGYWlsdXJlcykgeworICBGYWlsRmF0YWxseSgpOworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCisvLyBBIHdyYXBwZXIgZm9yIGNhbGxpbmcgSGFzRmFpbHVyZSBvdXRzaWRlIG9mIGEgdGVzdCBib2R5Lgorc3RhdGljIGJvb2wgSGFzRmFpbHVyZUhlbHBlcigpIHsgcmV0dXJuIHRlc3Rpbmc6OlRlc3Q6Okhhc0ZhaWx1cmUoKTsgfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5KSB7CisgIEVYUEVDVF9GQUxTRShIYXNGYWlsdXJlSGVscGVyKCkpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5MikgeworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZUhlbHBlcigpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCitjbGFzcyBUZXN0TGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBUZXN0TGlzdGVuZXIoKSA6IG9uX3N0YXJ0X2NvdW50ZXJfKE5VTEwpLCBpc19kZXN0cm95ZWRfKE5VTEwpIHt9CisgIFRlc3RMaXN0ZW5lcihpbnQqIG9uX3N0YXJ0X2NvdW50ZXIsIGJvb2wqIGlzX2Rlc3Ryb3llZCkKKyAgICAgIDogb25fc3RhcnRfY291bnRlcl8ob25fc3RhcnRfY291bnRlciksCisgICAgICAgIGlzX2Rlc3Ryb3llZF8oaXNfZGVzdHJveWVkKSB7fQorCisgIHZpcnR1YWwgflRlc3RMaXN0ZW5lcigpIHsKKyAgICBpZiAoaXNfZGVzdHJveWVkXykKKyAgICAgICppc19kZXN0cm95ZWRfID0gdHJ1ZTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgaWYgKG9uX3N0YXJ0X2NvdW50ZXJfICE9IE5VTEwpCisgICAgICAoKm9uX3N0YXJ0X2NvdW50ZXJfKSsrOworICB9CisKKyBwcml2YXRlOgorICBpbnQqIG9uX3N0YXJ0X2NvdW50ZXJfOworICBib29sKiBpc19kZXN0cm95ZWRfOworfTsKKworLy8gVGVzdHMgdGhlIGNvbnN0cnVjdG9yLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBDb25zdHJ1Y3Rpb25Xb3JrcykgeworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworCisgIEVYUEVDVF9UUlVFKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKSAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpID09IE5VTEwpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBUZXN0RXZlbnRMaXN0ZW5lcnMgZGVzdHJ1Y3RvciBkZWxldGVzIGFsbCB0aGUgbGlzdGVuZXJzIGl0CisvLyBvd25zLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBEZXN0cnVjdGlvbldvcmtzKSB7CisgIGJvb2wgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl9pc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgYm9vbCBkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBib29sIGV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBUZXN0TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgPSBuZXcgVGVzdExpc3RlbmVyKAorICAgICAgTlVMTCwgJmRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfaXNfZGVzdHJveWVkKTsKKyAgVGVzdExpc3RlbmVyKiBkZWZhdWx0X3htbF9wcmludGVyID0gbmV3IFRlc3RMaXN0ZW5lcigKKyAgICAgIE5VTEwsICZkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7CisgIFRlc3RMaXN0ZW5lciogZXh0cmFfbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKAorICAgICAgTlVMTCwgJmV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCk7CisKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIpOworICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF94bWxfcHJpbnRlcik7CisgICAgbGlzdGVuZXJzLkFwcGVuZChleHRyYV9saXN0ZW5lcik7CisgIH0KKyAgRVhQRUNUX1RSVUUoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl9pc19kZXN0cm95ZWQpOworICBFWFBFQ1RfVFJVRShkZWZhdWx0X3htbF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7CisgIEVYUEVDVF9UUlVFKGV4dHJhX2xpc3RlbmVyX2lzX2Rlc3Ryb3llZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciBBcHBlbmQnZWQgdG8gYSBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdCBzdGFydHMKKy8vIHJlY2VpdmluZyBldmVudHMuCitURVNUKFRlc3RFdmVudExpc3RlbmVyc1Rlc3QsIEFwcGVuZCkgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgbGlzdGVuZXJzLkFwcGVuZChsaXN0ZW5lcik7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworICB9CisgIEVYUEVDVF9UUlVFKGlzX2Rlc3Ryb3llZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbGlzdGVuZXJzIHJlY2VpdmUgZXZlbnRzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYXBwZW5kZWQgdG8KKy8vIHRoZSBsaXN0LCBleGNlcHQgZm9yICpFbmQgcmVxdWVzdHMsIHdoaWNoIG11c3QgYmUgcmVjZWl2ZWQgaW4gdGhlIHJldmVyc2UKKy8vIG9yZGVyLgorY2xhc3MgU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHZlY3RvciwgY29uc3QgY2hhciogaWQpCisgICAgICA6IHZlY3Rvcl8odmVjdG9yKSwgaWRfKGlkKSB7fQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgdmVjdG9yXy0+cHVzaF9iYWNrKEdldEV2ZW50RGVzY3JpcHRpb24oIk9uVGVzdFByb2dyYW1TdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgICAgdmVjdG9yXy0+cHVzaF9iYWNrKEdldEV2ZW50RGVzY3JpcHRpb24oIk9uVGVzdFByb2dyYW1FbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICAgIHZlY3Rvcl8tPnB1c2hfYmFjayhHZXRFdmVudERlc2NyaXB0aW9uKCJPblRlc3RJdGVyYXRpb25TdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyAgICB2ZWN0b3JfLT5wdXNoX2JhY2soR2V0RXZlbnREZXNjcmlwdGlvbigiT25UZXN0SXRlcmF0aW9uRW5kIikpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBHZXRFdmVudERlc2NyaXB0aW9uKGNvbnN0IGNoYXIqIG1ldGhvZCkgeworICAgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlIDw8IGlkXyA8PCAiLiIgPDwgbWV0aG9kOworICAgIHJldHVybiBtZXNzYWdlLkdldFN0cmluZygpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB2ZWN0b3JfOworICBjb25zdCBjaGFyKiBjb25zdCBpZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcik7Cit9OworCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBBcHBlbmRLZWVwc09yZGVyKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2ZWM7CisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKCZ2ZWMsICIxc3QiKSk7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKCZ2ZWMsICIybmQiKSk7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKCZ2ZWMsICIzcmQiKSk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICBBU1NFUlRfRVEoM1UsIHZlYy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIjFzdC5PblRlc3RQcm9ncmFtU3RhcnQiLCB2ZWNbMF0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMm5kLk9uVGVzdFByb2dyYW1TdGFydCIsIHZlY1sxXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0UHJvZ3JhbVN0YXJ0IiwgdmVjWzJdLmNfc3RyKCkpOworCisgIHZlYy5jbGVhcigpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1FbmQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICBBU1NFUlRfRVEoM1UsIHZlYy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIjNyZC5PblRlc3RQcm9ncmFtRW5kIiwgdmVjWzBdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RQcm9ncmFtRW5kIiwgdmVjWzFdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjFzdC5PblRlc3RQcm9ncmFtRW5kIiwgdmVjWzJdLmNfc3RyKCkpOworCisgIHZlYy5jbGVhcigpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLCAwKTsKKyAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0SXRlcmF0aW9uU3RhcnQiLCB2ZWNbMF0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMm5kLk9uVGVzdEl0ZXJhdGlvblN0YXJ0IiwgdmVjWzFdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjNyZC5PblRlc3RJdGVyYXRpb25TdGFydCIsIHZlY1syXS5jX3N0cigpKTsKKworICB2ZWMuY2xlYXIoKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RJdGVyYXRpb25FbmQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCksIDApOworICBBU1NFUlRfRVEoM1UsIHZlYy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIjNyZC5PblRlc3RJdGVyYXRpb25FbmQiLCB2ZWNbMF0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMm5kLk9uVGVzdEl0ZXJhdGlvbkVuZCIsIHZlY1sxXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0SXRlcmF0aW9uRW5kIiwgdmVjWzJdLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbGlzdGVuZXIgcmVtb3ZlZCBmcm9tIGEgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3Qgc3RvcHMgcmVjZWl2aW5nCisvLyBldmVudHMgYW5kIGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxpc3QgaXMgZGVzdHJveWVkLgorVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBSZWxlYXNlKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgLy8gQWx0aG91Z2ggQXBwZW5kIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IHRvIHRoZSBsaXN0LAorICAvLyB0aGUgZm9sbG93aW5nIGNhbGxzIHJlbGVhc2UgaXQsIGFuZCB3ZSBuZWVkIHRvIGRlbGV0ZSBpdCBiZWZvcmUgdGhlCisgIC8vIHRlc3QgZW5kcy4KKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworICB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgICBsaXN0ZW5lcnMuQXBwZW5kKGxpc3RlbmVyKTsKKyAgICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSk7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXIpID09IE5VTEwpOworICB9CisgIEVYUEVDVF9FUSgwLCBvbl9zdGFydF9jb3VudGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2Rlc3Ryb3llZCk7CisgIGRlbGV0ZSBsaXN0ZW5lcjsKK30KKworLy8gVGVzdHMgdGhhdCBubyBldmVudHMgYXJlIGZvcndhcmRlZCB3aGVuIGV2ZW50IGZvcndhcmRpbmcgaXMgZGlzYWJsZWQuCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZykgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCBOVUxMKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICBsaXN0ZW5lcnMuQXBwZW5kKGxpc3RlbmVyKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQobGlzdGVuZXJzKSk7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygmbGlzdGVuZXJzKTsKKyAgQVNTRVJUX0ZBTFNFKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKGxpc3RlbmVycykpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgIEVYUEVDVF9FUSgwLCBvbl9zdGFydF9jb3VudGVyKTsKK30KKworLy8gVGVzdHMgdGhhdCBldmVudHMgZ2VuZXJhdGVkIGJ5IEdvb2dsZSBUZXN0IGFyZSBub3QgZm9yd2FyZGVkIGluCisvLyBkZWF0aCB0ZXN0IHN1YnByb2Nlc3Nlcy4KK1RFU1QoRXZlbnRMaXN0ZW5lckRlYXRoVGVzdCwgRXZlbnRzTm90Rm9yd2FyZGVkSW5EZWF0aFRlc3RTdWJwcmVjZXNzZXMpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7CisgICAgICBHVEVTVF9DSEVDS18oVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoCisgICAgICAgICAgKkdldFVuaXRUZXN0SW1wbCgpLT5saXN0ZW5lcnMoKSkpIDw8ICJleHBlY3RlZCBmYWlsdXJlIjt9LAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGxpc3RlbmVyIGluc3RhbGxlZCB2aWEgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoKSBzdGFydHMKKy8vIHJlY2VpdmluZyBldmVudHMgYW5kIGlzIHJldHVybmVkIHZpYSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgYW5kIHRoYXQKKy8vIHRoZSBwcmV2aW91cyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhbmQgZGVsZXRlZC4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKworICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkpOworCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKworICBFWFBFQ1RfRVEoMSwgb25fc3RhcnRfY291bnRlcik7CisKKyAgLy8gUmVwbGFjaW5nIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgd2l0aCBzb21ldGhpbmcgZWxzZSBzaG91bGQgcmVtb3ZlIGl0CisgIC8vIGZyb20gdGhlIGxpc3QgYW5kIGRlc3Ryb3kgaXQuCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigmbGlzdGVuZXJzLCBOVUxMKTsKKworICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShpc19kZXN0cm95ZWQpOworCisgIC8vIEFmdGVyIGJyb2FkY2FzdGluZyBhbiBldmVudCB0aGUgY291bnRlciBpcyBzdGlsbCB0aGUgc2FtZSwgaW5kaWNhdGluZworICAvLyB0aGUgbGlzdGVuZXIgaXMgbm90IGluIHRoZSBsaXN0IGFueW1vcmUuCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGxpc3RlbmVyIHN0b3BzIHJlY2VpdmluZyBldmVudHMKKy8vIHdoZW4gcmVtb3ZlZCB2aWEgUmVsZWFzZSBhbmQgdGhhdCBpcyBub3Qgb3duZWQgYnkgdGhlIGxpc3QgYW55bW9yZS4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIFJlbW92aW5nRGVmYXVsdFJlc3VsdFByaW50ZXJXb3JrcykgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIC8vIEFsdGhvdWdoIEFwcGVuZCBwYXNzZXMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCB0byB0aGUgbGlzdCwKKyAgLy8gdGhlIGZvbGxvd2luZyBjYWxscyByZWxlYXNlIGl0LCBhbmQgd2UgbmVlZCB0byBkZWxldGUgaXQgYmVmb3JlIHRoZQorICAvLyB0ZXN0IGVuZHMuCisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKyAgeworICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKworICAgIEVYUEVDVF9FUShsaXN0ZW5lciwgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXIpKTsKKyAgICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpID09IE5VTEwpOworICAgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworCisgICAgLy8gQnJvYWRjYXN0aW5nIGV2ZW50cyBub3cgc2hvdWxkIG5vdCBhZmZlY3QgZGVmYXVsdF9yZXN1bHRfcHJpbnRlci4KKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7CisgIH0KKyAgLy8gRGVzdHJveWluZyB0aGUgbGlzdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgbGlzdGVuZXIgbm93LCB0b28uCisgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworICBkZWxldGUgbGlzdGVuZXI7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciBpbnN0YWxsZWQgdmlhIFNldERlZmF1bHRYbWxHZW5lcmF0b3IoKSBzdGFydHMKKy8vIHJlY2VpdmluZyBldmVudHMgYW5kIGlzIHJldHVybmVkIHZpYSBkZWZhdWx0X3htbF9nZW5lcmF0b3IoKSBhbmQgdGhhdAorLy8gdGhlIHByZXZpb3VzIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QgYW5kIGRlbGV0ZWQuCitURVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBkZWZhdWx0X3htbF9nZW5lcmF0b3IpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoJmxpc3RlbmVycywgbGlzdGVuZXIpOworCisgIEVYUEVDVF9FUShsaXN0ZW5lciwgbGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisKKyAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworCisgIC8vIFJlcGxhY2luZyBkZWZhdWx0X3htbF9nZW5lcmF0b3Igd2l0aCBzb21ldGhpbmcgZWxzZSBzaG91bGQgcmVtb3ZlIGl0CisgIC8vIGZyb20gdGhlIGxpc3QgYW5kIGRlc3Ryb3kgaXQuCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsIE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoaXNfZGVzdHJveWVkKTsKKworICAvLyBBZnRlciBicm9hZGNhc3RpbmcgYW4gZXZlbnQgdGhlIGNvdW50ZXIgaXMgc3RpbGwgdGhlIHNhbWUsIGluZGljYXRpbmcKKyAgLy8gdGhlIGxpc3RlbmVyIGlzIG5vdCBpbiB0aGUgbGlzdCBhbnltb3JlLgorICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGxpc3RlbmVyIHN0b3BzIHJlY2VpdmluZyBldmVudHMKKy8vIHdoZW4gcmVtb3ZlZCB2aWEgUmVsZWFzZSBhbmQgdGhhdCBpcyBub3Qgb3duZWQgYnkgdGhlIGxpc3QgYW55bW9yZS4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIFJlbW92aW5nRGVmYXVsdFhtbEdlbmVyYXRvcldvcmtzKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgLy8gQWx0aG91Z2ggQXBwZW5kIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IHRvIHRoZSBsaXN0LAorICAvLyB0aGUgZm9sbG93aW5nIGNhbGxzIHJlbGVhc2UgaXQsIGFuZCB3ZSBuZWVkIHRvIGRlbGV0ZSBpdCBiZWZvcmUgdGhlCisgIC8vIHRlc3QgZW5kcy4KKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworICB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcigmbGlzdGVuZXJzLCBsaXN0ZW5lcik7CisKKyAgICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSk7CisgICAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpID09IE5VTEwpOworICAgIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOworCisgICAgLy8gQnJvYWRjYXN0aW5nIGV2ZW50cyBub3cgc2hvdWxkIG5vdCBhZmZlY3QgZGVmYXVsdF94bWxfZ2VuZXJhdG9yLgorICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICAgIEVYUEVDVF9FUSgwLCBvbl9zdGFydF9jb3VudGVyKTsKKyAgfQorICAvLyBEZXN0cm95aW5nIHRoZSBsaXN0IHNob3VsZCBub3QgYWZmZWN0IHRoZSBsaXN0ZW5lciBub3csIHRvby4KKyAgRVhQRUNUX0ZBTFNFKGlzX2Rlc3Ryb3llZCk7CisgIGRlbGV0ZSBsaXN0ZW5lcjsKK30KKworLy8gU2FuaXR5IHRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBhbHRlcm5hdGl2ZSwgdmVyYm9zZSBzcGVsbGluZ3Mgb2YKKy8vIHNvbWUgb2YgdGhlIG1hY3JvcyB3b3JrLiAgV2UgZG9uJ3QgdGVzdCB0aGVtIHRob3JvdWdobHkgYXMgdGhhdAorLy8gd291bGQgYmUgcXVpdGUgaW52b2x2ZWQuICBTaW5jZSB0aGVpciBpbXBsZW1lbnRhdGlvbnMgYXJlCisvLyBzdHJhaWdodGZvcndhcmQsIGFuZCB0aGV5IGFyZSByYXJlbHkgdXNlZCwgd2UnbGwganVzdCByZWx5IG9uIHRoZQorLy8gdXNlcnMgdG8gdGVsbCB1cyB3aGVuIHRoZXkgYXJlIGJyb2tlbi4KK0dURVNUX1RFU1QoQWx0ZXJuYXRpdmVOYW1lVGVzdCwgV29ya3MpIHsgIC8vIEdURVNUX1RFU1QgaXMgdGhlIHNhbWUgYXMgVEVTVC4KKyAgR1RFU1RfU1VDQ0VFRCgpIDw8ICJPSyI7ICAvLyBHVEVTVF9TVUNDRUVEIGlzIHRoZSBzYW1lIGFzIFNVQ0NFRUQuCisKKyAgLy8gR1RFU1RfRkFJTCBpcyB0aGUgc2FtZSBhcyBGQUlMLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9GQUlMKCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIC8vIEdURVNUX0FTU0VSVF9YWSBpcyB0aGUgc2FtZSBhcyBBU1NFUlRfWFkuCisKKyAgR1RFU1RfQVNTRVJUX0VRKDAsIDApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfRVEoMCwgMSkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfRVEoMSwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9ORSgwLCAxKTsKKyAgR1RFU1RfQVNTRVJUX05FKDEsIDApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfTkUoMCwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9MRSgwLCAwKTsKKyAgR1RFU1RfQVNTRVJUX0xFKDAsIDEpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfTEUoMSwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9MVCgwLCAxKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0xUKDAsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0xUKDEsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBHVEVTVF9BU1NFUlRfR0UoMCwgMCk7CisgIEdURVNUX0FTU0VSVF9HRSgxLCAwKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0dFKDAsIDEpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBHVEVTVF9BU1NFUlRfR1QoMSwgMCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9HVCgwLCAxKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9HVCgxLCAxKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIGZvciBpbnRlcm5hbCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5pdmVyc2FsCisvLyBwcmludGluZy4KKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEZpbmQgYSBiZXR0ZXIgaG9tZSBmb3IgdGhlbS4KKworY2xhc3MgQ29udmVyc2lvbkhlbHBlckJhc2Uge307CitjbGFzcyBDb252ZXJzaW9uSGVscGVyRGVyaXZlZCA6IHB1YmxpYyBDb252ZXJzaW9uSGVscGVyQmFzZSB7fTsKKworLy8gVGVzdHMgdGhhdCBJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgorVEVTVChJc0FQcm90b2NvbE1lc3NhZ2VUZXN0LCBWYWx1ZUlzQ29tcGlsZVRpbWVDb25zdGFudCkgeworICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oSXNBUHJvdG9jb2xNZXNzYWdlPFByb3RvY29sTWVzc2FnZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdHJ1ZSk7CisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyghSXNBUHJvdG9jb2xNZXNzYWdlPGludD46OnZhbHVlLCBjb25zdF9mYWxzZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyB0cnVlIHdoZW4gVCBpcworLy8gcHJvdG8yOjpNZXNzYWdlIG9yIGEgc3ViLWNsYXNzIG9mIGl0LgorVEVTVChJc0FQcm90b2NvbE1lc3NhZ2VUZXN0LCBWYWx1ZUlzVHJ1ZVdoZW5UeXBlSXNBUHJvdG9jb2xNZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKElzQVByb3RvY29sTWVzc2FnZTwgOjpwcm90bzI6Ok1lc3NhZ2U+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKElzQVByb3RvY29sTWVzc2FnZTxQcm90b2NvbE1lc3NhZ2U+Ojp2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyBmYWxzZSB3aGVuIFQgaXMgbmVpdGhlcgorLy8gUHJvdG9jb2xNZXNzYWdlIG5vciBhIHN1Yi1jbGFzcyBvZiBpdC4KK1RFU1QoSXNBUHJvdG9jb2xNZXNzYWdlVGVzdCwgVmFsdWVJc0ZhbHNlV2hlblR5cGVJc05vdEFQcm90b2NvbE1lc3NhZ2UpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQVByb3RvY29sTWVzc2FnZTxpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShJc0FQcm90b2NvbE1lc3NhZ2U8Y29uc3QgQ29udmVyc2lvbkhlbHBlckJhc2U+Ojp2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWwgY29tcGlsZXMgd2hlbiB0aGUgdHlwZSBhcmd1bWVudHMgYXJlCisvLyBlcXVhbC4KK1RFU1QoQ29tcGlsZUFzc2VydFR5cGVzRXF1YWwsIENvbXBpbGVzV2hlblR5cGVzQXJlRXF1YWwpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgdm9pZD4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50KiwgaW50Kj4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVSZWZlcmVuY2UgZG9lcyBub3QgYWZmZWN0IG5vbi1yZWZlcmVuY2UgdHlwZXMuCitURVNUKFJlbW92ZVJlZmVyZW5jZVRlc3QsIERvZXNOb3RBZmZlY3ROb25SZWZlcmVuY2VUeXBlKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlUmVmZXJlbmNlPGludD46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXIsIFJlbW92ZVJlZmVyZW5jZTxjb25zdCBjaGFyPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVSZWZlcmVuY2UgcmVtb3ZlcyByZWZlcmVuY2UgZnJvbSByZWZlcmVuY2UgdHlwZXMuCitURVNUKFJlbW92ZVJlZmVyZW5jZVRlc3QsIFJlbW92ZXNSZWZlcmVuY2UpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBSZW1vdmVSZWZlcmVuY2U8aW50Jj46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXIsIFJlbW92ZVJlZmVyZW5jZTxjb25zdCBjaGFyJj46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2UoKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUMik+KCk7Cit9CisKK1RFU1QoUmVtb3ZlUmVmZXJlbmNlVGVzdCwgTWFjcm9WZXJzaW9uKSB7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZTxpbnQsIGludD4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlPGNvbnN0IGNoYXIsIGNvbnN0IGNoYXImPigpOworfQorCisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlQ29uc3QgZG9lcyBub3QgYWZmZWN0IG5vbi1jb25zdCB0eXBlcy4KK1RFU1QoUmVtb3ZlQ29uc3RUZXN0LCBEb2VzTm90QWZmZWN0Tm9uQ29uc3RUeXBlKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlQ29uc3Q8aW50Pjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y2hhciYsIFJlbW92ZUNvbnN0PGNoYXImPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVDb25zdCByZW1vdmVzIGNvbnN0IGZyb20gY29uc3QgdHlwZXMuCitURVNUKFJlbW92ZUNvbnN0VGVzdCwgUmVtb3Zlc0NvbnN0KSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlQ29uc3Q8Y29uc3QgaW50Pjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y2hhclsyXSwgUmVtb3ZlQ29uc3Q8Y29uc3QgY2hhclsyXT46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXJbMl1bM10sIFJlbW92ZUNvbnN0PGNvbnN0IGNoYXJbMl1bM10+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyBHVEVTVF9SRU1PVkVfQ09OU1RfLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBUZXN0R1Rlc3RSZW1vdmVDb25zdCgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX1JFTU9WRV9DT05TVF8oVDIpPigpOworfQorCitURVNUKFJlbW92ZUNvbnN0VGVzdCwgTWFjcm9WZXJzaW9uKSB7CisgIFRlc3RHVGVzdFJlbW92ZUNvbnN0PGludCwgaW50PigpOworICBUZXN0R1Rlc3RSZW1vdmVDb25zdDxkb3VibGUmLCBkb3VibGUmPigpOworICBUZXN0R1Rlc3RSZW1vdmVDb25zdDxjaGFyLCBjb25zdCBjaGFyPigpOworfQorCisvLyBUZXN0cyBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0KCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFQyKT4oKTsKK30KKworVEVTVChSZW1vdmVSZWZlcmVuY2VUb0NvbnN0VGVzdCwgV29ya3MpIHsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8aW50LCBpbnQ+KCk7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGRvdWJsZSwgZG91YmxlJj4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8Y2hhciwgY29uc3QgY2hhcj4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8Y2hhciwgY29uc3QgY2hhciY+KCk7CisgIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKj4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBBZGRSZWZlcmVuY2UgZG9lcyBub3QgYWZmZWN0IHJlZmVyZW5jZSB0eXBlcy4KK1RFU1QoQWRkUmVmZXJlbmNlVGVzdCwgRG9lc05vdEFmZmVjdFJlZmVyZW5jZVR5cGUpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50JiwgQWRkUmVmZXJlbmNlPGludCY+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyJiwgQWRkUmVmZXJlbmNlPGNvbnN0IGNoYXImPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBBZGRSZWZlcmVuY2UgYWRkcyByZWZlcmVuY2UgdG8gbm9uLXJlZmVyZW5jZSB0eXBlcy4KK1RFU1QoQWRkUmVmZXJlbmNlVGVzdCwgQWRkc1JlZmVyZW5jZSkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQmLCBBZGRSZWZlcmVuY2U8aW50Pjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y29uc3QgY2hhciYsIEFkZFJlZmVyZW5jZTxjb25zdCBjaGFyPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgR1RFU1RfQUREX1JFRkVSRU5DRV8uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFRlc3RHVGVzdEFkZFJlZmVyZW5jZSgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX0FERF9SRUZFUkVOQ0VfKFQyKT4oKTsKK30KKworVEVTVChBZGRSZWZlcmVuY2VUZXN0LCBNYWNyb1ZlcnNpb24pIHsKKyAgVGVzdEdUZXN0QWRkUmVmZXJlbmNlPGludCYsIGludD4oKTsKKyAgVGVzdEdUZXN0QWRkUmVmZXJlbmNlPGNvbnN0IGNoYXImLCBjb25zdCBjaGFyJj4oKTsKK30KKworLy8gVGVzdHMgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdCgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oVDIpPigpOworfQorCitURVNUKEdUZXN0UmVmZXJlbmNlVG9Db25zdFRlc3QsIFdvcmtzKSB7CisgIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3Q8Y29uc3QgY2hhciYsIGNoYXI+KCk7CisgIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3Q8Y29uc3QgaW50JiwgY29uc3QgaW50PigpOworICBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0PGNvbnN0IGRvdWJsZSYsIGRvdWJsZT4oKTsKKyAgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdDxjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IHN0ZDo6c3RyaW5nJj4oKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbXBsaWNpdGx5Q29udmVydGlibGU8VDEsIFQyPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCitURVNUKEltcGxpY2l0bHlDb252ZXJ0aWJsZVRlc3QsIFZhbHVlSXNDb21waWxlVGltZUNvbnN0YW50KSB7CisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCwgaW50Pjo6dmFsdWUpLCBjb25zdF90cnVlKTsKKyAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCghSW1wbGljaXRseUNvbnZlcnRpYmxlPHZvaWQqLCBpbnQqPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfZmFsc2UpOworfQorCisvLyBUZXN0cyB0aGF0IEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUMSwgVDI+Ojp2YWx1ZSBpcyB0cnVlIHdoZW4gVDEgY2FuCisvLyBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBUMi4KK1RFU1QoSW1wbGljaXRseUNvbnZlcnRpYmxlVGVzdCwgVmFsdWVJc1RydWVXaGVuQ29udmVydGlibGUpIHsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQsIGRvdWJsZT46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8ZG91YmxlLCBpbnQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCosIHZvaWQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQqLCBjb25zdCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxDb252ZXJzaW9uSGVscGVyRGVyaXZlZCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udmVyc2lvbkhlbHBlckJhc2UmPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBDb252ZXJzaW9uSGVscGVyQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uSGVscGVyQmFzZT46OnZhbHVlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW1wbGljaXRseUNvbnZlcnRpYmxlPFQxLCBUMj46OnZhbHVlIGlzIGZhbHNlIHdoZW4gVDEKKy8vIGNhbm5vdCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBUMi4KK1RFU1QoSW1wbGljaXRseUNvbnZlcnRpYmxlVGVzdCwgVmFsdWVJc0ZhbHNlV2hlbk5vdENvbnZlcnRpYmxlKSB7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGRvdWJsZSwgaW50Kj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPHZvaWQqLCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgaW50KiwgaW50Kj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPENvbnZlcnNpb25IZWxwZXJCYXNlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbkhlbHBlckRlcml2ZWQmPjo6dmFsdWUpKTsKK30KKworLy8gVGVzdHMgSXNDb250YWluZXJUZXN0LgorCitjbGFzcyBOb25Db250YWluZXIge307CisKK1RFU1QoSXNDb250YWluZXJUZXN0VGVzdCwgV29ya3NGb3JOb25Db250YWluZXIpIHsKKyAgRVhQRUNUX0VRKHNpemVvZihJc05vdENvbnRhaW5lciksIHNpemVvZihJc0NvbnRhaW5lclRlc3Q8aW50PigwKSkpOworICBFWFBFQ1RfRVEoc2l6ZW9mKElzTm90Q29udGFpbmVyKSwgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxjaGFyWzVdPigwKSkpOworICBFWFBFQ1RfRVEoc2l6ZW9mKElzTm90Q29udGFpbmVyKSwgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxOb25Db250YWluZXI+KDApKSk7Cit9CisKK1RFU1QoSXNDb250YWluZXJUZXN0VGVzdCwgV29ya3NGb3JDb250YWluZXIpIHsKKyAgRVhQRUNUX0VRKHNpemVvZihJc0NvbnRhaW5lciksCisgICAgICAgICAgICBzaXplb2YoSXNDb250YWluZXJUZXN0PHN0ZDo6dmVjdG9yPGJvb2w+ID4oMCkpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihJc0NvbnRhaW5lciksCisgICAgICAgICAgICBzaXplb2YoSXNDb250YWluZXJUZXN0PHN0ZDo6bWFwPGludCwgZG91YmxlPiA+KDApKSk7Cit9CisKKy8vIFRlc3RzIEFycmF5RXEoKS4KKworVEVTVChBcnJheUVxVGVzdCwgV29ya3NGb3JEZWdlbmVyYXRlZEFycmF5cykgeworICBFWFBFQ1RfVFJVRShBcnJheUVxKDUsIDVMKSk7CisgIEVYUEVDVF9GQUxTRShBcnJheUVxKCdhJywgMCkpOworfQorCitURVNUKEFycmF5RXFUZXN0LCBXb3Jrc0Zvck9uZURpbWVuc2lvbmFsQXJyYXlzKSB7CisgIC8vIE5vdGUgdGhhdCBhIGFuZCBiIGFyZSBkaXN0aW5jdCBidXQgY29tcGF0aWJsZSB0eXBlcy4KKyAgY29uc3QgaW50IGFbXSA9IHsgMCwgMSB9OworICBsb25nIGJbXSA9IHsgMCwgMSB9OworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGIpKTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCAyLCBiKSk7CisKKyAgYlswXSA9IDI7CisgIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIGIpKTsKKyAgRVhQRUNUX0ZBTFNFKEFycmF5RXEoYSwgMSwgYikpOworfQorCitURVNUKEFycmF5RXFUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsQXJyYXlzKSB7CisgIGNvbnN0IGNoYXIgYVtdWzNdID0geyAiaGkiLCAibG8iIH07CisgIGNvbnN0IGNoYXIgYltdWzNdID0geyAiaGkiLCAibG8iIH07CisgIGNvbnN0IGNoYXIgY1tdWzNdID0geyAiaGkiLCAibGkiIH07CisKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgMiwgYikpOworCisgIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIGMpKTsKKyAgRVhQRUNUX0ZBTFNFKEFycmF5RXEoYSwgMiwgYykpOworfQorCisvLyBUZXN0cyBBcnJheUF3YXJlRmluZCgpLgorCitURVNUKEFycmF5QXdhcmVGaW5kVGVzdCwgV29ya3NGb3JPbmVEaW1lbnNpb25hbEFycmF5KSB7CisgIGNvbnN0IGNoYXIgYVtdID0gImhlbGxvIjsKKyAgRVhQRUNUX0VRKGEgKyA0LCBBcnJheUF3YXJlRmluZChhLCBhICsgNSwgJ28nKSk7CisgIEVYUEVDVF9FUShhICsgNSwgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDUsICd4JykpOworfQorCitURVNUKEFycmF5QXdhcmVGaW5kVGVzdCwgV29ya3NGb3JUd29EaW1lbnNpb25hbEFycmF5KSB7CisgIGludCBhW11bMl0gPSB7IHsgMCwgMSB9LCB7IDIsIDMgfSwgeyA0LCA1IH0gfTsKKyAgY29uc3QgaW50IGJbMl0gPSB7IDIsIDMgfTsKKyAgRVhQRUNUX0VRKGEgKyAxLCBBcnJheUF3YXJlRmluZChhLCBhICsgMywgYikpOworCisgIGNvbnN0IGludCBjWzJdID0geyA2LCA3IH07CisgIEVYUEVDVF9FUShhICsgMywgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDMsIGMpKTsKK30KKworLy8gVGVzdHMgQ29weUFycmF5KCkuCisKK1RFU1QoQ29weUFycmF5VGVzdCwgV29ya3NGb3JEZWdlbmVyYXRlZEFycmF5cykgeworICBpbnQgbiA9IDA7CisgIENvcHlBcnJheSgnYScsICZuKTsKKyAgRVhQRUNUX0VRKCdhJywgbik7Cit9CisKK1RFU1QoQ29weUFycmF5VGVzdCwgV29ya3NGb3JPbmVEaW1lbnNpb25hbEFycmF5cykgeworICBjb25zdCBjaGFyIGFbM10gPSAiaGkiOworICBpbnQgYlszXTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fICAvLyBDKytCdWlsZGVyIGNhbm5vdCBjb21waWxlIHNvbWUgYXJyYXkgc2l6ZSBkZWR1Y3Rpb25zLgorICBDb3B5QXJyYXkoYSwgJmIpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGIpKTsKKyNlbmRpZgorCisgIGludCBjWzNdOworICBDb3B5QXJyYXkoYSwgMywgYyk7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYykpOworfQorCitURVNUKENvcHlBcnJheVRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxBcnJheXMpIHsKKyAgY29uc3QgaW50IGFbMl1bM10gPSB7IHsgMCwgMSwgMiB9LCB7IDMsIDQsIDUgfSB9OworICBpbnQgYlsyXVszXTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fICAvLyBDKytCdWlsZGVyIGNhbm5vdCBjb21waWxlIHNvbWUgYXJyYXkgc2l6ZSBkZWR1Y3Rpb25zLgorICBDb3B5QXJyYXkoYSwgJmIpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGIpKTsKKyNlbmRpZgorCisgIGludCBjWzJdWzNdOworICBDb3B5QXJyYXkoYSwgMiwgYyk7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYykpOworfQorCisvLyBUZXN0cyBOYXRpdmVBcnJheS4KKworVEVTVChOYXRpdmVBcnJheVRlc3QsIENvbnN0cnVjdG9yRnJvbUFycmF5V29ya3MpIHsKKyAgY29uc3QgaW50IGFbM10gPSB7IDAsIDEsIDIgfTsKKyAgTmF0aXZlQXJyYXk8aW50PiBuYShhLCAzLCBrUmVmZXJlbmNlKTsKKyAgRVhQRUNUX0VRKDNVLCBuYS5zaXplKCkpOworICBFWFBFQ1RfRVEoYSwgbmEuYmVnaW4oKSk7Cit9CisKK1RFU1QoTmF0aXZlQXJyYXlUZXN0LCBDcmVhdGVzQW5kRGVsZXRlc0NvcHlPZkFycmF5V2hlbkFza2VkVG8pIHsKKyAgdHlwZWRlZiBpbnQgQXJyYXlbMl07CisgIEFycmF5KiBhID0gbmV3IEFycmF5WzFdOworICAoKmEpWzBdID0gMDsKKyAgKCphKVsxXSA9IDE7CisgIE5hdGl2ZUFycmF5PGludD4gbmEoKmEsIDIsIGtDb3B5KTsKKyAgRVhQRUNUX05FKCphLCBuYS5iZWdpbigpKTsKKyAgZGVsZXRlW10gYTsKKyAgRVhQRUNUX0VRKDAsIG5hLmJlZ2luKClbMF0pOworICBFWFBFQ1RfRVEoMSwgbmEuYmVnaW4oKVsxXSk7CisKKyAgLy8gV2UgcmVseSBvbiB0aGUgaGVhcCBjaGVja2VyIHRvIHZlcmlmeSB0aGF0IG5hIGRlbGV0ZXMgdGhlIGNvcHkgb2YKKyAgLy8gYXJyYXkuCit9CisKK1RFU1QoTmF0aXZlQXJyYXlUZXN0LCBUeXBlTWVtYmVyc0FyZUNvcnJlY3QpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIE5hdGl2ZUFycmF5PGNoYXI+Ojp2YWx1ZV90eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50WzJdLCBOYXRpdmVBcnJheTxpbnRbMl0+Ojp2YWx1ZV90eXBlPigpOworCisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBjaGFyKiwgTmF0aXZlQXJyYXk8Y2hhcj46OmNvbnN0X2l0ZXJhdG9yPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgYm9vbCgqKVsyXSwgTmF0aXZlQXJyYXk8Ym9vbFsyXT46OmNvbnN0X2l0ZXJhdG9yPigpOworfQorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgTWV0aG9kc1dvcmspIHsKKyAgY29uc3QgaW50IGFbM10gPSB7IDAsIDEsIDIgfTsKKyAgTmF0aXZlQXJyYXk8aW50PiBuYShhLCAzLCBrQ29weSk7CisgIEFTU0VSVF9FUSgzVSwgbmEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMsIG5hLmVuZCgpIC0gbmEuYmVnaW4oKSk7CisKKyAgTmF0aXZlQXJyYXk8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBuYS5iZWdpbigpOworICBFWFBFQ1RfRVEoMCwgKml0KTsKKyAgKytpdDsKKyAgRVhQRUNUX0VRKDEsICppdCk7CisgIGl0Kys7CisgIEVYUEVDVF9FUSgyLCAqaXQpOworICArK2l0OworICBFWFBFQ1RfRVEobmEuZW5kKCksIGl0KTsKKworICBFWFBFQ1RfVFJVRShuYSA9PSBuYSk7CisKKyAgTmF0aXZlQXJyYXk8aW50PiBuYTIoYSwgMywga1JlZmVyZW5jZSk7CisgIEVYUEVDVF9UUlVFKG5hID09IG5hMik7CisKKyAgY29uc3QgaW50IGIxWzNdID0geyAwLCAxLCAxIH07CisgIGNvbnN0IGludCBiMls0XSA9IHsgMCwgMSwgMiwgMyB9OworICBFWFBFQ1RfRkFMU0UobmEgPT0gTmF0aXZlQXJyYXk8aW50PihiMSwgMywga1JlZmVyZW5jZSkpOworICBFWFBFQ1RfRkFMU0UobmEgPT0gTmF0aXZlQXJyYXk8aW50PihiMiwgNCwga0NvcHkpKTsKK30KKworVEVTVChOYXRpdmVBcnJheVRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxBcnJheSkgeworICBjb25zdCBjaGFyIGFbMl1bM10gPSB7ICJoaSIsICJsbyIgfTsKKyAgTmF0aXZlQXJyYXk8Y2hhclszXT4gbmEoYSwgMiwga1JlZmVyZW5jZSk7CisgIEFTU0VSVF9FUSgyVSwgbmEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGEsIG5hLmJlZ2luKCkpOworfQorCisvLyBUZXN0cyBTa2lwUHJlZml4KCkuCisKK1RFU1QoU2tpcFByZWZpeFRlc3QsIFNraXBzV2hlblByZWZpeE1hdGNoZXMpIHsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gImhlbGxvIjsKKworICBjb25zdCBjaGFyKiBwID0gc3RyOworICBFWFBFQ1RfVFJVRShTa2lwUHJlZml4KCIiLCAmcCkpOworICBFWFBFQ1RfRVEoc3RyLCBwKTsKKworICBwID0gc3RyOworICBFWFBFQ1RfVFJVRShTa2lwUHJlZml4KCJoZWxsIiwgJnApKTsKKyAgRVhQRUNUX0VRKHN0ciArIDQsIHApOworfQorCitURVNUKFNraXBQcmVmaXhUZXN0LCBEb2VzTm90U2tpcFdoZW5QcmVmaXhEb2VzTm90TWF0Y2gpIHsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gIndvcmxkIjsKKworICBjb25zdCBjaGFyKiBwID0gc3RyOworICBFWFBFQ1RfRkFMU0UoU2tpcFByZWZpeCgiVyIsICZwKSk7CisgIEVYUEVDVF9FUShzdHIsIHApOworCisgIHAgPSBzdHI7CisgIEVYUEVDVF9GQUxTRShTa2lwUHJlZml4KCJ3b3JsZCEiLCAmcCkpOworICBFWFBFQ1RfRVEoc3RyLCBwKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWNlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8gd3JpdGVzIHNvbWUgeG1sIHZpYSBUZXN0UHJvcGVydHkgdXNlZCBieQorLy8gZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIFByb3BlcnR5T25lIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIFJlY29yZFByb3BlcnR5KCJTZXRVcFByb3AiLCAxKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duUHJvcCIsIDEpOworICB9Cit9OworCitURVNUX0YoUHJvcGVydHlPbmUsIFRlc3RTb21lUHJvcGVydGllcykgeworICBSZWNvcmRQcm9wZXJ0eSgiVGVzdFNvbWVQcm9wZXJ0eSIsIDEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MDBiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIGd0ZXN0X3htbF9vdXRmaWxlMl90ZXN0XyB3cml0ZXMgc29tZSB4bWwgdmlhIFRlc3RQcm9wZXJ0eSB1c2VkIGJ5CisvLyBndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworY2xhc3MgUHJvcGVydHlUd28gOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgUmVjb3JkUHJvcGVydHkoIlNldFVwUHJvcCIsIDIpOworICB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiVGVhckRvd25Qcm9wIiwgMik7CisgIH0KK307CisKK1RFU1RfRihQcm9wZXJ0eVR3bywgVGVzdFNvbWVQcm9wZXJ0aWVzKSB7CisgIFJlY29yZFByb3BlcnR5KCJUZXN0U29tZVByb3BlcnR5IiwgMik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI0ZTQzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQpAQCAtMCwwICsxLDEzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IGZvciB0aGUgZ3Rlc3RfeG1sX291dHB1dCBtb2R1bGUuIiIiCisKK19fYXV0aG9yX18gPSAia2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KSIKKworaW1wb3J0IG9zCitmcm9tIHhtbC5kb20gaW1wb3J0IG1pbmlkb20sIE5vZGUKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKK2ltcG9ydCBndGVzdF94bWxfdGVzdF91dGlscworCisKK0dURVNUX09VVFBVVF9TVUJESVIgPSAieG1sX291dGZpbGVzIgorR1RFU1RfT1VUUFVUXzFfVEVTVCA9ICJndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8iCitHVEVTVF9PVVRQVVRfMl9URVNUID0gImd0ZXN0X3htbF9vdXRmaWxlMl90ZXN0XyIKKworRVhQRUNURURfWE1MXzEgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHRlc3RzdWl0ZXMgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIiB0aW1lc3RhbXA9IioiIG5hbWU9IkFsbFRlc3RzIj4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJQcm9wZXJ0eU9uZSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iVGVzdFNvbWVQcm9wZXJ0aWVzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eU9uZSIgU2V0VXBQcm9wPSIxIiBUZXN0U29tZVByb3BlcnR5PSIxIiBUZWFyRG93blByb3A9IjEiIC8+CisgIDwvdGVzdHN1aXRlPgorPC90ZXN0c3VpdGVzPgorIiIiCisKK0VYUEVDVEVEX1hNTF8yID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIgdGltZXN0YW1wPSIqIiBuYW1lPSJBbGxUZXN0cyI+CisgIDx0ZXN0c3VpdGUgbmFtZT0iUHJvcGVydHlUd28iIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IlRlc3RTb21lUHJvcGVydGllcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iUHJvcGVydHlUd28iIFNldFVwUHJvcD0iMiIgVGVzdFNvbWVQcm9wZXJ0eT0iMiIgVGVhckRvd25Qcm9wPSIyIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4KKyIiIgorCisKK2NsYXNzIEdUZXN0WE1MT3V0RmlsZXNUZXN0KGd0ZXN0X3htbF90ZXN0X3V0aWxzLkdUZXN0WE1MVGVzdENhc2UpOgorICAiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgWE1MIG91dHB1dCBmdW5jdGlvbmFsaXR5LiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICAjIFdlIHdhbnQgdGhlIHRyYWlsaW5nICcvJyB0aGF0IHRoZSBsYXN0ICIiIHByb3ZpZGVzIGluIG9zLnBhdGguam9pbiwgZm9yCisgICAgIyB0ZWxsaW5nIEdvb2dsZSBUZXN0IHRvIGNyZWF0ZSBhbiBvdXRwdXQgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSBzaW5nbGUgZmlsZQorICAgICMgZm9yIHhtbCBvdXRwdXQuCisgICAgc2VsZi5vdXRwdXRfZGlyXyA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX09VVFBVVF9TVUJESVIsICIiKQorICAgIHNlbGYuRGVsZXRlRmlsZXNBbmREaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLkRlbGV0ZUZpbGVzQW5kRGlyKCkKKworICBkZWYgRGVsZXRlRmlsZXNBbmREaXIoc2VsZik6CisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMV9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMl9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3Mucm1kaXIoc2VsZi5vdXRwdXRfZGlyXykKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisKKyAgZGVmIHRlc3RPdXRmaWxlMShzZWxmKToKKyAgICBzZWxmLl9UZXN0T3V0RmlsZShHVEVTVF9PVVRQVVRfMV9URVNULCBFWFBFQ1RFRF9YTUxfMSkKKworICBkZWYgdGVzdE91dGZpbGUyKHNlbGYpOgorICAgIHNlbGYuX1Rlc3RPdXRGaWxlKEdURVNUX09VVFBVVF8yX1RFU1QsIEVYUEVDVEVEX1hNTF8yKQorCisgIGRlZiBfVGVzdE91dEZpbGUoc2VsZiwgdGVzdF9uYW1lLCBleHBlY3RlZF94bWwpOgorICAgIGd0ZXN0X3Byb2dfcGF0aCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKHRlc3RfbmFtZSkKKyAgICBjb21tYW5kID0gW2d0ZXN0X3Byb2dfcGF0aCwgIi0tZ3Rlc3Rfb3V0cHV0PXhtbDolcyIgJSBzZWxmLm91dHB1dF9kaXJfXQorICAgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfZGlyPWd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpKQorICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBwLmV4aXRfY29kZSkKKworICAgICMgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxpYnRvb2wgY2F1c2VzIHRoZSBidWlsdCB0ZXN0IGJpbmFyeSB0byBiZQorICAgICMgICBuYW1lZCBsdC1ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8gaW5zdGVhZCBvZgorICAgICMgICBndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8uICBUbyBhY2NvdW50IGZvciB0aGlzIHBvc3NpYmlsbGl0eSwgd2UKKyAgICAjICAgYWxsb3cgYm90aCBuYW1lcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuICBXZSBzaG91bGQgcmVtb3ZlIHRoaXMKKyAgICAjICAgaGFjayB3aGVuIENoYW5kbGVyIENhcnJ1dGgncyBsaWJ0b29sIHJlcGxhY2VtZW50IHRvb2wgaXMgcmVhZHkuCisgICAgb3V0cHV0X2ZpbGVfbmFtZTEgPSB0ZXN0X25hbWUgKyAiLnhtbCIKKyAgICBvdXRwdXRfZmlsZTEgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyXywgb3V0cHV0X2ZpbGVfbmFtZTEpCisgICAgb3V0cHV0X2ZpbGVfbmFtZTIgPSAnbHQtJyArIG91dHB1dF9maWxlX25hbWUxCisgICAgb3V0cHV0X2ZpbGUyID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpcl8sIG91dHB1dF9maWxlX25hbWUyKQorICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzZmlsZShvdXRwdXRfZmlsZTEpIG9yIG9zLnBhdGguaXNmaWxlKG91dHB1dF9maWxlMiksCisgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlMSkKKworICAgIGV4cGVjdGVkID0gbWluaWRvbS5wYXJzZVN0cmluZyhleHBlY3RlZF94bWwpCisgICAgaWYgb3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUxKToKKyAgICAgIGFjdHVhbCA9IG1pbmlkb20ucGFyc2Uob3V0cHV0X2ZpbGUxKQorICAgIGVsc2U6CisgICAgICBhY3R1YWwgPSBtaW5pZG9tLnBhcnNlKG91dHB1dF9maWxlMikKKyAgICBzZWxmLk5vcm1hbGl6ZVhtbChhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIHNlbGYuQXNzZXJ0RXF1aXZhbGVudE5vZGVzKGV4cGVjdGVkLmRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIGV4cGVjdGVkLnVubGluaygpCisgICAgYWN0dWFsLnVubGluaygpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgb3MuZW52aXJvblsiR1RFU1RfU1RBQ0tfVFJBQ0VfREVQVEgiXSA9ICIwIgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYmNkNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwyODQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCBmb3IgdGhlIGd0ZXN0X3htbF9vdXRwdXQgbW9kdWxlIiIiCisKK19fYXV0aG9yX18gPSAnZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpJworCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBlcnJubworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbSwgTm9kZQorCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworaW1wb3J0IGd0ZXN0X3htbF90ZXN0X3V0aWxzCisKKworR1RFU1RfTElTVF9URVNUU19GTEFHID0gJy0tZ3Rlc3RfbGlzdF90ZXN0cycKK0dURVNUX09VVFBVVF9GTEFHICAgICAgICAgPSAiLS1ndGVzdF9vdXRwdXQiCitHVEVTVF9ERUZBVUxUX09VVFBVVF9GSUxFID0gInRlc3RfZGV0YWlsLnhtbCIKK0dURVNUX1BST0dSQU1fTkFNRSA9ICJndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0XyIKKworU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTID0gRmFsc2UKKworaWYgU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTOgorICBTVEFDS19UUkFDRV9URU1QTEFURSA9ICdcblN0YWNrIHRyYWNlOlxuKicKK2Vsc2U6CisgIFNUQUNLX1RSQUNFX1RFTVBMQVRFID0gJycKKworRVhQRUNURURfTk9OX0VNUFRZX1hNTCA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8dGVzdHN1aXRlcyB0ZXN0cz0iMjMiIGZhaWx1cmVzPSI0IiBkaXNhYmxlZD0iMiIgZXJyb3JzPSIwIiB0aW1lPSIqIiB0aW1lc3RhbXA9IioiIG5hbWU9IkFsbFRlc3RzIj4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJTdWNjZXNzZnVsVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iU3VjY2VlZHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlN1Y2Nlc3NmdWxUZXN0Ii8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkZhaWxlZFRlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMSIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IkZhaWxzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJGYWlsZWRUZXN0Ij4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtWYWx1ZSBvZjogMiYjeDBBO0V4cGVjdGVkOiAxIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK1ZhbHVlIG9mOiAyCitFeHBlY3RlZDogMSUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJNaXhlZFJlc3VsdFRlc3QiIHRlc3RzPSIzIiBmYWlsdXJlcz0iMSIgZGlzYWJsZWQ9IjEiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IlN1Y2NlZWRzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJNaXhlZFJlc3VsdFRlc3QiLz4KKyAgICA8dGVzdGNhc2UgbmFtZT0iRmFpbHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik1peGVkUmVzdWx0VGVzdCI+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSJndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqJiN4MEE7VmFsdWUgb2Y6IDImI3gwQTtFeHBlY3RlZDogMSIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitWYWx1ZSBvZjogMgorRXhwZWN0ZWQ6IDElKHN0YWNrKXNdXT48L2ZhaWx1cmU+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSJndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqJiN4MEE7VmFsdWUgb2Y6IDMmI3gwQTtFeHBlY3RlZDogMiIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitWYWx1ZSBvZjogMworRXhwZWN0ZWQ6IDIlKHN0YWNrKXNdXT48L2ZhaWx1cmU+CisgICAgPC90ZXN0Y2FzZT4KKyAgICA8dGVzdGNhc2UgbmFtZT0iRElTQUJMRURfdGVzdCIgc3RhdHVzPSJub3RydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTWl4ZWRSZXN1bHRUZXN0Ii8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IlhtbFF1b3RpbmdUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjEiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJPdXRwdXRzQ0RhdGEiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlhtbFF1b3RpbmdUZXN0Ij4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtGYWlsZWQmI3gwQTtYTUwgb3V0cHV0OiAmbHQ7P3htbCBlbmNvZGluZz0mcXVvdDt1dGYtOCZxdW90OyZndDsmbHQ7dG9wJmd0OyZsdDshW0NEQVRBW2NkYXRhIHRleHRdXSZndDsmbHQ7L3RvcCZndDsiIHR5cGU9IiI+PCFbQ0RBVEFbZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KgorRmFpbGVkCitYTUwgb3V0cHV0OiA8P3htbCBlbmNvZGluZz0idXRmLTgiPjx0b3A+PCFbQ0RBVEFbY2RhdGEgdGV4dF1dPl1dJmd0OzwhW0NEQVRBWzwvdG9wPiUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJJbnZhbGlkQ2hhcmFjdGVyc1Rlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMSIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IkludmFsaWRDaGFyYWN0ZXJzSW5NZXNzYWdlIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJJbnZhbGlkQ2hhcmFjdGVyc1Rlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KiYjeDBBO0ZhaWxlZCYjeDBBO0ludmFsaWQgY2hhcmFjdGVycyBpbiBicmFja2V0cyBbXSIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitGYWlsZWQKK0ludmFsaWQgY2hhcmFjdGVycyBpbiBicmFja2V0cyBbXSUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJEaXNhYmxlZFRlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjEiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IkRJU0FCTEVEX3Rlc3Rfbm90X3J1biIgc3RhdHVzPSJub3RydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iRGlzYWJsZWRUZXN0Ii8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIgdGVzdHM9IjQiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iT25lUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiLz4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSW50VmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5X2ludD0iMSIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUaHJlZVByb3BlcnRpZXMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiIGtleV8yPSIyIiBrZXlfMz0iMyIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eVJlY29yZGluZ1Rlc3QiIGtleV8xPSIyIi8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9Ik5vRml4dHVyZVRlc3QiIHRlc3RzPSIzIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJSZWNvcmRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5PSIxIi8+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5X2Zvcl91dGlsaXR5X2ludD0iMSIvPgorICAgICA8dGVzdGNhc2UgbmFtZT0iRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkU3RyaW5nVmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik5vRml4dHVyZVRlc3QiIGtleV9mb3JfdXRpbGl0eV9zdHJpbmc9IjEiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJUeXBlZFRlc3QvMCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJUeXBlZFRlc3QvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iVHlwZWRUZXN0LzEiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iVHlwZWRUZXN0LzEiIC8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IlNpbmdsZS9UeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLzAiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTaW5nbGUvVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZS8xIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4iIiIgJSB7J3N0YWNrJzogU1RBQ0tfVFJBQ0VfVEVNUExBVEV9CisKKworRVhQRUNURURfRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIwIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIgdGltZXN0YW1wPSIqIiBuYW1lPSJBbGxUZXN0cyI+Cis8L3Rlc3RzdWl0ZXM+IiIiCisKK0dURVNUX1BST0dSQU1fUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKEdURVNUX1BST0dSQU1fTkFNRSkKKworU1VQUE9SVFNfVFlQRURfVEVTVFMgPSAnVHlwZWRUZXN0JyBpbiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgW0dURVNUX1BST0dSQU1fUEFUSCwgR1RFU1RfTElTVF9URVNUU19GTEFHXSwgY2FwdHVyZV9zdGRlcnI9RmFsc2UpLm91dHB1dAorCisKK2NsYXNzIEdUZXN0WE1MT3V0cHV0VW5pdFRlc3QoZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMuR1Rlc3RYTUxUZXN0Q2FzZSk6CisgICIiIgorICBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgWE1MIG91dHB1dCBmdW5jdGlvbmFsaXR5LgorICAiIiIKKworICAjIFRoaXMgdGVzdCBjdXJyZW50bHkgYnJlYWtzIG9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHR5cGVkIGFuZAorICAjIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cywgc28gd2UgZG9uJ3QgcnVuIGl0IHVuZGVyIHRoZW0uCisgIGlmIFNVUFBPUlRTX1RZUEVEX1RFU1RTOgorICAgIGRlZiB0ZXN0Tm9uRW1wdHlYbWxPdXRwdXQoc2VsZik6CisgICAgICAiIiIKKyAgICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYSBub24tZW1wdHkgWE1MIG91dHB1dCwgYW5kCisgICAgICB0ZXN0cyB0aGF0IHRoZSBYTUwgb3V0cHV0IGlzIGV4cGVjdGVkLgorICAgICAgIiIiCisgICAgICBzZWxmLl9UZXN0WG1sT3V0cHV0KEdURVNUX1BST0dSQU1fTkFNRSwgRVhQRUNURURfTk9OX0VNUFRZX1hNTCwgMSkKKworICBkZWYgdGVzdEVtcHR5WG1sT3V0cHV0KHNlbGYpOgorICAgICIiIlZlcmlmaWVzIFhNTCBvdXRwdXQgZm9yIGEgR29vZ2xlIFRlc3QgYmluYXJ5IHdpdGhvdXQgYWN0dWFsIHRlc3RzLgorCisgICAgUnVucyBhIHRlc3QgcHJvZ3JhbSB0aGF0IGdlbmVyYXRlcyBhbiBlbXB0eSBYTUwgb3V0cHV0LCBhbmQKKyAgICB0ZXN0cyB0aGF0IHRoZSBYTUwgb3V0cHV0IGlzIGV4cGVjdGVkLgorICAgICIiIgorCisgICAgc2VsZi5fVGVzdFhtbE91dHB1dCgnZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdCcsIEVYUEVDVEVEX0VNUFRZX1hNTCwgMCkKKworICBkZWYgdGVzdFRpbWVzdGFtcFZhbHVlKHNlbGYpOgorICAgICIiIkNoZWNrcyB3aGV0aGVyIHRoZSB0aW1lc3RhbXAgYXR0cmlidXRlIGluIHRoZSBYTUwgb3V0cHV0IGlzIHZhbGlkLgorCisgICAgUnVucyBhIHRlc3QgcHJvZ3JhbSB0aGF0IGdlbmVyYXRlcyBhbiBlbXB0eSBYTUwgb3V0cHV0LCBhbmQgY2hlY2tzIGlmCisgICAgdGhlIHRpbWVzdGFtcCBhdHRyaWJ1dGUgaW4gdGhlIHRlc3RzdWl0ZXMgdGFnIGlzIHZhbGlkLgorICAgICIiIgorICAgIGFjdHVhbCA9IHNlbGYuX0dldFhtbE91dHB1dCgnZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdCcsIDApCisgICAgZGF0ZV90aW1lX3N0ciA9IGFjdHVhbC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndGltZXN0YW1wJykudmFsdWUKKyAgICAjIGRhdGV0aW1lLnN0cnB0aW1lKCkgaXMgb25seSBhdmFpbGFibGUgaW4gUHl0aG9uIDIuNSsgc28gd2UgaGF2ZSB0bworICAgICMgcGFyc2UgdGhlIGV4cGVjdGVkIGRhdGV0aW1lIG1hbnVhbGx5LgorICAgIG1hdGNoID0gcmUubWF0Y2gocicoXGQrKS0oXGRcZCktKFxkXGQpVChcZFxkKTooXGRcZCk6KFxkXGQpJywgZGF0ZV90aW1lX3N0cikKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIHJlLm1hdGNoLAorICAgICAgICAnWE1MIGRhdGV0dGltZSBzdHJpbmcgJXMgaGFzIGluY29ycmVjdCBmb3JtYXQnICUgZGF0ZV90aW1lX3N0cikKKyAgICBkYXRlX3RpbWVfZnJvbV94bWwgPSBkYXRldGltZS5kYXRldGltZSgKKyAgICAgICAgeWVhcj1pbnQobWF0Y2guZ3JvdXAoMSkpLCBtb250aD1pbnQobWF0Y2guZ3JvdXAoMikpLAorICAgICAgICBkYXk9aW50KG1hdGNoLmdyb3VwKDMpKSwgaG91cj1pbnQobWF0Y2guZ3JvdXAoNCkpLAorICAgICAgICBtaW51dGU9aW50KG1hdGNoLmdyb3VwKDUpKSwgc2Vjb25kPWludChtYXRjaC5ncm91cCg2KSkpCisKKyAgICB0aW1lX2RlbHRhID0gYWJzKGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpIC0gZGF0ZV90aW1lX2Zyb21feG1sKQorICAgICMgdGltZXN0YW1wIHZhbHVlIHNob3VsZCBiZSBuZWFyIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUKKyAgICBzZWxmLmFzc2VydFRydWUodGltZV9kZWx0YSA8IGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTYwMCksCisgICAgICAgICAgICAgICAgICAgICd0aW1lX2RlbHRhIGlzICVzJyAlIHRpbWVfZGVsdGEpCisgICAgYWN0dWFsLnVubGluaygpCisKKyAgZGVmIHRlc3REZWZhdWx0T3V0cHV0RmlsZShzZWxmKToKKyAgICAiIiIKKyAgICBDb25maXJtcyB0aGF0IEdvb2dsZSBUZXN0IHByb2R1Y2VzIGFuIFhNTCBvdXRwdXQgZmlsZSB3aXRoIHRoZSBleHBlY3RlZAorICAgIGRlZmF1bHQgbmFtZSBpZiBubyBuYW1lIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICAgICIiIgorICAgIG91dHB1dF9maWxlID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0RFRkFVTFRfT1VUUFVUX0ZJTEUpCisgICAgZ3Rlc3RfcHJvZ19wYXRoID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgICAgICdndGVzdF9ub190ZXN0X3VuaXR0ZXN0JykKKyAgICB0cnk6CisgICAgICBvcy5yZW1vdmUob3V0cHV0X2ZpbGUpCisgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgcmFpc2UKKworICAgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgICAgIFtndGVzdF9wcm9nX3BhdGgsICclcz14bWwnICUgR1RFU1RfT1VUUFVUX0ZMQUddLAorICAgICAgICB3b3JraW5nX2Rpcj1ndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSkKKyAgICBzZWxmLmFzc2VydF8ocC5leGl0ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgcC5leGl0X2NvZGUpCisgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNmaWxlKG91dHB1dF9maWxlKSkKKworICBkZWYgdGVzdFN1cHByZXNzZWRYbWxPdXRwdXQoc2VsZik6CisgICAgIiIiCisgICAgVGVzdHMgdGhhdCBubyBYTUwgZmlsZSBpcyBnZW5lcmF0ZWQgaWYgdGhlIGRlZmF1bHQgWE1MIGxpc3RlbmVyIGlzCisgICAgc2h1dCBkb3duIGJlZm9yZSBSVU5fQUxMX1RFU1RTIGlzIGludm9rZWQuCisgICAgIiIiCisKKyAgICB4bWxfcGF0aCA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9QUk9HUkFNX05BTUUgKyAnb3V0LnhtbCcpCisgICAgaWYgb3MucGF0aC5pc2ZpbGUoeG1sX3BhdGgpOgorICAgICAgb3MucmVtb3ZlKHhtbF9wYXRoKQorCisgICAgY29tbWFuZCA9IFtHVEVTVF9QUk9HUkFNX1BBVEgsCisgICAgICAgICAgICAgICAnJXM9eG1sOiVzJyAlIChHVEVTVF9PVVRQVVRfRkxBRywgeG1sX3BhdGgpLAorICAgICAgICAgICAgICAgJy0tc2h1dF9kb3duX3htbCddCisgICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQorICAgIGlmIHAudGVybWluYXRlZF9ieV9zaWduYWw6CisgICAgICAjIHAuc2lnbmFsIGlzIGF2YWxhYmxlIG9ubHkgaWYgcC50ZXJtaW5hdGVkX2J5X3NpZ25hbCBpcyBUcnVlLgorICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKKyAgICAgICAgICBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsLAorICAgICAgICAgICclcyB3YXMga2lsbGVkIGJ5IHNpZ25hbCAlZCcgJSAoR1RFU1RfUFJPR1JBTV9OQU1FLCBwLnNpZ25hbCkpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIHAuZXhpdF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZXhpdGVkIHdpdGggY29kZSAlcywgd2hpY2ggZG9lc24ndCBtYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAndGhlIGV4cGVjdGVkIGV4aXQgY29kZSAlcy4nCisgICAgICAgICAgICAgICAgICAgICAgICAlIChjb21tYW5kLCBwLmV4aXRfY29kZSwgMSkpCisKKyAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguaXNmaWxlKHhtbF9wYXRoKSkKKworICBkZWYgX0dldFhtbE91dHB1dChzZWxmLCBndGVzdF9wcm9nX25hbWUsIGV4cGVjdGVkX2V4aXRfY29kZSk6CisgICAgIiIiCisgICAgUmV0dXJucyB0aGUgeG1sIG91dHB1dCBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbSBndGVzdF9wcm9nX25hbWUuCisgICAgRnVydGhlcm1vcmUsIHRoZSBwcm9ncmFtJ3MgZXhpdCBjb2RlIG11c3QgYmUgZXhwZWN0ZWRfZXhpdF9jb2RlLgorICAgICIiIgorICAgIHhtbF9wYXRoID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X3Byb2dfbmFtZSArICdvdXQueG1sJykKKyAgICBndGVzdF9wcm9nX3BhdGggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChndGVzdF9wcm9nX25hbWUpCisKKyAgICBjb21tYW5kID0gW2d0ZXN0X3Byb2dfcGF0aCwgJyVzPXhtbDolcycgJSAoR1RFU1RfT1VUUFVUX0ZMQUcsIHhtbF9wYXRoKV0KKyAgICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCisgICAgaWYgcC50ZXJtaW5hdGVkX2J5X3NpZ25hbDoKKyAgICAgIHNlbGYuYXNzZXJ0XyhGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAnJXMgd2FzIGtpbGxlZCBieSBzaWduYWwgJWQnICUgKGd0ZXN0X3Byb2dfbmFtZSwgcC5zaWduYWwpKQorICAgIGVsc2U6CisgICAgICBzZWxmLmFzc2VydF8ocC5leGl0ZWQpCisgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF9leGl0X2NvZGUsIHAuZXhpdF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZXhpdGVkIHdpdGggY29kZSAlcywgd2hpY2ggZG9lc24ndCBtYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAndGhlIGV4cGVjdGVkIGV4aXQgY29kZSAlcy4nCisgICAgICAgICAgICAgICAgICAgICAgICAlIChjb21tYW5kLCBwLmV4aXRfY29kZSwgZXhwZWN0ZWRfZXhpdF9jb2RlKSkKKyAgICBhY3R1YWwgPSBtaW5pZG9tLnBhcnNlKHhtbF9wYXRoKQorICAgIHJldHVybiBhY3R1YWwKKworICBkZWYgX1Rlc3RYbWxPdXRwdXQoc2VsZiwgZ3Rlc3RfcHJvZ19uYW1lLCBleHBlY3RlZF94bWwsIGV4cGVjdGVkX2V4aXRfY29kZSk6CisgICAgIiIiCisgICAgQXNzZXJ0cyB0aGF0IHRoZSBYTUwgZG9jdW1lbnQgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgdGhlIHByb2dyYW0KKyAgICBndGVzdF9wcm9nX25hbWUgbWF0Y2hlcyBleHBlY3RlZF94bWwsIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW5vdGhlcgorICAgIFhNTCBkb2N1bWVudC4gIEZ1cnRoZXJtb3JlLCB0aGUgcHJvZ3JhbSdzIGV4aXQgY29kZSBtdXN0IGJlCisgICAgZXhwZWN0ZWRfZXhpdF9jb2RlLgorICAgICIiIgorCisgICAgYWN0dWFsID0gc2VsZi5fR2V0WG1sT3V0cHV0KGd0ZXN0X3Byb2dfbmFtZSwgZXhwZWN0ZWRfZXhpdF9jb2RlKQorICAgIGV4cGVjdGVkID0gbWluaWRvbS5wYXJzZVN0cmluZyhleHBlY3RlZF94bWwpCisgICAgc2VsZi5Ob3JtYWxpemVYbWwoYWN0dWFsLmRvY3VtZW50RWxlbWVudCkKKyAgICBzZWxmLkFzc2VydEVxdWl2YWxlbnROb2RlcyhleHBlY3RlZC5kb2N1bWVudEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsLmRvY3VtZW50RWxlbWVudCkKKyAgICBleHBlY3RlZC51bmxpbmsoKQorICAgIGFjdHVhbC51bmxpbmsoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG9zLmVudmlyb25bJ0dURVNUX1NUQUNLX1RSQUNFX0RFUFRIJ10gPSAnMScKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBjODcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjCkBAIC0wLDAgKzEsMTc3IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisKKy8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QgWE1MIG91dHB1dC4KKy8vCisvLyBBIHVzZXIgY2FuIHNwZWNpZnkgWE1MIG91dHB1dCBpbiBhIEdvb2dsZSBUZXN0IHByb2dyYW0gdG8gcnVuIHZpYQorLy8gZWl0aGVyIHRoZSBHVEVTVF9PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlIC0tZ3Rlc3Rfb3V0cHV0CisvLyBmbGFnLiAgVGhpcyBpcyB1c2VkIGZvciB0ZXN0aW5nIHN1Y2ggZnVuY3Rpb25hbGl0eS4KKy8vCisvLyBUaGlzIHByb2dyYW0gd2lsbCBiZSBpbnZva2VkIGZyb20gYSBQeXRob24gdW5pdCB0ZXN0LiAgRG9uJ3QgcnVuIGl0CisvLyBkaXJlY3RseS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlczsKKworY2xhc3MgU3VjY2Vzc2Z1bFRlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitURVNUX0YoU3VjY2Vzc2Z1bFRlc3QsIFN1Y2NlZWRzKSB7CisgIFNVQ0NFRUQoKSA8PCAiVGhpcyBpcyBhIHN1Y2Nlc3MuIjsKKyAgQVNTRVJUX0VRKDEsIDEpOworfQorCitjbGFzcyBGYWlsZWRUZXN0IDogcHVibGljIFRlc3QgeworfTsKKworVEVTVF9GKEZhaWxlZFRlc3QsIEZhaWxzKSB7CisgIEFTU0VSVF9FUSgxLCAyKTsKK30KKworY2xhc3MgRGlzYWJsZWRUZXN0IDogcHVibGljIFRlc3QgeworfTsKKworVEVTVF9GKERpc2FibGVkVGVzdCwgRElTQUJMRURfdGVzdF9ub3RfcnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuIjsKK30KKworVEVTVChNaXhlZFJlc3VsdFRlc3QsIFN1Y2NlZWRzKSB7CisgIEVYUEVDVF9FUSgxLCAxKTsKKyAgQVNTRVJUX0VRKDEsIDEpOworfQorCitURVNUKE1peGVkUmVzdWx0VGVzdCwgRmFpbHMpIHsKKyAgRVhQRUNUX0VRKDEsIDIpOworICBBU1NFUlRfRVEoMiwgMyk7Cit9CisKK1RFU1QoTWl4ZWRSZXN1bHRUZXN0LCBESVNBQkxFRF90ZXN0KSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuIjsKK30KKworVEVTVChYbWxRdW90aW5nVGVzdCwgT3V0cHV0c0NEYXRhKSB7CisgIEZBSUwoKSA8PCAiWE1MIG91dHB1dDogIgorICAgICAgICAgICAgIjw/eG1sIGVuY29kaW5nPVwidXRmLThcIj48dG9wPjwhW0NEQVRBW2NkYXRhIHRleHRdXT48L3RvcD4iOworfQorCisvLyBIZWxwcyB0byB0ZXN0IHRoYXQgaW52YWxpZCBjaGFyYWN0ZXJzIHByb2R1Y2VkIGJ5IHRlc3QgY29kZSBkbyBub3QgbWFrZQorLy8gaXQgaW50byB0aGUgWE1MIGZpbGUuCitURVNUKEludmFsaWRDaGFyYWN0ZXJzVGVzdCwgSW52YWxpZENoYXJhY3RlcnNJbk1lc3NhZ2UpIHsKKyAgRkFJTCgpIDw8ICJJbnZhbGlkIGNoYXJhY3RlcnMgaW4gYnJhY2tldHMgW1x4MVx4Ml0iOworfQorCitjbGFzcyBQcm9wZXJ0eVJlY29yZGluZ1Rlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitURVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBPbmVQcm9wZXJ0eSkgeworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworfQorCitURVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBJbnRWYWx1ZWRQcm9wZXJ0eSkgeworICBSZWNvcmRQcm9wZXJ0eSgia2V5X2ludCIsIDEpOworfQorCitURVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBUaHJlZVByb3BlcnRpZXMpIHsKKyAgUmVjb3JkUHJvcGVydHkoImtleV8xIiwgIjEiKTsKKyAgUmVjb3JkUHJvcGVydHkoImtleV8yIiwgIjIiKTsKKyAgUmVjb3JkUHJvcGVydHkoImtleV8zIiwgIjMiKTsKK30KKworVEVTVF9GKFByb3BlcnR5UmVjb3JkaW5nVGVzdCwgVHdvVmFsdWVzRm9yT25lS2V5VXNlc0xhc3RWYWx1ZSkgeworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMiIpOworfQorCitURVNUKE5vRml4dHVyZVRlc3QsIFJlY29yZFByb3BlcnR5KSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXkiLCAiMSIpOworfQorCit2b2lkIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgaW50IHZhbHVlKSB7CisgIHRlc3Rpbmc6OlRlc3Q6OlJlY29yZFByb3BlcnR5KGtleSwgdmFsdWUpOworfQorCit2b2lkIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgdGVzdGluZzo6VGVzdDo6UmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZSk7Cit9CisKK1RFU1QoTm9GaXh0dXJlVGVzdCwgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkSW50VmFsdWVkUHJvcGVydHkpIHsKKyAgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkUHJvcGVydHkoImtleV9mb3JfdXRpbGl0eV9pbnQiLCAxKTsKK30KKworVEVTVChOb0ZpeHR1cmVUZXN0LCBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRTdHJpbmdWYWx1ZWRQcm9wZXJ0eSkgeworICBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRQcm9wZXJ0eSgia2V5X2Zvcl91dGlsaXR5X3N0cmluZyIsICIxIik7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHRlc3QgcGFyYW1ldGVyIHZhbHVlIGlzIG91dHB1dCBpbiB0aGUgJ3ZhbHVlX3BhcmFtJworLy8gWE1MIGF0dHJpYnV0ZSBmb3IgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KK2NsYXNzIFZhbHVlUGFyYW1UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7fTsKK1RFU1RfUChWYWx1ZVBhcmFtVGVzdCwgSGFzVmFsdWVQYXJhbUF0dHJpYnV0ZSkge30KK1RFU1RfUChWYWx1ZVBhcmFtVGVzdCwgQW5vdGhlclRlc3RUaGF0SGFzVmFsdWVQYXJhbUF0dHJpYnV0ZSkge30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNpbmdsZSwgVmFsdWVQYXJhbVRlc3QsIFZhbHVlcygzMywgNDIpKTsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisvLyBWZXJpZmllcyB0aGF0IHRoZSB0eXBlIHBhcmFtZXRlciBuYW1lIGlzIG91dHB1dCBpbiB0aGUgJ3R5cGVfcGFyYW0nCisvLyBYTUwgYXR0cmlidXRlIGZvciB0eXBlZCB0ZXN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8aW50LCBsb25nPiBUeXBlZFRlc3RUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QsIFR5cGVkVGVzdFR5cGVzKTsKK1RZUEVEX1RFU1QoVHlwZWRUZXN0LCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpIHt9CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHR5cGUgcGFyYW1ldGVyIG5hbWUgaXMgb3V0cHV0IGluIHRoZSAndHlwZV9wYXJhbScKKy8vIFhNTCBhdHRyaWJ1dGUgZm9yIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIDogcHVibGljIFRlc3Qge307CitUWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlKTsKK1RZUEVEX1RFU1RfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpIHt9CitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpOwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGxvbmc+IFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2VUeXBlczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFNpbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlVHlwZXMpOworI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLS1zaHV0X2Rvd25feG1sIikgPT0gMCkgeworICAgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOworICAgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkpOworICB9CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGU1YTEwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfdGVzdF91dGlscy5weQpAQCAtMCwwICsxLDE5MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IHV0aWxpdGllcyBmb3IgZ3Rlc3RfeG1sX291dHB1dCIiIgorCitfX2F1dGhvcl9fID0gJ2VlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKScKKworaW1wb3J0IHJlCitmcm9tIHhtbC5kb20gaW1wb3J0IG1pbmlkb20sIE5vZGUKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworCitHVEVTVF9PVVRQVVRfRkxBRyAgICAgICAgID0gJy0tZ3Rlc3Rfb3V0cHV0JworR1RFU1RfREVGQVVMVF9PVVRQVVRfRklMRSA9ICd0ZXN0X2RldGFpbC54bWwnCisKK2NsYXNzIEdUZXN0WE1MVGVzdENhc2UoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIgorICBCYXNlIGNsYXNzIGZvciB0ZXN0cyBvZiBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgZnVuY3Rpb25hbGl0eS4KKyAgIiIiCisKKworICBkZWYgQXNzZXJ0RXF1aXZhbGVudE5vZGVzKHNlbGYsIGV4cGVjdGVkX25vZGUsIGFjdHVhbF9ub2RlKToKKyAgICAiIiIKKyAgICBBc3NlcnRzIHRoYXQgYWN0dWFsX25vZGUgKGEgRE9NIG5vZGUgb2JqZWN0KSBpcyBlcXVpdmFsZW50IHRvCisgICAgZXhwZWN0ZWRfbm9kZSAoYW5vdGhlciBET00gbm9kZSBvYmplY3QpLCBpbiB0aGF0IGVpdGhlciBib3RoIG9mCisgICAgdGhlbSBhcmUgQ0RBVEEgbm9kZXMgYW5kIGhhdmUgdGhlIHNhbWUgdmFsdWUsIG9yIGJvdGggYXJlIERPTQorICAgIGVsZW1lbnRzIGFuZCBhY3R1YWxfbm9kZSBtZWV0cyBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiAgSXQgaGFzIHRoZSBzYW1lIHRhZyBuYW1lIGFzIGV4cGVjdGVkX25vZGUuCisgICAgKiAgSXQgaGFzIHRoZSBzYW1lIHNldCBvZiBhdHRyaWJ1dGVzIGFzIGV4cGVjdGVkX25vZGUsIGVhY2ggd2l0aAorICAgICAgIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiBleHBlY3RlZF9ub2RlLgorICAgICAgIEV4Y2VwdGlvbnMgYXJlIGFueSBhdHRyaWJ1dGUgbmFtZWQgInRpbWUiLCB3aGljaCBuZWVkcyBvbmx5IGJlCisgICAgICAgY29udmVydGlibGUgdG8gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYW5kIGFueSBhdHRyaWJ1dGUgbmFtZWQKKyAgICAgICAidHlwZV9wYXJhbSIgd2hpY2ggb25seSBoYXMgdG8gYmUgbm9uLWVtcHR5LgorICAgICogIEl0IGhhcyBhbiBlcXVpdmFsZW50IHNldCBvZiBjaGlsZCBub2RlcyAoaW5jbHVkaW5nIGVsZW1lbnRzIGFuZAorICAgICAgIENEQVRBIHNlY3Rpb25zKSBhcyBleHBlY3RlZF9ub2RlLiAgTm90ZSB0aGF0IHdlIGlnbm9yZSB0aGUKKyAgICAgICBvcmRlciBvZiB0aGUgY2hpbGRyZW4gYXMgdGhleSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgaW4gYW55CisgICAgICAgcGFydGljdWxhciBvcmRlci4KKyAgICAiIiIKKworICAgIGlmIGV4cGVjdGVkX25vZGUubm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREU6CisgICAgICBzZWxmLmFzc2VydEVxdWFscyhOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSwgYWN0dWFsX25vZGUubm9kZVR5cGUpCisgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF9ub2RlLm5vZGVWYWx1ZSwgYWN0dWFsX25vZGUubm9kZVZhbHVlKQorICAgICAgcmV0dXJuCisKKyAgICBzZWxmLmFzc2VydEVxdWFscyhOb2RlLkVMRU1FTlRfTk9ERSwgYWN0dWFsX25vZGUubm9kZVR5cGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIGV4cGVjdGVkX25vZGUubm9kZVR5cGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfbm9kZS50YWdOYW1lLCBhY3R1YWxfbm9kZS50YWdOYW1lKQorCisgICAgZXhwZWN0ZWRfYXR0cmlidXRlcyA9IGV4cGVjdGVkX25vZGUuYXR0cmlidXRlcworICAgIGFjdHVhbF9hdHRyaWJ1dGVzICAgPSBhY3R1YWxfbm9kZSAgLmF0dHJpYnV0ZXMKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgZXhwZWN0ZWRfYXR0cmlidXRlcy5sZW5ndGgsIGFjdHVhbF9hdHRyaWJ1dGVzLmxlbmd0aCwKKyAgICAgICAgJ2F0dHJpYnV0ZSBudW1iZXJzIGRpZmZlciBpbiBlbGVtZW50ICcgKyBhY3R1YWxfbm9kZS50YWdOYW1lKQorICAgIGZvciBpIGluIHJhbmdlKGV4cGVjdGVkX2F0dHJpYnV0ZXMubGVuZ3RoKToKKyAgICAgIGV4cGVjdGVkX2F0dHIgPSBleHBlY3RlZF9hdHRyaWJ1dGVzLml0ZW0oaSkKKyAgICAgIGFjdHVhbF9hdHRyICAgPSBhY3R1YWxfYXR0cmlidXRlcy5nZXQoZXhwZWN0ZWRfYXR0ci5uYW1lKQorICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgIGFjdHVhbF9hdHRyIGlzIG5vdCBOb25lLAorICAgICAgICAgICdleHBlY3RlZCBhdHRyaWJ1dGUgJXMgbm90IGZvdW5kIGluIGVsZW1lbnQgJXMnICUKKyAgICAgICAgICAoZXhwZWN0ZWRfYXR0ci5uYW1lLCBhY3R1YWxfbm9kZS50YWdOYW1lKSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2F0dHIudmFsdWUsIGFjdHVhbF9hdHRyLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgJyB2YWx1ZXMgb2YgYXR0cmlidXRlICVzIGluIGVsZW1lbnQgJXMgZGlmZmVyJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfYXR0ci5uYW1lLCBhY3R1YWxfbm9kZS50YWdOYW1lKSkKKworICAgIGV4cGVjdGVkX2NoaWxkcmVuID0gc2VsZi5fR2V0Q2hpbGRyZW4oZXhwZWN0ZWRfbm9kZSkKKyAgICBhY3R1YWxfY2hpbGRyZW4gPSBzZWxmLl9HZXRDaGlsZHJlbihhY3R1YWxfbm9kZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgbGVuKGV4cGVjdGVkX2NoaWxkcmVuKSwgbGVuKGFjdHVhbF9jaGlsZHJlbiksCisgICAgICAgICdudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMgZGlmZmVyIGluIGVsZW1lbnQgJyArIGFjdHVhbF9ub2RlLnRhZ05hbWUpCisgICAgZm9yIGNoaWxkX2lkLCBjaGlsZCBpbiBleHBlY3RlZF9jaGlsZHJlbi5pdGVyaXRlbXMoKToKKyAgICAgIHNlbGYuYXNzZXJ0XyhjaGlsZF9pZCBpbiBhY3R1YWxfY2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgJzwlcz4gaXMgbm90IGluIDwlcz4gKGluIGVsZW1lbnQgJXMpJyAlCisgICAgICAgICAgICAgICAgICAgKGNoaWxkX2lkLCBhY3R1YWxfY2hpbGRyZW4sIGFjdHVhbF9ub2RlLnRhZ05hbWUpKQorICAgICAgc2VsZi5Bc3NlcnRFcXVpdmFsZW50Tm9kZXMoY2hpbGQsIGFjdHVhbF9jaGlsZHJlbltjaGlsZF9pZF0pCisKKyAgaWRlbnRpZnlpbmdfYXR0cmlidXRlID0geworICAgICd0ZXN0c3VpdGVzJzogJ25hbWUnLAorICAgICd0ZXN0c3VpdGUnOiAnbmFtZScsCisgICAgJ3Rlc3RjYXNlJzogICduYW1lJywKKyAgICAnZmFpbHVyZSc6ICAgJ21lc3NhZ2UnLAorICAgIH0KKworICBkZWYgX0dldENoaWxkcmVuKHNlbGYsIGVsZW1lbnQpOgorICAgICIiIgorICAgIEZldGNoZXMgYWxsIG9mIHRoZSBjaGlsZCBub2RlcyBvZiBlbGVtZW50LCBhIERPTSBFbGVtZW50IG9iamVjdC4KKyAgICBSZXR1cm5zIHRoZW0gYXMgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIElEcyBvZiB0aGUKKyAgICBjaGlsZHJlbi4gIEZvciA8dGVzdHN1aXRlcz4sIDx0ZXN0c3VpdGU+IGFuZCA8dGVzdGNhc2U+IGVsZW1lbnRzLCB0aGUgSUQKKyAgICBpcyB0aGUgdmFsdWUgb2YgdGhlaXIgIm5hbWUiIGF0dHJpYnV0ZTsgZm9yIDxmYWlsdXJlPiBlbGVtZW50cywgaXQgaXMKKyAgICB0aGUgdmFsdWUgb2YgdGhlICJtZXNzYWdlIiBhdHRyaWJ1dGU7IENEQVRBIHNlY3Rpb25zIGFuZCBub24td2hpdGVzcGFjZQorICAgIHRleHQgbm9kZXMgYXJlIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIENEQVRBIHNlY3Rpb24gd2l0aCBJRAorICAgICJkZXRhaWwiLiAgQW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBhYm92ZQorICAgIGZvdXIgaXMgZW5jb3VudGVyZWQsIGlmIHR3byBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGlkZW50aWZ5aW5nCisgICAgYXR0cmlidXRlcyBhcmUgZW5jb3VudGVyZWQsIG9yIGlmIGFueSBvdGhlciB0eXBlIG9mIG5vZGUgaXMgZW5jb3VudGVyZWQuCisgICAgIiIiCisKKyAgICBjaGlsZHJlbiA9IHt9CisgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKKyAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICBzZWxmLmFzc2VydF8oY2hpbGQudGFnTmFtZSBpbiBzZWxmLmlkZW50aWZ5aW5nX2F0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICdFbmNvdW50ZXJlZCB1bmtub3duIGVsZW1lbnQgPCVzPicgJSBjaGlsZC50YWdOYW1lKQorICAgICAgICBjaGlsZElEID0gY2hpbGQuZ2V0QXR0cmlidXRlKHNlbGYuaWRlbnRpZnlpbmdfYXR0cmlidXRlW2NoaWxkLnRhZ05hbWVdKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hpbGRJRCBub3QgaW4gY2hpbGRyZW4pCisgICAgICAgIGNoaWxkcmVuW2NoaWxkSURdID0gY2hpbGQKKyAgICAgIGVsaWYgY2hpbGQubm9kZVR5cGUgaW4gW05vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERV06CisgICAgICAgIGlmICdkZXRhaWwnIG5vdCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUgb3IKKyAgICAgICAgICAgICAgbm90IGNoaWxkLm5vZGVWYWx1ZS5pc3NwYWNlKCkpOgorICAgICAgICAgICAgY2hpbGRyZW5bJ2RldGFpbCddID0gY2hpbGQub3duZXJEb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oCisgICAgICAgICAgICAgICAgY2hpbGQubm9kZVZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGNoaWxkcmVuWydkZXRhaWwnXS5ub2RlVmFsdWUgKz0gY2hpbGQubm9kZVZhbHVlCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLmZhaWwoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgbm9kZSB0eXBlICVkJyAlIGNoaWxkLm5vZGVUeXBlKQorICAgIHJldHVybiBjaGlsZHJlbgorCisgIGRlZiBOb3JtYWxpemVYbWwoc2VsZiwgZWxlbWVudCk6CisgICAgIiIiCisgICAgTm9ybWFsaXplcyBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgdG8gZWxpbWluYXRlIHJlZmVyZW5jZXMgdG8gdHJhbnNpZW50CisgICAgaW5mb3JtYXRpb24gdGhhdCBtYXkgY2hhbmdlIGZyb20gcnVuIHRvIHJ1bi4KKworICAgICogIFRoZSAidGltZSIgYXR0cmlidXRlIG9mIDx0ZXN0c3VpdGVzPiwgPHRlc3RzdWl0ZT4gYW5kIDx0ZXN0Y2FzZT4KKyAgICAgICBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIGFzdGVyaXNrLCBpZiBpdCBjb250YWlucworICAgICAgIG9ubHkgZGlnaXQgY2hhcmFjdGVycy4KKyAgICAqICBUaGUgInRpbWVzdGFtcCIgYXR0cmlidXRlIG9mIDx0ZXN0c3VpdGVzPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEKKyAgICAgICBzaW5nbGUgYXN0ZXJpc2ssIGlmIGl0IGNvbnRhaW5zIGEgdmFsaWQgSVNPODYwMSBkYXRldGltZSB2YWx1ZS4KKyAgICAqICBUaGUgInR5cGVfcGFyYW0iIGF0dHJpYnV0ZSBvZiA8dGVzdGNhc2U+IGVsZW1lbnRzIGlzIHJlcGxhY2VkIHdpdGggYQorICAgICAgIHNpbmdsZSBhc3RlcmlzayAoaWYgaXQgc24gbm9uLWVtcHR5KSBhcyBpdCBpcyB0aGUgdHlwZSBuYW1lIHJldHVybmVkCisgICAgICAgYnkgdGhlIGNvbXBpbGVyIGFuZCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuCisgICAgKiAgVGhlIGxpbmUgaW5mbyByZXBvcnRlZCBpbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgIm1lc3NhZ2UiCisgICAgICAgYXR0cmlidXRlIGFuZCBDREFUQSBzZWN0aW9uIG9mIDxmYWlsdXJlPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIHRoZQorICAgICAgIGZpbGUncyBiYXNlbmFtZSBhbmQgYSBzaW5nbGUgYXN0ZXJpc2sgZm9yIHRoZSBsaW5lIG51bWJlci4KKyAgICAqICBUaGUgZGlyZWN0b3J5IG5hbWVzIGluIGZpbGUgcGF0aHMgYXJlIHJlbW92ZWQuCisgICAgKiAgVGhlIHN0YWNrIHRyYWNlcyBhcmUgcmVtb3ZlZC4KKyAgICAiIiIKKworICAgIGlmIGVsZW1lbnQudGFnTmFtZSA9PSAndGVzdHN1aXRlcyc6CisgICAgICB0aW1lc3RhbXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3RpbWVzdGFtcCcpCisgICAgICB0aW1lc3RhbXAudmFsdWUgPSByZS5zdWIocideXGR7NH0tXGRcZC1cZFxkVFxkXGQ6XGRcZDpcZFxkJCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyonLCB0aW1lc3RhbXAudmFsdWUpCisgICAgaWYgZWxlbWVudC50YWdOYW1lIGluICgndGVzdHN1aXRlcycsICd0ZXN0c3VpdGUnLCAndGVzdGNhc2UnKToKKyAgICAgIHRpbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3RpbWUnKQorICAgICAgdGltZS52YWx1ZSA9IHJlLnN1YihyJ15cZCsoXC5cZCspPyQnLCAnKicsIHRpbWUudmFsdWUpCisgICAgICB0eXBlX3BhcmFtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCd0eXBlX3BhcmFtJykKKyAgICAgIGlmIHR5cGVfcGFyYW0gYW5kIHR5cGVfcGFyYW0udmFsdWU6CisgICAgICAgIHR5cGVfcGFyYW0udmFsdWUgPSAnKicKKyAgICBlbGlmIGVsZW1lbnQudGFnTmFtZSA9PSAnZmFpbHVyZSc6CisgICAgICBzb3VyY2VfbGluZV9wYXQgPSByJ14uKlsvXFxdKC4qOilcZCtcbicKKyAgICAgICMgUmVwbGFjZXMgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHdpdGggYSBub3JtYWxpemVkIGZvcm0uCisgICAgICBtZXNzYWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCdtZXNzYWdlJykKKyAgICAgIG1lc3NhZ2UudmFsdWUgPSByZS5zdWIoc291cmNlX2xpbmVfcGF0LCAnXFwxKlxuJywgbWVzc2FnZS52YWx1ZSkKKyAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICAgICMgUmVwbGFjZXMgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHdpdGggYSBub3JtYWxpemVkIGZvcm0uCisgICAgICAgICAgY2RhdGEgPSByZS5zdWIoc291cmNlX2xpbmVfcGF0LCAnXFwxKlxuJywgY2hpbGQubm9kZVZhbHVlKQorICAgICAgICAgICMgUmVtb3ZlcyB0aGUgYWN0dWFsIHN0YWNrIHRyYWNlLgorICAgICAgICAgIGNoaWxkLm5vZGVWYWx1ZSA9IHJlLnN1YihyJ1xuU3RhY2sgdHJhY2U6XG4oLnxcbikqJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsIGNkYXRhKQorICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CisgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgc2VsZi5Ob3JtYWxpemVYbWwoY2hpbGQpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvcHJvZHVjdGlvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9wcm9kdWN0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGE0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3Rlc3QvcHJvZHVjdGlvbi5jYwpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgaXMgcGFydCBvZiB0aGUgdW5pdCB0ZXN0IGZvciBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaC4KKworI2luY2x1ZGUgInByb2R1Y3Rpb24uaCIKKworUHJpdmF0ZUNvZGU6OlByaXZhdGVDb2RlKCkgOiB4XygwKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC90ZXN0L3Byb2R1Y3Rpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9wcm9kdWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZDVlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QvdGVzdC9wcm9kdWN0aW9uLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGlzIHBhcnQgb2YgdGhlIHVuaXQgdGVzdCBmb3IgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmguCisKKyNpZm5kZWYgR1RFU1RfVEVTVF9QUk9EVUNUSU9OX0hfCisjZGVmaW5lIEdURVNUX1RFU1RfUFJPRFVDVElPTl9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJvZC5oIgorCitjbGFzcyBQcml2YXRlQ29kZSB7CisgcHVibGljOgorICAvLyBEZWNsYXJlcyBhIGZyaWVuZCB0ZXN0IHRoYXQgZG9lcyBub3QgdXNlIGEgZml4dHVyZS4KKyAgRlJJRU5EX1RFU1QoUHJpdmF0ZUNvZGVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycyk7CisKKyAgLy8gRGVjbGFyZXMgYSBmcmllbmQgdGVzdCB0aGF0IHVzZXMgYSBmaXh0dXJlLgorICBGUklFTkRfVEVTVChQcml2YXRlQ29kZUZpeHR1cmVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycyk7CisKKyAgUHJpdmF0ZUNvZGUoKTsKKworICBpbnQgeCgpIGNvbnN0IHsgcmV0dXJuIHhfOyB9CisgcHJpdmF0ZToKKyAgdm9pZCBzZXRfeChpbnQgYW5feCkgeyB4XyA9IGFuX3g7IH0KKyAgaW50IHhfOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9URVNUX1BST0RVQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY4MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9Db25maWcvRGVidWdQcm9qZWN0LnhjY29uZmlnCkBAIC0wLDAgKzEsMzAgQEAKKy8vCisvLyAgRGVidWdQcm9qZWN0LnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBEZWJ1ZyBDb25maWd1cmF0aW9uIHByb2plY3Qgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kCisvLyAgZXhhbXBsZXMuIEl0IGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJQcm9qZWN0IiBpbmZvCisvLyAgZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisjaW5jbHVkZSAiR2VuZXJhbC54Y2NvbmZpZyIKKworLy8gTm8gb3B0aW1pemF0aW9uCitHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMAorCisvLyBEZXBsb3ltZW50IHBvc3Rwcm9jZXNzaW5nIGlzIHdoYXQgdHJpZ2dlcnMgWGNvZGUgdG8gc3RyaXAsIHR1cm4gaXQgb2ZmCitERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk8KKworLy8gRGVhZCBjb2RlIHN0cmlwcGluZyBvZmYKK0RFQURfQ09ERV9TVFJJUFBJTkcgPSBOTworCisvLyBEZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBvbiBvYnZpb3VzbHkKK0dDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUworCisvLyBEZWZpbmUgdGhlIERFQlVHIG1hY3JvIGluIGFsbCBkZWJ1ZyBidWlsZHMKK09USEVSX0NGTEFHUyA9ICQoT1RIRVJfQ0ZMQUdTKSAtRERFQlVHPTEKKworLy8gVGhlc2UgYXJlIHR1cm5lZCBvZmYgdG8gYXZvaWQgU1RMIGluY29tcGF0aWJpbGl0aWVzIHdpdGggY2xpZW50IGNvZGUKKy8vIC8vIFR1cm5zIG9uIHNwZWNpYWwgQysrIFNUTCBjaGVja3MgdG8gImVuY291cmFnZSIgZ29vZCBTVEwgdXNlCisvLyBHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TKSBfR0xJQkNYWF9ERUJVR19QRURBTlRJQyBfR0xJQkNYWF9ERUJVRyBfR0xJQkNQUF9DT05DRVBUX0NIRUNLUwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1N2IxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL0NvbmZpZy9GcmFtZXdvcmtUYXJnZXQueGNjb25maWcKQEAgLTAsMCArMSwxNyBAQAorLy8KKy8vICBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIEZyYW1ld29yayB0YXJnZXQgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kIGV4YW1wbGVzLiBJdAorLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBEeW5hbWljIGxpYnMgbmVlZCB0byBiZSBwb3NpdGlvbiBpbmRlcGVuZGVudAorR0NDX0RZTkFNSUNfTk9fUElDID0gTk8KKworLy8gRHluYW1pYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBleHRlcm5hbCBzeW1ib2xzIHN0cmlwcGVkLgorU1RSSVBfU1RZTEUgPSBub24tZ2xvYmFsCisKKy8vIExldCB0aGUgdXNlciBpbnN0YWxsIGJ5IHNwZWNpZnlpbmcgdGhlICREU1RST09UIHdpdGggeGNvZGVidWlsZAorU0tJUF9JTlNUQUxMID0gTk8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2UzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnCkBAIC0wLDAgKzEsNDEgQEAKKy8vCisvLyAgR2VuZXJhbC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgR2VuZXJhbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrIGFuZAorLy8gIGV4YW1wbGVzLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBCdWlsZCBmb3IgUFBDIGFuZCBJbnRlbCwgMzItIGFuZCA2NC1iaXQKK0FSQ0hTID0gaTM4NiB4ODZfNjQgcHBjIHBwYzY0CisKKy8vIFplcm9saW5rIHByZXZlbnRzIGxpbmsgd2FybmluZ3Mgc28gdHVybiBpdCBvZmYKK1pFUk9fTElOSyA9IE5PCisKKy8vIFByZWJpbmRpbmcgY29uc2lkZXJlZCB1bmhlbHBmdWwgaW4gMTAuMyBhbmQgbGF0ZXIKK1BSRUJJTkRJTkcgPSBOTworCisvLyBTdHJpY3Rlc3Qgd2FybmluZyBwb2xpY3kKK1dBUk5JTkdfQ0ZMQUdTID0gLVdhbGwgLVdlcnJvciAtV2VuZGlmLWxhYmVscyAtV25ld2xpbmUtZW9mIC1Xbm8tc2lnbi1jb21wYXJlIC1Xc2hhZG93CisKKy8vIFdvcmsgYXJvdW5kIFhjb2RlIGJ1Z3MgYnkgdXNpbmcgZXh0ZXJuYWwgc3RyaXAuIFNlZToKKy8vIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvWGNvZGUtdXNlcnMvMjAwNi9GZWIvbXNnMDAwNTAuaHRtbAorU0VQQVJBVEVfU1RSSVAgPSBZRVMKKworLy8gRm9yY2UgQzk5IGRpYWxlY3QKK0dDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gYzk5CisKKy8vIG5vdCBzdXJlIHdoeSBhcHBsZSBkZWZhdWx0cyB0aGlzIG9uLCBidXQgaXQncyBwcmV0dHkgcmlza3kKK0FMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5PCisKKy8vIFR1cm4gb24gcG9zaXRpb24gZGVwZW5kZW50IGNvZGUgZm9yIG1vc3QgY2FzZXMgKG92ZXJyaWRkZW4gd2hlcmUgYXBwcm9wcmlhdGUpCitHQ0NfRFlOQU1JQ19OT19QSUMgPSBZRVMKKworLy8gRGVmYXVsdCBTREsgYW5kIG1pbmltdW0gT1MgdmVyc2lvbiBpcyAxMC40CitTREtST09UID0gJChERVZFTE9QRVJfU0RLX0RJUikvTWFjT1NYMTAuNHUuc2RrCitNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAxMC40CitHQ0NfVkVSU0lPTiA9IDQuMAorCisvLyBWRVJTSU9OSU5HIEJVSUxEIFNFVFRJTkdTICh1c2VkIGluIEluZm8ucGxpc3QpCitHVEVTVF9WRVJTSU9OSU5GT19BQk9VVCA9ICDCqSAyMDA4IEdvb2dsZSBJbmMuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvQ29uZmlnL1JlbGVhc2VQcm9qZWN0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDlmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZwpAQCAtMCwwICsxLDMyIEBACisvLworLy8gIFJlbGVhc2VQcm9qZWN0LnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBSZWxlYXNlIENvbmZpZ3VyYXRpb24gcHJvamVjdCBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yaworLy8gIGFuZCBleGFtcGxlcy4gSXQgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlByb2plY3QiIGluZm8KKy8vICBkaWFsb2cuCisvLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgorLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLworLy8gCisKKyNpbmNsdWRlICJHZW5lcmFsLnhjY29uZmlnIgorCisvLyBzdWJjb25maWcvUmVsZWFzZS54Y2NvbmZpZworCisvLyBPcHRpbWl6ZSBmb3Igc3BhY2UgYW5kIHNpemUgKEFwcGxlIHJlY29tbWVuZGF0aW9uKQorR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IHMKKworLy8gRGVwbG9tZW50IHBvc3Rwcm9jZXNzaW5nIGlzIHdoYXQgdHJpZ2dlcnMgWGNvZGUgdG8gc3RyaXAKK0RFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBZRVMKKworLy8gTm8gc3ltYm9scworR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk8KKworLy8gRGVhZCBjb2RlIHN0cmlwIGRvZXMgbm90IGFmZmVjdCBPYmpDIGNvZGUgYnV0IGNhbiBoZWxwIGZvciBDCitERUFEX0NPREVfU1RSSVBQSU5HID0gWUVTCisKKy8vIE5ERUJVRyBpcyB1c2VkIGJ5IHRoaW5ncyBsaWtlIGFzc2VydC5oLCBzbyBkZWZpbmUgaXQgZm9yIGdlbmVyYWwgY29tcGF0LgorLy8gQVNTRVJUIGdvaW5nIGF3YXkgaW4gcmVsZWFzZSB0ZW5kcyB0byBjcmVhdGUgdW51c2VkIHZhcnMuCitPVEhFUl9DRkxBR1MgPSAkKE9USEVSX0NGTEFHUykgLUROREVCVUc9MSAtV25vLXVudXNlZC12YXJpYWJsZQorCisvLyBXaGVuIHdlIHN0cmlwIHdlIHdhbnQgdG8gc3RyaXAgYWxsIHN5bWJvbHMgaW4gcmVsZWFzZSwgYnV0IHNhdmUgZXh0ZXJuYWxzLgorU1RSSVBfU1RZTEUgPSBhbGwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjJmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnCkBAIC0wLDAgKzEsMTggQEAKKy8vCisvLyAgU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgc3RhdGljIGxpYnJhcnkgdGFyZ2V0IHNldHRpbmdzIGZvciBsaWJndGVzdC5hLiBJdAorLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBTdGF0aWMgbGlicyBjYW4gYmUgaW5jbHVkZWQgaW4gYnVuZGxlcyBzbyBtYWtlIHRoZW0gcG9zaXRpb24gaW5kZXBlbmRlbnQKK0dDQ19EWU5BTUlDX05PX1BJQyA9IE5PCisKKy8vIFN0YXRpYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBpbnRlcm5hbCBnbG9iYWxzIG9yIGV4dGVybmFsIHN5bWJvbHMKKy8vIHN0cmlwcGVkLgorU1RSSVBfU1RZTEUgPSBkZWJ1Z2dpbmcKKworLy8gTGV0IHRoZSB1c2VyIGluc3RhbGwgYnkgc3BlY2lmeWluZyB0aGUgJERTVFJPT1Qgd2l0aCB4Y29kZWJ1aWxkCitTS0lQX0lOU1RBTEwgPSBOTwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9Db25maWcvVGVzdFRhcmdldC54Y2NvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2NTJiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcKQEAgLTAsMCArMSw4IEBACisvLworLy8gIFRlc3RUYXJnZXQueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIFRlc3QgdGFyZ2V0IHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrIGFuZCBleGFtcGxlcy4gSXQKKy8vICBpcyBzZXQgaW4gdGhlICJCYXNlZCBPbjoiIGRyb3Bkb3duIGluIHRoZSAiVGFyZ2V0IiBpbmZvIGRpYWxvZy4KKworUFJPRFVDVF9OQU1FID0gJChUQVJHRVRfTkFNRSkKK0hFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi9pbmNsdWRlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1Jlc291cmNlcy9JbmZvLnBsaXN0IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQyOGVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20uZ29vZ2xlLiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Rk1XSzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+R1RFU1RfVkVSU0lPTklORk9fTE9ORzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPkdURVNUX1ZFUlNJT05JTkZPX1NIT1JUPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfSBHVEVTVF9WRVJTSU9OSU5GT19MT05HLCAke0dURVNUX1ZFUlNJT05JTkZPX0FCT1VUfTwvc3RyaW5nPgorCTxrZXk+TlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0PC9rZXk+CisJPHN0cmluZz4ke0dURVNUX1ZFUlNJT05JTkZPX0FCT1VUfTwvc3RyaW5nPgorCTxrZXk+Q1NSZXNvdXJjZXNGaWxlTWFwcGVkPC9rZXk+CisJPHRydWUvPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg1MmVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS5nb29nbGUuZ3Rlc3QuJHtQUk9EVUNUX05BTUU6aWRlbnRpZmllcn08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5GTVdLPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNTUmVzb3VyY2VzRmlsZU1hcHBlZDwva2V5PgorCTx0cnVlLz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL1dpZGdldEZyYW1ld29yay54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc2MTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMCwwICsxLDQ1NyBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQyOworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisJCTQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RSAvKiBUZXN0ICovID0geworCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwMjREMTY5MTEzRDdENDYwMEM3MDU5RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVGVzdCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDI0RDE2MTExM0Q3RDI0MDBDNzA1OUUgLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwMjREMTY2MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0OworCQkJcHJvZHVjdE5hbWUgPSBUZXN0QW5kQnVpbGQ7CisJCX07CisJCTQwMjREMUU5MTEzRDgzRkYwMEM3MDU5RSAvKiBUZXN0QW5kQnVpbGQgKi8gPSB7CisJCQlpc2EgPSBQQlhBZ2dyZWdhdGVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDAyNEQxRjAxMTNEODQyQjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0QW5kQnVpbGQiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwMjREMUVEMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJCTQwMjREMUVGMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0QW5kQnVpbGQ7CisJCQlwcm9kdWN0TmFtZSA9IFRlc3RBbmRCdWlsZDsKKwkJfTsKKy8qIEVuZCBQQlhBZ2dyZWdhdGVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkzQjdFQjEyNTBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjMwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyAqLzsgfTsKKwkJM0I3RUIxMjYwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJM0I3RUIxMjgwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovOyB9OworCQkzQjdFQjE0ODBFNUFGM0I0MDBDN0YyMzkgLyogV2lkZ2V0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovOyB9OworCQk0MDI0RDE4ODExM0Q3RDc4MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwMjREMTg1MTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdC5hICovOyB9OworCQk0MDI0RDE4OTExM0Q3RDdBMDBDNzA1OUUgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDAyNEQxODMxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCQkzQjA3QkRGMDBFM0YzRkFFMDA2NDc4NjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwOworCQkJcmVtb3RlSW5mbyA9IGdUZXN0RXhhbXBsZTsKKwkJfTsKKwkJNDAyNEQxNjUxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDNCMDdCREU5MEUzRjNGOUUwMDY0Nzg2OTsKKwkJCXJlbW90ZUluZm8gPSBXaWRnZXRGcmFtZXdvcmtUZXN0OworCQl9OworCQk0MDI0RDFFQzExM0Q4NDA5MDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwOworCQkJcmVtb3RlSW5mbyA9IFdpZGdldEZyYW1ld29yazsKKwkJfTsKKwkJNDAyNEQxRUUxMTNEODQwRDAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RTsKKwkJCXJlbW90ZUluZm8gPSBUZXN0OworCQl9OworLyogRW5kIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkzQjA3QkRFQTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJM0I3RUIxMjMwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHdpZGdldC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSB3aWRnZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gd2lkZ2V0X3Rlc3QuY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwMjREMTgzMTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gbGliZ3Rlc3RfbWFpbi5hOyBwYXRoID0gL3Vzci9sb2NhbC9saWIvbGliZ3Rlc3RfbWFpbi5hOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQk0MDI0RDE4NTExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSBsaWJndGVzdC5hOyBwYXRoID0gL3Vzci9sb2NhbC9saWIvbGliZ3Rlc3QuYTsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJNDAyNEQxRTIxMTNEODM4MjAwQzcwNTlFIC8qIHJ1bnRlc3RzLnNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQuc2g7IHBhdGggPSBydW50ZXN0cy5zaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQwN0YyQzcwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0OyBwYXRoID0gSW5mby5wbGlzdDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQwN0YyQzgwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBXaWRnZXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTNCMDdCREU4MEUzRjNGOUUwMDY0Nzg2OSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDAyNEQxODkxMTNEN0Q3QTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTQwMjREMTg4MTEzRDdENzgwMEM3MDU5RSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0I3RUIxNDgwRTVBRjNCNDAwQzdGMjM5IC8qIFdpZGdldC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJOEQwN0YyQzMwNDg2Q0M3QTAwN0NEMUQwIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDA3RjJDODA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0LmZyYW1ld29yayAqLywKKwkJCQkzQjA3QkRFQTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogZ1Rlc3RFeGFtcGxlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDI0RDFFMTExM0Q4MzZDMDBDNzA1OUUgLyogU2NyaXB0cyAqLywKKwkJCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovLAorCQkJCTA4OUMxNjY1RkU4NDExNThDMDJBQUMwNyAvKiBSZXNvdXJjZXMgKi8sCisJCQkJM0IwN0JFMzUwRTQwOTRFNDAwNjQ3ODY5IC8qIFRlc3QgKi8sCisJCQkJMDg2N0Q2OUFGRTg0MDI4RkMwMkFBQzA3IC8qIEV4dGVybmFsIEZyYW1ld29ya3MgYW5kIExpYnJhcmllcyAqLywKKwkJCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9IGdUZXN0RXhhbXBsZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjlBRkU4NDAyOEZDMDJBQUMwNyAvKiBFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwMjREMTgzMTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgKi8sCisJCQkJNDAyNEQxODUxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0LmEgKi8sCisJCQkpOworCQkJbmFtZSA9ICJFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg5QzE2NjVGRTg0MTE1OEMwMkFBQzA3IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQwN0YyQzcwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkpOworCQkJbmFtZSA9IFJlc291cmNlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTNCN0VCMTIzMEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuY2MgKi8sCisJCQkJM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovLAorCQkJKTsKKwkJCW5hbWUgPSBTb3VyY2U7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQjA3QkUzNTBFNDA5NEU0MDA2NDc4NjkgLyogVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNDAyNEQxRTExMTNEODM2QzAwQzcwNTlFIC8qIFNjcmlwdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwMjREMUUyMTEzRDgzODIwMEM3MDU5RSAvKiBydW50ZXN0cy5zaCAqLywKKwkJCSk7CisJCQluYW1lID0gU2NyaXB0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovID0geworCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJM0I3RUIxMjYwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oIGluIEhlYWRlcnMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQkzQjA3QkRFOTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAzQjA3QkRGNDBFM0YzRkI2MDA2NDc4NjkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIldpZGdldEZyYW1ld29ya1Rlc3QiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJM0IwN0JERTcwRTNGM0Y5RTAwNjQ3ODY5IC8qIFNvdXJjZXMgKi8sCisJCQkJM0IwN0JERTgwRTNGM0Y5RTAwNjQ3ODY5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJM0IwN0JERjEwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IFdpZGdldEZyYW1ld29ya1Rlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IGdUZXN0RXhhbXBsZVRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gM0IwN0JERUEwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0RnJhbWV3b3JrICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMDdGMkMxMDQ4NkNDN0EwMDdDRDFEMCAvKiBTb3VyY2VzICovLAorCQkJCThEMDdGMkMzMDQ4NkNDN0EwMDdDRDFEMCAvKiBGcmFtZXdvcmtzICovLAorCQkJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovLAorCQkJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQwN0YyQzUwNDg2Q0M3QTAwN0NEMUQwIC8qIFJleiAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gV2lkZ2V0RnJhbWV3b3JrOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIjsKKwkJCXByb2R1Y3ROYW1lID0gZ1Rlc3RFeGFtcGxlOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDhEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5mcmFtZXdvcmsiOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldpZGdldEZyYW1ld29yayIgKi87CisJCQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAyLjQiOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CisJCQltYWluR3JvdXAgPSAwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogZ1Rlc3RFeGFtcGxlICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi8sCisJCQkJM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi8sCisJCQkJNDAyNEQxNjIxMTNEN0QyNDAwQzcwNTlFIC8qIFRlc3QgKi8sCisJCQkJNDAyNEQxRTkxMTNEODNGRjAwQzcwNTlFIC8qIFRlc3RBbmRCdWlsZCAqLywKKwkJCSk7CisJCX07CisvKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDA3RjJCRjA0ODZDQzdBMDA3Q0QxRDAgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmV6QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkM1MDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXogKi8gPSB7CisJCQlpc2EgPSBQQlhSZXpCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlekJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk0MDI0RDE2MTExM0Q3RDI0MDBDNzA1OUUgLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCSk7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7CisJCQlzaGVsbFNjcmlwdCA9ICIvYmluL2Jhc2ggJFNSQ1JPT1QvcnVudGVzdHMuc2ggJEJVSUxUX1BST0RVQ1RTX0RJUi9XaWRnZXRGcmFtZXdvcmtUZXN0XG4iOworCQl9OworLyogRW5kIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0IwN0JERTcwRTNGM0Y5RTAwNjQ3ODY5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQjdFQjEyODBFNUFFRTQ2MDBDN0YyMzkgLyogd2lkZ2V0X3Rlc3QuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJOEQwN0YyQzEwNDg2Q0M3QTAwN0NEMUQwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQjdFQjEyNTBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKwkJM0IwN0JERjEwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldEZyYW1ld29yayAqLzsKKwkJCXRhcmdldFByb3h5ID0gM0IwN0JERjAwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDAyNEQxNjYxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwMjREMTY1MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwMjREMUVEMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwMjREMUVDMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwMjREMUVGMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RSAvKiBUZXN0ICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDI0RDFFRTExM0Q4NDBEMDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworLyogRW5kIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCTNCMDdCREVDMEUzRjNGOUYwMDY0Nzg2OSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXRGcmFtZXdvcmtUZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJM0IwN0JERUQwRTNGM0Y5RjAwNjQ3ODY5IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxNjMxMTNEN0QyNDAwQzcwNTlFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwMjREMTY0MTEzRDdEMjQwMEM3MDU5RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxRUExMTNEODNGRjAwQzcwNTlFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwMjREMUVCMTEzRDgzRkYwMEM3MDU5RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICJAbG9hZGVyX3BhdGgvLi4vRnJhbWV3b3JrcyI7CisJCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIkBsb2FkZXJfcGF0aC8uLi9GcmFtZXdvcmtzIjsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXQ7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ3MDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTNCMDdCREY0MEUzRjNGQjYwMDY0Nzg2OSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrVGVzdCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkzQjA3QkRFQzBFM0YzRjlGMDA2NDc4NjkgLyogRGVidWcgKi8sCisJCQkJM0IwN0JERUQwRTNGM0Y5RjAwNjQ3ODY5IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxNjkxMTNEN0Q0NjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwMjREMTYzMTEzRDdEMjQwMEM3MDU5RSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDI0RDE2NDExM0Q3RDI0MDBDNzA1OUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDI0RDFGMDExM0Q4NDJCMDBDNzA1OUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlRlc3RBbmRCdWlsZCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MDI0RDFFQTExM0Q4M0ZGMDBDNzA1OUUgLyogRGVidWcgKi8sCisJCQkJNDAyNEQxRUIxMTNEODNGRjAwQzcwNTlFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDIwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJXaWRnZXRGcmFtZXdvcmsiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ0MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldpZGdldEZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDgwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3J1bnRlc3RzLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTBkNDEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgRXhlY3V0ZXMgdGhlIHNhbXBsZXMgYW5kIHRlc3RzIGZvciB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLgorCisjIEhlbHAgdGhlIGR5bmFtaWMgbGlua2VyIGZpbmQgdGhlIHBhdGggdG8gdGhlIGxpYnJhcmllcy4KK2V4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKK2V4cG9ydCBEWUxEX0xJQlJBUllfUEFUSD0kQlVJTFRfUFJPRFVDVFNfRElSCisKKyMgQ3JlYXRlIHNvbWUgZXhlY3V0YWJsZXMuCit0ZXN0X2V4ZWN1dGFibGVzPSRACisKKyMgTm93IGV4ZWN1dGUgZWFjaCBvbmUgaW4gdHVybiBrZWVwaW5nIHRyYWNrIG9mIGhvdyBtYW55IHN1Y2NlZWRlZCBhbmQgZmFpbGVkLgorc3VjY2VlZGVkPTAKK2ZhaWxlZD0wCitmYWlsZWRfbGlzdD0oKQorZm9yIHRlc3QgaW4gJHt0ZXN0X2V4ZWN1dGFibGVzWypdfTsgZG8KKyAgIiR0ZXN0IgorICByZXN1bHQ9JD8KKyAgaWYgWyAkcmVzdWx0IC1lcSAwIF07IHRoZW4KKyAgICBzdWNjZWVkZWQ9JCgoICRzdWNjZWVkZWQgKyAxICkpCisgIGVsc2UKKyAgICBmYWlsZWQ9JCgoIGZhaWxlZCArIDEgKSkKKyAgICBmYWlsZWRfbGlzdD0iJGZhaWxlZF9saXN0ICR0ZXN0IgorICBmaQorZG9uZQorCisjIFJlcG9ydCB0aGUgc3VjY2Vzc2VzIGFuZCBmYWlsdXJlcyB0byB0aGUgY29uc29sZS4KK2VjaG8gIlRlc3RzIGNvbXBsZXRlIHdpdGggJHN1Y2NlZWRlZCBzdWNjZXNzZXMgYW5kICRmYWlsZWQgZmFpbHVyZXMuIgoraWYgWyAkZmFpbGVkIC1uZSAwIF07IHRoZW4KKyAgZWNobyAiVGhlIGZvbGxvd2luZyB0ZXN0cyBmYWlsZWQ6IgorICBlY2hvICRmYWlsZWRfbGlzdAorZmkKK2V4aXQgJGZhaWxlZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmM0ZTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCisvLworLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKKy8vIHdpZGdldC5jYworLy8KKworLy8gV2lkZ2V0IGlzIGEgdmVyeSBzaW1wbGUgY2xhc3MgdXNlZCBmb3IgZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIGd0ZXN0CisKKyNpbmNsdWRlICJ3aWRnZXQuaCIKKworV2lkZ2V0OjpXaWRnZXQoaW50IG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiBudW1iZXJfKG51bWJlciksCisgICAgICBuYW1lXyhuYW1lKSB7fQorCitXaWRnZXQ6On5XaWRnZXQoKSB7fQorCitmbG9hdCBXaWRnZXQ6OkdldEZsb2F0VmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBudW1iZXJfOworfQorCitpbnQgV2lkZ2V0OjpHZXRJbnRWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obnVtYmVyXyk7Cit9CisKK3N0ZDo6c3RyaW5nIFdpZGdldDo6R2V0U3RyaW5nVmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lXzsKK30KKwordm9pZCBXaWRnZXQ6OkdldENoYXJQdHJWYWx1ZShjaGFyKiBidWZmZXIsIHNpemVfdCBtYXhfc2l6ZSkgY29uc3QgeworICAvLyBDb3B5IHRoZSBjaGFyKiByZXByZXNlbnRhdGlvbiBvZiBuYW1lXyBpbnRvIGJ1ZmZlciwgdXAgdG8gbWF4X3NpemUuCisgIHN0cm5jcHkoYnVmZmVyLCBuYW1lXy5jX3N0cigpLCBtYXhfc2l6ZS0xKTsKKyAgYnVmZmVyW21heF9zaXplLTFdID0gJ1wwJzsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1NWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCisvLworLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKKy8vIHdpZGdldC5oCisvLworCisvLyBXaWRnZXQgaXMgYSB2ZXJ5IHNpbXBsZSBjbGFzcyB1c2VkIGZvciBkZW1vbnN0cmF0aW5nIHRoZSB1c2Ugb2YgZ3Rlc3QuIEl0CisvLyBzaW1wbHkgc3RvcmVzIHR3byB2YWx1ZXMgYSBzdHJpbmcgYW5kIGFuIGludGVnZXIsIHdoaWNoIGFyZSByZXR1cm5lZCB2aWEKKy8vIHB1YmxpYyBhY2Nlc3NvcnMgaW4gbXVsdGlwbGUgZm9ybXMuCisKKyNpbXBvcnQgPHN0cmluZz4KKworY2xhc3MgV2lkZ2V0IHsKKyBwdWJsaWM6CisgIFdpZGdldChpbnQgbnVtYmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgIH5XaWRnZXQoKTsKKworICAvLyBQdWJsaWMgYWNjZXNzb3JzIHRvIG51bWJlciBkYXRhCisgIGZsb2F0IEdldEZsb2F0VmFsdWUoKSBjb25zdDsKKyAgaW50IEdldEludFZhbHVlKCkgY29uc3Q7CisKKyAgLy8gUHVibGljIGFjY2Vzc29ycyB0byB0aGUgc3RyaW5nIGRhdGEKKyAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nVmFsdWUoKSBjb25zdDsKKyAgdm9pZCBHZXRDaGFyUHRyVmFsdWUoY2hhciogYnVmZmVyLCBzaXplX3QgbWF4X3NpemUpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gRGF0YSBtZW1iZXJzCisgIGZsb2F0IG51bWJlcl87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjU5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHByZXN0b24uYS5qYWNrc29uQGdtYWlsLmNvbSAoUHJlc3RvbiBKYWNrc29uKQorLy8KKy8vIEdvb2dsZSBUZXN0IC0gRnJhbWV3b3JrU2FtcGxlCisvLyB3aWRnZXRfdGVzdC5jYworLy8KKworLy8gVGhpcyBpcyBhIHNpbXBsZSB0ZXN0IGZpbGUgZm9yIHRoZSBXaWRnZXQgY2xhc3MgaW4gdGhlIFdpZGdldC5mcmFtZXdvcmsKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8V2lkZ2V0L3dpZGdldC5oPgorCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgY29uc3RydWN0b3Igc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlCisvLyBXaWRnZXQgY2xhc3MgY29ycmVjdGx5LgorVEVTVChXaWRnZXRJbml0aWFsaXplclRlc3QsIFRlc3RDb25zdHJ1Y3RvcikgeworICBXaWRnZXQgd2lkZ2V0KDEuMGYsICJuYW1lIik7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjBmLCB3aWRnZXQuR2V0RmxvYXRWYWx1ZSgpKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCJuYW1lIiksIHdpZGdldC5HZXRTdHJpbmdWYWx1ZSgpKTsKK30KKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBmbG9hdCBhbmQgc3RyaW5nIHZhbHVlcyB0byBpbnQgYW5kCisvLyBjaGFyKiwgcmVzcGVjdGl2ZWx5LgorVEVTVChXaWRnZXRJbml0aWFsaXplclRlc3QsIFRlc3RDb252ZXJzaW9uKSB7CisgIFdpZGdldCB3aWRnZXQoMS4wZiwgIm5hbWUiKTsKKyAgRVhQRUNUX0VRKDEsIHdpZGdldC5HZXRJbnRWYWx1ZSgpKTsKKworICBzaXplX3QgbWF4X3NpemUgPSAxMjg7CisgIGNoYXIgYnVmZmVyW21heF9zaXplXTsKKyAgd2lkZ2V0LkdldENoYXJQdHJWYWx1ZShidWZmZXIsIG1heF9zaXplKTsKKyAgRVhQRUNUX1NUUkVRKCJuYW1lIiwgYnVmZmVyKTsKK30KKworLy8gVXNlIHRoZSBHb29nbGUgVGVzdCBtYWluIHRoYXQgaXMgbGlua2VkIGludG8gdGhlIGZyYW1ld29yay4gSXQgZG9lcyBzb21ldGhpbmcKKy8vIGxpa2UgdGhpczoKKy8vIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworLy8gICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisvLyAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7CisvLyB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NjcmlwdHMvcnVudGVzdHMuc2ggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NjcmlwdHMvcnVudGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjMjI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDY1IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgRXhlY3V0ZXMgdGhlIHNhbXBsZXMgYW5kIHRlc3RzIGZvciB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLgorCisjIEhlbHAgdGhlIGR5bmFtaWMgbGlua2VyIGZpbmQgdGhlIHBhdGggdG8gdGhlIGxpYnJhcmllcy4KK2V4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKK2V4cG9ydCBEWUxEX0xJQlJBUllfUEFUSD0kQlVJTFRfUFJPRFVDVFNfRElSCisKKyMgQ3JlYXRlIHNvbWUgZXhlY3V0YWJsZXMuCit0ZXN0X2V4ZWN1dGFibGVzPSgiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiCisgICAgICAgICAgICAgICAgICAiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdCIKKyAgICAgICAgICAgICAgICAgICIkQlVJTFRfUFJPRFVDVFNfRElSL3NhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIgorICAgICAgICAgICAgICAgICAgIiRCVUlMVF9QUk9EVUNUU19ESVIvc2FtcGxlMV91bml0dGVzdC1zdGF0aWMiKQorCisjIE5vdyBleGVjdXRlIGVhY2ggb25lIGluIHR1cm4ga2VlcGluZyB0cmFjayBvZiBob3cgbWFueSBzdWNjZWVkZWQgYW5kIGZhaWxlZC4gCitzdWNjZWVkZWQ9MAorZmFpbGVkPTAKK2ZhaWxlZF9saXN0PSgpCitmb3IgdGVzdCBpbiAke3Rlc3RfZXhlY3V0YWJsZXNbKl19OyBkbworICAiJHRlc3QiCisgIHJlc3VsdD0kPworICBpZiBbICRyZXN1bHQgLWVxIDAgXTsgdGhlbgorICAgIHN1Y2NlZWRlZD0kKCggJHN1Y2NlZWRlZCArIDEgKSkKKyAgZWxzZQorICAgIGZhaWxlZD0kKCggZmFpbGVkICsgMSApKQorICAgIGZhaWxlZF9saXN0PSIkZmFpbGVkX2xpc3QgJHRlc3QiCisgIGZpCitkb25lCisKKyMgUmVwb3J0IHRoZSBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIHRvIHRoZSBjb25zb2xlLgorZWNobyAiVGVzdHMgY29tcGxldGUgd2l0aCAkc3VjY2VlZGVkIHN1Y2Nlc3NlcyBhbmQgJGZhaWxlZCBmYWlsdXJlcy4iCitpZiBbICRmYWlsZWQgLW5lIDAgXTsgdGhlbgorICBlY2hvICJUaGUgZm9sbG93aW5nIHRlc3RzIGZhaWxlZDoiCisgIGVjaG8gJGZhaWxlZF9saXN0CitmaQorZXhpdCAkZmFpbGVkCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2d0ZXN0L3hjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRlOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weQpAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQSBzY3JpcHQgdG8gcHJlcGFyZSB2ZXJzaW9uIGluZm9ybXRpb24gZm9yIHVzZSB0aGUgZ3Rlc3QgSW5mby5wbGlzdCBmaWxlLgorCisgIFRoaXMgc2NyaXB0IGV4dHJhY3RzIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIGFuZAorICB1c2VzIGl0IHRvIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gVGhlCisgICNkZWZpbmVzIGluIHRoaXMgaGVhZGVyIGZpbGUgd2lsbCBiZSBpbmNsdWRlZCBpbiBkdXJpbmcgdGhlIGdlbmVyYXRpb24gb2YKKyAgdGhlIEluZm8ucGxpc3Qgb2YgdGhlIGZyYW1ld29yaywgZ2l2aW5nIHRoZSBjb3JyZWN0IHZhbHVlIHRvIHRoZSB2ZXJzaW9uCisgIHNob3duIGluIHRoZSBGaW5kZXIuCisKKyAgVGhpcyBzY3JpcHQgbWFrZXMgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9ucyAodGhlc2UgYXJlIGZhdWx0cyBvZiB0aGUgc2NyaXB0LAorICBub3QgcHJvYmxlbXMgd2l0aCB0aGUgQXV0b2NvbmYpOgorICAgIDEuIFRoZSBBQ19JTklUIG1hY3JvIHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZmlyc3QgMTAyNCBjaGFyYWN0ZXJzCisgICAgICAgb2YgY29uZmlndXJlLmFjCisgICAgMi4gVGhlIHZlcnNpb24gc3RyaW5nIHdpbGwgYmUgMyBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgd2lsbCBiZQorICAgICAgIHN1cnJvdW5kZWQgYnkgc3F1cmUgYnJhY2tldHMsICJbIiBhbmQgIl0iIChlLmcuIFsxLjAuMV0pLiBUaGUgZmlyc3QKKyAgICAgICBzZWdtZW50IHJlcHJlc2VudHMgdGhlIG1ham9yIHZlcnNpb24sIHRoZSBzZWNvbmQgcmVwcmVzZW50cyB0aGUgbWlub3IKKyAgICAgICB2ZXJzaW9uIGFuZCB0aGUgdGhpcmQgcmVwcmVzZW50cyB0aGUgZml4IHZlcnNpb24uCisgICAgMy4gTm8gIikiIGNoYXJhY3RlciBleGlzdHMgYmV0d2VlbiB0aGUgb3BlbmluZyAiKCIgYW5kIGNsb3NpbmcgIikiIG9mCisgICAgICAgQUNfSU5JVCwgaW5jbHVkaW5nIGluIGNvbW1lbnRzIGFuZCBjaGFyYWN0ZXIgc3RyaW5ncy4KKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKKworIyBSZWFkIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgKHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBWZXJzaW9uLmgpCitpZiAobGVuKHN5cy5hcmd2KSA8IDMpOgorICBwcmludCAiVXNhZ2U6IHZlcnNpb25nZW5lcmF0ZS5weSBpbnB1dF9kaXIgb3V0cHV0X2RpciIKKyAgc3lzLmV4aXQoMSkKK2Vsc2U6CisgIGlucHV0X2RpciA9IHN5cy5hcmd2WzFdCisgIG91dHB1dF9kaXIgPSBzeXMuYXJndlsyXQorCisjIFJlYWQgdGhlIGZpcnN0IDEwMjQgY2hhcmFjdGVycyBvZiB0aGUgY29uZmlndXJlLmFjIGZpbGUKK2NvbmZpZ19maWxlID0gb3BlbigiJXMvY29uZmlndXJlLmFjIiAlIGlucHV0X2RpciwgJ3InKQorYnVmZmVyX3NpemUgPSAxMDI0CitvcGVuaW5nX3N0cmluZyA9IGNvbmZpZ19maWxlLnJlYWQoYnVmZmVyX3NpemUpCitjb25maWdfZmlsZS5jbG9zZSgpCisKKyMgRXh0cmFjdCB0aGUgdmVyc2lvbiBzdHJpbmcgZnJvbSB0aGUgQUNfSU5JVCBtYWNybworIyAgIFRoZSBmb2xsb3dpbmcgaW5pdF9leHByZXNzaW9uIG1lYW5zOgorIyAgICAgRXh0cmFjdCB0aHJlZSBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgc3Vycm91bmRlZCBieSBzcXVyZQorIyAgICAgYnJhY2tldHMoZS5nLiAiWzEuMC4xXSIpIGJldHdlZW4gIkFDX0lOSVQoIiBhbmQgIikiLiBEbyBub3QgYmUgZ3JlZWR5CisjICAgICAoKj8gaXMgdGhlIG5vbi1ncmVlZHkgZmxhZykgc2luY2UgdGhhdCB3b3VsZCBwdWxsIGluIGV2ZXJ5dGhpbmcgYmV0d2VlbgorIyAgICAgdGhlIGZpcnN0ICIoIiBhbmQgdGhlIGxhc3QgIikiIGluIHRoZSBmaWxlLgordmVyc2lvbl9leHByZXNzaW9uID0gcmUuY29tcGlsZShyIkFDX0lOSVRcKC4qP1xbKFxkKylcLihcZCspXC4oXGQrKVxdLio/XCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5ET1RBTEwpCit2ZXJzaW9uX3ZhbHVlcyA9IHZlcnNpb25fZXhwcmVzc2lvbi5zZWFyY2gob3BlbmluZ19zdHJpbmcpCittYWpvcl92ZXJzaW9uID0gdmVyc2lvbl92YWx1ZXMuZ3JvdXAoMSkKK21pbm9yX3ZlcnNpb24gPSB2ZXJzaW9uX3ZhbHVlcy5ncm91cCgyKQorZml4X3ZlcnNpb24gPSB2ZXJzaW9uX3ZhbHVlcy5ncm91cCgzKQorCisjIFdyaXRlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRvIGEgaGVhZGVyIGZpbGUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisjIEluZm8ucGxpc3QgZmlsZS4KK2ZpbGVfZGF0YSA9ICIiIi8vCisvLyBETyBOT1QgTU9ESUZZIFRISVMgRklMRSAoYnV0IHlvdSBjYW4gZGVsZXRlIGl0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IHRoZSB2ZXJzaW9uZ2VuZXJhdGUucHkgc2NyaXB0LiBUaGlzIHNjcmlwdAorLy8gaXMgZXhlY3V0ZWQgaW4gYSAiUnVuIFNjcmlwdCIgYnVpbGQgcGhhc2Ugd2hlbiBjcmVhdGluZyBndGVzdC5mcmFtZXdvcmsuIFRoaXMKKy8vIGhlYWRlciBmaWxlIGlzIG5vdCB1c2VkIGR1cmluZyBjb21waWxhdGlvbiBvZiBDLXNvdXJjZS4gUmF0aGVyLCBpdCBzaW1wbHkKKy8vIGRlZmluZXMgc29tZSB2ZXJzaW9uIHN0cmluZ3MgZm9yIHN1YnN0aXR1dGlvbiBpbiB0aGUgSW5mby5wbGlzdC4gQmVjYXVzZSBvZgorLy8gdGhpcywgd2UgYXJlIG5vdCBub3QgcmVzdHJpY3RlZCB0byBDLXN5bnRheCBub3IgYXJlIHdlIHVzaW5nIGluY2x1ZGUgZ3VhcmRzLgorLy8KKworI2RlZmluZSBHVEVTVF9WRVJTSU9OSU5GT19TSE9SVCAlcy4lcworI2RlZmluZSBHVEVTVF9WRVJTSU9OSU5GT19MT05HICVzLiVzLiVzCisKKyIiIiAlIChtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uLCBtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uLCBmaXhfdmVyc2lvbikKK3ZlcnNpb25fZmlsZSA9IG9wZW4oIiVzL1ZlcnNpb24uaCIgJSBvdXRwdXRfZGlyLCAndycpCit2ZXJzaW9uX2ZpbGUud3JpdGUoZmlsZV9kYXRhKQordmVyc2lvbl9maWxlLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvZ3Rlc3QueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvZ3Rlc3QveGNvZGUvZ3Rlc3QueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTY0NTViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9ndGVzdC94Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMTA4NCBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQyOworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisJCTNCMjM4RjVGMEU4MjhCNTQwMDg0NkUxMSAvKiBDaGVjayAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAzQjIzOEZBMzBFODI4QkI2MDA4NDZFMTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIkNoZWNrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTNCMjM4RjVFMEU4MjhCNTQwMDg0NkUxMSAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDA4OTlGOUQwRkZBNzQwRjAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5RjcxMDFBNDM0NDAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDA4OUEwOTgwRkZBRDM0QTAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5RjkxMDFBNDM0OTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IENoZWNrOworCQkJcHJvZHVjdE5hbWUgPSBDaGVjazsKKwkJfTsKKwkJNDBDNDRBREMwRTM3OThGNDAwOEZDQzUxIC8qIFZlcnNpb24gSW5mbyAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MEM0NEFFNDBFMzc5OTA1MDA4RkNDNTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlZlcnNpb24gSW5mbyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MEM0NEFEQjBFMzc5OEY0MDA4RkNDNTEgLyogR2VuZXJhdGUgVmVyc2lvbi5oICovLAorCQkJKTsKKwkJCWNvbW1lbnRzID0gIlRoZSBnZW5lcmF0aW9uIG9mIFZlcnNpb24uaCBtdXN0IGJlIHBlcmZvcm1lZCBpbiBpdHMgb3duIHRhcmdldC4gU2luY2UgdGhlIEluZm8ucGxpc3QgaXMgcHJlcHJvY2Vzc2VkIGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIGJ1aWxkIHBoYXNlcyBpbiBndGVzdCwgdGhlIFZlcnNpb24uaCBmaWxlIHdvdWxkIG5vdCBiZSByZWFkeSBpZiBpbmNsdWRlZCBhcyBhIGJ1aWxkIHBoYXNlIG9mIHRoYXQgdGFyZ2V0LiI7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJWZXJzaW9uIEluZm8iOworCQkJcHJvZHVjdE5hbWUgPSBWZXJzaW9uLmg7CisJCX07CisvKiBFbmQgUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMjI0QTEyQTMwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjI0QTEyQTIwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJM0JGNkYyQTAwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQkY2RjI5RjBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggKi87IH07CisJCTNCRjZGMkE1MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNDA0ODg0MzgwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0RCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzOTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDUwMEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0Y2MEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUgKi87IH07CisJCTQwNDg4NEEwMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0UyMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggKi87IH07CisJCTQwNDg4NEExMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLzsgfTsKKwkJNDA0ODg0QTIwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U0MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oICovOyB9OworCQk0MDQ4ODRBMzBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovOyB9OworCQk0MDQ4ODRBNDBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U2MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCAqLzsgfTsKKwkJNDA0ODg0QUMwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovOyB9OworCQk0MDQ4ODRBRDBFMkY3Q0Q5MDBDRjc2NTggLyogQ09OVFJJQlVUT1JTIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODRBQTBFMkY3Q0Q5MDBDRjc2NTggLyogQ09OVFJJQlVUT1JTICovOyB9OworCQk0MDQ4ODRBRTBFMkY3Q0Q5MDBDRjc2NTggLyogTElDRU5TRSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgKi87IH07CisJCTQwODk5RjNBMEZGQTcwRDQwMDBCMjlBRSAvKiBndGVzdC1hbGwuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyMjRBMTJBMTBFOUVBREE3MDBCRDE3RkQgLyogZ3Rlc3QtYWxsLmNjICovOyB9OworCQk0MDg5OUY1MDBGRkE3MjgxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA4OTlGNEQwRkZBNzI3MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggKi87IH07CisJCTQwODk5RjUzMEZGQTcyQTAwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCMjM4QzEyMEU3RkUxM0MwMDg0NkUxMSAvKiBndGVzdF91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDA4OUEwNDQwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLzsgfTsKKwkJNDA4OUEwNDYwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDBDODQ4RkYxMDFBMjExNTAwODM2NDJBIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi87IH07CisJCTQwQzg0OTE1MTAxQTIxREYwMDgzNjQyQSAvKiBndGVzdF9tYWluLmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0MEQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X21haW4uY2MgKi87IH07CisJCTQwQzg0OTE2MTAxQTIzNUIwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OworCQk0MEM4NDkyMTEwMUEyM0FEMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5NzgxMDFBMzY1NDAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5ODAxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovOyB9OworCQk0MEM4NDk4MjEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovOyB9OworCQk0MEM4NDk4MzEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5OEYxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLzsgfTsKKwkJNDBDODQ5OTAxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDBDODQ5OTIxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDhGQTEwMUEyMDlDMDA4MzY0MkEgLyogbGliZ3Rlc3QuYSAqLzsgfTsKKwkJNDBDODQ5OTMxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OTBCMTAxQTIxN0UwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgKi87IH07CisJCTQwQzg0OUEyMTAxQTM3MDUwMDgzNjQyQSAvKiBndGVzdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovOyB9OworCQk0MEM4NDlBNDEwMUEzNzE1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLzsgfTsKKwkJNDUzOUM5MzQwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTMzMEVDMjgwQUUwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0NTM5QzkzODBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovOyB9OworCQk0NTM5QzkzOTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM5MzYwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggKi87IH07CisJCTQ1MzlDOTNBMEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi87IH07CisJCTQ1NjdDODE4MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDU2N0M4MTcxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisJCTQwODk5RjlDMEZGQTc0MEYwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUU7CisJCQlyZW1vdGVJbmZvID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCX07CisJCTQwODlBMDk3MEZGQUQzNEEwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUU7CisJCQlyZW1vdGVJbmZvID0gc2FtcGxlMV91bml0dGVzdDsKKwkJfTsKKwkJNDA4QkVDMEYxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDNDRBRTUwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MTsKKwkJCXJlbW90ZUluZm8gPSBWZXJzaW9uLmg7CisJCX07CisJCTQwQzg0OTdDMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LXN0YXRpYyI7CisJCX07CisJCTQwQzg0OTdFMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0X21haW4tc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5OEIxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5OEQxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3RfbWFpbi1zdGF0aWMiOworCQl9OworCQk0MEM4NDk5QjEwMUEzNkRDMDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBOworCQkJcmVtb3RlSW5mbyA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCX07CisJCTQwQzg0OTlEMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LWZyYW1ld29yayI7CisJCX07CisJCTQwQzg0OTlGMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LWZyYW1ld29yayI7CisJCX07CisJCTQwQzg0OUY2MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0X3VuaXR0ZXN0LXN0YXRpYyI7CisJCX07CisJCTQwQzg0OUY4MTAxQTQzNDkwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKKwkJfTsKKy8qIEVuZCBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNDA0ODg0QTUwRTJGN0MwNDAwQ0Y3NjU4IC8qIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9IEhlYWRlcnMvaW50ZXJuYWw7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gNjsKKwkJCWZpbGVzID0gKAorCQkJCTQwNDg4NEEwMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEExMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKKwkJCQk0MDQ4ODRBMjBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDUzOUM5MzgwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LWxpbmtlZF9wdHIuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDUzOUM5MzkwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQ1MzlDOTNBMEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEEzMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEE0MEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDA4OTlGNTAwRkZBNzI4MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTNCRjZGMkEwMEU3OUI1QUQwMDBGMkVFRSAvKiBndGVzdC10eXBlLXV0aWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkpOworCQkJbmFtZSA9ICJDb3B5IEhlYWRlcnMgSW50ZXJuYWwiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkyMjRBMTJBMTBFOUVBREE3MDBCRDE3RkQgLyogZ3Rlc3QtYWxsLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9ICJndGVzdC1hbGwuY2MiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyMjRBMTJBMjBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdGVzdC1wYXJ0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQjIzOEMxMjBFN0ZFMTNDMDA4NDZFMTEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBndGVzdF91bml0dGVzdC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I4N0QyMTAwRTk2QjkyRTAwMEQxODUyIC8qIHJ1bnRlc3RzLnNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQuc2g7IHBhdGggPSBydW50ZXN0cy5zaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0JGNkYyOUYwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHlwZS11dGlsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHlwZWQtdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDAzRUUzN0MwRTM3NzgyMjAwNEJEMUUyIC8qIHZlcnNpb25nZW5lcmF0ZS5weSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQuc2NyaXB0LnB5dGhvbjsgcGF0aCA9IHZlcnNpb25nZW5lcmF0ZS5weTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzREIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWRlYXRoLXRlc3QuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0RDMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1tZXNzYWdlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1tZXNzYWdlLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNERDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3BpLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1zcGkuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0RFMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBndGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGd0ZXN0X3ByZWRfaW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFMDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBndGVzdF9wcm9kLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0UyMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWZpbGVwYXRoLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFNDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWludGVybmFsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcG9ydC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzRTYwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXN0cmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3Qtc3RyaW5nLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNGNjBFMkY3OTlCMDBDRjc2NTggLyogUkVBRE1FICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IFJFQURNRTsgcGF0aCA9IC4uL1JFQURNRTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQk0MDQ4ODQwRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfbWFpbi5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGd0ZXN0X21haW4uY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IENIQU5HRVM7IHBhdGggPSAuLi9DSEFOR0VTOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQ09OVFJJQlVUT1JTOyBwYXRoID0gLi4vQ09OVFJJQlVUT1JTOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwNDg4NEFCMEUyRjdDRDkwMENGNzY1OCAvKiBMSUNFTlNFICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IExJQ0VOU0U7IHBhdGggPSAuLi9MSUNFTlNFOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0MDg5OUY0RDBGRkE3MjcxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXR1cGxlLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gc2FtcGxlMS5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA4OUEwMkQwRkZBQ0Y3RjAwMEIyOUFFIC8qIHNhbXBsZTEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gc2FtcGxlMS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHNhbXBsZTFfdW5pdHRlc3QuY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJndGVzdC5hOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJndGVzdF9tYWluLmE7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwQzg0OTg3MTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gZ3Rlc3RfdW5pdHRlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwQzg0OTk3MTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBEZWJ1Z1Byb2plY3QueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnhjY29uZmlnOyBwYXRoID0gRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MEQ0Q0RGMzBFMzBFMDc0MDAyOTQ4MDEgLyogR2VuZXJhbC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBHZW5lcmFsLnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnhjY29uZmlnOyBwYXRoID0gUmVsZWFzZVByb2plY3QueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDRjUxMEUzMEY1RTIwMDI5NDgwMSAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gZ3Rlc3QuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0NTM5QzkzMzBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcGFyYW0tdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDUzOUM5MzUwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LWxpbmtlZF9wdHIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWxpbmtlZF9wdHIuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1MzlDOTM2MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wYXJhbS11dGlsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0NTY3QzgxNzEyNjRGRjcxMDA3NzQwQkUgLyogZ3Rlc3QtcHJpbnRlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXByaW50ZXJzLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTQwODk5RjQxMEZGQTcxODQwMDBCMjlBRSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5QTQxMDFBMzcxNTAwODM2NDJBIC8qIGd0ZXN0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTQwQzg0OTE2MTAxQTIzNUIwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJNDA4OUEwMTEwRkZBQ0VGQzAwMEIyOUFFIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MEM4NDlBMjEwMUEzNzA1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5MjExMDFBMjNBRDAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk4MTEwMUEzNjg1MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTgyMTAxQTM2ODUwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5ODMxMDFBMzY4NTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk5MTEwMUEzNkE2MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTkyMTAxQTM2QTYwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5OTMxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQ1MzlDOEZGMEVDMjdGNjQwMEE3MEY0QyAvKiBndGVzdC5mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi8sCisJCQkJNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLywKKwkJCQk0MDg5OUY0MzBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovLAorCQkJCTQwQzg0OTg3MTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdCAqLywKKwkJCQk0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBndGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDBENENERjAwRTMwRTA3NDAwMjk0ODAxIC8qIENvbmZpZyAqLywKKwkJCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovLAorCQkJCTQwRDRDRjRFMEUzMEY1RTIwMDI5NDgwMSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJNDAzRUUzN0IwRTM3NzgyMjAwNEJEMUUyIC8qIFNjcmlwdHMgKi8sCisJCQkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovLAorCQkJKTsKKwkJCW5hbWUgPSBndGVzdDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovLAorCQkJCTQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi8sCisJCQkJNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgKi8sCisJCQkJNDA0ODgzRjYwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSAqLywKKwkJCQk0MDQ4ODNEOTBFMkY3OTlCMDBDRjc2NTggLyogaW5jbHVkZSAqLywKKwkJCQk0MDg5QTAyRjBGRkFDRjg0MDAwQjI5QUUgLyogc2FtcGxlcyAqLywKKwkJCQk0MDQ4ODQwNzBFMkY3OTlCMDBDRjc2NTggLyogc3JjICovLAorCQkJCTNCMjM4QkYwMEU3RkUxM0IwMDg0NkUxMSAvKiB0ZXN0ICovLAorCQkJKTsKKwkJCW5hbWUgPSBTb3VyY2U7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQjIzOEJGMDBFN0ZFMTNCMDA4NDZFMTEgLyogdGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSB0ZXN0OworCQkJcGF0aCA9IC4uL3Rlc3Q7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwM0VFMzdCMEUzNzc4MjIwMDRCRDFFMiAvKiBTY3JpcHRzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDNFRTM3QzBFMzc3ODIyMDA0QkQxRTIgLyogdmVyc2lvbmdlbmVyYXRlLnB5ICovLAorCQkJCTNCODdEMjEwMEU5NkI5MkUwMDBEMTg1MiAvKiBydW50ZXN0cy5zaCAqLywKKwkJCSk7CisJCQlwYXRoID0gU2NyaXB0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4M0Q5MEUyRjc5OUIwMENGNzY1OCAvKiBpbmNsdWRlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDQ4ODNEQTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QgKi8sCisJCQkpOworCQkJbmFtZSA9IGluY2x1ZGU7CisJCQlwYXRoID0gLi4vaW5jbHVkZTsKKwkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKKwkJfTsKKwkJNDA0ODgzREEwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDQ4ODNFMTBFMkY3OTlCMDBDRjc2NTggLyogaW50ZXJuYWwgKi8sCisJCQkJMjI0QTEyQTIwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oICovLAorCQkJCTQwNDg4M0RCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggKi8sCisJCQkJNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLywKKwkJCQk0NTM5QzkzMzBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oICovLAorCQkJCTQ1NjdDODE3MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oICovLAorCQkJCTQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLywKKwkJCQk0MDQ4ODNERTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QuaCAqLywKKwkJCQk0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi8sCisJCQkJNDA0ODgzRTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCAqLywKKwkJCQkzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBndGVzdDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4M0UxMEUyRjc5OUIwMENGNzY1OCAvKiBpbnRlcm5hbCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDA0ODgzRTIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCAqLywKKwkJCQk0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLywKKwkJCQk0MDQ4ODNFNDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCAqLywKKwkJCQk0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovLAorCQkJCTQ1MzlDOTM2MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oICovLAorCQkJCTQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi8sCisJCQkJNDA0ODgzRTUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXBvcnQuaCAqLywKKwkJCQk0MDQ4ODNFNjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggKi8sCisJCQkJNDA4OTlGNEQwRkZBNzI3MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggKi8sCisJCQkJM0JGNkYyOUYwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBpbnRlcm5hbDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4NDA3MEUyRjc5OUIwMENGNzY1OCAvKiBzcmMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi8sCisJCQkJNDA0ODg0MEQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X21haW4uY2MgKi8sCisJCQkpOworCQkJbmFtZSA9IHNyYzsKKwkJCXBhdGggPSAuLi9zcmM7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwODlBMDJGMEZGQUNGODQwMDBCMjlBRSAvKiBzYW1wbGVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLywKKwkJCQk0MDg5QTAyRDBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5oICovLAorCQkJCTQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSBzYW1wbGVzOworCQkJcGF0aCA9IC4uL3NhbXBsZXM7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwRDRDREYwMEUzMEUwNzQwMDI5NDgwMSAvKiBDb25maWcgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwRDRDREYxMEUzMEUwNzQwMDI5NDgwMSAvKiBEZWJ1Z1Byb2plY3QueGNjb25maWcgKi8sCisJCQkJNDBENENERjIwRTMwRTA3NDAwMjk0ODAxIC8qIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyAqLywKKwkJCQk0MEQ0Q0RGMzBFMzBFMDc0MDAyOTQ4MDEgLyogR2VuZXJhbC54Y2NvbmZpZyAqLywKKwkJCQk0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi8sCisJCQkJNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi8sCisJCQkpOworCQkJcGF0aCA9IENvbmZpZzsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwRDRDRjRFMEUzMEY1RTIwMDI5NDgwMSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwRDRDRjUxMEUzMEY1RTIwMDI5NDgwMSAvKiBJbmZvLnBsaXN0ICovLAorCQkJKTsKKwkJCXBhdGggPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwNDg4NDM4MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggaW4gSGVhZGVycyAqLywKKwkJCQk0MDQ4ODQzOTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDUzOUM5MzQwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTQ1NjdDODE4MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oIGluIEhlYWRlcnMgKi8sCisJCQkJM0JGNkYyQTUwRTc5QjYxNjAwMEYyRUVFIC8qIGd0ZXN0LXR5cGVkLXRlc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTQwNDg4NDNBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCBpbiBIZWFkZXJzICovLAorCQkJCTQwNDg4NDNCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0MwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3ByZWRfaW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0QwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCBpbiBIZWFkZXJzICovLAorCQkJCTIyNEExMkEzMEU5RUFEQ0MwMEJEMTdGRCAvKiBndGVzdC10ZXN0LXBhcnQuaCBpbiBIZWFkZXJzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJNDA4OTlGNDIwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MDg5OUY0QTBGRkE3MUJDMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDg5OUY0MDBGRkE3MTg0MDAwQjI5QUUgLyogU291cmNlcyAqLywKKwkJCQk0MDg5OUY0MTBGRkE3MTg0MDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM4NDlBMDEwMUEzNkYxMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQlwcm9kdWN0TmFtZSA9IGd0ZXN0X3VuaXR0ZXN0OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDA4OUEwMjQwRkZBQ0YwMTAwMEIyOUFFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDg5QTAxMDBGRkFDRUZDMDAwQjI5QUUgLyogU291cmNlcyAqLywKKwkJCQk0MDg5QTAxMTBGRkFDRUZDMDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM4NDk5RTEwMUEzNkU1MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCXByb2R1Y3ROYW1lID0gc2FtcGxlMV91bml0dGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkEgLyogZ3Rlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTAyMTAxQTIxMkUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3Qtc3RhdGljIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwQzg0OEY3MTAxQTIwOUMwMDgzNjQyQSAvKiBTb3VyY2VzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gImd0ZXN0LXN0YXRpYyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmxpYnJhcnkuc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTEyMTAxQTIxRDIwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfbWFpbi1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ5MDgxMDFBMjE3RTAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCQlwcm9kdWN0TmFtZSA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUubGlicmFyeS5zdGF0aWMiOworCQl9OworCQk0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTg0MTAxQTM2ODUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwQzg0OTdGMTAxQTM2ODUwMDgzNjQyQSAvKiBTb3VyY2VzICovLAorCQkJCTQwQzg0OTgxMTAxQTM2ODUwMDgzNjQyQSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwQzg0OTdCMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJCTQwQzg0OTdEMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5ODcxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJNDBDODQ5ODkxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTk0MTAxQTM2QTYwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ5OEUxMDFBMzZBNjAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkJNDBDODQ5OTExMDFBMzZBNjAwODM2NDJBIC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDBDODQ5OEExMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5OEMxMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyI7CisJCQlwcm9kdWN0TmFtZSA9IHNhbXBsZTFfdW5pdHRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIGd0ZXN0LWZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLywKKwkJCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLywKKwkJCQk0MDQ4ODRBNTBFMkY3QzA0MDBDRjc2NTggLyogQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDBDNDRBRTYwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDA4QkVDMTAxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5OUMxMDFBMzZEQzAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJndGVzdC1mcmFtZXdvcmsiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIjsKKwkJCXByb2R1Y3ROYW1lID0gZ3Rlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuZnJhbWV3b3JrIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0RkFEQzI0NjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJndGVzdCIgKi87CisJCQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAyLjQiOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CisJCQlrbm93blJlZ2lvbnMgPSAoCisJCQkJRW5nbGlzaCwKKwkJCQlKYXBhbmVzZSwKKwkJCQlGcmVuY2gsCisJCQkJR2VybWFuLAorCQkJCWVuLAorCQkJKTsKKwkJCW1haW5Hcm91cCA9IDA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBndGVzdCAqLzsKKwkJCXByb2R1Y3RSZWZHcm91cCA9IDAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLzsKKwkJCXByb2plY3REaXJQYXRoID0gIiI7CisJCQlwcm9qZWN0Um9vdCA9ICIiOworCQkJdGFyZ2V0cyA9ICgKKwkJCQk4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogZ3Rlc3QtZnJhbWV3b3JrICovLAorCQkJCTQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi8sCisJCQkJNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovLAorCQkJCTQwODk5RjQyMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ5N0ExMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LXN0YXRpYyAqLywKKwkJCQk0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ5ODkxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovLAorCQkJCTNCMjM4RjVGMEU4MjhCNTQwMDg0NkUxMSAvKiBDaGVjayAqLywKKwkJCQk0MEM0NEFEQzBFMzc5OEY0MDA4RkNDNTEgLyogVmVyc2lvbiBJbmZvICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwNDg4NDUwMEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUgaW4gUmVzb3VyY2VzICovLAorCQkJCTQwNDg4NEFDMEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTIGluIFJlc291cmNlcyAqLywKKwkJCQk0MDQ4ODRBRDBFMkY3Q0Q5MDBDRjc2NTggLyogQ09OVFJJQlVUT1JTIGluIFJlc291cmNlcyAqLywKKwkJCQk0MDQ4ODRBRTBFMkY3Q0Q5MDBDRjc2NTggLyogTElDRU5TRSBpbiBSZXNvdXJjZXMgKi8sCisJCQkJNDBDODQ5NzgxMDFBMzY1NDAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTNCMjM4RjVFMEU4MjhCNTQwMDg0NkUxMSAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiMgUmVtZW1iZXIsIHRoaXMgXCJSdW4gU2NyaXB0XCIgYnVpbGQgcGhhc2Ugd2lsbCBiZSBleGVjdXRlZCBmcm9tICRTUkNST09UXG4vYmluL2Jhc2ggU2NyaXB0cy9ydW50ZXN0cy5zaCI7CisJCX07CisJCTQwQzQ0QURCMEUzNzk4RjQwMDhGQ0M1MSAvKiBHZW5lcmF0ZSBWZXJzaW9uLmggKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCQkiJChTUkNST09UKS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weSIsCisJCQkJIiQoU1JDUk9PVCkvLi4vY29uZmlndXJlLmFjIiwKKwkJCSk7CisJCQluYW1lID0gIkdlbmVyYXRlIFZlcnNpb24uaCI7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCQkiJChQUk9KRUNUX1RFTVBfRElSKS9WZXJzaW9uLmgiLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiMgUmVtZW1iZXIsIHRoaXMgXCJSdW4gU2NyaXB0XCIgYnVpbGQgcGhhc2Ugd2lsbCBiZSBleGVjdXRlZCBmcm9tICRTUkNST09UXG4vdXNyL2Jpbi9weXRob24gU2NyaXB0cy92ZXJzaW9uZ2VuZXJhdGUucHkgLi4vICRQUk9KRUNUX1RFTVBfRElSIjsKKwkJfTsKKy8qIEVuZCBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTQwODk5RjQwMEZGQTcxODQwMDBCMjlBRSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDA4OTlGNTMwRkZBNzJBMDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwODlBMDEwMEZGQUNFRkMwMDBCMjlBRSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDA4OUEwNDQwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLywKKwkJCQk0MDg5QTA0NjBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDhGNzEwMUEyMDlDMDA4MzY0MkEgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OEZGMTAxQTIxMTUwMDgzNjQyQSAvKiBndGVzdC1hbGwuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJNDBDODQ5MDgxMDFBMjE3RTAwODM2NDJBIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MEM4NDkxNTEwMUEyMURGMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk3RjEwMUEzNjg1MDA4MzY0MkEgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTgwMTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk4RTEwMUEzNkE2MDA4MzY0MkEgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OThGMTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxLmNjIGluIFNvdXJjZXMgKi8sCisJCQkJNDBDODQ5OTAxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJOEQwN0YyQzEwNDg2Q0M3QTAwN0NEMUQwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDg5OUYzQTBGRkE3MEQ0MDAwQjI5QUUgLyogZ3Rlc3QtYWxsLmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKwkJNDA4OTlGOUQwRkZBNzQwRjAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDA4OTlGNDIwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDA4OTlGOUMwRkZBNzQwRjAwMEIyOUFFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDA4OUEwOTgwRkZBRDM0QTAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDA4OUEwMTIwRkZBQ0VGQzAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDg5QTA5NzBGRkFEMzRBMDAwQjI5QUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MDhCRUMxMDEwNDZDRkU5MDBERUY1MjIgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkEgLyogZ3Rlc3Qtc3RhdGljICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDhCRUMwRjEwNDZDRkU5MDBERUY1MjIgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM0NEFFNjBFMzc5OTIyMDA4RkNDNTEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM0NEFEQzBFMzc5OEY0MDA4RkNDNTEgLyogVmVyc2lvbiBJbmZvICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM0NEFFNTBFMzc5OTIyMDA4RkNDNTEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDk3QjEwMUEzNjg1MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkEgLyogZ3Rlc3Qtc3RhdGljICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk3QzEwMUEzNjg1MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDk3RDEwMUEzNjg1MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTdFMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OThBMTAxQTM2QTYwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OThCMTAxQTM2QTYwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OThDMTAxQTM2QTYwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQSAvKiBndGVzdF9tYWluLXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5OEQxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDBDODQ5OUMxMDFBMzZEQzAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk5QjEwMUEzNkRDMDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDk5RTEwMUEzNkU1MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogZ3Rlc3QtZnJhbWV3b3JrICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk5RDEwMUEzNkU1MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDlBMDEwMUEzNkYxMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogZ3Rlc3QtZnJhbWV3b3JrICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk5RjEwMUEzNkYxMDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDlGNzEwMUE0MzQ0MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDlGNjEwMUE0MzQ0MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDlGOTEwMUE0MzQ5MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OUY4MTAxQTQzNDkwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisvKiBFbmQgUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJM0IyMzhGNjAwRTgyOEI1NDAwODQ2RTExIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlQUk9EVUNUX05BTUUgPSBDaGVjazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTNCMjM4RjYxMEU4MjhCNTQwMDg0NkUxMSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gQ2hlY2s7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwODk5RjQ1MEZGQTcxODUwMDBCMjlBRSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOworCQkJCVBST0RVQ1RfTkFNRSA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDA4OTlGNDYwRkZBNzE4NTAwMEIyOUFFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC4uLzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDA4OUEwMTUwRkZBQ0VGRDAwMEIyOUFFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MDg5QTAxNjBGRkFDRUZEMDAwQjI5QUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSAic2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM0NEFERjBFMzc5OEY0MDA4RkNDNTEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7CisJCQkJVEFSR0VUX05BTUUgPSBndGVzdDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwQzQ0QUUwMEUzNzk4RjQwMDhGQ0M1MSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OworCQkJCVRBUkdFVF9OQU1FID0gZ3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OEZCMTAxQTIwOUQwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX0lOTElORVNfQVJFX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwQzg0OEZDMTAxQTIwOUQwMDgzNjQyQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwODk5RkIzMEZGQTc1NjcwMDBCMjlBRSAvKiBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLAorCQkJCQkuLi9pbmNsdWRlLywKKwkJCQkpOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDkwRTEwMUEyMTdGMDA4MzY0MkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdF9tYWluOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ5MEYxMDFBMjE3RjAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdF9tYWluOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDk4NTEwMUEzNjg1MDA4MzY0MkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC4uLzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdF91bml0dGVzdDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwQzg0OTg2MTAxQTM2ODUwMDgzNjQyQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi87CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTk1MTAxQTM2QTYwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ5OTYxMDFBMzZBNjAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBSZXNvdXJjZXMvSW5mby5wbGlzdDsKKwkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIkKFBST0pFQ1RfVEVNUF9ESVIpL1ZlcnNpb24uaCI7CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1MgPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7CisJCQkJVkVSU0lPTklOR19TWVNURU0gPSAiYXBwbGUtZ2VuZXJpYyI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0RkFEQzI0NDA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGMjBFMzBFMDc0MDAyOTQ4MDEgLyogRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlEWUxJQl9DT01QQVRJQklMSVRZX1ZFUlNJT04gPSAxOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9IDE7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLAorCQkJCQkuLi9pbmNsdWRlLywKKwkJCQkpOworCQkJCUlORk9QTElTVF9GSUxFID0gUmVzb3VyY2VzL0luZm8ucGxpc3Q7CisJCQkJSU5GT1BMSVNUX1BSRUZJWF9IRUFERVIgPSAiJChQUk9KRUNUX1RFTVBfRElSKS9WZXJzaW9uLmgiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gImFwcGxlLWdlbmVyaWMiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0RkFEQzI0ODA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTNCMjM4RkEzMEU4MjhCQjYwMDg0NkUxMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiQ2hlY2siICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJM0IyMzhGNjAwRTgyOEI1NDAwODQ2RTExIC8qIERlYnVnICovLAorCQkJCTNCMjM4RjYxMEU4MjhCNTQwMDg0NkUxMSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwODk5RjRBMEZGQTcxQkMwMDBCMjlBRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwODk5RjQ1MEZGQTcxODUwMDBCMjlBRSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDg5OUY0NjBGRkE3MTg1MDAwQjI5QUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDg5QTAyNDBGRkFDRjAxMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwODlBMDE1MEZGQUNFRkQwMDBCMjlBRSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDg5QTAxNjBGRkFDRUZEMDAwQjI5QUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM0NEFFNDBFMzc5OTA1MDA4RkNDNTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlZlcnNpb24gSW5mbyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MEM0NEFERjBFMzc5OEY0MDA4RkNDNTEgLyogRGVidWcgKi8sCisJCQkJNDBDNDRBRTAwRTM3OThGNDAwOEZDQzUxIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDBDODQ5MDIxMDFBMjEyRTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdC1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ4RkIxMDFBMjA5RDAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OEZDMTAxQTIwOUQwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTEyMTAxQTIxRDIwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfbWFpbi1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ5MEUxMDFBMjE3RjAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OTBGMTAxQTIxN0YwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTg0MTAxQTM2ODUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwQzg0OTg1MTAxQTM2ODUwMDgzNjQyQSAvKiBEZWJ1ZyAqLywKKwkJCQk0MEM4NDk4NjEwMUEzNjg1MDA4MzY0MkEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDk5NDEwMUEzNkE2MDA4MzY0MkEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwQzg0OTk1MTAxQTM2QTYwMDgzNjQyQSAvKiBEZWJ1ZyAqLywKKwkJCQk0MEM4NDk5NjEwMUEzNkE2MDA4MzY0MkEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LWZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDYwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiZ3Rlc3QiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDcwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9pbnN0YWxsLXNoIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MjQ0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2luc3RhbGwtc2gKQEAgLTAsMCArMSw1MjcgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDExLTAxLTE5LjIxOyAjIFVUQworCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guCisKK25sPScKKycKK0lGUz0iICIiCSRubCIKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9JHtET0lUUFJPRy19CitpZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KKyAgZG9pdF9leGVjPWV4ZWMKK2Vsc2UKKyAgZG9pdF9leGVjPSRkb2l0CitmaQorCisjIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOworIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KKworY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQorY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQorY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQorY21wcHJvZz0ke0NNUFBST0ctY21wfQorY3Bwcm9nPSR7Q1BQUk9HLWNwfQorbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQorbXZwcm9nPSR7TVZQUk9HLW12fQorcm1wcm9nPSR7Uk1QUk9HLXJtfQorc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQorCitwb3NpeF9nbG9iPSc/JworaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKKyAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7CisgICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHBvc2l4X2dsb2I9CisgICAgZWxzZQorICAgICAgcG9zaXhfZ2xvYj06CisgICAgZmkKKyAgfQorJworCitwb3NpeF9ta2Rpcj0KKworIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCittb2RlPTA3NTUKKworY2hncnBjbWQ9CitjaG1vZGNtZD0kY2htb2Rwcm9nCitjaG93bmNtZD0KK212Y21kPSRtdnByb2cKK3JtY21kPSIkcm1wcm9nIC1mIgorc3RyaXBjbWQ9CisKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3RfYXJnPQorCitjb3B5X29uX2NoYW5nZT1mYWxzZQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKyAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKyAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworICAtYyAgICAgICAgICAgIChpZ25vcmVkKQorICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCisgIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKyAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKyAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCisgIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCisgIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKyAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCisgIFJNUFJPRyBTVFJJUFBST0cKKyIKKword2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSA7OworCisgICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJc2hpZnQ7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBtb2RlPSQyCisJY2FzZSAkbW9kZSBpbgorCSAgKicgJyogfCAqJwknKiB8IConCisnKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQorCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCisJICAgIGV4aXQgMTs7CisJZXNhYworCXNoaWZ0OzsKKworICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwlzaGlmdDs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7CisKKyAgICAtdCkgZHN0X2FyZz0kMgorCSMgUHJvdGVjdCBuYW1lcyBwcm9ibGVtYXRpYyBmb3IgYHRlc3QnIGFuZCBvdGhlciB1dGlsaXRpZXMuCisJY2FzZSAkZHN0X2FyZyBpbgorCSAgLSogfCBbPVwoXCkhXSkgZHN0X2FyZz0uLyRkc3RfYXJnOzsKKwllc2FjCisJc2hpZnQ7OworCisgICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZTs7CisKKyAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAkPzs7CisKKyAgICAtLSkJc2hpZnQKKwlicmVhazs7CisKKyAgICAtKikJZWNobyAiJDA6IGludmFsaWQgb3B0aW9uOiAkMSIgPiYyCisJZXhpdCAxOzsKKworICAgICopICBicmVhazs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgdGVzdCAkIyAtbmUgMCAmJiB0ZXN0IC16ICIkZGlyX2FyZyRkc3RfYXJnIjsgdGhlbgorICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKyAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KKyAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorICBmb3IgYXJnCisgIGRvCisgICAgaWYgdGVzdCAtbiAiJGRzdF9hcmciOyB0aGVuCisgICAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KKyAgICAgIHNldCBmbm9yZCAiJEAiICIkZHN0X2FyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICBmaQorICAgIHNoaWZ0ICMgYXJnCisgICAgZHN0X2FyZz0kYXJnCisgICAgIyBQcm90ZWN0IG5hbWVzIHByb2JsZW1hdGljIGZvciBgdGVzdCcgYW5kIG90aGVyIHV0aWxpdGllcy4KKyAgICBjYXNlICRkc3RfYXJnIGluCisgICAgICAtKiB8IFs9XChcKSFdKSBkc3RfYXJnPS4vJGRzdF9hcmc7OworICAgIGVzYWMKKyAgZG9uZQorZmkKKworaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgICBlY2hvICIkMDogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuIiA+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgIyBJdCdzIE9LIHRvIGNhbGwgYGluc3RhbGwtc2ggLWQnIHdpdGhvdXQgYXJndW1lbnQuCisgICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gY3JlYXRpbmcgY29uZGl0aW9uYWwgZGlyZWN0b3JpZXMuCisgIGV4aXQgMAorZmkKKworaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCisgIGRvX2V4aXQ9JyhleGl0ICRyZXQpOyBleGl0ICRyZXQnCisgIHRyYXAgInJldD0xMjk7ICRkb19leGl0IiAxCisgIHRyYXAgInJldD0xMzA7ICRkb19leGl0IiAyCisgIHRyYXAgInJldD0xNDE7ICRkb19leGl0IiAxMworICB0cmFwICJyZXQ9MTQzOyAkZG9fZXhpdCIgMTUKKworICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgorICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCisgIGNhc2UgJG1vZGUgaW4KKyAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKyAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OworICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKKworICAgICpbMC03XSkKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSclIDIwMCcKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSx1K3J3CisgICAgICBmaQorICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKKyAgZXNhYworZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHByb2JsZW1hdGljIGZvciBgdGVzdCcgYW5kIG90aGVyIHV0aWxpdGllcy4KKyAgY2FzZSAkc3JjIGluCisgICAgLSogfCBbPVwoXCkhXSkgc3JjPS4vJHNyYzs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIGRzdGRpcj0kZHN0CisgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICBkc3RkaXJfc3RhdHVzPSQ/CisgIGVsc2UKKworICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZHN0PSRkc3RfYXJnCisKKyAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCisgICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KKyAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCisJZWNobyAiJDA6ICRkc3RfYXJnOiBJcyBhIGRpcmVjdG9yeSIgPiYyCisJZXhpdCAxCisgICAgICBmaQorICAgICAgZHN0ZGlyPSRkc3QKKyAgICAgIGRzdD0kZHN0ZGlyL2BiYXNlbmFtZSAiJHNyYyJgCisgICAgICBkc3RkaXJfc3RhdHVzPTAKKyAgICBlbHNlCisgICAgICAjIFByZWZlciBkaXJuYW1lLCBidXQgZmFsbCBiYWNrIG9uIGEgc3Vic3RpdHV0ZSBpZiBkaXJuYW1lIGZhaWxzLgorICAgICAgZHN0ZGlyPWAKKwkoZGlybmFtZSAiJGRzdCIpIDI+L2Rldi9udWxsIHx8CisJZXhwciBYIiRkc3QiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXCkkJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorCWVjaG8gWCIkZHN0IiB8CisJICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKVteL10uKi97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKSQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wpLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgcy8uKi8uLzsgcScKKyAgICAgIGAKKworICAgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICAgIGRzdGRpcl9zdGF0dXM9JD8KKyAgICBmaQorICBmaQorCisgIG9ic29sZXRlX21rZGlyX3VzZWQ9ZmFsc2UKKworICBpZiB0ZXN0ICRkc3RkaXJfc3RhdHVzICE9IDA7IHRoZW4KKyAgICBjYXNlICRwb3NpeF9ta2RpciBpbgorICAgICAgJycpCisJIyBDcmVhdGUgaW50ZXJtZWRpYXRlIGRpcnMgdXNpbmcgbW9kZSA3NTUgYXMgbW9kaWZpZWQgYnkgdGhlIHVtYXNrLgorCSMgVGhpcyBpcyBsaWtlIEZyZWVCU0QgJ2luc3RhbGwnIGFzIG9mIDE5OTctMTAtMjguCisJdW1hc2s9YHVtYXNrYAorCWNhc2UgJHN0cmlwY21kLiR1bWFzayBpbgorCSAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCisJICAqWzIzNjddWzIzNjddKSBta2Rpcl91bWFzaz0kdW1hc2s7OworCSAgLiowWzAyXVswMl0gfCAuWzAyXVswMl0gfCAuWzAyXSkgbWtkaXJfdW1hc2s9MjI7OworCisJICAqWzAtN10pCisJICAgIG1rZGlyX3VtYXNrPWBleHByICR1bWFzayArIDIyIFwKKwkgICAgICAtICR1bWFzayAlIDEwMCAlIDQwICsgJHVtYXNrICUgMjAgXAorCSAgICAgIC0gJHVtYXNrICUgMTAgJSA0ICsgJHVtYXNrICUgMgorCSAgICBgOzsKKwkgICopIG1rZGlyX3VtYXNrPSR1bWFzayxnby13OzsKKwllc2FjCisKKwkjIFdpdGggLWQsIGNyZWF0ZSB0aGUgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBtb2RlLgorCSMgT3RoZXJ3aXNlLCByZWx5IG9uICRta2Rpcl91bWFzay4KKwlpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKwkgIG1rZGlyX21vZGU9LW0kbW9kZQorCWVsc2UKKwkgIG1rZGlyX21vZGU9CisJZmkKKworCXBvc2l4X21rZGlyPWZhbHNlCisJY2FzZSAkdW1hc2sgaW4KKwkgICpbMTIzNTY3XVswLTddWzAtN10pCisJICAgICMgUE9TSVggbWtkaXIgLXAgc2V0cyB1K3d4IGJpdHMgcmVnYXJkbGVzcyBvZiB1bWFzaywgd2hpY2gKKwkgICAgIyBpcyBpbmNvbXBhdGlibGUgd2l0aCBGcmVlQlNEICdpbnN0YWxsJyB3aGVuICh1bWFzayAmIDMwMCkgIT0gMC4KKwkgICAgOzsKKwkgICopCisJICAgIHRtcGRpcj0ke1RNUERJUi0vdG1wfS9pbnMkUkFORE9NLSQkCisJICAgIHRyYXAgJ3JldD0kPzsgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiIDI+L2Rldi9udWxsOyBleGl0ICRyZXQnIDAKKworCSAgICBpZiAodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJCWV4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJHRtcGRpci9kIikgPi9kZXYvbnVsbCAyPiYxCisJICAgIHRoZW4KKwkgICAgICBpZiB0ZXN0IC16ICIkZGlyX2FyZyIgfHwgeworCQkgICAjIENoZWNrIGZvciBQT1NJWCBpbmNvbXBhdGliaWxpdGllcyB3aXRoIC1tLgorCQkgICAjIEhQLVVYIDExLjIzIGFuZCBJUklYIDYuNSBta2RpciAtbSAtcCBzZXRzIGdyb3VwLSBvcgorCQkgICAjIG90aGVyLXdyaXRlYWJsZSBiaXQgb2YgcGFyZW50IGRpcmVjdG9yeSB3aGVuIGl0IHNob3VsZG4ndC4KKwkJICAgIyBGcmVlQlNEIDYuMSBta2RpciAtbSAtcCBzZXRzIG1vZGUgb2YgZXhpc3RpbmcgZGlyZWN0b3J5LgorCQkgICBsc19sZF90bXBkaXI9YGxzIC1sZCAiJHRtcGRpciJgCisJCSAgIGNhc2UgJGxzX2xkX3RtcGRpciBpbgorCQkgICAgIGQ/Pz8/LT9yLSopIGRpZmZlcmVudF9tb2RlPTcwMDs7CisJCSAgICAgZD8/Pz8tPy0tKikgZGlmZmVyZW50X21vZGU9NzU1OzsKKwkJICAgICAqKSBmYWxzZTs7CisJCSAgIGVzYWMgJiYKKwkJICAgJG1rZGlycHJvZyAtbSRkaWZmZXJlbnRfbW9kZSAtcCAtLSAiJHRtcGRpciIgJiYgeworCQkgICAgIGxzX2xkX3RtcGRpcl8xPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICAgIHRlc3QgIiRsc19sZF90bXBkaXIiID0gIiRsc19sZF90bXBkaXJfMSIKKwkJICAgfQorCQkgfQorCSAgICAgIHRoZW4gcG9zaXhfbWtkaXI9OgorCSAgICAgIGZpCisJICAgICAgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIFJlbW92ZSBhbnkgZGlycyBsZWZ0IGJlaGluZCBieSBhbmNpZW50IG1rZGlyIGltcGxlbWVudGF0aW9ucy4KKwkgICAgICBybWRpciAuLyRta2Rpcl9tb2RlIC4vLXAgLi8tLSAyPi9kZXYvbnVsbAorCSAgICBmaQorCSAgICB0cmFwICcnIDA7OworCWVzYWM7OworICAgIGVzYWMKKworICAgIGlmCisgICAgICAkcG9zaXhfbWtkaXIgJiYgKAorCXVtYXNrICRta2Rpcl91bWFzayAmJgorCSRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIKKyAgICAgICkKKyAgICB0aGVuIDoKKyAgICBlbHNlCisKKyAgICAgICMgVGhlIHVtYXNrIGlzIHJpZGljdWxvdXMsIG9yIG1rZGlyIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCisgICAgICAjIG9yIGl0IGZhaWxlZCBwb3NzaWJseSBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4gIENyZWF0ZSB0aGUKKyAgICAgICMgZGlyZWN0b3J5IHRoZSBzbG93IHdheSwgc3RlcCBieSBzdGVwLCBjaGVja2luZyBmb3IgcmFjZXMgYXMgd2UgZ28uCisKKyAgICAgIGNhc2UgJGRzdGRpciBpbgorCS8qKSBwcmVmaXg9Jy8nOzsKKwlbLT1cKFwpIV0qKSBwcmVmaXg9Jy4vJzs7CisJKikgIHByZWZpeD0nJzs7CisgICAgICBlc2FjCisKKyAgICAgIGV2YWwgIiRpbml0aWFsaXplX3Bvc2l4X2dsb2IiCisKKyAgICAgIG9JRlM9JElGUworICAgICAgSUZTPS8KKyAgICAgICRwb3NpeF9nbG9iIHNldCAtZgorICAgICAgc2V0IGZub3JkICRkc3RkaXIKKyAgICAgIHNoaWZ0CisgICAgICAkcG9zaXhfZ2xvYiBzZXQgK2YKKyAgICAgIElGUz0kb0lGUworCisgICAgICBwcmVmaXhlcz0KKworICAgICAgZm9yIGQKKyAgICAgIGRvCisJdGVzdCBYIiRkIiA9IFggJiYgY29udGludWUKKworCXByZWZpeD0kcHJlZml4JGQKKwlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgorCSAgcHJlZml4ZXM9CisJZWxzZQorCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCisJICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKKwkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCisJICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCisJICBlbHNlCisJICAgIGNhc2UgJHByZWZpeCBpbgorCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKwkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OworCSAgICBlc2FjCisJICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKKwkgIGZpCisJZmkKKwlwcmVmaXg9JHByZWZpeC8KKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgorCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8CisJICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKKwlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAorICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQorICBlbHNlCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKworICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCisgICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KKyAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKKyAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgorICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCisKKyAgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCAtZiAmJgorICAgICAgIHNldCBYICRvbGQgJiYgb2xkPTokMjokNDokNTokNiAmJgorICAgICAgIHNldCBYICRuZXcgJiYgbmV3PTokMjokNDokNTokNiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCArZiAmJgorCisgICAgICAgdGVzdCAiJG9sZCIgPSAiJG5ldyIgJiYKKyAgICAgICAkY21wcHJvZyAiJGRzdCIgIiRkc3R0bXAiID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIHJtIC1mICIkZHN0dG1wIgorICAgIGVsc2UKKyAgICAgICMgUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorICAgICAgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdCIgMj4vZGV2L251bGwgfHwKKworICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQorICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICMgc3VwcG9ydCAtZi4KKyAgICAgIHsKKwkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwl7CisJICB0ZXN0ICEgLWYgIiRkc3QiIHx8CisJICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8CisJICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKKwkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KKwkgIH0gfHwKKwkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgorCSAgICAoZXhpdCAxKTsgZXhpdCAxCisJICB9CisJfSAmJgorCisJIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCisgICAgICB9CisgICAgZmkgfHwgZXhpdCAxCisKKyAgICB0cmFwICcnIDAKKyAgZmkKK2RvbmUKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL1JFQURNRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQwNmExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL1JFQURNRS50eHQKQEAgLTAsMCArMSw5NiBAQAorUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CitDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgSmF2YSBQcm90b2NvbCBCdWZmZXJzIHJ1bnRpbWUgbGlicmFyeS4KKworSW5zdGFsbGF0aW9uIC0gV2l0aCBNYXZlbgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgUHJvdG9jb2wgQnVmZmVycyBidWlsZCBpcyBtYW5hZ2VkIHVzaW5nIE1hdmVuLiAgSWYgeW91IHdvdWxkCityYXRoZXIgYnVpbGQgd2l0aG91dCBNYXZlbiwgc2VlIGJlbG93LgorCisxKSBJbnN0YWxsIEFwYWNoZSBNYXZlbiBpZiB5b3UgZG9uJ3QgaGF2ZSBpdDoKKworICAgICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8KKworMikgQnVpbGQgdGhlIEMrKyBjb2RlLCBvciBvYnRhaW4gYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHByb3RvYy4gIElmCisgICB5b3UgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24sIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRoZSBzYW1lCisgICB2ZXJzaW9uIGFzIHRoaXMgcGFja2FnZS4gIElmIGluIGRvdWJ0LCBydW46CisKKyAgICAgJCBwcm90b2MgLS12ZXJzaW9uCisKKyAgIFlvdSB3aWxsIG5lZWQgdG8gcGxhY2UgdGhlIHByb3RvYyBleGVjdXRhYmxlIGluIC4uL3NyYy4gIChJZiB5b3UKKyAgIGJ1aWx0IGl0IHlvdXJzZWxmLCBpdCBzaG91bGQgYWxyZWFkeSBiZSB0aGVyZS4pCisKKzMpIFJ1biB0aGUgdGVzdHM6CisKKyAgICAgJCBtdm4gdGVzdAorCisgICBJZiBzb21lIHRlc3RzIGZhaWwsIHRoaXMgbGlicmFyeSBtYXkgbm90IHdvcmsgY29ycmVjdGx5IG9uIHlvdXIKKyAgIHN5c3RlbS4gIENvbnRpbnVlIGF0IHlvdXIgb3duIHJpc2suCisKKzQpIEluc3RhbGwgdGhlIGxpYnJhcnkgaW50byB5b3VyIE1hdmVuIHJlcG9zaXRvcnk6CisKKyAgICAgJCBtdm4gaW5zdGFsbAorCis1KSBJZiB5b3UgZG8gbm90IHVzZSBNYXZlbiB0byBtYW5hZ2UgeW91ciBvd24gYnVpbGQsIHlvdSBjYW4gYnVpbGQgYQorICAgLmphciBmaWxlIHRvIHVzZToKKworICAgICAkIG12biBwYWNrYWdlCisKKyAgIFRoZSAuamFyIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAidGFyZ2V0IiBkaXJlY3RvcnkuCisKK0luc3RhbGxhdGlvbiAtICdMaXRlJyBWZXJzaW9uIC0gV2l0aCBNYXZlbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0J1aWxkaW5nIHRoZSAnbGl0ZScgdmVyc2lvbiBvZiB0aGUgSmF2YSBQcm90b2NvbCBCdWZmZXJzIGxpYnJhcnkgaXMKK3RoZSBzYW1lIGFzIGJ1aWxkaW5nIHRoZSBmdWxsIHZlcnNpb24sIGV4Y2VwdCB0aGF0IGFsbCBjb21tYW5kcyBhcmUKK3J1biB1c2luZyB0aGUgJ2xpdGUnIHByb2ZpbGUuICAoc2VlCitodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvaW50cm9kdWN0aW9uL2ludHJvZHVjdGlvbi10by1wcm9maWxlcy5odG1sKQorCitFLmcuIHRvIGluc3RhbGwgdGhlIGxpdGUgdmVyc2lvbiBvZiB0aGUgamFyLCB5b3Ugd291bGQgcnVuOgorCisgICQgbXZuIGluc3RhbGwgLVAgbGl0ZQorCitUaGUgcmVzdWx0aW5nIGFydGlmYWN0IGhhcyB0aGUgJ2xpdGUnIGNsYXNzaWZpZXIuICBUbyByZWZlcmVuY2UgaXQKK2ZvciBkZXBlbmRlbmN5IHJlc29sdXRpb24sIHlvdSB3b3VsZCBzcGVjaWZ5IGl0IGFzOgorCisgIDxkZXBlbmRlbmN5PgorICAgIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWY8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvdG9idWYtamF2YTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDxjbGFzc2lmaWVyPmxpdGU8L2NsYXNzaWZpZXI+CisgIDwvZGVwZW5kZW5jeT4KKworSW5zdGFsbGF0aW9uIC0gV2l0aG91dCBNYXZlbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3Ugd291bGQgcmF0aGVyIG5vdCBpbnN0YWxsIE1hdmVuIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCB5b3UgbWF5Citmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIGluc3RlYWQuICBOb3RlIHRoYXQgdGhlc2UgaW5zdHJ1Y3Rpb25zIHNraXAKK3J1bm5pbmcgdW5pdCB0ZXN0cy4KKworMSkgQnVpbGQgdGhlIEMrKyBjb2RlLCBvciBvYnRhaW4gYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHByb3RvYy4gIElmCisgICB5b3UgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24sIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRoZSBzYW1lCisgICB2ZXJzaW9uIGFzIHRoaXMgcGFja2FnZS4gIElmIGluIGRvdWJ0LCBydW46CisKKyAgICAgJCBwcm90b2MgLS12ZXJzaW9uCisKKyAgIElmIHlvdSBidWlsdCB0aGUgQysrIGNvZGUgd2l0aG91dCBpbnN0YWxsaW5nLCB0aGUgY29tcGlsZXIgYmluYXJ5CisgICBzaG91bGQgYmUgbG9jYXRlZCBpbiAuLi9zcmMuCisKKzIpIEludm9rZSBwcm90b2MgdG8gYnVpbGQgRGVzY3JpcHRvclByb3Rvcy5qYXZhOgorCisgICAgICQgcHJvdG9jIC0tamF2YV9vdXQ9c3JjL21haW4vamF2YSAtSS4uL3NyYyBcCisgICAgICAgICAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KKworMykgQ29tcGlsZSB0aGUgY29kZSBpbiBzcmMvbWFpbi9qYXZhIHVzaW5nIHdoYXRldmVyIG1lYW5zIHlvdSBwcmVmZXIuCisKKzQpIEluc3RhbGwgdGhlIGNsYXNzZXMgd2hlcmV2ZXIgeW91IHByZWZlci4KKworVXNhZ2UKKz09PT09CisKK1RoZSBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGZvciBQcm90b2NvbCBCdWZmZXJzIGlzIGF2YWlsYWJsZSB2aWEgdGhlCit3ZWIgYXQ6CisKKyAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9wb20ueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3NDZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9wb20ueG1sCkBAIC0wLDAgKzEsMjA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmdvb2dsZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKyAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5wcm90b2J1ZjwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+cHJvdG9idWYtamF2YTwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+Mi41LjA8L3ZlcnNpb24+CisgIDxwYWNrYWdpbmc+YnVuZGxlPC9wYWNrYWdpbmc+CisgIDxuYW1lPlByb3RvY29sIEJ1ZmZlciBKYXZhIEFQSTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIFByb3RvY29sIEJ1ZmZlcnMgYXJlIGEgd2F5IG9mIGVuY29kaW5nIHN0cnVjdHVyZWQgZGF0YSBpbiBhbiBlZmZpY2llbnQgeWV0CisgICAgZXh0ZW5zaWJsZSBmb3JtYXQuCisgIDwvZGVzY3JpcHRpb24+CisgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+CisgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmPC91cmw+CisgIDxsaWNlbnNlcz4KKyAgICA8bGljZW5zZT4KKyAgICAgIDxuYW1lPk5ldyBCU0QgbGljZW5zZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHA8L3VybD4KKyAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgIDwvbGljZW5zZT4KKyAgPC9saWNlbnNlcz4KKyAgPHNjbT4KKyAgICA8dXJsPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi9zb3VyY2UvYnJvd3NlPC91cmw+CisgICAgPGNvbm5lY3Rpb24+CisgICAgICBzY206c3ZuOmh0dHA6Ly9wcm90b2J1Zi5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvCisgICAgPC9jb25uZWN0aW9uPgorICA8L3NjbT4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjQ8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVhc3ltb2NrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWFzeW1vY2s8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVhc3ltb2NrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWFzeW1vY2tjbGFzc2V4dGVuc2lvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMi4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KKyAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtc291cmNlczwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHRhc2tzPgorICAgICAgICAgICAgICAgIDxta2RpciBkaXI9InRhcmdldC9nZW5lcmF0ZWQtc291cmNlcyIgLz4KKyAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YV9vdXQ9dGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1wcm90b19wYXRoPS4uL3NyYyIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIgLz4KKyAgICAgICAgICAgICAgICA8L2V4ZWM+CisgICAgICAgICAgICAgIDwvdGFza3M+CisgICAgICAgICAgICAgIDxzb3VyY2VSb290PnRhcmdldC9nZW5lcmF0ZWQtc291cmNlczwvc291cmNlUm9vdD4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8dGFza3M+CisgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0idGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXMiIC8+CisgICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vc3JjL3Byb3RvYyI+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLWphdmFfb3V0PXRhcmdldC9nZW5lcmF0ZWQtdGVzdC1zb3VyY2VzIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1wcm90b19wYXRoPS4uL3NyYyIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZworICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL211bHRpcGxlX2ZpbGVzX3Rlc3QucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2J1aWxkZXJzX3Rlc3QucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbi5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZworICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgPC9leGVjPgorICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICA8dGVzdFNvdXJjZVJvb3Q+dGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXM8L3Rlc3RTb3VyY2VSb290PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+KjwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmxpdGU8L2lkPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9BYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovQnl0ZVN0cmluZy5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0NvZGVkSW5wdXRTdHJlYW0uamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Db2RlZE91dHB1dFN0cmVhbS5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0V4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0ZpZWxkU2V0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovR2VuZXJhdGVkTWVzc2FnZUxpdGUuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9JbnRlcm5hbC5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0xhenlTdHJpbmdBcnJheUxpc3QuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9MYXp5U3RyaW5nTGlzdC5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL01lc3NhZ2VMaXRlLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovTWVzc2FnZUxpdGVPckJ1aWxkZXIuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TbWFsbFNvcnRlZE1hcC5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9XaXJlRm9ybWF0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovUGFyc2VyLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovQWJzdHJhY3RQYXJzZXIuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Cb3VuZGVkQnl0ZVN0cmluZy5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0xpdGVyYWxCeXRlU3RyaW5nLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovUm9wZUJ5dGVTdHJpbmcuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9VdGY4LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovTGF6eUZpZWxkLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgIDx0ZXN0SW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPHRlc3RJbmNsdWRlPioqL0xpdGVUZXN0LmphdmE8L3Rlc3RJbmNsdWRlPgorICAgICAgICAgICAgICAgIDx0ZXN0SW5jbHVkZT4qKi8qTGl0ZS5qYXZhPC90ZXN0SW5jbHVkZT4KKyAgICAgICAgICAgICAgPC90ZXN0SW5jbHVkZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovTGl0ZVRlc3QuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5saXRlPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDExNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsOTMwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1lc3NhZ2V9IGludGVyZmFjZSB3aGljaCBpbXBsZW1lbnRzCisgKiBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2Ygb3RoZXIgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2UgeworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCisgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZpZWxkcygpKSB7CisgICAgICBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSB7CisgICAgICAgIGlmICghaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgeworICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgZm9yIChmaW5hbCBNZXNzYWdlIGVsZW1lbnQgOiAoTGlzdDxNZXNzYWdlPikgZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghKChNZXNzYWdlKSBlbnRyeS5nZXRWYWx1ZSgpKS5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkgeworICAgIHJldHVybiBCdWlsZGVyLmZpbmRNaXNzaW5nRmllbGRzKHRoaXMpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgeworICAgIHJldHVybiBkZWxpbWl0V2l0aENvbW1hcyhmaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVsaW1pdFdpdGhDb21tYXMoTGlzdDxTdHJpbmc+IHBhcnRzKSB7CisgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoU3RyaW5nIHBhcnQgOiBwYXJ0cykgeworICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQocGFydCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcodGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBib29sZWFuIGlzTWVzc2FnZVNldCA9CisgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCk7CisKKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICBnZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICBpZiAoaXNNZXNzYWdlU2V0ICYmIGZpZWxkLmlzRXh0ZW5zaW9uKCkgJiYKKyAgICAgICAgICBmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSAmJgorICAgICAgICAgICFmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihmaWVsZC5nZXROdW1iZXIoKSwgKE1lc3NhZ2UpIHZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZpZWxkU2V0LndyaXRlRmllbGQoZmllbGQsIHZhbHVlLCBvdXRwdXQpOworICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0gZ2V0VW5rbm93bkZpZWxkcygpOworICAgIGlmIChpc01lc3NhZ2VTZXQpIHsKKyAgICAgIHVua25vd25GaWVsZHMud3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOworICAgIH0gZWxzZSB7CisgICAgICB1bmtub3duRmllbGRzLndyaXRlVG8ob3V0cHV0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGludCBtZW1vaXplZFNpemUgPSAtMTsKKworICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgeworICAgIGludCBzaXplID0gbWVtb2l6ZWRTaXplOworICAgIGlmIChzaXplICE9IC0xKSB7CisgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBzaXplID0gMDsKKyAgICBmaW5hbCBib29sZWFuIGlzTWVzc2FnZVNldCA9CisgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCk7CisKKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICBnZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICBpZiAoaXNNZXNzYWdlU2V0ICYmIGZpZWxkLmlzRXh0ZW5zaW9uKCkgJiYKKyAgICAgICAgICBmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSAmJgorICAgICAgICAgICFmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCisgICAgICAgICAgICBmaWVsZC5nZXROdW1iZXIoKSwgKE1lc3NhZ2UpIHZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUgKz0gRmllbGRTZXQuY29tcHV0ZUZpZWxkU2l6ZShmaWVsZCwgdmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0gZ2V0VW5rbm93bkZpZWxkcygpOworICAgIGlmIChpc01lc3NhZ2VTZXQpIHsKKyAgICAgIHNpemUgKz0gdW5rbm93bkZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldCgpOworICAgIH0gZWxzZSB7CisgICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisKKyAgICBtZW1vaXplZFNpemUgPSBzaXplOworICAgIHJldHVybiBzaXplOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTWVzc2FnZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmluYWwgTWVzc2FnZSBvdGhlck1lc3NhZ2UgPSAoTWVzc2FnZSkgb3RoZXI7CisgICAgaWYgKGdldERlc2NyaXB0b3JGb3JUeXBlKCkgIT0gb3RoZXJNZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGdldEFsbEZpZWxkcygpLmVxdWFscyhvdGhlck1lc3NhZ2UuZ2V0QWxsRmllbGRzKCkpICYmCisgICAgICAgIGdldFVua25vd25GaWVsZHMoKS5lcXVhbHMob3RoZXJNZXNzYWdlLmdldFVua25vd25GaWVsZHMoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbnQgaGFzaCA9IDQxOworICAgIGhhc2ggPSAoMTkgKiBoYXNoKSArIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuaGFzaENvZGUoKTsKKyAgICBoYXNoID0gaGFzaEZpZWxkcyhoYXNoLCBnZXRBbGxGaWVsZHMoKSk7CisgICAgaGFzaCA9ICgyOSAqIGhhc2gpICsgZ2V0VW5rbm93bkZpZWxkcygpLmhhc2hDb2RlKCk7CisgICAgcmV0dXJuIGhhc2g7CisgIH0KKworICAvKiogR2V0IGEgaGFzaCBjb2RlIGZvciBnaXZlbiBmaWVsZHMgYW5kIHZhbHVlcywgdXNpbmcgdGhlIGdpdmVuIHNlZWQuICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwcm90ZWN0ZWQgaW50IGhhc2hGaWVsZHMoaW50IGhhc2gsIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gbWFwKSB7CisgICAgZm9yIChNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgIGhhc2ggPSAoMzcgKiBoYXNoKSArIGZpZWxkLmdldE51bWJlcigpOworICAgICAgaWYgKGZpZWxkLmdldFR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNKXsKKyAgICAgICAgaGFzaCA9ICg1MyAqIGhhc2gpICsgdmFsdWUuaGFzaENvZGUoKTsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgIExpc3Q8PyBleHRlbmRzIEVudW1MaXRlPiBsaXN0ID0gKExpc3Q8PyBleHRlbmRzIEVudW1MaXRlPikgdmFsdWU7CisgICAgICAgIGhhc2ggPSAoNTMgKiBoYXNoKSArIGhhc2hFbnVtTGlzdChsaXN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhhc2ggPSAoNTMgKiBoYXNoKSArIGhhc2hFbnVtKChFbnVtTGl0ZSkgdmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0uCisgICAqIEBzZWUgQm9vbGVhbiNoYXNoQ29kZSgpCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGludCBoYXNoTG9uZyhsb25nIG4pIHsKKyAgICByZXR1cm4gKGludCkgKG4gXiAobiA+Pj4gMzIpKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0uCisgICAqIEBzZWUgQm9vbGVhbiNoYXNoQ29kZSgpCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGludCBoYXNoQm9vbGVhbihib29sZWFuIGIpIHsKKyAgICByZXR1cm4gYiA/IDEyMzEgOiAxMjM3OworICB9CisKKyAgLyoqCisgICAqIFBhY2thZ2UgcHJpdmF0ZSBoZWxwZXIgbWV0aG9kIGZvciBBYnN0cmFjdFBhcnNlciB0byBjcmVhdGUKKyAgICogVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gd2l0aCBtaXNzaW5nIGZpZWxkIGluZm9ybWF0aW9uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKCkgeworICAgIHJldHVybiBCdWlsZGVyLm5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKHRoaXMpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgTWVzc2FnZSNoYXNoQ29kZSgpfS4KKyAgICogPHA+CisgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Uge0BsaW5rIGphdmEubGFuZy5FbnVtI2hhc2hDb2RlKCl9IGlzIGZpbmFsLCBidXQgd2UKKyAgICogbmVlZCB0byB1c2UgdGhlIGZpZWxkIG51bWJlciBhcyB0aGUgaGFzaCBjb2RlIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5CisgICAqIGJldHdlZW4gc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGVudW0gb2JqZWN0cy4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgaW50IGhhc2hFbnVtKEVudW1MaXRlIGUpIHsKKyAgICByZXR1cm4gZS5nZXROdW1iZXIoKTsKKyAgfQorCisgIC8qKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0uICovCisgIHByb3RlY3RlZCBzdGF0aWMgaW50IGhhc2hFbnVtTGlzdChMaXN0PD8gZXh0ZW5kcyBFbnVtTGl0ZT4gbGlzdCkgeworICAgIGludCBoYXNoID0gMTsKKyAgICBmb3IgKEVudW1MaXRlIGUgOiBsaXN0KSB7CisgICAgICBoYXNoID0gMzEgKiBoYXNoICsgaGFzaEVudW0oZSk7CisgICAgfQorICAgIHJldHVybiBoYXNoOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBpbnRlcmZhY2Ugd2hpY2gKKyAgICogaW1wbGVtZW50cyBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2YKKyAgICogb3RoZXIgbWV0aG9kcy4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPgorICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXI8QnVpbGRlclR5cGU+CisgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2UuQnVpbGRlciB7CisgICAgLy8gVGhlIGNvbXBpbGVyIHByb2R1Y2VzIGFuIGVycm9yIGlmIHRoaXMgaXMgbm90IGRlY2xhcmVkIGV4cGxpY2l0bHkuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIGNsb25lKCk7CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7CisgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICBnZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgIGNsZWFyRmllbGQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgfQorICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpIHsKKyAgICAgIHJldHVybiBmaW5kTWlzc2luZ0ZpZWxkcyh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSB7CisgICAgICByZXR1cm4gZGVsaW1pdFdpdGhDb21tYXMoZmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgTWVzc2FnZSBvdGhlcikgeworICAgICAgaWYgKG90aGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJtZXJnZUZyb20oTWVzc2FnZSkgY2FuIG9ubHkgbWVyZ2UgbWVzc2FnZXMgb2YgdGhlIHNhbWUgdHlwZS4iKTsKKyAgICAgIH0KKworICAgICAgLy8gTm90ZTogIFdlIGRvbid0IGF0dGVtcHQgdG8gdmVyaWZ5IHRoYXQgb3RoZXIncyBmaWVsZHMgaGF2ZSB2YWxpZAorICAgICAgLy8gICB0eXBlcy4gIERvaW5nIHNvIHdvdWxkIGJlIGEgbG9zaW5nIGJhdHRsZS4gIFdlJ2QgaGF2ZSB0byB2ZXJpZnkKKyAgICAgIC8vICAgYWxsIHN1Yi1tZXNzYWdlcyBhcyB3ZWxsLCBhbmQgd2UnZCBoYXZlIHRvIG1ha2UgY29waWVzIG9mIGFsbCBvZgorICAgICAgLy8gICB0aGVtIHRvIGluc3VyZSB0aGF0IHRoZXkgZG9uJ3QgY2hhbmdlIGFmdGVyIHZlcmlmaWNhdGlvbiAoc2luY2UKKyAgICAgIC8vICAgdGhlIE1lc3NhZ2UgaW50ZXJmYWNlIGl0c2VsZiBjYW5ub3QgZW5mb3JjZSBpbW11dGFiaWxpdHkgb2YKKyAgICAgIC8vICAgaW1wbGVtZW50YXRpb25zKS4KKyAgICAgIC8vIFRPRE8oa2VudG9uKTogIFByb3ZpZGUgYSBmdW5jdGlvbiBzb21ld2hlcmUgY2FsbGVkIG1ha2VEZWVwQ29weSgpCisgICAgICAvLyAgIHdoaWNoIGFsbG93cyBwZW9wbGUgdG8gbWFrZSBzZWN1cmUgZGVlcCBjb3BpZXMgb2YgbWVzc2FnZXMuCisKKyAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBlbnRyeSA6CisgICAgICAgICAgIG90aGVyLmdldEFsbEZpZWxkcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgZWxlbWVudCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICBmaW5hbCBNZXNzYWdlIGV4aXN0aW5nVmFsdWUgPSAoTWVzc2FnZSlnZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgaWYgKGV4aXN0aW5nVmFsdWUgPT0gZXhpc3RpbmdWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpIHsKKyAgICAgICAgICAgIHNldEZpZWxkKGZpZWxkLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RmllbGQoZmllbGQsCisgICAgICAgICAgICAgIGV4aXN0aW5nVmFsdWUubmV3QnVpbGRlckZvclR5cGUoKQorICAgICAgICAgICAgICAgIC5tZXJnZUZyb20oZXhpc3RpbmdWYWx1ZSkKKyAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKChNZXNzYWdlKWVudHJ5LmdldFZhbHVlKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRGaWVsZChmaWVsZCwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbWVyZ2VVbmtub3duRmllbGRzKG90aGVyLmdldFVua25vd25GaWVsZHMoKSk7CisKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBtZXJnZUZyb20oaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5LmdldEVtcHR5UmVnaXN0cnkoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9CisgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKGdldFVua25vd25GaWVsZHMoKSk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBmaW5hbCBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOworICAgICAgICBpZiAodGFnID09IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWVyZ2VGaWVsZEZyb20oaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCksIHRoaXMsIG51bGwsIHRhZykpIHsKKyAgICAgICAgICAvLyBlbmQgZ3JvdXAgdGFnCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNldFVua25vd25GaWVsZHModW5rbm93bkZpZWxkcy5idWlsZCgpKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqIGhlbHBlciBtZXRob2QgdG8gaGFuZGxlIHtAY29kZSBidWlsZGVyfSBhbmQge0Bjb2RlIGV4dGVuc2lvbnN9LiAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVwZWF0ZWRGaWVsZCgKKyAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucywKKyAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogaGVscGVyIG1ldGhvZCB0byBoYW5kbGUge0Bjb2RlIGJ1aWxkZXJ9IGFuZCB7QGNvZGUgZXh0ZW5zaW9uc30uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGaWVsZCgKKyAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucywKKyAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXh0ZW5zaW9ucy5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBoZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSB7QGNvZGUgYnVpbGRlcn0gYW5kIHtAY29kZSBleHRlbnNpb25zfS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc09yaWdpbmFsTWVzc2FnZSgKKyAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucywKKyAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBidWlsZGVyLmhhc0ZpZWxkKGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogaGVscGVyIG1ldGhvZCB0byBoYW5kbGUge0Bjb2RlIGJ1aWxkZXJ9IGFuZCB7QGNvZGUgZXh0ZW5zaW9uc30uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZSBnZXRPcmlnaW5hbE1lc3NhZ2UoCisgICAgICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLAorICAgICAgICBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGV4dGVuc2lvbnMsCisgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gKE1lc3NhZ2UpIGJ1aWxkZXIuZ2V0RmllbGQoZmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChNZXNzYWdlKSBleHRlbnNpb25zLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogaGVscGVyIG1ldGhvZCB0byBoYW5kbGUge0Bjb2RlIGJ1aWxkZXJ9IGFuZCB7QGNvZGUgZXh0ZW5zaW9uc30uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZU9yaWdpbmFsTWVzc2FnZSgKKyAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucywKKyAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlcikgeworICAgICAgTWVzc2FnZSBvcmlnaW5hbE1lc3NhZ2UgPSBnZXRPcmlnaW5hbE1lc3NhZ2UoYnVpbGRlciwgZXh0ZW5zaW9ucywgZmllbGQpOworICAgICAgaWYgKG9yaWdpbmFsTWVzc2FnZSAhPSBudWxsKSB7CisgICAgICAgIHN1YkJ1aWxkZXIubWVyZ2VGcm9tKG9yaWdpbmFsTWVzc2FnZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfSwgYnV0CisgICAgICogcGFyc2VzIGEgc2luZ2xlIGZpZWxkLgorICAgICAqCisgICAgICogV2hlbiB7QGNvZGUgYnVpbGRlcn0gaXMgbm90IG51bGwsIHRoZSBtZXRob2Qgd2lsbCBwYXJzZSBhbmQgbWVyZ2UgdGhlCisgICAgICogZmllbGQgaW50byB7QGNvZGUgYnVpbGRlcn0uIE90aGVyd2lzZSwgaXQgd2lsbCB0cnkgdG8gcGFyc2UgdGhlIGZpZWxkCisgICAgICogaW50byB7QGNvZGUgZXh0ZW5zaW9uc30sIHdoZW4gaXQncyBjYWxsZWQgYnkgdGhlIHBhcnNpbmcgY29uc3RydWN0b3IgaW4KKyAgICAgKiBnZW5lcmF0ZWQgY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlTWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcsIHdoaWNoIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWFkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gbWVyZ2VGaWVsZEZyb20oCisgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMsCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgRGVzY3JpcHRvciB0eXBlLAorICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwKKyAgICAgICAgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zLAorICAgICAgICBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKHR5cGUuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkgJiYKKyAgICAgICAgICB0YWcgPT0gV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNX1RBRykgeworICAgICAgICBtZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25Gcm9tQ29kZWRTdHJlYW0oCisgICAgICAgICAgICBpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHR5cGUsIGJ1aWxkZXIsIGV4dGVuc2lvbnMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZmluYWwgaW50IHdpcmVUeXBlID0gV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpOworICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyID0gV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpOworCisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQ7CisgICAgICBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG51bGw7CisKKyAgICAgIGlmICh0eXBlLmlzRXh0ZW5zaW9uTnVtYmVyKGZpZWxkTnVtYmVyKSkgeworICAgICAgICAvLyBleHRlbnNpb25SZWdpc3RyeSBtYXkgYmUgZWl0aGVyIEV4dGVuc2lvblJlZ2lzdHJ5IG9yCisgICAgICAgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS4gIFNpbmNlIHRoZSB0eXBlIHdlIGFyZSBwYXJzaW5nIGlzIGEgZnVsbAorICAgICAgICAvLyBtZXNzYWdlLCBvbmx5IGEgZnVsbCBFeHRlbnNpb25SZWdpc3RyeSBjb3VsZCBwb3NzaWJseSBjb250YWluCisgICAgICAgIC8vIGV4dGVuc2lvbnMgb2YgaXQuICBPdGhlcndpc2Ugd2Ugd2lsbCB0cmVhdCB0aGUgcmVnaXN0cnkgYXMgaWYgaXQKKyAgICAgICAgLy8gd2VyZSBlbXB0eS4KKyAgICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5IGluc3RhbmNlb2YgRXh0ZW5zaW9uUmVnaXN0cnkpIHsKKyAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbiA9CisgICAgICAgICAgICAoKEV4dGVuc2lvblJlZ2lzdHJ5KSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgLmZpbmRFeHRlbnNpb25CeU51bWJlcih0eXBlLCBmaWVsZE51bWJlcik7CisgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpZWxkID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3I7CisgICAgICAgICAgICBkZWZhdWx0SW5zdGFuY2UgPSBleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlOworICAgICAgICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZSA9PSBudWxsICYmCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UtdHlwZWQgZXh0ZW5zaW9uIGxhY2tlZCBkZWZhdWx0IGluc3RhbmNlOiAiICsKKyAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZ1bGxOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYnVpbGRlciAhPSBudWxsKSB7CisgICAgICAgIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU51bWJlcihmaWVsZE51bWJlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdW5rbm93biA9IGZhbHNlOworICAgICAgYm9vbGVhbiBwYWNrZWQgPSBmYWxzZTsKKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHVua25vd24gPSB0cnVlOyAgLy8gVW5rbm93biBmaWVsZC4KKyAgICAgIH0gZWxzZSBpZiAod2lyZVR5cGUgPT0gRmllbGRTZXQuZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZSgKKyAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRMaXRlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlICAvKiBpc1BhY2tlZCAqLykpIHsKKyAgICAgICAgcGFja2VkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLmlzUGFja2FibGUoKSAmJgorICAgICAgICAgICAgICAgICB3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAorICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldExpdGVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLyogaXNQYWNrZWQgKi8pKSB7CisgICAgICAgIHBhY2tlZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFVua25vd24gd2lyZSB0eXBlLgorICAgICAgfQorCisgICAgICBpZiAodW5rbm93bikgeyAgLy8gVW5rbm93biBmaWVsZCBvciB3cm9uZyB3aXJlIHR5cGUuICBTa2lwLgorICAgICAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhY2tlZCkgeworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gaW5wdXQucmVhZFJhd1ZhcmludDMyKCk7CisgICAgICAgIGZpbmFsIGludCBsaW1pdCA9IGlucHV0LnB1c2hMaW1pdChsZW5ndGgpOworICAgICAgICBpZiAoZmllbGQuZ2V0TGl0ZVR5cGUoKSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5FTlVNKSB7CisgICAgICAgICAgd2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGZpZWxkLmdldEVudW1UeXBlKCkuZmluZFZhbHVlQnlOdW1iZXIocmF3VmFsdWUpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgLy8gSWYgdGhlIG51bWJlciBpc24ndCByZWNvZ25pemVkIGFzIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMKKyAgICAgICAgICAgICAgLy8gZW51bSwgZHJvcCBpdCAoZG9uJ3QgZXZlbiBhZGQgaXQgdG8gdW5rbm93bkZpZWxkcykuCisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkUmVwZWF0ZWRGaWVsZChidWlsZGVyLCBleHRlbnNpb25zLCBmaWVsZCwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPQorICAgICAgICAgICAgICBGaWVsZFNldC5yZWFkUHJpbWl0aXZlRmllbGQoaW5wdXQsIGZpZWxkLmdldExpdGVUeXBlKCkpOworICAgICAgICAgICAgYWRkUmVwZWF0ZWRGaWVsZChidWlsZGVyLCBleHRlbnNpb25zLCBmaWVsZCwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnB1dC5wb3BMaW1pdChsaW1pdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWU7CisgICAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgY2FzZSBHUk9VUDogeworICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXI7CisgICAgICAgICAgICBpZiAoZGVmYXVsdEluc3RhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGRlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICAgIG1lcmdlT3JpZ2luYWxNZXNzYWdlKGJ1aWxkZXIsIGV4dGVuc2lvbnMsIGZpZWxkLCBzdWJCdWlsZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0LnJlYWRHcm91cChmaWVsZC5nZXROdW1iZXIoKSwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgICAgICAgdmFsdWUgPSBzdWJCdWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgTUVTU0FHRTogeworICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXI7CisgICAgICAgICAgICBpZiAoZGVmYXVsdEluc3RhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGRlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICAgIG1lcmdlT3JpZ2luYWxNZXNzYWdlKGJ1aWxkZXIsIGV4dGVuc2lvbnMsIGZpZWxkLCBzdWJCdWlsZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICAgICAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgICBmaW5hbCBpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpOworICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXNuJ3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzIGVudW0sCisgICAgICAgICAgICAvLyBkcm9wIGl0LgorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5tZXJnZVZhcmludEZpZWxkKGZpZWxkTnVtYmVyLCByYXdWYWx1ZSk7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbHVlID0gRmllbGRTZXQucmVhZFByaW1pdGl2ZUZpZWxkKGlucHV0LCBmaWVsZC5nZXRMaXRlVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgIGFkZFJlcGVhdGVkRmllbGQoYnVpbGRlciwgZXh0ZW5zaW9ucywgZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRGaWVsZChidWlsZGVyLCBleHRlbnNpb25zLCBmaWVsZCwgdmFsdWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB7QGNvZGUgI21lcmdlRmllbGRGcm9tKCl9IHRvIHBhcnNlIGEgTWVzc2FnZVNldCBleHRlbnNpb24uCisgICAgICogSWYge0Bjb2RlIGJ1aWxkZXJ9IGlzIG5vdCBudWxsLCB0aGlzIG1ldGhvZCB3aWxsIG1lcmdlIE1lc3NhZ2VTZXQgaW50bworICAgICAqIHRoZSBidWlsZGVyLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIG1lcmdlIHRoZSBNZXNzYWdlU2V0IGludG8ge0Bjb2RlCisgICAgICogZXh0ZW5zaW9uc30uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25Gcm9tQ29kZWRTdHJlYW0oCisgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMsCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgRGVzY3JpcHRvciB0eXBlLAorICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwKKyAgICAgICAgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAvLyBUaGUgd2lyZSBmb3JtYXQgZm9yIE1lc3NhZ2VTZXQgaXM6CisgICAgICAvLyAgIG1lc3NhZ2UgTWVzc2FnZVNldCB7CisgICAgICAvLyAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgeworICAgICAgLy8gICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZUlkID0gMjsKKyAgICAgIC8vICAgICAgIHJlcXVpcmVkIGJ5dGVzIG1lc3NhZ2UgPSAzOworICAgICAgLy8gICAgIH0KKyAgICAgIC8vICAgfQorICAgICAgLy8gInR5cGVJZCIgaXMgdGhlIGV4dGVuc2lvbidzIGZpZWxkIG51bWJlci4gIFRoZSBleHRlbnNpb24gY2FuIG9ubHkgYmUKKyAgICAgIC8vIGEgbWVzc2FnZSB0eXBlLCB3aGVyZSAibWVzc2FnZSIgY29udGFpbnMgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhhdAorICAgICAgLy8gbWVzc2FnZS4KKyAgICAgIC8vCisgICAgICAvLyBJbiBwcmFjdGljZSwgd2Ugd2lsbCBwcm9iYWJseSBuZXZlciBzZWUgYSBNZXNzYWdlU2V0IGl0ZW0gaW4gd2hpY2gKKyAgICAgIC8vIHRoZSBtZXNzYWdlIGFwcGVhcnMgYmVmb3JlIHRoZSB0eXBlIElELCBvciB3aGVyZSBlaXRoZXIgZmllbGQgZG9lcyBub3QKKyAgICAgIC8vIGFwcGVhciBleGFjdGx5IG9uY2UuICBIb3dldmVyLCBpbiB0aGVvcnkgc3VjaCBjYXNlcyBhcmUgdmFsaWQsIHNvIHdlCisgICAgICAvLyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYWNjZXB0IHRoZW0uCisKKyAgICAgIGludCB0eXBlSWQgPSAwOworICAgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG51bGw7IC8vIElmIHdlIGVuY291bnRlciAibWVzc2FnZSIgYmVmb3JlICJ0eXBlSWQiCisgICAgICBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbiA9IG51bGw7CisKKyAgICAgIC8vIFJlYWQgYnl0ZXMgZnJvbSBpbnB1dCwgaWYgd2UgZ2V0IGl0J3MgdHlwZSBmaXJzdCB0aGVuIHBhcnNlIGl0IGVhZ2VybHksCisgICAgICAvLyBvdGhlcndpc2Ugd2Ugc3RvcmUgdGhlIHJhdyBieXRlcyBpbiBhIGxvY2FsIHZhcmlhYmxlLgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmluYWwgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKKyAgICAgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFnID09IFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRF9UQUcpIHsKKyAgICAgICAgICB0eXBlSWQgPSBpbnB1dC5yZWFkVUludDMyKCk7CisgICAgICAgICAgaWYgKHR5cGVJZCAhPSAwKSB7CisgICAgICAgICAgICAvLyBleHRlbnNpb25SZWdpc3RyeSBtYXkgYmUgZWl0aGVyIEV4dGVuc2lvblJlZ2lzdHJ5IG9yCisgICAgICAgICAgICAvLyBFeHRlbnNpb25SZWdpc3RyeUxpdGUuIFNpbmNlIHRoZSB0eXBlIHdlIGFyZSBwYXJzaW5nIGlzIGEgZnVsbAorICAgICAgICAgICAgLy8gbWVzc2FnZSwgb25seSBhIGZ1bGwgRXh0ZW5zaW9uUmVnaXN0cnkgY291bGQgcG9zc2libHkgY29udGFpbgorICAgICAgICAgICAgLy8gZXh0ZW5zaW9ucyBvZiBpdC4gT3RoZXJ3aXNlIHdlIHdpbGwgdHJlYXQgdGhlIHJlZ2lzdHJ5IGFzIGlmIGl0CisgICAgICAgICAgICAvLyB3ZXJlIGVtcHR5LgorICAgICAgICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5IGluc3RhbmNlb2YgRXh0ZW5zaW9uUmVnaXN0cnkpIHsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gKChFeHRlbnNpb25SZWdpc3RyeSkgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAuZmluZEV4dGVuc2lvbkJ5TnVtYmVyKHR5cGUsIHR5cGVJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRV9UQUcpIHsKKyAgICAgICAgICBpZiAodHlwZUlkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCAmJiBFeHRlbnNpb25SZWdpc3RyeUxpdGUuaXNFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cygpKSB7CisgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgdHlwZSwgc28gd2UgY2FuIHBhcnNlIGRpcmVjdGx5IGZyb20gdGhlCisgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggbm8gY29weWluZy4gIEhvb3JheSEKKyAgICAgICAgICAgICAgZWFnZXJseU1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICAgIGlucHV0LCBleHRlbnNpb24sIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyLCBleHRlbnNpb25zKTsKKyAgICAgICAgICAgICAgcmF3Qnl0ZXMgPSBudWxsOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzZWVuIGEgdHlwZSBJRCB5ZXQgb3Igd2Ugd2FudCBwYXJzZSBtZXNzYWdlIGxhemlseS4KKyAgICAgICAgICByYXdCeXRlcyA9IGlucHV0LnJlYWRCeXRlcygpOworCisgICAgICAgIH0gZWxzZSB7IC8vIFVua25vd24gdGFnLiBTa2lwIGl0LgorICAgICAgICAgIGlmICghaW5wdXQuc2tpcEZpZWxkKHRhZykpIHsKKyAgICAgICAgICAgIGJyZWFrOyAvLyBFbmQgb2YgZ3JvdXAKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU1fRU5EX1RBRyk7CisKKyAgICAgIC8vIFByb2Nlc3MgdGhlIHJhdyBieXRlcy4KKyAgICAgIGlmIChyYXdCeXRlcyAhPSBudWxsICYmIHR5cGVJZCAhPSAwKSB7IC8vIFplcm8gaXMgbm90IGEgdmFsaWQgdHlwZSBJRC4KKyAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7IC8vIFdlIGtub3duIHRoZSB0eXBlCisgICAgICAgICAgbWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uRnJvbUJ5dGVzKAorICAgICAgICAgICAgICByYXdCeXRlcywgZXh0ZW5zaW9uLCBleHRlbnNpb25SZWdpc3RyeSwgYnVpbGRlciwgZXh0ZW5zaW9ucyk7CisgICAgICAgIH0gZWxzZSB7IC8vIFdlIGRvbid0IGtub3cgaG93IHRvIHBhcnNlIHRoaXMuIElnbm9yZSBpdC4KKyAgICAgICAgICBpZiAocmF3Qnl0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkKHR5cGVJZCwgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRMZW5ndGhEZWxpbWl0ZWQocmF3Qnl0ZXMpLmJ1aWxkKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZWFnZXJseU1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbigKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24sCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3I7CisgICAgICBNZXNzYWdlIHZhbHVlID0gbnVsbDsKKyAgICAgIGlmIChoYXNPcmlnaW5hbE1lc3NhZ2UoYnVpbGRlciwgZXh0ZW5zaW9ucywgZmllbGQpKSB7CisgICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWxNZXNzYWdlID0KKyAgICAgICAgICAgIGdldE9yaWdpbmFsTWVzc2FnZShidWlsZGVyLCBleHRlbnNpb25zLCBmaWVsZCk7CisgICAgICAgIE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gb3JpZ2luYWxNZXNzYWdlLnRvQnVpbGRlcigpOworICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlID0gaW5wdXQucmVhZE1lc3NhZ2UoZXh0ZW5zaW9uLmRlZmF1bHRJbnN0YW5jZS5nZXRQYXJzZXJGb3JUeXBlKCksCisgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgfQorCisgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CisgICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbkZyb21CeXRlcygKKyAgICAgICAgQnl0ZVN0cmluZyByYXdCeXRlcywKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24sCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3I7CisgICAgICBib29sZWFuIGhhc09yaWdpbmFsVmFsdWUgPSBoYXNPcmlnaW5hbE1lc3NhZ2UoYnVpbGRlciwgZXh0ZW5zaW9ucywgZmllbGQpOworCisgICAgICBpZiAoaGFzT3JpZ2luYWxWYWx1ZSB8fCBFeHRlbnNpb25SZWdpc3RyeUxpdGUuaXNFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cygpKSB7CisgICAgICAgIC8vIElmIHRoZSBmaWVsZCBhbHJlYWR5IGV4aXN0cywgd2UganVzdCBwYXJzZSB0aGUgZmllbGQuCisgICAgICAgIE1lc3NhZ2UgdmFsdWUgPSBudWxsOworICAgICAgICBpZiAoaGFzT3JpZ2luYWxWYWx1ZSkgeworICAgICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWxNZXNzYWdlID0KKyAgICAgICAgICAgICAgZ2V0T3JpZ2luYWxNZXNzYWdlKGJ1aWxkZXIsIGV4dGVuc2lvbnMsIGZpZWxkKTsKKyAgICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlcj0gb3JpZ2luYWxNZXNzYWdlLnRvQnVpbGRlcigpOworICAgICAgICAgIHN1YkJ1aWxkZXIubWVyZ2VGcm9tKHJhd0J5dGVzLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgICAgdmFsdWUgPSBzdWJCdWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhbHVlID0gZXh0ZW5zaW9uLmRlZmF1bHRJbnN0YW5jZS5nZXRQYXJzZXJGb3JUeXBlKCkKKyAgICAgICAgICAgICAgLnBhcnNlUGFydGlhbEZyb20ocmF3Qnl0ZXMsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICAgICAgfQorICAgICAgICBzZXRGaWVsZChidWlsZGVyLCBleHRlbnNpb25zLCBmaWVsZCwgdmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIExhenlGaWVsZCB0byBsb2FkIE1lc3NhZ2VTZXQgbGF6aWx5LgorICAgICAgICBMYXp5RmllbGQgbGF6eUZpZWxkID0gbmV3IExhenlGaWVsZCgKKyAgICAgICAgICAgIGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5LCByYXdCeXRlcyk7CisgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAvLyBUT0RPKHhpYW5nbCk6IGl0IGxvb2tzIGxpa2UgdGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBieQorICAgICAgICAgIC8vIEV4dGVuZGFibGVCdWlsZGVyLCBidXQgSSdtIG5vdCBzdXJlLiBTbyBJIGRvdWJsZSBjaGVjayB0aGUgdHlwZSBvZgorICAgICAgICAgIC8vIGJ1aWxkZXIgaGVyZS4gSXQgbWF5IGJlIHVzZWxlc3MgYW5kIG5lZWQgbW9yZSBpbnZlc3RpZ2F0aW9uLgorICAgICAgICAgIGlmIChidWlsZGVyIGluc3RhbmNlb2YgRXh0ZW5kYWJsZUJ1aWxkZXIpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIGxhenlGaWVsZCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIGxhenlGaWVsZC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXh0ZW5zaW9ucy5zZXRGaWVsZChmaWVsZCwgbGF6eUZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZVVua25vd25GaWVsZHMoZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKKyAgICAgIHNldFVua25vd25GaWVsZHMoCisgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKGdldFVua25vd25GaWVsZHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgZ2V0RmllbGRCdWlsZGVyKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRGaWVsZEJ1aWxkZXIoKSBjYWxsZWQgb24gYW4gdW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiByZXBvcnRpbmcgbWlzc2luZyBmaWVsZHMgaW4KKyAgICAgKiB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uCisgICAgICAgIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgcmV0dXJuIG5ldyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihmaW5kTWlzc2luZ0ZpZWxkcyhtZXNzYWdlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGVzIHtAY29kZSB0aGlzLm1pc3NpbmdGaWVsZHN9IHdpdGggdGhlIGZ1bGwgInBhdGgiIG9mIGVhY2gKKyAgICAgKiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkIGluIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBmaW5kTWlzc2luZ0ZpZWxkcygKKyAgICAgICAgZmluYWwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgZmluZE1pc3NpbmdGaWVsZHMobWVzc2FnZSwgIiIsIHJlc3VsdHMpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisgICAgLyoqIFJlY3Vyc2l2ZSBoZWxwZXIgaW1wbGVtZW50aW5nIHtAbGluayAjZmluZE1pc3NpbmdGaWVsZHMoTWVzc2FnZSl9LiAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmluZE1pc3NpbmdGaWVsZHMoZmluYWwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXN1bHRzKSB7CisgICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6CisgICAgICAgICAgbWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZpZWxkcygpKSB7CisgICAgICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkgJiYgIW1lc3NhZ2UuaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmVzdWx0cy5hZGQocHJlZml4ICsgZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICBtZXNzYWdlLmdldEFsbEZpZWxkcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisKKyAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHZhbHVlKSB7CisgICAgICAgICAgICAgIGZpbmRNaXNzaW5nRmllbGRzKChNZXNzYWdlT3JCdWlsZGVyKSBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIGkrKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5oYXNGaWVsZChmaWVsZCkpIHsKKyAgICAgICAgICAgICAgZmluZE1pc3NpbmdGaWVsZHMoKE1lc3NhZ2VPckJ1aWxkZXIpIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN1Yk1lc3NhZ2VQcmVmaXgoZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KSB7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKHByZWZpeCk7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCcoJykKKyAgICAgICAgICAgICAgLmFwcGVuZChmaWVsZC5nZXRGdWxsTmFtZSgpKQorICAgICAgICAgICAgICAuYXBwZW5kKCcpJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKGZpZWxkLmdldE5hbWUoKSk7CisgICAgICB9CisgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgnWycpCisgICAgICAgICAgICAgIC5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICAgIC5hcHBlbmQoJ10nKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoJy4nKTsKKyAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHNlZW0gdG8gYmUgcmVxdWlyZWQgaW4gb3JkZXIgdG8gbWFrZSBqYXZhYworICAgIC8vIG5vdCBwcm9kdWNlIHdlaXJkIGVycm9ycyBsaWtlOgorICAgIC8vCisgICAgLy8gamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlLmphdmE6MjAzOiB0eXBlcworICAgIC8vICAgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjwKKyAgICAvLyAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EeW5hbWljTWVzc2FnZS5CdWlsZGVyPiBhbmQKKyAgICAvLyAgIGNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXI8CisgICAgLy8gICAgIGNvbS5nb29nbGUucHJvdG9idWYuRHluYW1pY01lc3NhZ2UuQnVpbGRlcj4gYXJlIGluY29tcGF0aWJsZTsgYm90aAorICAgIC8vICAgZGVmaW5lIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpLCBidXQgd2l0aCB1bnJlbGF0ZWQKKyAgICAvLyAgIHJldHVybiB0eXBlcy4KKyAgICAvLworICAgIC8vIFN0cmFuZ2VseSwgdGhlc2UgbGluZXMgYXJlIG9ubHkgbmVlZGVkIGlmIGphdmFjIGlzIGludm9rZWQgc2VwYXJhdGVseQorICAgIC8vIG9uIEFic3RyYWN0TWVzc2FnZS5qYXZhIGFuZCBBYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEuICBJZiBqYXZhYyBpcworICAgIC8vIGludm9rZWQgb24gYm90aCBzaW11bHRhbmVvdXNseSwgaXQgd29ya3MuICAoT3IgbWF5YmUgdGhlIGltcG9ydGFudAorICAgIC8vIHBvaW50IGlzIHdoZXRoZXIgb3Igbm90IER5bmFtaWNNZXNzYWdlLmphdmEgaXMgY29tcGlsZWQgdG9nZXRoZXIgd2l0aAorICAgIC8vIEFic3RyYWN0TWVzc2FnZUxpdGUuamF2YSAtLSBub3Qgc3VyZS4pICBJIHN1c3BlY3QgdGhpcyBpcyBhIGNvbXBpbGVyCisgICAgLy8gYnVnLgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBCeXRlU3RyaW5nIGRhdGEpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAorICAgICAgICBmaW5hbCBCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIGJ5dGVbXSBkYXRhKQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShkYXRhLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAorICAgICAgICBmaW5hbCBieXRlW10gZGF0YSwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbiwKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oZGF0YSwgb2ZmLCBsZW4sIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShpbnB1dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oCisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgfQorCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNmYzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhCkBAIC0wLDAgKzEsMzQzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNZXNzYWdlTGl0ZX0gaW50ZXJmYWNlIHdoaWNoCisgKiBpbXBsZW1lbnRzIGFzIG1hbnkgbWV0aG9kcyBvZiB0aGF0IGludGVyZmFjZSBhcyBwb3NzaWJsZSBpbiB0ZXJtcyBvZiBvdGhlcgorICogbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXNzYWdlTGl0ZSBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlIHsKKyAgcHVibGljIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBCeXRlU3RyaW5nLkNvZGVkQnVpbGRlciBvdXQgPQorICAgICAgICBCeXRlU3RyaW5nLm5ld0NvZGVkQnVpbGRlcihnZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgICAgIHdyaXRlVG8ob3V0LmdldENvZGVkT3V0cHV0KCkpOworICAgICAgcmV0dXJuIG91dC5idWlsZCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAiU2VyaWFsaXppbmcgdG8gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtnZXRTZXJpYWxpemVkU2l6ZSgpXTsKKyAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJlc3VsdCk7CisgICAgICB3cml0ZVRvKG91dHB1dCk7CisgICAgICBvdXRwdXQuY2hlY2tOb1NwYWNlTGVmdCgpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgIlNlcmlhbGl6aW5nIHRvIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAiICsKKyAgICAgICAgIihzaG91bGQgbmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IGJ1ZmZlclNpemUgPQorICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUHJlZmVycmVkQnVmZmVyU2l6ZShnZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9CisgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dCwgYnVmZmVyU2l6ZSk7CisgICAgd3JpdGVUbyhjb2RlZE91dHB1dCk7CisgICAgY29kZWRPdXRwdXQuZmx1c2goKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRGVsaW1pdGVkVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgc2VyaWFsaXplZCA9IGdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgZmluYWwgaW50IGJ1ZmZlclNpemUgPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUHJlZmVycmVkQnVmZmVyU2l6ZSgKKyAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShzZXJpYWxpemVkKSArIHNlcmlhbGl6ZWQpOworICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0ID0KKyAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2Uob3V0cHV0LCBidWZmZXJTaXplKTsKKyAgICBjb2RlZE91dHB1dC53cml0ZVJhd1ZhcmludDMyKHNlcmlhbGl6ZWQpOworICAgIHdyaXRlVG8oY29kZWRPdXRwdXQpOworICAgIGNvZGVkT3V0cHV0LmZsdXNoKCk7CisgIH0KKworICAvKioKKyAgICogUGFja2FnZSBwcml2YXRlIGhlbHBlciBtZXRob2QgZm9yIEFic3RyYWN0UGFyc2VyIHRvIGNyZWF0ZQorICAgKiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi4KKyAgICovCisgIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKCkgeworICAgIHJldHVybiBuZXcgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24odGhpcyk7CisgIH0KKworICAvKioKKyAgICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBpbnRlcmZhY2Ugd2hpY2gKKyAgICogaW1wbGVtZW50cyBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2YKKyAgICogb3RoZXIgbWV0aG9kcy4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPgorICAgICAgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZS5CdWlsZGVyIHsKKyAgICAvLyBUaGUgY29tcGlsZXIgcHJvZHVjZXMgYW4gZXJyb3IgaWYgdGhpcyBpcyBub3QgZGVjbGFyZWQgZXhwbGljaXRseS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYWJzdHJhY3QgQnVpbGRlclR5cGUgY2xvbmUoKTsKKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKKyAgICB9CisKKyAgICAvLyBSZS1kZWZpbmVkIGhlcmUgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuCisgICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIEJ5dGVTdHJpbmcgZGF0YSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7CisgICAgICAgIG1lcmdlRnJvbShpbnB1dCk7CisgICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgQnl0ZVN0cmluZyBkYXRhLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGEubmV3Q29kZWRJbnB1dCgpOworICAgICAgICBtZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOworICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKKyAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIGJ5dGVbXSBkYXRhKQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBtZXJnZUZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICBtZXJnZUZyb20oaW5wdXQpOworICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBlOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKworICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9CisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgbWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW5wdXQpOworICAgICAgbWVyZ2VGcm9tKGNvZGVkSW5wdXQpOworICAgICAgY29kZWRJbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGNvZGVkSW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGlucHV0KTsKKyAgICAgIG1lcmdlRnJvbShjb2RlZElucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICBjb2RlZElucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gSW5wdXRTdHJlYW0gaW1wbGVtZW50YXRpb25zIHdoaWNoIHJlYWRzIGZyb20gc29tZSBvdGhlciBJbnB1dFN0cmVhbQorICAgICAqIGJ1dCBpcyBsaW1pdGVkIHRvIGEgcGFydGljdWxhciBudW1iZXIgb2YgYnl0ZXMuICBVc2VkIGJ5CisgICAgICogbWVyZ2VEZWxpbWl0ZWRGcm9tKCkuICBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFja2FnZS1wcml2YXRlIHNvIHRoYXQKKyAgICAgKiBVbmtub3duRmllbGRTZXQgY2FuIHNoYXJlIGl0LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBMaW1pdGVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7CisgICAgICBwcml2YXRlIGludCBsaW1pdDsKKworICAgICAgTGltaXRlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgbGltaXQpIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gTWF0aC5taW4oc3VwZXIuYXZhaWxhYmxlKCksIGxpbWl0KTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobGltaXQgPD0gMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gc3VwZXIucmVhZCgpOworICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKKyAgICAgICAgICAtLWxpbWl0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGxlbiA9IE1hdGgubWluKGxlbiwgbGltaXQpOworICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIGlmIChyZXN1bHQgPj0gMCkgeworICAgICAgICAgIGxpbWl0IC09IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHN1cGVyLnNraXAoTWF0aC5taW4obiwgbGltaXQpKTsKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAgICAgbGltaXQgLT0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKAorICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKKyAgICAgIGlmIChmaXJzdEJ5dGUgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgZmluYWwgaW50IHNpemUgPSBDb2RlZElucHV0U3RyZWFtLnJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKKyAgICAgIGZpbmFsIElucHV0U3RyZWFtIGxpbWl0ZWRJbnB1dCA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOworICAgICAgbWVyZ2VGcm9tKGxpbWl0ZWRJbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIG1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwKKyAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gcmVwb3J0aW5nIG1pc3NpbmcgZmllbGRzIGluCisgICAgICogdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbgorICAgICAgICBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihNZXNzYWdlTGl0ZSBtZXNzYWdlKSB7CisgICAgICByZXR1cm4gbmV3IFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHtAY29kZSB2YWx1ZXN9IHRvIHRoZSB7QGNvZGUgbGlzdH0uICBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZAorICAgICAqIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUuICBVc2VycyBzaG91bGQgaWdub3JlIGl0LgorICAgICAqCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mIHtAY29kZSB2YWx1ZXN9IGlzCisgICAgICogbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIDxUPiB2b2lkIGFkZEFsbChmaW5hbCBJdGVyYWJsZTxUPiB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IHN1cGVyIFQ+IGxpc3QpIHsKKyAgICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBMYXp5U3RyaW5nTGlzdCkgeworICAgICAgICAvLyBGb3IgU3RyaW5nT3JCeXRlU3RyaW5nTGlzdHMsIGNoZWNrIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnRzIHRvIGF2b2lkCisgICAgICAgIC8vIGZvcmNpbmcgY29udmVyc2lvbnMgb2YgQnl0ZVN0cmluZ3MgdG8gU3RyaW5ncy4KKyAgICAgICAgY2hlY2tGb3JOdWxsVmFsdWVzKCgoTGF6eVN0cmluZ0xpc3QpIHZhbHVlcykuZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hlY2tGb3JOdWxsVmFsdWVzKHZhbHVlcyk7CisgICAgICB9CisgICAgICBpZiAodmFsdWVzIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFQ+IGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbjxUPikgdmFsdWVzOworICAgICAgICBsaXN0LmFkZEFsbChjb2xsZWN0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoZmluYWwgVCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JOdWxsVmFsdWVzKGZpbmFsIEl0ZXJhYmxlPD8+IHZhbHVlcykgeworICAgICAgZm9yIChmaW5hbCBPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdFBhcnNlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDlkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0UGFyc2VyLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RNZXNzYWdlTGl0ZS5CdWlsZGVyLkxpbWl0ZWRJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBQYXJzZXJ9IGludGVyZmFjZSB3aGljaCBpbXBsZW1lbnRzCisgKiBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2Ygb3RoZXIgbWV0aG9kcy4KKyAqCisgKiBOb3RlOiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYWxsIHRoZSBjb252ZW5pZW5jZSBtZXRob2RzIGluIHRoZQorICoge0BsaW5rIFBhcnNlcn0gaW50ZXJmYWNlLiBTZWUge0BsaW5rIFBhcnNlcn0gZm9yIHJlbGF0ZWQgamF2YWRvY3MuCisgKiBTdWJjbGFzc2VzIG5lZWQgdG8gaW1wbGVtZW50CisgKiB7QGxpbmsgUGFyc2VyI3BhcnNlUGFydGlhbEZyb20oQ29kZWRJbnB1dFN0cmVhbSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0KKyAqCisgKiBAYXV0aG9yIGxpdWppc2lAZ29vZ2xlLmNvbSAoUGhlcmwgTGl1KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJzZXI8TWVzc2FnZVR5cGUgZXh0ZW5kcyBNZXNzYWdlTGl0ZT4KKyAgICBpbXBsZW1lbnRzIFBhcnNlcjxNZXNzYWdlVHlwZT4geworICAvKioKKyAgICogQ3JlYXRlcyBhbiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBmb3IgTWVzc2FnZVR5cGUuCisgICAqLworICBwcml2YXRlIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uCisgICAgICBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihNZXNzYWdlVHlwZSBtZXNzYWdlKSB7CisgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBBYnN0cmFjdE1lc3NhZ2VMaXRlKSB7CisgICAgICByZXR1cm4gKChBYnN0cmFjdE1lc3NhZ2VMaXRlKSBtZXNzYWdlKS5uZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgbWVzc2FnZSBpcyBpbml0aWFsaXplZC4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gaWYgaXQgaXMgbm90IGluaXRpYWxpemVkLgorICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHRvIGNoZWNrLgorICAgKi8KKyAgcHJpdmF0ZSBNZXNzYWdlVHlwZSBjaGVja01lc3NhZ2VJbml0aWFsaXplZChNZXNzYWdlVHlwZSBtZXNzYWdlKQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAhbWVzc2FnZS5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKG1lc3NhZ2UpCisgICAgICAgICAgLmFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCkKKyAgICAgICAgICAuc2V0VW5maW5pc2hlZE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfQorICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIEVNUFRZX1JFR0lTVFJZCisgICAgICA9IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5nZXRFbXB0eVJlZ2lzdHJ5KCk7CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBFTVBUWV9SRUdJU1RSWSk7CisgIH0KKworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNoZWNrTWVzc2FnZUluaXRpYWxpemVkKAorICAgICAgICBwYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHBhcnNlRnJvbShpbnB1dCwgRU1QVFlfUkVHSVNUUlkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQnl0ZVN0cmluZyBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZVR5cGUgbWVzc2FnZTsKKyAgICB0cnkgeworICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGEubmV3Q29kZWRJbnB1dCgpOworICAgICAgbWVzc2FnZSA9IHBhcnNlUGFydGlhbEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGUuc2V0VW5maW5pc2hlZE1lc3NhZ2UobWVzc2FnZSk7CisgICAgICB9CisgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgQnl0ZVN0cmluZyB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKworICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKEJ5dGVTdHJpbmcgZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGRhdGEsIEVNUFRZX1JFR0lTVFJZKTsKKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oQnl0ZVN0cmluZyBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBjaGVja01lc3NhZ2VJbml0aWFsaXplZChwYXJzZVBhcnRpYWxGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSk7CisgIH0KKworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZUZyb20oZGF0YSwgRU1QVFlfUkVHSVNUUlkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhLCBvZmYsIGxlbik7CisgICAgICBNZXNzYWdlVHlwZSBtZXNzYWdlID0gcGFyc2VQYXJ0aWFsRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgdHJ5IHsKKyAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOworICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZS5zZXRVbmZpbmlzaGVkTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2VQYXJ0aWFsRnJvbShkYXRhLCBvZmYsIGxlbiwgRU1QVFlfUkVHSVNUUlkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oYnl0ZVtdIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGRhdGEsIDAsIGRhdGEubGVuZ3RoLCBleHRlbnNpb25SZWdpc3RyeSk7CisgIH0KKworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShieXRlW10gZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGRhdGEsIDAsIGRhdGEubGVuZ3RoLCBFTVBUWV9SRUdJU1RSWSk7CisgIH0KKworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBjaGVja01lc3NhZ2VJbml0aWFsaXplZCgKKyAgICAgICAgcGFyc2VQYXJ0aWFsRnJvbShkYXRhLCBvZmYsIGxlbiwgZXh0ZW5zaW9uUmVnaXN0cnkpKTsKKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2VGcm9tKGRhdGEsIG9mZiwgbGVuLCBFTVBUWV9SRUdJU1RSWSk7CisgIH0KKworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZUZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2VGcm9tKGRhdGEsIEVNUFRZX1JFR0lTVFJZKTsKKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkSW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGlucHV0KTsKKyAgICBNZXNzYWdlVHlwZSBtZXNzYWdlID0gcGFyc2VQYXJ0aWFsRnJvbShjb2RlZElucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgdHJ5IHsKKyAgICAgIGNvZGVkSW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0KKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKElucHV0U3RyZWFtIGlucHV0KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHBhcnNlUGFydGlhbEZyb20oaW5wdXQsIEVNUFRZX1JFR0lTVFJZKTsKKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNoZWNrTWVzc2FnZUluaXRpYWxpemVkKAorICAgICAgICBwYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZUZyb20oaW5wdXQsIEVNUFRZX1JFR0lTVFJZKTsKKyAgfQorCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxEZWxpbWl0ZWRGcm9tKAorICAgICAgSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICBpbnQgc2l6ZTsKKyAgICB0cnkgeworICAgICAgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKKyAgICAgIGlmIChmaXJzdEJ5dGUgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBzaXplID0gQ29kZWRJbnB1dFN0cmVhbS5yZWFkUmF3VmFyaW50MzIoZmlyc3RCeXRlLCBpbnB1dCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIElucHV0U3RyZWFtIGxpbWl0ZWRJbnB1dCA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOworICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGxpbWl0ZWRJbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbERlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2VQYXJ0aWFsRGVsaW1pdGVkRnJvbShpbnB1dCwgRU1QVFlfUkVHSVNUUlkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRGVsaW1pdGVkRnJvbSgKKyAgICAgIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNoZWNrTWVzc2FnZUluaXRpYWxpemVkKAorICAgICAgICBwYXJzZVBhcnRpYWxEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpOworICB9CisKKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZURlbGltaXRlZEZyb20oaW5wdXQsIEVNUFRZX1JFR0lTVFJZKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1JwY0NoYW5uZWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdScGNDaGFubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MTE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdScGNDaGFubmVsLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIDxwPkFic3RyYWN0IGludGVyZmFjZSBmb3IgYSBibG9ja2luZyBSUEMgY2hhbm5lbC4gIHtAY29kZSBCbG9ja2luZ1JwY0NoYW5uZWx9CisgKiBpcyB0aGUgYmxvY2tpbmcgZXF1aXZhbGVudCB0byB7QGxpbmsgUnBjQ2hhbm5lbH0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqIEBhdXRob3IgY3Bvdmlya0Bnb29nbGUuY29tIENocmlzIFBvdmlyaworICovCitwdWJsaWMgaW50ZXJmYWNlIEJsb2NraW5nUnBjQ2hhbm5lbCB7CisgIC8qKgorICAgKiBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlIGFuZCBibG9ja3MgdW50aWwgaXQgcmV0dXJucy4KKyAgICoge0Bjb2RlIGNhbGxCbG9ja2luZ01ldGhvZCgpfSBpcyB0aGUgYmxvY2tpbmcgZXF1aXZhbGVudCB0bworICAgKiB7QGxpbmsgUnBjQ2hhbm5lbCNjYWxsTWV0aG9kfS4KKyAgICovCisgIE1lc3NhZ2UgY2FsbEJsb2NraW5nTWV0aG9kKAorICAgICAgRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCisgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCisgICAgICBNZXNzYWdlIHJlcXVlc3QsCisgICAgICBNZXNzYWdlIHJlc3BvbnNlUHJvdG90eXBlKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdTZXJ2aWNlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jsb2NraW5nU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzgwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jsb2NraW5nU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworLyoqCisgKiBCbG9ja2luZyBlcXVpdmFsZW50IHRvIHtAbGluayBTZXJ2aWNlfS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICogQGF1dGhvciBjcG92aXJrQGdvb2dsZS5jb20gQ2hyaXMgUG92aXJrCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmxvY2tpbmdTZXJ2aWNlIHsKKyAgLyoqCisgICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjZ2V0RGVzY3JpcHRvckZvclR5cGV9LgorICAgKi8KKyAgRGVzY3JpcHRvcnMuU2VydmljZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKKworICAvKioKKyAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgU2VydmljZSNjYWxsTWV0aG9kfSwgZXhjZXB0IHRoYXQKKyAgICoge0Bjb2RlIGNhbGxCbG9ja2luZ01ldGhvZCgpfSByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIFJQQyBvciB0aHJvd3MgYQorICAgKiB7QGxpbmsgU2VydmljZUV4Y2VwdGlvbn0gaWYgdGhlcmUgaXMgYSBmYWlsdXJlLCByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZQorICAgKiBpbmZvcm1hdGlvbiB0byBhIGNhbGxiYWNrLgorICAgKi8KKyAgTWVzc2FnZSBjYWxsQmxvY2tpbmdNZXRob2QoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSByZXF1ZXN0KSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgU2VydmljZSNnZXRSZXF1ZXN0UHJvdG90eXBlfS4KKyAgICovCisgIE1lc3NhZ2UgZ2V0UmVxdWVzdFByb3RvdHlwZShEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCk7CisKKyAgLyoqCisgICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjZ2V0UmVzcG9uc2VQcm90b3R5cGV9LgorICAgKi8KKyAgTWVzc2FnZSBnZXRSZXNwb25zZVByb3RvdHlwZShEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0JvdW5kZWRCeXRlU3RyaW5nLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0JvdW5kZWRCeXRlU3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0OTgyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQm91bmRlZEJ5dGVTdHJpbmcuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgc3Vic3RyaW5nIG9mIGEge0BsaW5rIEJ5dGVTdHJpbmd9IG92ZXIgYQorICogc2luZ2xlIGJ5dGUgYXJyYXkuIEluIHRlcm1zIG9mIHRoZSBwdWJsaWMgQVBJIG9mIHtAbGluayBCeXRlU3RyaW5nfSwgeW91IGVuZAorICogdXAgaGVyZSBieSBjYWxsaW5nIHtAbGluayBCeXRlU3RyaW5nI2NvcHlGcm9tKGJ5dGVbXSl9IGZvbGxvd2VkIGJ5IHtAbGluaworICogQnl0ZVN0cmluZyNzdWJzdHJpbmcoaW50LCBpbnQpfS4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGNvbnRhaW5zIG1vc3Qgb2YgdGhlIG92ZXJoZWFkIGludm9sdmVkIGluIGNyZWF0aW5nIGEgc3Vic3RyaW5nCisgKiBmcm9tIGEge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nfS4gIFRoZSBvdmVyaGVhZCBpbnZvbHZlcyBzb21lIHJhbmdlLWNoZWNraW5nCisgKiBhbmQgdHdvIGV4dHJhIGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIChDYXJsIEhhdmVybCkKKyAqLworY2xhc3MgQm91bmRlZEJ5dGVTdHJpbmcgZXh0ZW5kcyBMaXRlcmFsQnl0ZVN0cmluZyB7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgYnl0ZXNPZmZzZXQ7CisgIHByaXZhdGUgZmluYWwgaW50IGJ5dGVzTGVuZ3RoOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEge0Bjb2RlIEJvdW5kZWRCeXRlU3RyaW5nfSBiYWNrZWQgYnkgdGhlIHN1Yi1yYW5nZSBvZiBnaXZlbiBhcnJheSwKKyAgICogd2l0aG91dCBjb3B5aW5nLgorICAgKgorICAgKiBAcGFyYW0gYnl0ZXMgIGFycmF5IHRvIHdyYXAKKyAgICogQHBhcmFtIG9mZnNldCBpbmRleCB0byBmaXJzdCBieXRlIHRvIHVzZSBpbiBieXRlcworICAgKiBAcGFyYW0gbGVuZ3RoIG51bWJlciBvZiBieXRlcyB0byB1c2UgZnJvbSBieXRlcworICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0sIHtAY29kZSBsZW5ndGggPCAwfSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYge0Bjb2RlIG9mZnNldCArIGxlbmd0aCA+CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aH0uCisgICAqLworICBCb3VuZGVkQnl0ZVN0cmluZyhieXRlW10gYnl0ZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBzdXBlcihieXRlcyk7CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCB0b28gc21hbGw6ICIgKyBvZmZzZXQpOworICAgIH0KKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGVuZ3RoIHRvbyBzbWFsbDogIiArIG9mZnNldCk7CisgICAgfQorICAgIGlmICgobG9uZykgb2Zmc2V0ICsgbGVuZ3RoID4gYnl0ZXMubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJPZmZzZXQrTGVuZ3RoIHRvbyBsYXJnZTogIiArIG9mZnNldCArICIrIiArIGxlbmd0aCk7CisgICAgfQorCisgICAgdGhpcy5ieXRlc09mZnNldCA9IG9mZnNldDsKKyAgICB0aGlzLmJ5dGVzTGVuZ3RoID0gbGVuZ3RoOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgKiBUaHJvd3Mge0BsaW5rIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0KKyAgICogZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHJlYXNvbnMgYWx0aG91Z2ggaXQgd291bGQgbW9yZSBwcm9wZXJseSBiZQorICAgKiB7QGxpbmsgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0uCisgICAqCisgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiBieXRlCisgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHtAY29kZSBpbmRleH0gaXMgPCAwIG9yID49IHNpemUKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZSBieXRlQXQoaW50IGluZGV4KSB7CisgICAgLy8gV2UgbXVzdCBjaGVjayB0aGUgaW5kZXggb3Vyc2VsdmVzIGFzIHdlIGNhbm5vdCByZWx5IG9uIEphdmEgYXJyYXkgaW5kZXgKKyAgICAvLyBjaGVja2luZyBmb3Igc3Vic3RyaW5ncy4KKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleCB0b28gc21hbGw6ICIgKyBpbmRleCk7CisgICAgfQorICAgIGlmIChpbmRleCA+PSBzaXplKCkpIHsKKyAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCisgICAgICAgICAgIkluZGV4IHRvbyBsYXJnZTogIiArIGluZGV4ICsgIiwgIiArIHNpemUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzW2J5dGVzT2Zmc2V0ICsgaW5kZXhdOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICByZXR1cm4gYnl0ZXNMZW5ndGg7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGludCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSB7CisgICAgcmV0dXJuIGJ5dGVzT2Zmc2V0OworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQnl0ZVN0cmluZyAtPiBieXRlW10KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY29weVRvSW50ZXJuYWwoYnl0ZVtdIHRhcmdldCwgaW50IHNvdXJjZU9mZnNldCwgCisgICAgICBpbnQgdGFyZ2V0T2Zmc2V0LCBpbnQgbnVtYmVyVG9Db3B5KSB7CisgICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgZ2V0T2Zmc2V0SW50b0J5dGVzKCkgKyBzb3VyY2VPZmZzZXQsIHRhcmdldCwKKyAgICAgICAgdGFyZ2V0T2Zmc2V0LCBudW1iZXJUb0NvcHkpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQnl0ZUl0ZXJhdG9yCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCeXRlSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIG5ldyBCb3VuZGVkQnl0ZUl0ZXJhdG9yKCk7CisgIH0KKworICBwcml2YXRlIGNsYXNzIEJvdW5kZWRCeXRlSXRlcmF0b3IgaW1wbGVtZW50cyBCeXRlSXRlcmF0b3IgeworCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGltaXQ7CisKKyAgICBwcml2YXRlIEJvdW5kZWRCeXRlSXRlcmF0b3IoKSB7CisgICAgICBwb3NpdGlvbiA9IGdldE9mZnNldEludG9CeXRlcygpOworICAgICAgbGltaXQgPSBwb3NpdGlvbiArIHNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgcmV0dXJuIChwb3NpdGlvbiA8IGxpbWl0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnl0ZSBuZXh0KCkgeworICAgICAgLy8gQm94aW5nIGNhbGxzIEJ5dGUudmFsdWVPZihieXRlKSwgd2hpY2ggZG9lcyBub3QgaW5zdGFudGlhdGUuCisgICAgICByZXR1cm4gbmV4dEJ5dGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBuZXh0Qnl0ZSgpIHsKKyAgICAgIGlmIChwb3NpdGlvbiA+PSBsaW1pdCkgeworICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgcmV0dXJuIGJ5dGVzW3Bvc2l0aW9uKytdOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Q4MzFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nLmphdmEKQEAgLTAsMCArMSw5NzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBJbW11dGFibGUgc2VxdWVuY2Ugb2YgYnl0ZXMuICBTdWJzdHJpbmcgaXMgc3VwcG9ydGVkIGJ5IHNoYXJpbmcgdGhlIHJlZmVyZW5jZQorICogdG8gdGhlIGltbXV0YWJsZSB1bmRlcmx5aW5nIGJ5dGVzLCBhcyB3aXRoIHtAbGluayBTdHJpbmd9LiAgQ29uY2F0ZW5hdGlvbiBpcworICogbGlrZXdpc2Ugc3VwcG9ydGVkIHdpdGhvdXQgY29weWluZyAobG9uZyBzdHJpbmdzKSBieSBidWlsZGluZyBhIHRyZWUgb2YKKyAqIHBpZWNlcyBpbiB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9LgorICogPHA+CisgKiBMaWtlIHtAbGluayBTdHJpbmd9LCB0aGUgY29udGVudHMgb2YgYSB7QGxpbmsgQnl0ZVN0cmluZ30gY2FuIG5ldmVyIGJlCisgKiBvYnNlcnZlZCB0byBjaGFuZ2UsIG5vdCBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBhIGRhdGEgcmFjZSBvciBpbmNvcnJlY3QKKyAqIEFQSSB1c2FnZSBpbiB0aGUgY2xpZW50IGNvZGUuCisgKgorICogQGF1dGhvciBjcmF6eWJvYkBnb29nbGUuY29tIEJvYiBMZWUKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIENhcmwgSGF2ZXJsCisgKiBAYXV0aG9yIG1hcnRpbnJiQGdvb2dsZS5jb20gTWFydGluIEJ1Y2hob2x6CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCeXRlU3RyaW5nIGltcGxlbWVudHMgSXRlcmFibGU8Qnl0ZT4geworCisgIC8qKgorICAgKiBXaGVuIHR3byBzdHJpbmdzIHRvIGJlIGNvbmNhdGVuYXRlZCBoYXZlIGEgY29tYmluZWQgbGVuZ3RoIHNob3J0ZXIgdGhhbgorICAgKiB0aGlzLCB3ZSBqdXN0IGNvcHkgdGhlaXIgYnl0ZXMgb24ge0BsaW5rICNjb25jYXQoQnl0ZVN0cmluZyl9LgorICAgKiBUaGUgdHJhZGUtb2ZmIGlzIGNvcHkgc2l6ZSB2ZXJzdXMgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIHRyZWUgbm9kZXMKKyAgICogaW4ge0BsaW5rIFJvcGVCeXRlU3RyaW5nfS4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ0FURU5BVEVfQllfQ09QWV9TSVpFID0gMTI4OworCisgIC8qKgorICAgKiBXaGVuIGNvcHlpbmcgYW4gSW5wdXRTdHJlYW0gaW50byBhIEJ5dGVTdHJpbmcgd2l0aCAucmVhZEZyb20oKSwKKyAgICogdGhlIGNodW5rcyBpbiB0aGUgdW5kZXJseWluZyByb3BlIHN0YXJ0IGF0IDI1NiBieXRlcywgYnV0IGRvdWJsZQorICAgKiBlYWNoIGl0ZXJhdGlvbiB1cCB0byA4MTkyIGJ5dGVzLgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGludCBNSU5fUkVBRF9GUk9NX0NIVU5LX1NJWkUgPSAweDEwMDsgIC8vIDI1NmIKKyAgc3RhdGljIGZpbmFsIGludCBNQVhfUkVBRF9GUk9NX0NIVU5LX1NJWkUgPSAweDIwMDA7ICAvLyA4aworCisgIC8qKgorICAgKiBFbXB0eSB7QGNvZGUgQnl0ZVN0cmluZ30uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVTdHJpbmcgRU1QVFkgPSBuZXcgTGl0ZXJhbEJ5dGVTdHJpbmcobmV3IGJ5dGVbMF0pOworCisgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgaGVyZSB0byBwcmV2ZW50IHN1YmNsYXNzaW5nIG91dHNpZGUgb2YgdGhpcyBwYWNrYWdlLAorICBCeXRlU3RyaW5nKCkge30KKworICAvKioKKyAgICogR2V0cyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yCisgICAqIHJhbmRvbSBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBieXRlcy4gVG8gYWNjZXNzIGJ5dGVzIHNlcXVlbnRpYWxseSwgdXNlIHRoZQorICAgKiB7QGxpbmsgQnl0ZUl0ZXJhdG9yfSByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9LCBhbmQgY2FsbCB7QGxpbmsKKyAgICogI3N1YnN0cmluZyhpbnQsIGludCl9IGZpcnN0IGlmIG5lY2Vzc2FyeS4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIGJ5dGUKKyAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24ge0Bjb2RlIGluZGV4fSBpcyA8IDAgb3IgPj0gc2l6ZQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJ5dGUgYnl0ZUF0KGludCBpbmRleCk7CisKKyAgLyoqCisgICAqIFJldHVybiBhIHtAbGluayBCeXRlU3RyaW5nLkJ5dGVJdGVyYXRvcn0gb3ZlciB0aGUgYnl0ZXMgaW4gdGhlIEJ5dGVTdHJpbmcuCisgICAqIFRvIGF2b2lkIGF1dG8tYm94aW5nLCB5b3UgbWF5IGdldCB0aGUgaXRlcmF0b3IgbWFudWFsbHkgYW5kIGNhbGwKKyAgICoge0BsaW5rIEJ5dGVJdGVyYXRvciNuZXh0Qnl0ZSgpfS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgaXRlcmF0b3IKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBCeXRlSXRlcmF0b3IgaXRlcmF0b3IoKTsKKworICAvKioKKyAgICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB7QGNvZGUgSXRlcmF0b3I8Qnl0ZT59LCBzbyB0aGF0IHdlIGNhbiByZXR1cm4gYW4KKyAgICogdW5ib3hlZCB7QGNvZGUgYnl0ZX0uCisgICAqLworICBwdWJsaWMgaW50ZXJmYWNlIEJ5dGVJdGVyYXRvciBleHRlbmRzIEl0ZXJhdG9yPEJ5dGU+IHsKKyAgICAvKioKKyAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfSB0aGF0IHJldHVybnMgYW4KKyAgICAgKiB1bmJveGVkIHByaW1pdGl2ZSB7QGNvZGUgYnl0ZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHtAY29kZSBieXRlfSBpbiB0aGUgaXRlcmF0aW9uCisgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRpb24gaGFzIG5vIG1vcmUgZWxlbWVudHMKKyAgICAgKi8KKyAgICBieXRlIG5leHRCeXRlKCk7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgorICAgKgorICAgKiBAcmV0dXJuIHNpemUgaW4gYnl0ZXMKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2l6ZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc2l6ZSBpcyB7QGNvZGUgMH0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyB6ZXJvIGJ5dGVzIGxvbmcKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgcmV0dXJuIHNpemUoKSA9PSAwOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQnl0ZVN0cmluZyAtPiBzdWJzdHJpbmcKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBzdWJzdHJpbmcgZnJvbSB7QGNvZGUgYmVnaW5JbmRleH0sIGluY2x1c2l2ZSwgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICogc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gYmVnaW5JbmRleCBzdGFydCBhdCB0aGlzIGluZGV4CisgICAqIEByZXR1cm4gc3Vic3RyaW5nIHNoYXJpbmcgdW5kZXJseWluZyBkYXRhCisgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB7QGNvZGUgYmVnaW5JbmRleCA8IDB9IG9yCisgICAqICAgICB7QGNvZGUgYmVnaW5JbmRleCA+IHNpemUoKX0uCisgICAqLworICBwdWJsaWMgQnl0ZVN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luSW5kZXgpIHsKKyAgICByZXR1cm4gc3Vic3RyaW5nKGJlZ2luSW5kZXgsIHNpemUoKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBzdWJzdHJpbmcgZnJvbSB7QGNvZGUgYmVnaW5JbmRleH0sIGluY2x1c2l2ZSwgdG8ge0Bjb2RlCisgICAqIGVuZEluZGV4fSwgZXhjbHVzaXZlLgorICAgKgorICAgKiBAcGFyYW0gYmVnaW5JbmRleCBzdGFydCBhdCB0aGlzIGluZGV4CisgICAqIEBwYXJhbSBlbmRJbmRleCAgIHRoZSBsYXN0IGNoYXJhY3RlciBpcyB0aGUgb25lIGJlZm9yZSB0aGlzIGluZGV4CisgICAqIEByZXR1cm4gc3Vic3RyaW5nIHNoYXJpbmcgdW5kZXJseWluZyBkYXRhCisgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB7QGNvZGUgYmVnaW5JbmRleCA8IDB9LAorICAgKiAgICAge0Bjb2RlIGVuZEluZGV4ID4gc2l6ZSgpfSwgb3Ige0Bjb2RlIGJlZ2luSW5kZXggPiBlbmRJbmRleH0uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgQnl0ZVN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCk7CisKKyAgLyoqCisgICAqIFRlc3RzIGlmIHRoaXMgYnl0ZXN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC4KKyAgICogU2ltaWxhciB0byB7QGxpbmsgU3RyaW5nI3N0YXJ0c1dpdGgoU3RyaW5nKX0KKyAgICoKKyAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4LgorICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGEgcHJlZml4IG9mIHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5CisgICAqICAgICAgICAgdGhpcyBzdHJpbmc7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKEJ5dGVTdHJpbmcgcHJlZml4KSB7CisgICAgcmV0dXJuIHNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmCisgICAgICAgICAgIHN1YnN0cmluZygwLCBwcmVmaXguc2l6ZSgpKS5lcXVhbHMocHJlZml4KTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIGJ5dGVbXSAtPiBCeXRlU3RyaW5nCisKKyAgLyoqCisgICAqIENvcGllcyB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBhIHtAY29kZSBCeXRlU3RyaW5nfS4KKyAgICoKKyAgICogQHBhcmFtIGJ5dGVzIHNvdXJjZSBhcnJheQorICAgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCBpbiBzb3VyY2UgYXJyYXkKKyAgICogQHBhcmFtIHNpemUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAgICogQHJldHVybiBuZXcge0Bjb2RlIEJ5dGVTdHJpbmd9CisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgeworICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgb2Zmc2V0LCBjb3B5LCAwLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IExpdGVyYWxCeXRlU3RyaW5nKGNvcHkpOworICB9CisKKyAgLyoqCisgICAqIENvcGllcyB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBhIHtAY29kZSBCeXRlU3RyaW5nfS4KKyAgICoKKyAgICogQHBhcmFtIGJ5dGVzIHRvIGNvcHkKKyAgICogQHJldHVybiBuZXcge0Bjb2RlIEJ5dGVTdHJpbmd9CisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oYnl0ZVtdIGJ5dGVzKSB7CisgICAgcmV0dXJuIGNvcHlGcm9tKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgLyoqCisgICAqIENvcGllcyB0aGUgbmV4dCB7QGNvZGUgc2l6ZX0gYnl0ZXMgZnJvbSBhIHtAY29kZSBqYXZhLm5pby5CeXRlQnVmZmVyfSBpbnRvCisgICAqIGEge0Bjb2RlIEJ5dGVTdHJpbmd9LgorICAgKgorICAgKiBAcGFyYW0gYnl0ZXMgc291cmNlIGJ1ZmZlcgorICAgKiBAcGFyYW0gc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShCeXRlQnVmZmVyIGJ5dGVzLCBpbnQgc2l6ZSkgeworICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgYnl0ZXMuZ2V0KGNvcHkpOworICAgIHJldHVybiBuZXcgTGl0ZXJhbEJ5dGVTdHJpbmcoY29weSk7CisgIH0KKworICAvKioKKyAgICogQ29waWVzIHRoZSByZW1haW5pbmcgYnl0ZXMgZnJvbSBhIHtAY29kZSBqYXZhLm5pby5CeXRlQnVmZmVyfSBpbnRvCisgICAqIGEge0Bjb2RlIEJ5dGVTdHJpbmd9LgorICAgKgorICAgKiBAcGFyYW0gYnl0ZXMgc291cmNlQnVmZmVyCisgICAqIEByZXR1cm4gbmV3IHtAY29kZSBCeXRlU3RyaW5nfQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKEJ5dGVCdWZmZXIgYnl0ZXMpIHsKKyAgICByZXR1cm4gY29weUZyb20oYnl0ZXMsIGJ5dGVzLnJlbWFpbmluZygpKTsKKyAgfQorCisgIC8qKgorICAgKiBFbmNvZGVzIHtAY29kZSB0ZXh0fSBpbnRvIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdXNpbmcgdGhlIG5hbWVkIGNoYXJzZXQKKyAgICogYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIHtAY29kZSBCeXRlU3RyaW5nfS4KKyAgICoKKyAgICogQHBhcmFtIHRleHQgc291cmNlIHN0cmluZworICAgKiBAcGFyYW0gY2hhcnNldE5hbWUgZW5jb2RpbmcgdG8gdXNlCisgICAqIEByZXR1cm4gbmV3IHtAY29kZSBCeXRlU3RyaW5nfQorICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIGVuY29kaW5nIGlzbid0IGZvdW5kCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oU3RyaW5nIHRleHQsIFN0cmluZyBjaGFyc2V0TmFtZSkKKyAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IExpdGVyYWxCeXRlU3RyaW5nKHRleHQuZ2V0Qnl0ZXMoY2hhcnNldE5hbWUpKTsKKyAgfQorCisgIC8qKgorICAgKiBFbmNvZGVzIHtAY29kZSB0ZXh0fSBpbnRvIGEgc2VxdWVuY2Ugb2YgVVRGLTggYnl0ZXMgYW5kIHJldHVybnMgdGhlCisgICAqIHJlc3VsdCBhcyBhIHtAY29kZSBCeXRlU3RyaW5nfS4KKyAgICoKKyAgICogQHBhcmFtIHRleHQgc291cmNlIHN0cmluZworICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbVV0ZjgoU3RyaW5nIHRleHQpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQnl0ZVN0cmluZyh0ZXh0LmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkPyIsIGUpOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIElucHV0U3RyZWFtIC0+IEJ5dGVTdHJpbmcKKworICAvKioKKyAgICogQ29tcGxldGVseSByZWFkcyB0aGUgZ2l2ZW4gc3RyZWFtJ3MgYnl0ZXMgaW50byBhCisgICAqIHtAY29kZSBCeXRlU3RyaW5nfSwgYmxvY2tpbmcgaWYgbmVjZXNzYXJ5IHVudGlsIGFsbCBieXRlcyBhcmUKKyAgICogcmVhZCB0aHJvdWdoIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICoKKyAgICogPGI+UGVyZm9ybWFuY2Ugbm90ZXM6PC9iPiBUaGUgcmV0dXJuZWQge0Bjb2RlIEJ5dGVTdHJpbmd9IGlzIGFuCisgICAqIGltbXV0YWJsZSB0cmVlIG9mIGJ5dGUgYXJyYXlzICgiY2h1bmtzIikgb2YgdGhlIHN0cmVhbSBkYXRhLiAgVGhlCisgICAqIGZpcnN0IGNodW5rIGlzIHNtYWxsLCB3aXRoIHN1YnNlcXVlbnQgY2h1bmtzIGVhY2ggYmVpbmcgZG91YmxlCisgICAqIHRoZSBzaXplLCB1cCB0byA4Sy4gIElmIHRoZSBjYWxsZXIga25vd3MgdGhlIHByZWNpc2UgbGVuZ3RoIG9mCisgICAqIHRoZSBzdHJlYW0gYW5kIHdpc2hlcyB0byBhdm9pZCBhbGwgdW5uZWNlc3NhcnkgY29waWVzIGFuZAorICAgKiBhbGxvY2F0aW9ucywgY29uc2lkZXIgdXNpbmcgdGhlIHR3by1hcmd1bWVudCB2ZXJzaW9uIG9mIHRoaXMKKyAgICogbWV0aG9kLCBiZWxvdy4KKyAgICoKKyAgICogQHBhcmFtIHN0cmVhbVRvRHJhaW4gVGhlIHNvdXJjZSBzdHJlYW0sIHdoaWNoIGlzIHJlYWQgY29tcGxldGVseQorICAgKiAgICAgYnV0IG5vdCBjbG9zZWQuCisgICAqIEByZXR1cm4gQSBuZXcge0Bjb2RlIEJ5dGVTdHJpbmd9IHdoaWNoIGlzIG1hZGUgdXAgb2YgY2h1bmtzIG9mCisgICAqICAgICB2YXJpb3VzIHNpemVzLCBkZXBlbmRpbmcgb24gdGhlIGJlaGF2aW9yIG9mIHRoZSB1bmRlcmx5aW5nCisgICAqICAgICBzdHJlYW0uCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSU9FeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQorICAgKiAgICAgcmVhZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgcmVhZEZyb20oSW5wdXRTdHJlYW0gc3RyZWFtVG9EcmFpbikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRGcm9tKAorICAgICAgICBzdHJlYW1Ub0RyYWluLCBNSU5fUkVBRF9GUk9NX0NIVU5LX1NJWkUsIE1BWF9SRUFEX0ZST01fQ0hVTktfU0laRSk7CisgIH0KKworICAvKioKKyAgICogQ29tcGxldGVseSByZWFkcyB0aGUgZ2l2ZW4gc3RyZWFtJ3MgYnl0ZXMgaW50byBhCisgICAqIHtAY29kZSBCeXRlU3RyaW5nfSwgYmxvY2tpbmcgaWYgbmVjZXNzYXJ5IHVudGlsIGFsbCBieXRlcyBhcmUKKyAgICogcmVhZCB0aHJvdWdoIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICoKKyAgICogPGI+UGVyZm9ybWFuY2Ugbm90ZXM6PC9iPiBUaGUgcmV0dXJuZWQge0Bjb2RlIEJ5dGVTdHJpbmd9IGlzIGFuCisgICAqIGltbXV0YWJsZSB0cmVlIG9mIGJ5dGUgYXJyYXlzICgiY2h1bmtzIikgb2YgdGhlIHN0cmVhbSBkYXRhLiAgVGhlCisgICAqIGNodW5rU2l6ZSBwYXJhbWV0ZXIgc2V0cyB0aGUgc2l6ZSBvZiB0aGVzZSBieXRlIGFycmF5cy4gSW4KKyAgICogcGFydGljdWxhciwgaWYgdGhlIGNodW5rU2l6ZSBpcyBwcmVjaXNlbHkgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aAorICAgKiBvZiB0aGUgc3RyZWFtLCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9ucyBhbmQgY29waWVzIHdpbGwgYmUKKyAgICogYXZvaWRlZC4gT3RoZXJ3aXNlLCB0aGUgY2h1bmtzIHdpbGwgYmUgb2YgdGhlIGdpdmVuIHNpemUsIGV4Y2VwdAorICAgKiBmb3IgdGhlIGxhc3QgY2h1bmssIHdoaWNoIHdpbGwgYmUgcmVzaXplZCAodmlhIGEgcmVhbGxvY2F0aW9uIGFuZAorICAgKiBjb3B5KSB0byBjb250YWluIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtIHN0cmVhbVRvRHJhaW4gVGhlIHNvdXJjZSBzdHJlYW0sIHdoaWNoIGlzIHJlYWQgY29tcGxldGVseQorICAgKiAgICAgYnV0IG5vdCBjbG9zZWQuCisgICAqIEBwYXJhbSBjaHVua1NpemUgVGhlIHNpemUgb2YgdGhlIGNodW5rcyBpbiB3aGljaCB0byByZWFkIHRoZQorICAgKiAgICAgc3RyZWFtLgorICAgKiBAcmV0dXJuIEEgbmV3IHtAY29kZSBCeXRlU3RyaW5nfSB3aGljaCBpcyBtYWRlIHVwIG9mIGNodW5rcyBvZgorICAgKiAgICAgdGhlIGdpdmVuIHNpemUuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSU9FeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQorICAgKiAgICAgcmVhZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgcmVhZEZyb20oSW5wdXRTdHJlYW0gc3RyZWFtVG9EcmFpbiwgaW50IGNodW5rU2l6ZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRGcm9tKHN0cmVhbVRvRHJhaW4sIGNodW5rU2l6ZSwgY2h1bmtTaXplKTsKKyAgfQorCisgIC8vIEhlbHBlciBtZXRob2QgdGhhdCB0YWtlcyB0aGUgY2h1bmsgc2l6ZSByYW5nZSBhcyBhIHBhcmFtZXRlci4KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIHJlYWRGcm9tKElucHV0U3RyZWFtIHN0cmVhbVRvRHJhaW4sIGludCBtaW5DaHVua1NpemUsCisgICAgICBpbnQgbWF4Q2h1bmtTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIENvbGxlY3Rpb248Qnl0ZVN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Qnl0ZVN0cmluZz4oKTsKKworICAgIC8vIGNvcHkgdGhlIGluYm91bmQgYnl0ZXMgaW50byBhIGxpc3Qgb2YgY2h1bmtzOyB0aGUgY2h1bmsgc2l6ZQorICAgIC8vIGdyb3dzIGV4cG9uZW50aWFsbHkgdG8gc3VwcG9ydCBib3RoIHNob3J0IGFuZCBsb25nIHN0cmVhbXMuCisgICAgaW50IGNodW5rU2l6ZSA9IG1pbkNodW5rU2l6ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgQnl0ZVN0cmluZyBjaHVuayA9IHJlYWRDaHVuayhzdHJlYW1Ub0RyYWluLCBjaHVua1NpemUpOworICAgICAgaWYgKGNodW5rID09IG51bGwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXN1bHRzLmFkZChjaHVuayk7CisgICAgICBjaHVua1NpemUgPSBNYXRoLm1pbihjaHVua1NpemUgKiAyLCBtYXhDaHVua1NpemUpOworICAgIH0KKworICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlc3VsdHMpOworICB9CisKKyAgLyoqCisgICAqIEJsb2NrcyB1bnRpbCBhIGNodW5rIG9mIHRoZSBnaXZlbiBzaXplIGNhbiBiZSBtYWRlIGZyb20gdGhlCisgICAqIHN0cmVhbSwgb3IgRU9GIGlzIHJlYWNoZWQuICBDYWxscyByZWFkKCkgcmVwZWF0ZWRseSBpbiBjYXNlIHRoZQorICAgKiBnaXZlbiBzdHJlYW0gaW1wbGVtZW50YXRpb24gZG9lc24ndCBjb21wbGV0ZWx5IGZpbGwgdGhlIGdpdmVuCisgICAqIGJ1ZmZlciBpbiBvbmUgcmVhZCgpIGNhbGwuCisgICAqCisgICAqIEByZXR1cm4gQSBjaHVuayBvZiB0aGUgZGVzaXJlZCBzaXplLCBvciBlbHNlIGEgY2h1bmsgYXMgbGFyZ2UgYXMKKyAgICogd2FzIGF2YWlsYWJsZSB3aGVuIGVuZCBvZiBzdHJlYW0gd2FzIHJlYWNoZWQuIFJldHVybnMgbnVsbCBpZiB0aGUKKyAgICogZ2l2ZW4gc3RyZWFtIGhhZCBubyBtb3JlIGRhdGEgaW4gaXQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIHJlYWRDaHVuayhJbnB1dFN0cmVhbSBpbiwgZmluYWwgaW50IGNodW5rU2l6ZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbY2h1bmtTaXplXTsKKyAgICAgIGludCBieXRlc1JlYWQgPSAwOworICAgICAgd2hpbGUgKGJ5dGVzUmVhZCA8IGNodW5rU2l6ZSkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpbi5yZWFkKGJ1ZiwgYnl0ZXNSZWFkLCBjaHVua1NpemUgLSBieXRlc1JlYWQpOworICAgICAgICBpZiAoY291bnQgPT0gLTEpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBieXRlc1JlYWQgKz0gY291bnQ7CisgICAgICB9CisKKyAgICAgIGlmIChieXRlc1JlYWQgPT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ1ZiwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIE11bHRpcGxlIEJ5dGVTdHJpbmdzIC0+IE9uZSBCeXRlU3RyaW5nCisKKyAgLyoqCisgICAqIENvbmNhdGVuYXRlIHRoZSBnaXZlbiB7QGNvZGUgQnl0ZVN0cmluZ30gdG8gdGhpcyBvbmUuIFNob3J0IGNvbmNhdGVuYXRpb25zLAorICAgKiBvZiB0b3RhbCBzaXplIHNtYWxsZXIgdGhhbiB7QGxpbmsgQnl0ZVN0cmluZyNDT05DQVRFTkFURV9CWV9DT1BZX1NJWkV9LCBhcmUKKyAgICogcHJvZHVjZWQgYnkgY29weWluZyB0aGUgdW5kZXJseWluZyBieXRlcyAoYXMgcGVyIFJvcGUuamF2YSwgPGEKKyAgICogaHJlZj0iaHR0cDovL3d3dy5jcy51YmMuY2EvbG9jYWwvcmVhZGluZy9wcm9jZWVkaW5ncy9zcGU5MS05NS9zcGUvdm9sMjUvaXNzdWUxMi9zcGU5ODYucGRmIj4KKyAgICogQkFQOTUgPC9hPi4gSW4gZ2VuZXJhbCwgdGhlIGNvbmNhdGVuYXRlIGludm9sdmVzIG5vIGNvcHlpbmcuCisgICAqCisgICAqIEBwYXJhbSBvdGhlciBzdHJpbmcgdG8gY29uY2F0ZW5hdGUKKyAgICogQHJldHVybiBhIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30gaW5zdGFuY2UKKyAgICovCisgIHB1YmxpYyBCeXRlU3RyaW5nIGNvbmNhdChCeXRlU3RyaW5nIG90aGVyKSB7CisgICAgaW50IHRoaXNTaXplID0gc2l6ZSgpOworICAgIGludCBvdGhlclNpemUgPSBvdGhlci5zaXplKCk7CisgICAgaWYgKChsb25nKSB0aGlzU2l6ZSArIG90aGVyU2l6ZSA+PSBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVN0cmluZyB3b3VsZCBiZSB0b28gbG9uZzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTaXplICsgIisiICsgb3RoZXJTaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gUm9wZUJ5dGVTdHJpbmcuY29uY2F0ZW5hdGUodGhpcywgb3RoZXIpOworICB9CisKKyAgLyoqCisgICAqIENvbmNhdGVuYXRlcyBhbGwgYnl0ZSBzdHJpbmdzIGluIHRoZSBpdGVyYWJsZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHJ1biBpbiBPKGxpc3Qgc2l6ZSksIG5vdCBPKHRvdGFsIGJ5dGVzKS4KKyAgICoKKyAgICogPHA+VGhlIHJldHVybmVkIHtAY29kZSBCeXRlU3RyaW5nfSBpcyBub3QgbmVjZXNzYXJpbHkgYSB1bmlxdWUgb2JqZWN0LgorICAgKiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgdGhlIHJldHVybmVkIG9iamVjdCBpcyB0aGUgc2luZ2xldG9uIGVtcHR5CisgICAqIHtAY29kZSBCeXRlU3RyaW5nfS4gIElmIHRoZSBsaXN0IGhhcyBvbmx5IG9uZSBlbGVtZW50LCB0aGF0CisgICAqIHtAY29kZSBCeXRlU3RyaW5nfSB3aWxsIGJlIHJldHVybmVkIHdpdGhvdXQgY29weWluZy4KKyAgICoKKyAgICogQHBhcmFtIGJ5dGVTdHJpbmdzIHN0cmluZ3MgdG8gYmUgY29uY2F0ZW5hdGVkCisgICAqIEByZXR1cm4gbmV3IHtAY29kZSBCeXRlU3RyaW5nfQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKEl0ZXJhYmxlPEJ5dGVTdHJpbmc+IGJ5dGVTdHJpbmdzKSB7CisgICAgQ29sbGVjdGlvbjxCeXRlU3RyaW5nPiBjb2xsZWN0aW9uOworICAgIGlmICghKGJ5dGVTdHJpbmdzIGluc3RhbmNlb2YgQ29sbGVjdGlvbikpIHsKKyAgICAgIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7CisgICAgICBmb3IgKEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA6IGJ5dGVTdHJpbmdzKSB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKGJ5dGVTdHJpbmcpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb248Qnl0ZVN0cmluZz4pIGJ5dGVTdHJpbmdzOworICAgIH0KKyAgICBCeXRlU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgIHJlc3VsdCA9IEVNUFRZOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSBiYWxhbmNlZENvbmNhdChjb2xsZWN0aW9uLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24uc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgY29weUZyb20oSXRlcmFibGU8Qnl0ZVN0cmluZz4pLgorICAvLyBDcmVhdGUgYSBiYWxhbmNlZCBjb25jYXRlbmF0aW9uIG9mIHRoZSBuZXh0ICJsZW5ndGgiIGVsZW1lbnRzIGZyb20gdGhlCisgIC8vIGl0ZXJhYmxlLgorICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIGJhbGFuY2VkQ29uY2F0KEl0ZXJhdG9yPEJ5dGVTdHJpbmc+IGl0ZXJhdG9yLAorICAgICAgaW50IGxlbmd0aCkgeworICAgIGFzc2VydCBsZW5ndGggPj0gMTsKKyAgICBCeXRlU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAobGVuZ3RoID09IDEpIHsKKyAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7CisgICAgICBCeXRlU3RyaW5nIGxlZnQgPSBiYWxhbmNlZENvbmNhdChpdGVyYXRvciwgaGFsZkxlbmd0aCk7CisgICAgICBCeXRlU3RyaW5nIHJpZ2h0ID0gYmFsYW5jZWRDb25jYXQoaXRlcmF0b3IsIGxlbmd0aCAtIGhhbGZMZW5ndGgpOworICAgICAgcmVzdWx0ID0gbGVmdC5jb25jYXQocmlnaHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQnl0ZVN0cmluZyAtPiBieXRlW10KKworICAvKioKKyAgICogQ29waWVzIGJ5dGVzIGludG8gYSBidWZmZXIgYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgICoKKyAgICogQHBhcmFtIHRhcmdldCBidWZmZXIgdG8gY29weSBpbnRvCisgICAqIEBwYXJhbSBvZmZzZXQgaW4gdGhlIHRhcmdldCBidWZmZXIKKyAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBvZmZzZXQgaXMgbmVnYXRpdmUgb3IgdG9vIGxhcmdlCisgICAqLworICBwdWJsaWMgdm9pZCBjb3B5VG8oYnl0ZVtdIHRhcmdldCwgaW50IG9mZnNldCkgeworICAgIGNvcHlUbyh0YXJnZXQsIDAsIG9mZnNldCwgc2l6ZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBDb3BpZXMgYnl0ZXMgaW50byBhIGJ1ZmZlci4KKyAgICoKKyAgICogQHBhcmFtIHRhcmdldCAgICAgICBidWZmZXIgdG8gY29weSBpbnRvCisgICAqIEBwYXJhbSBzb3VyY2VPZmZzZXQgb2Zmc2V0IHdpdGhpbiB0aGVzZSBieXRlcworICAgKiBAcGFyYW0gdGFyZ2V0T2Zmc2V0IG9mZnNldCB3aXRoaW4gdGhlIHRhcmdldCBidWZmZXIKKyAgICogQHBhcmFtIG51bWJlclRvQ29weSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgYW4gb2Zmc2V0IG9yIHNpemUgaXMgbmVnYXRpdmUgb3IgdG9vCisgICAqICAgICBsYXJnZQorICAgKi8KKyAgcHVibGljIHZvaWQgY29weVRvKGJ5dGVbXSB0YXJnZXQsIGludCBzb3VyY2VPZmZzZXQsIGludCB0YXJnZXRPZmZzZXQsCisgICAgICBpbnQgbnVtYmVyVG9Db3B5KSB7CisgICAgaWYgKHNvdXJjZU9mZnNldCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJTb3VyY2Ugb2Zmc2V0IDwgMDogIiArIHNvdXJjZU9mZnNldCk7CisgICAgfQorICAgIGlmICh0YXJnZXRPZmZzZXQgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiVGFyZ2V0IG9mZnNldCA8IDA6ICIgKyB0YXJnZXRPZmZzZXQpOworICAgIH0KKyAgICBpZiAobnVtYmVyVG9Db3B5IDwgMCkgeworICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkxlbmd0aCA8IDA6ICIgKyBudW1iZXJUb0NvcHkpOworICAgIH0KKyAgICBpZiAoc291cmNlT2Zmc2V0ICsgbnVtYmVyVG9Db3B5ID4gc2l6ZSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKKyAgICAgICAgICAiU291cmNlIGVuZCBvZmZzZXQgPCAwOiAiICsgKHNvdXJjZU9mZnNldCArIG51bWJlclRvQ29weSkpOworICAgIH0KKyAgICBpZiAodGFyZ2V0T2Zmc2V0ICsgbnVtYmVyVG9Db3B5ID4gdGFyZ2V0Lmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCisgICAgICAgICAgIlRhcmdldCBlbmQgb2Zmc2V0IDwgMDogIiArICh0YXJnZXRPZmZzZXQgKyBudW1iZXJUb0NvcHkpKTsKKyAgICB9CisgICAgaWYgKG51bWJlclRvQ29weSA+IDApIHsKKyAgICAgIGNvcHlUb0ludGVybmFsKHRhcmdldCwgc291cmNlT2Zmc2V0LCB0YXJnZXRPZmZzZXQsIG51bWJlclRvQ29weSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEludGVybmFsIChwYWNrYWdlIHByaXZhdGUpIGltcGxlbWVudGF0aW9uIG9mCisgICAqIEBsaW5reyNjb3B5VG8oYnl0ZVtdLGludCxpbnQsaW50fS4KKyAgICogSXQgYXNzdW1lcyB0aGF0IGFsbCBlcnJvciBjaGVja2luZyBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCBhbmQgdGhhdCAKKyAgICogQGNvZGV7bnVtYmVyVG9Db3B5ID4gMH0uCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb3B5VG9JbnRlcm5hbChieXRlW10gdGFyZ2V0LCBpbnQgc291cmNlT2Zmc2V0LAorICAgICAgaW50IHRhcmdldE9mZnNldCwgaW50IG51bWJlclRvQ29weSk7CisKKyAgLyoqCisgICAqIENvcGllcyBieXRlcyBpbnRvIGEgQnl0ZUJ1ZmZlci4KKyAgICoKKyAgICogQHBhcmFtIHRhcmdldCBCeXRlQnVmZmVyIHRvIGNvcHkgaW50by4KKyAgICogQHRocm93cyBqYXZhLm5pby5SZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiBpZiB0aGUge0Bjb2RlIHRhcmdldH0gaXMgcmVhZC1vbmx5CisgICAqIEB0aHJvd3MgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gaWYgdGhlIHtAY29kZSB0YXJnZXR9J3MKKyAgICogICAgIHJlbWFpbmluZygpIHNwYWNlIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZGF0YS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvcHlUbyhCeXRlQnVmZmVyIHRhcmdldCk7CisKKyAgLyoqCisgICAqIENvcGllcyBieXRlcyB0byBhIHtAY29kZSBieXRlW119LgorICAgKgorICAgKiBAcmV0dXJuIGNvcGllZCBieXRlcworICAgKi8KKyAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICBpbnQgc2l6ZSA9IHNpemUoKTsKKyAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgY29weVRvSW50ZXJuYWwocmVzdWx0LCAwLCAwLCBzaXplKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgY29tcGxldGUgY29udGVudHMgb2YgdGhpcyBieXRlIHN0cmluZyB0bworICAgKiB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0gYXJndW1lbnQuCisgICAqCisgICAqIEBwYXJhbSAgb3V0ICB0aGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0byB3cml0ZSB0aGUgZGF0YS4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgcmVhZC1vbmx5IHtAY29kZSBqYXZhLm5pby5CeXRlQnVmZmVyfSB3aG9zZSBjb250ZW50CisgICAqIGlzIGVxdWFsIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ5dGUgc3RyaW5nLgorICAgKiBUaGUgcmVzdWx0IHVzZXMgdGhlIHNhbWUgYmFja2luZyBhcnJheSBhcyB0aGUgYnl0ZSBzdHJpbmcsIGlmIHBvc3NpYmxlLgorICAgKgorICAgKiBAcmV0dXJuIHdyYXBwZWQgYnl0ZXMKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGFzUmVhZE9ubHlCeXRlQnVmZmVyKCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBsaXN0IG9mIHJlYWQtb25seSB7QGNvZGUgamF2YS5uaW8uQnl0ZUJ1ZmZlcn0gb2JqZWN0cworICAgKiBzdWNoIHRoYXQgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlaXIgY29udGVudHMgaXMgZXF1YWwgdG8gdGhlIGNvbnRlbnRzCisgICAqIG9mIHRoaXMgYnl0ZSBzdHJpbmcuICBUaGUgcmVzdWx0IHVzZXMgdGhlIHNhbWUgYmFja2luZyBhcnJheXMgYXMgdGhlCisgICAqIGJ5dGUgc3RyaW5nLgorICAgKiA8cD4KKyAgICogQnkgcmV0dXJuaW5nIGEgbGlzdCwgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIG1heSBiZSBhYmxlIHRvIGF2b2lkCisgICAqIGNvcHlpbmcgZXZlbiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBiYWNraW5nIGFycmF5cy4KKyAgICogCisgICAqIEByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQgYnl0ZXMKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PEJ5dGVCdWZmZXI+IGFzUmVhZE9ubHlCeXRlQnVmZmVyTGlzdCgpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmd9IGJ5IGRlY29kaW5nIHRoZSBieXRlcyB1c2luZyB0aGUKKyAgICogc3BlY2lmaWVkIGNoYXJzZXQuCisgICAqCisgICAqIEBwYXJhbSBjaGFyc2V0TmFtZSBlbmNvZGUgdXNpbmcgdGhpcyBjaGFyc2V0CisgICAqIEByZXR1cm4gbmV3IHN0cmluZworICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgY2hhcnNldCBpc24ndCByZWNvZ25pemVkCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBjaGFyc2V0TmFtZSkKKyAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIFVURi04IGRlY29kaW5nCisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFN0cmluZ30gYnkgZGVjb2RpbmcgdGhlIGJ5dGVzIGFzIFVURi04LgorICAgKgorICAgKiBAcmV0dXJuIG5ldyBzdHJpbmcgdXNpbmcgVVRGLTggZW5jb2RpbmcKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdVdGY4KCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdG9TdHJpbmcoIlVURi04Iik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZD8iLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVGVsbHMgd2hldGhlciB0aGlzIHtAY29kZSBCeXRlU3RyaW5nfSByZXByZXNlbnRzIGEgd2VsbC1mb3JtZWQgVVRGLTgKKyAgICogYnl0ZSBzZXF1ZW5jZSwgc3VjaCB0aGF0IHRoZSBvcmlnaW5hbCBieXRlcyBjYW4gYmUgY29udmVydGVkIHRvIGEKKyAgICogU3RyaW5nIG9iamVjdCBhbmQgdGhlbiByb3VuZCB0cmlwcGVkIGJhY2sgdG8gYnl0ZXMgd2l0aG91dCBsb3NzLgorICAgKgorICAgKiA8cD5Nb3JlIHByZWNpc2VseSwgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbmV2ZXI6IDxwcmU+IHtAY29kZQorICAgKiBBcnJheXMuZXF1YWxzKGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwKKyAgICogICAgIG5ldyBTdHJpbmcoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKS5nZXRCeXRlcygiVVRGLTgiKSkKKyAgICogfTwvcHJlPgorICAgKgorICAgKiA8cD5UaGlzIG1ldGhvZCByZXR1cm5zIHtAY29kZSBmYWxzZX0gZm9yICJvdmVybG9uZyIgYnl0ZSBzZXF1ZW5jZXMsCisgICAqIGFzIHdlbGwgYXMgZm9yIDMtYnl0ZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBtYXAgdG8gYSBzdXJyb2dhdGUKKyAgICogY2hhcmFjdGVyLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHJlc3RyaWN0ZWQgZGVmaW5pdGlvbiBvZiBVVEYtOAorICAgKiBpbnRyb2R1Y2VkIGluIFVuaWNvZGUgMy4xLiAgTm90ZSB0aGF0IHRoZSBVVEYtOCBkZWNvZGVyIGluY2x1ZGVkIGluCisgICAqIE9yYWNsZSdzIEpESyBoYXMgYmVlbiBtb2RpZmllZCB0byBhbHNvIHJlamVjdCAib3ZlcmxvbmciIGJ5dGUKKyAgICogc2VxdWVuY2VzLCBidXQgKGFzIG9mIDIwMTEpIHN0aWxsIGFjY2VwdHMgMy1ieXRlIHN1cnJvZ2F0ZQorICAgKiBjaGFyYWN0ZXIgYnl0ZSBzZXF1ZW5jZXMuCisgICAqCisgICAqIDxwPlNlZSB0aGUgVW5pY29kZSBTdGFuZGFyZCw8L2JyPgorICAgKiBUYWJsZSAzLTYuIDxlbT5VVEYtOCBCaXQgRGlzdHJpYnV0aW9uPC9lbT4sPC9icj4KKyAgICogVGFibGUgMy03LiA8ZW0+V2VsbCBGb3JtZWQgVVRGLTggQnl0ZSBTZXF1ZW5jZXM8L2VtPi4KKyAgICoKKyAgICogQHJldHVybiB3aGV0aGVyIHRoZSBieXRlcyBpbiB0aGlzIHtAY29kZSBCeXRlU3RyaW5nfSBhcmUgYQorICAgKiB3ZWxsLWZvcm1lZCBVVEYtOCBieXRlIHNlcXVlbmNlCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkVXRmOCgpOworCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlIGlzIGEgd2VsbC1mb3JtZWQsIG1hbGZvcm1lZCwgb3IKKyAgICogaW5jb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlLiAgVGhpcyBtZXRob2QgYWNjZXB0cyBhbmQgcmV0dXJucyBhIHBhcnRpYWwKKyAgICogc3RhdGUgcmVzdWx0LCBhbGxvd2luZyB0aGUgYnl0ZXMgZm9yIGEgY29tcGxldGUgVVRGLTggYnl0ZSBzZXF1ZW5jZSB0byBiZQorICAgKiBjb21wb3NlZCBmcm9tIG11bHRpcGxlIHtAY29kZSBCeXRlU3RyaW5nfSBzZWdtZW50cy4KKyAgICoKKyAgICogQHBhcmFtIHN0YXRlIGVpdGhlciB7QGNvZGUgMH0gKGlmIHRoaXMgaXMgdGhlIGluaXRpYWwgZGVjb2Rpbmcgb3BlcmF0aW9uKQorICAgKiAgICAgb3IgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIGEgcGFydGlhbCBkZWNvZGluZyBtZXRob2QgZm9yIHRoZQorICAgKiAgICAgcHJldmlvdXMgYnl0ZXMKKyAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgdG8gY2hlY2sKKyAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAgICoKKyAgICogQHJldHVybiB7QGNvZGUgLTF9IGlmIHRoZSBwYXJ0aWFsIGJ5dGUgc2VxdWVuY2UgaXMgZGVmaW5pdGVseSBtYWxmb3JtZWQsCisgICAqIHtAY29kZSAwfSBpZiBpdCBpcyB3ZWxsLWZvcm1lZCAobm8gYWRkaXRpb25hbCBpbnB1dCBuZWVkZWQpLCBvciwgaWYgdGhlCisgICAqIGJ5dGUgc2VxdWVuY2UgaXMgImluY29tcGxldGUiLCBpLmUuIGFwcGFyZW50bHkgdGVybWluYXRlZCBpbiB0aGUgbWlkZGxlIG9mCisgICAqIGEgY2hhcmFjdGVyLCBhbiBvcGFxdWUgaW50ZWdlciAic3RhdGUiIHZhbHVlIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uCisgICAqIHRvIGRlY29kZSB0aGUgY2hhcmFjdGVyIHdoZW4gcGFzc2VkIHRvIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIGEKKyAgICogcGFydGlhbCBkZWNvZGluZyBtZXRob2QuCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBhcnRpYWxJc1ZhbGlkVXRmOChpbnQgc3RhdGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7CisKKyAgLyoqCisgICAqIFJldHVybiBhIG5vbi16ZXJvIGhhc2hDb2RlIGRlcGVuZGluZyBvbmx5IG9uIHRoZSBzZXF1ZW5jZSBvZiBieXRlcworICAgKiBpbiB0aGlzIEJ5dGVTdHJpbmcuCisgICAqCisgICAqIEByZXR1cm4gaGFzaENvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0CisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGFic3RyYWN0IGludCBoYXNoQ29kZSgpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIElucHV0IHN0cmVhbQorCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0gd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgYnl0ZXMuCisgICAqIDxwPgorICAgKiBUaGUge0BsaW5rIElucHV0U3RyZWFtfSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlCisgICAqIGNvbXBsZXRlbHkgbm9uLWJsb2NraW5nLiAgVGhlIG1ldGhvZCB7QGxpbmsgSW5wdXRTdHJlYW0jYXZhaWxhYmxlKCl9CisgICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHN0cmVhbS4gVGhlIG1ldGhvZHMKKyAgICoge0BsaW5rIElucHV0U3RyZWFtI3JlYWQoYnl0ZVtdKSwge0BsaW5rIElucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLGludCxpbnQpfQorICAgKiBhbmQge0BsaW5rIElucHV0U3RyZWFtI3NraXAobG9uZyl9IHdpbGwgcmVhZC9za2lwIGFzIG1hbnkgYnl0ZXMgYXMgYXJlCisgICAqIGF2YWlsYWJsZS4KKyAgICogPHA+CisgICAqIFRoZSBtZXRob2RzIGluIHRoZSByZXR1cm5lZCB7QGxpbmsgSW5wdXRTdHJlYW19IG1pZ2h0IDxiPm5vdDwvYj4gYmUKKyAgICogdGhyZWFkIHNhZmUuCisgICAqCisgICAqIEByZXR1cm4gYW4gaW5wdXQgc3RyZWFtIHRoYXQgcmV0dXJucyB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIHN0cmluZy4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBJbnB1dFN0cmVhbSBuZXdJbnB1dCgpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEge0BsaW5rIENvZGVkSW5wdXRTdHJlYW19IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIGJ5dGVzLgorICAgKiBVc2luZyB0aGlzIGlzIG9mdGVuIG1vcmUgZWZmaWNpZW50IHRoYW4gY3JlYXRpbmcgYSB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbX0KKyAgICogdGhhdCB3cmFwcyB0aGUgcmVzdWx0IG9mIHtAbGluayAjbmV3SW5wdXQoKX0uCisgICAqCisgICAqIEByZXR1cm4gc3RyZWFtIGJhc2VkIG9uIHdyYXBwZWQgZGF0YQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IENvZGVkSW5wdXRTdHJlYW0gbmV3Q29kZWRJbnB1dCgpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIE91dHB1dCBzdHJlYW0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgT3V0cHV0fSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LiBDYWxsIHtAbGluaworICAgKiBPdXRwdXQjdG9CeXRlU3RyaW5nKCl9IHRvIGNyZWF0ZSB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLgorICAgKiA8cD4KKyAgICogQSB7QGxpbmsgQnl0ZVN0cmluZy5PdXRwdXR9IG9mZmVycyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGEKKyAgICoge0BsaW5rIEJ5dGVBcnJheU91dHB1dFN0cmVhbX0sIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSB7QGxpbmsgQnl0ZVN0cmluZ30KKyAgICogcmF0aGVyIHRoYW4gYSB7QGNvZGUgYnl0ZX0gYXJyYXkuCisgICAqCisgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgZXN0aW1hdGUgb2YgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICogQHJldHVybiB7QGNvZGUgT3V0cHV0U3RyZWFtfSBmb3IgYnVpbGRpbmcgYSB7QGNvZGUgQnl0ZVN0cmluZ30KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgT3V0cHV0IG5ld091dHB1dChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgcmV0dXJuIG5ldyBPdXRwdXQoaW5pdGlhbENhcGFjaXR5KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBPdXRwdXR9LiBDYWxsIHtAbGluayBPdXRwdXQjdG9CeXRlU3RyaW5nKCl9IHRvIGNyZWF0ZQorICAgKiB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLgorICAgKiA8cD4KKyAgICogQSB7QGxpbmsgQnl0ZVN0cmluZy5PdXRwdXR9IG9mZmVycyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGEKKyAgICoge0BsaW5rIEJ5dGVBcnJheU91dHB1dFN0cmVhbX0sIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSB7QGxpbmsgQnl0ZVN0cmluZ30KKyAgICogcmF0aGVyIHRoYW4gYSB7QGNvZGUgYnl0ZSBhcnJheX0uCisgICAqCisgICAqIEByZXR1cm4ge0Bjb2RlIE91dHB1dFN0cmVhbX0gZm9yIGJ1aWxkaW5nIGEge0Bjb2RlIEJ5dGVTdHJpbmd9CisgICAqLworICBwdWJsaWMgc3RhdGljIE91dHB1dCBuZXdPdXRwdXQoKSB7CisgICAgcmV0dXJuIG5ldyBPdXRwdXQoQ09OQ0FURU5BVEVfQllfQ09QWV9TSVpFKTsKKyAgfQorCisgIC8qKgorICAgKiBPdXRwdXRzIHRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLiBDYWxsIHtAbGluayAjdG9CeXRlU3RyaW5nKCl9IHRvCisgICAqIGNyZWF0ZSB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBPdXRwdXQgZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgIC8vIEltcGxlbWVudGF0aW9uIG5vdGUuCisgICAgLy8gVGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBzeW5jaHJvbml6ZWQuICBCeXRlU3RyaW5ncworICAgIC8vIGFyZSBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4gIFdpdGhvdXQgc29tZSBzb3J0IG9mIGxvY2tpbmcsIGl0IGNvdWxkCisgICAgLy8gYmUgcG9zc2libGUgZm9yIG9uZSB0aHJlYWQgdG8gY2FsbCB0b0J5dGVTcmluZygpLCB3aGlsZSBhbm90aGVyIHRocmVhZAorICAgIC8vIGlzIHN0aWxsIG1vZGlmeWluZyB0aGUgdW5kZXJseWluZyBieXRlIGFycmF5LgorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEVNUFRZX0JZVEVfQVJSQVkgPSBuZXcgYnl0ZVswXTsKKyAgICAvLyBhcmd1bWVudCBwYXNzZWQgYnkgdXNlciwgaW5kaWNhdGluZyBpbml0aWFsIGNhcGFjaXR5LgorICAgIHByaXZhdGUgZmluYWwgaW50IGluaXRpYWxDYXBhY2l0eTsKKyAgICAvLyBCeXRlU3RyaW5ncyB0byBiZSBjb25jYXRlbmF0ZWQgdG8gY3JlYXRlIHRoZSByZXN1bHQKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxCeXRlU3RyaW5nPiBmbHVzaGVkQnVmZmVyczsKKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIEJ5dGVTdHJpbmdzIG9mIGZsdXNoZWRCdWZmZXJzCisgICAgcHJpdmF0ZSBpbnQgZmx1c2hlZEJ1ZmZlcnNUb3RhbEJ5dGVzOworICAgIC8vIEN1cnJlbnQgYnVmZmVyIHRvIHdoaWNoIHdlIGFyZSB3cml0aW5nCisgICAgcHJpdmF0ZSBieXRlW10gYnVmZmVyOworICAgIC8vIExvY2F0aW9uIGluIGJ1ZmZlcltdIHRvIHdoaWNoIHdlIHdyaXRlIHRoZSBuZXh0IGJ5dGUuCisgICAgcHJpdmF0ZSBpbnQgYnVmZmVyUG9zOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBCeXRlU3RyaW5nIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogaW5pdGlhbCBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIE91dHB1dChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgICBpZiAoaW5pdGlhbENhcGFjaXR5IDwgMCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdWZmZXIgc2l6ZSA8IDAiKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuaW5pdGlhbENhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OworICAgICAgdGhpcy5mbHVzaGVkQnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8Qnl0ZVN0cmluZz4oKTsKKyAgICAgIHRoaXMuYnVmZmVyID0gbmV3IGJ5dGVbaW5pdGlhbENhcGFjaXR5XTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoaW50IGIpIHsKKyAgICAgIGlmIChidWZmZXJQb3MgPT0gYnVmZmVyLmxlbmd0aCkgeworICAgICAgICBmbHVzaEZ1bGxCdWZmZXIoMSk7CisgICAgICB9CisgICAgICBidWZmZXJbYnVmZmVyUG9zKytdID0gKGJ5dGUpYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpICB7CisgICAgICBpZiAobGVuZ3RoIDw9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJQb3MpIHsKKyAgICAgICAgLy8gVGhlIGJ5dGVzIGNhbiBmaXQgaW50byB0aGUgY3VycmVudCBidWZmZXIuCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2Zmc2V0LCBidWZmZXIsIGJ1ZmZlclBvcywgbGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyUG9zICs9IGxlbmd0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSB1cCB0aGUgY3VycmVudCBidWZmZXIKKyAgICAgICAgaW50IGNvcHlTaXplICA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJQb3M7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2Zmc2V0LCBidWZmZXIsIGJ1ZmZlclBvcywgY29weVNpemUpOworICAgICAgICBvZmZzZXQgKz0gY29weVNpemU7CisgICAgICAgIGxlbmd0aCAtPSBjb3B5U2l6ZTsKKyAgICAgICAgLy8gRmx1c2ggdGhlIGJ1ZmZlciwgYW5kIGdldCBhIG5ldyBidWZmZXIgYXQgbGVhc3QgYmlnIGVub3VnaCB0byBjb3ZlcgorICAgICAgICAvLyB3aGF0IHdlIHN0aWxsIG5lZWQgdG8gb3V0cHV0CisgICAgICAgIGZsdXNoRnVsbEJ1ZmZlcihsZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZnNldCwgYnVmZmVyLCAwIC8qIGNvdW50ICovLCBsZW5ndGgpOworICAgICAgICBidWZmZXJQb3MgPSBsZW5ndGg7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ5dGUgc3RyaW5nLiBJdHMgc2l6ZSBpcyB0aGUgY3VycmVudCBzaXplIG9mIHRoaXMgb3V0cHV0CisgICAgICogc3RyZWFtIGFuZCBpdHMgb3V0cHV0IGhhcyBiZWVuIGNvcGllZCB0byBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoaXMgb3V0cHV0IHN0cmVhbSwgYXMgYSBieXRlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgeworICAgICAgZmx1c2hMYXN0QnVmZmVyKCk7CisgICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShmbHVzaGVkQnVmZmVycyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudCBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZigpIGZvciBqZGsgMS41LgorICAgICAqLworICAgIHByaXZhdGUgYnl0ZVtdIGNvcHlBcnJheShieXRlW10gYnVmZmVyLCBpbnQgbGVuZ3RoKSB7CisgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCByZXN1bHQsIDAsIE1hdGgubWluKGJ1ZmZlci5sZW5ndGgsIGxlbmd0aCkpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGNvbXBsZXRlIGNvbnRlbnRzIG9mIHRoaXMgYnl0ZSBhcnJheSBvdXRwdXQgc3RyZWFtIHRvCisgICAgICogdGhlIHNwZWNpZmllZCBvdXRwdXQgc3RyZWFtIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0byB3cml0ZSB0aGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEJ5dGVTdHJpbmdbXSBjYWNoZWRGbHVzaEJ1ZmZlcnM7CisgICAgICBieXRlW10gY2FjaGVkQnVmZmVyOworICAgICAgaW50IGNhY2hlZEJ1ZmZlclBvczsKKyAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIGludG8gbG9jYWwgdmFyaWFibGVzIHNvIGFzIHRvIGhvbGQKKyAgICAgICAgLy8gdGhlIGxvY2sgZm9yIGFzIHNob3J0IGEgdGltZSBhcyBwb3NzaWJsZS4KKyAgICAgICAgY2FjaGVkRmx1c2hCdWZmZXJzID0KKyAgICAgICAgICAgIGZsdXNoZWRCdWZmZXJzLnRvQXJyYXkobmV3IEJ5dGVTdHJpbmdbZmx1c2hlZEJ1ZmZlcnMuc2l6ZSgpXSk7CisgICAgICAgIGNhY2hlZEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgY2FjaGVkQnVmZmVyUG9zID0gYnVmZmVyUG9zOworICAgICAgfQorICAgICAgZm9yIChCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgOiBjYWNoZWRGbHVzaEJ1ZmZlcnMpIHsKKyAgICAgICAgYnl0ZVN0cmluZy53cml0ZVRvKG91dCk7CisgICAgICB9CisKKyAgICAgIG91dC53cml0ZShjb3B5QXJyYXkoY2FjaGVkQnVmZmVyLCBjYWNoZWRCdWZmZXJQb3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKKyAgICAgIHJldHVybiBmbHVzaGVkQnVmZmVyc1RvdGFsQnl0ZXMgKyBidWZmZXJQb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgc3RyZWFtLCBzbyB0aGF0IGFsbCBjdXJyZW50bHkgYWNjdW11bGF0ZWQgb3V0cHV0IGluIHRoZQorICAgICAqIG91dHB1dCBzdHJlYW0gaXMgZGlzY2FyZGVkLiBUaGUgb3V0cHV0IHN0cmVhbSBjYW4gYmUgdXNlZCBhZ2FpbiwKKyAgICAgKiByZXVzaW5nIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBidWZmZXIgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgeworICAgICAgZmx1c2hlZEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgIGZsdXNoZWRCdWZmZXJzVG90YWxCeXRlcyA9IDA7CisgICAgICBidWZmZXJQb3MgPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiPEJ5dGVTdHJpbmcuT3V0cHV0QCVzIHNpemU9JWQ+IiwKKyAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSwgc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHdyaXRlcnMuICBUaGUgY3VycmVudCBidWZmZXIgaXMgZnVsbCwgYW5kIHRoZQorICAgICAqIHdyaXRlciBuZWVkcyBhIG5ldyBidWZmZXIgd2hvc2Ugc2l6ZSBpcyBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIG1pbmltdW0KKyAgICAgKiBzaXplLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmbHVzaEZ1bGxCdWZmZXIoaW50IG1pblNpemUpICB7CisgICAgICBmbHVzaGVkQnVmZmVycy5hZGQobmV3IExpdGVyYWxCeXRlU3RyaW5nKGJ1ZmZlcikpOworICAgICAgZmx1c2hlZEJ1ZmZlcnNUb3RhbEJ5dGVzICs9IGJ1ZmZlci5sZW5ndGg7CisgICAgICAvLyBXZSB3YW50IHRvIGluY3JlYXNlIG91ciB0b3RhbCBjYXBhY2l0eSBieSA1MCUsIGJ1dCBhcyBhIG1pbmltdW0sCisgICAgICAvLyB0aGUgbmV3IGJ1ZmZlciBzaG91bGQgYWxzbyBhdCBsZWFzdCBiZSA+PSBtaW5TaXplIGFuZAorICAgICAgLy8gPj0gaW5pdGlhbCBDYXBhY2l0eS4KKyAgICAgIGludCBuZXdTaXplID0gTWF0aC5tYXgoaW5pdGlhbENhcGFjaXR5LAorICAgICAgICAgIE1hdGgubWF4KG1pblNpemUsIGZsdXNoZWRCdWZmZXJzVG90YWxCeXRlcyA+Pj4gMSkpOworICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbbmV3U2l6ZV07CisgICAgICBidWZmZXJQb3MgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkge0BsaW5rICN0b0J5dGVTdHJpbmcoKX0uIFRoZSBjdXJyZW50IGJ1ZmZlciBtYXkKKyAgICAgKiBvciBtYXkgbm90IGJlIGZ1bGwsIGJ1dCBpdCBuZWVkcyB0byBiZSBmbHVzaGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmbHVzaExhc3RCdWZmZXIoKSAgeworICAgICAgaWYgKGJ1ZmZlclBvcyA8IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgaWYgKGJ1ZmZlclBvcyA+IDApIHsKKyAgICAgICAgICBieXRlW10gYnVmZmVyQ29weSA9IGNvcHlBcnJheShidWZmZXIsIGJ1ZmZlclBvcyk7CisgICAgICAgICAgZmx1c2hlZEJ1ZmZlcnMuYWRkKG5ldyBMaXRlcmFsQnl0ZVN0cmluZyhidWZmZXJDb3B5KSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2UgcmV1c2UgdGhpcyBidWZmZXIgZm9yIGZ1cnRoZXIgd3JpdGVzLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQnVmZmVyIGlzIGNvbXBsZXRlbHkgZnVsbC4gIEh1enphaC4KKyAgICAgICAgZmx1c2hlZEJ1ZmZlcnMuYWRkKG5ldyBMaXRlcmFsQnl0ZVN0cmluZyhidWZmZXIpKTsKKyAgICAgICAgLy8gOTklIG9mIHRoZSB0aW1lLCB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIHRoaXMgT3V0cHV0U3RyZWFtIGFnYWluLgorICAgICAgICAvLyBXZSBzZXQgYnVmZmVyIHRvIGFuIGVtcHR5IGJ5dGUgc3RyZWFtIHNvIHRoYXQgd2UncmUgaGFuZGxpbmcgdGhpcworICAgICAgICAvLyBjYXNlIHdpdGhvdXQgd2FzdGluZyBzcGFjZS4gIEluIHRoZSByYXJlIGNhc2UgdGhhdCBtb3JlIHdyaXRlcworICAgICAgICAvLyAqZG8qIG9jY3VyLCB0aGlzIGVtcHR5IGJ1ZmZlciB3aWxsIGJlIGZsdXNoZWQgYW5kIGFuIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgLy8gc2l6ZWQgbmV3IGJ1ZmZlciB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICAgIGJ1ZmZlciA9IEVNUFRZX0JZVEVfQVJSQVk7CisgICAgICB9CisgICAgICBmbHVzaGVkQnVmZmVyc1RvdGFsQnl0ZXMgKz0gYnVmZmVyUG9zOworICAgICAgYnVmZmVyUG9zID0gMDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30gYnVpbGRlciwgd2hpY2ggYWxsb3dzIHlvdSB0bworICAgKiBlZmZpY2llbnRseSBjb25zdHJ1Y3QgYSB7QGNvZGUgQnl0ZVN0cmluZ30gYnkgd3JpdGluZyB0byBhIHtAbGluaworICAgKiBDb2RlZE91dHB1dFN0cmVhbX0uIFVzaW5nIHRoaXMgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcge0Bjb2RlCisgICAqIG5ld091dHB1dCgpfSBhbmQgd3JhcHBpbmcgdGhhdCBpbiBhIHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0uCisgICAqCisgICAqIDxwPlRoaXMgaXMgcGFja2FnZS1wcml2YXRlIGJlY2F1c2UgaXQncyBhIHNvbWV3aGF0IGNvbmZ1c2luZyBpbnRlcmZhY2UuCisgICAqIFVzZXJzIGNhbiBjYWxsIHtAbGluayBNZXNzYWdlI3RvQnl0ZVN0cmluZygpfSBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcworICAgKiBkaXJlY3RseS4KKyAgICoKKyAgICogQHBhcmFtIHNpemUgVGhlIHRhcmdldCBieXRlIHNpemUgb2YgdGhlIHtAY29kZSBCeXRlU3RyaW5nfS4gIFlvdSBtdXN0IHdyaXRlCisgICAqICAgICBleGFjdGx5IHRoaXMgbWFueSBieXRlcyBiZWZvcmUgYnVpbGRpbmcgdGhlIHJlc3VsdC4KKyAgICogQHJldHVybiB0aGUgYnVpbGRlcgorICAgKi8KKyAgc3RhdGljIENvZGVkQnVpbGRlciBuZXdDb2RlZEJ1aWxkZXIoaW50IHNpemUpIHsKKyAgICByZXR1cm4gbmV3IENvZGVkQnVpbGRlcihzaXplKTsKKyAgfQorCisgIC8qKiBTZWUge0BsaW5rIEJ5dGVTdHJpbmcjbmV3Q29kZWRCdWlsZGVyKGludCl9LiAqLworICBzdGF0aWMgZmluYWwgY2xhc3MgQ29kZWRCdWlsZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dDsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXI7CisKKyAgICBwcml2YXRlIENvZGVkQnVpbGRlcihpbnQgc2l6ZSkgeworICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBCeXRlU3RyaW5nIGJ1aWxkKCkgeworICAgICAgb3V0cHV0LmNoZWNrTm9TcGFjZUxlZnQoKTsKKworICAgICAgLy8gV2UgY2FuIGJlIGNvbmZpZGVudCB0aGF0IHRoZSBDb2RlZE91dHB1dFN0cmVhbSB3aWxsIG5vdCBtb2RpZnkgdGhlCisgICAgICAvLyB1bmRlcmx5aW5nIGJ5dGVzIGFueW1vcmUgYmVjYXVzZSBpdCBhbHJlYWR5IHdyb3RlIGFsbCBvZiB0aGVtLiAgU28sCisgICAgICAvLyBubyBuZWVkIHRvIG1ha2UgYSBjb3B5LgorICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQnl0ZVN0cmluZyhidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBDb2RlZE91dHB1dFN0cmVhbSBnZXRDb2RlZE91dHB1dCgpIHsKKyAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gTWV0aG9kcyB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9IG5lZWRzIG9uIGluc3RhbmNlcywgd2hpY2ggYXJlbid0IHBhcnQgb2YgdGhlCisgIC8vIHB1YmxpYyBBUEkuCisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgZGVwdGggb2YgdGhlIHRyZWUgcmVwcmVzZW50aW5nIHRoaXMge0Bjb2RlIEJ5dGVTdHJpbmd9LCBpZiBhbnksCisgICAqIHdob3NlIHJvb3QgaXMgdGhpcyBub2RlLiBJZiB0aGlzIGlzIGEgbGVhZiBub2RlLCByZXR1cm4gMC4KKyAgICoKKyAgICogQHJldHVybiB0cmVlIGRlcHRoIG9yIHplcm8KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0VHJlZURlcHRoKCk7CisKKyAgLyoqCisgICAqIFJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBCeXRlU3RyaW5nIGlzIGxpdGVyYWwgKGEgbGVhZiBub2RlKSBvciBhCisgICAqIGZsYXQtZW5vdWdoIHRyZWUgaW4gdGhlIHNlbnNlIG9mIHtAbGluayBSb3BlQnl0ZVN0cmluZ30uCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJlZSBpcyBmbGF0IGVub3VnaAorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNCYWxhbmNlZCgpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGNhY2hlZCBoYXNoIGNvZGUgaWYgYXZhaWxhYmxlLgorICAgKgorICAgKiBAcmV0dXJuIHZhbHVlIG9mIGNhY2hlZCBoYXNoIGNvZGUgb3IgMCBpZiBub3QgY29tcHV0ZWQgeWV0CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBlZWtDYWNoZWRIYXNoQ29kZSgpOworCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBoYXNoIGFjcm9zcyB0aGUgdmFsdWUgYnl0ZXMgc3RhcnRpbmcgd2l0aCB0aGUgZ2l2ZW4gaGFzaCwgYW5kCisgICAqIHJldHVybiB0aGUgcmVzdWx0LiAgVGhpcyBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGhhc2ggYWNyb3NzIHN0cmluZ3MKKyAgICogcmVwcmVzZW50ZWQgYXMgYSBzZXQgb2YgcGllY2VzIGJ5IGFsbG93aW5nIHRoZSBoYXNoIGNvbXB1dGF0aW9uIHRvIGJlCisgICAqIGNvbnRpbnVlZCBmcm9tIHBpZWNlIHRvIHBpZWNlLgorICAgKgorICAgKiBAcGFyYW0gaCBzdGFydGluZyBoYXNoIHZhbHVlCisgICAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IGludG8gdGhpcyB2YWx1ZSB0byBzdGFydCBsb29raW5nIGF0IGRhdGEgdmFsdWVzCisgICAqIEBwYXJhbSBsZW5ndGggbnVtYmVyIG9mIGRhdGEgdmFsdWVzIHRvIGluY2x1ZGUgaW4gdGhlIGhhc2ggY29tcHV0YXRpb24KKyAgICogQHJldHVybiBlbmRpbmcgaGFzaCB2YWx1ZQorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBwYXJ0aWFsSGFzaChpbnQgaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIjxCeXRlU3RyaW5nQCVzIHNpemU9JWQ+IiwKKyAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSksIHNpemUoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0MTdhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsOTIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZWFkcyBhbmQgZGVjb2RlcyBwcm90b2NvbCBtZXNzYWdlIGZpZWxkcy4KKyAqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHR3byBraW5kcyBvZiBtZXRob2RzOiAgbWV0aG9kcyB0aGF0IHJlYWQgc3BlY2lmaWMKKyAqIHByb3RvY29sIG1lc3NhZ2UgY29uc3RydWN0cyBhbmQgZmllbGQgdHlwZXMgKGUuZy4ge0BsaW5rICNyZWFkVGFnKCl9IGFuZAorICoge0BsaW5rICNyZWFkSW50MzIoKX0pIGFuZCBtZXRob2RzIHRoYXQgcmVhZCBsb3ctbGV2ZWwgdmFsdWVzIChlLmcuCisgKiB7QGxpbmsgI3JlYWRSYXdWYXJpbnQzMigpfSBhbmQge0BsaW5rICNyZWFkUmF3Qnl0ZXN9KS4gIElmIHlvdSBhcmUgcmVhZGluZworICogZW5jb2RlZCBwcm90b2NvbCBtZXNzYWdlcywgeW91IHNob3VsZCB1c2UgdGhlIGZvcm1lciBtZXRob2RzLCBidXQgaWYgeW91IGFyZQorICogcmVhZGluZyBzb21lIG90aGVyIGZvcm1hdCBvZiB5b3VyIG93biBkZXNpZ24sIHVzZSB0aGUgbGF0dGVyLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb2RlZElucHV0U3RyZWFtIHsKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBJbnB1dFN0cmVhbS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ29kZWRJbnB1dFN0cmVhbSBuZXdJbnN0YW5jZShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkgeworICAgIHJldHVybiBuZXcgQ29kZWRJbnB1dFN0cmVhbShpbnB1dCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IENvZGVkSW5wdXRTdHJlYW0gd3JhcHBpbmcgdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCisgICAqLworICBwdWJsaWMgc3RhdGljIENvZGVkSW5wdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgYnl0ZVtdIGJ1ZikgeworICAgIHJldHVybiBuZXdJbnN0YW5jZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuKSB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShidWYsIG9mZiwgbGVuKTsKKyAgICB0cnkgeworICAgICAgLy8gU29tZSB1c2VzIG9mIENvZGVkSW5wdXRTdHJlYW0gY2FuIGJlIG1vcmUgZWZmaWNpZW50IGlmIHRoZXkga25vdworICAgICAgLy8gZXhhY3RseSBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlLiAgQnkgcHVzaGluZyB0aGUgZW5kIHBvaW50IG9mIHRoZQorICAgICAgLy8gYnVmZmVyIGFzIGEgbGltaXQsIHdlIGFsbG93IHRoZW0gdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gdmlhCisgICAgICAvLyBnZXRCeXRlc1VudGlsTGltaXQoKS4gIFB1c2hpbmcgYSBsaW1pdCB0aGF0IHdlIGtub3cgaXMgYXQgdGhlIGVuZCBvZgorICAgICAgLy8gdGhlIHN0cmVhbSBjYW4gbmV2ZXIgaHVydCwgc2luY2Ugd2UgY2FuIG5ldmVyIHBhc3QgdGhhdCBwb2ludCBhbnl3YXkuCisgICAgICByZXN1bHQucHVzaExpbWl0KGxlbik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAvLyBUaGUgb25seSByZWFzb24gcHVzaExpbWl0KCkgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgaXMgaWYgbGVuCisgICAgICAvLyBpcyBuZWdhdGl2ZS4gTm9ybWFsbHkgcHVzaExpbWl0KCkncyBwYXJhbWV0ZXIgY29tZXMgZGlyZWN0bHkgb2ZmIHRoZQorICAgICAgLy8gd2lyZSwgc28gaXQncyBpbXBvcnRhbnQgdG8gY2F0Y2ggZXhjZXB0aW9ucyBpbiBjYXNlIG9mIGNvcnJ1cHQgb3IKKyAgICAgIC8vIG1hbGljaW91cyBkYXRhLiBIb3dldmVyLCBpbiB0aGlzIGNhc2UsIHdlIGV4cGVjdCB0aGF0IGxlbiBpcyBub3QgYQorICAgICAgLy8gdXNlci1zdXBwbGllZCB2YWx1ZSwgc28gd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGJlaW5nIG5lZ2F0aXZlIGluZGljYXRlcworICAgICAgLy8gYSBwcm9ncmFtbWluZyBlcnJvci4gVGhlcmVmb3JlLCB0aHJvd2luZyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzCisgICAgICAvLyBhcHByb3ByaWF0ZS4KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogQXR0ZW1wdCB0byByZWFkIGEgZmllbGQgdGFnLCByZXR1cm5pbmcgemVybyBpZiB3ZSBoYXZlIHJlYWNoZWQgRU9GLgorICAgKiBQcm90b2NvbCBtZXNzYWdlIHBhcnNlcnMgdXNlIHRoaXMgdG8gcmVhZCB0YWdzLCBzaW5jZSBhIHByb3RvY29sIG1lc3NhZ2UKKyAgICogbWF5IGxlZ2FsbHkgZW5kIHdoZXJldmVyIGEgdGFnIG9jY3VycywgYW5kIHplcm8gaXMgbm90IGEgdmFsaWQgdGFnIG51bWJlci4KKyAgICovCisgIHB1YmxpYyBpbnQgcmVhZFRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGlzQXRFbmQoKSkgeworICAgICAgbGFzdFRhZyA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsYXN0VGFnID0gcmVhZFJhd1ZhcmludDMyKCk7CisgICAgaWYgKFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIobGFzdFRhZykgPT0gMCkgeworICAgICAgLy8gSWYgd2UgYWN0dWFsbHkgcmVhZCB6ZXJvIChvciBhbnkgdGFnIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGZpZWxkCisgICAgICAvLyBudW1iZXIgemVybyksIHRoYXQncyBub3QgYSB2YWxpZCB0YWcuCisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uaW52YWxpZFRhZygpOworICAgIH0KKyAgICByZXR1cm4gbGFzdFRhZzsKKyAgfQorCisgIC8qKgorICAgKiBWZXJpZmllcyB0aGF0IHRoZSBsYXN0IGNhbGwgdG8gcmVhZFRhZygpIHJldHVybmVkIHRoZSBnaXZlbiB0YWcgdmFsdWUuCisgICAqIFRoaXMgaXMgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIG5lc3RlZCBncm91cCBlbmRlZCB3aXRoIHRoZSBjb3JyZWN0CisgICAqIGVuZCB0YWcuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtAY29kZSB2YWx1ZX0gZG9lcyBub3QgbWF0Y2ggdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgdGFnLgorICAgKi8KKyAgcHVibGljIHZvaWQgY2hlY2tMYXN0VGFnV2FzKGZpbmFsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIGlmIChsYXN0VGFnICE9IHZhbHVlKSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uaW52YWxpZEVuZFRhZygpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWFkcyBhbmQgZGlzY2FyZHMgYSBzaW5nbGUgZmllbGQsIGdpdmVuIGl0cyB0YWcgdmFsdWUuCisgICAqCisgICAqIEByZXR1cm4ge0Bjb2RlIGZhbHNlfSBpZiB0aGUgdGFnIGlzIGFuIGVuZGdyb3VwIHRhZywgaW4gd2hpY2ggY2FzZQorICAgKiAgICAgICAgIG5vdGhpbmcgaXMgc2tpcHBlZC4gIE90aGVyd2lzZSwgcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBza2lwRmllbGQoZmluYWwgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKSkgeworICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVDoKKyAgICAgICAgcmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQ6CisgICAgICAgIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICBza2lwUmF3Qnl0ZXMocmVhZFJhd1ZhcmludDMyKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUDoKKyAgICAgICAgc2tpcE1lc3NhZ2UoKTsKKyAgICAgICAgY2hlY2tMYXN0VGFnV2FzKAorICAgICAgICAgIFdpcmVGb3JtYXQubWFrZVRhZyhXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzI6CisgICAgICAgIHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkV2lyZVR5cGUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVhZHMgYW5kIGRpc2NhcmRzIGFuIGVudGlyZSBtZXNzYWdlLiAgVGhpcyB3aWxsIHJlYWQgZWl0aGVyIHVudGlsIEVPRgorICAgKiBvciB1bnRpbCBhbiBlbmRncm91cCB0YWcsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNraXBNZXNzYWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmluYWwgaW50IHRhZyA9IHJlYWRUYWcoKTsKKyAgICAgIGlmICh0YWcgPT0gMCB8fCAhc2tpcEZpZWxkKHRhZykpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqIFJlYWQgYSB7QGNvZGUgZG91YmxlfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpKTsKKyAgfQorCisgIC8qKiBSZWFkIGEge0Bjb2RlIGZsb2F0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBGbG9hdC5pbnRCaXRzVG9GbG9hdChyZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSk7CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSB1aW50NjR9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIGxvbmcgcmVhZFVJbnQ2NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQ2NCgpOworICB9CisKKyAgLyoqIFJlYWQgYW4ge0Bjb2RlIGludDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBsb25nIHJlYWRJbnQ2NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQ2NCgpOworICB9CisKKyAgLyoqIFJlYWQgYW4ge0Bjb2RlIGludDMyfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBpbnQgcmVhZEludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCk7CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSBmaXhlZDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBsb25nIHJlYWRGaXhlZDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZFJhd0xpdHRsZUVuZGlhbjY0KCk7CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSBmaXhlZDMyfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBpbnQgcmVhZEZpeGVkMzIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKKyAgfQorCisgIC8qKiBSZWFkIGEge0Bjb2RlIGJvb2x9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiByZWFkUmF3VmFyaW50MzIoKSAhPSAwOworICB9CisKKyAgLyoqIFJlYWQgYSB7QGNvZGUgc3RyaW5nfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IHNpemUgPSByZWFkUmF3VmFyaW50MzIoKTsKKyAgICBpZiAoc2l6ZSA8PSAoYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykgJiYgc2l6ZSA+IDApIHsKKyAgICAgIC8vIEZhc3QgcGF0aDogIFdlIGFscmVhZHkgaGF2ZSB0aGUgYnl0ZXMgaW4gYSBjb250aWd1b3VzIGJ1ZmZlciwgc28KKyAgICAgIC8vICAganVzdCBjb3B5IGRpcmVjdGx5IGZyb20gaXQuCisgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZyhidWZmZXIsIGJ1ZmZlclBvcywgc2l6ZSwgIlVURi04Iik7CisgICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNsb3cgcGF0aDogIEJ1aWxkIGEgYnl0ZSBhcnJheSBmaXJzdCB0aGVuIGNvcHkgaXQuCisgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZWFkUmF3Qnl0ZXMoc2l6ZSksICJVVEYtOCIpOworICAgIH0KKyAgfQorCisgIC8qKiBSZWFkIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHJlYWRHcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChyZWN1cnNpb25EZXB0aCA+PSByZWN1cnNpb25MaW1pdCkgeworICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKTsKKyAgICB9CisgICAgKytyZWN1cnNpb25EZXB0aDsKKyAgICBidWlsZGVyLm1lcmdlRnJvbSh0aGlzLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgY2hlY2tMYXN0VGFnV2FzKAorICAgICAgV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkpOworICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSBncm91cH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgPFQgZXh0ZW5kcyBNZXNzYWdlTGl0ZT4gVCByZWFkR3JvdXAoCisgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICBmaW5hbCBQYXJzZXI8VD4gcGFyc2VyLAorICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAocmVjdXJzaW9uRGVwdGggPj0gcmVjdXJzaW9uTGltaXQpIHsKKyAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5yZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7CisgICAgfQorICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgVCByZXN1bHQgPSBwYXJzZXIucGFyc2VQYXJ0aWFsRnJvbSh0aGlzLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgY2hlY2tMYXN0VGFnV2FzKAorICAgICAgV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkpOworICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkcyBhIHtAY29kZSBncm91cH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtIGFuZCBtZXJnZXMgaXQgaW50byB0aGUKKyAgICogZ2l2ZW4ge0BsaW5rIFVua25vd25GaWVsZFNldH0uCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVua25vd25GaWVsZFNldC5CdWlsZGVyIG5vdyBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsIHNvCisgICAqICAgICAgICAgICAgIHlvdSBjYW4ganVzdCBjYWxsIHtAbGluayAjcmVhZEdyb3VwfS4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHJlYWRVbmtub3duR3JvdXAoZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgYnVpbGRlcikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gV2Uga25vdyB0aGF0IFVua25vd25GaWVsZFNldCB3aWxsIGlnbm9yZSBhbnkgRXh0ZW5zaW9uUmVnaXN0cnkgc28gaXQKKyAgICAvLyBpcyBzYWZlIHRvIHBhc3MgbnVsbCBoZXJlLiAgKFdlIGNhbid0IGNhbGwKKyAgICAvLyBFeHRlbnNpb25SZWdpc3RyeS5nZXRFbXB0eVJlZ2lzdHJ5KCkgYmVjYXVzZSB0aGF0IHdvdWxkIG1ha2UgdGhpcworICAgIC8vIGNsYXNzIGRlcGVuZCBvbiBFeHRlbnNpb25SZWdpc3RyeSwgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIGxpdGUKKyAgICAvLyBsaWJyYXJ5LikKKyAgICByZWFkR3JvdXAoZmllbGROdW1iZXIsIGJ1aWxkZXIsIG51bGwpOworICB9CisKKyAgLyoqIFJlYWQgYW4gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlKGZpbmFsIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFJhd1ZhcmludDMyKCk7CisgICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ucmVjdXJzaW9uTGltaXRFeGNlZWRlZCgpOworICAgIH0KKyAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBwdXNoTGltaXQobGVuZ3RoKTsKKyAgICArK3JlY3Vyc2lvbkRlcHRoOworICAgIGJ1aWxkZXIubWVyZ2VGcm9tKHRoaXMsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICBjaGVja0xhc3RUYWdXYXMoMCk7CisgICAgLS1yZWN1cnNpb25EZXB0aDsKKyAgICBwb3BMaW1pdChvbGRMaW1pdCk7CisgIH0KKworICAvKiogUmVhZCBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IFQgcmVhZE1lc3NhZ2UoCisgICAgICBmaW5hbCBQYXJzZXI8VD4gcGFyc2VyLAorICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZFJhd1ZhcmludDMyKCk7CisgICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ucmVjdXJzaW9uTGltaXRFeGNlZWRlZCgpOworICAgIH0KKyAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBwdXNoTGltaXQobGVuZ3RoKTsKKyAgICArK3JlY3Vyc2lvbkRlcHRoOworICAgIFQgcmVzdWx0ID0gcGFyc2VyLnBhcnNlUGFydGlhbEZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgIGNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAtLXJlY3Vyc2lvbkRlcHRoOworICAgIHBvcExpbWl0KG9sZExpbWl0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqIFJlYWQgYSB7QGNvZGUgYnl0ZXN9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIEJ5dGVTdHJpbmcgcmVhZEJ5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlYWRSYXdWYXJpbnQzMigpOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgIHJldHVybiBCeXRlU3RyaW5nLkVNUFRZOworICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSAoYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykgJiYgc2l6ZSA+IDApIHsKKyAgICAgIC8vIEZhc3QgcGF0aDogIFdlIGFscmVhZHkgaGF2ZSB0aGUgYnl0ZXMgaW4gYSBjb250aWd1b3VzIGJ1ZmZlciwgc28KKyAgICAgIC8vICAganVzdCBjb3B5IGRpcmVjdGx5IGZyb20gaXQuCisgICAgICBmaW5hbCBCeXRlU3RyaW5nIHJlc3VsdCA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnVmZmVyLCBidWZmZXJQb3MsIHNpemUpOworICAgICAgYnVmZmVyUG9zICs9IHNpemU7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0LgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20ocmVhZFJhd0J5dGVzKHNpemUpKTsKKyAgICB9CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSB1aW50MzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIGludCByZWFkVUludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCk7CisgIH0KKworICAvKioKKyAgICogUmVhZCBhbiBlbnVtIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gIENhbGxlciBpcyByZXNwb25zaWJsZQorICAgKiBmb3IgY29udmVydGluZyB0aGUgbnVtZXJpYyB2YWx1ZSB0byBhbiBhY3R1YWwgZW51bS4KKyAgICovCisgIHB1YmxpYyBpbnQgcmVhZEVudW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiByZWFkUmF3VmFyaW50MzIoKTsKKyAgfQorCisgIC8qKiBSZWFkIGFuIHtAY29kZSBzZml4ZWQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgaW50IHJlYWRTRml4ZWQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpOworICB9CisKKyAgLyoqIFJlYWQgYW4ge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBsb25nIHJlYWRTRml4ZWQ2NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpOworICB9CisKKyAgLyoqIFJlYWQgYW4ge0Bjb2RlIHNpbnQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgaW50IHJlYWRTSW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBkZWNvZGVaaWdaYWczMihyZWFkUmF3VmFyaW50MzIoKSk7CisgIH0KKworICAvKiogUmVhZCBhbiB7QGNvZGUgc2ludDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBsb25nIHJlYWRTSW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBkZWNvZGVaaWdaYWc2NChyZWFkUmF3VmFyaW50NjQoKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBSZWFkIGEgcmF3IFZhcmludCBmcm9tIHRoZSBzdHJlYW0uICBJZiBsYXJnZXIgdGhhbiAzMiBiaXRzLCBkaXNjYXJkIHRoZQorICAgKiB1cHBlciBiaXRzLgorICAgKi8KKyAgcHVibGljIGludCByZWFkUmF3VmFyaW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGUgdG1wID0gcmVhZFJhd0J5dGUoKTsKKyAgICBpZiAodG1wID49IDApIHsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIGludCByZXN1bHQgPSB0bXAgJiAweDdmOworICAgIGlmICgodG1wID0gcmVhZFJhd0J5dGUoKSkgPj0gMCkgeworICAgICAgcmVzdWx0IHw9IHRtcCA8PCA3OworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDc7CisgICAgICBpZiAoKHRtcCA9IHJlYWRSYXdCeXRlKCkpID49IDApIHsKKyAgICAgICAgcmVzdWx0IHw9IHRtcCA8PCAxNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgMTQ7CisgICAgICAgIGlmICgodG1wID0gcmVhZFJhd0J5dGUoKSkgPj0gMCkgeworICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCAyMTsKKyAgICAgICAgICByZXN1bHQgfD0gKHRtcCA9IHJlYWRSYXdCeXRlKCkpIDw8IDI4OworICAgICAgICAgIGlmICh0bXAgPCAwKSB7CisgICAgICAgICAgICAvLyBEaXNjYXJkIHVwcGVyIDMyIGJpdHMuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgICBpZiAocmVhZFJhd0J5dGUoKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFJlYWRzIGEgdmFyaW50IGZyb20gdGhlIGlucHV0IG9uZSBieXRlIGF0IGEgdGltZSwgc28gdGhhdCBpdCBkb2VzIG5vdAorICAgKiByZWFkIGFueSBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSB2YXJpbnQuICBJZiB5b3Ugc2ltcGx5IHdyYXBwZWQgdGhlCisgICAqIHN0cmVhbSBpbiBhIENvZGVkSW5wdXRTdHJlYW0gYW5kIHVzZWQge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoSW5wdXRTdHJlYW0pfQorICAgKiB0aGVuIHlvdSB3b3VsZCBwcm9iYWJseSBlbmQgdXAgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZhcmludCBzaW5jZQorICAgKiBDb2RlZElucHV0U3RyZWFtIGJ1ZmZlcnMgaXRzIGlucHV0LgorICAgKi8KKyAgc3RhdGljIGludCByZWFkUmF3VmFyaW50MzIoZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKKyAgICBpZiAoZmlyc3RCeXRlID09IC0xKSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKGZpcnN0Qnl0ZSwgaW5wdXQpOworICB9CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoSW5wdXRTdHJlYW0pfSwgYnV0IGV4cGVjdHMgdGhhdCB0aGUgY2FsbGVyCisgICAqIGhhcyBhbHJlYWR5IHJlYWQgb25lIGJ5dGUuICBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGRldGVybWluZSBpZiBFT0YKKyAgICogaGFzIGJlZW4gcmVhY2hlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWFkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgcmVhZFJhd1ZhcmludDMyKAorICAgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSwgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKChmaXJzdEJ5dGUgJiAweDgwKSA9PSAwKSB7CisgICAgICByZXR1cm4gZmlyc3RCeXRlOworICAgIH0KKworICAgIGludCByZXN1bHQgPSBmaXJzdEJ5dGUgJiAweDdmOworICAgIGludCBvZmZzZXQgPSA3OworICAgIGZvciAoOyBvZmZzZXQgPCAzMjsgb2Zmc2V0ICs9IDcpIHsKKyAgICAgIGZpbmFsIGludCBiID0gaW5wdXQucmVhZCgpOworICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IG9mZnNldDsKKyAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gS2VlcCByZWFkaW5nIHVwIHRvIDY0IGJpdHMuCisgICAgZm9yICg7IG9mZnNldCA8IDY0OyBvZmZzZXQgKz0gNykgeworICAgICAgZmluYWwgaW50IGIgPSBpbnB1dC5yZWFkKCk7CisgICAgICBpZiAoYiA9PSAtMSkgeworICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOworICAgICAgfQorICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubWFsZm9ybWVkVmFyaW50KCk7CisgIH0KKworICAvKiogUmVhZCBhIHJhdyBWYXJpbnQgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgbG9uZyByZWFkUmF3VmFyaW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCBzaGlmdCA9IDA7CisgICAgbG9uZyByZXN1bHQgPSAwOworICAgIHdoaWxlIChzaGlmdCA8IDY0KSB7CisgICAgICBmaW5hbCBieXRlIGIgPSByZWFkUmF3Qnl0ZSgpOworICAgICAgcmVzdWx0IHw9IChsb25nKShiICYgMHg3RikgPDwgc2hpZnQ7CisgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubWFsZm9ybWVkVmFyaW50KCk7CisgIH0KKworICAvKiogUmVhZCBhIDMyLWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgaW50IHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZSBiMSA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiMiA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiMyA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiNCA9IHJlYWRSYXdCeXRlKCk7CisgICAgcmV0dXJuICgoKGludCliMSAmIDB4ZmYpICAgICAgKSB8CisgICAgICAgICAgICgoKGludCliMiAmIDB4ZmYpIDw8ICA4KSB8CisgICAgICAgICAgICgoKGludCliMyAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICgoKGludCliNCAmIDB4ZmYpIDw8IDI0KTsKKyAgfQorCisgIC8qKiBSZWFkIGEgNjQtYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBsb25nIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZSBiMSA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiMiA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiMyA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiNCA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiNSA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiNiA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiNyA9IHJlYWRSYXdCeXRlKCk7CisgICAgZmluYWwgYnl0ZSBiOCA9IHJlYWRSYXdCeXRlKCk7CisgICAgcmV0dXJuICgoKGxvbmcpYjEgJiAweGZmKSAgICAgICkgfAorICAgICAgICAgICAoKChsb25nKWIyICYgMHhmZikgPDwgIDgpIHwKKyAgICAgICAgICAgKCgobG9uZyliMyAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICgoKGxvbmcpYjQgJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAoKChsb25nKWI1ICYgMHhmZikgPDwgMzIpIHwKKyAgICAgICAgICAgKCgobG9uZyliNiAmIDB4ZmYpIDw8IDQwKSB8CisgICAgICAgICAgICgoKGxvbmcpYjcgJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAoKChsb25nKWI4ICYgMHhmZikgPDwgNTYpOworICB9CisKKyAgLyoqCisgICAqIERlY29kZSBhIFppZ1phZy1lbmNvZGVkIDMyLWJpdCB2YWx1ZS4gIFppZ1phZyBlbmNvZGVzIHNpZ25lZCBpbnRlZ2VycworICAgKiBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwKKyAgICogbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLAorICAgKiB0aHVzIGFsd2F5cyB0YWtpbmcgMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQorICAgKgorICAgKiBAcGFyYW0gbiBBbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgc3RvcmVkIGluIGEgc2lnbmVkIGludCBiZWNhdXNlCisgICAqICAgICAgICAgIEphdmEgaGFzIG5vIGV4cGxpY2l0IHVuc2lnbmVkIHN1cHBvcnQuCisgICAqIEByZXR1cm4gQSBzaWduZWQgMzItYml0IGludGVnZXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBkZWNvZGVaaWdaYWczMihmaW5hbCBpbnQgbikgeworICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIC8qKgorICAgKiBEZWNvZGUgYSBaaWdaYWctZW5jb2RlZCA2NC1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKKyAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCisgICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKKyAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKKyAgICoKKyAgICogQHBhcmFtIG4gQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQorICAgKiAgICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgorICAgKiBAcmV0dXJuIEEgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBsb25nIGRlY29kZVppZ1phZzY0KGZpbmFsIGxvbmcgbikgeworICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmZmVyOworICBwcml2YXRlIGludCBidWZmZXJTaXplOworICBwcml2YXRlIGludCBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKKyAgcHJpdmF0ZSBpbnQgYnVmZmVyUG9zOworICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGlucHV0OworICBwcml2YXRlIGludCBsYXN0VGFnOworCisgIC8qKgorICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYmVmb3JlIHRoZSBjdXJyZW50IGJ1ZmZlci4gIFRoZSB0b3RhbAorICAgKiBieXRlcyByZWFkIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGNhbiBiZSBjb21wdXRlZCBhcworICAgKiB7QGNvZGUgdG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3N9LiAgVGhpcyB2YWx1ZSBtYXkgYmUgbmVnYXRpdmUgaWYKKyAgICogcmVhZGluZyBzdGFydGVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIChlLmcuIGlmIHRoZQorICAgKiBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgYnl0ZSBhcnJheSBhbmQgYW4gb2Zmc2V0IHdhcyB1c2VkKS4KKyAgICovCisgIHByaXZhdGUgaW50IHRvdGFsQnl0ZXNSZXRpcmVkOworCisgIC8qKiBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtZXNzYWdlLiAqLworICBwcml2YXRlIGludCBjdXJyZW50TGltaXQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAvKiogU2VlIHNldFJlY3Vyc2lvbkxpbWl0KCkgKi8KKyAgcHJpdmF0ZSBpbnQgcmVjdXJzaW9uRGVwdGg7CisgIHByaXZhdGUgaW50IHJlY3Vyc2lvbkxpbWl0ID0gREVGQVVMVF9SRUNVUlNJT05fTElNSVQ7CisKKyAgLyoqIFNlZSBzZXRTaXplTGltaXQoKSAqLworICBwcml2YXRlIGludCBzaXplTGltaXQgPSBERUZBVUxUX1NJWkVfTElNSVQ7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUID0gNjQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NJWkVfTElNSVQgPSA2NCA8PCAyMDsgIC8vIDY0TUIKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKKworICBwcml2YXRlIENvZGVkSW5wdXRTdHJlYW0oZmluYWwgYnl0ZVtdIGJ1ZmZlciwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgeworICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgIGJ1ZmZlclNpemUgPSBvZmYgKyBsZW47CisgICAgYnVmZmVyUG9zID0gb2ZmOworICAgIHRvdGFsQnl0ZXNSZXRpcmVkID0gLW9mZjsKKyAgICBpbnB1dCA9IG51bGw7CisgIH0KKworICBwcml2YXRlIENvZGVkSW5wdXRTdHJlYW0oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKKyAgICBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisgICAgYnVmZmVyU2l6ZSA9IDA7CisgICAgYnVmZmVyUG9zID0gMDsKKyAgICB0b3RhbEJ5dGVzUmV0aXJlZCA9IDA7CisgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBtZXNzYWdlIHJlY3Vyc2lvbiBkZXB0aC4gIEluIG9yZGVyIHRvIHByZXZlbnQgbWFsaWNpb3VzCisgICAqIG1lc3NhZ2VzIGZyb20gY2F1c2luZyBzdGFjayBvdmVyZmxvd3MsIHtAY29kZSBDb2RlZElucHV0U3RyZWFtfSBsaW1pdHMKKyAgICogaG93IGRlZXBseSBtZXNzYWdlcyBtYXkgYmUgbmVzdGVkLiAgVGhlIGRlZmF1bHQgbGltaXQgaXMgNjQuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG9sZCBsaW1pdC4KKyAgICovCisgIHB1YmxpYyBpbnQgc2V0UmVjdXJzaW9uTGltaXQoZmluYWwgaW50IGxpbWl0KSB7CisgICAgaWYgKGxpbWl0IDwgMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgIlJlY3Vyc2lvbiBsaW1pdCBjYW5ub3QgYmUgbmVnYXRpdmU6ICIgKyBsaW1pdCk7CisgICAgfQorICAgIGZpbmFsIGludCBvbGRMaW1pdCA9IHJlY3Vyc2lvbkxpbWl0OworICAgIHJlY3Vyc2lvbkxpbWl0ID0gbGltaXQ7CisgICAgcmV0dXJuIG9sZExpbWl0OworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBtZXNzYWdlIHNpemUuICBJbiBvcmRlciB0byBwcmV2ZW50IG1hbGljaW91cworICAgKiBtZXNzYWdlcyBmcm9tIGV4aGF1c3RpbmcgbWVtb3J5IG9yIGNhdXNpbmcgaW50ZWdlciBvdmVyZmxvd3MsCisgICAqIHtAY29kZSBDb2RlZElucHV0U3RyZWFtfSBsaW1pdHMgaG93IGxhcmdlIGEgbWVzc2FnZSBtYXkgYmUuCisgICAqIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0TUIuICBZb3Ugc2hvdWxkIHNldCB0aGlzIGxpbWl0IGFzIHNtYWxsCisgICAqIGFzIHlvdSBjYW4gd2l0aG91dCBoYXJtaW5nIHlvdXIgYXBwJ3MgZnVuY3Rpb25hbGl0eS4gIE5vdGUgdGhhdAorICAgKiBzaXplIGxpbWl0cyBvbmx5IGFwcGx5IHdoZW4gcmVhZGluZyBmcm9tIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0sIG5vdAorICAgKiB3aGVuIGNvbnN0cnVjdGVkIGFyb3VuZCBhIHJhdyBieXRlIGFycmF5IChub3Igd2l0aAorICAgKiB7QGxpbmsgQnl0ZVN0cmluZyNuZXdDb2RlZElucHV0fSkuCisgICAqIDxwPgorICAgKiBJZiB5b3Ugd2FudCB0byByZWFkIHNldmVyYWwgbWVzc2FnZXMgZnJvbSBhIHNpbmdsZSBDb2RlZElucHV0U3RyZWFtLCB5b3UKKyAgICogY291bGQgY2FsbCB7QGxpbmsgI3Jlc2V0U2l6ZUNvdW50ZXIoKX0gYWZ0ZXIgZWFjaCBvbmUgdG8gYXZvaWQgaGl0dGluZyB0aGUKKyAgICogc2l6ZSBsaW1pdC4KKyAgICoKKyAgICogQHJldHVybiB0aGUgb2xkIGxpbWl0LgorICAgKi8KKyAgcHVibGljIGludCBzZXRTaXplTGltaXQoZmluYWwgaW50IGxpbWl0KSB7CisgICAgaWYgKGxpbWl0IDwgMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgIlNpemUgbGltaXQgY2Fubm90IGJlIG5lZ2F0aXZlOiAiICsgbGltaXQpOworICAgIH0KKyAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBzaXplTGltaXQ7CisgICAgc2l6ZUxpbWl0ID0gbGltaXQ7CisgICAgcmV0dXJuIG9sZExpbWl0OworICB9CisKKyAgLyoqCisgICAqIFJlc2V0cyB0aGUgY3VycmVudCBzaXplIGNvdW50ZXIgdG8gemVybyAoc2VlIHtAbGluayAjc2V0U2l6ZUxpbWl0KGludCl9KS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHJlc2V0U2l6ZUNvdW50ZXIoKSB7CisgICAgdG90YWxCeXRlc1JldGlyZWQgPSAtYnVmZmVyUG9zOworICB9CisKKyAgLyoqCisgICAqIFNldHMge0Bjb2RlIGN1cnJlbnRMaW1pdH0gdG8gKGN1cnJlbnQgcG9zaXRpb24pICsge0Bjb2RlIGJ5dGVMaW1pdH0uICBUaGlzCisgICAqIGlzIGNhbGxlZCB3aGVuIGRlc2NlbmRpbmcgaW50byBhIGxlbmd0aC1kZWxpbWl0ZWQgZW1iZWRkZWQgbWVzc2FnZS4KKyAgICoKKyAgICogPHA+Tm90ZSB0aGF0IHtAY29kZSBwdXNoTGltaXQoKX0gZG9lcyBOT1QgYWZmZWN0IGhvdyBtYW55IGJ5dGVzIHRoZQorICAgKiB7QGNvZGUgQ29kZWRJbnB1dFN0cmVhbX0gcmVhZHMgZnJvbSBhbiB1bmRlcmx5aW5nIHtAY29kZSBJbnB1dFN0cmVhbX0gd2hlbgorICAgKiByZWZyZXNoaW5nIGl0cyBidWZmZXIuICBJZiB5b3UgbmVlZCB0byBwcmV2ZW50IHJlYWRpbmcgcGFzdCBhIGNlcnRhaW4KKyAgICogcG9pbnQgaW4gdGhlIHVuZGVybHlpbmcge0Bjb2RlIElucHV0U3RyZWFtfSAoZS5nLiBiZWNhdXNlIHlvdSBleHBlY3QgaXQgdG8KKyAgICogY29udGFpbiBtb3JlIGRhdGEgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSB3aGljaCB5b3UgbmVlZCB0byBoYW5kbGUKKyAgICogZGlmZmVyZW50bHkpIHRoZW4geW91IG11c3QgcGxhY2UgYSB3cmFwcGVyIGFyb3VuZCB5b3VyIHtAY29kZSBJbnB1dFN0cmVhbX0KKyAgICogd2hpY2ggbGltaXRzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZWFkIGZyb20gaXQuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG9sZCBsaW1pdC4KKyAgICovCisgIHB1YmxpYyBpbnQgcHVzaExpbWl0KGludCBieXRlTGltaXQpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIGlmIChieXRlTGltaXQgPCAwKSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubmVnYXRpdmVTaXplKCk7CisgICAgfQorICAgIGJ5dGVMaW1pdCArPSB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKKyAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBjdXJyZW50TGltaXQ7CisgICAgaWYgKGJ5dGVMaW1pdCA+IG9sZExpbWl0KSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOworICAgIH0KKyAgICBjdXJyZW50TGltaXQgPSBieXRlTGltaXQ7CisKKyAgICByZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpOworCisgICAgcmV0dXJuIG9sZExpbWl0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlY29tcHV0ZUJ1ZmZlclNpemVBZnRlckxpbWl0KCkgeworICAgIGJ1ZmZlclNpemUgKz0gYnVmZmVyU2l6ZUFmdGVyTGltaXQ7CisgICAgZmluYWwgaW50IGJ1ZmZlckVuZCA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZTsKKyAgICBpZiAoYnVmZmVyRW5kID4gY3VycmVudExpbWl0KSB7CisgICAgICAvLyBMaW1pdCBpcyBpbiBjdXJyZW50IGJ1ZmZlci4KKyAgICAgIGJ1ZmZlclNpemVBZnRlckxpbWl0ID0gYnVmZmVyRW5kIC0gY3VycmVudExpbWl0OworICAgICAgYnVmZmVyU2l6ZSAtPSBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKKyAgICB9IGVsc2UgeworICAgICAgYnVmZmVyU2l6ZUFmdGVyTGltaXQgPSAwOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBEaXNjYXJkcyB0aGUgY3VycmVudCBsaW1pdCwgcmV0dXJuaW5nIHRvIHRoZSBwcmV2aW91cyBsaW1pdC4KKyAgICoKKyAgICogQHBhcmFtIG9sZExpbWl0IFRoZSBvbGQgbGltaXQsIGFzIHJldHVybmVkIGJ5IHtAY29kZSBwdXNoTGltaXR9LgorICAgKi8KKyAgcHVibGljIHZvaWQgcG9wTGltaXQoZmluYWwgaW50IG9sZExpbWl0KSB7CisgICAgY3VycmVudExpbWl0ID0gb2xkTGltaXQ7CisgICAgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBiZWZvcmUgdGhlIGN1cnJlbnQgbGltaXQuCisgICAqIElmIG5vIGxpbWl0IGlzIHNldCwgcmV0dXJucyAtMS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgeworICAgIGlmIChjdXJyZW50TGltaXQgPT0gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmaW5hbCBpbnQgY3VycmVudEFic29sdXRlUG9zaXRpb24gPSB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKKyAgICByZXR1cm4gY3VycmVudExpbWl0IC0gY3VycmVudEFic29sdXRlUG9zaXRpb247CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZQorICAgKiBjYXNlIGlmIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IHNvdXJjZSBoYXMgYmVlbiByZWFjaGVkIG9yCisgICAqIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgYSBsaW1pdCBjcmVhdGVkIHVzaW5nIHtAbGluayAjcHVzaExpbWl0KGludCl9LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNBdEVuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ1ZmZlclBvcyA9PSBidWZmZXJTaXplICYmICFyZWZpbGxCdWZmZXIoZmFsc2UpOworICB9CisKKyAgLyoqCisgICAqIFRoZSB0b3RhbCBieXRlcyByZWFkIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBDYWxsaW5nCisgICAqIHtAbGluayAjcmVzZXRTaXplQ291bnRlcigpfSByZXNldHMgdGhpcyB2YWx1ZSB0byB6ZXJvLgorICAgKi8KKyAgcHVibGljIGludCBnZXRUb3RhbEJ5dGVzUmVhZCgpIHsKKyAgICAgIHJldHVybiB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2l0aCB7QGNvZGUgdGhpcy5idWZmZXJ9IGlzIGVtcHR5IHRvIHJlYWQgbW9yZSBieXRlcyBmcm9tIHRoZQorICAgKiBpbnB1dC4gIElmIHtAY29kZSBtdXN0U3VjY2VlZH0gaXMgdHJ1ZSwgcmVmaWxsQnVmZmVyKCkgZ3VhcmFudGVlcyB0aGF0CisgICAqIGVpdGhlciB0aGVyZSB3aWxsIGJlIGF0IGxlYXN0IG9uZSBieXRlIGluIHRoZSBidWZmZXIgd2hlbiBpdCByZXR1cm5zCisgICAqIG9yIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLiAgSWYge0Bjb2RlIG11c3RTdWNjZWVkfSBpcyBmYWxzZSwKKyAgICogcmVmaWxsQnVmZmVyKCkgcmV0dXJucyBmYWxzZSBpZiBubyBtb3JlIGJ5dGVzIHdlcmUgYXZhaWxhYmxlLgorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIHJlZmlsbEJ1ZmZlcihmaW5hbCBib29sZWFuIG11c3RTdWNjZWVkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChidWZmZXJQb3MgPCBidWZmZXJTaXplKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAicmVmaWxsQnVmZmVyKCkgY2FsbGVkIHdoZW4gYnVmZmVyIHdhc24ndCBlbXB0eS4iKTsKKyAgICB9CisKKyAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJTaXplID09IGN1cnJlbnRMaW1pdCkgeworICAgICAgLy8gT29wcywgd2UgaGl0IGEgbGltaXQuCisgICAgICBpZiAobXVzdFN1Y2NlZWQpIHsKKyAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBidWZmZXJTaXplOworCisgICAgYnVmZmVyUG9zID0gMDsKKyAgICBidWZmZXJTaXplID0gKGlucHV0ID09IG51bGwpID8gLTEgOiBpbnB1dC5yZWFkKGJ1ZmZlcik7CisgICAgaWYgKGJ1ZmZlclNpemUgPT0gMCB8fCBidWZmZXJTaXplIDwgLTEpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgIklucHV0U3RyZWFtI3JlYWQoYnl0ZVtdKSByZXR1cm5lZCBpbnZhbGlkIHJlc3VsdDogIiArIGJ1ZmZlclNpemUgKworICAgICAgICAgICJcblRoZSBJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiBpcyBidWdneS4iKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlclNpemUgPT0gLTEpIHsKKyAgICAgIGJ1ZmZlclNpemUgPSAwOworICAgICAgaWYgKG11c3RTdWNjZWVkKSB7CisgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJlY29tcHV0ZUJ1ZmZlclNpemVBZnRlckxpbWl0KCk7CisgICAgICBmaW5hbCBpbnQgdG90YWxCeXRlc1JlYWQgPQorICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclNpemUgKyBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKKyAgICAgIGlmICh0b3RhbEJ5dGVzUmVhZCA+IHNpemVMaW1pdCB8fCB0b3RhbEJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnNpemVMaW1pdEV4Y2VlZGVkKCk7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVhZCBvbmUgYnl0ZSBmcm9tIHRoZSBpbnB1dC4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gVGhlIGVuZCBvZiB0aGUgc3RyZWFtIG9yIHRoZSBjdXJyZW50CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHdhcyByZWFjaGVkLgorICAgKi8KKyAgcHVibGljIGJ5dGUgcmVhZFJhd0J5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChidWZmZXJQb3MgPT0gYnVmZmVyU2l6ZSkgeworICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyW2J1ZmZlclBvcysrXTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIGEgZml4ZWQgc2l6ZSBvZiBieXRlcyBmcm9tIHRoZSBpbnB1dC4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gVGhlIGVuZCBvZiB0aGUgc3RyZWFtIG9yIHRoZSBjdXJyZW50CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHdhcyByZWFjaGVkLgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSByZWFkUmF3Qnl0ZXMoZmluYWwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubmVnYXRpdmVTaXplKCk7CisgICAgfQorCisgICAgaWYgKHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zICsgc2l6ZSA+IGN1cnJlbnRMaW1pdCkgeworICAgICAgLy8gUmVhZCB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYW55d2F5LgorICAgICAgc2tpcFJhd0J5dGVzKGN1cnJlbnRMaW1pdCAtIHRvdGFsQnl0ZXNSZXRpcmVkIC0gYnVmZmVyUG9zKTsKKyAgICAgIC8vIFRoZW4gZmFpbC4KKyAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCk7CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykgeworICAgICAgLy8gV2UgaGF2ZSBhbGwgdGhlIGJ5dGVzIHdlIG5lZWQgYWxyZWFkeS4KKyAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclBvcywgYnl0ZXMsIDAsIHNpemUpOworICAgICAgYnVmZmVyUG9zICs9IHNpemU7CisgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfSBlbHNlIGlmIChzaXplIDwgQlVGRkVSX1NJWkUpIHsKKyAgICAgIC8vIFJlYWRpbmcgbW9yZSBieXRlcyB0aGFuIGFyZSBpbiB0aGUgYnVmZmVyLCBidXQgbm90IGFuIGV4Y2Vzc2l2ZSBudW1iZXIKKyAgICAgIC8vIG9mIGJ5dGVzLiAgV2UgY2FuIHNhZmVseSBhbGxvY2F0ZSB0aGUgcmVzdWx0aW5nIGFycmF5IGFoZWFkIG9mIHRpbWUuCisKKyAgICAgIC8vIEZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlLgorICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICBpbnQgcG9zID0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvczsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZmZXJQb3MsIGJ5dGVzLCAwLCBwb3MpOworICAgICAgYnVmZmVyUG9zID0gYnVmZmVyU2l6ZTsKKworICAgICAgLy8gV2Ugd2FudCB0byB1c2UgcmVmaWxsQnVmZmVyKCkgYW5kIHRoZW4gY29weSBmcm9tIHRoZSBidWZmZXIgaW50byBvdXIKKyAgICAgIC8vIGJ5dGUgYXJyYXkgcmF0aGVyIHRoYW4gcmVhZGluZyBkaXJlY3RseSBpbnRvIG91ciBieXRlIGFycmF5IGJlY2F1c2UKKyAgICAgIC8vIHRoZSBpbnB1dCBtYXkgYmUgdW5idWZmZXJlZC4KKyAgICAgIHJlZmlsbEJ1ZmZlcih0cnVlKTsKKworICAgICAgd2hpbGUgKHNpemUgLSBwb3MgPiBidWZmZXJTaXplKSB7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBieXRlcywgcG9zLCBidWZmZXJTaXplKTsKKyAgICAgICAgcG9zICs9IGJ1ZmZlclNpemU7CisgICAgICAgIGJ1ZmZlclBvcyA9IGJ1ZmZlclNpemU7CisgICAgICAgIHJlZmlsbEJ1ZmZlcih0cnVlKTsKKyAgICAgIH0KKworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGJ5dGVzLCBwb3MsIHNpemUgLSBwb3MpOworICAgICAgYnVmZmVyUG9zID0gc2l6ZSAtIHBvczsKKworICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgc2l6ZSBpcyB2ZXJ5IGxhcmdlLiAgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHdlIGNhbid0IGFsbG9jYXRlIHRoZQorICAgICAgLy8gZW50aXJlIGJ5dGUgYXJyYXkgeWV0LiAgVGhlIHNpemUgY29tZXMgZGlyZWN0bHkgZnJvbSB0aGUgaW5wdXQsIHNvIGEKKyAgICAgIC8vIG1hbGljaW91c2x5LWNyYWZ0ZWQgbWVzc2FnZSBjb3VsZCBwcm92aWRlIGEgYm9ndXMgdmVyeSBsYXJnZSBzaXplIGluCisgICAgICAvLyBvcmRlciB0byB0cmljayB0aGUgYXBwIGludG8gYWxsb2NhdGluZyBhIGxvdCBvZiBtZW1vcnkuICBXZSBhdm9pZCB0aGlzCisgICAgICAvLyBieSBhbGxvY2F0aW5nIGFuZCByZWFkaW5nIG9ubHkgYSBzbWFsbCBjaHVuayBhdCBhIHRpbWUsIHNvIHRoYXQgdGhlCisgICAgICAvLyBtYWxpY2lvdXMgbWVzc2FnZSBtdXN0IGFjdHVhbGx5ICpiZSogZXh0cmVtZWx5IGxhcmdlIHRvIGNhdXNlCisgICAgICAvLyBwcm9ibGVtcy4gIE1lYW53aGlsZSwgd2UgbGltaXQgdGhlIGFsbG93ZWQgc2l6ZSBvZiBhIG1lc3NhZ2UgZWxzZXdoZXJlLgorCisgICAgICAvLyBSZW1lbWJlciB0aGUgYnVmZmVyIG1hcmtlcnMgc2luY2Ugd2UnbGwgaGF2ZSB0byBjb3B5IHRoZSBieXRlcyBvdXQgb2YKKyAgICAgIC8vIGl0IGxhdGVyLgorICAgICAgZmluYWwgaW50IG9yaWdpbmFsQnVmZmVyUG9zID0gYnVmZmVyUG9zOworICAgICAgZmluYWwgaW50IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisKKyAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnN1bWVkLgorICAgICAgdG90YWxCeXRlc1JldGlyZWQgKz0gYnVmZmVyU2l6ZTsKKyAgICAgIGJ1ZmZlclBvcyA9IDA7CisgICAgICBidWZmZXJTaXplID0gMDsKKworICAgICAgLy8gUmVhZCBhbGwgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIHdlIG5lZWQuCisgICAgICBpbnQgc2l6ZUxlZnQgPSBzaXplIC0gKG9yaWdpbmFsQnVmZmVyU2l6ZSAtIG9yaWdpbmFsQnVmZmVyUG9zKTsKKyAgICAgIGZpbmFsIExpc3Q8Ynl0ZVtdPiBjaHVua3MgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKworICAgICAgd2hpbGUgKHNpemVMZWZ0ID4gMCkgeworICAgICAgICBmaW5hbCBieXRlW10gY2h1bmsgPSBuZXcgYnl0ZVtNYXRoLm1pbihzaXplTGVmdCwgQlVGRkVSX1NJWkUpXTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChwb3MgPCBjaHVuay5sZW5ndGgpIHsKKyAgICAgICAgICBmaW5hbCBpbnQgbiA9IChpbnB1dCA9PSBudWxsKSA/IC0xIDoKKyAgICAgICAgICAgIGlucHV0LnJlYWQoY2h1bmssIHBvcywgY2h1bmsubGVuZ3RoIC0gcG9zKTsKKyAgICAgICAgICBpZiAobiA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdG90YWxCeXRlc1JldGlyZWQgKz0gbjsKKyAgICAgICAgICBwb3MgKz0gbjsKKyAgICAgICAgfQorICAgICAgICBzaXplTGVmdCAtPSBjaHVuay5sZW5ndGg7CisgICAgICAgIGNodW5rcy5hZGQoY2h1bmspOworICAgICAgfQorCisgICAgICAvLyBPSywgZ290IGV2ZXJ5dGhpbmcuICBOb3cgY29uY2F0ZW5hdGUgaXQgYWxsIGludG8gb25lIGJ1ZmZlci4KKyAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOworCisgICAgICAvLyBTdGFydCBieSBjb3B5aW5nIHRoZSBsZWZ0b3ZlciBieXRlcyBmcm9tIHRoaXMuYnVmZmVyLgorICAgICAgaW50IHBvcyA9IG9yaWdpbmFsQnVmZmVyU2l6ZSAtIG9yaWdpbmFsQnVmZmVyUG9zOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG9yaWdpbmFsQnVmZmVyUG9zLCBieXRlcywgMCwgcG9zKTsKKworICAgICAgLy8gQW5kIG5vdyBhbGwgdGhlIGNodW5rcy4KKyAgICAgIGZvciAoZmluYWwgYnl0ZVtdIGNodW5rIDogY2h1bmtzKSB7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2h1bmssIDAsIGJ5dGVzLCBwb3MsIGNodW5rLmxlbmd0aCk7CisgICAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7CisgICAgICB9CisKKyAgICAgIC8vIERvbmUuCisgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlYWRzIGFuZCBkaXNjYXJkcyB7QGNvZGUgc2l6ZX0gYnl0ZXMuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB3YXMgcmVhY2hlZC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNraXBSYXdCeXRlcyhmaW5hbCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5uZWdhdGl2ZVNpemUoKTsKKyAgICB9CisKKyAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3MgKyBzaXplID4gY3VycmVudExpbWl0KSB7CisgICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbnl3YXkuCisgICAgICBza2lwUmF3Qnl0ZXMoY3VycmVudExpbWl0IC0gdG90YWxCeXRlc1JldGlyZWQgLSBidWZmZXJQb3MpOworICAgICAgLy8gVGhlbiBmYWlsLgorICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zKSB7CisgICAgICAvLyBXZSBoYXZlIGFsbCB0aGUgYnl0ZXMgd2UgbmVlZCBhbHJlYWR5LgorICAgICAgYnVmZmVyUG9zICs9IHNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNraXBwaW5nIG1vcmUgYnl0ZXMgdGhhbiBhcmUgaW4gdGhlIGJ1ZmZlci4gIEZpcnN0IHNraXAgd2hhdCB3ZSBoYXZlLgorICAgICAgaW50IHBvcyA9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3M7CisgICAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOworCisgICAgICAvLyBLZWVwIHJlZmlsbGluZyB0aGUgYnVmZmVyIHVudGlsIHdlIGdldCB0byB0aGUgcG9pbnQgd2Ugd2FudGVkIHRvIHNraXAKKyAgICAgIC8vIHRvLiAgVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGVuc3VyaW5nIHRoZSBsaW1pdHMgYXJlIHVwZGF0ZWQKKyAgICAgIC8vIGNvcnJlY3RseS4KKyAgICAgIHJlZmlsbEJ1ZmZlcih0cnVlKTsKKyAgICAgIHdoaWxlIChzaXplIC0gcG9zID4gYnVmZmVyU2l6ZSkgeworICAgICAgICBwb3MgKz0gYnVmZmVyU2l6ZTsKKyAgICAgICAgYnVmZmVyUG9zID0gYnVmZmVyU2l6ZTsKKyAgICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOworICAgICAgfQorCisgICAgICBidWZmZXJQb3MgPSBzaXplIC0gcG9zOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjQ2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMTExIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisvKioKKyAqIEVuY29kZXMgYW5kIHdyaXRlcyBwcm90b2NvbCBtZXNzYWdlIGZpZWxkcy4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGNvbnRhaW5zIHR3byBraW5kcyBvZiBtZXRob2RzOiAgbWV0aG9kcyB0aGF0IHdyaXRlIHNwZWNpZmljCisgKiBwcm90b2NvbCBtZXNzYWdlIGNvbnN0cnVjdHMgYW5kIGZpZWxkIHR5cGVzIChlLmcuIHtAbGluayAjd3JpdGVUYWd9IGFuZAorICoge0BsaW5rICN3cml0ZUludDMyfSkgYW5kIG1ldGhvZHMgdGhhdCB3cml0ZSBsb3ctbGV2ZWwgdmFsdWVzIChlLmcuCisgKiB7QGxpbmsgI3dyaXRlUmF3VmFyaW50MzJ9IGFuZCB7QGxpbmsgI3dyaXRlUmF3Qnl0ZXN9KS4gIElmIHlvdSBhcmUKKyAqIHdyaXRpbmcgZW5jb2RlZCBwcm90b2NvbCBtZXNzYWdlcywgeW91IHNob3VsZCB1c2UgdGhlIGZvcm1lciBtZXRob2RzLCBidXQgaWYKKyAqIHlvdSBhcmUgd3JpdGluZyBzb21lIG90aGVyIGZvcm1hdCBvZiB5b3VyIG93biBkZXNpZ24sIHVzZSB0aGUgbGF0dGVyLgorICoKKyAqIDxwPlRoaXMgY2xhc3MgaXMgdG90YWxseSB1bnN5bmNocm9uaXplZC4KKyAqCisgKiBAYXV0aG9yIGtuZXRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW0geworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXI7CisgIHByaXZhdGUgZmluYWwgaW50IGxpbWl0OworICBwcml2YXRlIGludCBwb3NpdGlvbjsKKworICBwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQ7CisKKyAgLyoqCisgICAqIFRoZSBidWZmZXIgc2l6ZSB1c2VkIGluIHtAbGluayAjbmV3SW5zdGFuY2UoT3V0cHV0U3RyZWFtKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNDA5NjsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYnVmZmVyIHNpemUgdG8gZWZmaWNpZW50bHkgd3JpdGUgZGF0YUxlbmd0aCBieXRlcyB0byB0aGlzCisgICAqIENvZGVkT3V0cHV0U3RyZWFtLiBVc2VkIGJ5IEFic3RyYWN0TWVzc2FnZUxpdGUuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGJ1ZmZlciBzaXplIHRvIGVmZmljaWVudGx5IHdyaXRlIGRhdGFMZW5ndGggYnl0ZXMgdG8gdGhpcworICAgKiAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLgorICAgKi8KKyAgc3RhdGljIGludCBjb21wdXRlUHJlZmVycmVkQnVmZmVyU2l6ZShpbnQgZGF0YUxlbmd0aCkgeworICAgIGlmIChkYXRhTGVuZ3RoID4gREVGQVVMVF9CVUZGRVJfU0laRSkgcmV0dXJuIERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgcmV0dXJuIGRhdGFMZW5ndGg7CisgIH0KKworICBwcml2YXRlIENvZGVkT3V0cHV0U3RyZWFtKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCkgeworICAgIG91dHB1dCA9IG51bGw7CisgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CisgICAgcG9zaXRpb24gPSBvZmZzZXQ7CisgICAgbGltaXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgIH0KKworICBwcml2YXRlIENvZGVkT3V0cHV0U3RyZWFtKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQsIGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKyAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBwb3NpdGlvbiA9IDA7CisgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19IHdyYXBwaW5nIHRoZSBnaXZlbgorICAgKiB7QGNvZGUgT3V0cHV0U3RyZWFtfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgeworICAgIHJldHVybiBuZXdJbnN0YW5jZShvdXRwdXQsIERFRkFVTFRfQlVGRkVSX1NJWkUpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19IHdyYXBwaW5nIHRoZSBnaXZlbgorICAgKiB7QGNvZGUgT3V0cHV0U3RyZWFtfSB3aXRoIGEgZ2l2ZW4gYnVmZmVyIHNpemUuCisgICAqLworICBwdWJsaWMgc3RhdGljIENvZGVkT3V0cHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQsCisgICAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSkgeworICAgIHJldHVybiBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0LCBuZXcgYnl0ZVtidWZmZXJTaXplXSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0gdGhhdCB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlIGdpdmVuCisgICAqIGJ5dGUgYXJyYXkuICBJZiBtb3JlIGJ5dGVzIGFyZSB3cml0dGVuIHRoYW4gZml0IGluIHRoZSBhcnJheSwKKyAgICoge0BsaW5rIE91dE9mU3BhY2VFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLiAgV3JpdGluZyBkaXJlY3RseSB0byBhIGZsYXQKKyAgICogYXJyYXkgaXMgZmFzdGVyIHRoYW4gd3JpdGluZyB0byBhbiB7QGNvZGUgT3V0cHV0U3RyZWFtfS4gIFNlZSBhbHNvCisgICAqIHtAbGluayBCeXRlU3RyaW5nI25ld0NvZGVkQnVpbGRlcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIENvZGVkT3V0cHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBmbGF0QXJyYXkpIHsKKyAgICByZXR1cm4gbmV3SW5zdGFuY2UoZmxhdEFycmF5LCAwLCBmbGF0QXJyYXkubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgZ2l2ZW4KKyAgICogYnl0ZSBhcnJheSBzbGljZS4gIElmIG1vcmUgYnl0ZXMgYXJlIHdyaXR0ZW4gdGhhbiBmaXQgaW4gdGhlIHNsaWNlLAorICAgKiB7QGxpbmsgT3V0T2ZTcGFjZUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uICBXcml0aW5nIGRpcmVjdGx5IHRvIGEgZmxhdAorICAgKiBhcnJheSBpcyBmYXN0ZXIgdGhhbiB3cml0aW5nIHRvIGFuIHtAY29kZSBPdXRwdXRTdHJlYW19LiAgU2VlIGFsc28KKyAgICoge0BsaW5rIEJ5dGVTdHJpbmcjbmV3Q29kZWRCdWlsZGVyfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgYnl0ZVtdIGZsYXRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGgpIHsKKyAgICByZXR1cm4gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGZsYXRBcnJheSwgb2Zmc2V0LCBsZW5ndGgpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZG91YmxlfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBkb3VibGUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCk7CisgICAgd3JpdGVEb3VibGVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZmxvYXR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZUZsb2F0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgZmxvYXQgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyKTsKKyAgICB3cml0ZUZsb2F0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlVUludDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOworICAgIHdyaXRlVUludDY0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50NjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKKyAgICB3cml0ZUludDY0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50MzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOworICAgIHdyaXRlSW50MzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQpOworICAgIHdyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhIHtAY29kZSBmaXhlZDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyKTsKKyAgICB3cml0ZUZpeGVkMzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgYm9vbH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGJvb2xlYW4gdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7CisgICAgd3JpdGVCb29sTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHN0cmluZ30gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgIHdyaXRlU3RyaW5nTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVHcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOworICAgIHdyaXRlR3JvdXBOb1RhZyh2YWx1ZSk7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIGdyb3VwIHJlcHJlc2VudGVkIGJ5IGFuIHtAbGluayBVbmtub3duRmllbGRTZXR9LgorICAgKgorICAgKiBAZGVwcmVjYXRlZCBVbmtub3duRmllbGRTZXQgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUsIHNvIHlvdSBjYW4ganVzdAorICAgKiAgICAgICAgICAgICBjYWxsIHtAbGluayAjd3JpdGVHcm91cH0uCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgdm9pZCB3cml0ZVVua25vd25Hcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlR3JvdXAoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgICAgd3JpdGVNZXNzYWdlTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgICB3cml0ZUJ5dGVzTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlVUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7CisgICAgd3JpdGVVSW50MzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgYW4gZW51bSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gIENhbGxlciBpcyByZXNwb25zaWJsZQorICAgKiBmb3IgY29udmVydGluZyB0aGUgZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRW51bShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKKyAgICB3cml0ZUVudW1Ob1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIpOworICAgIHdyaXRlU0ZpeGVkMzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0KTsKKyAgICB3cml0ZVNGaXhlZDY0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVNJbnQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOworICAgIHdyaXRlU0ludDMyTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVNJbnQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKKyAgICB3cml0ZVNJbnQ2NE5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLAorICAgKiB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7CisgICAgd3JpdGVVSW50MzIoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcik7CisgICAgd3JpdGVNZXNzYWdlKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOworICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIHVucGFyc2VkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IKKyAgICogaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKTsKKyAgICB3cml0ZVVJbnQzMihXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKTsKKyAgICB3cml0ZUJ5dGVzKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOworICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZG91YmxlfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZU5vVGFnKGZpbmFsIGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0xpdHRsZUVuZGlhbjY0KERvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKHZhbHVlKSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZmxvYXR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRmxvYXROb1RhZyhmaW5hbCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHZhbHVlKSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgdWludDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVVJbnQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQ2NCh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIGludDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZUludDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhbiB7QGNvZGUgaW50MzJ9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50MzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHZhbHVlID49IDApIHsKKyAgICAgIHdyaXRlUmF3VmFyaW50MzIodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kLgorICAgICAgd3JpdGVSYXdWYXJpbnQ2NCh2YWx1ZSk7CisgICAgfQorICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGZpeGVkNjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGJvb2x9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbE5vVGFnKGZpbmFsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdCeXRlKHZhbHVlID8gMSA6IDApOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHN0cmluZ30gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmdOb1RhZyhmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW55IHdheSB0byB0ZWxsIEphdmEgdG8gZW5jb2RlCisgICAgLy8gVVRGLTggZGlyZWN0bHkgaW50byBvdXIgYnVmZmVyLCBzbyB3ZSBoYXZlIHRvIGxldCBpdCBjcmVhdGUgaXRzIG93biBieXRlCisgICAgLy8gYXJyYXkgYW5kIHRoZW4gY29weS4KKyAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSB2YWx1ZS5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICB3cml0ZVJhd1ZhcmludDMyKGJ5dGVzLmxlbmd0aCk7CisgICAgd3JpdGVSYXdCeXRlcyhieXRlcyk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZ3JvdXB9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlR3JvdXBOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB2YWx1ZS53cml0ZVRvKHRoaXMpOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGEgZ3JvdXAgcmVwcmVzZW50ZWQgYnkgYW4ge0BsaW5rIFVua25vd25GaWVsZFNldH0uCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVua25vd25GaWVsZFNldCBub3cgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSwgc28geW91IGNhbiBqdXN0CisgICAqICAgICAgICAgICAgIGNhbGwge0BsaW5rICN3cml0ZUdyb3VwTm9UYWd9LgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgd3JpdGVVbmtub3duR3JvdXBOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVHcm91cE5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3VmFyaW50MzIodmFsdWUuZ2V0U2VyaWFsaXplZFNpemUoKSk7CisgICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhIHtAY29kZSBieXRlc30gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVCeXRlc05vVGFnKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQzMih2YWx1ZS5zaXplKCkpOworICAgIHdyaXRlUmF3Qnl0ZXModmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVVSW50MzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQzMih2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgYW4gZW51bSBmaWVsZCB0byB0aGUgc3RyZWFtLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgICAqIGZvciBjb252ZXJ0aW5nIHRoZSBlbnVtIHZhbHVlIHRvIGl0cyBudW1lcmljIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGVFbnVtTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlSW50MzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVNGaXhlZDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNpbnQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTSW50MzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQzMihlbmNvZGVaaWdaYWczMih2YWx1ZSkpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50NjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlU0ludDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd1ZhcmludDY0KGVuY29kZVppZ1phZzY0KHZhbHVlKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGRvdWJsZX0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRG91YmxlU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRG91YmxlU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGbG9hdFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBmbG9hdCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRmxvYXRTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgdWludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlVUludDY0U2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlSW50NjRTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIGludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRml4ZWQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGJvb2x9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJvb2xTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUJvb2xTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgc3RyaW5nfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTdHJpbmdTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTdHJpbmdTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUdyb3VwU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICogMiArIGNvbXB1dGVHcm91cFNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBncm91cH0gZmllbGQgcmVwcmVzZW50ZWQgYnkgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0sIGluY2x1ZGluZworICAgKiB0YWcuCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVua25vd25GaWVsZFNldCBub3cgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSwgc28geW91IGNhbiBqdXN0CisgICAqICAgICAgICAgICAgIGNhbGwge0BsaW5rICNjb21wdXRlR3JvdXBTaXplfS4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVbmtub3duR3JvdXBTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZUdyb3VwU2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICogZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVNZXNzYWdlU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlTWVzc2FnZVNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBieXRlc30gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlQnl0ZXNTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVCeXRlc1NpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiBlbWJlZGRlZCBtZXNzYWdlIGluIGxhenkgZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTGF6eUZpZWxkU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExhenlGaWVsZCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlTGF6eUZpZWxkU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIHVpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVUludDMyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlVUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIGVudW0gZmllbGQsIGluY2x1ZGluZyB0YWcuICBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhlCisgICAqIGVudW0gdmFsdWUgdG8gaXRzIG51bWVyaWMgdmFsdWUuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRW51bVNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUVudW1TaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTRml4ZWQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ZpeGVkMzJTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTRml4ZWQ2NFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBzaW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNJbnQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVNJbnQzMlNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiB7QGNvZGUgc2ludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ludDY0U2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICogTWVzc2FnZVNldCBleHRlbnNpb24gdG8gdGhlIHN0cmVhbS4gIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsCisgICAqIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZSgKKyAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNKSAqIDIgKworICAgICAgICAgICBjb21wdXRlVUludDMyU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKSArCisgICAgICAgICAgIGNvbXB1dGVNZXNzYWdlU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHVucGFyc2VkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IKKyAgICogaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlUmF3TWVzc2FnZVNldEV4dGVuc2lvblNpemUoCisgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNKSAqIDIgKworICAgICAgICAgICBjb21wdXRlVUludDMyU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKSArCisgICAgICAgICAgIGNvbXB1dGVCeXRlc1NpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiBsYXppbHkgcGFyc2VkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IKKyAgICogaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTGF6eUZpZWxkTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCisgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIExhenlGaWVsZCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0pICogMiArCisgICAgICAgICAgIGNvbXB1dGVVSW50MzJTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpICsKKyAgICAgICAgICAgY29tcHV0ZUxhenlGaWVsZFNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7CisgIH0KKyAgCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZG91YmxlfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVEb3VibGVTaXplTm9UYWcoZmluYWwgZG91YmxlIHZhbHVlKSB7CisgICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fNjRfU0laRTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGbG9hdFNpemVOb1RhZyhmaW5hbCBmbG9hdCB2YWx1ZSkgeworICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSB1aW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIGludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIGludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPj0gMCkgeworICAgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kLgorICAgICAgcmV0dXJuIDEwOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzY0X1NJWkU7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBmaXhlZDMyfSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgeworICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBib29sfSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCb29sU2l6ZU5vVGFnKGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIHN0cmluZ30gZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSB2YWx1ZS5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKGJ5dGVzLmxlbmd0aCkgKworICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aDsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkLiIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGdyb3VwfSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVHcm91cFNpemVOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZS5nZXRTZXJpYWxpemVkU2l6ZSgpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkIHJlcHJlc2VudGVkIGJ5IGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9LCBpbmNsdWRpbmcKKyAgICogdGFnLgorICAgKgorICAgKiBAZGVwcmVjYXRlZCBVbmtub3duRmllbGRTZXQgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUsIHNvIHlvdSBjYW4ganVzdAorICAgKiAgICAgICAgICAgICBjYWxsIHtAbGluayAjY29tcHV0ZVVua25vd25Hcm91cFNpemVOb1RhZ30uCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVW5rbm93bkdyb3VwU2l6ZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVHcm91cFNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbiBlbWJlZGRlZAorICAgKiBtZXNzYWdlIGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKKyAgICBmaW5hbCBpbnQgc2l6ZSA9IHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoc2l6ZSkgKyBzaXplOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4gZW1iZWRkZWQKKyAgICogbWVzc2FnZSBzdG9yZWQgaW4gbGF6eSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVMYXp5RmllbGRTaXplTm9UYWcoZmluYWwgTGF6eUZpZWxkIHZhbHVlKSB7CisgICAgZmluYWwgaW50IHNpemUgPSB2YWx1ZS5nZXRTZXJpYWxpemVkU2l6ZSgpOworICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKHNpemUpICsgc2l6ZTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGJ5dGVzfSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCeXRlc1NpemVOb1RhZyhmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUuc2l6ZSgpKSArCisgICAgICAgICAgIHZhbHVlLnNpemUoKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIHVpbnQzMn0gZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVUludDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuIGVudW0gZmllbGQuCisgICAqIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyB0aGUgZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVFbnVtU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlSW50MzJTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTRml4ZWQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gTElUVExFX0VORElBTl8zMl9TSVpFOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTRml4ZWQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fNjRfU0laRTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBzaW50MzJ9IGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShlbmNvZGVaaWdaYWczMih2YWx1ZSkpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIHNpbnQ2NH0gZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDY0U2l6ZU5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDY0U2l6ZShlbmNvZGVaaWdaYWc2NCh2YWx1ZSkpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogSW50ZXJuYWwgaGVscGVyIHRoYXQgd3JpdGVzIHRoZSBjdXJyZW50IGJ1ZmZlciB0byB0aGUgb3V0cHV0LiBUaGUKKyAgICogYnVmZmVyIHBvc2l0aW9uIGlzIHJlc2V0IHRvIGl0cyBpbml0aWFsIHZhbHVlIHdoZW4gdGhpcyByZXR1cm5zLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgeworICAgICAgLy8gV2UncmUgd3JpdGluZyB0byBhIHNpbmdsZSBidWZmZXIuCisgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8vIFNpbmNlIHdlIGhhdmUgYW4gb3V0cHV0IHN0cmVhbSwgdGhpcyBpcyBvdXIgYnVmZmVyCisgICAgLy8gYW5kIGJ1ZmZlciBvZmZzZXQgPT0gMAorICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIHBvc2l0aW9uKTsKKyAgICBwb3NpdGlvbiA9IDA7CisgIH0KKworICAvKioKKyAgICogRmx1c2hlcyB0aGUgc3RyZWFtIGFuZCBmb3JjZXMgYW55IGJ1ZmZlcmVkIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uICBUaGlzCisgICAqIGRvZXMgbm90IGZsdXNoIHRoZSB1bmRlcmx5aW5nIE91dHB1dFN0cmVhbS4KKyAgICovCisgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgIHJlZnJlc2hCdWZmZXIoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSWYgd3JpdGluZyB0byBhIGZsYXQgYXJyYXksIHJldHVybiB0aGUgc3BhY2UgbGVmdCBpbiB0aGUgYXJyYXkuCisgICAqIE90aGVyd2lzZSwgdGhyb3dzIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCisgICAqLworICBwdWJsaWMgaW50IHNwYWNlTGVmdCgpIHsKKyAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKKyAgICAgIHJldHVybiBsaW1pdCAtIHBvc2l0aW9uOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICJzcGFjZUxlZnQoKSBjYW4gb25seSBiZSBjYWxsZWQgb24gQ29kZWRPdXRwdXRTdHJlYW1zIHRoYXQgYXJlICIgKworICAgICAgICAid3JpdGluZyB0byBhIGZsYXQgYXJyYXkuIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFZlcmlmaWVzIHRoYXQge0BsaW5rICNzcGFjZUxlZnQoKX0gcmV0dXJucyB6ZXJvLiAgSXQncyBjb21tb24gdG8gY3JlYXRlCisgICAqIGEgYnl0ZSBhcnJheSB0aGF0IGlzIGV4YWN0bHkgYmlnIGVub3VnaCB0byBob2xkIGEgbWVzc2FnZSwgdGhlbiB3cml0ZSB0bworICAgKiBpdCB3aXRoIGEge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfS4gIENhbGxpbmcge0Bjb2RlIGNoZWNrTm9TcGFjZUxlZnQoKX0KKyAgICogYWZ0ZXIgd3JpdGluZyB2ZXJpZmllcyB0aGF0IHRoZSBtZXNzYWdlIHdhcyBhY3R1YWxseSBhcyBiaWcgYXMgZXhwZWN0ZWQsCisgICAqIHdoaWNoIGNhbiBoZWxwIGNhdGNoIGJ1Z3MuCisgICAqLworICBwdWJsaWMgdm9pZCBjaGVja05vU3BhY2VMZWZ0KCkgeworICAgIGlmIChzcGFjZUxlZnQoKSAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAiRGlkIG5vdCB3cml0ZSBhcyBtdWNoIGRhdGEgYXMgZXhwZWN0ZWQuIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIElmIHlvdSBjcmVhdGUgYSBDb2RlZE91dHB1dFN0cmVhbSBhcm91bmQgYSBzaW1wbGUgZmxhdCBhcnJheSwgeW91IG11c3QKKyAgICogbm90IGF0dGVtcHQgdG8gd3JpdGUgbW9yZSBieXRlcyB0aGFuIHRoZSBhcnJheSBoYXMgc3BhY2UuICBPdGhlcndpc2UsCisgICAqIHRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBPdXRPZlNwYWNlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02OTQ3NDg2ODg2OTk3ODg5NDk5TDsKKworICAgIE91dE9mU3BhY2VFeGNlcHRpb24oKSB7CisgICAgICBzdXBlcigiQ29kZWRPdXRwdXRTdHJlYW0gd2FzIHdyaXRpbmcgdG8gYSBmbGF0IGJ5dGUgYXJyYXkgYW5kIHJhbiAiICsKKyAgICAgICAgICAgICJvdXQgb2Ygc3BhY2UuIik7CisgICAgfQorICB9CisKKyAgLyoqIFdyaXRlIGEgc2luZ2xlIGJ5dGUuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZShmaW5hbCBieXRlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChwb3NpdGlvbiA9PSBsaW1pdCkgeworICAgICAgcmVmcmVzaEJ1ZmZlcigpOworICAgIH0KKworICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IHZhbHVlOworICB9CisKKyAgLyoqIFdyaXRlIGEgc2luZ2xlIGJ5dGUsIHJlcHJlc2VudGVkIGJ5IGFuIGludGVnZXIgdmFsdWUuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZShmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdCeXRlKChieXRlKSB2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSBieXRlIHN0cmluZy4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlcyhmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3Qnl0ZXModmFsdWUsIDAsIHZhbHVlLnNpemUoKSk7CisgIH0KKworICAvKiogV3JpdGUgYW4gYXJyYXkgb2YgYnl0ZXMuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZXMoZmluYWwgYnl0ZVtdIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3Qnl0ZXModmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7CisgIH0KKworICAvKiogV3JpdGUgcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcy4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlcyhmaW5hbCBieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAobGltaXQgLSBwb3NpdGlvbiA+PSBsZW5ndGgpIHsKKyAgICAgIC8vIFdlIGhhdmUgcm9vbSBpbiB0aGUgY3VycmVudCBidWZmZXIuCisgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgcG9zaXRpb24sIGxlbmd0aCk7CisgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdyaXRlIGV4dGVuZHMgcGFzdCBjdXJyZW50IGJ1ZmZlci4gIEZpbGwgdGhlIHJlc3Qgb2YgdGhpcyBidWZmZXIgYW5kCisgICAgICAvLyBmbHVzaC4KKyAgICAgIGZpbmFsIGludCBieXRlc1dyaXR0ZW4gPSBsaW1pdCAtIHBvc2l0aW9uOworICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZSwgb2Zmc2V0LCBidWZmZXIsIHBvc2l0aW9uLCBieXRlc1dyaXR0ZW4pOworICAgICAgb2Zmc2V0ICs9IGJ5dGVzV3JpdHRlbjsKKyAgICAgIGxlbmd0aCAtPSBieXRlc1dyaXR0ZW47CisgICAgICBwb3NpdGlvbiA9IGxpbWl0OworICAgICAgcmVmcmVzaEJ1ZmZlcigpOworCisgICAgICAvLyBOb3cgZGVhbCB3aXRoIHRoZSByZXN0LgorICAgICAgLy8gU2luY2Ugd2UgaGF2ZSBhbiBvdXRwdXQgc3RyZWFtLCB0aGlzIGlzIG91ciBidWZmZXIKKyAgICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDAKKyAgICAgIGlmIChsZW5ndGggPD0gbGltaXQpIHsKKyAgICAgICAgLy8gRml0cyBpbiBuZXcgYnVmZmVyLgorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgMCwgbGVuZ3RoKTsKKyAgICAgICAgcG9zaXRpb24gPSBsZW5ndGg7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXcml0ZSBpcyB2ZXJ5IGJpZy4gIExldCdzIGRvIGl0IGFsbCBhdCBvbmNlLgorICAgICAgICBvdXRwdXQud3JpdGUodmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiogV3JpdGUgcGFydCBvZiBhIGJ5dGUgc3RyaW5nLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAobGltaXQgLSBwb3NpdGlvbiA+PSBsZW5ndGgpIHsKKyAgICAgIC8vIFdlIGhhdmUgcm9vbSBpbiB0aGUgY3VycmVudCBidWZmZXIuCisgICAgICB2YWx1ZS5jb3B5VG8oYnVmZmVyLCBvZmZzZXQsIHBvc2l0aW9uLCBsZW5ndGgpOworICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXcml0ZSBleHRlbmRzIHBhc3QgY3VycmVudCBidWZmZXIuICBGaWxsIHRoZSByZXN0IG9mIHRoaXMgYnVmZmVyIGFuZAorICAgICAgLy8gZmx1c2guCisgICAgICBmaW5hbCBpbnQgYnl0ZXNXcml0dGVuID0gbGltaXQgLSBwb3NpdGlvbjsKKyAgICAgIHZhbHVlLmNvcHlUbyhidWZmZXIsIG9mZnNldCwgcG9zaXRpb24sIGJ5dGVzV3JpdHRlbik7CisgICAgICBvZmZzZXQgKz0gYnl0ZXNXcml0dGVuOworICAgICAgbGVuZ3RoIC09IGJ5dGVzV3JpdHRlbjsKKyAgICAgIHBvc2l0aW9uID0gbGltaXQ7CisgICAgICByZWZyZXNoQnVmZmVyKCk7CisKKyAgICAgIC8vIE5vdyBkZWFsIHdpdGggdGhlIHJlc3QuCisgICAgICAvLyBTaW5jZSB3ZSBoYXZlIGFuIG91dHB1dCBzdHJlYW0sIHRoaXMgaXMgb3VyIGJ1ZmZlcgorICAgICAgLy8gYW5kIGJ1ZmZlciBvZmZzZXQgPT0gMAorICAgICAgaWYgKGxlbmd0aCA8PSBsaW1pdCkgeworICAgICAgICAvLyBGaXRzIGluIG5ldyBidWZmZXIuCisgICAgICAgIHZhbHVlLmNvcHlUbyhidWZmZXIsIG9mZnNldCwgMCwgbGVuZ3RoKTsKKyAgICAgICAgcG9zaXRpb24gPSBsZW5ndGg7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXcml0ZSBpcyB2ZXJ5IGJpZywgYnV0IHdlIGNhbid0IGRvIGl0IGFsbCBhdCBvbmNlIHdpdGhvdXQgYWxsb2NhdGluZworICAgICAgICAvLyBhbiBhIGNvcHkgb2YgdGhlIGJ5dGUgYXJyYXkgc2luY2UgQnl0ZVN0cmluZyBkb2VzIG5vdCBnaXZlIHVzIGFjY2VzcworICAgICAgICAvLyB0byB0aGUgdW5kZXJseWluZyBieXRlcy4gVXNlIHRoZSBJbnB1dFN0cmVhbSBpbnRlcmZhY2Ugb24gdGhlCisgICAgICAgIC8vIEJ5dGVTdHJpbmcgYW5kIG91ciBidWZmZXIgdG8gY29weSBiZXR3ZWVuIHRoZSB0d28uCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtRnJvbSA9IHZhbHVlLm5ld0lucHV0KCk7CisgICAgICAgIGlmIChvZmZzZXQgIT0gaW5wdXRTdHJlYW1Gcm9tLnNraXAob2Zmc2V0KSkgeworICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNraXAgZmFpbGVkPyBTaG91bGQgbmV2ZXIgaGFwcGVuLiIpOworICAgICAgICB9CisgICAgICAgIC8vIFVzZSB0aGUgYnVmZmVyIGFzIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGF2b2lkIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICAgICAgIGludCBieXRlc1RvUmVhZCA9IE1hdGgubWluKGxlbmd0aCwgbGltaXQpOworICAgICAgICAgIGludCBieXRlc1JlYWQgPSBpbnB1dFN0cmVhbUZyb20ucmVhZChidWZmZXIsIDAsIGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IGJ5dGVzVG9SZWFkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZWFkIGZhaWxlZD8gU2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgIGxlbmd0aCAtPSBieXRlc1JlYWQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiogRW5jb2RlIGFuZCB3cml0ZSBhIHRhZy4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVUYWcoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgd2lyZVR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQzMihXaXJlRm9ybWF0Lm1ha2VUYWcoZmllbGROdW1iZXIsIHdpcmVUeXBlKSk7CisgIH0KKworICAvKiogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhIHRhZy4gKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVRhZ1NpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyKSB7CisgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCAwKSk7CisgIH0KKworICAvKioKKyAgICogRW5jb2RlIGFuZCB3cml0ZSBhIHZhcmludC4gIHtAY29kZSB2YWx1ZX0gaXMgdHJlYXRlZCBhcworICAgKiB1bnNpZ25lZCwgc28gaXQgd29uJ3QgYmUgc2lnbi1leHRlbmRlZCBpZiBuZWdhdGl2ZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3VmFyaW50MzIoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKHZhbHVlICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgd3JpdGVSYXdCeXRlKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVSYXdCeXRlKCh2YWx1ZSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgIHZhbHVlID4+Pj0gNzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhIHZhcmludC4KKyAgICoge0Bjb2RlIHZhbHVlfSBpcyB0cmVhdGVkIGFzIHVuc2lnbmVkLCBzbyBpdCB3b24ndCBiZSBzaWduLWV4dGVuZGVkIGlmCisgICAqIG5lZ2F0aXZlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmYgPDwgIDcpKSA9PSAwKSByZXR1cm4gMTsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmYgPDwgMTQpKSA9PSAwKSByZXR1cm4gMjsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmYgPDwgMjEpKSA9PSAwKSByZXR1cm4gMzsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmYgPDwgMjgpKSA9PSAwKSByZXR1cm4gNDsKKyAgICByZXR1cm4gNTsKKyAgfQorCisgIC8qKiBFbmNvZGUgYW5kIHdyaXRlIGEgdmFyaW50LiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd1ZhcmludDY0KGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICgodmFsdWUgJiB+MHg3RkwpID09IDApIHsKKyAgICAgICAgd3JpdGVSYXdCeXRlKChpbnQpdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICB3cml0ZVJhd0J5dGUoKChpbnQpdmFsdWUgJiAweDdGKSB8IDB4ODApOworICAgICAgICB2YWx1ZSA+Pj49IDc7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB2YXJpbnQuICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUoZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAgNykpID09IDApIHJldHVybiAxOworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAxNCkpID09IDApIHJldHVybiAyOworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAyMSkpID09IDApIHJldHVybiAzOworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAyOCkpID09IDApIHJldHVybiA0OworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAzNSkpID09IDApIHJldHVybiA1OworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA0MikpID09IDApIHJldHVybiA2OworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA0OSkpID09IDApIHJldHVybiA3OworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA1NikpID09IDApIHJldHVybiA4OworICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA2MykpID09IDApIHJldHVybiA5OworICAgIHJldHVybiAxMDsKKyAgfQorCisgIC8qKiBXcml0ZSBhIGxpdHRsZS1lbmRpYW4gMzItYml0IGludGVnZXIuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3Qnl0ZSgodmFsdWUgICAgICApICYgMHhGRik7CisgICAgd3JpdGVSYXdCeXRlKCh2YWx1ZSA+PiAgOCkgJiAweEZGKTsKKyAgICB3cml0ZVJhd0J5dGUoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIHdyaXRlUmF3Qnl0ZSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRUTEVfRU5ESUFOXzMyX1NJWkUgPSA0OworCisgIC8qKiBXcml0ZSBhIGxpdHRsZS1lbmRpYW4gNjQtYml0IGludGVnZXIuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgICAgICApICYgMHhGRik7CisgICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlID4+ICA4KSAmIDB4RkYpOworICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlID4+IDMyKSAmIDB4RkYpOworICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKyAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgPj4gNDgpICYgMHhGRik7CisgICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlID4+IDU2KSAmIDB4RkYpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElUVExFX0VORElBTl82NF9TSVpFID0gODsKKworICAvKioKKyAgICogRW5jb2RlIGEgWmlnWmFnLWVuY29kZWQgMzItYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCisgICAqIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLAorICAgKiBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsCisgICAqIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCisgICAqCisgICAqIEBwYXJhbSBuIEEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgorICAgKiBAcmV0dXJuIEFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCBzdG9yZWQgaW4gYSBzaWduZWQgaW50IGJlY2F1c2UKKyAgICogICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgZW5jb2RlWmlnWmFnMzIoZmluYWwgaW50IG4pIHsKKyAgICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYworICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgfQorCisgIC8qKgorICAgKiBFbmNvZGUgYSBaaWdaYWctZW5jb2RlZCA2NC1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKKyAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCisgICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKKyAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKKyAgICoKKyAgICogQHBhcmFtIG4gQSBzaWduZWQgNjQtYml0IGludGVnZXIuCisgICAqIEByZXR1cm4gQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQorICAgKiAgICAgICAgIEphdmEgaGFzIG5vIGV4cGxpY2l0IHVuc2lnbmVkIHN1cHBvcnQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGxvbmcgZW5jb2RlWmlnWmFnNjQoZmluYWwgbG9uZyBuKSB7CisgICAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiA2Myk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkxMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9ycy5qYXZhCkBAIC0wLDAgKzEsMTk3MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisvKioKKyAqIENvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBjbGFzc2VzIHdoaWNoIGRlc2NyaWJlIHByb3RvY29sIG1lc3NhZ2UgdHlwZXMuCisgKgorICogRXZlcnkgbWVzc2FnZSB0eXBlIGhhcyBhIHtAbGluayBEZXNjcmlwdG9yfSwgd2hpY2ggbGlzdHMgYWxsCisgKiBpdHMgZmllbGRzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCBhIHR5cGUuICBZb3UgY2FuIGdldCBhIG1lc3NhZ2UKKyAqIHR5cGUncyBkZXNjcmlwdG9yIGJ5IGNhbGxpbmcge0Bjb2RlIE1lc3NhZ2VUeXBlLmdldERlc2NyaXB0b3IoKX0sIG9yCisgKiAoZ2l2ZW4gYSBtZXNzYWdlIG9iamVjdCBvZiB0aGUgdHlwZSkge0Bjb2RlIG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCisgKiBGdXJ0aGVybW9yZSwgZWFjaCBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gZm9yCisgKiBhIHJlbGV2YW50IHtAY29kZSAucHJvdG99IGZpbGUuIFlvdSBjYW4gb2J0YWluIGl0IGJ5IGNhbGxpbmcKKyAqIHtAY29kZSBEZXNjcmlwdG9yLmdldEZpbGUoKX0uIEEge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBjb250YWlucyBkZXNjcmlwdG9ycworICogZm9yIGFsbCB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbiB0aGF0IGZpbGUsIGFuZCBmaWxlIGRlc2NyaXB0b3JzIGZvciBhbGwgdGhlCisgKiBpbXBvcnRlZCB7QGNvZGUgLnByb3RvfSBmaWxlcy4KKyAqCisgKiBEZXNjcmlwdG9ycyBhcmUgYnVpbHQgZnJvbSBEZXNjcmlwdG9yUHJvdG9zLCBhcyBkZWZpbmVkIGluCisgKiB7QGNvZGUgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG99LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9ycyB7CisgIC8qKgorICAgKiBEZXNjcmliZXMgYSB7QGNvZGUgLnByb3RvfSBmaWxlLCBpbmNsdWRpbmcgZXZlcnl0aGluZyBkZWZpbmVkIHdpdGhpbi4KKyAgICogVGhhdCBpbmNsdWRlcywgaW4gcGFydGljdWxhciwgZGVzY3JpcHRvcnMgZm9yIGFsbCB0aGUgbWVzc2FnZXMgYW5kCisgICAqIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGFsbCBvdGhlciBpbXBvcnRlZCB7QGNvZGUgLnByb3RvfSBmaWxlcworICAgKiAoZGVwZW5kZW5jaWVzKS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZURlc2NyaXB0b3IgeworICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLworICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQorCisgICAgLyoqIEdldCB0aGUgZmlsZSBuYW1lLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm90byBwYWNrYWdlIG5hbWUuICBUaGlzIGlzIHRoZSBwYWNrYWdlIG5hbWUgZ2l2ZW4gYnkgdGhlCisgICAgICoge0Bjb2RlIHBhY2thZ2V9IHN0YXRlbWVudCBpbiB0aGUge0Bjb2RlIC5wcm90b30gZmlsZSwgd2hpY2ggZGlmZmVycworICAgICAqIGZyb20gdGhlIEphdmEgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKSB7IHJldHVybiBwcm90by5nZXRQYWNrYWdlKCk7IH0KKworICAgIC8qKiBHZXQgdGhlIHtAY29kZSBGaWxlT3B0aW9uc30sIGRlZmluZWQgaW4ge0Bjb2RlIGRlc2NyaXB0b3IucHJvdG99LiAqLworICAgIHB1YmxpYyBGaWxlT3B0aW9ucyBnZXRPcHRpb25zKCkgeyByZXR1cm4gcHJvdG8uZ2V0T3B0aW9ucygpOyB9CisKKyAgICAvKiogR2V0IGEgbGlzdCBvZiB0b3AtbGV2ZWwgbWVzc2FnZSB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUuICovCisgICAgcHVibGljIExpc3Q8RGVzY3JpcHRvcj4gZ2V0TWVzc2FnZVR5cGVzKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChtZXNzYWdlVHlwZXMpKTsKKyAgICB9CisKKyAgICAvKiogR2V0IGEgbGlzdCBvZiB0b3AtbGV2ZWwgZW51bSB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUuICovCisgICAgcHVibGljIExpc3Q8RW51bURlc2NyaXB0b3I+IGdldEVudW1UeXBlcygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoZW51bVR5cGVzKSk7CisgICAgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgdG9wLWxldmVsIHNlcnZpY2VzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gKi8KKyAgICBwdWJsaWMgTGlzdDxTZXJ2aWNlRGVzY3JpcHRvcj4gZ2V0U2VydmljZXMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KHNlcnZpY2VzKSk7CisgICAgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgdG9wLWxldmVsIGV4dGVuc2lvbnMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLiAqLworICAgIHB1YmxpYyBMaXN0PEZpZWxkRGVzY3JpcHRvcj4gZ2V0RXh0ZW5zaW9ucygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9ucykpOworICAgIH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRoaXMgZmlsZSdzIGRlcGVuZGVuY2llcyAoaW1wb3J0cykuICovCisgICAgcHVibGljIExpc3Q8RmlsZURlc2NyaXB0b3I+IGdldERlcGVuZGVuY2llcygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoZGVwZW5kZW5jaWVzKSk7CisgICAgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgdGhpcyBmaWxlJ3MgcHVibGljIGRlcGVuZGVuY2llcyAocHVibGljIGltcG9ydHMpLiAqLworICAgIHB1YmxpYyBMaXN0PEZpbGVEZXNjcmlwdG9yPiBnZXRQdWJsaWNEZXBlbmRlbmNpZXMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KHB1YmxpY0RlcGVuZGVuY2llcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYSBtZXNzYWdlIHR5cGUgaW4gdGhlIGZpbGUgYnkgbmFtZS4gIERvZXMgbm90IGZpbmQgbmVzdGVkIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIHR5cGUgbmFtZSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHR5cGUncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBEZXNjcmlwdG9yIGZpbmRNZXNzYWdlVHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9va2luZyB1cCBuZXN0ZWQgdHlwZXMuICBUaGlzIHdpbGwgbWFrZSBvcHRpbWl6YXRpb24KKyAgICAgIC8vIGVhc2llciBsYXRlci4KKyAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGlmIChnZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIG5hbWUgPSBnZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOworICAgICAgfQorICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gcG9vbC5maW5kU3ltYm9sKG5hbWUpOworICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IgJiYKKyAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIChEZXNjcmlwdG9yKXJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYW4gZW51bSB0eXBlIGluIHRoZSBmaWxlIGJ5IG5hbWUuICBEb2VzIG5vdCBmaW5kIG5lc3RlZCB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCB0eXBlIG5hbWUgdG8gbG9vayBmb3IuCisgICAgICogQHJldHVybiBUaGUgZW51bSB0eXBlJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bURlc2NyaXB0b3IgZmluZEVudW1UeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAvLyBEb24ndCBhbGxvdyBsb29raW5nIHVwIG5lc3RlZCB0eXBlcy4gIFRoaXMgd2lsbCBtYWtlIG9wdGltaXphdGlvbgorICAgICAgLy8gZWFzaWVyIGxhdGVyLgorICAgICAgaWYgKG5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgaWYgKGdldFBhY2thZ2UoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgbmFtZSA9IGdldFBhY2thZ2UoKSArICcuJyArIG5hbWU7CisgICAgICB9CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPSBwb29sLmZpbmRTeW1ib2wobmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IgJiYKKyAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIChFbnVtRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgc2VydmljZSB0eXBlIGluIHRoZSBmaWxlIGJ5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgdHlwZSBuYW1lIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4gVGhlIHNlcnZpY2UgdHlwZSdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yIGZpbmRTZXJ2aWNlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAvLyBEb24ndCBhbGxvdyBsb29raW5nIHVwIG5lc3RlZCB0eXBlcy4gIFRoaXMgd2lsbCBtYWtlIG9wdGltaXphdGlvbgorICAgICAgLy8gZWFzaWVyIGxhdGVyLgorICAgICAgaWYgKG5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgaWYgKGdldFBhY2thZ2UoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgbmFtZSA9IGdldFBhY2thZ2UoKSArICcuJyArIG5hbWU7CisgICAgICB9CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPSBwb29sLmZpbmRTeW1ib2wobmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgU2VydmljZURlc2NyaXB0b3IgJiYKKyAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIChTZXJ2aWNlRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuIGV4dGVuc2lvbiBpbiB0aGUgZmlsZSBieSBuYW1lLiAgRG9lcyBub3QgZmluZCBleHRlbnNpb25zIG5lc3RlZAorICAgICAqIGluc2lkZSBtZXNzYWdlIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIGV4dGVuc2lvbiBuYW1lIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbidzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBmaW5kRXh0ZW5zaW9uQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICBpZiAobmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBpZiAoZ2V0UGFja2FnZSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICBuYW1lID0gZ2V0UGFja2FnZSgpICsgJy4nICsgbmFtZTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9IHBvb2wuZmluZFN5bWJvbChuYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBGaWVsZERlc2NyaXB0b3IgJiYKKyAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZERlc2NyaXB0b3IpcmVzdWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEge0Bjb2RlIEZpbGVEZXNjcmlwdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90byBUaGUgcHJvdG9jb2wgbWVzc2FnZSBmb3JtIG9mIHRoZSBGaWxlRGVzY3JpcHRvci4KKyAgICAgKiBAcGFyYW0gZGVwZW5kZW5jaWVzIHtAY29kZSBGaWxlRGVzY3JpcHRvcn1zIGNvcnJlc3BvbmRpbmcgdG8gYWxsIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSdzIGRlcGVuZGVuY2llcywgaW4gdGhlIGV4YWN0IG9yZGVyIGxpc3RlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgaW4ge0Bjb2RlIHByb3RvfS4KKyAgICAgKiBAdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHtAY29kZSBwcm90b30gaXMgbm90IGEgdmFsaWQKKyAgICAgKiAgICAgICAgICAgZGVzY3JpcHRvci4gIFRoaXMgY2FuIG9jY3VyIGZvciBhIG51bWJlciBvZiByZWFzb25zLCBlLmcuCisgICAgICogICAgICAgICAgIGJlY2F1c2UgYSBmaWVsZCBoYXMgYW4gdW5kZWZpbmVkIHR5cGUgb3IgYmVjYXVzZSB0d28gbWVzc2FnZXMKKyAgICAgKiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yIGJ1aWxkRnJvbShmaW5hbCBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIC8vIEJ1aWxkaW5nIGRlc2NyaXB0b3JzIGludm9sdmVzIHR3byBzdGVwczogIHRyYW5zbGF0aW5nIGFuZCBsaW5raW5nLgorICAgICAgLy8gSW4gdGhlIHRyYW5zbGF0aW9uIHN0ZXAgKGltcGxlbWVudGVkIGJ5IEZpbGVEZXNjcmlwdG9yJ3MKKyAgICAgIC8vIGNvbnN0cnVjdG9yKSwgd2UgYnVpbGQgYW4gb2JqZWN0IHRyZWUgbWlycm9yaW5nIHRoZQorICAgICAgLy8gRmlsZURlc2NyaXB0b3JQcm90bydzIHRyZWUgYW5kIHB1dCBhbGwgb2YgdGhlIGRlc2NyaXB0b3JzIGludG8gdGhlCisgICAgICAvLyBEZXNjcmlwdG9yUG9vbCdzIGxvb2t1cCB0YWJsZXMuICBJbiB0aGUgbGlua2luZyBzdGVwLCB3ZSBsb29rIHVwIGFsbAorICAgICAgLy8gdHlwZSByZWZlcmVuY2VzIGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgc28gdGhhdCwgZm9yIGV4YW1wbGUsIGEKKyAgICAgIC8vIEZpZWxkRGVzY3JpcHRvciBmb3IgYW4gZW1iZWRkZWQgbWVzc2FnZSBjb250YWlucyBhIHBvaW50ZXIgZGlyZWN0bHkKKyAgICAgIC8vIHRvIHRoZSBEZXNjcmlwdG9yIGZvciB0aGF0IG1lc3NhZ2UncyB0eXBlLiAgV2UgYWxzbyBkZXRlY3QgdW5kZWZpbmVkCisgICAgICAvLyB0eXBlcyBpbiB0aGUgbGlua2luZyBzdGVwLgorICAgICAgZmluYWwgRGVzY3JpcHRvclBvb2wgcG9vbCA9IG5ldyBEZXNjcmlwdG9yUG9vbChkZXBlbmRlbmNpZXMpOworICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgcmVzdWx0ID0KKyAgICAgICAgICBuZXcgRmlsZURlc2NyaXB0b3IocHJvdG8sIGRlcGVuZGVuY2llcywgcG9vbCk7CisKKyAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoICE9IHByb3RvLmdldERlcGVuZGVuY3lDb3VudCgpKSB7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihyZXN1bHQsCisgICAgICAgICAgIkRlcGVuZGVuY2llcyBwYXNzZWQgdG8gRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKCkgZG9uJ3QgbWF0Y2ggIiArCisgICAgICAgICAgInRob3NlIGxpc3RlZCBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4iKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RGVwZW5kZW5jeUNvdW50KCk7IGkrKykgeworICAgICAgICBpZiAoIWRlcGVuZGVuY2llc1tpXS5nZXROYW1lKCkuZXF1YWxzKHByb3RvLmdldERlcGVuZGVuY3koaSkpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHJlc3VsdCwKKyAgICAgICAgICAgICJEZXBlbmRlbmNpZXMgcGFzc2VkIHRvIEZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgpIGRvbid0IG1hdGNoICIgKworICAgICAgICAgICAgInRob3NlIGxpc3RlZCBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHQuY3Jvc3NMaW5rKCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAgSXQgaXMgZXF1aXZhbGVudAorICAgICAqIHRvIHtAY29kZSBidWlsZEZyb219IGV4Y2VwdCB0aGF0IHRoZSB7QGNvZGUgRmlsZURlc2NyaXB0b3JQcm90b30gaXMKKyAgICAgKiBlbmNvZGVkIGluIHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBkZXNjcmlwdG9yRGF0YVBhcnRzLAorICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvcltdIGRlcGVuZGVuY2llcywKKyAgICAgICAgZmluYWwgSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgZGVzY3JpcHRvckFzc2lnbmVyKSB7CisgICAgICAvLyBIYWNrOiAgV2UgY2FuJ3QgZW1iZWQgYSByYXcgYnl0ZSBhcnJheSBpbnNpZGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICAgICAgLy8gICAoYXQgbGVhc3QsIG5vdCBlZmZpY2llbnRseSksIGJ1dCB3ZSBjYW4gZW1iZWQgU3RyaW5ncy4gIFNvLCB0aGUKKyAgICAgIC8vICAgcHJvdG9jb2wgY29tcGlsZXIgZW1iZWRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIGFzIGEgZ2lhbnQKKyAgICAgIC8vICAgc3RyaW5nIGxpdGVyYWwgd2hpY2ggaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdG8gY29uc3RydWN0IHRoZQorICAgICAgLy8gICBmaWxlJ3MgRmlsZURlc2NyaXB0b3IuICBUaGUgc3RyaW5nIGxpdGVyYWwgY29udGFpbnMgb25seSA4LWJpdAorICAgICAgLy8gICBjaGFyYWN0ZXJzLCBlYWNoIG9uZSByZXByZXNlbnRpbmcgYSBieXRlIG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvJ3MKKyAgICAgIC8vICAgc2VyaWFsaXplZCBmb3JtLiAgU28sIGlmIHdlIGNvbnZlcnQgaXQgdG8gYnl0ZXMgaW4gSVNPLTg4NTktMSwgd2UKKyAgICAgIC8vICAgc2hvdWxkIGdldCB0aGUgb3JpZ2luYWwgYnl0ZXMgdGhhdCB3ZSB3YW50LgorCisgICAgICAvLyBkZXNjcmlwdG9yRGF0YSBtYXkgY29udGFpbiBtdWx0aXBsZSBzdHJpbmdzIGluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhlCisgICAgICAvLyBKYXZhIDY0ayBzdHJpbmcgbGl0ZXJhbCBsaW1pdC4KKyAgICAgIFN0cmluZ0J1aWxkZXIgZGVzY3JpcHRvckRhdGEgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChTdHJpbmcgcGFydCA6IGRlc2NyaXB0b3JEYXRhUGFydHMpIHsKKyAgICAgICAgZGVzY3JpcHRvckRhdGEuYXBwZW5kKHBhcnQpOworICAgICAgfQorCisgICAgICBmaW5hbCBieXRlW10gZGVzY3JpcHRvckJ5dGVzOworICAgICAgdHJ5IHsKKyAgICAgICAgZGVzY3JpcHRvckJ5dGVzID0gZGVzY3JpcHRvckRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJTdGFuZGFyZCBlbmNvZGluZyBJU08tODg1OS0xIG5vdCBzdXBwb3J0ZWQgYnkgSlZNLiIsIGUpOworICAgICAgfQorCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOworICAgICAgdHJ5IHsKKyAgICAgICAgcHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLnBhcnNlRnJvbShkZXNjcmlwdG9yQnl0ZXMpOworICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHByb3RvY29sIGJ1ZmZlciBkZXNjcmlwdG9yIGZvciBnZW5lcmF0ZWQgY29kZS4iLCBlKTsKKyAgICAgIH0KKworICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgcmVzdWx0OworICAgICAgdHJ5IHsKKyAgICAgICAgcmVzdWx0ID0gYnVpbGRGcm9tKHByb3RvLCBkZXBlbmRlbmNpZXMpOworICAgICAgfSBjYXRjaCAoRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJJbnZhbGlkIGVtYmVkZGVkIGRlc2NyaXB0b3IgZm9yIFwiIiArIHByb3RvLmdldE5hbWUoKSArICJcIi4iLCBlKTsKKyAgICAgIH0KKworICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPQorICAgICAgICAgIGRlc2NyaXB0b3JBc3NpZ25lci5hc3NpZ25EZXNjcmlwdG9ycyhyZXN1bHQpOworCisgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkgeworICAgICAgICAvLyBXZSBtdXN0IHJlLXBhcnNlIHRoZSBwcm90byB1c2luZyB0aGUgcmVnaXN0cnkuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgcHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLnBhcnNlRnJvbShkZXNjcmlwdG9yQnl0ZXMsIHJlZ2lzdHJ5KTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgIkZhaWxlZCB0byBwYXJzZSBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvciBmb3IgZ2VuZXJhdGVkIGNvZGUuIiwKKyAgICAgICAgICAgIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0LnNldFByb3RvKHByb3RvKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICBXaGVuIGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgRmlsZURlc2NyaXB0b3IjaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tfSwgdGhlIGNhbGxlcgorICAgICAqIHByb3ZpZGVzIGEgY2FsbGJhY2sgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlLiAgVGhlIGNhbGxiYWNrIGlzIGNhbGxlZAorICAgICAqIGFmdGVyIHRoZSBGaWxlRGVzY3JpcHRvciBoYXMgYmVlbiBjb25zdHJ1Y3RlZCwgaW4gb3JkZXIgdG8gYXNzaWduIGFsbAorICAgICAqIHRoZSBnbG9iYWwgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIHBvaW50IGF0IHBhcnRzCisgICAgICogb2YgdGhlIEZpbGVEZXNjcmlwdG9yLiAgVGhlIGNhbGxiYWNrIHJldHVybnMgYW4gRXh0ZW5zaW9uUmVnaXN0cnkgd2hpY2gKKyAgICAgKiBjb250YWlucyBhbnkgZXh0ZW5zaW9ucyB3aGljaCBtaWdodCBiZSB1c2VkIGluIHRoZSBkZXNjcmlwdG9yIC0tIHRoYXQKKyAgICAgKiBpcywgZXh0ZW5zaW9ucyBvZiB0aGUgdmFyaW91cyAiT3B0aW9ucyIgbWVzc2FnZXMgZGVmaW5lZCBpbgorICAgICAqIGRlc2NyaXB0b3IucHJvdG8uICBUaGUgY2FsbGJhY2sgbWF5IGFsc28gcmV0dXJuIG51bGwgdG8gaW5kaWNhdGUgdGhhdAorICAgICAqIG5vIGV4dGVuc2lvbnMgYXJlIHVzZWQgaW4gdGhlIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciB7CisgICAgICBFeHRlbnNpb25SZWdpc3RyeSBhc3NpZ25EZXNjcmlwdG9ycyhGaWxlRGVzY3JpcHRvciByb290KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yW10gbWVzc2FnZVR5cGVzOworICAgIHByaXZhdGUgZmluYWwgRW51bURlc2NyaXB0b3JbXSBlbnVtVHlwZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvcltdIHNlcnZpY2VzOworICAgIHByaXZhdGUgZmluYWwgRmllbGREZXNjcmlwdG9yW10gZXh0ZW5zaW9uczsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzOworICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3JbXSBwdWJsaWNEZXBlbmRlbmNpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yUG9vbCBwb29sOworCisgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvcihmaW5hbCBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yUG9vbCBwb29sKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgdGhpcy5wb29sID0gcG9vbDsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmNsb25lKCk7CisgICAgICB0aGlzLnB1YmxpY0RlcGVuZGVuY2llcyA9CisgICAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yW3Byb3RvLmdldFB1YmxpY0RlcGVuZGVuY3lDb3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0UHVibGljRGVwZW5kZW5jeUNvdW50KCk7IGkrKykgeworICAgICAgICBpbnQgaW5kZXggPSBwcm90by5nZXRQdWJsaWNEZXBlbmRlbmN5KGkpOworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGVwZW5kZW5jaWVzLmxlbmd0aCkgeworICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgICAiSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnB1YmxpY0RlcGVuZGVuY2llc1tpXSA9CisgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc1twcm90by5nZXRQdWJsaWNEZXBlbmRlbmN5KGkpXTsKKyAgICAgIH0KKworICAgICAgcG9vbC5hZGRQYWNrYWdlKGdldFBhY2thZ2UoKSwgdGhpcyk7CisKKyAgICAgIG1lc3NhZ2VUeXBlcyA9IG5ldyBEZXNjcmlwdG9yW3Byb3RvLmdldE1lc3NhZ2VUeXBlQ291bnQoKV07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldE1lc3NhZ2VUeXBlQ291bnQoKTsgaSsrKSB7CisgICAgICAgIG1lc3NhZ2VUeXBlc1tpXSA9CisgICAgICAgICAgbmV3IERlc2NyaXB0b3IocHJvdG8uZ2V0TWVzc2FnZVR5cGUoaSksIHRoaXMsIG51bGwsIGkpOworICAgICAgfQorCisgICAgICBlbnVtVHlwZXMgPSBuZXcgRW51bURlc2NyaXB0b3JbcHJvdG8uZ2V0RW51bVR5cGVDb3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RW51bVR5cGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgZW51bVR5cGVzW2ldID0gbmV3IEVudW1EZXNjcmlwdG9yKHByb3RvLmdldEVudW1UeXBlKGkpLCB0aGlzLCBudWxsLCBpKTsKKyAgICAgIH0KKworICAgICAgc2VydmljZXMgPSBuZXcgU2VydmljZURlc2NyaXB0b3JbcHJvdG8uZ2V0U2VydmljZUNvdW50KCldOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRTZXJ2aWNlQ291bnQoKTsgaSsrKSB7CisgICAgICAgIHNlcnZpY2VzW2ldID0gbmV3IFNlcnZpY2VEZXNjcmlwdG9yKHByb3RvLmdldFNlcnZpY2UoaSksIHRoaXMsIGkpOworICAgICAgfQorCisgICAgICBleHRlbnNpb25zID0gbmV3IEZpZWxkRGVzY3JpcHRvcltwcm90by5nZXRFeHRlbnNpb25Db3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RXh0ZW5zaW9uQ291bnQoKTsgaSsrKSB7CisgICAgICAgIGV4dGVuc2lvbnNbaV0gPSBuZXcgRmllbGREZXNjcmlwdG9yKAorICAgICAgICAgIHByb3RvLmdldEV4dGVuc2lvbihpKSwgdGhpcywgbnVsbCwgaSwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqIExvb2sgdXAgYW5kIGNyb3NzLWxpbmsgYWxsIGZpZWxkIHR5cGVzLCBldGMuICovCisgICAgcHJpdmF0ZSB2b2lkIGNyb3NzTGluaygpIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBmb3IgKGZpbmFsIERlc2NyaXB0b3IgbWVzc2FnZVR5cGUgOiBtZXNzYWdlVHlwZXMpIHsKKyAgICAgICAgbWVzc2FnZVR5cGUuY3Jvc3NMaW5rKCk7CisgICAgICB9CisKKyAgICAgIGZvciAoZmluYWwgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA6IHNlcnZpY2VzKSB7CisgICAgICAgIHNlcnZpY2UuY3Jvc3NMaW5rKCk7CisgICAgICB9CisKKyAgICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgZXh0ZW5zaW9uLmNyb3NzTGluaygpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugb3VyIHtAbGluayBGaWxlRGVzY3JpcHRvclByb3RvfSB3aXRoIHRoZSBnaXZlbiBvbmUsIHdoaWNoIGlzCisgICAgICogaWRlbnRpY2FsIGV4Y2VwdCB0aGF0IGl0IG1pZ2h0IGNvbnRhaW4gZXh0ZW5zaW9ucyB0aGF0IHdlcmVuJ3QgcHJlc2VudAorICAgICAqIGluIHRoZSBvcmlnaW5hbC4gIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBmb3IgYm9vdHN0cmFwcGluZyB3aGVuIGEgZmlsZQorICAgICAqIGRlZmluZXMgY3VzdG9tIG9wdGlvbnMuICBUaGUgb3B0aW9ucyBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBpdHNlbGYsCisgICAgICogc28gd2UgY2FuJ3QgYWN0dWFsbHkgcGFyc2UgdGhlbSB1bnRpbCB3ZSd2ZSBjb25zdHJ1Y3RlZCB0aGUgZGVzY3JpcHRvcnMsCisgICAgICogYnV0IHRvIGNvbnN0cnVjdCB0aGUgZGVzY3JpcHRvcnMgd2UgaGF2ZSB0byBoYXZlIHBhcnNlZCB0aGUgZGVzY3JpcHRvcgorICAgICAqIHByb3Rvcy4gIFNvLCB3ZSBoYXZlIHRvIHBhcnNlIHRoZSBkZXNjcmlwdG9yIHByb3RvcyBhIHNlY29uZCB0aW1lIGFmdGVyCisgICAgICogY29uc3RydWN0aW5nIHRoZSBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bykgeworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICBtZXNzYWdlVHlwZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0TWVzc2FnZVR5cGUoaSkpOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1UeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICBlbnVtVHlwZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0RW51bVR5cGUoaSkpOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHNlcnZpY2VzW2ldLnNldFByb3RvKHByb3RvLmdldFNlcnZpY2UoaSkpOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZXh0ZW5zaW9uc1tpXS5zZXRQcm90byhwcm90by5nZXRFeHRlbnNpb24oaSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqIERlc2NyaWJlcyBhIG1lc3NhZ2UgdHlwZS4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9yIGltcGxlbWVudHMgR2VuZXJpY0Rlc2NyaXB0b3IgeworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LiAgSW4gb3RoZXIgd29yZHMsCisgICAgICogZ2l2ZW4gYSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IHtAY29kZSBmaWxlfSwgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgorICAgICAqIDxwcmU+CisgICAgICogICBmb3IgYWxsIGkgaW4gWzAsIGZpbGUuZ2V0TWVzc2FnZVR5cGVDb3VudCgpKToKKyAgICAgKiAgICAgZmlsZS5nZXRNZXNzYWdlVHlwZShpKS5nZXRJbmRleCgpID09IGkKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBTaW1pbGFybHksIGZvciBhIHtAbGluayBEZXNjcmlwdG9yfSB7QGNvZGUgbWVzc2FnZVR5cGV9OgorICAgICAqIDxwcmU+CisgICAgICogICBmb3IgYWxsIGkgaW4gWzAsIG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVDb3VudCgpKToKKyAgICAgKiAgICAgbWVzc2FnZVR5cGUuZ2V0TmVzdGVkVHlwZShpKS5nZXRJbmRleCgpID09IGkKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KKworICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLworICAgIHB1YmxpYyBEZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsgcmV0dXJuIHByb3RvOyB9CisKKyAgICAvKiogR2V0IHRoZSB0eXBlJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiBwcm90by5nZXROYW1lKCk7IH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCB3aXRoaW4gdGhlIHByb3RvIGxhbmd1YWdlJ3MKKyAgICAgKiBuYW1lc3BhY2UuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgSmF2YSBuYW1lLiAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoaXMKKyAgICAgKiB7QGNvZGUgLnByb3RvfToKKyAgICAgKiA8cHJlPgorICAgICAqICAgcGFja2FnZSBmb28uYmFyOworICAgICAqICAgb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZXhhbXBsZS5wcm90b3MiCisgICAgICogICBtZXNzYWdlIEJheiB7fQorICAgICAqIDwvcHJlPgorICAgICAqIHtAY29kZSBCYXp9J3MgZnVsbCBuYW1lIGlzICJmb28uYmFyLkJheiIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsgcmV0dXJuIGZ1bGxOYW1lOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLworICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgfQorCisgICAgLyoqIElmIHRoaXMgaXMgYSBuZXN0ZWQgdHlwZSwgZ2V0IHRoZSBvdXRlciBkZXNjcmlwdG9yLCBvdGhlcndpc2UgbnVsbC4gKi8KKyAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRDb250YWluaW5nVHlwZSgpIHsgcmV0dXJuIGNvbnRhaW5pbmdUeXBlOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGNvZGUgTWVzc2FnZU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KKyAgICBwdWJsaWMgTWVzc2FnZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBmaWVsZHMuICovCisgICAgcHVibGljIExpc3Q8RmllbGREZXNjcmlwdG9yPiBnZXRGaWVsZHMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGZpZWxkcykpOworICAgIH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRoaXMgbWVzc2FnZSB0eXBlJ3MgZXh0ZW5zaW9ucy4gKi8KKyAgICBwdWJsaWMgTGlzdDxGaWVsZERlc2NyaXB0b3I+IGdldEV4dGVuc2lvbnMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGV4dGVuc2lvbnMpKTsKKyAgICB9CisKKyAgICAvKiogR2V0IGEgbGlzdCBvZiBtZXNzYWdlIHR5cGVzIG5lc3RlZCB3aXRoaW4gdGhpcyBvbmUuICovCisgICAgcHVibGljIExpc3Q8RGVzY3JpcHRvcj4gZ2V0TmVzdGVkVHlwZXMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KG5lc3RlZFR5cGVzKSk7CisgICAgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgZW51bSB0eXBlcyBuZXN0ZWQgd2l0aGluIHRoaXMgb25lLiAqLworICAgIHB1YmxpYyBMaXN0PEVudW1EZXNjcmlwdG9yPiBnZXRFbnVtVHlwZXMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGVudW1UeXBlcykpOworICAgIH0KKworICAgIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIgaXMgYW4gZXh0ZW5zaW9uLiAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uTnVtYmVyKGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgIGZvciAoZmluYWwgRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIHJhbmdlIDoKKyAgICAgICAgICBwcm90by5nZXRFeHRlbnNpb25SYW5nZUxpc3QoKSkgeworICAgICAgICBpZiAocmFuZ2UuZ2V0U3RhcnQoKSA8PSBudW1iZXIgJiYgbnVtYmVyIDwgcmFuZ2UuZ2V0RW5kKCkpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZmllbGQgYnkgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZmllbGQgKGUuZy4gImZvbyIpLgorICAgICAqIEByZXR1cm4gVGhlIGZpZWxkJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGZpbmRGaWVsZEJ5TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0KKyAgICAgICAgICBmaWxlLnBvb2wuZmluZFN5bWJvbChmdWxsTmFtZSArICcuJyArIG5hbWUpOworICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIEZpZWxkRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gKEZpZWxkRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZpZWxkIGJ5IGZpZWxkIG51bWJlci4KKyAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBmaWVsZCBudW1iZXIgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICAgICAqIEByZXR1cm4gVGhlIGZpZWxkJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGZpbmRGaWVsZEJ5TnVtYmVyKGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgIHJldHVybiBmaWxlLnBvb2wuZmllbGRzQnlOdW1iZXIuZ2V0KAorICAgICAgICBuZXcgRGVzY3JpcHRvclBvb2wuRGVzY3JpcHRvckludFBhaXIodGhpcywgbnVtYmVyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBuZXN0ZWQgbWVzc2FnZSB0eXBlIGJ5IG5hbWUuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5lc3RlZCB0eXBlIChlLmcuICJGb28iKS4KKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlcydzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIERlc2NyaXB0b3IgZmluZE5lc3RlZFR5cGVCeU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9CisgICAgICAgICAgZmlsZS5wb29sLmZpbmRTeW1ib2woZnVsbE5hbWUgKyAnLicgKyBuYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiAoRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIG5lc3RlZCBlbnVtIHR5cGUgYnkgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmVzdGVkIHR5cGUgKGUuZy4gIkZvbyIpLgorICAgICAqIEByZXR1cm4gVGhlIHR5cGVzJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bURlc2NyaXB0b3IgZmluZEVudW1UeXBlQnlOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPQorICAgICAgICAgIGZpbGUucG9vbC5maW5kU3ltYm9sKGZ1bGxOYW1lICsgJy4nICsgbmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IpIHsKKyAgICAgICAgcmV0dXJuIChFbnVtRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKKyAgICBwcml2YXRlIERlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcltdIG5lc3RlZFR5cGVzOworICAgIHByaXZhdGUgZmluYWwgRW51bURlc2NyaXB0b3JbXSBlbnVtVHlwZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZERlc2NyaXB0b3JbXSBmaWVsZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZERlc2NyaXB0b3JbXSBleHRlbnNpb25zOworCisgICAgcHJpdmF0ZSBEZXNjcmlwdG9yKGZpbmFsIERlc2NyaXB0b3JQcm90byBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVzY3JpcHRvciBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgICAgZnVsbE5hbWUgPSBjb21wdXRlRnVsbE5hbWUoZmlsZSwgcGFyZW50LCBwcm90by5nZXROYW1lKCkpOworICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgIGNvbnRhaW5pbmdUeXBlID0gcGFyZW50OworCisgICAgICBuZXN0ZWRUeXBlcyA9IG5ldyBEZXNjcmlwdG9yW3Byb3RvLmdldE5lc3RlZFR5cGVDb3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0TmVzdGVkVHlwZUNvdW50KCk7IGkrKykgeworICAgICAgICBuZXN0ZWRUeXBlc1tpXSA9IG5ldyBEZXNjcmlwdG9yKAorICAgICAgICAgIHByb3RvLmdldE5lc3RlZFR5cGUoaSksIGZpbGUsIHRoaXMsIGkpOworICAgICAgfQorCisgICAgICBlbnVtVHlwZXMgPSBuZXcgRW51bURlc2NyaXB0b3JbcHJvdG8uZ2V0RW51bVR5cGVDb3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RW51bVR5cGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgZW51bVR5cGVzW2ldID0gbmV3IEVudW1EZXNjcmlwdG9yKAorICAgICAgICAgIHByb3RvLmdldEVudW1UeXBlKGkpLCBmaWxlLCB0aGlzLCBpKTsKKyAgICAgIH0KKworICAgICAgZmllbGRzID0gbmV3IEZpZWxkRGVzY3JpcHRvcltwcm90by5nZXRGaWVsZENvdW50KCldOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRGaWVsZENvdW50KCk7IGkrKykgeworICAgICAgICBmaWVsZHNbaV0gPSBuZXcgRmllbGREZXNjcmlwdG9yKAorICAgICAgICAgIHByb3RvLmdldEZpZWxkKGkpLCBmaWxlLCB0aGlzLCBpLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIGV4dGVuc2lvbnMgPSBuZXcgRmllbGREZXNjcmlwdG9yW3Byb3RvLmdldEV4dGVuc2lvbkNvdW50KCldOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRFeHRlbnNpb25Db3VudCgpOyBpKyspIHsKKyAgICAgICAgZXh0ZW5zaW9uc1tpXSA9IG5ldyBGaWVsZERlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0RXh0ZW5zaW9uKGkpLCBmaWxlLCB0aGlzLCBpLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKKyAgICB9CisKKyAgICAvKiogTG9vayB1cCBhbmQgY3Jvc3MtbGluayBhbGwgZmllbGQgdHlwZXMsIGV0Yy4gKi8KKyAgICBwcml2YXRlIHZvaWQgY3Jvc3NMaW5rKCkgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoZmluYWwgRGVzY3JpcHRvciBuZXN0ZWRUeXBlIDogbmVzdGVkVHlwZXMpIHsKKyAgICAgICAgbmVzdGVkVHlwZS5jcm9zc0xpbmsoKTsKKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBmaWVsZHMpIHsKKyAgICAgICAgZmllbGQuY3Jvc3NMaW5rKCk7CisgICAgICB9CisKKyAgICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgZXh0ZW5zaW9uLmNyb3NzTGluaygpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRGVzY3JpcHRvclByb3RvIHByb3RvKSB7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgbmVzdGVkVHlwZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0TmVzdGVkVHlwZShpKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGVudW1UeXBlc1tpXS5zZXRQcm90byhwcm90by5nZXRFbnVtVHlwZShpKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZpZWxkc1tpXS5zZXRQcm90byhwcm90by5nZXRGaWVsZChpKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICBleHRlbnNpb25zW2ldLnNldFByb3RvKHByb3RvLmdldEV4dGVuc2lvbihpKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKiogRGVzY3JpYmVzIGEgZmllbGQgb2YgYSBtZXNzYWdlIHR5cGUuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmllbGREZXNjcmlwdG9yCisgICAgICBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yLCBDb21wYXJhYmxlPEZpZWxkRGVzY3JpcHRvcj4sCisgICAgICAgICAgICAgICAgIEZpZWxkU2V0LkZpZWxkRGVzY3JpcHRvckxpdGU8RmllbGREZXNjcmlwdG9yPiB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCisgICAgICogQHNlZSBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yI2dldEluZGV4KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KKworICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLworICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KKworICAgIC8qKiBHZXQgdGhlIGZpZWxkJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiBwcm90by5nZXROYW1lKCk7IH0KKworICAgIC8qKiBHZXQgdGhlIGZpZWxkJ3MgbnVtYmVyLiAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkgeyByZXR1cm4gcHJvdG8uZ2V0TnVtYmVyKCk7IH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmllbGQncyBmdWxseS1xdWFsaWZpZWQgbmFtZS4KKyAgICAgKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0RnVsbE5hbWUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7IHJldHVybiBmdWxsTmFtZTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWVsZCdzIGphdmEgdHlwZS4gIFRoaXMgaXMganVzdCBmb3IgY29udmVuaWVuY2UuICBFdmVyeQorICAgICAqIHtAY29kZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlfSBtYXBzIHRvIGV4YWN0bHkgb25lIEphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7IHJldHVybiB0eXBlLmdldEphdmFUeXBlKCk7IH0KKworICAgIC8qKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICovCisgICAgcHVibGljIFdpcmVGb3JtYXQuSmF2YVR5cGUgZ2V0TGl0ZUphdmFUeXBlKCkgeworICAgICAgcmV0dXJuIGdldExpdGVUeXBlKCkuZ2V0SmF2YVR5cGUoKTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSB7QGNvZGUgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLworICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgfQorCisgICAgLyoqIEdldCB0aGUgZmllbGQncyBkZWNsYXJlZCB0eXBlLiAqLworICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7IHJldHVybiB0eXBlOyB9CisKKyAgICAvKiogRm9yIGludGVybmFsIHVzZSBvbmx5LiAqLworICAgIHB1YmxpYyBXaXJlRm9ybWF0LkZpZWxkVHlwZSBnZXRMaXRlVHlwZSgpIHsKKyAgICAgIHJldHVybiB0YWJsZVt0eXBlLm9yZGluYWwoKV07CisgICAgfQorICAgIC8vIEknbSBwcmV0dHkgc3VyZSB2YWx1ZXMoKSBjb25zdHJ1Y3RzIGEgbmV3IGFycmF5IGV2ZXJ5IHRpbWUsIHNpbmNlIHRoZXJlCisgICAgLy8gaXMgbm90aGluZyBzdG9wcGluZyB0aGUgY2FsbGVyIGZyb20gbXV0YXRpbmcgdGhlIGFycmF5LiAgVGhlcmVmb3JlIHdlCisgICAgLy8gbWFrZSBhIHN0YXRpYyBjb3B5IGhlcmUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGVbXSB0YWJsZSA9CisgICAgICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlLnZhbHVlcygpOworCisgICAgLyoqIElzIHRoaXMgZmllbGQgZGVjbGFyZWQgcmVxdWlyZWQ/ICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKKyAgICAgIHJldHVybiBwcm90by5nZXRMYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX1JFUVVJUkVEOworICAgIH0KKworICAgIC8qKiBJcyB0aGlzIGZpZWxkIGRlY2xhcmVkIG9wdGlvbmFsPyAqLworICAgIHB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisgICAgICByZXR1cm4gcHJvdG8uZ2V0TGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9PUFRJT05BTDsKKyAgICB9CisKKyAgICAvKiogSXMgdGhpcyBmaWVsZCBkZWNsYXJlZCByZXBlYXRlZD8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGVkKCkgeworICAgICAgcmV0dXJuIHByb3RvLmdldExhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfUkVQRUFURUQ7CisgICAgfQorCisgICAgLyoqIERvZXMgdGhpcyBmaWVsZCBoYXZlIHRoZSB7QGNvZGUgW3BhY2tlZCA9IHRydWVdfSBvcHRpb24/ICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrZWQoKSB7CisgICAgICByZXR1cm4gZ2V0T3B0aW9ucygpLmdldFBhY2tlZCgpOworICAgIH0KKworICAgIC8qKiBDYW4gdGhpcyBmaWVsZCBiZSBwYWNrZWQ/IGkuZS4gaXMgaXQgYSByZXBlYXRlZCBwcmltaXRpdmUgZmllbGQ/ICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWJsZSgpIHsKKyAgICAgIHJldHVybiBpc1JlcGVhdGVkKCkgJiYgZ2V0TGl0ZVR5cGUoKS5pc1BhY2thYmxlKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgaGFkIGFuIGV4cGxpY2l0bHktZGVmaW5lZCBkZWZhdWx0IHZhbHVlLiAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0RlZmF1bHRWYWx1ZSgpIHsgcmV0dXJuIHByb3RvLmhhc0RlZmF1bHRWYWx1ZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCdzIGRlZmF1bHQgdmFsdWUuICBWYWxpZCBmb3IgYWxsIHR5cGVzIGV4Y2VwdCBmb3IKKyAgICAgKiBtZXNzYWdlcyBhbmQgZ3JvdXBzLiAgRm9yIGFsbCBvdGhlciB0eXBlcywgdGhlIG9iamVjdCByZXR1cm5lZCBpcyBvZgorICAgICAqIHRoZSBzYW1lIGNsYXNzIHRoYXQgd291bGQgcmV0dXJuZWQgYnkgTWVzc2FnZS5nZXRGaWVsZCh0aGlzKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgpIHsKKyAgICAgIGlmIChnZXRKYXZhVHlwZSgpID09IEphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJGaWVsZERlc2NyaXB0b3IuZ2V0RGVmYXVsdFZhbHVlKCkgY2FsbGVkIG9uIGFuIGVtYmVkZGVkIG1lc3NhZ2UgIiArCisgICAgICAgICAgImZpZWxkLiIpOworICAgICAgfQorICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSB7QGNvZGUgRmllbGRPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uICovCisgICAgcHVibGljIEZpZWxkT3B0aW9ucyBnZXRPcHRpb25zKCkgeyByZXR1cm4gcHJvdG8uZ2V0T3B0aW9ucygpOyB9CisKKyAgICAvKiogSXMgdGhpcyBmaWVsZCBhbiBleHRlbnNpb24/ICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb24oKSB7IHJldHVybiBwcm90by5oYXNFeHRlbmRlZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpZWxkJ3MgY29udGFpbmluZyB0eXBlLiBGb3IgZXh0ZW5zaW9ucywgdGhpcyBpcyB0aGUgdHlwZSBiZWluZworICAgICAqIGV4dGVuZGVkLCBub3QgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBleHRlbnNpb24gd2FzIGRlZmluZWQuICBTZWUKKyAgICAgKiB7QGxpbmsgI2dldEV4dGVuc2lvblNjb3BlKCl9LgorICAgICAqLworICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldENvbnRhaW5pbmdUeXBlKCkgeyByZXR1cm4gY29udGFpbmluZ1R5cGU7IH0KKworICAgIC8qKgorICAgICAqIEZvciBleHRlbnNpb25zIGRlZmluZWQgbmVzdGVkIHdpdGhpbiBtZXNzYWdlIHR5cGVzLCBnZXRzIHRoZSBvdXRlcgorICAgICAqIHR5cGUuICBOb3QgdmFsaWQgZm9yIG5vbi1leHRlbnNpb24gZmllbGRzLiAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyCisgICAgICogdGhpcyB7QGNvZGUgLnByb3RvfSBmaWxlOgorICAgICAqIDxwcmU+CisgICAgICogICBtZXNzYWdlIEZvbyB7CisgICAgICogICAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgICAgICogICB9CisgICAgICogICBleHRlbmQgRm9vIHsKKyAgICAgKiAgICAgb3B0aW9uYWwgaW50MzIgYmF6ID0gMTIzNDsKKyAgICAgKiAgIH0KKyAgICAgKiAgIG1lc3NhZ2UgQmFyIHsKKyAgICAgKiAgICAgZXh0ZW5kIEZvbyB7CisgICAgICogICAgICAgb3B0aW9uYWwgaW50MzIgcXV4ID0gNDMyMTsKKyAgICAgKiAgICAgfQorICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqIEJvdGgge0Bjb2RlIGJhen0ncyBhbmQge0Bjb2RlIHF1eH0ncyBjb250YWluaW5nIHR5cGUgaXMge0Bjb2RlIEZvb30uCisgICAgICogSG93ZXZlciwge0Bjb2RlIGJhen0ncyBleHRlbnNpb24gc2NvcGUgaXMge0Bjb2RlIG51bGx9IHdoaWxlCisgICAgICoge0Bjb2RlIHF1eH0ncyBleHRlbnNpb24gc2NvcGUgaXMge0Bjb2RlIEJhcn0uCisgICAgICovCisgICAgcHVibGljIERlc2NyaXB0b3IgZ2V0RXh0ZW5zaW9uU2NvcGUoKSB7CisgICAgICBpZiAoIWlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIGZpZWxkIGlzIG5vdCBhbiBleHRlbnNpb24uIik7CisgICAgICB9CisgICAgICByZXR1cm4gZXh0ZW5zaW9uU2NvcGU7CisgICAgfQorCisgICAgLyoqIEZvciBlbWJlZGRlZCBtZXNzYWdlIGFuZCBncm91cCBmaWVsZHMsIGdldHMgdGhlIGZpZWxkJ3MgdHlwZS4gKi8KKyAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRNZXNzYWdlVHlwZSgpIHsKKyAgICAgIGlmIChnZXRKYXZhVHlwZSgpICE9IEphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIGZpZWxkIGlzIG5vdCBvZiBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgICByZXR1cm4gbWVzc2FnZVR5cGU7CisgICAgfQorCisgICAgLyoqIEZvciBlbnVtIGZpZWxkcywgZ2V0cyB0aGUgZmllbGQncyB0eXBlLiAqLworICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvciBnZXRFbnVtVHlwZSgpIHsKKyAgICAgIGlmIChnZXRKYXZhVHlwZSgpICE9IEphdmFUeXBlLkVOVU0pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIGZpZWxkIGlzIG5vdCBvZiBlbnVtIHR5cGUuIik7CisgICAgICB9CisgICAgICByZXR1cm4gZW51bVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB3aXRoIGFub3RoZXIge0Bjb2RlIEZpZWxkRGVzY3JpcHRvcn0uICBUaGlzIG9yZGVycyBmaWVsZHMgaW4KKyAgICAgKiAiY2Fub25pY2FsIiBvcmRlciwgd2hpY2ggc2ltcGx5IG1lYW5zIGFzY2VuZGluZyBvcmRlciBieSBmaWVsZCBudW1iZXIuCisgICAgICoge0Bjb2RlIG90aGVyfSBtdXN0IGJlIGEgZmllbGQgb2YgdGhlIHNhbWUgdHlwZSAtLSBpLmUuCisgICAgICoge0Bjb2RlIGdldENvbnRhaW5pbmdUeXBlKCl9IG11c3QgcmV0dXJuIHRoZSBzYW1lIHtAY29kZSBEZXNjcmlwdG9yfSBmb3IKKyAgICAgKiBib3RoIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmVnYXRpdmUsIHplcm8sIG9yIHBvc2l0aXZlIGlmIHtAY29kZSB0aGlzfSBpcyBsZXNzIHRoYW4sCisgICAgICogICAgICAgICBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHtAY29kZSBvdGhlcn0sIHJlc3BlY3RpdmVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhmaW5hbCBGaWVsZERlc2NyaXB0b3Igb3RoZXIpIHsKKyAgICAgIGlmIChvdGhlci5jb250YWluaW5nVHlwZSAhPSBjb250YWluaW5nVHlwZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JzIGNhbiBvbmx5IGJlIGNvbXBhcmVkIHRvIG90aGVyIEZpZWxkRGVzY3JpcHRvcnMgIiArCisgICAgICAgICAgImZvciBmaWVsZHMgb2YgdGhlIHNhbWUgbWVzc2FnZSB0eXBlLiIpOworICAgICAgfQorICAgICAgcmV0dXJuIGdldE51bWJlcigpIC0gb3RoZXIuZ2V0TnVtYmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisKKyAgICBwcml2YXRlIEZpZWxkRGVzY3JpcHRvclByb3RvIHByb3RvOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOworICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgZXh0ZW5zaW9uU2NvcGU7CisKKyAgICAvLyBQb3NzaWJseSBpbml0aWFsaXplZCBkdXJpbmcgY3Jvc3MtbGlua2luZy4KKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKyAgICBwcml2YXRlIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGU7CisgICAgcHJpdmF0ZSBEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlOworICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3IgZW51bVR5cGU7CisgICAgcHJpdmF0ZSBPYmplY3QgZGVmYXVsdFZhbHVlOworCisgICAgcHVibGljIGVudW0gVHlwZSB7CisgICAgICBET1VCTEUgIChKYXZhVHlwZS5ET1VCTEUgICAgICksCisgICAgICBGTE9BVCAgIChKYXZhVHlwZS5GTE9BVCAgICAgICksCisgICAgICBJTlQ2NCAgIChKYXZhVHlwZS5MT05HICAgICAgICksCisgICAgICBVSU5UNjQgIChKYXZhVHlwZS5MT05HICAgICAgICksCisgICAgICBJTlQzMiAgIChKYXZhVHlwZS5JTlQgICAgICAgICksCisgICAgICBGSVhFRDY0IChKYXZhVHlwZS5MT05HICAgICAgICksCisgICAgICBGSVhFRDMyIChKYXZhVHlwZS5JTlQgICAgICAgICksCisgICAgICBCT09MICAgIChKYXZhVHlwZS5CT09MRUFOICAgICksCisgICAgICBTVFJJTkcgIChKYXZhVHlwZS5TVFJJTkcgICAgICksCisgICAgICBHUk9VUCAgIChKYXZhVHlwZS5NRVNTQUdFICAgICksCisgICAgICBNRVNTQUdFIChKYXZhVHlwZS5NRVNTQUdFICAgICksCisgICAgICBCWVRFUyAgIChKYXZhVHlwZS5CWVRFX1NUUklORyksCisgICAgICBVSU5UMzIgIChKYXZhVHlwZS5JTlQgICAgICAgICksCisgICAgICBFTlVNICAgIChKYXZhVHlwZS5FTlVNICAgICAgICksCisgICAgICBTRklYRUQzMihKYXZhVHlwZS5JTlQgICAgICAgICksCisgICAgICBTRklYRUQ2NChKYXZhVHlwZS5MT05HICAgICAgICksCisgICAgICBTSU5UMzIgIChKYXZhVHlwZS5JTlQgICAgICAgICksCisgICAgICBTSU5UNjQgIChKYXZhVHlwZS5MT05HICAgICAgICk7CisKKyAgICAgIFR5cGUoZmluYWwgSmF2YVR5cGUgamF2YVR5cGUpIHsKKyAgICAgICAgdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOworICAgICAgfQorCisgICAgICBwcml2YXRlIEphdmFUeXBlIGphdmFUeXBlOworCisgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0b1Byb3RvKCkgeworICAgICAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZS52YWx1ZU9mKG9yZGluYWwoKSArIDEpOworICAgICAgfQorICAgICAgcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgeyByZXR1cm4gamF2YVR5cGU7IH0KKworICAgICAgcHVibGljIHN0YXRpYyBUeXBlIHZhbHVlT2YoZmluYWwgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZXMoKVt0eXBlLmdldE51bWJlcigpIC0gMV07CisgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHsKKyAgICAgIC8vIFJlZnVzZSB0byBpbml0IGlmIHNvbWVvbmUgYWRkZWQgYSBuZXcgZGVjbGFyZWQgdHlwZS4KKyAgICAgIGlmIChUeXBlLnZhbHVlcygpLmxlbmd0aCAhPSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLnZhbHVlcygpLmxlbmd0aCkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiZGVzY3JpcHRvci5wcm90byBoYXMgYSBuZXcgZGVjbGFyZWQgdHlwZSBidXQgRGVzcmNpcHRvcnMuamF2YSAiICsKKyAgICAgICAgICAid2Fzbid0IHVwZGF0ZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGVudW0gSmF2YVR5cGUgeworICAgICAgSU5UKDApLAorICAgICAgTE9ORygwTCksCisgICAgICBGTE9BVCgwRiksCisgICAgICBET1VCTEUoMEQpLAorICAgICAgQk9PTEVBTihmYWxzZSksCisgICAgICBTVFJJTkcoIiIpLAorICAgICAgQllURV9TVFJJTkcoQnl0ZVN0cmluZy5FTVBUWSksCisgICAgICBFTlVNKG51bGwpLAorICAgICAgTUVTU0FHRShudWxsKTsKKworICAgICAgSmF2YVR5cGUoZmluYWwgT2JqZWN0IGRlZmF1bHREZWZhdWx0KSB7CisgICAgICAgIHRoaXMuZGVmYXVsdERlZmF1bHQgPSBkZWZhdWx0RGVmYXVsdDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBUaGUgZGVmYXVsdCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLCBpZiBpdCdzIGEgcHJpbWl0aXZlCisgICAgICAgKiB0eXBlLiAgVGhpcyBpcyBtZWFudCBmb3IgdXNlIGluc2lkZSB0aGlzIGZpbGUgb25seSwgaGVuY2UgaXMgcHJpdmF0ZS4KKyAgICAgICAqLworICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdERlZmF1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0b3IoZmluYWwgRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0V4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICBmdWxsTmFtZSA9IGNvbXB1dGVGdWxsTmFtZShmaWxlLCBwYXJlbnQsIHByb3RvLmdldE5hbWUoKSk7CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworCisgICAgICBpZiAocHJvdG8uaGFzVHlwZSgpKSB7CisgICAgICAgIHR5cGUgPSBUeXBlLnZhbHVlT2YocHJvdG8uZ2V0VHlwZSgpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdldE51bWJlcigpIDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgIkZpZWxkIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy4iKTsKKyAgICAgIH0KKworICAgICAgLy8gT25seSByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIG1heSBiZSBwYWNrZWQuCisgICAgICBpZiAocHJvdG8uZ2V0T3B0aW9ucygpLmdldFBhY2tlZCgpICYmICFpc1BhY2thYmxlKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgIltwYWNrZWQgPSB0cnVlXSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSAiICsKKyAgICAgICAgICAiZmllbGRzLiIpOworICAgICAgfQorCisgICAgICBpZiAoaXNFeHRlbnNpb24pIHsKKyAgICAgICAgaWYgKCFwcm90by5oYXNFeHRlbmRlZSgpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUgbm90IHNldCBmb3IgZXh0ZW5zaW9uIGZpZWxkLiIpOworICAgICAgICB9CisgICAgICAgIGNvbnRhaW5pbmdUeXBlID0gbnVsbDsgIC8vIFdpbGwgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICBleHRlbnNpb25TY29wZSA9IHBhcmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBleHRlbnNpb25TY29wZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwcm90by5oYXNFeHRlbmRlZSgpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUgc2V0IGZvciBub24tZXh0ZW5zaW9uIGZpZWxkLiIpOworICAgICAgICB9CisgICAgICAgIGNvbnRhaW5pbmdUeXBlID0gcGFyZW50OworICAgICAgICBleHRlbnNpb25TY29wZSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7CisgICAgfQorCisgICAgLyoqIExvb2sgdXAgYW5kIGNyb3NzLWxpbmsgYWxsIGZpZWxkIHR5cGVzLCBldGMuICovCisgICAgcHJpdmF0ZSB2b2lkIGNyb3NzTGluaygpIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpZiAocHJvdG8uaGFzRXh0ZW5kZWUoKSkgeworICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBleHRlbmRlZSA9CisgICAgICAgICAgZmlsZS5wb29sLmxvb2t1cFN5bWJvbChwcm90by5nZXRFeHRlbmRlZSgpLCB0aGlzLAorICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbC5TZWFyY2hGaWx0ZXIuVFlQRVNfT05MWSk7CisgICAgICAgIGlmICghKGV4dGVuZGVlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldEV4dGVuZGVlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOworICAgICAgICB9CisgICAgICAgIGNvbnRhaW5pbmdUeXBlID0gKERlc2NyaXB0b3IpZXh0ZW5kZWU7CisKKyAgICAgICAgaWYgKCFnZXRDb250YWluaW5nVHlwZSgpLmlzRXh0ZW5zaW9uTnVtYmVyKGdldE51bWJlcigpKSkgeworICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgICAnXCInICsgZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRGdWxsTmFtZSgpICsKKyAgICAgICAgICAgICAgIlwiIGRvZXMgbm90IGRlY2xhcmUgIiArIGdldE51bWJlcigpICsKKyAgICAgICAgICAgICAgIiBhcyBhbiBleHRlbnNpb24gbnVtYmVyLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwcm90by5oYXNUeXBlTmFtZSgpKSB7CisgICAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHR5cGVEZXNjcmlwdG9yID0KKyAgICAgICAgICBmaWxlLnBvb2wubG9va3VwU3ltYm9sKHByb3RvLmdldFR5cGVOYW1lKCksIHRoaXMsCisgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sLlNlYXJjaEZpbHRlci5UWVBFU19PTkxZKTsKKworICAgICAgICBpZiAoIXByb3RvLmhhc1R5cGUoKSkgeworICAgICAgICAgIC8vIENob29zZSBmaWVsZCB0eXBlIGJhc2VkIG9uIHN5bWJvbC4KKyAgICAgICAgICBpZiAodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICB0eXBlID0gVHlwZS5NRVNTQUdFOworICAgICAgICAgIH0gZWxzZSBpZiAodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBFbnVtRGVzY3JpcHRvcikgeworICAgICAgICAgICAgdHlwZSA9IFR5cGUuRU5VTTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldFR5cGVOYW1lKCkgKyAiXCIgaXMgbm90IGEgdHlwZS4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgaWYgKCEodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldFR5cGVOYW1lKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBtZXNzYWdlVHlwZSA9IChEZXNjcmlwdG9yKXR5cGVEZXNjcmlwdG9yOworCisgICAgICAgICAgaWYgKHByb3RvLmhhc0RlZmF1bHRWYWx1ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgIk1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgIGlmICghKHR5cGVEZXNjcmlwdG9yIGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAnXCInICsgcHJvdG8uZ2V0VHlwZU5hbWUoKSArICJcIiBpcyBub3QgYW4gZW51bSB0eXBlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbnVtVHlwZSA9IChFbnVtRGVzY3JpcHRvcil0eXBlRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJGaWVsZCB3aXRoIHByaW1pdGl2ZSB0eXBlIGhhcyB0eXBlX25hbWUuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZXRKYXZhVHlwZSgpID09IEphdmFUeXBlLk1FU1NBR0UgfHwKKyAgICAgICAgICAgIGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgIkZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyB0eXBlX25hbWUuIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gV2UgZG9uJ3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUgZGVmYXVsdCB2YWx1ZSB1bnRpbCBoZXJlIGJlY2F1c2UgZm9yCisgICAgICAvLyBlbnVtcyB3ZSBuZWVkIHRoZSBlbnVtIHR5cGUncyBkZXNjcmlwdG9yLgorICAgICAgaWYgKHByb3RvLmhhc0RlZmF1bHRWYWx1ZSgpKSB7CisgICAgICAgIGlmIChpc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJSZXBlYXRlZCBmaWVsZHMgY2Fubm90IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIHN3aXRjaCAoZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIElOVDMyOgorICAgICAgICAgICAgY2FzZSBTSU5UMzI6CisgICAgICAgICAgICBjYXNlIFNGSVhFRDMyOgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlSW50MzIocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVUlOVDMyOgorICAgICAgICAgICAgY2FzZSBGSVhFRDMyOgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOVDY0OgorICAgICAgICAgICAgY2FzZSBTSU5UNjQ6CisgICAgICAgICAgICBjYXNlIFNGSVhFRDY0OgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlSW50NjQocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVUlOVDY0OgorICAgICAgICAgICAgY2FzZSBGSVhFRDY0OgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJpbmYiKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEZsb2F0LlBPU0lUSVZFX0lORklOSVRZOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiLWluZiIpKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJuYW4iKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEZsb2F0Lk5hTjsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBGbG9hdC52YWx1ZU9mKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJpbmYiKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvdWJsZS5QT1NJVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIi1pbmYiKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIm5hbiIpKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRG91YmxlLk5hTjsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBEb3VibGUudmFsdWVPZihwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJPT0w6CisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEJvb2xlYW4udmFsdWVPZihwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3RvLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQllURVM6CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0KKyAgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVCeXRlcyhwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKFRleHRGb3JtYXQuSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBwYXJzZSBkZWZhdWx0IHZhbHVlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTlVNOgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBlbnVtVHlwZS5maW5kVmFsdWVCeU5hbWUocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAgICJVbmtub3duIGVudW0gZGVmYXVsdCB2YWx1ZTogXCIiICsKKyAgICAgICAgICAgICAgICAgIHByb3RvLmdldERlZmF1bHRWYWx1ZSgpICsgJ1wiJyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgICAgICBjYXNlIEdST1VQOgorICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAiTWVzc2FnZSB0eXBlIGhhZCBkZWZhdWx0IHZhbHVlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgCisgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFyc2UgZGVmYXVsdCB2YWx1ZTogXCIiICsgCisgICAgICAgICAgICAgIHByb3RvLmdldERlZmF1bHRWYWx1ZSgpICsgJ1wiJywgZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERldGVybWluZSB0aGUgZGVmYXVsdCBkZWZhdWx0IGZvciB0aGlzIGZpZWxkLgorICAgICAgICBpZiAoaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3dpdGNoIChnZXRKYXZhVHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgICAgIC8vIFdlIGd1YXJhbnRlZSBlbHNld2hlcmUgdGhhdCBhbiBlbnVtIHR5cGUgYWx3YXlzIGhhcyBhdCBsZWFzdAorICAgICAgICAgICAgICAvLyBvbmUgcG9zc2libGUgdmFsdWUuCisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGVudW1UeXBlLmdldFZhbHVlcygpLmdldCgwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZ2V0SmF2YVR5cGUoKS5kZWZhdWx0RGVmYXVsdDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghaXNFeHRlbnNpb24oKSkgeworICAgICAgICBmaWxlLnBvb2wuYWRkRmllbGRCeU51bWJlcih0aGlzKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbnRhaW5pbmdUeXBlICE9IG51bGwgJiYKKyAgICAgICAgICBjb250YWluaW5nVHlwZS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSkgeworICAgICAgICBpZiAoaXNFeHRlbnNpb24oKSkgeworICAgICAgICAgIGlmICghaXNPcHRpb25hbCgpIHx8IGdldFR5cGUoKSAhPSBUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgICAiRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsIG1lc3NhZ2VzLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJNZXNzYWdlU2V0cyBjYW5ub3QgaGF2ZSBmaWVsZHMsIG9ubHkgZXh0ZW5zaW9ucy4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIGlzIHRvIHNhdGlzZnkgdGhlIEZpZWxkRGVzY3JpcHRvckxpdGUKKyAgICAgKiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgaW50ZXJuYWxNZXJnZUZyb20oCisgICAgICAgIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgdG8sIE1lc3NhZ2VMaXRlIGZyb20pIHsKKyAgICAgIC8vIEZpZWxkRGVzY3JpcHRvcnMgYXJlIG9ubHkgdXNlZCB3aXRoIG5vbi1saXRlIG1lc3NhZ2VzIHNvIHdlIGNhbiBqdXN0CisgICAgICAvLyBkb3duLWNhc3QgYW5kIGNhbGwgbWVyZ2VGcm9tIGRpcmVjdGx5LgorICAgICAgcmV0dXJuICgoTWVzc2FnZS5CdWlsZGVyKSB0bykubWVyZ2VGcm9tKChNZXNzYWdlKSBmcm9tKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKiBEZXNjcmliZXMgYW4gZW51bSB0eXBlLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVudW1EZXNjcmlwdG9yCisgICAgICBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yLCBJbnRlcm5hbC5FbnVtTGl0ZU1hcDxFbnVtVmFsdWVEZXNjcmlwdG9yPiB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCisgICAgICogQHNlZSBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yI2dldEluZGV4KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KKworICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLworICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQorCisgICAgLyoqIEdldCB0aGUgdHlwZSdzIHVucXVhbGlmaWVkIG5hbWUuICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUncyBmdWxseS1xdWFsaWZpZWQgbmFtZS4KKyAgICAgKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0RnVsbE5hbWUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7IHJldHVybiBmdWxsTmFtZTsgfQorCisgICAgLyoqIEdldCB0aGUge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBjb250YWluaW5nIHRoaXMgZGVzY3JpcHRvci4gKi8KKyAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7IH0KKworICAgIC8qKiBJZiB0aGlzIGlzIGEgbmVzdGVkIHR5cGUsIGdldCB0aGUgb3V0ZXIgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIG51bGwuICovCisgICAgcHVibGljIERlc2NyaXB0b3IgZ2V0Q29udGFpbmluZ1R5cGUoKSB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQorCisgICAgLyoqIEdldCB0aGUge0Bjb2RlIEVudW1PcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uICovCisgICAgcHVibGljIEVudW1PcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIGRlZmluZWQgdmFsdWVzIGZvciB0aGlzIGVudW0uICovCisgICAgcHVibGljIExpc3Q8RW51bVZhbHVlRGVzY3JpcHRvcj4gZ2V0VmFsdWVzKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuIGVudW0gdmFsdWUgYnkgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgdmFsdWUgKGUuZy4gIkZPTyIpLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvciBmaW5kVmFsdWVCeU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9CisgICAgICAgICAgZmlsZS5wb29sLmZpbmRTeW1ib2woZnVsbE5hbWUgKyAnLicgKyBuYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBFbnVtVmFsdWVEZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiAoRW51bVZhbHVlRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuIGVudW0gdmFsdWUgYnkgbnVtYmVyLiAgSWYgbXVsdGlwbGUgZW51bSB2YWx1ZXMgaGF2ZSB0aGUgc2FtZQorICAgICAqIG51bWJlciwgdGhpcyByZXR1cm5zIHRoZSBmaXJzdCBkZWZpbmVkIHZhbHVlIHdpdGggdGhhdCBudW1iZXIuCisgICAgICogQHBhcmFtIG51bWJlciBUaGUgdmFsdWUncyBudW1iZXIuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZpbmRWYWx1ZUJ5TnVtYmVyKGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgIHJldHVybiBmaWxlLnBvb2wuZW51bVZhbHVlc0J5TnVtYmVyLmdldCgKKyAgICAgICAgbmV3IERlc2NyaXB0b3JQb29sLkRlc2NyaXB0b3JJbnRQYWlyKHRoaXMsIG51bWJlcikpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OworICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlOworICAgIHByaXZhdGUgRW51bVZhbHVlRGVzY3JpcHRvcltdIHZhbHVlczsKKworICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3IoZmluYWwgRW51bURlc2NyaXB0b3JQcm90byBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIHBhcmVudCwgcHJvdG8uZ2V0TmFtZSgpKTsKKyAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICBjb250YWluaW5nVHlwZSA9IHBhcmVudDsKKworICAgICAgaWYgKHByb3RvLmdldFZhbHVlQ291bnQoKSA9PSAwKSB7CisgICAgICAgIC8vIFdlIGNhbm5vdCBhbGxvdyBlbnVtcyB3aXRoIG5vIHZhbHVlcyBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB0aGVyZQorICAgICAgICAvLyB3b3VsZCBiZSBubyB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLgorICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAiRW51bXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSB2YWx1ZS4iKTsKKyAgICAgIH0KKworICAgICAgdmFsdWVzID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JbcHJvdG8uZ2V0VmFsdWVDb3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0VmFsdWVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVzW2ldID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0VmFsdWUoaSksIGZpbGUsIHRoaXMsIGkpOworICAgICAgfQorCisgICAgICBmaWxlLnBvb2wuYWRkU3ltYm9sKHRoaXMpOworICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRW51bURlc2NyaXB0b3JQcm90byBwcm90bykgeworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YWx1ZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0VmFsdWUoaSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqCisgICAqIERlc2NyaWJlcyBvbmUgdmFsdWUgd2l0aGluIGFuIGVudW0gdHlwZS4gIE5vdGUgdGhhdCBtdWx0aXBsZSBkZWZpbmVkCisgICAqIHZhbHVlcyBtYXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIuICBJbiBnZW5lcmF0ZWQgSmF2YSBjb2RlLCBhbGwgdmFsdWVzCisgICAqIHdpdGggdGhlIHNhbWUgbnVtYmVyIGFmdGVyIHRoZSBmaXJzdCBiZWNvbWUgYWxpYXNlcyBvZiB0aGUgZmlyc3QuCisgICAqIEhvd2V2ZXIsIHRoZXkgc3RpbGwgaGF2ZSBpbmRlcGVuZGVudCBFbnVtVmFsdWVEZXNjcmlwdG9ycy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcgorICAgICAgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciwgSW50ZXJuYWwuRW51bUxpdGUgeworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LgorICAgICAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRJbmRleCgpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9CisKKyAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KKyAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUncyB1bnF1YWxpZmllZCBuYW1lLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUncyBudW1iZXIuICovCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7IHJldHVybiBwcm90by5nZXROdW1iZXIoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgorICAgICAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsgcmV0dXJuIGZ1bGxOYW1lOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLworICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUncyBlbnVtIHR5cGUuICovCisgICAgcHVibGljIEVudW1EZXNjcmlwdG9yIGdldFR5cGUoKSB7IHJldHVybiB0eXBlOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAY29kZSBFbnVtVmFsdWVPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uCisgICAgICovCisgICAgcHVibGljIEVudW1WYWx1ZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisgICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOworICAgIHByaXZhdGUgZmluYWwgRW51bURlc2NyaXB0b3IgdHlwZTsKKworICAgIHByaXZhdGUgRW51bVZhbHVlRGVzY3JpcHRvcihmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudW1EZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgdHlwZSA9IHBhcmVudDsKKworICAgICAgZnVsbE5hbWUgPSBwYXJlbnQuZ2V0RnVsbE5hbWUoKSArICcuJyArIHByb3RvLmdldE5hbWUoKTsKKworICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKKyAgICAgIGZpbGUucG9vbC5hZGRFbnVtVmFsdWVCeU51bWJlcih0aGlzKTsKKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBGaWxlRGVzY3JpcHRvciNzZXRQcm90b30uICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBwcm90bykgeworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqIERlc2NyaWJlcyBhIHNlcnZpY2UgdHlwZS4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvciBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yIHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudC4KKyAgICAgKiAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRJbmRleCgpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9CisKKyAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KKyAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KKworICAgIC8qKiBHZXQgdGhlIHR5cGUncyB1bnF1YWxpZmllZCBuYW1lLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUuCisgICAgICogQHNlZSBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yI2dldEZ1bGxOYW1lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeyByZXR1cm4gZnVsbE5hbWU7IH0KKworICAgIC8qKiBHZXQgdGhlIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gY29udGFpbmluZyB0aGlzIGRlc2NyaXB0b3IuICovCisgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7IHJldHVybiBmaWxlOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGNvZGUgU2VydmljZU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KKyAgICBwdWJsaWMgU2VydmljZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgbWV0aG9kcyBmb3IgdGhpcyBzZXJ2aWNlLiAqLworICAgIHB1YmxpYyBMaXN0PE1ldGhvZERlc2NyaXB0b3I+IGdldE1ldGhvZHMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KG1ldGhvZHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgbWV0aG9kIGJ5IG5hbWUuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIG1ldGhvZCAoZS5nLiAiRm9vIikuCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRvciBmaW5kTWV0aG9kQnlOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPQorICAgICAgICAgIGZpbGUucG9vbC5maW5kU3ltYm9sKGZ1bGxOYW1lICsgJy4nICsgbmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgTWV0aG9kRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gKE1ldGhvZERlc2NyaXB0b3IpcmVzdWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisgICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHByb3RvOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOworICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKKyAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0b3JbXSBtZXRob2RzOworCisgICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRvcihmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIG51bGwsIHByb3RvLmdldE5hbWUoKSk7CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworCisgICAgICBtZXRob2RzID0gbmV3IE1ldGhvZERlc2NyaXB0b3JbcHJvdG8uZ2V0TWV0aG9kQ291bnQoKV07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldE1ldGhvZENvdW50KCk7IGkrKykgeworICAgICAgICBtZXRob2RzW2ldID0gbmV3IE1ldGhvZERlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0TWV0aG9kKGkpLCBmaWxlLCB0aGlzLCBpKTsKKyAgICAgIH0KKworICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3Jvc3NMaW5rKCkgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoZmluYWwgTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgOiBtZXRob2RzKSB7CisgICAgICAgIG1ldGhvZC5jcm9zc0xpbmsoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBGaWxlRGVzY3JpcHRvciNzZXRQcm90b30uICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIG1ldGhvZHNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0TWV0aG9kKGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBEZXNjcmliZXMgb25lIG1ldGhvZCB3aXRoaW4gYSBzZXJ2aWNlIHR5cGUuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1ldGhvZERlc2NyaXB0b3IgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCisgICAgICogKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0SW5kZXgoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQorCisgICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCisgICAgcHVibGljIE1ldGhvZERlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KKworICAgIC8qKiBHZXQgdGhlIG1ldGhvZCdzIHVucXVhbGlmaWVkIG5hbWUuICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1ldGhvZCdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgorICAgICAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsgcmV0dXJuIGZ1bGxOYW1lOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLworICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgfQorCisgICAgLyoqIEdldCB0aGUgbWV0aG9kJ3Mgc2VydmljZSB0eXBlLiAqLworICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRvciBnZXRTZXJ2aWNlKCkgeyByZXR1cm4gc2VydmljZTsgfQorCisgICAgLyoqIEdldCB0aGUgbWV0aG9kJ3MgaW5wdXQgdHlwZS4gKi8KKyAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRJbnB1dFR5cGUoKSB7IHJldHVybiBpbnB1dFR5cGU7IH0KKworICAgIC8qKiBHZXQgdGhlIG1ldGhvZCdzIG91dHB1dCB0eXBlLiAqLworICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldE91dHB1dFR5cGUoKSB7IHJldHVybiBvdXRwdXRUeXBlOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAY29kZSBNZXRob2RPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uCisgICAgICovCisgICAgcHVibGljIE1ldGhvZE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisgICAgcHJpdmF0ZSBNZXRob2REZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOworICAgIHByaXZhdGUgZmluYWwgU2VydmljZURlc2NyaXB0b3Igc2VydmljZTsKKworICAgIC8vIEluaXRpYWxpemVkIGR1cmluZyBjcm9zcy1saW5raW5nLgorICAgIHByaXZhdGUgRGVzY3JpcHRvciBpbnB1dFR5cGU7CisgICAgcHJpdmF0ZSBEZXNjcmlwdG9yIG91dHB1dFR5cGU7CisKKyAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0b3IoZmluYWwgTWV0aG9kRGVzY3JpcHRvclByb3RvIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvciBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgIHNlcnZpY2UgPSBwYXJlbnQ7CisKKyAgICAgIGZ1bGxOYW1lID0gcGFyZW50LmdldEZ1bGxOYW1lKCkgKyAnLicgKyBwcm90by5nZXROYW1lKCk7CisKKyAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyb3NzTGluaygpIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBpbnB1dCA9CisgICAgICAgIGZpbGUucG9vbC5sb29rdXBTeW1ib2wocHJvdG8uZ2V0SW5wdXRUeXBlKCksIHRoaXMsCisgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbC5TZWFyY2hGaWx0ZXIuVFlQRVNfT05MWSk7CisgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpKSB7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldElucHV0VHlwZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0KKyAgICAgIGlucHV0VHlwZSA9IChEZXNjcmlwdG9yKWlucHV0OworCisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBvdXRwdXQgPQorICAgICAgICBmaWxlLnBvb2wubG9va3VwU3ltYm9sKHByb3RvLmdldE91dHB1dFR5cGUoKSwgdGhpcywKKyAgICAgICAgICAgIERlc2NyaXB0b3JQb29sLlNlYXJjaEZpbHRlci5UWVBFU19PTkxZKTsKKyAgICAgIGlmICghKG91dHB1dCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpKSB7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldE91dHB1dFR5cGUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgICBvdXRwdXRUeXBlID0gKERlc2NyaXB0b3Ipb3V0cHV0OworICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgTWV0aG9kRGVzY3JpcHRvclByb3RvIHByb3RvKSB7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29tcHV0ZUZ1bGxOYW1lKGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVzY3JpcHRvciBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBwYXJlbnQuZ2V0RnVsbE5hbWUoKSArICcuJyArIG5hbWU7CisgICAgfSBlbHNlIGlmIChmaWxlLmdldFBhY2thZ2UoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgIHJldHVybiBmaWxlLmdldFBhY2thZ2UoKSArICcuJyArIG5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqCisgICAqIEFsbCBkZXNjcmlwdG9ycyBleGNlcHQge0Bjb2RlIEZpbGVEZXNjcmlwdG9yfSBpbXBsZW1lbnQgdGhpcyB0byBtYWtlCisgICAqIHtAY29kZSBEZXNjcmlwdG9yUG9vbH0ncyBsaWZlIGVhc2llci4KKyAgICovCisgIHByaXZhdGUgaW50ZXJmYWNlIEdlbmVyaWNEZXNjcmlwdG9yIHsKKyAgICBNZXNzYWdlIHRvUHJvdG8oKTsKKyAgICBTdHJpbmcgZ2V0TmFtZSgpOworICAgIFN0cmluZyBnZXRGdWxsTmFtZSgpOworICAgIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKTsKKyAgfQorCisgIC8qKgorICAgKiBUaHJvd24gd2hlbiBidWlsZGluZyBkZXNjcmlwdG9ycyBmYWlscyBiZWNhdXNlIHRoZSBzb3VyY2UgRGVzY3JpcHRvclByb3RvcworICAgKiBhcmUgbm90IHZhbGlkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTc1MDIwNTc3NTQ5MDQ4MzE0OEw7CisKKyAgICAvKiogR2V0cyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2JsZW1TeW1ib2xOYW1lKCkgeyByZXR1cm4gbmFtZTsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW52YWxpZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldFByb2JsZW1Qcm90bygpIHsgcmV0dXJuIHByb3RvOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7IHJldHVybiBkZXNjcmlwdGlvbjsgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2UgcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgICBwcml2YXRlIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBwcm9ibGVtRGVzY3JpcHRvciwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICBzdXBlcihwcm9ibGVtRGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpICsgIjogIiArIGRlc2NyaXB0aW9uKTsKKworICAgICAgLy8gTm90ZSB0aGF0IHByb2JsZW1EZXNjcmlwdG9yIG1heSBiZSBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZCwgc28gd2UKKyAgICAgIC8vIGRvbid0IHdhbnQgdG8gZXhwb3NlIGl0IGRpcmVjdGx5IHRvIHRoZSB1c2VyLiAgU28sIHdlIG9ubHkgcHJvdmlkZQorICAgICAgLy8gdGhlIG5hbWUgYW5kIHRoZSBvcmlnaW5hbCBwcm90by4KKyAgICAgIG5hbWUgPSBwcm9ibGVtRGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpOworICAgICAgcHJvdG8gPSBwcm9ibGVtRGVzY3JpcHRvci50b1Byb3RvKCk7CisgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcHJvYmxlbURlc2NyaXB0b3IsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICB0aGlzKHByb2JsZW1EZXNjcmlwdG9yLCBkZXNjcmlwdGlvbik7CisgICAgICBpbml0Q2F1c2UoY2F1c2UpOworICAgIH0KKworICAgIHByaXZhdGUgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIHByb2JsZW1EZXNjcmlwdG9yLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgIHN1cGVyKHByb2JsZW1EZXNjcmlwdG9yLmdldE5hbWUoKSArICI6ICIgKyBkZXNjcmlwdGlvbik7CisKKyAgICAgIC8vIE5vdGUgdGhhdCBwcm9ibGVtRGVzY3JpcHRvciBtYXkgYmUgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQsIHNvIHdlCisgICAgICAvLyBkb24ndCB3YW50IHRvIGV4cG9zZSBpdCBkaXJlY3RseSB0byB0aGUgdXNlci4gIFNvLCB3ZSBvbmx5IHByb3ZpZGUKKyAgICAgIC8vIHRoZSBuYW1lIGFuZCB0aGUgb3JpZ2luYWwgcHJvdG8uCisgICAgICBuYW1lID0gcHJvYmxlbURlc2NyaXB0b3IuZ2V0TmFtZSgpOworICAgICAgcHJvdG8gPSBwcm9ibGVtRGVzY3JpcHRvci50b1Byb3RvKCk7CisgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogQSBwcml2YXRlIGhlbHBlciBjbGFzcyB3aGljaCBjb250YWlucyBsb29rdXAgdGFibGVzIGNvbnRhaW5pbmcgYWxsIHRoZQorICAgKiBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGEgcGFydGljdWxhciBmaWxlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGVzY3JpcHRvclBvb2wgeworICAgIAorICAgIC8qKiBEZWZpbmVzIHdoYXQgc3ViY2xhc3Mgb2YgZGVzY3JpcHRvcnMgdG8gc2VhcmNoIGluIHRoZSBkZXNjcmlwdG9yIHBvb2wuIAorICAgICAqLworICAgIGVudW0gU2VhcmNoRmlsdGVyIHsKKyAgICAgIFRZUEVTX09OTFksIEFHR1JFR0FURVNfT05MWSwgQUxMX1NZTUJPTFMKKyAgICB9CisgICAgCisgICAgRGVzY3JpcHRvclBvb2woZmluYWwgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMpIHsKKyAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hTZXQ8RmlsZURlc2NyaXB0b3I+KCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmNpZXNbaV0pOworICAgICAgICBpbXBvcnRQdWJsaWNEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzW2ldKTsKKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBGaWxlRGVzY3JpcHRvciBkZXBlbmRlbmN5IDogdGhpcy5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBhZGRQYWNrYWdlKGRlcGVuZGVuY3kuZ2V0UGFja2FnZSgpLCBkZXBlbmRlbmN5KTsKKyAgICAgICAgfSBjYXRjaCAoRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgIC8vIENhbid0IGhhcHBlbiwgYmVjYXVzZSBhZGRQYWNrYWdlKCkgb25seSBmYWlscyB3aGVuIHRoZSBuYW1lCisgICAgICAgICAgLy8gY29uZmxpY3RzIHdpdGggYSBub24tcGFja2FnZSwgYnV0IHdlIGhhdmUgbm90IHlldCBhZGRlZCBhbnkKKyAgICAgICAgICAvLyBub24tcGFja2FnZXMgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogRmluZCBhbmQgcHV0IHB1YmxpYyBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgaW50byBkZXBlbmRlbmNpZXMgc2V0LiovCisgICAgcHJpdmF0ZSB2b2lkIGltcG9ydFB1YmxpY0RlcGVuZGVuY2llcyhmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlKSB7CisgICAgICBmb3IgKEZpbGVEZXNjcmlwdG9yIGRlcGVuZGVuY3kgOiBmaWxlLmdldFB1YmxpY0RlcGVuZGVuY2llcygpKSB7CisgICAgICAgIGlmIChkZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpKSB7CisgICAgICAgICAgaW1wb3J0UHVibGljRGVwZW5kZW5jaWVzKGRlcGVuZGVuY3kpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8RmlsZURlc2NyaXB0b3I+IGRlcGVuZGVuY2llczsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgR2VuZXJpY0Rlc2NyaXB0b3I+IGRlc2NyaXB0b3JzQnlOYW1lID0KKyAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgR2VuZXJpY0Rlc2NyaXB0b3I+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8RGVzY3JpcHRvckludFBhaXIsIEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzQnlOdW1iZXIgPQorICAgICAgbmV3IEhhc2hNYXA8RGVzY3JpcHRvckludFBhaXIsIEZpZWxkRGVzY3JpcHRvcj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxEZXNjcmlwdG9ySW50UGFpciwgRW51bVZhbHVlRGVzY3JpcHRvcj4gZW51bVZhbHVlc0J5TnVtYmVyCisgICAgICAgID0gbmV3IEhhc2hNYXA8RGVzY3JpcHRvckludFBhaXIsIEVudW1WYWx1ZURlc2NyaXB0b3I+KCk7CisKKyAgICAvKiogRmluZCBhIGdlbmVyaWMgZGVzY3JpcHRvciBieSBmdWxseS1xdWFsaWZpZWQgbmFtZS4gKi8KKyAgICBHZW5lcmljRGVzY3JpcHRvciBmaW5kU3ltYm9sKGZpbmFsIFN0cmluZyBmdWxsTmFtZSkgeworICAgICAgcmV0dXJuIGZpbmRTeW1ib2woZnVsbE5hbWUsIFNlYXJjaEZpbHRlci5BTExfU1lNQk9MUyk7CisgICAgfQorICAgIAorICAgIC8qKiBGaW5kIGEgZGVzY3JpcHRvciBieSBmdWxseS1xdWFsaWZpZWQgbmFtZSBhbmQgZ2l2ZW4gb3B0aW9uIHRvIG9ubHkgCisgICAgICogc2VhcmNoIHZhbGlkIGZpZWxkIHR5cGUgZGVzY3JpcHRvcnMuIAorICAgICAqLworICAgIEdlbmVyaWNEZXNjcmlwdG9yIGZpbmRTeW1ib2woZmluYWwgU3RyaW5nIGZ1bGxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VhcmNoRmlsdGVyIGZpbHRlcikgeworICAgICAgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gZGVzY3JpcHRvcnNCeU5hbWUuZ2V0KGZ1bGxOYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGZpbHRlcj09U2VhcmNoRmlsdGVyLkFMTF9TWU1CT0xTKSB8fAorICAgICAgICAgICAgKChmaWx0ZXI9PVNlYXJjaEZpbHRlci5UWVBFU19PTkxZKSAmJiBpc1R5cGUocmVzdWx0KSkgfHwKKyAgICAgICAgICAgICgoZmlsdGVyPT1TZWFyY2hGaWx0ZXIuQUdHUkVHQVRFU19PTkxZKSAmJiBpc0FnZ3JlZ2F0ZShyZXN1bHQpKSkgeworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBGaWxlRGVzY3JpcHRvciBkZXBlbmRlbmN5IDogZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHJlc3VsdCA9IGRlcGVuZGVuY3kucG9vbC5kZXNjcmlwdG9yc0J5TmFtZS5nZXQoZnVsbE5hbWUpOworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAoKGZpbHRlcj09U2VhcmNoRmlsdGVyLkFMTF9TWU1CT0xTKSB8fAorICAgICAgICAgICAgICAoKGZpbHRlcj09U2VhcmNoRmlsdGVyLlRZUEVTX09OTFkpICYmIGlzVHlwZShyZXN1bHQpKSB8fAorICAgICAgICAgICAgICAoKGZpbHRlcj09U2VhcmNoRmlsdGVyLkFHR1JFR0FURVNfT05MWSkgJiYgaXNBZ2dyZWdhdGUocmVzdWx0KSkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKiBDaGVja3MgaWYgdGhlIGRlc2NyaXB0b3IgaXMgYSB2YWxpZCB0eXBlIGZvciBhIG1lc3NhZ2UgZmllbGQuICovCisgICAgYm9vbGVhbiBpc1R5cGUoR2VuZXJpY0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgcmV0dXJuIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgfHwgCisgICAgICAgIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IpOworICAgIH0KKyAgICAKKyAgICAvKiogQ2hlY2tzIGlmIHRoZSBkZXNjcmlwdG9yIGlzIGEgdmFsaWQgbmFtZXNwYWNlIHR5cGUuICovCisgICAgYm9vbGVhbiBpc0FnZ3JlZ2F0ZShHZW5lcmljRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICByZXR1cm4gKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB8fCAKKyAgICAgICAgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBFbnVtRGVzY3JpcHRvcikgfHwgCisgICAgICAgIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUGFja2FnZURlc2NyaXB0b3IpIHx8IAorICAgICAgICAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFNlcnZpY2VEZXNjcmlwdG9yKTsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogTG9vayB1cCBhIHR5cGUgZGVzY3JpcHRvciBieSBuYW1lLCByZWxhdGl2ZSB0byBzb21lIG90aGVyIGRlc2NyaXB0b3IuCisgICAgICogVGhlIG5hbWUgbWF5IGJlIGZ1bGx5LXF1YWxpZmllZCAod2l0aCBhIGxlYWRpbmcgJy4nKSwKKyAgICAgKiBwYXJ0aWFsbHktcXVhbGlmaWVkLCBvciB1bnF1YWxpZmllZC4gIEMrKy1saWtlIG5hbWUgbG9va3VwIHNlbWFudGljcworICAgICAqIGFyZSB1c2VkIHRvIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgR2VuZXJpY0Rlc2NyaXB0b3IgbG9va3VwU3ltYm9sKGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZWxhdGl2ZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yUG9vbC5TZWFyY2hGaWx0ZXIgZmlsdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAvLyBUT0RPKGtlbnRvbik6ICBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBpbiBhIG51bWJlciBvZiB3YXlzLgorCisgICAgICBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQ7CisgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUuCisgICAgICAgIHJlc3VsdCA9IGZpbmRTeW1ib2wobmFtZS5zdWJzdHJpbmcoMSksIGZpbHRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiAibmFtZSIgaXMgYSBjb21wb3VuZCBpZGVudGlmaWVyLCB3ZSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlCisgICAgICAgIC8vIGZpcnN0IGNvbXBvbmVudCBvZiBpdCwgdGhlbiBzZWFyY2ggd2l0aGluIGl0IGZvciB0aGUgcmVzdC4KKyAgICAgICAgLy8gSWYgbmFtZSBpcyBzb21ldGhpbmcgbGlrZSAiRm9vLkJhci5iYXoiLCBhbmQgc3ltYm9scyBuYW1lZCAiRm9vIiBhcmUKKyAgICAgICAgLy8gZGVmaW5lZCBpbiBtdWx0aXBsZSBwYXJlbnQgc2NvcGVzLCB3ZSBvbmx5IHdhbnQgdG8gZmluZCAiQmFyLmJheiIgaW4KKyAgICAgICAgLy8gdGhlIGlubmVybW9zdCBvbmUuICBFLmcuLCB0aGUgZm9sbG93aW5nIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yOgorICAgICAgICAvLyAgIG1lc3NhZ2UgQmFyIHsgbWVzc2FnZSBCYXoge30gfQorICAgICAgICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgICAgICAgLy8gICAgIG1lc3NhZ2UgQmFyIHsKKyAgICAgICAgLy8gICAgIH0KKyAgICAgICAgLy8gICAgIG9wdGlvbmFsIEJhci5CYXogYmF6ID0gMTsKKyAgICAgICAgLy8gICB9CisgICAgICAgIC8vIFNvLCB3ZSBsb29rIGZvciBqdXN0ICJGb28iIGZpcnN0LCB0aGVuIGxvb2sgZm9yICJCYXIuYmF6IiB3aXRoaW4gaXQKKyAgICAgICAgLy8gaWYgZm91bmQuCisgICAgICAgIGZpbmFsIGludCBmaXJzdFBhcnRMZW5ndGggPSBuYW1lLmluZGV4T2YoJy4nKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0UGFydDsKKyAgICAgICAgaWYgKGZpcnN0UGFydExlbmd0aCA9PSAtMSkgeworICAgICAgICAgIGZpcnN0UGFydCA9IG5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmlyc3RQYXJ0ID0gbmFtZS5zdWJzdHJpbmcoMCwgZmlyc3RQYXJ0TGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHdpbGwgc2VhcmNoIGVhY2ggcGFyZW50IHNjb3BlIG9mICJyZWxhdGl2ZVRvIiBsb29raW5nIGZvciB0aGUKKyAgICAgICAgLy8gc3ltYm9sLgorICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNjb3BlVG9UcnkgPQorICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIocmVsYXRpdmVUby5nZXRGdWxsTmFtZSgpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIC8vIENob3Agb2ZmIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgc2NvcGUuCisgICAgICAgICAgZmluYWwgaW50IGRvdHBvcyA9IHNjb3BlVG9UcnkubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgICBpZiAoZG90cG9zID09IC0xKSB7CisgICAgICAgICAgICByZXN1bHQgPSBmaW5kU3ltYm9sKG5hbWUsIGZpbHRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NvcGVUb1RyeS5zZXRMZW5ndGgoZG90cG9zICsgMSk7CisKKyAgICAgICAgICAgIC8vIEFwcGVuZCBmaXJzdFBhcnQgYW5kIHRyeSB0byBmaW5kCisgICAgICAgICAgICBzY29wZVRvVHJ5LmFwcGVuZChmaXJzdFBhcnQpOworICAgICAgICAgICAgcmVzdWx0ID0gZmluZFN5bWJvbChzY29wZVRvVHJ5LnRvU3RyaW5nKCksIAorICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sLlNlYXJjaEZpbHRlci5BR0dSRUdBVEVTX09OTFkpOworCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgaWYgKGZpcnN0UGFydExlbmd0aCAhPSAtMSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgZm91bmQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN5bWJvbC4gIE5vdyBsb29rIGZvcgorICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSB0aGluZy4gIElmIHRoaXMgZmFpbHMsIHdlICpkb24ndCogd2FudCB0byBrZWVwCisgICAgICAgICAgICAgICAgLy8gc2VhcmNoaW5nIHBhcmVudCBzY29wZXMuCisgICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5zZXRMZW5ndGgoZG90cG9zICsgMSk7CisgICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmluZFN5bWJvbChzY29wZVRvVHJ5LnRvU3RyaW5nKCksIGZpbHRlcik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vdCBmb3VuZC4gIFJlbW92ZSB0aGUgbmFtZSBzbyB3ZSBjYW4gdHJ5IGFnYWluLgorICAgICAgICAgICAgc2NvcGVUb1RyeS5zZXRMZW5ndGgoZG90cG9zKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihyZWxhdGl2ZVRvLAorICAgICAgICAgICAgJ1wiJyArIG5hbWUgKyAiXCIgaXMgbm90IGRlZmluZWQuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIElmIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAqIGFscmVhZHkgZXhpc3RzLCB0aHJvd3MgYW4gZXJyb3IuCisgICAgICovCisgICAgdm9pZCBhZGRTeW1ib2woZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB2YWxpZGF0ZVN5bWJvbE5hbWUoZGVzY3JpcHRvcik7CisKKyAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9IGRlc2NyaXB0b3IuZ2V0RnVsbE5hbWUoKTsKKyAgICAgIGZpbmFsIGludCBkb3Rwb3MgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZignLicpOworCisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBvbGQgPSBkZXNjcmlwdG9yc0J5TmFtZS5wdXQoZnVsbE5hbWUsIGRlc2NyaXB0b3IpOworICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lLnB1dChmdWxsTmFtZSwgb2xkKTsKKworICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXRGaWxlKCkgPT0gb2xkLmdldEZpbGUoKSkgeworICAgICAgICAgIGlmIChkb3Rwb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICdcIicgKyBmdWxsTmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQuIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICdcIicgKyBmdWxsTmFtZS5zdWJzdHJpbmcoZG90cG9zICsgMSkgKworICAgICAgICAgICAgICAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiIiArCisgICAgICAgICAgICAgIGZ1bGxOYW1lLnN1YnN0cmluZygwLCBkb3Rwb3MpICsgIlwiLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgJ1wiJyArIGZ1bGxOYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlIFwiIiArCisgICAgICAgICAgICBvbGQuZ2V0RmlsZSgpLmdldE5hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBwYWNrYWdlIGluIHRoZSBzeW1ib2wgdGFibGUuICBXZSB1c2UgUGFja2FnZURlc2NyaXB0b3JzCisgICAgICoganVzdCBhcyBwbGFjZWhvbGRlcnMgc28gdGhhdCBzb21lb25lIGNhbm5vdCBkZWZpbmUsIHNheSwgYSBtZXNzYWdlIHR5cGUKKyAgICAgKiB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGFja2FnZURlc2NyaXB0b3IgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciB7CisgICAgICBwdWJsaWMgTWVzc2FnZSB0b1Byb3RvKCkgICAgICAgIHsgcmV0dXJuIGZpbGUudG9Qcm90bygpOyB9CisgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSAgICAgICAgIHsgcmV0dXJuIG5hbWU7ICAgICAgICAgICB9CisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgICAgIHsgcmV0dXJuIGZ1bGxOYW1lOyAgICAgICB9CisgICAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7ICAgICAgICAgICB9CisKKyAgICAgIFBhY2thZ2VEZXNjcmlwdG9yKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZnVsbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOworICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYWNrYWdlIHRvIHRoZSBzeW1ib2wgdGFibGVzLiAgSWYgYSBwYWNrYWdlIGJ5IHRoZSBzYW1lIG5hbWUKKyAgICAgKiBhbHJlYWR5IGV4aXN0cywgdGhhdCBpcyBmaW5lLCBidXQgaWYgc29tZSBvdGhlciBraW5kIG9mIHN5bWJvbCBleGlzdHMKKyAgICAgKiB1bmRlciB0aGUgc2FtZSBuYW1lLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgSWYgdGhlIHBhY2thZ2UgaGFzCisgICAgICogbXVsdGlwbGUgY29tcG9uZW50cywgdGhpcyBhbHNvIGFkZHMgdGhlIHBhcmVudCBwYWNrYWdlKHMpLgorICAgICAqLworICAgIHZvaWQgYWRkUGFja2FnZShmaW5hbCBTdHJpbmcgZnVsbE5hbWUsIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUpCisgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIGludCBkb3Rwb3MgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgICBpZiAoZG90cG9zID09IC0xKSB7CisgICAgICAgIG5hbWUgPSBmdWxsTmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFkZFBhY2thZ2UoZnVsbE5hbWUuc3Vic3RyaW5nKDAsIGRvdHBvcyksIGZpbGUpOworICAgICAgICBuYW1lID0gZnVsbE5hbWUuc3Vic3RyaW5nKGRvdHBvcyArIDEpOworICAgICAgfQorCisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBvbGQgPQorICAgICAgICBkZXNjcmlwdG9yc0J5TmFtZS5wdXQoZnVsbE5hbWUsCisgICAgICAgICAgbmV3IFBhY2thZ2VEZXNjcmlwdG9yKG5hbWUsIGZ1bGxOYW1lLCBmaWxlKSk7CisgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgZGVzY3JpcHRvcnNCeU5hbWUucHV0KGZ1bGxOYW1lLCBvbGQpOworICAgICAgICBpZiAoIShvbGQgaW5zdGFuY2VvZiBQYWNrYWdlRGVzY3JpcHRvcikpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZmlsZSwKKyAgICAgICAgICAgICAgJ1wiJyArIG5hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhICIKKyAgICAgICAgICAgICAgKyAicGFja2FnZSkgaW4gZmlsZSBcIiIgKyBvbGQuZ2V0RmlsZSgpLmdldE5hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKiBBIChHZW5lcmljRGVzY3JpcHRvciwgaW50KSBwYWlyLCB1c2VkIGFzIGEgbWFwIGtleS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9ySW50UGFpciB7CisgICAgICBwcml2YXRlIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgICBwcml2YXRlIGZpbmFsIGludCBudW1iZXI7CisKKyAgICAgIERlc2NyaXB0b3JJbnRQYWlyKGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuaGFzaENvZGUoKSAqICgoMSA8PCAxNikgLSAxKSArIG51bWJlcjsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGVzY3JpcHRvckludFBhaXIpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIERlc2NyaXB0b3JJbnRQYWlyIG90aGVyID0gKERlc2NyaXB0b3JJbnRQYWlyKW9iajsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IgPT0gb3RoZXIuZGVzY3JpcHRvciAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmaWVsZCB0byB0aGUgZmllbGRzQnlOdW1iZXIgdGFibGUuICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGEKKyAgICAgKiBmaWVsZCB3aXRoIHRoZSBzYW1lIGNvbnRhaW5pbmcgdHlwZSBhbmQgbnVtYmVyIGFscmVhZHkgZXhpc3RzLgorICAgICAqLworICAgIHZvaWQgYWRkRmllbGRCeU51bWJlcihmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpCisgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIERlc2NyaXB0b3JJbnRQYWlyIGtleSA9CisgICAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcihmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpLCBmaWVsZC5nZXROdW1iZXIoKSk7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3Igb2xkID0gZmllbGRzQnlOdW1iZXIucHV0KGtleSwgZmllbGQpOworICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgIGZpZWxkc0J5TnVtYmVyLnB1dChrZXksIG9sZCk7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihmaWVsZCwKKyAgICAgICAgICAiRmllbGQgbnVtYmVyICIgKyBmaWVsZC5nZXROdW1iZXIoKSArCisgICAgICAgICAgImhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiBcIiIgKworICAgICAgICAgIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCisgICAgICAgICAgIlwiIGJ5IGZpZWxkIFwiIiArIG9sZC5nZXROYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBlbnVtIHZhbHVlIHRvIHRoZSBlbnVtVmFsdWVzQnlOdW1iZXIgdGFibGUuICBJZiBhbiBlbnVtIHZhbHVlCisgICAgICogd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCBudW1iZXIgYWxyZWFkeSBleGlzdHMsIGRvZXMgbm90aGluZy4gIChUaGlzIGlzCisgICAgICogYWxsb3dlZDsgdGhlIGZpcnN0IHZhbHVlIGRlZmluZSB3aXRoIHRoZSBudW1iZXIgdGFrZXMgcHJlY2VkZW5jZS4pCisgICAgICovCisgICAgdm9pZCBhZGRFbnVtVmFsdWVCeU51bWJlcihmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yIHZhbHVlKSB7CisgICAgICBmaW5hbCBEZXNjcmlwdG9ySW50UGFpciBrZXkgPQorICAgICAgICBuZXcgRGVzY3JpcHRvckludFBhaXIodmFsdWUuZ2V0VHlwZSgpLCB2YWx1ZS5nZXROdW1iZXIoKSk7CisgICAgICBmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yIG9sZCA9IGVudW1WYWx1ZXNCeU51bWJlci5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgZW51bVZhbHVlc0J5TnVtYmVyLnB1dChrZXksIG9sZCk7CisgICAgICAgIC8vIE5vdCBhbiBlcnJvcjogIE11bHRpcGxlIGVudW0gdmFsdWVzIG1heSBoYXZlIHRoZSBzYW1lIG51bWJlciwgYnV0CisgICAgICAgIC8vIHdlIG9ubHkgd2FudCB0aGUgZmlyc3Qgb25lIGluIHRoZSBtYXAuCisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCB0aGUgZGVzY3JpcHRvcidzIG5hbWUgaXMgdmFsaWQgKGkuZS4gaXQgY29udGFpbnMgb25seQorICAgICAqIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLCBhbmQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0KS4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCB2YWxpZGF0ZVN5bWJvbE5hbWUoZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7CisgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLCAiTWlzc2luZyBuYW1lLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgZmluYWwgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgLy8gTm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIG5vdCB2YWxpZCBpbiBwcm90b2J1ZiBpZGVudGlmaWVycywgZXZlbgorICAgICAgICAgIC8vIGlmIHRoZXkgYXJlIGxldHRlcnMgb3IgZGlnaXRzLgorICAgICAgICAgIGlmIChjID49IDEyOCkgeworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gRmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgbGV0dGVyIG9yIF8uICBTdWJzZXF1ZW50IGNoYXJhY3RlcnMgbWF5CisgICAgICAgICAgLy8gYmUgbGV0dGVycywgbnVtYmVycywgb3IgZGlnaXRzLgorICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgfHwgYyA9PSAnXycgfHwKKyAgICAgICAgICAgICAgKENoYXJhY3Rlci5pc0RpZ2l0KGMpICYmIGkgPiAwKSkgeworICAgICAgICAgICAgLy8gVmFsaWQKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2YWxpZCkgeworICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAnXCInICsgbmFtZSArICJcIiBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjOWZjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRHluYW1pY01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDQ4MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNZXNzYWdlfSB0aGF0IGNhbiByZXByZXNlbnQgYXJiaXRyYXJ5IHR5cGVzLAorICogZ2l2ZW4gYSB7QGxpbmsgRGVzY3JpcHRvcnMuRGVzY3JpcHRvcn0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIER5bmFtaWNNZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlIHsKKyAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIHR5cGU7CisgIHByaXZhdGUgZmluYWwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBmaWVsZHM7CisgIHByaXZhdGUgZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHM7CisgIHByaXZhdGUgaW50IG1lbW9pemVkU2l6ZSA9IC0xOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgRHluYW1pY01lc3NhZ2V9IHVzaW5nIHRoZSBnaXZlbiB7QGNvZGUgRmllbGRTZXR9LgorICAgKi8KKyAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZShEZXNjcmlwdG9yIHR5cGUsIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLmZpZWxkcyA9IGZpZWxkczsKKyAgICB0aGlzLnVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzOworICB9CisKKyAgLyoqCisgICAqIEdldCBhIHtAY29kZSBEeW5hbWljTWVzc2FnZX0gcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZQorICAgKiBnaXZlbiB0eXBlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBnZXREZWZhdWx0SW5zdGFuY2UoRGVzY3JpcHRvciB0eXBlKSB7CisgICAgcmV0dXJuIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBGaWVsZFNldC48RmllbGREZXNjcmlwdG9yPmVtcHR5U2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICB9CisKKyAgLyoqIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0uICovCisgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkUGFyc2VkKCk7CisgIH0KKworICAvKiogUGFyc2UgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4gKi8KKyAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oCisgICAgICBEZXNjcmlwdG9yIHR5cGUsCisgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLmJ1aWxkUGFyc2VkKCk7CisgIH0KKworICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJuIGl0LiAqLworICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIEJ5dGVTdHJpbmcgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkUGFyc2VkKCk7CisgIH0KKworICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJuIGl0LiAqLworICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIEJ5dGVTdHJpbmcgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGRQYXJzZWQoKTsKKyAgfQorCisgIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm4gaXQuICovCisgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgYnl0ZVtdIGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShkYXRhKS5idWlsZFBhcnNlZCgpOworICB9CisKKyAgLyoqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHJldHVybiBpdC4gKi8KKyAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBieXRlW10gZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGRQYXJzZWQoKTsKKyAgfQorCisgIC8qKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCByZXR1cm4gaXQuICovCisgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGlucHV0KS5idWlsZFBhcnNlZCgpOworICB9CisKKyAgLyoqIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIHJldHVybiBpdC4gKi8KKyAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGRQYXJzZWQoKTsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3QgYSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBmb3IgdGhlIGdpdmVuIHR5cGUuICovCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKERlc2NyaXB0b3IgdHlwZSkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcih0eXBlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBmb3IgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgYXMKKyAgICoge0Bjb2RlIHByb3RvdHlwZX0sIGFuZCBpbml0aWFsaXplIGl0IHdpdGgge0Bjb2RlIHByb3RvdHlwZX0ncyBjb250ZW50cy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKE1lc3NhZ2UgcHJvdG90eXBlKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpKS5tZXJnZUZyb20ocHJvdG90eXBlKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2UgaW50ZXJmYWNlLgorCisgIHB1YmxpYyBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgeworICAgIHJldHVybiB0eXBlOworICB9CisKKyAgcHVibGljIER5bmFtaWNNZXNzYWdlIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7CisgICAgcmV0dXJuIGdldERlZmF1bHRJbnN0YW5jZSh0eXBlKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKKyAgICByZXR1cm4gZmllbGRzLmdldEFsbEZpZWxkcygpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgIHJldHVybiBmaWVsZHMuaGFzRmllbGQoZmllbGQpOworICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgT2JqZWN0IHJlc3VsdCA9IGZpZWxkcy5nZXRGaWVsZChmaWVsZCk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgIHJlc3VsdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgfSBlbHNlIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgIHJlc3VsdCA9IGdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgIHJldHVybiBmaWVsZHMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgeworICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICByZXR1cm4gZmllbGRzLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKKyAgfQorCisgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKKyAgICByZXR1cm4gdW5rbm93bkZpZWxkczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZChEZXNjcmlwdG9yIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkcykgeworICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KKyAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IHR5cGUuZ2V0RmllbGRzKCkpIHsKKyAgICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgaWYgKCFmaWVsZHMuaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgcmV0dXJuIGZpZWxkcy5pc0luaXRpYWxpemVkKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICByZXR1cm4gaXNJbml0aWFsaXplZCh0eXBlLCBmaWVsZHMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICh0eXBlLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpKSB7CisgICAgICBmaWVsZHMud3JpdGVNZXNzYWdlU2V0VG8ob3V0cHV0KTsKKyAgICAgIHVua25vd25GaWVsZHMud3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOworICAgIH0gZWxzZSB7CisgICAgICBmaWVsZHMud3JpdGVUbyhvdXRwdXQpOworICAgICAgdW5rbm93bkZpZWxkcy53cml0ZVRvKG91dHB1dCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7CisgICAgaW50IHNpemUgPSBtZW1vaXplZFNpemU7CisgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOworCisgICAgaWYgKHR5cGUuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkpIHsKKyAgICAgIHNpemUgPSBmaWVsZHMuZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZSA9IGZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZSgpOworICAgICAgc2l6ZSArPSB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgfQorCisgICAgbWVtb2l6ZWRTaXplID0gc2l6ZTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIHB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcih0eXBlKTsKKyAgfQorCisgIHB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlckZvclR5cGUoKS5tZXJnZUZyb20odGhpcyk7CisgIH0KKworICBwdWJsaWMgUGFyc2VyPER5bmFtaWNNZXNzYWdlPiBnZXRQYXJzZXJGb3JUeXBlKCkgeworICAgIHJldHVybiBuZXcgQWJzdHJhY3RQYXJzZXI8RHluYW1pY01lc3NhZ2U+KCkgeworICAgICAgcHVibGljIER5bmFtaWNNZXNzYWdlIHBhcnNlUGFydGlhbEZyb20oCisgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIodHlwZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgYnVpbGRlci5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSkKKyAgICAgICAgICAgICAgLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgICAgfQorICAgIH07CisgIH0KKworICAvKiogVmVyaWZpZXMgdGhhdCB0aGUgZmllbGQgaXMgYSBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuICovCisgIHByaXZhdGUgdm9pZCB2ZXJpZnlDb250YWluaW5nVHlwZShGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgRHluYW1pY01lc3NhZ2V9cy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXI+IHsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgdHlwZTsKKyAgICBwcml2YXRlIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzOworICAgIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHM7CisKKyAgICAvKiogQ29uc3RydWN0IGEge0Bjb2RlIEJ1aWxkZXJ9IGZvciB0aGUgZ2l2ZW4gdHlwZS4gKi8KKyAgICBwcml2YXRlIEJ1aWxkZXIoRGVzY3JpcHRvciB0eXBlKSB7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy5maWVsZHMgPSBGaWVsZFNldC5uZXdGaWVsZFNldCgpOworICAgICAgdGhpcy51bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2UuQnVpbGRlciBpbnRlcmZhY2UuCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBjbGVhcigpIHsKKyAgICAgIGlmIChmaWVsZHMuaXNJbW11dGFibGUoKSkgeworICAgICAgICBmaWVsZHMgPSBGaWVsZFNldC5uZXdGaWVsZFNldCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmllbGRzLmNsZWFyKCk7CisgICAgICB9CisgICAgICB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKE1lc3NhZ2Ugb3RoZXIpIHsKKyAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIER5bmFtaWNNZXNzYWdlKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHNvbWV3aGF0IGZhc3RlciB0aGFuIGNhbGxpbmcgc3VwZXIubWVyZ2VGcm9tKCkuCisgICAgICAgIER5bmFtaWNNZXNzYWdlIG90aGVyRHluYW1pY01lc3NhZ2UgPSAoRHluYW1pY01lc3NhZ2UpIG90aGVyOworICAgICAgICBpZiAob3RoZXJEeW5hbWljTWVzc2FnZS50eXBlICE9IHR5cGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgIm1lcmdlRnJvbShNZXNzYWdlKSBjYW4gb25seSBtZXJnZSBtZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlLiIpOworICAgICAgICB9CisgICAgICAgIGVuc3VyZUlzTXV0YWJsZSgpOworICAgICAgICBmaWVsZHMubWVyZ2VGcm9tKG90aGVyRHluYW1pY01lc3NhZ2UuZmllbGRzKTsKKyAgICAgICAgbWVyZ2VVbmtub3duRmllbGRzKG90aGVyRHluYW1pY01lc3NhZ2UudW5rbm93bkZpZWxkcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShvdGhlcik7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIER5bmFtaWNNZXNzYWdlIGJ1aWxkKCkgeworICAgICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oCisgICAgICAgICAgbmV3IER5bmFtaWNNZXNzYWdlKHR5cGUsIGZpZWxkcywgdW5rbm93bkZpZWxkcykpOworICAgICAgfQorICAgICAgcmV0dXJuIGJ1aWxkUGFydGlhbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBmb3IgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKCkgbWV0aG9kcyB0byBjYWxsLiAgVGhyb3dzCisgICAgICoge0BsaW5rIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0gaW5zdGVhZCBvZgorICAgICAqIHtAbGluayBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZSBidWlsZFBhcnNlZCgpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oCisgICAgICAgICAgICBuZXcgRHluYW1pY01lc3NhZ2UodHlwZSwgZmllbGRzLCB1bmtub3duRmllbGRzKSkKKyAgICAgICAgICAuYXNJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBidWlsZFBhcnRpYWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRHluYW1pY01lc3NhZ2UgYnVpbGRQYXJ0aWFsKCkgeworICAgICAgZmllbGRzLm1ha2VJbW11dGFibGUoKTsKKyAgICAgIER5bmFtaWNNZXNzYWdlIHJlc3VsdCA9CisgICAgICAgIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBmaWVsZHMsIHVua25vd25GaWVsZHMpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKKyAgICAgIEJ1aWxkZXIgcmVzdWx0ID0gbmV3IEJ1aWxkZXIodHlwZSk7CisgICAgICByZXN1bHQuZmllbGRzLm1lcmdlRnJvbShmaWVsZHMpOworICAgICAgcmVzdWx0Lm1lcmdlVW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICAgIHJldHVybiBEeW5hbWljTWVzc2FnZS5pc0luaXRpYWxpemVkKHR5cGUsIGZpZWxkcyk7CisgICAgfQorCisgICAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7CisgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRHluYW1pY01lc3NhZ2UgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKKyAgICAgIHJldHVybiBnZXREZWZhdWx0SW5zdGFuY2UodHlwZSk7CisgICAgfQorCisgICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgeworICAgICAgcmV0dXJuIGZpZWxkcy5nZXRBbGxGaWVsZHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisKKyAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIm5ld0J1aWxkZXJGb3JGaWVsZCBpcyBvbmx5IHZhbGlkIGZvciBmaWVsZHMgd2l0aCBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgIHJldHVybiBmaWVsZHMuaGFzRmllbGQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICBPYmplY3QgcmVzdWx0ID0gZmllbGRzLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICAgIHJlc3VsdCA9IGdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgZW5zdXJlSXNNdXRhYmxlKCk7CisgICAgICBmaWVsZHMuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICBlbnN1cmVJc011dGFibGUoKTsKKyAgICAgIGZpZWxkcy5jbGVhckZpZWxkKGZpZWxkKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgcmV0dXJuIGZpZWxkcy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgeworICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgcmV0dXJuIGZpZWxkcy5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgeworICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgZW5zdXJlSXNNdXRhYmxlKCk7CisgICAgICBmaWVsZHMuc2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgIGVuc3VyZUlzTXV0YWJsZSgpOworICAgICAgZmllbGRzLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKKyAgICAgIHJldHVybiB1bmtub3duRmllbGRzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKKyAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHM7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZVVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKKyAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9CisgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKHRoaXMudW5rbm93bkZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKiBWZXJpZmllcyB0aGF0IHRoZSBmaWVsZCBpcyBhIGZpZWxkIG9mIHRoaXMgbWVzc2FnZS4gKi8KKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmluZ1R5cGUoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUlzTXV0YWJsZSgpIHsKKyAgICAgIGlmIChmaWVsZHMuaXNJbW11dGFibGUoKSkgeworICAgICAgICBmaWVsZHMgPSBmaWVsZHMuY2xvbmUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlLkJ1aWxkZXIgZ2V0RmllbGRCdWlsZGVyKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgLy8gVE9ETyh4aWFuZ2wpOiBuZWVkIGltcGxlbWVudGF0aW9uIGZvciBkeW5hbWljIG1lc3NhZ2UKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgImdldEZpZWxkQnVpbGRlcigpIGNhbGxlZCBvbiBhIGR5bmFtaWMgbWVzc2FnZSB0eXBlLiIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjZiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvblJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSwyNjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgdGFibGUgb2Yga25vd24gZXh0ZW5zaW9ucywgc2VhcmNoYWJsZSBieSBuYW1lIG9yIGZpZWxkIG51bWJlci4gIFdoZW4KKyAqIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIHRoYXQgbWlnaHQgaGF2ZSBleHRlbnNpb25zLCB5b3UgbXVzdCBwcm92aWRlCisgKiBhbiB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnl9IGluIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYW55IGV4dGVuc2lvbnMKKyAqIHRoYXQgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBwYXJzZS4gIE90aGVyd2lzZSwgdGhvc2UgZXh0ZW5zaW9ucyB3aWxsIGp1c3QKKyAqIGJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcy4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgaWYgeW91IGhhZCB0aGUge0Bjb2RlIC5wcm90b30gZmlsZToKKyAqCisgKiA8cHJlPgorICogb3B0aW9uIGphdmFfY2xhc3MgPSAiTXlQcm90byI7CisgKgorICogbWVzc2FnZSBGb28geworICogICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworICogfQorICoKKyAqIGV4dGVuZCBGb28geworICogICBvcHRpb25hbCBpbnQzMiBiYXI7CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBUaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6CisgKgorICogPHByZT4KKyAqIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKKyAqIHJlZ2lzdHJ5LmFkZChNeVByb3RvLmJhcik7CisgKiBNeVByb3RvLkZvbyBtZXNzYWdlID0gTXlQcm90by5Gb28ucGFyc2VGcm9tKGlucHV0LCByZWdpc3RyeSk7CisgKiA8L3ByZT4KKyAqCisgKiA8cD5CYWNrZ3JvdW5kOgorICoKKyAqIDxwPllvdSBtaWdodCB3b25kZXIgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LiAgVHdvIGFsdGVybmF0aXZlcyBtaWdodCBjb21lIHRvCisgKiBtaW5kLiAgRmlyc3QsIHlvdSBtaWdodCBpbWFnaW5lIGEgc3lzdGVtIHdoZXJlIGdlbmVyYXRlZCBleHRlbnNpb25zIGFyZQorICogYXV0b21hdGljYWxseSByZWdpc3RlcmVkIHdoZW4gdGhlaXIgY29udGFpbmluZyBjbGFzc2VzIGFyZSBsb2FkZWQuICBUaGlzCisgKiBpcyBhIHBvcHVsYXIgdGVjaG5pcXVlLCBidXQgaXMgYmFkIGRlc2lnbjsgYW1vbmcgb3RoZXIgdGhpbmdzLCBpdCBjcmVhdGVzIGEKKyAqIHNpdHVhdGlvbiB3aGVyZSBiZWhhdmlvciBjYW4gY2hhbmdlIGRlcGVuZGluZyBvbiB3aGF0IGNsYXNzZXMgaGFwcGVuIHRvIGJlCisgKiBsb2FkZWQuICBJdCBhbHNvIGludHJvZHVjZXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LCBiZWNhdXNlIGFuCisgKiB1bnByaXZpbGVnZWQgY2xhc3MgY291bGQgY2F1c2UgaXRzIGNvZGUgdG8gYmUgY2FsbGVkIHVuZXhwZWN0ZWRseSBmcm9tIGEKKyAqIHByaXZpbGVnZWQgY2xhc3MgYnkgcmVnaXN0ZXJpbmcgaXRzZWxmIGFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgcmlnaHQgdHlwZS4KKyAqCisgKiA8cD5Bbm90aGVyIG9wdGlvbiB5b3UgbWlnaHQgY29uc2lkZXIgaXMgbGF6eSBwYXJzaW5nOiBkbyBub3QgcGFyc2UgYW4KKyAqIGV4dGVuc2lvbiB1bnRpbCBpdCBpcyBmaXJzdCByZXF1ZXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBjYWxsZXIgbXVzdAorICogcHJvdmlkZSBhIHR5cGUgdG8gdXNlLiAgVGhpcyBpbnRyb2R1Y2VzIGEgZGlmZmVyZW50IHNldCBvZiBwcm9ibGVtcy4gIEZpcnN0LAorICogaXQgd291bGQgcmVxdWlyZSBhIG11dGV4IGxvY2sgYW55IHRpbWUgYW4gZXh0ZW5zaW9uIHdhcyBhY2Nlc3NlZCwgd2hpY2gKKyAqIHdvdWxkIGJlIHNsb3cuICBTZWNvbmQsIGNvcnJ1cHQgZGF0YSB3b3VsZCBub3QgYmUgZGV0ZWN0ZWQgdW50aWwgZmlyc3QKKyAqIGFjY2VzcywgYXQgd2hpY2ggcG9pbnQgaXQgd291bGQgYmUgbXVjaCBoYXJkZXIgdG8gZGVhbCB3aXRoIGl0LiAgVGhpcmQsIGl0CisgKiBjb3VsZCB2aW9sYXRlIHRoZSBleHBlY3RhdGlvbiB0aGF0IG1lc3NhZ2Ugb2JqZWN0cyBhcmUgaW1tdXRhYmxlLCBzaW5jZSB0aGUKKyAqIHR5cGUgcHJvdmlkZWQgY291bGQgYmUgYW55IGFyYml0cmFyeSBtZXNzYWdlIGNsYXNzLiAgQW4gdW5wcml2aWxlZ2VkIHVzZXIKKyAqIGNvdWxkIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgdG8gaW5qZWN0IGEgbXV0YWJsZSBvYmplY3QgaW50byBhIG1lc3NhZ2UKKyAqIGJlbG9uZ2luZyB0byBwcml2aWxlZ2VkIGNvZGUgYW5kIGNyZWF0ZSBtaXNjaGllZi4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5kcyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgeworICAvKiogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBpbnN0YW5jZS4gKi8KKyAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeSBuZXdJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisgIH0KKworICAvKiogR2V0IHRoZSB1bm1vZGlmaWFibGUgc2luZ2xldG9uIGVtcHR5IGluc3RhbmNlLiAqLworICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEVtcHR5UmVnaXN0cnkoKSB7CisgICAgcmV0dXJuIEVNUFRZOworICB9CisKKyAgLyoqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHJlZ2lzdHJ5LiAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldFVubW9kaWZpYWJsZSgpIHsKKyAgICByZXR1cm4gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KHRoaXMpOworICB9CisKKyAgLyoqIEEgKERlc2NyaXB0b3IsIE1lc3NhZ2UpIHBhaXIsIHJldHVybmVkIGJ5IGxvb2t1cCBtZXRob2RzLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbkluZm8geworICAgIC8qKiBUaGUgZXh0ZW5zaW9uJ3MgZGVzY3JpcHRvci4gKi8KKyAgICBwdWJsaWMgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisKKyAgICAvKioKKyAgICAgKiBBIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbidzIHR5cGUsIGlmIGl0IGhhcyBhIG1lc3NhZ2UgdHlwZS4KKyAgICAgKiBPdGhlcndpc2UsIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2U7CisKKyAgICBwcml2YXRlIEV4dGVuc2lvbkluZm8oZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICBkZWZhdWx0SW5zdGFuY2UgPSBudWxsOworICAgIH0KKyAgICBwcml2YXRlIEV4dGVuc2lvbkluZm8oZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKSB7CisgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgICAgdGhpcy5kZWZhdWx0SW5zdGFuY2UgPSBkZWZhdWx0SW5zdGFuY2U7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbmQgYW4gZXh0ZW5zaW9uIGJ5IGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lLCBpbiB0aGUgcHJvdG8gbmFtZXNwYWNlLgorICAgKiBJLmUuIHtAY29kZSByZXN1bHQuZGVzY3JpcHRvci5mdWxsTmFtZSgpfSB3aWxsIG1hdGNoIHtAY29kZSBmdWxsTmFtZX0gaWYKKyAgICogYSBtYXRjaCBpcyBmb3VuZC4KKyAgICoKKyAgICogQHJldHVybiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0KKyAgICogICAgICAgICBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOYW1lKGZpbmFsIFN0cmluZyBmdWxsTmFtZSkgeworICAgIHJldHVybiBleHRlbnNpb25zQnlOYW1lLmdldChmdWxsTmFtZSk7CisgIH0KKworICAvKioKKyAgICogRmluZCBhbiBleHRlbnNpb24gYnkgY29udGFpbmluZyB0eXBlIGFuZCBmaWVsZCBudW1iZXIuCisgICAqCisgICAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4dGVuc2lvbiBpZiBmb3VuZCwgb3Ige0Bjb2RlIG51bGx9CisgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIEV4dGVuc2lvbkluZm8gZmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKKyAgICByZXR1cm4gZXh0ZW5zaW9uc0J5TnVtYmVyLmdldCgKKyAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcihjb250YWluaW5nVHlwZSwgZmllbGROdW1iZXIpKTsKKyAgfQorCisgIC8qKiBBZGQgYW4gZXh0ZW5zaW9uIGZyb20gYSBnZW5lcmF0ZWQgZmlsZSB0byB0aGUgcmVnaXN0cnkuICovCisgIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjw/LCA/PiBleHRlbnNpb24pIHsKKyAgICBpZiAoZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRKYXZhVHlwZSgpID09CisgICAgICAgIEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICBpZiAoZXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAiUmVnaXN0ZXJlZCBtZXNzYWdlLXR5cGUgZXh0ZW5zaW9uIGhhZCBudWxsIGRlZmF1bHQgaW5zdGFuY2U6ICIgKworICAgICAgICAgICAgZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGFkZChuZXcgRXh0ZW5zaW9uSW5mbyhleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgYWRkKG5ldyBFeHRlbnNpb25JbmZvKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCksIG51bGwpKTsKKyAgICB9CisgIH0KKworICAvKiogQWRkIGEgbm9uLW1lc3NhZ2UtdHlwZSBleHRlbnNpb24gdG8gdGhlIHJlZ2lzdHJ5IGJ5IGRlc2NyaXB0b3IuICovCisgIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgdHlwZSkgeworICAgIGlmICh0eXBlLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSBtdXN0IGJlIHByb3ZpZGVkIGEgZGVmYXVsdCBpbnN0YW5jZSB3aGVuICIgKworICAgICAgICAiYWRkaW5nIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZXh0ZW5zaW9uLiIpOworICAgIH0KKyAgICBhZGQobmV3IEV4dGVuc2lvbkluZm8odHlwZSwgbnVsbCkpOworICB9CisKKyAgLyoqIEFkZCBhIG1lc3NhZ2UtdHlwZSBleHRlbnNpb24gdG8gdGhlIHJlZ2lzdHJ5IGJ5IGRlc2NyaXB0b3IuICovCisgIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgdHlwZSwgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpIHsKKyAgICBpZiAodHlwZS5nZXRKYXZhVHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiRXh0ZW5zaW9uUmVnaXN0cnkuYWRkKCkgcHJvdmlkZWQgYSBkZWZhdWx0IGluc3RhbmNlIGZvciBhICIgKworICAgICAgICAibm9uLW1lc3NhZ2UgZXh0ZW5zaW9uLiIpOworICAgIH0KKyAgICBhZGQobmV3IEV4dGVuc2lvbkluZm8odHlwZSwgZGVmYXVsdEluc3RhbmNlKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBQcml2YXRlIHN0dWZmLgorCisgIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkoKSB7CisgICAgdGhpcy5leHRlbnNpb25zQnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFeHRlbnNpb25JbmZvPigpOworICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0gbmV3IEhhc2hNYXA8RGVzY3JpcHRvckludFBhaXIsIEV4dGVuc2lvbkluZm8+KCk7CisgIH0KKworICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IG90aGVyKSB7CisgICAgc3VwZXIob3RoZXIpOworICAgIHRoaXMuZXh0ZW5zaW9uc0J5TmFtZSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdGhlci5leHRlbnNpb25zQnlOYW1lKTsKKyAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9CisgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdGhlci5leHRlbnNpb25zQnlOdW1iZXIpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFeHRlbnNpb25JbmZvPiBleHRlbnNpb25zQnlOYW1lOworICBwcml2YXRlIGZpbmFsIE1hcDxEZXNjcmlwdG9ySW50UGFpciwgRXh0ZW5zaW9uSW5mbz4gZXh0ZW5zaW9uc0J5TnVtYmVyOworCisgIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkoYm9vbGVhbiBlbXB0eSkgeworICAgIHN1cGVyKEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOworICAgIHRoaXMuZXh0ZW5zaW9uc0J5TmFtZSA9IENvbGxlY3Rpb25zLjxTdHJpbmcsIEV4dGVuc2lvbkluZm8+ZW1wdHlNYXAoKTsKKyAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9CisgICAgICAgIENvbGxlY3Rpb25zLjxEZXNjcmlwdG9ySW50UGFpciwgRXh0ZW5zaW9uSW5mbz5lbXB0eU1hcCgpOworICB9CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IEVNUFRZID0gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KHRydWUpOworCisgIHByaXZhdGUgdm9pZCBhZGQoZmluYWwgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24pIHsKKyAgICBpZiAoIWV4dGVuc2lvbi5kZXNjcmlwdG9yLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSB3YXMgZ2l2ZW4gYSBGaWVsZERlc2NyaXB0b3IgZm9yIGEgcmVndWxhciAiICsKKyAgICAgICAgIihub24tZXh0ZW5zaW9uKSBmaWVsZC4iKTsKKyAgICB9CisKKyAgICBleHRlbnNpb25zQnlOYW1lLnB1dChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpLCBleHRlbnNpb24pOworICAgIGV4dGVuc2lvbnNCeU51bWJlci5wdXQoCisgICAgICBuZXcgRGVzY3JpcHRvckludFBhaXIoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0Q29udGFpbmluZ1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXROdW1iZXIoKSksCisgICAgICBleHRlbnNpb24pOworCisgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3I7CisgICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkgJiYKKyAgICAgICAgZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgJiYKKyAgICAgICAgZmllbGQuaXNPcHRpb25hbCgpICYmCisgICAgICAgIGZpZWxkLmdldEV4dGVuc2lvblNjb3BlKCkgPT0gZmllbGQuZ2V0TWVzc2FnZVR5cGUoKSkgeworICAgICAgLy8gVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgYSBNZXNzYWdlU2V0IHR5cGUgZGVmaW5lZCB3aXRoaW4gdGhlIGV4dGVuc2lvbgorICAgICAgLy8gdHlwZSdzIG93biBzY29wZS4gIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgYWxsb3cgaXQgdG8gYmUgbG9va2VkCisgICAgICAvLyB1cCBieSB0eXBlIG5hbWUuCisgICAgICBleHRlbnNpb25zQnlOYW1lLnB1dChmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldEZ1bGxOYW1lKCksIGV4dGVuc2lvbik7CisgICAgfQorICB9CisKKyAgLyoqIEEgKEdlbmVyaWNEZXNjcmlwdG9yLCBpbnQpIHBhaXIsIHVzZWQgYXMgYSBtYXAga2V5LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9ySW50UGFpciB7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyOworCisgICAgRGVzY3JpcHRvckludFBhaXIoZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBpbnQgbnVtYmVyKSB7CisgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yLmhhc2hDb2RlKCkgKiAoKDEgPDwgMTYpIC0gMSkgKyBudW1iZXI7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9ySW50UGFpcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgZmluYWwgRGVzY3JpcHRvckludFBhaXIgb3RoZXIgPSAoRGVzY3JpcHRvckludFBhaXIpb2JqOworICAgICAgcmV0dXJuIGRlc2NyaXB0b3IgPT0gb3RoZXIuZGVzY3JpcHRvciAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMjg5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIEV4dGVuc2lvblJlZ2lzdHJ5fSBidXQgc3VwcG9ydHMgb25seSAibGl0ZSIgdHlwZXMuCisgKiA8cD4KKyAqIElmIGFsbCBvZiB5b3VyIHR5cGVzIGFyZSBsaXRlIHR5cGVzLCB0aGVuIHlvdSBvbmx5IG5lZWQgdG8gdXNlCisgKiB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlfS4gIFNpbWlsYXJseSwgaWYgYWxsIHlvdXIgdHlwZXMgYXJlIHJlZ3VsYXIKKyAqIHR5cGVzLCB0aGVuIHlvdSBvbmx5IG5lZWQge0BsaW5rIEV4dGVuc2lvblJlZ2lzdHJ5fS4gIFR5cGljYWxseSBpdCBkb2VzIG5vdAorICogbWFrZSBzZW5zZSB0byBtaXggdGhlIHR3bywgc2luY2UgaWYgeW91IGhhdmUgYW55IHJlZ3VsYXIgdHlwZXMgaW4geW91cgorICogcHJvZ3JhbSwgeW91IHRoZW4gcmVxdWlyZSB0aGUgZnVsbCBydW50aW1lIGFuZCBsb3NlIGFsbCB0aGUgYmVuZWZpdHMgb2YKKyAqIHRoZSBsaXRlIHJ1bnRpbWUsIHNvIHlvdSBtaWdodCBhcyB3ZWxsIG1ha2UgYWxsIHlvdXIgdHlwZXMgYmUgcmVndWxhciB0eXBlcy4KKyAqIEhvd2V2ZXIsIGluIHNvbWUgY2FzZXMgKGUuZy4gd2hlbiBkZXBlbmRpbmcgb24gbXVsdGlwbGUgdGhpcmQtcGFydHkgbGlicmFyaWVzCisgKiB3aGVyZSBvbmUgdXNlcyBsaXRlIHR5cGVzIGFuZCBvbmUgdXNlcyByZWd1bGFyKSwgeW91IG1heSBmaW5kIHlvdXJzZWxmCisgKiB3YW50aW5nIHRvIG1peCB0aGUgdHdvLiAgSW4gdGhpcyBjYXNlIHRoaW5ncyBnZXQgbW9yZSBjb21wbGljYXRlZC4KKyAqIDxwPgorICogVGhlcmUgYXJlIHRocmVlIGZhY3RvcnMgdG8gY29uc2lkZXI6ICBXaGV0aGVyIHRoZSB0eXBlIGJlaW5nIGV4dGVuZGVkIGlzCisgKiBsaXRlLCB3aGV0aGVyIHRoZSBlbWJlZGRlZCB0eXBlIChpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtdHlwZWQgZXh0ZW5zaW9uKQorICogaXMgbGl0ZSwgYW5kIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBpdHNlbGYgaXMgbGl0ZS4gIFNpbmNlIGFsbCB0aHJlZSBhcmUKKyAqIGRlY2xhcmVkIGluIGRpZmZlcmVudCBmaWxlcywgdGhleSBjb3VsZCBhbGwgYmUgZGlmZmVyZW50LiAgSGVyZSBhcmUgYWxsCisgKiB0aGUgY29tYmluYXRpb25zIGFuZCB3aGljaCB0eXBlIG9mIHJlZ2lzdHJ5IHRvIHVzZToKKyAqIDxwcmU+CisgKiAgIEV4dGVuZGVkIHR5cGUgICAgIElubmVyIHR5cGUgICAgRXh0ZW5zaW9uICAgICAgICAgVXNlIHJlZ2lzdHJ5CisgKiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIGxpdGUgICAgICAgICAgICAgIGxpdGUgICAgICAgICAgbGl0ZSAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlCisgKiAgIGxpdGUgICAgICAgICAgICAgIHJlZ3VsYXIgICAgICAgbGl0ZSAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkKKyAqICAgcmVndWxhciAgICAgICAgICAgcmVndWxhciAgICAgICByZWd1bGFyICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeQorICogICBhbGwgb3RoZXIgY29tYmluYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQKKyAqIDwvcHJlPgorICogPHA+CisgKiBOb3RlIHRoYXQganVzdCBhcyByZWd1bGFyIHR5cGVzIGFyZSBub3QgYWxsb3dlZCB0byBjb250YWluIGxpdGUtdHlwZSBmaWVsZHMsCisgKiB0aGV5IGFyZSBhbHNvIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gbGl0ZS10eXBlIGV4dGVuc2lvbnMuICBUaGlzIGlzIGJlY2F1c2UKKyAqIHJlZ3VsYXIgdHlwZXMgbXVzdCBiZSBmdWxseSBhY2Nlc3NpYmxlIHZpYSByZWZsZWN0aW9uLCB3aGljaCBpbiB0dXJuIG1lYW5zCisgKiB0aGF0IGFsbCB0aGUgaW5uZXIgbWVzc2FnZXMgbXVzdCBhbHNvIHN1cHBvcnQgcmVmbGVjdGlvbi4gIE9uIHRoZSBvdGhlciBoYW5kLAorICogc2luY2UgcmVndWxhciB0eXBlcyBpbXBsZW1lbnQgdGhlIGVudGlyZSBsaXRlIGludGVyZmFjZSwgdGhlcmUgaXMgbm8gcHJvYmxlbQorICogd2l0aCBlbWJlZGRpbmcgcmVndWxhciB0eXBlcyBpbnNpZGUgbGl0ZSB0eXBlcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHsKKworICAvLyBTZXQgdHJ1ZSB0byBlbmFibGUgbGF6eSBwYXJzaW5nIGZlYXR1cmUgZm9yIE1lc3NhZ2VTZXQuCisgIC8vCisgIC8vIFRPRE8oeGlhbmdsKTogTm93IHdlIHVzZSBhIGdsb2JhbCBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciBlbmFibGUgbGF6eQorICAvLyBwYXJzaW5nIGZlYXR1cmUgZm9yIE1lc3NhZ2VTZXQsIHdoaWNoIG1heSBiZSB0b28gY3J1ZGUgZm9yIHNvbWUKKyAgLy8gYXBwbGljYXRpb25zLiBOZWVkIHRvIHN1cHBvcnQgdGhpcyBmZWF0dXJlIG9uIHNtYWxsZXIgZ3JhbnVsYXJpdHkuCisgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZWFnZXJseVBhcnNlTWVzc2FnZVNldHMgPSBmYWxzZTsKKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cygpIHsKKyAgICByZXR1cm4gZWFnZXJseVBhcnNlTWVzc2FnZVNldHM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RWFnZXJseVBhcnNlTWVzc2FnZVNldHMoYm9vbGVhbiBpc0VhZ2VybHlQYXJzZSkgeworICAgIGVhZ2VybHlQYXJzZU1lc3NhZ2VTZXRzID0gaXNFYWdlcmx5UGFyc2U7CisgIH0KKworICAvKiogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBpbnN0YW5jZS4gKi8KKyAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgbmV3SW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25SZWdpc3RyeUxpdGUoKTsKKyAgfQorCisgIC8qKiBHZXQgdGhlIHVubW9kaWZpYWJsZSBzaW5nbGV0b24gZW1wdHkgaW5zdGFuY2UuICovCisgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGdldEVtcHR5UmVnaXN0cnkoKSB7CisgICAgcmV0dXJuIEVNUFRZOworICB9CisKKyAgLyoqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHJlZ2lzdHJ5LiAqLworICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGdldFVubW9kaWZpYWJsZSgpIHsKKyAgICByZXR1cm4gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSh0aGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBGaW5kIGFuIGV4dGVuc2lvbiBieSBjb250YWluaW5nIHR5cGUgYW5kIGZpZWxkIG51bWJlci4KKyAgICoKKyAgICogQHJldHVybiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0KKyAgICogICAgICAgICBvdGhlcndpc2UuCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlPgorICAgICAgR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCA/PgorICAgICAgICBmaW5kTGl0ZUV4dGVuc2lvbkJ5TnVtYmVyKAorICAgICAgICAgIGZpbmFsIENvbnRhaW5pbmdUeXBlIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlcikgeworICAgIHJldHVybiAoR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCA/PikKKyAgICAgIGV4dGVuc2lvbnNCeU51bWJlci5nZXQoCisgICAgICAgIG5ldyBPYmplY3RJbnRQYWlyKGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLCBmaWVsZE51bWJlcikpOworICB9CisKKyAgLyoqIEFkZCBhbiBleHRlbnNpb24gZnJvbSBhIGxpdGUgZ2VuZXJhdGVkIGZpbGUgdG8gdGhlIHJlZ2lzdHJ5LiAqLworICBwdWJsaWMgZmluYWwgdm9pZCBhZGQoCisgICAgICBmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248PywgPz4gZXh0ZW5zaW9uKSB7CisgICAgZXh0ZW5zaW9uc0J5TnVtYmVyLnB1dCgKKyAgICAgIG5ldyBPYmplY3RJbnRQYWlyKGV4dGVuc2lvbi5nZXRDb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldE51bWJlcigpKSwKKyAgICAgIGV4dGVuc2lvbik7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBQcml2YXRlIHN0dWZmLgorCisgIC8vIENvbnN0cnVjdG9ycyBhcmUgcGFja2FnZS1wcml2YXRlIHNvIHRoYXQgRXh0ZW5zaW9uUmVnaXN0cnkgY2FuIHN1YmNsYXNzCisgIC8vIHRoaXMuCisKKyAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkgeworICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0KKyAgICAgICAgbmV3IEhhc2hNYXA8T2JqZWN0SW50UGFpciwKKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPD8sID8+PigpOworICB9CisKKyAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSBFTVBUWSkgeworICAgICAgdGhpcy5leHRlbnNpb25zQnlOdW1iZXIgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9CisgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdGhlci5leHRlbnNpb25zQnlOdW1iZXIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgTWFwPE9iamVjdEludFBhaXIsCisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjw/LCA/Pj4KKyAgICAgIGV4dGVuc2lvbnNCeU51bWJlcjsKKworICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZShib29sZWFuIGVtcHR5KSB7CisgICAgdGhpcy5leHRlbnNpb25zQnlOdW1iZXIgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICB9CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBFTVBUWSA9CisgICAgbmV3IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSh0cnVlKTsKKworICAvKiogQSAoT2JqZWN0LCBpbnQpIHBhaXIsIHVzZWQgYXMgYSBtYXAga2V5LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPYmplY3RJbnRQYWlyIHsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBvYmplY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyOworCisgICAgT2JqZWN0SW50UGFpcihmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBpbnQgbnVtYmVyKSB7CisgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKKyAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUob2JqZWN0KSAqICgoMSA8PCAxNikgLSAxKSArIG51bWJlcjsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9iamVjdEludFBhaXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIE9iamVjdEludFBhaXIgb3RoZXIgPSAoT2JqZWN0SW50UGFpcilvYmo7CisgICAgICByZXR1cm4gb2JqZWN0ID09IG90aGVyLm9iamVjdCAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GaWVsZFNldC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GaWVsZFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjM2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkU2V0LmphdmEKQEAgLTAsMCArMSw4NjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuTGF6eUZpZWxkLkxhenlJdGVyYXRvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBjbGFzcyB3aGljaCByZXByZXNlbnRzIGFuIGFyYml0cmFyeSBzZXQgb2YgZmllbGRzIG9mIHNvbWUgbWVzc2FnZSB0eXBlLgorICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LCBhbmQgYWxzbyB0byByZXByZXNlbnQKKyAqIGV4dGVuc2lvbnMgaW4ge0BsaW5rIEdlbmVyYXRlZE1lc3NhZ2V9LiAgVGhpcyBjbGFzcyBpcyBwYWNrYWdlLXByaXZhdGUsCisgKiBzaW5jZSBvdXRzaWRlIHVzZXJzIHNob3VsZCBwcm9iYWJseSBiZSB1c2luZyB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK2ZpbmFsIGNsYXNzIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGUgZXh0ZW5kcworICAgICAgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxGaWVsZERlc2NyaXB0b3JUeXBlPj4geworICAvKioKKyAgICogSW50ZXJmYWNlIGZvciBhIEZpZWxkRGVzY3JpcHRvciBvciBsaXRlIGV4dGVuc2lvbiBkZXNjcmlwdG9yLiAgVGhpcworICAgKiBwcmV2ZW50cyBGaWVsZFNldCBmcm9tIGRlcGVuZGluZyBvbiB7QGxpbmsgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yfS4KKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgRmllbGREZXNjcmlwdG9yTGl0ZTxUIGV4dGVuZHMgRmllbGREZXNjcmlwdG9yTGl0ZTxUPj4KKyAgICAgIGV4dGVuZHMgQ29tcGFyYWJsZTxUPiB7CisgICAgaW50IGdldE51bWJlcigpOworICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCk7CisgICAgV2lyZUZvcm1hdC5KYXZhVHlwZSBnZXRMaXRlSmF2YVR5cGUoKTsKKyAgICBib29sZWFuIGlzUmVwZWF0ZWQoKTsKKyAgICBib29sZWFuIGlzUGFja2VkKCk7CisgICAgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZ2V0RW51bVR5cGUoKTsKKworICAgIC8vIElmIGdldExpdGVKYXZhVHlwZSgpID09IE1FU1NBR0UsIHRoaXMgbWVyZ2VzIGEgbWVzc2FnZSBvYmplY3Qgb2YgdGhlCisgICAgLy8gdHlwZSBpbnRvIGEgYnVpbGRlciBvZiB0aGUgdHlwZS4gIFJldHVybnMge0Bjb2RlIHRvfS4KKyAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIGludGVybmFsTWVyZ2VGcm9tKAorICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIHRvLCBNZXNzYWdlTGl0ZSBmcm9tKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBmaWVsZHM7CisgIHByaXZhdGUgYm9vbGVhbiBpc0ltbXV0YWJsZTsKKyAgcHJpdmF0ZSBib29sZWFuIGhhc0xhenlGaWVsZCA9IGZhbHNlOworCisgIC8qKiBDb25zdHJ1Y3QgYSBuZXcgRmllbGRTZXQuICovCisgIHByaXZhdGUgRmllbGRTZXQoKSB7CisgICAgdGhpcy5maWVsZHMgPSBTbWFsbFNvcnRlZE1hcC5uZXdGaWVsZE1hcCgxNik7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0IGFuIGVtcHR5IEZpZWxkU2V0LiAgVGhpcyBpcyBvbmx5IHVzZWQgdG8gaW5pdGlhbGl6ZQorICAgKiBERUZBVUxUX0lOU1RBTkNFLgorICAgKi8KKyAgcHJpdmF0ZSBGaWVsZFNldChmaW5hbCBib29sZWFuIGR1bW15KSB7CisgICAgdGhpcy5maWVsZHMgPSBTbWFsbFNvcnRlZE1hcC5uZXdGaWVsZE1hcCgwKTsKKyAgICBtYWtlSW1tdXRhYmxlKCk7CisgIH0KKworICAvKiogQ29uc3RydWN0IGEgbmV3IEZpZWxkU2V0LiAqLworICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxUPj4KKyAgICAgIEZpZWxkU2V0PFQ+IG5ld0ZpZWxkU2V0KCkgeworICAgIHJldHVybiBuZXcgRmllbGRTZXQ8VD4oKTsKKyAgfQorCisgIC8qKiBHZXQgYW4gaW1tdXRhYmxlIGVtcHR5IEZpZWxkU2V0LiAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEZpZWxkU2V0LkZpZWxkRGVzY3JpcHRvckxpdGU8VD4+CisgICAgICBGaWVsZFNldDxUPiBlbXB0eVNldCgpIHsKKyAgICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRTsKKyAgfQorICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZFNldCBERUZBVUxUX0lOU1RBTkNFID0gbmV3IEZpZWxkU2V0KHRydWUpOworCisgIC8qKiBNYWtlIHRoaXMgRmllbGRTZXQgaW1tdXRhYmxlIGZyb20gdGhpcyBwb2ludCBmb3J3YXJkLiAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHZvaWQgbWFrZUltbXV0YWJsZSgpIHsKKyAgICBpZiAoaXNJbW11dGFibGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmllbGRzLm1ha2VJbW11dGFibGUoKTsKKyAgICBpc0ltbXV0YWJsZSA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBGaWVsZFNldCBpcyBpbW11dGFibGUuIFRoaXMgaXMgdHJ1ZSBpZiBpdCBpcyB0aGUKKyAgICoge0BsaW5rICNlbXB0eVNldH0gb3IgaWYge0BsaW5rICNtYWtlSW1tdXRhYmxlfSB3ZXJlIGNhbGxlZC4KKyAgICoKKyAgICogQHJldHVybiB3aGV0aGVyIHRoZSBGaWVsZFNldCBpcyBpbW11dGFibGUuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZSgpIHsKKyAgICByZXR1cm4gaXNJbW11dGFibGU7CisgIH0KKworICAvKioKKyAgICogQ2xvbmVzIHRoZSBGaWVsZFNldC4gVGhlIHJldHVybmVkIEZpZWxkU2V0IHdpbGwgYmUgbXV0YWJsZSBldmVuIGlmIHRoZQorICAgKiBvcmlnaW5hbCBGaWVsZFNldCB3YXMgaW1tdXRhYmxlLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjbG9uZWQgRmllbGRTZXQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yVHlwZT4gY2xvbmUoKSB7CisgICAgLy8gV2UgY2FuJ3QganVzdCBjYWxsIGZpZWxkcy5jbG9uZSBiZWNhdXNlIExpc3Qgb2JqZWN0cyBpbiB0aGUgbWFwCisgICAgLy8gc2hvdWxkIG5vdCBiZSBzaGFyZWQuCisgICAgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yVHlwZT4gY2xvbmUgPSBGaWVsZFNldC5uZXdGaWVsZFNldCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAgICAgIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5ID0gZmllbGRzLmdldEFycmF5RW50cnlBdChpKTsKKyAgICAgIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOworICAgICAgY2xvbmUuc2V0RmllbGQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgeworICAgICAgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICBjbG9uZS5zZXRGaWVsZChkZXNjcmlwdG9yLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgY2xvbmUuaGFzTGF6eUZpZWxkID0gaGFzTGF6eUZpZWxkOworICAgIHJldHVybiBjbG9uZTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqIFNlZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2NsZWFyKCl9LiAqLworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICBmaWVsZHMuY2xlYXIoKTsKKyAgICBoYXNMYXp5RmllbGQgPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBzaW1wbGUgbWFwIGNvbnRhaW5pbmcgYWxsIHRoZSBmaWVsZHMuCisgICAqLworICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgeworICAgIGlmIChoYXNMYXp5RmllbGQpIHsKKyAgICAgIFNtYWxsU29ydGVkTWFwPEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gcmVzdWx0ID0KKyAgICAgICAgICBTbWFsbFNvcnRlZE1hcC5uZXdGaWVsZE1hcCgxNik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7CisgICAgICAgIGNsb25lRmllbGRFbnRyeShyZXN1bHQsIGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSkpOworICAgICAgfQorICAgICAgZm9yIChNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6CisgICAgICAgICAgZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7CisgICAgICAgIGNsb25lRmllbGRFbnRyeShyZXN1bHQsIGVudHJ5KTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZHMuaXNJbW11dGFibGUoKSkgeworICAgICAgICByZXN1bHQubWFrZUltbXV0YWJsZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIGZpZWxkcy5pc0ltbXV0YWJsZSgpID8gZmllbGRzIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGZpZWxkcyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2xvbmVGaWVsZEVudHJ5KE1hcDxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IG1hcCwKKyAgICAgIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5KSB7CisgICAgRmllbGREZXNjcmlwdG9yVHlwZSBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlGaWVsZCkgeworICAgICAgbWFwLnB1dChrZXksICgoTGF6eUZpZWxkKSB2YWx1ZSkuZ2V0VmFsdWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1hcC5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCBhbiBpdGVyYXRvciB0byB0aGUgZmllbGQgbWFwLiBUaGlzIGl0ZXJhdG9yIHNob3VsZCBub3QgYmUgbGVha2VkIG91dAorICAgKiBvZiB0aGUgcHJvdG9idWYgbGlicmFyeSBhcyBpdCBpcyBub3QgcHJvdGVjdGVkIGZyb20gbXV0YXRpb24gd2hlbiBmaWVsZHMKKyAgICogaXMgbm90IGltbXV0YWJsZS4KKyAgICovCisgIHB1YmxpYyBJdGVyYXRvcjxNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0Pj4gaXRlcmF0b3IoKSB7CisgICAgaWYgKGhhc0xhenlGaWVsZCkgeworICAgICAgcmV0dXJuIG5ldyBMYXp5SXRlcmF0b3I8RmllbGREZXNjcmlwdG9yVHlwZT4oCisgICAgICAgICAgZmllbGRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKSk7CisgICAgfQorICAgIHJldHVybiBmaWVsZHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICB9CisKKyAgLyoqCisgICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCisgICAqIHtAbGluayBNZXNzYWdlI2hhc0ZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yKSB7CisgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiaGFzRmllbGQoKSBjYW4gb25seSBiZSBjYWxsZWQgb24gbm9uLXJlcGVhdGVkIGZpZWxkcy4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmllbGRzLmdldChkZXNjcmlwdG9yKSAhPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCisgICAqIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9LiAgVGhpcyBtZXRob2QKKyAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgdGhlIGZpZWxkIGlzIG5vdCBzZXQ7IGluIHRoaXMgY2FzZSBpdCBpcyB1cAorICAgKiB0byB0aGUgY2FsbGVyIHRvIGZldGNoIHRoZSBmaWVsZCdzIGRlZmF1bHQgdmFsdWUuCisgICAqLworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvcikgeworICAgIE9iamVjdCBvID0gZmllbGRzLmdldChkZXNjcmlwdG9yKTsKKyAgICBpZiAobyBpbnN0YW5jZW9mIExhenlGaWVsZCkgeworICAgICAgcmV0dXJuICgoTGF6eUZpZWxkKSBvKS5nZXRWYWx1ZSgpOworICAgIH0KKyAgICByZXR1cm4gbzsKKyAgfQorCisgIC8qKgorICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZworICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI3NldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcixPYmplY3QpfS4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIiwgInJhd3R5cGVzIn0pCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CisgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIldyb25nIG9iamVjdCB0eXBlIHVzZWQgd2l0aCBwcm90b2NvbCBtZXNzYWdlIHJlZmxlY3Rpb24uIik7CisgICAgICB9CisKKyAgICAgIC8vIFdyYXAgdGhlIGNvbnRlbnRzIGluIGEgbmV3IGxpc3Qgc28gdGhhdCB0aGUgY2FsbGVyIGNhbm5vdCBjaGFuZ2UKKyAgICAgIC8vIHRoZSBsaXN0J3MgY29udGVudHMgYWZ0ZXIgc2V0dGluZyBpdC4KKyAgICAgIGZpbmFsIExpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgIG5ld0xpc3QuYWRkQWxsKChMaXN0KSB2YWx1ZSk7CisgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogbmV3TGlzdCkgeworICAgICAgICB2ZXJpZnlUeXBlKGRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwgZWxlbWVudCk7CisgICAgICB9CisgICAgICB2YWx1ZSA9IG5ld0xpc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIHZlcmlmeVR5cGUoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLCB2YWx1ZSk7CisgICAgfQorCisgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eUZpZWxkKSB7CisgICAgICBoYXNMYXp5RmllbGQgPSB0cnVlOworICAgIH0KKyAgICBmaWVsZHMucHV0KGRlc2NyaXB0b3IsIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZworICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2NsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uCisgICAqLworICBwdWJsaWMgdm9pZCBjbGVhckZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvcikgeworICAgIGZpZWxkcy5yZW1vdmUoZGVzY3JpcHRvcik7CisgICAgaWYgKGZpZWxkcy5pc0VtcHR5KCkpIHsKKyAgICAgIGhhc0xhenlGaWVsZCA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZworICAgKiB7QGxpbmsgTWVzc2FnZSNnZXRSZXBlYXRlZEZpZWxkQ291bnQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uCisgICAqLworICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiByZXBlYXRlZCBmaWVsZHMuIik7CisgICAgfQorCisgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGQoZGVzY3JpcHRvcik7CisgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKChMaXN0PD8+KSB2YWx1ZSkuc2l6ZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZworICAgKiB7QGxpbmsgTWVzc2FnZSNnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcixpbnQpfS4KKyAgICovCisgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiByZXBlYXRlZCBmaWVsZHMuIik7CisgICAgfQorCisgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGQoZGVzY3JpcHRvcik7CisKKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICgoTGlzdDw/PikgdmFsdWUpLmdldChpbmRleCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCisgICAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjc2V0UmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsaW50LE9iamVjdCl9LgorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyB2b2lkIHNldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiByZXBlYXRlZCBmaWVsZHMuIik7CisgICAgfQorCisgICAgZmluYWwgT2JqZWN0IGxpc3QgPSBnZXRGaWVsZChkZXNjcmlwdG9yKTsKKyAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgIH0KKworICAgIHZlcmlmeVR5cGUoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLCB2YWx1ZSk7CisgICAgKChMaXN0PE9iamVjdD4pIGxpc3QpLnNldChpbmRleCwgdmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCisgICAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjYWRkUmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsT2JqZWN0KX0uCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgaWYgKCFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgImFkZFJlcGVhdGVkRmllbGQoKSBjYW4gb25seSBiZSBjYWxsZWQgb24gcmVwZWF0ZWQgZmllbGRzLiIpOworICAgIH0KKworICAgIHZlcmlmeVR5cGUoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLCB2YWx1ZSk7CisKKyAgICBmaW5hbCBPYmplY3QgZXhpc3RpbmdWYWx1ZSA9IGdldEZpZWxkKGRlc2NyaXB0b3IpOworICAgIExpc3Q8T2JqZWN0PiBsaXN0OworICAgIGlmIChleGlzdGluZ1ZhbHVlID09IG51bGwpIHsKKyAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgbGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpc3QgPSAoTGlzdDxPYmplY3Q+KSBleGlzdGluZ1ZhbHVlOworICAgIH0KKworICAgIGxpc3QuYWRkKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSB0byBiZSBhIHZhbGlkCisgICAqIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQuICAoRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhpcyBjaGVja3MgaWYgdGhlCisgICAqIG9iamVjdCBpcyB0aGUgcmlnaHQgdHlwZSB0byBiZSBvbmUgZWxlbWVudCBvZiB0aGUgZmllbGQuKQorICAgKgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgdmFsdWUgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlUeXBlKGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7CisgICAgc3dpdGNoICh0eXBlLmdldEphdmFUeXBlKCkpIHsKKyAgICAgIGNhc2UgSU5UOiAgICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyICAgOyBicmVhazsKKyAgICAgIGNhc2UgTE9ORzogICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBMb25nICAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgRkxPQVQ6ICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBGbG9hdCAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgRE9VQkxFOiAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBEb3VibGUgICAgOyBicmVhazsKKyAgICAgIGNhc2UgQk9PTEVBTjogICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuICAgOyBicmVhazsKKyAgICAgIGNhc2UgU1RSSU5HOiAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgICAgOyBicmVhazsKKyAgICAgIGNhc2UgQllURV9TVFJJTkc6ICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBCeXRlU3RyaW5nOyBicmVhazsKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgQ2FsbGVyIG11c3QgZG8gdHlwZSBjaGVja2luZyBoZXJlLCBJIGd1ZXNzLgorICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbC5FbnVtTGl0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgIC8vIFRPRE8oa2VudG9uKTogIENhbGxlciBtdXN0IGRvIHR5cGUgY2hlY2tpbmcgaGVyZSwgSSBndWVzcy4KKyAgICAgICAgaXNWYWxpZCA9CisgICAgICAgICAgICAodmFsdWUgaW5zdGFuY2VvZiBNZXNzYWdlTGl0ZSkgfHwgKHZhbHVlIGluc3RhbmNlb2YgTGF6eUZpZWxkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFpc1ZhbGlkKSB7CisgICAgICAvLyBUT0RPKGtlbnRvbik6ICBXaGVuIGNoYWluaW5nIGNhbGxzIHRvIHNldEZpZWxkKCksIGl0IGNhbiBiZSBoYXJkIHRvCisgICAgICAvLyAgIHRlbGwgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugd2hpY2ggZXhhY3QgY2FsbCBmYWlsZWQsIHNpbmNlIHRoZSB3aG9sZQorICAgICAgLy8gICBjaGFpbiBpcyBjb25zaWRlcmVkIG9uZSBsaW5lIG9mIGNvZGUuICBJdCB3b3VsZCBiZSBuaWNlIHRvIHByaW50CisgICAgICAvLyAgIG1vcmUgaW5mb3JtYXRpb24gaGVyZSwgZS5nLiBuYW1pbmcgdGhlIGZpZWxkLiAgV2UgdXNlZCB0byBkbyB0aGF0LgorICAgICAgLy8gICBCdXQgd2UgY2FuJ3Qgbm93IHRoYXQgRmllbGRTZXQgZG9lc24ndCB1c2UgZGVzY3JpcHRvcnMuICBNYXliZSB0aGlzCisgICAgICAvLyAgIGlzbid0IGEgYmlnIGRlYWwsIHRob3VnaCwgc2luY2UgaXQgd291bGQgb25seSByZWFsbHkgYXBwbHkgd2hlbiB1c2luZworICAgICAgLy8gICByZWZsZWN0aW9uIGFuZCBnZW5lcmFsbHkgcGVvcGxlIGRvbid0IGNoYWluIHJlZmxlY3Rpb24gc2V0dGVycy4KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJXcm9uZyBvYmplY3QgdHlwZSB1c2VkIHdpdGggcHJvdG9jb2wgbWVzc2FnZSByZWZsZWN0aW9uLiIpOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIFBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24KKworICAvKioKKyAgICogU2VlIHtAbGluayBNZXNzYWdlI2lzSW5pdGlhbGl6ZWQoKX0uICBOb3RlOiAgU2luY2Uge0Bjb2RlIEZpZWxkU2V0fQorICAgKiBpdHNlbGYgZG9lcyBub3QgaGF2ZSBhbnkgd2F5IG9mIGtub3dpbmcgYWJvdXQgcmVxdWlyZWQgZmllbGRzIHRoYXQKKyAgICogYXJlbid0IGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIHNldCwgaXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBjaGVjaworICAgKiB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAgICAgIGlmICghaXNJbml0aWFsaXplZChmaWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgeworICAgICAgaWYgKCFpc0luaXRpYWxpemVkKGVudHJ5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkKAorICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkpIHsKKyAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICBmb3IgKGZpbmFsIE1lc3NhZ2VMaXRlIGVsZW1lbnQ6CisgICAgICAgICAgICAgICAgIChMaXN0PE1lc3NhZ2VMaXRlPikgZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIGlmICghZWxlbWVudC5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1lc3NhZ2VMaXRlKSB7CisgICAgICAgICAgaWYgKCEoKE1lc3NhZ2VMaXRlKSB2YWx1ZSkuaXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eUZpZWxkKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIldyb25nIG9iamVjdCB0eXBlIHVzZWQgd2l0aCBwcm90b2NvbCBtZXNzYWdlIHJlZmxlY3Rpb24uIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBmaWVsZCB0eXBlLCByZXR1cm4gdGhlIHdpcmUgdHlwZS4KKyAgICoKKyAgICogQHJldHVybnMgT25lIG9mIHRoZSB7QGNvZGUgV0lSRVRZUEVffSBjb25zdGFudHMgZGVmaW5lZCBpbgorICAgKiAgICAgICAgICB7QGxpbmsgV2lyZUZvcm1hdH0uCisgICAqLworICBzdGF0aWMgaW50IGdldFdpcmVGb3JtYXRGb3JGaWVsZFR5cGUoZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQYWNrZWQpIHsKKyAgICBpZiAoaXNQYWNrZWQpIHsKKyAgICAgIHJldHVybiBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlLmdldFdpcmVUeXBlKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rIE1lc3NhZ2UuQnVpbGRlciNtZXJnZUZyb20oTWVzc2FnZSl9LCBidXQgbWVyZ2VzIGZyb20gYW5vdGhlciAKKyAgICoge0BsaW5rIEZpZWxkU2V0fS4KKyAgICovCisgIHB1YmxpYyB2b2lkIG1lcmdlRnJvbShmaW5hbCBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3JUeXBlPiBvdGhlcikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXIuZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAgICAgIG1lcmdlRnJvbUZpZWxkKG90aGVyLmZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSkpOworICAgIH0KKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgICAgICBvdGhlci5maWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKKyAgICAgIG1lcmdlRnJvbUZpZWxkKGVudHJ5KTsKKyAgICB9CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsICJyYXd0eXBlcyJ9KQorICBwcml2YXRlIHZvaWQgbWVyZ2VGcm9tRmllbGQoCisgICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSkgeworICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOworICAgIE9iamVjdCBvdGhlclZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICBpZiAob3RoZXJWYWx1ZSBpbnN0YW5jZW9mIExhenlGaWVsZCkgeworICAgICAgb3RoZXJWYWx1ZSA9ICgoTGF6eUZpZWxkKSBvdGhlclZhbHVlKS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGQoZGVzY3JpcHRvcik7CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAvLyBPdXIgbGlzdCBpcyBlbXB0eSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gbWFrZSBhIGRlZmVuc2l2ZSBjb3B5IG9mCisgICAgICAgIC8vIHRoZSBvdGhlciBsaXN0IHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhlIG90aGVyIEZpZWxkU2V0IGlzIHN0aWxsCisgICAgICAgIC8vIG11dGFibGUuCisgICAgICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgbmV3IEFycmF5TGlzdCgoTGlzdCkgb3RoZXJWYWx1ZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ29uY2F0ZW5hdGUgdGhlIGxpc3RzLgorICAgICAgICAoKExpc3QpIHZhbHVlKS5hZGRBbGwoKExpc3QpIG90aGVyVmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgIE9iamVjdCB2YWx1ZSA9IGdldEZpZWxkKGRlc2NyaXB0b3IpOworICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCBvdGhlclZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE1lcmdlIHRoZSBtZXNzYWdlcy4KKyAgICAgICAgZmllbGRzLnB1dCgKKyAgICAgICAgICAgIGRlc2NyaXB0b3IsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmludGVybmFsTWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICgoTWVzc2FnZUxpdGUpIHZhbHVlKS50b0J1aWxkZXIoKSwgKE1lc3NhZ2VMaXRlKSBvdGhlclZhbHVlKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmaWVsZHMucHV0KGRlc2NyaXB0b3IsIG90aGVyVmFsdWUpOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8oa2VudG9uKTogIE1vdmUgc3RhdGljIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gbWV0aG9kcyBpbnRvIHNvbWUKKyAgLy8gICBvdGhlciBjbGFzcy4gIFByb2JhYmx5IFdpcmVGb3JtYXQuCisKKyAgLyoqCisgICAqIFJlYWQgYSBmaWVsZCBvZiBhbnkgcHJpbWl0aXZlIHR5cGUgZnJvbSBhIENvZGVkSW5wdXRTdHJlYW0uICBFbnVtcywKKyAgICogZ3JvdXBzLCBhbmQgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgbWV0aG9kLgorICAgKgorICAgKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCisgICAqIEBwYXJhbSB0eXBlIERlY2xhcmVkIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgKiBAcmV0dXJuIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpZWxkJ3MgdmFsdWUsIG9mIHRoZSBleGFjdAorICAgKiAgICAgICAgIHR5cGUgd2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkKKyAgICogICAgICAgICB7QGxpbmsgTWVzc2FnZSNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSBmb3IKKyAgICogICAgICAgICB0aGlzIGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBPYmplY3QgcmVhZFByaW1pdGl2ZUZpZWxkKAorICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIERPVUJMRSAgOiByZXR1cm4gaW5wdXQucmVhZERvdWJsZSAgKCk7CisgICAgICBjYXNlIEZMT0FUICAgOiByZXR1cm4gaW5wdXQucmVhZEZsb2F0ICAgKCk7CisgICAgICBjYXNlIElOVDY0ICAgOiByZXR1cm4gaW5wdXQucmVhZEludDY0ICAgKCk7CisgICAgICBjYXNlIFVJTlQ2NCAgOiByZXR1cm4gaW5wdXQucmVhZFVJbnQ2NCAgKCk7CisgICAgICBjYXNlIElOVDMyICAgOiByZXR1cm4gaW5wdXQucmVhZEludDMyICAgKCk7CisgICAgICBjYXNlIEZJWEVENjQgOiByZXR1cm4gaW5wdXQucmVhZEZpeGVkNjQgKCk7CisgICAgICBjYXNlIEZJWEVEMzIgOiByZXR1cm4gaW5wdXQucmVhZEZpeGVkMzIgKCk7CisgICAgICBjYXNlIEJPT0wgICAgOiByZXR1cm4gaW5wdXQucmVhZEJvb2wgICAgKCk7CisgICAgICBjYXNlIFNUUklORyAgOiByZXR1cm4gaW5wdXQucmVhZFN0cmluZyAgKCk7CisgICAgICBjYXNlIEJZVEVTICAgOiByZXR1cm4gaW5wdXQucmVhZEJ5dGVzICAgKCk7CisgICAgICBjYXNlIFVJTlQzMiAgOiByZXR1cm4gaW5wdXQucmVhZFVJbnQzMiAgKCk7CisgICAgICBjYXNlIFNGSVhFRDMyOiByZXR1cm4gaW5wdXQucmVhZFNGaXhlZDMyKCk7CisgICAgICBjYXNlIFNGSVhFRDY0OiByZXR1cm4gaW5wdXQucmVhZFNGaXhlZDY0KCk7CisgICAgICBjYXNlIFNJTlQzMiAgOiByZXR1cm4gaW5wdXQucmVhZFNJbnQzMiAgKCk7CisgICAgICBjYXNlIFNJTlQ2NCAgOiByZXR1cm4gaW5wdXQucmVhZFNJbnQ2NCAgKCk7CisKKyAgICAgIGNhc2UgR1JPVVA6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgInJlYWRQcmltaXRpdmVGaWVsZCgpIGNhbm5vdCBoYW5kbGUgbmVzdGVkIGdyb3Vwcy4iKTsKKyAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAicmVhZFByaW1pdGl2ZUZpZWxkKCkgY2Fubm90IGhhbmRsZSBlbWJlZGRlZCBtZXNzYWdlcy4iKTsKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgLy8gV2UgZG9uJ3QgaGFuZGxlIGVudW1zIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGlmIHRoZQorICAgICAgICAvLyB2YWx1ZSBpcyBub3QgcmVjb2duaXplZC4KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAicmVhZFByaW1pdGl2ZUZpZWxkKCkgY2Fubm90IGhhbmRsZSBlbnVtcy4iKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICJUaGVyZSBpcyBubyB3YXkgdG8gZ2V0IGhlcmUsIGJ1dCB0aGUgY29tcGlsZXIgdGhpbmtzIG90aGVyd2lzZS4iKTsKKyAgfQorCisgIC8qKiBTZWUge0BsaW5rIE1lc3NhZ2Ujd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5ID0KKyAgICAgICAgICBmaWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpOworICAgICAgd3JpdGVGaWVsZChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKKyAgICB9CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6CisgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKKyAgICAgIHdyaXRlRmllbGQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCksIG91dHB1dCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICN3cml0ZVRvfSBidXQgdXNlcyBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0LgorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlU2V0VG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAgICAgIHdyaXRlTWVzc2FnZVNldFRvKGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSksIG91dHB1dCk7CisgICAgfQorICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgeworICAgICAgd3JpdGVNZXNzYWdlU2V0VG8oZW50cnksIG91dHB1dCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlTWVzc2FnZVNldFRvKAorICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnksCisgICAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7CisgICAgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFICYmCisgICAgICAgICFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSAmJiAhZGVzY3JpcHRvci5pc1BhY2tlZCgpKSB7CisgICAgICBvdXRwdXQud3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGVudHJ5LmdldEtleSgpLmdldE51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUxpdGUpIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUZpZWxkKGRlc2NyaXB0b3IsIGVudHJ5LmdldFZhbHVlKCksIG91dHB1dCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGEgc2luZ2xlIHRhZy12YWx1ZSBwYWlyIHRvIHRoZSBzdHJlYW0uCisgICAqCisgICAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSB0eXBlICAgVGhlIGZpZWxkJ3MgdHlwZS4KKyAgICogQHBhcmFtIG51bWJlciBUaGUgZmllbGQncyBudW1iZXIuCisgICAqIEBwYXJhbSB2YWx1ZSAgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmllbGQncyB2YWx1ZS4gIE11c3QgYmUgb2YgdGhlIGV4YWN0CisgICAqICAgICAgICAgICAgICAgdHlwZSB3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAgKiAgICAgICAgICAgICAgIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvcgorICAgKiAgICAgICAgICAgICAgIHRoaXMgZmllbGQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRWxlbWVudChmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGdyb3Vwcywgd2hpY2ggbmVlZCBhIHN0YXJ0IGFuZCBlbmQgdGFnOyBvdGhlciBmaWVsZHMKKyAgICAvLyBjYW4ganVzdCB1c2Ugd3JpdGVUYWcoKSBhbmQgd3JpdGVGaWVsZE5vVGFnKCkuCisgICAgaWYgKHR5cGUgPT0gV2lyZUZvcm1hdC5GaWVsZFR5cGUuR1JPVVApIHsKKyAgICAgIG91dHB1dC53cml0ZUdyb3VwKG51bWJlciwgKE1lc3NhZ2VMaXRlKSB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dC53cml0ZVRhZyhudW1iZXIsIGdldFdpcmVGb3JtYXRGb3JGaWVsZFR5cGUodHlwZSwgZmFsc2UpKTsKKyAgICAgIHdyaXRlRWxlbWVudE5vVGFnKG91dHB1dCwgdHlwZSwgdmFsdWUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIGZpZWxkIG9mIGFyYml0cmFyeSB0eXBlLCB3aXRob3V0IGl0cyB0YWcsIHRvIHRoZSBzdHJlYW0uCisgICAqCisgICAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSB0eXBlIFRoZSBmaWVsZCdzIHR5cGUuCisgICAqIEBwYXJhbSB2YWx1ZSAgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmllbGQncyB2YWx1ZS4gIE11c3QgYmUgb2YgdGhlIGV4YWN0CisgICAqICAgICAgICAgICAgICAgdHlwZSB3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAgKiAgICAgICAgICAgICAgIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvcgorICAgKiAgICAgICAgICAgICAgIHRoaXMgZmllbGQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRWxlbWVudE5vVGFnKAorICAgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0LAorICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKKyAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgRE9VQkxFICA6IG91dHB1dC53cml0ZURvdWJsZU5vVGFnICAoKERvdWJsZSAgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBGTE9BVCAgIDogb3V0cHV0LndyaXRlRmxvYXROb1RhZyAgICgoRmxvYXQgICAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIElOVDY0ICAgOiBvdXRwdXQud3JpdGVJbnQ2NE5vVGFnICAgKChMb25nICAgICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgVUlOVDY0ICA6IG91dHB1dC53cml0ZVVJbnQ2NE5vVGFnICAoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBJTlQzMiAgIDogb3V0cHV0LndyaXRlSW50MzJOb1RhZyAgICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIEZJWEVENjQgOiBvdXRwdXQud3JpdGVGaXhlZDY0Tm9UYWcgKChMb25nICAgICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgRklYRUQzMiA6IG91dHB1dC53cml0ZUZpeGVkMzJOb1RhZyAoKEludGVnZXIgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBCT09MICAgIDogb3V0cHV0LndyaXRlQm9vbE5vVGFnICAgICgoQm9vbGVhbiAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIFNUUklORyAgOiBvdXRwdXQud3JpdGVTdHJpbmdOb1RhZyAgKChTdHJpbmcgICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgR1JPVVAgICA6IG91dHB1dC53cml0ZUdyb3VwTm9UYWcgICAoKE1lc3NhZ2VMaXRlKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBNRVNTQUdFIDogb3V0cHV0LndyaXRlTWVzc2FnZU5vVGFnICgoTWVzc2FnZUxpdGUpIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIEJZVEVTICAgOiBvdXRwdXQud3JpdGVCeXRlc05vVGFnICAgKChCeXRlU3RyaW5nICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgVUlOVDMyICA6IG91dHB1dC53cml0ZVVJbnQzMk5vVGFnICAoKEludGVnZXIgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBTRklYRUQzMjogb3V0cHV0LndyaXRlU0ZpeGVkMzJOb1RhZygoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIFNGSVhFRDY0OiBvdXRwdXQud3JpdGVTRml4ZWQ2NE5vVGFnKChMb25nICAgICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgU0lOVDMyICA6IG91dHB1dC53cml0ZVNJbnQzMk5vVGFnICAoKEludGVnZXIgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBTSU5UNjQgIDogb3V0cHV0LndyaXRlU0ludDY0Tm9UYWcgICgoTG9uZyAgICAgICApIHZhbHVlKTsgYnJlYWs7CisKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgb3V0cHV0LndyaXRlRW51bU5vVGFnKCgoSW50ZXJuYWwuRW51bUxpdGUpIHZhbHVlKS5nZXROdW1iZXIoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qKiBXcml0ZSBhIHNpbmdsZSBmaWVsZC4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yTGl0ZTw/PiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlID0gZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpOworICAgIGludCBudW1iZXIgPSBkZXNjcmlwdG9yLmdldE51bWJlcigpOworICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgZmluYWwgTGlzdDw/PiB2YWx1ZUxpc3QgPSAoTGlzdDw/Pil2YWx1ZTsKKyAgICAgIGlmIChkZXNjcmlwdG9yLmlzUGFja2VkKCkpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlVGFnKG51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgZGF0YSBzaXplIHNvIHRoZSBsZW5ndGggY2FuIGJlIHdyaXR0ZW4uCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiB2YWx1ZUxpc3QpIHsKKyAgICAgICAgICBkYXRhU2l6ZSArPSBjb21wdXRlRWxlbWVudFNpemVOb1RhZyh0eXBlLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMihkYXRhU2l6ZSk7CisgICAgICAgIC8vIFdyaXRlIHRoZSBkYXRhIGl0c2VsZiwgd2l0aG91dCBhbnkgdGFncy4KKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHZhbHVlTGlzdCkgeworICAgICAgICAgIHdyaXRlRWxlbWVudE5vVGFnKG91dHB1dCwgdHlwZSwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiB2YWx1ZUxpc3QpIHsKKyAgICAgICAgICB3cml0ZUVsZW1lbnQob3V0cHV0LCB0eXBlLCBudW1iZXIsIGVsZW1lbnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlGaWVsZCkgeworICAgICAgICB3cml0ZUVsZW1lbnQob3V0cHV0LCB0eXBlLCBudW1iZXIsICgoTGF6eUZpZWxkKSB2YWx1ZSkuZ2V0VmFsdWUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUVsZW1lbnQob3V0cHV0LCB0eXBlLCBudW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VlIHtAbGluayBNZXNzYWdlI2dldFNlcmlhbGl6ZWRTaXplKCl9LiAgSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGNhY2hlCisgICAqIHRoZSByZXN1bHRpbmcgc2l6ZSBpZiBkZXNpcmVkLgorICAgKi8KKyAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgeworICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgPQorICAgICAgICAgIGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSk7CisgICAgICBzaXplICs9IGNvbXB1dGVGaWVsZFNpemUoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgeworICAgICAgc2l6ZSArPSBjb21wdXRlRmllbGRTaXplKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI2dldFNlcmlhbGl6ZWRTaXplfSBidXQgdXNlcyBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0LgorICAgKi8KKyAgcHVibGljIGludCBnZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoKSB7CisgICAgaW50IHNpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAgICAgIHNpemUgKz0gZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSkpOworICAgIH0KKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKKyAgICAgIHNpemUgKz0gZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKGVudHJ5KTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICBwcml2YXRlIGludCBnZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoCisgICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSkgeworICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOworICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFCisgICAgICAgICYmICFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSAmJiAhZGVzY3JpcHRvci5pc1BhY2tlZCgpKSB7CisgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5RmllbGQpIHsKKyAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVMYXp5RmllbGRNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgICAgIGVudHJ5LmdldEtleSgpLmdldE51bWJlcigpLCAoTGF6eUZpZWxkKSB2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZU1lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAorICAgICAgICAgICAgZW50cnkuZ2V0S2V5KCkuZ2V0TnVtYmVyKCksIChNZXNzYWdlTGl0ZSkgdmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY29tcHV0ZUZpZWxkU2l6ZShkZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiBzaW5nbGUgdGFnL3ZhbHVlIHBhaXIgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqCisgICAqIEBwYXJhbSB0eXBlICAgVGhlIGZpZWxkJ3MgdHlwZS4KKyAgICogQHBhcmFtIG51bWJlciBUaGUgZmllbGQncyBudW1iZXIuCisgICAqIEBwYXJhbSB2YWx1ZSAgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmllbGQncyB2YWx1ZS4gIE11c3QgYmUgb2YgdGhlIGV4YWN0CisgICAqICAgICAgICAgICAgICAgdHlwZSB3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAgKiAgICAgICAgICAgICAgIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvcgorICAgKiAgICAgICAgICAgICAgIHRoaXMgZmllbGQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcHV0ZUVsZW1lbnRTaXplKAorICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKKyAgICAgIGZpbmFsIGludCBudW1iZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgIGludCB0YWdTaXplID0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVRhZ1NpemUobnVtYmVyKTsKKyAgICBpZiAodHlwZSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5HUk9VUCkgeworICAgICAgdGFnU2l6ZSAqPSAyOworICAgIH0KKyAgICByZXR1cm4gdGFnU2l6ZSArIGNvbXB1dGVFbGVtZW50U2l6ZU5vVGFnKHR5cGUsIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICogcGFydGljdWxhciB2YWx1ZSBvZiBhcmJpdHJhcnkgdHlwZSwgZXhjbHVkaW5nIHRhZy4KKyAgICoKKyAgICogQHBhcmFtIHR5cGUgICBUaGUgZmllbGQncyB0eXBlLgorICAgKiBAcGFyYW0gdmFsdWUgIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpZWxkJ3MgdmFsdWUuICBNdXN0IGJlIG9mIHRoZSBleGFjdAorICAgKiAgICAgICAgICAgICAgIHR5cGUgd2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkKKyAgICogICAgICAgICAgICAgICB7QGxpbmsgTWVzc2FnZSNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSBmb3IKKyAgICogICAgICAgICAgICAgICB0aGlzIGZpZWxkLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVFbGVtZW50U2l6ZU5vVGFnKAorICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAvLyBOb3RlOiAgTWlub3IgdmlvbGF0aW9uIG9mIDgwLWNoYXIgbGltaXQgcnVsZSBoZXJlIGJlY2F1c2UgdGhpcyB3b3VsZAorICAgICAgLy8gICBhY3R1YWxseSBiZSBoYXJkZXIgdG8gcmVhZCBpZiB3ZSB3cmFwcGVkIHRoZSBsaW5lcy4KKyAgICAgIGNhc2UgRE9VQkxFICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRG91YmxlU2l6ZU5vVGFnICAoKERvdWJsZSAgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgRkxPQVQgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRmxvYXRTaXplTm9UYWcgICAoKEZsb2F0ICAgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgSU5UNjQgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlSW50NjRTaXplTm9UYWcgICAoKExvbmcgICAgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgVUlOVDY0ICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVUludDY0U2l6ZU5vVGFnICAoKExvbmcgICAgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgSU5UMzIgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlSW50MzJTaXplTm9UYWcgICAoKEludGVnZXIgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgRklYRUQ2NCA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQ2NFNpemVOb1RhZyAoKExvbmcgICAgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgRklYRUQzMiA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQzMlNpemVOb1RhZyAoKEludGVnZXIgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgQk9PTCAgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlQm9vbFNpemVOb1RhZyAgICAoKEJvb2xlYW4gICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgU1RSSU5HICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlU3RyaW5nU2l6ZU5vVGFnICAoKFN0cmluZyAgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgR1JPVVAgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlR3JvdXBTaXplTm9UYWcgICAoKE1lc3NhZ2VMaXRlKXZhbHVlKTsKKyAgICAgIGNhc2UgQllURVMgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlQnl0ZXNTaXplTm9UYWcgICAoKEJ5dGVTdHJpbmcgKXZhbHVlKTsKKyAgICAgIGNhc2UgVUlOVDMyICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVUludDMyU2l6ZU5vVGFnICAoKEludGVnZXIgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgU0ZJWEVEMzI6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlU0ZpeGVkMzJTaXplTm9UYWcoKEludGVnZXIgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgU0ZJWEVENjQ6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlU0ZpeGVkNjRTaXplTm9UYWcoKExvbmcgICAgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgU0lOVDMyICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlU0ludDMyU2l6ZU5vVGFnICAoKEludGVnZXIgICAgKXZhbHVlKTsKKyAgICAgIGNhc2UgU0lOVDY0ICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlU0ludDY0U2l6ZU5vVGFnICAoKExvbmcgICAgICAgKXZhbHVlKTsKKworICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5RmllbGQpIHsKKyAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUxhenlGaWVsZFNpemVOb1RhZygoTGF6eUZpZWxkKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVNZXNzYWdlU2l6ZU5vVGFnKChNZXNzYWdlTGl0ZSkgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVFbnVtU2l6ZU5vVGFnKAorICAgICAgICAgICAgKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICJUaGVyZSBpcyBubyB3YXkgdG8gZ2V0IGhlcmUsIGJ1dCB0aGUgY29tcGlsZXIgdGhpbmtzIG90aGVyd2lzZS4iKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSBhIHBhcnRpY3VsYXIgZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRmllbGRTaXplKGZpbmFsIEZpZWxkRGVzY3JpcHRvckxpdGU8Pz4gZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlID0gZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpOworICAgIGludCBudW1iZXIgPSBkZXNjcmlwdG9yLmdldE51bWJlcigpOworICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgaWYgKGRlc2NyaXB0b3IuaXNQYWNrZWQoKSkgeworICAgICAgICBpbnQgZGF0YVNpemUgPSAwOworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pdmFsdWUpIHsKKyAgICAgICAgICBkYXRhU2l6ZSArPSBjb21wdXRlRWxlbWVudFNpemVOb1RhZyh0eXBlLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YVNpemUgKworICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVRhZ1NpemUobnVtYmVyKSArCisgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUmF3VmFyaW50MzJTaXplKGRhdGFTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0PD8+KXZhbHVlKSB7CisgICAgICAgICAgc2l6ZSArPSBjb21wdXRlRWxlbWVudFNpemUodHlwZSwgbnVtYmVyLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNvbXB1dGVFbGVtZW50U2l6ZSh0eXBlLCBudW1iZXIsIHZhbHVlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNWNhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTkzOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogQWxsIGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZXh0ZW5kIHRoaXMgY2xhc3MuICBUaGlzIGNsYXNzCisgKiBpbXBsZW1lbnRzIG1vc3Qgb2YgdGhlIE1lc3NhZ2UgYW5kIEJ1aWxkZXIgaW50ZXJmYWNlcyB1c2luZyBKYXZhIHJlZmxlY3Rpb24uCisgKiBVc2VycyBjYW4gaWdub3JlIHRoaXMgY2xhc3MgYW5kIHByZXRlbmQgdGhhdCBnZW5lcmF0ZWQgbWVzc2FnZXMgaW1wbGVtZW50CisgKiB0aGUgTWVzc2FnZSBpbnRlcmZhY2UgZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UKKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKgorICAgKiBGb3IgdGVzdGluZy4gQWxsb3dzIGEgdGVzdCB0byBkaXNhYmxlIHRoZSBvcHRpbWl6YXRpb24gdGhhdCBhdm9pZHMgdXNpbmcKKyAgICogZmllbGQgYnVpbGRlcnMgZm9yIG5lc3RlZCBtZXNzYWdlcyB1bnRpbCB0aGV5IGFyZSByZXF1ZXN0ZWQuIEJ5IGRpc2FibGluZworICAgKiB0aGlzIG9wdGltaXphdGlvbiwgZXhpc3RpbmcgdGVzdHMgY2FuIGJlIHJldXNlZCB0byB0ZXN0IHRoZSBmaWVsZCBidWlsZGVycy4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhbHdheXNVc2VGaWVsZEJ1aWxkZXJzID0gZmFsc2U7CisKKyAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2UoKSB7CisgIH0KKworICBwcm90ZWN0ZWQgR2VuZXJhdGVkTWVzc2FnZShCdWlsZGVyPD8+IGJ1aWxkZXIpIHsKKyAgfQorCisgIHB1YmxpYyBQYXJzZXI8PyBleHRlbmRzIE1lc3NhZ2U+IGdldFBhcnNlckZvclR5cGUoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7CisgIH0KKworIC8qKgorICAqIEZvciB0ZXN0aW5nLiBBbGxvd3MgYSB0ZXN0IHRvIGRpc2FibGUgdGhlIG9wdGltaXphdGlvbiB0aGF0IGF2b2lkcyB1c2luZworICAqIGZpZWxkIGJ1aWxkZXJzIGZvciBuZXN0ZWQgbWVzc2FnZXMgdW50aWwgdGhleSBhcmUgcmVxdWVzdGVkLiBCeSBkaXNhYmxpbmcKKyAgKiB0aGlzIG9wdGltaXphdGlvbiwgZXhpc3RpbmcgdGVzdHMgY2FuIGJlIHJldXNlZCB0byB0ZXN0IHRoZSBmaWVsZCBidWlsZGVycy4KKyAgKiBTZWUge0BsaW5rIFJlcGVhdGVkRmllbGRCdWlsZGVyfSBhbmQge0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0uCisgICovCisgIHN0YXRpYyB2b2lkIGVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCkgeworICAgIGFsd2F5c1VzZUZpZWxkQnVpbGRlcnMgPSB0cnVlOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlIGZvciB0aGlzIHR5cGUuICBXZSBjYW4ndCBoYXZlIHRoZSBtZXNzYWdlCisgICAqIGNsYXNzIHBhc3MgdGhpcyBpbiB0byB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSBvZiBib290c3RyYXBwaW5nIHRyb3VibGUKKyAgICogd2l0aCBEZXNjcmlwdG9yUHJvdG9zLgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IEZpZWxkQWNjZXNzb3JUYWJsZSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpOworCisgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKKyAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5kZXNjcmlwdG9yOworICB9CisKKyAgLyoqIEludGVybmFsIGhlbHBlciB3aGljaCByZXR1cm5zIGEgbXV0YWJsZSBtYXAuICovCisgIHByaXZhdGUgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHNNdXRhYmxlKCkgeworICAgIGZpbmFsIFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9CisgICAgICBuZXcgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4oKTsKKyAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7CisgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBkZXNjcmlwdG9yLmdldEZpZWxkcygpKSB7CisgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgIGZpbmFsIExpc3Q8Pz4gdmFsdWUgPSAoTGlzdDw/PikgZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoIXZhbHVlLmlzRW1wdHkoKSkgeworICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhhc0ZpZWxkKGZpZWxkKSkgeworICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIGdldEZpZWxkKGZpZWxkKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDogZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWVsZHMoKSkgeworICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgorICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSkgeworICAgICAgICBpZiAoIWhhc0ZpZWxkKGZpZWxkKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsCisgICAgICAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlTGlzdCA9IChMaXN0PE1lc3NhZ2U+KSBnZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgZm9yIChmaW5hbCBNZXNzYWdlIGVsZW1lbnQgOiBtZXNzYWdlTGlzdCkgeworICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChoYXNGaWVsZChmaWVsZCkgJiYgISgoTWVzc2FnZSkgZ2V0RmllbGQoZmllbGQpKS5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChnZXRBbGxGaWVsZHNNdXRhYmxlKCkpOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5oYXModGhpcyk7CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0KHRoaXMpOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQorICAgICAgLmdldFJlcGVhdGVkQ291bnQodGhpcyk7CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCisgICAgICAuZ2V0UmVwZWF0ZWQodGhpcywgaW5kZXgpOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICJUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4iKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkLgorICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCisgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywKKyAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHVua25vd25GaWVsZHMubWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCk7CisgIH0KKworICAvKioKKyAgICogVXNlZCBieSBwYXJzaW5nIGNvbnN0cnVjdG9ycyBpbiBnZW5lcmF0ZWQgY2xhc3Nlcy4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIG1ha2VFeHRlbnNpb25zSW1tdXRhYmxlKCkgeworICAgIC8vIE5vb3AgZm9yIG1lc3NhZ2VzIHdpdGhvdXQgZXh0ZW5zaW9ucy4KKyAgfQorCisgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoQnVpbGRlclBhcmVudCBwYXJlbnQpOworCisgIC8qKgorICAgKiBJbnRlcmZhY2UgZm9yIHRoZSBwYXJlbnQgb2YgYSBCdWlsZGVyIHRoYXQgYWxsb3dzIHRoZSBidWlsZGVyIHRvCisgICAqIGNvbW11bmljYXRlIGludmFsaWRhdGlvbnMgYmFjayB0byB0aGUgcGFyZW50IGZvciB1c2Ugd2hlbiB1c2luZyBuZXN0ZWQKKyAgICogYnVpbGRlcnMuCisgICAqLworICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEJ1aWxkZXJQYXJlbnQgeworCisgICAgLyoqCisgICAgICogQSBidWlsZGVyIGJlY29tZXMgZGlydHkgd2hlbmV2ZXIgYSBmaWVsZCBpcyBtb2RpZmllZCAtLSBpbmNsdWRpbmcgZmllbGRzCisgICAgICogaW4gbmVzdGVkIGJ1aWxkZXJzIC0tIGFuZCBiZWNvbWVzIGNsZWFuIHdoZW4gYnVpbGQoKSBpcyBjYWxsZWQuICBUaHVzLAorICAgICAqIHdoZW4gYSBidWlsZGVyIGJlY29tZXMgZGlydHksIGFsbCBpdHMgcGFyZW50cyBiZWNvbWUgZGlydHkgYXMgd2VsbCwgYW5kCisgICAgICogd2hlbiBpdCBiZWNvbWVzIGNsZWFuLCBhbGwgaXRzIGNoaWxkcmVuIGJlY29tZSBjbGVhbi4gIFRoZSBkaXJ0aW5lc3MKKyAgICAgKiBzdGF0ZSBpcyB1c2VkIHRvIGludmFsaWRhdGUgY2VydGFpbiBjYWNoZWQgdmFsdWVzLgorICAgICAqIDxicj4KKyAgICAgKiBUbyB0aGlzIGVuZCwgYSBidWlsZGVyIGNhbGxzIG1hcmtBc0RpcnR5KCkgb24gaXRzIHBhcmVudCB3aGVuZXZlciBpdAorICAgICAqIHRyYW5zaXRpb25zIGZyb20gY2xlYW4gdG8gZGlydHkuICBUaGUgcGFyZW50IG11c3QgcHJvcGFnYXRlIHRoaXMgY2FsbCB0bworICAgICAqIGl0cyBvd24gcGFyZW50LCB1bmxlc3MgaXQgd2FzIGFscmVhZHkgZGlydHksIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICogZ3JhbmRwYXJlbnQgbXVzdCBuZWNlc3NhcmlseSBhbHJlYWR5IGJlIGRpcnR5IGFzIHdlbGwuICBUaGUgcGFyZW50IGNhbgorICAgICAqIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvICJjbGVhbiIgYWZ0ZXIgY2FsbGluZyBidWlsZCgpIG9uIGFsbCBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICB2b2lkIG1hcmtEaXJ0eSgpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQnVpbGRlciA8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPgorICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjxCdWlsZGVyVHlwZT4geworCisgICAgcHJpdmF0ZSBCdWlsZGVyUGFyZW50IGJ1aWxkZXJQYXJlbnQ7CisKKyAgICBwcml2YXRlIEJ1aWxkZXJQYXJlbnRJbXBsIG1lQXNQYXJlbnQ7CisKKyAgICAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSd2ZSBidWlsdCBhIG1lc3NhZ2UgYW5kIHNvIHdlIGFyZSBub3cgb2JsaWdhdGVkCisgICAgLy8gdG8gZGlzcGF0Y2ggZGlydHkgaW52YWxpZGF0aW9ucy4gU2VlIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlckxpc3RlbmVyLgorICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsZWFuOworCisgICAgcHJpdmF0ZSBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9CisgICAgICAgIFVua25vd25GaWVsZFNldC5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKworICAgIHByb3RlY3RlZCBCdWlsZGVyKCkgeworICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQnVpbGRlcihCdWlsZGVyUGFyZW50IGJ1aWxkZXJQYXJlbnQpIHsKKyAgICAgIHRoaXMuYnVpbGRlclBhcmVudCA9IGJ1aWxkZXJQYXJlbnQ7CisgICAgfQorCisgICAgdm9pZCBkaXNwb3NlKCkgeworICAgICAgYnVpbGRlclBhcmVudCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzdWJjbGFzcyB3aGVuIGEgbWVzc2FnZSBpcyBidWlsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWx0KCkgeworICAgICAgaWYgKGJ1aWxkZXJQYXJlbnQgIT0gbnVsbCkgeworICAgICAgICBtYXJrQ2xlYW4oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHN1YmNsYXNzIG9yIGEgYnVpbGRlciB0byBub3RpZnkgdXMgdGhhdCBhIG1lc3NhZ2Ugd2FzCisgICAgICogYnVpbHQgYW5kIG1heSBiZSBjYWNoZWQgYW5kIHRoZXJlZm9yZSBpbnZhbGlkYXRpb25zIGFyZSBuZWVkZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWFya0NsZWFuKCkgeworICAgICAgdGhpcy5pc0NsZWFuID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgaW52YWxpZGF0aW9ucyBhcmUgbmVlZGVkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgaW52YWxpZGF0aW9ucyBhcmUgbmVlZGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGVhbigpIHsKKyAgICAgIHJldHVybiBpc0NsZWFuOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBvbmx5IHRvIHdvcmsgYXJvdW5kIGFuIGFwcGFyZW50IGJ1ZyBpbiB0aGUKKyAgICAvLyBKYXZhIGNvbXBpbGVyIGFuZC9vciBidWlsZCBzeXN0ZW0uICBTZWUgYnVnICMxODk4NDYzLiAgVGhlIG1lcmUgcHJlc2VuY2UKKyAgICAvLyBvZiB0aGlzIGR1bW15IGNsb25lKCkgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgZ28gYXdheS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xvbmUoKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIlRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFyIGNvZGUgcGF0aHMgdG8gYWxsb3cgc3ViY2xhc3NlcyB0bworICAgICAqIHJlc2V0IGFueSBvZiB0aGVpciBidWlsdGluIGZpZWxkcyBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7CisgICAgICB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlIGZvciB0aGlzIHR5cGUuICBXZSBjYW4ndCBoYXZlIHRoZSBtZXNzYWdlCisgICAgICogY2xhc3MgcGFzcyB0aGlzIGluIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIG9mIGJvb3RzdHJhcHBpbmcgdHJvdWJsZQorICAgICAqIHdpdGggRGVzY3JpcHRvclByb3Rvcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmllbGRBY2Nlc3NvclRhYmxlIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCk7CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChnZXRBbGxGaWVsZHNNdXRhYmxlKCkpOworICAgIH0KKworICAgIC8qKiBJbnRlcm5hbCBoZWxwZXIgd2hpY2ggcmV0dXJucyBhIG11dGFibGUgbWFwLiAqLworICAgIHByaXZhdGUgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHNNdXRhYmxlKCkgeworICAgICAgZmluYWwgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gcmVzdWx0ID0KKyAgICAgICAgbmV3IFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+KCk7CisgICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7CisgICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGRlc2NyaXB0b3IuZ2V0RmllbGRzKCkpIHsKKyAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgIGZpbmFsIExpc3QgdmFsdWUgPSAoTGlzdCkgZ2V0RmllbGQoZmllbGQpOworICAgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXN1bHQucHV0KGZpZWxkLCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChoYXNGaWVsZChmaWVsZCkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIGdldEZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKAorICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5uZXdCdWlsZGVyKCk7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBnZXRGaWVsZEJ1aWxkZXIoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0QnVpbGRlcih0aGlzKTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5oYXModGhpcyk7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIE9iamVjdCBvYmplY3QgPSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5nZXQodGhpcyk7CisgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgIC8vIFRoZSB1bmRlcmx5aW5nIGxpc3Qgb2JqZWN0IGlzIHN0aWxsIG1vZGlmaWFibGUgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBleHBvc2UgdGhlIG1vZGlmaWFibGUgbGlzdCB0byB0aGUgY2FsbGVyLgorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgb2JqZWN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIHNldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5zZXQodGhpcywgdmFsdWUpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXJGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpLmNsZWFyKHRoaXMpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQorICAgICAgICAgIC5nZXRSZXBlYXRlZENvdW50KHRoaXMpOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCisgICAgICAgICAgLmdldFJlcGVhdGVkKHRoaXMsIGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgc2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCisgICAgICAgIC5zZXRSZXBlYXRlZCh0aGlzLCBpbmRleCwgdmFsdWUpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgYWRkUmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5hZGRSZXBlYXRlZCh0aGlzLCB2YWx1ZSk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBCdWlsZGVyVHlwZSBzZXRVbmtub3duRmllbGRzKAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgeworICAgICAgdGhpcy51bmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkczsKKyAgICAgIG9uQ2hhbmdlZCgpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgQnVpbGRlclR5cGUgbWVyZ2VVbmtub3duRmllbGRzKAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgeworICAgICAgdGhpcy51bmtub3duRmllbGRzID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIodGhpcy51bmtub3duRmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKHVua25vd25GaWVsZHMpCisgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RmllbGRzKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgorICAgICAgICBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSB7CisgICAgICAgICAgaWYgKCFoYXNGaWVsZChmaWVsZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsCisgICAgICAgICAgICBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VMaXN0ID0gKExpc3Q8TWVzc2FnZT4pIGdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWVzc2FnZSBlbGVtZW50IDogbWVzc2FnZUxpc3QpIHsKKyAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzRmllbGQoZmllbGQpICYmCisgICAgICAgICAgICAgICAgISgoTWVzc2FnZSkgZ2V0RmllbGQoZmllbGQpKS5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIGZpbmFsIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgeworICAgICAgcmV0dXJuIHVua25vd25GaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAorICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQnVpbGRlclBhcmVudH0gZm9yIGdpdmluZyB0byBvdXIgY2hpbGRyZW4uIFRoaXMKKyAgICAgKiBzbWFsbCBpbm5lciBjbGFzcyBtYWtlcyBpdCBzbyB3ZSBkb24ndCBwdWJsaWNseSBleHBvc2UgdGhlIEJ1aWxkZXJQYXJlbnQKKyAgICAgKiBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQnVpbGRlclBhcmVudEltcGwgaW1wbGVtZW50cyBCdWlsZGVyUGFyZW50IHsKKworICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7CisgICAgICAgIG9uQ2hhbmdlZCgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBCdWlsZGVyUGFyZW50fSBmb3IgZ2l2aW5nIHRvIG91ciBjaGlsZHJlbi4KKyAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIHBhcmVudCBmb3Igb3VyIGNoaWxkcmVuLgorICAgICAqLworICAgIHByb3RlY3RlZCBCdWlsZGVyUGFyZW50IGdldFBhcmVudEZvckNoaWxkcmVuKCkgeworICAgICAgaWYgKG1lQXNQYXJlbnQgPT0gbnVsbCkgeworICAgICAgICBtZUFzUGFyZW50ID0gbmV3IEJ1aWxkZXJQYXJlbnRJbXBsKCk7CisgICAgICB9CisgICAgICByZXR1cm4gbWVBc1BhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIHRoZSBidWlsZGVyIG9yIG9uZSBvZiBpdHMgbmVzdGVkIGNoaWxkcmVuIGhhcyBjaGFuZ2VkCisgICAgICogYW5kIGFueSBwYXJlbnQgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGl0cyBpbnZhbGlkYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgb25DaGFuZ2VkKCkgeworICAgICAgaWYgKGlzQ2xlYW4gJiYgYnVpbGRlclBhcmVudCAhPSBudWxsKSB7CisgICAgICAgIGJ1aWxkZXJQYXJlbnQubWFya0RpcnR5KCk7CisKKyAgICAgICAgLy8gRG9uJ3Qga2VlcCBkaXNwYXRjaGluZyBpbnZhbGlkYXRpb25zIHVudGlsIGJ1aWxkIGlzIGNhbGxlZCBhZ2Fpbi4KKyAgICAgICAgaXNDbGVhbiA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEV4dGVuc2lvbnMtcmVsYXRlZCBzdHVmZgorCisgIHB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8CisgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPiBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXIgeworCisgICAgLyoqIENoZWNrIGlmIGEgc2luZ3VsYXIgZXh0ZW5zaW9uIGlzIHByZXNlbnQuICovCisgICAgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7CisKKyAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pOworCisgICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLworICAgIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbihHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKKyAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCisgICAgICAgIGludCBpbmRleCk7CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3NlcyBmb3IgbWVzc2FnZSB0eXBlcyB0aGF0IGNvbnRhaW4gZXh0ZW5zaW9uIHJhbmdlcworICAgKiBzdWJjbGFzcyB0aGlzLgorICAgKgorICAgKiA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgdHlwZS1zYWZlIGFjY2Vzc29ycyBmb3IgZXh0ZW5zaW9ucy4gIFRoZXkKKyAgICogaW1wbGVtZW50IGFsbCB0aGUgc2FtZSBvcGVyYXRpb25zIHRoYXQgeW91IGNhbiBkbyB3aXRoIG5vcm1hbCBmaWVsZHMgLS0KKyAgICogZS5nLiAiaGFzIiwgImdldCIsIGFuZCAiZ2V0Q291bnQiIC0tIGJ1dCBmb3IgZXh0ZW5zaW9ucy4gIFRoZSBleHRlbnNpb25zCisgICAqIGFyZSBpZGVudGlmaWVkIHVzaW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3Mge0BsaW5rIEdlbmVyYXRlZEV4dGVuc2lvbn07CisgICAqIHRoZSBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZXZlcnkKKyAgICogZXh0ZW5zaW9uIGluIGl0cyBpbnB1dC4gIFRocm91Z2ggdGhlIG1hZ2ljIG9mIGdlbmVyaWNzLCBhbGwgaXMgbWFkZQorICAgKiB0eXBlLXNhZmUuCisgICAqCisgICAqIDxwPkZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSBoYXZlIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgorICAgKgorICAgKiA8cHJlPgorICAgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKKyAgICoKKyAgICogbWVzc2FnZSBGb28geworICAgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgICAqIH0KKyAgICoKKyAgICogZXh0ZW5kIEZvbyB7CisgICAqICAgb3B0aW9uYWwgaW50MzIgYmFyOworICAgKiB9CisgICAqIDwvcHJlPgorICAgKgorICAgKiA8cD5UaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6CisgICAqCisgICAqIDxwcmU+CisgICAqIE15UHJvdG8uRm9vIGZvbyA9IGdldEZvbygpOworICAgKiBpbnQgaSA9IGZvby5nZXRFeHRlbnNpb24oTXlQcm90by5iYXIpOworICAgKiA8L3ByZT4KKyAgICoKKyAgICogPHA+U2VlIGFsc28ge0BsaW5rIEV4dGVuZGFibGVCdWlsZGVyfS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRXh0ZW5kYWJsZU1lc3NhZ2U8CisgICAgICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2U+CisgICAgICBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UKKyAgICAgIGltcGxlbWVudHMgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8TWVzc2FnZVR5cGU+IHsKKworICAgIHByaXZhdGUgZmluYWwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zOworCisgICAgcHJvdGVjdGVkIEV4dGVuZGFibGVNZXNzYWdlKCkgeworICAgICAgdGhpcy5leHRlbnNpb25zID0gRmllbGRTZXQubmV3RmllbGRTZXQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZU1lc3NhZ2UoCisgICAgICAgIEV4dGVuZGFibGVCdWlsZGVyPE1lc3NhZ2VUeXBlLCA/PiBidWlsZGVyKSB7CisgICAgICBzdXBlcihidWlsZGVyKTsKKyAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGJ1aWxkZXIuYnVpbGRFeHRlbnNpb25zKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgeworICAgICAgaWYgKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPQorICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJFeHRlbnNpb24gaXMgZm9yIHR5cGUgXCIiICsKKyAgICAgICAgICBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCisgICAgICAgICAgIlwiIHdoaWNoIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZSBcIiIgKworICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZXh0ZW5zaW9ucy5nZXRGaWVsZChkZXNjcmlwdG9yKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgIHJldHVybiAoVHlwZSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKAorICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5zaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZSgKKyAgICAgICAgICBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGQoZGVzY3JpcHRvciwgaW5kZXgpKTsKKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY2hlY2sgaWYgYWxsIGV4dGVuc2lvbnMgYXJlIGluaXRpYWxpemVkLiAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmlzSW5pdGlhbGl6ZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgcmV0dXJuIHN1cGVyLmlzSW5pdGlhbGl6ZWQoKSAmJiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZVVua25vd25GaWVsZCgKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAorICAgICAgICBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyLm1lcmdlRmllbGRGcm9tKAorICAgICAgICBpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIGdldERlc2NyaXB0b3JGb3JUeXBlKCksCisgICAgICAgIG51bGwsIGV4dGVuc2lvbnMsIHRhZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSBwYXJzaW5nIGNvbnN0cnVjdG9ycyBpbiBnZW5lcmF0ZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlRXh0ZW5zaW9uc0ltbXV0YWJsZSgpIHsKKyAgICAgIGV4dGVuc2lvbnMubWFrZUltbXV0YWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgc3ViY2xhc3NlcyB0byBzZXJpYWxpemUgZXh0ZW5zaW9ucy4gIEV4dGVuc2lvbiByYW5nZXMgbWF5IGJlCisgICAgICogaW50ZXJsZWF2ZWQgd2l0aCBmaWVsZCBudW1iZXJzLCBidXQgd2UgbXVzdCB3cml0ZSB0aGVtIGluIGNhbm9uaWNhbAorICAgICAqIChzb3J0ZWQgYnkgZmllbGQgbnVtYmVyKSBvcmRlci4gIEV4dGVuc2lvbldyaXRlciBoZWxwcyB1cyB3cml0ZQorICAgICAqIGluZGl2aWR1YWwgcmFuZ2VzIG9mIGV4dGVuc2lvbnMgYXQgb25jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgRXh0ZW5zaW9uV3JpdGVyIHsKKyAgICAgIC8vIEltYWdpbmUgaG93IG11Y2ggc2ltcGxlciB0aGlzIGNvZGUgd291bGQgYmUgaWYgSmF2YSBpdGVyYXRvcnMgaGFkCisgICAgICAvLyBhIHdheSB0byBnZXQgdGhlIG5leHQgZWxlbWVudCB3aXRob3V0IGFkdmFuY2luZyB0aGUgaXRlcmF0b3IuCisKKyAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8TWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0Pj4gaXRlciA9CisgICAgICAgIGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKKyAgICAgIHByaXZhdGUgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBuZXh0OworICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1lc3NhZ2VTZXRXaXJlRm9ybWF0OworCisgICAgICBwcml2YXRlIEV4dGVuc2lvbldyaXRlcihmaW5hbCBib29sZWFuIG1lc3NhZ2VTZXRXaXJlRm9ybWF0KSB7CisgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgIG5leHQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm1lc3NhZ2VTZXRXaXJlRm9ybWF0ID0gbWVzc2FnZVNldFdpcmVGb3JtYXQ7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVW50aWwoZmluYWwgaW50IGVuZCwgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0S2V5KCkuZ2V0TnVtYmVyKCkgPCBlbmQpIHsKKyAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5leHQuZ2V0S2V5KCk7CisgICAgICAgICAgaWYgKG1lc3NhZ2VTZXRXaXJlRm9ybWF0ICYmIGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuSmF2YVR5cGUuTUVTU0FHRSAmJgorICAgICAgICAgICAgICAhZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgTGF6eUZpZWxkLkxhenlFbnRyeTw/PikgeworICAgICAgICAgICAgICBvdXRwdXQud3JpdGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uKGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAoKExhenlGaWVsZC5MYXp5RW50cnk8Pz4pIG5leHQpLmdldEZpZWxkKCkudG9CeXRlU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihkZXNjcmlwdG9yLmdldE51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlKSBuZXh0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPKHhpYW5nbCk6IFRha2VuIGNhcmUgb2YgZm9sbG93aW5nIGNvZGUsIGl0IG1heSBjYXVzZQorICAgICAgICAgICAgLy8gcHJvYmxlbSB3aGVuIHdlIHVzZSBMYXp5RmllbGQgZm9yIG5vcm1hbCBmaWVsZHMvZXh0ZW5zaW9ucy4KKyAgICAgICAgICAgIC8vIER1ZSB0byB0aGUgb3B0aW9uYWwgZmllbGQgY2FuIGJlIGR1cGxpY2F0ZWQgYXQgdGhlIGVuZCBvZgorICAgICAgICAgICAgLy8gc2VyaWFsaXplZCBieXRlcywgd2hpY2ggd2lsbCBtYWtlIHRoZSBzZXJpYWxpemVkIHNpemUgY2hhbmdlCisgICAgICAgICAgICAvLyBhZnRlciBsYXp5IGZpZWxkIHBhcnNlZC4gU28gd2hlbiB3ZSB1c2UgTGF6eUZpZWxkIGdsb2JhbGx5LAorICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGZvbGxvd2luZyB3cml0ZSBtZXRob2QgdG8gd3JpdGUgY2FjaGVkCisgICAgICAgICAgICAvLyBieXRlcyBkaXJlY3RseSByYXRoZXIgdGhhbiB3cml0ZSB0aGUgcGFyc2VkIG1lc3NhZ2UuCisgICAgICAgICAgICBGaWVsZFNldC53cml0ZUZpZWxkKGRlc2NyaXB0b3IsIG5leHQuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBFeHRlbnNpb25Xcml0ZXIgbmV3RXh0ZW5zaW9uV3JpdGVyKCkgeworICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIoZmFsc2UpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKSB7CisgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbldyaXRlcih0cnVlKTsKKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBleHRlbnNpb25zLiAqLworICAgIHByb3RlY3RlZCBpbnQgZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCkgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIGludCBleHRlbnNpb25zU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBSZWZsZWN0aW9uCisKKyAgICBwcm90ZWN0ZWQgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRFeHRlbnNpb25GaWVsZHMoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRBbGxGaWVsZHMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICBmaW5hbCBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9IHN1cGVyLmdldEFsbEZpZWxkc011dGFibGUoKTsKKyAgICAgIHJlc3VsdC5wdXRBbGwoZ2V0RXh0ZW5zaW9uRmllbGRzKCkpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXN1bHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5oYXNGaWVsZChmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzRmllbGQoZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgICAvLyBMYWNraW5nIGFuIEV4dGVuc2lvblJlZ2lzdHJ5LCB3ZSBoYXZlIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICAgICAvLyBleHRlbnNpb24ncyByZWFsIHR5cGUsIHNvIHdlIHJldHVybiBhIER5bmFtaWNNZXNzYWdlLgorICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRGaWVsZChmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlZCBtZXNzYWdlIGJ1aWxkZXJzIGZvciBtZXNzYWdlIHR5cGVzIHRoYXQgY29udGFpbiBleHRlbnNpb24gcmFuZ2VzCisgICAqIHN1YmNsYXNzIHRoaXMuCisgICAqCisgICAqIDxwPlRoaXMgY2xhc3MgaW1wbGVtZW50cyB0eXBlLXNhZmUgYWNjZXNzb3JzIGZvciBleHRlbnNpb25zLiAgVGhleQorICAgKiBpbXBsZW1lbnQgYWxsIHRoZSBzYW1lIG9wZXJhdGlvbnMgdGhhdCB5b3UgY2FuIGRvIHdpdGggbm9ybWFsIGZpZWxkcyAtLQorICAgKiBlLmcuICJnZXQiLCAic2V0IiwgYW5kICJhZGQiIC0tIGJ1dCBmb3IgZXh0ZW5zaW9ucy4gIFRoZSBleHRlbnNpb25zIGFyZQorICAgKiBpZGVudGlmaWVkIHVzaW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3Mge0BsaW5rIEdlbmVyYXRlZEV4dGVuc2lvbn07IHRoZQorICAgKiBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZXZlcnkKKyAgICogZXh0ZW5zaW9uIGluIGl0cyBpbnB1dC4gIFRocm91Z2ggdGhlIG1hZ2ljIG9mIGdlbmVyaWNzLCBhbGwgaXMgbWFkZQorICAgKiB0eXBlLXNhZmUuCisgICAqCisgICAqIDxwPkZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSBoYXZlIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgorICAgKgorICAgKiA8cHJlPgorICAgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKKyAgICoKKyAgICogbWVzc2FnZSBGb28geworICAgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgICAqIH0KKyAgICoKKyAgICogZXh0ZW5kIEZvbyB7CisgICAqICAgb3B0aW9uYWwgaW50MzIgYmFyOworICAgKiB9CisgICAqIDwvcHJlPgorICAgKgorICAgKiA8cD5UaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6CisgICAqCisgICAqIDxwcmU+CisgICAqIE15UHJvdG8uRm9vIGZvbyA9CisgICAqICAgTXlQcm90by5Gb28ubmV3QnVpbGRlcigpCisgICAqICAgICAuc2V0RXh0ZW5zaW9uKE15UHJvdG8uYmFyLCAxMjMpCisgICAqICAgICAuYnVpbGQoKTsKKyAgICogPC9wcmU+CisgICAqCisgICAqIDxwPlNlZSBhbHNvIHtAbGluayBFeHRlbmRhYmxlTWVzc2FnZX0uCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBFeHRlbmRhYmxlQnVpbGRlcjwKKyAgICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZSwKKyAgICAgICAgQnVpbGRlclR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlQnVpbGRlcj4KKyAgICAgIGV4dGVuZHMgQnVpbGRlcjxCdWlsZGVyVHlwZT4KKyAgICAgIGltcGxlbWVudHMgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8TWVzc2FnZVR5cGU+IHsKKworICAgIHByaXZhdGUgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zID0gRmllbGRTZXQuZW1wdHlTZXQoKTsKKworICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlQnVpbGRlcigpIHt9CisKKyAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZUJ1aWxkZXIoCisgICAgICAgIEJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7CisgICAgICBzdXBlcihwYXJlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbGVhcigpIHsKKyAgICAgIGV4dGVuc2lvbnMgPSBGaWVsZFNldC5lbXB0eVNldCgpOworICAgICAgcmV0dXJuIHN1cGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCBoZXJlIG9ubHkgdG8gd29yayBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZQorICAgIC8vIEphdmEgY29tcGlsZXIgYW5kL29yIGJ1aWxkIHN5c3RlbS4gIFNlZSBidWcgIzE4OTg0NjMuICBUaGUgbWVyZSBwcmVzZW5jZQorICAgIC8vIG9mIHRoaXMgZHVtbXkgY2xvbmUoKSBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBnbyBhd2F5LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbG9uZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKSB7CisgICAgICBpZiAoZXh0ZW5zaW9ucy5pc0ltbXV0YWJsZSgpKSB7CisgICAgICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zLmNsb25lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgeworICAgICAgaWYgKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPQorICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJFeHRlbnNpb24gaXMgZm9yIHR5cGUgXCIiICsKKyAgICAgICAgICBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCisgICAgICAgICAgIlwiIHdoaWNoIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZSBcIiIgKworICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZXh0ZW5zaW9ucy5nZXRGaWVsZChkZXNjcmlwdG9yKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgIHJldHVybiAoVHlwZSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKAorICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5zaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZSgKKyAgICAgICAgICBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGQoZGVzY3JpcHRvciwgaW5kZXgpKTsKKyAgICB9CisKKyAgICAvKiogU2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBzZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBUeXBlIHZhbHVlKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZXh0ZW5zaW9ucy5zZXRGaWVsZChkZXNjcmlwdG9yLCBleHRlbnNpb24udG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiwKKyAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBUeXBlIHZhbHVlKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZXh0ZW5zaW9ucy5zZXRSZXBlYXRlZEZpZWxkKAorICAgICAgICBkZXNjcmlwdG9yLCBpbmRleCwKKyAgICAgICAgZXh0ZW5zaW9uLnNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBBcHBlbmQgYSB2YWx1ZSB0byBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIGFkZEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCisgICAgICAgIGZpbmFsIFR5cGUgdmFsdWUpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoCisgICAgICAgICAgZGVzY3JpcHRvciwgZXh0ZW5zaW9uLnNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBDbGVhciBhbiBleHRlbnNpb24uICovCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBjbGVhckV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zLmNsZWFyRmllbGQoZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSk7CisgICAgICBvbkNoYW5nZWQoKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIGNoZWNrIGlmIGFsbCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZC4gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5pc0luaXRpYWxpemVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBidWlsZCBjb2RlIHBhdGggdG8gY3JlYXRlIGEgY29weSBvZiB0aGUgZXh0ZW5zaW9ucyBmb3IKKyAgICAgKiBidWlsZGluZyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gYnVpbGRFeHRlbnNpb25zKCkgeworICAgICAgZXh0ZW5zaW9ucy5tYWtlSW1tdXRhYmxlKCk7CisgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgcmV0dXJuIHN1cGVyLmlzSW5pdGlhbGl6ZWQoKSAmJiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkIG9yIGFuIGV4dGVuc2lvbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAorICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXIubWVyZ2VGaWVsZEZyb20oCisgICAgICAgIGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSwKKyAgICAgICAgdGhpcywgbnVsbCwgdGFnKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBSZWZsZWN0aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICBmaW5hbCBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9IHN1cGVyLmdldEFsbEZpZWxkc011dGFibGUoKTsKKyAgICAgIHJlc3VsdC5wdXRBbGwoZXh0ZW5zaW9ucy5nZXRBbGxGaWVsZHMoKSk7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZXh0ZW5zaW9ucy5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICAgIC8vIExhY2tpbmcgYW4gRXh0ZW5zaW9uUmVnaXN0cnksIHdlIGhhdmUgbm8gd2F5IHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgICAgIC8vIGV4dGVuc2lvbidzIHJlYWwgdHlwZSwgc28gd2UgcmV0dXJuIGEgRHluYW1pY01lc3NhZ2UuCisgICAgICAgICAgICByZXR1cm4gRHluYW1pY01lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0RGVmYXVsdFZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5oYXNGaWVsZChmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzRmllbGQoZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBzZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgICAgb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXJGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgICBleHRlbnNpb25zLmNsZWFyRmllbGQoZmllbGQpOworICAgICAgICBvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5jbGVhckZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgc2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgICBleHRlbnNpb25zLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4LCB2YWx1ZSk7CisgICAgICAgIG9uQ2hhbmdlZCgpOworICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4LCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIGFkZFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICAgIGV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOworICAgICAgICBvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgbWVyZ2VFeHRlbnNpb25GaWVsZHMoZmluYWwgRXh0ZW5kYWJsZU1lc3NhZ2Ugb3RoZXIpIHsKKyAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKKyAgICAgIGV4dGVuc2lvbnMubWVyZ2VGcm9tKG90aGVyLmV4dGVuc2lvbnMpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJGaWVsZERlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGV4dGVuc2lvbi4gVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gd2hldGhlcgorICAgKiB0aGUgZXh0ZW5zaW9uIGlzIHNjb3BlZCBpbiB0aGUgdG9wIGxldmVsIG9mIGEgZmlsZSBvciBzY29wZWQgaW4gYSBNZXNzYWdlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIgeworICAgIEZpZWxkRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCk7CisgIH0KKworICAvKiogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAqLworICBwdWJsaWMgc3RhdGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2UsIFR5cGU+CisgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+CisgICAgICBuZXdNZXNzYWdlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKGZpbmFsIE1lc3NhZ2Ugc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZXNjcmlwdG9ySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIHNpbmd1bGFyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpIHsKKyAgICAvLyBGb3IgZXh0ZW5zaW9ucyBzY29wZWQgd2l0aGluIGEgTWVzc2FnZSwgd2UgdXNlIHRoZSBNZXNzYWdlIHRvIHJlc29sdmUKKyAgICAvLyB0aGUgb3V0ZXIgY2xhc3MncyBkZXNjcmlwdG9yLCBmcm9tIHdoaWNoIHRoZSBleHRlbnNpb24gZGVzY3JpcHRvciBpcworICAgIC8vIG9idGFpbmVkLgorICAgIHJldHVybiBuZXcgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPigKKyAgICAgICAgbmV3IEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIoKSB7CisgICAgICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RXh0ZW5zaW9ucygpCisgICAgICAgICAgICAgICAgLmdldChkZXNjcmlwdG9ySW5kZXgpOworICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgc2luZ3VsYXJUeXBlLAorICAgICAgICBkZWZhdWx0SW5zdGFuY2UpOworICB9CisKKyAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KKyAgcHVibGljIHN0YXRpYyA8Q29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlLCBUeXBlPgorICAgICBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+CisgICAgIG5ld0ZpbGVTY29wZWRHZW5lcmF0ZWRFeHRlbnNpb24oZmluYWwgQ2xhc3Mgc2luZ3VsYXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKSB7CisgICAgLy8gRm9yIGV4dGVuc2lvbnMgc2NvcGVkIHdpdGhpbiBhIGZpbGUsIHdlIHJlbHkgb24gdGhlIG91dGVyIGNsYXNzJ3MKKyAgICAvLyBzdGF0aWMgaW5pdGlhbGl6ZXIgdG8gY2FsbCBpbnRlcm5hbEluaXQoKSBvbiB0aGUgZXh0ZW5zaW9uIHdoZW4gdGhlCisgICAgLy8gZGVzY3JpcHRvciBpcyBhdmFpbGFibGUuCisgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+KAorICAgICAgICBudWxsLCAgLy8gRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciBpcyBpbml0aWFsaXplZCBpbiBpbnRlcm5hbEluaXQoKTsKKyAgICAgICAgc2luZ3VsYXJUeXBlLAorICAgICAgICBkZWZhdWx0SW5zdGFuY2UpOworICB9CisKKyAgLyoqCisgICAqIFR5cGUgdXNlZCB0byByZXByZXNlbnQgZ2VuZXJhdGVkIGV4dGVuc2lvbnMuICBUaGUgcHJvdG9jb2wgY29tcGlsZXIKKyAgICogZ2VuZXJhdGVzIGEgc3RhdGljIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZvciBlYWNoIGV4dGVuc2lvbi4KKyAgICoKKyAgICogPHA+Rm9yIGV4YW1wbGUsIGltYWdpbmUgeW91IGhhdmUgdGhlIHtAY29kZSAucHJvdG99IGZpbGU6CisgICAqCisgICAqIDxwcmU+CisgICAqIG9wdGlvbiBqYXZhX2NsYXNzID0gIk15UHJvdG8iOworICAgKgorICAgKiBtZXNzYWdlIEZvbyB7CisgICAqICAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKKyAgICogfQorICAgKgorICAgKiBleHRlbmQgRm9vIHsKKyAgICogICBvcHRpb25hbCBpbnQzMiBiYXI7CisgICAqIH0KKyAgICogPC9wcmU+CisgICAqCisgICAqIDxwPlRoZW4sIHtAY29kZSBNeVByb3RvLkZvby5iYXJ9IGhhcyB0eXBlCisgICAqIHtAY29kZSBHZW5lcmF0ZWRFeHRlbnNpb248TXlQcm90by5Gb28sIEludGVnZXI+fS4KKyAgICoKKyAgICogPHA+SW4gZ2VuZXJhbCwgdXNlcnMgc2hvdWxkIGlnbm9yZSB0aGUgZGV0YWlscyBvZiB0aGlzIHR5cGUsIGFuZCBzaW1wbHkgdXNlCisgICAqIHRoZXNlIHN0YXRpYyBzaW5nbGV0b25zIGFzIHBhcmFtZXRlcnMgdG8gdGhlIGV4dGVuc2lvbiBhY2Nlc3NvcnMgZGVmaW5lZAorICAgKiBpbiB7QGxpbmsgRXh0ZW5kYWJsZU1lc3NhZ2V9IGFuZCB7QGxpbmsgRXh0ZW5kYWJsZUJ1aWxkZXJ9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZW5lcmF0ZWRFeHRlbnNpb248CisgICAgICBDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2UsIFR5cGU+IHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBGaW5kIHdheXMgdG8gYXZvaWQgdXNpbmcgSmF2YSByZWZsZWN0aW9uIHdpdGhpbiB0aGlzCisgICAgLy8gICBjbGFzcy4gIEFsc28gdHJ5IHRvIGF2b2lkIHN1cHByZXNzaW5nIHVuY2hlY2tlZCB3YXJuaW5ncy4KKworICAgIC8vIFdlIGNhbid0IGFsd2F5cyBpbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIG9mIGEgR2VuZXJhdGVkRXh0ZW5zaW9uIHdoZW4KKyAgICAvLyB3ZSBmaXJzdCBjb25zdHJ1Y3QgaXQgZHVlIHRvIGluaXRpYWxpemF0aW9uIG9yZGVyIGRpZmZpY3VsdGllcyAobmFtZWx5LAorICAgIC8vIHRoZSBkZXNjcmlwdG9yIG1heSBub3QgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIHlldCwgc2luY2UgaXQgaXMgb2Z0ZW4KKyAgICAvLyBjb25zdHJ1Y3RlZCBieSB0aGUgaW5pdGlhbGl6ZXIgb2YgYSBzZXBhcmF0ZSBtb2R1bGUpLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbmVzdGVkIGV4dGVuc2lvbnMsIHdlIGluaXRpYWxpemUgdGhlCisgICAgLy8gRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciB3aXRoIGFuIGluc3RhbmNlIHRoYXQgdXNlcyB0aGUgc2NvcGluZworICAgIC8vIE1lc3NhZ2UncyBkZWZhdWx0IGluc3RhbmNlIHRvIHJldHJpZXZlIHRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2Ygbm9uLW5lc3RlZCBleHRlbnNpb25zLCB3ZSBpbml0aWFsaXplIHRoZQorICAgIC8vIEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIgdG8gbnVsbCBhbmQgcmVseSBvbiB0aGUgb3V0ZXIgY2xhc3MncyBzdGF0aWMKKyAgICAvLyBpbml0aWFsaXplciB0byBjYWxsIGludGVybmFsSW5pdCgpIGFmdGVyIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIHBhcnNlZC4KKyAgICBwcml2YXRlIEdlbmVyYXRlZEV4dGVuc2lvbihFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIGRlc2NyaXB0b3JSZXRyaWV2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2luZ3VsYXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSkgeworICAgICAgaWYgKE1lc3NhZ2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzaW5ndWxhclR5cGUpICYmCisgICAgICAgICAgIXNpbmd1bGFyVHlwZS5pc0luc3RhbmNlKG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiQmFkIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UgZm9yICIgKyBzaW5ndWxhclR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZGVzY3JpcHRvclJldHJpZXZlciA9IGRlc2NyaXB0b3JSZXRyaWV2ZXI7CisgICAgICB0aGlzLnNpbmd1bGFyVHlwZSA9IHNpbmd1bGFyVHlwZTsKKyAgICAgIHRoaXMubWVzc2FnZURlZmF1bHRJbnN0YW5jZSA9IG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7CisKKyAgICAgIGlmIChQcm90b2NvbE1lc3NhZ2VFbnVtLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc2luZ3VsYXJUeXBlKSkgeworICAgICAgICB0aGlzLmVudW1WYWx1ZU9mID0gZ2V0TWV0aG9kT3JEaWUoc2luZ3VsYXJUeXBlLCAidmFsdWVPZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKKyAgICAgICAgdGhpcy5lbnVtR2V0VmFsdWVEZXNjcmlwdG9yID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKHNpbmd1bGFyVHlwZSwgImdldFZhbHVlRGVzY3JpcHRvciIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5lbnVtVmFsdWVPZiA9IG51bGw7CisgICAgICAgIHRoaXMuZW51bUdldFZhbHVlRGVzY3JpcHRvciA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KKyAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbEluaXQoZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgIGlmIChkZXNjcmlwdG9yUmV0cmlldmVyICE9IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWxyZWFkeSBpbml0aWFsaXplZC4iKTsKKyAgICAgIH0KKyAgICAgIGRlc2NyaXB0b3JSZXRyaWV2ZXIgPSBuZXcgRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlcigpIHsKKyAgICAgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIGRlc2NyaXB0b3JSZXRyaWV2ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBzaW5ndWxhclR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZW51bVZhbHVlT2Y7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZW51bUdldFZhbHVlRGVzY3JpcHRvcjsKKworICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKKyAgICAgIGlmIChkZXNjcmlwdG9yUmV0cmlldmVyID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJnZXREZXNjcmlwdG9yKCkgY2FsbGVkIGJlZm9yZSBpbnRlcm5hbEluaXQoKSIpOworICAgICAgfQorICAgICAgcmV0dXJuIGRlc2NyaXB0b3JSZXRyaWV2ZXIuZ2V0RGVzY3JpcHRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBleHRlbnNpb24gaXMgYW4gZW1iZWRkZWQgbWVzc2FnZSBvciBncm91cCwgcmV0dXJucyB0aGUgZGVmYXVsdAorICAgICAqIGluc3RhbmNlIG9mIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSB7CisgICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gdGhlIHR5cGUgdXNlZCBieSB0aGUgcmVmbGVjdGlvbiBhY2Nlc3NvcnMgdG8gdGhlIHR5cGUgdXNlZAorICAgICAqIGJ5IG5hdGl2ZSBhY2Nlc3NvcnMuICBFLmcuLCBmb3IgZW51bXMsIHRoZSByZWZsZWN0aW9uIGFjY2Vzc29ycyB1c2UKKyAgICAgKiBFbnVtVmFsdWVEZXNjcmlwdG9ycyBidXQgdGhlIG5hdGl2ZSBhY2Nlc3NvcnMgdXNlIHRoZSBnZW5lcmF0ZWQgZW51bQorICAgICAqIHR5cGUuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBPYmplY3QgZnJvbVJlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7CisgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSB8fAorICAgICAgICAgICAgZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5FTlVNKSB7CisgICAgICAgICAgLy8gTXVzdCBjb252ZXJ0IHRoZSB3aG9sZSBsaXN0LgorICAgICAgICAgIGZpbmFsIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgdmFsdWUpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoZWxlbWVudCkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjZnJvbVJlZmxlY3Rpb25UeXBlKE9iamVjdCl9LCBidXQgaWYgdGhlIHR5cGUgaXMgYSByZXBlYXRlZAorICAgICAqIHR5cGUsIHRoaXMgY29udmVydHMgYSBzaW5nbGUgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBzaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOworICAgICAgc3dpdGNoIChkZXNjcmlwdG9yLmdldEphdmFUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICAgIGlmIChzaW5ndWxhclR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSXQgc2VlbXMgdGhlIGNvcHkgb2YgdGhlIGVtYmVkZGVkIG1lc3NhZ2Ugc3RvcmVkIGluc2lkZSB0aGUKKyAgICAgICAgICAgIC8vIGV4dGVuZGVkIG1lc3NhZ2UgaXMgbm90IG9mIHRoZSBleGFjdCB0eXBlIHRoZSB1c2VyIHdhcworICAgICAgICAgICAgLy8gZXhwZWN0aW5nLiAgVGhpcyBjYW4gaGFwcGVuIGlmIGEgdXNlciBkZWZpbmVzIGEKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlZEV4dGVuc2lvbiBtYW51YWxseSBhbmQgZ2l2ZXMgaXQgYSBkaWZmZXJlbnQgdHlwZS4KKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gbm9ybWFsIHVzZS4gIEJ1dCwgdG8gYmUgbmljZSwgd2UnbGwKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1lc3NhZ2UgdG8gd2hhdGV2ZXIgdHlwZSB0aGUgY2FsbGVyIHdhcyBleHBlY3RpbmcuCisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKChNZXNzYWdlKSB2YWx1ZSkuYnVpbGQoKTsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZW51bVZhbHVlT2YsIG51bGwsIChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZnJvbSB0aGUgdHlwZSB1c2VkIGJ5IHRoZSBuYXRpdmUgYWNjZXNzb3JzIHRvIHRoZSB0eXBlIHVzZWQKKyAgICAgKiBieSByZWZsZWN0aW9uIGFjY2Vzc29ycy4gIEUuZy4sIGZvciBlbnVtcywgdGhlIHJlZmxlY3Rpb24gYWNjZXNzb3JzIHVzZQorICAgICAqIEVudW1WYWx1ZURlc2NyaXB0b3JzIGJ1dCB0aGUgbmF0aXZlIGFjY2Vzc29ycyB1c2UgdGhlIGdlbmVyYXRlZCBlbnVtCisgICAgICogdHlwZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIE9iamVjdCB0b1JlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7CisgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgIC8vIE11c3QgY29udmVydCB0aGUgd2hvbGUgbGlzdC4KKyAgICAgICAgICBmaW5hbCBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHZhbHVlKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKHNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZShlbGVtZW50KSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjdG9SZWZsZWN0aW9uVHlwZShPYmplY3QpfSwgYnV0IGlmIHRoZSB0eXBlIGlzIGEgcmVwZWF0ZWQKKyAgICAgKiB0eXBlLCB0aGlzIGNvbnZlcnRzIGEgc2luZ2xlIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3Qgc2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7CisgICAgICBzd2l0Y2ggKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSkgeworICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGVudW1HZXRWYWx1ZURlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKiogQ2FsbHMgQ2xhc3MuZ2V0TWV0aG9kIGFuZCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uIGlmIGl0IGZhaWxzLiAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZE9yRGllKAorICAgICAgZmluYWwgQ2xhc3MgY2xhenosIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzcy4uLiBwYXJhbXMpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNsYXp6LmdldE1ldGhvZChuYW1lLCBwYXJhbXMpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgIkdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIFwiIiArIGNsYXp6LmdldE5hbWUoKSArCisgICAgICAgICJcIiBtaXNzaW5nIG1ldGhvZCBcIiIgKyBuYW1lICsgIlwiLiIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKiBDYWxscyBpbnZva2UgYW5kIHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24gaWYgaXQgZmFpbHMuICovCisgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2VPckRpZSgKKyAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QsIGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIE9iamVjdC4uLiBwYXJhbXMpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqZWN0LCBwYXJhbXMpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICJDb3VsZG4ndCB1c2UgSmF2YSByZWZsZWN0aW9uIHRvIGltcGxlbWVudCBwcm90b2NvbCBtZXNzYWdlICIgKworICAgICAgICAicmVmbGVjdGlvbi4iLCBlKTsKKyAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGZpbmFsIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGNhdXNlOworICAgICAgfSBlbHNlIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAgIHRocm93IChFcnJvcikgY2F1c2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIGJ5IGdlbmVyYXRlZCBhY2Nlc3NvciBtZXRob2QuIiwgY2F1c2UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VycyBzaG91bGQgaWdub3JlIHRoaXMgY2xhc3MuICBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgKiB3aXRoIGFjY2VzcyB0byB0aGUgZmllbGRzIG9mIGEgbWVzc2FnZSBvYmplY3QgdXNpbmcgSmF2YSByZWZsZWN0aW9uLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWVsZEFjY2Vzc29yVGFibGUgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgRmllbGRBY2Nlc3NvclRhYmxlIGZvciBhIHBhcnRpY3VsYXIgbWVzc2FnZSBjbGFzcy4gIE9ubHkKKyAgICAgKiBvbmUgRmllbGRBY2Nlc3NvclRhYmxlIHNob3VsZCBldmVyIGJlIGNvbnN0cnVjdGVkIHBlciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yICAgICBUaGUgdHlwZSdzIGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGNhbWVsQ2FzZU5hbWVzIFRoZSBjYW1lbGNhc2UgbmFtZXMgb2YgYWxsIGZpZWxkcyBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgYXJlIHVzZWQgdG8gZGVyaXZlIHRoZSBhY2Nlc3NvciBtZXRob2QgbmFtZXMuCisgICAgICogQHBhcmFtIG1lc3NhZ2VDbGFzcyAgIFRoZSBtZXNzYWdlIHR5cGUuCisgICAgICogQHBhcmFtIGJ1aWxkZXJDbGFzcyAgIFRoZSBidWlsZGVyIHR5cGUuCisgICAgICovCisgICAgcHVibGljIEZpZWxkQWNjZXNzb3JUYWJsZSgKKyAgICAgICAgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBjYW1lbENhc2VOYW1lcywKKyAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKKyAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgeworICAgICAgdGhpcyhkZXNjcmlwdG9yLCBjYW1lbENhc2VOYW1lcyk7CisgICAgICBlbnN1cmVGaWVsZEFjY2Vzc29yc0luaXRpYWxpemVkKG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBGaWVsZEFjY2Vzc29yVGFibGUgZm9yIGEgcGFydGljdWxhciBtZXNzYWdlIGNsYXNzIHdpdGhvdXQKKyAgICAgKiBpbml0aWFsaXppbmcgRmllbGRBY2Nlc3NvcnMuCisgICAgICovCisgICAgcHVibGljIEZpZWxkQWNjZXNzb3JUYWJsZSgKKyAgICAgICAgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBjYW1lbENhc2VOYW1lcykgeworICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgICAgIHRoaXMuY2FtZWxDYXNlTmFtZXMgPSBjYW1lbENhc2VOYW1lczsKKyAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZEFjY2Vzc29yW2Rlc2NyaXB0b3IuZ2V0RmllbGRzKCkuc2l6ZSgpXTsKKyAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgZmllbGQgYWNjZXNzb3JzIGFyZSBpbml0aWFsaXplZC4gVGhpcyBtZXRob2QgaXMgdGhyZWFkLXNhZmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZUNsYXNzICAgVGhlIG1lc3NhZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gYnVpbGRlckNsYXNzICAgVGhlIGJ1aWxkZXIgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRBY2Nlc3NvclRhYmxlIGVuc3VyZUZpZWxkQWNjZXNzb3JzSW5pdGlhbGl6ZWQoCisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKKyAgICAgIGlmIChpbml0aWFsaXplZCkgeyByZXR1cm4gdGhpczsgfQorICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeyByZXR1cm4gdGhpczsgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZ2V0RmllbGRzKCkuZ2V0KGkpOworICAgICAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEFjY2Vzc29yKAorICAgICAgICAgICAgICAgICAgZmllbGQsIGNhbWVsQ2FzZU5hbWVzW2ldLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0pIHsKKyAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFJlcGVhdGVkRW51bUZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFNpbmd1bGFyTWVzc2FnZUZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgICAgICBmaWVsZHNbaV0gPSBuZXcgU2luZ3VsYXJFbnVtRmllbGRBY2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgIGZpZWxkLCBjYW1lbENhc2VOYW1lc1tpXSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFNpbmd1bGFyRmllbGRBY2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgIGZpZWxkLCBjYW1lbENhc2VOYW1lc1tpXSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIGNhbWVsQ2FzZU5hbWVzID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZEFjY2Vzc29yW10gZmllbGRzOworICAgIHByaXZhdGUgU3RyaW5nW10gY2FtZWxDYXNlTmFtZXM7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGluaXRpYWxpemVkOworCisgICAgLyoqIEdldCB0aGUgRmllbGRBY2Nlc3NvciBmb3IgYSBwYXJ0aWN1bGFyIGZpZWxkLiAqLworICAgIHByaXZhdGUgRmllbGRBY2Nlc3NvciBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGRlc2NyaXB0b3IpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICAvLyBJZiB0aGlzIHR5cGUgaGFkIGV4dGVuc2lvbnMsIGl0IHdvdWxkIHN1YmNsYXNzIEV4dGVuZGFibGVNZXNzYWdlLAorICAgICAgICAvLyB3aGljaCBvdmVycmlkZXMgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlIHRvIGhhbmRsZSBleHRlbnNpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIHR5cGUgZG9lcyBub3QgaGF2ZSBleHRlbnNpb25zLiIpOworICAgICAgfQorICAgICAgcmV0dXJuIGZpZWxkc1tmaWVsZC5nZXRJbmRleCgpXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBzaW5nbGUgZmllbGQuICBUaGlzIGlzCisgICAgICogaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlIGFuZCBjYXJkaW5hbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludGVyZmFjZSBGaWVsZEFjY2Vzc29yIHsKKyAgICAgIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKTsKKyAgICAgIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpOworICAgICAgdm9pZCBzZXQoQnVpbGRlciBidWlsZGVyLCBPYmplY3QgdmFsdWUpOworICAgICAgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwgaW50IGluZGV4KTsKKyAgICAgIE9iamVjdCBnZXRSZXBlYXRlZChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KTsKKyAgICAgIHZvaWQgc2V0UmVwZWF0ZWQoQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSk7CisgICAgICB2b2lkIGFkZFJlcGVhdGVkKEJ1aWxkZXIgYnVpbGRlciwgT2JqZWN0IHZhbHVlKTsKKyAgICAgIGJvb2xlYW4gaGFzKEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSk7CisgICAgICBib29sZWFuIGhhcyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcik7CisgICAgICBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpOworICAgICAgaW50IGdldFJlcGVhdGVkQ291bnQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpOworICAgICAgdm9pZCBjbGVhcihCdWlsZGVyIGJ1aWxkZXIpOworICAgICAgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKTsKKyAgICAgIE1lc3NhZ2UuQnVpbGRlciBnZXRCdWlsZGVyKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbmd1bGFyRmllbGRBY2Nlc3NvciBpbXBsZW1lbnRzIEZpZWxkQWNjZXNzb3IgeworICAgICAgU2luZ3VsYXJGaWVsZEFjY2Vzc29yKAorICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKKyAgICAgICAgZ2V0TWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgICBnZXRNZXRob2RCdWlsZGVyID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgICB0eXBlID0gZ2V0TWV0aG9kLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgc2V0TWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAic2V0IiArIGNhbWVsQ2FzZU5hbWUsIHR5cGUpOworICAgICAgICBoYXNNZXRob2QgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLCAiaGFzIiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgICBoYXNNZXRob2RCdWlsZGVyID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImhhcyIgKyBjYW1lbENhc2VOYW1lKTsKKyAgICAgICAgY2xlYXJNZXRob2QgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJjbGVhciIgKyBjYW1lbENhc2VOYW1lKTsKKyAgICAgIH0KKworICAgICAgLy8gTm90ZTogIFdlIHVzZSBKYXZhIHJlZmxlY3Rpb24gdG8gY2FsbCBwdWJsaWMgbWV0aG9kcyByYXRoZXIgdGhhbgorICAgICAgLy8gICBhY2Nlc3MgcHJpdmF0ZSBmaWVsZHMgZGlyZWN0bHkgYXMgdGhpcyBhdm9pZHMgcnVudGltZSBzZWN1cml0eQorICAgICAgLy8gICBjaGVja3MuCisgICAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8Pz4gdHlwZTsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0TWV0aG9kOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRNZXRob2RCdWlsZGVyOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBzZXRNZXRob2Q7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGhhc01ldGhvZDsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgaGFzTWV0aG9kQnVpbGRlcjsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgY2xlYXJNZXRob2Q7CisKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0TWV0aG9kLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRNZXRob2RCdWlsZGVyLCBidWlsZGVyKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbnZva2VPckRpZShzZXRNZXRob2QsIGJ1aWxkZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7CisgICAgICB9CisgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgInNldFJlcGVhdGVkRmllbGQoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIGFkZFJlcGVhdGVkKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiYWRkUmVwZWF0ZWRGaWVsZCgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOworICAgICAgfQorICAgICAgcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gKEJvb2xlYW4pIGludm9rZU9yRGllKGhhc01ldGhvZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXMoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIChCb29sZWFuKSBpbnZva2VPckRpZShoYXNNZXRob2RCdWlsZGVyLCBidWlsZGVyKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkU2l6ZSgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOworICAgICAgfQorICAgICAgcHVibGljIGludCBnZXRSZXBlYXRlZENvdW50KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZFNpemUoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKGZpbmFsIEJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBpbnZva2VPckRpZShjbGVhck1ldGhvZCwgYnVpbGRlcik7CisgICAgICB9CisgICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAibmV3QnVpbGRlckZvckZpZWxkKCkgY2FsbGVkIG9uIGEgbm9uLU1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgZ2V0QnVpbGRlcihHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgImdldEZpZWxkQnVpbGRlcigpIGNhbGxlZCBvbiBhIG5vbi1NZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIGltcGxlbWVudHMgRmllbGRBY2Nlc3NvciB7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgdHlwZTsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0TWV0aG9kOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRNZXRob2RCdWlsZGVyOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRSZXBlYXRlZE1ldGhvZDsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0UmVwZWF0ZWRNZXRob2RCdWlsZGVyOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBzZXRSZXBlYXRlZE1ldGhvZDsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgYWRkUmVwZWF0ZWRNZXRob2Q7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldENvdW50TWV0aG9kOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRDb3VudE1ldGhvZEJ1aWxkZXI7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGNsZWFyTWV0aG9kOworCisgICAgICBSZXBlYXRlZEZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCisgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgeworICAgICAgICBnZXRNZXRob2QgPSBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJMaXN0Iik7CisgICAgICAgIGdldE1ldGhvZEJ1aWxkZXIgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJMaXN0Iik7CisgICAgICAgIGdldFJlcGVhdGVkTWV0aG9kID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lLCBJbnRlZ2VyLlRZUEUpOworICAgICAgICBnZXRSZXBlYXRlZE1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUsIEludGVnZXIuVFlQRSk7CisgICAgICAgIHR5cGUgPSBnZXRSZXBlYXRlZE1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIHNldFJlcGVhdGVkTWV0aG9kID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgInNldCIgKyBjYW1lbENhc2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5UWVBFLCB0eXBlKTsKKyAgICAgICAgYWRkUmVwZWF0ZWRNZXRob2QgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiYWRkIiArIGNhbWVsQ2FzZU5hbWUsIHR5cGUpOworICAgICAgICBnZXRDb3VudE1ldGhvZCA9CisgICAgICAgICAgICBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJDb3VudCIpOworICAgICAgICBnZXRDb3VudE1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUgKyAiQ291bnQiKTsKKworICAgICAgICBjbGVhck1ldGhvZCA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImNsZWFyIiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgfQorCisgICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldE1ldGhvZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgICBwdWJsaWMgT2JqZWN0IGdldChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0TWV0aG9kQnVpbGRlciwgYnVpbGRlcik7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgLy8gQWRkIGFsbCB0aGUgZWxlbWVudHMgaW5kaXZpZHVhbGx5LiAgVGhpcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOgorICAgICAgICAvLyAxKSBWZXJpZmllcyB0aGF0IGVhY2ggZWxlbWVudCBoYXMgdGhlIGNvcnJlY3QgdHlwZS4KKyAgICAgICAgLy8gMikgSW5zdXJlcyB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IG1vZGlmeSB0aGUgbGlzdCBsYXRlciBvbiBhbmQKKyAgICAgICAgLy8gICAgaGF2ZSB0aGUgbW9kaWZpY2F0aW9ucyBiZSByZWZsZWN0ZWQgaW4gdGhlIG1lc3NhZ2UuCisgICAgICAgIGNsZWFyKGJ1aWxkZXIpOworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pIHZhbHVlKSB7CisgICAgICAgICAgYWRkUmVwZWF0ZWQoYnVpbGRlciwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFJlcGVhdGVkTWV0aG9kLCBtZXNzYWdlLCBpbmRleCk7CisgICAgICB9CisgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFJlcGVhdGVkTWV0aG9kQnVpbGRlciwgYnVpbGRlciwgaW5kZXgpOworICAgICAgfQorICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaW52b2tlT3JEaWUoc2V0UmVwZWF0ZWRNZXRob2QsIGJ1aWxkZXIsIGluZGV4LCB2YWx1ZSk7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBhZGRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbnZva2VPckRpZShhZGRSZXBlYXRlZE1ldGhvZCwgYnVpbGRlciwgdmFsdWUpOworICAgICAgfQorICAgICAgcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgImhhc0ZpZWxkKCkgY2FsbGVkIG9uIGEgcmVwZWF0ZWQgZmllbGQuIik7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXMoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJoYXNGaWVsZCgpIGNhbGxlZCBvbiBhIHJlcGVhdGVkIGZpZWxkLiIpOworICAgICAgfQorICAgICAgcHVibGljIGludCBnZXRSZXBlYXRlZENvdW50KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gKEludGVnZXIpIGludm9rZU9yRGllKGdldENvdW50TWV0aG9kLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICByZXR1cm4gKEludGVnZXIpIGludm9rZU9yRGllKGdldENvdW50TWV0aG9kQnVpbGRlciwgYnVpbGRlcik7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBjbGVhcihmaW5hbCBCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgaW52b2tlT3JEaWUoY2xlYXJNZXRob2QsIGJ1aWxkZXIpOworICAgICAgfQorICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIm5ld0J1aWxkZXJGb3JGaWVsZCgpIGNhbGxlZCBvbiBhIG5vbi1NZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIGdldEJ1aWxkZXIoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRGaWVsZEJ1aWxkZXIoKSBjYWxsZWQgb24gYSBub24tTWVzc2FnZSB0eXBlLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ3VsYXJFbnVtRmllbGRBY2Nlc3NvcgorICAgICAgICBleHRlbmRzIFNpbmd1bGFyRmllbGRBY2Nlc3NvciB7CisgICAgICBTaW5ndWxhckVudW1GaWVsZEFjY2Vzc29yKAorICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKKyAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworCisgICAgICAgIHZhbHVlT2ZNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAidmFsdWVPZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKKyAgICAgICAgZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kID0KKyAgICAgICAgICBnZXRNZXRob2RPckRpZSh0eXBlLCAiZ2V0VmFsdWVEZXNjcmlwdG9yIik7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgTWV0aG9kIHZhbHVlT2ZNZXRob2Q7CisgICAgICBwcml2YXRlIE1ldGhvZCBnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2Q7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2QsIHN1cGVyLmdldChtZXNzYWdlKSk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgc3VwZXIuZ2V0KGJ1aWxkZXIpKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIuc2V0KGJ1aWxkZXIsIGludm9rZU9yRGllKHZhbHVlT2ZNZXRob2QsIG51bGwsIHZhbHVlKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVwZWF0ZWRFbnVtRmllbGRBY2Nlc3NvcgorICAgICAgICBleHRlbmRzIFJlcGVhdGVkRmllbGRBY2Nlc3NvciB7CisgICAgICBSZXBlYXRlZEVudW1GaWVsZEFjY2Vzc29yKAorICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKKyAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworCisgICAgICAgIHZhbHVlT2ZNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAidmFsdWVPZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKKyAgICAgICAgZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kID0KKyAgICAgICAgICBnZXRNZXRob2RPckRpZSh0eXBlLCAiZ2V0VmFsdWVEZXNjcmlwdG9yIik7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIHZhbHVlT2ZNZXRob2Q7CisgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2Q7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHN1cGVyLmdldChtZXNzYWdlKSkgeworICAgICAgICAgIG5ld0xpc3QuYWRkKGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgZWxlbWVudCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ld0xpc3QpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHN1cGVyLmdldChidWlsZGVyKSkgeworICAgICAgICAgIG5ld0xpc3QuYWRkKGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgZWxlbWVudCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ld0xpc3QpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwKKyAgICAgICAgICBzdXBlci5nZXRSZXBlYXRlZChtZXNzYWdlLCBpbmRleCkpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwKKyAgICAgICAgICBzdXBlci5nZXRSZXBlYXRlZChidWlsZGVyLCBpbmRleCkpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzdXBlci5zZXRSZXBlYXRlZChidWlsZGVyLCBpbmRleCwgaW52b2tlT3JEaWUodmFsdWVPZk1ldGhvZCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIuYWRkUmVwZWF0ZWQoYnVpbGRlciwgaW52b2tlT3JEaWUodmFsdWVPZk1ldGhvZCwgbnVsbCwgdmFsdWUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNpbmd1bGFyTWVzc2FnZUZpZWxkQWNjZXNzb3IKKyAgICAgICAgZXh0ZW5kcyBTaW5ndWxhckZpZWxkQWNjZXNzb3IgeworICAgICAgU2luZ3VsYXJNZXNzYWdlRmllbGRBY2Nlc3NvcigKKyAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCisgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzKSB7CisgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGNhbWVsQ2FzZU5hbWUsIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKworICAgICAgICBuZXdCdWlsZGVyTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUodHlwZSwgIm5ld0J1aWxkZXIiKTsKKyAgICAgICAgZ2V0QnVpbGRlck1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUgKyAiQnVpbGRlciIpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBuZXdCdWlsZGVyTWV0aG9kOworICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZ2V0QnVpbGRlck1ldGhvZEJ1aWxkZXI7CisKKyAgICAgIHByaXZhdGUgT2JqZWN0IGNvZXJjZVR5cGUoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh0eXBlLmlzSW5zdGFuY2UodmFsdWUpKSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBub3QgdGhlIGV4YWN0IHJpZ2h0IG1lc3NhZ2UgdHlwZS4gIEhvd2V2ZXIsIGlmIGl0CisgICAgICAgICAgLy8gaXMgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNhbWUgdHlwZSAtLSBlLmcuIGEKKyAgICAgICAgICAvLyBEeW5hbWljTWVzc2FnZSAtLSB3ZSBzaG91bGQgYWNjZXB0IGl0LiAgSW4gdGhpcyBjYXNlIHdlIGNhbiBtYWtlCisgICAgICAgICAgLy8gYSBjb3B5IG9mIHRoZSBtZXNzYWdlLgorICAgICAgICAgIHJldHVybiAoKE1lc3NhZ2UuQnVpbGRlcikgaW52b2tlT3JEaWUobmV3QnVpbGRlck1ldGhvZCwgbnVsbCkpCisgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKChNZXNzYWdlKSB2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIuc2V0KGJ1aWxkZXIsIGNvZXJjZVR5cGUodmFsdWUpKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gKE1lc3NhZ2UuQnVpbGRlcikgaW52b2tlT3JEaWUobmV3QnVpbGRlck1ldGhvZCwgbnVsbCk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgZ2V0QnVpbGRlcihHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICByZXR1cm4gKE1lc3NhZ2UuQnVpbGRlcikgaW52b2tlT3JEaWUoZ2V0QnVpbGRlck1ldGhvZEJ1aWxkZXIsIGJ1aWxkZXIpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlcGVhdGVkTWVzc2FnZUZpZWxkQWNjZXNzb3IKKyAgICAgICAgZXh0ZW5kcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgeworICAgICAgUmVwZWF0ZWRNZXNzYWdlRmllbGRBY2Nlc3NvcigKKyAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCisgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzKSB7CisgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGNhbWVsQ2FzZU5hbWUsIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKworICAgICAgICBuZXdCdWlsZGVyTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUodHlwZSwgIm5ld0J1aWxkZXIiKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbmV3QnVpbGRlck1ldGhvZDsKKworICAgICAgcHJpdmF0ZSBPYmplY3QgY29lcmNlVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIG5vdCB0aGUgZXhhY3QgcmlnaHQgbWVzc2FnZSB0eXBlLiAgSG93ZXZlciwgaWYgaXQKKyAgICAgICAgICAvLyBpcyBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2FtZSB0eXBlIC0tIGUuZy4gYQorICAgICAgICAgIC8vIER5bmFtaWNNZXNzYWdlIC0tIHdlIHNob3VsZCBhY2NlcHQgaXQuICBJbiB0aGlzIGNhc2Ugd2UgY2FuIG1ha2UKKyAgICAgICAgICAvLyBhIGNvcHkgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgICAgcmV0dXJuICgoTWVzc2FnZS5CdWlsZGVyKSBpbnZva2VPckRpZShuZXdCdWlsZGVyTWV0aG9kLCBudWxsKSkKKyAgICAgICAgICAgICAgICAgIC5tZXJnZUZyb20oKE1lc3NhZ2UpIHZhbHVlKS5idWlsZCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIuc2V0UmVwZWF0ZWQoYnVpbGRlciwgaW5kZXgsIGNvZXJjZVR5cGUodmFsdWUpKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIuYWRkUmVwZWF0ZWQoYnVpbGRlciwgY29lcmNlVHlwZSh2YWx1ZSkpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiAoTWVzc2FnZS5CdWlsZGVyKSBpbnZva2VPckRpZShuZXdCdWlsZGVyTWV0aG9kLCBudWxsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVwbGFjZXMgdGhpcyBvYmplY3QgaW4gdGhlIG91dHB1dCBzdHJlYW0gd2l0aCBhIHNlcmlhbGl6ZWQgZm9ybS4KKyAgICogUGFydCBvZiBKYXZhJ3Mgc2VyaWFsaXphdGlvbiBtYWdpYy4gIEdlbmVyYXRlZCBzdWItY2xhc3NlcyBtdXN0IG92ZXJyaWRlCisgICAqIHRoaXMgbWV0aG9kIGJ5IGNhbGxpbmcge0Bjb2RlIHJldHVybiBzdXBlci53cml0ZVJlcGxhY2UoKTt9CisgICAqIEByZXR1cm4gYSBTZXJpYWxpemVkRm9ybSBvZiB0aGlzIG1lc3NhZ2UKKyAgICovCisgIHByb3RlY3RlZCBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5TZXJpYWxpemVkRm9ybSh0aGlzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzN2UzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VMaXRlLmphdmEKQEAgLTAsMCArMSw3OTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIExpdGUgdmVyc2lvbiBvZiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZX0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZQorICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2VMaXRlKCkgeworICB9CisKKyAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2VMaXRlKEJ1aWxkZXIgYnVpbGRlcikgeworICB9CisKKyAgcHVibGljIFBhcnNlcjw/IGV4dGVuZHMgTWVzc2FnZUxpdGU+IGdldFBhcnNlckZvclR5cGUoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZC4KKyAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAorICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGlucHV0LnNraXBGaWVsZCh0YWcpOworICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkgcGFyc2luZyBjb25zdHJ1Y3RvcnMgaW4gZ2VuZXJhdGVkIGNsYXNzZXMuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBtYWtlRXh0ZW5zaW9uc0ltbXV0YWJsZSgpIHsKKyAgICAvLyBOb29wIGZvciBtZXNzYWdlcyB3aXRob3V0IGV4dGVuc2lvbnMuCisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsZGVyPE1lc3NhZ2VUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyVHlwZSBleHRlbmRzIEJ1aWxkZXI+CisgICAgICBleHRlbmRzIEFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlcjxCdWlsZGVyVHlwZT4geworICAgIHByb3RlY3RlZCBCdWlsZGVyKCkge30KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbGVhcigpIHsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCBoZXJlIG9ubHkgdG8gd29yayBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZQorICAgIC8vIEphdmEgY29tcGlsZXIgYW5kL29yIGJ1aWxkIHN5c3RlbS4gIFNlZSBidWcgIzE4OTg0NjMuICBUaGUgbWVyZSBwcmVzZW5jZQorICAgIC8vIG9mIHRoaXMgZHVtbXkgY2xvbmUoKSBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBnbyBhd2F5LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbG9uZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7CisgICAgfQorCisgICAgLyoqIEFsbCBzdWJjbGFzc2VzIGltcGxlbWVudCB0aGlzLiAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCdWlsZGVyVHlwZSBtZXJnZUZyb20oTWVzc2FnZVR5cGUgbWVzc2FnZSk7CisKKyAgICAvLyBEZWZpbmVkIGhlcmUgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuCisgICAgcHVibGljIGFic3RyYWN0IE1lc3NhZ2VUeXBlIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZVVua25vd25GaWVsZCgKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAorICAgICAgICBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIGlucHV0LnNraXBGaWVsZCh0YWcpOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEV4dGVuc2lvbnMtcmVsYXRlZCBzdHVmZgorCisgIC8qKgorICAgKiBMaXRlIGVxdWl2YWxlbnQgb2Yge0BsaW5rIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlTWVzc2FnZU9yQnVpbGRlcn0uCisgICAqLworICBwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPAorICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZT4gZXh0ZW5kcyBNZXNzYWdlTGl0ZU9yQnVpbGRlciB7CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KKyAgICA8VHlwZT4gYm9vbGVhbiBoYXNFeHRlbnNpb24oCisgICAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKTsKKworICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICA8VHlwZT4gaW50IGdldEV4dGVuc2lvbkNvdW50KAorICAgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbik7CisKKyAgICAvKiogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCisgICAgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKTsKKworICAgIC8qKiBHZXQgb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAorICAgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiwKKyAgICAgICAgaW50IGluZGV4KTsKKyAgfQorCisgIC8qKgorICAgKiBMaXRlIGVxdWl2YWxlbnQgb2Yge0BsaW5rIEdlbmVyYXRlZE1lc3NhZ2UuRXh0ZW5kYWJsZU1lc3NhZ2V9LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBFeHRlbmRhYmxlTWVzc2FnZTwKKyAgICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZTxNZXNzYWdlVHlwZT4+CisgICAgICBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlCisgICAgICBpbXBsZW1lbnRzIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPE1lc3NhZ2VUeXBlPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IGV4dGVuc2lvbnM7CisKKyAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZU1lc3NhZ2UoKSB7CisgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBGaWVsZFNldC5uZXdGaWVsZFNldCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlTWVzc2FnZShFeHRlbmRhYmxlQnVpbGRlcjxNZXNzYWdlVHlwZSwgPz4gYnVpbGRlcikgeworICAgICAgdGhpcy5leHRlbnNpb25zID0gYnVpbGRlci5idWlsZEV4dGVuc2lvbnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgPz4gZXh0ZW5zaW9uKSB7CisgICAgICBpZiAoZXh0ZW5zaW9uLmdldENvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlKCkgIT0KKyAgICAgICAgICBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIGV4dGVuc2lvbiBpcyBmb3IgYSBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlLiAgUGxlYXNlIG1ha2UgIiArCisgICAgICAgICAgInN1cmUgdGhhdCB5b3UgYXJlIG5vdCBzdXBwcmVzc2luZyBhbnkgZ2VuZXJpY3MgdHlwZSB3YXJuaW5ncy4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBpbnQgZ2V0RXh0ZW5zaW9uQ291bnQoCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBleHRlbnNpb25zLmdldEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBleHRlbnNpb24uZGVmYXVsdFZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChUeXBlKSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvciwgaW5kZXgpOworICAgIH0KKworICAgIC8qKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBjaGVjayBpZiBhbGwgZXh0ZW5zaW9ucyBhcmUgaW5pdGlhbGl6ZWQuICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCkgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaXNJbml0aWFsaXplZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQgb3IgYW4gZXh0ZW5zaW9uLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCisgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5wYXJzZVVua25vd25GaWVsZCgKKyAgICAgICAgICBleHRlbnNpb25zLAorICAgICAgICAgIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSwKKyAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgICB0YWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgcGFyc2luZyBjb25zdHJ1Y3RvcnMgaW4gZ2VuZXJhdGVkIGNsYXNzZXMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgbWFrZUV4dGVuc2lvbnNJbW11dGFibGUoKSB7CisgICAgICBleHRlbnNpb25zLm1ha2VJbW11dGFibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHN1YmNsYXNzZXMgdG8gc2VyaWFsaXplIGV4dGVuc2lvbnMuICBFeHRlbnNpb24gcmFuZ2VzIG1heSBiZQorICAgICAqIGludGVybGVhdmVkIHdpdGggZmllbGQgbnVtYmVycywgYnV0IHdlIG11c3Qgd3JpdGUgdGhlbSBpbiBjYW5vbmljYWwKKyAgICAgKiAoc29ydGVkIGJ5IGZpZWxkIG51bWJlcikgb3JkZXIuICBFeHRlbnNpb25Xcml0ZXIgaGVscHMgdXMgd3JpdGUKKyAgICAgKiBpbmRpdmlkdWFsIHJhbmdlcyBvZiBleHRlbnNpb25zIGF0IG9uY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIEV4dGVuc2lvbldyaXRlciB7CisgICAgICAvLyBJbWFnaW5lIGhvdyBtdWNoIHNpbXBsZXIgdGhpcyBjb2RlIHdvdWxkIGJlIGlmIEphdmEgaXRlcmF0b3JzIGhhZAorICAgICAgLy8gYSB3YXkgdG8gZ2V0IHRoZSBuZXh0IGVsZW1lbnQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIGl0ZXJhdG9yLgorCisgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxFeHRlbnNpb25EZXNjcmlwdG9yLCBPYmplY3Q+PiBpdGVyID0KKyAgICAgICAgICAgIGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKKyAgICAgIHByaXZhdGUgTWFwLkVudHJ5PEV4dGVuc2lvbkRlc2NyaXB0b3IsIE9iamVjdD4gbmV4dDsKKyAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdDsKKworICAgICAgcHJpdmF0ZSBFeHRlbnNpb25Xcml0ZXIoYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdCkgeworICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5tZXNzYWdlU2V0V2lyZUZvcm1hdCA9IG1lc3NhZ2VTZXRXaXJlRm9ybWF0OworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZVVudGlsKGZpbmFsIGludCBlbmQsIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldEtleSgpLmdldE51bWJlcigpIDwgZW5kKSB7CisgICAgICAgICAgRXh0ZW5zaW9uRGVzY3JpcHRvciBleHRlbnNpb24gPSBuZXh0LmdldEtleSgpOworICAgICAgICAgIGlmIChtZXNzYWdlU2V0V2lyZUZvcm1hdCAmJiBleHRlbnNpb24uZ2V0TGl0ZUphdmFUeXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuSmF2YVR5cGUuTUVTU0FHRSAmJgorICAgICAgICAgICAgICAhZXh0ZW5zaW9uLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihleHRlbnNpb24uZ2V0TnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlTGl0ZSkgbmV4dC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRmllbGRTZXQud3JpdGVGaWVsZChleHRlbnNpb24sIG5leHQuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBFeHRlbnNpb25Xcml0ZXIgbmV3RXh0ZW5zaW9uV3JpdGVyKCkgeworICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIoZmFsc2UpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKSB7CisgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbldyaXRlcih0cnVlKTsKKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBleHRlbnNpb25zLiAqLworICAgIHByb3RlY3RlZCBpbnQgZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCkgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIGludCBleHRlbnNpb25zU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTGl0ZSBlcXVpdmFsZW50IG9mIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVCdWlsZGVyfS4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEV4dGVuZGFibGVCdWlsZGVyPAorICAgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPE1lc3NhZ2VUeXBlPiwKKyAgICAgICAgQnVpbGRlclR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlQnVpbGRlcjxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+PgorICAgICAgZXh0ZW5kcyBCdWlsZGVyPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4KKyAgICAgIGltcGxlbWVudHMgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8TWVzc2FnZVR5cGU+IHsKKyAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZUJ1aWxkZXIoKSB7fQorCisgICAgcHJpdmF0ZSBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiBleHRlbnNpb25zID0gRmllbGRTZXQuZW1wdHlTZXQoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZW5zaW9uc0lzTXV0YWJsZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbGVhcigpIHsKKyAgICAgIGV4dGVuc2lvbnMuY2xlYXIoKTsKKyAgICAgIGV4dGVuc2lvbnNJc011dGFibGUgPSBmYWxzZTsKKyAgICAgIHJldHVybiBzdXBlci5jbGVhcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCkgeworICAgICAgaWYgKCFleHRlbnNpb25zSXNNdXRhYmxlKSB7CisgICAgICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zLmNsb25lKCk7CisgICAgICAgIGV4dGVuc2lvbnNJc011dGFibGUgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgYnVpbGQgY29kZSBwYXRoIHRvIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGV4dGVuc2lvbnMgZm9yCisgICAgICogYnVpbGRpbmcgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiBidWlsZEV4dGVuc2lvbnMoKSB7CisgICAgICBleHRlbnNpb25zLm1ha2VJbW11dGFibGUoKTsKKyAgICAgIGV4dGVuc2lvbnNJc011dGFibGUgPSBmYWxzZTsKKyAgICAgIHJldHVybiBleHRlbnNpb25zOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZSgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKKyAgICAgIGlmIChleHRlbnNpb24uZ2V0Q29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UoKSAhPQorICAgICAgICAgIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSkgeworICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzb21lb25lIHVzZXMgdW5jaGVja2VkIG9wZXJhdGlvbnMuCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIlRoaXMgZXh0ZW5zaW9uIGlzIGZvciBhIGRpZmZlcmVudCBtZXNzYWdlIHR5cGUuICBQbGVhc2UgbWFrZSAiICsKKyAgICAgICAgICAic3VyZSB0aGF0IHlvdSBhcmUgbm90IHN1cHByZXNzaW5nIGFueSBnZW5lcmljcyB0eXBlIHdhcm5pbmdzLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50LiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gYm9vbGVhbiBoYXNFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5kZWZhdWx0VmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKFR5cGUpIHZhbHVlOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBHZXQgb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCisgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCBoZXJlIG9ubHkgdG8gd29yayBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZQorICAgIC8vIEphdmEgY29tcGlsZXIgYW5kL29yIGJ1aWxkIHN5c3RlbS4gIFNlZSBidWcgIzE4OTg0NjMuICBUaGUgbWVyZSBwcmVzZW5jZQorICAgIC8vIG9mIHRoaXMgZHVtbXkgY2xvbmUoKSBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBnbyBhd2F5LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbG9uZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7CisgICAgfQorCisgICAgLyoqIFNldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbiwKKyAgICAgICAgZmluYWwgVHlwZSB2YWx1ZSkgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKKyAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqIFNldCB0aGUgdmFsdWUgb2Ygb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBzZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIFR5cGUgdmFsdWUpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zLnNldFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBBcHBlbmQgYSB2YWx1ZSB0byBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIGFkZEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCisgICAgICAgIGZpbmFsIFR5cGUgdmFsdWUpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqIENsZWFyIGFuIGV4dGVuc2lvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIGNsZWFyRXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKKyAgICAgIGV4dGVuc2lvbnMuY2xlYXJGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBjaGVjayBpZiBhbGwgZXh0ZW5zaW9ucyBhcmUgaW5pdGlhbGl6ZWQuICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCkgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaXNJbml0aWFsaXplZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQgb3IgYW4gZXh0ZW5zaW9uLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCisgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKKyAgICAgIHJldHVybiBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5wYXJzZVVua25vd25GaWVsZCgKKyAgICAgICAgICBleHRlbnNpb25zLAorICAgICAgICAgIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSwKKyAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgICB0YWcpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIG1lcmdlRXh0ZW5zaW9uRmllbGRzKGZpbmFsIE1lc3NhZ2VUeXBlIG90aGVyKSB7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zLm1lcmdlRnJvbSgoKEV4dGVuZGFibGVNZXNzYWdlKSBvdGhlcikuZXh0ZW5zaW9ucyk7CisgICAgfQorICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogUGFyc2UgYW4gdW5rbm93biBmaWVsZCBvciBhbiBleHRlbnNpb24uCisgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWcuCisgICAqLworICBwcml2YXRlIHN0YXRpYyA8TWVzc2FnZVR5cGUgZXh0ZW5kcyBNZXNzYWdlTGl0ZT4KKyAgICAgIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCisgICAgICAgICAgRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucywKKyAgICAgICAgICBNZXNzYWdlVHlwZSBkZWZhdWx0SW5zdGFuY2UsCisgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgICAgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgd2lyZVR5cGUgPSBXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZyk7CisgICAgaW50IGZpZWxkTnVtYmVyID0gV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpOworCisgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24gPQorICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkuZmluZExpdGVFeHRlbnNpb25CeU51bWJlcigKKyAgICAgICAgICBkZWZhdWx0SW5zdGFuY2UsIGZpZWxkTnVtYmVyKTsKKworICAgIGJvb2xlYW4gdW5rbm93biA9IGZhbHNlOworICAgIGJvb2xlYW4gcGFja2VkID0gZmFsc2U7CisgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFVua25vd24gZmllbGQuCisgICAgfSBlbHNlIGlmICh3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAorICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLAorICAgICAgICAgICAgICAgICBmYWxzZSAgLyogaXNQYWNrZWQgKi8pKSB7CisgICAgICBwYWNrZWQgPSBmYWxzZTsgIC8vIE5vcm1hbCwgdW5wYWNrZWQgdmFsdWUuCisgICAgfSBlbHNlIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5pc1JlcGVhdGVkICYmCisgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci50eXBlLmlzUGFja2FibGUoKSAmJgorICAgICAgICAgICAgICAgd2lyZVR5cGUgPT0gRmllbGRTZXQuZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZSgKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgdHJ1ZSAgLyogaXNQYWNrZWQgKi8pKSB7CisgICAgICBwYWNrZWQgPSB0cnVlOyAgLy8gUGFja2VkIHZhbHVlLgorICAgIH0gZWxzZSB7CisgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFdyb25nIHdpcmUgdHlwZS4KKyAgICB9CisKKyAgICBpZiAodW5rbm93bikgeyAgLy8gVW5rbm93biBmaWVsZCBvciB3cm9uZyB3aXJlIHR5cGUuICBTa2lwLgorICAgICAgcmV0dXJuIGlucHV0LnNraXBGaWVsZCh0YWcpOworICAgIH0KKworICAgIGlmIChwYWNrZWQpIHsKKyAgICAgIGludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTsKKyAgICAgIGludCBsaW1pdCA9IGlucHV0LnB1c2hMaW1pdChsZW5ndGgpOworICAgICAgaWYgKGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVUeXBlKCkgPT0gV2lyZUZvcm1hdC5GaWVsZFR5cGUuRU5VTSkgeworICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgICAgICAgaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTsKKyAgICAgICAgICBPYmplY3QgdmFsdWUgPQorICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKKyAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIG51bWJlciBpc24ndCByZWNvZ25pemVkIGFzIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMKKyAgICAgICAgICAgIC8vIGVudW0sIGRyb3AgaXQgKGRvbid0IGV2ZW4gYWRkIGl0IHRvIHVua25vd25GaWVsZHMpLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgICAgICAgT2JqZWN0IHZhbHVlID0KKyAgICAgICAgICAgIEZpZWxkU2V0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpKTsKKyAgICAgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5wdXQucG9wTGltaXQobGltaXQpOworICAgIH0gZWxzZSB7CisgICAgICBPYmplY3QgdmFsdWU7CisgICAgICBzd2l0Y2ggKGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVKYXZhVHlwZSgpKSB7CisgICAgICAgIGNhc2UgTUVTU0FHRTogeworICAgICAgICAgIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IG51bGw7CisgICAgICAgICAgaWYgKCFleHRlbnNpb24uZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgIE1lc3NhZ2VMaXRlIGV4aXN0aW5nVmFsdWUgPQorICAgICAgICAgICAgICAgIChNZXNzYWdlTGl0ZSkgZXh0ZW5zaW9ucy5nZXRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgICAgICBpZiAoZXhpc3RpbmdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBleGlzdGluZ1ZhbHVlLnRvQnVpbGRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3ViQnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzdWJCdWlsZGVyID0gZXh0ZW5zaW9uLm1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVUeXBlKCkgPT0KKyAgICAgICAgICAgICAgV2lyZUZvcm1hdC5GaWVsZFR5cGUuR1JPVVApIHsKKyAgICAgICAgICAgIGlucHV0LnJlYWRHcm91cChleHRlbnNpb24uZ2V0TnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgICAgfQorICAgICAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5idWlsZCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgICBpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpOworICAgICAgICAgIHZhbHVlID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0RW51bVR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKKyAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzbid0IHJlY29nbml6ZWQgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBlbnVtLAorICAgICAgICAgIC8vIGRyb3AgaXQuCisgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB2YWx1ZSA9IEZpZWxkU2V0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgZXh0ZW5zaW9ucy5hZGRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBleHRlbnNpb25zLnNldEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICovCisgIHB1YmxpYyBzdGF0aWMgPENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIFR5cGU+CisgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+CisgICAgICAgICAgbmV3U2luZ3VsYXJHZW5lcmF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5pbmdUeXBlIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICAgICAgICBmaW5hbCBUeXBlIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCisgICAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXIsCisgICAgICAgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUpIHsKKyAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCisgICAgICAgIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICBkZWZhdWx0VmFsdWUsCisgICAgICAgIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsCisgICAgICAgIG5ldyBFeHRlbnNpb25EZXNjcmlwdG9yKGVudW1UeXBlTWFwLCBudW1iZXIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzUmVwZWF0ZWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzUGFja2VkICovKSk7CisgIH0KKworICAvKiogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAqLworICBwdWJsaWMgc3RhdGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBUeXBlPgorICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPgorICAgICAgICAgIG5ld1JlcGVhdGVkR2VuZXJhdGVkRXh0ZW5zaW9uKAorICAgICAgICAgICAgICBmaW5hbCBDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCisgICAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXIsCisgICAgICAgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYWNrZWQpIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgIC8vIFN1YmNsYXNzZXMgZW5zdXJlIFR5cGUgaXMgYSBMaXN0CisgICAgVHlwZSBlbXB0eUxpc3QgPSAoVHlwZSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+KAorICAgICAgICBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgZW1wdHlMaXN0LAorICAgICAgICBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICBuZXcgRXh0ZW5zaW9uRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGVudW1UeXBlTWFwLCBudW1iZXIsIHR5cGUsIHRydWUgLyogaXNSZXBlYXRlZCAqLywgaXNQYWNrZWQpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbkRlc2NyaXB0b3IKKyAgICAgIGltcGxlbWVudHMgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTwKKyAgICAgICAgRXh0ZW5zaW9uRGVzY3JpcHRvcj4geworICAgIHByaXZhdGUgRXh0ZW5zaW9uRGVzY3JpcHRvcigKKyAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCisgICAgICAgIGZpbmFsIGludCBudW1iZXIsCisgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZXBlYXRlZCwKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhY2tlZCkgeworICAgICAgdGhpcy5lbnVtVHlwZU1hcCA9IGVudW1UeXBlTWFwOworICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy5pc1JlcGVhdGVkID0gaXNSZXBlYXRlZDsKKyAgICAgIHRoaXMuaXNQYWNrZWQgPSBpc1BhY2tlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEludGVybmFsLkVudW1MaXRlTWFwPD8+IGVudW1UeXBlTWFwOworICAgIHByaXZhdGUgZmluYWwgaW50IG51bWJlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUmVwZWF0ZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUGFja2VkOworCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7CisgICAgICByZXR1cm4gbnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyBXaXJlRm9ybWF0LkZpZWxkVHlwZSBnZXRMaXRlVHlwZSgpIHsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBXaXJlRm9ybWF0LkphdmFUeXBlIGdldExpdGVKYXZhVHlwZSgpIHsKKyAgICAgIHJldHVybiB0eXBlLmdldEphdmFUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRlZCgpIHsKKyAgICAgIHJldHVybiBpc1JlcGVhdGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2VkKCkgeworICAgICAgcmV0dXJuIGlzUGFja2VkOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlcm5hbC5FbnVtTGl0ZU1hcDw/PiBnZXRFbnVtVHlwZSgpIHsKKyAgICAgIHJldHVybiBlbnVtVHlwZU1hcDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTWVzc2FnZUxpdGUuQnVpbGRlciBpbnRlcm5hbE1lcmdlRnJvbSgKKyAgICAgICAgTWVzc2FnZUxpdGUuQnVpbGRlciB0bywgTWVzc2FnZUxpdGUgZnJvbSkgeworICAgICAgcmV0dXJuICgoQnVpbGRlcikgdG8pLm1lcmdlRnJvbSgoR2VuZXJhdGVkTWVzc2FnZUxpdGUpIGZyb20pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEV4dGVuc2lvbkRlc2NyaXB0b3Igb3RoZXIpIHsKKyAgICAgIHJldHVybiBudW1iZXIgLSBvdGhlci5udW1iZXI7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExpdGUgZXF1aXZhbGVudCB0byB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZS5HZW5lcmF0ZWRFeHRlbnNpb259LgorICAgKgorICAgKiBVc2VycyBzaG91bGQgaWdub3JlIHRoZSBjb250ZW50cyBvZiB0aGlzIGNsYXNzIGFuZCBvbmx5IHVzZSBvYmplY3RzIG9mCisgICAqIHRoaXMgdHlwZSBhcyBwYXJhbWV0ZXJzIHRvIGV4dGVuc2lvbiBhY2Nlc3NvcnMgYW5kIEV4dGVuc2lvblJlZ2lzdHJ5LmFkZCgpLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZW5lcmF0ZWRFeHRlbnNpb248CisgICAgICBDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBUeXBlPiB7CisKKyAgICBwcml2YXRlIEdlbmVyYXRlZEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsCisgICAgICAgIGZpbmFsIFR5cGUgZGVmYXVsdFZhbHVlLAorICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgIC8vIERlZmVuc2l2ZSBjaGVja3MgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0IGluaXRpYWxpemF0aW9uIG9yZGVyIG9mCisgICAgICAvLyBHZW5lcmF0ZWRFeHRlbnNpb25zIGFuZCB0aGVpciByZWxhdGVkIEdlbmVyYXRlZE1lc3NhZ2VzLgorICAgICAgaWYgKGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJOdWxsIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlIik7CisgICAgICB9CisgICAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpID09IFdpcmVGb3JtYXQuRmllbGRUeXBlLk1FU1NBR0UgJiYKKyAgICAgICAgICBtZXNzYWdlRGVmYXVsdEluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJOdWxsIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UiKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UgPSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsKKyAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOworICAgICAgdGhpcy5tZXNzYWdlRGVmYXVsdEluc3RhbmNlID0gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgZGVmYXVsdFZhbHVlOworICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIEV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZXh0ZW5kZWQsIHVzZWQgdG8gaWRlbnRpZnkgdGhhdCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluaW5nVHlwZSBnZXRDb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSgpIHsKKyAgICAgIHJldHVybiBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBmaWVsZCBudW1iZXIuICovCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7CisgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXROdW1iZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGFuIGVtYmVkZGVkIG1lc3NhZ2UsIHRoaXMgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YKKyAgICAgKiB0aGF0IHR5cGUuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VMaXRlIGdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSB7CisgICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQSBzZXJpYWxpemVkIChzZXJpYWxpemFibGUpIGZvcm0gb2YgdGhlIGdlbmVyYXRlZCBtZXNzYWdlLiAgU3RvcmVzIHRoZQorICAgKiBtZXNzYWdlIGFzIGEgY2xhc3MgbmFtZSBhbmQgYSBieXRlIGFycmF5LgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGNsYXNzIFNlcmlhbGl6ZWRGb3JtIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VDbGFzc05hbWU7CisgICAgcHJpdmF0ZSBieXRlW10gYXNCeXRlczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHNlcmlhbGl6ZWQgZm9ybSBieSBjYWxsaW5nIHtAbGluayBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlI3RvQnl0ZUFycmF5fS4KKyAgICAgKiBAcGFyYW0gcmVndWxhckZvcm0gdGhlIG1lc3NhZ2UgdG8gc2VyaWFsaXplCisgICAgICovCisgICAgU2VyaWFsaXplZEZvcm0oTWVzc2FnZUxpdGUgcmVndWxhckZvcm0pIHsKKyAgICAgIG1lc3NhZ2VDbGFzc05hbWUgPSByZWd1bGFyRm9ybS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgIGFzQnl0ZXMgPSByZWd1bGFyRm9ybS50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gcmVhZCBmcm9tIGFuIE9iamVjdElucHV0U3RyZWFtLCB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGlzIG9iamVjdAorICAgICAqIGJhY2sgdG8gdGhlIHJlZ3VsYXIgZm9ybS4gIFBhcnQgb2YgSmF2YSdzIHNlcmlhbGl6YXRpb24gbWFnaWMuCisgICAgICogQHJldHVybiBhIEdlbmVyYXRlZE1lc3NhZ2Ugb2YgdGhlIHR5cGUgdGhhdCB3YXMgc2VyaWFsaXplZAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIENsYXNzIG1lc3NhZ2VDbGFzcyA9IENsYXNzLmZvck5hbWUobWVzc2FnZUNsYXNzTmFtZSk7CisgICAgICAgIE1ldGhvZCBuZXdCdWlsZGVyID0gbWVzc2FnZUNsYXNzLmdldE1ldGhvZCgibmV3QnVpbGRlciIpOworICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgKE1lc3NhZ2VMaXRlLkJ1aWxkZXIpIG5ld0J1aWxkZXIuaW52b2tlKG51bGwpOworICAgICAgICBidWlsZGVyLm1lcmdlRnJvbShhc0J5dGVzKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIHByb3RvIGJ1ZmZlciBjbGFzcyIsIGUpOworICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIG5ld0J1aWxkZXIgbWV0aG9kIiwgZSk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBjYWxsIG5ld0J1aWxkZXIgbWV0aG9kIiwgZSk7CisgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIGNhbGxpbmcgbmV3QnVpbGRlciIsIGUuZ2V0Q2F1c2UoKSk7CisgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHVuZGVyc3RhbmQgcHJvdG8gYnVmZmVyIiwgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlcGxhY2VzIHRoaXMgb2JqZWN0IGluIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGggYSBzZXJpYWxpemVkIGZvcm0uCisgICAqIFBhcnQgb2YgSmF2YSdzIHNlcmlhbGl6YXRpb24gbWFnaWMuICBHZW5lcmF0ZWQgc3ViLWNsYXNzZXMgbXVzdCBvdmVycmlkZQorICAgKiB0aGlzIG1ldGhvZCBieSBjYWxsaW5nIHtAY29kZSByZXR1cm4gc3VwZXIud3JpdGVSZXBsYWNlKCk7fQorICAgKiBAcmV0dXJuIGEgU2VyaWFsaXplZEZvcm0gb2YgdGhpcyBtZXNzYWdlCisgICAqLworICBwcm90ZWN0ZWQgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgIHJldHVybiBuZXcgU2VyaWFsaXplZEZvcm0odGhpcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50ZXJuYWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50ZXJuYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFmMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKKy8qKgorICogVGhlIGNsYXNzZXMgY29udGFpbmVkIHdpdGhpbiBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIKKyAqIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBtZXNzYWdlIGltcGxlbWVudGF0aW9ucy4gVGhleSBhcmUgcHVibGljIG9ubHkgYmVjYXVzZQorICogdGhvc2UgZ2VuZXJhdGVkIG1lc3NhZ2VzIGRvIG5vdCByZXNpZGUgaW4gdGhlIHtAY29kZSBwcm90b2J1Zn0gcGFja2FnZS4KKyAqIE90aGVycyBzaG91bGQgbm90IHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKyAqLworcHVibGljIGNsYXNzIEludGVybmFsIHsKKyAgLyoqCisgICAqIEhlbHBlciBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gY29uc3RydWN0IGRlZmF1bHQgdmFsdWVzIGZvciBzdHJpbmcKKyAgICogZmllbGRzLgorICAgKiA8cD4KKyAgICogVGhlIHByb3RvY29sIGNvbXBpbGVyIGRvZXMgbm90IGFjdHVhbGx5IGNvbnRhaW4gYSBVVEYtOCBkZWNvZGVyIC0tIGl0CisgICAqIGp1c3QgcHVzaGVzIFVURi04LWVuY29kZWQgdGV4dCBhcm91bmQgd2l0aG91dCB0b3VjaGluZyBpdC4gIFRoZSBvbmUgcGxhY2UKKyAgICogd2hlcmUgdGhpcyBwcmVzZW50cyBhIHByb2JsZW0gaXMgd2hlbiBnZW5lcmF0aW5nIEphdmEgc3RyaW5nIGxpdGVyYWxzLgorICAgKiBVbmljb2RlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBsaXRlcmFsIHdvdWxkIG5vcm1hbGx5IG5lZWQgdG8gYmUgZW5jb2RlZAorICAgKiB1c2luZyBhIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLCB3aGljaCB3b3VsZCByZXF1aXJlIGRlY29kaW5nIHRoZW0uCisgICAqIFRvIGdldCBhcm91bmQgdGhpcywgcHJvdG9jIGluc3RlYWQgZW1iZWRzIHRoZSBVVEYtOCBieXRlcyBpbnRvIHRoZQorICAgKiBnZW5lcmF0ZWQgY29kZSBhbmQgbGVhdmVzIGl0IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgdG8gZGVjb2RlIHRoZW0uCisgICAqIDxwPgorICAgKiBJdCBnZXRzIHdvcnNlLCB0aG91Z2guICBJZiBwcm90b2MganVzdCBnZW5lcmF0ZWQgYSBieXRlIGFycmF5LCBsaWtlOgorICAgKiAgIG5ldyBieXRlW10gezB4MTIsIDB4MzQsIDB4NTYsIDB4Nzh9CisgICAqIEphdmEgYWN0dWFsbHkgZ2VuZXJhdGVzICpjb2RlKiB3aGljaCBhbGxvY2F0ZXMgYW4gYXJyYXkgYW5kIHRoZW4gZmlsbHMKKyAgICogaW4gZWFjaCB2YWx1ZS4gIFRoaXMgaXMgbXVjaCBsZXNzIGVmZmljaWVudCB0aGFuIGp1c3QgZW1iZWRkaW5nIHRoZSBieXRlcworICAgKiBkaXJlY3RseSBpbnRvIHRoZSBieXRlY29kZS4gIFRvIGdldCBhcm91bmQgdGhpcywgd2UgbmVlZCBhbm90aGVyCisgICAqIHdvcmstYXJvdW5kLiAgU3RyaW5nIGxpdGVyYWxzIGFyZSBlbWJlZGRlZCBkaXJlY3RseSwgc28gcHJvdG9jIGFjdHVhbGx5CisgICAqIGdlbmVyYXRlcyBhIHN0cmluZyBsaXRlcmFsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJ5dGVzLiAgVGhlIGVhc2llc3Qgd2F5CisgICAqIHRvIGRvIHRoaXMgaXMgdG8gdXNlIHRoZSBJU08tODg1OS0xIGNoYXJhY3RlciBzZXQsIHdoaWNoIGNvcnJlc3BvbmRzIHRvCisgICAqIHRoZSBmaXJzdCAyNTYgY2hhcmFjdGVycyBvZiB0aGUgVW5pY29kZSByYW5nZS4gIFByb3RvYyBjYW4gdGhlbiB1c2UKKyAgICogZ29vZCBvbGQgQ0VzY2FwZSB0byBnZW5lcmF0ZSB0aGUgc3RyaW5nLgorICAgKiA8cD4KKyAgICogU28gd2UgaGF2ZSBhIHN0cmluZyBsaXRlcmFsIHdoaWNoIHJlcHJlc2VudHMgYSBzZXQgb2YgYnl0ZXMgd2hpY2gKKyAgICogcmVwcmVzZW50cyBhbm90aGVyIHN0cmluZy4gIFRoaXMgZnVuY3Rpb24gLS0gc3RyaW5nRGVmYXVsdFZhbHVlIC0tCisgICAqIGNvbnZlcnRzIGZyb20gdGhlIGdlbmVyYXRlZCBzdHJpbmcgdG8gdGhlIHN0cmluZyB3ZSBhY3R1YWxseSB3YW50LiAgVGhlCisgICAqIGdlbmVyYXRlZCBjb2RlIGNhbGxzIHRoaXMgYXV0b21hdGljYWxseS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0RlZmF1bHRWYWx1ZShTdHJpbmcgYnl0ZXMpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSwgIlVURi04Iik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2UgYWxsIEpWTXMgYXJlIHJlcXVpcmVkIHRvIGltcGxlbWVudAorICAgICAgLy8gYm90aCBvZiB0aGUgYWJvdmUgY2hhcmFjdGVyIHNldHMuCisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICJKYXZhIFZNIGRvZXMgbm90IHN1cHBvcnQgYSBzdGFuZGFyZCBjaGFyYWN0ZXIgc2V0LiIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgY2FsbGVkIGJ5IGdlbmVyYXRlZCBjb2RlIHRvIGNvbnN0cnVjdCBkZWZhdWx0IHZhbHVlcyBmb3IgYnl0ZXMKKyAgICogZmllbGRzLgorICAgKiA8cD4KKyAgICogVGhpcyBpcyBhIGxvdCBsaWtlIHtAbGluayAjc3RyaW5nRGVmYXVsdFZhbHVlfSwgYnV0IGZvciBieXRlcyBmaWVsZHMuCisgICAqIEluIHRoaXMgY2FzZSB3ZSBvbmx5IG5lZWQgdGhlIHNlY29uZCBvZiB0aGUgdHdvIGhhY2tzIC0tIGFsbG93aW5nIHVzIHRvCisgICAqIGVtYmVkIHJhdyBieXRlcyBhcyBhIHN0cmluZyBsaXRlcmFsIHdpdGggSVNPLTg4NTktMSBlbmNvZGluZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBieXRlc0RlZmF1bHRWYWx1ZShTdHJpbmcgYnl0ZXMpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2UgYWxsIEpWTXMgYXJlIHJlcXVpcmVkIHRvIGltcGxlbWVudAorICAgICAgLy8gSVNPLTg4NTktMS4KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgIkphdmEgVk0gZG9lcyBub3Qgc3VwcG9ydCBhIHN0YW5kYXJkIGNoYXJhY3RlciBzZXQuIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gZGV0ZXJtaW5lIGlmIGEgYnl0ZSBhcnJheSBpcyBhIHZhbGlkCisgICAqIFVURi04IGVuY29kZWQgc3RyaW5nIHN1Y2ggdGhhdCB0aGUgb3JpZ2luYWwgYnl0ZXMgY2FuIGJlIGNvbnZlcnRlZCB0bworICAgKiBhIFN0cmluZyBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBhIGJ5dGUgYXJyYXkgcm91bmQgdHJpcHBpbmcgdGhlIGJ5dGVzCisgICAqIHdpdGhvdXQgbG9zcy4gIE1vcmUgcHJlY2lzZWx5LCByZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuZXZlcjoKKyAgICogPHByZT4gICB7QGNvZGUKKyAgICogQXJyYXlzLmVxdWFscyhieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksCisgICAqICAgICBuZXcgU3RyaW5nKGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwgIlVURi04IikuZ2V0Qnl0ZXMoIlVURi04IikpCisgICAqIH08L3ByZT4KKyAgICoKKyAgICogPHA+VGhpcyBtZXRob2QgcmVqZWN0cyAib3ZlcmxvbmciIGJ5dGUgc2VxdWVuY2VzLCBhcyB3ZWxsIGFzCisgICAqIDMtYnl0ZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBtYXAgdG8gYSBzdXJyb2dhdGUgY2hhcmFjdGVyLCBpbgorICAgKiBhY2NvcmRhbmNlIHdpdGggdGhlIHJlc3RyaWN0ZWQgZGVmaW5pdGlvbiBvZiBVVEYtOCBpbnRyb2R1Y2VkIGluCisgICAqIFVuaWNvZGUgMy4xLiAgTm90ZSB0aGF0IHRoZSBVVEYtOCBkZWNvZGVyIGluY2x1ZGVkIGluIE9yYWNsZSdzCisgICAqIEpESyBoYXMgYmVlbiBtb2RpZmllZCB0byBhbHNvIHJlamVjdCAib3ZlcmxvbmciIGJ5dGUgc2VxdWVuY2VzLAorICAgKiBidXQgY3VycmVudGx5ICgyMDExKSBzdGlsbCBhY2NlcHRzIDMtYnl0ZSBzdXJyb2dhdGUgY2hhcmFjdGVyCisgICAqIGJ5dGUgc2VxdWVuY2VzLgorICAgKgorICAgKiA8cD5TZWUgdGhlIFVuaWNvZGUgU3RhbmRhcmQsPC9icj4KKyAgICogVGFibGUgMy02LiA8ZW0+VVRGLTggQml0IERpc3RyaWJ1dGlvbjwvZW0+LDwvYnI+CisgICAqIFRhYmxlIDMtNy4gPGVtPldlbGwgRm9ybWVkIFVURi04IEJ5dGUgU2VxdWVuY2VzPC9lbT4uCisgICAqCisgICAqIDxwPkFzIG9mIDIwMTEtMDIsIHRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSByZXN1bHQgb2Yge0BsaW5rCisgICAqIEJ5dGVTdHJpbmcjaXNWYWxpZFV0ZjgoKX0uICBDYWxsaW5nIHRoYXQgbWV0aG9kIGRpcmVjdGx5IGlzIHByZWZlcnJlZC4KKyAgICoKKyAgICogQHBhcmFtIGJ5dGVTdHJpbmcgdGhlIHN0cmluZyB0byBjaGVjaworICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ5dGUgYXJyYXkgaXMgcm91bmQgdHJpcHBhYmxlCisgICAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFV0ZjgoQnl0ZVN0cmluZyBieXRlU3RyaW5nKSB7CisgICAgcmV0dXJuIGJ5dGVTdHJpbmcuaXNWYWxpZFV0ZjgoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbnRlcmZhY2UgZm9yIGFuIGVudW0gdmFsdWUgb3IgdmFsdWUgZGVzY3JpcHRvciwgdG8gYmUgdXNlZCBpbiBGaWVsZFNldC4KKyAgICogVGhlIGxpdGUgbGlicmFyeSBzdG9yZXMgZW51bSB2YWx1ZXMgZGlyZWN0bHkgaW4gRmllbGRTZXRzIGJ1dCB0aGUgZnVsbAorICAgKiBsaWJyYXJ5IHN0b3JlcyBFbnVtVmFsdWVEZXNjcmlwdG9ycyBpbiBvcmRlciB0byBiZXR0ZXIgc3VwcG9ydCByZWZsZWN0aW9uLgorICAgKi8KKyAgcHVibGljIGludGVyZmFjZSBFbnVtTGl0ZSB7CisgICAgaW50IGdldE51bWJlcigpOworICB9CisKKyAgLyoqCisgICAqIEludGVyZmFjZSBmb3IgYW4gb2JqZWN0IHdoaWNoIG1hcHMgaW50ZWdlcnMgdG8ge0BsaW5rIEVudW1MaXRlfXMuCisgICAqIHtAbGluayBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvcn0gaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBieSBtYXBwaW5nCisgICAqIG51bWJlcnMgdG8ge0BsaW5rIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3J9cy4gIEFkZGl0aW9uYWxseSwKKyAgICogZXZlcnkgZ2VuZXJhdGVkIGVudW0gdHlwZSBoYXMgYSBzdGF0aWMgbWV0aG9kIGludGVybmFsR2V0VmFsdWVNYXAoKSB3aGljaAorICAgKiByZXR1cm5zIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdHlwZSB0aGF0IG1hcHMgbnVtYmVycyB0byBlbnVtIHZhbHVlcy4KKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgRW51bUxpdGVNYXA8VCBleHRlbmRzIEVudW1MaXRlPiB7CisgICAgVCBmaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkN2ZmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhyb3duIHdoZW4gYSBwcm90b2NvbCBtZXNzYWdlIGJlaW5nIHBhcnNlZCBpcyBpbnZhbGlkIGluIHNvbWUgd2F5LAorICogZS5nLiBpdCBjb250YWlucyBhIG1hbGZvcm1lZCB2YXJpbnQgb3IgYSBuZWdhdGl2ZSBieXRlIGxlbmd0aC4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTYxNjE1MTc2MzA3MjQ1MDQ3Nkw7CisgIHByaXZhdGUgTWVzc2FnZUxpdGUgdW5maW5pc2hlZE1lc3NhZ2UgPSBudWxsOworCisgIHB1YmxpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgc3VwZXIoZGVzY3JpcHRpb24pOworICB9CisKKyAgLyoqCisgICAqIEF0dGFjaGVzIGFuIHVuZmluaXNoZWQgbWVzc2FnZSB0byB0aGUgZXhjZXB0aW9uIHRvIHN1cHBvcnQgYmVzdC1lZmZvcnQKKyAgICogcGFyc2luZyBpbiB7QGNvZGUgUGFyc2VyfSBpbnRlcmZhY2UuCisgICAqCisgICAqIEByZXR1cm4gdGhpcworICAgKi8KKyAgcHVibGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBzZXRVbmZpbmlzaGVkTWVzc2FnZSgKKyAgICAgIE1lc3NhZ2VMaXRlIHVuZmluaXNoZWRNZXNzYWdlKSB7CisgICAgdGhpcy51bmZpbmlzaGVkTWVzc2FnZSA9IHVuZmluaXNoZWRNZXNzYWdlOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHVuZmluaXNoZWQgbWVzc2FnZSBhdHRhY2hlZCB0byB0aGUgZXhjZXB0aW9uLCBvciBudWxsIGlmCisgICAqIG5vIG1lc3NhZ2UgaXMgYXR0YWNoZWQuCisgICAqLworICBwdWJsaWMgTWVzc2FnZUxpdGUgZ2V0VW5maW5pc2hlZE1lc3NhZ2UoKSB7CisgICAgcmV0dXJuIHVuZmluaXNoZWRNZXNzYWdlOworICB9CisKKyAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB0cnVuY2F0ZWRNZXNzYWdlKCkgeworICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAorICAgICAgIldoaWxlIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlLCB0aGUgaW5wdXQgZW5kZWQgdW5leHBlY3RlZGx5ICIgKworICAgICAgImluIHRoZSBtaWRkbGUgb2YgYSBmaWVsZC4gIFRoaXMgY291bGQgbWVhbiBlaXRoZXIgdGhhbiB0aGUgIiArCisgICAgICAiaW5wdXQgaGFzIGJlZW4gdHJ1bmNhdGVkIG9yIHRoYXQgYW4gZW1iZWRkZWQgbWVzc2FnZSAiICsKKyAgICAgICJtaXNyZXBvcnRlZCBpdHMgb3duIGxlbmd0aC4iKTsKKyAgfQorCisgIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gbmVnYXRpdmVTaXplKCkgeworICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAorICAgICAgIkNvZGVkSW5wdXRTdHJlYW0gZW5jb3VudGVyZWQgYW4gZW1iZWRkZWQgc3RyaW5nIG9yIG1lc3NhZ2UgIiArCisgICAgICAid2hpY2ggY2xhaW1lZCB0byBoYXZlIG5lZ2F0aXZlIHNpemUuIik7CisgIH0KKworICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIG1hbGZvcm1lZFZhcmludCgpIHsKKyAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKKyAgICAgICJDb2RlZElucHV0U3RyZWFtIGVuY291bnRlcmVkIGEgbWFsZm9ybWVkIHZhcmludC4iKTsKKyAgfQorCisgIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gaW52YWxpZFRhZygpIHsKKyAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKKyAgICAgICJQcm90b2NvbCBtZXNzYWdlIGNvbnRhaW5lZCBhbiBpbnZhbGlkIHRhZyAoemVybykuIik7CisgIH0KKworICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGludmFsaWRFbmRUYWcoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCisgICAgICAiUHJvdG9jb2wgbWVzc2FnZSBlbmQtZ3JvdXAgdGFnIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgdGFnLiIpOworICB9CisKKyAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpbnZhbGlkV2lyZVR5cGUoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCisgICAgICAiUHJvdG9jb2wgbWVzc2FnZSB0YWcgaGFkIGludmFsaWQgd2lyZSB0eXBlLiIpOworICB9CisKKyAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiByZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCkgeworICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAorICAgICAgIlByb3RvY29sIG1lc3NhZ2UgaGFkIHRvbyBtYW55IGxldmVscyBvZiBuZXN0aW5nLiAgTWF5IGJlIG1hbGljaW91cy4gICIgKworICAgICAgIlVzZSBDb2RlZElucHV0U3RyZWFtLnNldFJlY3Vyc2lvbkxpbWl0KCkgdG8gaW5jcmVhc2UgdGhlIGRlcHRoIGxpbWl0LiIpOworICB9CisKKyAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBzaXplTGltaXRFeGNlZWRlZCgpIHsKKyAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKKyAgICAgICJQcm90b2NvbCBtZXNzYWdlIHdhcyB0b28gbGFyZ2UuICBNYXkgYmUgbWFsaWNpb3VzLiAgIiArCisgICAgICAiVXNlIENvZGVkSW5wdXRTdHJlYW0uc2V0U2l6ZUxpbWl0KCkgdG8gaW5jcmVhc2UgdGhlIHNpemUgbGltaXQuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eUZpZWxkLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZjkyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZC5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCisvKioKKyAqIExhenlGaWVsZCBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG9mIGxhemlseSBwYXJzaW5nIG1lc3NhZ2UgZmllbGRzLiBJdCBzdG9yZXMKKyAqIHRoZSBtZXNzYWdlIGluIGEgQnl0ZVN0cmluZyBpbml0aWFsbHkgYW5kIHRoZW4gcGFyc2UgaXQgb24tZGVtYW5kLgorICoKKyAqIExhenlGaWVsZCBpcyB0aHJlYWQtY29tcGF0aWJsZSBlLmcuIGNvbmN1cnJlbnQgcmVhZCBhcmUgc2FmZSwgaG93ZXZlciwKKyAqIHN5bmNocm9uaXphdGlvbnMgYXJlIG5lZWRlZCB1bmRlciByZWFkL3dyaXRlIHNpdHVhdGlvbnMuCisgKgorICogTm93IExhenlGaWVsZCBpcyBvbmx5IHVzZWQgdG8gbGF6aWx5IGxvYWQgTWVzc2FnZVNldC4KKyAqIFRPRE8oeGlhbmdsKTogVXNlIExhenlGaWVsZCB0byBsYXppbHkgbG9hZCBhbGwgbWVzc2FnZXMuCisgKgorICogQGF1dGhvciB4aWFuZ2xAZ29vZ2xlLmNvbSAoWGlhbmcgTGkpCisgKi8KK2NsYXNzIExhenlGaWVsZCB7CisKKyAgZmluYWwgcHJpdmF0ZSBNZXNzYWdlTGl0ZSBkZWZhdWx0SW5zdGFuY2U7CisgIGZpbmFsIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5OworCisgIC8vIE11dGFibGUgYmVjYXVzZSBpdCBpcyBpbml0aWFsaXplZCBsYXppbHkuCisgIHByaXZhdGUgQnl0ZVN0cmluZyBieXRlczsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBNZXNzYWdlTGl0ZSB2YWx1ZTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGlzRGlydHkgPSBmYWxzZTsKKworICBwdWJsaWMgTGF6eUZpZWxkKE1lc3NhZ2VMaXRlIGRlZmF1bHRJbnN0YW5jZSwKKyAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwgQnl0ZVN0cmluZyBieXRlcykgeworICAgIHRoaXMuZGVmYXVsdEluc3RhbmNlID0gZGVmYXVsdEluc3RhbmNlOworICAgIHRoaXMuZXh0ZW5zaW9uUmVnaXN0cnkgPSBleHRlbnNpb25SZWdpc3RyeTsKKyAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7CisgIH0KKworICBwdWJsaWMgTWVzc2FnZUxpdGUgZ2V0VmFsdWUoKSB7CisgICAgZW5zdXJlSW5pdGlhbGl6ZWQoKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogTGF6eUZpZWxkIGlzIG5vdCB0aHJlYWQtc2FmZSBmb3Igd3JpdGUgYWNjZXNzLiBTeW5jaHJvbml6YXRpb25zIGFyZSBuZWVkZWQKKyAgICogdW5kZXIgcmVhZC93cml0ZSBzaXR1YXRpb25zLgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VMaXRlIHNldFZhbHVlKE1lc3NhZ2VMaXRlIHZhbHVlKSB7CisgICAgTWVzc2FnZUxpdGUgb3JpZ2luYWxWYWx1ZSA9IHRoaXMudmFsdWU7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIGJ5dGVzID0gbnVsbDsKKyAgICBpc0RpcnR5ID0gdHJ1ZTsKKyAgICByZXR1cm4gb3JpZ2luYWxWYWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBEdWUgdG8gdGhlIG9wdGlvbmFsIGZpZWxkIGNhbiBiZSBkdXBsaWNhdGVkIGF0IHRoZSBlbmQgb2Ygc2VyaWFsaXplZAorICAgKiBieXRlcywgd2hpY2ggd2lsbCBtYWtlIHRoZSBzZXJpYWxpemVkIHNpemUgY2hhbmdlZCBhZnRlciBMYXp5RmllbGQKKyAgICogcGFyc2VkLiBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgdGhpcyBtZXRob2QuCisgICAqLworICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgeworICAgIGlmIChpc0RpcnR5KSB7CisgICAgICByZXR1cm4gdmFsdWUuZ2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBCeXRlU3RyaW5nIHRvQnl0ZVN0cmluZygpIHsKKyAgICBpZiAoIWlzRGlydHkpIHsKKyAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICBpZiAoIWlzRGlydHkpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgfQorICAgICAgYnl0ZXMgPSB2YWx1ZS50b0J5dGVTdHJpbmcoKTsKKyAgICAgIGlzRGlydHkgPSBmYWxzZTsKKyAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBlbnN1cmVJbml0aWFsaXplZCgpOworICAgIHJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgZW5zdXJlSW5pdGlhbGl6ZWQoKTsKKyAgICByZXR1cm4gdmFsdWUuZXF1YWxzKG9iaik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBlbnN1cmVJbml0aWFsaXplZCgpOworICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGVuc3VyZUluaXRpYWxpemVkKCkgeworICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGJ5dGVzICE9IG51bGwpIHsKKyAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRJbnN0YW5jZS5nZXRQYXJzZXJGb3JUeXBlKCkKKyAgICAgICAgICAgICAgLnBhcnNlRnJvbShieXRlcywgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFRPRE8oeGlhbmdsKTogUmVmYWN0b3J5IHRoZSBBUEkgdG8gc3VwcG9ydCB0aGUgZXhjZXB0aW9uIHRocm93biBmcm9tCisgICAgICAgIC8vIGxhemlseSBsb2FkIG1lc3NhZ2VzLgorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogTGF6eUVudHJ5IGFuZCBMYXp5SXRlcmF0b3IgYXJlIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIExhenlGaWVsZCwgd2hlbgorICAgKiB1c2VycyBpdGVyYXRlIGFsbCBmaWVsZHMgZnJvbSBGaWVsZFNldC4KKyAgICovCisgIHN0YXRpYyBjbGFzcyBMYXp5RW50cnk8Sz4gaW1wbGVtZW50cyBFbnRyeTxLLCBPYmplY3Q+IHsKKyAgICBwcml2YXRlIEVudHJ5PEssIExhenlGaWVsZD4gZW50cnk7CisKKyAgICBwcml2YXRlIExhenlFbnRyeShFbnRyeTxLLCBMYXp5RmllbGQ+IGVudHJ5KSB7CisgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7CisgICAgfQorCisgICAgcHVibGljIEsgZ2V0S2V5KCkgeworICAgICAgcmV0dXJuIGVudHJ5LmdldEtleSgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICBMYXp5RmllbGQgZmllbGQgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICByZXR1cm4gZmllbGQuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGF6eUZpZWxkIGdldEZpZWxkKCkgeworICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgTWVzc2FnZUxpdGUpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiTGF6eUZpZWxkIG5vdyBvbmx5IHVzZWQgZm9yIE1lc3NhZ2VTZXQsICIKKyAgICAgICAgICAgICsgImFuZCB0aGUgdmFsdWUgb2YgTWVzc2FnZVNldCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VMaXRlIik7CisgICAgICB9CisgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKS5zZXRWYWx1ZSgoTWVzc2FnZUxpdGUpIHZhbHVlKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgTGF6eUl0ZXJhdG9yPEs+IGltcGxlbWVudHMgSXRlcmF0b3I8RW50cnk8SywgT2JqZWN0Pj4geworICAgIHByaXZhdGUgSXRlcmF0b3I8RW50cnk8SywgT2JqZWN0Pj4gaXRlcmF0b3I7CisKKyAgICBwdWJsaWMgTGF6eUl0ZXJhdG9yKEl0ZXJhdG9yPEVudHJ5PEssIE9iamVjdD4+IGl0ZXJhdG9yKSB7CisgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIEVudHJ5PEssIE9iamVjdD4gbmV4dCgpIHsKKyAgICAgIEVudHJ5PEssID8+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBMYXp5RmllbGQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMYXp5RW50cnk8Sz4oKEVudHJ5PEssIExhenlGaWVsZD4pIGVudHJ5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoRW50cnk8SywgT2JqZWN0PikgZW50cnk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0FycmF5TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjBiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3QuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMYXp5U3RyaW5nTGlzdH0gdGhhdCB3cmFwcyBhbiBBcnJheUxpc3QuIEVhY2gKKyAqIGVsZW1lbnQgaXMgZWl0aGVyIGEgQnl0ZVN0cmluZyBvciBhIFN0cmluZy4gSXQgY2FjaGVzIHRoZSBsYXN0IG9uZSByZXF1ZXN0ZWQKKyAqIHdoaWNoIGlzIG1vc3QgbGlrZWx5IHRoZSBvbmUgbmVlZGVkIG5leHQuIFRoaXMgbWluaW1pemVzIG1lbW9yeSB1c2FnZSB3aGlsZQorICogc2F0aXNmeWluZyB0aGUgbW9zdCBjb21tb24gdXNlIGNhc2VzLgorICogPHA+CisgKiA8c3Ryb25nPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9zdHJvbmc+CisgKiBJZiBtdWx0aXBsZSB0aHJlYWRzIGFjY2VzcyBhbiA8dHQ+QXJyYXlMaXN0PC90dD4gaW5zdGFuY2UgY29uY3VycmVudGx5LAorICogYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGhyZWFkcyBtb2RpZmllcyB0aGUgbGlzdCBzdHJ1Y3R1cmFsbHksIGl0CisgKiA8aT5tdXN0PC9pPiBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4gIChBIHN0cnVjdHVyYWwgbW9kaWZpY2F0aW9uIGlzCisgKiBhbnkgb3BlcmF0aW9uIHRoYXQgYWRkcyBvciBkZWxldGVzIG9uZSBvciBtb3JlIGVsZW1lbnRzLCBvciBleHBsaWNpdGx5CisgKiByZXNpemVzIHRoZSBiYWNraW5nIGFycmF5OyBtZXJlbHkgc2V0dGluZyB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCBpcyBub3QKKyAqIGEgc3RydWN0dXJhbCBtb2RpZmljYXRpb24uKSAgVGhpcyBpcyB0eXBpY2FsbHkgYWNjb21wbGlzaGVkIGJ5CisgKiBzeW5jaHJvbml6aW5nIG9uIHNvbWUgb2JqZWN0IHRoYXQgbmF0dXJhbGx5IGVuY2Fwc3VsYXRlcyB0aGUgbGlzdC4KKyAqIDxwPgorICogSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGFjY2Vzc2VkIHZpYSBjb25jdXJyZW50IHJlYWRzLCB0aGlzIGlzIHRocmVhZCBzYWZlLgorICogQ29udmVyc2lvbnMgYXJlIGRvbmUgaW4gYSB0aHJlYWQgc2FmZSBtYW5uZXIuIEl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAqIGNvbnZlcnNpb24gbWF5IGhhcHBlbiBtb3JlIHRoYW4gb25jZSBpZiB0d28gdGhyZWFkcyBhdHRlbXB0IHRvIGFjY2VzcyB0aGUKKyAqIHNhbWUgZWxlbWVudCBhbmQgdGhlIG1vZGlmaWNhdGlvbnMgd2VyZSBub3QgdmlzaWJsZSB0byBlYWNoIG90aGVyLCBidXQgdGhpcworICogd2lsbCBub3QgcmVzdWx0IGluIGFueSBjb3JydXB0aW9uIG9mIHRoZSBsaXN0IG9yIGNoYW5nZSBpbiBiZWhhdmlvciBvdGhlcgorICogdGhhbiBwZXJmb3JtYW5jZS4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIExhenlTdHJpbmdBcnJheUxpc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8U3RyaW5nPgorICAgIGltcGxlbWVudHMgTGF6eVN0cmluZ0xpc3QsIFJhbmRvbUFjY2VzcyB7CisKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBMYXp5U3RyaW5nTGlzdCBFTVBUWSA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCgKKyAgICAgIG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCkpOworCisgIHByaXZhdGUgZmluYWwgTGlzdDxPYmplY3Q+IGxpc3Q7CisKKyAgcHVibGljIExhenlTdHJpbmdBcnJheUxpc3QoKSB7CisgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICB9CisKKyAgcHVibGljIExhenlTdHJpbmdBcnJheUxpc3QoTGF6eVN0cmluZ0xpc3QgZnJvbSkgeworICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oZnJvbS5zaXplKCkpOworICAgIGFkZEFsbChmcm9tKTsKKyAgfQorCisgIHB1YmxpYyBMYXp5U3RyaW5nQXJyYXlMaXN0KExpc3Q8U3RyaW5nPiBmcm9tKSB7CisgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pihmcm9tKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldChpbnQgaW5kZXgpIHsKKyAgICBPYmplY3QgbyA9IGxpc3QuZ2V0KGluZGV4KTsKKyAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgcmV0dXJuIChTdHJpbmcpIG87CisgICAgfSBlbHNlIHsKKyAgICAgIEJ5dGVTdHJpbmcgYnMgPSAoQnl0ZVN0cmluZykgbzsKKyAgICAgIFN0cmluZyBzID0gYnMudG9TdHJpbmdVdGY4KCk7CisgICAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSkgeworICAgICAgICBsaXN0LnNldChpbmRleCwgcyk7CisgICAgICB9CisgICAgICByZXR1cm4gczsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBzaXplKCkgeworICAgIHJldHVybiBsaXN0LnNpemUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHNldChpbnQgaW5kZXgsIFN0cmluZyBzKSB7CisgICAgT2JqZWN0IG8gPSBsaXN0LnNldChpbmRleCwgcyk7CisgICAgcmV0dXJuIGFzU3RyaW5nKG8pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBlbGVtZW50KSB7CisgICAgbGlzdC5hZGQoaW5kZXgsIGVsZW1lbnQpOworICAgIG1vZENvdW50Kys7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4gYykgeworICAgIC8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFic3RyYWN0Q29sbGVjdGlvbi5hZGRBbGwoQ29sbGVjdGlvbikKKyAgICAvLyBkZWxlZ2F0ZXMgdG8gYWRkKE9iamVjdCkuIFRoaXMgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBkZWxlZ2F0ZXMgdG8KKyAgICAvLyBhZGRBbGwoaW50LCBDb2xsZWN0aW9uKSwgd2hpY2ggbWFrZXMgYSBzcGVjaWFsIGNhc2UgZm9yIENvbGxlY3Rpb25zCisgICAgLy8gd2hpY2ggYXJlIGluc3RhbmNlcyBvZiBMYXp5U3RyaW5nTGlzdC4KKyAgICByZXR1cm4gYWRkQWxsKHNpemUoKSwgYyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiBjKSB7CisgICAgLy8gV2hlbiBjb3B5aW5nIGZyb20gYW5vdGhlciBMYXp5U3RyaW5nTGlzdCwgZGlyZWN0bHkgY29weSB0aGUgdW5kZXJseWluZworICAgIC8vIGVsZW1lbnRzIHJhdGhlciB0aGFuIGZvcmNpbmcgZWFjaCBlbGVtZW50IHRvIGJlIGRlY29kZWQgdG8gYSBTdHJpbmcuCisgICAgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gYyBpbnN0YW5jZW9mIExhenlTdHJpbmdMaXN0CisgICAgICAgID8gKChMYXp5U3RyaW5nTGlzdCkgYykuZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCkgOiBjOworICAgIGJvb2xlYW4gcmV0ID0gbGlzdC5hZGRBbGwoaW5kZXgsIGNvbGxlY3Rpb24pOworICAgIG1vZENvdW50Kys7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICBPYmplY3QgbyA9IGxpc3QucmVtb3ZlKGluZGV4KTsKKyAgICBtb2RDb3VudCsrOworICAgIHJldHVybiBhc1N0cmluZyhvKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIGxpc3QuY2xlYXIoKTsKKyAgICBtb2RDb3VudCsrOworICB9CisKKyAgLy8gQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZChCeXRlU3RyaW5nIGVsZW1lbnQpIHsKKyAgICBsaXN0LmFkZChlbGVtZW50KTsKKyAgICBtb2RDb3VudCsrOworICB9CisKKyAgLy8gQE92ZXJyaWRlCisgIHB1YmxpYyBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KSB7CisgICAgT2JqZWN0IG8gPSBsaXN0LmdldChpbmRleCk7CisgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgIEJ5dGVTdHJpbmcgYiA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KChTdHJpbmcpIG8pOworICAgICAgbGlzdC5zZXQoaW5kZXgsIGIpOworICAgICAgcmV0dXJuIGI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAoQnl0ZVN0cmluZykgbzsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZyBhc1N0cmluZyhPYmplY3QgbykgeworICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICByZXR1cm4gKFN0cmluZykgbzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICgoQnl0ZVN0cmluZykgbykudG9TdHJpbmdVdGY4KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8Pz4gZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGxpc3QpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwOTMyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0xpc3QuamF2YQpAQCAtMCwwICsxLDgxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgZXh0ZW5kaW5nIHtAY29kZSBMaXN0PFN0cmluZz59IHRoYXQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCisgKiBpdGVtcyBvZiB0aGUgbGlzdCBhcyBVVEY4LWVuY29kZWQgQnl0ZVN0cmluZyBvYmplY3RzLiBUaGlzIGlzIHVzZWQgYnkgdGhlCisgKiBwcm90b2NvbCBidWZmZXIgaW1wbGVtZW50YXRpb24gdG8gc3VwcG9ydCBsYXppbHkgY29udmVydGluZyBieXRlcyBwYXJzZWQKKyAqIG92ZXIgdGhlIHdpcmUgdG8gU3RyaW5nIG9iamVjdHMgdW50aWwgbmVlZGVkIGFuZCBhbHNvIGluY3JlYXNlcyB0aGUKKyAqIGVmZmljaWVuY3kgb2Ygc2VyaWFsaXphdGlvbiBpZiB0aGUgU3RyaW5nIHdhcyBuZXZlciByZXF1ZXN0ZWQgYXMgdGhlCisgKiBCeXRlU3RyaW5nIGlzIGFscmVhZHkgY2FjaGVkLgorICogPHA+CisgKiBUaGlzIG9ubHkgYWRkcyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSB1c2UgaW4gdGhlCisgKiBwcm90b2NvbCBidWZmZXIgY29kZSBpbiBvcmRlciB0byBiZSBhYmxlIHN1Y2Nlc3NmdWxseSByb3VuZCB0cmlwIGJ5dGUgYXJyYXlzCisgKiB0aHJvdWdoIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gd2l0aG91dCBjb252ZXJzaW9uIHRvIHN0cmluZ3MuIEl0J3Mgbm90CisgKiBhdHRlbXB0aW5nIHRvIHN1cHBvcnQgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc2F5IHtAY29kZSBMaXN0PEJ5dGVTdHJpbmc+fSwgaGVuY2UKKyAqIHdoeSBvbmx5IHRoZXNlIHR3byB2ZXJ5IHNwZWNpZmljIG1ldGhvZHMgYXJlIGFkZGVkLgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgaW50ZXJmYWNlIExhenlTdHJpbmdMaXN0IGV4dGVuZHMgTGlzdDxTdHJpbmc+IHsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdCBhcyBhIEJ5dGVTdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4KKyAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdAorICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQorICAgKiAgICAgICAgICh7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKX0pCisgICAqLworICBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KTsKKworICAvKioKKyAgICogQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QgKG9wdGlvbmFsCisgICAqIG9wZXJhdGlvbikuCisgICAqCisgICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gYmUgYXBwZW5kZWQgdG8gdGhpcyBsaXN0CisgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIDx0dD5hZGQ8L3R0PiBvcGVyYXRpb24KKyAgICogICAgICAgICBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbGlzdAorICAgKi8KKyAgdm9pZCBhZGQoQnl0ZVN0cmluZyBlbGVtZW50KTsKKworICAvKioKKyAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgTGlzdCBvZiB0aGUgdW5kZXJseWluZyBlbGVtZW50cywgZWFjaCBvZgorICAgKiB3aGljaCBpcyBlaXRoZXIgYSB7QGNvZGUgU3RyaW5nfSBvciBpdHMgZXF1aXZhbGVudCBVVEYtOCBlbmNvZGVkCisgICAqIHtAY29kZSBCeXRlU3RyaW5nfS4gSXQgaXMgYW4gZXJyb3IgZm9yIHRoZSBjYWxsZXIgdG8gbW9kaWZ5IHRoZSByZXR1cm5lZAorICAgKiBMaXN0LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBhbgorICAgKiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgorICAgKi8KKyAgTGlzdDw/PiBnZXRVbmRlcmx5aW5nRWxlbWVudHMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZXJhbEJ5dGVTdHJpbmcuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZXJhbEJ5dGVTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M1M2RjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlcmFsQnl0ZVN0cmluZy5qYXZhCkBAIC0wLDAgKzEsMzQ5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHtAbGluayBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmd9IGJhY2tlZCBieSBhCisgKiBzaW5nbGUgYXJyYXkgb2YgYnl0ZXMsIGNvbnRpZ3VvdXMgaW4gbWVtb3J5LiBJdCBzdXBwb3J0cyBzdWJzdHJpbmcgYnkKKyAqIHBvaW50aW5nIHRvIG9ubHkgYSBzdWItcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYnl0ZSBhcnJheSwgbWVhbmluZyB0aGF0IGEKKyAqIHN1YnN0cmluZyB3aWxsIHJlZmVyZW5jZSB0aGUgZnVsbCBieXRlLWFycmF5IG9mIHRoZSBzdHJpbmcgaXQncyBtYWRlIGZyb20sCisgKiBleGFjdGx5IGFzIHdpdGgge0BsaW5rIFN0cmluZ30uCisgKgorICogQGF1dGhvciBjYXJsYW50b25AZ29vZ2xlLmNvbSAoQ2FybCBIYXZlcmwpCisgKi8KK2NsYXNzIExpdGVyYWxCeXRlU3RyaW5nIGV4dGVuZHMgQnl0ZVN0cmluZyB7CisKKyAgcHJvdGVjdGVkIGZpbmFsIGJ5dGVbXSBieXRlczsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAY29kZSBMaXRlcmFsQnl0ZVN0cmluZ30gYmFja2VkIGJ5IHRoZSBnaXZlbiBhcnJheSwgd2l0aG91dAorICAgKiBjb3B5aW5nLgorICAgKgorICAgKiBAcGFyYW0gYnl0ZXMgYXJyYXkgdG8gd3JhcAorICAgKi8KKyAgTGl0ZXJhbEJ5dGVTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7CisgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlIGJ5dGVBdChpbnQgaW5kZXgpIHsKKyAgICAvLyBVbmxpa2UgbW9zdCBtZXRob2RzIGluIHRoaXMgY2xhc3MsIHRoaXMgb25lIGlzIGEgZGlyZWN0IGltcGxlbWVudGF0aW9uCisgICAgLy8gaWdub3JpbmcgdGhlIHBvdGVudGlhbCBvZmZzZXQgYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIHJhbmdlLWNoZWNraW5nIGluIHRoZQorICAgIC8vIHN1YnN0cmluZyBjYXNlIGFueXdheS4KKyAgICByZXR1cm4gYnl0ZXNbaW5kZXhdOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICByZXR1cm4gYnl0ZXMubGVuZ3RoOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQnl0ZVN0cmluZyAtPiBzdWJzdHJpbmcKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEJ5dGVTdHJpbmcgc3Vic3RyaW5nKGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgpIHsKKyAgICBpZiAoYmVnaW5JbmRleCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAorICAgICAgICAgICJCZWdpbm5pbmcgaW5kZXg6ICIgKyBiZWdpbkluZGV4ICsgIiA8IDAiKTsKKyAgICB9CisgICAgaWYgKGVuZEluZGV4ID4gc2l6ZSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiRW5kIGluZGV4OiAiICsgZW5kSW5kZXggKyAiID4gIiArCisgICAgICAgICAgc2l6ZSgpKTsKKyAgICB9CisgICAgaW50IHN1YnN0cmluZ0xlbmd0aCA9IGVuZEluZGV4IC0gYmVnaW5JbmRleDsKKyAgICBpZiAoc3Vic3RyaW5nTGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCisgICAgICAgICAgIkJlZ2lubmluZyBpbmRleCBsYXJnZXIgdGhhbiBlbmRpbmcgaW5kZXg6ICIgKyBiZWdpbkluZGV4ICsgIiwgIgorICAgICAgICAgICAgICArIGVuZEluZGV4KTsKKyAgICB9CisKKyAgICBCeXRlU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoc3Vic3RyaW5nTGVuZ3RoID09IDApIHsKKyAgICAgIHJlc3VsdCA9IEJ5dGVTdHJpbmcuRU1QVFk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IG5ldyBCb3VuZGVkQnl0ZVN0cmluZyhieXRlcywgZ2V0T2Zmc2V0SW50b0J5dGVzKCkgKyBiZWdpbkluZGV4LAorICAgICAgICAgIHN1YnN0cmluZ0xlbmd0aCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBCeXRlU3RyaW5nIC0+IGJ5dGVbXQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb3B5VG9JbnRlcm5hbChieXRlW10gdGFyZ2V0LCBpbnQgc291cmNlT2Zmc2V0LCAKKyAgICAgIGludCB0YXJnZXRPZmZzZXQsIGludCBudW1iZXJUb0NvcHkpIHsKKyAgICAvLyBPcHRpbWl6ZWQgZm9ybSwgbm90IGZvciBzdWJjbGFzc2VzLCBzaW5jZSB3ZSBkb24ndCBjYWxsCisgICAgLy8gZ2V0T2Zmc2V0SW50b0J5dGVzKCkgb3IgY2hlY2sgdGhlICdudW1iZXJUb0NvcHknIHBhcmFtZXRlci4KKyAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCBzb3VyY2VPZmZzZXQsIHRhcmdldCwgdGFyZ2V0T2Zmc2V0LCBudW1iZXJUb0NvcHkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvcHlUbyhCeXRlQnVmZmVyIHRhcmdldCkgeworICAgIHRhcmdldC5wdXQoYnl0ZXMsIGdldE9mZnNldEludG9CeXRlcygpLCBzaXplKCkpOyAgLy8gQ29waWVzIGJ5dGVzCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEJ5dGVCdWZmZXIgYXNSZWFkT25seUJ5dGVCdWZmZXIoKSB7CisgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0KKyAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzLCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSwgc2l6ZSgpKTsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlci5hc1JlYWRPbmx5QnVmZmVyKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gYXNSZWFkT25seUJ5dGVCdWZmZXJMaXN0KCkgeworICAgIC8vIFJldHVybiB0aGUgQnl0ZUJ1ZmZlciBnZW5lcmF0ZWQgYnkgYXNSZWFkT25seUJ5dGVCdWZmZXIoKSBhcyBhIHNpbmdsZXRvbgorICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCeXRlQnVmZmVyPigxKTsKKyAgICByZXN1bHQuYWRkKGFzUmVhZE9ubHlCeXRlQnVmZmVyKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgfQorCisgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBvdXRwdXRTdHJlYW0ud3JpdGUodG9CeXRlQXJyYXkoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgY2hhcnNldE5hbWUpCisgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIGdldE9mZnNldEludG9CeXRlcygpLCBzaXplKCksIGNoYXJzZXROYW1lKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIFVURi04IGRlY29kaW5nCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRVdGY4KCkgeworICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXRJbnRvQnl0ZXMoKTsKKyAgICByZXR1cm4gVXRmOC5pc1ZhbGlkVXRmOChieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyBzaXplKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBpbnQgcGFydGlhbElzVmFsaWRVdGY4KGludCBzdGF0ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGludCBpbmRleCA9IGdldE9mZnNldEludG9CeXRlcygpICsgb2Zmc2V0OworICAgIHJldHVybiBVdGY4LnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZSwgYnl0ZXMsIGluZGV4LCBpbmRleCArIGxlbmd0aCk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHNpemUoKSAhPSAoKEJ5dGVTdHJpbmcpIG90aGVyKS5zaXplKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHNpemUoKSA9PSAwKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBMaXRlcmFsQnl0ZVN0cmluZykgeworICAgICAgcmV0dXJuIGVxdWFsc1JhbmdlKChMaXRlcmFsQnl0ZVN0cmluZykgb3RoZXIsIDAsIHNpemUoKSk7CisgICAgfSBlbHNlIGlmIChvdGhlciBpbnN0YW5jZW9mIFJvcGVCeXRlU3RyaW5nKSB7CisgICAgICByZXR1cm4gb3RoZXIuZXF1YWxzKHRoaXMpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJIYXMgYSBuZXcgdHlwZSBvZiBCeXRlU3RyaW5nIGJlZW4gY3JlYXRlZD8gRm91bmQgIgorICAgICAgICAgICAgICArIG90aGVyLmdldENsYXNzKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDaGVjayBlcXVhbGl0eSBvZiB0aGUgc3Vic3RyaW5nIG9mIGdpdmVuIGxlbmd0aCBvZiB0aGlzIG9iamVjdCBzdGFydGluZyBhdAorICAgKiB6ZXJvIHdpdGggYW5vdGhlciB7QGNvZGUgTGl0ZXJhbEJ5dGVTdHJpbmd9IHN1YnN0cmluZyBzdGFydGluZyBhdCBvZmZzZXQuCisgICAqCisgICAqIEBwYXJhbSBvdGhlciAgd2hhdCB0byBjb21wYXJlIGEgc3Vic3RyaW5nIGluCisgICAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IGludG8gb3RoZXIKKyAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQorICAgKiBAcmV0dXJuIHRydWUgZm9yIGVxdWFsaXR5IG9mIHN1YnN0cmluZ3MsIGVsc2UgZmFsc2UuCisgICAqLworICBib29sZWFuIGVxdWFsc1JhbmdlKExpdGVyYWxCeXRlU3RyaW5nIG90aGVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA+IG90aGVyLnNpemUoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAiTGVuZ3RoIHRvbyBsYXJnZTogIiArIGxlbmd0aCArIHNpemUoKSk7CisgICAgfQorICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBvdGhlci5zaXplKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIlJhbiBvZmYgZW5kIG9mIG90aGVyOiAiICsgb2Zmc2V0ICsgIiwgIiArIGxlbmd0aCArICIsICIgKworICAgICAgICAgICAgICBvdGhlci5zaXplKCkpOworICAgIH0KKworICAgIGJ5dGVbXSB0aGlzQnl0ZXMgPSBieXRlczsKKyAgICBieXRlW10gb3RoZXJCeXRlcyA9IG90aGVyLmJ5dGVzOworICAgIGludCB0aGlzTGltaXQgPSBnZXRPZmZzZXRJbnRvQnl0ZXMoKSArIGxlbmd0aDsKKyAgICBmb3IgKGludCB0aGlzSW5kZXggPSBnZXRPZmZzZXRJbnRvQnl0ZXMoKSwgb3RoZXJJbmRleCA9CisgICAgICAgIG90aGVyLmdldE9mZnNldEludG9CeXRlcygpICsgb2Zmc2V0OworICAgICAgICAodGhpc0luZGV4IDwgdGhpc0xpbWl0KTsgKyt0aGlzSW5kZXgsICsrb3RoZXJJbmRleCkgeworICAgICAgaWYgKHRoaXNCeXRlc1t0aGlzSW5kZXhdICE9IG90aGVyQnl0ZXNbb3RoZXJJbmRleF0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBDYWNoZWQgaGFzaCB2YWx1ZS4gIEludGVudGlvbmFsbHkgYWNjZXNzZWQgdmlhIGEgZGF0YSByYWNlLCB3aGljaAorICAgKiBpcyBzYWZlIGJlY2F1c2Ugb2YgdGhlIEphdmEgTWVtb3J5IE1vZGVsJ3MgIm5vIG91dC1vZi10aGluLWFpciB2YWx1ZXMiCisgICAqIGd1YXJhbnRlZXMgZm9yIGludHMuCisgICAqLworICBwcml2YXRlIGludCBoYXNoID0gMDsKKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgaGFzaENvZGUgdXNpbmcgdGhlIHRyYWRpdGlvbmFsIGFsZ29yaXRobSBmcm9tIHtAbGluaworICAgKiBCeXRlU3RyaW5nfS4KKyAgICoKKyAgICogQHJldHVybiBoYXNoQ29kZSB2YWx1ZQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgaW50IGggPSBoYXNoOworCisgICAgaWYgKGggPT0gMCkgeworICAgICAgaW50IHNpemUgPSBzaXplKCk7CisgICAgICBoID0gcGFydGlhbEhhc2goc2l6ZSwgMCwgc2l6ZSk7CisgICAgICBpZiAoaCA9PSAwKSB7CisgICAgICAgIGggPSAxOworICAgICAgfQorICAgICAgaGFzaCA9IGg7CisgICAgfQorICAgIHJldHVybiBoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBpbnQgcGVla0NhY2hlZEhhc2hDb2RlKCkgeworICAgIHJldHVybiBoYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBpbnQgcGFydGlhbEhhc2goaW50IGgsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBieXRlW10gdGhpc0J5dGVzID0gYnl0ZXM7CisgICAgZm9yIChpbnQgaSA9IGdldE9mZnNldEludG9CeXRlcygpICsgb2Zmc2V0LCBsaW1pdCA9IGkgKyBsZW5ndGg7IGkgPCBsaW1pdDsKKyAgICAgICAgaSsrKSB7CisgICAgICBoID0gaCAqIDMxICsgdGhpc0J5dGVzW2ldOworICAgIH0KKyAgICByZXR1cm4gaDsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIElucHV0IHN0cmVhbQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXQoKSB7CisgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcywgZ2V0T2Zmc2V0SW50b0J5dGVzKCksCisgICAgICAgIHNpemUoKSk7ICAvLyBObyBjb3B5CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENvZGVkSW5wdXRTdHJlYW0gbmV3Q29kZWRJbnB1dCgpIHsKKyAgICAvLyBXZSB0cnVzdCBDb2RlZElucHV0U3RyZWFtIG5vdCB0byBtb2RpZnkgdGhlIGJ5dGVzLCBvciB0byBnaXZlIGFueW9uZQorICAgIC8vIGVsc2UgYWNjZXNzIHRvIHRoZW0uCisgICAgcmV0dXJuIENvZGVkSW5wdXRTdHJlYW0KKyAgICAgICAgLm5ld0luc3RhbmNlKGJ5dGVzLCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSwgc2l6ZSgpKTsgIC8vIE5vIGNvcHkKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEJ5dGVJdGVyYXRvcgorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQnl0ZUl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgIHJldHVybiBuZXcgTGl0ZXJhbEJ5dGVJdGVyYXRvcigpOworICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBMaXRlcmFsQnl0ZUl0ZXJhdG9yIGltcGxlbWVudHMgQnl0ZUl0ZXJhdG9yIHsKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBsaW1pdDsKKworICAgIHByaXZhdGUgTGl0ZXJhbEJ5dGVJdGVyYXRvcigpIHsKKyAgICAgIHBvc2l0aW9uID0gMDsKKyAgICAgIGxpbWl0ID0gc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICByZXR1cm4gKHBvc2l0aW9uIDwgbGltaXQpOworICAgIH0KKworICAgIHB1YmxpYyBCeXRlIG5leHQoKSB7CisgICAgICAvLyBCb3hpbmcgY2FsbHMgQnl0ZS52YWx1ZU9mKGJ5dGUpLCB3aGljaCBkb2VzIG5vdCBpbnN0YW50aWF0ZS4KKyAgICAgIHJldHVybiBuZXh0Qnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIG5leHRCeXRlKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzW3Bvc2l0aW9uKytdOworICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEludGVybmFsIG1ldGhvZHMKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGludCBnZXRUcmVlRGVwdGgoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCYWxhbmNlZCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBPZmZzZXQgaW50byB7QGNvZGUgYnl0ZXNbXX0gdG8gdXNlLCBub24temVybyBmb3Igc3Vic3RyaW5ncy4KKyAgICoKKyAgICogQHJldHVybiBhbHdheXMgMCBmb3IgdGhpcyBjbGFzcworICAgKi8KKyAgcHJvdGVjdGVkIGludCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4ODE0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUT0RPKGtlbnRvbik6ICBVc2UgZ2VuZXJpY3M/ICBFLmcuIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPiwgdGhlbgorLy8gICBtZXJnZUZyb20qKCkgY291bGQgcmV0dXJuIEJ1aWxkZXJUeXBlIGZvciBiZXR0ZXIgdHlwZS1zYWZldHkuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIG9iamVjdHMuCisgKiA8cD4KKyAqIFNlZSBhbHNvIHtAbGluayBNZXNzYWdlTGl0ZX0sIHdoaWNoIGRlZmluZXMgbW9zdCBvZiB0aGUgbWV0aG9kcyB0aGF0IHR5cGljYWwKKyAqIHVzZXJzIGNhcmUgYWJvdXQuICB7QGxpbmsgTWVzc2FnZX0gYWRkcyB0byBpdCBtZXRob2RzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUKKyAqIGluIHRoZSAibGl0ZSIgcnVudGltZS4gIFRoZSBiaWdnZXN0IGFkZGVkIGZlYXR1cmVzIGFyZSBpbnRyb3NwZWN0aW9uIGFuZAorICogcmVmbGVjdGlvbiAtLSBpLmUuLCBnZXR0aW5nIGRlc2NyaXB0b3JzIGZvciB0aGUgbWVzc2FnZSB0eXBlIGFuZCBhY2Nlc3NpbmcKKyAqIHRoZSBmaWVsZCB2YWx1ZXMgZHluYW1pY2FsbHkuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGludGVyZmFjZSBNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIE1lc3NhZ2VPckJ1aWxkZXIgeworCisgIC8vIChGcm9tIE1lc3NhZ2VMaXRlLCByZS1kZWNsYXJlZCBoZXJlIG9ubHkgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuKQorICBQYXJzZXI8PyBleHRlbmRzIE1lc3NhZ2U+IGdldFBhcnNlckZvclR5cGUoKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBDb21wYXJpc29uIGFuZCBoYXNoaW5nCisKKyAgLyoqCisgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyBtZXNzYWdlIGZvciBlcXVhbGl0eS4gIFJldHVybnMKKyAgICoge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgKGFzCisgICAqIGRlZmluZWQgYnkge0Bjb2RlIGdldERlc2NyaXB0b3JGb3JUeXBlKCl9KSBhbmQgaGFzIGlkZW50aWNhbCB2YWx1ZXMgZm9yCisgICAqIGFsbCBvZiBpdHMgZmllbGRzLiAgU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzOyBpbmhlcml0aW5nCisgICAqIHtAY29kZSBPYmplY3QuZXF1YWxzKCl9IGlzIGluY29ycmVjdC4KKyAgICoKKyAgICogQHBhcmFtIG90aGVyIG9iamVjdCB0byBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkgd2l0aCB0aGlzIG1lc3NhZ2UKKyAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBtZXNzYWdlCisgICAqLworICBAT3ZlcnJpZGUKKyAgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1lc3NhZ2UuICBUaGUgaGFzaCBjb2RlIG9mIGEgbWVzc2FnZQorICAgKiBzaG91bGQgbWl4IHRoZSBtZXNzYWdlJ3MgdHlwZSAob2JqZWN0IGlkZW50aXR5IG9mIHRoZSBkZXNjcmlwdG9yKSB3aXRoIGl0cworICAgKiBjb250ZW50cyAoa25vd24gYW5kIHVua25vd24gZmllbGQgdmFsdWVzKS4gIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpczsKKyAgICogaW5oZXJpdGluZyB7QGNvZGUgT2JqZWN0Lmhhc2hDb2RlKCl9IGlzIGluY29ycmVjdC4KKyAgICoKKyAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1lc3NhZ2UKKyAgICogQHNlZSBNYXAjaGFzaENvZGUoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIGludCBoYXNoQ29kZSgpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIENvbnZlbmllbmNlIG1ldGhvZHMuCisKKyAgLyoqCisgICAqIENvbnZlcnRzIHRoZSBtZXNzYWdlIHRvIGEgc3RyaW5nIGluIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdC4gVGhpcyBpcworICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsKKyAgICogVGV4dEZvcm1hdCNwcmludFRvU3RyaW5nKE1lc3NhZ2VPckJ1aWxkZXIpfS4KKyAgICovCisgIEBPdmVycmlkZQorICBTdHJpbmcgdG9TdHJpbmcoKTsKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBCdWlsZGVycworCisgIC8vIChGcm9tIE1lc3NhZ2VMaXRlLCByZS1kZWNsYXJlZCBoZXJlIG9ubHkgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuKQorICBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCk7CisgIEJ1aWxkZXIgdG9CdWlsZGVyKCk7CisKKyAgLyoqCisgICAqIEFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIGJ1aWxkZXJzLgorICAgKi8KKyAgaW50ZXJmYWNlIEJ1aWxkZXIgZXh0ZW5kcyBNZXNzYWdlTGl0ZS5CdWlsZGVyLCBNZXNzYWdlT3JCdWlsZGVyIHsKKyAgICAvLyAoRnJvbSBNZXNzYWdlTGl0ZS5CdWlsZGVyLCByZS1kZWNsYXJlZCBoZXJlIG9ubHkgZm9yIHJldHVybiB0eXBlCisgICAgLy8gY292YXJpYW5jZS4pCisgICAgQnVpbGRlciBjbGVhcigpOworCisgICAgLyoqCisgICAgICogTWVyZ2Uge0Bjb2RlIG90aGVyfSBpbnRvIHRoZSBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAge0Bjb2RlIG90aGVyfSBtdXN0CisgICAgICogaGF2ZSB0aGUgZXhhY3Qgc2FtZSB0eXBlIGFzIHtAY29kZSB0aGlzfSAoaS5lLgorICAgICAqIHtAY29kZSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpID09IG90aGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCl9KS4KKyAgICAgKgorICAgICAqIE1lcmdpbmcgb2NjdXJzIGFzIGZvbGxvd3MuICBGb3IgZWFjaCBmaWVsZDo8YnI+CisgICAgICogKiBGb3Igc2luZ3VsYXIgcHJpbWl0aXZlIGZpZWxkcywgaWYgdGhlIGZpZWxkIGlzIHNldCBpbiB7QGNvZGUgb3RoZXJ9LAorICAgICAqICAgdGhlbiB7QGNvZGUgb3RoZXJ9J3MgdmFsdWUgb3ZlcndyaXRlcyB0aGUgdmFsdWUgaW4gdGhpcyBtZXNzYWdlLjxicj4KKyAgICAgKiAqIEZvciBzaW5ndWxhciBtZXNzYWdlIGZpZWxkcywgaWYgdGhlIGZpZWxkIGlzIHNldCBpbiB7QGNvZGUgb3RoZXJ9LAorICAgICAqICAgaXQgaXMgbWVyZ2VkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc3ViLW1lc3NhZ2Ugb2YgdGhpcyBtZXNzYWdlCisgICAgICogICB1c2luZyB0aGUgc2FtZSBtZXJnaW5nIHJ1bGVzLjxicj4KKyAgICAgKiAqIEZvciByZXBlYXRlZCBmaWVsZHMsIHRoZSBlbGVtZW50cyBpbiB7QGNvZGUgb3RoZXJ9IGFyZSBjb25jYXRlbmF0ZWQKKyAgICAgKiAgIHdpdGggdGhlIGVsZW1lbnRzIGluIHRoaXMgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUge0Bjb2RlIE1lc3NhZ2U6Ok1lcmdlRnJvbX0gbWV0aG9kIGluIEMrKy4KKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlRnJvbShNZXNzYWdlIG90aGVyKTsKKworICAgIC8vIChGcm9tIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsIHJlLWRlY2xhcmVkIGhlcmUgb25seSBmb3IgcmV0dXJuIHR5cGUKKyAgICAvLyBjb3ZhcmlhbmNlLikKKyAgICBNZXNzYWdlIGJ1aWxkKCk7CisgICAgTWVzc2FnZSBidWlsZFBhcnRpYWwoKTsKKyAgICBCdWlsZGVyIGNsb25lKCk7CisgICAgQnVpbGRlciBtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVzc2FnZSdzIHR5cGUncyBkZXNjcmlwdG9yLgorICAgICAqIFNlZSB7QGxpbmsgTWVzc2FnZSNnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KKyAgICAgKi8KKyAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCdWlsZGVyIGZvciBtZXNzYWdlcyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGdpdmVuCisgICAgICogZmllbGQuICBNZXNzYWdlcyBidWlsdCB3aXRoIHRoaXMgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHNldEZpZWxkKCksCisgICAgICogc2V0UmVwZWF0ZWRGaWVsZCgpLCBvciBhZGRSZXBlYXRlZEZpZWxkKCkuCisgICAgICovCisgICAgQnVpbGRlciBuZXdCdWlsZGVyRm9yRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEdldCBhIG5lc3RlZCBidWlsZGVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICogPHA+CisgICAgICogTm9ybWFsbHksIHdlIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIGltbXV0YWJsZSBtZXNzYWdlIG9iamVjdCBmb3IgdGhlCisgICAgICogbWVzc2FnZSB0eXBlIGZpZWxkLiBTb21lIGltcGxlbWVudGF0aW9ucyh0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgYnVpbGRlcnMpLAorICAgICAqIGhvd2V2ZXIsIGNhbiBhbHNvIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIGJ1aWxkZXIgb2JqZWN0IChhIG5lc3RlZAorICAgICAqIGJ1aWxkZXIpIGZvciB0aGUgZmllbGQuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGZpZWxkIGlzIGFscmVhZHkgYmFja2VkIHVwIGJ5IGEgbmVzdGVkIGJ1aWxkZXIsIHRoZSBuZXN0ZWQgYnVpbGRlcgorICAgICAqIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBuZXcgZmllbGQgYnVpbGRlciB3aWxsIGJlIGNyZWF0ZWQgYW5kCisgICAgICogcmV0dXJuZWQuIFRoZSBvcmlnaW5hbCBtZXNzYWdlIGZpZWxkIChpZiBleGlzdCkgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUKKyAgICAgKiBmaWVsZCBidWlsZGVyLCB3aGljaCB3aWxsIHRoZW4gYmUgbmVzdGVkIGludG8gaXRzIHBhcmVudCBidWlsZGVyLgorICAgICAqIDxwPgorICAgICAqIE5PVEU6IGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IG5lc3RlZCBidWlsZGVycyB3aWxsIHRocm93CisgICAgICogPGNvZGU+VW5zdXBwb3J0ZWRFeGNlcHRpb248L2NvZGU+LgorICAgICAqLworICAgIEJ1aWxkZXIgZ2V0RmllbGRCdWlsZGVyKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmllbGQgdG8gdGhlIGdpdmVuIHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgb2YgdGhlIGNvcnJlY3QgdHlwZQorICAgICAqIGZvciB0aGlzIGZpZWxkLCBpLmUuIHRoZSBzYW1lIHR5cGUgdGhhdAorICAgICAqIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IHdvdWxkIHJldHVybi4KKyAgICAgKi8KKyAgICBCdWlsZGVyIHNldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgZmllbGQuICBUaGlzIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoZSBnZW5lcmF0ZWQKKyAgICAgKiAiY2xlYXIiIGFjY2Vzc29yIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBCdWlsZGVyIGNsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFNldHMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0CisgICAgICogYmUgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhpcyBmaWVsZCwgaS5lLiB0aGUgc2FtZSB0eXBlIHRoYXQKKyAgICAgKiB7QGxpbmsgTWVzc2FnZSNnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcixpbnQpfSB3b3VsZAorICAgICAqIHJldHVybi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCisgICAgICogICAgICAgICAgIHtAY29kZSBmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgorICAgICAqLworICAgIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIExpa2Uge0Bjb2RlIHNldFJlcGVhdGVkRmllbGR9LCBidXQgYXBwZW5kcyB0aGUgdmFsdWUgYXMgYSBuZXcgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCisgICAgICogICAgICAgICAgIHtAY29kZSBmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgorICAgICAqLworICAgIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKiogU2V0IHRoZSB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fSBmb3IgdGhpcyBtZXNzYWdlLiAqLworICAgIEJ1aWxkZXIgc2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSBzb21lIHVua25vd24gZmllbGRzIGludG8gdGhlIHtAbGluayBVbmtub3duRmllbGRTZXR9IGZvciB0aGlzCisgICAgICogbWVzc2FnZS4KKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlVW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgorCisgICAgLy8gKEZyb20gTWVzc2FnZUxpdGUuQnVpbGRlciwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZQorICAgIC8vIGNvdmFyaWFuY2UuKQorICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI5YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZS5qYXZhCkBAIC0wLDAgKzEsMzE5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUT0RPKGtlbnRvbik6ICBVc2UgZ2VuZXJpY3M/ICBFLmcuIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPiwgdGhlbgorLy8gICBtZXJnZUZyb20qKCkgY291bGQgcmV0dXJuIEJ1aWxkZXJUeXBlIGZvciBiZXR0ZXIgdHlwZS1zYWZldHkuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBBYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgUHJvdG9jb2wgTWVzc2FnZSBvYmplY3RzLgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBwcm90b2NvbCBtZXNzYWdlIG9iamVjdHMuICBOb24tbGl0ZQorICogbWVzc2FnZXMgYWRkaXRpb25hbGx5IGltcGxlbWVudCB0aGUgTWVzc2FnZSBpbnRlcmZhY2UsIHdoaWNoIGlzIGEgc3ViY2xhc3MKKyAqIG9mIE1lc3NhZ2VMaXRlLiAgVXNlIE1lc3NhZ2VMaXRlIGluc3RlYWQgd2hlbiB5b3Ugb25seSBuZWVkIHRoZSBzdWJzZXQgb2YKKyAqIGZlYXR1cmVzIHdoaWNoIGl0IHN1cHBvcnRzIC0tIG5hbWVseSwgbm90aGluZyB0aGF0IHVzZXMgZGVzY3JpcHRvcnMgb3IKKyAqIHJlZmxlY3Rpb24uICBZb3UgY2FuIGluc3RydWN0IHRoZSBwcm90b2NvbCBjb21waWxlciB0byBnZW5lcmF0ZSBjbGFzc2VzCisgKiB3aGljaCBpbXBsZW1lbnQgb25seSBNZXNzYWdlTGl0ZSwgbm90IHRoZSBmdWxsIE1lc3NhZ2UgaW50ZXJmYWNlLCBieSBhZGRpbmcKKyAqIHRoZSBmb2xsb3cgbGluZSB0byB0aGUgLnByb3RvIGZpbGU6CisgKiA8cHJlPgorICogICBvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworICogPC9wcmU+CisgKgorICogPHA+VGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIG9uIHJlc291cmNlLWNvbnN0cmFpbmVkIHN5c3RlbXMgd2hlcmUgdGhlCisgKiBmdWxsIHByb3RvY29sIGJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5IGlzIHRvbyBiaWcuCisgKgorICogPHA+Tm90ZSB0aGF0IG9uIG5vbi1jb25zdHJhaW5lZCBzeXN0ZW1zIChlLmcuIHNlcnZlcnMpIHdoZW4geW91IG5lZWQgdG8gbGluaworICogaW4gbG90cyBvZiBwcm90b2NvbCBkZWZpbml0aW9ucywgYSBiZXR0ZXIgd2F5IHRvIHJlZHVjZSB0b3RhbCBjb2RlIGZvb3RwcmludAorICogaXMgdG8gdXNlIHtAY29kZSBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkV9LiAgVGhpcyB3aWxsIG1ha2UgdGhlIGdlbmVyYXRlZAorICogY29kZSBzbWFsbGVyIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgYWxsIHRoZSBzYW1lIGZlYXR1cmVzIChhdCB0aGUgZXhwZW5zZSBvZgorICogc3BlZWQpLiAge0Bjb2RlIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRX0gaXMgYmVzdCB3aGVuIHlvdSBvbmx5IGhhdmUgYQorICogc21hbGwgbnVtYmVyIG9mIG1lc3NhZ2UgdHlwZXMgbGlua2VkIGludG8geW91ciBiaW5hcnksIGluIHdoaWNoIGNhc2UgdGhlCisgKiBzaXplIG9mIHRoZSBwcm90b2NvbCBidWZmZXJzIHJ1bnRpbWUgaXRzZWxmIGlzIHRoZSBiaWdnZXN0IHByb2JsZW0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGludGVyZmFjZSBNZXNzYWdlTGl0ZSBleHRlbmRzIE1lc3NhZ2VMaXRlT3JCdWlsZGVyIHsKKworCisgIC8qKgorICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8ge0Bjb2RlIG91dHB1dH0uICBUaGlzIGRvZXMgbm90CisgICAqIGZsdXNoIG9yIGNsb3NlIHRoZSBzdHJlYW0uCisgICAqLworICB2b2lkIHdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIG1lc3NhZ2UuICBUaGUgcmVzdWx0CisgICAqIGlzIG9ubHkgY29tcHV0ZWQgb24gdGhlIGZpcnN0IGNhbGwgYW5kIG1lbW9pemVkIGFmdGVyIHRoYXQuCisgICAqLworICBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKTsKKworCisgIC8qKgorICAgKiBHZXRzIHRoZSBwYXJzZXIgZm9yIGEgbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgbWVzc2FnZS4KKyAgICovCisgIFBhcnNlcjw/IGV4dGVuZHMgTWVzc2FnZUxpdGU+IGdldFBhcnNlckZvclR5cGUoKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgorCisgIC8qKgorICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzCisgICAqIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kCisgICAqIHtAbGluayAjd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LgorICAgKi8KKyAgQnl0ZVN0cmluZyB0b0J5dGVTdHJpbmcoKTsKKworICAvKioKKyAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHtAY29kZSBieXRlfSBhcnJheSBhbmQgcmV0dXJucyBpdC4gIFRoaXMgaXMKKyAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQKKyAgICoge0BsaW5rICN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uCisgICAqLworICBieXRlW10gdG9CeXRlQXJyYXkoKTsKKworICAvKioKKyAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAgVGhpcyBpcyBqdXN0IGEKKyAgICogdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4gIFRoaXMgZG9lcworICAgKiBub3QgZmx1c2ggb3IgY2xvc2UgdGhlIHN0cmVhbS4KKyAgICogPHA+CisgICAqIE5PVEU6ICBQcm90b2NvbCBCdWZmZXJzIGFyZSBub3Qgc2VsZi1kZWxpbWl0aW5nLiAgVGhlcmVmb3JlLCBpZiB5b3Ugd3JpdGUKKyAgICogYW55IG1vcmUgZGF0YSB0byB0aGUgc3RyZWFtIGFmdGVyIHRoZSBtZXNzYWdlLCB5b3UgbXVzdCBzb21laG93IGVuc3VyZQorICAgKiB0aGF0IHRoZSBwYXJzZXIgb24gdGhlIHJlY2VpdmluZyBlbmQgZG9lcyBub3QgaW50ZXJwcmV0IHRoaXMgYXMgYmVpbmcKKyAgICogcGFydCBvZiB0aGUgcHJvdG9jb2wgbWVzc2FnZS4gIFRoaXMgY2FuIGJlIGRvbmUgZS5nLiBieSB3cml0aW5nIHRoZSBzaXplCisgICAqIG9mIHRoZSBtZXNzYWdlIGJlZm9yZSB0aGUgZGF0YSwgdGhlbiBtYWtpbmcgc3VyZSB0byBsaW1pdCB0aGUgaW5wdXQgdG8KKyAgICogdGhhdCBzaXplIG9uIHRoZSByZWNlaXZpbmcgZW5kIChlLmcuIGJ5IHdyYXBwaW5nIHRoZSBJbnB1dFN0cmVhbSBpbiBvbmUKKyAgICogd2hpY2ggbGltaXRzIHRoZSBpbnB1dCkuICBBbHRlcm5hdGl2ZWx5LCBqdXN0IHVzZQorICAgKiB7QGxpbmsgI3dyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtKX0uCisgICAqLworICB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjd3JpdGVUbyhPdXRwdXRTdHJlYW0pfSwgYnV0IHdyaXRlcyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZQorICAgKiBhcyBhIHZhcmludCBiZWZvcmUgd3JpdGluZyB0aGUgZGF0YS4gIFRoaXMgYWxsb3dzIG1vcmUgZGF0YSB0byBiZSB3cml0dGVuCisgICAqIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdGhlIG1lc3NhZ2Ugd2l0aG91dCB0aGUgbmVlZCB0byBkZWxpbWl0IHRoZSBtZXNzYWdlCisgICAqIGRhdGEgeW91cnNlbGYuICBVc2Uge0BsaW5rIEJ1aWxkZXIjbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0gKG9yCisgICAqIHRoZSBzdGF0aWMgbWV0aG9kIHtAY29kZSBZb3VyTWVzc2FnZVR5cGUucGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0pCisgICAqIHRvIHBhcnNlIG1lc3NhZ2VzIHdyaXR0ZW4gYnkgdGhpcyBtZXRob2QuCisgICAqLworICB2b2lkIHdyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEJ1aWxkZXJzCisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgYnVpbGRlciBmb3IgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhpcyBtZXNzYWdlLgorICAgKi8KKyAgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgYnVpbGRlciBpbml0aWFsaXplZCB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuICBVc2UgdGhpcyB0bworICAgKiBkZXJpdmUgYSBuZXcgbWVzc2FnZSBmcm9tIHRoZSBjdXJyZW50IG9uZS4KKyAgICovCisgIEJ1aWxkZXIgdG9CdWlsZGVyKCk7CisKKyAgLyoqCisgICAqIEFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIGJ1aWxkZXJzLgorICAgKi8KKyAgaW50ZXJmYWNlIEJ1aWxkZXIgZXh0ZW5kcyBNZXNzYWdlTGl0ZU9yQnVpbGRlciwgQ2xvbmVhYmxlIHsKKyAgICAvKiogUmVzZXRzIGFsbCBmaWVsZHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuICovCisgICAgQnVpbGRlciBjbGVhcigpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyB0aGUgbWVzc2FnZSBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdGhlIEJ1aWxkZXIuIFN1YnNlcXVlbnQKKyAgICAgKiBjaGFuZ2VzIHRvIHRoZSBCdWlsZGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgcmV0dXJuZWQgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIFRoZSBtZXNzYWdlIGlzIG1pc3Npbmcgb25lIG9yIG1vcmUKKyAgICAgKiAgICAgICAgIHJlcXVpcmVkIGZpZWxkcyAoaS5lLiB7QGxpbmsgI2lzSW5pdGlhbGl6ZWQoKX0gcmV0dXJucyBmYWxzZSkuCisgICAgICogICAgICAgICBVc2Uge0BsaW5rICNidWlsZFBhcnRpYWwoKX0gdG8gYnlwYXNzIHRoaXMgY2hlY2suCisgICAgICovCisgICAgTWVzc2FnZUxpdGUgYnVpbGQoKTsKKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNidWlsZCgpfSwgYnV0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZQorICAgICAqIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiAgSW5zdGVhZCwgYSBwYXJ0aWFsIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCisgICAgICogU3Vic2VxdWVudCBjaGFuZ2VzIHRvIHRoZSBCdWlsZGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgcmV0dXJuZWQgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBNZXNzYWdlTGl0ZSBidWlsZFBhcnRpYWwoKTsKKworICAgIC8qKgorICAgICAqIENsb25lcyB0aGUgQnVpbGRlci4KKyAgICAgKiBAc2VlIE9iamVjdCNjbG9uZSgpCisgICAgICovCisgICAgQnVpbGRlciBjbG9uZSgpOworCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgZnJvbSB0aGUgaW5wdXQgYW5kIG1lcmdlcyBpdCB3aXRoIHRoaXMKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogPHA+V2FybmluZzogIFRoaXMgZG9lcyBub3QgdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCBpbgorICAgICAqIHRoZSBpbnB1dCBtZXNzYWdlLiAgSWYgeW91IGNhbGwge0BsaW5rICNidWlsZCgpfSB3aXRob3V0IHNldHRpbmcgYWxsCisgICAgICogcmVxdWlyZWQgZmllbGRzLCBpdCB3aWxsIHRocm93IGFuIHtAbGluayBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbn0sCisgICAgICogd2hpY2ggaXMgYSB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gYW5kIHRodXMgbWlnaHQgbm90IGJlIGNhdWdodC4gIFRoZXJlCisgICAgICogYXJlIGEgZmV3IGdvb2Qgd2F5cyB0byBkZWFsIHdpdGggdGhpczoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+Q2FsbCB7QGxpbmsgI2lzSW5pdGlhbGl6ZWQoKX0gdG8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcworICAgICAqICAgICAgIGFyZSBzZXQgYmVmb3JlIGJ1aWxkaW5nLgorICAgICAqICAgPGxpPlVzZSB7QGNvZGUgYnVpbGRQYXJ0aWFsKCl9IHRvIGJ1aWxkLCB3aGljaCBpZ25vcmVzIG1pc3NpbmcKKyAgICAgKiAgICAgICByZXF1aXJlZCBmaWVsZHMuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxwPk5vdGU6ICBUaGUgY2FsbGVyIHNob3VsZCBjYWxsCisgICAgICoge0BsaW5rIENvZGVkSW5wdXRTdHJlYW0jY2hlY2tMYXN0VGFnV2FzKGludCl9IGFmdGVyIGNhbGxpbmcgdGhpcyB0bworICAgICAqIHZlcmlmeSB0aGF0IHRoZSBsYXN0IHRhZyBzZWVuIHdhcyB0aGUgYXBwcm9wcmlhdGUgZW5kLWdyb3VwIHRhZywKKyAgICAgKiBvciB6ZXJvIGZvciBFT0YuCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgQnVpbGRlciNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LCBidXQgYWxzbworICAgICAqIHBhcnNlcyBleHRlbnNpb25zLiAgVGhlIGV4dGVuc2lvbnMgdGhhdCB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHBhcnNlCisgICAgICogbXVzdCBiZSByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uICBFeHRlbnNpb25zIG5vdCBpbgorICAgICAqIHRoZSByZWdpc3RyeSB3aWxsIGJlIHRyZWF0ZWQgYXMgdW5rbm93biBmaWVsZHMuCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcy4KKworICAgIC8qKgorICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0sRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWx3YXlzCisgICAgICogcmVhZHMgdGhlIDxpPmVudGlyZTwvaT4gaW5wdXQgKHVubGVzcyBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uKS4gIElmIHlvdQorICAgICAqIHdhbnQgaXQgdG8gc3RvcCBlYXJsaWVyLCB5b3Ugd2lsbCBuZWVkIHRvIHdyYXAgeW91ciBpbnB1dCBpbiBzb21lCisgICAgICogd3JhcHBlciBzdHJlYW0gdGhhdCBsaW1pdHMgcmVhZGluZy4gIE9yLCB1c2UKKyAgICAgKiB7QGxpbmsgTWVzc2FnZUxpdGUjd3JpdGVEZWxpbWl0ZWRUbyhPdXRwdXRTdHJlYW0pfSB0byB3cml0ZSB5b3VyIG1lc3NhZ2UKKyAgICAgKiBhbmQge0BsaW5rICNtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0pfSB0byByZWFkIGl0LgorICAgICAqIDxwPgorICAgICAqIERlc3BpdGUgdXN1YWxseSByZWFkaW5nIHRoZSBlbnRpcmUgaW5wdXQsIHRoaXMgZG9lcyBub3QgY2xvc2UgdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNtZXJnZUZyb20oSW5wdXRTdHJlYW0pfSwgYnV0IGRvZXMgbm90IHJlYWQgdW50aWwgRU9GLgorICAgICAqIEluc3RlYWQsIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIChlbmNvZGVkIGFzIGEgdmFyaW50KSBpcyByZWFkIGZpcnN0LAorICAgICAqIHRoZW4gdGhlIG1lc3NhZ2UgZGF0YS4gIFVzZQorICAgICAqIHtAbGluayBNZXNzYWdlTGl0ZSN3cml0ZURlbGltaXRlZFRvKE91dHB1dFN0cmVhbSl9IHRvIHdyaXRlIG1lc3NhZ2VzIGluCisgICAgICogdGhpcyBmb3JtYXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgc3VjY2Vzc2Z1bCwgb3IgZmFsc2UgaWYgdGhlIHN0cmVhbSBpcyBhdCBFT0Ygd2hlbiB0aGUKKyAgICAgKiAgICAgICAgIG1ldGhvZCBzdGFydHMuICBBbnkgb3RoZXIgZXJyb3IgKGluY2x1ZGluZyByZWFjaGluZyBFT0YgZHVyaW5nCisgICAgICogICAgICAgICBwYXJzaW5nKSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24uCisgICAgICovCisgICAgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI21lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSl9IGJ1dCBzdXBwb3J0aW5nIGV4dGVuc2lvbnMuCisgICAgICovCisgICAgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZU9yQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZU9yQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjJiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlT3JCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBtZXRob2RzIGNvbW1vbiB0byB7QGxpbmsgTWVzc2FnZUxpdGV9CisgKiBhbmQge0BsaW5rIE1lc3NhZ2VMaXRlLkJ1aWxkZXJ9IHRvIHByb3ZpZGUgdHlwZSBlcXVpdmFsZW5jeS4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGludGVyZmFjZSBNZXNzYWdlTGl0ZU9yQnVpbGRlciB7CisgIC8qKgorICAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUgd2l0aCBubyBmaWVsZHMgc2V0LiBCZWNhdXNlIG5vIGZpZWxkcyBhcmUgc2V0LAorICAgKiBhbGwgZ2V0dGVycyBmb3Igc2luZ3VsYXIgZmllbGRzIHdpbGwgcmV0dXJuIGRlZmF1bHQgdmFsdWVzIGFuZCByZXBlYXRlZAorICAgKiBmaWVsZHMgd2lsbCBhcHBlYXIgZW1wdHkuCisgICAqIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgYSBzaW5nbGV0b24uICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUKKyAgICoge0Bjb2RlIGdldERlZmF1bHRJbnN0YW5jZSgpfSBtZXRob2Qgb2YgZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3NlcyBpbiB0aGF0CisgICAqIHRoaXMgbWV0aG9kIGlzIGFuIGFic3RyYWN0IG1ldGhvZCBvZiB0aGUge0Bjb2RlIE1lc3NhZ2VMaXRlfSBpbnRlcmZhY2UKKyAgICogd2hlcmVhcyB7QGNvZGUgZ2V0RGVmYXVsdEluc3RhbmNlKCl9IGlzIGEgc3RhdGljIG1ldGhvZCBvZiBhIHNwZWNpZmljCisgICAqIGNsYXNzLiAgVGhleSByZXR1cm4gdGhlIHNhbWUgdGhpbmcuCisgICAqLworICBNZXNzYWdlTGl0ZSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIGluIHRoZSBtZXNzYWdlIGFuZCBhbGwgZW1iZWRkZWQKKyAgICogbWVzc2FnZXMgYXJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKgorICAgKiA8cD5TZWUgYWxzbzoge0BsaW5rIE1lc3NhZ2VPckJ1aWxkZXIjZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpfQorICAgKi8KKyAgYm9vbGVhbiBpc0luaXRpYWxpemVkKCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZU9yQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlT3JCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZU9yQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBtZXRob2RzIGNvbW1vbiB0byB7QGxpbmsgTWVzc2FnZX0gYW5kCisgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSB0byBwcm92aWRlIHR5cGUgZXF1aXZhbGVuY3kuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZU9yQnVpbGRlciBleHRlbmRzIE1lc3NhZ2VMaXRlT3JCdWlsZGVyIHsKKworICAvLyAoRnJvbSBNZXNzYWdlTGl0ZSwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZSBjb3ZhcmlhbmNlLikKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIE1lc3NhZ2UgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBmaWVsZCBwYXRocyAoZS5nLiAiZm9vLmJhci5iYXoiKSBvZiByZXF1aXJlZCBmaWVsZHMKKyAgICogd2hpY2ggYXJlIG5vdCBzZXQgaW4gdGhpcyBtZXNzYWdlLiAgWW91IHNob3VsZCBjYWxsCisgICAqIHtAbGluayBNZXNzYWdlTGl0ZU9yQnVpbGRlciNpc0luaXRpYWxpemVkKCl9IGZpcnN0IHRvIGNoZWNrIGlmIHRoZXJlCisgICAqIGFyZSBhbnkgbWlzc2luZyBmaWVsZHMsIGFzIHRoYXQgbWV0aG9kIGlzIGxpa2VseSB0byBiZSBtdWNoIGZhc3RlcgorICAgKiB0aGFuIHRoaXMgb25lIGV2ZW4gd2hlbiB0aGUgbWVzc2FnZSBpcyBmdWxseS1pbml0aWFsaXplZC4KKyAgICovCisgIExpc3Q8U3RyaW5nPiBmaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHJlcXVpcmVkIGZpZWxkcyB3aGljaCBhcmUgbm90IHNldAorICAgKiBpbiB0aGlzIG1lc3NhZ2Ugb2JqZWN0LiAgWW91IHNob3VsZCBjYWxsCisgICAqIHtAbGluayBNZXNzYWdlTGl0ZU9yQnVpbGRlciNpc0luaXRpYWxpemVkKCl9IGZpcnN0IHRvIGNoZWNrIGlmIHRoZXJlCisgICAqIGFyZSBhbnkgbWlzc2luZyBmaWVsZHMsIGFzIHRoYXQgbWV0aG9kIGlzIGxpa2VseSB0byBiZSBtdWNoIGZhc3RlcgorICAgKiB0aGFuIHRoaXMgb25lIGV2ZW4gd2hlbiB0aGUgbWVzc2FnZSBpcyBmdWxseS1pbml0aWFsaXplZC4KKyAgICovCisgIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWVzc2FnZSdzIHR5cGUncyBkZXNjcmlwdG9yLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlCisgICAqIHtAY29kZSBnZXREZXNjcmlwdG9yKCl9IG1ldGhvZCBvZiBnZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGluIHRoYXQKKyAgICogdGhpcyBtZXRob2QgaXMgYW4gYWJzdHJhY3QgbWV0aG9kIG9mIHRoZSB7QGNvZGUgTWVzc2FnZX0gaW50ZXJmYWNlCisgICAqIHdoZXJlYXMge0Bjb2RlIGdldERlc2NyaXB0b3IoKX0gaXMgYSBzdGF0aWMgbWV0aG9kIG9mIGEgc3BlY2lmaWMgY2xhc3MuCisgICAqIFRoZXkgcmV0dXJuIHRoZSBzYW1lIHRoaW5nLgorICAgKi8KKyAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwgdGhlIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2Ugd2hpY2ggYXJlIHNldAorICAgKiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuICBBIHNpbmd1bGFyICgicmVxdWlyZWQiIG9yICJvcHRpb25hbCIpCisgICAqIGZpZWxkIGlzIHNldCBpZmYgaGFzRmllbGQoKSByZXR1cm5zIHRydWUgZm9yIHRoYXQgZmllbGQuICBBICJyZXBlYXRlZCIKKyAgICogZmllbGQgaXMgc2V0IGlmZiBnZXRSZXBlYXRlZEZpZWxkU2l6ZSgpIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLiAgVGhlCisgICAqIHZhbHVlcyBhcmUgZXhhY3RseSB3aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IGNhbGxpbmcKKyAgICoge0BsaW5rICNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSBmb3IgZWFjaCBmaWVsZC4gIFRoZSBtYXAKKyAgICogaXMgZ3VhcmFudGVlZCB0byBiZSBhIHNvcnRlZCBtYXAsIHNvIGl0ZXJhdGluZyBvdmVyIGl0IHdpbGwgcmV0dXJuIGZpZWxkcworICAgKiBpbiBvcmRlciBieSBmaWVsZCBudW1iZXIuCisgICAqIDxicj4KKyAgICogSWYgdGhpcyBpcyBmb3IgYSBidWlsZGVyLCB0aGUgcmV0dXJuZWQgbWFwIG1heSBvciBtYXkgbm90IHJlZmxlY3QgZnV0dXJlCisgICAqIGNoYW5nZXMgdG8gdGhlIGJ1aWxkZXIuICBFaXRoZXIgd2F5LCB0aGUgcmV0dXJuZWQgbWFwIGlzIGl0c2VsZgorICAgKiB1bm1vZGlmaWFibGUuCisgICAqLworICBNYXA8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGZpZWxkIGlzIHNldC4gIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvCisgICAqIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCAiaGFzIiBhY2Nlc3NvciBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQuCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIGZpZWxkLCBvcgorICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCisgICAqLworICBib29sZWFuIGhhc0ZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7CisKKyAgLyoqCisgICAqIE9idGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCwgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMKKyAgICogbm90IHNldC4gIEZvciBwcmltaXRpdmUgZmllbGRzLCB0aGUgYm94ZWQgcHJpbWl0aXZlIHZhbHVlIGlzIHJldHVybmVkLgorICAgKiBGb3IgZW51bSBmaWVsZHMsIHRoZSBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuIEZvcgorICAgKiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlIGlzIHJldHVybmVkLiAgRm9yIHJlcGVhdGVkCisgICAqIGZpZWxkcywgYSBqYXZhLnV0aWwuTGlzdCBpcyByZXR1cm5lZC4KKyAgICovCisgIE9iamVjdCBnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4gIFRoaXMgaXMgZXhhY3RseQorICAgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCAiQ291bnQiIGFjY2Vzc29yIG1ldGhvZCBjb3JyZXNwb25kaW5nCisgICAqIHRvIHRoZSBmaWVsZC4KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIG5vdCBhIHJlcGVhdGVkIGZpZWxkLCBvcgorICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCisgICAqLworICBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7CisKKyAgLyoqCisgICAqIEdldHMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLiAgRm9yIHByaW1pdGl2ZSBmaWVsZHMsIHRoZSBib3hlZAorICAgKiBwcmltaXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuICBGb3IgZW51bSBmaWVsZHMsIHRoZSBFbnVtVmFsdWVEZXNjcmlwdG9yCisgICAqIGZvciB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuIEZvciBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlCisgICAqIGlzIHJldHVybmVkLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCisgICAqICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KKyAgICovCisgIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KTsKKworICAvKiogR2V0IHRoZSB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fSBmb3IgdGhpcyBtZXNzYWdlLiAqLworICBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9QYXJzZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ZTgyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyLmphdmEKQEAgLTAsMCArMSwyNTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBwYXJzaW5nIFByb3RvY29sIE1lc3NhZ2VzLgorICoKKyAqIEBhdXRob3IgbGl1amlzaUBnb29nbGUuY29tIChQaGVybCBMaXUpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFyc2VyPE1lc3NhZ2VUeXBlPiB7CisgIC8qKgorICAgKiBQYXJzZXMgYSBtZXNzYWdlIG9mIHtAY29kZSBNZXNzYWdlVHlwZX0gZnJvbSB0aGUgaW5wdXQuCisgICAqCisgICAqIDxwPk5vdGU6ICBUaGUgY2FsbGVyIHNob3VsZCBjYWxsCisgICAqIHtAbGluayBDb2RlZElucHV0U3RyZWFtI2NoZWNrTGFzdFRhZ1dhcyhpbnQpfSBhZnRlciBjYWxsaW5nIHRoaXMgdG8KKyAgICogdmVyaWZ5IHRoYXQgdGhlIGxhc3QgdGFnIHNlZW4gd2FzIHRoZSBhcHByb3ByaWF0ZSBlbmQtZ3JvdXAgdGFnLAorICAgKiBvciB6ZXJvIGZvciBFT0YuCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfSwgYnV0IGFsc28gcGFyc2VzIGV4dGVuc2lvbnMuCisgICAqIFRoZSBleHRlbnNpb25zIHRoYXQgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBwYXJzZSBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4KKyAgICoge0Bjb2RlIGV4dGVuc2lvblJlZ2lzdHJ5fS4gRXh0ZW5zaW9ucyBub3QgaW4gdGhlIHJlZ2lzdHJ5IHdpbGwgYmUgdHJlYXRlZAorICAgKiBhcyB1bmtub3duIGZpZWxkcy4KKyAgICovCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfSwgYnV0IGRvZXMgbm90IHRocm93IGFuCisgICAqIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gSW5zdGVhZCwgYSBwYXJ0aWFsCisgICAqIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfSwKKyAgICogYnV0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgICogSW5zdGVhZCwgYSBwYXJ0aWFsIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgorCisgIC8qKgorICAgKiBQYXJzZXMge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9LgorICAgKiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFBhcnNlcyB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHtAY29kZSBNZXNzYWdlVHlwZX0uCisgICAqIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAqIHtAbGluayAjcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0sIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShCeXRlU3RyaW5nKX0sIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbgorICAgKiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuIEluc3RlYWQsIGEgcGFydGlhbAorICAgKiBtZXNzYWdlIGlzIHJldHVybmVkLgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQnl0ZVN0cmluZyBkYXRhKQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShCeXRlU3RyaW5nLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfSwKKyAgICogYnV0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgICogSW5zdGVhZCwgYSBwYXJ0aWFsIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFBhcnNlcyB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHtAY29kZSBNZXNzYWdlVHlwZX0uCisgICAqIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kIHtAbGluayAjcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KKyAgICovCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBQYXJzZXMge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9LgorICAgKiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgKiB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfS4KKyAgICovCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUGFyc2VzIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2Yge0Bjb2RlIE1lc3NhZ2VUeXBlfS4KKyAgICogVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQge0BsaW5rICNwYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShieXRlW10gZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFBhcnNlcyB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHtAY29kZSBNZXNzYWdlVHlwZX0uCisgICAqIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAqIHtAbGluayAjcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0sIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShieXRlW10gZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjcGFyc2VGcm9tKGJ5dGVbXSwgaW50LCBpbnQpfSwgYnV0IGRvZXMgbm90IHRocm93IGFuCisgICAqIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gSW5zdGVhZCwgYSBwYXJ0aWFsCisgICAqIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oQnl0ZVN0cmluZywgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0sCisgICAqIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgICAqIEluc3RlYWQsIGEgcGFydGlhbCBtZXNzYWdlIGlzIHJldHVybmVkLgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oYnl0ZVtdKX0sIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbgorICAgKiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuIEluc3RlYWQsIGEgcGFydGlhbAorICAgKiBtZXNzYWdlIGlzIHJldHVybmVkLgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oYnl0ZVtdIGRhdGEpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjcGFyc2VGcm9tKGJ5dGVbXSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0sCisgICAqIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgICAqIEluc3RlYWQsIGEgcGFydGlhbCBtZXNzYWdlIGlzIHJldHVybmVkLgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oYnl0ZVtdIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFBhcnNlIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9IGZyb20ge0Bjb2RlIGlucHV0fS4KKyAgICogVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQge0BsaW5rICNwYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgorICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWx3YXlzIHJlYWRzIHRoZSA8aT5lbnRpcmU8L2k+IGlucHV0ICh1bmxlc3MgaXQKKyAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbikuICBJZiB5b3Ugd2FudCBpdCB0byBzdG9wIGVhcmxpZXIsIHlvdSB3aWxsIG5lZWQgdG8KKyAgICogd3JhcCB5b3VyIGlucHV0IGluIHNvbWUgd3JhcHBlciBzdHJlYW0gdGhhdCBsaW1pdHMgcmVhZGluZy4gIE9yLCB1c2UKKyAgICoge0BsaW5rIE1lc3NhZ2VMaXRlI3dyaXRlRGVsaW1pdGVkVG8oamF2YS5pby5PdXRwdXRTdHJlYW0pfSB0byB3cml0ZSB5b3VyCisgICAqIG1lc3NhZ2UgYW5kIHtAbGluayAjcGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0gdG8gcmVhZCBpdC4KKyAgICogPHA+CisgICAqIERlc3BpdGUgdXN1YWxseSByZWFkaW5nIHRoZSBlbnRpcmUgaW5wdXQsIHRoaXMgZG9lcyBub3QgY2xvc2UgdGhlIHN0cmVhbS4KKyAgICovCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBQYXJzZXMgYSBtZXNzYWdlIG9mIHtAY29kZSBNZXNzYWdlVHlwZX0gZnJvbSB7QGNvZGUgaW5wdXR9LgorICAgKiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgKiB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfS4KKyAgICovCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShJbnB1dFN0cmVhbSl9LCBidXQgZG9lcyBub3QgdGhyb3cgYW4KKyAgICogZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiBJbnN0ZWFkLCBhIHBhcnRpYWwKKyAgICogbWVzc2FnZSBpcyByZXR1cm5lZC4KKyAgICovCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKElucHV0U3RyZWFtIGlucHV0KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShJbnB1dFN0cmVhbSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0sCisgICAqIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgICAqIEluc3RlYWQsIGEgcGFydGlhbCBtZXNzYWdlIGlzIHJldHVybmVkLgorICAgKi8KKyAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oSW5wdXRTdHJlYW0pfSwgYnV0IGRvZXMgbm90IHJlYWQgdXRpbCBFT0YuCisgICAqIEluc3RlYWQsIHRoZSBzaXplIG9mIG1lc3NhZ2UgKGVuY29kZWQgYXMgYSB2YXJpbnQpIGlzIHJlYWQgZmlyc3QsCisgICAqIHRoZW4gdGhlIG1lc3NhZ2UgZGF0YS4gVXNlCisgICAqIHtAbGluayBNZXNzYWdlTGl0ZSN3cml0ZURlbGltaXRlZFRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKX0gdG8gd3JpdGUKKyAgICogbWVzc2FnZXMgaW4gdGhpcyBmb3JtYXQuCisgICAqCisgICAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiB0aGUgc3RyZWFtIGlzIGF0IEVPRiB3aGVuIHRoZQorICAgKiAgICAgICAgIG1ldGhvZCBzdGFydHMuIEFueSBvdGhlciBlcnJvciAoaW5jbHVkaW5nIHJlYWNoaW5nIEVPRiBkdXJpbmcKKyAgICogICAgICAgICBwYXJzaW5nKSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24uCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0KQorICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI3BhcnNlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSl9IGJ1dCBzdXBwb3J0aW5nIGV4dGVuc2lvbnMuCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICNwYXJzZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0pfSwgYnV0IGRvZXMgbm90IHRocm93IGFuCisgICAqIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gSW5zdGVhZCwgYSBwYXJ0aWFsCisgICAqIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCisgICAqLworICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICNwYXJzZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0sIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LAorICAgKiBidXQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICAgKiBJbnN0ZWFkLCBhIHBhcnRpYWwgbWVzc2FnZSBpcyByZXR1cm5lZC4KKyAgICovCisgIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxEZWxpbWl0ZWRGcm9tKAorICAgICAgSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b2NvbE1lc3NhZ2VFbnVtLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvY29sTWVzc2FnZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTI0MDBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b2NvbE1lc3NhZ2VFbnVtLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3I7CisKKy8qKgorICogSW50ZXJmYWNlIG9mIHVzZWZ1bCBtZXRob2RzIGFkZGVkIHRvIGFsbCBlbnVtcyBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sCisgKiBjb21waWxlci4KKyAqLworcHVibGljIGludGVyZmFjZSBQcm90b2NvbE1lc3NhZ2VFbnVtIGV4dGVuZHMgSW50ZXJuYWwuRW51bUxpdGUgeworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHZhbHVlJ3MgbnVtZXJpYyB2YWx1ZSBhcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgICovCisgIGludCBnZXROdW1iZXIoKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSB2YWx1ZSdzIGRlc2NyaXB0b3IsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIHN1Y2ggYXMKKyAgICogdmFsdWUgbmFtZSwgbnVtYmVyLCBhbmQgdHlwZS4KKyAgICovCisgIEVudW1WYWx1ZURlc2NyaXB0b3IgZ2V0VmFsdWVEZXNjcmlwdG9yKCk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgZW51bSB0eXBlJ3MgZGVzY3JpcHRvciwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24KKyAgICogYWJvdXQgZWFjaCBkZWZpbmVkIHZhbHVlLCBldGMuCisgICAqLworICBFbnVtRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9SZXBlYXRlZEZpZWxkQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9SZXBlYXRlZEZpZWxkQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDkyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw2OTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoge0Bjb2RlIFJlcGVhdGVkRmllbGRCdWlsZGVyfSBpbXBsZW1lbnRzIGEgc3RydWN0dXJlIHRoYXQgYSBwcm90b2NvbAorICogbWVzc2FnZSB1c2VzIHRvIGhvbGQgYSByZXBlYXRlZCBmaWVsZCBvZiBvdGhlciBwcm90b2NvbCBtZXNzYWdlcy4gSXQgc3VwcG9ydHMKKyAqIHRoZSBjbGFzc2ljYWwgdXNlIGNhc2Ugb2YgYWRkaW5nIGltbXV0YWJsZSB7QGxpbmsgTWVzc2FnZX0ncyB0byB0aGUKKyAqIHJlcGVhdGVkIGZpZWxkIGFuZCBpcyBoaWdobHkgb3B0aW1pemVkIGFyb3VuZCB0aGlzIChubyBleHRyYSBtZW1vcnkKKyAqIGFsbG9jYXRpb25zIGFuZCBzaGFyaW5nIG9mIGltbXV0YWJsZSBhcnJheXMpLgorICogPGJyPgorICogSXQgYWxzbyBzdXBwb3J0cyB0aGUgYWRkaXRpb25hbCB1c2UgY2FzZSBvZiBhZGRpbmcgYSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfQorICogdG8gdGhlIHJlcGVhdGVkIGZpZWxkIGFuZCBkZWZlcnJpbmcgY29udmVyc2lvbiBvZiB0aGF0IHtAY29kZSBCdWlsZGVyfQorICogdG8gYW4gaW1tdXRhYmxlIHtAY29kZSBNZXNzYWdlfS4gSW4gdGhpcyB3YXksIGl0J3MgcG9zc2libGUgdG8gbWFpbnRhaW4KKyAqIGEgdHJlZSBvZiB7QGNvZGUgQnVpbGRlcn0ncyB0aGF0IGFjdHMgYXMgYSBmdWxseSByZWFkL3dyaXRlIGRhdGEKKyAqIHN0cnVjdHVyZS4KKyAqIDxicj4KKyAqIExvZ2ljYWxseSwgb25lIGNhbiB0aGluayBvZiBhIHRyZWUgb2YgYnVpbGRlcnMgYXMgY29udmVydGluZyB0aGUgZW50aXJlIHRyZWUKKyAqIHRvIG1lc3NhZ2VzIHdoZW4gYnVpbGQgaXMgY2FsbGVkIG9uIHRoZSByb290IG9yIHdoZW4gYW55IG1ldGhvZCBpcyBjYWxsZWQKKyAqIHRoYXQgZGVzaXJlcyBhIE1lc3NhZ2UgaW5zdGVhZCBvZiBhIEJ1aWxkZXIuIEluIHRlcm1zIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwKKyAqIHRoZSB7QGNvZGUgU2luZ2xlRmllbGRCdWlsZGVyfSBhbmQge0Bjb2RlIFJlcGVhdGVkRmllbGRCdWlsZGVyfQorICogY2xhc3NlcyBjYWNoZSBtZXNzYWdlcyB0aGF0IHdlcmUgY3JlYXRlZCBzbyB0aGF0IG1lc3NhZ2VzIG9ubHkgbmVlZCB0byBiZQorICogY3JlYXRlZCB3aGVuIHNvbWUgY2hhbmdlIG9jY3VyZWQgaW4gaXRzIGJ1aWxkZXIgb3IgYSBidWlsZGVyIGZvciBvbmUgb2YgaXRzCisgKiBkZXNjZW5kYW50cy4KKyAqCisgKiBAcGFyYW0gPE1UeXBlPiB0aGUgdHlwZSBvZiBtZXNzYWdlIGZvciB0aGUgZmllbGQKKyAqIEBwYXJhbSA8QlR5cGU+IHRoZSB0eXBlIG9mIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZAorICogQHBhcmFtIDxJVHlwZT4gdGhlIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBtZXNzYWdlIGFuZCB0aGUgYnVpbGRlcgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgUmVwZWF0ZWRGaWVsZEJ1aWxkZXIKKyAgICA8TVR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLAorICAgICBCVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciwKKyAgICAgSVR5cGUgZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyPgorICAgIGltcGxlbWVudHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHsKKworICAvLyBQYXJlbnQgdG8gc2VuZCBjaGFuZ2VzIHRvLgorICBwcml2YXRlIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQ7CisKKyAgLy8gTGlzdCBvZiBtZXNzYWdlcy4gTmV2ZXIgbnVsbC4gSXQgbWF5IGJlIGltbXV0YWJsZSwgaW4gd2hpY2ggY2FzZQorICAvLyBpc01lc3NhZ2VzTGlzdEltbXV0YWJsZSB3aWxsIGJlIHRydWUuIFNlZSBub3RlIGJlbG93LgorICBwcml2YXRlIExpc3Q8TVR5cGU+IG1lc3NhZ2VzOworCisgIC8vIFdoZXRoZXIgbWVzc2FnZXMgaXMgYW4gbXV0YWJsZSBhcnJheSB0aGF0IGNhbiBiZSBtb2RpZmllZC4KKyAgcHJpdmF0ZSBib29sZWFuIGlzTWVzc2FnZXNMaXN0TXV0YWJsZTsKKworICAvLyBMaXN0IG9mIGJ1aWxkZXJzLiBNYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSwgbm8gbmVzdGVkIGJ1aWxkZXJzIHdlcmUKKyAgLy8gY3JlYXRlZC4gSWYgbm90IG51bGwsIGVudHJpZXMgcmVwcmVzZW50IHRoZSBidWlsZGVyIGZvciB0aGF0IGluZGV4LgorICBwcml2YXRlIExpc3Q8U2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+PiBidWlsZGVyczsKKworICAvLyBIZXJlIGFyZSB0aGUgaW52YXJpYW50cyBmb3IgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzOgorICAvLyAxLiBtZXNzYWdlcyBpcyBuZXZlciBudWxsIGFuZCBpdHMgY291bnQgY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBpdGVtcworICAvLyAgICBpbiB0aGUgcmVwZWF0ZWQgZmllbGQuCisgIC8vIDIuIElmIGJ1aWxkZXJzIGlzIG5vbi1udWxsLCBtZXNzYWdlcyBhbmQgYnVpbGRlcnMgTVVTVCBhbHdheXMKKyAgLy8gICAgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMuCisgIC8vIDMuIEVudHJpZXMgaW4gZWl0aGVyIGFycmF5IGNhbiBiZSBudWxsLCBidXQgZm9yIGFueSBpbmRleCwgdGhlcmUgTVVTVCBiZQorICAvLyAgICBlaXRoZXIgYSBNZXNzYWdlIGluIG1lc3NhZ2VzIG9yIGEgYnVpbGRlciBpbiBidWlsZGVycy4KKyAgLy8gNC4gSWYgdGhlIGJ1aWxkZXIgYXQgYW4gaW5kZXggaXMgbm9uLW51bGwsIHRoZSBidWlsZGVyIGlzCisgIC8vICAgIGF1dGhvcml0YXRpdmUuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgYSBCdWlsZGVyIHdhcyBzZXQgb24gdGhlIGluZGV4LgorICAvLyAgICBBbnkgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZXMgYXJyYXkgTVVTVCBiZSBpZ25vcmVkLgorICAvLyB0LiBJZiB0aGUgYnVpbGRlciBhdCBhbiBpbmRleCBpcyBudWxsLCB0aGUgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZXMKKyAgLy8gICAgbGlzdCBpcyBhdXRob3JpdGF0aXZlLiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIGEgTWVzc2FnZSAobm90IGEgQnVpbGRlcikKKyAgLy8gICAgd2FzIHNldCBkaXJlY3RseSBmb3IgYW4gaW5kZXguCisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgd2UndmUgYnVpbHQgYSBtZXNzYWdlIGFuZCBzbyB3ZSBhcmUgbm93IG9ibGlnYXRlZAorICAvLyB0byBkaXNwYXRjaCBkaXJ0eSBpbnZhbGlkYXRpb25zLiBTZWUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyTGlzdGVuZXIuCisgIHByaXZhdGUgYm9vbGVhbiBpc0NsZWFuOworCisgIC8vIEEgdmlldyBvZiB0aGlzIGJ1aWxkZXIgdGhhdCBleHBvc2VzIGEgTGlzdCBpbnRlcmZhY2Ugb2YgbWVzc2FnZXMuIFRoaXMgaXMKKyAgLy8gaW5pdGlhbGl6ZWQgb24gZGVtYW5kLiBUaGlzIGlzIGZ1bGx5IGJhY2tlZCBieSB0aGlzIG9iamVjdCBhbmQgYWxsIGNoYW5nZXMKKyAgLy8gYXJlIHJlZmxlY3RlZCBpbiBpdC4gQWNjZXNzIHRvIGFueSBpdGVtIGNvbnZlcnRzIGl0IHRvIGEgbWVzc2FnZSBpZiBpdAorICAvLyB3YXMgYSBidWlsZGVyLgorICBwcml2YXRlIE1lc3NhZ2VFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZXh0ZXJuYWxNZXNzYWdlTGlzdDsKKworICAvLyBBIHZpZXcgb2YgdGhpcyBidWlsZGVyIHRoYXQgZXhwb3NlcyBhIExpc3QgaW50ZXJmYWNlIG9mIGJ1aWxkZXJzLiBUaGlzIGlzCisgIC8vIGluaXRpYWxpemVkIG9uIGRlbWFuZC4gVGhpcyBpcyBmdWxseSBiYWNrZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFsbCBjaGFuZ2VzCisgIC8vIGFyZSByZWZsZWN0ZWQgaW4gaXQuIEFjY2VzcyB0byBhbnkgaXRlbSBjb252ZXJ0cyBpdCB0byBhIGJ1aWxkZXIgaWYgaXQKKyAgLy8gd2FzIGEgbWVzc2FnZS4KKyAgcHJpdmF0ZSBCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+IGV4dGVybmFsQnVpbGRlckxpc3Q7CisKKyAgLy8gQSB2aWV3IG9mIHRoaXMgYnVpbGRlciB0aGF0IGV4cG9zZXMgYSBMaXN0IGludGVyZmFjZSBvZiB0aGUgaW50ZXJmYWNlCisgIC8vIGltcGxlbWVudGVkIGJ5IG1lc3NhZ2VzIGFuZCBidWlsZGVycy4gVGhpcyBpcyBpbml0aWFsaXplZCBvbiBkZW1hbmQuIFRoaXMKKyAgLy8gaXMgZnVsbHkgYmFja2VkIGJ5IHRoaXMgb2JqZWN0IGFuZCBhbGwgY2hhbmdlcyBhcmUgcmVmbGVjdGVkIGluIGl0LgorICAvLyBBY2Nlc3MgdG8gYW55IGl0ZW0gcmV0dXJucyBlaXRoZXIgYSBidWlsZGVyIG9yIG1lc3NhZ2UgZGVwZW5kaW5nIG9uCisgIC8vIHdoYXQgaXMgbW9zdCBlZmZpY2llbnQuCisgIHByaXZhdGUgTWVzc2FnZU9yQnVpbGRlckV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPgorICAgICAgZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdDsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBidWlsZGVyIHdpdGggYW4gZW1wdHkgbGlzdCBvZiBtZXNzYWdlcy4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2VzIHRoZSBjdXJyZW50IGxpc3Qgb2YgbWVzc2FnZXMKKyAgICogQHBhcmFtIGlzTWVzc2FnZXNMaXN0TXV0YWJsZSBXaGV0aGVyIHRoZSBtZXNzYWdlcyBsaXN0IGlzIG11dGFibGUKKyAgICogQHBhcmFtIHBhcmVudCBhIGxpc3RlbmVyIHRvIG5vdGlmeSBvZiBjaGFuZ2VzCisgICAqIEBwYXJhbSBpc0NsZWFuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaXMgaW5pdGlhbGx5IG1hcmtlZCBjbGVhbgorICAgKi8KKyAgcHVibGljIFJlcGVhdGVkRmllbGRCdWlsZGVyKAorICAgICAgTGlzdDxNVHlwZT4gbWVzc2FnZXMsCisgICAgICBib29sZWFuIGlzTWVzc2FnZXNMaXN0TXV0YWJsZSwKKyAgICAgIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQsCisgICAgICBib29sZWFuIGlzQ2xlYW4pIHsKKyAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7CisgICAgdGhpcy5pc01lc3NhZ2VzTGlzdE11dGFibGUgPSBpc01lc3NhZ2VzTGlzdE11dGFibGU7CisgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgdGhpcy5pc0NsZWFuID0gaXNDbGVhbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgLy8gTnVsbCBvdXQgcGFyZW50IHNvIHdlIHN0b3Agc2VuZGluZyBpdCBpbnZhbGlkYXRpb25zLgorICAgIHBhcmVudCA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogRW5zdXJlcyB0aGF0IHRoZSBsaXN0IG9mIG1lc3NhZ2VzIGlzIG11dGFibGUgc28gaXQgY2FuIGJlIHVwZGF0ZWQuIElmIGl0J3MKKyAgICogaW1tdXRhYmxlLCBhIGNvcHkgaXMgbWFkZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKSB7CisgICAgaWYgKCFpc01lc3NhZ2VzTGlzdE11dGFibGUpIHsKKyAgICAgIG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxNVHlwZT4obWVzc2FnZXMpOworICAgICAgaXNNZXNzYWdlc0xpc3RNdXRhYmxlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW5zdXJlcyB0aGF0IHRoZSBsaXN0IG9mIGJ1aWxkZXJzIGlzIG5vdCBudWxsLiBJZiBpdCdzIG51bGwsIHRoZSBsaXN0IGlzCisgICAqIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIHRvIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1lc3NhZ2VzIGxpc3Qgd2l0aAorICAgKiBudWxsIGVudHJpZXMuCisgICAqLworICBwcml2YXRlIHZvaWQgZW5zdXJlQnVpbGRlcnMoKSB7CisgICAgaWYgKHRoaXMuYnVpbGRlcnMgPT0gbnVsbCkgeworICAgICAgdGhpcy5idWlsZGVycyA9CisgICAgICAgICAgbmV3IEFycmF5TGlzdDxTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4+KAorICAgICAgICAgICAgICBtZXNzYWdlcy5zaXplKCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgeworICAgICAgICBidWlsZGVycy5hZGQobnVsbCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGNvdW50IG9mIGl0ZW1zIGluIHRoZSBsaXN0LgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBjb3VudCBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgcmV0dXJuIG1lc3NhZ2VzLnNpemUoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIHdoZXRoZXIgdGhlIGxpc3QgaXMgZW1wdHkuCisgICAqCisgICAqIEByZXR1cm4gd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICByZXR1cm4gbWVzc2FnZXMuaXNFbXB0eSgpOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWVzc2FnZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiB0aGUgbWVzc2FnZSBpcyBjdXJyZW50bHkgc3RvcmVkCisgICAqIGFzIGEge0Bjb2RlIEJ1aWxkZXJ9LCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgTWVzc2FnZX0gYnkKKyAgICogY2FsbGluZyB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2J1aWxkUGFydGlhbH0gb24gaXQuCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0CisgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXgKKyAgICovCisgIHB1YmxpYyBNVHlwZSBnZXRNZXNzYWdlKGludCBpbmRleCkgeworICAgIHJldHVybiBnZXRNZXNzYWdlKGluZGV4LCBmYWxzZSk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIElmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBzdG9yZWQKKyAgICogYXMgYSB7QGNvZGUgQnVpbGRlcn0sIGl0IGlzIGNvbnZlcnRlZCB0byBhIHtAY29kZSBNZXNzYWdlfSBieQorICAgKiBjYWxsaW5nIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjYnVpbGRQYXJ0aWFsfSBvbiBpdC4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgbWVzc2FnZSB0byBnZXQKKyAgICogQHBhcmFtIGZvckJ1aWxkIHRoaXMgaXMgYmVpbmcgY2FsbGVkIGZvciBidWlsZCBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZQorICAgKiAgICAgd2UgU2luZ2xlRmllbGRCdWlsZGVyLmJ1aWxkIHRvIHNlbmQgZGlydHkgaW52YWxpZGF0aW9ucworICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4CisgICAqLworICBwcml2YXRlIE1UeXBlIGdldE1lc3NhZ2UoaW50IGluZGV4LCBib29sZWFuIGZvckJ1aWxkKSB7CisgICAgaWYgKHRoaXMuYnVpbGRlcnMgPT0gbnVsbCkgeworICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgYnVpbGRlcnMgLS0gcmV0dXJuIHRoZSBjdXJyZW50IE1lc3NhZ2UuCisgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIG5vIGJ1aWxkZXIgd2FzIGNyZWF0ZWQsIHNvIHdlIE1VU1QgaGF2ZSBhCisgICAgICAvLyBNZXNzYWdlLgorICAgICAgcmV0dXJuIG1lc3NhZ2VzLmdldChpbmRleCk7CisgICAgfQorCisgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaW5kZXgpOworICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBidWlsZGVyIC0tIHJldHVybiB0aGUgY3VycmVudCBtZXNzYWdlLgorICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkIGZvciB0aGUgZW50cnkgYXQgaW5kZXgsCisgICAgICAvLyBzbyB3ZSBNVVNUIGhhdmUgYSBtZXNzYWdlLgorICAgICAgcmV0dXJuIG1lc3NhZ2VzLmdldChpbmRleCk7CisKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZvckJ1aWxkID8gYnVpbGRlci5idWlsZCgpIDogYnVpbGRlci5nZXRNZXNzYWdlKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldHMgYSBidWlsZGVyIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBubyBidWlsZGVyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yCisgICAqIHRoYXQgaW5kZXgsIGEgYnVpbGRlciBpcyBjcmVhdGVkIG9uIGRlbWFuZCBieSBjYWxsaW5nCisgICAqIHtAbGluayBNZXNzYWdlI3RvQnVpbGRlcn0uCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0CisgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgZm9yIHRoYXQgaW5kZXgKKyAgICovCisgIHB1YmxpYyBCVHlwZSBnZXRCdWlsZGVyKGludCBpbmRleCkgeworICAgIGVuc3VyZUJ1aWxkZXJzKCk7CisgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaW5kZXgpOworICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgIE1UeXBlIG1lc3NhZ2UgPSBtZXNzYWdlcy5nZXQoaW5kZXgpOworICAgICAgYnVpbGRlciA9IG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4oCisgICAgICAgICAgbWVzc2FnZSwgdGhpcywgaXNDbGVhbik7CisgICAgICBidWlsZGVycy5zZXQoaW5kZXgsIGJ1aWxkZXIpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKCk7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgYmFzZSBjbGFzcyBpbnRlcmZhY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXguIFRoaXMgbWF5IGVpdGhlciBiZQorICAgKiBhIGJ1aWxkZXIgb3IgYSBtZXNzYWdlLiBJdCB3aWxsIHJldHVybiB3aGF0ZXZlciBpcyBtb3JlIGVmZmljaWVudC4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgbWVzc2FnZSB0byBnZXQKKyAgICogQHJldHVybiB0aGUgbWVzc2FnZSBvciBidWlsZGVyIGZvciB0aGUgaW5kZXggYXMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIElUeXBlIGdldE1lc3NhZ2VPckJ1aWxkZXIoaW50IGluZGV4KSB7CisgICAgaWYgKHRoaXMuYnVpbGRlcnMgPT0gbnVsbCkgeworICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgYnVpbGRlcnMgLS0gcmV0dXJuIHRoZSBjdXJyZW50IE1lc3NhZ2UuCisgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIG5vIGJ1aWxkZXIgd2FzIGNyZWF0ZWQsIHNvIHdlIE1VU1QgaGF2ZSBhCisgICAgICAvLyBNZXNzYWdlLgorICAgICAgcmV0dXJuIChJVHlwZSkgbWVzc2FnZXMuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9IGJ1aWxkZXJzLmdldChpbmRleCk7CisgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIGJ1aWxkZXIgLS0gcmV0dXJuIHRoZSBjdXJyZW50IG1lc3NhZ2UuCisgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIG5vIGJ1aWxkZXIgd2FzIGNyZWF0ZWQgZm9yIHRoZSBlbnRyeSBhdCBpbmRleCwKKyAgICAgIC8vIHNvIHdlIE1VU1QgaGF2ZSBhIG1lc3NhZ2UuCisgICAgICByZXR1cm4gKElUeXBlKSBtZXNzYWdlcy5nZXQoaW5kZXgpOworCisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBidWlsZGVyLmdldE1lc3NhZ2VPckJ1aWxkZXIoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2V0cyBhICBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggcmVwbGFjaW5nIHRoZSBleGlzdGluZyBpdGVtIGF0CisgICAqIHRoYXQgaW5kZXguCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggdG8gc2V0LgorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZXQKKyAgICogQHJldHVybiB0aGUgYnVpbGRlcgorICAgKi8KKyAgcHVibGljIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IHNldE1lc3NhZ2UoCisgICAgICBpbnQgaW5kZXgsIE1UeXBlIG1lc3NhZ2UpIHsKKyAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7CisgICAgbWVzc2FnZXMuc2V0KGluZGV4LCBtZXNzYWdlKTsKKyAgICBpZiAoYnVpbGRlcnMgIT0gbnVsbCkgeworICAgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGVudHJ5ID0KKyAgICAgICAgICBidWlsZGVycy5zZXQoaW5kZXgsIG51bGwpOworICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgZW50cnkuZGlzcG9zZSgpOworICAgICAgfQorICAgIH0KKyAgICBvbkNoYW5nZWQoKTsKKyAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkCisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKKyAgICovCisgIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBhZGRNZXNzYWdlKAorICAgICAgTVR5cGUgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKKyAgICBtZXNzYWdlcy5hZGQobWVzc2FnZSk7CisgICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKKyAgICAgIGJ1aWxkZXJzLmFkZChudWxsKTsKKyAgICB9CisgICAgb25DaGFuZ2VkKCk7CisgICAgaW5jcmVtZW50TW9kQ291bnRzKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuCisgICAqIFNoaWZ0cyB0aGUgZWxlbWVudCBjdXJyZW50bHkgYXQgdGhhdCBwb3NpdGlvbiAoaWYgYW55KSBhbmQgYW55IHN1YnNlcXVlbnQKKyAgICogZWxlbWVudHMgdG8gdGhlIHJpZ2h0IChhZGRzIG9uZSB0byB0aGVpciBpbmRpY2VzKS4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIG1lc3NhZ2UKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkCisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKKyAgICovCisgIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBhZGRNZXNzYWdlKAorICAgICAgaW50IGluZGV4LCBNVHlwZSBtZXNzYWdlKSB7CisgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOworICAgIG1lc3NhZ2VzLmFkZChpbmRleCwgbWVzc2FnZSk7CisgICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKKyAgICAgIGJ1aWxkZXJzLmFkZChpbmRleCwgbnVsbCk7CisgICAgfQorICAgIG9uQ2hhbmdlZCgpOworICAgIGluY3JlbWVudE1vZENvdW50cygpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIEFwcGVuZHMgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdG8gdGhlIGVuZCBvZgorICAgKiB0aGlzIGxpc3QsIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQKKyAgICogY29sbGVjdGlvbidzIGl0ZXJhdG9yLgorICAgKgorICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBtZXNzYWdlcyB0byBhZGQKKyAgICogQHJldHVybiB0aGUgYnVpbGRlcgorICAgKi8KKyAgcHVibGljIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGFkZEFsbE1lc3NhZ2VzKAorICAgICAgSXRlcmFibGU8PyBleHRlbmRzIE1UeXBlPiB2YWx1ZXMpIHsKKyAgICBmb3IgKGZpbmFsIE1UeXBlIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBmaW5hbAorICAgICAgQ29sbGVjdGlvbjxNVHlwZT4gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uPE1UeXBlPikgdmFsdWVzOworICAgICAgaWYgKGNvbGxlY3Rpb24uc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKKyAgICAgIGZvciAoTVR5cGUgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOworICAgICAgZm9yIChNVHlwZSB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICBhZGRNZXNzYWdlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgb25DaGFuZ2VkKCk7CisgICAgaW5jcmVtZW50TW9kQ291bnRzKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQXBwZW5kcyBhIG5ldyBidWlsZGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0IGFuZCByZXR1cm5zIHRoZSBidWlsZGVyLgorICAgKgorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBhZGQgd2hpY2ggaXMgdGhlIGJhc2lzIG9mIHRoZSBidWlsZGVyCisgICAqIEByZXR1cm4gdGhlIG5ldyBidWlsZGVyCisgICAqLworICBwdWJsaWMgQlR5cGUgYWRkQnVpbGRlcihNVHlwZSBtZXNzYWdlKSB7CisgICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7CisgICAgZW5zdXJlQnVpbGRlcnMoKTsKKyAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9CisgICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4oCisgICAgICAgICAgICBtZXNzYWdlLCB0aGlzLCBpc0NsZWFuKTsKKyAgICBtZXNzYWdlcy5hZGQobnVsbCk7CisgICAgYnVpbGRlcnMuYWRkKGJ1aWxkZXIpOworICAgIG9uQ2hhbmdlZCgpOworICAgIGluY3JlbWVudE1vZENvdW50cygpOworICAgIHJldHVybiBidWlsZGVyLmdldEJ1aWxkZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbnNlcnRzIGEgbmV3IGJ1aWxkZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuCisgICAqIFNoaWZ0cyB0aGUgZWxlbWVudCBjdXJyZW50bHkgYXQgdGhhdCBwb3NpdGlvbiAoaWYgYW55KSBhbmQgYW55IHN1YnNlcXVlbnQKKyAgICogZWxlbWVudHMgdG8gdGhlIHJpZ2h0IChhZGRzIG9uZSB0byB0aGVpciBpbmRpY2VzKS4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGJ1aWxkZXIKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkIHdoaWNoIGlzIHRoZSBiYXNpcyBvZiB0aGUgYnVpbGRlcgorICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCisgICAqLworICBwdWJsaWMgQlR5cGUgYWRkQnVpbGRlcihpbnQgaW5kZXgsIE1UeXBlIG1lc3NhZ2UpIHsKKyAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKKyAgICBlbnN1cmVCdWlsZGVycygpOworICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyID0KKyAgICAgICAgbmV3IFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPigKKyAgICAgICAgICAgIG1lc3NhZ2UsIHRoaXMsIGlzQ2xlYW4pOworICAgIG1lc3NhZ2VzLmFkZChpbmRleCwgbnVsbCk7CisgICAgYnVpbGRlcnMuYWRkKGluZGV4LCBidWlsZGVyKTsKKyAgICBvbkNoYW5nZWQoKTsKKyAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKKyAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKCk7CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4gU2hpZnRzIGFueQorICAgKiBzdWJzZXF1ZW50IGVsZW1lbnRzIHRvIHRoZSBsZWZ0IChzdWJ0cmFjdHMgb25lIGZyb20gdGhlaXIgaW5kaWNlcykuCisgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAgKgorICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGF0IHdoaWNoIHRvIHJlbW92ZSB0aGUgbWVzc2FnZQorICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgeworICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOworICAgIG1lc3NhZ2VzLnJlbW92ZShpbmRleCk7CisgICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKKyAgICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBlbnRyeSA9CisgICAgICAgICAgYnVpbGRlcnMucmVtb3ZlKGluZGV4KTsKKyAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgIGVudHJ5LmRpc3Bvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb25DaGFuZ2VkKCk7CisgICAgaW5jcmVtZW50TW9kQ291bnRzKCk7CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBsaXN0LgorICAgKiBUaGUgbGlzdCB3aWxsIGJlIGVtcHR5IGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLgorICAgKi8KKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgbWVzc2FnZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICBpc01lc3NhZ2VzTGlzdE11dGFibGUgPSBmYWxzZTsKKyAgICBpZiAoYnVpbGRlcnMgIT0gbnVsbCkgeworICAgICAgZm9yIChTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZW50cnkgOgorICAgICAgICAgIGJ1aWxkZXJzKSB7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgZW50cnkuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBidWlsZGVycyA9IG51bGw7CisgICAgfQorICAgIG9uQ2hhbmdlZCgpOworICAgIGluY3JlbWVudE1vZENvdW50cygpOworICB9CisKKyAgLyoqCisgICAqIEJ1aWxkcyB0aGUgbGlzdCBvZiBtZXNzYWdlcyBmcm9tIHRoZSBidWlsZGVyIGFuZCByZXR1cm5zIHRoZW0uCisgICAqCisgICAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIGxpc3Qgb2YgbWVzc2FnZXMKKyAgICovCisgIHB1YmxpYyBMaXN0PE1UeXBlPiBidWlsZCgpIHsKKyAgICAvLyBOb3cgdGhhdCBidWlsZCBoYXMgYmVlbiBjYWxsZWQsIHdlIGFyZSByZXF1aXJlZCB0byBkaXNwYXRjaAorICAgIC8vIGludmFsaWRhdGlvbnMuCisgICAgaXNDbGVhbiA9IHRydWU7CisKKyAgICBpZiAoIWlzTWVzc2FnZXNMaXN0TXV0YWJsZSAmJiBidWlsZGVycyA9PSBudWxsKSB7CisgICAgICAvLyBXZSBzdGlsbCBoYXZlIGFuIGltbXV0YWJsZSBsaXN0IGFuZCB3ZSBuZXZlciBjcmVhdGVkIGEgYnVpbGRlci4KKyAgICAgIHJldHVybiBtZXNzYWdlczsKKyAgICB9CisKKyAgICBib29sZWFuIGFsbE1lc3NhZ2VzSW5TeW5jID0gdHJ1ZTsKKyAgICBpZiAoIWlzTWVzc2FnZXNMaXN0TXV0YWJsZSkgeworICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSBhbiBpbW11dGFibGUgbGlzdC4gTGV0J3Mgc2VlIGlmIGFueSBvZiB0aGVtIGFyZSBvdXQKKyAgICAgIC8vIG9mIHN5bmMgd2l0aCB0aGVpciBidWlsZGVycy4KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZXMuZ2V0KGkpOworICAgICAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9IGJ1aWxkZXJzLmdldChpKTsKKyAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgeworICAgICAgICAgIGlmIChidWlsZGVyLmJ1aWxkKCkgIT0gbWVzc2FnZSkgeworICAgICAgICAgICAgYWxsTWVzc2FnZXNJblN5bmMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGFsbE1lc3NhZ2VzSW5TeW5jKSB7CisgICAgICAgIC8vIEltbXV0YWJsZSBsaXN0IGlzIHN0aWxsIGluIHN5bmMuCisgICAgICAgIHJldHVybiBtZXNzYWdlczsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIG1ha2Ugc3VyZSBtZXNzYWdlcyBpcyB1cCB0byBkYXRlCisgICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgeworICAgICAgbWVzc2FnZXMuc2V0KGksIGdldE1lc3NhZ2UoaSwgdHJ1ZSkpOworICAgIH0KKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJldHVybiBvdXIgbGlzdCBhcyBpbW11dGFibGUgc28gd2UgbWFyayB0aGF0IHdlIGNhbgorICAgIC8vIG5vIGxvbmdlciB1cGRhdGUgaXQuCisgICAgbWVzc2FnZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1lc3NhZ2VzKTsKKyAgICBpc01lc3NhZ2VzTGlzdE11dGFibGUgPSBmYWxzZTsKKyAgICByZXR1cm4gbWVzc2FnZXM7CisgIH0KKworICAvKioKKyAgICogR2V0cyBhIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIG1lc3NhZ2VzLiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBsaXZlCisgICAqIGFuZCB3aWxsIHJlZmxlY3QgYW55IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgYnVpbGRlci4KKyAgICoKKyAgICogQHJldHVybiB0aGUgbWVzc2FnZXMgaW4gdGhlIGxpc3QKKyAgICovCisgIHB1YmxpYyBMaXN0PE1UeXBlPiBnZXRNZXNzYWdlTGlzdCgpIHsKKyAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlTGlzdCA9PSBudWxsKSB7CisgICAgICBleHRlcm5hbE1lc3NhZ2VMaXN0ID0KKyAgICAgICAgICBuZXcgTWVzc2FnZUV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPih0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIGV4dGVybmFsTWVzc2FnZUxpc3Q7CisgIH0KKworICAvKioKKyAgICogR2V0cyBhIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIGJ1aWxkZXJzLiBUaGlzIHJldHVybmVkIGxpc3QgaXMKKyAgICogbGl2ZSBhbmQgd2lsbCByZWZsZWN0IGFueSBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1aWxkZXIuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXJzIGluIHRoZSBsaXN0CisgICAqLworICBwdWJsaWMgTGlzdDxCVHlwZT4gZ2V0QnVpbGRlckxpc3QoKSB7CisgICAgaWYgKGV4dGVybmFsQnVpbGRlckxpc3QgPT0gbnVsbCkgeworICAgICAgZXh0ZXJuYWxCdWlsZGVyTGlzdCA9CisgICAgICAgICAgbmV3IEJ1aWxkZXJFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4odGhpcyk7CisgICAgfQorICAgIHJldHVybiBleHRlcm5hbEJ1aWxkZXJMaXN0OworICB9CisKKyAgLyoqCisgICAqIEdldHMgYSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBNZXNzYWdlT3JCdWlsZGVycy4gVGhpcyByZXR1cm5lZAorICAgKiBsaXN0IGlzIGxpdmUgYW5kIHdpbGwgcmVmbGVjdCBhbnkgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBidWlsZGVyLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBidWlsZGVycyBpbiB0aGUgbGlzdAorICAgKi8KKyAgcHVibGljIExpc3Q8SVR5cGU+IGdldE1lc3NhZ2VPckJ1aWxkZXJMaXN0KCkgeworICAgIGlmIChleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0ID09IG51bGwpIHsKKyAgICAgIGV4dGVybmFsTWVzc2FnZU9yQnVpbGRlckxpc3QgPQorICAgICAgICAgIG5ldyBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+KHRoaXMpOworICAgIH0KKyAgICByZXR1cm4gZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdDsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIHRoZSBidWlsZGVyIG9yIG9uZSBvZiBpdHMgbmVzdGVkIGNoaWxkcmVuIGhhcyBjaGFuZ2VkCisgICAqIGFuZCBhbnkgcGFyZW50IHNob3VsZCBiZSBub3RpZmllZCBvZiBpdHMgaW52YWxpZGF0aW9uLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICBpZiAoaXNDbGVhbiAmJiBwYXJlbnQgIT0gbnVsbCkgeworICAgICAgcGFyZW50Lm1hcmtEaXJ0eSgpOworCisgICAgICAvLyBEb24ndCBrZWVwIGRpc3BhdGNoaW5nIGludmFsaWRhdGlvbnMgdW50aWwgYnVpbGQgaXMgY2FsbGVkIGFnYWluLgorICAgICAgaXNDbGVhbiA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7CisgICAgb25DaGFuZ2VkKCk7CisgIH0KKworICAvKioKKyAgICogSW5jcmVtZW50cyB0aGUgbW9kIGNvdW50cyBzbyB0aGF0IGFuIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gY2FuCisgICAqIGJlIHRocm93biBpZiBjYWxsaW5nIGNvZGUgdHJpZXMgdG8gbW9kaWZ5IHRoZSBidWlsZGVyIHdoaWxlIGl0cyBpdGVyYXRpbmcKKyAgICogdGhlIGxpc3QuCisgICAqLworICBwcml2YXRlIHZvaWQgaW5jcmVtZW50TW9kQ291bnRzKCkgeworICAgIGlmIChleHRlcm5hbE1lc3NhZ2VMaXN0ICE9IG51bGwpIHsKKyAgICAgIGV4dGVybmFsTWVzc2FnZUxpc3QuaW5jcmVtZW50TW9kQ291bnQoKTsKKyAgICB9CisgICAgaWYgKGV4dGVybmFsQnVpbGRlckxpc3QgIT0gbnVsbCkgeworICAgICAgZXh0ZXJuYWxCdWlsZGVyTGlzdC5pbmNyZW1lbnRNb2RDb3VudCgpOworICAgIH0KKyAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdCAhPSBudWxsKSB7CisgICAgICBleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0LmluY3JlbWVudE1vZENvdW50KCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFByb3ZpZGVzIGEgbGl2ZSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBtZXNzYWdlcy4KKyAgICoKKyAgICogQHBhcmFtIDxNVHlwZT4gdGhlIHR5cGUgb2YgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCisgICAqIEBwYXJhbSA8QlR5cGU+IHRoZSB0eXBlIG9mIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZAorICAgKiBAcGFyYW0gPElUeXBlPiB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgYW5kIHRoZSBidWlsZGVyCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXNzYWdlRXh0ZXJuYWxMaXN0PAorICAgICAgTVR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLAorICAgICAgQlR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIsCisgICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+CisgICAgICBleHRlbmRzIEFic3RyYWN0TGlzdDxNVHlwZT4gaW1wbGVtZW50cyBMaXN0PE1UeXBlPiB7CisKKyAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyOworCisgICAgTWVzc2FnZUV4dGVybmFsTGlzdCgKKyAgICAgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcikgeworICAgICAgdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICByZXR1cm4gdGhpcy5idWlsZGVyLmdldENvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIE1UeXBlIGdldChpbnQgaW5kZXgpIHsKKyAgICAgIHJldHVybiBidWlsZGVyLmdldE1lc3NhZ2UoaW5kZXgpOworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50TW9kQ291bnQoKSB7CisgICAgICBtb2RDb3VudCsrOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQcm92aWRlcyBhIGxpdmUgdmlldyBvZiB0aGUgYnVpbGRlciBhcyBhIGxpc3Qgb2YgYnVpbGRlcnMuCisgICAqCisgICAqIEBwYXJhbSA8TVR5cGU+IHRoZSB0eXBlIG9mIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAorICAgKiBAcGFyYW0gPEJUeXBlPiB0aGUgdHlwZSBvZiBidWlsZGVyIGZvciB0aGUgZmllbGQKKyAgICogQHBhcmFtIDxJVHlwZT4gdGhlIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBtZXNzYWdlIGFuZCB0aGUgYnVpbGRlcgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnVpbGRlckV4dGVybmFsTGlzdDwKKyAgICAgIE1UeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZSwKKyAgICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAorICAgICAgSVR5cGUgZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyPgorICAgICAgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8QlR5cGU+IGltcGxlbWVudHMgTGlzdDxCVHlwZT4geworCisgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcjsKKworICAgIEJ1aWxkZXJFeHRlcm5hbExpc3QoCisgICAgICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIpIHsKKyAgICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYnVpbGRlci5nZXRDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBCVHlwZSBnZXQoaW50IGluZGV4KSB7CisgICAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKGluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudE1vZENvdW50KCkgeworICAgICAgbW9kQ291bnQrKzsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUHJvdmlkZXMgYSBsaXZlIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIGJ1aWxkZXJzLgorICAgKgorICAgKiBAcGFyYW0gPE1UeXBlPiB0aGUgdHlwZSBvZiBtZXNzYWdlIGZvciB0aGUgZmllbGQKKyAgICogQHBhcmFtIDxCVHlwZT4gdGhlIHR5cGUgb2YgYnVpbGRlciBmb3IgdGhlIGZpZWxkCisgICAqIEBwYXJhbSA8SVR5cGU+IHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciB0aGUgbWVzc2FnZSBhbmQgdGhlIGJ1aWxkZXIKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2VPckJ1aWxkZXJFeHRlcm5hbExpc3Q8CisgICAgICBNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCisgICAgICBCVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciwKKyAgICAgIElUeXBlIGV4dGVuZHMgTWVzc2FnZU9yQnVpbGRlcj4KKyAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaXN0PElUeXBlPiBpbXBsZW1lbnRzIExpc3Q8SVR5cGU+IHsKKworICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXI7CisKKyAgICBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0KAorICAgICAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyKSB7CisgICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuZ2V0Q291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSVR5cGUgZ2V0KGludCBpbmRleCkgeworICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0TWVzc2FnZU9yQnVpbGRlcihpbmRleCk7CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnRNb2RDb3VudCgpIHsKKyAgICAgIG1vZENvdW50Kys7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5OTc4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmcuamF2YQpAQCAtMCwwICsxLDk0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IHtAY29kZSBCeXRlU3RyaW5nc30gZm9ybWVkIGJ5IGNvbmNhdGVuYXRpb24gb2Ygb3RoZXIKKyAqIEJ5dGVTdHJpbmdzLCB3aXRob3V0IGNvcHlpbmcgdGhlIGRhdGEgaW4gdGhlIHBpZWNlcy4gVGhlIGNvbmNhdGVuYXRpb24gaXMKKyAqIHJlcHJlc2VudGVkIGFzIGEgdHJlZSB3aG9zZSBsZWFmIG5vZGVzIGFyZSBlYWNoIGEge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nfS4KKyAqCisgKiA8cD5Nb3N0IG9mIHRoZSBvcGVyYXRpb24gaGVyZSBpcyBpbnNwaXJlZCBieSB0aGUgbm93LWZhbW91cyBwYXBlciA8YQorICogaHJlZj0iaHR0cDovL3d3dy5jcy51YmMuY2EvbG9jYWwvcmVhZGluZy9wcm9jZWVkaW5ncy9zcGU5MS05NS9zcGUvdm9sMjUvaXNzdWUxMi9zcGU5ODYucGRmIj4KKyAqIEJBUDk1IDwvYT4gUm9wZXM6IGFuIEFsdGVybmF0aXZlIHRvIFN0cmluZ3MgaGFucy1qLiBib2VobSwgcnVzcyBhdGtpbnNvbiBhbmQKKyAqIG1pY2hhZWwgcGxhc3MKKyAqCisgKiA8cD5UaGUgYWxnb3JpdGhtcyBkZXNjcmliZWQgaW4gdGhlIHBhcGVyIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBmb3IgY2hhcmFjdGVyCisgKiBzdHJpbmdzIGluIHtAbGluayBjb20uZ29vZ2xlLmNvbW1vbi5zdHJpbmcuUm9wZX0gYW5kIGluIHRoZSBjKysgY2xhc3Mge0Bjb2RlCisgKiBjb3JkLmNjfS4KKyAqCisgKiA8cD5GdW5kYW1lbnRhbGx5IHRoZSBSb3BlIGFsZ29yaXRobSByZXByZXNlbnRzIHRoZSBjb2xsZWN0aW9uIG9mIHBpZWNlcyBhcyBhCisgKiBiaW5hcnkgdHJlZS4gQkFQOTUgdXNlcyBhIEZpYm9uYWNjaSBib3VuZCByZWxhdGluZyBkZXB0aCB0byBhIG1pbmltdW0KKyAqIHNlcXVlbmNlIGxlbmd0aCwgc2VxdWVuY2VzIHRoYXQgYXJlIHRvbyBzaG9ydCByZWxhdGl2ZSB0byB0aGVpciBkZXB0aCBjYXVzZSBhCisgKiB0cmVlIHJlYmFsYW5jZS4gIE1vcmUgcHJlY2lzZWx5LCBhIHRyZWUgb2YgZGVwdGggZCBpcyAiYmFsYW5jZWQiIGluIHRoZQorICogdGVybWlub2xvZ3kgb2YgQkFQOTUgaWYgaXRzIGxlbmd0aCBpcyBhdCBsZWFzdCBGKGQrMiksIHdoZXJlIEYobikgaXMgdGhlCisgKiBuLXRoZSBGaWJvbmFjY2kgbnVtYmVyLiBUaHVzIGZvciBkZXB0aHMgMCwgMSwgMiwgMywgNCwgNSwuLi4gd2UgaGF2ZSBtaW5pbXVtCisgKiBsZW5ndGhzIDEsIDIsIDMsIDUsIDgsIDEzLC4uLgorICoKKyAqIEBhdXRob3IgY2FybGFudG9uQGdvb2dsZS5jb20gKENhcmwgSGF2ZXJsKQorICovCitjbGFzcyBSb3BlQnl0ZVN0cmluZyBleHRlbmRzIEJ5dGVTdHJpbmcgeworCisgIC8qKgorICAgKiBCQVA5NS4gTGV0IEZuIGJlIHRoZSBudGggRmlib25hY2NpIG51bWJlci4gQSB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9IG9mCisgICAqIGRlcHRoIG4gaXMgImJhbGFuY2VkIiwgaS5lIGZsYXQgZW5vdWdoLCBpZiBpdHMgbGVuZ3RoIGlzIGF0IGxlYXN0IEZuKzIsCisgICAqIGUuZy4gYSAiYmFsYW5jZWQiIHtAbGluayBSb3BlQnl0ZVN0cmluZ30gb2YgZGVwdGggMSBtdXN0IGhhdmUgbGVuZ3RoIGF0CisgICAqIGxlYXN0IDIsIG9mIGRlcHRoIDQgbXVzdCBoYXZlIGxlbmd0aCA+PSA4LCBldGMuCisgICAqCisgICAqIDxwPlRoZXJlJ3Mgbm90aGluZyBzcGVjaWFsIGFib3V0IHVzaW5nIHRoZSBGaWJvbmFjY2kgbnVtYmVycyBmb3IgdGhpcywgYnV0CisgICAqIHRoZXkgYXJlIGEgcmVhc29uYWJsZSBzZXF1ZW5jZSBmb3IgZW5jYXBzdWxhdGluZyB0aGUgaWRlYSB0aGF0IHdlIGFyZSBPSworICAgKiB3aXRoIGxvbmdlciBzdHJpbmdzIGJlaW5nIGVuY29kZWQgaW4gZGVlcGVyIGJpbmFyeSB0cmVlcy4KKyAgICoKKyAgICogPHA+Rm9yIDMyLWJpdCBpbnRlZ2VycywgdGhpcyBhcnJheSBoYXMgbGVuZ3RoIDQ2LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gbWluTGVuZ3RoQnlEZXB0aDsKKworICBzdGF0aWMgeworICAgIC8vIER5bmFtaWNhbGx5IGdlbmVyYXRlIHRoZSBsaXN0IG9mIEZpYm9uYWNjaSBudW1iZXJzIHRoZSBmaXJzdCB0aW1lIHRoaXMKKyAgICAvLyBjbGFzcyBpcyBhY2Nlc3NlZC4KKyAgICBMaXN0PEludGVnZXI+IG51bWJlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKyAgICAvLyB3ZSBza2lwIHRoZSBmaXJzdCBGaWJvbmFjY2kgbnVtYmVyICgxKS4gIFNvIGluc3RlYWQgb2Y6IDEgMSAyIDMgNSA4IC4uLgorICAgIC8vIHdlIGhhdmU6IDEgMiAzIDUgOCAuLi4KKyAgICBpbnQgZjEgPSAxOworICAgIGludCBmMiA9IDE7CisKKyAgICAvLyBnZXQgYWxsIHRoZSB2YWx1ZXMgdW50aWwgd2Ugcm9sbCBvdmVyLgorICAgIHdoaWxlIChmMiA+IDApIHsKKyAgICAgIG51bWJlcnMuYWRkKGYyKTsKKyAgICAgIGludCB0ZW1wID0gZjEgKyBmMjsKKyAgICAgIGYxID0gZjI7CisgICAgICBmMiA9IHRlbXA7CisgICAgfQorCisgICAgLy8gd2UgaW5jbHVkZSB0aGlzIGhlcmUgc28gdGhhdCB3ZSBjYW4gaW5kZXggdGhpcyBhcnJheSB0byBbeCArIDFdIGluIHRoZQorICAgIC8vIGxvb3BzIGJlbG93LgorICAgIG51bWJlcnMuYWRkKEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICBtaW5MZW5ndGhCeURlcHRoID0gbmV3IGludFtudW1iZXJzLnNpemUoKV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5MZW5ndGhCeURlcHRoLmxlbmd0aDsgaSsrKSB7CisgICAgICAvLyB1bmJveCBhbGwgdGhlIHZhbHVlcworICAgICAgbWluTGVuZ3RoQnlEZXB0aFtpXSA9IG51bWJlcnMuZ2V0KGkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgaW50IHRvdGFsTGVuZ3RoOworICBwcml2YXRlIGZpbmFsIEJ5dGVTdHJpbmcgbGVmdDsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlU3RyaW5nIHJpZ2h0OworICBwcml2YXRlIGZpbmFsIGludCBsZWZ0TGVuZ3RoOworICBwcml2YXRlIGZpbmFsIGludCB0cmVlRGVwdGg7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBSb3BlQnl0ZVN0cmluZywgd2hpY2ggY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBuZXcgdHJlZSBub2RlLCBieQorICAgKiByZWNvcmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgdHdvIGdpdmVuIHN0cmluZ3MuCisgICAqCisgICAqIEBwYXJhbSBsZWZ0ICBzdHJpbmcgb24gdGhlIGxlZnQgb2YgdGhpcyBub2RlLCBzaG91bGQgaGF2ZSB7QGNvZGUgc2l6ZSgpID4KKyAgICogICAgICAgICAgICAgIDB9CisgICAqIEBwYXJhbSByaWdodCBzdHJpbmcgb24gdGhlIHJpZ2h0IG9mIHRoaXMgbm9kZSwgc2hvdWxkIGhhdmUge0Bjb2RlIHNpemUoKSA+CisgICAqICAgICAgICAgICAgICAwfQorICAgKi8KKyAgcHJpdmF0ZSBSb3BlQnl0ZVN0cmluZyhCeXRlU3RyaW5nIGxlZnQsIEJ5dGVTdHJpbmcgcmlnaHQpIHsKKyAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgIHRoaXMucmlnaHQgPSByaWdodDsKKyAgICBsZWZ0TGVuZ3RoID0gbGVmdC5zaXplKCk7CisgICAgdG90YWxMZW5ndGggPSBsZWZ0TGVuZ3RoICsgcmlnaHQuc2l6ZSgpOworICAgIHRyZWVEZXB0aCA9IE1hdGgubWF4KGxlZnQuZ2V0VHJlZURlcHRoKCksIHJpZ2h0LmdldFRyZWVEZXB0aCgpKSArIDE7CisgIH0KKworICAvKioKKyAgICogQ29uY2F0ZW5hdGUgdGhlIGdpdmVuIHN0cmluZ3Mgd2hpbGUgcGVyZm9ybWluZyB2YXJpb3VzIG9wdGltaXphdGlvbnMgdG8KKyAgICogc2xvdyB0aGUgZ3Jvd3RoIHJhdGUgb2YgdHJlZSBkZXB0aCBhbmQgdHJlZSBub2RlIGNvdW50LiBUaGUgcmVzdWx0IGlzCisgICAqIGVpdGhlciBhIHtAbGluayBMaXRlcmFsQnl0ZVN0cmluZ30gb3IgYSB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9CisgICAqIGRlcGVuZGluZyBvbiB3aGljaCBvcHRpbWl6YXRpb25zLCBpZiBhbnksIHdlcmUgYXBwbGllZC4KKyAgICoKKyAgICogPHA+U21hbGwgcGllY2VzIG9mIGxlbmd0aCBsZXNzIHRoYW4ge0BsaW5rCisgICAqIEJ5dGVTdHJpbmcjQ09OQ0FURU5BVEVfQllfQ09QWV9TSVpFfSBtYXkgYmUgY29waWVkIGJ5IHZhbHVlIGhlcmUsIGFzIGluCisgICAqIEJBUDk1LiAgTGFyZ2UgcGllY2VzIGFyZSByZWZlcmVuY2VkIHdpdGhvdXQgY29weS4KKyAgICoKKyAgICogQHBhcmFtIGxlZnQgIHN0cmluZyBvbiB0aGUgbGVmdAorICAgKiBAcGFyYW0gcmlnaHQgc3RyaW5nIG9uIHRoZSByaWdodAorICAgKiBAcmV0dXJuIGNvbmNhdGVuYXRpb24gcmVwcmVzZW50aW5nIHRoZSBzYW1lIHNlcXVlbmNlIGFzIHRoZSBnaXZlbiBzdHJpbmdzCisgICAqLworICBzdGF0aWMgQnl0ZVN0cmluZyBjb25jYXRlbmF0ZShCeXRlU3RyaW5nIGxlZnQsIEJ5dGVTdHJpbmcgcmlnaHQpIHsKKyAgICBCeXRlU3RyaW5nIHJlc3VsdDsKKyAgICBSb3BlQnl0ZVN0cmluZyBsZWZ0Um9wZSA9CisgICAgICAgIChsZWZ0IGluc3RhbmNlb2YgUm9wZUJ5dGVTdHJpbmcpID8gKFJvcGVCeXRlU3RyaW5nKSBsZWZ0IDogbnVsbDsKKyAgICBpZiAocmlnaHQuc2l6ZSgpID09IDApIHsKKyAgICAgIHJlc3VsdCA9IGxlZnQ7CisgICAgfSBlbHNlIGlmIChsZWZ0LnNpemUoKSA9PSAwKSB7CisgICAgICByZXN1bHQgPSByaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG5ld0xlbmd0aCA9IGxlZnQuc2l6ZSgpICsgcmlnaHQuc2l6ZSgpOworICAgICAgaWYgKG5ld0xlbmd0aCA8IEJ5dGVTdHJpbmcuQ09OQ0FURU5BVEVfQllfQ09QWV9TSVpFKSB7CisgICAgICAgIC8vIE9wdGltaXphdGlvbiBmcm9tIEJBUDk1OiBGb3Igc2hvcnQgKGxlYXZlcyBpbiBwYXBlciwgYnV0IGp1c3Qgc2hvcnQKKyAgICAgICAgLy8gaGVyZSkgdG90YWwgbGVuZ3RoLCBkbyBhIGNvcHkgb2YgZGF0YSB0byBhIG5ldyBsZWFmLgorICAgICAgICByZXN1bHQgPSBjb25jYXRlbmF0ZUJ5dGVzKGxlZnQsIHJpZ2h0KTsKKyAgICAgIH0gZWxzZSBpZiAobGVmdFJvcGUgIT0gbnVsbAorICAgICAgICAgICYmIGxlZnRSb3BlLnJpZ2h0LnNpemUoKSArIHJpZ2h0LnNpemUoKSA8IENPTkNBVEVOQVRFX0JZX0NPUFlfU0laRSkgeworICAgICAgICAvLyBPcHRpbWl6YXRpb24gZnJvbSBCQVA5NTogQXMgYW4gb3B0aW1pemF0aW9uIG9mIHRoZSBjYXNlIHdoZXJlIHRoZQorICAgICAgICAvLyBCeXRlU3RyaW5nIGlzIGNvbnN0cnVjdGVkIGJ5IHJlcGVhdGVkIGNvbmNhdGVuYXRlLCByZWNvZ25pemUgdGhlIGNhc2UKKyAgICAgICAgLy8gd2hlcmUgYSBzaG9ydCBzdHJpbmcgaXMgY29uY2F0ZW5hdGVkIHRvIGEgbGVmdC1oYW5kIG5vZGUgd2hvc2UKKyAgICAgICAgLy8gcmlnaHQtaGFuZCBicmFuY2ggaXMgc2hvcnQuICBJbiB0aGUgcGFwZXIgdGhpcyBhcHBsaWVzIHRvIGxlYXZlcywgYnV0CisgICAgICAgIC8vIHdlIGp1c3QgbG9vayBhdCB0aGUgbGVuZ3RoIGhlcmUuIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2Ygc2hlZGRpbmcKKyAgICAgICAgLy8gcmVmZXJlbmNlcyB0byB1bm5lZWRlZCBkYXRhIHdoZW4gc3Vic3RyaW5ncyBoYXZlIGJlZW4gdGFrZW4uCisgICAgICAgIC8vCisgICAgICAgIC8vIFdoZW4gd2UgcmVjb2duaXplIHRoaXMgY2FzZSwgd2UgZG8gYSBjb3B5IG9mIHRoZSBkYXRhIGFuZCBjcmVhdGUgYQorICAgICAgICAvLyBuZXcgcGFyZW50IG5vZGUgc28gdGhhdCB0aGUgZGVwdGggb2YgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAgICAgLy8gZ2l2ZW4gbGVmdCB0cmVlLgorICAgICAgICBCeXRlU3RyaW5nIG5ld1JpZ2h0ID0gY29uY2F0ZW5hdGVCeXRlcyhsZWZ0Um9wZS5yaWdodCwgcmlnaHQpOworICAgICAgICByZXN1bHQgPSBuZXcgUm9wZUJ5dGVTdHJpbmcobGVmdFJvcGUubGVmdCwgbmV3UmlnaHQpOworICAgICAgfSBlbHNlIGlmIChsZWZ0Um9wZSAhPSBudWxsCisgICAgICAgICAgJiYgbGVmdFJvcGUubGVmdC5nZXRUcmVlRGVwdGgoKSA+IGxlZnRSb3BlLnJpZ2h0LmdldFRyZWVEZXB0aCgpCisgICAgICAgICAgJiYgbGVmdFJvcGUuZ2V0VHJlZURlcHRoKCkgPiByaWdodC5nZXRUcmVlRGVwdGgoKSkgeworICAgICAgICAvLyBUeXBpY2FsbHkgZm9yIGNvbmNhdGVuYXRlLWJ1aWx0IHN0cmluZ3MgdGhlIGxlZnQtc2lkZSBpcyBkZWVwZXIgdGhhbgorICAgICAgICAvLyB0aGUgcmlnaHQuICBUaGlzIGlzIG91ciBmaW5hbCBhdHRlbXB0IHRvIGNvbmNhdGVuYXRlIHdpdGhvdXQKKyAgICAgICAgLy8gaW5jcmVhc2luZyB0aGUgdHJlZSBkZXB0aC4gIFdlJ2xsIHJlZG8gdGhlIHRoZSBub2RlIG9uIHRoZSBSSFMuICBUaGlzCisgICAgICAgIC8vIGlzIHlldCBhbm90aGVyIG9wdGltaXphdGlvbiBmb3IgYnVpbGRpbmcgdGhlIHN0cmluZyBieSByZXBlYXRlZGx5CisgICAgICAgIC8vIGNvbmNhdGVuYXRpbmcgb24gdGhlIHJpZ2h0LgorICAgICAgICBCeXRlU3RyaW5nIG5ld1JpZ2h0ID0gbmV3IFJvcGVCeXRlU3RyaW5nKGxlZnRSb3BlLnJpZ2h0LCByaWdodCk7CisgICAgICAgIHJlc3VsdCA9IG5ldyBSb3BlQnl0ZVN0cmluZyhsZWZ0Um9wZS5sZWZ0LCBuZXdSaWdodCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBGaW5lLCB3ZSdsbCBhZGQgYSBub2RlIGFuZCBpbmNyZWFzZSB0aGUgdHJlZSBkZXB0aC0tdW5sZXNzIHdlCisgICAgICAgIC8vIHJlYmFsYW5jZSA7XikKKyAgICAgICAgaW50IG5ld0RlcHRoID0gTWF0aC5tYXgobGVmdC5nZXRUcmVlRGVwdGgoKSwgcmlnaHQuZ2V0VHJlZURlcHRoKCkpICsgMTsKKyAgICAgICAgaWYgKG5ld0xlbmd0aCA+PSBtaW5MZW5ndGhCeURlcHRoW25ld0RlcHRoXSkgeworICAgICAgICAgIC8vIFRoZSB0cmVlIGlzIHNoYWxsb3cgZW5vdWdoLCBzbyBkb24ndCByZWJhbGFuY2UKKyAgICAgICAgICByZXN1bHQgPSBuZXcgUm9wZUJ5dGVTdHJpbmcobGVmdCwgcmlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdCA9IG5ldyBCYWxhbmNlcigpLmJhbGFuY2UobGVmdCwgcmlnaHQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQ29uY2F0ZW5hdGVzIHR3byBzdHJpbmdzIGJ5IGNvcHlpbmcgZGF0YSB2YWx1ZXMuIFRoaXMgaXMgY2FsbGVkIGluIGEgZmV3CisgICAqIGNhc2VzIGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgZ3Jvd3RoIG9mIHRoZSBudW1iZXIgb2YgdHJlZSBub2Rlcy4KKyAgICoKKyAgICogQHBhcmFtIGxlZnQgIHN0cmluZyBvbiB0aGUgbGVmdAorICAgKiBAcGFyYW0gcmlnaHQgc3RyaW5nIG9uIHRoZSByaWdodAorICAgKiBAcmV0dXJuIHN0cmluZyBmb3JtZWQgYnkgY29weWluZyBkYXRhIGJ5dGVzCisgICAqLworICBwcml2YXRlIHN0YXRpYyBMaXRlcmFsQnl0ZVN0cmluZyBjb25jYXRlbmF0ZUJ5dGVzKEJ5dGVTdHJpbmcgbGVmdCwKKyAgICAgIEJ5dGVTdHJpbmcgcmlnaHQpIHsKKyAgICBpbnQgbGVmdFNpemUgPSBsZWZ0LnNpemUoKTsKKyAgICBpbnQgcmlnaHRTaXplID0gcmlnaHQuc2l6ZSgpOworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlZnRTaXplICsgcmlnaHRTaXplXTsKKyAgICBsZWZ0LmNvcHlUbyhieXRlcywgMCwgMCwgbGVmdFNpemUpOworICAgIHJpZ2h0LmNvcHlUbyhieXRlcywgMCwgbGVmdFNpemUsIHJpZ2h0U2l6ZSk7CisgICAgcmV0dXJuIG5ldyBMaXRlcmFsQnl0ZVN0cmluZyhieXRlcyk7ICAvLyBDb25zdHJ1Y3RvciB3cmFwcyBieXRlcworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBSb3BlQnl0ZVN0cmluZyBmb3IgdGVzdGluZyBvbmx5IHdoaWxlIGJ5cGFzc2luZyBhbGwgdGhlCisgICAqIGRlZmVuc2VzIG9mIHtAbGluayAjY29uY2F0ZW5hdGUoQnl0ZVN0cmluZywgQnl0ZVN0cmluZyl9LiBUaGlzIGFsbG93cworICAgKiB0ZXN0aW5nIHRyZWVzIG9mIHNwZWNpZmljIHN0cnVjdHVyZS4gV2UgYXJlIGFsc28gYWJsZSB0byBpbnNlcnQgZW1wdHkKKyAgICogbGVhdmVzLCB0aG91Z2ggdGhlc2UgYXJlIGRpcy1hbGxvd2VkLCBzbyB0aGF0IHdlIGNhbiBtYWtlIHN1cmUgdGhlCisgICAqIGltcGxlbWVudGF0aW9uIGNhbiB3aXRoc3RhbmQgdGhlaXIgcHJlc2VuY2UuCisgICAqCisgICAqIEBwYXJhbSBsZWZ0ICBzdHJpbmcgb24gdGhlIGxlZnQgb2YgdGhpcyBub2RlCisgICAqIEBwYXJhbSByaWdodCBzdHJpbmcgb24gdGhlIHJpZ2h0IG9mIHRoaXMgbm9kZQorICAgKiBAcmV0dXJuIGFuIHVuc2FmZSBpbnN0YW5jZSBmb3IgdGVzdGluZyBvbmx5CisgICAqLworICBzdGF0aWMgUm9wZUJ5dGVTdHJpbmcgbmV3SW5zdGFuY2VGb3JUZXN0KEJ5dGVTdHJpbmcgbGVmdCwgQnl0ZVN0cmluZyByaWdodCkgeworICAgIHJldHVybiBuZXcgUm9wZUJ5dGVTdHJpbmcobGVmdCwgcmlnaHQpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgKiBUaHJvd3Mge0BsaW5rIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0gZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5CisgICAqIHJlYXNvbnMgYWx0aG91Z2ggaXQgd291bGQgbW9yZSBwcm9wZXJseSBiZSB7QGxpbmsKKyAgICogSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0uCisgICAqCisgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiBieXRlCisgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHtAY29kZSBpbmRleH0gaXMgPCAwIG9yID49IHNpemUKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZSBieXRlQXQoaW50IGluZGV4KSB7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXggPCAwOiAiICsgaW5kZXgpOworICAgIH0KKyAgICBpZiAoaW5kZXggPiB0b3RhbExlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKKyAgICAgICAgICAiSW5kZXggPiBsZW5ndGg6ICIgKyBpbmRleCArICIsICIgKyB0b3RhbExlbmd0aCk7CisgICAgfQorCisgICAgYnl0ZSByZXN1bHQ7CisgICAgLy8gRmluZCB0aGUgcmVsZXZhbnQgcGllY2UgYnkgcmVjdXJzaXZlIGRlc2NlbnQKKyAgICBpZiAoaW5kZXggPCBsZWZ0TGVuZ3RoKSB7CisgICAgICByZXN1bHQgPSBsZWZ0LmJ5dGVBdChpbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IHJpZ2h0LmJ5dGVBdChpbmRleCAtIGxlZnRMZW5ndGgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICByZXR1cm4gdG90YWxMZW5ndGg7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBQaWVjZXMKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGludCBnZXRUcmVlRGVwdGgoKSB7CisgICAgcmV0dXJuIHRyZWVEZXB0aDsKKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB0cmVlIGlzIGJhbGFuY2VkIGFjY29yZGluZyB0byBCQVA5NSwgd2hpY2ggbWVhbnMgdGhlIHRyZWUKKyAgICogaXMgZmxhdC1lbm91Z2ggd2l0aCByZXNwZWN0IHRvIHRoZSBib3VuZHMuIE5vdGUgdGhhdCB0aGlzIGRlZmluaXRpb24gb2YKKyAgICogYmFsYW5jZWQgaXMgb25lIHdoZXJlIHN1Yi10cmVlcyBvZiBiYWxhbmNlZCB0cmVlcyBhcmUgbm90IG5lY2Vzc2FyaWx5CisgICAqIGJhbGFuY2VkLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyZWUgaXMgYmFsYW5jZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0JhbGFuY2VkKCkgeworICAgIHJldHVybiB0b3RhbExlbmd0aCA+PSBtaW5MZW5ndGhCeURlcHRoW3RyZWVEZXB0aF07CisgIH0KKworICAvKioKKyAgICogVGFrZXMgYSBzdWJzdHJpbmcgb2YgdGhpcyBvbmUuIFRoaXMgaW52b2x2ZXMgcmVjdXJzaXZlIGRlc2NlbnQgYWxvbmcgdGhlCisgICAqIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSBzdWJzdHJpbmcsIGFuZCByZWZlcmVuY2luZyBhbnkgd2hvbGx5IGNvbnRhaW5lZAorICAgKiBzZWdtZW50cyBpbiBiZXR3ZWVuLiBBbnkgbGVhZiBub2RlcyBlbnRpcmVseSB1bmludm9sdmVkIGluIHRoZSBzdWJzdHJpbmcKKyAgICogd2lsbCBub3QgYmUgcmVmZXJlbmNlZCBieSB0aGUgc3Vic3RyaW5nLgorICAgKgorICAgKiA8cD5TdWJzdHJpbmdzIG9mIHtAY29kZSBsZW5ndGggPCAyfSBzaG91bGQgcmVzdWx0IGluIGF0IG1vc3QgYSBzaW5nbGUKKyAgICogcmVjdXJzaXZlIGNhbGwgY2hhaW4sIHRlcm1pbmF0aW5nIGF0IGEgbGVhZiBub2RlLiBUaHVzIHRoZSByZXN1bHQgd2lsbCBiZSBhCisgICAqIHtAbGluayBMaXRlcmFsQnl0ZVN0cmluZ30uIHtAbGluayAjUm9wZUJ5dGVTdHJpbmcoQnl0ZVN0cmluZywKKyAgICogQnl0ZVN0cmluZyl9LgorICAgKgorICAgKiBAcGFyYW0gYmVnaW5JbmRleCBzdGFydCBhdCB0aGlzIGluZGV4CisgICAqIEBwYXJhbSBlbmRJbmRleCAgIHRoZSBsYXN0IGNoYXJhY3RlciBpcyB0aGUgb25lIGJlZm9yZSB0aGlzIGluZGV4CisgICAqIEByZXR1cm4gc3Vic3RyaW5nIGxlYWYgbm9kZSBvciB0cmVlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIEJ5dGVTdHJpbmcgc3Vic3RyaW5nKGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgpIHsKKyAgICBpZiAoYmVnaW5JbmRleCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAorICAgICAgICAgICJCZWdpbm5pbmcgaW5kZXg6ICIgKyBiZWdpbkluZGV4ICsgIiA8IDAiKTsKKyAgICB9CisgICAgaWYgKGVuZEluZGV4ID4gdG90YWxMZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAorICAgICAgICAgICJFbmQgaW5kZXg6ICIgKyBlbmRJbmRleCArICIgPiAiICsgdG90YWxMZW5ndGgpOworICAgIH0KKyAgICBpbnQgc3Vic3RyaW5nTGVuZ3RoID0gZW5kSW5kZXggLSBiZWdpbkluZGV4OworICAgIGlmIChzdWJzdHJpbmdMZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKKyAgICAgICAgICAiQmVnaW5uaW5nIGluZGV4IGxhcmdlciB0aGFuIGVuZGluZyBpbmRleDogIiArIGJlZ2luSW5kZXggKyAiLCAiCisgICAgICAgICAgICAgICsgZW5kSW5kZXgpOworICAgIH0KKworICAgIEJ5dGVTdHJpbmcgcmVzdWx0OworICAgIGlmIChzdWJzdHJpbmdMZW5ndGggPT0gMCkgeworICAgICAgLy8gRW1wdHkgc3Vic3RyaW5nCisgICAgICByZXN1bHQgPSBCeXRlU3RyaW5nLkVNUFRZOworICAgIH0gZWxzZSBpZiAoc3Vic3RyaW5nTGVuZ3RoID09IHRvdGFsTGVuZ3RoKSB7CisgICAgICAvLyBUaGUgd2hvbGUgc3RyaW5nCisgICAgICByZXN1bHQgPSB0aGlzOworICAgIH0gZWxzZSB7CisgICAgICAvLyBQcm9wZXIgc3Vic3RyaW5nCisgICAgICBpZiAoZW5kSW5kZXggPD0gbGVmdExlbmd0aCkgeworICAgICAgICAvLyBTdWJzdHJpbmcgb24gdGhlIGxlZnQKKyAgICAgICAgcmVzdWx0ID0gbGVmdC5zdWJzdHJpbmcoYmVnaW5JbmRleCwgZW5kSW5kZXgpOworICAgICAgfSBlbHNlIGlmIChiZWdpbkluZGV4ID49IGxlZnRMZW5ndGgpIHsKKyAgICAgICAgLy8gU3Vic3RyaW5nIG9uIHRoZSByaWdodAorICAgICAgICByZXN1bHQgPSByaWdodAorICAgICAgICAgICAgLnN1YnN0cmluZyhiZWdpbkluZGV4IC0gbGVmdExlbmd0aCwgZW5kSW5kZXggLSBsZWZ0TGVuZ3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNwbGl0IHN1YnN0cmluZworICAgICAgICBCeXRlU3RyaW5nIGxlZnRTdWIgPSBsZWZ0LnN1YnN0cmluZyhiZWdpbkluZGV4KTsKKyAgICAgICAgQnl0ZVN0cmluZyByaWdodFN1YiA9IHJpZ2h0LnN1YnN0cmluZygwLCBlbmRJbmRleCAtIGxlZnRMZW5ndGgpOworICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCByZWJhbGFuY2luZywgc2luY2UgaW4gbWFueSBjYXNlcyB0aGVzZSB0d28KKyAgICAgICAgLy8gc3Vic3RyaW5ncyB3aWxsIGFscmVhZHkgYmUgbGVzcyBkZWVwIHRoYW4gdGhlIHRvcC1sZXZlbAorICAgICAgICAvLyBSb3BlQnl0ZVN0cmluZyB3ZSdyZSB0YWtpbmcgYSBzdWJzdHJpbmcgb2YuCisgICAgICAgIHJlc3VsdCA9IG5ldyBSb3BlQnl0ZVN0cmluZyhsZWZ0U3ViLCByaWdodFN1Yik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBCeXRlU3RyaW5nIC0+IGJ5dGVbXQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb3B5VG9JbnRlcm5hbChieXRlW10gdGFyZ2V0LCBpbnQgc291cmNlT2Zmc2V0LAorICAgICAgaW50IHRhcmdldE9mZnNldCwgaW50IG51bWJlclRvQ29weSkgeworICAgaWYgKHNvdXJjZU9mZnNldCArIG51bWJlclRvQ29weSA8PSBsZWZ0TGVuZ3RoKSB7CisgICAgICBsZWZ0LmNvcHlUb0ludGVybmFsKHRhcmdldCwgc291cmNlT2Zmc2V0LCB0YXJnZXRPZmZzZXQsIG51bWJlclRvQ29weSk7CisgICAgfSBlbHNlIGlmIChzb3VyY2VPZmZzZXQgPj0gbGVmdExlbmd0aCkgeworICAgICAgcmlnaHQuY29weVRvSW50ZXJuYWwodGFyZ2V0LCBzb3VyY2VPZmZzZXQgLSBsZWZ0TGVuZ3RoLCB0YXJnZXRPZmZzZXQsCisgICAgICAgICAgbnVtYmVyVG9Db3B5KTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGxlZnRMZW5ndGggPSB0aGlzLmxlZnRMZW5ndGggLSBzb3VyY2VPZmZzZXQ7CisgICAgICBsZWZ0LmNvcHlUb0ludGVybmFsKHRhcmdldCwgc291cmNlT2Zmc2V0LCB0YXJnZXRPZmZzZXQsIGxlZnRMZW5ndGgpOworICAgICAgcmlnaHQuY29weVRvSW50ZXJuYWwodGFyZ2V0LCAwLCB0YXJnZXRPZmZzZXQgKyBsZWZ0TGVuZ3RoLAorICAgICAgICAgIG51bWJlclRvQ29weSAtIGxlZnRMZW5ndGgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjb3B5VG8oQnl0ZUJ1ZmZlciB0YXJnZXQpIHsKKyAgICBsZWZ0LmNvcHlUbyh0YXJnZXQpOworICAgIHJpZ2h0LmNvcHlUbyh0YXJnZXQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCeXRlQnVmZmVyIGFzUmVhZE9ubHlCeXRlQnVmZmVyKCkgeworICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcCh0b0J5dGVBcnJheSgpKTsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlci5hc1JlYWRPbmx5QnVmZmVyKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gYXNSZWFkT25seUJ5dGVCdWZmZXJMaXN0KCkgeworICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgbGlzdCBvZiBMaXRlcmFsQnl0ZVN0cmluZydzIHRoYXQgbWFrZSB1cCB0aGlzCisgICAgLy8gcm9wZSwgYW5kIGFkZCBlYWNoIG9uZSBhcyBhIHJlYWQtb25seSBCeXRlQnVmZmVyLgorICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCeXRlQnVmZmVyPigpOworICAgIFBpZWNlSXRlcmF0b3IgcGllY2VzID0gbmV3IFBpZWNlSXRlcmF0b3IodGhpcyk7CisgICAgd2hpbGUgKHBpZWNlcy5oYXNOZXh0KCkpIHsKKyAgICAgIExpdGVyYWxCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBwaWVjZXMubmV4dCgpOworICAgICAgcmVzdWx0LmFkZChieXRlU3RyaW5nLmFzUmVhZE9ubHlCeXRlQnVmZmVyKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBsZWZ0LndyaXRlVG8ob3V0cHV0U3RyZWFtKTsKKyAgICByaWdodC53cml0ZVRvKG91dHB1dFN0cmVhbSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgY2hhcnNldE5hbWUpCisgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcodG9CeXRlQXJyYXkoKSwgY2hhcnNldE5hbWUpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gVVRGLTggZGVjb2RpbmcKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFV0ZjgoKSB7CisgICAgaW50IGxlZnRQYXJ0aWFsID0gbGVmdC5wYXJ0aWFsSXNWYWxpZFV0ZjgoVXRmOC5DT01QTEVURSwgMCwgbGVmdExlbmd0aCk7CisgICAgaW50IHN0YXRlID0gcmlnaHQucGFydGlhbElzVmFsaWRVdGY4KGxlZnRQYXJ0aWFsLCAwLCByaWdodC5zaXplKCkpOworICAgIHJldHVybiBzdGF0ZSA9PSBVdGY4LkNPTVBMRVRFOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBpbnQgcGFydGlhbElzVmFsaWRVdGY4KGludCBzdGF0ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGludCB0b0luZGV4ID0gb2Zmc2V0ICsgbGVuZ3RoOworICAgIGlmICh0b0luZGV4IDw9IGxlZnRMZW5ndGgpIHsKKyAgICAgIHJldHVybiBsZWZ0LnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID49IGxlZnRMZW5ndGgpIHsKKyAgICAgIHJldHVybiByaWdodC5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUsIG9mZnNldCAtIGxlZnRMZW5ndGgsIGxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBsZWZ0TGVuZ3RoID0gdGhpcy5sZWZ0TGVuZ3RoIC0gb2Zmc2V0OworICAgICAgaW50IGxlZnRQYXJ0aWFsID0gbGVmdC5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUsIG9mZnNldCwgbGVmdExlbmd0aCk7CisgICAgICByZXR1cm4gcmlnaHQucGFydGlhbElzVmFsaWRVdGY4KGxlZnRQYXJ0aWFsLCAwLCBsZW5ndGggLSBsZWZ0TGVuZ3RoKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnl0ZVN0cmluZyBvdGhlckJ5dGVTdHJpbmcgPSAoQnl0ZVN0cmluZykgb3RoZXI7CisgICAgaWYgKHRvdGFsTGVuZ3RoICE9IG90aGVyQnl0ZVN0cmluZy5zaXplKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHRvdGFsTGVuZ3RoID09IDApIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFlvdSBkb24ndCByZWFsbHkgd2FudCB0byBiZSBjYWxsaW5nIGVxdWFscyBvbiBsb25nIHN0cmluZ3MsIGJ1dCBzaW5jZQorICAgIC8vIHdlIGNhY2hlIHRoZSBoYXNoQ29kZSwgd2UgZWZmZWN0aXZlbHkgY2FjaGUgaW5lcXVhbGl0eS4gV2UgdXNlIHRoZSBjYWNoZWQKKyAgICAvLyBoYXNoQ29kZSBpZiBpdCdzIGFscmVhZHkgY29tcHV0ZWQuICBJdCdzIGFyZ3VhYmxlIHdlIHNob3VsZCBjb21wdXRlIHRoZQorICAgIC8vIGhhc2hDb2RlIGhlcmUsIGFuZCBpZiB3ZSdyZSBnb2luZyB0byBiZSB0ZXN0aW5nIGEgYnVuY2ggb2YgYnl0ZVN0cmluZ3MsCisgICAgLy8gaXQgbWlnaHQgZXZlbiBtYWtlIHNlbnNlLgorICAgIGlmIChoYXNoICE9IDApIHsKKyAgICAgIGludCBjYWNoZWRPdGhlckhhc2ggPSBvdGhlckJ5dGVTdHJpbmcucGVla0NhY2hlZEhhc2hDb2RlKCk7CisgICAgICBpZiAoY2FjaGVkT3RoZXJIYXNoICE9IDAgJiYgaGFzaCAhPSBjYWNoZWRPdGhlckhhc2gpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcXVhbHNGcmFnbWVudHMob3RoZXJCeXRlU3RyaW5nKTsKKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgc3RyaW5nIGlzIGVxdWFsIHRvIGFub3RoZXIgb2YgdGhlIHNhbWUgbGVuZ3RoIGJ5CisgICAqIGl0ZXJhdGluZyBvdmVyIHRoZSBsZWFmIG5vZGVzLiBPbiBlYWNoIHN0ZXAgb2YgdGhlIGl0ZXJhdGlvbiwgdGhlCisgICAqIG92ZXJsYXBwaW5nIHNlZ21lbnRzIG9mIHRoZSBsZWF2ZXMgYXJlIGNvbXBhcmVkLgorICAgKgorICAgKiBAcGFyYW0gb3RoZXIgc3RyaW5nIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGlzIG9uZQorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiB0aGlzIHN0cmluZyBlcXVhbHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbgorICAgKiAgICAgICAgIG9uZQorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIGVxdWFsc0ZyYWdtZW50cyhCeXRlU3RyaW5nIG90aGVyKSB7CisgICAgaW50IHRoaXNPZmZzZXQgPSAwOworICAgIEl0ZXJhdG9yPExpdGVyYWxCeXRlU3RyaW5nPiB0aGlzSXRlciA9IG5ldyBQaWVjZUl0ZXJhdG9yKHRoaXMpOworICAgIExpdGVyYWxCeXRlU3RyaW5nIHRoaXNTdHJpbmcgPSB0aGlzSXRlci5uZXh0KCk7CisKKyAgICBpbnQgdGhhdE9mZnNldCA9IDA7CisgICAgSXRlcmF0b3I8TGl0ZXJhbEJ5dGVTdHJpbmc+IHRoYXRJdGVyID0gbmV3IFBpZWNlSXRlcmF0b3Iob3RoZXIpOworICAgIExpdGVyYWxCeXRlU3RyaW5nIHRoYXRTdHJpbmcgPSB0aGF0SXRlci5uZXh0KCk7CisKKyAgICBpbnQgcG9zID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaW50IHRoaXNSZW1haW5pbmcgPSB0aGlzU3RyaW5nLnNpemUoKSAtIHRoaXNPZmZzZXQ7CisgICAgICBpbnQgdGhhdFJlbWFpbmluZyA9IHRoYXRTdHJpbmcuc2l6ZSgpIC0gdGhhdE9mZnNldDsKKyAgICAgIGludCBieXRlc1RvQ29tcGFyZSA9IE1hdGgubWluKHRoaXNSZW1haW5pbmcsIHRoYXRSZW1haW5pbmcpOworCisgICAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIG9mZnNldHMgd2lsbCBiZSB6ZXJvCisgICAgICBib29sZWFuIHN0aWxsRXF1YWwgPSAodGhpc09mZnNldCA9PSAwKQorICAgICAgICAgID8gdGhpc1N0cmluZy5lcXVhbHNSYW5nZSh0aGF0U3RyaW5nLCB0aGF0T2Zmc2V0LCBieXRlc1RvQ29tcGFyZSkKKyAgICAgICAgICA6IHRoYXRTdHJpbmcuZXF1YWxzUmFuZ2UodGhpc1N0cmluZywgdGhpc09mZnNldCwgYnl0ZXNUb0NvbXBhcmUpOworICAgICAgaWYgKCFzdGlsbEVxdWFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcG9zICs9IGJ5dGVzVG9Db21wYXJlOworICAgICAgaWYgKHBvcyA+PSB0b3RhbExlbmd0aCkgeworICAgICAgICBpZiAocG9zID09IHRvdGFsTGVuZ3RoKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgLy8gV2UgYWx3YXlzIGdldCB0byB0aGUgZW5kIG9mIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGllY2VzCisgICAgICBpZiAoYnl0ZXNUb0NvbXBhcmUgPT0gdGhpc1JlbWFpbmluZykgeyAvLyBJZiByZWFjaGVkIGVuZCBvZiB0aGlzCisgICAgICAgIHRoaXNPZmZzZXQgPSAwOworICAgICAgICB0aGlzU3RyaW5nID0gdGhpc0l0ZXIubmV4dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpc09mZnNldCArPSBieXRlc1RvQ29tcGFyZTsKKyAgICAgIH0KKyAgICAgIGlmIChieXRlc1RvQ29tcGFyZSA9PSB0aGF0UmVtYWluaW5nKSB7IC8vIElmIHJlYWNoZWQgZW5kIG9mIHRoYXQKKyAgICAgICAgdGhhdE9mZnNldCA9IDA7CisgICAgICAgIHRoYXRTdHJpbmcgPSB0aGF0SXRlci5uZXh0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGF0T2Zmc2V0ICs9IGJ5dGVzVG9Db21wYXJlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDYWNoZWQgaGFzaCB2YWx1ZS4gIEludGVudGlvbmFsbHkgYWNjZXNzZWQgdmlhIGEgZGF0YSByYWNlLCB3aGljaCBpcyBzYWZlCisgICAqIGJlY2F1c2Ugb2YgdGhlIEphdmEgTWVtb3J5IE1vZGVsJ3MgIm5vIG91dC1vZi10aGluLWFpciB2YWx1ZXMiIGd1YXJhbnRlZXMKKyAgICogZm9yIGludHMuCisgICAqLworICBwcml2YXRlIGludCBoYXNoID0gMDsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbnQgaCA9IGhhc2g7CisKKyAgICBpZiAoaCA9PSAwKSB7CisgICAgICBoID0gdG90YWxMZW5ndGg7CisgICAgICBoID0gcGFydGlhbEhhc2goaCwgMCwgdG90YWxMZW5ndGgpOworICAgICAgaWYgKGggPT0gMCkgeworICAgICAgICBoID0gMTsKKyAgICAgIH0KKyAgICAgIGhhc2ggPSBoOworICAgIH0KKyAgICByZXR1cm4gaDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgaW50IHBlZWtDYWNoZWRIYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgaW50IHBhcnRpYWxIYXNoKGludCBoLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaW50IHRvSW5kZXggPSBvZmZzZXQgKyBsZW5ndGg7CisgICAgaWYgKHRvSW5kZXggPD0gbGVmdExlbmd0aCkgeworICAgICAgcmV0dXJuIGxlZnQucGFydGlhbEhhc2goaCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID49IGxlZnRMZW5ndGgpIHsKKyAgICAgIHJldHVybiByaWdodC5wYXJ0aWFsSGFzaChoLCBvZmZzZXQgLSBsZWZ0TGVuZ3RoLCBsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbGVmdExlbmd0aCA9IHRoaXMubGVmdExlbmd0aCAtIG9mZnNldDsKKyAgICAgIGludCBsZWZ0UGFydGlhbCA9IGxlZnQucGFydGlhbEhhc2goaCwgb2Zmc2V0LCBsZWZ0TGVuZ3RoKTsKKyAgICAgIHJldHVybiByaWdodC5wYXJ0aWFsSGFzaChsZWZ0UGFydGlhbCwgMCwgbGVuZ3RoIC0gbGVmdExlbmd0aCk7CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gSW5wdXQgc3RyZWFtCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb2RlZElucHV0U3RyZWFtIG5ld0NvZGVkSW5wdXQoKSB7CisgICAgcmV0dXJuIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UobmV3IFJvcGVJbnB1dFN0cmVhbSgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXQoKSB7CisgICAgcmV0dXJuIG5ldyBSb3BlSW5wdXRTdHJlYW0oKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGJhbGFuY2luZyBhbGdvcml0aG0gb2YgQkFQOTUuIEluIHRoZSBwYXBlciB0aGUKKyAgICogYXV0aG9ycyB1c2UgYW4gYXJyYXkgdG8ga2VlcCB0cmFjayBvZiBwaWVjZXMsIHdoaWxlIGhlcmUgd2UgdXNlIGEgc3RhY2suCisgICAqIFRoZSB0cmVlIGlzIGJhbGFuY2VkIGJ5IHRyYXZlcnNpbmcgc3VidHJlZXMgaW4gbGVmdCB0byByaWdodCBvcmRlciwgYW5kIHRoZQorICAgKiBzdGFjayBhbHdheXMgY29udGFpbnMgdGhlIHBhcnQgb2YgdGhlIHN0cmluZyB3ZSd2ZSB0cmF2ZXJzZWQgc28gZmFyLgorICAgKgorICAgKiA8cD5PbmUgc3VycHJpc2luZyBhc3BlY3Qgb2YgdGhlIGFsZ29yaXRobSBpcyB0aGUgcmVzdWx0IG9mIGJhbGFuY2luZyBpcyBub3QKKyAgICogbmVjZXNzYXJpbHkgYmFsYW5jZWQsIHRob3VnaCBpdCBpcyBuZWFybHkgYmFsYW5jZWQuICBGb3IgZGV0YWlscywgc2VlCisgICAqIEJBUDk1LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmFsYW5jZXIgeworICAgIC8vIFN0YWNrIGNvbnRhaW5pbmcgdGhlIHBhcnQgb2YgdGhlIHN0cmluZywgc3RhcnRpbmcgZnJvbSB0aGUgbGVmdCwgdGhhdAorICAgIC8vIHdlJ3ZlIGFscmVhZHkgdHJhdmVyc2VkLiAgVGhlIGZpbmFsIHN0cmluZyBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgb2YKKyAgICAvLyBjb25jYXRlbmF0aW5nIHRoZSBzdHJpbmdzIG9uIHRoZSBzdGFjayBmcm9tIGJvdHRvbSB0byB0b3AuCisgICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxCeXRlU3RyaW5nPiBwcmVmaXhlc1N0YWNrID0gbmV3IFN0YWNrPEJ5dGVTdHJpbmc+KCk7CisKKyAgICBwcml2YXRlIEJ5dGVTdHJpbmcgYmFsYW5jZShCeXRlU3RyaW5nIGxlZnQsIEJ5dGVTdHJpbmcgcmlnaHQpIHsKKyAgICAgIGRvQmFsYW5jZShsZWZ0KTsKKyAgICAgIGRvQmFsYW5jZShyaWdodCk7CisKKyAgICAgIC8vIFN3ZWVwIHN0YWNrIHRvIGdhdGhlciB0aGUgcmVzdWx0CisgICAgICBCeXRlU3RyaW5nIHBhcnRpYWxTdHJpbmcgPSBwcmVmaXhlc1N0YWNrLnBvcCgpOworICAgICAgd2hpbGUgKCFwcmVmaXhlc1N0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICBCeXRlU3RyaW5nIG5ld0xlZnQgPSBwcmVmaXhlc1N0YWNrLnBvcCgpOworICAgICAgICBwYXJ0aWFsU3RyaW5nID0gbmV3IFJvcGVCeXRlU3RyaW5nKG5ld0xlZnQsIHBhcnRpYWxTdHJpbmcpOworICAgICAgfQorICAgICAgLy8gV2Ugc2hvdWxkIGVuZCB1cCB3aXRoIGEgUm9wZUJ5dGVTdHJpbmcgc2luY2UgYXQgYSBtaW5pbXVtIHdlIHdpbGwKKyAgICAgIC8vIGNyZWF0ZSBvbmUgZnJvbSBjb25jYXRlbmF0aW5nIGxlZnQgYW5kIHJpZ2h0CisgICAgICByZXR1cm4gcGFydGlhbFN0cmluZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9CYWxhbmNlKEJ5dGVTdHJpbmcgcm9vdCkgeworICAgICAgLy8gQkFQOTU6IEluc2VydCBiYWxhbmNlZCBzdWJ0cmVlcyB3aG9sZS4gVGhpcyBtZWFucyB0aGUgcmVzdWx0IG1pZ2h0IG5vdAorICAgICAgLy8gYmUgYmFsYW5jZWQsIGxlYWRpbmcgdG8gcmVwZWF0ZWQgcmViYWxhbmNpbmdzIG9uIGNvbmNhdGVuYXRlLiBIb3dldmVyLAorICAgICAgLy8gdGhlc2UgcmViYWxhbmNpbmdzIGFyZSBzaGFsbG93IGR1ZSB0byBpZ25vcmluZyBiYWxhbmNlZCBzdWJ0cmVlcywgYW5kCisgICAgICAvLyByZWxhdGl2ZWx5IGZldyBjYWxscyB0byBpbnNlcnQoKSByZXN1bHQuCisgICAgICBpZiAocm9vdC5pc0JhbGFuY2VkKCkpIHsKKyAgICAgICAgaW5zZXJ0KHJvb3QpOworICAgICAgfSBlbHNlIGlmIChyb290IGluc3RhbmNlb2YgUm9wZUJ5dGVTdHJpbmcpIHsKKyAgICAgICAgUm9wZUJ5dGVTdHJpbmcgcmJzID0gKFJvcGVCeXRlU3RyaW5nKSByb290OworICAgICAgICBkb0JhbGFuY2UocmJzLmxlZnQpOworICAgICAgICBkb0JhbGFuY2UocmJzLnJpZ2h0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiSGFzIGEgbmV3IHR5cGUgb2YgQnl0ZVN0cmluZyBiZWVuIGNyZWF0ZWQ/IEZvdW5kICIgKworICAgICAgICAgICAgICAgIHJvb3QuZ2V0Q2xhc3MoKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVzaCBhIHN0cmluZyBvbiB0aGUgYmFsYW5jZSBzdGFjayAoQkFQOTUpLiAgQkFQOTUgdXNlcyBhbiBhcnJheSBhbmQKKyAgICAgKiBjYWxscyB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5ICdiaW5zJy4gIFdlIGluc3RlYWQgdXNlIGEgc3RhY2ssIHNvIHRoZQorICAgICAqICdiaW5zJyBvZiBsZW5ndGhzIGFyZSByZXByZXNlbnRlZCBieSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBlbGVtZW50cyBvZgorICAgICAqIG1pbkxlbmd0aEJ5RGVwdGguCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgbGVuZ3RoIGJpbiBmb3Igb3VyIHN0cmluZywgYW5kIGFsbCBzaG9ydGVyIGxlbmd0aCBiaW5zLCBhcmUKKyAgICAgKiBlbXB0eSwgd2UganVzdCBwdXNoIGl0IG9uIHRoZSBzdGFjay4gIE90aGVyd2lzZSwgd2UgbmVlZCB0byBzdGFydAorICAgICAqIGNvbmNhdGVuYXRpbmcsIHB1dHRpbmcgdGhlIGdpdmVuIHN0cmluZyBpbiB0aGUgIm1pZGRsZSIgYW5kIGNvbnRpbnVpbmcKKyAgICAgKiB1bnRpbCB3ZSBsYW5kIGluIGFuIGVtcHR5IGxlbmd0aCBiaW4gdGhhdCBtYXRjaGVzIHRoZSBsZW5ndGggb2Ygb3VyCisgICAgICogY29uY2F0ZW5hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU3RyaW5nIHN0cmluZyB0byBwbGFjZSBvbiB0aGUgYmFsYW5jZSBzdGFjaworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnNlcnQoQnl0ZVN0cmluZyBieXRlU3RyaW5nKSB7CisgICAgICBpbnQgZGVwdGhCaW4gPSBnZXREZXB0aEJpbkZvckxlbmd0aChieXRlU3RyaW5nLnNpemUoKSk7CisgICAgICBpbnQgYmluRW5kID0gbWluTGVuZ3RoQnlEZXB0aFtkZXB0aEJpbiArIDFdOworCisgICAgICAvLyBCQVA5NTogQ29uY2F0ZW5hdGUgYWxsIHRyZWVzIG9jY3VweWluZyBiaW5zIHJlcHJlc2VudGluZyB0aGUgbGVuZ3RoIG9mCisgICAgICAvLyBvdXIgbmV3IHBpZWNlIG9yIG9mIHNob3J0ZXIgcGllY2VzLCB0byB0aGUgZXh0ZW50IHRoYXQgaXMgcG9zc2libGUuCisgICAgICAvLyBUaGUgZ29hbCBpcyB0byBjbGVhciB0aGUgYmluIHdoaWNoIG91ciBwaWVjZSBiZWxvbmdzIGluLCBidXQgdGhhdCBtYXkKKyAgICAgIC8vIG5vdCBiZSBlbnRpcmVseSBwb3NzaWJsZSBpZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGxvbmdlciBiaW5zIG9jY3VwaWVkLgorICAgICAgaWYgKHByZWZpeGVzU3RhY2suaXNFbXB0eSgpIHx8IHByZWZpeGVzU3RhY2sucGVlaygpLnNpemUoKSA+PSBiaW5FbmQpIHsKKyAgICAgICAgcHJlZml4ZXNTdGFjay5wdXNoKGJ5dGVTdHJpbmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJpblN0YXJ0ID0gbWluTGVuZ3RoQnlEZXB0aFtkZXB0aEJpbl07CisKKyAgICAgICAgLy8gQ29uY2F0ZW5hdGUgdGhlIHN1YnRyZWVzIG9mIHNob3J0ZXIgbGVuZ3RoCisgICAgICAgIEJ5dGVTdHJpbmcgbmV3VHJlZSA9IHByZWZpeGVzU3RhY2sucG9wKCk7CisgICAgICAgIHdoaWxlICghcHJlZml4ZXNTdGFjay5pc0VtcHR5KCkKKyAgICAgICAgICAgICYmIHByZWZpeGVzU3RhY2sucGVlaygpLnNpemUoKSA8IGJpblN0YXJ0KSB7CisgICAgICAgICAgQnl0ZVN0cmluZyBsZWZ0ID0gcHJlZml4ZXNTdGFjay5wb3AoKTsKKyAgICAgICAgICBuZXdUcmVlID0gbmV3IFJvcGVCeXRlU3RyaW5nKGxlZnQsIG5ld1RyZWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29uY2F0ZW5hdGUgdGhlIGdpdmVuIHN0cmluZworICAgICAgICBuZXdUcmVlID0gbmV3IFJvcGVCeXRlU3RyaW5nKG5ld1RyZWUsIGJ5dGVTdHJpbmcpOworCisgICAgICAgIC8vIENvbnRpbnVlIGNvbmNhdGVuYXRpbmcgdW50aWwgd2UgbGFuZCBpbiBhbiBlbXB0eSBiaW4KKyAgICAgICAgd2hpbGUgKCFwcmVmaXhlc1N0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgIGRlcHRoQmluID0gZ2V0RGVwdGhCaW5Gb3JMZW5ndGgobmV3VHJlZS5zaXplKCkpOworICAgICAgICAgIGJpbkVuZCA9IG1pbkxlbmd0aEJ5RGVwdGhbZGVwdGhCaW4gKyAxXTsKKyAgICAgICAgICBpZiAocHJlZml4ZXNTdGFjay5wZWVrKCkuc2l6ZSgpIDwgYmluRW5kKSB7CisgICAgICAgICAgICBCeXRlU3RyaW5nIGxlZnQgPSBwcmVmaXhlc1N0YWNrLnBvcCgpOworICAgICAgICAgICAgbmV3VHJlZSA9IG5ldyBSb3BlQnl0ZVN0cmluZyhsZWZ0LCBuZXdUcmVlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByZWZpeGVzU3RhY2sucHVzaChuZXdUcmVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXREZXB0aEJpbkZvckxlbmd0aChpbnQgbGVuZ3RoKSB7CisgICAgICBpbnQgZGVwdGggPSBBcnJheXMuYmluYXJ5U2VhcmNoKG1pbkxlbmd0aEJ5RGVwdGgsIGxlbmd0aCk7CisgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgIC8vIEl0IHdhc24ndCBhbiBleGFjdCBtYXRjaCwgc28gY29udmVydCB0byB0aGUgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgICAgLy8gZnJhZ21lbnQsIHdoaWNoIGlzIG9uZSBsZXNzIGV2ZW4gdGhhbiB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICAgICAgICBpbnQgaW5zZXJ0aW9uUG9pbnQgPSAtKGRlcHRoICsgMSk7CisgICAgICAgIGRlcHRoID0gaW5zZXJ0aW9uUG9pbnQgLSAxOworICAgICAgfQorCisgICAgICByZXR1cm4gZGVwdGg7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRoaXMgY2xhc3MgaXMgYSBjb250aW51YWJsZSB0cmVlIHRyYXZlcnNhbCwgd2hpY2gga2VlcHMgdGhlIHN0YXRlCisgICAqIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIGV4aXN0IG9uIHRoZSBzdGFjayBpbiBhIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwgaW5zdGVhZAorICAgKiBvbiBhIHN0YWNrIG9mICJCcmVhZCBDcnVtYnMiLiBUaGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgc3RhY2sgaW4gdGhpcworICAgKiBpdGVyYXRvciBpcyB0aGUgc2FtZSBhcyB0aGUgZGVwdGggb2YgdGhlIHRyZWUgYmVpbmcgdHJhdmVyc2VkLgorICAgKgorICAgKiA8cD5UaGlzIGl0ZXJhdG9yIGlzIHVzZWQgdG8gaW1wbGVtZW50CisgICAqIHtAbGluayBSb3BlQnl0ZVN0cmluZyNlcXVhbHNGcmFnbWVudHMoQnl0ZVN0cmluZyl9LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGllY2VJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPExpdGVyYWxCeXRlU3RyaW5nPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0YWNrPFJvcGVCeXRlU3RyaW5nPiBicmVhZENydW1icyA9CisgICAgICAgIG5ldyBTdGFjazxSb3BlQnl0ZVN0cmluZz4oKTsKKyAgICBwcml2YXRlIExpdGVyYWxCeXRlU3RyaW5nIG5leHQ7CisKKyAgICBwcml2YXRlIFBpZWNlSXRlcmF0b3IoQnl0ZVN0cmluZyByb290KSB7CisgICAgICBuZXh0ID0gZ2V0TGVhZkJ5TGVmdChyb290KTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpdGVyYWxCeXRlU3RyaW5nIGdldExlYWZCeUxlZnQoQnl0ZVN0cmluZyByb290KSB7CisgICAgICBCeXRlU3RyaW5nIHBvcyA9IHJvb3Q7CisgICAgICB3aGlsZSAocG9zIGluc3RhbmNlb2YgUm9wZUJ5dGVTdHJpbmcpIHsKKyAgICAgICAgUm9wZUJ5dGVTdHJpbmcgcmJzID0gKFJvcGVCeXRlU3RyaW5nKSBwb3M7CisgICAgICAgIGJyZWFkQ3J1bWJzLnB1c2gocmJzKTsKKyAgICAgICAgcG9zID0gcmJzLmxlZnQ7CisgICAgICB9CisgICAgICByZXR1cm4gKExpdGVyYWxCeXRlU3RyaW5nKSBwb3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXRlcmFsQnl0ZVN0cmluZyBnZXROZXh0Tm9uRW1wdHlMZWFmKCkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gQWxtb3N0IGFsd2F5cywgd2UgZ28gdGhyb3VnaCB0aGlzIGxvb3AgZXhhY3RseSBvbmNlLiAgSG93ZXZlciwgaWYKKyAgICAgICAgLy8gd2UgZGlzY292ZXIgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSByb3BlLCB3ZSB0b3NzIGl0IGFuZCB0cnkgYWdhaW4uCisgICAgICAgIGlmIChicmVhZENydW1icy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBMaXRlcmFsQnl0ZVN0cmluZyByZXN1bHQgPSBnZXRMZWFmQnlMZWZ0KGJyZWFkQ3J1bWJzLnBvcCgpLnJpZ2h0KTsKKyAgICAgICAgICBpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgIHJldHVybiBuZXh0ICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBpdGVtIGFuZCBhZHZhbmNlcyBvbmUge0Bjb2RlIExpdGVyYWxCeXRlU3RyaW5nfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV4dCBub24tZW1wdHkgTGl0ZXJhbEJ5dGVTdHJpbmcgb3Ige0Bjb2RlIG51bGx9CisgICAgICovCisgICAgcHVibGljIExpdGVyYWxCeXRlU3RyaW5nIG5leHQoKSB7CisgICAgICBpZiAobmV4dCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBMaXRlcmFsQnl0ZVN0cmluZyByZXN1bHQgPSBuZXh0OworICAgICAgbmV4dCA9IGdldE5leHROb25FbXB0eUxlYWYoKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQnl0ZUl0ZXJhdG9yCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCeXRlSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIG5ldyBSb3BlQnl0ZUl0ZXJhdG9yKCk7CisgIH0KKworICBwcml2YXRlIGNsYXNzIFJvcGVCeXRlSXRlcmF0b3IgaW1wbGVtZW50cyBCeXRlU3RyaW5nLkJ5dGVJdGVyYXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFBpZWNlSXRlcmF0b3IgcGllY2VzOworICAgIHByaXZhdGUgQnl0ZUl0ZXJhdG9yIGJ5dGVzOworICAgIGludCBieXRlc1JlbWFpbmluZzsKKworICAgIHByaXZhdGUgUm9wZUJ5dGVJdGVyYXRvcigpIHsKKyAgICAgIHBpZWNlcyA9IG5ldyBQaWVjZUl0ZXJhdG9yKFJvcGVCeXRlU3RyaW5nLnRoaXMpOworICAgICAgYnl0ZXMgPSBwaWVjZXMubmV4dCgpLml0ZXJhdG9yKCk7CisgICAgICBieXRlc1JlbWFpbmluZyA9IHNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgcmV0dXJuIChieXRlc1JlbWFpbmluZyA+IDApOworICAgIH0KKworICAgIHB1YmxpYyBCeXRlIG5leHQoKSB7CisgICAgICByZXR1cm4gbmV4dEJ5dGUoKTsgLy8gRG9lcyBub3QgaW5zdGFudGlhdGUgYSBCeXRlCisgICAgfQorCisgICAgcHVibGljIGJ5dGUgbmV4dEJ5dGUoKSB7CisgICAgICBpZiAoIWJ5dGVzLmhhc05leHQoKSkgeworICAgICAgICBieXRlcyA9IHBpZWNlcy5uZXh0KCkuaXRlcmF0b3IoKTsKKyAgICAgIH0KKyAgICAgIC0tYnl0ZXNSZW1haW5pbmc7CisgICAgICByZXR1cm4gYnl0ZXMubmV4dEJ5dGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVGhpcyBjbGFzcyBpcyB0aGUge0BsaW5rIFJvcGVCeXRlU3RyaW5nfSBlcXVpdmFsZW50IGZvcgorICAgKiB7QGxpbmsgQnl0ZUFycmF5SW5wdXRTdHJlYW19LgorICAgKi8KKyAgcHJpdmF0ZSBjbGFzcyBSb3BlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgLy8gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgcGllY2VzIG9mIHRoZSByb3BlCisgICAgcHJpdmF0ZSBQaWVjZUl0ZXJhdG9yIHBpZWNlSXRlcmF0b3I7CisgICAgLy8gVGhlIGN1cnJlbnQgcGllY2UKKyAgICBwcml2YXRlIExpdGVyYWxCeXRlU3RyaW5nIGN1cnJlbnRQaWVjZTsKKyAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgY3VycmVudCBwaWVjZQorICAgIHByaXZhdGUgaW50IGN1cnJlbnRQaWVjZVNpemU7CisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBuZXh0IGJ5dGUgdG8gcmVhZCBpbiB0aGUgY3VycmVudCBwaWVjZQorICAgIHByaXZhdGUgaW50IGN1cnJlbnRQaWVjZUluZGV4OworICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHBpZWNlIGluIHRoZSByb3BlIGJ5dGUgc3RyaW5nCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudFBpZWNlT2Zmc2V0SW5Sb3BlOworICAgIC8vIE9mZnNldCBpbiB0aGUgYnVmZmVyIGF0IHdoaWNoIHVzZXIgY2FsbGVkIG1hcmsoKTsKKyAgICBwcml2YXRlIGludCBtYXJrOworCisgICAgcHVibGljIFJvcGVJbnB1dFN0cmVhbSgpIHsKKyAgICAgIGluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpICB7CisgICAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwIHx8IGxlbmd0aCA8IDAgfHwgbGVuZ3RoID4gYi5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkU2tpcEludGVybmFsKGIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbGVuZ3RoKSB7CisgICAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBsZW5ndGggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkU2tpcEludGVybmFsKG51bGwsIDAsIChpbnQpIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgcmVhZCBhbmQgc2tpcC4gIElmIGIgIT0gbnVsbCwgdGhlbiByZWFkIHRoZQorICAgICAqIG5leHQge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgaW50byB0aGUgYnVmZmVyIHtAY29kZSBifSBhdAorICAgICAqIG9mZnNldCB7QGNvZGUgb2Zmc2V0fS4gIElmIGIgPT0gbnVsbCwgdGhlbiBza2lwIHRoZSBuZXh0IHtAY29kZSBsZW5ndGgpCisgICAgICogYnl0ZXMuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IGFsbCBlcnJvciBjaGVja2luZyBoYXMgYWxyZWFkeSBoYXBwZW5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3Igc2tpcHBlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWFkU2tpcEludGVybmFsKGJ5dGUgYltdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSAgeworICAgICAgaW50IGJ5dGVzUmVtYWluaW5nID0gbGVuZ3RoOworICAgICAgd2hpbGUgKGJ5dGVzUmVtYWluaW5nID4gMCkgeworICAgICAgICBhZHZhbmNlSWZDdXJyZW50UGllY2VGdWxseVJlYWQoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRQaWVjZSA9PSBudWxsKSB7CisgICAgICAgICAgaWYgKGJ5dGVzUmVtYWluaW5nID09IGxlbmd0aCkgeworICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBtYW5hZ2UgdG8gcmVhZCBhbnl0aGluZworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIENvcHkgdGhlIGJ5dGVzIGZyb20gdGhpcyBwaWVjZS4KKyAgICAgICAgICBpbnQgY3VycmVudFBpZWNlUmVtYWluaW5nID0gY3VycmVudFBpZWNlU2l6ZSAtIGN1cnJlbnRQaWVjZUluZGV4OworICAgICAgICAgIGludCBjb3VudCA9IE1hdGgubWluKGN1cnJlbnRQaWVjZVJlbWFpbmluZywgYnl0ZXNSZW1haW5pbmcpOworICAgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1cnJlbnRQaWVjZS5jb3B5VG8oYiwgY3VycmVudFBpZWNlSW5kZXgsIG9mZnNldCwgY291bnQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNvdW50OworICAgICAgICAgIH0KKyAgICAgICAgICBjdXJyZW50UGllY2VJbmRleCArPSBjb3VudDsKKyAgICAgICAgICBieXRlc1JlbWFpbmluZyAtPSBjb3VudDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgICByZXR1cm4gbGVuZ3RoIC0gYnl0ZXNSZW1haW5pbmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGFkdmFuY2VJZkN1cnJlbnRQaWVjZUZ1bGx5UmVhZCgpOworICAgICAgaWYgKGN1cnJlbnRQaWVjZSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBjdXJyZW50UGllY2UuYnl0ZUF0KGN1cnJlbnRQaWVjZUluZGV4KyspICYgMHhGRjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpbnQgYnl0ZXNSZWFkID0gY3VycmVudFBpZWNlT2Zmc2V0SW5Sb3BlICsgY3VycmVudFBpZWNlSW5kZXg7CisgICAgICByZXR1cm4gUm9wZUJ5dGVTdHJpbmcudGhpcy5zaXplKCkgLSBieXRlc1JlYWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7CisgICAgICAvLyBTZXQgdGhlIG1hcmsgdG8gb3VyIHBvc2l0aW9uIGluIHRoZSBieXRlIHN0cmluZworICAgICAgbWFyayA9IGN1cnJlbnRQaWVjZU9mZnNldEluUm9wZSArIGN1cnJlbnRQaWVjZUluZGV4OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgIC8vIEp1c3QgcmVpbml0aWFsaXplIGFuZCBza2lwIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgorICAgICAgaW5pdGlhbGl6ZSgpOworICAgICAgcmVhZFNraXBJbnRlcm5hbChudWxsLCAwLCBtYXJrKTsKKyAgICB9CisKKyAgICAvKiogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgdXNlZCBieSBib3RoIHRoZSBjb25zdHJ1Y3RvciBhbmQgcmVzZXQoKSAqLworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgcGllY2VJdGVyYXRvciA9IG5ldyBQaWVjZUl0ZXJhdG9yKFJvcGVCeXRlU3RyaW5nLnRoaXMpOworICAgICAgY3VycmVudFBpZWNlID0gcGllY2VJdGVyYXRvci5uZXh0KCk7CisgICAgICBjdXJyZW50UGllY2VTaXplID0gY3VycmVudFBpZWNlLnNpemUoKTsKKyAgICAgIGN1cnJlbnRQaWVjZUluZGV4ID0gMDsKKyAgICAgIGN1cnJlbnRQaWVjZU9mZnNldEluUm9wZSA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcHMgdG8gdGhlIG5leHQgcGllY2UgaWYgd2UgaGF2ZSByZWFkIGFsbCB0aGUgZGF0YSBpbiB0aGUgY3VycmVudAorICAgICAqIHBpZWNlLiAgU2V0cyBjdXJyZW50UGllY2UgdG8gbnVsbCBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBpbnB1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWR2YW5jZUlmQ3VycmVudFBpZWNlRnVsbHlSZWFkKCkgeworICAgICAgaWYgKGN1cnJlbnRQaWVjZSAhPSBudWxsICYmIGN1cnJlbnRQaWVjZUluZGV4ID09IGN1cnJlbnRQaWVjZVNpemUpIHsKKyAgICAgICAgLy8gR2VuZXJhbGx5LCB3ZSBjYW4gb25seSBnbyB0aHJvdWdoIHRoaXMgbG9vcCBhdCBtb3N0IG9uY2UsIHNpbmNlCisgICAgICAgIC8vIGVtcHR5IHN0cmluZ3MgY2FuJ3QgZW5kIHVwIGluIGEgcm9wZS4gIEJ1dCBiZXR0ZXIgdG8gdGVzdC4KKyAgICAgICAgY3VycmVudFBpZWNlT2Zmc2V0SW5Sb3BlICs9IGN1cnJlbnRQaWVjZVNpemU7CisgICAgICAgIGN1cnJlbnRQaWVjZUluZGV4ID0gMDsKKyAgICAgICAgaWYgKHBpZWNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgY3VycmVudFBpZWNlID0gcGllY2VJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgY3VycmVudFBpZWNlU2l6ZSA9IGN1cnJlbnRQaWVjZS5zaXplKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VycmVudFBpZWNlID0gbnVsbDsKKyAgICAgICAgICBjdXJyZW50UGllY2VTaXplID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDYWxsYmFjay5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDM1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NhbGxiYWNrLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgYW4gUlBDIGNhbGxiYWNrLCBub3JtYWxseSBjYWxsZWQgd2hlbiBhbiBSUEMgY29tcGxldGVzLgorICoge0Bjb2RlIFBhcmFtZXRlclR5cGV9IGlzIG5vcm1hbGx5IHRoZSBtZXRob2QncyByZXNwb25zZSBtZXNzYWdlIHR5cGUuCisgKgorICogPHA+U3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgdHJ5IHRvIGJ1aWxkCisgKiBvbiB0aGlzLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdoaWNoIGdlbmVyYXRlCisgKiBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5IHRoZSBnZW5lcmF0ZWQKKyAqIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UgYW5kIGNhbiBhdm9pZAorICogdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4geworICB2b2lkIHJ1bihQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ2hhbm5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZWM1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YQpAQCAtMCwwICsxLDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKKy8qKgorICogPHA+QWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBSUEMgY2hhbm5lbC4gIEFuIHtAY29kZSBScGNDaGFubmVsfSByZXByZXNlbnRzIGEKKyAqIGNvbW11bmljYXRpb24gbGluZSB0byBhIHtAbGluayBTZXJ2aWNlfSB3aGljaCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoYXQKKyAqIHtAbGluayBTZXJ2aWNlfSdzIG1ldGhvZHMuICBUaGUge0BsaW5rIFNlcnZpY2V9IG1heSBiZSBydW5uaW5nIG9uIGFub3RoZXIKKyAqIG1hY2hpbmUuICBOb3JtYWxseSwgeW91IHNob3VsZCBub3QgY2FsbCBhbiB7QGNvZGUgUnBjQ2hhbm5lbH0gZGlyZWN0bHksIGJ1dAorICogaW5zdGVhZCBjb25zdHJ1Y3QgYSBzdHViIHtAbGluayBTZXJ2aWNlfSB3cmFwcGluZyBpdC4gIEV4YW1wbGU6CisgKgorICogPHByZT4KKyAqICAgUnBjQ2hhbm5lbCBjaGFubmVsID0gcnBjSW1wbC5uZXdDaGFubmVsKCJyZW1vdGVob3N0LmV4YW1wbGUuY29tOjEyMzQiKTsKKyAqICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gcnBjSW1wbC5uZXdDb250cm9sbGVyKCk7CisgKiAgIE15U2VydmljZSBzZXJ2aWNlID0gTXlTZXJ2aWNlLm5ld1N0dWIoY2hhbm5lbCk7CisgKiAgIHNlcnZpY2UubXlNZXRob2QoY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOworICogPC9wcmU+CisgKgorICogPHA+U3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgdHJ5IHRvIGJ1aWxkCisgKiBvbiB0aGlzLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdoaWNoIGdlbmVyYXRlCisgKiBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5IHRoZSBnZW5lcmF0ZWQKKyAqIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UgYW5kIGNhbiBhdm9pZAorICogdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUnBjQ2hhbm5lbCB7CisgIC8qKgorICAgKiBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlLiAgVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0bworICAgKiB7QGNvZGUgU2VydmljZS5jYWxsTWV0aG9kKCl9IHdpdGggb25lIGltcG9ydGFudCBkaWZmZXJlbmNlOiAgdGhlIGNhbGxlcgorICAgKiBkZWNpZGVzIHRoZSB0eXBlcyBvZiB0aGUge0Bjb2RlIE1lc3NhZ2V9IG9iamVjdHMsIG5vdCB0aGUgY2FsbGVlLiAgVGhlCisgICAqIHJlcXVlc3QgbWF5IGJlIG9mIGFueSB0eXBlIGFzIGxvbmcgYXMKKyAgICoge0Bjb2RlIHJlcXVlc3QuZ2V0RGVzY3JpcHRvcigpID09IG1ldGhvZC5nZXRJbnB1dFR5cGUoKX0uCisgICAqIFRoZSByZXNwb25zZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHdpbGwgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcworICAgKiB7QGNvZGUgcmVzcG9uc2VQcm90b3R5cGV9ICh3aGljaCBtdXN0IGhhdmUKKyAgICoge0Bjb2RlIGdldERlc2NyaXB0b3IoKSA9PSBtZXRob2QuZ2V0T3V0cHV0VHlwZSgpfSkuCisgICAqLworICB2b2lkIGNhbGxNZXRob2QoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCisgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlUHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gZG9uZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NvbnRyb2xsZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYTU0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIDxwPkFuIHtAY29kZSBScGNDb250cm9sbGVyfSBtZWRpYXRlcyBhIHNpbmdsZSBtZXRob2QgY2FsbC4gIFRoZSBwcmltYXJ5CisgKiBwdXJwb3NlIG9mIHRoZSBjb250cm9sbGVyIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gbWFuaXB1bGF0ZSBzZXR0aW5ncworICogc3BlY2lmaWMgdG8gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBhbmQgdG8gZmluZCBvdXQgYWJvdXQgUlBDLWxldmVsIGVycm9ycy4KKyAqCisgKiA8cD5TdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCB0cnkgdG8gYnVpbGQKKyAqIG9uIHRoaXMsIGJ1dCBzaG91bGQgaW5zdGVhZCBwcm92aWRlIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMgd2hpY2ggZ2VuZXJhdGUKKyAqIGNvZGUgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgUlBDIGltcGxlbWVudGF0aW9uLiAgVGhpcyB3YXkgdGhlIGdlbmVyYXRlZAorICogY29kZSBjYW4gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGluIHVzZSBhbmQgY2FuIGF2b2lkCisgKiB1bm5lY2Vzc2FyeSBsYXllcnMgb2YgaW5kaXJlY3Rpb24uCisgKgorICogPHA+VGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIHtAY29kZSBScGNDb250cm9sbGVyfSBpbnRlcmZhY2UgYXJlIGludGVuZGVkCisgKiB0byBiZSBhICJsZWFzdCBjb21tb24gZGVub21pbmF0b3IiIHNldCBvZiBmZWF0dXJlcyB3aGljaCB3ZSBleHBlY3QgYWxsCisgKiBpbXBsZW1lbnRhdGlvbnMgdG8gc3VwcG9ydC4gIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSBtb3JlCisgKiBhZHZhbmNlZCBmZWF0dXJlcyAoZS5nLiBkZWFkbGluZSBwcm9wYWdhdGlvbikuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGludGVyZmFjZSBScGNDb250cm9sbGVyIHsKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgY2xpZW50IHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMKKyAgLy8gYXJlIHVuZGVmaW5lZCBvbiB0aGUgc2VydmVyIHNpZGUgKG1heSB0aHJvdyBSdW50aW1lRXhjZXB0aW9ucykuCisKKyAgLyoqCisgICAqIFJlc2V0cyB0aGUgUnBjQ29udHJvbGxlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgaW4KKyAgICogYSBuZXcgY2FsbC4gIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBjbGllbnQgc2lkZSBvbmx5LiAgSXQgbXVzdCBub3QKKyAgICogYmUgY2FsbGVkIHdoaWxlIGFuIFJQQyBpcyBpbiBwcm9ncmVzcy4KKyAgICovCisgIHZvaWQgcmVzZXQoKTsKKworICAvKioKKyAgICogQWZ0ZXIgYSBjYWxsIGhhcyBmaW5pc2hlZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZhaWxlZC4gIFRoZSBwb3NzaWJsZQorICAgKiByZWFzb25zIGZvciBmYWlsdXJlIGRlcGVuZCBvbiB0aGUgUlBDIGltcGxlbWVudGF0aW9uLiAge0Bjb2RlIGZhaWxlZCgpfQorICAgKiBtb3N0IG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBjbGllbnQgc2lkZSwgYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYQorICAgKiBjYWxsIGhhcyBmaW5pc2hlZC4KKyAgICovCisgIGJvb2xlYW4gZmFpbGVkKCk7CisKKyAgLyoqCisgICAqIElmIHtAY29kZSBmYWlsZWQoKX0gaXMge0Bjb2RlIHRydWV9LCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24KKyAgICogb2YgdGhlIGVycm9yLgorICAgKi8KKyAgU3RyaW5nIGVycm9yVGV4dCgpOworCisgIC8qKgorICAgKiBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCisgICAqIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAorICAgKiB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuICBJZiB0aGUgY2FsbCBpcworICAgKiBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKKyAgICogd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCisgICAqLworICB2b2lkIHN0YXJ0Q2FuY2VsKCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgc2VydmVyIHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMKKyAgLy8gYXJlIHVuZGVmaW5lZCBvbiB0aGUgY2xpZW50IHNpZGUgKG1heSB0aHJvdyBSdW50aW1lRXhjZXB0aW9ucykuCisKKyAgLyoqCisgICAqIENhdXNlcyB7QGNvZGUgZmFpbGVkKCl9IHRvIHJldHVybiB0cnVlIG9uIHRoZSBjbGllbnQgc2lkZS4gIHtAY29kZSByZWFzb259CisgICAqIHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG1lc3NhZ2UgcmV0dXJuZWQgYnkge0Bjb2RlIGVycm9yVGV4dCgpfS4KKyAgICogSWYgeW91IGZpbmQgeW91IG5lZWQgdG8gcmV0dXJuIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICogZmFpbHVyZXMsIHlvdSBzaG91bGQgaW5jb3Jwb3JhdGUgaXQgaW50byB5b3VyIHJlc3BvbnNlIHByb3RvY29sIGJ1ZmZlcgorICAgKiBhbmQgc2hvdWxkIE5PVCBjYWxsIHtAY29kZSBzZXRGYWlsZWQoKX0uCisgICAqLworICB2b2lkIHNldEZhaWxlZChTdHJpbmcgcmVhc29uKTsKKworICAvKioKKyAgICogSWYge0Bjb2RlIHRydWV9LCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50IGNhbmNlbGVkIHRoZSBSUEMsIHNvIHRoZSBzZXJ2ZXIKKyAgICogbWF5IGFzIHdlbGwgZ2l2ZSB1cCBvbiByZXBseWluZyB0byBpdC4gIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoZQorICAgKiBzZXJ2ZXIgc2lkZSBvbmx5LiAgVGhlIHNlcnZlciBzaG91bGQgc3RpbGwgY2FsbCB0aGUgZmluYWwgImRvbmUiIGNhbGxiYWNrLgorICAgKi8KKyAgYm9vbGVhbiBpc0NhbmNlbGVkKCk7CisKKyAgLyoqCisgICAqIEFza3MgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYW5jZWxlZC4gIFRoZQorICAgKiBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSB7QGNvZGUgbnVsbH0uICBUaGUKKyAgICogY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4gIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQKKyAgICogYmVpbmcgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhZnRlciBjb21wbGV0aW9uLiAgSWYgdGhlIFJQQworICAgKiBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkIHdoZW4gTm90aWZ5T25DYW5jZWwoKSBpcyBjYWxsZWQsIHRoZSBjYWxsYmFjaworICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseS4KKyAgICoKKyAgICogPHA+e0Bjb2RlIG5vdGlmeU9uQ2FuY2VsKCl9IG11c3QgYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgorICAgKiBJdCBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VydmVyIHNpZGUgb25seS4KKyAgICovCisgIHZvaWQgbm90aWZ5T25DYW5jZWwoUnBjQ2FsbGJhY2s8T2JqZWN0PiBjYWxsYmFjayk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY1V0aWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjk1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY1V0aWwuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIEdyYWItYmFnIG9mIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBSUENzLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBScGNVdGlsIHsKKyAgcHJpdmF0ZSBScGNVdGlsKCkge30KKworICAvKioKKyAgICogVGFrZSBhbiB7QGNvZGUgUnBjQ2FsbGJhY2s8TWVzc2FnZT59IGFuZCBjb252ZXJ0IGl0IHRvIGFuCisgICAqIHtAY29kZSBScGNDYWxsYmFja30gYWNjZXB0aW5nIGEgc3BlY2lmaWMgbWVzc2FnZSB0eXBlLiAgVGhpcyBpcyBhbHdheXMKKyAgICogdHlwZS1zYWZlIChwYXJhbWV0ZXIgdHlwZSBjb250cmF2YXJpYW5jZSkuCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHN0YXRpYyA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+IFJwY0NhbGxiYWNrPFR5cGU+CisgIHNwZWNpYWxpemVDYWxsYmFjayhmaW5hbCBScGNDYWxsYmFjazxNZXNzYWdlPiBvcmlnaW5hbENhbGxiYWNrKSB7CisgICAgcmV0dXJuIChScGNDYWxsYmFjazxUeXBlPilvcmlnaW5hbENhbGxiYWNrOworICAgIC8vIFRoZSBhYm92ZSBjYXN0IHdvcmtzLCBidXQgb25seSBkdWUgdG8gdGVjaG5pY2FsIGRldGFpbHMgb2YgdGhlIEphdmEKKyAgICAvLyBpbXBsZW1lbnRhdGlvbi4gIEEgbW9yZSB0aGVvcmV0aWNhbGx5IGNvcnJlY3QgLS0gYnV0IGxlc3MgZWZmaWNpZW50IC0tCisgICAgLy8gaW1wbGVtZW50YXRpb24gd291bGQgYmUgYXMgZm9sbG93czoKKyAgICAvLyAgIHJldHVybiBuZXcgUnBjQ2FsbGJhY2s8VHlwZT4oKSB7CisgICAgLy8gICAgIHB1YmxpYyB2b2lkIHJ1bihUeXBlIHBhcmFtZXRlcikgeworICAgIC8vICAgICAgIG9yaWdpbmFsQ2FsbGJhY2sucnVuKHBhcmFtZXRlcik7CisgICAgLy8gICAgIH0KKyAgICAvLyAgIH07CisgIH0KKworICAvKioKKyAgICogVGFrZSBhbiB7QGNvZGUgUnBjQ2FsbGJhY2t9IGFjY2VwdGluZyBhIHNwZWNpZmljIG1lc3NhZ2UgdHlwZSBhbmQgY29udmVydAorICAgKiBpdCB0byBhbiB7QGNvZGUgUnBjQ2FsbGJhY2s8TWVzc2FnZT59LiAgVGhlIGdlbmVyYWxpemVkIGNhbGxiYWNrIHdpbGwKKyAgICogYWNjZXB0IGFueSBtZXNzYWdlIG9iamVjdCB3aGljaCBoYXMgdGhlIHNhbWUgZGVzY3JpcHRvciwgYW5kIHdpbGwgY29udmVydAorICAgKiBpdCB0byB0aGUgY29ycmVjdCBjbGFzcyBiZWZvcmUgY2FsbGluZyB0aGUgb3JpZ2luYWwgY2FsbGJhY2suICBIb3dldmVyLAorICAgKiBpZiB0aGUgZ2VuZXJhbGl6ZWQgY2FsbGJhY2sgaXMgZ2l2ZW4gYSBtZXNzYWdlIHdpdGggYSBkaWZmZXJlbnQgZGVzY3JpcHRvciwKKyAgICogYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+CisgIFJwY0NhbGxiYWNrPE1lc3NhZ2U+IGdlbmVyYWxpemVDYWxsYmFjaygKKyAgICAgIGZpbmFsIFJwY0NhbGxiYWNrPFR5cGU+IG9yaWdpbmFsQ2FsbGJhY2ssCisgICAgICBmaW5hbCBDbGFzczxUeXBlPiBvcmlnaW5hbENsYXNzLAorICAgICAgZmluYWwgVHlwZSBkZWZhdWx0SW5zdGFuY2UpIHsKKyAgICByZXR1cm4gbmV3IFJwY0NhbGxiYWNrPE1lc3NhZ2U+KCkgeworICAgICAgcHVibGljIHZvaWQgcnVuKGZpbmFsIE1lc3NhZ2UgcGFyYW1ldGVyKSB7CisgICAgICAgIFR5cGUgdHlwZWRQYXJhbWV0ZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdHlwZWRQYXJhbWV0ZXIgPSBvcmlnaW5hbENsYXNzLmNhc3QocGFyYW1ldGVyKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICB0eXBlZFBhcmFtZXRlciA9IGNvcHlBc1R5cGUoZGVmYXVsdEluc3RhbmNlLCBwYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIG9yaWdpbmFsQ2FsbGJhY2sucnVuKHR5cGVkUGFyYW1ldGVyKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBvZiB0eXBlICJUeXBlIiB3aGljaCBpcyBhIGNvcHkgb2YgInNvdXJjZSIuICAic291cmNlIgorICAgKiBtdXN0IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciBidXQgbWF5IGJlIGEgZGlmZmVyZW50IGNsYXNzIChlLmcuCisgICAqIER5bmFtaWNNZXNzYWdlKS4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwcml2YXRlIHN0YXRpYyA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+IFR5cGUgY29weUFzVHlwZSgKKyAgICAgIGZpbmFsIFR5cGUgdHlwZURlZmF1bHRJbnN0YW5jZSwgZmluYWwgTWVzc2FnZSBzb3VyY2UpIHsKKyAgICByZXR1cm4gKFR5cGUpdHlwZURlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKHNvdXJjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBjYWxsYmFjayB3aGljaCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4gIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IKKyAgICogc2VjdXJpdHksIHdoZW4gcGFzc2luZyBhIGNhbGxiYWNrIHRvIHVudHJ1c3RlZCBjb2RlOiAgbW9zdCBjYWxsYmFja3MgZG8KKyAgICogbm90IGV4cGVjdCB0byBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIHNvIGRvaW5nIHNvIG1heSBleHBvc2UgYnVncyBpZiBpdAorICAgKiBpcyBub3QgcHJldmVudGVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8UGFyYW1ldGVyVHlwZT4KKyAgICBScGNDYWxsYmFjazxQYXJhbWV0ZXJUeXBlPiBuZXdPbmVUaW1lQ2FsbGJhY2soCisgICAgICBmaW5hbCBScGNDYWxsYmFjazxQYXJhbWV0ZXJUeXBlPiBvcmlnaW5hbENhbGxiYWNrKSB7CisgICAgcmV0dXJuIG5ldyBScGNDYWxsYmFjazxQYXJhbWV0ZXJUeXBlPigpIHsKKyAgICAgIHByaXZhdGUgYm9vbGVhbiBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7CisKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWxyZWFkeUNhbGxlZEV4Y2VwdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG9yaWdpbmFsQ2FsbGJhY2sucnVuKHBhcmFtZXRlcik7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBvbmUtdGltZSBjYWxsYmFjayBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFscmVhZHlDYWxsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NDY5NzQxMjc5NTA3ODQ4MjY2TDsKKworICAgIHB1YmxpYyBBbHJlYWR5Q2FsbGVkRXhjZXB0aW9uKCkgeworICAgICAgc3VwZXIoIlRoaXMgUnBjQ2FsbGJhY2sgd2FzIGFscmVhZHkgY2FsbGVkIGFuZCBjYW5ub3QgYmUgY2FsbGVkICIgKworICAgICAgICAgICAgIm11bHRpcGxlIHRpbWVzLiIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE1ODVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IgcHJvdG9jb2wtYnVmZmVyLWJhc2VkIFJQQyBzZXJ2aWNlcy4gIFNlcnZpY2VzCisgKiB0aGVtc2VsdmVzIGFyZSBhYnN0cmFjdCBjbGFzc2VzIChpbXBsZW1lbnRlZCBlaXRoZXIgYnkgc2VydmVycyBvciBhcworICogc3R1YnMpLCBidXQgdGhleSBzdWJjbGFzcyB0aGlzIGJhc2UgaW50ZXJmYWNlLiAgVGhlIG1ldGhvZHMgb2YgdGhpcworICogaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugd2l0aG91dCBrbm93aW5nCisgKiBpdHMgZXhhY3QgdHlwZSBhdCBjb21waWxlIHRpbWUgKGFuYWxvZ291cyB0byB0aGUgTWVzc2FnZSBpbnRlcmZhY2UpLgorICoKKyAqIDxwPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHRyeSB0byBidWlsZAorICogb24gdGhpcywgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucyB3aGljaCBnZW5lcmF0ZQorICogY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheSB0aGUgZ2VuZXJhdGVkCisgKiBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlIGFuZCBjYW4gYXZvaWQKKyAqIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UgeworICAvKioKKyAgICogR2V0IHRoZSB7QGNvZGUgU2VydmljZURlc2NyaXB0b3J9IGRlc2NyaWJpbmcgdGhpcyBzZXJ2aWNlIGFuZCBpdHMgbWV0aG9kcy4KKyAgICovCisgIERlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisKKyAgLyoqCisgICAqIDxwPkNhbGwgYSBtZXRob2Qgb2YgdGhlIHNlcnZpY2Ugc3BlY2lmaWVkIGJ5IE1ldGhvZERlc2NyaXB0b3IuICBUaGlzIGlzCisgICAqIG5vcm1hbGx5IGltcGxlbWVudGVkIGFzIGEgc2ltcGxlIHtAY29kZSBzd2l0Y2goKX0gdGhhdCBjYWxscyB0aGUgc3RhbmRhcmQKKyAgICogZGVmaW5pdGlvbnMgb2YgdGhlIHNlcnZpY2UncyBtZXRob2RzLgorICAgKgorICAgKiA8cD5QcmVjb25kaXRpb25zOgorICAgKiA8dWw+CisgICAqICAgPGxpPntAY29kZSBtZXRob2QuZ2V0U2VydmljZSgpID09IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9CisgICAqICAgPGxpPntAY29kZSByZXF1ZXN0fSBpcyBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzcyBhcyB0aGUgb2JqZWN0IHJldHVybmVkIGJ5CisgICAqICAgICAgIHtAY29kZSBnZXRSZXF1ZXN0UHJvdG90eXBlKG1ldGhvZCl9LgorICAgKiAgIDxsaT57QGNvZGUgY29udHJvbGxlcn0gaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIFJQQyBpbXBsZW1lbnRhdGlvbgorICAgKiAgICAgICBiZWluZyB1c2VkIGJ5IHRoaXMgU2VydmljZS4gIEZvciBzdHVicywgdGhlICJjb3JyZWN0IHR5cGUiIGRlcGVuZHMKKyAgICogICAgICAgb24gdGhlIFJwY0NoYW5uZWwgd2hpY2ggdGhlIHN0dWIgaXMgdXNpbmcuICBTZXJ2ZXItc2lkZSBTZXJ2aWNlCisgICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXB0IHdoYXRldmVyIHR5cGUgb2YKKyAgICogICAgICAge0Bjb2RlIFJwY0NvbnRyb2xsZXJ9IHRoZSBzZXJ2ZXItc2lkZSBSUEMgaW1wbGVtZW50YXRpb24gdXNlcy4KKyAgICogPC91bD4KKyAgICoKKyAgICogPHA+UG9zdGNvbmRpdGlvbnM6CisgICAqIDx1bD4KKyAgICogICA8bGk+e0Bjb2RlIGRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1ldGhvZCBpcyBjb21wbGV0ZS4gIFRoaXMgbWF5IGJlCisgICAqICAgICAgIGJlZm9yZSB7QGNvZGUgY2FsbE1ldGhvZCgpfSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluCisgICAqICAgICAgIHRoZSBmdXR1cmUuCisgICAqICAgPGxpPlRoZSBwYXJhbWV0ZXIgdG8ge0Bjb2RlIGRvbmV9IGlzIHRoZSByZXNwb25zZS4gIEl0IG11c3QgYmUgb2YgdGhlCisgICAqICAgICAgIGV4YWN0IHNhbWUgdHlwZSBhcyB3b3VsZCBiZSByZXR1cm5lZCBieQorICAgKiAgICAgICB7QGNvZGUgZ2V0UmVzcG9uc2VQcm90b3R5cGUobWV0aG9kKX0uCisgICAqICAgPGxpPklmIHRoZSBSUEMgZmFpbGVkLCB0aGUgcGFyYW1ldGVyIHRvIHtAY29kZSBkb25lfSB3aWxsIGJlCisgICAqICAgICAgIHtAY29kZSBudWxsfS4gIEZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZSBjYW4gYmUgZm91bmQgYnkKKyAgICogICAgICAgcXVlcnlpbmcge0Bjb2RlIGNvbnRyb2xsZXJ9LgorICAgKiA8L3VsPgorICAgKi8KKyAgdm9pZCBjYWxsTWV0aG9kKERlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgTWVzc2FnZSByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gZG9uZSk7CisKKyAgLyoqCisgICAqIDxwPntAY29kZSBjYWxsTWV0aG9kKCl9IHJlcXVpcmVzIHRoYXQgdGhlIHJlcXVlc3QgcGFzc2VkIGluIGlzIG9mIGEKKyAgICogcGFydGljdWxhciBzdWJjbGFzcyBvZiB7QGNvZGUgTWVzc2FnZX0uICB7QGNvZGUgZ2V0UmVxdWVzdFByb3RvdHlwZSgpfQorICAgKiBnZXRzIHRoZSBkZWZhdWx0IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgZm9yIGEgZ2l2ZW4gbWV0aG9kLiAgWW91IGNhbiB0aGVuCisgICAqIGNhbGwge0Bjb2RlIE1lc3NhZ2UubmV3QnVpbGRlckZvclR5cGUoKX0gb24gdGhpcyBpbnN0YW5jZSB0bworICAgKiBjb25zdHJ1Y3QgYSBidWlsZGVyIHRvIGJ1aWxkIGFuIG9iamVjdCB3aGljaCB5b3UgY2FuIHRoZW4gcGFzcyB0bworICAgKiB7QGNvZGUgY2FsbE1ldGhvZCgpfS4KKyAgICoKKyAgICogPHA+RXhhbXBsZToKKyAgICogPHByZT4KKyAgICogICBNZXRob2REZXNjcmlwdG9yIG1ldGhvZCA9CisgICAqICAgICBzZXJ2aWNlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7CisgICAqICAgTWVzc2FnZSByZXF1ZXN0ID0KKyAgICogICAgIHN0dWIuZ2V0UmVxdWVzdFByb3RvdHlwZShtZXRob2QpLm5ld0J1aWxkZXJGb3JUeXBlKCkKKyAgICogICAgICAgICAubWVyZ2VGcm9tKGlucHV0KS5idWlsZCgpOworICAgKiAgIHNlcnZpY2UuY2FsbE1ldGhvZChtZXRob2QsIHJlcXVlc3QsIGNhbGxiYWNrKTsKKyAgICogPC9wcmU+CisgICAqLworICBNZXNzYWdlIGdldFJlcXVlc3RQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOworCisgIC8qKgorICAgKiBMaWtlIHtAY29kZSBnZXRSZXF1ZXN0UHJvdG90eXBlKCl9LCBidXQgZ2V0cyBhIHByb3RvdHlwZSBvZiB0aGUgcmVzcG9uc2UKKyAgICogbWVzc2FnZS4gIHtAY29kZSBnZXRSZXNwb25zZVByb3RvdHlwZSgpfSBpcyBnZW5lcmFsbHkgbm90IG5lZWRlZCBiZWNhdXNlCisgICAqIHRoZSB7QGNvZGUgU2VydmljZX0gaW1wbGVtZW50YXRpb24gY29uc3RydWN0cyB0aGUgcmVzcG9uc2UgbWVzc2FnZSBpdHNlbGYsCisgICAqIGJ1dCBpdCBtYXkgYmUgdXNlZnVsIGluIHNvbWUgY2FzZXMgdG8ga25vdyBhaGVhZCBvZiB0aW1lIHdoYXQgdHlwZSBvZgorICAgKiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KKyAgICovCisgIE1lc3NhZ2UgZ2V0UmVzcG9uc2VQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU2NjlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIFRocm93biBieSBibG9ja2luZyBSUEMgbWV0aG9kcyB3aGVuIGEgZmFpbHVyZSBvY2N1cnMuCisgKgorICogQGF1dGhvciBjcG92aXJrQGdvb2dsZS5jb20gKENocmlzIFBvdmlyaykKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTIxOTI2MjMzNTcyOTg5MTkyMEw7CisKKyAgcHVibGljIFNlcnZpY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZmM5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKKy8qKgorICoge0Bjb2RlIFNpbmdsZUZpZWxkQnVpbGRlcn0gaW1wbGVtZW50cyBhIHN0cnVjdHVyZSB0aGF0IGEgcHJvdG9jb2wKKyAqIG1lc3NhZ2UgdXNlcyB0byBob2xkIGEgc2luZ2xlIGZpZWxkIG9mIGFub3RoZXIgcHJvdG9jb2wgbWVzc2FnZS4gSXQgc3VwcG9ydHMKKyAqIHRoZSBjbGFzc2ljYWwgdXNlIGNhc2Ugb2Ygc2V0dGluZyBhbiBpbW11dGFibGUge0BsaW5rIE1lc3NhZ2V9IGFzIHRoZSB2YWx1ZQorICogb2YgdGhlIGZpZWxkIGFuZCBpcyBoaWdobHkgb3B0aW1pemVkIGFyb3VuZCB0aGlzLgorICogPGJyPgorICogSXQgYWxzbyBzdXBwb3J0cyB0aGUgYWRkaXRpb25hbCB1c2UgY2FzZSBvZiBzZXR0aW5nIGEge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0KKyAqIGFzIHRoZSBmaWVsZCBhbmQgZGVmZXJyaW5nIGNvbnZlcnNpb24gb2YgdGhhdCB7QGNvZGUgQnVpbGRlcn0KKyAqIHRvIGFuIGltbXV0YWJsZSB7QGNvZGUgTWVzc2FnZX0uIEluIHRoaXMgd2F5LCBpdCdzIHBvc3NpYmxlIHRvIG1haW50YWluCisgKiBhIHRyZWUgb2Yge0Bjb2RlIEJ1aWxkZXJ9J3MgdGhhdCBhY3RzIGFzIGEgZnVsbHkgcmVhZC93cml0ZSBkYXRhCisgKiBzdHJ1Y3R1cmUuCisgKiA8YnI+CisgKiBMb2dpY2FsbHksIG9uZSBjYW4gdGhpbmsgb2YgYSB0cmVlIG9mIGJ1aWxkZXJzIGFzIGNvbnZlcnRpbmcgdGhlIGVudGlyZSB0cmVlCisgKiB0byBtZXNzYWdlcyB3aGVuIGJ1aWxkIGlzIGNhbGxlZCBvbiB0aGUgcm9vdCBvciB3aGVuIGFueSBtZXRob2QgaXMgY2FsbGVkCisgKiB0aGF0IGRlc2lyZXMgYSBNZXNzYWdlIGluc3RlYWQgb2YgYSBCdWlsZGVyLiBJbiB0ZXJtcyBvZiB0aGUgaW1wbGVtZW50YXRpb24sCisgKiB0aGUge0Bjb2RlIFNpbmdsZUZpZWxkQnVpbGRlcn0gYW5kIHtAY29kZSBSZXBlYXRlZEZpZWxkQnVpbGRlcn0KKyAqIGNsYXNzZXMgY2FjaGUgbWVzc2FnZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgc28gdGhhdCBtZXNzYWdlcyBvbmx5IG5lZWQgdG8gYmUKKyAqIGNyZWF0ZWQgd2hlbiBzb21lIGNoYW5nZSBvY2N1cmVkIGluIGl0cyBidWlsZGVyIG9yIGEgYnVpbGRlciBmb3Igb25lIG9mIGl0cworICogZGVzY2VuZGFudHMuCisgKgorICogQHBhcmFtIDxNVHlwZT4gdGhlIHR5cGUgb2YgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCisgKiBAcGFyYW0gPEJUeXBlPiB0aGUgdHlwZSBvZiBidWlsZGVyIGZvciB0aGUgZmllbGQKKyAqIEBwYXJhbSA8SVR5cGU+IHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciB0aGUgbWVzc2FnZSBhbmQgdGhlIGJ1aWxkZXIKKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUZpZWxkQnVpbGRlcgorICAgIDxNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCisgICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAorICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+CisgICAgaW1wbGVtZW50cyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgeworCisgIC8vIFBhcmVudCB0byBzZW5kIGNoYW5nZXMgdG8uCisgIHByaXZhdGUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudDsKKworICAvLyBJbnZhcmlhbnQ6IG9uZSBvZiBidWlsZGVyIG9yIG1lc3NhZ2UgZmllbGRzIG11c3QgYmUgbm9uLW51bGwuCisKKyAgLy8gSWYgc2V0LCB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBiYWNrZWQgYnkgYSBidWlsZGVyLiBJbiB0aGlzIGNhc2UsCisgIC8vIG1lc3NhZ2UgZmllbGQgcmVwcmVzZW50cyBhIGNhY2hlZCBtZXNzYWdlIGZvciB0aGUgYnVpbGRlciAob3IgbnVsbCBpZgorICAvLyB0aGVyZSBpcyBubyBjYWNoZWQgbWVzc2FnZSkuCisgIHByaXZhdGUgQlR5cGUgYnVpbGRlcjsKKworICAvLyBJZiBidWlsZGVyIGlzIG5vbi1udWxsLCB0aGlzIHJlcHJlc2VudHMgYSBjYWNoZWQgbWVzc2FnZSBmcm9tIHRoZSBidWlsZGVyLgorICAvLyBJZiBidWlsZGVyIGlzIG51bGwsIHRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgbWVzc2FnZSBmb3IgdGhlIGZpZWxkLgorICBwcml2YXRlIE1UeXBlIG1lc3NhZ2U7CisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgd2UndmUgYnVpbHQgYSBtZXNzYWdlIGFuZCBzbyB3ZSBhcmUgbm93IG9ibGlnYXRlZAorICAvLyB0byBkaXNwYXRjaCBkaXJ0eSBpbnZhbGlkYXRpb25zLiBTZWUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyTGlzdGVuZXIuCisgIHByaXZhdGUgYm9vbGVhbiBpc0NsZWFuOworCisgIHB1YmxpYyBTaW5nbGVGaWVsZEJ1aWxkZXIoCisgICAgICBNVHlwZSBtZXNzYWdlLAorICAgICAgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCwKKyAgICAgIGJvb2xlYW4gaXNDbGVhbikgeworICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIHRoaXMuaXNDbGVhbiA9IGlzQ2xlYW47CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgIC8vIE51bGwgb3V0IHBhcmVudCBzbyB3ZSBzdG9wIHNlbmRpbmcgaXQgaW52YWxpZGF0aW9ucy4KKyAgICBwYXJlbnQgPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWVzc2FnZSBmb3IgdGhlIGZpZWxkLiBJZiB0aGUgbWVzc2FnZSBpcyBjdXJyZW50bHkgc3RvcmVkCisgICAqIGFzIGEge0Bjb2RlIEJ1aWxkZXJ9LCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgTWVzc2FnZX0gYnkKKyAgICogY2FsbGluZyB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2J1aWxkUGFydGlhbH0gb24gaXQuIElmIG5vIG1lc3NhZ2UgaGFzCisgICAqIGJlZW4gc2V0LCByZXR1cm5zIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBtZXNzYWdlLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGZvciB0aGUgZmllbGQKKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgTVR5cGUgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAvLyBJZiBtZXNzYWdlIGlzIG51bGwsIHRoZSBpbnZhcmlhbnQgaXMgdGhhdCB3ZSBtdXN0IGJlIGhhdmUgYSBidWlsZGVyLgorICAgICAgbWVzc2FnZSA9IChNVHlwZSkgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICB9CisgICAgcmV0dXJuIG1lc3NhZ2U7CisgIH0KKworICAvKioKKyAgICogQnVpbGRzIHRoZSBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlCisgICAqLworICBwdWJsaWMgTVR5cGUgYnVpbGQoKSB7CisgICAgLy8gTm93IHRoYXQgYnVpbGQgaGFzIGJlZW4gY2FsbGVkLCB3ZSBhcmUgcmVxdWlyZWQgdG8gZGlzcGF0Y2gKKyAgICAvLyBpbnZhbGlkYXRpb25zLgorICAgIGlzQ2xlYW4gPSB0cnVlOworICAgIHJldHVybiBnZXRNZXNzYWdlKCk7CisgIH0KKworICAvKioKKyAgICogR2V0cyBhIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZC4gSWYgbm8gYnVpbGRlciBoYXMgYmVlbiBjcmVhdGVkIHlldCwgYQorICAgKiBidWlsZGVyIGlzIGNyZWF0ZWQgb24gZGVtYW5kIGJ5IGNhbGxpbmcge0BsaW5rIE1lc3NhZ2UjdG9CdWlsZGVyfS4KKyAgICoKKyAgICogQHJldHVybiBUaGUgYnVpbGRlciBmb3IgdGhlIGZpZWxkCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIEJUeXBlIGdldEJ1aWxkZXIoKSB7CisgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgLy8gYnVpbGRlci5tZXJnZUZyb20oKSBvbiBhIGZyZXNoIGJ1aWxkZXIKKyAgICAgIC8vIGRvZXMgbm90IGNyZWF0ZSBhbnkgc3ViLW9iamVjdHMgd2l0aCBpbmRlcGVuZGVudCBjbGVhbi9kaXJ0eSBzdGF0ZXMsCisgICAgICAvLyB0aGVyZWZvcmUgc2V0dGluZyB0aGUgYnVpbGRlciBpdHNlbGYgdG8gY2xlYW4gd2l0aG91dCBhY3R1YWxseSBjYWxsaW5nCisgICAgICAvLyBidWlsZCgpIGNhbm5vdCBicmVhayBhbnkgaW52YXJpYW50cy4KKyAgICAgIGJ1aWxkZXIgPSAoQlR5cGUpIG1lc3NhZ2UubmV3QnVpbGRlckZvclR5cGUodGhpcyk7CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShtZXNzYWdlKTsgLy8gbm8tb3AgaWYgbWVzc2FnZSBpcyB0aGUgZGVmYXVsdCBtZXNzYWdlCisgICAgICBidWlsZGVyLm1hcmtDbGVhbigpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlcjsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIHRoZSBiYXNlIGNsYXNzIGludGVyZmFjZSBmb3IgdGhlIGZpZWxkLiBUaGlzIG1heSBlaXRoZXIgYmUgYSBidWlsZGVyCisgICAqIG9yIGEgbWVzc2FnZS4gSXQgd2lsbCByZXR1cm4gd2hhdGV2ZXIgaXMgbW9yZSBlZmZpY2llbnQuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugb3IgYnVpbGRlciBmb3IgdGhlIGZpZWxkIGFzIHRoZSBiYXNlIGNsYXNzIGludGVyZmFjZQorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBJVHlwZSBnZXRNZXNzYWdlT3JCdWlsZGVyKCkgeworICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKKyAgICAgIHJldHVybiAgKElUeXBlKSBidWlsZGVyOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKElUeXBlKSBtZXNzYWdlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZXRzIGEgIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIHZhbHVlLgorICAgKgorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZXQKKyAgICogQHJldHVybiB0aGUgYnVpbGRlcgorICAgKi8KKyAgcHVibGljIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBzZXRNZXNzYWdlKAorICAgICAgTVR5cGUgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKKyAgICAgIGJ1aWxkZXIuZGlzcG9zZSgpOworICAgICAgYnVpbGRlciA9IG51bGw7CisgICAgfQorICAgIG9uQ2hhbmdlZCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIE1lcmdlcyB0aGUgZmllbGQgZnJvbSBhbm90aGVyIGZpZWxkLgorICAgKgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIG1lcmdlIGZyb20KKyAgICogQHJldHVybiB0aGUgYnVpbGRlcgorICAgKi8KKyAgcHVibGljIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBtZXJnZUZyb20oCisgICAgICBNVHlwZSB2YWx1ZSkgeworICAgIGlmIChidWlsZGVyID09IG51bGwgJiYgbWVzc2FnZSA9PSBtZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSkgeworICAgICAgbWVzc2FnZSA9IHZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICBnZXRCdWlsZGVyKCkubWVyZ2VGcm9tKHZhbHVlKTsKKyAgICB9CisgICAgb25DaGFuZ2VkKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ2xlYXJzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGNsZWFyKCkgeworICAgIG1lc3NhZ2UgPSAoTVR5cGUpIChtZXNzYWdlICE9IG51bGwgPworICAgICAgICBtZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSA6CisgICAgICAgIGJ1aWxkZXIuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKTsKKyAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CisgICAgICBidWlsZGVyLmRpc3Bvc2UoKTsKKyAgICAgIGJ1aWxkZXIgPSBudWxsOworICAgIH0KKyAgICBvbkNoYW5nZWQoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIHRoZSBidWlsZGVyIG9yIG9uZSBvZiBpdHMgbmVzdGVkIGNoaWxkcmVuIGhhcyBjaGFuZ2VkCisgICAqIGFuZCBhbnkgcGFyZW50IHNob3VsZCBiZSBub3RpZmllZCBvZiBpdHMgaW52YWxpZGF0aW9uLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICAvLyBJZiBidWlsZGVyIGlzIG51bGwsIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgb25DaGFuZ2VkIGlzIGJlaW5nIGNhbGxlZAorICAgIC8vIGZyb20gc2V0TWVzc2FnZSBvciBjbGVhci4KKyAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CisgICAgICBtZXNzYWdlID0gbnVsbDsKKyAgICB9CisgICAgaWYgKGlzQ2xlYW4gJiYgcGFyZW50ICE9IG51bGwpIHsKKyAgICAgIHBhcmVudC5tYXJrRGlydHkoKTsKKworICAgICAgLy8gRG9uJ3Qga2VlcCBkaXNwYXRjaGluZyBpbnZhbGlkYXRpb25zIHVudGlsIGJ1aWxkIGlzIGNhbGxlZCBhZ2Fpbi4KKyAgICAgIGlzQ2xlYW4gPSBmYWxzZTsKKyAgICB9CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgeworICAgIG9uQ2hhbmdlZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjYWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXAuamF2YQpAQCAtMCwwICsxLDYxOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CisKKy8qKgorICogQSBjdXN0b20gbWFwIGltcGxlbWVudGF0aW9uIGZyb20gRmllbGREZXNjcmlwdG9yIHRvIE9iamVjdCBvcHRpbWl6ZWQgdG8KKyAqIG1pbmltaXplIHRoZSBudW1iZXIgb2YgbWVtb3J5IGFsbG9jYXRpb25zIGZvciBpbnN0YW5jZXMgd2l0aCBhIHNtYWxsIG51bWJlcgorICogb2YgbWFwcGluZ3MuIFRoZSBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgdGhlIGZpcnN0IHtAY29kZSBrfSBtYXBwaW5ncyBpbiBhbgorICogYXJyYXkgZm9yIGEgY29uZmlndXJhYmxlIHZhbHVlIG9mIHtAY29kZSBrfSwgYWxsb3dpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUKKyAqIGNvcnJlc3BvbmRpbmcge0Bjb2RlIEVudHJ5fXMgd2l0aG91dCB0aGUgbmVlZCB0byBjcmVhdGUgYW4gSXRlcmF0b3IuIFRoZQorICogcmVtYWluaW5nIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBhbiBvdmVyZmxvdyBtYXAuIEl0ZXJhdGlvbiBvdmVyIHRoZSBlbnRyaWVzCisgKiBpbiB0aGUgbWFwIHNob3VsZCBiZSBkb25lIGFzIGZvbGxvd3M6CisgKgorICogPHByZT4gICB7QGNvZGUKKyAqIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRNYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgeworICogICBwcm9jZXNzKGZpZWxkTWFwLmdldEFycmF5RW50cnlBdChpKSk7CisgKiB9CisgKiBmb3IgKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA6IGZpZWxkTWFwLmdldE92ZXJmbG93RW50cmllcygpKSB7CisgKiAgIHByb2Nlc3MoZW50cnkpOworICogfQorICogfTwvcHJlPgorICoKKyAqIFRoZSByZXN1bHRpbmcgaXRlcmF0aW9uIGlzIGluIG9yZGVyIG9mIGFzY2VuZGluZyBmaWVsZCB0YWcgbnVtYmVyLiBUaGUKKyAqIG9iamVjdCByZXR1cm5lZCBieSB7QGxpbmsgI2VudHJ5U2V0KCl9IGFkaGVyZXMgdG8gdGhlIHNhbWUgY29udHJhY3QgYnV0IGlzCisgKiBsZXNzIGVmZmljaWVudCBhcyBpdCBuZWNlc3NhcmlseSBpbnZvbHZlcyBjcmVhdGluZyBhbiBvYmplY3QgZm9yIGl0ZXJhdGlvbi4KKyAqIDxwPgorICogVGhlIHRyYWRlb2ZmIGZvciB0aGlzIG1lbW9yeSBlZmZpY2llbmN5IGlzIHRoYXQgdGhlIHdvcnN0IGNhc2UgcnVubmluZyB0aW1lCisgKiBvZiB0aGUge0Bjb2RlIHB1dCgpfSBvcGVyYXRpb24gaXMge0Bjb2RlIE8oayArIGxnIG4pfSwgd2hpY2ggaGFwcGVucyB3aGVuCisgKiBlbnRyaWVzIGFyZSBhZGRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyLiB7QGNvZGUga30gc2hvdWxkIGJlIGNob3NlbiBzdWNoIHRoYXQKKyAqIGl0IGNvdmVycyBlbm91Z2ggY29tbW9uIGNhc2VzIHdpdGhvdXQgYWR2ZXJzZWx5IGFmZmVjdGluZyBsYXJnZXIgbWFwcy4gSW4KKyAqIHByYWN0aWNlLCB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbyBkb2VzIG5vdCBoYXBwZW4gZm9yIGV4dGVuc2lvbnMgYmVjYXVzZQorICogZXh0ZW5zaW9uIGZpZWxkcyBhcmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIGluIG9yZGVyIG9mIGFzY2VuZGluZyB0YWcKKyAqIG51bWJlciwgYnV0IHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvIGNhbiBoYXBwZW4gZm9yIER5bmFtaWNNZXNzYWdlcy4KKyAqIDxwPgorICogVGhlIHJ1bm5pbmcgdGltZSBmb3IgYWxsIG90aGVyIG9wZXJhdGlvbnMgaXMgc2ltaWxhciB0byB0aGF0IG9mCisgKiB7QGNvZGUgVHJlZU1hcH0uCisgKiA8cD4KKyAqIEluc3RhbmNlcyBhcmUgbm90IHRocmVhZC1zYWZlIHVudGlsIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBpcyBjYWxsZWQsCisgKiBhZnRlciB3aGljaCBhbnkgbW9kaWZ5aW5nIG9wZXJhdGlvbiB3aWxsIHJlc3VsdCBpbiBhbgorICoge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAqCisgKiBAYXV0aG9yIGRhcmlja0Bnb29nbGUuY29tIERhcmljayBUb25nCisgKi8KKy8vIFRoaXMgY2xhc3MgaXMgZmluYWwgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBpcworLy8gcHJpdmF0ZS4gSG93ZXZlciwgdGhlIEZpZWxkRGVzY3JpcHRvci1zcGVjaWZpYyBsb2dpYyBpcyBlbmNhcHN1bGF0ZWQgaW4KKy8vIGEgc3ViY2xhc3MgdG8gYWlkIHRlc3RhYmlsaXR5IG9mIHRoZSBjb3JlIGxvZ2ljLgorY2xhc3MgU21hbGxTb3J0ZWRNYXA8SyBleHRlbmRzIENvbXBhcmFibGU8Sz4sIFY+IGV4dGVuZHMgQWJzdHJhY3RNYXA8SywgVj4geworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZvciBtYXBwaW5nIEZpZWxkRGVzY3JpcHRvcnMgdG8gdGhlaXIgdmFsdWVzLgorICAgKiBUaGUge0BsaW5rICNtYWtlSW1tdXRhYmxlKCl9IGltcGxlbWVudGF0aW9uIHdpbGwgY29udmVydCB0aGUgTGlzdCB2YWx1ZXMKKyAgICogb2YgYW55IHJlcGVhdGVkIGZpZWxkcyB0byB1bm1vZGlmaWFibGUgbGlzdHMuCisgICAqCisgICAqIEBwYXJhbSBhcnJheVNpemUgVGhlIHNpemUgb2YgdGhlIGVudHJ5IGFycmF5IGNvbnRhaW5pbmcgdGhlCisgICAqICAgICAgICBsZXhpY29ncmFwaGljYWxseSBzbWFsbGVzdCBtYXBwaW5ncy4KKyAgICovCisgIHN0YXRpYyA8RmllbGREZXNjcmlwdG9yVHlwZSBleHRlbmRzCisgICAgICBGaWVsZFNldC5GaWVsZERlc2NyaXB0b3JMaXRlPEZpZWxkRGVzY3JpcHRvclR5cGU+PgorICAgICAgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBuZXdGaWVsZE1hcChpbnQgYXJyYXlTaXplKSB7CisgICAgcmV0dXJuIG5ldyBTbWFsbFNvcnRlZE1hcDxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+KGFycmF5U2l6ZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIHB1YmxpYyB2b2lkIG1ha2VJbW11dGFibGUoKSB7CisgICAgICAgIGlmICghaXNJbW11dGFibGUoKSkgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgPQorICAgICAgICAgICAgICAgIGdldEFycmF5RW50cnlBdChpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgICAgZmluYWwgTGlzdCB2YWx1ZSA9IChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICAgICAgICAgIGdldE92ZXJmbG93RW50cmllcygpKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICAgIGZpbmFsIExpc3QgdmFsdWUgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5tYWtlSW1tdXRhYmxlKCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZvciB0ZXN0aW5nLgorICAgKgorICAgKiBAcGFyYW0gYXJyYXlTaXplIFRoZSBzaXplIG9mIHRoZSBlbnRyeSBhcnJheSBjb250YWluaW5nIHRoZQorICAgKiAgICAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlc3QgbWFwcGluZ3MuCisgICAqLworICBzdGF0aWMgPEsgZXh0ZW5kcyBDb21wYXJhYmxlPEs+LCBWPiBTbWFsbFNvcnRlZE1hcDxLLCBWPiBuZXdJbnN0YW5jZUZvclRlc3QoCisgICAgICBpbnQgYXJyYXlTaXplKSB7CisgICAgcmV0dXJuIG5ldyBTbWFsbFNvcnRlZE1hcDxLLCBWPihhcnJheVNpemUpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4QXJyYXlTaXplOworICAvLyBUaGUgImVudHJ5IGFycmF5IiBpcyBhY3R1YWxseSBhIExpc3QgYmVjYXVzZSBnZW5lcmljIGFycmF5cyBhcmUgbm90CisgIC8vIGFsbG93ZWQuIEFycmF5TGlzdCBhbHNvIG5pY2VseSBoYW5kbGVzIHRoZSBlbnRyeSBzaGlmdGluZyBvbiBpbnNlcnRzIGFuZAorICAvLyByZW1vdmVzLgorICBwcml2YXRlIExpc3Q8RW50cnk+IGVudHJ5TGlzdDsKKyAgcHJpdmF0ZSBNYXA8SywgVj4gb3ZlcmZsb3dFbnRyaWVzOworICBwcml2YXRlIGJvb2xlYW4gaXNJbW11dGFibGU7CisgIC8vIFRoZSBFbnRyeVNldCBpcyBhIHN0YXRlbGVzcyB2aWV3IG9mIHRoZSBNYXAuIEl0J3MgaW5pdGlhbGl6ZWQgdGhlIGZpcnN0CisgIC8vIHRpbWUgaXQgaXMgcmVxdWVzdGVkIGFuZCByZXVzZWQgaGVuY2Vmb3J0aC4KKyAgcHJpdmF0ZSB2b2xhdGlsZSBFbnRyeVNldCBsYXp5RW50cnlTZXQ7CisKKyAgLyoqCisgICAqIEBjb2RlIGFycmF5U2l6ZSBTaXplIG9mIHRoZSBhcnJheSBpbiB3aGljaCB0aGUgbGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlc3QKKyAgICogICAgICAgbWFwcGluZ3MgYXJlIHN0b3JlZC4gKGkuZS4gdGhlIHtAY29kZSBrfSByZWZlcnJlZCB0byBpbiB0aGUgY2xhc3MKKyAgICogICAgICAgZG9jdW1lbnRhdGlvbikuCisgICAqLworICBwcml2YXRlIFNtYWxsU29ydGVkTWFwKGludCBhcnJheVNpemUpIHsKKyAgICB0aGlzLm1heEFycmF5U2l6ZSA9IGFycmF5U2l6ZTsKKyAgICB0aGlzLmVudHJ5TGlzdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIHRoaXMub3ZlcmZsb3dFbnRyaWVzID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgfQorCisgIC8qKiBNYWtlIHRoaXMgbWFwIGltbXV0YWJsZSBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZC4gKi8KKyAgcHVibGljIHZvaWQgbWFrZUltbXV0YWJsZSgpIHsKKyAgICBpZiAoIWlzSW1tdXRhYmxlKSB7CisgICAgICAvLyBOb3RlOiBUaGVyZSdzIG5vIG5lZWQgdG8gd3JhcCB0aGUgZW50cnlMaXN0IGluIGFuIHVubW9kaWZpYWJsZUxpc3QKKyAgICAgIC8vIGJlY2F1c2Ugbm9uZSBvZiB0aGUgbGlzdCdzIGFjY2Vzc29ycyBhcmUgZXhwb3NlZC4gVGhlIGl0ZXJhdG9yKCkgb2YKKyAgICAgIC8vIG92ZXJmbG93RW50cmllcywgb24gdGhlIG90aGVyIGhhbmQsIGlzIGV4cG9zZWQgc28gaXQgbXVzdCBiZSBtYWRlCisgICAgICAvLyB1bm1vZGlmaWFibGUuCisgICAgICBvdmVyZmxvd0VudHJpZXMgPSBvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpID8KKyAgICAgICAgICBDb2xsZWN0aW9ucy48SywgVj5lbXB0eU1hcCgpIDoKKyAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAob3ZlcmZsb3dFbnRyaWVzKTsKKyAgICAgIGlzSW1tdXRhYmxlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvKiogQHJldHVybiBXaGV0aGVyIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBoYXMgYmVlbiBjYWxsZWQuICovCisgIHB1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlKCkgeworICAgIHJldHVybiBpc0ltbXV0YWJsZTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZW50cnkgYXJyYXkuICovCisgIHB1YmxpYyBpbnQgZ2V0TnVtQXJyYXlFbnRyaWVzKCkgeworICAgIHJldHVybiBlbnRyeUxpc3Quc2l6ZSgpOworICB9CisKKyAgLyoqIEByZXR1cm4gVGhlIGFycmF5IGVudHJ5IGF0IHRoZSBnaXZlbiB7QGNvZGUgaW5kZXh9LiAqLworICBwdWJsaWMgTWFwLkVudHJ5PEssIFY+IGdldEFycmF5RW50cnlBdChpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gZW50cnlMaXN0LmdldChpbmRleCk7CisgIH0KKworICAvKiogQHJldHVybiBUaGVyZSBudW1iZXIgb2Ygb3ZlcmZsb3cgZW50cmllcy4gKi8KKyAgcHVibGljIGludCBnZXROdW1PdmVyZmxvd0VudHJpZXMoKSB7CisgICAgcmV0dXJuIG92ZXJmbG93RW50cmllcy5zaXplKCk7CisgIH0KKworICAvKiogQHJldHVybiBBbiBpdGVyYWJsZSBvdmVyIHRoZSBvdmVyZmxvdyBlbnRyaWVzLiAqLworICBwdWJsaWMgSXRlcmFibGU8TWFwLkVudHJ5PEssIFY+PiBnZXRPdmVyZmxvd0VudHJpZXMoKSB7CisgICAgcmV0dXJuIG92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkgPworICAgICAgICBFbXB0eVNldC48TWFwLkVudHJ5PEssIFY+Pml0ZXJhYmxlKCkgOgorICAgICAgICBvdmVyZmxvd0VudHJpZXMuZW50cnlTZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgcmV0dXJuIGVudHJ5TGlzdC5zaXplKCkgKyBvdmVyZmxvd0VudHJpZXMuc2l6ZSgpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYSB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBhbgorICAgKiBvYmplY3Qgb2YgdHlwZSB7QGNvZGUgS30uCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3QgbykgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGZpbmFsIEsga2V5ID0gKEspIG87CisgICAgcmV0dXJuIGJpbmFyeVNlYXJjaEluQXJyYXkoa2V5KSA+PSAwIHx8IG92ZXJmbG93RW50cmllcy5jb250YWluc0tleShrZXkpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYSB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBhbgorICAgKiBvYmplY3Qgb2YgdHlwZSB7QGNvZGUgS30uCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgViBnZXQoT2JqZWN0IG8pIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBmaW5hbCBLIGtleSA9IChLKSBvOworICAgIGZpbmFsIGludCBpbmRleCA9IGJpbmFyeVNlYXJjaEluQXJyYXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgcmV0dXJuIGVudHJ5TGlzdC5nZXQoaW5kZXgpLmdldFZhbHVlKCk7CisgICAgfQorICAgIHJldHVybiBvdmVyZmxvd0VudHJpZXMuZ2V0KGtleSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFYgcHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgZmluYWwgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoSW5BcnJheShrZXkpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGFycmF5IGVudHJ5LgorICAgICAgcmV0dXJuIGVudHJ5TGlzdC5nZXQoaW5kZXgpLnNldFZhbHVlKHZhbHVlKTsKKyAgICB9CisgICAgZW5zdXJlRW50cnlBcnJheU11dGFibGUoKTsKKyAgICBmaW5hbCBpbnQgaW5zZXJ0aW9uUG9pbnQgPSAtKGluZGV4ICsgMSk7CisgICAgaWYgKGluc2VydGlvblBvaW50ID49IG1heEFycmF5U2l6ZSkgeworICAgICAgLy8gUHV0IGRpcmVjdGx5IGluIG92ZXJmbG93LgorICAgICAgcmV0dXJuIGdldE92ZXJmbG93RW50cmllc011dGFibGUoKS5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorICAgIC8vIEluc2VydCBuZXcgRW50cnkgaW4gYXJyYXkuCisgICAgaWYgKGVudHJ5TGlzdC5zaXplKCkgPT0gbWF4QXJyYXlTaXplKSB7CisgICAgICAvLyBTaGlmdCB0aGUgbGFzdCBhcnJheSBlbnRyeSBpbnRvIG92ZXJmbG93LgorICAgICAgZmluYWwgRW50cnkgbGFzdEVudHJ5SW5BcnJheSA9IGVudHJ5TGlzdC5yZW1vdmUobWF4QXJyYXlTaXplIC0gMSk7CisgICAgICBnZXRPdmVyZmxvd0VudHJpZXNNdXRhYmxlKCkucHV0KGxhc3RFbnRyeUluQXJyYXkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbnRyeUluQXJyYXkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIGVudHJ5TGlzdC5hZGQoaW5zZXJ0aW9uUG9pbnQsIG5ldyBFbnRyeShrZXksIHZhbHVlKSk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgaWYgKCFlbnRyeUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICBlbnRyeUxpc3QuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKCFvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpKSB7CisgICAgICBvdmVyZmxvd0VudHJpZXMuY2xlYXIoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVGhlIGltcGxlbWVudGF0aW9uIHRocm93cyBhIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIG8gaXMgbm90IGFuCisgICAqIG9iamVjdCBvZiB0eXBlIHtAY29kZSBLfS4KKyAgICoKKyAgICoge0Bpbmhlcml0RG9jfQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBWIHJlbW92ZShPYmplY3QgbykgeworICAgIGNoZWNrTXV0YWJsZSgpOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGZpbmFsIEsga2V5ID0gKEspIG87CisgICAgZmluYWwgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoSW5BcnJheShrZXkpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICByZXR1cm4gcmVtb3ZlQXJyYXlFbnRyeUF0KGluZGV4KTsKKyAgICB9CisgICAgLy8gb3ZlcmZsb3dFbnRyaWVzIG1pZ2h0IGJlIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCgpLCBzbyBvbmx5CisgICAgLy8gY2FsbCByZW1vdmUoKSBpZiBpdCBpcyBub24tZW1wdHkuCisgICAgaWYgKG92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gb3ZlcmZsb3dFbnRyaWVzLnJlbW92ZShrZXkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgViByZW1vdmVBcnJheUVudHJ5QXQoaW50IGluZGV4KSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgZmluYWwgViByZW1vdmVkID0gZW50cnlMaXN0LnJlbW92ZShpbmRleCkuZ2V0VmFsdWUoKTsKKyAgICBpZiAoIW92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkpIHsKKyAgICAgIC8vIFNoaWZ0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgb3ZlcmZsb3cgdG8gYmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlCisgICAgICAvLyBhcnJheS4KKyAgICAgIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gaXRlcmF0b3IgPQorICAgICAgICAgIGdldE92ZXJmbG93RW50cmllc011dGFibGUoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICBlbnRyeUxpc3QuYWRkKG5ldyBFbnRyeShpdGVyYXRvci5uZXh0KCkpKTsKKyAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVtb3ZlZDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gZmluZCBpbiB0aGUgZW50cnkgYXJyYXkuCisgICAqIEByZXR1cm4gVGhlIHJldHVybmVkIGludGVnZXIgcG9zaXRpb24gZm9sbG93cyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlCisgICAqICAgICB2YWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgamF2YS51dGlsLkFycmF5cyNiaW5hcnlTZWFyY2goKX0uCisgICAqLworICBwcml2YXRlIGludCBiaW5hcnlTZWFyY2hJbkFycmF5KEsga2V5KSB7CisgICAgaW50IGxlZnQgPSAwOworICAgIGludCByaWdodCA9IGVudHJ5TGlzdC5zaXplKCkgLSAxOworCisgICAgLy8gT3B0aW1pemF0aW9uOiBGb3IgdGhlIGNvbW1vbiBjYXNlIGluIHdoaWNoIGVudHJpZXMgYXJlIGFkZGVkIGluCisgICAgLy8gYXNjZW5kaW5nIHRhZyBvcmRlciwgY2hlY2sgdGhlIGxhcmdlc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgYmVmb3JlCisgICAgLy8gZG9pbmcgYSBmdWxsIGJpbmFyeSBzZWFyY2guCisgICAgaWYgKHJpZ2h0ID49IDApIHsKKyAgICAgIGludCBjbXAgPSBrZXkuY29tcGFyZVRvKGVudHJ5TGlzdC5nZXQocmlnaHQpLmdldEtleSgpKTsKKyAgICAgIGlmIChjbXAgPiAwKSB7CisgICAgICAgIHJldHVybiAtKHJpZ2h0ICsgMik7ICAvLyBJbnNlcnQgcG9pbnQgaXMgYWZ0ZXIgInJpZ2h0Ii4KKyAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0OworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChsZWZ0IDw9IHJpZ2h0KSB7CisgICAgICBpbnQgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgaW50IGNtcCA9IGtleS5jb21wYXJlVG8oZW50cnlMaXN0LmdldChtaWQpLmdldEtleSgpKTsKKyAgICAgIGlmIChjbXAgPCAwKSB7CisgICAgICAgIHJpZ2h0ID0gbWlkIC0gMTsKKyAgICAgIH0gZWxzZSBpZiAoY21wID4gMCkgeworICAgICAgICBsZWZ0ID0gbWlkICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtaWQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtKGxlZnQgKyAxKTsKKyAgfQorCisgIC8qKgorICAgKiBTaW1pbGFyIHRvIHRoZSBBYnN0cmFjdE1hcCBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUga2V5U2V0KCl9IGFuZAorICAgKiB7QGNvZGUgdmFsdWVzKCl9LCB0aGUgZW50cnkgc2V0IGlzIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMKKyAgICogY2FsbGVkLCBhbmQgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gYWxsIHN1YnNlcXVlbnQgY2FsbHMuCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CisgICAgaWYgKGxhenlFbnRyeVNldCA9PSBudWxsKSB7CisgICAgICBsYXp5RW50cnlTZXQgPSBuZXcgRW50cnlTZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIGxhenlFbnRyeVNldDsKKyAgfQorCisgIC8qKgorICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBoYXMKKyAgICogICAgICAgICBoYXMgYmVlbiBjYWxsZWQuCisgICAqLworICBwcml2YXRlIHZvaWQgY2hlY2tNdXRhYmxlKCkgeworICAgIGlmIChpc0ltbXV0YWJsZSkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYSB7QGxpbmsgU29ydGVkTWFwfSB0byB3aGljaCBvdmVyZmxvdyBlbnRyaWVzIG1hcHBpbmdzIGNhbiBiZQorICAgKiAgICAgICAgIGFkZGVkIG9yIHJlbW92ZWQuCisgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYge0BsaW5rICNtYWtlSW1tdXRhYmxlKCl9IGhhcyBiZWVuCisgICAqICAgICAgICAgY2FsbGVkLgorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgU29ydGVkTWFwPEssIFY+IGdldE92ZXJmbG93RW50cmllc011dGFibGUoKSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgaWYgKG92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkgJiYgIShvdmVyZmxvd0VudHJpZXMgaW5zdGFuY2VvZiBUcmVlTWFwKSkgeworICAgICAgb3ZlcmZsb3dFbnRyaWVzID0gbmV3IFRyZWVNYXA8SywgVj4oKTsKKyAgICB9CisgICAgcmV0dXJuIChTb3J0ZWRNYXA8SywgVj4pIG92ZXJmbG93RW50cmllczsKKyAgfQorCisgIC8qKgorICAgKiBMYXppbHkgY3JlYXRlcyB0aGUgZW50cnkgbGlzdC4gQW55IGNvZGUgdGhhdCBhZGRzIHRvIHRoZSBsaXN0IG11c3QgZmlyc3QKKyAgICogY2FsbCB0aGlzIG1ldGhvZC4KKyAgICovCisgIHByaXZhdGUgdm9pZCBlbnN1cmVFbnRyeUFycmF5TXV0YWJsZSgpIHsKKyAgICBjaGVja011dGFibGUoKTsKKyAgICBpZiAoZW50cnlMaXN0LmlzRW1wdHkoKSAmJiAhKGVudHJ5TGlzdCBpbnN0YW5jZW9mIEFycmF5TGlzdCkpIHsKKyAgICAgIGVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KG1heEFycmF5U2l6ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVudHJ5IGltcGxlbWVudGF0aW9uIHRoYXQgaW1wbGVtZW50cyBDb21wYXJhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQKKyAgICogYmluYXJ5IHNlYXJjaCB3aXRoaW4gdGhlIGVudHJ5IGFycmF5LiBBbHNvIGNoZWNrcyBtdXRhYmlsaXR5IGluCisgICAqIHtAbGluayAjc2V0VmFsdWUoKX0uCisgICAqLworICBwcml2YXRlIGNsYXNzIEVudHJ5IGltcGxlbWVudHMgTWFwLkVudHJ5PEssIFY+LCBDb21wYXJhYmxlPEVudHJ5PiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEsga2V5OworICAgIHByaXZhdGUgViB2YWx1ZTsKKworICAgIEVudHJ5KE1hcC5FbnRyeTxLLCBWPiBjb3B5KSB7CisgICAgICB0aGlzKGNvcHkuZ2V0S2V5KCksIGNvcHkuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgRW50cnkoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBLIGdldEtleSgpIHsKKyAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIGludCBjb21wYXJlVG8oRW50cnkgb3RoZXIpIHsKKyAgICAgIHJldHVybiBnZXRLZXkoKS5jb21wYXJlVG8ob3RoZXIuZ2V0S2V5KCkpOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBWIHNldFZhbHVlKFYgbmV3VmFsdWUpIHsKKyAgICAgIGNoZWNrTXV0YWJsZSgpOworICAgICAgZmluYWwgViBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7CisgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICBpZiAobyA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBNYXAuRW50cnk8PywgPz4gb3RoZXIgPSAoTWFwLkVudHJ5PD8sID8+KSBvOworICAgICAgcmV0dXJuIGVxdWFscyhrZXksIG90aGVyLmdldEtleSgpKSAmJiBlcXVhbHModmFsdWUsIG90aGVyLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gKGtleSA9PSBudWxsID8gMCA6IGtleS5oYXNoQ29kZSgpKSBeCisgICAgICAgICAgKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBrZXkgKyAiPSIgKyB2YWx1ZTsKKyAgICB9CisKKyAgICAvKiogZXF1YWxzKCkgdGhhdCBoYW5kbGVzIG51bGwgdmFsdWVzLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgIHJldHVybiBvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFN0YXRlbGVzcyB2aWV3IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBmaWVsZCBtYXAuCisgICAqLworICBwcml2YXRlIGNsYXNzIEVudHJ5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQ8TWFwLkVudHJ5PEssIFY+PiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiBpdGVyYXRvcigpIHsKKyAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgIHJldHVybiBTbWFsbFNvcnRlZE1hcC50aGlzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBvZiB0aGUgZXhwZWN0ZWQgdHlwZS4KKyAgICAgKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBmaW5hbCBNYXAuRW50cnk8SywgVj4gZW50cnkgPSAoTWFwLkVudHJ5PEssIFY+KSBvOworICAgICAgZmluYWwgViBleGlzdGluZyA9IGdldChlbnRyeS5nZXRLZXkoKSk7CisgICAgICBmaW5hbCBWIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgIHJldHVybiBleGlzdGluZyA9PSB2YWx1ZSB8fAorICAgICAgICAgIChleGlzdGluZyAhPSBudWxsICYmIGV4aXN0aW5nLmVxdWFscyh2YWx1ZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFkZChNYXAuRW50cnk8SywgVj4gZW50cnkpIHsKKyAgICAgIGlmICghY29udGFpbnMoZW50cnkpKSB7CisgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyBhIHtAbGluayBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIG8gaXMgbm90IG9mIHRoZSBleHBlY3RlZCB0eXBlLgorICAgICAqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBmaW5hbCBNYXAuRW50cnk8SywgVj4gZW50cnkgPSAoTWFwLkVudHJ5PEssIFY+KSBvOworICAgICAgaWYgKGNvbnRhaW5zKGVudHJ5KSkgeworICAgICAgICBTbWFsbFNvcnRlZE1hcC50aGlzLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgU21hbGxTb3J0ZWRNYXAudGhpcy5jbGVhcigpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiB0aGF0IHN3aXRjaGVzIGZyb20gdGhlIGVudHJ5IGFycmF5IHRvIHRoZSBvdmVyZmxvdworICAgKiBlbnRyaWVzIGFwcHJvcHJpYXRlbHkuCisgICAqLworICBwcml2YXRlIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IHsKKworICAgIHByaXZhdGUgaW50IHBvcyA9IC0xOworICAgIHByaXZhdGUgYm9vbGVhbiBuZXh0Q2FsbGVkQmVmb3JlUmVtb3ZlOworICAgIHByaXZhdGUgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiBsYXp5T3ZlcmZsb3dJdGVyYXRvcjsKKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICByZXR1cm4gKHBvcyArIDEpIDwgZW50cnlMaXN0LnNpemUoKSB8fAorICAgICAgICAgIGdldE92ZXJmbG93SXRlcmF0b3IoKS5oYXNOZXh0KCk7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIE1hcC5FbnRyeTxLLCBWPiBuZXh0KCkgeworICAgICAgbmV4dENhbGxlZEJlZm9yZVJlbW92ZSA9IHRydWU7CisgICAgICAvLyBBbHdheXMgaW5jcmVtZW50IHBvcyBzbyB0aGF0IHdlIGtub3cgd2hldGhlciB0aGUgbGFzdCByZXR1cm5lZCB2YWx1ZQorICAgICAgLy8gd2FzIGZyb20gdGhlIGFycmF5IG9yIGZyb20gb3ZlcmZsb3cuCisgICAgICBpZiAoKytwb3MgPCBlbnRyeUxpc3Quc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBlbnRyeUxpc3QuZ2V0KHBvcyk7CisgICAgICB9CisgICAgICByZXR1cm4gZ2V0T3ZlcmZsb3dJdGVyYXRvcigpLm5leHQoKTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICBpZiAoIW5leHRDYWxsZWRCZWZvcmVSZW1vdmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicmVtb3ZlKCkgd2FzIGNhbGxlZCBiZWZvcmUgbmV4dCgpIik7CisgICAgICB9CisgICAgICBuZXh0Q2FsbGVkQmVmb3JlUmVtb3ZlID0gZmFsc2U7CisgICAgICBjaGVja011dGFibGUoKTsKKworICAgICAgaWYgKHBvcyA8IGVudHJ5TGlzdC5zaXplKCkpIHsKKyAgICAgICAgcmVtb3ZlQXJyYXlFbnRyeUF0KHBvcy0tKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdldE92ZXJmbG93SXRlcmF0b3IoKS5yZW1vdmUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdCBpcyBpbXBvcnRhbnQgdG8gY3JlYXRlIHRoZSBvdmVyZmxvdyBpdGVyYXRvciBvbmx5IGFmdGVyIHRoZSBhcnJheQorICAgICAqIGVudHJpZXMgaGF2ZSBiZWVuIGl0ZXJhdGVkIG92ZXIgYmVjYXVzZSB0aGUgb3ZlcmZsb3cgZW50cnkgc2V0IGNoYW5nZXMKKyAgICAgKiB3aGVuIHRoZSBjbGllbnQgY2FsbHMgcmVtb3ZlKCkgb24gdGhlIGFycmF5IGVudHJpZXMsIHdoaWNoIGludmFsaWRhdGVzCisgICAgICogYW55IGV4aXN0aW5nIGl0ZXJhdG9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gZ2V0T3ZlcmZsb3dJdGVyYXRvcigpIHsKKyAgICAgIGlmIChsYXp5T3ZlcmZsb3dJdGVyYXRvciA9PSBudWxsKSB7CisgICAgICAgIGxhenlPdmVyZmxvd0l0ZXJhdG9yID0gb3ZlcmZsb3dFbnRyaWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBsYXp5T3ZlcmZsb3dJdGVyYXRvcjsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSGVscGVyIGNsYXNzIHRoYXQgaG9sZHMgaW1tdXRhYmxlIGluc3RhbmNlcyBvZiBhbiBJdGVyYWJsZS9JdGVyYXRvciB0aGF0CisgICAqIHdlIHJldHVybiB3aGVuIHRoZSBvdmVyZmxvdyBlbnRyaWVzIGlzIGVtcHR5LiBUaGlzIGVsaW1pbmF0ZXMgdGhlIGNyZWF0aW9uCisgICAqIG9mIGFuIEl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gaXRlcmF0ZSBvdmVyLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlTZXQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3I8T2JqZWN0PiBJVEVSQVRPUiA9IG5ldyBJdGVyYXRvcjxPYmplY3Q+KCkgeworICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8T2JqZWN0PiBJVEVSQUJMRSA9IG5ldyBJdGVyYWJsZTxPYmplY3Q+KCkgeworICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIElURVJBVE9SOworICAgICAgfQorICAgIH07CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKCkgeworICAgICAgcmV0dXJuIChJdGVyYWJsZTxUPikgSVRFUkFCTEU7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDYyODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXQuamF2YQpAQCAtMCwwICsxLDE1NTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBQcm92aWRlIHRleHQgcGFyc2luZyBhbmQgZm9ybWF0dGluZyBzdXBwb3J0IGZvciBwcm90bzIgaW5zdGFuY2VzLgorICogVGhlIGltcGxlbWVudGF0aW9uIGxhcmdlbHkgZm9sbG93cyBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MuCisgKgorICogQGF1dGhvciB3ZW5ib3pAZ29vZ2xlLmNvbSBXZW5ibyBaaHUKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXh0Rm9ybWF0IHsKKyAgcHJpdmF0ZSBUZXh0Rm9ybWF0KCkge30KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmludGVyIERFRkFVTFRfUFJJTlRFUiA9IG5ldyBQcmludGVyKCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByaW50ZXIgU0lOR0xFX0xJTkVfUFJJTlRFUiA9CisgICAgICAobmV3IFByaW50ZXIoKSkuc2V0U2luZ2xlTGluZU1vZGUodHJ1ZSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByaW50ZXIgVU5JQ09ERV9QUklOVEVSID0KKyAgICAgIChuZXcgUHJpbnRlcigpKS5zZXRFc2NhcGVOb25Bc2NpaShmYWxzZSk7CisKKyAgLyoqCisgICAqIE91dHB1dHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQcm90b2NvbCBNZXNzYWdlIHN1cHBsaWVkIGludG8KKyAgICogdGhlIHBhcmFtZXRlciBvdXRwdXQuIChUaGlzIHJlcHJlc2VudGF0aW9uIGlzIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUKKyAgICogY2xhc3NpYyAiUHJvdG9jb2xQcmludGVyIiBvdXRwdXQgZnJvbSB0aGUgb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVyIHN5c3RlbSkKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChmaW5hbCBNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UsIGZpbmFsIEFwcGVuZGFibGUgb3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBERUZBVUxUX1BSSU5URVIucHJpbnQobWVzc2FnZSwgbmV3IFRleHRHZW5lcmF0b3Iob3V0cHV0KSk7CisgIH0KKworICAvKiogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2Yge0Bjb2RlIGZpZWxkc30gdG8ge0Bjb2RlIG91dHB1dH0uICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChmaW5hbCBVbmtub3duRmllbGRTZXQgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIERFRkFVTFRfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoZmllbGRzLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmF0ZXMgYSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoaXMgbWVzc2FnZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kCisgICAqIG90aGVyIHB1cnBvc2VzLCB3aXRoIG5vIG5ld2xpbmUgY2hhcmFjdGVycy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0RGVidWdTdHJpbmcoZmluYWwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgU0lOR0xFX0xJTkVfUFJJTlRFUi5wcmludChtZXNzYWdlLCBuZXcgVGV4dEdlbmVyYXRvcihzYikpOworICAgICAgLy8gU2luZ2xlIGxpbmUgbW9kZSBjdXJyZW50bHkgbWlnaHQgaGF2ZSBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kLgorICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkudHJpbSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIHVua25vd24gZmllbGRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworICAgKiBhbmQgb3RoZXIgcHVycG9zZXMsIHdpdGggbm8gbmV3bGluZSBjaGFyYWN0ZXJzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnREZWJ1Z1N0cmluZyhmaW5hbCBVbmtub3duRmllbGRTZXQgZmllbGRzKSB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgU0lOR0xFX0xJTkVfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoZmllbGRzLCBuZXcgVGV4dEdlbmVyYXRvcihzYikpOworICAgICAgLy8gU2luZ2xlIGxpbmUgbW9kZSBjdXJyZW50bHkgbWlnaHQgaGF2ZSBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kLgorICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkudHJpbSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExpa2Uge0Bjb2RlIHByaW50KCl9LCBidXQgd3JpdGVzIGRpcmVjdGx5IHRvIGEge0Bjb2RlIFN0cmluZ30gYW5kCisgICAqIHJldHVybnMgaXQuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludFRvU3RyaW5nKGZpbmFsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgcHJpbnQobWVzc2FnZSwgdGV4dCk7CisgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExpa2Uge0Bjb2RlIHByaW50KCl9LCBidXQgd3JpdGVzIGRpcmVjdGx5IHRvIGEge0Bjb2RlIFN0cmluZ30gYW5kCisgICAqIHJldHVybnMgaXQuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludFRvU3RyaW5nKGZpbmFsIFVua25vd25GaWVsZFNldCBmaWVsZHMpIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIHByaW50KGZpZWxkcywgdGV4dCk7CisgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNhbWUgYXMge0Bjb2RlIHByaW50VG9TdHJpbmcoKX0sIGV4Y2VwdCB0aGF0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzCisgICAqIGluIHN0cmluZyB0eXBlIGZpZWxkcyBhcmUgbm90IGVzY2FwZWQgaW4gYmFja3NsYXNoK29jdGFscy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50VG9Vbmljb2RlU3RyaW5nKGZpbmFsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgVU5JQ09ERV9QUklOVEVSLnByaW50KG1lc3NhZ2UsIG5ldyBUZXh0R2VuZXJhdG9yKHRleHQpKTsKKyAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2FtZSBhcyB7QGNvZGUgcHJpbnRUb1N0cmluZygpfSwgZXhjZXB0IHRoYXQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKKyAgICogaW4gc3RyaW5nIHR5cGUgZmllbGRzIGFyZSBub3QgZXNjYXBlZCBpbiBiYWNrc2xhc2grb2N0YWxzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRUb1VuaWNvZGVTdHJpbmcoZmluYWwgVW5rbm93bkZpZWxkU2V0IGZpZWxkcykgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgVU5JQ09ERV9QUklOVEVSLnByaW50VW5rbm93bkZpZWxkcyhmaWVsZHMsIG5ldyBUZXh0R2VuZXJhdG9yKHRleHQpKTsKKyAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgREVGQVVMVF9QUklOVEVSLnByaW50RmllbGQoZmllbGQsIHZhbHVlLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50RmllbGRUb1N0cmluZyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIHByaW50RmllbGQoZmllbGQsIHZhbHVlLCB0ZXh0KTsKKyAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGdpdmVuIGZpZWxkIHZhbHVlLgorICAgKgorICAgKiBAcGFyYW0gZmllbGQgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkCisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCisgICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCB0byB3aGljaCB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCB2YWx1ZQorICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUKKyAgICogICAgIGdpdmVuIGZpZWxkIGRlc2NyaXB0b3IKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gd3JpdGluZyB0byB0aGUgb3V0cHV0CisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZFZhbHVlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBERUZBVUxUX1BSSU5URVIucHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgbmV3IFRleHRHZW5lcmF0b3Iob3V0cHV0KSk7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGFuIHVua25vd24gZmllbGQuCisgICAqCisgICAqIEBwYXJhbSB0YWcgdGhlIGZpZWxkJ3MgdGFnIG51bWJlcgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAorICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgdmFsdWUKKyAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlCisgICAqICAgICBnaXZlbiBmaWVsZCBkZXNjcmlwdG9yCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdyaXRpbmcgdG8gdGhlIG91dHB1dAorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VW5rbm93bkZpZWxkVmFsdWUoZmluYWwgaW50IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcmludFVua25vd25GaWVsZFZhbHVlKHRhZywgdmFsdWUsIG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVua25vd25GaWVsZFZhbHVlKGZpbmFsIGludCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6CisgICAgICAgIGdlbmVyYXRvci5wcmludCh1bnNpZ25lZFRvU3RyaW5nKChMb25nKSB2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgorICAgICAgICBnZW5lcmF0b3IucHJpbnQoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KChMb2NhbGUpIG51bGwsICIweCUwOHgiLCAoSW50ZWdlcikgdmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NDoKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KFN0cmluZy5mb3JtYXQoKExvY2FsZSkgbnVsbCwgIjB4JTAxNngiLCAoTG9uZykgdmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOworICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlQnl0ZXMoKEJ5dGVTdHJpbmcpIHZhbHVlKSk7CisgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6CisgICAgICAgIERFRkFVTFRfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoKFVua25vd25GaWVsZFNldCkgdmFsdWUsIGdlbmVyYXRvcik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHRhZzogIiArIHRhZyk7CisgICAgfQorICB9CisKKyAgLyoqIEhlbHBlciBjbGFzcyBmb3IgY29udmVydGluZyBwcm90b2J1ZnMgdG8gdGV4dC4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJpbnRlciB7CisgICAgLyoqIFdoZXRoZXIgdG8gb21pdCBuZXdsaW5lcyBmcm9tIHRoZSBvdXRwdXQuICovCisgICAgYm9vbGVhbiBzaW5nbGVMaW5lTW9kZSA9IGZhbHNlOworCisgICAgLyoqIFdoZXRoZXIgdG8gZXNjYXBlIG5vbiBBU0NJSSBjaGFyYWN0ZXJzIHdpdGggYmFja3NsYXNoIGFuZCBvY3RhbC4gKi8KKyAgICBib29sZWFuIGVzY2FwZU5vbkFzY2lpID0gdHJ1ZTsKKworICAgIHByaXZhdGUgUHJpbnRlcigpIHt9CisKKyAgICAvKiogU2V0dGVyIG9mIHNpbmdsZUxpbmVNb2RlICovCisgICAgcHJpdmF0ZSBQcmludGVyIHNldFNpbmdsZUxpbmVNb2RlKGJvb2xlYW4gc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgIHRoaXMuc2luZ2xlTGluZU1vZGUgPSBzaW5nbGVMaW5lTW9kZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKiBTZXR0ZXIgb2YgZXNjYXBlTm9uQXNjaWkgKi8KKyAgICBwcml2YXRlIFByaW50ZXIgc2V0RXNjYXBlTm9uQXNjaWkoYm9vbGVhbiBlc2NhcGVOb25Bc2NpaSkgeworICAgICAgdGhpcy5lc2NhcGVOb25Bc2NpaSA9IGVzY2FwZU5vbkFzY2lpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50KGZpbmFsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSwgZmluYWwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZmllbGQKKyAgICAgICAgICA6IG1lc3NhZ2UuZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgeworICAgICAgICBwcmludEZpZWxkKGZpZWxkLmdldEtleSgpLCBmaWVsZC5nZXRWYWx1ZSgpLCBnZW5lcmF0b3IpOworICAgICAgfQorICAgICAgcHJpbnRVbmtub3duRmllbGRzKG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLCBnZW5lcmF0b3IpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgT2JqZWN0IHZhbHVlLAorICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgLy8gUmVwZWF0ZWQgZmllbGQuICBQcmludCBlYWNoIGVsZW1lbnQuCisgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiAoTGlzdDw/PikgdmFsdWUpIHsKKyAgICAgICAgICBwcmludFNpbmdsZUZpZWxkKGZpZWxkLCBlbGVtZW50LCBnZW5lcmF0b3IpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludFNpbmdsZUZpZWxkKGZpZWxkLCB2YWx1ZSwgZ2VuZXJhdG9yKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRTaW5nbGVGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlsiKTsKKyAgICAgICAgLy8gV2Ugc3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQgZWxlbWVudHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuCisgICAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpCisgICAgICAgICAgICAmJiAoZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpCisgICAgICAgICAgICAmJiAoZmllbGQuaXNPcHRpb25hbCgpKQorICAgICAgICAgICAgLy8gb2JqZWN0IGVxdWFsaXR5CisgICAgICAgICAgICAmJiAoZmllbGQuZ2V0RXh0ZW5zaW9uU2NvcGUoKSA9PSBmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKSkgeworICAgICAgICAgIGdlbmVyYXRvci5wcmludChmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldEZ1bGxOYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci5wcmludChmaWVsZC5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3IucHJpbnQoIl0iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuR1JPVVApIHsKKyAgICAgICAgICAvLyBHcm91cHMgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggdGhlaXIgb3JpZ2luYWwgY2FwaXRhbGl6YXRpb24uCisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIiB7ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiIHtcbiIpOworICAgICAgICAgIGdlbmVyYXRvci5pbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KCI6ICIpOworICAgICAgfQorCisgICAgICBwcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCBnZW5lcmF0b3IpOworCisgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn0gIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLm91dGRlbnQoKTsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn1cbiIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRGaWVsZFZhbHVlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgSU5UMzI6CisgICAgICAgIGNhc2UgU0lOVDMyOgorICAgICAgICBjYXNlIFNGSVhFRDMyOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEludGVnZXIpIHZhbHVlKS50b1N0cmluZygpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOVDY0OgorICAgICAgICBjYXNlIFNJTlQ2NDoKKyAgICAgICAgY2FzZSBTRklYRUQ2NDoKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChMb25nKSB2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCT09MOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEJvb2xlYW4pIHZhbHVlKS50b1N0cmluZygpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEZsb2F0KSB2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCgoRG91YmxlKSB2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBVSU5UMzI6CisgICAgICAgIGNhc2UgRklYRUQzMjoKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQodW5zaWduZWRUb1N0cmluZygoSW50ZWdlcikgdmFsdWUpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgY2FzZSBGSVhFRDY0OgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCh1bnNpZ25lZFRvU3RyaW5nKChMb25nKSB2YWx1ZSkpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RSSU5HOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlTm9uQXNjaWkgPworICAgICAgICAgICAgICBlc2NhcGVUZXh0KChTdHJpbmcpIHZhbHVlKSA6CisgICAgICAgICAgICAgIChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCWVRFUzoKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7CisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGVzY2FwZUJ5dGVzKChCeXRlU3RyaW5nKSB2YWx1ZSkpOworICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCgoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpLmdldE5hbWUoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICBjYXNlIEdST1VQOgorICAgICAgICAgIHByaW50KChNZXNzYWdlKSB2YWx1ZSwgZ2VuZXJhdG9yKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRVbmtub3duRmllbGRzKGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgVW5rbm93bkZpZWxkU2V0LkZpZWxkPiBlbnRyeSA6CisgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLmFzTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICBmaW5hbCBpbnQgbnVtYmVyID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgIGZpbmFsIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgIHByaW50VW5rbm93bkZpZWxkKG51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgICAgICAgICBmaWVsZC5nZXRWYXJpbnRMaXN0KCksIGdlbmVyYXRvcik7CisgICAgICAgIHByaW50VW5rbm93bkZpZWxkKG51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLAorICAgICAgICAgICAgZmllbGQuZ2V0Rml4ZWQzMkxpc3QoKSwgZ2VuZXJhdG9yKTsKKyAgICAgICAgcHJpbnRVbmtub3duRmllbGQobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCisgICAgICAgICAgICBmaWVsZC5nZXRGaXhlZDY0TGlzdCgpLCBnZW5lcmF0b3IpOworICAgICAgICBwcmludFVua25vd25GaWVsZChudW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgICAgICAgIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKSwgZ2VuZXJhdG9yKTsKKyAgICAgICAgZm9yIChmaW5hbCBVbmtub3duRmllbGRTZXQgdmFsdWUgOiBmaWVsZC5nZXRHcm91cExpc3QoKSkgeworICAgICAgICAgIGdlbmVyYXRvci5wcmludChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiIHsgIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiIHtcbiIpOworICAgICAgICAgICAgZ2VuZXJhdG9yLmluZGVudCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludFVua25vd25GaWVsZHModmFsdWUsIGdlbmVyYXRvcik7CisgICAgICAgICAgaWYgKHNpbmdsZUxpbmVNb2RlKSB7CisgICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn0gIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5vdXRkZW50KCk7CisgICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn1cbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFVua25vd25GaWVsZChmaW5hbCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lyZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Pz4gdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoZmluYWwgT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgIGdlbmVyYXRvci5wcmludChTdHJpbmcudmFsdWVPZihudW1iZXIpKTsKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KCI6ICIpOworICAgICAgICBwcmludFVua25vd25GaWVsZFZhbHVlKHdpcmVUeXBlLCB2YWx1ZSwgZ2VuZXJhdG9yKTsKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KHNpbmdsZUxpbmVNb2RlID8gIiAiIDogIlxuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqIENvbnZlcnQgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgdG8gYSBzdHJpbmcuICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB1bnNpZ25lZFRvU3RyaW5nKGZpbmFsIGludCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA+PSAwKSB7CisgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKCgobG9uZykgdmFsdWUpICYgMHgwMDAwMDAwMEZGRkZGRkZGTCk7CisgICAgfQorICB9CisKKyAgLyoqIENvbnZlcnQgYW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgdG8gYSBzdHJpbmcuICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB1bnNpZ25lZFRvU3RyaW5nKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPj0gMCkgeworICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBQdWxsIG9mZiB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgc28gdGhhdCBCaWdJbnRlZ2VyIGRvZXNuJ3QgdGhpbmsKKyAgICAgIC8vIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUsIHRoZW4gc2V0IGl0IGFnYWluIHVzaW5nIHNldEJpdCgpLgorICAgICAgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZih2YWx1ZSAmIDB4N0ZGRkZGRkZGRkZGRkZGRkwpCisgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCaXQoNjMpLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFuIGlubmVyIGNsYXNzIGZvciB3cml0aW5nIHRleHQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0R2VuZXJhdG9yIHsKKyAgICBwcml2YXRlIGZpbmFsIEFwcGVuZGFibGUgb3V0cHV0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHByaXZhdGUgYm9vbGVhbiBhdFN0YXJ0T2ZMaW5lID0gdHJ1ZTsKKworICAgIHByaXZhdGUgVGV4dEdlbmVyYXRvcihmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkgeworICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kZW50IHRleHQgYnkgdHdvIHNwYWNlcy4gIEFmdGVyIGNhbGxpbmcgSW5kZW50KCksIHR3byBzcGFjZXMgd2lsbCBiZQorICAgICAqIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIG9mIHRleHQuICBJbmRlbnQoKSBtYXkgYmUgY2FsbGVkCisgICAgICogbXVsdGlwbGUgdGltZXMgdG8gcHJvZHVjZSBkZWVwZXIgaW5kZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmRlbnQoKSB7CisgICAgICBpbmRlbnQuYXBwZW5kKCIgICIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZHVjZXMgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIGJ5IHR3byBzcGFjZXMsIG9yIGNyYXNoZXMgaWYgdGhlIGluZGVudAorICAgICAqIGxldmVsIGlzIHplcm8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3V0ZGVudCgpIHsKKyAgICAgIGZpbmFsIGludCBsZW5ndGggPSBpbmRlbnQubGVuZ3RoKCk7CisgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICIgT3V0ZGVudCgpIHdpdGhvdXQgbWF0Y2hpbmcgSW5kZW50KCkuIik7CisgICAgICB9CisgICAgICBpbmRlbnQuZGVsZXRlKGxlbmd0aCAtIDIsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIGludCBzaXplID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgIGludCBwb3MgPSAwOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT0gJ1xuJykgeworICAgICAgICAgIHdyaXRlKHRleHQuc3ViU2VxdWVuY2UocG9zLCBzaXplKSwgaSAtIHBvcyArIDEpOworICAgICAgICAgIHBvcyA9IGkgKyAxOworICAgICAgICAgIGF0U3RhcnRPZkxpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICB3cml0ZSh0ZXh0LnN1YlNlcXVlbmNlKHBvcywgc2l6ZSksIHNpemUgLSBwb3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZShmaW5hbCBDaGFyU2VxdWVuY2UgZGF0YSwgZmluYWwgaW50IHNpemUpCisgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChhdFN0YXJ0T2ZMaW5lKSB7CisgICAgICAgIGF0U3RhcnRPZkxpbmUgPSBmYWxzZTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChpbmRlbnQpOworICAgICAgfQorICAgICAgb3V0cHV0LmFwcGVuZChkYXRhKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBQYXJzaW5nCisKKyAgLyoqCisgICAqIFJlcHJlc2VudHMgYSBzdHJlYW0gb2YgdG9rZW5zIHBhcnNlZCBmcm9tIGEge0Bjb2RlIFN0cmluZ30uCisgICAqCisgICAqIDxwPlRoZSBKYXZhIHN0YW5kYXJkIGxpYnJhcnkgcHJvdmlkZXMgbWFueSBjbGFzc2VzIHRoYXQgeW91IG1pZ2h0IHRoaW5rCisgICAqIHdvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHRoaXMsIGJ1dCBhcmVuJ3QuICBGb3IgZXhhbXBsZToKKyAgICoKKyAgICogPHVsPgorICAgKiA8bGk+e0Bjb2RlIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyfTogIFRoaXMgYWxtb3N0IGRvZXMgd2hhdCB3ZSB3YW50IC0tIG9yLAorICAgKiAgIGF0IGxlYXN0LCBzb21ldGhpbmcgdGhhdCB3b3VsZCBnZXQgdXMgY2xvc2UgdG8gd2hhdCB3ZSB3YW50IC0tIGV4Y2VwdAorICAgKiAgIGZvciBvbmUgZmF0YWwgZmxhdzogIEl0IGF1dG9tYXRpY2FsbHkgdW4tZXNjYXBlcyBzdHJpbmdzIHVzaW5nIEphdmEKKyAgICogICBlc2NhcGUgc2VxdWVuY2VzLCB3aGljaCBkbyBub3QgaW5jbHVkZSBhbGwgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgd2UKKyAgICogICBuZWVkIHRvIHN1cHBvcnQgKGUuZy4gJ1x4JykuCisgICAqIDxsaT57QGNvZGUgamF2YS51dGlsLlNjYW5uZXJ9OiAgVGhpcyBzZWVtcyBsaWtlIGEgZ3JlYXQgd2F5IGF0IGxlYXN0IHRvCisgICAqICAgcGFyc2UgcmVndWxhciBleHByZXNzaW9ucyBvdXQgb2YgYSBzdHJlYW0gKHNvIHdlIHdvdWxkbid0IGhhdmUgdG8gbG9hZAorICAgKiAgIHRoZSBlbnRpcmUgaW5wdXQgaW50byBhIHNpbmdsZSBzdHJpbmcgYmVmb3JlIHBhcnNpbmcpLiAgU2FkbHksCisgICAqICAge0Bjb2RlIFNjYW5uZXJ9IHJlcXVpcmVzIHRoYXQgdG9rZW5zIGJlIGRlbGltaXRlZCB3aXRoIHNvbWUgZGVsaW1pdGVyLgorICAgKiAgIFRodXMsIGFsdGhvdWdoIHRoZSB0ZXh0ICJmb286IiBzaG91bGQgcGFyc2UgdG8gdHdvIHRva2VucyAoImZvbyIgYW5kCisgICAqICAgIjoiKSwge0Bjb2RlIFNjYW5uZXJ9IHdvdWxkIHJlY29nbml6ZSBpdCBvbmx5IGFzIGEgc2luZ2xlIHRva2VuLgorICAgKiAgIEZ1cnRoZXJtb3JlLCB7QGNvZGUgU2Nhbm5lcn0gcHJvdmlkZXMgbm8gd2F5IHRvIGluc3BlY3QgdGhlIGNvbnRlbnRzCisgICAqICAgb2YgZGVsaW1pdGVycywgbWFraW5nIGl0IGltcG9zc2libGUgdG8ga2VlcCB0cmFjayBvZiBsaW5lIGFuZCBjb2x1bW4KKyAgICogICBudW1iZXJzLgorICAgKiA8L3VsPgorICAgKgorICAgKiA8cD5MdWNraWx5LCBKYXZhJ3MgcmVndWxhciBleHByZXNzaW9uIHN1cHBvcnQgZG9lcyBtYW5hZ2UgdG8gYmUgdXNlZnVsIHRvCisgICAqIHVzLiAgKEJhcmVseTogIFdlIG5lZWQge0Bjb2RlIE1hdGNoZXIudXNlUGF0dGVybigpfSwgd2hpY2ggaXMgbmV3IGluCisgICAqIEphdmEgMS41LikgIFNvLCB3ZSBjYW4gdXNlIHRoYXQsIGF0IGxlYXN0LiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpbXBsaWVzCisgICAqIHRoYXQgd2UgbmVlZCB0byBoYXZlIHRoZSBlbnRpcmUgaW5wdXQgaW4gb25lIGNvbnRpZ3VvdXMgc3RyaW5nLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVG9rZW5pemVyIHsKKyAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0OworICAgIHByaXZhdGUgZmluYWwgTWF0Y2hlciBtYXRjaGVyOworICAgIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRUb2tlbjsKKworICAgIC8vIFRoZSBjaGFyYWN0ZXIgaW5kZXggd2l0aGluIHRoaXMudGV4dCBhdCB3aGljaCB0aGUgY3VycmVudCB0b2tlbiBiZWdpbnMuCisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKworICAgIC8vIFRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBvZiB0aGUgY3VycmVudCB0b2tlbi4KKyAgICBwcml2YXRlIGludCBsaW5lID0gMDsKKyAgICBwcml2YXRlIGludCBjb2x1bW4gPSAwOworCisgICAgLy8gVGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIG9mIHRoZSBwcmV2aW91cyB0b2tlbiAoYWxsb3dzIHRocm93aW5nCisgICAgLy8gZXJyb3JzICphZnRlciogY29uc3VtaW5nKS4KKyAgICBwcml2YXRlIGludCBwcmV2aW91c0xpbmUgPSAwOworICAgIHByaXZhdGUgaW50IHByZXZpb3VzQ29sdW1uID0gMDsKKworICAgIC8vIFdlIHVzZSBwb3NzZXNzaXZlIHF1YW50aWZpZXJzICgqKyBhbmQgKyspIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBKYXZhCisgICAgLy8gcmVnZXggbWF0Y2hlciBoYXMgc3RhY2sgb3ZlcmZsb3dzIG9uIGxhcmdlIGlucHV0cy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFdISVRFU1BBQ0UgPQorICAgICAgUGF0dGVybi5jb21waWxlKCIoXFxzfCgjLiokKSkrKyIsIFBhdHRlcm4uTVVMVElMSU5FKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFRPS0VOID0gUGF0dGVybi5jb21waWxlKAorICAgICAgIlthLXpBLVpfXVswLTlhLXpBLVpfKy1dKit8IiArICAgICAgICAgICAgICAgIC8vIGFuIGlkZW50aWZpZXIKKyAgICAgICJbLl0/WzAtOSstXVswLTlhLXpBLVpfListXSorfCIgKyAgICAgICAgICAgICAvLyBhIG51bWJlcgorICAgICAgIlwiKFteXCJcblxcXFxdfFxcXFwuKSorKFwifFxcXFw/JCl8IiArICAgICAgIC8vIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcKKyAgICAgICJcJyhbXlwnXG5cXFxcXXxcXFxcLikqKyhcJ3xcXFxcPyQpIiwgICAgICAgICAvLyBhIHNpbmdsZS1xdW90ZWQgc3RyaW5nCisgICAgICBQYXR0ZXJuLk1VTFRJTElORSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIERPVUJMRV9JTkZJTklUWSA9IFBhdHRlcm4uY29tcGlsZSgKKyAgICAgICItP2luZihpbml0eSk/IiwKKyAgICAgIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGTE9BVF9JTkZJTklUWSA9IFBhdHRlcm4uY29tcGlsZSgKKyAgICAgICItP2luZihpbml0eSk/Zj8iLAorICAgICAgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEZMT0FUX05BTiA9IFBhdHRlcm4uY29tcGlsZSgKKyAgICAgICJuYW5mPyIsCisgICAgICBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOworCisgICAgLyoqIENvbnN0cnVjdCBhIHRva2VuaXplciB0aGF0IHBhcnNlcyB0b2tlbnMgZnJvbSB0aGUgZ2l2ZW4gdGV4dC4gKi8KKyAgICBwcml2YXRlIFRva2VuaXplcihmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgIHRoaXMubWF0Y2hlciA9IFdISVRFU1BBQ0UubWF0Y2hlcih0ZXh0KTsKKyAgICAgIHNraXBXaGl0ZXNwYWNlKCk7CisgICAgICBuZXh0VG9rZW4oKTsKKyAgICB9CisKKyAgICAvKiogQXJlIHdlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0PyAqLworICAgIHB1YmxpYyBib29sZWFuIGF0RW5kKCkgeworICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlbi5sZW5ndGgoKSA9PSAwOworICAgIH0KKworICAgIC8qKiBBZHZhbmNlIHRvIHRoZSBuZXh0IHRva2VuLiAqLworICAgIHB1YmxpYyB2b2lkIG5leHRUb2tlbigpIHsKKyAgICAgIHByZXZpb3VzTGluZSA9IGxpbmU7CisgICAgICBwcmV2aW91c0NvbHVtbiA9IGNvbHVtbjsKKworICAgICAgLy8gQWR2YW5jZSB0aGUgbGluZSBjb3VudGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgd2hpbGUgKHBvcyA8IG1hdGNoZXIucmVnaW9uU3RhcnQoKSkgeworICAgICAgICBpZiAodGV4dC5jaGFyQXQocG9zKSA9PSAnXG4nKSB7CisgICAgICAgICAgKytsaW5lOworICAgICAgICAgIGNvbHVtbiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytjb2x1bW47CisgICAgICAgIH0KKyAgICAgICAgKytwb3M7CisgICAgICB9CisKKyAgICAgIC8vIE1hdGNoIHRoZSBuZXh0IHRva2VuLgorICAgICAgaWYgKG1hdGNoZXIucmVnaW9uU3RhcnQoKSA9PSBtYXRjaGVyLnJlZ2lvbkVuZCgpKSB7CisgICAgICAgIC8vIEVPRgorICAgICAgICBjdXJyZW50VG9rZW4gPSAiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoZXIudXNlUGF0dGVybihUT0tFTik7CisgICAgICAgIGlmIChtYXRjaGVyLmxvb2tpbmdBdCgpKSB7CisgICAgICAgICAgY3VycmVudFRva2VuID0gbWF0Y2hlci5ncm91cCgpOworICAgICAgICAgIG1hdGNoZXIucmVnaW9uKG1hdGNoZXIuZW5kKCksIG1hdGNoZXIucmVnaW9uRW5kKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFRha2Ugb25lIGNoYXJhY3Rlci4KKyAgICAgICAgICBjdXJyZW50VG9rZW4gPSBTdHJpbmcudmFsdWVPZih0ZXh0LmNoYXJBdChwb3MpKTsKKyAgICAgICAgICBtYXRjaGVyLnJlZ2lvbihwb3MgKyAxLCBtYXRjaGVyLnJlZ2lvbkVuZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNraXBXaGl0ZXNwYWNlKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcCBvdmVyIGFueSB3aGl0ZXNwYWNlIHNvIHRoYXQgdGhlIG1hdGNoZXIgcmVnaW9uIHN0YXJ0cyBhdCB0aGUgbmV4dAorICAgICAqIHRva2VuLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBza2lwV2hpdGVzcGFjZSgpIHsKKyAgICAgIG1hdGNoZXIudXNlUGF0dGVybihXSElURVNQQUNFKTsKKyAgICAgIGlmIChtYXRjaGVyLmxvb2tpbmdBdCgpKSB7CisgICAgICAgIG1hdGNoZXIucmVnaW9uKG1hdGNoZXIuZW5kKCksIG1hdGNoZXIucmVnaW9uRW5kKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGV4YWN0bHkgbWF0Y2hlcyB7QGNvZGUgdG9rZW59LCBjb25zdW1lIGl0IGFuZCByZXR1cm4KKyAgICAgKiB7QGNvZGUgdHJ1ZX0uICBPdGhlcndpc2UsIHJldHVybiB7QGNvZGUgZmFsc2V9IHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdHJ5Q29uc3VtZShmaW5hbCBTdHJpbmcgdG9rZW4pIHsKKyAgICAgIGlmIChjdXJyZW50VG9rZW4uZXF1YWxzKHRva2VuKSkgeworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gZXhhY3RseSBtYXRjaGVzIHtAY29kZSB0b2tlbn0sIGNvbnN1bWUgaXQuICBPdGhlcndpc2UsCisgICAgICogdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnN1bWUoZmluYWwgU3RyaW5nIHRva2VuKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgaWYgKCF0cnlDb25zdW1lKHRva2VuKSkgeworICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbigiRXhwZWN0ZWQgXCIiICsgdG9rZW4gKyAiXCIuIik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gaW50ZWdlciwgYnV0IGRvZXMKKyAgICAgKiBub3QgY29uc3VtZSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBsb29raW5nQXRJbnRlZ2VyKCkgeworICAgICAgaWYgKGN1cnJlbnRUb2tlbi5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgZmluYWwgY2hhciBjID0gY3VycmVudFRva2VuLmNoYXJBdCgwKTsKKyAgICAgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICAgICAgYyA9PSAnLScgfHwgYyA9PSAnKyc7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gaWRlbnRpZmllciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KKyAgICAgKiBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbnN1bWVJZGVudGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudFRva2VuLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgZmluYWwgY2hhciBjID0gY3VycmVudFRva2VuLmNoYXJBdChpKTsKKyAgICAgICAgaWYgKCgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwKKyAgICAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwKKyAgICAgICAgICAgICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwKKyAgICAgICAgICAgIChjID09ICdfJykgfHwgKGMgPT0gJy4nKSkgeworICAgICAgICAgIC8vIE9LCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIGlkZW50aWZpZXIuIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGN1cnJlbnRUb2tlbjsKKyAgICAgIG5leHRUb2tlbigpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIDMyLWJpdCBzaWduZWQgaW50ZWdlciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cworICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGludCBjb25zdW1lSW50MzIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IHBhcnNlSW50MzIoY3VycmVudFRva2VuKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBpbnRlZ2VyUGFyc2VFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cworICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGludCBjb25zdW1lVUludDMyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBwYXJzZVVJbnQzMihjdXJyZW50VG9rZW4pOworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGludGVnZXJQYXJzZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cworICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgY29uc3VtZUludDY0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIGxvbmcgcmVzdWx0ID0gcGFyc2VJbnQ2NChjdXJyZW50VG9rZW4pOworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGludGVnZXJQYXJzZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzCisgICAgICogdmFsdWUuICBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBjb25zdW1lVUludDY0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIGxvbmcgcmVzdWx0ID0gcGFyc2VVSW50NjQoY3VycmVudFRva2VuKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBpbnRlZ2VyUGFyc2VFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBkb3VibGUsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCisgICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBjb25zdW1lRG91YmxlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8gcGFyc2UgaW5maW5pdHkgYW5kIG5hbiBzZXBhcmF0ZWx5IGJlY2F1c2UKKyAgICAgIC8vIERvdWJsZS5wYXJzZURvdWJsZSgpIGRvZXMgbm90IGFjY2VwdCAiaW5mIiwgImluZmluaXR5Iiwgb3IgIm5hbiIuCisgICAgICBpZiAoRE9VQkxFX0lORklOSVRZLm1hdGNoZXIoY3VycmVudFRva2VuKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBuZWdhdGl2ZSA9IGN1cnJlbnRUb2tlbi5zdGFydHNXaXRoKCItIik7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gbmVnYXRpdmUgPyBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkgOiBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFk7CisgICAgICB9CisgICAgICBpZiAoY3VycmVudFRva2VuLmVxdWFsc0lnbm9yZUNhc2UoIm5hbiIpKSB7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gRG91YmxlLk5hTjsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIGRvdWJsZSByZXN1bHQgPSBEb3VibGUucGFyc2VEb3VibGUoY3VycmVudFRva2VuKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBmbG9hdFBhcnNlRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZmxvYXQsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCisgICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGNvbnN1bWVGbG9hdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAvLyBXZSBuZWVkIHRvIHBhcnNlIGluZmluaXR5IGFuZCBuYW4gc2VwYXJhdGVseSBiZWNhdXNlCisgICAgICAvLyBGbG9hdC5wYXJzZUZsb2F0KCkgZG9lcyBub3QgYWNjZXB0ICJpbmYiLCAiaW5maW5pdHkiLCBvciAibmFuIi4KKyAgICAgIGlmIChGTE9BVF9JTkZJTklUWS5tYXRjaGVyKGN1cnJlbnRUb2tlbikubWF0Y2hlcygpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVnYXRpdmUgPSBjdXJyZW50VG9rZW4uc3RhcnRzV2l0aCgiLSIpOworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIG5lZ2F0aXZlID8gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkgOiBGbG9hdC5QT1NJVElWRV9JTkZJTklUWTsKKyAgICAgIH0KKyAgICAgIGlmIChGTE9BVF9OQU4ubWF0Y2hlcihjdXJyZW50VG9rZW4pLm1hdGNoZXMoKSkgeworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIEZsb2F0Lk5hTjsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIGZsb2F0IHJlc3VsdCA9IEZsb2F0LnBhcnNlRmxvYXQoY3VycmVudFRva2VuKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBmbG9hdFBhcnNlRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgYm9vbGVhbiwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KKyAgICAgKiBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb25zdW1lQm9vbGVhbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICBpZiAoY3VycmVudFRva2VuLmVxdWFscygidHJ1ZSIpIHx8CisgICAgICAgICAgY3VycmVudFRva2VuLmVxdWFscygidCIpIHx8CisgICAgICAgICAgY3VycmVudFRva2VuLmVxdWFscygiMSIpKSB7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoY3VycmVudFRva2VuLmVxdWFscygiZmFsc2UiKSB8fAorICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uZXF1YWxzKCJmIikgfHwKKyAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLmVxdWFscygiMCIpKSB7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbigiRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzICh1bmVzY2FwZWQpCisgICAgICogdmFsdWUuICBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbnN1bWVTdHJpbmcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgcmV0dXJuIGNvbnN1bWVCeXRlU3RyaW5nKCkudG9TdHJpbmdVdGY4KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBzdHJpbmcsIGNvbnN1bWUgaXQsIHVuZXNjYXBlIGl0IGFzIGEKKyAgICAgKiB7QGxpbmsgQnl0ZVN0cmluZ30sIGFuZCByZXR1cm4gaXQuICBPdGhlcndpc2UsIHRocm93IGEKKyAgICAgKiB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBCeXRlU3RyaW5nIGNvbnN1bWVCeXRlU3RyaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIExpc3Q8Qnl0ZVN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZVN0cmluZz4oKTsKKyAgICAgIGNvbnN1bWVCeXRlU3RyaW5nKGxpc3QpOworICAgICAgd2hpbGUgKGN1cnJlbnRUb2tlbi5zdGFydHNXaXRoKCInIikgfHwgY3VycmVudFRva2VuLnN0YXJ0c1dpdGgoIlwiIikpIHsKKyAgICAgICAgY29uc3VtZUJ5dGVTdHJpbmcobGlzdCk7CisgICAgICB9CisgICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShsaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjY29uc3VtZUJ5dGVTdHJpbmcoKX0gYnV0IGFkZHMgZWFjaCB0b2tlbiBvZiB0aGUgc3RyaW5nIHRvCisgICAgICogdGhlIGdpdmVuIGxpc3QuICBTdHJpbmcgbGl0ZXJhbHMgKHdoZXRoZXIgYnl0ZXMgb3IgdGV4dCkgbWF5IGNvbWUgaW4KKyAgICAgKiBtdWx0aXBsZSBhZGphY2VudCB0b2tlbnMgd2hpY2ggYXJlIGF1dG9tYXRpY2FsbHkgY29uY2F0ZW5hdGVkLCBsaWtlIGluCisgICAgICogQyBvciBQeXRob24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbnN1bWVCeXRlU3RyaW5nKExpc3Q8Qnl0ZVN0cmluZz4gbGlzdCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIGNoYXIgcXVvdGUgPSBjdXJyZW50VG9rZW4ubGVuZ3RoKCkgPiAwID8gY3VycmVudFRva2VuLmNoYXJBdCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnXDAnOworICAgICAgaWYgKHF1b3RlICE9ICdcIicgJiYgcXVvdGUgIT0gJ1wnJykgeworICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc3RyaW5nLiIpOworICAgICAgfQorCisgICAgICBpZiAoY3VycmVudFRva2VuLmxlbmd0aCgpIDwgMiB8fAorICAgICAgICAgIGN1cnJlbnRUb2tlbi5jaGFyQXQoY3VycmVudFRva2VuLmxlbmd0aCgpIC0gMSkgIT0gcXVvdGUpIHsKKyAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIlN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWQgPQorICAgICAgICAgICAgY3VycmVudFRva2VuLnN1YnN0cmluZygxLCBjdXJyZW50VG9rZW4ubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgZmluYWwgQnl0ZVN0cmluZyByZXN1bHQgPSB1bmVzY2FwZUJ5dGVzKGVzY2FwZWQpOworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgbGlzdC5hZGQocmVzdWx0KTsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IGxpbmUgYW5kIGNvbHVtbgorICAgICAqIG51bWJlcnMgaW4gdGhlIGRlc2NyaXB0aW9uLCBzdWl0YWJsZSBmb3IgdGhyb3dpbmcuCisgICAgICovCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgLy8gTm90ZTogIFBlb3BsZSBnZW5lcmFsbHkgcHJlZmVyIG9uZS1iYXNlZCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KKyAgICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24oCisgICAgICAgIGxpbmUgKyAxLCBjb2x1bW4gKyAxLCBkZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0gd2l0aCB0aGUgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgb2YKKyAgICAgKiB0aGUgcHJldmlvdXMgdG9rZW4gaW4gdGhlIGRlc2NyaXB0aW9uLCBzdWl0YWJsZSBmb3IgdGhyb3dpbmcuCisgICAgICovCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uUHJldmlvdXNUb2tlbigKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAvLyBOb3RlOiAgUGVvcGxlIGdlbmVyYWxseSBwcmVmZXIgb25lLWJhc2VkIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLgorICAgICAgcmV0dXJuIG5ldyBQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgcHJldmlvdXNMaW5lICsgMSwgcHJldmlvdXNDb2x1bW4gKyAxLCBkZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBhcHByb3ByaWF0ZSB7QGxpbmsgUGFyc2VFeGNlcHRpb259IGZvciB0aGUgZ2l2ZW4KKyAgICAgKiB7QGNvZGUgTnVtYmVyRm9ybWF0RXhjZXB0aW9ufSB3aGVuIHRyeWluZyB0byBwYXJzZSBhbiBpbnRlZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgUGFyc2VFeGNlcHRpb24gaW50ZWdlclBhcnNlRXhjZXB0aW9uKAorICAgICAgICBmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIHBhcnNlRXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gYXBwcm9wcmlhdGUge0BsaW5rIFBhcnNlRXhjZXB0aW9ufSBmb3IgdGhlIGdpdmVuCisgICAgICoge0Bjb2RlIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0gd2hlbiB0cnlpbmcgdG8gcGFyc2UgYSBmbG9hdCBvciBkb3VibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiBmbG9hdFBhcnNlRXhjZXB0aW9uKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gcGFyc2VFeGNlcHRpb24oIkNvdWxkbid0IHBhcnNlIG51bWJlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKiogVGhyb3duIHdoZW4gcGFyc2luZyBhbiBpbnZhbGlkIHRleHQgZm9ybWF0IG1lc3NhZ2UuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzE5NjE4ODA2MDIyNTEwNzcwMkw7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBsaW5lOworICAgIHByaXZhdGUgZmluYWwgaW50IGNvbHVtbjsKKworICAgIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UsIHdpdGggLTEgYXMgdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLiAqLworICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgdGhpcygtMSwgLTEsIG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZCwKKyAgICAgKiB1c2luZyAxLW9mZnNldC4KKyAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoZSBwYXJzZXIgZXJyb3Igb2NjdXJyZWQsCisgICAgICogdXNpbmcgMS1vZmZzZXQuCisgICAgICovCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKGZpbmFsIGludCBsaW5lLCBmaW5hbCBpbnQgY29sdW1uLAorICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgc3VwZXIoSW50ZWdlci50b1N0cmluZyhsaW5lKSArICI6IiArIGNvbHVtbiArICI6ICIgKyBtZXNzYWdlKTsKKyAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpbmUgd2hlcmUgdGhlIHBhcnNlIGV4Y2VwdGlvbiBvY2N1cnJlZCwgb3IgLTEgd2hlbgorICAgICAqIG5vbmUgaXMgcHJvdmlkZWQuIFRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgMS1vZmZzZXQsIHNvIHRoZSBmaXJzdAorICAgICAqIGxpbmUgaXMgbGluZSAxLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKKyAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uIHdoZXJlIHRoZSBwYXJzZSBleGNlcHRpb24gb2NjdXJyZWQsIG9yIC0xIHdoZW4KKyAgICAgKiBub25lIGlzIHByb3ZpZGVkLiBUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIDEtb2Zmc2V0LCBzbyB0aGUgZmlyc3QKKyAgICAgKiBsaW5lIGlzIGxpbmUgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbHVtbigpIHsKKyAgICAgIHJldHVybiBjb2x1bW47CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cworICAgKiBpbnRvIHtAY29kZSBidWlsZGVyfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShmaW5hbCBSZWFkYWJsZSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBtZXJnZShpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RW1wdHlSZWdpc3RyeSgpLCBidWlsZGVyKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKKyAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgQ2hhclNlcXVlbmNlIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgIG1lcmdlKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeS5nZXRFbXB0eVJlZ2lzdHJ5KCksIGJ1aWxkZXIpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cworICAgKiBpbnRvIHtAY29kZSBidWlsZGVyfS4gIEV4dGVuc2lvbnMgd2lsbCBiZSByZWNvZ25pemVkIGlmIHRoZXkgYXJlCisgICAqIHJlZ2lzdGVyZWQgaW4ge0Bjb2RlIGV4dGVuc2lvblJlZ2lzdHJ5fS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShmaW5hbCBSZWFkYWJsZSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIFJlYWQgdGhlIGVudGlyZSBpbnB1dCB0byBhIFN0cmluZyB0aGVuIHBhcnNlIHRoYXQuCisKKyAgICAvLyBJZiBTdHJlYW1Ub2tlbml6ZXIgd2VyZSBub3QgcXVpdGUgc28gY3JpcHBsZWQsIG9yIGlmIHRoZXJlIHdlcmUgYSBraW5kCisgICAgLy8gb2YgUmVhZGVyIHRoYXQgY291bGQgcmVhZCBpbiBjaHVua3MgdGhhdCBtYXRjaCBzb21lIHBhcnRpY3VsYXIgcmVnZXgsCisgICAgLy8gb3IgaWYgd2Ugd2FudGVkIHRvIHdyaXRlIGEgY3VzdG9tIFJlYWRlciB0byB0b2tlbml6ZSBvdXIgc3RyZWFtLCB0aGVuCisgICAgLy8gd2Ugd291bGQgbm90IGhhdmUgdG8gcmVhZCB0byBvbmUgYmlnIFN0cmluZy4gIEFsYXMsIG5vbmUgb2YgdGhlc2UgaXMKKyAgICAvLyB0aGUgY2FzZS4gIE9oIHdlbGwuCisKKyAgICBtZXJnZSh0b1N0cmluZ0J1aWxkZXIoaW5wdXQpLCBleHRlbnNpb25SZWdpc3RyeSwgYnVpbGRlcik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OworCisgIC8vIFRPRE8oY2hyaXNuKTogU2VlIGlmIHdvcmtpbmcgYXJvdW5kIGphdmEuaW8uUmVhZGVyI3JlYWQoQ2hhckJ1ZmZlcikKKyAgLy8gb3ZlcmhlYWQgaXMgd29ydGh3aGlsZQorICBwcml2YXRlIHN0YXRpYyBTdHJpbmdCdWlsZGVyIHRvU3RyaW5nQnVpbGRlcihmaW5hbCBSZWFkYWJsZSBpbnB1dCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmaW5hbCBDaGFyQnVmZmVyIGJ1ZmZlciA9IENoYXJCdWZmZXIuYWxsb2NhdGUoQlVGRkVSX1NJWkUpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBmaW5hbCBpbnQgbiA9IGlucHV0LnJlYWQoYnVmZmVyKTsKKyAgICAgIGlmIChuID09IC0xKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnVmZmVyLmZsaXAoKTsKKyAgICAgIHRleHQuYXBwZW5kKGJ1ZmZlciwgMCwgbik7CisgICAgfQorICAgIHJldHVybiB0ZXh0OworICB9CisKKyAgLyoqCisgICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cworICAgKiBpbnRvIHtAY29kZSBidWlsZGVyfS4gIEV4dGVuc2lvbnMgd2lsbCBiZSByZWNvZ25pemVkIGlmIHRoZXkgYXJlCisgICAqIHJlZ2lzdGVyZWQgaW4ge0Bjb2RlIGV4dGVuc2lvblJlZ2lzdHJ5fS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShmaW5hbCBDaGFyU2VxdWVuY2UgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihpbnB1dCk7CisKKyAgICB3aGlsZSAoIXRva2VuaXplci5hdEVuZCgpKSB7CisgICAgICBtZXJnZUZpZWxkKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIGJ1aWxkZXIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSBhIHNpbmdsZSBmaWVsZCBmcm9tIHtAY29kZSB0b2tlbml6ZXJ9IGFuZCBtZXJnZSBpdCBpbnRvCisgICAqIHtAY29kZSBidWlsZGVyfS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbWVyZ2VGaWVsZChmaW5hbCBUb2tlbml6ZXIgdG9rZW5pemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkOworICAgIGZpbmFsIERlc2NyaXB0b3IgdHlwZSA9IGJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKKyAgICBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbiA9IG51bGw7CisKKyAgICBpZiAodG9rZW5pemVyLnRyeUNvbnN1bWUoIlsiKSkgeworICAgICAgLy8gQW4gZXh0ZW5zaW9uLgorICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBuYW1lID0KKyAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcih0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKSk7CisgICAgICB3aGlsZSAodG9rZW5pemVyLnRyeUNvbnN1bWUoIi4iKSkgeworICAgICAgICBuYW1lLmFwcGVuZCgnLicpOworICAgICAgICBuYW1lLmFwcGVuZCh0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKSk7CisgICAgICB9CisKKyAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvblJlZ2lzdHJ5LmZpbmRFeHRlbnNpb25CeU5hbWUobmFtZS50b1N0cmluZygpKTsKKworICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCisgICAgICAgICAgIkV4dGVuc2lvbiBcIiIgKyBuYW1lICsgIlwiIG5vdCBmb3VuZCBpbiB0aGUgRXh0ZW5zaW9uUmVnaXN0cnkuIik7CisgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gdHlwZSkgeworICAgICAgICB0aHJvdyB0b2tlbml6ZXIucGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAorICAgICAgICAgICJFeHRlbnNpb24gXCIiICsgbmFtZSArICJcIiBkb2VzIG5vdCBleHRlbmQgbWVzc2FnZSB0eXBlIFwiIiArCisgICAgICAgICAgdHlwZS5nZXRGdWxsTmFtZSgpICsgIlwiLiIpOworICAgICAgfQorCisgICAgICB0b2tlbml6ZXIuY29uc3VtZSgiXSIpOworCisgICAgICBmaWVsZCA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yOworICAgIH0gZWxzZSB7CisgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHRva2VuaXplci5jb25zdW1lSWRlbnRpZmllcigpOworICAgICAgZmllbGQgPSB0eXBlLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKKworICAgICAgLy8gR3JvdXAgbmFtZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGNhcGl0YWxpemVkIGFzIHRoZXkgYXBwZWFyIGluIHRoZQorICAgICAgLy8gLnByb3RvIGZpbGUsIHdoaWNoIGFjdHVhbGx5IG1hdGNoZXMgdGhlaXIgdHlwZSBuYW1lcywgbm90IHRoZWlyIGZpZWxkCisgICAgICAvLyBuYW1lcy4KKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIC8vIEV4cGxpY2l0bHkgc3BlY2lmeSBVUyBsb2NhbGUgc28gdGhhdCB0aGlzIGNvZGUgZG9lcyBub3QgYnJlYWsgd2hlbgorICAgICAgICAvLyBleGVjdXRpbmcgaW4gVHVya2V5LgorICAgICAgICBmaW5hbCBTdHJpbmcgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICBmaWVsZCA9IHR5cGUuZmluZEZpZWxkQnlOYW1lKGxvd2VyTmFtZSk7CisgICAgICAgIC8vIElmIHRoZSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIHdvcmtlZCBidXQgdGhlIGZpZWxkIGlzIE5PVCBhIGdyb3VwLAorICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5nZXRUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLlR5cGUuR1JPVVApIHsKKyAgICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEFnYWluLCBzcGVjaWFsLWNhc2UgZ3JvdXAgbmFtZXMgYXMgZGVzY3JpYmVkIGFib3ZlLgorICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLkdST1VQICYmCisgICAgICAgICAgIWZpZWxkLmdldE1lc3NhZ2VUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCisgICAgICAgICAgIk1lc3NhZ2UgdHlwZSBcIiIgKyB0eXBlLmdldEZ1bGxOYW1lKCkgKworICAgICAgICAgICJcIiBoYXMgbm8gZmllbGQgbmFtZWQgXCIiICsgbmFtZSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBPYmplY3QgdmFsdWUgPSBudWxsOworCisgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgIHRva2VuaXplci50cnlDb25zdW1lKCI6Iik7ICAvLyBvcHRpb25hbAorCisgICAgICBmaW5hbCBTdHJpbmcgZW5kVG9rZW47CisgICAgICBpZiAodG9rZW5pemVyLnRyeUNvbnN1bWUoIjwiKSkgeworICAgICAgICBlbmRUb2tlbiA9ICI+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRva2VuaXplci5jb25zdW1lKCJ7Iik7CisgICAgICAgIGVuZFRva2VuID0gIn0iOworICAgICAgfQorCisgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlcjsKKyAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgeworICAgICAgICBzdWJCdWlsZGVyID0gYnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ViQnVpbGRlciA9IGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKCF0b2tlbml6ZXIudHJ5Q29uc3VtZShlbmRUb2tlbikpIHsKKyAgICAgICAgaWYgKHRva2VuaXplci5hdEVuZCgpKSB7CisgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLnBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgIkV4cGVjdGVkIFwiIiArIGVuZFRva2VuICsgIlwiLiIpOworICAgICAgICB9CisgICAgICAgIG1lcmdlRmllbGQodG9rZW5pemVyLCBleHRlbnNpb25SZWdpc3RyeSwgc3ViQnVpbGRlcik7CisgICAgICB9CisKKyAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKworICAgIH0gZWxzZSB7CisgICAgICB0b2tlbml6ZXIuY29uc3VtZSgiOiIpOworCisgICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSkgeworICAgICAgICBjYXNlIElOVDMyOgorICAgICAgICBjYXNlIFNJTlQzMjoKKyAgICAgICAgY2FzZSBTRklYRUQzMjoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lSW50MzIoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOVDY0OgorICAgICAgICBjYXNlIFNJTlQ2NDoKKyAgICAgICAgY2FzZSBTRklYRUQ2NDoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lSW50NjQoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFVJTlQzMjoKKyAgICAgICAgY2FzZSBGSVhFRDMyOgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVVSW50MzIoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgY2FzZSBGSVhFRDY0OgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVVSW50NjQoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVGbG9hdCgpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVEb3VibGUoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJPT0w6CisgICAgICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuY29uc3VtZUJvb2xlYW4oKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUklORzoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lU3RyaW5nKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCWVRFUzoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lQnl0ZVN0cmluZygpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgICBmaW5hbCBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IGZpZWxkLmdldEVudW1UeXBlKCk7CisKKyAgICAgICAgICBpZiAodG9rZW5pemVyLmxvb2tpbmdBdEludGVnZXIoKSkgeworICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciA9IHRva2VuaXplci5jb25zdW1lSW50MzIoKTsKKyAgICAgICAgICAgIHZhbHVlID0gZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXIobnVtYmVyKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpICsKKyAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIHdpdGggbnVtYmVyICIgKyBudW1iZXIgKyAnLicpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSB0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKTsKKyAgICAgICAgICAgIHZhbHVlID0gZW51bVR5cGUuZmluZFZhbHVlQnlOYW1lKGlkKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpICsKKyAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiIiArIGlkICsgIlwiLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgY2FzZSBHUk9VUDoKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZ2V0IGhlcmUuIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBVdGlsaXR5IGZ1bmN0aW9ucworICAvLworICAvLyBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIHBhY2thZ2UtcHJpdmF0ZSBiZWNhdXNlIERlc2NyaXB0b3JzLmphdmEgdXNlcworICAvLyB0aGVtLgorCisgIC8qKgorICAgKiBFc2NhcGVzIGJ5dGVzIGluIHRoZSBmb3JtYXQgdXNlZCBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQsIHdoaWNoCisgICAqIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtYXQgdXNlZCBmb3IgQyBzdHJpbmcgbGl0ZXJhbHMuICBBbGwgYnl0ZXMKKyAgICogdGhhdCBhcmUgbm90IHByaW50YWJsZSA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLCBhcyB3ZWxsIGFzCisgICAqIGJhY2tzbGFzaCwgc2luZ2xlLXF1b3RlLCBhbmQgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuICBDaGFyYWN0ZXJzIGZvcgorICAgKiB3aGljaCBubyBkZWZpbmVkIHNob3J0LWhhbmQgZXNjYXBlIHNlcXVlbmNlIGlzIGRlZmluZWQgd2lsbCBiZSBlc2NhcGVkCisgICAqIHVzaW5nIDMtZGlnaXQgb2N0YWwgc2VxdWVuY2VzLgorICAgKi8KKyAgc3RhdGljIFN0cmluZyBlc2NhcGVCeXRlcyhmaW5hbCBCeXRlU3RyaW5nIGlucHV0KSB7CisgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoaW5wdXQuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7CisgICAgICBmaW5hbCBieXRlIGIgPSBpbnB1dC5ieXRlQXQoaSk7CisgICAgICBzd2l0Y2ggKGIpIHsKKyAgICAgICAgLy8gSmF2YSBkb2VzIG5vdCByZWNvZ25pemUgXGEgb3IgXHYsIGFwcGFyZW50bHkuCisgICAgICAgIGNhc2UgMHgwNzogYnVpbGRlci5hcHBlbmQoIlxcYSIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xiJzogYnVpbGRlci5hcHBlbmQoIlxcYiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xmJzogYnVpbGRlci5hcHBlbmQoIlxcZiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJzogYnVpbGRlci5hcHBlbmQoIlxcbiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xyJzogYnVpbGRlci5hcHBlbmQoIlxcciIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JzogYnVpbGRlci5hcHBlbmQoIlxcdCIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYjogYnVpbGRlci5hcHBlbmQoIlxcdiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xcJzogYnVpbGRlci5hcHBlbmQoIlxcXFwiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wnJzogYnVpbGRlci5hcHBlbmQoIlxcXCciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJyInIDogYnVpbGRlci5hcHBlbmQoIlxcXCIiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gTm90ZTogIEJ5dGVzIHdpdGggdGhlIGhpZ2gtb3JkZXIgYml0IHNldCBzaG91bGQgYmUgZXNjYXBlZC4gIFNpbmNlCisgICAgICAgICAgLy8gICBieXRlcyBhcmUgc2lnbmVkLCBzdWNoIGJ5dGVzIHdpbGwgY29tcGFyZSBsZXNzIHRoYW4gMHgyMCwgaGVuY2UKKyAgICAgICAgICAvLyAgIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0LgorICAgICAgICAgIGlmIChiID49IDB4MjApIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSBiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcikgKCcwJyArICgoYiA+Pj4gNikgJiAzKSkpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpICgnMCcgKyAoKGIgPj4+IDMpICYgNykpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSAoJzAnICsgKGIgJiA3KSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiBVbi1lc2NhcGUgYSBieXRlIHNlcXVlbmNlIGFzIGVzY2FwZWQgdXNpbmcKKyAgICoge0BsaW5rICNlc2NhcGVCeXRlcyhCeXRlU3RyaW5nKX0uICBUd28tZGlnaXQgaGV4IGVzY2FwZXMgKHN0YXJ0aW5nIHdpdGgKKyAgICogIlx4IikgYXJlIGFsc28gcmVjb2duaXplZC4KKyAgICovCisgIHN0YXRpYyBCeXRlU3RyaW5nIHVuZXNjYXBlQnl0ZXMoZmluYWwgQ2hhclNlcXVlbmNlIGNoYXJTdHJpbmcpCisgICAgICB0aHJvd3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIHsKKyAgICAvLyBGaXJzdCBjb252ZXJ0IHRoZSBKYXZhIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBVVEYtOCBieXRlcy4KKyAgICBCeXRlU3RyaW5nIGlucHV0ID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoY2hhclN0cmluZy50b1N0cmluZygpKTsKKyAgICAvLyBUaGVuIHVuZXNjYXBlIGNlcnRhaW4gYnl0ZSBzZXF1ZW5jZXMgaW50cm9kdWNlZCBieSBBU0NJSSAnXFwnLiAgVGhlIHZhbGlkCisgICAgLy8gZXNjYXBlcyBjYW4gYWxsIGJlIGV4cHJlc3NlZCB3aXRoIEFTQ0lJIGNoYXJhY3RlcnMsIHNvIGl0IGlzIHNhZmUgdG8KKyAgICAvLyBvcGVyYXRlIG9uIGJ5dGVzIGhlcmUuCisgICAgLy8KKyAgICAvLyBVbmVzY2FwaW5nIHRoZSBpbnB1dCBieXRlIGFycmF5IHdpbGwgcmVzdWx0IGluIGEgYnl0ZSBzZXF1ZW5jZSB0aGF0J3Mgbm8KKyAgICAvLyBsb25nZXIgdGhhbiB0aGUgaW5wdXQuICBUaGF0J3MgYmVjYXVzZSBlYWNoIGVzY2FwZSBzZXF1ZW5jZSBpcyBiZXR3ZWVuCisgICAgLy8gdHdvIGFuZCBmb3VyIGJ5dGVzIGxvbmcgYW5kIHN0YW5kcyBmb3IgYSBzaW5nbGUgYnl0ZS4KKyAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbaW5wdXQuc2l6ZSgpXTsKKyAgICBpbnQgcG9zID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7CisgICAgICBieXRlIGMgPSBpbnB1dC5ieXRlQXQoaSk7CisgICAgICBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgIGlmIChpICsgMSA8IGlucHV0LnNpemUoKSkgeworICAgICAgICAgICsraTsKKyAgICAgICAgICBjID0gaW5wdXQuYnl0ZUF0KGkpOworICAgICAgICAgIGlmIChpc09jdGFsKGMpKSB7CisgICAgICAgICAgICAvLyBPY3RhbCBlc2NhcGUuCisgICAgICAgICAgICBpbnQgY29kZSA9IGRpZ2l0VmFsdWUoYyk7CisgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNPY3RhbChpbnB1dC5ieXRlQXQoaSArIDEpKSkgeworICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIGRpZ2l0VmFsdWUoaW5wdXQuYnl0ZUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpICsgMSA8IGlucHV0LnNpemUoKSAmJiBpc09jdGFsKGlucHV0LmJ5dGVBdChpICsgMSkpKSB7CisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgZGlnaXRWYWx1ZShpbnB1dC5ieXRlQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGhhdCAwIDw9IGNvZGUgJiYgY29kZSA8PSAweEZGLgorICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9IChieXRlKWNvZGU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICBjYXNlICdhJyA6IHJlc3VsdFtwb3MrK10gPSAweDA3OyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAnYicgOiByZXN1bHRbcG9zKytdID0gJ1xiJzsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ2YnIDogcmVzdWx0W3BvcysrXSA9ICdcZic7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlICduJyA6IHJlc3VsdFtwb3MrK10gPSAnXG4nOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAncicgOiByZXN1bHRbcG9zKytdID0gJ1xyJzsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ3QnIDogcmVzdWx0W3BvcysrXSA9ICdcdCc7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlICd2JyA6IHJlc3VsdFtwb3MrK10gPSAweDBiOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAnXFwnOiByZXN1bHRbcG9zKytdID0gJ1xcJzsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ1wnJzogcmVzdWx0W3BvcysrXSA9ICdcJyc7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlICciJyA6IHJlc3VsdFtwb3MrK10gPSAnXCInOyBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAvLyBoZXggZXNjYXBlCisgICAgICAgICAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGlucHV0LnNpemUoKSAmJiBpc0hleChpbnB1dC5ieXRlQXQoaSArIDEpKSkgeworICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgY29kZSA9IGRpZ2l0VmFsdWUoaW5wdXQuYnl0ZUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXHgnIHdpdGggbm8gZGlnaXRzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGlucHV0LnNpemUoKSAmJiBpc0hleChpbnB1dC5ieXRlQXQoaSArIDEpKSkgeworICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgY29kZSA9IGNvZGUgKiAxNiArIGRpZ2l0VmFsdWUoaW5wdXQuYnl0ZUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9IChieXRlKWNvZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXCIgKyAoY2hhciljICsgJ1wnJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZTogJ1xcJyBhdCBlbmQgb2Ygc3RyaW5nLiIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHRbcG9zKytdID0gYzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShyZXN1bHQsIDAsIHBvcyk7CisgIH0KKworICAvKioKKyAgICogVGhyb3duIGJ5IHtAbGluayBUZXh0Rm9ybWF0I3VuZXNjYXBlQnl0ZXN9IGFuZAorICAgKiB7QGxpbmsgVGV4dEZvcm1hdCN1bmVzY2FwZVRleHR9IHdoZW4gYW4gaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgaXMgc2Vlbi4KKyAgICovCisgIHN0YXRpYyBjbGFzcyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgxNjQwMzM2NTAxNDI1OTMzMDRMOworCisgICAgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgc3VwZXIoZGVzY3JpcHRpb24pOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjZXNjYXBlQnl0ZXMoQnl0ZVN0cmluZyl9LCBidXQgZXNjYXBlcyBhIHRleHQgc3RyaW5nLgorICAgKiBOb24tQVNDSUkgY2hhcmFjdGVycyBhcmUgZmlyc3QgZW5jb2RlZCBhcyBVVEYtOCwgdGhlbiBlYWNoIGJ5dGUgaXMgZXNjYXBlZAorICAgKiBpbmRpdmlkdWFsbHkgYXMgYSAzLWRpZ2l0IG9jdGFsIGVzY2FwZS4gIFllcywgaXQncyB3ZWlyZC4KKyAgICovCisgIHN0YXRpYyBTdHJpbmcgZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgaW5wdXQpIHsKKyAgICByZXR1cm4gZXNjYXBlQnl0ZXMoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoaW5wdXQpKTsKKyAgfQorCisgIC8qKgorICAgKiBVbi1lc2NhcGUgYSB0ZXh0IHN0cmluZyBhcyBlc2NhcGVkIHVzaW5nIHtAbGluayAjZXNjYXBlVGV4dChTdHJpbmcpfS4KKyAgICogVHdvLWRpZ2l0IGhleCBlc2NhcGVzIChzdGFydGluZyB3aXRoICJceCIpIGFyZSBhbHNvIHJlY29nbml6ZWQuCisgICAqLworICBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24geworICAgIHJldHVybiB1bmVzY2FwZUJ5dGVzKGlucHV0KS50b1N0cmluZ1V0ZjgoKTsKKyAgfQorCisgIC8qKiBJcyB0aGlzIGFuIG9jdGFsIGRpZ2l0PyAqLworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT2N0YWwoZmluYWwgYnl0ZSBjKSB7CisgICAgcmV0dXJuICcwJyA8PSBjICYmIGMgPD0gJzcnOworICB9CisKKyAgLyoqIElzIHRoaXMgYSBoZXggZGlnaXQ/ICovCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIZXgoZmluYWwgYnl0ZSBjKSB7CisgICAgcmV0dXJuICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwKKyAgICAgICAgICAgKCdhJyA8PSBjICYmIGMgPD0gJ2YnKSB8fAorICAgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnRicpOworICB9CisKKyAgLyoqCisgICAqIEludGVycHJldCBhIGNoYXJhY3RlciBhcyBhIGRpZ2l0IChpbiBhbnkgYmFzZSB1cCB0byAzNikgYW5kIHJldHVybiB0aGUKKyAgICogbnVtZXJpYyB2YWx1ZS4gIFRoaXMgaXMgbGlrZSB7QGNvZGUgQ2hhcmFjdGVyLmRpZ2l0KCl9IGJ1dCB3ZSBkb24ndCBhY2NlcHQKKyAgICogbm9uLUFTQ0lJIGRpZ2l0cy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGludCBkaWdpdFZhbHVlKGZpbmFsIGJ5dGUgYykgeworICAgIGlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgeworICAgICAgcmV0dXJuIGMgLSAnMCc7CisgICAgfSBlbHNlIGlmICgnYScgPD0gYyAmJiBjIDw9ICd6JykgeworICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGMgLSAnQScgKyAxMDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIgZnJvbSB0aGUgdGV4dC4gIFVubGlrZSB0aGUgSmF2YSBzdGFuZGFyZAorICAgKiB7QGNvZGUgSW50ZWdlci5wYXJzZUludCgpfSwgdGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBwcmVmaXhlcyAiMHgiCisgICAqIGFuZCAiMCIgdG8gc2lnbmlmeSBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycywgcmVzcGVjdGl2ZWx5LgorICAgKi8KKyAgc3RhdGljIGludCBwYXJzZUludDMyKGZpbmFsIFN0cmluZyB0ZXh0KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gKGludCkgcGFyc2VJbnRlZ2VyKHRleHQsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gdGhlIHRleHQuICBVbmxpa2UgdGhlIEphdmEgc3RhbmRhcmQKKyAgICoge0Bjb2RlIEludGVnZXIucGFyc2VJbnQoKX0sIHRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgcHJlZml4ZXMgIjB4IgorICAgKiBhbmQgIjAiIHRvIHNpZ25pZnkgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMsIHJlc3BlY3RpdmVseS4gIFRoZQorICAgKiByZXN1bHQgaXMgY29lcmNlZCB0byBhIChzaWduZWQpIHtAY29kZSBpbnR9IHdoZW4gcmV0dXJuZWQgc2luY2UgSmF2YSBoYXMKKyAgICogbm8gdW5zaWduZWQgaW50ZWdlciB0eXBlLgorICAgKi8KKyAgc3RhdGljIGludCBwYXJzZVVJbnQzMihmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChpbnQpIHBhcnNlSW50ZWdlcih0ZXh0LCBmYWxzZSwgZmFsc2UpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGZyb20gdGhlIHRleHQuICBVbmxpa2UgdGhlIEphdmEgc3RhbmRhcmQKKyAgICoge0Bjb2RlIEludGVnZXIucGFyc2VJbnQoKX0sIHRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgcHJlZml4ZXMgIjB4IgorICAgKiBhbmQgIjAiIHRvIHNpZ25pZnkgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMsIHJlc3BlY3RpdmVseS4KKyAgICovCisgIHN0YXRpYyBsb25nIHBhcnNlSW50NjQoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZUludGVnZXIodGV4dCwgdHJ1ZSwgdHJ1ZSk7CisgIH0KKworICAvKioKKyAgICogUGFyc2UgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIHRoZSB0ZXh0LiAgVW5saWtlIHRoZSBKYXZhIHN0YW5kYXJkCisgICAqIHtAY29kZSBJbnRlZ2VyLnBhcnNlSW50KCl9LCB0aGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHByZWZpeGVzICIweCIKKyAgICogYW5kICIwIiB0byBzaWduaWZ5IGhleGFkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzLCByZXNwZWN0aXZlbHkuICBUaGUKKyAgICogcmVzdWx0IGlzIGNvZXJjZWQgdG8gYSAoc2lnbmVkKSB7QGNvZGUgbG9uZ30gd2hlbiByZXR1cm5lZCBzaW5jZSBKYXZhIGhhcworICAgKiBubyB1bnNpZ25lZCBsb25nIHR5cGUuCisgICAqLworICBzdGF0aWMgbG9uZyBwYXJzZVVJbnQ2NChmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHBhcnNlSW50ZWdlcih0ZXh0LCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBsb25nIHBhcnNlSW50ZWdlcihmaW5hbCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0xvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgIGludCBwb3MgPSAwOworCisgICAgYm9vbGVhbiBuZWdhdGl2ZSA9IGZhbHNlOworICAgIGlmICh0ZXh0LnN0YXJ0c1dpdGgoIi0iLCBwb3MpKSB7CisgICAgICBpZiAoIWlzU2lnbmVkKSB7CisgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIk51bWJlciBtdXN0IGJlIHBvc2l0aXZlOiAiICsgdGV4dCk7CisgICAgICB9CisgICAgICArK3BvczsKKyAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQgcmFkaXggPSAxMDsKKyAgICBpZiAodGV4dC5zdGFydHNXaXRoKCIweCIsIHBvcykpIHsKKyAgICAgIHBvcyArPSAyOworICAgICAgcmFkaXggPSAxNjsKKyAgICB9IGVsc2UgaWYgKHRleHQuc3RhcnRzV2l0aCgiMCIsIHBvcykpIHsKKyAgICAgIHJhZGl4ID0gODsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgbnVtYmVyVGV4dCA9IHRleHQuc3Vic3RyaW5nKHBvcyk7CisKKyAgICBsb25nIHJlc3VsdCA9IDA7CisgICAgaWYgKG51bWJlclRleHQubGVuZ3RoKCkgPCAxNikgeworICAgICAgLy8gQ2FuIHNhZmVseSBhc3N1bWUgbm8gb3ZlcmZsb3cuCisgICAgICByZXN1bHQgPSBMb25nLnBhcnNlTG9uZyhudW1iZXJUZXh0LCByYWRpeCk7CisgICAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgYm91bmRzLgorICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBmb3IgNjQtYml0IG51bWJlcnMgc2luY2UgdGhleSdkIGhhdmUgdG8gYmUgMTYgY2hhcnMKKyAgICAgIC8vIG9yIGxvbmdlciB0byBvdmVyZmxvdy4KKyAgICAgIGlmICghaXNMb25nKSB7CisgICAgICAgIGlmIChpc1NpZ25lZCkgeworICAgICAgICAgIGlmIChyZXN1bHQgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCByZXN1bHQgPCBJbnRlZ2VyLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIk51bWJlciBvdXQgb2YgcmFuZ2UgZm9yIDMyLWJpdCBzaWduZWQgaW50ZWdlcjogIiArIHRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAocmVzdWx0ID49ICgxTCA8PCAzMikgfHwgcmVzdWx0IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIk51bWJlciBvdXQgb2YgcmFuZ2UgZm9yIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyOiAiICsgdGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEJpZ0ludGVnZXIgYmlnVmFsdWUgPSBuZXcgQmlnSW50ZWdlcihudW1iZXJUZXh0LCByYWRpeCk7CisgICAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgICAgYmlnVmFsdWUgPSBiaWdWYWx1ZS5uZWdhdGUoKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgYm91bmRzLgorICAgICAgaWYgKCFpc0xvbmcpIHsKKyAgICAgICAgaWYgKGlzU2lnbmVkKSB7CisgICAgICAgICAgaWYgKGJpZ1ZhbHVlLmJpdExlbmd0aCgpID4gMzEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGJpZ1ZhbHVlLmJpdExlbmd0aCgpID4gMzIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcjogIiArIHRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzU2lnbmVkKSB7CisgICAgICAgICAgaWYgKGJpZ1ZhbHVlLmJpdExlbmd0aCgpID4gNjMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciA2NC1iaXQgc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGJpZ1ZhbHVlLmJpdExlbmd0aCgpID4gNjQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciA2NC1iaXQgdW5zaWduZWQgaW50ZWdlcjogIiArIHRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHQgPSBiaWdWYWx1ZS5sb25nVmFsdWUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0M2MxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDk5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBidWlsZCBhIHByb3RvY29sIG1lc3NhZ2UgdGhhdCBpcyBtaXNzaW5nIHJlcXVpcmVkCisgKiBmaWVsZHMuICBUaGlzIGlzIGEge0Bjb2RlIFJ1bnRpbWVFeGNlcHRpb259IGJlY2F1c2UgaXQgbm9ybWFsbHkgcmVwcmVzZW50cworICogYSBwcm9ncmFtbWluZyBlcnJvcjogIGl0IGhhcHBlbnMgd2hlbiBzb21lIGNvZGUgd2hpY2ggY29uc3RydWN0cyBhIG1lc3NhZ2UKKyAqIGZhaWxzIHRvIHNldCBhbGwgdGhlIGZpZWxkcy4gIHtAY29kZSBwYXJzZUZyb20oKX0gbWV0aG9kcyA8Yj5kbyBub3Q8L2I+CisgKiB0aHJvdyB0aGlzOyB0aGV5IHRocm93IGFuIHtAbGluayBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259IGlmCisgKiByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcsIGJlY2F1c2UgaXQgaXMgbm90IGEgcHJvZ3JhbW1pbmcgZXJyb3IgdG8KKyAqIHJlY2VpdmUgYW4gaW5jb21wbGV0ZSBtZXNzYWdlLiAgSW4gb3RoZXIgd29yZHMsCisgKiB7QGNvZGUgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb259IHNob3VsZCBuZXZlciBiZSB0aHJvd24gYnkgY29ycmVjdAorICogY29kZSwgYnV0IHtAY29kZSBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259IG1pZ2h0IGJlLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzQ2NjkyOTk1MzM3NDg4MzUwN0w7CisKKyAgcHVibGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKGZpbmFsIE1lc3NhZ2VMaXRlIG1lc3NhZ2UpIHsKKyAgICBzdXBlcigiTWVzc2FnZSB3YXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuICAoTGl0ZSBydW50aW1lIGNvdWxkIG5vdCAiICsKKyAgICAgICAgICAiZGV0ZXJtaW5lIHdoaWNoIGZpZWxkcyB3ZXJlIG1pc3NpbmcpLiIpOworICAgIG1pc3NpbmdGaWVsZHMgPSBudWxsOworICB9CisKKyAgcHVibGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKGZpbmFsIExpc3Q8U3RyaW5nPiBtaXNzaW5nRmllbGRzKSB7CisgICAgc3VwZXIoYnVpbGREZXNjcmlwdGlvbihtaXNzaW5nRmllbGRzKSk7CisgICAgdGhpcy5taXNzaW5nRmllbGRzID0gbWlzc2luZ0ZpZWxkczsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1pc3NpbmdGaWVsZHM7CisKKyAgLyoqCisgICAqIEdldCBhIGxpc3Qgb2YgaHVtYW4tcmVhZGFibGUgbmFtZXMgb2YgcmVxdWlyZWQgZmllbGRzIG1pc3NpbmcgZnJvbSB0aGlzCisgICAqIG1lc3NhZ2UuICBFYWNoIG5hbWUgaXMgYSBmdWxsIHBhdGggdG8gYSBmaWVsZCwgZS5nLiAiZm9vLmJhcls1XS5iYXoiLgorICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGxpdGUgcnVudGltZSB3YXMgdXNlZCwgc2luY2UgaXQgbGFja3MgdGhlIGFiaWxpdHkgdG8KKyAgICogZmluZCBtaXNzaW5nIGZpZWxkcy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWlzc2luZ0ZpZWxkcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtaXNzaW5nRmllbGRzKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyB0aGlzIGV4Y2VwdGlvbiB0byBhbiB7QGxpbmsgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9ufS4KKyAgICogV2hlbiBhIHBhcnNlZCBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLCB0aGlzIHNob3VsZCBiZSB0aHJvd24KKyAgICogaW5zdGVhZCBvZiB7QGNvZGUgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb259LgorICAgKi8KKyAgcHVibGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBhc0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigpIHsKKyAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihnZXRNZXNzYWdlKCkpOworICB9CisKKyAgLyoqIENvbnN0cnVjdCB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciB0aGlzIGV4Y2VwdGlvbi4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkRGVzY3JpcHRpb24oZmluYWwgTGlzdDxTdHJpbmc+IG1pc3NpbmdGaWVsZHMpIHsKKyAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGRlc2NyaXB0aW9uID0KKyAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZpbmFsIFN0cmluZyBmaWVsZCA6IG1pc3NpbmdGaWVsZHMpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzY3JpcHRpb24uYXBwZW5kKCIsICIpOworICAgICAgfQorICAgICAgZGVzY3JpcHRpb24uYXBwZW5kKGZpZWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTJlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldC5qYXZhCkBAIC0wLDAgKzEsOTc4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlci5MaW1pdGVkSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCisvKioKKyAqIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBmaWVsZHMgd2hpY2ggd2VyZSBzZWVuIHdoZW4KKyAqIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIGJ1dCB3aG9zZSBmaWVsZCBudW1iZXJzIG9yIHR5cGVzIGFyZSB1bnJlY29nbml6ZWQuCisgKiBUaGlzIG1vc3QgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiBuZXcgZmllbGRzIGFyZSBhZGRlZCB0byBhIG1lc3NhZ2UgdHlwZQorICogYW5kIHRoZW4gbWVzc2FnZXMgY29udGFpbmluZyB0aG9zZSBmaWVsZHMgYXJlIHJlYWQgYnkgb2xkIHNvZnR3YXJlIHRoYXQgd2FzCisgKiBjb21waWxlZCBiZWZvcmUgdGhlIG5ldyB0eXBlcyB3ZXJlIGFkZGVkLgorICoKKyAqIDxwPkV2ZXJ5IHtAbGluayBNZXNzYWdlfSBjb250YWlucyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSAoYW5kIGV2ZXJ5CisgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBjb250YWlucyBhbiB7QGxpbmsgQnVpbGRlcn0pLgorICoKKyAqIDxwPk1vc3QgdXNlcnMgd2lsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVbmtub3duRmllbGRTZXQgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSB7CisgIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0KCkge30KKworICAvKiogQ3JlYXRlIGEgbmV3IHtAbGluayBCdWlsZGVyfS4gKi8KKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7CisgICAgcmV0dXJuIEJ1aWxkZXIuY3JlYXRlKCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBCdWlsZGVyfSBhbmQgaW5pdGlhbGl6ZSBpdCB0byBiZSBhIGNvcHkKKyAgICogb2Yge0Bjb2RlIGNvcHlGcm9tfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKGZpbmFsIFVua25vd25GaWVsZFNldCBjb3B5RnJvbSkgeworICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGNvcHlGcm9tKTsKKyAgfQorCisgIC8qKiBHZXQgYW4gZW1wdHkge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICovCisgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IGdldERlZmF1bHRJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gZGVmYXVsdEluc3RhbmNlOworICB9CisgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKKyAgICByZXR1cm4gZGVmYXVsdEluc3RhbmNlOworICB9CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVua25vd25GaWVsZFNldCBkZWZhdWx0SW5zdGFuY2UgPQorICAgIG5ldyBVbmtub3duRmllbGRTZXQoQ29sbGVjdGlvbnMuPEludGVnZXIsIEZpZWxkPmVtcHR5TWFwKCkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gYXJvdW5kIHRoZSBnaXZlbiBtYXAuICBUaGUgbWFwIGlzCisgICAqIGV4cGVjdGVkIHRvIGJlIGltbXV0YWJsZS4KKyAgICovCisgIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0KGZpbmFsIE1hcDxJbnRlZ2VyLCBGaWVsZD4gZmllbGRzKSB7CisgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7CisgIH0KKyAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgRmllbGQ+IGZpZWxkczsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvdGhlcikgeworICAgIGlmICh0aGlzID09IG90aGVyKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIChvdGhlciBpbnN0YW5jZW9mIFVua25vd25GaWVsZFNldCkgJiYKKyAgICAgICAgICAgZmllbGRzLmVxdWFscygoKFVua25vd25GaWVsZFNldCkgb3RoZXIpLmZpZWxkcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gZmllbGRzLmhhc2hDb2RlKCk7CisgIH0KKworICAvKiogR2V0IGEgbWFwIG9mIGZpZWxkcyBpbiB0aGUgc2V0IGJ5IG51bWJlci4gKi8KKyAgcHVibGljIE1hcDxJbnRlZ2VyLCBGaWVsZD4gYXNNYXAoKSB7CisgICAgcmV0dXJuIGZpZWxkczsKKyAgfQorCisgIC8qKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIHByZXNlbnQgaW4gdGhlIHNldC4gKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgaW50IG51bWJlcikgeworICAgIHJldHVybiBmaWVsZHMuY29udGFpbnNLZXkobnVtYmVyKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBmaWVsZCBieSBudW1iZXIuICBSZXR1cm5zIGFuIGVtcHR5IGZpZWxkIGlmIG5vdCBwcmVzZW50LiAgTmV2ZXIKKyAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAqLworICBwdWJsaWMgRmllbGQgZ2V0RmllbGQoZmluYWwgaW50IG51bWJlcikgeworICAgIGZpbmFsIEZpZWxkIHJlc3VsdCA9IGZpZWxkcy5nZXQobnVtYmVyKTsKKyAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IEZpZWxkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogcmVzdWx0OworICB9CisKKyAgLyoqIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgeworICAgICAgZW50cnkuZ2V0VmFsdWUoKS53cml0ZVRvKGVudHJ5LmdldEtleSgpLCBvdXRwdXQpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyB0aGUgc2V0IHRvIGEgc3RyaW5nIGluIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdC4gVGhpcyBpcworICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZAorICAgKiB7QGxpbmsgVGV4dEZvcm1hdCNwcmludFRvU3RyaW5nKFVua25vd25GaWVsZFNldCl9LgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyh0aGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzCisgICAqIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIHtAbGluayAjd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LgorICAgKi8KKyAgcHVibGljIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBCeXRlU3RyaW5nLkNvZGVkQnVpbGRlciBvdXQgPQorICAgICAgICBCeXRlU3RyaW5nLm5ld0NvZGVkQnVpbGRlcihnZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgICAgIHdyaXRlVG8ob3V0LmdldENvZGVkT3V0cHV0KCkpOworICAgICAgcmV0dXJuIG91dC5idWlsZCgpOworICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAiU2VyaWFsaXppbmcgdG8gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEge0Bjb2RlIGJ5dGV9IGFycmF5IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcworICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KKyAgICovCisgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtnZXRTZXJpYWxpemVkU2l6ZSgpXTsKKyAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJlc3VsdCk7CisgICAgICB3cml0ZVRvKG91dHB1dCk7CisgICAgICBvdXRwdXQuY2hlY2tOb1NwYWNlTGVmdCgpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgIlNlcmlhbGl6aW5nIHRvIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAiICsKKyAgICAgICAgIihzaG91bGQgbmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAgVGhpcyBpcyBqdXN0IGEKKyAgICogdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dCk7CisgICAgd3JpdGVUbyhjb2RlZE91dHB1dCk7CisgICAgY29kZWRPdXRwdXQuZmx1c2goKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dCk7CisgICAgY29kZWRPdXRwdXQud3JpdGVSYXdWYXJpbnQzMihnZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgICB3cml0ZVRvKGNvZGVkT3V0cHV0KTsKKyAgICBjb2RlZE91dHB1dC5mbHVzaCgpOworICB9CisKKyAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIHNldC4gKi8KKyAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgeworICAgICAgcmVzdWx0ICs9IGVudHJ5LmdldFZhbHVlKCkuZ2V0U2VyaWFsaXplZFNpemUoZW50cnkuZ2V0S2V5KCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9IHVzaW5nCisgICAqIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlQXNNZXNzYWdlU2V0VG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgeworICAgICAgZW50cnkuZ2V0VmFsdWUoKS53cml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvKAorICAgICAgICBlbnRyeS5nZXRLZXkoKSwgb3V0cHV0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgc2V0IHVzaW5nCisgICAqIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKKyAgICAgIHJlc3VsdCArPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0RXh0ZW5zaW9uKAorICAgICAgICBlbnRyeS5nZXRLZXkoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgIC8vIFVua25vd25GaWVsZFNldHMgZG8gbm90IGhhdmUgcmVxdWlyZWQgZmllbGRzLCBzbyB0aGV5IGFyZSBhbHdheXMKKyAgICAvLyBpbml0aWFsaXplZC4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKiBQYXJzZSBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0uICovCisgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShpbnB1dCkuYnVpbGQoKTsKKyAgfQorCisgIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gYW5kIHJldHVybiBpdC4gKi8KKyAgcHVibGljIHN0YXRpYyBVbmtub3duRmllbGRTZXQgcGFyc2VGcm9tKGZpbmFsIEJ5dGVTdHJpbmcgZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkKCk7CisgIH0KKworICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFuZCByZXR1cm4gaXQuICovCisgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBieXRlW10gZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkKCk7CisgIH0KKworICAvKiogUGFyc2UgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCByZXR1cm4gaXQuICovCisgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkKCk7CisgIH0KKworICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcigpOworICB9CisKKyAgcHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgeworICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKHRoaXMpOworICB9CisKKyAgLyoqCisgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBVbmtub3duRmllbGRTZXR9cy4KKyAgICoKKyAgICogPHA+Tm90ZSB0aGF0IHRoaXMgY2xhc3MgbWFpbnRhaW5zIHtAbGluayBGaWVsZC5CdWlsZGVyfXMgZm9yIGFsbCBmaWVsZHMKKyAgICogaW4gdGhlIHNldC4gIFRodXMsIGFkZGluZyBvbmUgZWxlbWVudCB0byBhbiBleGlzdGluZyB7QGxpbmsgRmllbGR9IGRvZXMgbm90CisgICAqIHJlcXVpcmUgbWFraW5nIGEgY29weS4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciBlZmZpY2llbnQgcGFyc2luZyBvZgorICAgKiB1bmtub3duIHJlcGVhdGVkIGZpZWxkcy4gIEhvd2V2ZXIsIGl0IGltcGxpZXMgdGhhdCB7QGxpbmsgRmllbGR9cyBjYW5ub3QKKyAgICogYmUgY29uc3RydWN0ZWQgaW5kZXBlbmRlbnRseSwgbm9yIGNhbiB0d28ge0BsaW5rIFVua25vd25GaWVsZFNldH1zIHNoYXJlCisgICAqIHRoZSBzYW1lIHtAY29kZSBGaWVsZH0gb2JqZWN0LgorICAgKgorICAgKiA8cD5Vc2Uge0BsaW5rIFVua25vd25GaWVsZFNldCNuZXdCdWlsZGVyKCl9IHRvIGNvbnN0cnVjdCBhIHtAY29kZSBCdWlsZGVyfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgeworICAgIC8vIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseSAoZXhjZXB0IGZyb20gJ2NyZWF0ZScpLgorICAgIHByaXZhdGUgQnVpbGRlcigpIHt9CisKKyAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBGaWVsZD4gZmllbGRzOworCisgICAgLy8gT3B0aW1pemF0aW9uOiAgV2Uga2VlcCBhcm91bmQgYSBidWlsZGVyIGZvciB0aGUgbGFzdCBmaWVsZCB0aGF0IHdhcworICAgIC8vICAgbW9kaWZpZWQgc28gdGhhdCB3ZSBjYW4gZWZmaWNpZW50bHkgYWRkIHRvIGl0IG11bHRpcGxlIHRpbWVzIGluIGEKKyAgICAvLyAgIHJvdyAoaW1wb3J0YW50IHdoZW4gcGFyc2luZyBhbiB1bmtub3duIHJlcGVhdGVkIGZpZWxkKS4KKyAgICBwcml2YXRlIGludCBsYXN0RmllbGROdW1iZXI7CisgICAgcHJpdmF0ZSBGaWVsZC5CdWlsZGVyIGxhc3RGaWVsZDsKKworICAgIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgY3JlYXRlKCkgeworICAgICAgQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKKyAgICAgIGJ1aWxkZXIucmVpbml0aWFsaXplKCk7CisgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBmaWVsZCBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIHdoaWNoIGluY2x1ZGVzIGFueQorICAgICAqIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWVsZC5CdWlsZGVyIGdldEZpZWxkQnVpbGRlcihmaW5hbCBpbnQgbnVtYmVyKSB7CisgICAgICBpZiAobGFzdEZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG51bWJlciA9PSBsYXN0RmllbGROdW1iZXIpIHsKKyAgICAgICAgICByZXR1cm4gbGFzdEZpZWxkOworICAgICAgICB9CisgICAgICAgIC8vIE5vdGU6ICBhZGRGaWVsZCgpIHdpbGwgcmVzZXQgbGFzdEZpZWxkIGFuZCBsYXN0RmllbGROdW1iZXIuCisgICAgICAgIGFkZEZpZWxkKGxhc3RGaWVsZE51bWJlciwgbGFzdEZpZWxkLmJ1aWxkKCkpOworICAgICAgfQorICAgICAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmluYWwgRmllbGQgZXhpc3RpbmcgPSBmaWVsZHMuZ2V0KG51bWJlcik7CisgICAgICAgIGxhc3RGaWVsZE51bWJlciA9IG51bWJlcjsKKyAgICAgICAgbGFzdEZpZWxkID0gRmllbGQubmV3QnVpbGRlcigpOworICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworICAgICAgICAgIGxhc3RGaWVsZC5tZXJnZUZyb20oZXhpc3RpbmcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXN0RmllbGQ7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgdGhlIHtAbGluayBVbmtub3duRmllbGRTZXR9IGFuZCByZXR1cm4gaXQuCisgICAgICoKKyAgICAgKiA8cD5PbmNlIHtAY29kZSBidWlsZCgpfSBoYXMgYmVlbiBjYWxsZWQsIHRoZSB7QGNvZGUgQnVpbGRlcn0gd2lsbCBubworICAgICAqIGxvbmdlciBiZSB1c2FibGUuICBDYWxsaW5nIGFueSBtZXRob2QgYWZ0ZXIge0Bjb2RlIGJ1aWxkKCl9IHdpbGwgcmVzdWx0CisgICAgICogaW4gdW5kZWZpbmVkIGJlaGF2aW9yIGFuZCBjYW4gY2F1c2UgYSB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259IHRvIGJlCisgICAgICogdGhyb3duLgorICAgICAqLworICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgYnVpbGQoKSB7CisgICAgICBnZXRGaWVsZEJ1aWxkZXIoMCk7ICAvLyBGb3JjZSBsYXN0RmllbGQgdG8gYmUgYnVpbHQuCisgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgcmVzdWx0OworICAgICAgaWYgKGZpZWxkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBuZXcgVW5rbm93bkZpZWxkU2V0KENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmaWVsZHMpKTsKKyAgICAgIH0KKyAgICAgIGZpZWxkcyA9IG51bGw7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgYnVpbGRQYXJ0aWFsKCkgeworICAgICAgLy8gTm8gcmVxdWlyZWQgZmllbGRzLCBzbyB0aGlzIGlzIHRoZSBzYW1lIGFzIGJ1aWxkKCkuCisgICAgICByZXR1cm4gYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKKyAgICAgIGdldEZpZWxkQnVpbGRlcigwKTsgIC8vIEZvcmNlIGxhc3RGaWVsZCB0byBiZSBidWlsdC4KKyAgICAgIHJldHVybiBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpLm1lcmdlRnJvbSgKKyAgICAgICAgICBuZXcgVW5rbm93bkZpZWxkU2V0KGZpZWxkcykpOworICAgIH0KKworICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKKyAgICAgIHJldHVybiBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlaW5pdGlhbGl6ZSgpIHsKKyAgICAgIGZpZWxkcyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgICBsYXN0RmllbGROdW1iZXIgPSAwOworICAgICAgbGFzdEZpZWxkID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmVzZXQgdGhlIGJ1aWxkZXIgdG8gYW4gZW1wdHkgc2V0LiAqLworICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyKCkgeworICAgICAgcmVpbml0aWFsaXplKCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgZmllbGRzIGZyb20ge0Bjb2RlIG90aGVyfSBpbnRvIHRoaXMgc2V0LiAgSWYgYSBmaWVsZCBudW1iZXIKKyAgICAgKiBleGlzdHMgaW4gYm90aCBzZXRzLCB7QGNvZGUgb3RoZXJ9J3MgdmFsdWVzIGZvciB0aGF0IGZpZWxkIHdpbGwgYmUKKyAgICAgKiBhcHBlbmRlZCB0byB0aGUgdmFsdWVzIGluIHRoaXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBVbmtub3duRmllbGRTZXQgb3RoZXIpIHsKKyAgICAgIGlmIChvdGhlciAhPSBnZXREZWZhdWx0SW5zdGFuY2UoKSkgeworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBvdGhlci5maWVsZHMuZW50cnlTZXQoKSkgeworICAgICAgICAgIG1lcmdlRmllbGQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGUge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICBJZiBhIGZpZWxkIHdpdGggdGhlIHNhbWUKKyAgICAgKiBudW1iZXIgYWxyZWFkeSBleGlzdHMsIHRoZSB0d28gYXJlIG1lcmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZpZWxkKGZpbmFsIGludCBudW1iZXIsIGZpbmFsIEZpZWxkIGZpZWxkKSB7CisgICAgICBpZiAobnVtYmVyID09IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7CisgICAgICB9CisgICAgICBpZiAoaGFzRmllbGQobnVtYmVyKSkgeworICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5tZXJnZUZyb20oZmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UgY291bGQgY2FsbCBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5tZXJnZUZyb20oZmllbGQpCisgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgYnV0IHRoYXQgd291bGQgY3JlYXRlIGEgY29weSBvZiB0aGUgRmllbGQgb2JqZWN0LgorICAgICAgICAvLyBXZSdkIHJhdGhlciByZXVzZSB0aGUgb25lIHBhc3NlZCB0byB1cywgc28gY2FsbCBhZGRGaWVsZCgpIGluc3RlYWQuCisgICAgICAgIGFkZEZpZWxkKG51bWJlciwgZmllbGQpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBtZXJnaW5nIGEgbmV3IGZpZWxkIGNvbnRhaW5pbmcgYSBzaW5nbGUgdmFyaW50CisgICAgICogdmFsdWUuICBUaGlzIGlzIHVzZWQgaW4gcGFydGljdWxhciB3aGVuIGFuIHVua25vd24gZW51bSB2YWx1ZSBpcworICAgICAqIGVuY291bnRlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlVmFyaW50RmllbGQoZmluYWwgaW50IG51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7CisgICAgICBpZiAobnVtYmVyID09IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7CisgICAgICB9CisgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRWYXJpbnQodmFsdWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIgaXMgcHJlc2VudCBpbiB0aGUgc2V0LiAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgIGlmIChudW1iZXIgPT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJaZXJvIGlzIG5vdCBhIHZhbGlkIGZpZWxkIG51bWJlci4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudW1iZXIgPT0gbGFzdEZpZWxkTnVtYmVyIHx8IGZpZWxkcy5jb250YWluc0tleShudW1iZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpZWxkIHRvIHRoZSB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fS4gIElmIGEgZmllbGQgd2l0aCB0aGUgc2FtZQorICAgICAqIG51bWJlciBhbHJlYWR5IGV4aXN0cywgaXQgaXMgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBhZGRGaWVsZChmaW5hbCBpbnQgbnVtYmVyLCBmaW5hbCBGaWVsZCBmaWVsZCkgeworICAgICAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOworICAgICAgfQorICAgICAgaWYgKGxhc3RGaWVsZCAhPSBudWxsICYmIGxhc3RGaWVsZE51bWJlciA9PSBudW1iZXIpIHsKKyAgICAgICAgLy8gRGlzY2FyZCB0aGlzLgorICAgICAgICBsYXN0RmllbGQgPSBudWxsOworICAgICAgICBsYXN0RmllbGROdW1iZXIgPSAwOworICAgICAgfQorICAgICAgaWYgKGZpZWxkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZmllbGRzID0gbmV3IFRyZWVNYXA8SW50ZWdlcixGaWVsZD4oKTsKKyAgICAgIH0KKyAgICAgIGZpZWxkcy5wdXQobnVtYmVyLCBmaWVsZCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHByZXNlbnQge0Bjb2RlIEZpZWxkfXMgYXMgYW4gaW1tdXRhYmxlIHtAY29kZSBNYXB9LiAgSWYgbW9yZQorICAgICAqIGZpZWxkcyBhcmUgYWRkZWQsIHRoZSBjaGFuZ2VzIG1heSBvciBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGlzIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPEludGVnZXIsIEZpZWxkPiBhc01hcCgpIHsKKyAgICAgIGdldEZpZWxkQnVpbGRlcigwKTsgIC8vIEZvcmNlIGxhc3RGaWVsZCB0byBiZSBidWlsdC4KKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoZmllbGRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbiBlbnRpcmUgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0cyBmaWVsZHMgaW50bworICAgICAqIHRoaXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmluYWwgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8ICFtZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIHNpbmdsZSBmaWVsZCBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0IGludG8gdGhpcyBzZXQuCisgICAgICogQHBhcmFtIHRhZyBUaGUgZmllbGQncyB0YWcgbnVtYmVyLCB3aGljaCB3YXMgYWxyZWFkeSBwYXJzZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgZmFsc2V9IGlmIHRoZSB0YWcgaXMgYW4gZW5kIGdyb3VwIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZUZpZWxkRnJvbShmaW5hbCBpbnQgdGFnLCBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBpbnQgbnVtYmVyID0gV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpOworICAgICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVDoKKyAgICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRWYXJpbnQoaW5wdXQucmVhZEludDY0KCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NDoKKyAgICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRGaXhlZDY0KGlucHV0LnJlYWRGaXhlZDY0KCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRMZW5ndGhEZWxpbWl0ZWQoaW5wdXQucmVhZEJ5dGVzKCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6CisgICAgICAgICAgZmluYWwgQnVpbGRlciBzdWJCdWlsZGVyID0gbmV3QnVpbGRlcigpOworICAgICAgICAgIGlucHV0LnJlYWRHcm91cChudW1iZXIsIHN1YkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5LmdldEVtcHR5UmVnaXN0cnkoKSk7CisgICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkR3JvdXAoc3ViQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUDoKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgorICAgICAgICAgIGdldEZpZWxkQnVpbGRlcihudW1iZXIpLmFkZEZpeGVkMzIoaW5wdXQucmVhZEZpeGVkMzIoKSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRXaXJlVHlwZSgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBzZXQgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgQnl0ZVN0cmluZyBkYXRhKQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhLm5ld0NvZGVkSW5wdXQoKTsKKyAgICAgICAgbWVyZ2VGcm9tKGlucHV0KTsKKyAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0gY2F0Y2ggKGZpbmFsIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIHNldCBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBieXRlW10gZGF0YSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICAgICAgbWVyZ2VGcm9tKGlucHV0KTsKKyAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0gY2F0Y2ggKGZpbmFsIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIHNldCBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW5wdXQpOworICAgICAgbWVyZ2VGcm9tKGNvZGVkSW5wdXQpOworICAgICAgY29kZWRJbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBpbnQgZmlyc3RCeXRlID0gaW5wdXQucmVhZCgpOworICAgICAgaWYgKGZpcnN0Qnl0ZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBmaW5hbCBpbnQgc2l6ZSA9IENvZGVkSW5wdXRTdHJlYW0ucmVhZFJhd1ZhcmludDMyKGZpcnN0Qnl0ZSwgaW5wdXQpOworICAgICAgZmluYWwgSW5wdXRTdHJlYW0gbGltaXRlZElucHV0ID0gbmV3IExpbWl0ZWRJbnB1dFN0cmVhbShpbnB1dCwgc2l6ZSk7CisgICAgICBtZXJnZUZyb20obGltaXRlZElucHV0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG1lcmdlRGVsaW1pdGVkRnJvbSgKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KKyAgICAgIHJldHVybiBtZXJnZURlbGltaXRlZEZyb20oaW5wdXQpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgorICAgICAgcmV0dXJuIG1lcmdlRnJvbShpbnB1dCk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKAorICAgICAgICBCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICBtZXJnZUZyb20oaW5wdXQpOworICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIGJ5dGUgYXJyYXkgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKKyAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oCisgICAgICAgIGJ5dGVbXSBkYXRhLAorICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgorICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oCisgICAgICAgIGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuLAorICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgorICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKAorICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgorICAgICAgcmV0dXJuIG1lcmdlRnJvbShpbnB1dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICAgIC8vIFVua25vd25GaWVsZFNldHMgZG8gbm90IGhhdmUgcmVxdWlyZWQgZmllbGRzLCBzbyB0aGV5IGFyZSBhbHdheXMKKyAgICAgIC8vIGluaXRpYWxpemVkLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlcHJlc2VudHMgYSBzaW5nbGUgZmllbGQgaW4gYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0uCisgICAqCisgICAqIDxwPkEge0Bjb2RlIEZpZWxkfSBjb25zaXN0cyBvZiBmaXZlIGxpc3RzIG9mIHZhbHVlcy4gIFRoZSBsaXN0cyBjb3JyZXNwb25kCisgICAqIHRvIHRoZSBmaXZlICJ3aXJlIHR5cGVzIiB1c2VkIGluIHRoZSBwcm90b2NvbCBidWZmZXIgYmluYXJ5IGZvcm1hdC4KKyAgICogVGhlIHdpcmUgdHlwZSBvZiBlYWNoIGZpZWxkIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGVuY29kZWQgZm9ybSBhbG9uZSwKKyAgICogd2l0aG91dCBrbm93aW5nIHRoZSBmaWVsZCdzIGRlY2xhcmVkIHR5cGUuICBTbywgd2UgYXJlIGFibGUgdG8gcGFyc2UKKyAgICogdW5rbm93biB2YWx1ZXMgYXQgbGVhc3QgdGhpcyBmYXIgYW5kIHNlcGFyYXRlIHRoZW0uICBOb3JtYWxseSwgb25seSBvbmUKKyAgICogb2YgdGhlIGZpdmUgbGlzdHMgd2lsbCBjb250YWluIGFueSB2YWx1ZXMsIHNpbmNlIGl0IGlzIGltcG9zc2libGUgdG8KKyAgICogZGVmaW5lIGEgdmFsaWQgbWVzc2FnZSB0eXBlIHRoYXQgZGVjbGFyZXMgdHdvIGRpZmZlcmVudCB0eXBlcyBmb3IgdGhlCisgICAqIHNhbWUgZmllbGQgbnVtYmVyLiAgSG93ZXZlciwgdGhlIGNvZGUgaXMgZGVzaWduZWQgdG8gYWxsb3cgZm9yIHRoZSBjYXNlCisgICAqIHdoZXJlIHRoZSBzYW1lIHVua25vd24gZmllbGQgbnVtYmVyIGlzIGVuY291bnRlcmVkIHVzaW5nIG11bHRpcGxlIGRpZmZlcmVudAorICAgKiB3aXJlIHR5cGVzLgorICAgKgorICAgKiA8cD57QGNvZGUgRmllbGR9IGlzIGFuIGltbXV0YWJsZSBjbGFzcy4gIFRvIGNvbnN0cnVjdCBvbmUsIHlvdSBtdXN0IHVzZSBhCisgICAqIHtAbGluayBCdWlsZGVyfS4KKyAgICoKKyAgICogQHNlZSBVbmtub3duRmllbGRTZXQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmllbGQgeworICAgIHByaXZhdGUgRmllbGQoKSB7fQorCisgICAgLyoqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQnVpbGRlcn0uICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7CisgICAgICByZXR1cm4gQnVpbGRlci5jcmVhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcge0BsaW5rIEJ1aWxkZXJ9IGFuZCBpbml0aWFsaXplIGl0IHRvIGEgY29weSBvZgorICAgICAqIHtAY29kZSBjb3B5RnJvbX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoZmluYWwgRmllbGQgY29weUZyb20pIHsKKyAgICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGNvcHlGcm9tKTsKKyAgICB9CisKKyAgICAvKiogR2V0IGFuIGVtcHR5IHtAY29kZSBGaWVsZH0uICovCisgICAgcHVibGljIHN0YXRpYyBGaWVsZCBnZXREZWZhdWx0SW5zdGFuY2UoKSB7CisgICAgICByZXR1cm4gZmllbGREZWZhdWx0SW5zdGFuY2U7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkIGZpZWxkRGVmYXVsdEluc3RhbmNlID0gbmV3QnVpbGRlcigpLmJ1aWxkKCk7CisKKyAgICAvKiogR2V0IHRoZSBsaXN0IG9mIHZhcmludCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCisgICAgcHVibGljIExpc3Q8TG9uZz4gZ2V0VmFyaW50TGlzdCgpICAgICAgICAgICAgICAgeyByZXR1cm4gdmFyaW50OyAgICAgICAgICB9CisKKyAgICAvKiogR2V0IHRoZSBsaXN0IG9mIGZpeGVkMzIgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLworICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGdldEZpeGVkMzJMaXN0KCkgICAgICAgICAgIHsgcmV0dXJuIGZpeGVkMzI7ICAgICAgICAgfQorCisgICAgLyoqIEdldCB0aGUgbGlzdCBvZiBmaXhlZDY0IHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKyAgICBwdWJsaWMgTGlzdDxMb25nPiBnZXRGaXhlZDY0TGlzdCgpICAgICAgICAgICAgICB7IHJldHVybiBmaXhlZDY0OyAgICAgICAgIH0KKworICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2YgbGVuZ3RoLWRlbGltaXRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCisgICAgcHVibGljIExpc3Q8Qnl0ZVN0cmluZz4gZ2V0TGVuZ3RoRGVsaW1pdGVkTGlzdCgpIHsgcmV0dXJuIGxlbmd0aERlbGltaXRlZDsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGVtYmVkZGVkIGdyb3VwIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gIFRoZXNlIGFyZQorICAgICAqIHJlcHJlc2VudGVkIHVzaW5nIHtAbGluayBVbmtub3duRmllbGRTZXR9cyByYXRoZXIgdGhhbiB7QGxpbmsgTWVzc2FnZX1zCisgICAgICogc2luY2UgdGhlIGdyb3VwJ3MgdHlwZSBpcyBwcmVzdW1hYmx5IHVua25vd24uCisgICAgICovCisgICAgcHVibGljIExpc3Q8VW5rbm93bkZpZWxkU2V0PiBnZXRHcm91cExpc3QoKSAgICAgIHsgcmV0dXJuIGdyb3VwOyAgICAgICAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvdGhlcikgeworICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZpZWxkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhnZXRJZGVudGl0eUFycmF5KCksCisgICAgICAgICAgKChGaWVsZCkgb3RoZXIpLmdldElkZW50aXR5QXJyYXkoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBBcnJheXMuaGFzaENvZGUoZ2V0SWRlbnRpdHlBcnJheSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcworICAgICAqIHtAbGluayBGaWVsZH0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3RbXSBnZXRJZGVudGl0eUFycmF5KCkgeworICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgdmFyaW50LAorICAgICAgICAgIGZpeGVkMzIsCisgICAgICAgICAgZml4ZWQ2NCwKKyAgICAgICAgICBsZW5ndGhEZWxpbWl0ZWQsCisgICAgICAgICAgZ3JvdXB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGZpZWxkLCBpbmNsdWRpbmcgZmllbGQgbnVtYmVyLCBhbmQgd3JpdGVzIGl0IHRvCisgICAgICoge0Bjb2RlIG91dHB1dH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmb3IgKGZpbmFsIGxvbmcgdmFsdWUgOiB2YXJpbnQpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlVUludDY0KGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBmb3IgKGZpbmFsIGludCB2YWx1ZSA6IGZpeGVkMzIpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQzMihmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgICAgZm9yIChmaW5hbCBsb25nIHZhbHVlIDogZml4ZWQ2NCkgeworICAgICAgICBvdXRwdXQud3JpdGVGaXhlZDY0KGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBmb3IgKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUgOiBsZW5ndGhEZWxpbWl0ZWQpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlQnl0ZXMoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGZvciAoZmluYWwgVW5rbm93bkZpZWxkU2V0IHZhbHVlIDogZ3JvdXApIHsKKyAgICAgICAgb3V0cHV0LndyaXRlR3JvdXAoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkCisgICAgICogbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyKSB7CisgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgIGZvciAoZmluYWwgbG9uZyB2YWx1ZSA6IHZhcmludCkgeworICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQ2NFNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGZvciAoZmluYWwgaW50IHZhbHVlIDogZml4ZWQzMikgeworICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZpeGVkMzJTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBmb3IgKGZpbmFsIGxvbmcgdmFsdWUgOiBmaXhlZDY0KSB7CisgICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQ2NFNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGZvciAoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSA6IGxlbmd0aERlbGltaXRlZCkgeworICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUJ5dGVzU2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgICAgZm9yIChmaW5hbCBVbmtub3duRmllbGRTZXQgdmFsdWUgOiBncm91cCkgeworICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUdyb3VwU2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkIG51bWJlciwgYW5kIHdyaXRlcyBpdCB0bworICAgICAqIHtAY29kZSBvdXRwdXR9LCB1c2luZyB7QGNvZGUgTWVzc2FnZVNldH0gd2lyZSBmb3JtYXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVBc01lc3NhZ2VTZXRFeHRlbnNpb25UbygKKyAgICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmb3IgKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUgOiBsZW5ndGhEZWxpbWl0ZWQpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlUmF3TWVzc2FnZVNldEV4dGVuc2lvbihmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIGZpZWxkLCBpbmNsdWRpbmcgZmllbGQKKyAgICAgKiBudW1iZXIsIHVzaW5nIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpbmFsIGludCBmaWVsZE51bWJlcikgeworICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICBmb3IgKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUgOiBsZW5ndGhEZWxpbWl0ZWQpIHsKKyAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgICBmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8TG9uZz4gdmFyaW50OworICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBmaXhlZDMyOworICAgIHByaXZhdGUgTGlzdDxMb25nPiBmaXhlZDY0OworICAgIHByaXZhdGUgTGlzdDxCeXRlU3RyaW5nPiBsZW5ndGhEZWxpbWl0ZWQ7CisgICAgcHJpdmF0ZSBMaXN0PFVua25vd25GaWVsZFNldD4gZ3JvdXA7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGJ1aWxkIGEge0BsaW5rIEZpZWxkfSB3aXRoaW4gYW4ge0BsaW5rIFVua25vd25GaWVsZFNldH0uCisgICAgICoKKyAgICAgKiA8cD5Vc2Uge0BsaW5rIEZpZWxkI25ld0J1aWxkZXIoKX0gdG8gY29uc3RydWN0IGEge0Bjb2RlIEJ1aWxkZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZGlyZWN0bHkgKGV4Y2VwdCBmcm9tICdjcmVhdGUnKS4KKyAgICAgIHByaXZhdGUgQnVpbGRlcigpIHt9CisKKyAgICAgIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgY3JlYXRlKCkgeworICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnJlc3VsdCA9IG5ldyBGaWVsZCgpOworICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBGaWVsZCByZXN1bHQ7CisKKyAgICAgIC8qKgorICAgICAgICogQnVpbGQgdGhlIGZpZWxkLiAgQWZ0ZXIge0Bjb2RlIGJ1aWxkKCl9IGhhcyBiZWVuIGNhbGxlZCwgdGhlCisgICAgICAgKiB7QGNvZGUgQnVpbGRlcn0gaXMgbm8gbG9uZ2VyIHVzYWJsZS4gIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCB3aWxsCisgICAgICAgKiByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yIGFuZCBjYW4gY2F1c2UgYQorICAgICAgICoge0Bjb2RlIE51bGxQb2ludGVyRXhjZXB0aW9ufSB0byBiZSB0aHJvd24uCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBGaWVsZCBidWlsZCgpIHsKKyAgICAgICAgaWYgKHJlc3VsdC52YXJpbnQgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC52YXJpbnQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQudmFyaW50ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQudmFyaW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0LmZpeGVkMzIgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC5maXhlZDMyID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LmZpeGVkMzIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdC5maXhlZDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0LmZpeGVkNjQgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC5maXhlZDY0ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LmZpeGVkNjQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdC5maXhlZDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9PSBudWxsKSB7CisgICAgICAgICAgcmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPQorICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQubGVuZ3RoRGVsaW1pdGVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0Lmdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICByZXN1bHQuZ3JvdXAgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQuZ3JvdXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdC5ncm91cCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBGaWVsZCByZXR1cm5NZSA9IHJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJldHVybk1lOworICAgICAgfQorCisgICAgICAvKiogRGlzY2FyZCB0aGUgZmllbGQncyBjb250ZW50cy4gKi8KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyKCkgeworICAgICAgICByZXN1bHQgPSBuZXcgRmllbGQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogTWVyZ2UgdGhlIHZhbHVlcyBpbiB7QGNvZGUgb3RoZXJ9IGludG8gdGhpcyBmaWVsZC4gIEZvciBlYWNoIGxpc3QKKyAgICAgICAqIG9mIHZhbHVlcywge0Bjb2RlIG90aGVyfSdzIHZhbHVlcyBhcmUgYXBwZW5kIHRvIHRoZSBvbmVzIGluIHRoaXMKKyAgICAgICAqIGZpZWxkLgorICAgICAgICovCisgICAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgRmllbGQgb3RoZXIpIHsKKyAgICAgICAgaWYgKCFvdGhlci52YXJpbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgaWYgKHJlc3VsdC52YXJpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0LnZhcmludCA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVzdWx0LnZhcmludC5hZGRBbGwob3RoZXIudmFyaW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW90aGVyLmZpeGVkMzIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgaWYgKHJlc3VsdC5maXhlZDMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5maXhlZDMyID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQuZml4ZWQzMi5hZGRBbGwob3RoZXIuZml4ZWQzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvdGhlci5maXhlZDY0LmlzRW1wdHkoKSkgeworICAgICAgICAgIGlmIChyZXN1bHQuZml4ZWQ2NCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQuZml4ZWQ2NCA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVzdWx0LmZpeGVkNjQuYWRkQWxsKG90aGVyLmZpeGVkNjQpOworICAgICAgICB9CisgICAgICAgIGlmICghb3RoZXIubGVuZ3RoRGVsaW1pdGVkLmlzRW1wdHkoKSkgeworICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoRGVsaW1pdGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQuYWRkQWxsKG90aGVyLmxlbmd0aERlbGltaXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvdGhlci5ncm91cC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBpZiAocmVzdWx0Lmdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5ncm91cCA9IG5ldyBBcnJheUxpc3Q8VW5rbm93bkZpZWxkU2V0PigpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQuZ3JvdXAuYWRkQWxsKG90aGVyLmdyb3VwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqIEFkZCBhIHZhcmludCB2YWx1ZS4gKi8KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFZhcmludChmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgICAgIGlmIChyZXN1bHQudmFyaW50ID09IG51bGwpIHsKKyAgICAgICAgICByZXN1bHQudmFyaW50ID0gbmV3IEFycmF5TGlzdDxMb25nPigpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC52YXJpbnQuYWRkKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKiBBZGQgYSBmaXhlZDMyIHZhbHVlLiAqLworICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRml4ZWQzMihmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHJlc3VsdC5maXhlZDMyID09IG51bGwpIHsKKyAgICAgICAgICByZXN1bHQuZml4ZWQzMiA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuZml4ZWQzMi5hZGQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqIEFkZCBhIGZpeGVkNjQgdmFsdWUuICovCisgICAgICBwdWJsaWMgQnVpbGRlciBhZGRGaXhlZDY0KGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHJlc3VsdC5maXhlZDY0ID09IG51bGwpIHsKKyAgICAgICAgICByZXN1bHQuZml4ZWQ2NCA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuZml4ZWQ2NC5hZGQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqIEFkZCBhIGxlbmd0aC1kZWxpbWl0ZWQgdmFsdWUuICovCisgICAgICBwdWJsaWMgQnVpbGRlciBhZGRMZW5ndGhEZWxpbWl0ZWQoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9PSBudWxsKSB7CisgICAgICAgICAgcmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZVN0cmluZz4oKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkLmFkZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICAvKiogQWRkIGFuIGVtYmVkZGVkIGdyb3VwLiAqLworICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXAoZmluYWwgVW5rbm93bkZpZWxkU2V0IHZhbHVlKSB7CisgICAgICAgIGlmIChyZXN1bHQuZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC5ncm91cCA9IG5ldyBBcnJheUxpc3Q8VW5rbm93bkZpZWxkU2V0PigpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5ncm91cC5hZGQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2VyIHRvIGltcGxlbWVudCBNZXNzYWdlTGl0ZSBpbnRlcmZhY2UuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyPFVua25vd25GaWVsZFNldD4geworICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgcGFyc2VQYXJ0aWFsRnJvbSgKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKGlucHV0KTsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGUuc2V0VW5maW5pc2hlZE1lc3NhZ2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAuc2V0VW5maW5pc2hlZE1lc3NhZ2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKSk7CisgICAgICB9CisgICAgICByZXR1cm4gYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXJzZXIgUEFSU0VSID0gbmV3IFBhcnNlcigpOworICBwdWJsaWMgZmluYWwgUGFyc2VyIGdldFBhcnNlckZvclR5cGUoKSB7CisgICAgcmV0dXJuIFBBUlNFUjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MWJjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGF6eVN0cmluZ0xpc3R9IHRoYXQgd3JhcHMgYW5vdGhlcgorICoge0BsaW5rIExhenlTdHJpbmdMaXN0fSBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIG1vZGlmaWVkIHZpYSB0aGUgd3JhcHBlci4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0PFN0cmluZz4KKyAgICBpbXBsZW1lbnRzIExhenlTdHJpbmdMaXN0LCBSYW5kb21BY2Nlc3MgeworCisgIHByaXZhdGUgZmluYWwgTGF6eVN0cmluZ0xpc3QgbGlzdDsKKworICBwdWJsaWMgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QoTGF6eVN0cmluZ0xpc3QgbGlzdCkgeworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIGxpc3QuZ2V0KGluZGV4KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgcmV0dXJuIGxpc3Quc2l6ZSgpOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIGxpc3QuZ2V0Qnl0ZVN0cmluZyhpbmRleCk7CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIHZvaWQgYWRkKEJ5dGVTdHJpbmcgZWxlbWVudCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3IoZmluYWwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIG5ldyBMaXN0SXRlcmF0b3I8U3RyaW5nPigpIHsKKyAgICAgIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworICAgICAgICByZXR1cm4gaXRlci5oYXNQcmV2aW91cygpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBTdHJpbmcgcHJldmlvdXMoKSB7CisgICAgICAgIHJldHVybiBpdGVyLnByZXZpb3VzKCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBpdGVyLm5leHRJbmRleCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXIucHJldmlvdXNJbmRleCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBvKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgbykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKCkgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3I8U3RyaW5nPigpIHsKKyAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKKworICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gaXRlci5oYXNOZXh0KCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHVibGljIExpc3Q8Pz4gZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCkgeworICAgIC8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHJlYWR5IHVubW9kaWZpYWJsZS4KKyAgICByZXR1cm4gbGlzdC5nZXRVbmRlcmx5aW5nRWxlbWVudHMoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VdGY4LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1V0ZjguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODhmN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VdGY4LmphdmEKQEAgLTAsMCArMSwzNDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworLyoqCisgKiBBIHNldCBvZiBsb3ctbGV2ZWwsIGhpZ2gtcGVyZm9ybWFuY2Ugc3RhdGljIHV0aWxpdHkgbWV0aG9kcyByZWxhdGVkCisgKiB0byB0aGUgVVRGLTggY2hhcmFjdGVyIGVuY29kaW5nLiAgVGhpcyBjbGFzcyBoYXMgbm8gZGVwZW5kZW5jaWVzCisgKiBvdXRzaWRlIG9mIHRoZSBjb3JlIEpESyBsaWJyYXJpZXMuCisgKgorICogPHA+VGhlcmUgYXJlIHNldmVyYWwgdmFyaWFudHMgb2YgVVRGLTguICBUaGUgb25lIGltcGxlbWVudGVkIGJ5CisgKiB0aGlzIGNsYXNzIGlzIHRoZSByZXN0cmljdGVkIGRlZmluaXRpb24gb2YgVVRGLTggaW50cm9kdWNlZCBpbgorICogVW5pY29kZSAzLjEsIHdoaWNoIG1hbmRhdGVzIHRoZSByZWplY3Rpb24gb2YgIm92ZXJsb25nIiBieXRlCisgKiBzZXF1ZW5jZXMgYXMgd2VsbCBhcyByZWplY3Rpb24gb2YgMy1ieXRlIHN1cnJvZ2F0ZSBjb2RlcG9pbnQgYnl0ZQorICogc2VxdWVuY2VzLiAgTm90ZSB0aGF0IHRoZSBVVEYtOCBkZWNvZGVyIGluY2x1ZGVkIGluIE9yYWNsZSdzIEpESworICogaGFzIGJlZW4gbW9kaWZpZWQgdG8gYWxzbyByZWplY3QgIm92ZXJsb25nIiBieXRlIHNlcXVlbmNlcywgYnV0IChhcworICogb2YgMjAxMSkgc3RpbGwgYWNjZXB0cyAzLWJ5dGUgc3Vycm9nYXRlIGNvZGVwb2ludCBieXRlIHNlcXVlbmNlcy4KKyAqCisgKiA8cD5UaGUgYnl0ZSBzZXF1ZW5jZXMgY29uc2lkZXJlZCB2YWxpZCBieSB0aGlzIGNsYXNzIGFyZSBleGFjdGx5CisgKiB0aG9zZSB0aGF0IGNhbiBiZSByb3VuZHRyaXAgY29udmVydGVkIHRvIFN0cmluZ3MgYW5kIGJhY2sgdG8gYnl0ZXMKKyAqIHVzaW5nIHRoZSBVVEYtOCBjaGFyc2V0LCB3aXRob3V0IGxvc3M6IDxwcmU+IHtAY29kZQorICogQXJyYXlzLmVxdWFscyhieXRlcywgbmV3IFN0cmluZyhieXRlcywgIlVURi04IikuZ2V0Qnl0ZXMoIlVURi04IikpCisgKiB9PC9wcmU+CisgKgorICogPHA+U2VlIHRoZSBVbmljb2RlIFN0YW5kYXJkLDwvYnI+CisgKiBUYWJsZSAzLTYuIDxlbT5VVEYtOCBCaXQgRGlzdHJpYnV0aW9uPC9lbT4sPC9icj4KKyAqIFRhYmxlIDMtNy4gPGVtPldlbGwgRm9ybWVkIFVURi04IEJ5dGUgU2VxdWVuY2VzPC9lbT4uCisgKgorICogPHA+VGhpcyBjbGFzcyBzdXBwb3J0cyBkZWNvZGluZyBvZiBwYXJ0aWFsIGJ5dGUgc2VxdWVuY2VzLCBzbyB0aGF0IHRoZQorICogYnl0ZXMgaW4gYSBjb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlcyBjYW4gYmUgc3RvcmVkIGluIG11bHRpcGxlCisgKiBzZWdtZW50cy4gIE1ldGhvZHMgdHlwaWNhbGx5IHJldHVybiB7QGxpbmsgI01BTEZPUk1FRH0gaWYgdGhlIHBhcnRpYWwKKyAqIGJ5dGUgc2VxdWVuY2UgaXMgZGVmaW5pdGVseSBub3Qgd2VsbC1mb3JtZWQsIHtAbGluayAjQ09NUExFVEV9IGlmIGl0IGlzCisgKiB3ZWxsLWZvcm1lZCBpbiB0aGUgYWJzZW5jZSBvZiBhZGRpdGlvbmFsIGlucHV0LCBvciBpZiB0aGUgYnl0ZSBzZXF1ZW5jZQorICogYXBwYXJlbnRseSB0ZXJtaW5hdGVkIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFyYWN0ZXIsIGFuIG9wYXF1ZSBpbnRlZ2VyCisgKiAic3RhdGUiIHZhbHVlIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRlY29kZSB0aGUgY2hhcmFjdGVyIHdoZW4KKyAqIHBhc3NlZCB0byBhIHN1YnNlcXVlbnQgaW52b2NhdGlvbiBvZiBhIHBhcnRpYWwgZGVjb2RpbmcgbWV0aG9kLgorICoKKyAqIEBhdXRob3IgbWFydGlucmJAZ29vZ2xlLmNvbSAoTWFydGluIEJ1Y2hob2x6KQorICovCitmaW5hbCBjbGFzcyBVdGY4IHsKKyAgcHJpdmF0ZSBVdGY4KCkge30KKworICAvKioKKyAgICogU3RhdGUgdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBieXRlIHNlcXVlbmNlIGlzIHdlbGwtZm9ybWVkIGFuZAorICAgKiBjb21wbGV0ZSAobm8gZnVydGhlciBieXRlcyBhcmUgbmVlZGVkIHRvIGNvbXBsZXRlIGEgY2hhcmFjdGVyKS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFID0gMDsKKworICAvKioKKyAgICogU3RhdGUgdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBieXRlIHNlcXVlbmNlIGlzIGRlZmluaXRlbHkgbm90CisgICAqIHdlbGwtZm9ybWVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEID0gLTE7CisKKyAgLy8gT3RoZXIgc3RhdGUgdmFsdWVzIGluY2x1ZGUgdGhlIHBhcnRpYWwgYnl0ZXMgb2YgdGhlIGluY29tcGxldGUKKyAgLy8gY2hhcmFjdGVyIHRvIGJlIGRlY29kZWQgaW4gdGhlIHNpbXBsZXN0IHdheTogd2UgcGFjayB0aGUgYnl0ZXMKKyAgLy8gaW50byB0aGUgc3RhdGUgaW50IGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuICBGb3IgZXhhbXBsZToKKyAgLy8KKyAgLy8gaW50IHN0YXRlID0gYnl0ZTEgXiAoYnl0ZTIgPDwgOCkgXiAoYnl0ZTMgPDwgMTYpOworICAvLworICAvLyBTdWNoIGEgc3RhdGUgaXMgdW5wYWNrZWQgdGh1cyAobm90ZSB0aGUgfiBvcGVyYXRpb24gZm9yIGJ5dGUyIHRvCisgIC8vIHVuZG8gYnl0ZTEncyBzaWduLWV4dGVuc2lvbiBiaXRzKToKKyAgLy8KKyAgLy8gaW50IGJ5dGUxID0gKGJ5dGUpIHN0YXRlOworICAvLyBpbnQgYnl0ZTIgPSAoYnl0ZSkgfihzdGF0ZSA+PiA4KTsKKyAgLy8gaW50IGJ5dGUzID0gKGJ5dGUpIChzdGF0ZSA+PiAxNik7CisgIC8vCisgIC8vIFdlIGNhbm5vdCBzdG9yZSBhIHplcm8gYnl0ZSBpbiB0aGUgc3RhdGUgYmVjYXVzZSBpdCB3b3VsZCBiZQorICAvLyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBhYnNlbmNlIG9mIGEgYnl0ZS4gIEJ1dCB3ZSBkb24ndCBuZWVkCisgIC8vIHRvLCBiZWNhdXNlIHBhcnRpYWwgYnl0ZXMgbXVzdCBhbHdheXMgYmUgbmVnYXRpdmUuICBXaGVuIGJ1aWxkaW5nCisgIC8vIGEgc3RhdGUsIHdlIGVuc3VyZSB0aGF0IGJ5dGUxIGlzIG5lZ2F0aXZlIGFuZCBzdWJzZXF1ZW50IGJ5dGVzCisgIC8vIGFyZSB2YWxpZCB0cmFpbGluZyBieXRlcy4KKworICAvKioKKyAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGJ5dGUgYXJyYXkgaXMgYSB3ZWxsLWZvcm1lZAorICAgKiBVVEYtOCBieXRlIHNlcXVlbmNlLgorICAgKgorICAgKiA8cD5UaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBlcXVpdmFsZW50IHRvIGEgY2FsbCB0byB7QGNvZGUKKyAgICogaXNWYWxpZFV0ZjgoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCl9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRVdGY4KGJ5dGVbXSBieXRlcykgeworICAgIHJldHVybiBpc1ZhbGlkVXRmOChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBzbGljZSBpcyBhCisgICAqIHdlbGwtZm9ybWVkIFVURi04IGJ5dGUgc2VxdWVuY2UuICBUaGUgcmFuZ2Ugb2YgYnl0ZXMgdG8gYmUKKyAgICogY2hlY2tlZCBleHRlbmRzIGZyb20gaW5kZXgge0Bjb2RlIGluZGV4fSwgaW5jbHVzaXZlLCB0byB7QGNvZGUKKyAgICogbGltaXR9LCBleGNsdXNpdmUuCisgICAqCisgICAqIDxwPlRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGVxdWl2YWxlbnQgdG8ge0Bjb2RlCisgICAqIHBhcnRpYWxJc1ZhbGlkVXRmOChieXRlcywgaW5kZXgsIGxpbWl0KSA9PSBVdGY4LkNPTVBMRVRFfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVXRmOChieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KSB7CisgICAgcmV0dXJuIHBhcnRpYWxJc1ZhbGlkVXRmOChieXRlcywgaW5kZXgsIGxpbWl0KSA9PSBDT01QTEVURTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlIGlzIGEgd2VsbC1mb3JtZWQsCisgICAqIG1hbGZvcm1lZCwgb3IgaW5jb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlLiAgVGhlIHJhbmdlIG9mIGJ5dGVzCisgICAqIHRvIGJlIGNoZWNrZWQgZXh0ZW5kcyBmcm9tIGluZGV4IHtAY29kZSBpbmRleH0sIGluY2x1c2l2ZSwgdG8KKyAgICoge0Bjb2RlIGxpbWl0fSwgZXhjbHVzaXZlLgorICAgKgorICAgKiBAcGFyYW0gc3RhdGUgZWl0aGVyIHtAbGluayBVdGY4I0NPTVBMRVRFfSAoaWYgdGhpcyBpcyB0aGUgaW5pdGlhbCBkZWNvZGluZworICAgKiBvcGVyYXRpb24pIG9yIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byBhIHBhcnRpYWwgZGVjb2RpbmcgbWV0aG9kCisgICAqIGZvciB0aGUgcHJldmlvdXMgYnl0ZXMKKyAgICoKKyAgICogQHJldHVybiB7QGxpbmsgI01BTEZPUk1FRH0gaWYgdGhlIHBhcnRpYWwgYnl0ZSBzZXF1ZW5jZSBpcworICAgKiBkZWZpbml0ZWx5IG5vdCB3ZWxsLWZvcm1lZCwge0BsaW5rICNDT01QTEVURX0gaWYgaXQgaXMgd2VsbC1mb3JtZWQKKyAgICogKG5vIGFkZGl0aW9uYWwgaW5wdXQgbmVlZGVkKSwgb3IgaWYgdGhlIGJ5dGUgc2VxdWVuY2UgaXMKKyAgICogImluY29tcGxldGUiLCBpLmUuIGFwcGFyZW50bHkgdGVybWluYXRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhcmFjdGVyLAorICAgKiBhbiBvcGFxdWUgaW50ZWdlciAic3RhdGUiIHZhbHVlIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uIHRvCisgICAqIGRlY29kZSB0aGUgY2hhcmFjdGVyIHdoZW4gcGFzc2VkIHRvIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIGEKKyAgICogcGFydGlhbCBkZWNvZGluZyBtZXRob2QuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoCisgICAgICBpbnQgc3RhdGUsIGJ5dGVbXSBieXRlcywgaW50IGluZGV4LCBpbnQgbGltaXQpIHsKKyAgICBpZiAoc3RhdGUgIT0gQ09NUExFVEUpIHsKKyAgICAgIC8vIFRoZSBwcmV2aW91cyBkZWNvZGluZyBvcGVyYXRpb24gd2FzIGluY29tcGxldGUgKG9yIG1hbGZvcm1lZCkuCisgICAgICAvLyBXZSBsb29rIGZvciBhIHdlbGwtZm9ybWVkIHNlcXVlbmNlIGNvbnNpc3Rpbmcgb2YgYnl0ZXMgZnJvbQorICAgICAgLy8gdGhlIHByZXZpb3VzIGRlY29kaW5nIG9wZXJhdGlvbiAoc3RvcmVkIGluIHN0YXRlKSB0b2dldGhlcgorICAgICAgLy8gd2l0aCBieXRlcyBmcm9tIHRoZSBhcnJheSBzbGljZS4KKyAgICAgIC8vCisgICAgICAvLyBXZSBleHBlY3Qgc3VjaCAic3RyYWRkbGVyIGNoYXJhY3RlcnMiIHRvIGJlIHJhcmUuCisKKyAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgeyAgLy8gTm8gYnl0ZXM/IE5vIHByb2dyZXNzLgorICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICB9CisgICAgICBpbnQgYnl0ZTEgPSAoYnl0ZSkgc3RhdGU7CisgICAgICAvLyBieXRlMSBpcyBuZXZlciBBU0NJSS4KKyAgICAgIGlmIChieXRlMSA8IChieXRlKSAweEUwKSB7CisgICAgICAgIC8vIHR3by1ieXRlIGZvcm0KKworICAgICAgICAvLyBTaW11bHRhbmVvdXNseSBjaGVja3MgZm9yIGlsbGVnYWwgdHJhaWxpbmctYnl0ZSBpbgorICAgICAgICAvLyBsZWFkaW5nIHBvc2l0aW9uIGFuZCBvdmVybG9uZyAyLWJ5dGUgZm9ybS4KKyAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4QzIgfHwKKyAgICAgICAgICAgIC8vIGJ5dGUyIHRyYWlsaW5nLWJ5dGUgdGVzdAorICAgICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPiAoYnl0ZSkgMHhCRikgeworICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhGMCkgeworICAgICAgICAvLyB0aHJlZS1ieXRlIGZvcm0KKworICAgICAgICAvLyBHZXQgYnl0ZTIgZnJvbSBzYXZlZCBzdGF0ZSBvciBhcnJheQorICAgICAgICBpbnQgYnl0ZTIgPSAoYnl0ZSkgfihzdGF0ZSA+PiA4KTsKKyAgICAgICAgaWYgKGJ5dGUyID09IDApIHsKKyAgICAgICAgICBieXRlMiA9IGJ5dGVzW2luZGV4KytdOworICAgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgeworICAgICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSwgYnl0ZTIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZTIgPiAoYnl0ZSkgMHhCRiB8fAorICAgICAgICAgICAgLy8gb3Zlcmxvbmc/IDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG11c3Qgbm90IGFsbCBiZSB6ZXJvCisgICAgICAgICAgICAoYnl0ZTEgPT0gKGJ5dGUpIDB4RTAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHhBMCkgfHwKKyAgICAgICAgICAgIC8vIGlsbGVnYWwgc3Vycm9nYXRlIGNvZGVwb2ludD8KKyAgICAgICAgICAgIChieXRlMSA9PSAoYnl0ZSkgMHhFRCAmJiBieXRlMiA+PSAoYnl0ZSkgMHhBMCkgfHwKKyAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAorICAgICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPiAoYnl0ZSkgMHhCRikgeworICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZvdXItYnl0ZSBmb3JtCisKKyAgICAgICAgLy8gR2V0IGJ5dGUyIGFuZCBieXRlMyBmcm9tIHNhdmVkIHN0YXRlIG9yIGFycmF5CisgICAgICAgIGludCBieXRlMiA9IChieXRlKSB+KHN0YXRlID4+IDgpOworICAgICAgICBpbnQgYnl0ZTMgPSAwOworICAgICAgICBpZiAoYnl0ZTIgPT0gMCkgeworICAgICAgICAgIGJ5dGUyID0gYnl0ZXNbaW5kZXgrK107CisgICAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0KSB7CisgICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlMik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ5dGUzID0gKGJ5dGUpIChzdGF0ZSA+PiAxNik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGUzID09IDApIHsKKyAgICAgICAgICBieXRlMyA9IGJ5dGVzW2luZGV4KytdOworICAgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgeworICAgICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSwgYnl0ZTIsIGJ5dGUzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIHN0YXRlID09IE1BTEZPUk1FRCwgdGhlbiBieXRlMSBpcyAweEZGLAorICAgICAgICAvLyB3aGljaCBuZXZlciBvY2N1cnMgaW4gd2VsbC1mb3JtZWQgVVRGLTgsIGFuZCBzbyB3ZSB3aWxsIHJldHVybgorICAgICAgICAvLyBNQUxGT1JNRUQgYWdhaW4gYmVsb3cuCisKKyAgICAgICAgaWYgKGJ5dGUyID4gKGJ5dGUpIDB4QkYgfHwKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgMSA8PSBwbGFuZSA8PSAxNi4gIFRyaWNreSBvcHRpbWl6ZWQgZm9ybSBvZjoKKyAgICAgICAgICAgIC8vIGlmIChieXRlMSA+IChieXRlKSAweEY0IHx8CisgICAgICAgICAgICAvLyAgICAgYnl0ZTEgPT0gKGJ5dGUpIDB4RjAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHg5MCB8fAorICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEY0ICYmIGJ5dGUyID4gKGJ5dGUpIDB4OEYpCisgICAgICAgICAgICAoKChieXRlMSA8PCAyOCkgKyAoYnl0ZTIgLSAoYnl0ZSkgMHg5MCkpID4+IDMwKSAhPSAwIHx8CisgICAgICAgICAgICAvLyBieXRlMyB0cmFpbGluZy1ieXRlIHRlc3QKKyAgICAgICAgICAgIGJ5dGUzID4gKGJ5dGUpIDB4QkYgfHwKKyAgICAgICAgICAgIC8vIGJ5dGU0IHRyYWlsaW5nLWJ5dGUgdGVzdAorICAgICAgICAgICAgIGJ5dGVzW2luZGV4KytdID4gKGJ5dGUpIDB4QkYpIHsKKyAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhcnRpYWxJc1ZhbGlkVXRmOChieXRlcywgaW5kZXgsIGxpbWl0KTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlIGlzIGEgd2VsbC1mb3JtZWQsCisgICAqIG1hbGZvcm1lZCwgb3IgaW5jb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlLiAgVGhlIHJhbmdlIG9mIGJ5dGVzCisgICAqIHRvIGJlIGNoZWNrZWQgZXh0ZW5kcyBmcm9tIGluZGV4IHtAY29kZSBpbmRleH0sIGluY2x1c2l2ZSwgdG8KKyAgICoge0Bjb2RlIGxpbWl0fSwgZXhjbHVzaXZlLgorICAgKgorICAgKiA8cD5UaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBlcXVpdmFsZW50IHRvIGEgY2FsbCB0byB7QGNvZGUKKyAgICogcGFydGlhbElzVmFsaWRVdGY4KFV0ZjguQ09NUExFVEUsIGJ5dGVzLCBpbmRleCwgbGltaXQpfS4KKyAgICoKKyAgICogQHJldHVybiB7QGxpbmsgI01BTEZPUk1FRH0gaWYgdGhlIHBhcnRpYWwgYnl0ZSBzZXF1ZW5jZSBpcworICAgKiBkZWZpbml0ZWx5IG5vdCB3ZWxsLWZvcm1lZCwge0BsaW5rICNDT01QTEVURX0gaWYgaXQgaXMgd2VsbC1mb3JtZWQKKyAgICogKG5vIGFkZGl0aW9uYWwgaW5wdXQgbmVlZGVkKSwgb3IgaWYgdGhlIGJ5dGUgc2VxdWVuY2UgaXMKKyAgICogImluY29tcGxldGUiLCBpLmUuIGFwcGFyZW50bHkgdGVybWluYXRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhcmFjdGVyLAorICAgKiBhbiBvcGFxdWUgaW50ZWdlciAic3RhdGUiIHZhbHVlIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uIHRvCisgICAqIGRlY29kZSB0aGUgY2hhcmFjdGVyIHdoZW4gcGFzc2VkIHRvIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIGEKKyAgICogcGFydGlhbCBkZWNvZGluZyBtZXRob2QuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoCisgICAgICBieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KSB7CisgICAgLy8gT3B0aW1pemUgZm9yIDEwMCUgQVNDSUkuCisgICAgLy8gSG90c3BvdCBsb3ZlcyBzbWFsbCBzaW1wbGUgdG9wLWxldmVsIGxvb3BzIGxpa2UgdGhpcy4KKyAgICB3aGlsZSAoaW5kZXggPCBsaW1pdCAmJiBieXRlc1tpbmRleF0gPj0gMCkgeworICAgICAgaW5kZXgrKzsKKyAgICB9CisKKyAgICByZXR1cm4gKGluZGV4ID49IGxpbWl0KSA/IENPTVBMRVRFIDoKKyAgICAgICAgcGFydGlhbElzVmFsaWRVdGY4Tm9uQXNjaWkoYnl0ZXMsIGluZGV4LCBsaW1pdCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBpbnQgcGFydGlhbElzVmFsaWRVdGY4Tm9uQXNjaWkoCisgICAgICBieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KSB7CisgICAgZm9yICg7OykgeworICAgICAgaW50IGJ5dGUxLCBieXRlMjsKKworICAgICAgLy8gT3B0aW1pemUgZm9yIGludGVyaW9yIHJ1bnMgb2YgQVNDSUkgYnl0ZXMuCisgICAgICBkbyB7CisgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgeworICAgICAgICAgIHJldHVybiBDT01QTEVURTsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoKGJ5dGUxID0gYnl0ZXNbaW5kZXgrK10pID49IDApOworCisgICAgICBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhFMCkgeworICAgICAgICAvLyB0d28tYnl0ZSBmb3JtCisKKyAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0KSB7CisgICAgICAgICAgcmV0dXJuIGJ5dGUxOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2ltdWx0YW5lb3VzbHkgY2hlY2tzIGZvciBpbGxlZ2FsIHRyYWlsaW5nLWJ5dGUgaW4KKyAgICAgICAgLy8gbGVhZGluZyBwb3NpdGlvbiBhbmQgb3ZlcmxvbmcgMi1ieXRlIGZvcm0uCisgICAgICAgIGlmIChieXRlMSA8IChieXRlKSAweEMyIHx8CisgICAgICAgICAgICBieXRlc1tpbmRleCsrXSA+IChieXRlKSAweEJGKSB7CisgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChieXRlMSA8IChieXRlKSAweEYwKSB7CisgICAgICAgIC8vIHRocmVlLWJ5dGUgZm9ybQorCisgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCAtIDEpIHsgLy8gaW5jb21wbGV0ZSBzZXF1ZW5jZQorICAgICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZXMsIGluZGV4LCBsaW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChieXRlMiA9IGJ5dGVzW2luZGV4KytdKSA+IChieXRlKSAweEJGIHx8CisgICAgICAgICAgICAvLyBvdmVybG9uZz8gNSBtb3N0IHNpZ25pZmljYW50IGJpdHMgbXVzdCBub3QgYWxsIGJlIHplcm8KKyAgICAgICAgICAgIChieXRlMSA9PSAoYnl0ZSkgMHhFMCAmJiBieXRlMiA8IChieXRlKSAweEEwKSB8fAorICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgc3Vycm9nYXRlIGNvZGVwb2ludHMKKyAgICAgICAgICAgIChieXRlMSA9PSAoYnl0ZSkgMHhFRCAmJiBieXRlMiA+PSAoYnl0ZSkgMHhBMCkgfHwKKyAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAorICAgICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPiAoYnl0ZSkgMHhCRikgeworICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZvdXItYnl0ZSBmb3JtCisKKyAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0IC0gMikgeyAgLy8gaW5jb21wbGV0ZSBzZXF1ZW5jZQorICAgICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZXMsIGluZGV4LCBsaW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChieXRlMiA9IGJ5dGVzW2luZGV4KytdKSA+IChieXRlKSAweEJGIHx8CisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IDEgPD0gcGxhbmUgPD0gMTYuICBUcmlja3kgb3B0aW1pemVkIGZvcm0gb2Y6CisgICAgICAgICAgICAvLyBpZiAoYnl0ZTEgPiAoYnl0ZSkgMHhGNCB8fAorICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEYwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4OTAgfHwKKyAgICAgICAgICAgIC8vICAgICBieXRlMSA9PSAoYnl0ZSkgMHhGNCAmJiBieXRlMiA+IChieXRlKSAweDhGKQorICAgICAgICAgICAgKCgoYnl0ZTEgPDwgMjgpICsgKGJ5dGUyIC0gKGJ5dGUpIDB4OTApKSA+PiAzMCkgIT0gMCB8fAorICAgICAgICAgICAgLy8gYnl0ZTMgdHJhaWxpbmctYnl0ZSB0ZXN0CisgICAgICAgICAgICBieXRlc1tpbmRleCsrXSA+IChieXRlKSAweEJGIHx8CisgICAgICAgICAgICAvLyBieXRlNCB0cmFpbGluZy1ieXRlIHRlc3QKKyAgICAgICAgICAgIGJ5dGVzW2luZGV4KytdID4gKGJ5dGUpIDB4QkYpIHsKKyAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IGluY29tcGxldGVTdGF0ZUZvcihpbnQgYnl0ZTEpIHsKKyAgICByZXR1cm4gKGJ5dGUxID4gKGJ5dGUpIDB4RjQpID8KKyAgICAgICAgTUFMRk9STUVEIDogYnl0ZTE7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBpbnQgaW5jb21wbGV0ZVN0YXRlRm9yKGludCBieXRlMSwgaW50IGJ5dGUyKSB7CisgICAgcmV0dXJuIChieXRlMSA+IChieXRlKSAweEY0IHx8CisgICAgICAgICAgICBieXRlMiA+IChieXRlKSAweEJGKSA/CisgICAgICAgIE1BTEZPUk1FRCA6IGJ5dGUxIF4gKGJ5dGUyIDw8IDgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IGluY29tcGxldGVTdGF0ZUZvcihpbnQgYnl0ZTEsIGludCBieXRlMiwgaW50IGJ5dGUzKSB7CisgICAgcmV0dXJuIChieXRlMSA+IChieXRlKSAweEY0IHx8CisgICAgICAgICAgICBieXRlMiA+IChieXRlKSAweEJGIHx8CisgICAgICAgICAgICBieXRlMyA+IChieXRlKSAweEJGKSA/CisgICAgICAgIE1BTEZPUk1FRCA6IGJ5dGUxIF4gKGJ5dGUyIDw8IDgpIF4gKGJ5dGUzIDw8IDE2KTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGludCBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZVtdIGJ5dGVzLCBpbnQgaW5kZXgsIGludCBsaW1pdCkgeworICAgIGludCBieXRlMSA9IGJ5dGVzW2luZGV4IC0gMV07CisgICAgc3dpdGNoIChsaW1pdCAtIGluZGV4KSB7CisgICAgICBjYXNlIDA6IHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEpOworICAgICAgY2FzZSAxOiByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlc1tpbmRleF0pOworICAgICAgY2FzZSAyOiByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlc1tpbmRleF0sIGJ5dGVzW2luZGV4ICsgMV0pOworICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmQ2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBhbmQgZ2VuZXJhdGVkCisgKiBtZXNzYWdlIGltcGxlbWVudGF0aW9ucy4gIEl0IGlzIHB1YmxpYyBvbmx5IGJlY2F1c2UgdGhvc2UgZ2VuZXJhdGVkIG1lc3NhZ2VzCisgKiBkbyBub3QgcmVzaWRlIGluIHRoZSB7QGNvZGUgcHJvdG9idWZ9IHBhY2thZ2UuICBPdGhlcnMgc2hvdWxkIG5vdCB1c2UgdGhpcworICogY2xhc3MgZGlyZWN0bHkuCisgKgorICogVGhpcyBjbGFzcyBjb250YWlucyBjb25zdGFudHMgYW5kIGhlbHBlciBmdW5jdGlvbnMgdXNlZnVsIGZvciBkZWFsaW5nIHdpdGgKKyAqIHRoZSBQcm90b2NvbCBCdWZmZXIgd2lyZSBmb3JtYXQuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdpcmVGb3JtYXQgeworICAvLyBEbyBub3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KKyAgcHJpdmF0ZSBXaXJlRm9ybWF0KCkge30KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICA9IDE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQgPSAyOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9TVEFSVF9HUk9VUCAgICAgID0gMzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfRU5EX0dST1VQICAgICAgICA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICAgPSA1OworCisgIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfQklUUyA9IDM7CisgIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfTUFTSyA9ICgxIDw8IFRBR19UWVBFX0JJVFMpIC0gMTsKKworICAvKiogR2l2ZW4gYSB0YWcgdmFsdWUsIGRldGVybWluZXMgdGhlIHdpcmUgdHlwZSAodGhlIGxvd2VyIDMgYml0cykuICovCisgIHN0YXRpYyBpbnQgZ2V0VGFnV2lyZVR5cGUoZmluYWwgaW50IHRhZykgeworICAgIHJldHVybiB0YWcgJiBUQUdfVFlQRV9NQVNLOworICB9CisKKyAgLyoqIEdpdmVuIGEgdGFnIHZhbHVlLCBkZXRlcm1pbmVzIHRoZSBmaWVsZCBudW1iZXIgKHRoZSB1cHBlciAyOSBiaXRzKS4gKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFnRmllbGROdW1iZXIoZmluYWwgaW50IHRhZykgeworICAgIHJldHVybiB0YWcgPj4+IFRBR19UWVBFX0JJVFM7CisgIH0KKworICAvKiogTWFrZXMgYSB0YWcgdmFsdWUgZ2l2ZW4gYSBmaWVsZCBudW1iZXIgYW5kIHdpcmUgdHlwZS4gKi8KKyAgc3RhdGljIGludCBtYWtlVGFnKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHdpcmVUeXBlKSB7CisgICAgcmV0dXJuIChmaWVsZE51bWJlciA8PCBUQUdfVFlQRV9CSVRTKSB8IHdpcmVUeXBlOworICB9CisKKyAgLyoqCisgICAqIExpdGUgZXF1aXZhbGVudCB0byB7QGxpbmsgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLkphdmFUeXBlfS4gIFRoaXMgaXMKKyAgICogb25seSBoZXJlIHRvIHN1cHBvcnQgdGhlIGxpdGUgcnVudGltZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHVzZXJzLgorICAgKi8KKyAgcHVibGljIGVudW0gSmF2YVR5cGUgeworICAgIElOVCgwKSwKKyAgICBMT05HKDBMKSwKKyAgICBGTE9BVCgwRiksCisgICAgRE9VQkxFKDBEKSwKKyAgICBCT09MRUFOKGZhbHNlKSwKKyAgICBTVFJJTkcoIiIpLAorICAgIEJZVEVfU1RSSU5HKEJ5dGVTdHJpbmcuRU1QVFkpLAorICAgIEVOVU0obnVsbCksCisgICAgTUVTU0FHRShudWxsKTsKKworICAgIEphdmFUeXBlKGZpbmFsIE9iamVjdCBkZWZhdWx0RGVmYXVsdCkgeworICAgICAgdGhpcy5kZWZhdWx0RGVmYXVsdCA9IGRlZmF1bHREZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUsIGlmIGl0J3MgYSBwcmltaXRpdmUKKyAgICAgKiB0eXBlLgorICAgICAqLworICAgIE9iamVjdCBnZXREZWZhdWx0RGVmYXVsdCgpIHsKKyAgICAgIHJldHVybiBkZWZhdWx0RGVmYXVsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0RGVmYXVsdDsKKyAgfQorCisgIC8qKgorICAgKiBMaXRlIGVxdWl2YWxlbnQgdG8ge0BsaW5rIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlfS4gIFRoaXMgaXMKKyAgICogb25seSBoZXJlIHRvIHN1cHBvcnQgdGhlIGxpdGUgcnVudGltZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHVzZXJzLgorICAgKi8KKyAgcHVibGljIGVudW0gRmllbGRUeXBlIHsKKyAgICBET1VCTEUgIChKYXZhVHlwZS5ET1VCTEUgICAgICwgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICksCisgICAgRkxPQVQgICAoSmF2YVR5cGUuRkxPQVQgICAgICAsIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICApLAorICAgIElOVDY0ICAgKEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKKyAgICBVSU5UNjQgIChKYXZhVHlwZS5MT05HICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCisgICAgSU5UMzIgICAoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAorICAgIEZJWEVENjQgKEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9GSVhFRDY0ICAgICAgICAgKSwKKyAgICBGSVhFRDMyIChKYXZhVHlwZS5JTlQgICAgICAgICwgV0lSRVRZUEVfRklYRUQzMiAgICAgICAgICksCisgICAgQk9PTCAgICAoSmF2YVR5cGUuQk9PTEVBTiAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAorICAgIFNUUklORyAgKEphdmFUeXBlLlNUUklORyAgICAgLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIEdST1VQICAgKEphdmFUeXBlLk1FU1NBR0UgICAgLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCAgICAgKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIE1FU1NBR0UgKEphdmFUeXBlLk1FU1NBR0UgICAgLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIEJZVEVTICAgKEphdmFUeXBlLkJZVEVfU1RSSU5HLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIFVJTlQzMiAgKEphdmFUeXBlLklOVCAgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKKyAgICBFTlVNICAgIChKYXZhVHlwZS5FTlVNICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCisgICAgU0ZJWEVEMzIoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICApLAorICAgIFNGSVhFRDY0KEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9GSVhFRDY0ICAgICAgICAgKSwKKyAgICBTSU5UMzIgIChKYXZhVHlwZS5JTlQgICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCisgICAgU0lOVDY0ICAoSmF2YVR5cGUuTE9ORyAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApOworCisgICAgRmllbGRUeXBlKGZpbmFsIEphdmFUeXBlIGphdmFUeXBlLCBmaW5hbCBpbnQgd2lyZVR5cGUpIHsKKyAgICAgIHRoaXMuamF2YVR5cGUgPSBqYXZhVHlwZTsKKyAgICAgIHRoaXMud2lyZVR5cGUgPSB3aXJlVHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEphdmFUeXBlIGphdmFUeXBlOworICAgIHByaXZhdGUgZmluYWwgaW50IHdpcmVUeXBlOworCisgICAgcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgeyByZXR1cm4gamF2YVR5cGU7IH0KKyAgICBwdWJsaWMgaW50IGdldFdpcmVUeXBlKCkgeyByZXR1cm4gd2lyZVR5cGU7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2FibGUoKSB7IHJldHVybiB0cnVlOyB9CisgIH0KKworICAvLyBGaWVsZCBudW1iZXJzIGZvciBmaWVsZHMgaW4gTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4KKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9JVEVNICAgID0gMTsKKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9UWVBFX0lEID0gMjsKKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9NRVNTQUdFID0gMzsKKworICAvLyBUYWcgbnVtYmVycy4KKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9JVEVNX1RBRyA9CisgICAgbWFrZVRhZyhNRVNTQUdFX1NFVF9JVEVNLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCk7CisgIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfSVRFTV9FTkRfVEFHID0KKyAgICBtYWtlVGFnKE1FU1NBR0VfU0VUX0lURU0sIFdJUkVUWVBFX0VORF9HUk9VUCk7CisgIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfVFlQRV9JRF9UQUcgPQorICAgIG1ha2VUYWcoTUVTU0FHRV9TRVRfVFlQRV9JRCwgV0lSRVRZUEVfVkFSSU5UKTsKKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9NRVNTQUdFX1RBRyA9CisgICAgbWFrZVRhZyhNRVNTQUdFX1NFVF9NRVNTQUdFLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwNWNiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTA5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RPcHRpbWl6ZWRGb3JTaXplOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkRm9yZWlnbjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RVbnBhY2tlZFR5cGVzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHtAbGluayBBYnN0cmFjdE1lc3NhZ2V9LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAvKioKKyAgICogRXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UgYW5kIHdyYXBzIHNvbWUgb3RoZXIgbWVzc2FnZSBvYmplY3QuICBUaGUgbWV0aG9kcworICAgKiBvZiB0aGUgTWVzc2FnZSBpbnRlcmZhY2Ugd2hpY2ggYXJlbid0IGV4cGxpY2l0bHkgaW1wbGVtZW50ZWQgYnkKKyAgICogQWJzdHJhY3RNZXNzYWdlIGFyZSBmb3J3YXJkZWQgdG8gdGhlIHdyYXBwZWQgb2JqZWN0LiAgVGhpcyBhbGxvd3MgdXMgdG8KKyAgICogdGVzdCB0aGF0IEFic3RyYWN0TWVzc2FnZSdzIGltcGxlbWVudGF0aW9ucyB3b3JrIGV2ZW4gaWYgdGhlIHdyYXBwZWQKKyAgICogb2JqZWN0IGRvZXMgbm90IHVzZSB0aGVtLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlIHdyYXBwZWRNZXNzYWdlOworCisgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoTWVzc2FnZSB3cmFwcGVkTWVzc2FnZSkgeworICAgICAgdGhpcy53cmFwcGVkTWVzc2FnZSA9IHdyYXBwZWRNZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisgICAgfQorICAgIHB1YmxpYyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7CisgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoCisgICAgICAgIHdyYXBwZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBNYXA8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5nZXRBbGxGaWVsZHMoKTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuaGFzRmllbGQoZmllbGQpOworICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldEZpZWxkKGZpZWxkKTsKKyAgICB9CisgICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICB9CisgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKAorICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKKyAgICB9CisgICAgcHVibGljIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldFVua25vd25GaWVsZHMoKTsKKyAgICB9CisgICAgcHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoKSB7CisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZE1lc3NhZ2UubmV3QnVpbGRlckZvclR5cGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHsKKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcih3cmFwcGVkTWVzc2FnZS50b0J1aWxkZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjxCdWlsZGVyPiB7CisgICAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciB3cmFwcGVkQnVpbGRlcjsKKworICAgICAgcHVibGljIEJ1aWxkZXIoTWVzc2FnZS5CdWlsZGVyIHdyYXBwZWRCdWlsZGVyKSB7CisgICAgICAgIHRoaXMud3JhcHBlZEJ1aWxkZXIgPSB3cmFwcGVkQnVpbGRlcjsKKyAgICAgIH0KKworICAgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgYnVpbGQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcih3cmFwcGVkQnVpbGRlci5idWlsZCgpKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIGJ1aWxkUGFydGlhbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKHdyYXBwZWRCdWlsZGVyLmJ1aWxkUGFydGlhbCgpKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGNsb25lKCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZEJ1aWxkZXIuY2xvbmUoKSk7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgICByZXR1cm4gY2xvbmUoKS5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCk7CisgICAgICB9CisgICAgICBwdWJsaWMgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisgICAgICB9CisgICAgICBwdWJsaWMgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoCisgICAgICAgICAgd3JhcHBlZEJ1aWxkZXIuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBNYXA8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmdldEFsbEZpZWxkcygpOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZEJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKSk7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmhhc0ZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRGaWVsZChmaWVsZCk7CisgICAgICB9CisgICAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB3cmFwcGVkQnVpbGRlci5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICAgIHdyYXBwZWRCdWlsZGVyLmNsZWFyRmllbGQoZmllbGQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZCgKKyAgICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHdyYXBwZWRCdWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZCgKKyAgICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB3cmFwcGVkQnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgcHVibGljIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0VW5rbm93bkZpZWxkcygpOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgeworICAgICAgICB3cmFwcGVkQnVpbGRlci5zZXRVbmtub3duRmllbGRzKHVua25vd25GaWVsZHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBnZXRGaWVsZEJ1aWxkZXIoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoZmllbGQpOworICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgUGFyc2VyPD8gZXh0ZW5kcyBNZXNzYWdlPiBnZXRQYXJzZXJGb3JUeXBlKCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldFBhcnNlckZvclR5cGUoKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7CisKKyAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOworCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9CisgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKAorICAgICAgICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKFRlc3RVdGlsLmdldEFsbFNldCgpKSkKKyAgICAgICAgLmNsZWFyKCkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcigoVGVzdEFsbFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKSkKKyAgICAgICAgLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRBbGxTZXQoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoKFRlc3RBbGxUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworICAgIE1lc3NhZ2UgYWJzdHJhY3RNZXNzYWdlID0gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoVGVzdFV0aWwuZ2V0QWxsU2V0KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgYWJzdHJhY3RNZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9IG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKFRlc3RVdGlsLmdldEFsbFNldCgpKTsKKworICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldCgKKyAgICAgIFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oYWJzdHJhY3RNZXNzYWdlLnRvQnl0ZVN0cmluZygpKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgIGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKSk7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KKyAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldCgoVGVzdEFsbFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzaW5nVW5pbml0aWFsaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24uQnVpbGRlciBidWlsZGVyID0gVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCk7CisgICAgYnVpbGRlci5nZXRPcHRpb25hbE1lc3NhZ2VCdWlsZGVyKCkuc2V0RHVtbXkyKDEwKTsKKyAgICBCeXRlU3RyaW5nIGJ5dGVzID0gYnVpbGRlci5idWlsZFBhcnRpYWwoKS50b0J5dGVTdHJpbmcoKTsKKyAgICBNZXNzYWdlLkJ1aWxkZXIgYWJzdHJhY3RNZXNzYWdlQnVpbGRlciA9CisgICAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCkpOworICAgIC8vIG1lcmdlRnJvbSgpIHNob3VsZCBub3QgdGhyb3cgaW5pdGlhbGl6YXRpb24gZXJyb3IuCisgICAgYWJzdHJhY3RNZXNzYWdlQnVpbGRlci5tZXJnZUZyb20oYnl0ZXMpLmJ1aWxkUGFydGlhbCgpOworICAgIHRyeSB7CisgICAgICBhYnN0cmFjdE1lc3NhZ2VCdWlsZGVyLm1lcmdlRnJvbShieXRlcykuYnVpbGQoKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBleCkgeworICAgICAgLy8gcGFzcworICAgIH0KKworICAgIC8vIHRlc3QgRHluYW1pY01lc3NhZ2UgZGlyZWN0bHkuCisgICAgTWVzc2FnZS5CdWlsZGVyIGR5bmFtaWNNZXNzYWdlQnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoCisgICAgICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24uZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAvLyBtZXJnZUZyb20oKSBzaG91bGQgbm90IHRocm93IGluaXRpYWxpemF0aW9uIGVycm9yLgorICAgIGR5bmFtaWNNZXNzYWdlQnVpbGRlci5tZXJnZUZyb20oYnl0ZXMpLmJ1aWxkUGFydGlhbCgpOworICAgIHRyeSB7CisgICAgICBkeW5hbWljTWVzc2FnZUJ1aWxkZXIubWVyZ2VGcm9tKGJ5dGVzKS5idWlsZCgpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGV4KSB7CisgICAgICAvLyBwYXNzCisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhY2tlZFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9CisgICAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpKTsKKworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldCgKKyAgICAgIFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20oYWJzdHJhY3RNZXNzYWdlLnRvQnl0ZVN0cmluZygpKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgIGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFja2VkUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKSk7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KKyAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldCgoVGVzdFBhY2tlZFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbnBhY2tlZFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9CisgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpKTsKKworICAgIFRlc3RVdGlsLmFzc2VydFVucGFja2VkRmllbGRzU2V0KAorICAgICAgVGVzdFVucGFja2VkVHlwZXMucGFyc2VGcm9tKGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOworCisgICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLmdldFVucGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgIGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQYWNrZWRUb1VucGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCkpOworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldCgKKyAgICAgIChUZXN0VW5wYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbnBhY2tlZFRvUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0UGFja2VkVHlwZXMubmV3QnVpbGRlcigpKTsKKyAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQorICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0VW5wYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoKFRlc3RQYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5wYWNrZWRQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCkpOworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFVucGFja2VkRmllbGRzU2V0KAorICAgICAgKFRlc3RVbnBhY2tlZFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcHRpbWl6ZWRGb3JTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gV2UncmUgbW9zdGx5IG9ubHkgY2hlY2tpbmcgdGhhdCB0aGlzIGNsYXNzIHdhcyBjb21waWxlZCBzdWNjZXNzZnVsbHkuCisgICAgVGVzdE9wdGltaXplZEZvclNpemUgbWVzc2FnZSA9CisgICAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCkuc2V0SSgxKS5idWlsZCgpOworICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUZXN0cyBmb3IgaXNJbml0aWFsaXplZCgpLgorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RSZXF1aXJlZCBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQgPQorICAgIFRlc3RSZXF1aXJlZC5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVzdFJlcXVpcmVkIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQgPQorICAgIFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkuc2V0QSgxKS5zZXRCKDIpLnNldEMoMykuYnVpbGQoKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0SXNJbml0aWFsaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpOworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBhYnN0cmFjdEJ1aWxkZXIgPQorICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihidWlsZGVyKTsKKworICAgIGFzc2VydEZhbHNlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGFzc2VydEVxdWFscygiYSwgYiwgYyIsIGFic3RyYWN0QnVpbGRlci5nZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOworICAgIGJ1aWxkZXIuc2V0QSgxKTsKKyAgICBhc3NlcnRGYWxzZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImIsIGMiLCBhYnN0cmFjdEJ1aWxkZXIuZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKKyAgICBidWlsZGVyLnNldEIoMSk7CisgICAgYXNzZXJ0RmFsc2UoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJjIiwgYWJzdHJhY3RCdWlsZGVyLmdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7CisgICAgYnVpbGRlci5zZXRDKDEpOworICAgIGFzc2VydFRydWUoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBhYnN0cmFjdEJ1aWxkZXIuZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RGb3JlaWduSXNJbml0aWFsaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24uQnVpbGRlciBidWlsZGVyID0gVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCk7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGFic3RyYWN0QnVpbGRlciA9CisgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKGJ1aWxkZXIpOworCisgICAgYXNzZXJ0VHJ1ZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIGFic3RyYWN0QnVpbGRlci5nZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOworCisgICAgYnVpbGRlci5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRGYWxzZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmEsIG9wdGlvbmFsX21lc3NhZ2UuYiwgb3B0aW9uYWxfbWVzc2FnZS5jIiwKKyAgICAgICAgYWJzdHJhY3RCdWlsZGVyLmdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7CisKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRUcnVlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgYWJzdHJhY3RCdWlsZGVyLmdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7CisKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOworICAgIGFzc2VydEZhbHNlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYSwgcmVwZWF0ZWRfbWVzc2FnZVswXS5iLCByZXBlYXRlZF9tZXNzYWdlWzBdLmMiLAorICAgICAgICBhYnN0cmFjdEJ1aWxkZXIuZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKKworICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRNZXNzYWdlKDAsIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBhYnN0cmFjdEJ1aWxkZXIuZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRlc3RzIGZvciBtZXJnZUZyb20KKworICBzdGF0aWMgZmluYWwgVGVzdEFsbFR5cGVzIE1FUkdFX1NPVVJDRSA9CisgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgLnNldE9wdGlvbmFsSW50MzIoMSkKKyAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiZm9vIikKKyAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQorICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJiYXIiKQorICAgICAgLmJ1aWxkKCk7CisKKyAgc3RhdGljIGZpbmFsIFRlc3RBbGxUeXBlcyBNRVJHRV9ERVNUID0KKyAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAuc2V0T3B0aW9uYWxJbnQ2NCgyKQorICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJiYXoiKQorICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMykuYnVpbGQoKSkKKyAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygicXV4IikKKyAgICAgIC5idWlsZCgpOworCisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfUkVTVUxUX1RFWFQgPQorICAgICAgIm9wdGlvbmFsX2ludDMyOiAxXG4iICsKKyAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIiArCisgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiXG4iICsKKyAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2Uge1xuIiArCisgICAgICAiICBjOiAzXG4iICsKKyAgICAgICJ9XG4iICsKKyAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwicXV4XCJcbiIgKworICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJiYXJcIlxuIjsKKworICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciByZXN1bHQgPQorICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcigKKyAgICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoTUVSR0VfREVTVCkpCisgICAgICAubWVyZ2VGcm9tKE1FUkdFX1NPVVJDRSkuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscyhNRVJHRV9SRVNVTFRfVEVYVCwgcmVzdWx0LnRvU3RyaW5nKCkpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGVzdHMgZm9yIGVxdWFscyBhbmQgaGFzaENvZGUKKworICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgYSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworICAgIFRlc3RBbGxUeXBlcyBiID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyBjID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoYikuYWRkUmVwZWF0ZWRTdHJpbmcoIngiKS5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyBkID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoYykuYWRkUmVwZWF0ZWRTdHJpbmcoInkiKS5idWlsZCgpOworICAgIFRlc3RBbGxFeHRlbnNpb25zIGUgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgZiA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoZSkKKyAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDk5OSkuYnVpbGQoKTsKKworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGEpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGIpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGMpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGQpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGUpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGYpOworCisgICAgY2hlY2tOb3RFcXVhbChhLCBiKTsKKyAgICBjaGVja05vdEVxdWFsKGEsIGMpOworICAgIGNoZWNrTm90RXF1YWwoYSwgZCk7CisgICAgY2hlY2tOb3RFcXVhbChhLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGEsIGYpOworCisgICAgY2hlY2tOb3RFcXVhbChiLCBjKTsKKyAgICBjaGVja05vdEVxdWFsKGIsIGQpOworICAgIGNoZWNrTm90RXF1YWwoYiwgZSk7CisgICAgY2hlY2tOb3RFcXVhbChiLCBmKTsKKworICAgIGNoZWNrTm90RXF1YWwoYywgZCk7CisgICAgY2hlY2tOb3RFcXVhbChjLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGMsIGYpOworCisgICAgY2hlY2tOb3RFcXVhbChkLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGQsIGYpOworCisgICAgY2hlY2tOb3RFcXVhbChlLCBmKTsKKworICAgIC8vIERlc2VyaWFsaXppbmcgaW50byB0aGUgVGVzdEVtcHR5TWVzc2FnZSBzdWNoIHRoYXQgZXZlcnkgZmllbGQKKyAgICAvLyBpcyBhbiB7QGxpbmsgVW5rbm93bkZpZWxkU2V0LkZpZWxkfS4KKyAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UgZVVua25vd25GaWVsZHMgPQorICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGUudG9CeXRlQXJyYXkoKSk7CisgICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlIGZVbmtub3duRmllbGRzID0KKyAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShmLnRvQnl0ZUFycmF5KCkpOworICAgIGNoZWNrTm90RXF1YWwoZVVua25vd25GaWVsZHMsIGZVbmtub3duRmllbGRzKTsKKyAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChlVW5rbm93bkZpZWxkcyk7CisgICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZlVua25vd25GaWVsZHMpOworCisgICAgLy8gU3Vic2VxdWVudCByZWNvbnN0aXR1dGlvbnMgc2hvdWxkIGJlIGlkZW50aWNhbAorICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZSBlVW5rbm93bkZpZWxkczIgPQorICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGUudG9CeXRlQXJyYXkoKSk7CisgICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZVVua25vd25GaWVsZHMsIGVVbmtub3duRmllbGRzMik7CisgIH0KKworCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvIGhhcyBzeW1tZXRyaWMgZXF1YWxzIGFuZCBoYXNoQ29kZSBtZXRob2RzLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIC8vIE9iamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gaXRzZWxmLgorICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBtZXNzYWdlKTsKKworICAgIC8vIE9iamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBkeW5hbWljIGNvcHkgb2YgaXRzZWxmLgorICAgIER5bmFtaWNNZXNzYWdlIGR5bmFtaWMgPSBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKG1lc3NhZ2UpLmJ1aWxkKCk7CisgICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQobWVzc2FnZSwgZHluYW1pYyk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBwcm90b3MgYXJlIGVxdWFsIGFuZCBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChNZXNzYWdlIG1lc3NhZ2UxLCBNZXNzYWdlIG1lc3NhZ2UyKSB7CisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UxLCBtZXNzYWdlMik7CisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UyLCBtZXNzYWdlMSk7CisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UyLmhhc2hDb2RlKCksIG1lc3NhZ2UxLmhhc2hDb2RlKCkpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gcHJvdG9zIGFyZSBub3QgZXF1YWwgYW5kIGhhdmUgZGlmZmVyZW50IGhhc2ggY29kZXMuCisgICAqCisgICAqIEB3YXJuaW5nIEl0J3MgdmFsaWQgZm9yIG5vbi1lcXVhbCBvYmplY3RzIHRvIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLCBzbworICAgKiAgIHRoaXMgdGVzdCBpcyBzdHJpY3RlciB0aGFuIGl0IG5lZWRzIHRvIGJlLiBIb3dldmVyLCB0aGlzIHNob3VsZCBoYXBwZW4KKyAgICogICByZWxhdGl2ZWx5IHJhcmVseS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBjaGVja05vdEVxdWFsKE1lc3NhZ2UgbTEsIE1lc3NhZ2UgbTIpIHsKKyAgICBTdHJpbmcgZXF1YWxzRXJyb3IgPSBTdHJpbmcuZm9ybWF0KCIlcyBzaG91bGQgbm90IGJlIGVxdWFsIHRvICVzIiwgbTEsIG0yKTsKKyAgICBhc3NlcnRGYWxzZShlcXVhbHNFcnJvciwgbTEuZXF1YWxzKG0yKSk7CisgICAgYXNzZXJ0RmFsc2UoZXF1YWxzRXJyb3IsIG0yLmVxdWFscyhtMSkpOworCisgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IGhhc2ggY29kZSBmcm9tICVzIiwgbTEsIG0yKSwKKyAgICAgICAgbTEuaGFzaENvZGUoKSA9PSBtMi5oYXNoQ29kZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Cb3VuZGVkQnl0ZVN0cmluZ1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQm91bmRlZEJ5dGVTdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmYTJkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQm91bmRlZEJ5dGVTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgdGVzdHMge0BsaW5rIEJvdW5kZWRCeXRlU3RyaW5nfSwgd2hpY2ggZXh0ZW5kcyB7QGxpbmsgTGl0ZXJhbEJ5dGVTdHJpbmd9LAorICogYnkgaW5oZXJpdGluZyB0aGUgdGVzdHMgZnJvbSB7QGxpbmsgTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0fS4gIFRoZSBvbmx5IG1ldGhvZCB3aGljaAorICogaXMgc3RyYW5nZSBlbm91Z2ggdGhhdCBpdCBuZWVkcyB0byBiZSBvdmVycmlkZGVuIGhlcmUgaXMge0BsaW5rICN0ZXN0VG9TdHJpbmcoKX0uCisgKgorICogQGF1dGhvciBjYXJsYW50b25AZ29vZ2xlLmNvbSAoQ2FybCBIYXZlcmwpCisgKi8KK3B1YmxpYyBjbGFzcyBCb3VuZGVkQnl0ZVN0cmluZ1Rlc3QgZXh0ZW5kcyBMaXRlcmFsQnl0ZVN0cmluZ1Rlc3QgeworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGNsYXNzVW5kZXJUZXN0ID0gIkJvdW5kZWRCeXRlU3RyaW5nIjsKKyAgICBieXRlW10gc291cmNlQnl0ZXMgPSBCeXRlU3RyaW5nVGVzdC5nZXRUZXN0Qnl0ZXMoMjM0MSwgMTEzMzc3NjZMKTsKKyAgICBpbnQgZnJvbSA9IDEwMDsKKyAgICBpbnQgdG8gPSBzb3VyY2VCeXRlcy5sZW5ndGggLSAxMDA7CisgICAgc3RyaW5nVW5kZXJUZXN0ID0gQnl0ZVN0cmluZy5jb3B5RnJvbShzb3VyY2VCeXRlcykuc3Vic3RyaW5nKGZyb20sIHRvKTsKKyAgICByZWZlcmVuY2VCeXRlcyA9IG5ldyBieXRlW3RvIC0gZnJvbV07CisgICAgU3lzdGVtLmFycmF5Y29weShzb3VyY2VCeXRlcywgZnJvbSwgcmVmZXJlbmNlQnl0ZXMsIDAsIHRvIC0gZnJvbSk7CisgICAgZXhwZWN0ZWRIYXNoQ29kZSA9IDcyNzU3NTg4NzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiSSBsb3ZlIHVuaWNvZGUgXHUxMjM0XHU1Njc4IGNoYXJhY3RlcnMiOworICAgIExpdGVyYWxCeXRlU3RyaW5nIHVuaWNvZGUgPSBuZXcgTGl0ZXJhbEJ5dGVTdHJpbmcodGVzdFN0cmluZy5nZXRCeXRlcyhVVEZfOCkpOworICAgIEJ5dGVTdHJpbmcgY2hvcHBlZCA9IHVuaWNvZGUuc3Vic3RyaW5nKDIsIHVuaWNvZGUuc2l6ZSgpIC0gNik7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIi5zdWJzdHJpbmcoKSBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHR5cGUiLAorICAgICAgICBjbGFzc1VuZGVyVGVzdCwgZ2V0QWN0dWFsQ2xhc3NOYW1lKGNob3BwZWQpKTsKKworICAgIFN0cmluZyByb3VuZFRyaXBTdHJpbmcgPSBjaG9wcGVkLnRvU3RyaW5nKFVURl84KTsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHVuaWNvZGUgYnl0ZXMgbXVzdCBtYXRjaCIsCisgICAgICAgIHRlc3RTdHJpbmcuc3Vic3RyaW5nKDIsIHRlc3RTdHJpbmcubGVuZ3RoKCkgLSA2KSwgcm91bmRUcmlwU3RyaW5nKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWQ2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw2OTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5PdXRwdXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogVGVzdCBtZXRob2RzIHdpdGggaW1wbGVtZW50YXRpb25zIGluIHtAbGluayBCeXRlU3RyaW5nfSwgcGx1cyBkbyBzb21lIHRvcC1sZXZlbCAiaW50ZWdyYXRpb24iCisgKiB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIChDYXJsIEhhdmVybCkKKyAqLworcHVibGljIGNsYXNzIEJ5dGVTdHJpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTYgPSAiVVRGLTE2IjsKKworICBzdGF0aWMgYnl0ZVtdIGdldFRlc3RCeXRlcyhpbnQgc2l6ZSwgbG9uZyBzZWVkKSB7CisgICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oc2VlZCk7CisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgIHJhbmRvbS5uZXh0Qnl0ZXMocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBieXRlW10gZ2V0VGVzdEJ5dGVzKGludCBzaXplKSB7CisgICAgcmV0dXJuIGdldFRlc3RCeXRlcyhzaXplLCA0NDU1NjZMKTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIGdldFRlc3RCeXRlcygpIHsKKyAgICByZXR1cm4gZ2V0VGVzdEJ5dGVzKDEwMDApOworICB9CisKKyAgLy8gQ29tcGFyZSB0aGUgZW50aXJlIGxlZnQgYXJyYXkgd2l0aCBhIHN1YnNldCBvZiB0aGUgcmlnaHQgYXJyYXkuCisgIHByaXZhdGUgYm9vbGVhbiBpc0FycmF5UmFuZ2UoYnl0ZVtdIGxlZnQsIGJ5dGVbXSByaWdodCwgaW50IHJpZ2h0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gKGxlZnQubGVuZ3RoID09IGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IChzdGlsbEVxdWFsICYmIGkgPCBsZW5ndGgpOyArK2kpIHsKKyAgICAgIHN0aWxsRXF1YWwgPSAobGVmdFtpXSA9PSByaWdodFtyaWdodE9mZnNldCArIGldKTsKKyAgICB9CisgICAgcmV0dXJuIHN0aWxsRXF1YWw7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgZ2l2ZW4gdHdvIGFycmF5cyBoYXZlIGlkZW50aWNhbCBjb250ZW50cy4KKyAgcHJpdmF0ZSBib29sZWFuIGlzQXJyYXkoYnl0ZVtdIGxlZnQsIGJ5dGVbXSByaWdodCkgeworICAgIHJldHVybiBsZWZ0Lmxlbmd0aCA9PSByaWdodC5sZW5ndGggJiYgaXNBcnJheVJhbmdlKGxlZnQsIHJpZ2h0LCAwLCBsZWZ0Lmxlbmd0aCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U3Vic3RyaW5nX0JlZ2luSW5kZXgoKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKCk7CisgICAgQnl0ZVN0cmluZyBzdWJzdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzKS5zdWJzdHJpbmcoNTAwKTsKKyAgICBhc3NlcnRUcnVlKCJzdWJzdHJpbmcgbXVzdCBjb250YWluIHRoZSB0YWlsIG9mIHRoZSBzdHJpbmciLAorICAgICAgICBpc0FycmF5UmFuZ2Uoc3Vic3RyaW5nLnRvQnl0ZUFycmF5KCksIGJ5dGVzLCA1MDAsIGJ5dGVzLmxlbmd0aCAtIDUwMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvcHlGcm9tX0J5dGVzT2Zmc2V0U2l6ZSgpIHsKKyAgICBieXRlW10gYnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoKTsKKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzLCA1MDAsIDIwMCk7CisgICAgYXNzZXJ0VHJ1ZSgiY29weUZyb20gc3ViLXJhbmdlIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAorICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCBieXRlcywgNTAwLCAyMDApKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbV9CeXRlcygpIHsKKyAgICBieXRlW10gYnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoKTsKKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzKTsKKyAgICBhc3NlcnRUcnVlKCJjb3B5RnJvbSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKKyAgICAgICAgaXNBcnJheShieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIGJ5dGVzKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29weUZyb21fQnl0ZUJ1ZmZlclNpemUoKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKCk7CisgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShieXRlcy5sZW5ndGgpOworICAgIGJ5dGVCdWZmZXIucHV0KGJ5dGVzKTsKKyAgICBieXRlQnVmZmVyLnBvc2l0aW9uKDUwMCk7CisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbShieXRlQnVmZmVyLCAyMDApOworICAgIGFzc2VydFRydWUoImNvcHlGcm9tIGJ5dGVCdWZmZXIgc3ViLXJhbmdlIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAorICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCBieXRlcywgNTAwLCAyMDApKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbV9CeXRlQnVmZmVyKCkgeworICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOworICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnl0ZXMubGVuZ3RoKTsKKyAgICBieXRlQnVmZmVyLnB1dChieXRlcyk7CisgICAgYnl0ZUJ1ZmZlci5wb3NpdGlvbig1MDApOworICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZUJ1ZmZlcik7CisgICAgYXNzZXJ0VHJ1ZSgiY29weUZyb20gYnl0ZUJ1ZmZlciBzdWItcmFuZ2UgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCisgICAgICAgIGlzQXJyYXlSYW5nZShieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIGJ5dGVzLCA1MDAsIGJ5dGVzLmxlbmd0aCAtIDUwMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvcHlGcm9tX1N0cmluZ0VuY29kaW5nKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHRlc3RTdHJpbmcsIFVURl8xNik7CisgICAgYnl0ZVtdIHRlc3RCeXRlcyA9IHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoVVRGXzE2KTsKKyAgICBhc3NlcnRUcnVlKCJjb3B5RnJvbSBzdHJpbmcgbXVzdCByZXNwZWN0IHRoZSBjaGFyc2V0IiwKKyAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwgdGVzdEJ5dGVzLCAwLCB0ZXN0Qnl0ZXMubGVuZ3RoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29weUZyb21fVXRmOCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJJIGxvdmUgdW5pY29kZSBcdTEyMzRcdTU2NzggY2hhcmFjdGVycyI7CisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgodGVzdFN0cmluZyk7CisgICAgYnl0ZVtdIHRlc3RCeXRlcyA9IHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgYXNzZXJ0VHJ1ZSgiY29weUZyb21VdGY4IHN0cmluZyBtdXN0IHJlc3BlY3QgdGhlIGNoYXJzZXQiLAorICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCB0ZXN0Qnl0ZXMsIDAsIHRlc3RCeXRlcy5sZW5ndGgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbV9JdGVyYWJsZSgpIHsKKyAgICBieXRlW10gdGVzdEJ5dGVzID0gZ2V0VGVzdEJ5dGVzKDc3Nzc3LCAxMTMzNDRMKTsKKyAgICBmaW5hbCBMaXN0PEJ5dGVTdHJpbmc+IHBpZWNlcyA9IG1ha2VDb25jcmV0ZVBpZWNlcyh0ZXN0Qnl0ZXMpOworICAgIC8vIENhbGwgY29weUZyb20oKSBvbiBhIENvbGxlY3Rpb24KKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHBpZWNlcyk7CisgICAgYXNzZXJ0VHJ1ZSgiY29weUZyb20gYSBMaXN0IG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAorICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCB0ZXN0Qnl0ZXMsIDAsIHRlc3RCeXRlcy5sZW5ndGgpKTsKKyAgICAvLyBDYWxsIGNvcHlGcm9tIG9uIGFuIGl0ZXJhdGlvbiB0aGF0J3Mgbm90IGEgY29sbGVjdGlvbgorICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZ0FsdCA9IEJ5dGVTdHJpbmcuY29weUZyb20obmV3IEl0ZXJhYmxlPEJ5dGVTdHJpbmc+KCkgeworICAgICAgcHVibGljIEl0ZXJhdG9yPEJ5dGVTdHJpbmc+IGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gcGllY2VzLml0ZXJhdG9yKCk7CisgICAgICB9CisgICAgfSk7CisgICAgYXNzZXJ0RXF1YWxzKCJjb3B5RnJvbSBmcm9tIGFuIEl0ZXJhdGlvbiBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKKyAgICAgICAgYnl0ZVN0cmluZywgYnl0ZVN0cmluZ0FsdCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29weVRvX1RhcmdldE9mZnNldCgpIHsKKyAgICBieXRlW10gYnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoKTsKKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzKTsKKyAgICBieXRlW10gdGFyZ2V0ID0gbmV3IGJ5dGVbYnl0ZXMubGVuZ3RoICsgMTAwMF07CisgICAgYnl0ZVN0cmluZy5jb3B5VG8odGFyZ2V0LCA0MDApOworICAgIGFzc2VydFRydWUoImNvcHlGcm9tIGJ5dGVCdWZmZXIgc3ViLXJhbmdlIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAorICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZXMsIHRhcmdldCwgNDAwLCBieXRlcy5sZW5ndGgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRnJvbV9lbXB0eVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0KKyAgICAgICAgQnl0ZVN0cmluZy5yZWFkRnJvbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKKyAgICBhc3NlcnRTYW1lKCJyZWFkaW5nIGFuIGVtcHR5IHN0cmVhbSBtdXN0IHJlc3VsdCBpbiB0aGUgRU1QVFkgY29uc3RhbnQgIgorICAgICAgICArICJieXRlIHN0cmluZyIsIEJ5dGVTdHJpbmcuRU1QVFksIGJ5dGVTdHJpbmcpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRGcm9tX3NtYWxsU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoMTApKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRnJvbV9tdXRhdGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGNhcHR1cmVkQXJyYXkgPSBudWxsOworICAgIEV2aWxJbnB1dFN0cmVhbSBlaXMgPSBuZXcgRXZpbElucHV0U3RyZWFtKCk7CisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gQnl0ZVN0cmluZy5yZWFkRnJvbShlaXMpOworCisgICAgY2FwdHVyZWRBcnJheSA9IGVpcy5jYXB0dXJlZEFycmF5OworICAgIGJ5dGVbXSBvcmlnaW5hbFZhbHVlID0gYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpOworICAgIGZvciAoaW50IHggPSAwOyB4IDwgY2FwdHVyZWRBcnJheS5sZW5ndGg7ICsreCkgeworICAgICAgY2FwdHVyZWRBcnJheVt4XSA9IChieXRlKSAwOworICAgIH0KKworICAgIGJ5dGVbXSBuZXdWYWx1ZSA9IGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKTsKKyAgICBhc3NlcnRUcnVlKCJjb3B5RnJvbSBieXRlQnVmZmVyIG11c3Qgbm90IGdyYW50IGFjY2VzcyB0byB1bmRlcmx5aW5nIGFycmF5IiwKKyAgICAgICAgQXJyYXlzLmVxdWFscyhvcmlnaW5hbFZhbHVlLCBuZXdWYWx1ZSkpOworICB9CisKKyAgLy8gVGVzdHMgc2l6ZXMgdGhhdCBhcmUgbmVhciB0aGUgcm9wZSBjb3B5LW91dCB0aHJlc2hvbGQuCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRnJvbV9tZWRpdW1TdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhCeXRlU3RyaW5nLkNPTkNBVEVOQVRFX0JZX0NPUFlfU0laRSAtIDEpKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoQnl0ZVN0cmluZy5DT05DQVRFTkFURV9CWV9DT1BZX1NJWkUpKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoQnl0ZVN0cmluZy5DT05DQVRFTkFURV9CWV9DT1BZX1NJWkUgKyAxKSk7CisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDIwMCkpOworICB9CisKKyAgLy8gVGVzdHMgc2l6ZXMgdGhhdCBhcmUgb3ZlciBtdWx0aS1zZWdtZW50IHJvcGUgdGhyZXNob2xkLgorICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21fbGFyZ2VTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygweDEwMCkpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygweDEwMSkpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygweDExMCkpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygweDEwMDApKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoMHgxMDAxKSk7CisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDB4MTAxMCkpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygweDEwMDAwKSk7CisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDB4MTAwMDEpKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoMHgxMDAxMCkpOworICB9CisKKyAgLy8gVGVzdHMgc2l6ZXMgdGhhdCBhcmUgbmVhciB0aGUgcmVhZCBidWZmZXIgc2l6ZS4KKyAgcHVibGljIHZvaWQgdGVzdFJlYWRGcm9tX2J5dGVCb3VuZGFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbWluID0gQnl0ZVN0cmluZy5NSU5fUkVBRF9GUk9NX0NIVU5LX1NJWkU7CisgICAgZmluYWwgaW50IG1heCA9IEJ5dGVTdHJpbmcuTUFYX1JFQURfRlJPTV9DSFVOS19TSVpFOworCisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiAtIDEpKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluKSk7CisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiArIDEpKTsKKworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtaW4gKiAyIC0gMSkpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtaW4gKiAyKSk7CisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiAqIDIgKyAxKSk7CisKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluICogNCAtIDEpKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluICogNCkpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtaW4gKiA0ICsgMSkpOworCisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiAqIDggLSAxKSk7CisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiAqIDgpKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluICogOCArIDEpKTsKKworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtYXggLSAxKSk7CisgICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1heCkpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtYXggKyAxKSk7CisKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWF4ICogMiAtIDEpKTsKKyAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWF4ICogMikpOworICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtYXggKiAyICsgMSkpOworICB9CisKKyAgLy8gVGVzdHMgdGhhdCBJT0V4Y2VwdGlvbnMgcHJvcGFnYXRlIHRocm91Z2ggQnl0ZVN0cmluZy5yZWFkRnJvbSgpLgorICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21fSU9FeGNlcHRpb25zKCkgeworICAgIHRyeSB7CisgICAgICBCeXRlU3RyaW5nLnJlYWRGcm9tKG5ldyBGYWlsU3RyZWFtKCkpOworICAgICAgZmFpbCgicmVhZEZyb20gbXVzdCB0aHJvdyB0aGUgdW5kZXJseWluZyBJT0V4Y2VwdGlvbiIpOworCisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJyZWFkRnJvbSBtdXN0IHRocm93IHRoZSBleHBlY3RlZCBleGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICJzeW50aGV0aWMgZmFpbHVyZSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvLyBUZXN0cyB0aGF0IEJ5dGVTdHJpbmcucmVhZEZyb20gd29ya3Mgd2l0aCBzdHJlYW1zIHRoYXQgZG9uJ3QKKyAgLy8gYWx3YXlzIGZpbGwgdGhlaXIgYnVmZmVycy4KKyAgcHVibGljIHZvaWQgdGVzdFJlYWRGcm9tX3JlbHVjdGFudFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBnZXRUZXN0Qnl0ZXMoMHgxMDAwKTsKKworICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcucmVhZEZyb20obmV3IFJlbHVjdGFudFN0cmVhbShkYXRhKSk7CisgICAgYXNzZXJ0VHJ1ZSgicmVhZEZyb20gYnl0ZSBzdHJlYW0gbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCisgICAgICAgIGlzQXJyYXkoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCBkYXRhKSk7CisKKyAgICAvLyBTYW1lIHRlc3QgYXMgYWJvdmUsIGJ1dCB3aXRoIHNvbWUgc3BlY2lmaWMgY2h1bmsgc2l6ZXMuCisgICAgYXNzZXJ0UmVhZEZyb21SZWx1Y3RhbnRTdHJlYW0oZGF0YSwgMTAwKTsKKyAgICBhc3NlcnRSZWFkRnJvbVJlbHVjdGFudFN0cmVhbShkYXRhLCAyNDgpOworICAgIGFzc2VydFJlYWRGcm9tUmVsdWN0YW50U3RyZWFtKGRhdGEsIDI0OSk7CisgICAgYXNzZXJ0UmVhZEZyb21SZWx1Y3RhbnRTdHJlYW0oZGF0YSwgMjUwKTsKKyAgICBhc3NlcnRSZWFkRnJvbVJlbHVjdGFudFN0cmVhbShkYXRhLCAyNTEpOworICAgIGFzc2VydFJlYWRGcm9tUmVsdWN0YW50U3RyZWFtKGRhdGEsIDB4MTAwMCk7CisgICAgYXNzZXJ0UmVhZEZyb21SZWx1Y3RhbnRTdHJlYW0oZGF0YSwgMHgxMDAxKTsKKyAgfQorCisgIC8vIEZhaWxzIHVubGVzcyBCeXRlU3RyaW5nLnJlYWRGcm9tIHJlYWRzIHRoZSBieXRlcyBjb3JyZWN0bHkgZnJvbSBhCisgIC8vIHJlbHVjdGFudCBzdHJlYW0gd2l0aCB0aGUgZ2l2ZW4gY2h1bmtTaXplIHBhcmFtZXRlci4KKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRGcm9tUmVsdWN0YW50U3RyZWFtKGJ5dGVbXSBieXRlcywgaW50IGNodW5rU2l6ZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBiID0gQnl0ZVN0cmluZy5yZWFkRnJvbShuZXcgUmVsdWN0YW50U3RyZWFtKGJ5dGVzKSwgY2h1bmtTaXplKTsKKyAgICBhc3NlcnRUcnVlKCJyZWFkRnJvbSBieXRlIHN0cmVhbSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKKyAgICAgICAgaXNBcnJheShiLnRvQnl0ZUFycmF5KCksIGJ5dGVzKSk7CisgIH0KKworICAvLyBUZXN0cyB0aGF0IEJ5dGVTdHJpbmcucmVhZEZyb20gd29ya3Mgd2l0aCBzdHJlYW1zIHRoYXQgaW1wbGVtZW50CisgIC8vIGF2YWlsYWJsZSgpLgorICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21fYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBieXRlW10gZGF0YSA9IGdldFRlc3RCeXRlcygweDEwMDEpOworCisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gQnl0ZVN0cmluZy5yZWFkRnJvbShuZXcgQXZhaWxhYmxlU3RyZWFtKGRhdGEpKTsKKyAgICBhc3NlcnRUcnVlKCJyZWFkRnJvbSBieXRlIHN0cmVhbSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKKyAgICAgICAgaXNBcnJheShieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIGRhdGEpKTsKKyAgfQorCisgIC8vIEZhaWxzIHVubGVzcyBCeXRlU3RyaW5nLnJlYWRGcm9tIHJlYWRzIHRoZSBieXRlcyBjb3JyZWN0bHkuCisgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkRnJvbShieXRlW10gYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0KKyAgICAgICAgQnl0ZVN0cmluZy5yZWFkRnJvbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKKyAgICBhc3NlcnRUcnVlKCJyZWFkRnJvbSBieXRlIHN0cmVhbSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKKyAgICAgICAgaXNBcnJheShieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIGJ5dGVzKSk7CisgIH0KKworICAvLyBBIHN0cmVhbSB0aGF0IGZhaWxzIHdoZW4gcmVhZC4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRmFpbFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic3ludGhldGljIGZhaWx1cmUiKTsKKyAgICB9CisgIH0KKworICAvLyBBIHN0cmVhbSB0aGF0IHNpbXVsYXRlcyBibG9ja2luZyBieSBvbmx5IHByb2R1Y2luZyAyNTAgY2hhcmFjdGVycworICAvLyBwZXIgY2FsbCB0byByZWFkKGJ5dGVbXSkuCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbHVjdGFudFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgYnl0ZVtdIGRhdGE7CisgICAgcHJvdGVjdGVkIGludCBwb3MgPSAwOworCisgICAgcHVibGljIFJlbHVjdGFudFN0cmVhbShieXRlW10gZGF0YSkgeworICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCByZWFkKCkgeworICAgICAgaWYgKHBvcyA9PSBkYXRhLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZGF0YVtwb3MrK107CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmKSB7CisgICAgICByZXR1cm4gcmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IHNpemUpIHsKKyAgICAgIGlmIChwb3MgPT0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaW50IGNvdW50ID0gTWF0aC5taW4oTWF0aC5taW4oc2l6ZSwgZGF0YS5sZW5ndGggLSBwb3MpLCAyNTApOworICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBwb3MsIGJ1Ziwgb2Zmc2V0LCBjb3VudCk7CisgICAgICBwb3MgKz0gY291bnQ7CisgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorICB9CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IGFsc28gaW1wbGVtZW50cyBhdmFpbGFibGUoKS4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQXZhaWxhYmxlU3RyZWFtIGV4dGVuZHMgUmVsdWN0YW50U3RyZWFtIHsKKyAgICBwdWJsaWMgQXZhaWxhYmxlU3RyZWFtKGJ5dGVbXSBkYXRhKSB7CisgICAgICBzdXBlcihkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBhdmFpbGFibGUoKSB7CisgICAgICByZXR1cm4gTWF0aC5taW4oMjUwLCBkYXRhLmxlbmd0aCAtIHBvcyk7CisgICAgfQorICB9CisKKyAgLy8gQSBzdHJlYW0gd2hpY2ggZXhwb3NlcyB0aGUgYnl0ZSBhcnJheSBwYXNzZWQgaW50byByZWFkKGJ5dGVbXSwgaW50LCBpbnQpLgorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFdmlsSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgcHVibGljIGJ5dGVbXSBjYXB0dXJlZEFycmF5ID0gbnVsbDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICBpZiAoY2FwdHVyZWRBcnJheSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhcHR1cmVkQXJyYXkgPSBidWY7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbGVuOyArK3gpIHsKKyAgICAgICAgICBidWZbeF0gPSAoYnl0ZSkgeDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGVuOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHsKKyAgICAgIC8vIFB1cnBvc2VmdWxseSBkbyBub3RoaW5nLgorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICAKKyAgLy8gQSBzdHJlYW0gd2hpY2ggZXhwb3NlcyB0aGUgYnl0ZSBhcnJheSBwYXNzZWQgaW50byB3cml0ZShieXRlW10sIGludCwgaW50KS4KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXZpbE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisgICAgcHVibGljIGJ5dGVbXSBjYXB0dXJlZEFycmF5ID0gbnVsbDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgIGlmIChjYXB0dXJlZEFycmF5ID09IG51bGwpIHsKKyAgICAgICAgY2FwdHVyZWRBcnJheSA9IGJ1ZjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgaWdub3JlZCkgeworICAgICAgLy8gUHVycG9zZWZ1bGx5IGRvIG5vdGhpbmcuCisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nVXRmOCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJJIGxvdmUgdW5pY29kZSBcdTEyMzRcdTU2NzggY2hhcmFjdGVycyI7CisgICAgYnl0ZVtdIHRlc3RCeXRlcyA9IHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbSh0ZXN0Qnl0ZXMpOworICAgIGFzc2VydEVxdWFscygiY29weVRvU3RyaW5nVXRmOCBtdXN0IHJlc3BlY3QgdGhlIGNoYXJzZXQiLAorICAgICAgICB0ZXN0U3RyaW5nLCBieXRlU3RyaW5nLnRvU3RyaW5nVXRmOCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROZXdPdXRwdXRfSW5pdGlhbENhcGFjaXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoKTsKKyAgICBCeXRlU3RyaW5nLk91dHB1dCBvdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dChieXRlcy5sZW5ndGggKyAxMDApOworICAgIG91dHB1dC53cml0ZShieXRlcyk7CisgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gb3V0cHV0LnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydFRydWUoCisgICAgICAgICJTdHJpbmcgYnVpbHQgZnJvbSBuZXdPdXRwdXQoaW50KSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKKyAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVzLCBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIDAsIGJ5dGVzLmxlbmd0aCkpOworICB9CisKKyAgLy8gVGVzdCBuZXdPdXRwdXQoKSB1c2luZyBhIHZhcmlldHkgb2YgYnVmZmVyIHNpemVzIGFuZCBhIHZhcmlldHkgb2YgKGZpeGVkKQorICAvLyB3cml0ZSBzaXplcworICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0X0FycmF5V3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOworICAgIGludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisgICAgaW50W10gYnVmZmVyU2l6ZXMgPSB7MTI4LCAyNTYsIGxlbmd0aCAvIDIsIGxlbmd0aCAtIDEsIGxlbmd0aCwgbGVuZ3RoICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAyICogbGVuZ3RoLCAzICogbGVuZ3RofTsKKyAgICBpbnRbXSB3cml0ZVNpemVzID0gezEsIDQsIDUsIDcsIDIzLCBieXRlcy5sZW5ndGh9OworCisgICAgZm9yIChpbnQgYnVmZmVyU2l6ZSA6IGJ1ZmZlclNpemVzKSB7CisgICAgICBmb3IgKGludCB3cml0ZVNpemUgOiB3cml0ZVNpemVzKSB7CisgICAgICAgIC8vIFRlc3Qgd3JpdGluZyB0aGUgZW50aXJlIG91dHB1dCB3cml0ZVNpemUgYnl0ZXMgYXQgYSB0aW1lLgorICAgICAgICBCeXRlU3RyaW5nLk91dHB1dCBvdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dChidWZmZXJTaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gd3JpdGVTaXplKSB7CisgICAgICAgICAgb3V0cHV0LndyaXRlKGJ5dGVzLCBpLCBNYXRoLm1pbih3cml0ZVNpemUsIGxlbmd0aCAtIGkpKTsKKyAgICAgICAgfQorICAgICAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBvdXRwdXQudG9CeXRlU3RyaW5nKCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0cmluZyBidWlsdCBmcm9tIG5ld091dHB1dCgpIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAorICAgICAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVzLCBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIDAsIGJ5dGVzLmxlbmd0aCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFRlc3QgbmV3T3V0cHV0KCkgdXNpbmcgYSB2YXJpZXR5IG9mIGJ1ZmZlciBzaXplcywgYnV0IHdyaXRpbmcgYWxsIHRoZQorICAvLyBjaGFyYWN0ZXJzIHVzaW5nIHdyaXRlKGJ5dGUpOworICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0X1dyaXRlQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKCk7CisgICAgaW50IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgICBpbnRbXSBidWZmZXJTaXplcyA9IHswLCAxLCAxMjgsIDI1NiwgbGVuZ3RoIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLSAxLCBsZW5ndGgsIGxlbmd0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGxlbmd0aCwgMyAqIGxlbmd0aH07CisgICAgZm9yIChpbnQgYnVmZmVyU2l6ZSA6IGJ1ZmZlclNpemVzKSB7CisgICAgICBCeXRlU3RyaW5nLk91dHB1dCBvdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dChidWZmZXJTaXplKTsKKyAgICAgIGZvciAoYnl0ZSBieXRlVmFsdWUgOiBieXRlcykgeworICAgICAgICBvdXRwdXQud3JpdGUoYnl0ZVZhbHVlKTsKKyAgICAgIH0KKyAgICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IG91dHB1dC50b0J5dGVTdHJpbmcoKTsKKyAgICAgIGFzc2VydFRydWUoIlN0cmluZyBidWlsdCBmcm9tIG5ld091dHB1dCgpIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAorICAgICAgICAgIGlzQXJyYXlSYW5nZShieXRlcywgYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCAwLCBieXRlcy5sZW5ndGgpKTsKKyAgICB9CisgIH0KKworICAvLyBUZXN0IG5ld091dHB1dCgpIGluIHdoaWNoIHdlIHdyaXRlIHRoZSBieXRlcyB1c2luZyBhIHZhcmlldHkgb2YgbWV0aG9kcworICAvLyBhbmQgc2l6ZXMsIGFuZCBpbiB3aGljaCB3ZSByZXBlYXRlZGx5IGNhbGwgdG9CeXRlU3RyaW5nKCkgaW4gdGhlIG1pZGRsZS4KKyAgcHVibGljIHZvaWQgdGVzdE5ld091dHB1dF9NaXhlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmFuZG9tIHJuZyA9IG5ldyBSYW5kb20oMSk7CisgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKCk7CisgICAgaW50IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgICBpbnRbXSBidWZmZXJTaXplcyA9IHswLCAxLCAxMjgsIDI1NiwgbGVuZ3RoIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLSAxLCBsZW5ndGgsIGxlbmd0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGxlbmd0aCwgMyAqIGxlbmd0aH07CisKKyAgICBmb3IgKGludCBidWZmZXJTaXplIDogYnVmZmVyU2l6ZXMpIHsKKyAgICAgIC8vIFRlc3Qgd3JpdGluZyB0aGUgZW50aXJlIG91dHB1dCB1c2luZyBhIG1peHR1cmUgb2Ygd3JpdGUgc2l6ZXMgYW5kCisgICAgICAvLyBtZXRob2RzOworICAgICAgQnl0ZVN0cmluZy5PdXRwdXQgb3V0cHV0ID0gQnl0ZVN0cmluZy5uZXdPdXRwdXQoYnVmZmVyU2l6ZSk7CisgICAgICBpbnQgcG9zaXRpb24gPSAwOworICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYnl0ZXMubGVuZ3RoKSB7CisgICAgICAgIGlmIChybmcubmV4dEJvb2xlYW4oKSkgeworICAgICAgICAgIGludCBjb3VudCA9IDEgKyBybmcubmV4dEludChieXRlcy5sZW5ndGggLSBwb3NpdGlvbik7CisgICAgICAgICAgb3V0cHV0LndyaXRlKGJ5dGVzLCBwb3NpdGlvbiwgY291bnQpOworICAgICAgICAgIHBvc2l0aW9uICs9IGNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dHB1dC53cml0ZShieXRlc1twb3NpdGlvbl0pOworICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplKCkgcmV0dXJucyB0aGUgcmlnaHQgdmFsdWUiLCBwb3NpdGlvbiwgb3V0cHV0LnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIm5ld091dHB1dCgpIHN1YnN0cmluZyBtdXN0IGhhdmUgY29ycmVjdCBieXRlcyIsCisgICAgICAgICAgICBpc0FycmF5UmFuZ2Uob3V0cHV0LnRvQnl0ZVN0cmluZygpLnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgYnl0ZXMsIDAsIHBvc2l0aW9uKSk7CisgICAgICB9CisgICAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBvdXRwdXQudG9CeXRlU3RyaW5nKCk7CisgICAgICBhc3NlcnRUcnVlKCJTdHJpbmcgYnVpbHQgZnJvbSBuZXdPdXRwdXQoKSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKKyAgICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZXMsIGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwgMCwgYnl0ZXMubGVuZ3RoKSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0RW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIE1ha2Ugc3VyZSBuZXdPdXRwdXQoKSBjb3JyZWN0bHkgYnVpbGRzIGVtcHR5IGJ5dGUgc3RyaW5ncworICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KCkudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIGJ5dGVTdHJpbmcpOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0X011dGF0aW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBPdXRwdXQgb3MgPSBCeXRlU3RyaW5nLm5ld091dHB1dCg1KTsKKyAgICBvcy53cml0ZShuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fSk7CisgICAgRXZpbE91dHB1dFN0cmVhbSBlb3MgPSBuZXcgRXZpbE91dHB1dFN0cmVhbSgpOworICAgIG9zLndyaXRlVG8oZW9zKTsKKyAgICBieXRlW10gY2FwdHVyZWRBcnJheSA9IGVvcy5jYXB0dXJlZEFycmF5OworICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IG9zLnRvQnl0ZVN0cmluZygpOworICAgIGJ5dGVbXSBvbGRWYWx1ZSA9IGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKTsKKyAgICBBcnJheXMuZmlsbChjYXB0dXJlZEFycmF5LCAoYnl0ZSkgMCk7CisgICAgYnl0ZVtdIG5ld1ZhbHVlID0gYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpOworICAgIGFzc2VydFRydWUoIk91dHB1dCBtdXN0IG5vdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBieXRlIGFycmF5IiwKKyAgICAgICAgQXJyYXlzLmVxdWFscyhvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROZXdDb2RlZEJ1aWxkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOworICAgIEJ5dGVTdHJpbmcuQ29kZWRCdWlsZGVyIGJ1aWxkZXIgPSBCeXRlU3RyaW5nLm5ld0NvZGVkQnVpbGRlcihieXRlcy5sZW5ndGgpOworICAgIGJ1aWxkZXIuZ2V0Q29kZWRPdXRwdXQoKS53cml0ZVJhd0J5dGVzKGJ5dGVzKTsKKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0VHJ1ZSgiU3RyaW5nIGJ1aWx0IGZyb20gbmV3Q29kZWRCdWlsZGVyKCkgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCisgICAgICAgIGlzQXJyYXlSYW5nZShieXRlcywgYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCAwLCBieXRlcy5sZW5ndGgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTdWJzdHJpbmdQYXJpdHkoKSB7CisgICAgYnl0ZVtdIGJpZ0J5dGVzID0gZ2V0VGVzdEJ5dGVzKDIwNDggKiAxMDI0LCAxMTMzNDRMKTsKKyAgICBpbnQgc3RhcnQgPSA1MTIgKiAxMDI0IC0gMzMzMzsKKyAgICBpbnQgZW5kICAgPSA1MTIgKiAxMDI0ICsgNzc3NzsKKyAgICBCeXRlU3RyaW5nIGNvbmNyZXRlU3Vic3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbShiaWdCeXRlcykuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgIGZvciAoaW50IGkgPSBzdGFydDsgb2sgJiYgaSA8IGVuZDsgKytpKSB7CisgICAgICBvayA9IChiaWdCeXRlc1tpXSA9PSBjb25jcmV0ZVN1YnN0cmluZy5ieXRlQXQoaSAtIHN0YXJ0KSk7CisgICAgfQorICAgIGFzc2VydFRydWUoIkNvbmNyZXRlIHN1YnN0cmluZyBkaWRuJ3QgY2FwdHVyZSB0aGUgcmlnaHQgYnl0ZXMiLCBvayk7CisKKyAgICBCeXRlU3RyaW5nIGxpdGVyYWxTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJpZ0J5dGVzLCBzdGFydCwgZW5kIC0gc3RhcnQpOworICAgIGFzc2VydFRydWUoIlN1YnN0cmluZyBtdXN0IGJlIGVxdWFsIHRvIGxpdGVyYWwgc3RyaW5nIiwKKyAgICAgICAgY29uY3JldGVTdWJzdHJpbmcuZXF1YWxzKGxpdGVyYWxTdHJpbmcpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlN1YnN0cmluZyBtdXN0IGhhdmUgc2FtZSBoYXNoY29kZSBhcyBsaXRlcmFsIHN0cmluZyIsCisgICAgICAgIGxpdGVyYWxTdHJpbmcuaGFzaENvZGUoKSwgY29uY3JldGVTdWJzdHJpbmcuaGFzaENvZGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlU3Vic3RyaW5nKCkgeworICAgIGJ5dGVbXSByZWZlcmVuY2VCeXRlcyA9IGdldFRlc3RCeXRlcyg3Nzc0OCwgMTEzMzQ0TCk7CisKKyAgICBMaXN0PEJ5dGVTdHJpbmc+IHBpZWNlcyA9IG1ha2VDb25jcmV0ZVBpZWNlcyhyZWZlcmVuY2VCeXRlcyk7CisgICAgQnl0ZVN0cmluZyBsaXN0U3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbShwaWVjZXMpOworCisgICAgaW50IGZyb20gPSAxMDAwOworICAgIGludCB0byA9IDQwMDAwOworICAgIEJ5dGVTdHJpbmcgY29tcG9zaXRlU3Vic3RyaW5nID0gbGlzdFN0cmluZy5zdWJzdHJpbmcoZnJvbSwgdG8pOworICAgIGJ5dGVbXSBzdWJzdHJpbmdCeXRlcyA9IGNvbXBvc2l0ZVN1YnN0cmluZy50b0J5dGVBcnJheSgpOworICAgIGJvb2xlYW4gc3RpbGxFcXVhbCA9IHRydWU7CisgICAgZm9yIChpbnQgaSA9IDA7IHN0aWxsRXF1YWwgJiYgaSA8IHRvIC0gZnJvbTsgKytpKSB7CisgICAgICBzdGlsbEVxdWFsID0gcmVmZXJlbmNlQnl0ZXNbZnJvbSArIGldID09IHN1YnN0cmluZ0J5dGVzW2ldOworICAgIH0KKyAgICBhc3NlcnRUcnVlKCJTdWJzdHJpbmcgbXVzdCByZXR1cm4gY29ycmVjdCBieXRlcyIsIHN0aWxsRXF1YWwpOworCisgICAgc3RpbGxFcXVhbCA9IHRydWU7CisgICAgZm9yIChpbnQgaSA9IDA7IHN0aWxsRXF1YWwgJiYgaSA8IHRvIC0gZnJvbTsgKytpKSB7CisgICAgICBzdGlsbEVxdWFsID0gcmVmZXJlbmNlQnl0ZXNbZnJvbSArIGldID09IGNvbXBvc2l0ZVN1YnN0cmluZy5ieXRlQXQoaSk7CisgICAgfQorICAgIGFzc2VydFRydWUoIlN1YnN0cmluZyBtdXN0IHN1cHBvcnQgYnl0ZUF0KCkgY29ycmVjdGx5Iiwgc3RpbGxFcXVhbCk7CisKKyAgICBCeXRlU3RyaW5nIGxpdGVyYWxTdWJzdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlZmVyZW5jZUJ5dGVzLCBmcm9tLCB0byAtIGZyb20pOworICAgIGFzc2VydFRydWUoIkNvbXBvc2l0ZSBzdWJzdHJpbmcgbXVzdCBlcXVhbCBhIGxpdGVyYWwgc3Vic3RyaW5nIG92ZXIgdGhlIHNhbWUgYnl0ZXMiLAorICAgICAgICBjb21wb3NpdGVTdWJzdHJpbmcuZXF1YWxzKGxpdGVyYWxTdWJzdHJpbmcpKTsKKyAgICBhc3NlcnRUcnVlKCJMaXRlcmFsIHN1YnN0cmluZyBtdXN0IGVxdWFsIGEgY29tcG9zaXRlIHN1YnN0cmluZyBvdmVyIHRoZSBzYW1lIGJ5dGVzIiwKKyAgICAgICAgbGl0ZXJhbFN1YnN0cmluZy5lcXVhbHMoY29tcG9zaXRlU3Vic3RyaW5nKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIldlIG11c3QgZ2V0IHRoZSBzYW1lIGhhc2hjb2RlcyBmb3IgY29tcG9zaXRlIGFuZCBsaXRlcmFsIHN1YnN0cmluZ3MiLAorICAgICAgICBsaXRlcmFsU3Vic3RyaW5nLmhhc2hDb2RlKCksIGNvbXBvc2l0ZVN1YnN0cmluZy5oYXNoQ29kZSgpKTsKKworICAgIGFzc2VydEZhbHNlKCJXZSBjYW4ndCBiZSBlcXVhbCB0byBhIHByb3BlciBzdWJzdHJpbmciLAorICAgICAgICBjb21wb3NpdGVTdWJzdHJpbmcuZXF1YWxzKGxpdGVyYWxTdWJzdHJpbmcuc3Vic3RyaW5nKDAsIGxpdGVyYWxTdWJzdHJpbmcuc2l6ZSgpIC0gMSkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbUxpc3QoKSB7CisgICAgYnl0ZVtdIHJlZmVyZW5jZUJ5dGVzID0gZ2V0VGVzdEJ5dGVzKDc3NzQ4LCAxMTMzNDRMKTsKKyAgICBCeXRlU3RyaW5nIGxpdGVyYWxTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlZmVyZW5jZUJ5dGVzKTsKKworICAgIExpc3Q8Qnl0ZVN0cmluZz4gcGllY2VzID0gbWFrZUNvbmNyZXRlUGllY2VzKHJlZmVyZW5jZUJ5dGVzKTsKKyAgICBCeXRlU3RyaW5nIGxpc3RTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHBpZWNlcyk7CisKKyAgICBhc3NlcnRUcnVlKCJDb21wb3NpdGUgc3RyaW5nIG11c3QgYmUgZXF1YWwgdG8gbGl0ZXJhbCBzdHJpbmciLAorICAgICAgICBsaXN0U3RyaW5nLmVxdWFscyhsaXRlcmFsU3RyaW5nKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJDb21wb3NpdGUgc3RyaW5nIG11c3QgaGF2ZSBzYW1lIGhhc2hjb2RlIGFzIGxpdGVyYWwgc3RyaW5nIiwKKyAgICAgICAgbGl0ZXJhbFN0cmluZy5oYXNoQ29kZSgpLCBsaXN0U3RyaW5nLmhhc2hDb2RlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvbmNhdCgpIHsKKyAgICBieXRlW10gcmVmZXJlbmNlQnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoNzc3NDgsIDExMzM0NEwpOworICAgIEJ5dGVTdHJpbmcgbGl0ZXJhbFN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20ocmVmZXJlbmNlQnl0ZXMpOworCisgICAgTGlzdDxCeXRlU3RyaW5nPiBwaWVjZXMgPSBtYWtlQ29uY3JldGVQaWVjZXMocmVmZXJlbmNlQnl0ZXMpOworCisgICAgSXRlcmF0b3I8Qnl0ZVN0cmluZz4gaXRlciA9IHBpZWNlcy5pdGVyYXRvcigpOworICAgIEJ5dGVTdHJpbmcgY29uY2F0ZW5hdGVkU3RyaW5nID0gaXRlci5uZXh0KCk7CisgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICBjb25jYXRlbmF0ZWRTdHJpbmcgPSBjb25jYXRlbmF0ZWRTdHJpbmcuY29uY2F0KGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBhc3NlcnRUcnVlKCJDb25jYXRlbmF0ZWQgc3RyaW5nIG11c3QgYmUgZXF1YWwgdG8gbGl0ZXJhbCBzdHJpbmciLAorICAgICAgICBjb25jYXRlbmF0ZWRTdHJpbmcuZXF1YWxzKGxpdGVyYWxTdHJpbmcpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkNvbmNhdGVuYXRlZCBzdHJpbmcgbXVzdCBoYXZlIHNhbWUgaGFzaGNvZGUgYXMgbGl0ZXJhbCBzdHJpbmciLAorICAgICAgICBsaXRlcmFsU3RyaW5nLmhhc2hDb2RlKCksIGNvbmNhdGVuYXRlZFN0cmluZy5oYXNoQ29kZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IHRoZSBSb3BlIGltcGxlbWVudGF0aW9uIGNhbiBkZWFsIHdpdGggRW1wdHkgbm9kZXMsIGV2ZW4gdGhvdWdoIHdlCisgICAqIGd1YXJkIGFnYWluc3QgdGhlbS4gU2VlIGFsc28ge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nVGVzdCN0ZXN0Q29uY2F0X2VtcHR5KCl9LgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdENvbmNhdF9lbXB0eSgpIHsKKyAgICBieXRlW10gcmVmZXJlbmNlQnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoNzc0OCwgMTEzMzQ0TCk7CisgICAgQnl0ZVN0cmluZyBsaXRlcmFsU3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbShyZWZlcmVuY2VCeXRlcyk7CisKKyAgICBCeXRlU3RyaW5nIGR1byA9IFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdChsaXRlcmFsU3RyaW5nLCBsaXRlcmFsU3RyaW5nKTsKKyAgICBCeXRlU3RyaW5nIHRlbXAgPSBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3QoCisgICAgICAgIFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdChsaXRlcmFsU3RyaW5nLCBCeXRlU3RyaW5nLkVNUFRZKSwKKyAgICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KEJ5dGVTdHJpbmcuRU1QVFksIGxpdGVyYWxTdHJpbmcpKTsKKyAgICBCeXRlU3RyaW5nIHF1aW50ZXQgPSBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3QodGVtcCwgQnl0ZVN0cmluZy5FTVBUWSk7CisKKyAgICBhc3NlcnRUcnVlKCJTdHJpbmcgd2l0aCBjb25jYXRlbmF0ZWQgbnVsbHMgbXVzdCBlcXVhbCBzaW1wbGUgY29uY2F0ZW5hdGUiLAorICAgICAgICBkdW8uZXF1YWxzKHF1aW50ZXQpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlN0cmluZyB3aXRoIGNvbmNhdGVuYXRlZCBudWxscyBoYXZlIHNhbWUgaGFzaGNvZGUgYXMgc2ltcGxlIGNvbmNhdGVuYXRlIiwKKyAgICAgICAgZHVvLmhhc2hDb2RlKCksIHF1aW50ZXQuaGFzaENvZGUoKSk7CisKKyAgICBCeXRlU3RyaW5nLkJ5dGVJdGVyYXRvciBkdW9JdGVyID0gZHVvLml0ZXJhdG9yKCk7CisgICAgQnl0ZVN0cmluZy5CeXRlSXRlcmF0b3IgcXVpbnRldEl0ZXIgPSBxdWludGV0Lml0ZXJhdG9yKCk7CisgICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gdHJ1ZTsKKyAgICB3aGlsZSAoc3RpbGxFcXVhbCAmJiBxdWludGV0SXRlci5oYXNOZXh0KCkpIHsKKyAgICAgIHN0aWxsRXF1YWwgPSAoZHVvSXRlci5uZXh0Qnl0ZSgpID09IHF1aW50ZXRJdGVyLm5leHRCeXRlKCkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKCJXZSBtdXN0IGdldCB0aGUgc2FtZSBjaGFyYWN0ZXJzIGJ5IGl0ZXJhdGluZyIsIHN0aWxsRXF1YWwpOworICAgIGFzc2VydEZhbHNlKCJJdGVyYXRvciBtdXN0IGJlIGV4aGF1c3RlZCIsIGR1b0l0ZXIuaGFzTmV4dCgpKTsKKyAgICB0cnkgeworICAgICAgZHVvSXRlci5uZXh0Qnl0ZSgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcworICAgIH0KKyAgICB0cnkgeworICAgICAgcXVpbnRldEl0ZXIubmV4dEJ5dGUoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKKyAgICB9CisKKyAgICAvLyBUZXN0IHRoYXQgZXZlbiBpZiB3ZSBmb3JjZSBlbXB0eSBzdHJpbmdzIGluIGFzIHJvcGUgbGVhdmVzIGluIHRoaXMKKyAgICAvLyBjb25maWd1cmF0aW9uLCB3ZSBhbHdheXMgZ2V0IGEgKHBvc3NpYmx5IEJvdW5kZWQpIExpdGVyYWxCeXRlU3RyaW5nCisgICAgLy8gZm9yIGEgbGVuZ3RoIDEgc3Vic3RyaW5nLgorICAgIC8vCisgICAgLy8gSXQgaXMgcG9zc2libGUsIHVzaW5nIHRoZSB0ZXN0aW5nIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBkZWVwbHkgbmVzdGVkCisgICAgLy8gdHJlZXMgb2YgZW1wdHkgbGVhdmVzLCB0byBtYWtlIGEgc3RyaW5nIHRoYXQgd2lsbCBmYWlsIHRoaXMgdGVzdC4KKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGR1by5zaXplKCk7ICsraSkgeworICAgICAgYXNzZXJ0VHJ1ZSgiU3Vic3RyaW5ncyBvZiBzaXplKCkgPCAyIG11c3Qgbm90IGJlIFJvcGVCeXRlU3RyaW5ncyIsCisgICAgICAgICAgZHVvLnN1YnN0cmluZyhpIC0gMSwgaSkgaW5zdGFuY2VvZiBMaXRlcmFsQnl0ZVN0cmluZyk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcXVpbnRldC5zaXplKCk7ICsraSkgeworICAgICAgYXNzZXJ0VHJ1ZSgiU3Vic3RyaW5ncyBvZiBzaXplKCkgPCAyIG11c3Qgbm90IGJlIFJvcGVCeXRlU3RyaW5ncyIsCisgICAgICAgICAgcXVpbnRldC5zdWJzdHJpbmcoaSAtIDEsIGkpIGluc3RhbmNlb2YgTGl0ZXJhbEJ5dGVTdHJpbmcpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTdGFydHNXaXRoKCkgeworICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygxMDAwLCAxMjM0TCk7CisgICAgQnl0ZVN0cmluZyBzdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzKTsKKyAgICBCeXRlU3RyaW5nIHByZWZpeCA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMsIDAsIDUwMCk7CisgICAgQnl0ZVN0cmluZyBzdWZmaXggPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzLCA0MDAsIDYwMCk7CisgICAgYXNzZXJ0VHJ1ZShzdHJpbmcuc3RhcnRzV2l0aChCeXRlU3RyaW5nLkVNUFRZKSk7CisgICAgYXNzZXJ0VHJ1ZShzdHJpbmcuc3RhcnRzV2l0aChzdHJpbmcpKTsKKyAgICBhc3NlcnRUcnVlKHN0cmluZy5zdGFydHNXaXRoKHByZWZpeCkpOworICAgIGFzc2VydEZhbHNlKHN0cmluZy5zdGFydHNXaXRoKHN1ZmZpeCkpOworICAgIGFzc2VydEZhbHNlKHByZWZpeC5zdGFydHNXaXRoKHN1ZmZpeCkpOworICAgIGFzc2VydEZhbHNlKHN1ZmZpeC5zdGFydHNXaXRoKHByZWZpeCkpOworICAgIGFzc2VydEZhbHNlKEJ5dGVTdHJpbmcuRU1QVFkuc3RhcnRzV2l0aChwcmVmaXgpKTsKKyAgICBhc3NlcnRUcnVlKEJ5dGVTdHJpbmcuRU1QVFkuc3RhcnRzV2l0aChCeXRlU3RyaW5nLkVNUFRZKSk7CisgIH0KKworICBzdGF0aWMgTGlzdDxCeXRlU3RyaW5nPiBtYWtlQ29uY3JldGVQaWVjZXMoYnl0ZVtdIHJlZmVyZW5jZUJ5dGVzKSB7CisgICAgTGlzdDxCeXRlU3RyaW5nPiBwaWVjZXMgPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7CisgICAgLy8gU3RhcnRpbmcgbGVuZ3RoIHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggdGhhdCB3ZSdsbCBkbyBzb21lIGNvbmNhdGVuYXRpbmcgYnkKKyAgICAvLyBjb3B5aW5nIGlmIHdlIGp1c3QgY29uY2F0ZW5hdGUgYWxsIHRoZXNlIHBpZWNlcyB0b2dldGhlci4KKyAgICBmb3IgKGludCBzdGFydCA9IDAsIGxlbmd0aCA9IDE2OyBzdGFydCA8IHJlZmVyZW5jZUJ5dGVzLmxlbmd0aDsgc3RhcnQgKz0gbGVuZ3RoKSB7CisgICAgICBsZW5ndGggPSAobGVuZ3RoIDw8IDEpIC0gMTsKKyAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IHJlZmVyZW5jZUJ5dGVzLmxlbmd0aCkgeworICAgICAgICBsZW5ndGggPSByZWZlcmVuY2VCeXRlcy5sZW5ndGggLSBzdGFydDsKKyAgICAgIH0KKyAgICAgIHBpZWNlcy5hZGQoQnl0ZVN0cmluZy5jb3B5RnJvbShyZWZlcmVuY2VCeXRlcywgc3RhcnQsIGxlbmd0aCkpOworICAgIH0KKyAgICByZXR1cm4gcGllY2VzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmN2Y4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDUyOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbX0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGNsYXNzIENvZGVkSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAvKioKKyAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIGJ5dGUgYXJyYXkgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKKyAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycworICAgKiBhYm91dCBwcmVjaXNpb24uCisgICAqLworICBwcml2YXRlIGJ5dGVbXSBieXRlcyhpbnQuLi4gYnl0ZXNBc0ludHMpIHsKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlc0FzSW50cy5sZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNBc0ludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpIGJ5dGVzQXNJbnRzW2ldOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogQW4gSW5wdXRTdHJlYW0gd2hpY2ggbGltaXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgcmVhZHMgYXQgYSB0aW1lLgorICAgKiBXZSB1c2UgdGhpcyB0byBtYWtlIHN1cmUgdGhhdCBDb2RlZElucHV0U3RyZWFtIGRvZXNuJ3Qgc2NyZXcgdXAgd2hlbgorICAgKiByZWFkaW5nIGluIHNtYWxsIGJsb2Nrcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNtYWxsQmxvY2tJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBibG9ja1NpemU7CisKKyAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKGJ5dGVbXSBkYXRhLCBpbnQgYmxvY2tTaXplKSB7CisgICAgICB0aGlzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgYmxvY2tTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgYmxvY2tTaXplKSB7CisgICAgICBzdXBlcihpbik7CisgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIucmVhZChiLCAwLCBNYXRoLm1pbihiLmxlbmd0aCwgYmxvY2tTaXplKSk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLnJlYWQoYiwgb2ZmLCBNYXRoLm1pbihsZW4sIGJsb2NrU2l6ZSkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHJlYWRSYXdWYXJpbnQzMigpIGFuZCByZWFkUmF3VmFyaW50NjQoKSBhbmQKKyAgICogY2hlY2tzIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkVmFyaW50KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICBhc3NlcnRFcXVhbHMoKGludCl2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDMyKCkpOworCisgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDY0KCkpOworICAgIGFzc2VydFRydWUoaW5wdXQuaXNBdEVuZCgpKTsKKworICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCisgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikgeworICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAorICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOworICAgICAgYXNzZXJ0RXF1YWxzKChpbnQpdmFsdWUsIGlucHV0LnJlYWRSYXdWYXJpbnQzMigpKTsKKworICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAorICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOworICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBpbnB1dC5yZWFkUmF3VmFyaW50NjQoKSk7CisgICAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7CisgICAgfQorCisgICAgLy8gVHJ5IHJlYWRpbmcgZGlyZWN0IGZyb20gYW4gSW5wdXRTdHJlYW0uICBXZSB3YW50IHRvIHZlcmlmeSB0aGF0IGl0CisgICAgLy8gZG9lc24ndCByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIHNvIHdlIGNvcHkgdG8gYSBuZXcsIGJpZ2dlcgorICAgIC8vIGFycmF5IGZpcnN0LgorICAgIGJ5dGVbXSBsb25nZXJEYXRhID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggKyAxXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGxvbmdlckRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICBJbnB1dFN0cmVhbSByYXdJbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShsb25nZXJEYXRhKTsKKyAgICBhc3NlcnRFcXVhbHMoKGludCl2YWx1ZSwgQ29kZWRJbnB1dFN0cmVhbS5yZWFkUmF3VmFyaW50MzIocmF3SW5wdXQpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgcmF3SW5wdXQuYXZhaWxhYmxlKCkpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgcmVhZFJhd1ZhcmludDMyKCkgYW5kIHJlYWRSYXdWYXJpbnQ2NCgpIGFuZAorICAgKiBleHBlY3RzIHRoZW0gdG8gZmFpbCB3aXRoIGFuIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB3aG9zZQorICAgKiBkZXNjcmlwdGlvbiBtYXRjaGVzIHRoZSBnaXZlbiBvbmUuCisgICAqLworICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVhZFZhcmludEZhaWx1cmUoCisgICAgICBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZXhwZWN0ZWQsIGJ5dGVbXSBkYXRhKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7CisgICAgdHJ5IHsKKyAgICAgIGlucHV0LnJlYWRSYXdWYXJpbnQzMigpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldE1lc3NhZ2UoKSwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICB0cnkgeworICAgICAgaW5wdXQucmVhZFJhd1ZhcmludDY0KCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGdldCB0aGUgc2FtZSBlcnJvciB3aGVuIHJlYWRpbmcgZGlyZWN0IGZyb20gYW4gSW5wdXRTdHJlYW0uCisgICAgdHJ5IHsKKyAgICAgIENvZGVkSW5wdXRTdHJlYW0ucmVhZFJhd1ZhcmludDMyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqIFRlc3RzIHJlYWRSYXdWYXJpbnQzMigpIGFuZCByZWFkUmF3VmFyaW50NjQoKS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFJlYWRWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDApLCAwKTsKKyAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDEpLCAxKTsKKyAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4N2YpLCAxMjcpOworICAgIC8vIDE0ODgyCisgICAgYXNzZXJ0UmVhZFZhcmludChieXRlcygweGEyLCAweDc0KSwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KSk7CisgICAgLy8gMjk2MTQ4ODgzMAorICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCisgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKKyAgICAgICgweDBiTCA8PCAyOCkpOworCisgICAgLy8gNjQtYml0CisgICAgLy8gNzI1NjQ1NjEyNgorICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYiksCisgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKKyAgICAgICgweDFiTCA8PCAyOCkpOworICAgIC8vIDQxMjU2MjAyNTgwNzE4MzM2CisgICAgYXNzZXJ0UmVhZFZhcmludCgKKyAgICAgIGJ5dGVzKDB4ODAsIDB4ZTYsIDB4ZWIsIDB4OWMsIDB4YzMsIDB4YzksIDB4YTQsIDB4NDkpLAorICAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8CisgICAgICAoMHg0M0wgPDwgMjgpIHwgKDB4NDlMIDw8IDM1KSB8ICgweDI0TCA8PCA0MikgfCAoMHg0OUwgPDwgNDkpKTsKKyAgICAvLyAxMTk2NDM3ODMzMDk3ODczNTEzMQorICAgIGFzc2VydFJlYWRWYXJpbnQoCisgICAgICBieXRlcygweDliLCAweGE4LCAweGY5LCAweGMyLCAweGJiLCAweGQ2LCAweDgwLCAweDg1LCAweGE2LCAweDAxKSwKKyAgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAorICAgICAgKDB4M2JMIDw8IDI4KSB8ICgweDU2TCA8PCAzNSkgfCAoMHgwMEwgPDwgNDIpIHwKKyAgICAgICgweDA1TCA8PCA0OSkgfCAoMHgyNkwgPDwgNTYpIHwgKDB4MDFMIDw8IDYzKSk7CisKKyAgICAvLyBGYWlsdXJlcworICAgIGFzc2VydFJlYWRWYXJpbnRGYWlsdXJlKAorICAgICAgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpLAorICAgICAgYnl0ZXMoMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgICAgICAgICAgIDB4MDApKTsKKyAgICBhc3NlcnRSZWFkVmFyaW50RmFpbHVyZSgKKyAgICAgIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCksCisgICAgICBieXRlcygweDgwKSk7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgY2hlY2tzCisgICAqIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZVtdIGRhdGEsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsKKyAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKKyAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKKyAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOworICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MKKyAgICogdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRMaXR0bGVFbmRpYW42NChieXRlW10gZGF0YSwgbG9uZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW42NCgpKTsKKyAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKKyAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKKyAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOworICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOworICAgIH0KKyAgfQorCisgIC8qKiBUZXN0cyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgcmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkuICovCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkTGl0dGxlRW5kaWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjMyKGJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIpLCAweDEyMzQ1Njc4KTsKKyAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksIDB4OWFiY2RlZjApOworCisgICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjY0KAorICAgICAgYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksCisgICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsKKyAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoCisgICAgICBieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyLCAweGYwLCAweGRlLCAweGJjLCAweDlhKSwKKyAgICAgIDB4OWFiY2RlZjAxMjM0NTY3OEwpOworICB9CisKKyAgLyoqIFRlc3QgZGVjb2RlWmlnWmFnMzIoKSBhbmQgZGVjb2RlWmlnWmFnNjQoKS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdERlY29kZVppZ1phZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyggMCwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigwKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0xLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMikpOworICAgIGFzc2VydEVxdWFscygtMiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigzKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4M0ZGRkZGRkYsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHg3RkZGRkZGRSkpOworICAgIGFzc2VydEVxdWFscygweEMwMDAwMDAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigweEZGRkZGRkZFKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4ODAwMDAwMDAsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHhGRkZGRkZGRikpOworCisgICAgYXNzZXJ0RXF1YWxzKCAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoLTEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMSkpOworICAgIGFzc2VydEVxdWFscyggMSwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0yLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMDNGRkZGRkZGTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwN0ZGRkZGRkVMKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkZDMDAwMDAwMEwsCisgICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZGTCkpOworICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwN0ZGRkZGRkZMLAorICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4MDAwMDAwMDBGRkZGRkZGRUwpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRjgwMDAwMDAwTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwRkZGRkZGRkZMKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4N0ZGRkZGRkZGRkZGRkZGRkwsCisgICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkZGRkZGRkZFTCkpOworICAgIGFzc2VydEVxdWFscygweDgwMDAwMDAwMDAwMDAwMDBMLAorICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4RkZGRkZGRkZGRkZGRkZGRkwpKTsKKyAgfQorCisgIC8qKiBUZXN0cyByZWFkaW5nIGFuZCBwYXJzaW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IGZpZWxkIHR5cGUuICovCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV2hvbGVNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKKworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKKyAgICBhc3NlcnRFcXVhbHMocmF3Qnl0ZXMubGVuZ3RoLCBtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOworCisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShyYXdCeXRlcyk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCisgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDwgMjU2OyBibG9ja1NpemUgKj0gMikgeworICAgICAgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKAorICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKHJhd0J5dGVzLCBibG9ja1NpemUpKTsKKyAgICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisgICAgfQorICB9CisKKyAgLyoqIFRlc3RzIHNraXBGaWVsZCgpLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFdob2xlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7CisgICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOworCisgICAgLy8gQ3JlYXRlIHR3byBwYXJhbGxlbCBpbnB1dHMuICBQYXJzZSBvbmUgYXMgdW5rbm93biBmaWVsZHMgd2hpbGUgdXNpbmcKKyAgICAvLyBza2lwRmllbGQoKSB0byBza2lwIGVhY2ggZmllbGQgb24gdGhlIG90aGVyLiAgRXhwZWN0IHRoZSBzYW1lIHRhZ3MuCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dDEgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd0J5dGVzKTsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0MiA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOworICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCB0YWcgPSBpbnB1dDEucmVhZFRhZygpOworICAgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQyLnJlYWRUYWcoKSk7CisgICAgICBpZiAodGFnID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB1bmtub3duRmllbGRzLm1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQxKTsKKyAgICAgIGlucHV0Mi5za2lwRmllbGQodGFnKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVGVzdCB0aGF0IGEgYnVnIGluIHNraXBSYXdCeXRlcygpIGhhcyBiZWVuIGZpeGVkOiAgaWYgdGhlIHNraXAgc2tpcHMKKyAgICogZXhhY3RseSB1cCB0byBhIGxpbWl0LCB0aGlzIHNob3VsZCBub3QgYnJlYWsgdGhpbmdzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFNraXBSYXdCeXRlc0J1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG5ldyBieXRlW10geyAxLCAyIH07CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOworCisgICAgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KDEpOworICAgIGlucHV0LnNraXBSYXdCeXRlcygxKTsKKyAgICBpbnB1dC5wb3BMaW1pdChsaW1pdCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGlucHV0LnJlYWRSYXdCeXRlKCkpOworICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhhdCBhIGJ1ZyBpbiBza2lwUmF3Qnl0ZXMoKSBoYXMgYmVlbiBmaXhlZDogIGlmIHRoZSBza2lwIHNraXBzCisgICAqIHBhc3QgdGhlIGVuZCBvZiBhIGJ1ZmZlciB3aXRoIGEgbGltaXQgdGhhdCBoYXMgYmVlbiBzZXQgcGFzdCB0aGUgZW5kIG9mCisgICAqIHRoYXQgYnVmZmVyLCB0aGlzIHNob3VsZCBub3QgYnJlYWsgdGhpbmdzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFNraXBSYXdCeXRlc1Bhc3RFbmRPZkJ1ZmZlcldpdGhMaW1pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH07CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCisgICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0ocmF3Qnl0ZXMsIDMpKTsKKworICAgIGludCBsaW1pdCA9IGlucHV0LnB1c2hMaW1pdCg0KTsKKyAgICAvLyBJbiBvcmRlciB0byBleHBvc2UgdGhlIGJ1ZyB3ZSBuZWVkIHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgdG8gcHJpbWUgdGhlCisgICAgLy8gYnVmZmVyIGluc2lkZSB0aGUgQ29kZWRJbnB1dFN0cmVhbS4KKyAgICBhc3NlcnRFcXVhbHMoMSwgaW5wdXQucmVhZFJhd0J5dGUoKSk7CisgICAgLy8gU2tpcCB0byB0aGUgZW5kIG9mIHRoZSBsaW1pdC4KKyAgICBpbnB1dC5za2lwUmF3Qnl0ZXMoMyk7CisgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOworICAgIGlucHV0LnBvcExpbWl0KGxpbWl0KTsKKyAgICBhc3NlcnRFcXVhbHMoNSwgaW5wdXQucmVhZFJhd0J5dGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEh1Z2VCbG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSAxTUIgYmxvYi4KKyAgICBieXRlW10gYmxvYiA9IG5ldyBieXRlWzEgPDwgMjBdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvYi5sZW5ndGg7IGkrKykgeworICAgICAgYmxvYltpXSA9IChieXRlKWk7CisgICAgfQorCisgICAgLy8gTWFrZSBhIG1lc3NhZ2UgY29udGFpbmluZyBpdC4KKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb20oYmxvYikpOworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworCisgICAgLy8gU2VyaWFsaXplIGFuZCBwYXJzZSBpdC4gIE1ha2Ugc3VyZSB0byBwYXJzZSBmcm9tIGFuIElucHV0U3RyZWFtLCBub3QKKyAgICAvLyBkaXJlY3RseSBmcm9tIGEgQnl0ZVN0cmluZywgc28gdGhhdCBDb2RlZElucHV0U3RyZWFtIHVzZXMgYnVmZmVyZWQKKyAgICAvLyByZWFkaW5nLgorICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9CisgICAgICBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkubmV3SW5wdXQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRPcHRpb25hbEJ5dGVzKCksIG1lc3NhZ2UyLmdldE9wdGlvbmFsQnl0ZXMoKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBvdGhlciBmaWVsZHMgd2VyZSBwYXJzZWQgY29ycmVjdGx5LgorICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMyA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKG1lc3NhZ2UyKQorICAgICAgLnNldE9wdGlvbmFsQnl0ZXMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0T3B0aW9uYWxCeXRlcygpKQorICAgICAgLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkTWFsaWNpb3VzbHlMYXJnZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlU3RyaW5nLk91dHB1dCByYXdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOworICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7CisKKyAgICBpbnQgdGFnID0gV2lyZUZvcm1hdC5tYWtlVGFnKDEsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIodGFnKTsKKyAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigweDdGRkZGRkZGKTsKKyAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVszMl0pOyAgLy8gUGFkIHdpdGggYSBmZXcgcmFuZG9tIGJ5dGVzLgorICAgIG91dHB1dC5mbHVzaCgpOworCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7CisgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQucmVhZFRhZygpKTsKKworICAgIHRyeSB7CisgICAgICBpbnB1dC5yZWFkQnl0ZXMoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MuCisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBtYWtlUmVjdXJzaXZlTWVzc2FnZShpbnQgZGVwdGgpIHsKKyAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgcmV0dXJuIFRlc3RSZWN1cnNpdmVNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDUpLmJ1aWxkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBUZXN0UmVjdXJzaXZlTWVzc2FnZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEEobWFrZVJlY3Vyc2l2ZU1lc3NhZ2UoZGVwdGggLSAxKSkuYnVpbGQoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZURlcHRoKFRlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2UsIGludCBkZXB0aCkgeworICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0EoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoNSwgbWVzc2FnZS5nZXRJKCkpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzQSgpKTsKKyAgICAgIGFzc2VydE1lc3NhZ2VEZXB0aChtZXNzYWdlLmdldEEoKSwgZGVwdGggLSAxKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWFsaWNpb3VzUmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBkYXRhNjQgPSBtYWtlUmVjdXJzaXZlTWVzc2FnZSg2NCkudG9CeXRlU3RyaW5nKCk7CisgICAgQnl0ZVN0cmluZyBkYXRhNjUgPSBtYWtlUmVjdXJzaXZlTWVzc2FnZSg2NSkudG9CeXRlU3RyaW5nKCk7CisKKyAgICBhc3NlcnRNZXNzYWdlRGVwdGgoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UucGFyc2VGcm9tKGRhdGE2NCksIDY0KTsKKworICAgIHRyeSB7CisgICAgICBUZXN0UmVjdXJzaXZlTWVzc2FnZS5wYXJzZUZyb20oZGF0YTY1KTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MuCisgICAgfQorCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGE2NC5uZXdDb2RlZElucHV0KCk7CisgICAgaW5wdXQuc2V0UmVjdXJzaW9uTGltaXQoOCk7CisgICAgdHJ5IHsKKyAgICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlLnBhcnNlRnJvbShpbnB1dCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTaXplTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKKyAgICAgIFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpLm5ld0lucHV0KCkpOworICAgIGlucHV0LnNldFNpemVMaW1pdCgxNik7CisKKyAgICB0cnkgeworICAgICAgVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShpbnB1dCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXNldFNpemVDb3VudGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCisgICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0obmV3IGJ5dGVbMjU2XSwgOCkpOworICAgIGlucHV0LnNldFNpemVMaW1pdCgxNik7CisgICAgaW5wdXQucmVhZFJhd0J5dGVzKDE2KTsKKyAgICBhc3NlcnRFcXVhbHMoMTYsIGlucHV0LmdldFRvdGFsQnl0ZXNSZWFkKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGlucHV0LnJlYWRSYXdCeXRlKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzLgorICAgIH0KKworICAgIGlucHV0LnJlc2V0U2l6ZUNvdW50ZXIoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgaW5wdXQuZ2V0VG90YWxCeXRlc1JlYWQoKSk7CisgICAgaW5wdXQucmVhZFJhd0J5dGUoKTsgIC8vIE5vIGV4Y2VwdGlvbiB0aHJvd24uCisgICAgaW5wdXQucmVzZXRTaXplQ291bnRlcigpOworICAgIGFzc2VydEVxdWFscygwLCBpbnB1dC5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKKworICAgIHRyeSB7CisgICAgICBpbnB1dC5yZWFkUmF3Qnl0ZXMoMTYpOyAgLy8gSGl0cyBsaW1pdCBhZ2Fpbi4KKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MuCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRlc3RzIHRoYXQgaWYgd2UgcmVhZCBhbiBzdHJpbmcgdGhhdCBjb250YWlucyBpbnZhbGlkIFVURi04LCBubyBleGNlcHRpb24KKyAgICogaXMgdGhyb3duLiAgSW5zdGVhZCwgdGhlIGludmFsaWQgYnl0ZXMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIFVuaWNvZGUKKyAgICogInJlcGxhY2VtZW50IGNoYXJhY3RlciIgVStGRkZELgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFJlYWRJbnZhbGlkVXRmOCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVTdHJpbmcuT3V0cHV0IHJhd091dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KCk7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKKworICAgIGludCB0YWcgPSBXaXJlRm9ybWF0Lm1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOworICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDEpOworICAgIG91dHB1dC53cml0ZVJhd0J5dGVzKG5ldyBieXRlW10geyAoYnl0ZSkweDgwIH0pOworICAgIG91dHB1dC5mbHVzaCgpOworCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7CisgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQucmVhZFRhZygpKTsKKyAgICBTdHJpbmcgdGV4dCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKKyAgICBhc3NlcnRFcXVhbHMoMHhmZmZkLCB0ZXh0LmNoYXJBdCgwKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21TbGljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IGJ5dGVzKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpOworICAgIENvZGVkSW5wdXRTdHJlYW0gaW4gPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVzLCAzLCA1KTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7CisgICAgZm9yIChpbnQgaSA9IDM7IGkgPCA4OyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBpbi5yZWFkUmF3Qnl0ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpLTIsIGluLmdldFRvdGFsQnl0ZXNSZWFkKCkpOworICAgIH0KKyAgICAvLyBlb2YKKyAgICBhc3NlcnRFcXVhbHMoMCwgaW4ucmVhZFRhZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoNSwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRhZygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEFueSB0YWcgbnVtYmVyIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGZpZWxkIG51bWJlciB6ZXJvIGlzIGludmFsaWQgYW5kCisgICAgLy8gc2hvdWxkIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgdHJ5IHsKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShieXRlcyhpKSkucmVhZFRhZygpOworICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkVGFnKCkuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyNTUwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwzMTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uU3BhcnNlRW51bU1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0U3BhcnNlRW51bTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgQ29kZWRPdXRwdXRTdHJlYW19LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBDb2RlZE91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIC8qKgorICAgKiBIZWxwZXIgdG8gY29uc3RydWN0IGEgYnl0ZSBhcnJheSBmcm9tIGEgYnVuY2ggb2YgYnl0ZXMuICBUaGUgaW5wdXRzIGFyZQorICAgKiBhY3R1YWxseSBpbnRzIHNvIHRoYXQgSSBjYW4gdXNlIGhleCBub3RhdGlvbiBhbmQgbm90IGdldCBzdHVwaWQgZXJyb3JzCisgICAqIGFib3V0IHByZWNpc2lvbi4KKyAgICovCisgIHByaXZhdGUgYnl0ZVtdIGJ5dGVzKGludC4uLiBieXRlc0FzSW50cykgeworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVzQXNJbnRzLmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc0FzSW50cy5sZW5ndGg7IGkrKykgeworICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNBc0ludHNbaV07CisgICAgfQorICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIC8qKiBBcnJheXMuYXNMaXN0KCkgZG9lcyBub3Qgd29yayB3aXRoIGFycmF5cyBvZiBwcmltaXRpdmVzLiAgOiggKi8KKyAgcHJpdmF0ZSBMaXN0PEJ5dGU+IHRvTGlzdChieXRlW10gYnl0ZXMpIHsKKyAgICBMaXN0PEJ5dGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZT4oKTsKKyAgICBmb3IgKGJ5dGUgYiA6IGJ5dGVzKSB7CisgICAgICByZXN1bHQuYWRkKGIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsQnl0ZXMoYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7CisgICAgYXNzZXJ0RXF1YWxzKHRvTGlzdChhKSwgdG9MaXN0KGIpKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIHdyaXRlUmF3VmFyaW50MzIoKSBhbmQgd3JpdGVSYXdWYXJpbnQ2NCgpIGFuZAorICAgKiBjaGVja3MgdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIGJ5dGVzLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBPbmx5IGRvIDMyLWJpdCB3cml0ZSBpZiB0aGUgdmFsdWUgZml0cyBpbiAzMiBiaXRzLgorICAgIGlmICgodmFsdWUgPj4+IDMyKSA9PSAwKSB7CisgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKKyAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKChpbnQpIHZhbHVlKTsKKyAgICAgIG91dHB1dC5mbHVzaCgpOworICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgIC8vIEFsc28gdHJ5IGNvbXB1dGluZyBzaXplLgorICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVSYXdWYXJpbnQzMlNpemUoKGludCkgdmFsdWUpKTsKKyAgICB9CisKKyAgICB7CisgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKKyAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKKyAgICAgIG91dHB1dC5mbHVzaCgpOworICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgIC8vIEFsc28gdHJ5IGNvbXB1dGluZyBzaXplLgorICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpKTsKKyAgICB9CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIC8vIE9ubHkgZG8gMzItYml0IHdyaXRlIGlmIHRoZSB2YWx1ZSBmaXRzIGluIDMyIGJpdHMuCisgICAgICBpZiAoKHZhbHVlID4+PiAzMikgPT0gMCkgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPQorICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCwgYmxvY2tTaXplKTsKKyAgICAgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoKGludCkgdmFsdWUpOworICAgICAgICBvdXRwdXQuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJhd091dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0KKyAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7CisgICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKKyAgICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKiBUZXN0cyB3cml0ZVJhd1ZhcmludDMyKCkgYW5kIHdyaXRlUmF3VmFyaW50NjQoKS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFdyaXRlVmFyaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHgwMCksIDApOworICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4MDEpLCAxKTsKKyAgICBhc3NlcnRXcml0ZVZhcmludChieXRlcygweDdmKSwgMTI3KTsKKyAgICAvLyAxNDg4MgorICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4YTIsIDB4NzQpLCAoMHgyMiA8PCAwKSB8ICgweDc0IDw8IDcpKTsKKyAgICAvLyAyOTYxNDg4ODMwCisgICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCisgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKKyAgICAgICgweDBiTCA8PCAyOCkpOworCisgICAgLy8gNjQtYml0CisgICAgLy8gNzI1NjQ1NjEyNgorICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MWIpLAorICAgICAgKDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8ICgweDA0IDw8IDIxKSB8CisgICAgICAoMHgxYkwgPDwgMjgpKTsKKyAgICAvLyA0MTI1NjIwMjU4MDcxODMzNgorICAgIGFzc2VydFdyaXRlVmFyaW50KAorICAgICAgYnl0ZXMoMHg4MCwgMHhlNiwgMHhlYiwgMHg5YywgMHhjMywgMHhjOSwgMHhhNCwgMHg0OSksCisgICAgICAoMHgwMCA8PCAwKSB8ICgweDY2IDw8IDcpIHwgKDB4NmIgPDwgMTQpIHwgKDB4MWMgPDwgMjEpIHwKKyAgICAgICgweDQzTCA8PCAyOCkgfCAoMHg0OUwgPDwgMzUpIHwgKDB4MjRMIDw8IDQyKSB8ICgweDQ5TCA8PCA0OSkpOworICAgIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxCisgICAgYXNzZXJ0V3JpdGVWYXJpbnQoCisgICAgICBieXRlcygweDliLCAweGE4LCAweGY5LCAweGMyLCAweGJiLCAweGQ2LCAweDgwLCAweDg1LCAweGE2LCAweDAxKSwKKyAgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAorICAgICAgKDB4M2JMIDw8IDI4KSB8ICgweDU2TCA8PCAzNSkgfCAoMHgwMEwgPDwgNDIpIHwKKyAgICAgICgweDA1TCA8PCA0OSkgfCAoMHgyNkwgPDwgNTYpIHwgKDB4MDFMIDw8IDYzKSk7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIGNoZWNrcworICAgKiB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuCisgICAqLworICBwcml2YXRlIHZvaWQgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlW10gZGF0YSwgaW50IHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7CisgICAgb3V0cHV0LndyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOworICAgIG91dHB1dC5mbHVzaCgpOworICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOworCisgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KKyAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKSB7CisgICAgICByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7CisgICAgICBvdXRwdXQud3JpdGVSYXdMaXR0bGVFbmRpYW4zMih2YWx1ZSk7CisgICAgICBvdXRwdXQuZmx1c2goKTsKKyAgICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKSBhbmQgY2hlY2tzCisgICAqIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7CisgICAgb3V0cHV0LndyaXRlUmF3TGl0dGxlRW5kaWFuNjQodmFsdWUpOworICAgIG91dHB1dC5mbHVzaCgpOworICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOworCisgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KKyAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKSB7CisgICAgICByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7CisgICAgICBvdXRwdXQud3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7CisgICAgICBvdXRwdXQuZmx1c2goKTsKKyAgICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKyAgfQorCisgIC8qKiBUZXN0cyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFdyaXRlTGl0dGxlRW5kaWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyKSwgMHgxMjM0NTY3OCk7CisgICAgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlcygweGYwLCAweGRlLCAweGJjLCAweDlhKSwgMHg5YWJjZGVmMCk7CisKKyAgICBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KAorICAgICAgYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksCisgICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsKKyAgICBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KAorICAgICAgYnl0ZXMoMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksCisgICAgICAweDlhYmNkZWYwMTIzNDU2NzhMKTsKKyAgfQorCisgIC8qKiBUZXN0IGVuY29kZVppZ1phZzMyKCkgYW5kIGVuY29kZVppZ1phZzY0KCkuICovCisgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVaaWdaYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoMCwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoIDApKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoLTEpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoIDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoLTIpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoMHgzRkZGRkZGRikpOworICAgIGFzc2VydEVxdWFscygweDdGRkZGRkZGLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigweEMwMDAwMDAwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkUsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRiwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoMHg4MDAwMDAwMCkpOworCisgICAgYXNzZXJ0RXF1YWxzKDAsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KC0xKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KC0yKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAwMDA3RkZGRkZGRUwsCisgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4MDAwMDAwMDAzRkZGRkZGRkwpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMDdGRkZGRkZGTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkMwMDAwMDAwTCkpOworICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwRkZGRkZGRkVMLAorICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweDAwMDAwMDAwN0ZGRkZGRkZMKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAwMDBGRkZGRkZGRkwsCisgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4RkZGRkZGRkY4MDAwMDAwMEwpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRkZGRkZGRkZFTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHg3RkZGRkZGRkZGRkZGRkZGTCkpOworICAgIGFzc2VydEVxdWFscygweEZGRkZGRkZGRkZGRkZGRkZMLAorICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweDgwMDAwMDAwMDAwMDAwMDBMKSk7CisKKyAgICAvLyBTb21lIGVhc2llci10by12ZXJpZnkgcm91bmQtdHJpcCB0ZXN0cy4gIFRoZSBpbnB1dHMgKG90aGVyIHRoYW4gMCwgMSwgLTEpCisgICAgLy8gd2VyZSBjaG9zZW4gc2VtaS1yYW5kb21seSB2aWEga2V5Ym9hcmQgYmFzaGluZy4KKyAgICBhc3NlcnRFcXVhbHMoMCwKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMCkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTEsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMihDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKC0xKSkpOworICAgIGFzc2VydEVxdWFscygxNDkyNywKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMTQ5MjcpKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0zNjEyLAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigtMzYxMikpKTsKKworICAgIGFzc2VydEVxdWFscygwLAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgwKSkpOworICAgIGFzc2VydEVxdWFscygxLAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgxKSkpOworICAgIGFzc2VydEVxdWFscygtMSwKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoLTEpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDE0OTI3LAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgxNDkyNykpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTM2MTIsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KC0zNjEyKSkpOworCisgICAgYXNzZXJ0RXF1YWxzKDg1NjkxMjMwNDgwMTQxNkwsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgKKyAgICAgICAgICA4NTY5MTIzMDQ4MDE0MTZMKSkpOworICAgIGFzc2VydEVxdWFscygtNzUxMjM5MDU0Mzk1NzEyNTZMLAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoCisgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoCisgICAgICAgICAgLTc1MTIzOTA1NDM5NTcxMjU2TCkpKTsKKyAgfQorCisgIC8qKiBUZXN0cyB3cml0aW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IGZpZWxkIHR5cGUuICovCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVdob2xlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7CisKKyAgICBieXRlW10gcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZUFycmF5KCk7CisgICAgYXNzZXJ0RXF1YWxCeXRlcyhUZXN0VXRpbC5nZXRHb2xkZW5NZXNzYWdlKCkudG9CeXRlQXJyYXkoKSwgcmF3Qnl0ZXMpOworCisgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KKyAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPCAyNTY7IGJsb2NrU2l6ZSAqPSAyKSB7CisgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0KKyAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0LCBibG9ja1NpemUpOworICAgICAgbWVzc2FnZS53cml0ZVRvKG91dHB1dCk7CisgICAgICBvdXRwdXQuZmx1c2goKTsKKyAgICAgIGFzc2VydEVxdWFsQnl0ZXMocmF3Qnl0ZXMsIHJhd091dHB1dC50b0J5dGVBcnJheSgpKTsKKyAgICB9CisgIH0KKworICAvKiogVGVzdHMgd3JpdGluZyBhIHdob2xlIG1lc3NhZ2Ugd2l0aCBldmVyeSBwYWNrZWQgZmllbGQgdHlwZS4gRW5zdXJlcyB0aGUKKyAgICogd2lyZSBmb3JtYXQgb2YgcGFja2VkIGZpZWxkcyBpcyBjb21wYXRpYmxlIHdpdGggQysrLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaG9sZVBhY2tlZEZpZWxkc01lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldFBhY2tlZFNldCgpOworCisgICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOworICAgIGFzc2VydEVxdWFsQnl0ZXMoVGVzdFV0aWwuZ2V0R29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSgpLnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgICAgICByYXdCeXRlcyk7CisgIH0KKworICAvKiogVGVzdCB3cml0aW5nIGEgbWVzc2FnZSBjb250YWluaW5nIGEgbmVnYXRpdmUgZW51bSB2YWx1ZS4gVGhpcyB1c2VkIHRvCisgICAqIGZhaWwgYmVjYXVzZSB0aGUgc2l6ZSB3YXMgbm90IHByb3Blcmx5IGNvbXB1dGVkIGFzIGEgc2lnbi1leHRlbmRlZCB2YXJpbnQuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVNZXNzYWdlV2l0aE5lZ2F0aXZlRW51bVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3BhcnNlRW51bU1lc3NhZ2UgbWVzc2FnZSA9IFNwYXJzZUVudW1NZXNzYWdlLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0U3BhcnNlRW51bShUZXN0U3BhcnNlRW51bS5TUEFSU0VfRSkgLmJ1aWxkKCk7CisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldFNwYXJzZUVudW0oKS5nZXROdW1iZXIoKSA8IDApOworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKKyAgICBTcGFyc2VFbnVtTWVzc2FnZSBtZXNzYWdlMiA9IFNwYXJzZUVudW1NZXNzYWdlLnBhcnNlRnJvbShyYXdCeXRlcyk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RTcGFyc2VFbnVtLlNQQVJTRV9FLCBtZXNzYWdlMi5nZXRTcGFyc2VFbnVtKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0RlcHJlY2F0ZWRGaWVsZFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVwcmVjYXRlZEZpZWxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGJiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0RlcHJlY2F0ZWRGaWVsZFRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3REZXByZWNhdGVkRmllbGRzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisvKioKKyAqIFRlc3QgZmllbGQgZGVwcmVjYXRpb24KKyAqIAorICogQGF1dGhvciBiaXJkb0Bnb29nbGUuY29tIChSb2JlcnRvIFNjYXJhbXV6emkpCisgKi8KK3B1YmxpYyBjbGFzcyBEZXByZWNhdGVkRmllbGRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIFN0cmluZ1tdIGRlcHJlY2F0ZWRHZXR0ZXJOYW1lcyA9IHsKKyAgICAgICJoYXNEZXByZWNhdGVkSW50MzIiLAorICAgICAgImdldERlcHJlY2F0ZWRJbnQzMiJ9OworICAKKyAgcHJpdmF0ZSBTdHJpbmdbXSBkZXByZWNhdGVkQnVpbGRlckdldHRlck5hbWVzID0geworICAgICAgImhhc0RlcHJlY2F0ZWRJbnQzMiIsCisgICAgICAiZ2V0RGVwcmVjYXRlZEludDMyIiwKKyAgICAgICJjbGVhckRlcHJlY2F0ZWRJbnQzMiJ9OworICAKKyAgcHJpdmF0ZSBTdHJpbmdbXSBkZXByZWNhdGVkQnVpbGRlclNldHRlck5hbWVzID0geworICAgICAgInNldERlcHJlY2F0ZWRJbnQzMiJ9OyAKKyAgCisgIHB1YmxpYyB2b2lkIHRlc3REZXByZWNhdGVkRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDbGFzczw/PiBkZXByZWNhdGVkRmllbGRzID0gVGVzdERlcHJlY2F0ZWRGaWVsZHMuY2xhc3M7CisgICAgQ2xhc3M8Pz4gZGVwcmVjYXRlZEZpZWxkc0J1aWxkZXIgPSBUZXN0RGVwcmVjYXRlZEZpZWxkcy5CdWlsZGVyLmNsYXNzOworICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkZXByZWNhdGVkR2V0dGVyTmFtZXMpIHsKKyAgICAgIE1ldGhvZCBtZXRob2QgPSBkZXByZWNhdGVkRmllbGRzLmdldE1ldGhvZChuYW1lKTsKKyAgICAgIGFzc2VydFRydWUoIk1ldGhvZCAiICsgbmFtZSArICIgc2hvdWxkIGJlIGRlcHJlY2F0ZWQiLAorICAgICAgICAgIGlzRGVwcmVjYXRlZChtZXRob2QpKTsKKyAgICB9CisgICAgZm9yIChTdHJpbmcgbmFtZSA6IGRlcHJlY2F0ZWRCdWlsZGVyR2V0dGVyTmFtZXMpIHsKKyAgICAgIE1ldGhvZCBtZXRob2QgPSBkZXByZWNhdGVkRmllbGRzQnVpbGRlci5nZXRNZXRob2QobmFtZSk7CisgICAgICBhc3NlcnRUcnVlKCJNZXRob2QgIiArIG5hbWUgKyAiIHNob3VsZCBiZSBkZXByZWNhdGVkIiwKKyAgICAgICAgICBpc0RlcHJlY2F0ZWQobWV0aG9kKSk7CisgICAgfQorICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkZXByZWNhdGVkQnVpbGRlclNldHRlck5hbWVzKSB7CisgICAgICBNZXRob2QgbWV0aG9kID0gZGVwcmVjYXRlZEZpZWxkc0J1aWxkZXIuZ2V0TWV0aG9kKG5hbWUsIGludC5jbGFzcyk7CisgICAgICBhc3NlcnRUcnVlKCJNZXRob2QgIiArIG5hbWUgKyAiIHNob3VsZCBiZSBkZXByZWNhdGVkIiwKKyAgICAgICAgICBpc0RlcHJlY2F0ZWQobWV0aG9kKSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIGJvb2xlYW4gaXNEZXByZWNhdGVkKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkKSB7CisgICAgcmV0dXJuIGFubm90YXRlZC5pc0Fubm90YXRpb25QcmVzZW50KERlcHJlY2F0ZWQuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3JzVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9yc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzMxMDkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9yc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY0OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90bzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90bzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90bzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuU2VydmljZURlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0OworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5Vbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5Vbml0dGVzdEltcG9ydC5JbXBvcnRNZXNzYWdlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduRW51bTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25NZXNzYWdlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQ7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0U2VydmljZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdEN1c3RvbU9wdGlvbnM7CisKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIERlc2NyaXB0b3JzfS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgRGVzY3JpcHRvcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIHdoZXJlIHJlZmVyZW5jaW5nIGEgRmllbGREZXNjcmlwdG9yLlR5cGUgdmFsdWUKKyAgLy8gYmVmb3JlIGEgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB2YWx1ZSB3b3VsZCB5aWVsZCBhCisgIC8vIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvci4KKyAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFUSUNfSU5JVF9URVNUID0gRmllbGREZXNjcmlwdG9yLlR5cGUuQk9PTDsKKworICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRUeXBlRW51bU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUudmFsdWVzKCkubGVuZ3RoLAorICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLnZhbHVlcygpLmxlbmd0aCk7CisgICAgZm9yIChGaWVsZERlc2NyaXB0b3IuVHlwZSB0eXBlIDogRmllbGREZXNjcmlwdG9yLlR5cGUudmFsdWVzKCkpIHsKKyAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgcHJvdG9UeXBlID0gdHlwZS50b1Byb3RvKCk7CisgICAgICBhc3NlcnRFcXVhbHMoIlRZUEVfIiArIHR5cGUubmFtZSgpLCBwcm90b1R5cGUubmFtZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyh0eXBlLCBGaWVsZERlc2NyaXB0b3IuVHlwZS52YWx1ZU9mKHByb3RvVHlwZSkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RGaWxlRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpbGVEZXNjcmlwdG9yIGZpbGUgPSBVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKTsKKworICAgIGFzc2VydEVxdWFscygiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIiwgZmlsZS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicHJvdG9idWZfdW5pdHRlc3QiLCBmaWxlLmdldFBhY2thZ2UoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIlVuaXR0ZXN0UHJvdG8iLCBmaWxlLmdldE9wdGlvbnMoKS5nZXRKYXZhT3V0ZXJDbGFzc25hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iLAorICAgICAgICAgICAgICAgICBmaWxlLnRvUHJvdG8oKS5nZXROYW1lKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpKSwKKyAgICAgICAgICAgICAgICAgZmlsZS5nZXREZXBlbmRlbmNpZXMoKSk7CisKKyAgICBEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVR5cGUsIGZpbGUuZ2V0TWVzc2FnZVR5cGVzKCkuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVR5cGUsIGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJUZXN0QWxsVHlwZXMiKSk7CisgICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKKyAgICBhc3NlcnROdWxsKGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldE1lc3NhZ2VUeXBlcygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRNZXNzYWdlVHlwZXMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7CisgICAgfQorCisgICAgRW51bURlc2NyaXB0b3IgZW51bVR5cGUgPSBGb3JlaWduRW51bS5nZXREZXNjcmlwdG9yKCk7CisgICAgYXNzZXJ0RXF1YWxzKGVudW1UeXBlLCBmaWxlLmdldEVudW1UeXBlcygpLmdldCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGVudW1UeXBlLCBmaWxlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9yZWlnbkVudW0iKSk7CisgICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKKyAgICBhc3NlcnROdWxsKGZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChJbXBvcnRFbnVtLmdldERlc2NyaXB0b3IoKSksCisgICAgICAgICAgICAgICAgIFVuaXR0ZXN0SW1wb3J0LmdldERlc2NyaXB0b3IoKS5nZXRFbnVtVHlwZXMoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldEVudW1UeXBlcygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRFbnVtVHlwZXMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7CisgICAgfQorCisgICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKTsKKyAgICBhc3NlcnRFcXVhbHMoc2VydmljZSwgZmlsZS5nZXRTZXJ2aWNlcygpLmdldCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2UsIGZpbGUuZmluZFNlcnZpY2VCeU5hbWUoIlRlc3RTZXJ2aWNlIikpOworICAgIGFzc2VydE51bGwoZmlsZS5maW5kU2VydmljZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKKyAgICBhc3NlcnROdWxsKGZpbGUuZmluZFNlcnZpY2VCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlIikpOworICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwKKyAgICAgICAgICAgICAgICAgVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpLmdldFNlcnZpY2VzKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5nZXRTZXJ2aWNlcygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRTZXJ2aWNlcygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisKKyAgICBGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uID0KKyAgICAgIFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgYXNzZXJ0RXF1YWxzKGV4dGVuc2lvbiwgZmlsZS5nZXRFeHRlbnNpb25zKCkuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICBmaWxlLmZpbmRFeHRlbnNpb25CeU5hbWUoIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIpKTsKKyAgICBhc3NlcnROdWxsKGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHQiKSk7CisgICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIikpOworICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwKKyAgICAgICAgICAgICAgICAgVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpLmdldEV4dGVuc2lvbnMoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldEV4dGVuc2lvbnMoKS5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKGksIGZpbGUuZ2V0RXh0ZW5zaW9ucygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIERlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOworICAgIERlc2NyaXB0b3IgbmVzdGVkVHlwZSA9IFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLmdldERlc2NyaXB0b3IoKTsKKworICAgIGFzc2VydEVxdWFscygiVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIsIG1lc3NhZ2VUeXBlLmdldEZ1bGxOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwgbWVzc2FnZVR5cGUuZ2V0RmlsZSgpKTsKKyAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmdldENvbnRhaW5pbmdUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhEZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZS5nZXRPcHRpb25zKCkpOworICAgIGFzc2VydEVxdWFscygiVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUudG9Qcm90bygpLmdldE5hbWUoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIk5lc3RlZE1lc3NhZ2UiLCBuZXN0ZWRUeXBlLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSIsCisgICAgICAgICAgICAgICAgIG5lc3RlZFR5cGUuZ2V0RnVsbE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBuZXN0ZWRUeXBlLmdldEZpbGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VUeXBlLCBuZXN0ZWRUeXBlLmdldENvbnRhaW5pbmdUeXBlKCkpOworCisgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gbWVzc2FnZVR5cGUuZ2V0RmllbGRzKCkuZ2V0KDApOworICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzIiLCBmaWVsZC5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhmaWVsZCwgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpKTsKKyAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgibm9fc3VjaF9maWVsZCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmllbGQsIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKKyAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TnVtYmVyKDU3MTI4MykpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGUuZ2V0RmllbGRzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBtZXNzYWdlVHlwZS5nZXRGaWVsZHMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7CisgICAgfQorCisgICAgYXNzZXJ0RXF1YWxzKG5lc3RlZFR5cGUsIG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVzKCkuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMobmVzdGVkVHlwZSwgbWVzc2FnZVR5cGUuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk5lc3RlZE1lc3NhZ2UiKSk7CisgICAgYXNzZXJ0TnVsbChtZXNzYWdlVHlwZS5maW5kTmVzdGVkVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBtZXNzYWdlVHlwZS5nZXROZXN0ZWRUeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisKKyAgICBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLmdldERlc2NyaXB0b3IoKTsKKyAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIG1lc3NhZ2VUeXBlLmdldEVudW1UeXBlcygpLmdldCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGVudW1UeXBlLCBtZXNzYWdlVHlwZS5maW5kRW51bVR5cGVCeU5hbWUoIk5lc3RlZEVudW0iKSk7CisgICAgYXNzZXJ0TnVsbChtZXNzYWdlVHlwZS5maW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZS5nZXRFbnVtVHlwZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKGksIG1lc3NhZ2VUeXBlLmdldEVudW1UeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmllbGREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGVzY3JpcHRvciBtZXNzYWdlVHlwZSA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7CisgICAgRmllbGREZXNjcmlwdG9yIHByaW1pdGl2ZUZpZWxkID0KKyAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKKyAgICBGaWVsZERlc2NyaXB0b3IgZW51bUZpZWxkID0KKyAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKKyAgICBGaWVsZERlc2NyaXB0b3IgbWVzc2FnZUZpZWxkID0KKyAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIik7CisgICAgRmllbGREZXNjcmlwdG9yIGNvcmRGaWVsZCA9CisgICAgICBtZXNzYWdlVHlwZS5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2NvcmQiKTsKKyAgICBGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uID0KKyAgICAgIFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgRmllbGREZXNjcmlwdG9yIG5lc3RlZEV4dGVuc2lvbiA9IFRlc3RSZXF1aXJlZC5zaW5nbGUuZ2V0RGVzY3JpcHRvcigpOworCisgICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMiIsIHByaW1pdGl2ZUZpZWxkLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMub3B0aW9uYWxfaW50MzIiLAorICAgICAgICAgICAgICAgICBwcmltaXRpdmVGaWVsZC5nZXRGdWxsTmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgcHJpbWl0aXZlRmllbGQuZ2V0TnVtYmVyKCkpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlVHlwZSwgcHJpbWl0aXZlRmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBwcmltaXRpdmVGaWVsZC5nZXRGaWxlKCkpOworICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS5JTlQzMiwgcHJpbWl0aXZlRmllbGQuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLklOVCwgcHJpbWl0aXZlRmllbGQuZ2V0SmF2YVR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICBwcmltaXRpdmVGaWVsZC5nZXRPcHRpb25zKCkpOworICAgIGFzc2VydEZhbHNlKHByaW1pdGl2ZUZpZWxkLmlzRXh0ZW5zaW9uKCkpOworICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzIiLCBwcmltaXRpdmVGaWVsZC50b1Byb3RvKCkuZ2V0TmFtZSgpKTsKKworICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfbmVzdGVkX2VudW0iLCBlbnVtRmllbGQuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuRU5VTSwgZW51bUZpZWxkLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5FTlVNLCBlbnVtRmllbGQuZ2V0SmF2YVR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLmdldERlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgZW51bUZpZWxkLmdldEVudW1UeXBlKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiLCBtZXNzYWdlRmllbGQuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSwgbWVzc2FnZUZpZWxkLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFLCBtZXNzYWdlRmllbGQuZ2V0SmF2YVR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEZvcmVpZ25NZXNzYWdlLmdldERlc2NyaXB0b3IoKSwgbWVzc2FnZUZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9jb3JkIiwgY29yZEZpZWxkLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5UeXBlLlNUUklORywgY29yZEZpZWxkLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5TVFJJTkcsIGNvcmRGaWVsZC5nZXRKYXZhVHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuQ1R5cGUuQ09SRCwKKyAgICAgICAgICAgICAgICAgY29yZEZpZWxkLmdldE9wdGlvbnMoKS5nZXRDdHlwZSgpKTsKKworICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIiwgZXh0ZW5zaW9uLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24iLAorICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0RnVsbE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGV4dGVuc2lvbi5nZXROdW1iZXIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldENvbnRhaW5pbmdUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwgZXh0ZW5zaW9uLmdldEZpbGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5UeXBlLklOVDMyLCBleHRlbnNpb24uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLklOVCwgZXh0ZW5zaW9uLmdldEphdmFUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhEZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldE9wdGlvbnMoKSk7CisgICAgYXNzZXJ0VHJ1ZShleHRlbnNpb24uaXNFeHRlbnNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25TY29wZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIsIGV4dGVuc2lvbi50b1Byb3RvKCkuZ2V0TmFtZSgpKTsKKworICAgIGFzc2VydEVxdWFscygic2luZ2xlIiwgbmVzdGVkRXh0ZW5zaW9uLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQuc2luZ2xlIiwKKyAgICAgICAgICAgICAgICAgbmVzdGVkRXh0ZW5zaW9uLmdldEZ1bGxOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBuZXN0ZWRFeHRlbnNpb24uZ2V0RXh0ZW5zaW9uU2NvcGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmllbGREZXNjcmlwdG9yTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGaWVsZERlc2NyaXB0b3IgcmVxdWlyZWRGaWVsZCA9CisgICAgICBUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgiYSIpOworICAgIEZpZWxkRGVzY3JpcHRvciBvcHRpb25hbEZpZWxkID0KKyAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpOworICAgIEZpZWxkRGVzY3JpcHRvciByZXBlYXRlZEZpZWxkID0KKyAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOworCisgICAgYXNzZXJ0VHJ1ZShyZXF1aXJlZEZpZWxkLmlzUmVxdWlyZWQoKSk7CisgICAgYXNzZXJ0RmFsc2UocmVxdWlyZWRGaWVsZC5pc1JlcGVhdGVkKCkpOworICAgIGFzc2VydEZhbHNlKG9wdGlvbmFsRmllbGQuaXNSZXF1aXJlZCgpKTsKKyAgICBhc3NlcnRGYWxzZShvcHRpb25hbEZpZWxkLmlzUmVwZWF0ZWQoKSk7CisgICAgYXNzZXJ0RmFsc2UocmVwZWF0ZWRGaWVsZC5pc1JlcXVpcmVkKCkpOworICAgIGFzc2VydFRydWUocmVwZWF0ZWRGaWVsZC5pc1JlcGVhdGVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZpZWxkRGVzY3JpcHRvckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEZXNjcmlwdG9yIGQgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOworICAgIGFzc2VydEZhbHNlKGQuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpLmhhc0RlZmF1bHRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgZC5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIikuZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgIGFzc2VydFRydWUoZC5maW5kRmllbGRCeU5hbWUoImRlZmF1bHRfaW50MzIiKS5oYXNEZWZhdWx0VmFsdWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDQxLCBkLmZpbmRGaWVsZEJ5TmFtZSgiZGVmYXVsdF9pbnQzMiIpLmdldERlZmF1bHRWYWx1ZSgpKTsKKworICAgIGQgPSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuZ2V0RGVzY3JpcHRvcigpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgIEJ5dGVTdHJpbmcuY29weUZyb20oCisgICAgICAgICJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCJcdTAwZmUiLmdldEJ5dGVzKCJJU08tODg1OS0xIikpLAorICAgICAgZC5maW5kRmllbGRCeU5hbWUoImVzY2FwZWRfYnl0ZXMiKS5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0xLCBkLmZpbmRGaWVsZEJ5TmFtZSgibGFyZ2VfdWludDMyIikuZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgIGFzc2VydEVxdWFscygtMUwsIGQuZmluZEZpZWxkQnlOYW1lKCJsYXJnZV91aW50NjQiKS5nZXREZWZhdWx0VmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW51bURlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IEZvcmVpZ25FbnVtLmdldERlc2NyaXB0b3IoKTsKKyAgICBFbnVtRGVzY3JpcHRvciBuZXN0ZWRUeXBlID0gVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uZ2V0RGVzY3JpcHRvcigpOworCisgICAgYXNzZXJ0RXF1YWxzKCJGb3JlaWduRW51bSIsIGVudW1UeXBlLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bSIsIGVudW1UeXBlLmdldEZ1bGxOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwgZW51bVR5cGUuZ2V0RmlsZSgpKTsKKyAgICBhc3NlcnROdWxsKGVudW1UeXBlLmdldENvbnRhaW5pbmdUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhEZXNjcmlwdG9yUHJvdG9zLkVudW1PcHRpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICBlbnVtVHlwZS5nZXRPcHRpb25zKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCJOZXN0ZWRFbnVtIiwgbmVzdGVkVHlwZS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0iLAorICAgICAgICAgICAgICAgICBuZXN0ZWRUeXBlLmdldEZ1bGxOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwgbmVzdGVkVHlwZS5nZXRGaWxlKCkpOworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLCBuZXN0ZWRUeXBlLmdldENvbnRhaW5pbmdUeXBlKCkpOworCisgICAgRW51bVZhbHVlRGVzY3JpcHRvciB2YWx1ZSA9IEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLmdldFZhbHVlRGVzY3JpcHRvcigpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZW51bVR5cGUuZ2V0VmFsdWVzKCkuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoIkZPUkVJR05fRk9PIiwgdmFsdWUuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgdmFsdWUuZ2V0TnVtYmVyKCkpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZW51bVR5cGUuZmluZFZhbHVlQnlOYW1lKCJGT1JFSUdOX0ZPTyIpKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIGVudW1UeXBlLmZpbmRWYWx1ZUJ5TnVtYmVyKDQpKTsKKyAgICBhc3NlcnROdWxsKGVudW1UeXBlLmZpbmRWYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1UeXBlLmdldFZhbHVlcygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoaSwgZW51bVR5cGUuZ2V0VmFsdWVzKCkuZ2V0KGkpLmdldEluZGV4KCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2UgPSBUZXN0U2VydmljZS5nZXREZXNjcmlwdG9yKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIlRlc3RTZXJ2aWNlIiwgc2VydmljZS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UiLCBzZXJ2aWNlLmdldEZ1bGxOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwgc2VydmljZS5nZXRGaWxlKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKDIsIHNlcnZpY2UuZ2V0TWV0aG9kcygpLnNpemUoKSk7CisKKyAgICBNZXRob2REZXNjcmlwdG9yIGZvb01ldGhvZCA9IHNlcnZpY2UuZ2V0TWV0aG9kcygpLmdldCgwKTsKKyAgICBhc3NlcnRFcXVhbHMoIkZvbyIsIGZvb01ldGhvZC5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLkZvb1JlcXVlc3QuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBmb29NZXRob2QuZ2V0SW5wdXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLkZvb1Jlc3BvbnNlLmdldERlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgZm9vTWV0aG9kLmdldE91dHB1dFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZvb01ldGhvZCwgc2VydmljZS5maW5kTWV0aG9kQnlOYW1lKCJGb28iKSk7CisKKyAgICBNZXRob2REZXNjcmlwdG9yIGJhck1ldGhvZCA9IHNlcnZpY2UuZ2V0TWV0aG9kcygpLmdldCgxKTsKKyAgICBhc3NlcnRFcXVhbHMoIkJhciIsIGJhck1ldGhvZC5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLkJhclJlcXVlc3QuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBiYXJNZXRob2QuZ2V0SW5wdXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLkJhclJlc3BvbnNlLmdldERlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgYmFyTWV0aG9kLmdldE91dHB1dFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGJhck1ldGhvZCwgc2VydmljZS5maW5kTWV0aG9kQnlOYW1lKCJCYXIiKSk7CisKKyAgICBhc3NlcnROdWxsKHNlcnZpY2UuZmluZE1ldGhvZEJ5TmFtZSgiTm9TdWNoTWV0aG9kIikpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlLmdldE1ldGhvZHMoKS5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKGksIHNlcnZpY2UuZ2V0TWV0aG9kcygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisgIH0KKworCisgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21PcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0KKyAgICAgIFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLmdldERlc2NyaXB0b3IoKTsKKworICAgIGFzc2VydFRydWUoCisgICAgICBkZXNjcmlwdG9yLmdldE9wdGlvbnMoKS5oYXNFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLm1lc3NhZ2VPcHQxKSk7CisgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigtNTYpLAorICAgICAgZGVzY3JpcHRvci5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5tZXNzYWdlT3B0MSkpOworCisgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoImZpZWxkMSIpOworICAgIGFzc2VydE5vdE51bGwoZmllbGQpOworCisgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgIGZpZWxkLmdldE9wdGlvbnMoKS5oYXNFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLmZpZWxkT3B0MSkpOworICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoODc2NTQzMjEwOUwpLAorICAgICAgZmllbGQuZ2V0T3B0aW9ucygpLmdldEV4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZmllbGRPcHQxKSk7CisKKyAgICBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9CisgICAgICBVbml0dGVzdEN1c3RvbU9wdGlvbnMuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucy5BbkVudW0uZ2V0RGVzY3JpcHRvcigpOworCisgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgIGVudW1UeXBlLmdldE9wdGlvbnMoKS5oYXNFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLmVudW1PcHQxKSk7CisgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigtNzg5KSwKKyAgICAgIGVudW1UeXBlLmdldE9wdGlvbnMoKS5nZXRFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLmVudW1PcHQxKSk7CisKKyAgICBTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlID0KKyAgICAgIFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5UZXN0U2VydmljZVdpdGhDdXN0b21PcHRpb25zLmdldERlc2NyaXB0b3IoKTsKKworICAgIGFzc2VydFRydWUoCisgICAgICBzZXJ2aWNlLmdldE9wdGlvbnMoKS5oYXNFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLnNlcnZpY2VPcHQxKSk7CisgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZigtOTg3NjU0MzIxMEwpLAorICAgICAgc2VydmljZS5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5zZXJ2aWNlT3B0MSkpOworCisgICAgTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgPSBzZXJ2aWNlLmZpbmRNZXRob2RCeU5hbWUoIkZvbyIpOworICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKKworICAgIGFzc2VydFRydWUoCisgICAgICBtZXRob2QuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMubWV0aG9kT3B0MSkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEN1c3RvbU9wdGlvbnMuTWV0aG9kT3B0MS5NRVRIT0RPUFQxX1ZBTDIsCisgICAgICBtZXRob2QuZ2V0T3B0aW9ucygpLmdldEV4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMubWV0aG9kT3B0MSkpOworICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhhdCB0aGUgRmllbGREZXNjcmlwdG9yLlR5cGUgZW51bSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICogV2lyZUZvcm1hdC5GaWVsZFR5cGUgZW51bS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZFR5cGVUYWJsZXNNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpZWxkRGVzY3JpcHRvci5UeXBlW10gdmFsdWVzMSA9IEZpZWxkRGVzY3JpcHRvci5UeXBlLnZhbHVlcygpOworICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlW10gdmFsdWVzMiA9IFdpcmVGb3JtYXQuRmllbGRUeXBlLnZhbHVlcygpOworCisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlczEubGVuZ3RoLCB2YWx1ZXMyLmxlbmd0aCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlczEubGVuZ3RoOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXMxW2ldLnRvU3RyaW5nKCksIHZhbHVlczJbaV0udG9TdHJpbmcoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhhdCB0aGUgRmllbGREZXNjcmlwdG9yLkphdmFUeXBlIGVudW0gaXMgdGhlIHNhbWUgYXMgdGhlCisgICAqIFdpcmVGb3JtYXQuSmF2YVR5cGUgZW51bS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RKYXZhVHlwZVRhYmxlc01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmllbGREZXNjcmlwdG9yLkphdmFUeXBlW10gdmFsdWVzMSA9IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS52YWx1ZXMoKTsKKyAgICBXaXJlRm9ybWF0LkphdmFUeXBlW10gdmFsdWVzMiA9IFdpcmVGb3JtYXQuSmF2YVR5cGUudmFsdWVzKCk7CisKKyAgICBhc3NlcnRFcXVhbHModmFsdWVzMS5sZW5ndGgsIHZhbHVlczIubGVuZ3RoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzMS5sZW5ndGg7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlczFbaV0udG9TdHJpbmcoKSwgdmFsdWVzMltpXS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW5vcm1vdXNEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZmlsZSBpcyBsYXJnZXIgdGhhbiA2NGssIHlldCBpdCBkaWQgbm90IGNhdXNlCisgICAgLy8gYSBjb21waWxlciBlcnJvciBkdWUgdG8gYW4gb3Zlci1sb25nIHN0cmluZyBsaXRlcmFsLgorICAgIGFzc2VydFRydWUoCisgICAgICAgIFVuaXR0ZXN0RW5vcm1vdXNEZXNjcmlwdG9yLmdldERlc2NyaXB0b3IoKQorICAgICAgICAgIC50b1Byb3RvKCkuZ2V0U2VyaWFsaXplZFNpemUoKSA+IDY1NTM2KTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0cyB0aGF0IHRoZSBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB3b3JrcyBhcyBpbnRlbmRlZC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdG9yVmFsaWRhdG9yRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlRGVzY3JpcHRvclByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgIC5zZXROYW1lKCJmb28ucHJvdG8iKQorICAgICAgLmFkZE1lc3NhZ2VUeXBlKERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgIC5zZXROYW1lKCJGb28iKQorICAgICAgICAuYWRkRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgICAgLnNldExhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX09QVElPTkFMKQorICAgICAgICAgIC5zZXRUeXBlKEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUuVFlQRV9JTlQzMikKKyAgICAgICAgICAuc2V0TmFtZSgiZm9vIikKKyAgICAgICAgICAuc2V0TnVtYmVyKDEpCisgICAgICAgICAgLnNldERlZmF1bHRWYWx1ZSgiaW52YWxpZCIpCisgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpKQorICAgICAgLmJ1aWxkKCk7CisgICAgdHJ5IHsKKyAgICAgIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbShmaWxlRGVzY3JpcHRvclByb3RvLAorICAgICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7CisgICAgICBmYWlsKCJEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgIH0gY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIEV4cGVjdGVkOyBjaGVjayB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIGNvbnRhaW5zIHNvbWUgdXNlZnVsIGhpbnRzCisgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoImZvbyIpICE9IC0xKTsKKyAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiRm9vIikgIT0gLTEpOworICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJpbnZhbGlkIikgIT0gLTEpOworICAgICAgYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBOdW1iZXJGb3JtYXRFeGNlcHRpb24pOworICAgICAgYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpLmluZGV4T2YoImludmFsaWQiKSAhPSAtMSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRlc3RzIHRoZSB0cmFuc2xhdGUvY3Jvc3NsaW5rIGZvciBhbiBleGFtcGxlIHdoZXJlIGEgbWVzc2FnZSBmaWVsZCdzIG5hbWUKKyAgICogYW5kIHR5cGUgbmFtZSBhcmUgdGhlIHNhbWUuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRvckNvbXBsZXhDcm9zc2xpbmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVEZXNjcmlwdG9yUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCisgICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TmFtZSgiRm9vIikKKyAgICAgICAgLmFkZEZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9PUFRJT05BTCkKKyAgICAgICAgICAuc2V0VHlwZShGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLlRZUEVfSU5UMzIpCisgICAgICAgICAgLnNldE5hbWUoImZvbyIpCisgICAgICAgICAgLnNldE51bWJlcigxKQorICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKSkKKyAgICAgIC5hZGRNZXNzYWdlVHlwZShEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXROYW1lKCJCYXIiKQorICAgICAgICAuYWRkRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgICAgLnNldExhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX09QVElPTkFMKQorICAgICAgICAgIC5zZXRUeXBlTmFtZSgiRm9vIikKKyAgICAgICAgICAuc2V0TmFtZSgiRm9vIikKKyAgICAgICAgICAuc2V0TnVtYmVyKDEpCisgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpKQorICAgICAgLmJ1aWxkKCk7CisgICAgLy8gdHJhbnNsYXRlIGFuZCBjcm9zc2xpbmsKKyAgICBGaWxlRGVzY3JpcHRvciBmaWxlID0KKyAgICAgIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbShmaWxlRGVzY3JpcHRvclByb3RvLCAKKyAgICAgICAgICBuZXcgRmlsZURlc2NyaXB0b3JbMF0pOworICAgIC8vIHZlcmlmeSByZXN1bHRpbmcgZGVzY3JpcHRvcnMKKyAgICBhc3NlcnROb3ROdWxsKGZpbGUpOworICAgIExpc3Q8RGVzY3JpcHRvcj4gbXNnbGlzdCA9IGZpbGUuZ2V0TWVzc2FnZVR5cGVzKCk7CisgICAgYXNzZXJ0Tm90TnVsbChtc2dsaXN0KTsKKyAgICBhc3NlcnRUcnVlKG1zZ2xpc3Quc2l6ZSgpID09IDIpOworICAgIGJvb2xlYW4gYmFyRm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKERlc2NyaXB0b3IgZGVzYyA6IG1zZ2xpc3QpIHsKKyAgICAgIGlmIChkZXNjLmdldE5hbWUoKS5lcXVhbHMoIkJhciIpKSB7CisgICAgICAgIGJhckZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjLmdldEZpZWxkcygpKTsKKyAgICAgICAgTGlzdDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkbGlzdCA9IGRlc2MuZ2V0RmllbGRzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZmllbGRsaXN0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWVsZGxpc3Quc2l6ZSgpID09IDEpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkbGlzdC5nZXQoMCkuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkbGlzdC5nZXQoMCkuZ2V0TWVzc2FnZVR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJGb28iKSk7CisgICAgICB9CisgICAgfQorICAgIGFzc2VydFRydWUoYmFyRm91bmQpOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFB1YmxpY0RlcGVuZGVuY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb1Byb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpIC5idWlsZCgpOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmFyUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TmFtZSgiYm9vLnByb3RvIikKKyAgICAgICAgLmFkZERlcGVuZGVuY3koImZvby5wcm90byIpCisgICAgICAgIC5hZGRQdWJsaWNEZXBlbmRlbmN5KDEpICAvLyBFcnJvciwgc2hvdWxkIGJlIDAuCisgICAgICAgIC5idWlsZCgpOworICAgIEZpbGVEZXNjcmlwdG9yIGZvb0ZpbGUgPSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oZm9vUHJvdG8sCisgICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7CisgICAgdHJ5IHsKKyAgICAgIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbShiYXJQcm90bywKKyAgICAgICAgICBuZXcgRmlsZURlc2NyaXB0b3JbXSB7Zm9vRmlsZX0pOworICAgICAgZmFpbCgiRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICB9IGNhdGNoIChEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIkludmFsaWQgcHVibGljIGRlcGVuZGVuY3kgaW5kZXguIikgIT0gLTEpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RIaWRkZW5EZXBlbmRlbmN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXROYW1lKCJiYXIucHJvdG8iKQorICAgICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKS5zZXROYW1lKCJCYXIiKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb3J3YXJkUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TmFtZSgiZm9yd2FyZC5wcm90byIpCisgICAgICAgIC5hZGREZXBlbmRlbmN5KCJiYXIucHJvdG8iKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb1Byb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCisgICAgICAgIC5hZGREZXBlbmRlbmN5KCJmb3J3YXJkLnByb3RvIikKKyAgICAgICAgLmFkZE1lc3NhZ2VUeXBlKERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXROYW1lKCJGb28iKQorICAgICAgICAgICAgLmFkZEZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9PUFRJT05BTCkKKyAgICAgICAgICAgICAgICAuc2V0VHlwZU5hbWUoIkJhciIpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoImJhciIpCisgICAgICAgICAgICAgICAgLnNldE51bWJlcigxKSkpCisgICAgICAgIC5idWlsZCgpOworICAgIEZpbGVEZXNjcmlwdG9yIGJhckZpbGUgPSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCisgICAgICAgIGJhclByb3RvLCBuZXcgRmlsZURlc2NyaXB0b3JbMF0pOworICAgIEZpbGVEZXNjcmlwdG9yIGZvcndhcmRGaWxlID0gRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKAorICAgICAgICBmb3J3YXJkUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvcltdIHtiYXJGaWxlfSk7CisKKyAgICB0cnkgeworICAgICAgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKAorICAgICAgICAgIGZvb1Byb3RvLCBuZXcgRmlsZURlc2NyaXB0b3JbXSB7Zm9yd2FyZEZpbGV9KTsKKyAgICAgIGZhaWwoIkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgfSBjYXRjaCAoRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJCYXIiKSAhPSAtMSk7CisgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIikgIT0gLTEpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaWNEZXBlbmRlbmN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXROYW1lKCJiYXIucHJvdG8iKQorICAgICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKS5zZXROYW1lKCJCYXIiKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb3J3YXJkUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TmFtZSgiZm9yd2FyZC5wcm90byIpCisgICAgICAgIC5hZGREZXBlbmRlbmN5KCJiYXIucHJvdG8iKQorICAgICAgICAuYWRkUHVibGljRGVwZW5kZW5jeSgwKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb1Byb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCisgICAgICAgIC5hZGREZXBlbmRlbmN5KCJmb3J3YXJkLnByb3RvIikKKyAgICAgICAgLmFkZE1lc3NhZ2VUeXBlKERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXROYW1lKCJGb28iKQorICAgICAgICAgICAgLmFkZEZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9PUFRJT05BTCkKKyAgICAgICAgICAgICAgICAuc2V0VHlwZU5hbWUoIkJhciIpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoImJhciIpCisgICAgICAgICAgICAgICAgLnNldE51bWJlcigxKSkpCisgICAgICAgIC5idWlsZCgpOworICAgIEZpbGVEZXNjcmlwdG9yIGJhckZpbGUgPSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCisgICAgICAgIGJhclByb3RvLCBuZXcgRmlsZURlc2NyaXB0b3JbMF0pOworICAgIEZpbGVEZXNjcmlwdG9yIGZvcndhcmRGaWxlID0gRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKAorICAgICAgICBmb3J3YXJkUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvcltde2JhckZpbGV9KTsKKyAgICBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCisgICAgICAgIGZvb1Byb3RvLCBuZXcgRmlsZURlc2NyaXB0b3JbXSB7Zm9yd2FyZEZpbGV9KTsKKyAgfQorICAKKyAgLyoqCisgICAqIFRlc3RzIHRoZSB0cmFuc2xhdGUvY3Jvc3NsaW5rIGZvciBhbiBleGFtcGxlIHdpdGggYSBtb3JlIGNvbXBsZXggbmFtZXNwYWNlCisgICAqIHJlZmVyZW5jaW5nLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhOYW1lc3BhY2VQdWJsaWNEZXBlbmRlbmN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29Qcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXROYW1lKCJiYXIucHJvdG8iKQorICAgICAgICAuc2V0UGFja2FnZSgiYS5iLmMuZC5iYXIuc2hhcmVkIikKKyAgICAgICAgLmFkZEVudW1UeXBlKEVudW1EZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0TmFtZSgiTXlFbnVtIikKKyAgICAgICAgICAgIC5hZGRWYWx1ZShFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoIkJMQUgiKQorICAgICAgICAgICAgICAgIC5zZXROdW1iZXIoMSkpKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhclByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCisgICAgICAgIC5hZGREZXBlbmRlbmN5KCJiYXIucHJvdG8iKQorICAgICAgICAuc2V0UGFja2FnZSgiYS5iLmMuZC5mb28uc2hhcmVkIikKKyAgICAgICAgLmFkZE1lc3NhZ2VUeXBlKERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXROYW1lKCJNeU1lc3NhZ2UiKQorICAgICAgICAgICAgLmFkZEZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9SRVBFQVRFRCkKKyAgICAgICAgICAgICAgICAuc2V0VHlwZU5hbWUoImJhci5zaGFyZWQuTXlFbnVtIikKKyAgICAgICAgICAgICAgICAuc2V0TmFtZSgiTXlGaWVsZCIpCisgICAgICAgICAgICAgICAgLnNldE51bWJlcigxKSkpCisgICAgICAgIC5idWlsZCgpOworICAgIC8vIHRyYW5zbGF0ZSBhbmQgY3Jvc3NsaW5rCisgICAgRmlsZURlc2NyaXB0b3IgZm9vRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgKKyAgICAgICAgZm9vUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7CisgICAgRmlsZURlc2NyaXB0b3IgYmFyRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgKKyAgICAgICAgYmFyUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvcltde2Zvb0ZpbGV9KTsKKyAgICAvLyB2ZXJpZnkgcmVzdWx0aW5nIGRlc2NyaXB0b3JzCisgICAgYXNzZXJ0Tm90TnVsbChiYXJGaWxlKTsKKyAgICBMaXN0PERlc2NyaXB0b3I+IG1zZ2xpc3QgPSBiYXJGaWxlLmdldE1lc3NhZ2VUeXBlcygpOworICAgIGFzc2VydE5vdE51bGwobXNnbGlzdCk7CisgICAgYXNzZXJ0VHJ1ZShtc2dsaXN0LnNpemUoKSA9PSAxKTsKKyAgICBEZXNjcmlwdG9yIGRlc2MgPSBtc2dsaXN0LmdldCgwKTsKKyAgICBpZiAoZGVzYy5nZXROYW1lKCkuZXF1YWxzKCJNeU1lc3NhZ2UiKSkgeworICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjLmdldEZpZWxkcygpKTsKKyAgICAgIExpc3Q8RmllbGREZXNjcmlwdG9yPiBmaWVsZGxpc3QgPSBkZXNjLmdldEZpZWxkcygpOworICAgICAgYXNzZXJ0Tm90TnVsbChmaWVsZGxpc3QpOworICAgICAgYXNzZXJ0VHJ1ZShmaWVsZGxpc3Quc2l6ZSgpID09IDEpOworICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZmllbGRsaXN0LmdldCgwKTsKKyAgICAgIGFzc2VydFRydWUoZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLkVOVU0pOworICAgICAgYXNzZXJ0VHJ1ZShmaWVsZC5nZXRFbnVtVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoIk15RW51bSIpKTsKKyAgICAgIGFzc2VydFRydWUoZmllbGQuZ2V0RW51bVR5cGUoKS5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscygiYmFyLnByb3RvIikpOworICAgICAgYXNzZXJ0VHJ1ZShmaWVsZC5nZXRFbnVtVHlwZSgpLmdldEZpbGUoKS5nZXRQYWNrYWdlKCkuZXF1YWxzKAorICAgICAgICAgICJhLmIuYy5kLmJhci5zaGFyZWQiKSk7CisgICAgfSAgIAorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTBlOGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDI2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHtAbGluayBEeW5hbWljTWVzc2FnZX0uICBTZWUgYWxzbyB7QGxpbmsgTWVzc2FnZVRlc3R9LCB3aGljaAorICogdGVzdHMgc29tZSB7QGxpbmsgRHluYW1pY01lc3NhZ2V9IGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGNsYXNzIER5bmFtaWNNZXNzYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uVGVzdGVyID0KKyAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLCBudWxsKTsKKworICBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyID0KKyAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSk7CisgIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcGFja2VkUmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdFBhY2tlZFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlQWNjZXNzb3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7CisgICAgTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXR0ZXJzQWZ0ZXJCdWlsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgTWVzc2FnZSBmaXJzdE1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgLy8gZG91YmxlIGJ1aWxkKCkKKyAgICBidWlsZGVyLmJ1aWxkKCk7CisgICAgLy8gY2xlYXIoKSBhZnRlciBidWlsZCgpCisgICAgYnVpbGRlci5jbGVhcigpOworICAgIC8vIHNldHRlcnMgYWZ0ZXIgYnVpbGQoKQorICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworICAgIC8vIHJlcGVhdGVkIHNldHRlcnMgYWZ0ZXIgYnVpbGQoKQorICAgIHJlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkVmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgICAvLyBmaXJzdE1lc3NhZ2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBtb2RpZmllZC4KKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbihmaXJzdE1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVua25vd25GaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEVtcHR5TWVzc2FnZS5nZXREZXNjcmlwdG9yKCkpOworICAgIGJ1aWxkZXIuc2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRGaWVsZCgxLCBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpLmFkZFZhcmludCgxKS5idWlsZCgpKQorICAgICAgICAuYWRkRmllbGQoMiwgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKS5hZGRGaXhlZDMyKDEpLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpKTsKKyAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuc2l6ZSgpKTsKKyAgICAvLyBjbG9uZSgpIHdpdGggdW5rbm93biBmaWVsZHMKKyAgICBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlciA9IGJ1aWxkZXIuY2xvbmUoKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgbmV3QnVpbGRlci5nZXRVbmtub3duRmllbGRzKCkuYXNNYXAoKS5zaXplKCkpOworICAgIC8vIGNsZWFyKCkgd2l0aCB1bmtub3duIGZpZWxkcworICAgIG5ld0J1aWxkZXIuY2xlYXIoKTsKKyAgICBhc3NlcnRUcnVlKG5ld0J1aWxkZXIuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuaXNFbXB0eSgpKTsKKyAgICAvLyBzZXJpYWxpemUvcGFyc2Ugd2l0aCB1bmtub3duIGZpZWxkcworICAgIG5ld0J1aWxkZXIubWVyZ2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOworICAgIGFzc2VydEVxdWFscygyLCBuZXdCdWlsZGVyLmdldFVua25vd25GaWVsZHMoKS5hc01hcCgpLnNpemUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VFeHRlbnNpb25BY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGV4dGVuc2l2ZWx5IHRlc3QgRHluYW1pY01lc3NhZ2UncyBoYW5kbGluZyBvZgorICAgIC8vIGV4dGVuc2lvbnMgYmVjYXVzZSwgZnJhbmtseSwgaXQgZG9lc24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhlbS4KKyAgICAvLyBJdCB0cmVhdHMgdGhlbSBqdXN0IGxpa2UgYW55IG90aGVyIGZpZWxkcy4KKyAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSk7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZUV4dGVuc2lvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCkpOworICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCisgICAgICBEeW5hbWljTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSkpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKAorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKS5idWlsZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVNlcmlhbGl6ZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKKworICAgIE1lc3NhZ2UuQnVpbGRlciBkeW5hbWljQnVpbGRlciA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihkeW5hbWljQnVpbGRlcik7CisgICAgTWVzc2FnZSBkeW5hbWljTWVzc2FnZSA9IGR5bmFtaWNCdWlsZGVyLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpLAorICAgICAgICAgICAgICAgICBkeW5hbWljTWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKKworICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgICAvLyBJbiBmYWN0LCB0aGUgc2VyaWFsaXplZCBmb3JtcyBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSwgYnl0ZS1mb3ItYnl0ZS4KKyAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCksIHJhd0J5dGVzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKKworICAgIE1lc3NhZ2UgbWVzc2FnZTIgPQorICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIHJhd0J5dGVzKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZTIpOworCisgICAgLy8gVGVzdCBQYXJzZXIgaW50ZXJmYWNlLgorICAgIE1lc3NhZ2UgbWVzc2FnZTMgPSBtZXNzYWdlMi5nZXRQYXJzZXJGb3JUeXBlKCkucGFyc2VGcm9tKHJhd0J5dGVzKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZTMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCkudG9CeXRlU3RyaW5nKCk7CisgICAgTWVzc2FnZSBtZXNzYWdlID0gRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKAorICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCksIHJhd0J5dGVzLAorICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworCisgICAgLy8gVGVzdCBQYXJzZXIgaW50ZXJmYWNlLgorICAgIE1lc3NhZ2UgbWVzc2FnZTIgPSBtZXNzYWdlLmdldFBhcnNlckZvclR5cGUoKS5wYXJzZUZyb20oCisgICAgICAgIHJhd0J5dGVzLCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVBhY2tlZFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcGFja2VkUmVmbGVjdGlvblRlc3Rlci5zZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMiA9IFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAgIC8vIEluIGZhY3QsIHRoZSBzZXJpYWxpemVkIGZvcm1zIHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lLCBieXRlLWZvci1ieXRlLgorICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSwgcmF3Qnl0ZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUGFja2VkUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UGFja2VkVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldFBhY2tlZEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgTWVzc2FnZSBtZXNzYWdlMiA9CisgICAgICBEeW5hbWljTWVzc2FnZS5wYXJzZUZyb20oVGVzdFBhY2tlZFR5cGVzLmdldERlc2NyaXB0b3IoKSwgcmF3Qnl0ZXMpOworICAgIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlMik7CisKKyAgICAvLyBUZXN0IFBhcnNlciBpbnRlcmZhY2UuCisgICAgTWVzc2FnZSBtZXNzYWdlMyA9IG1lc3NhZ2UyLmdldFBhcnNlckZvclR5cGUoKS5wYXJzZUZyb20ocmF3Qnl0ZXMpOworICAgIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlMyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworCisgICAgRHluYW1pY01lc3NhZ2UgY29weSA9IER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIobWVzc2FnZSkuYnVpbGQoKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oY29weSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VG9CdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRHluYW1pY01lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7CisgICAgaW50IHVua25vd25GaWVsZE51bSA9IDk7CisgICAgbG9uZyB1bmtub3duRmllbGRWYWwgPSA5MDsKKyAgICBidWlsZGVyLnNldFVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAuYWRkRmllbGQodW5rbm93bkZpZWxkTnVtLAorICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQodW5rbm93bkZpZWxkVmFsKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKSk7CisgICAgRHluYW1pY01lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgIER5bmFtaWNNZXNzYWdlIGRlcml2ZWQgPSBtZXNzYWdlLnRvQnVpbGRlcigpLmJ1aWxkKCk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKGRlcml2ZWQpOworICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KHVua25vd25GaWVsZFZhbCksCisgICAgICAgIGRlcml2ZWQuZ2V0VW5rbm93bkZpZWxkcygpLmdldEZpZWxkKHVua25vd25GaWVsZE51bSkuZ2V0VmFyaW50TGlzdCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Gb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRm9yY2VGaWVsZEJ1aWxkZXJzUHJlUnVuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3ODg5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRm9yY2VGaWVsZEJ1aWxkZXJzUHJlUnVuLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIEEgcHJlcnVuIGZvciBhIHRlc3Qgc3VpdGUgdGhhdCBhbGxvd3MgcnVubmluZyB0aGUgZnVsbCBwcm90b2NvbCBidWZmZXIKKyAqIHRlc3RzIGluIGEgbW9kZSB0aGF0IGRpc2FibGVzIHRoZSBvcHRpbWl6YXRpb24gZm9yIG5vdCB1c2luZworICoge0BsaW5rIFJlcGVhdGVkRmllbGRCdWlsZGVyfSBhbmQge0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0gdW50aWwgdGhleSBhcmUKKyAqIHJlcXVlc3RlZC4gVGhpcyBhbGxvd3MgdXMgdG8gcnVuIGFsbCB0aGUgdGVzdHMgdGhyb3VnaCBib3RoIGNvZGUgcGF0aHMKKyAqIGFuZCBlbnN1cmVzIHRoYXQgYm90aCBjb2RlIHBhdGhzIHByb2R1Y2UgaWRlbnRpY2FsIHJlc3VsdHMuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4gaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBHZW5lcmF0ZWRNZXNzYWdlLmVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjlkYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE0NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxFeHRlbnNpb25zTGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QuVW5pdHRlc3RJbXBvcnQ7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuRW51bVdpdGhOb091dGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk1lc3NhZ2VXaXRoTm9PdXRlcjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5NdWx0aXBsZUZpbGVzVGVzdFByb3RvOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZEV4dGVuc2lvbi5NeU5lc3RlZEV4dGVuc2lvbjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5OZXN0ZWRFeHRlbnNpb25MaXRlLk15TmVzdGVkRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb247CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTm9uTmVzdGVkRXh0ZW5zaW9uLk1lc3NhZ2VUb0JlRXh0ZW5kZWQ7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTm9uTmVzdGVkRXh0ZW5zaW9uLk15Tm9uTmVzdGVkRXh0ZW5zaW9uOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZS5NZXNzYWdlTGl0ZVRvQmVFeHRlbmRlZDsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb25MaXRlLk15Tm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5TZXJ2aWNlV2l0aE5vT3V0ZXI7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RPcHRpbWl6ZUZvci5UZXN0T3B0aW1pemVkRm9yU2l6ZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemU7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RPcHRpbWl6ZUZvci5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduRW51bTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25NZXNzYWdlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXI7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFVucGFja2VkVHlwZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBnZW5lcmF0ZWQgbWVzc2FnZXMgYW5kIGdlbmVyYXRlZCBjb2RlLiAgU2VlIGFsc28KKyAqIHtAbGluayBNZXNzYWdlVGVzdH0sIHdoaWNoIHRlc3RzIHNvbWUgZ2VuZXJhdGVkIG1lc3NhZ2UgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVkTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7CisKKyAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7CisgICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCisgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZU9yQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdCdWlsZGVyTXVsdGlwbGVUaW1lcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIC8vIHByaW1pdGl2ZSBmaWVsZCBzY2FsYXIgYW5kIHJlcGVhdGVkCisgICAgYnVpbGRlci5zZXRPcHRpb25hbFNmaXhlZDY0KDEwMCk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDEwMCk7CisgICAgLy8gZW51bSBmaWVsZCBzY2FsYXIgYW5kIHJlcGVhdGVkCisgICAgYnVpbGRlci5zZXRPcHRpb25hbEltcG9ydEVudW0oVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfQkFSKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOworICAgIC8vIHByb3RvIGZpZWxkIHNjYWxhciBhbmQgcmVwZWF0ZWQKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMSkpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxKSk7CisKKyAgICBUZXN0QWxsVHlwZXMgdmFsdWUxID0gYnVpbGRlci5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldFJlcGVhdGVkSW50MzIoMCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIsCisgICAgICAgIHZhbHVlMS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKKyAgICAgICAgdmFsdWUxLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlMS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGJ1aWxkZXIgZGlkbid0IHVwZGF0ZSBwcmV2aW91c2x5IGNyZWF0ZWQgdmFsdWVzCisgICAgYnVpbGRlci5zZXRPcHRpb25hbFNmaXhlZDY0KDIwMCk7CisgICAgYnVpbGRlci5zZXRSZXBlYXRlZEludDMyKDAsIDIwMCk7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbEltcG9ydEVudW0oVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsKKyAgICBidWlsZGVyLnNldFJlcGVhdGVkSW1wb3J0RW51bSgwLCBVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08pOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygyKSk7CisgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDAsIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDIpKTsKKworICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTIgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAvLyBNYWtlIHN1cmUgdmFsdWUxIGRpZG4ndCBjaGFuZ2UuCisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldFJlcGVhdGVkSW50MzIoMCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIsCisgICAgICAgIHZhbHVlMS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKKyAgICAgICAgdmFsdWUxLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlMS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB2YWx1ZTIgaXMgY29ycmVjdAorICAgIGFzc2VydEVxdWFscygyMDAsIHZhbHVlMi5nZXRPcHRpb25hbFNmaXhlZDY0KCkpOworICAgIGFzc2VydEVxdWFscygyMDAsIHZhbHVlMi5nZXRSZXBlYXRlZEludDMyKDApKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfRk9PLAorICAgICAgICB2YWx1ZTIuZ2V0T3B0aW9uYWxJbXBvcnRFbnVtKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08sCisgICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEltcG9ydEVudW0oMCkpOworICAgIGFzc2VydEVxdWFscygyLCB2YWx1ZTIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlMi5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLmdldEMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJvdG9zU2hhcmVSZXBlYXRlZEFycmF5c0lmRGlkbnRDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMTAwKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7CisKKyAgICBUZXN0QWxsVHlwZXMgdmFsdWUxID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTIgPSB2YWx1ZTEudG9CdWlsZGVyKCkuYnVpbGQoKTsKKworICAgIGFzc2VydFNhbWUodmFsdWUxLmdldFJlcGVhdGVkSW50MzJMaXN0KCksIHZhbHVlMi5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKKyAgICBhc3NlcnRTYW1lKHZhbHVlMS5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCksCisgICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCkpOworICAgIGFzc2VydFNhbWUodmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCksCisgICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEFycmF5c0FyZUltbXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigxMDApOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbXBvcnRFbnVtKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUik7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkSW50MzJMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGbG9hdExpc3QoKSk7CisKKworICAgIFRlc3RBbGxUeXBlcyB2YWx1ZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlZE1lc3NhZ2VzQXJlSW1tdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIHZhbHVlID0gVGVzdEFsbFR5cGVzLlBBUlNFUi5wYXJzZUZyb20oCisgICAgICAgIFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEludDY0TGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZFVpbnQzMkxpc3QoKSk7CisgICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRVaW50NjRMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkU2ludDMyTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZFNpbnQ2NExpc3QoKSk7CisgICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRGaXhlZDMyTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEZpeGVkNjRMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkU2ZpeGVkMzJMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkU2ZpeGVkNjRMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRG91YmxlTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEJvb2xMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkU3RyaW5nTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEJ5dGVzTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEdyb3VwTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZUxpc3QoKSk7CisgICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydElzVW5tb2RpZmlhYmxlKExpc3Q8Pz4gbGlzdCkgeworICAgIGlmIChsaXN0ID09IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKSB7CisgICAgICAvLyBPS0FZIC0tIE5lZWQgdG8gY2hlY2sgdGhpcyBiL2MgRW1wdHlMaXN0IGFsbG93cyB5b3UgdG8gY2FsbCBjbGVhci4KKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHsKKyAgICAgICAgbGlzdC5jbGVhcigpOworICAgICAgICBmYWlsKCJMaXN0IHdhc24ndCBpbW11dGFibGUiKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gZ29vZAorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLnNldE9wdGlvbmFsU3RyaW5nKG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRPcHRpb25hbEJ5dGVzKG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKSBudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAorICAgICAgICAgIChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZyhudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCeXRlcyhudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRmllbGRzKGJ1aWxkZXIpOworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygib25lIik7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygidHdvIik7CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRTdHJpbmcoMSwgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzKFRlc3RVdGlsLnRvQnl0ZXMoIm9uZSIpKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkQnl0ZXMoVGVzdFV0aWwudG9CeXRlcygidHdvIikpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLnNldFJlcGVhdGVkQnl0ZXMoMSwgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKKyAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig0NTYpLmJ1aWxkKCkpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLnNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgxLCAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpIG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgMSwgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIpIG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTyk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZE5lc3RlZEVudW0oMSwgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkQXBwZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisKKyAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkSW50MzIoQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSk7CisgICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25FbnVtKEFycmF5cy5hc0xpc3QoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopKTsKKworICAgIEZvcmVpZ25NZXNzYWdlIGZvcmVpZ25NZXNzYWdlID0KKyAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIpLmJ1aWxkKCk7CisgICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEFycmF5cy5hc0xpc3QoZm9yZWlnbk1lc3NhZ2UpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJMaXN0KCksIEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCkpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCksCisgICAgICAgIEFycmF5cy5hc0xpc3QoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEyLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEFwcGVuZFJlamVjdHNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisKKyAgICBGb3JlaWduTWVzc2FnZSBmb3JlaWduTWVzc2FnZSA9CisgICAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDEyKS5idWlsZCgpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCisgICAgICAgICAgQXJyYXlzLmFzTGlzdChmb3JlaWduTWVzc2FnZSwgKEZvcmVpZ25NZXNzYWdlKSBudWxsKSk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRGb3JlaWduRW51bSgKKyAgICAgICAgICBBcnJheXMuYXNMaXN0KEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBudWxsKSk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRTdHJpbmcoQXJyYXlzLmFzTGlzdCgib25lIiwgbnVsbCkpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKworICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkQnl0ZXMoQXJyYXlzLmFzTGlzdChUZXN0VXRpbC50b0J5dGVzKCJvbmUiKSwgbnVsbCkpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nRm9yZWlnbk1lc3NhZ2VVc2luZ0J1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLy8gUGFzcyBidWlsZGVyIGZvciBmb3JlaWduIG1lc3NhZ2UgaW5zdGFuY2UuCisgICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDEyMykpCisgICAgICAgIC5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZE1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgIC8vIENyZWF0ZSBleHBlY3RlZCB2ZXJzaW9uIHBhc3NpbmcgZm9yZWlnbiBtZXNzYWdlIGluc3RhbmNlIGV4cGxpY2l0bHkuCisgICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKAorICAgICAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIzKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKyAgICAvLyBUT0RPKG5nZCk6IFVwZ3JhZGUgdG8gdXNpbmcgcmVhbCAjZXF1YWxzIG1ldGhvZCBvbmNlIGltcGxlbWVudGVkCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNldHRpbmdSZXBlYXRlZEZvcmVpZ25NZXNzYWdlVXNpbmdCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgIC8vIFBhc3MgYnVpbGRlciBmb3IgZm9yZWlnbiBtZXNzYWdlIGluc3RhbmNlLgorICAgICAgICAuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0Qyg0NTYpKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBUZXN0QWxsVHlwZXMgZXhwZWN0ZWRNZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAvLyBDcmVhdGUgZXhwZWN0ZWQgdmVyc2lvbiBwYXNzaW5nIGZvcmVpZ24gbWVzc2FnZSBpbnN0YW5jZSBleHBsaWNpdGx5LgorICAgICAgICAuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgKKyAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDQ1NikuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFV0aWwuYXNzZXJ0Q2xlYXIoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCkpOworCisgICAgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIG1lc3NhZ2UgPQorICAgICAgICBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBtZXNzYWdlLmdldFV0ZjhTdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXRJbmZEb3VibGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXROZWdJbmZEb3VibGUoKSk7CisgICAgYXNzZXJ0VHJ1ZShEb3VibGUuaXNOYU4obWVzc2FnZS5nZXROYW5Eb3VibGUoKSkpOworICAgIGFzc2VydEVxdWFscyhGbG9hdC5QT1NJVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXRJbmZGbG9hdCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFksIG1lc3NhZ2UuZ2V0TmVnSW5mRmxvYXQoKSk7CisgICAgYXNzZXJ0VHJ1ZShGbG9hdC5pc05hTihtZXNzYWdlLmdldE5hbkZsb2F0KCkpKTsKKyAgICBhc3NlcnRFcXVhbHMoIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSIsIG1lc3NhZ2UuZ2V0Q3BwVHJpZ3JhcGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcihidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7CisgICAgYnVpbGRlci5jbGVhcigpOworICAgIFRlc3RVdGlsLmFzc2VydENsZWFyKGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25HZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoYnVpbGRlcik7CisKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLm1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKGJ1aWxkZXIpOworCisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCisgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKAorICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5idWlsZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnVtSW50ZXJmYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0VHJ1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0RGVmYXVsdE5lc3RlZEVudW0oKQorICAgICAgICBpbnN0YW5jZW9mIFByb3RvY29sTWVzc2FnZUVudW0pOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVudW1NYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbnRlcm5hbC5FbnVtTGl0ZU1hcDxGb3JlaWduRW51bT4gbWFwID0gRm9yZWlnbkVudW0uaW50ZXJuYWxHZXRWYWx1ZU1hcCgpOworCisgICAgZm9yIChGb3JlaWduRW51bSB2YWx1ZSA6IEZvcmVpZ25FbnVtLnZhbHVlcygpKSB7CisgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIG1hcC5maW5kVmFsdWVCeU51bWJlcih2YWx1ZS5nZXROdW1iZXIoKSkpOworICAgIH0KKworICAgIGFzc2VydFRydWUobWFwLmZpbmRWYWx1ZUJ5TnVtYmVyKDEyMzQ1KSA9PSBudWxsKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVBhY2tlZFRvVW5wYWNrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdFVucGFja2VkVHlwZXMgbWVzc2FnZSA9CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVucGFja2VkVG9QYWNrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEV4dGVuc2lvbnMuCisKKyAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOworCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25NZXNzYWdlT3JCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFV0aWwuYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRFeHRlbnNpb25zQ2xlYXIoVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLmJ1aWxkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25HZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKworICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlcik7CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKGJ1aWxkZXIpOworCisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoCisgICAgICAgIGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbigKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkuYnVpbGQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFeHRlbnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBjbGVhckV4dGVuc2lvbigpIGlzIG5vdCBhY3R1YWxseSB1c2VkIGluIFRlc3RVdGlsLCBzbyB0cnkgaXQgbWFudWFsbHkuCisgICAgYXNzZXJ0RmFsc2UoCisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpCisgICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24pCisgICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDEpCisgICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pCisgICAgICAgIC5nZXRFeHRlbnNpb25Db3VudChVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgb3JpZ2luYWwgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIob3JpZ2luYWwpLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChjb3B5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25NZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucyBvcmlnaW5hbCA9CisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpLmJ1aWxkKCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVyZ2VkID0KKyAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLm1lcmdlRnJvbShvcmlnaW5hbCkuYnVpbGQoKTsKKyAgICBhc3NlcnRUcnVlKG1lcmdlZC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAxLCAoaW50KSBtZXJnZWQuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbikpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gTGl0ZSBFeHRlbnNpb25zLgorCisgIC8vIFdlIHRlc3QgbGl0ZSBleHRlbnNpb25zIGRpcmVjdGx5IGJlY2F1c2UgdGhleSBoYXZlIGEgc2VwYXJhdGUKKyAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBmdWxsIGV4dGVuc2lvbnMuICBJbiBjb250cmFzdCwgd2UgZG8gbm90IHRlc3QKKyAgLy8gbGl0ZSBmaWVsZHMgZGlyZWN0bHkgc2luY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgZXhhY3RseSB0aGUgc2FtZSBhcworICAvLyByZWd1bGFyIGZpZWxkcy4KKworICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbk1lc3NhZ2VPckJ1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlcik7CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25SZXBlYXRlZFNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChidWlsZGVyKTsKKworICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpLmJ1aWxkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFyTGl0ZUV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIGNsZWFyRXh0ZW5zaW9uKCkgaXMgbm90IGFjdHVhbGx5IHVzZWQgaW4gVGVzdFV0aWwsIHNvIHRyeSBpdCBtYW51YWxseS4KKyAgICBhc3NlcnRGYWxzZSgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEpCisgICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpCisgICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAxKQorICAgICAgICAuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKQorICAgICAgICAuZ2V0RXh0ZW5zaW9uQ291bnQoVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbkNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgb3JpZ2luYWwgPSBUZXN0VXRpbC5nZXRBbGxMaXRlRXh0ZW5zaW9uc1NldCgpOworICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBjb3B5ID0KKyAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIob3JpZ2luYWwpLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChjb3B5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMaXRlRXh0ZW5zaW9uTWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG9yaWdpbmFsID0KKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEpLmJ1aWxkKCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lcmdlZCA9CisgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKG9yaWdpbmFsKS5idWlsZCgpOworICAgIGFzc2VydFRydWUobWVyZ2VkLmhhc0V4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIDEsIChpbnQpIG1lcmdlZC5nZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBtdWx0aXBsZV9maWxlc190ZXN0CisKKyAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsZXNPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBXZSBtb3N0bHkganVzdCB3YW50IHRvIGNoZWNrIHRoYXQgdGhpbmdzIGNvbXBpbGUuCisgICAgTWVzc2FnZVdpdGhOb091dGVyIG1lc3NhZ2UgPQorICAgICAgTWVzc2FnZVdpdGhOb091dGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TmVzdGVkKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDEpKQorICAgICAgICAuYWRkRm9yZWlnbihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSkpCisgICAgICAgIC5zZXROZXN0ZWRFbnVtKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRFbnVtLkJBWikKKyAgICAgICAgLnNldEZvcmVpZ25FbnVtKEVudW1XaXRoTm9PdXRlci5CQVIpCisgICAgICAgIC5idWlsZCgpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBNZXNzYWdlV2l0aE5vT3V0ZXIucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpKTsKKworICAgIGFzc2VydEVxdWFscyhNdWx0aXBsZUZpbGVzVGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgTWVzc2FnZVdpdGhOb091dGVyLmdldERlc2NyaXB0b3IoKS5nZXRGaWxlKCkpOworCisgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkID0KKyAgICAgIE1lc3NhZ2VXaXRoTm9PdXRlci5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJmb3JlaWduX2VudW0iKTsKKyAgICBhc3NlcnRFcXVhbHMoRW51bVdpdGhOb091dGVyLkJBUi5nZXRWYWx1ZURlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRGaWVsZChmaWVsZCkpOworCisgICAgYXNzZXJ0RXF1YWxzKE11bHRpcGxlRmlsZXNUZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuZ2V0RGVzY3JpcHRvcigpLmdldEZpbGUoKSk7CisKKyAgICBhc3NlcnRGYWxzZSgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLmhhc0V4dGVuc2lvbigKKyAgICAgICAgTXVsdGlwbGVGaWxlc1Rlc3RQcm90by5leHRlbnNpb25XaXRoT3V0ZXIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbEZpZWxkV2l0aFJlcXVpcmVkU3ViZmllbGRzT3B0aW1pemVkRm9yU2l6ZSgpCisgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlID0KKyAgICAgICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKKworICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAorICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKQorICAgICAgICApLmJ1aWxkUGFydGlhbCgpOworICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKKworICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAorICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRYKDUpLmJ1aWxkUGFydGlhbCgpCisgICAgICAgICkuYnVpbGRQYXJ0aWFsKCk7CisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5pbml0aWFsaXplZEV4dGVuc2lvbkluT3B0aW1pemVkRm9yU2l6ZSgpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCk7CisgICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdE9wdGltaXplZEZvclNpemUudGVzdEV4dGVuc2lvbjIsCisgICAgICAgIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpKTsKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlciA9IFRlc3RPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKTsKKyAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0T3B0aW1pemVkRm9yU2l6ZS50ZXN0RXh0ZW5zaW9uMiwKKyAgICAgICAgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCkuc2V0WCgxMCkuYnVpbGRQYXJ0aWFsKCkpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRvQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRDb25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CQl9GSUVMRF9OVU1CRVIsIDEpOworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuT1BUSU9OQUxfSU5UMzJfRklFTERfTlVNQkVSLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMR1JPVVBfRklFTERfTlVNQkVSLCAxNik7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5PUFRJT05BTF9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIsIDE4KTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9FTlVNX0ZJRUxEX05VTUJFUiwgMjEpOworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLCAzMSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFREdST1VQX0ZJRUxEX05VTUJFUiwgNDYpOworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRklFTERfTlVNQkVSLCA0OCk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFRF9ORVNURURfRU5VTV9GSUVMRF9OVU1CRVIsIDUxKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZC5TSU5HTEVfRklFTERfTlVNQkVSLCAxMDAwKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQuTVVMVElfRklFTERfTlVNQkVSLCAxMDAxKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTEdST1VQX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE2KTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICBVbml0dGVzdFByb3RvLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE4KTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAyMSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfSU5UMzJfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMzEpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVER1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDYpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgIFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDgpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVEX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDUxKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlID0KKyAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2UgIT0gbnVsbCk7CisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEEoKSAhPSBudWxsKTsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0QSgpID09IG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgZXhwZWN0ZWQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgdHJ5IHsKKyAgICAgIG91dC53cml0ZU9iamVjdChleHBlY3RlZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7CisgICAgVGVzdEFsbFR5cGVzIGFjdHVhbCA9IChUZXN0QWxsVHlwZXMpIGluLnJlYWRPYmplY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZCA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgdHJ5IHsKKyAgICAgIG91dC53cml0ZU9iamVjdChleHBlY3RlZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7CisgICAgVGVzdEFsbFR5cGVzIGFjdHVhbCA9IChUZXN0QWxsVHlwZXMpIGluLnJlYWRPYmplY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW51bVZhbHVlcygpIHsKKyAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLmdldE51bWJlcigpLAorICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSX1ZBTFVFKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWi5nZXROdW1iZXIoKSwKKyAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaX1ZBTFVFKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTy5nZXROdW1iZXIoKSwKKyAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PX1ZBTFVFKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb25OZXN0ZWRFeHRlbnNpb25Jbml0aWFsaXphdGlvbigpIHsKKyAgICBhc3NlcnRUcnVlKE5vbk5lc3RlZEV4dGVuc2lvbi5ub25OZXN0ZWRFeHRlbnNpb24KKyAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgaW5zdGFuY2VvZiBNeU5vbk5lc3RlZEV4dGVuc2lvbik7CisgICAgYXNzZXJ0RXF1YWxzKCJub25OZXN0ZWRFeHRlbnNpb24iLAorICAgICAgICAgICAgICAgICBOb25OZXN0ZWRFeHRlbnNpb24ubm9uTmVzdGVkRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXROYW1lKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4dGVuc2lvbkluaXRpYWxpemF0aW9uKCkgeworICAgIGFzc2VydFRydWUoTXlOZXN0ZWRFeHRlbnNpb24ucmVjdXJzaXZlRXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgaW5zdGFuY2VvZiBNZXNzYWdlVG9CZUV4dGVuZGVkKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlY3Vyc2l2ZUV4dGVuc2lvbiIsCisgICAgICAgICAgICAgICAgIE15TmVzdGVkRXh0ZW5zaW9uLnJlY3Vyc2l2ZUV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0TmFtZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb25OZXN0ZWRFeHRlbnNpb25MaXRlSW5pdGlhbGl6YXRpb24oKSB7CisgICAgYXNzZXJ0VHJ1ZShOb25OZXN0ZWRFeHRlbnNpb25MaXRlLm5vbk5lc3RlZEV4dGVuc2lvbkxpdGUKKyAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgaW5zdGFuY2VvZiBNeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4dGVuc2lvbkxpdGVJbml0aWFsaXphdGlvbigpIHsKKyAgICBhc3NlcnRUcnVlKE15TmVzdGVkRXh0ZW5zaW9uTGl0ZS5yZWN1cnNpdmVFeHRlbnNpb25MaXRlCisgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIGluc3RhbmNlb2YgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEludmFsaWRhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHZW5lcmF0ZWRNZXNzYWdlLmVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCk7CisgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTWVzc2FnZTEgPQorICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBuZXN0ZWRNZXNzYWdlMiA9CisgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5idWlsZCgpOworCisgICAgLy8gU2V0IGFsbCB0aHJlZSBmbGF2b3JzIChlbnVtLCBwcmltaXRpdmUsIG1lc3NhZ2UgYW5kIHNpbmd1bGFyL3JlcGVhdGVkKQorICAgIC8vIGFuZCB2ZXJpZnkgbm8gaW52YWxpZGF0aW9ucyBmaXJlZAorICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSAoVGVzdEFsbFR5cGVzLkJ1aWxkZXIpCisgICAgICAgICgoR2VuZXJhdGVkTWVzc2FnZSkgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKS4KKyAgICAgICAgICAgIG5ld0J1aWxkZXJGb3JUeXBlKG1vY2tQYXJlbnQpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigxKTsKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMSk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShuZXN0ZWRNZXNzYWdlMSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICAvLyBOb3cgdGVsbCBpdCB3ZSB3YW50IGNoYW5nZXMgYW5kIG1ha2Ugc3VyZSBpdCdzIG9ubHkgZmlyZWQgb25jZQorICAgIC8vIEFuZCBkbyB0aGlzIGZvciBlYWNoIGZsYXZvcgorCisgICAgLy8gcHJpbWl0aXZlIHNpbmdsZQorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDIpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigzKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIGVudW0gc2luZ2xlCisgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICAvLyBtZXNzYWdlIHNpbmdsZQorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UobmVzdGVkTWVzc2FnZTIpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIHByaW1pdGl2ZSByZXBlYXRlZAorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDIpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigzKTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIGVudW0gcmVwZWF0ZWQKKyAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKKyAgICBhc3NlcnRFcXVhbHMoNSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIG1lc3NhZ2UgcmVwZWF0ZWQKKyAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UyKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShuZXN0ZWRNZXNzYWdlMSk7CisgICAgYXNzZXJ0RXF1YWxzKDYsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkYXRpb25zX0V4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSAoVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlcikKKyAgICAgICAgKChHZW5lcmF0ZWRNZXNzYWdlKSBUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSkuCisgICAgICAgICAgICBuZXdCdWlsZGVyRm9yVHlwZShtb2NrUGFyZW50KTsKKworICAgIGJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMSk7CisgICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAwLCAyKTsKKyAgICBidWlsZGVyLmNsZWFyRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbik7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICAvLyBOb3cgdGVsbCBpdCB3ZSB3YW50IGNoYW5nZXMgYW5kIG1ha2Ugc3VyZSBpdCdzIG9ubHkgZmlyZWQgb25jZQorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5hZGRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAyKTsKKyAgICBidWlsZGVyLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDMpOworICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworCisgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICBidWlsZGVyLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDAsIDQpOworICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMSwgNSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgIGJ1aWxkZXIuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uKTsKKyAgICBidWlsZGVyLmNsZWFyRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbik7CisgICAgYXNzZXJ0RXF1YWxzKDMsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QmFzZU1lc3NhZ2VPckJ1aWxkZXIoKSB7CisgICAgLy8gTW9zdGx5IGp1c3QgbWFrZXMgc3VyZSB0aGUgYmFzZSBpbnRlcmZhY2UgZXhpc3RzIGFuZCBoYXMgc29tZSBtZXRob2RzLgorICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXIgYnVpbGRlckFzSW50ZXJmYWNlID0gKFRlc3RBbGxUeXBlc09yQnVpbGRlcikgYnVpbGRlcjsKKyAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXIgbWVzc2FnZUFzSW50ZXJmYWNlID0gKFRlc3RBbGxUeXBlc09yQnVpbGRlcikgbWVzc2FnZTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbWVzc2FnZUFzSW50ZXJmYWNlLmdldERlZmF1bHRCb29sKCksCisgICAgICAgIG1lc3NhZ2VBc0ludGVyZmFjZS5nZXREZWZhdWx0Qm9vbCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG1lc3NhZ2VBc0ludGVyZmFjZS5nZXRPcHRpb25hbERvdWJsZSgpLAorICAgICAgICBtZXNzYWdlQXNJbnRlcmZhY2UuZ2V0T3B0aW9uYWxEb3VibGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZU9yQnVpbGRlckdldHRlcnMoKSB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisKKyAgICAvLyBzaW5nbGUgZmllbGRzCisgICAgYXNzZXJ0U2FtZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKKyAgICAgICAgYnVpbGRlci5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKCkpOworICAgIEZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9CisgICAgICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZUJ1aWxkZXIoKTsKKyAgICBhc3NlcnRTYW1lKHN1YkJ1aWxkZXIsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigpKTsKKworICAgIC8vIHJlcGVhdGVkIGZpZWxkcworICAgIEZvcmVpZ25NZXNzYWdlIG0wID0gRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpOworICAgIEZvcmVpZ25NZXNzYWdlIG0xID0gRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpOworICAgIEZvcmVpZ25NZXNzYWdlIG0yID0gRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShtMCk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKG0xKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UobTIpOworICAgIGFzc2VydFNhbWUobTAsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigwKSk7CisgICAgYXNzZXJ0U2FtZShtMSwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDEpKTsKKyAgICBhc3NlcnRTYW1lKG0yLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMikpOworICAgIEZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYjAgPSBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VCdWlsZGVyKDApOworICAgIEZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYjEgPSBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VCdWlsZGVyKDEpOworICAgIGFzc2VydFNhbWUoYjAsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigwKSk7CisgICAgYXNzZXJ0U2FtZShiMSwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDEpKTsKKyAgICBhc3NlcnRTYW1lKG0yLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMikpOworCisgICAgTGlzdDw/IGV4dGVuZHMgRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXI+IG1lc3NhZ2VPckJ1aWxkZXJMaXN0ID0KKyAgICAgICAgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyTGlzdCgpOworICAgIGFzc2VydFNhbWUoYjAsIG1lc3NhZ2VPckJ1aWxkZXJMaXN0LmdldCgwKSk7CisgICAgYXNzZXJ0U2FtZShiMSwgbWVzc2FnZU9yQnVpbGRlckxpc3QuZ2V0KDEpKTsKKyAgICBhc3NlcnRTYW1lKG0yLCBtZXNzYWdlT3JCdWlsZGVyTGlzdC5nZXQoMikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEdldEZpZWxkQnVpbGRlcigpIHsKKyAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOworCisgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA9CisgICAgICAgIGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOworICAgIEZpZWxkRGVzY3JpcHRvciBmb3JlaWduRmllbGREZXNjcmlwdG9yID0KKyAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpOworICAgIEZpZWxkRGVzY3JpcHRvciBpbXBvcnRGaWVsZERlc2NyaXB0b3IgPQorICAgICAgICBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKTsKKworICAgIC8vIE11dGF0ZSB0aGUgbWVzc2FnZSB3aXRoIG5ldyBmaWVsZCBidWlsZGVyCisgICAgLy8gTXV0YXRlIG5lc3RlZCBtZXNzYWdlCisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlcjEgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIE1lc3NhZ2UuQnVpbGRlciBmaWVsZEJ1aWxkZXIxID0gYnVpbGRlcjEubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkRGVzY3JpcHRvcikKKyAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgYnVpbGRlcjEuZ2V0RmllbGQoZmllbGREZXNjcmlwdG9yKSk7CisgICAgRmllbGREZXNjcmlwdG9yIHN1YkZpZWxkRGVzY3JpcHRvcjEgPQorICAgICAgICBmaWVsZEJ1aWxkZXIxLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJiYiIpOworICAgIGZpZWxkQnVpbGRlcjEuc2V0RmllbGQoc3ViRmllbGREZXNjcmlwdG9yMSwgMSk7CisgICAgYnVpbGRlcjEuc2V0RmllbGQoZmllbGREZXNjcmlwdG9yLCBmaWVsZEJ1aWxkZXIxLmJ1aWxkKCkpOworCisgICAgLy8gTXV0YXRlIGZvcmVpZ24gbWVzc2FnZQorICAgIE1lc3NhZ2UuQnVpbGRlciBmb3JlaWduRmllbGRCdWlsZGVyMSA9IGJ1aWxkZXIxLm5ld0J1aWxkZXJGb3JGaWVsZCgKKyAgICAgICAgZm9yZWlnbkZpZWxkRGVzY3JpcHRvcikKKyAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgYnVpbGRlcjEuZ2V0RmllbGQoZm9yZWlnbkZpZWxkRGVzY3JpcHRvcikpOworICAgIEZpZWxkRGVzY3JpcHRvciBzdWJGb3JlaWduRmllbGREZXNjcmlwdG9yMSA9CisgICAgICAgIGZvcmVpZ25GaWVsZEJ1aWxkZXIxLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJjIik7CisgICAgZm9yZWlnbkZpZWxkQnVpbGRlcjEuc2V0RmllbGQoc3ViRm9yZWlnbkZpZWxkRGVzY3JpcHRvcjEsIDIpOworICAgIGJ1aWxkZXIxLnNldEZpZWxkKGZvcmVpZ25GaWVsZERlc2NyaXB0b3IsIGZvcmVpZ25GaWVsZEJ1aWxkZXIxLmJ1aWxkKCkpOworCisgICAgLy8gTXV0YXRlIGltcG9ydCBtZXNzYWdlCisgICAgTWVzc2FnZS5CdWlsZGVyIGltcG9ydEZpZWxkQnVpbGRlcjEgPSBidWlsZGVyMS5uZXdCdWlsZGVyRm9yRmllbGQoCisgICAgICAgIGltcG9ydEZpZWxkRGVzY3JpcHRvcikKKyAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgYnVpbGRlcjEuZ2V0RmllbGQoaW1wb3J0RmllbGREZXNjcmlwdG9yKSk7CisgICAgRmllbGREZXNjcmlwdG9yIHN1YkltcG9ydEZpZWxkRGVzY3JpcHRvcjEgPQorICAgICAgICBpbXBvcnRGaWVsZEJ1aWxkZXIxLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJkIik7CisgICAgaW1wb3J0RmllbGRCdWlsZGVyMS5zZXRGaWVsZChzdWJJbXBvcnRGaWVsZERlc2NyaXB0b3IxLCAzKTsKKyAgICBidWlsZGVyMS5zZXRGaWVsZChpbXBvcnRGaWVsZERlc2NyaXB0b3IsIGltcG9ydEZpZWxkQnVpbGRlcjEuYnVpbGQoKSk7CisKKyAgICBNZXNzYWdlIG5ld01lc3NhZ2UxID0gYnVpbGRlcjEuYnVpbGQoKTsKKworICAgIC8vIE11dGF0ZSB0aGUgbWVzc2FnZSB3aXRoIGV4aXN0aW5nIGZpZWxkIGJ1aWxkZXIKKyAgICAvLyBNdXRhdGUgbmVzdGVkIG1lc3NhZ2UKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyMiA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgTWVzc2FnZS5CdWlsZGVyIGZpZWxkQnVpbGRlcjIgPSBidWlsZGVyMi5nZXRGaWVsZEJ1aWxkZXIoZmllbGREZXNjcmlwdG9yKTsKKyAgICBGaWVsZERlc2NyaXB0b3Igc3ViRmllbGREZXNjcmlwdG9yMiA9CisgICAgICAgIGZpZWxkQnVpbGRlcjIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUoImJiIik7CisgICAgZmllbGRCdWlsZGVyMi5zZXRGaWVsZChzdWJGaWVsZERlc2NyaXB0b3IyLCAxKTsKKyAgICBidWlsZGVyMi5zZXRGaWVsZChmaWVsZERlc2NyaXB0b3IsIGZpZWxkQnVpbGRlcjIuYnVpbGQoKSk7CisKKyAgICAvLyBNdXRhdGUgZm9yZWlnbiBtZXNzYWdlCisgICAgTWVzc2FnZS5CdWlsZGVyIGZvcmVpZ25GaWVsZEJ1aWxkZXIyID0gYnVpbGRlcjIubmV3QnVpbGRlckZvckZpZWxkKAorICAgICAgICBmb3JlaWduRmllbGREZXNjcmlwdG9yKQorICAgICAgICAubWVyZ2VGcm9tKChNZXNzYWdlKSBidWlsZGVyMi5nZXRGaWVsZChmb3JlaWduRmllbGREZXNjcmlwdG9yKSk7CisgICAgRmllbGREZXNjcmlwdG9yIHN1YkZvcmVpZ25GaWVsZERlc2NyaXB0b3IyID0KKyAgICAgICAgZm9yZWlnbkZpZWxkQnVpbGRlcjIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUoImMiKTsKKyAgICBmb3JlaWduRmllbGRCdWlsZGVyMi5zZXRGaWVsZChzdWJGb3JlaWduRmllbGREZXNjcmlwdG9yMiwgMik7CisgICAgYnVpbGRlcjIuc2V0RmllbGQoZm9yZWlnbkZpZWxkRGVzY3JpcHRvciwgZm9yZWlnbkZpZWxkQnVpbGRlcjIuYnVpbGQoKSk7CisKKyAgICAvLyBNdXRhdGUgaW1wb3J0IG1lc3NhZ2UKKyAgICBNZXNzYWdlLkJ1aWxkZXIgaW1wb3J0RmllbGRCdWlsZGVyMiA9IGJ1aWxkZXIyLm5ld0J1aWxkZXJGb3JGaWVsZCgKKyAgICAgICAgaW1wb3J0RmllbGREZXNjcmlwdG9yKQorICAgICAgICAubWVyZ2VGcm9tKChNZXNzYWdlKSBidWlsZGVyMi5nZXRGaWVsZChpbXBvcnRGaWVsZERlc2NyaXB0b3IpKTsKKyAgICBGaWVsZERlc2NyaXB0b3Igc3ViSW1wb3J0RmllbGREZXNjcmlwdG9yMiA9CisgICAgICAgIGltcG9ydEZpZWxkQnVpbGRlcjIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUoImQiKTsKKyAgICBpbXBvcnRGaWVsZEJ1aWxkZXIyLnNldEZpZWxkKHN1YkltcG9ydEZpZWxkRGVzY3JpcHRvcjIsIDMpOworICAgIGJ1aWxkZXIyLnNldEZpZWxkKGltcG9ydEZpZWxkRGVzY3JpcHRvciwgaW1wb3J0RmllbGRCdWlsZGVyMi5idWlsZCgpKTsKKworICAgIE1lc3NhZ2UgbmV3TWVzc2FnZTIgPSBidWlsZGVyMi5idWlsZCgpOworCisgICAgLy8gVGhlc2UgdHdvIG1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KKyAgICBhc3NlcnRFcXVhbHMobmV3TWVzc2FnZTEsIG5ld01lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWVsZEJ1aWxkZXJXaXRoSW5pdGlhbGl6ZWRWYWx1ZSgpIHsKKyAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOworICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgPQorICAgICAgICBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKworICAgIC8vIEJlZm9yZSBzZXR0aW5nIGZpZWxkLCBidWlsZGVyIGlzIGluaXRpYWxpemVkIGJ5IGRlZmF1bHQgdmFsdWUuIAorICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIE5lc3RlZE1lc3NhZ2UuQnVpbGRlciBmaWVsZEJ1aWxkZXIgPQorICAgICAgICAoTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBidWlsZGVyLmdldEZpZWxkQnVpbGRlcihmaWVsZERlc2NyaXB0b3IpOworICAgIGFzc2VydEVxdWFscygwLCBmaWVsZEJ1aWxkZXIuZ2V0QmIoKSk7CisKKyAgICAvLyBTZXR0aW5nIGZpZWxkIHZhbHVlIHdpdGggbmV3IGZpZWxkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgTmVzdGVkTWVzc2FnZS5CdWlsZGVyIG5ld0ZpZWxkQnVpbGRlciA9CisgICAgICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlQnVpbGRlcigpOworICAgIG5ld0ZpZWxkQnVpbGRlci5zZXRCYigyKTsKKyAgICAvLyBUaGVuIGdldCB0aGUgZmllbGQgYnVpbGRlciBpbnN0YW5jZSBieSBnZXRGaWVsZEJ1aWxkZXIoKS4KKyAgICBmaWVsZEJ1aWxkZXIgPQorICAgICAgICAoTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBidWlsZGVyLmdldEZpZWxkQnVpbGRlcihmaWVsZERlc2NyaXB0b3IpOworICAgIC8vIEl0IHNob3VsZCBjb250YWluIG5ldyB2YWx1ZS4KKyAgICBhc3NlcnRFcXVhbHMoMiwgZmllbGRCdWlsZGVyLmdldEJiKCkpOworICAgIC8vIFRoZXNlIHR3byBidWlsZGVyIHNob3VsZCBiZSBlcXVhbC4KKyAgICBhc3NlcnRTYW1lKGZpZWxkQnVpbGRlciwgbmV3RmllbGRCdWlsZGVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWVsZEJ1aWxkZXJOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7CisgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICB0cnkgeworICAgICAgYnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIikpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoCisgICAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9lbnVtIikpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIikpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoCisgICAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX25lc3RlZF9lbnVtIikpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoCisgICAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Jc1ZhbGlkVXRmOFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSXNWYWxpZFV0ZjhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwNGI2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSXNWYWxpZFV0ZjhUZXN0LmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSXNWYWxpZFV0ZjhUZXN0VXRpbC5TaGFyZDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0cyBjYXNlcyBmb3Ige0BsaW5rIEJ5dGVTdHJpbmcjaXNWYWxpZFV0ZjgoKX0uIFRoaXMgaW5jbHVkZXMgdGhyZWUKKyAqIGJydXRlIGZvcmNlIHRlc3RzIHRoYXQgYWN0dWFsbHkgdGVzdCBldmVyeSBwZXJtdXRhdGlvbiBvZiBvbmUgYnl0ZSwgdHdvIGJ5dGUsCisgKiBhbmQgdGhyZWUgYnl0ZSBzZXF1ZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlIG1ldGhvZCBwcm9kdWNlcyB0aGUgcmlnaHQgcmVzdWx0CisgKiBmb3IgZXZlcnkgcG9zc2libGUgYnl0ZSBlbmNvZGluZyB3aGVyZSAicmlnaHQiIG1lYW5zIGl0J3MgY29uc2lzdGVudCB3aXRoCisgKiBqYXZhJ3MgVVRGLTggc3RyaW5nIGVuY29kaW5nL2RlY29kaW5nIHN1Y2ggdGhhdCB0aGUgbWV0aG9kIHJldHVybnMgdHJ1ZSBmb3IKKyAqIGFueSBzZXF1ZW5jZSB0aGF0IHdpbGwgcm91bmQgdHJpcCB3aGVuIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhbmQgdGhlbiBiYWNrIHRvCisgKiBieXRlcyBhbmQgd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueSBzZXF1ZW5jZSB0aGF0IHdpbGwgbm90IHJvdW5kIHRyaXAuCisgKiBTZWUgYWxzbyB7QGxpbmsgSXNWYWxpZFV0ZjhGb3VyQnl0ZVRlc3R9LiBJdCBhbHNvIGluY2x1ZGVzIHNvbWUKKyAqIG90aGVyIG1vcmUgdGFyZ2V0ZWQgdGVzdHMuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKiBAYXV0aG9yIG1hcnRpbnJiQGdvb2dsZS5jb20gKE1hcnRpbiBCdWNoaG9seikKKyAqLworcHVibGljIGNsYXNzIElzVmFsaWRVdGY4VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAvKioKKyAgICogVGVzdHMgdGhhdCByb3VuZCB0cmlwcGluZyBvZiBhbGwgdHdvIGJ5dGUgcGVybXV0YXRpb25zIHdvcmsuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZFV0ZjhfMUJ5dGUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgSXNWYWxpZFV0ZjhUZXN0VXRpbC50ZXN0Qnl0ZXMoMSwKKyAgICAgICAgSXNWYWxpZFV0ZjhUZXN0VXRpbC5FWFBFQ1RFRF9PTkVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCk7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgdGhhdCByb3VuZCB0cmlwcGluZyBvZiBhbGwgdHdvIGJ5dGUgcGVybXV0YXRpb25zIHdvcmsuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZFV0ZjhfMkJ5dGVzKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIElzVmFsaWRVdGY4VGVzdFV0aWwudGVzdEJ5dGVzKDIsCisgICAgICAgIElzVmFsaWRVdGY4VGVzdFV0aWwuRVhQRUNURURfVFdPX0JZVEVfUk9VTkRUUklQUEFCTEVfQ09VTlQpOworICB9CisKKyAgLyoqCisgICAqIFRlc3RzIHRoYXQgcm91bmQgdHJpcHBpbmcgb2YgYWxsIHRocmVlIGJ5dGUgcGVybXV0YXRpb25zIHdvcmsuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZFV0ZjhfM0J5dGVzKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIElzVmFsaWRVdGY4VGVzdFV0aWwudGVzdEJ5dGVzKDMsCisgICAgICAgIElzVmFsaWRVdGY4VGVzdFV0aWwuRVhQRUNURURfVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCk7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgdGhhdCByb3VuZCB0cmlwcGluZyBvZiBhIHNhbXBsZSBvZiBmb3VyIGJ5dGUgcGVybXV0YXRpb25zIHdvcmsuCisgICAqIEFsbCBwZXJtdXRhdGlvbnMgYXJlIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIHRvIHRlc3QgZm9yIGF1dG9tYXRlZCBydW5zOworICAgKiB7QGxpbmsgSXNWYWxpZFV0ZjhGb3VyQnl0ZVRlc3R9IGlzIHVzZWQgZm9yIGZ1bGwgY292ZXJhZ2UuIFRoaXMgbWV0aG9kCisgICAqIHRlc3RzIHNwZWNpZmljIGZvdXItYnl0ZSBjYXNlcy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RJc1ZhbGlkVXRmOF80Qnl0ZXNTYW1wbGVzKCkKKyAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAvLyBWYWxpZCA0IGJ5dGUuCisgICAgYXNzZXJ0VmFsaWRVdGY4KDB4RjAsIDB4QTQsIDB4QUQsIDB4QTIpOworCisgICAgLy8gQmFkIHRyYWlsaW5nIGJ5dGVzCisgICAgYXNzZXJ0SW52YWxpZFV0ZjgoMHhGMCwgMHhBNCwgMHhBRCwgMHg3Rik7CisgICAgYXNzZXJ0SW52YWxpZFV0ZjgoMHhGMCwgMHhBNCwgMHhBRCwgMHhDMCk7CisKKyAgICAvLyBTcGVjaWFsIGNhc2VzIGZvciBieXRlMgorICAgIGFzc2VydEludmFsaWRVdGY4KDB4RjAsIDB4OEYsIDB4QUQsIDB4QTIpOworICAgIGFzc2VydEludmFsaWRVdGY4KDB4RjQsIDB4OTAsIDB4QUQsIDB4QTIpOworICB9CisKKyAgLyoqCisgICAqIFRlc3RzIHNvbWUgaGFyZC1jb2RlZCB0ZXN0IGNhc2VzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFNvbWVTZXF1ZW5jZXMoKSB7CisgICAgLy8gRW1wdHkKKyAgICBhc3NlcnRUcnVlKGFzQnl0ZXMoIiIpLmlzVmFsaWRVdGY4KCkpOworCisgICAgLy8gT25lLWJ5dGUgY2hhcmFjdGVycywgaW5jbHVkaW5nIGNvbnRyb2wgY2hhcmFjdGVycworICAgIGFzc2VydFRydWUoYXNCeXRlcygiXHUwMDAwYWJjXHUwMDdmIikuaXNWYWxpZFV0ZjgoKSk7CisKKyAgICAvLyBUd28tYnl0ZSBjaGFyYWN0ZXJzCisgICAgYXNzZXJ0VHJ1ZShhc0J5dGVzKCJcdTAwYTJcdTAwYTIiKS5pc1ZhbGlkVXRmOCgpKTsKKworICAgIC8vIFRocmVlLWJ5dGUgY2hhcmFjdGVycworICAgIGFzc2VydFRydWUoYXNCeXRlcygiXHUwMjBhY1x1MDIwYWMiKS5pc1ZhbGlkVXRmOCgpKTsKKworICAgIC8vIEZvdXItYnl0ZSBjaGFyYWN0ZXJzCisgICAgYXNzZXJ0VHJ1ZShhc0J5dGVzKCJcdTAyNEI2Mlx1MDI0QjYyIikuaXNWYWxpZFV0ZjgoKSk7CisKKyAgICAvLyBNaXhlZCBzdHJpbmcKKyAgICBhc3NlcnRUcnVlKAorICAgICAgICBhc0J5dGVzKCJhXHUwMjBhY1x1MDBhMmJcXHUwMjRCNjJ1MDIwYWNjXHUwMGEyZGVcdTAyNEI2MiIpCisgICAgICAgIC5pc1ZhbGlkVXRmOCgpKTsKKworICAgIC8vIE5vdCBhIHZhbGlkIHN0cmluZworICAgIGFzc2VydEludmFsaWRVdGY4KC0xLCAwLCAtMSwgMCk7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSB0b0J5dGVBcnJheShpbnQuLi4gYnl0ZXMpIHsKKyAgICBieXRlW10gcmVhbEJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXMubGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICByZWFsQnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNbaV07CisgICAgfQorICAgIHJldHVybiByZWFsQnl0ZXM7CisgIH0KKworICBwcml2YXRlIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKGludC4uLiBieXRlcykgeworICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKHRvQnl0ZUFycmF5KGJ5dGVzKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0VmFsaWRVdGY4KGludFtdIGJ5dGVzLCBib29sZWFuIG5vdCkgeworICAgIGJ5dGVbXSByZWFsQnl0ZXMgPSB0b0J5dGVBcnJheShieXRlcyk7CisgICAgYXNzZXJ0VHJ1ZShub3QgXiBVdGY4LmlzVmFsaWRVdGY4KHJlYWxCeXRlcykpOworICAgIGFzc2VydFRydWUobm90IF4gVXRmOC5pc1ZhbGlkVXRmOChyZWFsQnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCkpOworICAgIEJ5dGVTdHJpbmcgbGl0ID0gQnl0ZVN0cmluZy5jb3B5RnJvbShyZWFsQnl0ZXMpOworICAgIEJ5dGVTdHJpbmcgc3ViID0gbGl0LnN1YnN0cmluZygwLCBieXRlcy5sZW5ndGgpOworICAgIGFzc2VydFRydWUobm90IF4gbGl0LmlzVmFsaWRVdGY4KCkpOworICAgIGFzc2VydFRydWUobm90IF4gc3ViLmlzVmFsaWRVdGY4KCkpOworICAgIEJ5dGVTdHJpbmdbXSByb3BlcyA9IHsKKyAgICAgIFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdChCeXRlU3RyaW5nLkVNUFRZLCBsaXQpLAorICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KEJ5dGVTdHJpbmcuRU1QVFksIHN1YiksCisgICAgICBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3QobGl0LCBCeXRlU3RyaW5nLkVNUFRZKSwKKyAgICAgIFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdChzdWIsIEJ5dGVTdHJpbmcuRU1QVFkpLAorICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KHN1YiwgbGl0KQorICAgIH07CisgICAgZm9yIChCeXRlU3RyaW5nIHJvcGUgOiByb3BlcykgeworICAgICAgYXNzZXJ0VHJ1ZShub3QgXiByb3BlLmlzVmFsaWRVdGY4KCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZFV0ZjgoaW50Li4uIGJ5dGVzKSB7CisgICAgYXNzZXJ0VmFsaWRVdGY4KGJ5dGVzLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0SW52YWxpZFV0ZjgoaW50Li4uIGJ5dGVzKSB7CisgICAgYXNzZXJ0VmFsaWRVdGY4KGJ5dGVzLCB0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgYXNCeXRlcyhTdHJpbmcgcykgeworICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTaGFyZHNIYXZlRXhwZWN0ZWRSb3VuZFRyaXBwYWJsZXMoKSB7CisgICAgLy8gQSBzYW5pdHkgY2hlY2suCisgICAgaW50IGFjdHVhbCA9IDA7CisgICAgZm9yIChTaGFyZCBzaGFyZCA6IElzVmFsaWRVdGY4VGVzdFV0aWwuRk9VUl9CWVRFX1NIQVJEUykgeworICAgICAgYWN0dWFsICs9IHNoYXJkLmV4cGVjdGVkOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoSXNWYWxpZFV0ZjhUZXN0VXRpbC5FWFBFQ1RFRF9GT1VSX0JZVEVfUk9VTkRUUklQUEFCTEVfQ09VTlQsCisgICAgICAgIGFjdHVhbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSXNWYWxpZFV0ZjhUZXN0VXRpbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Jc1ZhbGlkVXRmOFRlc3RVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiM2Q1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSXNWYWxpZFV0ZjhUZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsNDIxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC4qOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CisKKy8qKgorICogU2hhcmVkIHRlc3RpbmcgY29kZSBmb3Ige0BsaW5rIElzVmFsaWRVdGY4VGVzdH0gYW5kCisgKiB7QGxpbmsgSXNWYWxpZFV0ZjhGb3VyQnl0ZVRlc3R9LgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICogQGF1dGhvciBtYXJ0aW5yYkBnb29nbGUuY29tIChNYXJ0aW4gQnVjaGhvbHopCisgKi8KK2NsYXNzIElzVmFsaWRVdGY4VGVzdFV0aWwgeworICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigKKyAgICAgIElzVmFsaWRVdGY4VGVzdFV0aWwuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAvLyAxMjggLSBbY2hhcnMgMHgwMDAwIHRvIDB4MDA3Zl0KKyAgc3RhdGljIGxvbmcgT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyA9IDB4MDA3ZiAtIDB4MDAwMCArIDE7CisKKyAgLy8gMTI4CisgIHN0YXRpYyBsb25nIEVYUEVDVEVEX09ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UID0KKyAgICAgIE9ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlM7CisKKyAgLy8gMTkyMCBbY2hhcnMgMHgwMDgwIHRvIDB4MDdGRl0KKyAgc3RhdGljIGxvbmcgVFdPX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyA9IDB4MDdGRiAtIDB4MDA4MCArIDE7CisKKyAgLy8gMTgsMzA0CisgIHN0YXRpYyBsb25nIEVYUEVDVEVEX1RXT19CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UID0KKyAgICAgIC8vIEJvdGggYnl0ZXMgYXJlIG9uZSBieXRlIGNoYXJhY3RlcnMKKyAgICAgIChsb25nKSBNYXRoLnBvdyhFWFBFQ1RFRF9PTkVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCwgMikgKworICAgICAgLy8gVGhlIHBvc3NpYmxlIG51bWJlciBvZiB0d28gYnl0ZSBjaGFyYWN0ZXJzCisgICAgICBUV09fQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTOworCisgIC8vIDIwNDgKKyAgc3RhdGljIGxvbmcgVEhSRUVfQllURV9TVVJST0dBVEVTID0gMiAqIDEwMjQ7CisKKyAgLy8gNjEsNDQwIFtjaGFycyAweDA4MDAgdG8gMHhGRkZGLCBtaW51cyBzdXJyb2dhdGVzXQorICBzdGF0aWMgbG9uZyBUSFJFRV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgPQorICAgICAgMHhGRkZGIC0gMHgwODAwICsgMSAtIFRIUkVFX0JZVEVfU1VSUk9HQVRFUzsKKworICAvLyAyLDY1MCwxMTIKKyAgc3RhdGljIGxvbmcgRVhQRUNURURfVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCA9CisgICAgICAvLyBBbGwgb25lIGJ5dGUgY2hhcmFjdGVycworICAgICAgKGxvbmcpIE1hdGgucG93KEVYUEVDVEVEX09ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5ULCAzKSArCisgICAgICAvLyBPbmUgdHdvIGJ5dGUgY2hhcmFjdGVyIGFuZCBhIG9uZSBieXRlIGNoYXJhY3RlcgorICAgICAgMiAqIFRXT19CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgKgorICAgICAgICAgIE9ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgKworICAgICAgIC8vIFRocmVlIGJ5dGUgY2hhcmFjdGVycworICAgICAgVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTOworCisgIC8vIDEsMDQ4LDU3NiBbY2hhcnMgMHgxMDAwMEwgdG8gMHgxMEZGRkZdCisgIHN0YXRpYyBsb25nIEZPVVJfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTID0gMHgxMEZGRkYgLSAweDEwMDAwTCArIDE7CisKKyAgLy8gMjg5LDU3MSw4MzkKKyAgc3RhdGljIGxvbmcgRVhQRUNURURfRk9VUl9CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UID0KKyAgICAgIC8vIEFsbCBvbmUgYnl0ZSBjaGFyYWN0ZXJzCisgICAgICAobG9uZykgTWF0aC5wb3coRVhQRUNURURfT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ09VTlQsIDQpICsKKyAgICAgIC8vIE9uZSBhbmQgdGhyZWUgYnl0ZSBjaGFyYWN0ZXJzCisgICAgICAyICogVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTICoKKyAgICAgICAgICBPTkVfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTICsKKyAgICAgIC8vIFR3byB0d28gYnl0ZSBjaGFyYWN0ZXJzCisgICAgICBUV09fQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTICogVFdPX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyArCisgICAgICAvLyBQZXJtdXRhdGlvbnMgb2Ygb25lIGFuZCB0d28gYnl0ZSBjaGFyYWN0ZXJzCisgICAgICAzICogVFdPX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyAqCisgICAgICAgICAgT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyAqCisgICAgICAgICAgT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyArCisgICAgICAvLyBGb3VyIGJ5dGUgY2hhcmFjdGVycworICAgICAgRk9VUl9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlM7CisKKyAgc3RhdGljIGNsYXNzIFNoYXJkIHsKKyAgICBmaW5hbCBsb25nIGluZGV4OworICAgIGZpbmFsIGxvbmcgc3RhcnQ7CisgICAgZmluYWwgbG9uZyBsaW07CisgICAgZmluYWwgbG9uZyBleHBlY3RlZDsKKworCisgICAgcHVibGljIFNoYXJkKGxvbmcgaW5kZXgsIGxvbmcgc3RhcnQsIGxvbmcgbGltLCBsb25nIGV4cGVjdGVkKSB7CisgICAgICBhc3NlcnRUcnVlKHN0YXJ0IDwgbGltKTsKKyAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICAgIHRoaXMubGltID0gbGltOworICAgICAgdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBmaW5hbCBsb25nW10gRk9VUl9CWVRFX1NIQVJEU19FWFBFQ1RFRF9ST1VOVFJJUFBBQkxFUyA9CisgICAgICBnZW5lcmF0ZUZvdXJCeXRlU2hhcmRzRXhwZWN0ZWRSdW5uYWJsZXMoKTsKKworICBwcml2YXRlIHN0YXRpYyBsb25nW10gZ2VuZXJhdGVGb3VyQnl0ZVNoYXJkc0V4cGVjdGVkUnVubmFibGVzKCkgeworICAgIGxvbmdbXSBleHBlY3RlZCA9IG5ldyBsb25nWzEyOF07CisKKyAgICAvLyAwLTYzIGFyZSBhbGwgNTMwMDIyNAorICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDYzOyBpKyspIHsKKyAgICAgIGV4cGVjdGVkW2ldID0gNTMwMDIyNDsKKyAgICB9CisKKyAgICAvLyA5Ny0xMTEgYXJlIGFsbCAyMzQyOTEyCisgICAgZm9yIChpbnQgaSA9IDk3OyBpIDw9IDExMTsgaSsrKSB7CisgICAgIGV4cGVjdGVkW2ldID0gMjM0MjkxMjsKKyAgICB9CisKKyAgICAvLyAxMTMtMTE3IGFyZSBhbGwgMTA0ODU3NgorICAgIGZvciAoaW50IGkgPSAxMTM7IGkgPD0gMTE3OyBpKyspIHsKKyAgICAgIGV4cGVjdGVkW2ldID0gMTA0ODU3NjsKKyAgICB9CisKKyAgICAvLyBPbmUgb2ZmcworICAgIGV4cGVjdGVkWzExMl0gPSA3ODY0MzI7CisgICAgZXhwZWN0ZWRbMTE4XSA9IDc4NjQzMjsKKyAgICBleHBlY3RlZFsxMTldID0gMTA0ODU3NjsKKyAgICBleHBlY3RlZFsxMjBdID0gNDU4NzUyOworICAgIGV4cGVjdGVkWzEyMV0gPSA1MjQyODg7CisgICAgZXhwZWN0ZWRbMTIyXSA9IDY1NTM2OworCisgICAgLy8gQW55dGhpbmcgbm90IGFzc2lnbmVkIHdhcyB0aGUgZGVmYXVsdCAwLgorICAgIHJldHVybiBleHBlY3RlZDsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBMaXN0PFNoYXJkPiBGT1VSX0JZVEVfU0hBUkRTID0gZ2VuZXJhdGVGb3VyQnl0ZVNoYXJkcygKKyAgICAgIDEyOCwgRk9VUl9CWVRFX1NIQVJEU19FWFBFQ1RFRF9ST1VOVFJJUFBBQkxFUyk7CisKKworICBwcml2YXRlIHN0YXRpYyBMaXN0PFNoYXJkPiBnZW5lcmF0ZUZvdXJCeXRlU2hhcmRzKAorICAgICAgaW50IG51bVNoYXJkcywgbG9uZ1tdIGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKG51bVNoYXJkcywgZXhwZWN0ZWQubGVuZ3RoKTsKKyAgICBMaXN0PFNoYXJkPiBzaGFyZHMgPSBuZXcgQXJyYXlMaXN0PFNoYXJkPihudW1TaGFyZHMpOworICAgIGxvbmcgTElNID0gMUwgPDwgMzI7CisgICAgbG9uZyBpbmNyZW1lbnQgPSBMSU0gLyBudW1TaGFyZHM7CisgICAgYXNzZXJ0VHJ1ZShMSU0gJSBudW1TaGFyZHMgPT0gMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaGFyZHM7IGkrKykgeworICAgICAgc2hhcmRzLmFkZChuZXcgU2hhcmQoaSwKKyAgICAgICAgICBpbmNyZW1lbnQgKiBpLAorICAgICAgICAgIGluY3JlbWVudCAqIChpICsgMSksCisgICAgICAgICAgZXhwZWN0ZWRbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIHNoYXJkczsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgdG8gcnVuIHRoZSBsb29wIHRvIHRlc3QgYWxsIHRoZSBwZXJtdXRhdGlvbnMgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICogc3BlY2lmaWVkLgorICAgKgorICAgKiBAcGFyYW0gbnVtQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnl0ZSBhcnJheQorICAgKiBAcGFyYW0gZXhwZWN0ZWRDb3VudCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHJvdW5kdHJpcHBhYmxlIHBlcm11dGF0aW9ucworICAgKi8KKyAgc3RhdGljIHZvaWQgdGVzdEJ5dGVzKGludCBudW1CeXRlcywgbG9uZyBleHBlY3RlZENvdW50KQorICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHRlc3RCeXRlcyhudW1CeXRlcywgZXhwZWN0ZWRDb3VudCwgMCwgLTEpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciB0byBydW4gdGhlIGxvb3AgdG8gdGVzdCBhbGwgdGhlIHBlcm11dGF0aW9ucyBmb3IgdGhlIG51bWJlciBvZiBieXRlcworICAgKiBzcGVjaWZpZWQuIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdG8gZ2V0IHRoZSBsb29wIHRvIHN0YXJ0CisgICAqIGF0IGEgY2VydGFpbiBjaGFyYWN0ZXIuCisgICAqCisgICAqIEBwYXJhbSBudW1CeXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBieXRlIGFycmF5CisgICAqIEBwYXJhbSBleHBlY3RlZENvdW50IHRoZSBleHBlY3RlZCBudW1iZXIgb2Ygcm91bmR0cmlwcGFibGUgcGVybXV0YXRpb25zCisgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgYnl0ZXMgZW5jb2RlZCBhcyBhIGxvbmcgYXMgYmlnLWVuZGlhbgorICAgKiBAcGFyYW0gbGltIHRoZSBsaW1pdCBvZiBieXRlcyB0byBwcm9jZXNzIGVuY29kZWQgYXMgYSBsb25nIGFzIGJpZy1lbmRpYW4sCisgICAqICAgICBvciAtMSB0byBtZWFuIHRoZSBtYXggbGltaXQgZm9yIG51bUJ5dGVzCisgICAqLworICBzdGF0aWMgdm9pZCB0ZXN0Qnl0ZXMoaW50IG51bUJ5dGVzLCBsb25nIGV4cGVjdGVkQ291bnQsIGxvbmcgc3RhcnQsIGxvbmcgbGltKQorICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbnVtQnl0ZXNdOworCisgICAgaWYgKGxpbSA9PSAtMSkgeworICAgICAgbGltID0gMUwgPDwgKG51bUJ5dGVzICogOCk7CisgICAgfQorICAgIGxvbmcgY291bnQgPSAwOworICAgIGxvbmcgY291bnRSb3VuZFRyaXBwZWQgPSAwOworICAgIGZvciAobG9uZyBieXRlQ2hhciA9IHN0YXJ0OyBieXRlQ2hhciA8IGxpbTsgYnl0ZUNoYXIrKykgeworICAgICAgbG9uZyB0bXBCeXRlQ2hhciA9IGJ5dGVDaGFyOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CeXRlczsgaSsrKSB7CisgICAgICAgIGJ5dGVzW2J5dGVzLmxlbmd0aCAtIGkgLSAxXSA9IChieXRlKSB0bXBCeXRlQ2hhcjsKKyAgICAgICAgdG1wQnl0ZUNoYXIgPSB0bXBCeXRlQ2hhciA+PiA4OworICAgICAgfQorICAgICAgQnl0ZVN0cmluZyBicyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpOworICAgICAgYm9vbGVhbiBpc1JvdW5kVHJpcHBhYmxlID0gYnMuaXNWYWxpZFV0ZjgoKTsKKyAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhieXRlcywgIlVURi04Iik7CisgICAgICBieXRlW10gYnl0ZXNSZWVuY29kZWQgPSBzLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgYm9vbGVhbiBieXRlc0VxdWFsID0gQXJyYXlzLmVxdWFscyhieXRlcywgYnl0ZXNSZWVuY29kZWQpOworCisgICAgICBpZiAoYnl0ZXNFcXVhbCAhPSBpc1JvdW5kVHJpcHBhYmxlKSB7CisgICAgICAgIG91dHB1dEZhaWx1cmUoYnl0ZUNoYXIsIGJ5dGVzLCBieXRlc1JlZW5jb2RlZCk7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGFncmVlbWVudCB3aXRoIHN0YXRpYyBVdGY4IG1ldGhvZHMuCisgICAgICBhc3NlcnRFcXVhbHMoaXNSb3VuZFRyaXBwYWJsZSwgVXRmOC5pc1ZhbGlkVXRmOChieXRlcykpOworICAgICAgYXNzZXJ0RXF1YWxzKGlzUm91bmRUcmlwcGFibGUsIFV0ZjguaXNWYWxpZFV0ZjgoYnl0ZXMsIDAsIG51bUJ5dGVzKSk7CisKKyAgICAgIC8vIFRlc3QgcGFydGlhbCBzZXF1ZW5jZXMuCisgICAgICAvLyBQYXJ0aXRpb24gbnVtQnl0ZXMgaW50byB0aHJlZSBzZWdtZW50cyAobm90IG5lY2Vzc2FyaWx5IG5vbi1lbXB0eSkuCisgICAgICBpbnQgaSA9IHJuZC5uZXh0SW50KG51bUJ5dGVzKTsKKyAgICAgIGludCBqID0gcm5kLm5leHRJbnQobnVtQnl0ZXMpOworICAgICAgaWYgKGogPCBpKSB7CisgICAgICAgIGludCB0bXAgPSBpOyBpID0gajsgaiA9IHRtcDsKKyAgICAgIH0KKyAgICAgIGludCBzdGF0ZTEgPSBVdGY4LnBhcnRpYWxJc1ZhbGlkVXRmOChVdGY4LkNPTVBMRVRFLCBieXRlcywgMCwgaSk7CisgICAgICBpbnQgc3RhdGUyID0gVXRmOC5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUxLCBieXRlcywgaSwgaik7CisgICAgICBpbnQgc3RhdGUzID0gVXRmOC5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUyLCBieXRlcywgaiwgbnVtQnl0ZXMpOworICAgICAgaWYgKGlzUm91bmRUcmlwcGFibGUgIT0gKHN0YXRlMyA9PSBVdGY4LkNPTVBMRVRFKSkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zigic3RhdGU9JTA0eCAlMDR4ICUwNHggaT0lZCBqPSVkJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTEsIHN0YXRlMiwgc3RhdGUzLCBpLCBqKTsKKyAgICAgICAgb3V0cHV0RmFpbHVyZShieXRlQ2hhciwgYnl0ZXMsIGJ5dGVzUmVlbmNvZGVkKTsKKyAgICAgIH0KKyAgICAgIGFzc2VydEVxdWFscyhpc1JvdW5kVHJpcHBhYmxlLCAoc3RhdGUzID09IFV0ZjguQ09NUExFVEUpKTsKKworICAgICAgLy8gVGVzdCByb3BlcyBidWlsdCBvdXQgb2Ygc21hbGwgcGFydGlhbCBzZXF1ZW5jZXMKKyAgICAgIEJ5dGVTdHJpbmcgcm9wZSA9IFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdCgKKyAgICAgICAgICBicy5zdWJzdHJpbmcoMCwgaSksCisgICAgICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KAorICAgICAgICAgICAgICBicy5zdWJzdHJpbmcoaSwgaiksCisgICAgICAgICAgICAgIGJzLnN1YnN0cmluZyhqLCBudW1CeXRlcykpKTsKKyAgICAgIGFzc2VydFNhbWUoUm9wZUJ5dGVTdHJpbmcuY2xhc3MsIHJvcGUuZ2V0Q2xhc3MoKSk7CisKKyAgICAgIEJ5dGVTdHJpbmdbXSBieXRlU3RyaW5ncyA9IHsgYnMsIGJzLnN1YnN0cmluZygwLCBudW1CeXRlcyksIHJvcGUgfTsKKyAgICAgIGZvciAoQnl0ZVN0cmluZyB4IDogYnl0ZVN0cmluZ3MpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlzUm91bmRUcmlwcGFibGUsCisgICAgICAgICAgICAgICAgICAgICB4LmlzVmFsaWRVdGY4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdGUzLAorICAgICAgICAgICAgICAgICAgICAgeC5wYXJ0aWFsSXNWYWxpZFV0ZjgoVXRmOC5DT01QTEVURSwgMCwgbnVtQnl0ZXMpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdGUxLAorICAgICAgICAgICAgICAgICAgICAgeC5wYXJ0aWFsSXNWYWxpZFV0ZjgoVXRmOC5DT01QTEVURSwgMCwgaSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdGUxLAorICAgICAgICAgICAgICAgICAgICAgeC5zdWJzdHJpbmcoMCwgaSkucGFydGlhbElzVmFsaWRVdGY4KFV0ZjguQ09NUExFVEUsIDAsIGkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXRlMiwKKyAgICAgICAgICAgICAgICAgICAgIHgucGFydGlhbElzVmFsaWRVdGY4KHN0YXRlMSwgaSwgaiAtIGkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXRlMiwKKyAgICAgICAgICAgICAgICAgICAgIHguc3Vic3RyaW5nKGksIGopLnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZTEsIDAsIGogLSBpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzdGF0ZTMsCisgICAgICAgICAgICAgICAgICAgICB4LnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZTIsIGosIG51bUJ5dGVzIC0gaikpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdGUzLAorICAgICAgICAgICAgICAgICAgICAgeC5zdWJzdHJpbmcoaiwgbnVtQnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAucGFydGlhbElzVmFsaWRVdGY4KHN0YXRlMiwgMCwgbnVtQnl0ZXMgLSBqKSk7CisgICAgICB9CisKKyAgICAgIC8vIEJ5dGVTdHJpbmcgcmVkdXBsaWNhdGlvbiBzaG91bGQgbm90IGFmZmVjdCBpdHMgVVRGLTggdmFsaWRpdHkuCisgICAgICBCeXRlU3RyaW5nIHJvcGVBRG9wZSA9CisgICAgICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KGJzLCBicy5zdWJzdHJpbmcoMCwgbnVtQnl0ZXMpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpc1JvdW5kVHJpcHBhYmxlLCByb3BlQURvcGUuaXNWYWxpZFV0ZjgoKSk7CisKKyAgICAgIGlmIChpc1JvdW5kVHJpcHBhYmxlKSB7CisgICAgICAgIGNvdW50Um91bmRUcmlwcGVkKys7CisgICAgICB9CisgICAgICBjb3VudCsrOworICAgICAgaWYgKGJ5dGVDaGFyICE9IDAgJiYgYnl0ZUNoYXIgJSAxMDAwMDAwTCA9PSAwKSB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJQcm9jZXNzZWQgIiArIChieXRlQ2hhciAvIDEwMDAwMDBMKSArCisgICAgICAgICAgICAiIG1pbGxpb24gY2hhcmFjdGVycyIpOworICAgICAgfQorICAgIH0KKyAgICBsb2dnZXIuaW5mbygiUm91bmQgdHJpcHBlZCAiICsgY291bnRSb3VuZFRyaXBwZWQgKyAiIG9mICIgKyBjb3VudCk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQ291bnQsIGNvdW50Um91bmRUcmlwcGVkKTsKKyAgfQorCisgIC8qKgorICAgKiBWYXJpYXRpb24gb2Yge0BsaW5rICN0ZXN0Qnl0ZXN9IHRoYXQgZG9lcyBsZXNzIGFsbG9jYXRpb24gdXNpbmcgdGhlCisgICAqIGxvdy1sZXZlbCBlbmNvZGVycy9kZWNvZGVycyBkaXJlY3RseS4gQ2hlY2tlZCBpbiBiZWNhdXNlIGl0J3MgdXNlZnVsIGZvcgorICAgKiBkZWJ1Z2dpbmcgd2hlbiB0cnlpbmcgdG8gcHJvY2VzcyBieXRlcyBmYXN0ZXIsIGJ1dCBzaW5jZSBpdCBkb2Vzbid0IHVzZSB0aGUKKyAgICogYWN0dWFsIFN0cmluZyBjbGFzcywgaXQncyBwb3NzaWJsZSBmb3IgaW5jb21wYXRpYmlsaXRpZXMgdG8gZGV2ZWxvcAorICAgKiAoYWx0aG91Z2ggdW5saWtlbHkpLgorICAgKgorICAgKiBAcGFyYW0gbnVtQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnl0ZSBhcnJheQorICAgKiBAcGFyYW0gZXhwZWN0ZWRDb3VudCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHJvdW5kdHJpcHBhYmxlIHBlcm11dGF0aW9ucworICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGJ5dGVzIGVuY29kZWQgYXMgYSBsb25nIGFzIGJpZy1lbmRpYW4KKyAgICogQHBhcmFtIGxpbSB0aGUgbGltaXQgb2YgYnl0ZXMgdG8gcHJvY2VzcyBlbmNvZGVkIGFzIGEgbG9uZyBhcyBiaWctZW5kaWFuLAorICAgKiAgICAgb3IgLTEgdG8gbWVhbiB0aGUgbWF4IGxpbWl0IGZvciBudW1CeXRlcworICAgKi8KKyAgdm9pZCB0ZXN0Qnl0ZXNVc2luZ0J5dGVCdWZmZXJzKAorICAgICAgaW50IG51bUJ5dGVzLCBsb25nIGV4cGVjdGVkQ291bnQsIGxvbmcgc3RhcnQsIGxvbmcgbGltKQorICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIENoYXJzZXREZWNvZGVyIGRlY29kZXIgPSBDaGFyc2V0LmZvck5hbWUoIlVURi04IikubmV3RGVjb2RlcigpCisgICAgICAgIC5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpCisgICAgICAgIC5vblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24uUkVQTEFDRSk7CisgICAgQ2hhcnNldEVuY29kZXIgZW5jb2RlciA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKS5uZXdFbmNvZGVyKCkKKyAgICAgICAgLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQTEFDRSkKKyAgICAgICAgLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtudW1CeXRlc107CisgICAgaW50IG1heENoYXJzID0gKGludCkgKGRlY29kZXIubWF4Q2hhcnNQZXJCeXRlKCkgKiBudW1CeXRlcykgKyAxOworICAgIGNoYXJbXSBjaGFyc0RlY29kZWQgPQorICAgICAgICBuZXcgY2hhclsoaW50KSAoZGVjb2Rlci5tYXhDaGFyc1BlckJ5dGUoKSAqIG51bUJ5dGVzKSArIDFdOworICAgIGludCBtYXhCeXRlcyA9IChpbnQpIChlbmNvZGVyLm1heEJ5dGVzUGVyQ2hhcigpICogbWF4Q2hhcnMpICsgMTsKKyAgICBieXRlW10gYnl0ZXNSZWVuY29kZWQgPSBuZXcgYnl0ZVttYXhCeXRlc107CisKKyAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzKTsKKyAgICBDaGFyQnVmZmVyIGNiID0gQ2hhckJ1ZmZlci53cmFwKGNoYXJzRGVjb2RlZCk7CisgICAgQnl0ZUJ1ZmZlciBiYlJlZW5jb2RlZCA9IEJ5dGVCdWZmZXIud3JhcChieXRlc1JlZW5jb2RlZCk7CisgICAgaWYgKGxpbSA9PSAtMSkgeworICAgICAgbGltID0gMUwgPDwgKG51bUJ5dGVzICogOCk7CisgICAgfQorICAgIGxvbmcgY291bnQgPSAwOworICAgIGxvbmcgY291bnRSb3VuZFRyaXBwZWQgPSAwOworICAgIGZvciAobG9uZyBieXRlQ2hhciA9IHN0YXJ0OyBieXRlQ2hhciA8IGxpbTsgYnl0ZUNoYXIrKykgeworICAgICAgYmIucmV3aW5kKCk7CisgICAgICBiYi5saW1pdChieXRlcy5sZW5ndGgpOworICAgICAgY2IucmV3aW5kKCk7CisgICAgICBjYi5saW1pdChjaGFyc0RlY29kZWQubGVuZ3RoKTsKKyAgICAgIGJiUmVlbmNvZGVkLnJld2luZCgpOworICAgICAgYmJSZWVuY29kZWQubGltaXQoYnl0ZXNSZWVuY29kZWQubGVuZ3RoKTsKKyAgICAgIGVuY29kZXIucmVzZXQoKTsKKyAgICAgIGRlY29kZXIucmVzZXQoKTsKKyAgICAgIGxvbmcgdG1wQnl0ZUNoYXIgPSBieXRlQ2hhcjsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAtIDFdID0gKGJ5dGUpIHRtcEJ5dGVDaGFyOworICAgICAgICB0bXBCeXRlQ2hhciA9IHRtcEJ5dGVDaGFyID4+IDg7CisgICAgICB9CisgICAgICBib29sZWFuIGlzUm91bmRUcmlwcGFibGUgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzKS5pc1ZhbGlkVXRmOCgpOworICAgICAgQ29kZXJSZXN1bHQgcmVzdWx0ID0gZGVjb2Rlci5kZWNvZGUoYmIsIGNiLCB0cnVlKTsKKyAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5pc0Vycm9yKCkpOworICAgICAgcmVzdWx0ID0gZGVjb2Rlci5mbHVzaChjYik7CisgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNFcnJvcigpKTsKKworICAgICAgaW50IGNoYXJMZW4gPSBjYi5wb3NpdGlvbigpOworICAgICAgY2IucmV3aW5kKCk7CisgICAgICBjYi5saW1pdChjaGFyTGVuKTsKKyAgICAgIHJlc3VsdCA9IGVuY29kZXIuZW5jb2RlKGNiLCBiYlJlZW5jb2RlZCwgdHJ1ZSk7CisgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNFcnJvcigpKTsKKyAgICAgIHJlc3VsdCA9IGVuY29kZXIuZmx1c2goYmJSZWVuY29kZWQpOworICAgICAgYXNzZXJ0RmFsc2UocmVzdWx0LmlzRXJyb3IoKSk7CisKKyAgICAgIGJvb2xlYW4gYnl0ZXNFcXVhbCA9IHRydWU7CisgICAgICBpbnQgYnl0ZXNMZW4gPSBiYlJlZW5jb2RlZC5wb3NpdGlvbigpOworICAgICAgaWYgKGJ5dGVzTGVuICE9IG51bUJ5dGVzKSB7CisgICAgICAgIGJ5dGVzRXF1YWwgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnl0ZXM7IGkrKykgeworICAgICAgICAgIGlmIChieXRlc1tpXSAhPSBieXRlc1JlZW5jb2RlZFtpXSkgeworICAgICAgICAgICAgYnl0ZXNFcXVhbCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoYnl0ZXNFcXVhbCAhPSBpc1JvdW5kVHJpcHBhYmxlKSB7CisgICAgICAgIG91dHB1dEZhaWx1cmUoYnl0ZUNoYXIsIGJ5dGVzLCBieXRlc1JlZW5jb2RlZCwgYnl0ZXNMZW4pOworICAgICAgfQorCisgICAgICBjb3VudCsrOworICAgICAgaWYgKGlzUm91bmRUcmlwcGFibGUpIHsKKyAgICAgICAgY291bnRSb3VuZFRyaXBwZWQrKzsKKyAgICAgIH0KKyAgICAgIGlmIChieXRlQ2hhciAhPSAwICYmIGJ5dGVDaGFyICUgMTAwMDAwMCA9PSAwKSB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJQcm9jZXNzZWQgIiArIChieXRlQ2hhciAvIDEwMDAwMDApICsKKyAgICAgICAgICAgICIgbWlsbGlvbiBjaGFyYWN0ZXJzIik7CisgICAgICB9CisgICAgfQorICAgIGxvZ2dlci5pbmZvKCJSb3VuZCB0cmlwcGVkICIgKyBjb3VudFJvdW5kVHJpcHBlZCArICIgb2YgIiArIGNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb3VudCwgY291bnRSb3VuZFRyaXBwZWQpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdXRwdXRGYWlsdXJlKGxvbmcgYnl0ZUNoYXIsIGJ5dGVbXSBieXRlcywgYnl0ZVtdIGFmdGVyKSB7CisgICAgb3V0cHV0RmFpbHVyZShieXRlQ2hhciwgYnl0ZXMsIGFmdGVyLCBhZnRlci5sZW5ndGgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdXRwdXRGYWlsdXJlKGxvbmcgYnl0ZUNoYXIsIGJ5dGVbXSBieXRlcywgYnl0ZVtdIGFmdGVyLAorICAgICAgaW50IGxlbikgeworICAgIGZhaWwoIkZhaWx1cmU6ICgiICsgTG9uZy50b0hleFN0cmluZyhieXRlQ2hhcikgKyAiKSAiICsKKyAgICAgICAgdG9IZXhTdHJpbmcoYnl0ZXMpICsgIiA9PiAiICsgdG9IZXhTdHJpbmcoYWZ0ZXIsIGxlbikpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvSGV4U3RyaW5nKGJ5dGVbXSBiKSB7CisgICAgcmV0dXJuIHRvSGV4U3RyaW5nKGIsIGIubGVuZ3RoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0hleFN0cmluZyhieXRlW10gYiwgaW50IGxlbikgeworICAgIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgcy5hcHBlbmQoIlwiIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIHMuYXBwZW5kKCIgIik7CisgICAgICB9CisgICAgICBzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJ4IiwgYltpXSAmIDB4RkYpKTsKKyAgICB9CisgICAgcy5hcHBlbmQoIlwiIik7CisgICAgcmV0dXJuIHMudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3RUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwMDU5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0FycmF5TGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIExhenlTdHJpbmdBcnJheUxpc3R9LgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgTGF6eVN0cmluZ0FycmF5TGlzdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19BID0gIkEiOworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0IgPSAiQiI7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQyA9ICJDIjsKKworICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIEJZVEVfU1RSSU5HX0EgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiQSIpOworICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIEJZVEVfU1RSSU5HX0IgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiQiIpOworICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIEJZVEVfU1RSSU5HX0MgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiQyIpOworCisgIHB1YmxpYyB2b2lkIHRlc3RKdXN0U3RyaW5ncygpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdCgpOworICAgIGxpc3QuYWRkKFNUUklOR19BKTsKKyAgICBsaXN0LmFkZChTVFJJTkdfQik7CisgICAgbGlzdC5hZGQoU1RSSU5HX0MpOworCisgICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKKyAgICBhc3NlcnRTYW1lKFNUUklOR19BLCBsaXN0LmdldCgwKSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQiwgbGlzdC5nZXQoMSkpOworICAgIGFzc2VydFNhbWUoU1RSSU5HX0MsIGxpc3QuZ2V0KDIpKTsKKworICAgIGxpc3Quc2V0KDEsIFNUUklOR19DKTsKKyAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0LmdldCgxKSk7CisKKyAgICBsaXN0LnJlbW92ZSgxKTsKKyAgICBhc3NlcnRTYW1lKFNUUklOR19BLCBsaXN0LmdldCgwKSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQywgbGlzdC5nZXQoMSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEp1c3RCeXRlU3RyaW5nKCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7CisgICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQSk7CisgICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQik7CisgICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQyk7CisKKyAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOworICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQSwgbGlzdC5nZXRCeXRlU3RyaW5nKDApKTsKKyAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0IsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7CisgICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19DLCBsaXN0LmdldEJ5dGVTdHJpbmcoMikpOworCisgICAgbGlzdC5yZW1vdmUoMSk7CisgICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19BLCBsaXN0LmdldEJ5dGVTdHJpbmcoMCkpOworICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQywgbGlzdC5nZXRCeXRlU3RyaW5nKDEpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uQmFja0FuZEZvcnRoKCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7CisgICAgbGlzdC5hZGQoU1RSSU5HX0EpOworICAgIGxpc3QuYWRkKEJZVEVfU1RSSU5HX0IpOworICAgIGxpc3QuYWRkKEJZVEVfU1RSSU5HX0MpOworCisgICAgLy8gU3RyaW5nIGEgc2hvdWxkIGJlIHRoZSBzYW1lIGJlY2F1c2UgaXQgd2FzIG9yaWdpbmFsbHkgYSBzdHJpbmcKKyAgICBhc3NlcnRTYW1lKFNUUklOR19BLCBsaXN0LmdldCgwKSk7CisKKyAgICAvLyBTdHJpbmcgYiBhbmQgYyBzaG91bGQgYmUgZGlmZmVyZW50IGJlY2F1c2UgdGhlIHN0cmluZyBoYXMgdG8gYmUgY29tcHV0ZWQKKyAgICAvLyBmcm9tIHRoZSBCeXRlU3RyaW5nCisgICAgU3RyaW5nIGJQcmltZSA9IGxpc3QuZ2V0KDEpOworICAgIGFzc2VydE5vdFNhbWUoU1RSSU5HX0IsIGJQcmltZSk7CisgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19CLCBiUHJpbWUpOworICAgIFN0cmluZyBjUHJpbWUgPSBsaXN0LmdldCgyKTsKKyAgICBhc3NlcnROb3RTYW1lKFNUUklOR19DLCBjUHJpbWUpOworICAgIGFzc2VydEVxdWFscyhTVFJJTkdfQywgY1ByaW1lKTsKKworICAgIC8vIFN0cmluZyBjIGFuZCBjIHNob3VsZCBzdGF5IHRoZSBzYW1lIG9uY2UgY2FjaGVkLgorICAgIGFzc2VydFNhbWUoYlByaW1lLCBsaXN0LmdldCgxKSk7CisgICAgYXNzZXJ0U2FtZShjUHJpbWUsIGxpc3QuZ2V0KDIpKTsKKworICAgIC8vIEJ5dGVTdHJpbmcgbmVlZHMgdG8gYmUgY29tcHV0ZWQgZnJvbSBzdHJpbmcgZm9yIGJvdGggYSBhbmQgYgorICAgIEJ5dGVTdHJpbmcgYVByaW1lQnl0ZVN0cmluZyA9IGxpc3QuZ2V0Qnl0ZVN0cmluZygwKTsKKyAgICBhc3NlcnRFcXVhbHMoQllURV9TVFJJTkdfQSwgYVByaW1lQnl0ZVN0cmluZyk7CisgICAgQnl0ZVN0cmluZyBiUHJpbWVCeXRlU3RyaW5nID0gbGlzdC5nZXRCeXRlU3RyaW5nKDEpOworICAgIGFzc2VydE5vdFNhbWUoQllURV9TVFJJTkdfQiwgYlByaW1lQnl0ZVN0cmluZyk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0IsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7CisKKyAgICAvLyBPbmNlIGNhY2hlZCwgQnl0ZVN0cmluZyBzaG91bGQgc3RheSBjYWNoZWQuCisgICAgYXNzZXJ0U2FtZShhUHJpbWVCeXRlU3RyaW5nLCBsaXN0LmdldEJ5dGVTdHJpbmcoMCkpOworICAgIGFzc2VydFNhbWUoYlByaW1lQnl0ZVN0cmluZywgbGlzdC5nZXRCeXRlU3RyaW5nKDEpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5Q29uc3RydWN0b3JDb3BpZXNCeVJlZmVyZW5jZSgpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QxID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKKyAgICBsaXN0MS5hZGQoU1RSSU5HX0EpOworICAgIGxpc3QxLmFkZChCWVRFX1NUUklOR19CKTsKKyAgICBsaXN0MS5hZGQoQllURV9TVFJJTkdfQyk7CisKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QyID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QobGlzdDEpOworICAgIGFzc2VydEVxdWFscygzLCBsaXN0Mi5zaXplKCkpOworICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QyLmdldCgwKSk7CisgICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19CLCBsaXN0Mi5nZXRCeXRlU3RyaW5nKDEpKTsKKyAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0MsIGxpc3QyLmdldEJ5dGVTdHJpbmcoMikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpc3RDb3B5Q29uc3RydWN0b3IoKSB7CisgICAgTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgbGlzdDEuYWRkKFNUUklOR19BKTsKKyAgICBsaXN0MS5hZGQoU1RSSU5HX0IpOworICAgIGxpc3QxLmFkZChTVFJJTkdfQyk7CisKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QyID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QobGlzdDEpOworICAgIGFzc2VydEVxdWFscygzLCBsaXN0Mi5zaXplKCkpOworICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QyLmdldCgwKSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQiwgbGlzdDIuZ2V0KDEpKTsKKyAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0Mi5nZXQoMikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEFkZEFsbENvcGllc0J5UmVmZXJlbmNlSWZQb3NzaWJsZSgpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QxID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKKyAgICBsaXN0MS5hZGQoU1RSSU5HX0EpOworICAgIGxpc3QxLmFkZChCWVRFX1NUUklOR19CKTsKKyAgICBsaXN0MS5hZGQoQllURV9TVFJJTkdfQyk7CisKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QyID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKKyAgICBsaXN0Mi5hZGRBbGwobGlzdDEpOworCisgICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3QyLnNpemUoKSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdDIuZ2V0KDApKTsKKyAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0IsIGxpc3QyLmdldEJ5dGVTdHJpbmcoMSkpOworICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQywgbGlzdDIuZ2V0Qnl0ZVN0cmluZygyKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0VuZFRvRW5kVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nRW5kVG9FbmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5NTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0VuZFRvRW5kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3RzIHRvIG1ha2Ugc3VyZSB0aGUgbGF6eSBjb252ZXJzaW9uIG9mIFVURjgtZW5jb2RlZCBieXRlIGFycmF5cyB0bworICogc3RyaW5ncyB3b3JrcyBjb3JyZWN0bHkuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBjbGFzcyBMYXp5U3RyaW5nRW5kVG9FbmRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCA9CisgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tKG5ldyBieXRlW10geworICAgICAgICAgIDExNCwgNCwgLTEsIDAsIC0xLCAwLCAtMzAsIDIsIDQsIC0xLAorICAgICAgICAgIDAsIC0xLCAwLCAtMzAsIDIsIDQsIC0xLCAwLCAtMSwgMCwgfSk7CisKKyAgcHJpdmF0ZSBCeXRlU3RyaW5nIGVuY29kZWRUZXN0QWxsVHlwZXM7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB0aGlzLmVuY29kZWRUZXN0QWxsVHlwZXMgPSBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJmb28iKQorICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImJhciIpCisgICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygiYmF6IikKKyAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgLnRvQnl0ZVN0cmluZygpOworICB9CisKKyAgLyoqCisgICAqIFRlc3RzIHRoYXQgYW4gaW52YWxpZCBVVEY4IHN0cmluZyB3aWxsIHJvdW5kdHJpcCB0aHJvdWdoIGEgcGFyc2UKKyAgICogYW5kIHNlcmlhbGl6YXRpb24uCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBbmRTZXJpYWxpemUoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcyB0VjIgPSBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5wYXJzZUZyb20oCisgICAgICAgIFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjgpOworICAgIEJ5dGVTdHJpbmcgYnl0ZXMgPSB0VjIudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjgsIGJ5dGVzKTsKKworICAgIHRWMi5nZXRPcHRpb25hbFN0cmluZygpOworICAgIGJ5dGVzID0gdFYyLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEVxdWFscyhURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4LCBieXRlcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBbmRXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMgdFYyID0gVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMucGFyc2VGcm9tKAorICAgICAgICBURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4KTsKKyAgICBieXRlW10gc2luayA9IG5ldyBieXRlW1RFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjguc2l6ZSgpXTsKKyAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShzaW5rKTsKKyAgICB0VjIud3JpdGVUbyhvdXRwdXRTdHJlYW0pOworICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCwKKyAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShzaW5rKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGluZygpIHsKKyAgICBTdHJpbmcgYSA9ICJhIjsKKyAgICBTdHJpbmcgYiA9ICJiIjsKKyAgICBTdHJpbmcgYyA9ICJjIjsKKyAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcyBwcm90byA9IFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoYSkKKyAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKGIpCisgICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZyhjKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIC8vIFN0cmluZyBzaG91bGQgYmUgdGhlIG9uZSB3ZSBwYXNzZWQgaXQuCisgICAgYXNzZXJ0U2FtZShhLCBwcm90by5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgICBhc3NlcnRTYW1lKGIsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDApKTsKKyAgICBhc3NlcnRTYW1lKGMsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDEpKTsKKworCisgICAgLy8gVGhlcmUncyBubyB3YXkgdG8gZGlyZWN0bHkgb2JzZXJ2ZSB0aGF0IHRoZSBCeXRlU3RyaW5nIGlzIGNhY2hlZAorICAgIC8vIGNvcnJlY3RseSBvbiBzZXJpYWxpemF0aW9uLCBidXQgd2UgY2FuIG9ic2VydmUgdGhhdCBpdCBoYWQgdG8gcmVjb21wdXRlCisgICAgLy8gdGhlIHN0cmluZyBhZnRlciBzZXJpYWxpemF0aW9uLgorICAgIHByb3RvLnRvQnl0ZVN0cmluZygpOworICAgIFN0cmluZyBhUHJpbWUgPSBwcm90by5nZXRPcHRpb25hbFN0cmluZygpOworICAgIGFzc2VydE5vdFNhbWUoYSwgYVByaW1lKTsKKyAgICBhc3NlcnRFcXVhbHMoYSwgYVByaW1lKTsKKyAgICBTdHJpbmcgYlByaW1lID0gcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmcoMCk7CisgICAgYXNzZXJ0Tm90U2FtZShiLCBiUHJpbWUpOworICAgIGFzc2VydEVxdWFscyhiLCBiUHJpbWUpOworICAgIFN0cmluZyBjUHJpbWUgPSBwcm90by5nZXRSZXBlYXRlZFN0cmluZygxKTsKKyAgICBhc3NlcnROb3RTYW1lKGMsIGNQcmltZSk7CisgICAgYXNzZXJ0RXF1YWxzKGMsIGNQcmltZSk7CisKKyAgICAvLyBBbmQgbm93IHRoZSBzdHJpbmcgc2hvdWxkIHN0YXkgY2FjaGVkLgorICAgIGFzc2VydFNhbWUoYVByaW1lLCBwcm90by5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgICBhc3NlcnRTYW1lKGJQcmltZSwgcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmcoMCkpOworICAgIGFzc2VydFNhbWUoY1ByaW1lLCBwcm90by5nZXRSZXBlYXRlZFN0cmluZygxKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdHJpbmdDYWNoaW5nSWZPbmx5Qnl0ZXNBY2Nlc3NlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzIHByb3RvID0KKyAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMucGFyc2VGcm9tKGVuY29kZWRUZXN0QWxsVHlwZXMpOworICAgIEJ5dGVTdHJpbmcgb3B0aW9uYWwgPSBwcm90by5nZXRPcHRpb25hbFN0cmluZ0J5dGVzKCk7CisgICAgYXNzZXJ0U2FtZShvcHRpb25hbCwgcHJvdG8uZ2V0T3B0aW9uYWxTdHJpbmdCeXRlcygpKTsKKyAgICBhc3NlcnRTYW1lKG9wdGlvbmFsLCBwcm90by50b0J1aWxkZXIoKS5nZXRPcHRpb25hbFN0cmluZ0J5dGVzKCkpOworCisgICAgQnl0ZVN0cmluZyByZXBlYXRlZDAgPSBwcm90by5nZXRSZXBlYXRlZFN0cmluZ0J5dGVzKDApOworICAgIEJ5dGVTdHJpbmcgcmVwZWF0ZWQxID0gcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygxKTsKKyAgICBhc3NlcnRTYW1lKHJlcGVhdGVkMCwgcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygwKSk7CisgICAgYXNzZXJ0U2FtZShyZXBlYXRlZDEsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nQnl0ZXMoMSkpOworICAgIGFzc2VydFNhbWUocmVwZWF0ZWQwLCBwcm90by50b0J1aWxkZXIoKS5nZXRSZXBlYXRlZFN0cmluZ0J5dGVzKDApKTsKKyAgICBhc3NlcnRTYW1lKHJlcGVhdGVkMSwgcHJvdG8udG9CdWlsZGVyKCkuZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygxKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk2OTRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxFeHRlbnNpb25zTGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKKworLyoqCisgKiBUZXN0IGxpdGUgcnVudGltZS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgTGl0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGVzdCB0aGF0IG5lc3RlZCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZCBjb3JyZWN0bHkgZXZlbiBpZiB0aGUgb3V0ZXIKKyAgICAvLyBjbGFzcyBoYXMgbm90IGJlZW4gYWNjZXNzZWQgZGlyZWN0bHkuICBUaGlzIHdhcyBvbmNlIGEgYnVnIHdpdGggbGl0ZQorICAgIC8vIG1lc3NhZ2VzLgorICAgIC8vCisgICAgLy8gV2UgcHV0IHRoaXMgaW4gc2V0VXAoKSByYXRoZXIgdGhhbiBpbiBpdHMgb3duIHRlc3QgbWV0aG9kIGJlY2F1c2Ugd2UKKyAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBydW5zIGJlZm9yZSBhbnkgYWN0dWFsIHRlc3RzLgorICAgIGFzc2VydFRydWUoVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUubmVzdGVkRXh0ZW5zaW9uICE9IG51bGwpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBTaW5jZSBsaXRlIG1lc3NhZ2VzIGFyZSBhIHN1YnNldCBvZiByZWd1bGFyIG1lc3NhZ2VzLCB3ZSBjYW4gbW9zdGx5CisgICAgLy8gYXNzdW1lIHRoYXQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbGl0ZSBtZXNzYWdlcyBpcyBhbHJlYWR5IHRob3JvdWdobHkKKyAgICAvLyB0ZXN0ZWQgYnkgdGhlIHJlZ3VsYXIgdGVzdHMuICBBbGwgdGhpcyB0ZXN0IHJlYWxseSB2ZXJpZmllcyBpcyB0aGF0CisgICAgLy8gYSBwcm90byB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjb21waWxlcyBjb3JyZWN0bHkgd2hlbgorICAgIC8vIGxpbmtlZCBvbmx5IGFnYWluc3QgdGhlIGxpdGUgbGlicmFyeS4gIFRoYXQgaXMgYWxsIHRlc3RlZCBhdCBjb21waWxlCisgICAgLy8gdGltZSwgbGVhdmluZyBub3QgbXVjaCB0byBkbyBpbiB0aGlzIG1ldGhvZC4gIExldCdzIGp1c3QgZG8gc29tZSByYW5kb20KKyAgICAvLyBzdHVmZiB0byBtYWtlIHN1cmUgdGhlIGxpdGUgbWVzc2FnZSBpcyBhY3R1YWxseSBoZXJlIGFuZCB1c2FibGUuCisKKyAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UgPQorICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxMjMpCisgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJoZWxsbyIpCisgICAgICAgICAgICAgICAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig3KSkKKyAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisKKyAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzTGl0ZS5wYXJzZUZyb20oZGF0YSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlMi5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZ0NvdW50KCkpOworICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZygwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDcsIG1lc3NhZ2UyLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldEJiKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgVW5saWtlIG90aGVyIGZlYXR1cmVzIG9mIHRoZSBsaXRlIGxpYnJhcnksIGV4dGVuc2lvbnMgYXJlCisgICAgLy8gICBpbXBsZW1lbnRlZCBjb21wbGV0ZWx5IGRpZmZlcmVudGx5IGZyb20gdGhlIHJlZ3VsYXIgbGlicmFyeS4gIFdlCisgICAgLy8gICBzaG91bGQgcHJvYmFibHkgdGVzdCB0aGVtIG1vcmUgdGhvcm91Z2hseS4KKworICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0KKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykKKyAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAiaGVsbG8iKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWikKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNykuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAvLyBUZXN0IGNvcHlpbmcgYSBtZXNzYWdlLCBzaW5jZSBjb3BpbmcgZXh0ZW5zaW9ucyBhY3R1YWxseSBkb2VzIHVzZSBhCisgICAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aCBiZXR3ZWVuIGxpdGUgYW5kIHJlZ3VsYXIgbGlicmFyaWVzLCBhbmQgYXMgb2YgdGhpcworICAgIC8vIHdyaXRpbmcsIHBhcnNpbmcgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgorICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlMiA9IG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygxMjMsIChpbnQpIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKKyAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbkNvdW50KAorICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKKyAgICAgICAgVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAorICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKKyAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHMoNywgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAorICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuZ2V0QmIoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgVGVzdEFsbFR5cGVzTGl0ZSBleHBlY3RlZCA9CisgICAgICBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcHRpb25hbEludDMyKDEyMykKKyAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImhlbGxvIikKKyAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDcpKQorICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgIHRyeSB7CisgICAgICBvdXQud3JpdGVPYmplY3QoZXhwZWN0ZWQpOworICAgIH0gZmluYWxseSB7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOworICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOworICAgIFRlc3RBbGxUeXBlc0xpdGUgYWN0dWFsID0gKFRlc3RBbGxUeXBlc0xpdGUpIGluLnJlYWRPYmplY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0T3B0aW9uYWxJbnQzMigpLCBhY3R1YWwuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpLAorICAgICAgICBhY3R1YWwuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UmVwZWF0ZWRTdHJpbmcoMCksCisgICAgICAgIGFjdHVhbC5nZXRSZXBlYXRlZFN0cmluZygwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldEJiKCksCisgICAgICAgIGFjdHVhbC5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKS5nZXRCYigpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlcmFsQnl0ZVN0cmluZ1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlZTFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwzOTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIFRlc3Qge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nfSBieSBzZXR0aW5nIHVwIGEgcmVmZXJlbmNlIHN0cmluZyBpbiB7QGxpbmsgI3NldFVwKCl9LgorICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBleHRlbmRlZCBmb3IgdGVzdGluZyBleHRlbnNpb25zIG9mIHtAbGluayBMaXRlcmFsQnl0ZVN0cmluZ30KKyAqIHN1Y2ggYXMge0BsaW5rIEJvdW5kZWRCeXRlU3RyaW5nfSwgc2VlIHtAbGluayBCb3VuZGVkQnl0ZVN0cmluZ1Rlc3R9LgorICoKKyAqIEBhdXRob3IgY2FybGFudG9uQGdvb2dsZS5jb20gKENhcmwgSGF2ZXJsKQorICovCitwdWJsaWMgY2xhc3MgTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7CisKKyAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc1VuZGVyVGVzdDsKKyAgcHJvdGVjdGVkIGJ5dGVbXSByZWZlcmVuY2VCeXRlczsKKyAgcHJvdGVjdGVkIEJ5dGVTdHJpbmcgc3RyaW5nVW5kZXJUZXN0OworICBwcm90ZWN0ZWQgaW50IGV4cGVjdGVkSGFzaENvZGU7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgY2xhc3NVbmRlclRlc3QgPSAiTGl0ZXJhbEJ5dGVTdHJpbmciOworICAgIHJlZmVyZW5jZUJ5dGVzID0gQnl0ZVN0cmluZ1Rlc3QuZ2V0VGVzdEJ5dGVzKDEyMzQsIDExMzM3NzY2TCk7CisgICAgc3RyaW5nVW5kZXJUZXN0ID0gQnl0ZVN0cmluZy5jb3B5RnJvbShyZWZlcmVuY2VCeXRlcyk7CisgICAgZXhwZWN0ZWRIYXNoQ29kZSA9IDMzMTE2MTg1MjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHBlY3RlZFR5cGUoKSB7CisgICAgU3RyaW5nIGFjdHVhbENsYXNzTmFtZSA9IGdldEFjdHVhbENsYXNzTmFtZShzdHJpbmdVbmRlclRlc3QpOworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgc2hvdWxkIG1hdGNoIHR5cGUgZXhhY3RseSIsIGNsYXNzVW5kZXJUZXN0LCBhY3R1YWxDbGFzc05hbWUpOworICB9CisKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXRBY3R1YWxDbGFzc05hbWUoT2JqZWN0IG9iamVjdCkgeworICAgIFN0cmluZyBhY3R1YWxDbGFzc05hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgYWN0dWFsQ2xhc3NOYW1lID0gYWN0dWFsQ2xhc3NOYW1lLnN1YnN0cmluZyhhY3R1YWxDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOworICAgIHJldHVybiBhY3R1YWxDbGFzc05hbWU7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUF0KCkgeworICAgIGJvb2xlYW4gc3RpbGxFcXVhbCA9IHRydWU7CisgICAgZm9yIChpbnQgaSA9IDA7IHN0aWxsRXF1YWwgJiYgaSA8IHJlZmVyZW5jZUJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAgICBzdGlsbEVxdWFsID0gKHJlZmVyZW5jZUJ5dGVzW2ldID09IHN0cmluZ1VuZGVyVGVzdC5ieXRlQXQoaSkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGNhcHR1cmUgdGhlIHJpZ2h0IGJ5dGVzIiwgc3RpbGxFcXVhbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUl0ZXJhdG9yKCkgeworICAgIGJvb2xlYW4gc3RpbGxFcXVhbCA9IHRydWU7CisgICAgQnl0ZVN0cmluZy5CeXRlSXRlcmF0b3IgaXRlciA9IHN0cmluZ1VuZGVyVGVzdC5pdGVyYXRvcigpOworICAgIGZvciAoaW50IGkgPSAwOyBzdGlsbEVxdWFsICYmIGkgPCByZWZlcmVuY2VCeXRlcy5sZW5ndGg7ICsraSkgeworICAgICAgc3RpbGxFcXVhbCA9IChpdGVyLmhhc05leHQoKSAmJiByZWZlcmVuY2VCeXRlc1tpXSA9PSBpdGVyLm5leHRCeXRlKCkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGNhcHR1cmUgdGhlIHJpZ2h0IGJ5dGVzIiwgc3RpbGxFcXVhbCk7CisgICAgYXNzZXJ0RmFsc2UoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgaGF2ZSBleGhhdXN0ZWQgdGhlIGl0ZXJ0b3IiLCBpdGVyLmhhc05leHQoKSk7CisKKyAgICB0cnkgeworICAgICAgaXRlci5uZXh0Qnl0ZSgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlSXRlcmFibGUoKSB7CisgICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gdHJ1ZTsKKyAgICBpbnQgaiA9IDA7CisgICAgZm9yIChieXRlIHF1YW50dW0gOiBzdHJpbmdVbmRlclRlc3QpIHsKKyAgICAgIHN0aWxsRXF1YWwgPSAocmVmZXJlbmNlQnl0ZXNbal0gPT0gcXVhbnR1bSk7CisgICAgICArK2o7CisgICAgfQorICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgY2FwdHVyZSB0aGUgcmlnaHQgYnl0ZXMgYXMgQnl0ZXMiLCBzdGlsbEVxdWFsKTsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIGl0ZXJhYmxlIGNoYXJhY3RlciBjb3VudCIsIHJlZmVyZW5jZUJ5dGVzLmxlbmd0aCwgaik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgaGF2ZSB0aGUgZXhwZWN0ZWQgc2l6ZSIsIHJlZmVyZW5jZUJ5dGVzLmxlbmd0aCwKKyAgICAgICAgc3RyaW5nVW5kZXJUZXN0LnNpemUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHJlZURlcHRoKCkgeworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBoYXZlIGRlcHRoIDAiLCAwLCBzdHJpbmdVbmRlclRlc3QuZ2V0VHJlZURlcHRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdElzQmFsYW5jZWQoKSB7CisgICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIgaXMgdGVjaG5pY2FsbHkgYmFsYW5jZWQiLCBzdHJpbmdVbmRlclRlc3QuaXNCYWxhbmNlZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5VG9fQnl0ZUFycmF5T2Zmc2V0TGVuZ3RoKCkgeworICAgIGludCBkZXN0aW5hdGlvbk9mZnNldCA9IDUwOworICAgIGludCBsZW5ndGggPSAxMDA7CisgICAgYnl0ZVtdIGRlc3RpbmF0aW9uID0gbmV3IGJ5dGVbZGVzdGluYXRpb25PZmZzZXQgKyBsZW5ndGhdOworICAgIGludCBzb3VyY2VPZmZzZXQgPSAyMTM7CisgICAgc3RyaW5nVW5kZXJUZXN0LmNvcHlUbyhkZXN0aW5hdGlvbiwgc291cmNlT2Zmc2V0LCBkZXN0aW5hdGlvbk9mZnNldCwgbGVuZ3RoKTsKKyAgICBib29sZWFuIHN0aWxsRXF1YWwgPSB0cnVlOworICAgIGZvciAoaW50IGkgPSAwOyBzdGlsbEVxdWFsICYmIGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgc3RpbGxFcXVhbCA9IHJlZmVyZW5jZUJ5dGVzW2kgKyBzb3VyY2VPZmZzZXRdID09IGRlc3RpbmF0aW9uW2kgKyBkZXN0aW5hdGlvbk9mZnNldF07CisgICAgfQorICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiLmNvcHlUbyg0IGFyZykgbXVzdCBnaXZlIHRoZSBleHBlY3RlZCBieXRlcyIsIHN0aWxsRXF1YWwpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvcHlUb19CeXRlQXJyYXlPZmZzZXRMZW5ndGhFcnJvcnMoKSB7CisgICAgaW50IGRlc3RpbmF0aW9uT2Zmc2V0ID0gNTA7CisgICAgaW50IGxlbmd0aCA9IDEwMDsKKyAgICBieXRlW10gZGVzdGluYXRpb24gPSBuZXcgYnl0ZVtkZXN0aW5hdGlvbk9mZnNldCArIGxlbmd0aF07CisKKyAgICB0cnkgeworICAgICAgLy8gQ29weSBvbmUgdG9vIG1hbnkgYnl0ZXMKKyAgICAgIHN0cmluZ1VuZGVyVGVzdC5jb3B5VG8oZGVzdGluYXRpb24sIHN0cmluZ1VuZGVyVGVzdC5zaXplKCkgKyAxIC0gbGVuZ3RoLAorICAgICAgICAgIGRlc3RpbmF0aW9uT2Zmc2V0LCBsZW5ndGgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiB3aGVuIGNvcHlpbmcgdG9vIG1hbnkgYnl0ZXMgb2YgYSAiCisgICAgICAgICAgKyBjbGFzc1VuZGVyVGVzdCk7CisgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIC8vIENvcHkgd2l0aCBpbGxlZ2FsIG5lZ2F0aXZlIHNvdXJjZU9mZnNldAorICAgICAgc3RyaW5nVW5kZXJUZXN0LmNvcHlUbyhkZXN0aW5hdGlvbiwgLTEsIGRlc3RpbmF0aW9uT2Zmc2V0LCBsZW5ndGgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIGEgbmVnYXRpdmUgc291cmNlT2Zmc2V0IGluICIKKyAgICAgICAgICArIGNsYXNzVW5kZXJUZXN0KTsKKyAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgLy8gQ29weSB3aXRoIGlsbGVnYWwgbmVnYXRpdmUgZGVzdGluYXRpb25PZmZzZXQKKyAgICAgIHN0cmluZ1VuZGVyVGVzdC5jb3B5VG8oZGVzdGluYXRpb24sIDAsIC0xLCBsZW5ndGgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIGEgbmVnYXRpdmUgZGVzdGluYXRpb25PZmZzZXQgaW4gIgorICAgICAgICAgICsgY2xhc3NVbmRlclRlc3QpOworICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcworICAgIH0KKworICAgIHRyeSB7CisgICAgICAvLyBDb3B5IHdpdGggaWxsZWdhbCBuZWdhdGl2ZSBzaXplCisgICAgICBzdHJpbmdVbmRlclRlc3QuY29weVRvKGRlc3RpbmF0aW9uLCAwLCAwLCAtMSk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gYSBuZWdhdGl2ZSBzaXplIGluICIKKyAgICAgICAgICArIGNsYXNzVW5kZXJUZXN0KTsKKyAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgLy8gQ29weSB3aXRoIGlsbGVnYWwgdG9vLWxhcmdlIHNvdXJjZU9mZnNldAorICAgICAgc3RyaW5nVW5kZXJUZXN0LmNvcHlUbyhkZXN0aW5hdGlvbiwgMiAqIHN0cmluZ1VuZGVyVGVzdC5zaXplKCksIDAsIGxlbmd0aCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gdGhlIGRlc3RpbmF0aW9uT2Zmc2V0IGlzIHRvbyBsYXJnZSBpbiAiCisgICAgICAgICAgKyBjbGFzc1VuZGVyVGVzdCk7CisgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIC8vIENvcHkgd2l0aCBpbGxlZ2FsIHRvby1sYXJnZSBkZXN0aW5hdGlvbk9mZnNldAorICAgICAgc3RyaW5nVW5kZXJUZXN0LmNvcHlUbyhkZXN0aW5hdGlvbiwgMCwgMiAqIGRlc3RpbmF0aW9uLmxlbmd0aCwgbGVuZ3RoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gd2hlbiB0aGUgZGVzdGluYXRpb25PZmZzZXQgaXMgdG9vIGxhcmdlIGluICIKKyAgICAgICAgICArIGNsYXNzVW5kZXJUZXN0KTsKKyAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29weVRvX0J5dGVCdWZmZXIoKSB7CisgICAgQnl0ZUJ1ZmZlciBteUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUocmVmZXJlbmNlQnl0ZXMubGVuZ3RoKTsKKyAgICBzdHJpbmdVbmRlclRlc3QuY29weVRvKG15QnVmZmVyKTsKKyAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIi5jb3B5VG8oQnl0ZUJ1ZmZlcikgbXVzdCBnaXZlIGJhY2sgdGhlIHNhbWUgYnl0ZXMiLAorICAgICAgICBBcnJheXMuZXF1YWxzKHJlZmVyZW5jZUJ5dGVzLCBteUJ1ZmZlci5hcnJheSgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWFkT25seUJ5dGVCdWZmZXIoKSB7CisgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gc3RyaW5nVW5kZXJUZXN0LmFzUmVhZE9ubHlCeXRlQnVmZmVyKCk7CisgICAgYnl0ZVtdIHJvdW5kVHJpcEJ5dGVzID0gbmV3IGJ5dGVbcmVmZXJlbmNlQnl0ZXMubGVuZ3RoXTsKKyAgICBhc3NlcnRUcnVlKGJ5dGVCdWZmZXIucmVtYWluaW5nKCkgPT0gcmVmZXJlbmNlQnl0ZXMubGVuZ3RoKTsKKyAgICBhc3NlcnRUcnVlKGJ5dGVCdWZmZXIuaXNSZWFkT25seSgpKTsKKyAgICBieXRlQnVmZmVyLmdldChyb3VuZFRyaXBCeXRlcyk7CisgICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIuYXNSZWFkT25seUJ5dGVCdWZmZXIoKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCisgICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIHJvdW5kVHJpcEJ5dGVzKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWFkT25seUJ5dGVCdWZmZXJMaXN0KCkgeworICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYnl0ZUJ1ZmZlcnMgPSBzdHJpbmdVbmRlclRlc3QuYXNSZWFkT25seUJ5dGVCdWZmZXJMaXN0KCk7CisgICAgaW50IGJ5dGVzU2VlbiA9IDA7CisgICAgYnl0ZVtdIHJvdW5kVHJpcEJ5dGVzID0gbmV3IGJ5dGVbcmVmZXJlbmNlQnl0ZXMubGVuZ3RoXTsKKyAgICBmb3IgKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA6IGJ5dGVCdWZmZXJzKSB7CisgICAgICBpbnQgdGhpc0xlbmd0aCA9IGJ5dGVCdWZmZXIucmVtYWluaW5nKCk7CisgICAgICBhc3NlcnRUcnVlKGJ5dGVCdWZmZXIuaXNSZWFkT25seSgpKTsKKyAgICAgIGFzc2VydFRydWUoYnl0ZXNTZWVuICsgdGhpc0xlbmd0aCA8PSByZWZlcmVuY2VCeXRlcy5sZW5ndGgpOworICAgICAgYnl0ZUJ1ZmZlci5nZXQocm91bmRUcmlwQnl0ZXMsIGJ5dGVzU2VlbiwgdGhpc0xlbmd0aCk7CisgICAgICBieXRlc1NlZW4gKz0gdGhpc0xlbmd0aDsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShieXRlc1NlZW4gPT0gcmVmZXJlbmNlQnl0ZXMubGVuZ3RoKTsKKyAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIi5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlclRlc3QoKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCisgICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIHJvdW5kVHJpcEJ5dGVzKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VG9CeXRlQXJyYXkoKSB7CisgICAgYnl0ZVtdIHJvdW5kVHJpcEJ5dGVzID0gc3RyaW5nVW5kZXJUZXN0LnRvQnl0ZUFycmF5KCk7CisgICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIudG9CeXRlQXJyYXkoKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCisgICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIHJvdW5kVHJpcEJ5dGVzKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUbygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBzdHJpbmdVbmRlclRlc3Qud3JpdGVUbyhib3MpOworICAgIGJ5dGVbXSByb3VuZFRyaXBCeXRlcyA9IGJvcy50b0J5dGVBcnJheSgpOworICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiLndyaXRlVG8oKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCisgICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIHJvdW5kVHJpcEJ5dGVzKSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvX211dGF0aW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgT3V0cHV0U3RyZWFtKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGxlbjsgKyt4KSB7CisgICAgICAgICAgYltvZmYgKyB4XSA9IChieXRlKSAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHsKKyAgICAgICAgLy8gUHVycG9zZWZ1bGx5IGxlZnQgYmxhbmsuCisgICAgICB9CisgICAgfTsKKworICAgIHN0cmluZ1VuZGVyVGVzdC53cml0ZVRvKG9zKTsKKyAgICBieXRlW10gbmV3Qnl0ZXMgPSBzdHJpbmdVbmRlclRlc3QudG9CeXRlQXJyYXkoKTsKKyAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIi53cml0ZVRvKCkgbXVzdCBub3QgZ3JhbnQgYWNjZXNzIHRvIHVuZGVybHlpbmcgYXJyYXkiLAorICAgICAgICBBcnJheXMuZXF1YWxzKHJlZmVyZW5jZUJ5dGVzLCBuZXdCeXRlcykpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5ld091dHB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBCeXRlU3RyaW5nLk91dHB1dCBvdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOworICAgIHN0cmluZ1VuZGVyVGVzdC53cml0ZVRvKG91dHB1dCk7CisgICAgYXNzZXJ0RXF1YWxzKCJPdXRwdXQgU2l6ZSByZXR1cm5zIGNvcnJlY3QgcmVzdWx0IiwKKyAgICAgICAgb3V0cHV0LnNpemUoKSwgc3RyaW5nVW5kZXJUZXN0LnNpemUoKSk7CisgICAgb3V0cHV0LndyaXRlVG8oYm9zKTsKKyAgICBhc3NlcnRUcnVlKCJPdXRwdXQud3JpdGVUbygpIG11c3QgZ2l2ZSBiYWNrIHRoZSBzYW1lIGJ5dGVzIiwKKyAgICAgICAgQXJyYXlzLmVxdWFscyhyZWZlcmVuY2VCeXRlcywgYm9zLnRvQnl0ZUFycmF5KCkpKTsKKworICAgIC8vIHdyaXRlIHRoZSBvdXRwdXQgc3RyZWFtIHRvIGl0c2VsZiEgVGhpcyBzaG91bGQgY2F1c2UgaXQgdG8gZG91YmxlCisgICAgb3V0cHV0LndyaXRlVG8ob3V0cHV0KTsKKyAgICBhc3NlcnRFcXVhbHMoIldyaXRpbmcgYW4gb3V0cHV0IHN0cmVhbSB0byBpdHNlbGYgaXMgc3VjY2Vzc2Z1bCIsCisgICAgICAgIHN0cmluZ1VuZGVyVGVzdC5jb25jYXQoc3RyaW5nVW5kZXJUZXN0KSwgb3V0cHV0LnRvQnl0ZVN0cmluZygpKTsKKworICAgIG91dHB1dC5yZXNldCgpOworICAgIGFzc2VydEVxdWFscygiT3V0cHV0LnJlc2V0KCkgcmVzZXRzIHRoZSBvdXRwdXQiLCAwLCBvdXRwdXQuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIk91dHB1dC5yZXNldCgpIHJlc2V0cyB0aGUgb3V0cHV0IiwKKyAgICAgICAgQnl0ZVN0cmluZy5FTVBUWSwgb3V0cHV0LnRvQnl0ZVN0cmluZygpKTsKKyAgICAKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJJIGxvdmUgdW5pY29kZSBcdTEyMzRcdTU2NzggY2hhcmFjdGVycyI7CisgICAgTGl0ZXJhbEJ5dGVTdHJpbmcgdW5pY29kZSA9IG5ldyBMaXRlcmFsQnl0ZVN0cmluZyh0ZXN0U3RyaW5nLmdldEJ5dGVzKFVURl84KSk7CisgICAgU3RyaW5nIHJvdW5kVHJpcFN0cmluZyA9IHVuaWNvZGUudG9TdHJpbmcoVVRGXzgpOworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgdW5pY29kZSBtdXN0IG1hdGNoIiwgdGVzdFN0cmluZywgcm91bmRUcmlwU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IG5vdCBlcXVhbCBudWxsIiwgZmFsc2UsIHN0cmluZ1VuZGVyVGVzdC5lcXVhbHMobnVsbCkpOworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBlcXVhbCBzZWxmIiwgc3RyaW5nVW5kZXJUZXN0LCBzdHJpbmdVbmRlclRlc3QpOworICAgIGFzc2VydEZhbHNlKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IG5vdCBlcXVhbCB0aGUgZW1wdHkgc3RyaW5nIiwKKyAgICAgICAgc3RyaW5nVW5kZXJUZXN0LmVxdWFscyhCeXRlU3RyaW5nLkVNUFRZKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBlbXB0eSBzdHJpbmdzIG11c3QgYmUgZXF1YWwiLAorICAgICAgICBuZXcgTGl0ZXJhbEJ5dGVTdHJpbmcobmV3IGJ5dGVbXXt9KSwgc3RyaW5nVW5kZXJUZXN0LnN1YnN0cmluZyg1NSwgNTUpKTsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgZXF1YWwgYW5vdGhlciBzdHJpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZSIsCisgICAgICAgIHN0cmluZ1VuZGVyVGVzdCwgbmV3IExpdGVyYWxCeXRlU3RyaW5nKHJlZmVyZW5jZUJ5dGVzKSk7CisKKyAgICBieXRlW10gbXVuZ2VkQnl0ZXMgPSBuZXcgYnl0ZVtyZWZlcmVuY2VCeXRlcy5sZW5ndGhdOworICAgIFN5c3RlbS5hcnJheWNvcHkocmVmZXJlbmNlQnl0ZXMsIDAsIG11bmdlZEJ5dGVzLCAwLCByZWZlcmVuY2VCeXRlcy5sZW5ndGgpOworICAgIG11bmdlZEJ5dGVzW211bmdlZEJ5dGVzLmxlbmd0aCAtIDVdIF49IDB4RkY7CisgICAgYXNzZXJ0RmFsc2UoY2xhc3NVbmRlclRlc3QgKyAiIG11c3Qgbm90IGVxdWFsIGV2ZXJ5IHN0cmluZyB3aXRoIHRoZSBzYW1lIGxlbmd0aCIsCisgICAgICAgIHN0cmluZ1VuZGVyVGVzdC5lcXVhbHMobmV3IExpdGVyYWxCeXRlU3RyaW5nKG11bmdlZEJ5dGVzKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgeworICAgIGludCBoYXNoID0gc3RyaW5nVW5kZXJUZXN0Lmhhc2hDb2RlKCk7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGhhdmUgZXhwZWN0ZWQgaGFzaENvZGUiLCBleHBlY3RlZEhhc2hDb2RlLCBoYXNoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQZWVrQ2FjaGVkSGFzaENvZGUoKSB7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIi5wZWVrQ2FjaGVkSGFzaENvZGUoKSBzaG91bGQgcmV0dXJuIHplcm8gYXQgZmlyc3QiLCAwLAorICAgICAgICBzdHJpbmdVbmRlclRlc3QucGVla0NhY2hlZEhhc2hDb2RlKCkpOworICAgIHN0cmluZ1VuZGVyVGVzdC5oYXNoQ29kZSgpOworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIucGVla0NhY2hlZEhhc2hDb2RlIHNob3VsZCByZXR1cm4gemVybyBhdCBmaXJzdCIsCisgICAgICAgIGV4cGVjdGVkSGFzaENvZGUsIHN0cmluZ1VuZGVyVGVzdC5wZWVrQ2FjaGVkSGFzaENvZGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbEhhc2goKSB7CisgICAgLy8gcGFydGlhbEhhc2goKSBpcyBtb3JlIHN0cmVudW91c2x5IHRlc3RlZCBlbHNld2hlcmUgYnkgdGVzdGluZyBoYXNoZXMgb2Ygc3Vic3RyaW5ncy4KKyAgICAvLyBUaGlzIHRlc3Qgd291bGQgZmFpbCBpZiB0aGUgZXhwZWN0ZWQgaGFzaCB3ZXJlIDEuICBJdCdzIG5vdC4KKyAgICBpbnQgaGFzaCA9IHN0cmluZ1VuZGVyVGVzdC5wYXJ0aWFsSGFzaChzdHJpbmdVbmRlclRlc3Quc2l6ZSgpLCAwLCBzdHJpbmdVbmRlclRlc3Quc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiLnBhcnRpYWxIYXNoKCkgbXVzdCB5aWVsZCBleHBlY3RlZCBoYXNoQ29kZSIsCisgICAgICAgIGV4cGVjdGVkSGFzaENvZGUsIGhhc2gpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5ld0lucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHN0cmluZ1VuZGVyVGVzdC5uZXdJbnB1dCgpOworICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgcmV0dXJucyBjb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgc3RyaW5nVW5kZXJUZXN0LnNpemUoKSwgaW5wdXQuYXZhaWxhYmxlKCkpOworICAgIGJvb2xlYW4gc3RpbGxFcXVhbCA9IHRydWU7CisgICAgZm9yIChieXRlIHJlZmVyZW5jZUJ5dGUgOiByZWZlcmVuY2VCeXRlcykgeworICAgICAgaW50IGV4cGVjdGVkSW50ID0gKHJlZmVyZW5jZUJ5dGUgJiAweEZGKTsKKyAgICAgIHN0aWxsRXF1YWwgPSAoZXhwZWN0ZWRJbnQgPT0gaW5wdXQucmVhZCgpKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSByZXR1cm5zIGNvcnJlY3QgdmFsdWUiLAorICAgICAgICAwLCBpbnB1dC5hdmFpbGFibGUoKSk7CisgICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBnaXZlIHRoZSBzYW1lIGJ5dGVzIGZyb20gdGhlIElucHV0U3RyZWFtIiwgc3RpbGxFcXVhbCk7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBJbnB1dFN0cmVhbSBtdXN0IG5vdyBiZSBleGhhdXN0ZWQiLCAtMSwgaW5wdXQucmVhZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROZXdJbnB1dF9za2lwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHN0cmluZ1VuZGVyVGVzdC5uZXdJbnB1dCgpOworICAgIGludCBzdHJpbmdTaXplID0gc3RyaW5nVW5kZXJUZXN0LnNpemUoKTsKKyAgICBpbnQgbmVhckVuZEluZGV4ID0gc3RyaW5nU2l6ZSAqIDIgLyAzOworICAgIGxvbmcgc2tpcHBlZDEgPSBpbnB1dC5za2lwKG5lYXJFbmRJbmRleCk7CisgICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5za2lwKCkiLCBza2lwcGVkMSwgbmVhckVuZEluZGV4KTsKKyAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLmF2YWlsYWJsZSgpIiwKKyAgICAgICAgc3RyaW5nU2l6ZSAtIHNraXBwZWQxLCBpbnB1dC5hdmFpbGFibGUoKSk7CisgICAgYXNzZXJ0VHJ1ZSgiSW5wdXRTdHJlYW0ubWFyaygpIGlzIGF2YWlsYWJsZSIsIGlucHV0Lm1hcmtTdXBwb3J0ZWQoKSk7CisgICAgaW5wdXQubWFyaygwKTsKKyAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLnNraXAoKSwgcmVhZCgpIiwKKyAgICAgICAgc3RyaW5nVW5kZXJUZXN0LmJ5dGVBdChuZWFyRW5kSW5kZXgpICYgMHhGRiwgaW5wdXQucmVhZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLmF2YWlsYWJsZSgpIiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nU2l6ZSAtIHNraXBwZWQxIC0gMSwgaW5wdXQuYXZhaWxhYmxlKCkpOworICAgIGxvbmcgc2tpcHBlZDIgPSBpbnB1dC5za2lwKHN0cmluZ1NpemUpOworICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0uc2tpcCgpIGluY29tcGxldGUiLAorICAgICAgICBza2lwcGVkMiwgc3RyaW5nU2l6ZSAtIHNraXBwZWQxIC0gMSk7CisgICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5za2lwKCksIG5vIG1vcmUgaW5wdXQiLCAwLCBpbnB1dC5hdmFpbGFibGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5za2lwKCksIG5vIG1vcmUgaW5wdXQiLCAtMSwgaW5wdXQucmVhZCgpKTsKKyAgICBpbnB1dC5yZXNldCgpOworICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0ucmVzZXQoKSBzdWNjZWRlZCIsCisgICAgICAgICAgICAgICAgIHN0cmluZ1NpemUgLSBza2lwcGVkMSwgaW5wdXQuYXZhaWxhYmxlKCkpOworICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0ucmVzZXQoKSwgcmVhZCgpIiwKKyAgICAgICAgc3RyaW5nVW5kZXJUZXN0LmJ5dGVBdChuZWFyRW5kSW5kZXgpICYgMHhGRiwgaW5wdXQucmVhZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROZXdDb2RlZElucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNpcyA9IHN0cmluZ1VuZGVyVGVzdC5uZXdDb2RlZElucHV0KCk7CisgICAgYnl0ZVtdIHJvdW5kVHJpcEJ5dGVzID0gY2lzLnJlYWRSYXdCeXRlcyhyZWZlcmVuY2VCeXRlcy5sZW5ndGgpOworICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgZ2l2ZSB0aGUgc2FtZSBieXRlcyBiYWNrIGZyb20gdGhlIENvZGVkSW5wdXRTdHJlYW0iLAorICAgICAgICBBcnJheXMuZXF1YWxzKHJlZmVyZW5jZUJ5dGVzLCByb3VuZFRyaXBCeXRlcykpOworICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiIENvZGVkSW5wdXRTdHJlYW0gbXVzdCBub3cgYmUgZXhoYXVzdGVkIiwgY2lzLmlzQXRFbmQoKSk7CisgIH0KKworICAvKioKKyAgICogTWFrZSBzdXJlIHdlIGtlZXAgdGhpbmdzIHNpbXBsZSB3aGVuIGNvbmNhdGVuYXRpbmcgd2l0aCBlbXB0eS4gU2VlIGFsc28KKyAgICoge0BsaW5rIEJ5dGVTdHJpbmdUZXN0I3Rlc3RDb25jYXRfZW1wdHkoKX0uCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0X2VtcHR5KCkgeworICAgIGFzc2VydFNhbWUoY2xhc3NVbmRlclRlc3QgKyAiIGNvbmNhdGVuYXRlZCB3aXRoIGVtcHR5IG11c3QgZ2l2ZSAiICsgY2xhc3NVbmRlclRlc3QsCisgICAgICAgIHN0cmluZ1VuZGVyVGVzdC5jb25jYXQoQnl0ZVN0cmluZy5FTVBUWSksIHN0cmluZ1VuZGVyVGVzdCk7CisgICAgYXNzZXJ0U2FtZSgiZW1wdHkgY29uY2F0ZW5hdGVkIHdpdGggIiArIGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGdpdmUgIiArIGNsYXNzVW5kZXJUZXN0LAorICAgICAgICBCeXRlU3RyaW5nLkVNUFRZLmNvbmNhdChzdHJpbmdVbmRlclRlc3QpLCBzdHJpbmdVbmRlclRlc3QpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3ZmVkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDM1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZDsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZEZvcmVpZ247CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1pc2MuIHVuaXQgdGVzdHMgZm9yIG1lc3NhZ2Ugb3BlcmF0aW9ucyB0aGF0IGFwcGx5IHRvIGJvdGggZ2VuZXJhdGVkCisgKiBhbmQgZHluYW1pYyBtZXNzYWdlcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIE1lc3NhZ2UtbWVyZ2luZyB0ZXN0cy4KKworICBzdGF0aWMgZmluYWwgVGVzdEFsbFR5cGVzIE1FUkdFX1NPVVJDRSA9CisgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgLnNldE9wdGlvbmFsSW50MzIoMSkKKyAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiZm9vIikKKyAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQorICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJiYXIiKQorICAgICAgLmJ1aWxkKCk7CisKKyAgc3RhdGljIGZpbmFsIFRlc3RBbGxUeXBlcyBNRVJHRV9ERVNUID0KKyAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAuc2V0T3B0aW9uYWxJbnQ2NCgyKQorICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJiYXoiKQorICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMykuYnVpbGQoKSkKKyAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygicXV4IikKKyAgICAgIC5idWlsZCgpOworCisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfUkVTVUxUX1RFWFQgPQorICAgICAgIm9wdGlvbmFsX2ludDMyOiAxXG4iICsKKyAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIiArCisgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiXG4iICsKKyAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2Uge1xuIiArCisgICAgICAiICBjOiAzXG4iICsKKyAgICAgICJ9XG4iICsKKyAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwicXV4XCJcbiIgKworICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJiYXJcIlxuIjsKKworICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIHJlc3VsdCA9CisgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcihNRVJHRV9ERVNUKQorICAgICAgICAubWVyZ2VGcm9tKE1FUkdFX1NPVVJDRSkuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscyhNRVJHRV9SRVNVTFRfVEVYVCwgcmVzdWx0LnRvU3RyaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqIFRlc3QgbWVyZ2luZyBhIER5bmFtaWNNZXNzYWdlIGludG8gYSBHZW5lcmF0ZWRNZXNzYWdlLiAgQXMgbG9uZyBhcyB0aGV5CisgICAqIGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciwgdGhpcyBzaG91bGQgd29yaywgYnV0IGl0IGlzIGFuIGVudGlyZWx5IGRpZmZlcmVudAorICAgKiBjb2RlIHBhdGguCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tRHluYW1pYygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcyByZXN1bHQgPQorICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoTUVSR0VfREVTVCkKKyAgICAgICAgLm1lcmdlRnJvbShEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKE1FUkdFX1NPVVJDRSkuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoTUVSR0VfUkVTVUxUX1RFWFQsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgfQorCisgIC8qKiBUZXN0IG1lcmdpbmcgdHdvIER5bmFtaWNNZXNzYWdlcy4gKi8KKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEeW5hbWljTWVzc2FnZSByZXN1bHQgPQorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihNRVJHRV9ERVNUKQorICAgICAgICAubWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoTUVSR0VfU09VUkNFKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscyhNRVJHRV9SRVNVTFRfVEVYVCwgcmVzdWx0LnRvU3RyaW5nKCkpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gUmVxdWlyZWQtZmllbGQtcmVsYXRlZCB0ZXN0cy4KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXN0UmVxdWlyZWQgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEID0KKyAgICBUZXN0UmVxdWlyZWQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RSZXF1aXJlZCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEID0KKyAgICBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpLnNldEEoMSkuc2V0QigyKS5zZXRDKDMpLmJ1aWxkKCk7CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFJlcXVpcmVkLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCk7CisKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYnVpbGRlci5zZXRBKDEpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBidWlsZGVyLnNldEIoMSk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGJ1aWxkZXIuc2V0QygxKTsKKyAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZEZvcmVpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0UmVxdWlyZWRGb3JlaWduLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpOworCisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLnNldFJlcGVhdGVkTWVzc2FnZSgwLCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZEV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKKworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdFJlcXVpcmVkLnNpbmdsZSwgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0UmVxdWlyZWQuc2luZ2xlLCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFRlc3RSZXF1aXJlZC5tdWx0aSwgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0UmVxdWlyZWQubXVsdGksIDAsIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkRHluYW1pYygpIHRocm93cyBFeGNlcHRpb24geworICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCk7CisgICAgRHluYW1pY01lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihkZXNjcmlwdG9yKTsKKworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJhIiksIDEpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJiIiksIDEpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJjIiksIDEpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkRHluYW1pY0ZvcmVpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0UmVxdWlyZWRGb3JlaWduLmdldERlc2NyaXB0b3IoKTsKKyAgICBEeW5hbWljTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKGRlc2NyaXB0b3IpOworCisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9tZXNzYWdlIiksCisgICAgICAgICAgICAgICAgICAgICBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX21lc3NhZ2UiKSwKKyAgICAgICAgICAgICAgICAgICAgIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9tZXNzYWdlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9tZXNzYWdlIiksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuaW5pdGlhbGl6ZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgVGVzdFJlcXVpcmVkLm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJ1aWxkUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFdlJ3JlIG1vc3RseSB0ZXN0aW5nIHRoYXQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBUZXN0UmVxdWlyZWQgbWVzc2FnZSA9IFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7CisgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFVuaW5pdGlhbGl6ZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCisgICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQorICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIgKworICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5hLCAiICsKKyAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYiwgIiArCisgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmMsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5hLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYiwgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmMsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5hLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYiwgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmMiLAorICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJ1aWxkTmVzdGVkUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFdlJ3JlIG1vc3RseSB0ZXN0aW5nIHRoYXQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2UgPQorICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCisgICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQorICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKKyAgICAgICAgLmJ1aWxkUGFydGlhbCgpOworICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVuaXRpdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgVGVzdFJlcXVpcmVkLnBhcnNlRnJvbShCeXRlU3RyaW5nLkVNUFRZKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VOZXN0ZWRVbml0aXRpYWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBkYXRhID0KKyAgICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQorICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKKyAgICAgICAgLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCisgICAgICAgIC5idWlsZFBhcnRpYWwoKS50b0J5dGVTdHJpbmcoKTsKKworICAgIHRyeSB7CisgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLnBhcnNlRnJvbShkYXRhKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIgKworICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5hLCAiICsKKyAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYiwgIiArCisgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmMsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5hLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYiwgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmMsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5hLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYiwgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmMiLAorICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNVbmluaXRpYWxpemVkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKSkuYnVpbGQoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBhLCBiLCBjIiwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljQnVpbGRQYXJ0aWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gV2UncmUgbW9zdGx5IHRlc3RpbmcgdGhhdCBubyBleGNlcHRpb24gaXMgdGhyb3duLgorICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPQorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpKQorICAgICAgICAuYnVpbGRQYXJ0aWFsKCk7CisgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNQYXJzZVVuaXRpdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKTsKKyAgICAgIER5bmFtaWNNZXNzYWdlLnBhcnNlRnJvbShkZXNjcmlwdG9yLCBCeXRlU3RyaW5nLkVNUFRZKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKyAgCisgIC8qKiBUZXN0IHJlYWRpbmcgdW5zZXQgcmVwZWF0ZWQgbWVzc2FnZSBmcm9tIER5bmFtaWNNZXNzYWdlLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1JlcGVhdGVkTWVzc2FnZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpOworICAgIER5bmFtaWNNZXNzYWdlIHJlc3VsdCA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpCisgICAgICAgIC5tZXJnZUZyb20oRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihNRVJHRV9TT1VSQ0UpLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0RmllbGQocmVzdWx0LmdldERlc2NyaXB0b3JGb3JUeXBlKCkKKyAgICAgICAgLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpIGluc3RhbmNlb2YgTGlzdDw/Pik7CisgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRSZXBlYXRlZEZpZWxkQ291bnQocmVzdWx0LmdldERlc2NyaXB0b3JGb3JUeXBlKCkKKyAgICAgICAgLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpLCAwKTsKKyAgfQorICAKKyAgLyoqIFRlc3QgcmVhZGluZyByZXBlYXRlZCBtZXNzYWdlIGZyb20gRHluYW1pY01lc3NhZ2UuICovCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljUmVwZWF0ZWRNZXNzYWdlTm90TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgVGVzdEFsbFR5cGVzIFJFUEVBVEVEX05FU1RFRCA9CisgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRPcHRpb25hbEludDMyKDEpCisgICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiZm9vIikKKyAgICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCisgICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygiYmFyIikKKyAgICAgICAgLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCisgICAgICAgIC5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpOworICAgIER5bmFtaWNNZXNzYWdlIHJlc3VsdCA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpCisgICAgICAgIC5tZXJnZUZyb20oRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihSRVBFQVRFRF9ORVNURUQpLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0RmllbGQocmVzdWx0LmdldERlc2NyaXB0b3JGb3JUeXBlKCkKKyAgICAgICAgLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpIGluc3RhbmNlb2YgTGlzdDw/Pik7CisgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRSZXBlYXRlZEZpZWxkQ291bnQocmVzdWx0LmdldERlc2NyaXB0b3JGb3JUeXBlKCkKKyAgICAgICAgLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpLCAyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OZXN0ZWRCdWlsZGVyc1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmVzdGVkQnVpbGRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzNzU4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmVzdGVkQnVpbGRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlZlaGljbGU7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuV2hlZWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFRlc3QgY2FzZXMgdGhhdCBleGVyY2lzZSBlbmQtdG8tZW5kIHVzZSBjYXNlcyBpbnZvbHZpbmcKKyAqIHtAbGluayBTaW5nbGVGaWVsZEJ1aWxkZXJ9IGFuZCB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9LgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgTmVzdGVkQnVpbGRlcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlc0FuZEJ1aWxkZXJzKCkgeworICAgIFZlaGljbGUuQnVpbGRlciB2ZWhpY2xlQnVpbGRlciA9IFZlaGljbGUubmV3QnVpbGRlcigpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDEpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDIpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDMpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDQpOworICAgIHZlaGljbGVCdWlsZGVyLmdldEVuZ2luZUJ1aWxkZXIoKQorICAgICAgICAuc2V0TGl0ZXJzKDEwKTsKKworICAgIFZlaGljbGUgdmVoaWNsZSA9IHZlaGljbGVCdWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIHZlaGljbGUuZ2V0V2hlZWxDb3VudCgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgV2hlZWwgd2hlZWwgPSB2ZWhpY2xlLmdldFdoZWVsKGkpOworICAgICAgYXNzZXJ0RXF1YWxzKDQsIHdoZWVsLmdldFJhZGl1cygpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpICsgMSwgd2hlZWwuZ2V0V2lkdGgoKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscygxMCwgdmVoaWNsZS5nZXRFbmdpbmUoKS5nZXRMaXRlcnMoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxCdWlsZGVyKGkpCisgICAgICAgICAgLnNldFJhZGl1cyg1KQorICAgICAgICAgIC5zZXRXaWR0aChpICsgMTApOworICAgIH0KKyAgICB2ZWhpY2xlQnVpbGRlci5nZXRFbmdpbmVCdWlsZGVyKCkuc2V0TGl0ZXJzKDIwKTsKKworICAgIHZlaGljbGUgPSB2ZWhpY2xlQnVpbGRlci5idWlsZCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBXaGVlbCB3aGVlbCA9IHZlaGljbGUuZ2V0V2hlZWwoaSk7CisgICAgICBhc3NlcnRFcXVhbHMoNSwgd2hlZWwuZ2V0UmFkaXVzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAxMCwgd2hlZWwuZ2V0V2lkdGgoKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscygyMCwgdmVoaWNsZS5nZXRFbmdpbmUoKS5nZXRMaXRlcnMoKSk7CisgICAgYXNzZXJ0VHJ1ZSh2ZWhpY2xlLmhhc0VuZ2luZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlc0FyZUNhY2hlZCgpIHsKKyAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDEpCisgICAgICAgIC5zZXRXaWR0aCgyKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDMpCisgICAgICAgIC5zZXRXaWR0aCg0KTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDUpCisgICAgICAgIC5zZXRXaWR0aCg2KTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDcpCisgICAgICAgIC5zZXRXaWR0aCg4KTsKKworICAgIC8vIE1ha2Ugc3VyZSBtZXNzYWdlcyBhcmUgY2FjaGVkLgorICAgIExpc3Q8V2hlZWw+IHdoZWVscyA9IG5ldyBBcnJheUxpc3Q8V2hlZWw+KHZlaGljbGVCdWlsZGVyLmdldFdoZWVsTGlzdCgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHdoZWVscy5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7CisgICAgfQorCisgICAgLy8gTm93IGdldCBidWlsZGVycyBhbmQgY2hlY2sgdGhleSBkaWRuJ3QgY2hhbmdlLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2hlZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aGVlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydFNhbWUod2hlZWxzLmdldChpKSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoaSkpOworICAgIH0KKworICAgIC8vIENoYW5nZSBqdXN0IG9uZQorICAgIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsQnVpbGRlcigzKQorICAgICAgICAuc2V0UmFkaXVzKDIwKS5zZXRXaWR0aCgyMCk7CisKKyAgICAvLyBOb3cgZ2V0IHdoZWVscyBhbmQgY2hlY2sgdGhhdCBvbmx5IHRoYXQgb25lIGNoYW5nZWQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHdoZWVscy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKGkgPCAzKSB7CisgICAgICAgIGFzc2VydFNhbWUod2hlZWxzLmdldChpKSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoaSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlbW92ZV9XaXRoTmVzdGVkQnVpbGRlcnMoKSB7CisgICAgVmVoaWNsZS5CdWlsZGVyIHZlaGljbGVCdWlsZGVyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCk7CisgICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKKyAgICAgICAgLnNldFJhZGl1cygxKQorICAgICAgICAuc2V0V2lkdGgoMSk7CisgICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKKyAgICAgICAgLnNldFJhZGl1cygyKQorICAgICAgICAuc2V0V2lkdGgoMik7CisgICAgdmVoaWNsZUJ1aWxkZXIucmVtb3ZlV2hlZWwoMCk7CisKKyAgICBhc3NlcnRFcXVhbHMoMSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoMCkuZ2V0UmFkaXVzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlbW92ZV9XaXRoTmVzdGVkTWVzc2FnZXMoKSB7CisgICAgVmVoaWNsZS5CdWlsZGVyIHZlaGljbGVCdWlsZGVyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCk7CisgICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWwoV2hlZWwubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoMSkKKyAgICAgICAgLnNldFdpZHRoKDEpKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbChXaGVlbC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldFJhZGl1cygyKQorICAgICAgICAuc2V0V2lkdGgoMikpOworICAgIHZlaGljbGVCdWlsZGVyLnJlbW92ZVdoZWVsKDApOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsKDApLmdldFJhZGl1cygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHsKKyAgICBWZWhpY2xlIHZlaGljbGUxID0gVmVoaWNsZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZFdoZWVsKFdoZWVsLm5ld0J1aWxkZXIoKS5zZXRSYWRpdXMoMSkuYnVpbGQoKSkKKyAgICAgICAgLmFkZFdoZWVsKFdoZWVsLm5ld0J1aWxkZXIoKS5zZXRSYWRpdXMoMikuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBWZWhpY2xlIHZlaGljbGUyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLm1lcmdlRnJvbSh2ZWhpY2xlMSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgLy8gTGlzdCBzaG91bGQgYmUgdGhlIHNhbWUgLS0gbm8gYWxsb2NhdGlvbgorICAgIGFzc2VydFNhbWUodmVoaWNsZTEuZ2V0V2hlZWxMaXN0KCksIHZlaGljbGUyLmdldFdoZWVsTGlzdCgpKTsKKworICAgIFZlaGljbGUgdmVoaWNsZTMgPSB2ZWhpY2xlMS50b0J1aWxkZXIoKS5idWlsZCgpOworICAgIGFzc2VydFNhbWUodmVoaWNsZTEuZ2V0V2hlZWxMaXN0KCksIHZlaGljbGUzLmdldFdoZWVsTGlzdCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXR0aW5nQnVpbGRlck1hcmtzRmllbGRBc0hhdmluZygpIHsKKyAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5nZXRFbmdpbmVCdWlsZGVyKCk7CisgICAgVmVoaWNsZSB2ZWhpY2xlID0gdmVoaWNsZUJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYXNzZXJ0VHJ1ZSh2ZWhpY2xlLmhhc0VuZ2luZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9QYXJzZXJUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1BhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY5MDJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9QYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNzUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxUeXBlc0xpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RQYXJzaW5nTWVyZ2VMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0T3B0aW1pemVGb3IuVGVzdE9wdGltaXplZEZvclNpemU7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RPcHRpbWl6ZUZvci5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0T3B0aW1pemVGb3I7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQ7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFyc2luZ01lcmdlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHtAbGluayBQYXJzZXJ9LgorICoKKyAqIEBhdXRob3IgbGl1amlzaUBnb29nbGUuY29tIChQaGVybCBMaXUpCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVkTWVzc2FnZVBhcnNlclNpbmdsZXRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5QQVJTRVIsCisgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0UGFyc2VyRm9yVHlwZSgpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKE1lc3NhZ2VMaXRlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBtZXNzYWdlLnRvQnl0ZUFycmF5KCk7CisgICAgZmluYWwgaW50IG9mZnNldCA9IDIwOworICAgIGZpbmFsIGludCBsZW5ndGggPSBkYXRhLmxlbmd0aDsKKyAgICBmaW5hbCBpbnQgcGFkZGluZyA9IDMwOworICAgIFBhcnNlcjw/IGV4dGVuZHMgTWVzc2FnZUxpdGU+IHBhcnNlciA9IG1lc3NhZ2UuZ2V0UGFyc2VyRm9yVHlwZSgpOworICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbShkYXRhLCByZWdpc3RyeSkpOworICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbSgKKyAgICAgICAgZ2VuZXJhdGVQYWRkaW5nQXJyYXkoZGF0YSwgb2Zmc2V0LCBwYWRkaW5nKSwKKyAgICAgICAgb2Zmc2V0LCBsZW5ndGgsIHJlZ2lzdHJ5KSk7CisgICAgYXNzZXJ0TWVzc2FnZUVxdWFscyhtZXNzYWdlLCBwYXJzZXIucGFyc2VGcm9tKAorICAgICAgICBtZXNzYWdlLnRvQnl0ZVN0cmluZygpLCByZWdpc3RyeSkpOworICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbSgKKyAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpLCByZWdpc3RyeSkpOworICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbSgKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKSwgcmVnaXN0cnkpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoTWVzc2FnZUxpdGUgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBtZXNzYWdlLnRvQnl0ZUFycmF5KCk7CisgICAgZmluYWwgaW50IG9mZnNldCA9IDIwOworICAgIGZpbmFsIGludCBsZW5ndGggPSBkYXRhLmxlbmd0aDsKKyAgICBmaW5hbCBpbnQgcGFkZGluZyA9IDMwOworICAgIFBhcnNlcjw/IGV4dGVuZHMgTWVzc2FnZUxpdGU+IHBhcnNlciA9IG1lc3NhZ2UuZ2V0UGFyc2VyRm9yVHlwZSgpOworICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbShkYXRhKSk7CisgICAgYXNzZXJ0TWVzc2FnZUVxdWFscyhtZXNzYWdlLCBwYXJzZXIucGFyc2VGcm9tKAorICAgICAgICBnZW5lcmF0ZVBhZGRpbmdBcnJheShkYXRhLCBvZmZzZXQsIHBhZGRpbmcpLAorICAgICAgICBvZmZzZXQsIGxlbmd0aCkpOworICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbShtZXNzYWdlLnRvQnl0ZVN0cmluZygpKSk7CisgICAgYXNzZXJ0TWVzc2FnZUVxdWFscyhtZXNzYWdlLCBwYXJzZXIucGFyc2VGcm9tKAorICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSkpKTsKKyAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKG1lc3NhZ2UsIHBhcnNlci5wYXJzZUZyb20oCisgICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSkpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRNZXNzYWdlRXF1YWxzKE1lc3NhZ2VMaXRlIGV4cGVjdGVkLCBNZXNzYWdlTGl0ZSBhY3R1YWwpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpZiAoZXhwZWN0ZWQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC50b0J5dGVTdHJpbmcoKSwgYWN0dWFsLnRvQnl0ZVN0cmluZygpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBnZW5lcmF0ZVBhZGRpbmdBcnJheShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IHBhZGRpbmcpIHsKKyAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbb2Zmc2V0ICsgZGF0YS5sZW5ndGggKyBwYWRkaW5nXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHJlc3VsdCwgb2Zmc2V0LCBkYXRhLmxlbmd0aCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKFRlc3RVdGlsLmdldEFsbFNldCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVBhcnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBQYXJzZXI8VGVzdFJlcXVpcmVkPiBwYXJzZXIgPSBUZXN0UmVxdWlyZWQuUEFSU0VSOworICAgIGZpbmFsIFN0cmluZyBlcnJvclN0cmluZyA9CisgICAgICAgICJTaG91bGQgdGhyb3cgZXhjZXB0aW9ucyB3aGVuIHRoZSBwYXJzZWQgbWVzc2FnZSBpc24ndCBpbml0aWFsaXplZC4iOworCisgICAgLy8gVGVzdFJlcXVpcmVkLmIgYW5kIFRlc3RSZXF1aXJlZC5jIGFyZSBub3Qgc2V0LgorICAgIFRlc3RSZXF1aXJlZCBwYXJ0aWFsTWVzc2FnZSA9IFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEEoMSkuYnVpbGRQYXJ0aWFsKCk7CisKKyAgICAvLyBwYXJzZVBhcnRpYWxGcm9tIHNob3VsZCBwYXNzLgorICAgIGJ5dGVbXSBkYXRhID0gcGFydGlhbE1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKKyAgICBhc3NlcnRFcXVhbHMocGFydGlhbE1lc3NhZ2UsIHBhcnNlci5wYXJzZVBhcnRpYWxGcm9tKGRhdGEpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFydGlhbE1lc3NhZ2UsIHBhcnNlci5wYXJzZVBhcnRpYWxGcm9tKAorICAgICAgICBwYXJ0aWFsTWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOworICAgIGFzc2VydEVxdWFscyhwYXJ0aWFsTWVzc2FnZSwgcGFyc2VyLnBhcnNlUGFydGlhbEZyb20oCisgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSkpOworICAgIGFzc2VydEVxdWFscyhwYXJ0aWFsTWVzc2FnZSwgcGFyc2VyLnBhcnNlUGFydGlhbEZyb20oCisgICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSkpKTsKKworICAgIC8vIHBhcnNlRnJvbShCeXRlQXJyYXkpCisgICAgdHJ5IHsKKyAgICAgIHBhcnNlci5wYXJzZUZyb20ocGFydGlhbE1lc3NhZ2UudG9CeXRlQXJyYXkoKSk7CisgICAgICBmYWlsKGVycm9yU3RyaW5nKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gcGFzcy4KKyAgICB9CisKKyAgICAvLyBwYXJzZUZyb20oQnl0ZVN0cmluZykKKyAgICB0cnkgeworICAgICAgcGFyc2VyLnBhcnNlRnJvbShwYXJ0aWFsTWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7CisgICAgICBmYWlsKGVycm9yU3RyaW5nKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gcGFzcy4KKyAgICB9CisKKyAgICAvLyBwYXJzZUZyb20oSW5wdXRTdHJlYW0pCisgICAgdHJ5IHsKKyAgICAgIHBhcnNlci5wYXJzZUZyb20obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBhcnRpYWxNZXNzYWdlLnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgIGZhaWwoZXJyb3JTdHJpbmcpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHBhc3MuCisgICAgfQorCisgICAgLy8gcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pCisgICAgdHJ5IHsKKyAgICAgIHBhcnNlci5wYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKKyAgICAgICAgICBwYXJ0aWFsTWVzc2FnZS50b0J5dGVBcnJheSgpKSk7CisgICAgICBmYWlsKGVycm9yU3RyaW5nKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBwYXNzLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKKyAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsTGl0ZUV4dGVuc2lvbnNTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpKTsKKyAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoVGVzdFV0aWwuZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKKyAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoVGVzdFV0aWwuZ2V0TGl0ZVBhY2tlZEV4dGVuc2lvbnNTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRGVsaW1pdGVkVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBXcml0ZSBub3JtYWwgTWVzc2FnZS4KKyAgICBUZXN0QWxsVHlwZXMgbm9ybWFsTWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgbm9ybWFsTWVzc2FnZS53cml0ZURlbGltaXRlZFRvKG91dHB1dCk7CisKKyAgICAvLyBXcml0ZSBNZXNzYWdlTGl0ZSB3aXRoIHBhY2tlZCBleHRlbnNpb24gZmllbGRzLgorICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBwYWNrZWRNZXNzYWdlID0KKyAgICAgICAgVGVzdFV0aWwuZ2V0TGl0ZVBhY2tlZEV4dGVuc2lvbnNTZXQoKTsKKyAgICBwYWNrZWRNZXNzYWdlLndyaXRlRGVsaW1pdGVkVG8ob3V0cHV0KTsKKworICAgIElucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dC50b0J5dGVBcnJheSgpKTsKKyAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKAorICAgICAgICBub3JtYWxNZXNzYWdlLAorICAgICAgICBub3JtYWxNZXNzYWdlLmdldFBhcnNlckZvclR5cGUoKS5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQpKTsKKyAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKAorICAgICAgICBwYWNrZWRNZXNzYWdlLAorICAgICAgICBwYWNrZWRNZXNzYWdlLmdldFBhcnNlckZvclR5cGUoKS5wYXJzZURlbGltaXRlZEZyb20oCisgICAgICAgICAgICBpbnB1dCwgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVua25vd25GaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBBbGwgZmllbGRzIHdpbGwgYmUgdHJlYXRlZCBhcyB1bmtub3duIGZpZWxkcyBpbiBlbXB0eU1lc3NhZ2UuCisgICAgVGVzdEVtcHR5TWVzc2FnZSBlbXB0eU1lc3NhZ2UgPSBUZXN0RW1wdHlNZXNzYWdlLlBBUlNFUi5wYXJzZUZyb20oCisgICAgICAgIFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpLAorICAgICAgICBlbXB0eU1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9wdGltaXplRm9yU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKTsKKyAgICBidWlsZGVyLnNldEkoMTIpLnNldE1zZyhGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygzNCkuYnVpbGQoKSk7CisgICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdE9wdGltaXplZEZvclNpemUudGVzdEV4dGVuc2lvbiwgNTYpOworICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFRlc3RPcHRpbWl6ZWRGb3JTaXplLnRlc3RFeHRlbnNpb24yLAorICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRYKDc4KS5idWlsZCgpKTsKKworICAgIFRlc3RPcHRpbWl6ZWRGb3JTaXplIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOworICAgIFVuaXR0ZXN0T3B0aW1pemVGb3IucmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsKKworICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlLCByZWdpc3RyeSk7CisgIH0KKworICAvKiogSGVscGVyIG1ldGhvZCBmb3Ige0BsaW5rICN0ZXN0UGFyc2luZ01lcmdlKCl9LiovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRNZXNzYWdlTWVyZ2VkKFRlc3RBbGxUeXBlcyBhbGxUeXBlcykKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygzLCBhbGxUeXBlcy5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygyLCBhbGxUeXBlcy5nZXRPcHRpb25hbEludDY0KCkpOworICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBhbGxUeXBlcy5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgfQorCisgIC8qKiBIZWxwZXIgbWV0aG9kIGZvciB7QGxpbmsgI3Rlc3RQYXJzaW5nTWVyZ2VMaXRlKCl9LiovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRNZXNzYWdlTWVyZ2VkKFRlc3RBbGxUeXBlc0xpdGUgYWxsVHlwZXMpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoMywgYWxsVHlwZXMuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgYWxsVHlwZXMuZ2V0T3B0aW9uYWxJbnQ2NCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgYWxsVHlwZXMuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZ01lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQnVpbGQgbWVzc2FnZXMuCisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdEFsbFR5cGVzIG1zZzEgPSBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMSkuYnVpbGQoKTsKKyAgICBidWlsZGVyLmNsZWFyKCk7CisgICAgVGVzdEFsbFR5cGVzIG1zZzIgPSBidWlsZGVyLnNldE9wdGlvbmFsSW50NjQoMikuYnVpbGQoKTsKKyAgICBidWlsZGVyLmNsZWFyKCk7CisgICAgVGVzdEFsbFR5cGVzIG1zZzMgPSBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMykKKyAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJoZWxsbyIpLmJ1aWxkKCk7CisKKyAgICAvLyBCdWlsZCBncm91cHMuCisgICAgVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDEgb3B0aW9uYWxHMSA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzEpLmJ1aWxkKCk7CisgICAgVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDEgb3B0aW9uYWxHMiA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzIpLmJ1aWxkKCk7CisgICAgVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDEgb3B0aW9uYWxHMyA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzMpLmJ1aWxkKCk7CisgICAgVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDIgcmVwZWF0ZWRHMSA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzEpLmJ1aWxkKCk7CisgICAgVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDIgcmVwZWF0ZWRHMiA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzIpLmJ1aWxkKCk7CisgICAgVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDIgcmVwZWF0ZWRHMyA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzMpLmJ1aWxkKCk7CisKKyAgICAvLyBBc3NpZ24gYW5kIHNlcmlhbGl6ZSBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvci4KKyAgICBCeXRlU3RyaW5nIGRhdGEgPSBUZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLm5ld0J1aWxkZXIoKQorICAgICAgICAuYWRkRmllbGQxKG1zZzEpLmFkZEZpZWxkMShtc2cyKS5hZGRGaWVsZDEobXNnMykKKyAgICAgICAgLmFkZEZpZWxkMihtc2cxKS5hZGRGaWVsZDIobXNnMikuYWRkRmllbGQyKG1zZzMpCisgICAgICAgIC5hZGRGaWVsZDMobXNnMSkuYWRkRmllbGQzKG1zZzIpLmFkZEZpZWxkMyhtc2czKQorICAgICAgICAuYWRkR3JvdXAxKG9wdGlvbmFsRzEpLmFkZEdyb3VwMShvcHRpb25hbEcyKS5hZGRHcm91cDEob3B0aW9uYWxHMykKKyAgICAgICAgLmFkZEdyb3VwMihyZXBlYXRlZEcxKS5hZGRHcm91cDIocmVwZWF0ZWRHMikuYWRkR3JvdXAyKHJlcGVhdGVkRzMpCisgICAgICAgIC5hZGRFeHQxKG1zZzEpLmFkZEV4dDEobXNnMikuYWRkRXh0MShtc2czKQorICAgICAgICAuYWRkRXh0Mihtc2cxKS5hZGRFeHQyKG1zZzIpLmFkZEV4dDIobXNnMykKKyAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7CisKKyAgICAvLyBQYXJzZSBUZXN0UGFyc2luZ01lcmdlLgorICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKKyAgICBVbml0dGVzdFByb3RvLnJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7CisgICAgVGVzdFBhcnNpbmdNZXJnZSBwYXJzaW5nTWVyZ2UgPQorICAgICAgICBUZXN0UGFyc2luZ01lcmdlLlBBUlNFUi5wYXJzZUZyb20oZGF0YSwgcmVnaXN0cnkpOworCisgICAgLy8gUmVxdWlyZWQgYW5kIG9wdGlvbmFsIGZpZWxkcyBzaG91bGQgYmUgbWVyZ2VkLgorICAgIGFzc2VydE1lc3NhZ2VNZXJnZWQocGFyc2luZ01lcmdlLmdldFJlcXVpcmVkQWxsVHlwZXMoKSk7CisgICAgYXNzZXJ0TWVzc2FnZU1lcmdlZChwYXJzaW5nTWVyZ2UuZ2V0T3B0aW9uYWxBbGxUeXBlcygpKTsKKyAgICBhc3NlcnRNZXNzYWdlTWVyZ2VkKAorICAgICAgICBwYXJzaW5nTWVyZ2UuZ2V0T3B0aW9uYWxHcm91cCgpLmdldE9wdGlvbmFsR3JvdXBBbGxUeXBlcygpKTsKKyAgICBhc3NlcnRNZXNzYWdlTWVyZ2VkKHBhcnNpbmdNZXJnZS5nZXRFeHRlbnNpb24oCisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2Uub3B0aW9uYWxFeHQpKTsKKworICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBzaG91bGQgbm90IGJlIG1lcmdlZC4KKyAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldFJlcGVhdGVkQWxsVHlwZXNDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldEV4dGVuc2lvbkNvdW50KAorICAgICAgICBUZXN0UGFyc2luZ01lcmdlLnJlcGVhdGVkRXh0KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZ01lcmdlTGl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEJ1aWxkIG1lc3NhZ2VzLgorICAgIFRlc3RBbGxUeXBlc0xpdGUuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCk7CisgICAgVGVzdEFsbFR5cGVzTGl0ZSBtc2cxID0gYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDEpLmJ1aWxkKCk7CisgICAgYnVpbGRlci5jbGVhcigpOworICAgIFRlc3RBbGxUeXBlc0xpdGUgbXNnMiA9IGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQ2NCgyKS5idWlsZCgpOworICAgIGJ1aWxkZXIuY2xlYXIoKTsKKyAgICBUZXN0QWxsVHlwZXNMaXRlIG1zZzMgPSBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMykKKyAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJoZWxsbyIpLmJ1aWxkKCk7CisKKyAgICAvLyBCdWlsZCBncm91cHMuCisgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxIG9wdGlvbmFsRzEgPQorICAgICAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDEubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRGaWVsZDEobXNnMSkuYnVpbGQoKTsKKyAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDEgb3B0aW9uYWxHMiA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEZpZWxkMShtc2cyKS5idWlsZCgpOworICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMSBvcHRpb25hbEczID0KKyAgICAgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzMpLmJ1aWxkKCk7CisgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyIHJlcGVhdGVkRzEgPQorICAgICAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDIubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRGaWVsZDEobXNnMSkuYnVpbGQoKTsKKyAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDIgcmVwZWF0ZWRHMiA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMi5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEZpZWxkMShtc2cyKS5idWlsZCgpOworICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMiByZXBlYXRlZEczID0KKyAgICAgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGQxKG1zZzMpLmJ1aWxkKCk7CisKKyAgICAvLyBBc3NpZ24gYW5kIHNlcmlhbGl6ZSBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvci4KKyAgICBCeXRlU3RyaW5nIGRhdGEgPSBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEZpZWxkMShtc2cxKS5hZGRGaWVsZDEobXNnMikuYWRkRmllbGQxKG1zZzMpCisgICAgICAgIC5hZGRGaWVsZDIobXNnMSkuYWRkRmllbGQyKG1zZzIpLmFkZEZpZWxkMihtc2czKQorICAgICAgICAuYWRkRmllbGQzKG1zZzEpLmFkZEZpZWxkMyhtc2cyKS5hZGRGaWVsZDMobXNnMykKKyAgICAgICAgLmFkZEdyb3VwMShvcHRpb25hbEcxKS5hZGRHcm91cDEob3B0aW9uYWxHMikuYWRkR3JvdXAxKG9wdGlvbmFsRzMpCisgICAgICAgIC5hZGRHcm91cDIocmVwZWF0ZWRHMSkuYWRkR3JvdXAyKHJlcGVhdGVkRzIpLmFkZEdyb3VwMihyZXBlYXRlZEczKQorICAgICAgICAuYWRkRXh0MShtc2cxKS5hZGRFeHQxKG1zZzIpLmFkZEV4dDEobXNnMykKKyAgICAgICAgLmFkZEV4dDIobXNnMSkuYWRkRXh0Mihtc2cyKS5hZGRFeHQyKG1zZzMpCisgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOworCisgICAgLy8gUGFyc2UgVGVzdFBhcnNpbmdNZXJnZUxpdGUuCisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOworICAgIFVuaXR0ZXN0TGl0ZS5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOworICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlIHBhcnNpbmdNZXJnZSA9CisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlBBUlNFUi5wYXJzZUZyb20oZGF0YSwgcmVnaXN0cnkpOworCisgICAgLy8gUmVxdWlyZWQgYW5kIG9wdGlvbmFsIGZpZWxkcyBzaG91bGQgYmUgbWVyZ2VkLgorICAgIGFzc2VydE1lc3NhZ2VNZXJnZWQocGFyc2luZ01lcmdlLmdldFJlcXVpcmVkQWxsVHlwZXMoKSk7CisgICAgYXNzZXJ0TWVzc2FnZU1lcmdlZChwYXJzaW5nTWVyZ2UuZ2V0T3B0aW9uYWxBbGxUeXBlcygpKTsKKyAgICBhc3NlcnRNZXNzYWdlTWVyZ2VkKAorICAgICAgICBwYXJzaW5nTWVyZ2UuZ2V0T3B0aW9uYWxHcm91cCgpLmdldE9wdGlvbmFsR3JvdXBBbGxUeXBlcygpKTsKKyAgICBhc3NlcnRNZXNzYWdlTWVyZ2VkKHBhcnNpbmdNZXJnZS5nZXRFeHRlbnNpb24oCisgICAgICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLm9wdGlvbmFsRXh0KSk7CisKKyAgICAvLyBSZXBlYXRlZCBmaWVsZHMgc2hvdWxkIG5vdCBiZSBtZXJnZWQuCisgICAgYXNzZXJ0RXF1YWxzKDMsIHBhcnNpbmdNZXJnZS5nZXRSZXBlYXRlZEFsbFR5cGVzQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIHBhcnNpbmdNZXJnZS5nZXRSZXBlYXRlZEdyb3VwQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIHBhcnNpbmdNZXJnZS5nZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUucmVwZWF0ZWRFeHQpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9SZXBlYXRlZEZpZWxkQnVpbGRlclRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjZGNiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9LiBUaGlzIHRlc3RzIGJhc2ljIGZ1bmN0aW9uYWxpdHkuCisgKiBNb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nIGlzIHByb3ZpZGVkIHZpYSBvdGhlciB0ZXN0cyB0aGF0IGV4ZXJjaXNlIHRoZQorICogYnVpbGRlci4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIFJlcGVhdGVkRmllbGRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNVc2UoKSB7CisgICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOworICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOworICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7CisgICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworCisgICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKKworICAgIC8vIE1ha2Ugc3VyZSBpdCBkb2Vzbid0IGNoYW5nZS4KKyAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbGlzdDIgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0U2FtZShsaXN0LCBsaXN0Mik7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R29pbmdCYWNrQW5kRm9ydGgoKSB7CisgICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOworICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOworICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7CisgICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworCisgICAgLy8gQ29udmVydCB0byBsaXN0CisgICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKKworICAgIC8vIFVwZGF0ZSAwdGggaXRlbQorICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigwKS5zZXRPcHRpb25hbFN0cmluZygiZm9vIik7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgICAgbGlzdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygwLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RWYXJpb3VzTWV0aG9kcygpIHsKKyAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7CisgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKKyAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0gbmV3UmVwZWF0ZWRGaWVsZEJ1aWxkZXIobW9ja1BhcmVudCk7CisgICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKKyAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDIpLmJ1aWxkKCkpOworICAgIGJ1aWxkZXIuYWRkQnVpbGRlcigwLCBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCisgICAgICAgIC5zZXRPcHRpb25hbEludDMyKDApOworICAgIGJ1aWxkZXIuYWRkQnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLnNldE9wdGlvbmFsSW50MzIoMyk7CisKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRNZXNzYWdlKDMpLmdldE9wdGlvbmFsSW50MzIoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbWVzc2FnZXMgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2VzLnNpemUoKSk7CisgICAgYXNzZXJ0U2FtZShtZXNzYWdlcywgYnVpbGRlci5idWlsZCgpKTsgLy8gZXhwZWN0IHNhbWUgbGlzdAorCisgICAgLy8gUmVtb3ZlIGEgbWVzc2FnZS4KKyAgICBidWlsZGVyLnJlbW92ZSgyKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKworICAgIC8vIFJlbW92ZSBhIGJ1aWxkZXIuCisgICAgYnVpbGRlci5yZW1vdmUoMCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0Q291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKworICAgIC8vIFRlc3QgY2xlYXIuCisgICAgYnVpbGRlci5jbGVhcigpOworICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldENvdW50KCkpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0VtcHR5KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpc3RzKCkgeworICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKyAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPSBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihtb2NrUGFyZW50KTsKKyAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpLmJ1aWxkKCkpOworICAgIGJ1aWxkZXIuYWRkTWVzc2FnZSgwLAorICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKworICAgIC8vIFVzZSBsaXN0IG9mIGJ1aWxkZXJzLgorICAgIExpc3Q8VGVzdEFsbFR5cGVzLkJ1aWxkZXI+IGJ1aWxkZXJzID0gYnVpbGRlci5nZXRCdWlsZGVyTGlzdCgpOworICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVycy5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlcnMuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYnVpbGRlcnMuZ2V0KDApLnNldE9wdGlvbmFsSW50MzIoMTApOworICAgIGJ1aWxkZXJzLmdldCgxKS5zZXRPcHRpb25hbEludDMyKDExKTsKKworICAgIC8vIFVzZSBsaXN0IG9mIHByb3RvcworICAgIExpc3Q8VGVzdEFsbFR5cGVzPiBwcm90b3MgPSBidWlsZGVyLmdldE1lc3NhZ2VMaXN0KCk7CisgICAgYXNzZXJ0RXF1YWxzKDEwLCBwcm90b3MuZ2V0KDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDExLCBwcm90b3MuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7CisKKyAgICAvLyBBZGQgYW4gaXRlbSB0byB0aGUgYnVpbGRlcnMgYW5kIHZlcmlmeSBpdCdzIHVwZGF0ZWQgaW4gYm90aAorICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTIpLmJ1aWxkKCkpOworICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVycy5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygzLCBwcm90b3Muc2l6ZSgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRJc1VubW9kaWZpYWJsZShMaXN0PD8+IGxpc3QpIHsKKyAgICBpZiAobGlzdCA9PSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkgeworICAgICAgLy8gT0tBWSAtLSBOZWVkIHRvIGNoZWNrIHRoaXMgYi9jIEVtcHR5TGlzdCBhbGxvd3MgeW91IHRvIGNhbGwgY2xlYXIuCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGxpc3QuY2xlYXIoKTsKKyAgICAgICAgZmFpbCgiTGlzdCB3YXNuJ3QgaW1tdXRhYmxlIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIGdvb2QKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+CisgICAgICBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7CisgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KENvbGxlY3Rpb25zLjxUZXN0QWxsVHlwZXM+ZW1wdHlMaXN0KCksIGZhbHNlLAorICAgICAgICBwYXJlbnQsIGZhbHNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Sb3BlQnl0ZVN0cmluZ1N1YnN0cmluZ1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdTdWJzdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MDdhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdTdWJzdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHRlc3RzIHtAbGluayBSb3BlQnl0ZVN0cmluZyNzdWJzdHJpbmcoaW50LCBpbnQpfSBieSBpbmhlcml0aW5nIHRoZSB0ZXN0cyBmcm9tCisgKiB7QGxpbmsgTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0fS4gIE9ubHkgYSBjb3VwbGUgb2YgbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbi4gIAorICoKKyAqIEBhdXRob3IgY2FybGFudG9uQGdvb2dsZS5jb20gKENhcmwgSGF2ZXJsKQorICovCitwdWJsaWMgY2xhc3MgUm9wZUJ5dGVTdHJpbmdTdWJzdHJpbmdUZXN0IGV4dGVuZHMgTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0IHsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBjbGFzc1VuZGVyVGVzdCA9ICJSb3BlQnl0ZVN0cmluZyI7CisgICAgYnl0ZVtdIHNvdXJjZUJ5dGVzID0gQnl0ZVN0cmluZ1Rlc3QuZ2V0VGVzdEJ5dGVzKDIyMzQxLCAyMjMzNzc2NkwpOworICAgIEl0ZXJhdG9yPEJ5dGVTdHJpbmc+IGl0ZXIgPSBCeXRlU3RyaW5nVGVzdC5tYWtlQ29uY3JldGVQaWVjZXMoc291cmNlQnl0ZXMpLml0ZXJhdG9yKCk7CisgICAgQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmcgPSBpdGVyLm5leHQoKTsKKyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgIHNvdXJjZVN0cmluZyA9IHNvdXJjZVN0cmluZy5jb25jYXQoaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIGludCBmcm9tID0gMTEzMDsKKyAgICBpbnQgdG8gPSBzb3VyY2VCeXRlcy5sZW5ndGggLSA1NTU1OworICAgIHN0cmluZ1VuZGVyVGVzdCA9IHNvdXJjZVN0cmluZy5zdWJzdHJpbmcoZnJvbSwgdG8pOworICAgIHJlZmVyZW5jZUJ5dGVzID0gbmV3IGJ5dGVbdG8gLSBmcm9tXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZUJ5dGVzLCBmcm9tLCByZWZlcmVuY2VCeXRlcywgMCwgdG8gLSBmcm9tKTsKKyAgICBleHBlY3RlZEhhc2hDb2RlID0gLTEyNTkyNjA2ODA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdGVzdEdldFRyZWVEZXB0aCgpIHsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgaGF2ZSB0aGUgZXhwZWN0ZWQgdHJlZSBkZXB0aCIsCisgICAgICAgIDMsIHN0cmluZ1VuZGVyVGVzdC5nZXRUcmVlRGVwdGgoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFN0cmluZyBzb3VyY2VTdHJpbmcgPSAiSSBsb3ZlIHVuaWNvZGUgXHUxMjM0XHU1Njc4IGNoYXJhY3RlcnMiOworICAgIEJ5dGVTdHJpbmcgc291cmNlQnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHNvdXJjZVN0cmluZyk7CisgICAgaW50IGNvcGllcyA9IDI1MDsKKworICAgIC8vIEJ5IGJ1aWxkaW5nIHRoZSBSb3BlQnl0ZVN0cmluZyBieSBjb25jYXRlbmF0aW5nLCB0aGlzIGlzIGFjdHVhbGx5IGEgZmFpcmx5IHN0cmVudW91cyB0ZXN0LgorICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGNvcGllcyAqIHNvdXJjZVN0cmluZy5sZW5ndGgoKSk7CisgICAgQnl0ZVN0cmluZyB1bmljb2RlID0gQnl0ZVN0cmluZy5FTVBUWTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvcGllczsgKytpKSB7CisgICAgICBidWlsZGVyLmFwcGVuZChzb3VyY2VTdHJpbmcpOworICAgICAgdW5pY29kZSA9IFJvcGVCeXRlU3RyaW5nLmNvbmNhdGVuYXRlKHVuaWNvZGUsIHNvdXJjZUJ5dGVTdHJpbmcpOworICAgIH0KKyAgICBTdHJpbmcgdGVzdFN0cmluZyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKKworICAgIC8vIERvIHRoZSBzdWJzdHJpbmcgcGFydAorICAgIHRlc3RTdHJpbmcgPSB0ZXN0U3RyaW5nLnN1YnN0cmluZygyLCB0ZXN0U3RyaW5nLmxlbmd0aCgpIC0gNik7CisgICAgdW5pY29kZSA9IHVuaWNvZGUuc3Vic3RyaW5nKDIsIHVuaWNvZGUuc2l6ZSgpIC0gNik7CisKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIGZyb20gc3RyaW5nIG11c3QgaGF2ZSB0aGUgZXhwZWN0ZWQgdHlwZSIsCisgICAgICAgIGNsYXNzVW5kZXJUZXN0LCBnZXRBY3R1YWxDbGFzc05hbWUodW5pY29kZSkpOworICAgIFN0cmluZyByb3VuZFRyaXBTdHJpbmcgPSB1bmljb2RlLnRvU3RyaW5nKFVURl84KTsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHVuaWNvZGUgYnl0ZXMgbXVzdCBtYXRjaCIsCisgICAgICAgIHRlc3RTdHJpbmcsIHJvdW5kVHJpcFN0cmluZyk7CisgICAgQnl0ZVN0cmluZyBmbGF0U3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgodGVzdFN0cmluZyk7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBzdHJpbmcgbXVzdCBlcXVhbCB0aGUgZmxhdCBzdHJpbmciLCBmbGF0U3RyaW5nLCB1bmljb2RlKTsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHN0cmluZyBtdXN0IG11c3QgaGF2ZSBzYW1lIGhhc2hDb2RlIGFzIHRoZSBmbGF0IHN0cmluZyIsCisgICAgICAgIGZsYXRTdHJpbmcuaGFzaENvZGUoKSwgdW5pY29kZS5oYXNoQ29kZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Sb3BlQnl0ZVN0cmluZ1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmNjYwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHRlc3RzIHtAbGluayBSb3BlQnl0ZVN0cmluZ30gYnkgaW5oZXJpdGluZyB0aGUgdGVzdHMgZnJvbQorICoge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nVGVzdH0uICBPbmx5IGEgY291cGxlIG9mIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4uCisgKiAKKyAqIDxwPkEgZnVsbCB0ZXN0IG9mIHRoZSByZXN1bHQgb2Yge0BsaW5rIFJvcGVCeXRlU3RyaW5nI3N1YnN0cmluZyhpbnQsIGludCl9IGlzIGZvdW5kIGluIHRoZQorICogc2VwYXJhdGUgY2xhc3Mge0BsaW5rIFJvcGVCeXRlU3RyaW5nU3Vic3RyaW5nVGVzdH0uCisgKgorICogQGF1dGhvciBjYXJsYW50b25AZ29vZ2xlLmNvbSAoQ2FybCBIYXZlcmwpCisgKi8KK3B1YmxpYyBjbGFzcyBSb3BlQnl0ZVN0cmluZ1Rlc3QgZXh0ZW5kcyBMaXRlcmFsQnl0ZVN0cmluZ1Rlc3QgeworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGNsYXNzVW5kZXJUZXN0ID0gIlJvcGVCeXRlU3RyaW5nIjsKKyAgICByZWZlcmVuY2VCeXRlcyA9IEJ5dGVTdHJpbmdUZXN0LmdldFRlc3RCeXRlcygyMjM0MSwgMjIzMzc3NjZMKTsKKyAgICBJdGVyYXRvcjxCeXRlU3RyaW5nPiBpdGVyID0gQnl0ZVN0cmluZ1Rlc3QubWFrZUNvbmNyZXRlUGllY2VzKHJlZmVyZW5jZUJ5dGVzKS5pdGVyYXRvcigpOworICAgIHN0cmluZ1VuZGVyVGVzdCA9IGl0ZXIubmV4dCgpOworICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgc3RyaW5nVW5kZXJUZXN0ID0gc3RyaW5nVW5kZXJUZXN0LmNvbmNhdChpdGVyLm5leHQoKSk7CisgICAgfQorICAgIGV4cGVjdGVkSGFzaENvZGUgPSAtMTIxNDE5NzIzODsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHJlZURlcHRoKCkgeworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBoYXZlIHRoZSBleHBlY3RlZCB0cmVlIGRlcHRoIiwKKyAgICAgICAgNCwgc3RyaW5nVW5kZXJUZXN0LmdldFRyZWVEZXB0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCYWxhbmNlKCkgeworICAgIGludCBudW1iZXJPZlBpZWNlcyA9IDEwMDAwOworICAgIGludCBwaWVjZVNpemUgPSA2NDsKKyAgICBieXRlW10gdGVzdEJ5dGVzID0gQnl0ZVN0cmluZ1Rlc3QuZ2V0VGVzdEJ5dGVzKG51bWJlck9mUGllY2VzICogcGllY2VTaXplLCAxMTMzNzdMKTsKKworICAgIC8vIEJ1aWxkIHVwIGEgYmlnIEJ5dGVTdHJpbmcgZnJvbSBzbWFsbGVyIHBpZWNlcyB0byBmb3JjZSBhIHJlYmFsYW5jZQorICAgIEJ5dGVTdHJpbmcgY29uY2F0ZW5hdGVkID0gQnl0ZVN0cmluZy5FTVBUWTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mUGllY2VzOyArK2kpIHsKKyAgICAgIGNvbmNhdGVuYXRlZCA9IGNvbmNhdGVuYXRlZC5jb25jYXQoQnl0ZVN0cmluZy5jb3B5RnJvbSh0ZXN0Qnl0ZXMsIGkgKiBwaWVjZVNpemUsIHBpZWNlU2l6ZSkpOworICAgIH0KKworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgZnJvbSBzdHJpbmcgbXVzdCBoYXZlIHRoZSBleHBlY3RlZCB0eXBlIiwKKyAgICAgICAgY2xhc3NVbmRlclRlc3QsIGdldEFjdHVhbENsYXNzTmFtZShjb25jYXRlbmF0ZWQpKTsKKyAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIiB1bmRlcmx5aW5nIGJ5dGVzIG11c3QgbWF0Y2ggYWZ0ZXIgYmFsYW5jaW5nIiwKKyAgICAgICAgQXJyYXlzLmVxdWFscyh0ZXN0Qnl0ZXMsIGNvbmNhdGVuYXRlZC50b0J5dGVBcnJheSgpKSk7CisgICAgQnl0ZVN0cmluZyB0ZXN0U3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbSh0ZXN0Qnl0ZXMpOworICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiIGJhbGFuY2VkIHN0cmluZyBtdXN0IGVxdWFsIGZsYXQgc3RyaW5nIiwKKyAgICAgICAgY29uY2F0ZW5hdGVkLmVxdWFscyh0ZXN0U3RyaW5nKSk7CisgICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIgZmxhdCBzdHJpbmcgbXVzdCBlcXVhbCBiYWxhbmNlZCBzdHJpbmciLAorICAgICAgICB0ZXN0U3RyaW5nLmVxdWFscyhjb25jYXRlbmF0ZWQpKTsKKyAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIGJhbGFuY2VkIHN0cmluZyBtdXN0IGhhdmUgc2FtZSBoYXNoIGNvZGUgYXMgZmxhdCBzdHJpbmciLAorICAgICAgICB0ZXN0U3RyaW5nLmhhc2hDb2RlKCksIGNvbmNhdGVuYXRlZC5oYXNoQ29kZSgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNvdXJjZVN0cmluZyA9ICJJIGxvdmUgdW5pY29kZSBcdTEyMzRcdTU2NzggY2hhcmFjdGVycyI7CisgICAgQnl0ZVN0cmluZyBzb3VyY2VCeXRlU3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0Zjgoc291cmNlU3RyaW5nKTsKKyAgICBpbnQgY29waWVzID0gMjUwOworCisgICAgLy8gQnkgYnVpbGRpbmcgdGhlIFJvcGVCeXRlU3RyaW5nIGJ5IGNvbmNhdGVuYXRpbmcsIHRoaXMgaXMgYWN0dWFsbHkgYSBmYWlybHkgc3RyZW51b3VzIHRlc3QuCisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoY29waWVzICogc291cmNlU3RyaW5nLmxlbmd0aCgpKTsKKyAgICBCeXRlU3RyaW5nIHVuaWNvZGUgPSBCeXRlU3RyaW5nLkVNUFRZOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29waWVzOyArK2kpIHsKKyAgICAgIGJ1aWxkZXIuYXBwZW5kKHNvdXJjZVN0cmluZyk7CisgICAgICB1bmljb2RlID0gUm9wZUJ5dGVTdHJpbmcuY29uY2F0ZW5hdGUodW5pY29kZSwgc291cmNlQnl0ZVN0cmluZyk7CisgICAgfQorICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gYnVpbGRlci50b1N0cmluZygpOworCisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBmcm9tIHN0cmluZyBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHR5cGUiLAorICAgICAgICBjbGFzc1VuZGVyVGVzdCwgZ2V0QWN0dWFsQ2xhc3NOYW1lKHVuaWNvZGUpKTsKKyAgICBTdHJpbmcgcm91bmRUcmlwU3RyaW5nID0gdW5pY29kZS50b1N0cmluZyhVVEZfOCk7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiB1bmljb2RlIGJ5dGVzIG11c3QgbWF0Y2giLAorICAgICAgICB0ZXN0U3RyaW5nLCByb3VuZFRyaXBTdHJpbmcpOworICAgIEJ5dGVTdHJpbmcgZmxhdFN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHRlc3RTdHJpbmcpOworICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgc3RyaW5nIG11c3QgZXF1YWwgdGhlIGZsYXQgc3RyaW5nIiwgZmxhdFN0cmluZywgdW5pY29kZSk7CisgICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBzdHJpbmcgbXVzdCBtdXN0IGhhdmUgc2FtZSBoYXNoQ29kZSBhcyB0aGUgZmxhdCBzdHJpbmciLAorICAgICAgICBmbGF0U3RyaW5nLmhhc2hDb2RlKCksIHVuaWNvZGUuaGFzaENvZGUoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU4NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvcjsKK2ltcG9ydCBnb29nbGUucHJvdG9idWYubm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0LlVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTWVzc2FnZVdpdGhOb091dGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlNlcnZpY2VXaXRoTm9PdXRlcjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTZXJ2aWNlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9vUmVxdWVzdDsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvb1Jlc3BvbnNlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uQmFyUmVxdWVzdDsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkJhclJlc3BvbnNlOworCitpbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrOworaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5JTW9ja3NDb250cm9sOworaW1wb3J0IG9yZy5lYXN5bW9jay5JQXJndW1lbnRNYXRjaGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0cyBzZXJ2aWNlcyBhbmQgc3R1YnMuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIElNb2Nrc0NvbnRyb2wgY29udHJvbDsKKyAgcHJpdmF0ZSBScGNDb250cm9sbGVyIG1vY2tDb250cm9sbGVyOworCisgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBmb29EZXNjcmlwdG9yID0KKyAgICBUZXN0U2VydmljZS5nZXREZXNjcmlwdG9yKCkuZ2V0TWV0aG9kcygpLmdldCgwKTsKKyAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIGJhckRlc2NyaXB0b3IgPQorICAgIFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKS5nZXRNZXRob2RzKCkuZ2V0KDEpOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnNldFVwKCk7CisgICAgY29udHJvbCA9IEVhc3lNb2NrLmNyZWF0ZVN0cmljdENvbnRyb2woKTsKKyAgICBtb2NrQ29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqIFRlc3RzIFNlcnZpY2UuY2FsbE1ldGhvZCgpLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEZvb1JlcXVlc3QgZm9vUmVxdWVzdCA9IEZvb1JlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgQmFyUmVxdWVzdCBiYXJSZXF1ZXN0ID0gQmFyUmVxdWVzdC5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICBNb2NrQ2FsbGJhY2s8TWVzc2FnZT4gZm9vQ2FsbGJhY2sgPSBuZXcgTW9ja0NhbGxiYWNrPE1lc3NhZ2U+KCk7CisgICAgTW9ja0NhbGxiYWNrPE1lc3NhZ2U+IGJhckNhbGxiYWNrID0gbmV3IE1vY2tDYWxsYmFjazxNZXNzYWdlPigpOworICAgIFRlc3RTZXJ2aWNlIG1vY2tTZXJ2aWNlID0gY29udHJvbC5jcmVhdGVNb2NrKFRlc3RTZXJ2aWNlLmNsYXNzKTsKKworICAgIG1vY2tTZXJ2aWNlLmZvbyhFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy48Rm9vUmVzcG9uc2U+d3JhcHNDYWxsYmFjayhmb29DYWxsYmFjaykpOworICAgIG1vY2tTZXJ2aWNlLmJhcihFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShiYXJSZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy48QmFyUmVzcG9uc2U+d3JhcHNDYWxsYmFjayhiYXJDYWxsYmFjaykpOworICAgIGNvbnRyb2wucmVwbGF5KCk7CisKKyAgICBtb2NrU2VydmljZS5jYWxsTWV0aG9kKGZvb0Rlc2NyaXB0b3IsIG1vY2tDb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vUmVxdWVzdCwgZm9vQ2FsbGJhY2spOworICAgIG1vY2tTZXJ2aWNlLmNhbGxNZXRob2QoYmFyRGVzY3JpcHRvciwgbW9ja0NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJSZXF1ZXN0LCBiYXJDYWxsYmFjayk7CisgICAgY29udHJvbC52ZXJpZnkoKTsKKyAgfQorCisgIC8qKiBUZXN0cyBTZXJ2aWNlLmdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvdG90eXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFNlcnZpY2UgbW9ja1NlcnZpY2UgPSBjb250cm9sLmNyZWF0ZU1vY2soVGVzdFNlcnZpY2UuY2xhc3MpOworCisgICAgYXNzZXJ0U2FtZShtb2NrU2VydmljZS5nZXRSZXF1ZXN0UHJvdG90eXBlKGZvb0Rlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgRm9vUmVxdWVzdC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7CisgICAgYXNzZXJ0U2FtZShtb2NrU2VydmljZS5nZXRSZXNwb25zZVByb3RvdHlwZShmb29EZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgIEZvb1Jlc3BvbnNlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlcXVlc3RQcm90b3R5cGUoYmFyRGVzY3JpcHRvciksCisgICAgICAgICAgICAgICBCYXJSZXF1ZXN0LmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlc3BvbnNlUHJvdG90eXBlKGJhckRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgQmFyUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICB9CisKKyAgLyoqIFRlc3RzIGdlbmVyYXRlZCBzdHVicy4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFN0dWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGb29SZXF1ZXN0IGZvb1JlcXVlc3QgPSBGb29SZXF1ZXN0Lm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgIEJhclJlcXVlc3QgYmFyUmVxdWVzdCA9IEJhclJlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgTW9ja0NhbGxiYWNrPEZvb1Jlc3BvbnNlPiBmb29DYWxsYmFjayA9IG5ldyBNb2NrQ2FsbGJhY2s8Rm9vUmVzcG9uc2U+KCk7CisgICAgTW9ja0NhbGxiYWNrPEJhclJlc3BvbnNlPiBiYXJDYWxsYmFjayA9IG5ldyBNb2NrQ2FsbGJhY2s8QmFyUmVzcG9uc2U+KCk7CisgICAgUnBjQ2hhbm5lbCBtb2NrQ2hhbm5lbCA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDaGFubmVsLmNsYXNzKTsKKyAgICBUZXN0U2VydmljZSBzdHViID0gVGVzdFNlcnZpY2UubmV3U3R1Yihtb2NrQ2hhbm5lbCk7CisKKyAgICBtb2NrQ2hhbm5lbC5jYWxsTWV0aG9kKAorICAgICAgRWFzeU1vY2suc2FtZShmb29EZXNjcmlwdG9yKSwKKyAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAorICAgICAgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKKyAgICAgIEVhc3lNb2NrLnNhbWUoRm9vUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAorICAgICAgdGhpcy48TWVzc2FnZT53cmFwc0NhbGxiYWNrKGZvb0NhbGxiYWNrKSk7CisgICAgbW9ja0NoYW5uZWwuY2FsbE1ldGhvZCgKKyAgICAgIEVhc3lNb2NrLnNhbWUoYmFyRGVzY3JpcHRvciksCisgICAgICBFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwKKyAgICAgIEVhc3lNb2NrLnNhbWUoYmFyUmVxdWVzdCksCisgICAgICBFYXN5TW9jay5zYW1lKEJhclJlc3BvbnNlLmdldERlZmF1bHRJbnN0YW5jZSgpKSwKKyAgICAgIHRoaXMuPE1lc3NhZ2U+d3JhcHNDYWxsYmFjayhiYXJDYWxsYmFjaykpOworICAgIGNvbnRyb2wucmVwbGF5KCk7CisKKyAgICBzdHViLmZvbyhtb2NrQ29udHJvbGxlciwgZm9vUmVxdWVzdCwgZm9vQ2FsbGJhY2spOworICAgIHN0dWIuYmFyKG1vY2tDb250cm9sbGVyLCBiYXJSZXF1ZXN0LCBiYXJDYWxsYmFjayk7CisgICAgY29udHJvbC52ZXJpZnkoKTsKKyAgfQorCisgIC8qKiBUZXN0cyBnZW5lcmF0ZWQgYmxvY2tpbmcgc3R1YnMuICovCisgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1N0dWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGb29SZXF1ZXN0IGZvb1JlcXVlc3QgPSBGb29SZXF1ZXN0Lm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgIEJhclJlcXVlc3QgYmFyUmVxdWVzdCA9IEJhclJlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgQmxvY2tpbmdScGNDaGFubmVsIG1vY2tDaGFubmVsID0KKyAgICAgICAgY29udHJvbC5jcmVhdGVNb2NrKEJsb2NraW5nUnBjQ2hhbm5lbC5jbGFzcyk7CisgICAgVGVzdFNlcnZpY2UuQmxvY2tpbmdJbnRlcmZhY2Ugc3R1YiA9CisgICAgICAgIFRlc3RTZXJ2aWNlLm5ld0Jsb2NraW5nU3R1Yihtb2NrQ2hhbm5lbCk7CisKKyAgICBGb29SZXNwb25zZSBmb29SZXNwb25zZSA9IEZvb1Jlc3BvbnNlLm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgIEJhclJlc3BvbnNlIGJhclJlc3BvbnNlID0gQmFyUmVzcG9uc2UubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisKKyAgICBFYXN5TW9jay5leHBlY3QobW9ja0NoYW5uZWwuY2FsbEJsb2NraW5nTWV0aG9kKAorICAgICAgRWFzeU1vY2suc2FtZShmb29EZXNjcmlwdG9yKSwKKyAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAorICAgICAgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKKyAgICAgIEVhc3lNb2NrLnNhbWUoRm9vUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKSkuYW5kUmV0dXJuKGZvb1Jlc3BvbnNlKTsKKyAgICBFYXN5TW9jay5leHBlY3QobW9ja0NoYW5uZWwuY2FsbEJsb2NraW5nTWV0aG9kKAorICAgICAgRWFzeU1vY2suc2FtZShiYXJEZXNjcmlwdG9yKSwKKyAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAorICAgICAgRWFzeU1vY2suc2FtZShiYXJSZXF1ZXN0KSwKKyAgICAgIEVhc3lNb2NrLnNhbWUoQmFyUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKSkuYW5kUmV0dXJuKGJhclJlc3BvbnNlKTsKKyAgICBjb250cm9sLnJlcGxheSgpOworCisgICAgYXNzZXJ0U2FtZShmb29SZXNwb25zZSwgc3R1Yi5mb28obW9ja0NvbnRyb2xsZXIsIGZvb1JlcXVlc3QpKTsKKyAgICBhc3NlcnRTYW1lKGJhclJlc3BvbnNlLCBzdHViLmJhcihtb2NrQ29udHJvbGxlciwgYmFyUmVxdWVzdCkpOworICAgIGNvbnRyb2wudmVyaWZ5KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVmbGVjdGl2ZVNlcnZpY2UoKSB7CisgICAgU2VydmljZVdpdGhOb091dGVyLkludGVyZmFjZSBpbXBsID0KKyAgICAgICAgY29udHJvbC5jcmVhdGVNb2NrKFNlcnZpY2VXaXRoTm9PdXRlci5JbnRlcmZhY2UuY2xhc3MpOworICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKKyAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlV2l0aE5vT3V0ZXIubmV3UmVmbGVjdGl2ZVNlcnZpY2UoaW1wbCk7CisKKyAgICBNZXRob2REZXNjcmlwdG9yIGZvb01ldGhvZCA9CisgICAgICAgIFNlcnZpY2VXaXRoTm9PdXRlci5nZXREZXNjcmlwdG9yKCkuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7CisgICAgTWVzc2FnZVdpdGhOb091dGVyIHJlcXVlc3QgPSBNZXNzYWdlV2l0aE5vT3V0ZXIuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gY2FsbGJhY2sgPSBuZXcgUnBjQ2FsbGJhY2s8TWVzc2FnZT4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBydW4oTWVzc2FnZSBwYXJhbWV0ZXIpIHsKKyAgICAgICAgLy8gTm8gcmVhc29uIHRoaXMgc2hvdWxkIGJlIHJ1bi4KKyAgICAgICAgZmFpbCgpOworICAgICAgfQorICAgIH07CisgICAgUnBjQ2FsbGJhY2s8VGVzdEFsbFR5cGVzPiBzcGVjaWFsaXplZENhbGxiYWNrID0KKyAgICAgICAgUnBjVXRpbC5zcGVjaWFsaXplQ2FsbGJhY2soY2FsbGJhY2spOworCisgICAgaW1wbC5mb28oRWFzeU1vY2suc2FtZShjb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShyZXF1ZXN0KSwKKyAgICAgICAgRWFzeU1vY2suc2FtZShzcGVjaWFsaXplZENhbGxiYWNrKSk7CisgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKTsKKworICAgIGNvbnRyb2wucmVwbGF5KCk7CisKKyAgICBzZXJ2aWNlLmNhbGxNZXRob2QoZm9vTWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjayk7CisKKyAgICBjb250cm9sLnZlcmlmeSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2UoKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7CisgICAgU2VydmljZVdpdGhOb091dGVyLkJsb2NraW5nSW50ZXJmYWNlIGltcGwgPQorICAgICAgICBjb250cm9sLmNyZWF0ZU1vY2soU2VydmljZVdpdGhOb091dGVyLkJsb2NraW5nSW50ZXJmYWNlLmNsYXNzKTsKKyAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBjb250cm9sLmNyZWF0ZU1vY2soUnBjQ29udHJvbGxlci5jbGFzcyk7CisgICAgQmxvY2tpbmdTZXJ2aWNlIHNlcnZpY2UgPQorICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIubmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZShpbXBsKTsKKworICAgIE1ldGhvZERlc2NyaXB0b3IgZm9vTWV0aG9kID0KKyAgICAgICAgU2VydmljZVdpdGhOb091dGVyLmdldERlc2NyaXB0b3IoKS5maW5kTWV0aG9kQnlOYW1lKCJGb28iKTsKKyAgICBNZXNzYWdlV2l0aE5vT3V0ZXIgcmVxdWVzdCA9IE1lc3NhZ2VXaXRoTm9PdXRlci5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKworICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZFJlc3BvbnNlID0gVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpOworICAgIEVhc3lNb2NrLmV4cGVjdChpbXBsLmZvbyhFYXN5TW9jay5zYW1lKGNvbnRyb2xsZXIpLCBFYXN5TW9jay5zYW1lKHJlcXVlc3QpKSkKKyAgICAgICAgLmFuZFJldHVybihleHBlY3RlZFJlc3BvbnNlKTsKKworICAgIGNvbnRyb2wucmVwbGF5KCk7CisKKyAgICBNZXNzYWdlIHJlc3BvbnNlID0KKyAgICAgICAgc2VydmljZS5jYWxsQmxvY2tpbmdNZXRob2QoZm9vTWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0KTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXNwb25zZSwgcmVzcG9uc2UpOworCisgICAgY29udHJvbC52ZXJpZnkoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb0dlbmVyaWNTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIE5vbi1zZXJ2aWNlcyBzaG91bGQgYmUgdXNhYmxlLgorICAgIFVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMuVGVzdE1lc3NhZ2UgbWVzc2FnZSA9CisgICAgICBVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLlRlc3RNZXNzYWdlLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0QSgxMjMpCisgICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy50ZXN0RXh0ZW5zaW9uLCA0NTYpCisgICAgICAgIC5idWlsZCgpOworICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2UuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy5UZXN0RW51bS5GT08uZ2V0TnVtYmVyKCkpOworCisgICAgLy8gQnVpbGQgYSBsaXN0IG9mIHRoZSBjbGFzcyBuYW1lcyBuZXN0ZWQgaW4gVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy4KKyAgICBTdHJpbmcgb3V0ZXJOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3QuIiArCisgICAgICAgICAgICAgICAgICAgICAgICJVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzIjsKKyAgICBDbGFzczw/PiBvdXRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShvdXRlck5hbWUpOworCisgICAgU2V0PFN0cmluZz4gaW5uZXJDbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIGZvciAoQ2xhc3M8Pz4gaW5uZXJDbGFzcyA6IG91dGVyQ2xhc3MuZ2V0Q2xhc3NlcygpKSB7CisgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBpbm5lckNsYXNzLmdldE5hbWUoKTsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIGlubmVyIGNsYXNzLgorICAgICAgLy8gTm90ZTogIFN1cnByaXNpbmdseSwgdGhlIGZ1bGwgbmFtZSBvZiBhbiBpbm5lciBjbGFzcyB3aWxsIGJlIHNlcGFyYXRlZAorICAgICAgLy8gICBmcm9tIHRoZSBvdXRlciBjbGFzcyBuYW1lIGJ5IGEgJyQnIHJhdGhlciB0aGFuIGEgJy4nLiAgVGhpcyBpcyBub3QKKyAgICAgIC8vICAgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBqYXZhLmxhbmcuQ2xhc3MuICBJIGRvbid0IHdhbnQgdG8KKyAgICAgIC8vICAgbWFrZSBhc3N1bXB0aW9ucywgc28gSSdtIGp1c3QgZ29pbmcgdG8gYWNjZXB0IGFueSBjaGFyYWN0ZXIgYXMgdGhlCisgICAgICAvLyAgIHNlcGFyYXRvci4KKyAgICAgIGFzc2VydFRydWUoZnVsbE5hbWUuc3RhcnRzV2l0aChvdXRlck5hbWUpKTsKKworICAgICAgaWYgKCFTZXJ2aWNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW5uZXJDbGFzcykgJiYKKyAgICAgICAgICAhTWVzc2FnZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGlubmVyQ2xhc3MpICYmCisgICAgICAgICAgIVByb3RvY29sTWVzc2FnZUVudW0uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbm5lckNsYXNzKSkgeworICAgICAgICAvLyBJZ25vcmUgYW55IGNsYXNzZXMgbm90IGdlbmVyYXRlZCBieSB0aGUgYmFzZSBjb2RlIGdlbmVyYXRvci4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlubmVyQ2xhc3NOYW1lcy5hZGQoZnVsbE5hbWUuc3Vic3RyaW5nKG91dGVyTmFtZS5sZW5ndGgoKSArIDEpKTsKKyAgICB9CisKKyAgICAvLyBObyBzZXJ2aWNlIGNsYXNzIHNob3VsZCBoYXZlIGJlZW4gZ2VuZXJhdGVkLgorICAgIGFzc2VydFRydWUoaW5uZXJDbGFzc05hbWVzLmNvbnRhaW5zKCJUZXN0TWVzc2FnZSIpKTsKKyAgICBhc3NlcnRUcnVlKGlubmVyQ2xhc3NOYW1lcy5jb250YWlucygiVGVzdEVudW0iKSk7CisgICAgYXNzZXJ0RmFsc2UoaW5uZXJDbGFzc05hbWVzLmNvbnRhaW5zKCJUZXN0U2VydmljZSIpKTsKKworICAgIC8vIEJ1dCBkZXNjcmlwdG9ycyBhcmUgdGhlcmUuCisgICAgRmlsZURlc2NyaXB0b3IgZmlsZSA9IFVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMuZ2V0RGVzY3JpcHRvcigpOworICAgIGFzc2VydEVxdWFscygxLCBmaWxlLmdldFNlcnZpY2VzKCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlRlc3RTZXJ2aWNlIiwgZmlsZS5nZXRTZXJ2aWNlcygpLmdldCgwKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygxLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApLmdldE1ldGhvZHMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygiRm9vIiwKKyAgICAgICAgZmlsZS5nZXRTZXJ2aWNlcygpLmdldCgwKS5nZXRNZXRob2RzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiB3cmFwc0NhbGxiYWNrKCkgaXMgYW4gRWFzeU1vY2sgYXJndW1lbnQgcHJlZGljYXRlLiAgd3JhcHNDYWxsYmFjayhjKQorICAgKiBtYXRjaGVzIGEgY2FsbGJhY2sgaWYgY2FsbGluZyB0aGF0IGNhbGxiYWNrIGNhdXNlcyBjIHRvIGJlIGNhbGxlZC4KKyAgICogSW4gb3RoZXIgd29yZHMsIGMgd3JhcHMgdGhlIGdpdmVuIGNhbGxiYWNrLgorICAgKi8KKyAgcHJpdmF0ZSA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+IFJwY0NhbGxiYWNrPFR5cGU+IHdyYXBzQ2FsbGJhY2soCisgICAgICBNb2NrQ2FsbGJhY2s8Pz4gY2FsbGJhY2spIHsKKyAgICBFYXN5TW9jay5yZXBvcnRNYXRjaGVyKG5ldyBXcmFwc0NhbGxiYWNrKGNhbGxiYWNrKSk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKiogVGhlIHBhcmFtZXRlciB0byB3cmFwc0NhbGxiYWNrKCkgbXVzdCBiZSBhIE1vY2tDYWxsYmFjay4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0NhbGxiYWNrPFR5cGUgZXh0ZW5kcyBNZXNzYWdlPgorICAgICAgaW1wbGVtZW50cyBScGNDYWxsYmFjazxUeXBlPiB7CisgICAgcHJpdmF0ZSBib29sZWFuIGNhbGxlZCA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gaXNDYWxsZWQoKSB7IHJldHVybiBjYWxsZWQ7IH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeyBjYWxsZWQgPSBmYWxzZTsgfQorICAgIHB1YmxpYyB2b2lkIHJ1bihUeXBlIG1lc3NhZ2UpIHsgY2FsbGVkID0gdHJ1ZTsgfQorICB9CisKKyAgLyoqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB3cmFwc0NhbGxiYWNrKCkgYXJndW1lbnQgbWF0Y2hlci4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHNDYWxsYmFjayBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgeworICAgIHByaXZhdGUgTW9ja0NhbGxiYWNrPD8+IGNhbGxiYWNrOworCisgICAgcHVibGljIFdyYXBzQ2FsbGJhY2soTW9ja0NhbGxiYWNrPD8+IGNhbGxiYWNrKSB7CisgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgYWN0dWFsKSB7CisgICAgICBpZiAoIShhY3R1YWwgaW5zdGFuY2VvZiBScGNDYWxsYmFjaykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgUnBjQ2FsbGJhY2sgYWN0dWFsQ2FsbGJhY2sgPSAoUnBjQ2FsbGJhY2spYWN0dWFsOworCisgICAgICBjYWxsYmFjay5yZXNldCgpOworICAgICAgYWN0dWFsQ2FsbGJhY2sucnVuKG51bGwpOworICAgICAgcmV0dXJuIGNhbGxiYWNrLmlzQ2FsbGVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgICAgYnVmZmVyLmFwcGVuZCgid3JhcHNDYWxsYmFjayhtb2NrQ2FsbGJhY2spIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlclRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmY3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXNPckJ1aWxkZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBTaW5nbGVGaWVsZEJ1aWxkZXJ9LiBUaGlzIHRlc3RzIGJhc2ljIGZ1bmN0aW9uYWxpdHkuCisgKiBNb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nIGlzIHByb3ZpZGVkIHZpYSBvdGhlciB0ZXN0cyB0aGF0IGV4ZXJjaXNlIHRoZQorICogYnVpbGRlci4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUZpZWxkQnVpbGRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEJhc2ljVXNlQW5kSW52YWxpZGF0aW9ucygpIHsKKyAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7CisgICAgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9CisgICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4oCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCisgICAgICAgICAgICBtb2NrUGFyZW50LAorICAgICAgICAgICAgZmFsc2UpOworICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKKyAgICAgICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworCisgICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxMCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEwLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50MzIoKSk7CisKKyAgICAvLyBUZXN0IHRoYXQgd2UgcmVjZWl2ZSBpbnZhbGlkYXRpb25zIG5vdyB0aGF0IGJ1aWxkIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDIwKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSBkb24ndCBrZWVwIGdldHRpbmcgaW52YWxpZGF0aW9ucyBvbiBldmVyeSBjaGFuZ2UKKyAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDMwKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNldE1lc3NhZ2UoKSB7CisgICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOworICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPQorICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgbW9ja1BhcmVudCwKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgICBidWlsZGVyLnNldE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDApLmJ1aWxkKCkpOworICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbEludDMyKCkpOworCisgICAgLy8gVXBkYXRlIG1lc3NhZ2UgdXNpbmcgdGhlIGJ1aWxkZXIKKyAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpOworICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldEJ1aWxkZXIoKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDIpOworICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldEJ1aWxkZXIoKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbEludDMyKCkpOworCisgICAgLy8gTWFrZSBzdXJlIG1lc3NhZ2Ugc3RheXMgY2FjaGVkCisgICAgYXNzZXJ0U2FtZShidWlsZGVyLmdldE1lc3NhZ2UoKSwgYnVpbGRlci5nZXRNZXNzYWdlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKyAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKKyAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0KKyAgICAgICAgbmV3IFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPigKKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgIG1vY2tQYXJlbnQsCisgICAgICAgICAgICBmYWxzZSk7CisgICAgYnVpbGRlci5zZXRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigwKS5idWlsZCgpKTsKKyAgICBhc3NlcnROb3RTYW1lKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRNZXNzYWdlKCkpOworICAgIGJ1aWxkZXIuY2xlYXIoKTsKKyAgICBhc3NlcnRTYW1lKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRNZXNzYWdlKCkpOworCisgICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKTsKKyAgICBhc3NlcnROb3RTYW1lKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRNZXNzYWdlKCkpOworICAgIGJ1aWxkZXIuY2xlYXIoKTsKKyAgICBhc3NlcnRTYW1lKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRNZXNzYWdlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1lcmdlKCkgeworICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKyAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKKyAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0KKyAgICAgICAgbmV3IFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPigKKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgIG1vY2tQYXJlbnQsCisgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAvLyBNZXJnZSBpbnRvIGRlZmF1bHQgZmllbGQuCisgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBhc3NlcnRTYW1lKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRNZXNzYWdlKCkpOworCisgICAgLy8gTWVyZ2UgaW50byBub24tZGVmYXVsdCBmaWVsZCBvbiBleGlzdGluZyBidWlsZGVyLgorICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMik7CisgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0T3B0aW9uYWxEb3VibGUoNC4wKQorICAgICAgICAuYnVpbGRQYXJ0aWFsKCkpOworICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscyg0LjAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsRG91YmxlKCkpOworCisgICAgLy8gTWVyZ2UgaW50byBub24tZGVmYXVsdCBmaWVsZCBvbiBleGlzdGluZyBtZXNzYWdlCisgICAgYnVpbGRlci5zZXRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE9wdGlvbmFsSW50MzIoMTApCisgICAgICAgIC5idWlsZFBhcnRpYWwoKSk7CisgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0T3B0aW9uYWxEb3VibGUoNS4wKQorICAgICAgICAuYnVpbGRQYXJ0aWFsKCkpOworICAgIGFzc2VydEVxdWFscygxMCwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoNS4wLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbERvdWJsZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TbWFsbFNvcnRlZE1hcFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3N2EwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXBUZXN0LmphdmEKQEAgLTAsMCArMSw0MjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCisvKioKKyAqIEBhdXRob3IgZGFyaWNrQGdvb2dsZS5jb20gRGFyaWNrIFRvbmcKKyAqLworcHVibGljIGNsYXNzIFNtYWxsU29ydGVkTWFwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgLy8gamF2YS51dGlsLkFic3RyYWN0TWFwLlNpbXBsZUVudHJ5IGlzIHByaXZhdGUgaW4gSkRLIDEuNS4gV2UgcmUtaW1wbGVtZW50IGl0CisgIC8vIGhlcmUgZm9yIEpESyAxLjUgdXNlcnMuCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbXBsZUVudHJ5PEssIFY+IGltcGxlbWVudHMgTWFwLkVudHJ5PEssIFY+IHsKKyAgICBwcml2YXRlIGZpbmFsIEsga2V5OworICAgIHByaXZhdGUgViB2YWx1ZTsKKworICAgIFNpbXBsZUVudHJ5KEsga2V5LCBWIHZhbHVlKSB7CisgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSyBnZXRLZXkoKSB7CisgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBWIGdldFZhbHVlKCkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBWIHNldFZhbHVlKFYgdmFsdWUpIHsKKyAgICAgIFYgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOworICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgcmV0dXJuIG9sZFZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgIHJldHVybiBvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBvOworICAgICAgcmV0dXJuIGVxKGtleSwgZS5nZXRLZXkoKSkgJiYgZXEodmFsdWUsIGUuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiAoKGtleSA9PSBudWxsKSA/IDAgOiBrZXkuaGFzaENvZGUoKSkgXgorICAgICAgICAgICgodmFsdWUgPT0gbnVsbCkgPyAwIDogdmFsdWUuaGFzaENvZGUoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFB1dEFuZEdldEFycmF5RW50cmllc09ubHkoKSB7CisgICAgcnVuUHV0QW5kR2V0VGVzdCgzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQdXRBbmRHZXRPdmVyZmxvd0VudHJpZXMoKSB7CisgICAgcnVuUHV0QW5kR2V0VGVzdCg2KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW5QdXRBbmRHZXRUZXN0KGludCBudW1FbGVtZW50cykgeworICAgIC8vIFRlc3Qgd2l0aCBldmVuIGFuZCBvZGQgYXJyYXlTaXplCisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwMSA9CisgICAgICAgIFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAyID0KKyAgICAgICAgU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDQpOworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcDMgPQorICAgICAgICBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwNCA9CisgICAgICAgIFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCg0KTsKKworICAgIC8vIFRlc3Qgd2l0aCBwdXRzIGluIGFzY2VuZGluZyBvcmRlci4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGFzc2VydE51bGwobWFwMS5wdXQoaSwgaSArIDEpKTsKKyAgICAgIGFzc2VydE51bGwobWFwMi5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgLy8gVGVzdCB3aXRoIHB1dHMgaW4gZGVzY2VuZGluZyBvcmRlci4KKyAgICBmb3IgKGludCBpID0gbnVtRWxlbWVudHMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgYXNzZXJ0TnVsbChtYXAzLnB1dChpLCBpICsgMSkpOworICAgICAgYXNzZXJ0TnVsbChtYXA0LnB1dChpLCBpICsgMSkpOworICAgIH0KKworICAgIGFzc2VydEVxdWFscyhNYXRoLm1pbigzLCBudW1FbGVtZW50cyksIG1hcDEuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscyhNYXRoLm1pbig0LCBudW1FbGVtZW50cyksIG1hcDIuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscyhNYXRoLm1pbigzLCBudW1FbGVtZW50cyksIG1hcDMuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscyhNYXRoLm1pbig0LCBudW1FbGVtZW50cyksIG1hcDQuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworCisgICAgTGlzdDxTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4gYWxsTWFwcyA9CisgICAgICAgIG5ldyBBcnJheUxpc3Q8U21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4+KCk7CisgICAgYWxsTWFwcy5hZGQobWFwMSk7CisgICAgYWxsTWFwcy5hZGQobWFwMik7CisgICAgYWxsTWFwcy5hZGQobWFwMyk7CisgICAgYWxsTWFwcy5hZGQobWFwNCk7CisKKyAgICBmb3IgKFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA6IGFsbE1hcHMpIHsKKyAgICAgIGFzc2VydEVxdWFscyhudW1FbGVtZW50cywgbWFwLnNpemUoKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgbWFwLmdldChpKSk7CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0RXF1YWxzKG1hcDEsIG1hcDIpOworICAgIGFzc2VydEVxdWFscyhtYXAyLCBtYXAzKTsKKyAgICBhc3NlcnRFcXVhbHMobWFwMywgbWFwNCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjaW5nUHV0KCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgICBhc3NlcnROdWxsKG1hcC5yZW1vdmUoaSArIDEpKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMSksIG1hcC5wdXQoaSwgaSArIDIpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgICBhc3NlcnROdWxsKG1hcC5yZW1vdmUoaSArIDEpKTsKKyAgICB9CisKKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoNiwgIG1hcC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyhtYWtlU29ydGVkS2V5U2V0KDAsIDEsIDIsIDMsIDQsIDUpLCBtYXAua2V5U2V0KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDIpLCBtYXAucmVtb3ZlKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoNSwgIG1hcC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyhtYWtlU29ydGVkS2V5U2V0KDAsIDIsIDMsIDQsIDUpLCBtYXAua2V5U2V0KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCBtYXAucmVtb3ZlKDQpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgIG1hcC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyhtYWtlU29ydGVkS2V5U2V0KDAsIDIsIDMsIDUpLCBtYXAua2V5U2V0KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQpLCBtYXAucmVtb3ZlKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1ha2VTb3J0ZWRLZXlTZXQoMCwgMiwgNSksIG1hcC5rZXlTZXQoKSk7CisKKyAgICBhc3NlcnROdWxsKG1hcC5yZW1vdmUoMykpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuc2l6ZSgpKTsKKworICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxKSwgbWFwLnJlbW92ZSgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5zaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgfQorICAgIG1hcC5jbGVhcigpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuc2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRBcnJheUVudHJ5QW5kT3ZlcmZsb3dFbnRyaWVzKCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPSBtYXAuZ2V0QXJyYXlFbnRyeUF0KGkpOworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBpdCA9CisgICAgICAgIG1hcC5nZXRPdmVyZmxvd0VudHJpZXMoKS5pdGVyYXRvcigpOworICAgIGZvciAoaW50IGkgPSAzOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnRUcnVlKGl0Lmhhc05leHQoKSk7CisgICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPSBpdC5uZXh0KCk7CisgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMSksIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0Q29udGFpbnMoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgU2V0PE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gZW50cnlTZXQgPSBtYXAuZW50cnlTZXQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICBlbnRyeVNldC5jb250YWlucyhuZXcgU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4oaSwgaSArIDEpKSk7CisgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICBlbnRyeVNldC5jb250YWlucyhuZXcgU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4oaSwgaSkpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXRBZGQoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIFNldDxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGVudHJ5U2V0ID0gbWFwLmVudHJ5U2V0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9CisgICAgICAgICAgbmV3IFNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+KGksIGkgKyAxKTsKKyAgICAgIGFzc2VydFRydWUoZW50cnlTZXQuYWRkKGVudHJ5KSk7CisgICAgICBhc3NlcnRGYWxzZShlbnRyeVNldC5hZGQoZW50cnkpKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMSksIG1hcC5nZXQoaSkpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoNiwgbWFwLnNpemUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXRSZW1vdmUoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIFNldDxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGVudHJ5U2V0ID0gbWFwLmVudHJ5U2V0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0KKyAgICAgICAgICBuZXcgU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4oaSwgaSArIDEpOworICAgICAgYXNzZXJ0VHJ1ZShlbnRyeVNldC5yZW1vdmUoZW50cnkpKTsKKyAgICAgIGFzc2VydEZhbHNlKGVudHJ5U2V0LnJlbW92ZShlbnRyeSkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuc2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldENsZWFyKCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgfQorICAgIG1hcC5lbnRyeVNldCgpLmNsZWFyKCk7CisgICAgYXNzZXJ0VHJ1ZShtYXAuaXNFbXB0eSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLnNpemUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXRJdGVyYXRvck5leHQoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydFRydWUoaXQuaGFzTmV4dCgpKTsKKyAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IGl0Lm5leHQoKTsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpKSwgZW50cnkuZ2V0S2V5KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIGFzc2VydEZhbHNlKGl0Lmhhc05leHQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXRJdGVyYXRvclJlbW92ZSgpIHsKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOworICAgIH0KKyAgICBJdGVyYXRvcjxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoaSkpOworICAgICAgaXQubmV4dCgpOworICAgICAgaXQucmVtb3ZlKCk7CisgICAgICBhc3NlcnRGYWxzZShtYXAuY29udGFpbnNLZXkoaSkpOworICAgICAgYXNzZXJ0RXF1YWxzKDYgLSBpIC0gMSwgbWFwLnNpemUoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1hcEVudHJ5TW9kaWZpY2F0aW9uKCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgfQorICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPSBpdC5uZXh0KCk7CisgICAgICBlbnRyeS5zZXRWYWx1ZShpICsgMjMpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAyMyksIG1hcC5nZXQoaSkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNYWtlSW1tdXRhYmxlKCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgfQorICAgIG1hcC5tYWtlSW1tdXRhYmxlKCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCBtYXAuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoNiwgbWFwLnNpemUoKSk7CisKKyAgICB0cnkgeworICAgICAgbWFwLnB1dCgyMywgMjMpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgIH0KKworICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBvdGhlciA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CisgICAgb3RoZXIucHV0KDIzLCAyMyk7CisgICAgdHJ5IHsKKyAgICAgIG1hcC5wdXRBbGwob3RoZXIpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgIH0KKworICAgIHRyeSB7CisgICAgICBtYXAucmVtb3ZlKDApOworICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgIH0KKworICAgIHRyeSB7CisgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisKKyAgICBTZXQ8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBlbnRyeVNldCA9IG1hcC5lbnRyeVNldCgpOworICAgIHRyeSB7CisgICAgICBlbnRyeVNldC5jbGVhcigpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgIH0KKworICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gaXQgPSBlbnRyeVNldC5pdGVyYXRvcigpOworICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IGl0Lm5leHQoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGVudHJ5LnNldFZhbHVlKDApOworICAgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTZXQ8SW50ZWdlcj4ga2V5U2V0ID0gbWFwLmtleVNldCgpOworICAgIHRyeSB7CisgICAgICBrZXlTZXQuY2xlYXIoKTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisKKyAgICBJdGVyYXRvcjxJbnRlZ2VyPiBrZXlzID0ga2V5U2V0Lml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7CisgICAgICBJbnRlZ2VyIGtleSA9IGtleXMubmV4dCgpOworICAgICAgdHJ5IHsKKyAgICAgICAga2V5U2V0LnJlbW92ZShrZXkpOworICAgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGtleXMucmVtb3ZlKCk7CisgICAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgU2V0PEludGVnZXI+IG1ha2VTb3J0ZWRLZXlTZXQoSW50ZWdlci4uLiBrZXlzKSB7CisgICAgcmV0dXJuIG5ldyBUcmVlU2V0PEludGVnZXI+KEFycmF5cy48SW50ZWdlcj5hc0xpc3Qoa2V5cykpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Rlc3RCYWRJZGVudGlmaWVycy5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJhY2YwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YQpAQCAtMCwwICsxLDYzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgdGhhdCBwcm90bzIgYXBpIGdlbmVyYXRpb24gZG9lc24ndCBjYXVzZSBjb21waWxlIGVycm9ycyB3aGVuCisgKiBjb21waWxpbmcgcHJvdG9jb2wgYnVmZmVycyB0aGF0IGhhdmUgbmFtZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgY29uZmxpY3QKKyAqIGlmIG5vdCBmdWxseSBxdWFsaWZpZWQgKGxpa2UgQERlcHJlY2F0ZWQgYW5kIEBPdmVycmlkZSkuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QmFkSWRlbnRpZmllcnMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uKCkgeworICAgIC8vIElmIHRoaXMgY29tcGlsZXMsIGl0IG1lYW5zIHRoZSBnZW5lcmF0aW9uIHdhcyBjb3JyZWN0LgorICAgIFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvLkRlcHJlY2F0ZWQubmV3QnVpbGRlcigpOworICAgIFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvLk92ZXJyaWRlLm5ld0J1aWxkZXIoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXREZXNjcmlwdG9yKCkgeworICAgIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0KKyAgICAgICAgVGVzdEJhZElkZW50aWZpZXJzUHJvdG8uZ2V0RGVzY3JpcHRvcigpOworICAgIFN0cmluZyBkZXNjcmlwdG9yRmllbGQgPSBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5EZXNjcmlwdG9yCisgICAgICAgIC5nZXREZWZhdWx0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKCk7CisgICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBwcm90b0Rlc2NyaXB0b3IgPSBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5EZXNjcmlwdG9yCisgICAgICAgIC5nZXREZWZhdWx0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOworICAgIFN0cmluZyBuZXN0ZWREZXNjcmlwdG9yRmllbGQgPSBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5EZXNjcmlwdG9yCisgICAgICAgIC5OZXN0ZWREZXNjcmlwdG9yLmdldERlZmF1bHRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IoKTsKKyAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG5lc3RlZFByb3RvRGVzY3JpcHRvciA9IFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvCisgICAgICAgIC5EZXNjcmlwdG9yLk5lc3RlZERlc2NyaXB0b3IuZ2V0RGVmYXVsdEluc3RhbmNlKCkKKyAgICAgICAgLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGVzdFV0aWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY1YzYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsMzk1NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZTsKKworLy8gVGhlIHN0YXRpYyBpbXBvcnRzIGFyZSB0byBhdm9pZCAxMDArIGNoYXIgbGluZXMuICBUaGUgZm9sbG93aW5nIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0bworLy8gaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLio7CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEludDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRJbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0VWludDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRVaW50NjRFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFNpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U2ludDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEZsb2F0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHREb3VibGVFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEJvb2xFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFN0cmluZ0V4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Qnl0ZXNFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Q29yZEV4dGVuc2lvbjsKKworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFVpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFVpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFNpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFNpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZsb2F0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsQm9vbEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFN0cmluZ0V4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEJ5dGVzRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsR3JvdXBFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxDb3JkRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsTGF6eU1lc3NhZ2VFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbjsKKworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFVpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFNpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEZsb2F0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkQm9vbEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFN0cmluZ0V4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkR3JvdXBFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRDb3JkRXh0ZW5zaW9uOworCitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uT3B0aW9uYWxHcm91cF9leHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uUmVwZWF0ZWRHcm91cF9leHRlbnNpb247CisKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRJbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRJbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRVaW50MzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkVWludDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRTaW50NjRFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkRml4ZWQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEZsb2F0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZERvdWJsZUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRCb29sRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEVudW1FeHRlbnNpb247CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkSW50MzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkQm9vbEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEVudW1FeHRlbnNpb25MaXRlOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zT3JCdWlsZGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZEV4dGVuc2lvbnM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0VW5wYWNrZWRUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25NZXNzYWdlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbkVudW07CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW07CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydE1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0UHVibGljLlB1YmxpY0ltcG9ydE1lc3NhZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxFeHRlbnNpb25zTGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGVPckJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLkZvcmVpZ25NZXNzYWdlTGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5Gb3JlaWduRW51bUxpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdEltcG9ydExpdGUuSW1wb3J0RW51bUxpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdEltcG9ydExpdGUuSW1wb3J0TWVzc2FnZUxpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdEltcG9ydFB1YmxpY0xpdGUuUHVibGljSW1wb3J0TWVzc2FnZUxpdGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworCisvKioKKyAqIENvbnRhaW5zIG1ldGhvZHMgZm9yIHNldHRpbmcgYWxsIGZpZWxkcyBvZiB7QGNvZGUgVGVzdEFsbFR5cGVzfSB0bworICogc29tZSB2YWx1ZXMgYXMgd2VsbCBhcyBjaGVja2luZyB0aGF0IGFsbCB0aGUgZmllbGRzIGFyZSBzZXQgdG8gdGhvc2UgdmFsdWVzLgorICogVGhlc2UgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZyB2YXJpb3VzIHByb3RvY29sIG1lc3NhZ2UgZmVhdHVyZXMsIGUuZy4KKyAqIHNldCBhbGwgZmllbGRzIG9mIGEgbWVzc2FnZSwgc2VyaWFsaXplIGl0LCBwYXJzZSBpdCwgYW5kIGNoZWNrIHRoYXQgYWxsCisgKiBmaWVsZHMgYXJlIHNldC4KKyAqCisgKiA8cD5UaGlzIGNvZGUgaXMgbm90IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB7QGNvZGUgY29tLmdvb2dsZS5wcm90b2J1Zn0gYW5kCisgKiBzdWJwYWNrYWdlcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGVzdFV0aWwgeworICBwcml2YXRlIFRlc3RVdGlsKCkge30KKworICAvKiogSGVscGVyIHRvIGNvbnZlcnQgYSBTdHJpbmcgdG8gQnl0ZVN0cmluZy4gKi8KKyAgc3RhdGljIEJ5dGVTdHJpbmcgdG9CeXRlcyhTdHJpbmcgc3RyKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKHN0ci5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgfSBjYXRjaChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQuIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCBhIHtAY29kZSBUZXN0QWxsVHlwZXN9IHdpdGggYWxsIGZpZWxkcyBzZXQgYXMgdGhleSB3b3VsZCBiZSBieQorICAgKiB7QGxpbmsgI3NldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXMuQnVpbGRlcil9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgZ2V0QWxsU2V0KCkgeworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIEdldCBhIHtAY29kZSBUZXN0QWxsVHlwZXMuQnVpbGRlcn0gd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5CisgICAqIHtAbGluayAjc2V0QWxsRmllbGRzKFRlc3RBbGxUeXBlcy5CdWlsZGVyKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGdldEFsbFNldEJ1aWxkZXIoKSB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgc2V0QWxsRmllbGRzKGJ1aWxkZXIpOworICAgIHJldHVybiBidWlsZGVyOworICB9CisKKyAgLyoqCisgICAqIEdldCBhIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc30gd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5CisgICAqIHtAbGluayAjc2V0QWxsRXh0ZW5zaW9ucyhUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zIGdldEFsbEV4dGVuc2lvbnNTZXQoKSB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIHNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIGdldEFsbExpdGVFeHRlbnNpb25zU2V0KCkgeworICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpOworICAgIHNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIGdldFBhY2tlZFNldCgpIHsKKyAgICBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBzZXRQYWNrZWRGaWVsZHMoYnVpbGRlcik7CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgZ2V0VW5wYWNrZWRTZXQoKSB7CisgICAgVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFVucGFja2VkVHlwZXMubmV3QnVpbGRlcigpOworICAgIHNldFVucGFja2VkRmllbGRzKGJ1aWxkZXIpOworICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIGdldFBhY2tlZEV4dGVuc2lvbnNTZXQoKSB7CisgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIHNldFBhY2tlZEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIGdldExpdGVQYWNrZWRFeHRlbnNpb25zU2V0KCkgeworICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpOworICAgIHNldFBhY2tlZEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgZXZlcnkgZmllbGQgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIHRoZSB2YWx1ZXMgZXhwZWN0ZWQgYnkKKyAgICoge0Bjb2RlIGFzc2VydEFsbEZpZWxkc1NldCgpfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxGaWVsZHMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxJbnQzMiAgICgxMDEpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxJbnQ2NCAgICgxMDIpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxVaW50MzIgICgxMDMpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxVaW50NjQgICgxMDQpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTaW50MzIgICgxMDUpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTaW50NjQgICgxMDYpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxGaXhlZDMyICgxMDcpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxGaXhlZDY0ICgxMDgpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTZml4ZWQzMigxMDkpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTZml4ZWQ2NCgxMTApOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxGbG9hdCAgICgxMTEpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxEb3VibGUgICgxMTIpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxCb29sICAgICh0cnVlKTsKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsU3RyaW5nICAoIjExNSIpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxCeXRlcyAgICh0b0J5dGVzKCIxMTYiKSk7CisKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsR3JvdXAoCisgICAgICBUZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5uZXdCdWlsZGVyKCkuc2V0QSgxMTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDExOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKAorICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSgKKyAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoMTIwKS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSgKKyAgICAgIFB1YmxpY0ltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEUoMTI2KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsTGF6eU1lc3NhZ2UoCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTI3KS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtIChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxGb3JlaWduRW51bShGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEltcG9ydEVudW0gKEltcG9ydEVudW0uSU1QT1JUX0JBWik7CisKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsU3RyaW5nUGllY2UoIjEyNCIpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxDb3JkKCIxMjUiKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW50MzIgICAoMjAxKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW50NjQgICAoMjAyKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkVWludDMyICAoMjAzKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkVWludDY0ICAoMjA0KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ludDMyICAoMjA1KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ludDY0ICAoMjA2KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRml4ZWQzMiAoMjA3KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRml4ZWQ2NCAoMjA4KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ZpeGVkMzIoMjA5KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ZpeGVkNjQoMjEwKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmxvYXQgICAoMjExKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRG91YmxlICAoMjEyKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkQm9vbCAgICAodHJ1ZSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFN0cmluZyAgKCIyMTUiKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkQnl0ZXMgICAodG9CeXRlcygiMjE2IikpOworCisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEdyb3VwKAorICAgICAgVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAubmV3QnVpbGRlcigpLnNldEEoMjE3KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKKyAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigyMTgpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgKKyAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDIxOSkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoCisgICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDIyMCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZExhenlNZXNzYWdlKAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIyNykuYnVpbGQoKSk7CisKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkTmVzdGVkRW51bSAoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRm9yZWlnbkVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbXBvcnRFbnVtIChJbXBvcnRFbnVtLklNUE9SVF9CQVIpOworCisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFN0cmluZ1BpZWNlKCIyMjQiKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkQ29yZCgiMjI1Iik7CisKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEludDMyICAgKDMwMSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEludDY0ICAgKDMwMik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFVpbnQzMiAgKDMwMyk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFVpbnQ2NCAgKDMwNCk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNpbnQzMiAgKDMwNSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNpbnQ2NCAgKDMwNik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpeGVkMzIgKDMwNyk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpeGVkNjQgKDMwOCk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNmaXhlZDMyKDMwOSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNmaXhlZDY0KDMxMCk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZsb2F0ICAgKDMxMSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZERvdWJsZSAgKDMxMik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEJvb2wgICAgKGZhbHNlKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU3RyaW5nICAoIjMxNSIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRCeXRlcyAgICh0b0J5dGVzKCIzMTYiKSk7CisKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkR3JvdXAoCisgICAgICBUZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cC5uZXdCdWlsZGVyKCkuc2V0QSgzMTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDMxOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKAorICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMzE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW1wb3J0TWVzc2FnZSgKKyAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoMzIwKS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkTGF6eU1lc3NhZ2UoCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzI3KS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtIChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGb3JlaWduRW51bShGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEltcG9ydEVudW0gKEltcG9ydEVudW0uSU1QT1JUX0JBWik7CisKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU3RyaW5nUGllY2UoIjMyNCIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRDb3JkKCIzMjUiKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBtZXNzYWdlLnNldERlZmF1bHRJbnQzMiAgICg0MDEpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEludDY0ICAgKDQwMik7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0VWludDMyICAoNDAzKTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRVaW50NjQgICg0MDQpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFNpbnQzMiAgKDQwNSk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0U2ludDY0ICAoNDA2KTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRGaXhlZDMyICg0MDcpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEZpeGVkNjQgKDQwOCk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0U2ZpeGVkMzIoNDA5KTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRTZml4ZWQ2NCg0MTApOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEZsb2F0ICAgKDQxMSk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0RG91YmxlICAoNDEyKTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRCb29sICAgIChmYWxzZSk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0U3RyaW5nICAoIjQxNSIpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEJ5dGVzICAgKHRvQnl0ZXMoIjQxNiIpKTsKKworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTyk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0Rm9yZWlnbkVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEltcG9ydEVudW0gKEltcG9ydEVudW0uSU1QT1JUX0ZPTyk7CisKKyAgICBtZXNzYWdlLnNldERlZmF1bHRTdHJpbmdQaWVjZSgiNDI0Iik7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0Q29yZCgiNDI1Iik7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZmllbGRzIG9mIHtAY29kZSBtZXNzYWdlfSB0byBjb250YWluIHRoZSB2YWx1ZXMKKyAgICogZXhwZWN0ZWQgYnkge0Bjb2RlIGFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbW9kaWZ5UmVwZWF0ZWRGaWVsZHMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbnQzMiAgICgxLCA1MDEpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbnQ2NCAgICgxLCA1MDIpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRVaW50MzIgICgxLCA1MDMpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRVaW50NjQgICgxLCA1MDQpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTaW50MzIgICgxLCA1MDUpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTaW50NjQgICgxLCA1MDYpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaXhlZDMyICgxLCA1MDcpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaXhlZDY0ICgxLCA1MDgpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTZml4ZWQzMigxLCA1MDkpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTZml4ZWQ2NCgxLCA1MTApOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGbG9hdCAgICgxLCA1MTEpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWREb3VibGUgICgxLCA1MTIpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRCb29sICAgICgxLCB0cnVlKTsKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkU3RyaW5nICAoMSwgIjUxNSIpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRCeXRlcyAgICgxLCB0b0J5dGVzKCI1MTYiKSk7CisKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkR3JvdXAoMSwKKyAgICAgIFRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDUxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoMSwKKyAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MTgpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxLAorICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoNTE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSgxLAorICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCg1MjApLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRMYXp5TWVzc2FnZSgxLAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDUyNykuYnVpbGQoKSk7CisKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkTmVzdGVkRW51bSAoMSwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkRm9yZWlnbkVudW0oMSwgRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbXBvcnRFbnVtICgxLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOworCisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEsICI1MjQiKTsKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkQ29yZCgxLCAiNTI1Iik7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRmllbGRzfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxGaWVsZHNTZXQoVGVzdEFsbFR5cGVzT3JCdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsVWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZsb2F0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxEb3VibGUgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZyAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCAgICAgICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCAgICAgICAgICgpLmhhc0EoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkuaGFzQmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuaGFzQygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSAoKS5oYXNEKCkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZEVudW0gKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW1wb3J0RW51bSAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nUGllY2UoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbENvcmQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMSAgLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDIgICwgbWVzc2FnZS5nZXRPcHRpb25hbEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAzICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNCAgLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDUgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA2ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNyAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDggICwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA5ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMCAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTEgICwgbWVzc2FnZS5nZXRPcHRpb25hbEZsb2F0ICAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTIgICwgbWVzc2FnZS5nZXRPcHRpb25hbERvdWJsZSAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRPcHRpb25hbEJvb2wgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjExNSIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmcgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjExNiIpLCBtZXNzYWdlLmdldE9wdGlvbmFsQnl0ZXMoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExNywgbWVzc2FnZS5nZXRPcHRpb25hbEdyb3VwICAgICAgICAgICAgICAoKS5nZXRBKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE4LCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSAgICAgICgpLmdldEJiKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE5LCBtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgICAgICgpLmdldEMoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlICAgICAgKCkuZ2V0RCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyNiwgbWVzc2FnZS5nZXRPcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UoKS5nZXRFKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTI3LCBtZXNzYWdlLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UgICAgICAgICgpLmdldEJiKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0JBWiwgbWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjQiLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nUGllY2UoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTI1IiwgbWVzc2FnZS5nZXRPcHRpb25hbENvcmQoKSk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQ2NENvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQzMkNvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDY0Q291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzJDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQ2NENvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQzMkNvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDY0Q291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDMyQ291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkNjRDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdENvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZUNvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbENvdW50ICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzQ291bnQgICAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cENvdW50ICAgICAgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlQ291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bUNvdW50ICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bUNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW1Db3VudCAgICAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmRDb3VudCgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMiAgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0ICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA0ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjQgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMiAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0ICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDggICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjQgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzIoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEwICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NCgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0ICAgKDApLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEyICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGUgICgwKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbCAgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmcgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzKDApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE3LCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXAgICAgICAgICAoMCkuZ2V0QSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgKDApLmdldEJiKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UgKDApLmdldEQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZSAgICgwKS5nZXRCYigpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bSAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bSgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9CQVIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZSgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmQoMCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyICAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjQgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzIgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDQgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NCAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA2ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjQgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzIgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwOCAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NCAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMigxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTAgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0KDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXQgICAoMSksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZSAgKDEpLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sICAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZyAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXMoMSkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cCAgICAgICAgICgxKS5nZXRBKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE4LCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSAoMSkuZ2V0QmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxKS5nZXRDKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzIwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSAoMSkuZ2V0RCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyNywgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlICAgKDEpLmdldEJiKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0JBWiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW0oMSkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZCgxKSk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0SW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0SW50NjQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0VWludDMyICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0VWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ludDMyICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQ2NCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkMzIoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0RmxvYXQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0RG91YmxlICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Qm9vbCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Qnl0ZXMgICAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHROZXN0ZWRFbnVtICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRJbXBvcnRFbnVtICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZ1BpZWNlKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdENvcmQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMSAgLCBtZXNzYWdlLmdldERlZmF1bHRJbnQzMiAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMiAgLCBtZXNzYWdlLmdldERlZmF1bHRJbnQ2NCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMyAgLCBtZXNzYWdlLmdldERlZmF1bHRVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNCAgLCBtZXNzYWdlLmdldERlZmF1bHRVaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNSAgLCBtZXNzYWdlLmdldERlZmF1bHRTaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNiAgLCBtZXNzYWdlLmdldERlZmF1bHRTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNyAgLCBtZXNzYWdlLmdldERlZmF1bHRGaXhlZDMyICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwOCAgLCBtZXNzYWdlLmdldERlZmF1bHRGaXhlZDY0ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwOSAgLCBtZXNzYWdlLmdldERlZmF1bHRTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMCAgLCBtZXNzYWdlLmdldERlZmF1bHRTZml4ZWQ2NCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMSAgLCBtZXNzYWdlLmdldERlZmF1bHRGbG9hdCAgICgpLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDEyICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdERvdWJsZSAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXREZWZhdWx0Qm9vbCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDE1IiwgbWVzc2FnZS5nZXREZWZhdWx0U3RyaW5nICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCI0MTYiKSwgbWVzc2FnZS5nZXREZWZhdWx0Qnl0ZXMoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywgbWVzc2FnZS5nZXREZWZhdWx0TmVzdGVkRW51bSAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywgbWVzc2FnZS5nZXREZWZhdWx0Rm9yZWlnbkVudW0oKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9GT08sIG1lc3NhZ2UuZ2V0RGVmYXVsdEltcG9ydEVudW0oKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MjQiLCBtZXNzYWdlLmdldERlZmF1bHRTdHJpbmdQaWVjZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MjUiLCBtZXNzYWdlLmdldERlZmF1bHRDb3JkKCkpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIGNsZWFyZWQsIGFuZCB0aGF0IGdldHRpbmcgdGhlIGZpZWxkcyByZXR1cm5zIHRoZWlyCisgICAqIGRlZmF1bHQgdmFsdWVzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENsZWFyKFRlc3RBbGxUeXBlc09yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgLy8gaGFzQmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbnQzMiAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsVWludDMyICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU2ludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGaXhlZDMyICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkMzIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQ2NCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZsb2F0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRG91YmxlICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCb29sICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZyAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsQnl0ZXMgICAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEdyb3VwICAgICAgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25FbnVtKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW1wb3J0RW51bSAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZ1BpZWNlKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsQ29yZCgpKTsKKworICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbEZsb2F0ICAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbERvdWJsZSAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRPcHRpb25hbEJvb2wgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmcgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxCeXRlcygpKTsKKworICAgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldE9wdGlvbmFsR3JvdXAgICAgICAgICAgICAgICgpLmhhc0EoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlICAgICAgKCkuaGFzQmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSAgICAgKCkuaGFzQygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UgICAgICAoKS5oYXNEKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldE9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSgpLmhhc0UoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxMYXp5TWVzc2FnZSAgICAgICAgKCkuaGFzQmIoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCAgICAgICAgICAgICAgKCkuZ2V0QSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlICAgICAgKCkuZ2V0QmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgICAgICgpLmdldEMoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSAgICAgICgpLmdldEQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSgpLmdldEUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UgICAgICAgICgpLmdldEJiKCkpOworCisgICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZEVudW0gKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0ZPTywgbWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nUGllY2UoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRPcHRpb25hbENvcmQoKSk7CisKKyAgICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyQ291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzJDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NENvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzJDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NENvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMkNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0Q291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGVDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2xDb3VudCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlc0NvdW50ICAgKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCAgICAgICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZUNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW1Db3VudCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1Db3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQgICAgKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2VDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkQ291bnQoKSk7CisKKyAgICAvLyBoYXNCbGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0SW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0VWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZsb2F0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHREb3VibGUgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Qm9vbCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZyAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRCeXRlcyAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHROZXN0ZWRFbnVtICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Rm9yZWlnbkVudW0oKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEltcG9ydEVudW0gKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZ1BpZWNlKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRDb3JkKCkpOworCisgICAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MSAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEludDMyICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQyICAgICwgbWVzc2FnZS5nZXREZWZhdWx0SW50NjQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDMgICAgLCBtZXNzYWdlLmdldERlZmF1bHRVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NCAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFVpbnQ2NCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTQ1ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ludDMyICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDYgICAgLCBtZXNzYWdlLmdldERlZmF1bHRTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NyAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZpeGVkMzIgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ4ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0Rml4ZWQ2NCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDkgICAgLCBtZXNzYWdlLmdldERlZmF1bHRTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC01MCAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNmaXhlZDY0KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDUxLjUgICwgbWVzc2FnZS5nZXREZWZhdWx0RmxvYXQgICAoKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1MmUzICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdERvdWJsZSAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICAgLCBtZXNzYWdlLmdldERlZmF1bHRCb29sICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG1lc3NhZ2UuZ2V0RGVmYXVsdFN0cmluZyAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygid29ybGQiKSwgbWVzc2FnZS5nZXREZWZhdWx0Qnl0ZXMoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwgbWVzc2FnZS5nZXREZWZhdWx0TmVzdGVkRW51bSAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwgbWVzc2FnZS5nZXREZWZhdWx0Rm9yZWlnbkVudW0oKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9CQVIsIG1lc3NhZ2UuZ2V0RGVmYXVsdEltcG9ydEVudW0oKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhYmMiLCBtZXNzYWdlLmdldERlZmF1bHRTdHJpbmdQaWVjZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjMiLCBtZXNzYWdlLmdldERlZmF1bHRDb3JkKCkpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCisgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldEFsbEZpZWxkc30KKyAgICogZm9sbG93ZWQgYnkge0Bjb2RlIG1vZGlmeVJlcGVhdGVkRmllbGRzfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKAorICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKKyAgICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAorICAgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMkNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMkNvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0Q291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjRDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzJDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NENvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sQ291bnQgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ0NvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXNDb3VudCAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwQ291bnQgICAgICAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bUNvdW50ICAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjQgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzIgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NCAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA2TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjQgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzIgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NCAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMigwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0KDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXQgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEyRCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGUgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2wgICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlcygwKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxNywgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwICAgICAgICAgKDApLmdldEEoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTgsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlICgwKS5nZXRCYigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLmdldEMoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlICgwKS5nZXREKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjI3LCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2UgICAoMCkuZ2V0QmIoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW0gKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW0oMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2UoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkKDApKTsKKworICAgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMiAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0ICAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjQgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMiAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0ICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjQgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzIoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NCgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0ICAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sICAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZyAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXMoMSkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cCAgICAgICAgICgxKS5nZXRBKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE4LCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSAoMSkuZ2V0QmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxKS5nZXRDKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTIwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSAoMSkuZ2V0RCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUyNywgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlICAgKDEpLmdldEJiKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0ZPTywgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW0oMSkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZCgxKSk7CisgIH0KKworICAvKioKKyAgICogU2V0IGV2ZXJ5IGZpZWxkIG9mIHtAY29kZSBtZXNzYWdlfSB0byBhIHVuaXF1ZSB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQYWNrZWRGaWVsZHMoVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgIG1lc3NhZ2UuYWRkUGFja2VkSW50MzIgICAoNjAxKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZEludDY0ICAgKDYwMik7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRVaW50MzIgICg2MDMpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkVWludDY0ICAoNjA0KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFNpbnQzMiAgKDYwNSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRTaW50NjQgICg2MDYpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkRml4ZWQzMiAoNjA3KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZEZpeGVkNjQgKDYwOCk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRTZml4ZWQzMig2MDkpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ZpeGVkNjQoNjEwKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZEZsb2F0ICAgKDYxMSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWREb3VibGUgICg2MTIpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkQm9vbCAgICAodHJ1ZSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRFbnVtICAgIChGb3JlaWduRW51bS5GT1JFSUdOX0JBUik7CisgICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICAgIG1lc3NhZ2UuYWRkUGFja2VkSW50MzIgICAoNzAxKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZEludDY0ICAgKDcwMik7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRVaW50MzIgICg3MDMpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkVWludDY0ICAoNzA0KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFNpbnQzMiAgKDcwNSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRTaW50NjQgICg3MDYpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkRml4ZWQzMiAoNzA3KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZEZpeGVkNjQgKDcwOCk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRTZml4ZWQzMig3MDkpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ZpeGVkNjQoNzEwKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZEZsb2F0ICAgKDcxMSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWREb3VibGUgICg3MTIpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkQm9vbCAgICAoZmFsc2UpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkRW51bSAgICAoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOworICB9CisKKyAgLyoqCisgICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gYSB1bmlxdWUgdmFsdWUuIE11c3QgY29ycmVzcG9uZCB3aXRoCisgICAqIHRoZSB2YWx1ZXMgYXBwbGllZCBieSB7QGNvZGUgc2V0UGFja2VkRmllbGRzfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVbnBhY2tlZEZpZWxkcyhUZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkSW50MzIgICAoNjAxKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkSW50NjQgICAoNjAyKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkVWludDMyICAoNjAzKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkVWludDY0ICAoNjA0KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ludDMyICAoNjA1KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ludDY0ICAoNjA2KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRml4ZWQzMiAoNjA3KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRml4ZWQ2NCAoNjA4KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ZpeGVkMzIoNjA5KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ZpeGVkNjQoNjEwKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRmxvYXQgICAoNjExKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRG91YmxlICAoNjEyKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkQm9vbCAgICAodHJ1ZSk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZEVudW0gICAgKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZEludDMyICAgKDcwMSk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZEludDY0ICAgKDcwMik7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZFVpbnQzMiAgKDcwMyk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZFVpbnQ2NCAgKDcwNCk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNpbnQzMiAgKDcwNSk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNpbnQ2NCAgKDcwNik7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZpeGVkMzIgKDcwNyk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZpeGVkNjQgKDcwOCk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNmaXhlZDMyKDcwOSk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNmaXhlZDY0KDcxMCk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZsb2F0ICAgKDcxMSk7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZERvdWJsZSAgKDcxMik7CisgICAgbWVzc2FnZS5hZGRVbnBhY2tlZEJvb2wgICAgKGZhbHNlKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRW51bSAgICAoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0UGFja2VkRmllbGRzfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQYWNrZWRGaWVsZHNTZXQoVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkSW50MzJDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkSW50NjRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDY0Q291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDY0Q291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQzMkNvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQ2NENvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkMzJDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkNjRDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRmxvYXRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRG91YmxlQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkQm9vbENvdW50ICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRW51bUNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAxICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50MzIgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAyICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50NjQgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAzICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDMyICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA0ICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDY0ICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA1ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDMyICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA2ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDY0ICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA3ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQzMiAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA4ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQ2NCAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA5ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkMzIoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjEwICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkNjQoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjExICAsIG1lc3NhZ2UuZ2V0UGFja2VkRmxvYXQgICAoMCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTIgICwgbWVzc2FnZS5nZXRQYWNrZWREb3VibGUgICgwKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFBhY2tlZEJvb2wgICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFBhY2tlZEVudW0oMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAxICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50MzIgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAyICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50NjQgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAzICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDMyICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA0ICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDY0ICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA1ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDMyICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA2ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDY0ICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA3ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQzMiAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA4ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQ2NCAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA5ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkMzIoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEwICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkNjQoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzExICAsIG1lc3NhZ2UuZ2V0UGFja2VkRmxvYXQgICAoMSksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTIgICwgbWVzc2FnZS5nZXRQYWNrZWREb3VibGUgICgxKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldFBhY2tlZEJvb2wgICAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBtZXNzYWdlLmdldFBhY2tlZEVudW0oMSkpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0VW5wYWNrZWRGaWVsZHN9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFVucGFja2VkRmllbGRzU2V0KFRlc3RVbnBhY2tlZFR5cGVzIG1lc3NhZ2UpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQzMkNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDY0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkVWludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQzMkNvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDY0Q291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDMyQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkNjRDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkMzJDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQ2NENvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEZsb2F0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkRG91YmxlQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRCb29sQ291bnQgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEVudW1Db3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMSAgLCBtZXNzYWdlLmdldFVucGFja2VkSW50MzIgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAyICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQ2NCAgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDMgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQzMiAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNCAgLCBtZXNzYWdlLmdldFVucGFja2VkVWludDY0ICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA1ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50MzIgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDYgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQ2NCAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNyAgLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQzMiAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA4ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDY0ICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDkgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDMyKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMCAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkNjQoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjExICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGbG9hdCAgICgwKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMiAgLCBtZXNzYWdlLmdldFVucGFja2VkRG91YmxlICAoMCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRVbnBhY2tlZEJvb2wgICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFVucGFja2VkRW51bSgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDEgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDMyICAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMiAgLCBtZXNzYWdlLmdldFVucGFja2VkSW50NjQgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAzICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50MzIgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDQgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQ2NCAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNSAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDMyICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA2ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50NjQgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDcgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkMzIgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOCAgLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQ2NCAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA5ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQzMigxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTAgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDY0KDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMSAgLCBtZXNzYWdlLmdldFVucGFja2VkRmxvYXQgICAoMSksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTIgICwgbWVzc2FnZS5nZXRVbnBhY2tlZERvdWJsZSAgKDEpLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRCb29sICAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5nZXRVbnBhY2tlZEVudW0oMSkpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBMaWtlIGFib3ZlLCBidXQgZm9yIGV4dGVuc2lvbnMKKworICAvLyBKYXZhIGdldHMgY29uZnVzZWQgd2l0aCB0aGluZ3MgbGlrZSBhc3NlcnRFcXVhbHMoaW50LCBJbnRlZ2VyKTogIGl0IGNhbid0CisgIC8vIGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgYXNzZXJ0RXF1YWxzKGludCwgaW50KSBvciBhc3NlcnRFcXVhbHMoT2JqZWN0LAorICAvLyBPYmplY3QpLiAgU28gd2UgZGVmaW5lIHRoZXNlIG1ldGhvZHMgdG8gaGVscCBpdC4KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoaW50IGEsIGludCBiKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShsb25nIGEsIGxvbmcgYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmxvYXQgYSwgZmxvYXQgYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYiwgMC4wKTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShkb3VibGUgYSwgZG91YmxlIGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIsIDAuMCk7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFN0cmluZyBhLCBTdHJpbmcgYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoQnl0ZVN0cmluZyBhLCBCeXRlU3RyaW5nIGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtIGEsIEZvcmVpZ25FbnVtIGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0gYSwgSW1wb3J0RW51bSBiKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0gYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JlaWduRW51bUxpdGUgYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0RW51bUxpdGUgYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKworICAvKioKKyAgICogR2V0IGFuIHVubW9kaWZpYWJsZSB7QGxpbmsgRXh0ZW5zaW9uUmVnaXN0cnl9IGNvbnRhaW5pbmcgYWxsIHRoZQorICAgKiBleHRlbnNpb25zIG9mIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc30uCisgICAqLworICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2lvblJlZ2lzdHJ5KCkgeworICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKKyAgICByZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOworICAgIHJldHVybiByZWdpc3RyeS5nZXRVbm1vZGlmaWFibGUoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGdldEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpIHsKKyAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeUxpdGUubmV3SW5zdGFuY2UoKTsKKyAgICByZWdpc3RlckFsbEV4dGVuc2lvbnNMaXRlKHJlZ2lzdHJ5KTsKKyAgICByZXR1cm4gcmVnaXN0cnkuZ2V0VW5tb2RpZmlhYmxlKCk7CisgIH0KKworICAvKioKKyAgICogUmVnaXN0ZXIgYWxsIG9mIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc30ncyBleHRlbnNpb25zIHdpdGggdGhlCisgICAqIGdpdmVuIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJBbGxFeHRlbnNpb25zKEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7CisgICAgVW5pdHRlc3RQcm90by5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOworICAgIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc0xpdGUocmVnaXN0cnkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc0xpdGUoRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHJlZ2lzdHJ5KSB7CisgICAgVW5pdHRlc3RMaXRlLnJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7CisgIH0KKworICAvKioKKyAgICogU2V0IGV2ZXJ5IGZpZWxkIG9mIHtAY29kZSBtZXNzYWdlfSB0byB0aGUgdmFsdWVzIGV4cGVjdGVkIGJ5CisgICAqIHtAY29kZSBhc3NlcnRBbGxFeHRlbnNpb25zU2V0KCl9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFsbEV4dGVuc2lvbnMoVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBtZXNzYWdlKSB7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbiAgICwgMTAxKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uICAgLCAxMDJMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbiAgLCAxMDMpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICAsIDEwNEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uICAsIDEwNSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICwgMTA2TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uICwgMTA3KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb24gLCAxMDhMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uLCAxMDkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24sIDExMEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb24gICAsIDExMUYpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uICAsIDExMkQpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICAsIHRydWUpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uICAsICIxMTUiKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uICAgLCB0b0J5dGVzKCIxMTYiKSk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uLAorICAgICAgT3B0aW9uYWxHcm91cF9leHRlbnNpb24ubmV3QnVpbGRlcigpLnNldEEoMTE3KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24sCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24sCisgICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDEyMCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgUHVibGljSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RSgxMjYpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTGF6eU1lc3NhZ2VFeHRlbnNpb24sCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTI3KS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uLCBJbXBvcnRFbnVtLklNUE9SVF9CQVopOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbiwgIjEyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbiwgIjEyNSIpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICAsIDIwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMjAyTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMjAzKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAyMDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAyMDUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICAsIDIwNkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiAsIDIwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMjA4TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMjA5KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAyMTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAyMTFGKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAyMTJEKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCB0cnVlKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAiMjE1Iik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiAgICwgdG9CeXRlcygiMjE2IikpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiwKKyAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLm5ld0J1aWxkZXIoKS5zZXRBKDIxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIxOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwKKyAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDIxOSkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgyMjApLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb24sCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjI3KS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0JBUik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCBJbXBvcnRFbnVtLklNUE9SVF9CQVIpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgIjIyNCIpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgIjIyNSIpOworCisgICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICAsIDMwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMzAyTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMzAzKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAzMDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAzMDUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICAsIDMwNkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiAsIDMwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMzA4TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMzA5KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAzMTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAzMTFGKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAzMTJEKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCBmYWxzZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgIjMxNSIpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICAsIHRvQnl0ZXMoIjMxNiIpKTsKKworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24sCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5uZXdCdWlsZGVyKCkuc2V0QSgzMTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwKKyAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigzMTgpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sCisgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygzMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwKKyAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoMzIwKS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDMyNykuYnVpbGQoKSk7CisKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsKKworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sICIzMjQiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sICIzMjUiKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICAsIDQwMSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgLCA0MDJMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uICAsIDQwMyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiAgLCA0MDRMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uICAsIDQwNSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiAgLCA0MDZMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiAsIDQwNyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gLCA0MDhMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24sIDQwOSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uLCA0MTBMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb24gICAsIDQxMUYpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICwgNDEyRCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb24gICAgLCBmYWxzZSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgLCAiNDE1Iik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uICAgLCB0b0J5dGVzKCI0MTYiKSk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgIjQyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uLCAiNDI1Iik7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZXh0ZW5zaW9ucyBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gY29udGFpbiB0aGUgdmFsdWVzCisgICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgpfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAxLCA1MDEpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDEsIDUwMkwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDEsIDUwMyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMSwgNTA0TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMSwgNTA1KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAxLCA1MDZMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAxLCA1MDcpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDEsIDUwOEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDEsIDUwOSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSwgNTEwTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMSwgNTExRik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMSwgNTEyRCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMSwgdHJ1ZSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMSwgIjUxNSIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICAsIDEsIHRvQnl0ZXMoIjUxNiIpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24sIDEsCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5uZXdCdWlsZGVyKCkuc2V0QSg1MTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwgMSwKKyAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MTgpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDEsCisgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0Qyg1MTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwgMSwKKyAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoNTIwKS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uLCAxLAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDUyNykuYnVpbGQoKSk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24gLCAxLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08pOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDEsIEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gLCAxLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSwgIjUyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMSwgIjUyNSIpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxFeHRlbnNpb25zfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxFeHRlbnNpb25zU2V0KAorICAgICAgVGVzdEFsbEV4dGVuc2lvbnNPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbiAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkuaGFzQSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKS5oYXNCYigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5oYXNDKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApLmhhc0QoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiApKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uICAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIxMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICAgICAgKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAgICAgICkuZ2V0QmIoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiAgICAgKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAgICAgICkuZ2V0RCgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTI2LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2VFeHRlbnNpb24pLmdldEUoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbiAgICAgICAgKS5nZXRCYigpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBWiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAgICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgLCAwKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAsIDApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDApLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICwgMCkuZ2V0RCgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjI3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uICAgLCAwKS5nZXRCYigpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sIDApKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIzMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICwgMSkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gLCAxKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAxKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAsIDEpLmdldEQoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbiAgICwgMSkuZ2V0QmIoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIDEpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAxKSk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb24gICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbiApKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uICAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjQxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI0MjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbikpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIGNsZWFyZWQsIGFuZCB0aGF0IGdldHRpbmcgdGhlIGV4dGVuc2lvbnMgcmV0dXJucyB0aGVpcgorICAgKiBkZWZhdWx0IHZhbHVlcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFeHRlbnNpb25zQ2xlYXIoVGVzdEFsbEV4dGVuc2lvbnNPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb24gICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbiAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb24gICAgICAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uKSk7CisKKyAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb24gKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBGICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBEICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb24gICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIiICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEJ5dGVTdHJpbmcuRU1QVFksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb24pKTsKKworICAgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKS5oYXNBKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKS5oYXNCYigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikuaGFzQygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkuaGFzRCgpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkuZ2V0RCgpKTsKKworICAgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0ZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKKworICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZENvcmRFeHRlbnNpb24pKTsKKworICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkgdmlhIGdldEV4dGVuc2lvbigpLnNpemUoKS4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbikuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiAgICkuc2l6ZSgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb24gICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24gICAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiAgICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAgICApLnNpemUoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24pLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24pLnNpemUoKSk7CisKKyAgICAvLyBoYXNCbGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb24gICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb24gICApKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbikpOworCisgICAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQxICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MkwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDMgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ0TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKC00NSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDZMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ3ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0OEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDkgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoLTUwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA1MS41RiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNTJlM0QgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb24gICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCJoZWxsbyIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCJ3b3JsZCIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiYWJjIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjMiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbikpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxFeHRlbnNpb25zfQorICAgKiBmb2xsb3dlZCBieSB7QGNvZGUgbW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zT3JCdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKKyAgICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAorICAgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAgICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgLCAwKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAsIDApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDApLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICwgMCkuZ2V0RCgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjI3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uICAgLCAwKS5nZXRCYigpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sIDApKTsKKworICAgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCI1MTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICwgMSkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gLCAxKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAxKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAsIDEpLmdldEQoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbiAgICwgMSkuZ2V0QmIoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIDEpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAxKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGFja2VkRXh0ZW5zaW9ucyhUZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICwgNjAxKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbiAgICwgNjAyTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uICAsIDYwMyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uICAsIDYwNEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbiAgLCA2MDUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbiAgLCA2MDZMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICwgNjA3KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uICwgNjA4TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDYwOSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDYxMEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uICAgLCA2MTFGKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb24gICwgNjEyRCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbiAgICAsIHRydWUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb24gICAsIDcwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb24gICAsIDcwMkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbiAgLCA3MDMpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbiAgLCA3MDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb24gICwgNzA1KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb24gICwgNzA2TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbiAsIDcwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbiAsIDcwOEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uLCA3MDkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uLCA3MTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbiAgICwgNzExRik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uICAsIDcxMkQpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb24gICAgLCBmYWxzZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFBhY2tlZEV4dGVuc2lvbnNTZXQoVGVzdFBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRVaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRVaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWREb3VibGVFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRCb29sRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRFbnVtRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb24gICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb24gICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbiAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb24gICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uICAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbiwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb24gICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbiAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb24gLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbiAgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb24sIDEpKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gTGl0ZSBleHRlbnNpb25zCisKKyAgLyoqCisgICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQorICAgKiB7QGNvZGUgYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldCgpfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMTAxKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMTAyTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlICAsIDEwMyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICAsIDEwNEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxMDUpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxMDZMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMTA3KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMTA4TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEwOSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDExMEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxMTFGKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMTEyRCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIHRydWUpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAiMTE1Iik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUgICAsIHRvQnl0ZXMoIjExNiIpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlLAorICAgICAgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZS5uZXdCdWlsZGVyKCkuc2V0QSgxMTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDExOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBGb3JlaWduTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEMoMTE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlLAorICAgICAgSW1wb3J0TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEQoMTIwKS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlLAorICAgICAgUHVibGljSW1wb3J0TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEUoMTI2KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTI3KS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVopOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAiMTI0Iik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSwgIjEyNSIpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAyMDEpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAyMDJMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMjAzKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMjA0TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDIwNSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDIwNkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAyMDcpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAyMDhMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMjA5KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMjEwTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDIxMUYpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAyMTJEKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgdHJ1ZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsICIyMTUiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgdG9CeXRlcygiMjE2IikpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUsCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLm5ld0J1aWxkZXIoKS5zZXRBKDIxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0QygyMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCgyMjApLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlLAorICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigyMjcpLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBUik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCBJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVIpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsICIyMjQiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAiMjI1Iik7CisKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDMwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDMwMkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAzMDMpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAzMDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMzA1KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMzA2TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDMwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDMwOEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAzMDkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAzMTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMzExRik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDMxMkQpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCBmYWxzZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsICIzMTUiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgdG9CeXRlcygiMzE2IikpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUsCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLm5ld0J1aWxkZXIoKS5zZXRBKDMxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0QygzMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCgzMjApLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlLAorICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigzMjcpLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCBJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVopOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsICIzMjQiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAiMzI1Iik7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgNDAxKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlICAgLCA0MDJMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgLCA0MDMpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlICAsIDQwNEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICAsIDQwNSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgNDA2TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICwgNDA3KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCA0MDhMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlLCA0MDkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDQxMEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDQxMUYpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb25MaXRlICAsIDQxMkQpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIGZhbHNlKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAiNDE1Iik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgdG9CeXRlcygiNDE2IikpOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uRk9PKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCBJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08pOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgIjQyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZSwgIjQyNSIpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBNb2RpZnkgdGhlIHJlcGVhdGVkIGV4dGVuc2lvbnMgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGNvbnRhaW4gdGhlIHZhbHVlcworICAgKiBleHBlY3RlZCBieSB7QGNvZGUgYXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAorICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAxLCA1MDEpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxLCA1MDJMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSwgNTAzKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSwgNTA0TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDEsIDUwNSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDEsIDUwNkwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAxLCA1MDcpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxLCA1MDhMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMSwgNTA5KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMSwgNTEwTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDEsIDUxMUYpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAxLCA1MTJEKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMSwgdHJ1ZSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDEsICI1MTUiKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgMSwgdG9CeXRlcygiNTE2IikpOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUsIDEsCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLm5ld0J1aWxkZXIoKS5zZXRBKDUxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwgMSwKKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNTE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwgMSwKKyAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0Qyg1MTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUsIDEsCisgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCg1MjApLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlLCAxLAorICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MjcpLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSAsIDEsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08pOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAxLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSAsIDEsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0ZPTyk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgMSwgIjUyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDEsICI1MjUiKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRXh0ZW5zaW9uc30uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldCgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApLmhhc0EoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmhhc0JiKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKS5oYXNDKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5oYXNEKCkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjExNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjExNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApLmdldEEoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5nZXREKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMjYsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKAorICAgICAgICBvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlKS5nZXRFKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMjcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlKS5nZXRCYigpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjEyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlICAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSwgMCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICAsMCkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICwwKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwwKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgLDApLmdldEQoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAsMCkuZ2V0QmIoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIzMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIzMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUsIDEpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgLDEpLmdldEEoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMSkuZ2V0QmIoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsMSkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICwxKS5nZXREKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMjcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlICAgLDEpLmdldEJiKCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIzMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgMSkpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjQxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiNDE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjQyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjQyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZSkpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIGNsZWFyZWQsIGFuZCB0aGF0IGdldHRpbmcgdGhlIGV4dGVuc2lvbnMgcmV0dXJucyB0aGVpcgorICAgKiBkZWZhdWx0IHZhbHVlcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFeHRlbnNpb25zQ2xlYXIoCisgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGVPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgICAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb25MaXRlKSk7CisKKyAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwRiAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEQgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUpKTsKKworICAgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICAgICAgKS5oYXNBKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICAgICAgKS5oYXNCYigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUgICAgICkuaGFzQygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgICkuaGFzRCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuaGFzRSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAgICAgICkuaGFzQmIoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApLmdldEEoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5nZXREKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbigKKyAgICAgICAgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuZ2V0RSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICApLmdldEJiKCkpOworCisgICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlICAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQyTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDMgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoLTQ1ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDZMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NyAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ4TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDkgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKC01MEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDUxLjVGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNTJlM0QgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoImhlbGxvIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCJ3b3JsZCIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCJhYmMiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjMiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUpKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRXh0ZW5zaW9uc30KKyAgICogZm9sbG93ZWQgYnkge0Bjb2RlIG1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9uc30uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGVPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAorICAgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgICAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICwwKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgLDApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLDApLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMCkuZ2V0RCgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjI3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICwwKS5nZXRCYigpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIDApKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDApKTsKKworICAgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSwgMSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICAsMSkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICwxKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwxKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgLDEpLmdldEQoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAsMSkuZ2V0QmIoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCAxKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI1MjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAxKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGFja2VkRXh0ZW5zaW9ucyhUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBtZXNzYWdlKSB7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb25MaXRlICAgLCA2MDEpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgNjAyTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCA2MDMpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgNjA0TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCA2MDUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgNjA2TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCA2MDcpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgNjA4TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCA2MDkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgNjEwTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgLCA2MTFGKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDYxMkQpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgdHJ1ZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSKTsKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb25MaXRlICAgLCA3MDEpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgNzAyTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCA3MDMpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgNzA0TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCA3MDUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgNzA2TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCA3MDcpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgNzA4TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCA3MDkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgNzEwTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgLCA3MTFGKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDcxMkQpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgZmFsc2UpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldChUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIHRoZSBzYW1lIHRoaW5ncyB0aGF0IHRoZSBtZXRob2RzIG9mIHtAY29kZSBUZXN0VXRpbH0gZG8sIGJ1dAorICAgKiB2aWEgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgVGhpcyBpcyBpdHMgb3duIGNsYXNzIGJlY2F1c2UgaXQgbmVlZHMKKyAgICogdG8ga25vdyB3aGF0IGRlc2NyaXB0b3IgdG8gdXNlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWZsZWN0aW9uVGVzdGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgYmFzZURlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeTsKKworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IgZmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yIGltcG9ydEZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciBwdWJsaWNJbXBvcnRGaWxlOworCisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG9wdGlvbmFsR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIHJlcGVhdGVkR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG5lc3RlZE1lc3NhZ2U7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGZvcmVpZ25NZXNzYWdlOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBpbXBvcnRNZXNzYWdlOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBwdWJsaWNJbXBvcnRNZXNzYWdlOworCisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ3JvdXBBOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkR3JvdXBBOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIG5lc3RlZEI7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZm9yZWlnbkM7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgaW1wb3J0RDsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBpbXBvcnRFOworCisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBuZXN0ZWRFbnVtOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3IgZm9yZWlnbkVudW07CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBpbXBvcnRFbnVtOworCisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIG5lc3RlZEZvbzsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgbmVzdGVkQmFyOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBuZXN0ZWRCYXo7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGZvcmVpZ25Gb287CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGZvcmVpZ25CYXI7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGZvcmVpZ25CYXo7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGltcG9ydEZvbzsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgaW1wb3J0QmFyOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBpbXBvcnRCYXo7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgUmVmbGVjdGlvblRlc3Rlcn0gdGhhdCB3aWxsIGV4cGVjdCBtZXNzYWdlcyB1c2luZworICAgICAqIHRoZSBnaXZlbiBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogTm9ybWFsbHkge0Bjb2RlIGJhc2VEZXNjcmlwdG9yfSBzaG91bGQgYmUgYSBkZXNjcmlwdG9yIGZvciB0aGUgdHlwZQorICAgICAqIHtAY29kZSBUZXN0QWxsVHlwZXN9LCBkZWZpbmVkIGluCisgICAgICoge0Bjb2RlIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90b30uICBIb3dldmVyLCBpZgorICAgICAqIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0gaXMgbm9uLW51bGwsIHRoZW4ge0Bjb2RlIGJhc2VEZXNjcmlwdG9yfSBzaG91bGQKKyAgICAgKiBiZSBmb3Ige0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfSBpbnN0ZWFkLCBhbmQgaW5zdGVhZCBvZiByZWFkaW5nIGFuZAorICAgICAqIHdyaXRpbmcgbm9ybWFsIGZpZWxkcywgdGhlIHRlc3RlciB3aWxsIHJlYWQgYW5kIHdyaXRlIGV4dGVuc2lvbnMuCisgICAgICogQWxsIG9mIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc30nIGV4dGVuc2lvbnMgbXVzdCBiZSByZWdpc3RlcmVkIGluIHRoZQorICAgICAqIHJlZ2lzdHJ5LgorICAgICAqLworICAgIHB1YmxpYyBSZWZsZWN0aW9uVGVzdGVyKERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgYmFzZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsKKyAgICAgIHRoaXMuYmFzZURlc2NyaXB0b3IgPSBiYXNlRGVzY3JpcHRvcjsKKyAgICAgIHRoaXMuZXh0ZW5zaW9uUmVnaXN0cnkgPSBleHRlbnNpb25SZWdpc3RyeTsKKworICAgICAgdGhpcy5maWxlID0gYmFzZURlc2NyaXB0b3IuZ2V0RmlsZSgpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBmaWxlLmdldERlcGVuZGVuY2llcygpLnNpemUoKSk7CisgICAgICB0aGlzLmltcG9ydEZpbGUgPSBmaWxlLmdldERlcGVuZGVuY2llcygpLmdldCgwKTsKKyAgICAgIHRoaXMucHVibGljSW1wb3J0RmlsZSA9IGltcG9ydEZpbGUuZ2V0RGVwZW5kZW5jaWVzKCkuZ2V0KDApOworCisgICAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIHRlc3RBbGxUeXBlczsKKyAgICAgIGlmIChiYXNlRGVzY3JpcHRvci5nZXROYW1lKCkgPT0gIlRlc3RBbGxUeXBlcyIpIHsKKyAgICAgICAgdGVzdEFsbFR5cGVzID0gYmFzZURlc2NyaXB0b3I7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXN0QWxsVHlwZXMgPSBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiVGVzdEFsbFR5cGVzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHRlc3RBbGxUeXBlcyk7CisgICAgICB9CisKKyAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgIC8vIFVzZSB0ZXN0QWxsVHlwZXMsIHJhdGhlciB0aGFuIGJhc2VEZXNjcmlwdG9yLCB0byBhbGxvdworICAgICAgICAvLyBpbml0aWFsaXphdGlvbiB1c2luZyBUZXN0UGFja2VkVHlwZXMgZGVzY3JpcHRvcnMuIFRoZXNlIG9iamVjdHMKKyAgICAgICAgLy8gd29uJ3QgYmUgdXNlZCBieSB0aGUgbWV0aG9kcyBmb3IgcGFja2VkIGZpZWxkcy4KKyAgICAgICAgdGhpcy5vcHRpb25hbEdyb3VwID0KKyAgICAgICAgICB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk9wdGlvbmFsR3JvdXAiKTsKKyAgICAgICAgdGhpcy5yZXBlYXRlZEdyb3VwID0KKyAgICAgICAgICB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIlJlcGVhdGVkR3JvdXAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMub3B0aW9uYWxHcm91cCA9CisgICAgICAgICAgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIik7CisgICAgICAgIHRoaXMucmVwZWF0ZWRHcm91cCA9CisgICAgICAgICAgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIik7CisgICAgICB9CisgICAgICB0aGlzLm5lc3RlZE1lc3NhZ2UgPSB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk5lc3RlZE1lc3NhZ2UiKTsKKyAgICAgIHRoaXMuZm9yZWlnbk1lc3NhZ2UgPSBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9yZWlnbk1lc3NhZ2UiKTsKKyAgICAgIHRoaXMuaW1wb3J0TWVzc2FnZSA9IGltcG9ydEZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJJbXBvcnRNZXNzYWdlIik7CisgICAgICB0aGlzLnB1YmxpY0ltcG9ydE1lc3NhZ2UgPSBwdWJsaWNJbXBvcnRGaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgICAiUHVibGljSW1wb3J0TWVzc2FnZSIpOworCisgICAgICB0aGlzLm5lc3RlZEVudW0gPSB0ZXN0QWxsVHlwZXMuZmluZEVudW1UeXBlQnlOYW1lKCJOZXN0ZWRFbnVtIik7CisgICAgICB0aGlzLmZvcmVpZ25FbnVtID0gZmlsZS5maW5kRW51bVR5cGVCeU5hbWUoIkZvcmVpZ25FbnVtIik7CisgICAgICB0aGlzLmltcG9ydEVudW0gPSBpbXBvcnRGaWxlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiSW1wb3J0RW51bSIpOworCisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChvcHRpb25hbEdyb3VwICk7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChyZXBlYXRlZEdyb3VwICk7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChuZXN0ZWRNZXNzYWdlICk7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChmb3JlaWduTWVzc2FnZSk7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChpbXBvcnRNZXNzYWdlICk7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChuZXN0ZWRFbnVtICAgICk7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChmb3JlaWduRW51bSAgICk7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChpbXBvcnRFbnVtICAgICk7CisKKyAgICAgIHRoaXMubmVzdGVkQiAgPSBuZXN0ZWRNZXNzYWdlIC5maW5kRmllbGRCeU5hbWUoImJiIik7CisgICAgICB0aGlzLmZvcmVpZ25DID0gZm9yZWlnbk1lc3NhZ2UuZmluZEZpZWxkQnlOYW1lKCJjIik7CisgICAgICB0aGlzLmltcG9ydEQgID0gaW1wb3J0TWVzc2FnZSAuZmluZEZpZWxkQnlOYW1lKCJkIik7CisgICAgICB0aGlzLmltcG9ydEUgID0gcHVibGljSW1wb3J0TWVzc2FnZS5maW5kRmllbGRCeU5hbWUoImUiKTsKKyAgICAgIHRoaXMubmVzdGVkRm9vID0gbmVzdGVkRW51bS5maW5kVmFsdWVCeU5hbWUoIkZPTyIpOworICAgICAgdGhpcy5uZXN0ZWRCYXIgPSBuZXN0ZWRFbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiQkFSIik7CisgICAgICB0aGlzLm5lc3RlZEJheiA9IG5lc3RlZEVudW0uZmluZFZhbHVlQnlOYW1lKCJCQVoiKTsKKyAgICAgIHRoaXMuZm9yZWlnbkZvbyA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9GT08iKTsKKyAgICAgIHRoaXMuZm9yZWlnbkJhciA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9CQVIiKTsKKyAgICAgIHRoaXMuZm9yZWlnbkJheiA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9CQVoiKTsKKyAgICAgIHRoaXMuaW1wb3J0Rm9vID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9GT08iKTsKKyAgICAgIHRoaXMuaW1wb3J0QmFyID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9CQVIiKTsKKyAgICAgIHRoaXMuaW1wb3J0QmF6ID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9CQVoiKTsKKworICAgICAgdGhpcy5ncm91cEEgPSBvcHRpb25hbEdyb3VwLmZpbmRGaWVsZEJ5TmFtZSgiYSIpOworICAgICAgdGhpcy5yZXBlYXRlZEdyb3VwQSA9IHJlcGVhdGVkR3JvdXAuZmluZEZpZWxkQnlOYW1lKCJhIik7CisKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGdyb3VwQSAgICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlcGVhdGVkR3JvdXBBKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEIgICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25DICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEQgICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEUgICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEZvbyAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEJhciAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEJheiAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25Gb28gICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25CYXIgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25CYXogICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEZvbyAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEJhciAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEJheiAgICAgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG9ydGhhbmQgdG8gZ2V0IGEgRmllbGREZXNjcmlwdG9yIGZvciBhIGZpZWxkIG9mIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZihTdHJpbmcgbmFtZSkgeworICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJlc3VsdDsKKyAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgIHJlc3VsdCA9IGJhc2VEZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lICsgIl9leHRlbnNpb24iKTsKKyAgICAgIH0KKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlc3VsdCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAY29kZSBwYXJlbnQubmV3QnVpbGRlckZvckZpZWxkKCl9IG9yIHVzZXMgdGhlCisgICAgICoge0Bjb2RlIEV4dGVuc2lvblJlZ2lzdHJ5fSB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGJ1aWxkZXIsIGRlcGVuZGluZworICAgICAqIG9uIHdoYXQgdHlwZSBpcyBiZWluZyB0ZXN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKAorICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgcGFyZW50LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uID0KKyAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeS5maW5kRXh0ZW5zaW9uQnlOdW1iZXIoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0TnVtYmVyKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChleHRlbnNpb24pOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTZXQgZXZlcnkgZmllbGQgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIHRoZSB2YWx1ZXMgZXhwZWN0ZWQgYnkKKyAgICAgKiB7QGNvZGUgYXNzZXJ0QWxsRmllbGRzU2V0KCl9LCB1c2luZyB0aGUge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0KKyAgICAgKiByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZS5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfaW50MzIiICAgKSwgMTAxICk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IiAgICksIDEwMkwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApLCAxMDMgKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfdWludDY0IiAgKSwgMTA0TCk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQzMiIgICksIDEwNSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApLCAxMDZMKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQzMiIgKSwgMTA3ICk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiICksIDEwOEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpLCAxMDkgKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkNjQiKSwgMTEwTCk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2Zsb2F0IiAgICksIDExMUYpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApLCAxMTJEKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfYm9vbCIgICAgKSwgdHJ1ZSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIgICksICIxMTUiKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfYnl0ZXMiICAgKSwgdG9CeXRlcygiMTE2IikpOworCisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9wdGlvbmFsZ3JvdXAiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChncm91cEEsIDExNykuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKG5lc3RlZEIsIDExOCkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpLAorICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQoZm9yZWlnbkMsIDExOSkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEQsIDEyMCkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpLAorICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQoaW1wb3J0RSwgMTI2KS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCAxMjcpLmJ1aWxkKCkpOworCisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApLCAgbmVzdGVkQmF6KTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25CYXopOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydEJheik7CisKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiApLCAiMTI0Iik7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiICksICIxMjUiKTsKKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDIwMSApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDY0IiAgICksIDIwMkwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDIwMyApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDIwNEwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQzMiIgICksIDIwNSApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDIwNkwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDIwNyApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDIwOEwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDIwOSApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDIxMEwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDIxMUYpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDIxMkQpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIHRydWUpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIgICksICIyMTUiKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIgICApLCB0b0J5dGVzKCIyMTYiKSk7CisKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZGdyb3VwIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQocmVwZWF0ZWRHcm91cEEsIDIxNykuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgMjE4KS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGZvcmVpZ25DLCAyMTkpLmJ1aWxkKCkpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEQsIDIyMCkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCAyMjcpLmJ1aWxkKCkpOworCisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRCYXIpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduQmFyKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydEJhcik7CisKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiICksICIyMjQiKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiApLCAiMjI1Iik7CisKKyAgICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAzMDEgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAzMDJMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiICApLCAzMDMgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAzMDRMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAzMDUgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiICApLCAzMDZMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAzMDcgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAzMDhMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAzMDkgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAzMTBMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAzMTFGKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiICApLCAzMTJEKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCBmYWxzZSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgIjMxNSIpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiAgICksIHRvQnl0ZXMoIjMxNiIpKTsKKworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkZ3JvdXAiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChyZXBlYXRlZEdyb3VwQSwgMzE3KS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLAorICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCAzMTgpLmJ1aWxkKCkpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLAorICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQoZm9yZWlnbkMsIDMxOSkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQoaW1wb3J0RCwgMzIwKS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKG5lc3RlZEIsIDMyNykuYnVpbGQoKSk7CisKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwgIG5lc3RlZEJheik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25CYXopOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLCAgaW1wb3J0QmF6KTsKKworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIgKSwgIjMyNCIpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2NvcmQiICksICIzMjUiKTsKKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ludDMyIiAgICksIDQwMSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ludDY0IiAgICksIDQwMkwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIgICksIDQwMyApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIgICksIDQwNEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIgICksIDQwNSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIgICksIDQwNkwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiICksIDQwNyApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiICksIDQwOEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIiksIDQwOSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDY0IiksIDQxMEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IiAgICksIDQxMUYpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIgICksIDQxMkQpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2Jvb2wiICAgICksIGZhbHNlKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApLCAiNDE1Iik7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfYnl0ZXMiICAgKSwgdG9CeXRlcygiNDE2IikpOworCisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRGb28pOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduRm9vKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydEZvbyk7CisKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiICksICI0MjQiKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9jb3JkIiApLCAiNDI1Iik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogTW9kaWZ5IHRoZSByZXBlYXRlZCBmaWVsZHMgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGNvbnRhaW4gdGhlIHZhbHVlcworICAgICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKCl9LCB1c2luZyB0aGUKKyAgICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICB2b2lkIG1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDEsIDUwMSApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDY0IiAgICksIDEsIDUwMkwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEsIDUwMyApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEsIDUwNEwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEsIDUwNSApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEsIDUwNkwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEsIDUwNyApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEsIDUwOEwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEsIDUwOSApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEsIDUxMEwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEsIDUxMUYpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEsIDUxMkQpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEsIHRydWUpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIgICksIDEsICI1MTUiKTsKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIgICApLCAxLCB0b0J5dGVzKCI1MTYiKSk7CisKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDEsCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZGdyb3VwIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQocmVwZWF0ZWRHcm91cEEsIDUxNykuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgNTE4KS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGZvcmVpZ25DLCA1MTkpLmJ1aWxkKCkpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEsCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEQsIDUyMCkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksIDEsCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCA1MjcpLmJ1aWxkKCkpOworCisgICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksIDEsICBuZXN0ZWRGb28pOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLCAxLCBmb3JlaWduRm9vKTsKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgMSwgIGltcG9ydEZvbyk7CisKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSwgIjUyNCIpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2NvcmQiKSwgMSwgIjUyNSIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKKyAgICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxGaWVsZHN9LAorICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgTWVzc2FnZX0gcmVmbGVjdGlvbiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbGdyb3VwIiAgICAgICAgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxncm91cCIpKSkuaGFzRmllbGQoZ3JvdXBBKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKG5lc3RlZEIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKGZvcmVpZ25DKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKGltcG9ydEQpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyTCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDMgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA1ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDZMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNyAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA4TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDkgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTExRiAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTJEICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjExNSIsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIxMTYiKSwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIpKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE3LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbGdyb3VwIikpKS5nZXRGaWVsZChncm91cEEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE4LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQobmVzdGVkQikpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTksCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTIwLAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjYsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQobmVzdGVkQikpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXN0ZWRCYXosIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJheiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmF6LCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyNCIsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyNSIsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfY29yZCIpKSk7CisKKyAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDMyIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2RvdWJsZSIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2J5dGVzIiAgICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZGdyb3VwIiAgICAgICAgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9jb3JkIikpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMCkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxNywKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEdyb3VwQSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTgsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjIwLAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyNywKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksMCkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDApKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjMxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxNywKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEdyb3VwQSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTgsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE5LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzIwLAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyNywKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksMSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjMyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDEpKTsKKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2NvcmQiKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDJMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAzICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDUgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA2TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNyAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDhMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA5ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MTFGICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDEyRCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDE1IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiNDE2IiksIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9ieXRlcyIpKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25Gb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0Rm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDI0IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MjUiLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfY29yZCIpKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgorICAgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgY2xlYXJlZCwgYW5kIHRoYXQgZ2V0dGluZyB0aGUgZmllbGRzIHJldHVybnMgdGhlaXIKKyAgICAgKiBkZWZhdWx0IHZhbHVlcywgdXNpbmcgdGhlIHtAbGluayBNZXNzYWdlfSByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF91aW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9ib29sIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIgICApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiICAgICAgICAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiKSkpOworCisgICAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEYgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwRCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIikpKTsKKworICAgICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSkpLmhhc0ZpZWxkKGdyb3VwQSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQobmVzdGVkQikpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKGZvcmVpZ25DKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChpbXBvcnREKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQoaW1wb3J0RSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKG5lc3RlZEIpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbGdyb3VwIikpKS5nZXRGaWVsZChncm91cEEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChmb3JlaWduQykpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEUpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisKKyAgICAgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXN0ZWRGb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0Rm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfY29yZCIpKSk7CisKKyAgICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ieXRlcyIgICApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9jb3JkIikpKTsKKworICAgICAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbnQzMiIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF91aW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9maXhlZDMyIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9ib29sIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2NvcmQiICkpKTsKKworICAgICAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQxICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQyTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQzICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ0TCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTQ1ICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ2TCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ3ICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ4TCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ5ICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTUwTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDUxLjVGICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDUyZTNEICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImhlbGxvIiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygid29ybGQiKSwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2J5dGVzIikpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmFyLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJhciwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbXBvcnRCYXIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhYmMiLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyMyIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9jb3JkIikpKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZFZpYVJlZmxlY3Rpb24oCisgICAgICAgIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgICAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCisgICAgICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAorICAgICAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQzMiIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDMyIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ib29sIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZyIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkZ3JvdXAiICAgICAgICAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiAgICApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfY29yZCIpKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDApKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRHcm91cEEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE4LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOSwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDApKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAwKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCI1MTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDEpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRHcm91cEEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE4LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxOSwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUyMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MjcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEZvbywgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkZvbywgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEZvbywgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDEpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAxKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQzMiIgICApLCA2MDEgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiICAgKSwgNjAyTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQzMiIgICksIDYwMyApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50NjQiICApLCA2MDRMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiAgKSwgNjA1ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQ2NCIgICksIDYwNkwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDMyIiApLCA2MDcgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIgKSwgNjA4TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDMyIiksIDYwOSApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQ2NCIpLCA2MTBMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZmxvYXQiICAgKSwgNjExRik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIgICksIDYxMkQpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9ib29sIiAgICApLCB0cnVlKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZW51bSIgKSwgIGZvcmVpZ25CYXIpOworICAgICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQzMiIgICApLCA3MDEgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiICAgKSwgNzAyTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQzMiIgICksIDcwMyApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50NjQiICApLCA3MDRMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiAgKSwgNzA1ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQ2NCIgICksIDcwNkwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDMyIiApLCA3MDcgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIgKSwgNzA4TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDMyIiksIDcwOSApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQ2NCIpLCA3MTBMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZmxvYXQiICAgKSwgNzExRik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIgICksIDcxMkQpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9ib29sIiAgICApLCBmYWxzZSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2VudW0iICksICBmb3JlaWduQmF6KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRQYWNrZWRGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZW51bSIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDMyIiAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiICAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50MzIiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQ2NCIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50NjQiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkMzIiICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQzMiIpLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDY0IiksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZmxvYXQiICAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9kb3VibGUiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Jvb2wiICAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9lbnVtIiApLDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50MzIiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQ2NCIgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQzMiIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDY0IiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50MzIiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQ2NCIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQzMiIgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDY0IiApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDMyIiksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkNjQiKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9mbG9hdCIgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfYm9vbCIgICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2VudW0iICksMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZmxlY3Rpb24gc2V0dGVycyBmb3IgdGhlIGdpdmVuLkJ1aWxkZXIgb2JqZWN0IHRocm93IGEKKyAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBwYXNzZWQgYSBudWxsIHZhbHVlLiAgVXNlcyBBc3NlcnQgdG8gdGhyb3cgYW4KKyAgICAgKiBhcHByb3ByaWF0ZSBhc3NlcnRpb24gZmFpbHVyZSwgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgdmVyaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiksIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZigib3B0aW9uYWxfYnl0ZXMiKSwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpLCBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKSBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIpIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIpLCBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCB0aGUgcmVmbGVjdGlvbiByZXBlYXRlZCBzZXR0ZXJzIGZvciB0aGUgZ2l2ZW4gQnVpbGRlciBvYmplY3QgdGhyb3cgYQorICAgICAqIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZXkgYXJlIHBhc3NlZCBhIG51bGwgdmFsdWUuICBVc2VzIEFzc2VydCB0byB0aHJvdyBhbiBhcHByb3ByaWF0ZQorICAgICAqIGFzc2VydGlvbiBmYWlsdXJlLCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCB2ZXJpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbChNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiksICJvbmUiKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciKSwgMCwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorCisgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgdG9CeXRlcygib25lIikpOworICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDAsIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIG5lc3RlZEJheik7CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMCwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorCisgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoCisgICAgICAgICAgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwKKyAgICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAwLCBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBmaWxlUGF0aCBUaGUgcGF0aCByZWxhdGl2ZSB0bworICAgKiB7QGxpbmsgI2dldFRlc3REYXRhRGlyfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRUZXh0RnJvbUZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7CisgICAgcmV0dXJuIHJlYWRCeXRlc0Zyb21GaWxlKGZpbGVQYXRoKS50b1N0cmluZ1V0ZjgoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0VGVzdERhdGFEaXIoKSB7CisgICAgLy8gU2VhcmNoIGVhY2ggcGFyZW50IGRpcmVjdG9yeSBsb29raW5nIGZvciAic3JjL2dvb2dsZS9wcm90b2J1ZiIuCisgICAgRmlsZSBhbmNlc3RvciA9IG5ldyBGaWxlKCIuIik7CisgICAgdHJ5IHsKKyAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAiQ291bGRuJ3QgZ2V0IGNhbm9uaWNhbCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5LiIsIGUpOworICAgIH0KKyAgICB3aGlsZSAoYW5jZXN0b3IgIT0gbnVsbCAmJiBhbmNlc3Rvci5leGlzdHMoKSkgeworICAgICAgaWYgKG5ldyBGaWxlKGFuY2VzdG9yLCAic3JjL2dvb2dsZS9wcm90b2J1ZiIpLmV4aXN0cygpKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShhbmNlc3RvciwgInNyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEiKTsKKyAgICAgIH0KKyAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50RmlsZSgpOworICAgIH0KKworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgIkNvdWxkIG5vdCBmaW5kIGdvbGRlbiBmaWxlcy4gIFRoaXMgdGVzdCBtdXN0IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgIiArCisgICAgICAicHJvdG9idWYgc291cmNlIHBhY2thZ2Ugc28gdGhhdCBpdCBjYW4gcmVhZCB0ZXN0IGRhdGEgZmlsZXMgZnJvbSB0aGUgIiArCisgICAgICAiQysrIHNvdXJjZSB0cmVlLiIpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgcGF0aCByZWxhdGl2ZSB0bworICAgKiB7QGxpbmsgI2dldFRlc3REYXRhRGlyfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyByZWFkQnl0ZXNGcm9tRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICBGaWxlIGZ1bGxQYXRoID0gbmV3IEZpbGUoZ2V0VGVzdERhdGFEaXIoKSwgZmlsZW5hbWUpOworICAgIHRyeSB7CisgICAgICBSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmdWxsUGF0aCwgInIiKTsKKyAgICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbKGludCkgZmlsZS5sZW5ndGgoKV07CisgICAgICBmaWxlLnJlYWRGdWxseShjb250ZW50KTsKKyAgICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKGNvbnRlbnQpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRocm93IGEgUnVudGltZUV4Y2VwdGlvbiBoZXJlIHNvIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tCisgICAgICAvLyBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgIkNvdWxkbid0IHJlYWQgZmlsZTogIiArIGZ1bGxQYXRoLmdldFBhdGgoKSwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgYnl0ZXMgb2YgdGhlICJnb2xkZW4gbWVzc2FnZSIuICBUaGlzIGlzIGEgc2VyaWFsaXplZCBUZXN0QWxsVHlwZXMKKyAgICogd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5CisgICAqIHtAbGluayAjc2V0QWxsRmllbGRzKFRlc3RBbGxUeXBlcy5CdWlsZGVyKX0sIGJ1dCBpdCBpcyBsb2FkZWQgZnJvbSBhIGZpbGUKKyAgICogb24gZGlzayByYXRoZXIgdGhhbiBnZW5lcmF0ZWQgZHluYW1pY2FsbHkuICBUaGUgZmlsZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQKKyAgICogYnkgQysrIGNvZGUsIHNvIHRlc3RpbmcgYWdhaW5zdCBpdCB2ZXJpZmllcyBjb21wYXRpYmlsaXR5IHdpdGggQysrLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGdldEdvbGRlbk1lc3NhZ2UoKSB7CisgICAgaWYgKGdvbGRlbk1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgZ29sZGVuTWVzc2FnZSA9IHJlYWRCeXRlc0Zyb21GaWxlKCJnb2xkZW5fbWVzc2FnZSIpOworICAgIH0KKyAgICByZXR1cm4gZ29sZGVuTWVzc2FnZTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIGdvbGRlbk1lc3NhZ2UgPSBudWxsOworCisgIC8qKgorICAgKiBHZXQgdGhlIGJ5dGVzIG9mIHRoZSAiZ29sZGVuIHBhY2tlZCBmaWVsZHMgbWVzc2FnZSIuICBUaGlzIGlzIGEgc2VyaWFsaXplZAorICAgKiBUZXN0UGFja2VkVHlwZXMgd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5CisgICAqIHtAbGluayAjc2V0UGFja2VkRmllbGRzKFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyKX0sIGJ1dCBpdCBpcyBsb2FkZWQgZnJvbSBhCisgICAqIGZpbGUgb24gZGlzayByYXRoZXIgdGhhbiBnZW5lcmF0ZWQgZHluYW1pY2FsbHkuICBUaGUgZmlsZSBpcyBhY3R1YWxseQorICAgKiBnZW5lcmF0ZWQgYnkgQysrIGNvZGUsIHNvIHRlc3RpbmcgYWdhaW5zdCBpdCB2ZXJpZmllcyBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICogQysrLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGdldEdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2UoKSB7CisgICAgaWYgKGdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgZ29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSA9CisgICAgICAgICAgcmVhZEJ5dGVzRnJvbUZpbGUoImdvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UiKTsKKyAgICB9CisgICAgcmV0dXJuIGdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2U7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBnb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlID0gbnVsbDsKKworICAvKioKKyAgICogTW9jayBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50fSBmb3IgdGVzdGluZy4KKyAgICoKKyAgICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tCdWlsZGVyUGFyZW50CisgICAgICBpbXBsZW1lbnRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCB7CisKKyAgICBwcml2YXRlIGludCBpbnZhbGlkYXRpb25zOworCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgeworICAgICAgaW52YWxpZGF0aW9ucysrOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW52YWxpZGF0aW9uQ291bnQoKSB7CisgICAgICByZXR1cm4gaW52YWxpZGF0aW9uczsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzIzZDcwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzg2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE1zZXQuVGVzdE1lc3NhZ2VTZXQ7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE1zZXQuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uT25lU3RyaW5nOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworLyoqCisgKiBUZXN0IGNhc2UgZm9yIHtAbGluayBUZXh0Rm9ybWF0fS4KKyAqCisgKiBUT0RPKHdlbmJveik6IEV4dGVuc2lvblRlc3QgYW5kIHJlc3Qgb2YgdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MuCisgKgorICogQGF1dGhvciB3ZW5ib3pAZ29vZ2xlLmNvbSAoV2VuYm8gWmh1KQorICovCitwdWJsaWMgY2xhc3MgVGV4dEZvcm1hdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgLy8gQSBiYXNpYyBzdHJpbmcgd2l0aCBkaWZmZXJlbnQgZXNjYXBhYmxlIGNoYXJhY3RlcnMgZm9yIHRlc3RpbmcuCisgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBrRXNjYXBlVGVzdFN0cmluZyA9CisgICAgICAiXCJBIHN0cmluZyB3aXRoICcgY2hhcmFjdGVycyBcbiBhbmQgXHIgbmV3bGluZXMgYW5kIFx0IHRhYnMgYW5kIFwwMDEgIgorICAgICAgICAgICsgInNsYXNoZXMgXFwiOworCisgIC8vIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFib3ZlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2hhcmFjdGVycyBlc2NhcGVkLgorICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkID0KKyAgICAgICJcXFwiQSBzdHJpbmcgd2l0aCBcXCcgY2hhcmFjdGVycyBcXG4gYW5kIFxcciBuZXdsaW5lcyAiCisgICAgICAgICAgKyAiYW5kIFxcdCB0YWJzIGFuZCBcXDAwMSBzbGFzaGVzIFxcXFwiOworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhbGxGaWVsZHNTZXRUZXh0ID0gVGVzdFV0aWwucmVhZFRleHRGcm9tRmlsZSgKKyAgICAidGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFsbEV4dGVuc2lvbnNTZXRUZXh0ID0gVGVzdFV0aWwucmVhZFRleHRGcm9tRmlsZSgKKyAgICAidGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCIpOworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleG90aWNUZXh0ID0KKyAgICAicmVwZWF0ZWRfaW50MzI6IC0xXG4iICsKKyAgICAicmVwZWF0ZWRfaW50MzI6IC0yMTQ3NDgzNjQ4XG4iICsKKyAgICAicmVwZWF0ZWRfaW50NjQ6IC0xXG4iICsKKyAgICAicmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4XG4iICsKKyAgICAicmVwZWF0ZWRfdWludDMyOiA0Mjk0OTY3Mjk1XG4iICsKKyAgICAicmVwZWF0ZWRfdWludDMyOiAyMTQ3NDgzNjQ4XG4iICsKKyAgICAicmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNVxuIiArCisgICAgInJlcGVhdGVkX3VpbnQ2NDogOTIyMzM3MjAzNjg1NDc3NTgwOFxuIiArCisgICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjBcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy41XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAwLjEyNVxuIiArCisgICAgInJlcGVhdGVkX2RvdWJsZTogLjEyNVxuIiArCisgICAgInJlcGVhdGVkX2RvdWJsZTogLS4xMjVcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjNFMTdcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjNFKzE3XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAtMS4yM2UtMTdcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IC4yM2UrMTdcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IC0uMjNFMTdcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM1RTIyXG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNUUtMThcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy40NTY3ODlcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IEluZmluaXR5XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAtSW5maW5pdHlcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IE5hTlxuIiArCisgICAgInJlcGVhdGVkX3N0cmluZzogXCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiICsKKyAgICAgICJcXDM0MVxcMjEwXFwyNjRcIlxuIiArCisgICAgInJlcGVhdGVkX2J5dGVzOiBcIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIlxcMzc2XCJcbiI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNhbm9uaWNhbEV4b3RpY1RleHQgPQorICAgICAgZXhvdGljVGV4dC5yZXBsYWNlKCI6IC4iLCAiOiAwLiIpLnJlcGxhY2UoIjogLS4iLCAiOiAtMC4iKSAgIC8vIHNob3J0LWZvcm0gZG91YmxlCisgICAgICAucmVwbGFjZSgiMjNlIiwgIjIzRSIpLnJlcGxhY2UoIkUrIiwgIkUiKS5yZXBsYWNlKCIwLjIzRTE3IiwgIjIuM0UxNiIpOworCisgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VTZXRUZXh0ID0KKyAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0ge1xuIiArCisgICAgIiAgaTogMTIzXG4iICsKKyAgICAifVxuIiArCisgICAgIltwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHtcbiIgKworICAgICIgIHN0cjogXCJmb29cIlxuIiArCisgICAgIn1cbiI7CisKKyAgLyoqIFByaW50IFRlc3RBbGxUeXBlcyBhbmQgY29tcGFyZSB3aXRoIGdvbGRlbiBmaWxlLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGphdmFUZXh0ID0gVGV4dEZvcm1hdC5wcmludFRvU3RyaW5nKFRlc3RVdGlsLmdldEFsbFNldCgpKTsKKworICAgIC8vIEphdmEgbGlrZXMgdG8gYWRkIGEgdHJhaWxpbmcgIi4wIiB0byBmbG9hdHMgYW5kIGRvdWJsZXMuICBDIHByaW50ZgorICAgIC8vICh3aXRoICVnIGZvcm1hdCkgZG9lcyBub3QuICBPdXIgZ29sZGVuIGZpbGVzIGFyZSB1c2VkIGZvciBib3RoCisgICAgLy8gQysrIGFuZCBKYXZhIFRleHRGb3JtYXQgY2xhc3Nlcywgc28gd2UgbmVlZCB0byBjb25mb3JtLgorICAgIGphdmFUZXh0ID0gamF2YVRleHQucmVwbGFjZSgiLjBcbiIsICJcbiIpOworCisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkc1NldFRleHQsIGphdmFUZXh0KTsKKyAgfQorCisgIC8qKiBQcmludCBUZXN0QWxsVHlwZXMgYXMgQnVpbGRlciBhbmQgY29tcGFyZSB3aXRoIGdvbGRlbiBmaWxlLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRNZXNzYWdlQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBqYXZhVGV4dCA9IFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhUZXN0VXRpbC5nZXRBbGxTZXRCdWlsZGVyKCkpOworCisgICAgLy8gSmF2YSBsaWtlcyB0byBhZGQgYSB0cmFpbGluZyAiLjAiIHRvIGZsb2F0cyBhbmQgZG91Ymxlcy4gIEMgcHJpbnRmCisgICAgLy8gKHdpdGggJWcgZm9ybWF0KSBkb2VzIG5vdC4gIE91ciBnb2xkZW4gZmlsZXMgYXJlIHVzZWQgZm9yIGJvdGgKKyAgICAvLyBDKysgYW5kIEphdmEgVGV4dEZvcm1hdCBjbGFzc2VzLCBzbyB3ZSBuZWVkIHRvIGNvbmZvcm0uCisgICAgamF2YVRleHQgPSBqYXZhVGV4dC5yZXBsYWNlKCIuMFxuIiwgIlxuIik7CisKKyAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzU2V0VGV4dCwgamF2YVRleHQpOworICB9CisKKyAgLyoqIFByaW50IFRlc3RBbGxFeHRlbnNpb25zIGFuZCBjb21wYXJlIHdpdGggZ29sZGVuIGZpbGUuICovCisgIHB1YmxpYyB2b2lkIHRlc3RQcmludEV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgamF2YVRleHQgPSBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcoVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpKTsKKworICAgIC8vIEphdmEgbGlrZXMgdG8gYWRkIGEgdHJhaWxpbmcgIi4wIiB0byBmbG9hdHMgYW5kIGRvdWJsZXMuICBDIHByaW50ZgorICAgIC8vICh3aXRoICVnIGZvcm1hdCkgZG9lcyBub3QuICBPdXIgZ29sZGVuIGZpbGVzIGFyZSB1c2VkIGZvciBib3RoCisgICAgLy8gQysrIGFuZCBKYXZhIFRleHRGb3JtYXQgY2xhc3Nlcywgc28gd2UgbmVlZCB0byBjb25mb3JtLgorICAgIGphdmFUZXh0ID0gamF2YVRleHQucmVwbGFjZSgiLjBcbiIsICJcbiIpOworCisgICAgYXNzZXJ0RXF1YWxzKGFsbEV4dGVuc2lvbnNTZXRUZXh0LCBqYXZhVGV4dCk7CisgIH0KKworICAvLyBDcmVhdGVzIGFuIGV4YW1wbGUgdW5rbm93biBmaWVsZCBzZXQuCisgIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0IG1ha2VVbmtub3duRmllbGRTZXQoKSB7CisgICAgcmV0dXJuIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEZpZWxkKDUsCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkVmFyaW50KDEpCisgICAgICAgICAgICAuYWRkRml4ZWQzMigyKQorICAgICAgICAgICAgLmFkZEZpeGVkNjQoMykKKyAgICAgICAgICAgIC5hZGRMZW5ndGhEZWxpbWl0ZWQoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIjQiKSkKKyAgICAgICAgICAgIC5hZGRHcm91cCgKKyAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZEZpZWxkKDEwLAorICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoNSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmFkZEZpZWxkKDgsCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkVmFyaW50KDEpCisgICAgICAgICAgICAuYWRkVmFyaW50KDIpCisgICAgICAgICAgICAuYWRkVmFyaW50KDMpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmFkZEZpZWxkKDE1LAorICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZFZhcmludCgweEFCQ0RFRjEyMzQ1Njc4OTBMKQorICAgICAgICAgICAgLmFkZEZpeGVkMzIoMHhBQkNEMTIzNCkKKyAgICAgICAgICAgIC5hZGRGaXhlZDY0KDB4QUJDREVGMTIzNDU2Nzg5MEwpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRVbmtub3duRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGVzdCBwcmludGluZyBvZiB1bmtub3duIGZpZWxkcyBpbiBhIG1lc3NhZ2UuCisKKyAgICBUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UgPQorICAgICAgVGVzdEVtcHR5TWVzc2FnZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldFVua25vd25GaWVsZHMobWFrZVVua25vd25GaWVsZFNldCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICI1OiAxXG4iICsKKyAgICAgICI1OiAweDAwMDAwMDAyXG4iICsKKyAgICAgICI1OiAweDAwMDAwMDAwMDAwMDAwMDNcbiIgKworICAgICAgIjU6IFwiNFwiXG4iICsKKyAgICAgICI1IHtcbiIgKworICAgICAgIiAgMTA6IDVcbiIgKworICAgICAgIn1cbiIgKworICAgICAgIjg6IDFcbiIgKworICAgICAgIjg6IDJcbiIgKworICAgICAgIjg6IDNcbiIgKworICAgICAgIjE1OiAxMjM3OTgxMzgxMjE3Nzg5MzUyMFxuIiArCisgICAgICAiMTU6IDB4YWJjZDEyMzRcbiIgKworICAgICAgIjE1OiAweGFiY2RlZjEyMzQ1Njc4OTBcbiIsCisgICAgICBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcobWVzc2FnZSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFByaW50RmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGF0YUZpZWxkID0KKyAgICAgIE9uZVN0cmluZy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJkYXRhIik7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgImRhdGE6IFwidGVzdCBkYXRhXCJcbiIsCisgICAgICBUZXh0Rm9ybWF0LnByaW50RmllbGRUb1N0cmluZyhkYXRhRmllbGQsICJ0ZXN0IGRhdGEiKSk7CisKKyAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3Igb3B0aW9uYWxGaWVsZCA9CisgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig0MikuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7XG4gIGJiOiA0MlxufVxuIiwKKyAgICAgIFRleHRGb3JtYXQucHJpbnRGaWVsZFRvU3RyaW5nKG9wdGlvbmFsRmllbGQsIHZhbHVlKSk7CisgIH0KKworICAvKioKKyAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIEJ5dGVTdHJpbmcgZnJvbSBhIFN0cmluZyBjb250YWluaW5nIG9ubHkgOC1iaXQKKyAgICogY2hhcmFjdGVycy4gIFRoZSBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgZGlyZWN0bHkgdG8gYnl0ZXMsICpub3QqCisgICAqIGVuY29kZWQgdXNpbmcgVVRGLTguCisgICAqLworICBwcml2YXRlIEJ5dGVTdHJpbmcgYnl0ZXMoU3RyaW5nIHN0cikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oc3RyLmdldEJ5dGVzKCJJU08tODg1OS0xIikpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciB0byBjb25zdHJ1Y3QgYSBCeXRlU3RyaW5nIGZyb20gYSBidW5jaCBvZiBieXRlcy4gIFRoZSBpbnB1dHMgYXJlCisgICAqIGFjdHVhbGx5IGludHMgc28gdGhhdCBJIGNhbiB1c2UgaGV4IG5vdGF0aW9uIGFuZCBub3QgZ2V0IHN0dXBpZCBlcnJvcnMKKyAgICogYWJvdXQgcHJlY2lzaW9uLgorICAgKi8KKyAgcHJpdmF0ZSBCeXRlU3RyaW5nIGJ5dGVzKGludC4uLiBieXRlc0FzSW50cykgeworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVzQXNJbnRzLmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc0FzSW50cy5sZW5ndGg7IGkrKykgeworICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNBc0ludHNbaV07CisgICAgfQorICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQcmludEV4b3RpYygpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKKyAgICAgIC8vIFNpZ25lZCB2cy4gdW5zaWduZWQgbnVtYmVycy4KKyAgICAgIC5hZGRSZXBlYXRlZEludDMyICgtMSkKKyAgICAgIC5hZGRSZXBlYXRlZFVpbnQzMigtMSkKKyAgICAgIC5hZGRSZXBlYXRlZEludDY0ICgtMSkKKyAgICAgIC5hZGRSZXBlYXRlZFVpbnQ2NCgtMSkKKworICAgICAgLmFkZFJlcGVhdGVkSW50MzIgKDEgIDw8IDMxKQorICAgICAgLmFkZFJlcGVhdGVkVWludDMyKDEgIDw8IDMxKQorICAgICAgLmFkZFJlcGVhdGVkSW50NjQgKDFsIDw8IDYzKQorICAgICAgLmFkZFJlcGVhdGVkVWludDY0KDFsIDw8IDYzKQorCisgICAgICAvLyBGbG9hdHMgb2YgdmFyaW91cyBwcmVjaXNpb25zIGFuZCBleHBvbmVudHMuCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzKQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyMy41KQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDAuMTI1KQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKC4xMjUpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLS4xMjUpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzZTE1KQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyM2UxNSkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgtMS4yM2UtMTcpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLjIzZTE3KQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKC0yM2UxNSkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMuNWUyMCkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMuNWUtMjApCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzLjQ1Njc4OSkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZShEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKERvdWJsZS5OYU4pCisKKyAgICAgIC8vIFN0cmluZ3MgYW5kIGJ5dGVzIHRoYXQgbmVlZGluZyBlc2NhcGluZy4KKyAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygiXDBcMDAxXDAwN1xiXGZcblxyXHRcMDEzXFxcJ1wiXHUxMjM0IikKKyAgICAgIC5hZGRSZXBlYXRlZEJ5dGVzKGJ5dGVzKCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCJcdTAwZmUiKSkKKyAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKGNhbm9uaWNhbEV4b3RpY1RleHQsIG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRNZXNzYWdlU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZVNldCA9CisgICAgICBUZXN0TWVzc2FnZVNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbigKKyAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbiwKKyAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubmV3QnVpbGRlcigpLnNldEkoMTIzKS5idWlsZCgpKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uLAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5uZXdCdWlsZGVyKCkuc2V0U3RyKCJmb28iKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlU2V0VGV4dCwgbWVzc2FnZVNldC50b1N0cmluZygpKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZShhbGxGaWVsZHNTZXRUZXh0LCBidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoYnVpbGRlci5idWlsZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVJlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UobmV3IFN0cmluZ1JlYWRlcihhbGxGaWVsZHNTZXRUZXh0KSwgYnVpbGRlcik7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KGJ1aWxkZXIuYnVpbGQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoYWxsRXh0ZW5zaW9uc1NldFRleHQsCisgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLAorICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcik7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChidWlsZGVyLmJ1aWxkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tcGF0aWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBvcmlnaW5hbCA9ICJyZXBlYXRlZF9mbG9hdDogaW5mXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1pbmZcbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogbmFuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IGluZmZcbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLWluZmZcbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogbmFuZlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjBmXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IGluZmluaXR5ZlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtSW5maW5pdHlmXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBpbmZpbml0eVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogLWluZmluaXR5XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBuYW5cbiI7CisgICAgU3RyaW5nIGNhbm9uaWNhbCA9ICAicmVwZWF0ZWRfZmxvYXQ6IEluZmluaXR5XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLUluZmluaXR5XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogTmFOXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogSW5maW5pdHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtSW5maW5pdHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBOYU5cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBJbmZpbml0eVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBJbmZpbml0eVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtSW5maW5pdHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogTmFOXG4iOworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2Uob3JpZ2luYWwsIGJ1aWxkZXIpOworICAgIGFzc2VydEVxdWFscyhjYW5vbmljYWwsIGJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4b3RpYygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoZXhvdGljVGV4dCwgYnVpbGRlcik7CisKKyAgICAvLyBUb28gbGF6eSB0byBjaGVjayB0aGluZ3MgaW5kaXZpZHVhbGx5LiAgRG9uJ3QgdHJ5IHRvIGRlYnVnIHRoaXMKKyAgICAvLyBpZiB0ZXN0UHJpbnRFeG90aWMoKSBpcyBmYWlsaW5nLgorICAgIGFzc2VydEVxdWFscyhjYW5vbmljYWxFeG90aWNUZXh0LCBidWlsZGVyLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VNZXNzYWdlU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOworICAgIGV4dGVuc2lvblJlZ2lzdHJ5LmFkZChUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbik7CisgICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKKworICAgIFRlc3RNZXNzYWdlU2V0LkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKTsKKyAgICBUZXh0Rm9ybWF0Lm1lcmdlKG1lc3NhZ2VTZXRUZXh0LCBleHRlbnNpb25SZWdpc3RyeSwgYnVpbGRlcik7CisgICAgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZVNldCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgIGFzc2VydFRydWUobWVzc2FnZVNldC5oYXNFeHRlbnNpb24oCisgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAorICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldEkoKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlU2V0Lmhhc0V4dGVuc2lvbigKKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBtZXNzYWdlU2V0LmdldEV4dGVuc2lvbigKKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uKS5nZXRTdHIoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VOdW1lcmljRW51bSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAyIiwgYnVpbGRlcik7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwgYnVpbGRlci5nZXRPcHRpb25hbE5lc3RlZEVudW0oKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBbmdsZUJyYWNrZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZSgiT3B0aW9uYWxHcm91cDogPCBhOiAxID4iLCBidWlsZGVyKTsKKyAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaGFzT3B0aW9uYWxHcm91cCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlci5nZXRPcHRpb25hbEdyb3VwKCkuZ2V0QSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUNvbW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXh0Rm9ybWF0Lm1lcmdlKAorICAgICAgIiMgdGhpcyBpcyBhIGNvbW1lbnRcbiIgKworICAgICAgIm9wdGlvbmFsX2ludDMyOiAxICAjIGFub3RoZXIgY29tbWVudFxuIiArCisgICAgICAib3B0aW9uYWxfaW50NjQ6IDJcbiIgKworICAgICAgIiMgRU9GIGNvbW1lbnQiLCBidWlsZGVyKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlci5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldE9wdGlvbmFsSW50NjQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0UGFyc2VFcnJvcihTdHJpbmcgZXJyb3IsIFN0cmluZyB0ZXh0KSB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQubWVyZ2UodGV4dCwgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgYnVpbGRlcik7CisgICAgICBmYWlsKCJFeHBlY3RlZCBwYXJzZSBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZXJyb3IsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFcnJvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTY6IEV4cGVjdGVkIFwiOlwiLiIsCisgICAgICAib3B0aW9uYWxfaW50MzIgMTIzIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjIzOiBFeHBlY3RlZCBpZGVudGlmaWVyLiIsCisgICAgICAib3B0aW9uYWxfbmVzdGVkX2VudW06ID8iKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTg6IENvdWxkbid0IHBhcnNlIGludGVnZXI6IE51bWJlciBtdXN0IGJlIHBvc2l0aXZlOiAtMSIsCisgICAgICAib3B0aW9uYWxfdWludDMyOiAtMSIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToxNzogQ291bGRuJ3QgcGFyc2UgaW50ZWdlcjogTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgMzItYml0IHNpZ25lZCAiICsKKyAgICAgICAgImludGVnZXI6IDgyMzAxNDgxMjkwODQ5MDEyMzg1MjMwMTU3IiwKKyAgICAgICJvcHRpb25hbF9pbnQzMjogODIzMDE0ODEyOTA4NDkwMTIzODUyMzAxNTciKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTY6IEV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi4iLAorICAgICAgIm9wdGlvbmFsX2Jvb2w6IG1heWJlIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjE2OiBFeHBlY3RlZCBcInRydWVcIiBvciBcImZhbHNlXCIuIiwKKyAgICAgICJvcHRpb25hbF9ib29sOiAyIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjE4OiBFeHBlY3RlZCBzdHJpbmcuIiwKKyAgICAgICJvcHRpb25hbF9zdHJpbmc6IDEyMyIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToxODogU3RyaW5nIG1pc3NpbmcgZW5kaW5nIHF1b3RlLiIsCisgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcInVlb2F1YW9lIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjE4OiBTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIiwKKyAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwidWVvYXVhb2VcbiIgKworICAgICAgIm9wdGlvbmFsX2ludDMyOiAxMjMiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTg6IEludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFx6JyIsCisgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcIlxcelwiIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjE4OiBTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIiwKKyAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwidWVvYXVhb2VcbiIgKworICAgICAgIm9wdGlvbmFsX2ludDMyOiAxMjMiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MjogRXh0ZW5zaW9uIFwibm9zdWNoZXh0XCIgbm90IGZvdW5kIGluIHRoZSBFeHRlbnNpb25SZWdpc3RyeS4iLAorICAgICAgIltub3N1Y2hleHRdOiAxMjMiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MjA6IEV4dGVuc2lvbiBcInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvblwiIGRvZXMgIiArCisgICAgICAgICJub3QgZXh0ZW5kIG1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiLiIsCisgICAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl06IDEyMyIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToxOiBNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgIiArCisgICAgICAgICJuYW1lZCBcIm5vc3VjaGZpZWxkXCIuIiwKKyAgICAgICJub3N1Y2hmaWVsZDogMTIzIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjIxOiBFeHBlY3RlZCBcIj5cIi4iLAorICAgICAgIk9wdGlvbmFsR3JvdXAgPCBhOiAxIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjIzOiBFbnVtIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bVwiIGhhcyBubyAiICsKKyAgICAgICAgInZhbHVlIG5hbWVkIFwiTk9fU1VDSF9WQUxVRVwiLiIsCisgICAgICAib3B0aW9uYWxfbmVzdGVkX2VudW06IE5PX1NVQ0hfVkFMVUUiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MjM6IEVudW0gdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtXCIgaGFzIG5vICIgKworICAgICAgICAidmFsdWUgd2l0aCBudW1iZXIgMTIzLiIsCisgICAgICAib3B0aW9uYWxfbmVzdGVkX2VudW06IDEyMyIpOworCisgICAgLy8gRGVsaW1pdGVycyBtdXN0IG1hdGNoLgorICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToyMjogRXhwZWN0ZWQgaWRlbnRpZmllci4iLAorICAgICAgIk9wdGlvbmFsR3JvdXAgPCBhOiAxIH0iKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MjI6IEV4cGVjdGVkIGlkZW50aWZpZXIuIiwKKyAgICAgICJPcHRpb25hbEdyb3VwIHsgYTogMSA+Iik7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIHB1YmxpYyB2b2lkIHRlc3RFc2NhcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBFc2NhcGUgc2VxdWVuY2VzLgorICAgIGFzc2VydEVxdWFscygiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIiwKKyAgICAgIFRleHRGb3JtYXQuZXNjYXBlQnl0ZXMoYnl0ZXMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIiIpKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiLAorICAgICAgVGV4dEZvcm1hdC5lc2NhcGVUZXh0KCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKGJ5dGVzKCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCIiKSwKKyAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVCeXRlcygiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIikpOworICAgIGFzc2VydEVxdWFscygiXDBcMDAxXDAwN1xiXGZcblxyXHRcMDEzXFxcJ1wiIiwKKyAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVUZXh0KCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZCwKKyAgICAgIFRleHRGb3JtYXQuZXNjYXBlVGV4dChrRXNjYXBlVGVzdFN0cmluZykpOworICAgIGFzc2VydEVxdWFscyhrRXNjYXBlVGVzdFN0cmluZywKKyAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVUZXh0KGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZCkpOworCisgICAgLy8gVW5pY29kZSBoYW5kbGluZy4KKyAgICBhc3NlcnRFcXVhbHMoIlxcMzQxXFwyMTBcXDI2NCIsIFRleHRGb3JtYXQuZXNjYXBlVGV4dCgiXHUxMjM0IikpOworICAgIGFzc2VydEVxdWFscygiXFwzNDFcXDIxMFxcMjY0IiwKKyAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5lc2NhcGVCeXRlcyhieXRlcygweGUxLCAweDg4LCAweGI0KSkpOworICAgIGFzc2VydEVxdWFscygiXHUxMjM0IiwgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxcMzQxXFwyMTBcXDI2NCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoYnl0ZXMoMHhlMSwgMHg4OCwgMHhiNCksCisgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVCeXRlcygiXFwzNDFcXDIxMFxcMjY0IikpOworICAgIGFzc2VydEVxdWFscygiXHUxMjM0IiwgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxceGUxXFx4ODhcXHhiNCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoYnl0ZXMoMHhlMSwgMHg4OCwgMHhiNCksCisgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVCeXRlcygiXFx4ZTFcXHg4OFxceGI0IikpOworCisgICAgLy8gSGFuZGxpbmcgb2Ygc3RyaW5ncyB3aXRoIHVuZXNjYXBlZCBVbmljb2RlIGNoYXJhY3RlcnMgPiAyNTUuCisgICAgZmluYWwgU3RyaW5nIHpoID0gIlx1OTk5OVx1NmUyZlx1NGUwYVx1NmQ3N1x1ZDg0Zlx1ZGY4MFx1OGM1MFx1OTI4MFx1ODg0YyI7CisgICAgQnl0ZVN0cmluZyB6aEJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCh6aCk7CisgICAgYXNzZXJ0RXF1YWxzKHpoQnl0ZVN0cmluZywgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKHpoKSk7CisKKyAgICAvLyBFcnJvcnMuCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVUZXh0KCJcXHgiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKworICAgIHRyeSB7CisgICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFx6Iik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKFRleHRGb3JtYXQuSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxcIik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKFRleHRGb3JtYXQuSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VJbnRlZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAwLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAgICAgICIwIikpOworICAgIGFzc2VydEVxdWFscyggICAgICAgICAgMSwgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAgICAgICAgICAiMSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgLTEsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggICAgICAgICAiLTEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgIDEyMzQ1LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAgIjEyMzQ1IikpOworICAgIGFzc2VydEVxdWFscyggICAgIC0xMjM0NSwgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAgICAgIi0xMjM0NSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDIxNDc0ODM2NDcsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggIjIxNDc0ODM2NDciKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0yMTQ3NDgzNjQ4LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIi0yMTQ3NDgzNjQ4IikpOworCisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAgICAgICAwLCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCAgICAgICAgICIwIikpOworICAgIGFzc2VydEVxdWFscyggICAgICAgICAgICAgICAgMSwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMiggICAgICAgICAiMSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgICAgMTIzNDUsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoICAgICAiMTIzNDUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAyMTQ3NDgzNjQ3LCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCIyMTQ3NDgzNjQ3IikpOworICAgIGFzc2VydEVxdWFscygoaW50KSAyMTQ3NDgzNjQ4TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMigiMjE0NzQ4MzY0OCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoKGludCkgNDI5NDk2NzI5NUwsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIjQyOTQ5NjcyOTUiKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDBMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICAgICAgICAgICIwIikpOworICAgIGFzc2VydEVxdWFscyggICAgICAgICAgMUwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICAgICAgIjEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgIC0xTCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAgICAgICAgICItMSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgMTIzNDVMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICAgICAgIjEyMzQ1IikpOworICAgIGFzc2VydEVxdWFscyggICAgIC0xMjM0NUwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICItMTIzNDUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAyMTQ3NDgzNjQ3TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAiMjE0NzQ4MzY0NyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDhMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoIi0yMTQ3NDgzNjQ4IikpOworICAgIGFzc2VydEVxdWFscyggNDI5NDk2NzI5NUwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggIjQyOTQ5NjcyOTUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCA0Mjk0OTY3Mjk2TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAiNDI5NDk2NzI5NiIpKTsKKyAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsCisgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDhMLAorICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoIi05MjIzMzcyMDM2ODU0Nzc1ODA4IikpOworCisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAwTCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCggICAgICAgICAgIjAiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAxTCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCggICAgICAgICAgIjEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgIDEyMzQ1TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCggICAgICAiMTIzNDUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAyMTQ3NDgzNjQ3TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCggIjIxNDc0ODM2NDciKSk7CisgICAgYXNzZXJ0RXF1YWxzKCA0Mjk0OTY3Mjk1TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCggIjQyOTQ5NjcyOTUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCA0Mjk0OTY3Mjk2TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCggIjQyOTQ5NjcyOTYiKSk7CisgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLAorICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikpOworICAgIGFzc2VydEVxdWFscygtOTIyMzM3MjAzNjg1NDc3NTgwOEwsCisgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50NjQoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0xTCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiMTg0NDY3NDQwNzM3MDk1NTE2MTUiKSk7CisKKyAgICAvLyBIZXgKKyAgICBhc3NlcnRFcXVhbHMoMHgxMjM0YWJjZCwgVGV4dEZvcm1hdC5wYXJzZUludDMyKCIweDEyMzRhYmNkIikpOworICAgIGFzc2VydEVxdWFscygtMHgxMjM0YWJjZCwgVGV4dEZvcm1hdC5wYXJzZUludDMyKCItMHgxMjM0YWJjZCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTEsIFRleHRGb3JtYXQucGFyc2VVSW50NjQoIjB4ZmZmZmZmZmZmZmZmZmZmZiIpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHg3ZmZmZmZmZmZmZmZmZmZmTCwKKyAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDY0KCIweDdmZmZmZmZmZmZmZmZmZmYiKSk7CisKKyAgICAvLyBPY3RhbAorICAgIGFzc2VydEVxdWFscygwMTIzNDU2NywgVGV4dEZvcm1hdC5wYXJzZUludDMyKCIwMTIzNDU2NyIpKTsKKworICAgIC8vIE91dC1vZi1yYW5nZQorICAgIHRyeSB7CisgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIjIxNDc0ODM2NDgiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDMyKCItMjE0NzQ4MzY0OSIpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKworICAgIHRyeSB7CisgICAgICBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCI0Mjk0OTY3Mjk2Iik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIi0xIik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiOTIyMzM3MjAzNjg1NDc3NTgwOCIpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKworICAgIHRyeSB7CisgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoIi05MjIzMzcyMDM2ODU0Nzc1ODA5Iik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50NjQoIjE4NDQ2NzQ0MDczNzA5NTUxNjE2Iik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50NjQoIi0xIik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgLy8gTm90IGEgbnVtYmVyLgorICAgIHRyeSB7CisgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoImFiY2QiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTdHJpbmcgemggPSAiXHU5OTk5XHU2ZTJmXHU0ZTBhXHU2ZDc3XHVkODRmXHVkZjgwXHU4YzUwXHU5MjgwXHU4ODRjIjsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJvcHRpb25hbF9zdHJpbmc6IFwiIiArIHpoICsgIlwiIiwgYnVpbGRlcik7CisgICAgYXNzZXJ0RXF1YWxzKHpoLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlTG9uZ1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBsb25nVGV4dCA9CisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIjsKKworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX3N0cmluZzogXCIiICsgbG9uZ1RleHQgKyAiXCIiLCBidWlsZGVyKTsKKyAgICBhc3NlcnRFcXVhbHMobG9uZ1RleHQsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VCb29sZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGdvb2RUZXh0ID0KKyAgICAgICAgInJlcGVhdGVkX2Jvb2w6IHQgIHJlcGVhdGVkX2Jvb2wgOiAwXG4iICsKKyAgICAgICAgInJlcGVhdGVkX2Jvb2wgOmYgcmVwZWF0ZWRfYm9vbDoxIjsKKyAgICBTdHJpbmcgZ29vZFRleHRDYW5vbmljYWwgPQorICAgICAgICAicmVwZWF0ZWRfYm9vbDogdHJ1ZVxuIiArCisgICAgICAgICJyZXBlYXRlZF9ib29sOiBmYWxzZVxuIiArCisgICAgICAgICJyZXBlYXRlZF9ib29sOiBmYWxzZVxuIiArCisgICAgICAgICJyZXBlYXRlZF9ib29sOiB0cnVlXG4iOworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoZ29vZFRleHQsIGJ1aWxkZXIpOworICAgIGFzc2VydEVxdWFscyhnb29kVGV4dENhbm9uaWNhbCwgYnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCkpOworCisgICAgdHJ5IHsKKyAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJhZEJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfYm9vbDoyIiwgYmFkQnVpbGRlcik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKFRleHRGb3JtYXQuUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKyAgICB0cnkgeworICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYmFkQnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJvcHRpb25hbF9ib29sOiBmb28iLCBiYWRCdWlsZGVyKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlQWRqYWNlbnRTdHJpbmdMaXRlcmFscygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIiAnY29yZ2UnIFwiZ3JhdWx0XCIiLCBidWlsZGVyKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvb2NvcmdlZ3JhdWx0IiwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQcmludEZpZWxkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIlwiSGVsbG9cIiIsICJIZWxsbyIsICJyZXBlYXRlZF9zdHJpbmciKTsKKyAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIjEyMy4wIiwgIDEyM2YsICJyZXBlYXRlZF9mbG9hdCIpOworICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTIzLjAiLCAgMTIzZCwgInJlcGVhdGVkX2RvdWJsZSIpOworICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTIzIiwgIDEyMywgInJlcGVhdGVkX2ludDMyIik7CisgICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxMjMiLCAgMTIzTCwgInJlcGVhdGVkX2ludDY0Iik7CisgICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCJ0cnVlIiwgIHRydWUsICJyZXBlYXRlZF9ib29sIik7CisgICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCI0Mjk0OTY3Mjk1IiwgMHhGRkZGRkZGRiwgInJlcGVhdGVkX3VpbnQzMiIpOworICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLCAgMHhGRkZGRkZGRkZGRkZGRkZGTCwKKyAgICAgICAgInJlcGVhdGVkX3VpbnQ2NCIpOworICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiXCJcXDAwMVxcMDAyXFwwMDNcIiIsCisgICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb20obmV3IGJ5dGVbXSB7MSwgMiwgM30pLCAicmVwZWF0ZWRfYnl0ZXMiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRQcmludEZpZWxkVmFsdWUoU3RyaW5nIGV4cGVjdCwgT2JqZWN0IHZhbHVlLAorICAgICAgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5wcmludEZpZWxkVmFsdWUoCisgICAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKGZpZWxkTmFtZSksCisgICAgICAgIHZhbHVlLCBzYik7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdCwgc2IudG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnREZWJ1Z1N0cmluZygpIHsKKyAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDQyIH0gcmVwZWF0ZWRfaW50MzI6IDEiCisgICAgICAgICsgIiByZXBlYXRlZF91aW50MzI6IDIiLAorICAgICAgICBUZXh0Rm9ybWF0LnNob3J0RGVidWdTdHJpbmcoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZFJlcGVhdGVkSW50MzIoMSkKKyAgICAgICAgICAgIC5hZGRSZXBlYXRlZFVpbnQzMigyKQorICAgICAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig0MikuYnVpbGQoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnREZWJ1Z1N0cmluZ191bmtub3duKCkgeworICAgIGFzc2VydEVxdWFscygiNTogMSA1OiAweDAwMDAwMDAyIDU6IDB4MDAwMDAwMDAwMDAwMDAwMyA1OiBcIjRcIiA1IHsgMTA6IDUgfSIKKyAgICAgICAgKyAiIDg6IDEgODogMiA4OiAzIDE1OiAxMjM3OTgxMzgxMjE3Nzg5MzUyMCAxNTogMHhhYmNkMTIzNCAxNToiCisgICAgICAgICsgIiAweGFiY2RlZjEyMzQ1Njc4OTAiLAorICAgICAgICBUZXh0Rm9ybWF0LnNob3J0RGVidWdTdHJpbmcobWFrZVVua25vd25GaWVsZFNldCgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUb1VuaWNvZGVTdHJpbmcoKSB7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcImFiY1x1MzA0MmVmZ1wiXG4iICsKKyAgICAgICAgIm9wdGlvbmFsX2J5dGVzOiBcIlxcMzQzXFwyMDFcXDIwMlwiXG4iICsKKyAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJcdTMwOTNYWVpcIlxuIiwKKyAgICAgICAgVGV4dEZvcm1hdC5wcmludFRvVW5pY29kZVN0cmluZyhUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoImFiY1x1MzA0MmVmZyIpCisgICAgICAgICAgICAuc2V0T3B0aW9uYWxCeXRlcyhieXRlcygweGUzLCAweDgxLCAweDgyKSkKKyAgICAgICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygiXHUzMDkzWFlaIikKKyAgICAgICAgICAgIC5idWlsZCgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUb1VuaWNvZGVTdHJpbmdfdW5rbm93bigpIHsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICIxOiBcIlxcMzQzXFwyMDFcXDIwMlwiXG4iLAorICAgICAgICBUZXh0Rm9ybWF0LnByaW50VG9Vbmljb2RlU3RyaW5nKFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRGaWVsZCgxLAorICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKGJ5dGVzKDB4ZTMsIDB4ODEsIDB4ODIpKS5idWlsZCgpKQorICAgICAgICAgICAgLmJ1aWxkKCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTA4OGIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRUZXN0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGVzdHMgcmVsYXRlZCB0byB1bmtub3duIGZpZWxkIGhhbmRsaW5nLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKyAqLworcHVibGljIGNsYXNzIFVua25vd25GaWVsZFNldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7CisgICAgYWxsRmllbGRzID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7CisgICAgYWxsRmllbGRzRGF0YSA9IGFsbEZpZWxkcy50b0J5dGVTdHJpbmcoKTsKKyAgICBlbXB0eU1lc3NhZ2UgPSBUZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShhbGxGaWVsZHNEYXRhKTsKKyAgICB1bmtub3duRmllbGRzID0gZW1wdHlNZXNzYWdlLmdldFVua25vd25GaWVsZHMoKTsKKyAgfQorCisgIFVua25vd25GaWVsZFNldC5GaWVsZCBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKG5hbWUpOworICAgIGFzc2VydE5vdE51bGwoZmllbGQpOworICAgIHJldHVybiB1bmtub3duRmllbGRzLmdldEZpZWxkKGZpZWxkLmdldE51bWJlcigpKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYSBwcm90b2NvbCBidWZmZXIgd2hpY2ggY29udGFpbnMgZmllbGRzIHdpdGggYWxsIHRoZSBzYW1lCisgIC8vIG51bWJlcnMgYXMgYWxsRmllbGRzRGF0YSBleGNlcHQgdGhhdCBlYWNoIGZpZWxkIGlzIHNvbWUgb3RoZXIgd2lyZQorICAvLyB0eXBlLgorICBCeXRlU3RyaW5nIGdldEJpemFycm9EYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgYml6YXJyb0ZpZWxkcyA9IFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCk7CisKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgdmFyaW50RmllbGQgPQorICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKS5hZGRWYXJpbnQoMSkuYnVpbGQoKTsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZml4ZWQzMkZpZWxkID0KKyAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkuYWRkRml4ZWQzMigxKS5idWlsZCgpOworCisgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgVW5rbm93bkZpZWxkU2V0LkZpZWxkPiBlbnRyeSA6CisgICAgICAgICB1bmtub3duRmllbGRzLmFzTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkuZ2V0VmFyaW50TGlzdCgpLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBPcmlnaW5hbCBmaWVsZCBpcyBub3QgYSB2YXJpbnQsIHNvIHVzZSBhIHZhcmludC4KKyAgICAgICAgYml6YXJyb0ZpZWxkcy5hZGRGaWVsZChlbnRyeS5nZXRLZXkoKSwgdmFyaW50RmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT3JpZ2luYWwgZmllbGQgKmlzKiBhIHZhcmludCwgc28gdXNlIHNvbWV0aGluZyBlbHNlLgorICAgICAgICBiaXphcnJvRmllbGRzLmFkZEZpZWxkKGVudHJ5LmdldEtleSgpLCBmaXhlZDMyRmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXphcnJvRmllbGRzLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7CisgIH0KKworICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgIFRlc3RBbGxUeXBlcyBhbGxGaWVsZHM7CisgIEJ5dGVTdHJpbmcgYWxsRmllbGRzRGF0YTsKKworICAvLyBBbiBlbXB0eSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYWxsRmllbGRzRGF0YS4gIFNvLCBpdCBoYXMKKyAgLy8gdW5rbm93biBmaWVsZHMgb2YgZXZlcnkgdHlwZS4KKyAgVGVzdEVtcHR5TWVzc2FnZSBlbXB0eU1lc3NhZ2U7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgcHVibGljIHZvaWQgdGVzdFZhcmludCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IGdldEZpZWxkKCJvcHRpb25hbF9pbnQzMiIpOworICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRWYXJpbnRMaXN0KCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzLmdldE9wdGlvbmFsSW50MzIoKSwKKyAgICAgICAgICAgICAgICAgKGxvbmcpIGZpZWxkLmdldFZhcmludExpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZpeGVkMzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQzMiIpOworICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRGaXhlZDMyTGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEZpeGVkMzIoKSwKKyAgICAgICAgICAgICAgICAgKGludCkgZmllbGQuZ2V0Rml4ZWQzMkxpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZpeGVkNjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQ2NCIpOworICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRGaXhlZDY0TGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEZpeGVkNjQoKSwKKyAgICAgICAgICAgICAgICAgKGxvbmcpIGZpZWxkLmdldEZpeGVkNjRMaXN0KCkuZ2V0KDApKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMZW5ndGhEZWxpbWl0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfYnl0ZXMiKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0TGVuZ3RoRGVsaW1pdGVkTGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEJ5dGVzKCksCisgICAgICAgICAgICAgICAgIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEdyb3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIG5lc3RlZEZpZWxkRGVzY3JpcHRvciA9CisgICAgICBUZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJhIik7CisgICAgYXNzZXJ0Tm90TnVsbChuZXN0ZWRGaWVsZERlc2NyaXB0b3IpOworCisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsZ3JvdXAiKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0R3JvdXBMaXN0KCkuc2l6ZSgpKTsKKworICAgIFVua25vd25GaWVsZFNldCBncm91cCA9IGZpZWxkLmdldEdyb3VwTGlzdCgpLmdldCgwKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZ3JvdXAuYXNNYXAoKS5zaXplKCkpOworICAgIGFzc2VydFRydWUoZ3JvdXAuaGFzRmllbGQobmVzdGVkRmllbGREZXNjcmlwdG9yLmdldE51bWJlcigpKSk7CisKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgbmVzdGVkRmllbGQgPQorICAgICAgZ3JvdXAuZ2V0RmllbGQobmVzdGVkRmllbGREZXNjcmlwdG9yLmdldE51bWJlcigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbmVzdGVkRmllbGQuZ2V0VmFyaW50TGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEdyb3VwKCkuZ2V0QSgpLAorICAgICAgICAgICAgICAgICAobG9uZykgbmVzdGVkRmllbGQuZ2V0VmFyaW50TGlzdCgpLmdldCgwKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQ2hlY2sgdGhhdCBzZXJpYWxpemluZyB0aGUgVW5rbm93bkZpZWxkU2V0IHByb2R1Y2VzIHRoZSBvcmlnaW5hbCBkYXRhCisgICAgLy8gYWdhaW4uCisgICAgQnl0ZVN0cmluZyBkYXRhID0gZW1wdHlNZXNzYWdlLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHNEYXRhLCBkYXRhKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9CisgICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20oZW1wdHlNZXNzYWdlKS5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKGVtcHR5TWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RFbXB0eU1lc3NhZ2Ugc291cmNlID0KKyAgICAgIFRlc3RFbXB0eU1lc3NhZ2UubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRVbmtub3duRmllbGRzKAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRGaWVsZCgyLAorICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZFZhcmludCgyKS5idWlsZCgpKQorICAgICAgICAgICAgLmFkZEZpZWxkKDMsCisgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkVmFyaW50KDQpLmJ1aWxkKCkpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgVGVzdEVtcHR5TWVzc2FnZSBkZXN0aW5hdGlvbiA9CisgICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0VW5rbm93bkZpZWxkcygKKyAgICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwKKyAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoMSkuYnVpbGQoKSkKKyAgICAgICAgICAgIC5hZGRGaWVsZCgzLAorICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZFZhcmludCgzKS5idWlsZCgpKQorICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5tZXJnZUZyb20oc291cmNlKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICIxOiAxXG4iICsKKyAgICAgICIyOiAyXG4iICsKKyAgICAgICIzOiAzXG4iICsKKyAgICAgICIzOiA0XG4iLAorICAgICAgZGVzdGluYXRpb24udG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQgZmllbGRzID0KKyAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKHVua25vd25GaWVsZHMpLmNsZWFyKCkuYnVpbGQoKTsKKyAgICBhc3NlcnRUcnVlKGZpZWxkcy5hc01hcCgpLmlzRW1wdHkoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlID0KKyAgICAgIFRlc3RFbXB0eU1lc3NhZ2UubmV3QnVpbGRlcigpLm1lcmdlRnJvbShlbXB0eU1lc3NhZ2UpLmNsZWFyKCkuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUtub3duQW5kVW5rbm93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3QgbWl4aW5nIGtub3duIGFuZCB1bmtub3duIGZpZWxkcyB3aGVuIHBhcnNpbmcuCisKKyAgICBVbmtub3duRmllbGRTZXQgZmllbGRzID0KKyAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKHVua25vd25GaWVsZHMpCisgICAgICAgIC5hZGRGaWVsZCgxMjM0NTYsCisgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKS5hZGRWYXJpbnQoNjU0MzIxKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9IGZpZWxkcy50b0J5dGVTdHJpbmcoKTsKKyAgICBUZXN0QWxsVHlwZXMgZGVzdGluYXRpb24gPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGRhdGEpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZGVzdGluYXRpb24uZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuc2l6ZSgpKTsKKworICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9CisgICAgICBkZXN0aW5hdGlvbi5nZXRVbmtub3duRmllbGRzKCkuZ2V0RmllbGQoMTIzNDU2KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0VmFyaW50TGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDY1NDMyMSwgKGxvbmcpIGZpZWxkLmdldFZhcmludExpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0IHRoYXQgZmllbGRzIG9mIHRoZSB3cm9uZyB3aXJlIHR5cGUgYXJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcworICAgIC8vIHdoZW4gcGFyc2luZy4KKworICAgIEJ5dGVTdHJpbmcgYml6YXJyb0RhdGEgPSBnZXRCaXphcnJvRGF0YSgpOworICAgIFRlc3RBbGxUeXBlcyBhbGxUeXBlc01lc3NhZ2UgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKyAgICBUZXN0RW1wdHlNZXNzYWdlIGVtcHR5TWVzc2FnZSA9IFRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKworICAgIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncworICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgICBhc3NlcnRFcXVhbHMoZW1wdHlNZXNzYWdlLnRvU3RyaW5nKCksIGFsbFR5cGVzTWVzc2FnZS50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIE1ha2Ugc3VyZSBmaWVsZHMgYXJlIHByb3Blcmx5IHBhcnNlZCB0byB0aGUgVW5rbm93bkZpZWxkU2V0IGV2ZW4gd2hlbgorICAgIC8vIHRoZXkgYXJlIGRlY2xhcmVkIGFzIGV4dGVuc2lvbiBudW1iZXJzLgorCisgICAgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIG1lc3NhZ2UgPQorICAgICAgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLnBhcnNlRnJvbShhbGxGaWVsZHNEYXRhKTsKKworICAgIGFzc2VydEVxdWFscyh1bmtub3duRmllbGRzLmFzTWFwKCkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKS5hc01hcCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkc0RhdGEsIG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyb25nRXh0ZW5zaW9uVHlwZVRyZWF0ZWRBc1Vua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0IHRoYXQgZmllbGRzIG9mIHRoZSB3cm9uZyB3aXJlIHR5cGUgYXJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcworICAgIC8vIHdoZW4gcGFyc2luZyBleHRlbnNpb25zLgorCisgICAgQnl0ZVN0cmluZyBiaXphcnJvRGF0YSA9IGdldEJpemFycm9EYXRhKCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgYWxsRXh0ZW5zaW9uc01lc3NhZ2UgPQorICAgICAgVGVzdEFsbEV4dGVuc2lvbnMucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKyAgICBUZXN0RW1wdHlNZXNzYWdlIGVtcHR5TWVzc2FnZSA9IFRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKworICAgIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncworICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgICBhc3NlcnRFcXVhbHMoZW1wdHlNZXNzYWdlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgIGFsbEV4dGVuc2lvbnNNZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVW5rbm93bkVudW1WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBzaW5ndWxhckZpZWxkID0KKyAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOworICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciByZXBlYXRlZEZpZWxkID0KKyAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpOworICAgIGFzc2VydE5vdE51bGwoc2luZ3VsYXJGaWVsZCk7CisgICAgYXNzZXJ0Tm90TnVsbChyZXBlYXRlZEZpZWxkKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9CisgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRGaWVsZChzaW5ndWxhckZpZWxkLmdldE51bWJlcigpLAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLmdldE51bWJlcigpKQorICAgICAgICAgICAgLmFkZFZhcmludCg1KSAgIC8vIG5vdCB2YWxpZAorICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5hZGRGaWVsZChyZXBlYXRlZEZpZWxkLmdldE51bWJlcigpLAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLmdldE51bWJlcigpKQorICAgICAgICAgICAgLmFkZFZhcmludCg0KSAgIC8vIG5vdCB2YWxpZAorICAgICAgICAgICAgLmFkZFZhcmludChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVouZ2V0TnVtYmVyKCkpCisgICAgICAgICAgICAuYWRkVmFyaW50KDYpICAgLy8gbm90IHZhbGlkCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgLnRvQnl0ZVN0cmluZygpOworCisgICAgeworICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGRhdGEpOworICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgQXJyYXlzLmFzTGlzdChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWiksCisgICAgICAgIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtTGlzdCgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDVMKSwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoc2luZ3VsYXJGaWVsZC5nZXROdW1iZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmludExpc3QoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCg0TCwgNkwpLAorICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEZpZWxkLmdldE51bWJlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFyaW50TGlzdCgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0KKyAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMucGFyc2VGcm9tKGRhdGEsIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pKTsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgQXJyYXlzLmFzTGlzdChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWiksCisgICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7CisgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCg1TCksCisgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHNpbmd1bGFyRmllbGQuZ2V0TnVtYmVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpbnRMaXN0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNEwsIDZMKSwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRGaWVsZC5nZXROdW1iZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmludExpc3QoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExhcmdlVmFyaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBkYXRhID0KKyAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEZpZWxkKDEsCisgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZFZhcmludCgweDdGRkZGRkZGRkZGRkZGRkZMKQorICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpCisgICAgICAgIC50b0J5dGVTdHJpbmcoKTsKKyAgICBVbmtub3duRmllbGRTZXQgcGFyc2VkID0gVW5rbm93bkZpZWxkU2V0LnBhcnNlRnJvbShkYXRhKTsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBwYXJzZWQuZ2V0RmllbGQoMSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldFZhcmludExpc3QoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygweDdGRkZGRkZGRkZGRkZGRkZMLCAobG9uZylmaWVsZC5nZXRWYXJpbnRMaXN0KCkuZ2V0KDApKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNBbmRIYXNoQ29kZSgpIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZml4ZWQzMkZpZWxkID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZEZpeGVkMzIoMSkKKyAgICAgICAgICAgIC5idWlsZCgpOworICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaXhlZDY0RmllbGQgPQorICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRml4ZWQ2NCgxKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIHZhckludEZpZWxkID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZFZhcmludCgxKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGxlbmd0aERlbGltaXRlZEZpZWxkID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChCeXRlU3RyaW5nLkVNUFRZKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGdyb3VwRmllbGQgPQorICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkR3JvdXAodW5rbm93bkZpZWxkcykKKyAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgVW5rbm93bkZpZWxkU2V0IGEgPQorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwgZml4ZWQzMkZpZWxkKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0IGIgPQorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwgZml4ZWQ2NEZpZWxkKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0IGMgPQorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwgdmFySW50RmllbGQpCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICBVbmtub3duRmllbGRTZXQgZCA9CisgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRGaWVsZCgxLCBsZW5ndGhEZWxpbWl0ZWRGaWVsZCkKKyAgICAgICAgICAgIC5idWlsZCgpOworICAgIFVua25vd25GaWVsZFNldCBlID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZEZpZWxkKDEsIGdyb3VwRmllbGQpCisgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGEpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGIpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGMpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGQpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGUpOworCisgICAgY2hlY2tOb3RFcXVhbChhLCBiKTsKKyAgICBjaGVja05vdEVxdWFsKGEsIGMpOworICAgIGNoZWNrTm90RXF1YWwoYSwgZCk7CisgICAgY2hlY2tOb3RFcXVhbChhLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGIsIGMpOworICAgIGNoZWNrTm90RXF1YWwoYiwgZCk7CisgICAgY2hlY2tOb3RFcXVhbChiLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGMsIGQpOworICAgIGNoZWNrTm90RXF1YWwoYywgZSk7CisgICAgY2hlY2tOb3RFcXVhbChkLCBlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZpZWxkIHNldHMgYXJlIG5vdCBlcXVhbCBhbmQgaGF2ZSBkaWZmZXJlbnQKKyAgICogaGFzaCBjb2Rlcy4KKyAgICoKKyAgICogQHdhcm5pbmcgSXQncyB2YWxpZCBmb3Igbm9uLWVxdWFsIG9iamVjdHMgdG8gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUsIHNvCisgICAqICAgdGhpcyB0ZXN0IGlzIHN0cmljdGVyIHRoYW4gaXQgbmVlZHMgdG8gYmUuIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIGhhcHBlbgorICAgKiAgIHJlbGF0aXZlbHkgcmFyZWx5LgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrTm90RXF1YWwoVW5rbm93bkZpZWxkU2V0IHMxLCBVbmtub3duRmllbGRTZXQgczIpIHsKKyAgICBTdHJpbmcgZXF1YWxzRXJyb3IgPSBTdHJpbmcuZm9ybWF0KCIlcyBzaG91bGQgbm90IGJlIGVxdWFsIHRvICVzIiwgczEsIHMyKTsKKyAgICBhc3NlcnRGYWxzZShlcXVhbHNFcnJvciwgczEuZXF1YWxzKHMyKSk7CisgICAgYXNzZXJ0RmFsc2UoZXF1YWxzRXJyb3IsIHMyLmVxdWFscyhzMSkpOworCisgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IGhhc2ggY29kZSBmcm9tICVzIiwgczEsIHMyKSwKKyAgICAgICAgczEuaGFzaENvZGUoKSA9PSBzMi5oYXNoQ29kZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZpZWxkIHNldHMgYXJlIGVxdWFsIGFuZCBoYXZlIGlkZW50aWNhbCBoYXNoIGNvZGVzLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KFVua25vd25GaWVsZFNldCBzZXQpIHsKKyAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGl0c2VsZi4KKyAgICBhc3NlcnRFcXVhbHMoc2V0LCBzZXQpOworCisgICAgLy8gT2JqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBhIGNvcHkgb2YgaXRzZWxmLgorICAgIFVua25vd25GaWVsZFNldCBjb3B5ID0gVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoc2V0KS5idWlsZCgpOworICAgIGFzc2VydEVxdWFscyhzZXQsIGNvcHkpOworICAgIGFzc2VydEVxdWFscyhjb3B5LCBzZXQpOworICAgIGFzc2VydEVxdWFscyhzZXQuaGFzaENvZGUoKSwgY29weS5oYXNoQ29kZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1ZDA2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3R9LgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQSA9ICJBIjsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19CID0gIkIiOworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0MgPSAiQyI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19BID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkEiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19CID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkIiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19DID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkMiKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHlNZXRob2RzKCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKKyAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOworICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdC5nZXQoMCkpOworICAgIGFzc2VydFNhbWUoU1RSSU5HX0IsIGxpc3QuZ2V0KDEpKTsKKyAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0LmdldCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0EsIGxpc3QuZ2V0Qnl0ZVN0cmluZygwKSk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0IsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0MsIGxpc3QuZ2V0Qnl0ZVN0cmluZygyKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWV0aG9kcygpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IHJhd0xpc3QgPSBjcmVhdGVTYW1wbGVMaXN0KCk7CisgICAgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QgbGlzdCA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChyYXdMaXN0KTsKKworICAgIHRyeSB7CisgICAgICBsaXN0LnJlbW92ZSgwKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGxpc3QuYWRkKFNUUklOR19CKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGxpc3Quc2V0KDEsIFNUUklOR19CKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IHJhd0xpc3QgPSBjcmVhdGVTYW1wbGVMaXN0KCk7CisgICAgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QgbGlzdCA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChyYXdMaXN0KTsKKworICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgaXRlci5uZXh0KCk7CisgICAgICBjb3VudCsrOworICAgICAgdHJ5IHsKKyAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgZmFpbCgpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAvLyBleHBlY3RlZAorICAgICAgfQorICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoMywgY291bnQpOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKKyAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOworCisgICAgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgIGl0ZXIubmV4dCgpOworICAgICAgY291bnQrKzsKKyAgICAgIHRyeSB7CisgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgIGZhaWwoKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGl0ZXIuc2V0KCJiYXIiKTsKKyAgICAgICAgZmFpbCgpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAvLyBleHBlY3RlZAorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgaXRlci5hZGQoImJhciIpOworICAgICAgICBmYWlsKCk7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICB9CisgICAgfQorICAgIGFzc2VydEVxdWFscygzLCBjb3VudCk7CisKKyAgfQorCisgIHByaXZhdGUgTGF6eVN0cmluZ0FycmF5TGlzdCBjcmVhdGVTYW1wbGVMaXN0KCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7CisgICAgcmF3TGlzdC5hZGQoU1RSSU5HX0EpOworICAgIHJhd0xpc3QuYWRkKFNUUklOR19CKTsKKyAgICByYXdMaXN0LmFkZChTVFJJTkdfQyk7CisgICAgcmV0dXJuIHJhd0xpc3Q7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY2MjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9XaXJlRm9ybWF0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTgwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEZpZWxkT3JkZXJpbmdzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZEV4dGVuc2lvbnM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0OworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5SYXdNZXNzYWdlU2V0OworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlOworCisvKioKKyAqIFRlc3RzIHJlbGF0ZWQgdG8gcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbi4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisgKi8KK3B1YmxpYyBjbGFzcyBXaXJlRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworCisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKTsKKworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcy5zaXplKCksIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7CisKKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTIgPSBUZXN0UGFja2VkVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKKworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCisgICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbEV4dGVuc2lvbnMgdGhlbiBwYXJzZSBpdCBhcyBUZXN0QWxsVHlwZXMKKyAgICAvLyBpdCBzaG91bGQgd29yay4KKworICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGVzdFBhY2tlZFR5cGVzIGFuZCBUZXN0UGFja2VkRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUKKyAgICAvLyBmb3JtYXRzOyBjaGVjayB0aGF0IHRoZXkgc2VyaWFsaXplIHRvIHRoZSBzYW1lIHN0cmluZy4KKyAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlczIgPSBtZXNzYWdlMi50b0J5dGVTdHJpbmcoKTsKKworICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkV2l0aG91dEdldFNlcmlhbGl6ZWRTaXplKCkKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFdyaXRlIGRpcmVjdGx5IHRvIGFuIE91dHB1dFN0cmVhbSwgd2l0aG91dCBpbnZva2luZyBnZXRTZXJpYWxpemVkU2l6ZSgpCisgICAgLy8gVGhpcyB1c2VkIHRvIGJlIGEgYnVnIHdoZXJlIHRoZSBzaXplIG9mIGEgcGFja2VkIGZpZWxkIHdhcyBpbmNvcnJlY3QsCisgICAgLy8gc2luY2UgZ2V0U2VyaWFsaXplZFNpemUoKSB3YXMgbmV2ZXIgaW52b2tlZC4KKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldFBhY2tlZFNldCgpOworCisgICAgLy8gRGlyZWN0bHkgY29uc3RydWN0IGEgQ29kZWRPdXRwdXRTdHJlYW0gYXJvdW5kIHRoZSBhY3R1YWwgT3V0cHV0U3RyZWFtLAorICAgIC8vIGluIGNhc2Ugd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0cHV0KSBpbnZva2VzIGdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dFN0cmVhbSk7CisKKyAgICBtZXNzYWdlLndyaXRlVG8oY29kZWRPdXRwdXQpOworCisgICAgY29kZWRPdXRwdXQuZmx1c2goKTsKKworICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMiA9IFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20oCisgICAgICAgIG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9uc0xpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0QWxsVHlwZXMgYW5kIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZSBmb3JtYXRzLAorICAgIC8vIHNvIGlmIHdlIHNlcmlhbGl6ZSBhIFRlc3RBbGxFeHRlbnNpb25zIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbFR5cGVzCisgICAgLy8gaXQgc2hvdWxkIHdvcmsuCisKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbExpdGVFeHRlbnNpb25zU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3RQYWNrZWRUeXBlcyBhbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlCisgICAgLy8gZm9ybWF0czsgY2hlY2sgdGhhdCB0aGV5IHNlcmlhbGl6ZSB0byB0aGUgc2FtZSBzdHJpbmcuCisgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlczIgPSBtZXNzYWdlMi50b0J5dGVTdHJpbmcoKTsKKworICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0QWxsVHlwZXMgYW5kIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZSBmb3JtYXRzLAorICAgIC8vIHNvIGlmIHdlIHNlcmlhbGl6ZSBhIFRlc3RBbGxUeXBlcyB0aGVuIHBhcnNlIGl0IGFzIFRlc3RBbGxFeHRlbnNpb25zCisgICAgLy8gaXQgc2hvdWxkIHdvcmsuCisKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTIgPQorICAgICAgVGVzdEFsbEV4dGVuc2lvbnMucGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVBhY2tlZEV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBFbnN1cmUgdGhhdCBwYWNrZWQgZXh0ZW5zaW9ucyBjYW4gYmUgcHJvcGVybHkgcGFyc2VkLgorICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRQYWNrZWRFeHRlbnNpb25zU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisKKyAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisKKyAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlMiA9CisgICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zLnBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCisgICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbFR5cGVzIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbEV4dGVuc2lvbnMKKyAgICAvLyBpdCBzaG91bGQgd29yay4KKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisKKyAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnlfbGl0ZSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpOworCisgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UyID0KKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5wYXJzZUZyb20ocmF3Qnl0ZXMsIHJlZ2lzdHJ5X2xpdGUpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisKKyAgICAvLyBUcnkgYWdhaW4gdXNpbmcgYSBmdWxsIGV4dGVuc2lvbiByZWdpc3RyeS4KKyAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZTMgPQorICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLnBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEVuc3VyZSB0aGF0IHBhY2tlZCBleHRlbnNpb25zIGNhbiBiZSBwcm9wZXJseSBwYXJzZWQuCisgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHJlZ2lzdHJ5ID0gVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCk7CisKKyAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZTIgPQorICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUucGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25zU2VyaWFsaXplZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0U2VyaWFsaXplZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpLmdldFNlcmlhbGl6ZWRTaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZURlbGltaXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgVGVzdFV0aWwuZ2V0QWxsU2V0KCkud3JpdGVEZWxpbWl0ZWRUbyhvdXRwdXQpOworICAgIG91dHB1dC53cml0ZSgxMik7CisgICAgVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkud3JpdGVEZWxpbWl0ZWRUbyhvdXRwdXQpOworICAgIG91dHB1dC53cml0ZSgzNCk7CisKKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXQudG9CeXRlQXJyYXkoKSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoVGVzdEFsbFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkpOworICAgIGFzc2VydEVxdWFscygxMiwgaW5wdXQucmVhZCgpKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoVGVzdFBhY2tlZFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkpOworICAgIGFzc2VydEVxdWFscygzNCwgaW5wdXQucmVhZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTEsIGlucHV0LnJlYWQoKSk7CisKKyAgICAvLyBXZSdyZSBhdCBFT0YsIHNvIHBhcnNpbmcgYWdhaW4gc2hvdWxkIHJldHVybiBudWxsLgorICAgIGFzc2VydFRydWUoVGVzdEFsbFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkgPT0gbnVsbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0RmllbGRzSW5PcmRlcihCeXRlU3RyaW5nIGRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhLm5ld0NvZGVkSW5wdXQoKTsKKyAgICBpbnQgcHJldmlvdXNUYWcgPSAwOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7CisgICAgICBpZiAodGFnID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGFzc2VydFRydWUodGFnID4gcHJldmlvdXNUYWcpOworICAgICAgcHJldmlvdXNUYWcgPSB0YWc7CisgICAgICBpbnB1dC5za2lwRmllbGQodGFnKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJsZWF2ZWRGaWVsZHNBbmRFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGVzdHMgdGhhdCBmaWVsZHMgYXJlIHdyaXR0ZW4gaW4gb3JkZXIgZXZlbiB3aGVuIGV4dGVuc2lvbiByYW5nZXMKKyAgICAvLyBhcmUgaW50ZXJsZWF2ZWQgd2l0aCBmaWVsZCBudW1iZXJzLgorICAgIEJ5dGVTdHJpbmcgZGF0YSA9CisgICAgICBUZXN0RmllbGRPcmRlcmluZ3MubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRNeUludCgxKQorICAgICAgICAuc2V0TXlTdHJpbmcoImZvbyIpCisgICAgICAgIC5zZXRNeUZsb2F0KDEuMEYpCisgICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5teUV4dGVuc2lvbkludCwgMjMpCisgICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZywgImJhciIpCisgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEZpZWxkc0luT3JkZXIoZGF0YSk7CisKKyAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0RmllbGRPcmRlcmluZ3MuZ2V0RGVzY3JpcHRvcigpOworICAgIEJ5dGVTdHJpbmcgZHluYW1pY19kYXRhID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzLmdldERlc2NyaXB0b3IoKSkKKyAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9pbnQiKSwgMUwpCisgICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfc3RyaW5nIiksICJmb28iKQorICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X2Zsb2F0IiksIDEuMEYpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50LmdldERlc2NyaXB0b3IoKSwgMjMpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uU3RyaW5nLmdldERlc2NyaXB0b3IoKSwgImJhciIpCisgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEZpZWxkc0luT3JkZXIoZHluYW1pY19kYXRhKTsKKyAgfQorCisgIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0VGVzdEZpZWxkT3JkZXJpbmdzUmVnaXN0cnkoKSB7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVzdWx0ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKKyAgICByZXN1bHQuYWRkKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25JbnQpOworICAgIHJlc3VsdC5hZGQoVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBwYXJzZSBhIG1lc3NhZ2UgdGhhdCBjb250YWlucyBtdWx0aXBsZSBleHRlbnNpb25zCisgICAgLy8gcmFuZ2VzLgorICAgIFRlc3RGaWVsZE9yZGVyaW5ncyBzb3VyY2UgPQorICAgICAgVGVzdEZpZWxkT3JkZXJpbmdzLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TXlJbnQoMSkKKyAgICAgICAgLnNldE15U3RyaW5nKCJmb28iKQorICAgICAgICAuc2V0TXlGbG9hdCgxLjBGKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25JbnQsIDIzKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25TdHJpbmcsICJiYXIiKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBUZXN0RmllbGRPcmRlcmluZ3MgZGVzdCA9CisgICAgICBUZXN0RmllbGRPcmRlcmluZ3MucGFyc2VGcm9tKHNvdXJjZS50b0J5dGVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdEZpZWxkT3JkZXJpbmdzUmVnaXN0cnkoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZGVzdCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0R5bmFtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBTYW1lIGFzIGFib3ZlIGV4Y2VwdCB3aXRoIER5bmFtaWNNZXNzYWdlLgorICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RGaWVsZE9yZGVyaW5ncy5nZXREZXNjcmlwdG9yKCk7CisgICAgRHluYW1pY01lc3NhZ2Ugc291cmNlID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzLmdldERlc2NyaXB0b3IoKSkKKyAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9pbnQiKSwgMUwpCisgICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfc3RyaW5nIiksICJmb28iKQorICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X2Zsb2F0IiksIDEuMEYpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50LmdldERlc2NyaXB0b3IoKSwgMjMpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uU3RyaW5nLmdldERlc2NyaXB0b3IoKSwgImJhciIpCisgICAgICAgIC5idWlsZCgpOworICAgIER5bmFtaWNNZXNzYWdlIGRlc3QgPQorICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKGRlc2NyaXB0b3IsIHNvdXJjZS50b0J5dGVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZXN0RmllbGRPcmRlcmluZ3NSZWdpc3RyeSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoc291cmNlLCBkZXN0KTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX1RZUEVfSUQgPSAxNTUwMDU1OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JRF8xID0KKyAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuZ2V0RGVzY3JpcHRvcigpLmdldEV4dGVuc2lvbnMoKS5nZXQoMCkuZ2V0TnVtYmVyKCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0lEXzIgPQorICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpLmdldCgwKS5nZXROdW1iZXIoKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplTWVzc2FnZVNldEVhZ2VybHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0ZXN0U2VyaWFsaXplTWVzc2FnZVNldFdpdGhGbGFnKHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXROb3RFYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoRmxhZyhmYWxzZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoRmxhZyhib29sZWFuIGVhZ2VyUGFyc2luZykKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5zZXRFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cyhlYWdlclBhcnNpbmcpOworICAgIC8vIFNldCB1cCBhIFRlc3RNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZS4KKyAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uLAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkuc2V0SSgxMjMpLmJ1aWxkKCkpCisgICAgICAgIC5zZXRFeHRlbnNpb24oCisgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24sCisgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm5ld0J1aWxkZXIoKS5zZXRTdHIoImZvbyIpLmJ1aWxkKCkpCisgICAgICAgIC5zZXRVbmtub3duRmllbGRzKAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRGaWVsZChVTktOT1dOX1RZUEVfSUQsCisgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJiYXIiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2VTZXQudG9CeXRlU3RyaW5nKCk7CisKKyAgICAvLyBQYXJzZSBiYWNrIHVzaW5nIFJhd01lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KKyAgICBSYXdNZXNzYWdlU2V0IHJhdyA9IFJhd01lc3NhZ2VTZXQucGFyc2VGcm9tKGRhdGEpOworCisgICAgYXNzZXJ0VHJ1ZShyYXcuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygzLCByYXcuZ2V0SXRlbUNvdW50KCkpOworICAgIGFzc2VydEVxdWFscyhUWVBFX0lEXzEsIHJhdy5nZXRJdGVtKDApLmdldFR5cGVJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVFlQRV9JRF8yLCByYXcuZ2V0SXRlbSgxKS5nZXRUeXBlSWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVOS05PV05fVFlQRV9JRCwgcmF3LmdldEl0ZW0oMikuZ2V0VHlwZUlkKCkpOworCisgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2UxID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5wYXJzZUZyb20oCisgICAgICAgIHJhdy5nZXRJdGVtKDApLmdldE1lc3NhZ2UoKS50b0J5dGVBcnJheSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlMS5nZXRJKCkpOworCisgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2UyID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5wYXJzZUZyb20oCisgICAgICAgIHJhdy5nZXRJdGVtKDEpLmdldE1lc3NhZ2UoKS50b0J5dGVBcnJheSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1lc3NhZ2UyLmdldFN0cigpKTsKKworICAgIGFzc2VydEVxdWFscygiYmFyIiwgcmF3LmdldEl0ZW0oMikuZ2V0TWVzc2FnZSgpLnRvU3RyaW5nVXRmOCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXRFYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdFBhcnNlTWVzc2FnZVNldFdpdGhGbGFnKHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlTWVzc2FnZVNldE5vdEVhZ2VybHkoKXRocm93cyBFeGNlcHRpb24geworICAgIHRlc3RQYXJzZU1lc3NhZ2VTZXRXaXRoRmxhZyhmYWxzZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdFBhcnNlTWVzc2FnZVNldFdpdGhGbGFnKGJvb2xlYW4gZWFnZXJQYXJzaW5nKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLnNldEVhZ2VybHlQYXJzZU1lc3NhZ2VTZXRzKGVhZ2VyUGFyc2luZyk7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOworICAgIGV4dGVuc2lvblJlZ2lzdHJ5LmFkZChUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbik7CisgICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKKworICAgIC8vIFNldCB1cCBhIFJhd01lc3NhZ2VTZXQgd2l0aCB0d28ga25vd24gbWVzc2FnZXMgYW5kIGFuIHVua25vd24gb25lLgorICAgIFJhd01lc3NhZ2VTZXQgcmF3ID0KKyAgICAgIFJhd01lc3NhZ2VTZXQubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRJdGVtKAorICAgICAgICAgIFJhd01lc3NhZ2VTZXQuSXRlbS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRUeXBlSWQoVFlQRV9JRF8xKQorICAgICAgICAgICAgLnNldE1lc3NhZ2UoCisgICAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SSgxMjMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCkpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmFkZEl0ZW0oCisgICAgICAgICAgUmF3TWVzc2FnZVNldC5JdGVtLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldFR5cGVJZChUWVBFX0lEXzIpCisgICAgICAgICAgICAuc2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRTdHIoImZvbyIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCkpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmFkZEl0ZW0oCisgICAgICAgICAgUmF3TWVzc2FnZVNldC5JdGVtLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldFR5cGVJZChVTktOT1dOX1RZUEVfSUQpCisgICAgICAgICAgICAuc2V0TWVzc2FnZShCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiYmFyIikpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBCeXRlU3RyaW5nIGRhdGEgPSByYXcudG9CeXRlU3RyaW5nKCk7CisKKyAgICAvLyBQYXJzZSBhcyBhIFRlc3RNZXNzYWdlU2V0IGFuZCBjaGVjayB0aGUgY29udGVudHMuCisgICAgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZVNldCA9CisgICAgICBUZXN0TWVzc2FnZVNldC5wYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpOworCisgICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCisgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAorICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldFN0cigpKTsKKworICAgIC8vIENoZWNrIGZvciB1bmtub3duIGZpZWxkIHdpdGggdHlwZSBMRU5HVEhfREVMSU1JVEVELAorICAgIC8vICAgbnVtYmVyIFVOS05PV05fVFlQRV9JRCwgYW5kIGNvbnRlbnRzICJiYXIiLgorICAgIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0gbWVzc2FnZVNldC5nZXRVbmtub3duRmllbGRzKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHVua25vd25GaWVsZHMuYXNNYXAoKS5zaXplKCkpOworICAgIGFzc2VydFRydWUodW5rbm93bkZpZWxkcy5oYXNGaWVsZChVTktOT1dOX1RZUEVfSUQpKTsKKworICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IHVua25vd25GaWVsZHMuZ2V0RmllbGQoVU5LTk9XTl9UWVBFX0lEKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0TGVuZ3RoRGVsaW1pdGVkTGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBmaWVsZC5nZXRMZW5ndGhEZWxpbWl0ZWRMaXN0KCkuZ2V0KDApLnRvU3RyaW5nVXRmOCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXRFeHRlbnNpb25FYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdFBhcnNlTWVzc2FnZVNldEV4dGVuc2lvbldpdGhGbGFnKHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlTWVzc2FnZVNldEV4dGVuc2lvbk5vdEVhZ2VybHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0ZXN0UGFyc2VNZXNzYWdlU2V0RXh0ZW5zaW9uV2l0aEZsYWcoZmFsc2UpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXRFeHRlbnNpb25XaXRoRmxhZyhib29sZWFuIGVhZ2VyUGFyc2luZykKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5zZXRFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cyhlYWdlclBhcnNpbmcpOworICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKKyAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2VTZXRFeHRlbnNpb24pOworCisgICAgLy8gU2V0IHVwIGEgUmF3TWVzc2FnZVNldCB3aXRoIGEga25vd24gbWVzc2FnZXMuCisgICAgaW50IFRZUEVfSURfMSA9CisgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMQorICAgICAgICAgICAgLmdldERlc2NyaXB0b3IoKS5nZXRFeHRlbnNpb25zKCkuZ2V0KDApLmdldE51bWJlcigpOworICAgIFJhd01lc3NhZ2VTZXQgcmF3ID0KKyAgICAgIFJhd01lc3NhZ2VTZXQubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRJdGVtKAorICAgICAgICAgIFJhd01lc3NhZ2VTZXQuSXRlbS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRUeXBlSWQoVFlQRV9JRF8xKQorICAgICAgICAgICAgLnNldE1lc3NhZ2UoCisgICAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SSgxMjMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCkpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBCeXRlU3RyaW5nIGRhdGEgPSByYXcudG9CeXRlU3RyaW5nKCk7CisKKyAgICAvLyBQYXJzZSBhcyBhIFRlc3RNZXNzYWdlU2V0IGFuZCBjaGVjayB0aGUgY29udGVudHMuCisgICAgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZVNldCA9CisgICAgICAgIFRlc3RNZXNzYWdlU2V0LnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCisgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKS5nZXRJKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1lcmdlTGF6eU1lc3NhZ2VTZXRFeHRlbnNpb25FYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdE1lcmdlTGF6eU1lc3NhZ2VTZXRFeHRlbnNpb25XaXRoRmxhZyh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUxhenlNZXNzYWdlU2V0RXh0ZW5zaW9uTm90RWFnZXJseSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRlc3RNZXJnZUxhenlNZXNzYWdlU2V0RXh0ZW5zaW9uV2l0aEZsYWcoZmFsc2UpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RNZXJnZUxhenlNZXNzYWdlU2V0RXh0ZW5zaW9uV2l0aEZsYWcoYm9vbGVhbiBlYWdlclBhcnNpbmcpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuc2V0RWFnZXJseVBhcnNlTWVzc2FnZVNldHMoZWFnZXJQYXJzaW5nKTsKKyAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7CisgICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKKworICAgIC8vIFNldCB1cCBhIFJhd01lc3NhZ2VTZXQgd2l0aCBhIGtub3duIG1lc3NhZ2VzLgorICAgIGludCBUWVBFX0lEXzEgPQorICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKKyAgICAgICAgICAgIC5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpLmdldCgwKS5nZXROdW1iZXIoKTsKKyAgICBSYXdNZXNzYWdlU2V0IHJhdyA9CisgICAgICBSYXdNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAuYWRkSXRlbSgKKyAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0VHlwZUlkKFRZUEVfSURfMSkKKyAgICAgICAgICAgIC5zZXRNZXNzYWdlKAorICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEkoMTIzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpKQorICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgQnl0ZVN0cmluZyBkYXRhID0gcmF3LnRvQnl0ZVN0cmluZygpOworCisgICAgLy8gUGFyc2UgYXMgYSBUZXN0TWVzc2FnZVNldCBhbmQgc3RvcmUgdmFsdWUgaW50byBsYXp5IGZpZWxkCisgICAgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZVNldCA9CisgICAgICAgIFRlc3RNZXNzYWdlU2V0LnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgLy8gTWVyZ2UgbGF6eSBmaWVsZCBjaGVjayB0aGUgY29udGVudHMuCisgICAgbWVzc2FnZVNldCA9CisgICAgICAgIG1lc3NhZ2VTZXQudG9CdWlsZGVyKCkubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZCgpOworICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAorICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25FYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdE1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbldpdGhGbGFnKHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbk5vdEVhZ2VybHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0ZXN0TWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uV2l0aEZsYWcoZmFsc2UpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RNZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25XaXRoRmxhZyhib29sZWFuIGVhZ2VyUGFyc2luZykKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5zZXRFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cyhlYWdlclBhcnNpbmcpOworICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKKyAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2VTZXRFeHRlbnNpb24pOworCisgICAgLy8gU2V0IHVwIGEgUmF3TWVzc2FnZVNldCB3aXRoIGEga25vd24gbWVzc2FnZXMuCisgICAgaW50IFRZUEVfSURfMSA9CisgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMQorICAgICAgICAgICAgLmdldERlc2NyaXB0b3IoKS5nZXRFeHRlbnNpb25zKCkuZ2V0KDApLmdldE51bWJlcigpOworICAgIFJhd01lc3NhZ2VTZXQgcmF3ID0KKyAgICAgIFJhd01lc3NhZ2VTZXQubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRJdGVtKAorICAgICAgICAgIFJhd01lc3NhZ2VTZXQuSXRlbS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRUeXBlSWQoVFlQRV9JRF8xKQorICAgICAgICAgICAgLnNldE1lc3NhZ2UoCisgICAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SSgxMjMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCkpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAvLyBTZXJpYWxpemUgUmF3TWVzc2FnZVNldCB1bm5vcm1hbGx5IChtZXNzYWdlIHZhbHVlIGJlZm9yZSB0eXBlIGlkKQorICAgIEJ5dGVTdHJpbmcuQ29kZWRCdWlsZGVyIG91dCA9IEJ5dGVTdHJpbmcubmV3Q29kZWRCdWlsZGVyKAorICAgICAgICByYXcuZ2V0U2VyaWFsaXplZFNpemUoKSk7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gb3V0LmdldENvZGVkT3V0cHV0KCk7CisgICAgTGlzdDxSYXdNZXNzYWdlU2V0Lkl0ZW0+IGl0ZW1zID0gcmF3LmdldEl0ZW1MaXN0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgeworICAgICAgUmF3TWVzc2FnZVNldC5JdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICBvdXRwdXQud3JpdGVUYWcoMSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7CisgICAgICBvdXRwdXQud3JpdGVCeXRlcygzLCBpdGVtLmdldE1lc3NhZ2UoKSk7CisgICAgICBvdXRwdXQud3JpdGVJbnQzMigyLCBpdGVtLmdldFR5cGVJZCgpKTsKKyAgICAgIG91dHB1dC53cml0ZVRhZygxLCBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCk7CisgICAgfQorICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG91dC5idWlsZCgpOworCisgICAgLy8gTWVyZ2UgYnl0ZXMgaW50byBUZXN0TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLgorICAgIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXQgPQorICAgICAgICBUZXN0TWVzc2FnZVNldC5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZCgpOworICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAorICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDQwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL211bHRpcGxlX2ZpbGVzX3Rlc3QucHJvdG8KQEAgLTAsMCArMSw3MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aGljaCB0ZXN0cyB0aGUgamF2YV9tdWx0aXBsZV9maWxlcyBvcHRpb24uCisKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiTXVsdGlwbGVGaWxlc1Rlc3RQcm90byI7CisKK21lc3NhZ2UgTWVzc2FnZVdpdGhOb091dGVyIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBpID0gMTsKKyAgfQorICBlbnVtIE5lc3RlZEVudW0geworICAgIEJBWiA9IDM7CisgIH0KKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBuZXN0ZWQgPSAxOworICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZm9yZWlnbiA9IDI7CisgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAzOworICBvcHRpb25hbCBFbnVtV2l0aE5vT3V0ZXIgZm9yZWlnbl9lbnVtID0gNDsKK30KKworZW51bSBFbnVtV2l0aE5vT3V0ZXIgeworICBGT08gPSAxOworICBCQVIgPSAyOworfQorCitzZXJ2aWNlIFNlcnZpY2VXaXRoTm9PdXRlciB7CisgIHJwYyBGb28oTWVzc2FnZVdpdGhOb091dGVyKSByZXR1cm5zKFRlc3RBbGxUeXBlcyk7Cit9CisKK2V4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgIG9wdGlvbmFsIGludDMyIGV4dGVuc2lvbl93aXRoX291dGVyID0gMTIzNDU2NzsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2J1aWxkZXJzX3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9idWlsZGVyc190ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmZiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9idWlsZGVyc190ZXN0LnByb3RvCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorLy8KKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIk5lc3RlZEJ1aWxkZXJzIjsKKworCittZXNzYWdlIFZlaGljbGUgeworICBvcHRpb25hbCBFbmdpbmUgZW5naW5lID0gMTsKKyAgcmVwZWF0ZWQgV2hlZWwgd2hlZWwgPSAyOworfQorCittZXNzYWdlIEVuZ2luZSB7CisgIG9wdGlvbmFsIGludDMyIGN5bGluZGVyID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgbGl0ZXJzID0gMjsKK30KKworbWVzc2FnZSBXaGVlbCB7CisgIG9wdGlvbmFsIGludDMyIHJhZGl1cyA9IDE7CisgIG9wdGlvbmFsIGludDMyIHdpZHRoID0gMjsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmU1ZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogRGFyaWNrIFRvbmcgKGRhcmlja0Bnb29nbGUuY29tKQorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aXRoIG5lc3RlZCBleHRlbnNpb25zLiBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGRlZmluZWQgaW4KKy8vIGEgc2VwYXJhdGUgZmlsZSB0byBwcm9wZXJseSB0ZXN0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3V0ZXIgY2xhc3MuCisKKworaW1wb3J0ICJjb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworbWVzc2FnZSBNeU5lc3RlZEV4dGVuc2lvbiB7CisgIGV4dGVuZCBNZXNzYWdlVG9CZUV4dGVuZGVkIHsKKyAgICBvcHRpb25hbCBNZXNzYWdlVG9CZUV4dGVuZGVkIHJlY3Vyc2l2ZUV4dGVuc2lvbiA9IDI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvCkBAIC0wLDAgKzEsNDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogRGFyaWNrIFRvbmcgKGRhcmlja0Bnb29nbGUuY29tKQorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aXRoIG5lc3RlZCBleHRlbnNpb25zIGZvciBhIE1lc3NhZ2VMaXRlIG1lc3NhZ2VzLiBOb3RlIHRoYXQKKy8vIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIGEgc2VwYXJhdGUgZmlsZSB0byBwcm9wZXJseSB0ZXN0IHRoZSBpbml0aWFsaXphdGlvbgorLy8gb2YgdGhlIG91dGVyIGNsYXNzLgorCisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK2ltcG9ydCAiY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvIjsKKworbWVzc2FnZSBNeU5lc3RlZEV4dGVuc2lvbkxpdGUgeworICBleHRlbmQgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQgeworICAgIG9wdGlvbmFsIE1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkIHJlY3Vyc2l2ZUV4dGVuc2lvbkxpdGUgPSAzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFiNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90bwpAQCAtMCwwICsxLDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IERhcmljayBUb25nIChkYXJpY2tAZ29vZ2xlLmNvbSkKKy8vCisvLyBBIHByb3RvIGZpbGUgd2l0aCBleHRlbnNpb25zLgorCisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK21lc3NhZ2UgTWVzc2FnZVRvQmVFeHRlbmRlZCB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK21lc3NhZ2UgTXlOb25OZXN0ZWRFeHRlbnNpb24geworfQorCitleHRlbmQgTWVzc2FnZVRvQmVFeHRlbmRlZCB7CisgIG9wdGlvbmFsIE15Tm9uTmVzdGVkRXh0ZW5zaW9uIG5vbk5lc3RlZEV4dGVuc2lvbiA9IDE7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzgyNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvCkBAIC0wLDAgKzEsNTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogRGFyaWNrIFRvbmcgKGRhcmlja0Bnb29nbGUuY29tKQorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aXRoIGV4dGVuc2lvbnMgZm9yIGEgTWVzc2FnZUxpdGUgbWVzc2FnZXMuCisKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworbWVzc2FnZSBNZXNzYWdlTGl0ZVRvQmVFeHRlbmRlZCB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK21lc3NhZ2UgTXlOb25OZXN0ZWRFeHRlbnNpb25MaXRlIHsKK30KKworZXh0ZW5kIE1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkIHsKKyAgb3B0aW9uYWwgTXlOb25OZXN0ZWRFeHRlbnNpb25MaXRlIG5vbk5lc3RlZEV4dGVuc2lvbkxpdGUgPSAxOworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY3ZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpAQCAtMCwwICsxLDEwOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisKKy8vIFRoaXMgZmlsZSB0ZXN0cyB0aGF0IHZhcmlvdXMgaWRlbnRpZmllcnMgd29yayBhcyBmaWVsZCBhbmQgdHlwZSBuYW1lcyBldmVuCisvLyB0aG91Z2ggdGhlIHNhbWUgaWRlbnRpZmllcnMgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgamF2YSBjb2RlIGdlbmVyYXRvci4KKworCisvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAorb3B0aW9uIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAorCitwYWNrYWdlIGlvX3Byb3RvY29sX3Rlc3RzOworCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlRlc3RCYWRJZGVudGlmaWVyc1Byb3RvIjsKKworbWVzc2FnZSBUZXN0TWVzc2FnZSB7Cit9CisKK21lc3NhZ2UgRGVzY3JpcHRvciB7CisgIG9wdGlvbiBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gdHJ1ZTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlc2NyaXB0b3IgPSAxOworICBtZXNzYWdlIE5lc3RlZERlc2NyaXB0b3IgeworICAgIG9wdGlvbiBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gdHJ1ZTsKKyAgICBvcHRpb25hbCBzdHJpbmcgZGVzY3JpcHRvciA9IDE7CisgIH0KKyAgb3B0aW9uYWwgTmVzdGVkRGVzY3JpcHRvciBuZXN0ZWRfZGVzY3JpcHRvciA9IDI7Cit9CisKK21lc3NhZ2UgUGFyc2VyIHsKKyAgZW51bSBQYXJzZXJFbnVtIHsKKyAgICBQQVJTRVIgPSAxOworICB9CisgIG9wdGlvbmFsIFBhcnNlckVudW0gcGFyc2VyID0gMTsKK30KKworbWVzc2FnZSBEZXByZWNhdGVkIHsKKyAgZW51bSBUZXN0RW51bSB7CisgICAgRk9PID0gMTsKKyAgfQorCisgIG9wdGlvbmFsIGludDMyIGZpZWxkMSA9IDEgW2RlcHJlY2F0ZWQ9dHJ1ZV07CisgIG9wdGlvbmFsIFRlc3RFbnVtIGZpZWxkMiA9IDIgW2RlcHJlY2F0ZWQ9dHJ1ZV07CisgIG9wdGlvbmFsIFRlc3RNZXNzYWdlIGZpZWxkMyA9IDMgW2RlcHJlY2F0ZWQ9dHJ1ZV07Cit9CisKK21lc3NhZ2UgT3ZlcnJpZGUgeworICBvcHRpb25hbCBpbnQzMiBvdmVycmlkZSA9IDE7Cit9CisKK21lc3NhZ2UgT2JqZWN0IHsKKyAgb3B0aW9uYWwgaW50MzIgb2JqZWN0ID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZ19vYmplY3QgPSAyOworfQorCittZXNzYWdlIFN0cmluZyB7CisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmcgPSAxOworfQorCittZXNzYWdlIEludGVnZXIgeworICBvcHRpb25hbCBpbnQzMiBpbnRlZ2VyID0gMTsKK30KKworbWVzc2FnZSBMb25nIHsKKyAgb3B0aW9uYWwgaW50MzIgbG9uZyA9IDE7Cit9CisKK21lc3NhZ2UgRmxvYXQgeworICBvcHRpb25hbCBmbG9hdCBmbG9hdCA9IDE7Cit9CisKK21lc3NhZ2UgRG91YmxlIHsKKyAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZSA9IDE7Cit9CisKK3NlcnZpY2UgVGVzdENvbmZsaWN0aW5nTWV0aG9kTmFtZXMgeworICBycGMgT3ZlcnJpZGUoVGVzdE1lc3NhZ2UpIHJldHVybnMgKFRlc3RNZXNzYWdlKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9sdG1haW4uc2ggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg1MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9sdG1haW4uc2gKQEAgLTAsMCArMSw5NjYxIEBACisKKyMgbGlidG9vbCAoR05VIGxpYnRvb2wpIDIuNC4yCisjIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorIyAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTworIyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLAorIyBvciBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisjIFVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgorIworIyBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMKKyMgICAgICAgLS1jb25maWcgICAgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKyMgICAgICAgLS1kZWJ1ZyAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZworIyAgIC1uLCAtLWRyeS1ydW4gICAgICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcworIyAgICAgICAtLWZlYXR1cmVzICAgICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyMgICAgICAgLS1tb2RlPU1PREUgICAgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUKKyMgICAgICAgLS1wcmVzZXJ2ZS1kdXAtZGVwcyAgZG9uJ3QgcmVtb3ZlIGR1cGxpY2F0ZSBkZXBlbmRlbmN5IGxpYnJhcmllcworIyAgICAgICAtLXF1aWV0LCAtLXNpbGVudCAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisjICAgICAgIC0tbm8tcXVpZXQsIC0tbm8tc2lsZW50CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKGRlZmF1bHQpCisjICAgICAgIC0tbm8td2FybiAgICAgICAgICAgIGRvbid0IGRpc3BsYXkgd2FybmluZyBtZXNzYWdlcworIyAgICAgICAtLXRhZz1UQUcgICAgICAgICAgICB1c2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZnJvbSB0YWcgVEFHCisjICAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgIHByaW50IG1vcmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGFuIGRlZmF1bHQKKyMgICAgICAgLS1uby12ZXJib3NlICAgICAgICAgZG9uJ3QgcHJpbnQgdGhlIGV4dHJhIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyMgICAgICAgLS12ZXJzaW9uICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgorIyAgIC1oLCAtLWhlbHAsIC0taGVscC1hbGwgICBwcmludCBzaG9ydCwgbG9uZywgb3IgZGV0YWlsZWQgaGVscCBtZXNzYWdlCisjCisjIE1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyMKKyMgICAgICAgICBjbGVhbiAgICAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQorIyAgICAgICAgIGNvbXBpbGUgICAgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0CisjICAgICAgICAgZXhlY3V0ZSAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCisjICAgICAgICAgZmluaXNoICAgICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyMgICAgICAgICBpbnN0YWxsICAgICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKKyMgICAgICAgICBsaW5rICAgICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCisjICAgICAgICAgdW5pbnN0YWxsICAgICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisjCisjIE1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFdoZW4gcGFzc2VkIGFzIGZpcnN0IG9wdGlvbiwKKyMgYC0tbW9kZT1NT0RFJyBtYXkgYmUgYWJicmV2aWF0ZWQgYXMgYE1PREUnIG9yIGEgdW5pcXVlIGFiYnJldmlhdGlvbiBvZiB0aGF0LgorIyBUcnkgYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KKyMKKyMgV2hlbiByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBkZXNjcmliZSBhIHRlc3QgY2FzZSB0byByZXByb2R1Y2UgaXQgYW5kCisjIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyMKKyMgICAgICAgICBob3N0LXRyaXBsZXQ6CSRob3N0CisjICAgICAgICAgc2hlbGw6CQkkU0hFTEwKKyMgICAgICAgICBjb21waWxlcjoJCSRMVENDCisjICAgICAgICAgY29tcGlsZXIgZmxhZ3M6CQkkTFRDRkxBR1MKKyMgICAgICAgICBsaW5rZXI6CQkkTEQgKGdudT8gJHdpdGhfZ251X2xkKQorIyAgICAgICAgICRwcm9nbmFtZToJKEdOVSBsaWJ0b29sKSAyLjQuMiBEZWJpYW4tMi40LjItMXVidW50dTEKKyMgICAgICAgICBhdXRvbWFrZToJJGF1dG9tYWtlX3ZlcnNpb24KKyMgICAgICAgICBhdXRvY29uZjoJJGF1dG9jb25mX3ZlcnNpb24KKyMKKyMgUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LgorIyBHTlUgbGlidG9vbCBob21lIHBhZ2U6IDxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGlidG9vbC8+LgorIyBHZW5lcmFsIGhlbHAgdXNpbmcgR05VIHNvZnR3YXJlOiA8aHR0cDovL3d3dy5nbnUub3JnL2dldGhlbHAvPi4KKworUFJPR1JBTT1saWJ0b29sCitQQUNLQUdFPWxpYnRvb2wKK1ZFUlNJT049IjIuNC4yIERlYmlhbi0yLjQuMi0xdWJ1bnR1MSIKK1RJTUVTVEFNUD0iIgorcGFja2FnZV9yZXZpc2lvbj0xLjMzMzcKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCitmaQorQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskMQorX0xURUNIT19FT0YnCit9CisKKyMgTkxTIG51aXNhbmNlczogV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCitsdF91c2VyX2xvY2FsZT0KK2x0X3NhZmVfbG9jYWxlPQorZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCitkbworICBldmFsICJpZiB0ZXN0IFwiXCR7JGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICBzYXZlXyRsdF92YXI9XCQkbHRfdmFyCisgICAgICAgICAgJGx0X3Zhcj1DCisJICBleHBvcnQgJGx0X3ZhcgorCSAgbHRfdXNlcl9sb2NhbGU9XCIkbHRfdmFyPVxcXCRzYXZlX1wkbHRfdmFyOyBcJGx0X3VzZXJfbG9jYWxlXCIKKwkgIGx0X3NhZmVfbG9jYWxlPVwiJGx0X3Zhcj1DOyBcJGx0X3NhZmVfbG9jYWxlXCIKKwlmaSIKK2RvbmUKK0xDX0FMTD1DCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UgTENfQUxMCisKKyRsdF91bnNldCBDRFBBVEgKKworCisjIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKKyMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCisjIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAorIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCisjIGZ1bmN0aW9uLgorcHJvZ3BhdGg9IiQwIgorCisKKworOiAke0NQPSJjcCAtZiJ9Cit0ZXN0ICIke0VDSE8rc2V0fSIgPSBzZXQgfHwgRUNITz0ke2FzX2VjaG8tJ3ByaW50ZiAlc1xuJ30KKzogJHtNQUtFPSJtYWtlIn0KKzogJHtNS0RJUj0ibWtkaXIifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KKzogJHtTSEVMTD0iJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0ifQorOiAke1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyJ9CisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK0VYSVRfU1VDQ0VTUz0wCitFWElUX0ZBSUxVUkU9MQorRVhJVF9NSVNNQVRDSD02MyAgIyAkPyA9IDYzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmVyc2lvbiBtaXNtYXRjaCB0byBtaXNzaW5nLgorRVhJVF9TS0lQPTc3CSAgIyAkPyA9IDc3IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBza2lwcGVkIHRlc3QgdG8gYXV0b21ha2UuCisKK2V4aXRfc3RhdHVzPSRFWElUX1NVQ0NFU1MKKworIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKK2x0X25sPScKKycKK0lGUz0iIAkkbHRfbmwiCisKK2Rpcm5hbWU9InMsL1teL10qJCwsIgorYmFzZW5hbWU9InMsXi4qLywsIgorCisjIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKKyMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorZnVuY19kaXJuYW1lICgpCit7CisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGRpcm5hbWUiYAorICAgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgICBmaQorfSAjIGZ1bmNfZGlybmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfYmFzZW5hbWUgZmlsZQorZnVuY19iYXNlbmFtZSAoKQoreworICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICIkYmFzZW5hbWUiYAorfSAjIGZ1bmNfYmFzZW5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgorIyBjYWxsOgorIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKKyMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAorIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisjIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKKyMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KKyMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQoreworICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAtZSAiJGRpcm5hbWUiYAorICAgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgICBmaQorICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEIC1lICIkYmFzZW5hbWUiYAorfSAjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX3N0cmlwbmFtZSBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCisjIGZ1bmNfc3RyaXBfc3VmZml4IHByZWZpeCBuYW1lCitmdW5jX3N0cmlwbmFtZSAoKQoreworICAgIGNhc2UgJHsyfSBpbgorICAgICAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgICAgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKKyAgICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBUaGVzZSBTRUQgc2NyaXB0cyBwcmVzdXBwb3NlIGFuIGFic29sdXRlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgorcGF0aGNhcj0ncyxeL1woW14vXSpcKS4qJCxcMSwnCitwYXRoY2RyPSdzLF4vW14vXSosLCcKK3JlbW92ZWRvdHBhcnRzPSc6ZG90c2wKKwkJc0AvXC4vQC9AZworCQl0IGRvdHNsCisJCXMsL1wuJCwvLCcKK2NvbGxhcHNlc2xhc2hlcz0nc0AvXHsxLFx9QC9AZycKK2ZpbmFsc2xhc2g9J3MsLyokLC8sJworCisjIGZ1bmNfbm9ybWFsX2Fic3BhdGggUEFUSAorIyBSZW1vdmUgZG91YmxlZC11cCBhbmQgdHJhaWxpbmcgc2xhc2hlcywgIi4iIHBhdGggY29tcG9uZW50cywKKyMgYW5kIGNhbmNlbCBvdXQgYW55ICIuLiIgcGF0aCBjb21wb25lbnRzIGluIFBBVEggYWZ0ZXIgbWFraW5nCisjIGl0IGFuIGFic29sdXRlIHBhdGguCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiCitmdW5jX25vcm1hbF9hYnNwYXRoICgpCit7CisgICMgU3RhcnQgZnJvbSByb290IGRpciBhbmQgcmVhc3NlbWJsZSB0aGUgcGF0aC4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9CisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9JDEKKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2U9CisgIGNhc2UgJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGggaW4KKyAgICAiIikKKyAgICAgICMgRW1wdHkgcGF0aCwgdGhhdCBqdXN0IG1lYW5zICRjd2QuCisgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLycgImBwd2RgIgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgICAgcmV0dXJuCisgICAgOzsKKyAgICAjIFRoZSBuZXh0IHRocmVlIGVudHJpZXMgYXJlIHVzZWQgdG8gc3BvdCBhIHJ1biBvZiBwcmVjaXNlbHkKKyAgICAjIHR3byBsZWFkaW5nIHNsYXNoZXMgd2l0aG91dCB1c2luZyBuZWdhdGVkIGNoYXJhY3RlciBjbGFzc2VzOworICAgICMgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YgY2FzZSdzIGZpcnN0LW1hdGNoIGJlaGF2aW91ci4KKyAgICAvLy8qKQorICAgICAgIyBVbnVzdWFsIGZvcm0gb2YgYWJzb2x1dGUgcGF0aCwgZG8gbm90aGluZy4KKyAgICA7OworICAgIC8vKikKKyAgICAgICMgTm90IG5lY2Vzc2FyaWx5IGFuIG9yZGluYXJ5IHBhdGg7IFBPU0lYIHJlc2VydmVzIGxlYWRpbmcgJy8vJworICAgICAgIyBhbmQgZm9yIGV4YW1wbGUgQ3lnd2luIHVzZXMgaXQgdG8gYWNjZXNzIHJlbW90ZSBmaWxlIHNoYXJlcworICAgICAgIyBvdmVyIENJRlMvU01CLCBzbyB3ZSBjb25zZXJ2ZSBhIGxlYWRpbmcgZG91YmxlIHNsYXNoIGlmIGZvdW5kLgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2U9LworICAgIDs7CisgICAgLyopCisgICAgICAjIEFic29sdXRlIHBhdGgsIGRvIG5vdGhpbmcuCisgICAgOzsKKyAgICAqKQorICAgICAgIyBSZWxhdGl2ZSBwYXRoLCBwcmVwZW5kICRjd2QuCisgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWBwd2RgLyRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoCisgICAgOzsKKyAgZXNhYworICAjIENhbmNlbCBvdXQgYWxsIHRoZSBzaW1wbGUgc3R1ZmYgdG8gc2F2ZSBpdGVyYXRpb25zLiAgV2UgYWxzbyB3YW50CisgICMgdGhlIHBhdGggdG8gZW5kIHdpdGggYSBzbGFzaCBmb3IgZWFzZSBvZiBwYXJzaW5nLCBzbyBtYWtlIHN1cmUKKyAgIyB0aGVyZSBpcyBvbmUgKGFuZCBvbmx5IG9uZSkgaGVyZS4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAorICAgICAgICAtZSAiJHJlbW92ZWRvdHBhcnRzIiAtZSAiJGNvbGxhcHNlc2xhc2hlcyIgLWUgIiRmaW5hbHNsYXNoImAKKyAgd2hpbGUgOjsgZG8KKyAgICAjIFByb2Nlc3NlZCBpdCBhbGwgeWV0PworICAgIGlmIHRlc3QgIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiA9IC8gOyB0aGVuCisgICAgICAjIElmIHdlIGFzY2VuZGVkIHRvIHRoZSByb290IHVzaW5nICIuLiIgdGhlIHJlc3VsdCBtYXkgYmUgZW1wdHkgbm93LgorICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9LworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQ9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKKyAgICAgICAgLWUgIiRwYXRoY2FyImAKKyAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCisgICAgICAgIC1lICIkcGF0aGNkciJgCisgICAgIyBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBpdAorICAgIGNhc2UgJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudCBpbgorICAgICAgIiIpCisgICAgICAgICMgVHJhaWxpbmcgZW1wdHkgcGF0aCBjb21wb25lbnQsIGlnbm9yZSBpdC4KKyAgICAgIDs7CisgICAgICAuLikKKyAgICAgICAgIyBQYXJlbnQgZGlyOyBzdHJpcCBsYXN0IGFzc2VtYmxlZCBjb21wb25lbnQgZnJvbSByZXN1bHQuCisgICAgICAgIGZ1bmNfZGlybmFtZSAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IgorICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorICAgICAgOzsKKyAgICAgICopCisgICAgICAgICMgQWN0dWFsIHBhdGggY29tcG9uZW50LCBhcHBlbmQgaXQuCisgICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdC8kZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50CisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICAjIFJlc3RvcmUgbGVhZGluZyBkb3VibGUtc2xhc2ggaWYgb25lIHdhcyBmb3VuZCBvbiBlbnRyeS4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfYWx0bmFtZXNwYWNlJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0Cit9CisKKyMgZnVuY19yZWxhdGl2ZV9wYXRoIFNSQ0RJUiBEU1RESVIKKyMgZ2VuZXJhdGVzIGEgcmVsYXRpdmUgcGF0aCBmcm9tIFNSQ0RJUiB0byBEU1RESVIsIHdpdGggYSB0cmFpbGluZworIyBzbGFzaCBpZiBub24tZW1wdHksIHN1aXRhYmxlIGZvciBpbW1lZGlhdGVseSBhcHBlbmRpbmcgYSBmaWxlbmFtZQorIyB3aXRob3V0IG5lZWRpbmcgdG8gYXBwZW5kIGEgc2VwYXJhdG9yLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiCitmdW5jX3JlbGF0aXZlX3BhdGggKCkKK3sKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0KKyAgZnVuY19ub3JtYWxfYWJzcGF0aCAiJDEiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyPSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAorICBmdW5jX25vcm1hbF9hYnNwYXRoICIkMiIKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXI9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0CisKKyAgIyBBc2NlbmQgdGhlIHRyZWUgc3RhcnRpbmcgZnJvbSBsaWJkaXIKKyAgd2hpbGUgOjsgZG8KKyAgICAjIGNoZWNrIGlmIHdlIGhhdmUgZm91bmQgYSBwcmVmaXggb2YgYmluZGlyCisgICAgY2FzZSAkZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXIgaW4KKyAgICAgICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcikKKyAgICAgICAgIyBmb3VuZCBhbiBleGFjdCBtYXRjaAorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0KKyAgICAgICAgYnJlYWsKKyAgICAgICAgOzsKKyAgICAgICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciopCisgICAgICAgICMgZm91bmQgYSBtYXRjaGluZyBwcmVmaXgKKyAgICAgICAgZnVuY19zdHJpcG5hbWUgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciIgJycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpciIKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCI7IHRoZW4KKyAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4KKyAgICAgICAgZmkKKyAgICAgICAgYnJlYWsKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfZGlybmFtZSAkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXI9JHtmdW5jX2Rpcm5hbWVfcmVzdWx0fQorICAgICAgICBpZiB0ZXN0ICJ4JGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyIiA9IHggOyB0aGVuCisgICAgICAgICAgIyBIYXZlIHRvIGRlc2NlbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QhCisgICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uLi8kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdAorICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPSRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpcgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9Li4vJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQKKyAgICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIE5vdyBjYWxjdWxhdGUgcGF0aDsgdGFrZSBjYXJlIHRvIGF2b2lkIGRvdWJsaW5nLXVwIHNsYXNoZXMuCisgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICBmdW5jX3N0cmlwbmFtZSAnLycgJy8nICIkZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQiCisgIGlmIHRlc3QgIngkZnVuY19zdHJpcG5hbWVfcmVzdWx0IiAhPSB4IDsgdGhlbgorICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JHtmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0fS8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH0KKyAgZmkKKworICAjIE5vcm1hbGlzYXRpb24uIElmIGJpbmRpciBpcyBsaWJkaXIsIHJldHVybiBlbXB0eSBzdHJpbmcsCisgICMgZWxzZSByZWxhdGl2ZSBwYXRoIGVuZGluZyB3aXRoIGEgc2xhc2g7IGVpdGhlciB3YXksIHRhcmdldAorICAjIGZpbGUgbmFtZSBjYW4gYmUgZGlyZWN0bHkgYXBwZW5kZWQuCisgIGlmIHRlc3QgISAteiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiOyB0aGVuCisgICAgZnVuY19zdHJpcG5hbWUgJy4vJyAnJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQvIgorICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICBmaQorfQorCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRwcm9ncGF0aCIKK3Byb2duYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCisjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggZm9yIHJlZXhlY3V0aW9uOgorY2FzZSAkcHJvZ3BhdGggaW4KKyAgW1xcL10qfFtBLVphLXpdOlxcKikgOzsKKyAgKltcXC9dKikKKyAgICAgcHJvZ2Rpcj0kZnVuY19kaXJuYW1lX3Jlc3VsdAorICAgICBwcm9nZGlyPWBjZCAiJHByb2dkaXIiICYmIHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKKyAgKikKKyAgICAgc2F2ZV9JRlM9IiRJRlMiCisgICAgIElGUz0ke1BBVEhfU0VQQVJBVE9SLTp9CisgICAgIGZvciBwcm9nZGlyIGluICRQQVRIOyBkbworICAgICAgIElGUz0iJHNhdmVfSUZTIgorICAgICAgIHRlc3QgLXggIiRwcm9nZGlyLyRwcm9nbmFtZSIgJiYgYnJlYWsKKyAgICAgZG9uZQorICAgICBJRlM9IiRzYXZlX0lGUyIKKyAgICAgdGVzdCAtbiAiJHByb2dkaXIiIHx8IHByb2dkaXI9YHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKK2VzYWMKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbYCIkXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgdHVybnMgYSBzdHJpbmcgaW50byBhIHJlZ2V4IG1hdGNoaW5nIGZvciB0aGUKKyMgc3RyaW5nIGxpdGVyYWxseS4KK3NlZF9tYWtlX2xpdGVyYWxfcmVnZXg9J3MsW10uW14kXFwqXC9dLFxcJixnJworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBjb252ZXJ0cyBhIHczMiBmaWxlIG5hbWUgb3IgcGF0aAorIyB3aGljaCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMsIGludG8gb25lIHRoYXQgY29udGFpbnMKKyMgKGVzY2FwZWQpIGJhY2tzbGFzaGVzLiAgQSB2ZXJ5IG5haXZlIGltcGxlbWVudGF0aW9uLgorbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeT0nc3xcXFxcKnxcXHxnO3N8L3xcXHxnO3N8XFx8XFxcXHxnJworCisjIFJlLWBcJyBwYXJhbWV0ZXIgZXhwYW5zaW9ucyBpbiBvdXRwdXQgb2YgZG91YmxlX3F1b3RlX3N1YnN0IHRoYXQgd2VyZQorIyBgXCctZWQgaW4gaW5wdXQgdG8gdGhlIHNhbWUuICBJZiBhbiBvZGQgbnVtYmVyIG9mIGBcJyBwcmVjZWRlZCBhICckJworIyBpbiBpbnB1dCB0byBkb3VibGVfcXVvdGVfc3Vic3QsIHRoYXQgJyQnIHdhcyBwcm90ZWN0ZWQgZnJvbSBleHBhbnNpb24uCisjIFNpbmNlIGVhY2ggaW5wdXQgYFwnIGlzIG5vdyB0d28gYFwncywgbG9vayBmb3IgYW55IG51bWJlciBvZiBydW5zIG9mCisjIGZvdXIgYFwncyBmb2xsb3dlZCBieSB0d28gYFwncyBhbmQgdGhlbiBhICckJy4gIGBcJyB0aGF0ICckJy4KK2JzPSdcXCcKK2JzMj0nXFxcXCcKK2JzND0nXFxcXFxcXFwnCitkb2xsYXI9J1wkJworc2VkX2RvdWJsZV9iYWNrc2xhc2g9IlwKKyAgcy8kYnM0LyZcXAorL2cKKyAgcy9eJGJzMiRkb2xsYXIvJGJzJi8KKyAgcy9cXChbXiRic11cXCkkYnMyJGRvbGxhci9cXDEkYnMyJGJzJGRvbGxhci9nCisgIHMvXG4vL2ciCisKKyMgU3RhbmRhcmQgb3B0aW9uczoKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfaGVscD1mYWxzZQorb3B0X3F1aWV0PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorb3B0X3dhcm5pbmc9OgorCisjIGZ1bmNfZWNobyBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSwgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBtb2RlCisjIG5hbWUgaWYgaXQgaGFzIGJlZW4gc2V0IHlldC4KK2Z1bmNfZWNobyAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9JCoiCit9CisKKyMgZnVuY192ZXJib3NlIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIGluIHZlcmJvc2UgbW9kZSBvbmx5LgorZnVuY192ZXJib3NlICgpCit7CisgICAgJG9wdF92ZXJib3NlICYmIGZ1bmNfZWNobyAkezErIiRAIn0KKworICAgICMgQSBidWcgaW4gYmFzaCBoYWx0cyB0aGUgc2NyaXB0IGlmIHRoZSBsYXN0IGxpbmUgb2YgYSBmdW5jdGlvbgorICAgICMgZmFpbHMgd2hlbiBzZXQgLWUgaXMgaW4gZm9yY2UsIHNvIHdlIG5lZWQgYW5vdGhlciBjb21tYW5kIHRvCisgICAgIyB3b3JrIGFyb3VuZCB0aGF0OgorICAgIDoKK30KKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIKK30KKworIyBmdW5jX2Vycm9yIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgorZnVuY19lcnJvciAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9IiR7MSsiJEAifSAxPiYyCit9CisKKyMgZnVuY193YXJuaW5nIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCitmdW5jX3dhcm5pbmcgKCkKK3sKKyAgICAkb3B0X3dhcm5pbmcgJiYgJEVDSE8gIiRwcm9nbmFtZTogJHtvcHRfbW9kZSskb3B0X21vZGU6IH13YXJuaW5nOiAiJHsxKyIkQCJ9IDE+JjIKKworICAgICMgYmFzaCBidWcgYWdhaW46CisgICAgOgorfQorCisjIGZ1bmNfZmF0YWxfZXJyb3IgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGFuZCBleGl0LgorZnVuY19mYXRhbF9lcnJvciAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCit9CisKKyMgZnVuY19mYXRhbF9oZWxwIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQorIyBhIGhlbHAgaGludCwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2hlbHAgKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGZ1bmNfZmF0YWxfZXJyb3IgIiRoZWxwIgorfQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAgIyMgZGVmYXVsdAorCisKKyMgZnVuY19ncmVwIGV4cHJlc3Npb24gZmlsZW5hbWUKKyMgQ2hlY2sgd2hldGhlciBFWFBSRVNTSU9OIG1hdGNoZXMgYW55IGxpbmUgb2YgRklMRU5BTUUsIHdpdGhvdXQgb3V0cHV0LgorZnVuY19ncmVwICgpCit7CisgICAgJEdSRVAgIiQxIiAiJDIiID4vZGV2L251bGwgMj4mMQorfQorCisKKyMgZnVuY19ta2Rpcl9wIGRpcmVjdG9yeS1wYXRoCisjIE1ha2Ugc3VyZSB0aGUgZW50aXJlIHBhdGggdG8gRElSRUNUT1JZLVBBVEggaXMgYXZhaWxhYmxlLgorZnVuY19ta2Rpcl9wICgpCit7CisgICAgbXlfZGlyZWN0b3J5X3BhdGg9IiQxIgorICAgIG15X2Rpcl9saXN0PQorCisgICAgaWYgdGVzdCAtbiAiJG15X2RpcmVjdG9yeV9wYXRoIiAmJiB0ZXN0ICIkb3B0X2RyeV9ydW4iICE9ICI6IjsgdGhlbgorCisgICAgICAjIFByb3RlY3QgZGlyZWN0b3J5IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nCisgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbgorICAgICAgICAtKikgbXlfZGlyZWN0b3J5X3BhdGg9Ii4vJG15X2RpcmVjdG9yeV9wYXRoIiA7OworICAgICAgZXNhYworCisgICAgICAjIFdoaWxlIHNvbWUgcG9ydGlvbiBvZiBESVIgZG9lcyBub3QgeWV0IGV4aXN0Li4uCisgICAgICB3aGlsZSB0ZXN0ICEgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCI7IGRvCisgICAgICAgICMgLi4ubWFrZSBhIGxpc3QgaW4gdG9wbW9zdCBmaXJzdCBvcmRlci4gIFVzZSBhIGNvbG9uIGRlbGltaXRlZAorCSMgbGlzdCBpbmNhc2Ugc29tZSBwb3J0aW9uIG9mIHBhdGggY29udGFpbnMgd2hpdGVzcGFjZS4KKyAgICAgICAgbXlfZGlyX2xpc3Q9IiRteV9kaXJlY3RvcnlfcGF0aDokbXlfZGlyX2xpc3QiCisKKyAgICAgICAgIyBJZiB0aGUgbGFzdCBwb3J0aW9uIGFkZGVkIGhhcyBubyBzbGFzaCBpbiBpdCwgdGhlIGxpc3QgaXMgZG9uZQorICAgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbiAqLyopIDs7ICopIGJyZWFrIDs7IGVzYWMKKworICAgICAgICAjIC4uLm90aGVyd2lzZSB0aHJvdyBhd2F5IHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kIGxvb3AKKyAgICAgICAgbXlfZGlyZWN0b3J5X3BhdGg9YCRFQ0hPICIkbXlfZGlyZWN0b3J5X3BhdGgiIHwgJFNFRCAtZSAiJGRpcm5hbWUiYAorICAgICAgZG9uZQorICAgICAgbXlfZGlyX2xpc3Q9YCRFQ0hPICIkbXlfZGlyX2xpc3QiIHwgJFNFRCAncyw6KiQsLCdgCisKKyAgICAgIHNhdmVfbWtkaXJfcF9JRlM9IiRJRlMiOyBJRlM9JzonCisgICAgICBmb3IgbXlfZGlyIGluICRteV9kaXJfbGlzdDsgZG8KKwlJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgorICAgICAgICAjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaWYgdHdvIHByb2Nlc3NlcworICAgICAgICAjIHRyeSB0byBjcmVhdGUgb25lIG9mIHRoZSBkaXJlY3RvcmllcyBjb25jdXJyZW50bHkuICBEb24ndAorICAgICAgICAjIHN0b3AgaW4gdGhhdCBjYXNlIQorICAgICAgICAkTUtESVIgIiRteV9kaXIiIDI+L2Rldi9udWxsIHx8IDoKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCisKKyAgICAgICMgQmFpbCBvdXQgaWYgd2UgKG9yIHNvbWUgb3RoZXIgcHJvY2VzcykgZmFpbGVkIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgICAgIHRlc3QgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCIgfHwgXAorICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYWlsZWQgdG8gY3JlYXRlIFxgJDEnIgorICAgIGZpCit9CisKKworIyBmdW5jX21rdGVtcGRpciBbc3RyaW5nXQorIyBNYWtlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdvbid0IGNsYXNoIHdpdGggb3RoZXIgcnVubmluZworIyBsaWJ0b29sIHByb2Nlc3NlcywgYW5kIGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgaWYgcG9zc2libGUuICBJZgorIyBnaXZlbiwgU1RSSU5HIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhhdCBkaXJlY3RvcnkuCitmdW5jX21rdGVtcGRpciAoKQoreworICAgIG15X3RlbXBsYXRlPSIke1RNUERJUi0vdG1wfS8kezEtJHByb2duYW1lfSIKKworICAgIGlmIHRlc3QgIiRvcHRfZHJ5X3J1biIgPSAiOiI7IHRoZW4KKyAgICAgICMgUmV0dXJuIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCBkb24ndCBjcmVhdGUgaXQgaW4gZHJ5LXJ1biBtb2RlCisgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSQkIgorICAgIGVsc2UKKworICAgICAgIyBJZiBta3RlbXAgd29ya3MsIHVzZSB0aGF0IGZpcnN0IGFuZCBmb3JlbW9zdAorICAgICAgbXlfdG1wZGlyPWBta3RlbXAgLWQgIiR7bXlfdGVtcGxhdGV9LVhYWFhYWFhYIiAyPi9kZXYvbnVsbGAKKworICAgICAgaWYgdGVzdCAhIC1kICIkbXlfdG1wZGlyIjsgdGhlbgorICAgICAgICAjIEZhaWxpbmcgdGhhdCwgYXQgbGVhc3QgdHJ5IGFuZCB1c2UgJFJBTkRPTSB0byBhdm9pZCBhIHJhY2UKKyAgICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0ke1JBTkRPTS0wfSQkIgorCisgICAgICAgIHNhdmVfbWt0ZW1wZGlyX3VtYXNrPWB1bWFza2AKKyAgICAgICAgdW1hc2sgMDA3NworICAgICAgICAkTUtESVIgIiRteV90bXBkaXIiCisgICAgICAgIHVtYXNrICRzYXZlX21rdGVtcGRpcl91bWFzaworICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gZHJ5LXJ1biBtb2RlLCBib21iIG91dCBvbiBmYWlsdXJlCisgICAgICB0ZXN0IC1kICIkbXlfdG1wZGlyIiB8fCBcCisgICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIgorICAgIGZpCisKKyAgICAkRUNITyAiJG15X3RtcGRpciIKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V2YWwgYXJnCisjIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlci4KKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXM6IEZVTkNfUVVPVEVfRk9SX0VWQUxfUkVTVUxUCisjIGlzIGRvdWJsZS1xdW90ZWQsIHN1aXRhYmxlIGZvciBhIHN1YnNlcXVlbnQgZXZhbCwgd2hlcmVhcworIyBGVU5DX1FVT1RFX0ZPUl9FVkFMX1VOUVVPVEVEX1JFU1VMVCBoYXMgbWVyZWx5IGFsbCBjaGFyYWN0ZXJzCisjIHdoaWNoIGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZSBxdW90ZXMgYmFja3NsYXNoaWZpZWQuCitmdW5jX3F1b3RlX2Zvcl9ldmFsICgpCit7CisgICAgY2FzZSAkMSBpbgorICAgICAgKltcXFxgXCJcJF0qKQorCWZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PWAkRUNITyAiJDEiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD0iJDEiIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQorICAgICAgIyB3b3JkIHNwbGl0dGluZywgY29tbWFuZCBzdWJzdGl0dXRpb24gYW5kIGFuZCB2YXJpYWJsZQorICAgICAgIyBleHBhbnNpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IlwiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0XCIiCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IgorICAgIGVzYWMKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCBhcmcKKyMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyOyBzYW1lIGFzIGFib3ZlLAorIyBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitmdW5jX3F1b3RlX2Zvcl9leHBhbmQgKCkKK3sKKyAgICBjYXNlICQxIGluCisgICAgICAqW1xcXGBcIl0qKQorCW15X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgXAorCSAgICAtZSAiJGRvdWJsZV9xdW90ZV9zdWJzdCIgLWUgIiRzZWRfZG91YmxlX2JhY2tzbGFzaCJgIDs7CisgICAgICAqKQorICAgICAgICBteV9hcmc9IiQxIiA7OworICAgIGVzYWMKKworICAgIGNhc2UgJG15X2FyZyBpbgorICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5CisgICAgICAjIHdvcmQgc3BsaXR0aW5nIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgICBteV9hcmc9IlwiJG15X2FyZ1wiIgorICAgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQ9IiRteV9hcmciCit9CisKKworIyBmdW5jX3Nob3dfZXZhbCBjbWQgW2ZhaWxfZXhwXQorIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCisjIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAorIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4KK2Z1bmNfc2hvd19ldmFsICgpCit7CisgICAgbXlfY21kPSIkMSIKKyAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgorCisgICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7CisgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCisgICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisgICAgfQorCisgICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQorICAgICAgZXZhbCAiJG15X2NtZCIKKyAgICAgIG15X3N0YXR1cz0kPworICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQorCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCisgICAgICBmaQorICAgIGZpCit9CisKKworIyBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgY21kIFtmYWlsX2V4cF0KKyMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcworIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKKyMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuICBVc2UgdGhlIHNhdmVkIGxvY2FsZSBmb3IgZXZhbHVhdGlvbi4KK2Z1bmNfc2hvd19ldmFsX2xvY2FsZSAoKQoreworICAgIG15X2NtZD0iJDEiCisgICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKKworICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgeworICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgorICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorICAgIH0KKworICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKKyAgICAgIGV2YWwgIiRsdF91c2VyX2xvY2FsZQorCSAgICAkbXlfY21kIgorICAgICAgbXlfc3RhdHVzPSQ/CisgICAgICBldmFsICIkbHRfc2FmZV9sb2NhbGUiCisgICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCisJZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKKyAgICAgIGZpCisgICAgZmkKK30KKworIyBmdW5jX3RyX3NoCisjIFR1cm4gJDEgaW50byBhIHN0cmluZyBzdWl0YWJsZSBmb3IgYSBzaGVsbCB2YXJpYWJsZSBuYW1lLgorIyBSZXN1bHQgaXMgc3RvcmVkIGluICRmdW5jX3RyX3NoX3Jlc3VsdC4gIEFsbCBjaGFyYWN0ZXJzCisjIG5vdCBpbiB0aGUgc2V0IGEtekEtWjAtOV8gYXJlIHJlcGxhY2VkIHdpdGggJ18nLiBGdXJ0aGVyLAorIyBpZiAkMSBiZWdpbnMgd2l0aCBhIGRpZ2l0LCBhICdfJyBpcyBwcmVwZW5kZWQgYXMgd2VsbC4KK2Z1bmNfdHJfc2ggKCkKK3sKKyAgY2FzZSAkMSBpbgorICBbMC05XSogfCAqWyFhLXpBLVowLTlfXSopCisgICAgZnVuY190cl9zaF9yZXN1bHQ9YCRFQ0hPICIkMSIgfCAkU0VEICdzL15cKFswLTldXCkvX1wxLzsgcy9bXmEtekEtWjAtOV9dL18vZydgCisgICAgOzsKKyAgKiApCisgICAgZnVuY190cl9zaF9yZXN1bHQ9JDEKKyAgICA7OworICBlc2FjCit9CisKKworIyBmdW5jX3ZlcnNpb24KKyMgRWNobyB2ZXJzaW9uIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorZnVuY192ZXJzaW9uICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgJFNFRCAtbiAnLyhDKS8hYiBnbworCTptb3JlCisJL1wuLyF7CisJICBOCisJICBzL1xuIyAvIC8KKwkgIGIgbW9yZQorCX0KKwk6Z28KKwkvXiMgJyRQUk9HUkFNJyAoR05VIC8sLyMgd2FycmFudHk7IC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisgICAgICAgIHMvXCgoQylcKVsgMC05LC1dKlwoIFsxLTldWzAtOV0qXCkvXDFcMi8KKyAgICAgICAgcAorICAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgIGV4aXQgJD8KK30KKworIyBmdW5jX3VzYWdlCisjIEVjaG8gc2hvcnQgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfdXNhZ2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvXiMgICouKi0taGVscC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisJcy9cJHByb2duYW1lLyckcHJvZ25hbWUnLworCXAKKyAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgZWNobworICAgICRFQ0hPICJydW4gXGAkcHJvZ25hbWUgLS1oZWxwIHwgbW9yZScgZm9yIGZ1bGwgdXNhZ2UiCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfaGVscCBbTk9FWElUXQorIyBFY2hvIGxvbmcgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdCwKKyMgdW5sZXNzICdub2V4aXQnIGlzIHBhc3NlZCBhcyBhcmd1bWVudC4KK2Z1bmNfaGVscCAoKQoreworICAgICRvcHRfZGVidWcKKworICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIFJlcG9ydCBidWdzIHRvLyB7CisJOnByaW50CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKwlzKlwkcHJvZ25hbWUqJyRwcm9nbmFtZScqCisJcypcJGhvc3QqJyIkaG9zdCInKgorCXMqXCRTSEVMTConIiRTSEVMTCInKgorCXMqXCRMVENDKiciJExUQ0MiJyoKKwlzKlwkTFRDRkxBR1MqJyIkTFRDRkxBR1MiJyoKKwlzKlwkTEQqJyIkTEQiJyoKKwlzL1wkd2l0aF9nbnVfbGQvJyIkd2l0aF9nbnVfbGQiJy8KKwlzL1wkYXV0b21ha2VfdmVyc2lvbi8nImAoJHtBVVRPTUFLRS1hdXRvbWFrZX0gLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlzL1wkYXV0b2NvbmZfdmVyc2lvbi8nImAoJHtBVVRPQ09ORi1hdXRvY29uZn0gLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlwCisJZAorICAgICB9CisgICAgIC9eIyAuKiBob21lIHBhZ2U6L2IgcHJpbnQKKyAgICAgL14jIEdlbmVyYWwgaGVscCB1c2luZy9iIHByaW50CisgICAgICcgPCAiJHByb2dwYXRoIgorICAgIHJldD0kPworICAgIGlmIHRlc3QgLXogIiQxIjsgdGhlbgorICAgICAgZXhpdCAkcmV0CisgICAgZmkKK30KKworIyBmdW5jX21pc3NpbmdfYXJnIGFyZ25hbWUKKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciBhbmQgc2V0IGdsb2JhbAorIyBleGl0X2NtZC4KK2Z1bmNfbWlzc2luZ19hcmcgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICBmdW5jX2Vycm9yICJtaXNzaW5nIGFyZ3VtZW50IGZvciAkMS4iCisgICAgZXhpdF9jbWQ9ZXhpdAorfQorCisKKyMgZnVuY19zcGxpdF9zaG9ydF9vcHQgc2hvcnRvcHQKKyMgU2V0IGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWUgYW5kIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyBzaGVsbAorIyB2YXJpYWJsZXMgYWZ0ZXIgc3BsaXR0aW5nIFNIT1JUT1BUIGFmdGVyIHRoZSAybmQgY2hhcmFjdGVyLgorZnVuY19zcGxpdF9zaG9ydF9vcHQgKCkKK3sKKyAgICBteV9zZWRfc2hvcnRfb3B0PScxcy9eXCguLlwpLiokL1wxLztxJworICAgIG15X3NlZF9zaG9ydF9yZXN0PScxcy9eLi5cKC4qXCkkL1wxLztxJworCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZT1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfc2hvcnRfb3B0ImAKKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmc9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX3Nob3J0X3Jlc3QiYAorfSAjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19zcGxpdF9sb25nX29wdCBsb25nb3B0CisjIFNldCBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWUgYW5kIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnIHNoZWxsCisjIHZhcmlhYmxlcyBhZnRlciBzcGxpdHRpbmcgTE9OR09QVCBhdCB0aGUgYD0nIHNpZ24uCitmdW5jX3NwbGl0X2xvbmdfb3B0ICgpCit7CisgICAgbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtLVtePV0qXCk9LiovXDEvO3EnCisgICAgbXlfc2VkX2xvbmdfYXJnPScxcy9eLS1bXj1dKj0vLycKKworICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZT1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfbG9uZ19vcHQiYAorICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9sb25nX2FyZyJgCit9ICMgZnVuY19zcGxpdF9sb25nX29wdCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworZXhpdF9jbWQ9OgorCisKKworCisKK21hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKK21hZ2ljX2V4ZT0iJSUlTUFHSUMgRVhFIHZhcmlhYmxlJSUlIgorCisjIEdsb2JhbCB2YXJpYWJsZXMuCitub25vcHQ9CitwcmVzZXJ2ZV9hcmdzPQorbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgorbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgorZXh0cmFjdGVkX2FyY2hpdmVzPQorZXh0cmFjdGVkX3NlcmlhbD0wCisKKyMgSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgaW4gYW55IG9mIHRoZSBhY3Rpb25zLCB0aGUgY29tbWFuZCBpbiBpdAorIyB3aWxsIGJlIGV4ZWNlZCBhdCB0aGUgZW5kLiAgVGhpcyBwcmV2ZW50cyBoZXJlLWRvY3VtZW50cyBmcm9tIGJlaW5nCisjIGxlZnQgb3ZlciBieSBzaGVsbHMuCitleGVjX2NtZD0KKworIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKKyMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgorZnVuY19hcHBlbmQgKCkKK3sKKyAgICBldmFsICIkezF9PVwkJHsxfVwkezJ9IgorfSAjIGZ1bmNfYXBwZW5kIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisjIGZ1bmNfYXBwZW5kX3F1b3RlZCB2YXIgdmFsdWUKKyMgUXVvdGUgVkFMVUUgYW5kIGFwcGVuZCB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUiwgc2VwYXJhdGVkCisjIGJ5IGEgc3BhY2UuCitmdW5jX2FwcGVuZF9xdW90ZWQgKCkKK3sKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IgorICAgIGV2YWwgIiR7MX09XCQkezF9XFwgXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKK30gIyBmdW5jX2FwcGVuZF9xdW90ZWQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgorZnVuY19hcml0aCAoKQoreworICAgIGZ1bmNfYXJpdGhfcmVzdWx0PWBleHByICIke0B9ImAKK30gIyBmdW5jX2FyaXRoIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19sZW4gc3RyaW5nCisjIFNUUklORyBtYXkgbm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uCitmdW5jX2xlbiAoKQoreworICAgIGZ1bmNfbGVuX3Jlc3VsdD1gZXhwciAiJHsxfSIgOiAiLioiIDI+L2Rldi9udWxsIHx8IGVjaG8gJG1heF9jbWRfbGVuYAorfSAjIGZ1bmNfbGVuIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19sbzJvIG9iamVjdAorZnVuY19sbzJvICgpCit7CisgICAgZnVuY19sbzJvX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGxvMm8iYAorfSAjIGZ1bmNfbG8ybyBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQorZnVuY194Zm9ybSAoKQoreworICAgIGZ1bmNfeGZvcm1fcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICdzL1wuW14uXSokLy5sby8nYAorfSAjIGZ1bmNfeGZvcm0gbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGZvbGxvd2VkIGJ5CisjIGEgY29uZmlndXJhdGlvbiBmYWlsdXJlIGhpbnQsIGFuZCBleGl0LgorZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBmdW5jX2Vycm9yICJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorICAgIGZ1bmNfZmF0YWxfZXJyb3IgIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuIgorfQorCisKKyMgZnVuY19jb25maWcKKyMgRGlzcGxheSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWxsIHRoZSB0YWdzIGluIHRoaXMgc2NyaXB0LgorZnVuY19jb25maWcgKCkKK3sKKyAgICByZV9iZWdpbmNmPSdeIyAjIyMgQkVHSU4gTElCVE9PTCcKKyAgICByZV9lbmRjZj0nXiMgIyMjIEVORCBMSUJUT09MJworCisgICAgIyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgICAgJFNFRCAiMSwvJHJlX2JlZ2luY2YgQ09ORklHL2Q7LyRyZV9lbmRjZiBDT05GSUcvLFwkZCIgPCAiJHByb2dwYXRoIgorCisgICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KKyAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KKyAgICAgICRTRUQgLW4gIi8kcmVfYmVnaW5jZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkLywvJHJlX2VuZGNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvcCIgPCAiJHByb2dwYXRoIgorICAgIGRvbmUKKworICAgIGV4aXQgJD8KK30KKworIyBmdW5jX2ZlYXR1cmVzCisjIERpc3BsYXkgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KK2Z1bmNfZmVhdHVyZXMgKCkKK3sKKyAgICBlY2hvICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGZpCisKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19lbmFibGVfdGFnIHRhZ25hbWUKKyMgVmVyaWZ5IHRoYXQgVEFHTkFNRSBpcyB2YWxpZCwgYW5kIGVpdGhlciBmbGFnIGFuIGVycm9yIGFuZCBleGl0LCBvcgorIyBlbmFibGUgdGhlIFRBR05BTUUgdGFnLiAgV2UgYWxzbyBhZGQgVEFHTkFNRSB0byB0aGUgZ2xvYmFsICR0YWdsaXN0CisjIHZhcmlhYmxlIGhlcmUuCitmdW5jX2VuYWJsZV90YWcgKCkKK3sKKyAgIyBHbG9iYWwgdmFyaWFibGU6CisgIHRhZ25hbWU9IiQxIgorCisgIHJlX2JlZ2luY2Y9Il4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHJlX2VuZGNmPSJeIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVcJCIKKyAgc2VkX2V4dHJhY3RjZj0iLyRyZV9iZWdpbmNmLywvJHJlX2VuZGNmL3AiCisKKyAgIyBWYWxpZGF0ZSB0YWduYW1lLgorICBjYXNlICR0YWduYW1lIGluCisgICAgKlshLV9BLVphLXowLTksL10qKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiCisgICAgICA7OworICBlc2FjCisKKyAgIyBEb24ndCB0ZXN0IGZvciB0aGUgImRlZmF1bHQiIEMgdGFnLCBhcyB3ZSBrbm93IGl0J3MKKyAgIyB0aGVyZSBidXQgbm90IHNwZWNpYWxseSBtYXJrZWQuCisgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICBDQykgOzsKKyAgICAqKQorICAgICAgaWYgJEdSRVAgIiRyZV9iZWdpbmNmIiAiJHByb2dwYXRoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwl0YWdsaXN0PSIkdGFnbGlzdCAkdGFnbmFtZSIKKworCSMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uICBCZSBjYXJlZnVsIHRvIHF1b3RlIHRoZSBwYXRoCisJIyBhbmQgdGhlIHNlZCBzY3JpcHQsIHRvIGF2b2lkIHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlLCBidXQKKwkjIGFsc28gZG9uJ3QgdXNlIG5vbi1wb3J0YWJsZSBxdW90ZXMgd2l0aGluIGJhY2txdW90ZXMgd2l0aGluCisJIyBxdW90ZXMgd2UgaGF2ZSB0byBkbyBpdCBpbiAyIHN0ZXBzOgorCWV4dHJhY3RlZGNmPWAkU0VEIC1uIC1lICIkc2VkX2V4dHJhY3RjZiIgPCAiJHByb2dwYXRoImAKKwlldmFsICIkZXh0cmFjdGVkY2YiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAiaWdub3JpbmcgdW5rbm93biB0YWcgJHRhZ25hbWUiCisgICAgICBmaQorICAgICAgOzsKKyAgZXNhYworfQorCisjIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorIyBFbnN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgbTQgbWFjcm9zLCBhbmQgbGlidG9vbCBzY3JpcHQgZnJvbSB0aGUgc2FtZQorIyByZWxlYXNlIG9mIGxpYnRvb2wuCitmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2ggKCkKK3sKKyAgaWYgdGVzdCAiJHBhY2thZ2VfcmV2aXNpb24iICE9ICIkbWFjcm9fcmV2aXNpb24iOyB0aGVuCisgICAgaWYgdGVzdCAiJFZFUlNJT04iICE9ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRtYWNyb192ZXJzaW9uIjsgdGhlbgorICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQorJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIGFuIG9sZGVyIHJlbGVhc2UuCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBlbHNlCisgICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCiskcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gJFBBQ0tBR0UgJG1hY3JvX3ZlcnNpb24uCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbiwKKyRwcm9nbmFtZTogYnV0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIHJldmlzaW9uICRtYWNyb19yZXZpc2lvbi4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24KKyRwcm9nbmFtZTogb2YgJFBBQ0tBR0UgJFZFUlNJT04gYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICBmaQorCisgICAgZXhpdCAkRVhJVF9NSVNNQVRDSAorICBmaQorfQorCisKKyMgU2hvcnRoYW5kIGZvciAtLW1vZGU9Zm9vLCBvbmx5IHZhbGlkIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorY2FzZSAkMSBpbgorY2xlYW58Y2xlYXxjbGV8Y2wpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNsZWFuICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2NvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNvbXBpbGUgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZXhlY3V0ZSAkezErIiRAIn07IHNoaWZ0CisgIDs7CitmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2luc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworbGlua3xsaW58bGl8bCkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgbGluayAkezErIiRAIn07IHNoaWZ0CisgIDs7Cit1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgdW5pbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2VzYWMKKworCisKKyMgT3B0aW9uIGRlZmF1bHRzOgorb3B0X2RlYnVnPToKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfY29uZmlnPWZhbHNlCitvcHRfcHJlc2VydmVfZHVwX2RlcHM9ZmFsc2UKK29wdF9mZWF0dXJlcz1mYWxzZQorb3B0X2ZpbmlzaD1mYWxzZQorb3B0X2hlbHA9ZmFsc2UKK29wdF9oZWxwX2FsbD1mYWxzZQorb3B0X3NpbGVudD06CitvcHRfd2FybmluZz06CitvcHRfdmVyYm9zZT06CitvcHRfc2lsZW50PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorCisKKyMgUGFyc2Ugb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5LiAgVGhpcyBjb21lcyBhcyBzb29uIGFzIHBvc3NpYmxlIGluIHRoZQorIyBzY3JpcHQgdG8gbWFrZSB0aGluZ3MgbGlrZSBgLS12ZXJzaW9uJyBoYXBwZW4gYXMgcXVpY2tseSBhcyB3ZSBjYW4uCit7CisgICMgdGhpcyBqdXN0IGVhc2VzIGV4aXQgaGFuZGxpbmcKKyAgd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgICBvcHQ9IiQxIgorICAgIHNoaWZ0CisgICAgY2FzZSAkb3B0IGluCisgICAgICAtLWRlYnVnfC14KQlvcHRfZGVidWc9J3NldCAteCcKKwkJCWZ1bmNfZWNobyAiZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKwkJCSRvcHRfZGVidWcKKwkJCTs7CisgICAgICAtLWRyeS1ydW58LS1kcnlydW58LW4pCisJCQlvcHRfZHJ5X3J1bj06CisJCQk7OworICAgICAgLS1jb25maWcpCisJCQlvcHRfY29uZmlnPToKK2Z1bmNfY29uZmlnCisJCQk7OworICAgICAgLS1kbG9wZW58LWRsb3BlbikKKwkJCW9wdGFyZz0iJDEiCisJCQlvcHRfZGxvcGVuPSIke29wdF9kbG9wZW4rJG9wdF9kbG9wZW4KK30kb3B0YXJnIgorCQkJc2hpZnQKKwkJCTs7CisgICAgICAtLXByZXNlcnZlLWR1cC1kZXBzKQorCQkJb3B0X3ByZXNlcnZlX2R1cF9kZXBzPToKKwkJCTs7CisgICAgICAtLWZlYXR1cmVzKQorCQkJb3B0X2ZlYXR1cmVzPToKK2Z1bmNfZmVhdHVyZXMKKwkJCTs7CisgICAgICAtLWZpbmlzaCkKKwkJCW9wdF9maW5pc2g9Ogorc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAorCQkJOzsKKyAgICAgIC0taGVscCkKKwkJCW9wdF9oZWxwPToKKwkJCTs7CisgICAgICAtLWhlbHAtYWxsKQorCQkJb3B0X2hlbHBfYWxsPToKK29wdF9oZWxwPSc6IGhlbHAtYWxsJworCQkJOzsKKyAgICAgIC0tbW9kZSkKKwkJCXRlc3QgJCMgPSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgJG9wdCAmJiBicmVhaworCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF9tb2RlPSIkb3B0YXJnIgorY2FzZSAkb3B0YXJnIGluCisgICMgVmFsaWQgbW9kZSBhcmd1bWVudHM6CisgIGNsZWFufGNvbXBpbGV8ZXhlY3V0ZXxmaW5pc2h8aW5zdGFsbHxsaW5rfHJlbGlua3x1bmluc3RhbGwpIDs7CisKKyAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCisgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCisgICAgIGV4aXRfY21kPWV4aXQKKyAgICAgYnJlYWsKKyAgICAgOzsKK2VzYWMKKwkJCXNoaWZ0CisJCQk7OworICAgICAgLS1uby1zaWxlbnR8LS1uby1xdWlldCkKKwkJCW9wdF9zaWxlbnQ9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tbm8td2FybmluZ3wtLW5vLXdhcm4pCisJCQlvcHRfd2FybmluZz1mYWxzZQorZnVuY19hcHBlbmQgcHJlc2VydmVfYXJncyAiICRvcHQiCisJCQk7OworICAgICAgLS1uby12ZXJib3NlKQorCQkJb3B0X3ZlcmJvc2U9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tc2lsZW50fC0tcXVpZXQpCisJCQlvcHRfc2lsZW50PToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorICAgICAgICBvcHRfdmVyYm9zZT1mYWxzZQorCQkJOzsKKyAgICAgIC0tdmVyYm9zZXwtdikKKwkJCW9wdF92ZXJib3NlPToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0Igorb3B0X3NpbGVudD1mYWxzZQorCQkJOzsKKyAgICAgIC0tdGFnKQorCQkJdGVzdCAkIyA9IDAgJiYgZnVuY19taXNzaW5nX2FyZyAkb3B0ICYmIGJyZWFrCisJCQlvcHRhcmc9IiQxIgorCQkJb3B0X3RhZz0iJG9wdGFyZyIKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0ICRvcHRhcmciCitmdW5jX2VuYWJsZV90YWcgIiRvcHRhcmciCisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLVw/fC1oKQkJZnVuY191c2FnZQkJCQk7OworICAgICAgLS1oZWxwKQkJZnVuY19oZWxwCQkJCTs7CisgICAgICAtLXZlcnNpb24pCWZ1bmNfdmVyc2lvbgkJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG9wdGFyZ3MgdG8gbG9uZyBvcHRpb25zOgorICAgICAgLS0qPSopCisJCQlmdW5jX3NwbGl0X2xvbmdfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9sb25nX29wdF9uYW1lIiAiJGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG5vbi1hcmd1bWVudCBzaG9ydCBvcHRpb25zOgorICAgICAgLVw/KnwtaCp8LW4qfC12KikKKwkJCWZ1bmNfc3BsaXRfc2hvcnRfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZSIgIi0kZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAtLSkJCWJyZWFrCQkJCQk7OworICAgICAgLSopCQlmdW5jX2ZhdGFsX2hlbHAgInVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0JyIgOzsKKyAgICAgICopCQlzZXQgZHVtbXkgIiRvcHQiICR7MSsiJEAifTsJc2hpZnQ7IGJyZWFrICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgVmFsaWRhdGUgb3B0aW9uczoKKworICAjIHNhdmUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudAorICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKyAgICBub25vcHQ9IiRvcHQiCisgICAgc2hpZnQKKyAgZmkKKworICAjIHByZXNlcnZlIC0tZGVidWcKKyAgdGVzdCAiJG9wdF9kZWJ1ZyIgPSA6IHx8IGZ1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAtLWRlYnVnIgorCisgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiogfCAqY2VnY2MqKQorICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9OgorICAgICAgOzsKKyAgICAqKQorICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kb3B0X3ByZXNlcnZlX2R1cF9kZXBzCisgICAgICA7OworICBlc2FjCisKKyAgJG9wdF9oZWxwIHx8IHsKKyAgICAjIFNhbml0eSBjaGVja3MgZmlyc3Q6CisgICAgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAibm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIKKyAgICBmaQorCisgICAgIyBEYXJ3aW4gc3Vja3MKKyAgICBldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCisgICAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgICBpZiB0ZXN0IC1uICIkb3B0X2Rsb3BlbiIgJiYgdGVzdCAiJG9wdF9tb2RlIiAhPSBleGVjdXRlOyB0aGVuCisgICAgICBmdW5jX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciCisgICAgICAkRUNITyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgICAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgICBoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT0kb3B0X21vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgfQorCisKKyAgIyBCYWlsIGlmIHRoZSBvcHRpb25zIHdlcmUgc2NyZXdlZAorICAkZXhpdF9jbWQgJEVYSVRfRkFJTFVSRQorfQorCisKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgICAgTWFpbi4gICAgIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKKyMgZnVuY19sYWxpYl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgYC5sYScgbGlicmFyeSBvciBgLmxvJyBvYmplY3QgZmlsZS4KKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2xhbGliX3AgKCkKK3sKKyAgICB0ZXN0IC1mICIkMSIgJiYKKyAgICAgICRTRUQgLWUgNHEgIiQxIiAyPi9kZXYvbnVsbCBcCisgICAgICAgIHwgJEdSRVAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIiA+IC9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sYWxpYl91bnNhZmVfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2FtZSBjaGVjayBhcyBmdW5jX2xhbGliX3Agd2l0aG91dAorIyByZXNvcnRpbmcgdG8gZXh0ZXJuYWwgcHJvZ3JhbXMuICBUbyB0aGlzIGVuZCwgaXQgcmVkaXJlY3RzIHN0ZGluIGFuZAorIyBjbG9zZXMgaXQgYWZ0ZXJ3YXJkcywgd2l0aG91dCBzYXZpbmcgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvci4KKyMgQXMgYSBzYWZldHkgbWVhc3VyZSwgdXNlIGl0IG9ubHkgd2hlcmUgYSBuZWdhdGl2ZSByZXN1bHQgd291bGQgYmUKKyMgZmF0YWwgYW55d2F5LiAgV29ya3MgaWYgYGZpbGUnIGRvZXMgbm90IGV4aXN0LgorZnVuY19sYWxpYl91bnNhZmVfcCAoKQoreworICAgIGxhbGliX3A9bm8KKyAgICBpZiB0ZXN0IC1mICIkMSIgJiYgdGVzdCAtciAiJDEiICYmIGV4ZWMgNTwmMCA8IiQxIjsgdGhlbgorCWZvciBsYWxpYl9wX2wgaW4gMSAyIDMgNAorCWRvCisJICAgIHJlYWQgbGFsaWJfcF9saW5lCisJICAgIGNhc2UgIiRsYWxpYl9wX2xpbmUiIGluCisJCVwjXCBHZW5lcmF0ZWRcIGJ5XCAqJFBBQ0tBR0UqICkgbGFsaWJfcD15ZXM7IGJyZWFrOzsKKwkgICAgZXNhYworCWRvbmUKKwlleGVjIDA8JjUgNTwmLQorICAgIGZpCisgICAgdGVzdCAiJGxhbGliX3AiID0geWVzCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdAorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICgpCit7CisgICAgZnVuY19sYWxpYl9wICIkMSIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0KKyAgICBjYXNlICQxIGluCisgICAgKi5leGUpIDs7CisgICAgKikgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9LmV4ZSA7OworICAgIGVzYWMKKyAgICAkR1JFUCAiJG1hZ2ljX2V4ZSIgIiQxJGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4IiA+L2Rldi9udWxsIDI+JjEKK30KKworIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lIGZpbGUKKyMgQXNzdW1lcyBmaWxlIGlzIGFuIGx0d3JhcHBlcl9leGVjdXRhYmxlCisjIHVzZXMgJGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBmb3IgYQorIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKK3sKKyAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkMSIgIiIgIi4iCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0LyRvYmpkaXIvJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9X2x0c2h3cmFwcGVyIgorfQorCisjIGZ1bmNfbHR3cmFwcGVyX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvciB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiQxIiB8fCBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIgorfQorCisKKyMgZnVuY19leGVjdXRlX2NtZHMgY29tbWFuZHMgZmFpbF9jbWQKKyMgRXhlY3V0ZSB0aWxkZS1kZWxpbWl0ZWQgQ09NTUFORFMuCisjIElmIEZBSUxfQ01EIGlzIGdpdmVuLCBldmFsIHRoYXQgdXBvbiBmYWlsdXJlLgorIyBGQUlMX0NNRCBtYXkgcmVhZC1hY2Nlc3MgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB2YXJpYWJsZSBDTUQhCitmdW5jX2V4ZWN1dGVfY21kcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBzYXZlX2lmcz0kSUZTOyBJRlM9J34nCisgICAgZm9yIGNtZCBpbiAkMTsgZG8KKyAgICAgIElGUz0kc2F2ZV9pZnMKKyAgICAgIGV2YWwgY21kPVwiJGNtZFwiCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGNtZCIgIiR7Mi06fSIKKyAgICBkb25lCisgICAgSUZTPSRzYXZlX2lmcworfQorCisKKyMgZnVuY19zb3VyY2UgZmlsZQorIyBTb3VyY2UgRklMRSwgYWRkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgaWYgbmVjZXNzYXJ5LgorIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisjIEZJTEUgZXZlbiBpZiBib3RoIEZJTEUgYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKyMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorZnVuY19zb3VyY2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkMSBpbgorICAgICovKiB8ICpcXCopCS4gIiQxIiA7OworICAgICopCQkuICIuLyQxIiA7OworICAgIGVzYWMKK30KKworCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290IFBBVEgKKyMgUmVwbGFjZSBhIGxlYWRpbmcgPSBpbiBQQVRIIHdpdGggYSBzeXNyb290LiAgU3RvcmUgdGhlIHJlc3VsdCBpbnRvCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorZnVuY19yZXNvbHZlX3N5c3Jvb3QgKCkKK3sKKyAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSQxCisgIGNhc2UgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCBpbgorICA9KikKKyAgICBmdW5jX3N0cmlwbmFtZSAnPScgJycgIiRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX3JlcGxhY2Vfc3lzcm9vdCBQQVRICisjIElmIFBBVEggYmVnaW5zIHdpdGggdGhlIHN5c3Jvb3QsIHJlcGxhY2UgaXQgd2l0aCA9IGFuZAorIyBzdG9yZSB0aGUgcmVzdWx0IGludG8gZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0LgorZnVuY19yZXBsYWNlX3N5c3Jvb3QgKCkKK3sKKyAgY2FzZSAiJGx0X3N5c3Jvb3Q6JDEiIGluCisgID8qOiIkbHRfc3lzcm9vdCIqKQorICAgIGZ1bmNfc3RyaXBuYW1lICIkbHRfc3lzcm9vdCIgJycgIiQxIgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0iPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisgICAgOzsKKyAgKikKKyAgICAjIEluY2x1ZGluZyBubyBzeXNyb290LgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0kMQorICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX2luZmVyX3RhZyBhcmcKKyMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAorIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyMgT25seSBhdHRlbXB0IHRoaXMgaWYgdGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUKKyMgY29tbWFuZCBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgorIyBhcmcgaXMgdXN1YWxseSBvZiB0aGUgZm9ybSAnZ2NjIC4uLicKK2Z1bmNfaW5mZXJfdGFnICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGlmIHRlc3QgLW4gIiRhdmFpbGFibGVfdGFncyIgJiYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBDQ19xdW90ZWQ9CisgICAgICBmb3IgYXJnIGluICRDQzsgZG8KKwlmdW5jX2FwcGVuZF9xdW90ZWQgQ0NfcXVvdGVkICIkYXJnIgorICAgICAgZG9uZQorICAgICAgQ0NfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDYAorICAgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCisgICAgICBjYXNlICRAIGluCisgICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAorICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCisgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiICRDQ19leHBhbmRlZCAiKiB8ICIkQ0NfZXhwYW5kZWQgIiogfCBcCisgICAgICAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiAkQ0NfcXVvdGVkX2V4cGFuZGVkICIqIHwgIiRDQ19xdW90ZWRfZXhwYW5kZWQgIiopIDs7CisgICAgICAjIEJsYW5rcyBhdCB0aGUgc3RhcnQgb2YgJGJhc2VfY29tcGlsZSB3aWxsIGNhdXNlIHRoaXMgdG8gZmFpbAorICAgICAgIyBpZiB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbSBhcyB3ZWxsLgorICAgICAgKikKKwlmb3IgeiBpbiAkYXZhaWxhYmxlX3RhZ3M7IGRvCisJICBpZiAkR1JFUCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHokIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCisJICAgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC9wJyA8ICRwcm9ncGF0aGAiCisJICAgIENDX3F1b3RlZD0KKwkgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorCSAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBDQ19xdW90ZWQgIiRhcmciCisJICAgIGRvbmUKKwkgICAgQ0NfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDYAorCSAgICBDQ19xdW90ZWRfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDX3F1b3RlZGAKKwkgICAgY2FzZSAiJEAgIiBpbgorCSAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiICRDQ19leHBhbmRlZCAiKiB8ICIkQ0NfZXhwYW5kZWQgIiogfCBcCisJICAgICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiICRDQ19xdW90ZWRfZXhwYW5kZWQgIiogfCAiJENDX3F1b3RlZF9leHBhbmRlZCAiKikKKwkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcworCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCisJICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KKwkgICAgICB0YWduYW1lPSR6CisJICAgICAgYnJlYWsKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCWRvbmUKKwkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgorCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKKwkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KKwlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKwkgIGZ1bmNfZWNobyAidW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCSAgZnVuY19mYXRhbF9lcnJvciAic3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIgorIwllbHNlCisjCSAgZnVuY192ZXJib3NlICJ1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZmkKK30KKworCisKKyMgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCBvdXRwdXRfbmFtZSBwaWNfbmFtZSBub25waWNfbmFtZQorIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKKyMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCitmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICgpCit7CisgICAgd3JpdGVfbGlib2JqPSR7MX0KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfbG9iaj1cJyR7Mn1cJworICAgIGVsc2UKKyAgICAgIHdyaXRlX2xvYmo9bm9uZQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICB3cml0ZV9vbGRvYmo9XCckezN9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9vbGRvYmo9bm9uZQorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgY2F0ID4ke3dyaXRlX2xpYm9ian1UIDw8RU9GCisjICR3cml0ZV9saWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgorcGljX29iamVjdD0kd3JpdGVfbG9iagorCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Citub25fcGljX29iamVjdD0kd3JpdGVfb2xkb2JqCisKK0VPRgorICAgICAgJE1WICIke3dyaXRlX2xpYm9ian1UIiAiJHt3cml0ZV9saWJvYmp9IgorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGSUxFIE5BTUUgQU5EIFBBVEggQ09OVkVSU0lPTiBIRUxQRVIgRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiBBUkcKKyMgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZmlsZSBuYW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsCisjIGFuZCAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEKKyMgY29ycmVjdGx5IGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0KKyMgaW4gJGJ1aWxkJ3MgJFBBVEguCisjCisjIEFSRyBpcyB0aGUgJGJ1aWxkIGZpbGUgbmFtZSB0byBiZSBjb252ZXJ0ZWQgdG8gdzMyIGZvcm1hdC4KKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiAkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQsIGFuZCB3aWxsCisjIGJlIGVtcHR5IG9uIGVycm9yIChvciB3aGVuIEFSRyBpcyBlbXB0eSkKK2Z1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgVW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lcyBub3QgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXJyb3IgY29kZSwgc28gd2UKKyAgICAjIGFyZSBmb3JjZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHN0ZG91dC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICMgY29tbWFuZCBpcyBub3QgZm91bmQsIHRoZSBzaGVsbCB3aWxsIHNldCBhbiBleGl0IGNvZGUgb2YgMTI3IGFuZCBwcmludAorICAgICMgKmFuIGVycm9yIG1lc3NhZ2UqIHRvIHN0ZG91dC4gU28gd2UgbXVzdCBjaGVjayBmb3IgYm90aCBlcnJvciBjb2RlIG9mCisgICAgIyB6ZXJvIEFORCBub24tZW1wdHkgc3Rkb3V0LCB3aGljaCBleHBsYWlucyB0aGUgb2RkIGNvbnN0cnVjdGlvbjoKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcD1gd2luZXBhdGggLXcgIiQxIiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICIkPyIgLWVxIDAgJiYgdGVzdCAtbiAiJHtmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcH0iOyB0aGVuCisgICAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD1gJEVDSE8gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcCIgfAorICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgZWxzZQorICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9CisgICAgZmkKKyAgZmkKK30KKyMgZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyIEFSRworIyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBwYXRoIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsIGFuZAorIyAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEgY29ycmVjdGx5CisjIGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0gaW4gJGJ1aWxkJ3MKKyMgJFBBVEguIEFzc3VtZXMgQVJHIGhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlcnMuCisjCisjIEFSRyBpcyBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8gd2luMzIuCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0LgorIyBVbmNvbnZlcnRpYmxlIGZpbGUgKGRpcmVjdG9yeSkgbmFtZXMgaW4gQVJHIGFyZSBza2lwcGVkOyBpZiBubyBkaXJlY3RvcnkgbmFtZXMKKyMgYXJlIGNvbnZlcnRpYmxlLCB0aGVuIHRoZSByZXN1bHQgbWF5IGJlIGVtcHR5LgorZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgICMgdW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lc24ndCBjb252ZXJ0IHBhdGhzLCBvbmx5IGZpbGUgbmFtZXMKKyAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQ9IiIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgb2xkSUZTPSRJRlMKKyAgICBJRlM9OgorICAgIGZvciBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX2YgaW4gJDE7IGRvCisgICAgICBJRlM9JG9sZElGUworICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfZiIKKyAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIgOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdCI7IHRoZW4KKyAgICAgICAgICBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0IgorICAgICAgICBlbHNlCisgICAgICAgICAgZnVuY19hcHBlbmQgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQgIjskZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9JG9sZElGUworICBmaQorfQorIyBlbmQ6IGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIKKworCisjIGZ1bmNfY3lncGF0aCBBUkdTLi4uCisjIFdyYXBwZXIgYXJvdW5kIGNhbGxpbmcgdGhlIGN5Z3BhdGggcHJvZ3JhbSB2aWEgTFRfQ1lHUEFUSC4gVGhpcyBpcyB1c2VkIHdoZW4KKyMgd2hlbiAoMSkgJGJ1aWxkIGlzICpuaXggYW5kIEN5Z3dpbiBpcyBob3N0ZWQgdmlhIGEgd2luZSBlbnZpcm9ubWVudDsgb3IgKDIpCisjICRidWlsZCBpcyBNU1lTIGFuZCAkaG9zdCBpcyBDeWd3aW4sIG9yICgzKSAkYnVpbGQgaXMgQ3lnd2luLiBJbiBjYXNlICgxKSBvcgorIyAoMiksIHJldHVybnMgdGhlIEN5Z3dpbiBmaWxlIG5hbWUgb3IgcGF0aCBpbiBmdW5jX2N5Z3BhdGhfcmVzdWx0IChpbnB1dAorIyBmaWxlIG5hbWUgb3IgcGF0aCBpcyBhc3N1bWVkIHRvIGJlIGluIHczMiBmb3JtYXQsIGFzIHByZXZpb3VzbHkgY29udmVydGVkCisjIGZyb20gJGJ1aWxkJ3MgKm5peCBvciBNU1lTIGZvcm1hdCkuIEluIGNhc2UgKDMpLCByZXR1cm5zIHRoZSB3MzIgZmlsZSBuYW1lCisjIG9yIHBhdGggaW4gZnVuY19jeWdwYXRoX3Jlc3VsdCAoaW5wdXQgZmlsZSBuYW1lIG9yIHBhdGggaXMgYXNzdW1lZCB0byBiZSBpbgorIyBDeWd3aW4gZm9ybWF0KS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCisjCisjIEFSR1MgYXJlIHBhc3NlZCB0byBjeWdwYXRoLCB3aXRoIHRoZSBsYXN0IG9uZSBiZWluZyB0aGUgZmlsZSBuYW1lIG9yIHBhdGggdG8KKyMgYmUgY29udmVydGVkLgorIworIyBTcGVjaWZ5IHRoZSBhYnNvbHV0ZSAqbml4IChvciB3MzIpIG5hbWUgdG8gY3lncGF0aCBpbiB0aGUgTFRfQ1lHUEFUSAorIyBlbnZpcm9ubWVudCB2YXJpYWJsZTsgZG8gbm90IHB1dCBpdCBpbiAkUEFUSC4KK2Z1bmNfY3lncGF0aCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLW4gIiRMVF9DWUdQQVRIIiAmJiB0ZXN0IC1mICIkTFRfQ1lHUEFUSCI7IHRoZW4KKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PWAkTFRfQ1lHUEFUSCAiJEAiIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgIiQ/IiAtbmUgMDsgdGhlbgorICAgICAgIyBvbiBmYWlsdXJlLCBlbnN1cmUgcmVzdWx0IGlzIGVtcHR5CisgICAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZpCisgIGVsc2UKKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZ1bmNfZXJyb3IgIkxUX0NZR1BBVEggaXMgZW1wdHkgb3Igc3BlY2lmaWVzIG5vbi1leGlzdGVudCBmaWxlOiBcYCRMVF9DWUdQQVRIJyIKKyAgZmkKK30KKyNlbmQ6IGZ1bmNfY3lncGF0aAorCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIG9yIHBhdGggQVJHIGZyb20gTVNZUyBmb3JtYXQgdG8gdzMyIGZvcm1hdC4gIFJldHVybgorIyByZXN1bHQgaW4gZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0LgorZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAjIGF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQKKyAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0PWAoIGNtZCAvL2MgZWNobyAiJDEiICkgMj4vZGV2L251bGwgfAorICAgICRTRUQgLWUgJ3MvWyBdKiQvLycgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKK30KKyNlbmQ6IGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayBBUkcxIEFSRzIKKyMgVmVyaWZ5IHRoYXQgQVJHMSAoYSBmaWxlIG5hbWUgaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gQVJHMi4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSAocmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBBUkcxKS4KK2Z1bmNfY29udmVydF9maWxlX2NoZWNrICgpCit7CisgICRvcHRfZGVidWcKKyAgaWYgdGVzdCAteiAiJDIiICYmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIGhvc3QgZmlsZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgZnVuY19lcnJvciAiICBcYCQxJyIKKyAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKKyAgICAjIEZhbGxiYWNrOgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjaworCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgRlJPTV9QQVRIU0VQIFRPX1BBVEhTRVAgRlJPTV9QQVRIIFRPX1BBVEgKKyMgVmVyaWZ5IHRoYXQgRlJPTV9QQVRIIChhIHBhdGggaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gVE9fUEFUSC4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSwgcmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBhIHNpbXBsaXN0aWMgZmFsbGJhY2sgdmFsdWUgKHNlZSBiZWxvdykuCitmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiQ0IiAmJiB0ZXN0IC1uICIkMyI7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBob3N0IHBhdGggY29ycmVzcG9uZGluZyB0byIKKyAgICBmdW5jX2Vycm9yICIgIFxgJDMnIgorICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICMgRmFsbGJhY2suICBUaGlzIGlzIGEgZGVsaWJlcmF0ZWx5IHNpbXBsaXN0aWMgImNvbnZlcnNpb24iIGFuZAorICAgICMgc2hvdWxkIG5vdCBiZSAiaW1wcm92ZWQiLiAgU2VlIGxpYnRvb2wuaW5mby4KKyAgICBpZiB0ZXN0ICJ4JDEiICE9ICJ4JDIiOyB0aGVuCisgICAgICBsdF9yZXBsYWNlX3BhdGhzZXBfY2hhcnM9InN8JDF8JDJ8ZyIKKyAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJDMiIHwKKyAgICAgICAgJFNFRCAtZSAiJGx0X3JlcGxhY2VfcGF0aHNlcF9jaGFycyJgCisgICAgZWxzZQorICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyIKKyAgICBmaQorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCBGUk9OVFBBVCBCQUNLUEFUIFJFUEwgT1JJRworIyBNb2RpZmllcyBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQgYnkgcHJlcGVuZGluZyBSRVBMIGlmIE9SSUcgbWF0Y2hlcyBGUk9OVFBBVAorIyBhbmQgYXBwZW5kaW5nIFJFUEwgaWYgT1JJRyBtYXRjaGVzIEJBQ0tQQVQuCitmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBjYXNlICQ0IGluCisgICQxICkgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgOzsKKyAgZXNhYworICBjYXNlICQ0IGluCisgICQyICkgZnVuY19hcHBlbmQgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0ICIkMyIKKyAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgRklMRSBOQU1FIENPTlZFUlNJT04gRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGludm9rZWQgdmlhIGAkdG9faG9zdF9maWxlX2NtZCBBUkcnCisjCisjIEluIGVhY2ggY2FzZSwgQVJHIGlzIHRoZSBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCB0byAkaG9zdCBmb3JtYXQuCisjIFJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorCisKKyMgZnVuY190b19ob3N0X2ZpbGUgQVJHCisjIENvbnZlcnRzIHRoZSBmaWxlIG5hbWUgQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY190b19ob3N0X2ZpbGUgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAkdG9faG9zdF9maWxlX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfZmlsZQorCisKKyMgZnVuY190b190b29sX2ZpbGUgQVJHIExBWlkKKyMgY29udmVydHMgdGhlIGZpbGUgbmFtZSBBUkcgZnJvbSAkYnVpbGQgZm9ybWF0IHRvIHRvb2xjaGFpbiBmb3JtYXQuIFJldHVybgorIyByZXN1bHQgaW4gZnVuY190b190b29sX2ZpbGVfcmVzdWx0LiAgSWYgdGhlIGNvbnZlcnNpb24gaW4gdXNlIGlzIGxpc3RlZAorIyBpbiAodGhlIGNvbW1hIHNlcGFyYXRlZCkgTEFaWSwgbm8gY29udmVyc2lvbiB0YWtlcyBwbGFjZS4KK2Z1bmNfdG9fdG9vbF9maWxlICgpCit7CisgICRvcHRfZGVidWcKKyAgY2FzZSAsJDIsIGluCisgICAgKiwiJHRvX3Rvb2xfZmlsZV9jbWQiLCopCisgICAgICBmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQ9JDEKKyAgICAgIDs7CisgICAgKikKKyAgICAgICR0b190b29sX2ZpbGVfY21kICIkMSIKKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdD0kZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0CisgICAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX3RvX3Rvb2xfZmlsZQorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tIChtaW5ndykgTVNZUyB0byAobWluZ3cpIHczMiBmb3JtYXQ7IGF1dG9tYXRpYworIyBjb252ZXJzaW9uIHRvIHczMiBpcyBub3QgYXZhaWxhYmxlIGluc2lkZSB0aGUgY3dyYXBwZXIuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMl9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gQ3lnd2luIHRvIHczMiBmb3JtYXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBiZWNhdXNlICRidWlsZCBpcyBjeWd3aW4sIHdlIGNhbGwgInRoZSIgY3lncGF0aCBpbiAkUEFUSDsgbm8gbmVlZCB0byB1c2UKKyAgICAjIExUX0NZR1BBVEggaW4gdGhpcyBjYXNlLgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD1gY3lncGF0aCAtbSAiJDEiYAorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byB3MzIgZm9ybWF0LiAgUmVxdWlyZXMgYSB3aW5lIGVudmlyb25tZW50CisjIGFuZCBhIHdvcmtpbmcgd2luZXBhdGguIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25peF90b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBBUkcgZnJvbSBNU1lTIHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBMVF9DWUdQQVRIIHNldC4KKyMgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJDEiCisgICAgZnVuY19jeWdwYXRoIC11ICIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byBDeWd3aW4gZm9ybWF0LiAgUmVxdWlyZXMgQ3lnd2luIGluc3RhbGxlZAorIyBpbiBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIGNvbnZlcnQgZnJvbSAqbml4IHRvIHczMiwgdGhlbiB1c2UgY3lncGF0aCB0byBjb252ZXJ0IGZyb20gdzMyIHRvIGN5Z3dpbi4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgUEFUSCBDT05WRVJTSU9OIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgaW52b2tlZCB2aWEgYCR0b19ob3N0X3BhdGhfY21kIEFSRycKKyMKKyMgSW4gZWFjaCBjYXNlLCBBUkcgaXMgdGhlIHBhdGggdG8gYmUgY29udmVydGVkIGZyb20gJGJ1aWxkIHRvICRob3N0IGZvcm1hdC4KKyMgVGhlIHJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorIworIyBQYXRoIHNlcGFyYXRvcnMgYXJlIGFsc28gY29udmVydGVkIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuICBJZgorIyBBUkcgYmVnaW5zIG9yIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlciwgaXQgaXMgcHJlc2VydmVkIChidXQKKyMgY29udmVydGVkIHRvICRob3N0IGZvcm1hdCkgb24gb3V0cHV0LgorIworIyBBbGwgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgbmFtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uOgorIyAgIGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9uICAgIDogZnVuY19jb252ZXJ0X2ZpbGVfWF90b19ZICgpCisjICAgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9uICAgICAgICAgOiBmdW5jX2NvbnZlcnRfcGF0aF9YX3RvX1kgKCkKKyMgd2hlcmUsIGZvciBhbnkgZ2l2ZW4gJGJ1aWxkLyRob3N0IGNvbWJpbmF0aW9uIHRoZSAnWF90b19ZJyB2YWx1ZSBpcyB0aGUKKyMgc2FtZS4gIElmIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBhZGRlZCBmb3IgbmV3ICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbnMsCisjIHRoZSB0d28gbmV3IGZ1bmN0aW9ucyBtdXN0IGZvbGxvdyB0aGlzIHBhdHRlcm4sIG9yIGZ1bmNfaW5pdF90b19ob3N0X3BhdGhfY21kCisjIHdpbGwgYnJlYWsuCisKKworIyBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorIyBFbnN1cmVzIHRoYXQgZnVuY3Rpb24gInBvaW50ZXIiIHZhcmlhYmxlICR0b19ob3N0X3BhdGhfY21kIGlzIHNldCB0byB0aGUKKyMgYXBwcm9wcmlhdGUgdmFsdWUsIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiAkdG9faG9zdF9maWxlX2NtZC4KK3RvX2hvc3RfcGF0aF9jbWQ9CitmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiR0b19ob3N0X3BhdGhfY21kIjsgdGhlbgorICAgIGZ1bmNfc3RyaXBuYW1lICdmdW5jX2NvbnZlcnRfZmlsZV8nICcnICIkdG9faG9zdF9maWxlX2NtZCIKKyAgICB0b19ob3N0X3BhdGhfY21kPSJmdW5jX2NvbnZlcnRfcGF0aF8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH0iCisgIGZpCit9CisKKworIyBmdW5jX3RvX2hvc3RfcGF0aCBBUkcKKyMgQ29udmVydHMgdGhlIHBhdGggQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGggKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorICAkdG9faG9zdF9wYXRoX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfcGF0aAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAobWluZ3cpIE1TWVMgdG8gKG1pbmd3KSB3MzIgZm9ybWF0OyBhdXRvbWF0aWMKKyMgY29udmVyc2lvbiB0byB3MzIgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGN3cmFwcGVyLiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20gQVJHLiAgTVNZUworICAgICMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmU7IGN5Z3BhdGggdHVybnMgdGhlbSBpbnRvICcuOycgYW5kICc7Lic7CisgICAgIyBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSBDeWd3aW4gdG8gdzMyIGZvcm1hdC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gY3lncGF0aCAtbSAtcCAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiYAorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gdzMyIGZvcm1hdC4gIFJlcXVpcmVzIGEgd2luZSBlbnZpcm9ubWVudCBhbmQKKyMgYSB3b3JraW5nIHdpbmVwYXRoLiAgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiAiOyIgXAorICAgICAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgIjoqIiAiKjoiICI7IiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tIE1TWVMgdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIExUX0NZR1BBVEggc2V0LgorIyBSZXR1cm5zIHJlc3VsdCBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogOiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgOiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIEN5Z3dpbiBpbnN0YWxsZWQgaW4gYQorIyBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20KKyAgICAjIEFSRy4gbXN5cyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgaGVyZSwgY3lncGF0aCB0dXJucyB0aGVtCisgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiA6IFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiA6ICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4KKworCisjIGZ1bmNfbW9kZV9jb21waWxlIGFyZy4uLgorZnVuY19tb2RlX2NvbXBpbGUgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KKyAgICBiYXNlX2NvbXBpbGU9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIgICMgIGFsd2F5cyBrZWVwIGEgbm9uLWVtcHR5IHZhbHVlIGluICJzcmNmaWxlIgorICAgIHN1cHByZXNzX29wdD15ZXMKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisgICAgYXJnX21vZGU9bm9ybWFsCisgICAgbGlib2JqPQorICAgIGxhdGVyPQorICAgIHBpZV9mbGFnPQorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgICAgYXJnICApCisJIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQorCWxhc3Rhcmc9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJOzsKKworICAgICAgdGFyZ2V0ICkKKwlsaWJvYmo9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJY29udGludWUKKwk7OworCisgICAgICBub3JtYWwgKQorCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKwljYXNlICRhcmcgaW4KKwktbykKKwkgIHRlc3QgLW4gIiRsaWJvYmoiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAieW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIgorCSAgYXJnX21vZGU9dGFyZ2V0CisJICBjb250aW51ZQorCSAgOzsKKworCS1waWUgfCAtZnBpZSB8IC1mUElFKQorICAgICAgICAgIGZ1bmNfYXBwZW5kIHBpZV9mbGFnICIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLXNoYXJlZCB8IC1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKKwkgIGZ1bmNfYXBwZW5kIGxhdGVyICIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLW5vLXN1cHByZXNzKQorCSAgc3VwcHJlc3Nfb3B0PW5vCisJICBjb250aW51ZQorCSAgOzsKKworCS1YY29tcGlsZXIpCisJICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0CisJICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgorCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KKworCS1XYywqKQorCSAgZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCSAgYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBsYXN0YXJnPQorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJICBmb3IgYXJnIGluICRhcmdzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZnVuY19hcHBlbmRfcXVvdGVkIGxhc3RhcmcgIiRhcmciCisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGxhc3RhcmciCisJICBsYXN0YXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCisJICBmdW5jX2FwcGVuZCBiYXNlX2NvbXBpbGUgIiAkbGFzdGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJKikKKwkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKwkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgorCSAgIworCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCisJICBzcmNmaWxlPSIkYXJnIgorCSAgOzsKKwllc2FjICAjICBjYXNlICRhcmcKKwk7OworICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQorCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorICAgICAgZnVuY19hcHBlbmRfcXVvdGVkIGJhc2VfY29tcGlsZSAiJGxhc3RhcmciCisgICAgZG9uZSAjIGZvciBhcmcKKworICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgYXJnKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgorICAgICAgOzsKKyAgICB0YXJnZXQpCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciCisgICAgICA7OworICAgICopCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiB7CisJZnVuY19iYXNlbmFtZSAiJHNyY2ZpbGUiCisJbGlib2JqPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB9CisgICAgICA7OworICAgIGVzYWMKKworICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCisgICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLltjQ0ZTaWZtc29dIHwgXAorICAgICouYWRhIHwgKi5hZGIgfCAqLmFkcyB8ICouYXNtIHwgXAorICAgICouYysrIHwgKi5jYyB8ICouaWkgfCAqLmNsYXNzIHwgKi5jcHAgfCAqLmN4eCB8IFwKKyAgICAqLltmRl1bMDldPyB8ICouZm9yIHwgKi5qYXZhIHwgKi5nbyB8ICoub2JqIHwgKi5zeCB8ICouY3UgfCAqLmN1cCkKKyAgICAgIGZ1bmNfeGZvcm0gIiRsaWJvYmoiCisgICAgICBsaWJvYmo9JGZ1bmNfeGZvcm1fcmVzdWx0CisgICAgICA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICoubG8pIGZ1bmNfbG8ybyAiJGxpYm9iaiI7IG9iaj0kZnVuY19sbzJvX3Jlc3VsdCA7OworICAgICopCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLXNoYXJlZCkKKwl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCisJYnVpbGRfb2xkX2xpYnM9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1zdGF0aWMpCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLXBpYykKKwlwaWNfbW9kZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItbm9uLXBpYykKKwlwaWNfbW9kZT1ubworCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbGlib2JqIgorICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIgXAorICAgICAgJiYgJEVDSE8gIlgkbGlib2JqIiB8ICRHUkVQICdbXX4jXip7fTs8Pj8iJyInIicJICYoKXxgJFtdJyBcCisgICAgICAmJiBmdW5jX3dhcm5pbmcgImxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCisgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG9iaiIgIi8iICIiCisgICAgb2JqbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKKworICAgIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiCisKKyAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGVsc2UKKyAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBmaQorCisgICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKyAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgIGZpCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcworICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYworICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KKyAgICAgIG91dHB1dF9vYmo9YCRFQ0hPICIkc3JjZmlsZSIgfCAkU0VEICdzJV4uKi8lJTsgcyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9CisgICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKKyAgICBlbHNlCisgICAgICBvdXRwdXRfb2JqPQorICAgICAgbmVlZF9sb2Nrcz1ubworICAgICAgbG9ja2ZpbGU9CisgICAgZmkKKworICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCisgICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQorICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgorICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRvdXRwdXRfb2JqIgorICAgICAgJEVDSE8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKyAgICBmdW5jX2FwcGVuZCByZW1vdmVsaXN0ICIgJGxvY2tmaWxlIgorICAgIHRyYXAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScgMSAyIDE1CisKKyAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHNyY2ZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgc3JjZmlsZT0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHNyY2ZpbGUiCisgICAgcXNyY2ZpbGU9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0CisKKyAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KKyAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQorCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZWxzZQorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJHhkaXIkb2JqZGlyIgorCisgICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KKwkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKKwlmdW5jX2FwcGVuZCBjb21tYW5kICIgLW8gJGxvYmoiCisgICAgICBmaQorCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIglcCisgICAgICAgICAgJ3Rlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkbG9iaiInIFwKKwkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCisgICAgICBmaQorCisgICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCisgICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgorCXN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSRwaWVfZmxhZyIKKyAgICAgIGVsc2UKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21tYW5kICIgLW8gJG9iaiIKKyAgICAgIGZpCisKKyAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgorICAgICAgZnVuY19hcHBlbmQgY29tbWFuZCAiJHN1cHByZXNzX291dHB1dCIKKyAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiIFwKKyAgICAgICAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRvYmoiJyBcCisJICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJworICAgICAgZmkKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8IHsKKyAgICAgIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3QgIiRsaWJvYmoiICIkb2JqZGlyLyRvYmpuYW1lIiAiJG9iam5hbWUiCisKKyAgICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorCXJlbW92ZWxpc3Q9JGxvY2tmaWxlCisgICAgICAgICRSTSAiJGxvY2tmaWxlIgorICAgICAgZmkKKyAgICB9CisKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworJG9wdF9oZWxwIHx8IHsKKyAgdGVzdCAiJG9wdF9tb2RlIiA9IGNvbXBpbGUgJiYgZnVuY19tb2RlX2NvbXBpbGUgJHsxKyIkQCJ9Cit9CisKK2Z1bmNfbW9kZV9oZWxwICgpCit7CisgICAgIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCisgICAgY2FzZSAkb3B0X21vZGUgaW4KKyAgICAgICIiKQorICAgICAgICAjIEdlbmVyaWMgaGVscCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgdXNhZ2UgY29tbWVudHMKKyAgICAgICAgIyBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmaWxlLgorICAgICAgICBmdW5jX2hlbHAKKyAgICAgICAgOzsKKworICAgICAgY2xlYW4pCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgY29tcGlsZSkKKyAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCisKK0NvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCisgIC1uby1zdXBwcmVzcyAgICAgIGRvIG5vdCBzdXBwcmVzcyBjb21waWxlciBvdXRwdXQgZm9yIG11bHRpcGxlIHBhc3NlcworICAtcHJlZmVyLXBpYyAgICAgICB0cnkgdG8gYnVpbGQgUElDIG9iamVjdHMgb25seQorICAtcHJlZmVyLW5vbi1waWMgICB0cnkgdG8gYnVpbGQgbm9uLVBJQyBvYmplY3RzIG9ubHkKKyAgLXNoYXJlZCAgICAgICAgICAgZG8gbm90IGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKyAgLXN0YXRpYyAgICAgICAgICAgb25seSBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisgIC1XYyxGTEFHICAgICAgICAgIHBhc3MgRkxBRyBkaXJlY3RseSB0byB0aGUgY29tcGlsZXIKKworQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKK2Zyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCisKK1RoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQorU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCitsaWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCisgICAgICAgIDs7CisKKyAgICAgIGV4ZWN1dGUpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCisKK0F1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAorCitUaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCitmbGFncy4KKworSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAoraW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5CitkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KKworVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCisgICAgICAgIDs7CisKKyAgICAgIGZpbmlzaCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgorCitDb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgorCitFYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgorCitUaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKK3RoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgorICAgICAgICA7OworCisgICAgICBpbnN0YWxsKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KKworSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCisKK0lOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQorZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBJTlNUQUxMLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1pbnN0LXByZWZpeC1kaXIgUFJFRklYLURJUiAgVXNlIFBSRUZJWC1ESVIgYXMgYSBzdGFnaW5nIGFyZWEgZm9yIGluc3RhbGxhdGlvbgorCitUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQorQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCisgICAgICAgIDs7CisKKyAgICAgIGxpbmspCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgorCitMaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCitjcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgorCitMSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKK2EgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKKyAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCisgIC1iaW5kaXIgQklORElSICAgIHNwZWNpZnkgcGF0aCB0byBiaW5hcmllcyBkaXJlY3RvcnkgKGZvciBzeXN0ZW1zIHdoZXJlCisgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyBtdXN0IGJlIGZvdW5kIGluIHRoZSBQQVRIIHNldHRpbmcgYXQgcnVudGltZSkKKyAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCisgIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCisgIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCisgIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCisgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQorICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCisgIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCisgIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCisgIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKKyAgLXNoYXJlZCAgICAgICAgICAgb25seSBkbyBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXNocmV4dCBTVUZGSVggICAgb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIHNoYXJlZCBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uCisgIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgIC1zdGF0aWMtbGlidG9vbC1saWJzCisgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKyAgLXdlYWsgTElCTkFNRSAgICAgZGVjbGFyZSB0aGF0IHRoZSB0YXJnZXQgcHJvdmlkZXMgdGhlIExJQk5BTUUgaW50ZXJmYWNlCisgIC1XYyxGTEFHCisgIC1YY29tcGlsZXIgRkxBRyAgIHBhc3MgbGlua2VyLXNwZWNpZmljIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGNvbXBpbGVyCisgIC1XbCxGTEFHCisgIC1YbGlua2VyIEZMQUcgICAgIHBhc3MgbGlua2VyLXNwZWNpZmljIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGxpbmtlcgorICAtWENDbGlua2VyIEZMQUcgICBwYXNzIGxpbmstc3BlY2lmaWMgRkxBRyB0byB0aGUgY29tcGlsZXIgZHJpdmVyIChDQykKKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAorb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcworcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCit1c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKK2lzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgICAgICAgIDs7CisKKyAgICAgIHVuaW5zdGFsbCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KK090aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgICAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG9wdF9tb2RlJyIKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBlY2hvCisgICAgJEVDSE8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKK30KKworIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5CitpZiAkb3B0X2hlbHA7IHRoZW4KKyAgaWYgdGVzdCAiJG9wdF9oZWxwIiA9IDo7IHRoZW4KKyAgICBmdW5jX21vZGVfaGVscAorICBlbHNlCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwlmdW5jX21vZGVfaGVscAorICAgICAgZG9uZQorICAgIH0gfCBzZWQgLW4gJzFwOyAyLCRzL15Vc2FnZTovICBvcjogL3AnCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwllY2hvCisJZnVuY19tb2RlX2hlbHAKKyAgICAgIGRvbmUKKyAgICB9IHwKKyAgICBzZWQgJzFkCisgICAgICAvXldoZW4gcmVwb3J0aW5nLywvXlJlcG9ydC97CisJSAorCWQKKyAgICAgIH0KKyAgICAgICR4CisgICAgICAvaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMvZAorICAgICAgL21vcmUgZGV0YWlsZWQgLipNT0RFL2QKKyAgICAgIHMvXlVzYWdlOi4qLS1tb2RlPVwoW14gXSpcKSAuKi9EZXNjcmlwdGlvbiBvZiBcMSBtb2RlOi8nCisgIGZpCisgIGV4aXQgJD8KK2ZpCisKKworIyBmdW5jX21vZGVfZXhlY3V0ZSBhcmcuLi4KK2Z1bmNfbW9kZV9leGVjdXRlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIHRlc3QgLXogIiRjbWQiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiCisKKyAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgorICAgIGZvciBmaWxlIGluICRvcHRfZGxvcGVuOyBkbworICAgICAgdGVzdCAtZiAiJGZpbGUiIFwKKwl8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiCisKKyAgICAgIGRpcj0KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICoubGEpCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmaWxlIgorCWZpbGU9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAorCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKworCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgorCWRsbmFtZT0KKwlsaWJyYXJ5X25hbWVzPQorCWZ1bmNfc291cmNlICIkZmlsZSIKKworCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgorCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisJICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCisJICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgXAorCSAgICBmdW5jX3dhcm5pbmcgIlxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgorCSAgY29udGludWUKKwlmaQorCisJZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgorCSAgZnVuY19hcHBlbmQgZGlyICIvJG9iamRpciIKKwllbHNlCisJICBpZiB0ZXN0ICEgLWYgIiRkaXIvJGRsbmFtZSI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCTs7CisKKyAgICAgICopCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAtKiB8ICoubGEgfCAqLmxvICkgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICIkZmlsZSIKKwkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCisJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKKwllbGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgIGZ1bmNfc291cmNlICIkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBhcmdzICIkZmlsZSIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0ICJYJG9wdF9kcnlfcnVuIiA9IFhmYWxzZTsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCisJZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKworICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCisgICAgICBkbworCWV2YWwgImlmIHRlc3QgXCJcJHtzYXZlXyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCisgICAgICAgICAgICAgICAgJGx0X3Zhcj1cJHNhdmVfJGx0X3ZhcjsgZXhwb3J0ICRsdF92YXIKKwkgICAgICBlbHNlCisJCSRsdF91bnNldCAkbHRfdmFyCisJICAgICAgZmkiCisgICAgICBkb25lCisKKyAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KKyAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgorICAgIGVsc2UKKyAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwlldmFsICJcJEVDSE8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgorCWVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisgICAgICAkRUNITyAiJGNtZCRhcmdzIgorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGV4ZWN1dGUgJiYgZnVuY19tb2RlX2V4ZWN1dGUgJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfZmluaXNoIGFyZy4uLgorZnVuY19tb2RlX2ZpbmlzaCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBsaWJzPQorICAgIGxpYmRpcnM9CisgICAgYWRtaW5jbWRzPQorCisgICAgZm9yIG9wdCBpbiAiJG5vbm9wdCIgJHsxKyIkQCJ9CisgICAgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRvcHQiOyB0aGVuCisJZnVuY19hcHBlbmQgbGliZGlycyAiICRvcHQiCisKKyAgICAgIGVsaWYgdGVzdCAtZiAiJG9wdCI7IHRoZW4KKwlpZiBmdW5jX2xhbGliX3Vuc2FmZV9wICIkb3B0IjsgdGhlbgorCSAgZnVuY19hcHBlbmQgbGlicyAiICRvcHQiCisJZWxzZQorCSAgZnVuY193YXJuaW5nICJcYCRvcHQnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwlmaQorCisgICAgICBlbHNlCisJZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBhcmd1bWVudCBcYCRvcHQnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkbGlicyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRsdF9zeXNyb290IjsgdGhlbgorICAgICAgICBzeXNyb290X3JlZ2V4PWAkRUNITyAiJGx0X3N5c3Jvb3QiIHwgJFNFRCAiJHNlZF9tYWtlX2xpdGVyYWxfcmVnZXgiYAorICAgICAgICBzeXNyb290X2NtZD0icy9cKFsgJ11cKSRzeXNyb290X3JlZ2V4L1wxL2c7IgorICAgICAgZWxzZQorICAgICAgICBzeXNyb290X2NtZD0KKyAgICAgIGZpCisKKyAgICAgICMgUmVtb3ZlIHN5c3Jvb3QgcmVmZXJlbmNlcworICAgICAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisgICAgICAgIGZvciBsaWIgaW4gJGxpYnM7IGRvCisgICAgICAgICAgZWNobyAicmVtb3ZpbmcgcmVmZXJlbmNlcyB0byAkbHRfc3lzcm9vdCBhbmQgXGA9JyBwcmVmaXhlcyBmcm9tICRsaWIiCisgICAgICAgIGRvbmUKKyAgICAgIGVsc2UKKyAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKKyAgICAgICAgZm9yIGxpYiBpbiAkbGliczsgZG8KKwkgIHNlZCAtZSAiJHtzeXNyb290X2NtZH0gcy9cKFsgJ10tW0xSXVwpPS9cMS9nOyBzL1woWyAnXVwpPS9cMS9nIiAkbGliIFwKKwkgICAgPiAkdG1wZGlyL3RtcC1sYQorCSAgbXYgLWYgJHRtcGRpci90bXAtbGEgJGxpYgorCWRvbmUKKyAgICAgICAgJHtSTX1yICIkdG1wZGlyIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgorCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZmluaXNoX2NtZHMiICdhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyciJGNtZCInIicKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KKwkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZHMiIHx8IGZ1bmNfYXBwZW5kIGFkbWluY21kcyAiCisgICAgICAgJGNtZHMiCisJZmkKKyAgICAgIGRvbmUKKyAgICBmaQorCisgICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCisgICAgJG9wdF9zaWxlbnQgJiYgZXhpdCAkRVhJVF9TVUNDRVNTCisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJJEVDSE8gIiAgICRsaWJkaXIiCisgICAgICBkb25lCisgICAgICBlY2hvCisgICAgICBlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKKyAgICAgIGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgorICAgICAgZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIHRoZSBcYC1MTElCRElSJyIKKyAgICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCWVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisJZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwllY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKwllY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCWxpYmRpcj1MSUJESVIKKwlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKwkkRUNITyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCisJJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisJZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCisgICAgICBmaQorICAgICAgZWNobworCisgICAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICAgIGNhc2UgJGhvc3QgaW4KKwlzb2xhcmlzMi5bNjc4OV18c29sYXJpczIuMVswLTldKQorCSAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSksIGNybGUoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCIKKwkgIGVjaG8gInBhZ2VzLiIKKwkgIDs7CisJKikKKwkgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZmkKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGZpbmlzaCAmJiBmdW5jX21vZGVfZmluaXNoICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2luc3RhbGwgYXJnLi4uCitmdW5jX21vZGVfaW5zdGFsbCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCisgICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKKyAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KKyAgICAgICBjYXNlICRub25vcHQgaW4gKnNodG9vbCopIDo7OyAqKSBmYWxzZTs7IGVzYWM7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRub25vcHQiCisgICAgICBpbnN0YWxsX3Byb2c9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCAiCisgICAgICBhcmc9JDEKKyAgICAgIHNoaWZ0CisgICAgZWxzZQorICAgICAgaW5zdGFsbF9wcm9nPQorICAgICAgYXJnPSRub25vcHQKKyAgICBmaQorCisgICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgorICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgIGZ1bmNfYXBwZW5kIGluc3RhbGxfcHJvZyAiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGluc3RhbGxfc2hhcmVkX3Byb2c9JGluc3RhbGxfcHJvZworICAgIGNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKyAgICAgICpbXFxcIC9dY3BcICopIGluc3RhbGxfY3A9OiA7OworICAgICAgKikgaW5zdGFsbF9jcD1mYWxzZSA7OworICAgIGVzYWMKKworICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KKyAgICBkZXN0PQorICAgIGZpbGVzPQorICAgIG9wdHM9CisgICAgcHJldj0KKyAgICBpbnN0YWxsX3R5cGU9CisgICAgaXNkaXI9bm8KKyAgICBzdHJpcG1lPQorICAgIG5vX21vZGU9OgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgYXJnMj0KKyAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgorCWZ1bmNfYXBwZW5kIGZpbGVzICIgJGRlc3QiCisJZGVzdD0kYXJnCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWQpIGlzZGlyPXllcyA7OworICAgICAgLWYpCisJaWYgJGluc3RhbGxfY3A7IHRoZW4gOjsgZWxzZQorCSAgcHJldj0kYXJnCisJZmkKKwk7OworICAgICAgLWcgfCAtbSB8IC1vKQorCXByZXY9JGFyZworCTs7CisgICAgICAtcykKKwlzdHJpcG1lPSIgLXMiCisJY29udGludWUKKwk7OworICAgICAgLSopCisJOzsKKyAgICAgICopCisJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgorCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgaWYgdGVzdCAieCRwcmV2IiA9IHgtbSAmJiB0ZXN0IC1uICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIjsgdGhlbgorCSAgICBhcmcyPSRpbnN0YWxsX292ZXJyaWRlX21vZGUKKwkgICAgbm9fbW9kZT1mYWxzZQorCSAgZmkKKwkgIHByZXY9CisJZWxzZQorCSAgZGVzdD0kYXJnCisJICBjb250aW51ZQorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3Byb2cgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBpZiB0ZXN0IC1uICIkYXJnMiI7IHRoZW4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnMiIKKyAgICAgIGZpCisgICAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3NoYXJlZF9wcm9nICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGRvbmUKKworICAgIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAtbiAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSIgJiYgJG5vX21vZGU7IHRoZW4KKyAgICAgIGlmICRpbnN0YWxsX2NwOyB0aGVuIDo7IGVsc2UKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIgorCWZ1bmNfYXBwZW5kIGluc3RhbGxfc2hhcmVkX3Byb2cgIiAtbSAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwlmdW5jX2ZhdGFsX2hlbHAgIm5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIgorICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIgorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZGVzdCIKKyAgICBkZXN0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgorICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKKyAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCisgICAgICBkZXN0ZGlyPSIkZGVzdCIKKyAgICAgIGRlc3RuYW1lPQorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRkZXN0IiAiIiAiLiIKKyAgICAgIGRlc3RkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgZGVzdG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgorICAgICAgc2V0IGR1bW15ICRmaWxlczsgc2hpZnQKKyAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCisJZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgIGZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIHN0YXRpY2xpYnM9CisgICAgZnV0dXJlX2xpYmRpcnM9CisgICAgY3VycmVudF9saWJkaXJzPQorICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKworICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouJGxpYmV4dCkKKwkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgorCWZ1bmNfYXBwZW5kIHN0YXRpY2xpYnMgIiAkZmlsZSIKKwk7OworCisgICAgICAqLmxhKQorCWZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZmlsZSIKKwlmaWxlPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlyZWxpbmtfY29tbWFuZD0KKwlmdW5jX3NvdXJjZSAiJGZpbGUiCisKKwkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCisJaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KKwkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGN1cnJlbnRfbGliZGlycyAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmdXR1cmVfbGliZGlycyAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIvIiAiIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJZnVuY19hcHBlbmQgZGlyICIkb2JqZGlyIgorCisJaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgIyBEZXRlcm1pbmUgdGhlIHByZWZpeCB0aGUgdXNlciBoYXMgYXBwbGllZCB0byBvdXIgZnV0dXJlIGRpci4KKwkgIGluc3RfcHJlZml4X2Rpcj1gJEVDSE8gIiRkZXN0ZGlyIiB8ICRTRUQgLWUgInMlJGxpYmRpclwkJSUiYAorCisJICAjIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIHBsYWNlIHVzIG91dHNpZGUgb2Ygb3VyIGV4cGVjdGVkCisJICAjIGxvY2F0aW9uIGIvYyB0aGlzIHByZXZlbnRzIGZpbmRpbmcgZGVwZW5kZW50IGxpYnJhcmllcyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgdG8gdGhlIHNhbWUgcHJlZml4LgorCSAgIyBBdCBwcmVzZW50LCB0aGlzIGNoZWNrIGRvZXNuJ3QgYWZmZWN0IHdpbmRvd3MgLmRsbCdzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCBpbnRvICRsaWJkaXIvLi4vYmluIChjdXJyZW50bHksIHRoYXQgd29ya3MgZmluZSkKKwkgICMgYnV0IGl0J3Mgc29tZXRoaW5nIHRvIGtlZXAgYW4gZXllIG9uLgorCSAgdGVzdCAiJGluc3RfcHJlZml4X2RpciIgPSAiJGRlc3RkaXIiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIKKworCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAorCSAgZWxzZQorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJSUiYAorCSAgZmkKKworCSAgZnVuY193YXJuaW5nICJyZWxpbmtpbmcgXGAkZmlsZSciCisJICBmdW5jX3Nob3dfZXZhbCAiJHJlbGlua19jb21tYW5kIiBcCisJICAgICdmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnXCcnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiJworCWZpCisKKwkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lczsgc2hpZnQKKwlpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKwkgIHJlYWxuYW1lPSIkMSIKKwkgIHNoaWZ0CisKKwkgIHNyY25hbWU9IiRyZWFsbmFtZSIKKwkgIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCIgJiYgc3JjbmFtZT0iJHJlYWxuYW1lIlQKKworCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3NoYXJlZF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiBcCisJICAgICAgJ2V4aXQgJD8nCisJICB0c3RyaXBtZT0iJHN0cmlwbWUiCisJICBjYXNlICRob3N0X29zIGluCisJICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJICAgIGNhc2UgJHJlYWxuYW1lIGluCisJICAgICouZGxsLmEpCisJICAgICAgdHN0cmlwbWU9IiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0IC1uICIkdHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkgICAgZnVuY19zaG93X2V2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiICdleGl0ICQ/JworCSAgZmkKKworCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KKwkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCisJICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIiBcCisJCSYmIGZ1bmNfc2hvd19ldmFsICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJFJNICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKwkgICAgZG9uZQorCSAgZmkKKworCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKwlmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQorCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgJ2V4aXQgJD8nCisKKwkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCisJdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBmdW5jX2FwcGVuZCBzdGF0aWNsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJOzsKKworICAgICAgKi5sbykKKwkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJY2FzZSAkZGVzdGZpbGUgaW4KKwkqLmxvKQorCSAgZnVuY19sbzJvICIkZGVzdGZpbGUiCisJICBzdGF0aWNkZXN0PSRmdW5jX2xvMm9fcmVzdWx0CisJICA7OworCSouJG9iamV4dCkKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9oZWxwICJjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIKKwkgIDs7CisJZXNhYworCisJIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCisJdGVzdCAtbiAiJGRlc3RmaWxlIiAmJiBcCisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiICdleGl0ICQ/JworCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIGZ1bmNfbG8ybyAiJGZpbGUiCisJICBzdGF0aWNvYmo9JGZ1bmNfbG8yb19yZXN1bHQKKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgJ2V4aXQgJD8nCisJZmkKKwlleGl0ICRFWElUX1NVQ0NFU1MKKwk7OworCisgICAgICAqKQorCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAorCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KKwkjIGluc3RhbGwKKwlzdHJpcHBlZF9leHQ9IiIKKwljYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKKwkgICAgZmkKKwkgICAgOzsKKwllc2FjCisKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KikKKwkgICAgaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICBlbHNlCisJICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZmkKKwkgICAgOzsKKwkqKQorCSAgICB3cmFwcGVyPSRmaWxlCisJICAgIDs7CisJZXNhYworCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkd3JhcHBlciI7IHRoZW4KKwkgIG5vdGluc3RfZGVwbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICBmdW5jX3NvdXJjZSAiJHdyYXBwZXIiCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgdGVzdCAteiAiJGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb24iICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIgorCisJICBmaW5hbGl6ZT15ZXMKKwkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KKwkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgorCSAgICBsaWJkaXI9CisJICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJICAgICAgZnVuY19zb3VyY2UgIiRsaWIiCisJICAgIGZpCisJICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkRUNITyAiJGxpYiIgfCAkU0VEICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX3dhcm5pbmcgIlxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIgorCSAgICAgIGZpbmFsaXplPW5vCisJICAgIGZpCisJICBkb25lCisKKwkgIHJlbGlua19jb21tYW5kPQorCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgorCisJICBvdXRwdXRuYW1lPQorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgorCSAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKKwkJZnVuY19iYXNlbmFtZSAiJGZpbGUkc3RyaXBwZWRfZXh0IgorCQlmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgorCSAgICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCSAgICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCisKKwkgICAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkcmVsaW5rX2NvbW1hbmQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgICAgfQorCSAgICAgICAgaWYgZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICAgICAgICAgIGVsc2UKKwkJICBmdW5jX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiCisJCSAgJG9wdF9kcnlfcnVuIHx8ICR7Uk19ciAiJHRtcGRpciIKKwkJICBjb250aW51ZQorCSAgICAgICAgZmkKKwkgICAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IHJlbGluayBcYCRmaWxlJyIKKwkgICAgICBmaQorCSAgICB9CisJICBlbHNlCisJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJEVDSE8gIiRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkU0VEICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAorCSAgZmkKKwlmaQorCisJIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCisJIyBvbmUgYW55d2F5CisJY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCisJKi91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQorCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KKwkgICouZXhlOiouZXhlKQorCSAgICAjIHRoaXMgaXMgb2sKKwkgICAgOzsKKwkgICouZXhlOiopCisJICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKKwkgICAgOzsKKwkgICo6Ki5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGRlc3RmaWxlIgorCSAgICBkZXN0ZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgJ2V4aXQgJD8nCisJJG9wdF9kcnlfcnVuIHx8IGlmIHRlc3QgLW4gIiRvdXRwdXRuYW1lIjsgdGhlbgorCSAgJHtSTX1yICIkdG1wZGlyIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KKyAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisgICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCisgICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvbGRsaWIiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICB0b29sX29sZGxpYj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgJ2V4aXQgJD8nCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICIkb2xkX3N0cmlwbGliICR0b29sX29sZGxpYiIgJ2V4aXQgJD8nCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKKyAgICBkb25lCisKKyAgICB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiICYmIFwKKyAgICAgIGZ1bmNfd2FybmluZyAicmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIKKworICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCisgICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgorICAgICAgJG9wdF9kcnlfcnVuICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKKyAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKKyAgICBlbHNlCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorfQorCit0ZXN0ICIkb3B0X21vZGUiID0gaW5zdGFsbCAmJiBmdW5jX21vZGVfaW5zdGFsbCAkezErIiRAIn0KKworCisjIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zIG91dHB1dG5hbWUgb3JpZ2luYXRvciBwaWNfcAorIyBFeHRyYWN0IHN5bWJvbHMgZnJvbSBkbHByZWZpbGVzIGFuZCBjcmVhdGUgJHtvdXRwdXRuYW1lfVMubyB3aXRoCisjIGEgZGxwcmVvcGVuIHN5bWJvbCB0YWJsZS4KK2Z1bmNfZ2VuZXJhdGVfZGxzeW1zICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIG15X291dHB1dG5hbWU9IiQxIgorICAgIG15X29yaWdpbmF0b3I9IiQyIgorICAgIG15X3BpY19wPSIkezMtbm99IgorICAgIG15X3ByZWZpeD1gJEVDSE8gIiRteV9vcmlnaW5hdG9yIiB8IHNlZCAncyVbXmEtekEtWjAtOV0lXyVnJ2AKKyAgICBteV9kbHN5bXM9CisKKyAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCW15X2Rsc3ltcz0iJHtteV9vdXRwdXRuYW1lfVMuYyIKKyAgICAgIGVsc2UKKwlmdW5jX2Vycm9yICJub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkbXlfZGxzeW1zIjsgdGhlbgorICAgICAgY2FzZSAkbXlfZGxzeW1zIGluCisgICAgICAiIikgOzsKKyAgICAgICouYykKKwkjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgorCW5saXN0PSIkb3V0cHV0X29iamRpci8ke215X291dHB1dG5hbWV9Lm5tIgorCisJZnVuY19zaG93X2V2YWwgIiRSTSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKworCSMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCisJZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCisJJG9wdF9kcnlfcnVuIHx8ICRFQ0hPID4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisvKiAkbXlfZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG15X291dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNCkpIHx8IChfX0dOVUNfXyA+IDQpKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdzdHJpY3QtcHJvdG90eXBlc1wiCisjZW5kaWYKKworLyogS2VlcCB0aGlzIGNvZGUgaW4gc3luYyBiZXR3ZWVuIGxpYnRvb2wubTQsIGx0bWFpbiwgbHRfc3lzdGVtLmgsIGFuZCB0ZXN0cy4gICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZSBydW50aW1lCisgICByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24gb24gcHNldWRvLXJlbG9jcy4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2VsaWYgZGVmaW5lZChfX29zZl9fKQorLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YS4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2Vsc2UKKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUIGNvbnN0CisjZW5kaWYKKworLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKKyIKKworCWlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCisJICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCisKKwkgICRvcHRfZHJ5X3J1biB8fCBlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKKworCSAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgorCSAgcHJvZ2ZpbGVzPWAkRUNITyAiJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorCSAgZm9yIHByb2dmaWxlIGluICRwcm9nZmlsZXM7IGRvCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkcHJvZ2ZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkZnVuY190b190b29sX2ZpbGVfcmVzdWx0JyIKKwkgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiROTSAkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBldmFsICckRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICB9CisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIH0KKwkgIGZpCisKKwkgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCisJICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgJFJNICRleHBvcnRfc3ltYm9scworCSAgICAgIGV2YWwgIiR7U0VEfSAtbiAtZSAnL146IEBQUk9HUkFNQCAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKyAgICAgICAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworICAgICAgICAgICAgICAgIGV2YWwgJ2NhdCAiJGV4cG9ydF9zeW1ib2xzIiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICB9CisJICBlbHNlCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAiJHtTRUR9IC1lICdzL1woW10uWypeJF1cKS9cXFxcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCInCisJICAgICAgZXZhbCAnJEdSRVAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICBldmFsICdjYXQgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICB9CisJICBmaQorCWZpCisKKwlmb3IgZGxwcmVmaWxlIGluICRkbHByZWZpbGVzOyBkbworCSAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRkbHByZWZpbGUnIgorCSAgZnVuY19iYXNlbmFtZSAiJGRscHJlZmlsZSIKKwkgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgICAgICBjYXNlICRob3N0IGluCisJICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICMgaWYgYW4gaW1wb3J0IGxpYnJhcnksIHdlIG5lZWQgdG8gb2J0YWluIGRsbmFtZQorCSAgICAgIGlmIGZ1bmNfd2luMzJfaW1wb3J0X2xpYl9wICIkZGxwcmVmaWxlIjsgdGhlbgorCSAgICAgICAgZnVuY190cl9zaCAiJGRscHJlZmlsZSIKKwkgICAgICAgIGV2YWwgImN1cnJfbGFmaWxlPVwkbGliZmlsZV8kZnVuY190cl9zaF9yZXN1bHQiCisJICAgICAgICBkbHByZWZpbGVfZGxiYXNlbmFtZT0iIgorCSAgICAgICAgaWYgdGVzdCAtbiAiJGN1cnJfbGFmaWxlIiAmJiBmdW5jX2xhbGliX3AgIiRjdXJyX2xhZmlsZSI7IHRoZW4KKwkgICAgICAgICAgIyBVc2Ugc3Vic2hlbGwsIHRvIGF2b2lkIGNsb2JiZXJpbmcgY3VycmVudCB2YXJpYWJsZSB2YWx1ZXMKKwkgICAgICAgICAgZGxwcmVmaWxlX2RsbmFtZT1gc291cmNlICIkY3Vycl9sYWZpbGUiICYmIGVjaG8gIiRkbG5hbWUiYAorCSAgICAgICAgICBpZiB0ZXN0IC1uICIkZGxwcmVmaWxlX2RsbmFtZSIgOyB0aGVuCisJICAgICAgICAgICAgZnVuY19iYXNlbmFtZSAiJGRscHJlZmlsZV9kbG5hbWUiCisJICAgICAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgICMgbm8gbGFmaWxlLiB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIC1kbHByZW9wZW4gPGltcG9ydCBsaWJyYXJ5Pi4KKwkgICAgICAgICAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQgIiRkbHByZWZpbGUiCisJICAgICAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9JHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CisJICAgICAgICAgIGZpCisJICAgICAgICBmaQorCSAgICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgICAgaWYgdGVzdCAtbiAiJGRscHJlZmlsZV9kbGJhc2VuYW1lIiA7IHRoZW4KKwkgICAgICAgICAgICBldmFsICckRUNITyAiOiAkZGxwcmVmaWxlX2RsYmFzZW5hbWUiID4+ICIkbmxpc3QiJworCSAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgZnVuY193YXJuaW5nICJDb3VsZCBub3QgY29tcHV0ZSBETEwgbmFtZSBmcm9tICRuYW1lIgorCSAgICAgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICAgIGZpCisJICAgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgICBldmFsICIkTk0gXCIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwKKwkgICAgICAgICAgICAkU0VEIC1lICcvSSBfX2ltcC9kJyAtZSAncy9JIF9fbm1fL0QgLztzL19ubV9fLy8nID4+ICckbmxpc3QnIgorCSAgICAgICAgfQorCSAgICAgIGVsc2UgIyBub3QgYW4gaW1wb3J0IGxpYgorCSAgICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgICAgZXZhbCAnJEVDSE8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgICAgICAgZnVuY190b190b29sX2ZpbGUgIiRkbHByZWZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJICAgICAgICAgIGV2YWwgIiROTSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgICAgICB9CisJICAgICAgZmkKKwkgICAgOzsKKwkgICAgKikKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICAgZXZhbCAnJEVDSE8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgZXZhbCAiJE5NIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgICAgICB9CisJICAgIDs7CisgICAgICAgICAgZXNhYworCWRvbmUKKworCSRvcHRfZHJ5X3J1biB8fCB7CisJICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGFuIGVtcHR5IGZpbGUuCisJICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgorCisJICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAkRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAorCSAgICAkTVYgIiRubGlzdCJUICIkbmxpc3QiCisJICBmaQorCisJICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorCSAgaWYgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiB8CisJICAgICAgaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCXNvcnQgLWsgMworCSAgICAgIGVsc2UKKwkJc29ydCArMgorCSAgICAgIGZpIHwKKwkgICAgICB1bmlxID4gIiRubGlzdCJTOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUworCSAgZmkKKworCSAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyInCisJICBlbHNlCisJICAgIGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgZmkKKworCSAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICphZGRyZXNzOworfSBsdF9kbHN5bWxpc3Q7CitleHRlcm4gTFRfRExTWU1fQ09OU1QgbHRfZGxzeW1saXN0CitsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW107CitMVF9ETFNZTV9DT05TVCBsdF9kbHN5bWxpc3QKK2x0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7XAorICB7IFwiJG15X29yaWdpbmF0b3JcIiwgKHZvaWQgKikgMCB9LCIKKworCSAgY2FzZSAkbmVlZF9saWJfcHJlZml4IGluCisJICBubykKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICAgIDs7CisJICAqKQorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgICA7OworCSAgZXNhYworCSAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCX0gIyAhJG9wdF9kcnlfcnVuCisKKwlwaWNfZmxhZ19mb3Jfc3ltdGFibGU9CisJY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJKiIgLXN0YXRpYyAiKikgOzsKKwkqKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCisJICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKKwkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKKwkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgorCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KKwkgICotKi1mcmVlYnNkMi4qfCotKi1mcmVlYnNkMy4wKnwqLSotZnJlZWJzZGVsZjMuMCopCisJICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCIgOzsKKwkgICotKi1ocHV4KikKKwkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIiAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIlgkbXlfcGljX3AiICE9IFhubzsgdGhlbgorCSAgICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCXN5bXRhYl9jZmxhZ3M9CisJZm9yIGFyZyBpbiAkTFRDRkxBR1M7IGRvCisJICBjYXNlICRhcmcgaW4KKwkgIC1waWUgfCAtZnBpZSB8IC1mUElFKSA7OworCSAgKikgZnVuY19hcHBlbmQgc3ltdGFiX2NmbGFncyAiICRhcmciIDs7CisJICBlc2FjCisJZG9uZQorCisJIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KKwlmdW5jX3Nob3dfZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDJHN5bXRhYl9jZmxhZ3MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJG15X2Rsc3ltcyIpJyAnZXhpdCAkPycKKworCSMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIicKKworCSMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCisJc3ltZmlsZW9iaj0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfVMuJG9iamV4dCIKKwljYXNlICRob3N0IGluCisJKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYiOyB0aGVuCisJICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYgJHN5bWZpbGVvYmolImAKKwkgIGVsc2UKKwkgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpCisJICA7OworCSopCisJICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIDs7CisJZXNhYworCTs7CisgICAgICAqKQorCWZ1bmNfZmF0YWxfZXJyb3IgInVua25vd24gc3VmZml4IGZvciBcYCRteV9kbHN5bXMnIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KKyAgICAgICMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKyAgICAgICMgcmVhbGx5IHdhcyByZXF1aXJlZC4KKworICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKyAgICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlIEBTWU1GSUxFQCUlImAKKyAgICBmaQorfQorCisjIGZ1bmNfd2luMzJfbGliaWQgYXJnCisjIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKKyMKKyMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicworIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKKyMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgorIyBEZXNwaXRlIHRoZSBuYW1lLCBhbHNvIGRlYWwgd2l0aCA2NCBiaXQgYmluYXJpZXMuCitmdW5jX3dpbjMyX2xpYmlkICgpCit7CisgICRvcHRfZGVidWcKKyAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKKyAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKKyAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCisgICAgOzsKKyAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYworICAgICMgS2VlcCB0aGUgZWdyZXAgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ELgorICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwKKyAgICAgICAkRUdSRVAgJ2ZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgZnVuY190b190b29sX2ZpbGUgIiQxIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgd2luMzJfbm1yZXM9YGV2YWwgJE5NIC1mIHBvc2l4IC1BIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIHwKKwkkU0VEIC1uIC1lICcKKwkgICAgMSwxMDB7CisJCS8gSSAveworCQkgICAgcywuKixpbXBvcnQsCisJCSAgICBwCisJCSAgICBxCisJCX0KKwkgICAgfSdgCisgICAgICBjYXNlICR3aW4zMl9ubXJlcyBpbgorICAgICAgaW1wb3J0KikgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCI7OworICAgICAgKikgICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIHN0YXRpYyI7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgKkRMTCopCisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICA7OworICAqZXhlY3V0YWJsZSopICMgYnV0IHNoZWxsIHNjcmlwdHMgYXJlICJleGVjdXRhYmxlIiB0b28uLi4KKyAgICBjYXNlICR3aW4zMl9maWxlcmVzIGluCisgICAgKk1TXCBXaW5kb3dzXCBQRVwgSW50ZWwqKQorICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgJEVDSE8gIiR3aW4zMl9saWJpZF90eXBlIgorfQorCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYiBBUkcKKyMKKyMgUGxhdGZvcm0tc3BlY2lmaWMgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUKKyMgbmFtZSBvZiB0aGUgRExMIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisjIGltcG9ydCBsaWJyYXJ5IEFSRy4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gJERMTFRPT0wgLS1pZGVudGlmeS1zdHJpY3QgLS1pZGVudGlmeSAiJDEiYAorfQorCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlIFNFQ1RJT05fTkFNRSBMSUJOQU1FcworIworIyBUaGUgaXMgdGhlIGNvcmUgb2YgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiBhCisjIHBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlCisjIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeSBMSUJOQU1FLgorIworIyBTRUNUSU9OX05BTUUgaXMgZWl0aGVyIC5pZGF0YSQ2IG9yIC5pZGF0YSQ3LCBkZXBlbmRpbmcKKyMgb24gdGhlIHBsYXRmb3JtIGFuZCBjb21waWxlciB0aGF0IGNyZWF0ZWQgdGhlIGltcGxpYi4KKyMKKyMgRWNob3MgdGhlIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlCisjIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeS4KK2Z1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlICgpCit7CisgICRvcHRfZGVidWcKKyAgbWF0Y2hfbGl0ZXJhbD1gJEVDSE8gIiQxIiB8ICRTRUQgIiRzZWRfbWFrZV9saXRlcmFsX3JlZ2V4ImAKKyAgJE9CSkRVTVAgLXMgLS1zZWN0aW9uICIkMSIgIiQyIiAyPi9kZXYvbnVsbCB8CisgICAgJFNFRCAnL15Db250ZW50cyBvZiBzZWN0aW9uICciJG1hdGNoX2xpdGVyYWwiJzoveworICAgICAgIyBQbGFjZSBtYXJrZXIgYXQgYmVnaW5uaW5nIG9mIGFyY2hpdmUgbWVtYmVyIGRsbG5hbWUgc2VjdGlvbgorICAgICAgcy8uKi89PT09TUFSSz09PT0vCisgICAgICBwCisgICAgICBkCisgICAgfQorICAgICMgVGhlc2UgbGluZXMgY2FuIHNvbWV0aW1lcyBiZSBsb25nZXIgdGhhbiA0MyBjaGFyYWN0ZXJzLCBidXQKKyAgICAjIGFyZSBhbHdheXMgdW5pbnRlcmVzdGluZworICAgIC86WwkgXSpmaWxlIGZvcm1hdCBwZVtpXVx7LDFcfS0vZAorICAgIC9eSW4gYXJjaGl2ZSBbXjpdKjovZAorICAgICMgRW5zdXJlIG1hcmtlciBpcyBwcmludGVkCisgICAgL149PT09TUFSSz09PT0vcAorICAgICMgUmVtb3ZlIGFsbCBsaW5lcyB3aXRoIGxlc3MgdGhhbiA0MyBjaGFyYWN0ZXJzCisgICAgL14uXHs0M1x9LyFkCisgICAgIyBGcm9tIHJlbWFpbmluZyBsaW5lcywgcmVtb3ZlIGZpcnN0IDQzIGNoYXJhY3RlcnMKKyAgICBzL14uXHs0M1x9Ly8nIHwKKyAgICAkU0VEIC1uICcKKyAgICAgICMgSm9pbiBtYXJrZXIgYW5kIGFsbCBsaW5lcyB1bnRpbCBuZXh0IG1hcmtlciBpbnRvIGEgc2luZ2xlIGxpbmUKKyAgICAgIC9ePT09PU1BUks9PT09LyBiIHBhcmEKKyAgICAgIEgKKyAgICAgICQgYiBwYXJhCisgICAgICBiCisgICAgICA6cGFyYQorICAgICAgeAorICAgICAgcy9cbi8vZworICAgICAgIyBSZW1vdmUgdGhlIG1hcmtlcgorICAgICAgcy9ePT09PU1BUks9PT09Ly8KKyAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIGRvdHMgYW5kIHdoaXRlc3BhY2UKKyAgICAgIHMvW1wuIFx0XSokLy8KKyAgICAgICMgUHJpbnQKKyAgICAgIC8uL3AnIHwKKyAgICAjIHdlIG5vdyBoYXZlIGEgbGlzdCwgb25lIGVudHJ5IHBlciBsaW5lLCBvZiB0aGUgc3RyaW5naWZpZWQKKyAgICAjIGNvbnRlbnRzIG9mIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIG9mIGFsbCBtZW1iZXJzIG9mIHRoZQorICAgICMgYXJjaGl2ZSB3aGljaCBwb3NzZXNzIHRoYXQgc2VjdGlvbi4gSGV1cmlzdGljOiBlbGltaW5hdGUKKyAgICAjIGFsbCB0aG9zZSB3aGljaCBoYXZlIGEgZmlyc3Qgb3Igc2Vjb25kIGNoYXJhY3RlciB0aGF0IGlzCisgICAgIyBhICcuJyAodGhhdCBpcywgb2JqZHVtcCdzIHJlcHJlc2VudGF0aW9uIG9mIGFuIHVucHJpbnRhYmxlCisgICAgIyBjaGFyYWN0ZXIuKSBUaGlzIHNob3VsZCB3b3JrIGZvciBhbGwgYXJjaGl2ZXMgd2l0aCBsZXNzIHRoYW4KKyAgICAjIDB4MzAyZiBleHBvcnRzIC0tIGJ1dCB3aWxsIGZhaWwgZm9yIERMTHMgd2hvc2UgbmFtZSBhY3R1YWxseQorICAgICMgYmVnaW5zIHdpdGggYSBsaXRlcmFsICcuJyBvciBhIHNpbmdsZSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkKKyAgICAjIGEgJy4nLgorICAgICMKKyAgICAjIE9mIHRob3NlIHRoYXQgcmVtYWluLCBwcmludCB0aGUgZmlyc3Qgb25lLgorICAgICRTRUQgLWUgJy9eXC4vZDsvXi5cLi9kO3EnCit9CisKKyMgZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYSBHTlUvYmludXRpbHMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19nbnVfaW1wbGliX3AgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX3Rvb2xfZmlsZSAiJDEiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgIGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3RtcD1gJE5NICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiB8IGV2YWwgIiRnbG9iYWxfc3ltYm9sX3BpcGUiIHwgJEVHUkVQICcgKF9oZWFkX1tBLVphLXowLTlfXStfW2FkXWwqfFtBLVphLXowLTlfXStfW2FkXWwqX2luYW1lKSQnYAorICB0ZXN0IC1uICIkZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfdG1wIgorfQorCisjIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYW4gTVMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19tc19pbXBsaWJfcCAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgZnVuY19jeWdtaW5nX21zX2ltcGxpYl90bXA9YCROTSAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgfCBldmFsICIkZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRHUkVQICdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUidgCisgIHRlc3QgLW4gIiRmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3RtcCIKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgQVJHCisjIFBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCisjIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorIyBpbXBvcnQgbGlicmFyeSBBUkcuCisjCisjIFRoaXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaXMgZm9yIHVzZSB3aGVuICRETExUT09MCisjIGRvZXMgbm90IHN1cHBvcnQgdGhlIC0taWRlbnRpZnktc3RyaWN0IG9wdGlvbi4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiBmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBiaW51dGlscyBpbXBvcnQgbGlicmFyeQorICAgIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0PWBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSAnLmlkYXRhJDcnICIkMSJgCisgIGVsaWYgZnVuY19jeWdtaW5nX21zX2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBtcy1nZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkKKyAgICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrX2NvcmUgJy5pZGF0YSQ2JyAiJDEiYAorICBlbHNlCisgICAgIyB1bmtub3duCisgICAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9IiIKKyAgZmkKK30KKworCisjIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKK2Z1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0CisgICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgorICAgIGlmIHRlc3QgIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iID0geWVzOyB0aGVuCisgICAgICBsb2NrZmlsZT0kZl9leF9hbl9hcl9vbGRsaWIubG9jaworICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGZpCisgICAgZnVuY19zaG93X2V2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwiXCRmX2V4X2FuX2FyX29sZGxpYlwiKSIgXAorCQkgICAnc3RhdD0kPzsgcm0gLWYgIiRsb2NrZmlsZSI7IGV4aXQgJHN0YXQnCisgICAgaWYgdGVzdCAiJGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbiIgPSB5ZXM7IHRoZW4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCBybSAtZiAiJGxvY2tmaWxlIgorICAgIGZpCisgICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgOgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9iamVjdCBuYW1lIGNvbmZsaWN0cyBpbiBhcmNoaXZlOiAkZl9leF9hbl9hcl9kaXIvJGZfZXhfYW5fYXJfb2xkbGliIgorICAgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgZ2VudG9wIG9sZGxpYiAuLi4KK2Z1bmNfZXh0cmFjdF9hcmNoaXZlcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKKyAgICBteV9vbGRsaWJzPSR7MSsiJEAifQorICAgIG15X29sZG9ianM9IiIKKyAgICBteV94bGliPSIiCisgICAgbXlfeGFicz0iIgorICAgIG15X3hkaXI9IiIKKworICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbworICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorICAgICAgY2FzZSAkbXlfeGxpYiBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7CisJKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7CisgICAgICBlc2FjCisgICAgICBmdW5jX2Jhc2VuYW1lICIkbXlfeGxpYiIKKyAgICAgIG15X3hsaWI9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIG15X3hsaWJfdT0kbXlfeGxpYgorICAgICAgd2hpbGUgOjsgZG8KKyAgICAgICAgY2FzZSAiICRleHRyYWN0ZWRfYXJjaGl2ZXMgIiBpbgorCSoiICRteV94bGliX3UgIiopCisJICBmdW5jX2FyaXRoICRleHRyYWN0ZWRfc2VyaWFsICsgMQorCSAgZXh0cmFjdGVkX3NlcmlhbD0kZnVuY19hcml0aF9yZXN1bHQKKwkgIG15X3hsaWJfdT1sdCRleHRyYWN0ZWRfc2VyaWFsLSRteV94bGliIDs7CisJKikgYnJlYWsgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBleHRyYWN0ZWRfYXJjaGl2ZXM9IiRleHRyYWN0ZWRfYXJjaGl2ZXMgJG15X3hsaWJfdSIKKyAgICAgIG15X3hkaXI9IiRteV9nZW50b3AvJG15X3hsaWJfdSIKKworICAgICAgZnVuY19ta2Rpcl9wICIkbXlfeGRpciIKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi1kYXJ3aW4qKQorCWZ1bmNfdmVyYm9zZSAiRXh0cmFjdGluZyAkbXlfeGFicyIKKwkjIERvIG5vdCBib3RoZXIgZG9pbmcgYW55dGhpbmcgaWYganVzdCBhIGRyeSBydW4KKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgZGFyd2luX29yaWdfZGlyPWBwd2RgCisJICBjZCAkbXlfeGRpciB8fCBleGl0ICQ/CisJICBkYXJ3aW5fYXJjaGl2ZT0kbXlfeGFicworCSAgZGFyd2luX2N1cmRpcj1gcHdkYAorCSAgZGFyd2luX2Jhc2VfYXJjaGl2ZT1gYmFzZW5hbWUgIiRkYXJ3aW5fYXJjaGl2ZSJgCisJICBkYXJ3aW5fYXJjaGVzPWAkTElQTyAtaW5mbyAiJGRhcndpbl9hcmNoaXZlIiAyPi9kZXYvbnVsbCB8ICRHUkVQIEFyY2hpdGVjdHVyZXMgMj4vZGV2L251bGwgfHwgdHJ1ZWAKKwkgIGlmIHRlc3QgLW4gIiRkYXJ3aW5fYXJjaGVzIjsgdGhlbgorCSAgICBkYXJ3aW5fYXJjaGVzPWAkRUNITyAiJGRhcndpbl9hcmNoZXMiIHwgJFNFRCAtZSAncy8uKmFyZTovLydgCisJICAgIGRhcndpbl9hcmNoPQorCSAgICBmdW5jX3ZlcmJvc2UgIiRkYXJ3aW5fYmFzZV9hcmNoaXZlIGhhcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICRkYXJ3aW5fYXJjaGVzIgorCSAgICBmb3IgZGFyd2luX2FyY2ggaW4gICRkYXJ3aW5fYXJjaGVzIDsgZG8KKwkgICAgICBmdW5jX21rZGlyX3AgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCisJICAgICAgJExJUE8gLXRoaW4gJGRhcndpbl9hcmNoIC1vdXRwdXQgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIgIiR7ZGFyd2luX2FyY2hpdmV9IgorCSAgICAgIGNkICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICJgcHdkYCIgIiR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCisJICAgICAgY2QgIiRkYXJ3aW5fY3VyZGlyIgorCSAgICAgICRSTSAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICBkb25lICMgJGRhcndpbl9hcmNoZXMKKyAgICAgICAgICAgICMjIE9rYXkgbm93IHdlJ3ZlIGEgYnVuY2ggb2YgdGhpbiBvYmplY3RzLCBnb3R0YSBmYXR0ZW4gdGhlbSB1cCA6KQorCSAgICBkYXJ3aW5fZmlsZWxpc3Q9YGZpbmQgdW5mYXQtJCQgLXR5cGUgZiAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkU0VEIC1lICIkYmFzZW5hbWUiIHwgc29ydCAtdWAKKwkgICAgZGFyd2luX2ZpbGU9CisJICAgIGRhcndpbl9maWxlcz0KKwkgICAgZm9yIGRhcndpbl9maWxlIGluICRkYXJ3aW5fZmlsZWxpc3Q7IGRvCisJICAgICAgZGFyd2luX2ZpbGVzPWBmaW5kIHVuZmF0LSQkIC1uYW1lICRkYXJ3aW5fZmlsZSAtcHJpbnQgfCBzb3J0IHwgJE5MMlNQYAorCSAgICAgICRMSVBPIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCisJICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0CisJICAgICRSTSAtcmYgdW5mYXQtJCQKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisJICBlbHNlCisJICAgIGNkICRkYXJ3aW5fb3JpZ19kaXIKKwkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJICBmaSAjICRkYXJ3aW5fYXJjaGVzCisJfSAjICEkb3B0X2RyeV9ydW4KKwk7OworICAgICAgKikKKyAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCBzb3J0IHwgJE5MMlNQYAorICAgIGRvbmUKKworICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgorfQorCisKKyMgZnVuY19lbWl0X3dyYXBwZXIgW2FyZz1ub10KKyMKKyMgRW1pdCBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb24gc3Rkb3V0LgorIyBEb24ndCBkaXJlY3RseSBvcGVuIGEgZmlsZSBiZWNhdXNlIHdlIG1heSB3YW50IHRvCisjIGluY29ycG9yYXRlIHRoZSBzY3JpcHQgY29udGVudHMgd2l0aGluIGEgY3lnd2luL21pbmd3CisjIHdyYXBwZXIgZXhlY3V0YWJsZS4gIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4KKyMgZnVuY19tb2RlX2xpbmsgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlcworIyBzZXQgdGhlcmVpbi4KKyMKKyMgQVJHIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZSBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUgorIyB2YXJpYWJsZSB3aWxsIHRha2UuICBJZiAneWVzJywgdGhlbiB0aGUgZW1pdHRlZCBzY3JpcHQKKyMgd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGlzIHN0b3JlZCBpcworIyB0aGUgJG9iamRpciBkaXJlY3RvcnkuICBUaGlzIGlzIGEgY3lnd2luL21pbmd3LXNwZWNpZmljCisjIGJlaGF2aW9yLgorZnVuY19lbWl0X3dyYXBwZXIgKCkKK3sKKwlmdW5jX2VtaXRfd3JhcHBlcl9hcmcxPSR7MS1ub30KKworCSRFQ0hPICJcCisjISAkU0hFTEwKKworIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisjIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKyMKKyMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisjIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorICBnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uPSckbWFjcm9fdmVyc2lvbicKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkRUNITyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBmaWxlPVwiXCQwXCIiCisKKyAgICBxRUNITz1gJEVDSE8gIiRFQ0hPIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICRFQ0hPICJcCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorXCQxCitfTFRFQ0hPX0VPRicKK30KKyAgICBFQ0hPPVwiJHFFQ0hPXCIKKyAgZmkKKworIyBWZXJ5IGJhc2ljIG9wdGlvbiBwYXJzaW5nLiBUaGVzZSBvcHRpb25zIGFyZSAoYSkgc3BlY2lmaWMgdG8KKyMgdGhlIGxpYnRvb2wgd3JhcHBlciwgKGIpIGFyZSBpZGVudGljYWwgYmV0d2VlbiB0aGUgd3JhcHBlcgorIyAvc2NyaXB0LyBhbmQgdGhlIHdyYXBwZXIgL2V4ZWN1dGFibGUvIHdoaWNoIGlzIHVzZWQgb25seSBvbgorIyB3aW5kb3dzIHBsYXRmb3JtcywgYW5kIChjKSBhbGwgYmVnaW4gd2l0aCB0aGUgc3RyaW5nICItLWx0LSIKKyMgKGFwcGxpY2F0aW9uIHByb2dyYW1zIGFyZSB1bmxpa2VseSB0byBoYXZlIG9wdGlvbnMgd2hpY2ggbWF0Y2gKKyMgdGhpcyBwYXR0ZXJuKS4KKyMKKyMgVGhlcmUgYXJlIG9ubHkgdHdvIHN1cHBvcnRlZCBvcHRpb25zOiAtLWx0LWRlYnVnIGFuZAorIyAtLWx0LWR1bXAtc2NyaXB0LiBUaGVyZSBpcywgZGVsaWJlcmF0ZWx5LCBubyAtLWx0LWhlbHAuCisjCisjIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGlzIHBhcnNpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIHRoZQorIyBzY3JpcHQncyAkMCB2YWx1ZSwgZm9sbG93ZWQgYnkgIiRAIi4KK2x0X29wdGlvbl9kZWJ1Zz0KK2Z1bmNfcGFyc2VfbHRfb3B0aW9ucyAoKQoreworICBsdF9zY3JpcHRfYXJnMD1cJDAKKyAgc2hpZnQKKyAgZm9yIGx0X29wdAorICBkbworICAgIGNhc2UgXCJcJGx0X29wdFwiIGluCisgICAgLS1sdC1kZWJ1ZykgbHRfb3B0aW9uX2RlYnVnPTEgOzsKKyAgICAtLWx0LWR1bXAtc2NyaXB0KQorICAgICAgICBsdF9kdW1wX0Q9XGBcJEVDSE8gXCJYXCRsdF9zY3JpcHRfYXJnMFwiIHwgJFNFRCAtZSAncy9eWC8vJyAtZSAncyUvW14vXSokJSUnXGAKKyAgICAgICAgdGVzdCBcIlhcJGx0X2R1bXBfRFwiID0gXCJYXCRsdF9zY3JpcHRfYXJnMFwiICYmIGx0X2R1bXBfRD0uCisgICAgICAgIGx0X2R1bXBfRj1cYFwkRUNITyBcIlhcJGx0X3NjcmlwdF9hcmcwXCIgfCAkU0VEIC1lICdzL15YLy8nIC1lICdzJV4uKi8lJSdcYAorICAgICAgICBjYXQgXCJcJGx0X2R1bXBfRC9cJGx0X2R1bXBfRlwiCisgICAgICAgIGV4aXQgMAorICAgICAgOzsKKyAgICAtLWx0LSopCisgICAgICAgIFwkRUNITyBcIlVucmVjb2duaXplZCAtLWx0LSBvcHRpb246ICdcJGx0X29wdCdcIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIFByaW50IHRoZSBkZWJ1ZyBiYW5uZXIgaW1tZWRpYXRlbHk6CisgIGlmIHRlc3QgLW4gXCJcJGx0X29wdGlvbl9kZWJ1Z1wiOyB0aGVuCisgICAgZWNobyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IGxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cIiAxPiYyCisgIGZpCit9CisKKyMgVXNlZCB3aGVuIC0tbHQtZGVidWcuIFByaW50cyBpdHMgYXJndW1lbnRzIHRvIHN0ZG91dAorIyAocmVkaXJlY3Rpb24gaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIpCitmdW5jX2x0X2R1bXBfYXJncyAoKQoreworICBsdF9kdW1wX2FyZ3NfTj0xOworICBmb3IgbHRfYXJnCisgIGRvCisgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndltcJGx0X2R1bXBfYXJnc19OXTogXCRsdF9hcmdcIgorICAgIGx0X2R1bXBfYXJnc19OPVxgZXhwciBcJGx0X2R1bXBfYXJnc19OICsgMVxgCisgIGRvbmUKK30KKworIyBDb3JlIGZ1bmN0aW9uIGZvciBsYXVuY2hpbmcgdGhlIHRhcmdldCBhcHBsaWNhdGlvbgorZnVuY19leGVjX3Byb2dyYW1fY29yZSAoKQoreworIgorICBjYXNlICRob3N0IGluCisgICMgQmFja3NsYXNoZXMgc2VwYXJhdGUgZGlyZWN0b3JpZXMgb24gcGxhaW4gd2luZG93cworICAqLSotbWluZ3cgfCAqLSotb3MyKiB8ICotY2VnY2MqKQorICAgICRFQ0hPICJcCisgICAgICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgICAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2WzBdOiBcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgMT4mMgorICAgICAgICBmdW5jX2x0X2R1bXBfYXJncyBcJHsxK1wiXCRAXCJ9IDE+JjIKKyAgICAgIGZpCisgICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKyAgICA7OworCisgICopCisgICAgJEVDSE8gIlwKKyAgICAgIGlmIHRlc3QgLW4gXCJcJGx0X29wdGlvbl9kZWJ1Z1wiOyB0aGVuCisgICAgICAgIFwkRUNITyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IG5ld2FyZ3ZbMF06IFwkcHJvZ2Rpci9cJHByb2dyYW1cIiAxPiYyCisgICAgICAgIGZ1bmNfbHRfZHVtcF9hcmdzIFwkezErXCJcJEBcIn0gMT4mMgorICAgICAgZmkKKyAgICAgIGV4ZWMgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQorIgorICAgIDs7CisgIGVzYWMKKyAgJEVDSE8gIlwKKyAgICAgIFwkRUNITyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkKlwiIDE+JjIKKyAgICAgIGV4aXQgMQorfQorCisjIEEgZnVuY3Rpb24gdG8gZW5jYXBzdWxhdGUgbGF1bmNoaW5nIHRoZSB0YXJnZXQgYXBwbGljYXRpb24KKyMgU3RyaXBzIG9wdGlvbnMgaW4gdGhlIC0tbHQtKiBuYW1lc3BhY2UgZnJvbSBcJEAgYW5kCisjIGxhdW5jaGVzIHRhcmdldCBhcHBsaWNhdGlvbiB3aXRoIHRoZSByZW1haW5pbmcgYXJndW1lbnRzLgorZnVuY19leGVjX3Byb2dyYW0gKCkKK3sKKyAgY2FzZSBcIiBcJCogXCIgaW4KKyAgKlxcIC0tbHQtKikKKyAgICBmb3IgbHRfd3JfYXJnCisgICAgZG8KKyAgICAgIGNhc2UgXCRsdF93cl9hcmcgaW4KKyAgICAgIC0tbHQtKikgOzsKKyAgICAgICopIHNldCB4IFwiXCRAXCIgXCJcJGx0X3dyX2FyZ1wiOyBzaGlmdDs7CisgICAgICBlc2FjCisgICAgICBzaGlmdAorICAgIGRvbmUgOzsKKyAgZXNhYworICBmdW5jX2V4ZWNfcHJvZ3JhbV9jb3JlIFwkezErXCJcJEBcIn0KK30KKworICAjIFBhcnNlIG9wdGlvbnMKKyAgZnVuY19wYXJzZV9sdF9vcHRpb25zIFwiXCQwXCIgXCR7MStcIlwkQFwifQorCisgICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCisgIHRoaXNkaXI9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlL1teL10qJCUlJ1xgCisgIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KKworICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KKyAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJFNFRCAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkRUNITyBcIlwkZmlsZVwiIHwgJFNFRCAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkRUNITyBcIlwkZmlsZVwiIHwgJFNFRCAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJFNFRCAtbiAncy8uKi0+IC8vcCdcYAorICBkb25lCisKKyAgIyBVc3VhbGx5ICdubycsIGV4Y2VwdCBvbiBjeWd3aW4vbWluZ3cgd2hlbiBlbWJlZGRlZCBpbnRvCisgICMgdGhlIGN3cmFwcGVyLgorICBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUj0kZnVuY19lbWl0X3dyYXBwZXJfYXJnMQorICBpZiB0ZXN0IFwiXCRXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUlwiID0gXCJ5ZXNcIjsgdGhlbgorICAgICMgc3BlY2lhbCBjYXNlIGZvciAnLicKKyAgICBpZiB0ZXN0IFwiXCR0aGlzZGlyXCIgPSBcIi5cIjsgdGhlbgorICAgICAgdGhpc2Rpcj1cYHB3ZFxgCisgICAgZmkKKyAgICAjIHJlbW92ZSAubGlicyBmcm9tIHRoaXNkaXIKKyAgICBjYXNlIFwiXCR0aGlzZGlyXCIgaW4KKyAgICAqW1xcXFwvXSRvYmpkaXIgKSB0aGlzZGlyPVxgXCRFQ0hPIFwiXCR0aGlzZGlyXCIgfCAkU0VEICdzJVtcXFxcL11bXlxcXFwvXSokJSUnXGAgOzsKKyAgICAkb2JqZGlyICkgICB0aGlzZGlyPS4gOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KKyAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAorICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgorIgorCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgICRFQ0hPICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRNS0RJUiBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgICRFQ0hPICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRFQ0hPIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgZmkKKworICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJFJNIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgICRFQ0hPICJcCisgIHByb2dyYW09JyRvdXRwdXRuYW1lJworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorIgorCWZpCisKKwkkRUNITyAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgorCSMKKwkjIEZpeCB0aGUgRExMIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4gIERvIHRoaXMgYmVmb3JlIHByZXBlbmRpbmcKKwkjIHRvIHNobGlicGF0aCwgYmVjYXVzZSBvbiBXaW5kb3dzLCBib3RoIGFyZSBQQVRIIGFuZCB1bmluc3RhbGxlZAorCSMgbGlicmFyaWVzIG11c3QgY29tZSBmaXJzdC4KKwlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKwkgICRFQ0hPICJcCisgICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKKyAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAorIgorCWZpCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkRUNITyBcIlwkJHNobGlicGF0aF92YXJcIiB8ICRTRUQgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSRFQ0hPICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKyAgICAgIGZ1bmNfZXhlY19wcm9ncmFtIFwkezErXCJcJEBcIn0KKyAgICBmaQorICBlbHNlCisgICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgorICAgIFwkRUNITyBcIlwkMDogZXJyb3I6IFxcXGBcJHByb2dkaXIvXCRwcm9ncmFtJyBkb2VzIG5vdCBleGlzdFwiIDE+JjIKKyAgICBcJEVDSE8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKKyAgICBcJEVDSE8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCit9CisKKworIyBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisjIGVtaXQgdGhlIHNvdXJjZSBjb2RlIGZvciBhIHdyYXBwZXIgZXhlY3V0YWJsZSBvbiBzdGRvdXQKKyMgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBmdW5jX21vZGVfbGluayBiZWNhdXNlCisjIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGUgc2V0IHRoZXJlaW4uCitmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjICgpCit7CisJY2F0IDw8RU9GCisKKy8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKworICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisgICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisKKyAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKyovCitFT0YKKwkgICAgY2F0IDw8IkVPRiIKKyNpZmRlZiBfTVNDX1ZFUgorIyBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPHByb2Nlc3MuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaWZkZWYgX19DWUdXSU5fXworIyAgaW5jbHVkZSA8aW8uaD4KKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKy8qIGRlY2xhcmF0aW9ucyBvZiBub24tQU5TSSBmdW5jdGlvbnMgKi8KKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBpZmRlZiBfX1NUUklDVF9BTlNJX18KK2ludCBfcHV0ZW52IChjb25zdCBjaGFyICopOworIyBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyBpZmRlZiBfX1NUUklDVF9BTlNJX18KK2NoYXIgKnJlYWxwYXRoIChjb25zdCBjaGFyICosIGNoYXIgKik7CitpbnQgcHV0ZW52IChjaGFyICopOworaW50IHNldGVudiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjIGVuZGlmCisvKiAjZWxpZiBkZWZpbmVkIChvdGhlciBwbGF0Zm9ybXMpIC4uLiAqLworI2VuZGlmCisKKy8qIHBvcnRhYmlsaXR5IGRlZmluZXMsIGV4Y2x1ZGluZyBwYXRoIGhhbmRsaW5nIG1hY3JvcyAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjIGRlZmluZSBzdGF0ICAgIF9zdGF0CisjIGRlZmluZSBjaG1vZCAgIF9jaG1vZAorIyBkZWZpbmUgZ2V0Y3dkICBfZ2V0Y3dkCisjIGRlZmluZSBwdXRlbnYgIF9wdXRlbnYKKyMgZGVmaW5lIFNfSVhVU1IgX1NfSUVYRUMKKyMgaWZuZGVmIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgX0lOVFBUUl9UX0RFRklORUQKKyMgIGRlZmluZSBpbnRwdHJfdCBpbnQKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjIGRlZmluZSBzdGF0ICAgIF9zdGF0CisjIGRlZmluZSBjaG1vZCAgIF9jaG1vZAorIyBkZWZpbmUgZ2V0Y3dkICBfZ2V0Y3dkCisjIGRlZmluZSBwdXRlbnYgIF9wdXRlbnYKKyNlbGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgZGVmaW5lIEhBVkVfU0VURU5WCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisvKiAjZWxpZiBkZWZpbmVkIChvdGhlciBwbGF0Zm9ybXMpIC4uLiAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBQQVRIX01BWAorI2VsaWYgZGVmaW5lZChNQVhQQVRITEVOKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBNQVhQQVRITEVOCisjZWxzZQorIyBkZWZpbmUgTFRfUEFUSE1BWCAxMDI0CisjZW5kaWYKKworI2lmbmRlZiBTX0lYT1RICisjIGRlZmluZSBTX0lYT1RIIDAKKyNlbmRpZgorI2lmbmRlZiBTX0lYR1JQCisjIGRlZmluZSBTX0lYR1JQIDAKKyNlbmRpZgorCisvKiBwYXRoIGhhbmRsaW5nIHBvcnRhYmlsaXR5IG1hY3JvcyAqLworI2lmbmRlZiBESVJfU0VQQVJBVE9SCisjIGRlZmluZSBESVJfU0VQQVJBVE9SICcvJworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfX0RKR1BQX18pIHx8IFwKKyAgZGVmaW5lZCAoX19PUzJfXykKKyMgZGVmaW5lIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisjIGlmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBESVJfU0VQQVJBVE9SXzIgJ1xcJworIyBlbmRpZgorIyBpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyAgZGVmaW5lIFBBVEhfU0VQQVJBVE9SXzIgJzsnCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpICgoY2gpID09IERJUl9TRVBBUkFUT1IpCisjZWxzZSAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpIFwKKwkoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKKyNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKworI2lmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1IpCisjZWxzZSAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1JfMikKKyNlbmRpZiAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgRk9QRU5fV0IKKyMgZGVmaW5lIEZPUEVOX1dCICJ3IgorI2VuZGlmCisjaWZuZGVmIF9PX0JJTkFSWQorIyBkZWZpbmUgX09fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCisjZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKKyAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKK30gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKExUX0RFQlVHV1JBUFBFUikKK3N0YXRpYyBpbnQgbHRfZGVidWcgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbHRfZGVidWcgPSAwOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9ICJsaWJ0b29sLXdyYXBwZXIiOyAvKiBpbiBjYXNlIHhzdHJkdXAgZmFpbHMgKi8KKwordm9pZCAqeG1hbGxvYyAoc2l6ZV90IG51bSk7CitjaGFyICp4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOworY29uc3QgY2hhciAqYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKTsKK2NoYXIgKmZpbmRfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqd3JhcHBlcik7CitjaGFyICpjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpOworaW50IG1ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7CitpbnQgY2hlY2tfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7CitjaGFyICpzdHJlbmR6YXAgKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKK3ZvaWQgbHRfZGVidWdwcmludGYgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkIGx0X2ZhdGFsIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKK3N0YXRpYyBjb25zdCBjaGFyICpub25udWxsIChjb25zdCBjaGFyICpzKTsKK3N0YXRpYyBjb25zdCBjaGFyICpub25lbXB0eSAoY29uc3QgY2hhciAqcyk7Cit2b2lkIGx0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworY2hhciAqbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKTsKK3ZvaWQgbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Cit2b2lkIGx0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworY2hhciAqKnByZXBhcmVfc3Bhd24gKGNoYXIgKiphcmd2KTsKK3ZvaWQgbHRfZHVtcF9zY3JpcHQgKEZJTEUgKmYpOworRU9GCisKKwkgICAgY2F0IDw8RU9GCit2b2xhdGlsZSBjb25zdCBjaGFyICogTUFHSUNfRVhFID0gIiRtYWdpY19leGUiOworY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBUk5BTUUgPSAiJHNobGlicGF0aF92YXIiOworRU9GCisKKwkgICAgaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aCAiJHRlbXBfcnBhdGgiCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IjsKK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8IkVPRiIKK2NvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiRkbGxzZWFyY2hwYXRoOiIKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQVJOQU1FID0gIlBBVEgiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICIiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiIjsKK0VPRgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICJsdC0kb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBUQVJHRVRfUFJPR1JBTV9OQU1FID0gIiRvdXRwdXRuYW1lIjsgLyogaG9wZWZ1bGx5LCBubyAuZXhlICovCitFT0YKKwkgICAgZmkKKworCisJICAgIGNhdCA8PCJFT0YiCisKKyNkZWZpbmUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVggICAgICAgICAiLS1sdC0iCisKK3N0YXRpYyBjb25zdCBjaGFyICpsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYOworc3RhdGljIGNvbnN0IGNoYXIgKmR1bXBzY3JpcHRfb3B0ICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImR1bXAtc2NyaXB0IjsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWJ1Z19vcHQgICAgICAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkZWJ1ZyI7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCAgbmV3YXJnYzsKKyAgY2hhciAqdG1wX3BhdGhzcGVjOworICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX25hbWU7CisgIGNoYXIgKnRhcmdldF9uYW1lOworICBjaGFyICpsdF9hcmd2X3plcm87CisgIGludHB0cl90IHJ2YWwgPSAxMjc7CisKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7CisgIG5ld2FyZ3ogPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKKworICAvKiB2ZXJ5IHNpbXBsZSBhcmcgcGFyc2luZzsgZG9uJ3Qgd2FudCB0byByZWx5IG9uIGdldG9wdAorICAgKiBhbHNvLCBjb3B5IGFsbCBub24gY3dyYXBwZXIgb3B0aW9ucyB0byBuZXdhcmd6LCBleGNlcHQKKyAgICogYXJnelswXSwgd2hpY2ggaXMgaGFuZGxlZCBkaWZmZXJlbnRseQorICAgKi8KKyAgbmV3YXJnYz0wOworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGR1bXBzY3JpcHRfb3B0KSA9PSAwKQorCXsKK0VPRgorCSAgICBjYXNlICIkaG9zdCIgaW4KKwkgICAgICAqbWluZ3cqIHwgKmN5Z3dpbiogKQorCQkjIG1ha2Ugc3Rkb3V0IHVzZSAidW5peCIgbGluZSBlbmRpbmdzCisJCWVjaG8gIiAgICAgICAgICBzZXRtb2RlKDEsX09fQklOQVJZKTsiCisJCTs7CisJICAgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCisJICBsdF9kdW1wX3NjcmlwdCAoc3Rkb3V0KTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGRlYnVnX29wdCkgPT0gMCkKKwl7CisgICAgICAgICAgbHRfZGVidWcgPSAxOworICAgICAgICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4KSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogaG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZSwgYnV0IGl0IGlzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2Uga25vdyBhYm91dCBhbmQKKyAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCwgYWJvdmUgKGlubHVkaW5nIGR1bXAtc2NyaXB0KSwgdGhlbgorICAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvci4gT3RoZXJ3aXNlLCB0YXJnZXRzIG1pZ2h0IGJlZ2luIHRvIGJlbGlldmUKKyAgICAgICAgICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIHVzZSBvcHRpb25zIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGZpcnN0IHRpbWUgYW55IHVzZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHdlJ2xsCisgICAgICAgICAgICAgbmVlZCB0byBtYWtlIExUV1JBUFBFUl9PUFRJT05fUFJFRklYIGEgY29uZmlndXJlLXRpbWUgb3B0aW9uCisgICAgICAgICAgICAgb3IgYSBjb25maWd1cmUuYWMtc2V0dGFibGUgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICJ1bnJlY29nbml6ZWQgJXMgb3B0aW9uOiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgbHR3cmFwcGVyX29wdGlvbl9wcmVmaXgsIGFyZ3ZbaV0pOworICAgICAgICB9CisgICAgICAvKiBvdGhlcndpc2UgLi4uICovCisgICAgICBuZXdhcmd6WysrbmV3YXJnY10gPSB4c3RyZHVwIChhcmd2W2ldKTsKKyAgICB9CisgIG5ld2FyZ3pbKytuZXdhcmdjXSA9IE5VTEw7CisKK0VPRgorCSAgICBjYXQgPDxFT0YKKyAgLyogVGhlIEdOVSBiYW5uZXIgbXVzdCBiZSB0aGUgZmlyc3Qgbm9uLWVycm9yIGRlYnVnIG1lc3NhZ2UgKi8KKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgImxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cbiIpOworRU9GCisJICAgIGNhdCA8PCJFT0YiCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgYXJndlswXTogJXNcbiIsIGFyZ3ZbMF0pOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIHByb2dyYW1fbmFtZTogJXNcbiIsIHByb2dyYW1fbmFtZSk7CisKKyAgdG1wX3BhdGhzcGVjID0gZmluZF9leGVjdXRhYmxlIChhcmd2WzBdKTsKKyAgaWYgKHRtcF9wYXRoc3BlYyA9PSBOVUxMKQorICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJjb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYmVmb3JlIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICB0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9wYXRoID0gY2hhc2Vfc3ltbGlua3MgKHRtcF9wYXRoc3BlYyk7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYWZ0ZXIgc3ltbGluayBjaGFzZSkgYXQ6ICVzXG4iLAorCQkgIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7CisgIHN0cmVuZHphcCAoYWN0dWFsX2N3cmFwcGVyX3BhdGgsIGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKKworICAvKiB3cmFwcGVyIG5hbWUgdHJhbnNmb3JtcyAqLworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9uYW1lLCAiLmV4ZSIpOworICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiLCAxKTsKKyAgWEZSRUUgKGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKKyAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB0bXBfcGF0aHNwZWM7CisgIHRtcF9wYXRoc3BlYyA9IDA7CisKKyAgLyogdGFyZ2V0X25hbWUgdHJhbnNmb3JtcyAtLSB1c2UgYWN0dWFsIHRhcmdldCBwcm9ncmFtIG5hbWU7IG1pZ2h0IGhhdmUgbHQtIHByZWZpeCAqLworICB0YXJnZXRfbmFtZSA9IHhzdHJkdXAgKGJhc2VfbmFtZSAoVEFSR0VUX1BST0dSQU1fTkFNRSkpOworICBzdHJlbmR6YXAgKHRhcmdldF9uYW1lLCAiLmV4ZSIpOworICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyICh0YXJnZXRfbmFtZSwgIi5leGUiLCAxKTsKKyAgWEZSRUUgKHRhcmdldF9uYW1lKTsKKyAgdGFyZ2V0X25hbWUgPSB0bXBfcGF0aHNwZWM7CisgIHRtcF9wYXRoc3BlYyA9IDA7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKG1haW4pIGxpYnRvb2wgdGFyZ2V0IG5hbWU6ICVzXG4iLAorCQkgIHRhcmdldF9uYW1lKTsKK0VPRgorCisJICAgIGNhdCA8PEVPRgorICBuZXdhcmd6WzBdID0KKyAgICBYTUFMTE9DIChjaGFyLCAoc3RybGVuIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkgKworCQkgICAgc3RybGVuICgiJG9iamRpciIpICsgMSArIHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX25hbWUpICsgMSkpOworICBzdHJjcHkgKG5ld2FyZ3pbMF0sIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiJG9iamRpciIpOworICBzdHJjYXQgKG5ld2FyZ3pbMF0sICIvIik7CitFT0YKKworCSAgICBjYXQgPDwiRU9GIgorICAvKiBzdG9wIGhlcmUsIGFuZCBjb3B5IHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcyB0d2ljZSAqLworICB0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChuZXdhcmd6WzBdKTsKKworICAvKiBkbyBOT1Qgd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlLCBzbyB1c2UgYWN0dWFsX2N3cmFwcGVyX25hbWUgKi8KKyAgc3RyY2F0IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogRE8gd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlIGlmIGl0IGV4aXN0cywgc28gdXNlIHRhcmdldF9uYW1lICovCisgIGx0X2FyZ3ZfemVybyA9IGx0X2V4dGVuZF9zdHIgKHRtcF9wYXRoc3BlYywgdGFyZ2V0X25hbWUsIDEpOworICBYRlJFRSAodG1wX3BhdGhzcGVjKTsKKyAgdG1wX3BhdGhzcGVjID0gTlVMTDsKK0VPRgorCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJICAgIGNhdCA8PCJFT0YiCisgIHsKKyAgICBjaGFyKiBwOworICAgIHdoaWxlICgocCA9IHN0cmNociAobmV3YXJnelswXSwgJ1xcJykpICE9IE5VTEwpCisgICAgICB7CisJKnAgPSAnLyc7CisgICAgICB9CisgICAgd2hpbGUgKChwID0gc3RyY2hyIChsdF9hcmd2X3plcm8sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICB9CitFT0YKKwkgICAgOzsKKwkgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgbHRfc2V0ZW52ICgiQklOX1NIIiwgInhwZzQiKTsgLyogZm9yIFRydTY0ICovCisgIGx0X3NldGVudiAoIkRVQUxDQVNFIiwgIjEiKTsgIC8qIGZvciBNU0sgc2ggKi8KKyAgLyogVXBkYXRlIHRoZSBETEwgc2VhcmNocGF0aC4gIEVYRV9QQVRIX1ZBTFVFICgkZGxsc2VhcmNocGF0aCkgbXVzdAorICAgICBiZSBwcmVwZW5kZWQgYmVmb3JlICh0aGF0IGlzLCBhcHBlYXIgYWZ0ZXIpIExJQl9QQVRIX1ZBTFVFICgkdGVtcF9ycGF0aCkKKyAgICAgYmVjYXVzZSBvbiBXaW5kb3dzLCBib3RoICpfVkFSTkFNRXMgYXJlIFBBVEggYnV0IHVuaW5zdGFsbGVkCisgICAgIGxpYnJhcmllcyBtdXN0IGNvbWUgZmlyc3QuICovCisgIGx0X3VwZGF0ZV9leGVfcGF0aCAoRVhFX1BBVEhfVkFSTkFNRSwgRVhFX1BBVEhfVkFMVUUpOworICBsdF91cGRhdGVfbGliX3BhdGggKExJQl9QQVRIX1ZBUk5BTUUsIExJQl9QQVRIX1ZBTFVFKTsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIGx0X2FyZ3ZfemVybzogJXNcbiIsCisJCSAgbm9ubnVsbCAobHRfYXJndl96ZXJvKSk7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdhcmdjOyBpKyspCisgICAgeworICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBuZXdhcmd6WyVkXTogJXNcbiIsCisJCSAgICAgIGksIG5vbm51bGwgKG5ld2FyZ3pbaV0pKTsKKyAgICB9CisKK0VPRgorCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJCWNhdCA8PCJFT0YiCisgIC8qIGV4ZWN2IGRvZXNuJ3QgYWN0dWFsbHkgd29yayBvbiBtaW5ndyBhcyBleHBlY3RlZCBvbiB1bml4ICovCisgIG5ld2FyZ3ogPSBwcmVwYXJlX3NwYXduIChuZXdhcmd6KTsKKyAgcnZhbCA9IF9zcGF3bnYgKF9QX1dBSVQsIGx0X2FyZ3ZfemVybywgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBuZXdhcmd6KTsKKyAgaWYgKHJ2YWwgPT0gLTEpCisgICAgeworICAgICAgLyogZmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgKi8KKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICIobWFpbikgZmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQgXCIlc1wiOiAlc1xuIiwKKwkJICAgICAgbHRfYXJndl96ZXJvLCBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKyAgcmV0dXJuIHJ2YWw7CitFT0YKKwkJOzsKKwkgICAgICAqKQorCQljYXQgPDwiRU9GIgorICBleGVjdiAobHRfYXJndl96ZXJvLCBuZXdhcmd6KTsKKyAgcmV0dXJuIHJ2YWw7IC8qID0xMjcsIGJ1dCBhdm9pZHMgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcgKi8KK0VPRgorCQk7OworCSAgICBlc2FjCisKKwkgICAgY2F0IDw8IkVPRiIKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3QgbnVtKQoreworICB2b2lkICpwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOworICBpZiAoIXApCisgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgIm1lbW9yeSBleGhhdXN0ZWQiKTsKKworICByZXR1cm4gcDsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIHJldHVybiBzdHJpbmcgPyBzdHJjcHkgKChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLAorCQkJICBzdHJpbmcpIDogTlVMTDsKK30KKworY29uc3QgY2hhciAqCitiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGNvbnN0IGNoYXIgKmJhc2U7CisKKyNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKKyAgLyogU2tpcCBvdmVyIHRoZSBkaXNrIG5hbWUgaW4gTVNET1MgcGF0aG5hbWVzLiAqLworICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIG5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJzonKQorICAgIG5hbWUgKz0gMjsKKyNlbmRpZgorCisgIGZvciAoYmFzZSA9IG5hbWU7ICpuYW1lOyBuYW1lKyspCisgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKCpuYW1lKSkKKyAgICAgIGJhc2UgPSBuYW1lICsgMTsKKyAgcmV0dXJuIGJhc2U7Cit9CisKK2ludAorY2hlY2tfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihjaGVja19leGVjdXRhYmxlKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBub25lbXB0eSAocGF0aCkpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICAgICYmIChzdC5zdF9tb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQoreworICBpbnQgcnZhbCA9IDA7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFrZV9leGVjdXRhYmxlKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBub25lbXB0eSAocGF0aCkpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhdCAocGF0aCwgJnN0KSA+PSAwKQorICAgIHsKKyAgICAgIHJ2YWwgPSBjaG1vZCAocGF0aCwgc3Quc3RfbW9kZSB8IFNfSVhPVEggfCBTX0lYR1JQIHwgU19JWFVTUik7CisgICAgfQorICByZXR1cm4gcnZhbDsKK30KKworLyogU2VhcmNoZXMgZm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIHdyYXBwZXIuICBSZXR1cm5zCisgICBuZXdseSBhbGxvY2F0ZWQgZnVsbCBwYXRoIG5hbWUgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgICBEb2VzIG5vdCBjaGFzZSBzeW1saW5rcywgZXZlbiBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoZW0uCisqLworY2hhciAqCitmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpCit7CisgIGludCBoYXNfc2xhc2ggPSAwOworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpwX25leHQ7CisgIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLworICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07CisgIGludCB0bXBfbGVuOworICBjaGFyICpjb25jYXRfbmFtZTsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKGZpbmRfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHdyYXBwZXIpKTsKKworICBpZiAoKHdyYXBwZXIgPT0gTlVMTCkgfHwgKCp3cmFwcGVyID09ICdcMCcpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFic29sdXRlIHBhdGg/ICovCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCisgICAgeworICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICh3cmFwcGVyWzBdKSkKKwl7CisJICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworCSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwl9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgICAgfQorI2VuZGlmCisKKyAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKKyAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgeworCWhhc19zbGFzaCA9IDE7CisJYnJlYWs7CisgICAgICB9CisgIGlmICghaGFzX3NsYXNoKQorICAgIHsKKyAgICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOworICAgICAgaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHBfbmV4dCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnE7CisJICAgICAgc2l6ZV90IHBfbGVuOworCSAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisJCWlmIChJU19QQVRIX1NFUEFSQVRPUiAoKnEpKQorCQkgIGJyZWFrOworCSAgICAgIHBfbGVuID0gcSAtIHA7CisJICAgICAgcF9uZXh0ID0gKCpxID09ICdcMCcgPyBxIDogcSArIDEpOworCSAgICAgIGlmIChwX2xlbiA9PSAwKQorCQl7CisJCSAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisJCSAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiZ2V0Y3dkIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworCQkgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisJCSAgY29uY2F0X25hbWUgPQorCQkgICAgWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisJCSAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKKwkJICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKwkJICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgY29uY2F0X25hbWUgPQorCQkgICAgWE1BTExPQyAoY2hhciwgcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHAsIHBfbGVuKTsKKwkJICBjb25jYXRfbmFtZVtwX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHBfbGVuICsgMSwgd3JhcHBlcik7CisJCX0KKwkgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorCQlyZXR1cm4gY29uY2F0X25hbWU7CisJICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwkgICAgfQorCX0KKyAgICAgIC8qIG5vdCBmb3VuZCBpbiBQQVRIOyBhc3N1bWUgY3VyZGlyICovCisgICAgfQorICAvKiBSZWxhdGl2ZSBwYXRoIHwgbm90IGZvdW5kIGluIHBhdGg6IHByZXBlbmQgY3dkICovCisgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiZ2V0Y3dkIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisgIGNvbmNhdF9uYW1lID0gWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCisgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICBYRlJFRSAoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpCit7CisjaWZuZGVmIFNfSVNMTksKKyAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyNlbHNlCisgIGNoYXIgYnVmW0xUX1BBVEhNQVhdOworICBzdHJ1Y3Qgc3RhdCBzOworICBjaGFyICp0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChwYXRoc3BlYyk7CisgIGNoYXIgKnA7CisgIGludCBoYXNfc3ltbGlua3MgPSAwOworICB3aGlsZSAoc3RybGVuICh0bXBfcGF0aHNwZWMpICYmICFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICAgImNoZWNraW5nIHBhdGggY29tcG9uZW50IGZvciBzeW1saW5rczogJXNcbiIsCisJCSAgICAgIHRtcF9wYXRoc3BlYyk7CisgICAgICBpZiAobHN0YXQgKHRtcF9wYXRoc3BlYywgJnMpID09IDApCisJeworCSAgaWYgKFNfSVNMTksgKHMuc3RfbW9kZSkgIT0gMCkKKwkgICAgeworCSAgICAgIGhhc19zeW1saW5rcyA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgbGFzdCBESVJfU0VQQVJBVE9SICovCisJICBwID0gdG1wX3BhdGhzcGVjICsgc3RybGVuICh0bXBfcGF0aHNwZWMpIC0gMTsKKwkgIHdoaWxlICgocCA+IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQorCSAgICBwLS07CisJICBpZiAoKHAgPT0gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCisJICAgIHsKKwkgICAgICAvKiBubyBtb3JlIERJUl9TRVBBUkFUT1JTIGxlZnQgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKnAgPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgImVycm9yIGFjY2Vzc2luZyBmaWxlIFwiJXNcIjogJXMiLAorCQkgICAgdG1wX3BhdGhzcGVjLCBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisJfQorICAgIH0KKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgaWYgKCFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyAgICB9CisKKyAgdG1wX3BhdGhzcGVjID0gcmVhbHBhdGggKHBhdGhzcGVjLCBidWYpOworICBpZiAodG1wX3BhdGhzcGVjID09IDApCisgICAgeworICAgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJImNvdWxkIG5vdCBmb2xsb3cgc3ltbGlua3MgZm9yICVzIiwgcGF0aHNwZWMpOworICAgIH0KKyAgcmV0dXJuIHhzdHJkdXAgKHRtcF9wYXRoc3BlYyk7CisjZW5kaWYKK30KKworY2hhciAqCitzdHJlbmR6YXAgKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KQoreworICBzaXplX3QgbGVuLCBwYXRsZW47CisKKyAgYXNzZXJ0IChzdHIgIT0gTlVMTCk7CisgIGFzc2VydCAocGF0ICE9IE5VTEwpOworCisgIGxlbiA9IHN0cmxlbiAoc3RyKTsKKyAgcGF0bGVuID0gc3RybGVuIChwYXQpOworCisgIGlmIChwYXRsZW4gPD0gbGVuKQorICAgIHsKKyAgICAgIHN0ciArPSBsZW4gLSBwYXRsZW47CisgICAgICBpZiAoc3RyY21wIChzdHIsIHBhdCkgPT0gMCkKKwkqc3RyID0gJ1wwJzsKKyAgICB9CisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQKK2x0X2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaWYgKGx0X2RlYnVnKQorICAgIHsKKyAgICAgICh2b2lkKSBmcHJpbnRmIChzdGRlcnIsICIlczolczolZDogIiwgcHJvZ3JhbV9uYW1lLCBmaWxlLCBsaW5lKTsKKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworICAgICAgKHZvaWQpIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2x0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqZmlsZSwKKwkgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1vZGUsCisJICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZhX2xpc3QgYXApCit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiVkOiAlczogIiwgcHJvZ3JhbV9uYW1lLCBmaWxlLCBsaW5lLCBtb2RlKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXApOworICBmcHJpbnRmIChzdGRlcnIsICIuXG4iKTsKKworICBpZiAoZXhpdF9zdGF0dXMgPj0gMCkKKyAgICBleGl0IChleGl0X3N0YXR1cyk7Cit9CisKK3ZvaWQKK2x0X2ZhdGFsIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsIGZpbGUsIGxpbmUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK25vbm51bGwgKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiBzID8gcyA6ICIobnVsbCkiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitub25lbXB0eSAoY29uc3QgY2hhciAqcykKK3sKKyAgcmV0dXJuIChzICYmICEqcykgPyAiKGVtcHR5KSIgOiBub25udWxsIChzKTsKK30KKwordm9pZAorbHRfc2V0ZW52IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3NldGVudikgc2V0dGluZyAnJXMnIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKKyAgeworI2lmZGVmIEhBVkVfU0VURU5WCisgICAgLyogYWx3YXlzIG1ha2UgYSBjb3B5LCBmb3IgY29uc2lzdGVuY3kgd2l0aCAhSEFWRV9TRVRFTlYgKi8KKyAgICBjaGFyICpzdHIgPSB4c3RyZHVwICh2YWx1ZSk7CisgICAgc2V0ZW52IChuYW1lLCBzdHIsIDEpOworI2Vsc2UKKyAgICBpbnQgbGVuID0gc3RybGVuIChuYW1lKSArIDEgKyBzdHJsZW4gKHZhbHVlKSArIDE7CisgICAgY2hhciAqc3RyID0gWE1BTExPQyAoY2hhciwgbGVuKTsKKyAgICBzcHJpbnRmIChzdHIsICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKKyAgICBpZiAocHV0ZW52IChzdHIpICE9IEVYSVRfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgWEZSRUUgKHN0cik7CisgICAgICB9CisjZW5kaWYKKyAgfQorfQorCitjaGFyICoKK2x0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCkKK3sKKyAgY2hhciAqbmV3X3ZhbHVlOworICBpZiAob3JpZ192YWx1ZSAmJiAqb3JpZ192YWx1ZSkKKyAgICB7CisgICAgICBpbnQgb3JpZ192YWx1ZV9sZW4gPSBzdHJsZW4gKG9yaWdfdmFsdWUpOworICAgICAgaW50IGFkZF9sZW4gPSBzdHJsZW4gKGFkZCk7CisgICAgICBuZXdfdmFsdWUgPSBYTUFMTE9DIChjaGFyLCBhZGRfbGVuICsgb3JpZ192YWx1ZV9sZW4gKyAxKTsKKyAgICAgIGlmICh0b19lbmQpCisgICAgICAgIHsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgb3JpZ192YWx1ZSk7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBvcmlnX3ZhbHVlX2xlbiwgYWRkKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUsIGFkZCk7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBhZGRfbGVuLCBvcmlnX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld192YWx1ZSA9IHhzdHJkdXAgKGFkZCk7CisgICAgfQorICByZXR1cm4gbmV3X3ZhbHVlOworfQorCit2b2lkCitsdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICIobHRfdXBkYXRlX2V4ZV9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKKworICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCisgICAgeworICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICAgICAgLyogc29tZSBzeXN0ZW1zIGNhbid0IGNvcGUgd2l0aCBhICc6Jy10ZXJtaW5hdGVkIHBhdGggIycgKi8KKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSk7CisgICAgICB3aGlsZSAoKChsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSkpID4gMCkgJiYgSVNfUEFUSF9TRVBBUkFUT1IgKG5ld192YWx1ZVtsZW4tMV0pKQorICAgICAgICB7CisgICAgICAgICAgbmV3X3ZhbHVlW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKwordm9pZAorbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3VwZGF0ZV9saWJfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisKKyAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQorICAgIHsKKyAgICAgIGNoYXIgKm5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKworRU9GCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJCWNhdCA8PCJFT0YiCisKKy8qIFByZXBhcmVzIGFuIGFyZ3VtZW50IHZlY3RvciBiZWZvcmUgY2FsbGluZyBzcGF3bigpLgorICAgTm90ZSB0aGF0IHNwYXduKCkgZG9lcyBub3QgYnkgaXRzZWxmIGNhbGwgdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIKKyAgICAgKGdldGVudiAoIkNPTVNQRUMiKSAhPSBOVUxMID8gZ2V0ZW52ICgiQ09NU1BFQyIpIDoKKyAgICAgICh7IE9TVkVSU0lPTklORk8gdjsgdi5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk8pOworICAgICAgICAgR2V0VmVyc2lvbkV4KCZ2KTsKKyAgICAgICAgIHYuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVDsKKyAgICAgIH0pID8gImNtZC5leGUiIDogImNvbW1hbmQuY29tIikuCisgICBJbnN0ZWFkIGl0IHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5ICcgJywgYW5kIGNhbGxzCisgICBDcmVhdGVQcm9jZXNzKCkuICBXZSBtdXN0IHF1b3RlIHRoZSBhcmd1bWVudHMgc2luY2UgV2luMzIgQ3JlYXRlUHJvY2VzcygpCisgICBpbnRlcnByZXRzIGNoYXJhY3RlcnMgbGlrZSAnICcsICdcdCcsICdcXCcsICciJyAoYnV0IG5vdCAnPCcgYW5kICc+JykgaW4gYQorICAgc3BlY2lhbCB3YXk6CisgICAtIFNwYWNlIGFuZCB0YWIgYXJlIGludGVycHJldGVkIGFzIGRlbGltaXRlcnMuIFRoZXkgYXJlIG5vdCB0cmVhdGVkIGFzCisgICAgIGRlbGltaXRlcnMgaWYgdGhleSBhcmUgc3Vycm91bmRlZCBieSBkb3VibGUgcXVvdGVzOiAiLi4uIi4KKyAgIC0gVW5lc2NhcGVkIGRvdWJsZSBxdW90ZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQuIFRoZWlyIG9ubHkgZWZmZWN0IGlzCisgICAgIHRoYXQgd2l0aGluIGRvdWJsZSBxdW90ZXMsIHNwYWNlIGFuZCB0YWIgYXJlIHRyZWF0ZWQgbGlrZSBub3JtYWwKKyAgICAgY2hhcmFjdGVycy4KKyAgIC0gQmFja3NsYXNoZXMgbm90IGZvbGxvd2VkIGJ5IGRvdWJsZSBxdW90ZXMgYXJlIG5vdCBzcGVjaWFsLgorICAgLSBCdXQgMipuKzEgYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGUgYmVjb21lCisgICAgIG4gYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGUgKG4gPj0gMCk6CisgICAgICAgXCIgLT4gIgorICAgICAgIFxcXCIgLT4gXCIKKyAgICAgICBcXFxcXCIgLT4gXFwiCisgKi8KKyNkZWZpbmUgU0hFTExfU1BFQ0lBTF9DSEFSUyAiXCJcXCBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3IgorI2RlZmluZSBTSEVMTF9TUEFDRV9DSEFSUyAiIFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzciCitjaGFyICoqCitwcmVwYXJlX3NwYXduIChjaGFyICoqYXJndikKK3sKKyAgc2l6ZV90IGFyZ2M7CisgIGNoYXIgKipuZXdfYXJndjsKKyAgc2l6ZV90IGk7CisKKyAgLyogQ291bnQgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCisgIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgYXJnYysrKQorICAgIDsKKworICAvKiBBbGxvY2F0ZSBuZXcgYXJndW1lbnQgdmVjdG9yLiAgKi8KKyAgbmV3X2FyZ3YgPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKKworICAvKiBQdXQgcXVvdGVkIGFyZ3VtZW50cyBpbnRvIHRoZSBuZXcgYXJndW1lbnQgdmVjdG9yLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzdHJpbmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyaW5nWzBdID09ICdcMCcpCisJbmV3X2FyZ3ZbaV0gPSB4c3RyZHVwICgiXCJcIiIpOworICAgICAgZWxzZSBpZiAoc3RycGJyayAoc3RyaW5nLCBTSEVMTF9TUEVDSUFMX0NIQVJTKSAhPSBOVUxMKQorCXsKKwkgIGludCBxdW90ZV9hcm91bmQgPSAoc3RycGJyayAoc3RyaW5nLCBTSEVMTF9TUEFDRV9DSEFSUykgIT0gTlVMTCk7CisJICBzaXplX3QgbGVuZ3RoOworCSAgdW5zaWduZWQgaW50IGJhY2tzbGFzaGVzOworCSAgY29uc3QgY2hhciAqczsKKwkgIGNoYXIgKnF1b3RlZF9zdHJpbmc7CisJICBjaGFyICpwOworCisJICBsZW5ndGggPSAwOworCSAgYmFja3NsYXNoZXMgPSAwOworCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgbGVuZ3RoKys7CisJICBmb3IgKHMgPSBzdHJpbmc7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGNoYXIgYyA9ICpzOworCSAgICAgIGlmIChjID09ICciJykKKwkJbGVuZ3RoICs9IGJhY2tzbGFzaGVzICsgMTsKKwkgICAgICBsZW5ndGgrKzsKKwkgICAgICBpZiAoYyA9PSAnXFwnKQorCQliYWNrc2xhc2hlcysrOworCSAgICAgIGVsc2UKKwkJYmFja3NsYXNoZXMgPSAwOworCSAgICB9CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICBsZW5ndGggKz0gYmFja3NsYXNoZXMgKyAxOworCisJICBxdW90ZWRfc3RyaW5nID0gWE1BTExPQyAoY2hhciwgbGVuZ3RoICsgMSk7CisKKwkgIHAgPSBxdW90ZWRfc3RyaW5nOworCSAgYmFja3NsYXNoZXMgPSAwOworCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgKnArKyA9ICciJzsKKwkgIGZvciAocyA9IHN0cmluZzsgKnMgIT0gJ1wwJzsgcysrKQorCSAgICB7CisJICAgICAgY2hhciBjID0gKnM7CisJICAgICAgaWYgKGMgPT0gJyInKQorCQl7CisJCSAgdW5zaWduZWQgaW50IGo7CisJCSAgZm9yIChqID0gYmFja3NsYXNoZXMgKyAxOyBqID4gMDsgai0tKQorCQkgICAgKnArKyA9ICdcXCc7CisJCX0KKwkgICAgICAqcCsrID0gYzsKKwkgICAgICBpZiAoYyA9PSAnXFwnKQorCQliYWNrc2xhc2hlcysrOworCSAgICAgIGVsc2UKKwkJYmFja3NsYXNoZXMgPSAwOworCSAgICB9CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IGo7CisJICAgICAgZm9yIChqID0gYmFja3NsYXNoZXM7IGogPiAwOyBqLS0pCisJCSpwKysgPSAnXFwnOworCSAgICAgICpwKysgPSAnIic7CisJICAgIH0KKwkgICpwID0gJ1wwJzsKKworCSAgbmV3X2FyZ3ZbaV0gPSBxdW90ZWRfc3RyaW5nOworCX0KKyAgICAgIGVsc2UKKwluZXdfYXJndltpXSA9IChjaGFyICopIHN0cmluZzsKKyAgICB9CisgIG5ld19hcmd2W2FyZ2NdID0gTlVMTDsKKworICByZXR1cm4gbmV3X2FyZ3Y7Cit9CitFT0YKKwkJOzsKKwkgICAgZXNhYworCisgICAgICAgICAgICBjYXQgPDwiRU9GIgordm9pZCBsdF9kdW1wX3NjcmlwdCAoRklMRSogZikKK3sKK0VPRgorCSAgICBmdW5jX2VtaXRfd3JhcHBlciB5ZXMgfAorCSAgICAgICRTRUQgLW4gLWUgJworcy9eXCguXHs3OVx9XClcKC4uKlwpL1wxXAorXDIvCitoCitzL1woW1xcIl1cKS9cXFwxL2cKK3MvJC9cXG4vCitzL1woW15cbl0qXCkuKi8gIGZwdXRzICgiXDEiLCBmKTsvcAorZworRCcKKyAgICAgICAgICAgIGNhdCA8PCJFT0YiCit9CitFT0YKK30KKyMgZW5kOiBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisKKyMgZnVuY193aW4zMl9pbXBvcnRfbGliX3AgQVJHCisjIFRydWUgaWYgQVJHIGlzIGFuIGltcG9ydCBsaWIsIGFzIGluZGljYXRlZCBieSAkZmlsZV9tYWdpY19jbWQKK2Z1bmNfd2luMzJfaW1wb3J0X2xpYl9wICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgYGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCQxXCIgMj4vZGV2L251bGwgfCAkU0VEIC1lIDEwcWAgaW4KKyAgICAqaW1wb3J0KikgOiA7OworICAgICopIGZhbHNlIDs7CisgICAgZXNhYworfQorCisjIGZ1bmNfbW9kZV9saW5rIGFyZy4uLgorZnVuY19tb2RlX2xpbmsgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisgICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCisgICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0CisgICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCisgICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KKyAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCisKKyAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZworICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKKyAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5CisgICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KKyAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgICopCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICBsaWJ0b29sX2FyZ3M9JG5vbm9wdAorICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKKyAgICBjb21waWxlX2NvbW1hbmQ9JG5vbm9wdAorICAgIGZpbmFsaXplX2NvbW1hbmQ9JG5vbm9wdAorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisgICAgaW5zdF9wcmVmaXhfZGlyPQorICAgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGJpbmRpcj0KKyAgICBkbGZpbGVzPQorICAgIGRscHJlZmlsZXM9CisgICAgZGxzZWxmPW5vCisgICAgZXhwb3J0X2R5bmFtaWM9bm8KKyAgICBleHBvcnRfc3ltYm9scz0KKyAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KKyAgICBnZW5lcmF0ZWQ9CisgICAgbGlib2Jqcz0KKyAgICBsdGxpYnM9CisgICAgbW9kdWxlPW5vCisgICAgbm9faW5zdGFsbD1ubworICAgIG9ianM9CisgICAgbm9uX3BpY19vYmplY3RzPQorICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQorICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubworICAgIHByZWxvYWQ9bm8KKyAgICBwcmV2PQorICAgIHByZXZhcmc9CisgICAgcmVsZWFzZT0KKyAgICBycGF0aD0KKyAgICB4cnBhdGg9CisgICAgcGVybV9ycGF0aD0KKyAgICB0ZW1wX3JwYXRoPQorICAgIHRocmVhZF9zYWZlPW5vCisgICAgdmluZm89CisgICAgdmluZm9fbnVtYmVyPW5vCisgICAgd2Vha19saWJzPQorICAgIHNpbmdsZV9tb2R1bGU9IiR7d2x9LXNpbmdsZV9tb2R1bGUiCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtc2hhcmVkKQorCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKKwlidWlsZF9vbGRfbGlicz1ubworCWJyZWFrCisJOzsKKyAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCWNhc2UgJGFyZyBpbgorCS1hbGwtc3RhdGljKQorCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJICA7OworCS1zdGF0aWMpCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPWJ1aWx0CisJICA7OworCS1zdGF0aWMtbGlidG9vbC1saWJzKQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwkgIDs7CisJZXNhYworCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworCWJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCisgICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcworCisgICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCisgICAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbworICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgICAgcWFyZz0kZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYnRvb2xfYXJncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwljYXNlICRwcmV2IGluCisJb3V0cHV0KQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQE9VVFBVVEAiCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQE9VVFBVVEAiCisJICA7OworCWVzYWMKKworCWNhc2UgJHByZXYgaW4KKwliaW5kaXIpCisJICBiaW5kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZGxmaWxlc3xkbHByZWZpbGVzKQorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KKwkgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQFNZTUZJTEVAIgorCSAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQFNZTUZJTEVAIgorCSAgICBwcmVsb2FkPXllcworCSAgZmkKKwkgIGNhc2UgJGFyZyBpbgorCSAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KKwkgIGZvcmNlKQorCSAgICBpZiB0ZXN0ICIkZGxzZWxmIiA9IG5vOyB0aGVuCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBzZWxmKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsc2UKKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkYXJnIgorCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlleHBzeW1zKQorCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCisJICB0ZXN0IC1mICIkYXJnIiBcCisJICAgIHx8IGZ1bmNfZmF0YWxfZXJyb3IgInN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXhwc3ltc19yZWdleCkKKwkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWZyYW1ld29yaykKKwkgIGNhc2UgJGhvc3QgaW4KKwkgICAgKi0qLWRhcndpbiopCisJICAgICAgY2FzZSAiJGRlcGxpYnMgIiBpbgorCQkqIiAkcWFyZy5sdGZyYW1ld29yayAiKikgOzsKKwkJKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRxYXJnLmx0ZnJhbWV3b3JrIiAjIHRoaXMgaXMgZml4ZWQgbGF0ZXIKKwkJICAgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgIGVzYWMKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlpbnN0X3ByZWZpeCkKKwkgIGluc3RfcHJlZml4X2Rpcj0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlvYmplY3RsaXN0KQorCSAgaWYgdGVzdCAtZiAiJGFyZyI7IHRoZW4KKwkgICAgc2F2ZV9hcmc9JGFyZworCSAgICBtb3JlYXJncz0KKwkgICAgZm9yIGZpbCBpbiBgY2F0ICIkc2F2ZV9hcmciYAorCSAgICBkbworIwkgICAgICBmdW5jX2FwcGVuZCBtb3JlYXJncyAiICRmaWwiCisJICAgICAgYXJnPSRmaWwKKwkgICAgICAjIEEgbGlidG9vbC1jb250cm9sbGVkIG9iamVjdC4KKworCSAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIG9iamVjdC4KKwkgICAgICBpZiBmdW5jX2xhbGliX3Vuc2FmZV9wICIkYXJnIjsgdGhlbgorCQlwaWNfb2JqZWN0PQorCQlub25fcGljX29iamVjdD0KKworCQkjIFJlYWQgdGhlIC5sbyBmaWxlCisJCWZ1bmNfc291cmNlICIkYXJnIgorCisJCWlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8CisJCSAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYKKwkJICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIKKwkJZmkKKworCQkjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCQlmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgorCQl4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCQlpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KKwkJICAgICAgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRwaWNfb2JqZWN0IgorCQkgICAgICBwcmV2PQorCQkgICAgICBjb250aW51ZQorCQkgICAgZWxzZQorCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQkgICAgICBwcmV2PWRscHJlZmlsZXMKKwkJICAgIGZpCisJCSAgZmkKKworCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCQkgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRwaWNfb2JqZWN0IgorCQkgICAgcHJldj0KKwkJICBmaQorCisJCSAgIyBBIFBJQyBvYmplY3QuCisJCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCQkgIGFyZz0iJHBpY19vYmplY3QiCisJCWZpCisKKwkJIyBOb24tUElDIG9iamVjdC4KKwkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJCSAgICBhcmc9IiRub25fcGljX29iamVjdCIKKwkJICBmaQorCQllbHNlCisJCSAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgorCQkgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkJICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCQlmaQorCSAgICAgIGVsc2UKKwkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJCWlmICRvcHRfZHJ5X3J1bjsgdGhlbgorCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCQkgIGZ1bmNfbG8ybyAiJGFyZyIKKwkJICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAorCQkgIG5vbl9waWNfb2JqZWN0PSR4ZGlyJGZ1bmNfbG8yb19yZXN1bHQKKwkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCSAgICAgICAgZWxzZQorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiCisJCWZpCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJsaW5rIGlucHV0IGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgIGZpCisJICBhcmc9JHNhdmVfYXJnCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcHJlY2lvdXNfcmVnZXgpCisJICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlyZWxlYXNlKQorCSAgcmVsZWFzZT0iLSRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcnBhdGggfCB4cnBhdGgpCisJICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkgIGNhc2UgJGFyZyBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgorCSAgICBjYXNlICIkcnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBycGF0aCAiICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGVsc2UKKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJc2hyZXh0KQorCSAgc2hyZXh0X2NtZHM9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJd2VhaykKKwkgIGZ1bmNfYXBwZW5kIHdlYWtfbGlicyAiICRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJeGNjbGlua2VyKQorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGNvbXBpbGVyKQorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIHByZXY9CisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhsaW5rZXIpCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHdsJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAjIFNlZSBjb21tZW50IGZvciAtc3RhdGljIGZsYWcgYmVsb3csIGZvciBtb3JlIGRldGFpbHMuCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJZnVuY19mYXRhbF9lcnJvciAiXGAtYWxsb3ctdW5kZWZpbmVkJyBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1iaW5kaXIpCisJcHJldj1iaW5kaXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAibW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmspCisJcHJldj1mcmFtZXdvcmsKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWZ1bmNfc3RyaXBuYW1lICItTCIgJycgIiRhcmciCisJaWYgdGVzdCAteiAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCI7IHRoZW4KKwkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJyZXF1aXJlIG5vIHNwYWNlIGJldHdlZW4gXGAtTCcgYW5kIFxgJDEnIgorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJuZWVkIHBhdGggZm9yIFxgLUwnIG9wdGlvbiIKKwkgIGZpCisJZmkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwlkaXI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgdGVzdCAteiAiJGFic2RpciIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCisJICBkaXI9IiRhYnNkaXIiCisJICA7OworCWVzYWMKKwljYXNlICIkZGVwbGlicyAiIGluCisJKiIgLUwkZGlyICIqIHwgKiIgJGFyZyAiKikKKwkgICMgV2lsbCBvbmx5IGhhcHBlbiBmb3IgYWJzb2x1dGUgb3Igc3lzcm9vdCBhcmd1bWVudHMKKwkgIDs7CisJKikKKwkgICMgUHJlc2VydmUgc3lzcm9vdCwgYnV0IG5ldmVyIGluY2x1ZGUgcmVsYXRpdmUgZGlyZWN0b3JpZXMKKwkgIGNhc2UgJGRpciBpbgorCSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSogfCA9KikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAtTCRkaXIiIDs7CisJICBlc2FjCisJICBmdW5jX2FwcGVuZCBsaWJfc2VhcmNoX3BhdGggIiAkZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisJICB0ZXN0YmluZGlyPWAkRUNITyAiJGRpciIgfCAkU0VEICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRkaXI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiRkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWwqKQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiB8fCB0ZXN0ICJYJGFyZyIgPSAiWC1sbSI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqIHwgKi0qLWhhaWt1KikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vczIqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgorCSBjYXNlICRob3N0IGluCisJICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KKwkgICBjb250aW51ZQorCSAgIDs7CisJIGVzYWMKKwlmaQorCWZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW1vZHVsZSkKKwltb2R1bGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCisgICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgICAjIERhcndpbiB1c2VzIHRoZSAtYXJjaCBmbGFnIHRvIGRldGVybWluZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLgorICAgICAgLW1vZGVsfC1hcmNofC1pc3lzcm9vdHwtLXN5c3Jvb3QpCisJZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUgXAorICAgICAgfC10aHJlYWRzfC1mb3Blbm1wfC1vcGVubXB8LW1wfC14b3Blbm1wfC1vbXB8LXFzbXA9KikKKwlmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCisJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkYXJnIiA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdWx0aV9tb2R1bGUpCisJc2luZ2xlX21vZHVsZT0iJHt3bH0tbXVsdGlfbW9kdWxlIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKKwlmYXN0X2luc3RhbGw9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1pbnN0YWxsKQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1kYXJ3aW4qIHwgKi1jZWdjYyopCisJICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKKwkgICMgYW5kIERhcndpbiBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgorCSAgZnVuY193YXJuaW5nICJcYC1uby1pbnN0YWxsJyBpcyBpZ25vcmVkIGZvciAkaG9zdCIKKwkgIGZ1bmNfd2FybmluZyAiYXNzdW1pbmcgXGAtbm8tZmFzdC1pbnN0YWxsJyBpbnN0ZWFkIgorCSAgZmFzdF9pbnN0YWxsPW5vCisJICA7OworCSopIG5vX2luc3RhbGw9eWVzIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLXVuZGVmaW5lZCkKKwlhbGxvd191bmRlZmluZWQ9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vYmplY3RsaXN0KQorCXByZXY9b2JqZWN0bGlzdAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW8pIHByZXY9b3V0cHV0IDs7CisKKyAgICAgIC1wcmVjaW91cy1maWxlcy1yZWdleCkKKwlwcmV2PXByZWNpb3VzX3JlZ2V4CisJY29udGludWUKKwk7OworCisgICAgICAtcmVsZWFzZSkKKwlwcmV2PXJlbGVhc2UKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1ycGF0aCkKKwlwcmV2PXJwYXRoCisJY29udGludWUKKwk7OworCisgICAgICAtUikKKwlwcmV2PXhycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIqKQorCWZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRhcmciCisJZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJPSopCisJICBmdW5jX3N0cmlwbmFtZSAnPScgJycgIiRkaXIiCisJICBkaXI9JGx0X3N5c3Jvb3QkZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICA7OworCSopCisJICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGRpciIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtc2hhcmVkKQorCSMgVGhlIGVmZmVjdHMgb2YgLXNoYXJlZCBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJY29udGludWUKKwk7OworCisgICAgICAtc2hyZXh0KQorCXByZXY9c2hyZXh0CisJY29udGludWUKKwk7OworCisgICAgICAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KKwkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKKwkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCisJIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0CisJIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KKwljb250aW51ZQorCTs7CisKKyAgICAgIC10aHJlYWQtc2FmZSkKKwl0aHJlYWRfc2FmZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisJcHJldj12aW5mbworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXZlcnNpb24tbnVtYmVyKQorCXByZXY9dmluZm8KKwl2aW5mb19udW1iZXI9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtd2VhaykKKyAgICAgICAgcHJldj13ZWFrCisJY29udGludWUKKwk7OworCisgICAgICAtV2MsKikKKwlmdW5jX3N0cmlwbmFtZSAnLVdjLCcgJycgIiRhcmciCisJYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCisJICBmdW5jX2FwcGVuZCBhcmcgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJZnVuY19zdHJpcG5hbWUgJyAnICcnICIkYXJnIgorCWFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJOzsKKworICAgICAgLVdsLCopCisJZnVuY19zdHJpcG5hbWUgJy1XbCwnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgZnVuY19hcHBlbmQgYXJnICIgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKKwlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCTs7CisKKyAgICAgIC1YY29tcGlsZXIpCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YbGlua2VyKQorCXByZXY9eGxpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVhDQ2xpbmtlcikKKwlwcmV2PXhjY2xpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyAtbXNnXyogZm9yIG9zZiBjYworICAgICAgLW1zZ18qKQorCWZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJOzsKKworICAgICAgIyBGbGFncyB0byBiZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQsIHdpdGggcmF0aW9uYWxlOgorICAgICAgIyAtNjQsIC1taXBzWzAtOV0gICAgICBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXJbMC05XVswLTldKiAgICAgICAgc3BlY2lmeSBwcm9jZXNzb3IgZm9yIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgU3VuIGNvbXBpbGVyCisgICAgICAjICtEQSosICtERCogICAgICAgICAgIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIEhQIGNvbXBpbGVyCisgICAgICAjIC1xKiAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKKyAgICAgICMgLW0qLCAtdFs0NV0qLCAtdHhzY2FsZSogYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzIGZvciBHQ0MKKyAgICAgICMgLUYvcGF0aCAgICAgICAgICAgICAgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCisgICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qICBwcm9maWxpbmcgZmxhZ3MgZm9yIEdDQworICAgICAgIyBAZmlsZSAgICAgICAgICAgICAgICBHQ0MgcmVzcG9uc2UgZmlsZXMKKyAgICAgICMgLXRwPSogICAgICAgICAgICAgICAgUG9ydGxhbmQgcGdjYyB0YXJnZXQgcHJvY2Vzc29yIHNlbGVjdGlvbgorICAgICAgIyAtLXN5c3Jvb3Q9KiAgICAgICAgICBmb3Igc3lzcm9vdCBzdXBwb3J0CisgICAgICAjIC1PKiwgLWZsdG8qLCAtZndob3ByKiwgLWZ1c2UtbGlua2VyLXBsdWdpbiBHQ0MgbGluay10aW1lIG9wdGltaXphdGlvbgorICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCisgICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCp8LXRwPSp8LS1zeXNyb290PSp8IFwKKyAgICAgIC1PKnwtZmx0byp8LWZ3aG9wcip8LWZ1c2UtbGlua2VyLXBsdWdpbikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKyAgICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJGFyZyIKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICouJG9iamV4dCkKKwkjIEEgc3RhbmRhcmQgb2JqZWN0LgorCWZ1bmNfYXBwZW5kIG9ianMgIiAkYXJnIgorCTs7CisKKyAgICAgICoubG8pCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgIiRhcmciCisKKwkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCWZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkcGljX29iamVjdCIKKwkJcHJldj0KKwkJY29udGludWUKKwkgICAgICBlbHNlCisJCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCXByZXY9ZGxwcmVmaWxlcworCSAgICAgIGZpCisJICAgIGZpCisKKwkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgICAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJHBpY19vYmplY3QiCisJICAgICAgcHJldj0KKwkgICAgZmkKKworCSAgICAjIEEgUElDIG9iamVjdC4KKwkgICAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCSAgICBhcmc9IiRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBOb24tUElDIG9iamVjdC4KKwkgIGlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkgICAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0CisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgICAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJICAgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJICAgIGZpCisJICBlbHNlCisJICAgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkgICAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCSAgICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGZpCisJZWxzZQorCSAgIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJICBpZiAkb3B0X2RyeV9ydW47IHRoZW4KKwkgICAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgICAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgICAgeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkgICAgZnVuY19sbzJvICIkYXJnIgorCSAgICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAorCSAgICBub25fcGljX29iamVjdD0keGRpciRmdW5jX2xvMm9fcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICouJGxpYmV4dCkKKwkjIEFuIGFyY2hpdmUuCisJZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciCisJZnVuY19hcHBlbmQgb2xkX2RlcGxpYnMgIiAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGFyZyIKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgcHJldj0KKwllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIHByZXY9CisJZWxzZQorCSAgZnVuY19hcHBlbmQgZGVwbGlicyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKyAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkU0VEIFwncy86LyAvZ1wnXGAKKyAgICBlbHNlCisgICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KKyAgICBmaQorICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgorICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKKworICAgIGZ1bmNfZGlybmFtZSAiJG91dHB1dCIgIi8iICIiCisgICAgb3V0cHV0X29iamRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkb2JqZGlyIgorICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8iCisgICAgdG9vbF9vdXRwdXRfb2JqZGlyPSRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQKKyAgICAjIENyZWF0ZSB0aGUgb2JqZWN0IGRpcmVjdG9yeS4KKyAgICBmdW5jX21rZGlyX3AgIiRvdXRwdXRfb2JqZGlyIgorCisgICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0CisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgIiIpCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiCisgICAgICA7OworICAgICouJGxpYmV4dCkgbGlua21vZGU9b2xkbGliIDs7CisgICAgKi5sbyB8ICouJG9iamV4dCkgbGlua21vZGU9b2JqIDs7CisgICAgKi5sYSkgbGlua21vZGU9bGliIDs7CisgICAgKikgbGlua21vZGU9cHJvZyA7OyAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KKyAgICBlc2FjCisKKyAgICBzcGVjaWFsZGVwbGlicz0KKworICAgIGxpYnM9CisgICAgIyBGaW5kIGFsbCBpbnRlcmRlcGVuZGVudCBkZXBsaWJzIGJ5IHNlYXJjaGluZyBmb3IgbGlicmFyaWVzCisgICAgIyB0aGF0IGFyZSBsaW5rZWQgbW9yZSB0aGFuIG9uY2UgKGUuZy4gLWxhIC1sYiAtbGEpCisgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKyAgICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJY2FzZSAiJGxpYnMgIiBpbgorCSoiICRkZXBsaWIgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgbGlicyAiICRkZXBsaWIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCisKKyAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCisgICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCisgICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwczsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIGZ1bmNfYXBwZW5kIHByZV9wb3N0X2RlcHMgIiAkcHJlX3Bvc3RfZGVwIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgIGZpCisKKyAgICBkZXBsaWJzPQorICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKyAgICBuZXdsaWJfc2VhcmNoX3BhdGg9CisgICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgbGliKQorCXBhc3Nlcz0iY29udiBkbHByZW9wZW4gbGluayIKKwlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICoubGEpIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2hlbHAgImxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICBwcm9nKQorCWNvbXBpbGVfZGVwbGlicz0KKwlmaW5hbGl6ZV9kZXBsaWJzPQorCWFsbGRlcGxpYnM9bm8KKwluZXdkbGZpbGVzPQorCW5ld2RscHJlZmlsZXM9CisJcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgorCTs7CisgICAgKikgIHBhc3Nlcz0iY29udiIKKwk7OworICAgIGVzYWMKKworICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCisgICAgICAjIFRoZSBwcmVvcGVuIHBhc3MgaW4gbGliIG1vZGUgcmV2ZXJzZXMgJGRlcGxpYnM7IHB1dCBpdCBiYWNrIGhlcmUKKyAgICAgICMgc28gdGhhdCAtTCBjb21lcyBiZWZvcmUgbGlicyB0aGF0IG5lZWQgaXQgZm9yIGluc3RhbmNlLi4uCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIjsgdGhlbgorCSMjIEZJWE1FOiBGaW5kIHRoZSBwbGFjZSB3aGVyZSB0aGUgbGlzdCBpcyByZWJ1aWx0IGluIHRoZSB3cm9uZworCSMjICAgICAgICBvcmRlciwgYW5kIGZpeCBpdCB0aGVyZSBwcm9wZXJseQorICAgICAgICB0bXBfZGVwbGlicz0KKwlmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgdG1wX2RlcGxpYnM9IiRkZXBsaWIgJHRtcF9kZXBsaWJzIgorCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KKwlsaWJzPSIkZGVwbGlicyIKKwlkZXBsaWJzPQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJY2FzZSAkcGFzcyBpbgorCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7CisJZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKKwlsaW5rKQorCSAgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlIgorCSAgdGVzdCAiWCRsaW5rX2FsbF9kZXBsaWJzIiAhPSBYbm8gJiYgbGlicz0iJGxpYnMgJGRlcGVuZGVuY3lfbGlicyIKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGRscHJlb3BlbiI7IHRoZW4KKwkjIENvbGxlY3QgYW5kIGZvcndhcmQgZGVwbGlicyBvZiBwcmVvcGVuZWQgbGlidG9vbCBsaWJzCisJZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICMgSWdub3JlIG5vbi1saWJ0b29sLWxpYnMKKwkgIGRlcGVuZGVuY3lfbGlicz0KKwkgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkbGliIgorCSAgY2FzZSAkbGliIGluCisJICAqLmxhKQlmdW5jX3NvdXJjZSAiJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIgOzsKKwkgIGVzYWMKKworCSAgIyBDb2xsZWN0IHByZW9wZW5lZCBsaWJ0b29sIGRlcGxpYnMsIGV4Y2VwdCBhbnkgdGhpcyBsaWJyYXJ5CisJICAjIGhhcyBkZWNsYXJlZCBhcyB3ZWFrIGxpYnMKKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJGRlcGxpYiIKKyAgICAgICAgICAgIGRlcGxpYl9iYXNlPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBjYXNlICIgJHdlYWtfbGlicyAiIGluCisJICAgICoiICRkZXBsaWJfYmFzZSAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlkb25lCisJbGlicz0iJGRscHJlZmlsZXMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisKKyAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCisJbGliPQorCWZvdW5kPW5vCisJY2FzZSAkZGVwbGliIGluCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZSBcCisgICAgICAgIHwtdGhyZWFkc3wtZm9wZW5tcHwtb3Blbm1wfC1tcHwteG9wZW5tcHwtb21wfC1xc21wPSopCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJGRlcGxpYiIKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiA7IHRoZW4KKwkJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkJICAgICoiICRkZXBsaWIgIiopIDs7CisJCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkZGVwbGliIiA7OworCQllc2FjCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJLWwqKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWIgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiXGAtbCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBmdW5jX3N0cmlwbmFtZSAnLWwnICcnICIkZGVwbGliIgorCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIHNlYXJjaGRpcnM9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aCIKKwkgIGVsc2UKKwkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aCIKKwkgIGZpCisJICBmb3Igc2VhcmNoZGlyIGluICRzZWFyY2hkaXJzOyBkbworCSAgICBmb3Igc2VhcmNoX2V4dCBpbiAubGEgJHN0ZF9zaHJleHQgLnNvIC5hOyBkbworCSAgICAgICMgU2VhcmNoIHRoZSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgICBsaWI9IiRzZWFyY2hkaXIvbGliJHtuYW1lfSR7c2VhcmNoX2V4dH0iCisJICAgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkJaWYgdGVzdCAiJHNlYXJjaF9leHQiID0gIi5sYSI7IHRoZW4KKwkJICBmb3VuZD15ZXMKKwkJZWxzZQorCQkgIGZvdW5kPW5vCisJCWZpCisJCWJyZWFrIDIKKwkgICAgICBmaQorCSAgICBkb25lCisJICBkb25lCisJICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgorCSAgICAjIGRlcGxpYiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgIGVsc2UgIyBkZXBsaWIgaXMgYSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgIyBJZiAkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzICYmICRkZXBsaWIgaXMgYSBzdGRsaWIsCisJICAgICMgV2UgbmVlZCB0byBkbyBzb21lIHNwZWNpYWwgdGhpbmdzIGhlcmUsIGFuZCBub3QgbGF0ZXIuCisJICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkgICAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKQorCQlpZiBmdW5jX2xhbGliX3AgIiRsaWIiOyB0aGVuCisJCSAgbGlicmFyeV9uYW1lcz0KKwkJICBvbGRfbGlicmFyeT0KKwkJICBmdW5jX3NvdXJjZSAiJGxpYiIKKwkJICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisJCSAgICBsbD0iJGwiCisJCSAgZG9uZQorCQkgIGlmIHRlc3QgIlgkbGwiID0gIlgkb2xkX2xpYnJhcnkiIDsgdGhlbiAjIG9ubHkgc3RhdGljIHZlcnNpb24gYXZhaWxhYmxlCisJCSAgICBmb3VuZD1ubworCQkgICAgZnVuY19kaXJuYW1lICIkbGliIiAiIiAiLiIKKwkJICAgIGxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKwkJICAgIGxpYj0kbGFkaXIvJG9sZF9saWJyYXJ5CisJCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJCSAgICBlbHNlCisJCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJCSAgICBmaQorCQkgICAgY29udGludWUKKwkJICBmaQorCQlmaQorCQk7OworCSAgICAgICopIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZmkKKwkgIDs7ICMgLWwKKwkqLmx0ZnJhbWV3b3JrKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgorCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkJICAgICogKSBmdW5jX2FwcGVuZCBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktTCopCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICB0ZXN0ICIkcGFzcyIgPSBjb252ICYmIGNvbnRpbnVlCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgICAgOzsKKwkgIHByb2cpCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGNvbnRpbnVlCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IHNjYW47IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKwkgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICAgIDs7CisJICAqKQorCSAgICBmdW5jX3dhcm5pbmcgIlxgLUwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIGNvbnRpbnVlCisJICA7OyAjIC1MCisJLVIqKQorCSAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkZGVwbGliIgorCSAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgZGlyPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkgICAgIyBNYWtlIHN1cmUgdGhlIHhycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgY29udGludWUKKwkgIDs7CisJKi5sYSkKKwkgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZGVwbGliIgorCSAgbGliPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkgIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgICMgTGlua2luZyBjb252ZW5pZW5jZSBtb2R1bGVzIGludG8gc2hhcmVkIGxpYnJhcmllcyBpcyBhbGxvd2VkLAorCSAgICAjIGJ1dCBsaW5raW5nIG90aGVyIHN0YXRpYyBsaWJyYXJpZXMgaXMgbm9uLXBvcnRhYmxlLgorCSAgICBjYXNlICIgJGRscHJlY29udmVuaWVuY2VsaWJzICIgaW4KKwkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgKikKKwkgICAgICB2YWxpZF9hX2xpYj1ubworCSAgICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJCW1hdGNoX3BhdHRlcm4qKQorCQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCQkgIGlmIGV2YWwgIlwkRUNITyBcIiRkZXBsaWJcIiIgMj4vZGV2L251bGwgfCAkU0VEIDEwcSBcCisJCSAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgICB2YWxpZF9hX2xpYj15ZXMKKwkJICBmaQorCQk7OworCQlwYXNzX2FsbCkKKwkJICB2YWxpZF9hX2xpYj15ZXMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgaWYgdGVzdCAiJHZhbGlkX2FfbGliIiAhPSB5ZXM7IHRoZW4KKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCWVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgorCQllY2hvICIqKiogdGhhdCBpdCBpcyBqdXN0IGEgc3RhdGljIGFyY2hpdmUgdGhhdCBJIHNob3VsZCBub3QgdXNlIGhlcmUuIgorCSAgICAgIGVsc2UKKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCisJCSRFQ0hPICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCQlkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjb250aW51ZQorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgOzsgIyAqLiRsaWJleHQKKwkqLmxvIHwgKi4kb2JqZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAorCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGVwbGliIgorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGRlcGxpYiIKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwklREVQTElCUyUpCisJICBhbGxkZXBsaWJzPXllcworCSAgY29udGludWUKKwkgIDs7CisJZXNhYyAjIGNhc2UgJGRlcGxpYgorCisJaWYgdGVzdCAiJGZvdW5kIiA9IHllcyB8fCB0ZXN0IC1mICIkbGliIjsgdGhlbiA6CisJZWxzZQorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgdGhlIGxpYnJhcnkgXGAkbGliJyBvciB1bmhhbmRsZWQgYXJndW1lbnQgXGAkZGVwbGliJyIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkbGliIiBcCisJICB8fCBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKworCWZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCisJbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJZGxuYW1lPQorCWRsb3Blbj0KKwlkbHByZW9wZW49CisJbGliZGlyPQorCWxpYnJhcnlfbmFtZXM9CisJb2xkX2xpYnJhcnk9CisJaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KKwkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAorCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGVzIGluc3RhbGxlZCwgb3Igc2hvdWxkbm90bGluaworCWluc3RhbGxlZD15ZXMKKwlzaG91bGRub3RsaW5rPW5vCisJYXZvaWR0ZW1wcnBhdGg9CisKKworCSMgUmVhZCB0aGUgLmxhIGZpbGUKKwlmdW5jX3NvdXJjZSAiJGxpYiIKKworCSMgQ29udmVydCAiLWZyYW1ld29yayBmb28iIHRvICJmb28ubHRmcmFtZXdvcmsiCisJaWYgdGVzdCAtbiAiJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiOyB0aGVuCisJICB0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRTRUQgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAorCSAgZm9yIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgaW4gJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzOyBkbworCSAgICBjYXNlICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgICAqIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIjs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIiAkZGVwZW5kZW5jeV9saWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKKwkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgorCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRkbG9wZW4iCisJICB0ZXN0IC1uICIkZGxwcmVvcGVuIiAmJiBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGRscHJlb3BlbiIKKwlmaQorCisJaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgIyBPbmx5IGNoZWNrIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgZnVuY19hcHBlbmQgY29udmVuaWVuY2UgIiAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIGZ1bmNfYXBwZW5kIG9sZF9jb252ZW5pZW5jZSAiICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgdG1wX2xpYnM9CisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJCWNhc2UgIiR0bXBfbGlicyAiIGluCisJCSoiICRkZXBsaWIgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIgorCSAgICBkb25lCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gY29udgorCisKKwkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCisJbGlua2xpYj0KKwlpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmCisJICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IHllcyB8fAorCSAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCxubyI7IH07IHRoZW4KKwkgIGxpbmtsaWI9JG9sZF9saWJyYXJ5CisJZWxzZQorCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBsaW5rbGliPSIkbCIKKwkgIGRvbmUKKwlmaQorCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJZmkKKworCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorCWlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IC1kbG9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIgorCSAgZmkKKwkgIGlmIHRlc3QgLXogIiRkbG5hbWUiIHx8CisJICAgICB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZworCSAgICAjIHN0YXRpY2FsbHksIHdlIG5lZWQgdG8gcHJlbG9hZC4gIFdlIGFsc28gbmVlZCB0byBwcmVsb2FkIGFueQorCSAgICAjIGRlcGVuZGVudCBsaWJyYXJpZXMgc28gbGlibHRkbCdzIGRlcGxpYiBwcmVsb2FkZXIgZG9lc24ndAorCSAgICAjIGJvbWIgb3V0IGluIHRoZSBsb2FkIGRlcGxpYnMgcGhhc2UuCisJICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIgorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGRsb3BlbgorCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkbGFkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OworCSopCisJICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKKwkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciCisJICAgIGZ1bmNfd2FybmluZyAicGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIKKwkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCisJICBmaQorCSAgOzsKKwllc2FjCisJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwlsYW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgorCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgISAtZiAiJGx0X3N5c3Jvb3QkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGx0X3N5c3Jvb3QkbGliZGlyIgorCSAgICBhYnNkaXI9IiRsdF9zeXNyb290JGxpYmRpciIKKwkgIGZpCisJICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcworCWVsc2UKKwkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCisJICAgIGRpcj0iJGxhZGlyIgorCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgZnVuY19hcHBlbmQgbm90aW5zdF9wYXRoICIgJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgZnVuY19hcHBlbmQgbm90aW5zdF9wYXRoICIgJGFic19sYWRpciIKKwkgIGZpCisJZmkgIyAkaW5zdGFsbGVkID0geWVzCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRsYW5hbWUiCisJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiICYmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgbGlicmFyaWVzIG1heSAtZGxwcmVvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBjYXNlICIkaG9zdCIgaW4KKwkgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBwbGF0Zm9ybXMgd2l0aCBQRS1ETExzLgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAjIExpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJ5IGlmIGJvdGgKKwkgICAgICAjIHN0YXRpYyBhbmQgc2hhcmVkIGFyZSBwcmVzZW50LiAgVGhlcmVmb3JlLCBlbnN1cmUgd2UgZXh0cmFjdAorCSAgICAgICMgc3ltYm9scyBmcm9tIHRoZSBpbXBvcnQgbGlicmFyeSBpZiBhIHNoYXJlZCBsaWJyYXJ5IGlzIHByZXNlbnQKKwkgICAgICAjIChvdGhlcndpc2UsIHRoZSBkbG9wZW4gbW9kdWxlIG5hbWUgd2lsbCBiZSBpbmNvcnJlY3QpLiAgV2UgZG8KKwkgICAgICAjIHRoaXMgYnkgcHV0dGluZyB0aGUgaW1wb3J0IGxpYnJhcnkgbmFtZSBpbnRvICRuZXdkbHByZWZpbGVzLgorCSAgICAgICMgV2UgcmVjb3ZlciB0aGUgZGxvcGVuIG1vZHVsZSBuYW1lIGJ5ICdzYXZpbmcnIHRoZSBsYSBmaWxlCisJICAgICAgIyBuYW1lIGluIGEgc3BlY2lhbCBwdXJwb3NlIHZhcmlhYmxlLCBhbmQgKGxhdGVyKSBleHRyYWN0aW5nIHRoZQorCSAgICAgICMgZGxuYW1lIGZyb20gdGhlIGxhIGZpbGUuCisJICAgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfdHJfc2ggIiRkaXIvJGxpbmtsaWIiCisJICAgICAgICBldmFsICJsaWJmaWxlXyRmdW5jX3RyX3NoX3Jlc3VsdD1cJGFic19sYWRpci9cJGxhbmFtZSIKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCisJICAgICAgICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJICAgICAgICAgIGZ1bmNfYXBwZW5kIGRscHJlY29udmVuaWVuY2VsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgZmkKKwkgICAgOzsKKwkgICAgKiApCisJICAgICAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAgICAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCisJICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgICAgIyBLZWVwIGEgbGlzdCBvZiBwcmVvcGVuZWQgY29udmVuaWVuY2UgbGlicmFyaWVzIHRvIGNoZWNrCisJICAgICAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KKwkgICAgICAgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkgICAgICAgICAgZnVuY19hcHBlbmQgZGxwcmVjb252ZW5pZW5jZWxpYnMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgorCSAgICAgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRkbG5hbWUiCisJICAgICAgZWxzZQorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcworCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkKKworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRsYWRpciIKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisKKwkgIGxpbmthbGxkZXBsaWJzPW5vCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgIGxpbmthbGxkZXBsaWJzPXllcworCSAgZmkKKworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgICAgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkJIDs7CisJICAgIGVzYWMKKwkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPworCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocworCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCisJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiCisJICBkb25lICMgZm9yIGRlcGxpYgorCSAgY29udGludWUKKwlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgICB7IHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fAorCSAgICAgICAgIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQseWVzIjsgfSB8fAorCSAgICAgICB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCisJICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgorCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgICBjYXNlICIkdGVtcF9ycGF0aDoiIGluCisJICAgICAgKiIkYWJzZGlyOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIHRlbXBfcnBhdGggIiRhYnNkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKworCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCisJICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKKwkgICAgIyBzZWFyY2ggcGF0aC4KKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfcnBhdGggIiAkYWJzZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgIHVzZV9zdGF0aWNfbGlicz1ubworCWZpCisJaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgeyB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgIyBObyBwb2ludCBpbiByZWxpbmtpbmcgRExMcyBiZWNhdXNlIHBhdGhzIGFyZSBub3QgZW5jb2RlZAorCSAgICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfZGVwbGlicyAiICRsaWIiCisJICAgICAgbmVlZF9yZWxpbms9bm8KKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm87IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBub3RpbnN0X2RlcGxpYnMgIiAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPXllcworCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKKworCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uIHNvbWUKKwkgICMgc3lzdGVtcyAoZGFyd2luKS4gIERvbid0IGJsZWF0IGFib3V0IGRsb3BlbmVkIG1vZHVsZXMgdGhvdWdoIQorCSAgZGxvcGVubW9kdWxlPSIiCisJICBmb3IgZGxwcmVtb2R1bGV0ZXN0IGluICRkbHByZWZpbGVzOyBkbworCSAgICBpZiB0ZXN0ICJYJGRscHJlbW9kdWxldGVzdCIgPSAiWCRsaWIiOyB0aGVuCisJICAgICAgZGxvcGVubW9kdWxlPSIkZGxwcmVtb2R1bGV0ZXN0IgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICBkb25lCisJICBpZiB0ZXN0IC16ICIkZGxvcGVubW9kdWxlIiAmJiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBlY2hvCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgY29tcGlsZV9ycGF0aCAiICRhYnNkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyI7IHRoZW4KKwkgICAgIyBmaWd1cmUgb3V0IHRoZSBzb25hbWUKKwkgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJICAgIHNoaWZ0CisJICAgIHJlYWxuYW1lPSIkMSIKKwkgICAgc2hpZnQKKwkgICAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPworCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKKwkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICAgICAgIyBibGVoIHdpbmRvd3MKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCBtaW5ndyogfCAqY2VnY2MqKQorCSAgICAgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkJbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJCXZlcnN1ZmZpeD0iLSRtYWpvciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCSAgICBlbHNlCisJICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCisJICAgIGZpCisKKwkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKKwkgICAgc29yb290PSIkc29uYW1lIgorCSAgICBmdW5jX2Jhc2VuYW1lICIkc29yb290IgorCSAgICBzb25hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5kbGwnICIkc29uYW1lIgorCSAgICBuZXdsaWI9bGliaW1wLSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuYQorCisJICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93CisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6CisJICAgIGVsc2UKKwkgICAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiICdleGl0ICQ/JworCSAgICBmaQorCisJICAgICMgQ3JlYXRlICRuZXdsaWIKKwkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG5ld2xpYiI7IHRoZW4gOjsgZWxzZQorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiAnZXhpdCAkPycKKwkgICAgZmkKKwkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKKwkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCisJICAgIGxpbmtsaWI9JG5ld2xpYgorCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJICAgIGFkZF9zaGxpYnBhdGg9CisJICAgIGFkZF9kaXI9CisJICAgIGFkZD0KKwkgICAgbGliX2xpbmtlZD15ZXMKKwkgICAgY2FzZSAkaGFyZGNvZGVfYWN0aW9uIGluCisJICAgIGltbWVkaWF0ZSB8IHVuc3VwcG9ydGVkKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCQljYXNlICRob3N0IGluCisJCSAgKi0qLXNjbzMuMnY1LjAuWzAyNF0qKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y0KnV3MiopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotc3lzdjVPcGVuVU5JWCogfCAqLSotc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IFwKKwkJICAgICotKi11bml4d2FyZTcqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLWRhcndpbiogKQorCQkgICAgIyBpZiB0aGUgbGliIGlzIGEgKG5vbi1kbG9wZW5lZCkgbW9kdWxlIHRoZW4gd2UgY2FuIG5vdAorCQkgICAgIyBsaW5rIGFnYWluc3QgaXQsIHNvbWVvbmUgaXMgaWdub3JpbmcgdGhlIGVhcmxpZXIgd2FybmluZ3MKKwkJICAgIGlmIC91c3IvYmluL2ZpbGUgLUwgJGFkZCAyPiAvZGV2L251bGwgfAorCQkJICRHUkVQICI6IFteOl0qIGJ1bmRsZSIgPi9kZXYvbnVsbCA7IHRoZW4KKwkJICAgICAgaWYgdGVzdCAiWCRkbG9wZW5tb2R1bGUiICE9ICJYJGxpYiI7IHRoZW4KKwkJCSRFQ0hPICIqKiogV2FybmluZzogbGliICRsaW5rbGliIGlzIGEgbW9kdWxlLCBub3QgYSBzaGFyZWQgbGlicmFyeSIKKwkJCWlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSIgOyB0aGVuCisJCQkgIGVjaG8KKwkJCSAgZWNobyAiKioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCQkgIGVjaG8gIioqKiBUaGUgbGluayB3aWxsIHByb2JhYmx5IGZhaWwsIHNvcnJ5IgorCQkJZWxzZQorCQkJICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkJZmkKKwkJICAgICAgZWxpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJCQlhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkgICAgICBmaQorCQkgICAgZmkKKwkJZXNhYworCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OworCQllc2FjCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgcmVsaW5rKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzICYmCisJICAgICAgICAgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSIgPSBubzsgdGhlbgorCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkJYWRkX2Rpcj0iLUwkYWJzZGlyIgorCQkjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJCWlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJCSAgY2FzZSAkbGliZGlyIGluCisJCSAgICBbXFwvXSopCisJCSAgICAgIGZ1bmNfYXBwZW5kIGFkZF9kaXIgIiAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCisJICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfc2hsaWJwYXRoICIkYWRkX3NobGlicGF0aDoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9zaGxpYnBhdGggIiRsaWJkaXI6IiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3NobGlicGF0aCAiJGxpYmRpcjoiIDs7CisJICAgICAgZXNhYworCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiICYmCisJCSB0ZXN0IC1mICIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIgOyB0aGVuCisJCWFkZD0iJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZWxzZQorCQlhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisJICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgorCSAgICAgICMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQljYXNlICRsaWJkaXIgaW4KKwkJICBbXFwvXSopCisJCSAgICBmdW5jX2FwcGVuZCBhZGRfZGlyICIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICBlY2hvCisJICAgICRFQ0hPICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKKwkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgICBlY2hvICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCisJICAgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgorCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJCWVjaG8KKwkJZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCWVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJCWVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkJZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGxpYmRpciIKKwkgICAgICAgICAgIHRlbXBfeHJwYXRoPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICR0ZW1wX3hycGF0aCI7OworCQkgICBlc2FjOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0ZW1wX2RlcGxpYnMgIiAkbGliZGlyIjs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKKwkgIGZpCisKKwkgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgY2FzZSAkZGVwbGliIGluCisgICAgICAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKyAgICAgICAgICAgICAgICAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCI7OworICAgICAgICAgICAgICAqKSBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIgOzsKKyAgICAgICAgICAgIGVzYWMKKwkgICAgaWYgJG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQgIiopCisgICAgICAgICAgICAgICAgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgZG9uZQorCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIHBhdGg9CisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OworCSAgICAgICoubGEpCisJICAgICAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIKKwkgICAgICAgIGRlcGxpYj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJICAgICAgICBmdW5jX2Rpcm5hbWUgIiRkZXBsaWIiICIiICIuIgorCQlkaXI9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKwkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJCWNhc2UgJGRpciBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKKwkJKikKKwkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkJICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIgorCQkgICAgYWJzZGlyPSIkZGlyIgorCQkgIGZpCisJCSAgOzsKKwkJZXNhYworCQlpZiAkR1JFUCAiXmluc3RhbGxlZD1ubyIgJGRlcGxpYiA+IC9kZXYvbnVsbDsgdGhlbgorCQljYXNlICRob3N0IGluCisJCSotKi1kYXJ3aW4qKQorCQkgIGRlcGRlcGw9CisJCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KKwkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbworCQkgICAgICBkZXBkZXBsPSR0bXAKKwkJICAgIGRvbmUKKwkJICAgIGlmIHRlc3QgLWYgIiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIgOyB0aGVuCisJCSAgICAgIGRlcGRlcGw9IiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIKKwkJICAgICAgZGFyd2luX2luc3RhbGxfbmFtZT1gJHtPVE9PTH0gLUwgJGRlcGRlcGwgfCBhd2sgJ3tpZiAoTlIgPT0gMikge3ByaW50ICQxO2V4aXR9fSdgCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGRhcndpbl9pbnN0YWxsX25hbWUiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0w2NH0gLUwgJGRlcGRlcGwgIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGZpCisJCSAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHt3bH0tZHlsaWJfZmlsZSAke3dsfSR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKKwkJICAgICAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgLWR5bGliX2ZpbGUgJHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgorCQkgICAgICBwYXRoPQorCQkgICAgZmkKKwkJICBmaQorCQkgIDs7CisJCSopCisJCSAgcGF0aD0iLUwkYWJzZGlyLyRvYmpkaXIiCisJCSAgOzsKKwkJZXNhYworCQllbHNlCisJCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJICB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciIgJiYgXAorCQkgICAgZnVuY193YXJuaW5nICJcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIgorCisJCSAgcGF0aD0iLUwkYWJzZGlyIgorCQlmaQorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRwYXRoICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCisJZmkgIyBsaW5rbW9kZSA9IGxpYgorICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gInByb2ciOyB0aGVuCisJICBjb21waWxlX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkY29tcGlsZV9kZXBsaWJzIgorCSAgZmluYWxpemVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRmaW5hbGl6ZV9kZXBsaWJzIgorCWVsc2UKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgImAkRUNITyAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpCisgICAgICBmaQorICAgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJIyBMaW5rIHRoZSBkbHByZW9wZW5lZCBsaWJyYXJpZXMgYmVmb3JlIG90aGVyIGxpYnJhcmllcworCWZvciBkZXBsaWIgaW4gJHNhdmVfZGVwbGliczsgZG8KKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJZG9uZQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBkbG9wZW47IHRoZW4KKwlpZiB0ZXN0ICIkcGFzcyIgIT0gY29udjsgdGhlbgorCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgbGliX3NlYXJjaF9wYXRoPQorCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbworCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgbGliX3NlYXJjaF9wYXRoICIgJGRpciIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgbmV3bGliX3NlYXJjaF9wYXRoPQorCWZpCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiICE9ICJwcm9nLGxpbmsiOyB0aGVuCisJICB2YXJzPSJkZXBsaWJzIgorCWVsc2UKKwkgIHZhcnM9ImNvbXBpbGVfZGVwbGlicyBmaW5hbGl6ZV9kZXBsaWJzIgorCWZpCisJZm9yIHZhciBpbiAkdmFycyBkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAjIEFkZCBsaWJyYXJpZXMgdG8gJHZhciBpbiByZXZlcnNlIG9yZGVyCisJICBldmFsIHRtcF9saWJzPVwiXCQkdmFyXCIKKwkgIG5ld19saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkdG1wX2xpYnM7IGRvCisJICAgICMgRklYTUU6IFBlZGFudGljYWxseSwgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIHNvCisJICAgICMgICAgICAgIHRoYXQgc29tZSBuYXN0eSBkZXBlbmRlbmN5IGxvb3AgaXNuJ3QgYWNjaWRlbnRhbGx5CisJICAgICMgICAgICAgIGJyb2tlbjoKKwkgICAgI25ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIKKwkgICAgIyBQcmFnbWF0aWNhbGx5LCB0aGlzIHNlZW1zIHRvIGNhdXNlIHZlcnkgZmV3IHByb2JsZW1zIGluCisJICAgICMgcHJhY3RpY2U6CisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkgICAgLVIqKSA7OworCSAgICAqKQorCSAgICAgICMgQW5kIGhlcmUgaXMgdGhlIHJlYXNvbjogd2hlbiBhIGxpYnJhcnkgYXBwZWFycyBtb3JlCisJICAgICAgIyB0aGFuIG9uY2UgYXMgYW4gZXhwbGljaXQgZGVwZW5kZW5jZSBvZiBhIGxpYnJhcnksIG9yCisJICAgICAgIyBpcyBpbXBsaWNpdGx5IGxpbmtlZCBpbiBtb3JlIHRoYW4gb25jZSBieSB0aGUKKwkgICAgICAjIGNvbXBpbGVyLCBpdCBpcyBjb25zaWRlcmVkIHNwZWNpYWwsIGFuZCBtdWx0aXBsZQorCSAgICAgICMgb2NjdXJyZW5jZXMgdGhlcmVvZiBhcmUgbm90IHJlbW92ZWQuICBDb21wYXJlIHRoaXMKKwkgICAgICAjIHdpdGggaGF2aW5nIHRoZSBzYW1lIGxpYnJhcnkgYmVpbmcgbGlzdGVkIGFzIGEKKwkgICAgICAjIGRlcGVuZGVuY3kgb2YgbXVsdGlwbGUgb3RoZXIgbGlicmFyaWVzOiBpbiB0aGlzIGNhc2UsCisJICAgICAgIyB3ZSBrbm93IChwZWRhbnRpY2FsbHksIHdlIGFzc3VtZSkgdGhlIGxpYnJhcnkgZG9lcyBub3QKKwkgICAgICAjIG5lZWQgdG8gYmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLCBzbyB3ZSBrZWVwIG9ubHkgdGhlCisJICAgICAgIyBsYXN0IGNvcHkuICBUaGlzIGlzIG5vdCBhbHdheXMgcmlnaHQsIGJ1dCBpdCBpcyByYXJlCisJICAgICAgIyBlbm91Z2ggdGhhdCB3ZSByZXF1aXJlIHVzZXJzIHRoYXQgcmVhbGx5IG1lYW4gdG8gcGxheQorCSAgICAgICMgc3VjaCB1bnBvcnRhYmxlIGxpbmtpbmcgdHJpY2tzIHRvIGxpbmsgdGhlIGxpYnJhcnkKKwkgICAgICAjIHVzaW5nIC1XbCwtbG5hbWUsIHNvIHRoYXQgbGlidG9vbCBkb2VzIG5vdCBjb25zaWRlciBpdAorCSAgICAgICMgZm9yIGR1cGxpY2F0ZSByZW1vdmFsLgorCSAgICAgIGNhc2UgIiAkc3BlY2lhbGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkgICAgICAqKQorCQljYXNlICIgJG5ld19saWJzICIgaW4KKwkJKiIgJGRlcGxpYiAiKikgOzsKKwkJKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCQllc2FjCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkbmV3X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopCisJICAgICAgY2FzZSAiICR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgZXZhbCAkdmFyPVwiJHRtcF9saWJzXCIKKwlkb25lICMgZm9yIHZhcgorICAgICAgZmkKKyAgICAgICMgTGFzdCBzdGVwOiByZW1vdmUgcnVudGltZSBsaWJzIGZyb20gZGVwZW5kZW5jeV9saWJzCisgICAgICAjICh0aGV5IHN0YXkgaW4gZGVwbGlicykKKyAgICAgIHRtcF9saWJzPQorICAgICAgZm9yIGkgaW4gJGRlcGVuZGVuY3lfbGlicyA7IGRvCisJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoICIgaW4KKwkqIiAkaSAiKikKKwkgIGk9IiIKKwkgIDs7CisJZXNhYworCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGkiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0kdG1wX2xpYnMKKyAgICBkb25lICMgZm9yIHBhc3MKKyAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorICAgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisgICAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKyAgICBmaQorCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBvbGRsaWIpCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KKyAgICAgICpcIC1sKiB8ICpcIC1MKikKKwlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDs7CisgICAgICBlc2FjCisKKyAgICAgIHRlc3QgLW4gIiRycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkeHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCisgICAgICBmdW5jX2FwcGVuZCBvYmpzICIkb2xkX2RlcGxpYnMiCisgICAgICA7OworCisgICAgbGliKQorICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgorICAgICAgY2FzZSAkb3V0cHV0bmFtZSBpbgorICAgICAgbGliKikKKwlmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwk7OworICAgICAgKikKKwl0ZXN0ICIkbW9kdWxlIiA9IG5vICYmIFwKKwkgIGZ1bmNfZmF0YWxfaGVscCAibGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIKKworCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCisJICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCisJICBmdW5jX3N0cmlwbmFtZSAnJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwllbHNlCisJICBmdW5jX3N0cmlwbmFtZSAnJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJICBsaWJuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgorCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIgorCWVsc2UKKwkgIGVjaG8KKwkgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKKwkgICRFQ0hPICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgorCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRvYmpzIgorCWZpCisgICAgICBmaQorCisgICAgICB0ZXN0ICIkZGxzZWxmIiAhPSBubyAmJiBcCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiCisKKyAgICAgIHNldCBkdW1teSAkcnBhdGgKKyAgICAgIHNoaWZ0CisgICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAorCWZ1bmNfd2FybmluZyAiaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiCisKKyAgICAgIGluc3RhbGxfbGliZGlyPSIkMSIKKworICAgICAgb2xkbGlicz0KKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KKwkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KKwkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KKwkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCisJICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKKwkgIGJ1aWxkX29sZF9saWJzPXllcworCWZpCisKKwl0ZXN0IC1uICIkdmluZm8iICYmIFwKKwkgIGZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgorCisJdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwkgIGZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgorICAgICAgZWxzZQorCisJIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKwlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCisJc2hpZnQKKwlJRlM9IiRzYXZlX2lmcyIKKworCXRlc3QgLW4gIiQ3IiAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgInRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIKKworCSMgY29udmVydCBhYnNvbHV0ZSB2ZXJzaW9uIG51bWJlcnMgdG8gbGlidG9vbCBhZ2VzCisJIyB0aGlzIHJldGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIC5sYSBmaWxlcyBhbmQgYXR0ZW1wdHMKKwkjIHRvIG1ha2UgdGhlIGNvZGUgYmVsb3cgYSBiaXQgbW9yZSBjb21wcmVoZW5zaWJsZQorCisJY2FzZSAkdmluZm9fbnVtYmVyIGluCisJeWVzKQorCSAgbnVtYmVyX21ham9yPSIkMSIKKwkgIG51bWJlcl9taW5vcj0iJDIiCisJICBudW1iZXJfcmV2aXNpb249IiQzIgorCSAgIworCSAgIyBUaGVyZSBhcmUgcmVhbGx5IG9ubHkgdHdvIGtpbmRzIC0tIHRob3NlIHRoYXQKKwkgICMgdXNlIHRoZSBjdXJyZW50IHJldmlzaW9uIGFzIHRoZSBtYWpvciB2ZXJzaW9uCisJICAjIGFuZCB0aG9zZSB0aGF0IHN1YnRyYWN0IGFnZSBhbmQgdXNlIGFnZSBhcworCSAgIyBhIG1pbm9yIHZlcnNpb24uICBCdXQsIHRoZW4gdGhlcmUgaXMgaXJpeAorCSAgIyB3aGljaCBoYXMgYW4gZXh0cmEgMSBhZGRlZCBqdXN0IGZvciBmdW4KKwkgICMKKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgIyBjb3JyZWN0IGxpbnV4IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisJICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3N8bm9uZSkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX3JldmlzaW9uIgorCSAgICA7OworCSAgZnJlZWJzZC1hb3V0fGZyZWVic2QtZWxmfHFueHxzdW5vcykKKwkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGFnZT0iMCIKKwkgICAgOzsKKwkgIGlyaXh8bm9uc3RvcHV4KQorCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCisJICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGx0X2lyaXhfaW5jcmVtZW50PW5vCisJICAgIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQxIgorCSAgcmV2aXNpb249IiQyIgorCSAgYWdlPSIkMyIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCisJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKKwkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgZWxzZQorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKKwkgIGZpCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgOzsKKworCW9zZikKKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJICBtYWpvcj0uJGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRhZ2UKKwkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KKwkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKKwkgIGRvbmUKKworCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgorCSAgZnVuY19hcHBlbmQgdmVyc3RyaW5nICI6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXFueCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlzdW5vcykKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJd2luZG93cykKKwkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKKwkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJICA7OworCisJKikKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAidW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgOzsKKwllc2FjCisKKwkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgorCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICBtYWpvcj0KKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2luKQorCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKKwkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQorCSAgICB2ZXJzdHJpbmc9CisJICAgIDs7CisJICAqKQorCSAgICB2ZXJzdHJpbmc9IjAuMCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgICAgdmVyc3VmZml4PQorCSAgZWxzZQorCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCisJICBmaQorCWZpCisKKwkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKKwlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdWZmaXg9CisJICB2ZXJzdHJpbmc9IiIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJ1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIgorCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICBmaQorCWVsc2UKKwkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgorCWZpCisKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkbGlibmFtZSIgIiRsaWJuYW1lIiAieWVzIgorICAgICAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRzeW1maWxlb2JqIgorICAgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKworICAgICAgaWYgdGVzdCAiJG9wdF9tb2RlIiAhPSByZWxpbms7IHRoZW4KKwkjIFJlbW92ZSBvdXIgb3V0cHV0cywgYnV0IGRvbid0IHJlbW92ZSBvYmplY3QgZmlsZXMgc2luY2UgdGhleQorCSMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdoZW4gY29tcGlsaW5nIFBJQyBvYmplY3RzLgorCXJlbW92ZWxpc3Q9CisJdGVtcHJlbW92ZWxpc3Q9YCRFQ0hPICIkb3V0cHV0X29iamRpci8qImAKKwlmb3IgcCBpbiAkdGVtcHJlbW92ZWxpc3Q7IGRvCisJICBjYXNlICRwIGluCisJICAgICouJG9iamV4dCB8ICouZ2NubykKKwkgICAgICAgOzsKKwkgICAgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgfCAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qIHwgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKikKKwkgICAgICAgaWYgdGVzdCAiWCRwcmVjaW91c19maWxlc19yZWdleCIgIT0gIlgiOyB0aGVuCisJCSBpZiAkRUNITyAiJHAiIHwgJEVHUkVQIC1lICIkcHJlY2lvdXNfZmlsZXNfcmVnZXgiID4vZGV2L251bGwgMj4mMQorCQkgdGhlbgorCQkgICBjb250aW51ZQorCQkgZmkKKwkgICAgICAgZmkKKwkgICAgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRwIgorCSAgICAgICA7OworCSAgICAqKSA7OworCSAgZXNhYworCWRvbmUKKwl0ZXN0IC1uICIkcmVtb3ZlbGlzdCIgJiYgXAorCSAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciBcJHJlbW92ZWxpc3QiCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJZnVuY19hcHBlbmQgb2xkbGlicyAiICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisKKwkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCisJb2xkb2Jqcz0iJG9ianMgImAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiL1wuJHtsaWJleHR9JC9kOyAkbG8ybyIgfCAkTkwyU1BgCisgICAgICBmaQorCisgICAgICAjIEVsaW1pbmF0ZSBhbGwgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzLgorICAgICAgI2ZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisgICAgICAjCWxpYl9zZWFyY2hfcGF0aD1gJEVDSE8gIiRsaWJfc2VhcmNoX3BhdGggIiB8ICRTRUQgInMlICRwYXRoICUgJWciYAorICAgICAgIwlkZXBsaWJzPWAkRUNITyAiJGRlcGxpYnMgIiB8ICRTRUQgInMlIC1MJHBhdGggJSAlZyJgCisgICAgICAjCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIiRkZXBlbmRlbmN5X2xpYnMgIiB8ICRTRUQgInMlIC1MJHBhdGggJSAlZyJgCisgICAgICAjZG9uZQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwl0ZW1wX3hycGF0aD0KKwlmb3IgbGliZGlyIGluICR4cnBhdGg7IGRvCisJICBmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGxpYmRpciIKKwkgIGZ1bmNfYXBwZW5kIHRlbXBfeHJwYXRoICIgLVIkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgorCWZpCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKKyAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKKyAgICAgIGRsZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KKwljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICAjIE1ha2Ugc3VyZSBkbHByZWZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzCisgICAgICBvbGRfZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMiCisgICAgICBkbHByZWZpbGVzPQorICAgICAgZm9yIGxpYiBpbiAkb2xkX2RscHJlZmlsZXM7IGRvCisJY2FzZSAiJGRscHJlZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyogfCAqLSotaGFpa3UqKQorCSAgICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCisJICAgIDs7CisJICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAgICMgUmhhcHNvZHkgQyBsaWJyYXJ5IGlzIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICAgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiBTeXN0ZW0ubHRmcmFtZXdvcmsiCisJICAgIDs7CisJICAqLSotbmV0YnNkKikKKwkgICAgIyBEb24ndCBsaW5rIHdpdGggbGliYyB1bnRpbCB0aGUgYS5vdXQgbGQuc28gaXMgZml4ZWQuCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIDs7CisJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCisJICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQorCSAgICA7OworCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQorCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCisJICAgIDs7CisJICAqKQorCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgorCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgZGVwbGlicyAiIC1sYyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCisJIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgorCW5hbWVfc2F2ZT0kbmFtZQorCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQorCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQorCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKKwltYWpvcl9zYXZlPSRtYWpvcgorCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCisJIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCisJIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/CisJcmVsZWFzZT0iIgorCXZlcnN1ZmZpeD0iIgorCW1ham9yPSIiCisJbmV3ZGVwbGlicz0KKwlkcm9wcGVkZGVwcz1ubworCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJcGFzc19hbGwpCisJICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KKwkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKwkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KKwkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAorCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3IuCisJICBuZXdkZXBsaWJzPSRkZXBsaWJzCisJICA7OworCXRlc3RfY29tcGlsZSkKKwkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCisJICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAorCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKKwkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdC5jCisJICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisJICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAorCSAgaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnM7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQlpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCSAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgKiIgJGkgIiopCisJCSAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgICBpPSIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCQkgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKKwkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzOyBzaGlmdAorCQkgIGRlcGxpYl9tYXRjaD0kMQorCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICBlbHNlCisJCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkJICAgIGVjaG8KKwkJICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKKwkJICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgorCQkgICAgZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgorCQkgICAgZWNobyAiKioqIGl0cyBkeW5hbWljIGRlcGVuZGVuY3kgbGlzdCB0aGF0IHByb2dyYW1zIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgIGZpCisJCWZpCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKKwkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQkkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0CisJCWlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICAgICAgaT0iIgorCQkgICAgICA7OworCQkgICAgZXNhYworCQkgIGZpCisJCSAgaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCQkgICAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCAiXFwkRUNITyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcIiJgCisJCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzOyBzaGlmdAorCQkgICAgZGVwbGliX21hdGNoPSQxCisJCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICAgIGVsc2UKKwkJICAgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICAgIGVjaG8KKwkJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkgICAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgorCQkgICAgICBlY2hvICIqKiogYXMgYSBkeW5hbWljIGRlcGVuZGVuY3kgdGhhdCBwcm9ncmFtcyBjYW4gZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCisJCSAgICBmaQorCQkgIGZpCisJCWVsc2UKKwkJICBkcm9wcGVkZGVwcz15ZXMKKwkJICBlY2hvCisJCSAgJEVDSE8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKKwkJICBlY2hvICIqKiogbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKKwkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgorCQlmaQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgIGZpCisJICA7OworCWZpbGVfbWFnaWMqKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgY2FzZSAkYV9kZXBsaWIgaW4KKwkgICAgLWwqKQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCisJICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfZ2xvYiI7IHRoZW4KKwkJICBsaWJuYW1lZ2xvYj1gZnVuY19lY2hvX2FsbCAiJGxpYm5hbWUiIHwgJFNFRCAtZSAkZmlsZV9tYWdpY19nbG9iYAorCQllbHNlCisJCSAgbGlibmFtZWdsb2I9JGxpYm5hbWUKKwkJZmkKKwkJdGVzdCAiJHdhbnRfbm9jYXNlZ2xvYiIgPSB5ZXMgJiYgbm9jYXNlZ2xvYj1gc2hvcHQgLXAgbm9jYXNlZ2xvYmAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgaWYgdGVzdCAiJHdhbnRfbm9jYXNlZ2xvYiIgPSB5ZXM7IHRoZW4KKwkJICAgIHNob3B0IC1zIG5vY2FzZWdsb2IKKwkJICAgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZWdsb2JbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICAgICRub2Nhc2VnbG9iCisJCSAgZWxzZQorCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lZ2xvYlsuLV0qIDI+L2Rldi9udWxsYAorCQkgIGZpCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgfAorCQkJICRHUkVQICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCisJCQljb250aW51ZQorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCisJCQljYXNlICRwb3RsaWJsaW5rIGluCisJCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKKwkJCSopIHBvdGxpYj1gJEVDSE8gIiRwb3RsaWIiIHwgJFNFRCAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7CisJCQllc2FjCisJCSAgICAgIGRvbmUKKwkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIHwKKwkJCSAkU0VEIC1lIDEwcSB8CisJCQkgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJCWZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCQlhX2RlcGxpYj0iIgorCQkJYnJlYWsgMgorCQkgICAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgorCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCWVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCisJCWVsc2UKKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkRUNITyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwltYXRjaF9wYXR0ZXJuKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIGNhc2UgJGFfZGVwbGliIGluCisJICAgIC1sKikKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgorCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkgIGFfZGVwbGliPSIiCisJCSAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAorCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICAgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYWJvdmUgaW4gZmlsZV9tYWdpYyB0ZXN0CisJCSAgICBpZiBldmFsICJcJEVDSE8gXCIkcG90ZW50X2xpYlwiIiAyPi9kZXYvbnVsbCB8ICRTRUQgMTBxIHwgXAorCQkgICAgICAgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJICAgICAgYV9kZXBsaWI9IiIKKwkJICAgICAgYnJlYWsgMgorCQkgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgorCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciByZWdleCBwYXR0ZXJuIHRlc3QpIgorCQllbHNlCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCisJCSAgJEVDSE8gIioqKiB1c2luZyBhIHJlZ2V4IHBhdHRlcm4uIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgorCQlmaQorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgdG1wX2RlcGxpYnM9YCRFQ0hPICIgJGRlcGxpYnMiIHwgJFNFRCAncy8gLWxjJC8vOyBzLyAtW0xSXVteIF0qLy9nJ2AKKwkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkgICAgZm9yIGkgaW4gJHByZWRlcHMgJHBvc3RkZXBzIDsgZG8KKwkgICAgICAjIGNhbid0IHVzZSBYc2VkIGJlbG93LCBiZWNhdXNlICRpIG1pZ2h0IGNvbnRhaW4gJy8nCisJICAgICAgdG1wX2RlcGxpYnM9YCRFQ0hPICIgJHRtcF9kZXBsaWJzIiB8ICRTRUQgInMsJGksLCJgCisJICAgIGRvbmUKKwkgIGZpCisJICBjYXNlICR0bXBfZGVwbGlicyBpbgorCSAgKlshXAlcIF0qKQorCSAgICBlY2hvCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKKwkgICAgZWxzZQorCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IGtub3duIHRvIGJlIHN1cHBvcnRlZC4iCisJICAgIGZpCisJICAgIGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKKwltYWpvcj0kbWFqb3Jfc2F2ZQorCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQorCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQorCW5hbWU9JG5hbWVfc2F2ZQorCisJY2FzZSAkaG9zdCBpbgorCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IHdpdGggdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgIG5ld2RlcGxpYnM9YCRFQ0hPICIgJG5ld2RlcGxpYnMiIHwgJFNFRCAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICBlY2hvCisJICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgorCSAgICAkRUNITyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCisJICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICBlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCisJICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgIGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJICAgICAgZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCSAgICAgIGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICBlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgorCSAgICBlY2hvICIqKiogYXV0b21hdGljYWxseSBhZGRlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdGhpcyBsaWJyYXJ5IgorCSAgICBlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgorCSAgICAgIGVjaG8KKwkgICAgICBlY2hvICIqKiogU2luY2UgdGhpcyBsaWJyYXJ5IG11c3Qgbm90IGNvbnRhaW4gdW5kZWZpbmVkIHN5bWJvbHMsIgorCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgIGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKKwkgICAgICBlY2hvICIqKiogbGlidG9vbCB3aWxsIG9ubHkgY3JlYXRlIGEgc3RhdGljIHZlcnNpb24gb2YgaXQuIgorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCQlvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJCWJ1aWxkX29sZF9saWJzPXllcworCSAgICAgIGVsc2UKKwkJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisJZmkKKwkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKKwlkZXBsaWJzPSRuZXdkZXBsaWJzCisgICAgICBmaQorICAgICAgIyBUaW1lIHRvIGNoYW5nZSBhbGwgb3VyICJmb28ubHRmcmFtZXdvcmsiIHN0dWZmIGJhY2sgdG8gIi1mcmFtZXdvcmsgZm9vIgorICAgICAgY2FzZSAkaG9zdCBpbgorCSotKi1kYXJ3aW4qKQorCSAgbmV3ZGVwbGlicz1gJEVDSE8gIiAkbmV3ZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCSAgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBkZXBsaWJzPWAkRUNITyAiICRkZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICA7OworICAgICAgZXNhYworCisgICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKKyAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0CisgICAgICBuZXdfbGlicz0KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJY2FzZSAiICRuZXdfbGlicyAiIGluCisJKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OworCSopCisJICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBmdW5jX2FwcGVuZCBuZXdfbGlicyAiIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBkZXBsaWJzPSIkbmV3X2xpYnMiCisKKyAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KKyAgICAgIGxpYnJhcnlfbmFtZXM9CisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIGRsbmFtZT0KKworICAgICAgIyBUZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQorICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkjIFJlbW92ZSAke3dsfSBpbnN0YW5jZXMgd2hlbiBsaW5raW5nIHdpdGggbGQuCisJIyBGSVhNRTogc2hvdWxkIHRlc3QgdGhlIHJpZ2h0IF9jbWRzIHZhcmlhYmxlLgorCWNhc2UgJGFyY2hpdmVfY21kcyBpbgorCSAgKlwkTERcICopIHdsPSA7OworICAgICAgICBlc2FjCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKKwkgIGhhcmRjb2RlX2xpYmRpcnM9CisJICBkZXBfcnBhdGg9CisJICBycGF0aD0iJGZpbmFsaXplX3JwYXRoIgorCSAgdGVzdCAiJG9wdF9tb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGxpYmRpciIKKwkJbGliZGlyPSRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQKKwkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkJZWxzZQorCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICAgIDs7CisJCSAgKikKKwkJICAgIGZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJICAgIDs7CisJCSAgZXNhYworCQlmaQorCSAgICAgIGVsc2UKKwkJZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCQlmdW5jX2FwcGVuZCBkZXBfcnBhdGggIiAkZmxhZyIKKwkgICAgICBmaQorCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBkb25lCisJICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJICAgICB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwkgICAgZXZhbCAiZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIiIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgICBycGF0aD0KKwkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICAgIGRvbmUKKwkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCisJICBmaQorCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKKwlmaQorCisJc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgorCXRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXNoaWZ0CisJcmVhbG5hbWU9IiQxIgorCXNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGZ1bmNfYXBwZW5kIGxpbmtuYW1lcyAiICRsaW5rIgorCWRvbmUKKworCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCisJdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKwlkZWxmaWxlcz0KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKKwkgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzIgorCWZpCisKKwlvcmlnX2V4cG9ydF9zeW1ib2xzPQorCWNhc2UgJGhvc3Rfb3MgaW4KKwljeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICMgZXhwb3J0aW5nIHVzaW5nIHVzZXIgc3VwcGxpZWQgc3ltZmlsZQorCSAgICBpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgIT0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAjIGFuZCBpdCdzIE5PVCBhbHJlYWR5IGEgLmRlZiBmaWxlLiBNdXN0IGZpZ3VyZSBvdXQKKwkgICAgICAjIHdoaWNoIG9mIHRoZSBnaXZlbiBzeW1ib2xzIGFyZSBkYXRhIHN5bWJvbHMgYW5kIHRhZworCSAgICAgICMgdGhlbSBhcyBzdWNoLiBTbywgdHJpZ2dlciB1c2Ugb2YgZXhwb3J0X3N5bWJvbHNfY21kcy4KKwkgICAgICAjIGV4cG9ydF9zeW1ib2xzIGdldHMgcmVhc3NpZ25lZCBpbnNpZGUgdGhlICJwcmVwYXJlCisJICAgICAgIyB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzIiBpZiBzdGF0ZW1lbnQsIHNvIHRoZQorCSAgICAgICMgaW5jbHVkZV9leHBzeW1zIGxvZ2ljIHN0aWxsIHdvcmtzLgorCSAgICAgIG9yaWdfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0KKwkgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJICAgIGZpCisJICBmaQorCSAgOzsKKwllc2FjCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZDEgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgIyBUYWtlIHRoZSBub3JtYWwgYnJhbmNoIGlmIHRoZSBubV9maWxlX2xpc3Rfc3BlYyBicmFuY2gKKwkgICAgICAjIGRvZXNuJ3Qgd29yayBvciBpZiB0b29sIGNvbnZlcnNpb24gaXMgbm90IG5lZWRlZC4KKwkgICAgICBjYXNlICRubV9maWxlX2xpc3Rfc3BlY34kdG9fdG9vbF9maWxlX2NtZCBpbgorCQkqfmZ1bmNfY29udmVydF9maWxlX25vb3AgfCAqfmZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIHwgfiopCisJCSAgdHJ5X25vcm1hbF9icmFuY2g9eWVzCisJCSAgZXZhbCBjbWQ9XCIkY21kMVwiCisJCSAgZnVuY19sZW4gIiAkY21kIgorCQkgIGxlbj0kZnVuY19sZW5fcmVzdWx0CisJCSAgOzsKKwkJKikKKwkJICB0cnlfbm9ybWFsX2JyYW5jaD1ubworCQkgIDs7CisJICAgICAgZXNhYworCSAgICAgIGlmIHRlc3QgIiR0cnlfbm9ybWFsX2JyYW5jaCIgPSB5ZXMgXAorCQkgJiYgeyB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgXAorCQkgICAgICB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgfQorCSAgICAgIHRoZW4KKwkJZnVuY19zaG93X2V2YWwgIiRjbWQiICdleGl0ICQ/JworCQlza2lwcGVkX2V4cG9ydD1mYWxzZQorCSAgICAgIGVsaWYgdGVzdCAtbiAiJG5tX2ZpbGVfbGlzdF9zcGVjIjsgdGhlbgorCQlmdW5jX2Jhc2VuYW1lICIkb3V0cHV0IgorCQlvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisJCXNhdmVfbGlib2Jqcz0kbGlib2JqcworCQlzYXZlX291dHB1dD0kb3V0cHV0CisJCW91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5ubQorCQlmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkJbGlib2Jqcz0kbm1fZmlsZV9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJCWZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkJZnVuY192ZXJib3NlICJjcmVhdGluZyAkTk0gaW5wdXQgZmlsZSBsaXN0OiAkb3V0cHV0IgorCQlmb3Igb2JqIGluICRzYXZlX2xpYm9ianM7IGRvCisJCSAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJCSAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJCWRvbmUgPiAiJG91dHB1dCIKKwkJZXZhbCBjbWQ9XCIkY21kMVwiCisJCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKKwkJb3V0cHV0PSRzYXZlX291dHB1dAorCQlsaWJvYmpzPSRzYXZlX2xpYm9ianMKKwkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKKwkgICAgICBlbHNlCisJCSMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgorCQlmdW5jX3ZlcmJvc2UgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgorCQlza2lwcGVkX2V4cG9ydD06CisJCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCisJCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgorCQlicmVhaworCSAgICAgIGZpCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IjsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICckRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiR0bXBfZXhwb3J0X3N5bWJvbHMiJworCWZpCisKKwlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICMgRklYTUU6ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciBwb3RlbnRpYWxseSBjb250YWlucyBsb3RzIG9mCisJICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQorCSAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgorCSAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCWZpCisKKwl0bXBfZGVwbGlicz0KKwlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICBjYXNlICIgJGNvbnZlbmllbmNlICIgaW4KKwkgICoiICR0ZXN0X2RlcGxpYiAiKikgOzsKKwkgICopCisJICAgIGZ1bmNfYXBwZW5kIHRtcF9kZXBsaWJzICIgJHRlc3RfZGVwbGliIgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisKKwlpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiICYmCisJICAgIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzICYmCisJICAgIHRlc3QgLXogIiRsaWJvYmpzIjsgdGhlbgorCSAgICAjIGV4dHJhY3QgdGhlIGFyY2hpdmVzLCBzbyB3ZSBoYXZlIG9iamVjdHMgdG8gbGlzdC4KKwkgICAgIyBUT0RPOiBjb3VsZCBvcHRpbWl6ZSB0aGlzIHRvIGp1c3QgZXh0cmFjdCBvbmUgYXJjaGl2ZS4KKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBlbHNlCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZsYWciCisJZmkKKworCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZworCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VSAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KKwlmaQorCisJIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICBmaQorCWVsc2UKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICBlbHNlCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfY21kc1wiCisJICAgIGNtZHM9JGFyY2hpdmVfY21kcworCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgorCSAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIgJiYKKwkgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdCAmJgorCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZQorCSAgIyBvciwgaWYgdXNpbmcgR05VIGxkIGFuZCBza2lwcGVkX2V4cG9ydCBpcyBub3QgOiwgdXNlIGEgbGlua2VyCisJICAjIHNjcmlwdC4KKworCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KKwkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQorCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQorCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKKwkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCisJICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55CisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCisJICAjIHRoZSBzcGVjLgorCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcworCSAgZmkKKwkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKKwkgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisJICBvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisKKwkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCisJICAjIGluaXRpYWxpemUgayB0byBvbmUuCisJICB0ZXN0X2NtZHM9CisJICBjb25jYXRfY21kcz0KKwkgIG9iamxpc3Q9CisJICBsYXN0X3JvYmo9CisJICBrPTEKKworCSAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgIG91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5sbmtzY3JpcHQKKwkgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBHTlUgbGQgc2NyaXB0OiAkb3V0cHV0IgorCSAgICBlY2hvICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgIGRvCisJICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICBlY2hvICcpJyA+PiAkb3V0cHV0CisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJICBlbGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiWCRmaWxlX2xpc3Rfc3BlYyIgIT0gWDsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rCisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgbGlua2VyIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkgICAgOiA+ICRvdXRwdXQKKwkgICAgc2V0IHggJHNhdmVfbGlib2JqcworCSAgICBzaGlmdAorCSAgICBmaXJzdG9iaj0KKwkgICAgaWYgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgICBmaXJzdG9iaj0iJDEgIgorCSAgICAgIHNoaWZ0CisJICAgIGZpCisJICAgIGZvciBvYmoKKwkgICAgZG8KKwkgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgPj4gJG91dHB1dAorCSAgICBkb25lCisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZmlyc3RvYmpcIiRmaWxlX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIgorCSAgZWxzZQorCSAgICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIjsgdGhlbgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCisJICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJICAgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgorCSAgICAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgICAgICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKKwkgICAgICBsZW49JGxlbjAKKworCSAgICAgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgorCSAgICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcworCSAgICAgIGRvCisJCWZ1bmNfbGVuICIgJG9iaiIKKwkJZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQlsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJCWlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8CisJCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgorCQkgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCQllbHNlCisJCSAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKKwkJICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgorCQkgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KKwkJICAgICMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCisJCSAgICByZWxvYWRfb2Jqcz0kb2JqbGlzdAorCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kc1wiCisJCSAgZWxzZQorCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCSAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kc35cJFJNICRsYXN0X3JvYmpcIgorCQkgIGZpCisJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJCSAgZnVuY19hcml0aCAkayArIDEKKwkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIG9iamxpc3Q9IiAkb2JqIgorCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKKwkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzXCIKKwkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgorCSAgICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfX5cJFJNICRsYXN0X3JvYmpcIgorCSAgICAgIGZpCisJICAgICAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkb3V0cHV0IgorCisJICAgIGVsc2UKKwkgICAgICBvdXRwdXQ9CisJICAgIGZpCisKKwkgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBsaWJvYmpzPSRvdXRwdXQKKwkgICAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgorCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCisJCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzflwkUk0gJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKKworCSAgICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCisJICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkb3B0X3NpbGVudCB8fCB7CisJCSAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKwkgICAgICB9CisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkJbHRfZXhpdD0kPworCisJCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCQlpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJCSAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKKwkJICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCisJCSAgICAkTVYgIiR7cmVhbG5hbWV9VSIgIiRyZWFsbmFtZSIgKQorCQlmaQorCisJCWV4aXQgJGx0X2V4aXQKKwkgICAgICB9CisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKworICAgICAgICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICAjIFRoZSBnaXZlbiBleHBvcnRzX3N5bWJvbHMgZmlsZSBoYXMgdG8gYmUgZmlsdGVyZWQsIHNvIGZpbHRlciBpdC4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICAgICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgICAgICMgJ3MnIGNvbW1hbmRzIHdoaWNoIG5vdCBhbGwgc2VkcyBjYW4gaGFuZGxlLiBHTlUgc2VkIHNob3VsZCBiZSBmaW5lCisJICAgICAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAgICAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICAgICAjIGlzbid0IGEgYmxlc3NlZCB0b29sLgorCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgICAgICBleHBvcnRfc3ltYm9scz0kb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCSAgICBmaQorCSAgZmkKKworCSAgbGlib2Jqcz0kb3V0cHV0CisJICAjIFJlc3RvcmUgdGhlIHZhbHVlIG9mIG91dHB1dC4KKwkgIG91dHB1dD0kc2F2ZV9vdXRwdXQKKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIiAmJiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZmkKKwkgICMgRXhwYW5kIHRoZSBsaWJyYXJ5IGxpbmtpbmcgY29tbWFuZHMgYWdhaW4gdG8gcmVzZXQgdGhlCisJICAjIHZhbHVlIG9mICRsaWJvYmpzIGZvciBwaWVjZXdpc2UgbGlua2luZy4KKworCSAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kbW9kdWxlX2NtZHMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICAgIGVsc2UKKwkgICAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRkZWxmaWxlcyI7IHRoZW4KKwkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgdG8gJGNtZHMuCisJICBldmFsIGNtZHM9XCJcJGNtZHN+XCRSTSAkZGVsZmlsZXNcIgorCWZpCisKKwkjIEFkZCBhbnkgb2JqZWN0cyBmcm9tIHByZWxvYWRlZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwlpZiB0ZXN0IC1uICIkZGxwcmVmaWxlcyI7IHRoZW4KKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcworCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCSAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwlmaQorCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCSAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisJICB9CisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgeworCSAgICBsdF9leGl0PSQ/CisKKwkgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAorCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKKwkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1UICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRNViAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPworCisJICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwkgICAgZmkKKwkgIGZpCisKKwkgIGV4aXQgJEVYSVRfU1VDQ0VTUworCWZpCisKKwkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgorCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbworCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgorCSAgICBmdW5jX3Nob3dfZXZhbCAnKGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkbGlua25hbWUiICYmICRMTl9TICIkcmVhbG5hbWUiICIkbGlua25hbWUiKScgJ2V4aXQgJD8nCisJICBmaQorCWRvbmUKKworCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCisJaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgorCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisJICBkbG5hbWU9IiRzb25hbWUiCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb2JqKQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KKyAgICAgICpcIC1sKiB8ICpcIC1MKikKKwlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAgICoubG8pCisJdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiICYmIFwKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIKKworCWxpYm9iaj0kb3V0cHV0CisJZnVuY19sbzJvICIkbGlib2JqIgorCW9iaj0kZnVuY19sbzJvX3Jlc3VsdAorCTs7CisgICAgICAqKQorCWxpYm9iaj0KKwlvYmo9IiRvdXRwdXQiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb2JqICRsaWJvYmoKKworICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCisgICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQorICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKKyAgICAgICMgdGhlIGV4dHJhY3Rpb24uCisgICAgICByZWxvYWRfY29udl9vYmpzPQorICAgICAgZ2VudG9wPQorICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKKyAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgYW5kIGhvcGUgd2UgY2FuIGdldCBieSB3aXRoCisgICAgICAjIHR1cm5pbmcgY29tbWEgaW50byBzcGFjZS4uCisgICAgICB3bD0KKworICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3M9XCIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgcmVsb2FkX2NvbnZfb2Jqcz0kcmVsb2FkX29ianNcIGAkRUNITyAiJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRTRUQgJ3N8LHwgfGcnYAorCWVsc2UKKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCWZpCisgICAgICBmaQorCisgICAgICAjIElmIHdlJ3JlIG5vdCBidWlsZGluZyBzaGFyZWQsIHdlIG5lZWQgdG8gdXNlIG5vbl9waWNfb2JqcworICAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIGxpYm9ianM9IiRub25fcGljX29iamVjdHMiCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIi9cLiR7bGliZXh0fSQvZDsgL1wubGliJC9kOyAkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRvcHRfZHJ5X3J1biB8fCBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICAgb3V0cHV0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuZXhlOzsKKyAgICAgIGVzYWMKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgorCisgICAgICB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgXAorICAgICAgICAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biBcCisJJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93biAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgTFRfSU5JVChbZGxvcGVuXSknIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIiAkY29tcGlsZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwk7OworICAgICAgZXNhYworCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotZGFyd2luKikKKwkjIERvbid0IGFsbG93IGxhenkgbGlua2luZywgaXQgYnJlYWtzIEMrKyBnbG9iYWwgY29uc3RydWN0b3JzCisJIyBCdXQgaXMgc3VwcG9zZWRseSBmaXhlZCBvbiAxMC40IG9yIGxhdGVyICh5YXkhKS4KKwlpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCisJICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9IGluCisJICAgIDEwLlswMTIzXSkKKwkgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR7d2x9LWJpbmRfYXRfbG9hZCIKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCSMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKKwljb21waWxlX2RlcGxpYnM9YCRFQ0hPICIgJGNvbXBpbGVfZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICIgJGZpbmFsaXplX2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwk7OworICAgICAgZXNhYworCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkY29tcGlsZV9kZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGNvbXBpbGVfZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBjb21waWxlX2RlcGxpYnM9IiRuZXdfbGlicyIKKworCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRmaW5hbGl6ZV9kZXBsaWJzIgorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKKyAgICAgIHJwYXRoPQorICAgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbworCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgaGFyZGNvZGVfbGliZGlycyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JGxpYmRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGZpCisgICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRvdXRwdXRuYW1lIiAiQFBST0dSQU1AIiAibm8iCisKKyAgICAgICMgdGVtcGxhdGUgcHJlbGlua2luZyBzdGVwCisgICAgICBpZiB0ZXN0IC1uICIkcHJlbGlua19jbWRzIjsgdGhlbgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcHJlbGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPXllcworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmNlZ2NjKiB8ICptaW5ndzMyY2UqKQorICAgICAgICAjIERpc2FibGUgd3JhcHBlcnMgZm9yIGNlZ2NjIGFuZCBtaW5ndzMyY2UgaG9zdHMsIHdlIGFyZSBjcm9zcyBjb21waWxpbmcgYW55d2F5LgorICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICA7OworICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGlmIHRlc3QgIiRuZWVkX3JlbGluayIgPSBubyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAiJHdyYXBwZXJzX3JlcXVpcmVkIiA9IG5vOyB0aGVuCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCWV4aXRfc3RhdHVzPTAKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JworCisJaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkgIHBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZycgLWUgJ3MlQFRPT0xfT1VUUFVUQCUnIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiJyVnJ2AKKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGxpbmtfY21kcyIgJ2V4aXQgJD8nCisJZmkKKworCSMgRGVsZXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IjsgdGhlbgorCSAgZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IicKKwlmaQorCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGNvbXBpbGVfdmFyPQorICAgICAgZmluYWxpemVfdmFyPQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgZG9uZQorCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbworCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICBkb25lCisJICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwkjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgorCSRvcHRfZHJ5X3J1biB8fCAkUk0gJG91dHB1dAorCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAorCWZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworCWlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICBwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RsaW5rX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisJIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKworCWZ1bmNfd2FybmluZyAidGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiCisJZnVuY193YXJuaW5nICJcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgorCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRTRUQgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworICAgICAgaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIgorCXBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisJZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbHNlCisJICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGZpCisJZG9uZQorCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCisJcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgorCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgorCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCisJICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisJICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKwkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKwkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQorCisJICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCisJICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQorCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCisJICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKKwkgICAgfQorCisJICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6CisJICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCisJICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCisJICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KKwkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgICBlbHNlCisJCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZmkKKwkgICAgfQorCSAgOzsKKwkgICogKQorCSAgICAkUk0gJG91dHB1dAorCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKKwkgICAgY2htb2QgK3ggJG91dHB1dAorCSAgOzsKKwllc2FjCisgICAgICB9CisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkc3ltZmlsZW9iaiIKKwkgIGZpCisJZmkKKwlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCisJZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwlmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKyAgICAgIGVsc2UKKworCSMgQWRkIGFueSBvYmplY3RzIGZyb20gcHJlbG9hZGVkIGNvbnZlbmllbmNlIGxpYnJhcmllcworCWlmIHRlc3QgLW4gIiRkbHByZWZpbGVzIjsgdGhlbgorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZmkKKworCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQorCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCisJIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKKwkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZworCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5CisJIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgorCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCisJICAgIGRvCisJICAgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBkb25lIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKwkgIDoKKwllbHNlCisJICBlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKwkgIGZ1bmNfbWtkaXJfcCAiJGdlbnRvcCIKKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgIGNvdW50ZXI9MQorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgorCSAgICBvYmpiYXNlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCisJICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7CisJICAgICpbXCAvXSIkb2JqYmFzZSAiKikKKwkgICAgICB3aGlsZSA6OyBkbworCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbworCQkjIG92ZXJsYXBzLgorCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQorCQlmdW5jX2FyaXRoICRjb3VudGVyICsgMQorCQljb3VudGVyPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQljYXNlICIgJG9sZG9ianMgIiBpbgorCQkqW1wgL10iJG5ld29iaiAiKikgOzsKKwkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OworCQllc2FjCisJICAgICAgZG9uZQorCSAgICAgIGZ1bmNfc2hvd19ldmFsICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKKwkgICAgICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkb2JqIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlmdW5jX3RvX3Rvb2xfZmlsZSAiJG9sZGxpYiIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwl0b29sX29sZGxpYj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorCisJZnVuY19sZW4gIiAkY21kcyIKKwlsZW49JGZ1bmNfbGVuX3Jlc3VsdAorCWlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcworCWVsaWYgdGVzdCAtbiAiJGFyY2hpdmVyX2xpc3Rfc3BlYyI7IHRoZW4KKwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgY29tbWFuZCBmaWxlIGFyY2hpdmUgbGlua2luZy4uLiIKKwkgIGZvciBvYmogaW4gJG9sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2JqIgorCSAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIKKwkgIGRvbmUgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5saWJjbWQKKwkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8kbGlibmFtZS5saWJjbWQiCisJICBvbGRvYmpzPSIgJGFyY2hpdmVyX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCisJZWxzZQorCSAgIyB0aGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgaW4gcGFydHMKKwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgcGllY2V3aXNlIGFyY2hpdmUgbGlua2luZy4uLiIKKwkgIHNhdmVfUkFOTElCPSRSQU5MSUIKKwkgIFJBTkxJQj06CisJICBvYmpsaXN0PQorCSAgY29uY2F0X2NtZHM9CisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICAjIElzIHRoZXJlIGEgYmV0dGVyIHdheSBvZiBmaW5kaW5nIHRoZSBsYXN0IG9iamVjdCBpbiB0aGUgbGlzdD8KKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgbGFzdF9vbGRvYmo9JG9iagorCSAgZG9uZQorCSAgZXZhbCB0ZXN0X2NtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiCisJICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKKwkgIGxlbj0kbGVuMAorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBmdW5jX2xlbiAiICRvYmoiCisJICAgIGZ1bmNfYXJpdGggJGxlbiArICRmdW5jX2xlbl9yZXN1bHQKKwkgICAgbGVuPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBvYmpsaXN0ICIgJG9iaiIKKwkgICAgaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iOyB0aGVuCisJICAgICAgOgorCSAgICBlbHNlCisJICAgICAgIyB0aGUgYWJvdmUgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBiZWZvcmUgaXQgZ2V0cyB0b28gbG9uZworCSAgICAgIG9sZG9ianM9JG9iamxpc3QKKwkgICAgICBpZiB0ZXN0ICIkb2JqIiA9ICIkbGFzdF9vbGRvYmoiIDsgdGhlbgorCQlSQU5MSUI9JHNhdmVfUkFOTElCCisJICAgICAgZmkKKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgICAgIG9iamxpc3Q9CisJICAgICAgbGVuPSRsZW4wCisJICAgIGZpCisJICBkb25lCisJICBSQU5MSUI9JHNhdmVfUkFOTElCCisJICBvbGRvYmpzPSRvYmpsaXN0CisJICBpZiB0ZXN0ICJYJG9sZG9ianMiID0gIlgiIDsgdGhlbgorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzXCIKKwkgIGVsc2UKKwkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc35cJG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkY21kcyIgJ2V4aXQgJD8nCisgICAgZG9uZQorCisgICAgdGVzdCAtbiAiJGdlbmVyYXRlZCIgJiYgXAorICAgICAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciRnZW5lcmF0ZWQiCisKKyAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KKyAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAqLmxhKQorICAgICAgb2xkX2xpYnJhcnk9CisgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgorICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisgICAgICBmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KKwlpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZWxzZQorCSAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHZhcl92YWx1ZSIKKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBRdW90ZSB0aGUgbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIHJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1tb2RlPXJlbGluayAkbGlidG9vbF9hcmdzIEBpbnN0X3ByZWZpeF9kaXJAKSIKKyAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXMgOyB0aGVuCisJcmVsaW5rX2NvbW1hbmQ9CisgICAgICBmaQorCisgICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJZm9yIGluc3RhbGxlZCBpbiBubyB5ZXM7IGRvCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9saWJkaXIiOyB0aGVuCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgICAgb3V0cHV0PSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCisJICAgICMgUmVwbGFjZSBhbGwgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMgd2l0aCB0aGUgaW5zdGFsbGVkIG9uZXMKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgKi5sYSkKKwkJZnVuY19iYXNlbmFtZSAiJGRlcGxpYiIKKwkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCQlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdGAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkZXBlbmRlbmN5X2xpYnMgIiAke2x0X3N5c3Jvb3Q6Kz19JGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAtTCopCisJCWZ1bmNfc3RyaXBuYW1lIC1MICcnICIkZGVwbGliIgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgLUwkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCQk7OworCSAgICAgIC1SKikKKwkJZnVuY19zdHJpcG5hbWUgLVIgJycgIiRkZXBsaWIiCisJCWZ1bmNfcmVwbGFjZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCQlmdW5jX2FwcGVuZCBuZXdkZXBlbmRlbmN5X2xpYnMgIiAtUiRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQiCisJCTs7CisJICAgICAgKikgZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgKikgZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJCSMgT25seSBwYXNzIHByZW9wZW5lZCBmaWxlcyB0byB0aGUgcHNldWRvLWFyY2hpdmUgKGZvcgorCQkjIGV2ZW50dWFsIGxpbmtpbmcgd2l0aCB0aGUgYXBwLiB0aGF0IGxpbmtzIGl0KSBpZiB3ZQorCQkjIGRpZG4ndCBhbHJlYWR5IGxpbmsgdGhlIHByZW9wZW5lZCBvYmplY3RzIGRpcmVjdGx5IGludG8KKwkJIyB0aGUgbGlicmFyeToKKwkJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJCWZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAke2x0X3N5c3Jvb3Q6Kz19JGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9CisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OworCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkYWJzIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKwkgIGZpCisJICAkUk0gJG91dHB1dAorCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCisJICAjIEluIGZhY3QsIGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgdXNlIHRoaXMgY29kZSBmb3IgYWxsIHRhcmdldAorCSAgIyBzeXN0ZW1zIHRoYXQgY2FuJ3QgaGFyZC1jb2RlIGxpYnJhcnkgcGF0aHMgaW50byB0aGVpciBleGVjdXRhYmxlcworCSAgIyBhbmQgdGhhdCBoYXZlIG5vIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUgaW5kZXBlbmRlbnQgb2YgUEFUSCwKKwkgICMgYnV0IGl0IHR1cm5zIG91dCB3ZSBjYW4ndCBlYXNpbHkgZGV0ZXJtaW5lIHRoYXQgZnJvbSBpbnNwZWN0aW5nCisJICAjIGxpYnRvb2wgdmFyaWFibGVzLCBzbyB3ZSBoYXZlIHRvIGhhcmQtY29kZSB0aGUgT1NzIHRvIHdoaWNoIGl0CisJICAjIGFwcGxpZXMgaGVyZTsgYXQgdGhlIG1vbWVudCwgdGhhdCBtZWFucyBwbGF0Zm9ybXMgdGhhdCB1c2UgdGhlIFBFCisJICAjIG9iamVjdCBmb3JtYXQgd2l0aCBETEwgZmlsZXMuICBTZWUgdGhlIGxvbmcgY29tbWVudCBhdCB0aGUgdG9wIG9mCisJICAjIHRlc3RzL2JpbmRpci5hdCBmb3IgZnVsbCBkZXRhaWxzLgorCSAgdGRsbmFtZT0kZGxuYW1lCisJICBjYXNlICRob3N0LCRvdXRwdXQsJGluc3RhbGxlZCwkbW9kdWxlLCRkbG5hbWUgaW4KKwkgICAgKmN5Z3dpbiosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqbWluZ3cqLCpsYWkseWVzLG5vLCouZGxsIHwgKmNlZ2NjKiwqbGFpLHllcyxubywqLmRsbCkKKwkgICAgICAjIElmIGEgLWJpbmRpciBhcmd1bWVudCB3YXMgc3VwcGxpZWQsIHBsYWNlIHRoZSBkbGwgdGhlcmUuCisJICAgICAgaWYgdGVzdCAieCRiaW5kaXIiICE9IHggOworCSAgICAgIHRoZW4KKwkJZnVuY19yZWxhdGl2ZV9wYXRoICIkaW5zdGFsbF9saWJkaXIiICIkYmluZGlyIgorCQl0ZGxuYW1lPSRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0JGRsbmFtZQorCSAgICAgIGVsc2UKKwkJIyBPdGhlcndpc2UgZmFsbCBiYWNrIG9uIGhldXJpc3RpYy4KKwkJdGRsbmFtZT0uLi9iaW4vJGRsbmFtZQorCSAgICAgIGZpCisJICAgICAgOzsKKwkgIGVzYWMKKwkgICRFQ0hPID4gJG91dHB1dCAiXAorIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JyR0ZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSckbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIE5hbWVzIG9mIGFkZGl0aW9uYWwgd2VhayBsaWJyYXJpZXMgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5Cit3ZWFrX2xpYnJhcnlfbmFtZXM9JyR3ZWFrX2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9JG1vZHVsZQorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KKwkgICAgJEVDSE8gPj4gJG91dHB1dCAiXAorcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKKwkgIGZpCisJZG9uZQorICAgICAgfQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgZnVuY19zaG93X2V2YWwgJyggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRvdXRwdXRuYW1lIiAmJiAkTE5fUyAiLi4vJG91dHB1dG5hbWUiICIkb3V0cHV0bmFtZSIgKScgJ2V4aXQgJD8nCisgICAgICA7OworICAgIGVzYWMKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworeyB0ZXN0ICIkb3B0X21vZGUiID0gbGluayB8fCB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB9ICYmCisgICAgZnVuY19tb2RlX2xpbmsgJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfdW5pbnN0YWxsIGFyZy4uLgorZnVuY19tb2RlX3VuaW5zdGFsbCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBSTT0iJG5vbm9wdCIKKyAgICBmaWxlcz0KKyAgICBybWZvcmNlPQorICAgIGV4aXRfc3RhdHVzPTAKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1mKSBmdW5jX2FwcGVuZCBSTSAiICRhcmciOyBybWZvcmNlPXllcyA7OworICAgICAgLSopIGZ1bmNfYXBwZW5kIFJNICIgJGFyZyIgOzsKKyAgICAgICopIGZ1bmNfYXBwZW5kIGZpbGVzICIgJGFyZyIgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICB0ZXN0IC16ICIkUk0iICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIgorCisgICAgcm1kaXJzPQorCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisgICAgICBkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgaWYgdGVzdCAiWCRkaXIiID0gWC47IHRoZW4KKwlvZGlyPSIkb2JqZGlyIgorICAgICAgZWxzZQorCW9kaXI9IiRkaXIvJG9iamRpciIKKyAgICAgIGZpCisgICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKyAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIHRlc3QgIiRvcHRfbW9kZSIgPSB1bmluc3RhbGwgJiYgb2Rpcj0iJGRpciIKKworICAgICAgIyBSZW1lbWJlciBvZGlyIGZvciByZW1vdmFsIGxhdGVyLCBiZWluZyBjYXJlZnVsIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbjsgdGhlbgorCWNhc2UgIiAkcm1kaXJzICIgaW4KKwkgICoiICRvZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgcm1kaXJzICIgJG9kaXIiIDs7CisJZXNhYworICAgICAgZmkKKworICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KKyAgICAgIGlmIHsgdGVzdCAtTCAiJGZpbGUiOyB9ID4vZGV2L251bGwgMj4mMSB8fAorCSB7IHRlc3QgLWggIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJOgorICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KKwlleGl0X3N0YXR1cz0xCisJY29udGludWUKKyAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIHJtZmlsZXM9IiRmaWxlIgorCisgICAgICBjYXNlICRuYW1lIGluCisgICAgICAqLmxhKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KKwlpZiBmdW5jX2xhbGliX3AgIiRmaWxlIjsgdGhlbgorCSAgZnVuY19zb3VyY2UgJGRpci8kbmFtZQorCisJICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgorCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kbiIKKwkgIGRvbmUKKwkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyLyRvbGRfbGlicmFyeSIKKworCSAgY2FzZSAiJG9wdF9tb2RlIiBpbgorCSAgY2xlYW4pCisJICAgIGNhc2UgIiAkbGlicmFyeV9uYW1lcyAiIGluCisJICAgICoiICRkbG5hbWUgIiopIDs7CisJICAgICopIHRlc3QgLW4gIiRkbG5hbWUiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kZGxuYW1lIiA7OworCSAgICBlc2FjCisJICAgIHRlc3QgLW4gIiRsaWJkaXIiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kbmFtZSAkb2Rpci8ke25hbWV9aSIKKwkgICAgOzsKKwkgIHVuaW5zdGFsbCkKKwkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX3Bvc3R1bmluc3RhbGxfY21kcyIgJ3Rlc3QgIiRybWZvcmNlIiA9IHllcyB8fCBleGl0X3N0YXR1cz0xJworCSAgICBmaQorCSAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgb2JqZWN0LCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgJGRpci8kbmFtZQorCisJICAjIEFkZCBQSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KKwkgIGlmIHRlc3QgLW4gIiRwaWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRkaXIvJHBpY19vYmplY3QiCisJICBmaQorCisJICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiICYmCisJICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRkaXIvJG5vbl9waWNfb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICopCisJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IGNsZWFuIDsgdGhlbgorCSAgbm9leGVuYW1lPSRuYW1lCisJICBjYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG5hbWUiCisJICAgIG5vZXhlbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICMgJGZpbGUgd2l0aCAuZXhlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gcm1maWxlcywKKwkgICAgIyBhZGQgJGZpbGUgd2l0aG91dCAuZXhlCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZmlsZSIKKwkgICAgOzsKKwkgIGVzYWMKKwkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgorCSAgaWYgZnVuY19sdHdyYXBwZXJfcCAiJGZpbGUiOyB0aGVuCisJICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCisJICAgICAgcmVsaW5rX2NvbW1hbmQ9CisJICAgICAgZnVuY19zb3VyY2UgJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKKwkgICAgZWxzZQorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRkaXIvJG5vZXhlbmFtZQorCSAgICBmaQorCisJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CisJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kbmFtZSAkb2Rpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvbHQtJG5hbWUiCisJICAgIGZpCisJICAgIGlmIHRlc3QgIlgkbm9leGVuYW1lIiAhPSAiWCRuYW1lIiA7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvbHQtJHtub2V4ZW5hbWV9LmMiCisJICAgIGZpCisJICBmaQorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkUk0gJHJtZmlsZXMiICdleGl0X3N0YXR1cz0xJworICAgIGRvbmUKKworICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcworICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgInJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBleGl0ICRleGl0X3N0YXR1cworfQorCit7IHRlc3QgIiRvcHRfbW9kZSIgPSB1bmluc3RhbGwgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IGNsZWFuOyB9ICYmCisgICAgZnVuY19tb2RlX3VuaW5zdGFsbCAkezErIiRAIn0KKwordGVzdCAteiAiJG9wdF9tb2RlIiAmJiB7CisgIGhlbHA9IiRnZW5lcmljX2hlbHAiCisgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIE1PREUiCit9CisKK3Rlc3QgLXogIiRleGVjX2NtZCIgJiYgXAorICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkb3B0X21vZGUnIgorCitpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCisgIGV2YWwgZXhlYyAiJGV4ZWNfY21kIgorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKK2V4aXQgJGV4aXRfc3RhdHVzCisKKworIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KKyMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCisjIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAorIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKKyMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CisjIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0CisjIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKKyMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KKyMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKKyMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCitidWlsZF9saWJ0b29sX2xpYnM9bm8KK2J1aWxkX29sZF9saWJzPXllcworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworYnVpbGRfb2xkX2xpYnM9YGNhc2UgJGJ1aWxkX2xpYnRvb2xfbGlicyBpbiB5ZXMpIGVjaG8gbm87OyAqKSBlY2hvIHllczs7IGVzYWNgCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTpzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246MgorIyBFbmQ6CisjIHZpOnN3PTIKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9tNC9hY19zeXN0ZW1fZXh0ZW5zaW9ucy5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvYWNfc3lzdGVtX2V4dGVuc2lvbnMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhMmVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvYWNfc3lzdGVtX2V4dGVuc2lvbnMubTQKQEAgLTAsMCArMSwzNyBAQAorZG5sIFByb3ZpZGUgQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TIGZvciBvbGQgYXV0b2NvbmYgbWFjaGluZXMuCitBQ19ERUZVTihbQUNYX1VTRV9TWVNURU1fRVhURU5TSU9OU10sWworICBpZmRlZihbQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TXSxbCisgICAgQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TCisgIF0sWworICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfQ09NUElMRV9JRkVMU0VdKQorICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfUlVOX0lGRUxTRV0pCisKKyAgICBBQ19SRVFVSVJFKFtBQ19HTlVfU09VUkNFXSkKKyAgICBBQ19SRVFVSVJFKFtBQ19BSVhdKQorICAgIEFDX1JFUVVJUkUoW0FDX01JTklYXSkKKworICAgIEFIX1ZFUkJBVElNKFtfX0VYVEVOU0lPTlNfX10sCitbLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gU29sYXJpcy4gICovCisjaWZuZGVmIF9fRVhURU5TSU9OU19fCisjIHVuZGVmIF9fRVhURU5TSU9OU19fCisjZW5kaWYKKyNpZm5kZWYgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTCisjIHVuZGVmIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUworI2VuZGlmCisjaWZuZGVmIF9UQU5ERU1fU09VUkNFCisjIHVuZGVmIF9UQU5ERU1fU09VUkNFCisjZW5kaWZdKQorICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGl0IGlzIHNhZmUgdG8gZGVmaW5lIF9fRVhURU5TSU9OU19fXSwKKyAgICAgIFthY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfX10sCisgICAgICBbQUNfQ09NUElMRV9JRkVMU0UoCisgICAgICAgICBbQUNfTEFOR19QUk9HUkFNKFsKKyMgICAgICAgICAgIGRlZmluZSBfX0VYVEVOU0lPTlNfXyAxCisgICAgICAgICAgICBBQ19JTkNMVURFU19ERUZBVUxUXSldLAorICAgICAgICAgW2FjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fPXllc10sCisgICAgICAgICBbYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX189bm9dKV0pCisgICAgdGVzdCAkYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX18gPSB5ZXMgJiYKKyAgICAgIEFDX0RFRklORShbX19FWFRFTlNJT05TX19dKQorICAgIEFDX0RFRklORShbX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTXSkKKyAgICBBQ19ERUZJTkUoW19UQU5ERU1fU09VUkNFXSkKKyAgXSkKK10pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2FjeF9jaGVja19zdW5jYy5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvYWN4X2NoZWNrX3N1bmNjLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOGY5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2FjeF9jaGVja19zdW5jYy5tNApAQCAtMCwwICsxLDc0IEBACitkbmwgQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgU3VuIFN0dWRpbyBjb21waWxlci4KK2RubCBJZiBTdW4gU3R1ZGlvIGNvbXBpbGVyIGlzIGZvdW5kLCBzZXQgYXBwcm9wcmlhdGUgZmxhZ3MuCitkbmwgQWRkaXRpb25hbGx5LCBTdW4gU3R1ZGlvIGRvZXNuJ3QgZGVmYXVsdCB0byA2NC1iaXQgYnkgaXRzZWxmLAorZG5sIG5vciBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgbG9vayBpbiBzdGFuZGFyZCBTb2xhcmlzIHBsYWNlcyBmb3IKK2RubCA2NC1iaXQgbGlicywgc28gd2UgbXVzdCBhZGQgdGhvc2Ugb3B0aW9ucyBhbmQgcGF0aHMgdG8gdGhlIHNlYXJjaAorZG5sIHBhdGhzLgorCitkbmwgVE9ETyhrZW50b24pOiAgVGhpcyBpcyBwcmV0dHkgaGFja3kuICBJdCBzZXRzIENYWEZMQUdTLCB3aGljaCB0aGUgYXV0b2NvbmYKK2RubCBkb2NzIHNheSBzaG91bGQgbmV2ZXIgYmUgb3ZlcnJpZGRlbiBleGNlcHQgYnkgdGhlIHVzZXIuICBJdCBhbHNvIGlzbid0CitkbmwgY3Jvc3MtY29tcGlsZSBzYWZlLiAgV2Ugc2hvdWxkIGZpeCB0aGVzZSBwcm9ibGVtcywgYnV0IHNpbmNlIEkgZG9uJ3QgaGF2ZQorZG5sIFN1biBDQyBhdCBteSBkaXNwb3NhbCBmb3IgdGVzdGluZywgc29tZW9uZSBlbHNlIHdpbGwgaGF2ZSB0byBkbyBpdC4KKworQUNfREVGVU4oW0FDWF9DSEVDS19TVU5DQ10sWworCisgIEFDX0xBTkdfUFVTSChbQysrXSkKKyAgQUNfQ0hFQ0tfREVDTChbX19TVU5QUk9fQ0NdLCBbU1VOQ0M9InllcyJdLCBbU1VOQ0M9Im5vIl0pCisgIEFDX0xBTkdfUE9QKCkKKworCisgIEFDX0FSR19FTkFCTEUoWzY0Yml0LXNvbGFyaXNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLTY0Yml0LXNvbGFyaXNdLAorICAgICAgW0J1aWxkIDY0IGJpdCBiaW5hcnkgb24gU29sYXJpcyBAPDpAZGVmYXVsdD1vbkA6PkBdKV0sCisgICAgICAgICAgICAgW2FjX2VuYWJsZV82NGJpdD0iJGVuYWJsZXZhbCJdLAorICAgICAgICAgICAgIFthY19lbmFibGVfNjRiaXQ9InllcyJdKQorCisgIEFTX0lGKFt0ZXN0ICIkU1VOQ0MiID0gInllcyIgLWEgIngke2FjX2N2X2Vudl9DWFhGTEFHU19zZXR9IiA9ICJ4Il0sWworICAgIGRubCBTdW4gU3R1ZGlvIGhhcyBhIGNyYXNoaW5nIGJ1ZyB3aXRoIC14TzQgaW4gc29tZSBjYXNlcy4gS2VlcCB0aGlzCisgICAgZG5sIGF0IC14TzMgdW50aWwgYSBwcm9wZXIgdGVzdCB0byBkZXRlY3QgdGhvc2UgY3Jhc2hlcyBjYW4gYmUgZG9uZS4KKyAgICBDWFhGTEFHUz0iLWcwIC14TzMgLXhsaWJtaWwgLXhkZXBlbmQgLXhidWlsdGluIC1tdCAtY29tcGF0PTUgLWxpYnJhcnk9c3RscG9ydDQgLWxpYnJhcnk9Q3J1biAtdGVtcGxhdGU9bm8lZXh0ZGVmICR7Q1hYRkxBR1N9IgorICBdKQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAqc29sYXJpcyopCisgICAgICBBQ19DSEVDS19QUk9HUyhJU0FJTkZPLCBbaXNhaW5mb10sIFtub10pCisgICAgICBBU19JRihbdGVzdCAieCRJU0FJTkZPIiAhPSAieG5vIl0sCisgICAgICAgICAgICBbaXNhaW5mb19iPWAke0lTQUlORk99IC1iYF0sCisgICAgICAgICAgICBbaXNhaW5mb19iPSJ4Il0pCisKKyAgICAgIEFTX0lGKFt0ZXN0ICIkaXNhaW5mb19iIiAhPSAieCJdLFsKKworICAgICAgICBpc2FpbmZvX2s9YCR7SVNBSU5GT30gLWtgCisKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYWNfZW5hYmxlXzY0Yml0IiA9ICJ4eWVzIl0sWworCisgICAgICAgICAgQVNfSUYoW3Rlc3QgIngkbGliZGlyIiA9ICJ4XCR7ZXhlY19wcmVmaXh9L2xpYiJdLFsKKyAgICAgICAgICAgZG5sIFRoZSB1c2VyIGhhc24ndCBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IGxpYmRpciwgc28gd2UnbGwKKyAgICAgICAgICAgZG5sIHRoZSBkaXIgc3VmZml4IHRvIG1hdGNoIHNvbGFyaXMgMzIvNjQtYml0IHBvbGljeQorICAgICAgICAgICBsaWJkaXI9IiR7bGliZGlyfS8ke2lzYWluZm9fa30iCisgICAgICAgICAgXSkKKworICAgICAgICAgIGRubCBUaGlzIHNob3VsZCBqdXN0IGJlIHNldCBpbiBDUFBGTEFHUyBhbmQgaW4gTERGTEFHUywgYnV0IGxpYnRvb2wKKyAgICAgICAgICBkbmwgZG9lcyB0aGUgd3JvbmcgdGhpbmcgaWYgeW91IGRvbid0IHB1dCBpdCBpbnRvIENYWEZMQUdTLiBzaWdoLgorICAgICAgICAgIGRubCAoSXQgYWxzbyBuZWVkcyBpdCBpbiBDRkxBR1MsIG9yIGl0IGRvZXMgYSBkaWZmZXJlbnQgd3JvbmcgdGhpbmchKQorICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JHthY19jdl9lbnZfQ1hYRkxBR1Nfc2V0fSIgPSAieCJdLFsKKyAgICAgICAgICAgIENYWEZMQUdTPSIke0NYWEZMQUdTfSAtbTY0IgorICAgICAgICAgICAgYWNfY3ZfZW52X0NYWEZMQUdTX3NldD1zZXQKKyAgICAgICAgICAgIGFjX2N2X2Vudl9DWFhGTEFHU192YWx1ZT0nLW02NCcKKyAgICAgICAgICBdKQorCisgICAgICAgICAgQVNfSUYoW3Rlc3QgIngke2FjX2N2X2Vudl9DRkxBR1Nfc2V0fSIgPSAieCJdLFsKKyAgICAgICAgICAgIENGTEFHUz0iJHtDRkxBR1N9IC1tNjQiCisgICAgICAgICAgICBhY19jdl9lbnZfQ0ZMQUdTX3NldD1zZXQKKyAgICAgICAgICAgIGFjX2N2X2Vudl9DRkxBR1NfdmFsdWU9Jy1tNjQnCisgICAgICAgICAgXSkKKworICAgICAgICAgIEFTX0lGKFt0ZXN0ICIkdGFyZ2V0X2NwdSIgPSAic3BhcmMiIC1hICJ4JFNVTkNDIiA9ICJ4eWVzIiBdLFsKKyAgICAgICAgICAgIENYWEZMQUdTPSIteG1lbWFsaWduPThzICR7Q1hYRkxBR1N9IgorICAgICAgICAgIF0pCisgICAgICAgIF0pCisgICAgICBdKQorICAgIDs7CisgIGVzYWMKKworXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvYWN4X3B0aHJlYWQubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2FjeF9wdGhyZWFkLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDQyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2FjeF9wdGhyZWFkLm00CkBAIC0wLDAgKzEsMzk3IEBACisjIFRoaXMgd2FzIHJldHJpZXZlZCBmcm9tCisjICAgIGh0dHA6Ly9zdm4uMHBvaW50ZXIuZGUvdmlld3ZjL3RydW5rL2NvbW1vbi9hY3hfcHRocmVhZC5tND9yZXZpc2lvbj0xMjc3JnJvb3Q9YXZhaGkKKyMgU2VlIGFsc28gKHBlcmhhcHMgZm9yIG5ldyB2ZXJzaW9ucz8pCisjICAgIGh0dHA6Ly9zdm4uMHBvaW50ZXIuZGUvdmlld3ZjL3RydW5rL2NvbW1vbi9hY3hfcHRocmVhZC5tND9yb290PWF2YWhpCisjCisjIFdlJ3ZlIHJld3JpdHRlbiB0aGUgaW5jb25zaXN0ZW5jeSBjaGVjayBjb2RlIChmcm9tIGF2YWhpKSwgdG8gd29yaworIyBtb3JlIGJyb2FkbHkuICBJbiBwYXJ0aWN1bGFyLCBpdCBubyBsb25nZXIgYXNzdW1lcyBsZCBhY2NlcHRzIC16ZGVmcy4KKyMgVGhpcyBjYXVzZWQgYSByZXN0cnVjdGluZyBvZiB0aGUgY29kZSwgYnV0IHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBvbmx5CisjIGNoYW5nZWQgYSBsaXR0bGUuCisKK2RubCBAc3lub3BzaXMgQUNYX1BUSFJFQUQoW0FDVElPTi1JRi1GT1VORFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXSkKK2RubAorZG5sIEBzdW1tYXJ5IGZpZ3VyZSBvdXQgaG93IHRvIGJ1aWxkIEMgcHJvZ3JhbXMgdXNpbmcgUE9TSVggdGhyZWFkcworZG5sCitkbmwgVGhpcyBtYWNybyBmaWd1cmVzIG91dCBob3cgdG8gYnVpbGQgQyBwcm9ncmFtcyB1c2luZyBQT1NJWCB0aHJlYWRzLgorZG5sIEl0IHNldHMgdGhlIFBUSFJFQURfTElCUyBvdXRwdXQgdmFyaWFibGUgdG8gdGhlIHRocmVhZHMgbGlicmFyeSBhbmQKK2RubCBsaW5rZXIgZmxhZ3MsIGFuZCB0aGUgUFRIUkVBRF9DRkxBR1Mgb3V0cHV0IHZhcmlhYmxlIHRvIGFueSBzcGVjaWFsCitkbmwgQyBjb21waWxlciBmbGFncyB0aGF0IGFyZSBuZWVkZWQuIChUaGUgdXNlciBjYW4gYWxzbyBmb3JjZSBjZXJ0YWluCitkbmwgY29tcGlsZXIgZmxhZ3MvbGlicyB0byBiZSB0ZXN0ZWQgYnkgc2V0dGluZyB0aGVzZSBlbnZpcm9ubWVudAorZG5sIHZhcmlhYmxlcy4pCitkbmwKK2RubCBBbHNvIHNldHMgUFRIUkVBRF9DQyB0byBhbnkgc3BlY2lhbCBDIGNvbXBpbGVyIHRoYXQgaXMgbmVlZGVkIGZvcgorZG5sIG11bHRpLXRocmVhZGVkIHByb2dyYW1zIChkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgQ0Mgb3RoZXJ3aXNlKS4KK2RubCAoVGhpcyBpcyBuZWNlc3Nhcnkgb24gQUlYIHRvIHVzZSB0aGUgc3BlY2lhbCBjY19yIGNvbXBpbGVyIGFsaWFzLikKK2RubAorZG5sIE5PVEU6IFlvdSBhcmUgYXNzdW1lZCB0byBub3Qgb25seSBjb21waWxlIHlvdXIgcHJvZ3JhbSB3aXRoIHRoZXNlCitkbmwgZmxhZ3MsIGJ1dCBhbHNvIGxpbmsgaXQgd2l0aCB0aGVtIGFzIHdlbGwuIGUuZy4geW91IHNob3VsZCBsaW5rCitkbmwgd2l0aCAkUFRIUkVBRF9DQyAkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyAkTERGTEFHUyAuLi4gJFBUSFJFQURfTElCUworZG5sICRMSUJTCitkbmwKK2RubCBJZiB5b3UgYXJlIG9ubHkgYnVpbGRpbmcgdGhyZWFkcyBwcm9ncmFtcywgeW91IG1heSB3aXNoIHRvIHVzZQorZG5sIHRoZXNlIHZhcmlhYmxlcyBpbiB5b3VyIGRlZmF1bHQgTElCUywgQ0ZMQUdTLCBhbmQgQ0M6CitkbmwKK2RubCAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKK2RubCAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKK2RubCAgICAgICAgQ0M9IiRQVEhSRUFEX0NDIgorZG5sCitkbmwgSW4gYWRkaXRpb24sIGlmIHRoZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0aHJlYWQtYXR0cmlidXRlCitkbmwgY29uc3RhbnQgaGFzIGEgbm9uc3RhbmRhcmQgbmFtZSwgZGVmaW5lcyBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0bworZG5sIHRoYXQgbmFtZSAoZS5nLiBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEIG9uIEFJWCkuCitkbmwKK2RubCBBQ1RJT04tSUYtRk9VTkQgaXMgYSBsaXN0IG9mIHNoZWxsIGNvbW1hbmRzIHRvIHJ1biBpZiBhIHRocmVhZHMKK2RubCBsaWJyYXJ5IGlzIGZvdW5kLCBhbmQgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBhIGxpc3Qgb2YgY29tbWFuZHMgdG8KK2RubCBydW4gaXQgaWYgaXQgaXMgbm90IGZvdW5kLiBJZiBBQ1RJT04tSUYtRk9VTkQgaXMgbm90IHNwZWNpZmllZCwgdGhlCitkbmwgZGVmYXVsdCBhY3Rpb24gd2lsbCBkZWZpbmUgSEFWRV9QVEhSRUFELgorZG5sCitkbmwgUGxlYXNlIGxldCB0aGUgYXV0aG9ycyBrbm93IGlmIHRoaXMgbWFjcm8gZmFpbHMgb24gYW55IHBsYXRmb3JtLCBvcgorZG5sIGlmIHlvdSBoYXZlIGFueSBvdGhlciBzdWdnZXN0aW9ucyBvciBjb21tZW50cy4gVGhpcyBtYWNybyB3YXMgYmFzZWQKK2RubCBvbiB3b3JrIGJ5IFNHSiBvbiBhdXRvY29uZiBzY3JpcHRzIGZvciBGRlRXICh3d3cuZmZ0dy5vcmcpICh3aXRoCitkbmwgaGVscCBmcm9tIE0uIEZyaWdvKSwgYXMgd2VsbCBhcyBhY19wdGhyZWFkIGFuZCBoYl9wdGhyZWFkIG1hY3JvcworZG5sIHBvc3RlZCBieSBBbGVqYW5kcm8gRm9yZXJvIEN1ZXJ2byB0byB0aGUgYXV0b2NvbmYgbWFjcm8gcmVwb3NpdG9yeS4KK2RubCBXZSBhcmUgYWxzbyBncmF0ZWZ1bCBmb3IgdGhlIGhlbHBmdWwgZmVlZGJhY2sgb2YgbnVtZXJvdXMgdXNlcnMuCitkbmwKK2RubCBAY2F0ZWdvcnkgSW5zdGFsbGVkUGFja2FnZXMKK2RubCBAYXV0aG9yIFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4KK2RubCBAdmVyc2lvbiAyMDA2LTA1LTI5CitkbmwgQGxpY2Vuc2UgR1BMV2l0aEFDRXhjZXB0aW9uCitkbmwgCitkbmwgQ2hlY2tzIGZvciBHQ0Mgc2hhcmVkL3B0aHJlYWQgaW5jb25zaXN0ZW5jeSBiYXNlZCBvbiB3b3JrIGJ5CitkbmwgTWFyY2luIE93c2lhbnkgPG1hcmNpbkBvd3NpYW55LnBsPgorCisKK0FDX0RFRlVOKFtBQ1hfUFRIUkVBRF0sIFsKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKK0FDX0xBTkdfU0FWRQorQUNfTEFOR19DCithY3hfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1NdKQorICAgICAgICBBQ19UUllfTElOS19GVU5DKHB0aHJlYWRfam9pbiwgYWN4X3B0aHJlYWRfb2s9eWVzKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRhY3hfcHRocmVhZF9vaykKKyAgICAgICAgaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCithY3hfcHRocmVhZF9mbGFncz0icHRocmVhZHMgbm9uZSAtS3RocmVhZCAta3RocmVhZCBsdGhyZWFkIC1wdGhyZWFkIC1wdGhyZWFkcyAtbXRocmVhZHMgcHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCBwdGhyZWFkLWNvbmZpZyIKKworIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorIyBpbmRpdmlkdWFsIGl0ZW1zIGZvbGxvdzoKKworIyBwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyMgbm9uZTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorIyAgICAgICBvdGhlciBjb21waWxlciBmbGFncyB0byBwcmV2ZW50IGNvbnRpbnVhbCBjb21waWxlciB3YXJuaW5ncworIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisjIC1rdGhyZWFkOiBGcmVlQlNEIGtlcm5lbCB0aHJlYWRzIChwcmVmZXJyZWQgdG8gLXB0aHJlYWQgc2luY2UgU01QLWFibGUpCisjIGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorIyAtcHRocmVhZDogTGludXgvZ2NjIChrZXJuZWwgdGhyZWFkcyksIEJTRC9nY2MgKHVzZXJsYW5kIHRocmVhZHMpCisjIC1wdGhyZWFkczogU29sYXJpcy9nY2MKKyMgLW10aHJlYWRzOiBNaW5ndzMyL2djYywgTHlueC9nY2MKKyMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorIyAgICAgIGRvZXNuJ3QgaHVydCB0byBjaGVjayBzaW5jZSB0aGlzIHNvbWV0aW1lcyBkZWZpbmVzIHB0aHJlYWRzIHRvbzsKKyMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisjIHB0aHJlYWQ6IExpbnV4LCBldGNldGVyYQorIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisjIHB0aHJlYWQtY29uZmlnOiB1c2UgcHRocmVhZC1jb25maWcgcHJvZ3JhbSAoZm9yIEdOVSBQdGggbGlicmFyeSkKKworY2FzZSAiJHtob3N0X2NwdX0tJHtob3N0X29zfSIgaW4KKyAgICAgICAgKnNvbGFyaXMqKQorCisgICAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCisgICAgICAgICMgKG5vbi1mdW5jdGlvbmFsKSB2ZXJzaW9ucyBvZiB0aGUgcHRocmVhZHMgcm91dGluZXMsIHNvIGxpbmstYmFzZWQKKyAgICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCisgICAgICAgICMgYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhpcyBtYWNybywgc28gd2UgY291bGQgY2hlY2sgZm9yIHRoYXQsIGJ1dAorICAgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6CisKKyAgICAgICAgYWN4X3B0aHJlYWRfZmxhZ3M9Ii1wdGhyZWFkcyBwdGhyZWFkIC1tdCAtcHRocmVhZCAkYWN4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7Citlc2FjCisKK2lmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCitmb3IgZmxhZyBpbiAkYWN4X3B0aHJlYWRfZmxhZ3M7IGRvCisKKyAgICAgICAgY2FzZSAkZmxhZyBpbgorICAgICAgICAgICAgICAgIG5vbmUpCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3NdKQorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICAtKikKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcHRocmVhZHMgd29yayB3aXRoICRmbGFnXSkKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKworCQlwdGhyZWFkLWNvbmZpZykKKwkJQUNfQ0hFQ0tfUFJPRyhhY3hfcHRocmVhZF9jb25maWcsIHB0aHJlYWQtY29uZmlnLCB5ZXMsIG5vKQorCQlpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX2NvbmZpZyIgPSB4bm87IHRoZW4gY29udGludWU7IGZpCisJCVBUSFJFQURfQ0ZMQUdTPSJgcHRocmVhZC1jb25maWcgLS1jZmxhZ3NgIgorCQlQVEhSRUFEX0xJQlM9ImBwdGhyZWFkLWNvbmZpZyAtLWxkZmxhZ3NgIGBwdGhyZWFkLWNvbmZpZyAtLWxpYnNgIgorCQk7OworCisgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0aGUgcHRocmVhZHMgbGlicmFyeSAtbCRmbGFnXSkKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9Ii1sJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCisgICAgICAgICMgQ2hlY2sgZm9yIHZhcmlvdXMgZnVuY3Rpb25zLiAgV2UgbXVzdCBpbmNsdWRlIHB0aHJlYWQuaCwKKyAgICAgICAgIyBzaW5jZSBzb21lIGZ1bmN0aW9ucyBtYXkgYmUgbWFjcm9zLiAgKE9uIHRoZSBTZXF1ZW50LCB3ZQorICAgICAgICAjIG5lZWQgYSBzcGVjaWFsIGZsYWcgLUt0aHJlYWQgdG8gbWFrZSB0aGlzIGhlYWRlciBjb21waWxlLikKKyAgICAgICAgIyBXZSBjaGVjayBmb3IgcHRocmVhZF9qb2luIGJlY2F1c2UgaXQgaXMgaW4gLWxwdGhyZWFkIG9uIElSSVgKKyAgICAgICAgIyB3aGlsZSBwdGhyZWFkX2NyZWF0ZSBpcyBpbiBsaWJjLiAgV2UgY2hlY2sgZm9yIHB0aHJlYWRfYXR0cl9pbml0CisgICAgICAgICMgZHVlIHRvIERFQyBjcmF6aW5lc3Mgd2l0aCAtbHB0aHJlYWRzLiAgV2UgY2hlY2sgZm9yCisgICAgICAgICMgcHRocmVhZF9jbGVhbnVwX3B1c2ggYmVjYXVzZSBpdCBpcyBvbmUgb2YgdGhlIGZldyBwdGhyZWFkCisgICAgICAgICMgZnVuY3Rpb25zIG9uIFNvbGFyaXMgdGhhdCBkb2Vzbid0IGhhdmUgYSBub24tZnVuY3Rpb25hbCBsaWJjIHN0dWIuCisgICAgICAgICMgV2UgdHJ5IHB0aHJlYWRfY3JlYXRlIG9uIGdlbmVyYWwgcHJpbmNpcGxlcy4KKyAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKKyAgICAgICAgICAgICAgICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorICAgICAgICAgICAgICAgICAgICBbYWN4X3B0aHJlYWRfb2s9eWVzXSkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICBBQ19NU0dfUkVTVUxUKCRhY3hfcHRocmVhZF9vaykKKyAgICAgICAgaWYgdGVzdCAieCRhY3hfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZpCisKKyAgICAgICAgUFRIUkVBRF9MSUJTPSIiCisgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCitkb25lCitmaQorCisjIFZhcmlvdXMgb3RoZXIgY2hlY2tzOgoraWYgdGVzdCAieCRhY3hfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCisgICAgICAgICMgRGV0ZWN0IEFJWCBsb3NzYWdlOiBKT0lOQUJMRSBhdHRyaWJ1dGUgaXMgY2FsbGVkIFVOREVUQUNIRUQuCisJQUNfTVNHX0NIRUNLSU5HKFtmb3Igam9pbmFibGUgcHRocmVhZCBhdHRyaWJ1dGVdKQorCWF0dHJfbmFtZT11bmtub3duCisJZm9yIGF0dHIgaW4gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRDsgZG8KKwkgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwgW2ludCBhdHRyPSRhdHRyOyByZXR1cm4gYXR0cjtdLAorICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJfbmFtZT0kYXR0cjsgYnJlYWtdKQorCWRvbmUKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkYXR0cl9uYW1lKQorICAgICAgICBpZiB0ZXN0ICIkYXR0cl9uYW1lIiAhPSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFLCAkYXR0cl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEZWZpbmUgdG8gbmVjZXNzYXJ5IHN5bWJvbCBpZiB0aGlzIGNvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbiB5b3VyIHN5c3RlbS5dKQorICAgICAgICBmaQorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHNdKQorICAgICAgICBmbGFnPW5vCisgICAgICAgIGNhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICAgICAqLWFpeCogfCAqLWZyZWVic2QqIHwgKi1kYXJ3aW4qKSBmbGFnPSItRF9USFJFQURfU0FGRSI7OworICAgICAgICAgICAgKnNvbGFyaXMqIHwgKi1vc2YqIHwgKi1ocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7CisgICAgICAgIGVzYWMKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgke2ZsYWd9KQorICAgICAgICBpZiB0ZXN0ICJ4JGZsYWciICE9IHhubzsgdGhlbgorICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgZmkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBtdXN0IGNvbXBpbGUgd2l0aCB4bGNfciBvciBjY19yCisJaWYgdGVzdCB4IiRHQ0MiICE9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBBQ19DSEVDS19QUk9HUyhQVEhSRUFEX0NDLCB4bGNfciBjY19yLCAke0NDfSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIFBUSFJFQURfQ0M9JENDCisJZmkKKworCSMgVGhlIG5leHQgcGFydCB0cmllcyB0byBkZXRlY3QgR0NDIGluY29uc2lzdGVuY3kgd2l0aCAtc2hhcmVkIG9uIHNvbWUKKwkjIGFyY2hpdGVjdHVyZXMgYW5kIHN5c3RlbXMuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaW4gY2VydGFpbgorCSMgY29uZmlndXJhdGlvbnMsIHdoZW4gLXNoYXJlZCBpcyBzcGVjaWZpZWQsIEdDQyAiZm9yZ2V0cyIgdG8KKwkjIGludGVybmFsbHkgdXNlIHZhcmlvdXMgZmxhZ3Mgd2hpY2ggYXJlIHN0aWxsIG5lY2Vzc2FyeS4KKwkKKwkjCisJIyBQcmVwYXJlIHRoZSBmbGFncworCSMKKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlzYXZlX0xJQlM9IiRMSUJTIgorCXNhdmVfQ0M9IiRDQyIKKwkKKwkjIFRyeSB3aXRoIHRoZSBmbGFncyBkZXRlcm1pbmVkIGJ5IHRoZSBlYXJsaWVyIGNoZWNrcy4KKwkjCisJIyAtV2wsLXosZGVmcyBmb3JjZXMgbGluay10aW1lIHN5bWJvbCByZXNvbHV0aW9uLCBzbyB0aGF0IHRoZQorCSMgbGlua2luZyBjaGVja3Mgd2l0aCAtc2hhcmVkIGFjdHVhbGx5IGhhdmUgYW55IHZhbHVlCisJIworCSMgRklYTUU6IC1mUElDIGlzIHJlcXVpcmVkIGZvciAtc2hhcmVkIG9uIG1hbnkgYXJjaGl0ZWN0dXJlcywKKwkjIHNvIHdlIHNwZWNpZnkgaXQgaGVyZSwgYnV0IHRoZSByaWdodCB3YXkgd291bGQgcHJvYmFibHkgYmUgdG8KKwkjIHByb3Blcmx5IGRldGVjdCB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IHJlcXVpcmVkLgorCUNGTEFHUz0iLXNoYXJlZCAtZlBJQyAtV2wsLXosZGVmcyAkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKwlMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorCUNDPSIkUFRIUkVBRF9DQyIKKwkKKwkjIEluIG9yZGVyIG5vdCB0byBjcmVhdGUgc2V2ZXJhbCBsZXZlbHMgb2YgaW5kZW50YXRpb24sIHdlIHRlc3QKKwkjIHRoZSB2YWx1ZSBvZiAiJGRvbmUiIHVudGlsIHdlIGZpbmQgdGhlIGN1cmUgb3IgcnVuIG91dCBvZiBpZGVhcy4KKwlkb25lPSJubyIKKwkKKwkjIEZpcnN0LCBtYWtlIHN1cmUgdGhlIENGTEFHUyB3ZSBhZGRlZCBhcmUgYWN0dWFsbHkgYWNjZXB0ZWQgYnkgb3VyCisJIyBjb21waWxlci4gIElmIG5vdCAoYW5kIE9TIFgncyBsZCwgZm9yIGluc3RhbmNlLCBkb2VzIG5vdCBhY2NlcHQgLXopLAorCSMgdGhlbiB3ZSBjYW4ndCBkbyB0aGlzIHRlc3QuCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBjaGVjayBmb3IgR0NDIHB0aHJlYWQvc2hhcmVkIGluY29uc2lzdGVuY2llc10pCisJICAgQUNfVFJZX0xJTksoLCwgLCBbZG9uZT15ZXNdKQorCQorCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzIDsgdGhlbgorCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKwkgICBlbHNlCisJICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkgICBmaQorCWZpCisJCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtcHRocmVhZCBpcyBzdWZmaWNpZW50IHdpdGggLXNoYXJlZF0pCisJICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKKwkgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKKwkgICAgICBbZG9uZT15ZXNdKQorCSAgIAorCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkgICBlbHNlCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGZpCisJZmkKKwkKKwkjCisJIyBMaW51eCBnY2Mgb24gc29tZSBhcmNoaXRlY3R1cmVzIHN1Y2ggYXMgbWlwcy9taXBzZWwgZm9yZ2V0cworCSMgYWJvdXQgLWxwdGhyZWFkCisJIworCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxwdGhyZWFkIGZpeGVzIHRoYXRdKQorCSAgIExJQlM9Ii1scHRocmVhZCAkUFRIUkVBRF9MSUJTICRzYXZlX0xJQlMiCisJICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKKwkgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworCSAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKKwkgICAgICBbZG9uZT15ZXNdKQorCQorCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkgICAgICBQVEhSRUFEX0xJQlM9Ii1scHRocmVhZCAkUFRIUkVBRF9MSUJTIgorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgZmkKKwlmaQorCSMKKwkjIEZyZWVCU0QgNC4xMCBnY2MgZm9yZ2V0cyB0byB1c2UgLWxjX3IgaW5zdGVhZCBvZiAtbGMKKwkjCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGNfciBmaXhlcyB0aGF0XSkKKwkgICBMSUJTPSItbGNfciAkUFRIUkVBRF9MSUJTICRzYXZlX0xJQlMiCisJICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKKwkgICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwkgICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAorCSAgICAgICBbZG9uZT15ZXNdKQorCQorCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkgICAgICBQVEhSRUFEX0xJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMiCisJICAgZWxzZQorCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKwkgICBmaQorCWZpCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgICMgT0ssIHdlIGhhdmUgcnVuIG91dCBvZiBpZGVhcworCSAgIEFDX01TR19XQVJOKFtJbXBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgdG8gdXNlIHB0aHJlYWRzIHdpdGggc2hhcmVkIGxpYnJhcmllc10pCisJCisJICAgIyBzbyBpdCdzIG5vdCBzYWZlIHRvIGFzc3VtZSB0aGF0IHdlIG1heSB1c2UgcHRocmVhZHMKKwkgICBhY3hfcHRocmVhZF9vaz1ubworCWZpCisJCisJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHdoYXQgd2UgaGF2ZSBzbyBmYXIgaXMgc3VmZmljaWVudCB3aXRoIC1ub3N0ZGxpYl0pCisJQ0ZMQUdTPSItbm9zdGRsaWIgJENGTEFHUyIKKwkjIHdlIG5lZWQgYyB3aXRoIG5vc3RkbGliCisJTElCUz0iJExJQlMgLWxjIgorCUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisJICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKKwkgICAgICBbZG9uZT15ZXNdLFtkb25lPW5vXSkKKworCWlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwllbHNlCisJICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCWZpCisJCisJaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgorCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbHB0aHJlYWQgc2F2ZXMgdGhlIGRheV0pCisJICAgTElCUz0iLWxwdGhyZWFkICRMSUJTIgorCSAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisJICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworCSAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKKwkgICAgICBbZG9uZT15ZXNdLFtkb25lPW5vXSkKKworCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCisJICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkgICAgICBQVEhSRUFEX0xJQlM9IiRQVEhSRUFEX0xJQlMgLWxwdGhyZWFkIgorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgICAgQUNfTVNHX1dBUk4oW0ltcG9zc2libGUgdG8gZGV0ZXJtaW5lIGhvdyB0byB1c2UgcHRocmVhZHMgd2l0aCBzaGFyZWQgbGlicmFyaWVzIGFuZCAtbm9zdGRsaWJdKQorCSAgIGZpCisJZmkKKworCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCUxJQlM9IiRzYXZlX0xJQlMiCisJQ0M9IiRzYXZlX0NDIgorZWxzZQorICAgICAgICBQVEhSRUFEX0NDPSIkQ0MiCitmaQorCitBQ19TVUJTVChQVEhSRUFEX0xJQlMpCitBQ19TVUJTVChQVEhSRUFEX0NGTEFHUykKK0FDX1NVQlNUKFBUSFJFQURfQ0MpCisKKyMgRmluYWxseSwgZXhlY3V0ZSBBQ1RJT04tSUYtRk9VTkQvQUNUSU9OLUlGLU5PVC1GT1VORDoKK2lmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBpZmVsc2UoWyQxXSwsQUNfREVGSU5FKEhBVkVfUFRIUkVBRCwxLFtEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy5dKSxbJDFdKQorICAgICAgICA6CitlbHNlCisgICAgICAgIGFjeF9wdGhyZWFkX29rPW5vCisgICAgICAgICQyCitmaQorQUNfTEFOR19SRVNUT1JFCitdKWRubCBBQ1hfUFRIUkVBRApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9tNC9saWJ0b29sLm00IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9tNC9saWJ0b29sLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODEwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2xpYnRvb2wubTQKQEAgLTAsMCArMSw4MDAxIEBACisjIGxpYnRvb2wubTQgLSBDb25maWd1cmUgbGlidG9vbCBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQorIyAgICAgICAgICAgICAgICAgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCittNF9kZWZpbmUoW19MVF9DT1BZSU5HXSwgW2RubAorIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQorIyAgICAgICAgICAgICAgICAgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbC4KKyMKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwgb3IKKyMgb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KK10pCisKKyMgc2VyaWFsIDU3IExUX0lOSVQKKworCisjIExUX1BSRVJFUShWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGxhaW4gYW5kIGV4aXQgaWYgdGhpcyBsaWJ0b29sIHZlcnNpb24gaXMgbGVzcyB0aGF0IFZFUlNJT04uCittNF9kZWZ1bihbTFRfUFJFUkVRXSwKK1ttNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUobTRfZGVmbihbTFRfUEFDS0FHRV9WRVJTSU9OXSksIFskMV0pLCAtMSwKKyAgICAgICBbbTRfZGVmYXVsdChbJDNdLAorCQkgICBbbTRfZmF0YWwoW0xpYnRvb2wgdmVyc2lvbiAkMSBvciBoaWdoZXIgaXMgcmVxdWlyZWRdLAorCQkgICAgICAgICAgICAgNjMpXSldLAorICAgICAgIFskMl0pXSkKKworCisjIF9MVF9DSEVDS19CVUlMRERJUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGxhaW4gaWYgdGhlIGFic29sdXRlIGJ1aWxkIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycworbTRfZGVmdW4oW19MVF9DSEVDS19CVUlMRERJUl0sCitbY2FzZSBgcHdkYCBpbgorICAqXCAqIHwgKlwJKikKKyAgICBBQ19NU0dfV0FSTihbTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIGBwd2RgXSkgOzsKK2VzYWMKK10pCisKKworIyBMVF9JTklUKFtPUFRJT05TXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfSU5JVF0sCitbQUNfUFJFUkVRKFsyLjU4XSlkbmwgV2UgdXNlIEFDX0lOQ0xVREVTX0RFRkFVTFQKK0FDX1JFUVVJUkUoW0FDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRdKWRubAorQUNfQkVGT1JFKFskMF0sIFtMVF9MQU5HXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRETF9JTklUXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19CVUlMRERJUl0pZG5sCisKK2RubCBBdXRvY29uZiBkb2Vzbid0IGNhdGNoIHVuZXhwYW5kZWQgTFRfIG1hY3JvcyBieSBkZWZhdWx0OgorbTRfcGF0dGVybl9mb3JiaWQoW15fP0xUX1tBLVpfXSskXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW14oX0xUX0VPRnxMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XfExUX01VTFRJX01PRFVMRSkkXSlkbmwKK2RubCBhY2xvY2FsIGRvZXNuJ3QgcHVsbCBsdG9wdGlvbnMubTQsIGx0c3VnYXIubTQsIG9yIGx0dmVyc2lvbi5tNAorZG5sIHVubGVzcyB3ZSByZXF1aXJlIGFuIEFDX0RFRlVOZWQgbWFjcm86CitBQ19SRVFVSVJFKFtMVE9QVElPTlNfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVFNVR0FSX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRWRVJTSU9OX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRPQlNPTEVURV9WRVJTSU9OXSlkbmwKK200X3JlcXVpcmUoW19MVF9QUk9HX0xUTUFJTl0pZG5sCisKK19MVF9TSEVMTF9JTklUKFtTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofV0pCisKK2RubCBQYXJzZSBPUFRJT05TCitfTFRfU0VUX09QVElPTlMoWyQwXSwgWyQxXSkKKworIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAorTElCVE9PTF9ERVBTPSIkbHRtYWluIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCitfTFRfU0VUVVAKKworIyBPbmx5IGV4cGFuZCBvbmNlOgorbTRfZGVmaW5lKFtMVF9JTklUXSkKK10pIyBMVF9JTklUCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FDX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKK0FVX0FMSUFTKFtBTV9QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX0xJQlRPT0xdLCBbXSkKKworCisjIF9MVF9DQ19CQVNFTkFNRShDQykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxjdWxhdGUgY2NfYmFzZW5hbWUuICBTa2lwIGtub3duIGNvbXBpbGVyIHdyYXBwZXJzIGFuZCBjcm9zcy1wcmVmaXguCittNF9kZWZ1bihbX0xUX0NDX0JBU0VOQU1FXSwKK1tmb3IgY2NfdGVtcCBpbiAkMSIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbW1xcL11dY29tcGlsZSB8IGNjYWNoZSB8ICpbW1xcL11dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1tcXC9dXWRpc3RjYyB8IHB1cmlmeSB8ICpbW1xcL11dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKK10pCisKKworIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSXQgaXMgb2theSB0byB1c2UgdGhlc2UgZmlsZSBjb21tYW5kcyBhbmQgYXNzdW1lIHRoZXkgaGF2ZSBiZWVuIHNldAorIyBzZW5zaWJseSBhZnRlciBgbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pJy4KK200X2RlZnVuKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSwKK1s6ICR7Q1A9ImNwIC1mIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9CitdKSMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworCisKKyMgX0xUX1NFVFVQCisjIC0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9TRVRVUF0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX1JFUVVJUkUoW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSlkbmwKK0FDX1JFUVVJUkUoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSlkbmwKKworX0xUX0RFQ0woW10sIFtQQVRIX1NFUEFSQVRPUl0sIFsxXSwgW1RoZSBQQVRIIHNlcGFyYXRvciBmb3IgdGhlIGJ1aWxkIHN5c3RlbV0pZG5sCitkbmwKK19MVF9ERUNMKFtdLCBbaG9zdF9hbGlhc10sIFswXSwgW1RoZSBob3N0IHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2hvc3RdLCBbMF0pZG5sCitfTFRfREVDTChbXSwgW2hvc3Rfb3NdLCBbMF0pZG5sCitkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRfYWxpYXNdLCBbMF0sIFtUaGUgYnVpbGQgc3lzdGVtXSlkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRdLCBbMF0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX29zXSwgWzBdKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCit0ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCitfTFRfREVDTChbXSwgW0xOX1NdLCBbMV0sIFtXaGV0aGVyIHdlIG5lZWQgc29mdCBvciBoYXJkIGxpbmtzXSlkbmwKK2RubAorQUNfUkVRVUlSRShbTFRfQ01EX01BWF9MRU5dKWRubAorX0xUX0RFQ0woW29iamV4dF0sIFthY19vYmpleHRdLCBbMF0sIFtPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIildKWRubAorX0xUX0RFQ0woW10sIFtleGVleHRdLCBbMF0sIFtFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIildKWRubAorZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCittNF9yZXF1aXJlKFtfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX1JFTE9BRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19TSEFSRURMSUJfRlJPTV9MSU5LTElCXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfT0xEX0FSQ0hJVkVdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCittNF9yZXF1aXJlKFtfTFRfV0lUSF9TWVNST09UXSlkbmwKKworX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoWworIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgorIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMgSU5JVC4KK2lmIHRlc3QgLW4gIlwke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCitdKQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCitfTFRfQ0hFQ0tfT0JKRElSCisKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBHbG9iYWwgdmFyaWFibGVzOgorb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICBfTFRfUEFUSF9NQUdJQworICBmaQorICA7OworZXNhYworCisjIFVzZSBDIGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJ0b29sIHNjcmlwdAorTFRfU1VQUE9SVEVEX1RBRyhbQ0NdKQorX0xUX0xBTkdfQ19DT05GSUcKK19MVF9MQU5HX0RFRkFVTFRfQ09ORklHCitfTFRfQ09ORklHX0NPTU1BTkRTCitdKSMgX0xUX1NFVFVQCisKKworIyBfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgYSBmZXcgc2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHAgdXMgZG8gcm9idXN0IHF1b3RpbmcuCittNF9kZWZ1bihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdLAorWyMgQmFja3NsYXNoaWZ5IG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4KKyMgZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorc2VkX3F1b3RlX3N1YnN0PSdzL1woW1siYCRcXF1dXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtbImBcXF1dXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KK2RlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCitdKQorCisjIF9MVF9QUk9HX0xUTUFJTgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTm90ZSB0aGF0IHRoaXMgY29kZSBpcyBjYWxsZWQgYm90aCBmcm9tIGBjb25maWd1cmUnLCBhbmQgYGNvbmZpZy5zdGF0dXMnCisjIG5vdyB0aGF0IHdlIHVzZSBBQ19DT05GSUdfQ09NTUFORFMgdG8gZ2VuZXJhdGUgbGlidG9vbC4gIE5vdGFibHksCisjIGBjb25maWcuc3RhdHVzJyBoYXMgbm8gdmFsdWUgZm9yIGFjX2F1eF9kaXIgdW5sZXNzIHdlIGFyZSB1c2luZyBBdXRvbWFrZSwKKyMgc28gd2UgcGFzcyBhIGNvcHkgYWxvbmcgdG8gbWFrZSBzdXJlIGl0IGhhcyBhIHNlbnNpYmxlIHZhbHVlIGFueXdheS4KK200X2RlZnVuKFtfTFRfUFJPR19MVE1BSU5dLAorW200X2lmZGVmKFtBQ19SRVFVSVJFX0FVWF9GSUxFXSwgW0FDX1JFUVVJUkVfQVVYX0ZJTEUoW2x0bWFpbi5zaF0pXSlkbmwKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFthY19hdXhfZGlyPSckYWNfYXV4X2RpciddKQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitdKSMgX0xUX1BST0dfTFRNQUlOCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQWNjdW11bGF0ZSBjb2RlIGZvciBjcmVhdGluZyBsaWJ0b29sLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIFNvIHRoYXQgd2UgY2FuIHJlY3JlYXRlIGEgZnVsbCBsaWJ0b29sIHNjcmlwdCBpbmNsdWRpbmcgYWRkaXRpb25hbAorIyB0YWdzLCB3ZSBhY2N1bXVsYXRlIHRoZSBjaHVua3Mgb2YgY29kZSB0byBzZW5kIHRvIEFDX0NPTkZJR19DT01NQU5EUworIyBpbiBtYWNyb3MgYW5kIHRoZW4gbWFrZSBhIHNpbmdsZSBjYWxsIGF0IHRoZSBlbmQgdXNpbmcgdGhlIGBsaWJ0b29sJworIyBsYWJlbC4KKworCisjIF9MVF9DT05GSUdfTElCVE9PTF9JTklUKFtJTklULUNPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWdpc3RlciBJTklULUNPTU1BTkRTIHRvIGJlIHBhc3NlZCB0byBBQ19DT05GSUdfQ09NTUFORFMgbGF0ZXIuCittNF9kZWZpbmUoW19MVF9DT05GSUdfTElCVE9PTF9JTklUXSwKK1ttNF9pZnZhbChbJDFdLAorICAgICAgICAgIFttNF9hcHBlbmQoW19MVF9PVVRQVVRfTElCVE9PTF9JTklUXSwKKyAgICAgICAgICAgICAgICAgICAgIFskMQorXSldKV0pCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0lOSVRdKQorCisKKyMgX0xUX0NPTkZJR19MSUJUT09MKFtDT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWdpc3RlciBDT01NQU5EUyB0byBiZSBwYXNzZWQgdG8gQUNfQ09ORklHX0NPTU1BTkRTIGxhdGVyLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX0xJQlRPT0xdLAorW200X2lmdmFsKFskMV0sCisgICAgICAgICAgW200X2FwcGVuZChbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgIFskMQorXSldKV0pCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSkKKworCisjIF9MVF9DT05GSUdfU0FWRV9DT01NQU5EUyhbQ09NTUFORFNdLCBbSU5JVF9DT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTXSwKK1tfTFRfQ09ORklHX0xJQlRPT0woWyQxXSkKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFskMl0pCitdKQorCisKKyMgX0xUX0ZPUk1BVF9DT01NRU5UKFtDT01NRU5UXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIGxlYWRpbmcgY29tbWVudCBtYXJrcyB0byB0aGUgc3RhcnQgb2YgZWFjaCBsaW5lLCBhbmQgYSB0cmFpbGluZworIyBmdWxsLXN0b3AgdG8gdGhlIHdob2xlIGNvbW1lbnQgaWYgb25lIGlzIG5vdCBwcmVzZW50IGFscmVhZHkuCittNF9kZWZpbmUoW19MVF9GT1JNQVRfQ09NTUVOVF0sCitbbTRfaWZ2YWwoWyQxXSwgWworbTRfYnBhdHN1YnN0KFttNF9icGF0c3Vic3QoWyQxXSwgW14gKl0sIFsjIF0pXSwKKyAgICAgICAgICAgICAgW1snYCRcXV0sIFtcXFwmXSldbTRfYm1hdGNoKFskMV0sIFtbIT8uXSRdLCBbXSwgWy5dKQorKV0pCisKKworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEZJWE1FOiBFbGltaW5hdGUgVkFSTkFNRSAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKworIyBfTFRfREVDTChbQ09ORklHTkFNRV0sIFZBUk5BTUUsIFZBTFVFLCBbREVTQ1JJUFRJT05dLCBbSVMtVEFHR0VEP10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ09ORklHTkFNRSBpcyB0aGUgbmFtZSBnaXZlbiB0byB0aGUgdmFsdWUgaW4gdGhlIGxpYnRvb2wgc2NyaXB0LgorIyBWQVJOQU1FIGlzIHRoZSAoYmFzZSkgbmFtZSB1c2VkIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgorIyBWQUxVRSBtYXkgYmUgMCwgMSBvciAyIGZvciBhIGNvbXB1dGVkIHF1b3RlIGVzY2FwZWQgdmFsdWUgYmFzZWQgb24KKyMgVkFSTkFNRS4gIEFueSBvdGhlciB2YWx1ZSB3aWxsIGJlIHVzZWQgZGlyZWN0bHkuCittNF9kZWZpbmUoW19MVF9ERUNMXSwKK1tsdF9pZl9hcHBlbmRfdW5pcShbbHRfZGVjbF92YXJuYW1lc10sIFskMl0sIFssIF0sCisgICAgW2x0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW2xpYnRvb2xfbmFtZV0sCisJW200X2lmdmFsKFskMV0sIFskMV0sIFskMl0pXSkKKyAgICBsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFt2YWx1ZV0sIFskM10pCisgICAgbTRfaWZ2YWwoWyQ0XSwKKwlbbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbZGVzY3JpcHRpb25dLCBbJDRdKV0pCisgICAgbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLAorCVt0YWdnZWQ/XSwgW200X2lmdmFsKFskNV0sIFt5ZXNdLCBbbm9dKV0pXSkKK10pCisKKworIyBfTFRfVEFHREVDTChbQ09ORklHTkFNRV0sIFZBUk5BTUUsIFZBTFVFLCBbREVTQ1JJUFRJT05dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfVEFHREVDTF0sIFtfTFRfREVDTChbJDFdLCBbJDJdLCBbJDNdLCBbJDRdLCBbeWVzXSldKQorCisKKyMgbHRfZGVjbF90YWdfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3RhZ192YXJuYW1lc10sCitbX2x0X2RlY2xfZmlsdGVyKFt0YWdnZWQ/XSwgW3llc10sICRAKV0pCisKKworIyBfbHRfZGVjbF9maWx0ZXIoU1VCS0VZLCBWQUxVRSwgW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19sdF9kZWNsX2ZpbHRlcl0sCitbbTRfY2FzZShbJCNdLAorICBbMF0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkI10pXSwKKyAgWzFdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCM6ICQxXSldLAorICBbMl0sIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgWyQxXSwgWyQyXSwgW10sIGx0X2RlY2xfdmFybmFtZXMpXSwKKyAgWzNdLCBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sIFskMV0sIFskMl0sIFskM10sIGx0X2RlY2xfdmFybmFtZXMpXSwKKyAgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCAkQCldKVtdZG5sCitdKQorCisKKyMgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF9xdW90ZV92YXJuYW1lc10sCitbX2x0X2RlY2xfZmlsdGVyKFt2YWx1ZV0sIFsxXSwgJEApXSkKKworCisjIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF9kcXVvdGVfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdmFsdWVdLCBbMl0sICRAKV0pCisKKworIyBsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZChbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfdmFybmFtZXNfdGFnZ2VkXSwKK1ttNF9hc3NlcnQoWyQjIDw9IDJdKWRubAorXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCisgICAgbTRfaWZ2YWwoWyQyXSwgW1skMl1dLCBbbTRfZHF1b3RlKGx0X2RlY2xfdGFnX3Zhcm5hbWVzKV0pLAorICAgIG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9xdW90ZShfTFRfVEFHUykpLCBbIF0pKV0pCittNF9kZWZpbmUoW19sdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZF0sCitbbTRfaWZ2YWwoWyQzXSwgW2x0X2NvbWJpbmUoWyQxXSwgWyQyXSwgW19dLCAkMyldKV0pCisKKworIyBsdF9kZWNsX2FsbF92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfYWxsX3Zhcm5hbWVzXSwKK1tfJDAobTRfcXVvdGUobTRfZGVmYXVsdChbJDFdLCBbWywgXV0pKSwKKyAgICAgbTRfaWYoWyQyXSwgW10sCisJICAgbTRfcXVvdGUobHRfZGVjbF92YXJuYW1lcyksCisJbTRfcXVvdGUobTRfc2hpZnQoJEApKSkpW11kbmwKK10pCittNF9kZWZpbmUoW19sdF9kZWNsX2FsbF92YXJuYW1lc10sCitbbHRfam9pbigkQCwgbHRfZGVjbF92YXJuYW1lc190YWdnZWQoWyQxXSwKKwkJCWx0X2RlY2xfdGFnX3Zhcm5hbWVzKFtbLCBdXSwgbTRfc2hpZnQoJEApKSkpZG5sCitdKQorCisKKyMgX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRShbVkFSTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBRdW90ZSBhIHZhcmlhYmxlIHZhbHVlLCBhbmQgZm9yd2FyZCBpdCB0byBgY29uZmlnLnN0YXR1cycgc28gdGhhdCBpdHMKKyMgZGVjbGFyYXRpb24gdGhlcmUgd2lsbCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGluIGBjb25maWd1cmUnLiAgVkFSTkFNRQorIyBtdXN0IGhhdmUgYSBzaW5nbGUgcXVvdGUgZGVsaW1pdGVkIHZhbHVlIGZvciB0aGlzIHRvIHdvcmsuCittNF9kZWZpbmUoW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkVdLAorWyQxPSdgJEVDSE8gIiRdWyQxIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCddKQorCisKKyMgX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXZSBkZWxpbWl0IGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyB3aXRoIHNpbmdsZSBxdW90ZXMsIHNvIHdoZW4KKyMgd2Ugd3JpdGUgdGhlbSB0byBjb25maWcuc3RhdHVzLCB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gcXVvdGUgYWxsCisjIGVtYmVkZGVkIHNpbmdsZSBxdW90ZXMgcHJvcGVybHkuICBJbiBjb25maWd1cmUsIHRoaXMgbWFjcm8gZXhwYW5kcworIyBlYWNoIHZhcmlhYmxlIGRlY2xhcmVkIHdpdGggX0xUX0RFQ0wgKGFuZCBfTFRfVEFHREVDTCkgaW50bzoKKyMKKyMgICAgPHZhcj49J2AkRUNITyAiJDx2YXI+IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK200X2RlZnVuKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLCBtNF9xdW90ZShsdF9kZWNsX2FsbF92YXJuYW1lcyksCisgICAgW200X24oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKKworCisjIF9MVF9MSUJUT09MX1RBR1MKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgY29tbWVudCBhbmQgbGlzdCBvZiB0YWdzIHN1cHBvcnRlZCBieSB0aGUgc2NyaXB0CittNF9kZWZ1bihbX0xUX0xJQlRPT0xfVEFHU10sCitbX0xUX0ZPUk1BVF9DT01NRU5UKFtUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHRdKWRubAorYXZhaWxhYmxlX3RhZ3M9Il9MVF9UQUdTImRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0RFQ0xBUkUoVkFSTkFNRSwgW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4dHJhY3QgdGhlIGRpY3Rpb25hcnkgdmFsdWVzIGZvciBWQVJOQU1FIChvcHRpb25hbGx5IHdpdGggVEFHKSBhbmQKKyMgZXhwYW5kIHRvIGEgY29tbWVudGVkIHNoZWxsIHZhcmlhYmxlIHNldHRpbmc6CisjCisjICAgICMgU29tZSBjb21tZW50IGFib3V0IHdoYXQgVkFSIGlzIGZvci4KKyMgICAgdmlzaWJsZV9uYW1lPSRsdF9pbnRlcm5hbF9uYW1lCittNF9kZWZpbmUoW19MVF9MSUJUT09MX0RFQ0xBUkVdLAorW19MVF9GT1JNQVRfQ09NTUVOVChtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLAorCQkJCQkgICBbZGVzY3JpcHRpb25dKSkpW11kbmwKK200X3B1c2hkZWYoW19saWJ0b29sX25hbWVdLAorICAgIG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFtsaWJ0b29sX25hbWVdKSkpW11kbmwKK200X2Nhc2UobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW3ZhbHVlXSkpLAorICAgIFswXSwgW19saWJ0b29sX25hbWU9WyRdJDFdLAorICAgIFsxXSwgW19saWJ0b29sX25hbWU9JGx0X1tdJDFdLAorICAgIFsyXSwgW19saWJ0b29sX25hbWU9JGx0X1tdJDFdLAorICAgIFtfbGlidG9vbF9uYW1lPWx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pXSlbXWRubAorbTRfaWZ2YWwoWyQyXSwgW18kMl0pW11tNF9wb3BkZWYoW19saWJ0b29sX25hbWVdKVtdZG5sCitdKQorCisKKyMgX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBjb21tZW50ZWQgZGVjbGFyYXRpb25zIG9mIG5vbi10YWdnZWQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzCisjIHN1aXRhYmxlIGZvciBpbnNlcnRpb24gaW4gdGhlIExJQlRPT0wgQ09ORklHIHNlY3Rpb24gb2YgdGhlIGBsaWJ0b29sJworIyBzY3JpcHQuICBUYWdnZWQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzIChldmVuIGZvciB0aGUgTElCVE9PTCBDT05GSUcKKyMgc2VjdGlvbikgYXJlIHByb2R1Y2VkIGJ5IF9MVF9MSUJUT09MX1RBR19WQVJTLgorbTRfZGVmdW4oW19MVF9MSUJUT09MX0NPTkZJR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwKKyAgICBtNF9xdW90ZShfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbbm9dLCBbXSwgbHRfZGVjbF92YXJuYW1lcykpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdfVkFSUyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX0xJQlRPT0xfVEFHX1ZBUlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLCBtNF9xdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyksCisgICAgW200X24oW19MVF9MSUJUT09MX0RFQ0xBUkUoX2x0X3ZhciwgWyQxXSldKV0pXSkKKworCisjIF9MVF9UQUdWQVIoVkFSTkFNRSwgW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR1ZBUl0sIFttNF9pZnZhbChbJDJdLCBbJDFfJDJdLCBbJDFdKV0pCisKKworIyBfTFRfQ09ORklHX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VuZCBhY2N1bXVsYXRlZCBvdXRwdXQgdG8gJENPTkZJR19TVEFUVVMuICBUaGFua3MgdG8gdGhlIGxpc3RzIG9mCisjIHZhcmlhYmxlcyBmb3Igc2luZ2xlIGFuZCBkb3VibGUgcXVvdGUgZXNjYXBpbmcgd2Ugc2F2ZWQgZnJvbSBjYWxscworIyB0byBfTFRfREVDTCwgd2UgY2FuIHB1dCBxdW90ZSBlc2NhcGVkIHZhcmlhYmxlcyBkZWNsYXJhdGlvbnMKKyMgaW50byBgY29uZmlnLnN0YXR1cycsIGFuZCB0aGVuIHRoZSBzaGVsbCBjb2RlIHRvIHF1b3RlIGVzY2FwZSB0aGVtIGluCisjIGZvciBsb29wcyBpbiBgY29uZmlnLnN0YXR1cycuICBGaW5hbGx5LCBhbnkgYWRkaXRpb25hbCBjb2RlIGFjY3VtdWxhdGVkCisjIGZyb20gY2FsbHMgdG8gX0xUX0NPTkZJR19MSUJUT09MX0lOSVQgaXMgZXhwYW5kZWQuCittNF9kZWZ1bihbX0xUX0NPTkZJR19DT01NQU5EU10sCitbQUNfUFJPVklERV9JRkVMU0UoW0xUX09VVFBVVF0sCisJZG5sIElmIHRoZSBsaWJ0b29sIGdlbmVyYXRpb24gY29kZSBoYXMgYmVlbiBwbGFjZWQgaW4gJENPTkZJR19MVCwKKwlkbmwgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdCBhbGwgb3ZlciBhZ2FpbiBpbnRvIGNvbmZpZy5zdGF0dXMsCisJZG5sIHRoZW4gd2Ugd2lsbCBoYXZlIGNvbmZpZy5zdGF0dXMgcnVuICRDT05GSUdfTFQgbGF0ZXIsIHNvIGl0CisJZG5sIG5lZWRzIHRvIGtub3cgd2hhdCBuYW1lIGlzIHN0b3JlZCB0aGVyZToKKyAgICAgICAgW0FDX0NPTkZJR19DT01NQU5EUyhbbGlidG9vbF0sCisgICAgICAgICAgICBbJFNIRUxMICRDT05GSUdfTFQgfHwgQVNfRVhJVCgxKV0sIFtDT05GSUdfTFQ9JyRDT05GSUdfTFQnXSldLAorICAgIGRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaXMgZGVzdGluZWQgZm9yIGNvbmZpZy5zdGF0dXMsCisgICAgZG5sIGV4cGFuZCB0aGUgYWNjdW11bGF0ZWQgY29tbWFuZHMgYW5kIGluaXQgY29kZSBub3c6CisgICAgW0FDX0NPTkZJR19DT01NQU5EUyhbbGlidG9vbF0sCisgICAgICAgIFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLCBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdKV0pCitdKSNfTFRfQ09ORklHX0NPTU1BTkRTCisKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVF0sCitbCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKK2RvdWJsZV9xdW90ZV9zdWJzdD0nJGRvdWJsZV9xdW90ZV9zdWJzdCcKK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSckZGVsYXlfdmFyaWFibGVfc3Vic3QnCitfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlMKK0xUQ0M9JyRMVENDJworTFRDRkxBR1M9JyRMVENGTEFHUycKK2NvbXBpbGVyPSckY29tcGlsZXJfREVGQVVMVCcKKworIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCitcJFtdMQorX0xURUNIT19FT0YnCit9CisKKyMgUXVvdGUgZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtbIFwKK11dLCBsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCitdXSwgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMpOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiXFxcJFwkdmFyXFwiIHwgXFxcJFNFRCAtZSBcXCJcXFwkZG91YmxlX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVAorXSkKKworIyBfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVChGSUxFLCBbQ09NTUVOVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBHZW5lcmF0ZSBhIGNoaWxkIHNjcmlwdCBGSUxFIHdpdGggYWxsIGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeSB0bworIyByZXVzZSB0aGUgZW52aXJvbm1lbnQgbGVhcm5lZCBieSB0aGUgcGFyZW50IHNjcmlwdCwgYW5kIG1ha2UgdGhlCisjIGZpbGUgZXhlY3V0YWJsZS4gIElmIENPTU1FTlQgaXMgc3VwcGxpZWQsIGl0IGlzIGluc2VydGVkIGFmdGVyIHRoZQorIyBgIyEnIHNlcXVlbmNlIGJ1dCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gdGV4dCBiZWdpbnMuICBBZnRlciB0aGlzCisjIG1hY3JvLCBhZGRpdGlvbmFsIHRleHQgY2FuIGJlIGFwcGVuZGVkIHRvIEZJTEUgdG8gZm9ybSB0aGUgYm9keSBvZgorIyB0aGUgY2hpbGQgc2NyaXB0LiAgVGhlIG1hY3JvIGVuZHMgd2l0aCBub24temVybyBzdGF0dXMgaWYgdGhlCisjIGZpbGUgY291bGQgbm90IGJlIGZ1bGx5IHdyaXR0ZW4gKHN1Y2ggYXMgaWYgdGhlIGRpc2sgaXMgZnVsbCkuCittNF9pZmRlZihbQVNfSU5JVF9HRU5FUkFURURdLAorW200X2RlZnVuKFtfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVF0sW0FTX0lOSVRfR0VORVJBVEVEKCRAKV0pXSwKK1ttNF9kZWZ1bihbX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVRdLAorW200X3JlcXVpcmUoW0FTX1BSRVBBUkVdKV1kbmwKK1ttNF9wdXNoZGVmKFtBU19NRVNTQUdFX0xPR19GRF0pXWRubAorW2x0X3dyaXRlX2ZhaWw9MAorY2F0ID4kMSA8PF9BU0VPRiB8fCBsdF93cml0ZV9mYWlsPTEKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorJDIKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JDEgPDxcX0FTRU9GIHx8IGx0X3dyaXRlX2ZhaWw9MQorQVNfU0hFTExfU0FOSVRJWkUKK19BU19QUkVQQVJFCitleGVjIEFTX01FU1NBR0VfRkQ+JjEKK19BU0VPRgordGVzdCAkbHRfd3JpdGVfZmFpbCA9IDAgJiYgY2htb2QgK3ggJDFbXWRubAorbTRfcG9wZGVmKFtBU19NRVNTQUdFX0xPR19GRF0pXSldKSMgX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQKKworIyBMVF9PVVRQVVQKKyMgLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gYWxsb3dzIGVhcmx5IGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0IChiZWZvcmUKKyMgQUNfT1VUUFVUIGlzIGNhbGxlZCksIGluY2FzZSBpdCBpcyB1c2VkIGluIGNvbmZpZ3VyZSBmb3IgY29tcGlsYXRpb24KKyMgdGVzdHMuCitBQ19ERUZVTihbTFRfT1VUUFVUXSwKK1s6ICR7Q09ORklHX0xUPS4vY29uZmlnLmx0fQorQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJENPTkZJR19MVF0pCitfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVChbIiRDT05GSUdfTFQiXSwKK1sjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgYSBsaWJ0b29sIHN0dWIgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLl0pCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PFxfTFRFT0YKK2x0X2NsX3NpbGVudD1mYWxzZQorZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZworeworICBlY2hvCisgIEFTX0JPWChbUnVubmluZyAkYXNfbWUuXSkKK30gPiZBU19NRVNTQUdFX0xPR19GRAorCitsdF9jbF9oZWxwPSJcCitcYCRhc19tZScgY3JlYXRlcyBhIGxvY2FsIGxpYnRvb2wgc3R1YiBmcm9tIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sCitmb3IgdXNlIGluIGZ1cnRoZXIgY29uZmlndXJlIHRpbWUgdGVzdHMgYmVmb3JlIHRoZSByZWFsIGxpYnRvb2wgaXMKK2dlbmVyYXRlZC4KKworVXNhZ2U6ICRbMF0gW1tPUFRJT05TXV0KKworICAtaCwgLS1oZWxwICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworCitSZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uIgorCitsdF9jbF92ZXJzaW9uPSJcCittNF9pZnNldChbQUNfUEFDS0FHRV9OQU1FXSwgW0FDX1BBQ0tBR0VfTkFNRSBdKWNvbmZpZy5sdFtdZG5sCittNF9pZnNldChbQUNfUEFDS0FHRV9WRVJTSU9OXSwgWyBBQ19QQUNLQUdFX1ZFUlNJT05dKQorY29uZmlndXJlZCBieSAkWzBdLCBnZW5lcmF0ZWQgYnkgbTRfUEFDS0FHRV9TVFJJTkcuCisKK0NvcHlyaWdodCAoQykgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLmx0IHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCisKK3doaWxlIHRlc3QgJFsjXSAhPSAwCitkbworICBjYXNlICRbMV0gaW4KKyAgICAtLXZlcnNpb24gfCAtLXYqIHwgLVYgKQorICAgICAgZWNobyAiJGx0X2NsX3ZlcnNpb24iOyBleGl0IDAgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgZWNobyAiJGx0X2NsX2hlbHAiOyBleGl0IDAgOzsKKyAgICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgICAgIGRlYnVnPTogOzsKKyAgICAtLXF1aWV0IHwgLS1xKiB8IC0tc2lsZW50IHwgLS1zKiB8IC1xICkKKyAgICAgIGx0X2NsX3NpbGVudD06IDs7CisKKyAgICAtKikgQUNfTVNHX0VSUk9SKFt1bnJlY29nbml6ZWQgb3B0aW9uOiAkWzFdCitUcnkgXGAkWzBdIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXSkgOzsKKworICAgICopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIGFyZ3VtZW50OiAkWzFdCitUcnkgXGAkWzBdIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXSkgOzsKKyAgZXNhYworICBzaGlmdAorZG9uZQorCitpZiAkbHRfY2xfc2lsZW50OyB0aGVuCisgIGV4ZWMgQVNfTUVTU0FHRV9GRD4vZGV2L251bGwKK2ZpCitfTFRFT0YKKworY2F0ID4+IiRDT05GSUdfTFQiIDw8X0xURU9GCitfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVAorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PFxfTFRFT0YKK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRvZmlsZV0pCitfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFMKK0FTX0VYSVQoMCkKK19MVEVPRgorY2htb2QgK3ggIiRDT05GSUdfTFQiCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYnV0IGNvbmZpZy5sdCBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sCisjIGFwcGVuZGluZyB0byBjb25maWcubG9nLCB3aGljaCBmYWlscyBvbiBET1MsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdAorIyBvcGVuIGJ5IGNvbmZpZ3VyZS4gIEhlcmUgd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLCBlZmZlY3RpdmVseSBjbG9zaW5nCisjIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZCBhcHBlbmRlZCB0byBieSBjb25maWcubHQuCitsdF9jbF9zdWNjZXNzPToKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmCisgIGx0X2NvbmZpZ19sdF9hcmdzPSIkbHRfY29uZmlnX2x0X2FyZ3MgLS1xdWlldCIKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+L2Rldi9udWxsCiskU0hFTEwgIiRDT05GSUdfTFQiICRsdF9jb25maWdfbHRfYXJncyB8fCBsdF9jbF9zdWNjZXNzPWZhbHNlCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCiskbHRfY2xfc3VjY2VzcyB8fCBBU19FWElUKDEpCitdKSMgTFRfT1VUUFVUCisKKworIyBfTFRfQ09ORklHKFRBRykKKyMgLS0tLS0tLS0tLS0tLS0tCisjIElmIFRBRyBpcyB0aGUgYnVpbHQtaW4gdGFnLCBjcmVhdGUgYW4gaW5pdGlhbCBsaWJ0b29sIHNjcmlwdCB3aXRoIGEKKyMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIHVudGFnZ2VkIGNvbmZpZyB2YXJzLiAgT3RoZXJ3aXNlIGFkZCBjb2RlCisjIHRvIGNvbmZpZy5zdGF0dXMgZm9yIGFwcGVuZGluZyB0aGUgY29uZmlndXJhdGlvbiBuYW1lZCBieSBUQUcgZnJvbSB0aGUKKyMgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgorbTRfZGVmdW4oW19MVF9DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFsKKyAgbTRfZGVmaW5lKFtfTFRfVEFHXSwgbTRfaWYoWyQxXSwgW10sIFtDXSwgWyQxXSkpZG5sCisgIG00X2lmKF9MVF9UQUcsIFtDXSwgWworICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgICBmaQorCisgICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgorICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICAgJFJNICIkY2ZnZmlsZSIKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCitfTFRfQ09QWUlORworX0xUX0xJQlRPT0xfVEFHUworCisjICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRworX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlMKK19MVF9MSUJUT09MX1RBR19WQVJTCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX0xUX0VPRgorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK19MVF9FT0YKKyAgICA7OworICBlc2FjCisKKyAgX0xUX1BST0dfTFRNQUlOCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAorICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorCisgIF9MVF9QUk9HX1JFUExBQ0VfU0hFTExGTlMKKworICAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCisgIGNobW9kICt4ICIkb2ZpbGUiCitdLAorW2NhdCA8PF9MVF9FT0YgPj4gIiRvZmlsZSIKKworZG5sIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byB1c2UgJDEgaGVyZSwgc2luY2UgX0xUX1RBRyBpcyBub3QgZXhwYW5kZWQKK2RubCBpbiBhIGNvbW1lbnQgKGllIGFmdGVyIGEgIykuCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfTElCVE9PTF9UQUdfVkFSUyhfTFRfVEFHKQorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJDEKK19MVF9FT0YKK10pZG5sIC9tNF9pZgorXSwKK1ttNF9pZihbJDFdLCBbXSwgWworICAgIFBBQ0tBR0U9JyRQQUNLQUdFJworICAgIFZFUlNJT049JyRWRVJTSU9OJworICAgIFRJTUVTVEFNUD0nJFRJTUVTVEFNUCcKKyAgICBSTT0nJFJNJworICAgIG9maWxlPSckb2ZpbGUnXSwgW10pCitdKWRubCAvX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTCitdKSMgX0xUX0NPTkZJRworCisKKyMgTFRfU1VQUE9SVEVEX1RBRyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcmFjZSB0aGlzIG1hY3JvIHRvIGRpc2NvdmVyIHdoYXQgdGFncyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBsaWJ0b29sCisjIC0tdGFnIG9wdGlvbiwgdXNpbmc6CisjICAgIGF1dG9jb25mIC0tdHJhY2UgJ0xUX1NVUFBPUlRFRF9UQUc6JDEnCitBQ19ERUZVTihbTFRfU1VQUE9SVEVEX1RBR10sIFtdKQorCisKKyMgQyBzdXBwb3J0IGlzIGJ1aWx0LWluIGZvciBub3cKK200X2RlZmluZShbX0xUX0xBTkdfQ19lbmFibGVkXSwgW10pCittNF9kZWZpbmUoW19MVF9UQUdTXSwgW10pCisKKworIyBMVF9MQU5HKExBTkcpCisjIC0tLS0tLS0tLS0tLS0KKyMgRW5hYmxlIGxpYnRvb2wgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuCitBQ19ERUZVTihbTFRfTEFOR10sCitbQUNfQkVGT1JFKFskMF0sIFtMVF9PVVRQVVRdKWRubAorbTRfY2FzZShbJDFdLAorICBbQ10sCQkJW19MVF9MQU5HKEMpXSwKKyAgW0MrK10sCQlbX0xUX0xBTkcoQ1hYKV0sCisgIFtHb10sCQkJW19MVF9MQU5HKEdPKV0sCisgIFtKYXZhXSwJCVtfTFRfTEFORyhHQ0opXSwKKyAgW0ZvcnRyYW4gNzddLAkJW19MVF9MQU5HKEY3NyldLAorICBbRm9ydHJhbl0sCQlbX0xUX0xBTkcoRkMpXSwKKyAgW1dpbmRvd3MgUmVzb3VyY2VdLAlbX0xUX0xBTkcoUkMpXSwKKyAgW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX0NPTkZJR10sCisgICAgW19MVF9MQU5HKCQxKV0sCisgICAgW200X2ZhdGFsKFskMDogdW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICIkMSJdKV0pXSlkbmwKK10pIyBMVF9MQU5HCisKKworIyBfTFRfTEFORyhMQU5HTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkddLAorW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSwKKyAgW0xUX1NVUFBPUlRFRF9UQUcoWyQxXSlkbmwKKyAgbTRfYXBwZW5kKFtfTFRfVEFHU10sIFskMSBdKWRubAorICBtNF9kZWZpbmUoW19MVF9MQU5HX10kMVtfZW5hYmxlZF0sIFtdKWRubAorICBfTFRfTEFOR18kMV9DT05GSUcoJDEpXSlkbmwKK10pIyBfTFRfTEFORworCisKK200X2lmbmRlZihbQUNfUFJPR19HT10sIFsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19HTy4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK200X2RlZnVuKFtBQ19QUk9HX0dPXSwKK1tBQ19MQU5HX1BVU0goR28pZG5sCitBQ19BUkdfVkFSKFtHT0NdLCAgICAgW0dvIGNvbXBpbGVyIGNvbW1hbmRdKWRubAorQUNfQVJHX1ZBUihbR09GTEFHU10sIFtHbyBjb21waWxlciBmbGFnc10pZG5sCitfQUNfQVJHX1ZBUl9MREZMQUdTKClkbmwKK0FDX0NIRUNLX1RPT0woR09DLCBnY2NnbykKK2lmIHRlc3QgLXogIiRHT0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBBQ19DSEVDS19QUk9HKEdPQywgWyR7YWNfdG9vbF9wcmVmaXh9Z2NjZ29dLCBbJHthY190b29sX3ByZWZpeH1nY2Nnb10pCisgIGZpCitmaQoraWYgdGVzdCAteiAiJEdPQyI7IHRoZW4KKyAgQUNfQ0hFQ0tfUFJPRyhHT0MsIGdjY2dvLCBnY2NnbywgZmFsc2UpCitmaQorXSkjbTRfZGVmdW4KK10pI200X2lmbmRlZgorCisKKyMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfTEFOR19ERUZBVUxUX0NPTkZJR10sCitbQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKyAgW0xUX0xBTkcoQ1hYKV0sCisgIFttNF9kZWZpbmUoW0FDX1BST0dfQ1hYXSwgZGVmbihbQUNfUFJPR19DWFhdKVtMVF9MQU5HKENYWCldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0Y3N10sCisgIFtMVF9MQU5HKEY3NyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0Y3N10sIGRlZm4oW0FDX1BST0dfRjc3XSlbTFRfTEFORyhGNzcpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GQ10sCisgIFtMVF9MQU5HKEZDKV0sCisgIFttNF9kZWZpbmUoW0FDX1BST0dfRkNdLCBkZWZuKFtBQ19QUk9HX0ZDXSlbTFRfTEFORyhGQyldKV0pCisKK2RubCBUaGUgY2FsbCB0byBbQV1bTV9QUk9HX0dDSl0gaXMgcXVvdGVkIGxpa2UgdGhhdCB0byBzdG9wIGFjbG9jYWwKK2RubCBwdWxsaW5nIHRoaW5ncyBpbiBuZWVkbGVzc2x5LgorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSwKKyAgW0xUX0xBTkcoR0NKKV0sCisgIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sCisgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX0dDSl0sCisgICAgICBbTFRfTEFORyhHQ0opXSwKKyAgICAgIFttNF9pZmRlZihbQUNfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0FDX1BST0dfR0NKXSwgZGVmbihbQUNfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pCisgICAgICAgbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0FdW01fUFJPR19HQ0pdLCBkZWZuKFtBXVtNX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtMVF9QUk9HX0dDSl0sCisJW200X2RlZmluZShbTFRfUFJPR19HQ0pdLCBkZWZuKFtMVF9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSldKV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR09dLAorICBbTFRfTEFORyhHTyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0dPXSwgZGVmbihbQUNfUFJPR19HT10pW0xUX0xBTkcoR08pXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19SQ10sCisgIFtMVF9MQU5HKFJDKV0sCisgIFttNF9kZWZpbmUoW0xUX1BST0dfUkNdLCBkZWZuKFtMVF9QUk9HX1JDXSlbTFRfTEFORyhSQyldKV0pCitdKSMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKKworIyBPYnNvbGV0ZSBtYWNyb3M6CitBVV9ERUZVTihbQUNfTElCVE9PTF9DWFhdLCBbTFRfTEFORyhDKyspXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtMVF9MQU5HKEZvcnRyYW4gNzcpXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW0xUX0xBTkcoRm9ydHJhbildKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW0xUX0xBTkcoSmF2YSldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbTFRfTEFORyhXaW5kb3dzIFJlc291cmNlKV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRkNdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9HQ0pdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9SQ10sIFtdKQorCisKKyMgX0xUX1RBR19DT01QSUxFUgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1RBR19DT01QSUxFUl0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisKK19MVF9ERUNMKFtMVENDXSwgW0NDXSwgWzFdLCBbQSBDIGNvbXBpbGVyXSlkbmwKK19MVF9ERUNMKFtMVENGTEFHU10sIFtDRkxBR1NdLCBbMV0sIFtMVENDIGNvbXBpbGVyIGZsYWdzXSlkbmwKK19MVF9UQUdERUNMKFtDQ10sIFtjb21waWxlcl0sIFsxXSwgW0EgbGFuZ3VhZ2Ugc3BlY2lmaWMgY29tcGlsZXJdKWRubAorX0xUX1RBR0RFQ0woW3dpdGhfZ2NjXSwgW0dDQ10sIFswXSwgW0lzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyP10pZG5sCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKK10pIyBfTFRfVEFHX0NPTVBJTEVSCisKKworIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBjb21waWxlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGNvbXBpbGVyIHRlc3QgY29kZS4KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSBjb25mdGVzdCoKK10pIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKworCisjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgbGlua2VyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgbGluayB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSAtciBjb25mdGVzdCoKK10pIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1MKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW5fb25jZShbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdLFsKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbiopCisgICAgQUNfQ0hFQ0tfVE9PTChbRFNZTVVUSUxdLCBbZHN5bXV0aWxdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTk1FRElUXSwgW25tZWRpdF0sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtMSVBPXSwgW2xpcG9dLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbT1RPT0xdLCBbb3Rvb2xdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbT1RPT0w2NF0sIFtvdG9vbDY0XSwgWzpdKQorICAgIF9MVF9ERUNMKFtdLCBbRFNZTVVUSUxdLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGFyY2hpdmVkIERXQVJGIGRlYnVnIHN5bWJvbCBmaWxlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtOTUVESVRdLCBbMV0sCisgICAgICBbVG9vbCB0byBjaGFuZ2UgZ2xvYmFsIHRvIGxvY2FsIHN5bWJvbHMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTElQT10sIFsxXSwKKyAgICAgIFtUb29sIHRvIG1hbmlwdWxhdGUgZmF0IG9iamVjdHMgYW5kIGFyY2hpdmVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW09UT09MXSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW09UT09MNjRdLCBbMV0sCisgICAgICBbbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciA2NCBiaXQgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYIDEwLjRdKQorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZ10sW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2RdLAorICAgICAgW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAgIGlmIHRlc3QgLXogIiR7TFRfTVVMVElfTU9EVUxFfSI7IHRoZW4KKwkjIEJ5IGRlZmF1bHQgd2Ugd2lsbCBhZGQgdGhlIC1zaW5nbGVfbW9kdWxlIGZsYWcuIFlvdSBjYW4gb3ZlcnJpZGUKKwkjIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVF9NVUxUSV9NT0RVTEUKKwkjIG5vbi1lbXB0eSBhdCBjb25maWd1cmUgdGltZSwgb3IgYnkgYWRkaW5nIC1tdWx0aV9tb2R1bGUgdG8gdGhlCisJIyBsaW5rIGZsYWdzLgorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwllY2hvICJpbnQgZm9vKHZvaWQpe3JldHVybiAxO30iID4gY29uZnRlc3QuYworCWVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCistZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorCSRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCisJICAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyAyPmNvbmZ0ZXN0LmVycgorICAgICAgICBfbHRfcmVzdWx0PSQ/CisJIyBJZiB0aGVyZSBpcyBhIG5vbi1lbXB0eSBlcnJvciBsb2csIGFuZCAic2luZ2xlX21vZHVsZSIKKwkjIGFwcGVhcnMgaW4gaXQsIGFzc3VtZSB0aGUgZmxhZyBjYXVzZWQgYSBsaW5rZXIgd2FybmluZworICAgICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVyciAmJiAkR1JFUCBzaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmVycjsgdGhlbgorCSAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisJIyBPdGhlcndpc2UsIGlmIHRoZSBvdXRwdXQgd2FzIGNyZWF0ZWQgd2l0aCBhIDAgZXhpdCBjb2RlIGZyb20KKwkjIHRoZSBjb21waWxlciwgaXQgd29ya2VkLgorCWVsaWYgdGVzdCAtZiBsaWJjb25mdGVzdC5keWxpYiAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwOyB0aGVuCisJICBsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPXllcworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorCWZpCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIGZpXSkKKworICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZ10sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0XSwKKyAgICAgIFtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KKyAgICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgZWNobyAiX21haW4iID4gY29uZnRlc3Quc3ltCisgICAgICBMREZMQUdTPSIkTERGTEFHUyAtV2wsLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCxjb25mdGVzdC5zeW0iCisgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisJW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD15ZXNdLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm9dKQorCUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgXSkKKworICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWddLFtsdF9jdl9sZF9mb3JjZV9sb2FkXSwKKyAgICAgIFtsdF9jdl9sZF9mb3JjZV9sb2FkPW5vCisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBmb3JjZWRfbG9hZGVkKCkgeyByZXR1cm4gMjt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBlY2hvICIkQVIgY3J1IGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QubyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8gMj4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGVjaG8gIiRSQU5MSUIgbGliY29uZnRlc3QuYSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJFJBTkxJQiBsaWJjb25mdGVzdC5hIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBtYWluKCkgeyByZXR1cm4gMDt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIDI+Y29uZnRlc3QuZXJyCisgICAgICBfbHRfcmVzdWx0PSQ/CisgICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVyciAmJiAkR1JFUCBmb3JjZV9sb2FkIGNvbmZ0ZXN0LmVycjsgdGhlbgorCWNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZWxpZiB0ZXN0IC1mIGNvbmZ0ZXN0ICYmIHRlc3QgJF9sdF9yZXN1bHQgLWVxIDAgJiYgJEdSRVAgZm9yY2VkX2xvYWQgY29uZnRlc3QgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCWx0X2N2X2xkX2ZvcmNlX2xvYWQ9eWVzCisgICAgICBlbHNlCisJY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBmaQorICAgICAgICBybSAtZiBjb25mdGVzdC5lcnIgbGliY29uZnRlc3QuYSBjb25mdGVzdCBjb25mdGVzdC5jCisgICAgICAgIHJtIC1yZiBjb25mdGVzdC5kU1lNCisgICAgXSkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbjEuKikKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4qKSAjIGRhcndpbiA1Lnggb24KKyAgICAgICMgaWYgcnVubmluZyBvbiAxMC41IG9yIGxhdGVyLCB0aGUgZGVwbG95bWVudCB0YXJnZXQgZGVmYXVsdHMKKyAgICAgICMgdG8gdGhlIE9TIHZlcnNpb24sIGlmIG9uIHg4NiwgYW5kIDEwLjQsIHRoZSBkZXBsb3ltZW50CisgICAgICAjIHRhcmdldCBkZWZhdWx0cyB0byAxMC40LiBEb24ndCB5b3UgbG92ZSBpdD8KKyAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQtMTAuMH0sJGhvc3QgaW4KKwkxMC4wLCo4NiotZGFyd2luOCp8MTAuMCwqLWRhcndpbltbOTFdXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisJMTAuW1swMTJdXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisJMTAuKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKyAgICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCisgICAgZWxzZQorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IiAmJiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAibm8iOyB0aGVuCisgICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JworICAgIGVsc2UKKyAgICAgIF9sdF9kc3ltdXRpbD0KKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCisKKworIyBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrcyBmb3IgbGlua2VyIGFuZCBjb21waWxlciBmZWF0dXJlcyBvbiBkYXJ3aW4KK200X2RlZnVuKFtfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFU10sCitbCisgIG00X3JlcXVpcmUoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSkKKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KKyAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworICAgIG00X2Nhc2UoWyQxXSwgW0Y3N10sIFtfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllc10sCisgICAgICAgICAgICAgICAgICBbRkNdLCAgW19MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzXSkKKyAgZWxzZQorICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJworICBmaQorICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAtZSAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBtNF9pZihbJDFdLCBbQ1hYXSwKK1sgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgIT0gInllcyI7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kc3ltdXRpbH0iCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBmaQorXSxbXSkKKyAgZWxzZQorICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgIGZpCitdKQorCisjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW5rcyBhIG1pbmltYWwgcHJvZ3JhbSBhbmQgY2hlY2tzIHRoZSBleGVjdXRhYmxlCisjIGZvciB0aGUgc3lzdGVtIGRlZmF1bHQgaGFyZGNvZGVkIGxpYnJhcnkgcGF0aC4gSW4gbW9zdCBjYXNlcywKKyMgdGhpcyBpcyAvdXNyL2xpYjovbGliLCBidXQgd2hlbiB0aGUgTVBJIGNvbXBpbGVycyBhcmUgdXNlZAorIyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gYW5kIE1QSSBsaWJzIGFyZSBpbmNsdWRlZCB0b28uCisjIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggYWNjb3JkaW5nCisjIHRvIHRoZSBhaXggbGQgbWFudWFsLgorIyBTdG9yZSB0aGUgcmVzdWx0cyBmcm9tIHRoZSBkaWZmZXJlbnQgY29tcGlsZXJzIGZvciBlYWNoIFRBR05BTUUuCisjIEFsbG93IHRvIG92ZXJyaWRlIHRoZW0gZm9yIGFsbCB0YWdzIHRocm91Z2ggbHRfY3ZfYWl4X2xpYnBhdGguCittNF9kZWZ1bihbX0xUX1NZU19NT0RVTEVfUEFUSF9BSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitpZiB0ZXN0ICIke2x0X2N2X2FpeF9saWJwYXRoK3NldH0iID0gc2V0OyB0aGVuCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aAorZWxzZQorICBBQ19DQUNIRV9WQUwoW19MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pXSwKKyAgW0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLFsKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPSdbCisgICAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJICAvXjAvIHsKKwkgICAgICBzL14wICAqXChbXiBdKlwpICokL1wxLworCSAgICAgIHAKKwkgIH0KKyAgICAgIH1dJworICBfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKT1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSkiOyB0aGVuCisgICAgX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSk9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpXSxbXSkKKyAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pIjsgdGhlbgorICAgIF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pPSIvdXNyL2xpYjovbGliIgorICBmaQorICBdKQorICBhaXhfbGlicGF0aD0kX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSkKK2ZpCitdKSMgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKworCisjIF9MVF9TSEVMTF9JTklUKEFSRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfU0hFTExfSU5JVF0sCitbbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVF0sIFskMQorXSldKSMgX0xUX1NIRUxMX0lOSVQKKworCisKKyMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmluZCBob3cgd2UgY2FuIGZha2UgYW4gZWNobyBjb21tYW5kIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaC4KKyMgSW4gcGFydGljdWxhciwgd2l0aCBBdXRvY29uZiAyLjYwIG9yIGxhdGVyIHdlIGFkZCBzb21lIGNvZGUgdG8gdGhlIHN0YXJ0CisjIG9mIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdCB3aGljaCB3aWxsIGZpbmQgYSBzaGVsbCB3aXRoIGEgYnVpbHRpbgorIyBwcmludGYgKHdoaWNoIHdlIGNhbiB1c2UgYXMgYW4gZWNobyBjb21tYW5kKS4KK200X2RlZnVuKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCitbRUNITz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KKworQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gcHJpbnQgc3RyaW5nc10pCisjIFRlc3QgcHJpbnQgZmlyc3QsIGJlY2F1c2UgaXQgd2lsbCBiZSBhIGJ1aWx0aW4gaWYgcHJlc2VudC4KK2lmIHRlc3QgIlhgKCBwcmludCAtciAtLSAtbiApIDI+L2Rldi9udWxsYCIgPSBYLW4gJiYgXAorICAgdGVzdCAiWGBwcmludCAtciAtLSAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnQgLXIgLS0nCitlbGlmIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludGYgJXNcbicKK2Vsc2UKKyAgIyBVc2UgdGhpcyBmdW5jdGlvbiBhcyBhIGZhbGxiYWNrIHRoYXQgYWx3YXlzIHdvcmtzLgorICBmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKKyAgeworICAgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskW10xCitfTFRFQ0hPX0VPRicKKyAgfQorICBFQ0hPPSdmdW5jX2ZhbGxiYWNrX2VjaG8nCitmaQorCisjIGZ1bmNfZWNob19hbGwgYXJnLi4uCisjIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCitmdW5jX2VjaG9fYWxsICgpCit7CisgICAgJEVDSE8gIiQqIiAKK30KKworY2FzZSAiJEVDSE8iIGluCisgIHByaW50ZiopIEFDX01TR19SRVNVTFQoW3ByaW50Zl0pIDs7CisgIHByaW50KikgQUNfTVNHX1JFU1VMVChbcHJpbnQgLXJdKSA7OworICAqKSBBQ19NU0dfUkVTVUxUKFtjYXRdKSA7OworZXNhYworCittNF9pZmRlZihbX0FTX0RFVEVDVF9TVUdHRVNURURdLAorW19BU19ERVRFQ1RfU1VHR0VTVEVEKFsKKyAgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9JHtCQVNIX1ZFUlNJT04rc2V0fSIgfHwgKAorICAgIEVDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCisgICAgRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisgICAgRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KKyAgICBQQVRIPS9lbXB0eSBGUEFUSD0vZW1wdHk7IGV4cG9ydCBQQVRIIEZQQVRICisgICAgdGVzdCAiWGBwcmludGYgJXMgJEVDSE9gIiA9ICJYJEVDSE8iIFwKKyAgICAgIHx8IHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE9gIiA9ICJYJEVDSE8iICldKV0pCisKK19MVF9ERUNMKFtdLCBbU0hFTExdLCBbMV0sIFtTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzXSkKK19MVF9ERUNMKFtdLCBbRUNIT10sIFsxXSwgW0FuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzXSkKK10pIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCisKKyMgX0xUX1dJVEhfU1lTUk9PVAorIyAtLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX1dJVEhfU1lTUk9PVF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3lzcm9vdF0pCitBQ19BUkdfV0lUSChbc3lzcm9vdF0sCitbICAtLXdpdGgtc3lzcm9vdFs9RElSXSBTZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMgd2l0aGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHRoZSBjb21waWxlcidzIHN5c3Jvb3QgaWYgbm90IHNwZWNpZmllZCkuXSwKK1tdLCBbd2l0aF9zeXNyb290PW5vXSkKKworZG5sIGx0X3N5c3Jvb3Qgd2lsbCBhbHdheXMgYmUgcGFzc2VkIHVucXVvdGVkLiAgV2UgcXVvdGUgaXQgaGVyZQorZG5sIGluIGNhc2UgdGhlIHVzZXIgcGFzc2VkIGEgZGlyZWN0b3J5IG5hbWUuCitsdF9zeXNyb290PQorY2FzZSAke3dpdGhfc3lzcm9vdH0gaW4gIygKKyB5ZXMpCisgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICBsdF9zeXNyb290PWAkQ0MgLS1wcmludC1zeXNyb290IDI+L2Rldi9udWxsYAorICAgZmkKKyAgIDs7ICMoCisgLyopCisgICBsdF9zeXNyb290PWBlY2hvICIkd2l0aF9zeXNyb290IiB8IHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICA7OyAjKAorIG5vfCcnKQorICAgOzsgIygKKyAqKQorICAgQUNfTVNHX1JFU1VMVChbJHt3aXRoX3N5c3Jvb3R9XSkKKyAgIEFDX01TR19FUlJPUihbVGhlIHN5c3Jvb3QgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLl0pCisgICA7OworZXNhYworCisgQUNfTVNHX1JFU1VMVChbJHtsdF9zeXNyb290Oi1ub31dKQorX0xUX0RFQ0woW10sIFtsdF9zeXNyb290XSwgWzBdLCBbVGhlIHJvb3Qgd2hlcmUgdG8gc2VhcmNoIGZvciBdZG5sCitbZGVwZW5kZW50IGxpYnJhcmllcywgYW5kIGluIHdoaWNoIG91ciBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZC5dKV0pCisKKyMgX0xUX0VOQUJMRV9MT0NLCisjIC0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9FTkFCTEVfTE9DS10sCitbQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKKyAgICBbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgICAqRUxGLTMyKikKKwlIUFVYX0lBNjRfTU9ERT0iMzIiCisJOzsKKyAgICAgICpFTEYtNjQqKQorCUhQVVhfSUE2NF9NT0RFPSI2NCIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lICckTElORU5PJyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC0zMiIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qa2ZyZWVic2QqLWdudXx4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAorczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICA7OworCSAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisJICAgIDs7CisJICBzMzkweC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisJICAgIDs7CisJICBzcGFyYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICo2NC1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjRfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKwkgICAgOzsKKwkgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisJICAgIDs7CisJICBzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAorICAgIFtBQ19MQU5HX1BVU0goQykKKyAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLFtbXV0pXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSkKKyAgICAgQUNfTEFOR19QT1BdKQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7OworKi0qc29sYXJpcyopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgorICAgICAgeWVzKikKKyAgICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICBpPzg2LSotc29sYXJpcyopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmMqLSotc29sYXJpcyopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgIyBHTlUgbGQgMi4yMSBpbnRyb2R1Y2VkIF9zb2wyIGVtdWxhdGlvbnMuICBVc2UgdGhlbSBpZiBhdmFpbGFibGUuCisgICAgICAgIGlmICR7TEQtbGR9IC1WIHwgZ3JlcCBfc29sMiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgICBMRD0iJHtMRC1sZH1fc29sMiIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICopCisJaWYgJHtMRC1sZH0gLTY0IC1yIC1vIGNvbmZ0ZXN0Mi5vIGNvbmZ0ZXN0Lm8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7Citlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorXSkjIF9MVF9FTkFCTEVfTE9DSworCisKKyMgX0xUX1BST0dfQVIKKyMgLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfUFJPR19BUl0sCitbQUNfQ0hFQ0tfVE9PTFMoQVIsIFthcl0sIGZhbHNlKQorOiAke0FSPWFyfQorOiAke0FSX0ZMQUdTPWNydX0KK19MVF9ERUNMKFtdLCBbQVJdLCBbMV0sIFtUaGUgYXJjaGl2ZXJdKQorX0xUX0RFQ0woW10sIFtBUl9GTEFHU10sIFsxXSwgW0ZsYWdzIHRvIGNyZWF0ZSBhbiBhcmNoaXZlXSkKKworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBhcmNoaXZlciBARklMRSBzdXBwb3J0XSwgW2x0X2N2X2FyX2F0X2ZpbGVdLAorICBbbHRfY3ZfYXJfYXRfZmlsZT1ubworICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTV0sCisgICAgIFtlY2hvIGNvbmZ0ZXN0LiRhY19vYmpleHQgPiBjb25mdGVzdC5sc3QKKyAgICAgIGx0X2FyX3RyeT0nJEFSICRBUl9GTEFHUyBsaWJjb25mdGVzdC5hIEBjb25mdGVzdC5sc3QgPiZBU19NRVNTQUdFX0xPR19GRCcKKyAgICAgIEFDX1RSWV9FVkFMKFtsdF9hcl90cnldKQorICAgICAgaWYgdGVzdCAiJGFjX3N0YXR1cyIgLWVxIDA7IHRoZW4KKwkjIEVuc3VyZSB0aGUgYXJjaGl2ZXIgZmFpbHMgdXBvbiBib2d1cyBmaWxlIG5hbWVzLgorCXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgbGliY29uZnRlc3QuYQorCUFDX1RSWV9FVkFMKFtsdF9hcl90cnldKQorCWlmIHRlc3QgIiRhY19zdGF0dXMiIC1uZSAwOyB0aGVuCisgICAgICAgICAgbHRfY3ZfYXJfYXRfZmlsZT1ACisgICAgICAgIGZpCisgICAgICBmaQorICAgICAgcm0gLWYgY29uZnRlc3QuKiBsaWJjb25mdGVzdC5hCisgICAgIF0pCisgIF0pCisKK2lmIHRlc3QgIngkbHRfY3ZfYXJfYXRfZmlsZSIgPSB4bm87IHRoZW4KKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPQorZWxzZQorICBhcmNoaXZlcl9saXN0X3NwZWM9JGx0X2N2X2FyX2F0X2ZpbGUKK2ZpCitfTFRfREVDTChbXSwgW2FyY2hpdmVyX2xpc3Rfc3BlY10sIFsxXSwKKyAgW0hvdyB0byBmZWVkIGEgZmlsZSBsaXN0aW5nIHRvIHRoZSBhcmNoaXZlcl0pCitdKSMgX0xUX1BST0dfQVIKKworCisjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfT0xEX0FSQ0hJVkVdLAorW19MVF9QUk9HX0FSCisKK0FDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06CitfTFRfREVDTChbXSwgW1NUUklQXSwgWzFdLCBbQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW1dKQorCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKK19MVF9ERUNMKFtdLCBbUkFOTElCXSwgWzFdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQorCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkdG9vbF9vbGRsaWIiCisgICAgOzsKKyAgKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkdG9vbF9vbGRsaWIiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJHRvb2xfb2xkbGliIgorZmkKKworY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj15ZXMgOzsKKyAgKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249bm8gOzsKK2VzYWMKK19MVF9ERUNMKFtdLCBbb2xkX3Bvc3RpbnN0YWxsX2NtZHNdLCBbMl0pCitfTFRfREVDTChbXSwgW29sZF9wb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb25dLCBbMF0sCisgICAgW1doZXRoZXIgdG8gdXNlIGEgbG9jayBmb3Igb2xkIGFyY2hpdmUgZXh0cmFjdGlvbl0pCitdKSMgX0xUX0NNRF9PTERfQVJDSElWRQorCisKKyMgX0xUX0NPTVBJTEVSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMJCVtPVVRQVVQtRklMRV0sIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbX0xUX0NPTVBJTEVSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBtNF9pZihbJDRdLCAsIFthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHRdLCBbYWNfb3V0ZmlsZT0kNF0pCisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiQzIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAkMj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gY29uZnRlc3QqCitdKQorCitpZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgorICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKK2Vsc2UKKyAgICBtNF9pZihbJDZdLCAsIDosIFskNl0pCitmaQorXSkjIF9MVF9DT01QSUxFUl9PUFRJT04KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sIFtfTFRfQ09NUElMRVJfT1BUSU9OXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbXSkKKworCisjIF9MVF9MSU5LRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAorIyAgICAgICAgICAgICAgICAgIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbGlua2VyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9MSU5LRVJfT1BUSU9OXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkMyIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgICQyPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICAkMj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gLXIgY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDRdLCAsIDosIFskNF0pCitlbHNlCisgICAgbTRfaWYoWyQ1XSwgLCA6LCBbJDVdKQorZmkKK10pIyBfTFRfTElOS0VSX09QVElPTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtfTFRfTElOS0VSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtdKQorCisKKyMgTFRfQ01EX01BWF9MRU4KKyMtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9DTURfTUFYX0xFTl0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCitBQ19NU0dfQ0hFQ0tJTkcoW3RoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzXSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX21heF9jbWRfbGVuXSwgW2RubAorICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbWludCopCisgICAgIyBPbiBNaU5UIHRoaXMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIHJ1biBvdXQgb2YgbWVtb3J5LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQorICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgorICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcworICAgIGZpCisgICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgOzsKKworICBpbnRlcml4KikKKyAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4CisgICAgOzsKKworICBvczIqKQorICAgICMgVGhlIHRlc3QgdGFrZXMgYSBsb25nIHRpbWUgb24gT1MvMi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MgorICAgIDs7CisKKyAgb3NmKikKKyAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKKyAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAorICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCisgICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0CisgICAgIworICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCisgICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgorICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKKyAgICA7OworICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCisgICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qW1sJIF1dLy8nYAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YChnZXRjb25mIEFSR19NQVgpIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgZWxzZQorICAgICAgIyBNYWtlIHRlc3RzdHJpbmcgYSBsaXR0bGUgYmlnZ2VyIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyB3aXRoIGl0LgorICAgICAgIyBhIDFLIHN0cmluZyBzaG91bGQgYmUgYSByZWFzb25hYmxlIHN0YXJ0LgorICAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDsgZG8KKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQorICAgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0CisgICAgICAjIHdlIGNhbid0IHRlbGwuCisgICAgICB3aGlsZSB7IHRlc3QgIlgiYGVudiBlY2hvICIkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAorCSAgICAgICAgID0gIlgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIjsgfSA+L2Rldi9udWxsIDI+JjEgJiYKKwkgICAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKKyAgICAgIGRvCisgICAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgICMgT25seSBjaGVjayB0aGUgc3RyaW5nIGxlbmd0aCBvdXRzaWRlIHRoZSBsb29wLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYAorICAgICAgdGVzdHN0cmluZz0KKyAgICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24KKyAgICAgICMgbWFzc2l2ZSBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlCisgICAgICAjIGxpbmtlci4gIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQoraWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRsdF9jdl9zeXNfbWF4X2NtZF9sZW4pCitlbHNlCisgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCitfTFRfREVDTChbXSwgW21heF9jbWRfbGVuXSwgWzBdLAorICAgIFtXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/XSkKK10pIyBMVF9DTURfTUFYX0xFTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW0xUX0NNRF9NQVhfTEVOXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbXSkKKworCisjIF9MVF9IRUFERVJfRExGQ04KKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9IRUFERVJfRExGQ05dLAorW0FDX0NIRUNLX0hFQURFUlMoW2RsZmNuLmhdLCBbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSlkbmwKK10pIyBfTFRfSEVBREVSX0RMRkNOCisKKworIyBfTFRfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCisjICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UUllfRExPUEVOX1NFTEZdLAorW200X3JlcXVpcmUoW19MVF9IRUFERVJfRExGQ05dKWRubAoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBbJDRdCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK1sjbGluZSAkTElORU5PICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXaGVuIC1mdmlzYmlsaXR5PWhpZGRlbiBpcyB1c2VkLCBhc3N1bWUgdGhlIGNvZGUgaGFzIGJlZW4gYW5ub3RhdGVkCisgICBjb3JyZXNwb25kaW5nbHkgZm9yIHRoZSBzeW1ib2xzIG5lZWRlZC4gICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiAzKSkKK2ludCBmbm9yZCAoKSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKTsKKyNlbmRpZgorCitpbnQgZm5vcmQgKCkgeyByZXR1cm4gNDI7IH0KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgICAgIGVsc2UgcHV0cyAoZGxlcnJvciAoKSk7CisJfQorICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK31dCitfTFRfRU9GCisgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgJDEgOzsKKyAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgJDIgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSAkMyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICAkMworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKK10pIyBfTFRfVFJZX0RMT1BFTl9TRUxGCisKKworIyBMVF9TWVNfRExPUEVOX1NFTEYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfU1lTX0RMT1BFTl9TRUxGXSwKK1ttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK2lmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAorCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sWworICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICBdKQorICAgIDs7CisKKyAgKikKKyAgICBBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCisJICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCJdLAorICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKKwkgICAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCJdLAorCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAorCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAorCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAorCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCisJCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCisJICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKKwkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSkKKwkgICAgICBdKQorCSAgICBdKQorCSAgXSkKKwldKQorICAgICAgXSkKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKwkgIGx0X2N2X2Rsb3Blbl9zZWxmLCBbZG5sCisJICBfTFRfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8sIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzKQorICAgIF0pCisKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KKyAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNcIgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKwkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQorICAgICAgXSkKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCitfTFRfREVDTChbZGxvcGVuX3N1cHBvcnRdLCBbZW5hYmxlX2Rsb3Blbl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmXSwgWzBdLAorCSBbV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkXSkKK19MVF9ERUNMKFtkbG9wZW5fc2VsZl9zdGF0aWNdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpY10sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitdKSMgTFRfU1lTX0RMT1BFTl9TRUxGCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtMVF9TWVNfRExPUEVOX1NFTEZdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfQ19PKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1jIGFuZCAtbyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyLgorIyBUaGlzIG1hY3JvIGRvZXMgbm90IGhhcmQgY29kZSB0aGUgY29tcGlsZXIgbGlrZSBBQ19QUk9HX0NDX0NfTy4KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfQ19PXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0XSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKV0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9bm8KKyAgICRSTSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAkUk0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICAkUk0gLXIgY29uZnRlc3QKKyAgICRSTSBjb25mdGVzdCoKK10pCitfTFRfVEFHREVDTChbY29tcGlsZXJfY19vXSwgW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgWzFdLAorCVtEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/XSkKK10pIyBfTFRfQ09NUElMRVJfQ19PCisKKworIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKK200X2RlZnVuKFtfTFRfQ09NUElMRVJfRklMRV9MT0NLU10sCitbbTRfcmVxdWlyZShbX0xUX0VOQUJMRV9MT0NLXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorX0xUX0NPTVBJTEVSX0NfTyhbJDFdKQorCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3NdKQorICBoYXJkX2xpbmtzPXllcworICAkUk0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBBQ19NU0dfUkVTVUxUKFskaGFyZF9saW5rc10pCisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW2AkQ0MnIGRvZXMgbm90IHN1cHBvcnQgYC1jIC1vJywgc28gYG1ha2UgLWonIG1heSBiZSB1bnNhZmVdKQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorX0xUX0RFQ0woW10sIFtuZWVkX2xvY2tzXSwgWzFdLCBbTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/XSkKK10pIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUworCisKKyMgX0xUX0NIRUNLX09CSkRJUgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NIRUNLX09CSkRJUl0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBvYmpkaXJdLCBbbHRfY3Zfb2JqZGlyXSwKK1tybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgbHRfY3Zfb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIGx0X2N2X29iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsXSkKK29iamRpcj0kbHRfY3Zfb2JqZGlyCitfTFRfREVDTChbXSwgW29iamRpcl0sIFswXSwKKyAgICAgICAgIFtUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXNdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbTFRfT0JKRElSXSlkbmwKK0FDX0RFRklORV9VTlFVT1RFRChMVF9PQkpESVIsICIkbHRfY3Zfb2JqZGlyLyIsCisgIFtEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLl0pCitdKSMgX0xUX0NIRUNLX09CSkRJUgorCisKKyMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSF0sCitbQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zXSkKK19MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9CitpZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkiIHx8CisgICB0ZXN0IC1uICIkX0xUX1RBR1ZBUihydW5wYXRoX3ZhciwgJDEpIiB8fAorICAgdGVzdCAiWCRfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RlbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpIiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkiICE9IG5vICYmCisgICAgIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKSIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9dW5zdXBwb3J0ZWQKK2ZpCitBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKV0pCisKK2lmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpIiA9IHJlbGluayB8fAorICAgdGVzdCAiJF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpIiA9IHllczsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAorICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcworZmkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYWN0aW9uXSwgWzBdLAorICAgIFtIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZV0pCitdKSMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRICisKKworIyBfTFRfQ01EX1NUUklQTElCCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX1NUUklQTElCXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCitzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlXSkKK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCAkR1JFUCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgorICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKKyAgICAgIG9sZF9zdHJpcGxpYj0iJFNUUklQIC1TIgorICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgZmkKKyAgICA7OworICAqKQorICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW10sIFtvbGRfc3RyaXBsaWJdLCBbMV0sIFtDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzdHJpcGxpYl0sIFsxXSkKK10pIyBfTFRfQ01EX1NUUklQTElCCisKKworIyBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9TWVNfRFlOQU1JQ19MSU5LRVJdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfT0JKRFVNUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKK200X2lmKFskMV0sCisJW10sIFsKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWRfc3RyaXBfZXE9InMsPVwoW1tBLVphLXpdXTpcKSxcMSxnIiA7OworICAgICopIGx0X3NlZF9zdHJpcF9lcT0icyw9LywvLGciIDs7CisgIGVzYWMKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGF3ayAkbHRfYXdrX2FyZyB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgJGx0X3NlZF9zdHJpcF9lcWAKKyAgY2FzZSAkbHRfc2VhcmNoX3BhdGhfc3BlYyBpbgorICAqXDsqKQorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAncy87LyAvZydgCisgICAgOzsKKyAgKikKKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICA7OworICBlc2FjCisgICMgT2ssIG5vdyB3ZSBoYXZlIHRoZSBwYXRoLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCB3ZSBjYW4gc3RlcCB0aHJvdWdoIGl0CisgICMgYW5kIGFkZCBtdWx0aWxpYiBkaXIgaWYgbmVjZXNzYXJ5LgorICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0KKyAgbHRfbXVsdGlfb3NfZGlyPWAkQ0MgJENQUEZMQUdTICRDRkxBR1MgJExERkxBR1MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSAyPi9kZXYvbnVsbGAKKyAgZm9yIGx0X3N5c19wYXRoIGluICRsdF9zZWFyY2hfcGF0aF9zcGVjOyBkbworICAgIGlmIHRlc3QgLWQgIiRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIjsgdGhlbgorICAgICAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciIKKyAgICBlbHNlCisgICAgICB0ZXN0IC1kICIkbHRfc3lzX3BhdGgiICYmIFwKKwlsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aCIKKyAgICBmaQorICBkb25lCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMiIHwgYXdrICcKK0JFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKKyAgbHRfZm9vPSIiOworICBsdF9jb3VudD0wOworICBmb3IgKGx0X2kgPSBORjsgbHRfaSA+IDA7IGx0X2ktLSkgeworICAgIGlmICgkbHRfaSAhPSAiIiAmJiAkbHRfaSAhPSAiLiIpIHsKKyAgICAgIGlmICgkbHRfaSA9PSAiLi4iKSB7CisgICAgICAgIGx0X2NvdW50Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobHRfY291bnQgPT0gMCkgeworICAgICAgICAgIGx0X2Zvbz0iLyIgJGx0X2kgbHRfZm9vOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGx0X2NvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW1tsdF9mb29dXSsrOyB9CisgIGlmIChsdF9mcmVxW1tsdF9mb29dXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQorfSdgCisgICMgQVdLIHByb2dyYW0gYWJvdmUgZXJyb25lb3VzbHkgcHJlcGVuZHMgJy8nIHRvIEM6L2Rvcy9wYXRocworICAjIGZvciB0aGVzZSBob3N0cy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8XAorICAgICAgJFNFRCAncywvXChbW0EtWmEtel1dOlwpLFwxLGcnYCA7OworICBlc2FjCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRsdF9OTDJTUGAKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmldKQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXhbWzQtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LltbMDFdXSB8IGFpeDQuW1swMV1dLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJFJNIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICAgIDs7CisgIGVzYWMKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGNjX2Jhc2VuYW1lIGluCisgIHllcywqKQorICAgICMgZ2NjCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgorICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KKyAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87CisgICAgICBmaScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworbTRfaWYoWyQxXSwgW10sWworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbGliL3czMmFwaSJdKQorICAgICAgOzsKKyAgICBtaW5ndyogfCBjZWdjYyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKworICAqLGNsKikKKyAgICAjIE5hdGl2ZSBNU1ZDCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uZGxsLmxpYicKKworICAgIGNhc2UgJGJ1aWxkX29zIGluCisgICAgbWluZ3cqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPQorICAgICAgbHRfc2F2ZV9pZnM9JElGUworICAgICAgSUZTPSc7JworICAgICAgZm9yIGx0X3BhdGggaW4gJExJQgorICAgICAgZG8KKyAgICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgICAjIExldCBET1MgdmFyaWFibGUgZXhwYW5zaW9uIHByaW50IHRoZSBzaG9ydCA4LjMgc3R5bGUgZmlsZSBuYW1lLgorICAgICAgICBsdF9wYXRoPWBjZCAiJGx0X3BhdGgiIDI+L2Rldi9udWxsICYmIGNtZCAvL0MgImZvciAlaSBpbiAoIi4iKSBkbyBAZWNobyAlfnNpImAKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjICRsdF9wYXRoIgorICAgICAgZG9uZQorICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgIyBDb252ZXJ0IHRvIE1TWVMgc3R5bGUuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IHNlZCAtZSAnc3xcXFxcfC98ZycgLWUgJ3N8IFxcKFtbYS16QS1aXV1cXCk6fCAvXFwxfGcnIC1lICdzfF4gfHwnYAorICAgICAgOzsKKyAgICBjeWd3aW4qKQorICAgICAgIyBDb252ZXJ0IHRvIHVuaXggZm9ybSwgdGhlbiB0byBkb3MgZm9ybSwgdGhlbiBiYWNrIHRvIHVuaXggZm9ybQorICAgICAgIyBidXQgdGhpcyB0aW1lIGRvcyBzdHlsZSAobm8gc3BhY2VzISkgc28gdGhhdCB0aGUgdW5peCBmb3JtIGxvb2tzCisgICAgICAjIGxpa2UgL2N5Z2RyaXZlL2MvUFJPR1JBfjE6L2N5Z2RyLi4uCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJExJQiJgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tZG9zICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiAyPi9kZXYvbnVsbGAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICA7OworICAgICopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRMSUIiCisgICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBbJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsXTsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRILgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgIyBGSVhNRTogZmluZCB0aGUgc2hvcnQgbmFtZSBvciB0aGUgcGF0aCBjb21wb25lbnRzLCBhcyBzcGFjZXMgYXJlCisgICAgICAjIGNvbW1vbi4gKGUuZy4gIlByb2dyYW0gRmlsZXMiIC0+ICJQUk9HUkF+MSIpCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsaW5rLmV4ZScKKyAgICA7OworCisgICopCisgICAgIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisgIGVzYWMKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworbTRfaWYoWyQxXSwgW10sWworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9sb2NhbC9saWIiXSkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFtbMjNdXS4qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMi4qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzAxXV0qIHwgZnJlZWJzZGVsZjMuW1swMV1dKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMi05XV0qIHwgZnJlZWJzZGVsZjMuW1syLTldXSogfCBcCisgIGZyZWVic2Q0LltbMC01XV0gfCBmcmVlYnNkZWxmNC5bWzAtNV1dIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hhaWt1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBydW50aW1lX2xvYWRlciIKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvYm9vdC9ob21lL2NvbmZpZy9saWIgL2Jvb3QvY29tbW9uL2xpYiAvYm9vdC9zeXN0ZW0vbGliJworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LCAuLi4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgICMgb3IgZmFpbHMgb3V0cmlnaHQsIHNvIG92ZXJyaWRlIGF0b21pY2FsbHk6CisgIGluc3RhbGxfb3ZlcnJpZGVfbW9kZT01NTUKKyAgOzsKKworaW50ZXJpeFtbMy05XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisKKyAgIyBTb21lIGJpbnV0aWxzIGxkIGFyZSBwYXRjaGVkIHRvIHNldCBEVF9SVU5QQVRICisgIEFDX0NBQ0hFX1ZBTChbbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoXSwKKyAgICBbbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgICAgc2F2ZV9saWJkaXI9JGxpYmRpcgorICAgIGV2YWwgImxpYmRpcj0vZm9vOyB3bD1cIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKVwiOyBcCisJIExERkxBR1M9XCJcJExERkxBR1MgJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpXCIiCisgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAorICAgICAgW0FTX0lGKFsgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsXSwKKwkgW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXNdKV0pCisgICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgICAgbGliZGlyPSRzYXZlX2xpYmRpcgorICAgIF0pCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcWyRdMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXFskXTA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87L15bCSBdKmh3Y2FwWwkgXS9kO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nO3MvIi8vZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKworbmV0YnNkZWxmKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIHZlcnNpb25fdHlwZT1xbngKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J2xkcW54LnNvJworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopCW5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKQkJCQluZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIG9wZW5ic2QyLltbODldXSB8IG9wZW5ic2QyLltbODldXS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworcmRvcyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordHBmKikKKyAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKK19MVF9ERUNMKFtdLCBbdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmtdLCBbMV0sCisgICAgW1ZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorICAgIHJlc3RvcmVkIGF0IGxpbmsgdGltZV0pCitfTFRfREVDTChbXSwgW25lZWRfbGliX3ByZWZpeF0sIFswXSwKKyAgICBbRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzP10pCitfTFRfREVDTChbXSwgW25lZWRfdmVyc2lvbl0sIFswXSwgW0RvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/XSkKK19MVF9ERUNMKFtdLCBbdmVyc2lvbl90eXBlXSwgWzBdLCBbTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGVdKQorX0xUX0RFQ0woW10sIFtydW5wYXRoX3Zhcl0sIFswXSwgIFtTaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGVdKQorX0xUX0RFQ0woW10sIFtzaGxpYnBhdGhfdmFyXSwgWzBdLFtTaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoXSwgWzBdLAorICAgIFtJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/XSkKK19MVF9ERUNMKFtdLCBbbGlibmFtZV9zcGVjXSwgWzFdLCBbRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXhdKQorX0xUX0RFQ0woW10sIFtsaWJyYXJ5X25hbWVzX3NwZWNdLCBbMV0sCisgICAgW1tMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorICAgIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUVdXSkKK19MVF9ERUNMKFtdLCBbc29uYW1lX3NwZWNdLCBbMV0sCisgICAgW1tUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZV1dKQorX0xUX0RFQ0woW10sIFtpbnN0YWxsX292ZXJyaWRlX21vZGVdLCBbMV0sCisgICAgW1Blcm1pc3Npb24gbW9kZSBvdmVycmlkZSBmb3IgaW5zdGFsbGF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtwb3N0aW5zdGFsbF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kIHRvIHVzZSBhZnRlciBpbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW3Bvc3R1bmluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW2ZpbmlzaF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnldKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfZXZhbF0sIFsxXSwKKyAgICBbW0FzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorICAgIG5vdCBzaG93bl1dKQorX0xUX0RFQ0woW10sIFtoYXJkY29kZV9pbnRvX2xpYnNdLCBbMF0sCisgICAgW1doZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNdLCBbMl0sCisgICAgW0NvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitdKSMgX0xUX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX1BBVEhfVE9PTF9QUkVGSVgoVE9PTCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbX0xUX1BBVEhfVE9PTF9QUkVGSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KK1tbXFwvKl0gfCAgPzpbXFwvXSpdKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitkbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KK2RubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKK2RubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCisgIGFjX2R1bW15PSJtNF9pZihbJDJdLCAsICRQQVRILCBbJDJdKSIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJDE7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyQxIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworX0xUX0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWNdKQorTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRNQUdJQ19DTUQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorX0xUX0RFQ0woW10sIFtNQUdJQ19DTURdLCBbMF0sCisJIFtVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiXSlkbmwKK10pIyBfTFRfUEFUSF9UT09MX1BSRUZJWAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX1BBVEhfVE9PTF9QUkVGSVhdLCBbX0xUX1BBVEhfVE9PTF9QUkVGSVhdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW10pCisKKworIyBfTFRfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pemUgYSBzaGFyZWQgbGlicmFyeQorbTRfZGVmdW4oW19MVF9QQVRIX01BR0lDXSwKK1tfTFRfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCitpZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBfTFRfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQorICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCitdKSMgX0xUX1BBVEhfTUFHSUMKKworCisjIExUX1BBVEhfTEQKKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCitBQ19ERUZVTihbTFRfUEFUSF9MRF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSlkbmwKKworQUNfQVJHX1dJVEgoW2dudS1sZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251LWxkXSwKKwlbYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKKyAgICBbdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzXSwKKyAgICBbd2l0aF9nbnVfbGQ9bm9dKWRubAorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSAkQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKKyAgICAgIHJlX2RpcmVsdD0nL1tbXi9dXVtbXi9dXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitfTFRfUEFUSF9MRF9HTlUKK0FDX1NVQlNUKFtMRF0pCisKK19MVF9UQUdERUNMKFtdLCBbTERdLCBbMV0sIFtUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzXSkKK10pIyBMVF9QQVRIX0xECisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitBVV9BTElBUyhbQUNfUFJPR19MRF0sIFtMVF9QQVRIX0xEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xEXSwgW10pCisKKworIyBfTFRfUEFUSF9MRF9HTlUKKyMtIC0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BBVEhfTERfR05VXSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCitdKSMgX0xUX1BBVEhfTERfR05VCisKKworIyBfTFRfQ01EX1JFTE9BRAorIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIHJlbG9hZCBmbGFnIGZvciBsaW5rZXIKKyMgICAtLSBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgorbTRfZGVmdW4oW19MVF9DTURfUkVMT0FEXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9ZmFsc2UKKyAgICBmaQorICAgIDs7CisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworX0xUX1RBR0RFQ0woW10sIFtyZWxvYWRfZmxhZ10sIFsxXSwgW0hvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXNdKWRubAorX0xUX1RBR0RFQ0woW10sIFtyZWxvYWRfY21kc10sIFsyXSlkbmwKK10pIyBfTFRfQ01EX1JFTE9BRAorCisKKyMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSkKK0FDX0NBQ0hFX0NIRUNLKFtob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXNdLAorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QsCitbbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4W1s0LTldXSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpW1s0NV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLAorICAjIHVubGVzcyB3ZSBmaW5kICdmaWxlJywgZm9yIGV4YW1wbGUgYmVjYXVzZSB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLgorICAjIGZ1bmNfd2luMzJfbGliaWQgYXNzdW1lcyBCU0Qgbm0sIHNvIGRpc2FsbG93IGl0IGlmIHVzaW5nIE1TIGR1bXBiaW4uCisgIGlmICggdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiQlNEIG5tIiAmJiBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICBlbHNlCisgICAgIyBLZWVwIHRoaXMgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBmdW5jX3dpbjMyX2xpYmlkLgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIGZpCisgIDs7CisKK2NlZ2NjKikKKyAgIyB1c2UgdGhlIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4gU2VlIG1pbmd3Ki4KKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGUtYXJtLS4qbGl0dGxlKC4qYXJjaGl0ZWN0dXJlOiBhcm0pPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaSo4NiApCisgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgorICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KKyAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JworICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICBmaQorICA7OworCitnbnUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitoYWlrdSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEZbIC1dWzAtOV1bMC05XSkoLWJpdCk/KCBbTE1dU0IpPyBzaGFyZWQgb2JqZWN0KCBmaWxlKT9bLCAtXSogUEEtUklTQyBbMC05XVwuWzAtOV0nXQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAorICAgIDs7CisgICopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV1cLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXhbWzMtOV1dKikKKyAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK25ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298X3BpY1wuYSkkJworICBmaQorICA7OworCituZXdvczYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK29wZW5ic2QqKQorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCityZG9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVtbMC05XV1bWzAtOV1dKiBWZXJzaW9uIFtbMC05XV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCit0cGYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworXSkKKworZmlsZV9tYWdpY19nbG9iPQord2FudF9ub2Nhc2VnbG9iPW5vCitpZiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGlmICggc2hvcHQgfCBncmVwIG5vY2FzZWdsb2IgKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHdhbnRfbm9jYXNlZ2xvYj15ZXMKKyAgICBlbHNlCisgICAgICBmaWxlX21hZ2ljX2dsb2I9YGVjaG8gYUFiQmNDZERlRWZGZ0doSGlJakprS2xMbU1uTm9PcFBxUXJSc1N0VHVVdlZ3V3hYeVl6WiB8ICRTRUQgLWUgInMvXCguLlwpL3NcL1tbXDFdXVwvW1tcMV1dXC9nOy9nImAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK2ZpCisKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworX0xUX0RFQ0woW10sIFtkZXBsaWJzX2NoZWNrX21ldGhvZF0sIFsxXSwKKyAgICBbTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHNdKQorX0xUX0RFQ0woW10sIFtmaWxlX21hZ2ljX2NtZF0sIFsxXSwKKyAgICBbQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIl0pCitfTFRfREVDTChbXSwgW2ZpbGVfbWFnaWNfZ2xvYl0sIFsxXSwKKyAgICBbSG93IHRvIGZpbmQgcG90ZW50aWFsIGZpbGVzIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorX0xUX0RFQ0woW10sIFt3YW50X25vY2FzZWdsb2JdLCBbMV0sCisgICAgW0ZpbmQgcG90ZW50aWFsIGZpbGVzIHVzaW5nIG5vY2FzZWdsb2Igd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIl0pCitdKSMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAorCisKKyMgTFRfUEFUSF9OTQorIyAtLS0tLS0tLS0tCisjIGZpbmQgdGhlIHBhdGhuYW1lIHRvIGEgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCitBQ19ERUZVTihbTFRfUEFUSF9OTV0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlciAobm0pXSwgbHRfY3ZfcGF0aF9OTSwKK1tpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuCisgICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKKyAgZmkKKyAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCisgICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisJIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKwkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisJIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisJY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQorCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwkgIGJyZWFrCisJICA7OworCSopCisJICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkgICovZGV2L251bGwqKQorCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgorCSAgICBicmVhaworCSAgICA7OworCSAgKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIGRvbmUKKyAgOiAke2x0X2N2X3BhdGhfTk09bm99CitmaV0pCitpZiB0ZXN0ICIkbHRfY3ZfcGF0aF9OTSIgIT0gIm5vIjsgdGhlbgorICBOTT0iJGx0X2N2X3BhdGhfTk0iCitlbHNlCisgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgorICBpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4gOgorICAgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBlbHNlCisgICAgQUNfQ0hFQ0tfVE9PTFMoRFVNUEJJTiwgW2R1bXBiaW4gImxpbmsgLWR1bXAiXSwgOikKKyAgICBjYXNlIGAkRFVNUEJJTiAtc3ltYm9scyAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorICAgICpDT0ZGKikKKyAgICAgIERVTVBCSU49IiREVU1QQklOIC1zeW1ib2xzIgorICAgICAgOzsKKyAgICAqKQorICAgICAgRFVNUEJJTj06CisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgQUNfU1VCU1QoW0RVTVBCSU5dKQorICBpZiB0ZXN0ICIkRFVNUEJJTiIgIT0gIjoiOyB0aGVuCisgICAgTk09IiREVU1QQklOIgorICBmaQorZmkKK3Rlc3QgLXogIiROTSIgJiYgTk09bm0KK0FDX1NVQlNUKFtOTV0pCitfTFRfREVDTChbXSwgW05NXSwgWzFdLCBbQSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXJdKWRubAorCitBQ19DQUNIRV9DSEVDSyhbdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZV0sIFtsdF9jdl9ubV9pbnRlcmZhY2VdLAorICBbbHRfY3Zfbm1faW50ZXJmYWNlPSJCU0Qgbm0iCisgIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuJGFjX2V4dAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGFjX2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgIiRhY19jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkTk0gXFxcImNvbmZ0ZXN0LiRhY19vYmpleHRcXFwiXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkTk0gXCJjb25mdGVzdC4kYWNfb2JqZXh0XCIiIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0KQorICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86IG91dHB1dFwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICBjYXQgY29uZnRlc3Qub3V0ID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgaWYgJEdSRVAgJ0V4dGVybmFsLipzb21lX3ZhcmlhYmxlJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9ubV9pbnRlcmZhY2U9Ik1TIGR1bXBiaW4iCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0Kl0pCitdKSMgTFRfUEFUSF9OTQorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBTV9QUk9HX05NXSwgW0xUX1BBVEhfTk1dKQorQVVfQUxJQVMoW0FDX1BST0dfTk1dLCBbTFRfUEFUSF9OTV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX1BST0dfTk1dLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfUFJPR19OTV0sIFtdKQorCisjIF9MVF9DSEVDS19TSEFSRURMSUJfRlJPTV9MSU5LTElCCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGhvdyB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CisjIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGxpbmsgbGlicmFyeS4KKyMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQl0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorbTRfcmVxdWlyZShbX0xUX0RFQ0xfT0JKRFVNUF0pCittNF9yZXF1aXJlKFtfTFRfREVDTF9ETExUT09MXSkKK0FDX0NBQ0hFX0NIRUNLKFtob3cgdG8gYXNzb2NpYXRlIHJ1bnRpbWUgYW5kIGxpbmsgbGlicmFyaWVzXSwKK2x0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kLAorW2x0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSd1bmtub3duJworCitjYXNlICRob3N0X29zIGluCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICMgdHdvIGRpZmZlcmVudCBzaGVsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgIyBkZWNpZGUgd2hpY2ggdG8gdXNlIGJhc2VkIG9uIGNhcGFiaWxpdGllcyBvZiAkRExMVE9PTAorICBjYXNlIGAkRExMVE9PTCAtLWhlbHAgMj4mMWAgaW4KKyAgKi0taWRlbnRpZnktc3RyaWN0KikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIKKyAgICA7OworICAqKQorICAgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPWZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFjaworICAgIDs7CisgIGVzYWMKKyAgOzsKKyopCisgICMgZmFsbGJhY2s6IGFzc3VtZSBsaW5rbGliIElTIHNoYXJlZGxpYgorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0iJEVDSE8iCisgIDs7Citlc2FjCitdKQorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCit0ZXN0IC16ICIkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiICYmIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRFQ0hPCisKK19MVF9ERUNMKFtdLCBbc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWRdLCBbMV0sCisgICAgW0NvbW1hbmQgdG8gYXNzb2NpYXRlIHNoYXJlZCBhbmQgbGluayBsaWJyYXJpZXNdKQorXSkjIF9MVF9DSEVDS19TSEFSRURMSUJfRlJPTV9MSU5LTElCCisKKworIyBfTFRfUEFUSF9NQU5JRkVTVF9UT09MCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbG9jYXRlIHRoZSBtYW5pZmVzdCB0b29sCittNF9kZWZ1bihbX0xUX1BBVEhfTUFOSUZFU1RfVE9PTF0sCitbQUNfQ0hFQ0tfVE9PTChNQU5JRkVTVF9UT09MLCBtdCwgOikKK3Rlc3QgLXogIiRNQU5JRkVTVF9UT09MIiAmJiBNQU5JRkVTVF9UT09MPW10CitBQ19DQUNIRV9DSEVDSyhbaWYgJE1BTklGRVNUX1RPT0wgaXMgYSBtYW5pZmVzdCB0b29sXSwgW2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbF0sCisgIFtsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9bm8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86ICRNQU5JRkVTVF9UT09MICctPyciID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgJE1BTklGRVNUX1RPT0wgJy0/JyAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dAorICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgaWYgJEdSRVAgJ01hbmlmZXN0IFRvb2wnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD15ZXMKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqXSkKK2lmIHRlc3QgIngkbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sIiAhPSB4eWVzOyB0aGVuCisgIE1BTklGRVNUX1RPT0w9OgorZmkKK19MVF9ERUNMKFtdLCBbTUFOSUZFU1RfVE9PTF0sIFsxXSwgW01hbmlmZXN0IHRvb2xdKWRubAorXSkjIF9MVF9QQVRIX01BTklGRVNUX1RPT0wKKworCisjIExUX0xJQl9NCisjIC0tLS0tLS0tCisjIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKK0FDX0RFRlVOKFtMVF9MSUJfTV0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorTElCTT0KK2Nhc2UgJGhvc3QgaW4KKyotKi1iZW9zKiB8ICotKi1jZWdjYyogfCAqLSotY3lnd2luKiB8ICotKi1oYWlrdSogfCAqLSotcHczMiogfCAqLSotZGFyd2luKikKKyAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtLCBvciBkb24ndCBuZWVkIGl0CisgIDs7CisqLW5jci1zeXN2NC4zKikKKyAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09IiRMSUJNIC1sbSIpCisgIDs7CisqKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSItbG0iKQorICA7OworZXNhYworQUNfU1VCU1QoW0xJQk1dKQorXSkjIExUX0xJQl9NCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfQ0hFQ0tfTElCTV0sIFtMVF9MSUJfTV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0NIRUNLX0xJQk1dLCBbXSkKKworCisjIF9MVF9DT01QSUxFUl9OT19SVFRJKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9OT19SVFRJXSwKK1ttNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBudmNjKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtWGNvbXBpbGVyIC1mbm8tYnVpbHRpbicgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nIDs7CisgIGVzYWMKKworICBfTFRfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMsCisgICAgWy1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPSIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiXSkKK2ZpCitfTFRfVEFHREVDTChbbm9fYnVpbHRpbl9mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgWzFdLAorCVtDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zXSkKK10pIyBfTFRfQ09NUElMRVJfTk9fUlRUSQorCisKKyMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgorQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0XSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sCitbCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tbQkNERUdSU1RdXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW1tfQS1aYS16XV1bW19BLVphLXowLTldXSpcKScKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tbQkNEVF1dJworICA7OworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVNUV11dJworICA7OworaHB1eCopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgc3ltY29kZT0nW1tBQkNERUdSU1RdXScKKyAgZmkKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW1tCQ0RFR1FSU1RdXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbW0JEUlRdXScKKyAgOzsKK3NjbzMuMnY1KikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tbQUJEVF1dJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tbREZOU1RVXV0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW1tBQkNER0lSU1RXXV0nIDs7Citlc2FjCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24uCisjIFNvbWUgc3lzdGVtcyAoZXNwLiBvbiBpYTY0KSBsaW5rIGRhdGEgYW5kIGNvZGUgc3ltYm9scyBkaWZmZXJlbnRseSwKKyMgc28gdXNlIHRoaXMgZ2VuZXJhbCBhcHByb2FjaC4KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKVtbIF1dKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpW1sgXV0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKGxpYltbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJsaWJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkYnVpbGRfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWAkRUNITyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAorICA7OworZXNhYworCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyc2NvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICAjIFRyYW5zZm9ybSBzeW1jb2RlLCBzeW1wYXQsIGFuZCBzeW1wcmZ4IGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgorICBzeW14ZnJtPSJcXDEgJGFjX3N5bXByZnhcXDIgXFwyIgorCisgICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KKyAgaWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgICAjIEZha2UgaXQgZm9yIGR1bXBiaW4gYW5kIHNheSBUIGZvciBhbnkgbm9uLXN0YXRpYyBmdW5jdGlvbgorICAgICMgYW5kIEQgZm9yIGFueSBnbG9iYWwgdmFyaWFibGUuCisgICAgIyBBbHNvIGZpbmQgQysrIGFuZCBfX2Zhc3RjYWxsIHN5bWJvbHMgZnJvbSBNU1ZDKyssCisgICAgIyB3aGljaCBzdGFydCB3aXRoIEAgb3IgPy4KKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkQVdLIFsnIlwKKyIgICAgIHtsYXN0X3NlY3Rpb249c2VjdGlvbjsgc2VjdGlvbj1cJCAzfTsiXAorIiAgICAgL15DT0ZGIFNZTUJPTCBUQUJMRS97Zm9yKGkgaW4gaGlkZSkgZGVsZXRlIGhpZGVbaV19OyJcCisiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKKyIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCisiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCisiICAgICB7aWYoaGlkZVtzZWN0aW9uXSkgbmV4dH07IlwKKyIgICAgIHtmPTB9OyBcJCAwfi9cKFwpLipcfC97Zj0xfTsge3ByaW50ZiBmID8gXCJUIFwiIDogXCJEIFwifTsiXAorIiAgICAge3NwbGl0KFwkIDAsIGEsIC9cfHxcci8pOyBzcGxpdChhWzJdLCBzKX07IlwKKyIgICAgIHNbMV1+L15bQD9dL3twcmludCBzWzFdLCBzWzFdOyBuZXh0fTsiXAorIiAgICAgc1sxXX5wcmZ4IHtzcGxpdChzWzFdLHQsXCJAXCIpOyBwcmludCB0WzFdLCBzdWJzdHIodFsxXSxsZW5ndGgocHJmeCkpfSJcCisiICAgICAnIHByZng9XiRhY19zeW1wcmZ4XSIKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWwkgXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWwkgXV1bWwkgXV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisgIGZpCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICcvIF9fZ251X2x0by9kJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitfTFRfRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3QpICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgJEdSRVAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiAkR1JFUCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PF9MVF9FT0YgPiBjb25mdGVzdC4kYWNfZXh0CisvKiBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIGJldHdlZW4gbGlidG9vbC5tNCwgbHRtYWluLCBsdF9zeXN0ZW0uaCwgYW5kIHRlc3RzLiAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlIHJ1bnRpbWUKKyAgIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbiBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8KKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVAorI2VsaWYgZGVmaW5lZChfX29zZl9fKQorLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YS4gICovCisjIGRlZmluZSBMVEAmdEBfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVEAmdEBfRExTWU1fQ09OU1QgY29uc3QKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19MVF9FT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCisKKwkgIGNhdCA8PF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCitMVEAmdEBfRExTWU1fQ09OU1Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAgICAgICAqYWRkcmVzczsKK30KK2x0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHNbW11dID0KK3sKKyAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAorX0xUX0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorX0xUX0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfZ2xvYnN5bV9zYXZlX0xJQlM9JExJQlMKKwkgIGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1M9JENGTEFHUworCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0kbHRfZ2xvYnN5bV9zYXZlX0xJQlMKKwkgIENGTEFHUz0kbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUworCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoZmFpbGVkKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG9rKQorZmkKKworIyBSZXNwb25zZSBmaWxlIHN1cHBvcnQuCitpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2VsaWYgJE5NIC0taGVscCAyPi9kZXYvbnVsbCB8IGdyZXAgJ1tbQF1dRklMRScgPi9kZXYvbnVsbDsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2ZpCisKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3BpcGVdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sIFsxXSwKKyAgICBbVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lc10pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXJdKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkXSkKK19MVF9ERUNMKFtdLCBbbm1fZmlsZV9saXN0X3NwZWNdLCBbMV0sCisgICAgW1NwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcyBmb3IgJE5NXSkKK10pICMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUworCisKKyMgX0xUX0NPTVBJTEVSX1BJQyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9QSUNdLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisKK200X2lmKFskMV0sIFtDWFhdLCBbCisgICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY3lnd2luKiB8IG9zMiogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisgICAgKmRqZ3BwKikKKyAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgICAgOzsKKyAgICBoYWlrdSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCisgICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisgICAgICA7OworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciA2NC1iaXQgUEEgSFAtVVgsIGJ1dCBub3QgZm9yIDMyLWJpdAorICAgICAgIyBQQSBIUC1VWC4gIE9uIElBNjQgSFAtVVgsIFBJQyBpcyB0aGUgZGVmYXVsdCBidXQgdGhlIHBpYyBmbGFnCisgICAgICAjIHNldHMgdGhlIGRlZmF1bHQgVExTIG1vZGVsIGFuZCBhZmZlY3RzIGlubGluaW5nLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqKQorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKnFueCogfCAqbnRvKikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXhbWzQtOV1dKikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCWVsc2UKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCisJICA7OworCWVzYWMKKwk7OworICAgICAgbWluZ3cqIHwgY3lnd2luKiB8IG9zMiogfCBwdzMyKiB8IGNlZ2NjKikKKwkjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisJIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKwltNF9pZihbJDFdLCBbR0NKXSwgW10sCisJICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKwk7OworICAgICAgZGd1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGVjKysqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICA7OworCSAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBocHBhKjY0KnxpYTY0KikKKwkgICAgICAjICtaIHRoZSBkZWZhdWx0CisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBpbnRlcml4KikKKwkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKKwkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/CisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICA7OworCSAgZWNwYyogKQorCSAgICAjIG9sZCBJbnRlbCBDKysgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBpY3BjKiApCisJICAgICMgSW50ZWwgQysrLCB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKwkgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBwZ0NDKiB8IHBnY3BwKikKKwkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgIHhsYyogfCB4bEMqIHwgYmd4bFtbY0NdXSogfCBtcGl4bFtbY0NdXSopCisJICAgICMgSUJNIFhMIDguMCwgOS4wIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworCTs7CisgICAgZXNhYworICBmaQorXSwKK1sKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBoYWlrdSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCisgICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1YbGlua2VyICcKKyAgICAgIGlmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iLVhjb21waWxlciAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIgorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisgICAgICBlY2MqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBpY2MgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisgICAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KKyAgICAgIGljYyogfCBpZm9ydCopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIExhaGV5IEZvcnRyYW4gOC4xLgorICAgICAgbGY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctLXNoYXJlZCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy0tc3RhdGljJworCTs7CisgICAgICBuYWdmb3IqKQorCSMgTkFHIEZvcnRyYW4gY29tcGlsZXIKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLC1XbCwsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCTs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCTs7CisgICAgICAqKQorCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIENlcmVzXCBGb3J0cmFuKiB8ICpTdW4qRm9ydHJhbipcIFtbMS03XV0uKiB8ICpTdW4qRm9ydHJhbipcIDguW1swLTNdXSopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPScnCisJICA7OworCSpTdW5cIEYqIHwgKlN1bipGb3J0cmFuKikKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgIDs7CisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgIDs7CisgICAgICAgICpJbnRlbCpcIFtbQ0ZdXSpDb21waWxlciopCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICA7OworCSpQb3J0bGFuZFwgR3JvdXAqKQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KiB8IHN1bmY3NyogfCBzdW5mOTAqIHwgc3VuZjk1KikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICA7OworICAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pIgorICAgIDs7Citlc2FjCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSldKQorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSRfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgd29ya3NdLAorICAgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSldLAorICAgIFskX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKKyAgICBbY2FzZSAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKKyAgICAgZXNhY10sCisgICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCitmaQorX0xUX1RBR0RFQ0woW3BpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgWzFdLAorCVtBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHNdKQorCitfTFRfVEFHREVDTChbd2xdLCBbbHRfcHJvZ19jb21waWxlcl93bF0sIFsxXSwKKwlbSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlcl0pCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpXCIKK19MVF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sCisgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsICQxKSwKKyAgJGx0X3RtcF9zdGF0aWNfZmxhZywKKyAgW10sCisgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9XSkKK19MVF9UQUdERUNMKFtsaW5rX3N0YXRpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgWzFdLAorCVtDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nXSkKK10pIyBfTFRfQ09NUElMRVJfUElDCisKKworIyBfTFRfTElOS0VSX1NITElCUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX1NITElCU10sCitbQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK200X3JlcXVpcmUoW19MVF9QQVRIX01BTklGRVNUX1RPT0xdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK200X2lmKFskMV0sIFtDWFhdLCBbCisgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQorICBjYXNlICRob3N0X29zIGluCisgIGFpeFtbNC05XV0qKQorICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKyAgICAjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwgZGVmaW5lZAorICAgICMgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisgICAgaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGZpCisgICAgOzsKKyAgcHczMiopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9IiRsdGRsbF9jbWRzIgorICAgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBjbCopCisgICAgICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisgICAgICA7OworICAgICopCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLztzL14uKltbIF1dX19ubV9fXChbW14gXV0qXClbWyBdXVtbXiBdXSovXDEgREFUQS87L15JW1sgXV0vZDsvXltbQUlUV11dW1sgXV0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydbX10rR0xPQkFMX09GRlNFVF9UQUJMRV98W19dK0dMT0JBTF9fW0ZJRF1fLip8W19dK2hlYWRfW0EtWmEtejAtOV9dK19kbGx8W0EtWmEtejAtOV9dK19kbGxfaW5hbWUnXQorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbGludXgqIHwgaypic2QqLWdudSB8IGdudSopCisgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9bm8KKyAgICA7OworICAqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgOzsKKyAgZXNhYworXSwgWworICBydW5wYXRoX3Zhcj0KKyAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBfTFRfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgIyBFeGNsdWRlIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBzeW1ib2xzLgorZG5sIE5vdGUgYWxzbyBhZGp1c3QgZXhjbHVkZV9leHBzeW1zIGZvciBDKysgYWJvdmUuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisKKyAgIyBPbiBzb21lIHRhcmdldHMsIEdOVSBsZCBpcyBjb21wYXRpYmxlIGVub3VnaCB3aXRoIHRoZSBuYXRpdmUgbGlua2VyCisgICMgdGhhdCB3ZSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBuYXRpdmUgaW50ZXJmYWNlIGZvciBib3RoLgorICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT1ubworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKwkjIFRoZSBBSVggcG9ydCBvZiBHTlUgbGQgaGFzIGFsd2F5cyBhc3BpcmVkIHRvIGNvbXBhdGliaWxpdHkKKwkjIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIuICBIb3dldmVyLCBhcyB0aGUgd2FybmluZyBpbiB0aGUgR05VIGxkCisJIyBibG9jayBzYXlzLCB2ZXJzaW9ucyBiZWZvcmUgMi4xOS41KiBjb3VsZG4ndCByZWFsbHkgY3JlYXRlIHdvcmtpbmcKKwkjIHNoYXJlZCBsaWJyYXJpZXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGludGVyZmFjZSB1c2VkLgorCWNhc2UgYCRMRCAtdiAyPiYxYCBpbgorCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuMTkuNSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi5bWzItOV1dKikgOzsKKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCBbWzMtOV1dKikgOzsKKwkgICopCisJICAgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwk7OworICAgIGVzYWMKKyAgZmkKKworICBpZiB0ZXN0ICIkbHRfdXNlX2dudV9sZF9pbnRlcmZhY2UiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICpHTlVcIGdvbGQqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeFtbMy05XV0qKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi4xOSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIGJpbnV0aWxzCisqKiogMi4yMCBvciBhYm92ZSwgb3IgbW9kaWZ5IHlvdXIgUEFUSCBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQuCisqKiogWW91IHdpbGwgdGhlbiBuZWVkIHRvIHJlc3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4KKworX0xUX0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvO3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZSddCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaGFpa3UqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICB0bXBfZGlldD1ubworICAgICAgaWYgdGVzdCAiJGhvc3Rfb3MiID0gbGludXgtZGlldGxpYmM7IHRoZW4KKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZGlldFwgKikgdG1wX2RpZXQ9eWVzOzsJIyBsaW51eC1kaWV0bGliYyB3aXRoIHN0YXRpYyBsaW5raW5nICghZGlldC1keW4pCisJZXNhYworICAgICAgZmkKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRFR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsIFwKKwkgJiYgdGVzdCAiJHRtcF9kaWV0IiA9IG5vCisgICAgICB0aGVuCisJdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnCisJY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCisgICAgICAgIHBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKKwkJCQkJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKKwllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWxmOTUqKQkJCQkjIExhaGV5IEZvcnRyYW4gOC4xCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisJICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7CisJeGxbW2NDXV0qIHwgYmd4bFtbY0NdXSogfCBtcGl4bFtbY0NdXSopICMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKKwkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJworCSAgdG1wX2FkZGZsYWc9IDs7CisJbnZjYyopCSMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJZXNhYworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKyAgICAgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgICBmaQorCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwl4bGYqIHwgYmdmKiB8IGJneGxmKiB8IG1waXhsZiopCisJICAjIElCTSBYTCBGb3J0cmFuIDEwLjEgb24gUFBDIGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnMgaXRzZWxmCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAtLW5vLXdob2xlLWFyY2hpdmUnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLW8gJGxpYicKKwkgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgICRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgIGZpCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCAkR1JFUCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjFbWzAtNV1dLiopCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cworCSAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKKwkgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisJICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICBmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm87IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgIGZpCisgIGVsc2UKKyAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqKQorICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYWl4W1s0LTldXSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCSMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbAorCSMgZGVmaW5lZCBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KKwlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikgfHwgKFwkIDIgPT0gIlciKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZWxzZQorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzIzXV18YWl4NC5bWzIzXV0uKnxhaXhbWzUtOV1dKikKKwkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKwkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgYnJlYWsKKwkgIGZpCisJICBkb25lCisJICA7OworCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9JyR7d2x9LWYsJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQorCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8ICRHUkVQIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCSAgdGhlbgorCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICA6CisJICBlbHNlCisJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKwkgIGZpCisJICA7OworCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCWZpCisJX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9bm8KKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisgICAgICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgoWyQxXSkKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgoWyQxXSkKKwkgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGVsc2UKKwkgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgZmkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBic2RpW1s0NV1dKikKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGNsKikKKwkjIE5hdGl2ZSBNU1ZDCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyAnCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9J0AnCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwlsaWJleHQ9bGliCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJc2hyZXh0X2NtZHM9Ii5kbGwiCisJIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgICBzZWQgLW4gLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyAtZSAnMVxcXCFwJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgZWxzZQorCSAgICBzZWQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgZml+CisJICAkQ0MgLW8gJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzICJAJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUuZXhwIiAtV2wsLURMTCwtSU1QTElCOiIkdG9vbF9vdXRwdXRfb2JqZGlyJGxpYm5hbWUuZGxsLmxpYiJ+CisJICBsaW5rbmFtZXM9JworCSMgVGhlIGxpbmtlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgc3RhdGljIGxpYiBpZiB3ZSBidWlsZCBhIERMTC4KKwkjIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworCV9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCV9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9J19OVUxMX0lNUE9SVF9ERVNDUklQVE9SfF9JTVBPUlRfREVTQ1JJUFRPUl8uKicKKwlfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSxEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dW1sgXV0vcy8uKltbIF1dLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisJIyBEb24ndCB1c2UgcmFubGliCisJX0xUX1RBR1ZBUihvbGRfcG9zdGluc3RhbGxfY21kcywgJDEpPSdjaG1vZCA2NDQgJG9sZGxpYicKKwlfTFRfVEFHVkFSKHBvc3RsaW5rX2NtZHMsICQxKT0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgIGNhc2UgJGx0X291dHB1dGZpbGUgaW4KKwkgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICopCisJICAgICAgbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCSAgICAgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iJGx0X3Rvb2xfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgOzsKKwkgIGVzYWN+CisJICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAkUk0gIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsKKwkgIGZpJworCTs7CisgICAgICAqKQorCSMgQXNzdW1lIE1TVkMgd3JhcHBlcgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGZ1bmNfZWNob19hbGwgIiRkZXBsaWJzIiB8ICRTRUQgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorCV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworCSMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisJX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKwlfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIuKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJbTRfaWYoJDEsIFtdLCBbCisJICAjIE9sZGVyIHZlcnNpb25zIG9mIHRoZSAxMS4wMCBjb21waWxlciBkbyBub3QgdW5kZXJzdGFuZCAtYiB5ZXQKKwkgICMgKEhQOTI0NTMtMDEgQS4xMS4wMS4yMCBkb2Vzbid0LCBIUDkyNDUzLTAxIEIuMTEuWC4zNTE3NS0zNTE3Ni5HUCBkb2VzKQorCSAgX0xUX0xJTktFUl9PUFRJT04oW2lmICRDQyB1bmRlcnN0YW5kcyAtYl0sCisJICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9fYiwgJDEpLCBbLWJdLAorCSAgICBbX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnXSwKKwkgICAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnXSldLAorCSAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJ10pCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkjIFRyeSB0byB1c2UgdGhlIC1leHBvcnRlZF9zeW1ib2wgbGQgb3B0aW9uLCBpZiBpdCBkb2VzIG5vdAorCSMgd29yaywgYXNzdW1lIHRoYXQgLWV4cG9ydHNfZmlsZSBkb2VzIG5vdCB3b3JrIGVpdGhlciBhbmQKKwkjIGltcGxpY2l0bHkgZXhwb3J0IGFsbCBzeW1ib2xzLgorCSMgVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBsYW5ndWFnZXMsIHNvIG5vIHBlci10YWcgY2FjaGUgdmFyaWFibGUuCisJQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlICRob3N0X29zIGxpbmtlciBhY2NlcHRzIC1leHBvcnRlZF9zeW1ib2xdLAorCSAgW2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sXSwKKwkgIFtzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorCSAgIExERkxBR1M9IiRMREZMQUdTIC1zaGFyZWQgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sICR7d2x9Zm9vICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfS9kZXYvbnVsbCIKKwkgICBBQ19MSU5LX0lGRUxTRSgKKwkgICAgIFtBQ19MQU5HX1NPVVJDRSgKKwkgICAgICAgIFtBQ19MQU5HX0NBU0UoW0NdLCBbW2ludCBmb28gKHZvaWQpIHsgcmV0dXJuIDA7IH1dXSwKKwkJCSAgICAgIFtDKytdLCBbW2ludCBmb28gKHZvaWQpIHsgcmV0dXJuIDA7IH1dXSwKKwkJCSAgICAgIFtGb3J0cmFuIDc3XSwgW1sKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBlbmRdXSwKKwkJCSAgICAgIFtGb3J0cmFuXSwgW1sKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBlbmRdXSldKV0sCisJICAgICAgW2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPXllc10sCisJICAgICAgW2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPW5vXSkKKyAgICAgICAgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyJdKQorCWlmIHRlc3QgIiRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAke3dsfS1leHBvcnRzX2ZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLWV4cG9ydHNfZmlsZSAkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCWlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJZWxzZQorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgIG9wZW5ic2RbWzAxXV0uKiB8IG9wZW5ic2QyLltbMC03XV0gfCBvcGVuYnNkMi5bWzAtN11dLiopCisJICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgIDs7CisJICAgKikKKwkgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICAgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgb3MyKikKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJEVDSE8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBwcmludGYgIiVzXFxuIiAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkkQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgJGNvbXBpbGVyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRSTSAkbGliLmV4cCcKKworCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16IGRlZnMnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCXdsYXJjPScke3dsfScKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworICAgICAgZWxzZQorCWNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSoiQ29tcGlsZXJzIDUuMCIqKQorCSAgd2xhcmM9JycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJKikKKwkgIHdsYXJjPScke3dsfScKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJsYXJnZWR5bnN5bScKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCitdKQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQordGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitfTFRfVEFHVkFSKHdpdGhfZ251X2xkLCAkMSk9JHdpdGhfZ251X2xkCisKK19MVF9ERUNMKFtdLCBbbGliZXh0XSwgWzBdLCBbT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpXSlkbmwKK19MVF9ERUNMKFtdLCBbc2hyZXh0X2NtZHNdLCBbMV0sIFtTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKV0pZG5sCitfTFRfREVDTChbXSwgW2V4dHJhY3RfZXhwc3ltc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSwKKwlbbHRfY3ZfXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSwKKwlbJFJNIGNvbmZ0ZXN0KgorCWVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisJaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IHRoZW4KKwkgIHNvbmFtZT1jb25mdGVzdAorCSAgbGliPWNvbmZ0ZXN0CisJICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgIGRlcGxpYnM9CisJICB3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKwkgIHBpY19mbGFnPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKwkgIGNvbXBpbGVyX2ZsYWdzPS12CisJICBsaW5rZXJfZmxhZ3M9LXYKKwkgIHZlcnN0cmluZz0KKwkgIG91dHB1dF9vYmpkaXI9LgorCSAgbGlibmFtZT1jb25mdGVzdAorCSAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisJICBpZiBBQ19UUllfRVZBTChfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorCSAgdGhlbgorCSAgICBsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCSAgZWxzZQorCSAgICBsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgIGZpCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKwlmaQorCSRSTSBjb25mdGVzdCoKKwldKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSRsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK19MVF9UQUdERUNMKFtidWlsZF9saWJ0b29sX25lZWRfbGNdLCBbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbMF0sCisgICAgW1doZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXNdKQorX0xUX1RBR0RFQ0woW2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lc10sCisgICAgW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbMF0sCisgICAgW1doZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWNdKQorX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbMV0sCisgICAgW0NvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnNdKQorX0xUX1RBR0RFQ0woW10sIFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzXSkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbmVlZHNfb2JqZWN0XSwgWzFdLAorICAgIFtXaGV0aGVyIHRoZSBjb21waWxlciBjb3BlcyB3aXRoIHBhc3Npbmcgbm8gb2JqZWN0cyBkaXJlY3RseV0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbMl0sCisgICAgW0NyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFsyXSwKKyAgICBbQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbYXJjaGl2ZV9jbWRzXSwgWzJdLCBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbYXJjaGl2ZV9leHBzeW1fY21kc10sIFsyXSkKK19MVF9UQUdERUNMKFtdLCBbbW9kdWxlX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgaWYgZGlmZmVyZW50IGZyb20gYnVpbGRpbmcKKyAgICBhIHNoYXJlZCBhcmNoaXZlLl0pCitfTFRfVEFHREVDTChbXSwgW21vZHVsZV9leHBzeW1fY21kc10sIFsyXSkKK19MVF9UQUdERUNMKFtdLCBbd2l0aF9nbnVfbGRdLCBbMV0sCisgICAgW1doZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdF0pCitfTFRfVEFHREVDTChbXSwgW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgWzFdLAorICAgIFtGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdF0pCitfTFRfVEFHREVDTChbXSwgW25vX3VuZGVmaW5lZF9mbGFnXSwgWzFdLAorICAgIFtGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtGbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyAgICBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3RdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0XSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcworICAgICJhYnNvbHV0ZSIsIGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nICR7c2hsaWJwYXRoX3Zhcn0gaWYgdGhlCisgICAgbGlicmFyeSBpcyByZWxvY2F0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9taW51c19MXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIGxpYnJhcnkgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkCisgICAgYWdhaW5zdCBpdF0pCitfTFRfVEFHREVDTChbXSwgW2luaGVyaXRfcnBhdGhdLCBbMF0sCisgICAgW1NldCB0byB5ZXMgaWYgbGlua2VyIGFkZHMgcnVudGltZSBwYXRocyBvZiBkZXBlbmRlbnQgbGlicmFyaWVzCisgICAgdG8gcnVudGltZSBwYXRoIGxpc3RdKQorX0xUX1RBR0RFQ0woW10sIFtsaW5rX2FsbF9kZXBsaWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXNdKQorX0xUX1RBR0RFQ0woW10sIFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZF0pCitfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbMl0sCisgICAgW1RoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtleGNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtpbmNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZF0pCitfTFRfVEFHREVDTChbXSwgW3ByZWxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXNdKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0bGlua19jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zXSkKK19MVF9UQUdERUNMKFtdLCBbZmlsZV9saXN0X3NwZWNdLCBbMV0sCisgICAgW1NwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlc10pCitkbmwgRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKK2RubCBfTFRfVEFHREVDTChbXSwgW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFsxXSwKK2RubCAgICBbQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQgc2FmZSBvYmplY3RzXSkKK10pIyBfTFRfTElOS0VSX1NITElCUworCisKKyMgX0xUX0xBTkdfQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgQyBjb21waWxlciBhcmUgc3VpdGFibHkKKyMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQorIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfQ19DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK2x0X3NhdmVfQ0M9IiRDQyIKK0FDX0xBTkdfUFVTSChDKQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO30nCisKK19MVF9UQUdfQ09NUElMRVIKKyMgU2F2ZSB0aGUgZGVmYXVsdCBjb21waWxlciwgc2luY2UgaXQgZ2V0cyBvdmVyd3JpdHRlbiB3aGVuIHRoZSBvdGhlcgorIyB0YWdzIGFyZSBiZWluZyB0ZXN0ZWQsIGFuZCBfTFRfVEFHVkFSKGNvbXBpbGVyLCBbXSkgaXMgYSBOT1AuCitjb21waWxlcl9ERUZBVUxUPSRDQworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgoraWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisgIExUX1NZU19ETE9QRU5fU0VMRgorICBfTFRfQ01EX1NUUklQTElCCisKKyAgIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CisgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgZmkKKyAgICA7OworCisgIGFpeFtbNC05XV0qKQorICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorQUNfTEFOR19QT1AKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBfTFRfTEFOR19DX0NPTkZJRworCisKKyMgX0xUX0xBTkdfQ1hYX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMrKyBjb21waWxlciBhcmUgc3VpdGFibHkKKyMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQorIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfQ1hYX0NPTkZJR10sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSlkbmwKK2lmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIEFDX1BST0dfQ1hYQ1BQCitlbHNlCisgIF9sdF9jYXVnaHRfQ1hYX2Vycm9yPXllcworZmkKKworQUNfTEFOR19QVVNIKEMrKykKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBDWFggY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW1tdXSkgeyByZXR1cm4oMCk7IH0nCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSRDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgIGx0X3NhdmVfTEQ9JExECisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgR0NDPSRHWFgKKyAgbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKKyAgbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAorICBmaQorICBpZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAorICBmaQorICB0ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAorICBDQz0ke0NYWC0iYysrIn0KKyAgQ0ZMQUdTPSRDWFhGTEFHUworICBjb21waWxlcj0kQ0MKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgICMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3aGVuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQorICAgICMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKyAgICBmaQorCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCisKKyAgICAgIExUX1BBVEhfTEQKKworICAgICAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCisgICAgICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDICRwaWNfZmxhZyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAkcGljX2ZsYWcgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisgICAgICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KKyAgICAgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKKyAgICAgICAgd2xhcmM9JyR7d2x9JworCisgICAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfAorCSAgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICBlbHNlCisgICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgICB3bGFyYz0KKworICAgICAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgorICAgICAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQorICAgICAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAorICAgICAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KKyAgICAgICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworICAgICAgZmkKKworICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKworICAgIGVsc2UKKyAgICAgIEdYWD1ubworICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgIHdsYXJjPQorICAgIGZpCisKKyAgICAjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKyAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisgICAgICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisgICAgICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgICAgICBlbHNlCisgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisgICAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisgICAgICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICAgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgICAgIGNhc2UgJGxkX2ZsYWcgaW4KKwkgICAgICAqLWJydGwqKQorCSAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgICAgIGJyZWFrCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICA7OworICAgICAgICAgIGVzYWMKKworICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisgICAgICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgICBmaQorCisgICAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9JyR7d2x9LWYsJworCisgICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisgICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisgICAgICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICAgIDoKKwkgIGVsc2UKKwkgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisJICAgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKwkgIGZpCisgICAgICAgICAgZXNhYworICAgICAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCSAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSAgIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKyAgICAgICAgICBlbHNlCisJICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgICBlbHNlCisJICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJleHBhbGwnCisgICAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8KKwkjIGV4cG9ydC4KKyAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisgICAgICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eQorICAgICAgICAgICMgZXhlY3V0YWJsZS4KKyAgICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQorICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgICAgICBlbHNlCisJICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisJICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgZWxzZQorCSAgICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgICBmaQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZAorCSAgICAjIGxpYnJhcmllcy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgICBiZW9zKikKKwlpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwllbHNlCisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworCisgICAgICBjaG9ydXMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgICopCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorCWNhc2UgJEdYWCwkY2NfYmFzZW5hbWUgaW4KKwksY2wqIHwgbm8sY2wqKQorCSAgIyBOYXRpdmUgTVNWQworCSAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworCSAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworCSAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPSdAJworCSAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwkgIGxpYmV4dD1saWIKKwkgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCSAgc2hyZXh0X2NtZHM9Ii5kbGwiCisJICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgICAgICRTRUQgLW4gLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyAtZSAnMVxcXCFwJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgICBlbHNlCisJICAgICAgJFNFRCAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICAgIGZpfgorCSAgICAkQ0MgLW8gJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzICJAJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUuZXhwIiAtV2wsLURMTCwtSU1QTElCOiIkdG9vbF9vdXRwdXRfb2JqZGlyJGxpYm5hbWUuZGxsLmxpYiJ+CisJICAgIGxpbmtuYW1lcz0nCisJICAjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJICAjIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworCSAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJICAjIERvbid0IHVzZSByYW5saWIKKwkgIF9MVF9UQUdWQVIob2xkX3Bvc3RpbnN0YWxsX2NtZHMsICQxKT0nY2htb2QgNjQ0ICRvbGRsaWInCisJICBfTFRfVEFHVkFSKHBvc3RsaW5rX2NtZHMsICQxKT0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICAgKikKKwkJbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCQlsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCQk7OworCSAgICBlc2FjfgorCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGx0X291dHB1dGZpbGUifgorCSAgICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICAgIGZpJworCSAgOzsKKwkqKQorCSAgIyBnKysKKwkgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisJICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgIGVsc2UKKwkgICAgICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBmaX4KKwkgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSAgZWxzZQorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICBmaQorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAgIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTKCQxKQorCTs7CisKKyAgICAgIGRndXgqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGVjKysqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZDIuKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQorCSMgc3dpdGNoIHRvIEVMRgorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QtZWxmKikKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAgICAgIyBjb252ZW50aW9ucworICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgICA7OworCisgICAgICBnbnUqKQorICAgICAgICA7OworCisgICAgICBoYWlrdSopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDkqKQorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkgICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKyAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBhQ0MqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBocHV4MTAqfGhwdXgxMSopCisgICAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworICAgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisJICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGFDQyopCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgaHBwYSo2NCopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgIGlhNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICBpYTY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgICopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICBlc2FjCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBpbnRlcml4W1szLTldXSopCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisJIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorCSMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKwkjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisJIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworCSMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU0dJIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICBlbHNlCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAtbyAkbGliJworCSAgICAgIGZpCisJICAgIGZpCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqICkKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgd2l0aF9nbnVfbGQ9eWVzCisJICAgICMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJICAgICMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJICAgICMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJICAgIGNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSAgICAgICoiVmVyc2lvbiA3LiIqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgICAqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgICAgICAgdG1wX2lkeW49CisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCQkgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkJZXNhYworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICBlc2FjCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICA7OworICAgICAgICAgIHBnQ0MqIHwgcGdjcHAqKQorICAgICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgY2FzZSBgJENDIC1WYCBpbgorCSAgICAqcGdDQ1wgW1sxLTVdXS4qIHwgKnBnY3BwXCBbWzEtNV1dLiopCisJICAgICAgX0xUX1RBR1ZBUihwcmVsaW5rX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9ianMgJGxpYm9ianMgJGNvbXBpbGVfZGVwbGlic34KKwkJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgIicKKwkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9sZG9ianMkb2xkX2RlcGxpYnN+CisJCSRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgfgorCQkkUkFOTElCICRvbGRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgorCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgorCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgICopICMgVmVyc2lvbiA2IGFuZCBhYm92ZSB1c2Ugd2VhayBzeW1ib2xzCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgZXNhYworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgICAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJworCisJICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCJgOyB0ZW1wbGlzdD1gZnVuY19lY2hvX2FsbCAiJHRlbXBsaXN0IiB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiWCRsaXN0IiB8ICRYc2VkJworCSAgICA7OworCSAgeGwqIHwgbXBpeGwqIHwgYmd4bCopCisJICAgICMgSUJNIFhMIDguMCBvbiBQUEMsIHdpdGggR05VIGxkCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQllY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICAgIGZpCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzJworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCisKKwkgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgc29tZXRoaW5nIGJhc2VkIG9uCisJICAgICAgIyAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMQorCSAgICAgICMgd291bGQgYmUgYmV0dGVyLgorCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdmdW5jX2VjaG9fYWxsJworCisJICAgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIGx5bnhvcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBtODhrKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBtdnMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGN4eCopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisJICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBuZXRic2QqKQorICAgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCisJICB3bGFyYz0KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlmaQorCSMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCisJOzsKKworICAgICAgKm50byogfCAqcW54KikKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKwk7OworCisgICAgICBvcGVuYnNkMiopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgb3BlbmJzZCopCisJaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGZpCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIEtDQyopCisJICAgICMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSAgICAjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJICAgICMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkgICAgIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKSBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgICAgKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICBlc2FjCisJICAgIDs7CisgICAgICAgICAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBjeHgqKQorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopCisJICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCQk7OworCSAgICAgICopCisJICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgICAgICAgICAkUk0gJGxpYi5leHAnCisJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJCTs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICBvc2YzKikKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgICAqKQorCSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICBlc2FjCisKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBwc29zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgc3Vub3M0KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBzb2xhcmlzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyogfCBzdW5DQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsJDEpPXllcworCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAgICAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJICAgICAgKikKKwkJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4KKwkgICAgICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJCV9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJICAgICMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCisJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGVsc2UKKwkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgICAgICMgcGxhdGZvcm0uCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisJICAgICAgZmkKKworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICR3bCRsaWJkaXInCisJICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCQlzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCQkqKQorCQkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCQkgIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIENDKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKwkjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorCSMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKwkjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKwkjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisJIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisJIyBhcyAteiBkZWZzLgorCV9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisJcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1UcHJlbGlua19vYmplY3RzICRvbGRvYmpzfgorCSAgICAgICciJF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIgorCSAgICBfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkcmVsb2FkX29ianN+CisJICAgICAgJyIkX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpIgorCSAgICA7OworCSAgKikKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICA7OworCWVzYWMKKyAgICAgIDs7CisKKyAgICAgIHRhbmRlbSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICB2eHdvcmtzKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCisgICAgdGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEdYWCIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgQ0M9JGx0X3NhdmVfQ0MKKyAgQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworICBMRENYWD0kTEQKKyAgTEQ9JGx0X3NhdmVfTEQKKyAgR0NDPSRsdF9zYXZlX0dDQworICB3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorICBsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECisgIGx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAorICBsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK2ZpICMgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19DWFhfQ09ORklHCisKKworIyBfTFRfRlVOQ19TVFJJUE5BTUVfQ05GCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZnVuY19zdHJpcG5hbWVfY25mIHByZWZpeCBzdWZmaXggbmFtZQorIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KKyMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCisjIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKKyMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KKyMKKyMgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIChub24tWFNJKSB2ZXJzaW9uIG9mIGZ1bmNfc3RyaXBuYW1lLAorIyBleGNlcHQgdGhpcyBvbmUgY2FuIGJlIHVzZWQgYnkgbTQgY29kZSB0aGF0IG1heSBiZSBleGVjdXRlZCBieSBjb25maWd1cmUsCisjIHJhdGhlciB0aGFuIHRoZSBsaWJ0b29sIHNjcmlwdC4KK200X2RlZnVuKFtfTFRfRlVOQ19TVFJJUE5BTUVfQ05GXSxbZG5sCitBQ19SRVFVSVJFKFtfTFRfREVDTF9TRURdKQorQUNfUkVRVUlSRShbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKQorZnVuY19zdHJpcG5hbWVfY25mICgpCit7CisgIGNhc2UgJHsyfSBpbgorICAuKikgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlXFxcXCR7Mn1cJCUlImA7OworICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlJHsyfVwkJSUiYDs7CisgIGVzYWMKK30gIyBmdW5jX3N0cmlwbmFtZV9jbmYKK10pIyBfTFRfRlVOQ19TVFJJUE5BTUVfQ05GCisKKyMgX0xUX1NZU19ISURERU5fTElCREVQUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWd1cmUgb3V0ICJoaWRkZW4iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZyb20gdmVyYm9zZQorIyBjb21waWxlciBvdXRwdXQgd2hlbiBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCittNF9kZWZ1bihbX0xUX1NZU19ISURERU5fTElCREVQU10sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCitBQ19SRVFVSVJFKFtfTFRfRlVOQ19TVFJJUE5BTUVfQ05GXSlkbmwKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwcmVkZXBzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPQorCitkbmwgd2UgY2FuJ3QgdXNlIHRoZSBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUgaGVyZSwKK2RubCBiZWNhdXNlIGl0IGNvbnRhaW5zIGNvZGUgaW50ZW5kZWQgZm9yIGFuIGV4ZWN1dGFibGUsCitkbmwgbm90IGEgbGlicmFyeS4gIEl0J3MgcG9zc2libGUgd2Ugc2hvdWxkIGxldCBlYWNoCitkbmwgdGFnIGRlZmluZSBhIG5ldyBsdF8/Pz8/X2xpbmtfdGVzdF9jb2RlIHZhcmlhYmxlLAorZG5sIGJ1dCBpdCdzIG9ubHkgdXNlZCBoZXJlLi4uCittNF9pZihbJDFdLCBbXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitpbnQgYTsKK3ZvaWQgZm9vICh2b2lkKSB7IGEgPSAwOyB9CitfTFRfRU9GCitdLCBbJDFdLCBbQ1hYXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitjbGFzcyBGb28KK3sKK3B1YmxpYzoKKyAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Citwcml2YXRlOgorICBpbnQgYTsKK307CitfTFRfRU9GCitdLCBbJDFdLCBbRjc3XSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlcio0IGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtGQ10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgYQorICAgICAgYT0wCisgICAgICByZXR1cm4KKyAgICAgIGVuZAorX0xUX0VPRgorXSwgWyQxXSwgW0dDSl0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorcHVibGljIGNsYXNzIGZvbyB7CisgIHByaXZhdGUgaW50IGE7CisgIHB1YmxpYyB2b2lkIGJhciAodm9pZCkgeworICAgIGEgPSAwOworICB9Cit9OworX0xUX0VPRgorXSwgWyQxXSwgW0dPXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitwYWNrYWdlIGZvbworZnVuYyBmb28oKSB7Cit9CitfTFRfRU9GCitdKQorCitfbHRfbGliZGVwc19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitjYXNlICIkQ0MgJENGTEFHUyAiIGluICMoCisqXCAtZmx0bypcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLWx0byIgOzsKKypcIC1md2hvcHIqXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby13aG9wciIgOzsKKypcIC1mdXNlLWxpbmtlci1wbHVnaW4qXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby11c2UtbGlua2VyLXBsdWdpbiIgOzsKK2VzYWMKKworZG5sIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorZG5sIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK2lmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisgICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorCisgICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKKyAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCisgIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KKworICBmb3IgcCBpbiBgZXZhbCAiJG91dHB1dF92ZXJib3NlX2xpbmtfY21kImA7IGRvCisgICAgY2FzZSAke3ByZXZ9JHtwfSBpbgorCisgICAgLUwqIHwgLVIqIHwgLWwqKQorICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCisgICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgorICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIHx8CisgICAgICAgICAgdGVzdCAkcCA9ICItUiI7IHRoZW4KKwkgcHJldj0kcAorCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICAjIEV4cGFuZCB0aGUgc3lzcm9vdCB0byBlYXNlIGV4dHJhY3RpbmcgdGhlIGRpcmVjdG9yaWVzIGxhdGVyLgorICAgICAgIGlmIHRlc3QgLXogIiRwcmV2IjsgdGhlbgorICAgICAgICAgY2FzZSAkcCBpbgorICAgICAgICAgLUwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1MJyAnJyAiJHAiOyBwcmV2PS1MOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIC1SKikgZnVuY19zdHJpcG5hbWVfY25mICctUicgJycgIiRwIjsgcHJldj0tUjsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtbCopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLWwnICcnICIkcCI7IHByZXY9LWw7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgZXNhYworICAgICAgIGZpCisgICAgICAgY2FzZSAkcCBpbgorICAgICAgID0qKSBmdW5jX3N0cmlwbmFtZV9jbmYgJz0nICcnICIkcCI7IHA9JGx0X3N5c3Jvb3QkZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgZXNhYworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGNhc2UgJHtwcmV2fSBpbgorCSAtTCB8IC1SKQorCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQorCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQorCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgorCSAgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIjsgdGhlbgorCSAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtwcmV2fSR7cH0iCisJICAgZWxzZQorCSAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSAke3ByZXZ9JHtwfSIKKwkgICBmaQorCSAgIDs7CisJICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCisJICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgorCSBlc2FjCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtwcmV2fSR7cH0iCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7X0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpfSAke3ByZXZ9JHtwfSIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIHByZXY9CisgICAgICAgOzsKKworICAgICoubHRvLiRvYmpleHQpIDs7ICMgSWdub3JlIEdDQyBMVE8gb2JqZWN0cworICAgICouJG9iamV4dCkKKyAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKKyAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KKyAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KKwkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KKworICAgIGVzYWMKKyAgZG9uZQorCisgICMgQ2xlYW4gdXAuCisgIHJtIC1mIGEub3V0IGEuZXhlCitlbHNlCisgIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyAkMSB0ZXN0IHByb2dyYW0iCitmaQorCiskUk0gLWYgY29uZmVzdC4kb2JqZXh0CitDRkxBR1M9JF9sdF9saWJkZXBzX3NhdmVfQ0ZMQUdTCisKKyMgUE9SVE1FOiBvdmVycmlkZSBhYm92ZSB0ZXN0IG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYnJva2VuCittNF9pZihbJDFdLCBbQ1hYXSwKK1tjYXNlICRob3N0X29zIGluCitpbnRlcml4W1szLTldXSopCisgICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KKyAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KKyAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCQxKT0KKyAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9CisgIDs7CisKK2xpbnV4KikKKyAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisgICpTdW5cIEMqKQorICAgICMgU3VuIEMrKyA1LjkKKworICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgOzsKKworc29sYXJpcyopCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIENDKiB8IHN1bkNDKikKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBBZGRpbmcgdGhpcyByZXF1aXJlcyBhIGtub3duLWdvb2Qgc2V0dXAgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IKKyAgICAjIFN1biBjb21waWxlciB2ZXJzaW9ucyBiZWZvcmUgNS42LCBlbHNlIFBJQyBvYmplY3RzIGZyb20gYW4gb2xkCisgICAgIyBhcmNoaXZlIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIG91dHB1dCwgbGVhZGluZyB0byBzdWJ0bGUgYnVncy4KKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgOzsKK2VzYWMKK10pCisKK2Nhc2UgIiAkX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpICIgaW4KKyoiIC1sYyAiKikgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vIDs7Citlc2FjCisgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX2RpcnMsICQxKT0KK2lmIHRlc3QgLW4gIiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0iOyB0aGVuCisgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX2RpcnMsICQxKT1gZWNobyAiICR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0iIHwgJHtTRUR9IC1lICdzISAtTCEgIWcnIC1lICdzIV4gISEnYAorZmkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzXSwgWzFdLAorICAgIFtUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnldKQorX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBfb2JqZWN0c10sIFsxXSwKKyAgICBbRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvCisgICAgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnldKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwX29iamVjdHNdLCBbMV0pCitfTFRfVEFHREVDTChbXSwgW3ByZWRlcHNdLCBbMV0pCitfTFRfVEFHREVDTChbXSwgW3Bvc3RkZXBzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbMV0sCisgICAgW1RoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisgICAgYSBzaGFyZWQgbGlicmFyeV0pCitdKSMgX0xUX1NZU19ISURERU5fTElCREVQUworCisKKyMgX0xUX0xBTkdfRjc3X0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEZvcnRyYW4gNzcgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0Y3N19DT05GSUddLAorW0FDX0xBTkdfUFVTSChGb3J0cmFuIDc3KQoraWYgdGVzdCAteiAiJEY3NyIgfHwgdGVzdCAiWCRGNzciID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRjc3PXllcworZmkKKworX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCitfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCitfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEY3NyBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAorICAgICAgc3Vicm91dGluZSB0CisgICAgICByZXR1cm4KKyAgICAgIGVuZAorIgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9IiRDQyIKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgIENDPSR7Rjc3LSJmNzcifQorICBDRkxBR1M9JEZGTEFHUworICBjb21waWxlcj0kQ0MKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisgIEdDQz0kRzc3CisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgICAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisJICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworCWZpCisgICAgICAgIDs7CisgICAgZXNhYworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkRzc3IgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgR0NDPSRsdF9zYXZlX0dDQworICBDQz0iJGx0X3NhdmVfQ0MiCisgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19GNzdfQ09ORklHCisKKworIyBfTFRfTEFOR19GQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEZvcnRyYW4gY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0ZDX0NPTkZJR10sCitbQUNfTEFOR19QVVNIKEZvcnRyYW4pCisKK2lmIHRlc3QgLXogIiRGQyIgfHwgdGVzdCAiWCRGQyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GQz15ZXMKK2ZpCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZmMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PSR7YWNfZmNfc3JjZXh0LWZ9CisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmYyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEZDIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBDQz0ke0ZDLSJmOTUifQorICBDRkxBR1M9JEZDRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIEdDQz0kYWNfY3ZfZmNfY29tcGlsZXJfZ251CisKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKwkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisJZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRhY19jdl9mY19jb21waWxlcl9nbnUiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9JGx0X3NhdmVfQ0MKKyAgQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0ZDX0NPTkZJRworCisKKyMgX0xUX0xBTkdfR0NKX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgR05VIEphdmEgQ29tcGlsZXIgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0dDSl9DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfR0NKXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fSIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfScKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSRDQworbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworbHRfc2F2ZV9HQ0M9JEdDQworR0NDPXllcworQ0M9JHtHQ0otImdjaiJ9CitDRkxBR1M9JEdDSkZMQUdTCitjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKworX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9OT19SVFRJKCQxKQorICBfTFRfQ09NUElMRVJfUElDKCQxKQorICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKKworQUNfTEFOR19SRVNUT1JFCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK0NDPSRsdF9zYXZlX0NDCitDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCitdKSMgX0xUX0xBTkdfR0NKX0NPTkZJRworCisKKyMgX0xUX0xBTkdfR09fQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBHTlUgR28gY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0dPX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19HT10pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEdvIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1nbworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgR28gdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJwYWNrYWdlIG1haW47IGZ1bmMgbWFpbigpIHsgfSIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncGFja2FnZSBtYWluOyBmdW5jIG1haW4oKSB7IH0nCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0kQ0MKK2x0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz15ZXMKK0NDPSR7R09DLSJnY2NnbyJ9CitDRkxBR1M9JEdPRkxBR1MKK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgR28gZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisKK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgoraWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0FDX0xBTkdfUkVTVE9SRQorCitHQ0M9JGx0X3NhdmVfR0NDCitDQz0kbHRfc2F2ZV9DQworQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworXSkjIF9MVF9MQU5HX0dPX0NPTkZJRworCisKKyMgX0xUX0xBTkdfUkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX1JDX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19SQ10pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9JworCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK2x0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0KK0NDPSR7UkMtIndpbmRyZXMifQorQ0ZMQUdTPQorY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCitfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisKK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgOgorICBfTFRfQ09ORklHKCQxKQorZmkKKworR0NDPSRsdF9zYXZlX0dDQworQUNfTEFOR19SRVNUT1JFCitDQz0kbHRfc2F2ZV9DQworQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworXSkjIF9MVF9MQU5HX1JDX0NPTkZJRworCisKKyMgTFRfUFJPR19HQ0oKKyMgLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9QUk9HX0dDSl0sCitbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwgW0FDX1BST0dfR0NKXSwKKyAgW200X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwgW0FdW01fUFJPR19HQ0pdLAorICAgIFtBQ19DSEVDS19UT09MKEdDSiwgZ2NqLCkKKyAgICAgIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgorICAgICAgQUNfU1VCU1QoR0NKRkxBR1MpXSldKVtdZG5sCitdKQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfR0NKXSwgW0xUX1BST0dfR0NKXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLCBbXSkKKworCisjIExUX1BST0dfR08KKyMgLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfR09dLAorW0FDX0NIRUNLX1RPT0woR09DLCBnY2NnbywpCitdKQorCisKKyMgTFRfUFJPR19SQworIyAtLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19SQ10sCitbQUNfQ0hFQ0tfVE9PTChSQywgd2luZHJlcywpCitdKQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfUkNdLCBbTFRfUFJPR19SQ10pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfUkNdLCBbXSkKKworCisjIF9MVF9ERUNMX0VHUkVQCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBncmVwCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX0VHUkVQXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfRkdSRVBdKWRubAordGVzdCAteiAiJEdSRVAiICYmIEdSRVA9Z3JlcAorX0xUX0RFQ0woW10sIFtHUkVQXSwgWzFdLCBbQSBncmVwIHByb2dyYW0gdGhhdCBoYW5kbGVzIGxvbmcgbGluZXNdKQorX0xUX0RFQ0woW10sIFtFR1JFUF0sIFsxXSwgW0FuIEVSRSBtYXRjaGVyXSkKK19MVF9ERUNMKFtdLCBbRkdSRVBdLCBbMV0sIFtBIGxpdGVyYWwgc3RyaW5nIG1hdGNoZXJdKQorZG5sIE5vbi1ibGVlZGluZy1lZGdlIGF1dG9jb25mIGRvZXNuJ3Qgc3Vic3QgR1JFUCwgc28gZG8gaXQgaGVyZSB0b28KK0FDX1NVQlNUKFtHUkVQXSkKK10pCisKKworIyBfTFRfREVDTF9PQkpEVU1QCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBvYmpkdW1wCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX09CSkRVTVBdLAorW0FDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtBbiBvYmplY3Qgc3ltYm9sIGR1bXBlcl0pCitBQ19TVUJTVChbT0JKRFVNUF0pCitdKQorCisjIF9MVF9ERUNMX0RMTFRPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgRExMVE9PTCB2YXJpYWJsZSBpcyBzZXQuCittNF9kZWZ1bihbX0xUX0RFQ0xfRExMVE9PTF0sCitbQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK19MVF9ERUNMKFtdLCBbRExMVE9PTF0sIFsxXSwgW0RMTCBjcmVhdGlvbiBwcm9ncmFtXSkKK0FDX1NVQlNUKFtETExUT09MXSkKK10pCisKKyMgX0xUX0RFQ0xfU0VECisjIC0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgYSBmdWxseS1mdW5jdGlvbmFsIHNlZCBwcm9ncmFtLCB0aGF0IHRydW5jYXRlcworIyBhcyBmZXcgY2hhcmFjdGVycyBhcyBwb3NzaWJsZS4gIFByZWZlciBHTlUgc2VkIGlmIGZvdW5kLgorbTRfZGVmdW4oW19MVF9ERUNMX1NFRF0sCitbQUNfUFJPR19TRUQKK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKK19MVF9ERUNMKFtdLCBbU0VEXSwgWzFdLCBbQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitfTFRfREVDTChbXSwgW1hzZWRdLCBbIlwkU0VEIC1lIDFzL15YLy8iXSwKKyAgICBbU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW5dKQorXSkjIF9MVF9ERUNMX1NFRAorCittNF9pZm5kZWYoW0FDX1BST0dfU0VEXSwgWworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PVEU6IFRoaXMgbWFjcm8gaGFzIGJlZW4gc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW50byAgICMKKyMgIEdOVSBBdXRvY29uZiBhcyBBQ19QUk9HX1NFRC4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgIworIyAgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEF1dG9jb25mIHdlIHNob3VsZCByZW1vdmUgdGhpcyAgICAjCisjICBtYWNybyBhbmQgdXNlIGl0IGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCittNF9kZWZ1bihbQUNfUFJPR19TRURdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX1NFRCwKK1sjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KKyMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBmaQorICAgIGRvbmUKKyAgZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworbHRfYWNfbWF4PTAKK2x0X2FjX2NvdW50PTAKKyMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCisjIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgorZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCisgIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCisgIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgorICBsdF9hY19jb3VudD0wCisgIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgorICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgYnJlYWsKKyAgZmkKKyAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAorICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgorICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCisgICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCisgICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKKyAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCisgICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKKyAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgorICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAorICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGZpCisgIGRvbmUKK2RvbmUKK10pCitTRUQ9JGx0X2N2X3BhdGhfU0VECitBQ19TVUJTVChbU0VEXSkKK0FDX01TR19SRVNVTFQoWyRTRURdKQorXSkjQUNfUFJPR19TRUQKK10pI200X2lmbmRlZgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfU0VEXSwgW0FDX1BST0dfU0VEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19TRURdLCBbXSkKKworCisjIF9MVF9DSEVDS19TSEVMTF9GRUFUVVJFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmluZCBvdXQgd2hldGhlciB0aGUgc2hlbGwgaXMgQm91cm5lIG9yIFhTSSBjb21wYXRpYmxlLAorIyBvciBoYXMgc29tZSBvdGhlciB1c2VmdWwgZmVhdHVyZXMuCittNF9kZWZ1bihbX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHNdKQorIyBUcnkgc29tZSBYU0kgZmVhdHVyZXMKK3hzaV9zaGVsbD1ubworKCBfbHRfZHVtbXk9ImEvYi9jIgorICB0ZXN0ICIke19sdF9kdW1teSMjKi99LCR7X2x0X2R1bW15JS8qfSwke19sdF9kdW1teSM/P30iJHtfbHRfZHVtbXklIiRfbHRfZHVtbXkifSwgXAorICAgICAgPSBjLGEvYixiL2MsIFwKKyAgICAmJiBldmFsICd0ZXN0ICQoKCAxICsgMSApKSAtZXEgMiBcCisgICAgJiYgdGVzdCAiJHsjX2x0X2R1bW15fSIgLWVxIDUnICkgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgeHNpX3NoZWxsPXllcworQUNfTVNHX1JFU1VMVChbJHhzaV9zaGVsbF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbeHNpX3NoZWxsPSckeHNpX3NoZWxsJ10pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgIis9Il0pCitsdF9zaGVsbF9hcHBlbmQ9bm8KKyggZm9vPWJhcjsgc2V0IGZvbyBiYXo7IGV2YWwgIiRbMV0rPVwkWzJdIiAmJiB0ZXN0ICIkZm9vIiA9IGJhcmJheiApIFwKKyAgICA+L2Rldi9udWxsIDI+JjEgXAorICAmJiBsdF9zaGVsbF9hcHBlbmQ9eWVzCitBQ19NU0dfUkVTVUxUKFskbHRfc2hlbGxfYXBwZW5kXSkKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFtsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnXSkKKworaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGx0X3Vuc2V0PXVuc2V0CitlbHNlCisgIGx0X3Vuc2V0PWZhbHNlCitmaQorX0xUX0RFQ0woW10sIFtsdF91bnNldF0sIFswXSwgW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICJ1bnNldCJdKWRubAorCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIGx0X1NQMk5MPSd0ciBcMDQwIFwwMTInCisgIGx0X05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgbHRfU1AyTkw9J3RyIFwxMDAgXG4nCisgIGx0X05MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworX0xUX0RFQ0woW1NQMk5MXSwgW2x0X1NQMk5MXSwgWzFdLCBbdHVybiBzcGFjZXMgaW50byBuZXdsaW5lc10pZG5sCitfTFRfREVDTChbTkwyU1BdLCBbbHRfTkwyU1BdLCBbMV0sIFt0dXJuIG5ld2xpbmVzIGludG8gc3BhY2VzXSlkbmwKK10pIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKworCisjIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UgKEZVTkNOQU1FLCBSRVBMQUNFTUVOVC1CT0RZKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW4gYCRjZmdmaWxlJywgbG9vayBmb3IgZnVuY3Rpb24gRlVOQ05BTUUgZGVsaW1pdGVkIGJ5IGBeRlVOQ05BTUUgKCkkJyBhbmQKKyMgJ159IEZVTkNOQU1FICcsIGFuZCByZXBsYWNlIGl0cyBib2R5IHdpdGggUkVQTEFDRU1FTlQtQk9EWS4KK200X2RlZnVuKFtfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFXSwKK1tkbmwgeworc2VkIC1lICcvXiQxICgpJC8sL159ICMgJDEgL2NcCiskMSAoKVwKK3tcCittNF9icGF0c3Vic3RzKFskMl0sIFskXSwgW1xcXSwgW15cKFsJIF1cKV0sIFtcXFwxXSkKK30gIyBFeHRlbmRlZC1zaGVsbCAkMSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorXSkKKworCisjIF9MVF9QUk9HX1JFUExBQ0VfU0hFTExGTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZXBsYWNlIGV4aXN0aW5nIHBvcnRhYmxlIGltcGxlbWVudGF0aW9ucyBvZiBzZXZlcmFsIHNoZWxsIGZ1bmN0aW9ucyB3aXRoCisjIGVxdWl2YWxlbnQgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb25zIHdoZXJlIHRob3NlIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUuLgorbTRfZGVmdW4oW19MVF9QUk9HX1JFUExBQ0VfU0hFTExGTlNdLAorW2lmIHRlc3QgeCIkeHNpX3NoZWxsIiA9IHh5ZXM7IHRoZW4KKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19kaXJuYW1lXSwgW2RubAorICAgIGNhc2UgJHsxfSBpbgorICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgICBlc2FjXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2Jhc2VuYW1lXSwgW2RubAorICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJdKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWVdLCBbZG5sCisgICAgY2FzZSAkezF9IGluCisgICAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OworICAgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OworICAgIGVzYWMKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX3N0cmlwbmFtZV0sIFtkbmwKKyAgICAjIHBka3NoIDUuMi4xNCBkb2VzIG5vdCBkbyAke1glJFl9IGNvcnJlY3RseSBpZiBib3RoIFggYW5kIFkgYXJlCisgICAgIyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHNvIGFzc2lnbiBvbmUgdG8gb3JkaW5hcnkgcGFyYW1ldGVyIGZpcnN0LgorICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9CisgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0IyIkezF9In0KKyAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQlIiR7Mn0ifV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zcGxpdF9sb25nX29wdF0sIFtkbmwKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9JHsxJSU9Kn0KKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZz0kezEjKj19XSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX3NwbGl0X3Nob3J0X29wdF0sIFtkbmwKKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmc9JHsxIz8/fQorICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWU9JHsxJSIkZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIn1dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfbG8yb10sIFtkbmwKKyAgICBjYXNlICR7MX0gaW4KKyAgICAgICoubG8pIGZ1bmNfbG8yb19yZXN1bHQ9JHsxJS5sb30uJHtvYmpleHR9IDs7CisgICAgICAqKSAgICBmdW5jX2xvMm9fcmVzdWx0PSR7MX0gOzsKKyAgICBlc2FjXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX3hmb3JtXSwgWyAgICBmdW5jX3hmb3JtX3Jlc3VsdD0kezElLip9LmxvXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FyaXRoXSwgWyAgICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJFsqXSApKV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19sZW5dLCBbICAgIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfV0pCitmaQorCitpZiB0ZXN0IHgiJGx0X3NoZWxsX2FwcGVuZCIgPSB4eWVzOyB0aGVuCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfYXBwZW5kXSwgWyAgICBldmFsICIkezF9Kz1cXCR7Mn0iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FwcGVuZF9xdW90ZWRdLCBbZG5sCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHsyfSIKK2RubCBtNCBleHBhbnNpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgdGhlbiB0aGUgc2hlbGwgZXZhbCB0dXJucyB0aGF0IGludG8gXAorICAgIGV2YWwgIiR7MX0rPVxcXFwgXFwkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiXSkKKworICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgd2hlcmUgcG9zc2libGUgYnkgZGlyZWN0IHVzZSBvZiAnKz0nCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFtbYS16QS1aX11dXHsxLFx9XCkgIiVcMSs9IiVnJyAkY2ZnZmlsZSA+ICRjZmdmaWxlLnRtcCBcCisgICAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQorICB0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorZWxzZQorICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgZXZlbiB3aGVuICcrPScgaXMgbm90IGF2YWlsYWJsZQorICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbW2EtekEtWl9dXVx7MSxcfVwpICIlXDE9IiRcMSVnJyAkY2ZnZmlsZSA+ICRjZmdmaWxlLnRtcCBcCisgICAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQorICB0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorZmkKKworaWYgdGVzdCB4IiRfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsIiA9IHgiOiI7IHRoZW4KKyAgQUNfTVNHX1dBUk4oW1VuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGVdKQorZmkKK10pCisKKyMgX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGV0ZXJtaW5lIHdoaWNoIGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBieQorIyBmdW5jX3RvX2hvc3RfZmlsZSAoYW5kLCBpbXBsaWNpdGx5LCBieSBmdW5jX3RvX2hvc3RfcGF0aCkuICBUaGVzZSBhcmUgbmVlZGVkCisjIGZvciBjZXJ0YWluIGNyb3NzLWNvbXBpbGUgY29uZmlndXJhdGlvbnMgYW5kIG5hdGl2ZSBtaW5ndy4KK200X2RlZnVuKFtfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OU10sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl90b19ob3N0X2ZpbGVfY21kLAorW2Nhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICotKi1jeWd3aW4qICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgICAqLSotY3lnd2luKiApCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorICAgICAgICA7OworICAgICAgKiApICMgb3RoZXJ3aXNlLCBhc3N1bWUgKm5peAorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4KKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgKiApICMgdW5oYW5kbGVkIGhvc3RzIChhbmQgIm5vcm1hbCIgbmF0aXZlIGJ1aWxkcykKKyAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICA7OworZXNhYworXSkKK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKK0FDX01TR19SRVNVTFQoWyRsdF9jdl90b19ob3N0X2ZpbGVfY21kXSkKK19MVF9ERUNMKFt0b19ob3N0X2ZpbGVfY21kXSwgW2x0X2N2X3RvX2hvc3RfZmlsZV9jbWRdLAorICAgICAgICAgWzBdLCBbY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXRdKWRubAorCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvIHRvb2xjaGFpbiBmb3JtYXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQsCitbI2Fzc3VtZSBvcmRpbmFyeSBjcm9zcyB0b29scywgb3IgbmF0aXZlIGJ1aWxkLgorbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCitjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKK2VzYWMKK10pCit0b190b29sX2ZpbGVfY21kPSRsdF9jdl90b190b29sX2ZpbGVfY21kCitBQ19NU0dfUkVTVUxUKFskbHRfY3ZfdG9fdG9vbF9maWxlX2NtZF0pCitfTFRfREVDTChbdG9fdG9vbF9maWxlX2NtZF0sIFtsdF9jdl90b190b29sX2ZpbGVfY21kXSwKKyAgICAgICAgIFswXSwgW2NvbnZlcnQgJGJ1aWxkIGZpbGVzIHRvIHRvb2xjaGFpbiBmb3JtYXRdKWRubAorXSkjIF9MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2x0b3B0aW9ucy5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvbHRvcHRpb25zLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOWFjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2x0b3B0aW9ucy5tNApAQCAtMCwwICsxLDM4NCBAQAorIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgICBJbmMuCisjICAgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA3IGx0b3B0aW9ucy5tNAorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUT1BUSU9OU19WRVJTSU9OXSwgW200X2lmKFsxXSldKQorCisKKyMgX0xUX01BTkdMRV9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfTUFOR0xFX09QVElPTl0sCitbW19MVF9PUFRJT05fXW00X2JwYXRzdWJzdCgkMV9fJDIsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKworIyBfTFRfU0VUX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvcHRpb24gT1BUSU9OLU5BTUUgZm9yIG1hY3JvIE1BQ1JPLU5BTUUsIGFuZCBpZiB0aGVyZSBpcyBhCisjIG1hdGNoaW5nIGhhbmRsZXIgZGVmaW5lZCwgZGlzcGF0Y2ggdG8gaXQuICBPdGhlciBPUFRJT04tTkFNRXMgYXJlCisjIHNhdmVkIGFzIGEgZmxhZy4KK200X2RlZmluZShbX0xUX1NFVF9PUFRJT05dLAorW200X2RlZmluZShfTFRfTUFOR0xFX09QVElPTihbJDFdLCBbJDJdKSlkbmwKK200X2lmZGVmKF9MVF9NQU5HTEVfREVGVU4oWyQxXSwgWyQyXSksCisgICAgICAgIF9MVF9NQU5HTEVfREVGVU4oWyQxXSwgWyQyXSksCisgICAgW200X3dhcm5pbmcoW1Vua25vd24gJDEgb3B0aW9uIGAkMiddKV0pW11kbmwKK10pCisKKworIyBfTFRfSUZfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgorbTRfZGVmaW5lKFtfTFRfSUZfT1BUSU9OXSwKK1ttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBbJDJdKSwgWyQzXSwgWyQ0XSldKQorCisKKyMgX0xUX1VOTEVTU19PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNULCBJRi1OT1QtU0VUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtTk9ULVNFVCB1bmxlc3MgYWxsIG9wdGlvbnMgaW4gT1BUSU9OLUxJU1QgZm9yIE1BQ1JPLU5BTUUKKyMgYXJlIHNldC4KK200X2RlZmluZShbX0xUX1VOTEVTU19PUFRJT05TXSwKK1ttNF9mb3JlYWNoKFtfTFRfT3B0aW9uXSwgbTRfc3BsaXQobTRfbm9ybWFsaXplKFskMl0pKSwKKwkgICAgW200X2lmZGVmKF9MVF9NQU5HTEVfT1BUSU9OKFskMV0sIF9MVF9PcHRpb24pLAorCQkgICAgICBbbTRfZGVmaW5lKFskMF9mb3VuZF0pXSldKVtdZG5sCittNF9pZmRlZihbJDBfZm91bmRdLCBbbTRfdW5kZWZpbmUoWyQwX2ZvdW5kXSldLCBbJDMKK10pW11kbmwKK10pCisKKworIyBfTFRfU0VUX09QVElPTlMoTUFDUk8tTkFNRSwgT1BUSU9OLUxJU1QpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1BUSU9OLUxJU1QgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBMaWJ0b29sIG9wdGlvbnMgYXNzb2NpYXRlZAorIyB3aXRoIE1BQ1JPLU5BTUUuICBJZiBhbnkgT1BUSU9OIGhhcyBhIG1hdGNoaW5nIGhhbmRsZXIgZGVjbGFyZWQgd2l0aAorIyBMVF9PUFRJT05fREVGSU5FLCBkaXNwYXRjaCB0byB0aGF0IG1hY3JvOyBvdGhlcndpc2UgY29tcGxhaW4gYWJvdXQKKyMgdGhlIHVua25vd24gb3B0aW9uIGFuZCBleGl0LgorbTRfZGVmdW4oW19MVF9TRVRfT1BUSU9OU10sCitbIyBTZXQgb3B0aW9ucworbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisgICAgW19MVF9TRVRfT1BUSU9OKFskMV0sIF9MVF9PcHRpb24pXSkKKworbTRfaWYoWyQxXSxbTFRfSU5JVF0sWworICBkbmwKKyAgZG5sIFNpbXBseSBzZXQgc29tZSBkZWZhdWx0IHZhbHVlcyAoaS5lIG9mZikgaWYgYm9vbGVhbiBvcHRpb25zIHdlcmUgbm90CisgIGRubCBzcGVjaWZpZWQ6CisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtkbG9wZW5dLCBbZW5hYmxlX2Rsb3Blbj1ubworICBdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwgW2VuYWJsZV93aW4zMl9kbGw9bm8KKyAgXSkKKyAgZG5sCisgIGRubCBJZiBubyByZWZlcmVuY2Ugd2FzIG1hZGUgdG8gdmFyaW91cyBwYWlycyBvZiBvcHBvc2luZyBvcHRpb25zLCB0aGVuCisgIGRubCB3ZSBydW4gdGhlIGRlZmF1bHQgbW9kZSBoYW5kbGVyIGZvciB0aGUgcGFpci4gIEZvciBleGFtcGxlLCBpZiBuZWl0aGVyCisgIGRubCBgc2hhcmVkJyBub3IgYGRpc2FibGUtc2hhcmVkJyB3YXMgcGFzc2VkLCB3ZSBlbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkCisgIGRubCBhcmNoaXZlcyBieSBkZWZhdWx0OgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbc2hhcmVkIGRpc2FibGUtc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3N0YXRpYyBkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtwaWMtb25seSBuby1waWNdLCBbX0xUX1dJVEhfUElDXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbCBkaXNhYmxlLWZhc3QtaW5zdGFsbF0sCisgIAkJICAgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMXSkKKyAgXSkKK10pIyBfTFRfU0VUX09QVElPTlMKKworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1hY3JvcyB0byBoYW5kbGUgTFRfSU5JVCBvcHRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgX0xUX01BTkdMRV9ERUZVTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9ERUZVTl0sCitbW19MVF9PUFRJT05fREVGVU5fXW00X2JwYXRzdWJzdChtNF90b3VwcGVyKFskMV9fJDJdKSwgW1teQS1aMC05X11dLCBbX10pXSkKKworCisjIExUX09QVElPTl9ERUZJTkUoTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUsIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW0xUX09QVElPTl9ERUZJTkVdLAorW200X2RlZmluZShfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLCBbJDNdKVtdZG5sCitdKSMgTFRfT1BUSU9OX0RFRklORQorCisKKyMgZGxvcGVuCisjIC0tLS0tLQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkbG9wZW5dLCBbZW5hYmxlX2Rsb3Blbj15ZXMKK10pCisKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGxvcGVuXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGBkbG9wZW4nIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLCBbXSkKKworCisjIHdpbjMyLWRsbAorIyAtLS0tLS0tLS0KKyMgRGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIGRsbCdzLgorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFt3aW4zMi1kbGxdLAorW2VuYWJsZV93aW4zMl9kbGw9eWVzCisKK2Nhc2UgJGhvc3QgaW4KKyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1jZWdjYyopCisgIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKKyAgOzsKK2VzYWMKKwordGVzdCAteiAiJEFTIiAmJiBBUz1hcworX0xUX0RFQ0woW10sIFtBU10sICAgICAgWzFdLCBbQXNzZW1ibGVyIHByb2dyYW1dKWRubAorCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCitfTFRfREVDTChbXSwgW0RMTFRPT0xdLCBbMV0sIFtETEwgY3JlYXRpb24gcHJvZ3JhbV0pZG5sCisKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKK19MVF9ERUNMKFtdLCBbT0JKRFVNUF0sIFsxXSwgW09iamVjdCBkdW1wZXIgcHJvZ3JhbV0pZG5sCitdKSMgd2luMzItZGxsCisKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbd2luMzItZGxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGB3aW4zMi1kbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLCBbXSkKKworCisjIF9MVF9FTkFCTEVfU0hBUkVEKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnLCBhbmQgc3VwcG9ydHMgdGhlIGBzaGFyZWQnIGFuZAorIyBgZGlzYWJsZS1zaGFyZWQnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NIQVJFRF0sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbc2hhcmVkXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNoYXJlZEA8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OworICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc2hhcmVkPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zaGFyZWQ9XV9MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFQpCisKKyAgICBfTFRfREVDTChbYnVpbGRfbGlidG9vbF9saWJzXSwgW2VuYWJsZV9zaGFyZWRdLCBbMF0sCisJW1doZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorXSkjIF9MVF9FTkFCTEVfU0hBUkVECisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEKFtub10pXSkKKworIyBPbGQgbmFtZXM6CitBQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtzaGFyZWRdKQorXSkKKworQUNfREVGVU4oW0FDX0RJU0FCTEVfU0hBUkVEXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0pCitdKQorCitBVV9ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCitBVV9ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbQUNfRElTQUJMRV9TSEFSRUQoJEApXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW10pCisKKworCisjIF9MVF9FTkFCTEVfU1RBVElDKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHN0YXRpYycgYW5kCisjIGBkaXNhYmxlLXN0YXRpYycgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfU1RBVElDXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtzdGF0aWNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHN0YXRpYyBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyAgICAqKQorICAgICBlbmFibGVfc3RhdGljPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3N0YXRpYz15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc3RhdGljPV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKQorCisgICAgX0xUX0RFQ0woW2J1aWxkX29sZF9saWJzXSwgW2VuYWJsZV9zdGF0aWNdLCBbMF0sCisJW1doZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorXSkjIF9MVF9FTkFCTEVfU1RBVElDCisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbc3RhdGljXSwgW19MVF9FTkFCTEVfU1RBVElDKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtc3RhdGljXSwgW19MVF9FTkFCTEVfU1RBVElDKFtub10pXSkKKworIyBPbGQgbmFtZXM6CitBQ19ERUZVTihbQUNfRU5BQkxFX1NUQVRJQ10sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtzdGF0aWNdKQorXSkKKworQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10pCitdKQorCitBVV9ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtBQ19FTkFCTEVfU1RBVElDKCRAKV0pCitBVV9ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW10pCisKKworCisjIF9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYGZhc3QtaW5zdGFsbCcKKyMgYW5kIGBkaXNhYmxlLWZhc3QtaW5zdGFsbCcgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtmYXN0LWluc3RhbGxdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZmFzdC1pbnN0YWxsQDw6QD1QS0dTQDo+QF0sCisgICAgW29wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKKyAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfZmFzdF9pbnN0YWxsPV1fTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKQorCitfTFRfREVDTChbZmFzdF9pbnN0YWxsXSwgW2VuYWJsZV9mYXN0X2luc3RhbGxdLCBbMF0sCisJIFtXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb25dKWRubAorXSkjIF9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMCisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZmFzdC1pbnN0YWxsXSwgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtZmFzdC1pbnN0YWxsXSwgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFtub10pXSkKKworIyBPbGQgbmFtZXM6CitBVV9ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtmYXN0LWluc3RhbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Cit0aGUgYGZhc3QtaW5zdGFsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworQVVfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdSBwdXQKK3RoZSBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sIFtdKQorCisKKyMgX0xUX1dJVEhfUElDKFtNT0RFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLXdpdGgtcGljIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgcGljLW9ubHknIGFuZCBgbm8tcGljJworIyBMVF9JTklUIG9wdGlvbnMuCisjIE1PREUgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgYm90aCcuCittNF9kZWZpbmUoW19MVF9XSVRIX1BJQ10sCitbQUNfQVJHX1dJVEgoW3BpY10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtcGljQDw6QD1QS0dTQDo+QF0sCisJW3RyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIEA8OkBkZWZhdWx0PXVzZSBib3RoQDo+QF0pXSwKKyAgICBbbHRfcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICR3aXRodmFsIGluCisgICAgeWVzfG5vKSBwaWNfbW9kZT0kd2l0aHZhbCA7OworICAgICopCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBsdF9wa2cgaW4gJHdpdGh2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRsdF9wa2ciID0gIlgkbHRfcCI7IHRoZW4KKwkgIHBpY19tb2RlPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW3BpY19tb2RlPWRlZmF1bHRdKQorCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPW00X2RlZmF1bHQoWyQxXSwgW2RlZmF1bHRdKQorCitfTFRfREVDTChbXSwgW3BpY19tb2RlXSwgWzBdLCBbV2hhdCB0eXBlIG9mIG9iamVjdHMgdG8gYnVpbGRdKWRubAorXSkjIF9MVF9XSVRIX1BJQworCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3BpYy1vbmx5XSwgW19MVF9XSVRIX1BJQyhbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtuby1waWNdLCBbX0xUX1dJVEhfUElDKFtub10pXSkKKworIyBPbGQgbmFtZToKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3BpYy1vbmx5XSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGBwaWMtb25seScgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLCBbXSkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIExURExfSU5JVCBPcHRpb25zICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworCittNF9kZWZpbmUoW19MVERMX01PREVdLCBbXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtub25yZWN1cnNpdmVdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtub25yZWN1cnNpdmVdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbcmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbcmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3N1YnByb2plY3RdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtzdWJwcm9qZWN0XSldKQorCittNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtpbnN0YWxsYWJsZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2luc3RhbGxhYmxlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW2NvbnZlbmllbmNlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbY29udmVuaWVuY2VdKV0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2x0c3VnYXIubTQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L2x0c3VnYXIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwMGEwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvbHRzdWdhci5tNApAQCAtMCwwICsxLDEyMyBAQAorIyBsdHN1Z2FyLm00IC0tIGxpYnRvb2wgbTQgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgLSotQXV0b2NvbmYtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBXcml0dGVuIGJ5IEdhcnkgVi4gVmF1Z2hhbiwgMjAwNAorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDYgbHRzdWdhci5tNAorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUU1VHQVJfVkVSU0lPTl0sIFttNF9pZihbMC4xXSldKQorCisKKyMgbHRfam9pbihTRVAsIEFSRzEsIFtBUkcyLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBBUkcxU0VQQVJHMi4uLlNFUEFSR24sIG9taXR0aW5nIFtdIGFyZ3VtZW50cyBhbmQgdGhlaXIKKyMgYXNzb2NpYXRlZCBzZXBhcmF0b3IuCisjIE5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBtNF9qb2luIGZyb20gQXV0b2NvbmYgMi42Miwgc2luY2UgYWxsIGVhcmxpZXIKKyMgdmVyc2lvbnMgaW4gbTRzdWdhciBoYWQgYnVncy4KK200X2RlZmluZShbbHRfam9pbl0sCitbbTRfaWYoWyQjXSwgWzFdLCBbXSwKKyAgICAgICBbJCNdLCBbMl0sIFtbJDJdXSwKKyAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQyXV9dKSQwKFskMV0sIG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpXSldKQorbTRfZGVmaW5lKFtfbHRfam9pbl0sCitbbTRfaWYoWyQjJDJdLCBbMl0sIFtdLAorICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDEkMl1dKSQwKFskMV0sIG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpXSldKQorCisKKyMgbHRfY2FyKExJU1QpCisjIGx0X2NkcihMSVNUKQorIyAtLS0tLS0tLS0tLS0KKyMgTWFuaXB1bGF0ZSBtNCBsaXN0cy4KKyMgVGhlc2UgbWFjcm9zIGFyZSBuZWNlc3NhcnkgYXMgbG9uZyBhcyB3aWxsIHN0aWxsIG5lZWQgdG8gc3VwcG9ydAorIyBBdXRvY29uZi0yLjU5IHdoaWNoIHF1b3RlcyBkaWZmZXJlbnRseS4KK200X2RlZmluZShbbHRfY2FyXSwgW1skMV1dKQorbTRfZGVmaW5lKFtsdF9jZHJdLAorW200X2lmKFskI10sIDAsIFttNF9mYXRhbChbJDA6IGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNdKV0sCisgICAgICAgWyQjXSwgMSwgW10sCisgICAgICAgW200X2RxdW90ZShtNF9zaGlmdCgkQCkpXSldKQorbTRfZGVmaW5lKFtsdF91bnF1b3RlXSwgJDEpCisKKworIyBsdF9hcHBlbmQoTUFDUk8tTkFNRSwgU1RSSU5HLCBbU0VQQVJBVE9SXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZGVmaW5lIE1BQ1JPLU5BTUUgdG8gaG9sZCBpdHMgZm9ybWVyIGNvbnRlbnQgcGx1cyBgU0VQQVJBVE9SJ2BTVFJJTkcnLgorIyBOb3RlIHRoYXQgbmVpdGhlciBTRVBBUkFUT1Igbm9yIFNUUklORyBhcmUgZXhwYW5kZWQ7IHRoZXkgYXJlIGFwcGVuZGVkCisjIHRvIE1BQ1JPLU5BTUUgYXMgaXMgKGxlYXZpbmcgdGhlIGV4cGFuc2lvbiBmb3Igd2hlbiBNQUNSTy1OQU1FIGlzIGludm9rZWQpLgorIyBObyBTRVBBUkFUT1IgaXMgb3V0cHV0IGlmIE1BQ1JPLU5BTUUgd2FzIHByZXZpb3VzbHkgdW5kZWZpbmVkIChkaWZmZXJlbnQKKyMgdGhhbiBkZWZpbmVkIGFuZCBlbXB0eSkuCisjCisjIFRoaXMgbWFjcm8gaXMgbmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIEF1dG9jb25mIDIuNjIsIHNpbmNlIGVhcmxpZXIKKyMgdmVyc2lvbnMgb2YgbTRzdWdhciBtaXN0YWtlbmx5IGV4cGFuZGVkIFNFUEFSQVRPUiBidXQgbm90IFNUUklORy4KK200X2RlZmluZShbbHRfYXBwZW5kXSwKK1ttNF9kZWZpbmUoWyQxXSwKKwkgICBtNF9pZmRlZihbJDFdLCBbbTRfZGVmbihbJDFdKVskM11dKVskMl0pXSkKKworCisKKyMgbHRfY29tYmluZShTRVAsIFBSRUZJWC1MSVNULCBJTkZJWCwgU1VGRklYMSwgW1NVRkZJWDIuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgYSBTRVAgZGVsaW1pdGVkIGxpc3Qgb2YgYWxsIHBhaXJlZCBjb21iaW5hdGlvbnMgb2YgZWxlbWVudHMgb2YKKyMgUFJFRklYLUxJU1Qgd2l0aCBTVUZGSVgxIHRocm91Z2ggU1VGRklYbi4gIEVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdAorIyBoYXMgdGhlIGZvcm0gUFJFRklYbUlORklYU1VGRklYbi4KKyMgTmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIG00X2NvbWJpbmUgYWRkZWQgaW4gQXV0b2NvbmYgMi42Mi4KK200X2RlZmluZShbbHRfY29tYmluZV0sCitbbTRfaWYobTRfZXZhbChbJCMgPiAzXSksIFsxXSwKKyAgICAgICBbbTRfcHVzaGRlZihbX0x0X3NlcF0sIFttNF9kZWZpbmUoW19MdF9zZXBdLCBtNF9kZWZuKFtsdF9jYXJdKSldKV1dZG5sCitbW200X2ZvcmVhY2goW19MdF9wcmVmaXhdLCBbJDJdLAorCSAgICAgW200X2ZvcmVhY2goW19MdF9zdWZmaXhdLAorCQldbTRfZHF1b3RlKG00X2RxdW90ZShtNF9zaGlmdChtNF9zaGlmdChtNF9zaGlmdCgkQCkpKSkpWywKKwlbX0x0X3NlcChbJDFdKVtdbTRfZGVmbihbX0x0X3ByZWZpeF0pWyQzXW00X2RlZm4oW19MdF9zdWZmaXhdKV0pXSldKV0pCisKKworIyBsdF9pZl9hcHBlbmRfdW5pcShNQUNSTy1OQU1FLCBWQVJOQU1FLCBbU0VQQVJBVE9SXSwgW1VOSVFdLCBbTk9ULVVOSVFdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJZmYgTUFDUk8tTkFNRSBkb2VzIG5vdCB5ZXQgY29udGFpbiBWQVJOQU1FLCB0aGVuIGFwcGVuZCBpdCAoZGVsaW1pdGVkCisjIGJ5IFNFUEFSQVRPUiBpZiBzdXBwbGllZCkgYW5kIGV4cGFuZCBVTklRLCBlbHNlIE5PVC1VTklRLgorbTRfZGVmaW5lKFtsdF9pZl9hcHBlbmRfdW5pcV0sCitbbTRfaWZkZWYoWyQxXSwKKwkgIFttNF9pZihtNF9pbmRleChbJDNdbTRfZGVmbihbJDFdKVskM10sIFskMyQyJDNdKSwgWy0xXSwKKwkJIFtsdF9hcHBlbmQoWyQxXSwgWyQyXSwgWyQzXSkkNF0sCisJCSBbJDVdKV0sCisJICBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdKV0pCisKKworIyBsdF9kaWN0X2FkZChESUNULCBLRVksIFZBTFVFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2FkZF0sCitbbTRfZGVmaW5lKFskMSgkMildLCBbJDNdKV0pCisKKworIyBsdF9kaWN0X2FkZF9zdWJrZXkoRElDVCwgS0VZLCBTVUJLRVksIFZBTFVFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2FkZF9zdWJrZXldLAorW200X2RlZmluZShbJDEoJDI6JDMpXSwgWyQ0XSldKQorCisKKyMgbHRfZGljdF9mZXRjaChESUNULCBLRVksIFtTVUJLRVldKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfZmV0Y2hdLAorW200X2lmdmFsKFskM10sCisJbTRfaWZkZWYoWyQxKCQyOiQzKV0sIFttNF9kZWZuKFskMSgkMjokMyldKV0pLAorICAgIG00X2lmZGVmKFskMSgkMildLCBbbTRfZGVmbihbJDEoJDIpXSldKSldKQorCisKKyMgbHRfaWZfZGljdF9mZXRjaChESUNULCBLRVksIFtTVUJLRVldLCBWQUxVRSwgSUYtVFJVRSwgW0lGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfaWZfZGljdF9mZXRjaF0sCitbbTRfaWYobHRfZGljdF9mZXRjaChbJDFdLCBbJDJdLCBbJDNdKSwgWyQ0XSwKKwlbJDVdLAorICAgIFskNl0pXSkKKworCisjIGx0X2RpY3RfZmlsdGVyKERJQ1QsIFtTVUJLRVldLCBWQUxVRSwgW1NFUEFSQVRPUl0sIEtFWSwgWy4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfZmlsdGVyXSwKK1ttNF9pZihbJDVdLCBbXSwgW10sCisgIFtsdF9qb2luKG00X3F1b3RlKG00X2RlZmF1bHQoWyQ0XSwgW1ssIF1dKSksCisgICAgICAgICAgIGx0X3VucXVvdGUobTRfc3BsaXQobTRfbm9ybWFsaXplKG00X2ZvcmVhY2goX0x0X2tleSwgbHRfY2FyKFttNF9zaGlmdG4oNCwgJEApXSksCisJCSAgICAgIFtsdF9pZl9kaWN0X2ZldGNoKFskMV0sIF9MdF9rZXksIFskMl0sIFskM10sIFtfTHRfa2V5IF0pXSkpKSkpXSlbXWRubAorXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvbHR2ZXJzaW9uLm00IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9tNC9sdHZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhODYwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvbHR2ZXJzaW9uLm00CkBAIC0wLDAgKzEsMjMgQEAKKyMgbHR2ZXJzaW9uLm00IC0tIHZlcnNpb24gbnVtYmVycwkJCS0qLSBBdXRvY29uZiAtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBAY29uZmlndXJlX2lucHV0QAorCisjIHNlcmlhbCAzMzM3IGx0dmVyc2lvbi5tNAorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbAorCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfVkVSU0lPTl0sIFsyLjQuMl0pCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfUkVWSVNJT05dLCBbMS4zMzM3XSkKKworQUNfREVGVU4oW0xUVkVSU0lPTl9WRVJTSU9OXSwKK1ttYWNyb192ZXJzaW9uPScyLjQuMicKK21hY3JvX3JldmlzaW9uPScxLjMzMzcnCitfTFRfREVDTCgsIG1hY3JvX3ZlcnNpb24sIDAsIFtXaGljaCByZWxlYXNlIG9mIGxpYnRvb2wubTQgd2FzIHVzZWQ/XSkKK19MVF9ERUNMKCwgbWFjcm9fcmV2aXNpb24sIDApCitdKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9tNC9sdH5vYnNvbGV0ZS5tNCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvbHR+b2Jzb2xldGUubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3M2RhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbTQvbHR+b2Jzb2xldGUubTQKQEAgLTAsMCArMSw5OCBAQAorIyBsdH5vYnNvbGV0ZS5tNCAtLSBhY2xvY2FsIHNhdGlzZnlpbmcgb2Jzb2xldGUgZGVmaW5pdGlvbnMuICAgIC0qLUF1dG9jb25mLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNC4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA1IGx0fm9ic29sZXRlLm00CisKKyMgVGhlc2UgZXhpc3QgZW50aXJlbHkgdG8gZm9vbCBhY2xvY2FsIHdoZW4gYm9vdHN0cmFwcGluZyBsaWJ0b29sLgorIworIyBJbiB0aGUgcGFzdCBsaWJ0b29sLm00IGhhcyBwcm92aWRlZCBtYWNyb3MgdmlhIEFDX0RFRlVOIChvciBBVV9ERUZVTikKKyMgd2hpY2ggaGF2ZSBsYXRlciBiZWVuIGNoYW5nZWQgdG8gbTRfZGVmaW5lIGFzIHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlCisjIGV4cG9ydGVkIEFQSSwgb3IgbW92ZWQgdG8gQXV0b2NvbmYgb3IgQXV0b21ha2Ugd2hlcmUgdGhleSBiZWxvbmcuCisjCisjIFRoZSB0cm91YmxlIGlzLCBhY2xvY2FsIGlzIGEgYml0IHRoaWNrLiAgSXQnbGwgc2VlIHRoZSBvbGQgQUNfREVGVU4KKyMgaW4gL3Vzci9zaGFyZS9hY2xvY2FsL2xpYnRvb2wubTQgYW5kIHJlbWVtYmVyIGl0LCB0aGVuIHdoZW4gaXQgc2VlcyB1cworIyB1c2luZyBhIG1hY3JvIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBvdXIgbG9jYWwgbTQvbGlidG9vbC5tNCBpdCdsbAorIyBwdWxsIHRoZSBvbGQgbGlidG9vbC5tNCBpbiAoaXQgZG9lc24ndCBzZWUgb3VyIHNoaW55IG5ldyBtNF9kZWZpbmUKKyMgYW5kIGRvZXNuJ3Qga25vdyBhYm91dCBBdXRvY29uZiBtYWNyb3MgYXQgYWxsLikKKyMKKyMgU28gd2UgcHJvdmlkZSB0aGlzIGZpbGUsIHdoaWNoIGhhcyBhIHNpbGx5IGZpbGVuYW1lIHNvIGl0J3MgYWx3YXlzCisjIGluY2x1ZGVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgcHJvdmlkZXMgYWNsb2NhbCB3aXRoIHRoZQorIyBBQ19ERUZVTnMgaXQgd2FudHMsIGJ1dCB3aGVuIG00IHByb2Nlc3NlcyBpdCwgaXQgZG9lc24ndCBkbyBhbnl0aGluZworIyBiZWNhdXNlIHRob3NlIG1hY3JvcyBhbHJlYWR5IGV4aXN0LCBvciB3aWxsIGJlIG92ZXJ3cml0dGVuIGxhdGVyLgorIyBXZSB1c2UgQUNfREVGVU4gb3ZlciBBVV9ERUZVTiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFjbG9jYWwtMS42LiAKKyMKKyMgQW55dGltZSB3ZSB3aXRoZHJhdyBhbiBBQ19ERUZVTiBvciBBVV9ERUZVTiwgcmVtZW1iZXIgdG8gYWRkIGl0IGhlcmUuCisjIFllcywgdGhhdCBtZWFucyBldmVyeSBuYW1lIG9uY2UgdGFrZW4gd2lsbCBuZWVkIHRvIHJlbWFpbiBoZXJlIHVudGlsCisjIHdlIGdpdmUgdXAgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjcsIGF0IHdoaWNoIHBvaW50CisjIHdlIG5lZWQgdG8ga2VlcCBvbmx5IHRob3NlIG5hbWVzIHdoaWNoIHdlIHN0aWxsIHJlZmVyIHRvLgorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUT0JTT0xFVEVfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0pXSkKK200X2lmbmRlZihbQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdKV0pCittNF9pZm5kZWYoW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NIRUxMX0lOSVRdLAkJW0FDX0RFRlVOKFtfTFRfQUNfU0hFTExfSU5JVF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0pXSkKK200X2lmbmRlZihbX0xUX1BST0dfTFRNQUlOXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfTFRNQUlOXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVEFHVkFSXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0pXSkKK200X2lmbmRlZihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0pXSkKK200X2lmbmRlZihbQUNfTFRETF9QUkVPUEVOXSwJCVtBQ19ERUZVTihbQUNfTFRETF9QUkVPUEVOXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTE9DS10sCQlbQUNfREVGVU4oW19MVF9BQ19MT0NLXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdKV0pCittNF9pZm5kZWYoW19MVF9BQ19UUllfRExPUEVOX1NFTEZdLAlbQUNfREVGVU4oW19MVF9BQ19UUllfRExPUEVOX1NFTEZdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfT0JKRElSXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xURExfT0JKRElSXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSldKQorbTRfaWZuZGVmKFtBQ19QQVRIX01BR0lDXSwJCVtBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10pXSkKK200X2lmbmRlZihbQUNfUFJPR19MRF9HTlVdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0pXSkKK200X2lmbmRlZihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10sCVtBQ19ERUZVTihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pXSkKK200X2lmbmRlZihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLAlbQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSldKQorbTRfaWZuZGVmKFtMVF9BQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19FR1JFUF0pXSkKK200X2lmbmRlZihbTFRfQUNfUFJPR19TRURdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0pXSkKK200X2lmbmRlZihbX0xUX0NDX0JBU0VOQU1FXSwJCVtBQ19ERUZVTihbX0xUX0NDX0JBU0VOQU1FXSldKQorbTRfaWZuZGVmKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0pXSkKK200X2lmbmRlZihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0pXSkKK200X2lmbmRlZihbX0FDX1BST0dfTElCVE9PTF0sCQlbQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU0VUVVBdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfQ0hFQ0tfRExGQ05dLAkJW0FDX0RFRlVOKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RBR0NPTkZJR10sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdDT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzddLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfQ09ORklHXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19GSUxFX0xURExMX0NdLAlbQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdKV0pCittNF9pZm5kZWYoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSwJW0FDX0RFRlVOKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pXSkKK200X2lmbmRlZihbX0xUX0FDX1BST0dfQ1hYQ1BQXSwJCVtBQ19ERUZVTihbX0xUX0FDX1BST0dfQ1hYQ1BQXSldKQorbTRfaWZuZGVmKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10sCVtBQ19ERUZVTihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKK200X2lmbmRlZihbX0xUX1BST0dfRjc3XSwJCVtBQ19ERUZVTihbX0xUX1BST0dfRjc3XSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19GQ10sCQlbQUNfREVGVU4oW19MVF9QUk9HX0ZDXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19DWFhdKV0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL200L3N0bF9oYXNoLm00IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9tNC9zdGxfaGFzaC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzIyYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9tNC9zdGxfaGFzaC5tNApAQCAtMCwwICsxLDcyIEBACisjIFdlIGNoZWNrIHR3byB0aGluZ3M6IHdoZXJlIHRoZSBpbmNsdWRlIGZpbGUgaXMgZm9yCisjIHVub3JkZXJlZF9tYXAvaGFzaF9tYXAgKHdlIHByZWZlciB0aGUgZmlyc3QgZm9ybSksIGFuZCB3aGF0CisjIG5hbWVzcGFjZSB1bm9yZGVyZWQvaGFzaF9tYXAgbGl2ZXMgaW4gd2l0aGluIHRoYXQgaW5jbHVkZSBmaWxlLiAgV2UKKyMgaW5jbHVkZSBBQ19UUllfQ09NUElMRSBmb3IgYWxsIHRoZSBjb21iaW5hdGlvbnMgd2UndmUgc2VlbiBpbiB0aGUKKyMgd2lsZC4gIFdlIGRlZmluZSBIQVNIX01BUF9IIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgaGVhZGVyIGZpbGUsIGFuZAorIyBIQVNIX05BTUVTUEFDRSB0byB0aGUgbmFtZXNwYWNlIHRoZSBjbGFzcyAodW5vcmRlcmVkX21hcCBvcgorIyBoYXNoX21hcCkgaXMgaW4uICBXZSBkZWZpbmUgSEFWRV9VTk9SREVSRURfTUFQIGlmIHRoZSBjbGFzcyB3ZSBmb3VuZAorIyBpcyBuYW1lZCB1bm9yZGVyZWRfbWFwLCBvciBsZWF2ZSBpdCB1bmRlZmluZWQgaWYgbm90LgorCisjIFRoaXMgYWxzbyBjaGVja3MgaWYgdW5vcmRlcmVkIG1hcCBleGlzdHMuCitBQ19ERUZVTihbQUNfQ1hYX1NUTF9IQVNIXSwKKyAgWworICAgQUNfTVNHX0NIRUNLSU5HKHRoZSBsb2NhdGlvbiBvZiBoYXNoX21hcCkKKyAgIEFDX0xBTkdfU0FWRQorICAgQUNfTEFOR19DUExVU1BMVVMKKyAgIGFjX2N2X2N4eF9oYXNoX21hcD0iIgorICAgIyBGaXJzdCB0cnkgdW5vcmRlcmVkX21hcCwgYnV0IG5vdCBvbiBnY2MncyBiZWZvcmUgNC4yIC0tIEkndmUKKyAgICMgc2VlbiB1bmV4cGxhaW5hYmxlIHVub3JkZXJlZF9tYXAgYnVncyB3aXRoIC1PMiBvbiBvbGRlciBnY2Mncy4KKyAgIEFDX1RSWV9DT01QSUxFKFsjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA8IDIpKQorICAgICAgICAgICAgICAgICAgICMgZXJyb3IgR0NDIHRvbyBvbGQgZm9yIHVub3JkZXJlZF9tYXAKKyAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgIFsvKiBubyBwcm9ncmFtIGJvZHkgbmVjZXNzYXJ5ICovXSwKKyAgICAgICAgICAgICAgICAgICBbc3RsX2hhc2hfb2xkX2djYz1ub10sCisgICAgICAgICAgICAgICAgICAgW3N0bF9oYXNoX29sZF9nY2M9eWVzXSkKKyAgIGZvciBsb2NhdGlvbiBpbiB1bm9yZGVyZWRfbWFwIHRyMS91bm9yZGVyZWRfbWFwOyBkbworICAgICBmb3IgbmFtZXNwYWNlIGluIHN0ZCBzdGQ6OnRyMTsgZG8KKyAgICAgICBpZiB0ZXN0IC16ICIkYWNfY3ZfY3h4X2hhc2hfbWFwIiAtYSAiJHN0bF9oYXNoX29sZF9nY2MiICE9IHllczsgdGhlbgorICAgICAgICAgIyBTb21lIG9sZGVyIGdjYydzIGhhdmUgYSBidWdneSB0cjEsIHNvIHRlc3QgYSBiaXQgb2YgY29kZS4KKyAgICAgICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8JGxvY2F0aW9uPl0sCisgICAgICAgICAgICAgICAgICAgICAgICBbY29uc3QgJHtuYW1lc3BhY2V9Ojp1bm9yZGVyZWRfbWFwPGludCwgaW50PiB0OworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZpbmQoNSkgPT0gdC5lbmQoKTtdLAorICAgICAgICAgICAgICAgICAgICAgICAgW2FjX2N2X2N4eF9oYXNoX21hcD0iPCRsb2NhdGlvbj4iOworICAgICAgICAgICAgICAgICAgICAgICAgIGFjX2N2X2N4eF9oYXNoX25hbWVzcGFjZT0iJG5hbWVzcGFjZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgYWNfY3ZfY3h4X2hhc2hfbWFwX2NsYXNzPSJ1bm9yZGVyZWRfbWFwIjtdKQorICAgICAgIGZpCisgICAgIGRvbmUKKyAgIGRvbmUKKyAgICMgTm93IHRyeSBoYXNoX21hcAorICAgZm9yIGxvY2F0aW9uIGluIGV4dC9oYXNoX21hcCBoYXNoX21hcDsgZG8KKyAgICAgZm9yIG5hbWVzcGFjZSBpbiBfX2dudV9jeHggIiIgc3RkIHN0ZGV4dDsgZG8KKyAgICAgICBpZiB0ZXN0IC16ICIkYWNfY3ZfY3h4X2hhc2hfbWFwIjsgdGhlbgorICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDwkbG9jYXRpb24+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFske25hbWVzcGFjZX06Omhhc2hfbWFwPGludCwgaW50PiB0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFthY19jdl9jeHhfaGFzaF9tYXA9IjwkbG9jYXRpb24+IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY19jdl9jeHhfaGFzaF9uYW1lc3BhY2U9IiRuYW1lc3BhY2UiOworICAgICAgICAgICAgICAgICAgICAgICAgIGFjX2N2X2N4eF9oYXNoX21hcF9jbGFzcz0iaGFzaF9tYXAiO10pCisgICAgICAgZmkKKyAgICAgZG9uZQorICAgZG9uZQorICAgYWNfY3ZfY3h4X2hhc2hfc2V0PWBlY2hvICIkYWNfY3ZfY3h4X2hhc2hfbWFwIiB8IHNlZCBzL21hcC9zZXQvYDsKKyAgIGFjX2N2X2N4eF9oYXNoX3NldF9jbGFzcz1gZWNobyAiJGFjX2N2X2N4eF9oYXNoX21hcF9jbGFzcyIgfCBzZWQgcy9tYXAvc2V0L2A7CisgICBpZiB0ZXN0IC1uICIkYWNfY3ZfY3h4X2hhc2hfbWFwIjsgdGhlbgorICAgICAgQUNfREVGSU5FKEhBVkVfSEFTSF9NQVAsIDEsIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGhhcyBoYXNoX21hcF0pCisgICAgICBBQ19ERUZJTkUoSEFWRV9IQVNIX1NFVCwgMSwgW2RlZmluZSBpZiB0aGUgY29tcGlsZXIgaGFzIGhhc2hfc2V0XSkKKyAgICAgIEFDX0RFRklORV9VTlFVT1RFRChIQVNIX01BUF9ILCRhY19jdl9jeHhfaGFzaF9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZSBsb2NhdGlvbiBvZiA8dW5vcmRlcmVkX21hcD4gb3IgPGhhc2hfbWFwPl0pCisgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoSEFTSF9TRVRfSCwkYWNfY3ZfY3h4X2hhc2hfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGUgbG9jYXRpb24gb2YgPHVub3JkZXJlZF9zZXQ+IG9yIDxoYXNoX3NldD5dKQorICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBU0hfTkFNRVNQQUNFLCRhY19jdl9jeHhfaGFzaF9uYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZSBuYW1lc3BhY2Ugb2YgaGFzaF9tYXAvaGFzaF9zZXRdKQorICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBU0hfTUFQX0NMQVNTLCRhY19jdl9jeHhfaGFzaF9tYXBfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZSBuYW1lIG9mIDxoYXNoX21hcD5dKQorICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBU0hfU0VUX0NMQVNTLCRhY19jdl9jeHhfaGFzaF9zZXRfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZSBuYW1lIG9mIDxoYXNoX3NldD5dKQorICAgICAgQUNfTVNHX1JFU1VMVChbJGFjX2N2X2N4eF9oYXNoX21hcF0pCisgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKCkKKyAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCBhbiBTVEwgaGFzaF9tYXBdKQorICAgZmkKK10pCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbWlzc2luZyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NmE4ZmMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9taXNzaW5nCkBAIC0wLDAgKzEsMzMxIEBACisjISAvYmluL3NoCisjIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgorCitzY3JpcHR2ZXJzaW9uPTIwMTItMDEtMDYuMTM7ICMgVVRDCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorIyAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgZXhpdCAxCitmaQorCitydW49Ogorc2VkX291dHB1dD0ncy8uKiAtLW91dHB1dFsgPV1cKFteIF0qXCkuKi9cMS9wJworc2VkX21pbnVzbz0ncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJworCisjIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCisjIHNyY2RpciBhbHJlYWR5LgoraWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KKyAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYworZWxzZQorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCitmaQorCittc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCisKK2Nhc2UgJDEgaW4KKy0tcnVuKQorICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCisgIHJ1bj0KKyAgc2hpZnQKKyAgIiRAIiAmJiBleGl0IDAKKyAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucworICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCisgICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKKyAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgorICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KKyAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCisgICAgcnVuPToKKyAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCisgIGZpCisgIDs7CisKKyAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorICAgIGVjaG8gIlwKKyQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgorCitIYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCitlcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCisKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCisKK1N1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKKyAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JworICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKKyAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKKyAgYXV0b200dGUgICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZSwgb3IgY3JlYXRlIGEgc3R1YiBvbmUKKyAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcworICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisgIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisKK1ZlcnNpb24gc3VmZml4ZXMgdG8gUFJPR1JBTSBhcyB3ZWxsIGFzIHRoZSBwcmVmaXhlcyBcYGdudS0nLCBcYGdudScsIGFuZAorXGBnJyBhcmUgaWdub3JlZCB3aGVuIGNoZWNraW5nIHRoZSBuYW1lLgorCitTZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCitlc2FjCisKKyMgbm9ybWFsaXplIHByb2dyYW0gbmFtZSB0byBjaGVjayBmb3IuCitwcm9ncmFtPWBlY2hvICIkMSIgfCBzZWQgJworICBzL15nbnUtLy87IHQKKyAgcy9eZ251Ly87IHQKKyAgcy9eZy8vOyB0J2AKKworIyBOb3cgZXhpdCBpZiB3ZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLiAgQWxzbyBleGl0IG5vdyBpZiB3ZQorIyBkb24ndCBoYXZlIGl0IGFuZCAtLXZlcnNpb24gd2FzIHBhc3NlZCAobW9zdCBsaWtlbHkgdG8gZGV0ZWN0CisjIHRoZSBwcm9ncmFtKS4gIFRoaXMgaXMgYWJvdXQgbm9uLUdOVSBwcm9ncmFtcywgc28gdXNlICQxIG5vdAorIyAkcHJvZ3JhbS4KK2Nhc2UgJDEgaW4KKyAgbGV4Knx5YWNjKikKKyAgICAjIE5vdCBHTlUgcHJvZ3JhbXMsIHRoZXkgZG9uJ3QgaGF2ZSAtLXZlcnNpb24uCisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICAjIENvdWxkIG5vdCBydW4gLS12ZXJzaW9uIG9yIC0taGVscC4gIFRoaXMgaXMgcHJvYmFibHkgc29tZW9uZQorICAgICAgICMgcnVubmluZyBgJFRPT0wgLS12ZXJzaW9uJyBvciBgJFRPT0wgLS1oZWxwJyB0byBjaGVjayB3aGV0aGVyCisgICAgICAgIyAkVE9PTCBleGlzdHMgYW5kIG5vdCBrbm93aW5nICRUT09MIHVzZXMgbWlzc2luZy4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7Citlc2FjCisKKyMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCisjIHRyeSB0byBlbXVsYXRlIGl0LgorY2FzZSAkcHJvZ3JhbSBpbgorICBhY2xvY2FsKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQorICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHRvdWNoIGFjbG9jYWwubTQKKyAgICA7OworCisgIGF1dG9jb25mKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQorICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKKyAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKKyAgICB0b3VjaF9maWxlcz0KKyAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAorCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKKyAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgICAgdG91Y2ggJHRvdWNoX2ZpbGVzCisgICAgOzsKKworICBhdXRvbWFrZSopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KKyAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgorICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8CisJICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKKwkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKKyAgICA7OworCisgIGF1dG9tNHRlKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCisgICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIjISAvYmluL3NoIgorCWVjaG8gIiMgQ3JlYXRlZCBieSBHTlUgQXV0b21ha2UgbWlzc2luZyBhcyBhIHJlcGxhY2VtZW50IG9mIgorCWVjaG8gIiMgICQgJEAiCisJZWNobyAiZXhpdCAwIgorCWNobW9kICt4ICRmaWxlCisJZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgIGJpc29uKnx5YWNjKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCisgICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9XCR7JCN9CisJY2FzZSAkTEFTVEFSRyBpbgorCSoueSkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgorCWVjaG8gPnkudGFiLmgKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleCp8ZmxleCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiBsZXgueXkuYworICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPVwkeyQjfQorCWNhc2UgJExBU1RBUkcgaW4KKwkqLmwpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKKwkgICAgZmkKKwkgIDs7CisJZXNhYworICAgIGZpCisgICAgaWYgdGVzdCAhIC1mIGxleC55eS5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYworICAgIGZpCisgICAgOzsKKworICBoZWxwMm1hbiopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKwkgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSBvZiBhIG1hbnVhbCBwYWdlLiAgWW91IG1heSBuZWVkIHRoZQorCSBcYEhlbHAybWFuJyBwYWNrYWdlIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UKKwkgZWZmZWN0LiAgWW91IGNhbiBnZXQgXGBIZWxwMm1hbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKKwlleGl0ICQ/CisgICAgZmkKKyAgICA7OworCisgIG1ha2VpbmZvKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKKyAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cworICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKKyAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgorICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICAjIFRoZSBmaWxlIHRvIHRvdWNoIGlzIHRoYXQgc3BlY2lmaWVkIHdpdGggLW8gLi4uCisgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCisgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorICAgICAgIyAuLi4gb3IgaXQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgd2l0aCBAc2V0ZmlsZW5hbWUgLi4uCisgICAgICBpbmZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKKyAgICAgIGZpbGU9YHNlZCAtbiAnCisJL15Ac2V0ZmlsZW5hbWUveworCSAgcy8uKiBcKFteIF0qXCkgKiQvXDEvCisJICBwCisJICBxCisJfScgJGluZmlsZWAKKyAgICAgICMgLi4uIG9yIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIG5hbWUgKGRpci9mLnRleGkgYmVjb21lcyBmLmluZm8pCisgICAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJGluZmlsZSIgfCBzZWQgJ3MsLiovLCw7cywuW14uXSokLCwnYC5pbmZvCisgICAgZmkKKyAgICAjIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgdXNlciByZWFsbHkgbmVlZHMgbWFrZWluZm87CisgICAgIyBsZXQncyBmYWlsIHdpdGhvdXQgdG91Y2hpbmcgYW55dGhpbmcuCisgICAgdGVzdCAtZiAkZmlsZSB8fCBleGl0IDEKKyAgICB0b3VjaCAkZmlsZQorICAgIDs7CisKKyAgKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCisgICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCisgICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQorICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3Byb3RvYnVmLWxpdGUucGMuaW4gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3Byb3RvYnVmLWxpdGUucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljMjE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHJvdG9idWYtbGl0ZS5wYy5pbgpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogUHJvdG9jb2wgQnVmZmVycworRGVzY3JpcHRpb246IEdvb2dsZSdzIERhdGEgSW50ZXJjaGFuZ2UgRm9ybWF0CitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1scHJvdG9idWYtbGl0ZSBAUFRIUkVBRF9DRkxBR1NAIEBQVEhSRUFEX0xJQlNACitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSBAUFRIUkVBRF9DRkxBR1NACisjIENvbW1lbnRlZCBvdXQgYmVjYXVzZSBpdCBjcmFzaGVzIHBrZy1jb25maWcgKnNpZ2gqOgorIyAgIGh0dHA6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNjUKKyMgQ29uZmxpY3RzOiBwcm90b2J1ZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9wcm90b2J1Zi5wYy5pbiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHJvdG9idWYucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMjQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHJvdG9idWYucGMuaW4KQEAgLTAsMCArMSwxNCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IFByb3RvY29sIEJ1ZmZlcnMKK0Rlc2NyaXB0aW9uOiBHb29nbGUncyBEYXRhIEludGVyY2hhbmdlIEZvcm1hdAorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbHByb3RvYnVmIEBQVEhSRUFEX0NGTEFHU0AgQFBUSFJFQURfTElCU0AKK0xpYnMucHJpdmF0ZTogQExJQlNACitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSBAUFRIUkVBRF9DRkxBR1NACisjIENvbW1lbnRlZCBvdXQgYmVjYXVzZSBpdCBjcmFzaGVzIHBrZy1jb25maWcgKnNpZ2gqOgorIyAgIGh0dHA6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNjUKKyMgQ29uZmxpY3RzOiBwcm90b2J1Zi1saXRlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9SRUFETUUudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjAwMzJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vUkVBRE1FLnR4dApAQCAtMCwwICsxLDEwMSBAQAorUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CitDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgUHl0aG9uIFByb3RvY29sIEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5LgorCitOb3JtYWxseSwgdGhpcyBkaXJlY3RvcnkgY29tZXMgYXMgcGFydCBvZiB0aGUgcHJvdG9idWYgcGFja2FnZSwgYXZhaWxhYmxlCitmcm9tOgorCisgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1ZgorCitUaGUgY29tcGxldGUgcGFja2FnZSBpbmNsdWRlcyB0aGUgQysrIHNvdXJjZSBjb2RlLCB3aGljaCBpbmNsdWRlcyB0aGUKK1Byb3RvY29sIENvbXBpbGVyIChwcm90b2MpLiAgSWYgeW91IGRvd25sb2FkZWQgdGhpcyBwYWNrYWdlIGZyb20gUHlQSQorb3Igc29tZSBvdGhlciBQeXRob24tc3BlY2lmaWMgc291cmNlLCB5b3UgbWF5IGhhdmUgcmVjZWl2ZWQgb25seSB0aGUKK1B5dGhvbiBwYXJ0IG9mIHRoZSBjb2RlLiAgSW4gdGhpcyBjYXNlLCB5b3Ugd2lsbCBuZWVkIHRvIG9idGFpbiB0aGUKK1Byb3RvY29sIENvbXBpbGVyIGZyb20gc29tZSBvdGhlciBzb3VyY2UgYmVmb3JlIHlvdSBjYW4gdXNlIHRoaXMKK3BhY2thZ2UuCisKK0RldmVsb3BtZW50IFdhcm5pbmcKKz09PT09PT09PT09PT09PT09PT0KKworVGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBQcm90b2NvbCBCdWZmZXJzIGlzIG5vdCBhcyBtYXR1cmUgYXMgdGhlIEMrKworYW5kIEphdmEgaW1wbGVtZW50YXRpb25zLiAgSXQgbWF5IGJlIG1vcmUgYnVnZ3ksIGFuZCBpdCBpcyBrbm93biB0byBiZQorcHJldHR5IHNsb3cgYXQgdGhpcyB0aW1lLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGVscCBmaXggdGhlc2UgaXNzdWVzLAoram9pbiB0aGUgUHJvdG9jb2wgQnVmZmVycyBkaXNjdXNzaW9uIGxpc3QgYW5kIGxldCB1cyBrbm93IQorCitJbnN0YWxsYXRpb24KKz09PT09PT09PT09PQorCisxKSBNYWtlIHN1cmUgeW91IGhhdmUgUHl0aG9uIDIuNCBvciBuZXdlci4gIElmIGluIGRvdWJ0LCBydW46CisKKyAgICAgJCBweXRob24gLVYKKworMikgSWYgeW91IGRvIG5vdCBoYXZlIHNldHVwdG9vbHMgaW5zdGFsbGVkLCBub3RlIHRoYXQgaXQgd2lsbCBiZQorICAgZG93bmxvYWRlZCBhbmQgaW5zdGFsbGVkIGF1dG9tYXRpY2FsbHkgYXMgc29vbiBhcyB5b3UgcnVuIHNldHVwLnB5LgorICAgSWYgeW91IHdvdWxkIHJhdGhlciBpbnN0YWxsIGl0IG1hbnVhbGx5LCB5b3UgbWF5IGRvIHNvIGJ5IGZvbGxvd2luZworICAgdGhlIGluc3RydWN0aW9ucyBvbiB0aGlzIHBhZ2U6CisKKyAgICAgaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsI2luc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnMKKworMykgQnVpbGQgdGhlIEMrKyBjb2RlLCBvciBpbnN0YWxsIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBwcm90b2MuICBJZgorICAgeW91IGluc3RhbGwgYSBiaW5hcnkgZGlzdHJpYnV0aW9uLCBtYWtlIHN1cmUgdGhhdCBpdCBpcyB0aGUgc2FtZQorICAgdmVyc2lvbiBhcyB0aGlzIHBhY2thZ2UuICBJZiBpbiBkb3VidCwgcnVuOgorCisgICAgICQgcHJvdG9jIC0tdmVyc2lvbgorCis0KSBCdWlsZCBhbmQgcnVuIHRoZSB0ZXN0czoKKworICAgICAkIHB5dGhvbiBzZXR1cC5weSBidWlsZAorICAgICAkIHB5dGhvbiBzZXR1cC5weSB0ZXN0CisKKyAgIElmIHNvbWUgdGVzdHMgZmFpbCwgdGhpcyBsaWJyYXJ5IG1heSBub3Qgd29yayBjb3JyZWN0bHkgb24geW91cgorICAgc3lzdGVtLiAgQ29udGludWUgYXQgeW91ciBvd24gcmlzay4KKworICAgUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCBzb21lIHZlcnNpb25zIG9mCisgICBQeXRob24gb24gQ3lnd2luIHdoaWNoIGNhdXNlcyB0aGUgdGVzdHMgdG8gZmFpbCBhZnRlciBwcmludGluZyB0aGUKKyAgIGVycm9yOiAgInNlbV9pbml0OiBSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSIuICBUaGlzIGFwcGVhcnMKKyAgIHRvIGJlIGEgYnVnIGVpdGhlciBpbiBDeWd3aW4gb3IgaW4gUHl0aG9uOgorICAgICBodHRwOi8vd3d3LmN5Z3dpbi5jb20vbWwvY3lnd2luLzIwMDUtMDcvbXNnMDEzNzguaHRtbAorICAgV2UgZG8gbm90IGtub3cgaWYgb3Igd2hlbiBpdCBtaWdodCBtZSBmaXhlZC4gIFdlIGFsc28gZG8gbm90IGtub3cKKyAgIGhvdyBsaWtlbHkgaXQgaXMgdGhhdCB0aGlzIGJ1ZyB3aWxsIGFmZmVjdCB1c2VycyBpbiBwcmFjdGljZS4KKworNSkgSW5zdGFsbDoKKworICAgICAkIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsCisKKyAgIFRoaXMgc3RlcCBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4KKyAgIE5PVEU6IFRvIHVzZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvIGluc3RhbGwgQysrIHByb3RvYnVmIHJ1bnRpbWUKKyAgIGxpYnJhcnkgb2YgdGhlIHNhbWUgdmVyc2lvbiBhbmQgZXhwb3J0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgdGhpcworICAgc3RlcC4gU2VlIHRoZSAiQysrIEltcGxlbWVudGF0aW9uIiBzZWN0aW9uIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisKK1VzYWdlCis9PT09PQorCitUaGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IgUHJvdG9jb2wgQnVmZmVycyBpcyBhdmFpbGFibGUgdmlhIHRoZQord2ViIGF0OgorCisgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvCisKK0MrKyBJbXBsZW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09CisKK1dBUk5JTkc6IFRoaXMgaXMgRVhQRVJJTUVOVEFMIGFuZCBvbmx5IGF2YWlsYWJsZSBmb3IgQ1B5dGhvbiBwbGF0Zm9ybXMuCisKK1RoZSBDKysgaW1wbGVtZW50YXRpb24gZm9yIFB5dGhvbiBtZXNzYWdlcyBpcyBidWlsdCBhcyBhIFB5dGhvbiBleHRlbnNpb24gdG8KK2ltcHJvdmUgdGhlIG92ZXJhbGwgcHJvdG9idWYgUHl0aG9uIHBlcmZvcm1hbmNlLgorCitUbyB1c2UgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgeW91IG5lZWQgdG86CisxKSBJbnN0YWxsIHRoZSBDKysgcHJvdG9idWYgcnVudGltZSBsaWJyYXJ5LCBwbGVhc2Ugc2VlIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgIHBhcmVudCBkaXJlY3RvcnkuCisyKSBFeHBvcnQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGU6CisKKyAgJCBleHBvcnQgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049Y3BwCisKK1lvdSBuZWVkIHRvIGV4cG9ydCB0aGlzIHZhcmlhYmxlIGJlZm9yZSBydW5uaW5nIHNldHVwLnB5IHNjcmlwdCB0byBidWlsZCBhbmQKK2luc3RhbGwgdGhlIGV4dGVuc2lvbi4gIFlvdSBtdXN0IGFsc28gc2V0IHRoZSB2YXJpYWJsZSBhdCBydW50aW1lLCBvdGhlcndpc2UKK3RoZSBwdXJlLVB5dGhvbiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQuIEluIGEgZnV0dXJlIHJlbGVhc2UsIHdlIHdpbGwKK2NoYW5nZSB0aGUgZGVmYXVsdCBzbyB0aGF0IEMrKyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHdoZW5ldmVyIGl0IGlzIGF2YWlsYWJsZS4KK0l0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHJ1biBgcHl0aG9uIHNldHVwLnB5IHRlc3RgIGFmdGVyIHNldHRpbmcgdGhlCit2YXJpYWJsZSB0byAiY3BwIiwgc28gdGhlIHRlc3RzIHdpbGwgYmUgYWdhaW5zdCBDKysgaW1wbGVtZW50ZWQgUHl0aG9uCittZXNzYWdlcy4KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZXpfc2V0dXAucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9lel9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMmNmNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZXpfc2V0dXAucHkKQEAgLTAsMCArMSwyODMgQEAKKyMhcHl0aG9uCisKKyMgVGhpcyBmaWxlIHdhcyBvYnRhaW5lZCBmcm9tOgorIyAgIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL2Rpc3QvZXpfc2V0dXAucHkKKyMgb24gMjAxMS8xLzIxLgorCisiIiJCb290c3RyYXAgc2V0dXB0b29scyBpbnN0YWxsYXRpb24KKworSWYgeW91IHdhbnQgdG8gdXNlIHNldHVwdG9vbHMgaW4geW91ciBwYWNrYWdlJ3Mgc2V0dXAucHksIGp1c3QgaW5jbHVkZSB0aGlzCitmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3aXRoIGl0LCBhbmQgYWRkIHRoaXMgdG8gdGhlIHRvcCBvZiB5b3VyIHNldHVwLnB5OjoKKworICAgIGZyb20gZXpfc2V0dXAgaW1wb3J0IHVzZV9zZXR1cHRvb2xzCisgICAgdXNlX3NldHVwdG9vbHMoKQorCitJZiB5b3Ugd2FudCB0byByZXF1aXJlIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBzZXR1cHRvb2xzLCBzZXQgYSBkb3dubG9hZAorbWlycm9yLCBvciB1c2UgYW4gYWx0ZXJuYXRlIGRvd25sb2FkIGRpcmVjdG9yeSwgeW91IGNhbiBkbyBzbyBieSBzdXBwbHlpbmcKK3RoZSBhcHByb3ByaWF0ZSBvcHRpb25zIHRvIGBgdXNlX3NldHVwdG9vbHMoKWBgLgorCitUaGlzIGZpbGUgY2FuIGFsc28gYmUgcnVuIGFzIGEgc2NyaXB0IHRvIGluc3RhbGwgb3IgdXBncmFkZSBzZXR1cHRvb2xzLgorIiIiCitpbXBvcnQgc3lzCitERUZBVUxUX1ZFUlNJT04gPSAiMC42YzExIgorREVGQVVMVF9VUkwgICAgID0gImh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcGFja2FnZXMvJXMvcy9zZXR1cHRvb2xzLyIgJSBzeXMudmVyc2lvbls6M10KKworbWQ1X2RhdGEgPSB7CisgICAgJ3NldHVwdG9vbHMtMC42YjEtcHkyLjMuZWdnJzogJzg4MjJjYWY5MDEyNTBkODQ4Yjk5NmI3ZjI1YzZlNmNhJywKKyAgICAnc2V0dXB0b29scy0wLjZiMS1weTIuNC5lZ2cnOiAnYjc5YThhNDAzZTQ1MDJmYmI4NWVlM2YxOTQxNzM1Y2InLAorICAgICdzZXR1cHRvb2xzLTAuNmIyLXB5Mi4zLmVnZyc6ICc1NjU3NzU5ZDhhNmQ4ZmM0NDA3MGE5ZDA3MjcyZDk5YicsCisgICAgJ3NldHVwdG9vbHMtMC42YjItcHkyLjQuZWdnJzogJzQ5OTZhOGQxNjlkMmJlNjYxZmEzMmE2ZTUyZTRmODJhJywKKyAgICAnc2V0dXB0b29scy0wLjZiMy1weTIuMy5lZ2cnOiAnYmIzMWMwZmM3Mzk5YTYzNTc5OTc1Y2FkOWY1YTA2MTgnLAorICAgICdzZXR1cHRvb2xzLTAuNmIzLXB5Mi40LmVnZyc6ICczOGE4YzZiM2Q2ZWNkMjIyNDdmMTc5ZjdkYTY2OWZhYycsCisgICAgJ3NldHVwdG9vbHMtMC42YjQtcHkyLjMuZWdnJzogJzYyMDQ1YTI0ZWQ0ZTFlYmM3N2ZlMDM5YWE0ZTZmN2U1JywKKyAgICAnc2V0dXB0b29scy0wLjZiNC1weTIuNC5lZ2cnOiAnNGNiMmExODVkMjI4ZGFjZmZiMmQxN2YxMDNiM2IxYzQnLAorICAgICdzZXR1cHRvb2xzLTAuNmMxLXB5Mi4zLmVnZyc6ICdiM2YyYjU1MzlkNjVjYjdmNzRhZDc5MTI3ZjFhOTA4YycsCisgICAgJ3NldHVwdG9vbHMtMC42YzEtcHkyLjQuZWdnJzogJ2I0NWFkZWRhMDY2N2QyZDJmZmUxNDAwOTM2NGYyYTRiJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjMuZWdnJzogJ2NlMWUyYWI1ZDNhMDI1NjQ1NmQ5ZmMxMzgwMGE3MDkwJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjQuZWdnJzogJzU3ZDZkOWQ2ZTliODA3NzJjNTlhNTNhODQzM2E1ZGQ0JywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjUuZWdnJzogJ2RlNDZhYzhiMWM5N2M4OTU1NzJlNWU4NTk2YWViOGM3JywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjYuZWdnJzogJzU4ZWE0MGFlZjA2ZGEwMmNlNjQxNDk1NTIzYTBiN2Y1JywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjMuZWdnJzogJzJiYWVhYzZlMTNkNDE0YTlkMjhlN2JhNWI1YTU5NmRlJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjQuZWdnJzogJ2JkNjM5ZjliMGVhYzRjNDI0OTcwMzRkZWMyZWMwYzJiJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjUuZWdnJzogJzY0Yzk0ZjNiZjdhNzJhMTNlYzgzZTBiMjRmMjc0OWIyJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjYuZWdnJzogJ2JmYTkyMTAwYmQ3NzJkNWEyMTNlZWRkMzU2ZDY0MDg2JywKKyAgICAnc2V0dXB0b29scy0wLjZjMi1weTIuMy5lZ2cnOiAnZjAwNjRiZjZhYTJiN2QwZjNiYTBiNDNmMjA4MTdjMjcnLAorICAgICdzZXR1cHRvb2xzLTAuNmMyLXB5Mi40LmVnZyc6ICc2MTYxOTJlZWMzNWY0N2U4ZWExNmNkNmExMjJiNzI3NycsCisgICAgJ3NldHVwdG9vbHMtMC42YzMtcHkyLjMuZWdnJzogJ2YxODFmYTEyNWRmZTg1YTI1OWM5Y2Q2ZjFkN2I3OGZhJywKKyAgICAnc2V0dXB0b29scy0wLjZjMy1weTIuNC5lZ2cnOiAnZTBlZDc0NjgyYzk5OGJmYjczYmY4MDNhNTBlN2I3MWUnLAorICAgICdzZXR1cHRvb2xzLTAuNmMzLXB5Mi41LmVnZyc6ICdhYmVmMTZmZGQ2MTk1NTUxNDg0MWM3YzZiZDk4OTY1ZScsCisgICAgJ3NldHVwdG9vbHMtMC42YzQtcHkyLjMuZWdnJzogJ2IwYjkxMzFhY2FiMzIwMjJiZmFjN2Y0NGM1ZDc5NzFmJywKKyAgICAnc2V0dXB0b29scy0wLjZjNC1weTIuNC5lZ2cnOiAnMmExZjk2NTZkNGZiZjNjOTdiZjk0NmMwYTEyNGU2ZTInLAorICAgICdzZXR1cHRvb2xzLTAuNmM0LXB5Mi41LmVnZyc6ICc4ZjVhMDUyZTMyY2RiOWM3MmJjZjRiNTUyNmYyOGFmYycsCisgICAgJ3NldHVwdG9vbHMtMC42YzUtcHkyLjMuZWdnJzogJ2VlOWZkODA5NjVkYTA0ZjJmM2U2YjM1NzZlOWQ4MTY3JywKKyAgICAnc2V0dXB0b29scy0wLjZjNS1weTIuNC5lZ2cnOiAnYWZlMmFkZjFjMDE3MDFlZTg0MTc2MWY1YmNkOGFhNjQnLAorICAgICdzZXR1cHRvb2xzLTAuNmM1LXB5Mi41LmVnZyc6ICdhOGQzZjYxNDk0Y2NhYTg3MTRkZmVkMzdiY2NkM2Q1ZCcsCisgICAgJ3NldHVwdG9vbHMtMC42YzYtcHkyLjMuZWdnJzogJzM1Njg2Yjc4MTE2YTY2ODg0NzIzN2I2OWQ1NDllYzIwJywKKyAgICAnc2V0dXB0b29scy0wLjZjNi1weTIuNC5lZ2cnOiAnM2M1NmFmNTdiZTMyMjUwMTkyNjBhNjQ0NDMwMDY1YWInLAorICAgICdzZXR1cHRvb2xzLTAuNmM2LXB5Mi41LmVnZyc6ICdiMmY4YTc1MjA3MDlhNWIzNGY4MDk0NmRlNWYwMmY1MycsCisgICAgJ3NldHVwdG9vbHMtMC42YzctcHkyLjMuZWdnJzogJzIwOWZkZjlhZGMzYTYxNWU1MTE1YjcyNTY1OGUxM2UyJywKKyAgICAnc2V0dXB0b29scy0wLjZjNy1weTIuNC5lZ2cnOiAnNWE4Zjk1NDgwN2Q0NmEwZmI2N2NmMWYyNmM1NWE4MmUnLAorICAgICdzZXR1cHRvb2xzLTAuNmM3LXB5Mi41LmVnZyc6ICc0NWQyYWQyOGY5NzUwZTc0MzQxMTFmZGU4MzFlODM3MicsCisgICAgJ3NldHVwdG9vbHMtMC42YzgtcHkyLjMuZWdnJzogJzUwNzU5ZDI5YjM0OWRiOGNmZDgwN2JhODMwM2YxOTAyJywKKyAgICAnc2V0dXB0b29scy0wLjZjOC1weTIuNC5lZ2cnOiAnY2JhMzhkNzRmN2Q0ODNjMDZlOWRhYTYwNzBjY2U2ZGUnLAorICAgICdzZXR1cHRvb2xzLTAuNmM4LXB5Mi41LmVnZyc6ICcxNzIxNzQ3ZWUzMjlkYzE1MDU5MGE1OGIzZTFhYzk1YicsCisgICAgJ3NldHVwdG9vbHMtMC42YzktcHkyLjMuZWdnJzogJ2E4M2M0MDIwNDE0ODA3YjQ5NmU0Y2ZiZTA4NTA3YzAzJywKKyAgICAnc2V0dXB0b29scy0wLjZjOS1weTIuNC5lZ2cnOiAnMjYwYTJiZTJlNTM4OGQ2NmJkYWVlMDZhYmVjNjM0MmEnLAorICAgICdzZXR1cHRvb2xzLTAuNmM5LXB5Mi41LmVnZyc6ICdmZTY3YzNlNWExN2IxMmMwZTdjNTQxYjdlYTQzYThlNicsCisgICAgJ3NldHVwdG9vbHMtMC42YzktcHkyLjYuZWdnJzogJ2NhMzdiMWZmMTZmYTJlZGU2ZTE5MzgzZTdiNTkyNDVhJywKK30KKworaW1wb3J0IHN5cywgb3MKK3RyeTogZnJvbSBoYXNobGliIGltcG9ydCBtZDUKK2V4Y2VwdCBJbXBvcnRFcnJvcjogZnJvbSBtZDUgaW1wb3J0IG1kNQorCitkZWYgX3ZhbGlkYXRlX21kNShlZ2dfbmFtZSwgZGF0YSk6CisgICAgaWYgZWdnX25hbWUgaW4gbWQ1X2RhdGE6CisgICAgICAgIGRpZ2VzdCA9IG1kNShkYXRhKS5oZXhkaWdlc3QoKQorICAgICAgICBpZiBkaWdlc3QgIT0gbWQ1X2RhdGFbZWdnX25hbWVdOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCisgICAgICAgICAgICAgICAgIm1kNSB2YWxpZGF0aW9uIG9mICVzIGZhaWxlZCEgIChQb3NzaWJsZSBkb3dubG9hZCBwcm9ibGVtPykiCisgICAgICAgICAgICAgICAgJSBlZ2dfbmFtZQorICAgICAgICAgICAgKQorICAgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICByZXR1cm4gZGF0YQorCitkZWYgdXNlX3NldHVwdG9vbHMoCisgICAgdmVyc2lvbj1ERUZBVUxUX1ZFUlNJT04sIGRvd25sb2FkX2Jhc2U9REVGQVVMVF9VUkwsIHRvX2Rpcj1vcy5jdXJkaXIsCisgICAgZG93bmxvYWRfZGVsYXk9MTUKKyk6CisgICAgIiIiQXV0b21hdGljYWxseSBmaW5kL2Rvd25sb2FkIHNldHVwdG9vbHMgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIG9uIHN5cy5wYXRoCisKKyAgICBgdmVyc2lvbmAgc2hvdWxkIGJlIGEgdmFsaWQgc2V0dXB0b29scyB2ZXJzaW9uIG51bWJlciB0aGF0IGlzIGF2YWlsYWJsZQorICAgIGFzIGFuIGVnZyBmb3IgZG93bmxvYWQgdW5kZXIgdGhlIGBkb3dubG9hZF9iYXNlYCBVUkwgKHdoaWNoIHNob3VsZCBlbmQgd2l0aAorICAgIGEgJy8nKS4gIGB0b19kaXJgIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgc2V0dXB0b29scyB3aWxsIGJlIGRvd25sb2FkZWQsIGlmCisgICAgaXQgaXMgbm90IGFscmVhZHkgYXZhaWxhYmxlLiAgSWYgYGRvd25sb2FkX2RlbGF5YCBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZAorICAgIGJlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHdpbGwgYmUgcGF1c2VkIGJlZm9yZSBpbml0aWF0aW5nIGEgZG93bmxvYWQsCisgICAgc2hvdWxkIG9uZSBiZSByZXF1aXJlZC4gIElmIGFuIG9sZGVyIHZlcnNpb24gb2Ygc2V0dXB0b29scyBpcyBpbnN0YWxsZWQsCisgICAgdGhpcyByb3V0aW5lIHdpbGwgcHJpbnQgYSBtZXNzYWdlIHRvIGBgc3lzLnN0ZGVycmBgIGFuZCByYWlzZSBTeXN0ZW1FeGl0IGluCisgICAgYW4gYXR0ZW1wdCB0byBhYm9ydCB0aGUgY2FsbGluZyBzY3JpcHQuCisgICAgIiIiCisgICAgd2FzX2ltcG9ydGVkID0gJ3BrZ19yZXNvdXJjZXMnIGluIHN5cy5tb2R1bGVzIG9yICdzZXR1cHRvb2xzJyBpbiBzeXMubW9kdWxlcworICAgIGRlZiBkb19kb3dubG9hZCgpOgorICAgICAgICBlZ2cgPSBkb3dubG9hZF9zZXR1cHRvb2xzKHZlcnNpb24sIGRvd25sb2FkX2Jhc2UsIHRvX2RpciwgZG93bmxvYWRfZGVsYXkpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBlZ2cpCisgICAgICAgIGltcG9ydCBzZXR1cHRvb2xzOyBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBlZ2cKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBwa2dfcmVzb3VyY2VzCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gZG9fZG93bmxvYWQoKSAgICAgICAKKyAgICB0cnk6CisgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgic2V0dXB0b29scz49Iit2ZXJzaW9uKTsgcmV0dXJuCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuVmVyc2lvbkNvbmZsaWN0LCBlOgorICAgICAgICBpZiB3YXNfaW1wb3J0ZWQ6CisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgKKyAgICAgICAgICAgICJUaGUgcmVxdWlyZWQgdmVyc2lvbiBvZiBzZXR1cHRvb2xzICg+PSVzKSBpcyBub3QgYXZhaWxhYmxlLCBhbmRcbiIKKyAgICAgICAgICAgICJjYW4ndCBiZSBpbnN0YWxsZWQgd2hpbGUgdGhpcyBzY3JpcHQgaXMgcnVubmluZy4gUGxlYXNlIGluc3RhbGxcbiIKKyAgICAgICAgICAgICIgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIGZpcnN0LCB1c2luZyAnZWFzeV9pbnN0YWxsIC1VIHNldHVwdG9vbHMnLiIKKyAgICAgICAgICAgICJcblxuKEN1cnJlbnRseSB1c2luZyAlcikiCisgICAgICAgICAgICApICUgKHZlcnNpb24sIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uTm90Rm91bmQ6CisgICAgICAgIHBhc3MKKworICAgIGRlbCBwa2dfcmVzb3VyY2VzLCBzeXMubW9kdWxlc1sncGtnX3Jlc291cmNlcyddICAgICMgcmVsb2FkIG9rCisgICAgcmV0dXJuIGRvX2Rvd25sb2FkKCkKKworZGVmIGRvd25sb2FkX3NldHVwdG9vbHMoCisgICAgdmVyc2lvbj1ERUZBVUxUX1ZFUlNJT04sIGRvd25sb2FkX2Jhc2U9REVGQVVMVF9VUkwsIHRvX2Rpcj1vcy5jdXJkaXIsCisgICAgZGVsYXkgPSAxNQorKToKKyAgICAiIiJEb3dubG9hZCBzZXR1cHRvb2xzIGZyb20gYSBzcGVjaWZpZWQgbG9jYXRpb24gYW5kIHJldHVybiBpdHMgZmlsZW5hbWUKKworICAgIGB2ZXJzaW9uYCBzaG91bGQgYmUgYSB2YWxpZCBzZXR1cHRvb2xzIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgYXZhaWxhYmxlCisgICAgYXMgYW4gZWdnIGZvciBkb3dubG9hZCB1bmRlciB0aGUgYGRvd25sb2FkX2Jhc2VgIFVSTCAod2hpY2ggc2hvdWxkIGVuZAorICAgIHdpdGggYSAnLycpLiBgdG9fZGlyYCBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBlZ2cgd2lsbCBiZSBkb3dubG9hZGVkLgorICAgIGBkZWxheWAgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHBhdXNlIGJlZm9yZSBhbiBhY3R1YWwgZG93bmxvYWQgYXR0ZW1wdC4KKyAgICAiIiIKKyAgICBpbXBvcnQgdXJsbGliMiwgc2h1dGlsCisgICAgZWdnX25hbWUgPSAic2V0dXB0b29scy0lcy1weSVzLmVnZyIgJSAodmVyc2lvbixzeXMudmVyc2lvbls6M10pCisgICAgdXJsID0gZG93bmxvYWRfYmFzZSArIGVnZ19uYW1lCisgICAgc2F2ZXRvID0gb3MucGF0aC5qb2luKHRvX2RpciwgZWdnX25hbWUpCisgICAgc3JjID0gZHN0ID0gTm9uZQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzYXZldG8pOiAgIyBBdm9pZCByZXBlYXRlZCBkb3dubG9hZHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworICAgICAgICAgICAgaWYgZGVsYXk6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIiIiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgc2NyaXB0IHJlcXVpcmVzIHNldHVwdG9vbHMgdmVyc2lvbiAlcyB0byBydW4gKGV2ZW4gdG8gZGlzcGxheQoraGVscCkuICBJIHdpbGwgYXR0ZW1wdCB0byBkb3dubG9hZCBpdCBmb3IgeW91IChmcm9tCislcyksIGJ1dAoreW91IG1heSBuZWVkIHRvIGVuYWJsZSBmaXJld2FsbCBhY2Nlc3MgZm9yIHRoaXMgc2NyaXB0IGZpcnN0LgorSSB3aWxsIHN0YXJ0IHRoZSBkb3dubG9hZCBpbiAlZCBzZWNvbmRzLgorCisoTm90ZTogaWYgdGhpcyBtYWNoaW5lIGRvZXMgbm90IGhhdmUgbmV0d29yayBhY2Nlc3MsIHBsZWFzZSBvYnRhaW4gdGhlIGZpbGUKKworICAgJXMKKworYW5kIHBsYWNlIGl0IGluIHRoaXMgZGlyZWN0b3J5IGJlZm9yZSByZXJ1bm5pbmcgdGhpcyBzY3JpcHQuKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiIiLAorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLCBkb3dubG9hZF9iYXNlLCBkZWxheSwgdXJsCisgICAgICAgICAgICAgICAgKTsgZnJvbSB0aW1lIGltcG9ydCBzbGVlcDsgc2xlZXAoZGVsYXkpCisgICAgICAgICAgICBsb2cud2FybigiRG93bmxvYWRpbmcgJXMiLCB1cmwpCisgICAgICAgICAgICBzcmMgPSB1cmxsaWIyLnVybG9wZW4odXJsKQorICAgICAgICAgICAgIyBSZWFkL3dyaXRlIGFsbCBpbiBvbmUgYmxvY2ssIHNvIHdlIGRvbid0IGNyZWF0ZSBhIGNvcnJ1cHQgZmlsZQorICAgICAgICAgICAgIyBpZiB0aGUgZG93bmxvYWQgaXMgaW50ZXJydXB0ZWQuCisgICAgICAgICAgICBkYXRhID0gX3ZhbGlkYXRlX21kNShlZ2dfbmFtZSwgc3JjLnJlYWQoKSkKKyAgICAgICAgICAgIGRzdCA9IG9wZW4oc2F2ZXRvLCJ3YiIpOyBkc3Qud3JpdGUoZGF0YSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNyYzogc3JjLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIGRzdDogZHN0LmNsb3NlKCkKKyAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChzYXZldG8pCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgbWFpbihhcmd2LCB2ZXJzaW9uPURFRkFVTFRfVkVSU0lPTik6CisgICAgIiIiSW5zdGFsbCBvciB1cGdyYWRlIHNldHVwdG9vbHMgYW5kIEVhc3lJbnN0YWxsIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgc2V0dXB0b29scworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgZWdnID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlZ2cgPSBkb3dubG9hZF9zZXR1cHRvb2xzKHZlcnNpb24sIGRlbGF5PTApCisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCxlZ2cpCisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgICAgIHJldHVybiBtYWluKGxpc3QoYXJndikrW2VnZ10pICAgIyB3ZSdyZSBkb25lIGhlcmUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGVnZyBhbmQgb3MucGF0aC5leGlzdHMoZWdnKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZWdnKQorICAgIGVsc2U6CisgICAgICAgIGlmIHNldHVwdG9vbHMuX192ZXJzaW9uX18gPT0gJzAuMC4xJzoKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKAorICAgICAgICAgICAgIllvdSBoYXZlIGFuIG9ic29sZXRlIHZlcnNpb24gb2Ygc2V0dXB0b29scyBpbnN0YWxsZWQuICBQbGVhc2VcbiIKKyAgICAgICAgICAgICJyZW1vdmUgaXQgZnJvbSB5b3VyIHN5c3RlbSBlbnRpcmVseSBiZWZvcmUgcmVydW5uaW5nIHRoaXMgc2NyaXB0LiIKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICByZXEgPSAic2V0dXB0b29scz49Iit2ZXJzaW9uCisgICAgaW1wb3J0IHBrZ19yZXNvdXJjZXMKKyAgICB0cnk6CisgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZShyZXEpCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuVmVyc2lvbkNvbmZsaWN0OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBlYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgbWFpbihsaXN0KGFyZ3YpK1tkb3dubG9hZF9zZXR1cHRvb2xzKGRlbGF5PTApXSkKKyAgICAgICAgc3lzLmV4aXQoMCkgIyB0cnkgdG8gZm9yY2UgYW4gZXhpdAorICAgIGVsc2U6CisgICAgICAgIGlmIGFyZ3Y6CisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgICAgIG1haW4oYXJndikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJTZXR1cHRvb2xzIHZlcnNpb24iLHZlcnNpb24sIm9yIGdyZWF0ZXIgaGFzIGJlZW4gaW5zdGFsbGVkLiIKKyAgICAgICAgICAgIHByaW50ICcoUnVuICJlel9zZXR1cC5weSAtVSBzZXR1cHRvb2xzIiB0byByZWluc3RhbGwgb3IgdXBncmFkZS4pJworCitkZWYgdXBkYXRlX21kNShmaWxlbmFtZXMpOgorICAgICIiIlVwZGF0ZSBvdXIgYnVpbHQtaW4gbWQ1IHJlZ2lzdHJ5IiIiCisKKyAgICBpbXBvcnQgcmUKKworICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUobmFtZSkKKyAgICAgICAgZiA9IG9wZW4obmFtZSwncmInKQorICAgICAgICBtZDVfZGF0YVtiYXNlXSA9IG1kNShmLnJlYWQoKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkYXRhID0gWyIgICAgJXI6ICVyLFxuIiAlIGl0IGZvciBpdCBpbiBtZDVfZGF0YS5pdGVtcygpXQorICAgIGRhdGEuc29ydCgpCisgICAgcmVwbCA9ICIiLmpvaW4oZGF0YSkKKworICAgIGltcG9ydCBpbnNwZWN0CisgICAgc3JjZmlsZSA9IGluc3BlY3QuZ2V0c291cmNlZmlsZShzeXMubW9kdWxlc1tfX25hbWVfX10pCisgICAgZiA9IG9wZW4oc3JjZmlsZSwgJ3JiJyk7IHNyYyA9IGYucmVhZCgpOyBmLmNsb3NlKCkKKworICAgIG1hdGNoID0gcmUuc2VhcmNoKCJcbm1kNV9kYXRhID0ge1xuKFtefV0rKX0iLCBzcmMpCisgICAgaWYgbm90IG1hdGNoOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJJbnRlcm5hbCBlcnJvciEiCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBzcmMgPSBzcmNbOm1hdGNoLnN0YXJ0KDEpXSArIHJlcGwgKyBzcmNbbWF0Y2guZW5kKDEpOl0KKyAgICBmID0gb3BlbihzcmNmaWxlLCd3JykKKyAgICBmLndyaXRlKHNyYykKKyAgICBmLmNsb3NlKCkKKworCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpPjIgYW5kIHN5cy5hcmd2WzFdPT0nLS1tZDV1cGRhdGUnOgorICAgICAgICB1cGRhdGVfbWQ1KHN5cy5hcmd2WzI6XSkKKyAgICBlbHNlOgorICAgICAgICBtYWluKHN5cy5hcmd2WzE6XSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9fX2luaXRfXy5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTQwZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKK19faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5kZWNsYXJlX25hbWVzcGFjZShfX25hbWVfXykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViMTNlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5weQpAQCAtMCwwICsxLDcxMyBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkRlc2NyaXB0b3JzIGVzc2VudGlhbGx5IGNvbnRhaW4gZXhhY3RseSB0aGUgaW5mb3JtYXRpb24gZm91bmQgaW4gYSAucHJvdG8KK2ZpbGUsIGluIHR5cGVzIHRoYXQgbWFrZSB0aGlzIGluZm9ybWF0aW9uIGFjY2Vzc2libGUgaW4gUHl0aG9uLgorIiIiCisKK19fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCisKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorCisKK2lmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ2NwcCc6CisgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5WZXJzaW9uKCkgPT0gMjoKKyAgICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5jcHAgaW1wb3J0IF9tZXNzYWdlCisgIGVsc2U6CisgICAgZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNwcF9tZXNzYWdlCisKKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiQmFzZSBlcnJvciBmb3IgdGhpcyBtb2R1bGUuIiIiCisKKworY2xhc3MgVHlwZVRyYW5zZm9ybWF0aW9uRXJyb3IoRXJyb3IpOgorICAiIiJFcnJvciB0cmFuc2Zvcm1pbmcgYmV0d2VlbiBweXRob24gcHJvdG8gdHlwZSBhbmQgY29ycmVzcG9uZGluZyBDKysgdHlwZS4iIiIKKworCitjbGFzcyBEZXNjcmlwdG9yQmFzZShvYmplY3QpOgorCisgICIiIkRlc2NyaXB0b3JzIGJhc2UgY2xhc3MuCisKKyAgVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBvZiBhbGwgZGVzY3JpcHRvciBjbGFzc2VzLiBJdCBwcm92aWRlcyBjb21tb24gb3B0aW9ucworICByZWxhdGVkIGZ1bmN0aW9uYWlsaXR5LgorCisgIEF0dHJpYnV0ZXM6CisgICAgaGFzX29wdGlvbnM6ICBUcnVlIGlmIHRoZSBkZXNjcmlwdG9yIGhhcyBub24tZGVmYXVsdCBvcHRpb25zLiAgVXN1YWxseSBpdAorICAgICAgICBpcyBub3QgbmVjZXNzYXJ5IHRvIHJlYWQgdGhpcyAtLSBqdXN0IGNhbGwgR2V0T3B0aW9ucygpIHdoaWNoIHdpbGwKKyAgICAgICAgaGFwcGlseSByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2UuICBIb3dldmVyLCBpdCdzIHNvbWV0aW1lcyB1c2VmdWwKKyAgICAgICAgZm9yIGVmZmljaWVuY3ksIGFuZCBhbHNvIHVzZWZ1bCBpbnNpZGUgdGhlIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIHRvCisgICAgICAgIGF2b2lkIHNvbWUgYm9vdHN0cmFwcGluZyBpc3N1ZXMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUpOgorICAgICIiIkluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgZ2l2ZW4gaXRzIG9wdGlvbnMgbWVzc2FnZSBhbmQgdGhlIG5hbWUgb2YgdGhlCisgICAgY2xhc3Mgb2YgdGhlIG9wdGlvbnMgbWVzc2FnZS4gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIHJlcXVpcmVkIGluIGNhc2UKKyAgICB0aGUgb3B0aW9ucyBtZXNzYWdlIGlzIE5vbmUgYW5kIGhhcyB0byBiZSBjcmVhdGVkLgorICAgICIiIgorICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lID0gb3B0aW9uc19jbGFzc19uYW1lCisKKyAgICAjIERvZXMgdGhpcyBkZXNjcmlwdG9yIGhhdmUgbm9uLWRlZmF1bHQgb3B0aW9ucz8KKyAgICBzZWxmLmhhc19vcHRpb25zID0gb3B0aW9ucyBpcyBub3QgTm9uZQorCisgIGRlZiBfU2V0T3B0aW9ucyhzZWxmLCBvcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUpOgorICAgICIiIlNldHMgdGhlIGRlc2NyaXB0b3IncyBvcHRpb25zCisKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gZ2VuZXJhdGVkIHByb3RvMiBmaWxlcyB0byB1cGRhdGUgZGVzY3JpcHRvcgorICAgIG9wdGlvbnMuIEl0IG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBwcm90bzIuCisgICAgIiIiCisgICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnMKKyAgICBzZWxmLl9vcHRpb25zX2NsYXNzX25hbWUgPSBvcHRpb25zX2NsYXNzX25hbWUKKworICAgICMgRG9lcyB0aGlzIGRlc2NyaXB0b3IgaGF2ZSBub24tZGVmYXVsdCBvcHRpb25zPworICAgIHNlbGYuaGFzX29wdGlvbnMgPSBvcHRpb25zIGlzIG5vdCBOb25lCisKKyAgZGVmIEdldE9wdGlvbnMoc2VsZik6CisgICAgIiIiUmV0cmlldmVzIGRlc2NyaXB0b3Igb3B0aW9ucy4KKworICAgIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9wdGlvbnMgc2V0IG9yIGNyZWF0ZXMgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlCisgICAgZGVzY3JpcHRvci4KKyAgICAiIiIKKyAgICBpZiBzZWxmLl9vcHRpb25zOgorICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMKKyAgICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKKyAgICB0cnk6CisgICAgICBvcHRpb25zX2NsYXNzID0gZ2V0YXR0cihkZXNjcmlwdG9yX3BiMiwgc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignVW5rbm93biBvcHRpb25zIGNsYXNzIG5hbWUgJXMhJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX29wdGlvbnNfY2xhc3NfbmFtZSkpCisgICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnNfY2xhc3MoKQorICAgIHJldHVybiBzZWxmLl9vcHRpb25zCisKKworY2xhc3MgX05lc3RlZERlc2NyaXB0b3JCYXNlKERlc2NyaXB0b3JCYXNlKToKKyAgIiIiQ29tbW9uIGNsYXNzIGZvciBkZXNjcmlwdG9ycyB0aGF0IGNhbiBiZSBuZXN0ZWQuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMsIG9wdGlvbnNfY2xhc3NfbmFtZSwgbmFtZSwgZnVsbF9uYW1lLAorICAgICAgICAgICAgICAgZmlsZSwgY29udGFpbmluZ190eXBlLCBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsCisgICAgICAgICAgICAgICBzZXJpYWxpemVkX2VuZD1Ob25lKToKKyAgICAiIiJDb25zdHJ1Y3Rvci4KKworICAgIEFyZ3M6CisgICAgICBvcHRpb25zOiBQcm90b2NvbCBtZXNzYWdlIG9wdGlvbnMgb3IgTm9uZQorICAgICAgICB0byB1c2UgZGVmYXVsdCBtZXNzYWdlIG9wdGlvbnMuCisgICAgICBvcHRpb25zX2NsYXNzX25hbWU6IChzdHIpIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhYm92ZSBvcHRpb25zLgorCisgICAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLgorICAgICAgZnVsbF9uYW1lOiAoc3RyKSBGdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZSwKKyAgICAgICAgd2hpY2ggd2lsbCBpbmNsdWRlIHByb3RvY29sICJwYWNrYWdlIiBuYW1lIGFuZCB0aGUgbmFtZSBvZiBhbnkKKyAgICAgICAgZW5jbG9zaW5nIHR5cGVzLgorICAgICAgZmlsZTogKEZpbGVEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gZmlsZSBpbmZvLgorICAgICAgY29udGFpbmluZ190eXBlOiBpZiBwcm92aWRlZCwgdGhpcyBpcyBhIG5lc3RlZCBkZXNjcmlwdG9yLCB3aXRoIHRoaXMKKyAgICAgICAgZGVzY3JpcHRvciBhcyBwYXJlbnQsIG90aGVyd2lzZSBOb25lLgorICAgICAgc2VyaWFsaXplZF9zdGFydDogVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpIGluIGJsb2NrIGluIHRoZQorICAgICAgICBmaWxlLnNlcmlhbGl6ZWRfcGIgdGhhdCBkZXNjcmliZXMgdGhpcyBkZXNjcmlwdG9yLgorICAgICAgc2VyaWFsaXplZF9lbmQ6IFRoZSBlbmQgaW5kZXggKGV4Y2x1c2l2ZSkgaW4gYmxvY2sgaW4gdGhlCisgICAgICAgIGZpbGUuc2VyaWFsaXplZF9wYiB0aGF0IGRlc2NyaWJlcyB0aGlzIGRlc2NyaXB0b3IuCisgICAgIiIiCisgICAgc3VwZXIoX05lc3RlZERlc2NyaXB0b3JCYXNlLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgb3B0aW9ucywgb3B0aW9uc19jbGFzc19uYW1lKQorCisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICMgVE9ETyhmYWxrKTogQWRkIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBmdWxsX25hbWUgaW5zdGVhZCBvZiBoYXZpbmcgaXQgaW4KKyAgICAjICAgICAgICAgICAgIG1lbW9yeT8KKyAgICBzZWxmLmZ1bGxfbmFtZSA9IGZ1bGxfbmFtZQorICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICBzZWxmLmNvbnRhaW5pbmdfdHlwZSA9IGNvbnRhaW5pbmdfdHlwZQorCisgICAgc2VsZi5fc2VyaWFsaXplZF9zdGFydCA9IHNlcmlhbGl6ZWRfc3RhcnQKKyAgICBzZWxmLl9zZXJpYWxpemVkX2VuZCA9IHNlcmlhbGl6ZWRfZW5kCisKKyAgZGVmIEdldFRvcExldmVsQ29udGFpbmluZ1R5cGUoc2VsZik6CisgICAgIiIiUmV0dXJucyB0aGUgcm9vdCBpZiB0aGlzIGlzIGEgbmVzdGVkIHR5cGUsIG9yIGl0c2VsZiBpZiBpdHMgdGhlIHJvb3QuIiIiCisgICAgZGVzYyA9IHNlbGYKKyAgICB3aGlsZSBkZXNjLmNvbnRhaW5pbmdfdHlwZSBpcyBub3QgTm9uZToKKyAgICAgIGRlc2MgPSBkZXNjLmNvbnRhaW5pbmdfdHlwZQorICAgIHJldHVybiBkZXNjCisKKyAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKKyAgICAiIiJDb3BpZXMgdGhpcyB0byB0aGUgbWF0Y2hpbmcgcHJvdG8gaW4gZGVzY3JpcHRvcl9wYjIuCisKKyAgICBBcmdzOgorICAgICAgcHJvdG86IEFuIGVtcHR5IHByb3RvIGluc3RhbmNlIGZyb20gZGVzY3JpcHRvcl9wYjIuCisKKyAgICBSYWlzZXM6CisgICAgICBFcnJvcjogSWYgc2VsZiBjb3VsZG50IGJlIHNlcmlhbGl6ZWQsIGR1ZSB0byB0byBmZXcgY29uc3RydWN0b3IgYXJndW1lbnRzLgorICAgICIiIgorICAgIGlmIChzZWxmLmZpbGUgaXMgbm90IE5vbmUgYW5kCisgICAgICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQgaXMgbm90IE5vbmUgYW5kCisgICAgICAgIHNlbGYuX3NlcmlhbGl6ZWRfZW5kIGlzIG5vdCBOb25lKToKKyAgICAgIHByb3RvLlBhcnNlRnJvbVN0cmluZyhzZWxmLmZpbGUuc2VyaWFsaXplZF9wYlsKKyAgICAgICAgICBzZWxmLl9zZXJpYWxpemVkX3N0YXJ0OnNlbGYuX3NlcmlhbGl6ZWRfZW5kXSkKKyAgICBlbHNlOgorICAgICAgcmFpc2UgRXJyb3IoJ0Rlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBzZXJpYWxpemF0aW9uLicpCisKKworY2xhc3MgRGVzY3JpcHRvcihfTmVzdGVkRGVzY3JpcHRvckJhc2UpOgorCisgICIiIkRlc2NyaXB0b3IgZm9yIGEgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLgorCisgIEEgRGVzY3JpcHRvciBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorCisgICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZS4KKyAgICBmdWxsX25hbWU6IChzdHIpIEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLAorICAgICAgd2hpY2ggd2lsbCBpbmNsdWRlIHByb3RvY29sICJwYWNrYWdlIiBuYW1lIGFuZCB0aGUgbmFtZSBvZiBhbnkKKyAgICAgIGVuY2xvc2luZyB0eXBlcy4KKworICAgIGNvbnRhaW5pbmdfdHlwZTogKERlc2NyaXB0b3IpIFJlZmVyZW5jZSB0byB0aGUgZGVzY3JpcHRvciBvZiB0aGUKKyAgICAgIHR5cGUgY29udGFpbmluZyB1cywgb3IgTm9uZSBpZiB0aGlzIGlzIHRvcC1sZXZlbC4KKworICAgIGZpZWxkczogKGxpc3Qgb2YgRmllbGREZXNjcmlwdG9ycykgRmllbGQgZGVzY3JpcHRvcnMgZm9yIGFsbAorICAgICAgZmllbGRzIGluIHRoaXMgdHlwZS4KKyAgICBmaWVsZHNfYnlfbnVtYmVyOiAoZGljdCBpbnQgLT4gRmllbGREZXNjcmlwdG9yKSBTYW1lIEZpZWxkRGVzY3JpcHRvcgorICAgICAgb2JqZWN0cyBhcyBpbiB8ZmllbGRzfCwgYnV0IGluZGV4ZWQgYnkgIm51bWJlciIgYXR0cmlidXRlIGluIGVhY2gKKyAgICAgIEZpZWxkRGVzY3JpcHRvci4KKyAgICBmaWVsZHNfYnlfbmFtZTogKGRpY3Qgc3RyIC0+IEZpZWxkRGVzY3JpcHRvcikgU2FtZSBGaWVsZERlc2NyaXB0b3IKKyAgICAgIG9iamVjdHMgYXMgaW4gfGZpZWxkc3wsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUgaW4gZWFjaAorICAgICAgRmllbGREZXNjcmlwdG9yLgorCisgICAgbmVzdGVkX3R5cGVzOiAobGlzdCBvZiBEZXNjcmlwdG9ycykgRGVzY3JpcHRvciByZWZlcmVuY2VzCisgICAgICBmb3IgYWxsIHByb3RvY29sIG1lc3NhZ2UgdHlwZXMgbmVzdGVkIHdpdGhpbiB0aGlzIG9uZS4KKyAgICBuZXN0ZWRfdHlwZXNfYnlfbmFtZTogKGRpY3Qgc3RyIC0+IERlc2NyaXB0b3IpIFNhbWUgRGVzY3JpcHRvcgorICAgICAgb2JqZWN0cyBhcyBpbiB8bmVzdGVkX3R5cGVzfCwgYnV0IGluZGV4ZWQgYnkgIm5hbWUiIGF0dHJpYnV0ZQorICAgICAgaW4gZWFjaCBEZXNjcmlwdG9yLgorCisgICAgZW51bV90eXBlczogKGxpc3Qgb2YgRW51bURlc2NyaXB0b3JzKSBFbnVtRGVzY3JpcHRvciByZWZlcmVuY2VzCisgICAgICBmb3IgYWxsIGVudW1zIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyB0eXBlLgorICAgIGVudW1fdHlwZXNfYnlfbmFtZTogKGRpY3Qgc3RyIC0+RW51bURlc2NyaXB0b3IpIFNhbWUgRW51bURlc2NyaXB0b3IKKyAgICAgIG9iamVjdHMgYXMgaW4gfGVudW1fdHlwZXN8LCBidXQgaW5kZXhlZCBieSAibmFtZSIgYXR0cmlidXRlCisgICAgICBpbiBlYWNoIEVudW1EZXNjcmlwdG9yLgorICAgIGVudW1fdmFsdWVzX2J5X25hbWU6IChkaWN0IHN0ciAtPiBFbnVtVmFsdWVEZXNjcmlwdG9yKSBEaWN0IG1hcHBpbmcKKyAgICAgIGZyb20gZW51bSB2YWx1ZSBuYW1lIHRvIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIHRoYXQgdmFsdWUuCisKKyAgICBleHRlbnNpb25zOiAobGlzdCBvZiBGaWVsZERlc2NyaXB0b3IpIEFsbCBleHRlbnNpb25zIGRlZmluZWQgZGlyZWN0bHkKKyAgICAgIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZSAoTk9UIHdpdGhpbiBhIG5lc3RlZCB0eXBlKS4KKyAgICBleHRlbnNpb25zX2J5X25hbWU6IChkaWN0LCBzdHJpbmcgLT4gRmllbGREZXNjcmlwdG9yKSBTYW1lIEZpZWxkRGVzY3JpcHRvcgorICAgICAgb2JqZWN0cyBhcyB8ZXh0ZW5zaW9uc3wsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUgb2YgZWFjaAorICAgICAgRmllbGREZXNjcmlwdG9yLgorCisgICAgaXNfZXh0ZW5kYWJsZTogIERvZXMgdGhpcyB0eXBlIGRlZmluZSBhbnkgZXh0ZW5zaW9uIHJhbmdlcz8KKworICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5NZXNzYWdlT3B0aW9ucykgUHJvdG9jb2wgbWVzc2FnZSBvcHRpb25zIG9yIE5vbmUKKyAgICAgIHRvIHVzZSBkZWZhdWx0IG1lc3NhZ2Ugb3B0aW9ucy4KKworICAgIGZpbGU6IChGaWxlRGVzY3JpcHRvcikgUmVmZXJlbmNlIHRvIGZpbGUgZGVzY3JpcHRvci4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgZmlsZW5hbWUsIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRzLAorICAgICAgICAgICAgICAgbmVzdGVkX3R5cGVzLCBlbnVtX3R5cGVzLCBleHRlbnNpb25zLCBvcHRpb25zPU5vbmUsCisgICAgICAgICAgICAgICBpc19leHRlbmRhYmxlPVRydWUsIGV4dGVuc2lvbl9yYW5nZXM9Tm9uZSwgZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLCBzZXJpYWxpemVkX2VuZD1Ob25lKToKKyAgICAiIiJBcmd1bWVudHMgdG8gX19pbml0X18oKSBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbgorICAgIG9mIERlc2NyaXB0b3IgZmllbGRzIGFib3ZlLgorCisgICAgTm90ZSB0aGF0IGZpbGVuYW1lIGlzIGFuIG9ic29sZXRlIGFyZ3VtZW50LCB0aGF0IGlzIG5vdCB1c2VkIGFueW1vcmUuCisgICAgUGxlYXNlIHVzZSBmaWxlLm5hbWUgdG8gYWNjZXNzIHRoaXMgYXMgYW4gYXR0cmlidXRlLgorICAgICIiIgorICAgIHN1cGVyKERlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICBvcHRpb25zLCAnTWVzc2FnZU9wdGlvbnMnLCBuYW1lLCBmdWxsX25hbWUsIGZpbGUsCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgc2VyaWFsaXplZF9zdGFydD1zZXJpYWxpemVkX3N0YXJ0LAorICAgICAgICBzZXJpYWxpemVkX2VuZD1zZXJpYWxpemVkX3N0YXJ0KQorCisgICAgIyBXZSBoYXZlIGZpZWxkcyBpbiBhZGRpdGlvbiB0byBmaWVsZHNfYnlfbmFtZSBhbmQgZmllbGRzX2J5X251bWJlciwKKyAgICAjIHNvIHRoYXQ6CisgICAgIyAgIDEuIENsaWVudHMgY2FuIGluZGV4IGZpZWxkcyBieSAib3JkZXIgaW4gd2hpY2ggdGhleSdyZSBsaXN0ZWQuIgorICAgICMgICAyLiBDbGllbnRzIGNhbiBlYXNpbHkgaXRlcmF0ZSBvdmVyIGFsbCBmaWVsZHMgd2l0aCB0aGUgdGVyc2UKKyAgICAjICAgICAgc3ludGF4OiBmb3IgZiBpbiBkZXNjcmlwdG9yLmZpZWxkczogLi4uCisgICAgc2VsZi5maWVsZHMgPSBmaWVsZHMKKyAgICBmb3IgZmllbGQgaW4gc2VsZi5maWVsZHM6CisgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUgPSBzZWxmCisgICAgc2VsZi5maWVsZHNfYnlfbnVtYmVyID0gZGljdCgoZi5udW1iZXIsIGYpIGZvciBmIGluIGZpZWxkcykKKyAgICBzZWxmLmZpZWxkc19ieV9uYW1lID0gZGljdCgoZi5uYW1lLCBmKSBmb3IgZiBpbiBmaWVsZHMpCisKKyAgICBzZWxmLm5lc3RlZF90eXBlcyA9IG5lc3RlZF90eXBlcworICAgIHNlbGYubmVzdGVkX3R5cGVzX2J5X25hbWUgPSBkaWN0KCh0Lm5hbWUsIHQpIGZvciB0IGluIG5lc3RlZF90eXBlcykKKworICAgIHNlbGYuZW51bV90eXBlcyA9IGVudW1fdHlwZXMKKyAgICBmb3IgZW51bV90eXBlIGluIHNlbGYuZW51bV90eXBlczoKKyAgICAgIGVudW1fdHlwZS5jb250YWluaW5nX3R5cGUgPSBzZWxmCisgICAgc2VsZi5lbnVtX3R5cGVzX2J5X25hbWUgPSBkaWN0KCh0Lm5hbWUsIHQpIGZvciB0IGluIGVudW1fdHlwZXMpCisgICAgc2VsZi5lbnVtX3ZhbHVlc19ieV9uYW1lID0gZGljdCgKKyAgICAgICAgKHYubmFtZSwgdikgZm9yIHQgaW4gZW51bV90eXBlcyBmb3IgdiBpbiB0LnZhbHVlcykKKworICAgIHNlbGYuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMKKyAgICBmb3IgZXh0ZW5zaW9uIGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgIGV4dGVuc2lvbi5leHRlbnNpb25fc2NvcGUgPSBzZWxmCisgICAgc2VsZi5leHRlbnNpb25zX2J5X25hbWUgPSBkaWN0KChmLm5hbWUsIGYpIGZvciBmIGluIGV4dGVuc2lvbnMpCisgICAgc2VsZi5pc19leHRlbmRhYmxlID0gaXNfZXh0ZW5kYWJsZQorICAgIHNlbGYuZXh0ZW5zaW9uX3JhbmdlcyA9IGV4dGVuc2lvbl9yYW5nZXMKKworICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQgPSBzZXJpYWxpemVkX3N0YXJ0CisgICAgc2VsZi5fc2VyaWFsaXplZF9lbmQgPSBzZXJpYWxpemVkX2VuZAorCisgIGRlZiBFbnVtVmFsdWVOYW1lKHNlbGYsIGVudW0sIHZhbHVlKToKKyAgICAiIiJSZXR1cm5zIHRoZSBzdHJpbmcgbmFtZSBvZiBhbiBlbnVtIHZhbHVlLgorCisgICAgVGhpcyBpcyBqdXN0IGEgc21hbGwgaGVscGVyIG1ldGhvZCB0byBzaW1wbGlmeSBhIGNvbW1vbiBvcGVyYXRpb24uCisKKyAgICBBcmdzOgorICAgICAgZW51bTogc3RyaW5nIG5hbWUgb2YgdGhlIEVudW0uCisgICAgICB2YWx1ZTogaW50LCB2YWx1ZSBvZiB0aGUgZW51bS4KKworICAgIFJldHVybnM6CisgICAgICBzdHJpbmcgbmFtZSBvZiB0aGUgZW51bSB2YWx1ZS4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yIGlmIGVpdGhlciB0aGUgRW51bSBkb2Vzbid0IGV4aXN0IG9yIHRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZAorICAgICAgICB2YWx1ZSBmb3IgdGhlIGVudW0uCisgICAgIiIiCisgICAgcmV0dXJuIHNlbGYuZW51bV90eXBlc19ieV9uYW1lW2VudW1dLnZhbHVlc19ieV9udW1iZXJbdmFsdWVdLm5hbWUKKworICBkZWYgQ29weVRvUHJvdG8oc2VsZiwgcHJvdG8pOgorICAgICIiIkNvcGllcyB0aGlzIHRvIGEgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8uCisgICAgIiIiCisgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIG92ZXJyaWRlbiB0byBnaXZlIGEgYmV0dGVyIGRvYyBjb21tZW50LgorICAgIHN1cGVyKERlc2NyaXB0b3IsIHNlbGYpLkNvcHlUb1Byb3RvKHByb3RvKQorCisKKyMgVE9ETyhyb2JpbnNvbik6IFdlIHNob3VsZCBoYXZlIGFnZ3Jlc3NpdmUgY2hlY2tpbmcgaGVyZSwKKyMgZm9yIGV4YW1wbGU6CisjICAgKiBJZiB5b3Ugc3BlY2lmeSBhIHJlcGVhdGVkIGZpZWxkLCB5b3Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkCisjICAgICB0byBzcGVjaWZ5IGEgZGVmYXVsdCB2YWx1ZS4KKyMgICAqIFtPdGhlciBleGFtcGxlcyBoZXJlIGFzIG5lZWRlZF0uCisjCisjIFRPRE8ocm9iaW5zb24pOiBmb3IgdGhpcyBhbmQgb3RoZXIgKkRlc2NyaXB0b3IgY2xhc3Nlcywgd2UKKyMgbWlnaHQgYWxzbyB3YW50IHRvIGxvY2sgdGhpbmdzIGRvd24gYWdncmVzc2l2ZWx5IChlLmcuLAorIyBwcmV2ZW50IGNsaWVudHMgZnJvbSBzZXR0aW5nIHRoZSBhdHRyaWJ1dGVzKS4gIEhhdmluZworIyBzdHJvbmdlciBpbnZhcmlhbnRzIGhlcmUgaW4gZ2VuZXJhbCB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyCisjIG9mIHJ1bnRpbWUgY2hlY2tzIHdlIG11c3QgZG8gaW4gcmVmbGVjdGlvbi5weS4uLgorY2xhc3MgRmllbGREZXNjcmlwdG9yKERlc2NyaXB0b3JCYXNlKToKKworICAiIiJEZXNjcmlwdG9yIGZvciBhIHNpbmdsZSBmaWVsZCBpbiBhIC5wcm90byBmaWxlLgorCisgIEEgRmllbGREZXNjcmlwdG9yIGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgZmllbGQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiAucHJvdG8uCisgICAgZnVsbF9uYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgZmllbGQsIGluY2x1ZGluZyBjb250YWluaW5nIHNjb3BlLiAgVGhpcyBpcworICAgICAgcGFydGljdWxhcmx5IHJlbGV2YW50IGZvciBleHRlbnNpb25zLgorICAgIGluZGV4OiAoaW50KSBEZW5zZSwgMC1pbmRleGVkIGluZGV4IGdpdmluZyB0aGUgb3JkZXIgdGhhdCB0aGlzCisgICAgICBmaWVsZCB0ZXh0dWFsbHkgYXBwZWFycyB3aXRoaW4gaXRzIG1lc3NhZ2UgaW4gdGhlIC5wcm90byBmaWxlLgorICAgIG51bWJlcjogKGludCkgVGFnIG51bWJlciBkZWNsYXJlZCBmb3IgdGhpcyBmaWVsZCBpbiB0aGUgLnByb3RvIGZpbGUuCisKKyAgICB0eXBlOiAoT25lIG9mIHRoZSBUWVBFXyogY29uc3RhbnRzIGJlbG93KSBEZWNsYXJlZCB0eXBlLgorICAgIGNwcF90eXBlOiAoT25lIG9mIHRoZSBDUFBUWVBFXyogY29uc3RhbnRzIGJlbG93KSBDKysgdHlwZSB1c2VkIHRvCisgICAgICByZXByZXNlbnQgdGhpcyBmaWVsZC4KKworICAgIGxhYmVsOiAoT25lIG9mIHRoZSBMQUJFTF8qIGNvbnN0YW50cyBiZWxvdykgVGVsbHMgd2hldGhlciB0aGlzCisgICAgICBmaWVsZCBpcyBvcHRpb25hbCwgcmVxdWlyZWQsIG9yIHJlcGVhdGVkLgorICAgIGhhc19kZWZhdWx0X3ZhbHVlOiAoYm9vbCkgVHJ1ZSBpZiB0aGlzIGZpZWxkIGhhcyBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZCwKKyAgICAgIG90aGVyd2lzZSBmYWxzZS4KKyAgICBkZWZhdWx0X3ZhbHVlOiAoVmFyaWVzKSBEZWZhdWx0IHZhbHVlIG9mIHRoaXMgZmllbGQuICBPbmx5CisgICAgICBtZWFuaW5nZnVsIGZvciBub24tcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcy4gIFJlcGVhdGVkIGZpZWxkcworICAgICAgc2hvdWxkIGFsd2F5cyBzZXQgdGhpcyB0byBbXSwgYW5kIG5vbi1yZXBlYXRlZCBjb21wb3NpdGUKKyAgICAgIGZpZWxkcyBzaG91bGQgYWx3YXlzIHNldCB0aGlzIHRvIE5vbmUuCisKKyAgICBjb250YWluaW5nX3R5cGU6IChEZXNjcmlwdG9yKSBEZXNjcmlwdG9yIG9mIHRoZSBwcm90b2NvbCBtZXNzYWdlCisgICAgICB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gIFNldCBieSB0aGUgRGVzY3JpcHRvciBjb25zdHJ1Y3RvcgorICAgICAgaWYgd2UncmUgcGFzc2VkIGludG8gb25lLgorICAgICAgU29tZXdoYXQgY29uZnVzaW5nbHksIGZvciBleHRlbnNpb24gZmllbGRzLCB0aGlzIGlzIHRoZQorICAgICAgZGVzY3JpcHRvciBvZiB0aGUgRVhURU5ERUQgbWVzc2FnZSwgbm90IHRoZSBkZXNjcmlwdG9yCisgICAgICBvZiB0aGUgbWVzc2FnZSBjb250YWluaW5nIHRoaXMgZmllbGQuICAoU2VlIGlzX2V4dGVuc2lvbiBhbmQKKyAgICAgIGV4dGVuc2lvbl9zY29wZSBiZWxvdykuCisgICAgbWVzc2FnZV90eXBlOiAoRGVzY3JpcHRvcikgSWYgYSBjb21wb3NpdGUgZmllbGQsIGEgZGVzY3JpcHRvcgorICAgICAgb2YgdGhlIG1lc3NhZ2UgdHlwZSBjb250YWluZWQgaW4gdGhpcyBmaWVsZC4gIE90aGVyd2lzZSwgdGhpcyBpcyBOb25lLgorICAgIGVudW1fdHlwZTogKEVudW1EZXNjcmlwdG9yKSBJZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGFuIGVudW0sIGEKKyAgICAgIGRlc2NyaXB0b3Igb2YgdGhhdCBlbnVtLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIE5vbmUuCisKKyAgICBpc19leHRlbnNpb246IFRydWUgaWZmIHRoaXMgZGVzY3JpYmVzIGFuIGV4dGVuc2lvbiBmaWVsZC4KKyAgICBleHRlbnNpb25fc2NvcGU6IChEZXNjcmlwdG9yKSBPbmx5IG1lYW5pbmdmdWwgaWYgaXNfZXh0ZW5zaW9uIGlzIFRydWUuCisgICAgICBHaXZlcyB0aGUgbWVzc2FnZSB0aGF0IGltbWVkaWF0ZWx5IGNvbnRhaW5zIHRoaXMgZXh0ZW5zaW9uIGZpZWxkLgorICAgICAgV2lsbCBiZSBOb25lIGlmZiB3ZSdyZSBhIHRvcC1sZXZlbCAoZmlsZS1sZXZlbCkgZXh0ZW5zaW9uIGZpZWxkLgorCisgICAgb3B0aW9uczogKGRlc2NyaXB0b3JfcGIyLkZpZWxkT3B0aW9ucykgUHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBvcHRpb25zIG9yCisgICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IGZpZWxkIG9wdGlvbnMuCisgICIiIgorCisgICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggQysrIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSBlbnVtIGluCisgICMgZGVzY3JpcHRvci5oLgorICAjCisgICMgVE9ETyhyb2JpbnNvbik6IEZpbmQgYSB3YXkgdG8gZWxpbWluYXRlIHRoaXMgcmVwZXRpdGlvbi4KKyAgVFlQRV9ET1VCTEUgICAgICAgICA9IDEKKyAgVFlQRV9GTE9BVCAgICAgICAgICA9IDIKKyAgVFlQRV9JTlQ2NCAgICAgICAgICA9IDMKKyAgVFlQRV9VSU5UNjQgICAgICAgICA9IDQKKyAgVFlQRV9JTlQzMiAgICAgICAgICA9IDUKKyAgVFlQRV9GSVhFRDY0ICAgICAgICA9IDYKKyAgVFlQRV9GSVhFRDMyICAgICAgICA9IDcKKyAgVFlQRV9CT09MICAgICAgICAgICA9IDgKKyAgVFlQRV9TVFJJTkcgICAgICAgICA9IDkKKyAgVFlQRV9HUk9VUCAgICAgICAgICA9IDEwCisgIFRZUEVfTUVTU0FHRSAgICAgICAgPSAxMQorICBUWVBFX0JZVEVTICAgICAgICAgID0gMTIKKyAgVFlQRV9VSU5UMzIgICAgICAgICA9IDEzCisgIFRZUEVfRU5VTSAgICAgICAgICAgPSAxNAorICBUWVBFX1NGSVhFRDMyICAgICAgID0gMTUKKyAgVFlQRV9TRklYRUQ2NCAgICAgICA9IDE2CisgIFRZUEVfU0lOVDMyICAgICAgICAgPSAxNworICBUWVBFX1NJTlQ2NCAgICAgICAgID0gMTgKKyAgTUFYX1RZUEUgICAgICAgICAgICA9IDE4CisKKyAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBDKysgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGVudW0gaW4KKyAgIyBkZXNjcmlwdG9yLmguCisgICMKKyAgIyBUT0RPKHJvYmluc29uKTogRmluZCBhIHdheSB0byBlbGltaW5hdGUgdGhpcyByZXBldGl0aW9uLgorICBDUFBUWVBFX0lOVDMyICAgICAgID0gMQorICBDUFBUWVBFX0lOVDY0ICAgICAgID0gMgorICBDUFBUWVBFX1VJTlQzMiAgICAgID0gMworICBDUFBUWVBFX1VJTlQ2NCAgICAgID0gNAorICBDUFBUWVBFX0RPVUJMRSAgICAgID0gNQorICBDUFBUWVBFX0ZMT0FUICAgICAgID0gNgorICBDUFBUWVBFX0JPT0wgICAgICAgID0gNworICBDUFBUWVBFX0VOVU0gICAgICAgID0gOAorICBDUFBUWVBFX1NUUklORyAgICAgID0gOQorICBDUFBUWVBFX01FU1NBR0UgICAgID0gMTAKKyAgTUFYX0NQUFRZUEUgICAgICAgICA9IDEwCisKKyAgX1BZVEhPTl9UT19DUFBfUFJPVE9fVFlQRV9NQVAgPSB7CisgICAgICBUWVBFX0RPVUJMRTogQ1BQVFlQRV9ET1VCTEUsCisgICAgICBUWVBFX0ZMT0FUOiBDUFBUWVBFX0ZMT0FULAorICAgICAgVFlQRV9FTlVNOiBDUFBUWVBFX0VOVU0sCisgICAgICBUWVBFX0lOVDY0OiBDUFBUWVBFX0lOVDY0LAorICAgICAgVFlQRV9TSU5UNjQ6IENQUFRZUEVfSU5UNjQsCisgICAgICBUWVBFX1NGSVhFRDY0OiBDUFBUWVBFX0lOVDY0LAorICAgICAgVFlQRV9VSU5UNjQ6IENQUFRZUEVfVUlOVDY0LAorICAgICAgVFlQRV9GSVhFRDY0OiBDUFBUWVBFX1VJTlQ2NCwKKyAgICAgIFRZUEVfSU5UMzI6IENQUFRZUEVfSU5UMzIsCisgICAgICBUWVBFX1NGSVhFRDMyOiBDUFBUWVBFX0lOVDMyLAorICAgICAgVFlQRV9TSU5UMzI6IENQUFRZUEVfSU5UMzIsCisgICAgICBUWVBFX1VJTlQzMjogQ1BQVFlQRV9VSU5UMzIsCisgICAgICBUWVBFX0ZJWEVEMzI6IENQUFRZUEVfVUlOVDMyLAorICAgICAgVFlQRV9CWVRFUzogQ1BQVFlQRV9TVFJJTkcsCisgICAgICBUWVBFX1NUUklORzogQ1BQVFlQRV9TVFJJTkcsCisgICAgICBUWVBFX0JPT0w6IENQUFRZUEVfQk9PTCwKKyAgICAgIFRZUEVfTUVTU0FHRTogQ1BQVFlQRV9NRVNTQUdFLAorICAgICAgVFlQRV9HUk9VUDogQ1BQVFlQRV9NRVNTQUdFCisgICAgICB9CisKKyAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBDKysgRmllbGREZXNjcmlwdG9yOjpMYWJlbCBlbnVtIGluCisgICMgZGVzY3JpcHRvci5oLgorICAjCisgICMgVE9ETyhyb2JpbnNvbik6IEZpbmQgYSB3YXkgdG8gZWxpbWluYXRlIHRoaXMgcmVwZXRpdGlvbi4KKyAgTEFCRUxfT1BUSU9OQUwgICAgICA9IDEKKyAgTEFCRUxfUkVRVUlSRUQgICAgICA9IDIKKyAgTEFCRUxfUkVQRUFURUQgICAgICA9IDMKKyAgTUFYX0xBQkVMICAgICAgICAgICA9IDMKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgbnVtYmVyLCB0eXBlLCBjcHBfdHlwZSwgbGFiZWwsCisgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlLCBtZXNzYWdlX3R5cGUsIGVudW1fdHlwZSwgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uLCBleHRlbnNpb25fc2NvcGUsIG9wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUpOgorICAgICIiIlRoZSBhcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgRmllbGREZXNjcmlwdG9yCisgICAgYXR0cmlidXRlcyBhYm92ZS4KKworICAgIE5vdGUgdGhhdCBjb250YWluaW5nX3R5cGUgbWF5IGJlIE5vbmUsIGFuZCBtYXkgYmUgc2V0IGxhdGVyIGlmIG5lY2Vzc2FyeQorICAgICh0byBkZWFsIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIG1lc3NhZ2UgdHlwZXMsIGZvciBleGFtcGxlKS4KKyAgICBMaWtld2lzZSBmb3IgZXh0ZW5zaW9uX3Njb3BlLgorICAgICIiIgorICAgIHN1cGVyKEZpZWxkRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18ob3B0aW9ucywgJ0ZpZWxkT3B0aW9ucycpCisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYuZnVsbF9uYW1lID0gZnVsbF9uYW1lCisgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgc2VsZi5udW1iZXIgPSBudW1iZXIKKyAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgc2VsZi5jcHBfdHlwZSA9IGNwcF90eXBlCisgICAgc2VsZi5sYWJlbCA9IGxhYmVsCisgICAgc2VsZi5oYXNfZGVmYXVsdF92YWx1ZSA9IGhhc19kZWZhdWx0X3ZhbHVlCisgICAgc2VsZi5kZWZhdWx0X3ZhbHVlID0gZGVmYXVsdF92YWx1ZQorICAgIHNlbGYuY29udGFpbmluZ190eXBlID0gY29udGFpbmluZ190eXBlCisgICAgc2VsZi5tZXNzYWdlX3R5cGUgPSBtZXNzYWdlX3R5cGUKKyAgICBzZWxmLmVudW1fdHlwZSA9IGVudW1fdHlwZQorICAgIHNlbGYuaXNfZXh0ZW5zaW9uID0gaXNfZXh0ZW5zaW9uCisgICAgc2VsZi5leHRlbnNpb25fc2NvcGUgPSBleHRlbnNpb25fc2NvcGUKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgorICAgICAgaWYgaXNfZXh0ZW5zaW9uOgorICAgICAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVmVyc2lvbigpID09IDI6CisgICAgICAgICAgc2VsZi5fY2Rlc2NyaXB0b3IgPSBfbWVzc2FnZS5HZXRFeHRlbnNpb25EZXNjcmlwdG9yKGZ1bGxfbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBzZWxmLl9jZGVzY3JpcHRvciA9IGNwcF9tZXNzYWdlLkdldEV4dGVuc2lvbkRlc2NyaXB0b3IoZnVsbF9uYW1lKQorICAgICAgZWxzZToKKyAgICAgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlZlcnNpb24oKSA9PSAyOgorICAgICAgICAgIHNlbGYuX2NkZXNjcmlwdG9yID0gX21lc3NhZ2UuR2V0RmllbGREZXNjcmlwdG9yKGZ1bGxfbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBzZWxmLl9jZGVzY3JpcHRvciA9IGNwcF9tZXNzYWdlLkdldEZpZWxkRGVzY3JpcHRvcihmdWxsX25hbWUpCisgICAgZWxzZToKKyAgICAgIHNlbGYuX2NkZXNjcmlwdG9yID0gTm9uZQorCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIFByb3RvVHlwZVRvQ3BwUHJvdG9UeXBlKHByb3RvX3R5cGUpOgorICAgICIiIkNvbnZlcnRzIGZyb20gYSBQeXRob24gcHJvdG8gdHlwZSB0byBhIEMrKyBQcm90byBUeXBlLgorCisgICAgVGhlIFB5dGhvbiBQcm90b2NvbEJ1ZmZlciBjbGFzc2VzIHNwZWNpZnkgYm90aCB0aGUgJ1B5dGhvbicgZGF0YXR5cGUgYW5kIHRoZQorICAgICdDKysnIGRhdGF0eXBlIC0gYW5kIHRoZXkncmUgbm90IHRoZSBzYW1lLiBUaGlzIGhlbHBlciBtZXRob2Qgc2hvdWxkCisgICAgdHJhbnNsYXRlIGZyb20gb25lIHRvIGFub3RoZXIuCisKKyAgICBBcmdzOgorICAgICAgcHJvdG9fdHlwZTogdGhlIFB5dGhvbiBwcm90byB0eXBlIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFXyopCisgICAgUmV0dXJuczoKKyAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfKiwgdGhlIEMrKyB0eXBlLgorICAgIFJhaXNlczoKKyAgICAgIFR5cGVUcmFuc2Zvcm1hdGlvbkVycm9yOiB3aGVuIHRoZSBQeXRob24gcHJvdG8gdHlwZSBpc24ndCBrbm93bi4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yLl9QWVRIT05fVE9fQ1BQX1BST1RPX1RZUEVfTUFQW3Byb3RvX3R5cGVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcmFpc2UgVHlwZVRyYW5zZm9ybWF0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9fdHlwZTogJXMnICUgcHJvdG9fdHlwZSkKKworCitjbGFzcyBFbnVtRGVzY3JpcHRvcihfTmVzdGVkRGVzY3JpcHRvckJhc2UpOgorCisgICIiIkRlc2NyaXB0b3IgZm9yIGFuIGVudW0gZGVmaW5lZCBpbiBhIC5wcm90byBmaWxlLgorCisgIEFuIEVudW1EZXNjcmlwdG9yIGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoZSBlbnVtIHR5cGUuCisgICAgZnVsbF9uYW1lOiAoc3RyKSBGdWxsIG5hbWUgb2YgdGhlIHR5cGUsIGluY2x1ZGluZyBwYWNrYWdlIG5hbWUKKyAgICAgIGFuZCBhbnkgZW5jbG9zaW5nIHR5cGUocykuCisKKyAgICB2YWx1ZXM6IChsaXN0IG9mIEVudW1WYWx1ZURlc2NyaXB0b3JzKSBMaXN0IG9mIHRoZSB2YWx1ZXMKKyAgICAgIGluIHRoaXMgZW51bS4KKyAgICB2YWx1ZXNfYnlfbmFtZTogKGRpY3Qgc3RyIC0+IEVudW1WYWx1ZURlc2NyaXB0b3IpIFNhbWUgYXMgfHZhbHVlc3wsCisgICAgICBidXQgaW5kZXhlZCBieSB0aGUgIm5hbWUiIGZpZWxkIG9mIGVhY2ggRW51bVZhbHVlRGVzY3JpcHRvci4KKyAgICB2YWx1ZXNfYnlfbnVtYmVyOiAoZGljdCBpbnQgLT4gRW51bVZhbHVlRGVzY3JpcHRvcikgU2FtZSBhcyB8dmFsdWVzfCwKKyAgICAgIGJ1dCBpbmRleGVkIGJ5IHRoZSAibnVtYmVyIiBmaWVsZCBvZiBlYWNoIEVudW1WYWx1ZURlc2NyaXB0b3IuCisgICAgY29udGFpbmluZ190eXBlOiAoRGVzY3JpcHRvcikgRGVzY3JpcHRvciBvZiB0aGUgaW1tZWRpYXRlIGNvbnRhaW5pbmcKKyAgICAgIHR5cGUgb2YgdGhpcyBlbnVtLCBvciBOb25lIGlmIHRoaXMgaXMgYW4gZW51bSBkZWZpbmVkIGF0IHRoZQorICAgICAgdG9wIGxldmVsIGluIGEgLnByb3RvIGZpbGUuICBTZXQgYnkgRGVzY3JpcHRvcidzIGNvbnN0cnVjdG9yCisgICAgICBpZiB3ZSdyZSBwYXNzZWQgaW50byBvbmUuCisgICAgZmlsZTogKEZpbGVEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gZmlsZSBkZXNjcmlwdG9yLgorICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5FbnVtT3B0aW9ucykgRW51bSBvcHRpb25zIG1lc3NhZ2Ugb3IKKyAgICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgZW51bSBvcHRpb25zLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBmaWxlbmFtZSwgdmFsdWVzLAorICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIG9wdGlvbnM9Tm9uZSwgZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLCBzZXJpYWxpemVkX2VuZD1Ob25lKToKKyAgICAiIiJBcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlLgorCisgICAgTm90ZSB0aGF0IGZpbGVuYW1lIGlzIGFuIG9ic29sZXRlIGFyZ3VtZW50LCB0aGF0IGlzIG5vdCB1c2VkIGFueW1vcmUuCisgICAgUGxlYXNlIHVzZSBmaWxlLm5hbWUgdG8gYWNjZXNzIHRoaXMgYXMgYW4gYXR0cmlidXRlLgorICAgICIiIgorICAgIHN1cGVyKEVudW1EZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgb3B0aW9ucywgJ0VudW1PcHRpb25zJywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlLAorICAgICAgICBjb250YWluaW5nX3R5cGUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKKyAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9zdGFydCkKKworICAgIHNlbGYudmFsdWVzID0gdmFsdWVzCisgICAgZm9yIHZhbHVlIGluIHNlbGYudmFsdWVzOgorICAgICAgdmFsdWUudHlwZSA9IHNlbGYKKyAgICBzZWxmLnZhbHVlc19ieV9uYW1lID0gZGljdCgodi5uYW1lLCB2KSBmb3IgdiBpbiB2YWx1ZXMpCisgICAgc2VsZi52YWx1ZXNfYnlfbnVtYmVyID0gZGljdCgodi5udW1iZXIsIHYpIGZvciB2IGluIHZhbHVlcykKKworICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQgPSBzZXJpYWxpemVkX3N0YXJ0CisgICAgc2VsZi5fc2VyaWFsaXplZF9lbmQgPSBzZXJpYWxpemVkX2VuZAorCisgIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6CisgICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvLgorICAgICIiIgorICAgICMgVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZW4gdG8gZ2l2ZSBhIGJldHRlciBkb2MgY29tbWVudC4KKyAgICBzdXBlcihFbnVtRGVzY3JpcHRvciwgc2VsZikuQ29weVRvUHJvdG8ocHJvdG8pCisKKworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBzaW5nbGUgdmFsdWUgd2l0aGluIGFuIGVudW0uCisKKyAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgdmFsdWUuCisgICAgaW5kZXg6IChpbnQpIERlbnNlLCAwLWluZGV4ZWQgaW5kZXggZ2l2aW5nIHRoZSBvcmRlciB0aGF0IHRoaXMKKyAgICAgIHZhbHVlIGFwcGVhcnMgdGV4dHVhbGx5IHdpdGhpbiBpdHMgZW51bSBpbiB0aGUgLnByb3RvIGZpbGUuCisgICAgbnVtYmVyOiAoaW50KSBBY3R1YWwgbnVtYmVyIGFzc2lnbmVkIHRvIHRoaXMgZW51bSB2YWx1ZS4KKyAgICB0eXBlOiAoRW51bURlc2NyaXB0b3IpIEVudW1EZXNjcmlwdG9yIHRvIHdoaWNoIHRoaXMgdmFsdWUKKyAgICAgIGJlbG9uZ3MuICBTZXQgYnkgRW51bURlc2NyaXB0b3IncyBjb25zdHJ1Y3RvciBpZiB3ZSdyZQorICAgICAgcGFzc2VkIGludG8gb25lLgorICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5FbnVtVmFsdWVPcHRpb25zKSBFbnVtIHZhbHVlIG9wdGlvbnMgbWVzc2FnZSBvcgorICAgICAgTm9uZSB0byB1c2UgZGVmYXVsdCBlbnVtIHZhbHVlIG9wdGlvbnMgb3B0aW9ucy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGluZGV4LCBudW1iZXIsIHR5cGU9Tm9uZSwgb3B0aW9ucz1Ob25lKToKKyAgICAiIiJBcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlLiIiIgorICAgIHN1cGVyKEVudW1WYWx1ZURlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMsICdFbnVtVmFsdWVPcHRpb25zJykKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgc2VsZi5udW1iZXIgPSBudW1iZXIKKyAgICBzZWxmLnR5cGUgPSB0eXBlCisKKworY2xhc3MgU2VydmljZURlc2NyaXB0b3IoX05lc3RlZERlc2NyaXB0b3JCYXNlKToKKworICAiIiJEZXNjcmlwdG9yIGZvciBhIHNlcnZpY2UuCisKKyAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoZSBzZXJ2aWNlLgorICAgIGZ1bGxfbmFtZTogKHN0cikgRnVsbCBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lLgorICAgIGluZGV4OiAoaW50KSAwLWluZGV4ZWQgaW5kZXggZ2l2aW5nIHRoZSBvcmRlciB0aGF0IHRoaXMgc2VydmljZXMKKyAgICAgIGRlZmluaXRpb24gYXBwZWFycyB3aXRoaW5nIHRoZSAucHJvdG8gZmlsZS4KKyAgICBtZXRob2RzOiAobGlzdCBvZiBNZXRob2REZXNjcmlwdG9yKSBMaXN0IG9mIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhpcworICAgICAgc2VydmljZS4KKyAgICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuU2VydmljZU9wdGlvbnMpIFNlcnZpY2Ugb3B0aW9ucyBtZXNzYWdlIG9yCisgICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IHNlcnZpY2Ugb3B0aW9ucy4KKyAgICBmaWxlOiAoRmlsZURlc2NyaXB0b3IpIFJlZmVyZW5jZSB0byBmaWxlIGluZm8uCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmdWxsX25hbWUsIGluZGV4LCBtZXRob2RzLCBvcHRpb25zPU5vbmUsIGZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwgc2VyaWFsaXplZF9lbmQ9Tm9uZSk6CisgICAgc3VwZXIoU2VydmljZURlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICBvcHRpb25zLCAnU2VydmljZU9wdGlvbnMnLCBuYW1lLCBmdWxsX25hbWUsIGZpbGUsCisgICAgICAgIE5vbmUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKKyAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9lbmQpCisgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgc2VsZi5tZXRob2RzID0gbWV0aG9kcworICAgICMgU2V0IHRoZSBjb250YWluaW5nIHNlcnZpY2UgZm9yIGVhY2ggbWV0aG9kIGluIHRoaXMgc2VydmljZS4KKyAgICBmb3IgbWV0aG9kIGluIHNlbGYubWV0aG9kczoKKyAgICAgIG1ldGhvZC5jb250YWluaW5nX3NlcnZpY2UgPSBzZWxmCisKKyAgZGVmIEZpbmRNZXRob2RCeU5hbWUoc2VsZiwgbmFtZSk6CisgICAgIiIiU2VhcmNoZXMgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLCBhbmQgcmV0dXJucyBpdHMgZGVzY3JpcHRvci4iIiIKKyAgICBmb3IgbWV0aG9kIGluIHNlbGYubWV0aG9kczoKKyAgICAgIGlmIG5hbWUgPT0gbWV0aG9kLm5hbWU6CisgICAgICAgIHJldHVybiBtZXRob2QKKyAgICByZXR1cm4gTm9uZQorCisgIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6CisgICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLgorICAgICIiIgorICAgICMgVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZW4gdG8gZ2l2ZSBhIGJldHRlciBkb2MgY29tbWVudC4KKyAgICBzdXBlcihTZXJ2aWNlRGVzY3JpcHRvciwgc2VsZikuQ29weVRvUHJvdG8ocHJvdG8pCisKKworY2xhc3MgTWV0aG9kRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBtZXRob2QgaW4gYSBzZXJ2aWNlLgorCisgIG5hbWU6IChzdHIpIE5hbWUgb2YgdGhlIG1ldGhvZCB3aXRoaW4gdGhlIHNlcnZpY2UuCisgIGZ1bGxfbmFtZTogKHN0cikgRnVsbCBuYW1lIG9mIG1ldGhvZC4KKyAgaW5kZXg6IChpbnQpIDAtaW5kZXhlZCBpbmRleCBvZiB0aGUgbWV0aG9kIGluc2lkZSB0aGUgc2VydmljZS4KKyAgY29udGFpbmluZ19zZXJ2aWNlOiAoU2VydmljZURlc2NyaXB0b3IpIFRoZSBzZXJ2aWNlIHRoYXQgY29udGFpbnMgdGhpcworICAgIG1ldGhvZC4KKyAgaW5wdXRfdHlwZTogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIG1ldGhvZCBhY2NlcHRzLgorICBvdXRwdXRfdHlwZTogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zLgorICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuTWV0aG9kT3B0aW9ucykgTWV0aG9kIG9wdGlvbnMgbWVzc2FnZSBvcgorICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgbWV0aG9kIG9wdGlvbnMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmdWxsX25hbWUsIGluZGV4LCBjb250YWluaW5nX3NlcnZpY2UsCisgICAgICAgICAgICAgICBpbnB1dF90eXBlLCBvdXRwdXRfdHlwZSwgb3B0aW9ucz1Ob25lKToKKyAgICAiIiJUaGUgYXJndW1lbnRzIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uIG9mIE1ldGhvZERlc2NyaXB0b3IKKyAgICBhdHRyaWJ1dGVzIGFib3ZlLgorCisgICAgTm90ZSB0aGF0IGNvbnRhaW5pbmdfc2VydmljZSBtYXkgYmUgTm9uZSwgYW5kIG1heSBiZSBzZXQgbGF0ZXIgaWYgbmVjZXNzYXJ5LgorICAgICIiIgorICAgIHN1cGVyKE1ldGhvZERlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMsICdNZXRob2RPcHRpb25zJykKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5mdWxsX25hbWUgPSBmdWxsX25hbWUKKyAgICBzZWxmLmluZGV4ID0gaW5kZXgKKyAgICBzZWxmLmNvbnRhaW5pbmdfc2VydmljZSA9IGNvbnRhaW5pbmdfc2VydmljZQorICAgIHNlbGYuaW5wdXRfdHlwZSA9IGlucHV0X3R5cGUKKyAgICBzZWxmLm91dHB1dF90eXBlID0gb3V0cHV0X3R5cGUKKworCitjbGFzcyBGaWxlRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6CisgICIiIkRlc2NyaXB0b3IgZm9yIGEgZmlsZS4gTWltaWNzIHRoZSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLgorCisgIG5hbWU6IG5hbWUgb2YgZmlsZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZS4KKyAgcGFja2FnZTogbmFtZSBvZiB0aGUgcGFja2FnZQorICBzZXJpYWxpemVkX3BiOiAoc3RyKSBCeXRlIHN0cmluZyBvZiBzZXJpYWxpemVkCisgICAgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHBhY2thZ2UsIG9wdGlvbnM9Tm9uZSwgc2VyaWFsaXplZF9wYj1Ob25lKToKKyAgICAiIiJDb25zdHJ1Y3Rvci4iIiIKKyAgICBzdXBlcihGaWxlRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18ob3B0aW9ucywgJ0ZpbGVPcHRpb25zJykKKworICAgIHNlbGYubWVzc2FnZV90eXBlc19ieV9uYW1lID0ge30KKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5wYWNrYWdlID0gcGFja2FnZQorICAgIHNlbGYuc2VyaWFsaXplZF9wYiA9IHNlcmlhbGl6ZWRfcGIKKyAgICBpZiAoYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJyBhbmQKKyAgICAgICAgc2VsZi5zZXJpYWxpemVkX3BiIGlzIG5vdCBOb25lKToKKyAgICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5WZXJzaW9uKCkgPT0gMjoKKyAgICAgICAgX21lc3NhZ2UuQnVpbGRGaWxlKHNlbGYuc2VyaWFsaXplZF9wYikKKyAgICAgIGVsc2U6CisgICAgICAgIGNwcF9tZXNzYWdlLkJ1aWxkRmlsZShzZWxmLnNlcmlhbGl6ZWRfcGIpCisKKyAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKKyAgICAiIiJDb3BpZXMgdGhpcyB0byBhIGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uCisKKyAgICBBcmdzOgorICAgICAgcHJvdG86IEFuIGVtcHR5IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uCisgICAgIiIiCisgICAgcHJvdG8uUGFyc2VGcm9tU3RyaW5nKHNlbGYuc2VyaWFsaXplZF9wYikKKworCitkZWYgX1BhcnNlT3B0aW9ucyhtZXNzYWdlLCBzdHJpbmcpOgorICAiIiJQYXJzZXMgc2VyaWFsaXplZCBvcHRpb25zLgorCisgIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFyc2Ugc2VyaWFsaXplZCBvcHRpb25zIGluIGdlbmVyYXRlZAorICBwcm90bzIgZmlsZXMuIEl0IG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBwcm90bzIuCisgICIiIgorICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzdHJpbmcpCisgIHJldHVybiBtZXNzYWdlCisKKworZGVmIE1ha2VEZXNjcmlwdG9yKGRlc2NfcHJvdG8sIHBhY2thZ2U9JycpOgorICAiIiJNYWtlIGEgcHJvdG9idWYgRGVzY3JpcHRvciBnaXZlbiBhIERlc2NyaXB0b3JQcm90byBwcm90b2J1Zi4KKworICBBcmdzOgorICAgIGRlc2NfcHJvdG86IFRoZSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYgbWVzc2FnZS4KKyAgICBwYWNrYWdlOiBPcHRpb25hbCBwYWNrYWdlIG5hbWUgZm9yIHRoZSBuZXcgbWVzc2FnZSBEZXNjcmlwdG9yIChzdHJpbmcpLgorCisgIFJldHVybnM6CisgICAgQSBEZXNjcmlwdG9yIGZvciBwcm90b2J1ZiBtZXNzYWdlcy4KKyAgIiIiCisgIGZ1bGxfbWVzc2FnZV9uYW1lID0gW2Rlc2NfcHJvdG8ubmFtZV0KKyAgaWYgcGFja2FnZTogZnVsbF9tZXNzYWdlX25hbWUuaW5zZXJ0KDAsIHBhY2thZ2UpCisgIGZpZWxkcyA9IFtdCisgIGZvciBmaWVsZF9wcm90byBpbiBkZXNjX3Byb3RvLmZpZWxkOgorICAgIGZ1bGxfbmFtZSA9ICcuJy5qb2luKGZ1bGxfbWVzc2FnZV9uYW1lICsgW2ZpZWxkX3Byb3RvLm5hbWVdKQorICAgIGZpZWxkID0gRmllbGREZXNjcmlwdG9yKAorICAgICAgICBmaWVsZF9wcm90by5uYW1lLCBmdWxsX25hbWUsIGZpZWxkX3Byb3RvLm51bWJlciAtIDEsCisgICAgICAgIGZpZWxkX3Byb3RvLm51bWJlciwgZmllbGRfcHJvdG8udHlwZSwKKyAgICAgICAgRmllbGREZXNjcmlwdG9yLlByb3RvVHlwZVRvQ3BwUHJvdG9UeXBlKGZpZWxkX3Byb3RvLnR5cGUpLAorICAgICAgICBmaWVsZF9wcm90by5sYWJlbCwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgRmFsc2UsIE5vbmUsCisgICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlKQorICAgIGZpZWxkcy5hcHBlbmQoZmllbGQpCisKKyAgZGVzY19uYW1lID0gJy4nLmpvaW4oZnVsbF9tZXNzYWdlX25hbWUpCisgIHJldHVybiBEZXNjcmlwdG9yKGRlc2NfcHJvdG8ubmFtZSwgZGVzY19uYW1lLCBOb25lLCBOb25lLCBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgIFtdLCBbXSwgW10pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjVkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5weQpAQCAtMCwwICsxLDEyMCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlByb3ZpZGVzIGEgY29udGFpbmVyIGZvciBEZXNjcmlwdG9yUHJvdG9zLiIiIgorCitfX2F1dGhvcl9fID0gJ21hdHRoZXd0b2lhQGdvb2dsZS5jb20gKE1hdHQgVG9pYSknCisKKworY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlKG9iamVjdCk6CisgICIiIkEgY29udGFpbmVyIGFjY2VwdGluZyBGaWxlRGVzY3JpcHRvclByb3RvcyBhbmQgbWFwcyBEZXNjcmlwdG9yUHJvdG9zLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X2ZpbGUgPSB7fQorICAgIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sID0ge30KKworICBkZWYgQWRkKHNlbGYsIGZpbGVfZGVzY19wcm90byk6CisgICAgIiIiQWRkcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhbmQgaXRzIHR5cGVzIHRvIHRoaXMgZGF0YWJhc2UuCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9kZXNjX3Byb3RvOiBUaGUgRmlsZURlc2NyaXB0b3JQcm90byB0byBhZGQuCisgICAgIiIiCisKKyAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X2ZpbGVbZmlsZV9kZXNjX3Byb3RvLm5hbWVdID0gZmlsZV9kZXNjX3Byb3RvCisgICAgcGFja2FnZSA9IGZpbGVfZGVzY19wcm90by5wYWNrYWdlCisgICAgZm9yIG1lc3NhZ2UgaW4gZmlsZV9kZXNjX3Byb3RvLm1lc3NhZ2VfdHlwZToKKyAgICAgIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sLnVwZGF0ZSgKKyAgICAgICAgICAobmFtZSwgZmlsZV9kZXNjX3Byb3RvKSBmb3IgbmFtZSBpbiBfRXh0cmFjdFN5bWJvbHMobWVzc2FnZSwgcGFja2FnZSkpCisgICAgZm9yIGVudW0gaW4gZmlsZV9kZXNjX3Byb3RvLmVudW1fdHlwZToKKyAgICAgIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sWworICAgICAgICAgICcuJy5qb2luKChwYWNrYWdlLCBlbnVtLm5hbWUpKV0gPSBmaWxlX2Rlc2NfcHJvdG8KKworICBkZWYgRmluZEZpbGVCeU5hbWUoc2VsZiwgbmFtZSk6CisgICAgIiIiRmluZHMgdGhlIGZpbGUgZGVzY3JpcHRvciBwcm90byBieSBmaWxlIG5hbWUuCisKKyAgICBUeXBpY2FsbHkgdGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggZW5kaW5nIHRvIGEgLnByb3RvIGZpbGUuIFRoZQorICAgIHByb3RvIHdpdGggdGhlIGdpdmVuIG5hbWUgd2lsbCBoYXZlIHRvIGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIGRhdGFiYXNlCisgICAgdXNpbmcgdGhlIEFkZCBtZXRob2Qgb3IgZWxzZSBhbiBlcnJvciB3aWxsIGJlIHJhaXNlZC4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBUaGUgZmlsZSBuYW1lIHRvIGZpbmQuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciBwcm90byBtYXRjaGluZyB0aGUgbmFtZS4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yIGlmIG5vIGZpbGUgYnkgdGhlIGdpdmVuIG5hbWUgd2FzIGFkZGVkLgorICAgICIiIgorCisgICAgcmV0dXJuIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfZmlsZVtuYW1lXQorCisgIGRlZiBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc2VsZiwgc3ltYm9sKToKKyAgICAiIiJGaW5kcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHByb3RvIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBzeW1ib2wuCisKKyAgICBUaGUgc3ltYm9sIHNob3VsZCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGluY2x1ZGluZyB0aGUgZmlsZSBkZXNjcmlwdG9yJ3MKKyAgICBwYWNrYWdlIGFuZCBhbnkgY29udGFpbmluZyBtZXNzYWdlcy4gU29tZSBleGFtcGxlczoKKworICAgICdzb21lLnBhY2thZ2UubmFtZS5NZXNzYWdlJworICAgICdzb21lLnBhY2thZ2UubmFtZS5NZXNzYWdlLk5lc3RlZEVudW0nCisKKyAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHByb3RvIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBzeW1ib2wgbXVzdCBiZSBhZGRlZCB0bworICAgIHRoaXMgZGF0YWJhc2UgdXNpbmcgdGhlIEFkZCBtZXRob2Qgb3IgZWxzZSBhbiBlcnJvciB3aWxsIGJlIHJhaXNlZC4KKworICAgIEFyZ3M6CisgICAgICBzeW1ib2w6IFRoZSBmdWxseSBxdWFsaWZpZWQgc3ltYm9sIG5hbWUuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciBwcm90byBjb250YWluaW5nIHRoZSBzeW1ib2wuCisKKyAgICBSYWlzZXM6CisgICAgICBLZXlFcnJvciBpZiBubyBmaWxlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3ltYm9sLgorICAgICIiIgorCisgICAgcmV0dXJuIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sW3N5bWJvbF0KKworCitkZWYgX0V4dHJhY3RTeW1ib2xzKGRlc2NfcHJvdG8sIHBhY2thZ2UpOgorICAiIiJQdWxscyBvdXQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYSBkZXNjcmlwdG9yIHByb3RvLgorCisgIEFyZ3M6CisgICAgZGVzY19wcm90bzogVGhlIHByb3RvIHRvIGV4dHJhY3Qgc3ltYm9scyBmcm9tLgorICAgIHBhY2thZ2U6IFRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0b3IgdHlwZS4KKworICBZaWVsZHM6CisgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvdW5kIGluIHRoZSBkZXNjcmlwdG9yLgorICAiIiIKKworICBtZXNzYWdlX25hbWUgPSAnLicuam9pbigocGFja2FnZSwgZGVzY19wcm90by5uYW1lKSkKKyAgeWllbGQgbWVzc2FnZV9uYW1lCisgIGZvciBuZXN0ZWRfdHlwZSBpbiBkZXNjX3Byb3RvLm5lc3RlZF90eXBlOgorICAgIGZvciBzeW1ib2wgaW4gX0V4dHJhY3RTeW1ib2xzKG5lc3RlZF90eXBlLCBtZXNzYWdlX25hbWUpOgorICAgICAgeWllbGQgc3ltYm9sCisgICAgZm9yIGVudW1fdHlwZSBpbiBkZXNjX3Byb3RvLmVudW1fdHlwZToKKyAgICAgIHlpZWxkICcuJy5qb2luKChtZXNzYWdlX25hbWUsIGVudW1fdHlwZS5uYW1lKSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3Bvb2wucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wb29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMWY0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wb29sLnB5CkBAIC0wLDAgKzEsNTI3IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiUHJvdmlkZXMgRGVzY3JpcHRvclBvb2wgdG8gdXNlIGFzIGEgY29udGFpbmVyIGZvciBwcm90bzIgZGVzY3JpcHRvcnMuCisKK1RoZSBEZXNjcmlwdG9yUG9vbCBpcyB1c2VkIGluIGNvbmplY3Rpb24gd2l0aCBhIERlc2NyaXB0b3JEYXRhYmFzZSB0byBtYWludGFpbgorYSBjb2xsZWN0aW9uIG9mIHByb3RvY29sIGJ1ZmZlciBkZXNjcmlwdG9ycyBmb3IgdXNlIHdoZW4gZHluYW1pY2FsbHkgY3JlYXRpbmcKK21lc3NhZ2UgdHlwZXMgYXQgcnVudGltZS4KKworRm9yIG1vc3QgYXBwbGljYXRpb25zIHByb3RvY29sIGJ1ZmZlcnMgc2hvdWxkIGJlIHVzZWQgdmlhIG1vZHVsZXMgZ2VuZXJhdGVkIGJ5Cit0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyIHRvb2wuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSB0eXBlIG9mCitwcm90b2NvbCBidWZmZXJzIHVzZWQgaW4gYW4gYXBwbGljYXRpb24gb3IgbGlicmFyeSBjYW5ub3QgYmUgcHJlZGV0ZXJtaW5lZC4KKworQmVsb3cgaXMgYSBzdHJhaWdodGZvcndhcmQgZXhhbXBsZSBvbiBob3cgdG8gdXNlIHRoaXMgY2xhc3M6CisKKyAgcG9vbCA9IERlc2NyaXB0b3JQb29sKCkKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvcyA9IFsgLi4uIF0KKyAgZm9yIGZpbGVfZGVzY3JpcHRvcl9wcm90byBpbiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG9zOgorICAgIHBvb2wuQWRkKGZpbGVfZGVzY3JpcHRvcl9wcm90bykKKyAgbXlfbWVzc2FnZV9kZXNjcmlwdG9yID0gcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoJ3NvbWUucGFja2FnZS5NZXNzYWdlVHlwZScpCisKK1RoZSBtZXNzYWdlIGRlc2NyaXB0b3IgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbWVzc2FnZV9mYWN0b3J5Cittb2R1bGUgaW4gb3JkZXIgdG8gY3JlYXRlIGEgcHJvdG9jb2wgYnVmZmVyIGNsYXNzIHRoYXQgY2FuIGJlIGVuY29kZWQgYW5kCitkZWNvZGVkLgorIiIiCisKK19fYXV0aG9yX18gPSAnbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKScKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfZGF0YWJhc2UKKworCitjbGFzcyBEZXNjcmlwdG9yUG9vbChvYmplY3QpOgorICAiIiJBIGNvbGxlY3Rpb24gb2YgcHJvdG9idWZzIGR5bmFtaWNhbGx5IGNvbnN0cnVjdGVkIGJ5IGRlc2NyaXB0b3IgcHJvdG9zLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXNjcmlwdG9yX2RiPU5vbmUpOgorICAgICIiIkluaXRpYWxpemVzIGEgUG9vbCBvZiBwcm90byBidWZmcy4KKworICAgIFRoZSBkZXNjcmlwdG9yX2RiIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCB0byBhbGxvdworICAgIHNwZWNpYWxpemVkIGZpbGUgZGVzY3JpcHRvciBwcm90byBsb29rdXAgY29kZSB0byBiZSB0cmlnZ2VyZWQgb24gZGVtYW5kLiBBbgorICAgIGV4YW1wbGUgd291bGQgYmUgYW4gaW1wbGVtZW50YXRpb24gd2hpY2ggd2lsbCByZWFkIGFuZCBjb21waWxlIGEgZmlsZQorICAgIHNwZWNpZmllZCBpbiBhIGNhbGwgdG8gRmluZEZpbGVCeU5hbWUoKSBhbmQgbm90IHJlcXVpcmUgdGhlIGNhbGwgdG8gQWRkKCkKKyAgICBhdCBhbGwuIFJlc3VsdHMgZnJvbSB0aGlzIGRhdGFiYXNlIHdpbGwgYmUgY2FjaGVkIGludGVybmFsbHkgaGVyZSBhcyB3ZWxsLgorCisgICAgQXJnczoKKyAgICAgIGRlc2NyaXB0b3JfZGI6IEEgc2Vjb25kYXJ5IHNvdXJjZSBvZiBmaWxlIGRlc2NyaXB0b3JzLgorICAgICIiIgorCisgICAgc2VsZi5faW50ZXJuYWxfZGIgPSBkZXNjcmlwdG9yX2RhdGFiYXNlLkRlc2NyaXB0b3JEYXRhYmFzZSgpCisgICAgc2VsZi5fZGVzY3JpcHRvcl9kYiA9IGRlc2NyaXB0b3JfZGIKKyAgICBzZWxmLl9kZXNjcmlwdG9ycyA9IHt9CisgICAgc2VsZi5fZW51bV9kZXNjcmlwdG9ycyA9IHt9CisgICAgc2VsZi5fZmlsZV9kZXNjcmlwdG9ycyA9IHt9CisKKyAgZGVmIEFkZChzZWxmLCBmaWxlX2Rlc2NfcHJvdG8pOgorICAgICIiIkFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW5kIGl0cyB0eXBlcyB0byB0aGlzIHBvb2wuCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9kZXNjX3Byb3RvOiBUaGUgRmlsZURlc2NyaXB0b3JQcm90byB0byBhZGQuCisgICAgIiIiCisKKyAgICBzZWxmLl9pbnRlcm5hbF9kYi5BZGQoZmlsZV9kZXNjX3Byb3RvKQorCisgIGRlZiBGaW5kRmlsZUJ5TmFtZShzZWxmLCBmaWxlX25hbWUpOgorICAgICIiIkdldHMgYSBGaWxlRGVzY3JpcHRvciBieSBmaWxlIG5hbWUuCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9uYW1lOiBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBnZXQgYSBkZXNjcmlwdG9yIGZvci4KKworICAgIFJldHVybnM6CisgICAgICBBIEZpbGVEZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgZmlsZS4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yOiBpZiB0aGUgZmlsZSBjYW4gbm90IGJlIGZvdW5kIGluIHRoZSBwb29sLgorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2ludGVybmFsX2RiLkZpbmRGaWxlQnlOYW1lKGZpbGVfbmFtZSkKKyAgICBleGNlcHQgS2V5RXJyb3IgYXMgZXJyb3I6CisgICAgICBpZiBzZWxmLl9kZXNjcmlwdG9yX2RiOgorICAgICAgICBmaWxlX3Byb3RvID0gc2VsZi5fZGVzY3JpcHRvcl9kYi5GaW5kRmlsZUJ5TmFtZShmaWxlX25hbWUpCisgICAgICBlbHNlOgorICAgICAgICByYWlzZSBlcnJvcgorICAgIGlmIG5vdCBmaWxlX3Byb3RvOgorICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Nhbm5vdCBmaW5kIGEgZmlsZSBuYW1lZCAlcycgJSBmaWxlX25hbWUpCisgICAgcmV0dXJuIHNlbGYuX0NvbnZlcnRGaWxlUHJvdG9Ub0ZpbGVEZXNjcmlwdG9yKGZpbGVfcHJvdG8pCisKKyAgZGVmIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzZWxmLCBzeW1ib2wpOgorICAgICIiIkdldHMgdGhlIEZpbGVEZXNjcmlwdG9yIGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sLgorCisgICAgQXJnczoKKyAgICAgIHN5bWJvbDogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBzZWFyY2ggZm9yLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgRmlsZURlc2NyaXB0b3IgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN5bWJvbC4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yOiBpZiB0aGUgZmlsZSBjYW4gbm90IGJlIGZvdW5kIGluIHRoZSBwb29sLgorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2ludGVybmFsX2RiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2wpCisgICAgZXhjZXB0IEtleUVycm9yIGFzIGVycm9yOgorICAgICAgaWYgc2VsZi5fZGVzY3JpcHRvcl9kYjoKKyAgICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2Rlc2NyaXB0b3JfZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbCkKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIGVycm9yCisgICAgaWYgbm90IGZpbGVfcHJvdG86CisgICAgICByYWlzZSBLZXlFcnJvcignQ2Fubm90IGZpbmQgYSBmaWxlIGNvbnRhaW5pbmcgJXMnICUgc3ltYm9sKQorICAgIHJldHVybiBzZWxmLl9Db252ZXJ0RmlsZVByb3RvVG9GaWxlRGVzY3JpcHRvcihmaWxlX3Byb3RvKQorCisgIGRlZiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoc2VsZiwgZnVsbF9uYW1lKToKKyAgICAiIiJMb2FkcyB0aGUgbmFtZWQgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorCisgICAgQXJnczoKKyAgICAgIGZ1bGxfbmFtZTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciB0byBsb2FkLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgdHlwZS4KKyAgICAiIiIKKworICAgIGZ1bGxfbmFtZSA9IGZ1bGxfbmFtZS5sc3RyaXAoJy4nKSAgIyBmaXggaW5jb25zaXN0ZW50IHF1YWxpZmllZCBuYW1lIGZvcm1hdHMKKyAgICBpZiBmdWxsX25hbWUgbm90IGluIHNlbGYuX2Rlc2NyaXB0b3JzOgorICAgICAgc2VsZi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woZnVsbF9uYW1lKQorICAgIHJldHVybiBzZWxmLl9kZXNjcmlwdG9yc1tmdWxsX25hbWVdCisKKyAgZGVmIEZpbmRFbnVtVHlwZUJ5TmFtZShzZWxmLCBmdWxsX25hbWUpOgorICAgICIiIkxvYWRzIHRoZSBuYW1lZCBlbnVtIGRlc2NyaXB0b3IgZnJvbSB0aGUgcG9vbC4KKworICAgIEFyZ3M6CisgICAgICBmdWxsX25hbWU6IFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudW0gZGVzY3JpcHRvciB0byBsb2FkLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBlbnVtIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCB0eXBlLgorICAgICIiIgorCisgICAgZnVsbF9uYW1lID0gZnVsbF9uYW1lLmxzdHJpcCgnLicpICAjIGZpeCBpbmNvbnNpc3RlbnQgcXVhbGlmaWVkIG5hbWUgZm9ybWF0cworICAgIGlmIGZ1bGxfbmFtZSBub3QgaW4gc2VsZi5fZW51bV9kZXNjcmlwdG9yczoKKyAgICAgIHNlbGYuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGZ1bGxfbmFtZSkKKyAgICByZXR1cm4gc2VsZi5fZW51bV9kZXNjcmlwdG9yc1tmdWxsX25hbWVdCisKKyAgZGVmIF9Db252ZXJ0RmlsZVByb3RvVG9GaWxlRGVzY3JpcHRvcihzZWxmLCBmaWxlX3Byb3RvKToKKyAgICAiIiJDcmVhdGVzIGEgRmlsZURlc2NyaXB0b3IgZnJvbSBhIHByb3RvIG9yIHJldHVybnMgYSBjYWNoZWQgY29weS4KKworICAgIFRoaXMgbWV0aG9kIGFsc28gaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBsb2FkaW5nIGFsbCB0aGUgc3ltYm9scyBmb3VuZCBpbgorICAgIHRoZSBmaWxlIGludG8gdGhlIGFwcHJvcHJpYXRlIGRpY3Rpb25hcmllcyBpbiB0aGUgcG9vbC4KKworICAgIEFyZ3M6CisgICAgICBmaWxlX3Byb3RvOiBUaGUgcHJvdG8gdG8gY29udmVydC4KKworICAgIFJldHVybnM6CisgICAgICBBIEZpbGVEZXNjcmlwdG9yIG1hdGNoaW5nIHRoZSBwYXNzZWQgaW4gcHJvdG8uCisgICAgIiIiCisKKyAgICBpZiBmaWxlX3Byb3RvLm5hbWUgbm90IGluIHNlbGYuX2ZpbGVfZGVzY3JpcHRvcnM6CisgICAgICBmaWxlX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgIG5hbWU9ZmlsZV9wcm90by5uYW1lLAorICAgICAgICAgIHBhY2thZ2U9ZmlsZV9wcm90by5wYWNrYWdlLAorICAgICAgICAgIG9wdGlvbnM9ZmlsZV9wcm90by5vcHRpb25zLAorICAgICAgICAgIHNlcmlhbGl6ZWRfcGI9ZmlsZV9wcm90by5TZXJpYWxpemVUb1N0cmluZygpKQorICAgICAgc2NvcGUgPSB7fQorICAgICAgZGVwZW5kZW5jaWVzID0gbGlzdChzZWxmLl9HZXREZXBzKGZpbGVfcHJvdG8pKQorCisgICAgICBmb3IgZGVwZW5kZW5jeSBpbiBkZXBlbmRlbmNpZXM6CisgICAgICAgIGRlcF9kZXNjID0gc2VsZi5GaW5kRmlsZUJ5TmFtZShkZXBlbmRlbmN5Lm5hbWUpCisgICAgICAgIGRlcF9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgICAgIGRlcF9kZXNjLnNlcmlhbGl6ZWRfcGIpCisgICAgICAgIHBhY2thZ2UgPSAnLicgKyBkZXBfcHJvdG8ucGFja2FnZQorICAgICAgICBwYWNrYWdlX3ByZWZpeCA9IHBhY2thZ2UgKyAnLicKKworICAgICAgICBkZWYgX3N0cmlwX3BhY2thZ2Uoc3ltYm9sKToKKyAgICAgICAgICBpZiBzeW1ib2wuc3RhcnRzd2l0aChwYWNrYWdlX3ByZWZpeCk6CisgICAgICAgICAgICByZXR1cm4gc3ltYm9sW2xlbihwYWNrYWdlX3ByZWZpeCk6XQorICAgICAgICAgIHJldHVybiBzeW1ib2wKKworICAgICAgICBzeW1ib2xzID0gbGlzdChzZWxmLl9FeHRyYWN0U3ltYm9scyhkZXBfcHJvdG8ubWVzc2FnZV90eXBlLCBwYWNrYWdlKSkKKyAgICAgICAgc2NvcGUudXBkYXRlKHN5bWJvbHMpCisgICAgICAgIHNjb3BlLnVwZGF0ZSgoX3N0cmlwX3BhY2thZ2UoayksIHYpIGZvciBrLCB2IGluIHN5bWJvbHMpCisKKyAgICAgICAgc3ltYm9scyA9IGxpc3Qoc2VsZi5fRXh0cmFjdEVudW1zKGRlcF9wcm90by5lbnVtX3R5cGUsIHBhY2thZ2UpKQorICAgICAgICBzY29wZS51cGRhdGUoc3ltYm9scykKKyAgICAgICAgc2NvcGUudXBkYXRlKChfc3RyaXBfcGFja2FnZShrKSwgdikgZm9yIGssIHYgaW4gc3ltYm9scykKKworICAgICAgZm9yIG1lc3NhZ2VfdHlwZSBpbiBmaWxlX3Byb3RvLm1lc3NhZ2VfdHlwZToKKyAgICAgICAgbWVzc2FnZV9kZXNjID0gc2VsZi5fQ29udmVydE1lc3NhZ2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgbWVzc2FnZV90eXBlLCBmaWxlX3Byb3RvLnBhY2thZ2UsIGZpbGVfZGVzY3JpcHRvciwgc2NvcGUpCisgICAgICAgIGZpbGVfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGVzX2J5X25hbWVbbWVzc2FnZV9kZXNjLm5hbWVdID0gbWVzc2FnZV9kZXNjCisgICAgICBmb3IgZW51bV90eXBlIGluIGZpbGVfcHJvdG8uZW51bV90eXBlOgorICAgICAgICBzZWxmLl9Db252ZXJ0RW51bURlc2NyaXB0b3IoZW51bV90eXBlLCBmaWxlX3Byb3RvLnBhY2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3IsIE5vbmUsIHNjb3BlKQorICAgICAgZm9yIGRlc2NfcHJvdG8gaW4gc2VsZi5fRXh0cmFjdE1lc3NhZ2VzKGZpbGVfcHJvdG8ubWVzc2FnZV90eXBlKToKKyAgICAgICAgc2VsZi5fU2V0RmllbGRUeXBlcyhkZXNjX3Byb3RvLCBzY29wZSkKKworICAgICAgZm9yIGRlc2NfcHJvdG8gaW4gZmlsZV9wcm90by5tZXNzYWdlX3R5cGU6CisgICAgICAgIGRlc2MgPSBzY29wZVtkZXNjX3Byb3RvLm5hbWVdCisgICAgICAgIGZpbGVfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGVzX2J5X25hbWVbZGVzY19wcm90by5uYW1lXSA9IGRlc2MKKyAgICAgIHNlbGYuQWRkKGZpbGVfcHJvdG8pCisgICAgICBzZWxmLl9maWxlX2Rlc2NyaXB0b3JzW2ZpbGVfcHJvdG8ubmFtZV0gPSBmaWxlX2Rlc2NyaXB0b3IKKworICAgIHJldHVybiBzZWxmLl9maWxlX2Rlc2NyaXB0b3JzW2ZpbGVfcHJvdG8ubmFtZV0KKworICBkZWYgX0NvbnZlcnRNZXNzYWdlRGVzY3JpcHRvcihzZWxmLCBkZXNjX3Byb3RvLCBwYWNrYWdlPU5vbmUsIGZpbGVfZGVzYz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZT1Ob25lKToKKyAgICAiIiJBZGRzIHRoZSBwcm90byB0byB0aGUgcG9vbCBpbiB0aGUgc3BlY2lmaWVkIHBhY2thZ2UuCisKKyAgICBBcmdzOgorICAgICAgZGVzY19wcm90bzogVGhlIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90byBwcm90b2J1ZiBtZXNzYWdlLgorICAgICAgcGFja2FnZTogVGhlIHBhY2thZ2UgdGhlIHByb3RvIHNob3VsZCBiZSBsb2NhdGVkIGluLgorICAgICAgZmlsZV9kZXNjOiBUaGUgZmlsZSBjb250YWluaW5nIHRoaXMgbWVzc2FnZS4KKyAgICAgIHNjb3BlOiBEaWN0IG1hcHBpbmcgc2hvcnQgYW5kIGZ1bGwgc3ltYm9scyB0byBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBhZGRlZCBkZXNjcmlwdG9yLgorICAgICIiIgorCisgICAgaWYgcGFja2FnZToKKyAgICAgIGRlc2NfbmFtZSA9ICcuJy5qb2luKChwYWNrYWdlLCBkZXNjX3Byb3RvLm5hbWUpKQorICAgIGVsc2U6CisgICAgICBkZXNjX25hbWUgPSBkZXNjX3Byb3RvLm5hbWUKKworICAgIGlmIGZpbGVfZGVzYyBpcyBOb25lOgorICAgICAgZmlsZV9uYW1lID0gTm9uZQorICAgIGVsc2U6CisgICAgICBmaWxlX25hbWUgPSBmaWxlX2Rlc2MubmFtZQorCisgICAgaWYgc2NvcGUgaXMgTm9uZToKKyAgICAgIHNjb3BlID0ge30KKworICAgIG5lc3RlZCA9IFsKKyAgICAgICAgc2VsZi5fQ29udmVydE1lc3NhZ2VEZXNjcmlwdG9yKG5lc3RlZCwgZGVzY19uYW1lLCBmaWxlX2Rlc2MsIHNjb3BlKQorICAgICAgICBmb3IgbmVzdGVkIGluIGRlc2NfcHJvdG8ubmVzdGVkX3R5cGVdCisgICAgZW51bXMgPSBbCisgICAgICAgIHNlbGYuX0NvbnZlcnRFbnVtRGVzY3JpcHRvcihlbnVtLCBkZXNjX25hbWUsIGZpbGVfZGVzYywgTm9uZSwgc2NvcGUpCisgICAgICAgIGZvciBlbnVtIGluIGRlc2NfcHJvdG8uZW51bV90eXBlXQorICAgIGZpZWxkcyA9IFtzZWxmLl9NYWtlRmllbGREZXNjcmlwdG9yKGZpZWxkLCBkZXNjX25hbWUsIGluZGV4KQorICAgICAgICAgICAgICBmb3IgaW5kZXgsIGZpZWxkIGluIGVudW1lcmF0ZShkZXNjX3Byb3RvLmZpZWxkKV0KKyAgICBleHRlbnNpb25zID0gW3NlbGYuX01ha2VGaWVsZERlc2NyaXB0b3IoZXh0ZW5zaW9uLCBkZXNjX25hbWUsIFRydWUpCisgICAgICAgICAgICAgICAgICBmb3IgaW5kZXgsIGV4dGVuc2lvbiBpbiBlbnVtZXJhdGUoZGVzY19wcm90by5leHRlbnNpb24pXQorICAgIGV4dGVuc2lvbl9yYW5nZXMgPSBbKHIuc3RhcnQsIHIuZW5kKSBmb3IgciBpbiBkZXNjX3Byb3RvLmV4dGVuc2lvbl9yYW5nZV0KKyAgICBpZiBleHRlbnNpb25fcmFuZ2VzOgorICAgICAgaXNfZXh0ZW5kYWJsZSA9IFRydWUKKyAgICBlbHNlOgorICAgICAgaXNfZXh0ZW5kYWJsZSA9IEZhbHNlCisgICAgZGVzYyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgICAgICAgbmFtZT1kZXNjX3Byb3RvLm5hbWUsCisgICAgICAgIGZ1bGxfbmFtZT1kZXNjX25hbWUsCisgICAgICAgIGZpbGVuYW1lPWZpbGVfbmFtZSwKKyAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICAgIGZpZWxkcz1maWVsZHMsCisgICAgICAgIG5lc3RlZF90eXBlcz1uZXN0ZWQsCisgICAgICAgIGVudW1fdHlwZXM9ZW51bXMsCisgICAgICAgIGV4dGVuc2lvbnM9ZXh0ZW5zaW9ucywKKyAgICAgICAgb3B0aW9ucz1kZXNjX3Byb3RvLm9wdGlvbnMsCisgICAgICAgIGlzX2V4dGVuZGFibGU9aXNfZXh0ZW5kYWJsZSwKKyAgICAgICAgZXh0ZW5zaW9uX3Jhbmdlcz1leHRlbnNpb25fcmFuZ2VzLAorICAgICAgICBmaWxlPWZpbGVfZGVzYywKKyAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLAorICAgICAgICBzZXJpYWxpemVkX2VuZD1Ob25lKQorICAgIGZvciBuZXN0ZWQgaW4gZGVzYy5uZXN0ZWRfdHlwZXM6CisgICAgICBuZXN0ZWQuY29udGFpbmluZ190eXBlID0gZGVzYworICAgIGZvciBlbnVtIGluIGRlc2MuZW51bV90eXBlczoKKyAgICAgIGVudW0uY29udGFpbmluZ190eXBlID0gZGVzYworICAgIHNjb3BlW2Rlc2NfcHJvdG8ubmFtZV0gPSBkZXNjCisgICAgc2NvcGVbJy4nICsgZGVzY19uYW1lXSA9IGRlc2MKKyAgICBzZWxmLl9kZXNjcmlwdG9yc1tkZXNjX25hbWVdID0gZGVzYworICAgIHJldHVybiBkZXNjCisKKyAgZGVmIF9Db252ZXJ0RW51bURlc2NyaXB0b3Ioc2VsZiwgZW51bV9wcm90bywgcGFja2FnZT1Ob25lLCBmaWxlX2Rlc2M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIHNjb3BlPU5vbmUpOgorICAgICIiIk1ha2UgYSBwcm90b2J1ZiBFbnVtRGVzY3JpcHRvciBnaXZlbiBhbiBFbnVtRGVzY3JpcHRvclByb3RvIHByb3RvYnVmLgorCisgICAgQXJnczoKKyAgICAgIGVudW1fcHJvdG86IFRoZSBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvIHByb3RvYnVmIG1lc3NhZ2UuCisgICAgICBwYWNrYWdlOiBPcHRpb25hbCBwYWNrYWdlIG5hbWUgZm9yIHRoZSBuZXcgbWVzc2FnZSBFbnVtRGVzY3JpcHRvci4KKyAgICAgIGZpbGVfZGVzYzogVGhlIGZpbGUgY29udGFpbmluZyB0aGUgZW51bSBkZXNjcmlwdG9yLgorICAgICAgY29udGFpbmluZ190eXBlOiBUaGUgdHlwZSBjb250YWluaW5nIHRoaXMgZW51bS4KKyAgICAgIHNjb3BlOiBTY29wZSBjb250YWluaW5nIGF2YWlsYWJsZSB0eXBlcy4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgYWRkZWQgZGVzY3JpcHRvcgorICAgICIiIgorCisgICAgaWYgcGFja2FnZToKKyAgICAgIGVudW1fbmFtZSA9ICcuJy5qb2luKChwYWNrYWdlLCBlbnVtX3Byb3RvLm5hbWUpKQorICAgIGVsc2U6CisgICAgICBlbnVtX25hbWUgPSBlbnVtX3Byb3RvLm5hbWUKKworICAgIGlmIGZpbGVfZGVzYyBpcyBOb25lOgorICAgICAgZmlsZV9uYW1lID0gTm9uZQorICAgIGVsc2U6CisgICAgICBmaWxlX25hbWUgPSBmaWxlX2Rlc2MubmFtZQorCisgICAgdmFsdWVzID0gW3NlbGYuX01ha2VFbnVtVmFsdWVEZXNjcmlwdG9yKHZhbHVlLCBpbmRleCkKKyAgICAgICAgICAgICAgZm9yIGluZGV4LCB2YWx1ZSBpbiBlbnVtZXJhdGUoZW51bV9wcm90by52YWx1ZSldCisgICAgZGVzYyA9IGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IobmFtZT1lbnVtX3Byb3RvLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9uYW1lPWVudW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT1maWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1maWxlX2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPXZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGU9Y29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9ZW51bV9wcm90by5vcHRpb25zKQorICAgIHNjb3BlW2VudW1fcHJvdG8ubmFtZV0gPSBkZXNjCisgICAgc2NvcGVbJy4lcycgJSBlbnVtX25hbWVdID0gZGVzYworICAgIHNlbGYuX2VudW1fZGVzY3JpcHRvcnNbZW51bV9uYW1lXSA9IGRlc2MKKyAgICByZXR1cm4gZGVzYworCisgIGRlZiBfTWFrZUZpZWxkRGVzY3JpcHRvcihzZWxmLCBmaWVsZF9wcm90bywgbWVzc2FnZV9uYW1lLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSk6CisgICAgIiIiQ3JlYXRlcyBhIGZpZWxkIGRlc2NyaXB0b3IgZnJvbSBhIEZpZWxkRGVzY3JpcHRvclByb3RvLgorCisgICAgRm9yIG1lc3NhZ2UgYW5kIGVudW0gdHlwZSBmaWVsZHMsIHRoaXMgbWV0aG9kIHdpbGwgZG8gYSBsb29rIHVwCisgICAgaW4gdGhlIHBvb2wgZm9yIHRoZSBhcHByb3ByaWF0ZSBkZXNjcmlwdG9yIGZvciB0aGF0IHR5cGUuIElmIGl0CisgICAgaXMgdW5hdmFpbGFibGUsIGl0IHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBfc291cmNlIGZ1bmN0aW9uIHRvCisgICAgY3JlYXRlIGl0LiBJZiB0aGlzIHR5cGUgaXMgc3RpbGwgdW5hdmFpbGFibGUsIGNvbnN0cnVjdGlvbiB3aWxsCisgICAgZmFpbC4KKworICAgIEFyZ3M6CisgICAgICBmaWVsZF9wcm90bzogVGhlIHByb3RvIGRlc2NyaWJpbmcgdGhlIGZpZWxkLgorICAgICAgbWVzc2FnZV9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBtZXNzYWdlLgorICAgICAgaW5kZXg6IEluZGV4IG9mIHRoZSBmaWVsZAorICAgICAgaXNfZXh0ZW5zaW9uOiBJbmRpY2F0aW9uIHRoYXQgdGhpcyBmaWVsZCBpcyBmb3IgYW4gZXh0ZW5zaW9uLgorCisgICAgUmV0dXJuczoKKyAgICAgIEFuIGluaXRpYWxpemVkIEZpZWxkRGVzY3JpcHRvciBvYmplY3QKKyAgICAiIiIKKworICAgIGlmIG1lc3NhZ2VfbmFtZToKKyAgICAgIGZ1bGxfbmFtZSA9ICcuJy5qb2luKChtZXNzYWdlX25hbWUsIGZpZWxkX3Byb3RvLm5hbWUpKQorICAgIGVsc2U6CisgICAgICBmdWxsX25hbWUgPSBmaWVsZF9wcm90by5uYW1lCisKKyAgICByZXR1cm4gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9ZmllbGRfcHJvdG8ubmFtZSwKKyAgICAgICAgZnVsbF9uYW1lPWZ1bGxfbmFtZSwKKyAgICAgICAgaW5kZXg9aW5kZXgsCisgICAgICAgIG51bWJlcj1maWVsZF9wcm90by5udW1iZXIsCisgICAgICAgIHR5cGU9ZmllbGRfcHJvdG8udHlwZSwKKyAgICAgICAgY3BwX3R5cGU9Tm9uZSwKKyAgICAgICAgbWVzc2FnZV90eXBlPU5vbmUsCisgICAgICAgIGVudW1fdHlwZT1Ob25lLAorICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgICAgbGFiZWw9ZmllbGRfcHJvdG8ubGFiZWwsCisgICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgICBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICAgIGlzX2V4dGVuc2lvbj1pc19leHRlbnNpb24sCisgICAgICAgIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgICBvcHRpb25zPWZpZWxkX3Byb3RvLm9wdGlvbnMpCisKKyAgZGVmIF9TZXRGaWVsZFR5cGVzKHNlbGYsIGRlc2NfcHJvdG8sIHNjb3BlKToKKyAgICAiIiJTZXRzIHRoZSBmaWVsZCdzIHR5cGUsIGNwcF90eXBlLCBtZXNzYWdlX3R5cGUgYW5kIGVudW1fdHlwZS4KKworICAgIEFyZ3M6CisgICAgICBkZXNjX3Byb3RvOiBUaGUgbWVzc2FnZSBkZXNjcmlwdG9yIHRvIHVwZGF0ZS4KKyAgICAgIHNjb3BlOiBFbmNsb3Npbmcgc2NvcGUgb2YgYXZhaWxhYmxlIHR5cGVzLgorICAgICIiIgorCisgICAgZGVzYyA9IHNjb3BlW2Rlc2NfcHJvdG8ubmFtZV0KKyAgICBmb3IgZmllbGRfcHJvdG8sIGZpZWxkX2Rlc2MgaW4gemlwKGRlc2NfcHJvdG8uZmllbGQsIGRlc2MuZmllbGRzKToKKyAgICAgIGlmIGZpZWxkX3Byb3RvLnR5cGVfbmFtZToKKyAgICAgICAgdHlwZV9uYW1lID0gZmllbGRfcHJvdG8udHlwZV9uYW1lCisgICAgICAgIGlmIHR5cGVfbmFtZSBub3QgaW4gc2NvcGU6CisgICAgICAgICAgdHlwZV9uYW1lID0gJy4nICsgdHlwZV9uYW1lCisgICAgICAgIGRlc2MgPSBzY29wZVt0eXBlX25hbWVdCisgICAgICBlbHNlOgorICAgICAgICBkZXNjID0gTm9uZQorCisgICAgICBpZiBub3QgZmllbGRfcHJvdG8uSGFzRmllbGQoJ3R5cGUnKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkZXNjLCBkZXNjcmlwdG9yLkRlc2NyaXB0b3IpOgorICAgICAgICAgIGZpZWxkX3Byb3RvLnR5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBmaWVsZF9wcm90by50eXBlID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNCisKKyAgICAgIGZpZWxkX2Rlc2MuY3BwX3R5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5Qcm90b1R5cGVUb0NwcFByb3RvVHlwZSgKKyAgICAgICAgICBmaWVsZF9wcm90by50eXBlKQorCisgICAgICBpZiAoZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UKKyAgICAgICAgICBvciBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVApOgorICAgICAgICBmaWVsZF9kZXNjLm1lc3NhZ2VfdHlwZSA9IGRlc2MKKworICAgICAgaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06CisgICAgICAgIGZpZWxkX2Rlc2MuZW51bV90eXBlID0gZGVzYworCisgICAgICBpZiBmaWVsZF9wcm90by5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgZmllbGRfZGVzYy5oYXNfZGVmYXVsdCA9IEZhbHNlCisgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IFtdCisgICAgICBlbGlmIGZpZWxkX3Byb3RvLkhhc0ZpZWxkKCdkZWZhdWx0X3ZhbHVlJyk6CisgICAgICAgIGZpZWxkX2Rlc2MuaGFzX2RlZmF1bHQgPSBUcnVlCisgICAgICAgIGlmIChmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFIG9yCisgICAgICAgICAgICBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQpOgorICAgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IGZsb2F0KGZpZWxkX3Byb3RvLmRlZmF1bHRfdmFsdWUpCisgICAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzoKKyAgICAgICAgICBmaWVsZF9kZXNjLmRlZmF1bHRfdmFsdWUgPSBmaWVsZF9wcm90by5kZWZhdWx0X3ZhbHVlCisgICAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6CisgICAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmllbGRfcHJvdG8uZGVmYXVsdF92YWx1ZS5sb3dlcigpID09ICd0cnVlJworICAgICAgICBlbGlmIGZpZWxkX3Byb3RvLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOgorICAgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IGZpZWxkX2Rlc2MuZW51bV90eXBlLnZhbHVlc19ieV9uYW1lWworICAgICAgICAgICAgICBmaWVsZF9wcm90by5kZWZhdWx0X3ZhbHVlXS5pbmRleAorICAgICAgICBlbHNlOgorICAgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IGludChmaWVsZF9wcm90by5kZWZhdWx0X3ZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgZmllbGRfZGVzYy5oYXNfZGVmYXVsdCA9IEZhbHNlCisgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IE5vbmUKKworICAgICAgZmllbGRfZGVzYy50eXBlID0gZmllbGRfcHJvdG8udHlwZQorCisgICAgZm9yIG5lc3RlZF90eXBlIGluIGRlc2NfcHJvdG8ubmVzdGVkX3R5cGU6CisgICAgICBzZWxmLl9TZXRGaWVsZFR5cGVzKG5lc3RlZF90eXBlLCBzY29wZSkKKworICBkZWYgX01ha2VFbnVtVmFsdWVEZXNjcmlwdG9yKHNlbGYsIHZhbHVlX3Byb3RvLCBpbmRleCk6CisgICAgIiIiQ3JlYXRlcyBhIGVudW0gdmFsdWUgZGVzY3JpcHRvciBvYmplY3QgZnJvbSBhIGVudW0gdmFsdWUgcHJvdG8uCisKKyAgICBBcmdzOgorICAgICAgdmFsdWVfcHJvdG86IFRoZSBwcm90byBkZXNjcmliaW5nIHRoZSBlbnVtIHZhbHVlLgorICAgICAgaW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgZW51bSB2YWx1ZS4KKworICAgIFJldHVybnM6CisgICAgICBBbiBpbml0aWFsaXplZCBFbnVtVmFsdWVEZXNjcmlwdG9yIG9iamVjdC4KKyAgICAiIiIKKworICAgIHJldHVybiBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9dmFsdWVfcHJvdG8ubmFtZSwKKyAgICAgICAgaW5kZXg9aW5kZXgsCisgICAgICAgIG51bWJlcj12YWx1ZV9wcm90by5udW1iZXIsCisgICAgICAgIG9wdGlvbnM9dmFsdWVfcHJvdG8ub3B0aW9ucywKKyAgICAgICAgdHlwZT1Ob25lKQorCisgIGRlZiBfRXh0cmFjdFN5bWJvbHMoc2VsZiwgZGVzY19wcm90b3MsIHBhY2thZ2UpOgorICAgICIiIlB1bGxzIG91dCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBkZXNjcmlwdG9yIHByb3Rvcy4KKworICAgIEFyZ3M6CisgICAgICBkZXNjX3Byb3RvczogVGhlIHByb3RvcyB0byBleHRyYWN0IHN5bWJvbHMgZnJvbS4KKyAgICAgIHBhY2thZ2U6IFRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0b3IgdHlwZS4KKyAgICBZaWVsZHM6CisgICAgICBBIHR3byBlbGVtZW50IHR1cGxlIG9mIHRoZSB0eXBlIG5hbWUgYW5kIGRlc2NyaXB0b3Igb2JqZWN0LgorICAgICIiIgorCisgICAgZm9yIGRlc2NfcHJvdG8gaW4gZGVzY19wcm90b3M6CisgICAgICBpZiBwYWNrYWdlOgorICAgICAgICBtZXNzYWdlX25hbWUgPSAnLicuam9pbigocGFja2FnZSwgZGVzY19wcm90by5uYW1lKSkKKyAgICAgIGVsc2U6CisgICAgICAgIG1lc3NhZ2VfbmFtZSA9IGRlc2NfcHJvdG8ubmFtZQorICAgICAgbWVzc2FnZV9kZXNjID0gc2VsZi5GaW5kTWVzc2FnZVR5cGVCeU5hbWUobWVzc2FnZV9uYW1lKQorICAgICAgeWllbGQgKG1lc3NhZ2VfbmFtZSwgbWVzc2FnZV9kZXNjKQorICAgICAgZm9yIHN5bWJvbCBpbiBzZWxmLl9FeHRyYWN0U3ltYm9scyhkZXNjX3Byb3RvLm5lc3RlZF90eXBlLCBtZXNzYWdlX25hbWUpOgorICAgICAgICB5aWVsZCBzeW1ib2wKKyAgICAgIGZvciBzeW1ib2wgaW4gc2VsZi5fRXh0cmFjdEVudW1zKGRlc2NfcHJvdG8uZW51bV90eXBlLCBtZXNzYWdlX25hbWUpOgorICAgICAgICB5aWVsZCBzeW1ib2wKKworICBkZWYgX0V4dHJhY3RFbnVtcyhzZWxmLCBlbnVtX3Byb3RvcywgcGFja2FnZSk6CisgICAgIiIiUHVsbHMgb3V0IGFsbCB0aGUgc3ltYm9scyBmcm9tIGVudW0gcHJvdG9zLgorCisgICAgQXJnczoKKyAgICAgIGVudW1fcHJvdG9zOiBUaGUgcHJvdG9zIHRvIGV4dHJhY3Qgc3ltYm9scyBmcm9tLgorICAgICAgcGFja2FnZTogVGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZW51bSB0eXBlLgorCisgICAgWWllbGRzOgorICAgICAgQSB0d28gZWxlbWVudCB0dXBsZSBvZiB0aGUgdHlwZSBuYW1lIGFuZCBlbnVtIGRlc2NyaXB0b3Igb2JqZWN0LgorICAgICIiIgorCisgICAgZm9yIGVudW1fcHJvdG8gaW4gZW51bV9wcm90b3M6CisgICAgICBpZiBwYWNrYWdlOgorICAgICAgICBlbnVtX25hbWUgPSAnLicuam9pbigocGFja2FnZSwgZW51bV9wcm90by5uYW1lKSkKKyAgICAgIGVsc2U6CisgICAgICAgIGVudW1fbmFtZSA9IGVudW1fcHJvdG8ubmFtZQorICAgICAgZW51bV9kZXNjID0gc2VsZi5GaW5kRW51bVR5cGVCeU5hbWUoZW51bV9uYW1lKQorICAgICAgeWllbGQgKGVudW1fbmFtZSwgZW51bV9kZXNjKQorCisgIGRlZiBfRXh0cmFjdE1lc3NhZ2VzKHNlbGYsIGRlc2NfcHJvdG9zKToKKyAgICAiIiJQdWxscyBvdXQgYWxsIHRoZSBtZXNzYWdlIHByb3RvcyBmcm9tIGRlc2NyaXB0b3MuCisKKyAgICBBcmdzOgorICAgICAgZGVzY19wcm90b3M6IFRoZSBwcm90b3MgdG8gZXh0cmFjdCBzeW1ib2xzIGZyb20uCisKKyAgICBZaWVsZHM6CisgICAgICBEZXNjcmlwdG9yIHByb3Rvcy4KKyAgICAiIiIKKworICAgIGZvciBkZXNjX3Byb3RvIGluIGRlc2NfcHJvdG9zOgorICAgICAgeWllbGQgZGVzY19wcm90bworICAgICAgZm9yIG1lc3NhZ2UgaW4gc2VsZi5fRXh0cmFjdE1lc3NhZ2VzKGRlc2NfcHJvdG8ubmVzdGVkX3R5cGUpOgorICAgICAgICB5aWVsZCBtZXNzYWdlCisKKyAgZGVmIF9HZXREZXBzKHNlbGYsIGZpbGVfcHJvdG8pOgorICAgICIiIlJlY3Vyc2l2ZWx5IGZpbmRzIGRlcGVuZGVuY2llcyBmb3IgZmlsZSBwcm90b3MuCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9wcm90bzogVGhlIHByb3RvIHRvIGdldCBkZXBlbmRlbmNpZXMgZnJvbS4KKworICAgIFlpZWxkczoKKyAgICAgIEVhY2ggZGlyZWN0IGFuZCBpbmRpcmVjdCBkZXBlbmRlbmN5LgorICAgICIiIgorCisgICAgZm9yIGRlcGVuZGVuY3kgaW4gZmlsZV9wcm90by5kZXBlbmRlbmN5OgorICAgICAgZGVwX2Rlc2MgPSBzZWxmLkZpbmRGaWxlQnlOYW1lKGRlcGVuZGVuY3kpCisgICAgICBkZXBfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgICAgZGVwX2Rlc2Muc2VyaWFsaXplZF9wYikKKyAgICAgIHlpZWxkIGRlcF9wcm90bworICAgICAgZm9yIHBhcmVudF9kZXAgaW4gc2VsZi5fR2V0RGVwcyhkZXBfcHJvdG8pOgorICAgICAgICB5aWVsZCBwYXJlbnRfZGVwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX19pbml0X18ucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hcGlfaW1wbGVtZW50YXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2UwMmEzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hcGlfaW1wbGVtZW50YXRpb24ucHkKQEAgLTAsMCArMSw4NyBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIgorVGhpcyBtb2R1bGUgaXMgdGhlIGNlbnRyYWwgZW50aXR5IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK0FQSSBpcyB1c2VkLgorIiIiCisKK19fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKKworaW1wb3J0IG9zCisjIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gc3dpdGNoIHRvIGEgY2VydGFpbiBpbXBsZW1lbnRhdGlvbgorIyBvZiB0aGUgUHl0aG9uIEFQSS4gUmlnaHQgbm93IG9ubHkgJ3B5dGhvbicgYW5kICdjcHAnIGFyZSB2YWxpZCB2YWx1ZXMuIEFueQorIyBvdGhlciB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuCitfaW1wbGVtZW50YXRpb25fdHlwZSA9IG9zLmdldGVudignUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT04nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbicpCisKKworaWYgX2ltcGxlbWVudGF0aW9uX3R5cGUgIT0gJ3B5dGhvbic6CisgICMgRm9yIG5vdywgYnkgZGVmYXVsdCB1c2UgdGhlIHB1cmUtUHl0aG9uIGltcGxlbWVudGF0aW9uLgorICAjIFRoZSBjb2RlIGJlbG93IGNoZWNrcyBpZiB0aGUgQyBleHRlbnNpb24gaXMgYXZhaWxhYmxlIGFuZAorICAjIHVzZXMgaXQgaWYgaXQgaXMgYXZhaWxhYmxlLgorICBfaW1wbGVtZW50YXRpb25fdHlwZSA9ICdjcHAnCisgICMjIERldGVybWluZSBhdXRvbWF0aWNhbGx5IHdoaWNoIGltcGxlbWVudGF0aW9uIHRvIHVzZS4KKyAgI3RyeToKKyAgIyAgZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNwcF9tZXNzYWdlCisgICMgIF9pbXBsZW1lbnRhdGlvbl90eXBlID0gJ2NwcCcKKyAgI2V4Y2VwdCBJbXBvcnRFcnJvciwgZToKKyAgIyAgX2ltcGxlbWVudGF0aW9uX3R5cGUgPSAncHl0aG9uJworCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvCisjICdjcHAnIGltcGxlbWVudGF0aW9ucy4gUmlnaHQgbm93IG9ubHkgMSBhbmQgMiBhcmUgdmFsaWQgdmFsdWVzLiBBbnkKKyMgb3RoZXIgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgorX2ltcGxlbWVudGF0aW9uX3ZlcnNpb25fc3RyID0gb3MuZ2V0ZW52KAorICAgICdQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTl9WRVJTSU9OJywKKyAgICAnMScpCisKKworaWYgX2ltcGxlbWVudGF0aW9uX3ZlcnNpb25fc3RyIG5vdCBpbiAoJzEnLCAnMicpOgorICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgInVuc3VwcG9ydGVkIFBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OX1ZFUlNJT046ICciICsKKyAgICAgIF9pbXBsZW1lbnRhdGlvbl92ZXJzaW9uX3N0ciArICInIChzdXBwb3J0ZWQgdmVyc2lvbnM6IDEsIDIpIgorICAgICAgKQorCisKK19pbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gaW50KF9pbXBsZW1lbnRhdGlvbl92ZXJzaW9uX3N0cikKKworCisKKyMgVXNhZ2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBkaXNjb3VyYWdlZC4gQ2xpZW50cyBzaG91bGRuJ3QgY2FyZSB3aGljaAorIyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJIGlzIGluIHVzZS4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZQorIyB0aGF0IGRpZmZlcmVuY2VzIGJldHdlZW4gQVBJcyB3aWxsIGJlIG1haW50YWluZWQuCisjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiBwb3NzaWJsZS4KK2RlZiBUeXBlKCk6CisgIHJldHVybiBfaW1wbGVtZW50YXRpb25fdHlwZQorCisjIFNlZSBjb21tZW50IG9uICdUeXBlJyBhYm92ZS4KK2RlZiBWZXJzaW9uKCk6CisgIHJldHVybiBfaW1wbGVtZW50YXRpb25fdmVyc2lvbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNGIzNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkKQEAgLTAsMCArMSwyNjkgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyBjb250YWluZXIgY2xhc3NlcyB0byByZXByZXNlbnQgZGlmZmVyZW50IHByb3RvY29sIGJ1ZmZlciB0eXBlcy4KKworVGhpcyBmaWxlIGRlZmluZXMgY29udGFpbmVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGNhdGVnb3JpZXMgb2YgcHJvdG9jb2wKK2J1ZmZlciBmaWVsZCB0eXBlcyB3aGljaCBuZWVkIGV4dHJhIG1haW50ZW5hbmNlLiBDdXJyZW50bHkgdGhlc2UgY2F0ZWdvcmllcworYXJlOgorICAtIFJlcGVhdGVkIHNjYWxhciBmaWVsZHMgLSBUaGVzZSBhcmUgYWxsIHJlcGVhdGVkIGZpZWxkcyB3aGljaCBhcmVuJ3QKKyAgICBjb21wb3NpdGUgKGUuZy4gdGhleSBhcmUgb2Ygc2ltcGxlIHR5cGVzIGxpa2UgaW50MzIsIHN0cmluZywgZXRjKS4KKyAgLSBSZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzIC0gUmVwZWF0ZWQgZmllbGRzIHdoaWNoIGFyZSBjb21wb3NpdGUuIFRoaXMKKyAgICBpbmNsdWRlcyBncm91cHMgYW5kIG5lc3RlZCBtZXNzYWdlcy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCisKKworY2xhc3MgQmFzZUNvbnRhaW5lcihvYmplY3QpOgorCisgICIiIkJhc2UgY29udGFpbmVyIGNsYXNzLiIiIgorCisgICMgTWluaW1pemVzIG1lbW9yeSB1c2FnZSBhbmQgZGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KKyAgX19zbG90c19fID0gWydfbWVzc2FnZV9saXN0ZW5lcicsICdfdmFsdWVzJ10KKworICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZV9saXN0ZW5lcik6CisgICAgIiIiCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICBUaGUgUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lciB3aWxsIGNhbGwgdGhpcyBvYmplY3QncworICAgICAgICBNb2RpZmllZCgpIG1ldGhvZCB3aGVuIGl0IGlzIG1vZGlmaWVkLgorICAgICIiIgorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyCisgICAgc2VsZi5fdmFsdWVzID0gW10KKworICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAiIiJSZXRyaWV2ZXMgaXRlbSBieSB0aGUgc3BlY2lmaWVkIGtleS4iIiIKKyAgICByZXR1cm4gc2VsZi5fdmFsdWVzW2tleV0KKworICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lci4iIiIKKyAgICByZXR1cm4gbGVuKHNlbGYuX3ZhbHVlcykKKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAiIiJDaGVja3MgaWYgYW5vdGhlciBpbnN0YW5jZSBpc24ndCBlcXVhbCB0byB0aGlzIG9uZS4iIiIKKyAgICAjIFRoZSBjb25jcmV0ZSBjbGFzc2VzIHNob3VsZCBkZWZpbmUgX19lcV9fLgorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuIHJlcHIoc2VsZi5fdmFsdWVzKQorCisgIGRlZiBzb3J0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgIyBDb250aW51ZSB0byBzdXBwb3J0IHRoZSBvbGQgc29ydF9mdW5jdGlvbiBrZXl3b3JkIGFyZ3VtZW50LgorICAgICMgVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhIHJhcmUgb2NjdXJyZW5jZSwgc28gdXNlIExCWUwgdG8gYXZvaWQKKyAgICAjIHRoZSBvdmVyaGVhZCBvZiBhY3R1YWxseSBjYXRjaGluZyBLZXlFcnJvci4KKyAgICBpZiAnc29ydF9mdW5jdGlvbicgaW4ga3dhcmdzOgorICAgICAga3dhcmdzWydjbXAnXSA9IGt3YXJncy5wb3AoJ3NvcnRfZnVuY3Rpb24nKQorICAgIHNlbGYuX3ZhbHVlcy5zb3J0KCphcmdzLCAqKmt3YXJncykKKworCitjbGFzcyBSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyKEJhc2VDb250YWluZXIpOgorCisgICIiIlNpbXBsZSwgdHlwZS1jaGVja2VkLCBsaXN0LWxpa2UgY29udGFpbmVyIGZvciBob2xkaW5nIHJlcGVhdGVkIHNjYWxhcnMuIiIiCisKKyAgIyBEaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgorICBfX3Nsb3RzX18gPSBbJ190eXBlX2NoZWNrZXInXQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX2xpc3RlbmVyLCB0eXBlX2NoZWNrZXIpOgorICAgICIiIgorICAgIEFyZ3M6CisgICAgICBtZXNzYWdlX2xpc3RlbmVyOiBBIE1lc3NhZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgVGhlIFJlcGVhdGVkU2NhbGFyRmllbGRDb250YWluZXIgd2lsbCBjYWxsIHRoaXMgb2JqZWN0J3MKKyAgICAgICAgTW9kaWZpZWQoKSBtZXRob2Qgd2hlbiBpdCBpcyBtb2RpZmllZC4KKyAgICAgIHR5cGVfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24gZWxlbWVudHMKKyAgICAgICAgaW5zZXJ0ZWQgaW50byB0aGlzIGNvbnRhaW5lci4KKyAgICAiIiIKKyAgICBzdXBlcihSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyLCBzZWxmKS5fX2luaXRfXyhtZXNzYWdlX2xpc3RlbmVyKQorICAgIHNlbGYuX3R5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcgorCisgIGRlZiBhcHBlbmQoc2VsZiwgdmFsdWUpOgorICAgICIiIkFwcGVuZHMgYW4gaXRlbSB0byB0aGUgbGlzdC4gU2ltaWxhciB0byBsaXN0LmFwcGVuZCgpLiIiIgorICAgIHNlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKHZhbHVlKQorICAgIHNlbGYuX3ZhbHVlcy5hcHBlbmQodmFsdWUpCisgICAgaWYgbm90IHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuZGlydHk6CisgICAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgaW5zZXJ0KHNlbGYsIGtleSwgdmFsdWUpOgorICAgICIiIkluc2VydHMgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gU2ltaWxhciB0byBsaXN0Lmluc2VydCgpLiIiIgorICAgIHNlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKHZhbHVlKQorICAgIHNlbGYuX3ZhbHVlcy5pbnNlcnQoa2V5LCB2YWx1ZSkKKyAgICBpZiBub3Qgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5kaXJ0eToKKyAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBleHRlbmQoc2VsZiwgZWxlbV9zZXEpOgorICAgICIiIkV4dGVuZHMgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbiBzZXF1ZW5jZS4gU2ltaWxhciB0byBsaXN0LmV4dGVuZCgpLiIiIgorICAgIGlmIG5vdCBlbGVtX3NlcToKKyAgICAgIHJldHVybgorCisgICAgbmV3X3ZhbHVlcyA9IFtdCisgICAgZm9yIGVsZW0gaW4gZWxlbV9zZXE6CisgICAgICBzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZShlbGVtKQorICAgICAgbmV3X3ZhbHVlcy5hcHBlbmQoZWxlbSkKKyAgICBzZWxmLl92YWx1ZXMuZXh0ZW5kKG5ld192YWx1ZXMpCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIE1lcmdlRnJvbShzZWxmLCBvdGhlcik6CisgICAgIiIiQXBwZW5kcyB0aGUgY29udGVudHMgb2YgYW5vdGhlciByZXBlYXRlZCBmaWVsZCBvZiB0aGUgc2FtZSB0eXBlIHRvIHRoaXMKKyAgICBvbmUuIFdlIGRvIG5vdCBjaGVjayB0aGUgdHlwZXMgb2YgdGhlIGluZGl2aWR1YWwgZmllbGRzLgorICAgICIiIgorICAgIHNlbGYuX3ZhbHVlcy5leHRlbmQob3RoZXIuX3ZhbHVlcykKKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgcmVtb3ZlKHNlbGYsIGVsZW0pOgorICAgICIiIlJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBsaXN0LiBTaW1pbGFyIHRvIGxpc3QucmVtb3ZlKCkuIiIiCisgICAgc2VsZi5fdmFsdWVzLnJlbW92ZShlbGVtKQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAiIiJTZXRzIHRoZSBpdGVtIG9uIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCisgICAgc2VsZi5fdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpCisgICAgc2VsZi5fdmFsdWVzW2tleV0gPSB2YWx1ZQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3ApOgorICAgICIiIlJldHJpZXZlcyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCisgICAgcmV0dXJuIHNlbGYuX3ZhbHVlc1tzdGFydDpzdG9wXQorCisgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3AsIHZhbHVlcyk6CisgICAgIiIiU2V0cyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCisgICAgbmV3X3ZhbHVlcyA9IFtdCisgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKKyAgICAgIHNlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKHZhbHVlKQorICAgICAgbmV3X3ZhbHVlcy5hcHBlbmQodmFsdWUpCisgICAgc2VsZi5fdmFsdWVzW3N0YXJ0OnN0b3BdID0gbmV3X3ZhbHVlcworICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICIiIkRlbGV0ZXMgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4iIiIKKyAgICBkZWwgc2VsZi5fdmFsdWVzW2tleV0KKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKKyAgICAiIiJEZWxldGVzIHRoZSBzdWJzZXQgb2YgaXRlbXMgZnJvbSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy4iIiIKKyAgICBkZWwgc2VsZi5fdmFsdWVzW3N0YXJ0OnN0b3BdCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgIiIiQ29tcGFyZXMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugd2l0aCBhbm90aGVyIG9uZS4iIiIKKyAgICBpZiBzZWxmIGlzIG90aGVyOgorICAgICAgcmV0dXJuIFRydWUKKyAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHNhbWUgdHlwZSB3aGljaCBzaG91bGQgYmUgY29tbW9uIGFuZCBmYXN0LgorICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgIHJldHVybiBvdGhlci5fdmFsdWVzID09IHNlbGYuX3ZhbHVlcworICAgICMgV2UgYXJlIHByZXN1bWFibHkgY29tcGFyaW5nIGFnYWluc3Qgc29tZSBvdGhlciBzZXF1ZW5jZSB0eXBlLgorICAgIHJldHVybiBvdGhlciA9PSBzZWxmLl92YWx1ZXMKKworCitjbGFzcyBSZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyKEJhc2VDb250YWluZXIpOgorCisgICIiIlNpbXBsZSwgbGlzdC1saWtlIGNvbnRhaW5lciBmb3IgaG9sZGluZyByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLiIiIgorCisgICMgRGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KKyAgX19zbG90c19fID0gWydfbWVzc2FnZV9kZXNjcmlwdG9yJ10KKworICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZV9saXN0ZW5lciwgbWVzc2FnZV9kZXNjcmlwdG9yKToKKyAgICAiIiIKKyAgICBOb3RlIHRoYXQgd2UgcGFzcyBpbiBhIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiB0aGUgZ2VuZXJhdGVkIGRpcmVjdGx5LAorICAgIHNpbmNlIGF0IHRoZSB0aW1lIHdlIGNvbnN0cnVjdCBhIF9SZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIHdlCisgICAgaGF2ZW4ndCB5ZXQgbmVjZXNzYXJpbHkgaW5pdGlhbGl6ZWQgdGhlIHR5cGUgdGhhdCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgICBjb250YWluZXIuCisKKyAgICBBcmdzOgorICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQSBNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICAgIFRoZSBSZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzCisgICAgICAgIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQgaXMgbW9kaWZpZWQuCisgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IEEgRGVzY3JpcHRvciBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZSBwcm90b2NvbCB0eXBlCisgICAgICAgIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhpcyBjb250YWluZXIuICBXZSdsbCB1c2UgdGhlCisgICAgICAgIF9jb25jcmV0ZV9jbGFzcyBmaWVsZCBvZiB0aGlzIGRlc2NyaXB0b3Igd2hlbiB0aGUgY2xpZW50IGNhbGxzIGFkZCgpLgorICAgICIiIgorICAgIHN1cGVyKFJlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXIsIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2VfbGlzdGVuZXIpCisgICAgc2VsZi5fbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yCisKKyAgZGVmIGFkZChzZWxmLCAqKmt3YXJncyk6CisgICAgIiIiQWRkcyBhIG5ldyBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuIEtleXdvcmQKKyAgICBhcmd1bWVudHMgbWF5IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZWxlbWVudC4KKyAgICAiIiIKKyAgICBuZXdfZWxlbWVudCA9IHNlbGYuX21lc3NhZ2VfZGVzY3JpcHRvci5fY29uY3JldGVfY2xhc3MoKiprd2FyZ3MpCisgICAgbmV3X2VsZW1lbnQuX1NldExpc3RlbmVyKHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIpCisgICAgc2VsZi5fdmFsdWVzLmFwcGVuZChuZXdfZWxlbWVudCkKKyAgICBpZiBub3Qgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5kaXJ0eToKKyAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorICAgIHJldHVybiBuZXdfZWxlbWVudAorCisgIGRlZiBleHRlbmQoc2VsZiwgZWxlbV9zZXEpOgorICAgICIiIkV4dGVuZHMgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlCisgICAgYXMgdGhpcyBvbmUsIGNvcHlpbmcgZWFjaCBpbmRpdmlkdWFsIG1lc3NhZ2UuCisgICAgIiIiCisgICAgbWVzc2FnZV9jbGFzcyA9IHNlbGYuX21lc3NhZ2VfZGVzY3JpcHRvci5fY29uY3JldGVfY2xhc3MKKyAgICBsaXN0ZW5lciA9IHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIKKyAgICB2YWx1ZXMgPSBzZWxmLl92YWx1ZXMKKyAgICBmb3IgbWVzc2FnZSBpbiBlbGVtX3NlcToKKyAgICAgIG5ld19lbGVtZW50ID0gbWVzc2FnZV9jbGFzcygpCisgICAgICBuZXdfZWxlbWVudC5fU2V0TGlzdGVuZXIobGlzdGVuZXIpCisgICAgICBuZXdfZWxlbWVudC5NZXJnZUZyb20obWVzc2FnZSkKKyAgICAgIHZhbHVlcy5hcHBlbmQobmV3X2VsZW1lbnQpCisgICAgbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXIpOgorICAgICIiIkFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgcmVwZWF0ZWQgZmllbGQgb2YgdGhlIHNhbWUgdHlwZSB0byB0aGlzCisgICAgb25lLCBjb3B5aW5nIGVhY2ggaW5kaXZpZHVhbCBtZXNzYWdlLgorICAgICIiIgorICAgIHNlbGYuZXh0ZW5kKG90aGVyLl92YWx1ZXMpCisKKyAgZGVmIHJlbW92ZShzZWxmLCBlbGVtKToKKyAgICAiIiJSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgbGlzdC4gU2ltaWxhciB0byBsaXN0LnJlbW92ZSgpLiIiIgorICAgIHNlbGYuX3ZhbHVlcy5yZW1vdmUoZWxlbSkKKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKKyAgICAiIiJSZXRyaWV2ZXMgdGhlIHN1YnNldCBvZiBpdGVtcyBmcm9tIGJldHdlZW4gdGhlIHNwZWNpZmllZCBpbmRpY2VzLiIiIgorICAgIHJldHVybiBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0KKworICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAiIiJEZWxldGVzIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCisgICAgZGVsIHNlbGYuX3ZhbHVlc1trZXldCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fZGVsc2xpY2VfXyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgIiIiRGVsZXRlcyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCisgICAgZGVsIHNlbGYuX3ZhbHVlc1tzdGFydDpzdG9wXQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICIiIkNvbXBhcmVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHdpdGggYW5vdGhlciBvbmUuIiIiCisgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgIHJldHVybiBUcnVlCisgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2FuIG9ubHkgY29tcGFyZSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzIGFnYWluc3QgJworICAgICAgICAgICAgICAgICAgICAgICdvdGhlciByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLicpCisgICAgcmV0dXJuIHNlbGYuX3ZhbHVlcyA9PSBvdGhlci5fdmFsdWVzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY3BwX21lc3NhZ2UucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY3BwX21lc3NhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjNhYjliYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jcHBfbWVzc2FnZS5weQpAQCAtMCwwICsxLDY2MyBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBjcmVhdGUgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGZyb20KK0Rlc2NyaXB0b3Igb2JqZWN0cyBhdCBydW50aW1lIGJhY2tlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIEMrKyBBUEkuCisiIiIKKworX19hdXRob3JfXyA9ICdwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpJworCitpbXBvcnQgY29weV9yZWcKK2ltcG9ydCBvcGVyYXRvcgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IF9uZXRfcHJvdG8yX19fcHl0aG9uCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW51bV90eXBlX3dyYXBwZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCisKKworX0xBQkVMX1JFUEVBVEVEID0gX25ldF9wcm90bzJfX19weXRob24uTEFCRUxfUkVQRUFURUQKK19MQUJFTF9PUFRJT05BTCA9IF9uZXRfcHJvdG8yX19fcHl0aG9uLkxBQkVMX09QVElPTkFMCitfQ1BQVFlQRV9NRVNTQUdFID0gX25ldF9wcm90bzJfX19weXRob24uQ1BQVFlQRV9NRVNTQUdFCitfVFlQRV9NRVNTQUdFID0gX25ldF9wcm90bzJfX19weXRob24uVFlQRV9NRVNTQUdFCisKKworZGVmIEdldERlc2NyaXB0b3JQb29sKCk6CisgICIiIkNyZWF0ZXMgYSBuZXcgRGVzY3JpcHRvclBvb2wgQysrIG9iamVjdC4iIiIKKyAgcmV0dXJuIF9uZXRfcHJvdG8yX19fcHl0aG9uLk5ld0NEZXNjcmlwdG9yUG9vbCgpCisKKworX3Bvb2wgPSBHZXREZXNjcmlwdG9yUG9vbCgpCisKKworZGVmIEdldEZpZWxkRGVzY3JpcHRvcihmdWxsX2ZpZWxkX25hbWUpOgorICAiIiJTZWFyY2hlcyBmb3IgYSBmaWVsZCBkZXNjcmlwdG9yIGdpdmVuIGEgZnVsbCBmaWVsZCBuYW1lLiIiIgorICByZXR1cm4gX3Bvb2wuRmluZEZpZWxkQnlOYW1lKGZ1bGxfZmllbGRfbmFtZSkKKworCitkZWYgQnVpbGRGaWxlKGNvbnRlbnQpOgorICAiIiJSZWdpc3RlcnMgYSBuZXcgcHJvdG8gZmlsZSBpbiB0aGUgdW5kZXJseWluZyBDKysgZGVzY3JpcHRvciBwb29sLiIiIgorICBfbmV0X3Byb3RvMl9fX3B5dGhvbi5CdWlsZEZpbGUoY29udGVudCkKKworCitkZWYgR2V0RXh0ZW5zaW9uRGVzY3JpcHRvcihmdWxsX2V4dGVuc2lvbl9uYW1lKToKKyAgIiIiU2VhcmNoZXMgZm9yIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGdpdmVuIGEgZnVsbCBmaWVsZCBuYW1lLiIiIgorICByZXR1cm4gX3Bvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZShmdWxsX2V4dGVuc2lvbl9uYW1lKQorCisKK2RlZiBOZXdDTWVzc2FnZShmdWxsX21lc3NhZ2VfbmFtZSk6CisgICIiIkNyZWF0ZXMgYSBuZXcgQysrIHByb3RvY29sIG1lc3NhZ2UgYnkgaXRzIG5hbWUuIiIiCisgIHJldHVybiBfbmV0X3Byb3RvMl9fX3B5dGhvbi5OZXdDTWVzc2FnZShmdWxsX21lc3NhZ2VfbmFtZSkKKworCitkZWYgU2NhbGFyUHJvcGVydHkoY2Rlc2NyaXB0b3IpOgorICAiIiJSZXR1cm5zIGEgc2NhbGFyIHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4iIiIKKworICBkZWYgR2V0dGVyKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLkdldFNjYWxhcihjZGVzY3JpcHRvcikKKworICBkZWYgU2V0dGVyKHNlbGYsIHZhbHVlKToKKyAgICBzZWxmLl9jbXNnLlNldFNjYWxhcihjZGVzY3JpcHRvciwgdmFsdWUpCisKKyAgcmV0dXJuIHByb3BlcnR5KEdldHRlciwgU2V0dGVyKQorCisKK2RlZiBDb21wb3NpdGVQcm9wZXJ0eShjZGVzY3JpcHRvciwgbWVzc2FnZV90eXBlKToKKyAgIiIiUmV0dXJucyBhIFB5dGhvbiBwcm9wZXJ0eSB0aGUgZ2l2ZW4gY29tcG9zaXRlIGZpZWxkLiIiIgorCisgIGRlZiBHZXR0ZXIoc2VsZik6CisgICAgc3ViX21lc3NhZ2UgPSBzZWxmLl9jb21wb3NpdGVfZmllbGRzLmdldChjZGVzY3JpcHRvci5uYW1lLCBOb25lKQorICAgIGlmIHN1Yl9tZXNzYWdlIGlzIE5vbmU6CisgICAgICBjbWVzc2FnZSA9IHNlbGYuX2Ntc2cuTmV3U3ViTWVzc2FnZShjZGVzY3JpcHRvcikKKyAgICAgIHN1Yl9tZXNzYWdlID0gbWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcyhfX2NtZXNzYWdlPWNtZXNzYWdlKQorICAgICAgc2VsZi5fY29tcG9zaXRlX2ZpZWxkc1tjZGVzY3JpcHRvci5uYW1lXSA9IHN1Yl9tZXNzYWdlCisgICAgcmV0dXJuIHN1Yl9tZXNzYWdlCisKKyAgcmV0dXJuIHByb3BlcnR5KEdldHRlcikKKworCitjbGFzcyBSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihvYmplY3QpOgorICAiIiJDb250YWluZXIgZm9yIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMuIiIiCisKKyAgX19zbG90c19fID0gWydfbWVzc2FnZScsICdfY2ZpZWxkX2Rlc2NyaXB0b3InLCAnX2Ntc2cnXQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIGNmaWVsZF9kZXNjcmlwdG9yKToKKyAgICBzZWxmLl9tZXNzYWdlID0gbXNnCisgICAgc2VsZi5fY21zZyA9IG1zZy5fY21zZworICAgIHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yID0gY2ZpZWxkX2Rlc2NyaXB0b3IKKworICBkZWYgYXBwZW5kKHNlbGYsIHZhbHVlKToKKyAgICBzZWxmLl9jbXNnLkFkZFJlcGVhdGVkU2NhbGFyKAorICAgICAgICBzZWxmLl9jZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpCisKKyAgZGVmIGV4dGVuZChzZWxmLCBzZXF1ZW5jZSk6CisgICAgZm9yIGVsZW1lbnQgaW4gc2VxdWVuY2U6CisgICAgICBzZWxmLmFwcGVuZChlbGVtZW50KQorCisgIGRlZiBpbnNlcnQoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgdmFsdWVzID0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KKyAgICB2YWx1ZXMuaW5zZXJ0KGtleSwgdmFsdWUpCisgICAgc2VsZi5fY21zZy5Bc3NpZ25SZXBlYXRlZFNjYWxhcihzZWxmLl9jZmllbGRfZGVzY3JpcHRvciwgdmFsdWVzKQorCisgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOgorICAgIHZhbHVlcyA9IHNlbGZbc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSldCisgICAgdmFsdWVzLnJlbW92ZSh2YWx1ZSkKKyAgICBzZWxmLl9jbXNnLkFzc2lnblJlcGVhdGVkU2NhbGFyKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZXMpCisKKyAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgIHZhbHVlcyA9IHNlbGZbc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSldCisgICAgdmFsdWVzW2tleV0gPSB2YWx1ZQorICAgIHNlbGYuX2Ntc2cuQXNzaWduUmVwZWF0ZWRTY2FsYXIoc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlcykKKworICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICByZXR1cm4gc2VsZi5fY21zZy5HZXRSZXBlYXRlZFNjYWxhcihzZWxmLl9jZmllbGRfZGVzY3JpcHRvciwga2V5KQorCisgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgIHNlbGYuX2Ntc2cuRGVsZXRlUmVwZWF0ZWRGaWVsZChzZWxmLl9jZmllbGRfZGVzY3JpcHRvciwga2V5KQorCisgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgIHJldHVybiBsZW4oc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0pCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgIHJldHVybiBUcnVlCisgICAgaWYgbm90IG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKG90aGVyKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAnQ2FuIG9ubHkgY29tcGFyZSByZXBlYXRlZCBzY2FsYXIgZmllbGRzIGFnYWluc3Qgc2VxdWVuY2VzLicpCisgICAgIyBXZSBhcmUgcHJlc3VtYWJseSBjb21wYXJpbmcgYWdhaW5zdCBzb21lIG90aGVyIHNlcXVlbmNlIHR5cGUuCisgICAgcmV0dXJuIG90aGVyID09IHNlbGZbc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSldCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHJhaXNlIFR5cGVFcnJvcigndW5oYXNoYWJsZSBvYmplY3QnKQorCisgIGRlZiBzb3J0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgIyBNYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHByZXZpb3VzIGludGVyZmFjZS4KKyAgICBpZiAnc29ydF9mdW5jdGlvbicgaW4ga3dhcmdzOgorICAgICAga3dhcmdzWydjbXAnXSA9IGt3YXJncy5wb3AoJ3NvcnRfZnVuY3Rpb24nKQorICAgIHNlbGYuX2Ntc2cuQXNzaWduUmVwZWF0ZWRTY2FsYXIoc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKSkKKworCitkZWYgUmVwZWF0ZWRTY2FsYXJQcm9wZXJ0eShjZGVzY3JpcHRvcik6CisgICIiIlJldHVybnMgYSBQeXRob24gcHJvcGVydHkgdGhlIGdpdmVuIHJlcGVhdGVkIHNjYWxhciBmaWVsZC4iIiIKKworICBkZWYgR2V0dGVyKHNlbGYpOgorICAgIGNvbnRhaW5lciA9IHNlbGYuX2NvbXBvc2l0ZV9maWVsZHMuZ2V0KGNkZXNjcmlwdG9yLm5hbWUsIE5vbmUpCisgICAgaWYgY29udGFpbmVyIGlzIE5vbmU6CisgICAgICBjb250YWluZXIgPSBSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihzZWxmLCBjZGVzY3JpcHRvcikKKyAgICAgIHNlbGYuX2NvbXBvc2l0ZV9maWVsZHNbY2Rlc2NyaXB0b3IubmFtZV0gPSBjb250YWluZXIKKyAgICByZXR1cm4gY29udGFpbmVyCisKKyAgZGVmIFNldHRlcihzZWxmLCBuZXdfdmFsdWUpOgorICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCdBc3NpZ25tZW50IG5vdCBhbGxvd2VkIHRvIHJlcGVhdGVkIGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIiVzIiBpbiBwcm90b2NvbCBtZXNzYWdlIG9iamVjdC4nICUgY2Rlc2NyaXB0b3IubmFtZSkKKworICBkb2MgPSAnTWFnaWMgYXR0cmlidXRlIGdlbmVyYXRlZCBmb3IgIiVzIiBwcm90byBmaWVsZC4nICUgY2Rlc2NyaXB0b3IubmFtZQorICByZXR1cm4gcHJvcGVydHkoR2V0dGVyLCBTZXR0ZXIsIGRvYz1kb2MpCisKKworY2xhc3MgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIob2JqZWN0KToKKyAgIiIiQ29udGFpbmVyIGZvciByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLiIiIgorCisgIF9fc2xvdHNfXyA9IFsnX21lc3NhZ2UnLCAnX3N1YmNsYXNzJywgJ19jZmllbGRfZGVzY3JpcHRvcicsICdfY21zZyddCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgY2ZpZWxkX2Rlc2NyaXB0b3IsIHN1YmNsYXNzKToKKyAgICBzZWxmLl9tZXNzYWdlID0gbXNnCisgICAgc2VsZi5fY21zZyA9IG1zZy5fY21zZworICAgIHNlbGYuX3N1YmNsYXNzID0gc3ViY2xhc3MKKyAgICBzZWxmLl9jZmllbGRfZGVzY3JpcHRvciA9IGNmaWVsZF9kZXNjcmlwdG9yCisKKyAgZGVmIGFkZChzZWxmLCAqKmt3YXJncyk6CisgICAgY21lc3NhZ2UgPSBzZWxmLl9jbXNnLkFkZE1lc3NhZ2Uoc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IpCisgICAgcmV0dXJuIHNlbGYuX3N1YmNsYXNzKF9fY21lc3NhZ2U9Y21lc3NhZ2UsIF9fb3duZXI9c2VsZi5fbWVzc2FnZSwgKiprd2FyZ3MpCisKKyAgZGVmIGV4dGVuZChzZWxmLCBlbGVtX3NlcSk6CisgICAgIiIiRXh0ZW5kcyBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIHNlcXVlbmNlIG9mIGVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUKKyAgICBhcyB0aGlzIG9uZSwgY29weWluZyBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZS4KKyAgICAiIiIKKyAgICBmb3IgbWVzc2FnZSBpbiBlbGVtX3NlcToKKyAgICAgIHNlbGYuYWRkKCkuTWVyZ2VGcm9tKG1lc3NhZ2UpCisKKyAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6CisgICAgIyBUT0RPKHByb3RvY29sLWRldmVsKTogVGhpcyBpcyBpbmVmZmljaWVudCBhcyBpdCBuZWVkcyB0byBnZW5lcmF0ZSBhCisgICAgIyBtZXNzYWdlIHBvaW50ZXIgZm9yIGVhY2ggbWVzc2FnZSBvbmx5IHRvIGRvIGluZGV4KCkuICBNb3ZlIHRoaXMgdG8gYSBDKysKKyAgICAjIGV4dGVuc2lvbiBmdW5jdGlvbi4KKyAgICBzZWxmLl9fZGVsaXRlbV9fKHNlbGZbc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSldLmluZGV4KHZhbHVlKSkKKworICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyKToKKyAgICBmb3IgbWVzc2FnZSBpbiBvdGhlcls6XToKKyAgICAgIHNlbGYuYWRkKCkuTWVyZ2VGcm9tKG1lc3NhZ2UpCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgY21lc3NhZ2VzID0gc2VsZi5fY21zZy5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICAgIHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCBrZXkpCisgICAgc3ViY2xhc3MgPSBzZWxmLl9zdWJjbGFzcworICAgIGlmIG5vdCBpc2luc3RhbmNlKGNtZXNzYWdlcywgbGlzdCk6CisgICAgICByZXR1cm4gc3ViY2xhc3MoX19jbWVzc2FnZT1jbWVzc2FnZXMsIF9fb3duZXI9c2VsZi5fbWVzc2FnZSkKKworICAgIHJldHVybiBbc3ViY2xhc3MoX19jbWVzc2FnZT1tLCBfX293bmVyPXNlbGYuX21lc3NhZ2UpIGZvciBtIGluIGNtZXNzYWdlc10KKworICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICBzZWxmLl9jbXNnLkRlbGV0ZVJlcGVhdGVkRmllbGQoCisgICAgICAgIHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCBrZXkpCisKKyAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2Ntc2cuRmllbGRMZW5ndGgoc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgIiIiQ29tcGFyZXMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugd2l0aCBhbm90aGVyIG9uZS4iIiIKKyAgICBpZiBzZWxmIGlzIG90aGVyOgorICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW4gb25seSBjb21wYXJlIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMgYWdhaW5zdCAnCisgICAgICAgICAgICAgICAgICAgICAgJ290aGVyIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuJykKKyAgICBtZXNzYWdlcyA9IHNlbGZbc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSldCisgICAgb3RoZXJfbWVzc2FnZXMgPSBvdGhlcltzbGljZShOb25lLCBOb25lLCBOb25lKV0KKyAgICByZXR1cm4gbWVzc2FnZXMgPT0gb3RoZXJfbWVzc2FnZXMKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCisKKyAgZGVmIHNvcnQoc2VsZiwgY21wPU5vbmUsIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlLCAqKmt3YXJncyk6CisgICAgIyBNYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBpbnRlcmZhY2UuCisgICAgaWYgY21wIGlzIE5vbmUgYW5kICdzb3J0X2Z1bmN0aW9uJyBpbiBrd2FyZ3M6CisgICAgICBjbXAgPSBrd2FyZ3MucG9wKCdzb3J0X2Z1bmN0aW9uJykKKworICAgICMgVGhlIGNtcCBmdW5jdGlvbiwgaWYgcHJvdmlkZWQsIGlzIHBhc3NlZCB0aGUgcmVzdWx0cyBvZiB0aGUga2V5IGZ1bmN0aW9uLAorICAgICMgc28gd2Ugb25seSBuZWVkIHRvIHdyYXAgb25lIG9mIHRoZW0uCisgICAgaWYga2V5IGlzIE5vbmU6CisgICAgICBpbmRleF9rZXkgPSBzZWxmLl9fZ2V0aXRlbV9fCisgICAgZWxzZToKKyAgICAgIGluZGV4X2tleSA9IGxhbWJkYSBpOiBrZXkoc2VsZltpXSkKKworICAgICMgU29ydCB0aGUgbGlzdCBvZiBjdXJyZW50IGluZGV4ZXMgYnkgdGhlIHVuZGVybHlpbmcgb2JqZWN0LgorICAgIGluZGV4ZXMgPSByYW5nZShsZW4oc2VsZikpCisgICAgaW5kZXhlcy5zb3J0KGNtcD1jbXAsIGtleT1pbmRleF9rZXksIHJldmVyc2U9cmV2ZXJzZSkKKworICAgICMgQXBwbHkgdGhlIHRyYW5zcG9zaXRpb24uCisgICAgZm9yIGRlc3QsIHNyYyBpbiBlbnVtZXJhdGUoaW5kZXhlcyk6CisgICAgICBpZiBkZXN0ID09IHNyYzoKKyAgICAgICAgY29udGludWUKKyAgICAgIHNlbGYuX2Ntc2cuU3dhcFJlcGVhdGVkRmllbGRFbGVtZW50cyhzZWxmLl9jZmllbGRfZGVzY3JpcHRvciwgZGVzdCwgc3JjKQorICAgICAgIyBEb24ndCBzd2FwIHRoZSBzYW1lIHZhbHVlIHR3aWNlLgorICAgICAgaW5kZXhlc1tzcmNdID0gc3JjCisKKworZGVmIFJlcGVhdGVkQ29tcG9zaXRlUHJvcGVydHkoY2Rlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZSk6CisgICIiIlJldHVybnMgYSBQeXRob24gcHJvcGVydHkgZm9yIHRoZSBnaXZlbiByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiIiCisKKyAgZGVmIEdldHRlcihzZWxmKToKKyAgICBjb250YWluZXIgPSBzZWxmLl9jb21wb3NpdGVfZmllbGRzLmdldChjZGVzY3JpcHRvci5uYW1lLCBOb25lKQorICAgIGlmIGNvbnRhaW5lciBpcyBOb25lOgorICAgICAgY29udGFpbmVyID0gUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIoCisgICAgICAgICAgc2VsZiwgY2Rlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MpCisgICAgICBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2NkZXNjcmlwdG9yLm5hbWVdID0gY29udGFpbmVyCisgICAgcmV0dXJuIGNvbnRhaW5lcgorCisgIGRlZiBTZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIGNkZXNjcmlwdG9yLm5hbWUpCisKKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIGNkZXNjcmlwdG9yLm5hbWUKKyAgcmV0dXJuIHByb3BlcnR5KEdldHRlciwgU2V0dGVyLCBkb2M9ZG9jKQorCisKK2NsYXNzIEV4dGVuc2lvbkRpY3Qob2JqZWN0KToKKyAgIiIiRXh0ZW5zaW9uIGRpY3Rpb25hcnkgYWRkZWQgdG8gZWFjaCBwcm90b2NvbCBtZXNzYWdlLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cpOgorICAgIHNlbGYuX21lc3NhZ2UgPSBtc2cKKyAgICBzZWxmLl9jbXNnID0gbXNnLl9jbXNnCisgICAgc2VsZi5fdmFsdWVzID0ge30KKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwgZXh0ZW5zaW9uLCB2YWx1ZSk6CisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKKyAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCisgICAgY2Rlc2NyaXB0b3IgPSBleHRlbnNpb24uX2NkZXNjcmlwdG9yCisgICAgaWYgKGNkZXNjcmlwdG9yLmxhYmVsICE9IF9MQUJFTF9PUFRJT05BTCBvcgorICAgICAgICBjZGVzY3JpcHRvci5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignRXh0ZW5zaW9uICVyIGlzIHJlcGVhdGVkIGFuZC9vciBhIGNvbXBvc2l0ZSB0eXBlLicgJSAoCisgICAgICAgICAgZXh0ZW5zaW9uLmZ1bGxfbmFtZSwpKQorICAgIHNlbGYuX2Ntc2cuU2V0U2NhbGFyKGNkZXNjcmlwdG9yLCB2YWx1ZSkKKyAgICBzZWxmLl92YWx1ZXNbZXh0ZW5zaW9uXSA9IHZhbHVlCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGV4dGVuc2lvbik6CisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKKyAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCisKKyAgICBjZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5fY2Rlc2NyaXB0b3IKKyAgICBpZiAoY2Rlc2NyaXB0b3IubGFiZWwgIT0gX0xBQkVMX1JFUEVBVEVEIGFuZAorICAgICAgICBjZGVzY3JpcHRvci5jcHBfdHlwZSAhPSBfQ1BQVFlQRV9NRVNTQUdFKToKKyAgICAgIHJldHVybiBzZWxmLl9jbXNnLkdldFNjYWxhcihjZGVzY3JpcHRvcikKKworICAgIGV4dCA9IHNlbGYuX3ZhbHVlcy5nZXQoZXh0ZW5zaW9uLCBOb25lKQorICAgIGlmIGV4dCBpcyBub3QgTm9uZToKKyAgICAgIHJldHVybiBleHQKKworICAgIGV4dCA9IHNlbGYuX0NyZWF0ZU5ld0hhbmRsZShleHRlbnNpb24pCisgICAgc2VsZi5fdmFsdWVzW2V4dGVuc2lvbl0gPSBleHQKKyAgICByZXR1cm4gZXh0CisKKyAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik6CisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKKyAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCisgICAgc2VsZi5fY21zZy5DbGVhckZpZWxkQnlEZXNjcmlwdG9yKGV4dGVuc2lvbi5fY2Rlc2NyaXB0b3IpCisgICAgaWYgZXh0ZW5zaW9uIGluIHNlbGYuX3ZhbHVlczoKKyAgICAgIGRlbCBzZWxmLl92YWx1ZXNbZXh0ZW5zaW9uXQorCisgIGRlZiBIYXNFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uKToKKyAgICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dGVuc2lvbiwgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IpOgorICAgICAgcmFpc2UgS2V5RXJyb3IoJ0JhZCBleHRlbnNpb24gJXIuJyAlIChleHRlbnNpb24sKSkKKyAgICByZXR1cm4gc2VsZi5fY21zZy5IYXNGaWVsZEJ5RGVzY3JpcHRvcihleHRlbnNpb24uX2NkZXNjcmlwdG9yKQorCisgIGRlZiBfRmluZEV4dGVuc2lvbkJ5TmFtZShzZWxmLCBuYW1lKToKKyAgICAiIiJUcmllcyB0byBmaW5kIGEga25vd24gZXh0ZW5zaW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IEV4dGVuc2lvbiBmdWxsIG5hbWUuCisKKyAgICBSZXR1cm5zOgorICAgICAgRXh0ZW5zaW9uIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgIiIiCisgICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UuX2V4dGVuc2lvbnNfYnlfbmFtZS5nZXQobmFtZSwgTm9uZSkKKworICBkZWYgX0NyZWF0ZU5ld0hhbmRsZShzZWxmLCBleHRlbnNpb24pOgorICAgIGNkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLl9jZGVzY3JpcHRvcgorICAgIGlmIChjZGVzY3JpcHRvci5sYWJlbCAhPSBfTEFCRUxfUkVQRUFURUQgYW5kCisgICAgICAgIGNkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0UpOgorICAgICAgY21lc3NhZ2UgPSBzZWxmLl9jbXNnLk5ld1N1Yk1lc3NhZ2UoY2Rlc2NyaXB0b3IpCisgICAgICByZXR1cm4gZXh0ZW5zaW9uLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoX19jbWVzc2FnZT1jbWVzc2FnZSkKKworICAgIGlmIGNkZXNjcmlwdG9yLmxhYmVsID09IF9MQUJFTF9SRVBFQVRFRDoKKyAgICAgIGlmIGNkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHJldHVybiBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcigKKyAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UsIGNkZXNjcmlwdG9yLCBleHRlbnNpb24ubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcykKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihzZWxmLl9tZXNzYWdlLCBjZGVzY3JpcHRvcikKKyAgICAjIFRoaXMgc2hvdWxkbid0IGhhcHBlbiEKKyAgICBhc3NlcnQgRmFsc2UKKyAgICByZXR1cm4gTm9uZQorCisKK2RlZiBOZXdNZXNzYWdlKGJhc2VzLCBtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpOgorICAiIiJDcmVhdGVzIGEgbmV3IHByb3RvY29sIG1lc3NhZ2UgKmNsYXNzKi4iIiIKKyAgX0FkZENsYXNzQXR0cmlidXRlc0Zvck5lc3RlZEV4dGVuc2lvbnMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KQorICBfQWRkRW51bVZhbHVlcyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpCisgIF9BZGREZXNjcmlwdG9ycyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpCisgIHJldHVybiBiYXNlcworCisKK2RlZiBJbml0TWVzc2FnZShtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkNvbnN0cnVjdHMgYSBuZXcgbWVzc2FnZSBpbnN0YW5jZSAoY2FsbGVkIGJlZm9yZSBpbnN0YW5jZSdzIF9faW5pdF9fKS4iIiIKKyAgY2xzLl9leHRlbnNpb25zX2J5X25hbWUgPSB7fQorICBfQWRkSW5pdE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZE1lc3NhZ2VNZXRob2RzKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkUHJvcGVydGllc0ZvckV4dGVuc2lvbnMobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIGNvcHlfcmVnLnBpY2tsZShjbHMsIGxhbWJkYSBvYmo6IChjbHMsICgpLCBvYmouX19nZXRzdGF0ZV9fKCkpKQorCisKK2RlZiBfQWRkRGVzY3JpcHRvcnMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKKyAgIiIiU2V0cyB1cCBhIG5ldyBwcm90b2NvbCBtZXNzYWdlIGNsYXNzIGRpY3Rpb25hcnkuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IEEgRGVzY3JpcHRvciBpbnN0YW5jZSBkZXNjcmliaW5nIHRoaXMgbWVzc2FnZSB0eXBlLgorICAgIGRpY3Rpb25hcnk6IENsYXNzIGRpY3Rpb25hcnkgdG8gd2hpY2ggd2UnbGwgYWRkIGEgJ19fc2xvdHNfXycgZW50cnkuCisgICIiIgorICBkaWN0aW9uYXJ5WydfX2Rlc2NyaXB0b3JzJ10gPSB7fQorICBmb3IgZmllbGQgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkczoKKyAgICBkaWN0aW9uYXJ5WydfX2Rlc2NyaXB0b3JzJ11bZmllbGQubmFtZV0gPSBHZXRGaWVsZERlc2NyaXB0b3IoCisgICAgICAgIGZpZWxkLmZ1bGxfbmFtZSkKKworICBkaWN0aW9uYXJ5WydfX3Nsb3RzX18nXSA9IGxpc3QoZGljdGlvbmFyeVsnX19kZXNjcmlwdG9ycyddLml0ZXJrZXlzKCkpICsgWworICAgICAgJ19jbXNnJywgJ19vd25lcicsICdfY29tcG9zaXRlX2ZpZWxkcycsICdFeHRlbnNpb25zJywgJ19IQUNLX1JFRkNPVU5UUyddCisKKworZGVmIF9BZGRFbnVtVmFsdWVzKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6CisgICIiIlNldHMgY2xhc3MtbGV2ZWwgYXR0cmlidXRlcyBmb3IgYWxsIGVudW0gZmllbGRzIGRlZmluZWQgaW4gdGhpcyBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhpcyBtZXNzYWdlIHR5cGUuCisgICAgZGljdGlvbmFyeTogQ2xhc3MgZGljdGlvbmFyeSB0aGF0IHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICIiIgorICBmb3IgZW51bV90eXBlIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVzOgorICAgIGRpY3Rpb25hcnlbZW51bV90eXBlLm5hbWVdID0gZW51bV90eXBlX3dyYXBwZXIuRW51bVR5cGVXcmFwcGVyKGVudW1fdHlwZSkKKyAgICBmb3IgZW51bV92YWx1ZSBpbiBlbnVtX3R5cGUudmFsdWVzOgorICAgICAgZGljdGlvbmFyeVtlbnVtX3ZhbHVlLm5hbWVdID0gZW51bV92YWx1ZS5udW1iZXIKKworCitkZWYgX0FkZENsYXNzQXR0cmlidXRlc0Zvck5lc3RlZEV4dGVuc2lvbnMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKKyAgIiIiQWRkcyBjbGFzcyBhdHRyaWJ1dGVzIGZvciB0aGUgbmVzdGVkIGV4dGVuc2lvbnMuIiIiCisgIGV4dGVuc2lvbl9kaWN0ID0gbWVzc2FnZV9kZXNjcmlwdG9yLmV4dGVuc2lvbnNfYnlfbmFtZQorICBmb3IgZXh0ZW5zaW9uX25hbWUsIGV4dGVuc2lvbl9maWVsZCBpbiBleHRlbnNpb25fZGljdC5pdGVyaXRlbXMoKToKKyAgICBhc3NlcnQgZXh0ZW5zaW9uX25hbWUgbm90IGluIGRpY3Rpb25hcnkKKyAgICBkaWN0aW9uYXJ5W2V4dGVuc2lvbl9uYW1lXSA9IGV4dGVuc2lvbl9maWVsZAorCisKK2RlZiBfQWRkSW5pdE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkFkZHMgYW4gX19pbml0X18gbWV0aG9kIHRvIGNscy4iIiIKKworICAjIENyZWF0ZSBhbmQgYXR0YWNoIG1lc3NhZ2UgZmllbGQgcHJvcGVydGllcyB0byB0aGUgbWVzc2FnZSBjbGFzcy4KKyAgIyBUaGlzIGNhbiBiZSBkb25lIGp1c3Qgb25jZSBwZXIgbWVzc2FnZSBjbGFzcywgc2luY2UgcHJvcGVydHkgc2V0dGVycyBhbmQKKyAgIyBnZXR0ZXJzIGFyZSBwYXNzZWQgdGhlIG1lc3NhZ2UgaW5zdGFuY2UuCisgICMgVGhpcyBtYWtlcyBtZXNzYWdlIGluc3RhbnRpYXRpb24gZXh0cmVtZWx5IGZhc3QsIGFuZCBhdCB0aGUgc2FtZSB0aW1lIGl0CisgICMgZG9lc24ndCByZXF1aXJlIHRoZSBjcmVhdGlvbiBvZiBwcm9wZXJ0eSBvYmplY3RzIGZvciBlYWNoIG1lc3NhZ2UgaW5zdGFuY2UsCisgICMgd2hpY2ggc2F2ZXMgYSBsb3Qgb2YgbWVtb3J5LgorICBmb3IgZmllbGQgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkczoKKyAgICBmaWVsZF9jZGVzY3JpcHRvciA9IGNscy5fX2Rlc2NyaXB0b3JzW2ZpZWxkLm5hbWVdCisgICAgaWYgZmllbGQubGFiZWwgPT0gX0xBQkVMX1JFUEVBVEVEOgorICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0NQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgdmFsdWUgPSBSZXBlYXRlZENvbXBvc2l0ZVByb3BlcnR5KGZpZWxkX2NkZXNjcmlwdG9yLCBmaWVsZC5tZXNzYWdlX3R5cGUpCisgICAgICBlbHNlOgorICAgICAgICB2YWx1ZSA9IFJlcGVhdGVkU2NhbGFyUHJvcGVydHkoZmllbGRfY2Rlc2NyaXB0b3IpCisgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgdmFsdWUgPSBDb21wb3NpdGVQcm9wZXJ0eShmaWVsZF9jZGVzY3JpcHRvciwgZmllbGQubWVzc2FnZV90eXBlKQorICAgIGVsc2U6CisgICAgICB2YWx1ZSA9IFNjYWxhclByb3BlcnR5KGZpZWxkX2NkZXNjcmlwdG9yKQorICAgIHNldGF0dHIoY2xzLCBmaWVsZC5uYW1lLCB2YWx1ZSkKKworICAgICMgQXR0YWNoIGEgY29uc3RhbnQgd2l0aCB0aGUgZmllbGQgbnVtYmVyLgorICAgIGNvbnN0YW50X25hbWUgPSBmaWVsZC5uYW1lLnVwcGVyKCkgKyAnX0ZJRUxEX05VTUJFUicKKyAgICBzZXRhdHRyKGNscywgY29uc3RhbnRfbmFtZSwgZmllbGQubnVtYmVyKQorCisgIGRlZiBJbml0KHNlbGYsICoqa3dhcmdzKToKKyAgICAiIiJNZXNzYWdlIGNvbnN0cnVjdG9yLiIiIgorICAgIGNtZXNzYWdlID0ga3dhcmdzLnBvcCgnX19jbWVzc2FnZScsIE5vbmUpCisgICAgaWYgY21lc3NhZ2U6CisgICAgICBzZWxmLl9jbXNnID0gY21lc3NhZ2UKKyAgICBlbHNlOgorICAgICAgc2VsZi5fY21zZyA9IE5ld0NNZXNzYWdlKG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpCisKKyAgICAjIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG93bmVyLCBhcyB0aGUgb3duZXIga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgIyB1bmRlcmx5aW5nIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlLgorICAgIG93bmVyID0ga3dhcmdzLnBvcCgnX19vd25lcicsIE5vbmUpCisgICAgaWYgb3duZXI6CisgICAgICBzZWxmLl9vd25lciA9IG93bmVyCisKKyAgICBpZiBtZXNzYWdlX2Rlc2NyaXB0b3IuaXNfZXh0ZW5kYWJsZToKKyAgICAgIHNlbGYuRXh0ZW5zaW9ucyA9IEV4dGVuc2lvbkRpY3Qoc2VsZikKKyAgICBlbHNlOgorICAgICAgIyBSZWZlcmVuY2UgY291bnRpbmcgaW4gdGhlIEMrKyBjb2RlIGlzIGJyb2tlbiBhbmQgZGVwZW5kcyBvbgorICAgICAgIyB0aGUgRXh0ZW5zaW9ucyByZWZlcmVuY2UgdG8ga2VlcCB0aGlzIG9iamVjdCBhbGl2ZSBkdXJpbmcgdW5pdAorICAgICAgIyB0ZXN0cyAoc2VlIGIvNDg1NjA1MikuICBSZW1vdmUgdGhpcyBvbmNlIGIvNDk0NTkwNCBpcyBmaXhlZC4KKyAgICAgIHNlbGYuX0hBQ0tfUkVGQ09VTlRTID0gc2VsZgorICAgIHNlbGYuX2NvbXBvc2l0ZV9maWVsZHMgPSB7fQorCisgICAgZm9yIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlIGluIGt3YXJncy5pdGVyaXRlbXMoKToKKyAgICAgIGZpZWxkX2NkZXNjcmlwdG9yID0gc2VsZi5fX2Rlc2NyaXB0b3JzLmdldChmaWVsZF9uYW1lLCBOb25lKQorICAgICAgaWYgbm90IGZpZWxkX2NkZXNjcmlwdG9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAiJXMiIGZpZWxkLicgJSBmaWVsZF9uYW1lKQorICAgICAgaWYgZmllbGRfY2Rlc2NyaXB0b3IubGFiZWwgPT0gX0xBQkVMX1JFUEVBVEVEOgorICAgICAgICBpZiBmaWVsZF9jZGVzY3JpcHRvci5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGZpZWxkX25hbWUgPSBnZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUpCisgICAgICAgICAgZm9yIHZhbCBpbiBmaWVsZF92YWx1ZToKKyAgICAgICAgICAgIGZpZWxkX25hbWUuYWRkKCkuTWVyZ2VGcm9tKHZhbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBnZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUpLmV4dGVuZChmaWVsZF92YWx1ZSkKKyAgICAgIGVsaWYgZmllbGRfY2Rlc2NyaXB0b3IuY3BwX3R5cGUgPT0gX0NQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgZ2V0YXR0cihzZWxmLCBmaWVsZF9uYW1lKS5NZXJnZUZyb20oZmllbGRfdmFsdWUpCisgICAgICBlbHNlOgorICAgICAgICBzZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKQorCisgIEluaXQuX19tb2R1bGVfXyA9IE5vbmUKKyAgSW5pdC5fX2RvY19fID0gTm9uZQorICBjbHMuX19pbml0X18gPSBJbml0CisKKworZGVmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGQpOgorICAiIiJDaGVja3MgaWYgYSBmaWVsZCBpcyBhIG1lc3NhZ2Ugc2V0IGV4dGVuc2lvbi4iIiIKKyAgcmV0dXJuIChmaWVsZC5pc19leHRlbnNpb24gYW5kCisgICAgICAgICAgZmllbGQuY29udGFpbmluZ190eXBlLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgYW5kCisgICAgICAgICAgZmllbGQudHlwZSA9PSBfVFlQRV9NRVNTQUdFIGFuZAorICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZSA9PSBmaWVsZC5leHRlbnNpb25fc2NvcGUgYW5kCisgICAgICAgICAgZmllbGQubGFiZWwgPT0gX0xBQkVMX09QVElPTkFMKQorCisKK2RlZiBfQWRkTWVzc2FnZU1ldGhvZHMobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIHRoZSBtZXRob2RzIHRvIGEgcHJvdG9jb2wgbWVzc2FnZSBjbGFzcy4iIiIKKyAgaWYgbWVzc2FnZV9kZXNjcmlwdG9yLmlzX2V4dGVuZGFibGU6CisKKyAgICBkZWYgQ2xlYXJFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uKToKKyAgICAgIHNlbGYuRXh0ZW5zaW9ucy5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisKKyAgICBkZWYgSGFzRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik6CisgICAgICByZXR1cm4gc2VsZi5FeHRlbnNpb25zLkhhc0V4dGVuc2lvbihleHRlbnNpb24pCisKKyAgZGVmIEhhc0ZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLkhhc0ZpZWxkKGZpZWxkX25hbWUpCisKKyAgZGVmIENsZWFyRmllbGQoc2VsZiwgZmllbGRfbmFtZSk6CisgICAgY2hpbGRfY21lc3NhZ2UgPSBOb25lCisgICAgaWYgZmllbGRfbmFtZSBpbiBzZWxmLl9jb21wb3NpdGVfZmllbGRzOgorICAgICAgY2hpbGRfZmllbGQgPSBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2ZpZWxkX25hbWVdCisgICAgICBkZWwgc2VsZi5fY29tcG9zaXRlX2ZpZWxkc1tmaWVsZF9uYW1lXQorCisgICAgICBjaGlsZF9jZGVzY3JpcHRvciA9IHNlbGYuX19kZXNjcmlwdG9yc1tmaWVsZF9uYW1lXQorICAgICAgIyBUT0RPKGFudXJhYWcpOiBTdXBwb3J0IGNsZWFyaW5nIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFzIHdlbGwuCisgICAgICBpZiAoY2hpbGRfY2Rlc2NyaXB0b3IubGFiZWwgIT0gX0xBQkVMX1JFUEVBVEVEIGFuZAorICAgICAgICAgIGNoaWxkX2NkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0UpOgorICAgICAgICBjaGlsZF9maWVsZC5fb3duZXIgPSBOb25lCisgICAgICAgIGNoaWxkX2NtZXNzYWdlID0gY2hpbGRfZmllbGQuX2Ntc2cKKworICAgIGlmIGNoaWxkX2NtZXNzYWdlIGlzIG5vdCBOb25lOgorICAgICAgc2VsZi5fY21zZy5DbGVhckZpZWxkKGZpZWxkX25hbWUsIGNoaWxkX2NtZXNzYWdlKQorICAgIGVsc2U6CisgICAgICBzZWxmLl9jbXNnLkNsZWFyRmllbGQoZmllbGRfbmFtZSkKKworICBkZWYgQ2xlYXIoc2VsZik6CisgICAgY21lc3NhZ2VzX3RvX3JlbGVhc2UgPSBbXQorICAgIGZvciBmaWVsZF9uYW1lLCBjaGlsZF9maWVsZCBpbiBzZWxmLl9jb21wb3NpdGVfZmllbGRzLml0ZXJpdGVtcygpOgorICAgICAgY2hpbGRfY2Rlc2NyaXB0b3IgPSBzZWxmLl9fZGVzY3JpcHRvcnNbZmllbGRfbmFtZV0KKyAgICAgICMgVE9ETyhhbnVyYWFnKTogU3VwcG9ydCBjbGVhcmluZyByZXBlYXRlZCBtZXNzYWdlIGZpZWxkcyBhcyB3ZWxsLgorICAgICAgaWYgKGNoaWxkX2NkZXNjcmlwdG9yLmxhYmVsICE9IF9MQUJFTF9SRVBFQVRFRCBhbmQKKyAgICAgICAgICBjaGlsZF9jZGVzY3JpcHRvci5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFKToKKyAgICAgICAgY2hpbGRfZmllbGQuX293bmVyID0gTm9uZQorICAgICAgICBjbWVzc2FnZXNfdG9fcmVsZWFzZS5hcHBlbmQoKGNoaWxkX2NkZXNjcmlwdG9yLCBjaGlsZF9maWVsZC5fY21zZykpCisgICAgc2VsZi5fY29tcG9zaXRlX2ZpZWxkcy5jbGVhcigpCisgICAgc2VsZi5fY21zZy5DbGVhcihjbWVzc2FnZXNfdG9fcmVsZWFzZSkKKworICBkZWYgSXNJbml0aWFsaXplZChzZWxmLCBlcnJvcnM9Tm9uZSk6CisgICAgaWYgc2VsZi5fY21zZy5Jc0luaXRpYWxpemVkKCk6CisgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSk7CisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIFNlcmlhbGl6ZVRvU3RyaW5nKHNlbGYpOgorICAgIGlmIG5vdCBzZWxmLklzSW5pdGlhbGl6ZWQoKToKKyAgICAgIHJhaXNlIG1lc3NhZ2UuRW5jb2RlRXJyb3IoCisgICAgICAgICAgJ01lc3NhZ2UgJXMgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICVzJyAlICgKKyAgICAgICAgICBzZWxmLl9jbXNnLmZ1bGxfbmFtZSwgJywnLmpvaW4oc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkpKQorICAgIHJldHVybiBzZWxmLl9jbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICBkZWYgU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgZGVmIFBhcnNlRnJvbVN0cmluZyhzZWxmLCBzZXJpYWxpemVkKToKKyAgICBzZWxmLkNsZWFyKCkKKyAgICBzZWxmLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6CisgICAgYnl0ZV9zaXplID0gc2VsZi5fY21zZy5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBpZiBieXRlX3NpemUgPCAwOgorICAgICAgcmFpc2UgbWVzc2FnZS5EZWNvZGVFcnJvcignVW5hYmxlIHRvIG1lcmdlIGZyb20gc3RyaW5nLicpCisgICAgcmV0dXJuIGJ5dGVfc2l6ZQorCisgIGRlZiBNZXJnZUZyb20oc2VsZiwgbXNnKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZShtc2csIGNscyk6CisgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgIlBhcmFtZXRlciB0byBNZXJnZUZyb20oKSBtdXN0IGJlIGluc3RhbmNlIG9mIHNhbWUgY2xhc3M6ICIKKyAgICAgICAgICAiZXhwZWN0ZWQgJXMgZ290ICVzLiIgJSAoY2xzLl9fbmFtZV9fLCB0eXBlKG1zZykuX19uYW1lX18pKQorICAgIHNlbGYuX2Ntc2cuTWVyZ2VGcm9tKG1zZy5fY21zZykKKworICBkZWYgQ29weUZyb20oc2VsZiwgbXNnKToKKyAgICBzZWxmLl9jbXNnLkNvcHlGcm9tKG1zZy5fY21zZykKKworICBkZWYgQnl0ZVNpemUoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2Ntc2cuQnl0ZVNpemUoKQorCisgIGRlZiBTZXRJblBhcmVudChzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fY21zZy5TZXRJblBhcmVudCgpCisKKyAgZGVmIExpc3RGaWVsZHMoc2VsZik6CisgICAgYWxsX2ZpZWxkcyA9IFtdCisgICAgZmllbGRfbGlzdCA9IHNlbGYuX2Ntc2cuTGlzdEZpZWxkcygpCisgICAgZmllbGRzX2J5X25hbWUgPSBjbHMuREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZQorICAgIGZvciBpc19leHRlbnNpb24sIGZpZWxkX25hbWUgaW4gZmllbGRfbGlzdDoKKyAgICAgIGlmIGlzX2V4dGVuc2lvbjoKKyAgICAgICAgZXh0ZW5zaW9uID0gY2xzLl9leHRlbnNpb25zX2J5X25hbWVbZmllbGRfbmFtZV0KKyAgICAgICAgYWxsX2ZpZWxkcy5hcHBlbmQoKGV4dGVuc2lvbiwgc2VsZi5FeHRlbnNpb25zW2V4dGVuc2lvbl0pKQorICAgICAgZWxzZToKKyAgICAgICAgZmllbGRfZGVzY3JpcHRvciA9IGZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCisgICAgICAgIGFsbF9maWVsZHMuYXBwZW5kKAorICAgICAgICAgICAgKGZpZWxkX2Rlc2NyaXB0b3IsIGdldGF0dHIoc2VsZiwgZmllbGRfbmFtZSkpKQorICAgIGFsbF9maWVsZHMuc29ydChrZXk9bGFtYmRhIGl0ZW06IGl0ZW1bMF0ubnVtYmVyKQorICAgIHJldHVybiBhbGxfZmllbGRzCisKKyAgZGVmIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fY21zZy5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKQorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLkRlYnVnU3RyaW5nKCkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICBpZiBzZWxmIGlzIG90aGVyOgorICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIHNlbGYuTGlzdEZpZWxkcygpID09IG90aGVyLkxpc3RGaWVsZHMoKQorCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKKworICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgIyBMYXp5IGltcG9ydCB0byBwcmV2ZW50IGNpcmN1bGFyIGltcG9ydCB3aGVuIHRleHRfZm9ybWF0IGltcG9ydHMgdGhpcyBmaWxlLgorICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAorICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZiwgYXNfdXRmOD1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKKworICAjIEF0dGFjaCB0aGUgbG9jYWwgbWV0aG9kcyB0byB0aGUgbWVzc2FnZSBjbGFzcy4KKyAgZm9yIGtleSwgdmFsdWUgaW4gbG9jYWxzKCkuY29weSgpLml0ZXJpdGVtcygpOgorICAgIGlmIGtleSBub3QgaW4gKCdrZXknLCAndmFsdWUnLCAnX19idWlsdGluc19fJywgJ19fbmFtZV9fJywgJ19fZG9jX18nKToKKyAgICAgIHNldGF0dHIoY2xzLCBrZXksIHZhbHVlKQorCisgICMgU3RhdGljIG1ldGhvZHM6CisKKyAgZGVmIFJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpOgorICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlID0gY2xzLkRFU0NSSVBUT1IKKyAgICBjbHMuX2V4dGVuc2lvbnNfYnlfbmFtZVtleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZV0gPSBleHRlbnNpb25faGFuZGxlCisKKyAgICBpZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpOgorICAgICAgIyBNZXNzYWdlU2V0IGV4dGVuc2lvbi4gIEFsc28gcmVnaXN0ZXIgdW5kZXIgdHlwZSBuYW1lLgorICAgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbCisgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUuZnVsbF9uYW1lXSA9IGV4dGVuc2lvbl9oYW5kbGUKKyAgY2xzLlJlZ2lzdGVyRXh0ZW5zaW9uID0gc3RhdGljbWV0aG9kKFJlZ2lzdGVyRXh0ZW5zaW9uKQorCisgIGRlZiBGcm9tU3RyaW5nKHN0cmluZyk6CisgICAgbXNnID0gY2xzKCkKKyAgICBtc2cuTWVyZ2VGcm9tU3RyaW5nKHN0cmluZykKKyAgICByZXR1cm4gbXNnCisgIGNscy5Gcm9tU3RyaW5nID0gc3RhdGljbWV0aG9kKEZyb21TdHJpbmcpCisKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiQWRkcyBwcm9wZXJ0aWVzIGZvciBhbGwgZmllbGRzIGluIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLiIiIgorICBleHRlbnNpb25fZGljdCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKKyAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6CisgICAgY29uc3RhbnRfbmFtZSA9IGV4dGVuc2lvbl9uYW1lLnVwcGVyKCkgKyAnX0ZJRUxEX05VTUJFUicKKyAgICBzZXRhdHRyKGNscywgY29uc3RhbnRfbmFtZSwgZXh0ZW5zaW9uX2ZpZWxkLm51bWJlcikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2RlY29kZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2I2ZjU3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5CkBAIC0wLDAgKzEsNzIwIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQ29kZSBmb3IgZGVjb2RpbmcgcHJvdG9jb2wgYnVmZmVyIHByaW1pdGl2ZXMuCisKK1RoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gZW5jb2Rlci5weSAtLSByZWFkIHRoZSBkb2NzIGZvciB0aGF0IG1vZHVsZSBmaXJzdC4KKworQSAiZGVjb2RlciIgaXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzaWduYXR1cmU6CisgIERlY29kZShidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KQorVGhlIGFyZ3VtZW50cyBhcmU6CisgIGJ1ZmZlcjogICAgIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZW5jb2RlZCBtZXNzYWdlLgorICBwb3M6ICAgICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLgorICBlbmQ6ICAgICAgICBUaGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZyB3aGVyZSB0aGUgY3VycmVudCBtZXNzYWdlIGVuZHMuICBNYXkgYmUKKyAgICAgICAgICAgICAgbGVzcyB0aGFuIGxlbihidWZmZXIpIGlmIHdlJ3JlIHJlYWRpbmcgYSBzdWItbWVzc2FnZS4KKyAgbWVzc2FnZTogICAgVGhlIG1lc3NhZ2Ugb2JqZWN0IGludG8gd2hpY2ggd2UncmUgcGFyc2luZy4KKyAgZmllbGRfZGljdDogbWVzc2FnZS5fZmllbGRzIChhdm9pZHMgYSBoYXNodGFibGUgbG9va3VwKS4KK1RoZSBkZWNvZGVyIHJlYWRzIHRoZSBmaWVsZCBhbmQgc3RvcmVzIGl0IGludG8gZmllbGRfZGljdCwgcmV0dXJuaW5nIHRoZSBuZXcKK2J1ZmZlciBwb3NpdGlvbi4gIEEgZGVjb2RlciBmb3IgYSByZXBlYXRlZCBmaWVsZCBtYXkgcHJvYWN0aXZlbHkgZGVjb2RlIGFsbCBvZgordGhlIGVsZW1lbnRzIG9mIHRoYXQgZmllbGQsIGlmIHRoZXkgYXBwZWFyIGNvbnNlY3V0aXZlbHkuCisKK05vdGUgdGhhdCBkZWNvZGVycyBtYXkgdGhyb3cgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgIEluZGV4RXJyb3I6ICBJbmRpY2F0ZXMgYSB0cnVuY2F0ZWQgbWVzc2FnZS4KKyAgc3RydWN0LmVycm9yOiAgVW5wYWNraW5nIG9mIGEgZml4ZWQtd2lkdGggZmllbGQgZmFpbGVkLgorICBtZXNzYWdlLkRlY29kZUVycm9yOiAgT3RoZXIgZXJyb3JzLgorCitEZWNvZGVycyBhcmUgZXhwZWN0ZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIGNhbGxlZCB3aXRoIHBvcyA+IGVuZC4KK1RoaXMgYWxsb3dzIGNhbGxlcnMgdG8gYmUgbGF4IGFib3V0IGJvdW5kcyBjaGVja2luZzogIGl0J3MgZmluZXRvIHJlYWQgcGFzdAorImVuZCIgYXMgbG9uZyBhcyB5b3UgYXJlIHN1cmUgdGhhdCBzb21lb25lIGVsc2Ugd2lsbCBub3RpY2UgYW5kIHRocm93IGFuCitleGNlcHRpb24gbGF0ZXIgb24uCisKK1NvbWV0aGluZyB1cCB0aGUgY2FsbCBzdGFjayBpcyBleHBlY3RlZCB0byBjYXRjaCBJbmRleEVycm9yIGFuZCBzdHJ1Y3QuZXJyb3IKK2FuZCBjb252ZXJ0IHRoZW0gdG8gbWVzc2FnZS5EZWNvZGVFcnJvci4KKworRGVjb2RlcnMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nIGRlY29kZXIgY29uc3RydWN0b3JzIHdpdGggdGhlIHNpZ25hdHVyZToKKyAgTWFrZURlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KQorVGhlIGFyZ3VtZW50cyBhcmU6CisgIGZpZWxkX251bWJlcjogIFRoZSBmaWVsZCBudW1iZXIgb2YgdGhlIGZpZWxkIHdlIHdhbnQgdG8gZGVjb2RlLgorICBpc19yZXBlYXRlZDogICBJcyB0aGUgZmllbGQgYSByZXBlYXRlZCBmaWVsZD8gKGJvb2wpCisgIGlzX3BhY2tlZDogICAgIElzIHRoZSBmaWVsZCBhIHBhY2tlZCBmaWVsZD8gKGJvb2wpCisgIGtleTogICAgICAgICAgIFRoZSBrZXkgdG8gdXNlIHdoZW4gbG9va2luZyB1cCB0aGUgZmllbGQgd2l0aGluIGZpZWxkX2RpY3QuCisgICAgICAgICAgICAgICAgIChUaGlzIGlzIGFjdHVhbGx5IHRoZSBGaWVsZERlc2NyaXB0b3IgYnV0IG5vdGhpbmcgaW4gdGhpcworICAgICAgICAgICAgICAgICBmaWxlIHNob3VsZCBkZXBlbmQgb24gdGhhdC4pCisgIG5ld19kZWZhdWx0OiAgIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBtZXNzYWdlIG9iamVjdCBhcyBhIHBhcmFtZXRlciBhbmQKKyAgICAgICAgICAgICAgICAgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgKFRoaXMgaXMgY2FsbGVkIGZvciByZXBlYXRlZCBmaWVsZHMgYW5kIHN1Yi1tZXNzYWdlcywgd2hlbiBhbgorICAgICAgICAgICAgICAgICBpbnN0YW5jZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LikKKworQXMgd2l0aCBlbmNvZGVycywgd2UgZGVmaW5lIGEgZGVjb2RlciBjb25zdHJ1Y3RvciBmb3IgZXZlcnkgdHlwZSBvZiBmaWVsZC4KK1RoZW4sIGZvciBldmVyeSBmaWVsZCBvZiBldmVyeSBtZXNzYWdlIGNsYXNzIHdlIGNvbnN0cnVjdCBhbiBhY3R1YWwgZGVjb2Rlci4KK1RoYXQgZGVjb2RlciBnb2VzIGludG8gYSBkaWN0IGluZGV4ZWQgYnkgdGFnLCBzbyB3aGVuIHdlIGRlY29kZSBhIG1lc3NhZ2UKK3dlIHJlcGVhdGVkbHkgcmVhZCBhIHRhZywgbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVyLCBhbmQgaW52b2tlIGl0LgorIiIiCisKK19fYXV0aG9yX18gPSAna2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSknCisKK2ltcG9ydCBzdHJ1Y3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCisKKworIyBUaGlzIHdpbGwgb3ZlcmZsb3cgYW5kIHRodXMgYmVjb21lIElFRUUtNzU0ICJpbmZpbml0eSIuICBXZSB3b3VsZCB1c2UKKyMgImZsb2F0KCdpbmYnKSIgYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzIHByZS1QeXRob24tMi42LgorX1BPU19JTkYgPSAxZTEwMDAwCitfTkVHX0lORiA9IC1fUE9TX0lORgorX05BTiA9IF9QT1NfSU5GICogMAorCisKKyMgVGhpcyBpcyBub3QgZm9yIG9wdGltaXphdGlvbiwgYnV0IHJhdGhlciB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBsb2NhbAorIyB2YXJpYWJsZXMgbmFtZWQgIm1lc3NhZ2UiLgorX0RlY29kZUVycm9yID0gbWVzc2FnZS5EZWNvZGVFcnJvcgorCisKK2RlZiBfVmFyaW50RGVjb2RlcihtYXNrKToKKyAgIiIiUmV0dXJuIGFuIGVuY29kZXIgZm9yIGEgYmFzaWMgdmFyaW50IHZhbHVlIChkb2VzIG5vdCBpbmNsdWRlIHRhZykuCisKKyAgRGVjb2RlZCB2YWx1ZXMgd2lsbCBiZSBiaXR3aXNlLWFuZGVkIHdpdGggdGhlIGdpdmVuIG1hc2sgYmVmb3JlIGJlaW5nCisgIHJldHVybmVkLCBlLmcuIHRvIGxpbWl0IHRoZW0gdG8gMzIgYml0cy4gIFRoZSByZXR1cm5lZCBkZWNvZGVyIGRvZXMgbm90CisgIHRha2UgdGhlIHVzdWFsICJlbmQiIHBhcmFtZXRlciAtLSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGRvIGJvdW5kcyBjaGVja2luZworICBhZnRlciB0aGUgZmFjdCAob2Z0ZW4gdGhlIGNhbGxlciBjYW4gZGVmZXIgc3VjaCBjaGVja2luZyB1bnRpbCBsYXRlcikuICBUaGUKKyAgZGVjb2RlciByZXR1cm5zIGEgKHZhbHVlLCBuZXdfcG9zKSBwYWlyLgorICAiIiIKKworICBsb2NhbF9vcmQgPSBvcmQKKyAgZGVmIERlY29kZVZhcmludChidWZmZXIsIHBvcyk6CisgICAgcmVzdWx0ID0gMAorICAgIHNoaWZ0ID0gMAorICAgIHdoaWxlIDE6CisgICAgICBiID0gbG9jYWxfb3JkKGJ1ZmZlcltwb3NdKQorICAgICAgcmVzdWx0IHw9ICgoYiAmIDB4N2YpIDw8IHNoaWZ0KQorICAgICAgcG9zICs9IDEKKyAgICAgIGlmIG5vdCAoYiAmIDB4ODApOgorICAgICAgICByZXN1bHQgJj0gbWFzaworICAgICAgICByZXR1cm4gKHJlc3VsdCwgcG9zKQorICAgICAgc2hpZnQgKz0gNworICAgICAgaWYgc2hpZnQgPj0gNjQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVG9vIG1hbnkgYnl0ZXMgd2hlbiBkZWNvZGluZyB2YXJpbnQuJykKKyAgcmV0dXJuIERlY29kZVZhcmludAorCisKK2RlZiBfU2lnbmVkVmFyaW50RGVjb2RlcihtYXNrKToKKyAgIiIiTGlrZSBfVmFyaW50RGVjb2RlcigpIGJ1dCBkZWNvZGVzIHNpZ25lZCB2YWx1ZXMuIiIiCisKKyAgbG9jYWxfb3JkID0gb3JkCisgIGRlZiBEZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpOgorICAgIHJlc3VsdCA9IDAKKyAgICBzaGlmdCA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgYiA9IGxvY2FsX29yZChidWZmZXJbcG9zXSkKKyAgICAgIHJlc3VsdCB8PSAoKGIgJiAweDdmKSA8PCBzaGlmdCkKKyAgICAgIHBvcyArPSAxCisgICAgICBpZiBub3QgKGIgJiAweDgwKToKKyAgICAgICAgaWYgcmVzdWx0ID4gMHg3ZmZmZmZmZmZmZmZmZmZmOgorICAgICAgICAgIHJlc3VsdCAtPSAoMSA8PCA2NCkKKyAgICAgICAgICByZXN1bHQgfD0gfm1hc2sKKyAgICAgICAgZWxzZToKKyAgICAgICAgICByZXN1bHQgJj0gbWFzaworICAgICAgICByZXR1cm4gKHJlc3VsdCwgcG9zKQorICAgICAgc2hpZnQgKz0gNworICAgICAgaWYgc2hpZnQgPj0gNjQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVG9vIG1hbnkgYnl0ZXMgd2hlbiBkZWNvZGluZyB2YXJpbnQuJykKKyAgcmV0dXJuIERlY29kZVZhcmludAorCisKK19EZWNvZGVWYXJpbnQgPSBfVmFyaW50RGVjb2RlcigoMSA8PCA2NCkgLSAxKQorX0RlY29kZVNpZ25lZFZhcmludCA9IF9TaWduZWRWYXJpbnREZWNvZGVyKCgxIDw8IDY0KSAtIDEpCisKKyMgVXNlIHRoZXNlIHZlcnNpb25zIGZvciB2YWx1ZXMgd2hpY2ggbXVzdCBiZSBsaW1pdGVkIHRvIDMyIGJpdHMuCitfRGVjb2RlVmFyaW50MzIgPSBfVmFyaW50RGVjb2RlcigoMSA8PCAzMikgLSAxKQorX0RlY29kZVNpZ25lZFZhcmludDMyID0gX1NpZ25lZFZhcmludERlY29kZXIoKDEgPDwgMzIpIC0gMSkKKworCitkZWYgUmVhZFRhZyhidWZmZXIsIHBvcyk6CisgICIiIlJlYWQgYSB0YWcgZnJvbSB0aGUgYnVmZmVyLCBhbmQgcmV0dXJuIGEgKHRhZ19ieXRlcywgbmV3X3BvcykgdHVwbGUuCisKKyAgV2UgcmV0dXJuIHRoZSByYXcgYnl0ZXMgb2YgdGhlIHRhZyByYXRoZXIgdGhhbiBkZWNvZGluZyB0aGVtLiAgVGhlIHJhdworICBieXRlcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIHByb3BlciBkZWNvZGVyLiAgVGhpcyBlZmZlY3RpdmVseSBhbGxvd3MKKyAgdXMgdG8gdHJhZGUgc29tZSB3b3JrIHRoYXQgd291bGQgYmUgZG9uZSBpbiBwdXJlLXB5dGhvbiAoZGVjb2RpbmcgYSB2YXJpbnQpCisgIGZvciB3b3JrIHRoYXQgaXMgZG9uZSBpbiBDIChzZWFyY2hpbmcgZm9yIGEgYnl0ZSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlKS4KKyAgSW4gYSBsb3ctbGV2ZWwgbGFuZ3VhZ2UgaXQgd291bGQgYmUgbXVjaCBjaGVhcGVyIHRvIGRlY29kZSB0aGUgdmFyaW50IGFuZAorICB1c2UgdGhhdCwgYnV0IG5vdCBpbiBQeXRob24uCisgICIiIgorCisgIHN0YXJ0ID0gcG9zCisgIHdoaWxlIG9yZChidWZmZXJbcG9zXSkgJiAweDgwOgorICAgIHBvcyArPSAxCisgIHBvcyArPSAxCisgIHJldHVybiAoYnVmZmVyW3N0YXJ0OnBvc10sIHBvcykKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZGVmIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgZGVjb2RlX3ZhbHVlKToKKyAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgZGVjb2RlciBmb3IgZmllbGRzIG9mIGEgcGFydGljdWxhciB0eXBlLgorCisgIEFyZ3M6CisgICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUuCisgICAgICBkZWNvZGVfdmFsdWU6ICBBIGZ1bmN0aW9uIHdoaWNoIGRlY29kZXMgYW4gaW5kaXZpZHVhbCB2YWx1ZSwgZS5nLgorICAgICAgICBfRGVjb2RlVmFyaW50KCkKKyAgIiIiCisKKyAgZGVmIFNwZWNpZmljRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpOgorICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKyAgICAgIGRlZiBEZWNvZGVQYWNrZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgICAgKGVuZHBvaW50LCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgICBlbmRwb2ludCArPSBwb3MKKyAgICAgICAgaWYgZW5kcG9pbnQgPiBlbmQ6CisgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgICB3aGlsZSBwb3MgPCBlbmRwb2ludDoKKyAgICAgICAgICAoZWxlbWVudCwgcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKKyAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKKyAgICAgICAgaWYgcG9zID4gZW5kcG9pbnQ6CisgICAgICAgICAgZGVsIHZhbHVlWy0xXSAgICMgRGlzY2FyZCBjb3JydXB0IHZhbHVlLgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignUGFja2VkIGVsZW1lbnQgd2FzIHRydW5jYXRlZC4nKQorICAgICAgICByZXR1cm4gcG9zCisgICAgICByZXR1cm4gRGVjb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKKyAgICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQorICAgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgKGVsZW1lbnQsIG5ld19wb3MpID0gZGVjb2RlX3ZhbHVlKGJ1ZmZlciwgcG9zKQorICAgICAgICAgIHZhbHVlLmFwcGVuZChlbGVtZW50KQorICAgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQKKyAgICAgICAgICAjIGZpZWxkLgorICAgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgICAgaWYgYnVmZmVyW25ld19wb3M6cG9zXSAhPSB0YWdfYnl0ZXMgb3IgbmV3X3BvcyA+PSBlbmQ6CisgICAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgorICAgICAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICAgIHJldHVybiBEZWNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgICAgKGZpZWxkX2RpY3Rba2V5XSwgcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKKyAgICAgICAgaWYgcG9zID4gZW5kOgorICAgICAgICAgIGRlbCBmaWVsZF9kaWN0W2tleV0gICMgRGlzY2FyZCBjb3JydXB0IHZhbHVlLgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgICAgICAgcmV0dXJuIHBvcworICAgICAgcmV0dXJuIERlY29kZUZpZWxkCisKKyAgcmV0dXJuIFNwZWNpZmljRGVjb2RlcgorCisKK2RlZiBfTW9kaWZpZWREZWNvZGVyKHdpcmVfdHlwZSwgZGVjb2RlX3ZhbHVlLCBtb2RpZnlfdmFsdWUpOgorICAiIiJMaWtlIFNpbXBsZURlY29kZXIgYnV0IGFkZGl0aW9uYWxseSBpbnZva2VzIG1vZGlmeV92YWx1ZSBvbiBldmVyeSB2YWx1ZQorICBiZWZvcmUgc3RvcmluZyBpdC4gIFVzdWFsbHkgbW9kaWZ5X3ZhbHVlIGlzIFppZ1phZ0RlY29kZS4KKyAgIiIiCisKKyAgIyBSZXVzaW5nIF9TaW1wbGVEZWNvZGVyIGlzIHNsaWdodGx5IHNsb3dlciB0aGFuIGNvcHlpbmcgYSBidW5jaCBvZiBjb2RlLCBidXQKKyAgIyBub3QgZW5vdWdoIHRvIG1ha2UgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLgorCisgIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6CisgICAgKHJlc3VsdCwgbmV3X3BvcykgPSBkZWNvZGVfdmFsdWUoYnVmZmVyLCBwb3MpCisgICAgcmV0dXJuIChtb2RpZnlfdmFsdWUocmVzdWx0KSwgbmV3X3BvcykKKyAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgSW5uZXJEZWNvZGUpCisKKworZGVmIF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX3R5cGUsIGZvcm1hdCk6CisgICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhIGRlY29kZXIgZm9yIGEgZml4ZWQtd2lkdGggZmllbGQuCisKKyAgQXJnczoKKyAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZS4KKyAgICAgIGZvcm1hdDogIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHBhc3MgdG8gc3RydWN0LnVucGFjaygpLgorICAiIiIKKworICB2YWx1ZV9zaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKyAgbG9jYWxfdW5wYWNrID0gc3RydWN0LnVucGFjaworCisgICMgUmV1c2luZyBfU2ltcGxlRGVjb2RlciBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBjb3B5aW5nIGEgYnVuY2ggb2YgY29kZSwgYnV0CisgICMgbm90IGVub3VnaCB0byBtYWtlIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4KKworICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKKyAgIyBpdCB0byBfRGVjb2RlRXJyb3IgLS0gdGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSB0byBzZXQgdXAgZXhjZXB0aW9uLQorICAjIGhhbmRsaW5nIGJsb2NrcyBldmVyeSB0aW1lIHdlIHBhcnNlIG9uZSB2YWx1ZS4KKworICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgorICAgIG5ld19wb3MgPSBwb3MgKyB2YWx1ZV9zaXplCisgICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKGZvcm1hdCwgYnVmZmVyW3BvczpuZXdfcG9zXSlbMF0KKyAgICByZXR1cm4gKHJlc3VsdCwgbmV3X3BvcykKKyAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgSW5uZXJEZWNvZGUpCisKKworZGVmIF9GbG9hdERlY29kZXIoKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgZmxvYXQgZmllbGQuCisKKyAgVGhpcyBjb2RlIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBzdHJ1Y3QudW5wYWNrIGZvciBub24tZmluaXRlIDMyLWJpdAorICBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgICIiIgorCisgIGxvY2FsX3VucGFjayA9IHN0cnVjdC51bnBhY2sKKworICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgorICAgICMgV2UgZXhwZWN0IGEgMzItYml0IHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4gIEJpdCAxIGlzIHRoZSBzaWduCisgICAgIyBiaXQsIGJpdHMgMi05IHJlcHJlc2VudCB0aGUgZXhwb25lbnQsIGFuZCBiaXRzIDEwLTMyIGFyZSB0aGUgc2lnbmlmaWNhbmQuCisgICAgbmV3X3BvcyA9IHBvcyArIDQKKyAgICBmbG9hdF9ieXRlcyA9IGJ1ZmZlcltwb3M6bmV3X3Bvc10KKworICAgICMgSWYgdGhpcyB2YWx1ZSBoYXMgYWxsIGl0cyBleHBvbmVudCBiaXRzIHNldCwgdGhlbiBpdCdzIG5vbi1maW5pdGUuCisgICAgIyBJbiBQeXRob24gMi40LCBzdHJ1Y3QudW5wYWNrIHdpbGwgY29udmVydCBpdCB0byBhIGZpbml0ZSA2NC1iaXQgdmFsdWUuCisgICAgIyBUbyBhdm9pZCB0aGF0LCB3ZSBwYXJzZSBpdCBzcGVjaWFsbHkuCisgICAgaWYgKChmbG9hdF9ieXRlc1szXSBpbiAnXHg3Rlx4RkYnKQorICAgICAgICBhbmQgKGZsb2F0X2J5dGVzWzJdID49ICdceDgwJykpOgorICAgICAgIyBJZiBhdCBsZWFzdCBvbmUgc2lnbmlmaWNhbmQgYml0IGlzIHNldC4uLgorICAgICAgaWYgZmxvYXRfYnl0ZXNbMDozXSAhPSAnXHgwMFx4MDBceDgwJzoKKyAgICAgICAgcmV0dXJuIChfTkFOLCBuZXdfcG9zKQorICAgICAgIyBJZiBzaWduIGJpdCBpcyBzZXQuLi4KKyAgICAgIGlmIGZsb2F0X2J5dGVzWzNdID09ICdceEZGJzoKKyAgICAgICAgcmV0dXJuIChfTkVHX0lORiwgbmV3X3BvcykKKyAgICAgIHJldHVybiAoX1BPU19JTkYsIG5ld19wb3MpCisKKyAgICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKKyAgICAjIGl0IHRvIF9EZWNvZGVFcnJvciAtLSB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHNldCB1cCBleGNlcHRpb24tCisgICAgIyBoYW5kbGluZyBibG9ja3MgZXZlcnkgdGltZSB3ZSBwYXJzZSBvbmUgdmFsdWUuCisgICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKCc8ZicsIGZsb2F0X2J5dGVzKVswXQorICAgIHJldHVybiAocmVzdWx0LCBuZXdfcG9zKQorICByZXR1cm4gX1NpbXBsZURlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgSW5uZXJEZWNvZGUpCisKKworZGVmIF9Eb3VibGVEZWNvZGVyKCk6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGRvdWJsZSBmaWVsZC4KKworICBUaGlzIGNvZGUgd29ya3MgYXJvdW5kIGEgYnVnIGluIHN0cnVjdC51bnBhY2sgZm9yIG5vdC1hLW51bWJlci4KKyAgIiIiCisKKyAgbG9jYWxfdW5wYWNrID0gc3RydWN0LnVucGFjaworCisgIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6CisgICAgIyBXZSBleHBlY3QgYSA2NC1iaXQgdmFsdWUgaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLiAgQml0IDEgaXMgdGhlIHNpZ24KKyAgICAjIGJpdCwgYml0cyAyLTEyIHJlcHJlc2VudCB0aGUgZXhwb25lbnQsIGFuZCBiaXRzIDEzLTY0IGFyZSB0aGUgc2lnbmlmaWNhbmQuCisgICAgbmV3X3BvcyA9IHBvcyArIDgKKyAgICBkb3VibGVfYnl0ZXMgPSBidWZmZXJbcG9zOm5ld19wb3NdCisKKyAgICAjIElmIHRoaXMgdmFsdWUgaGFzIGFsbCBpdHMgZXhwb25lbnQgYml0cyBzZXQgYW5kIGF0IGxlYXN0IG9uZSBzaWduaWZpY2FuZAorICAgICMgYml0IHNldCwgaXQncyBub3QgYSBudW1iZXIuICBJbiBQeXRob24gMi40LCBzdHJ1Y3QudW5wYWNrIHdpbGwgdHJlYXQgaXQKKyAgICAjIGFzIGluZiBvciAtaW5mLiAgVG8gYXZvaWQgdGhhdCwgd2UgdHJlYXQgaXQgc3BlY2lhbGx5LgorICAgIGlmICgoZG91YmxlX2J5dGVzWzddIGluICdceDdGXHhGRicpCisgICAgICAgIGFuZCAoZG91YmxlX2J5dGVzWzZdID49ICdceEYwJykKKyAgICAgICAgYW5kIChkb3VibGVfYnl0ZXNbMDo3XSAhPSAnXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMCcpKToKKyAgICAgIHJldHVybiAoX05BTiwgbmV3X3BvcykKKworICAgICMgTm90ZSB0aGF0IHdlIGV4cGVjdCBzb21lb25lIHVwLXN0YWNrIHRvIGNhdGNoIHN0cnVjdC5lcnJvciBhbmQgY29udmVydAorICAgICMgaXQgdG8gX0RlY29kZUVycm9yIC0tIHRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gc2V0IHVwIGV4Y2VwdGlvbi0KKyAgICAjIGhhbmRsaW5nIGJsb2NrcyBldmVyeSB0aW1lIHdlIHBhcnNlIG9uZSB2YWx1ZS4KKyAgICByZXN1bHQgPSBsb2NhbF91bnBhY2soJzxkJywgZG91YmxlX2J5dGVzKVswXQorICAgIHJldHVybiAocmVzdWx0LCBuZXdfcG9zKQorICByZXR1cm4gX1NpbXBsZURlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgSW5uZXJEZWNvZGUpCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0ludDMyRGVjb2RlciA9IEVudW1EZWNvZGVyID0gX1NpbXBsZURlY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlU2lnbmVkVmFyaW50MzIpCisKK0ludDY0RGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKAorICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVNpZ25lZFZhcmludCkKKworVUludDMyRGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludDMyKQorVUludDY0RGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludCkKKworU0ludDMyRGVjb2RlciA9IF9Nb2RpZmllZERlY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlVmFyaW50MzIsIHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZSkKK1NJbnQ2NERlY29kZXIgPSBfTW9kaWZpZWREZWNvZGVyKAorICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludCwgd2lyZV9mb3JtYXQuWmlnWmFnRGVjb2RlKQorCisjIE5vdGUgdGhhdCBQeXRob24gY29udmVuaWVudGx5IGd1YXJhbnRlZXMgdGhhdCB3aGVuIHVzaW5nIHRoZSAnPCcgcHJlZml4IG9uCisjIGZvcm1hdHMsIHRoZXkgd2lsbCBhbHNvIGhhdmUgdGhlIHNhbWUgc2l6ZSBhY3Jvc3MgYWxsIHBsYXRmb3JtcyAoYXMgb3Bwb3NlZAorIyB0byB3aXRob3V0IHRoZSBwcmVmaXgsIHdoZXJlIHRoZWlyIHNpemVzIGRlcGVuZCBvbiB0aGUgQyBjb21waWxlcidzIGJhc2ljCisjIHR5cGUgc2l6ZXMpLgorRml4ZWQzMkRlY29kZXIgID0gX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8SScpCitGaXhlZDY0RGVjb2RlciAgPSBfU3RydWN0UGFja0RlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxRJykKK1NGaXhlZDMyRGVjb2RlciA9IF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPGknKQorU0ZpeGVkNjREZWNvZGVyID0gX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8cScpCitGbG9hdERlY29kZXIgPSBfRmxvYXREZWNvZGVyKCkKK0RvdWJsZURlY29kZXIgPSBfRG91YmxlRGVjb2RlcigpCisKK0Jvb2xEZWNvZGVyID0gX01vZGlmaWVkRGVjb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQsIGJvb2wpCisKKworZGVmIFN0cmluZ0RlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgc3RyaW5nIGZpZWxkLiIiIgorCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKyAgbG9jYWxfdW5pY29kZSA9IHVuaWNvZGUKKworICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCisgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBzdHJpbmcuJykKKyAgICAgICAgdmFsdWUuYXBwZW5kKGxvY2FsX3VuaWNvZGUoYnVmZmVyW3BvczpuZXdfcG9zXSwgJ3V0Zi04JykpCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgZmllbGRfZGljdFtrZXldID0gbG9jYWxfdW5pY29kZShidWZmZXJbcG9zOm5ld19wb3NdLCAndXRmLTgnKQorICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlRmllbGQKKworCitkZWYgQnl0ZXNEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGJ5dGVzIGZpZWxkLiIiIgorCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKworICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCisgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBzdHJpbmcuJykKKyAgICAgICAgdmFsdWUuYXBwZW5kKGJ1ZmZlcltwb3M6bmV3X3Bvc10pCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgZmllbGRfZGljdFtrZXldID0gYnVmZmVyW3BvczpuZXdfcG9zXQorICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlRmllbGQKKworCitkZWYgR3JvdXBEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgorCisgIGVuZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQorICBlbmRfdGFnX2xlbiA9IGxlbihlbmRfdGFnX2J5dGVzKQorCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApCisgICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCisgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQorICAgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCisgICAgICAgIHBvcyA9IHZhbHVlLmFkZCgpLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBlbmQpCisgICAgICAgICMgUmVhZCBlbmQgdGFnLgorICAgICAgICBuZXdfcG9zID0gcG9zK2VuZF90YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltwb3M6bmV3X3Bvc10gIT0gZW5kX3RhZ19ieXRlcyBvciBuZXdfcG9zID4gZW5kOgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgICMgUmVhZCBzdWItbWVzc2FnZS4KKyAgICAgIHBvcyA9IHZhbHVlLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBlbmQpCisgICAgICAjIFJlYWQgZW5kIHRhZy4KKyAgICAgIG5ld19wb3MgPSBwb3MrZW5kX3RhZ19sZW4KKyAgICAgIGlmIGJ1ZmZlcltwb3M6bmV3X3Bvc10gIT0gZW5kX3RhZ19ieXRlcyBvciBuZXdfcG9zID4gZW5kOgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ01pc3NpbmcgZ3JvdXAgZW5kIHRhZy4nKQorICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlRmllbGQKKworCitkZWYgTWVzc2FnZURlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgbWVzc2FnZSBmaWVsZC4iIiIKKworICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50CisKKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQorICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgorICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQorICAgICAgd2hpbGUgMToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgICAgIyBSZWFkIGxlbmd0aC4KKyAgICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCisgICAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCisgICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCisgICAgICAgIGlmIHZhbHVlLmFkZCgpLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBuZXdfcG9zKSAhPSBuZXdfcG9zOgorICAgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdAorICAgICAgICAgICMgZW5jb3VudGVyZWQgYW4gZW5kLWdyb3VwIHRhZy4KKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nKQorICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkIGZpZWxkLgorICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgorICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKKyAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgorICAgICAgICAgIHJldHVybiBuZXdfcG9zCisgICAgcmV0dXJuIERlY29kZVJlcGVhdGVkRmllbGQKKyAgZWxzZToKKyAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICAjIFJlYWQgbGVuZ3RoLgorICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCisgICAgICBuZXdfcG9zID0gcG9zICsgc2l6ZQorICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgIyBSZWFkIHN1Yi1tZXNzYWdlLgorICAgICAgaWYgdmFsdWUuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBwb3MsIG5ld19wb3MpICE9IG5ld19wb3M6CisgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdCBlbmNvdW50ZXJlZAorICAgICAgICAjIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCisgICAgICByZXR1cm4gbmV3X3BvcworICAgIHJldHVybiBEZWNvZGVGaWVsZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTUVTU0FHRV9TRVRfSVRFTV9UQUcgPSBlbmNvZGVyLlRhZ0J5dGVzKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKQorCitkZWYgTWVzc2FnZVNldEl0ZW1EZWNvZGVyKGV4dGVuc2lvbnNfYnlfbnVtYmVyKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgTWVzc2FnZVNldCBpdGVtLgorCisgIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIF9leHRlbnNpb25zX2J5X251bWJlciBtYXAgZm9yIHRoZSBtZXNzYWdlIGNsYXNzLgorCisgIFRoZSBtZXNzYWdlIHNldCBtZXNzYWdlIGxvb2tzIGxpa2UgdGhpczoKKyAgICBtZXNzYWdlIE1lc3NhZ2VTZXQgeworICAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgeworICAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgICAgICAgcmVxdWlyZWQgc3RyaW5nIG1lc3NhZ2UgPSAzOworICAgICAgfQorICAgIH0KKyAgIiIiCisKKyAgdHlwZV9pZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKKyAgbWVzc2FnZV90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDMsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgIGl0ZW1fZW5kX3RhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQorCisgIGxvY2FsX1JlYWRUYWcgPSBSZWFkVGFnCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKyAgbG9jYWxfU2tpcEZpZWxkID0gU2tpcEZpZWxkCisKKyAgZGVmIERlY29kZUl0ZW0oYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgbWVzc2FnZV9zZXRfaXRlbV9zdGFydCA9IHBvcworICAgIHR5cGVfaWQgPSAtMQorICAgIG1lc3NhZ2Vfc3RhcnQgPSAtMQorICAgIG1lc3NhZ2VfZW5kID0gLTEKKworICAgICMgVGVjaG5pY2FsbHksIHR5cGVfaWQgYW5kIG1lc3NhZ2UgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIsIHNvIHdlIG5lZWQKKyAgICAjIGEgbGl0dGxlIGxvb3AgaGVyZS4KKyAgICB3aGlsZSAxOgorICAgICAgKHRhZ19ieXRlcywgcG9zKSA9IGxvY2FsX1JlYWRUYWcoYnVmZmVyLCBwb3MpCisgICAgICBpZiB0YWdfYnl0ZXMgPT0gdHlwZV9pZF90YWdfYnl0ZXM6CisgICAgICAgICh0eXBlX2lkLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gbWVzc2FnZV90YWdfYnl0ZXM6CisgICAgICAgIChzaXplLCBtZXNzYWdlX3N0YXJ0KSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgcG9zID0gbWVzc2FnZV9lbmQgPSBtZXNzYWdlX3N0YXJ0ICsgc2l6ZQorICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gaXRlbV9lbmRfdGFnX2J5dGVzOgorICAgICAgICBicmVhaworICAgICAgZWxzZToKKyAgICAgICAgcG9zID0gU2tpcEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIHRhZ19ieXRlcykKKyAgICAgICAgaWYgcG9zID09IC0xOgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCisKKyAgICBpZiBwb3MgPiBlbmQ6CisgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisKKyAgICBpZiB0eXBlX2lkID09IC0xOgorICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNZXNzYWdlU2V0IGl0ZW0gbWlzc2luZyB0eXBlX2lkLicpCisgICAgaWYgbWVzc2FnZV9zdGFydCA9PSAtMToKKyAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWVzc2FnZVNldCBpdGVtIG1pc3NpbmcgbWVzc2FnZS4nKQorCisgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc19ieV9udW1iZXIuZ2V0KHR5cGVfaWQpCisgICAgaWYgZXh0ZW5zaW9uIGlzIG5vdCBOb25lOgorICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChleHRlbnNpb24pCisgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdCgKKyAgICAgICAgICAgIGV4dGVuc2lvbiwgZXh0ZW5zaW9uLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKSkKKyAgICAgIGlmIHZhbHVlLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgbWVzc2FnZV9zdGFydCxtZXNzYWdlX2VuZCkgIT0gbWVzc2FnZV9lbmQ6CisgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdCBlbmNvdW50ZXJlZAorICAgICAgICAjIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCisgICAgZWxzZToKKyAgICAgIGlmIG5vdCBtZXNzYWdlLl91bmtub3duX2ZpZWxkczoKKyAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMgPSBbXQorICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuYXBwZW5kKChNRVNTQUdFX1NFVF9JVEVNX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21lc3NhZ2Vfc2V0X2l0ZW1fc3RhcnQ6cG9zXSkpCisKKyAgICByZXR1cm4gcG9zCisKKyAgcmV0dXJuIERlY29kZUl0ZW0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPcHRpbWl6YXRpb24gaXMgbm90IGFzIGhlYXZ5IGhlcmUgYmVjYXVzZSBjYWxscyB0byBTa2lwRmllbGQoKSBhcmUgcmFyZSwKKyMgZXhjZXB0IGZvciBoYW5kbGluZyBlbmQtZ3JvdXAgdGFncy4KKworZGVmIF9Ta2lwVmFyaW50KGJ1ZmZlciwgcG9zLCBlbmQpOgorICAiIiJTa2lwIGEgdmFyaW50IHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgorCisgIHdoaWxlIG9yZChidWZmZXJbcG9zXSkgJiAweDgwOgorICAgIHBvcyArPSAxCisgIHBvcyArPSAxCisgIGlmIHBvcyA+IGVuZDoKKyAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgIHJldHVybiBwb3MKKworZGVmIF9Ta2lwRml4ZWQ2NChidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcCBhIGZpeGVkNjQgdmFsdWUuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCisKKyAgcG9zICs9IDgKKyAgaWYgcG9zID4gZW5kOgorICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgcmV0dXJuIHBvcworCitkZWYgX1NraXBMZW5ndGhEZWxpbWl0ZWQoYnVmZmVyLCBwb3MsIGVuZCk6CisgICIiIlNraXAgYSBsZW5ndGgtZGVsaW1pdGVkIHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgorCisgIChzaXplLCBwb3MpID0gX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgcG9zICs9IHNpemUKKyAgaWYgcG9zID4gZW5kOgorICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgcmV0dXJuIHBvcworCitkZWYgX1NraXBHcm91cChidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcCBzdWItZ3JvdXAuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCisKKyAgd2hpbGUgMToKKyAgICAodGFnX2J5dGVzLCBwb3MpID0gUmVhZFRhZyhidWZmZXIsIHBvcykKKyAgICBuZXdfcG9zID0gU2tpcEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIHRhZ19ieXRlcykKKyAgICBpZiBuZXdfcG9zID09IC0xOgorICAgICAgcmV0dXJuIHBvcworICAgIHBvcyA9IG5ld19wb3MKKworZGVmIF9FbmRHcm91cChidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcHBpbmcgYW4gRU5EX0dST1VQIHRhZyByZXR1cm5zIC0xIHRvIHRlbGwgdGhlIHBhcmVudCBsb29wIHRvIGJyZWFrLiIiIgorCisgIHJldHVybiAtMQorCitkZWYgX1NraXBGaXhlZDMyKGJ1ZmZlciwgcG9zLCBlbmQpOgorICAiIiJTa2lwIGEgZml4ZWQzMiB2YWx1ZS4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKKworICBwb3MgKz0gNAorICBpZiBwb3MgPiBlbmQ6CisgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICByZXR1cm4gcG9zCisKK2RlZiBfUmFpc2VJbnZhbGlkV2lyZVR5cGUoYnVmZmVyLCBwb3MsIGVuZCk6CisgICIiIlNraXAgZnVuY3Rpb24gZm9yIHVua25vd24gd2lyZSB0eXBlcy4gIFJhaXNlcyBhbiBleGNlcHRpb24uIiIiCisKKyAgcmFpc2UgX0RlY29kZUVycm9yKCdUYWcgaGFkIGludmFsaWQgd2lyZSB0eXBlLicpCisKK2RlZiBfRmllbGRTa2lwcGVyKCk6CisgICIiIkNvbnN0cnVjdHMgdGhlIFNraXBGaWVsZCBmdW5jdGlvbi4iIiIKKworICBXSVJFVFlQRV9UT19TS0lQUEVSID0gWworICAgICAgX1NraXBWYXJpbnQsCisgICAgICBfU2tpcEZpeGVkNjQsCisgICAgICBfU2tpcExlbmd0aERlbGltaXRlZCwKKyAgICAgIF9Ta2lwR3JvdXAsCisgICAgICBfRW5kR3JvdXAsCisgICAgICBfU2tpcEZpeGVkMzIsCisgICAgICBfUmFpc2VJbnZhbGlkV2lyZVR5cGUsCisgICAgICBfUmFpc2VJbnZhbGlkV2lyZVR5cGUsCisgICAgICBdCisKKyAgd2lyZXR5cGVfbWFzayA9IHdpcmVfZm9ybWF0LlRBR19UWVBFX01BU0sKKyAgbG9jYWxfb3JkID0gb3JkCisKKyAgZGVmIFNraXBGaWVsZChidWZmZXIsIHBvcywgZW5kLCB0YWdfYnl0ZXMpOgorICAgICIiIlNraXBzIGEgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZy4KKworICAgIHxwb3N8IHNob3VsZCBwb2ludCB0byB0aGUgYnl0ZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgVGhlIG5ldyBwb3NpdGlvbiAoYWZ0ZXIgdGhlIHRhZyB2YWx1ZSksIG9yIC0xIGlmIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwCisgICAgICAgIHRhZyAoaW4gd2hpY2ggY2FzZSB0aGUgY2FsbGluZyBsb29wIHNob3VsZCBicmVhaykuCisgICAgIiIiCisKKyAgICAjIFRoZSB3aXJlIHR5cGUgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCBieXRlIHNpbmNlIHZhcmludHMgYXJlIGxpdHRsZS1lbmRpYW4uCisgICAgd2lyZV90eXBlID0gbG9jYWxfb3JkKHRhZ19ieXRlc1swXSkgJiB3aXJldHlwZV9tYXNrCisgICAgcmV0dXJuIFdJUkVUWVBFX1RPX1NLSVBQRVJbd2lyZV90eXBlXShidWZmZXIsIHBvcywgZW5kKQorCisgIHJldHVybiBTa2lwRmllbGQKKworU2tpcEZpZWxkID0gX0ZpZWxkU2tpcHBlcigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9kYXRhYmFzZV90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGNhNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdGVzdC5weQpAQCAtMCwwICsxLDYzIEBACisjISAvdXNyL2Jpbi9weXRob24KKyMKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyBmb3IgZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfZGF0YWJhc2UuIiIiCisKK19fYXV0aG9yX18gPSAnbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKScKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBmYWN0b3J5X3Rlc3QyX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfZGF0YWJhc2UKKworCitjbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdEFkZChzZWxmKToKKyAgICBkYiA9IGRlc2NyaXB0b3JfZGF0YWJhc2UuRGVzY3JpcHRvckRhdGFiYXNlKCkKKyAgICBmaWxlX2Rlc2NfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGZhY3RvcnlfdGVzdDJfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBkYi5BZGQoZmlsZV9kZXNjX3Byb3RvKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUJ5TmFtZSgKKyAgICAgICAgJ25ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8nKSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhmaWxlX2Rlc2NfcHJvdG8sIGRiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ25ldC5wcm90bzIucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZpbGVfZGVzY19wcm90bywgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnbmV0LnByb3RvMi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLk5lc3RlZEZhY3RvcnkyTWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZpbGVfZGVzY19wcm90bywgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnbmV0LnByb3RvMi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJFbnVtJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UuTmVzdGVkRmFjdG9yeTJFbnVtJykpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MTVkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QucHkKQEAgLTAsMCArMSwyMjAgQEAKKyMhIC91c3IvYmluL3B5dGhvbgorIworIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wb29sLiIiIgorCitfX2F1dGhvcl9fID0gJ21hdHRoZXd0b2lhQGdvb2dsZS5jb20gKE1hdHQgVG9pYSknCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZmFjdG9yeV90ZXN0MV9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBmYWN0b3J5X3Rlc3QyX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX2RhdGFiYXNlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wb29sCisKKworY2xhc3MgRGVzY3JpcHRvclBvb2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5wb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKKyAgICBzZWxmLmZhY3RvcnlfdGVzdDFfZmQgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGZhY3RvcnlfdGVzdDFfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBzZWxmLmZhY3RvcnlfdGVzdDJfZmQgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGZhY3RvcnlfdGVzdDJfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBzZWxmLnBvb2wuQWRkKHNlbGYuZmFjdG9yeV90ZXN0MV9mZCkKKyAgICBzZWxmLnBvb2wuQWRkKHNlbGYuZmFjdG9yeV90ZXN0Ml9mZCkKKworICBkZWYgdGVzdEZpbmRGaWxlQnlOYW1lKHNlbGYpOgorICAgIG5hbWUxID0gJ25ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8nCisgICAgZmlsZV9kZXNjMSA9IHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZShuYW1lMSkKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjMSwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lMSwgZmlsZV9kZXNjMS5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbCcsIGZpbGVfZGVzYzEucGFja2FnZSkKKyAgICBzZWxmLmFzc2VydEluKCdGYWN0b3J5MU1lc3NhZ2UnLCBmaWxlX2Rlc2MxLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKKworICAgIG5hbWUyID0gJ25ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8nCisgICAgZmlsZV9kZXNjMiA9IHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZShuYW1lMikKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjMiwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lMiwgZmlsZV9kZXNjMi5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbCcsIGZpbGVfZGVzYzIucGFja2FnZSkKKyAgICBzZWxmLmFzc2VydEluKCdGYWN0b3J5Mk1lc3NhZ2UnLCBmaWxlX2Rlc2MyLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKKworICBkZWYgdGVzdEZpbmRGaWxlQnlOYW1lRmFpbHVyZShzZWxmKToKKyAgICB0cnk6CisgICAgICBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoJ0RvZXMgbm90IGV4aXN0JykKKyAgICAgIHNlbGYuZmFpbCgnRXhwZWN0ZWQgS2V5RXJyb3InKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MKKworICBkZWYgdGVzdEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzZWxmKToKKyAgICBmaWxlX2Rlc2MxID0gc2VsZi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ25ldC5wcm90bzIucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbGVfZGVzYzEsIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ25ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8nLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVzYzEubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygnbmV0LnByb3RvMi5weXRob24uaW50ZXJuYWwnLCBmaWxlX2Rlc2MxLnBhY2thZ2UpCisgICAgc2VsZi5hc3NlcnRJbignRmFjdG9yeTFNZXNzYWdlJywgZmlsZV9kZXNjMS5tZXNzYWdlX3R5cGVzX2J5X25hbWUpCisKKyAgICBmaWxlX2Rlc2MyID0gc2VsZi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ25ldC5wcm90bzIucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbGVfZGVzYzIsIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ25ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8nLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVzYzIubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygnbmV0LnByb3RvMi5weXRob24uaW50ZXJuYWwnLCBmaWxlX2Rlc2MyLnBhY2thZ2UpCisgICAgc2VsZi5hc3NlcnRJbignRmFjdG9yeTJNZXNzYWdlJywgZmlsZV9kZXNjMi5tZXNzYWdlX3R5cGVzX2J5X25hbWUpCisKKyAgZGVmIHRlc3RGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2xGYWlsdXJlKHNlbGYpOgorICAgIHRyeToKKyAgICAgIHNlbGYucG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woJ0RvZXMgbm90IGV4aXN0JykKKyAgICAgIHNlbGYuZmFpbCgnRXhwZWN0ZWQgS2V5RXJyb3InKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MKKworICBkZWYgdGVzdEZpbmRNZXNzYWdlVHlwZUJ5TmFtZShzZWxmKToKKyAgICBtc2cxID0gc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgJ25ldC5wcm90bzIucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzEsIGRlc2NyaXB0b3IuRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFscygnRmFjdG9yeTFNZXNzYWdlJywgbXNnMS5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MU1lc3NhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgIG1zZzEuZnVsbF9uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vbmUsIG1zZzEuY29udGFpbmluZ190eXBlKQorCisgICAgbmVzdGVkX21zZzEgPSBtc2cxLm5lc3RlZF90eXBlc1swXQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdOZXN0ZWRGYWN0b3J5MU1lc3NhZ2UnLCBuZXN0ZWRfbXNnMS5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1zZzEsIG5lc3RlZF9tc2cxLmNvbnRhaW5pbmdfdHlwZSkKKworICAgIG5lc3RlZF9lbnVtMSA9IG1zZzEuZW51bV90eXBlc1swXQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdOZXN0ZWRGYWN0b3J5MUVudW0nLCBuZXN0ZWRfZW51bTEubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhtc2cxLCBuZXN0ZWRfZW51bTEuY29udGFpbmluZ190eXBlKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobmVzdGVkX21zZzEsIG1zZzEuZmllbGRzX2J5X25hbWVbCisgICAgICAgICduZXN0ZWRfZmFjdG9yeV8xX21lc3NhZ2UnXS5tZXNzYWdlX3R5cGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobmVzdGVkX2VudW0xLCBtc2cxLmZpZWxkc19ieV9uYW1lWworICAgICAgICAnbmVzdGVkX2ZhY3RvcnlfMV9lbnVtJ10uZW51bV90eXBlKQorCisgICAgbXNnMiA9IHNlbGYucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cyLCBkZXNjcmlwdG9yLkRlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ0ZhY3RvcnkyTWVzc2FnZScsIG1zZzIubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygnbmV0LnByb3RvMi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICBtc2cyLmZ1bGxfbmFtZSkKKyAgICBzZWxmLmFzc2VydElzTm9uZShtc2cyLmNvbnRhaW5pbmdfdHlwZSkKKworICAgIG5lc3RlZF9tc2cyID0gbXNnMi5uZXN0ZWRfdHlwZXNbMF0KKyAgICBzZWxmLmFzc2VydEVxdWFscygnTmVzdGVkRmFjdG9yeTJNZXNzYWdlJywgbmVzdGVkX21zZzIubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhtc2cyLCBuZXN0ZWRfbXNnMi5jb250YWluaW5nX3R5cGUpCisKKyAgICBuZXN0ZWRfZW51bTIgPSBtc2cyLmVudW1fdHlwZXNbMF0KKyAgICBzZWxmLmFzc2VydEVxdWFscygnTmVzdGVkRmFjdG9yeTJFbnVtJywgbmVzdGVkX2VudW0yLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobXNnMiwgbmVzdGVkX2VudW0yLmNvbnRhaW5pbmdfdHlwZSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG5lc3RlZF9tc2cyLCBtc2cyLmZpZWxkc19ieV9uYW1lWworICAgICAgICAnbmVzdGVkX2ZhY3RvcnlfMl9tZXNzYWdlJ10ubWVzc2FnZV90eXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG5lc3RlZF9lbnVtMiwgbXNnMi5maWVsZHNfYnlfbmFtZVsKKyAgICAgICAgJ25lc3RlZF9mYWN0b3J5XzJfZW51bSddLmVudW1fdHlwZSkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLmZpZWxkc19ieV9uYW1lWydpbnRfd2l0aF9kZWZhdWx0J10uaGFzX2RlZmF1bHQpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIDE3NzYsIG1zZzIuZmllbGRzX2J5X25hbWVbJ2ludF93aXRoX2RlZmF1bHQnXS5kZWZhdWx0X3ZhbHVlKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZmllbGRzX2J5X25hbWVbJ2RvdWJsZV93aXRoX2RlZmF1bHQnXS5oYXNfZGVmYXVsdCkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgOS45OSwgbXNnMi5maWVsZHNfYnlfbmFtZVsnZG91YmxlX3dpdGhfZGVmYXVsdCddLmRlZmF1bHRfdmFsdWUpCisKKyAgICBzZWxmLmFzc2VydFRydWUobXNnMi5maWVsZHNfYnlfbmFtZVsnc3RyaW5nX3dpdGhfZGVmYXVsdCddLmhhc19kZWZhdWx0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAnaGVsbG8gd29ybGQnLCBtc2cyLmZpZWxkc19ieV9uYW1lWydzdHJpbmdfd2l0aF9kZWZhdWx0J10uZGVmYXVsdF92YWx1ZSkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLmZpZWxkc19ieV9uYW1lWydib29sX3dpdGhfZGVmYXVsdCddLmhhc19kZWZhdWx0KQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnMi5maWVsZHNfYnlfbmFtZVsnYm9vbF93aXRoX2RlZmF1bHQnXS5kZWZhdWx0X3ZhbHVlKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZmllbGRzX2J5X25hbWVbJ2VudW1fd2l0aF9kZWZhdWx0J10uaGFzX2RlZmF1bHQpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIDEsIG1zZzIuZmllbGRzX2J5X25hbWVbJ2VudW1fd2l0aF9kZWZhdWx0J10uZGVmYXVsdF92YWx1ZSkKKworICAgIG1zZzMgPSBzZWxmLnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKAorICAgICAgICAnbmV0LnByb3RvMi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLk5lc3RlZEZhY3RvcnkyTWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobmVzdGVkX21zZzIsIG1zZzMpCisKKyAgZGVmIHRlc3RGaW5kTWVzc2FnZVR5cGVCeU5hbWVGYWlsdXJlKHNlbGYpOgorICAgIHRyeToKKyAgICAgIHNlbGYucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoJ0RvZXMgbm90IGV4aXN0JykKKyAgICAgIHNlbGYuZmFpbCgnRXhwZWN0ZWQgS2V5RXJyb3InKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MKKworICBkZWYgdGVzdEZpbmRFbnVtVHlwZUJ5TmFtZShzZWxmKToKKyAgICBlbnVtMSA9IHNlbGYucG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoCisgICAgICAgICduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MUVudW0nKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnVtMSwgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBlbnVtMS52YWx1ZXNfYnlfbmFtZVsnRkFDVE9SWV8xX1ZBTFVFXzAnXS5udW1iZXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgZW51bTEudmFsdWVzX2J5X25hbWVbJ0ZBQ1RPUllfMV9WQUxVRV8xJ10ubnVtYmVyKQorCisgICAgbmVzdGVkX2VudW0xID0gc2VsZi5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgJ25ldC5wcm90bzIucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZS5OZXN0ZWRGYWN0b3J5MUVudW0nKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShuZXN0ZWRfZW51bTEsIGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIDAsIG5lc3RlZF9lbnVtMS52YWx1ZXNfYnlfbmFtZVsnTkVTVEVEX0ZBQ1RPUllfMV9WQUxVRV8wJ10ubnVtYmVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAxLCBuZXN0ZWRfZW51bTEudmFsdWVzX2J5X25hbWVbJ05FU1RFRF9GQUNUT1JZXzFfVkFMVUVfMSddLm51bWJlcikKKworICAgIGVudW0yID0gc2VsZi5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgJ25ldC5wcm90bzIucHl0aG9uLmludGVybmFsLkZhY3RvcnkyRW51bScpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudW0yLCBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGVudW0yLnZhbHVlc19ieV9uYW1lWydGQUNUT1JZXzJfVkFMVUVfMCddLm51bWJlcikKKyAgICBzZWxmLmFzc2VydEVxdWFscygxLCBlbnVtMi52YWx1ZXNfYnlfbmFtZVsnRkFDVE9SWV8yX1ZBTFVFXzEnXS5udW1iZXIpCisKKyAgICBuZXN0ZWRfZW51bTIgPSBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAorICAgICAgICAnbmV0LnByb3RvMi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLk5lc3RlZEZhY3RvcnkyRW51bScpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG5lc3RlZF9lbnVtMiwgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgMCwgbmVzdGVkX2VudW0yLnZhbHVlc19ieV9uYW1lWydORVNURURfRkFDVE9SWV8yX1ZBTFVFXzAnXS5udW1iZXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIDEsIG5lc3RlZF9lbnVtMi52YWx1ZXNfYnlfbmFtZVsnTkVTVEVEX0ZBQ1RPUllfMl9WQUxVRV8xJ10ubnVtYmVyKQorCisgIGRlZiB0ZXN0RmluZEVudW1UeXBlQnlOYW1lRmFpbHVyZShzZWxmKToKKyAgICB0cnk6CisgICAgICBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCdEb2VzIG5vdCBleGlzdCcpCisgICAgICBzZWxmLmZhaWwoJ0V4cGVjdGVkIEtleUVycm9yJykKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICBwYXNzCisKKyAgZGVmIHRlc3RVc2VyRGVmaW5lZERCKHNlbGYpOgorICAgIGRiID0gZGVzY3JpcHRvcl9kYXRhYmFzZS5EZXNjcmlwdG9yRGF0YWJhc2UoKQorICAgIHNlbGYucG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbChkYikKKyAgICBkYi5BZGQoc2VsZi5mYWN0b3J5X3Rlc3QxX2ZkKQorICAgIGRiLkFkZChzZWxmLmZhY3RvcnlfdGVzdDJfZmQpCisgICAgc2VsZi50ZXN0RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzRmODgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfdGVzdC5weQpAQCAtMCwwICsxLDYxMyBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdHRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5kZXNjcmlwdG9yLiIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdGV4dF9mb3JtYXQKKworCitURVNUX0VNUFRZX01FU1NBR0VfREVTQ1JJUFRPUl9BU0NJSSA9ICIiIgorbmFtZTogJ1Rlc3RFbXB0eU1lc3NhZ2UnCisiIiIKKworCitjbGFzcyBEZXNjcmlwdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYubXlfZmlsZSA9IGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9J3NvbWUvZmlsZW5hbWUvc29tZS5wcm90bycsCisgICAgICAgIHBhY2thZ2U9J3Byb3RvYnVmX3VuaXR0ZXN0JworICAgICAgICApCisgICAgc2VsZi5teV9lbnVtID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKKyAgICAgICAgbmFtZT0nRm9yZWlnbkVudW0nLAorICAgICAgICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtJywKKyAgICAgICAgZmlsZW5hbWU9Tm9uZSwKKyAgICAgICAgZmlsZT1zZWxmLm15X2ZpbGUsCisgICAgICAgIHZhbHVlcz1bCisgICAgICAgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKG5hbWU9J0ZPUkVJR05fRk9PJywgaW5kZXg9MCwgbnVtYmVyPTQpLAorICAgICAgICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcihuYW1lPSdGT1JFSUdOX0JBUicsIGluZGV4PTEsIG51bWJlcj01KSwKKyAgICAgICAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IobmFtZT0nRk9SRUlHTl9CQVonLCBpbmRleD0yLCBudW1iZXI9NiksCisgICAgICAgIF0pCisgICAgc2VsZi5teV9tZXNzYWdlID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICAgICAgICBuYW1lPSdOZXN0ZWRNZXNzYWdlJywKKyAgICAgICAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZScsCisgICAgICAgIGZpbGVuYW1lPU5vbmUsCisgICAgICAgIGZpbGU9c2VsZi5teV9maWxlLAorICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgICAgZmllbGRzPVsKKyAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgICAgICAgIG5hbWU9J2JiJywKKyAgICAgICAgICAgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuYmInLAorICAgICAgICAgICAgaW5kZXg9MCwgbnVtYmVyPTEsCisgICAgICAgICAgICB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICAgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgICAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUpLAorICAgICAgICBdLAorICAgICAgICBuZXN0ZWRfdHlwZXM9W10sCisgICAgICAgIGVudW1fdHlwZXM9WworICAgICAgICAgIHNlbGYubXlfZW51bSwKKyAgICAgICAgXSwKKyAgICAgICAgZXh0ZW5zaW9ucz1bXSkKKyAgICBzZWxmLm15X21ldGhvZCA9IGRlc2NyaXB0b3IuTWV0aG9kRGVzY3JpcHRvcigKKyAgICAgICAgbmFtZT0nQmFyJywKKyAgICAgICAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0U2VydmljZS5CYXInLAorICAgICAgICBpbmRleD0wLAorICAgICAgICBjb250YWluaW5nX3NlcnZpY2U9Tm9uZSwKKyAgICAgICAgaW5wdXRfdHlwZT1Ob25lLAorICAgICAgICBvdXRwdXRfdHlwZT1Ob25lKQorICAgIHNlbGYubXlfc2VydmljZSA9IGRlc2NyaXB0b3IuU2VydmljZURlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9J1Rlc3RTZXJ2aWNlV2l0aE9wdGlvbnMnLAorICAgICAgICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlV2l0aE9wdGlvbnMnLAorICAgICAgICBmaWxlPXNlbGYubXlfZmlsZSwKKyAgICAgICAgaW5kZXg9MCwKKyAgICAgICAgbWV0aG9kcz1bCisgICAgICAgICAgICBzZWxmLm15X21ldGhvZAorICAgICAgICBdKQorCisgIGRlZiB0ZXN0RW51bVZhbHVlTmFtZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZS5FbnVtVmFsdWVOYW1lKCdGb3JlaWduRW51bScsIDQpLAorICAgICAgICAgICAgICAgICAgICAgJ0ZPUkVJR05fRk9PJykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHNlbGYubXlfbWVzc2FnZS5lbnVtX3R5cGVzX2J5X25hbWVbCisgICAgICAgICAgICAnRm9yZWlnbkVudW0nXS52YWx1ZXNfYnlfbnVtYmVyWzRdLm5hbWUsCisgICAgICAgIHNlbGYubXlfbWVzc2FnZS5FbnVtVmFsdWVOYW1lKCdGb3JlaWduRW51bScsIDQpKQorCisgIGRlZiB0ZXN0RW51bUZpeHVwcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZW51bSwgc2VsZi5teV9lbnVtLnZhbHVlc1swXS50eXBlKQorCisgIGRlZiB0ZXN0Q29udGFpbmluZ1R5cGVGaXh1cHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UsIHNlbGYubXlfbWVzc2FnZS5maWVsZHNbMF0uY29udGFpbmluZ190eXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLCBzZWxmLm15X2VudW0uY29udGFpbmluZ190eXBlKQorCisgIGRlZiB0ZXN0Q29udGFpbmluZ1NlcnZpY2VGaXh1cHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X3NlcnZpY2UsIHNlbGYubXlfbWV0aG9kLmNvbnRhaW5pbmdfc2VydmljZSkKKworICBkZWYgdGVzdEdldE9wdGlvbnMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2VudW0uR2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wYjIuRW51bU9wdGlvbnMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZW51bS52YWx1ZXNbMF0uR2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wYjIuRW51bVZhbHVlT3B0aW9ucygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLkdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLk1lc3NhZ2VPcHRpb25zKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UuZmllbGRzWzBdLkdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLkZpZWxkT3B0aW9ucygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXRob2QuR2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wYjIuTWV0aG9kT3B0aW9ucygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9zZXJ2aWNlLkdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLlNlcnZpY2VPcHRpb25zKCkpCisKKyAgZGVmIHRlc3RTaW1wbGVDdXN0b21PcHRpb25zKHNlbGYpOgorICAgIGZpbGVfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ERVNDUklQVE9SCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLkRFU0NSSVBUT1IKKyAgICBmaWVsZF9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWyJmaWVsZDEiXQorICAgIGVudW1fZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVzX2J5X25hbWVbIkFuRW51bSJdCisgICAgZW51bV92YWx1ZV9kZXNjcmlwdG9yID1cCisgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3ZhbHVlc19ieV9uYW1lWyJBTkVOVU1fVkFMMiJdCisgICAgc2VydmljZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5UZXN0U2VydmljZVdpdGhDdXN0b21PcHRpb25zLkRFU0NSSVBUT1IKKyAgICBtZXRob2RfZGVzY3JpcHRvciA9IHNlcnZpY2VfZGVzY3JpcHRvci5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKQorCisgICAgZmlsZV9vcHRpb25zID0gZmlsZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIGZpbGVfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWxlX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk4NzY1NDMyMTAsIGZpbGVfb3B0aW9ucy5FeHRlbnNpb25zW2ZpbGVfb3B0MV0pCisgICAgbWVzc2FnZV9vcHRpb25zID0gbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIG1lc3NhZ2Vfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tZXNzYWdlX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKC01NiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbbWVzc2FnZV9vcHQxXSkKKyAgICBmaWVsZF9vcHRpb25zID0gZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKKyAgICBmaWVsZF9vcHQxID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpZWxkX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDg3NjU0MzIxMDksIGZpZWxkX29wdGlvbnMuRXh0ZW5zaW9uc1tmaWVsZF9vcHQxXSkKKyAgICBmaWVsZF9vcHQyID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpZWxkX29wdDIKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBmaWVsZF9vcHRpb25zLkV4dGVuc2lvbnNbZmllbGRfb3B0Ml0pCisgICAgZW51bV9vcHRpb25zID0gZW51bV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIGVudW1fb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5lbnVtX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKC03ODksIGVudW1fb3B0aW9ucy5FeHRlbnNpb25zW2VudW1fb3B0MV0pCisgICAgZW51bV92YWx1ZV9vcHRpb25zID0gZW51bV92YWx1ZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIGVudW1fdmFsdWVfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5lbnVtX3ZhbHVlX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgZW51bV92YWx1ZV9vcHRpb25zLkV4dGVuc2lvbnNbZW51bV92YWx1ZV9vcHQxXSkKKworICAgIHNlcnZpY2Vfb3B0aW9ucyA9IHNlcnZpY2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKKyAgICBzZXJ2aWNlX29wdDEgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2VydmljZV9vcHQxCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtOTg3NjU0MzIxMCwgc2VydmljZV9vcHRpb25zLkV4dGVuc2lvbnNbc2VydmljZV9vcHQxXSkKKyAgICBtZXRob2Rfb3B0aW9ucyA9IG1ldGhvZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIG1ldGhvZF9vcHQxID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLm1ldGhvZF9vcHQxCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuTUVUSE9ET1BUMV9WQUwyLAorICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29wdGlvbnMuRXh0ZW5zaW9uc1ttZXRob2Rfb3B0MV0pCisKKyAgZGVmIHRlc3REaWZmZXJlbnRDdXN0b21PcHRpb25UeXBlcyhzZWxmKToKKyAgICBraW50MzJtaW4gPSAtMioqMzEKKyAgICBraW50NjRtaW4gPSAtMioqNjMKKyAgICBraW50MzJtYXggPSAyKiozMSAtIDEKKyAgICBraW50NjRtYXggPSAyKio2MyAtIDEKKyAgICBrdWludDMybWF4ID0gMioqMzIgLSAxCisgICAga3VpbnQ2NG1heCA9IDIqKjY0IC0gMQorCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5DdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzLkRFU0NSSVBUT1IKKyAgICBtZXNzYWdlX29wdGlvbnMgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ib29sX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGtpbnQ2NG1pbiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5pbnQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi51aW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIudWludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpeGVkMzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZml4ZWQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWluLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNmaXhlZDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ZpeGVkNjRfb3B0XSkKKworICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcy5ERVNDUklQVE9SCisgICAgbWVzc2FnZV9vcHRpb25zID0gbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ib29sX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGtpbnQ2NG1heCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5pbnQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa3VpbnQzMm1heCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi51aW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGt1aW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIudWludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChrdWludDMybWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpeGVkMzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGt1aW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZml4ZWQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNmaXhlZDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ZpeGVkNjRfb3B0XSkKKworICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMuREVTQ1JJUFRPUgorICAgIG1lc3NhZ2Vfb3B0aW9ucyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0xMDAsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEyLjM0NTY3ODksIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmxvYXRfb3B0XSwgNikKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEuMjM0NTY3ODkwMTIzNDU2Nzg5LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmRvdWJsZV9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkhlbGxvLCBcIldvcmxkXCIiLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnN0cmluZ19vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkhlbGxvXDBXb3JsZCIsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuYnl0ZXNfb3B0XSkKKyAgICBkdW1teV9lbnVtID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkR1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZHVtbXlfZW51bS5URVNUX09QVElPTl9FTlVNX1RZUEUyLAorICAgICAgICBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1t1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZW51bV9vcHRdKQorCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5TZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLkRFU0NSSVBUT1IKKyAgICBtZXNzYWdlX29wdGlvbnMgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgxMiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5mbG9hdF9vcHRdLCA2KQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMTU0LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmRvdWJsZV9vcHRdKQorCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5TZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzLkRFU0NSSVBUT1IKKyAgICBtZXNzYWdlX29wdGlvbnMgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgtMTIsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmxvYXRfb3B0XSwgNikKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKC0xNTQsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZG91YmxlX29wdF0pCisKKyAgZGVmIHRlc3RDb21wbGV4RXh0ZW5zaW9uT3B0aW9ucyhzZWxmKToKKyAgICBkZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5WYXJpb3VzQ29tcGxleE9wdGlvbnMuREVTQ1JJUFRPUgorICAgIG9wdGlvbnMgPSBkZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0MV0uZm9vKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzI0LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDFdLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIucXV1eF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg4NzYsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0MV0uRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb3JnZV0ucXV4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTg3LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLmJheikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDY1NCwgb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmdyYXVsdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3NDMsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uYmFyLmZvbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDE5OTksIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uYmFyLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIucXV1eF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMDA4LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLmJhci5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvcmdlXS5xdXgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3NDEsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5nYXJwbHldLmZvbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDE5OTgsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5nYXJwbHldLkV4dGVuc2lvbnNbCisgICAgICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnF1dXhdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjEyMSwgb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmdhcnBseV0uRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29yZ2VdLnF1eCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDE5NzEsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkNvbXBsZXhPcHRpb25UeXBlMgorICAgICAgICAuQ29tcGxleE9wdGlvblR5cGU0LmNvbXBsZXhfb3B0NF0ud2FsZG8pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzMjEsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uZnJlZC53YWxkbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDksIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0M10ucXV4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjIsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0M10uY29tcGxleG9wdGlvbnR5cGU1LnBsdWdoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjQsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhvcHQ2XS54eXp6eSkKKworICAjIENoZWNrIHRoYXQgYWdncmVnYXRlIG9wdGlvbnMgd2VyZSBwYXJzZWQgYW5kIHNhdmVkIGNvcnJlY3RseSBpbgorICAjIHRoZSBhcHByb3ByaWF0ZSBkZXNjcmlwdG9ycy4KKyAgZGVmIHRlc3RBZ2dyZWdhdGVPcHRpb25zKHNlbGYpOgorICAgIGZpbGVfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ERVNDUklQVE9SCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5BZ2dyZWdhdGVNZXNzYWdlLkRFU0NSSVBUT1IKKyAgICBmaWVsZF9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWyJmaWVsZG5hbWUiXQorICAgIGVudW1fZGVzY3JpcHRvciA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5BZ2dyZWdhdGVFbnVtLkRFU0NSSVBUT1IKKyAgICBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgPSBlbnVtX2Rlc2NyaXB0b3IudmFsdWVzX2J5X25hbWVbIlZBTFVFIl0KKyAgICBzZXJ2aWNlX2Rlc2NyaXB0b3IgPVwKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkFnZ3JlZ2F0ZVNlcnZpY2UuREVTQ1JJUFRPUgorICAgIG1ldGhvZF9kZXNjcmlwdG9yID0gc2VydmljZV9kZXNjcmlwdG9yLkZpbmRNZXRob2RCeU5hbWUoIk1ldGhvZCIpCisKKyAgICAjIFRlc3RzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgZW1iZWRkZWQgaW4gZmlsZW9wdAorICAgIGZpbGVfb3B0aW9ucyA9IGZpbGVfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpbGVvcHRdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAsIGZpbGVfb3B0aW9ucy5pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkZpbGVBbm5vdGF0aW9uIiwgZmlsZV9vcHRpb25zLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgiTmVzdGVkRmlsZUFubm90YXRpb24iLCBmaWxlX29wdGlvbnMuc3ViLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgiRmlsZUV4dGVuc2lvbkFubm90YXRpb24iLCBmaWxlX29wdGlvbnMuZmlsZS5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmlsZW9wdF0ucykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCJFbWJlZGRlZE1lc3NhZ2VTZXRFbGVtZW50IiwgZmlsZV9vcHRpb25zLm1zZXQuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50CisgICAgICAgIC5tZXNzYWdlX3NldF9leHRlbnNpb25dLnMpCisKKyAgICAjIFNpbXBsZSB0ZXN0cyBmb3IgYWxsIHRoZSBvdGhlciB0eXBlcyBvZiBhbm5vdGF0aW9ucworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICJNZXNzYWdlQW5ub3RhdGlvbiIsCisgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tc2dvcHRdLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgIkZpZWxkQW5ub3RhdGlvbiIsCisgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmllbGRvcHRdLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgIkVudW1Bbm5vdGF0aW9uIiwKKyAgICAgICAgZW51bV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmVudW1vcHRdLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgIkVudW1WYWx1ZUFubm90YXRpb24iLAorICAgICAgICBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZW51bXZhbG9wdF0ucykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAiU2VydmljZUFubm90YXRpb24iLAorICAgICAgICBzZXJ2aWNlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2VydmljZW9wdF0ucykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAiTWV0aG9kQW5ub3RhdGlvbiIsCisgICAgICAgIG1ldGhvZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLm1ldGhvZG9wdF0ucykKKworICBkZWYgdGVzdE5lc3RlZE9wdGlvbnMoc2VsZik6CisgICAgbmVzdGVkX21lc3NhZ2UgPVwKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLk5lc3RlZE9wdGlvblR5cGUuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAxLCBuZXN0ZWRfbWVzc2FnZS5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLm1lc3NhZ2Vfb3B0MV0pCisgICAgbmVzdGVkX2ZpZWxkID0gbmVzdGVkX21lc3NhZ2UuZmllbGRzX2J5X25hbWVbIm5lc3RlZF9maWVsZCJdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAyLCBuZXN0ZWRfZmllbGQuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWVsZF9vcHQxXSkKKyAgICBvdXRlcl9tZXNzYWdlID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5OZXN0ZWRPcHRpb25UeXBlLkRFU0NSSVBUT1IKKyAgICBuZXN0ZWRfZW51bSA9IG91dGVyX21lc3NhZ2UuZW51bV90eXBlc19ieV9uYW1lWyJOZXN0ZWRFbnVtIl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDMsIG5lc3RlZF9lbnVtLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZW51bV9vcHQxXSkKKyAgICBuZXN0ZWRfZW51bV92YWx1ZSA9IG91dGVyX21lc3NhZ2UuZW51bV92YWx1ZXNfYnlfbmFtZVsiTkVTVEVEX0VOVU1fVkFMVUUiXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwNCwgbmVzdGVkX2VudW1fdmFsdWUuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5lbnVtX3ZhbHVlX29wdDFdKQorICAgIG5lc3RlZF9leHRlbnNpb24gPSBvdXRlcl9tZXNzYWdlLmV4dGVuc2lvbnNfYnlfbmFtZVsibmVzdGVkX2V4dGVuc2lvbiJdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDA1LCBuZXN0ZWRfZXh0ZW5zaW9uLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmllbGRfb3B0Ml0pCisKKyAgZGVmIHRlc3RGaWxlRGVzY3JpcHRvclJlZmVyZW5jZXMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2VudW0uZmlsZSwgc2VsZi5teV9maWxlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLmZpbGUsIHNlbGYubXlfZmlsZSkKKworICBkZWYgdGVzdEZpbGVEZXNjcmlwdG9yKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9maWxlLm5hbWUsICdzb21lL2ZpbGVuYW1lL3NvbWUucHJvdG8nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9maWxlLnBhY2thZ2UsICdwcm90b2J1Zl91bml0dGVzdCcpCisKKworY2xhc3MgRGVzY3JpcHRvckNvcHlUb1Byb3RvVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIGZvciBDb3B5VG8gZnVuY3Rpb25zIG9mIERlc2NyaXB0b3IuIiIiCisKKyAgZGVmIF9Bc3NlcnRQcm90b0VxdWFsKHNlbGYsIGFjdHVhbF9wcm90bywgZXhwZWN0ZWRfY2xhc3MsIGV4cGVjdGVkX2FzY2lpKToKKyAgICBleHBlY3RlZF9wcm90byA9IGV4cGVjdGVkX2NsYXNzKCkKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZShleHBlY3RlZF9hc2NpaSwgZXhwZWN0ZWRfcHJvdG8pCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBhY3R1YWxfcHJvdG8sIGV4cGVjdGVkX3Byb3RvLAorICAgICAgICAnTm90IGVxdWFsLFxuQWN0dWFsOlxuJXNcbkV4cGVjdGVkOlxuJXNcbicKKyAgICAgICAgJSAoc3RyKGFjdHVhbF9wcm90byksIHN0cihleHBlY3RlZF9wcm90bykpKQorCisgIGRlZiBfSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oc2VsZiwgZGVzYywgZXhwZWN0ZWRfcHJvdG9fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcHJvdG9fYXNjaWkpOgorICAgIGFjdHVhbCA9IGV4cGVjdGVkX3Byb3RvX2NsYXNzKCkKKyAgICBkZXNjLkNvcHlUb1Byb3RvKGFjdHVhbCkKKyAgICBzZWxmLl9Bc3NlcnRQcm90b0VxdWFsKAorICAgICAgICBhY3R1YWwsIGV4cGVjdGVkX3Byb3RvX2NsYXNzLCBleHBlY3RlZF9wcm90b19hc2NpaSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX0VtcHR5TWVzc2FnZShzZWxmKToKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX0VNUFRZX01FU1NBR0VfREVTQ1JJUFRPUl9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX05lc3RlZE1lc3NhZ2Uoc2VsZik6CisgICAgVEVTVF9ORVNURURfTUVTU0FHRV9BU0NJSSA9ICIiIgorICAgICAgbmFtZTogJ05lc3RlZE1lc3NhZ2UnCisgICAgICBmaWVsZDogPAorICAgICAgICBuYW1lOiAnYmInCisgICAgICAgIG51bWJlcjogMQorICAgICAgICBsYWJlbDogMSAgIyBPcHRpb25hbAorICAgICAgICB0eXBlOiA1ICAjIFRZUEVfSU5UMzIKKyAgICAgID4KKyAgICAgICIiIgorCisgICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfTkVTVEVEX01FU1NBR0VfQVNDSUkpCisKKyAgZGVmIHRlc3RDb3B5VG9Qcm90b19Gb3JlaWduTmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICBURVNUX0ZPUkVJR05fTkVTVEVEX0FTQ0lJID0gIiIiCisgICAgICBuYW1lOiAnVGVzdEZvcmVpZ25OZXN0ZWQnCisgICAgICBmaWVsZDogPAorICAgICAgICBuYW1lOiAnZm9yZWlnbl9uZXN0ZWQnCisgICAgICAgIG51bWJlcjogMQorICAgICAgICBsYWJlbDogMSAgIyBPcHRpb25hbAorICAgICAgICB0eXBlOiAxMSAgIyBUWVBFX01FU1NBR0UKKyAgICAgICAgdHlwZV9uYW1lOiAnLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJworICAgICAgPgorICAgICAgIiIiCisKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RGb3JlaWduTmVzdGVkLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVEVTVF9GT1JFSUdOX05FU1RFRF9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX0ZvcmVpZ25FbnVtKHNlbGYpOgorICAgIFRFU1RfRk9SRUlHTl9FTlVNX0FTQ0lJID0gIiIiCisgICAgICBuYW1lOiAnRm9yZWlnbkVudW0nCisgICAgICB2YWx1ZTogPAorICAgICAgICBuYW1lOiAnRk9SRUlHTl9GT08nCisgICAgICAgIG51bWJlcjogNAorICAgICAgPgorICAgICAgdmFsdWU6IDwKKyAgICAgICAgbmFtZTogJ0ZPUkVJR05fQkFSJworICAgICAgICBudW1iZXI6IDUKKyAgICAgID4KKyAgICAgIHZhbHVlOiA8CisgICAgICAgIG5hbWU6ICdGT1JFSUdOX0JBWicKKyAgICAgICAgbnVtYmVyOiA2CisgICAgICA+CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuX0ZPUkVJR05FTlVNLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX0ZPUkVJR05fRU5VTV9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX09wdGlvbnMoc2VsZik6CisgICAgVEVTVF9ERVBSRUNBVEVEX0ZJRUxEU19BU0NJSSA9ICIiIgorICAgICAgbmFtZTogJ1Rlc3REZXByZWNhdGVkRmllbGRzJworICAgICAgZmllbGQ6IDwKKyAgICAgICAgbmFtZTogJ2RlcHJlY2F0ZWRfaW50MzInCisgICAgICAgIG51bWJlcjogMQorICAgICAgICBsYWJlbDogMSAgIyBPcHRpb25hbAorICAgICAgICB0eXBlOiA1ICAjIFRZUEVfSU5UMzIKKyAgICAgICAgb3B0aW9uczogPAorICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUKKyAgICAgICAgPgorICAgICAgPgorICAgICAgIiIiCisKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3REZXByZWNhdGVkRmllbGRzLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVEVTVF9ERVBSRUNBVEVEX0ZJRUxEU19BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX0FsbEV4dGVuc2lvbnMoc2VsZik6CisgICAgVEVTVF9FTVBUWV9NRVNTQUdFX1dJVEhfRVhURU5TSU9OU19BU0NJSSA9ICIiIgorICAgICAgbmFtZTogJ1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucycKKyAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAorICAgICAgICBzdGFydDogMQorICAgICAgICBlbmQ6IDUzNjg3MDkxMgorICAgICAgPgorICAgICAgIiIiCisKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucy5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfRU1QVFlfTUVTU0FHRV9XSVRIX0VYVEVOU0lPTlNfQVNDSUkpCisKKyAgZGVmIHRlc3RDb3B5VG9Qcm90b19TZXZlcmFsRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBURVNUX01FU1NBR0VfV0lUSF9TRVZFUkFMX0VYVEVOU0lPTlNfQVNDSUkgPSAiIiIKKyAgICAgIG5hbWU6ICdUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMnCisgICAgICBleHRlbnNpb25fcmFuZ2U6IDwKKyAgICAgICAgc3RhcnQ6IDQyCisgICAgICAgIGVuZDogNDMKKyAgICAgID4KKyAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAorICAgICAgICBzdGFydDogNDE0MworICAgICAgICBlbmQ6IDQyNDQKKyAgICAgID4KKyAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAorICAgICAgICBzdGFydDogNjU1MzYKKyAgICAgICAgZW5kOiA1MzY4NzA5MTIKKyAgICAgID4KKyAgICAgICIiIgorCisgICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX01FU1NBR0VfV0lUSF9TRVZFUkFMX0VYVEVOU0lPTlNfQVNDSUkpCisKKyAgZGVmIHRlc3RDb3B5VG9Qcm90b19GaWxlRGVzY3JpcHRvcihzZWxmKToKKyAgICBVTklUVEVTVF9JTVBPUlRfRklMRV9ERVNDUklQVE9SX0FTQ0lJID0gKCIiIgorICAgICAgbmFtZTogJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8nCisgICAgICBwYWNrYWdlOiAncHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0JworICAgICAgZGVwZW5kZW5jeTogJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvJworICAgICAgbWVzc2FnZV90eXBlOiA8CisgICAgICAgIG5hbWU6ICdJbXBvcnRNZXNzYWdlJworICAgICAgICBmaWVsZDogPAorICAgICAgICAgIG5hbWU6ICdkJworICAgICAgICAgIG51bWJlcjogMQorICAgICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCisgICAgICAgICAgdHlwZTogNSAgIyBUWVBFX0lOVDMyCisgICAgICAgID4KKyAgICAgID4KKyAgICAgICIiIiArCisgICAgICAiIiJlbnVtX3R5cGU6IDwKKyAgICAgICAgbmFtZTogJ0ltcG9ydEVudW0nCisgICAgICAgIHZhbHVlOiA8CisgICAgICAgICAgbmFtZTogJ0lNUE9SVF9GT08nCisgICAgICAgICAgbnVtYmVyOiA3CisgICAgICAgID4KKyAgICAgICAgdmFsdWU6IDwKKyAgICAgICAgICBuYW1lOiAnSU1QT1JUX0JBUicKKyAgICAgICAgICBudW1iZXI6IDgKKyAgICAgICAgPgorICAgICAgICB2YWx1ZTogPAorICAgICAgICAgIG5hbWU6ICdJTVBPUlRfQkFaJworICAgICAgICAgIG51bWJlcjogOQorICAgICAgICA+CisgICAgICA+CisgICAgICBvcHRpb25zOiA8CisgICAgICAgIGphdmFfcGFja2FnZTogJ2NvbS5nb29nbGUucHJvdG9idWYudGVzdCcKKyAgICAgICAgb3B0aW1pemVfZm9yOiAxICAjIFNQRUVECisgICAgICA+CisgICAgICBwdWJsaWNfZGVwZW5kZW5jeTogMAorICAgICAgIiIiKQorCisgICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCisgICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVU5JVFRFU1RfSU1QT1JUX0ZJTEVfREVTQ1JJUFRPUl9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX1NlcnZpY2VEZXNjcmlwdG9yKHNlbGYpOgorICAgIFRFU1RfU0VSVklDRV9BU0NJSSA9ICIiIgorICAgICAgbmFtZTogJ1Rlc3RTZXJ2aWNlJworICAgICAgbWV0aG9kOiA8CisgICAgICAgIG5hbWU6ICdGb28nCisgICAgICAgIGlucHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuRm9vUmVxdWVzdCcKKyAgICAgICAgb3V0cHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuRm9vUmVzcG9uc2UnCisgICAgICA+CisgICAgICBtZXRob2Q6IDwKKyAgICAgICAgbmFtZTogJ0JhcicKKyAgICAgICAgaW5wdXRfdHlwZTogJy5wcm90b2J1Zl91bml0dGVzdC5CYXJSZXF1ZXN0JworICAgICAgICBvdXRwdXRfdHlwZTogJy5wcm90b2J1Zl91bml0dGVzdC5CYXJSZXNwb25zZScKKyAgICAgID4KKyAgICAgICIiIgorCisgICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZS5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX1NFUlZJQ0VfQVNDSUkpCisKKworY2xhc3MgTWFrZURlc2NyaXB0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgZGVmIHRlc3RNYWtlRGVzY3JpcHRvcldpdGhVbnNpZ25lZEludEZpZWxkKHNlbGYpOgorICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQorICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5uYW1lID0gJ0ZvbycKKyAgICBtZXNzYWdlX3R5cGUgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubWVzc2FnZV90eXBlLmFkZCgpCisgICAgbWVzc2FnZV90eXBlLm5hbWUgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubmFtZQorICAgIGZpZWxkID0gbWVzc2FnZV90eXBlLmZpZWxkLmFkZCgpCisgICAgZmllbGQubnVtYmVyID0gMQorICAgIGZpZWxkLm5hbWUgPSAndWludDY0X2ZpZWxkJworICAgIGZpZWxkLmxhYmVsID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVRVUlSRUQKKyAgICBmaWVsZC50eXBlID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQKKyAgICByZXN1bHQgPSBkZXNjcmlwdG9yLk1ha2VEZXNjcmlwdG9yKG1lc3NhZ2VfdHlwZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5maWVsZHNbMF0uY3BwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1VJTlQ2NCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzc3OTc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGVyLnB5CkBAIC0wLDAgKzEsNzY5IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQ29kZSBmb3IgZW5jb2RpbmcgcHJvdG9jb2wgbWVzc2FnZSBwcmltaXRpdmVzLgorCitDb250YWlucyB0aGUgbG9naWMgZm9yIGVuY29kaW5nIGV2ZXJ5IGxvZ2ljYWwgcHJvdG9jb2wgZmllbGQgdHlwZQoraW50byBvbmUgb2YgdGhlIDUgcGh5c2ljYWwgd2lyZSB0eXBlcy4KKworVGhpcyBjb2RlIGlzIGRlc2lnbmVkIHRvIHB1c2ggdGhlIFB5dGhvbiBpbnRlcnByZXRlcidzIHBlcmZvcm1hbmNlIHRvIHRoZQorbGltaXRzLgorCitUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IGF0IHN0YXJ0dXAgdGltZSwgZm9yIGV2ZXJ5IGZpZWxkIChpLmUuIGV2ZXJ5CitGaWVsZERlc2NyaXB0b3IpIHdlIGNvbnN0cnVjdCB0d28gZnVuY3Rpb25zOiAgYSAic2l6ZXIiIGFuZCBhbiAiZW5jb2RlciIuICBUaGUKK3NpemVyIHRha2VzIGEgdmFsdWUgb2YgdGhpcyBmaWVsZCdzIHR5cGUgYW5kIGNvbXB1dGVzIGl0cyBieXRlIHNpemUuICBUaGUKK2VuY29kZXIgdGFrZXMgYSB3cml0ZXIgZnVuY3Rpb24gYW5kIGEgdmFsdWUuICBJdCBlbmNvZGVzIHRoZSB2YWx1ZSBpbnRvIGJ5dGUKK3N0cmluZ3MgYW5kIGludm9rZXMgdGhlIHdyaXRlciBmdW5jdGlvbiB0byB3cml0ZSB0aG9zZSBzdHJpbmdzLiAgVHlwaWNhbGx5IHRoZQord3JpdGVyIGZ1bmN0aW9uIGlzIHRoZSB3cml0ZSgpIG1ldGhvZCBvZiBhIGNTdHJpbmdJTy4KKworV2UgdHJ5IHRvIGRvIGFzIG11Y2ggd29yayBhcyBwb3NzaWJsZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUgd3JpdGVyIGFuZCB0aGUKK3NpemVyIHJhdGhlciB0aGFuIHdoZW4gY2FsbGluZyB0aGVtLiAgSW4gcGFydGljdWxhcjoKKyogV2UgY29weSBhbnkgbmVlZGVkIGdsb2JhbCBmdW5jdGlvbnMgdG8gbG9jYWwgdmFyaWFibGVzLCBzbyB0aGF0IHdlIGRvIG5vdCBuZWVkCisgIHRvIGRvIGNvc3RseSBnbG9iYWwgdGFibGUgbG9va3VwcyBhdCBydW50aW1lLgorKiBTaW1pbGFybHksIHdlIHRyeSB0byBkbyBhbnkgYXR0cmlidXRlIGxvb2t1cHMgYXQgc3RhcnR1cCB0aW1lIGlmIHBvc3NpYmxlLgorKiBFdmVyeSBmaWVsZCdzIHRhZyBpcyBlbmNvZGVkIHRvIGJ5dGVzIGF0IHN0YXJ0dXAsIHNpbmNlIGl0IGNhbid0IGNoYW5nZSBhdAorICBydW50aW1lLgorKiBXaGF0ZXZlciBjb21wb25lbnQgb2YgdGhlIGZpZWxkIHNpemUgd2UgY2FuIGNvbXB1dGUgYXQgc3RhcnR1cCwgd2UgZG8uCisqIFdlICphdm9pZCogc2hhcmluZyBjb2RlIGlmIGRvaW5nIHNvIHdvdWxkIG1ha2UgdGhlIGNvZGUgc2xvd2VyIGFuZCBub3Qgc2hhcmluZworICBkb2VzIG5vdCBidXJkZW4gdXMgdG9vIG11Y2guICBGb3IgZXhhbXBsZSwgZW5jb2RlcnMgZm9yIHJlcGVhdGVkIGZpZWxkcyBkbworICBub3QganVzdCBjYWxsIHRoZSBlbmNvZGVycyBmb3Igc2luZ3VsYXIgZmllbGRzIGluIGEgbG9vcCBiZWNhdXNlIHRoaXMgd291bGQKKyAgYWRkIGFuIGV4dHJhIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQgZm9yIGV2ZXJ5IGxvb3AgaXRlcmF0aW9uOyBpbnN0ZWFkLCB3ZQorICBtYW51YWxseSBpbmxpbmUgdGhlIHNpbmdsZS12YWx1ZSBlbmNvZGVyIGludG8gdGhlIGxvb3AuCisqIElmIGEgUHl0aG9uIGZ1bmN0aW9uIGxhY2tzIGEgcmV0dXJuIHN0YXRlbWVudCwgUHl0aG9uIGFjdHVhbGx5IGdlbmVyYXRlcworICBpbnN0cnVjdGlvbnMgdG8gcG9wIHRoZSByZXN1bHQgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IG9mZiB0aGUgc3RhY2ssIHB1c2gKKyAgTm9uZSBvbnRvIHRoZSBzdGFjaywgYW5kIHRoZW4gcmV0dXJuIHRoYXQuICBJZiB3ZSByZWFsbHkgZG9uJ3QgY2FyZSB3aGF0CisgIHZhbHVlIGlzIHJldHVybmVkLCB0aGVuIHdlIGNhbiBzYXZlIHR3byBpbnN0cnVjdGlvbnMgYnkgcmV0dXJuaW5nIHRoZQorICByZXN1bHQgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiAgSXQgbG9va3MgZnVubnkgYnV0IGl0IGhlbHBzLgorKiBXZSBhc3N1bWUgdGhhdCB0eXBlIGFuZCBib3VuZHMgY2hlY2tpbmcgaGFzIGhhcHBlbmVkIGF0IGEgaGlnaGVyIGxldmVsLgorIiIiCisKK19fYXV0aG9yX18gPSAna2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSknCisKK2ltcG9ydCBzdHJ1Y3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3aXJlX2Zvcm1hdAorCisKKyMgVGhpcyB3aWxsIG92ZXJmbG93IGFuZCB0aHVzIGJlY29tZSBJRUVFLTc1NCAiaW5maW5pdHkiLiAgV2Ugd291bGQgdXNlCisjICJmbG9hdCgnaW5mJykiIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb24gV2luZG93cyBwcmUtUHl0aG9uLTIuNi4KK19QT1NfSU5GID0gMWUxMDAwMAorX05FR19JTkYgPSAtX1BPU19JTkYKKworCitkZWYgX1ZhcmludFNpemUodmFsdWUpOgorICAiIiJDb21wdXRlIHRoZSBzaXplIG9mIGEgdmFyaW50IHZhbHVlLiIiIgorICBpZiB2YWx1ZSA8PSAweDdmOiByZXR1cm4gMQorICBpZiB2YWx1ZSA8PSAweDNmZmY6IHJldHVybiAyCisgIGlmIHZhbHVlIDw9IDB4MWZmZmZmOiByZXR1cm4gMworICBpZiB2YWx1ZSA8PSAweGZmZmZmZmY6IHJldHVybiA0CisgIGlmIHZhbHVlIDw9IDB4N2ZmZmZmZmZmOiByZXR1cm4gNQorICBpZiB2YWx1ZSA8PSAweDNmZmZmZmZmZmZmOiByZXR1cm4gNgorICBpZiB2YWx1ZSA8PSAweDFmZmZmZmZmZmZmZmY6IHJldHVybiA3CisgIGlmIHZhbHVlIDw9IDB4ZmZmZmZmZmZmZmZmZmY6IHJldHVybiA4CisgIGlmIHZhbHVlIDw9IDB4N2ZmZmZmZmZmZmZmZmZmZjogcmV0dXJuIDkKKyAgcmV0dXJuIDEwCisKKworZGVmIF9TaWduZWRWYXJpbnRTaXplKHZhbHVlKToKKyAgIiIiQ29tcHV0ZSB0aGUgc2l6ZSBvZiBhIHNpZ25lZCB2YXJpbnQgdmFsdWUuIiIiCisgIGlmIHZhbHVlIDwgMDogcmV0dXJuIDEwCisgIGlmIHZhbHVlIDw9IDB4N2Y6IHJldHVybiAxCisgIGlmIHZhbHVlIDw9IDB4M2ZmZjogcmV0dXJuIDIKKyAgaWYgdmFsdWUgPD0gMHgxZmZmZmY6IHJldHVybiAzCisgIGlmIHZhbHVlIDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKKyAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmY6IHJldHVybiA1CisgIGlmIHZhbHVlIDw9IDB4M2ZmZmZmZmZmZmY6IHJldHVybiA2CisgIGlmIHZhbHVlIDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKKyAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmZmZmZmZmZjogcmV0dXJuIDgKKyAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOQorICByZXR1cm4gMTAKKworCitkZWYgX1RhZ1NpemUoZmllbGRfbnVtYmVyKToKKyAgIiIiUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhIHRhZyB3aXRoIHRoaXMgZmllbGQKKyAgbnVtYmVyLiIiIgorICAjIEp1c3QgcGFzcyBpbiB0eXBlIDAsIHNpbmNlIHRoZSB0eXBlIHdvbid0IGFmZmVjdCB0aGUgdGFnK3R5cGUgc2l6ZS4KKyAgcmV0dXJuIF9WYXJpbnRTaXplKHdpcmVfZm9ybWF0LlBhY2tUYWcoZmllbGRfbnVtYmVyLCAwKSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluIHRoaXMgc2VjdGlvbiB3ZSBkZWZpbmUgc29tZSBnZW5lcmljIHNpemVycy4gIEVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zCisjIHRha2VzIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGZpZWxkIHR5cGUsIGUuZy4gaW50MzIgb3IgZml4ZWQ2NC4KKyMgSXQgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uIHdoaWNoIGluIHR1cm4gdGFrZXMgcGFyYW1ldGVycyBzcGVjaWZpYyB0byBhCisjIHBhcnRpY3VsYXIgZmllbGQsIGUuZy4gdGhlIGZpZWxkIG51bWJlciBhbmQgd2hldGhlciBpdCBpcyByZXBlYXRlZCBvciBwYWNrZWQuCisjIExvb2sgYXQgdGhlIG5leHQgc2VjdGlvbiB0byBzZWUgaG93IHRoZXNlIGFyZSB1c2VkLgorCisKK2RlZiBfU2ltcGxlU2l6ZXIoY29tcHV0ZV92YWx1ZV9zaXplKToKKyAgIiIiQSBzaXplciB3aGljaCB1c2VzIHRoZSBmdW5jdGlvbiBjb21wdXRlX3ZhbHVlX3NpemUgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZgorICBlYWNoIHZhbHVlLiAgVHlwaWNhbGx5IGNvbXB1dGVfdmFsdWVfc2l6ZSBpcyBfVmFyaW50U2l6ZS4iIiIKKworICBkZWYgU3BlY2lmaWNTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAgIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKQorICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQorICAgICAgZGVmIFBhY2tlZEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgcmVzdWx0ICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShlbGVtZW50KQorICAgICAgICByZXR1cm4gcmVzdWx0ICsgbG9jYWxfVmFyaW50U2l6ZShyZXN1bHQpICsgdGFnX3NpemUKKyAgICAgIHJldHVybiBQYWNrZWRGaWVsZFNpemUKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUoZWxlbWVudCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCisgICAgZWxzZToKKyAgICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXR1cm4gdGFnX3NpemUgKyBjb21wdXRlX3ZhbHVlX3NpemUodmFsdWUpCisgICAgICByZXR1cm4gRmllbGRTaXplCisKKyAgcmV0dXJuIFNwZWNpZmljU2l6ZXIKKworCitkZWYgX01vZGlmaWVkU2l6ZXIoY29tcHV0ZV92YWx1ZV9zaXplLCBtb2RpZnlfdmFsdWUpOgorICAiIiJMaWtlIFNpbXBsZVNpemVyLCBidXQgbW9kaWZ5X3ZhbHVlIGlzIGludm9rZWQgb24gZWFjaCB2YWx1ZSBiZWZvcmUgaXQgaXMKKyAgcGFzc2VkIHRvIGNvbXB1dGVfdmFsdWVfc2l6ZS4gIG1vZGlmeV92YWx1ZSBpcyB0eXBpY2FsbHkgWmlnWmFnRW5jb2RlLiIiIgorCisgIGRlZiBTcGVjaWZpY1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgICAgaWYgaXNfcGFja2VkOgorICAgICAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisgICAgICBkZWYgUGFja2VkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICByZXN1bHQgKz0gY29tcHV0ZV92YWx1ZV9zaXplKG1vZGlmeV92YWx1ZShlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdCArIGxvY2FsX1ZhcmludFNpemUocmVzdWx0KSArIHRhZ19zaXplCisgICAgICByZXR1cm4gUGFja2VkRmllbGRTaXplCisgICAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICByZXN1bHQgKz0gY29tcHV0ZV92YWx1ZV9zaXplKG1vZGlmeV92YWx1ZShlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCisgICAgZWxzZToKKyAgICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXR1cm4gdGFnX3NpemUgKyBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKHZhbHVlKSkKKyAgICAgIHJldHVybiBGaWVsZFNpemUKKworICByZXR1cm4gU3BlY2lmaWNTaXplcgorCisKK2RlZiBfRml4ZWRTaXplcih2YWx1ZV9zaXplKToKKyAgIiIiTGlrZSBfU2ltcGxlU2l6ZXIgZXhjZXB0IGZvciBhIGZpeGVkLXNpemUgZmllbGQuICBUaGUgaW5wdXQgaXMgdGhlIHNpemUKKyAgb2Ygb25lIHZhbHVlLiIiIgorCisgIGRlZiBTcGVjaWZpY1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgICAgaWYgaXNfcGFja2VkOgorICAgICAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisgICAgICBkZWYgUGFja2VkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gbGVuKHZhbHVlKSAqIHZhbHVlX3NpemUKKyAgICAgICAgcmV0dXJuIHJlc3VsdCArIGxvY2FsX1ZhcmludFNpemUocmVzdWx0KSArIHRhZ19zaXplCisgICAgICByZXR1cm4gUGFja2VkRmllbGRTaXplCisgICAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICAgIGVsZW1lbnRfc2l6ZSA9IHZhbHVlX3NpemUgKyB0YWdfc2l6ZQorICAgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmV0dXJuIGxlbih2YWx1ZSkgKiBlbGVtZW50X3NpemUKKyAgICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQorICAgIGVsc2U6CisgICAgICBmaWVsZF9zaXplID0gdmFsdWVfc2l6ZSArIHRhZ19zaXplCisgICAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmV0dXJuIGZpZWxkX3NpemUKKyAgICAgIHJldHVybiBGaWVsZFNpemUKKworICByZXR1cm4gU3BlY2lmaWNTaXplcgorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgSGVyZSB3ZSBkZWNsYXJlIGEgc2l6ZXIgY29uc3RydWN0b3IgZm9yIGVhY2ggZmllbGQgdHlwZS4gIEVhY2ggInNpemVyCisjIGNvbnN0cnVjdG9yIiBpcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCkKKyMgYXMgcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhIHNpemVyLCB3aGljaCBpbiB0dXJuIHRha2VzIGEgZmllbGQgdmFsdWUgYXMKKyMgYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgaXRzIGVuY29kZWQgc2l6ZS4KKworCitJbnQzMlNpemVyID0gSW50NjRTaXplciA9IEVudW1TaXplciA9IF9TaW1wbGVTaXplcihfU2lnbmVkVmFyaW50U2l6ZSkKKworVUludDMyU2l6ZXIgPSBVSW50NjRTaXplciA9IF9TaW1wbGVTaXplcihfVmFyaW50U2l6ZSkKKworU0ludDMyU2l6ZXIgPSBTSW50NjRTaXplciA9IF9Nb2RpZmllZFNpemVyKAorICAgIF9TaWduZWRWYXJpbnRTaXplLCB3aXJlX2Zvcm1hdC5aaWdaYWdFbmNvZGUpCisKK0ZpeGVkMzJTaXplciA9IFNGaXhlZDMyU2l6ZXIgPSBGbG9hdFNpemVyICA9IF9GaXhlZFNpemVyKDQpCitGaXhlZDY0U2l6ZXIgPSBTRml4ZWQ2NFNpemVyID0gRG91YmxlU2l6ZXIgPSBfRml4ZWRTaXplcig4KQorCitCb29sU2l6ZXIgPSBfRml4ZWRTaXplcigxKQorCisKK2RlZiBTdHJpbmdTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgc3RyaW5nIGZpZWxkLiIiIgorCisgIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKQorICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKKyAgbG9jYWxfbGVuID0gbGVuCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICBsID0gbG9jYWxfbGVuKGVsZW1lbnQuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICByZXN1bHQgKz0gbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgZWxzZToKKyAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKKyAgICAgIGwgPSBsb2NhbF9sZW4odmFsdWUuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgcmV0dXJuIHRhZ19zaXplICsgbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKKyAgICByZXR1cm4gRmllbGRTaXplCisKKworZGVmIEJ5dGVzU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhIHNpemVyIGZvciBhIGJ5dGVzIGZpZWxkLiIiIgorCisgIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKQorICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKKyAgbG9jYWxfbGVuID0gbGVuCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICBsID0gbG9jYWxfbGVuKGVsZW1lbnQpCisgICAgICAgIHJlc3VsdCArPSBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQorICBlbHNlOgorICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgbCA9IGxvY2FsX2xlbih2YWx1ZSkKKyAgICAgIHJldHVybiB0YWdfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCisgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisKK2RlZiBHcm91cFNpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYSBzaXplciBmb3IgYSBncm91cCBmaWVsZC4iIiIKKworICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikgKiAyCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICByZXN1bHQgKz0gZWxlbWVudC5CeXRlU2l6ZSgpCisgICAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCisgIGVsc2U6CisgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICByZXR1cm4gdGFnX3NpemUgKyB2YWx1ZS5CeXRlU2l6ZSgpCisgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisKK2RlZiBNZXNzYWdlU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhIHNpemVyIGZvciBhIG1lc3NhZ2UgZmllbGQuIiIiCisKKyAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQorICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgbCA9IGVsZW1lbnQuQnl0ZVNpemUoKQorICAgICAgICByZXN1bHQgKz0gbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgZWxzZToKKyAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKKyAgICAgIGwgPSB2YWx1ZS5CeXRlU2l6ZSgpCisgICAgICByZXR1cm4gdGFnX3NpemUgKyBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgIHJldHVybiBGaWVsZFNpemUKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1lc3NhZ2VTZXQgaXMgc3BlY2lhbC4KKworCitkZWYgTWVzc2FnZVNldEl0ZW1TaXplcihmaWVsZF9udW1iZXIpOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldC4KKworICBUaGUgbWVzc2FnZSBzZXQgbWVzc2FnZSBsb29rcyBsaWtlIHRoaXM6CisgICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKKyAgICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7CisgICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKKyAgICAgIH0KKyAgICB9CisgICIiIgorICBzdGF0aWNfc2l6ZSA9IChfVGFnU2l6ZSgxKSAqIDIgKyBfVGFnU2l6ZSgyKSArIF9WYXJpbnRTaXplKGZpZWxkX251bWJlcikgKworICAgICAgICAgICAgICAgICBfVGFnU2l6ZSgzKSkKKyAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisKKyAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgbCA9IHZhbHVlLkJ5dGVTaXplKCkKKyAgICByZXR1cm4gc3RhdGljX3NpemUgKyBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorCisgIHJldHVybiBGaWVsZFNpemUKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEVuY29kZXJzIQorCisKK2RlZiBfVmFyaW50RW5jb2RlcigpOgorICAiIiJSZXR1cm4gYW4gZW5jb2RlciBmb3IgYSBiYXNpYyB2YXJpbnQgdmFsdWUgKGRvZXMgbm90IGluY2x1ZGUgdGFnKS4iIiIKKworICBsb2NhbF9jaHIgPSBjaHIKKyAgZGVmIEVuY29kZVZhcmludCh3cml0ZSwgdmFsdWUpOgorICAgIGJpdHMgPSB2YWx1ZSAmIDB4N2YKKyAgICB2YWx1ZSA+Pj0gNworICAgIHdoaWxlIHZhbHVlOgorICAgICAgd3JpdGUobG9jYWxfY2hyKDB4ODB8Yml0cykpCisgICAgICBiaXRzID0gdmFsdWUgJiAweDdmCisgICAgICB2YWx1ZSA+Pj0gNworICAgIHJldHVybiB3cml0ZShsb2NhbF9jaHIoYml0cykpCisKKyAgcmV0dXJuIEVuY29kZVZhcmludAorCisKK2RlZiBfU2lnbmVkVmFyaW50RW5jb2RlcigpOgorICAiIiJSZXR1cm4gYW4gZW5jb2RlciBmb3IgYSBiYXNpYyBzaWduZWQgdmFyaW50IHZhbHVlIChkb2VzIG5vdCBpbmNsdWRlCisgIHRhZykuIiIiCisKKyAgbG9jYWxfY2hyID0gY2hyCisgIGRlZiBFbmNvZGVTaWduZWRWYXJpbnQod3JpdGUsIHZhbHVlKToKKyAgICBpZiB2YWx1ZSA8IDA6CisgICAgICB2YWx1ZSArPSAoMSA8PCA2NCkKKyAgICBiaXRzID0gdmFsdWUgJiAweDdmCisgICAgdmFsdWUgPj49IDcKKyAgICB3aGlsZSB2YWx1ZToKKyAgICAgIHdyaXRlKGxvY2FsX2NocigweDgwfGJpdHMpKQorICAgICAgYml0cyA9IHZhbHVlICYgMHg3ZgorICAgICAgdmFsdWUgPj49IDcKKyAgICByZXR1cm4gd3JpdGUobG9jYWxfY2hyKGJpdHMpKQorCisgIHJldHVybiBFbmNvZGVTaWduZWRWYXJpbnQKKworCitfRW5jb2RlVmFyaW50ID0gX1ZhcmludEVuY29kZXIoKQorX0VuY29kZVNpZ25lZFZhcmludCA9IF9TaWduZWRWYXJpbnRFbmNvZGVyKCkKKworCitkZWYgX1ZhcmludEJ5dGVzKHZhbHVlKToKKyAgIiIiRW5jb2RlIHRoZSBnaXZlbiBpbnRlZ2VyIGFzIGEgdmFyaW50IGFuZCByZXR1cm4gdGhlIGJ5dGVzLiAgVGhpcyBpcyBvbmx5CisgIGNhbGxlZCBhdCBzdGFydHVwIHRpbWUgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIGZhc3QuIiIiCisKKyAgcGllY2VzID0gW10KKyAgX0VuY29kZVZhcmludChwaWVjZXMuYXBwZW5kLCB2YWx1ZSkKKyAgcmV0dXJuICIiLmpvaW4ocGllY2VzKQorCisKK2RlZiBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSk6CisgICIiIkVuY29kZSB0aGUgZ2l2ZW4gdGFnIGFuZCByZXR1cm4gdGhlIGJ5dGVzLiAgT25seSBjYWxsZWQgYXQgc3RhcnR1cC4iIiIKKworICByZXR1cm4gX1ZhcmludEJ5dGVzKHdpcmVfZm9ybWF0LlBhY2tUYWcoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFzIHdpdGggc2l6ZXJzIChzZWUgYWJvdmUpLCB3ZSBoYXZlIGEgbnVtYmVyIG9mIGNvbW1vbiBlbmNvZGVyCisjIGltcGxlbWVudGF0aW9ucy4KKworCitkZWYgX1NpbXBsZUVuY29kZXIod2lyZV90eXBlLCBlbmNvZGVfdmFsdWUsIGNvbXB1dGVfdmFsdWVfc2l6ZSk6CisgICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhbiBlbmNvZGVyIGZvciBmaWVsZHMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCisKKyAgQXJnczoKKyAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZSwgZm9yIGVuY29kaW5nIHRhZ3MuCisgICAgICBlbmNvZGVfdmFsdWU6ICBBIGZ1bmN0aW9uIHdoaWNoIGVuY29kZXMgYW4gaW5kaXZpZHVhbCB2YWx1ZSwgZS5nLgorICAgICAgICBfRW5jb2RlVmFyaW50KCkuCisgICAgICBjb21wdXRlX3ZhbHVlX3NpemU6ICBBIGZ1bmN0aW9uIHdoaWNoIGNvbXB1dGVzIHRoZSBzaXplIG9mIGFuIGluZGl2aWR1YWwKKyAgICAgICAgdmFsdWUsIGUuZy4gX1ZhcmludFNpemUoKS4KKyAgIiIiCisKKyAgZGVmIFNwZWNpZmljRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIHNpemUgPSAwCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHNpemUgKz0gY29tcHV0ZV92YWx1ZV9zaXplKGVsZW1lbnQpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgc2l6ZSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBlbGVtZW50KQorICAgICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCisgICAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICAgIGVuY29kZV92YWx1ZSh3cml0ZSwgZWxlbWVudCkKKyAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgcmV0dXJuIGVuY29kZV92YWx1ZSh3cml0ZSwgdmFsdWUpCisgICAgICByZXR1cm4gRW5jb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCisKKworZGVmIF9Nb2RpZmllZEVuY29kZXIod2lyZV90eXBlLCBlbmNvZGVfdmFsdWUsIGNvbXB1dGVfdmFsdWVfc2l6ZSwgbW9kaWZ5X3ZhbHVlKToKKyAgIiIiTGlrZSBTaW1wbGVFbmNvZGVyIGJ1dCBhZGRpdGlvbmFsbHkgaW52b2tlcyBtb2RpZnlfdmFsdWUgb24gZXZlcnkgdmFsdWUKKyAgYmVmb3JlIHBhc3NpbmcgaXQgdG8gZW5jb2RlX3ZhbHVlLiAgVXN1YWxseSBtb2RpZnlfdmFsdWUgaXMgWmlnWmFnRW5jb2RlLiIiIgorCisgIGRlZiBTcGVjaWZpY0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICBpZiBpc19wYWNrZWQ6CisgICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisgICAgICBkZWYgRW5jb2RlUGFja2VkRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICBzaXplID0gMAorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICBzaXplICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShtb2RpZnlfdmFsdWUoZWxlbWVudCkpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgc2l6ZSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBtb2RpZnlfdmFsdWUoZWxlbWVudCkpCisgICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBtb2RpZnlfdmFsdWUoZWxlbWVudCkpCisgICAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICAgIGVsc2U6CisgICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKKyAgICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIHJldHVybiBlbmNvZGVfdmFsdWUod3JpdGUsIG1vZGlmeV92YWx1ZSh2YWx1ZSkpCisgICAgICByZXR1cm4gRW5jb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCisKKworZGVmIF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX3R5cGUsIGZvcm1hdCk6CisgICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhbiBlbmNvZGVyIGZvciBhIGZpeGVkLXdpZHRoIGZpZWxkLgorCisgIEFyZ3M6CisgICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUsIGZvciBlbmNvZGluZyB0YWdzLgorICAgICAgZm9ybWF0OiAgVGhlIGZvcm1hdCBzdHJpbmcgdG8gcGFzcyB0byBzdHJ1Y3QucGFjaygpLgorICAiIiIKKworICB2YWx1ZV9zaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKworICBkZWYgU3BlY2lmaWNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgbG9jYWxfc3RydWN0X3BhY2sgPSBzdHJ1Y3QucGFjaworICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbGVuKHZhbHVlKSAqIHZhbHVlX3NpemUpCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgZWxlbWVudCkpCisgICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKKyAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgcmV0dXJuIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgdmFsdWUpKQorICAgICAgcmV0dXJuIEVuY29kZUZpZWxkCisKKyAgcmV0dXJuIFNwZWNpZmljRW5jb2RlcgorCisKK2RlZiBfRmxvYXRpbmdQb2ludEVuY29kZXIod2lyZV90eXBlLCBmb3JtYXQpOgorICAiIiJSZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYW4gZW5jb2RlciBmb3IgZmxvYXQgZmllbGRzLgorCisgIFRoaXMgaXMgbGlrZSBTdHJ1Y3RQYWNrRW5jb2RlciwgYnV0IGNhdGNoZXMgZXJyb3JzIHRoYXQgbWF5IGJlIGR1ZSB0bworICBwYXNzaW5nIG5vbi1maW5pdGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIHRvIHN0cnVjdC5wYWNrLCBhbmQgbWFrZXMgYQorICBzZWNvbmQgYXR0ZW1wdCB0byBlbmNvZGUgdGhvc2UgdmFsdWVzLgorCisgIEFyZ3M6CisgICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUsIGZvciBlbmNvZGluZyB0YWdzLgorICAgICAgZm9ybWF0OiAgVGhlIGZvcm1hdCBzdHJpbmcgdG8gcGFzcyB0byBzdHJ1Y3QucGFjaygpLgorICAiIiIKKworICB2YWx1ZV9zaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKyAgaWYgdmFsdWVfc2l6ZSA9PSA0OgorICAgIGRlZiBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCB2YWx1ZSk6CisgICAgICAjIFJlbWVtYmVyIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZm9ybSB1c2VzIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4KKyAgICAgIGlmIHZhbHVlID09IF9QT1NfSU5GOgorICAgICAgICB3cml0ZSgnXHgwMFx4MDBceDgwXHg3RicpCisgICAgICBlbGlmIHZhbHVlID09IF9ORUdfSU5GOgorICAgICAgICB3cml0ZSgnXHgwMFx4MDBceDgwXHhGRicpCisgICAgICBlbGlmIHZhbHVlICE9IHZhbHVlOiAgICAgICAgICAgIyBOYU4KKyAgICAgICAgd3JpdGUoJ1x4MDBceDAwXHhDMFx4N0YnKQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UKKyAgZWxpZiB2YWx1ZV9zaXplID09IDg6CisgICAgZGVmIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIHZhbHVlKToKKyAgICAgIGlmIHZhbHVlID09IF9QT1NfSU5GOgorICAgICAgICB3cml0ZSgnXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4N0YnKQorICAgICAgZWxpZiB2YWx1ZSA9PSBfTkVHX0lORjoKKyAgICAgICAgd3JpdGUoJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceEZGJykKKyAgICAgIGVsaWYgdmFsdWUgIT0gdmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICMgTmFOCisgICAgICAgIHdyaXRlKCdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicpCisgICAgICBlbHNlOgorICAgICAgICByYWlzZQorICBlbHNlOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0NhblwndCBlbmNvZGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIHRoYXQgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICclZCBieXRlcyBsb25nIChvbmx5IDQgb3IgOCknICUgdmFsdWVfc2l6ZSkKKworICBkZWYgU3BlY2lmaWNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgbG9jYWxfc3RydWN0X3BhY2sgPSBzdHJ1Y3QucGFjaworICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbGVuKHZhbHVlKSAqIHZhbHVlX3NpemUpCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgICMgVGhpcyB0cnkvZXhjZXB0IGJsb2NrIGlzIGdvaW5nIHRvIGJlIGZhc3RlciB0aGFuIGFueSBjb2RlIHRoYXQKKyAgICAgICAgICAjIHdlIGNvdWxkIHdyaXRlIHRvIGNoZWNrIHdoZXRoZXIgZWxlbWVudCBpcyBmaW5pdGUuCisgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKKyAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgICBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCBlbGVtZW50KQorICAgICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCisgICAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgZWxlbWVudCkpCisgICAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOgorICAgICAgICAgICAgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgZWxlbWVudCkKKyAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgdHJ5OgorICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgdmFsdWUpKQorICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgdmFsdWUpCisgICAgICByZXR1cm4gRW5jb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBIZXJlIHdlIGRlY2xhcmUgYW4gZW5jb2RlciBjb25zdHJ1Y3RvciBmb3IgZWFjaCBmaWVsZCB0eXBlLiAgVGhlc2Ugd29yaworIyB2ZXJ5IHNpbWlsYXJseSB0byBzaXplciBjb25zdHJ1Y3RvcnMsIGRlc2NyaWJlZCBlYXJsaWVyLgorCisKK0ludDMyRW5jb2RlciA9IEludDY0RW5jb2RlciA9IEVudW1FbmNvZGVyID0gX1NpbXBsZUVuY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRW5jb2RlU2lnbmVkVmFyaW50LCBfU2lnbmVkVmFyaW50U2l6ZSkKKworVUludDMyRW5jb2RlciA9IFVJbnQ2NEVuY29kZXIgPSBfU2ltcGxlRW5jb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9FbmNvZGVWYXJpbnQsIF9WYXJpbnRTaXplKQorCitTSW50MzJFbmNvZGVyID0gU0ludDY0RW5jb2RlciA9IF9Nb2RpZmllZEVuY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRW5jb2RlVmFyaW50LCBfVmFyaW50U2l6ZSwKKyAgICB3aXJlX2Zvcm1hdC5aaWdaYWdFbmNvZGUpCisKKyMgTm90ZSB0aGF0IFB5dGhvbiBjb252ZW5pZW50bHkgZ3VhcmFudGVlcyB0aGF0IHdoZW4gdXNpbmcgdGhlICc8JyBwcmVmaXggb24KKyMgZm9ybWF0cywgdGhleSB3aWxsIGFsc28gaGF2ZSB0aGUgc2FtZSBzaXplIGFjcm9zcyBhbGwgcGxhdGZvcm1zIChhcyBvcHBvc2VkCisjIHRvIHdpdGhvdXQgdGhlIHByZWZpeCwgd2hlcmUgdGhlaXIgc2l6ZXMgZGVwZW5kIG9uIHRoZSBDIGNvbXBpbGVyJ3MgYmFzaWMKKyMgdHlwZSBzaXplcykuCitGaXhlZDMyRW5jb2RlciAgPSBfU3RydWN0UGFja0VuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxJJykKK0ZpeGVkNjRFbmNvZGVyICA9IF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPFEnKQorU0ZpeGVkMzJFbmNvZGVyID0gX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8aScpCitTRml4ZWQ2NEVuY29kZXIgPSBfU3RydWN0UGFja0VuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxxJykKK0Zsb2F0RW5jb2RlciAgICA9IF9GbG9hdGluZ1BvaW50RW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPGYnKQorRG91YmxlRW5jb2RlciAgID0gX0Zsb2F0aW5nUG9pbnRFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8ZCcpCisKKworZGVmIEJvb2xFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBib29sZWFuIGZpZWxkLiIiIgorCisgIGZhbHNlX2J5dGUgPSBjaHIoMCkKKyAgdHJ1ZV9ieXRlID0gY2hyKDEpCisgIGlmIGlzX3BhY2tlZDoKKyAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAorICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsZW4odmFsdWUpKQorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIGlmIGVsZW1lbnQ6CisgICAgICAgICAgd3JpdGUodHJ1ZV9ieXRlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHdyaXRlKGZhbHNlX2J5dGUpCisgICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCisgIGVsaWYgaXNfcmVwZWF0ZWQ6CisgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpCisgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIGlmIGVsZW1lbnQ6CisgICAgICAgICAgd3JpdGUodHJ1ZV9ieXRlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHdyaXRlKGZhbHNlX2J5dGUpCisgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgZWxzZToKKyAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKKyAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgIGlmIHZhbHVlOgorICAgICAgICByZXR1cm4gd3JpdGUodHJ1ZV9ieXRlKQorICAgICAgcmV0dXJuIHdyaXRlKGZhbHNlX2J5dGUpCisgICAgcmV0dXJuIEVuY29kZUZpZWxkCisKKworZGVmIFN0cmluZ0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIHN0cmluZyBmaWVsZC4iIiIKKworICB0YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgbG9jYWxfbGVuID0gbGVuCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgZW5jb2RlZCA9IGVsZW1lbnQuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHdyaXRlKHRhZykKKyAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4oZW5jb2RlZCkpCisgICAgICAgIHdyaXRlKGVuY29kZWQpCisgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgZWxzZToKKyAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgIGVuY29kZWQgPSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgIHdyaXRlKHRhZykKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbG9jYWxfbGVuKGVuY29kZWQpKQorICAgICAgcmV0dXJuIHdyaXRlKGVuY29kZWQpCisgICAgcmV0dXJuIEVuY29kZUZpZWxkCisKKworZGVmIEJ5dGVzRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGFuIGVuY29kZXIgZm9yIGEgYnl0ZXMgZmllbGQuIiIiCisKKyAgdGFnID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisgIGxvY2FsX2xlbiA9IGxlbgorICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIHdyaXRlKHRhZykKKyAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4oZWxlbWVudCkpCisgICAgICAgIHdyaXRlKGVsZW1lbnQpCisgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgZWxzZToKKyAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgIHdyaXRlKHRhZykKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbG9jYWxfbGVuKHZhbHVlKSkKKyAgICAgIHJldHVybiB3cml0ZSh2YWx1ZSkKKyAgICByZXR1cm4gRW5jb2RlRmllbGQKKworCitkZWYgR3JvdXBFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBncm91cCBmaWVsZC4iIiIKKworICBzdGFydF90YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKQorICBlbmRfdGFnID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgd3JpdGUoc3RhcnRfdGFnKQorICAgICAgICBlbGVtZW50Ll9JbnRlcm5hbFNlcmlhbGl6ZSh3cml0ZSkKKyAgICAgICAgd3JpdGUoZW5kX3RhZykKKyAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgd3JpdGUoc3RhcnRfdGFnKQorICAgICAgdmFsdWUuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQorICAgICAgcmV0dXJuIHdyaXRlKGVuZF90YWcpCisgICAgcmV0dXJuIEVuY29kZUZpZWxkCisKKworZGVmIE1lc3NhZ2VFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBtZXNzYWdlIGZpZWxkLiIiIgorCisgIHRhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAorICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIHdyaXRlKHRhZykKKyAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBlbGVtZW50LkJ5dGVTaXplKCkpCisgICAgICAgIGVsZW1lbnQuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQorICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgIGVsc2U6CisgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICB3cml0ZSh0YWcpCisgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIHZhbHVlLkJ5dGVTaXplKCkpCisgICAgICByZXR1cm4gdmFsdWUuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQorICAgIHJldHVybiBFbmNvZGVGaWVsZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXMgYmVmb3JlLCBNZXNzYWdlU2V0IGlzIHNwZWNpYWwuCisKKworZGVmIE1lc3NhZ2VTZXRJdGVtRW5jb2RlcihmaWVsZF9udW1iZXIpOgorICAiIiJFbmNvZGVyIGZvciBleHRlbnNpb25zIG9mIE1lc3NhZ2VTZXQuCisKKyAgVGhlIG1lc3NhZ2Ugc2V0IG1lc3NhZ2UgbG9va3MgbGlrZSB0aGlzOgorICAgIG1lc3NhZ2UgTWVzc2FnZVNldCB7CisgICAgICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7CisgICAgICAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOworICAgICAgICByZXF1aXJlZCBzdHJpbmcgbWVzc2FnZSA9IDM7CisgICAgICB9CisgICAgfQorICAiIiIKKyAgc3RhcnRfYnl0ZXMgPSAiIi5qb2luKFsKKyAgICAgIFRhZ0J5dGVzKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKSwKKyAgICAgIFRhZ0J5dGVzKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCksCisgICAgICBfVmFyaW50Qnl0ZXMoZmllbGRfbnVtYmVyKSwKKyAgICAgIFRhZ0J5dGVzKDMsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpXSkKKyAgZW5kX2J5dGVzID0gVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQorICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisKKyAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgd3JpdGUoc3RhcnRfYnl0ZXMpCisgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCB2YWx1ZS5CeXRlU2l6ZSgpKQorICAgIHZhbHVlLl9JbnRlcm5hbFNlcmlhbGl6ZSh3cml0ZSkKKyAgICByZXR1cm4gd3JpdGUoZW5kX2J5dGVzKQorCisgIHJldHVybiBFbmNvZGVGaWVsZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMjg2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW51bV90eXBlX3dyYXBwZXIucHkKQEAgLTAsMCArMSw4OSBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGVudW0gdHlwZXMgdG8gZXhwb3NlIHV0aWxpdHkgZnVuY3Rpb25zLgorCitJbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYXMgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGVudW0gdGhleSB3cmFwCitvbiBwcm90byBjbGFzc2VzLiAgRm9yIHVzYWdlLCBzZWU6CisgIHJlZmxlY3Rpb25fdGVzdC5weQorIiIiCisKK19fYXV0aG9yX18gPSAncmFic2F0dEBnb29nbGUuY29tIChLZXZpbiBSYWJzYXR0KScKKworCitjbGFzcyBFbnVtVHlwZVdyYXBwZXIob2JqZWN0KToKKyAgIiIiQSB1dGlsaXR5IGZvciBmaW5kaW5nIHRoZSBuYW1lcyBvZiBlbnVtIHZhbHVlcy4iIiIKKworICBERVNDUklQVE9SID0gTm9uZQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnVtX3R5cGUpOgorICAgICIiIkluaXRzIEVudW1UeXBlV3JhcHBlciB3aXRoIGFuIEVudW1EZXNjcmlwdG9yLiIiIgorICAgIHNlbGYuX2VudW1fdHlwZSA9IGVudW1fdHlwZQorICAgIHNlbGYuREVTQ1JJUFRPUiA9IGVudW1fdHlwZTsKKworICBkZWYgTmFtZShzZWxmLCBudW1iZXIpOgorICAgICIiIlJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhbiBlbnVtIHZhbHVlLiIiIgorICAgIGlmIG51bWJlciBpbiBzZWxmLl9lbnVtX3R5cGUudmFsdWVzX2J5X251bWJlcjoKKyAgICAgIHJldHVybiBzZWxmLl9lbnVtX3R5cGUudmFsdWVzX2J5X251bWJlcltudW1iZXJdLm5hbWUKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdFbnVtICVzIGhhcyBubyBuYW1lIGRlZmluZWQgZm9yIHZhbHVlICVkJyAlICgKKyAgICAgICAgc2VsZi5fZW51bV90eXBlLm5hbWUsIG51bWJlcikpCisKKyAgZGVmIFZhbHVlKHNlbGYsIG5hbWUpOgorICAgICIiIlJldHVybnMgdGhlIHZhbHVlIGNvcmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZW51bSBuYW1lLiIiIgorICAgIGlmIG5hbWUgaW4gc2VsZi5fZW51bV90eXBlLnZhbHVlc19ieV9uYW1lOgorICAgICAgcmV0dXJuIHNlbGYuX2VudW1fdHlwZS52YWx1ZXNfYnlfbmFtZVtuYW1lXS5udW1iZXIKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdFbnVtICVzIGhhcyBubyB2YWx1ZSBkZWZpbmVkIGZvciBuYW1lICVzJyAlICgKKyAgICAgICAgc2VsZi5fZW51bV90eXBlLm5hbWUsIG5hbWUpKQorCisgIGRlZiBrZXlzKHNlbGYpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgdGhlIHN0cmluZyBuYW1lcyBpbiB0aGUgZW51bS4KKworICAgIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICAgICIiIgorCisgICAgcmV0dXJuIFt2YWx1ZV9kZXNjcmlwdG9yLm5hbWUKKyAgICAgICAgICAgIGZvciB2YWx1ZV9kZXNjcmlwdG9yIGluIHNlbGYuX2VudW1fdHlwZS52YWx1ZXNdCisKKyAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHRoZSBpbnRlZ2VyIHZhbHVlcyBpbiB0aGUgZW51bS4KKworICAgIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICAgICIiIgorCisgICAgcmV0dXJuIFt2YWx1ZV9kZXNjcmlwdG9yLm51bWJlcgorICAgICAgICAgICAgZm9yIHZhbHVlX2Rlc2NyaXB0b3IgaW4gc2VsZi5fZW51bV90eXBlLnZhbHVlc10KKworICBkZWYgaXRlbXMoc2VsZik6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiB0aGUgKG5hbWUsIHZhbHVlKSBwYWlycyBvZiB0aGUgZW51bS4KKworICAgIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICAgICIiIgorICAgIHJldHVybiBbKHZhbHVlX2Rlc2NyaXB0b3IubmFtZSwgdmFsdWVfZGVzY3JpcHRvci5udW1iZXIpCisgICAgICAgICAgICBmb3IgdmFsdWVfZGVzY3JpcHRvciBpbiBzZWxmLl9lbnVtX3R5cGUudmFsdWVzXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU1ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8KQEAgLTAsMCArMSw1NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpCisKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOworCisKK2VudW0gRmFjdG9yeTFFbnVtIHsKKyAgRkFDVE9SWV8xX1ZBTFVFXzAgPSAwOworICBGQUNUT1JZXzFfVkFMVUVfMSA9IDE7Cit9CisKK21lc3NhZ2UgRmFjdG9yeTFNZXNzYWdlIHsKKyAgb3B0aW9uYWwgRmFjdG9yeTFFbnVtIGZhY3RvcnlfMV9lbnVtID0gMTsKKyAgZW51bSBOZXN0ZWRGYWN0b3J5MUVudW0geworICAgIE5FU1RFRF9GQUNUT1JZXzFfVkFMVUVfMCA9IDA7CisgICAgTkVTVEVEX0ZBQ1RPUllfMV9WQUxVRV8xID0gMTsKKyAgfQorICBvcHRpb25hbCBOZXN0ZWRGYWN0b3J5MUVudW0gbmVzdGVkX2ZhY3RvcnlfMV9lbnVtID0gMjsKKyAgbWVzc2FnZSBOZXN0ZWRGYWN0b3J5MU1lc3NhZ2UgeworICAgIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDE7CisgIH0KKyAgb3B0aW9uYWwgTmVzdGVkRmFjdG9yeTFNZXNzYWdlIG5lc3RlZF9mYWN0b3J5XzFfbWVzc2FnZSA9IDM7CisgIG9wdGlvbmFsIGludDMyIHNjYWxhcl92YWx1ZSA9IDQ7CisgIHJlcGVhdGVkIHN0cmluZyBsaXN0X3ZhbHVlID0gNTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjZTRkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvCkBAIC0wLDAgKzEsNzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKQorCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90byI7CisKKworZW51bSBGYWN0b3J5MkVudW0geworICBGQUNUT1JZXzJfVkFMVUVfMCA9IDA7CisgIEZBQ1RPUllfMl9WQUxVRV8xID0gMTsKK30KKworbWVzc2FnZSBGYWN0b3J5Mk1lc3NhZ2UgeworICByZXF1aXJlZCBpbnQzMiBtYW5kYXRvcnkgPSAxOworICBvcHRpb25hbCBGYWN0b3J5MkVudW0gZmFjdG9yeV8yX2VudW0gPSAyOworICBlbnVtIE5lc3RlZEZhY3RvcnkyRW51bSB7CisgICAgTkVTVEVEX0ZBQ1RPUllfMl9WQUxVRV8wID0gMDsKKyAgICBORVNURURfRkFDVE9SWV8yX1ZBTFVFXzEgPSAxOworICB9CisgIG9wdGlvbmFsIE5lc3RlZEZhY3RvcnkyRW51bSBuZXN0ZWRfZmFjdG9yeV8yX2VudW0gPSAzOworICBtZXNzYWdlIE5lc3RlZEZhY3RvcnkyTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMTsKKyAgfQorICBvcHRpb25hbCBOZXN0ZWRGYWN0b3J5Mk1lc3NhZ2UgbmVzdGVkX2ZhY3RvcnlfMl9tZXNzYWdlID0gNDsKKyAgb3B0aW9uYWwgRmFjdG9yeTFNZXNzYWdlIGZhY3RvcnlfMV9tZXNzYWdlID0gNTsKKyAgb3B0aW9uYWwgRmFjdG9yeTFFbnVtIGZhY3RvcnlfMV9lbnVtID0gNjsKKyAgb3B0aW9uYWwgRmFjdG9yeTFNZXNzYWdlLk5lc3RlZEZhY3RvcnkxRW51bSBuZXN0ZWRfZmFjdG9yeV8xX2VudW0gPSA3OworICBvcHRpb25hbCBGYWN0b3J5MU1lc3NhZ2UuTmVzdGVkRmFjdG9yeTFNZXNzYWdlIG5lc3RlZF9mYWN0b3J5XzFfbWVzc2FnZSA9IDg7CisgIG9wdGlvbmFsIEZhY3RvcnkyTWVzc2FnZSBjaXJjdWxhcl9tZXNzYWdlID0gOTsKKyAgb3B0aW9uYWwgc3RyaW5nIHNjYWxhcl92YWx1ZSA9IDEwOworICByZXBlYXRlZCBzdHJpbmcgbGlzdF92YWx1ZSA9IDExOworICByZXBlYXRlZCBncm91cCBHcm91cGVkID0gMTIgeworICAgIG9wdGlvbmFsIHN0cmluZyBwYXJ0XzEgPSAxMzsKKyAgICBvcHRpb25hbCBzdHJpbmcgcGFydF8yID0gMTQ7CisgIH0KKyAgb3B0aW9uYWwgTG9vcE1lc3NhZ2UgbG9vcCA9IDE1OworICBvcHRpb25hbCBpbnQzMiBpbnRfd2l0aF9kZWZhdWx0ID0gMTYgW2RlZmF1bHQgPSAxNzc2XTsKKyAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZV93aXRoX2RlZmF1bHQgPSAxNyBbZGVmYXVsdCA9IDkuOTldOworICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3dpdGhfZGVmYXVsdCA9IDE4IFtkZWZhdWx0ID0gImhlbGxvIHdvcmxkIl07CisgIG9wdGlvbmFsIGJvb2wgYm9vbF93aXRoX2RlZmF1bHQgPSAxOSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgb3B0aW9uYWwgRmFjdG9yeTJFbnVtIGVudW1fd2l0aF9kZWZhdWx0ID0gMjAgW2RlZmF1bHQgPSBGQUNUT1JZXzJfVkFMVUVfMV07Cit9CisKK21lc3NhZ2UgTG9vcE1lc3NhZ2UgeworICBvcHRpb25hbCBGYWN0b3J5Mk1lc3NhZ2UgbG9vcCA9IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZ2VuZXJhdG9yX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZ2VuZXJhdG9yX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODM0M2FiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weQpAQCAtMCwwICsxLDI2OSBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBUT0RPKHJvYmluc29uKTogRmxlc2ggdGhpcyBvdXQgY29uc2lkZXJhYmx5LiAgV2UgZm9jdXNlZCBvbiByZWZsZWN0aW9uX3Rlc3QucHkKKyMgZmlyc3QsIHNpbmNlIGl0J3MgdGVzdGluZyB0aGUgc3VidGxlciBjb2RlLCBhbmQgc2luY2UgaXQgcHJvdmlkZXMgZGVjZW50CisjIGluZGlyZWN0IHRlc3Rpbmcgb2YgdGhlIHByb3RvY29sIGNvbXBpbGVyIG91dHB1dC4KKworIiIiVW5pdHRlc3QgdGhhdCBkaXJlY3RseSB0ZXN0cyB0aGUgb3V0cHV0IG9mIHRoZSBwdXJlLVB5dGhvbiBwcm90b2NvbAorY29tcGlsZXIuICBTZWUgLy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0LnB5IGZvciBhIHRlc3Qgd2hpY2gKK2Z1cnRoZXIgZW5zdXJlcyB0aGF0IHdlIGNhbiB1c2UgUHl0aG9uIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0cyBhcyB3ZSBleHBlY3QuCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF9iYWRfaWRlbnRpZmllcnNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UKKworTUFYX0VYVEVOU0lPTiA9IDUzNjg3MDkxMgorCisKK2NsYXNzIEdlbmVyYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0TmVzdGVkTWVzc2FnZURlc2NyaXB0b3Ioc2VsZik6CisgICAgZmllbGRfbmFtZSA9ICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScKKyAgICBwcm90b190eXBlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHByb3RvX3R5cGUuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLAorICAgICAgICBwcm90b190eXBlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbZmllbGRfbmFtZV0ubWVzc2FnZV90eXBlKQorCisgIGRlZiB0ZXN0RW51bXMoc2VsZik6CisgICAgIyBXZSB0ZXN0IG9ubHkgbW9kdWxlLWxldmVsIGVudW1zIGhlcmUuCisgICAgIyBUT0RPKHJvYmluc29uKTogRXhhbWluZSBkZXNjcmlwdG9ycyBkaXJlY3RseSB0byBjaGVjaworICAgICMgZW51bSBkZXNjcmlwdG9yIG91dHB1dC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5GT08pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8uQkFaKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVopCisKKyAgZGVmIHRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyhzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcygpCisKKyAgICAjIFB5dGhvbiBwcmUtMi42IGRvZXMgbm90IGhhdmUgaXNpbmYoKSBvciBpc25hbigpIGZ1bmN0aW9ucywgc28gd2UgaGF2ZQorICAgICMgdG8gcHJvdmlkZSBvdXIgb3duLgorICAgIGRlZiBpc25hbih2YWwpOgorICAgICAgIyBOYU4gaXMgbmV2ZXIgZXF1YWwgdG8gaXRzZWxmLgorICAgICAgcmV0dXJuIHZhbCAhPSB2YWwKKyAgICBkZWYgaXNpbmYodmFsKToKKyAgICAgICMgSW5maW5pdHkgdGltZXMgemVybyBlcXVhbHMgTmFOLgorICAgICAgcmV0dXJuIG5vdCBpc25hbih2YWwpIGFuZCBpc25hbih2YWwgKiAwKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UuaW5mX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuaW5mX2RvdWJsZSA+IDApCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UubmVnX2luZl9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm5lZ19pbmZfZG91YmxlIDwgMCkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5uYW5fZG91YmxlKSkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihtZXNzYWdlLmluZl9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuaW5mX2Zsb2F0ID4gMCkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYobWVzc2FnZS5uZWdfaW5mX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5uZWdfaW5mX2Zsb2F0IDwgMCkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5uYW5fZmxvYXQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSIsIG1lc3NhZ2UuY3BwX3RyaWdyYXBoKQorCisgIGRlZiB0ZXN0SGFzRGVmYXVsdFZhbHVlcyhzZWxmKToKKyAgICBkZXNjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCisKKyAgICBleHBlY3RlZF9oYXNfZGVmYXVsdF9ieV9uYW1lID0geworICAgICAgICAnb3B0aW9uYWxfaW50MzInOiBGYWxzZSwKKyAgICAgICAgJ3JlcGVhdGVkX2ludDMyJzogRmFsc2UsCisgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSc6IEZhbHNlLAorICAgICAgICAnZGVmYXVsdF9pbnQzMic6IFRydWUsCisgICAgfQorCisgICAgaGFzX2RlZmF1bHRfYnlfbmFtZSA9IGRpY3QoCisgICAgICAgIFsoZi5uYW1lLCBmLmhhc19kZWZhdWx0X3ZhbHVlKQorICAgICAgICAgZm9yIGYgaW4gZGVzYy5maWVsZHMKKyAgICAgICAgIGlmIGYubmFtZSBpbiBleHBlY3RlZF9oYXNfZGVmYXVsdF9ieV9uYW1lXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2hhc19kZWZhdWx0X2J5X25hbWUsIGhhc19kZWZhdWx0X2J5X25hbWUpCisKKyAgZGVmIHRlc3RDb250YWluaW5nVHlwZUJlaGF2aW9yRm9yRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24uY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5jb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMuREVTQ1JJUFRPUikKKworICBkZWYgdGVzdEV4dGVuc2lvblNjb3BlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbi5leHRlbnNpb25fc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUuZXh0ZW5zaW9uX3Njb3BlLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5ERVNDUklQVE9SKQorCisgIGRlZiB0ZXN0SXNFeHRlbnNpb24oc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24uaXNfZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5pc19leHRlbnNpb24pCisKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLkRFU0NSSVBUT1IKKyAgICBub25fZXh0ZW5zaW9uX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ2EnXQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm9uX2V4dGVuc2lvbl9kZXNjcmlwdG9yLmlzX2V4dGVuc2lvbikKKworICBkZWYgdGVzdE9wdGlvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldCgpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQorCisgIGRlZiB0ZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMoKQorICAgIGVudW1fb3B0aW9ucyA9IHByb3RvLkRFU0NSSVBUT1IuZW51bV90eXBlc19ieV9uYW1lWydBbkVudW0nXS5HZXRPcHRpb25zKCkKKyAgICBzZWxmLmFzc2VydFRydWUoZW51bV9vcHRpb25zIGlzIG5vdCBOb25lKQorICAgICMgVE9ETyhncHMpOiBXZSByZWFsbHkgc2hvdWxkIHRlc3QgZm9yIHRoZSBwcmVzZW5zZSBvZiB0aGUgZW51bV9vcHQxCisgICAgIyBleHRlbnNpb24gYW5kIGZvciBpdHMgdmFsdWUgdG8gYmUgc2V0IHRvIC03ODkuCisKKyAgZGVmIHRlc3ROZXN0ZWRUeXBlcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2V0KHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUi5uZXN0ZWRfdHlwZXMpLAorICAgICAgICBzZXQoWworICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IsCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAuREVTQ1JJUFRPUiwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cC5ERVNDUklQVE9SLAorICAgICAgICBdKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlLkRFU0NSSVBUT1IubmVzdGVkX3R5cGVzLCBbXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUi5uZXN0ZWRfdHlwZXMsIFtdKQorCisgIGRlZiB0ZXN0Q29udGFpbmluZ1R5cGUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZS5ERVNDUklQVE9SLmNvbnRhaW5pbmdfdHlwZSBpcyBOb25lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmNvbnRhaW5pbmdfdHlwZSBpcyBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLmNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLmNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cC5ERVNDUklQVE9SLmNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SKQorCisgIGRlZiB0ZXN0Q29udGFpbmluZ1R5cGVJbkVudW1EZXNjcmlwdG9yKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdF9wYjIuX0ZPUkVJR05FTlVNLmNvbnRhaW5pbmdfdHlwZSBpcyBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLl9URVNUQUxMVFlQRVNfTkVTVEVERU5VTS5jb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCisKKyAgZGVmIHRlc3RQYWNrYWdlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUi5maWxlLnBhY2thZ2UsCisgICAgICAgICdwcm90b2J1Zl91bml0dGVzdCcpCisgICAgZGVzYyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SCisgICAgc2VsZi5hc3NlcnRFcXVhbChkZXNjLmZpbGUucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLkltcG9ydE1lc3NhZ2UuREVTQ1JJUFRPUi5maWxlLnBhY2thZ2UsCisgICAgICAgICdwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQnKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLl9GT1JFSUdORU5VTS5maWxlLnBhY2thZ2UsICdwcm90b2J1Zl91bml0dGVzdCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLl9URVNUQUxMVFlQRVNfTkVTVEVERU5VTS5maWxlLnBhY2thZ2UsCisgICAgICAgICdwcm90b2J1Zl91bml0dGVzdCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfaW1wb3J0X3BiMi5fSU1QT1JURU5VTS5maWxlLnBhY2thZ2UsCisgICAgICAgICdwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQnKQorCisgIGRlZiB0ZXN0RXh0ZW5zaW9uUmFuZ2Uoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmV4dGVuc2lvbl9yYW5nZXMsIFtdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucy5ERVNDUklQVE9SLmV4dGVuc2lvbl9yYW5nZXMsCisgICAgICAgIFsoMSwgTUFYX0VYVEVOU0lPTildKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuREVTQ1JJUFRPUi5leHRlbnNpb25fcmFuZ2VzLAorICAgICAgICBbKDQyLCA0MyksICg0MTQzLCA0MjQ0KSwgKDY1NTM2LCBNQVhfRVhURU5TSU9OKV0pCisKKyAgZGVmIHRlc3RGaWxlRGVzY3JpcHRvcihzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnBhY2thZ2UsICdwcm90b2J1Zl91bml0dGVzdCcpCisgICAgc2VsZi5hc3NlcnRGYWxzZSh1bml0dGVzdF9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiIGlzIE5vbmUpCisKKyAgZGVmIHRlc3ROb0dlbmVyaWNTZXJ2aWNlcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgIlRlc3RNZXNzYWdlIikpCisgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIodW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIsICJGT08iKSkKKyAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgInRlc3RfZXh0ZW5zaW9uIikpCisKKyAgICAjIE1ha2Ugc3VyZSB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiBoYXMgbm8gc2VydmljZXMgc3ViY2xhc3NpbmcKKyAgICAjIFByb3RvMiBTZXJ2aWNlIGNsYXNzLgorICAgIGlmIGhhc2F0dHIodW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIsICJUZXN0U2VydmljZSIpOgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLlRlc3RTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuU2VydmljZSkpCisKKyAgZGVmIHRlc3RNZXNzYWdlVHlwZXNCeU5hbWUoc2VsZik6CisgICAgZmlsZV90eXBlID0gdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFUywKKyAgICAgICAgZmlsZV90eXBlLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVt1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFUy5uYW1lXSkKKworICAgICMgTmVzdGVkIG1lc3NhZ2VzIHNob3VsZG4ndCBiZSBpbmNsdWRlZCBpbiB0aGUgbWVzc2FnZV90eXBlc19ieV9uYW1lCisgICAgIyBkaWN0aW9uYXJ5IChsaWtlIGluIHRoZSBDKysgQVBJKS4KKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICB1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFU19ORVNURURNRVNTQUdFLm5hbWUgaW4KKyAgICAgICAgZmlsZV90eXBlLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKKworICBkZWYgdGVzdFB1YmxpY0ltcG9ydHMoc2VsZik6CisgICAgIyBUZXN0IHB1YmxpYyBpbXBvcnRzIGFzIGVtYmVkZGVkIG1lc3NhZ2UuCisgICAgYWxsX3R5cGVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGFsbF90eXBlX3Byb3RvLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZS5lKQorCisgICAgIyBQdWJsaWNJbXBvcnRNZXNzYWdlIGlzIGFjdHVhbGx5IGRlZmluZWQgaW4gdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wYjIKKyAgICAjIG1vZHVsZSwgYW5kIGlzIHB1YmxpYyBpbXBvcnRlZCBieSB1bml0dGVzdF9pbXBvcnRfcGIyIG1vZHVsZS4KKyAgICBwdWJsaWNfaW1wb3J0X3Byb3RvID0gdW5pdHRlc3RfaW1wb3J0X3BiMi5QdWJsaWNJbXBvcnRNZXNzYWdlKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHB1YmxpY19pbXBvcnRfcHJvdG8uZSkKKyAgICBzZWxmLmFzc2VydFRydWUodW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wYjIuUHVibGljSW1wb3J0TWVzc2FnZSBpcworICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLlB1YmxpY0ltcG9ydE1lc3NhZ2UpCisKKyAgZGVmIHRlc3RCYWRJZGVudGlmaWVycyhzZWxmKToKKyAgICAjIFdlJ3JlIGp1c3QgdGVzdGluZyB0aGF0IHRoZSBjb2RlIHdhcyBpbXBvcnRlZCB3aXRob3V0IHByb2JsZW1zLgorICAgIG1lc3NhZ2UgPSB0ZXN0X2JhZF9pZGVudGlmaWVyc19wYjIuVGVzdEJhZElkZW50aWZpZXJzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuRXh0ZW5zaW9uc1t0ZXN0X2JhZF9pZGVudGlmaWVyc19wYjIubWVzc2FnZV0sCisgICAgICAgICAgICAgICAgICAgICAiZm9vIikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuRXh0ZW5zaW9uc1t0ZXN0X2JhZF9pZGVudGlmaWVyc19wYjIuZGVzY3JpcHRvcl0sCisgICAgICAgICAgICAgICAgICAgICAiYmFyIikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuRXh0ZW5zaW9uc1t0ZXN0X2JhZF9pZGVudGlmaWVyc19wYjIucmVmbGVjdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAiYmF6IikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuRXh0ZW5zaW9uc1t0ZXN0X2JhZF9pZGVudGlmaWVyc19wYjIuc2VydmljZV0sCisgICAgICAgICAgICAgICAgICAgICAicXV4IikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9jcHBfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2NwcF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODRiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9jcHBfdGVzdC5weQpAQCAtMCwwICsxLDQ1IEBACisjISAvdXNyL2Jpbi9weXRob24KKyMKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyBmb3IgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLm1lc3NhZ2VfY3BwLiIiIgorCitfX2F1dGhvcl9fID0gJ3NoYWhtc0Bnb29nbGUuY29tIChTaGFobXMgS2luZyknCisKK2ltcG9ydCBvcworb3MuZW52aXJvblsnUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT04nXSA9ICdjcHAnCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwubWVzc2FnZV90ZXN0IGltcG9ydCAqCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9mYWN0b3J5X3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9mYWN0b3J5X3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjOWJlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2ZhY3RvcnlfdGVzdC5weQpAQCAtMCwwICsxLDExMyBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgZm9yIGdvb2dsZS5wcm90b2J1Zi5tZXNzYWdlX2ZhY3RvcnkuIiIiCisKK19fYXV0aG9yX18gPSAnbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKScKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBmYWN0b3J5X3Rlc3QxX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGZhY3RvcnlfdGVzdDJfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9kYXRhYmFzZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2VfZmFjdG9yeQorCisKK2NsYXNzIE1lc3NhZ2VGYWN0b3J5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYuZmFjdG9yeV90ZXN0MV9mZCA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgZmFjdG9yeV90ZXN0MV9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQorICAgIHNlbGYuZmFjdG9yeV90ZXN0Ml9mZCA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgZmFjdG9yeV90ZXN0Ml9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQorCisgIGRlZiBfRXhlcmNpc2VEeW5hbWljQ2xhc3Moc2VsZiwgY2xzKToKKyAgICBtc2cgPSBjbHMoKQorICAgIG1zZy5tYW5kYXRvcnkgPSA0MgorICAgIG1zZy5uZXN0ZWRfZmFjdG9yeV8yX2VudW0gPSAwCisgICAgbXNnLm5lc3RlZF9mYWN0b3J5XzJfbWVzc2FnZS52YWx1ZSA9ICduZXN0ZWQgbWVzc2FnZSB2YWx1ZScKKyAgICBtc2cuZmFjdG9yeV8xX21lc3NhZ2UuZmFjdG9yeV8xX2VudW0gPSAxCisgICAgbXNnLmZhY3RvcnlfMV9tZXNzYWdlLm5lc3RlZF9mYWN0b3J5XzFfZW51bSA9IDAKKyAgICBtc2cuZmFjdG9yeV8xX21lc3NhZ2UubmVzdGVkX2ZhY3RvcnlfMV9tZXNzYWdlLnZhbHVlID0gKAorICAgICAgICAnbmVzdGVkIG1lc3NhZ2UgdmFsdWUnKQorICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5zY2FsYXJfdmFsdWUgPSAyMgorICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5saXN0X3ZhbHVlLmV4dGVuZChbJ29uZScsICd0d28nLCAndGhyZWUnXSkKKyAgICBtc2cuZmFjdG9yeV8xX21lc3NhZ2UubGlzdF92YWx1ZS5hcHBlbmQoJ2ZvdXInKQorICAgIG1zZy5mYWN0b3J5XzFfZW51bSA9IDEKKyAgICBtc2cubmVzdGVkX2ZhY3RvcnlfMV9lbnVtID0gMAorICAgIG1zZy5uZXN0ZWRfZmFjdG9yeV8xX21lc3NhZ2UudmFsdWUgPSAnbmVzdGVkIG1lc3NhZ2UgdmFsdWUnCisgICAgbXNnLmNpcmN1bGFyX21lc3NhZ2UubWFuZGF0b3J5ID0gMQorICAgIG1zZy5jaXJjdWxhcl9tZXNzYWdlLmNpcmN1bGFyX21lc3NhZ2UubWFuZGF0b3J5ID0gMgorICAgIG1zZy5jaXJjdWxhcl9tZXNzYWdlLnNjYWxhcl92YWx1ZSA9ICdvbmUgZGVlcCcKKyAgICBtc2cuc2NhbGFyX3ZhbHVlID0gJ3plcm8gZGVlcCcKKyAgICBtc2cubGlzdF92YWx1ZS5leHRlbmQoWydmb3VyJywgJ3RocmVlJywgJ3R3byddKQorICAgIG1zZy5saXN0X3ZhbHVlLmFwcGVuZCgnb25lJykKKyAgICBtc2cuZ3JvdXBlZC5hZGQoKQorICAgIG1zZy5ncm91cGVkWzBdLnBhcnRfMSA9ICdoZWxsbycKKyAgICBtc2cuZ3JvdXBlZFswXS5wYXJ0XzIgPSAnd29ybGQnCisgICAgbXNnLmdyb3VwZWQuYWRkKHBhcnRfMT0ndGVzdGluZycsIHBhcnRfMj0nMTIzJykKKyAgICBtc2cubG9vcC5sb29wLm1hbmRhdG9yeSA9IDIKKyAgICBtc2cubG9vcC5sb29wLmxvb3AubG9vcC5tYW5kYXRvcnkgPSA0CisgICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgY29udmVydGVkID0gZmFjdG9yeV90ZXN0Ml9wYjIuRmFjdG9yeTJNZXNzYWdlLkZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICByZXNlcmlhbGl6ZWQgPSBjb252ZXJ0ZWQuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlcmlhbGl6ZWQsIHJlc2VyaWFsaXplZCkKKyAgICByZXN1bHQgPSBjbHMuRnJvbVN0cmluZyhyZXNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobXNnLCByZXN1bHQpCisKKyAgZGVmIHRlc3RHZXRQcm90b3R5cGUoc2VsZik6CisgICAgZGIgPSBkZXNjcmlwdG9yX2RhdGFiYXNlLkRlc2NyaXB0b3JEYXRhYmFzZSgpCisgICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbChkYikKKyAgICBkYi5BZGQoc2VsZi5mYWN0b3J5X3Rlc3QxX2ZkKQorICAgIGRiLkFkZChzZWxmLmZhY3RvcnlfdGVzdDJfZmQpCisgICAgZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeS5NZXNzYWdlRmFjdG9yeSgpCisgICAgY2xzID0gZmFjdG9yeS5HZXRQcm90b3R5cGUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydElzTm90KGNscywgZmFjdG9yeV90ZXN0Ml9wYjIuRmFjdG9yeTJNZXNzYWdlKQorICAgIHNlbGYuX0V4ZXJjaXNlRHluYW1pY0NsYXNzKGNscykKKyAgICBjbHMyID0gZmFjdG9yeS5HZXRQcm90b3R5cGUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydElzKGNscywgY2xzMikKKworICBkZWYgdGVzdEdldE1lc3NhZ2VzKHNlbGYpOgorICAgIG1lc3NhZ2VzID0gbWVzc2FnZV9mYWN0b3J5LkdldE1lc3NhZ2VzKFtzZWxmLmZhY3RvcnlfdGVzdDJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFjdG9yeV90ZXN0MV9mZF0pCisgICAgc2VsZi5hc3NlcnRDb250YWluc1N1YnNldCgKKyAgICAgICAgWyduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnLAorICAgICAgICAgJ25ldC5wcm90bzIucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZSddLAorICAgICAgICBtZXNzYWdlcy5rZXlzKCkpCisgICAgc2VsZi5fRXhlcmNpc2VEeW5hbWljQ2xhc3MoCisgICAgICAgIG1lc3NhZ2VzWyduZXQucHJvdG8yLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnXSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2xpc3RlbmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwODAyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weQpAQCAtMCwwICsxLDc4IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiRGVmaW5lcyBhIGxpc3RlbmVyIGludGVyZmFjZSBmb3Igb2JzZXJ2aW5nIGNlcnRhaW4KK3N0YXRlIHRyYW5zaXRpb25zIG9uIE1lc3NhZ2Ugb2JqZWN0cy4KKworQWxzbyBkZWZpbmVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCisKK2NsYXNzIE1lc3NhZ2VMaXN0ZW5lcihvYmplY3QpOgorCisgICIiIkxpc3RlbnMgZm9yIG1vZGlmaWNhdGlvbnMgbWFkZSB0byBhIG1lc3NhZ2UuICBNZWFudCB0byBiZSByZWdpc3RlcmVkIHZpYQorICBNZXNzYWdlLl9TZXRMaXN0ZW5lcigpLgorCisgIEF0dHJpYnV0ZXM6CisgICAgZGlydHk6ICBJZiBUcnVlLCB0aGVuIGNhbGxpbmcgTW9kaWZpZWQoKSB3b3VsZCBiZSBhIG5vLW9wLiAgVGhpcyBjYW4gYmUKKyAgICAgICAgICAgIHVzZWQgdG8gYXZvaWQgdGhlc2UgY2FsbHMgZW50aXJlbHkgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAiIiIKKworICBkZWYgTW9kaWZpZWQoc2VsZik6CisgICAgIiIiQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBwYXJlbnQKKyAgICBtZXNzYWdlIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQuICBUaGlzIGN1cnJlbnRseSBtZWFucyBlaXRoZXI6CisgICAgKGEpIFRoZSBtZXNzYWdlIHdhcyBtb2RpZmllZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHNvIHRoZSBwYXJlbnQgbWVzc2FnZQorICAgICAgICBzaG91bGQgaGVuY2Vmb3J0aCBtYXJrIHRoZSBtZXNzYWdlIGFzIHByZXNlbnQuCisgICAgKGIpIFRoZSBtZXNzYWdlJ3MgY2FjaGVkIGJ5dGUgc2l6ZSBiZWNhbWUgZGlydHkgLS0gaS5lLiB0aGUgbWVzc2FnZSB3YXMKKyAgICAgICAgbW9kaWZpZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFmdGVyIGEgcHJldmlvdXMgY2FsbCB0byBCeXRlU2l6ZSgpLgorICAgICAgICBUaGVyZWZvcmUgdGhlIHBhcmVudCBzaG91bGQgYWxzbyBtYXJrIGl0cyBieXRlIHNpemUgYXMgZGlydHkuCisgICAgTm90ZSB0aGF0IChhKSBpbXBsaWVzIChiKSwgc2luY2UgbmV3IG9iamVjdHMgc3RhcnQgb3V0IHdpdGggYSBjbGllbnQgY2FjaGVkCisgICAgc2l6ZSAoemVybykuICBIb3dldmVyLCB3ZSBkb2N1bWVudCAoYSkgZXhwbGljaXRseSBiZWNhdXNlIGl0IGlzIGltcG9ydGFudC4KKworICAgIE1vZGlmaWVkKCkgd2lsbCAqb25seSogYmUgY2FsbGVkIGluIHJlc3BvbnNlIHRvIG9uZSBvZiB0aGVzZSB0d28gZXZlbnRzIC0tCisgICAgbm90IGV2ZXJ5IHRpbWUgdGhlIHN1Yi1tZXNzYWdlIGlzIG1vZGlmaWVkLgorCisgICAgTm90ZSB0aGF0IGlmIHRoZSBsaXN0ZW5lcidzIHxkaXJ0eXwgYXR0cmlidXRlIGlzIHRydWUsIHRoZW4gY2FsbGluZworICAgIE1vZGlmaWVkIGF0IHRoZSBtb21lbnQgd291bGQgYmUgYSBuby1vcCwgc28gaXQgY2FuIGJlIHNraXBwZWQuICBQZXJmb3JtYW5jZS0KKyAgICBzZW5zaXRpdmUgY2FsbGVycyBzaG91bGQgY2hlY2sgdGhpcyBhdHRyaWJ1dGUgZGlyZWN0bHkgYmVmb3JlIGNhbGxpbmcgc2luY2UKKyAgICBpdCB3aWxsIGJlIHRydWUgbW9zdCBvZiB0aGUgdGltZS4KKyAgICAiIiIKKworICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBOdWxsTWVzc2FnZUxpc3RlbmVyKG9iamVjdCk6CisKKyAgIiIiTm8tb3AgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLiIiIgorCisgIGRlZiBNb2RpZmllZChzZWxmKToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41M2U5ZDUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weQpAQCAtMCwwICsxLDQ5NCBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgcHl0aG9uIHByb3RvY29sIGJ1ZmZlcnMgYWdhaW5zdCB0aGUgZ29sZGVuIG1lc3NhZ2UuCisKK05vdGUgdGhhdCB0aGUgZ29sZGVuIG1lc3NhZ2VzIGV4ZXJjaXNlIGV2ZXJ5IGtub3duIGZpZWxkIHR5cGUsIHRodXMgdGhpcwordGVzdCBlbmRzIHVwIGV4ZXJjaXNpbmcgYW5kIHZlcmlmeWluZyBuZWFybHkgYWxsIG9mIHRoZSBwYXJzaW5nIGFuZAorc2VyaWFsaXphdGlvbiBjb2RlIGluIHRoZSB3aG9sZSBsaWJyYXJ5LgorCitUT0RPKGtlbnRvbik6ICBNZXJnZSB3aXRoIHdpcmVfZm9ybWF0X3Rlc3Q/ICBJdCBkb2Vzbid0IG1ha2UgYSB3aG9sZSBsb3Qgb2YKK3NlbnNlIHRvIGNhbGwgdGhpcyBhIHRlc3Qgb2YgdGhlICJtZXNzYWdlIiBtb2R1bGUsIHdoaWNoIG9ubHkgZGVjbGFyZXMgYW4KK2Fic3RyYWN0IGludGVyZmFjZS4KKyIiIgorCitfX2F1dGhvcl9fID0gJ2dwc0Bnb29nbGUuY29tIChHcmVnb3J5IFAuIFNtaXRoKScKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBwaWNrbGUKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKKworIyBQeXRob24gcHJlLTIuNiBkb2VzIG5vdCBoYXZlIGlzaW5mKCkgb3IgaXNuYW4oKSBmdW5jdGlvbnMsIHNvIHdlIGhhdmUKKyMgdG8gcHJvdmlkZSBvdXIgb3duLgorZGVmIGlzbmFuKHZhbCk6CisgICMgTmFOIGlzIG5ldmVyIGVxdWFsIHRvIGl0c2VsZi4KKyAgcmV0dXJuIHZhbCAhPSB2YWwKK2RlZiBpc2luZih2YWwpOgorICAjIEluZmluaXR5IHRpbWVzIHplcm8gZXF1YWxzIE5hTi4KKyAgcmV0dXJuIG5vdCBpc25hbih2YWwpIGFuZCBpc25hbih2YWwgKiAwKQorZGVmIElzUG9zSW5mKHZhbCk6CisgIHJldHVybiBpc2luZih2YWwpIGFuZCAodmFsID4gMCkKK2RlZiBJc05lZ0luZih2YWwpOgorICByZXR1cm4gaXNpbmYodmFsKSBhbmQgKHZhbCA8IDApCisKK2NsYXNzIE1lc3NhZ2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdEdvbGRlbk1lc3NhZ2Uoc2VsZik6CisgICAgZ29sZGVuX2RhdGEgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZSgnZ29sZGVuX21lc3NhZ2UnKS5yZWFkKCkKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICB0ZXN0X3V0aWwuRXhwZWN0QWxsRmllbGRzU2V0KHNlbGYsIGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgZ29sZGVuX2NvcHkgPSBjb3B5LmRlZXBjb3B5KGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RHb2xkZW5FeHRlbnNpb25zKHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9tZXNzYWdlJykucmVhZCgpCisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBhbGxfc2V0ID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhhbGxfc2V0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFsbF9zZXQsIGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgZ29sZGVuX2NvcHkgPSBjb3B5LmRlZXBjb3B5KGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RHb2xkZW5QYWNrZWRNZXNzYWdlKHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UnKS5yZWFkKCkKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBhbGxfc2V0ID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhhbGxfc2V0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFsbF9zZXQsIGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGFsbF9zZXQuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBnb2xkZW5fY29weSA9IGNvcHkuZGVlcGNvcHkoZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGF0YSwgZ29sZGVuX2NvcHkuU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICBkZWYgdGVzdEdvbGRlblBhY2tlZEV4dGVuc2lvbnMoc2VsZik6CisgICAgZ29sZGVuX2RhdGEgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZSgnZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZScpLnJlYWQoKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRFeHRlbnNpb25zKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgYWxsX3NldCA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEV4dGVuc2lvbnMoYWxsX3NldCkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhhbGxfc2V0LCBnb2xkZW5fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBhbGxfc2V0LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgZ29sZGVuX2NvcHkgPSBjb3B5LmRlZXBjb3B5KGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RQaWNrbGVTdXBwb3J0KHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9tZXNzYWdlJykucmVhZCgpCisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgcGlja2xlZF9tZXNzYWdlID0gcGlja2xlLmR1bXBzKGdvbGRlbl9tZXNzYWdlKQorCisgICAgdW5waWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUubG9hZHMocGlja2xlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVucGlja2xlZF9tZXNzYWdlLCBnb2xkZW5fbWVzc2FnZSkKKworICBkZWYgdGVzdFBpY2tsZUluY29tcGxldGVQcm90byhzZWxmKToKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xKQorICAgIHBpY2tsZWRfbWVzc2FnZSA9IHBpY2tsZS5kdW1wcyhnb2xkZW5fbWVzc2FnZSkKKworICAgIHVucGlja2xlZF9tZXNzYWdlID0gcGlja2xlLmxvYWRzKHBpY2tsZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyh1bnBpY2tsZWRfbWVzc2FnZSwgZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbHModW5waWNrbGVkX21lc3NhZ2UuYSwgMSkKKyAgICAjIFRoaXMgaXMgc3RpbGwgYW4gaW5jb21wbGV0ZSBwcm90byAtIHNvIHNlcmlhbGl6aW5nIHNob3VsZCBmYWlsCisgICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgdW5waWNrbGVkX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcpCisKKyAgZGVmIHRlc3RQb3NpdGl2ZUluZmluaXR5KHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gKCdceDVEXHgwMFx4MDBceDgwXHg3RicKKyAgICAgICAgICAgICAgICAgICAnXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJworICAgICAgICAgICAgICAgICAgICdceENEXHgwMlx4MDBceDAwXHg4MFx4N0YnCisgICAgICAgICAgICAgICAgICAgJ1x4RDFceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4N0YnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUoSXNQb3NJbmYoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorCisgIGRlZiB0ZXN0TmVnYXRpdmVJbmZpbml0eShzZWxmKToKKyAgICBnb2xkZW5fZGF0YSA9ICgnXHg1RFx4MDBceDAwXHg4MFx4RkYnCisgICAgICAgICAgICAgICAgICAgJ1x4NjFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHhGRicKKyAgICAgICAgICAgICAgICAgICAnXHhDRFx4MDJceDAwXHgwMFx4ODBceEZGJworICAgICAgICAgICAgICAgICAgICdceEQxXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceEZGJykKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBzZWxmLmFzc2VydFRydWUoSXNOZWdJbmYoZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzTmVnSW5mKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGF0YSwgZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICBkZWYgdGVzdE5vdEFOdW1iZXIoc2VsZik6CisgICAgZ29sZGVuX2RhdGEgPSAoJ1x4NURceDAwXHgwMFx4QzBceDdGJworICAgICAgICAgICAgICAgICAgICdceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGOFx4N0YnCisgICAgICAgICAgICAgICAgICAgJ1x4Q0RceDAyXHgwMFx4MDBceEMwXHg3RicKKyAgICAgICAgICAgICAgICAgICAnXHhEMVx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicpCisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pKQorCisgICAgIyBUaGUgcHJvdG9jb2wgYnVmZmVyIG1heSBzZXJpYWxpemUgdG8gYW55IG9uZSBvZiBtdWx0aXBsZSBkaWZmZXJlbnQKKyAgICAjIHJlcHJlc2VudGF0aW9ucyBvZiBhIE5hTi4gIFJhdGhlciB0aGFuIHZlcmlmeSBhIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uLAorICAgICMgdmVyaWZ5IHRoZSBzZXJpYWxpemVkIHN0cmluZyBjYW4gYmUgY29udmVydGVkIGludG8gYSBjb3JyZWN0bHkKKyAgICAjIGJlaGF2aW5nIHByb3RvY29sIGJ1ZmZlci4KKyAgICBzZXJpYWxpemVkID0gZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5vcHRpb25hbF9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pKQorCisgIGRlZiB0ZXN0UG9zaXRpdmVJbmZpbml0eVBhY2tlZChzZWxmKToKKyAgICBnb2xkZW5fZGF0YSA9ICgnXHhBMlx4MDZceDA0XHgwMFx4MDBceDgwXHg3RicKKyAgICAgICAgICAgICAgICAgICAnXHhBQVx4MDZceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4N0YnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorCisgIGRlZiB0ZXN0TmVnYXRpdmVJbmZpbml0eVBhY2tlZChzZWxmKToKKyAgICBnb2xkZW5fZGF0YSA9ICgnXHhBMlx4MDZceDA0XHgwMFx4MDBceDgwXHhGRicKKyAgICAgICAgICAgICAgICAgICAnXHhBQVx4MDZceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorCisgIGRlZiB0ZXN0Tm90QU51bWJlclBhY2tlZChzZWxmKToKKyAgICBnb2xkZW5fZGF0YSA9ICgnXHhBMlx4MDZceDA0XHgwMFx4MDBceEMwXHg3RicKKyAgICAgICAgICAgICAgICAgICAnXHhBQVx4MDZceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGOFx4N0YnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKKworICAgIHNlcmlhbGl6ZWQgPSBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKG1lc3NhZ2UucGFja2VkX2Zsb2F0WzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKKworICBkZWYgdGVzdEV4dHJlbWVGbG9hdFZhbHVlcyhzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICAjIE1vc3QgcG9zaXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgorICAgIGtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAxMjcpCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IGtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0ga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cykKKworICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgb25lIHNpZ25pZmljYW5kIGJpdCBzZXQuCisgICAga01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdCA9IDEuNSAqIG1hdGgucG93KDIsIDEyNykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0ga01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdAorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0KQorCisgICAgIyBSZXBlYXQgbGFzdCB0d28gY2FzZXMgd2l0aCB2YWx1ZXMgb2Ygc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMpCisKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgorICAgIGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAtMTI3KQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCisKKyAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgorICAgIGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAtMTI3KQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0CisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiB0aGUgc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCisKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgZGVmIHRlc3RFeHRyZW1lRG91YmxlVmFsdWVzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgbm8gc2lnbmlmaWNhbmQgYml0cyBzZXQuCisgICAga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cyA9IG1hdGgucG93KDIsIDEwMjMpCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgIyBNb3N0IHBvc2l0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KKyAgICBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgMTAyMykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiBzYW1lIG1hZ25pdHVkZSwgYnV0IG5lZ2F0aXZlLgorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSAta01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdAorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPT0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgorICAgIGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAtMTAyMykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCisKKyAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgorICAgIGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAtMTAyMykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiB0aGUgc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSAta01vc3ROZWdFeHBvbmVudE5vU2lnQml0cykKKworICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQorCisgIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkU2NhbGFyRmllbGRzRGVmYXVsdENvbXBhcmF0b3Ioc2VsZik6CisgICAgIiIiQ2hlY2sgc29tZSBkaWZmZXJlbnQgdHlwZXMgd2l0aCB0aGUgZGVmYXVsdCBjb21wYXJhdG9yLiIiIgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgICMgVE9ETyhtYXR0cCk6IHdvdWxkIHRlc3RpbmcgbW9yZSBzY2FsYXIgdHlwZXMgc3RyZW5ndGhlbiB0ZXN0PworICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzBdLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlsxXSwgMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMl0sIDMpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4zKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LnNvcnQoKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSwgMS4xKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsxXSwgMS4yKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsyXSwgMS4zKQorCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdhJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2MnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSwgJ2EnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMV0sICdiJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzJdLCAnYycpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLmFwcGVuZCgnYScpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoJ2MnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKCdiJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLnNvcnQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1swXSwgJ2EnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1sxXSwgJ2InKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1syXSwgJ2MnKQorCisgIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkU2NhbGFyRmllbGRzQ3VzdG9tQ29tcGFyYXRvcihzZWxmKToKKyAgICAiIiJDaGVjayBzb21lIGRpZmZlcmVudCB0eXBlcyB3aXRoIGN1c3RvbSBjb21wYXJhdG9yLiIiIgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0zKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0yKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0xKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChsYW1iZGEgeCx5OiBjbXAoYWJzKHgpLCBhYnMoeSkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlswXSwgLTEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzFdLCAtMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMl0sIC0zKQorCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdhYWEnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYmInKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYycpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydChsYW1iZGEgeCx5OiBjbXAobGVuKHgpLCBsZW4oeSkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0sICdjJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdLCAnYmInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMl0sICdhYWEnKQorCisgIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkQ29tcG9zaXRlRmllbGRzQ3VzdG9tQ29tcGFyYXRvcihzZWxmKToKKyAgICAiIiJDaGVjayBwYXNzaW5nIGEgY3VzdG9tIGNvbXBhcmF0b3IgdG8gc29ydCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4iIiIKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzCisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA1CisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDQKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQobGFtYmRhIHgseTogY21wKHguYmIsIHkuYmIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIsIDIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdLmJiLCAzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVszXS5iYiwgNCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbNF0uYmIsIDUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzVdLmJiLCA2KQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVGaWVsZFNvcnRBcmd1bWVudHMoc2VsZik6CisgICAgIiIiQ2hlY2sgc29ydGluZyBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZCB1c2luZyBsaXN0LnNvcnQoKSBhcmd1bWVudHMuIiIiCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgZ2V0X2JiID0gb3BlcmF0b3IuYXR0cmdldHRlcignYmInKQorICAgIGNtcF9iYiA9IGxhbWJkYSBhLCBiOiBjbXAoYS5iYiwgYi5iYikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzCisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA1CisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDQKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQoa2V5PWdldF9iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKFtrLmJiIGZvciBrIGluIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VdLAorICAgICAgICAgICAgICAgICAgICAgWzEsIDIsIDMsIDQsIDUsIDZdKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uuc29ydChrZXk9Z2V0X2JiLCByZXZlcnNlPVRydWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbay5iYiBmb3IgayBpbiBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSwKKyAgICAgICAgICAgICAgICAgICAgIFs2LCA1LCA0LCAzLCAyLCAxXSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQoc29ydF9mdW5jdGlvbj1jbXBfYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbay5iYiBmb3IgayBpbiBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSwKKyAgICAgICAgICAgICAgICAgICAgIFsxLCAyLCAzLCA0LCA1LCA2XSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQoY21wPWNtcF9iYiwgcmV2ZXJzZT1UcnVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2suYmIgZm9yIGsgaW4gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV0sCisgICAgICAgICAgICAgICAgICAgICBbNiwgNSwgNCwgMywgMiwgMV0pCisKKyAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhckZpZWxkU29ydEFyZ3VtZW50cyhzZWxmKToKKyAgICAiIiJDaGVjayBzb3J0aW5nIGEgc2NhbGFyIGZpZWxkIHVzaW5nIGxpc3Quc29ydCgpIGFyZ3VtZW50cy4iIiIKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBhYnNfY21wID0gbGFtYmRhIGEsIGI6IGNtcChhYnMoYSksIGFicyhiKSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgtMykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgtMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgtMSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLnNvcnQoa2V5PWFicykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVzc2FnZS5yZXBlYXRlZF9pbnQzMiksIFstMSwgLTIsIC0zXSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLnNvcnQoa2V5PWFicywgcmV2ZXJzZT1UcnVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZXNzYWdlLnJlcGVhdGVkX2ludDMyKSwgWy0zLCAtMiwgLTFdKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChzb3J0X2Z1bmN0aW9uPWFic19jbXApCisgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIpLCBbLTEsIC0yLCAtM10pCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5zb3J0KGNtcD1hYnNfY21wLCByZXZlcnNlPVRydWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIpLCBbLTMsIC0yLCAtMV0pCisKKyAgICBsZW5fY21wID0gbGFtYmRhIGEsIGI6IGNtcChsZW4oYSksIGxlbihiKSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2FhYScpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdjJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5zb3J0KGtleT1sZW4pCisgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSwgWydjJywgJ2JiJywgJ2FhYSddKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLnNvcnQoa2V5PWxlbiwgcmV2ZXJzZT1UcnVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyksIFsnYWFhJywgJ2JiJywgJ2MnXSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5zb3J0KHNvcnRfZnVuY3Rpb249bGVuX2NtcCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcpLCBbJ2MnLCAnYmInLCAnYWFhJ10pCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydChjbXA9bGVuX2NtcCwgcmV2ZXJzZT1UcnVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyksIFsnYWFhJywgJ2JiJywgJ2MnXSkKKworICBkZWYgdGVzdFBhcnNpbmdNZXJnZShzZWxmKToKKyAgICAiIiJDaGVjayB0aGUgbWVyZ2UgYmVoYXZpb3Igd2hlbiBhIHJlcXVpcmVkIG9yIG9wdGlvbmFsIGZpZWxkIGFwcGVhcnMKKyAgICBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgaW5wdXQuIiIiCisgICAgbWVzc2FnZXMgPSBbCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpLAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkgXQorICAgIG1lc3NhZ2VzWzBdLm9wdGlvbmFsX2ludDMyID0gMQorICAgIG1lc3NhZ2VzWzFdLm9wdGlvbmFsX2ludDY0ID0gMgorICAgIG1lc3NhZ2VzWzJdLm9wdGlvbmFsX2ludDMyID0gMworICAgIG1lc3NhZ2VzWzJdLm9wdGlvbmFsX3N0cmluZyA9ICdoZWxsbycKKworICAgIG1lcmdlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVyZ2VkX21lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSAzCisgICAgbWVyZ2VkX21lc3NhZ2Uub3B0aW9uYWxfaW50NjQgPSAyCisgICAgbWVyZ2VkX21lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nID0gJ2hlbGxvJworCisgICAgZ2VuZXJhdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IoKQorICAgIGdlbmVyYXRvci5maWVsZDEuZXh0ZW5kKG1lc3NhZ2VzKQorICAgIGdlbmVyYXRvci5maWVsZDIuZXh0ZW5kKG1lc3NhZ2VzKQorICAgIGdlbmVyYXRvci5maWVsZDMuZXh0ZW5kKG1lc3NhZ2VzKQorICAgIGdlbmVyYXRvci5leHQxLmV4dGVuZChtZXNzYWdlcykKKyAgICBnZW5lcmF0b3IuZXh0Mi5leHRlbmQobWVzc2FnZXMpCisgICAgZ2VuZXJhdG9yLmdyb3VwMS5hZGQoKS5maWVsZDEuTWVyZ2VGcm9tKG1lc3NhZ2VzWzBdKQorICAgIGdlbmVyYXRvci5ncm91cDEuYWRkKCkuZmllbGQxLk1lcmdlRnJvbShtZXNzYWdlc1sxXSkKKyAgICBnZW5lcmF0b3IuZ3JvdXAxLmFkZCgpLmZpZWxkMS5NZXJnZUZyb20obWVzc2FnZXNbMl0pCisgICAgZ2VuZXJhdG9yLmdyb3VwMi5hZGQoKS5maWVsZDEuTWVyZ2VGcm9tKG1lc3NhZ2VzWzBdKQorICAgIGdlbmVyYXRvci5ncm91cDIuYWRkKCkuZmllbGQxLk1lcmdlRnJvbShtZXNzYWdlc1sxXSkKKyAgICBnZW5lcmF0b3IuZ3JvdXAyLmFkZCgpLmZpZWxkMS5NZXJnZUZyb20obWVzc2FnZXNbMl0pCisKKyAgICBkYXRhID0gZ2VuZXJhdG9yLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBwYXJzaW5nX21lcmdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYXJzaW5nTWVyZ2UoKQorICAgIHBhcnNpbmdfbWVyZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpCisKKyAgICAjIFJlcXVpcmVkIGFuZCBvcHRpb25hbCBmaWVsZHMgc2hvdWxkIGJlIG1lcmdlZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNpbmdfbWVyZ2UucmVxdWlyZWRfYWxsX3R5cGVzLCBtZXJnZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxfYWxsX3R5cGVzLCBtZXJnZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxncm91cC5vcHRpb25hbF9ncm91cF9hbGxfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICBtZXJnZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNpbmdfbWVyZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0UGFyc2luZ01lcmdlLm9wdGlvbmFsX2V4dF0sCisgICAgICAgICAgICAgICAgICAgICBtZXJnZWRfbWVzc2FnZSkKKworICAgICMgUmVwZWF0ZWQgZmllbGRzIHNob3VsZCBub3QgYmUgbWVyZ2VkLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRfYWxsX3R5cGVzKSwgMykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwYXJzaW5nX21lcmdlLnJlcGVhdGVkZ3JvdXApLCAzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBhcnNpbmdfbWVyZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RQYXJzaW5nTWVyZ2UucmVwZWF0ZWRfZXh0XSksIDMpCisKKworICBkZWYgdGVzdFNvcnRFbXB0eVJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKHNlbGYpOgorICAgICIiIkV4ZXJjaXNlIGEgc2NlbmFyaW8gdGhhdCBoYXMgbGVkIHRvIHNlZ2ZhdWx0cyBpbiB0aGUgcGFzdC4KKyAgICAiIiIKKyAgICBtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5zb3J0KCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX2V4dGVuc2lvbnMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDk3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvCkBAIC0wLDAgKzEsNTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKKworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbDsKKworCittZXNzYWdlIFRvcExldmVsTWVzc2FnZSB7CisgIG9wdGlvbmFsIEV4dGVuZGVkTWVzc2FnZSBzdWJtZXNzYWdlID0gMTsKK30KKworCittZXNzYWdlIEV4dGVuZGVkTWVzc2FnZSB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKKworbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGZvcmVpZ25fbWVzc2FnZV9pbnQgPSAxOworfQorCisKK2V4dGVuZCBFeHRlbmRlZE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnRfZXh0ZW5zaW9uID0gMTsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2Ugb3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24gPSAyOworCisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludF9leHRlbnNpb24gPSAzOworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSByZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbiA9IDQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zX2R5bmFtaWMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zX2R5bmFtaWMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5OGFjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX2V4dGVuc2lvbnNfZHluYW1pYy5wcm90bwpAQCAtMCwwICsxLDQ5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGphc29uaEBnb29nbGUuY29tIChKYXNvbiBIc3VlaCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgdXNlZCB0byB0ZXN0IGEgY29ybmVyIGNhc2UgaW4gdGhlIENQUCBpbXBsZW1lbnRhdGlvbiB3aGVyZSB0aGUKKy8vIGdlbmVyYXRlZCBDKysgdHlwZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBleHRlbmRlZSwgYnV0IHRoZSBleHRlbnNpb24gaXMKKy8vIGRlZmluZWQgaW4gYSBmaWxlIHdob3NlIEMrKyB0eXBlIGlzIG5vdCBpbiB0aGUgYmluYXJ5LgorCisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90byI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsOworCittZXNzYWdlIER5bmFtaWNNZXNzYWdlVHlwZSB7CisgIG9wdGlvbmFsIGludDMyIGEgPSAxOworfQorCitleHRlbmQgRXh0ZW5kZWRNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgZHluYW1pY19pbnQzMl9leHRlbnNpb24gPSAxMDA7CisgIG9wdGlvbmFsIER5bmFtaWNNZXNzYWdlVHlwZSBkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uID0gMTAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzAxYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8KQEAgLTAsMCArMSw1MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiByb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKQorCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsOworCisvLyBBIG1lc3NhZ2Ugd2hlcmUgdGFnIG51bWJlcnMgYXJlIGxpc3RlZCBvdXQgb2Ygb3JkZXIsIHRvIGFsbG93IHVzIHRvIHRlc3Qgb3VyCisvLyBjYW5vbmljYWxpemF0aW9uIG9mIHNlcmlhbGl6ZWQgb3V0cHV0LCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIGluIHRhZyBvcmRlci4KKy8vIFdlIGFsc28gbWl4IGluIHNvbWUgZXh0ZW5zaW9ucyBmb3IgZXh0cmEgZnVuLgorbWVzc2FnZSBPdXRPZk9yZGVyRmllbGRzIHsKKyAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKKyAgZXh0ZW5zaW9ucyA0IHRvIDQ7CisgIG9wdGlvbmFsICAgdWludDMyIG9wdGlvbmFsX3VpbnQzMiAgID0gIDM7CisgIGV4dGVuc2lvbnMgMiB0byAyOworICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOworfTsKKworCitleHRlbmQgT3V0T2ZPcmRlckZpZWxkcyB7CisgIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCAgID0gIDQ7CisgIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0ICAgID0gIDI7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJlYTU3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fbWVzc2FnZS5weQpAQCAtMCwwICsxLDExNTAgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFRoaXMgY29kZSBpcyBtZWFudCB0byB3b3JrIG9uIFB5dGhvbiAyLjQgYW5kIGFib3ZlIG9ubHkuCisjCisjIFRPRE8ocm9iaW5zb24pOiBIZWxwZXJzIGZvciB2ZXJib3NlLCBjb21tb24gY2hlY2tzIGxpa2Ugc2VlaW5nIGlmIGEKKyMgZGVzY3JpcHRvcidzIGNwcF90eXBlIGlzIENQUFRZUEVfTUVTU0FHRS4KKworIiIiQ29udGFpbnMgYSBtZXRhY2xhc3MgYW5kIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBjcmVhdGUKK3Byb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBmcm9tIERlc2NyaXB0b3Igb2JqZWN0cyBhdCBydW50aW1lLgorCitSZWNhbGwgdGhhdCBhIG1ldGFjbGFzcyBpcyB0aGUgInR5cGUiIG9mIGEgY2xhc3MuCisoQSBjbGFzcyBpcyB0byBhIG1ldGFjbGFzcyB3aGF0IGFuIGluc3RhbmNlIGlzIHRvIGEgY2xhc3MuKQorCitJbiB0aGlzIGNhc2UsIHdlIHVzZSB0aGUgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSBtZXRhY2xhc3MKK3RvIGluamVjdCBhbGwgdGhlIHVzZWZ1bCBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzZXMKK291dHB1dCBieSB0aGUgcHJvdG9jb2wgY29tcGlsZXIgYXQgY29tcGlsZS10aW1lLgorCitUaGUgdXBzaG90IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24KK2RldGFpbHMgZm9yIEFMTCBwdXJlLVB5dGhvbiBwcm90b2NvbCBidWZmZXJzIGFyZSAqaGVyZSBpbgordGhpcyBmaWxlKi4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCit0cnk6CisgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IGNvcHlfcmVnCitpbXBvcnQgc3RydWN0CitpbXBvcnQgd2Vha3JlZgorCisjIFdlIHVzZSAiYXMiIHRvIGF2b2lkIG5hbWUgY29sbGlzaW9ucyB3aXRoIHZhcmlhYmxlcy4KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBjb250YWluZXJzCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZGVjb2RlcgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGVuY29kZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbnVtX3R5cGVfd3JhcHBlcgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1lc3NhZ2VfbGlzdGVuZXIgYXMgbWVzc2FnZV9saXN0ZW5lcl9tb2QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0eXBlX2NoZWNrZXJzCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIGRlc2NyaXB0b3JfbW9kCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBtZXNzYWdlX21vZAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0CisKK19GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX21vZC5GaWVsZERlc2NyaXB0b3IKKworCitkZWYgTmV3TWVzc2FnZShiYXNlcywgZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6CisgIF9BZGRDbGFzc0F0dHJpYnV0ZXNGb3JOZXN0ZWRFeHRlbnNpb25zKGRlc2NyaXB0b3IsIGRpY3Rpb25hcnkpCisgIF9BZGRTbG90cyhkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KQorICByZXR1cm4gYmFzZXMKKworCitkZWYgSW5pdE1lc3NhZ2UoZGVzY3JpcHRvciwgY2xzKToKKyAgY2xzLl9kZWNvZGVyc19ieV90YWcgPSB7fQorICBjbHMuX2V4dGVuc2lvbnNfYnlfbmFtZSA9IHt9CisgIGNscy5fZXh0ZW5zaW9uc19ieV9udW1iZXIgPSB7fQorICBpZiAoZGVzY3JpcHRvci5oYXNfb3B0aW9ucyBhbmQKKyAgICAgIGRlc2NyaXB0b3IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KToKKyAgICBjbHMuX2RlY29kZXJzX2J5X3RhZ1tkZWNvZGVyLk1FU1NBR0VfU0VUX0lURU1fVEFHXSA9ICgKKyAgICAgICAgZGVjb2Rlci5NZXNzYWdlU2V0SXRlbURlY29kZXIoY2xzLl9leHRlbnNpb25zX2J5X251bWJlcikpCisKKyAgIyBBdHRhY2ggc3R1ZmYgdG8gZWFjaCBGaWVsZERlc2NyaXB0b3IgZm9yIHF1aWNrIGxvb2t1cCBsYXRlciBvbi4KKyAgZm9yIGZpZWxkIGluIGRlc2NyaXB0b3IuZmllbGRzOgorICAgIF9BdHRhY2hGaWVsZEhlbHBlcnMoY2xzLCBmaWVsZCkKKworICBfQWRkRW51bVZhbHVlcyhkZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRJbml0TWV0aG9kKGRlc2NyaXB0b3IsIGNscykKKyAgX0FkZFByb3BlcnRpZXNGb3JGaWVsZHMoZGVzY3JpcHRvciwgY2xzKQorICBfQWRkUHJvcGVydGllc0ZvckV4dGVuc2lvbnMoZGVzY3JpcHRvciwgY2xzKQorICBfQWRkU3RhdGljTWV0aG9kcyhjbHMpCisgIF9BZGRNZXNzYWdlTWV0aG9kcyhkZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRQcml2YXRlSGVscGVyTWV0aG9kcyhjbHMpCisgIGNvcHlfcmVnLnBpY2tsZShjbHMsIGxhbWJkYSBvYmo6IChjbHMsICgpLCBvYmouX19nZXRzdGF0ZV9fKCkpKQorCisKKyMgU3RhdGVsZXNzIGhlbHBlcnMgZm9yIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgYmVsb3cuCisjIE91dHNpZGUgY2xpZW50cyBzaG91bGQgbm90IGFjY2VzcyB0aGVzZSBkaXJlY3RseS4KKyMKKyMgSSBvcHRlZCBub3QgdG8gbWFrZSBhbnkgb2YgdGhlc2UgbWV0aG9kcyBvbiB0aGUgbWV0YWNsYXNzLCB0byBtYWtlIGl0IG1vcmUKKyMgY2xlYXIgdGhhdCBJJ20gbm90IHJlYWxseSB1c2luZyBhbnkgc3RhdGUgdGhlcmUgYW5kIHRvIGtlZXAgY2xpZW50cyBmcm9tCisjIHRoaW5raW5nIHRoYXQgdGhleSBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgY29uc3RydWN0aW9uIGhlbHBlcnMuCisKKworZGVmIF9Qcm9wZXJ0eU5hbWUocHJvdG9fZmllbGRfbmFtZSk6CisgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHB1YmxpYyBwcm9wZXJ0eSBhdHRyaWJ1dGUgd2hpY2gKKyAgY2xpZW50cyBjYW4gdXNlIHRvIGdldCBhbmQgKGluIHNvbWUgY2FzZXMpIHNldCB0aGUgdmFsdWUKKyAgb2YgYSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgorCisgIEFyZ3M6CisgICAgcHJvdG9fZmllbGRfbmFtZTogVGhlIHByb3RvY29sIG1lc3NhZ2UgZmllbGQgbmFtZSwgZXhhY3RseQorICAgICAgYXMgaXQgYXBwZWFycyAob3Igd291bGQgYXBwZWFyKSBpbiBhIC5wcm90byBmaWxlLgorICAiIiIKKyAgIyBUT0RPKHJvYmluc29uKTogRXNjYXBlIFB5dGhvbiBrZXl3b3JkcyAoZS5nLiwgeWllbGQpLCBhbmQgdGVzdCB0aGlzIHN1cHBvcnQuCisgICMgbm5vcndpdHogbWFrZXMgbXkgZGF5IGJ5IHdyaXRpbmc6CisgICMgIiIiCisgICMgRllJLiAgU2VlIHRoZSBrZXl3b3JkIG1vZHVsZSBpbiB0aGUgc3RkbGliLiBUaGlzIGNvdWxkIGJlIGFzIHNpbXBsZSBhczoKKyAgIworICAjIGlmIGtleXdvcmQuaXNrZXl3b3JkKHByb3RvX2ZpZWxkX25hbWUpOgorICAjICAgcmV0dXJuIHByb3RvX2ZpZWxkX25hbWUgKyAiXyIKKyAgIyByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQorICAjICIiIgorICAjIEtlbnRvbiBzYXlzOiAgVGhlIGFib3ZlIGlzIGEgQkFEIElERUEuICBQZW9wbGUgcmVseSBvbiBiZWluZyBhYmxlIHRvIHVzZQorICAjICAgZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgdG8gcmVmbGVjdGl2ZWx5IG1hbmlwdWxhdGUgZmllbGQgdmFsdWVzLiAgSWYgd2UKKyAgIyAgIHJlbmFtZSB0aGUgcHJvcGVydGllcywgdGhlbiBldmVyeSBzdWNoIHVzZXIgaGFzIHRvIGFsc28gbWFrZSBzdXJlIHRvIGFwcGx5CisgICMgICB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbi4gIE5vdGUgdGhhdCBjdXJyZW50bHkgaWYgeW91IG5hbWUgYSBmaWVsZCAieWllbGQiLAorICAjICAgeW91IGNhbiBzdGlsbCBhY2Nlc3MgaXQganVzdCBmaW5lIHVzaW5nIGdldGF0dHIvc2V0YXR0ciAtLSBpdCdzIG5vdCBldmVuCisgICMgICB0aGF0IGN1bWJlcnNvbWUgdG8gZG8gc28uCisgICMgVE9ETyhrZW50b24pOiAgUmVtb3ZlIHRoaXMgbWV0aG9kIGVudGlyZWx5IGlmL3doZW4gZXZlcnlvbmUgYWdyZWVzIHdpdGggbXkKKyAgIyAgIHBvc2l0aW9uLgorICByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQorCisKK2RlZiBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKG1lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAiIiJWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGhhbmRsZSBpcyB2YWxpZC4iIiIKKworICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb25faGFuZGxlLCBfRmllbGREZXNjcmlwdG9yKToKKyAgICByYWlzZSBLZXlFcnJvcignSGFzRXh0ZW5zaW9uKCkgZXhwZWN0cyBhbiBleHRlbnNpb24gaGFuZGxlLCBnb3Q6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZSkKKworICBpZiBub3QgZXh0ZW5zaW9uX2hhbmRsZS5pc19leHRlbnNpb246CisgICAgcmFpc2UgS2V5RXJyb3IoJyIlcyIgaXMgbm90IGFuIGV4dGVuc2lvbi4nICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCisKKyAgaWYgbm90IGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlOgorICAgIHJhaXNlIEtleUVycm9yKCciJXMiIGlzIG1pc3NpbmcgYSBjb250YWluaW5nX3R5cGUuJworICAgICAgICAgICAgICAgICAgICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCisKKyAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5jb250YWluaW5nX3R5cGUgaXMgbm90IG1lc3NhZ2UuREVTQ1JJUFRPUjoKKyAgICByYWlzZSBLZXlFcnJvcignRXh0ZW5zaW9uICIlcyIgZXh0ZW5kcyBtZXNzYWdlIHR5cGUgIiVzIiwgYnV0IHRoaXMgJworICAgICAgICAgICAgICAgICAgICdtZXNzYWdlIGlzIG9mIHR5cGUgIiVzIi4nICUKKyAgICAgICAgICAgICAgICAgICAoZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlLmZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkpCisKKworZGVmIF9BZGRTbG90cyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpOgorICAiIiJBZGRzIGEgX19zbG90c19fIGVudHJ5IHRvIGRpY3Rpb25hcnksIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB2YWxpZAorICBhdHRyaWJ1dGVzIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvcjogQSBEZXNjcmlwdG9yIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhpcyBtZXNzYWdlIHR5cGUuCisgICAgZGljdGlvbmFyeTogQ2xhc3MgZGljdGlvbmFyeSB0byB3aGljaCB3ZSdsbCBhZGQgYSAnX19zbG90c19fJyBlbnRyeS4KKyAgIiIiCisgIGRpY3Rpb25hcnlbJ19fc2xvdHNfXyddID0gWydfY2FjaGVkX2J5dGVfc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfZmllbGRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ191bmtub3duX2ZpZWxkcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfaXNfcHJlc2VudF9pbl9wYXJlbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2xpc3RlbmVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19saXN0ZW5lcl9mb3JfY2hpbGRyZW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX193ZWFrcmVmX18nXQorCisKK2RlZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkKToKKyAgcmV0dXJuIChmaWVsZC5pc19leHRlbnNpb24gYW5kCisgICAgICAgICAgZmllbGQuY29udGFpbmluZ190eXBlLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgYW5kCisgICAgICAgICAgZmllbGQudHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSBhbmQKKyAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUgPT0gZmllbGQuZXh0ZW5zaW9uX3Njb3BlIGFuZAorICAgICAgICAgIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfT1BUSU9OQUwpCisKKworZGVmIF9BdHRhY2hGaWVsZEhlbHBlcnMoY2xzLCBmaWVsZF9kZXNjcmlwdG9yKToKKyAgaXNfcmVwZWF0ZWQgPSAoZmllbGRfZGVzY3JpcHRvci5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEKQorICBpc19wYWNrZWQgPSAoZmllbGRfZGVzY3JpcHRvci5oYXNfb3B0aW9ucyBhbmQKKyAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLnBhY2tlZCkKKworICBpZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkX2Rlc2NyaXB0b3IpOgorICAgIGZpZWxkX2VuY29kZXIgPSBlbmNvZGVyLk1lc3NhZ2VTZXRJdGVtRW5jb2RlcihmaWVsZF9kZXNjcmlwdG9yLm51bWJlcikKKyAgICBzaXplciA9IGVuY29kZXIuTWVzc2FnZVNldEl0ZW1TaXplcihmaWVsZF9kZXNjcmlwdG9yLm51bWJlcikKKyAgZWxzZToKKyAgICBmaWVsZF9lbmNvZGVyID0gdHlwZV9jaGVja2Vycy5UWVBFX1RPX0VOQ09ERVJbZmllbGRfZGVzY3JpcHRvci50eXBlXSgKKyAgICAgICAgZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpCisgICAgc2l6ZXIgPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fU0laRVJbZmllbGRfZGVzY3JpcHRvci50eXBlXSgKKyAgICAgICAgZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpCisKKyAgZmllbGRfZGVzY3JpcHRvci5fZW5jb2RlciA9IGZpZWxkX2VuY29kZXIKKyAgZmllbGRfZGVzY3JpcHRvci5fc2l6ZXIgPSBzaXplcgorICBmaWVsZF9kZXNjcmlwdG9yLl9kZWZhdWx0X2NvbnN0cnVjdG9yID0gX0RlZmF1bHRWYWx1ZUNvbnN0cnVjdG9yRm9yRmllbGQoCisgICAgICBmaWVsZF9kZXNjcmlwdG9yKQorCisgIGRlZiBBZGREZWNvZGVyKHdpcmV0eXBlLCBpc19wYWNrZWQpOgorICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIHdpcmV0eXBlKQorICAgIGNscy5fZGVjb2RlcnNfYnlfdGFnW3RhZ19ieXRlc10gPSAoCisgICAgICAgIHR5cGVfY2hlY2tlcnMuVFlQRV9UT19ERUNPREVSW2ZpZWxkX2Rlc2NyaXB0b3IudHlwZV0oCisgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwKKyAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IpKQorCisgIEFkZERlY29kZXIodHlwZV9jaGVja2Vycy5GSUVMRF9UWVBFX1RPX1dJUkVfVFlQRVtmaWVsZF9kZXNjcmlwdG9yLnR5cGVdLAorICAgICAgICAgICAgIEZhbHNlKQorCisgIGlmIGlzX3JlcGVhdGVkIGFuZCB3aXJlX2Zvcm1hdC5Jc1R5cGVQYWNrYWJsZShmaWVsZF9kZXNjcmlwdG9yLnR5cGUpOgorICAgICMgVG8gc3VwcG9ydCB3aXJlIGNvbXBhdGliaWxpdHkgb2YgYWRkaW5nIHBhY2tlZCA9IHRydWUsIGFkZCBhIGRlY29kZXIgZm9yCisgICAgIyBwYWNrZWQgdmFsdWVzIHJlZ2FyZGxlc3Mgb2YgdGhlIGZpZWxkJ3Mgb3B0aW9ucy4KKyAgICBBZGREZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIFRydWUpCisKKworZGVmIF9BZGRDbGFzc0F0dHJpYnV0ZXNGb3JOZXN0ZWRFeHRlbnNpb25zKGRlc2NyaXB0b3IsIGRpY3Rpb25hcnkpOgorICBleHRlbnNpb25fZGljdCA9IGRlc2NyaXB0b3IuZXh0ZW5zaW9uc19ieV9uYW1lCisgIGZvciBleHRlbnNpb25fbmFtZSwgZXh0ZW5zaW9uX2ZpZWxkIGluIGV4dGVuc2lvbl9kaWN0Lml0ZXJpdGVtcygpOgorICAgIGFzc2VydCBleHRlbnNpb25fbmFtZSBub3QgaW4gZGljdGlvbmFyeQorICAgIGRpY3Rpb25hcnlbZXh0ZW5zaW9uX25hbWVdID0gZXh0ZW5zaW9uX2ZpZWxkCisKKworZGVmIF9BZGRFbnVtVmFsdWVzKGRlc2NyaXB0b3IsIGNscyk6CisgICIiIlNldHMgY2xhc3MtbGV2ZWwgYXR0cmlidXRlcyBmb3IgYWxsIGVudW0gZmllbGRzIGRlZmluZWQgaW4gdGhpcyBtZXNzYWdlLgorCisgIEFsc28gZXhwb3J0aW5nIGEgY2xhc3MtbGV2ZWwgb2JqZWN0IHRoYXQgY2FuIG5hbWUgZW51bSB2YWx1ZXMuCisKKyAgQXJnczoKKyAgICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhpcyBtZXNzYWdlIHR5cGUuCisgICAgY2xzOiBDbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgorICAiIiIKKyAgZm9yIGVudW1fdHlwZSBpbiBkZXNjcmlwdG9yLmVudW1fdHlwZXM6CisgICAgc2V0YXR0cihjbHMsIGVudW1fdHlwZS5uYW1lLCBlbnVtX3R5cGVfd3JhcHBlci5FbnVtVHlwZVdyYXBwZXIoZW51bV90eXBlKSkKKyAgICBmb3IgZW51bV92YWx1ZSBpbiBlbnVtX3R5cGUudmFsdWVzOgorICAgICAgc2V0YXR0cihjbHMsIGVudW1fdmFsdWUubmFtZSwgZW51bV92YWx1ZS5udW1iZXIpCisKKworZGVmIF9EZWZhdWx0VmFsdWVDb25zdHJ1Y3RvckZvckZpZWxkKGZpZWxkKToKKyAgIiIiUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGZvciBhIGZpZWxkLgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEZpZWxkRGVzY3JpcHRvciBvYmplY3QgZm9yIHRoaXMgZmllbGQuCisKKyAgVGhlIHJldHVybmVkIGZ1bmN0aW9uIGhhcyBvbmUgYXJndW1lbnQ6CisgICAgbWVzc2FnZTogTWVzc2FnZSBpbnN0YW5jZSBjb250YWluaW5nIHRoaXMgZmllbGQsIG9yIGEgd2Vha3JlZiBwcm94eQorICAgICAgb2Ygc2FtZS4KKworICBUaGF0IGZ1bmN0aW9uIGluIHR1cm4gcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQuICBUaGUgZGVmYXVsdAorICAgIHZhbHVlIG1heSByZWZlciBiYWNrIHRvIHxtZXNzYWdlfCB2aWEgYSB3ZWFrIHJlZmVyZW5jZS4KKyAgIiIiCisKKyAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICBpZiBmaWVsZC5oYXNfZGVmYXVsdF92YWx1ZSBhbmQgZmllbGQuZGVmYXVsdF92YWx1ZSAhPSBbXToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1JlcGVhdGVkIGZpZWxkIGRlZmF1bHQgdmFsdWUgbm90IGVtcHR5IGxpc3Q6ICVzJyAlICgKKyAgICAgICAgICBmaWVsZC5kZWZhdWx0X3ZhbHVlKSkKKyAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICMgV2UgY2FuJ3QgbG9vayBhdCBfY29uY3JldGVfY2xhc3MgeWV0IHNpbmNlIGl0IG1pZ2h0IG5vdCBoYXZlCisgICAgICAjIGJlZW4gc2V0LiAgKERlcGVuZHMgb24gb3JkZXIgaW4gd2hpY2ggd2UgaW5pdGlhbGl6ZSB0aGUgY2xhc3NlcykuCisgICAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKKyAgICAgIGRlZiBNYWtlUmVwZWF0ZWRNZXNzYWdlRGVmYXVsdChtZXNzYWdlKToKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lcigKKyAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgZmllbGQubWVzc2FnZV90eXBlKQorICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZE1lc3NhZ2VEZWZhdWx0CisgICAgZWxzZToKKyAgICAgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoZmllbGQuY3BwX3R5cGUsIGZpZWxkLnR5cGUpCisgICAgICBkZWYgTWFrZVJlcGVhdGVkU2NhbGFyRGVmYXVsdChtZXNzYWdlKToKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lcigKKyAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgdHlwZV9jaGVja2VyKQorICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZFNjYWxhckRlZmF1bHQKKworICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAjIF9jb25jcmV0ZV9jbGFzcyBtYXkgbm90IHlldCBiZSBpbml0aWFsaXplZC4KKyAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKKyAgICBkZWYgTWFrZVN1Yk1lc3NhZ2VEZWZhdWx0KG1lc3NhZ2UpOgorICAgICAgcmVzdWx0ID0gbWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpCisgICAgICByZXN1bHQuX1NldExpc3RlbmVyKG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbikKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gTWFrZVN1Yk1lc3NhZ2VEZWZhdWx0CisKKyAgZGVmIE1ha2VTY2FsYXJEZWZhdWx0KG1lc3NhZ2UpOgorICAgICMgVE9ETyhwcm90b2J1Zi10ZWFtKTogVGhpcyBtYXkgYmUgYnJva2VuIHNpbmNlIHRoZXJlIG1heSBub3QgYmUKKyAgICAjIGRlZmF1bHRfdmFsdWUuICBDb21iaW5lIHdpdGggaGFzX2RlZmF1bHRfdmFsdWUgc29tZWhvdy4KKyAgICByZXR1cm4gZmllbGQuZGVmYXVsdF92YWx1ZQorICByZXR1cm4gTWFrZVNjYWxhckRlZmF1bHQKKworCitkZWYgX0FkZEluaXRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIGFuIF9faW5pdF9fIG1ldGhvZCB0byBjbHMuIiIiCisgIGZpZWxkcyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHMKKyAgZGVmIGluaXQoc2VsZiwgKiprd2FyZ3MpOgorICAgIHNlbGYuX2NhY2hlZF9ieXRlX3NpemUgPSAwCisgICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSA9IGxlbihrd2FyZ3MpID4gMAorICAgIHNlbGYuX2ZpZWxkcyA9IHt9CisgICAgIyBfdW5rbm93bl9maWVsZHMgaXMgKCkgd2hlbiBlbXB0eSBmb3IgZWZmaWNpZW5jeSwgYW5kIHdpbGwgYmUgdHVybmVkIGludG8KKyAgICAjIGEgbGlzdCBpZiBmaWVsZHMgYXJlIGFkZGVkLgorICAgIHNlbGYuX3Vua25vd25fZmllbGRzID0gKCkKKyAgICBzZWxmLl9pc19wcmVzZW50X2luX3BhcmVudCA9IEZhbHNlCisgICAgc2VsZi5fbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyX21vZC5OdWxsTWVzc2FnZUxpc3RlbmVyKCkKKyAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4gPSBfTGlzdGVuZXIoc2VsZikKKyAgICBmb3IgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgorICAgICAgZmllbGQgPSBfR2V0RmllbGRCeU5hbWUobWVzc2FnZV9kZXNjcmlwdG9yLCBmaWVsZF9uYW1lKQorICAgICAgaWYgZmllbGQgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCBmaWVsZF9uYW1lKSkKKyAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgIGNvcHkgPSBmaWVsZC5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRTogICMgQ29tcG9zaXRlCisgICAgICAgICAgZm9yIHZhbCBpbiBmaWVsZF92YWx1ZToKKyAgICAgICAgICAgIGNvcHkuYWRkKCkuTWVyZ2VGcm9tKHZhbCkKKyAgICAgICAgZWxzZTogICMgU2NhbGFyCisgICAgICAgICAgY29weS5leHRlbmQoZmllbGRfdmFsdWUpCisgICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5CisgICAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBjb3B5ID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgY29weS5NZXJnZUZyb20oZmllbGRfdmFsdWUpCisgICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5CisgICAgICBlbHNlOgorICAgICAgICBzZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKQorCisgIGluaXQuX19tb2R1bGVfXyA9IE5vbmUKKyAgaW5pdC5fX2RvY19fID0gTm9uZQorICBjbHMuX19pbml0X18gPSBpbml0CisKKworZGVmIF9HZXRGaWVsZEJ5TmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IsIGZpZWxkX25hbWUpOgorICAiIiJSZXR1cm5zIGEgZmllbGQgZGVzY3JpcHRvciBieSBmaWVsZCBuYW1lLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBBIERlc2NyaXB0b3IgZGVzY3JpYmluZyBhbGwgZmllbGRzIGluIG1lc3NhZ2UuCisgICAgZmllbGRfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHJldHJpZXZlLgorICBSZXR1cm5zOgorICAgIFRoZSBmaWVsZCBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGQgbmFtZS4KKyAgIiIiCisgIHRyeToKKyAgICByZXR1cm4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCisgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAiJXMiIGZpZWxkLicgJSBmaWVsZF9uYW1lKQorCisKK2RlZiBfQWRkUHJvcGVydGllc0ZvckZpZWxkcyhkZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMgaW4gdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuIiIiCisgIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKKyAgICBfQWRkUHJvcGVydGllc0ZvckZpZWxkKGZpZWxkLCBjbHMpCisKKyAgaWYgZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgorICAgICMgX0V4dGVuc2lvbkRpY3QgaXMganVzdCBhbiBhZGFwdG9yIHdpdGggbm8gc3RhdGUgc28gd2UgYWxsb2NhdGUgYSBuZXcgb25lCisgICAgIyBldmVyeSB0aW1lIGl0IGlzIGFjY2Vzc2VkLgorICAgIGNscy5FeHRlbnNpb25zID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IF9FeHRlbnNpb25EaWN0KHNlbGYpKQorCisKK2RlZiBfQWRkUHJvcGVydGllc0ZvckZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIHByb3RvY29sIG1lc3NhZ2UgZmllbGQuCisgIENsaWVudHMgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCBhbmQgKGluIHRoZSBjYXNlCisgIG9mIG5vbi1yZXBlYXRlZCBzY2FsYXIgZmllbGRzKSBkaXJlY3RseSBzZXQgdGhlIHZhbHVlCisgIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KKworICBBcmdzOgorICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KKyAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCisgICIiIgorICAjIENhdGNoIGl0IGlmIHdlIGFkZCBvdGhlciB0eXBlcyB0aGF0IHdlIHNob3VsZAorICAjIGhhbmRsZSBzcGVjaWFsbHkgaGVyZS4KKyAgYXNzZXJ0IF9GaWVsZERlc2NyaXB0b3IuTUFYX0NQUFRZUEUgPT0gMTAKKworICBjb25zdGFudF9uYW1lID0gZmllbGQubmFtZS51cHBlcigpICsgIl9GSUVMRF9OVU1CRVIiCisgIHNldGF0dHIoY2xzLCBjb25zdGFudF9uYW1lLCBmaWVsZC5udW1iZXIpCisKKyAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICBfQWRkUHJvcGVydGllc0ZvclJlcGVhdGVkRmllbGQoZmllbGQsIGNscykKKyAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkQ29tcG9zaXRlRmllbGQoZmllbGQsIGNscykKKyAgZWxzZToKKyAgICBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkU2NhbGFyRmllbGQoZmllbGQsIGNscykKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JSZXBlYXRlZEZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhICJyZXBlYXRlZCIgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4gIENsaWVudHMKKyAgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCB3aGljaCB3aWxsIGJlIGVpdGhlciBhCisgIF9SZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyIG9yIF9SZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIChzZWUKKyAgYmVsb3cpLgorCisgIE5vdGUgdGhhdCB3aGVuIGNsaWVudHMgYWRkIHZhbHVlcyB0byB0aGVzZSBjb250YWluZXJzLCB3ZSBwZXJmb3JtCisgIHR5cGUtY2hlY2tpbmcgaW4gdGhlIGNhc2Ugb2YgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcywgYW5kIHdlIGFsc28gc2V0IGFueQorICBuZWNlc3NhcnkgImhhcyIgYml0cyBhcyBhIHNpZGUtZWZmZWN0LgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEEgRmllbGREZXNjcmlwdG9yIGZvciB0aGlzIGZpZWxkLgorICAgIGNsczogVGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KKyAgIiIiCisgIHByb3RvX2ZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCisgIHByb3BlcnR5X25hbWUgPSBfUHJvcGVydHlOYW1lKHByb3RvX2ZpZWxkX25hbWUpCisKKyAgZGVmIGdldHRlcihzZWxmKToKKyAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5nZXQoZmllbGQpCisgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKKyAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KKyAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKworICAgICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKKyAgICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQorICAgICAgIyB0YWtlIHRoYXQgb2JqZWN0IGFuZCBkaXNjYXJkIG91cnMuCisgICAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCisgICAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKKyAgICAgICMgICBpbiBzZXZlcmFsIG90aGVyIGxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuCisgICAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5zZXRkZWZhdWx0KGZpZWxkLCBmaWVsZF92YWx1ZSkKKyAgICByZXR1cm4gZmllbGRfdmFsdWUKKyAgZ2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCisgIGdldHRlci5fX2RvY19fID0gJ0dldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKKworICAjIFdlIGRlZmluZSBhIHNldHRlciBqdXN0IHNvIHdlIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBhIG1vcmUKKyAgIyBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCisgIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIHByb3RvX2ZpZWxkX25hbWUpCisKKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKKyAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5KGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKSkKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JOb25SZXBlYXRlZFNjYWxhckZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIG5vbnJlcGVhdGVkLCBzY2FsYXIgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KKyAgQ2xpZW50cyBjYW4gdXNlIHRoaXMgcHJvcGVydHkgdG8gZ2V0IGFuZCBkaXJlY3RseSBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KKyAgTm90ZSB0aGF0IHdoZW4gdGhlIGNsaWVudCBzZXRzIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGJ5IHVzaW5nIHRoaXMgcHJvcGVydHksCisgIGFsbCBuZWNlc3NhcnkgImhhcyIgYml0cyBhcmUgc2V0IGFzIGEgc2lkZS1lZmZlY3QsIGFuZCB3ZSBhbHNvIHBlcmZvcm0KKyAgdHlwZS1jaGVja2luZy4KKworICBBcmdzOgorICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KKyAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCisgICIiIgorICBwcm90b19maWVsZF9uYW1lID0gZmllbGQubmFtZQorICBwcm9wZXJ0eV9uYW1lID0gX1Byb3BlcnR5TmFtZShwcm90b19maWVsZF9uYW1lKQorICB0eXBlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXJzLkdldFR5cGVDaGVja2VyKGZpZWxkLmNwcF90eXBlLCBmaWVsZC50eXBlKQorICBkZWZhdWx0X3ZhbHVlID0gZmllbGQuZGVmYXVsdF92YWx1ZQorICB2YWxpZF92YWx1ZXMgPSBzZXQoKQorCisgIGRlZiBnZXR0ZXIoc2VsZik6CisgICAgIyBUT0RPKHByb3RvYnVmLXRlYW0pOiBUaGlzIG1heSBiZSBicm9rZW4gc2luY2UgdGhlcmUgbWF5IG5vdCBiZQorICAgICMgZGVmYXVsdF92YWx1ZS4gIENvbWJpbmUgd2l0aCBoYXNfZGVmYXVsdF92YWx1ZSBzb21laG93LgorICAgIHJldHVybiBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkLCBkZWZhdWx0X3ZhbHVlKQorICBnZXR0ZXIuX19tb2R1bGVfXyA9IE5vbmUKKyAgZ2V0dGVyLl9fZG9jX18gPSAnR2V0dGVyIGZvciAlcy4nICUgcHJvdG9fZmllbGRfbmFtZQorICBkZWYgc2V0dGVyKHNlbGYsIG5ld192YWx1ZSk6CisgICAgdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUobmV3X3ZhbHVlKQorICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBuZXdfdmFsdWUKKyAgICAjIENoZWNrIF9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5IGlubGluZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBzaW5jZSBzY2FsYXIKKyAgICAjIHNldHRlcnMgYXJlIGNhbGxlZCBmcmVxdWVudGx5LgorICAgIGlmIG5vdCBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5OgorICAgICAgc2VsZi5fTW9kaWZpZWQoKQorCisgIHNldHRlci5fX21vZHVsZV9fID0gTm9uZQorICBzZXR0ZXIuX19kb2NfXyA9ICdTZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCisKKyAgIyBBZGQgYSBwcm9wZXJ0eSB0byBlbmNhcHN1bGF0ZSB0aGUgZ2V0dGVyL3NldHRlci4KKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKKyAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5KGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKSkKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JOb25SZXBlYXRlZENvbXBvc2l0ZUZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIG5vbnJlcGVhdGVkLCBjb21wb3NpdGUgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KKyAgQSBjb21wb3NpdGUgZmllbGQgaXMgYSAiZ3JvdXAiIG9yICJtZXNzYWdlIiBmaWVsZC4KKworICBDbGllbnRzIGNhbiB1c2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCwgYnV0IGNhbm5vdAorICBhc3NpZ24gdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEEgRmllbGREZXNjcmlwdG9yIGZvciB0aGlzIGZpZWxkLgorICAgIGNsczogVGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KKyAgIiIiCisgICMgVE9ETyhyb2JpbnNvbik6IFJlbW92ZSBkdXBsaWNhdGlvbiB3aXRoIHNpbWlsYXIgbWV0aG9kCisgICMgZm9yIG5vbi1yZXBlYXRlZCBzY2FsYXJzLgorICBwcm90b19maWVsZF9uYW1lID0gZmllbGQubmFtZQorICBwcm9wZXJ0eV9uYW1lID0gX1Byb3BlcnR5TmFtZShwcm90b19maWVsZF9uYW1lKQorCisgICMgVE9ETyhrb21hcmVrKTogQ2FuIGFueW9uZSBleHBsYWluIHRvIG1lIHdoeSB3ZSBjYWNoZSB0aGUgbWVzc2FnZV90eXBlIHRoaXMKKyAgIyB3YXksIGluc3RlYWQgb2YgcmVmZXJyaW5nIHRvIGZpZWxkLm1lc3NhZ2VfdHlwZSBpbnNpZGUgb2YgZ2V0dGVyKHNlbGYpPworICAjIFdoYXQgaWYgc29tZW9uZSBzZXRzIG1lc3NhZ2VfdHlwZSBsYXRlciBvbiAod2hpY2ggbWFrZXMgZm9yIHNpbXBsZXIKKyAgIyBkeWFubWljIHByb3RvIGRlc2NyaXB0b3IgYW5kIGNsYXNzIGNyZWF0aW9uIGNvZGUpLgorICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKKworICBkZWYgZ2V0dGVyKHNlbGYpOgorICAgIGZpZWxkX3ZhbHVlID0gc2VsZi5fZmllbGRzLmdldChmaWVsZCkKKyAgICBpZiBmaWVsZF92YWx1ZSBpcyBOb25lOgorICAgICAgIyBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGlzIGZpZWxkLgorICAgICAgZmllbGRfdmFsdWUgPSBtZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKCkgICMgdXNlIGZpZWxkLm1lc3NhZ2VfdHlwZT8KKyAgICAgIGZpZWxkX3ZhbHVlLl9TZXRMaXN0ZW5lcihzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4pCisKKyAgICAgICMgQXRvbWljYWxseSBjaGVjayBpZiBhbm90aGVyIHRocmVhZCBoYXMgcHJlZW1wdGVkIHVzIGFuZCwgaWYgbm90LCBzd2FwCisgICAgICAjIGluIHRoZSBuZXcgb2JqZWN0IHdlIGp1c3QgY3JlYXRlZC4gIElmIHNvbWVvbmUgaGFzIHByZWVtcHRlZCB1cywgd2UKKyAgICAgICMgdGFrZSB0aGF0IG9iamVjdCBhbmQgZGlzY2FyZCBvdXJzLgorICAgICAgIyBXQVJOSU5HOiAgV2UgYXJlIHJlbHlpbmcgb24gc2V0ZGVmYXVsdCgpIGJlaW5nIGF0b21pYy4gIFRoaXMgaXMgdHJ1ZQorICAgICAgIyAgIGluIENQeXRob24gYnV0IHdlIGhhdmVuJ3QgaW52ZXN0aWdhdGVkIG90aGVycy4gIFRoaXMgd2FybmluZyBhcHBlYXJzCisgICAgICAjICAgaW4gc2V2ZXJhbCBvdGhlciBsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLgorICAgICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuc2V0ZGVmYXVsdChmaWVsZCwgZmllbGRfdmFsdWUpCisgICAgcmV0dXJuIGZpZWxkX3ZhbHVlCisgIGdldHRlci5fX21vZHVsZV9fID0gTm9uZQorICBnZXR0ZXIuX19kb2NfXyA9ICdHZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCisKKyAgIyBXZSBkZWZpbmUgYSBzZXR0ZXIganVzdCBzbyB3ZSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggYSBtb3JlCisgICMgaGVscGZ1bCBlcnJvciBtZXNzYWdlLgorICBkZWYgc2V0dGVyKHNlbGYsIG5ld192YWx1ZSk6CisgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJ0Fzc2lnbm1lbnQgbm90IGFsbG93ZWQgdG8gY29tcG9zaXRlIGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIiVzIiBpbiBwcm90b2NvbCBtZXNzYWdlIG9iamVjdC4nICUgcHJvdG9fZmllbGRfbmFtZSkKKworICAjIEFkZCBhIHByb3BlcnR5IHRvIGVuY2Fwc3VsYXRlIHRoZSBnZXR0ZXIuCisgIGRvYyA9ICdNYWdpYyBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGZvciAiJXMiIHByb3RvIGZpZWxkLicgJSBwcm90b19maWVsZF9uYW1lCisgIHNldGF0dHIoY2xzLCBwcm9wZXJ0eV9uYW1lLCBwcm9wZXJ0eShnZXR0ZXIsIHNldHRlciwgZG9jPWRvYykpCisKKworZGVmIF9BZGRQcm9wZXJ0aWVzRm9yRXh0ZW5zaW9ucyhkZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMgaW4gdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuIiIiCisgIGV4dGVuc2lvbl9kaWN0ID0gZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKKyAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6CisgICAgY29uc3RhbnRfbmFtZSA9IGV4dGVuc2lvbl9uYW1lLnVwcGVyKCkgKyAiX0ZJRUxEX05VTUJFUiIKKyAgICBzZXRhdHRyKGNscywgY29uc3RhbnRfbmFtZSwgZXh0ZW5zaW9uX2ZpZWxkLm51bWJlcikKKworCitkZWYgX0FkZFN0YXRpY01ldGhvZHMoY2xzKToKKyAgIyBUT0RPKHJvYmluc29uKTogVGhpcyBwcm9iYWJseSBuZWVkcyB0byBiZSB0aHJlYWQtc2FmZSg/KQorICBkZWYgUmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uX2hhbmRsZSk6CisgICAgZXh0ZW5zaW9uX2hhbmRsZS5jb250YWluaW5nX3R5cGUgPSBjbHMuREVTQ1JJUFRPUgorICAgIF9BdHRhY2hGaWVsZEhlbHBlcnMoY2xzLCBleHRlbnNpb25faGFuZGxlKQorCisgICAgIyBUcnkgdG8gaW5zZXJ0IG91ciBleHRlbnNpb24sIGZhaWxpbmcgaWYgYW4gZXh0ZW5zaW9uIHdpdGggdGhlIHNhbWUgbnVtYmVyCisgICAgIyBhbHJlYWR5IGV4aXN0cy4KKyAgICBhY3R1YWxfaGFuZGxlID0gY2xzLl9leHRlbnNpb25zX2J5X251bWJlci5zZXRkZWZhdWx0KAorICAgICAgICBleHRlbnNpb25faGFuZGxlLm51bWJlciwgZXh0ZW5zaW9uX2hhbmRsZSkKKyAgICBpZiBhY3R1YWxfaGFuZGxlIGlzIG5vdCBleHRlbnNpb25faGFuZGxlOgorICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgJ0V4dGVuc2lvbnMgIiVzIiBhbmQgIiVzIiBib3RoIHRyeSB0byBleHRlbmQgbWVzc2FnZSB0eXBlICIlcyIgd2l0aCAnCisgICAgICAgICAgJ2ZpZWxkIG51bWJlciAlZC4nICUKKyAgICAgICAgICAoZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUsIGFjdHVhbF9oYW5kbGUuZnVsbF9uYW1lLAorICAgICAgICAgICBjbHMuREVTQ1JJUFRPUi5mdWxsX25hbWUsIGV4dGVuc2lvbl9oYW5kbGUubnVtYmVyKSkKKworICAgIGNscy5fZXh0ZW5zaW9uc19ieV9uYW1lW2V4dGVuc2lvbl9oYW5kbGUuZnVsbF9uYW1lXSA9IGV4dGVuc2lvbl9oYW5kbGUKKworICAgIGhhbmRsZSA9IGV4dGVuc2lvbl9oYW5kbGUgICMgYXZvaWQgbGluZSB3cmFwcGluZworICAgIGlmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oaGFuZGxlKToKKyAgICAgICMgTWVzc2FnZVNldCBleHRlbnNpb24uICBBbHNvIHJlZ2lzdGVyIHVuZGVyIHR5cGUgbmFtZS4KKyAgICAgIGNscy5fZXh0ZW5zaW9uc19ieV9uYW1lWworICAgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUubWVzc2FnZV90eXBlLmZ1bGxfbmFtZV0gPSBleHRlbnNpb25faGFuZGxlCisKKyAgY2xzLlJlZ2lzdGVyRXh0ZW5zaW9uID0gc3RhdGljbWV0aG9kKFJlZ2lzdGVyRXh0ZW5zaW9uKQorCisgIGRlZiBGcm9tU3RyaW5nKHMpOgorICAgIG1lc3NhZ2UgPSBjbHMoKQorICAgIG1lc3NhZ2UuTWVyZ2VGcm9tU3RyaW5nKHMpCisgICAgcmV0dXJuIG1lc3NhZ2UKKyAgY2xzLkZyb21TdHJpbmcgPSBzdGF0aWNtZXRob2QoRnJvbVN0cmluZykKKworCitkZWYgX0lzUHJlc2VudChpdGVtKToKKyAgIiIiR2l2ZW4gYSAoRmllbGREZXNjcmlwdG9yLCB2YWx1ZSkgdHVwbGUgZnJvbSBfZmllbGRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUKKyAgdmFsdWUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IHJldHVybmVkIGJ5IExpc3RGaWVsZHMoKS4iIiIKKworICBpZiBpdGVtWzBdLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgcmV0dXJuIGJvb2woaXRlbVsxXSkKKyAgZWxpZiBpdGVtWzBdLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgIHJldHVybiBpdGVtWzFdLl9pc19wcmVzZW50X2luX3BhcmVudAorICBlbHNlOgorICAgIHJldHVybiBUcnVlCisKKworZGVmIF9BZGRMaXN0RmllbGRzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKworICBkZWYgTGlzdEZpZWxkcyhzZWxmKToKKyAgICBhbGxfZmllbGRzID0gW2l0ZW0gZm9yIGl0ZW0gaW4gc2VsZi5fZmllbGRzLml0ZXJpdGVtcygpIGlmIF9Jc1ByZXNlbnQoaXRlbSldCisgICAgYWxsX2ZpZWxkcy5zb3J0KGtleSA9IGxhbWJkYSBpdGVtOiBpdGVtWzBdLm51bWJlcikKKyAgICByZXR1cm4gYWxsX2ZpZWxkcworCisgIGNscy5MaXN0RmllbGRzID0gTGlzdEZpZWxkcworCisKK2RlZiBfQWRkSGFzRmllbGRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorCisgIHNpbmd1bGFyX2ZpZWxkcyA9IHt9CisgIGZvciBmaWVsZCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzOgorICAgIGlmIGZpZWxkLmxhYmVsICE9IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICBzaW5ndWxhcl9maWVsZHNbZmllbGQubmFtZV0gPSBmaWVsZAorCisgIGRlZiBIYXNGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKKyAgICB0cnk6CisgICAgICBmaWVsZCA9IHNpbmd1bGFyX2ZpZWxkc1tmaWVsZF9uYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgJ1Byb3RvY29sIG1lc3NhZ2UgaGFzIG5vIHNpbmd1bGFyICIlcyIgZmllbGQuJyAlIGZpZWxkX25hbWUpCisKKyAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzLmdldChmaWVsZCkKKyAgICAgIHJldHVybiB2YWx1ZSBpcyBub3QgTm9uZSBhbmQgdmFsdWUuX2lzX3ByZXNlbnRfaW5fcGFyZW50CisgICAgZWxzZToKKyAgICAgIHJldHVybiBmaWVsZCBpbiBzZWxmLl9maWVsZHMKKyAgY2xzLkhhc0ZpZWxkID0gSGFzRmllbGQKKworCitkZWYgX0FkZENsZWFyRmllbGRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgQ2xlYXJGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKKyAgICB0cnk6CisgICAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVtmaWVsZF9uYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Byb3RvY29sIG1lc3NhZ2UgaGFzIG5vICIlcyIgZmllbGQuJyAlIGZpZWxkX25hbWUpCisKKyAgICBpZiBmaWVsZCBpbiBzZWxmLl9maWVsZHM6CisgICAgICAjIE5vdGU6ICBJZiB0aGUgZmllbGQgaXMgYSBzdWItbWVzc2FnZSwgaXRzIGxpc3RlbmVyIHdpbGwgc3RpbGwgcG9pbnQKKyAgICAgICMgICBhdCB1cy4gIFRoYXQncyBmaW5lLCBiZWNhdXNlIHRoZSB3b3JzdCB0aGFuIGNhbiBoYXBwZW4gaXMgdGhhdCBpdAorICAgICAgIyAgIHdpbGwgY2FsbCBfTW9kaWZpZWQoKSBhbmQgaW52YWxpZGF0ZSBvdXIgYnl0ZSBzaXplLiAgQmlnIGRlYWwuCisgICAgICBkZWwgc2VsZi5fZmllbGRzW2ZpZWxkXQorCisgICAgIyBBbHdheXMgY2FsbCBfTW9kaWZpZWQoKSAtLSBldmVuIGlmIG5vdGhpbmcgd2FzIGNoYW5nZWQsIHRoaXMgaXMKKyAgICAjIGEgbXV0YXRpbmcgbWV0aG9kLCBhbmQgdGh1cyBjYWxsaW5nIGl0IHNob3VsZCBjYXVzZSB0aGUgZmllbGQgdG8gYmVjb21lCisgICAgIyBwcmVzZW50IGluIHRoZSBwYXJlbnQgbWVzc2FnZS4KKyAgICBzZWxmLl9Nb2RpZmllZCgpCisKKyAgY2xzLkNsZWFyRmllbGQgPSBDbGVhckZpZWxkCisKKworZGVmIF9BZGRDbGVhckV4dGVuc2lvbk1ldGhvZChjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgQ2xlYXJFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSk6CisgICAgX1ZlcmlmeUV4dGVuc2lvbkhhbmRsZShzZWxmLCBleHRlbnNpb25faGFuZGxlKQorCisgICAgIyBTaW1pbGFyIHRvIENsZWFyRmllbGQoKSwgYWJvdmUuCisgICAgaWYgZXh0ZW5zaW9uX2hhbmRsZSBpbiBzZWxmLl9maWVsZHM6CisgICAgICBkZWwgc2VsZi5fZmllbGRzW2V4dGVuc2lvbl9oYW5kbGVdCisgICAgc2VsZi5fTW9kaWZpZWQoKQorICBjbHMuQ2xlYXJFeHRlbnNpb24gPSBDbGVhckV4dGVuc2lvbgorCisKK2RlZiBfQWRkQ2xlYXJNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgQ2xlYXIoc2VsZik6CisgICAgIyBDbGVhciBmaWVsZHMuCisgICAgc2VsZi5fZmllbGRzID0ge30KKyAgICBzZWxmLl91bmtub3duX2ZpZWxkcyA9ICgpCisgICAgc2VsZi5fTW9kaWZpZWQoKQorICBjbHMuQ2xlYXIgPSBDbGVhcgorCisKK2RlZiBfQWRkSGFzRXh0ZW5zaW9uTWV0aG9kKGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBIYXNFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSk6CisgICAgX1ZlcmlmeUV4dGVuc2lvbkhhbmRsZShzZWxmLCBleHRlbnNpb25faGFuZGxlKQorICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIHJhaXNlIEtleUVycm9yKCciJXMiIGlzIHJlcGVhdGVkLicgJSBleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSkKKworICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICB2YWx1ZSA9IHNlbGYuX2ZpZWxkcy5nZXQoZXh0ZW5zaW9uX2hhbmRsZSkKKyAgICAgIHJldHVybiB2YWx1ZSBpcyBub3QgTm9uZSBhbmQgdmFsdWUuX2lzX3ByZXNlbnRfaW5fcGFyZW50CisgICAgZWxzZToKKyAgICAgIHJldHVybiBleHRlbnNpb25faGFuZGxlIGluIHNlbGYuX2ZpZWxkcworICBjbHMuSGFzRXh0ZW5zaW9uID0gSGFzRXh0ZW5zaW9uCisKKworZGVmIF9BZGRFcXVhbHNNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICBpZiAobm90IGlzaW5zdGFuY2Uob3RoZXIsIG1lc3NhZ2VfbW9kLk1lc3NhZ2UpIG9yCisgICAgICAgIG90aGVyLkRFU0NSSVBUT1IgIT0gc2VsZi5ERVNDUklQVE9SKToKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgIHJldHVybiBUcnVlCisKKyAgICBpZiBub3Qgc2VsZi5MaXN0RmllbGRzKCkgPT0gb3RoZXIuTGlzdEZpZWxkcygpOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIFNvcnQgdW5rbm93biBmaWVsZHMgYmVjYXVzZSB0aGVpciBvcmRlciBzaG91bGRuJ3QgYWZmZWN0IGVxdWFsaXR5IHRlc3QuCisgICAgdW5rbm93bl9maWVsZHMgPSBsaXN0KHNlbGYuX3Vua25vd25fZmllbGRzKQorICAgIHVua25vd25fZmllbGRzLnNvcnQoKQorICAgIG90aGVyX3Vua25vd25fZmllbGRzID0gbGlzdChvdGhlci5fdW5rbm93bl9maWVsZHMpCisgICAgb3RoZXJfdW5rbm93bl9maWVsZHMuc29ydCgpCisKKyAgICByZXR1cm4gdW5rbm93bl9maWVsZHMgPT0gb3RoZXJfdW5rbm93bl9maWVsZHMKKworICBjbHMuX19lcV9fID0gX19lcV9fCisKKworZGVmIF9BZGRTdHJNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICByZXR1cm4gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHNlbGYpCisgIGNscy5fX3N0cl9fID0gX19zdHJfXworCisKK2RlZiBfQWRkVW5pY29kZU1ldGhvZCh1bnVzZWRfbWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorCisgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICByZXR1cm4gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHNlbGYsIGFzX3V0Zjg9VHJ1ZSkuZGVjb2RlKCd1dGYtOCcpCisgIGNscy5fX3VuaWNvZGVfXyA9IF9fdW5pY29kZV9fCisKKworZGVmIF9BZGRTZXRMaXN0ZW5lck1ldGhvZChjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgU2V0TGlzdGVuZXIoc2VsZiwgbGlzdGVuZXIpOgorICAgIGlmIGxpc3RlbmVyIGlzIE5vbmU6CisgICAgICBzZWxmLl9saXN0ZW5lciA9IG1lc3NhZ2VfbGlzdGVuZXJfbW9kLk51bGxNZXNzYWdlTGlzdGVuZXIoKQorICAgIGVsc2U6CisgICAgICBzZWxmLl9saXN0ZW5lciA9IGxpc3RlbmVyCisgIGNscy5fU2V0TGlzdGVuZXIgPSBTZXRMaXN0ZW5lcgorCisKK2RlZiBfQnl0ZXNGb3JOb25SZXBlYXRlZEVsZW1lbnQodmFsdWUsIGZpZWxkX251bWJlciwgZmllbGRfdHlwZSk6CisgICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc2VyaWFsaXplIGEgbm9uLXJlcGVhdGVkIGVsZW1lbnQuCisgIFRoZSByZXR1cm5lZCBieXRlIGNvdW50IGluY2x1ZGVzIHNwYWNlIGZvciB0YWcgaW5mb3JtYXRpb24gYW5kIGFueQorICBvdGhlciBhZGRpdGlvbmFsIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCBzZXJpYWxpemluZyB2YWx1ZS4KKworICBBcmdzOgorICAgIHZhbHVlOiBWYWx1ZSB3ZSdyZSBzZXJpYWxpemluZy4KKyAgICBmaWVsZF9udW1iZXI6IEZpZWxkIG51bWJlciBvZiB0aGlzIHZhbHVlLiAgKFNpbmNlIHRoZSBmaWVsZCBudW1iZXIKKyAgICAgIGlzIHN0b3JlZCBhcyBwYXJ0IG9mIGEgdmFyaW50LWVuY29kZWQgdGFnLCB0aGlzIGhhcyBhbiBpbXBhY3QKKyAgICAgIG9uIHRoZSB0b3RhbCBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgdGhlIHZhbHVlKS4KKyAgICBmaWVsZF90eXBlOiBUaGUgdHlwZSBvZiB0aGUgZmllbGQuICBPbmUgb2YgdGhlIFRZUEVfKiBjb25zdGFudHMKKyAgICAgIHdpdGhpbiBGaWVsZERlc2NyaXB0b3IuCisgICIiIgorICB0cnk6CisgICAgZm4gPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fQllURV9TSVpFX0ZOW2ZpZWxkX3R5cGVdCisgICAgcmV0dXJuIGZuKGZpZWxkX251bWJlciwgdmFsdWUpCisgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICByYWlzZSBtZXNzYWdlX21vZC5FbmNvZGVFcnJvcignVW5yZWNvZ25pemVkIGZpZWxkIHR5cGU6ICVkJyAlIGZpZWxkX3R5cGUpCisKKworZGVmIF9BZGRCeXRlU2l6ZU1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisKKyAgZGVmIEJ5dGVTaXplKHNlbGYpOgorICAgIGlmIG5vdCBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5OgorICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlZF9ieXRlX3NpemUKKworICAgIHNpemUgPSAwCisgICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX3ZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgorICAgICAgc2l6ZSArPSBmaWVsZF9kZXNjcmlwdG9yLl9zaXplcihmaWVsZF92YWx1ZSkKKworICAgIGZvciB0YWdfYnl0ZXMsIHZhbHVlX2J5dGVzIGluIHNlbGYuX3Vua25vd25fZmllbGRzOgorICAgICAgc2l6ZSArPSBsZW4odGFnX2J5dGVzKSArIGxlbih2YWx1ZV9ieXRlcykKKworICAgIHNlbGYuX2NhY2hlZF9ieXRlX3NpemUgPSBzaXplCisgICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSA9IEZhbHNlCisgICAgc2VsZi5fbGlzdGVuZXJfZm9yX2NoaWxkcmVuLmRpcnR5ID0gRmFsc2UKKyAgICByZXR1cm4gc2l6ZQorCisgIGNscy5CeXRlU2l6ZSA9IEJ5dGVTaXplCisKKworZGVmIF9BZGRTZXJpYWxpemVUb1N0cmluZ01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisKKyAgZGVmIFNlcmlhbGl6ZVRvU3RyaW5nKHNlbGYpOgorICAgICMgQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaGFzIGFsbCBvZiBpdHMgcmVxdWlyZWQgZmllbGRzIHNldC4KKyAgICBlcnJvcnMgPSBbXQorICAgIGlmIG5vdCBzZWxmLklzSW5pdGlhbGl6ZWQoKToKKyAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkVuY29kZUVycm9yKAorICAgICAgICAgICdNZXNzYWdlICVzIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAlcycgJSAoCisgICAgICAgICAgc2VsZi5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgJywnLmpvaW4oc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkpKQorICAgIHJldHVybiBzZWxmLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisgIGNscy5TZXJpYWxpemVUb1N0cmluZyA9IFNlcmlhbGl6ZVRvU3RyaW5nCisKKworZGVmIF9BZGRTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorCisgIGRlZiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc2VsZik6CisgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgIHNlbGYuX0ludGVybmFsU2VyaWFsaXplKG91dC53cml0ZSkKKyAgICByZXR1cm4gb3V0LmdldHZhbHVlKCkKKyAgY2xzLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyA9IFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZworCisgIGRlZiBJbnRlcm5hbFNlcmlhbGl6ZShzZWxmLCB3cml0ZV9ieXRlcyk6CisgICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX3ZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgorICAgICAgZmllbGRfZGVzY3JpcHRvci5fZW5jb2Rlcih3cml0ZV9ieXRlcywgZmllbGRfdmFsdWUpCisgICAgZm9yIHRhZ19ieXRlcywgdmFsdWVfYnl0ZXMgaW4gc2VsZi5fdW5rbm93bl9maWVsZHM6CisgICAgICB3cml0ZV9ieXRlcyh0YWdfYnl0ZXMpCisgICAgICB3cml0ZV9ieXRlcyh2YWx1ZV9ieXRlcykKKyAgY2xzLl9JbnRlcm5hbFNlcmlhbGl6ZSA9IEludGVybmFsU2VyaWFsaXplCisKKworZGVmIF9BZGRNZXJnZUZyb21TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgTWVyZ2VGcm9tU3RyaW5nKHNlbGYsIHNlcmlhbGl6ZWQpOgorICAgIGxlbmd0aCA9IGxlbihzZXJpYWxpemVkKQorICAgIHRyeToKKyAgICAgIGlmIHNlbGYuX0ludGVybmFsUGFyc2Uoc2VyaWFsaXplZCwgMCwgbGVuZ3RoKSAhPSBsZW5ndGg6CisgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdAorICAgICAgICAjIGVuY291bnRlcmVkIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkRlY29kZUVycm9yKCdVbmV4cGVjdGVkIGVuZC1ncm91cCB0YWcuJykKKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkRlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3IsIGU6CisgICAgICByYWlzZSBtZXNzYWdlX21vZC5EZWNvZGVFcnJvcihlKQorICAgIHJldHVybiBsZW5ndGggICAjIFJldHVybiB0aGlzIGZvciBsZWdhY3kgcmVhc29ucy4KKyAgY2xzLk1lcmdlRnJvbVN0cmluZyA9IE1lcmdlRnJvbVN0cmluZworCisgIGxvY2FsX1JlYWRUYWcgPSBkZWNvZGVyLlJlYWRUYWcKKyAgbG9jYWxfU2tpcEZpZWxkID0gZGVjb2Rlci5Ta2lwRmllbGQKKyAgZGVjb2RlcnNfYnlfdGFnID0gY2xzLl9kZWNvZGVyc19ieV90YWcKKworICBkZWYgSW50ZXJuYWxQYXJzZShzZWxmLCBidWZmZXIsIHBvcywgZW5kKToKKyAgICBzZWxmLl9Nb2RpZmllZCgpCisgICAgZmllbGRfZGljdCA9IHNlbGYuX2ZpZWxkcworICAgIHVua25vd25fZmllbGRfbGlzdCA9IHNlbGYuX3Vua25vd25fZmllbGRzCisgICAgd2hpbGUgcG9zICE9IGVuZDoKKyAgICAgICh0YWdfYnl0ZXMsIG5ld19wb3MpID0gbG9jYWxfUmVhZFRhZyhidWZmZXIsIHBvcykKKyAgICAgIGZpZWxkX2RlY29kZXIgPSBkZWNvZGVyc19ieV90YWcuZ2V0KHRhZ19ieXRlcykKKyAgICAgIGlmIGZpZWxkX2RlY29kZXIgaXMgTm9uZToKKyAgICAgICAgdmFsdWVfc3RhcnRfcG9zID0gbmV3X3BvcworICAgICAgICBuZXdfcG9zID0gbG9jYWxfU2tpcEZpZWxkKGJ1ZmZlciwgbmV3X3BvcywgZW5kLCB0YWdfYnl0ZXMpCisgICAgICAgIGlmIG5ld19wb3MgPT0gLTE6CisgICAgICAgICAgcmV0dXJuIHBvcworICAgICAgICBpZiBub3QgdW5rbm93bl9maWVsZF9saXN0OgorICAgICAgICAgIHVua25vd25fZmllbGRfbGlzdCA9IHNlbGYuX3Vua25vd25fZmllbGRzID0gW10KKyAgICAgICAgdW5rbm93bl9maWVsZF9saXN0LmFwcGVuZCgodGFnX2J5dGVzLCBidWZmZXJbdmFsdWVfc3RhcnRfcG9zOm5ld19wb3NdKSkKKyAgICAgICAgcG9zID0gbmV3X3BvcworICAgICAgZWxzZToKKyAgICAgICAgcG9zID0gZmllbGRfZGVjb2RlcihidWZmZXIsIG5ld19wb3MsIGVuZCwgc2VsZiwgZmllbGRfZGljdCkKKyAgICByZXR1cm4gcG9zCisgIGNscy5fSW50ZXJuYWxQYXJzZSA9IEludGVybmFsUGFyc2UKKworCitkZWYgX0FkZElzSW5pdGlhbGl6ZWRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIHRoZSBJc0luaXRpYWxpemVkIGFuZCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvciBtZXRob2RzIHRvIHRoZQorICBwcm90b2NvbCBtZXNzYWdlIGNsYXNzLiIiIgorCisgIHJlcXVpcmVkX2ZpZWxkcyA9IFtmaWVsZCBmb3IgZmllbGQgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVFVSVJFRF0KKworICBkZWYgSXNJbml0aWFsaXplZChzZWxmLCBlcnJvcnM9Tm9uZSk6CisgICAgIiIiQ2hlY2tzIGlmIGFsbCByZXF1aXJlZCBmaWVsZHMgb2YgYSBtZXNzYWdlIGFyZSBzZXQuCisKKyAgICBBcmdzOgorICAgICAgZXJyb3JzOiAgQSBsaXN0IHdoaWNoLCBpZiBwcm92aWRlZCwgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgZmllbGQKKyAgICAgICAgICAgICAgIHBhdGhzIG9mIGFsbCBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKworICAgIFJldHVybnM6CisgICAgICBUcnVlIGlmZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaGFzIGFsbCByZXF1aXJlZCBmaWVsZHMgc2V0LgorICAgICIiIgorCisgICAgIyBQZXJmb3JtYW5jZSBpcyBjcml0aWNhbCBzbyB3ZSBhdm9pZCBIYXNGaWVsZCgpIGFuZCBMaXN0RmllbGRzKCkuCisKKyAgICBmb3IgZmllbGQgaW4gcmVxdWlyZWRfZmllbGRzOgorICAgICAgaWYgKGZpZWxkIG5vdCBpbiBzZWxmLl9maWVsZHMgb3IKKyAgICAgICAgICAoZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UgYW5kCisgICAgICAgICAgIG5vdCBzZWxmLl9maWVsZHNbZmllbGRdLl9pc19wcmVzZW50X2luX3BhcmVudCkpOgorICAgICAgICBpZiBlcnJvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgZXJyb3JzLmV4dGVuZChzZWxmLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGZvciBmaWVsZCwgdmFsdWUgaW4gc2VsZi5fZmllbGRzLml0ZXJpdGVtcygpOgorICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgICBpZiBub3QgZWxlbWVudC5Jc0luaXRpYWxpemVkKCk6CisgICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpCisgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbGlmIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudCBhbmQgbm90IHZhbHVlLklzSW5pdGlhbGl6ZWQoKToKKyAgICAgICAgICBpZiBlcnJvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpCisgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICByZXR1cm4gVHJ1ZQorCisgIGNscy5Jc0luaXRpYWxpemVkID0gSXNJbml0aWFsaXplZAorCisgIGRlZiBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc2VsZik6CisgICAgIiIiRmluZHMgcmVxdWlyZWQgZmllbGRzIHdoaWNoIGFyZSBub3QgaW5pdGlhbGl6ZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBsaXN0IG9mIHN0cmluZ3MuICBFYWNoIHN0cmluZyBpcyBhIHBhdGggdG8gYW4gdW5pbml0aWFsaXplZCBmaWVsZCBmcm9tCisgICAgICB0aGUgdG9wLWxldmVsIG1lc3NhZ2UsIGUuZy4gImZvby5iYXJbNV0uYmF6Ii4KKyAgICAiIiIKKworICAgIGVycm9ycyA9IFtdICAjIHNpbXBsaWZ5IHRoaW5ncworCisgICAgZm9yIGZpZWxkIGluIHJlcXVpcmVkX2ZpZWxkczoKKyAgICAgIGlmIG5vdCBzZWxmLkhhc0ZpZWxkKGZpZWxkLm5hbWUpOgorICAgICAgICBlcnJvcnMuYXBwZW5kKGZpZWxkLm5hbWUpCisKKyAgICBmb3IgZmllbGQsIHZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgorICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICAgICAgICBuYW1lID0gIiglcykiICUgZmllbGQuZnVsbF9uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgbmFtZSA9IGZpZWxkLm5hbWUKKworICAgICAgICBpZiBmaWVsZC5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4odmFsdWUpKToKKyAgICAgICAgICAgIGVsZW1lbnQgPSB2YWx1ZVtpXQorICAgICAgICAgICAgcHJlZml4ID0gIiVzWyVkXS4iICUgKG5hbWUsIGkpCisgICAgICAgICAgICBzdWJfZXJyb3JzID0gZWxlbWVudC5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKQorICAgICAgICAgICAgZXJyb3JzICs9IFsgcHJlZml4ICsgZXJyb3IgZm9yIGVycm9yIGluIHN1Yl9lcnJvcnMgXQorICAgICAgICBlbHNlOgorICAgICAgICAgIHByZWZpeCA9IG5hbWUgKyAiLiIKKyAgICAgICAgICBzdWJfZXJyb3JzID0gdmFsdWUuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkKKyAgICAgICAgICBlcnJvcnMgKz0gWyBwcmVmaXggKyBlcnJvciBmb3IgZXJyb3IgaW4gc3ViX2Vycm9ycyBdCisKKyAgICByZXR1cm4gZXJyb3JzCisKKyAgY2xzLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycyA9IEZpbmRJbml0aWFsaXphdGlvbkVycm9ycworCisKK2RlZiBfQWRkTWVyZ2VGcm9tTWV0aG9kKGNscyk6CisgIExBQkVMX1JFUEVBVEVEID0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRAorICBDUFBUWVBFX01FU1NBR0UgPSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRQorCisgIGRlZiBNZXJnZUZyb20oc2VsZiwgbXNnKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZShtc2csIGNscyk6CisgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgIlBhcmFtZXRlciB0byBNZXJnZUZyb20oKSBtdXN0IGJlIGluc3RhbmNlIG9mIHNhbWUgY2xhc3M6ICIKKyAgICAgICAgICAiZXhwZWN0ZWQgJXMgZ290ICVzLiIgJSAoY2xzLl9fbmFtZV9fLCB0eXBlKG1zZykuX19uYW1lX18pKQorCisgICAgYXNzZXJ0IG1zZyBpcyBub3Qgc2VsZgorICAgIHNlbGYuX01vZGlmaWVkKCkKKworICAgIGZpZWxkcyA9IHNlbGYuX2ZpZWxkcworCisgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBtc2cuX2ZpZWxkcy5pdGVyaXRlbXMoKToKKyAgICAgIGlmIGZpZWxkLmxhYmVsID09IExBQkVMX1JFUEVBVEVEOgorICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkcy5nZXQoZmllbGQpCisgICAgICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgIyBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGlzIGZpZWxkLgorICAgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgICBmaWVsZHNbZmllbGRdID0gZmllbGRfdmFsdWUKKyAgICAgICAgZmllbGRfdmFsdWUuTWVyZ2VGcm9tKHZhbHVlKQorICAgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudDoKKyAgICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkcy5nZXQoZmllbGQpCisgICAgICAgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KKyAgICAgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgICAgIGZpZWxkc1tmaWVsZF0gPSBmaWVsZF92YWx1ZQorICAgICAgICAgIGZpZWxkX3ZhbHVlLk1lcmdlRnJvbSh2YWx1ZSkKKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSB2YWx1ZQorCisgICAgaWYgbXNnLl91bmtub3duX2ZpZWxkczoKKyAgICAgIGlmIG5vdCBzZWxmLl91bmtub3duX2ZpZWxkczoKKyAgICAgICAgc2VsZi5fdW5rbm93bl9maWVsZHMgPSBbXQorICAgICAgc2VsZi5fdW5rbm93bl9maWVsZHMuZXh0ZW5kKG1zZy5fdW5rbm93bl9maWVsZHMpCisKKyAgY2xzLk1lcmdlRnJvbSA9IE1lcmdlRnJvbQorCisKK2RlZiBfQWRkTWVzc2FnZU1ldGhvZHMobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIGltcGxlbWVudGF0aW9ucyBvZiBhbGwgTWVzc2FnZSBtZXRob2RzIHRvIGNscy4iIiIKKyAgX0FkZExpc3RGaWVsZHNNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRIYXNGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZENsZWFyRmllbGRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIGlmIG1lc3NhZ2VfZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgorICAgIF9BZGRDbGVhckV4dGVuc2lvbk1ldGhvZChjbHMpCisgICAgX0FkZEhhc0V4dGVuc2lvbk1ldGhvZChjbHMpCisgIF9BZGRDbGVhck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZEVxdWFsc01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZFN0ck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZFVuaWNvZGVNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRTZXRMaXN0ZW5lck1ldGhvZChjbHMpCisgIF9BZGRCeXRlU2l6ZU1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZFNlcmlhbGl6ZVRvU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkTWVyZ2VGcm9tU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkSXNJbml0aWFsaXplZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZE1lcmdlRnJvbU1ldGhvZChjbHMpCisKKworZGVmIF9BZGRQcml2YXRlSGVscGVyTWV0aG9kcyhjbHMpOgorICAiIiJBZGRzIGltcGxlbWVudGF0aW9uIG9mIHByaXZhdGUgaGVscGVyIG1ldGhvZHMgdG8gY2xzLiIiIgorCisgIGRlZiBNb2RpZmllZChzZWxmKToKKyAgICAiIiJTZXRzIHRoZSBfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSBiaXQgdG8gdHJ1ZSwKKyAgICBhbmQgcHJvcGFnYXRlcyB0aGlzIHRvIG91ciBsaXN0ZW5lciBpZmYgdGhpcyB3YXMgYSBzdGF0ZSBjaGFuZ2UuCisgICAgIiIiCisKKyAgICAjIE5vdGU6ICBTb21lIGNhbGxlcnMgY2hlY2sgX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgYmVmb3JlIGNhbGxpbmcKKyAgICAjICAgX01vZGlmaWVkKCkgYXMgYW4gZXh0cmEgb3B0aW1pemF0aW9uLiAgU28sIGlmIHRoaXMgbWV0aG9kIGlzIGV2ZXIKKyAgICAjICAgY2hhbmdlZCBzdWNoIHRoYXQgaXQgZG9lcyBzdHVmZiBldmVuIHdoZW4gX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgaXMKKyAgICAjICAgYWxyZWFkeSB0cnVlLCB0aGUgY2FsbGVycyBuZWVkIHRvIGJlIHVwZGF0ZWQuCisgICAgaWYgbm90IHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHk6CisgICAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5ID0gVHJ1ZQorICAgICAgc2VsZi5fbGlzdGVuZXJfZm9yX2NoaWxkcmVuLmRpcnR5ID0gVHJ1ZQorICAgICAgc2VsZi5faXNfcHJlc2VudF9pbl9wYXJlbnQgPSBUcnVlCisgICAgICBzZWxmLl9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgY2xzLl9Nb2RpZmllZCA9IE1vZGlmaWVkCisgIGNscy5TZXRJblBhcmVudCA9IE1vZGlmaWVkCisKKworY2xhc3MgX0xpc3RlbmVyKG9iamVjdCk6CisKKyAgIiIiTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uIHRoYXQgYSBwYXJlbnQgbWVzc2FnZSByZWdpc3RlcnMgd2l0aCBpdHMKKyAgY2hpbGQgbWVzc2FnZS4KKworICBJbiBvcmRlciB0byBzdXBwb3J0IHNlbWFudGljcyBsaWtlOgorCisgICAgZm9vLmJhci5iYXoucXV4ID0gMjMKKyAgICBhc3NlcnQgZm9vLkhhc0ZpZWxkKCdiYXInKQorCisgIC4uLmNoaWxkIG9iamVjdHMgbXVzdCBoYXZlIGJhY2sgcmVmZXJlbmNlcyB0byB0aGVpciBwYXJlbnRzLgorICBUaGlzIGhlbHBlciBjbGFzcyBpcyBhdCB0aGUgaGVhcnQgb2YgdGhpcyBzdXBwb3J0LgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50X21lc3NhZ2UpOgorICAgICIiIkFyZ3M6CisgICAgICBwYXJlbnRfbWVzc2FnZTogVGhlIG1lc3NhZ2Ugd2hvc2UgX01vZGlmaWVkKCkgbWV0aG9kIHdlIHNob3VsZCBjYWxsIHdoZW4KKyAgICAgICAgd2UgcmVjZWl2ZSBNb2RpZmllZCgpIG1lc3NhZ2VzLgorICAgICIiIgorICAgICMgVGhpcyBsaXN0ZW5lciBlc3RhYmxpc2hlcyBhIGJhY2sgcmVmZXJlbmNlIGZyb20gYSBjaGlsZCAoY29udGFpbmVkKSBvYmplY3QKKyAgICAjIHRvIGl0cyBwYXJlbnQgKGNvbnRhaW5pbmcpIG9iamVjdC4gIFdlIG1ha2UgdGhpcyBhIHdlYWsgcmVmZXJlbmNlIHRvIGF2b2lkCisgICAgIyBjcmVhdGluZyBjeWNsaWMgZ2FyYmFnZSB3aGVuIHRoZSBjbGllbnQgZmluaXNoZXMgd2l0aCB0aGUgJ3BhcmVudCcgb2JqZWN0CisgICAgIyBpbiB0aGUgdHJlZS4KKyAgICBpZiBpc2luc3RhbmNlKHBhcmVudF9tZXNzYWdlLCB3ZWFrcmVmLlByb3h5VHlwZSk6CisgICAgICBzZWxmLl9wYXJlbnRfbWVzc2FnZV93ZWFrcmVmID0gcGFyZW50X21lc3NhZ2UKKyAgICBlbHNlOgorICAgICAgc2VsZi5fcGFyZW50X21lc3NhZ2Vfd2Vha3JlZiA9IHdlYWtyZWYucHJveHkocGFyZW50X21lc3NhZ2UpCisKKyAgICAjIEFzIGFuIG9wdGltaXphdGlvbiwgd2UgYWxzbyBpbmRpY2F0ZSBkaXJlY3RseSBvbiB0aGUgbGlzdGVuZXIgd2hldGhlcgorICAgICMgb3Igbm90IHRoZSBwYXJlbnQgbWVzc2FnZSBpcyBkaXJ0eS4gIFRoaXMgd2F5IHdlIGNhbiBhdm9pZCB0cmF2ZXJzaW5nCisgICAgIyB1cCB0aGUgdHJlZSBpbiB0aGUgY29tbW9uIGNhc2UuCisgICAgc2VsZi5kaXJ0eSA9IEZhbHNlCisKKyAgZGVmIE1vZGlmaWVkKHNlbGYpOgorICAgIGlmIHNlbGYuZGlydHk6CisgICAgICByZXR1cm4KKyAgICB0cnk6CisgICAgICAjIFByb3BhZ2F0ZSB0aGUgc2lnbmFsIHRvIG91ciBwYXJlbnRzIGlmZiB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCBzZXQuCisgICAgICBzZWxmLl9wYXJlbnRfbWVzc2FnZV93ZWFrcmVmLl9Nb2RpZmllZCgpCisgICAgZXhjZXB0IFJlZmVyZW5jZUVycm9yOgorICAgICAgIyBXZSBjYW4gZ2V0IGhlcmUgaWYgYSBjbGllbnQgaGFzIGtlcHQgYSByZWZlcmVuY2UgdG8gYSBjaGlsZCBvYmplY3QsCisgICAgICAjIGFuZCBpcyBub3cgc2V0dGluZyBhIGZpZWxkIG9uIGl0LCBidXQgdGhlIGNoaWxkJ3MgcGFyZW50IGhhcyBiZWVuCisgICAgICAjIGdhcmJhZ2UtY29sbGVjdGVkLiAgVGhpcyBpcyBub3QgYW4gZXJyb3IuCisgICAgICBwYXNzCisKKworIyBUT0RPKHJvYmluc29uKTogTW92ZSBlbHNld2hlcmU/ICBUaGlzIGZpbGUgaXMgZ2V0dGluZyBwcmV0dHkgcmlkaWN1bG91cy4uLgorIyBUT0RPKHJvYmluc29uKTogVW5pZnkgZXJyb3IgaGFuZGxpbmcgb2YgInVua25vd24gZXh0ZW5zaW9uIiBjcmFwLgorIyBUT0RPKHJvYmluc29uKTogU3VwcG9ydCBpdGVyaXRlbXMoKS1zdHlsZSBpdGVyYXRpb24gb3ZlciBhbGwKKyMgZXh0ZW5zaW9ucyB3aXRoIHRoZSAiaGFzIiBiaXRzIHR1cm5lZCBvbj8KK2NsYXNzIF9FeHRlbnNpb25EaWN0KG9iamVjdCk6CisKKyAgIiIiRGljdC1saWtlIGNvbnRhaW5lciBmb3Igc3VwcG9ydGluZyBhbiBpbmRleGFibGUgIkV4dGVuc2lvbnMiCisgIGZpZWxkIG9uIHByb3RvIGluc3RhbmNlcy4KKworICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzIHdlIGV4cGVjdCBleHRlbnNpb24gaGFuZGxlcyB0byBiZQorICBGaWVsZERlc2NyaXB0b3JzLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZXh0ZW5kZWRfbWVzc2FnZSk6CisgICAgIiIiZXh0ZW5kZWRfbWVzc2FnZTogTWVzc2FnZSBpbnN0YW5jZSBmb3Igd2hpY2ggd2UgYXJlIHRoZSBFeHRlbnNpb25zIGRpY3QuCisgICAgIiIiCisKKyAgICBzZWxmLl9leHRlbmRlZF9tZXNzYWdlID0gZXh0ZW5kZWRfbWVzc2FnZQorCisgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICAiIiJSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbiBleHRlbnNpb24gaGFuZGxlLiIiIgorCisgICAgX1ZlcmlmeUV4dGVuc2lvbkhhbmRsZShzZWxmLl9leHRlbmRlZF9tZXNzYWdlLCBleHRlbnNpb25faGFuZGxlKQorCisgICAgcmVzdWx0ID0gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZmllbGRzLmdldChleHRlbnNpb25faGFuZGxlKQorICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgIHJldHVybiByZXN1bHQKKworICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbl9oYW5kbGUuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZSkKKyAgICBlbGlmIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICByZXN1bHQgPSBleHRlbnNpb25faGFuZGxlLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKQorICAgICAgdHJ5OgorICAgICAgICByZXN1bHQuX1NldExpc3RlbmVyKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbikKKyAgICAgIGV4Y2VwdCBSZWZlcmVuY2VFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAjIFNpbmd1bGFyIHNjYWxhciAtLSBqdXN0IHJldHVybiB0aGUgZGVmYXVsdCB3aXRob3V0IGluc2VydGluZyBpbnRvIHRoZQorICAgICAgIyBkaWN0LgorICAgICAgcmV0dXJuIGV4dGVuc2lvbl9oYW5kbGUuZGVmYXVsdF92YWx1ZQorCisgICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKKyAgICAjIGluIHRoZSBuZXcgb2JqZWN0IHdlIGp1c3QgY3JlYXRlZC4gIElmIHNvbWVvbmUgaGFzIHByZWVtcHRlZCB1cywgd2UKKyAgICAjIHRha2UgdGhhdCBvYmplY3QgYW5kIGRpc2NhcmQgb3Vycy4KKyAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCisgICAgIyAgIGluIENQeXRob24gYnV0IHdlIGhhdmVuJ3QgaW52ZXN0aWdhdGVkIG90aGVycy4gIFRoaXMgd2FybmluZyBhcHBlYXJzCisgICAgIyAgIGluIHNldmVyYWwgb3RoZXIgbG9jYXRpb25zIGluIHRoaXMgZmlsZS4KKyAgICByZXN1bHQgPSBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHMuc2V0ZGVmYXVsdCgKKyAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZSwgcmVzdWx0KQorCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CisgICAgICByZXR1cm4gRmFsc2UKKworICAgIG15X2ZpZWxkcyA9IHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuTGlzdEZpZWxkcygpCisgICAgb3RoZXJfZmllbGRzID0gb3RoZXIuX2V4dGVuZGVkX21lc3NhZ2UuTGlzdEZpZWxkcygpCisKKyAgICAjIEdldCByaWQgb2Ygbm9uLWV4dGVuc2lvbiBmaWVsZHMuCisgICAgbXlfZmllbGRzICAgID0gWyBmaWVsZCBmb3IgZmllbGQgaW4gbXlfZmllbGRzICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbiBdCisgICAgb3RoZXJfZmllbGRzID0gWyBmaWVsZCBmb3IgZmllbGQgaW4gb3RoZXJfZmllbGRzIGlmIGZpZWxkLmlzX2V4dGVuc2lvbiBdCisKKyAgICByZXR1cm4gbXlfZmllbGRzID09IG90aGVyX2ZpZWxkcworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKKworICAjIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igbm9uLXJlcGVhdGVkLCBzY2FsYXIgZXh0ZW5zaW9uCisgICMgZmllbGRzLiAgTm90ZSBhbHNvIHRoYXQgd2UgbWF5IGhhdmUgdG8gY2FsbCBfTW9kaWZpZWQoKSB3aGVuIHdlIGRvCisgICMgc3VjY2Vzc2Z1bGx5IHNldCBhIGZpZWxkIHRoaXMgd2F5LCB0byBzZXQgYW55IG5lY3NzYXJ5ICJoYXMiIGJpdHMgaW4gdGhlCisgICMgYW5jZXN0b3JzIG9mIHRoZSBleHRlbmRlZCBtZXNzYWdlLgorICBkZWYgX19zZXRpdGVtX18oc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSwgdmFsdWUpOgorICAgICIiIklmIGV4dGVuc2lvbl9oYW5kbGUgc3BlY2lmaWVzIGEgbm9uLXJlcGVhdGVkLCBzY2FsYXIgZXh0ZW5zaW9uCisgICAgZmllbGQsIHNldHMgdGhlIHZhbHVlIG9mIHRoYXQgZmllbGQuCisgICAgIiIiCisKKyAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgICBpZiAoZXh0ZW5zaW9uX2hhbmRsZS5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEIG9yCisgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UpOgorICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICdDYW5ub3QgYXNzaWduIHRvIGV4dGVuc2lvbiAiJXMiIGJlY2F1c2UgaXQgaXMgYSByZXBlYXRlZCBvciAnCisgICAgICAgICAgJ2NvbXBvc2l0ZSB0eXBlLicgJSBleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSkKKworICAgICMgSXQncyBzbGlnaHRseSB3YXN0ZWZ1bCB0byBsb29rdXAgdGhlIHR5cGUgY2hlY2tlciBlYWNoIHRpbWUsCisgICAgIyBidXQgd2UgZXhwZWN0IHRoaXMgdG8gYmUgYSB2YW5pc2hpbmdseSB1bmNvbW1vbiBjYXNlIGFueXdheS4KKyAgICB0eXBlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXJzLkdldFR5cGVDaGVja2VyKAorICAgICAgICBleHRlbnNpb25faGFuZGxlLmNwcF90eXBlLCBleHRlbnNpb25faGFuZGxlLnR5cGUpCisgICAgdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpCisgICAgc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZmllbGRzW2V4dGVuc2lvbl9oYW5kbGVdID0gdmFsdWUKKyAgICBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9Nb2RpZmllZCgpCisKKyAgZGVmIF9GaW5kRXh0ZW5zaW9uQnlOYW1lKHNlbGYsIG5hbWUpOgorICAgICIiIlRyaWVzIHRvIGZpbmQgYSBrbm93biBleHRlbnNpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogRXh0ZW5zaW9uIGZ1bGwgbmFtZS4KKworICAgIFJldHVybnM6CisgICAgICBFeHRlbnNpb24gZmllbGQgZGVzY3JpcHRvci4KKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZXh0ZW5zaW9uc19ieV9uYW1lLmdldChuYW1lLCBOb25lKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fY3BwX2dlbmVyYXRlZF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fY3BwX2dlbmVyYXRlZF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhMGE1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl9jcHBfZ2VuZXJhdGVkX3Rlc3QucHkKQEAgLTAsMCArMSw5MSBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXR0ZXN0IGZvciByZWZsZWN0aW9uLnB5LCB3aGljaCB0ZXN0cyB0aGUgZ2VuZXJhdGVkIEMrKyBpbXBsZW1lbnRhdGlvbi4iIiIKKworX19hdXRob3JfXyA9ICdqYXNvbmhAZ29vZ2xlLmNvbSAoSmFzb24gSHN1ZWgpJworCitpbXBvcnQgb3MKK29zLmVudmlyb25bJ1BST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OJ10gPSAnY3BwJworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtb3JlX2V4dGVuc2lvbnNfZHluYW1pY19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtb3JlX2V4dGVuc2lvbnNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5yZWZsZWN0aW9uX3Rlc3QgaW1wb3J0ICoKKworCitjbGFzcyBSZWZsZWN0aW9uQ3BwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgIGRlZiB0ZXN0SW1wbGVtZW50YXRpb25TZXR0aW5nKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2NwcCcsIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25PZkdlbmVyYXRlZFR5cGVJbkR5bmFtaWNGaWxlKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgYSBmaWxlIGJ1aWx0IGR5bmFtaWNhbGx5IGNhbiBleHRlbmQgYSBnZW5lcmF0ZWQgQysrIHR5cGUuCisKKyAgICBUaGUgQysrIGltcGxlbWVudGF0aW9uIHVzZXMgYSBEZXNjcmlwdG9yUG9vbCB0aGF0IGhhcyB0aGUgZ2VuZXJhdGVkCisgICAgRGVzY3JpcHRvclBvb2wgYXMgYW4gdW5kZXJsYXkuIFR5cGljYWxseSwgYSB0eXBlIGNhbiBvbmx5IGZpbmQKKyAgICBleHRlbnNpb25zIGluIGl0cyBvd24gcG9vbC4gV2l0aCB0aGUgcHl0aG9uIEMtZXh0ZW5zaW9uLCB0aGUgZ2VuZXJhdGVkIEMrKworICAgIGV4dGVuZGVlIG1heSBiZSBhdmFpbGFibGUsIGJ1dCBub3QgdGhlIGV4dGVuc2lvbi4gVGhpcyB0ZXN0cyB0aGF0IHRoZQorICAgIEMtZXh0ZW5zaW9uIGltcGxlbWVudHMgdGhlIGNvcnJlY3Qgc3BlY2lhbCBoYW5kbGluZyB0byBtYWtlIHN1Y2ggZXh0ZW5zaW9ucworICAgIGF2YWlsYWJsZS4KKyAgICAiIiIKKyAgICBwYjEgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLkV4dGVuZGVkTWVzc2FnZSgpCisgICAgIyBUZXN0IHRoYXQgYmFzaWMgYWNjZXNzb3JzIHdvcmsuCisgICAgc2VsZi5hc3NlcnRGYWxzZSgKKyAgICAgICAgcGIxLkhhc0V4dGVuc2lvbihtb3JlX2V4dGVuc2lvbnNfZHluYW1pY19wYjIuZHluYW1pY19pbnQzMl9leHRlbnNpb24pKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIHBiMS5IYXNFeHRlbnNpb24obW9yZV9leHRlbnNpb25zX2R5bmFtaWNfcGIyLmR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24pKQorICAgIHBiMS5FeHRlbnNpb25zW21vcmVfZXh0ZW5zaW9uc19keW5hbWljX3BiMi5keW5hbWljX2ludDMyX2V4dGVuc2lvbl0gPSAxNworICAgIHBiMS5FeHRlbnNpb25zW21vcmVfZXh0ZW5zaW9uc19keW5hbWljX3BiMi5keW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uXS5hID0gMjQKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIHBiMS5IYXNFeHRlbnNpb24obW9yZV9leHRlbnNpb25zX2R5bmFtaWNfcGIyLmR5bmFtaWNfaW50MzJfZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIHBiMS5IYXNFeHRlbnNpb24obW9yZV9leHRlbnNpb25zX2R5bmFtaWNfcGIyLmR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24pKQorCisgICAgIyBOb3cgc2VyaWFsaXplIHRoZSBkYXRhIGFuZCBwYXJzZSB0byBhIG5ldyBtZXNzYWdlLgorICAgIHBiMiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuRXh0ZW5kZWRNZXNzYWdlKCkKKyAgICBwYjIuTWVyZ2VGcm9tU3RyaW5nKHBiMS5TZXJpYWxpemVUb1N0cmluZygpKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBwYjIuSGFzRXh0ZW5zaW9uKG1vcmVfZXh0ZW5zaW9uc19keW5hbWljX3BiMi5keW5hbWljX2ludDMyX2V4dGVuc2lvbikpCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBwYjIuSGFzRXh0ZW5zaW9uKG1vcmVfZXh0ZW5zaW9uc19keW5hbWljX3BiMi5keW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAxNywgcGIyLkV4dGVuc2lvbnNbbW9yZV9leHRlbnNpb25zX2R5bmFtaWNfcGIyLmR5bmFtaWNfaW50MzJfZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAyNCwKKyAgICAgICAgcGIyLkV4dGVuc2lvbnNbbW9yZV9leHRlbnNpb25zX2R5bmFtaWNfcGIyLmR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb25dLmEpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZDI4NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fdGVzdC5weQpAQCAtMCwwICsxLDI2NzEgQEAKKyMhIC91c3IvYmluL3B5dGhvbgorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0dGVzdCBmb3IgcmVmbGVjdGlvbi5weSwgd2hpY2ggYWxzbyBpbmRpcmVjdGx5IHRlc3RzIHRoZSBvdXRwdXQgb2YgdGhlCitwdXJlLVB5dGhvbiBwcm90b2NvbCBjb21waWxlci4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitpbXBvcnQgZ2MKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHN0cnVjdAorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1vcmVfZXh0ZW5zaW9uc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtb3JlX21lc3NhZ2VzX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZGVjb2RlcgorCisKK2NsYXNzIF9NaW5pRGVjb2RlcihvYmplY3QpOgorICAiIiJEZWNvZGVzIGEgc3RyZWFtIG9mIHZhbHVlcyBmcm9tIGEgc3RyaW5nLgorCisgIE9uY2UgdXBvbiBhIHRpbWUgd2UgYWN0dWFsbHkgaGFkIGEgY2xhc3MgY2FsbGVkIGRlY29kZXIuRGVjb2Rlci4gIFRoZW4gd2UKKyAgZ290IHJpZCBvZiBpdCBkdXJpbmcgYSByZWRlc2lnbiB0aGF0IG1hZGUgZGVjb2RpbmcgbXVjaCwgbXVjaCBmYXN0ZXIgb3ZlcmFsbC4KKyAgQnV0IGEgY291cGxlIHRlc3RzIGluIHRoaXMgZmlsZSB1c2VkIGl0IHRvIGNoZWNrIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZgorICBhIG1lc3NhZ2Ugd2FzIGNvcnJlY3QuICBTbywgdGhpcyBjbGFzcyBpbXBsZW1lbnRzIGp1c3QgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlCisgIHVzZWQgYnkgc2FpZCB0ZXN0cywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJld3JpdGUgdGhlIHRlc3RzLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZXMpOgorICAgIHNlbGYuX2J5dGVzID0gYnl0ZXMKKyAgICBzZWxmLl9wb3MgPSAwCisKKyAgZGVmIFJlYWRWYXJpbnQoc2VsZik6CisgICAgcmVzdWx0LCBzZWxmLl9wb3MgPSBkZWNvZGVyLl9EZWNvZGVWYXJpbnQoc2VsZi5fYnl0ZXMsIHNlbGYuX3BvcykKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgUmVhZEludDMyID0gUmVhZFZhcmludAorICBSZWFkSW50NjQgPSBSZWFkVmFyaW50CisgIFJlYWRVSW50MzIgPSBSZWFkVmFyaW50CisgIFJlYWRVSW50NjQgPSBSZWFkVmFyaW50CisKKyAgZGVmIFJlYWRTSW50NjQoc2VsZik6CisgICAgcmV0dXJuIHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZShzZWxmLlJlYWRWYXJpbnQoKSkKKworICBSZWFkU0ludDMyID0gUmVhZFNJbnQ2NAorCisgIGRlZiBSZWFkRmllbGROdW1iZXJBbmRXaXJlVHlwZShzZWxmKToKKyAgICByZXR1cm4gd2lyZV9mb3JtYXQuVW5wYWNrVGFnKHNlbGYuUmVhZFZhcmludCgpKQorCisgIGRlZiBSZWFkRmxvYXQoc2VsZik6CisgICAgcmVzdWx0ID0gc3RydWN0LnVucGFjaygiPGYiLCBzZWxmLl9ieXRlc1tzZWxmLl9wb3M6c2VsZi5fcG9zKzRdKVswXQorICAgIHNlbGYuX3BvcyArPSA0CisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBSZWFkRG91YmxlKHNlbGYpOgorICAgIHJlc3VsdCA9IHN0cnVjdC51bnBhY2soIjxkIiwgc2VsZi5fYnl0ZXNbc2VsZi5fcG9zOnNlbGYuX3Bvcys4XSlbMF0KKyAgICBzZWxmLl9wb3MgKz0gOAorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgRW5kT2ZTdHJlYW0oc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX3BvcyA9PSBsZW4oc2VsZi5fYnl0ZXMpCisKKworY2xhc3MgUmVmbGVjdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBhc3NlcnRMaXN0c0VxdWFsKHNlbGYsIHZhbHVlcywgb3RoZXJzKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCBsZW4ob3RoZXJzKSkKKyAgICBmb3IgaSBpbiByYW5nZShsZW4odmFsdWVzKSk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1tpXSwgb3RoZXJzW2ldKQorCisgIGRlZiB0ZXN0U2NhbGFyQ29uc3RydWN0b3Ioc2VsZik6CisgICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgc2NhbGFyIHR5cGVzIHNob3VsZCBzdWNjZWVkLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgb3B0aW9uYWxfaW50MzI9MjQsCisgICAgICAgIG9wdGlvbmFsX2RvdWJsZT01NC4zMjEsCisgICAgICAgIG9wdGlvbmFsX3N0cmluZz0nb3B0aW9uYWxfc3RyaW5nJykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjQsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTQuMzIxLCBwcm90by5vcHRpb25hbF9kb3VibGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb3B0aW9uYWxfc3RyaW5nJywgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRTY2FsYXJDb25zdHJ1Y3RvcihzZWxmKToKKyAgICAjIENvbnN0cnVjdG9yIHdpdGggb25seSByZXBlYXRlZCBzY2FsYXIgdHlwZXMgc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICByZXBlYXRlZF9pbnQzMj1bMSwgMiwgMywgNF0sCisgICAgICAgIHJlcGVhdGVkX2RvdWJsZT1bMS4yMywgNTQuMzIxXSwKKyAgICAgICAgcmVwZWF0ZWRfYm9vbD1bVHJ1ZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgcmVwZWF0ZWRfc3RyaW5nPVsib3B0aW9uYWxfc3RyaW5nIl0pCisKKyAgICBzZWxmLmFzc2VydEVxdWFscyhbMSwgMiwgMywgNF0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsxLjIzLCA1NC4zMjFdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoW1RydWUsIEZhbHNlLCBGYWxzZV0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfYm9vbCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoWyJvcHRpb25hbF9zdHJpbmciXSwgbGlzdChwcm90by5yZXBlYXRlZF9zdHJpbmcpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVDb25zdHJ1Y3RvcihzZWxmKToKKyAgICAjIENvbnN0cnVjdG9yIHdpdGggb25seSByZXBlYXRlZCBjb21wb3NpdGUgdHlwZXMgc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZT1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKV0sCisgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZT1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0tNDMpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSwKKyAgICAgICAgcmVwZWF0ZWRncm91cD1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cChhPTEpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKGE9MildKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIFt1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTyksCisgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIpXSwKKyAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIFt1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0tNDMpLAorICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAorICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSwKKyAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBbdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKCksCisgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoYT0xKSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cChhPTIpXSwKKyAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZGdyb3VwKSkKKworICBkZWYgdGVzdE1peGVkQ29uc3RydWN0b3Ioc2VsZik6CisgICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgbWl4ZWQgdHlwZXMgc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICBvcHRpb25hbF9pbnQzMj0yNCwKKyAgICAgICAgb3B0aW9uYWxfc3RyaW5nPSdvcHRpb25hbF9zdHJpbmcnLAorICAgICAgICByZXBlYXRlZF9kb3VibGU9WzEuMjMsIDU0LjMyMV0sCisgICAgICAgIHJlcGVhdGVkX2Jvb2w9W1RydWUsIEZhbHNlLCBGYWxzZV0sCisgICAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlPVsKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTyksCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIpXSwKKyAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlPVsKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPS00MyksCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz00NTMyNCksCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xMildKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyNCwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb3B0aW9uYWxfc3RyaW5nJywgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsxLjIzLCA1NC4zMjFdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoW1RydWUsIEZhbHNlLCBGYWxzZV0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfYm9vbCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIFt1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTyksCisgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIpXSwKKyAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIFt1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0tNDMpLAorICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAorICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSwKKyAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpKQorCisgIGRlZiB0ZXN0Q29uc3RydWN0b3JUeXBlRXJyb3Ioc2VsZik6CisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgb3B0aW9uYWxfaW50MzI9ImZvbyIpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgb3B0aW9uYWxfc3RyaW5nPTEyMzQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U9MTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9pbnQzMj0xMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX2ludDMyPVsiZm9vIl0pCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfc3RyaW5nPTEyMzQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfc3RyaW5nPVsxMjM0XSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZT0xMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlPVsxMjM0XSkKKworICBkZWYgdGVzdENvbnN0cnVjdG9ySW52YWxpZGF0ZXNDYWNoZWRCeXRlU2l6ZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhvcHRpb25hbF9pbnQzMiA9IDEyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKHJlcGVhdGVkX2ludDMyID0gWzEyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygzLCBtZXNzYWdlLkJ5dGVTaXplKCkpCisKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPSBbdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKCldKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFNpbXBsZUhhc0JpdHMoc2VsZik6CisgICAgIyBUZXN0IGEgc2NhbGFyLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgICMgSGFzRmllbGQoKSBzaG91bGRuJ3QgYmUgdHJ1ZSBpZiBhbGwgd2UndmUgZG9uZSBpcworICAgICMgcmVhZCB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQorICAgICMgU2V0dGluZyBhIHZhbHVlIGhvd2V2ZXIgKnNob3VsZCogc2V0IHRoZSAiaGFzIiBiaXQuCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ludDMyJykKKyAgICAjIEFuZCBjbGVhcmluZyB0aGF0IHZhbHVlIHNob3VsZCB1bnNldCB0aGUgImhhcyIgYml0LgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCisKKyAgZGVmIHRlc3RIYXNCaXRzV2l0aFNpbmdseU5lc3RlZFNjYWxhcihzZWxmKToKKyAgICAjIEhlbHBlciB1c2VkIHRvIHRlc3QgZm9yZWlnbiBtZXNzYWdlcyBhbmQgZ3JvdXBzLgorICAgICMKKyAgICAjIGNvbXBvc2l0ZV9maWVsZF9uYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIG5vbi1yZXBlYXRlZAorICAgICMgY29tcG9zaXRlIChpLmUuLCBmb3JlaWduIG9yIGdyb3VwKSBmaWVsZCBpbiBUZXN0QWxsVHlwZXMsCisgICAgIyBhbmQgc2NhbGFyX2ZpZWxkX25hbWUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGFuIGludGVnZXItdmFsdWVkCisgICAgIyBzY2FsYXIgZmllbGQgd2l0aGluIHRoYXQgY29tcG9zaXRlLgorICAgICMKKyAgICAjIEkgbmV2ZXIgdGhvdWdodCBJJ2QgbWlzcyBDKysgbWFjcm9zIGFuZCB0ZW1wbGF0ZXMgc28gbXVjaC4gOigKKyAgICAjIFRoaXMgaGVscGVyIGlzIHNlbWFudGljYWxseSBqdXN0OgorICAgICMKKyAgICAjICAgYXNzZXJ0IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPT0gMAorICAgICMgICBhc3NlcnQgbm90IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZCgnc2NhbGFyX2ZpZWxkJykKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5IYXNGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKKyAgICAjCisgICAgIyAgIHByb3RvLmNvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPSAxMAorICAgICMgICBvbGRfY29tcG9zaXRlX2ZpZWxkID0gcHJvdG8uY29tcG9zaXRlX2ZpZWxkCisgICAgIworICAgICMgICBhc3NlcnQgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLnNjYWxhcl9maWVsZCA9PSAxMAorICAgICMgICBhc3NlcnQgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKCdzY2FsYXJfZmllbGQnKQorICAgICMgICBhc3NlcnQgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCisgICAgIworICAgICMgICBwcm90by5DbGVhckZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQorICAgICMKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQuSGFzRmllbGQoJ3NjYWxhcl9maWVsZCcpCisgICAgIyAgIGFzc2VydCBub3QgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCisgICAgIyAgIGFzc2VydCBwcm90by5jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID09IDAKKyAgICAjCisgICAgIyAgICMgTm93IGVuc3VyZSB0aGF0IENsZWFyRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpIGRpc2Nvbm5lY3RlZAorICAgICMgICAjIHRoZSBvbGQgZmllbGQgb2JqZWN0IGZyb20gdGhlIG9iamVjdCB0cmVlLi4uCisgICAgIyAgIGFzc2VydCBvbGRfY29tcG9zaXRlX2ZpZWxkIGlzIG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQKKyAgICAjICAgb2xkX2NvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPSAyMAorICAgICMgICBhc3NlcnQgbm90IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZCgnc2NhbGFyX2ZpZWxkJykKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5IYXNGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKKyAgICBkZWYgVGVzdENvbXBvc2l0ZUhhc0JpdHMoY29tcG9zaXRlX2ZpZWxkX25hbWUsIHNjYWxhcl9maWVsZF9uYW1lKToKKyAgICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgICAjIEZpcnN0LCBjaGVjayB0aGF0IHdlIGNhbiBnZXQgdGhlIHNjYWxhciB2YWx1ZSwgYW5kIHNlZSB0aGF0IGl0J3MgdGhlCisgICAgICAjIGRlZmF1bHQgKDApLCBidXQgdGhhdCBwcm90by5IYXNGaWVsZCgnb21wb3NpdGUnKSBhbmQKKyAgICAgICMgcHJvdG8uY29tcG9zaXRlLkhhc0ZpZWxkKCdzY2FsYXInKSB3aWxsIHN0aWxsIHJldHVybiBGYWxzZS4KKyAgICAgIGNvbXBvc2l0ZV9maWVsZCA9IGdldGF0dHIocHJvdG8sIGNvbXBvc2l0ZV9maWVsZF9uYW1lKQorICAgICAgb3JpZ2luYWxfc2NhbGFyX3ZhbHVlID0gZ2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBvcmlnaW5hbF9zY2FsYXJfdmFsdWUpCisgICAgICAjIEFzc2VydCB0aGF0IHRoZSBjb21wb3NpdGUgb2JqZWN0IGRvZXMgbm90ICJoYXZlIiB0aGUgc2NhbGFyLgorICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgIyBBc3NlcnQgdGhhdCBwcm90byBkb2VzIG5vdCAiaGF2ZSIgdGhlIGNvbXBvc2l0ZSBmaWVsZC4KKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoY29tcG9zaXRlX2ZpZWxkX25hbWUpKQorCisgICAgICAjIE5vdyBzZXQgdGhlIHNjYWxhciB3aXRoaW4gdGhlIGNvbXBvc2l0ZSBmaWVsZC4gIEVuc3VyZSB0aGF0IHRoZSBzZXR0aW5nCisgICAgICAjIGlzIHJlZmxlY3RlZCwgYW5kIHRoYXQgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZScpIGFuZAorICAgICAgIyBwcm90by5jb21wb3NpdGUuSGFzRmllbGQoJ3NjYWxhcicpIG5vdyBib3RoIHJldHVybiBUcnVlLgorICAgICAgbmV3X3ZhbCA9IDIwCisgICAgICBzZXRhdHRyKGNvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUsIG5ld192YWwpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld192YWwsIGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkpCisgICAgICAjIEhvbGQgb24gdG8gYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgY29tcG9zaXRlX2ZpZWxkIG9iamVjdC4KKyAgICAgIG9sZF9jb21wb3NpdGVfZmllbGQgPSBjb21wb3NpdGVfZmllbGQKKyAgICAgICMgQXNzZXJ0IHRoYXQgdGhlIGhhcyBtZXRob2RzIG5vdyByZXR1cm4gdHJ1ZS4KKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKSkKKworICAgICAgIyBOb3cgY2FsbCB0aGUgY2xlYXIgbWV0aG9kLi4uCisgICAgICBwcm90by5DbGVhckZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKQorCisgICAgICAjIC4uLmFuZCBlbnN1cmUgdGhhdCB0aGUgImhhcyIgYml0cyBhcmUgYWxsIGJhY2sgdG8gRmFsc2UuLi4KKyAgICAgIGNvbXBvc2l0ZV9maWVsZCA9IGdldGF0dHIocHJvdG8sIGNvbXBvc2l0ZV9maWVsZF9uYW1lKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCisgICAgICAjIC4uLmFuZCBlbnN1cmUgdGhhdCB0aGUgc2NhbGFyIGZpZWxkIGhhcyByZXR1cm5lZCB0byBpdHMgZGVmYXVsdC4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lKSkKKworICAgICAgc2VsZi5hc3NlcnRUcnVlKG9sZF9jb21wb3NpdGVfZmllbGQgaXMgbm90IGNvbXBvc2l0ZV9maWVsZCkKKyAgICAgIHNldGF0dHIob2xkX2NvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUsIG5ld192YWwpCisgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZChzY2FsYXJfZmllbGRfbmFtZSkpCisgICAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lKSkKKworICAgICMgVGVzdCBzaW1wbGUsIHNpbmdsZS1sZXZlbCBuZXN0aW5nIHdoZW4gd2Ugc2V0IGEgc2NhbGFyLgorICAgIFRlc3RDb21wb3NpdGVIYXNCaXRzKCdvcHRpb25hbGdyb3VwJywgJ2EnKQorICAgIFRlc3RDb21wb3NpdGVIYXNCaXRzKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScsICdiYicpCisgICAgVGVzdENvbXBvc2l0ZUhhc0JpdHMoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScsICdjJykKKyAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UnLCAnZCcpCisKKyAgZGVmIHRlc3RSZWZlcmVuY2VzVG9OZXN0ZWRNZXNzYWdlKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbmVzdGVkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBkZWwgcHJvdG8KKyAgICAjIEEgcHJldmlvdXMgdmVyc2lvbiBoYWQgYSBidWcgd2hlcmUgdGhpcyB3b3VsZCByYWlzZSBhbiBleGNlcHRpb24gd2hlbgorICAgICMgaGl0dGluZyBhIG5vdy1kZWFkIHdlYWsgcmVmZXJlbmNlLgorICAgIG5lc3RlZC5iYiA9IDIzCisKKyAgZGVmIHRlc3REaXNjb25uZWN0aW5nTmVzdGVkTWVzc2FnZUJlZm9yZVNldHRpbmdGaWVsZChzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSAgIyBTaG91bGQgZGlzY29ubmVjdCBmcm9tIHBhcmVudAorICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXN0ZWQgaXMgbm90IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKQorICAgIG5lc3RlZC5iYiA9IDIzCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorCisgIGRlZiB0ZXN0R2V0RGVmYXVsdE1lc3NhZ2VBZnRlckRpc2Nvbm5lY3RpbmdEZWZhdWx0TWVzc2FnZShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorICAgIGRlbCBwcm90bworICAgIGRlbCBuZXN0ZWQKKyAgICAjIEZvcmNlIGEgZ2FyYmFnZSBjb2xsZWN0IHNvIHRoYXQgdGhlIHVuZGVybHlpbmcgQ01lc3NhZ2VzIGFyZSBmcmVlZCBhbG9uZworICAgICMgd2l0aCB0aGUgTWVzc2FnZXMgdGhleSBwb2ludCB0by4gVGhpcyBpcyB0byBtYWtlIHN1cmUgd2UncmUgbm90IGRlbGV0aW5nCisgICAgIyBkZWZhdWx0IG1lc3NhZ2UgaW5zdGFuY2VzLgorICAgIGdjLmNvbGxlY3QoKQorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbmVzdGVkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKworICBkZWYgdGVzdERpc2Nvbm5lY3RpbmdOZXN0ZWRNZXNzYWdlQWZ0ZXJTZXR0aW5nRmllbGQoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBuZXN0ZWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQorICAgIG5lc3RlZC5iYiA9IDUKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSAgIyBTaG91bGQgZGlzY29ubmVjdCBmcm9tIHBhcmVudAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbmVzdGVkLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5lc3RlZCBpcyBub3QgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UpCisgICAgbmVzdGVkLmJiID0gMjMKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisKKyAgZGVmIHRlc3REaXNjb25uZWN0aW5nTmVzdGVkTWVzc2FnZUJlZm9yZUdldHRpbmdGaWVsZChzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIHRlc3REaXNjb25uZWN0aW5nTmVzdGVkTWVzc2FnZUFmdGVyTWVyZ2Uoc2VsZik6CisgICAgIyBUaGlzIHRlc3QgZXhlcmNpc2VzIHRoZSBjb2RlIHBhdGggdGhhdCBkb2VzIG5vdCB1c2UgUmVsZWFzZU1lc3NhZ2UoKS4KKyAgICAjIFRoZSB1bmRlcmx5aW5nIGZlYXIgaXMgdGhhdCBpZiB3ZSB1c2UgUmVsZWFzZU1lc3NhZ2UoKSBpbmNvcnJlY3RseSwKKyAgICAjIHdlIHdpbGwgaGF2ZSBtZW1vcnkgbGVha3MuICBJdCdzIGhhcmQgdG8gY2hlY2sgdGhhdCB0aGF0IGRvZXNuJ3QgaGFwcGVuLAorICAgICMgYnV0IGF0IGxlYXN0IHdlIGNhbiBleGVyY2lzZSB0aGF0IGNvZGUgcGF0aCB0byBtYWtlIHN1cmUgaXQgd29ya3MuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gNQorICAgIHByb3RvMS5NZXJnZUZyb20ocHJvdG8yKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90bzEuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgcHJvdG8xLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvMS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICBkZWYgdGVzdERpc2Nvbm5lY3RpbmdMYXp5TmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICAjIFRoaXMgdGVzdCBleGVyY2lzZXMgcmVsZWFzaW5nIGEgbmVzdGVkIG1lc3NhZ2UgdGhhdCBpcyBsYXp5LiBUaGlzIHRlc3QKKyAgICAjIG9ubHkgZXhlcmNpc2VzIHJlYWwgY29kZSBpbiB0aGUgQysrIGltcGxlbWVudGF0aW9uIGFzIFB5dGhvbiBkb2VzIG5vdAorICAgICMgc3VwcG9ydCBsYXp5IHBhcnNpbmcsIGJ1dCB0aGUgY3VycmVudCBDKysgaW1wbGVtZW50YXRpb24gcmVzdWx0cyBpbgorICAgICMgbWVtb3J5IGNvcnJ1cHRpb24gYW5kIGEgY3Jhc2guCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKKyAgICAgIHJldHVybgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfbGF6eV9tZXNzYWdlLmJiID0gNQorICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2xhenlfbWVzc2FnZScpCisgICAgZGVsIHByb3RvCisgICAgZ2MuY29sbGVjdCgpCisKKyAgZGVmIHRlc3RIYXNCaXRzV2hlbk1vZGlmeWluZ1JlcGVhdGVkRmllbGRzKHNlbGYpOgorICAgICMgVGVzdCBuZXN0aW5nIHdoZW4gd2UgYWRkIGFuIGVsZW1lbnQgdG8gYSByZXBlYXRlZCBmaWVsZCBpbiBhIHN1Ym1lc3NhZ2UuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKCkKKyAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5uZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIFs1XSwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UubmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgICAjIERvIHRoZSBzYW1lIHRlc3QsIGJ1dCB3aXRoIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkIHdpdGhpbiB0aGUKKyAgICAjIHN1Ym1lc3NhZ2UuCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UubmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9mb3JlaWdubWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICBkZWYgdGVzdEhhc0JpdHNGb3JNYW55TGV2ZWxzT2ZOZXN0aW5nKHNlbGYpOgorICAgICMgVGVzdCBuZXN0aW5nIG1hbnkgbGV2ZWxzIGRlZXAuCisgICAgcmVjdXJzaXZlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RNdXR1YWxSZWN1cnNpb25BKCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHJlY3Vyc2l2ZV9wcm90by5IYXNGaWVsZCgnYmInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCByZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCisgICAgcmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5iYi5vcHRpb25hbF9pbnQzMiA9IDUKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRUcnVlKHJlY3Vyc2l2ZV9wcm90by5IYXNGaWVsZCgnYmInKSkKKyAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLkhhc0ZpZWxkKCdhJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHJlY3Vyc2l2ZV9wcm90by5iYi5hLkhhc0ZpZWxkKCdiYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLkhhc0ZpZWxkKCdiYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5iYi5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorCisgIGRlZiB0ZXN0U2luZ3VsYXJMaXN0RmllbGRzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfZml4ZWQzMiA9IDEKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDUKKyAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSAnZm9vJworICAgICMgQWNjZXNzIHN1Yi1tZXNzYWdlIGJ1dCBkb24ndCBzZXQgaXQgeWV0LgorICAgIG5lc3RlZF9tZXNzYWdlID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCA1KSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ZpeGVkMzInXSwgMSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9zdHJpbmcnIF0sICdmb28nKSBdLAorICAgICAgcHJvdG8uTGlzdEZpZWxkcygpKQorCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAxMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCA1KSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ZpeGVkMzInXSwgMSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9zdHJpbmcnIF0sICdmb28nKSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJyBdLAorICAgICAgICAgICAgIG5lc3RlZF9tZXNzYWdlKSBdLAorICAgICAgcHJvdG8uTGlzdEZpZWxkcygpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRMaXN0RmllbGRzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ucmVwZWF0ZWRfZml4ZWQzMi5hcHBlbmQoMSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTEpCisgICAgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbJ2ZvbycsICdiYXInXSkKKyAgICBwcm90by5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKFtdKQorICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2JheicpCisgICAgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChzdHIoeCkgZm9yIHggaW4geHJhbmdlKDIpKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMjEKKyAgICBwcm90by5yZXBlYXRlZF9ib29sICAjIEFjY2VzcyBidXQgZG9uJ3Qgc2V0IGFueXRoaW5nOyBzaG91bGQgbm90IGJlIGxpc3RlZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCAyMSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydyZXBlYXRlZF9pbnQzMicgIF0sIFs1LCAxMV0pLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfZml4ZWQzMiddLCBbMV0pLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfc3RyaW5nJyBdLAorICAgICAgICAgIFsnZm9vJywgJ2JhcicsICdiYXonLCAnMCcsICcxJ10pIF0sCisgICAgICBwcm90by5MaXN0RmllbGRzKCkpCisKKyAgZGVmIHRlc3RTaW5ndWxhckxpc3RFeHRlbnNpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl0gPSAxCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICBdID0gNQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gXSA9ICdmb28nCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIFsgKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24gICwgNSksCisgICAgICAgICh1bml0dGVzdF9wYjIub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24sIDEpLAorICAgICAgICAodW5pdHRlc3RfcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gLCAnZm9vJykgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkTGlzdEV4dGVuc2lvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMSkKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gIF0uYXBwZW5kKDUpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICBdLmFwcGVuZCgxMSkKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uIF0uYXBwZW5kKCdmb28nKQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gXS5hcHBlbmQoJ2JhcicpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiBdLmFwcGVuZCgnYmF6JykKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24gIF0gPSAyMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICBbICh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAsIDIxKSwKKyAgICAgICAgKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICwgWzUsIDExXSksCisgICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIFsxXSksCisgICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAsIFsnZm9vJywgJ2JhcicsICdiYXonXSkgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICBkZWYgdGVzdExpc3RGaWVsZHNBbmRFeHRlbnNpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RGaWVsZE9yZGVyaW5ncygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMocHJvdG8pCisgICAgdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnbXlfaW50JyAgIF0sIDEpLAorICAgICAgICAodW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQgICAgICAgICAgICAgICAsIDIzKSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ215X3N0cmluZyddLCAnZm9vJyksCisgICAgICAgICh1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZyAgICAgICAgICAgICwgJ2JhcicpLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnbXlfZmxvYXQnIF0sIDEuMCkgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICBkZWYgdGVzdERlZmF1bHRWYWx1ZXMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF91aW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF91aW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9maXhlZDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfZml4ZWQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX3NmaXhlZDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfc2ZpeGVkNjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLjAsIHByb3RvLm9wdGlvbmFsX2Zsb2F0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4wLCBwcm90by5vcHRpb25hbF9kb3VibGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgcHJvdG8ub3B0aW9uYWxfYm9vbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBwcm90by5vcHRpb25hbF9zdHJpbmcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgcHJvdG8ub3B0aW9uYWxfYnl0ZXMpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQxLCBwcm90by5kZWZhdWx0X2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIHByb3RvLmRlZmF1bHRfaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MywgcHJvdG8uZGVmYXVsdF91aW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0NCwgcHJvdG8uZGVmYXVsdF91aW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtNDUsIHByb3RvLmRlZmF1bHRfc2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDYsIHByb3RvLmRlZmF1bHRfc2ludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDcsIHByb3RvLmRlZmF1bHRfZml4ZWQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQ4LCBwcm90by5kZWZhdWx0X2ZpeGVkNjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0OSwgcHJvdG8uZGVmYXVsdF9zZml4ZWQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKC01MCwgcHJvdG8uZGVmYXVsdF9zZml4ZWQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUxLjUsIHByb3RvLmRlZmF1bHRfZmxvYXQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1MmUzLCBwcm90by5kZWZhdWx0X2RvdWJsZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHByb3RvLmRlZmF1bHRfYm9vbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdoZWxsbycsIHByb3RvLmRlZmF1bHRfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3dvcmxkJywgcHJvdG8uZGVmYXVsdF9ieXRlcykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSLCBwcm90by5kZWZhdWx0X25lc3RlZF9lbnVtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLCBwcm90by5kZWZhdWx0X2ZvcmVpZ25fZW51bSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLmRlZmF1bHRfaW1wb3J0X2VudW0pCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTEyMzQnLCBwcm90by51dGY4X3N0cmluZykKKworICBkZWYgdGVzdEhhc0ZpZWxkV2l0aFVua25vd25GaWVsZE5hbWUoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5IYXNGaWVsZCwgJ25vbmV4aXN0ZW50X2ZpZWxkJykKKworICBkZWYgdGVzdENsZWFyRmllbGRXaXRoVW5rbm93bkZpZWxkTmFtZShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLkNsZWFyRmllbGQsICdub25leGlzdGVudF9maWVsZCcpCisKKyAgZGVmIHRlc3REaXNhbGxvd2VkQXNzaWdubWVudHMoc2VsZik6CisgICAgIyBJdCdzIGlsbGVnYWwgdG8gYXNzaWduIHZhbHVlcyBkaXJlY3RseSB0byByZXBlYXRlZCBmaWVsZHMKKyAgICAjIG9yIHRvIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuICBFbnN1cmUgdGhhdCB0aGlzIGZhaWxzLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgIyBSZXBlYXRlZCBmaWVsZHMuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAncmVwZWF0ZWRfaW50MzInLCAxMCkKKyAgICAjIExpc3RzIHNob3VsZG4ndCB3b3JrLCBlaXRoZXIuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAncmVwZWF0ZWRfaW50MzInLCBbMTBdKQorICAgICMgQ29tcG9zaXRlIGZpZWxkcy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJywgMjMpCisgICAgIyBBc3NpZ25tZW50IHRvIGEgcmVwZWF0ZWQgbmVzdGVkIG1lc3NhZ2UgZmllbGQgd2l0aG91dCBzcGVjaWZ5aW5nCisgICAgIyB0aGUgaW5kZXggaW4gdGhlIGFycmF5IG9mIG5lc3RlZCBtZXNzYWdlcy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgJ2JiJywgMzQpCisgICAgIyBBc3NpZ25tZW50IHRvIGFuIGF0dHJpYnV0ZSBvZiBhIHJlcGVhdGVkIGZpZWxkLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBwcm90by5yZXBlYXRlZF9mbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAnc29tZV9hdHRyaWJ1dGUnLCAzNCkKKyAgICAjIHByb3RvLm5vbmV4aXN0ZW50X2ZpZWxkID0gMjMgc2hvdWxkIGZhaWwgYXMgd2VsbC4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdub25leGlzdGVudF9maWVsZCcsIDIzKQorCisgIGRlZiB0ZXN0U2luZ2xlU2NhbGFyVHlwZVNhZmV0eShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9pbnQzMicsIDEuMSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfaW50MzInLCAnZm9vJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfc3RyaW5nJywgMTApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2J5dGVzJywgMTApCisKKyAgZGVmIHRlc3RTaW5nbGVTY2FsYXJCb3VuZHNDaGVja2luZyhzZWxmKToKKyAgICBkZWYgVGVzdE1pbkFuZE1heEludGVnZXJzKGZpZWxkX25hbWUsIGV4cGVjdGVkX21pbiwgZXhwZWN0ZWRfbWF4KToKKyAgICAgIHBiID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgICBzZXRhdHRyKHBiLCBmaWVsZF9uYW1lLCBleHBlY3RlZF9taW4pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX21pbiwgZ2V0YXR0cihwYiwgZmllbGRfbmFtZSkpCisgICAgICBzZXRhdHRyKHBiLCBmaWVsZF9uYW1lLCBleHBlY3RlZF9tYXgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX21heCwgZ2V0YXR0cihwYiwgZmllbGRfbmFtZSkpCisgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWluIC0gMSkKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIHBiLCBmaWVsZF9uYW1lLCBleHBlY3RlZF9tYXggKyAxKQorCisgICAgVGVzdE1pbkFuZE1heEludGVnZXJzKCdvcHRpb25hbF9pbnQzMicsIC0oMSA8PCAzMSksICgxIDw8IDMxKSAtIDEpCisgICAgVGVzdE1pbkFuZE1heEludGVnZXJzKCdvcHRpb25hbF91aW50MzInLCAwLCAweGZmZmZmZmZmKQorICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfaW50NjQnLCAtKDEgPDwgNjMpLCAoMSA8PCA2MykgLSAxKQorICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfdWludDY0JywgMCwgMHhmZmZmZmZmZmZmZmZmZmZmKQorCisgICAgcGIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorCisgICAgIyBJbnZhbGlkIGVudW0gdmFsdWVzLgorICAgIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gMAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0pCisKKyAgICBieXRlc19zaXplX2JlZm9yZSA9IHBiLkJ5dGVTaXplKCkKKworICAgIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gNAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0pCisKKyAgICBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDAKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorCisgICAgIyBNYWtlIHN1cmUgdGhhdCBzZXR0aW5nIHRoZSBzYW1lIGVudW0gZmllbGQgZG9lc24ndCBqdXN0IGFkZCB1bmtub3duCisgICAgIyBmaWVsZHMgKGJ1dCBvdmVyd3JpdGVzIHRoZW0pLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXNfc2l6ZV9iZWZvcmUsIHBiLkJ5dGVTaXplKCkpCisKKyAgICAjIElzIHRoZSBpbnZhbGlkIHZhbHVlIHByZXNlcnZlZCBhZnRlciBzZXJpYWxpemF0aW9uPworICAgIHNlcmlhbGl6ZWQgPSBwYi5TZXJpYWxpemVUb1N0cmluZygpCisgICAgcGIyID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcGIyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocGIsIHBiMikKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyVHlwZVNhZmV0eShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kLCAxLjEpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQsICdmb28nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLCAxMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2J5dGVzLCAxMCkKKworICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMlswXSA9IDIzCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19zZXRpdGVtX18sIDUwMCwgMjMpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX3NldGl0ZW1fXywgMCwgJ2FiYycpCisKKyAgICAjIFJlcGVhdGVkIGVudW1zIHRlc3RzLgorICAgICNwcm90by5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQoMCkKKworICBkZWYgdGVzdFNpbmdsZVNjYWxhckdldHRlcnNBbmRTZXR0ZXJzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorCisgICAgcHJvdG8ub3B0aW9uYWxfdWludDY0ID0gMHhmZmZmZmZmZmZmZmYKKyAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmLCBwcm90by5vcHRpb25hbF91aW50NjQpCisgICAgcHJvdG8ub3B0aW9uYWxfdWludDY0ID0gMHhmZmZmZmZmZmZmZmZmZmZmCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmYsIHByb3RvLm9wdGlvbmFsX3VpbnQ2NCkKKyAgICAjIFRPRE8ocm9iaW5zb24pOiBUZXN0IGFsbCBvdGhlciBzY2FsYXIgZmllbGQgdHlwZXMuCisKKyAgZGVmIHRlc3RTaW5nbGVTY2FsYXJDbGVhckZpZWxkKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgIyBTaG91bGQgYmUgYWxsb3dlZCB0byBjbGVhciBzb21ldGhpbmcgdGhhdCdzIG5vdCB0aGVyZSAoYSBuby1vcCkuCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgICMgVE9ETyhyb2JpbnNvbik6IFRlc3QgYWxsIG90aGVyIHNjYWxhciBmaWVsZCB0eXBlcy4KKworICBkZWYgdGVzdEVudW1zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5GT08pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8uQkFaKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVopCisKKyAgZGVmIHRlc3RFbnVtX05hbWUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgnRk9SRUlHTl9GT08nLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25FbnVtLk5hbWUodW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdGT1JFSUdOX0JBUicsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uTmFtZSh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZPUkVJR05fQkFaJywKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduRW51bS5OYW1lKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uTmFtZSwgMTEzMTIpCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZPTycsCisgICAgICAgICAgICAgICAgICAgICBwcm90by5OZXN0ZWRFbnVtLk5hbWUocHJvdG8uRk9PKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdGT08nLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLk5hbWUocHJvdG8uRk9PKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdCQVInLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5OYW1lKHByb3RvLkJBUikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnQkFSJywKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lKHByb3RvLkJBUikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnQkFaJywKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uTmFtZShwcm90by5CQVopKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0JBWicsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uTmFtZShwcm90by5CQVopKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5OYW1lLCAxMTMxMikKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lLCAxMTMxMikKKworICBkZWYgdGVzdEVudW1fVmFsdWUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9GT08sCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUoJ0ZPUkVJR05fRk9PJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUoJ0ZPUkVJR05fQkFSJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVosCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUoJ0ZPUkVJR05fQkFaJykpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUsICdGTycpCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uRk9PLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSgnRk9PJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5GT08sCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUoJ0ZPTycpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQkFSLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSgnQkFSJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CQVIsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUoJ0JBUicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQkFaLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSgnQkFaJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CQVosCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUoJ0JBWicpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSwgJ0ZvbycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUsICdGb28nKQorCisgIGRlZiB0ZXN0RW51bV9LZXlzQW5kVmFsdWVzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydGT1JFSUdOX0ZPTycsICdGT1JFSUdOX0JBUicsICdGT1JFSUdOX0JBWiddLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25FbnVtLmtleXMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs0LCA1LCA2XSwKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduRW51bS52YWx1ZXMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ0ZPUkVJR05fRk9PJywgNCksICgnRk9SRUlHTl9CQVInLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ0ZPUkVJR05fQkFaJywgNildLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25FbnVtLml0ZW1zKCkpCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydGT08nLCAnQkFSJywgJ0JBWiddLCBwcm90by5OZXN0ZWRFbnVtLmtleXMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsxLCAyLCAzXSwgcHJvdG8uTmVzdGVkRW51bS52YWx1ZXMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ0ZPTycsIDEpLCAoJ0JBUicsIDIpLCAoJ0JBWicsIDMpXSwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uaXRlbXMoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFycyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEwKQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxNSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ucmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMTAsIDE1XSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3Qgc2luZ2xlIHJldHJpZXZhbC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTUsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0xXSkKKyAgICAjIFRlc3Qgb3V0LW9mLWJvdW5kcyBpbmRpY2VzLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAtMTIzNCkKKyAgICAjIFRlc3QgaW5jb3JyZWN0IHR5cGVzIHBhc3NlZCB0byBfX2dldGl0ZW1fXy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAnZm9vJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCBOb25lKQorCisgICAgIyBUZXN0IHNpbmdsZSBhc3NpZ25tZW50LgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyWzFdID0gMjAKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBpbnNlcnRpb24uCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuaW5zZXJ0KDEsIDI1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDI1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBzbGljZSByZXRyaWV2YWwuCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMwKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzI1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMlsxOjRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDI1LCAyMCwgMTUsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbOl0pCisKKyAgICAjIFRlc3Qgc2xpY2UgYXNzaWdubWVudCB3aXRoIGFuIGl0ZXJhdG9yCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMTo0XSA9IChpIGZvciBpIGluIHhyYW5nZSgzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAwLCAxLCAyLCAzMF0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgIyBUZXN0IHNsaWNlIGFzc2lnbm1lbnQuCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMTo0XSA9IFszNSwgNDAsIDQ1XQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDM1LCA0MCwgNDUsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3QgdGhhdCB3ZSBjYW4gdXNlIHRoZSBmaWVsZCBhcyBhbiBpdGVyYXRvci4KKyAgICByZXN1bHQgPSBbXQorICAgIGZvciBpIGluIHByb3RvLnJlcGVhdGVkX2ludDMyOgorICAgICAgcmVzdWx0LmFwcGVuZChpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDM1LCA0MCwgNDUsIDMwXSwgcmVzdWx0KQorCisgICAgIyBUZXN0IHNpbmdsZSBkZWxldGlvbi4KKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAzNSwgNDUsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3Qgc2xpY2UgZGVsZXRpb24uCisgICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWzI6XQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDM1XSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3QgZXh0ZW5kaW5nLgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMywgMTNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDM1LCAzLCAxM10sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgIyBUZXN0IGNsZWFyaW5nLgorICAgIHByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLnJlcGVhdGVkX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKworICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTFdKQorICAgICMgVGVzdCBhc3NpZ25tZW50IHRvIGEgbmVnYXRpdmUgaW5kZXguCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTFdID0gMgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTFdKQorCisgICAgIyBUZXN0IGRlbGV0aW9uIGF0IG5lZ2F0aXZlIGluZGljZXMuCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbOl0gPSBbMCwgMSwgMiwgM10KKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTFdCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMCwgMSwgMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0yXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzAsIDJdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZGVsaXRlbV9fLCAtMykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX2RlbGl0ZW1fXywgMzAwKQorCisgICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0yOi0xXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzJdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlsxMDA6MTAwMDBdCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRTY2FsYXJzUmVtb3ZlKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLnJlcGVhdGVkX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTApCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIucmVtb3ZlKDUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBwcm90by5yZXBlYXRlZF9pbnQzMlsyXSkKKworICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLnJlbW92ZSg1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCBwcm90by5yZXBlYXRlZF9pbnQzMlswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzFdKQorCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIucmVtb3ZlKDEwKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQorCisgICAgIyBSZW1vdmUgYSBub24tZXhpc3RlbnQgZWxlbWVudC4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUsIDEyMykKKworICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlcyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIG0wID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtMSA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoW20wLCBtMV0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG0wLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpKQorCisgICAgIyBUZXN0IG91dC1vZi1ib3VuZHMgaW5kaWNlcy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5fX2dldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAorICAgICAgICAgICAgICAgICAgICAgIC0xMjM0KQorCisgICAgIyBUZXN0IGluY29ycmVjdCB0eXBlcyBwYXNzZWQgdG8gX19nZXRpdGVtX18uCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5fX2dldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICAnZm9vJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAorICAgICAgICAgICAgICAgICAgICAgIE5vbmUpCisKKyAgICAjIFRlc3Qgc2xpY2UgcmV0cmlldmFsLgorICAgIG0yID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtMyA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbTQgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKKyAgICAgICAgW20xLCBtMiwgbTNdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxOjRdKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKKyAgICAgICAgW20wLCBtMSwgbTIsIG0zLCBtNF0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzpdKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKKyAgICAgICAgW20wLCBtMV0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzoyXSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoCisgICAgICAgIFttMiwgbTMsIG00XSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMjpdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIG0wLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoCisgICAgICAgIFttMF0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzoxXSkKKworICAgICMgVGVzdCB0aGF0IHdlIGNhbiB1c2UgdGhlIGZpZWxkIGFzIGFuIGl0ZXJhdG9yLgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGkgaW4gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U6CisgICAgICByZXN1bHQuYXBwZW5kKGkpCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTEsIG0yLCBtMywgbTRdLCByZXN1bHQpCisKKyAgICAjIFRlc3Qgc2luZ2xlIGRlbGV0aW9uLgorICAgIGRlbCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xLCBtMywgbTRdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKworICAgICMgVGVzdCBzbGljZSBkZWxldGlvbi4KKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMjpdCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTFdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKworICAgICMgVGVzdCBleHRlbmRpbmcuCisgICAgbjEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MSkKKyAgICBuMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0yKQorICAgIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmV4dGVuZChbbjEsbjJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG4xLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG4yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVszXSkKKworICAgICMgVGVzdCBjbGVhcmluZy4KKyAgICBwcm90by5DbGVhckZpZWxkKCdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisKKyAgICAjIFRlc3QgY29uc3RydWN0aW5nIGFuIGVsZW1lbnQgd2hpbGUgYWRkaW5nIGl0LgorICAgIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZChiYj0yMykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCisKKyAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZVJlbW92ZShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIG0wID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICAjIE5lZWQgdG8gc2V0IHNvbWUgZGlmZmVyZW50aWF0aW5nIHZhcmlhYmxlIHNvIG0wICE9IG0xICE9IG0yOgorICAgIG0wLmJiID0gbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIG0xID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtMS5iYiA9IGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUobTAgIT0gbTEpCisgICAgbTIgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG0yLmJiID0gbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xLCBtMl0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnJlbW92ZShtMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtMSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChtMiwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0pCisKKyAgICAjIFJlbW92aW5nIG0wIGFnYWluIG9yIHJlbW92aW5nIE5vbmUgc2hvdWxkIHJhaXNlIGVycm9yCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucmVtb3ZlLCBtMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5yZW1vdmUsIE5vbmUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorCisgICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucmVtb3ZlKG0yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0xLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXSkKKworICBkZWYgdGVzdEhhbmRXcml0dGVuUmVmbGVjdGlvbihzZWxmKToKKyAgICAjIEhhbmQgd3JpdHRlbiBleHRlbnNpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBieSB0aGUgcHVyZS1QeXRob24KKyAgICAjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKKyAgICAgIHJldHVybgorCisgICAgRmllbGREZXNjcmlwdG9yID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IKKyAgICBmb29fZmllbGRfZGVzY3JpcHRvciA9IEZpZWxkRGVzY3JpcHRvcigKKyAgICAgICAgbmFtZT0nZm9vX2ZpZWxkJywgZnVsbF9uYW1lPSdNeVByb3RvLmZvb19maWVsZCcsCisgICAgICAgIGluZGV4PTAsIG51bWJlcj0xLCB0eXBlPUZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0LAorICAgICAgICBjcHBfdHlwZT1GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQ2NCwKKyAgICAgICAgbGFiZWw9RmllbGREZXNjcmlwdG9yLkxBQkVMX09QVElPTkFMLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsCisgICAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICAgIG9wdGlvbnM9ZGVzY3JpcHRvcl9wYjIuRmllbGRPcHRpb25zKCkpCisgICAgbXlkZXNjcmlwdG9yID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICAgICAgICBuYW1lPSdNeVByb3RvJywgZnVsbF9uYW1lPSdNeVByb3RvJywgZmlsZW5hbWU9J2lnbm9yZWQnLAorICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwgbmVzdGVkX3R5cGVzPVtdLCBlbnVtX3R5cGVzPVtdLAorICAgICAgICBmaWVsZHM9W2Zvb19maWVsZF9kZXNjcmlwdG9yXSwgZXh0ZW5zaW9ucz1bXSwKKyAgICAgICAgb3B0aW9ucz1kZXNjcmlwdG9yX3BiMi5NZXNzYWdlT3B0aW9ucygpKQorICAgIGNsYXNzIE15UHJvdG9DbGFzcyhtZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgorICAgICAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICAgIG15cHJvdG9faW5zdGFuY2UgPSBNeVByb3RvQ2xhc3MoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBteXByb3RvX2luc3RhbmNlLkhhc0ZpZWxkKCdmb29fZmllbGQnKSkKKyAgICBteXByb3RvX2luc3RhbmNlLmZvb19maWVsZCA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCisgICAgc2VsZi5hc3NlcnRUcnVlKG15cHJvdG9faW5zdGFuY2UuSGFzRmllbGQoJ2Zvb19maWVsZCcpKQorCisgIGRlZiB0ZXN0RGVzY3JpcHRvclByb3RvU3VwcG9ydChzZWxmKToKKyAgICAjIEhhbmQgd3JpdHRlbiBkZXNjcmlwdG9ycy9yZWZsZWN0aW9uIGFyZSBvbmx5IHN1cHBvcnRlZCBieSB0aGUgcHVyZS1QeXRob24KKyAgICAjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKKyAgICAgIHJldHVybgorCisgICAgZGVmIEFkZERlc2NyaXB0b3JGaWVsZChwcm90bywgZmllbGRfbmFtZSwgZmllbGRfdHlwZSk6CisgICAgICBBZGREZXNjcmlwdG9yRmllbGQuZmllbGRfaW5kZXggKz0gMQorICAgICAgbmV3X2ZpZWxkID0gcHJvdG8uZmllbGQuYWRkKCkKKyAgICAgIG5ld19maWVsZC5uYW1lID0gZmllbGRfbmFtZQorICAgICAgbmV3X2ZpZWxkLnR5cGUgPSBmaWVsZF90eXBlCisgICAgICBuZXdfZmllbGQubnVtYmVyID0gQWRkRGVzY3JpcHRvckZpZWxkLmZpZWxkX2luZGV4CisgICAgICBuZXdfZmllbGQubGFiZWwgPSBkZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTAorCisgICAgQWRkRGVzY3JpcHRvckZpZWxkLmZpZWxkX2luZGV4ID0gMAorCisgICAgZGVzY19wcm90byA9IGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bygpCisgICAgZGVzY19wcm90by5uYW1lID0gJ0NhcicKKyAgICBmZHAgPSBkZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90bworICAgIEFkZERlc2NyaXB0b3JGaWVsZChkZXNjX3Byb3RvLCAnbmFtZScsIGZkcC5UWVBFX1NUUklORykKKyAgICBBZGREZXNjcmlwdG9yRmllbGQoZGVzY19wcm90bywgJ3llYXInLCBmZHAuVFlQRV9JTlQ2NCkKKyAgICBBZGREZXNjcmlwdG9yRmllbGQoZGVzY19wcm90bywgJ2F1dG9tYXRpYycsIGZkcC5UWVBFX0JPT0wpCisgICAgQWRkRGVzY3JpcHRvckZpZWxkKGRlc2NfcHJvdG8sICdwcmljZScsIGZkcC5UWVBFX0RPVUJMRSkKKyAgICAjIEFkZCBhIHJlcGVhdGVkIGZpZWxkCisgICAgQWRkRGVzY3JpcHRvckZpZWxkLmZpZWxkX2luZGV4ICs9IDEKKyAgICBuZXdfZmllbGQgPSBkZXNjX3Byb3RvLmZpZWxkLmFkZCgpCisgICAgbmV3X2ZpZWxkLm5hbWUgPSAnb3duZXJzJworICAgIG5ld19maWVsZC50eXBlID0gZmRwLlRZUEVfU1RSSU5HCisgICAgbmV3X2ZpZWxkLm51bWJlciA9IEFkZERlc2NyaXB0b3JGaWVsZC5maWVsZF9pbmRleAorICAgIG5ld19maWVsZC5sYWJlbCA9IGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLkxBQkVMX1JFUEVBVEVECisKKyAgICBkZXNjID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcihkZXNjX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShkZXNjLmZpZWxkc19ieV9uYW1lLmhhc19rZXkoJ25hbWUnKSkKKyAgICBzZWxmLmFzc2VydFRydWUoZGVzYy5maWVsZHNfYnlfbmFtZS5oYXNfa2V5KCd5ZWFyJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKGRlc2MuZmllbGRzX2J5X25hbWUuaGFzX2tleSgnYXV0b21hdGljJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKGRlc2MuZmllbGRzX2J5X25hbWUuaGFzX2tleSgncHJpY2UnKSkKKyAgICBzZWxmLmFzc2VydFRydWUoZGVzYy5maWVsZHNfYnlfbmFtZS5oYXNfa2V5KCdvd25lcnMnKSkKKworICAgIGNsYXNzIENhck1lc3NhZ2UobWVzc2FnZS5NZXNzYWdlKToKKyAgICAgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgICAgIERFU0NSSVBUT1IgPSBkZXNjCisKKyAgICBwcml1cyA9IENhck1lc3NhZ2UoKQorICAgIHByaXVzLm5hbWUgPSAncHJpdXMnCisgICAgcHJpdXMueWVhciA9IDIwMTAKKyAgICBwcml1cy5hdXRvbWF0aWMgPSBUcnVlCisgICAgcHJpdXMucHJpY2UgPSAyNTEzNC43NQorICAgIHByaXVzLm93bmVycy5leHRlbmQoWydib2InLCAnc3VzYW4nXSkKKworICAgIHNlcmlhbGl6ZWRfcHJpdXMgPSBwcml1cy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbmV3X3ByaXVzID0gcmVmbGVjdGlvbi5QYXJzZU1lc3NhZ2UoZGVzYywgc2VyaWFsaXplZF9wcml1cykKKyAgICBzZWxmLmFzc2VydFRydWUobmV3X3ByaXVzIGlzIG5vdCBwcml1cykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLCBuZXdfcHJpdXMpCisKKyAgICAjIHRoZXNlIGFyZSB1bm5lY2Vzc2FyeSBhc3N1bWluZyBtZXNzYWdlIGVxdWFsaXR5IHdvcmtzIGFzIGFkdmVydGlzZWQgYnV0CisgICAgIyBleHBsaWNpdGx5IGNoZWNrIHRvIGJlIHNhZmUgc2luY2Ugd2UncmUgbXVja2luZyBhYm91dCBpbiBtZXRhY2xhc3MgZm9vCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcml1cy5uYW1lLCBuZXdfcHJpdXMubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLnllYXIsIG5ld19wcml1cy55ZWFyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJpdXMuYXV0b21hdGljLCBuZXdfcHJpdXMuYXV0b21hdGljKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJpdXMucHJpY2UsIG5ld19wcml1cy5wcmljZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLm93bmVycywgbmV3X3ByaXVzLm93bmVycykKKworICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0Zvck9wdGlvbmFsU2NhbGFyKHNlbGYpOgorICAgIGV4dGVuZGVlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICAjIEFzIHdpdGggbm9ybWFsIHNjYWxhciBmaWVsZHMsIGp1c3QgZG9pbmcgYSByZWFkIGRvZXNuJ3QgYWN0dWFsbHkgc2V0IHRoZQorICAgICMgImhhcyIgYml0LgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgIyBBY3R1YWxseSBzZXQgdGhlIHRoaW5nLgorICAgIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICAjIEVuc3VyZSB0aGF0IGNsZWFyaW5nIHdvcmtzIGFzIHdlbGwuCisgICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisKKyAgZGVmIHRlc3RUb3BMZXZlbEV4dGVuc2lvbnNGb3JSZXBlYXRlZFNjYWxhcihzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pKQorICAgIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hcHBlbmQoJ2ZvbycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbJ2ZvbyddLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCisgICAgc3RyaW5nX2xpc3QgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKKyAgICBzZWxmLmFzc2VydFRydWUoc3RyaW5nX2xpc3QgaXMgbm90IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICAjIFNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIGRvIEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9ICdhJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sICdhJykKKworICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0Zvck9wdGlvbmFsTWVzc2FnZShzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24KKyAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMpCisgICAgIyBBcyB3aXRoIG5vcm1hbCAobm9uLWV4dGVuc2lvbikgZmllbGRzLCBtZXJlbHkgcmVhZGluZyBmcm9tIHRoZQorICAgICMgdGhpbmcgc2hvdWxkbid0IHNldCB0aGUgImhhcyIgYml0LgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMgPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5jKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICAjIFNhdmUgYSByZWZlcmVuY2UgaGVyZS4KKyAgICBmb3JlaWduX21lc3NhZ2UgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRUcnVlKGZvcmVpZ25fbWVzc2FnZSBpcyBub3QgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgICMgU2V0dGluZyBhIGZpZWxkIG9uIGZvcmVpZ25fbWVzc2FnZSBub3cgc2hvdWxkbid0IHNldAorICAgICMgYW55ICJoYXMiIGJpdHMgb24gZXh0ZW5kZWVfcHJvdG8uCisgICAgZm9yZWlnbl9tZXNzYWdlLmMgPSA0MgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGZvcmVpZ25fbWVzc2FnZS5jKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3JlaWduX21lc3NhZ2UuSGFzRmllbGQoJ2MnKSkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgICMgU2hvdWxkbid0IGJlIGFsbG93ZWQgdG8gZG8gRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gJ2EnCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwgJ2EnKQorCisgIGRlZiB0ZXN0VG9wTGV2ZWxFeHRlbnNpb25zRm9yUmVwZWF0ZWRNZXNzYWdlKHNlbGYpOgorICAgIGV4dGVuZGVlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIucmVwZWF0ZWRncm91cF9leHRlbnNpb24KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pKQorICAgIGdyb3VwID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmFkZCgpCisgICAgZ3JvdXAuYSA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dWzBdLmEpCisgICAgZ3JvdXAuYSA9IDQyCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dWzBdLmEpCisgICAgZ3JvdXBfbGlzdCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQorICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShncm91cF9saXN0IGlzIG5vdCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCisgICAgIyBTaG91bGRuJ3QgYmUgYWxsb3dlZCB0byBkbyBFeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAnYScKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLCAnYScpCisKKyAgZGVmIHRlc3ROZXN0ZWRFeHRlbnNpb25zKHNlbGYpOgorICAgIGV4dGVuZGVlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZQorCisgICAgIyBXZSBqdXN0IHRlc3QgdGhlIG5vbi1yZXBlYXRlZCBjYXNlLgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgcmVxdWlyZWQgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHJlcXVpcmVkLmEpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICByZXF1aXJlZC5hID0gMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYSkKKyAgICBzZWxmLmFzc2VydFRydWUoZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXF1aXJlZCBpcyBub3QgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisKKyAgIyBJZiBtZXNzYWdlIEEgZGlyZWN0bHkgY29udGFpbnMgbWVzc2FnZSBCLCBhbmQKKyAgIyBhLkhhc0ZpZWxkKCdiJykgaXMgY3VycmVudGx5IEZhbHNlLCB0aGVuIG11dGF0aW5nIGFueQorICAjIGV4dGVuc2lvbiBpbiBCIHNob3VsZCBjaGFuZ2UgYS5IYXNGaWVsZCgnYicpIHRvIFRydWUKKyAgIyAoYW5kIHNvIG9uIHVwIHRoZSBvYmplY3QgdHJlZSkuCisgIGRlZiB0ZXN0SGFzQml0c0ZvckFuY2VzdG9yc09mRXh0ZW5kZWRNZXNzYWdlKHNlbGYpOgorICAgICMgT3B0aW9uYWwgc2NhbGFyIGV4dGVuc2lvbi4KKyAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uXSA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorCisgICAgIyBSZXBlYXRlZCBzY2FsYXIgZXh0ZW5zaW9uLgorICAgIHRvcGxldmVsID0gbW9yZV9leHRlbnNpb25zX3BiMi5Ub3BMZXZlbE1lc3NhZ2UoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfaW50X2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uXS5hcHBlbmQoMjMpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMjNdLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfaW50X2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRUcnVlKHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisKKyAgICAjIE9wdGlvbmFsIG1lc3NhZ2UgZXh0ZW5zaW9uLgorICAgIHRvcGxldmVsID0gbW9yZV9leHRlbnNpb25zX3BiMi5Ub3BMZXZlbE1lc3NhZ2UoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbl0uZm9yZWlnbl9tZXNzYWdlX2ludCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX21lc3NhZ2VfZXh0ZW5zaW9uXS5mb3JlaWduX21lc3NhZ2VfaW50ID0gMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb25dLmZvcmVpZ25fbWVzc2FnZV9pbnQpCisgICAgc2VsZi5hc3NlcnRUcnVlKHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisKKyAgICAjIFJlcGVhdGVkIG1lc3NhZ2UgZXh0ZW5zaW9uLgorICAgIHRvcGxldmVsID0gbW9yZV9leHRlbnNpb25zX3BiMi5Ub3BMZXZlbE1lc3NhZ2UoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbih0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfbWVzc2FnZV9leHRlbnNpb25dKSkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgZm9yZWlnbiA9IHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZvcmVpZ24sIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbl1bMF0pCisgICAgc2VsZi5hc3NlcnRUcnVlKHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisKKyAgZGVmIHRlc3REaXNjb25uZWN0aW9uQWZ0ZXJDbGVhcmluZ0VtcHR5TWVzc2FnZShzZWxmKToKKyAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKKyAgICBleHRlbmRlZV9wcm90byA9IHRvcGxldmVsLnN1Ym1lc3NhZ2UKKyAgICBleHRlbnNpb24gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX21lc3NhZ2VfZXh0ZW5zaW9uCisgICAgZXh0ZW5zaW9uX3Byb3RvID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCisgICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIGV4dGVuc2lvbl9wcm90by5mb3JlaWduX21lc3NhZ2VfaW50ID0gMjMKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHRlbnNpb25fcHJvdG8gaXMgbm90IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKworICBkZWYgdGVzdEV4dGVuc2lvbkZhaWx1cmVNb2RlcyhzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisKKyAgICAjIFRyeSBub24tZXh0ZW5zaW9uLWhhbmRsZSBhcmd1bWVudHMgdG8gSGFzRXh0ZW5zaW9uLAorICAgICMgQ2xlYXJFeHRlbnNpb24oKSwgYW5kIEV4dGVuc2lvbnNbXS4uLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24sIDEyMzQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uLCAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fZ2V0aXRlbV9fLCAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fc2V0aXRlbV9fLCAxMjM0LCA1KQorCisgICAgIyBUcnkgc29tZXRoaW5nIHRoYXQgKmlzKiBhbiBleHRlbnNpb24gaGFuZGxlLCBqdXN0IG5vdCBmb3IKKyAgICAjIHRoaXMgbWVzc2FnZS4uLgorICAgIHVua25vd25faGFuZGxlID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2hhbmRsZSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9oYW5kbGUpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMuX19nZXRpdGVtX18sCisgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9oYW5kbGUpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMuX19zZXRpdGVtX18sCisgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9oYW5kbGUsIDUpCisKKyAgICAjIFRyeSBjYWxsIEhhc0V4dGVuc2lvbigpIHdpdGggYSB2YWxpZCBoYW5kbGUsIGJ1dCBmb3IgYQorICAgICMgKnJlcGVhdGVkKiBmaWVsZC4gIChKdXN0IGFzIHdpdGggbm9uLWV4dGVuc2lvbiByZXBlYXRlZAorICAgICMgZmllbGRzLCBIYXMqKCkgaXNuJ3Qgc3VwcG9ydGVkIGZvciBleHRlbnNpb24gcmVwZWF0ZWQgZmllbGRzKS4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKQorCisgIGRlZiB0ZXN0U3RhdGljUGFyc2VGcm9tKHNlbGYpOgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMocHJvdG8xKQorCisgICAgc3RyaW5nMSA9IHByb3RvMS5TZXJpYWxpemVUb1N0cmluZygpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5Gcm9tU3RyaW5nKHN0cmluZzEpCisKKyAgICAjIE1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvMiwgcHJvdG8xKQorCisgIGRlZiB0ZXN0TWVyZ2VGcm9tU2luZ3VsYXJGaWVsZChzZWxmKToKKyAgICAjIFRlc3QgbWVyZ2Ugd2l0aCBqdXN0IGEgc2luZ3VsYXIgZmllbGQuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8xLm9wdGlvbmFsX2ludDMyID0gMQorCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgIyBUaGlzIHNob3VsZG4ndCBnZXQgb3ZlcndyaXR0ZW4uCisgICAgcHJvdG8yLm9wdGlvbmFsX3N0cmluZyA9ICd2YWx1ZScKKworICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZhbHVlJywgcHJvdG8yLm9wdGlvbmFsX3N0cmluZykKKworICBkZWYgdGVzdE1lcmdlRnJvbVJlcGVhdGVkRmllbGQoc2VsZik6CisgICAgIyBUZXN0IG1lcmdlIHdpdGgganVzdCBhIHJlcGVhdGVkIGZpZWxkLgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDIpCisKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzIucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDApCisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlsyXSkKKworICBkZWYgdGVzdE1lcmdlRnJvbU9wdGlvbmFsR3JvdXAoc2VsZik6CisgICAgIyBUZXN0IG1lcmdlIHdpdGggYW4gb3B0aW9uYWwgZ3JvdXAuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8xLm9wdGlvbmFsZ3JvdXAuYSA9IDEyCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiwgcHJvdG8yLm9wdGlvbmFsZ3JvdXAuYSkKKworICBkZWYgdGVzdE1lcmdlRnJvbVJlcGVhdGVkTmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICAjIFRlc3QgbWVyZ2Ugd2l0aCBhIHJlcGVhdGVkIG5lc3RlZCBtZXNzYWdlLgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG0gPSBwcm90bzEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtLmJiID0gMTIzCisgICAgbSA9IHByb3RvMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG0uYmIgPSAzMjEKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG0gPSBwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtLmJiID0gOTk5CisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5OTksIHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgcHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzIxLCBwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMl0uYmIpCisKKyAgICBwcm90bzMgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tKHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk5OSwgcHJvdG8zLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzMjEsIHByb3RvMy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXS5iYikKKworICBkZWYgdGVzdE1lcmdlRnJvbUFsbEZpZWxkcyhzZWxmKToKKyAgICAjIFdpdGggYWxsIGZpZWxkcyBzZXQuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bzEpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisKKyAgICAjIE1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvMiwgcHJvdG8xKQorCisgICAgIyBTZXJpYWxpemVkIHN0cmluZyBzaG91bGQgYmUgZXF1YWwgdG9vLgorICAgIHN0cmluZzEgPSBwcm90bzEuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHN0cmluZzIgPSBwcm90bzIuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nMSwgc3RyaW5nMikKKworICBkZWYgdGVzdE1lcmdlRnJvbUV4dGVuc2lvbnNTaW5ndWxhcihzZWxmKToKKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHByb3RvMS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dID0gMQorCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAxLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSkKKworICBkZWYgdGVzdE1lcmdlRnJvbUV4dGVuc2lvbnNSZXBlYXRlZChzZWxmKToKKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHByb3RvMS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dLmFwcGVuZCgxKQorICAgIHByb3RvMS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyKQorCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMCkKKyAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAzLCBsZW4ocHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDAsIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDEsIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDIsIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dWzJdKQorCisgIGRlZiB0ZXN0TWVyZ2VGcm9tRXh0ZW5zaW9uc05lc3RlZE1lc3NhZ2Uoc2VsZik6CisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHQxID0gcHJvdG8xLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dCisgICAgbSA9IGV4dDEuYWRkKCkKKyAgICBtLmJiID0gMjIyCisgICAgbSA9IGV4dDEuYWRkKCkKKyAgICBtLmJiID0gMzMzCisKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGV4dDIgPSBwcm90bzIuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0KKyAgICBtID0gZXh0Mi5hZGQoKQorICAgIG0uYmIgPSAxMTEKKworICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorICAgIGV4dDIgPSBwcm90bzIuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihleHQyKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDExMSwgZXh0MlswXS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIyMiwgZXh0MlsxXS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMzMywgZXh0MlsyXS5iYikKKworICBkZWYgdGVzdE1lcmdlRnJvbUJ1ZyhzZWxmKToKKyAgICBtZXNzYWdlMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UyID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICAjIENhdXNlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHRvIGJlIGluc3RhbnRpYXRlZCB3aXRoaW4gbWVzc2FnZTEsIGV2ZW4KKyAgICAjIHRob3VnaCBpdCBpcyBub3QgY29uc2lkZXJlZCB0byBiZSAicHJlc2VudCIuCisgICAgbWVzc2FnZTEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UxLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisgICAgIyBNZXJnZSBpbnRvIG1lc3NhZ2UyLiAgVGhpcyBzaG91bGQgbm90IGluc3RhbnRpYXRlIHRoZSBmaWVsZCBpcyBtZXNzYWdlMi4KKyAgICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtZXNzYWdlMi5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICBkZWYgdGVzdENvcHlGcm9tU2luZ3VsYXJGaWVsZChzZWxmKToKKyAgICAjIFRlc3QgY29weSB3aXRoIGp1c3QgYSBzaW5ndWxhciBmaWVsZC4KKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzEub3B0aW9uYWxfaW50MzIgPSAxCisgICAgcHJvdG8xLm9wdGlvbmFsX3N0cmluZyA9ICdpbXBvcnRhbnQtdGV4dCcKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5vcHRpb25hbF9zdHJpbmcgPSAndmFsdWUnCisKKyAgICBwcm90bzIuQ29weUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ltcG9ydGFudC10ZXh0JywgcHJvdG8yLm9wdGlvbmFsX3N0cmluZykKKworICBkZWYgdGVzdENvcHlGcm9tUmVwZWF0ZWRGaWVsZChzZWxmKToKKyAgICAjIFRlc3QgY29weSB3aXRoIGEgcmVwZWF0ZWQgZmllbGQuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMCkKKyAgICBwcm90bzIuQ29weUZyb20ocHJvdG8xKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIucmVwZWF0ZWRfaW50MzJbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzIucmVwZWF0ZWRfaW50MzJbMV0pCisKKyAgZGVmIHRlc3RDb3B5RnJvbUFsbEZpZWxkcyhzZWxmKToKKyAgICAjIFdpdGggYWxsIGZpZWxkcyBzZXQuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bzEpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLkNvcHlGcm9tKHByb3RvMSkKKworICAgICMgTWVzc2FnZXMgc2hvdWxkIGJlIGVxdWFsLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8yLCBwcm90bzEpCisKKyAgICAjIFNlcmlhbGl6ZWQgc3RyaW5nIHNob3VsZCBiZSBlcXVhbCB0b28uCisgICAgc3RyaW5nMSA9IHByb3RvMS5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc3RyaW5nMiA9IHByb3RvMi5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcxLCBzdHJpbmcyKQorCisgIGRlZiB0ZXN0Q29weUZyb21TZWxmKHNlbGYpOgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBwcm90bzEub3B0aW9uYWxfaW50MzIgPSAyCisgICAgcHJvdG8xLm9wdGlvbmFsX3N0cmluZyA9ICdpbXBvcnRhbnQtdGV4dCcKKworICAgIHByb3RvMS5Db3B5RnJvbShwcm90bzEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzEucmVwZWF0ZWRfaW50MzJbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzEub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnaW1wb3J0YW50LXRleHQnLCBwcm90bzEub3B0aW9uYWxfc3RyaW5nKQorCisgIGRlZiB0ZXN0Q29weUZyb21CYWRUeXBlKHNlbGYpOgorICAgICMgVGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBpbiB0aGlzCisgICAgIyBjYXNlLiBJbiB0aGVvcnkgaXQgc2hvdWxkLgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6CisgICAgICByZXR1cm4KKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8xLkNvcHlGcm9tLCBwcm90bzIpCisKKyAgZGVmIHRlc3RDbGVhcihzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgICMgQysrIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgbGF6eSBmaWVsZHMgcmlnaHQgbm93IHNvIGxlYXZlIGl0CisgICAgIyBvdXQgZm9yIG5vdy4KKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bykKKyAgICBlbHNlOgorICAgICAgdGVzdF91dGlsLlNldEFsbE5vbkxhenlGaWVsZHMocHJvdG8pCisgICAgIyBDbGVhciB0aGUgbWVzc2FnZS4KKyAgICBwcm90by5DbGVhcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMocHJvdG8uQnl0ZVNpemUoKSwgMCkKKyAgICBlbXB0eV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHByb3RvLCBlbXB0eV9wcm90bykKKworICAgICMgVGVzdCBpZiBleHRlbnNpb25zIHdoaWNoIHdlcmUgc2V0IGFyZSBjbGVhcmVkLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhwcm90bykKKyAgICAjIENsZWFyIHRoZSBtZXNzYWdlLgorICAgIHByb3RvLkNsZWFyKCkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhwcm90by5CeXRlU2l6ZSgpLCAwKQorICAgIGVtcHR5X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhwcm90bywgZW1wdHlfcHJvdG8pCisKKyAgZGVmIHRlc3REaXNjb25uZWN0aW5nQmVmb3JlQ2xlYXIoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBuZXN0ZWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQorICAgIHByb3RvLkNsZWFyKCkKKyAgICBzZWxmLmFzc2VydFRydWUobmVzdGVkIGlzIG5vdCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBuZXN0ZWQuYmIgPSAyMworICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbmVzdGVkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBuZXN0ZWQuYmIgPSA1CisgICAgZm9yZWlnbiA9IHByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZQorICAgIGZvcmVpZ24uYyA9IDYKKworICAgIHByb3RvLkNsZWFyKCkKKyAgICBzZWxmLmFzc2VydFRydWUobmVzdGVkIGlzIG5vdCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUoZm9yZWlnbiBpcyBub3QgcHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbmVzdGVkLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgZm9yZWlnbi5jKQorICAgIG5lc3RlZC5iYiA9IDE1CisgICAgZm9yZWlnbi5jID0gMTYKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuYykKKworICBkZWYgYXNzZXJ0SW5pdGlhbGl6ZWQoc2VsZiwgcHJvdG8pOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5Jc0luaXRpYWxpemVkKCkpCisgICAgIyBOZWl0aGVyIG1ldGhvZCBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQorCisgIGRlZiBhc3NlcnROb3RJbml0aWFsaXplZChzZWxmLCBwcm90byk6CisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5Jc0luaXRpYWxpemVkKCkpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcpCisgICAgIyAiUGFydGlhbCIgc2VyaWFsaXphdGlvbiBkb2Vzbid0IGNhcmUgaWYgbWVzc2FnZSBpcyB1bmluaXRpYWxpemVkLgorICAgIHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgZGVmIHRlc3RJc0luaXRpYWxpemVkKHNlbGYpOgorICAgICMgVHJpdmlhbCBjYXNlcyAtIGFsbCBvcHRpb25hbCBmaWVsZHMgYW5kIGV4dGVuc2lvbnMuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorCisgICAgIyBUaGUgY2FzZSBvZiB1bmluaXRpYWxpemVkIHJlcXVpcmVkIGZpZWxkcy4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCisgICAgcHJvdG8uYSA9IHByb3RvLmIgPSBwcm90by5jID0gMgorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisKKyAgICAjIFRoZSBjYXNlIG9mIHVuaW5pdGlhbGl6ZWQgc3VibWVzc2FnZS4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKCkKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYSA9IDEKKyAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvKQorICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYiA9IDAKKyAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmMgPSAwCisgICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKKworICAgICMgVW5pbml0aWFsaXplZCByZXBlYXRlZCBzdWJtZXNzYWdlLgorICAgIG1lc3NhZ2UxID0gcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCisgICAgbWVzc2FnZTEuYSA9IG1lc3NhZ2UxLmIgPSBtZXNzYWdlMS5jID0gMAorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisKKyAgICAjIFVuaW5pdGlhbGl6ZWQgcmVwZWF0ZWQgZ3JvdXAgaW4gYW4gZXh0ZW5zaW9uLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLm11bHRpCisgICAgbWVzc2FnZTEgPSBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYWRkKCkKKyAgICBtZXNzYWdlMiA9IHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCisgICAgbWVzc2FnZTEuYSA9IDEKKyAgICBtZXNzYWdlMS5iID0gMQorICAgIG1lc3NhZ2UxLmMgPSAxCisgICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bykKKyAgICBtZXNzYWdlMi5hID0gMgorICAgIG1lc3NhZ2UyLmIgPSAyCisgICAgbWVzc2FnZTIuYyA9IDIKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorCisgICAgIyBVbmluaXRpYWxpemVkIG5vbnJlcGVhdGVkIG1lc3NhZ2UgaW4gYW4gZXh0ZW5zaW9uLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZQorICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hID0gMQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmIgPSAyCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMgPSAzCisgICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKKworICAgICMgVHJ5IHBhc3NpbmcgYW4gZXJyb3JzIGxpc3QuCisgICAgZXJyb3JzID0gW10KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSXNJbml0aWFsaXplZChlcnJvcnMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyb3JzLCBbJ2EnLCAnYicsICdjJ10pCisKKyAgZGVmIHRlc3RTdHJpbmdVVEY4RW5jb2Rpbmcoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgICMgQXNzaWdubWVudCBvZiBhIHVuaWNvZGUgb2JqZWN0IHRvIGEgZmllbGQgb2YgdHlwZSAnYnl0ZXMnIGlzIG5vdCBhbGxvd2VkLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2J5dGVzJywgdSd1bmljb2RlIG9iamVjdCcpCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgb2YgcHl0aG9uJ3MgJ3VuaWNvZGUnIHR5cGUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByb3RvLm9wdGlvbmFsX3N0cmluZyksIHVuaWNvZGUpCisKKyAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSB1bmljb2RlKCdUZXN0aW5nJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLm9wdGlvbmFsX3N0cmluZywgc3RyKCdUZXN0aW5nJykpCisKKyAgICAjIEFzc2lnbiBhIHZhbHVlIG9mIHR5cGUgJ3N0cicgd2hpY2ggY2FuIGJlIGVuY29kZWQgaW4gVVRGLTguCisgICAgcHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gc3RyKCdUZXN0aW5nJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLm9wdGlvbmFsX3N0cmluZywgdW5pY29kZSgnVGVzdGluZycpKQorCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgICMgVmFsdWVzIG9mIHR5cGUgJ3N0cicgYXJlIGFsc28gYWNjZXB0ZWQgYXMgbG9uZyBhcyB0aGV5IGNhbiBiZQorICAgICAgIyBlbmNvZGVkIGluIFVURi04LgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByb3RvLm9wdGlvbmFsX3N0cmluZyksIHN0cikKKworICAgICMgVHJ5IHRvIGFzc2lnbiBhICdzdHInIHZhbHVlIHdoaWNoIGNvbnRhaW5zIGJ5dGVzIHRoYXQgYXJlbid0IDctYml0IEFTQ0lJLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9zdHJpbmcnLCBzdHIoJ2FceDgwYScpKQorICAgICMgQXNzaWduIGEgJ3N0cicgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX3N0cmluZycsICfQotC10YHRgicpCisgICAgIyBObyBleGNlcHRpb24gdGhyb3duLgorICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9ICdhYmMnCisKKyAgZGVmIHRlc3RTdHJpbmdVVEY4U2VyaWFsaXphdGlvbihzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBleHRlbnNpb25fbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMgorICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbl9tZXNzYWdlLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorCisgICAgdGVzdF91dGY4ID0gdSfQotC10YHRgicKKyAgICB0ZXN0X3V0ZjhfYnl0ZXMgPSB0ZXN0X3V0ZjguZW5jb2RlKCd1dGYtOCcpCisKKyAgICAjICdUZXN0JyBpbiBhbm90aGVyIGxhbmd1YWdlLCB1c2luZyBVVEYtOCBjaGFyc2V0LgorICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5zdHIgPSB0ZXN0X3V0ZjgKKworICAgICMgU2VyaWFsaXplIHVzaW5nIHRoZSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0ICh0aGlzIGlzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAjIC5wcm90byBmaWxlKS4KKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgIyBDaGVjayBieXRlIHNpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCisKKyAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKKyAgICByYXcuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisKKyAgICBtZXNzYWdlMiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMigpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihyYXcuaXRlbSkpCisgICAgIyBDaGVjayB0aGF0IHRoZSB0eXBlX2lkIGlzIHRoZSBzYW1lIGFzIHRoZSB0YWcgSUQgaW4gdGhlIC5wcm90byBmaWxlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3Lml0ZW1bMF0udHlwZV9pZCwgMTU0Nzc2OSkKKworICAgICMgQ2hlY2sgdGhlIGFjdHVhbCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIHJhdy5pdGVtWzBdLm1lc3NhZ2UuZW5kc3dpdGgodGVzdF91dGY4X2J5dGVzKSkKKyAgICBtZXNzYWdlMi5NZXJnZUZyb21TdHJpbmcocmF3Lml0ZW1bMF0ubWVzc2FnZSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtZXNzYWdlMi5zdHIpLCB1bmljb2RlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZTIuc3RyLCB0ZXN0X3V0ZjgpCisKKyAgICAjIFRoZSBwdXJlIFB5dGhvbiBBUEkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBNZXJnZUZyb21TdHJpbmcoKSwKKyAgICAjIGlmIGFueSBvZiB0aGUgc3RyaW5nIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBjYW4ndCBiZSBVVEYtOCBkZWNvZGVkLgorICAgICMgVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJIGhhcyBubyB3YXkgdG8gY2hlY2sgdGhhdCBvbgorICAgICMgTWVyZ2VGcm9tU3RyaW5nIGFuZCB0aHVzIGhhcyBubyB3YXkgdG8gdGhyb3cgdGhlIGV4Y2VwdGlvbi4KKyAgICAjCisgICAgIyBUaGUgcHVyZSBQeXRob24gQVBJIGFsd2F5cyByZXR1cm5zIG9iamVjdHMgb2YgdHlwZSAndW5pY29kZScgKFVURi04CisgICAgIyBlbmNvZGVkKSwgb3IgJ3N0cicgKGluIDcgYml0IEFTQ0lJKS4KKyAgICBieXRlcyA9IHJhdy5pdGVtWzBdLm1lc3NhZ2UucmVwbGFjZSgKKyAgICAgICAgdGVzdF91dGY4X2J5dGVzLCBsZW4odGVzdF91dGY4X2J5dGVzKSAqICdceGZmJykKKworICAgIHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgbWVzc2FnZTIuTWVyZ2VGcm9tU3RyaW5nKGJ5dGVzKQorICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IgYXMgZToKKyAgICAgIHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCA9IFRydWUKKyAgICBzdHJpbmdfZmllbGQgPSBtZXNzYWdlMi5zdHIKKyAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZV9kZWNvZGVfZmFpbGVkIG9yIHR5cGUoc3RyaW5nX2ZpZWxkKSA9PSBzdHIpCisKKyAgZGVmIHRlc3RFbXB0eU5lc3RlZE1lc3NhZ2Uoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5NZXJnZUZyb20oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ29weUZyb20oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tU3RyaW5nKCcnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKCcnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90bzIuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIHRlc3RTZXRJblBhcmVudChzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKyAgICBwcm90by5vcHRpb25hbGdyb3VwLlNldEluUGFyZW50KCkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKworCisjICBTaW5jZSB3ZSBoYWQgc28gbWFueSB0ZXN0cyBmb3IgcHJvdG9jb2wgYnVmZmVyIGVxdWFsaXR5LCB3ZSBicm9rZSB0aGVzZSBvdXQKKyMgIGludG8gc2VwYXJhdGUgVGVzdENhc2UgY2xhc3Nlcy4KKworCitjbGFzcyBUZXN0QWxsVHlwZXNFcXVhbGl0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLmZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5zZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICBkZWYgdGVzdE5vdEhhc2hhYmxlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5maXJzdF9wcm90bykKKworICBkZWYgdGVzdFNlbGZFcXVhbGl0eShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuZmlyc3RfcHJvdG8pCisKKyAgZGVmIHRlc3RFbXB0eVByb3Rvc0VxdWFsKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKworY2xhc3MgRnVsbFByb3Rvc0VxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgIiIiRXF1YWxpdHkgdGVzdHMgdXNpbmcgY29tcGxldGVseS1mdWxsIHByb3RvcyBhcyBhIHN0YXJ0aW5nIHBvaW50LiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLmZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5zZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHNlbGYuZmlyc3RfcHJvdG8pCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vdEhhc2hhYmxlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5maXJzdF9wcm90bykKKworICBkZWYgdGVzdE5vbmVOb3RFcXVhbChzZWxmKToKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIE5vbmUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChOb25lLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vdEVxdWFsVG9PdGhlck1lc3NhZ2Uoc2VsZik6CisgICAgdGhpcmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHRoaXJkX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGhpcmRfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0QWxsRmllbGRzRmlsbGVkRXF1YWxpdHkoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgICMgTm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkIGNoYW5nZSBzaG91bGQgY2F1c2UgaW5lcXVhbGl0eS4KKyAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyICs9IDEKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorICAgICMgLi4uYXMgc2hvdWxkIGNsZWFyaW5nIGEgZmllbGQuCisgICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkQ29tcG9zaXRlKHNlbGYpOgorICAgICMgQ2hhbmdlIGEgbm9ucmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgKz0gMQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiAtPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIENsZWFyIGEgZmllbGQgaW4gdGhlIG5lc3RlZCBtZXNzYWdlLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9ICgKKyAgICAgICAgc2VsZi5zZWNvbmRfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIFJlbW92ZSB0aGUgbmVzdGVkIG1lc3NhZ2UgZW50aXJlbHkuCisgICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgICMgQ2hhbmdlIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGUoc2VsZik6CisgICAgIyBDaGFuZ2UgdmFsdWUgd2l0aGluIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIgKz0gMQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiAtPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIEFkZCBhIHZhbHVlIHRvIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorICAgIHNlbGYuc2Vjb25kX3Byb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFySGFzQml0cyhzZWxmKToKKyAgICAjIEVuc3VyZSB0aGF0IHdlIHRlc3QgImhhcyIgYml0cyBhcyB3ZWxsIGFzIHZhbHVlIGZvcgorICAgICMgbm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIHNlbGYuc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMAorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3ROb25SZXBlYXRlZENvbXBvc2l0ZUhhc0JpdHMoc2VsZik6CisgICAgIyBFbnN1cmUgdGhhdCB3ZSB0ZXN0ICJoYXMiIGJpdHMgYXMgd2VsbCBhcyB2YWx1ZSBmb3IKKyAgICAjIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4KKyAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKKyAgICBzZWxmLnNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5DbGVhckZpZWxkKCdiYicpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMAorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKworY2xhc3MgRXh0ZW5zaW9uRXF1YWxpdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdEV4dGVuc2lvbkVxdWFsaXR5KHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhmaXJzdF9wcm90bykKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisgICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoc2Vjb25kX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICAgICMgRW5zdXJlIHRoYXQgd2UgY2hlY2sgdmFsdWUgZXF1YWxpdHkuCisgICAgZmlyc3RfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSArPSAxCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorICAgIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gLT0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICAgICMgRW5zdXJlIHRoYXQgd2UgYWxzbyBsb29rIGF0ICJoYXMiIGJpdHMuCisgICAgZmlyc3RfcHJvdG8uQ2xlYXJFeHRlbnNpb24odW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikKKyAgICBzZWNvbmRfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDAKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisgICAgZmlyc3RfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDAKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgICAjIEVuc3VyZSB0aGF0IGRpZmZlcmVuY2VzIGluIGNhY2hlZCB2YWx1ZXMKKyAgICAjIGRvbid0IG1hdHRlciBpZiAiaGFzIiBiaXRzIGFyZSBib3RoIGZhbHNlLgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDAsIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisKK2NsYXNzIE11dHVhbFJlY3Vyc2lvbkVxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RFcXVhbGl0eVdpdGhNdXR1YWxSZWN1cnNpb24oc2VsZik6CisgICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdE11dHVhbFJlY3Vyc2lvbkEoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorICAgIGZpcnN0X3Byb3RvLmJiLmEuYmIub3B0aW9uYWxfaW50MzIgPSAyMworICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKyAgICBzZWNvbmRfcHJvdG8uYmIuYS5iYi5vcHRpb25hbF9pbnQzMiA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisKK2NsYXNzIEJ5dGVTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvID0gbW9yZV9leHRlbnNpb25zX3BiMi5FeHRlbmRlZE1lc3NhZ2UoKQorICAgIHNlbGYucGFja2VkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorCisgIGRlZiBTaXplKHNlbGYpOgorICAgIHJldHVybiBzZWxmLnByb3RvLkJ5dGVTaXplKCkKKworICBkZWYgdGVzdEVtcHR5TWVzc2FnZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFNpemVkT25Ld2FyZ3Moc2VsZik6CisgICAgIyBVc2UgYSBzZXBhcmF0ZSBtZXNzYWdlIHRvIGVuc3VyZSB0ZXN0aW5nIHJpZ2h0IGFmdGVyIGNyZWF0aW9uLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5CeXRlU2l6ZSgpKQorICAgIHByb3RvX2t3YXJncyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfaW50NjQgPSAxKQorICAgICMgT25lIGJ5dGUgZm9yIHRoZSB0YWcsIG9uZSB0byBlbmNvZGUgdmFyaW50IDEuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90b19rd2FyZ3MuQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFZhcmludHMoc2VsZik6CisgICAgZGVmIFRlc3QoaSwgZXhwZWN0ZWRfdmFyaW50X3NpemUpOgorICAgICAgc2VsZi5wcm90by5DbGVhcigpCisgICAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ludDY0ID0gaQorICAgICAgIyBBZGQgb25lIHRvIHRoZSB2YXJpbnQgc2l6ZSBmb3IgdGhlIHRhZyBpbmZvCisgICAgICAjIGZvciB0YWcgMS4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFyaW50X3NpemUgKyAxLCBzZWxmLlNpemUoKSkKKyAgICBUZXN0KDAsIDEpCisgICAgVGVzdCgxLCAxKQorICAgIGZvciBpLCBudW1fYnl0ZXMgaW4gemlwKHJhbmdlKDcsIDYzLCA3KSwgcmFuZ2UoMSwgMTAwMDApKToKKyAgICAgIFRlc3QoKDEgPDwgaSkgLSAxLCBudW1fYnl0ZXMpCisgICAgVGVzdCgtMSwgMTApCisgICAgVGVzdCgtMiwgMTApCisgICAgVGVzdCgtKDEgPDwgNjMpLCAxMCkKKworICBkZWYgdGVzdFN0cmluZ3Moc2VsZik6CisgICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnJworICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuU2l6ZSgpKQorCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnYWJjJworICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKKworICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ3gnICogMTI4CisgICAgIyBOZWVkIG9uZSBieXRlIGZvciB0YWcgaW5mbyAodGFnICMxNCksIGFuZCBUV08gYnl0ZXMgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdE90aGVyTnVtZXJpY3Moc2VsZik6CisgICAgc2VsZi5wcm90by5vcHRpb25hbF9maXhlZDMyID0gMTIzNAorICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgNCBieXRlcyBmb3IgZml4ZWQzMi4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuU2l6ZSgpKQorICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZml4ZWQ2NCA9IDEyMzQKKyAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDggYnl0ZXMgZm9yIGZpeGVkNjQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2Zsb2F0ID0gMS4yMzQKKyAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDQgYnl0ZXMgZm9yIGZsb2F0LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5TaXplKCkpCisgICAgc2VsZi5wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9kb3VibGUgPSAxLjIzNAorICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgOCBieXRlcyBmb3IgZmxvYXQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX3NpbnQzMiA9IDY0CisgICAgIyBPbmUgYnl0ZSBmb3IgdGFnIGFuZCAyIGJ5dGVzIGZvciB6aWctemFnLWVuY29kZWQgNjQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgZGVmIHRlc3RDb21wb3NpdGVzKHNlbGYpOgorICAgICMgMyBieXRlcy4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gKDEgPDwgMTQpCisgICAgIyBQbHVzIG9uZSBieXRlIGZvciBiYiB0YWcuCisgICAgIyBQbHVzIDEgYnl0ZSBmb3Igb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Ugc2VyaWFsaXplZCBzaXplLgorICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHRhZy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyAxICsgMSArIDIsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0R3JvdXBzKHNlbGYpOgorICAgICMgNCBieXRlcy4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsZ3JvdXAuYSA9ICgxIDw8IDIxKQorICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIHxhfCB0YWcuCisgICAgIyBQbHVzIDIgKiB0d28gYnl0ZXMgZm9yIFNUQVJUX0dST1VQIGFuZCBFTkRfR1JPVVAgdGFncy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDQgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFycyhzZWxmKToKKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCisKKyAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNFeHRlbmQoc2VsZik6CisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEwLCAxMjhdKSAgIyAzIGJ5dGVzLgorICAgICMgQWxzbyBuZWVkIDIgYnl0ZXMgZm9yIGVhY2ggZW50cnkgZm9yIHRhZy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDEgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyc1JlbW92ZShzZWxmKToKKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoMTI4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSArIDIsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVzKHNlbGYpOgorICAgICMgRW1wdHkgbWVzc2FnZS4gIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aC4KKyAgICBmb3JlaWduX21lc3NhZ2VfMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KKyAgICBmb3JlaWduX21lc3NhZ2VfMSA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBmb3JlaWduX21lc3NhZ2VfMS5iYiA9IDcKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMiArIDEgKyAxICsgMSwgc2VsZi5TaXplKCkpCisKKyAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZXNEZWxldGUoc2VsZik6CisgICAgIyBFbXB0eSBtZXNzYWdlLiAgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoLgorICAgIGZvcmVpZ25fbWVzc2FnZV8wID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIGZvcmVpZ25fbWVzc2FnZV8xID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIGZvcmVpZ25fbWVzc2FnZV8xLmJiID0gOQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKKworICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIGRlbCBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKKworICAgICMgTm93IGFkZCBhIG5ldyBtZXNzYWdlLgorICAgIGZvcmVpZ25fbWVzc2FnZV8yID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIGZvcmVpZ25fbWVzc2FnZV8yLmJiID0gMTIKKworICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAxICsgMSArIDIgKyAxICsgMSArIDEsIHNlbGYuU2l6ZSgpKQorCisgICAgIyAyIGJ5dGVzIHRhZyBwbHVzIDEgYnl0ZSBsZW5ndGggcGx1cyAxIGJ5dGUgYmIgdGFnIDEgYnl0ZSBpbnQuCisgICAgZGVsIHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMSArIDEsIHNlbGYuU2l6ZSgpKQorCisgICAgZGVsIHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRHcm91cHMoc2VsZik6CisgICAgIyAyLWJ5dGUgU1RBUlRfR1JPVVAgcGx1cyAyLWJ5dGUgRU5EX0dST1VQLgorICAgIGdyb3VwXzAgPSBzZWxmLnByb3RvLnJlcGVhdGVkZ3JvdXAuYWRkKCkKKyAgICAjIDItYnl0ZSBTVEFSVF9HUk9VUCBwbHVzIDItYnl0ZSB8YXwgdGFnICsgMS1ieXRlIHxhfAorICAgICMgcGx1cyAyLWJ5dGUgRU5EX0dST1VQLgorICAgIGdyb3VwXzEgPSBzZWxmLnByb3RvLnJlcGVhdGVkZ3JvdXAuYWRkKCkKKyAgICBncm91cF8xLmEgPSAgNworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDIgKyAyICsgMiArIDEgKyAyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdEV4dGVuc2lvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAjIEZpZWxkICMxLCAxIGJ5dGUuCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gMjMKKyAgICAjIDEgYnl0ZSBmb3IgdGFnLCAxIGJ5dGUgZm9yIHZhbHVlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yTm9ucmVwZWF0ZWRTY2FsYXIoc2VsZik6CisgICAgIyBUZXN0IG5vbi1leHRlbnNpb24uCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ludDMyID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisKKyAgICAjIFRlc3Qgd2l0aGluIGV4dGVuc2lvbi4KKyAgICBleHRlbnNpb24gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb24KKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDEyOAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgIGRlZiB0ZXN0Q2FjaGVJbnZhbGlkYXRpb25Gb3JSZXBlYXRlZFNjYWxhcihzZWxmKToKKyAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMlsxXSA9IDEyOAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgncmVwZWF0ZWRfaW50MzInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorCisgICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCisgICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uCisgICAgcmVwZWF0ZWQgPSBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQorICAgIHJlcGVhdGVkLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHJlcGVhdGVkLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHJlcGVhdGVkWzFdID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisKKyAgZGVmIHRlc3RDYWNoZUludmFsaWRhdGlvbkZvck5vbnJlcGVhdGVkTWVzc2FnZShzZWxmKToKKyAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMgPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5DbGVhckZpZWxkKCdjJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgIyBUaGlzIGlzIG9ubHkgcG9zc2libGUgaW4gcHVyZS1QeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKyAgICAgIGNoaWxkID0gc2VsZi5wcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UKKyAgICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlJykKKyAgICAgIGNoaWxkLmMgPSAxMjgKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorCisgICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCisgICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbgorICAgIGNoaWxkID0gc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZC5mb3JlaWduX21lc3NhZ2VfaW50ID0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIGNoaWxkLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yUmVwZWF0ZWRNZXNzYWdlKHNlbGYpOgorICAgICMgVGVzdCBub24tZXh0ZW5zaW9uLgorICAgIGNoaWxkMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UuYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZDAuYyA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDgsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisKKyAgICAjIFRlc3Qgd2l0aGluIGV4dGVuc2lvbi4KKyAgICBleHRlbnNpb24gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uCisgICAgY2hpbGRfbGlzdCA9IHNlbGYuZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCisgICAgY2hpbGQwID0gY2hpbGRfbGlzdC5hZGQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIGNoaWxkX2xpc3QuYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZDAuZm9yZWlnbl9tZXNzYWdlX2ludCA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZDAuQ2xlYXJGaWVsZCgnZm9yZWlnbl9tZXNzYWdlX2ludCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisKKyAgZGVmIHRlc3RQYWNrZWRSZXBlYXRlZFNjYWxhcnMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgICAgc2VsZi5wYWNrZWRfcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgxMCkgICAjIDEgYnl0ZS4KKyAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIFRoZSB0YWcgaXMgMiBieXRlcyAodGhlIGZpZWxkIG51bWJlciBpcyA5MCksIGFuZCB0aGUgdmFyaW50CisgICAgIyBzdG9yaW5nIHRoZSBsZW5ndGggaXMgMSBieXRlLgorICAgIGludF9zaXplID0gMSArIDIgKyAzCisgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRfc2l6ZSwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICAgIHNlbGYucGFja2VkX3Byb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDQuMikgICAjIDggYnl0ZXMKKyAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfZG91YmxlLmFwcGVuZCgzLjI1KSAgIyA4IGJ5dGVzCisgICAgIyAyIG1vcmUgdGFnIGJ5dGVzLCAxIG1vcmUgbGVuZ3RoIGJ5dGUuCisgICAgZG91YmxlX3NpemUgPSA4ICsgOCArIDMKKyAgICBzZWxmLmFzc2VydEVxdWFsKGludF9zaXplK2RvdWJsZV9zaXplLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgICAgc2VsZi5wYWNrZWRfcHJvdG8uQ2xlYXJGaWVsZCgncGFja2VkX2ludDMyJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZV9zaXplLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgIGRlZiB0ZXN0UGFja2VkRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucGFja2VkX2V4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgZXh0ZW5zaW9uID0gc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0KKyAgICBleHRlbnNpb24uZXh0ZW5kKFsxLCAyLCAzLCA0XSkgICAjIDE2IGJ5dGVzCisgICAgIyBUYWcgaXMgMyBieXRlcy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDE5LCBzZWxmLnBhY2tlZF9leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorCisKKyMgSXNzdWVzIHRvIGJlIHN1cmUgdG8gY292ZXIgaW5jbHVkZToKKyMgICAqIEhhbmRsaW5nIG9mIHVucmVjb2duaXplZCB0YWdzICgidW5pbnRlcnByZXRlZF9ieXRlcyIpLgorIyAgICogSGFuZGxpbmcgb2YgTWVzc2FnZVNldHMuCisjICAgKiBDb25zaXN0ZW50IG9yZGVyaW5nIG9mIHRhZ3MgaW4gdGhlIHdpcmUgZm9ybWF0LAorIyAgICAgaW5jbHVkaW5nIG9yZGVyaW5nIGJldHdlZW4gZXh0ZW5zaW9ucyBhbmQgbm9uLWV4dGVuc2lvbgorIyAgICAgZmllbGRzLgorIyAgICogQ29uc2lzdGVudCBzZXJpYWxpemF0aW9uIG9mIG5lZ2F0aXZlIG51bWJlcnMsIGVzcGVjaWFsbHkKKyMgICAgIG5lZ2F0aXZlIGludDMycy4KKyMgICAqIEhhbmRsaW5nIG9mIGVtcHR5IHN1Ym1lc3NhZ2VzICh3aXRoIGFuZCB3aXRob3V0ICJoYXMiCisjICAgICBiaXRzIHNldCkuCisKK2NsYXNzIFNlcmlhbGl6YXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdFNlcmlhbGl6ZUVtdHB5TWVzc2FnZShzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCisgICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFNlcmlhbGl6ZUFsbEZpZWxkcyhzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoZmlyc3RfcHJvdG8pCisgICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKKyAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplQWxsRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhmaXJzdF9wcm90bykKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3RTZXJpYWxpemVOZWdhdGl2ZVZhbHVlcyhzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAtMQorICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDY0ID0gLSgyIDw8IDQwKQorICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX3NpbnQzMiA9IC0zCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfc2ludDY0ID0gLSg0IDw8IDQwKQorICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX3NmaXhlZDMyID0gLTUKKyAgICBmaXJzdF9wcm90by5vcHRpb25hbF9zZml4ZWQ2NCA9IC0oNiA8PCA0MCkKKworICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRnJvbVN0cmluZygKKyAgICAgICAgZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFBhcnNlVHJ1bmNhdGVkKHNlbGYpOgorICAgICMgVGhpcyB0ZXN0IGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJLgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6CisgICAgICByZXR1cm4KKworICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhmaXJzdF9wcm90bykKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgZm9yIHRydW5jYXRpb25fcG9pbnQgaW4geHJhbmdlKGxlbihzZXJpYWxpemVkKSArIDEpOgorICAgICAgdHJ5OgorICAgICAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICAgICAgdW5rbm93bl9maWVsZHMgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgICAgIHBvcyA9IHNlY29uZF9wcm90by5fSW50ZXJuYWxQYXJzZShzZXJpYWxpemVkLCAwLCB0cnVuY2F0aW9uX3BvaW50KQorICAgICAgICAjIElmIHdlIGRpZG4ndCByYWlzZSBhbiBlcnJvciB0aGVuIHdlIHJlYWQgZXhhY3RseSB0aGUgYW1vdW50IGV4cGVjdGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRydW5jYXRpb25fcG9pbnQsIHBvcykKKworICAgICAgICAjIFBhcnNpbmcgdG8gdW5rbm93biBmaWVsZHMgc2hvdWxkIG5vdCB0aHJvdyBpZiBwYXJzaW5nIHRvIGtub3duIGZpZWxkcworICAgICAgICAjIGRpZCBub3QuCisgICAgICAgIHRyeToKKyAgICAgICAgICBwb3MyID0gdW5rbm93bl9maWVsZHMuX0ludGVybmFsUGFyc2Uoc2VyaWFsaXplZCwgMCwgdHJ1bmNhdGlvbl9wb2ludCkKKyAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRydW5jYXRpb25fcG9pbnQsIHBvczIpCisgICAgICAgIGV4Y2VwdCBtZXNzYWdlLkRlY29kZUVycm9yOgorICAgICAgICAgIHNlbGYuZmFpbCgnUGFyc2luZyB1bmtub3duIGZpZWxkcyBmYWlsZWQgd2hlbiBwYXJzaW5nIGtub3duIGZpZWxkcyAnCisgICAgICAgICAgICAgICAgICAgICdkaWQgbm90LicpCisgICAgICBleGNlcHQgbWVzc2FnZS5EZWNvZGVFcnJvcjoKKyAgICAgICAgIyBQYXJzaW5nIHVua25vd24gZmllbGRzIHNob3VsZCBhbHNvIGZhaWwuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRGVjb2RlRXJyb3IsIHVua25vd25fZmllbGRzLl9JbnRlcm5hbFBhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkLCAwLCB0cnVuY2F0aW9uX3BvaW50KQorCisgIGRlZiB0ZXN0Q2Fub25pY2FsU2VyaWFsaXphdGlvbk9yZGVyKHNlbGYpOgorICAgIHByb3RvID0gbW9yZV9tZXNzYWdlc19wYjIuT3V0T2ZPcmRlckZpZWxkcygpCisgICAgIyBUaGVzZSBhcmUgYWxzbyB0aGVpciB0YWcgbnVtYmVycy4gIEV2ZW4gdGhvdWdoIHdlJ3JlIHNldHRpbmcgdGhlc2UgaW4KKyAgICAjIHJldmVyc2UtdGFnIG9yZGVyIEFORCB0aGV5J3JlIGxpc3RlZCBpbiByZXZlcnNlIHRhZy1vcmRlciBpbiB0aGUgLnByb3RvCisgICAgIyBmaWxlLCB0aGV5IHNob3VsZCBub25ldGhlbGVzcyBiZSBzZXJpYWxpemVkIGluIHRhZyBvcmRlci4KKyAgICBwcm90by5vcHRpb25hbF9zaW50MzIgPSA1CisgICAgcHJvdG8uRXh0ZW5zaW9uc1ttb3JlX21lc3NhZ2VzX3BiMi5vcHRpb25hbF91aW50NjRdID0gNAorICAgIHByb3RvLm9wdGlvbmFsX3VpbnQzMiA9IDMKKyAgICBwcm90by5FeHRlbnNpb25zW21vcmVfbWVzc2FnZXNfcGIyLm9wdGlvbmFsX2ludDY0XSA9IDIKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIGQgPSBfTWluaURlY29kZXIoc2VyaWFsaXplZCkKKyAgICBSZWFkVGFnID0gZC5SZWFkRmllbGROdW1iZXJBbmRXaXJlVHlwZQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCksIFJlYWRUYWcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoMiwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgZC5SZWFkSW50NjQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCgzLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBkLlJlYWRVSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg0LCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBkLlJlYWRVSW50NjQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg1LCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBkLlJlYWRTSW50MzIoKSkKKworICBkZWYgdGVzdENhbm9uaWNhbFNlcmlhbGl6YXRpb25PcmRlclNhbWVBc0NwcChzZWxmKToKKyAgICAjIENvcHkgb2YgdGhlIHNhbWUgdGVzdCB3ZSB1c2UgZm9yIEMrKy4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKHByb3RvKQorICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKHNlcmlhbGl6ZWQpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21TdHJpbmdXaGVuRmllbGRzQWxyZWFkeVNldChzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIGZpcnN0X3Byb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2Zvb2JhcicpCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAyMworICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gNDIKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2JheicpCisgICAgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMTAwCisgICAgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gOTk5CisKKyAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgIyBFbnN1cmUgdGhhdCB3ZSBhcHBlbmQgdG8gcmVwZWF0ZWQgZmllbGRzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydiYXonLCAnZm9vYmFyJ10sIGxpc3Qoc2Vjb25kX3Byb3RvLnJlcGVhdGVkX3N0cmluZykpCisgICAgIyBFbnN1cmUgdGhhdCB3ZSBvdmVyd3JpdGUgbm9ucmVwZWF0ZCBzY2FsYXJzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIHNlY29uZF9wcm90by5vcHRpb25hbF9pbnQzMikKKyAgICAjIEVuc3VyZSB0aGF0IHdlIHJlY3Vyc2l2ZWx5IGNhbGwgTWVyZ2VGcm9tU3RyaW5nKCkgb24KKyAgICAjIHN1Ym1lc3NhZ2VzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIHNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKworICBkZWYgdGVzdE1lc3NhZ2VTZXRXaXJlRm9ybWF0KHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIGV4dGVuc2lvbl9tZXNzYWdlMSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMQorICAgIGV4dGVuc2lvbl9tZXNzYWdlMiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMgorICAgIGV4dGVuc2lvbjEgPSBleHRlbnNpb25fbWVzc2FnZTEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgZXh0ZW5zaW9uMiA9IGV4dGVuc2lvbl9tZXNzYWdlMi5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkgPSAxMjMKKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjJdLnN0ciA9ICdmb28nCisKKyAgICAjIFNlcmlhbGl6ZSB1c2luZyB0aGUgTWVzc2FnZVNldCB3aXJlIGZvcm1hdCAodGhpcyBpcyBzcGVjaWZpZWQgaW4gdGhlCisgICAgIyAucHJvdG8gZmlsZSkuCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICByYXcuREVTQ1JJUFRPUi5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCisgICAgcmF3Lk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHJhdy5pdGVtKSkKKworICAgIG1lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKCkKKyAgICBtZXNzYWdlMS5NZXJnZUZyb21TdHJpbmcocmF3Lml0ZW1bMF0ubWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgbWVzc2FnZTEuaSkKKworICAgIG1lc3NhZ2UyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCkKKyAgICBtZXNzYWdlMi5NZXJnZUZyb21TdHJpbmcocmF3Lml0ZW1bMV0ubWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBtZXNzYWdlMi5zdHIpCisKKyAgICAjIERlc2VyaWFsaXplIHVzaW5nIHRoZSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0LgorICAgIHByb3RvMiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBwcm90bzIuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMsIHByb3RvMi5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgcHJvdG8yLkV4dGVuc2lvbnNbZXh0ZW5zaW9uMl0uc3RyKQorCisgICAgIyBDaGVjayBieXRlIHNpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90bzIuQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorCisgIGRlZiB0ZXN0TWVzc2FnZVNldFdpcmVGb3JtYXRVbmtub3duRXh0ZW5zaW9uKHNlbGYpOgorICAgICMgQ3JlYXRlIGEgbWVzc2FnZSB1c2luZyB0aGUgbWVzc2FnZSBzZXQgd2lyZSBmb3JtYXQgd2l0aCBhbiB1bmtub3duCisgICAgIyBtZXNzYWdlLgorICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorCisgICAgIyBBZGQgYW4gaXRlbS4KKyAgICBpdGVtID0gcmF3Lml0ZW0uYWRkKCkKKyAgICBpdGVtLnR5cGVfaWQgPSAxNTQ1MDA4CisgICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCisgICAgbWVzc2FnZTEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKQorICAgIG1lc3NhZ2UxLmkgPSAxMjM0NQorICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgICMgQWRkIGEgc2Vjb25kLCB1bmtub3duIGV4dGVuc2lvbi4KKyAgICBpdGVtID0gcmF3Lml0ZW0uYWRkKCkKKyAgICBpdGVtLnR5cGVfaWQgPSAxNTQ1MDA5CisgICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCisgICAgbWVzc2FnZTEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKQorICAgIG1lc3NhZ2UxLmkgPSAxMjM0NgorICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgICMgQWRkIGFub3RoZXIgdW5rbm93biBleHRlbnNpb24uCisgICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCisgICAgaXRlbS50eXBlX2lkID0gMTU0NTAxMAorICAgIG1lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCkKKyAgICBtZXNzYWdlMS5zdHIgPSAnZm9vJworICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHNlcmlhbGl6ZWQgPSByYXcuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgIyBQYXJzZSBtZXNzYWdlIHVzaW5nIHRoZSBtZXNzYWdlIHNldCB3aXJlIGZvcm1hdC4KKyAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBwcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgbWVzc2FnZSBwYXJzZWQgd2VsbC4KKyAgICBleHRlbnNpb25fbWVzc2FnZTEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKKyAgICBleHRlbnNpb24xID0gZXh0ZW5zaW9uX21lc3NhZ2UxLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEyMzQ1LCBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkpCisKKyAgZGVmIHRlc3RVbmtub3duRmllbGRzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bykKKworICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICAjIFRoZSBlbXB0eSBtZXNzYWdlIHNob3VsZCBiZSBwYXJzYWJsZSB3aXRoIGFsbCBvZiB0aGUgZmllbGRzCisgICAgIyB1bmtub3duLgorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKKworICAgICMgUGFyc2luZyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgICAgIyBOb3cgdGVzdCB3aXRoIGEgaW50NjQgZmllbGQgc2V0LgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfaW50NjQgPSAweDBmZmZmZmZmZmZmZmZmZmYKKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgICMgVGhlIGVtcHR5IG1lc3NhZ2Ugc2hvdWxkIGJlIHBhcnNhYmxlIHdpdGggYWxsIG9mIHRoZSBmaWVsZHMKKyAgICAjIHVua25vd24uCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgICMgUGFyc2luZyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgIGRlZiBfQ2hlY2tSYWlzZXMoc2VsZiwgZXhjX2NsYXNzLCBjYWxsYWJsZV9vYmosIGV4Y2VwdGlvbik6CisgICAgIiIiVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBleGNwZXRpb24gdHlwZSBhbmQgbWVzc2FnZSBhcmUgYXMgZXhwZWN0ZWQuIiIiCisgICAgdHJ5OgorICAgICAgY2FsbGFibGVfb2JqKCkKKyAgICBleGNlcHQgZXhjX2NsYXNzIGFzIGV4OgorICAgICAgIyBDaGVjayBpZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgaXMgdGhlIHJpZ2h0IG9uZS4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjZXB0aW9uLCBzdHIoZXgpKQorICAgICAgcmV0dXJuCisgICAgZWxzZToKKyAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbignJXMgbm90IHJhaXNlZCcgJSBzdHIoZXhjX2NsYXNzKSkKKworICBkZWYgdGVzdFNlcmlhbGl6ZVVuaW5pdGlhbGl6ZWQoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKKyAgICBzZWxmLl9DaGVja1JhaXNlcygKKyAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKKyAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCisgICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJworICAgICAgICAnYSxiLGMnKQorICAgICMgU2hvdWxkbid0IHJhaXNlIGV4Y2VwdGlvbnMuCisgICAgcGFydGlhbCA9IHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvMi5IYXNGaWVsZCgnYScpKQorICAgICMgcHJvdG8yIFBhcnNlRnJvbVN0cmluZyBkb2VzIG5vdCBjaGVjayB0aGF0IHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0LgorICAgIHByb3RvMi5QYXJzZUZyb21TdHJpbmcocGFydGlhbCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvMi5IYXNGaWVsZCgnYScpKQorCisgICAgcHJvdG8uYSA9IDEKKyAgICBzZWxmLl9DaGVja1JhaXNlcygKKyAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKKyAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCisgICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYixjJykKKyAgICAjIFNob3VsZG4ndCByYWlzZSBleGNlcHRpb25zLgorICAgIHBhcnRpYWwgPSBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQorCisgICAgcHJvdG8uYiA9IDIKKyAgICBzZWxmLl9DaGVja1JhaXNlcygKKyAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKKyAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCisgICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYycpCisgICAgIyBTaG91bGRuJ3QgcmFpc2UgZXhjZXB0aW9ucy4KKyAgICBwYXJ0aWFsID0gcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKKworICAgIHByb3RvLmMgPSAzCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICAjIFNob3VsZG4ndCByYWlzZSBleGNlcHRpb25zLgorICAgIHBhcnRpYWwgPSBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQorCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZCgpCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLmEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzIuYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvMi5jKQorICAgIHByb3RvMi5QYXJzZUZyb21TdHJpbmcocGFydGlhbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5hKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8yLmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90bzIuYykKKworICBkZWYgdGVzdFNlcmlhbGl6ZVVuaW5pdGlhbGl6ZWRTdWJNZXNzYWdlKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oKQorCisgICAgIyBTdWItbWVzc2FnZSBkb2Vzbid0IGV4aXN0IHlldCwgc28gdGhpcyBzdWNjZWVkcy4KKyAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmEgPSAxCisgICAgc2VsZi5fQ2hlY2tSYWlzZXMoCisgICAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IsCisgICAgICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nLAorICAgICAgICAnTWVzc2FnZSBwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWRGb3JlaWduICcKKyAgICAgICAgJ2lzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAnCisgICAgICAgICdvcHRpb25hbF9tZXNzYWdlLmIsb3B0aW9uYWxfbWVzc2FnZS5jJykKKworICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYiA9IDIKKyAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmMgPSAzCisgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZS5hZGQoKS5hID0gMQorICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2UuYWRkKCkuYiA9IDIKKyAgICBzZWxmLl9DaGVja1JhaXNlcygKKyAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKKyAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCisgICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZEZvcmVpZ24gaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcKKyAgICAgICAgJ3JlcGVhdGVkX21lc3NhZ2VbMF0uYixyZXBlYXRlZF9tZXNzYWdlWzBdLmMsJworICAgICAgICAncmVwZWF0ZWRfbWVzc2FnZVsxXS5hLHJlcGVhdGVkX21lc3NhZ2VbMV0uYycpCisKKyAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzBdLmIgPSAyCisgICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZVswXS5jID0gMworICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbMV0uYSA9IDEKKyAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzFdLmMgPSAzCisgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplQWxsUGFja2VkRmllbGRzKHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhmaXJzdF9wcm90bykKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIGJ5dGVzX3JlYWQgPSBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfcHJvdG8uQnl0ZVNpemUoKSwgYnl0ZXNfcmVhZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3RTZXJpYWxpemVBbGxQYWNrZWRFeHRlbnNpb25zKHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRFeHRlbnNpb25zKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRFeHRlbnNpb25zKGZpcnN0X3Byb3RvKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgYnl0ZXNfcmVhZCA9IHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9wcm90by5CeXRlU2l6ZSgpLCBieXRlc19yZWFkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE1lcmdlUGFja2VkRnJvbVN0cmluZ1doZW5Tb21lRmllbGRzQWxyZWFkeVNldChzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIGZpcnN0X3Byb3RvLnBhY2tlZF9pbnQzMi5leHRlbmQoWzEsIDJdKQorICAgIGZpcnN0X3Byb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDMuMCkKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvLnBhY2tlZF9pbnQzMi5hcHBlbmQoMykKKyAgICBzZWNvbmRfcHJvdG8ucGFja2VkX2RvdWJsZS5leHRlbmQoWzEuMCwgMi4wXSkKKyAgICBzZWNvbmRfcHJvdG8ucGFja2VkX3NpbnQzMi5hcHBlbmQoNCkKKworICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFszLCAxLCAyXSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsxLjAsIDIuMCwgMy4wXSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9kb3VibGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNF0sIHNlY29uZF9wcm90by5wYWNrZWRfc2ludDMyKQorCisgIGRlZiB0ZXN0UGFja2VkRmllbGRzV2lyZUZvcm1hdChzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIHByb3RvLnBhY2tlZF9pbnQzMi5leHRlbmQoWzEsIDIsIDE1MCwgM10pICAjIDEgKyAxICsgMiArIDEgYnl0ZXMKKyAgICBwcm90by5wYWNrZWRfZG91YmxlLmV4dGVuZChbMS4wLCAxMDAwLjBdKSAgIyA4ICsgOCBieXRlcworICAgIHByb3RvLnBhY2tlZF9mbG9hdC5hcHBlbmQoMi4wKSAgICAgICAgICAgICAjIDQgYnl0ZXMsIHdpbGwgYmUgYmVmb3JlIGRvdWJsZQorICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCisgICAgZCA9IF9NaW5pRGVjb2RlcihzZXJpYWxpemVkKQorICAgIFJlYWRUYWcgPSBkLlJlYWRGaWVsZE51bWJlckFuZFdpcmVUeXBlCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoOTAsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxKzErMSsyLCBkLlJlYWRJbnQzMigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZC5SZWFkSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxNTAsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBkLlJlYWRJbnQzMigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEwMCwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCksIFJlYWRUYWcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLjAsIGQuUmVhZEZsb2F0KCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSwgUmVhZFRhZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCs4LCBkLlJlYWRJbnQzMigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4wLCBkLlJlYWREb3VibGUoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDAuMCwgZC5SZWFkRG91YmxlKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKGQuRW5kT2ZTdHJlYW0oKSkKKworICBkZWYgdGVzdFBhcnNlUGFja2VkRnJvbVVucGFja2VkKHNlbGYpOgorICAgIHVucGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsVW5wYWNrZWRGaWVsZHModW5wYWNrZWQpCisgICAgcGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgcGFja2VkLk1lcmdlRnJvbVN0cmluZyh1bnBhY2tlZC5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIGV4cGVjdGVkID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhleHBlY3RlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBwYWNrZWQpCisKKyAgZGVmIHRlc3RQYXJzZVVucGFja2VkRnJvbVBhY2tlZChzZWxmKToKKyAgICBwYWNrZWQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKHBhY2tlZCkKKyAgICB1bnBhY2tlZCA9IHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcygpCisgICAgdW5wYWNrZWQuTWVyZ2VGcm9tU3RyaW5nKHBhY2tlZC5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIGV4cGVjdGVkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsVW5wYWNrZWRGaWVsZHMoZXhwZWN0ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgdW5wYWNrZWQpCisKKyAgZGVmIHRlc3RGaWVsZE51bWJlcnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CQl9GSUVMRF9OVU1CRVIsIDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMX0lOVDMyX0ZJRUxEX05VTUJFUiwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxHUk9VUF9GSUVMRF9OVU1CRVIsIDE2KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUiwgMTgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxfTkVTVEVEX0VOVU1fRklFTERfTlVNQkVSLCAyMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLCAzMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURHUk9VUF9GSUVMRF9OVU1CRVIsIDQ2KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJFUEVBVEVEX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUiwgNDgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX0VOVU1fRklFTERfTlVNQkVSLCA1MSkKKworICBkZWYgdGVzdEV4dGVuc2lvbkZpZWxkTnVtYmVycyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlLm51bWJlciwgMTAwMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuU0lOR0xFX0ZJRUxEX05VTUJFUiwgMTAwMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQubXVsdGkubnVtYmVyLCAxMDAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5NVUxUSV9GSUVMRF9OVU1CRVIsIDEwMDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLm51bWJlciwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5PUFRJT05BTF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uLm51bWJlciwgMTYpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuT1BUSU9OQUxHUk9VUF9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxNikKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24ubnVtYmVyLCAxOCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgdW5pdHRlc3RfcGIyLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbi5udW1iZXIsIDIxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLk9QVElPTkFMX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsCisgICAgICAyMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24ubnVtYmVyLCAzMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAzMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbi5udW1iZXIsIDQ2KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlJFUEVBVEVER1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDYpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLm51bWJlciwgNDgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9ORVNURURfTUVTU0FHRV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCA0OCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24ubnVtYmVyLCA1MSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLAorICAgICAgNTEpCisKKyAgZGVmIHRlc3RJbml0S3dhcmdzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgb3B0aW9uYWxfaW50MzI9MSwKKyAgICAgICAgb3B0aW9uYWxfc3RyaW5nPSdmb28nLAorICAgICAgICBvcHRpb25hbF9ib29sPVRydWUsCisgICAgICAgIG9wdGlvbmFsX2J5dGVzPSdiYXInLAorICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MSksCisgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZT11bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xKSwKKyAgICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW09dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCisgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fZW51bT11bml0dGVzdF9wYjIuRk9SRUlHTl9GT08sCisgICAgICAgIHJlcGVhdGVkX2ludDMyPVsxLCAyLCAzXSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX3N0cmluZycpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9lbnVtJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9mb3JlaWduX2VudW0nKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIHByb3RvLm9wdGlvbmFsX3N0cmluZykKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHByb3RvLm9wdGlvbmFsX2Jvb2wpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyJywgcHJvdG8ub3B0aW9uYWxfYnl0ZXMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCisgICAgICAgICAgICAgICAgICAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfZW51bSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywgcHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9lbnVtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDIsIDNdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICBkZWYgdGVzdEluaXRBcmdzVW5rbm93bkZpZWxkTmFtZShzZWxmKToKKyAgICBkZWYgSW5pdGFsaXplRW1wdHlNZXNzYWdlV2l0aEV4dHJhS2V5d29yZEFyZygpOgorICAgICAgdW51c2VkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UodW5rbm93bj0ndW5rbm93bicpCisgICAgc2VsZi5fQ2hlY2tSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBJbml0YWxpemVFbXB0eU1lc3NhZ2VXaXRoRXh0cmFLZXl3b3JkQXJnLAorICAgICAgICAgICAgICAgICAgICAgICdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAidW5rbm93biIgZmllbGQuJykKKworICBkZWYgdGVzdEluaXRSZXF1aXJlZEt3YXJncyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYycpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ2R1bW15MicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8uYSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5jKQorCisgIGRlZiB0ZXN0SW5pdFJlcXVpcmVkRm9yZWlnbkt3YXJncyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKAorICAgICAgICBvcHRpb25hbF9tZXNzYWdlPXVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuSGFzRmllbGQoJ2EnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5IYXNGaWVsZCgnYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdjJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdkdW1teTInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSksCisgICAgICAgICAgICAgICAgICAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5hKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5iKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5jKQorCisgIGRlZiB0ZXN0SW5pdFJlcGVhdGVkS3dhcmdzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhyZXBlYXRlZF9pbnQzMj1bMSwgMiwgM10pCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90by5yZXBlYXRlZF9pbnQzMlsyXSkKKworCitjbGFzcyBPcHRpb25zVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RNZXNzYWdlT3B0aW9ucyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsCisgICAgICAgICAgICAgICAgICAgICBwcm90by5ERVNDUklQVE9SLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBwcm90by5ERVNDUklQVE9SLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKKworICBkZWYgdGVzdFBhY2tlZE9wdGlvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBwcm90by5vcHRpb25hbF9kb3VibGUgPSAzLjAKKyAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgXyBpbiBwcm90by5MaXN0RmllbGRzKCk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBmaWVsZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5wYWNrZWQpCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIHByb3RvLnBhY2tlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBwcm90by5wYWNrZWRfZG91YmxlLmFwcGVuZCgzLjApCisgICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIF8gaW4gcHJvdG8uTGlzdEZpZWxkcygpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBmaWVsZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5wYWNrZWQpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZmxlY3Rpb24uX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5sYWJlbCkKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3NlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3NlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwNGY4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvc2VydmljZV9yZWZsZWN0aW9uX3Rlc3QucHkKQEAgLTAsMCArMSwxMzYgQEAKKyMhIC91c3IvYmluL3B5dGhvbgorIworIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuc2VydmljZV9yZWZsZWN0aW9uLiIiIgorCitfX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2VfcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UKKworCitjbGFzcyBGb29Vbml0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RTZXJ2aWNlKHNlbGYpOgorICAgIGNsYXNzIE1vY2tScGNDaGFubmVsKHNlcnZpY2UuUnBjQ2hhbm5lbCk6CisgICAgICBkZWYgQ2FsbE1ldGhvZChzZWxmLCBtZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBjYWxsYmFjayk6CisgICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCisgICAgICAgIHNlbGYuY29udHJvbGxlciA9IGNvbnRyb2xsZXIKKyAgICAgICAgc2VsZi5yZXF1ZXN0ID0gcmVxdWVzdAorICAgICAgICBjYWxsYmFjayhyZXNwb25zZSkKKworICAgIGNsYXNzIE1vY2tScGNDb250cm9sbGVyKHNlcnZpY2UuUnBjQ29udHJvbGxlcik6CisgICAgICBkZWYgU2V0RmFpbGVkKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYuZmFpbHVyZV9tZXNzYWdlID0gbXNnCisKKyAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gTm9uZQorCisgICAgY2xhc3MgTXlTZXJ2aWNlKHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZSk6CisgICAgICBwYXNzCisKKyAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gTm9uZQorCisgICAgZGVmIE15Q2FsbGJhY2socmVzcG9uc2UpOgorICAgICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IHJlc3BvbnNlCisKKyAgICBycGNfY29udHJvbGxlciA9IE1vY2tScGNDb250cm9sbGVyKCkKKyAgICBjaGFubmVsID0gTW9ja1JwY0NoYW5uZWwoKQorICAgIHNydmMgPSBNeVNlcnZpY2UoKQorICAgIHNydmMuRm9vKHJwY19jb250cm9sbGVyLCB1bml0dGVzdF9wYjIuRm9vUmVxdWVzdCgpLCBNeUNhbGxiYWNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ01ldGhvZCBGb28gbm90IGltcGxlbWVudGVkLicsCisgICAgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlKQorCisgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlID0gTm9uZQorCisgICAgc2VydmljZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlLkdldERlc2NyaXB0b3IoKQorICAgIHNydmMuQ2FsbE1ldGhvZChzZXJ2aWNlX2Rlc2NyaXB0b3IubWV0aG9kc1sxXSwgcnBjX2NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5CYXJSZXF1ZXN0KCksIE15Q2FsbGJhY2spCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnTWV0aG9kIEJhciBub3QgaW1wbGVtZW50ZWQuJywKKyAgICAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UpCisgICAgCisgICAgY2xhc3MgTXlTZXJ2aWNlSW1wbCh1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2UpOgorICAgICAgZGVmIEZvbyhzZWxmLCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgZG9uZSk6CisgICAgICAgIHNlbGYuZm9vX2NhbGxlZCA9IFRydWUKKyAgICAgIGRlZiBCYXIoc2VsZiwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGRvbmUpOgorICAgICAgICBzZWxmLmJhcl9jYWxsZWQgPSBUcnVlCisKKyAgICBzcnZjID0gTXlTZXJ2aWNlSW1wbCgpCisgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlID0gTm9uZQorICAgIHNydmMuRm9vKHJwY19jb250cm9sbGVyLCB1bml0dGVzdF9wYjIuRm9vUmVxdWVzdCgpLCBNeUNhbGxiYWNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgc3J2Yy5mb29fY2FsbGVkKQorCisgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlID0gTm9uZQorICAgIHNydmMuQ2FsbE1ldGhvZChzZXJ2aWNlX2Rlc2NyaXB0b3IubWV0aG9kc1sxXSwgcnBjX2NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5CYXJSZXF1ZXN0KCksIE15Q2FsbGJhY2spCisgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBzcnZjLmJhcl9jYWxsZWQpCisKKyAgZGVmIHRlc3RTZXJ2aWNlU3R1YihzZWxmKToKKyAgICBjbGFzcyBNb2NrUnBjQ2hhbm5lbChzZXJ2aWNlLlJwY0NoYW5uZWwpOgorICAgICAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfY2xhc3MsIGNhbGxiYWNrKToKKyAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKKyAgICAgICAgc2VsZi5jb250cm9sbGVyID0gY29udHJvbGxlcgorICAgICAgICBzZWxmLnJlcXVlc3QgPSByZXF1ZXN0CisgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlX2NsYXNzKCkpCisKKyAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gTm9uZQorCisgICAgZGVmIE15Q2FsbGJhY2socmVzcG9uc2UpOgorICAgICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IHJlc3BvbnNlCisKKyAgICBjaGFubmVsID0gTW9ja1JwY0NoYW5uZWwoKQorICAgIHN0dWIgPSB1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2VfU3R1YihjaGFubmVsKQorICAgIHJwY19jb250cm9sbGVyID0gJ2NvbnRyb2xsZXInCisgICAgcmVxdWVzdCA9ICdyZXF1ZXN0JworCisgICAgIyBHZXREZXNjcmlwdG9yIG5vdyBzdGF0aWMsIHN0aWxsIHdvcmtzIGFzIGluc3RhbmNlIG1ldGhvZCBmb3IgY29tcGF0YWJpbGl0eQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlX1N0dWIuR2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgc3R1Yi5HZXREZXNjcmlwdG9yKCkpCisKKyAgICAjIEludm9rZSBtZXRob2QuCisgICAgc3R1Yi5Gb28ocnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIE15Q2FsbGJhY2spCisKKyAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb29SZXNwb25zZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0LCBjaGFubmVsLnJlcXVlc3QpCisgICAgc2VsZi5hc3NlcnRFcXVhbChycGNfY29udHJvbGxlciwgY2hhbm5lbC5jb250cm9sbGVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R1Yi5HZXREZXNjcmlwdG9yKCkubWV0aG9kc1swXSwgY2hhbm5lbC5tZXRob2QpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4MjI5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpAQCAtMCwwICsxLDUyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIHB5X2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOworCittZXNzYWdlIFRlc3RCYWRJZGVudGlmaWVycyB7CisgIGV4dGVuc2lvbnMgMTAwIHRvIG1heDsKK30KKworLy8gTWFrZSBzdXJlIHRoZXNlIHJlYXNvbmFibGUgZXh0ZW5zaW9uIG5hbWVzIGRvbid0IGNvbmZsaWN0IHdpdGggaW50ZXJuYWwKKy8vIHZhcmlhYmxlcy4KK2V4dGVuZCBUZXN0QmFkSWRlbnRpZmllcnMgeworICBvcHRpb25hbCBzdHJpbmcgbWVzc2FnZSA9IDEwMCBbZGVmYXVsdD0iZm9vIl07CisgIG9wdGlvbmFsIHN0cmluZyBkZXNjcmlwdG9yID0gMTAxIFtkZWZhdWx0PSJiYXIiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIHJlZmxlY3Rpb24gPSAxMDIgW2RlZmF1bHQ9ImJheiJdOworICBvcHRpb25hbCBzdHJpbmcgc2VydmljZSA9IDEwMyBbZGVmYXVsdD0icXV4Il07Cit9CisKK21lc3NhZ2UgQW5vdGhlck1lc3NhZ2Uge30KK3NlcnZpY2UgQW5vdGhlclNlcnZpY2Uge30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X3V0aWwucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlOGFlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF91dGlsLnB5CkBAIC0wLDAgKzEsNjUxIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVXRpbGl0aWVzIGZvciBQeXRob24gcHJvdG8yIHRlc3RzLgorCitUaGlzIGlzIGludGVudGlvbmFsbHkgbW9kZWxlZCBvbiBDKysgY29kZSBpbgorLy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLiouCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IG9zLnBhdGgKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKKworCitkZWYgU2V0QWxsTm9uTGF6eUZpZWxkcyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBub24tbGF6eSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2U6IEEgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyBpbnN0YW5jZS4KKyAgIiIiCisKKyAgIworICAjIE9wdGlvbmFsIGZpZWxkcy4KKyAgIworCisgIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgICAgPSAxMDEKKyAgbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCAgICA9IDEwMgorICBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMiAgID0gMTAzCisgIG1lc3NhZ2Uub3B0aW9uYWxfdWludDY0ICAgPSAxMDQKKyAgbWVzc2FnZS5vcHRpb25hbF9zaW50MzIgICA9IDEwNQorICBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCAgID0gMTA2CisgIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQzMiAgPSAxMDcKKyAgbWVzc2FnZS5vcHRpb25hbF9maXhlZDY0ICA9IDEwOAorICBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDMyID0gMTA5CisgIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQgPSAxMTAKKyAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCAgICA9IDExMQorICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSAgID0gMTEyCisgIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCAgICAgPSBUcnVlCisgICMgVE9ETyhyb2JpbnNvbik6IEZpcm1seSBzcGVjIG91dCBhbmQgdGVzdCBob3cKKyAgIyBwcm90b3MgaW50ZXJhY3Qgd2l0aCB1bmljb2RlLiAgT25lIHNwZWNpZmljIGV4YW1wbGU6CisgICMgd2hhdCBoYXBwZW5zIGlmIHdlIGNoYW5nZSB0aGUgbGl0ZXJhbCBiZWxvdyB0bworICAjIHUnMTE1Jz8gIFdoYXQgKnNob3VsZCogaGFwcGVuPyAgU3RpbGwgc29tZSBkaXNjdXNzaW9uCisgICMgdG8gZmluaXNoIHdpdGggS2VudG9uIGFib3V0IGJ5dGVzIHZzLiBzdHJpbmdzCisgICMgYW5kIGZvcmNpbmcgZXZlcnl0aGluZyB0byBiZSB1dGY4LiA6LS8KKyAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgICA9ICcxMTUnCisgIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAgPSAnMTE2JworCisgIG1lc3NhZ2Uub3B0aW9uYWxncm91cC5hID0gMTE3CisgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAxMTgKKyAgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuYyA9IDExOQorICBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLmQgPSAxMjAKKyAgbWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UuZSA9IDEyNgorCisgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWgorICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSA9IHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWgorICBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtID0gdW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaCisKKyAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmdfcGllY2UgPSAnMTI0JworICBtZXNzYWdlLm9wdGlvbmFsX2NvcmQgPSAnMTI1JworCisgICMKKyAgIyBSZXBlYXRlZCBmaWVsZHMuCisgICMKKworICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyMDEpCisgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDIwMikKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDIwMykKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDIwNCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDIwNSkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDIwNikKKyAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgyMDcpCisgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMjA4KQorICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgyMDkpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDIxMCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMjExKQorICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMjEyKQorICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKFRydWUpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnMjE1JykKKyAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoJzIxNicpCisKKyAgbWVzc2FnZS5yZXBlYXRlZGdyb3VwLmFkZCgpLmEgPSAyMTcKKyAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIxOAorICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5hZGQoKS5jID0gMjE5CisgIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UuYWRkKCkuZCA9IDIyMAorICBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZS5hZGQoKS5iYiA9IDIyNworCisgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQorICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bS5hcHBlbmQodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSKQorICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtLmFwcGVuZCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVIpCisKKyAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2UuYXBwZW5kKCcyMjQnKQorICBtZXNzYWdlLnJlcGVhdGVkX2NvcmQuYXBwZW5kKCcyMjUnKQorCisgICMgQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgzMDEpCisgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDMwMikKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDMwMykKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDMwNCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDMwNSkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDMwNikKKyAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgzMDcpCisgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMzA4KQorICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgzMDkpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDMxMCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMzExKQorICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMzEyKQorICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKEZhbHNlKQorICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJzMxNScpCisgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKCczMTYnKQorCisgIG1lc3NhZ2UucmVwZWF0ZWRncm91cC5hZGQoKS5hID0gMzE3CisgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzMTgKKyAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UuYWRkKCkuYyA9IDMxOQorICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlLmFkZCgpLmQgPSAzMjAKKyAgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UuYWRkKCkuYmIgPSAzMjcKKworICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtLmFwcGVuZCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWikKKyAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKKyAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bS5hcHBlbmQodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaKQorCisgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlLmFwcGVuZCgnMzI0JykKKyAgbWVzc2FnZS5yZXBlYXRlZF9jb3JkLmFwcGVuZCgnMzI1JykKKworICAjCisgICMgRmllbGRzIHRoYXQgaGF2ZSBkZWZhdWx0cy4KKyAgIworCisgIG1lc3NhZ2UuZGVmYXVsdF9pbnQzMiA9IDQwMQorICBtZXNzYWdlLmRlZmF1bHRfaW50NjQgPSA0MDIKKyAgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiA9IDQwMworICBtZXNzYWdlLmRlZmF1bHRfdWludDY0ID0gNDA0CisgIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgPSA0MDUKKyAgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCA9IDQwNgorICBtZXNzYWdlLmRlZmF1bHRfZml4ZWQzMiA9IDQwNworICBtZXNzYWdlLmRlZmF1bHRfZml4ZWQ2NCA9IDQwOAorICBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIgPSA0MDkKKyAgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0ID0gNDEwCisgIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCA9IDQxMQorICBtZXNzYWdlLmRlZmF1bHRfZG91YmxlID0gNDEyCisgIG1lc3NhZ2UuZGVmYXVsdF9ib29sID0gRmFsc2UKKyAgbWVzc2FnZS5kZWZhdWx0X3N0cmluZyA9ICc0MTUnCisgIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcyA9ICc0MTYnCisKKyAgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08KKyAgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSA9IHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTworICBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0gPSB1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08KKworICBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nX3BpZWNlID0gJzQyNCcKKyAgbWVzc2FnZS5kZWZhdWx0X2NvcmQgPSAnNDI1JworCisKK2RlZiBTZXRBbGxGaWVsZHMobWVzc2FnZSk6CisgIFNldEFsbE5vbkxhenlGaWVsZHMobWVzc2FnZSkKKyAgbWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UuYmIgPSAxMjcKKworCitkZWYgU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBleHRlbnNpb24gaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucyBpbnN0YW5jZS4KKyAgIiIiCisKKyAgZXh0ZW5zaW9ucyA9IG1lc3NhZ2UuRXh0ZW5zaW9ucworICBwYjIgPSB1bml0dGVzdF9wYjIKKyAgaW1wb3J0X3BiMiA9IHVuaXR0ZXN0X2ltcG9ydF9wYjIKKworICAjCisgICMgT3B0aW9uYWwgZmllbGRzLgorICAjCisKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDEwMQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9pbnQ2NF9leHRlbnNpb25dID0gMTAyCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25dID0gMTAzCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25dID0gMTA0CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25dID0gMTA1CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25dID0gMTA2CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDEwNworICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl0gPSAxMDgKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDEwOQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25dID0gMTEwCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl0gPSAxMTEKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl0gPSAxMTIKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfYm9vbF9leHRlbnNpb25dID0gVHJ1ZQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uXSA9ICcxMTUnCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl0gPSAnMTE2JworCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uXS5hID0gMTE3CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0uYmIgPSAxMTgKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0uYyA9IDExOQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dLmQgPSAxMjAKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0uZSA9IDEyNgorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uXS5iYiA9IDEyNworCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuVGVzdEFsbFR5cGVzLkJBWgorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dID0gcGIyLlRlc3RBbGxUeXBlcy5CQVoKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuRk9SRUlHTl9CQVoKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXSA9IGltcG9ydF9wYjIuSU1QT1JUX0JBWgorCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb25dID0gJzEyNCcKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfY29yZF9leHRlbnNpb25dID0gJzEyNScKKworICAjCisgICMgUmVwZWF0ZWQgZmllbGRzLgorICAjCisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjAxKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDIpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDMpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDQpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDUpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDYpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA3KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDIwOCkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA5KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMTApCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDIxMSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDIxMikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChUcnVlKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXS5hcHBlbmQoJzIxNScpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl0uYXBwZW5kKCcyMTYnKQorCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uXS5hZGQoKS5hID0gMjE3CisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuYmIgPSAyMTgKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuYyA9IDIxOQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmQgPSAyMjAKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuYmIgPSAyMjcKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuVGVzdEFsbFR5cGVzLkJBUikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKHBiMi5GT1JFSUdOX0JBUikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQoaW1wb3J0X3BiMi5JTVBPUlRfQkFSKQorCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25dLmFwcGVuZCgnMjI0JykKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dLmFwcGVuZCgnMjI1JykKKworICAjIEFwcGVuZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzAxKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDIpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgzMDMpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDQpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgzMDUpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDYpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA3KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDMwOCkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA5KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMTApCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDMxMSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDMxMikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChGYWxzZSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl0uYXBwZW5kKCczMTUnKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dLmFwcGVuZCgnMzE2JykKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0uYWRkKCkuYSA9IDMxNworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzE4CisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmMgPSAzMTkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5kID0gMzIwCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzI3CisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQocGIyLlRlc3RBbGxUeXBlcy5CQVopCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuRk9SRUlHTl9CQVopCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKGltcG9ydF9wYjIuSU1QT1JUX0JBWikKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXS5hcHBlbmQoJzMyNCcpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uXS5hcHBlbmQoJzMyNScpCisKKyAgIworICAjIEZpZWxkcyB3aXRoIGRlZmF1bHRzLgorICAjCisKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9pbnQzMl9leHRlbnNpb25dID0gNDAxCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uXSA9IDQwMgorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3VpbnQzMl9leHRlbnNpb25dID0gNDAzCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl0gPSA0MDQKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uXSA9IDQwNQorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25dID0gNDA2CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25dID0gNDA3CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25dID0gNDA4CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDQwOQorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl0gPSA0MTAKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9mbG9hdF9leHRlbnNpb25dID0gNDExCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl0gPSA0MTIKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ib29sX2V4dGVuc2lvbl0gPSBGYWxzZQorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3N0cmluZ19leHRlbnNpb25dID0gJzQxNScKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ieXRlc19leHRlbnNpb25dID0gJzQxNicKKworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuVGVzdEFsbFR5cGVzLkZPTworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25dID0gcGIyLkZPUkVJR05fRk9PCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXSA9IGltcG9ydF9wYjIuSU1QT1JUX0ZPTworCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl0gPSAnNDI0JworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXSA9ICc0MjUnCisKKworZGVmIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMobWVzc2FnZSk6CisgICIiIlNldHMgZXZlcnkgZmllbGQgYW5kIGV4dGVuc2lvbiBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2U6IEEgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UuCisgICIiIgorICBtZXNzYWdlLm15X2ludCA9IDEKKyAgbWVzc2FnZS5teV9zdHJpbmcgPSAnZm9vJworICBtZXNzYWdlLm15X2Zsb2F0ID0gMS4wCisgIG1lc3NhZ2UuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX2ludF0gPSAyMworICBtZXNzYWdlLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9zdHJpbmddID0gJ2JhcicKKworCitkZWYgRXhwZWN0QWxsRmllbGRzQW5kRXh0ZW5zaW9uc0luT3JkZXIoc2VyaWFsaXplZCk6CisgICIiIkVuc3VyZXMgdGhhdCBzZXJpYWxpemVkIGlzIHRoZSBzZXJpYWxpemF0aW9uIHdlIGV4cGVjdCBmb3IgYSBtZXNzYWdlCisgIGZpbGxlZCB3aXRoIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoKS4gIChTcGVjaWZpY2FsbHksIGVuc3VyZXMgdGhhdCB0aGUKKyAgc2VyaWFsaXphdGlvbiBpcyBpbiBjYW5vbmljYWwsIHRhZy1udW1iZXIgb3JkZXIpLgorICAiIiIKKyAgbXlfZXh0ZW5zaW9uX2ludCA9IHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50CisgIG15X2V4dGVuc2lvbl9zdHJpbmcgPSB1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZworICBleHBlY3RlZF9zdHJpbmdzID0gW10KKyAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQorICBtZXNzYWdlLm15X2ludCA9IDEgICMgRmllbGQgMS4KKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgbWVzc2FnZS5FeHRlbnNpb25zW215X2V4dGVuc2lvbl9pbnRdID0gMjMgICMgRmllbGQgNS4KKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgbWVzc2FnZS5teV9zdHJpbmcgPSAnZm9vJyAgIyBGaWVsZCAxMS4KKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgbWVzc2FnZS5FeHRlbnNpb25zW215X2V4dGVuc2lvbl9zdHJpbmddID0gJ2JhcicgICMgRmllbGQgNTAuCisgIGV4cGVjdGVkX3N0cmluZ3MuYXBwZW5kKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgbWVzc2FnZS5DbGVhcigpCisgIG1lc3NhZ2UubXlfZmxvYXQgPSAxLjAKKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgZXhwZWN0ZWQgPSAnJy5qb2luKGV4cGVjdGVkX3N0cmluZ3MpCisKKyAgaWYgZXhwZWN0ZWQgIT0gc2VyaWFsaXplZDoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHBlY3RlZCAlciwgZm91bmQgJXInICUgKGV4cGVjdGVkLCBzZXJpYWxpemVkKSkKKworCitkZWYgRXhwZWN0QWxsRmllbGRzU2V0KHRlc3RfY2FzZSwgbWVzc2FnZSk6CisgICIiIkNoZWNrIGFsbCBmaWVsZHMgZm9yIGNvcnJlY3QgdmFsdWVzIGhhdmUgYWZ0ZXIgU2V0KkZpZWxkcygpIGlzIGNhbGxlZC4iIiIKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50NjQnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfdWludDMyJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX3VpbnQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zaW50MzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc2ludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZpeGVkMzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZml4ZWQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9mbG9hdCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9kb3VibGUnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zdHJpbmcnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbXBvcnRfbWVzc2FnZScpKQorCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxncm91cC5IYXNGaWVsZCgnYScpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkhhc0ZpZWxkKCdiYicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5IYXNGaWVsZCgnYycpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLkhhc0ZpZWxkKCdkJykpCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9lbnVtJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ltcG9ydF9lbnVtJykpCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nX3BpZWNlJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2NvcmQnKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAxLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAyLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAzLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNCwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDUsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA2LCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNywgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA4LCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDksIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTEsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTIsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoVHJ1ZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNScsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNicsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwLmEpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTgsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTksIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UuZCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEyNiwgbWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UuZSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEyNywgbWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UuYmIpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSkKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ludDMyKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ludDY0KSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMikpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF91aW50NjQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2Jvb2wpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRncm91cCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0pKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2NvcmQpKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyWzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0WzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMlswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChUcnVlLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnMjE1JywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnMjE2JywgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc1swXSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBbMF0uYSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VbMF0uYykKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZVswXS5kKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZVswXS5iYikKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtWzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1bMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVIsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtWzBdKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0WzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMlsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChGYWxzZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzMxNScsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzMxNicsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNbMV0pCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwWzFdLmEpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlWzFdLmMpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VbMV0uZCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2VbMV0uYmIpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bVsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bVsxXSkKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9pbnQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDMyJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ludDMyJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZml4ZWQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ZpeGVkNjQnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9zZml4ZWQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3NmaXhlZDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZmxvYXQnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9kb3VibGUnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9ib29sJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc3RyaW5nJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfYnl0ZXMnKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X25lc3RlZF9lbnVtJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZm9yZWlnbl9lbnVtJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfaW1wb3J0X2VudW0nKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDAxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDIsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwMywgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNSwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNiwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNywgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDgsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0KQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDA5LCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MTAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQxMSwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0KQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDEyLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2UuZGVmYXVsdF9ib29sKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzQxNScsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnNDE2JywgbWVzc2FnZS5kZWZhdWx0X2J5dGVzKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08sCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0pCisKK2RlZiBHb2xkZW5GaWxlKGZpbGVuYW1lKToKKyAgIiIiRmluZHMgdGhlIGdpdmVuIGdvbGRlbiBmaWxlIGFuZCByZXR1cm5zIGEgZmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LiIiIgorCisgICMgU2VhcmNoIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBsb29raW5nIGZvciB0aGUgQysrIHByb3RvYnVmIHNvdXJjZSBjb2RlLgorICBwYXRoID0gJy4nCisgIHdoaWxlIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwYXRoLCAnc3JjL2dvb2dsZS9wcm90b2J1ZicpKToKKyAgICAgICMgRm91bmQgaXQuICBMb2FkIHRoZSBnb2xkZW4gZmlsZSBmcm9tIHRoZSB0ZXN0ZGF0YSBkaXJlY3RvcnkuCisgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEnLCBmaWxlbmFtZSkKKyAgICAgIHJldHVybiBvcGVuKGZ1bGxfcGF0aCwgJ3JiJykKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICcuLicpCisKKyAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICdDb3VsZCBub3QgZmluZCBnb2xkZW4gZmlsZXMuICBUaGlzIHRlc3QgbXVzdCBiZSBydW4gZnJvbSB3aXRoaW4gdGhlICcKKyAgICAncHJvdG9idWYgc291cmNlIHBhY2thZ2Ugc28gdGhhdCBpdCBjYW4gcmVhZCB0ZXN0IGRhdGEgZmlsZXMgZnJvbSB0aGUgJworICAgICdDKysgc291cmNlIHRyZWUuJykKKworCitkZWYgU2V0QWxsUGFja2VkRmllbGRzKG1lc3NhZ2UpOgorICAiIiJTZXRzIGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZTogQSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzIGluc3RhbmNlLgorICAiIiIKKyAgbWVzc2FnZS5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCisgIG1lc3NhZ2UucGFja2VkX2ludDY0LmV4dGVuZChbNjAyLCA3MDJdKQorICBtZXNzYWdlLnBhY2tlZF91aW50MzIuZXh0ZW5kKFs2MDMsIDcwM10pCisgIG1lc3NhZ2UucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKKyAgbWVzc2FnZS5wYWNrZWRfc2ludDMyLmV4dGVuZChbNjA1LCA3MDVdKQorICBtZXNzYWdlLnBhY2tlZF9zaW50NjQuZXh0ZW5kKFs2MDYsIDcwNl0pCisgIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCisgIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQuZXh0ZW5kKFs2MDgsIDcwOF0pCisgIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyLmV4dGVuZChbNjA5LCA3MDldKQorICBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKKyAgbWVzc2FnZS5wYWNrZWRfZmxvYXQuZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQorICBtZXNzYWdlLnBhY2tlZF9kb3VibGUuZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQorICBtZXNzYWdlLnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBtZXNzYWdlLnBhY2tlZF9lbnVtLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKKworCitkZWYgU2V0QWxsUGFja2VkRXh0ZW5zaW9ucyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBleHRlbnNpb24gaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucyBpbnN0YW5jZS4KKyAgIiIiCisgIGV4dGVuc2lvbnMgPSBtZXNzYWdlLkV4dGVuc2lvbnMKKyAgcGIyID0gdW5pdHRlc3RfcGIyCisKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2ludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDEsIDcwMV0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9pbnQ2NF9leHRlbnNpb25dLmV4dGVuZChbNjAyLCA3MDJdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfdWludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDMsIDcwM10pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYwNCwgNzA0XSkKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX3NpbnQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA1LCA3MDVdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDYsIDcwNl0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDcsIDcwN10pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDgsIDcwOF0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA5LCA3MDldKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYxMCwgNzEwXSkKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2Zsb2F0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfYm9vbF9leHRlbnNpb25dLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZW51bV9leHRlbnNpb25dLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKKworCitkZWYgU2V0QWxsVW5wYWNrZWRGaWVsZHMobWVzc2FnZSk6CisgICIiIlNldHMgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcyBpbnN0YW5jZS4KKyAgIiIiCisgIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCisgIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQuZXh0ZW5kKFs2MDIsIDcwMl0pCisgIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyLmV4dGVuZChbNjAzLCA3MDNdKQorICBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zaW50MzIuZXh0ZW5kKFs2MDUsIDcwNV0pCisgIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0LmV4dGVuZChbNjA2LCA3MDZdKQorICBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCisgIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NC5leHRlbmQoWzYwOCwgNzA4XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQzMi5leHRlbmQoWzYwOSwgNzA5XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKKyAgbWVzc2FnZS51bnBhY2tlZF9mbG9hdC5leHRlbmQoWzYxMS4wLCA3MTEuMF0pCisgIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlLmV4dGVuZChbNjEyLjAsIDcxMi4wXSkKKyAgbWVzc2FnZS51bnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBtZXNzYWdlLnVucGFja2VkX2VudW0uZXh0ZW5kKFt1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWl0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9mb3JtYXRfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXh0X2Zvcm1hdF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiMWI0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9mb3JtYXRfdGVzdC5weQpAQCAtMCwwICsxLDYxNyBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdCBmb3IgZ29vZ2xlLnByb3RvYnVmLnRleHRfZm9ybWF0LiIiIgorCitfX2F1dGhvcl9fID0gJ2tlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpJworCitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHJlCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF9wYjIKKworCitjbGFzcyBUZXh0Rm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgIGRlZiBSZWFkR29sZGVuKHNlbGYsIGdvbGRlbl9maWxlbmFtZSk6CisgICAgZiA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlKGdvbGRlbl9maWxlbmFtZSkKKyAgICBnb2xkZW5fbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgZi5jbG9zZSgpCisgICAgcmV0dXJuIGdvbGRlbl9saW5lcworCisgIGRlZiBDb21wYXJlVG9Hb2xkZW5GaWxlKHNlbGYsIHRleHQsIGdvbGRlbl9maWxlbmFtZSk6CisgICAgZ29sZGVuX2xpbmVzID0gc2VsZi5SZWFkR29sZGVuKGdvbGRlbl9maWxlbmFtZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlbkxpbmVzKHRleHQsIGdvbGRlbl9saW5lcykKKworICBkZWYgQ29tcGFyZVRvR29sZGVuVGV4dChzZWxmLCB0ZXh0LCBnb2xkZW5fdGV4dCk6CisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5MaW5lcyh0ZXh0LCBnb2xkZW5fdGV4dC5zcGxpdGxpbmVzKDEpKQorCisgIGRlZiBDb21wYXJlVG9Hb2xkZW5MaW5lcyhzZWxmLCB0ZXh0LCBnb2xkZW5fbGluZXMpOgorICAgIGFjdHVhbF9saW5lcyA9IHRleHQuc3BsaXRsaW5lcygxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2xpbmVzLCBhY3R1YWxfbGluZXMsCisgICAgICAiVGV4dCBkb2Vzbid0IG1hdGNoIGdvbGRlbi4gIERpZmY6XG4iICsKKyAgICAgICcnLmpvaW4oZGlmZmxpYi5uZGlmZihnb2xkZW5fbGluZXMsIGFjdHVhbF9saW5lcykpKQorCisgIGRlZiB0ZXN0UHJpbnRBbGxGaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMobWVzc2FnZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlbkZpbGUoCisgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSksCisgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQnKQorCisgIGRlZiB0ZXN0UHJpbnRBbGxFeHRlbnNpb25zKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAorICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkpLAorICAgICAgJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQnKQorCisgIGRlZiB0ZXN0UHJpbnRNZXNzYWdlU2V0KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pID0gMjMKKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyID0gJ2ZvbycKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLAorICAgICAgJ21lc3NhZ2Vfc2V0IHtcbicKKyAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbicKKyAgICAgICcgICAgaTogMjNcbicKKyAgICAgICcgIH1cbicKKyAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHtcbicKKyAgICAgICcgICAgc3RyOiBcImZvb1wiXG4nCisgICAgICAnICB9XG4nCisgICAgICAnfVxuJykKKworICBkZWYgdGVzdFByaW50QmFkRW51bVZhbHVlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gMTAwCisgICAgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0gPSAxMDEKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtID0gMTAyCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSksCisgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfZW51bTogMTAwXG4nCisgICAgICAgICdvcHRpb25hbF9mb3JlaWduX2VudW06IDEwMVxuJworICAgICAgICAnb3B0aW9uYWxfaW1wb3J0X2VudW06IDEwMlxuJykKKworICBkZWYgdGVzdFByaW50QmFkRW51bVZhbHVlRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBtZXNzYWdlLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl0gPSAxMDAKKyAgICBtZXNzYWdlLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dID0gMTAxCisgICAgbWVzc2FnZS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25dID0gMTAyCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSksCisgICAgICAgICdbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogMTAwXG4nCisgICAgICAgICdbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IDEwMVxuJworICAgICAgICAnW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IDEwMlxuJykKKworICBkZWYgdGVzdFByaW50RXhvdGljKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0LmFwcGVuZCgtOTIyMzM3MjAzNjg1NDc3NTgwOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NC5hcHBlbmQoMTg0NDY3NDQwNzM3MDk1NTE2MTUpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEyMy40NTYpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlMjIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlLTE4KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnXDAwMFwwMDFcYVxiXGZcblxyXHRcdlxcXCciJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpKSwKKyAgICAgICdyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDhcbicKKyAgICAgICdyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4nCisgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2XG4nCisgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsyMlxuJworICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UtMThcbicKKyAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICcKKyAgICAgICAgJyJcXDAwMFxcMDAxXFwwMDdcXDAxMFxcMDE0XFxuXFxyXFx0XFwwMTNcXFxcXFxcJ1xcIiJcbicKKyAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFwzNTJcXDIzNFxcMjM3IlxuJykKKworICBkZWYgdGVzdFByaW50TmVzdGVkTWVzc2FnZUFzT25lTGluZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbXNnID0gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG1zZy5iYiA9IDQyOworICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAorICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBiYjogNDIgfScpCisKKyAgZGVmIHRlc3RQcmludFJlcGVhdGVkRmllbGRzQXNPbmVMaW5lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoIkdvb2dsZSIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCJadXJpY2giKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAorICAgICAgICAncmVwZWF0ZWRfaW50MzI6IDEgcmVwZWF0ZWRfaW50MzI6IDEgcmVwZWF0ZWRfaW50MzI6IDMgJworICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiR29vZ2xlIiByZXBlYXRlZF9zdHJpbmc6ICJadXJpY2giJykKKworICBkZWYgdGVzdFByaW50TmVzdGVkTmV3TGluZUluU3RyaW5nQXNPbmVMaW5lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyA9ICJhXG5uZXdcbmxpbmUiCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSksCisgICAgICAgICdvcHRpb25hbF9zdHJpbmc6ICJhXFxubmV3XFxubGluZSInKQorCisgIGRlZiB0ZXN0UHJpbnRNZXNzYWdlU2V0QXNPbmVMaW5lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pID0gMjMKKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyID0gJ2ZvbycKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSwKKyAgICAgICAgJ21lc3NhZ2Vfc2V0IHsnCisgICAgICAgICcgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0geycKKyAgICAgICAgJyBpOiAyMycKKyAgICAgICAgJyB9JworICAgICAgICAnIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHsnCisgICAgICAgICcgc3RyOiBcImZvb1wiJworICAgICAgICAnIH0nCisgICAgICAgICcgfScpCisKKyAgZGVmIHRlc3RQcmludEV4b3RpY0FzT25lTGluZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NC5hcHBlbmQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpCisgICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxMjMuNDU2KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZTIyKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZS0xOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ1wwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnIicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHVhNzFmJykKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKAorICAgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSksCisgICAgICAncmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4JworICAgICAgJyByZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1JworICAgICAgJyByZXBlYXRlZF9kb3VibGU6IDEyMy40NTYnCisgICAgICAnIHJlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjInCisgICAgICAnIHJlcGVhdGVkX2RvdWJsZTogMS4yM2UtMTgnCisgICAgICAnIHJlcGVhdGVkX3N0cmluZzogJworICAgICAgJyJcXDAwMFxcMDAxXFwwMDdcXDAxMFxcMDE0XFxuXFxyXFx0XFwwMTNcXFxcXFxcJ1xcIiInCisgICAgICAnIHJlcGVhdGVkX3N0cmluZzogIlxcMzAzXFwyNzRcXDM1MlxcMjM0XFwyMzciJykKKworICBkZWYgdGVzdFJvdW5kVHJpcEV4b3RpY0FzT25lTGluZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NC5hcHBlbmQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpCisgICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxMjMuNDU2KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZTIyKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZS0xOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ1wwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnIicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHVhNzFmJykKKworICAgICMgVGVzdCBhc191dGY4ID0gRmFsc2UuCisgICAgd2lyZV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICBtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlLCBhc191dGY4PUZhbHNlKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2Uod2lyZV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICAgICMgVGVzdCBhc191dGY4ID0gVHJ1ZS4KKyAgICB3aXJlX3RleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoCisgICAgICAgIG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUsIGFzX3V0Zjg9VHJ1ZSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHdpcmVfdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RQcmludFJhd1V0ZjhTdHJpbmcoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1J1x1MDBmY1x1YTcxZicpCisgICAgdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc191dGY4ID0gVHJ1ZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dCwgJ3JlcGVhdGVkX3N0cmluZzogIlwzMDNcMjc0XDM1MlwyMzRcMjM3IlxuJykKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVzc2FnZVRvU3RyaW5nKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoKQorICAgIG1lc3NhZ2UuYyA9IDEyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2M6IDEyM1xuJywgc3RyKG1lc3NhZ2UpKQorCisgIGRlZiBSZW1vdmVSZWR1bmRhbnRaZXJvcyhzZWxmLCB0ZXh0KToKKyAgICAjIFNvbWUgcGxhdGZvcm1zIHByaW50IDFlKzUgYXMgMWUrMDA1LiAgVGhpcyBpcyBmaW5lLCBidXQgd2UgbmVlZCB0byByZW1vdmUKKyAgICAjIHRoZXNlIHplcm9zIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBnb2xkZW4gZmlsZS4KKyAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCdlKzAnLCdlKycpLnJlcGxhY2UoJ2UrMCcsJ2UrJykgXAorICAgICAgICAgICAgICAgLnJlcGxhY2UoJ2UtMCcsJ2UtJykucmVwbGFjZSgnZS0wJywnZS0nKQorICAgICMgRmxvYXRpbmcgcG9pbnQgZmllbGRzIGFyZSBwcmludGVkIHdpdGggLjAgc3VmZml4IGV2ZW4gaWYgdGhleSBhcmUKKyAgICAjIGFjdHVhbHkgaW50ZWdlciBudW1iZXJzLgorICAgIHRleHQgPSByZS5jb21waWxlKCdcLjAkJywgcmUuTVVMVElMSU5FKS5zdWIoJycsIHRleHQpCisgICAgcmV0dXJuIHRleHQKKworICBkZWYgdGVzdE1lcmdlR29sZGVuKHNlbGYpOgorICAgIGdvbGRlbl90ZXh0ID0gJ1xuJy5qb2luKHNlbGYuUmVhZEdvbGRlbigndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQnKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGdvbGRlbl90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZUdvbGRlbkV4dGVuc2lvbnMoc2VsZik6CisgICAgZ29sZGVuX3RleHQgPSAnXG4nLmpvaW4oc2VsZi5SZWFkR29sZGVuKAorICAgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCcpKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZShnb2xkZW5fdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VBbGxGaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMobWVzc2FnZSkKKyAgICBhc2NpaV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpCisKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGFzY2lpX3RleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc1NldChzZWxmLCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VBbGxFeHRlbnNpb25zKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpCisgICAgYXNjaWlfdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQorCisgICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGFzY2lpX3RleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZU1lc3NhZ2VTZXQoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAoJ3JlcGVhdGVkX3VpbnQ2NDogMVxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX3VpbnQ2NDogMlxuJykKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFsxXSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgdGV4dCA9ICgnbWVzc2FnZV9zZXQge1xuJworICAgICAgICAgICAgJyAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0ge1xuJworICAgICAgICAgICAgJyAgICBpOiAyM1xuJworICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgJyAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMl0ge1xuJworICAgICAgICAgICAgJyAgICBzdHI6IFwiZm9vXCJcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIzLCBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0MV0uaSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygnZm9vJywgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0cikKKworICBkZWYgdGVzdE1lcmdlRXhvdGljKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gKCdyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDhcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsyMlxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UtMThcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6IFxuJworICAgICAgICAgICAgJyJcXDAwMFxcMDAxXFwwMDdcXDAxMFxcMDE0XFxuXFxyXFx0XFwwMTNcXFxcXFxcJ1xcIiJcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJmb28iIFwnY29yZ2VcJyAiZ3JhdWx0IlxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogIlxcMzAzXFwyNzRcXDM1MlxcMjM0XFwyMzciXG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXFx4YzNcXHhiYyJcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJceGMzXHhiYyJcbicpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxODQ0Njc0NDA3MzcwOTU1MTYxNSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMuNDU2LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEuMjNlMjIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4yM2UtMTgsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJyInLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb29jb3JnZWdyYXVsdCcsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTAwZmNcdWE3MWYnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1syXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHUwMGZjJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbM10pCisKKyAgZGVmIHRlc3RNZXJnZUVtcHR5VGV4dChzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICcnCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCksIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZUludmFsaWRVdGY4KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ3JlcGVhdGVkX3N0cmluZzogIlxceGMzXFx4YzMiJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VTaW5nbGVXb3JkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ2ZvbycKKyAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAoJzE6MSA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiBoYXMgbm8gZmllbGQgbmFtZWQgJworICAgICAgICAgJyJmb28iLicpLAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKKworICBkZWYgdGVzdE1lcmdlVW5rbm93bkZpZWxkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ3Vua25vd25fZmllbGQ6IDhcbicKKyAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAoJzE6MSA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiBoYXMgbm8gZmllbGQgbmFtZWQgJworICAgICAgICAgJyJ1bmtub3duX2ZpZWxkIi4nKSwKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVyZ2UsIHRleHQsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZUJhZEV4dGVuc2lvbihzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXh0ID0gJ1t1bmtub3duX2V4dGVuc2lvbl06IDhcbicKKyAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAnMToyIDogRXh0ZW5zaW9uICJ1bmtub3duX2V4dGVuc2lvbiIgbm90IHJlZ2lzdGVyZWQuJywKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVyZ2UsIHRleHQsIG1lc3NhZ2UpCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICgnMToyIDogTWVzc2FnZSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiIGRvZXMgbm90IGhhdmUgJworICAgICAgICAgJ2V4dGVuc2lvbnMuJyksCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VHcm91cE5vdENsb3NlZChzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICdSZXBlYXRlZEdyb3VwOiA8JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsICcxOjE2IDogRXhwZWN0ZWQgIj4iLicsCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgICAgdGV4dCA9ICdSZXBlYXRlZEdyb3VwOiB7JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsICcxOjE2IDogRXhwZWN0ZWQgIn0iLicsCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VFbXB0eUdyb3VwKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ09wdGlvbmFsR3JvdXA6IHt9JworICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKworICAgIG1lc3NhZ2UuQ2xlYXIoKQorCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAnT3B0aW9uYWxHcm91cDogPD4nCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxncm91cCcpKQorCisgIGRlZiB0ZXN0TWVyZ2VCYWRFbnVtVmFsdWUoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAnb3B0aW9uYWxfbmVzdGVkX2VudW06IEJBUlInCisgICAgc2VsZi5hc3NlcnRSYWlzZXNXaXRoTWVzc2FnZSgKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgKCcxOjIzIDogRW51bSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIgJworICAgICAgICAgJ2hhcyBubyB2YWx1ZSBuYW1lZCBCQVJSLicpLAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ29wdGlvbmFsX25lc3RlZF9lbnVtOiAxMDAnCisgICAgc2VsZi5hc3NlcnRSYWlzZXNXaXRoTWVzc2FnZSgKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgKCcxOjIzIDogRW51bSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIgJworICAgICAgICAgJ2hhcyBubyB2YWx1ZSB3aXRoIG51bWJlciAxMDAuJyksCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VCYWRJbnRWYWx1ZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICdvcHRpb25hbF9pbnQzMjogYm9yaycKKyAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAoJzE6MTcgOiBDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogYm9yaycpLAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKKworICBkZWYgdGVzdE1lcmdlU3RyaW5nRmllbGRVbmVzY2FwZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9IHInJydyZXBlYXRlZF9zdHJpbmc6ICJceGZceDYyIgorICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXFx4ZlxceDYyIgorICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXFxceGZcXFx4NjIiCisgICAgICAgICAgICAgICByZXBlYXRlZF9zdHJpbmc6ICJcXFxceGZcXFxceDYyIgorICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXFxcXFx4ZlxcXFxceDYyIgorICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXHg1Y3gyMCInJycKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQorCisgICAgU0xBU0ggPSAnXFwnCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgwZmInLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFNMQVNIICsgJ3hmJyArIFNMQVNIICsgJ3g2MicsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoU0xBU0ggKyAnXHgwZicgKyBTTEFTSCArICdiJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChTTEFTSCArIFNMQVNIICsgJ3hmJyArIFNMQVNIICsgU0xBU0ggKyAneDYyJywKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoU0xBU0ggKyBTTEFTSCArICdceDBmJyArIFNMQVNIICsgU0xBU0ggKyAnYicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1s0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFNMQVNIICsgJ3gyMCcsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzVdKQorCisgIGRlZiBhc3NlcnRSYWlzZXNXaXRoTWVzc2FnZShzZWxmLCBlX2NsYXNzLCBlLCBmdW5jLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIlNhbWUgYXMgYXNzZXJ0UmFpc2VzLCBidXQgYWxzbyBjb21wYXJlcyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuIiIiCisgICAgaWYgaGFzYXR0cihlX2NsYXNzLCAnX19uYW1lX18nKToKKyAgICAgIGV4Y19uYW1lID0gZV9jbGFzcy5fX25hbWVfXworICAgIGVsc2U6CisgICAgICBleGNfbmFtZSA9IHN0cihlX2NsYXNzKQorCisgICAgdHJ5OgorICAgICAgZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgZXhjZXB0IGVfY2xhc3MgYXMgZXhwcjoKKyAgICAgIGlmIHN0cihleHByKSAhPSBlOgorICAgICAgICBtc2cgPSAnJXMgcmFpc2VkLCBidXQgd2l0aCB3cm9uZyBtZXNzYWdlOiAiJXMiIGluc3RlYWQgb2YgIiVzIicKKyAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZyAlIChleGNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZXhwcikuZW5jb2RlKCdzdHJpbmdfZXNjYXBlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5lbmNvZGUoJ3N0cmluZ19lc2NhcGUnKSkpCisgICAgICByZXR1cm4KKyAgICBlbHNlOgorICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKCclcyBub3QgcmFpc2VkJyAlIGV4Y19uYW1lKQorCisKK2NsYXNzIFRva2VuaXplclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0U2ltcGxlVG9rZW5DYXNlcyhzZWxmKToKKyAgICB0ZXh0ID0gKCdpZGVudGlmaWVyMToic3RyaW5nMSJcbiAgICAgXG5cbicKKyAgICAgICAgICAgICdpZGVudGlmaWVyMiA6IFxuIFxuMTIzICBcbiAgaWRlbnRpZmllcjMgOlwnc3RyaW5nXCdcbicKKyAgICAgICAgICAgICdpZGVudGlmaUVSXzQgOiAxLjFlKzIgSUQ1Oi0wLjIzIElENjpcJ2FhYWFcXFwnYmJiYlwnXG4nCisgICAgICAgICAgICAnSUQ3IDogImFhXFwiYmIiXG5cblxuXG4gSUQ4OiB7QTppbmYgQjotaW5mIEM6dHJ1ZSBEOmZhbHNlfVxuJworICAgICAgICAgICAgJ0lEOTogMjIgSUQxMDogLTExMTExMTExMTExMTExMTExMSBJRDExOiAtMjJcbicKKyAgICAgICAgICAgICdJRDEyOiAyMjIyMjIyMjIyMjIyMjIyMjIyIElEMTM6IDEuMjM0NTZmIElEMTQ6IDEuMmUrMmYgJworICAgICAgICAgICAgJ2ZhbHNlX2Jvb2w6ICAwIHRydWVfQk9PTDp0IFxuIHRydWVfYm9vbDE6ICAxIGZhbHNlX0JPT0wxOmYgJyApCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIG1ldGhvZHMgPSBbKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpZXIxJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVTdHJpbmcsICdzdHJpbmcxJyksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnaWRlbnRpZmllcjInKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUludDMyLCAxMjMpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpZXIzJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVTdHJpbmcsICdzdHJpbmcnKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdpZGVudGlmaUVSXzQnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCAxLjFlKzIpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lENScpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIC0wLjIzKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDYnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ2FhYWFcJ2JiYmInKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDcnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ2FhXCJiYicpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEOCcpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgJ3snLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0EnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCBmbG9hdCgnaW5mJykpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0InKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCAtZmxvYXQoJ2luZicpKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdDJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBUcnVlKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdEJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBGYWxzZSksCisgICAgICAgICAgICAgICAnfScsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQ5JyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVVaW50MzIsIDIyKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDEwJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJbnQ2NCwgLTExMTExMTExMTExMTExMTExMSksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQxMScpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSW50MzIsIC0yMiksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQxMicpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lVWludDY0LCAyMjIyMjIyMjIyMjIyMjIyMjIyKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDEzJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVGbG9hdCwgMS4yMzQ1NiksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQxNCcpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIDEuMmUrMiksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnZmFsc2VfYm9vbCcpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgRmFsc2UpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ3RydWVfQk9PTCcpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgVHJ1ZSksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAndHJ1ZV9ib29sMScpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgVHJ1ZSksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnZmFsc2VfQk9PTDEnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIEZhbHNlKV0KKworICAgIGkgPSAwCisgICAgd2hpbGUgbm90IHRva2VuaXplci5BdEVuZCgpOgorICAgICAgbSA9IG1ldGhvZHNbaV0KKyAgICAgIGlmIHR5cGUobSkgPT0gc3RyOgorICAgICAgICB0b2tlbiA9IHRva2VuaXplci50b2tlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRva2VuLCBtKQorICAgICAgICB0b2tlbml6ZXIuTmV4dFRva2VuKCkKKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVsxXSwgbVswXSgpKQorICAgICAgaSArPSAxCisKKyAgZGVmIHRlc3RDb25zdW1lSW50ZWdlcnMoc2VsZik6CisgICAgIyBUaGlzIHRlc3Qgb25seSB0ZXN0cyB0aGUgZmFpbHVyZXMgaW4gdGhlIGludGVnZXIgcGFyc2luZyBtZXRob2RzIGFzIHdlbGwKKyAgICAjIGFzIHRoZSAnMCcgc3BlY2lhbCBjYXNlcy4KKyAgICBpbnQ2NF9tYXggPSAoMSA8PCA2MykgLSAxCisgICAgdWludDMyX21heCA9ICgxIDw8IDMyKSAtIDEKKyAgICB0ZXh0ID0gJy0xICVkICVkJyAlICh1aW50MzJfbWF4ICsgMSwgaW50NjRfbWF4ICsgMSkKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVVaW50MzIpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVVaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgdG9rZW5pemVyLkNvbnN1bWVJbnQzMigpKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVVaW50MzIpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVJbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVpbnQzMl9tYXggKyAxLCB0b2tlbml6ZXIuQ29uc3VtZUludDY0KCkpCisKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50NjRfbWF4ICsgMSwgdG9rZW5pemVyLkNvbnN1bWVVaW50NjQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgICB0ZXh0ID0gJy0wIC0wIDAgMCcKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9rZW5pemVyLkNvbnN1bWVVaW50NjQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRva2VuaXplci5Db25zdW1lVWludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2tlbml6ZXIuQXRFbmQoKSkKKworICBkZWYgdGVzdENvbnN1bWVCeXRlU3RyaW5nKHNlbGYpOgorICAgIHRleHQgPSAnInN0cmluZzFcJycKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKQorCisgICAgdGV4dCA9ICdzdHJpbmcxIicKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKQorCisgICAgdGV4dCA9ICdcbiJcXHh0IicKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKQorCisgICAgdGV4dCA9ICdcbiJcXCInCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZykKKworICAgIHRleHQgPSAnXG4iXFx4IicKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKQorCisgIGRlZiB0ZXN0Q29uc3VtZUJvb2woc2VsZik6CisgICAgdGV4dCA9ICdub3QtYS1ib29sJworICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJvb2wpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90eXBlX2NoZWNrZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiM2NkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weQpAQCAtMCwwICsxLDI4NiBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlByb3ZpZGVzIHR5cGUgY2hlY2tpbmcgcm91dGluZXMuCisKK1RoaXMgbW9kdWxlIGRlZmluZXMgdHlwZSBjaGVja2luZyB1dGlsaXRpZXMgaW4gdGhlIGZvcm1zIG9mIGRpY3Rpb25hcmllczoKKworVkFMVUVfQ0hFQ0tFUlM6IEEgZGljdGlvbmFyeSBvZiBmaWVsZCB0eXBlcyBhbmQgYSB2YWx1ZSB2YWxpZGF0aW9uIG9iamVjdC4KK1RZUEVfVE9fQllURV9TSVpFX0ZOOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlcyBhbmQgYSBzaXplIGNvbXB1dGluZworICBmdW5jdGlvbi4KK1RZUEVfVE9fU0VSSUFMSVpFX01FVEhPRDogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZXMgYW5kIHNlcmlhbGl6YXRpb24KKyAgZnVuY3Rpb24uCitGSUVMRF9UWVBFX1RPX1dJUkVfVFlQRTogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZWQgYW5kIHRoZWlyCisgIGNvcmVzcG9uZGluZyB3aXJlIHR5cGVzLgorVFlQRV9UT19ERVNFUklBTElaRV9NRVRIT0Q6IEEgZGljdGlvbmFyeSB3aXRoIGZpZWxkIHR5cGVzIGFuZCBkZXNlcmlhbGl6YXRpb24KKyAgZnVuY3Rpb24uCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGRlY29kZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCisKK19GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcgorCisKK2RlZiBHZXRUeXBlQ2hlY2tlcihjcHBfdHlwZSwgZmllbGRfdHlwZSk6CisgICIiIlJldHVybnMgYSB0eXBlIGNoZWNrZXIgZm9yIGEgbWVzc2FnZSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLgorCisgIEFyZ3M6CisgICAgY3BwX3R5cGU6IEMrKyB0eXBlIG9mIHRoZSBmaWVsZCAoc2VlIGRlc2NyaXB0b3IucHkpLgorICAgIGZpZWxkX3R5cGU6IFByb3RvY29sIG1lc3NhZ2UgZmllbGQgdHlwZSAoc2VlIGRlc2NyaXB0b3IucHkpLgorCisgIFJldHVybnM6CisgICAgQW4gaW5zdGFuY2Ugb2YgVHlwZUNoZWNrZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSB0eXBlcworICAgIG9mIHZhbHVlcyBhc3NpZ25lZCB0byBhIGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgIiIiCisgIGlmIChjcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HIGFuZAorICAgICAgZmllbGRfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HKToKKyAgICByZXR1cm4gVW5pY29kZVZhbHVlQ2hlY2tlcigpCisgIHJldHVybiBfVkFMVUVfQ0hFQ0tFUlNbY3BwX3R5cGVdCisKKworIyBOb25lIG9mIHRoZSB0eXBlY2hlY2tlcnMgYmVsb3cgbWFrZSBhbnkgYXR0ZW1wdCB0byBndWFyZCBhZ2FpbnN0IHBlb3BsZQorIyBzdWJjbGFzc2luZyBidWlsdGluIHR5cGVzIGFuZCBkb2luZyB3ZWlyZCB0aGluZ3MuICBXZSdyZSBub3QgdHJ5aW5nIHRvCisjIHByb3RlY3QgYWdhaW5zdCBtYWxpY2lvdXMgY2xpZW50cyBoZXJlLCBqdXN0IHBlb3BsZSBhY2NpZGVudGFsbHkgc2hvb3RpbmcKKyMgdGhlbXNlbHZlcyBpbiB0aGUgZm9vdCBpbiBvYnZpb3VzIHdheXMuCisKK2NsYXNzIFR5cGVDaGVja2VyKG9iamVjdCk6CisKKyAgIiIiVHlwZSBjaGVja2VyIHVzZWQgdG8gY2F0Y2ggdHlwZSBlcnJvcnMgYXMgZWFybHkgYXMgcG9zc2libGUKKyAgd2hlbiB0aGUgY2xpZW50IGlzIHNldHRpbmcgc2NhbGFyIGZpZWxkcyBpbiBwcm90b2NvbCBtZXNzYWdlcy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsICphY2NlcHRhYmxlX3R5cGVzKToKKyAgICBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzID0gYWNjZXB0YWJsZV90eXBlcworCisgIGRlZiBDaGVja1ZhbHVlKHNlbGYsIHByb3Bvc2VkX3ZhbHVlKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgc2VsZi5fYWNjZXB0YWJsZV90eXBlcyk6CisgICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQorICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzKSkKKyAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQorCisKKyMgSW50VmFsdWVDaGVja2VyIGFuZCBpdHMgc3ViY2xhc3NlcyBwZXJmb3JtIGludGVnZXIgdHlwZS1jaGVja3MKKyMgYW5kIGJvdW5kcy1jaGVja3MuCitjbGFzcyBJbnRWYWx1ZUNoZWNrZXIob2JqZWN0KToKKworICAiIiJDaGVja2VyIHVzZWQgZm9yIGludGVnZXIgZmllbGRzLiAgUGVyZm9ybXMgdHlwZS1jaGVjayBhbmQgcmFuZ2UgY2hlY2suIiIiCisKKyAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCAoaW50LCBsb25nKSk6CisgICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQorICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCAoaW50LCBsb25nKSkpCisgICAgICByYWlzZSBUeXBlRXJyb3IobWVzc2FnZSkKKyAgICBpZiBub3Qgc2VsZi5fTUlOIDw9IHByb3Bvc2VkX3ZhbHVlIDw9IHNlbGYuX01BWDoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1ZhbHVlIG91dCBvZiByYW5nZTogJWQnICUgcHJvcG9zZWRfdmFsdWUpCisKKworY2xhc3MgVW5pY29kZVZhbHVlQ2hlY2tlcihvYmplY3QpOgorCisgICIiIkNoZWNrZXIgdXNlZCBmb3Igc3RyaW5nIGZpZWxkcy4iIiIKKworICBkZWYgQ2hlY2tWYWx1ZShzZWxmLCBwcm9wb3NlZF92YWx1ZSk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvcG9zZWRfdmFsdWUsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgIG1lc3NhZ2UgPSAoJyUuMTAyNHIgaGFzIHR5cGUgJXMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzJyAlCisgICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSwgdHlwZShwcm9wb3NlZF92YWx1ZSksIChzdHIsIHVuaWNvZGUpKSkKKyAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQorCisgICAgIyBJZiB0aGUgdmFsdWUgaXMgb2YgdHlwZSAnc3RyJyBtYWtlIHN1cmUgdGhhdCBpdCBpcyBpbiA3LWJpdCBBU0NJSQorICAgICMgZW5jb2RpbmcuCisgICAgaWYgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgc3RyKToKKyAgICAgIHRyeToKKyAgICAgICAgdW5pY29kZShwcm9wb3NlZF92YWx1ZSwgJ2FzY2lpJykKKyAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyUuMTAyNHIgaGFzIHR5cGUgc3RyLCBidXQgaXNuXCd0IGluIDctYml0IEFTQ0lJICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmcuIE5vbi1BU0NJSSBzdHJpbmdzIG11c3QgYmUgY29udmVydGVkIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAndW5pY29kZSBvYmplY3RzIGJlZm9yZSBiZWluZyBhZGRlZC4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUpKQorCisKK2NsYXNzIEludDMyVmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6CisgICMgV2UncmUgc3VyZSB0byB1c2UgaW50cyBpbnN0ZWFkIG9mIGxvbmdzIGhlcmUgc2luY2UgY29tcGFyaXNvbiBtYXkgYmUgbW9yZQorICAjIGVmZmljaWVudC4KKyAgX01JTiA9IC0yMTQ3NDgzNjQ4CisgIF9NQVggPSAyMTQ3NDgzNjQ3CisKKworY2xhc3MgVWludDMyVmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6CisgIF9NSU4gPSAwCisgIF9NQVggPSAoMSA8PCAzMikgLSAxCisKKworY2xhc3MgSW50NjRWYWx1ZUNoZWNrZXIoSW50VmFsdWVDaGVja2VyKToKKyAgX01JTiA9IC0oMSA8PCA2MykKKyAgX01BWCA9ICgxIDw8IDYzKSAtIDEKKworCitjbGFzcyBVaW50NjRWYWx1ZUNoZWNrZXIoSW50VmFsdWVDaGVja2VyKToKKyAgX01JTiA9IDAKKyAgX01BWCA9ICgxIDw8IDY0KSAtIDEKKworCisjIFR5cGUtY2hlY2tlcnMgZm9yIGFsbCBzY2FsYXIgQ1BQVFlQRXMuCitfVkFMVUVfQ0hFQ0tFUlMgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0lOVDMyOiBJbnQzMlZhbHVlQ2hlY2tlcigpLAorICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQ2NDogSW50NjRWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDMyOiBVaW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDY0OiBVaW50NjRWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRE9VQkxFOiBUeXBlQ2hlY2tlcigKKyAgICAgICAgZmxvYXQsIGludCwgbG9uZyksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0ZMT0FUOiBUeXBlQ2hlY2tlcigKKyAgICAgICAgZmxvYXQsIGludCwgbG9uZyksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0JPT0w6IFR5cGVDaGVja2VyKGJvb2wsIGludCksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0VOVU06IEludDMyVmFsdWVDaGVja2VyKCksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORzogVHlwZUNoZWNrZXIoc3RyKSwKKyAgICB9CisKKworIyBNYXAgZnJvbSBmaWVsZCB0eXBlIHRvIGEgZnVuY3Rpb24gRiwgc3VjaCB0aGF0IEYoZmllbGRfbnVtLCB2YWx1ZSkKKyMgZ2l2ZXMgdGhlIHRvdGFsIGJ5dGUgc2l6ZSBmb3IgYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gIFRoaXMKKyMgYnl0ZSBzaXplIGluY2x1ZGVzIHRhZyBpbmZvcm1hdGlvbiBhbmQgYW55IG90aGVyIGFkZGl0aW9uYWwgc3BhY2UKKyMgYXNzb2NpYXRlZCB3aXRoIHNlcmlhbGl6aW5nICJ2YWx1ZSIuCitUWVBFX1RPX0JZVEVfU0laRV9GTiA9IHsKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiB3aXJlX2Zvcm1hdC5Eb3VibGVCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IHdpcmVfZm9ybWF0LkZsb2F0Qnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiB3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IHdpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogd2lyZV9mb3JtYXQuRml4ZWQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiB3aXJlX2Zvcm1hdC5GaXhlZDMyQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IHdpcmVfZm9ybWF0LkJvb2xCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOiB3aXJlX2Zvcm1hdC5TdHJpbmdCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IHdpcmVfZm9ybWF0Lkdyb3VwQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6IHdpcmVfZm9ybWF0Lk1lc3NhZ2VCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6IHdpcmVfZm9ybWF0LkJ5dGVzQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IHdpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IHdpcmVfZm9ybWF0LlNGaXhlZDMyQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiB3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IHdpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IHdpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplCisgICAgfQorCisKKyMgTWFwcyBmcm9tIGZpZWxkIHR5cGVzIHRvIGVuY29kZXIgY29uc3RydWN0b3JzLgorVFlQRV9UT19FTkNPREVSID0geworICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IGVuY29kZXIuRG91YmxlRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IGVuY29kZXIuRmxvYXRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogZW5jb2Rlci5JbnQ2NEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NDogZW5jb2Rlci5VSW50NjRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogZW5jb2Rlci5JbnQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IGVuY29kZXIuRml4ZWQ2NEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IGVuY29kZXIuRml4ZWQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IGVuY29kZXIuQm9vbEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzogZW5jb2Rlci5TdHJpbmdFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogZW5jb2Rlci5Hcm91cEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6IGVuY29kZXIuTWVzc2FnZUVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOiBlbmNvZGVyLkJ5dGVzRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDMyOiBlbmNvZGVyLlVJbnQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IGVuY29kZXIuRW51bUVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiBlbmNvZGVyLlNGaXhlZDMyRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IGVuY29kZXIuU0ZpeGVkNjRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IGVuY29kZXIuU0ludDMyRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0OiBlbmNvZGVyLlNJbnQ2NEVuY29kZXIsCisgICAgfQorCisKKyMgTWFwcyBmcm9tIGZpZWxkIHR5cGVzIHRvIHNpemVyIGNvbnN0cnVjdG9ycy4KK1RZUEVfVE9fU0laRVIgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogZW5jb2Rlci5Eb3VibGVTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IGVuY29kZXIuRmxvYXRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IGVuY29kZXIuSW50NjRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiBlbmNvZGVyLlVJbnQ2NFNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogZW5jb2Rlci5JbnQzMlNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiBlbmNvZGVyLkZpeGVkNjRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogZW5jb2Rlci5GaXhlZDMyU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IGVuY29kZXIuQm9vbFNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6IGVuY29kZXIuU3RyaW5nU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiBlbmNvZGVyLkdyb3VwU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6IGVuY29kZXIuTWVzc2FnZVNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzogZW5jb2Rlci5CeXRlc1NpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IGVuY29kZXIuVUludDMyU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IGVuY29kZXIuRW51bVNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogZW5jb2Rlci5TRml4ZWQzMlNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogZW5jb2Rlci5TRml4ZWQ2NFNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IGVuY29kZXIuU0ludDMyU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogZW5jb2Rlci5TSW50NjRTaXplciwKKyAgICB9CisKKworIyBNYXBzIGZyb20gZmllbGQgdHlwZSB0byBhIGRlY29kZXIgY29uc3RydWN0b3IuCitUWVBFX1RPX0RFQ09ERVIgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogZGVjb2Rlci5Eb3VibGVEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogZGVjb2Rlci5GbG9hdERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiBkZWNvZGVyLkludDY0RGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiBkZWNvZGVyLlVJbnQ2NERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiBkZWNvZGVyLkludDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogZGVjb2Rlci5GaXhlZDY0RGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogZGVjb2Rlci5GaXhlZDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogZGVjb2Rlci5Cb29sRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOiBkZWNvZGVyLlN0cmluZ0RlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiBkZWNvZGVyLkdyb3VwRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogZGVjb2Rlci5NZXNzYWdlRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6IGRlY29kZXIuQnl0ZXNEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IGRlY29kZXIuVUludDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogZGVjb2Rlci5FbnVtRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IGRlY29kZXIuU0ZpeGVkMzJEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogZGVjb2Rlci5TRml4ZWQ2NERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogZGVjb2Rlci5TSW50MzJEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IGRlY29kZXIuU0ludDY0RGVjb2RlciwKKyAgICB9CisKKyMgTWFwcyBmcm9tIGZpZWxkIHR5cGUgdG8gZXhwZWN0ZWQgd2lyZXR5cGUuCitGSUVMRF9UWVBFX1RPX1dJUkVfVFlQRSA9IHsKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOgorICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOgorICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6CisgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdW5rbm93bl9maWVsZHNfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC91bmtub3duX2ZpZWxkc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg0OTg0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdW5rbm93bl9maWVsZHNfdGVzdC5weQpAQCAtMCwwICsxLDE3MCBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3QgZm9yIHByZXNlcnZhdGlvbiBvZiB1bmtub3duIGZpZWxkcyBpbiB0aGUgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24uIiIiCisKK19fYXV0aG9yX18gPSAnYm9oZGFua0Bnb29nbGUuY29tIChCb2hkYW4gS292YWwpJworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGVuY29kZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0ZXN0X3V0aWwKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0eXBlX2NoZWNrZXJzCisKKworY2xhc3MgVW5rbm93bkZpZWxkc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLmRlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKKyAgICBzZWxmLmFsbF9maWVsZHMgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHNlbGYuYWxsX2ZpZWxkcykKKyAgICBzZWxmLmFsbF9maWVsZHNfZGF0YSA9IHNlbGYuYWxsX2ZpZWxkcy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5lbXB0eV9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgIHNlbGYuZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5hbGxfZmllbGRzX2RhdGEpCisgICAgc2VsZi51bmtub3duX2ZpZWxkcyA9IHNlbGYuZW1wdHlfbWVzc2FnZS5fdW5rbm93bl9maWVsZHMKKworICBkZWYgR2V0RmllbGQoc2VsZiwgbmFtZSk6CisgICAgZmllbGRfZGVzY3JpcHRvciA9IHNlbGYuZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVtuYW1lXQorICAgIHdpcmVfdHlwZSA9IHR5cGVfY2hlY2tlcnMuRklFTERfVFlQRV9UT19XSVJFX1RZUEVbZmllbGRfZGVzY3JpcHRvci50eXBlXQorICAgIGZpZWxkX3RhZyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIHdpcmVfdHlwZSkKKyAgICBmb3IgdGFnX2J5dGVzLCB2YWx1ZSBpbiBzZWxmLnVua25vd25fZmllbGRzOgorICAgICAgaWYgdGFnX2J5dGVzID09IGZpZWxkX3RhZzoKKyAgICAgICAgZGVjb2RlciA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuX2RlY29kZXJzX2J5X3RhZ1t0YWdfYnl0ZXNdCisgICAgICAgIHJlc3VsdF9kaWN0ID0ge30KKyAgICAgICAgZGVjb2Rlcih2YWx1ZSwgMCwgbGVuKHZhbHVlKSwgc2VsZi5hbGxfZmllbGRzLCByZXN1bHRfZGljdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdF9kaWN0W2ZpZWxkX2Rlc2NyaXB0b3JdCisKKyAgZGVmIHRlc3RWYXJpbnQoc2VsZik6CisgICAgdmFsdWUgPSBzZWxmLkdldEZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmFsbF9maWVsZHMub3B0aW9uYWxfaW50MzIsIHZhbHVlKQorCisgIGRlZiB0ZXN0Rml4ZWQzMihzZWxmKToKKyAgICB2YWx1ZSA9IHNlbGYuR2V0RmllbGQoJ29wdGlvbmFsX2ZpeGVkMzInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ZpeGVkMzIsIHZhbHVlKQorCisgIGRlZiB0ZXN0Rml4ZWQ2NChzZWxmKToKKyAgICB2YWx1ZSA9IHNlbGYuR2V0RmllbGQoJ29wdGlvbmFsX2ZpeGVkNjQnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ZpeGVkNjQsIHZhbHVlKQorCisgIGRlZiB0ZXN0TGVuZ3RoRGVsaW1pdGVkKHNlbGYpOgorICAgIHZhbHVlID0gc2VsZi5HZXRGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkcy5vcHRpb25hbF9zdHJpbmcsIHZhbHVlKQorCisgIGRlZiB0ZXN0R3JvdXAoc2VsZik6CisgICAgdmFsdWUgPSBzZWxmLkdldEZpZWxkKCdvcHRpb25hbGdyb3VwJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkcy5vcHRpb25hbGdyb3VwLCB2YWx1ZSkKKworICBkZWYgdGVzdFNlcmlhbGl6ZShzZWxmKToKKyAgICBkYXRhID0gc2VsZi5lbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgICMgRG9uJ3QgdXNlIGFzc2VydEVxdWFsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0bworICAgICMgc3Rkb3V0LgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhID09IHNlbGYuYWxsX2ZpZWxkc19kYXRhKQorCisgIGRlZiB0ZXN0Q29weUZyb20oc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKKyAgICBtZXNzYWdlLkNvcHlGcm9tKHNlbGYuZW1wdHlfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudW5rbm93bl9maWVsZHMsIG1lc3NhZ2UuX3Vua25vd25fZmllbGRzKQorCisgIGRlZiB0ZXN0TWVyZ2VGcm9tKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2ludDMyID0gMQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyID0gMgorICAgIHNvdXJjZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKKyAgICBzb3VyY2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQgPSAzCisgICAgbWVzc2FnZS5vcHRpb25hbF91aW50MzIgPSA0CisgICAgZGVzdGluYXRpb24gPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICB1bmtub3duX2ZpZWxkcyA9IGRlc3RpbmF0aW9uLl91bmtub3duX2ZpZWxkc1s6XQorCisgICAgZGVzdGluYXRpb24uTWVyZ2VGcm9tKHNvdXJjZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVua25vd25fZmllbGRzICsgc291cmNlLl91bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLl91bmtub3duX2ZpZWxkcykKKworICBkZWYgdGVzdENsZWFyKHNlbGYpOgorICAgIHNlbGYuZW1wdHlfbWVzc2FnZS5DbGVhcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oc2VsZi5lbXB0eV9tZXNzYWdlLl91bmtub3duX2ZpZWxkcykpCisKKyAgZGVmIHRlc3RCeXRlU2l6ZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkcy5CeXRlU2l6ZSgpLCBzZWxmLmVtcHR5X21lc3NhZ2UuQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFVua25vd25FeHRlbnNpb25zKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zKCkKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZWxmLmFsbF9maWVsZHNfZGF0YSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW1wdHlfbWVzc2FnZS5fdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLl91bmtub3duX2ZpZWxkcykKKworICBkZWYgdGVzdExpc3RGaWVsZHMoc2VsZik6CisgICAgIyBNYWtlIHN1cmUgTGlzdEZpZWxkcyBkb2Vzbid0IHJldHVybiB1bmtub3duIGZpZWxkcy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihzZWxmLmVtcHR5X21lc3NhZ2UuTGlzdEZpZWxkcygpKSkKKworICBkZWYgdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXJlRm9ybWF0VW5rbm93bkV4dGVuc2lvbihzZWxmKToKKyAgICAjIENyZWF0ZSBhIG1lc3NhZ2UgdXNpbmcgdGhlIG1lc3NhZ2Ugc2V0IHdpcmUgZm9ybWF0IHdpdGggYW4gdW5rbm93bgorICAgICMgbWVzc2FnZS4KKyAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKKworICAgICMgQWRkIGFuIHVua25vd24gZXh0ZW5zaW9uLgorICAgIGl0ZW0gPSByYXcuaXRlbS5hZGQoKQorICAgIGl0ZW0udHlwZV9pZCA9IDE1NDUwMDkKKyAgICBtZXNzYWdlMSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpCisgICAgbWVzc2FnZTEuaSA9IDEyMzQ1CisgICAgaXRlbS5tZXNzYWdlID0gbWVzc2FnZTEuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgc2VyaWFsaXplZCA9IHJhdy5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICAjIFBhcnNlIG1lc3NhZ2UgdXNpbmcgdGhlIG1lc3NhZ2Ugc2V0IHdpcmUgZm9ybWF0LgorICAgIHByb3RvID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIHByb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgICAgIyBWZXJpZnkgdGhhdCB0aGUgdW5rbm93biBleHRlbnNpb24gaXMgc2VyaWFsaXplZCB1bmNoYW5nZWQKKyAgICByZXNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbmV3X3JhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorICAgIG5ld19yYXcuTWVyZ2VGcm9tU3RyaW5nKHJlc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHJhdywgbmV3X3JhdykKKworICBkZWYgdGVzdEVxdWFscyhzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlbGYuYWxsX2ZpZWxkc19kYXRhKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbXB0eV9tZXNzYWdlLCBtZXNzYWdlKQorCisgICAgc2VsZi5hbGxfZmllbGRzLkNsZWFyRmllbGQoJ29wdGlvbmFsX3N0cmluZycpCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5hbGxfZmllbGRzLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmVtcHR5X21lc3NhZ2UsIG1lc3NhZ2UpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzk0MWZlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdC5weQpAQCAtMCwwICsxLDI2OCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnN0YW50cyBhbmQgc3RhdGljIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdC4iIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IHN0cnVjdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCisKKworVEFHX1RZUEVfQklUUyA9IDMgICMgTnVtYmVyIG9mIGJpdHMgdXNlZCB0byBob2xkIHR5cGUgaW5mbyBpbiBhIHByb3RvIHRhZy4KK1RBR19UWVBFX01BU0sgPSAoMSA8PCBUQUdfVFlQRV9CSVRTKSAtIDEgICMgMHg3CisKKyMgVGhlc2UgbnVtYmVycyBpZGVudGlmeSB0aGUgd2lyZSB0eXBlIG9mIGEgcHJvdG9jb2wgYnVmZmVyIHZhbHVlLgorIyBXZSB1c2UgdGhlIGxlYXN0LXNpZ25pZmljYW50IFRBR19UWVBFX0JJVFMgYml0cyBvZiB0aGUgdmFyaW50LWVuY29kZWQKKyMgdGFnLWFuZC10eXBlIHRvIHN0b3JlIG9uZSBvZiB0aGVzZSBXSVJFVFlQRV8qIGNvbnN0YW50cy4KKyMgVGhlc2UgdmFsdWVzIG11c3QgbWF0Y2ggV2lyZVR5cGUgZW51bSBpbiBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaC4KK1dJUkVUWVBFX1ZBUklOVCA9IDAKK1dJUkVUWVBFX0ZJWEVENjQgPSAxCitXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEID0gMgorV0lSRVRZUEVfU1RBUlRfR1JPVVAgPSAzCitXSVJFVFlQRV9FTkRfR1JPVVAgPSA0CitXSVJFVFlQRV9GSVhFRDMyID0gNQorX1dJUkVUWVBFX01BWCA9IDUKKworCisjIEJvdW5kcyBmb3IgdmFyaW91cyBpbnRlZ2VyIHR5cGVzLgorSU5UMzJfTUFYID0gaW50KCgxIDw8IDMxKSAtIDEpCitJTlQzMl9NSU4gPSBpbnQoLSgxIDw8IDMxKSkKK1VJTlQzMl9NQVggPSAoMSA8PCAzMikgLSAxCisKK0lOVDY0X01BWCA9ICgxIDw8IDYzKSAtIDEKK0lOVDY0X01JTiA9IC0oMSA8PCA2MykKK1VJTlQ2NF9NQVggPSAoMSA8PCA2NCkgLSAxCisKKyMgInN0cnVjdCIgZm9ybWF0IHN0cmluZ3MgdGhhdCB3aWxsIGVuY29kZS9kZWNvZGUgdGhlIHNwZWNpZmllZCBmb3JtYXRzLgorRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOID0gJzxJJworRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOID0gJzxRJworRk9STUFUX0ZMT0FUX0xJVFRMRV9FTkRJQU4gPSAnPGYnCitGT1JNQVRfRE9VQkxFX0xJVFRMRV9FTkRJQU4gPSAnPGQnCisKKworIyBXZSdsbCBoYXZlIHRvIHByb3ZpZGUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBvZiBBcHBlbmRMaXR0bGVFbmRpYW4qKCkgb24KKyMgYW55IGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlc2UgY2hlY2tzIGZhaWwuCitpZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOKSAhPSA0OgorICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJJIiBpcyBub3QgYSAzMi1iaXQgbnVtYmVyLicpCitpZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOKSAhPSA4OgorICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJRIiBpcyBub3QgYSA2NC1iaXQgbnVtYmVyLicpCisKKworZGVmIFBhY2tUYWcoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpOgorICAiIiJSZXR1cm5zIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHRoYXQgZW5jb2RlcyB0aGUgZmllbGQgbnVtYmVyIGFuZAorICB3aXJlIHR5cGUgaW5mb3JtYXRpb24gaW4gc3RhbmRhcmQgcHJvdG9jb2wgbWVzc2FnZSB3aXJlIGZvcm1hdC4KKworICBBcmdzOgorICAgIGZpZWxkX251bWJlcjogRXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzEsIDEgPDwgMjkpCisgICAgd2lyZV90eXBlOiBPbmUgb2YgdGhlIFdJUkVUWVBFXyogY29uc3RhbnRzLgorICAiIiIKKyAgaWYgbm90IDAgPD0gd2lyZV90eXBlIDw9IF9XSVJFVFlQRV9NQVg6CisgICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVW5rbm93biB3aXJlIHR5cGU6ICVkJyAlIHdpcmVfdHlwZSkKKyAgcmV0dXJuIChmaWVsZF9udW1iZXIgPDwgVEFHX1RZUEVfQklUUykgfCB3aXJlX3R5cGUKKworCitkZWYgVW5wYWNrVGFnKHRhZyk6CisgICIiIlRoZSBpbnZlcnNlIG9mIFBhY2tUYWcoKS4gIEdpdmVuIGFuIHVuc2lnbmVkIDMyLWJpdCBudW1iZXIsCisgIHJldHVybnMgYSAoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpIHR1cGxlLgorICAiIiIKKyAgcmV0dXJuICh0YWcgPj4gVEFHX1RZUEVfQklUUyksICh0YWcgJiBUQUdfVFlQRV9NQVNLKQorCisKK2RlZiBaaWdaYWdFbmNvZGUodmFsdWUpOgorICAiIiJaaWdaYWcgVHJhbnNmb3JtOiAgRW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgc28gdGhhdCB0aGV5IGNhbiBiZQorICBlZmZlY3RpdmVseSB1c2VkIHdpdGggdmFyaW50IGVuY29kaW5nLiAgU2VlIHdpcmVfZm9ybWF0LmggZm9yCisgIG1vcmUgZGV0YWlscy4KKyAgIiIiCisgIGlmIHZhbHVlID49IDA6CisgICAgcmV0dXJuIHZhbHVlIDw8IDEKKyAgcmV0dXJuICh2YWx1ZSA8PCAxKSBeICh+MCkKKworCitkZWYgWmlnWmFnRGVjb2RlKHZhbHVlKToKKyAgIiIiSW52ZXJzZSBvZiBaaWdaYWdFbmNvZGUoKS4iIiIKKyAgaWYgbm90IHZhbHVlICYgMHgxOgorICAgIHJldHVybiB2YWx1ZSA+PiAxCisgIHJldHVybiAodmFsdWUgPj4gMSkgXiAofjApCisKKworCisjIFRoZSAqQnl0ZVNpemUoKSBmdW5jdGlvbnMgYmVsb3cgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8KKyMgc2VyaWFsaXplICJmaWVsZCBudW1iZXIgKyB0eXBlIiBpbmZvcm1hdGlvbiBhbmQgdGhlbiBzZXJpYWxpemUgdGhlIHZhbHVlLgorCisKK2RlZiBJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgaW50MzIpOgorICByZXR1cm4gSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKQorCisKK2RlZiBJbnQzMkJ5dGVTaXplTm9UYWcoaW50MzIpOgorICByZXR1cm4gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50MzIpCisKKworZGVmIEludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6CisgICMgSGF2ZSB0byBjb252ZXJ0IHRvIHVpbnQgYmVmb3JlIGNhbGxpbmcgVUludDY0Qnl0ZVNpemUoKS4KKyAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50NjQpCisKKworZGVmIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKToKKyAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKQorCisKK2RlZiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHVpbnQ2NCk6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcodWludDY0KQorCisKK2RlZiBTSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKToKKyAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgWmlnWmFnRW5jb2RlKGludDMyKSkKKworCitkZWYgU0ludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6CisgIHJldHVybiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIFppZ1phZ0VuY29kZShpbnQ2NCkpCisKKworZGVmIEZpeGVkMzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGZpeGVkMzIpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgRml4ZWQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgZml4ZWQ2NCk6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgOAorCisKK2RlZiBTRml4ZWQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgc2ZpeGVkMzIpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgU0ZpeGVkNjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHNmaXhlZDY0KToKKyAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA4CisKKworZGVmIEZsb2F0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBmbHQpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgRG91YmxlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBkb3VibGUpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDgKKworCitkZWYgQm9vbEJ5dGVTaXplKGZpZWxkX251bWJlciwgYik6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgMQorCisKK2RlZiBFbnVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBlbnVtKToKKyAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgZW51bSkKKworCitkZWYgU3RyaW5nQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBzdHJpbmcpOgorICByZXR1cm4gQnl0ZXNCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHN0cmluZy5lbmNvZGUoJ3V0Zi04JykpCisKKworZGVmIEJ5dGVzQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBiKToKKyAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCisgICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhsZW4oYikpCisgICAgICAgICAgKyBsZW4oYikpCisKKworZGVmIEdyb3VwQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKKyAgcmV0dXJuICgyICogVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSAgIyBTVEFSVCBhbmQgRU5EIGdyb3VwLgorICAgICAgICAgICsgbWVzc2FnZS5CeXRlU2l6ZSgpKQorCisKK2RlZiBNZXNzYWdlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKKyAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCisgICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhtZXNzYWdlLkJ5dGVTaXplKCkpCisgICAgICAgICAgKyBtZXNzYWdlLkJ5dGVTaXplKCkpCisKKworZGVmIE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtc2cpOgorICAjIEZpcnN0IGNvbXB1dGUgdGhlIHNpemVzIG9mIHRoZSB0YWdzLgorICAjIFRoZXJlIGFyZSAyIHRhZ3MgZm9yIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiB0aGUgcmVwZWF0ZWQgZ3JvdXAsIHRoYXQKKyAgIyBpcyBmaWVsZCBudW1iZXIgMSwgb25lIHdpdGggZmllbGQgbnVtYmVyIDIgKHR5cGVfaWQpIGFuZCBvbmUgd2l0aCBmaWVsZAorICAjIG51bWJlciAzIChtZXNzYWdlKS4KKyAgdG90YWxfc2l6ZSA9ICgyICogVGFnQnl0ZVNpemUoMSkgKyBUYWdCeXRlU2l6ZSgyKSArIFRhZ0J5dGVTaXplKDMpKQorCisgICMgQWRkIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHR5cGVfaWQuCisgIHRvdGFsX3NpemUgKz0gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoZmllbGRfbnVtYmVyKQorCisgIG1lc3NhZ2Vfc2l6ZSA9IG1zZy5CeXRlU2l6ZSgpCisKKyAgIyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGZvciBlbmNvZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLgorICB0b3RhbF9zaXplICs9IF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKG1lc3NhZ2Vfc2l6ZSkKKworICAjIFRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgorICB0b3RhbF9zaXplICs9IG1lc3NhZ2Vfc2l6ZQorICByZXR1cm4gdG90YWxfc2l6ZQorCisKK2RlZiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpOgorICAiIiJSZXR1cm5zIHRoZSBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSB0YWcgd2l0aCB0aGlzIGZpZWxkIG51bWJlci4iIiIKKyAgIyBKdXN0IHBhc3MgaW4gdHlwZSAwLCBzaW5jZSB0aGUgdHlwZSB3b24ndCBhZmZlY3QgdGhlIHRhZyt0eXBlIHNpemUuCisgIHJldHVybiBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhQYWNrVGFnKGZpZWxkX251bWJlciwgMCkpCisKKworIyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlICpCeXRlU2l6ZSgpIGZ1bmN0aW9ucyBhYm92ZS4KKworZGVmIF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKHVpbnQ2NCk6CisgICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSBzaW5nbGUgdmFyaW50CisgIHVzaW5nIGJvdW5kYXJ5IHZhbHVlIGNvbXBhcmlzb25zLiAodW5yb2xsZWQgbG9vcCBvcHRpbWl6YXRpb24gLVdQaWVyY2UpCisgIHVpbnQ2NCBtdXN0IGJlIHVuc2lnbmVkLgorICAiIiIKKyAgaWYgdWludDY0IDw9IDB4N2Y6IHJldHVybiAxCisgIGlmIHVpbnQ2NCA8PSAweDNmZmY6IHJldHVybiAyCisgIGlmIHVpbnQ2NCA8PSAweDFmZmZmZjogcmV0dXJuIDMKKyAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKKyAgaWYgdWludDY0IDw9IDB4N2ZmZmZmZmZmOiByZXR1cm4gNQorICBpZiB1aW50NjQgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKKyAgaWYgdWludDY0IDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKKyAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZmZmZmZmZmY6IHJldHVybiA4CisgIGlmIHVpbnQ2NCA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5CisgIGlmIHVpbnQ2NCA+IFVJTlQ2NF9NQVg6CisgICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVmFsdWUgb3V0IG9mIHJhbmdlOiAlZCcgJSB1aW50NjQpCisgIHJldHVybiAxMAorCisKK05PTl9QQUNLQUJMRV9UWVBFUyA9ICgKKyAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkcsCisgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVAsCisgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSwKKyAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUworKQorCisKK2RlZiBJc1R5cGVQYWNrYWJsZShmaWVsZF90eXBlKToKKyAgIiIiUmV0dXJuIHRydWUgaWZmIHBhY2thYmxlID0gdHJ1ZSBpcyB2YWxpZCBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KKworICBBcmdzOgorICAgIGZpZWxkX3R5cGU6IGEgRmllbGREZXNjcmlwdG9yOjpUeXBlIHZhbHVlLgorCisgIFJldHVybnM6CisgICAgVHJ1ZSBpZmYgZmllbGRzIG9mIHRoaXMgdHlwZSBhcmUgcGFja2FibGUuCisgICIiIgorICByZXR1cm4gZmllbGRfdHlwZSBub3QgaW4gTk9OX1BBQ0tBQkxFX1RZUEVTCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc2MDA3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weQpAQCAtMCwwICsxLDI1MyBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdCBmb3IgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLndpcmVfZm9ybWF0LiIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKKworCitjbGFzcyBXaXJlRm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RQYWNrVGFnKHNlbGYpOgorICAgIGZpZWxkX251bWJlciA9IDB4YWJjCisgICAgdGFnX3R5cGUgPSAyCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoZmllbGRfbnVtYmVyIDw8IDMpIHwgdGFnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5QYWNrVGFnKGZpZWxkX251bWJlciwgdGFnX3R5cGUpKQorICAgIFBhY2tUYWcgPSB3aXJlX2Zvcm1hdC5QYWNrVGFnCisgICAgIyBOdW1iZXIgdG9vIGhpZ2guCisgICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgUGFja1RhZywgZmllbGRfbnVtYmVyLCA2KQorICAgICMgTnVtYmVyIHRvbyBsb3cuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgUGFja1RhZywgZmllbGRfbnVtYmVyLCAtMSkKKworICBkZWYgdGVzdFVucGFja1RhZyhzZWxmKToKKyAgICAjIFRlc3QgZmllbGQgbnVtYmVycyB0aGF0IHdpbGwgcmVxdWlyZSB2YXJpb3VzIHZhcmludCBzaXplcy4KKyAgICBmb3IgZXhwZWN0ZWRfZmllbGRfbnVtYmVyIGluICgxLCAxNSwgMTYsIDIwNDcsIDIwNDgpOgorICAgICAgZm9yIGV4cGVjdGVkX3dpcmVfdHlwZSBpbiByYW5nZSg2KTogICMgSGlnaGVzdC1udW1iZXJlZCB3aXJldHlwZSBpcyA1LgorICAgICAgICBmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSA9IHdpcmVfZm9ybWF0LlVucGFja1RhZygKKyAgICAgICAgICAgIHdpcmVfZm9ybWF0LlBhY2tUYWcoZXhwZWN0ZWRfZmllbGRfbnVtYmVyLCBleHBlY3RlZF93aXJlX3R5cGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2ZpZWxkX251bWJlciwgZmllbGRfbnVtYmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3dpcmVfdHlwZSwgd2lyZV90eXBlKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcsIE5vbmUpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcsICdhYmMnKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCAwLjApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcsIG9iamVjdCgpKQorCisgIGRlZiB0ZXN0WmlnWmFnRW5jb2RlKHNlbGYpOgorICAgIFogPSB3aXJlX2Zvcm1hdC5aaWdaYWdFbmNvZGUKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIFooMCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBaKC0xKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIFooMSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBaKC0yKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIFooMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZlLCBaKDB4N2ZmZmZmZmYpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZiwgWigtMHg4MDAwMDAwMCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmUsIFooMHg3ZmZmZmZmZmZmZmZmZmZmKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmZmZmZiwgWigtMHg4MDAwMDAwMDAwMDAwMDAwKSkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgTm9uZSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosICdhYmNkJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIDAuMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIG9iamVjdCgpKQorCisgIGRlZiB0ZXN0WmlnWmFnRGVjb2RlKHNlbGYpOgorICAgIFogPSB3aXJlX2Zvcm1hdC5aaWdaYWdEZWNvZGUKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIFooMCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgWigxKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFooMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiwgWigzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIFooNCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweDdmZmZmZmZmLCBaKDB4ZmZmZmZmZmUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4ODAwMDAwMDAsIFooMHhmZmZmZmZmZikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweDdmZmZmZmZmZmZmZmZmZmYsIFooMHhmZmZmZmZmZmZmZmZmZmZlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0weDgwMDAwMDAwMDAwMDAwMDAsIFooMHhmZmZmZmZmZmZmZmZmZmZmKSkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgTm9uZSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosICdhYmNkJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIDAuMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIG9iamVjdCgpKQorCisgIGRlZiBOdW1lcmljQnl0ZVNpemVUZXN0SGVscGVyKHNlbGYsIGJ5dGVfc2l6ZV9mbiwgdmFsdWUsIGV4cGVjdGVkX3ZhbHVlX3NpemUpOgorICAgICMgVXNlIGZpZWxkIG51bWJlcnMgdGhhdCBjYXVzZSB2YXJpb3VzIGJ5dGUgc2l6ZXMgZm9yIHRoZSB0YWcgaW5mb3JtYXRpb24uCisgICAgZm9yIGZpZWxkX251bWJlciwgdGFnX2J5dGVzIGluICgoMTUsIDEpLCAoMTYsIDIpLCAoMjA0NywgMiksICgyMDQ4LCAzKSk6CisgICAgICBleHBlY3RlZF9zaXplID0gZXhwZWN0ZWRfdmFsdWVfc2l6ZSArIHRhZ19ieXRlcworICAgICAgYWN0dWFsX3NpemUgPSBieXRlX3NpemVfZm4oZmllbGRfbnVtYmVyLCB2YWx1ZSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfc2l6ZSwgYWN0dWFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICdieXRlX3NpemVfZm46ICVzLCBmaWVsZF9udW1iZXI6ICVkLCB2YWx1ZTogJXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdGVkOiAlZCwgQWN0dWFsOiAlZCclICgKKyAgICAgICAgICBieXRlX3NpemVfZm4sIGZpZWxkX251bWJlciwgdmFsdWUsIGV4cGVjdGVkX3NpemUsIGFjdHVhbF9zaXplKSkKKworICBkZWYgdGVzdEJ5dGVTaXplRnVuY3Rpb25zKHNlbGYpOgorICAgICMgVGVzdCBhbGwgbnVtZXJpYyAqQnl0ZVNpemUoKSBmdW5jdGlvbnMuCisgICAgTlVNRVJJQ19BUkdTID0gWworICAgICAgICAjIEludDMyQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsIDEyOCwgMl0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLCAtMSwgMTBdLAorICAgICAgICAjIEludDY0Qnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuSW50NjRCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsIDEyOCwgMl0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLCAtMSwgMTBdLAorICAgICAgICAjIFVJbnQzMkJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwgMCwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQzMkJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQzMl9NQVgsIDVdLAorICAgICAgICAjIFVJbnQ2NEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMCwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQ2NF9NQVgsIDEwXSwKKyAgICAgICAgIyBTSW50MzJCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIC0xLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAxLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAtNjMsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIDYzLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAtNjQsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIDY0LCAyXSwKKyAgICAgICAgIyBTSW50NjRCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIC0xLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAxLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAtNjMsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIDYzLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAtNjQsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIDY0LCAyXSwKKyAgICAgICAgIyBGaXhlZDMyQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkZpeGVkMzJCeXRlU2l6ZSwgMCwgNF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5GaXhlZDMyQnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQzMl9NQVgsIDRdLAorICAgICAgICAjIEZpeGVkNjRCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuRml4ZWQ2NEJ5dGVTaXplLCAwLCA4XSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkZpeGVkNjRCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuVUlOVDY0X01BWCwgOF0sCisgICAgICAgICMgU0ZpeGVkMzJCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwgMCwgNF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQzMkJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5JTlQzMl9NSU4sIDRdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuSU5UMzJfTUFYLCA0XSwKKyAgICAgICAgIyBTRml4ZWQ2NEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLCAwLCA4XSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDY0Qnl0ZVNpemUsIHdpcmVfZm9ybWF0LklOVDY0X01JTiwgOF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5JTlQ2NF9NQVgsIDhdLAorICAgICAgICAjIEZsb2F0Qnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkZsb2F0Qnl0ZVNpemUsIDAuMCwgNF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5GbG9hdEJ5dGVTaXplLCAxMDAwMDAwMDAwLjAsIDRdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRmxvYXRCeXRlU2l6ZSwgLTEwMDAwMDAwMDAuMCwgNF0sCisgICAgICAgICMgRG91YmxlQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkRvdWJsZUJ5dGVTaXplLCAwLjAsIDhdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRG91YmxlQnl0ZVNpemUsIDEwMDAwMDAwMDAuMCwgOF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5Eb3VibGVCeXRlU2l6ZSwgLTEwMDAwMDAwMDAuMCwgOF0sCisgICAgICAgICMgQm9vbEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5Cb29sQnl0ZVNpemUsIEZhbHNlLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkJvb2xCeXRlU2l6ZSwgVHJ1ZSwgMV0sCisgICAgICAgICMgRW51bUJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5FbnVtQnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCAxMjcsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UMzJfTUFYLCA1XSwKKyAgICAgICAgXQorICAgIGZvciBhcmdzIGluIE5VTUVSSUNfQVJHUzoKKyAgICAgIHNlbGYuTnVtZXJpY0J5dGVTaXplVGVzdEhlbHBlcigqYXJncykKKworICAgICMgVGVzdCBzdHJpbmdzIGFuZCBieXRlcy4KKyAgICBmb3IgYnl0ZV9zaXplX2ZuIGluICh3aXJlX2Zvcm1hdC5TdHJpbmdCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuQnl0ZXNCeXRlU2l6ZSk6CisgICAgICAjIDEgYnl0ZSBmb3IgdGFnLCAxIGJ5dGUgZm9yIGxlbmd0aCwgMyBieXRlcyBmb3IgY29udGVudHMuCisgICAgICBzZWxmLmFzc2VydEVxdWFsKDUsIGJ5dGVfc2l6ZV9mbigxMCwgJ2FiYycpKQorICAgICAgIyAyIGJ5dGVzIGZvciB0YWcsIDEgYnl0ZSBmb3IgbGVuZ3RoLCAzIGJ5dGVzIGZvciBjb250ZW50cy4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgYnl0ZV9zaXplX2ZuKDE2LCAnYWJjJykpCisgICAgICAjIDIgYnl0ZXMgZm9yIHRhZywgMiBieXRlcyBmb3IgbGVuZ3RoLCAxMjggYnl0ZXMgZm9yIGNvbnRlbnRzLgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMzIsIGJ5dGVfc2l6ZV9mbigxNiwgJ2EnICogMTI4KSkKKworICAgICMgVGVzdCBVVEYtOCBzdHJpbmcgYnl0ZSBzaXplIGNhbGN1bGF0aW9uLgorICAgICMgMSBieXRlIGZvciB0YWcsIDEgYnl0ZSBmb3IgbGVuZ3RoLCA4IGJ5dGVzIGZvciBjb250ZW50LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIHdpcmVfZm9ybWF0LlN0cmluZ0J5dGVTaXplKAorICAgICAgICA1LCB1bmljb2RlKCdceGQwXHhhMlx4ZDBceGI1XHhkMVx4ODFceGQxXHg4MicsICd1dGYtOCcpKSkKKworICAgIGNsYXNzIE1vY2tNZXNzYWdlKG9iamVjdCk6CisgICAgICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZV9zaXplKToKKyAgICAgICAgc2VsZi5ieXRlX3NpemUgPSBieXRlX3NpemUKKyAgICAgIGRlZiBCeXRlU2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnl0ZV9zaXplCisKKyAgICBtZXNzYWdlX2J5dGVfc2l6ZSA9IDEwCisgICAgbW9ja19tZXNzYWdlID0gTW9ja01lc3NhZ2UoYnl0ZV9zaXplPW1lc3NhZ2VfYnl0ZV9zaXplKQorICAgICMgVGVzdCBncm91cHMuCisgICAgIyAoMiAqIDEpIGJ5dGVzIGZvciBiZWdpbiBhbmQgZW5kIHRhZ3MsIHBsdXMgbWVzc2FnZV9ieXRlX3NpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgbWVzc2FnZV9ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5Hcm91cEJ5dGVTaXplKDEsIG1vY2tfbWVzc2FnZSkpCisgICAgIyAoMiAqIDIpIGJ5dGVzIGZvciBiZWdpbiBhbmQgZW5kIHRhZ3MsIHBsdXMgbWVzc2FnZV9ieXRlX3NpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0ICsgbWVzc2FnZV9ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5Hcm91cEJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQorCisgICAgIyBUZXN0IG1lc3NhZ2VzLgorICAgICMgMSBieXRlIGZvciB0YWcsIHBsdXMgMSBieXRlIGZvciBsZW5ndGgsIHBsdXMgY29udGVudHMuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VCeXRlU2l6ZSgxLCBtb2NrX21lc3NhZ2UpKQorICAgICMgMiBieXRlcyBmb3IgdGFnLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMyArIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlQnl0ZVNpemUoMTYsIG1vY2tfbWVzc2FnZSkpCisgICAgIyAyIGJ5dGVzIGZvciB0YWcsIHBsdXMgMiBieXRlcyBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgorICAgIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQgKyBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZUJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQorCisKKyAgICAjIFRlc3QgbWVzc2FnZSBzZXQgaXRlbSBieXRlIHNpemUuCisgICAgIyA0IGJ5dGVzIGZvciB0YWdzLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIDEgYnl0ZSBmb3IgdHlwZV9pZCwKKyAgICAjIHBsdXMgY29udGVudHMuCisgICAgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSA9IDEwCisgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgNiwKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKKworICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAyIGJ5dGVzIGZvciBsZW5ndGgsIHBsdXMgMSBieXRlIGZvciB0eXBlX2lkLAorICAgICMgcGx1cyBjb250ZW50cy4KKyAgICBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgNywKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKKworICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAyIGJ5dGVzIGZvciBsZW5ndGgsIHBsdXMgMiBieXRlIGZvciB0eXBlX2lkLAorICAgICMgcGx1cyBjb250ZW50cy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgKyA4LAorICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZSgxMjgsIG1vY2tfbWVzc2FnZSkpCisKKyAgICAjIFRvby1sb25nIHZhcmludC4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCAxLCAxIDw8IDEyOCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmVjMmY4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLnB5CkBAIC0wLDAgKzEsMjgwIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBUT0RPKHJvYmluc29uKTogV2Ugc2hvdWxkIGp1c3QgbWFrZSB0aGVzZSBtZXRob2RzIGFsbCAicHVyZS12aXJ0dWFsIiBhbmQgbW92ZQorIyBhbGwgaW1wbGVtZW50YXRpb24gb3V0LCBpbnRvIHJlZmxlY3Rpb24ucHkgZm9yIG5vdy4KKworCisiIiJDb250YWlucyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm90b2NvbCBtZXNzYWdlcy4iIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOiBwYXNzCitjbGFzcyBEZWNvZGVFcnJvcihFcnJvcik6IHBhc3MKK2NsYXNzIEVuY29kZUVycm9yKEVycm9yKTogcGFzcworCisKK2NsYXNzIE1lc3NhZ2Uob2JqZWN0KToKKworICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm90b2NvbCBtZXNzYWdlcy4KKworICBQcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgYXJlIGFsbW9zdCBhbHdheXMgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbAorICBjb21waWxlci4gIFRoZXNlIGdlbmVyYXRlZCB0eXBlcyBzdWJjbGFzcyBNZXNzYWdlIGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMKKyAgc2hvd24gYmVsb3cuCisKKyAgVE9ETyhyb2JpbnNvbik6IExpbmsgdG8gYW4gSFRNTCBkb2N1bWVudCBoZXJlLgorCisgIFRPRE8ocm9iaW5zb24pOiBEb2N1bWVudCB0aGF0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdpbGwgYWxzbworICBoYXZlIGFuIEV4dGVuc2lvbnMgYXR0cmlidXRlIHdpdGggX19nZXRpdGVtX18gYW5kIF9fc2V0aXRlbV9fLgorICBBZ2Fpbiwgbm90IHN1cmUgaG93IHRvIGJlc3QgY29udmV5IHRoaXMuCisKKyAgVE9ETyhyb2JpbnNvbik6IERvY3VtZW50IHRoYXQgdGhlIGNsYXNzIG11c3QgYWxzbyBoYXZlIGEgc3RhdGljCisgICAgUmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uX2ZpZWxkKSBtZXRob2QuCisgICAgTm90IHN1cmUgaG93IHRvIGJlc3QgZXhwcmVzcyBhdCB0aGlzIHBvaW50LgorICAiIiIKKworICAjIFRPRE8ocm9iaW5zb24pOiBEb2N1bWVudCB0aGVzZSBmaWVsZHMgYW5kIG1ldGhvZHMuCisKKyAgX19zbG90c19fID0gW10KKworICBERVNDUklQVE9SID0gTm9uZQorCisgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbz1Ob25lKToKKyAgICBjbG9uZSA9IHR5cGUoc2VsZikoKQorICAgIGNsb25lLk1lcmdlRnJvbShzZWxmKQorICAgIHJldHVybiBjbG9uZQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXJfbXNnKToKKyAgICAiIiJSZWN1cnNpdmVseSBjb21wYXJlcyB0d28gbWVzc2FnZXMgYnkgdmFsdWUgYW5kIHN0cnVjdHVyZS4iIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcl9tc2cpOgorICAgICMgQ2FuJ3QganVzdCBzYXkgc2VsZiAhPSBvdGhlcl9tc2csIHNpbmNlIHRoYXQgd291bGQgaW5maW5pdGVseSByZWN1cnNlLiA6KQorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcl9tc2cKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgIiIiT3V0cHV0cyBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgIiIiT3V0cHV0cyBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyX21zZyk6CisgICAgIiIiTWVyZ2VzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaW50byBjdXJyZW50IG1lc3NhZ2UuCisKKyAgICBUaGlzIG1ldGhvZCBtZXJnZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpbnRvIHRoZSBjdXJyZW50CisgICAgbWVzc2FnZS4gU2luZ3VsYXIgZmllbGRzIHRoYXQgYXJlIHNldCBpbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugb3ZlcndyaXRlCisgICAgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFJlcGVhdGVkIGZpZWxkcyBhcmUKKyAgICBhcHBlbmRlZC4gU2luZ3VsYXIgc3ViLW1lc3NhZ2VzIGFuZCBncm91cHMgYXJlIHJlY3Vyc2l2ZWx5IG1lcmdlZC4KKworICAgIEFyZ3M6CisgICAgICBvdGhlcl9tc2c6IE1lc3NhZ2UgdG8gbWVyZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgQ29weUZyb20oc2VsZiwgb3RoZXJfbXNnKToKKyAgICAiIiJDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4KKworICAgIFRoZSBtZXRob2QgY2xlYXJzIHRoZSBjdXJyZW50IG1lc3NhZ2UgYW5kIHRoZW4gbWVyZ2VzIHRoZSBzcGVjaWZpZWQKKyAgICBtZXNzYWdlIHVzaW5nIE1lcmdlRnJvbS4KKworICAgIEFyZ3M6CisgICAgICBvdGhlcl9tc2c6IE1lc3NhZ2UgdG8gY29weSBpbnRvIHRoZSBjdXJyZW50IG9uZS4KKyAgICAiIiIKKyAgICBpZiBzZWxmIGlzIG90aGVyX21zZzoKKyAgICAgIHJldHVybgorICAgIHNlbGYuQ2xlYXIoKQorICAgIHNlbGYuTWVyZ2VGcm9tKG90aGVyX21zZykKKworICBkZWYgQ2xlYXIoc2VsZik6CisgICAgIiIiQ2xlYXJzIGFsbCBkYXRhIHRoYXQgd2FzIHNldCBpbiB0aGUgbWVzc2FnZS4iIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIFNldEluUGFyZW50KHNlbGYpOgorICAgICIiIk1hcmsgdGhpcyBhcyBwcmVzZW50IGluIHRoZSBwYXJlbnQuCisKKyAgICBUaGlzIG5vcm1hbGx5IGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIHlvdSBhc3NpZ24gYSBmaWVsZCBvZiBhCisgICAgc3ViLW1lc3NhZ2UsIGJ1dCBzb21ldGltZXMgeW91IHdhbnQgdG8gbWFrZSB0aGUgc3ViLW1lc3NhZ2UKKyAgICBwcmVzZW50IHdoaWxlIGtlZXBpbmcgaXQgZW1wdHkuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiB1c2luZyB0aGlzLAorICAgIHlvdSBtYXkgd2FudCB0byByZWNvbnNpZGVyIHlvdXIgZGVzaWduLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgSXNJbml0aWFsaXplZChzZWxmKToKKyAgICAiIiJDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIG1ldGhvZCByZXR1cm5zIFRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQgKGkuZS4gYWxsIG9mIGl0cworICAgICAgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAjIFRPRE8ocm9iaW5zb24pOiBNZXJnZUZyb21TdHJpbmcoKSBzaG91bGQgcHJvYmFibHkgcmV0dXJuIE5vbmUgYW5kIGJlCisgICMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYSBoZWxwZXIgdGhhdCByZXR1cm5zIHRoZSAjIG9mIGJ5dGVzIHJlYWQuICBPdXIKKyAgIyBkZXNlcmlhbGl6YXRpb24gcm91dGluZXMgd291bGQgdXNlIHRoZSBoZWxwZXIgd2hlbiByZWN1cnNpdmVseQorICAjIGRlc2VyaWFsaXppbmcsIGJ1dCB0aGUgZW5kIHVzZXIgd291bGQgYWxtb3N0IGFsd2F5cyBqdXN0IHdhbnQgdGhlIG5vLXJldHVybgorICAjIE1lcmdlRnJvbVN0cmluZygpLgorCisgIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6CisgICAgIiIiTWVyZ2VzIHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIGRhdGEgaW50byB0aGlzIG1lc3NhZ2UuCisKKyAgICBXaGVuIHdlIGZpbmQgYSBmaWVsZCBpbiB8c2VyaWFsaXplZHwgdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQKKyAgICBpbiB0aGlzIG1lc3NhZ2U6CisgICAgICAtIElmIGl0J3MgYSAicmVwZWF0ZWQiIGZpZWxkLCB3ZSBhcHBlbmQgdG8gdGhlIGVuZCBvZiBvdXIgbGlzdC4KKyAgICAgIC0gRWxzZSwgaWYgaXQncyBhIHNjYWxhciwgd2Ugb3ZlcndyaXRlIG91ciBmaWVsZC4KKyAgICAgIC0gRWxzZSwgKGl0J3MgYSBub25yZXBlYXRlZCBjb21wb3NpdGUpLCB3ZSByZWN1cnNpdmVseSBtZXJnZQorICAgICAgICBpbnRvIHRoZSBleGlzdGluZyBjb21wb3NpdGUuCisKKyAgICBUT0RPKHJvYmluc29uKTogRG9jdW1lbnQgaGFuZGxpbmcgb2YgdW5rbm93biBmaWVsZHMuCisKKyAgICBBcmdzOgorICAgICAgc2VyaWFsaXplZDogQW55IG9iamVjdCB0aGF0IGFsbG93cyB1cyB0byBjYWxsIGJ1ZmZlcihzZXJpYWxpemVkKQorICAgICAgICB0byBhY2Nlc3MgYSBzdHJpbmcgb2YgYnl0ZXMgdXNpbmcgdGhlIGJ1ZmZlciBpbnRlcmZhY2UuCisKKyAgICBUT0RPKHJvYmluc29uKTogV2hlbiB3ZSBzd2l0Y2ggdG8gYSBoZWxwZXIsIHRoaXMgd2lsbCByZXR1cm4gTm9uZS4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB8c2VyaWFsaXplZHwuCisgICAgICBGb3Igbm9uLWdyb3VwIG1lc3NhZ2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGxlbihzZXJpYWxpemVkKSwKKyAgICAgIGJ1dCBmb3IgbWVzc2FnZXMgd2hpY2ggYXJlIGFjdHVhbGx5IGdyb3VwcywgdGhpcyB3aWxsCisgICAgICBnZW5lcmFsbHkgYmUgbGVzcyB0aGFuIGxlbihzZXJpYWxpemVkKSwgc2luY2Ugd2UgbXVzdAorICAgICAgc3RvcCB3aGVuIHdlIHJlYWNoIGFuIEVORF9HUk9VUCB0YWcuICBOb3RlIHRoYXQgaWYKKyAgICAgIHdlICpkbyogc3RvcCBiZWNhdXNlIG9mIGFuIEVORF9HUk9VUCB0YWcsIHRoZSBudW1iZXIKKyAgICAgIG9mIGJ5dGVzIHJldHVybmVkIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJ5dGVzCisgICAgICBmb3IgdGhlIEVORF9HUk9VUCB0YWcgaW5mb3JtYXRpb24uCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBQYXJzZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6CisgICAgIiIiTGlrZSBNZXJnZUZyb21TdHJpbmcoKSwgZXhjZXB0IHdlIGNsZWFyIHRoZSBvYmplY3QgZmlyc3QuIiIiCisgICAgc2VsZi5DbGVhcigpCisgICAgc2VsZi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICBkZWYgU2VyaWFsaXplVG9TdHJpbmcoc2VsZik6CisgICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGlmIGFsbCBvZiB0aGUgcmVxdWlyZWQKKyAgICAgIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhcmUgc2V0IChpLmUuIHRoZSBtZXNzYWdlIGlzIGluaXRpYWxpemVkKS4KKworICAgIFJhaXNlczoKKyAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IgaWYgdGhlIG1lc3NhZ2UgaXNuJ3QgaW5pdGlhbGl6ZWQuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc2VsZik6CisgICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCisKKyAgICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIFNlcmlhbGl6ZVRvU3RyaW5nIGJ1dCBkb2Vzbid0IGNoZWNrIGlmIHRoZQorICAgIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcnRpYWwgbWVzc2FnZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgIyBUT0RPKHJvYmluc29uKTogRGVjaWRlIHdoZXRoZXIgd2UgbGlrZSB0aGVzZSBiZXR0ZXIKKyAgIyB0aGFuIGF1dG8tZ2VuZXJhdGVkIGhhc19mb28oKSBhbmQgY2xlYXJfZm9vKCkgbWV0aG9kcworICAjIG9uIHRoZSBpbnN0YW5jZXMgdGhlbXNlbHZlcy4gIFRoaXMgd2F5IGlzIGxlc3MgY29uc2lzdGVudAorICAjIHdpdGggQysrLCBidXQgaXQgbWFrZXMgcmVmbGVjdGlvbi10eXBlIGFjY2VzcyBlYXNpZXIgYW5kCisgICMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIG1hZ2ljYWxseSBhdXRvZ2VuZXJhdGVkIHRoaW5ncy4KKyAgIworICAjIFRPRE8ocm9iaW5zb24pOiBCZSBzdXJlIHRvIGRvY3VtZW50IChhbmQgdGVzdCkgZXhhY3RseQorICAjIHdoaWNoIGZpZWxkIG5hbWVzIGFyZSBhY2NlcHRlZCBoZXJlLiAgQXJlIHdlIGNhc2Utc2Vuc2l0aXZlPworICAjIFdoYXQgZG8gd2UgZG8gd2l0aCBmaWVsZHMgdGhhdCBzaGFyZSBuYW1lcyB3aXRoIFB5dGhvbiBrZXl3b3JkcworICAjIGxpa2UgJ2xhbWJkYScgYW5kICd5aWVsZCc/CisgICMKKyAgIyBubm9yd2l0eiBzYXlzOgorICAjICIiIgorICAjIFR5cGljYWxseSAoaW4gcHl0aG9uKSwgYW4gdW5kZXJzY29yZSBpcyBhcHBlbmRlZCB0byBuYW1lcyB0aGF0IGFyZQorICAjIGtleXdvcmRzLiBTbyB0aGV5IHdvdWxkIGJlY29tZSBsYW1iZGFfIG9yIHlpZWxkXy4KKyAgIyAiIiIKKyAgZGVmIExpc3RGaWVsZHMoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgKEZpZWxkRGVzY3JpcHRvciwgdmFsdWUpIHR1cGxlcyBmb3IgYWxsCisgICAgZmllbGRzIGluIHRoZSBtZXNzYWdlIHdoaWNoIGFyZSBub3QgZW1wdHkuICBBIHNpbmd1bGFyIGZpZWxkIGlzIG5vbi1lbXB0eQorICAgIGlmIEhhc0ZpZWxkKCkgd291bGQgcmV0dXJuIHRydWUsIGFuZCBhIHJlcGVhdGVkIGZpZWxkIGlzIG5vbi1lbXB0eSBpZgorICAgIGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50LiAgVGhlIGZpZWxkcyBhcmUgb3JkZXJlZCBieSBmaWVsZAorICAgIG51bWJlciIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgSGFzRmllbGQoc2VsZiwgZmllbGRfbmFtZSk6CisgICAgIiIiQ2hlY2tzIGlmIGEgY2VydGFpbiBmaWVsZCBpcyBzZXQgZm9yIHRoZSBtZXNzYWdlLiBOb3RlIGlmIHRoZQorICAgIGZpZWxkX25hbWUgaXMgbm90IGRlZmluZWQgaW4gdGhlIG1lc3NhZ2UgZGVzY3JpcHRvciwgVmFsdWVFcnJvciB3aWxsIGJlCisgICAgcmFpc2VkLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgQ2xlYXJGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIEhhc0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgQnl0ZVNpemUoc2VsZik6CisgICAgIiIiUmV0dXJucyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHRoaXMgbWVzc2FnZS4KKyAgICBSZWN1cnNpdmVseSBjYWxscyBCeXRlU2l6ZSgpIG9uIGFsbCBjb250YWluZWQgbWVzc2FnZXMuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBfU2V0TGlzdGVuZXIoc2VsZiwgbWVzc2FnZV9saXN0ZW5lcik6CisgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgdGhlIHByb3RvY29sIG1lc3NhZ2UgaW1wbGVtZW50YXRpb24uCisgICAgQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KKworICAgIFNldHMgYSBsaXN0ZW5lciB0aGF0IHRoaXMgbWVzc2FnZSB3aWxsIGNhbGwgb24gY2VydGFpbiBzdGF0ZSB0cmFuc2l0aW9ucy4KKworICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJlZ2lzdGVyIGJhY2stZWRnZXMgZnJvbSBjaGlsZHJlbiB0bworICAgIHBhcmVudHMgYXQgcnVudGltZSwgZm9yIHRoZSBwdXJwb3NlIG9mIHNldHRpbmcgImhhcyIgYml0cyBhbmQKKyAgICBieXRlLXNpemUtZGlydHkgYml0cyBpbiB0aGUgcGFyZW50IGFuZCBhbmNlc3RvciBvYmplY3RzIHdoZW5ldmVyIGEgY2hpbGQgb3IKKyAgICBkZXNjZW5kYW50IG9iamVjdCBpcyBtb2RpZmllZC4KKworICAgIElmIHRoZSBjbGllbnQgd2FudHMgdG8gZGlzY29ubmVjdCB0aGlzIE1lc3NhZ2UgZnJvbSB0aGUgb2JqZWN0IHRyZWUsIHNoZQorICAgIGV4cGxpY2l0bHkgc2V0cyBjYWxsYmFjayB0byBOb25lLgorCisgICAgSWYgbWVzc2FnZV9saXN0ZW5lciBpcyBOb25lLCB1bnJlZ2lzdGVycyBhbnkgZXhpc3RpbmcgbGlzdGVuZXIuICBPdGhlcndpc2UsCisgICAgbWVzc2FnZV9saXN0ZW5lciBtdXN0IGltcGxlbWVudCB0aGUgTWVzc2FnZUxpc3RlbmVyIGludGVyZmFjZSBpbgorICAgIGludGVybmFsL21lc3NhZ2VfbGlzdGVuZXIucHksIGFuZCB3ZSBkaXNjYXJkIGFueSBsaXN0ZW5lciByZWdpc3RlcmVkCisgICAgdmlhIGEgcHJldmlvdXMgX1NldExpc3RlbmVyKCkgY2FsbC4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAiIiJTdXBwb3J0IHRoZSBwaWNrbGUgcHJvdG9jb2wuIiIiCisgICAgcmV0dXJuIGRpY3Qoc2VyaWFsaXplZD1zZWxmLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpKQorCisgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICIiIlN1cHBvcnQgdGhlIHBpY2tsZSBwcm90b2NvbC4iIiIKKyAgICBzZWxmLl9faW5pdF9fKCkKKyAgICBzZWxmLlBhcnNlRnJvbVN0cmluZyhzdGF0ZVsnc2VyaWFsaXplZCddKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfZmFjdG9yeS5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2ZhY3RvcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlMmZlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2ZhY3RvcnkucHkKQEAgLTAsMCArMSwxMTMgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJQcm92aWRlcyBhIGZhY3RvcnkgY2xhc3MgZm9yIGdlbmVyYXRpbmcgZHluYW1pYyBtZXNzYWdlcy4iIiIKKworX19hdXRob3JfXyA9ICdtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpJworCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9kYXRhYmFzZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uCisKKworY2xhc3MgTWVzc2FnZUZhY3Rvcnkob2JqZWN0KToKKyAgIiIiRmFjdG9yeSBmb3IgY3JlYXRpbmcgUHJvdG8yIG1lc3NhZ2VzIGZyb20gZGVzY3JpcHRvcnMgaW4gYSBwb29sLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAiIiJJbml0aWFsaXplcyBhIG5ldyBmYWN0b3J5LiIiIgorICAgIHNlbGYuX2NsYXNzZXMgPSB7fQorCisgIGRlZiBHZXRQcm90b3R5cGUoc2VsZiwgZGVzY3JpcHRvcik6CisgICAgIiIiQnVpbGRzIGEgcHJvdG8yIG1lc3NhZ2UgY2xhc3MgYmFzZWQgb24gdGhlIHBhc3NlZCBpbiBkZXNjcmlwdG9yLgorCisgICAgUGFzc2luZyBhIGRlc2NyaXB0b3Igd2l0aCBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG1hdGNoaW5nIGEgcHJldmlvdXMKKyAgICBpbnZvY2F0aW9uIHdpbGwgY2F1c2UgdGhlIHNhbWUgY2xhc3MgdG8gYmUgcmV0dXJuZWQuCisKKyAgICBBcmdzOgorICAgICAgZGVzY3JpcHRvcjogVGhlIGRlc2NyaXB0b3IgdG8gYnVpbGQgZnJvbS4KKworICAgIFJldHVybnM6CisgICAgICBBIGNsYXNzIGRlc2NyaWJpbmcgdGhlIHBhc3NlZCBpbiBkZXNjcmlwdG9yLgorICAgICIiIgorCisgICAgaWYgZGVzY3JpcHRvci5mdWxsX25hbWUgbm90IGluIHNlbGYuX2NsYXNzZXM6CisgICAgICByZXN1bHRfY2xhc3MgPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoCisgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLmVuY29kZSgnYXNjaWknLCAnaWdub3JlJyksCisgICAgICAgICAgKG1lc3NhZ2UuTWVzc2FnZSwpLAorICAgICAgICAgIHsnREVTQ1JJUFRPUic6IGRlc2NyaXB0b3J9KQorICAgICAgc2VsZi5fY2xhc3Nlc1tkZXNjcmlwdG9yLmZ1bGxfbmFtZV0gPSByZXN1bHRfY2xhc3MKKyAgICAgIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKKyAgICAgICAgaWYgZmllbGQubWVzc2FnZV90eXBlOgorICAgICAgICAgIHNlbGYuR2V0UHJvdG90eXBlKGZpZWxkLm1lc3NhZ2VfdHlwZSkKKyAgICByZXR1cm4gc2VsZi5fY2xhc3Nlc1tkZXNjcmlwdG9yLmZ1bGxfbmFtZV0KKworCitfREIgPSBkZXNjcmlwdG9yX2RhdGFiYXNlLkRlc2NyaXB0b3JEYXRhYmFzZSgpCitfUE9PTCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbChfREIpCitfRkFDVE9SWSA9IE1lc3NhZ2VGYWN0b3J5KCkKKworCitkZWYgR2V0TWVzc2FnZXMoZmlsZV9wcm90b3MpOgorICAiIiJCdWlsZHMgYSBkaWN0aW9uYXJ5IG9mIGFsbCB0aGUgbWVzc2FnZXMgYXZhaWxhYmxlIGluIGEgc2V0IG9mIGZpbGVzLgorCisgIEFyZ3M6CisgICAgZmlsZV9wcm90b3M6IEEgc2VxdWVuY2Ugb2YgZmlsZSBwcm90b3MgdG8gYnVpbGQgbWVzc2FnZXMgb3V0IG9mLgorCisgIFJldHVybnM6CisgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIHRoZSBtZXNzYWdlIHR5cGVzIGluIHRoZSBmaWxlcyBtYXBwaW5nIHRoZQorICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHRvIGEgTWVzc2FnZSBzdWJjbGFzcyBmb3IgdGhlIGRlc2NyaXB0b3IuCisgICIiIgorCisgIHJlc3VsdCA9IHt9CisgIGZvciBmaWxlX3Byb3RvIGluIGZpbGVfcHJvdG9zOgorICAgIF9EQi5BZGQoZmlsZV9wcm90bykKKyAgZm9yIGZpbGVfcHJvdG8gaW4gZmlsZV9wcm90b3M6CisgICAgZm9yIGRlc2MgaW4gX0dldEFsbERlc2NyaXB0b3JzKGZpbGVfcHJvdG8ubWVzc2FnZV90eXBlLCBmaWxlX3Byb3RvLnBhY2thZ2UpOgorICAgICAgcmVzdWx0W2Rlc2MuZnVsbF9uYW1lXSA9IF9GQUNUT1JZLkdldFByb3RvdHlwZShkZXNjKQorICByZXR1cm4gcmVzdWx0CisKKworZGVmIF9HZXRBbGxEZXNjcmlwdG9ycyhkZXNjX3Byb3RvcywgcGFja2FnZSk6CisgICIiIkdldHMgYWxsIGxldmVscyBvZiBuZXN0ZWQgbWVzc2FnZSB0eXBlcyBhcyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGRlc2NyaXB0b3JzLgorCisgIEFyZ3M6CisgICAgZGVzY19wcm90b3M6IFRoZSBkZXNjcmlwdG9yIHByb3RvcyB0byBwcm9jZXNzLgorICAgIHBhY2thZ2U6IFRoZSBwYWNrYWdlIHdoZXJlIHRoZSBwcm90b3MgYXJlIGRlZmluZWQuCisKKyAgWWllbGRzOgorICAgIEVhY2ggbWVzc2FnZSBkZXNjcmlwdG9yIGZvciBlYWNoIG5lc3RlZCB0eXBlLgorICAiIiIKKworICBmb3IgZGVzY19wcm90byBpbiBkZXNjX3Byb3RvczoKKyAgICBuYW1lID0gJy4nLmpvaW4oKHBhY2thZ2UsIGRlc2NfcHJvdG8ubmFtZSkpCisgICAgeWllbGQgX1BPT0wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKG5hbWUpCisgICAgZm9yIG5lc3RlZF9kZXNjIGluIF9HZXRBbGxEZXNjcmlwdG9ycyhkZXNjX3Byb3RvLm5lc3RlZF90eXBlLCBuYW1lKToKKyAgICAgIHlpZWxkIG5lc3RlZF9kZXNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLXByb3RvMi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24tcHJvdG8yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYmI3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLXByb3RvMi5jYwpAQCAtMCwwICsxLDE3MTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KQorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5oPgorCisvKiBJcyA2NGJpdCAqLworI2RlZmluZSBJU182NEJJVCAoU0laRU9GX0xPTkcgPT0gOCkKKworI2RlZmluZSBGSUVMRF9CRUxPTkdTX1RPX01FU1NBR0UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkgXAorICAgICgobWVzc2FnZSktPkdldERlc2NyaXB0b3IoKSA9PSAoZmllbGRfZGVzY3JpcHRvciktPmNvbnRhaW5pbmdfdHlwZSgpKQorCisjZGVmaW5lIEZJRUxEX0lTX1JFUEVBVEVEKGZpZWxkX2Rlc2NyaXB0b3IpICAgICAgICAgICAgICAgICBcCisgICAgKChmaWVsZF9kZXNjcmlwdG9yKS0+bGFiZWwoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKQorCisjZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDMyIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghQ2hlY2tBbmRHZXRJbnRlZ2VyKGFyZywgJnZhbHVlLCBraW50MzJtaW5fcHksIGtpbnQzMm1heF9weSkpIHsgXAorICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSwga2ludDY0bWluX3B5LCBraW50NjRtYXhfcHkpKSB7IFwKKyAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9VSU5UMzIoYXJnLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFDaGVja0FuZEdldEludGVnZXIoYXJnLCAmdmFsdWUsIGtQeXRob25aZXJvLCBrdWludDMybWF4X3B5KSkgeyBcCisgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfVUlOVDY0KGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ2NCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghQ2hlY2tBbmRHZXRJbnRlZ2VyKGFyZywgJnZhbHVlLCBrUHl0aG9uWmVybywga3VpbnQ2NG1heF9weSkpIHsgXAorICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUNoZWNrQW5kR2V0RmxvYXQoYXJnLCAmdmFsdWUpKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0RPVUJMRShhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3VibGUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUNoZWNrQW5kR2V0RG91YmxlKGFyZywgJnZhbHVlKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9CT09MKGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFDaGVja0FuZEdldEJvb2woYXJnLCAmdmFsdWUpKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEMoc3RyKSBjb25zdF9jYXN0PGNoYXIqPihzdHIpCisKKy8vIC0tLSBHbG9iYWxzOgorCisvLyBDb25zdGFudHMgdXNlZCBmb3IgaW50ZWdlciB0eXBlIHJhbmdlIGNoZWNraW5nLgorc3RhdGljIFB5T2JqZWN0KiBrUHl0aG9uWmVybzsKK3N0YXRpYyBQeU9iamVjdCoga2ludDMybWluX3B5Oworc3RhdGljIFB5T2JqZWN0KiBraW50MzJtYXhfcHk7CitzdGF0aWMgUHlPYmplY3QqIGt1aW50MzJtYXhfcHk7CitzdGF0aWMgUHlPYmplY3QqIGtpbnQ2NG1pbl9weTsKK3N0YXRpYyBQeU9iamVjdCoga2ludDY0bWF4X3B5Oworc3RhdGljIFB5T2JqZWN0KiBrdWludDY0bWF4X3B5OworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworLy8gLS0tIFN1cHBvcnQgUm91dGluZXM6CisKK3N0YXRpYyB2b2lkIEFkZENvbnN0YW50cyhQeU9iamVjdCogbW9kdWxlKSB7CisgIHN0cnVjdCBOYW1lVmFsdWUgeworICAgIGNoYXIqIG5hbWU7CisgICAgaW50MzIgdmFsdWU7CisgIH0gY29uc3RhbnRzW10gPSB7CisgICAgLy8gTGFiZWxzOgorICAgIHsiTEFCRUxfT1BUSU9OQUwiLCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMfSwKKyAgICB7IkxBQkVMX1JFUVVJUkVEIiwgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVFVSVJFRH0sCisgICAgeyJMQUJFTF9SRVBFQVRFRCIsIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUR9LAorICAgIC8vIENQUCB0eXBlczoKKyAgICB7IkNQUFRZUEVfTUVTU0FHRSIsIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFfSwKKyAgICAvLyBGaWVsZCBUeXBlczoKKyAgICB7IlRZUEVfTUVTU0FHRSIsIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFfSwKKyAgICAvLyBFbmQuCisgICAge05VTEwsIDB9CisgIH07CisKKyAgZm9yIChOYW1lVmFsdWUqIGNvbnN0YW50ID0gY29uc3RhbnRzOworICAgICAgIGNvbnN0YW50LT5uYW1lICE9IE5VTEw7IGNvbnN0YW50KyspIHsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIGNvbnN0YW50LT5uYW1lLCBjb25zdGFudC0+dmFsdWUpOworICB9Cit9CisKKy8vIC0tLSBDTWVzc2FnZSBDdXN0b20gVHlwZToKKworLy8gLS0tLS0tIFR5cGUgRm9yd2FyZCBEZWNsYXJhdGlvbjoKKworc3RydWN0IENNZXNzYWdlOworc3RydWN0IENNZXNzYWdlX1R5cGU7CisKK3N0YXRpYyB2b2lkIENNZXNzYWdlRGVhbGxvYyhDTWVzc2FnZSogc2VsZik7CitzdGF0aWMgaW50IENNZXNzYWdlSW5pdChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VTdHIoQ01lc3NhZ2UqIHNlbGYpOworCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQWRkUmVwZWF0ZWRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQXNzaWduUmVwZWF0ZWRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQnl0ZVNpemUoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ2xlYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ2xlYXJGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9DbGVhckZpZWxkQnlEZXNjcmlwdG9yKAorICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NvcHlGcm9tKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0RlYnVnU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0RlbGV0ZVJlcGVhdGVkRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfRXF1YWxzKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0ZpZWxkTGVuZ3RoKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0ZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhDTWVzc2FnZSogc2VsZik7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0dldFJlcGVhdGVkTWVzc2FnZShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRSZXBlYXRlZFNjYWxhcihDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfSGFzRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfSGFzRmllbGRCeURlc2NyaXB0b3IoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfSXNJbml0aWFsaXplZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9MaXN0RmllbGRzKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX01lcmdlRnJvbShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9NZXJnZUZyb21TdHJpbmcoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTXV0YWJsZU1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTmV3U3ViTWVzc2FnZShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9TZXRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKAorICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NlcmlhbGl6ZVRvU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NldEluUGFyZW50KENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1N3YXBSZXBlYXRlZEZpZWxkRWxlbWVudHMoCisgICAgQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKKworLy8gLS0tLS0tIE9iamVjdCBEZWZpbml0aW9uOgorCit0eXBlZGVmIHN0cnVjdCBDTWVzc2FnZSB7CisgIFB5T2JqZWN0X0hFQUQKKworICBzdHJ1Y3QgQ01lc3NhZ2UqIHBhcmVudDsgIC8vIE5VTEwgaWYgd2Fzbid0IGNyZWF0ZWQgZnJvbSBhbm90aGVyIG1lc3NhZ2UuCisgIENGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZDsKKyAgY29uc3QgY2hhciogZnVsbF9uYW1lOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlOworICBib29sIGZyZWVfbWVzc2FnZTsKKyAgYm9vbCByZWFkX29ubHk7Cit9IENNZXNzYWdlOworCisvLyAtLS0tLS0gTWV0aG9kIFRhYmxlOgorCisjZGVmaW5lIENNRVRIT0QobmFtZSwgYXJncywgZG9jKSAgIFwKKyAgeyBDKCNuYW1lKSwgKFB5Q0Z1bmN0aW9uKUNNZXNzYWdlXyMjbmFtZSwgYXJncywgQyhkb2MpIH0KK3N0YXRpYyBQeU1ldGhvZERlZiBDTWVzc2FnZU1ldGhvZHNbXSA9IHsKKyAgQ01FVEhPRChBZGRNZXNzYWdlLCBNRVRIX08sCisgICAgICAgICAgIkFkZHMgYSBuZXcgbWVzc2FnZSB0byBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4iKSwKKyAgQ01FVEhPRChBZGRSZXBlYXRlZFNjYWxhciwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICJBZGRzIGEgc2NhbGFyIHRvIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLiIpLAorICBDTUVUSE9EKEFzc2lnblJlcGVhdGVkU2NhbGFyLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgIkNsZWFycyBhbmQgc2V0cyB0aGUgdmFsdWVzIG9mIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLiIpLAorICBDTUVUSE9EKEJ5dGVTaXplLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAiUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBpbiBieXRlcy4iKSwKKyAgQ01FVEhPRChDbGVhciwgTUVUSF9PLAorICAgICAgICAgICJDbGVhcnMgYSBwcm90b2NvbCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKENsZWFyRmllbGQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiQ2xlYXJzIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBieSBuYW1lLiIpLAorICBDTUVUSE9EKENsZWFyRmllbGRCeURlc2NyaXB0b3IsIE1FVEhfTywKKyAgICAgICAgICAiQ2xlYXJzIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBieSBkZXNjcmlwdG9yLiIpLAorICBDTUVUSE9EKENvcHlGcm9tLCBNRVRIX08sCisgICAgICAgICAgIkNvcGllcyBhIHByb3RvY29sIG1lc3NhZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKERlYnVnU3RyaW5nLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAiUmV0dXJucyB0aGUgZGVidWcgc3RyaW5nIG9mIGEgcHJvdG9jb2wgbWVzc2FnZS4iKSwKKyAgQ01FVEhPRChEZWxldGVSZXBlYXRlZEZpZWxkLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgIkRlbGV0ZXMgYSBzbGljZSBvZiB2YWx1ZXMgZnJvbSBhIHJlcGVhdGVkIGZpZWxkLiIpLAorICBDTUVUSE9EKEVxdWFscywgTUVUSF9PLAorICAgICAgICAgICJDaGVja3MgaWYgdHdvIHByb3RvY29sIG1lc3NhZ2VzIGFyZSBlcXVhbCAoYnkgaWRlbnRpdHkpLiIpLAorICBDTUVUSE9EKEZpZWxkTGVuZ3RoLCBNRVRIX08sCisgICAgICAgICAgIlJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGZpZWxkLiIpLAorICBDTUVUSE9EKEZpbmRJbml0aWFsaXphdGlvbkVycm9ycywgTUVUSF9OT0FSR1MsCisgICAgICAgICAgIlJldHVybnMgdGhlIGluaXRpYWxpemF0aW9uIGVycm9ycyBvZiBhIG1lc3NhZ2UuIiksCisgIENNRVRIT0QoR2V0UmVwZWF0ZWRNZXNzYWdlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgIlJldHVybnMgYSBtZXNzYWdlIGZyb20gYSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiksCisgIENNRVRIT0QoR2V0UmVwZWF0ZWRTY2FsYXIsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiUmV0dXJucyBhIHNjYWxhciB2YWx1ZSBmcm9tIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLiIpLAorICBDTUVUSE9EKEdldFNjYWxhciwgTUVUSF9PLAorICAgICAgICAgICJSZXR1cm5zIHRoZSBzY2FsYXIgdmFsdWUgb2YgYSBmaWVsZC4iKSwKKyAgQ01FVEhPRChIYXNGaWVsZCwgTUVUSF9PLAorICAgICAgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldC4iKSwKKyAgQ01FVEhPRChIYXNGaWVsZEJ5RGVzY3JpcHRvciwgTUVUSF9PLAorICAgICAgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldCBieSBnaXZlbiBpdHMgZGVzY3JpcHRvciIpLAorICBDTUVUSE9EKElzSW5pdGlhbGl6ZWQsIE1FVEhfTk9BUkdTLAorICAgICAgICAgICJDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBvZiBhIHByb3RvY29sIG1lc3NhZ2UgYXJlIHNldC4iKSwKKyAgQ01FVEhPRChMaXN0RmllbGRzLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAiTGlzdHMgYWxsIHNldCBmaWVsZHMgb2YgYSBtZXNzYWdlLiIpLAorICBDTUVUSE9EKE1lcmdlRnJvbSwgTUVUSF9PLAorICAgICAgICAgICJNZXJnZXMgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iKSwKKyAgQ01FVEhPRChNZXJnZUZyb21TdHJpbmcsIE1FVEhfTywKKyAgICAgICAgICAiTWVyZ2VzIGEgc2VyaWFsaXplZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iKSwKKyAgQ01FVEhPRChNdXRhYmxlTWVzc2FnZSwgTUVUSF9PLAorICAgICAgICAgICJSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIGEgbmVzdGVkIHByb3RvY29sIG1lc3NhZ2UuIiksCisgIENNRVRIT0QoTmV3U3ViTWVzc2FnZSwgTUVUSF9PLAorICAgICAgICAgICJDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHl0aG9uIG1lc3NhZ2UgZ2l2ZW4gdGhlIGRlc2NyaXB0b3Igb2YgYSAiCisgICAgICAgICAgImNvbXBvc2l0ZSBmaWVsZCBvZiB0aGUgY3VycmVudCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKFNldFNjYWxhciwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICJTZXRzIHRoZSB2YWx1ZSBvZiBhIHNpbmd1bGFyIHNjYWxhciBmaWVsZC4iKSwKKyAgQ01FVEhPRChTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZywgZXZlbiBpZiBpdCBpc24ndCBpbml0aWFsaXplZC4iKSwKKyAgQ01FVEhPRChTZXJpYWxpemVUb1N0cmluZywgTUVUSF9OT0FSR1MsCisgICAgICAgICAgIlNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBzdHJpbmcsIG9ubHkgZm9yIGluaXRpYWxpemVkIG1lc3NhZ2VzLiIpLAorICBDTUVUSE9EKFNldEluUGFyZW50LCBNRVRIX05PQVJHUywKKyAgICAgICAgICAiU2V0cyB0aGUgaGFzIGJpdCBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gaXRzIHBhcmVudCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKFN3YXBSZXBlYXRlZEZpZWxkRWxlbWVudHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiU3dhcHMgdGhlIGVsZW1lbnRzIGluIHR3byBwb3NpdGlvbnMgaW4gYSByZXBlYXRlZCBmaWVsZC4iKSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisjdW5kZWYgQ01FVEhPRAorCitzdGF0aWMgUHlNZW1iZXJEZWYgQ01lc3NhZ2VNZW1iZXJzW10gPSB7CisgIHsgQygiZnVsbF9uYW1lIiksIFRfU1RSSU5HLCBvZmZzZXRvZihDTWVzc2FnZSwgZnVsbF9uYW1lKSwgMCwgIkZ1bGwgbmFtZSIgfSwKKyAgeyBOVUxMIH0KK307CisKKy8vIC0tLS0tLSBUeXBlIERlZmluaXRpb246CisKKy8vIFRoZSBkZWZpbml0aW9uIGZvciB0aGUgdHlwZSBvYmplY3QgdGhhdCBjYXB0dXJlcyB0aGUgdHlwZSBvZiBDTWVzc2FnZQorLy8gaW4gUHl0aG9uLgorUHlUeXBlT2JqZWN0IENNZXNzYWdlX1R5cGUgPSB7CisgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgIDAsCisgIEMoImdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC4iCisgICAgIl9uZXRfcHJvdG8yX19fcHl0aG9uLiIKKyAgICAiQ01lc3NhZ2UiKSwgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX25hbWUKKyAgc2l6ZW9mKENNZXNzYWdlKSwgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNpY3NpemUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQorICAoZGVzdHJ1Y3RvcilDTWVzc2FnZURlYWxsb2MsICAgICAgICAgLy8gIHRwX2RlYWxsb2MKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9wcmludAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY29tcGFyZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3JlcHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19udW1iZXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19zZXF1ZW5jZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX21hcHBpbmcKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9oYXNoCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2FsbAorICAocmVwcmZ1bmMpQ01lc3NhZ2VTdHIsICAgICAgICAgICAgICAgLy8gIHRwX3N0cgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHJvCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cm8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKKyAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgIC8vICB0cF9mbGFncworICBDKCJBIFByb3RvY29sTWVzc2FnZSIpLCAgICAgICAgICAgICAgLy8gIHRwX2RvYworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2xlYXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yaWNoY29tcGFyZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXJuZXh0CisgIENNZXNzYWdlTWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWV0aG9kcworICBDTWVzc2FnZU1lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21lbWJlcnMKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRzZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX2dldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3RvZmZzZXQKKyAgKGluaXRwcm9jKUNNZXNzYWdlSW5pdCwgICAgICAgICAgICAgIC8vICB0cF9pbml0CisgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAvLyAgdHBfYWxsb2MKKyAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgIC8vICB0cF9uZXcKKyAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9mcmVlCit9OworCisvLyAtLS0tLS0gSGVscGVyIEZ1bmN0aW9uczoKKworc3RhdGljIHZvaWQgRm9ybWF0VHlwZUVycm9yKFB5T2JqZWN0KiBhcmcsIGNoYXIqIGV4cGVjdGVkX3R5cGVzKSB7CisgIFB5T2JqZWN0KiByZXByID0gUHlPYmplY3RfUmVwcihhcmcpOworICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgIiUuMTAwcyBoYXMgdHlwZSAlLjEwMHMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzIiwKKyAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZXByKSwKKyAgICAgICAgICAgICAgIGFyZy0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgIGV4cGVjdGVkX3R5cGVzKTsKKyAgUHlfREVDUkVGKHJlcHIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0YXRpYyBib29sIENoZWNrQW5kR2V0SW50ZWdlcigKKyAgICBQeU9iamVjdCogYXJnLCBUKiB2YWx1ZSwgUHlPYmplY3QqIG1pbiwgUHlPYmplY3QqIG1heCkgeworICBib29sIGlzX2xvbmcgPSBQeUxvbmdfQ2hlY2soYXJnKTsKKyAgaWYgKCFQeUludF9DaGVjayhhcmcpICYmICFpc19sb25nKSB7CisgICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImludCwgbG9uZyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChQeU9iamVjdF9Db21wYXJlKG1pbiwgYXJnKSA+IDAgfHwgUHlPYmplY3RfQ29tcGFyZShtYXgsIGFyZykgPCAwKSB7CisgICAgUHlPYmplY3QqIHMgPSBQeU9iamVjdF9TdHIoYXJnKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlZhbHVlIG91dCBvZiByYW5nZTogJXMiLAorICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocykpOworICAgIFB5X0RFQ1JFRihzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGlzX2xvbmcpIHsKKyAgICBpZiAobWluID09IGtQeXRob25aZXJvKSB7CisgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKGFyZykpOworICAgIH0gZWxzZSB7CisgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNMb25nTG9uZyhhcmcpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8VD4oUHlJbnRfQXNMb25nKGFyZykpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDaGVja0FuZEdldERvdWJsZShQeU9iamVjdCogYXJnLCBkb3VibGUqIHZhbHVlKSB7CisgIGlmICghUHlJbnRfQ2hlY2soYXJnKSAmJiAhUHlMb25nX0NoZWNrKGFyZykgJiYKKyAgICAgICFQeUZsb2F0X0NoZWNrKGFyZykpIHsKKyAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBsb25nLCBmbG9hdCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAqdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDaGVja0FuZEdldEZsb2F0KFB5T2JqZWN0KiBhcmcsIGZsb2F0KiB2YWx1ZSkgeworICBkb3VibGUgZG91YmxlX3ZhbHVlOworICBpZiAoIUNoZWNrQW5kR2V0RG91YmxlKGFyZywgJmRvdWJsZV92YWx1ZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvdWJsZV92YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDaGVja0FuZEdldEJvb2woUHlPYmplY3QqIGFyZywgYm9vbCogdmFsdWUpIHsKKyAgaWYgKCFQeUludF9DaGVjayhhcmcpICYmICFQeUJvb2xfQ2hlY2soYXJnKSAmJiAhUHlMb25nX0NoZWNrKGFyZykpIHsKKyAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBsb25nLCBib29sIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGJvb2w+KFB5SW50X0FzTG9uZyhhcmcpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2dvb2dsZTo6cHJvdG9idWY6OkR5bmFtaWNNZXNzYWdlRmFjdG9yeSogZ2xvYmFsX21lc3NhZ2VfZmFjdG9yeSA9IE5VTEw7CitzdGF0aWMgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogQ3JlYXRlTWVzc2FnZShjb25zdCBjaGFyKiBtZXNzYWdlX3R5cGUpIHsKKyAgc3RyaW5nIG1lc3NhZ2VfbmFtZShtZXNzYWdlX3R5cGUpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0KKyAgICAgIEdldERlc2NyaXB0b3JQb29sKCktPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShtZXNzYWdlX25hbWUpOworICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGdsb2JhbF9tZXNzYWdlX2ZhY3RvcnktPkdldFByb3RvdHlwZShkZXNjcmlwdG9yKTsKK30KKworc3RhdGljIHZvaWQgUmVsZWFzZVN1Yk1lc3NhZ2UoZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENNZXNzYWdlKiBjaGlsZF9jbWVzc2FnZSkgeworICBNZXNzYWdlKiByZWxlYXNlZF9tZXNzYWdlID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGdsb2JhbF9tZXNzYWdlX2ZhY3RvcnkpOworICBHT09HTEVfRENIRUNLKGNoaWxkX2NtZXNzYWdlLT5tZXNzYWdlICE9IE5VTEwpOworICAvLyBSZWxlYXNlTWVzc2FnZSB3aWxsIHJldHVybiBOVUxMIHdoaWNoIGRpZmZlcnMgZnJvbQorICAvLyBjaGlsZF9jbWVzc2FnZS0+bWVzc2FnZSwgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0LiAgSW4gdGhpcyBjYXNlLAorICAvLyB0aGUgbGF0dGVyIHBvaW50cyB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZSB2aWEgYSBjb25zdF9jYXN0PD4sIHNvIHdlCisgIC8vIGhhdmUgdG8gcmVzZXQgaXQgdG8gYSBuZXcgbXV0YWJsZSBvYmplY3Qgc2luY2Ugd2UgYXJlIHRha2luZyBvd25lcnNoaXAuCisgIGlmIChyZWxlYXNlZF9tZXNzYWdlID09IE5VTEwpIHsKKyAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUgPSBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5LT5HZXRQcm90b3R5cGUoCisgICAgICAgIGNoaWxkX2NtZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpOworICAgIEdPT0dMRV9EQ0hFQ0socHJvdG90eXBlICE9IE5VTEwpOworICAgIGNoaWxkX2NtZXNzYWdlLT5tZXNzYWdlID0gcHJvdG90eXBlLT5OZXcoKTsKKyAgfQorICBjaGlsZF9jbWVzc2FnZS0+cGFyZW50ID0gTlVMTDsKKyAgY2hpbGRfY21lc3NhZ2UtPnBhcmVudF9maWVsZCA9IE5VTEw7CisgIGNoaWxkX2NtZXNzYWdlLT5mcmVlX21lc3NhZ2UgPSB0cnVlOworICBjaGlsZF9jbWVzc2FnZS0+cmVhZF9vbmx5ID0gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIENoZWNrQW5kU2V0U3RyaW5nKAorICAgIFB5T2JqZWN0KiBhcmcsIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgYm9vbCBhcHBlbmQsCisgICAgaW50IGluZGV4KSB7CisgIEdPT0dMRV9EQ0hFQ0soZGVzY3JpcHRvci0+dHlwZSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgfHwKKyAgICAgICAgIGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpOworICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGFyZykgJiYgIVB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAic3RyLCB1bmljb2RlIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgIFB5T2JqZWN0KiB1bmljb2RlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KGFyZywgImFzY2lpIiwgTlVMTCk7CisgICAgICBpZiAodW5pY29kZSA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0KiByZXByID0gUHlPYmplY3RfUmVwcihhcmcpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcyBoYXMgdHlwZSBzdHIsIGJ1dCBpc24ndCBpbiA3LWJpdCBBU0NJSSAiCisgICAgICAgICAgICAgICAgICAgICAiZW5jb2RpbmcuIE5vbi1BU0NJSSBzdHJpbmdzIG11c3QgYmUgY29udmVydGVkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlIG9iamVjdHMgYmVmb3JlIGJlaW5nIGFkZGVkLiIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVwcikpOworICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAic3RyIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgUHlPYmplY3QqIGVuY29kZWRfc3RyaW5nID0gTlVMTDsKKyAgaWYgKGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgIGVuY29kZWRfc3RyaW5nID0gUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0KGFyZywgInV0Zi04IiwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVuY29kZWRfc3RyaW5nID0gUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdChhcmcsICJ1dGYtOCIsIE5VTEwpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBJbiB0aGlzIGNhc2UgZmllbGQgdHlwZSBpcyAiYnl0ZXMiLgorICAgIGVuY29kZWRfc3RyaW5nID0gYXJnOworICAgIFB5X0lOQ1JFRihlbmNvZGVkX3N0cmluZyk7CisgIH0KKworICBpZiAoZW5jb2RlZF9zdHJpbmcgPT0gTlVMTCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNoYXIqIHZhbHVlOworICBQeV9zc2l6ZV90IHZhbHVlX2xlbjsKKyAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShlbmNvZGVkX3N0cmluZywgJnZhbHVlLCAmdmFsdWVfbGVuKSA8IDApIHsKKyAgICBQeV9ERUNSRUYoZW5jb2RlZF9zdHJpbmcpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0cmluZyB2YWx1ZV9zdHJpbmcodmFsdWUsIHZhbHVlX2xlbik7CisgIGlmIChhcHBlbmQpIHsKKyAgICByZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgZGVzY3JpcHRvciwgdmFsdWVfc3RyaW5nKTsKKyAgfSBlbHNlIGlmIChpbmRleCA8IDApIHsKKyAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZGVzY3JpcHRvciwgdmFsdWVfc3RyaW5nKTsKKyAgfSBlbHNlIHsKKyAgICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCBpbmRleCwgdmFsdWVfc3RyaW5nKTsKKyAgfQorICBQeV9ERUNSRUYoZW5jb2RlZF9zdHJpbmcpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBUb1N0cmluZ09iamVjdCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIHN0cmluZyB2YWx1ZSkgeworICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpICE9IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsdWUuY19zdHIoKSwgdmFsdWUubGVuZ3RoKCkpOworICB9CisKKyAgUHlPYmplY3QqIHJlc3VsdCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHZhbHVlLmNfc3RyKCksIHZhbHVlLmxlbmd0aCgpLCBOVUxMKTsKKyAgLy8gSWYgdGhlIHN0cmluZyBjYW4ndCBiZSBkZWNvZGVkIGluIFVURi04LCBqdXN0IHJldHVybiBhIHN0cmluZyBvYmplY3QgdGhhdAorICAvLyBjb250YWlucyB0aGUgcmF3IGJ5dGVzLiBUaGlzIGNhbid0IGhhcHBlbiBpZiB0aGUgdmFsdWUgd2FzIGFzc2lnbmVkIHVzaW5nCisgIC8vIHRoZSBtZW1iZXJzIG9mIHRoZSBQeXRob24gbWVzc2FnZSBvYmplY3QsIGJ1dCBjYW4gaGFwcGVuIGlmIHRoZSB2YWx1ZXMgd2VyZQorICAvLyBwYXJzZWQgZnJvbSB0aGUgd2lyZSAoYmluYXJ5KS4KKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWx1ZS5jX3N0cigpLCB2YWx1ZS5sZW5ndGgoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgQXNzdXJlV3JpdGFibGUoQ01lc3NhZ2UqIHNlbGYpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCB8fAorICAgICAgc2VsZi0+cGFyZW50ID09IE5VTEwgfHwKKyAgICAgIHNlbGYtPnBhcmVudF9maWVsZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFzZWxmLT5yZWFkX29ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpOworCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5wYXJlbnQtPm1lc3NhZ2U7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHNlbGYtPm1lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZC0+ZGVzY3JpcHRvciwgZ2xvYmFsX21lc3NhZ2VfZmFjdG9yeSk7CisgIHNlbGYtPnJlYWRfb25seSA9IGZhbHNlOworfQorCitzdGF0aWMgUHlPYmplY3QqIEludGVybmFsR2V0U2NhbGFyKAorICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKSB7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgaWYgKCFGSUVMRF9CRUxPTkdTX1RPX01FU1NBR0UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgIFB5RXhjX0tleUVycm9yLCAiRmllbGQgZG9lcyBub3QgYmVsb25nIHRvIG1lc3NhZ2UhIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBQeU9iamVjdCogcmVzdWx0ID0gTlVMTDsKKyAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKKyAgICAgIGludDMyIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0SW50MzIoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7CisgICAgICBpbnQ2NCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldEludDY0KCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyNpZiBJU182NEJJVAorICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworI2Vsc2UKKyAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUpOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICB1aW50MzIgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRVSW50MzIoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworI2lmIElTXzY0QklUCisgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisjZWxzZQorICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgIHVpbnQ2NCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFVJbnQ2NCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisjaWYgSVNfNjRCSVQKKyAgICAgIGlmICh2YWx1ZSA8PSBzdGF0aWNfY2FzdDx1aW50NjQ+KGtpbnQ2NG1heCkpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworICAgICAgfQorI2Vsc2UKKyAgICAgIGlmICh2YWx1ZSA8PSBzdGF0aWNfY2FzdDx1aW50MzI+KGtpbnQzMm1heCkpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOworICAgICAgfQorI2VuZGlmCisgICAgICBlbHNlIHsgIC8vIE5PTElOVAorICAgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldEZsb2F0KCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICBkb3VibGUgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXREb3VibGUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7CisgICAgICBib29sIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0Qm9vbCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgc3RyaW5nIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIHJlc3VsdCA9IFRvU3RyaW5nT2JqZWN0KGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICBpZiAoIW1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpKSB7CisgICAgICAgIC8vIExvb2sgZm9yIHRoZSB2YWx1ZSBpbiB0aGUgdW5rbm93biBmaWVsZHMuCisgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZF9zZXQgPQorICAgICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkX3NldC0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgICAgICAgaWYgKHVua25vd25fZmllbGRfc2V0LT5maWVsZChpKS5udW1iZXIoKSA9PQorICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcodW5rbm93bl9maWVsZF9zZXQtPmZpZWxkKGkpLnZhcmludCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEVudW0oKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhlbnVtX3ZhbHVlLT5udW1iZXIoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICBQeUV4Y19TeXN0ZW1FcnJvciwgIkdldHRpbmcgYSB2YWx1ZSBmcm9tIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKKyAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogSW50ZXJuYWxTZXRTY2FsYXIoCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAorICAgIFB5T2JqZWN0KiBhcmcpIHsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBpZiAoIUZJRUxEX0JFTE9OR1NfVE9fTUVTU0FHRShmaWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlKSkgeworICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgUHlFeGNfS2V5RXJyb3IsICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+U2V0SW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+U2V0SW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UMzIoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRVSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UNjQoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+U2V0RmxvYXQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5TZXREb3VibGUobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfQk9PTChhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldEJvb2wobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgaWYgKCFDaGVja0FuZFNldFN0cmluZygKKyAgICAgICAgICBhcmcsIG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHJlZmxlY3Rpb24sIGZhbHNlLCAtMSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlKTsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IgPQorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmVudW1fdHlwZSgpOworICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgZW51bV92YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBib29sIGFkZGVkID0gZmFsc2U7CisgICAgICAgIC8vIEFkZCB0aGUgdmFsdWUgdG8gdGhlIHVua25vd24gZmllbGRzLgorICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRfc2V0ID0KKyAgICAgICAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZF9zZXQtPmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgICAgICAgIGlmICh1bmtub3duX2ZpZWxkX3NldC0+ZmllbGQoaSkubnVtYmVyKCkgPT0KKyAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+bnVtYmVyKCkpIHsKKyAgICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LT5tdXRhYmxlX2ZpZWxkKGkpLT5zZXRfdmFyaW50KHZhbHVlKTsKKyAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghYWRkZWQpIHsKKyAgICAgICAgICB1bmtub3duX2ZpZWxkX3NldC0+QWRkVmFyaW50KGZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiU2V0dGluZyB2YWx1ZSB0byBhIGZpZWxkIG9mIHVua25vd24gdHlwZSAlZCIsCisgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7CisgIH0KKworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBJbnRlcm5hbEFkZFJlcGVhdGVkU2NhbGFyKAorICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKKyAgICBQeU9iamVjdCogYXJnKSB7CisKKyAgaWYgKCFGSUVMRF9CRUxPTkdTX1RPX01FU1NBR0UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgIFB5RXhjX0tleUVycm9yLCAiRmllbGQgZG9lcyBub3QgYmVsb25nIHRvIG1lc3NhZ2UhIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZEludDMyKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQ2NChhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZEludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDY0KGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9GTE9BVChhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZEZsb2F0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfRE9VQkxFKGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0JPT0woYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5BZGRCb29sKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgIGlmICghQ2hlY2tBbmRTZXRTdHJpbmcoCisgICAgICAgICAgYXJnLCBtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCByZWZsZWN0aW9uLCB0cnVlLCAtMSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlKTsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IgPQorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmVudW1fdHlwZSgpOworICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgZW51bV92YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQeU9iamVjdCogcyA9IFB5T2JqZWN0X1N0cihhcmcpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZW51bSB2YWx1ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHMpKTsKKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiQWRkaW5nIHZhbHVlIHRvIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKKyAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgfQorCisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIEludGVybmFsR2V0UmVwZWF0ZWRTY2FsYXIoCisgICAgQ01lc3NhZ2UqIGNtZXNzYWdlLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgaW50IGluZGV4KSB7CisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBjbWVzc2FnZS0+bWVzc2FnZTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBpbnQgZmllbGRfc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgIGlmIChpbmRleCA8IDApIHsKKyAgICBpbmRleCA9IGZpZWxkX3NpemUgKyBpbmRleDsKKyAgfQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZpZWxkX3NpemUpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgImxpc3QgYXNzaWdubWVudCBpbmRleCAoJWQpIG91dCBvZiByYW5nZSIsIGluZGV4KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFB5T2JqZWN0KiByZXN1bHQgPSBOVUxMOworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgaW50MzIgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKAorICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgIGludDY0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCgKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICB1aW50MzIgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMigKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICB1aW50NjQgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NCgKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDogeworICAgICAgZmxvYXQgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0KAorICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUoCisgICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKKyAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgYm9vbCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCgKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlCb29sX0Zyb21Mb25nKHZhbHVlID8gMSA6IDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRFbnVtKAorICAgICAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoZW51bV92YWx1ZS0+bnVtYmVyKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgc3RyaW5nIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcoCisgICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKKyAgICAgIHJlc3VsdCA9IFRvU3RyaW5nT2JqZWN0KGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7CisgICAgICBDTWVzc2FnZSogcHlfY21zZyA9IFB5T2JqZWN0X05ldyhDTWVzc2FnZSwgJkNNZXNzYWdlX1R5cGUpOworICAgICAgaWYgKHB5X2Ntc2cgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIG1zZyA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcHlfY21zZy0+cGFyZW50ID0gY21lc3NhZ2U7CisgICAgICBweV9jbXNnLT5mdWxsX25hbWUgPSBmaWVsZF9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpOworICAgICAgcHlfY21zZy0+bWVzc2FnZSA9IGNvbnN0X2Nhc3Q8Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSo+KCZtc2cpOworICAgICAgcHlfY21zZy0+ZnJlZV9tZXNzYWdlID0gZmFsc2U7CisgICAgICBweV9jbXNnLT5yZWFkX29ubHkgPSBmYWxzZTsKKyAgICAgIHJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihweV9jbXNnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICJHZXR0aW5nIHZhbHVlIGZyb20gYSByZXBlYXRlZCBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyU2xpY2UoCisgICAgQ01lc3NhZ2UqIGNtZXNzYWdlLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgUHlPYmplY3QqIHNsaWNlKSB7CisgIFB5X3NzaXplX3QgZnJvbTsKKyAgUHlfc3NpemVfdCB0bzsKKyAgUHlfc3NpemVfdCBzdGVwOworICBQeV9zc2l6ZV90IGxlbmd0aDsKKyAgYm9vbCByZXR1cm5fbGlzdCA9IGZhbHNlOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gY21lc3NhZ2UtPm1lc3NhZ2U7CisKKyAgaWYgKFB5SW50X0NoZWNrKHNsaWNlKSkgeworICAgIGZyb20gPSB0byA9IFB5SW50X0FzTG9uZyhzbGljZSk7CisgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKHNsaWNlKSkgeworICAgIGZyb20gPSB0byA9IFB5TG9uZ19Bc0xvbmcoc2xpY2UpOworICB9IGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soc2xpY2UpKSB7CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBsZW5ndGggPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgIFB5U2xpY2VfR2V0SW5kaWNlcygKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeVNsaWNlT2JqZWN0Kj4oc2xpY2UpLCBsZW5ndGgsICZmcm9tLCAmdG8sICZzdGVwKTsKKyAgICByZXR1cm5fbGlzdCA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIXJldHVybl9saXN0KSB7CisgICAgcmV0dXJuIEludGVybmFsR2V0UmVwZWF0ZWRTY2FsYXIoY21lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGZyb20pOworICB9CisKKyAgUHlPYmplY3QqIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoZnJvbSA8PSB0bykgeworICAgIGlmIChzdGVwIDwgMCkgcmV0dXJuIGxpc3Q7CisgICAgZm9yIChQeV9zc2l6ZV90IGluZGV4ID0gZnJvbTsgaW5kZXggPCB0bzsgaW5kZXggKz0gc3RlcCkgeworICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIGJyZWFrOworICAgICAgUHlPYmplY3QqIHMgPSBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyKAorICAgICAgICAgIGNtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIHMpOworICAgICAgUHlfREVDUkVGKHMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoc3RlcCA+IDApIHJldHVybiBsaXN0OworICAgIGZvciAoUHlfc3NpemVfdCBpbmRleCA9IGZyb207IGluZGV4ID4gdG87IGluZGV4ICs9IHN0ZXApIHsKKyAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSBicmVhazsKKyAgICAgIFB5T2JqZWN0KiBzID0gSW50ZXJuYWxHZXRSZXBlYXRlZFNjYWxhcigKKyAgICAgICAgICBjbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCBzKTsKKyAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGxpc3Q7Cit9CisKKy8vIC0tLS0tLSBDIENvbnN0cnVjdG9yL0Rlc3RydWN0b3I6CisKK3N0YXRpYyBpbnQgQ01lc3NhZ2VJbml0KENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpIHsKKyAgc2VsZi0+bWVzc2FnZSA9IE5VTEw7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBDTWVzc2FnZURlYWxsb2MoQ01lc3NhZ2UqIHNlbGYpIHsKKyAgaWYgKHNlbGYtPmZyZWVfbWVzc2FnZSkgeworICAgIGlmIChzZWxmLT5yZWFkX29ubHkpIHsKKyAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZikpOworICAgIH0KKyAgICBkZWxldGUgc2VsZi0+bWVzc2FnZTsKKyAgfQorICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Cit9CisKKy8vIC0tLS0tLSBNZXRob2RzOgorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKworICAvLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgorICAvLyBmb3IgY2ZpZWxkX2Rlc2NyaXB0b3IsIGNoaWxkX2NtZXNzYWdlIGluIGFyZzoKKyAgLy8gICBSZWxlYXNlU3ViTWVzc2FnZShjZmllbGRfZGVzY3JpcHRvciwgY2hpbGRfY21lc3NhZ2UpCisgIGlmICghUHlMaXN0X0NoZWNrKGFyZykpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGxpc3QiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBQeU9iamVjdCogbWVzc2FnZXNfdG9fY2xlYXIgPSBhcmc7CisgIFB5X3NzaXplX3QgbnVtX21lc3NhZ2VzX3RvX2NsZWFyID0gUHlMaXN0X0dFVF9TSVpFKG1lc3NhZ2VzX3RvX2NsZWFyKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IG51bV9tZXNzYWdlc190b19jbGVhcjsgKytpKSB7CisgICAgUHlPYmplY3QqIG1lc3NhZ2VfdHVwbGUgPSBQeUxpc3RfR0VUX0lURU0obWVzc2FnZXNfdG9fY2xlYXIsIGkpOworICAgIGlmICghUHlUdXBsZV9DaGVjayhtZXNzYWdlX3R1cGxlKSB8fCBQeVR1cGxlX0dFVF9TSVpFKG1lc3NhZ2VfdHVwbGUpICE9IDIpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNdXN0IGJlIGEgdHVwbGUgb2Ygc2l6ZSAyIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeU9iamVjdCogcHlfY2ZpZWxkX2Rlc2NyaXB0b3IgPSBQeVR1cGxlX0dFVF9JVEVNKG1lc3NhZ2VfdHVwbGUsIDApOworICAgIFB5T2JqZWN0KiBweV9jaGlsZF9jbWVzc2FnZSA9IFB5VHVwbGVfR0VUX0lURU0obWVzc2FnZV90dXBsZSwgMSk7CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socHlfY2ZpZWxkX2Rlc2NyaXB0b3IsICZDRmllbGREZXNjcmlwdG9yX1R5cGUpIHx8CisgICAgICAgICFQeU9iamVjdF9UeXBlQ2hlY2socHlfY2hpbGRfY21lc3NhZ2UsICZDTWVzc2FnZV9UeXBlKSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIFR1cGxlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvciAqPigKKyAgICAgICAgcHlfY2ZpZWxkX2Rlc2NyaXB0b3IpOworICAgIENNZXNzYWdlKiBjaGlsZF9jbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UgKj4ocHlfY2hpbGRfY21lc3NhZ2UpOworICAgIFJlbGVhc2VTdWJNZXNzYWdlKG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBjaGlsZF9jbWVzc2FnZSk7CisgIH0KKworICBtZXNzYWdlLT5DbGVhcigpOworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Jc0luaXRpYWxpemVkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSA/IDEgOiAwKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9IYXNGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBjaGFyKiBmaWVsZF9uYW1lOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJmZpZWxkX25hbWUsIE5VTEwpIDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7CisgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZmllbGQgJXMuIiwgZmllbGRfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBib29sIGhhc19maWVsZCA9CisgICAgICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhoYXNfZmllbGQgPyAxIDogMCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfSGFzRmllbGRCeURlc2NyaXB0b3IoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3IgPSBOVUxMOworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhyZWludGVycHJldF9jYXN0PFB5T2JqZWN0ICo+KGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBmaWVsZCBkZXNjcmlwdG9yIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2ZpZWxkX2Rlc2NyaXB0b3IgPSByZWludGVycHJldF9jYXN0PENGaWVsZERlc2NyaXB0b3IqPihhcmcpOworCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3I7CisKKyAgaWYgKCFGSUVMRF9CRUxPTkdTX1RPX01FU1NBR0UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChGSUVMRF9JU19SRVBFQVRFRChmaWVsZF9kZXNjcmlwdG9yKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkZpZWxkIGlzIHJlcGVhdGVkLiBBIHNpbmd1bGFyIG1ldGhvZCBpcyByZXF1aXJlZC4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGJvb2wgaGFzX2ZpZWxkID0KKyAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGhhc19maWVsZCA/IDEgOiAwKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9DbGVhckZpZWxkQnlEZXNjcmlwdG9yKAorICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yID0gTlVMTDsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNdXN0IGJlIGEgZmllbGQgZGVzY3JpcHRvciIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGNmaWVsZF9kZXNjcmlwdG9yID0gcmVpbnRlcnByZXRfY2FzdDxDRmllbGREZXNjcmlwdG9yKj4oYXJnKTsKKworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KKyAgICAgIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yOworCisgIGlmICghRklFTERfQkVMT05HU19UT19NRVNTQUdFKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiRmllbGQgZG9lcyBub3QgYmVsb25nIHRvIG1lc3NhZ2UhIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkNsZWFyRmllbGQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIGNoYXIqIGZpZWxkX25hbWU7CisgIENNZXNzYWdlKiBjaGlsZF9jbWVzc2FnZSA9IE5VTEw7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJzfE8hOkNsZWFyRmllbGQiKSwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmQ01lc3NhZ2VfVHlwZSwgJmNoaWxkX2NtZXNzYWdlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7CisgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZmllbGQgJXMuIiwgZmllbGRfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoY2hpbGRfY21lc3NhZ2UgIT0gTlVMTCAmJiAhRklFTERfSVNfUkVQRUFURUQoZmllbGRfZGVzY3JpcHRvcikpIHsKKyAgICBSZWxlYXNlU3ViTWVzc2FnZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBjaGlsZF9jbWVzc2FnZSk7CisgIH0gZWxzZSB7CisgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICB9CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0dldFNjYWxhcihDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBDRmllbGREZXNjcmlwdG9yKiBjZGVzY3JpcHRvciA9IE5VTEw7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIHJldHVybiBJbnRlcm5hbEdldFNjYWxhcihtZXNzYWdlLCBjZGVzY3JpcHRvci0+ZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfR2V0UmVwZWF0ZWRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yOworICBQeU9iamVjdCogc2xpY2U7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86R2V0UmVwZWF0ZWRTY2FsYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUsICZjZmllbGRfZGVzY3JpcHRvciwgJnNsaWNlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIEludGVybmFsR2V0UmVwZWF0ZWRTY2FsYXJTbGljZSgKKyAgICAgIHNlbGYsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBzbGljZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQXNzaWduUmVwZWF0ZWRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yOworICBQeU9iamVjdCogc2xpY2U7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86QXNzaWduUmVwZWF0ZWRTY2FsYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUsICZjZmllbGRfZGVzY3JpcHRvciwgJnNsaWNlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkNsZWFyRmllbGQobWVzc2FnZSwgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IpOworCisgIFB5T2JqZWN0KiBpdGVyID0gUHlPYmplY3RfR2V0SXRlcihzbGljZSk7CisgIFB5T2JqZWN0KiBuZXh0OworICB3aGlsZSAoKG5leHQgPSBQeUl0ZXJfTmV4dChpdGVyKSkgIT0gTlVMTCkgeworICAgIGlmIChJbnRlcm5hbEFkZFJlcGVhdGVkU2NhbGFyKAorICAgICAgICAgICAgbWVzc2FnZSwgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IsIG5leHQpID09IE5VTEwpIHsKKyAgICAgIFB5X0RFQ1JFRihuZXh0KTsKKyAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYobmV4dCk7CisgIH0KKyAgUHlfREVDUkVGKGl0ZXIpOworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9EZWxldGVSZXBlYXRlZEZpZWxkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKKyAgUHlPYmplY3QqIHNsaWNlOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgQygiTyFPOkRlbGV0ZVJlcGVhdGVkRmllbGQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUsICZjZmllbGRfZGVzY3JpcHRvciwgJnNsaWNlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworCisgIFB5X3NzaXplX3QgbGVuZ3RoLCBmcm9tLCB0bywgc3RlcCwgc2xpY2VfbGVuZ3RoOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KKyAgICAgIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBpbnQgbWluLCBtYXg7CisgIGxlbmd0aCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisKKyAgaWYgKFB5SW50X0NoZWNrKHNsaWNlKSB8fCBQeUxvbmdfQ2hlY2soc2xpY2UpKSB7CisgICAgZnJvbSA9IHRvID0gUHlMb25nX0FzTG9uZyhzbGljZSk7CisgICAgaWYgKGZyb20gPCAwKSB7CisgICAgICBmcm9tID0gdG8gPSBsZW5ndGggKyBmcm9tOworICAgIH0KKyAgICBzdGVwID0gMTsKKyAgICBtaW4gPSBtYXggPSBmcm9tOworCisgICAgLy8gUmFuZ2UgY2hlY2suCisgICAgaWYgKGZyb20gPCAwIHx8IGZyb20gPj0gbGVuZ3RoKSB7CisgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwgImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfSBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKHNsaWNlKSkgeworICAgIGZyb20gPSB0byA9IHN0ZXAgPSBzbGljZV9sZW5ndGggPSAwOworICAgIFB5U2xpY2VfR2V0SW5kaWNlc0V4KAorICAgICAgICByZWludGVycHJldF9jYXN0PFB5U2xpY2VPYmplY3QqPihzbGljZSksCisgICAgICAgIGxlbmd0aCwgJmZyb20sICZ0bywgJnN0ZXAsICZzbGljZV9sZW5ndGgpOworICAgIGlmIChmcm9tIDwgdG8pIHsKKyAgICAgIG1pbiA9IGZyb207CisgICAgICBtYXggPSB0byAtIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pbiA9IHRvICsgMTsKKyAgICAgIG1heCA9IGZyb207CisgICAgfQorICB9IGVsc2UgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgUHlfc3NpemVfdCBpID0gZnJvbTsKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gdG9fZGVsZXRlKGxlbmd0aCwgZmFsc2UpOworICB3aGlsZSAoaSA+PSBtaW4gJiYgaSA8PSBtYXgpIHsKKyAgICB0b19kZWxldGVbaV0gPSB0cnVlOworICAgIGkgKz0gc3RlcDsKKyAgfQorCisgIHRvID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgaWYgKCF0b19kZWxldGVbaV0pIHsKKyAgICAgIGlmIChpICE9IHRvKSB7CisgICAgICAgIHJlZmxlY3Rpb24tPlN3YXBFbGVtZW50cyhtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpLCB0byk7CisgICAgICB9CisgICAgICArK3RvOworICAgIH0KKyAgfQorCisgIHdoaWxlIChpID4gdG8pIHsKKyAgICByZWZsZWN0aW9uLT5SZW1vdmVMYXN0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgIC0taTsKKyAgfQorCisgIFB5X1JFVFVSTl9OT05FOworfQorCisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU2V0U2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKKyAgUHlPYmplY3QqIGFyZzsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEMoIk8hTzpTZXRTY2FsYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUsICZjZmllbGRfZGVzY3JpcHRvciwgJmFyZykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKworICByZXR1cm4gSW50ZXJuYWxTZXRTY2FsYXIoc2VsZi0+bWVzc2FnZSwgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IsIGFyZyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQWRkUmVwZWF0ZWRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yOworICBQeU9iamVjdCogdmFsdWU7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86QWRkUmVwZWF0ZWRTY2FsYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUsICZjZmllbGRfZGVzY3JpcHRvciwgJnZhbHVlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworCisgIHJldHVybiBJbnRlcm5hbEFkZFJlcGVhdGVkU2NhbGFyKAorICAgICAgc2VsZi0+bWVzc2FnZSwgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IsIHZhbHVlKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9GaWVsZExlbmd0aChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNdXN0IGJlIGEgZmllbGQgZGVzY3JpcHRvciIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGNmaWVsZF9kZXNjcmlwdG9yID0gcmVpbnRlcnByZXRfY2FzdDxDRmllbGREZXNjcmlwdG9yKj4oYXJnKTsKKworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgaW50IGxlbmd0aCA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgKm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGxlbmd0aCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfRGVidWdTdHJpbmcoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHNlbGYtPm1lc3NhZ2UtPkRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU2VyaWFsaXplVG9TdHJpbmcoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIGludCBzaXplID0gc2VsZi0+bWVzc2FnZS0+Qnl0ZVNpemUoKTsKKyAgaWYgKHNpemUgPD0gMCkgeworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgfQorICBQeU9iamVjdCogcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGNoYXIqIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICBzZWxmLT5tZXNzYWdlLT5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGJ1ZmZlcikpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygKKyAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgc3RyaW5nIGNvbnRlbnRzOworICBzZWxmLT5tZXNzYWdlLT5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoJmNvbnRlbnRzKTsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbnRlbnRzLmNfc3RyKCksIGNvbnRlbnRzLnNpemUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VTdHIoQ01lc3NhZ2UqIHNlbGYpIHsKKyAgY2hhciBzdHJbMTAyNF07CisgIHN0cltzaXplb2Yoc3RyKSAtIDFdID0gMDsKKyAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSAtIDEsICJDTWVzc2FnZTogPCVwPiIsIHNlbGYtPm1lc3NhZ2UpOworICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX01lcmdlRnJvbShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBDTWVzc2FnZSogb3RoZXJfbWVzc2FnZTsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLCAmQ01lc3NhZ2VfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG90aGVyX21lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oYXJnKTsKKyAgaWYgKG90aGVyX21lc3NhZ2UtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSAhPQorICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIG1lcmdlIGZyb20gYSBtZXNzYWdlIHdpdGggYSBkaWZmZXJlbnQgdHlwZS4gIgorICAgICAgICAgICAgICAgICAidG86ICVzLCBmcm9tOiAlcyIsCisgICAgICAgICAgICAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgb3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKworICBzZWxmLT5tZXNzYWdlLT5NZXJnZUZyb20oKm90aGVyX21lc3NhZ2UtPm1lc3NhZ2UpOworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Db3B5RnJvbShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBDTWVzc2FnZSogb3RoZXJfbWVzc2FnZTsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLCAmQ01lc3NhZ2VfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG90aGVyX21lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oYXJnKTsKKyAgaWYgKG90aGVyX21lc3NhZ2UtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSAhPQorICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIGNvcHkgZnJvbSBhIG1lc3NhZ2Ugd2l0aCBhIGRpZmZlcmVudCB0eXBlLiAiCisgICAgICAgICAgICAgICAgICJ0bzogJXMsIGZyb206ICVzIiwKKyAgICAgICAgICAgICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisKKyAgc2VsZi0+bWVzc2FnZS0+Q29weUZyb20oKm90aGVyX21lc3NhZ2UtPm1lc3NhZ2UpOworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9NZXJnZUZyb21TdHJpbmcoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY29uc3Qgdm9pZCogZGF0YTsKKyAgUHlfc3NpemVfdCBkYXRhX2xlbmd0aDsKKyAgaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihhcmcsICZkYXRhLCAmZGF0YV9sZW5ndGgpIDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEpLCBkYXRhX2xlbmd0aCk7CisgIGlucHV0LlNldEV4dGVuc2lvblJlZ2lzdHJ5KEdldERlc2NyaXB0b3JQb29sKCksIGdsb2JhbF9tZXNzYWdlX2ZhY3RvcnkpOworICBib29sIHN1Y2Nlc3MgPSBzZWxmLT5tZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0KTsKKyAgaWYgKHN1Y2Nlc3MpIHsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+bWVzc2FnZS0+Qnl0ZVNpemUoKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xKTsKKyAgfQorfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0J5dGVTaXplKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NldEluUGFyZW50KENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU3dhcFJlcGVhdGVkRmllbGRFbGVtZW50cygKKyAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGludCBpbmRleDEsIGluZGV4MjsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEMoIk8haWk6U3dhcFJlcGVhdGVkRmllbGRFbGVtZW50cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSwgJmNmaWVsZF9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4MSwgJmluZGV4MikpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIHJlZmxlY3Rpb24tPlN3YXBFbGVtZW50cygKKyAgICAgIG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBpbmRleDEsIGluZGV4Mik7CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworCisgIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7CisgIGlmIChweV9jbXNnID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBzdWJfbWVzc2FnZSA9CisgICAgICByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yKTsKKworICBweV9jbXNnLT5wYXJlbnQgPSBOVUxMOworICBweV9jbXNnLT5mdWxsX25hbWUgPSBzdWJfbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpOworICBweV9jbXNnLT5tZXNzYWdlID0gc3ViX21lc3NhZ2U7CisgIHB5X2Ntc2ctPmZyZWVfbWVzc2FnZSA9IGZhbHNlOworICBweV9jbXNnLT5yZWFkX29ubHkgPSBmYWxzZTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihweV9jbXNnKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRSZXBlYXRlZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yOworICBQeU9iamVjdCogc2xpY2U7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86R2V0UmVwZWF0ZWRNZXNzYWdlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyU2xpY2UoCisgICAgICBzZWxmLCBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciwgc2xpY2UpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX05ld1N1Yk1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisKKyAgQ01lc3NhZ2UqIHB5X2Ntc2cgPSBQeU9iamVjdF9OZXcoQ01lc3NhZ2UsICZDTWVzc2FnZV9UeXBlKTsKKyAgaWYgKHB5X2Ntc2cgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KKyAgICAgIHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoKm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKKworICBweV9jbXNnLT5mdWxsX25hbWUgPSBzdWJfbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCk7CisgIHB5X2Ntc2ctPnBhcmVudCA9IHNlbGY7CisgIHB5X2Ntc2ctPnBhcmVudF9maWVsZCA9IGNmaWVsZF9kZXNjcmlwdG9yOworICBweV9jbXNnLT5tZXNzYWdlID0gY29uc3RfY2FzdDxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKKyAgcHlfY21zZy0+ZnJlZV9tZXNzYWdlID0gZmFsc2U7CisgIHB5X2Ntc2ctPnJlYWRfb25seSA9IHRydWU7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4ocHlfY21zZyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTXV0YWJsZU1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworCisgIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7CisgIGlmIChweV9jbXNnID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtdXRhYmxlX21lc3NhZ2UgPQorICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKKworICBweV9jbXNnLT5mdWxsX25hbWUgPSBtdXRhYmxlX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKTsKKyAgcHlfY21zZy0+bWVzc2FnZSA9IG11dGFibGVfbWVzc2FnZTsKKyAgcHlfY21zZy0+ZnJlZV9tZXNzYWdlID0gZmFsc2U7CisgIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0VxdWFscyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBDTWVzc2FnZSogb3RoZXJfbWVzc2FnZTsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLCAmQ01lc3NhZ2VfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7CisKKyAgaWYgKG90aGVyX21lc3NhZ2UtPm1lc3NhZ2UgPT0gc2VsZi0+bWVzc2FnZSkgeworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CisgIH0KKworICBpZiAob3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9CisgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpIHsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICB9CisKKyAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9MaXN0RmllbGRzKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgdmVjdG9yPGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJmZpZWxkcyk7CisKKyAgUHlPYmplY3QqIGxpc3QgPSBQeUxpc3RfTmV3KGZpZWxkcy5zaXplKCkpOworICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIGJvb2wgaXNfZXh0ZW5zaW9uID0gZmllbGRzW2ldLT5pc19leHRlbnNpb24oKTsKKyAgICBQeU9iamVjdCogdCA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmICh0ID09IE5VTEwpIHsKKyAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5T2JqZWN0KiBpc19leHRlbnNpb25fb2JqZWN0ID0gUHlCb29sX0Zyb21Mb25nKGlzX2V4dGVuc2lvbiA/IDEgOiAwKTsKKworICAgIFB5T2JqZWN0KiBmaWVsZF9uYW1lOworICAgIGNvbnN0IHN0cmluZyogczsKKyAgICBpZiAoaXNfZXh0ZW5zaW9uKSB7CisgICAgICBzID0gJmZpZWxkc1tpXS0+ZnVsbF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHMgPSAmZmllbGRzW2ldLT5uYW1lKCk7CisgICAgfQorICAgIGZpZWxkX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLT5jX3N0cigpLCBzLT5sZW5ndGgoKSk7CisgICAgaWYgKGZpZWxkX25hbWUgPT0gTlVMTCkgeworICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgUHlfREVDUkVGKHQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlUdXBsZV9TRVRfSVRFTSh0LCAwLCBpc19leHRlbnNpb25fb2JqZWN0KTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHQsIDEsIGZpZWxkX25hbWUpOworICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCB0KTsKKyAgfQorCisgIHJldHVybiBsaXN0OworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0ZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhDTWVzc2FnZSogc2VsZikgeworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICBtZXNzYWdlLT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7CisKKyAgUHlPYmplY3QqIGVycm9yX2xpc3QgPSBQeUxpc3RfTmV3KGVycm9ycy5zaXplKCkpOworICBpZiAoZXJyb3JfbGlzdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBlcnJvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yID0gZXJyb3JzW2ldOworICAgIFB5T2JqZWN0KiBlcnJvcl9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgZXJyb3IuY19zdHIoKSwgZXJyb3IubGVuZ3RoKCkpOworICAgIGlmIChlcnJvcl9zdHJpbmcgPT0gTlVMTCkgeworICAgICAgUHlfREVDUkVGKGVycm9yX2xpc3QpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5TGlzdF9TRVRfSVRFTShlcnJvcl9saXN0LCBpLCBlcnJvcl9zdHJpbmcpOworICB9CisgIHJldHVybiBlcnJvcl9saXN0OworfQorCisvLyAtLS0tLS0gUHl0aG9uIENvbnN0cnVjdG9yOgorCitQeU9iamVjdCogUHl0aG9uX05ld0NNZXNzYWdlKFB5T2JqZWN0KiBpZ25vcmVkLCBQeU9iamVjdCogYXJnKSB7CisgIGNvbnN0IGNoYXIqIG1lc3NhZ2VfdHlwZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZyk7CisgIGlmIChtZXNzYWdlX3R5cGUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IENyZWF0ZU1lc3NhZ2UobWVzc2FnZV90eXBlKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJDb3VsZG4ndCBjcmVhdGUgbWVzc2FnZSBvZiB0eXBlICVzISIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBDTWVzc2FnZSogcHlfY21zZyA9IFB5T2JqZWN0X05ldyhDTWVzc2FnZSwgJkNNZXNzYWdlX1R5cGUpOworICBpZiAocHlfY21zZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcHlfY21zZy0+bWVzc2FnZSA9IG1lc3NhZ2UtPk5ldygpOworICBweV9jbXNnLT5mcmVlX21lc3NhZ2UgPSB0cnVlOworICBweV9jbXNnLT5mdWxsX25hbWUgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCk7CisgIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOworICBweV9jbXNnLT5wYXJlbnQgPSBOVUxMOworICBweV9jbXNnLT5wYXJlbnRfZmllbGQgPSBOVUxMOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOworfQorCisvLyAtLS0gTW9kdWxlIEZ1bmN0aW9ucyAoZXhwb3NlZCB0byBQeXRob24pOgorCitQeU1ldGhvZERlZiBtZXRob2RzW10gPSB7CisgIHsgQygiTmV3Q01lc3NhZ2UiKSwgKFB5Q0Z1bmN0aW9uKVB5dGhvbl9OZXdDTWVzc2FnZSwKKyAgICBNRVRIX08sCisgICAgQygiQ3JlYXRlcyBhIG5ldyBDKysgcHJvdG9jb2wgbWVzc2FnZSwgZ2l2ZW4gaXRzIGZ1bGwgbmFtZS4iKSB9LAorICB7IEMoIk5ld0NEZXNjcmlwdG9yUG9vbCIpLCAoUHlDRnVuY3Rpb24pUHl0aG9uX05ld0NEZXNjcmlwdG9yUG9vbCwKKyAgICBNRVRIX05PQVJHUywKKyAgICBDKCJDcmVhdGVzIGEgbmV3IEMrKyBkZXNjcmlwdG9yIHBvb2wuIikgfSwKKyAgeyBDKCJCdWlsZEZpbGUiKSwgKFB5Q0Z1bmN0aW9uKVB5dGhvbl9CdWlsZEZpbGUsCisgICAgTUVUSF9PLAorICAgIEMoIlJlZ2lzdGVycyBhIG5ldyBwcm90b2NvbCBidWZmZXIgZmlsZSBpbiB0aGUgZ2xvYmFsIEMrKyBkZXNjcmlwdG9yICIKKyAgICAgICJwb29sLiIpIH0sCisgIHtOVUxMfQorfTsKKworLy8gLS0tIEV4cG9zaW5nIHRoZSBDIHByb3RvIGxpdmluZyBpbnNpZGUgUHl0aG9uIHByb3RvIHRvIEMgY29kZToKKworZXh0ZXJuIGNvbnN0IE1lc3NhZ2UqICgqR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7CitleHRlcm4gTWVzc2FnZSogKCpNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7CisKK3N0YXRpYyBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBHZXRDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7CisgIFB5T2JqZWN0KiBjX21zZ19vYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1zZywgIl9jbXNnIik7CisgIGlmIChjX21zZ19vYmogPT0gTlVMTCkgeworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgUHlfREVDUkVGKGNfbXNnX29iaik7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNfbXNnX29iaiwgJkNNZXNzYWdlX1R5cGUpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ01lc3NhZ2UqIGNfbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGNfbXNnX29iaik7CisgIHJldHVybiBjX21zZy0+bWVzc2FnZTsKK30KKworc3RhdGljIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7CisgIFB5T2JqZWN0KiBjX21zZ19vYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1zZywgIl9jbXNnIik7CisgIGlmIChjX21zZ19vYmogPT0gTlVMTCkgeworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgUHlfREVDUkVGKGNfbXNnX29iaik7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNfbXNnX29iaiwgJkNNZXNzYWdlX1R5cGUpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ01lc3NhZ2UqIGNfbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGNfbXNnX29iaik7CisgIEFzc3VyZVdyaXRhYmxlKGNfbXNnKTsKKyAgcmV0dXJuIGNfbXNnLT5tZXNzYWdlOworfQorCisvLyAtLS0gTW9kdWxlIEluaXQgRnVuY3Rpb246CisKK3N0YXRpYyBjb25zdCBjaGFyIG1vZHVsZV9kb2NzdHJpbmdbXSA9CisicHl0aG9uLXByb3RvMiBpcyBhIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGVuaGFuY2UgcHJvdG8yIFB5dGhvbiBBUElcbiIKKyJwZXJmb3JtYW5jZS5cbiIKKyJcbiIKKyJJdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHByb3RvY29sIGJ1ZmZlcnMgQysrIHJlZmxlY3Rpb24gQVBJIHRoYXRcbiIKKyJpbXBsZW1lbnRzIHRoZSBiYXNpYyBwcm90b2NvbCBidWZmZXIgZnVuY3Rpb25zLiI7CisKK2V4dGVybiAiQyIgeworICB2b2lkIGluaXRfbmV0X3Byb3RvMl9fX3B5dGhvbigpIHsKKyAgICAvLyBJbml0aWFsaXplIGNvbnN0YW50cy4KKyAgICBrUHl0aG9uWmVybyA9IFB5SW50X0Zyb21Mb25nKDApOworICAgIGtpbnQzMm1pbl9weSA9IFB5SW50X0Zyb21Mb25nKGtpbnQzMm1pbik7CisgICAga2ludDMybWF4X3B5ID0gUHlJbnRfRnJvbUxvbmcoa2ludDMybWF4KTsKKyAgICBrdWludDMybWF4X3B5ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhrdWludDMybWF4KTsKKyAgICBraW50NjRtaW5fcHkgPSBQeUxvbmdfRnJvbUxvbmdMb25nKGtpbnQ2NG1pbik7CisgICAga2ludDY0bWF4X3B5ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhraW50NjRtYXgpOworICAgIGt1aW50NjRtYXhfcHkgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoa3VpbnQ2NG1heCk7CisKKyAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5ID0gbmV3IER5bmFtaWNNZXNzYWdlRmFjdG9yeShHZXREZXNjcmlwdG9yUG9vbCgpKTsKKyAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5LT5TZXREZWxlZ2F0ZVRvR2VuZXJhdGVkRmFjdG9yeSh0cnVlKTsKKworICAgIC8vIEV4cG9ydCBvdXIgZnVuY3Rpb25zIHRvIFB5dGhvbi4KKyAgICBQeU9iamVjdCAqbTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoQygiX25ldF9wcm90bzJfX19weXRob24iKSwgbWV0aG9kcywgQyhtb2R1bGVfZG9jc3RyaW5nKSk7CisgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFkZENvbnN0YW50cyhtKTsKKworICAgIENNZXNzYWdlX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ01lc3NhZ2VfVHlwZSkgPCAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJbml0RGVzY3JpcHRvcigpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUge0dldCxNdXRhYmxlfUNQcm90b0luc2lkZVB5UHJvdG8uCisgICAgR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0ciA9IEdldENQcm90b0luc2lkZVB5UHJvdG9JbXBsOworICAgIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvUHRyID0gTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9JbXBsOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9kZXNjcmlwdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9kZXNjcmlwdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlM2U5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuY2MKQEAgLTAsMCArMSwzMzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KQorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworI2RlZmluZSBDKHN0cikgY29uc3RfY2FzdDxjaGFyKj4oc3RyKQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworCitzdGF0aWMgdm9pZCBDRmllbGREZXNjcmlwdG9yRGVhbGxvYyhDRmllbGREZXNjcmlwdG9yKiBzZWxmKTsKKworc3RhdGljIGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKiBnX2Rlc2NyaXB0b3JfcG9vbCA9IE5VTEw7CisKK3N0YXRpYyBQeU9iamVjdCogQ0ZpZWxkRGVzY3JpcHRvcl9HZXRGdWxsTmFtZSgKKyAgICBDRmllbGREZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIFB5X1hJTkNSRUYoc2VsZi0+ZnVsbF9uYW1lKTsKKyAgcmV0dXJuIHNlbGYtPmZ1bGxfbmFtZTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDRmllbGREZXNjcmlwdG9yX0dldE5hbWUoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPm5hbWUpOworICByZXR1cm4gc2VsZi0+bmFtZTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDRmllbGREZXNjcmlwdG9yX0dldENwcFR5cGUoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPmNwcF90eXBlKTsKKyAgcmV0dXJuIHNlbGYtPmNwcF90eXBlOworfQorCitzdGF0aWMgUHlPYmplY3QqIENGaWVsZERlc2NyaXB0b3JfR2V0TGFiZWwoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPmxhYmVsKTsKKyAgcmV0dXJuIHNlbGYtPmxhYmVsOworfQorCitzdGF0aWMgUHlPYmplY3QqIENGaWVsZERlc2NyaXB0b3JfR2V0SUQoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPmlkKTsKKyAgcmV0dXJuIHNlbGYtPmlkOworfQorCisKK3N0YXRpYyBQeUdldFNldERlZiBDRmllbGREZXNjcmlwdG9yR2V0dGVyc1tdID0geworICB7IEMoImZ1bGxfbmFtZSIpLAorICAgIChnZXR0ZXIpQ0ZpZWxkRGVzY3JpcHRvcl9HZXRGdWxsTmFtZSwgTlVMTCwgIkZ1bGwgbmFtZSIsIE5VTEx9LAorICB7IEMoIm5hbWUiKSwKKyAgICAoZ2V0dGVyKUNGaWVsZERlc2NyaXB0b3JfR2V0TmFtZSwgTlVMTCwgImxhc3QgbmFtZSIsIE5VTEx9LAorICB7IEMoImNwcF90eXBlIiksCisgICAgKGdldHRlcilDRmllbGREZXNjcmlwdG9yX0dldENwcFR5cGUsIE5VTEwsICJDKysgVHlwZSIsIE5VTEx9LAorICB7IEMoImxhYmVsIiksCisgICAgKGdldHRlcilDRmllbGREZXNjcmlwdG9yX0dldExhYmVsLCBOVUxMLCAiTGFiZWwiLCBOVUxMfSwKKyAgeyBDKCJpZCIpLAorICAgIChnZXR0ZXIpQ0ZpZWxkRGVzY3JpcHRvcl9HZXRJRCwgTlVMTCwgIklEIiwgTlVMTH0sCisgIHtOVUxMfQorfTsKKworUHlUeXBlT2JqZWN0IENGaWVsZERlc2NyaXB0b3JfVHlwZSA9IHsKKyAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgMCwKKyAgQygiZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLiIKKyAgICAiX25ldF9wcm90bzJfX19weXRob24uIgorICAgICJDRmllbGREZXNjcmlwdG9yIiksICAgICAgICAgICAgICAgIC8vIHRwX25hbWUKKyAgc2l6ZW9mKENGaWVsZERlc2NyaXB0b3IpLCAgICAgICAgICAgICAvLyB0cF9iYXNpY3NpemUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAoZGVzdHJ1Y3RvcilDRmllbGREZXNjcmlwdG9yRGVhbGxvYywgIC8vIHRwX2RlYWxsb2MKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9wcmludAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKKyAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncworICBDKCJBIEZpZWxkIERlc2NyaXB0b3IiKSwgICAgICAgICAgICAgIC8vIHRwX2RvYworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWV0aG9kcworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKKyAgQ0ZpZWxkRGVzY3JpcHRvckdldHRlcnMsICAgICAgICAgICAgICAvLyB0cF9nZXRzZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9iYXNlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX2dldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX3NldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3RvZmZzZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pbml0CisgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgLy8gdHBfYWxsb2MKKyAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAvLyB0cF9uZXcKKyAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9mcmVlCit9OworCitzdGF0aWMgdm9pZCBDRmllbGREZXNjcmlwdG9yRGVhbGxvYyhDRmllbGREZXNjcmlwdG9yKiBzZWxmKSB7CisgIFB5X0RFQ1JFRihzZWxmLT5mdWxsX25hbWUpOworICBQeV9ERUNSRUYoc2VsZi0+bmFtZSk7CisgIFB5X0RFQ1JFRihzZWxmLT5jcHBfdHlwZSk7CisgIFB5X0RFQ1JFRihzZWxmLT5sYWJlbCk7CisgIFB5X0RFQ1JFRihzZWxmLT5pZCk7CisgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBQeU9iamVjdF9IRUFECisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wqIHBvb2w7Cit9IENEZXNjcmlwdG9yUG9vbDsKKworc3RhdGljIHZvaWQgQ0Rlc2NyaXB0b3JQb29sRGVhbGxvYyhDRGVzY3JpcHRvclBvb2wqIHNlbGYpOworCitzdGF0aWMgUHlPYmplY3QqIENEZXNjcmlwdG9yUG9vbF9OZXdDRGVzY3JpcHRvcigKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3IgPSBQeU9iamVjdF9OZXcoCisgICAgICBDRmllbGREZXNjcmlwdG9yLCAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlKTsKKyAgaWYgKGNmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciA9IGZpZWxkX2Rlc2NyaXB0b3I7CisKKyAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCisgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgY2ZpZWxkX2Rlc2NyaXB0b3ItPm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAorICAgICAgZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOworICBjZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUgPSBQeUxvbmdfRnJvbUxvbmcoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7CisgIGNmaWVsZF9kZXNjcmlwdG9yLT5sYWJlbCA9IFB5TG9uZ19Gcm9tTG9uZyhmaWVsZF9kZXNjcmlwdG9yLT5sYWJlbCgpKTsKKyAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmlkID0gUHlMb25nX0Zyb21Wb2lkUHRyKGNmaWVsZF9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihjZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ0Rlc2NyaXB0b3JQb29sX0ZpbmRGaWVsZEJ5TmFtZSgKKyAgICBDRGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY29uc3QgY2hhciogZnVsbF9maWVsZF9uYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJnKTsKKyAgaWYgKGZ1bGxfZmllbGRfbmFtZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPSBOVUxMOworCisgIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLT5wb29sLT5GaW5kRmllbGRCeU5hbWUoZnVsbF9maWVsZF9uYW1lKTsKKworCisgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiQ291bGRuJ3QgZmluZCBmaWVsZCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICBmdWxsX2ZpZWxkX25hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIENEZXNjcmlwdG9yUG9vbF9OZXdDRGVzY3JpcHRvcihmaWVsZF9kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDRGVzY3JpcHRvclBvb2xfRmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICBDRGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY29uc3QgY2hhciogZnVsbF9maWVsZF9uYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJnKTsKKyAgaWYgKGZ1bGxfZmllbGRfbmFtZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgc2VsZi0+cG9vbC0+RmluZEV4dGVuc2lvbkJ5TmFtZShmdWxsX2ZpZWxkX25hbWUpOworICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkNvdWxkbid0IGZpbmQgZmllbGQgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgZnVsbF9maWVsZF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBDRGVzY3JpcHRvclBvb2xfTmV3Q0Rlc2NyaXB0b3IoZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBDRGVzY3JpcHRvclBvb2xNZXRob2RzW10gPSB7CisgIHsgQygiRmluZEZpZWxkQnlOYW1lIiksCisgICAgKFB5Q0Z1bmN0aW9uKUNEZXNjcmlwdG9yUG9vbF9GaW5kRmllbGRCeU5hbWUsCisgICAgTUVUSF9PLAorICAgIEMoIlNlYXJjaGVzIGZvciBhIGZpZWxkIGRlc2NyaXB0b3IgYnkgZnVsbCBuYW1lLiIpIH0sCisgIHsgQygiRmluZEV4dGVuc2lvbkJ5TmFtZSIpLAorICAgIChQeUNGdW5jdGlvbilDRGVzY3JpcHRvclBvb2xfRmluZEV4dGVuc2lvbkJ5TmFtZSwKKyAgICBNRVRIX08sCisgICAgQygiU2VhcmNoZXMgZm9yIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4iKSB9LAorICB7TlVMTH0KK307CisKK1B5VHlwZU9iamVjdCBDRGVzY3JpcHRvclBvb2xfVHlwZSA9IHsKKyAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgMCwKKyAgQygiZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLiIKKyAgICAiX25ldF9wcm90bzJfX19weXRob24uIgorICAgICJDRmllbGREZXNjcmlwdG9yIiksICAgICAgICAgICAgICAgLy8gdHBfbmFtZQorICBzaXplb2YoQ0Rlc2NyaXB0b3JQb29sKSwgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAoZGVzdHJ1Y3RvcilDRGVzY3JpcHRvclBvb2xEZWFsbG9jLCAgLy8gdHBfZGVhbGxvYworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKKyAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgIC8vIHRwX2ZsYWdzCisgIEMoIkEgRGVzY3JpcHRvciBQb29sIiksICAgICAgICAgICAgICAvLyB0cF9kb2MKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAorICBDRGVzY3JpcHRvclBvb2xNZXRob2RzLCAgICAgICAgICAgICAgLy8gdHBfbWV0aG9kcworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9iYXNlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX3NldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdG9mZnNldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAorICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgLy8gdHBfYWxsb2MKKyAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgIC8vIHRwX25ldworICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZnJlZQorfTsKKworc3RhdGljIHZvaWQgQ0Rlc2NyaXB0b3JQb29sRGVhbGxvYyhDRGVzY3JpcHRvclBvb2wqIHNlbGYpIHsKKyAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZikpOworfQorCitnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbCogR2V0RGVzY3JpcHRvclBvb2woKSB7CisgIGlmIChnX2Rlc2NyaXB0b3JfcG9vbCA9PSBOVUxMKSB7CisgICAgZ19kZXNjcmlwdG9yX3Bvb2wgPSBuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2woCisgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKKyAgfQorICByZXR1cm4gZ19kZXNjcmlwdG9yX3Bvb2w7Cit9CisKK1B5T2JqZWN0KiBQeXRob25fTmV3Q0Rlc2NyaXB0b3JQb29sKFB5T2JqZWN0KiBpZ25vcmVkLCBQeU9iamVjdCogYXJncykgeworICBDRGVzY3JpcHRvclBvb2wqIGNkZXNjcmlwdG9yX3Bvb2wgPSBQeU9iamVjdF9OZXcoCisgICAgICBDRGVzY3JpcHRvclBvb2wsICZDRGVzY3JpcHRvclBvb2xfVHlwZSk7CisgIGlmIChjZGVzY3JpcHRvcl9wb29sID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZGVzY3JpcHRvcl9wb29sLT5wb29sID0gR2V0RGVzY3JpcHRvclBvb2woKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihjZGVzY3JpcHRvcl9wb29sKTsKK30KKworUHlPYmplY3QqIFB5dGhvbl9CdWlsZEZpbGUoUHlPYmplY3QqIGlnbm9yZWQsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY2hhciogbWVzc2FnZV90eXBlOworICBQeV9zc2l6ZV90IG1lc3NhZ2VfbGVuOworCisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbWVzc2FnZV90eXBlLCAmbWVzc2FnZV9sZW4pIDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBpZiAoIWZpbGVfcHJvdG8uUGFyc2VGcm9tQXJyYXkobWVzc2FnZV90eXBlLCBtZXNzYWdlX2xlbikpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ291bGRuJ3QgcGFyc2UgZmlsZSBjb250ZW50ISIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5GaW5kRmlsZUJ5TmFtZSgKKyAgICAgIGZpbGVfcHJvdG8ubmFtZSgpKSAhPSBOVUxMKSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IEdldERlc2NyaXB0b3JQb29sKCktPkJ1aWxkRmlsZSgKKyAgICAgIGZpbGVfcHJvdG8pOworICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGJ1aWxkIHByb3RvIGZpbGUgaW50byBkZXNjcmlwdG9yIHBvb2whIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBQeV9SRVRVUk5fTk9ORTsKK30KKworYm9vbCBJbml0RGVzY3JpcHRvcigpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICBpZiAoUHlUeXBlX1JlYWR5KCZDRmllbGREZXNjcmlwdG9yX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ0Rlc2NyaXB0b3JQb29sX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgIGlmIChQeVR5cGVfUmVhZHkoJkNEZXNjcmlwdG9yUG9vbF9UeXBlKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzI2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuaApAQCAtMCwwICsxLDg3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHBldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdikKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0RFU0NSSVBUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fREVTQ1JJUFRPUl9IX18KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPHN0cnVjdG1lbWJlci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCAmJiAhZGVmaW5lZChQWV9TU0laRV9UX01JTikKK3R5cGVkZWYgaW50IFB5X3NzaXplX3Q7CisjZGVmaW5lIFBZX1NTSVpFX1RfTUFYIElOVF9NQVgKKyNkZWZpbmUgUFlfU1NJWkVfVF9NSU4gSU5UX01JTgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCit0eXBlZGVmIHN0cnVjdCB7CisgIFB5T2JqZWN0X0hFQUQKKworICAvLyBUaGUgcHJvdG8yIGRlc2NyaXB0b3IgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7CisKKyAgLy8gRnVsbCBuYW1lIG9mIHRoZSBmaWVsZCAoUHlTdHJpbmcpLgorICBQeU9iamVjdCogZnVsbF9uYW1lOworCisgIC8vIE5hbWUgb2YgdGhlIGZpZWxkIChQeVN0cmluZykuCisgIFB5T2JqZWN0KiBuYW1lOworCisgIC8vIEMrKyB0eXBlIG9mIHRoZSBmaWVsZCAoUHlMb25nKS4KKyAgUHlPYmplY3QqIGNwcF90eXBlOworCisgIC8vIE5hbWUgb2YgdGhlIGZpZWxkIChQeUxvbmcpLgorICBQeU9iamVjdCogbGFiZWw7CisKKyAgLy8gSWRlbnRpdHkgb2YgdGhlIGRlc2NyaXB0b3IgKFB5TG9uZyB1c2VkIGFzIGEgcG9pbmVyKS4KKyAgUHlPYmplY3QqIGlkOworfSBDRmllbGREZXNjcmlwdG9yOworCitleHRlcm4gUHlUeXBlT2JqZWN0IENGaWVsZERlc2NyaXB0b3JfVHlwZTsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBDRGVzY3JpcHRvclBvb2xfVHlwZTsKKworCitQeU9iamVjdCogUHl0aG9uX05ld0NEZXNjcmlwdG9yUG9vbChQeU9iamVjdCogaWdub3JlZCwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIFB5dGhvbl9CdWlsZEZpbGUoUHlPYmplY3QqIGlnbm9yZWQsIFB5T2JqZWN0KiBhcmdzKTsKK2Jvb2wgSW5pdERlc2NyaXB0b3IoKTsKK2dvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKiBHZXREZXNjcmlwdG9yUG9vbCgpOworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0RFU0NSSVBUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFhYjVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5jYwpAQCAtMCwwICsxLDYzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHFyY3pha0Bnb29nbGUuY29tIChNYXJjaW4gS293YWxjenlrKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworc3RhdGljIGNvbnN0IE1lc3NhZ2UqIEdldENQcm90b0luc2lkZVB5UHJvdG9TdHViKFB5T2JqZWN0KiBtc2cpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgTWVzc2FnZSogTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9TdHViKFB5T2JqZWN0KiBtc2cpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFRoaXMgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGRlZmF1bHQsIHN0dWIgaW1wbGVtZW50YXRpb24uCisvLyBJZiBweXRob24tZ29vZ2xlLnByb3RvYnVmLmNjIGlzIGxvYWRlZCwgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgb3ZlcnJpZGRlbgorLy8gd2l0aCBhIGZ1bGwgaW1wbGVtZW50YXRpb24uCitjb25zdCBNZXNzYWdlKiAoKkdldENQcm90b0luc2lkZVB5UHJvdG9QdHIpKFB5T2JqZWN0KiBtc2cpID0KKyAgICBHZXRDUHJvdG9JbnNpZGVQeVByb3RvU3R1YjsKK01lc3NhZ2UqICgqTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9QdHIpKFB5T2JqZWN0KiBtc2cpID0KKyAgICBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1N0dWI7CisKK2NvbnN0IE1lc3NhZ2UqIEdldENQcm90b0luc2lkZVB5UHJvdG8oUHlPYmplY3QqIG1zZykgeworICByZXR1cm4gR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cihtc2cpOworfQorTWVzc2FnZSogTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG8oUHlPYmplY3QqIG1zZykgeworICByZXR1cm4gTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9QdHIobXNnKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMGIxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcHJvdG9idWYuaApAQCAtMCwwICsxLDU3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHFyY3pha0Bnb29nbGUuY29tIChNYXJjaW4gS293YWxjenlrKQorLy8KKy8vIFRoaXMgbW9kdWxlIGV4cG9zZXMgdGhlIEMgcHJvdG8gaW5zaWRlIHRoZSBnaXZlbiBQeXRob24gcHJvdG8sIGluCisvLyBjYXNlIHRoZSBQeXRob24gcHJvdG8gaXMgaW1wbGVtZW50ZWQgd2l0aCBhIEMgcHJvdG8uCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QWVRIT05fUFJPVE9CVUZfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fUFlUSE9OX1BST1RPQlVGX0hfXworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgQyBwcm90byBpbnNpZGUgdGhlIGdpdmVuIFB5dGhvbiBwcm90bywKKy8vIG9yIE5VTEwgd2hlbiB0aGlzIGlzIG5vdCBhIFB5dGhvbiBwcm90byBpbXBsZW1lbnRlZCB3aXRoIGEgQyBwcm90by4KK2NvbnN0IE1lc3NhZ2UqIEdldENQcm90b0luc2lkZVB5UHJvdG8oUHlPYmplY3QqIG1zZyk7CitNZXNzYWdlKiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKTsKKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QWVRIT05fUFJPVE9CVUZfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1NzBmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weQpAQCAtMCwwICsxLDE2OSBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgVGhpcyBjb2RlIGlzIG1lYW50IHRvIHdvcmsgb24gUHl0aG9uIDIuNCBhbmQgYWJvdmUgb25seS4KKworIiIiQ29udGFpbnMgYSBtZXRhY2xhc3MgYW5kIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBjcmVhdGUKK3Byb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBmcm9tIERlc2NyaXB0b3Igb2JqZWN0cyBhdCBydW50aW1lLgorCitSZWNhbGwgdGhhdCBhIG1ldGFjbGFzcyBpcyB0aGUgInR5cGUiIG9mIGEgY2xhc3MuCisoQSBjbGFzcyBpcyB0byBhIG1ldGFjbGFzcyB3aGF0IGFuIGluc3RhbmNlIGlzIHRvIGEgY2xhc3MuKQorCitJbiB0aGlzIGNhc2UsIHdlIHVzZSB0aGUgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSBtZXRhY2xhc3MKK3RvIGluamVjdCBhbGwgdGhlIHVzZWZ1bCBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzZXMKK291dHB1dCBieSB0aGUgcHJvdG9jb2wgY29tcGlsZXIgYXQgY29tcGlsZS10aW1lLgorCitUaGUgdXBzaG90IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24KK2RldGFpbHMgZm9yIEFMTCBwdXJlLVB5dGhvbiBwcm90b2NvbCBidWZmZXJzIGFyZSAqaGVyZSBpbgordGhpcyBmaWxlKi4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIGRlc2NyaXB0b3JfbW9kCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQorCitfRmllbGREZXNjcmlwdG9yID0gZGVzY3JpcHRvcl9tb2QuRmllbGREZXNjcmlwdG9yCisKKworaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJzoKKyAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlZlcnNpb24oKSA9PSAyOgorICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmNwcCBpbXBvcnQgY3BwX21lc3NhZ2UKKyAgICBfTmV3TWVzc2FnZSA9IGNwcF9tZXNzYWdlLk5ld01lc3NhZ2UKKyAgICBfSW5pdE1lc3NhZ2UgPSBjcHBfbWVzc2FnZS5Jbml0TWVzc2FnZQorICBlbHNlOgorICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBjcHBfbWVzc2FnZQorICAgIF9OZXdNZXNzYWdlID0gY3BwX21lc3NhZ2UuTmV3TWVzc2FnZQorICAgIF9Jbml0TWVzc2FnZSA9IGNwcF9tZXNzYWdlLkluaXRNZXNzYWdlCitlbHNlOgorICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgcHl0aG9uX21lc3NhZ2UKKyAgX05ld01lc3NhZ2UgPSBweXRob25fbWVzc2FnZS5OZXdNZXNzYWdlCisgIF9Jbml0TWVzc2FnZSA9IHB5dGhvbl9tZXNzYWdlLkluaXRNZXNzYWdlCisKKworY2xhc3MgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSh0eXBlKToKKworICAiIiJNZXRhY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBEZXNjcmlwdG9ycy4KKworICBXZSBhZGQgaW1wbGVtZW50YXRpb25zIGZvciBhbGwgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIE1lc3NhZ2UgY2xhc3MuICBXZQorICBhbHNvIGNyZWF0ZSBwcm9wZXJ0aWVzIHRvIGFsbG93IGdldHRpbmcvc2V0dGluZyBhbGwgZmllbGRzIGluIHRoZSBwcm90b2NvbAorICBtZXNzYWdlLiAgRmluYWxseSwgd2UgY3JlYXRlIHNsb3RzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSBhY2NpZGVudGFsbHkKKyAgInNldHRpbmciIG5vbmV4aXN0ZW50IGZpZWxkcyBpbiB0aGUgcHJvdG9jb2wgbWVzc2FnZSwgd2hpY2ggdGhlbiB3b3VsZG4ndCBnZXQKKyAgc2VyaWFsaXplZCAvIGRlc2VyaWFsaXplZCBwcm9wZXJseS4KKworICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY3VycmVudGx5IHVzZXMgdGhpcyBtZXRhY2xhc3MgdG8gY3JlYXRlIHByb3RvY29sCisgIG1lc3NhZ2UgY2xhc3NlcyBhdCBydW50aW1lLiAgQ2xpZW50cyBjYW4gYWxzbyBtYW51YWxseSBjcmVhdGUgdGhlaXIgb3duCisgIGNsYXNzZXMgYXQgcnVudGltZSwgYXMgaW4gdGhpcyBleGFtcGxlOgorCisgIG15ZGVzY3JpcHRvciA9IERlc2NyaXB0b3IoLi4uLi4pCisgIGNsYXNzIE15UHJvdG9DbGFzcyhNZXNzYWdlKToKKyAgICBfX21ldGFjbGFzc19fID0gR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICAgIERFU0NSSVBUT1IgPSBteWRlc2NyaXB0b3IKKyAgbXlwcm90b19pbnN0YW5jZSA9IE15UHJvdG9DbGFzcygpCisgIG15cHJvdG8uZm9vX2ZpZWxkID0gMjMKKyAgLi4uCisgICIiIgorCisgICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHByb3RvY29sLWNvbXBpbGVyIGNvZGUgaW4KKyAgIyBwcm90bzIvY29tcGlsZXIvaW50ZXJuYWwvZ2VuZXJhdG9yLiouCisgIF9ERVNDUklQVE9SX0tFWSA9ICdERVNDUklQVE9SJworCisgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgorICAgICIiIkN1c3RvbSBhbGxvY2F0aW9uIGZvciBydW50aW1lLWdlbmVyYXRlZCBjbGFzcyB0eXBlcy4KKworICAgIFdlIG92ZXJyaWRlIF9fbmV3X18gYmVjYXVzZSB0aGlzIGlzIGFwcGFyZW50bHkgdGhlIG9ubHkgcGxhY2UKKyAgICB3aGVyZSB3ZSBjYW4gbWVhbmluZ2Z1bGx5IHNldCBfX3Nsb3RzX18gb24gdGhlIGNsYXNzIHdlJ3JlIGNyZWF0aW5nKD8pLgorICAgIChUaGUgaW50ZXJwbGF5IGJldHdlZW4gbWV0YWNsYXNzZXMgYW5kIHNsb3RzIGlzIG5vdCB2ZXJ5IHdlbGwtZG9jdW1lbnRlZCkuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogTmFtZSBvZiB0aGUgY2xhc3MgKGlnbm9yZWQsIGJ1dCByZXF1aXJlZCBieSB0aGUKKyAgICAgICAgbWV0YWNsYXNzIHByb3RvY29sKS4KKyAgICAgIGJhc2VzOiBCYXNlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KKyAgICAgICAgKFNob3VsZCBiZSBtZXNzYWdlLk1lc3NhZ2UpLiAgV2UgaWdub3JlIHRoaXMgZmllbGQsIGJ1dAorICAgICAgICBpdCdzIHJlcXVpcmVkIGJ5IHRoZSBtZXRhY2xhc3MgcHJvdG9jb2wKKyAgICAgIGRpY3Rpb25hcnk6IFRoZSBjbGFzcyBkaWN0aW9uYXJ5IG9mIHRoZSBjbGFzcyB3ZSdyZQorICAgICAgICBjb25zdHJ1Y3RpbmcuICBkaWN0aW9uYXJ5W19ERVNDUklQVE9SX0tFWV0gbXVzdCBjb250YWluCisgICAgICAgIGEgRGVzY3JpcHRvciBvYmplY3QgZGVzY3JpYmluZyB0aGlzIHByb3RvY29sIG1lc3NhZ2UKKyAgICAgICAgdHlwZS4KKworICAgIFJldHVybnM6CisgICAgICBOZXdseS1hbGxvY2F0ZWQgY2xhc3MuCisgICAgIiIiCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZS5fREVTQ1JJUFRPUl9LRVldCisgICAgYmFzZXMgPSBfTmV3TWVzc2FnZShiYXNlcywgZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKKyAgICBzdXBlcmNsYXNzID0gc3VwZXIoR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSwgY2xzKQorCisgICAgbmV3X2NsYXNzID0gc3VwZXJjbGFzcy5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpCisgICAgc2V0YXR0cihkZXNjcmlwdG9yLCAnX2NvbmNyZXRlX2NsYXNzJywgbmV3X2NsYXNzKQorICAgIHJldHVybiBuZXdfY2xhc3MKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6CisgICAgIiIiSGVyZSB3ZSBwZXJmb3JtIHRoZSBtYWpvcml0eSBvZiBvdXIgd29yayBvbiB0aGUgY2xhc3MuCisgICAgV2UgYWRkIGVudW0gZ2V0dGVycywgYW4gX19pbml0X18gbWV0aG9kLCBpbXBsZW1lbnRhdGlvbnMKKyAgICBvZiBhbGwgTWVzc2FnZSBtZXRob2RzLCBhbmQgcHJvcGVydGllcyBmb3IgYWxsIGZpZWxkcworICAgIGluIHRoZSBwcm90b2NvbCB0eXBlLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IE5hbWUgb2YgdGhlIGNsYXNzIChpZ25vcmVkLCBidXQgcmVxdWlyZWQgYnkgdGhlCisgICAgICAgIG1ldGFjbGFzcyBwcm90b2NvbCkuCisgICAgICBiYXNlczogQmFzZSBjbGFzc2VzIG9mIHRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCisgICAgICAgIChTaG91bGQgYmUgbWVzc2FnZS5NZXNzYWdlKS4gIFdlIGlnbm9yZSB0aGlzIGZpZWxkLCBidXQKKyAgICAgICAgaXQncyByZXF1aXJlZCBieSB0aGUgbWV0YWNsYXNzIHByb3RvY29sCisgICAgICBkaWN0aW9uYXJ5OiBUaGUgY2xhc3MgZGljdGlvbmFyeSBvZiB0aGUgY2xhc3Mgd2UncmUKKyAgICAgICAgY29uc3RydWN0aW5nLiAgZGljdGlvbmFyeVtfREVTQ1JJUFRPUl9LRVldIG11c3QgY29udGFpbgorICAgICAgICBhIERlc2NyaXB0b3Igb2JqZWN0IGRlc2NyaWJpbmcgdGhpcyBwcm90b2NvbCBtZXNzYWdlCisgICAgICAgIHR5cGUuCisgICAgIiIiCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZS5fREVTQ1JJUFRPUl9LRVldCisgICAgX0luaXRNZXNzYWdlKGRlc2NyaXB0b3IsIGNscykKKyAgICBzdXBlcmNsYXNzID0gc3VwZXIoR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSwgY2xzKQorICAgIHN1cGVyY2xhc3MuX19pbml0X18obmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpCisKKworZGVmIFBhcnNlTWVzc2FnZShkZXNjcmlwdG9yLCBieXRlX3N0cik6CisgICIiIkdlbmVyYXRlIGEgbmV3IE1lc3NhZ2UgaW5zdGFuY2UgZnJvbSB0aGlzIERlc2NyaXB0b3IgYW5kIGEgYnl0ZSBzdHJpbmcuCisKKyAgQXJnczoKKyAgICBkZXNjcmlwdG9yOiBQcm90b2J1ZiBEZXNjcmlwdG9yIG9iamVjdAorICAgIGJ5dGVfc3RyOiBTZXJpYWxpemVkIHByb3RvY29sIGJ1ZmZlciBieXRlIHN0cmluZworCisgIFJldHVybnM6CisgICAgTmV3bHkgY3JlYXRlZCBwcm90b2J1ZiBNZXNzYWdlIG9iamVjdC4KKyAgIiIiCisKKyAgY2xhc3MgX1Jlc3VsdENsYXNzKG1lc3NhZ2UuTWVzc2FnZSk6CisgICAgX19tZXRhY2xhc3NfXyA9IEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgICBERVNDUklQVE9SID0gZGVzY3JpcHRvcgorCisgIG5ld19tc2cgPSBfUmVzdWx0Q2xhc3MoKQorICBuZXdfbXNnLlBhcnNlRnJvbVN0cmluZyhieXRlX3N0cikKKyAgcmV0dXJuIG5ld19tc2cKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTgwYjcwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLnB5CkBAIC0wLDAgKzEsMjI2IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiREVQUkVDQVRFRDogIERlY2xhcmVzIHRoZSBSUEMgc2VydmljZSBpbnRlcmZhY2VzLgorCitUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYWJzdHJhY3QgaW50ZXJmYWNlcyB1bmRlcmx5aW5nIHByb3RvMiBSUEMKK3NlcnZpY2VzLiAgVGhlc2UgYXJlIGludGVuZGVkIHRvIGJlIGluZGVwZW5kZW50IG9mIGFueSBwYXJ0aWN1bGFyIFJQQworaW1wbGVtZW50YXRpb24sIHNvIHRoYXQgcHJvdG8yIHNlcnZpY2VzIGNhbiBiZSB1c2VkIG9uIHRvcCBvZiBhIHZhcmlldHkKK29mIGltcGxlbWVudGF0aW9ucy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQKK25vdCB0cnkgdG8gYnVpbGQgb24gdGhlc2UsIGJ1dCBzaG91bGQgaW5zdGVhZCBwcm92aWRlIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMKK3doaWNoIGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgUlBDIGltcGxlbWVudGF0aW9uLiAgVGhpcyB3YXkKK3RoZSBnZW5lcmF0ZWQgY29kZSBjYW4gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGluIHVzZQorYW5kIGNhbiBhdm9pZCB1bm5lY2Vzc2FyeSBsYXllcnMgb2YgaW5kaXJlY3Rpb24uCisiIiIKKworX19hdXRob3JfXyA9ICdwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpJworCisKK2NsYXNzIFJwY0V4Y2VwdGlvbihFeGNlcHRpb24pOgorICAiIiJFeGNlcHRpb24gcmFpc2VkIG9uIGZhaWxlZCBibG9ja2luZyBSUEMgbWV0aG9kIGNhbGwuIiIiCisgIHBhc3MKKworCitjbGFzcyBTZXJ2aWNlKG9iamVjdCk6CisKKyAgIiIiQWJzdHJhY3QgYmFzZSBpbnRlcmZhY2UgZm9yIHByb3RvY29sLWJ1ZmZlci1iYXNlZCBSUEMgc2VydmljZXMuCisKKyAgU2VydmljZXMgdGhlbXNlbHZlcyBhcmUgYWJzdHJhY3QgY2xhc3NlcyAoaW1wbGVtZW50ZWQgZWl0aGVyIGJ5IHNlcnZlcnMgb3IgYXMKKyAgc3R1YnMpLCBidXQgdGhleSBzdWJjbGFzcyB0aGlzIGJhc2UgaW50ZXJmYWNlLiBUaGUgbWV0aG9kcyBvZiB0aGlzCisgIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBjYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzZXJ2aWNlIHdpdGhvdXQga25vd2luZworICBpdHMgZXhhY3QgdHlwZSBhdCBjb21waWxlIHRpbWUgKGFuYWxvZ291cyB0byB0aGUgTWVzc2FnZSBpbnRlcmZhY2UpLgorICAiIiIKKworICBkZWYgR2V0RGVzY3JpcHRvcigpOgorICAgICIiIlJldHJpZXZlcyB0aGlzIHNlcnZpY2UncyBkZXNjcmlwdG9yLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgQ2FsbE1ldGhvZChzZWxmLCBtZXRob2RfZGVzY3JpcHRvciwgcnBjX2NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgIHJlcXVlc3QsIGRvbmUpOgorICAgICIiIkNhbGxzIGEgbWV0aG9kIG9mIHRoZSBzZXJ2aWNlIHNwZWNpZmllZCBieSBtZXRob2RfZGVzY3JpcHRvci4KKworICAgIElmICJkb25lIiBpcyBOb25lIHRoZW4gdGhlIGNhbGwgaXMgYmxvY2tpbmcgYW5kIHRoZSByZXNwb25zZQorICAgIG1lc3NhZ2Ugd2lsbCBiZSByZXR1cm5lZCBkaXJlY3RseS4gIE90aGVyd2lzZSB0aGUgY2FsbCBpcyBhc3luY2hyb25vdXMKKyAgICBhbmQgImRvbmUiIHdpbGwgbGF0ZXIgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3BvbnNlIHZhbHVlLgorCisgICAgSW4gdGhlIGJsb2NraW5nIGNhc2UsIFJwY0V4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBvbiBlcnJvci4KKworICAgIFByZWNvbmRpdGlvbnM6CisgICAgKiBtZXRob2RfZGVzY3JpcHRvci5zZXJ2aWNlID09IEdldERlc2NyaXB0b3IKKyAgICAqIHJlcXVlc3QgaXMgb2YgdGhlIGV4YWN0IHNhbWUgY2xhc3NlcyBhcyByZXR1cm5lZCBieQorICAgICAgR2V0UmVxdWVzdENsYXNzKG1ldGhvZCkuCisgICAgKiBBZnRlciB0aGUgY2FsbCBoYXMgc3RhcnRlZCwgdGhlIHJlcXVlc3QgbXVzdCBub3QgYmUgbW9kaWZpZWQuCisgICAgKiAicnBjX2NvbnRyb2xsZXIiIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoZSBSUEMgaW1wbGVtZW50YXRpb24gYmVpbmcKKyAgICAgIHVzZWQgYnkgdGhpcyBTZXJ2aWNlLiAgRm9yIHN0dWJzLCB0aGUgImNvcnJlY3QgdHlwZSIgZGVwZW5kcyBvbiB0aGUKKyAgICAgIFJwY0NoYW5uZWwgd2hpY2ggdGhlIHN0dWIgaXMgdXNpbmcuCisKKyAgICBQb3N0Y29uZGl0aW9uczoKKyAgICAqICJkb25lIiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXRob2QgaXMgY29tcGxldGUuICBUaGlzIG1heSBiZQorICAgICAgYmVmb3JlIENhbGxNZXRob2QoKSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgICAgKiBJZiB0aGUgUlBDIGZhaWxlZCwgdGhlIHJlc3BvbnNlIHZhbHVlIHBhc3NlZCB0byAiZG9uZSIgd2lsbCBiZSBOb25lLgorICAgICAgRnVydGhlciBkZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlIGNhbiBiZSBmb3VuZCBieSBxdWVyeWluZyB0aGUKKyAgICAgIFJwY0NvbnRyb2xsZXIuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBHZXRSZXF1ZXN0Q2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgorCisgICAgQ2FsbE1ldGhvZCgpIHJlcXVpcmVzIHRoYXQgdGhlIHJlcXVlc3QgaXMgb2YgYSBwYXJ0aWN1bGFyIHN1YmNsYXNzIG9mCisgICAgTWVzc2FnZS4gR2V0UmVxdWVzdENsYXNzKCkgZ2V0cyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIHJlcXVpcmVkCisgICAgdHlwZS4KKworICAgIEV4YW1wbGU6CisgICAgICBtZXRob2QgPSBzZXJ2aWNlLkdldERlc2NyaXB0b3IoKS5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKQorICAgICAgcmVxdWVzdCA9IHN0dWIuR2V0UmVxdWVzdENsYXNzKG1ldGhvZCkoKQorICAgICAgcmVxdWVzdC5QYXJzZUZyb21TdHJpbmcoaW5wdXQpCisgICAgICBzZXJ2aWNlLkNhbGxNZXRob2QobWV0aG9kLCByZXF1ZXN0LCBjYWxsYmFjaykKKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIEdldFJlc3BvbnNlQ2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KKworICAgIFRoaXMgbWV0aG9kIGlzbid0IHJlYWxseSBuZWVkZWQsIGFzIHRoZSBScGNDaGFubmVsJ3MgQ2FsbE1ldGhvZCBjb25zdHJ1Y3RzCisgICAgdGhlIHJlc3BvbnNlIHByb3RvY29sIG1lc3NhZ2UuIEl0J3MgcHJvdmlkZWQgYW55d2F5IGluIGNhc2UgaXQgaXMgdXNlZnVsCisgICAgZm9yIHRoZSBjYWxsZXIgdG8ga25vdyB0aGUgcmVzcG9uc2UgdHlwZSBpbiBhZHZhbmNlLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBScGNDb250cm9sbGVyKG9iamVjdCk6CisKKyAgIiIiQW4gUnBjQ29udHJvbGxlciBtZWRpYXRlcyBhIHNpbmdsZSBtZXRob2QgY2FsbC4KKworICBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZSBjb250cm9sbGVyIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gbWFuaXB1bGF0ZQorICBzZXR0aW5ncyBzcGVjaWZpYyB0byB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGFuZCB0byBmaW5kIG91dCBhYm91dCBSUEMtbGV2ZWwKKyAgZXJyb3JzLiBUaGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgUnBjQ29udHJvbGxlciBpbnRlcmZhY2UgYXJlIGludGVuZGVkCisgIHRvIGJlIGEgImxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciIgc2V0IG9mIGZlYXR1cmVzIHdoaWNoIHdlIGV4cGVjdCBhbGwKKyAgaW1wbGVtZW50YXRpb25zIHRvIHN1cHBvcnQuICBTcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUgbW9yZQorICBhZHZhbmNlZCBmZWF0dXJlcyAoZS5nLiBkZWFkbGluZSBwcm9wYWdhdGlvbikuCisgICIiIgorCisgICMgQ2xpZW50LXNpZGUgbWV0aG9kcyBiZWxvdworCisgIGRlZiBSZXNldChzZWxmKToKKyAgICAiIiJSZXNldHMgdGhlIFJwY0NvbnRyb2xsZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuCisKKyAgICBBZnRlciB0aGUgUnBjQ29udHJvbGxlciBoYXMgYmVlbiByZXNldCwgaXQgbWF5IGJlIHJldXNlZCBpbgorICAgIGEgbmV3IGNhbGwuIE11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSBhbiBSUEMgaXMgaW4gcHJvZ3Jlc3MuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBGYWlsZWQoc2VsZik6CisgICAgIiIiUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZhaWxlZC4KKworICAgIEFmdGVyIGEgY2FsbCBoYXMgZmluaXNoZWQsIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbCBmYWlsZWQuICBUaGUgcG9zc2libGUKKyAgICByZWFzb25zIGZvciBmYWlsdXJlIGRlcGVuZCBvbiB0aGUgUlBDIGltcGxlbWVudGF0aW9uLiAgRmFpbGVkKCkgbXVzdCBub3QKKyAgICBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCBoYXMgZmluaXNoZWQuICBJZiBGYWlsZWQoKSByZXR1cm5zIHRydWUsIHRoZQorICAgIGNvbnRlbnRzIG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIGFyZSB1bmRlZmluZWQuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBFcnJvclRleHQoc2VsZik6CisgICAgIiIiSWYgRmFpbGVkIGlzIHRydWUsIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBTdGFydENhbmNlbChzZWxmKToKKyAgICAiIiJJbml0aWF0ZSBjYW5jZWxsYXRpb24uCisKKyAgICBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCisgICAgY2FuY2VsZWQuICBUaGUgUlBDIHN5c3RlbSBtYXkgY2FuY2VsIGl0IGltbWVkaWF0ZWx5LCBtYXkgd2FpdCBhd2hpbGUgYW5kCisgICAgdGhlbiBjYW5jZWwgaXQsIG9yIG1heSBub3QgZXZlbiBjYW5jZWwgdGhlIGNhbGwgYXQgYWxsLiAgSWYgdGhlIGNhbGwgaXMKKyAgICBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKKyAgICB3aWxsIGluZGljYXRlIHRoYXQgdGhlIGNhbGwgZmFpbGVkIGF0IHRoYXQgdGltZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgIyBTZXJ2ZXItc2lkZSBtZXRob2RzIGJlbG93CisKKyAgZGVmIFNldEZhaWxlZChzZWxmLCByZWFzb24pOgorICAgICIiIlNldHMgYSBmYWlsdXJlIHJlYXNvbi4KKworICAgIENhdXNlcyBGYWlsZWQoKSB0byByZXR1cm4gdHJ1ZSBvbiB0aGUgY2xpZW50IHNpZGUuICAicmVhc29uIiB3aWxsIGJlCisgICAgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG1lc3NhZ2UgcmV0dXJuZWQgYnkgRXJyb3JUZXh0KCkuICBJZiB5b3UgZmluZAorICAgIHlvdSBuZWVkIHRvIHJldHVybiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGFib3V0IGZhaWx1cmVzLCB5b3UKKyAgICBzaG91bGQgaW5jb3Jwb3JhdGUgaXQgaW50byB5b3VyIHJlc3BvbnNlIHByb3RvY29sIGJ1ZmZlciBhbmQgc2hvdWxkCisgICAgTk9UIGNhbGwgU2V0RmFpbGVkKCkuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBJc0NhbmNlbGVkKHNlbGYpOgorICAgICIiIkNoZWNrcyBpZiB0aGUgY2xpZW50IGNhbmNlbGxlZCB0aGUgUlBDLgorCisgICAgSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBjYW5jZWxlZCB0aGUgUlBDLCBzbyB0aGUgc2VydmVyIG1heQorICAgIGFzIHdlbGwgZ2l2ZSB1cCBvbiByZXBseWluZyB0byBpdC4gIFRoZSBzZXJ2ZXIgc2hvdWxkIHN0aWxsIGNhbGwgdGhlCisgICAgZmluYWwgImRvbmUiIGNhbGxiYWNrLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgTm90aWZ5T25DYW5jZWwoc2VsZiwgY2FsbGJhY2spOgorICAgICIiIlNldHMgYSBjYWxsYmFjayB0byBpbnZva2Ugb24gY2FuY2VsLgorCisgICAgQXNrcyB0aGF0IHRoZSBnaXZlbiBjYWxsYmFjayBiZSBjYWxsZWQgd2hlbiB0aGUgUlBDIGlzIGNhbmNlbGVkLiAgVGhlCisgICAgY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4gIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQKKyAgICBiZWluZyBjYW5jZWxlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGNvbXBsZXRpb24uICBJZiB0aGUgUlBDCisgICAgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxlZCB3aGVuIE5vdGlmeU9uQ2FuY2VsKCkgaXMgY2FsbGVkLCB0aGUgY2FsbGJhY2sKKyAgICB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseS4KKworICAgIE5vdGlmeU9uQ2FuY2VsKCkgbXVzdCBiZSBjYWxsZWQgbm8gbW9yZSB0aGFuIG9uY2UgcGVyIHJlcXVlc3QuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIFJwY0NoYW5uZWwob2JqZWN0KToKKworICAiIiJBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIFJQQyBjaGFubmVsLgorCisgIEFuIFJwY0NoYW5uZWwgcmVwcmVzZW50cyBhIGNvbW11bmljYXRpb24gbGluZSB0byBhIHNlcnZpY2Ugd2hpY2ggY2FuIGJlIHVzZWQKKyAgdG8gY2FsbCB0aGF0IHNlcnZpY2UncyBtZXRob2RzLiAgVGhlIHNlcnZpY2UgbWF5IGJlIHJ1bm5pbmcgb24gYW5vdGhlcgorICBtYWNoaW5lLiBOb3JtYWxseSwgeW91IHNob3VsZCBub3QgdXNlIGFuIFJwY0NoYW5uZWwgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkCisgIGNvbnN0cnVjdCBhIHN0dWIge0BsaW5rIFNlcnZpY2V9IHdyYXBwaW5nIGl0LiAgRXhhbXBsZToKKworICBFeGFtcGxlOgorICAgIFJwY0NoYW5uZWwgY2hhbm5lbCA9IHJwY0ltcGwuQ2hhbm5lbCgicmVtb3RlaG9zdC5leGFtcGxlLmNvbToxMjM0IikKKyAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBycGNJbXBsLkNvbnRyb2xsZXIoKQorICAgIE15U2VydmljZSBzZXJ2aWNlID0gTXlTZXJ2aWNlX1N0dWIoY2hhbm5lbCkKKyAgICBzZXJ2aWNlLk15TWV0aG9kKGNvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKQorICAiIiIKKworICBkZWYgQ2FsbE1ldGhvZChzZWxmLCBtZXRob2RfZGVzY3JpcHRvciwgcnBjX2NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlX2NsYXNzLCBkb25lKToKKyAgICAiIiJDYWxscyB0aGUgbWV0aG9kIGlkZW50aWZpZWQgYnkgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlLiAgVGhlIHNpZ25hdHVyZSBvZiB0aGlzCisgICAgcHJvY2VkdXJlIGxvb2tzIHRoZSBzYW1lIGFzIFNlcnZpY2UuQ2FsbE1ldGhvZCgpLCBidXQgdGhlIHJlcXVpcmVtZW50cworICAgIGFyZSBsZXNzIHN0cmljdCBpbiBvbmUgaW1wb3J0YW50IHdheTogIHRoZSByZXF1ZXN0IG9iamVjdCBkb2Vzbid0IGhhdmUgdG8KKyAgICBiZSBvZiBhbnkgc3BlY2lmaWMgY2xhc3MgYXMgbG9uZyBhcyBpdHMgZGVzY3JpcHRvciBpcyBtZXRob2QuaW5wdXRfdHlwZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2VfcmVmbGVjdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NTFlODNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2VfcmVmbGVjdGlvbi5weQpAQCAtMCwwICsxLDI4NCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnRhaW5zIG1ldGFjbGFzc2VzIHVzZWQgdG8gY3JlYXRlIHByb3RvY29sIHNlcnZpY2UgYW5kIHNlcnZpY2Ugc3R1YgorY2xhc3NlcyBmcm9tIFNlcnZpY2VEZXNjcmlwdG9yIG9iamVjdHMgYXQgcnVudGltZS4KKworVGhlIEdlbmVyYXRlZFNlcnZpY2VUeXBlIGFuZCBHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUgbWV0YWNsYXNzZXMgYXJlIHVzZWQgdG8KK2luamVjdCBhbGwgdXNlZnVsIGZ1bmN0aW9uYWxpdHkgaW50byB0aGUgY2xhc3NlcyBvdXRwdXQgYnkgdGhlIHByb3RvY29sCitjb21waWxlciBhdCBjb21waWxlLXRpbWUuCisiIiIKKworX19hdXRob3JfXyA9ICdwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpJworCisKK2NsYXNzIEdlbmVyYXRlZFNlcnZpY2VUeXBlKHR5cGUpOgorCisgICIiIk1ldGFjbGFzcyBmb3Igc2VydmljZSBjbGFzc2VzIGNyZWF0ZWQgYXQgcnVudGltZSBmcm9tIFNlcnZpY2VEZXNjcmlwdG9ycy4KKworICBJbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgU2VydmljZSBjbGFzcyBhcmUgYWRkZWQgaGVyZQorICBieSB0aGlzIGNsYXNzLiBXZSBhbHNvIGNyZWF0ZSBwcm9wZXJ0aWVzIHRvIGFsbG93IGdldHRpbmcvc2V0dGluZyBhbGwgZmllbGRzCisgIGluIHRoZSBwcm90b2NvbCBtZXNzYWdlLgorCisgIFRoZSBwcm90b2NvbCBjb21waWxlciBjdXJyZW50bHkgdXNlcyB0aGlzIG1ldGFjbGFzcyB0byBjcmVhdGUgcHJvdG9jb2wgc2VydmljZQorICBjbGFzc2VzIGF0IHJ1bnRpbWUuIENsaWVudHMgY2FuIGFsc28gbWFudWFsbHkgY3JlYXRlIHRoZWlyIG93biBjbGFzc2VzIGF0CisgIHJ1bnRpbWUsIGFzIGluIHRoaXMgZXhhbXBsZToKKworICBteWRlc2NyaXB0b3IgPSBTZXJ2aWNlRGVzY3JpcHRvciguLi4uLikKKyAgY2xhc3MgTXlQcm90b1NlcnZpY2Uoc2VydmljZS5TZXJ2aWNlKToKKyAgICBfX21ldGFjbGFzc19fID0gR2VuZXJhdGVkU2VydmljZVR5cGUKKyAgICBERVNDUklQVE9SID0gbXlkZXNjcmlwdG9yCisgIG15c2VydmljZV9pbnN0YW5jZSA9IE15UHJvdG9TZXJ2aWNlKCkKKyAgLi4uCisgICIiIgorCisgIF9ERVNDUklQVE9SX0tFWSA9ICdERVNDUklQVE9SJworCisgIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KToKKyAgICAiIiJDcmVhdGVzIGEgbWVzc2FnZSBzZXJ2aWNlIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IE5hbWUgb2YgdGhlIGNsYXNzIChpZ25vcmVkLCBidXQgcmVxdWlyZWQgYnkgdGhlIG1ldGFjbGFzcworICAgICAgICBwcm90b2NvbCkuCisgICAgICBiYXNlczogQmFzZSBjbGFzc2VzIG9mIHRoZSBjbGFzcyBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgICAgIGRpY3Rpb25hcnk6IFRoZSBjbGFzcyBkaWN0aW9uYXJ5IG9mIHRoZSBjbGFzcyBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgICAgICAgZGljdGlvbmFyeVtfREVTQ1JJUFRPUl9LRVldIG11c3QgY29udGFpbiBhIFNlcnZpY2VEZXNjcmlwdG9yIG9iamVjdAorICAgICAgICBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgc2VydmljZSB0eXBlLgorICAgICIiIgorICAgICMgRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBjbGFzcyBkb2Vzbid0IGhhdmUgYSBkZXNjcmlwdG9yLiBUaGlzIGhhcHBlbnMKKyAgICAjIHdoZW4gYSBzZXJ2aWNlIGNsYXNzIGlzIHN1YmNsYXNzZWQuCisgICAgaWYgR2VuZXJhdGVkU2VydmljZVR5cGUuX0RFU0NSSVBUT1JfS0VZIG5vdCBpbiBkaWN0aW9uYXJ5OgorICAgICAgcmV0dXJuCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkU2VydmljZVR5cGUuX0RFU0NSSVBUT1JfS0VZXQorICAgIHNlcnZpY2VfYnVpbGRlciA9IF9TZXJ2aWNlQnVpbGRlcihkZXNjcmlwdG9yKQorICAgIHNlcnZpY2VfYnVpbGRlci5CdWlsZFNlcnZpY2UoY2xzKQorCisKK2NsYXNzIEdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZShHZW5lcmF0ZWRTZXJ2aWNlVHlwZSk6CisKKyAgIiIiTWV0YWNsYXNzIGZvciBzZXJ2aWNlIHN0dWJzIGNyZWF0ZWQgYXQgcnVudGltZSBmcm9tIFNlcnZpY2VEZXNjcmlwdG9ycy4KKworICBUaGlzIGNsYXNzIGhhcyBzaW1pbGFyIHJlc3BvbnNpYmlsaXRpZXMgYXMgR2VuZXJhdGVkU2VydmljZVR5cGUsIGV4Y2VwdCB0aGF0CisgIGl0IGNyZWF0ZXMgdGhlIHNlcnZpY2Ugc3R1YiBjbGFzc2VzLgorICAiIiIKKworICBfREVTQ1JJUFRPUl9LRVkgPSAnREVTQ1JJUFRPUicKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6CisgICAgIiIiQ3JlYXRlcyBhIG1lc3NhZ2Ugc2VydmljZSBzdHViIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IE5hbWUgb2YgdGhlIGNsYXNzIChpZ25vcmVkLCBoZXJlKS4KKyAgICAgIGJhc2VzOiBCYXNlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIGJlaW5nIGNvbnN0cnVjdGVkLgorICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIGJlaW5nIGNvbnN0cnVjdGVkLgorICAgICAgICBkaWN0aW9uYXJ5W19ERVNDUklQVE9SX0tFWV0gbXVzdCBjb250YWluIGEgU2VydmljZURlc2NyaXB0b3Igb2JqZWN0CisgICAgICAgIGRlc2NyaWJpbmcgdGhpcyBwcm90b2NvbCBzZXJ2aWNlIHR5cGUuCisgICAgIiIiCisgICAgc3VwZXIoR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlLCBjbHMpLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KQorICAgICMgRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBjbGFzcyBkb2Vzbid0IGhhdmUgYSBkZXNjcmlwdG9yLiBUaGlzIGhhcHBlbnMKKyAgICAjIHdoZW4gYSBzZXJ2aWNlIHN0dWIgaXMgc3ViY2xhc3NlZC4KKyAgICBpZiBHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUuX0RFU0NSSVBUT1JfS0VZIG5vdCBpbiBkaWN0aW9uYXJ5OgorICAgICAgcmV0dXJuCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlLl9ERVNDUklQVE9SX0tFWV0KKyAgICBzZXJ2aWNlX3N0dWJfYnVpbGRlciA9IF9TZXJ2aWNlU3R1YkJ1aWxkZXIoZGVzY3JpcHRvcikKKyAgICBzZXJ2aWNlX3N0dWJfYnVpbGRlci5CdWlsZFNlcnZpY2VTdHViKGNscykKKworCitjbGFzcyBfU2VydmljZUJ1aWxkZXIob2JqZWN0KToKKworICAiIiJUaGlzIGNsYXNzIGNvbnN0cnVjdHMgYSBwcm90b2NvbCBzZXJ2aWNlIGNsYXNzIHVzaW5nIGEgc2VydmljZSBkZXNjcmlwdG9yLgorCisgIEdpdmVuIGEgc2VydmljZSBkZXNjcmlwdG9yLCB0aGlzIGNsYXNzIGNvbnN0cnVjdHMgYSBjbGFzcyB0aGF0IHJlcHJlc2VudHMKKyAgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIGRlc2NyaXB0b3IuIE9uZSBzZXJ2aWNlIGJ1aWxkZXIgaW5zdGFuY2UgY29uc3RydWN0cworICBleGFjdGx5IG9uZSBzZXJ2aWNlIGNsYXNzLiBUaGF0IG1lYW5zIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBzaGFyZSB0aGUKKyAgc2FtZSBidWlsZGVyLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgc2VydmljZV9kZXNjcmlwdG9yKToKKyAgICAiIiJJbml0aWFsaXplcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSBjbGFzcyBidWlsZGVyLgorCisgICAgQXJnczoKKyAgICAgIHNlcnZpY2VfZGVzY3JpcHRvcjogU2VydmljZURlc2NyaXB0b3IgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZQorICAgICAgICBzZXJ2aWNlIGNsYXNzLgorICAgICIiIgorICAgIHNlbGYuZGVzY3JpcHRvciA9IHNlcnZpY2VfZGVzY3JpcHRvcgorCisgIGRlZiBCdWlsZFNlcnZpY2Uoc2VsZiwgY2xzKToKKyAgICAiIiJDb25zdHJ1Y3RzIHRoZSBzZXJ2aWNlIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIGNsczogVGhlIGNsYXNzIHRoYXQgd2lsbCBiZSBjb25zdHJ1Y3RlZC4KKyAgICAiIiIKKworICAgICMgQ2FsbE1ldGhvZCBuZWVkcyB0byBvcGVyYXRlIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2UgY2xhc3MuIFRoaXMKKyAgICAjIGludGVybmFsIHdyYXBwZXIgZnVuY3Rpb24gZXhpc3RzIG9ubHkgdG8gYmUgYWJsZSB0byBwYXNzIHRoZSBzZXJ2aWNlCisgICAgIyBpbnN0YW5jZSB0byB0aGUgbWV0aG9kIHRoYXQgZG9lcyB0aGUgcmVhbCBDYWxsTWV0aG9kIHdvcmsuCisgICAgZGVmIF9XcmFwQ2FsbE1ldGhvZChzcnZjLCBtZXRob2RfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjayk6CisgICAgICByZXR1cm4gc2VsZi5fQ2FsbE1ldGhvZChzcnZjLCBtZXRob2RfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKQorICAgIHNlbGYuY2xzID0gY2xzCisgICAgY2xzLkNhbGxNZXRob2QgPSBfV3JhcENhbGxNZXRob2QKKyAgICBjbHMuR2V0RGVzY3JpcHRvciA9IHN0YXRpY21ldGhvZChsYW1iZGE6IHNlbGYuZGVzY3JpcHRvcikKKyAgICBjbHMuR2V0RGVzY3JpcHRvci5fX2RvY19fID0gIlJldHVybnMgdGhlIHNlcnZpY2UgZGVzY3JpcHRvci4iCisgICAgY2xzLkdldFJlcXVlc3RDbGFzcyA9IHNlbGYuX0dldFJlcXVlc3RDbGFzcworICAgIGNscy5HZXRSZXNwb25zZUNsYXNzID0gc2VsZi5fR2V0UmVzcG9uc2VDbGFzcworICAgIGZvciBtZXRob2QgaW4gc2VsZi5kZXNjcmlwdG9yLm1ldGhvZHM6CisgICAgICBzZXRhdHRyKGNscywgbWV0aG9kLm5hbWUsIHNlbGYuX0dlbmVyYXRlTm9uSW1wbGVtZW50ZWRNZXRob2QobWV0aG9kKSkKKworICBkZWYgX0NhbGxNZXRob2Qoc2VsZiwgc3J2YywgbWV0aG9kX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOgorICAgICIiIkNhbGxzIHRoZSBtZXRob2QgZGVzY3JpYmVkIGJ5IGEgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IuCisKKyAgICBBcmdzOgorICAgICAgc3J2YzogSW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgIG1ldGhvZF9kZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50IHRoZSBtZXRob2QgdG8gY2FsbC4KKyAgICAgIHJwY19jb250cm9sbGVyOiBSUEMgY29udHJvbGxlciB0byB1c2UgZm9yIHRoaXMgbWV0aG9kJ3MgZXhlY3V0aW9uLgorICAgICAgcmVxdWVzdDogUmVxdWVzdCBwcm90b2NvbCBtZXNzYWdlLgorICAgICAgY2FsbGJhY2s6IEEgY2FsbGJhY2sgdG8gaW52b2tlIGFmdGVyIHRoZSBtZXRob2QgaGFzIGNvbXBsZXRlZC4KKyAgICAiIiIKKyAgICBpZiBtZXRob2RfZGVzY3JpcHRvci5jb250YWluaW5nX3NlcnZpY2UgIT0gc2VsZi5kZXNjcmlwdG9yOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICdDYWxsTWV0aG9kKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS4nKQorICAgIG1ldGhvZCA9IGdldGF0dHIoc3J2YywgbWV0aG9kX2Rlc2NyaXB0b3IubmFtZSkKKyAgICByZXR1cm4gbWV0aG9kKHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaykKKworICBkZWYgX0dldFJlcXVlc3RDbGFzcyhzZWxmLCBtZXRob2RfZGVzY3JpcHRvcik6CisgICAgIiIiUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIHJlcXVlc3QgcHJvdG9jb2wgbWVzc2FnZS4KKworICAgIEFyZ3M6CisgICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIGZvciB3aGljaCB0byByZXR1cm4gdGhlCisgICAgICAgIHJlcXVlc3QgcHJvdG9jb2wgbWVzc2FnZSBjbGFzcy4KKworICAgIFJldHVybnM6CisgICAgICBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgaW5wdXQgcHJvdG9jb2wgbWVzc2FnZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICBtZXRob2QuCisgICAgIiIiCisgICAgaWYgbWV0aG9kX2Rlc2NyaXB0b3IuY29udGFpbmluZ19zZXJ2aWNlICE9IHNlbGYuZGVzY3JpcHRvcjoKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAnR2V0UmVxdWVzdENsYXNzKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS4nKQorICAgIHJldHVybiBtZXRob2RfZGVzY3JpcHRvci5pbnB1dF90eXBlLl9jb25jcmV0ZV9jbGFzcworCisgIGRlZiBfR2V0UmVzcG9uc2VDbGFzcyhzZWxmLCBtZXRob2RfZGVzY3JpcHRvcik6CisgICAgIiIiUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIHJlc3BvbnNlIHByb3RvY29sIG1lc3NhZ2UuCisKKyAgICBBcmdzOgorICAgICAgbWV0aG9kX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZQorICAgICAgICByZXNwb25zZSBwcm90b2NvbCBtZXNzYWdlIGNsYXNzLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBvdXRwdXQgcHJvdG9jb2wgbWVzc2FnZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICBtZXRob2QuCisgICAgIiIiCisgICAgaWYgbWV0aG9kX2Rlc2NyaXB0b3IuY29udGFpbmluZ19zZXJ2aWNlICE9IHNlbGYuZGVzY3JpcHRvcjoKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAnR2V0UmVzcG9uc2VDbGFzcygpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuJykKKyAgICByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3Iub3V0cHV0X3R5cGUuX2NvbmNyZXRlX2NsYXNzCisKKyAgZGVmIF9HZW5lcmF0ZU5vbkltcGxlbWVudGVkTWV0aG9kKHNlbGYsIG1ldGhvZCk6CisgICAgIiIiR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEgbWV0aG9kIHRoYXQgY2FuIGJlIHNldCBmb3IgYSBzZXJ2aWNlIG1ldGhvZHMuCisKKyAgICBBcmdzOgorICAgICAgbWV0aG9kOiBEZXNjcmlwdG9yIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCBmb3Igd2hpY2ggYSBtZXRob2QgaXMgdG8gYmUKKyAgICAgICAgZ2VuZXJhdGVkLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgbWV0aG9kIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2aWNlIGNsYXNzLgorICAgICIiIgorICAgIHJldHVybiBsYW1iZGEgaW5zdCwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrOiAoCisgICAgICAgIHNlbGYuX05vbkltcGxlbWVudGVkTWV0aG9kKG1ldGhvZC5uYW1lLCBycGNfY29udHJvbGxlciwgY2FsbGJhY2spKQorCisgIGRlZiBfTm9uSW1wbGVtZW50ZWRNZXRob2Qoc2VsZiwgbWV0aG9kX25hbWUsIHJwY19jb250cm9sbGVyLCBjYWxsYmFjayk6CisgICAgIiIiVGhlIGJvZHkgb2YgYWxsIG1ldGhvZHMgaW4gdGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIG1ldGhvZF9uYW1lOiBOYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgZXhlY3V0ZWQuCisgICAgICBycGNfY29udHJvbGxlcjogUlBDIGNvbnRyb2xsZXIgdXNlZCB0byBleGVjdXRlIHRoaXMgbWV0aG9kLgorICAgICAgY2FsbGJhY2s6IEEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIG1ldGhvZCBmaW5pc2hlcy4KKyAgICAiIiIKKyAgICBycGNfY29udHJvbGxlci5TZXRGYWlsZWQoJ01ldGhvZCAlcyBub3QgaW1wbGVtZW50ZWQuJyAlIG1ldGhvZF9uYW1lKQorICAgIGNhbGxiYWNrKE5vbmUpCisKKworY2xhc3MgX1NlcnZpY2VTdHViQnVpbGRlcihvYmplY3QpOgorCisgICIiIkNvbnN0cnVjdHMgYSBwcm90b2NvbCBzZXJ2aWNlIHN0dWIgY2xhc3MgdXNpbmcgYSBzZXJ2aWNlIGRlc2NyaXB0b3IuCisKKyAgR2l2ZW4gYSBzZXJ2aWNlIGRlc2NyaXB0b3IsIHRoaXMgY2xhc3MgY29uc3RydWN0cyBhIHN1aXRhYmxlIHN0dWIgY2xhc3MuCisgIEEgc3R1YiBpcyBqdXN0IGEgdHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIGFuIFJwY0NoYW5uZWwgd2hpY2ggZW11bGF0ZXMgYQorICBsb2NhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KKworICBPbmUgc2VydmljZSBzdHViIGJ1aWxkZXIgaW5zdGFuY2UgY29uc3RydWN0cyBleGFjdGx5IG9uZSBjbGFzcy4gSXQgbWVhbnMgYWxsCisgIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIHNoYXJlIHRoZSBzYW1lIHNlcnZpY2Ugc3R1YiBidWlsZGVyLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgc2VydmljZV9kZXNjcmlwdG9yKToKKyAgICAiIiJJbml0aWFsaXplcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSBzdHViIGNsYXNzIGJ1aWxkZXIuCisKKyAgICBBcmdzOgorICAgICAgc2VydmljZV9kZXNjcmlwdG9yOiBTZXJ2aWNlRGVzY3JpcHRvciB0byB1c2Ugd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCisgICAgICAgIHN0dWIgY2xhc3MuCisgICAgIiIiCisgICAgc2VsZi5kZXNjcmlwdG9yID0gc2VydmljZV9kZXNjcmlwdG9yCisKKyAgZGVmIEJ1aWxkU2VydmljZVN0dWIoc2VsZiwgY2xzKToKKyAgICAiIiJDb25zdHJ1Y3RzIHRoZSBzdHViIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIGNsczogVGhlIGNsYXNzIHRoYXQgd2lsbCBiZSBjb25zdHJ1Y3RlZC4KKyAgICAiIiIKKworICAgIGRlZiBfU2VydmljZVN0dWJJbml0KHN0dWIsIHJwY19jaGFubmVsKToKKyAgICAgIHN0dWIucnBjX2NoYW5uZWwgPSBycGNfY2hhbm5lbAorICAgIHNlbGYuY2xzID0gY2xzCisgICAgY2xzLl9faW5pdF9fID0gX1NlcnZpY2VTdHViSW5pdAorICAgIGZvciBtZXRob2QgaW4gc2VsZi5kZXNjcmlwdG9yLm1ldGhvZHM6CisgICAgICBzZXRhdHRyKGNscywgbWV0aG9kLm5hbWUsIHNlbGYuX0dlbmVyYXRlU3R1Yk1ldGhvZChtZXRob2QpKQorCisgIGRlZiBfR2VuZXJhdGVTdHViTWV0aG9kKHNlbGYsIG1ldGhvZCk6CisgICAgcmV0dXJuIChsYW1iZGEgaW5zdCwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrPU5vbmU6CisgICAgICAgIHNlbGYuX1N0dWJNZXRob2QoaW5zdCwgbWV0aG9kLCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spKQorCisgIGRlZiBfU3R1Yk1ldGhvZChzZWxmLCBzdHViLCBtZXRob2RfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjayk6CisgICAgIiIiVGhlIGJvZHkgb2YgYWxsIHNlcnZpY2UgbWV0aG9kcyBpbiB0aGUgZ2VuZXJhdGVkIHN0dWIgY2xhc3MuCisKKyAgICBBcmdzOgorICAgICAgc3R1YjogU3R1YiBpbnN0YW5jZS4KKyAgICAgIG1ldGhvZF9kZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9mIHRoZSBpbnZva2VkIG1ldGhvZC4KKyAgICAgIHJwY19jb250cm9sbGVyOiBScGMgY29udHJvbGxlciB0byBleGVjdXRlIHRoZSBtZXRob2QuCisgICAgICByZXF1ZXN0OiBSZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UuCisgICAgICBjYWxsYmFjazogQSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIG1ldGhvZCBmaW5pc2hlcy4KKyAgICBSZXR1cm5zOgorICAgICAgUmVzcG9uc2UgbWVzc2FnZSAoaW4gY2FzZSBvZiBibG9ja2luZyBjYWxsKS4KKyAgICAiIiIKKyAgICByZXR1cm4gc3R1Yi5ycGNfY2hhbm5lbC5DYWxsTWV0aG9kKAorICAgICAgICBtZXRob2RfZGVzY3JpcHRvciwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsCisgICAgICAgIG1ldGhvZF9kZXNjcmlwdG9yLm91dHB1dF90eXBlLl9jb25jcmV0ZV9jbGFzcywgY2FsbGJhY2spCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjRkZDA3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weQpAQCAtMCwwICsxLDczOSBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnRhaW5zIHJvdXRpbmVzIGZvciBwcmludGluZyBwcm90b2NvbCBtZXNzYWdlcyBpbiB0ZXh0IGZvcm1hdC4iIiIKKworX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKKworaW1wb3J0IGNTdHJpbmdJTworaW1wb3J0IHJlCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdHlwZV9jaGVja2VycworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKKworX19hbGxfXyA9IFsgJ01lc3NhZ2VUb1N0cmluZycsICdQcmludE1lc3NhZ2UnLCAnUHJpbnRGaWVsZCcsCisgICAgICAgICAgICAnUHJpbnRGaWVsZFZhbHVlJywgJ01lcmdlJyBdCisKKworX0lOVEVHRVJfQ0hFQ0tFUlMgPSAodHlwZV9jaGVja2Vycy5VaW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tlcnMuSW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tlcnMuVWludDY0VmFsdWVDaGVja2VyKCksCisgICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrZXJzLkludDY0VmFsdWVDaGVja2VyKCkpCitfRkxPQVRfSU5GSU5JVFkgPSByZS5jb21waWxlKCctP2luZig/OmluaXR5KT9mPycsIHJlLklHTk9SRUNBU0UpCitfRkxPQVRfTkFOID0gcmUuY29tcGlsZSgnbmFuZj8nLCByZS5JR05PUkVDQVNFKQorCisKK2NsYXNzIFBhcnNlRXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiVGhyb3duIGluIGNhc2Ugb2YgQVNDSUkgcGFyc2luZyBlcnJvci4iIiIKKworCitkZWYgTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX3V0Zjg9RmFsc2UsIGFzX29uZV9saW5lPUZhbHNlKToKKyAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgUHJpbnRNZXNzYWdlKG1lc3NhZ2UsIG91dCwgYXNfdXRmOD1hc191dGY4LCBhc19vbmVfbGluZT1hc19vbmVfbGluZSkKKyAgcmVzdWx0ID0gb3V0LmdldHZhbHVlKCkKKyAgb3V0LmNsb3NlKCkKKyAgaWYgYXNfb25lX2xpbmU6CisgICAgcmV0dXJuIHJlc3VsdC5yc3RyaXAoKQorICByZXR1cm4gcmVzdWx0CisKKworZGVmIFByaW50TWVzc2FnZShtZXNzYWdlLCBvdXQsIGluZGVudD0wLCBhc191dGY4PUZhbHNlLCBhc19vbmVfbGluZT1GYWxzZSk6CisgIGZvciBmaWVsZCwgdmFsdWUgaW4gbWVzc2FnZS5MaXN0RmllbGRzKCk6CisgICAgaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgUHJpbnRGaWVsZChmaWVsZCwgZWxlbWVudCwgb3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lKQorICAgIGVsc2U6CisgICAgICBQcmludEZpZWxkKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lKQorCisKK2RlZiBQcmludEZpZWxkKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQ9MCwgYXNfdXRmOD1GYWxzZSwgYXNfb25lX2xpbmU9RmFsc2UpOgorICAiIiJQcmludCBhIHNpbmdsZSBmaWVsZCBuYW1lL3ZhbHVlIHBhaXIuICBGb3IgcmVwZWF0ZWQgZmllbGRzLCB0aGUgdmFsdWUKKyAgc2hvdWxkIGJlIGEgc2luZ2xlIGVsZW1lbnQuIiIiCisKKyAgb3V0LndyaXRlKCcgJyAqIGluZGVudCk7CisgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICBvdXQud3JpdGUoJ1snKQorICAgIGlmIChmaWVsZC5jb250YWluaW5nX3R5cGUuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IGFuZAorICAgICAgICBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSBhbmQKKyAgICAgICAgZmllbGQubWVzc2FnZV90eXBlID09IGZpZWxkLmV4dGVuc2lvbl9zY29wZSBhbmQKKyAgICAgICAgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfT1BUSU9OQUwpOgorICAgICAgb3V0LndyaXRlKGZpZWxkLm1lc3NhZ2VfdHlwZS5mdWxsX25hbWUpCisgICAgZWxzZToKKyAgICAgIG91dC53cml0ZShmaWVsZC5mdWxsX25hbWUpCisgICAgb3V0LndyaXRlKCddJykKKyAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6CisgICAgIyBGb3IgZ3JvdXBzLCB1c2UgdGhlIGNhcGl0YWxpemVkIG5hbWUuCisgICAgb3V0LndyaXRlKGZpZWxkLm1lc3NhZ2VfdHlwZS5uYW1lKQorICBlbHNlOgorICAgIG91dC53cml0ZShmaWVsZC5uYW1lKQorCisgIGlmIGZpZWxkLmNwcF90eXBlICE9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAjIFRoZSBjb2xvbiBpcyBvcHRpb25hbCBpbiB0aGlzIGNhc2UsIGJ1dCBvdXIgY3Jvc3MtbGFuZ3VhZ2UgZ29sZGVuIGZpbGVzCisgICAgIyBkb24ndCBpbmNsdWRlIGl0LgorICAgIG91dC53cml0ZSgnOiAnKQorCisgIFByaW50RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUsIG91dCwgaW5kZW50LCBhc191dGY4LCBhc19vbmVfbGluZSkKKyAgaWYgYXNfb25lX2xpbmU6CisgICAgb3V0LndyaXRlKCcgJykKKyAgZWxzZToKKyAgICBvdXQud3JpdGUoJ1xuJykKKworCitkZWYgUHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQ9MCwKKyAgICAgICAgICAgICAgICAgICAgYXNfdXRmOD1GYWxzZSwgYXNfb25lX2xpbmU9RmFsc2UpOgorICAiIiJQcmludCBhIHNpbmdsZSBmaWVsZCB2YWx1ZSAobm90IGluY2x1ZGluZyBuYW1lKS4gIEZvciByZXBlYXRlZCBmaWVsZHMsCisgIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBzaW5nbGUgZWxlbWVudC4iIiIKKworICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgaWYgYXNfb25lX2xpbmU6CisgICAgICBvdXQud3JpdGUoJyB7ICcpCisgICAgICBQcmludE1lc3NhZ2UodmFsdWUsIG91dCwgaW5kZW50LCBhc191dGY4LCBhc19vbmVfbGluZSkKKyAgICAgIG91dC53cml0ZSgnfScpCisgICAgZWxzZToKKyAgICAgIG91dC53cml0ZSgnIHtcbicpCisgICAgICBQcmludE1lc3NhZ2UodmFsdWUsIG91dCwgaW5kZW50ICsgMiwgYXNfdXRmOCwgYXNfb25lX2xpbmUpCisgICAgICBvdXQud3JpdGUoJyAnICogaW5kZW50ICsgJ30nKQorICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRU5VTToKKyAgICBlbnVtX3ZhbHVlID0gZmllbGQuZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXIuZ2V0KHZhbHVlLCBOb25lKQorICAgIGlmIGVudW1fdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICBvdXQud3JpdGUoZW51bV92YWx1ZS5uYW1lKQorICAgIGVsc2U6CisgICAgICBvdXQud3JpdGUoc3RyKHZhbHVlKSkKKyAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORzoKKyAgICBvdXQud3JpdGUoJ1wiJykKKyAgICBpZiB0eXBlKHZhbHVlKSBpcyB1bmljb2RlOgorICAgICAgb3V0LndyaXRlKF9DRXNjYXBlKHZhbHVlLmVuY29kZSgndXRmLTgnKSwgYXNfdXRmOCkpCisgICAgZWxzZToKKyAgICAgIG91dC53cml0ZShfQ0VzY2FwZSh2YWx1ZSwgYXNfdXRmOCkpCisgICAgb3V0LndyaXRlKCdcIicpCisgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9CT09MOgorICAgIGlmIHZhbHVlOgorICAgICAgb3V0LndyaXRlKCJ0cnVlIikKKyAgICBlbHNlOgorICAgICAgb3V0LndyaXRlKCJmYWxzZSIpCisgIGVsc2U6CisgICAgb3V0LndyaXRlKHN0cih2YWx1ZSkpCisKKworZGVmIE1lcmdlKHRleHQsIG1lc3NhZ2UpOgorICAiIiJNZXJnZXMgYW4gQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gYSBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAgdGV4dDogTWVzc2FnZSBBU0NJSSByZXByZXNlbnRhdGlvbi4KKyAgICBtZXNzYWdlOiBBIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIHRvIG1lcmdlIGludG8uCisKKyAgUmFpc2VzOgorICAgIFBhcnNlRXJyb3I6IE9uIEFTQ0lJIHBhcnNpbmcgcHJvYmxlbXMuCisgICIiIgorICB0b2tlbml6ZXIgPSBfVG9rZW5pemVyKHRleHQpCisgIHdoaWxlIG5vdCB0b2tlbml6ZXIuQXRFbmQoKToKKyAgICBfTWVyZ2VGaWVsZCh0b2tlbml6ZXIsIG1lc3NhZ2UpCisKKworZGVmIF9NZXJnZUZpZWxkKHRva2VuaXplciwgbWVzc2FnZSk6CisgICIiIk1lcmdlcyBhIHNpbmdsZSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkIGludG8gYSBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgbmFtZSBhbmQgdmFsdWVzLgorICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGRhdGEuCisKKyAgUmFpc2VzOgorICAgIFBhcnNlRXJyb3I6IEluIGNhc2Ugb2YgQVNDSUkgcGFyc2luZyBwcm9ibGVtcy4KKyAgIiIiCisgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2UuREVTQ1JJUFRPUgorICBpZiB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnWycpOgorICAgIG5hbWUgPSBbdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCldCisgICAgd2hpbGUgdG9rZW5pemVyLlRyeUNvbnN1bWUoJy4nKToKKyAgICAgIG5hbWUuYXBwZW5kKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllcigpKQorICAgIG5hbWUgPSAnLicuam9pbihuYW1lKQorCisgICAgaWYgbm90IG1lc3NhZ2VfZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgorICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAorICAgICAgICAgICdNZXNzYWdlIHR5cGUgIiVzIiBkb2VzIG5vdCBoYXZlIGV4dGVuc2lvbnMuJyAlCisgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkKKyAgICBmaWVsZCA9IG1lc3NhZ2UuRXh0ZW5zaW9ucy5fRmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lKQorICAgIGlmIG5vdCBmaWVsZDoKKyAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAnRXh0ZW5zaW9uICIlcyIgbm90IHJlZ2lzdGVyZWQuJyAlIG5hbWUpCisgICAgZWxpZiBtZXNzYWdlX2Rlc2NyaXB0b3IgIT0gZmllbGQuY29udGFpbmluZ190eXBlOgorICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAorICAgICAgICAgICdFeHRlbnNpb24gIiVzIiBkb2VzIG5vdCBleHRlbmQgbWVzc2FnZSB0eXBlICIlcyIuJyAlICgKKyAgICAgICAgICAgICAgbmFtZSwgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkpCisgICAgdG9rZW5pemVyLkNvbnN1bWUoJ10nKQorICBlbHNlOgorICAgIG5hbWUgPSB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKQorICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLmdldChuYW1lLCBOb25lKQorCisgICAgIyBHcm91cCBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FwaXRhbGl6ZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlCisgICAgIyAucHJvdG8gZmlsZSwgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGVpciB0eXBlIG5hbWVzLCBub3QgdGhlaXIgZmllbGQKKyAgICAjIG5hbWVzLgorICAgIGlmIG5vdCBmaWVsZDoKKyAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLmdldChuYW1lLmxvd2VyKCksIE5vbmUpCisgICAgICBpZiBmaWVsZCBhbmQgZmllbGQudHlwZSAhPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOgorICAgICAgICBmaWVsZCA9IE5vbmUKKworICAgIGlmIChmaWVsZCBhbmQgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQIGFuZAorICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUubmFtZSAhPSBuYW1lKToKKyAgICAgIGZpZWxkID0gTm9uZQorCisgICAgaWYgbm90IGZpZWxkOgorICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAorICAgICAgICAgICdNZXNzYWdlIHR5cGUgIiVzIiBoYXMgbm8gZmllbGQgbmFtZWQgIiVzIi4nICUgKAorICAgICAgICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lLCBuYW1lKSkKKworICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzonKQorCisgICAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzwnKToKKyAgICAgIGVuZF90b2tlbiA9ICc+JworICAgIGVsc2U6CisgICAgICB0b2tlbml6ZXIuQ29uc3VtZSgneycpCisgICAgICBlbmRfdG9rZW4gPSAnfScKKworICAgIGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgorICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0uYWRkKCkKKyAgICAgIGVsc2U6CisgICAgICAgIHN1Yl9tZXNzYWdlID0gZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKS5hZGQoKQorICAgIGVsc2U6CisgICAgICBpZiBmaWVsZC5pc19leHRlbnNpb246CisgICAgICAgIHN1Yl9tZXNzYWdlID0gbWVzc2FnZS5FeHRlbnNpb25zW2ZpZWxkXQorICAgICAgZWxzZToKKyAgICAgICAgc3ViX21lc3NhZ2UgPSBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpCisgICAgICBzdWJfbWVzc2FnZS5TZXRJblBhcmVudCgpCisKKyAgICB3aGlsZSBub3QgdG9rZW5pemVyLlRyeUNvbnN1bWUoZW5kX3Rva2VuKToKKyAgICAgIGlmIHRva2VuaXplci5BdEVuZCgpOgorICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oJ0V4cGVjdGVkICIlcyIuJyAlIChlbmRfdG9rZW4pKQorICAgICAgX01lcmdlRmllbGQodG9rZW5pemVyLCBzdWJfbWVzc2FnZSkKKyAgZWxzZToKKyAgICBfTWVyZ2VTY2FsYXJGaWVsZCh0b2tlbml6ZXIsIG1lc3NhZ2UsIGZpZWxkKQorCisKK2RlZiBfTWVyZ2VTY2FsYXJGaWVsZCh0b2tlbml6ZXIsIG1lc3NhZ2UsIGZpZWxkKToKKyAgIiIiTWVyZ2VzIGEgc2luZ2xlIHByb3RvY29sIG1lc3NhZ2Ugc2NhbGFyIGZpZWxkIGludG8gYSBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgdmFsdWUuCisgICAgbWVzc2FnZTogQSBwcm90b2NvbCBtZXNzYWdlIHRvIHJlY29yZCB0aGUgZGF0YS4KKyAgICBmaWVsZDogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIHRvIGJlIG1lcmdlZC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogSW4gY2FzZSBvZiBBU0NJSSBwYXJzaW5nIHByb2JsZW1zLgorICAgIFJ1bnRpbWVFcnJvcjogT24gcnVudGltZSBlcnJvcnMuCisgICIiIgorICB0b2tlbml6ZXIuQ29uc3VtZSgnOicpCisgIHZhbHVlID0gTm9uZQorCisgIGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyKToKKyAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lSW50MzIoKQorICBlbGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NCk6CisgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUludDY0KCkKKyAgZWxpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzIpOgorICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVVaW50MzIoKQorICBlbGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0LAorICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NCk6CisgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCgpCisgIGVsaWYgZmllbGQudHlwZSBpbiAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRSk6CisgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUZsb2F0KCkKKyAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDoKKyAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lQm9vbCgpCisgIGVsaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzoKKyAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lU3RyaW5nKCkKKyAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6CisgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcoKQorICBlbGlmIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOgorICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVFbnVtKGZpZWxkKQorICBlbHNlOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignVW5rbm93biBmaWVsZCB0eXBlICVkJyAlIGZpZWxkLnR5cGUpCisKKyAgaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgorICAgICAgbWVzc2FnZS5FeHRlbnNpb25zW2ZpZWxkXS5hcHBlbmQodmFsdWUpCisgICAgZWxzZToKKyAgICAgIGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSkuYXBwZW5kKHZhbHVlKQorICBlbHNlOgorICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0gPSB2YWx1ZQorICAgIGVsc2U6CisgICAgICBzZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUsIHZhbHVlKQorCisKK2NsYXNzIF9Ub2tlbml6ZXIob2JqZWN0KToKKyAgIiIiUHJvdG9jb2wgYnVmZmVyIEFTQ0lJIHJlcHJlc2VudGF0aW9uIHRva2VuaXplci4KKworICBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIGxvd2VyIGxldmVsIHN0cmluZyBwYXJzaW5nIGJ5IHNwbGl0dGluZyBpdCBpbnRvCisgIG1lYW5pbmdmdWwgdG9rZW5zLgorCisgIEl0IHdhcyBkaXJlY3RseSBwb3J0ZWQgZnJvbSB0aGUgSmF2YSBwcm90b2NvbCBidWZmZXIgQVBJLgorICAiIiIKKworICBfV0hJVEVTUEFDRSA9IHJlLmNvbXBpbGUoJyhcXHN8KCMuKiQpKSsnLCByZS5NVUxUSUxJTkUpCisgIF9UT0tFTiA9IHJlLmNvbXBpbGUoCisgICAgICAnW2EtekEtWl9dWzAtOWEtekEtWl8rLV0qfCcgICAgICAgICAgICMgYW4gaWRlbnRpZmllcgorICAgICAgJ1swLTkrLV1bMC05YS16QS1aXy4rLV0qfCcgICAgICAgICAgICAjIGEgbnVtYmVyCisgICAgICAnXCIoW15cIlxuXFxcXF18XFxcXC4pKihcInxcXFxcPyQpfCcgICMgYSBkb3VibGUtcXVvdGVkIHN0cmluZworICAgICAgJ1wnKFteXCdcblxcXFxdfFxcXFwuKSooXCd8XFxcXD8kKScpICAjIGEgc2luZ2xlLXF1b3RlZCBzdHJpbmcKKyAgX0lERU5USUZJRVIgPSByZS5jb21waWxlKCdcdysnKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0X21lc3NhZ2UpOgorICAgIHNlbGYuX3RleHRfbWVzc2FnZSA9IHRleHRfbWVzc2FnZQorCisgICAgc2VsZi5fcG9zaXRpb24gPSAwCisgICAgc2VsZi5fbGluZSA9IC0xCisgICAgc2VsZi5fY29sdW1uID0gMAorICAgIHNlbGYuX3Rva2VuX3N0YXJ0ID0gTm9uZQorICAgIHNlbGYudG9rZW4gPSAnJworICAgIHNlbGYuX2xpbmVzID0gZGVxdWUodGV4dF9tZXNzYWdlLnNwbGl0KCdcbicpKQorICAgIHNlbGYuX2N1cnJlbnRfbGluZSA9ICcnCisgICAgc2VsZi5fcHJldmlvdXNfbGluZSA9IDAKKyAgICBzZWxmLl9wcmV2aW91c19jb2x1bW4gPSAwCisgICAgc2VsZi5fU2tpcFdoaXRlc3BhY2UoKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKworICBkZWYgQXRFbmQoc2VsZik6CisgICAgIiIiQ2hlY2tzIHRoZSBlbmQgb2YgdGhlIHRleHQgd2FzIHJlYWNoZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgVHJ1ZSBpZmYgdGhlIGVuZCB3YXMgcmVhY2hlZC4KKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi50b2tlbiA9PSAnJworCisgIGRlZiBfUG9wTGluZShzZWxmKToKKyAgICB3aGlsZSBsZW4oc2VsZi5fY3VycmVudF9saW5lKSA8PSBzZWxmLl9jb2x1bW46CisgICAgICBpZiBub3Qgc2VsZi5fbGluZXM6CisgICAgICAgIHNlbGYuX2N1cnJlbnRfbGluZSA9ICcnCisgICAgICAgIHJldHVybgorICAgICAgc2VsZi5fbGluZSArPSAxCisgICAgICBzZWxmLl9jb2x1bW4gPSAwCisgICAgICBzZWxmLl9jdXJyZW50X2xpbmUgPSBzZWxmLl9saW5lcy5wb3BsZWZ0KCkKKworICBkZWYgX1NraXBXaGl0ZXNwYWNlKHNlbGYpOgorICAgIHdoaWxlIFRydWU6CisgICAgICBzZWxmLl9Qb3BMaW5lKCkKKyAgICAgIG1hdGNoID0gc2VsZi5fV0hJVEVTUEFDRS5tYXRjaChzZWxmLl9jdXJyZW50X2xpbmUsIHNlbGYuX2NvbHVtbikKKyAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGxlbmd0aCA9IGxlbihtYXRjaC5ncm91cCgwKSkKKyAgICAgIHNlbGYuX2NvbHVtbiArPSBsZW5ndGgKKworICBkZWYgVHJ5Q29uc3VtZShzZWxmLCB0b2tlbik6CisgICAgIiIiVHJpZXMgdG8gY29uc3VtZSBhIGdpdmVuIHBpZWNlIG9mIHRleHQuCisKKyAgICBBcmdzOgorICAgICAgdG9rZW46IFRleHQgdG8gY29uc3VtZS4KKworICAgIFJldHVybnM6CisgICAgICBUcnVlIGlmZiB0aGUgdGV4dCB3YXMgY29uc3VtZWQuCisgICAgIiIiCisgICAgaWYgc2VsZi50b2tlbiA9PSB0b2tlbjoKKyAgICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIENvbnN1bWUoc2VsZiwgdG9rZW4pOgorICAgICIiIkNvbnN1bWVzIGEgcGllY2Ugb2YgdGV4dC4KKworICAgIEFyZ3M6CisgICAgICB0b2tlbjogVGV4dCB0byBjb25zdW1lLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgdGhlIHRleHQgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICAgIiIiCisgICAgaWYgbm90IHNlbGYuVHJ5Q29uc3VtZSh0b2tlbik6CisgICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHBlY3RlZCAiJXMiLicgJSB0b2tlbikKKworICBkZWYgQ29uc3VtZUlkZW50aWZpZXIoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBpZGVudGlmaWVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIElkZW50aWZpZXIgc3RyaW5nLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYW4gaWRlbnRpZmllciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICByZXN1bHQgPSBzZWxmLnRva2VuCisgICAgaWYgbm90IHNlbGYuX0lERU5USUZJRVIubWF0Y2gocmVzdWx0KToKKyAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3IoJ0V4cGVjdGVkIGlkZW50aWZpZXIuJykKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBDb25zdW1lSW50MzIoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYSBzaWduZWQgMzJiaXQgaW50ZWdlciBudW1iZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGludGVnZXIgcGFyc2VkLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYSBzaWduZWQgMzJiaXQgaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBQYXJzZUludGVnZXIoc2VsZi50b2tlbiwgaXNfc2lnbmVkPVRydWUsIGlzX2xvbmc9RmFsc2UpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKHN0cihlKSkKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBDb25zdW1lVWludDMyKHNlbGYpOgorICAgICIiIkNvbnN1bWVzIGFuIHVuc2lnbmVkIDMyYml0IGludGVnZXIgbnVtYmVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGFuIHVuc2lnbmVkIDMyYml0IGludGVnZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gUGFyc2VJbnRlZ2VyKHNlbGYudG9rZW4sIGlzX3NpZ25lZD1GYWxzZSwgaXNfbG9uZz1GYWxzZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3Ioc3RyKGUpKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIENvbnN1bWVJbnQ2NChzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhIHNpZ25lZCA2NGJpdCBpbnRlZ2VyIG51bWJlci4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgaW50ZWdlciBwYXJzZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiBhIHNpZ25lZCA2NGJpdCBpbnRlZ2VyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAgICIiIgorICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IFBhcnNlSW50ZWdlcihzZWxmLnRva2VuLCBpc19zaWduZWQ9VHJ1ZSwgaXNfbG9uZz1UcnVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgQ29uc3VtZVVpbnQ2NChzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhbiB1bnNpZ25lZCA2NGJpdCBpbnRlZ2VyIG51bWJlci4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgaW50ZWdlciBwYXJzZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiBhbiB1bnNpZ25lZCA2NGJpdCBpbnRlZ2VyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAgICIiIgorICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IFBhcnNlSW50ZWdlcihzZWxmLnRva2VuLCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9VHJ1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3Ioc3RyKGUpKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIENvbnN1bWVGbG9hdChzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIG51bWJlciBwYXJzZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBQYXJzZUZsb2F0KHNlbGYudG9rZW4pCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKHN0cihlKSkKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBDb25zdW1lQm9vbChzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhIGJvb2xlYW4gdmFsdWUuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGJvb2wgcGFyc2VkLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYSBib29sZWFuIHZhbHVlIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAgICIiIgorICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IFBhcnNlQm9vbChzZWxmLnRva2VuKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgQ29uc3VtZVN0cmluZyhzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhIHN0cmluZyB2YWx1ZS4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgc3RyaW5nIHBhcnNlZC4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGEgc3RyaW5nIHZhbHVlIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAgICIiIgorICAgIGJ5dGVzID0gc2VsZi5Db25zdW1lQnl0ZVN0cmluZygpCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHVuaWNvZGUoYnl0ZXMsICd1dGYtOCcpCisgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX1N0cmluZ1BhcnNlRXJyb3IoZSkKKworICBkZWYgQ29uc3VtZUJ5dGVTdHJpbmcoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYSBieXRlIGFycmF5IHZhbHVlLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBhcnJheSBwYXJzZWQgKGFzIGEgc3RyaW5nKS4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGEgYnl0ZSBhcnJheSB2YWx1ZSBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICBsaXN0ID0gW3NlbGYuX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKCldCisgICAgd2hpbGUgbGVuKHNlbGYudG9rZW4pID4gMCBhbmQgc2VsZi50b2tlblswXSBpbiAoJ1wnJywgJyInKToKKyAgICAgIGxpc3QuYXBwZW5kKHNlbGYuX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKCkpCisgICAgcmV0dXJuICIiLmpvaW4obGlzdCkKKworICBkZWYgX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKHNlbGYpOgorICAgICIiIkNvbnN1bWUgb25lIHRva2VuIG9mIGEgc3RyaW5nIGxpdGVyYWwuCisKKyAgICBTdHJpbmcgbGl0ZXJhbHMgKHdoZXRoZXIgYnl0ZXMgb3IgdGV4dCkgY2FuIGNvbWUgaW4gbXVsdGlwbGUgYWRqYWNlbnQKKyAgICB0b2tlbnMgd2hpY2ggYXJlIGF1dG9tYXRpY2FsbHkgY29uY2F0ZW5hdGVkLCBsaWtlIGluIEMgb3IgUHl0aG9uLiAgVGhpcworICAgIG1ldGhvZCBvbmx5IGNvbnN1bWVzIG9uZSB0b2tlbi4KKyAgICAiIiIKKyAgICB0ZXh0ID0gc2VsZi50b2tlbgorICAgIGlmIGxlbih0ZXh0KSA8IDEgb3IgdGV4dFswXSBub3QgaW4gKCdcJycsICciJyk6CisgICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHBlY3RlZCBzdHJpbmcuJykKKworICAgIGlmIGxlbih0ZXh0KSA8IDIgb3IgdGV4dFstMV0gIT0gdGV4dFswXToKKyAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3IoJ1N0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4nKQorCisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gX0NVbmVzY2FwZSh0ZXh0WzE6LTFdKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgQ29uc3VtZUVudW0oc2VsZiwgZmllbGQpOgorICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IFBhcnNlRW51bShmaWVsZCwgc2VsZi50b2tlbikKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3Ioc3RyKGUpKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIFBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKHNlbGYsIG1lc3NhZ2UpOgorICAgICIiIkNyZWF0ZXMgYW5kICpyZXR1cm5zKiBhIFBhcnNlRXJyb3IgZm9yIHRoZSBwcmV2aW91c2x5IHJlYWQgdG9rZW4uCisKKyAgICBBcmdzOgorICAgICAgbWVzc2FnZTogQSBtZXNzYWdlIHRvIHNldCBmb3IgdGhlIGV4Y2VwdGlvbi4KKworICAgIFJldHVybnM6CisgICAgICBBIFBhcnNlRXJyb3IgaW5zdGFuY2UuCisgICAgIiIiCisgICAgcmV0dXJuIFBhcnNlRXJyb3IoJyVkOiVkIDogJXMnICUgKAorICAgICAgICBzZWxmLl9wcmV2aW91c19saW5lICsgMSwgc2VsZi5fcHJldmlvdXNfY29sdW1uICsgMSwgbWVzc2FnZSkpCisKKyAgZGVmIF9QYXJzZUVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICIiIkNyZWF0ZXMgYW5kICpyZXR1cm5zKiBhIFBhcnNlRXJyb3IgZm9yIHRoZSBjdXJyZW50IHRva2VuLiIiIgorICAgIHJldHVybiBQYXJzZUVycm9yKCclZDolZCA6ICVzJyAlICgKKyAgICAgICAgc2VsZi5fbGluZSArIDEsIHNlbGYuX2NvbHVtbiArIDEsIG1lc3NhZ2UpKQorCisgIGRlZiBfU3RyaW5nUGFyc2VFcnJvcihzZWxmLCBlKToKKyAgICByZXR1cm4gc2VsZi5fUGFyc2VFcnJvcignQ291bGRuXCd0IHBhcnNlIHN0cmluZzogJyArIHN0cihlKSkKKworICBkZWYgTmV4dFRva2VuKHNlbGYpOgorICAgICIiIlJlYWRzIHRoZSBuZXh0IG1lYW5pbmdmdWwgdG9rZW4uIiIiCisgICAgc2VsZi5fcHJldmlvdXNfbGluZSA9IHNlbGYuX2xpbmUKKyAgICBzZWxmLl9wcmV2aW91c19jb2x1bW4gPSBzZWxmLl9jb2x1bW4KKworICAgIHNlbGYuX2NvbHVtbiArPSBsZW4oc2VsZi50b2tlbikKKyAgICBzZWxmLl9Ta2lwV2hpdGVzcGFjZSgpCisKKyAgICBpZiBub3Qgc2VsZi5fbGluZXMgYW5kIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpIDw9IHNlbGYuX2NvbHVtbjoKKyAgICAgIHNlbGYudG9rZW4gPSAnJworICAgICAgcmV0dXJuCisKKyAgICBtYXRjaCA9IHNlbGYuX1RPS0VOLm1hdGNoKHNlbGYuX2N1cnJlbnRfbGluZSwgc2VsZi5fY29sdW1uKQorICAgIGlmIG1hdGNoOgorICAgICAgdG9rZW4gPSBtYXRjaC5ncm91cCgwKQorICAgICAgc2VsZi50b2tlbiA9IHRva2VuCisgICAgZWxzZToKKyAgICAgIHNlbGYudG9rZW4gPSBzZWxmLl9jdXJyZW50X2xpbmVbc2VsZi5fY29sdW1uXQorCisKKyMgdGV4dC5lbmNvZGUoJ3N0cmluZ19lc2NhcGUnKSBkb2VzIG5vdCBzZWVtIHRvIHNhdGlzZnkgb3VyIG5lZWRzIGFzIGl0CisjIGVuY29kZXMgdW5wcmludGFibGUgY2hhcmFjdGVycyB1c2luZyB0d28tZGlnaXQgaGV4IGVzY2FwZXMgd2hlcmVhcyBvdXIKKyMgQysrIHVuZXNjYXBpbmcgZnVuY3Rpb24gYWxsb3dzIGhleCBlc2NhcGVzIHRvIGJlIGFueSBsZW5ndGguICBTbywKKyMgIlwwMDExIi5lbmNvZGUoJ3N0cmluZ19lc2NhcGUnKSBlbmRzIHVwIGJlaW5nICJcXHgwMTEiLCB3aGljaCB3aWxsIGJlCisjIGRlY29kZWQgaW4gQysrIGFzIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgd2l0aCBjaGFyIGNvZGUgMHgxMS4KK2RlZiBfQ0VzY2FwZSh0ZXh0LCBhc191dGY4KToKKyAgZGVmIGVzY2FwZShjKToKKyAgICBvID0gb3JkKGMpCisgICAgaWYgbyA9PSAxMDogcmV0dXJuIHIiXG4iICAgIyBvcHRpb25hbCBlc2NhcGUKKyAgICBpZiBvID09IDEzOiByZXR1cm4gciJcciIgICAjIG9wdGlvbmFsIGVzY2FwZQorICAgIGlmIG8gPT0gIDk6IHJldHVybiByIlx0IiAgICMgb3B0aW9uYWwgZXNjYXBlCisgICAgaWYgbyA9PSAzOTogcmV0dXJuIHIiXCciICAgIyBvcHRpb25hbCBlc2NhcGUKKworICAgIGlmIG8gPT0gMzQ6IHJldHVybiByJ1wiJyAgICMgbmVjZXNzYXJ5IGVzY2FwZQorICAgIGlmIG8gPT0gOTI6IHJldHVybiByIlxcIiAgICMgbmVjZXNzYXJ5IGVzY2FwZQorCisgICAgIyBuZWNlc3NhcnkgZXNjYXBlcworICAgIGlmIG5vdCBhc191dGY4IGFuZCAobyA+PSAxMjcgb3IgbyA8IDMyKTogcmV0dXJuICJcXCUwM28iICUgbworICAgIHJldHVybiBjCisgIHJldHVybiAiIi5qb2luKFtlc2NhcGUoYykgZm9yIGMgaW4gdGV4dF0pCisKKworX0NVTkVTQ0FQRV9IRVggPSByZS5jb21waWxlKHInKFxcKyl4KFswLTlhLWZBLUZdKSg/IVswLTlhLWZBLUZdKScpCisKKworZGVmIF9DVW5lc2NhcGUodGV4dCk6CisgIGRlZiBSZXBsYWNlSGV4KG0pOgorICAgICMgT25seSByZXBsYWNlIHRoZSBtYXRjaCBpZiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYmFjayBzbGFzaGVzIGlzIG9kZC4gaS5lLgorICAgICMgdGhlIHNsYXNoIGl0c2VsZiBpcyBub3QgZXNjYXBlZC4KKyAgICBpZiBsZW4obS5ncm91cCgxKSkgJiAxOgorICAgICAgcmV0dXJuIG0uZ3JvdXAoMSkgKyAneDAnICsgbS5ncm91cCgyKQorICAgIHJldHVybiBtLmdyb3VwKDApCisKKyAgIyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlICdzdHJpbmdfZXNjYXBlJyBlbmNvZGluZyBkb2Vzbid0CisgICMgYWxsb3cgc2luZ2xlLWRpZ2l0IGhleCBlc2NhcGVzIChsaWtlICdceGYnKS4KKyAgcmVzdWx0ID0gX0NVTkVTQ0FQRV9IRVguc3ViKFJlcGxhY2VIZXgsIHRleHQpCisgIHJldHVybiByZXN1bHQuZGVjb2RlKCdzdHJpbmdfZXNjYXBlJykKKworCitkZWYgUGFyc2VJbnRlZ2VyKHRleHQsIGlzX3NpZ25lZD1GYWxzZSwgaXNfbG9uZz1GYWxzZSk6CisgICIiIlBhcnNlcyBhbiBpbnRlZ2VyLgorCisgIEFyZ3M6CisgICAgdGV4dDogVGhlIHRleHQgdG8gcGFyc2UuCisgICAgaXNfc2lnbmVkOiBUcnVlIGlmIGEgc2lnbmVkIGludGVnZXIgbXVzdCBiZSBwYXJzZWQuCisgICAgaXNfbG9uZzogVHJ1ZSBpZiBhIGxvbmcgaW50ZWdlciBtdXN0IGJlIHBhcnNlZC4KKworICBSZXR1cm5zOgorICAgIFRoZSBpbnRlZ2VyIHZhbHVlLgorCisgIFJhaXNlczoKKyAgICBWYWx1ZUVycm9yOiBUaHJvd24gSWZmIHRoZSB0ZXh0IGlzIG5vdCBhIHZhbGlkIGludGVnZXIuCisgICIiIgorICAjIERvIHRoZSBhY3R1YWwgcGFyc2luZy4gRXhjZXB0aW9uIGhhbmRsaW5nIGlzIHByb3BhZ2F0ZWQgdG8gY2FsbGVyLgorICB0cnk6CisgICAgcmVzdWx0ID0gaW50KHRleHQsIDApCisgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAlcycgJSB0ZXh0KQorCisgICMgQ2hlY2sgaWYgdGhlIGludGVnZXIgaXMgc2FuZS4gRXhjZXB0aW9ucyBoYW5kbGVkIGJ5IGNhbGxlcnMuCisgIGNoZWNrZXIgPSBfSU5URUdFUl9DSEVDS0VSU1syICogaW50KGlzX2xvbmcpICsgaW50KGlzX3NpZ25lZCldCisgIGNoZWNrZXIuQ2hlY2tWYWx1ZShyZXN1bHQpCisgIHJldHVybiByZXN1bHQKKworCitkZWYgUGFyc2VGbG9hdCh0ZXh0KToKKyAgIiIiUGFyc2UgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisKKyAgQXJnczoKKyAgICB0ZXh0OiBUZXh0IHRvIHBhcnNlLgorCisgIFJldHVybnM6CisgICAgVGhlIG51bWJlciBwYXJzZWQuCisKKyAgUmFpc2VzOgorICAgIFZhbHVlRXJyb3I6IElmIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNvdWxkbid0IGJlIHBhcnNlZC4KKyAgIiIiCisgIHRyeToKKyAgICAjIEFzc3VtZSBQeXRob24gY29tcGF0aWJsZSBzeW50YXguCisgICAgcmV0dXJuIGZsb2F0KHRleHQpCisgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICMgQ2hlY2sgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzLgorICAgIGlmIF9GTE9BVF9JTkZJTklUWS5tYXRjaCh0ZXh0KToKKyAgICAgIGlmIHRleHRbMF0gPT0gJy0nOgorICAgICAgICByZXR1cm4gZmxvYXQoJy1pbmYnKQorICAgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGZsb2F0KCdpbmYnKQorICAgIGVsaWYgX0ZMT0FUX05BTi5tYXRjaCh0ZXh0KToKKyAgICAgIHJldHVybiBmbG9hdCgnbmFuJykKKyAgICBlbHNlOgorICAgICAgIyBhc3N1bWUgJzEuMGYnIGZvcm1hdAorICAgICAgdHJ5OgorICAgICAgICByZXR1cm4gZmxvYXQodGV4dC5yc3RyaXAoJ2YnKSkKKyAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgZmxvYXQ6ICVzJyAlIHRleHQpCisKKworZGVmIFBhcnNlQm9vbCh0ZXh0KToKKyAgIiIiUGFyc2UgYSBib29sZWFuIHZhbHVlLgorCisgIEFyZ3M6CisgICAgdGV4dDogVGV4dCB0byBwYXJzZS4KKworICBSZXR1cm5zOgorICAgIEJvb2xlYW4gdmFsdWVzIHBhcnNlZAorCisgIFJhaXNlczoKKyAgICBWYWx1ZUVycm9yOiBJZiB0ZXh0IGlzIG5vdCBhIHZhbGlkIGJvb2xlYW4uCisgICIiIgorICBpZiB0ZXh0IGluICgndHJ1ZScsICd0JywgJzEnKToKKyAgICByZXR1cm4gVHJ1ZQorICBlbGlmIHRleHQgaW4gKCdmYWxzZScsICdmJywgJzAnKToKKyAgICByZXR1cm4gRmFsc2UKKyAgZWxzZToKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHBlY3RlZCAidHJ1ZSIgb3IgImZhbHNlIi4nKQorCisKK2RlZiBQYXJzZUVudW0oZmllbGQsIHZhbHVlKToKKyAgIiIiUGFyc2UgYW4gZW51bSB2YWx1ZS4KKworICBUaGUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBieSBhIG51bWJlciAodGhlIGVudW0gdmFsdWUpLCBvciBieQorICBhIHN0cmluZyBsaXRlcmFsICh0aGUgZW51bSBuYW1lKS4KKworICBBcmdzOgorICAgIGZpZWxkOiBFbnVtIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgdmFsdWU6IFN0cmluZyB2YWx1ZS4KKworICBSZXR1cm5zOgorICAgIEVudW0gdmFsdWUgbnVtYmVyLgorCisgIFJhaXNlczoKKyAgICBWYWx1ZUVycm9yOiBJZiB0aGUgZW51bSB2YWx1ZSBjb3VsZCBub3QgYmUgcGFyc2VkLgorICAiIiIKKyAgZW51bV9kZXNjcmlwdG9yID0gZmllbGQuZW51bV90eXBlCisgIHRyeToKKyAgICBudW1iZXIgPSBpbnQodmFsdWUsIDApCisgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICMgSWRlbnRpZmllci4KKyAgICBlbnVtX3ZhbHVlID0gZW51bV9kZXNjcmlwdG9yLnZhbHVlc19ieV9uYW1lLmdldCh2YWx1ZSwgTm9uZSkKKyAgICBpZiBlbnVtX3ZhbHVlIGlzIE5vbmU6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICdFbnVtIHR5cGUgIiVzIiBoYXMgbm8gdmFsdWUgbmFtZWQgJXMuJyAlICgKKyAgICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwgdmFsdWUpKQorICBlbHNlOgorICAgICMgTnVtZXJpYyB2YWx1ZS4KKyAgICBlbnVtX3ZhbHVlID0gZW51bV9kZXNjcmlwdG9yLnZhbHVlc19ieV9udW1iZXIuZ2V0KG51bWJlciwgTm9uZSkKKyAgICBpZiBlbnVtX3ZhbHVlIGlzIE5vbmU6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICdFbnVtIHR5cGUgIiVzIiBoYXMgbm8gdmFsdWUgd2l0aCBudW1iZXIgJWQuJyAlICgKKyAgICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwgbnVtYmVyKSkKKyAgcmV0dXJuIGVudW1fdmFsdWUubnVtYmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9tb3gucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9tb3gucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2U4MGJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL21veC5weQpAQCAtMCwwICsxLDE0MDEgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMi40CisjCisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSBpcyB1c2VkIGZvciB0ZXN0aW5nLiAgVGhlIG9yaWdpbmFsIGlzIGF0OgorIyAgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9weW1veC8KKworIiIiTW94LCBhbiBvYmplY3QtbW9ja2luZyBmcmFtZXdvcmsgZm9yIFB5dGhvbi4KKworTW94IHdvcmtzIGluIHRoZSByZWNvcmQtcmVwbGF5LXZlcmlmeSBwYXJhZGlnbS4gIFdoZW4geW91IGZpcnN0IGNyZWF0ZQorYSBtb2NrIG9iamVjdCwgaXQgaXMgaW4gcmVjb3JkIG1vZGUuICBZb3UgdGhlbiBwcm9ncmFtbWF0aWNhbGx5IHNldAordGhlIGV4cGVjdGVkIGJlaGF2aW9yIG9mIHRoZSBtb2NrIG9iamVjdCAod2hhdCBtZXRob2RzIGFyZSB0byBiZQorY2FsbGVkIG9uIGl0LCB3aXRoIHdoYXQgcGFyYW1ldGVycywgd2hhdCB0aGV5IHNob3VsZCByZXR1cm4sIGFuZCBpbgord2hhdCBvcmRlcikuCisKK09uY2UgeW91IGhhdmUgc2V0IHVwIHRoZSBleHBlY3RlZCBtb2NrIGJlaGF2aW9yLCB5b3UgcHV0IGl0IGluIHJlcGxheQorbW9kZS4gIE5vdyB0aGUgbW9jayByZXNwb25kcyB0byBtZXRob2QgY2FsbHMganVzdCBhcyB5b3UgdG9sZCBpdCB0by4KK0lmIGFuIHVuZXhwZWN0ZWQgbWV0aG9kIChvciBhbiBleHBlY3RlZCBtZXRob2Qgd2l0aCB1bmV4cGVjdGVkCitwYXJhbWV0ZXJzKSBpcyBjYWxsZWQsIHRoZW4gYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLgorCitPbmNlIHlvdSBhcmUgZG9uZSBpbnRlcmFjdGluZyB3aXRoIHRoZSBtb2NrLCB5b3UgbmVlZCB0byB2ZXJpZnkgdGhhdAorYWxsIHRoZSBleHBlY3RlZCBpbnRlcmFjdGlvbnMgb2NjdXJlZC4gIChNYXliZSB5b3VyIGNvZGUgZXhpdGVkCitwcmVtYXR1cmVseSB3aXRob3V0IGNhbGxpbmcgc29tZSBjbGVhbnVwIG1ldGhvZCEpICBUaGUgdmVyaWZ5IHBoYXNlCitlbnN1cmVzIHRoYXQgZXZlcnkgZXhwZWN0ZWQgbWV0aG9kIHdhcyBjYWxsZWQ7IG90aGVyd2lzZSwgYW4gZXhjZXB0aW9uCit3aWxsIGJlIHJhaXNlZC4KKworU3VnZ2VzdGVkIHVzYWdlIC8gd29ya2Zsb3c6CisKKyAgIyBDcmVhdGUgTW94IGZhY3RvcnkKKyAgbXlfbW94ID0gTW94KCkKKworICAjIENyZWF0ZSBhIG1vY2sgZGF0YSBhY2Nlc3Mgb2JqZWN0CisgIG1vY2tfZGFvID0gbXlfbW94LkNyZWF0ZU1vY2soREFPQ2xhc3MpCisKKyAgIyBTZXQgdXAgZXhwZWN0ZWQgYmVoYXZpb3IKKyAgbW9ja19kYW8uUmV0cmlldmVQZXJzb25XaXRoSWRlbnRpZmllcignMScpLkFuZFJldHVybihwZXJzb24pCisgIG1vY2tfZGFvLkRlbGV0ZVBlcnNvbihwZXJzb24pCisKKyAgIyBQdXQgbW9ja3MgaW4gcmVwbGF5IG1vZGUKKyAgbXlfbW94LlJlcGxheUFsbCgpCisKKyAgIyBJbmplY3QgbW9jayBvYmplY3QgYW5kIHJ1biB0ZXN0CisgIGNvbnRyb2xsZXIuU2V0RGFvKG1vY2tfZGFvKQorICBjb250cm9sbGVyLkRlbGV0ZVBlcnNvbkJ5SWQoJzEnKQorCisgICMgVmVyaWZ5IGFsbCBtZXRob2RzIHdlcmUgY2FsbGVkIGFzIGV4cGVjdGVkCisgIG15X21veC5WZXJpZnlBbGwoKQorIiIiCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitpbXBvcnQgcmUKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBzdHVib3V0CisKK2NsYXNzIEVycm9yKEFzc2VydGlvbkVycm9yKToKKyAgIiIiQmFzZSBleGNlcHRpb24gZm9yIHRoaXMgbW9kdWxlLiIiIgorCisgIHBhc3MKKworCitjbGFzcyBFeHBlY3RlZE1ldGhvZENhbGxzRXJyb3IoRXJyb3IpOgorICAiIiJSYWlzZWQgd2hlbiBWZXJpZnkoKSBpcyBjYWxsZWQgYmVmb3JlIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkX21ldGhvZHMpOgorICAgICIiIkluaXQgZXhjZXB0aW9uLgorCisgICAgQXJnczoKKyAgICAgICMgZXhwZWN0ZWRfbWV0aG9kczogQSBzZXF1ZW5jZSBvZiBNb2NrTWV0aG9kIG9iamVjdHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuCisgICAgICAjICAgY2FsbGVkLgorICAgICAgZXhwZWN0ZWRfbWV0aG9kczogW01vY2tNZXRob2RdCisKKyAgICBSYWlzZXM6CisgICAgICBWYWx1ZUVycm9yOiBpZiBleHBlY3RlZF9tZXRob2RzIGNvbnRhaW5zIG5vIG1ldGhvZHMuCisgICAgIiIiCisKKyAgICBpZiBub3QgZXhwZWN0ZWRfbWV0aG9kczoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGV4cGVjdGVkIG1ldGhvZCIpCisgICAgRXJyb3IuX19pbml0X18oc2VsZikKKyAgICBzZWxmLl9leHBlY3RlZF9tZXRob2RzID0gZXhwZWN0ZWRfbWV0aG9kcworCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIGNhbGxzID0gIlxuIi5qb2luKFsiJTNkLiAgJXMiICUgKGksIG0pCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBpLCBtIGluIGVudW1lcmF0ZShzZWxmLl9leHBlY3RlZF9tZXRob2RzKV0pCisgICAgcmV0dXJuICJWZXJpZnk6IEV4cGVjdGVkIG1ldGhvZHMgbmV2ZXIgY2FsbGVkOlxuJXMiICUgKGNhbGxzLCkKKworCitjbGFzcyBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKEVycm9yKToKKyAgIiIiUmFpc2VkIHdoZW4gYW4gdW5leHBlY3RlZCBtZXRob2QgaXMgY2FsbGVkLgorCisgIFRoaXMgY2FuIG9jY3VyIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGluY29ycmVjdCBwYXJhbWV0ZXJzLCBvciBvdXQgb2YgdGhlCisgIHNwZWNpZmllZCBvcmRlci4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHVuZXhwZWN0ZWRfbWV0aG9kLCBleHBlY3RlZCk6CisgICAgIiIiSW5pdCBleGNlcHRpb24uCisKKyAgICBBcmdzOgorICAgICAgIyB1bmV4cGVjdGVkX21ldGhvZDogTW9ja01ldGhvZCB0aGF0IHdhcyBjYWxsZWQgYnV0IHdhcyBub3QgYXQgdGhlIGhlYWQgb2YKKyAgICAgICMgICB0aGUgZXhwZWN0ZWRfbWV0aG9kIHF1ZXVlLgorICAgICAgIyBleHBlY3RlZDogTW9ja01ldGhvZCBvciBVbm9yZGVyZWRHcm91cCB0aGUgbWV0aG9kIHNob3VsZCBoYXZlCisgICAgICAjICAgYmVlbiBpbi4KKyAgICAgIHVuZXhwZWN0ZWRfbWV0aG9kOiBNb2NrTWV0aG9kCisgICAgICBleHBlY3RlZDogTW9ja01ldGhvZCBvciBVbm9yZGVyZWRHcm91cAorICAgICIiIgorCisgICAgRXJyb3IuX19pbml0X18oc2VsZikKKyAgICBzZWxmLl91bmV4cGVjdGVkX21ldGhvZCA9IHVuZXhwZWN0ZWRfbWV0aG9kCisgICAgc2VsZi5fZXhwZWN0ZWQgPSBleHBlY3RlZAorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHJldHVybiAiVW5leHBlY3RlZCBtZXRob2QgY2FsbDogJXMuICBFeHBlY3Rpbmc6ICVzIiAlIFwKKyAgICAgIChzZWxmLl91bmV4cGVjdGVkX21ldGhvZCwgc2VsZi5fZXhwZWN0ZWQpCisKKworY2xhc3MgVW5rbm93bk1ldGhvZENhbGxFcnJvcihFcnJvcik6CisgICIiIlJhaXNlZCBpZiBhbiB1bmtub3duIG1ldGhvZCBpcyByZXF1ZXN0ZWQgb2YgdGhlIG1vY2sgb2JqZWN0LiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB1bmtub3duX21ldGhvZF9uYW1lKToKKyAgICAiIiJJbml0IGV4Y2VwdGlvbi4KKworICAgIEFyZ3M6CisgICAgICAjIHVua25vd25fbWV0aG9kX25hbWU6IE1ldGhvZCBjYWxsIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIG1vY2tlZCBjbGFzcydzCisgICAgICAjICAgcHVibGljIGludGVyZmFjZS4KKyAgICAgIHVua25vd25fbWV0aG9kX25hbWU6IHN0cgorICAgICIiIgorCisgICAgRXJyb3IuX19pbml0X18oc2VsZikKKyAgICBzZWxmLl91bmtub3duX21ldGhvZF9uYW1lID0gdW5rbm93bl9tZXRob2RfbmFtZQorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHJldHVybiAiTWV0aG9kIGNhbGxlZCBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIG9iamVjdDogJXMiICUgXAorICAgICAgc2VsZi5fdW5rbm93bl9tZXRob2RfbmFtZQorCisKK2NsYXNzIE1veChvYmplY3QpOgorICAiIiJNb3g6IGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbW9jayBvYmplY3RzLiIiIgorCisgICMgQSBsaXN0IG9mIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHN0dWJiZWQgb3V0IHdpdGggTW9ja09iamVjdHMgKGFzCisgICMgb3Bwb3NlZCB0byBNb2NrQW55dGhpbmdzKS4KKyAgX1VTRV9NT0NLX09CSkVDVCA9IFt0eXBlcy5DbGFzc1R5cGUsIHR5cGVzLkluc3RhbmNlVHlwZSwgdHlwZXMuTW9kdWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlcy5PYmplY3RUeXBlLCB0eXBlcy5UeXBlVHlwZV0KKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgIiIiSW5pdGlhbGl6ZSBhIG5ldyBNb3guIiIiCisKKyAgICBzZWxmLl9tb2NrX29iamVjdHMgPSBbXQorICAgIHNlbGYuc3R1YnMgPSBzdHVib3V0LlN0dWJPdXRGb3JUZXN0aW5nKCkKKworICBkZWYgQ3JlYXRlTW9jayhzZWxmLCBjbGFzc190b19tb2NrKToKKyAgICAiIiJDcmVhdGUgYSBuZXcgbW9jayBvYmplY3QuCisKKyAgICBBcmdzOgorICAgICAgIyBjbGFzc190b19tb2NrOiB0aGUgY2xhc3MgdG8gYmUgbW9ja2VkCisgICAgICBjbGFzc190b19tb2NrOiBjbGFzcworCisgICAgUmV0dXJuczoKKyAgICAgIE1vY2tPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgY2xhc3NfdG9fbW9jayB3b3VsZCBiZS4KKyAgICAiIiIKKworICAgIG5ld19tb2NrID0gTW9ja09iamVjdChjbGFzc190b19tb2NrKQorICAgIHNlbGYuX21vY2tfb2JqZWN0cy5hcHBlbmQobmV3X21vY2spCisgICAgcmV0dXJuIG5ld19tb2NrCisKKyAgZGVmIENyZWF0ZU1vY2tBbnl0aGluZyhzZWxmKToKKyAgICAiIiJDcmVhdGUgYSBtb2NrIHRoYXQgd2lsbCBhY2NlcHQgYW55IG1ldGhvZCBjYWxscy4KKworICAgIFRoaXMgZG9lcyBub3QgZW5mb3JjZSBhbiBpbnRlcmZhY2UuCisgICAgIiIiCisKKyAgICBuZXdfbW9jayA9IE1vY2tBbnl0aGluZygpCisgICAgc2VsZi5fbW9ja19vYmplY3RzLmFwcGVuZChuZXdfbW9jaykKKyAgICByZXR1cm4gbmV3X21vY2sKKworICBkZWYgUmVwbGF5QWxsKHNlbGYpOgorICAgICIiIlNldCBhbGwgbW9jayBvYmplY3RzIHRvIHJlcGxheSBtb2RlLiIiIgorCisgICAgZm9yIG1vY2tfb2JqIGluIHNlbGYuX21vY2tfb2JqZWN0czoKKyAgICAgIG1vY2tfb2JqLl9SZXBsYXkoKQorCisKKyAgZGVmIFZlcmlmeUFsbChzZWxmKToKKyAgICAiIiJDYWxsIHZlcmlmeSBvbiBhbGwgbW9jayBvYmplY3RzIGNyZWF0ZWQuIiIiCisKKyAgICBmb3IgbW9ja19vYmogaW4gc2VsZi5fbW9ja19vYmplY3RzOgorICAgICAgbW9ja19vYmouX1ZlcmlmeSgpCisKKyAgZGVmIFJlc2V0QWxsKHNlbGYpOgorICAgICIiIkNhbGwgcmVzZXQgb24gYWxsIG1vY2sgb2JqZWN0cy4gIFRoaXMgZG9lcyBub3QgdW5zZXQgc3R1YnMuIiIiCisKKyAgICBmb3IgbW9ja19vYmogaW4gc2VsZi5fbW9ja19vYmplY3RzOgorICAgICAgbW9ja19vYmouX1Jlc2V0KCkKKworICBkZWYgU3R1Yk91dFdpdGhNb2NrKHNlbGYsIG9iaiwgYXR0cl9uYW1lLCB1c2VfbW9ja19hbnl0aGluZz1GYWxzZSk6CisgICAgIiIiUmVwbGFjZSBhIG1ldGhvZCwgYXR0cmlidXRlLCBldGMuIHdpdGggYSBNb2NrLgorCisgICAgVGhpcyB3aWxsIHJlcGxhY2UgYSBjbGFzcyBvciBtb2R1bGUgd2l0aCBhIE1vY2tPYmplY3QsIGFuZCBldmVyeXRoaW5nIGVsc2UKKyAgICAobWV0aG9kLCBmdW5jdGlvbiwgZXRjKSB3aXRoIGEgTW9ja0FueXRoaW5nLiAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0bworICAgIGFsd2F5cyB1c2UgYSBNb2NrQW55dGhpbmcgYnkgc2V0dGluZyB1c2VfbW9ja19hbnl0aGluZyB0byBUcnVlLgorCisgICAgQXJnczoKKyAgICAgIG9iajogQSBQeXRob24gb2JqZWN0IChjbGFzcywgbW9kdWxlLCBpbnN0YW5jZSwgY2FsbGFibGUpLgorICAgICAgYXR0cl9uYW1lOiBzdHIuICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHJlcGxhY2Ugd2l0aCBhIG1vY2suCisgICAgICB1c2VfbW9ja19hbnl0aGluZzogYm9vbC4gVHJ1ZSBpZiBhIE1vY2tBbnl0aGluZyBzaG91bGQgYmUgdXNlZCByZWdhcmRsZXNzCisgICAgICAgIG9mIHRoZSB0eXBlIG9mIGF0dHJpYnV0ZS4KKyAgICAiIiIKKworICAgIGF0dHJfdG9fcmVwbGFjZSA9IGdldGF0dHIob2JqLCBhdHRyX25hbWUpCisgICAgaWYgdHlwZShhdHRyX3RvX3JlcGxhY2UpIGluIHNlbGYuX1VTRV9NT0NLX09CSkVDVCBhbmQgbm90IHVzZV9tb2NrX2FueXRoaW5nOgorICAgICAgc3R1YiA9IHNlbGYuQ3JlYXRlTW9jayhhdHRyX3RvX3JlcGxhY2UpCisgICAgZWxzZToKKyAgICAgIHN0dWIgPSBzZWxmLkNyZWF0ZU1vY2tBbnl0aGluZygpCisKKyAgICBzZWxmLnN0dWJzLlNldChvYmosIGF0dHJfbmFtZSwgc3R1YikKKworICBkZWYgVW5zZXRTdHVicyhzZWxmKToKKyAgICAiIiJSZXN0b3JlIHN0dWJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLiIiIgorCisgICAgc2VsZi5zdHVicy5VbnNldEFsbCgpCisKK2RlZiBSZXBsYXkoKmFyZ3MpOgorICAiIiJQdXQgbW9ja3MgaW50byBSZXBsYXkgbW9kZS4KKworICBBcmdzOgorICAgICMgYXJncyBpcyBhbnkgbnVtYmVyIG9mIG1vY2tzIHRvIHB1dCBpbnRvIHJlcGxheSBtb2RlLgorICAiIiIKKworICBmb3IgbW9jayBpbiBhcmdzOgorICAgIG1vY2suX1JlcGxheSgpCisKKworZGVmIFZlcmlmeSgqYXJncyk6CisgICIiIlZlcmlmeSBtb2Nrcy4KKworICBBcmdzOgorICAgICMgYXJncyBpcyBhbnkgbnVtYmVyIG9mIG1vY2tzIHRvIGJlIHZlcmlmaWVkLgorICAiIiIKKworICBmb3IgbW9jayBpbiBhcmdzOgorICAgIG1vY2suX1ZlcmlmeSgpCisKKworZGVmIFJlc2V0KCphcmdzKToKKyAgIiIiUmVzZXQgbW9ja3MuCisKKyAgQXJnczoKKyAgICAjIGFyZ3MgaXMgYW55IG51bWJlciBvZiBtb2NrcyB0byBiZSByZXNldC4KKyAgIiIiCisKKyAgZm9yIG1vY2sgaW4gYXJnczoKKyAgICBtb2NrLl9SZXNldCgpCisKKworY2xhc3MgTW9ja0FueXRoaW5nOgorICAiIiJBIG1vY2sgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2NrIGFueXRoaW5nLgorCisgIFRoaXMgaXMgaGVscGZ1bCBmb3IgbW9ja2luZyBjbGFzc2VzIHRoYXQgZG8gbm90IHByb3ZpZGUgYSBwdWJsaWMgaW50ZXJmYWNlLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgIiIiICIiIgorICAgIHNlbGYuX1Jlc2V0KCkKKworICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbWV0aG9kX25hbWUpOgorICAgICIiIkludGVyY2VwdCBtZXRob2QgY2FsbHMgb24gdGhpcyBvYmplY3QuCisKKyAgICAgQSBuZXcgTW9ja01ldGhvZCBpcyByZXR1cm5lZCB0aGF0IGlzIGF3YXJlIG9mIHRoZSBNb2NrQW55dGhpbmcncworICAgICBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuICBUaGUgY2FsbCB3aWxsIGJlIHJlY29yZGVkIG9yIHJlcGxheWVkCisgICAgIGJ5IHRoZSBNb2NrTWV0aG9kJ3MgX19jYWxsX18uCisKKyAgICBBcmdzOgorICAgICAgIyBtZXRob2QgbmFtZTogdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQuCisgICAgICBtZXRob2RfbmFtZTogc3RyCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBuZXcgTW9ja01ldGhvZCBhd2FyZSBvZiBNb2NrQW55dGhpbmcncyBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuCisgICAgIiIiCisKKyAgICByZXR1cm4gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZChtZXRob2RfbmFtZSkKKworICBkZWYgX0NyZWF0ZU1vY2tNZXRob2Qoc2VsZiwgbWV0aG9kX25hbWUpOgorICAgICIiIkNyZWF0ZSBhIG5ldyBtb2NrIG1ldGhvZCBjYWxsIGFuZCByZXR1cm4gaXQuCisKKyAgICBBcmdzOgorICAgICAgIyBtZXRob2QgbmFtZTogdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQuCisgICAgICBtZXRob2RfbmFtZTogc3RyCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBuZXcgTW9ja01ldGhvZCBhd2FyZSBvZiBNb2NrQW55dGhpbmcncyBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuCisgICAgIiIiCisKKyAgICByZXR1cm4gTW9ja01ldGhvZChtZXRob2RfbmFtZSwgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUpCisKKyAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICIiIlJldHVybiAxIGZvciBub256ZXJvIHNvIHRoZSBtb2NrIGNhbiBiZSB1c2VkIGFzIGEgY29uZGl0aW9uYWwuIiIiCisKKyAgICByZXR1cm4gMQorCisgIGRlZiBfX2VxX18oc2VsZiwgcmhzKToKKyAgICAiIiJQcm92aWRlIGN1c3RvbSBsb2dpYyB0byBjb21wYXJlIG9iamVjdHMuIiIiCisKKyAgICByZXR1cm4gKGlzaW5zdGFuY2UocmhzLCBNb2NrQW55dGhpbmcpIGFuZAorICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUgPT0gcmhzLl9yZXBsYXlfbW9kZSBhbmQKKyAgICAgICAgICAgIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlID09IHJocy5fZXhwZWN0ZWRfY2FsbHNfcXVldWUpCisKKyAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgorICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIHRvIGNvbXBhcmUgb2JqZWN0cy4iIiIKKworICAgIHJldHVybiBub3Qgc2VsZiA9PSByaHMKKworICBkZWYgX1JlcGxheShzZWxmKToKKyAgICAiIiJTdGFydCByZXBsYXlpbmcgZXhwZWN0ZWQgbWV0aG9kIGNhbGxzLiIiIgorCisgICAgc2VsZi5fcmVwbGF5X21vZGUgPSBUcnVlCisKKyAgZGVmIF9WZXJpZnkoc2VsZik6CisgICAgIiIiVmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBleHBlY3RlZCBjYWxscyBoYXZlIGJlZW4gbWFkZS4KKworICAgIFJhaXNlczoKKyAgICAgIEV4cGVjdGVkTWV0aG9kQ2FsbHNFcnJvcjogaWYgdGhlcmUgYXJlIHN0aWxsIG1vcmUgbWV0aG9kIGNhbGxzIGluIHRoZQorICAgICAgICBleHBlY3RlZCBxdWV1ZS4KKyAgICAiIiIKKworICAgICMgSWYgdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgY2FsbHMgaXMgbm90IGVtcHR5LCByYWlzZSBhbiBleGNlcHRpb24KKyAgICBpZiBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZToKKyAgICAgICMgVGhlIGxhc3QgTXVsdGlwbGVUaW1lc0dyb3VwIGlzIG5vdCBwb3BwZWQgZnJvbSB0aGUgcXVldWUuCisgICAgICBpZiAobGVuKHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKSA9PSAxIGFuZAorICAgICAgICAgIGlzaW5zdGFuY2Uoc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWVbMF0sIE11bHRpcGxlVGltZXNHcm91cCkgYW5kCisgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWVbMF0uSXNTYXRpc2ZpZWQoKSk6CisgICAgICAgIHBhc3MKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEV4cGVjdGVkTWV0aG9kQ2FsbHNFcnJvcihzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSkKKworICBkZWYgX1Jlc2V0KHNlbGYpOgorICAgICIiIlJlc2V0IHRoZSBzdGF0ZSBvZiB0aGlzIG1vY2sgdG8gcmVjb3JkIG1vZGUgd2l0aCBhbiBlbXB0eSBxdWV1ZS4iIiIKKworICAgICMgTWFpbnRhaW4gYSBsaXN0IG9mIG1ldGhvZCBjYWxscyB3ZSBhcmUgZXhwZWN0aW5nCisgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUgPSBkZXF1ZSgpCisKKyAgICAjIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gc2V0dXAgbW9kZSwgbm90IHJlcGxheSBtb2RlCisgICAgc2VsZi5fcmVwbGF5X21vZGUgPSBGYWxzZQorCisKK2NsYXNzIE1vY2tPYmplY3QoTW9ja0FueXRoaW5nLCBvYmplY3QpOgorICAiIiJBIG1vY2sgb2JqZWN0IHRoYXQgc2ltdWxhdGVzIHRoZSBwdWJsaWMvcHJvdGVjdGVkIGludGVyZmFjZSBvZiBhIGNsYXNzLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGFzc190b19tb2NrKToKKyAgICAiIiJJbml0aWFsaXplIGEgbW9jayBvYmplY3QuCisKKyAgICBUaGlzIGRldGVybWluZXMgdGhlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIGNsYXNzIGFuZCBzdG9yZXMgdGhlbS4KKworICAgIEFyZ3M6CisgICAgICAjIGNsYXNzX3RvX21vY2s6IGNsYXNzIHRvIGJlIG1vY2tlZAorICAgICAgY2xhc3NfdG9fbW9jazogY2xhc3MKKyAgICAiIiIKKworICAgICMgVGhpcyBpcyB1c2VkIHRvIGhhY2sgYXJvdW5kIHRoZSBtaXhpbi9pbmhlcml0YW5jZSBvZiBNb2NrQW55dGhpbmcsIHdoaWNoCisgICAgIyBpcyBub3QgYSBwcm9wZXIgb2JqZWN0IChpdCBjYW4gYmUgYW55dGhpbmcuIDotKQorICAgIE1vY2tBbnl0aGluZy5fX2RpY3RfX1snX19pbml0X18nXShzZWxmKQorCisgICAgIyBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgcHVibGljIGFuZCBzcGVjaWFsIG1ldGhvZHMgd2Ugc2hvdWxkIG1vY2suCisgICAgc2VsZi5fa25vd25fbWV0aG9kcyA9IHNldCgpCisgICAgc2VsZi5fa25vd25fdmFycyA9IHNldCgpCisgICAgc2VsZi5fY2xhc3NfdG9fbW9jayA9IGNsYXNzX3RvX21vY2sKKyAgICBmb3IgbWV0aG9kIGluIGRpcihjbGFzc190b19tb2NrKToKKyAgICAgIGlmIGNhbGxhYmxlKGdldGF0dHIoY2xhc3NfdG9fbW9jaywgbWV0aG9kKSk6CisgICAgICAgIHNlbGYuX2tub3duX21ldGhvZHMuYWRkKG1ldGhvZCkKKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuX2tub3duX3ZhcnMuYWRkKG1ldGhvZCkKKworICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgIiIiSW50ZXJjZXB0IGF0dHJpYnV0ZSByZXF1ZXN0IG9uIHRoaXMgb2JqZWN0LgorCisgICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBhIHB1YmxpYyBjbGFzcyB2YXJpYWJsZSwgaXQgd2lsbCBiZSByZXR1cm5lZCBhbmQgbm90CisgICAgcmVjb3JkZWQgYXMgYSBjYWxsLgorCisgICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgYSB2YXJpYWJsZSwgaXQgaXMgaGFuZGxlZCBsaWtlIGEgbWV0aG9kCisgICAgY2FsbC4gVGhlIG1ldGhvZCBuYW1lIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2V0IG9mIG1vY2thYmxlCisgICAgbWV0aG9kcywgYW5kIGEgbmV3IE1vY2tNZXRob2QgaXMgcmV0dXJuZWQgdGhhdCBpcyBhd2FyZSBvZiB0aGUKKyAgICBNb2NrT2JqZWN0J3Mgc3RhdGUgKHJlY29yZCBvciByZXBsYXkpLiAgVGhlIGNhbGwgd2lsbCBiZSByZWNvcmRlZAorICAgIG9yIHJlcGxheWVkIGJ5IHRoZSBNb2NrTWV0aG9kJ3MgX19jYWxsX18uCisKKyAgICBBcmdzOgorICAgICAgIyBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGJlaW5nIHJlcXVlc3RlZC4KKyAgICAgIG5hbWU6IHN0cgorCisgICAgUmV0dXJuczoKKyAgICAgIEVpdGhlciBhIGNsYXNzIHZhcmlhYmxlIG9yIGEgbmV3IE1vY2tNZXRob2QgdGhhdCBpcyBhd2FyZSBvZiB0aGUgc3RhdGUKKyAgICAgIG9mIHRoZSBtb2NrIChyZWNvcmQgb3IgcmVwbGF5KS4KKworICAgIFJhaXNlczoKKyAgICAgIFVua25vd25NZXRob2RDYWxsRXJyb3IgaWYgdGhlIE1vY2tPYmplY3QgZG9lcyBub3QgbW9jayB0aGUgcmVxdWVzdGVkCisgICAgICAgICAgbWV0aG9kLgorICAgICIiIgorCisgICAgaWYgbmFtZSBpbiBzZWxmLl9rbm93bl92YXJzOgorICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fY2xhc3NfdG9fbW9jaywgbmFtZSkKKworICAgIGlmIG5hbWUgaW4gc2VsZi5fa25vd25fbWV0aG9kczoKKyAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVNb2NrTWV0aG9kKG5hbWUpCisKKyAgICByYWlzZSBVbmtub3duTWV0aG9kQ2FsbEVycm9yKG5hbWUpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgorICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIHRvIGNvbXBhcmUgb2JqZWN0cy4iIiIKKworICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tPYmplY3QpIGFuZAorICAgICAgICAgICAgc2VsZi5fY2xhc3NfdG9fbW9jayA9PSByaHMuX2NsYXNzX3RvX21vY2sgYW5kCisgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSA9PSByaHMuX3JlcGxheV9tb2RlIGFuZAorICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUgPT0gcmhzLl9leHBlY3RlZF9jYWxsc19xdWV1ZSkKKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgZm9yIG1vY2tpbmcgY2xhc3NlcyB0aGF0IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50LgorCisgICAgQXJnczoKKyAgICAgIGtleTogS2V5IHRvIHNldCB0aGUgdmFsdWUgZm9yLgorICAgICAgdmFsdWU6IFZhbHVlIHRvIHNldC4KKworICAgIFJldHVybnM6CisgICAgICBFeHBlY3RlZCByZXR1cm4gdmFsdWUgaW4gcmVwbGF5IG1vZGUuICBBIE1vY2tNZXRob2Qgb2JqZWN0IGZvciB0aGUKKyAgICAgIF9fc2V0aXRlbV9fIG1ldGhvZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGlmIG5vdCBpbiByZXBsYXkgbW9kZS4KKworICAgIFJhaXNlczoKKyAgICAgIFR5cGVFcnJvciBpZiB0aGUgdW5kZXJseWluZyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudC4KKyAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBleHBlY3QgdGhlIGNhbGwgdG8KKyAgICAgICAgX19zZXRpdGVtX18uCisKKyAgICAiIiIKKyAgICBzZXRpdGVtID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fc2V0aXRlbV9fJywgTm9uZSkKKworICAgICMgVmVyaWZ5IHRoZSBjbGFzcyBzdXBwb3J0cyBpdGVtIGFzc2lnbm1lbnQuCisgICAgaWYgc2V0aXRlbSBpcyBOb25lOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCdvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQnKQorCisgICAgIyBJZiB3ZSBhcmUgaW4gcmVwbGF5IG1vZGUgdGhlbiBzaW1wbHkgY2FsbCB0aGUgbW9jayBfX3NldGl0ZW1fXyBtZXRob2QuCisgICAgaWYgc2VsZi5fcmVwbGF5X21vZGU6CisgICAgICByZXR1cm4gTW9ja01ldGhvZCgnX19zZXRpdGVtX18nLCBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlcGxheV9tb2RlKShrZXksIHZhbHVlKQorCisKKyAgICAjIE90aGVyd2lzZSwgY3JlYXRlIGEgbW9jayBtZXRob2QgX19zZXRpdGVtX18uCisgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QoJ19fc2V0aXRlbV9fJykoa2V5LCB2YWx1ZSkKKworICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAiIiJQcm92aWRlIGN1c3RvbSBsb2dpYyBmb3IgbW9ja2luZyBjbGFzc2VzIHRoYXQgYXJlIHN1YnNjcmlwdGFibGUuCisKKyAgICBBcmdzOgorICAgICAga2V5OiBLZXkgdG8gcmV0dXJuIHRoZSB2YWx1ZSBmb3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgRXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGluIHJlcGxheSBtb2RlLiAgQSBNb2NrTWV0aG9kIG9iamVjdCBmb3IgdGhlCisgICAgICBfX2dldGl0ZW1fXyBtZXRob2QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBpZiBub3QgaW4gcmVwbGF5IG1vZGUuCisKKyAgICBSYWlzZXM6CisgICAgICBUeXBlRXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgY2xhc3MgaXMgbm90IHN1YnNjcmlwdGFibGUuCisgICAgICBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIGlmIHRoZSBvYmplY3QgZG9lcyBub3QgZXhwZWN0IHRoZSBjYWxsIHRvCisgICAgICAgIF9fc2V0aXRlbV9fLgorCisgICAgIiIiCisgICAgZ2V0aXRlbSA9IHNlbGYuX2NsYXNzX3RvX21vY2suX19kaWN0X18uZ2V0KCdfX2dldGl0ZW1fXycsIE5vbmUpCisKKyAgICAjIFZlcmlmeSB0aGUgY2xhc3Mgc3VwcG9ydHMgaXRlbSBhc3NpZ25tZW50LgorICAgIGlmIGdldGl0ZW0gaXMgTm9uZToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcigndW5zdWJzY3JpcHRhYmxlIG9iamVjdCcpCisKKyAgICAjIElmIHdlIGFyZSBpbiByZXBsYXkgbW9kZSB0aGVuIHNpbXBseSBjYWxsIHRoZSBtb2NrIF9fZ2V0aXRlbV9fIG1ldGhvZC4KKyAgICBpZiBzZWxmLl9yZXBsYXlfbW9kZToKKyAgICAgIHJldHVybiBNb2NrTWV0aG9kKCdfX2dldGl0ZW1fXycsIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUpKGtleSkKKworCisgICAgIyBPdGhlcndpc2UsIGNyZWF0ZSBhIG1vY2sgbWV0aG9kIF9fZ2V0aXRlbV9fLgorICAgIHJldHVybiBzZWxmLl9DcmVhdGVNb2NrTWV0aG9kKCdfX2dldGl0ZW1fXycpKGtleSkKKworICBkZWYgX19jYWxsX18oc2VsZiwgKnBhcmFtcywgKipuYW1lZF9wYXJhbXMpOgorICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBhcmUgY2FsbGFibGUuIiIiCisKKyAgICAjIFZlcmlmeSB0aGUgY2xhc3Mgd2UgYXJlIG1vY2tpbmcgaXMgY2FsbGFibGUKKyAgICBjYWxsYWJsZSA9IHNlbGYuX2NsYXNzX3RvX21vY2suX19kaWN0X18uZ2V0KCdfX2NhbGxfXycsIE5vbmUpCisgICAgaWYgY2FsbGFibGUgaXMgTm9uZToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignTm90IGNhbGxhYmxlJykKKworICAgICMgQmVjYXVzZSB0aGUgY2FsbCBpcyBoYXBwZW5pbmcgZGlyZWN0bHkgb24gdGhpcyBvYmplY3QgaW5zdGVhZCBvZiBhIG1ldGhvZCwKKyAgICAjIHRoZSBjYWxsIG9uIHRoZSBtb2NrIG1ldGhvZCBpcyBtYWRlIHJpZ2h0IGhlcmUKKyAgICBtb2NrX21ldGhvZCA9IHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QoJ19fY2FsbF9fJykKKyAgICByZXR1cm4gbW9ja19tZXRob2QoKnBhcmFtcywgKipuYW1lZF9wYXJhbXMpCisKKyAgQHByb3BlcnR5CisgIGRlZiBfX2NsYXNzX18oc2VsZik6CisgICAgIiIiUmV0dXJuIHRoZSBjbGFzcyB0aGF0IGlzIGJlaW5nIG1vY2tlZC4iIiIKKworICAgIHJldHVybiBzZWxmLl9jbGFzc190b19tb2NrCisKKworY2xhc3MgTW9ja01ldGhvZChvYmplY3QpOgorICAiIiJDYWxsYWJsZSBtb2NrIG1ldGhvZC4KKworICBBIE1vY2tNZXRob2Qgc2hvdWxkIGFjdCBleGFjdGx5IGxpa2UgdGhlIG1ldGhvZCBpdCBtb2NrcywgYWNjZXB0aW5nIHBhcmFtZXRlcnMKKyAgYW5kIHJldHVybmluZyBhIHZhbHVlLCBvciB0aHJvd2luZyBhbiBleGNlcHRpb24gKGFzIHNwZWNpZmllZCkuICBXaGVuIHRoaXMKKyAgbWV0aG9kIGlzIGNhbGxlZCwgaXQgY2FuIG9wdGlvbmFsbHkgdmVyaWZ5IHdoZXRoZXIgdGhlIGNhbGxlZCBtZXRob2QgKG5hbWUgYW5kCisgIHNpZ25hdHVyZSkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgbWV0aG9kLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kX25hbWUsIGNhbGxfcXVldWUsIHJlcGxheV9tb2RlKToKKyAgICAiIiJDb25zdHJ1Y3QgYSBuZXcgbW9jayBtZXRob2QuCisKKyAgICBBcmdzOgorICAgICAgIyBtZXRob2RfbmFtZTogdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAorICAgICAgIyBjYWxsX3F1ZXVlOiBkZXF1ZSBvZiBjYWxscywgdmVyaWZ5IHRoaXMgY2FsbCBhZ2FpbnN0IHRoZSBoZWFkLCBvciBhZGQKKyAgICAgICMgICAgIHRoaXMgY2FsbCB0byB0aGUgcXVldWUuCisgICAgICAjIHJlcGxheV9tb2RlOiBGYWxzZSBpZiB3ZSBhcmUgcmVjb3JkaW5nLCBUcnVlIGlmIHdlIGFyZSB2ZXJpZnlpbmcgY2FsbHMKKyAgICAgICMgICAgIGFnYWluc3QgdGhlIGNhbGwgcXVldWUuCisgICAgICBtZXRob2RfbmFtZTogc3RyCisgICAgICBjYWxsX3F1ZXVlOiBsaXN0IG9yIGRlcXVlCisgICAgICByZXBsYXlfbW9kZTogYm9vbAorICAgICIiIgorCisgICAgc2VsZi5fbmFtZSA9IG1ldGhvZF9uYW1lCisgICAgc2VsZi5fY2FsbF9xdWV1ZSA9IGNhbGxfcXVldWUKKyAgICBpZiBub3QgaXNpbnN0YW5jZShjYWxsX3F1ZXVlLCBkZXF1ZSk6CisgICAgICBzZWxmLl9jYWxsX3F1ZXVlID0gZGVxdWUoc2VsZi5fY2FsbF9xdWV1ZSkKKyAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IHJlcGxheV9tb2RlCisKKyAgICBzZWxmLl9wYXJhbXMgPSBOb25lCisgICAgc2VsZi5fbmFtZWRfcGFyYW1zID0gTm9uZQorICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IE5vbmUKKyAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCisgICAgc2VsZi5fc2lkZV9lZmZlY3RzID0gTm9uZQorCisgIGRlZiBfX2NhbGxfXyhzZWxmLCAqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcyk6CisgICAgIiIiTG9nIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHJldHVybiB2YWx1ZS4KKworICAgIElmIHRoZSBNb2NrKEFueXRoaW5nL09iamVjdCkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsbCBpcyBpbiByZWNvcmQgbW9kZSwKKyAgICB0aGlzIE1vY2tNZXRob2Qgd2lsbCBiZSBwdXNoZWQgb250byB0aGUgZXhwZWN0ZWQgY2FsbCBxdWV1ZS4gIElmIHRoZSBtb2NrCisgICAgaXMgaW4gcmVwbGF5IG1vZGUsIHRoaXMgd2lsbCBwb3AgYSBNb2NrTWV0aG9kIG9mZiB0aGUgdG9wIG9mIHRoZSBxdWV1ZSBhbmQKKyAgICB2ZXJpZnkgdGhpcyBjYWxsIGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZCBjYWxsLgorCisgICAgUmFpc2VzOgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGwgaWYgdGhpcyBjYWxsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIGFuIGV4cGVjdGVkIG1ldGhvZAorICAgICAgICBjYWxsIGFuZCBpdCBkb2VzIG5vdC4KKyAgICAiIiIKKworICAgIHNlbGYuX3BhcmFtcyA9IHBhcmFtcworICAgIHNlbGYuX25hbWVkX3BhcmFtcyA9IG5hbWVkX3BhcmFtcworCisgICAgaWYgbm90IHNlbGYuX3JlcGxheV9tb2RlOgorICAgICAgc2VsZi5fY2FsbF9xdWV1ZS5hcHBlbmQoc2VsZikKKyAgICAgIHJldHVybiBzZWxmCisKKyAgICBleHBlY3RlZF9tZXRob2QgPSBzZWxmLl9WZXJpZnlNZXRob2RDYWxsKCkKKworICAgIGlmIGV4cGVjdGVkX21ldGhvZC5fc2lkZV9lZmZlY3RzOgorICAgICAgZXhwZWN0ZWRfbWV0aG9kLl9zaWRlX2VmZmVjdHMoKnBhcmFtcywgKipuYW1lZF9wYXJhbXMpCisKKyAgICBpZiBleHBlY3RlZF9tZXRob2QuX2V4Y2VwdGlvbjoKKyAgICAgIHJhaXNlIGV4cGVjdGVkX21ldGhvZC5fZXhjZXB0aW9uCisKKyAgICByZXR1cm4gZXhwZWN0ZWRfbWV0aG9kLl9yZXR1cm5fdmFsdWUKKworICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgIiIiUmFpc2UgYW4gQXR0cmlidXRlRXJyb3Igd2l0aCBhIGhlbHBmdWwgbWVzc2FnZS4iIiIKKworICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCdNb2NrTWV0aG9kIGhhcyBubyBhdHRyaWJ1dGUgIiVzIi4gJworICAgICAgICAnRGlkIHlvdSByZW1lbWJlciB0byBwdXQgeW91ciBtb2NrcyBpbiByZXBsYXkgbW9kZT8nICUgbmFtZSkKKworICBkZWYgX1BvcE5leHRNZXRob2Qoc2VsZik6CisgICAgIiIiUG9wIHRoZSBuZXh0IG1ldGhvZCBmcm9tIG91ciBjYWxsIHF1ZXVlLiIiIgorICAgIHRyeToKKyAgICAgIHJldHVybiBzZWxmLl9jYWxsX3F1ZXVlLnBvcGxlZnQoKQorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihzZWxmLCBOb25lKQorCisgIGRlZiBfVmVyaWZ5TWV0aG9kQ2FsbChzZWxmKToKKyAgICAiIiJWZXJpZnkgdGhlIGNhbGxlZCBtZXRob2QgaXMgZXhwZWN0ZWQuCisKKyAgICBUaGlzIGNhbiBiZSBhbiBvcmRlcmVkIG1ldGhvZCwgb3IgcGFydCBvZiBhbiB1bm9yZGVyZWQgc2V0LgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBleHBlY3RlZCBtb2NrIG1ldGhvZC4KKworICAgIFJhaXNlczoKKyAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsIGlmIHRoZSBtZXRob2QgY2FsbGVkIHdhcyBub3QgZXhwZWN0ZWQuCisgICAgIiIiCisKKyAgICBleHBlY3RlZCA9IHNlbGYuX1BvcE5leHRNZXRob2QoKQorCisgICAgIyBMb29wIGhlcmUsIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSBhIE1ldGhvZEdyb3VwIGZvbGxvd2VkIGJ5IGFub3RoZXIKKyAgICAjIGdyb3VwLgorICAgIHdoaWxlIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIE1ldGhvZEdyb3VwKToKKyAgICAgIGV4cGVjdGVkLCBtZXRob2QgPSBleHBlY3RlZC5NZXRob2RDYWxsZWQoc2VsZikKKyAgICAgIGlmIG1ldGhvZCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIG1ldGhvZAorCisgICAgIyBUaGlzIGlzIGEgbW9jayBtZXRob2QsIHNvIGp1c3QgY2hlY2sgZXF1YWxpdHkuCisgICAgaWYgZXhwZWN0ZWQgIT0gc2VsZjoKKyAgICAgIHJhaXNlIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3Ioc2VsZiwgZXhwZWN0ZWQpCisKKyAgICByZXR1cm4gZXhwZWN0ZWQKKworICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICBwYXJhbXMgPSAnLCAnLmpvaW4oCisgICAgICAgIFtyZXByKHApIGZvciBwIGluIHNlbGYuX3BhcmFtcyBvciBbXV0gKworICAgICAgICBbJyVzPSVyJyAlIHggZm9yIHggaW4gc29ydGVkKChzZWxmLl9uYW1lZF9wYXJhbXMgb3Ige30pLml0ZW1zKCkpXSkKKyAgICBkZXNjID0gIiVzKCVzKSAtPiAlciIgJSAoc2VsZi5fbmFtZSwgcGFyYW1zLCBzZWxmLl9yZXR1cm5fdmFsdWUpCisgICAgcmV0dXJuIGRlc2MKKworICBkZWYgX19lcV9fKHNlbGYsIHJocyk6CisgICAgIiIiVGVzdCB3aGV0aGVyIHRoaXMgTW9ja01ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGFub3RoZXIgTW9ja01ldGhvZC4KKworICAgIEFyZ3M6CisgICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAorICAgICAgcmhzOiBNb2NrTWV0aG9kCisgICAgIiIiCisKKyAgICByZXR1cm4gKGlzaW5zdGFuY2UocmhzLCBNb2NrTWV0aG9kKSBhbmQKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPT0gcmhzLl9uYW1lIGFuZAorICAgICAgICAgICAgc2VsZi5fcGFyYW1zID09IHJocy5fcGFyYW1zIGFuZAorICAgICAgICAgICAgc2VsZi5fbmFtZWRfcGFyYW1zID09IHJocy5fbmFtZWRfcGFyYW1zKQorCisgIGRlZiBfX25lX18oc2VsZiwgcmhzKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgdGhpcyBNb2NrTWV0aG9kIGlzIG5vdCBlcXVpdmFsZW50IHRvIGFub3RoZXIgTW9ja01ldGhvZC4KKworICAgIEFyZ3M6CisgICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAorICAgICAgcmhzOiBNb2NrTWV0aG9kCisgICAgIiIiCisKKyAgICByZXR1cm4gbm90IHNlbGYgPT0gcmhzCisKKyAgZGVmIEdldFBvc3NpYmxlR3JvdXAoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIHBvc3NpYmxlIGdyb3VwIGZyb20gdGhlIGVuZCBvZiB0aGUgY2FsbCBxdWV1ZSBvciBOb25lIGlmIG5vCisgICAgb3RoZXIgbWV0aG9kcyBhcmUgb24gdGhlIHN0YWNrLgorICAgICIiIgorCisgICAgIyBSZW1vdmUgdGhpcyBtZXRob2QgZnJvbSB0aGUgdGFpbCBvZiB0aGUgcXVldWUgc28gd2UgY2FuIGFkZCBpdCB0byBhIGdyb3VwLgorICAgIHRoaXNfbWV0aG9kID0gc2VsZi5fY2FsbF9xdWV1ZS5wb3AoKQorICAgIGFzc2VydCB0aGlzX21ldGhvZCA9PSBzZWxmCisKKyAgICAjIERldGVybWluZSBpZiB0aGUgdGFpbCBvZiB0aGUgcXVldWUgaXMgYSBncm91cCwgb3IganVzdCBhIHJlZ3VsYXIgb3JkZXJlZAorICAgICMgbW9jayBtZXRob2QuCisgICAgZ3JvdXAgPSBOb25lCisgICAgdHJ5OgorICAgICAgZ3JvdXAgPSBzZWxmLl9jYWxsX3F1ZXVlWy0xXQorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgcGFzcworCisgICAgcmV0dXJuIGdyb3VwCisKKyAgZGVmIF9DaGVja0FuZENyZWF0ZU5ld0dyb3VwKHNlbGYsIGdyb3VwX25hbWUsIGdyb3VwX2NsYXNzKToKKyAgICAiIiJDaGVja3MgaWYgdGhlIGxhc3QgbWV0aG9kIChhIHBvc3NpYmxlIGdyb3VwKSBpcyBhbiBpbnN0YW5jZSBvZiBvdXIKKyAgICBncm91cF9jbGFzcy4gQWRkcyB0aGUgY3VycmVudCBtZXRob2QgdG8gdGhpcyBncm91cCBvciBjcmVhdGVzIGEgbmV3IG9uZS4KKworICAgIEFyZ3M6CisKKyAgICAgIGdyb3VwX25hbWU6IHRoZSBuYW1lIG9mIHRoZSBncm91cC4KKyAgICAgIGdyb3VwX2NsYXNzOiB0aGUgY2xhc3MgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2Ugb2YgdGhpcyBuZXcgZ3JvdXAKKyAgICAiIiIKKyAgICBncm91cCA9IHNlbGYuR2V0UG9zc2libGVHcm91cCgpCisKKyAgICAjIElmIHRoaXMgaXMgYSBncm91cCwgYW5kIGl0IGlzIHRoZSBjb3JyZWN0IGdyb3VwLCBhZGQgdGhlIG1ldGhvZC4KKyAgICBpZiBpc2luc3RhbmNlKGdyb3VwLCBncm91cF9jbGFzcykgYW5kIGdyb3VwLmdyb3VwX25hbWUoKSA9PSBncm91cF9uYW1lOgorICAgICAgZ3JvdXAuQWRkTWV0aG9kKHNlbGYpCisgICAgICByZXR1cm4gc2VsZgorCisgICAgIyBDcmVhdGUgYSBuZXcgZ3JvdXAgYW5kIGFkZCB0aGUgbWV0aG9kLgorICAgIG5ld19ncm91cCA9IGdyb3VwX2NsYXNzKGdyb3VwX25hbWUpCisgICAgbmV3X2dyb3VwLkFkZE1ldGhvZChzZWxmKQorICAgIHNlbGYuX2NhbGxfcXVldWUuYXBwZW5kKG5ld19ncm91cCkKKyAgICByZXR1cm4gc2VsZgorCisgIGRlZiBJbkFueU9yZGVyKHNlbGYsIGdyb3VwX25hbWU9ImRlZmF1bHQiKToKKyAgICAiIiJNb3ZlIHRoaXMgbWV0aG9kIGludG8gYSBncm91cCBvZiB1bm9yZGVyZWQgY2FsbHMuCisKKyAgICBBIGdyb3VwIG9mIHVub3JkZXJlZCBjYWxscyBtdXN0IGJlIGRlZmluZWQgdG9nZXRoZXIsIGFuZCBtdXN0IGJlIGV4ZWN1dGVkCisgICAgaW4gZnVsbCBiZWZvcmUgdGhlIG5leHQgZXhwZWN0ZWQgbWV0aG9kIGNhbiBiZSBjYWxsZWQuICBUaGVyZSBjYW4gYmUKKyAgICBtdWx0aXBsZSBncm91cHMgdGhhdCBhcmUgZXhwZWN0ZWQgc2VyaWFsbHksIGlmIHRoZXkgYXJlIGdpdmVuCisgICAgZGlmZmVyZW50IGdyb3VwIG5hbWVzLiAgVGhlIHNhbWUgZ3JvdXAgbmFtZSBjYW4gYmUgcmV1c2VkIGlmIHRoZXJlIGlzIGEKKyAgICBzdGFuZGFyZCBtZXRob2QgY2FsbCwgb3IgYSBncm91cCB3aXRoIGEgZGlmZmVyZW50IG5hbWUsIHNwbGljZWQgYmV0d2VlbgorICAgIHVzYWdlcy4KKworICAgIEFyZ3M6CisgICAgICBncm91cF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgdW5vcmRlcmVkIGdyb3VwLgorCisgICAgUmV0dXJuczoKKyAgICAgIHNlbGYKKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi5fQ2hlY2tBbmRDcmVhdGVOZXdHcm91cChncm91cF9uYW1lLCBVbm9yZGVyZWRHcm91cCkKKworICBkZWYgTXVsdGlwbGVUaW1lcyhzZWxmLCBncm91cF9uYW1lPSJkZWZhdWx0Iik6CisgICAgIiIiTW92ZSB0aGlzIG1ldGhvZCBpbnRvIGdyb3VwIG9mIGNhbGxzIHdoaWNoIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisKKyAgICBBIGdyb3VwIG9mIHJlcGVhdGluZyBjYWxscyBtdXN0IGJlIGRlZmluZWQgdG9nZXRoZXIsIGFuZCBtdXN0IGJlIGV4ZWN1dGVkIGluCisgICAgZnVsbCBiZWZvcmUgdGhlIG5leHQgZXhwZWN0ZWQgbWVodG9kIGNhbiBiZSBjYWxsZWQuCisKKyAgICBBcmdzOgorICAgICAgZ3JvdXBfbmFtZTogdGhlIG5hbWUgb2YgdGhlIHVub3JkZXJlZCBncm91cC4KKworICAgIFJldHVybnM6CisgICAgICBzZWxmCisgICAgIiIiCisgICAgcmV0dXJuIHNlbGYuX0NoZWNrQW5kQ3JlYXRlTmV3R3JvdXAoZ3JvdXBfbmFtZSwgTXVsdGlwbGVUaW1lc0dyb3VwKQorCisgIGRlZiBBbmRSZXR1cm4oc2VsZiwgcmV0dXJuX3ZhbHVlKToKKyAgICAiIiJTZXQgdGhlIHZhbHVlIHRvIHJldHVybiB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgIEFyZ3M6CisgICAgICAjIHJldHVybl92YWx1ZSBjYW4gYmUgYW55dGhpbmcuCisgICAgIiIiCisKKyAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSByZXR1cm5fdmFsdWUKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlCisKKyAgZGVmIEFuZFJhaXNlKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgIiIiU2V0IHRoZSBleGNlcHRpb24gdG8gcmFpc2Ugd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgICBBcmdzOgorICAgICAgIyBleGNlcHRpb246IHRoZSBleGNlcHRpb24gdG8gcmFpc2Ugd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICBleGNlcHRpb246IEV4Y2VwdGlvbgorICAgICIiIgorCisgICAgc2VsZi5fZXhjZXB0aW9uID0gZXhjZXB0aW9uCisKKyAgZGVmIFdpdGhTaWRlRWZmZWN0cyhzZWxmLCBzaWRlX2VmZmVjdHMpOgorICAgICIiIlNldCB0aGUgc2lkZSBlZmZlY3RzIHRoYXQgYXJlIHNpbXVsYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgIEFyZ3M6CisgICAgICBzaWRlX2VmZmVjdHM6IEEgY2FsbGFibGUgd2hpY2ggbW9kaWZpZXMgdGhlIHBhcmFtZXRlcnMgb3Igb3RoZXIgcmVsZXZhbnQKKyAgICAgICAgc3RhdGUgd2hpY2ggYSBnaXZlbiB0ZXN0IGNhc2UgZGVwZW5kcyBvbi4KKworICAgIFJldHVybnM6CisgICAgICBTZWxmIGZvciBjaGFpbmluZyB3aXRoIEFuZFJldHVybiBhbmQgQW5kUmFpc2UuCisgICAgIiIiCisgICAgc2VsZi5fc2lkZV9lZmZlY3RzID0gc2lkZV9lZmZlY3RzCisgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgQ29tcGFyYXRvcjoKKyAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIE1veCBjb21wYXJhdG9ycy4KKworICBBIENvbXBhcmF0b3IgY2FuIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSBtb2NrZWQgbWV0aG9kIHdoZW4gdGhlIGV4YWN0CisgIHZhbHVlIGlzIG5vdCBrbm93bi4gIEZvciBleGFtcGxlLCB0aGUgY29kZSB5b3UgYXJlIHRlc3RpbmcgbWlnaHQgYnVpbGQgdXAgYQorICBsb25nIFNRTCBzdHJpbmcgdGhhdCBpcyBwYXNzZWQgdG8geW91ciBtb2NrIERBTy4gWW91J3JlIG9ubHkgaW50ZXJlc3RlZCB0aGF0CisgIHRoZSBJTiBjbGF1c2UgY29udGFpbnMgdGhlIHByb3BlciBwcmltYXJ5IGtleXMsIHNvIHlvdSBjYW4gc2V0IHlvdXIgbW9jaworICB1cCBhcyBmb2xsb3dzOgorCisgIG1vY2tfZGFvLlJ1blF1ZXJ5KFN0ckNvbnRhaW5zKCdJTiAoMSwgMiwgNCwgNSknKSkuQW5kUmV0dXJuKG1vY2tfcmVzdWx0KQorCisgIE5vdyB3aGF0ZXZlciBxdWVyeSBpcyBwYXNzZWQgaW4gbXVzdCBjb250YWluIHRoZSBzdHJpbmcgJ0lOICgxLCAyLCA0LCA1KScuCisKKyAgQSBDb21wYXJhdG9yIG1heSByZXBsYWNlIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMsIGZvciBleGFtcGxlOgorICAjIHJldHVybiBhdCBtb3N0IDEwIHJvd3MKKyAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ1NFTEVDVCcpLCAxMCkKKworICBvcgorCisgICMgUmV0dXJuIHNvbWUgbm9uLWRldGVybWluaXN0aWMgbnVtYmVyIG9mIHJvd3MKKyAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ1NFTEVDVCcpLCBJc0EoaW50KSkKKyAgIiIiCisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIlNwZWNpYWwgZXF1YWxzIG1ldGhvZCB0aGF0IGFsbCBjb21wYXJhdG9ycyBtdXN0IGltcGxlbWVudC4KKworICAgIEFyZ3M6CisgICAgICByaHM6IGFueSBweXRob24gb2JqZWN0CisgICAgIiIiCisKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAnbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4nCisKKyAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiBzZWxmLmVxdWFscyhyaHMpCisKKyAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiBub3Qgc2VsZi5lcXVhbHMocmhzKQorCisKK2NsYXNzIElzQShDb21wYXJhdG9yKToKKyAgIiIiVGhpcyBjbGFzcyB3cmFwcyBhIGJhc2ljIFB5dGhvbiB0eXBlIG9yIGNsYXNzLiAgSXQgaXMgdXNlZCB0byB2ZXJpZnkKKyAgdGhhdCBhIHBhcmFtZXRlciBpcyBvZiB0aGUgZ2l2ZW4gdHlwZSBvciBjbGFzcy4KKworICBFeGFtcGxlOgorICBtb2NrX2Rhby5Db25uZWN0KElzQShEYkNvbm5lY3RJbmZvKSkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNsYXNzX25hbWUpOgorICAgICIiIkluaXRpYWxpemUgSXNBCisKKyAgICBBcmdzOgorICAgICAgY2xhc3NfbmFtZTogYmFzaWMgcHl0aG9uIHR5cGUgb3IgYSBjbGFzcworICAgICIiIgorCisgICAgc2VsZi5fY2xhc3NfbmFtZSA9IGNsYXNzX25hbWUKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2sgdG8gc2VlIGlmIHRoZSBSSFMgaXMgYW4gaW5zdGFuY2Ugb2YgY2xhc3NfbmFtZS4KKworICAgIEFyZ3M6CisgICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAorICAgICAgcmhzOiBvYmplY3QKKworICAgIFJldHVybnM6CisgICAgICBib29sCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICByZXR1cm4gaXNpbnN0YW5jZShyaHMsIHNlbGYuX2NsYXNzX25hbWUpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICMgQ2hlY2sgcmF3IHR5cGVzIGlmIHRoZXJlIHdhcyBhIHR5cGUgZXJyb3IuICBUaGlzIGlzIGhlbHBmdWwgZm9yCisgICAgICAjIHRoaW5ncyBsaWtlIGNTdHJpbmdJTy5TdHJpbmdJTy4KKyAgICAgIHJldHVybiB0eXBlKHJocykgPT0gdHlwZShzZWxmLl9jbGFzc19uYW1lKQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICByZXR1cm4gc3RyKHNlbGYuX2NsYXNzX25hbWUpCisKK2NsYXNzIElzQWxtb3N0KENvbXBhcmF0b3IpOgorICAiIiJDb21wYXJpc29uIGNsYXNzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHBhcmFtZXRlciBpcyBuZWFybHkgZXF1YWwKKyAgdG8gYSBnaXZlbiB2YWx1ZS4gIEdlbmVyYWxseSB1c2VmdWwgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCisKKyAgRXhhbXBsZSBtb2NrX2Rhby5TZXRUaW1lb3V0KChJc0FsbW9zdCgzLjkpKSkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGZsb2F0X3ZhbHVlLCBwbGFjZXM9Nyk6CisgICAgIiIiSW5pdGlhbGl6ZSBJc0FsbW9zdC4KKworICAgIEFyZ3M6CisgICAgICBmbG9hdF92YWx1ZTogVGhlIHZhbHVlIGZvciBtYWtpbmcgdGhlIGNvbXBhcmlzb24uCisgICAgICBwbGFjZXM6IFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdG8uCisgICAgIiIiCisKKyAgICBzZWxmLl9mbG9hdF92YWx1ZSA9IGZsb2F0X3ZhbHVlCisgICAgc2VsZi5fcGxhY2VzID0gcGxhY2VzCisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIkNoZWNrIHRvIHNlZSBpZiBSSFMgaXMgYWxtb3N0IGVxdWFsIHRvIGZsb2F0X3ZhbHVlCisKKyAgICBBcmdzOgorICAgICAgcmhzOiB0aGUgdmFsdWUgdG8gY29tcGFyZSB0byBmbG9hdF92YWx1ZQorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIHJldHVybiByb3VuZChyaHMtc2VsZi5fZmxvYXRfdmFsdWUsIHNlbGYuX3BsYWNlcykgPT0gMAorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAjIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSBlaXRoZXIgZmxvYXRfdmFsdWUgb3IgcmhzIGlzIG5vdCBhIG51bWJlci4KKyAgICAgIHJldHVybiBGYWxzZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICByZXR1cm4gc3RyKHNlbGYuX2Zsb2F0X3ZhbHVlKQorCitjbGFzcyBTdHJDb250YWlucyhDb21wYXJhdG9yKToKKyAgIiIiQ29tcGFyaXNvbiBjbGFzcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBzdWJzdHJpbmcgZXhpc3RzIGluIGEKKyAgc3RyaW5nIHBhcmFtZXRlci4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBtb2NraW5nIGEgZGF0YWJhc2Ugd2l0aCBTUUwKKyAgcGFzc2VkIGluIGFzIGEgc3RyaW5nIHBhcmFtZXRlciwgZm9yIGV4YW1wbGUuCisKKyAgRXhhbXBsZToKKyAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ0lOICgxLCAyLCA0LCA1KScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBzZWFyY2hfc3RyaW5nKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgICMgc2VhcmNoX3N0cmluZzogdGhlIHN0cmluZyB5b3UgYXJlIHNlYXJjaGluZyBmb3IKKyAgICAgIHNlYXJjaF9zdHJpbmc6IHN0cgorICAgICIiIgorCisgICAgc2VsZi5fc2VhcmNoX3N0cmluZyA9IHNlYXJjaF9zdHJpbmcKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWFyY2hfc3RyaW5nIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmhzIHN0cmluZy4KKworICAgIEFyZ3M6CisgICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAorICAgICAgcmhzOiBvYmplY3QKKworICAgIFJldHVybnM6CisgICAgICBib29sCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICByZXR1cm4gcmhzLmZpbmQoc2VsZi5fc2VhcmNoX3N0cmluZykgPiAtMQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICByZXR1cm4gRmFsc2UKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8c3RyIGNvbnRhaW5pbmcgXCclc1wnPicgJSBzZWxmLl9zZWFyY2hfc3RyaW5nCisKKworY2xhc3MgUmVnZXgoQ29tcGFyYXRvcik6CisgICIiIkNoZWNrcyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uLgorCisgIFRoaXMgdXNlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgZXF1YWxpdHkuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgICMgcGF0dGVybiBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IKKyAgICAgIHBhdHRlcm46IHN0cgorICAgICAgIyBmbGFncyBwYXNzZWQgdG8gcmUuY29tcGlsZSBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50CisgICAgICBmbGFnczogaW50CisgICAgIiIiCisKKyAgICBzZWxmLnJlZ2V4ID0gcmUuY29tcGlsZShwYXR0ZXJuLCBmbGFncz1mbGFncykKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2sgdG8gc2VlIGlmIHJocyBtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHJldHVybiBzZWxmLnJlZ2V4LnNlYXJjaChyaHMpIGlzIG5vdCBOb25lCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHMgPSAnPHJlZ3VsYXIgZXhwcmVzc2lvbiBcJyVzXCcnICUgc2VsZi5yZWdleC5wYXR0ZXJuCisgICAgaWYgc2VsZi5yZWdleC5mbGFnczoKKyAgICAgIHMgKz0gJywgZmxhZ3M9JWQnICUgc2VsZi5yZWdleC5mbGFncworICAgIHMgKz0gJz4nCisgICAgcmV0dXJuIHMKKworCitjbGFzcyBJbihDb21wYXJhdG9yKToKKyAgIiIiQ2hlY2tzIHdoZXRoZXIgYW4gaXRlbSAob3Iga2V5KSBpcyBpbiBhIGxpc3QgKG9yIGRpY3QpIHBhcmFtZXRlci4KKworICBFeGFtcGxlOgorICBtb2NrX2Rhby5HZXRVc2Vyc0luZm8oSW4oJ2V4cGVjdGVkVXNlck5hbWUnKSkuQW5kUmV0dXJuKG1vY2tfcmVzdWx0KQorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwga2V5KToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgICMga2V5IGlzIGFueSB0aGluZyB0aGF0IGNvdWxkIGJlIGluIGEgbGlzdCBvciBhIGtleSBpbiBhIGRpY3QKKyAgICAiIiIKKworICAgIHNlbGYuX2tleSA9IGtleQorCisgIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKKyAgICAiIiJDaGVjayB0byBzZWUgd2hldGhlciBrZXkgaXMgaW4gcmhzLgorCisgICAgQXJnczoKKyAgICAgIHJoczogZGljdAorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHJldHVybiBzZWxmLl9rZXkgaW4gcmhzCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiAnPHNlcXVlbmNlIG9yIG1hcCBjb250YWluaW5nIFwnJXNcJz4nICUgc2VsZi5fa2V5CisKKworY2xhc3MgQ29udGFpbnNLZXlWYWx1ZShDb21wYXJhdG9yKToKKyAgIiIiQ2hlY2tzIHdoZXRoZXIgYSBrZXkvdmFsdWUgcGFpciBpcyBpbiBhIGRpY3QgcGFyYW1ldGVyLgorCisgIEV4YW1wbGU6CisgIG1vY2tfZGFvLlVwZGF0ZVVzZXJzKENvbnRhaW5zS2V5VmFsdWUoJ3N0ZXZlcG0nLCBzdGV2ZXBtX3VzZXJfaW5mbykpCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgICMga2V5OiBhIGtleSBpbiBhIGRpY3QKKyAgICAgICMgdmFsdWU6IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlCisgICAgIiIiCisKKyAgICBzZWxmLl9rZXkgPSBrZXkKKyAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIkNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGtleS92YWx1ZSBwYWlyIGlzIGluIHRoZSByaHMgZGljdC4KKworICAgIFJldHVybnM6CisgICAgICBib29sCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICByZXR1cm4gcmhzW3NlbGYuX2tleV0gPT0gc2VsZi5fdmFsdWUKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiAnPG1hcCBjb250YWluaW5nIHRoZSBlbnRyeSBcJyVzOiAlc1wnPicgJSAoc2VsZi5fa2V5LCBzZWxmLl92YWx1ZSkKKworCitjbGFzcyBTYW1lRWxlbWVudHNBcyhDb21wYXJhdG9yKToKKyAgIiIiQ2hlY2tzIHdoZXRoZXIgaXRlcmFibGVzIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgKGlnbm9yaW5nIG9yZGVyKS4KKworICBFeGFtcGxlOgorICBtb2NrX2Rhby5Qcm9jZXNzVXNlcnMoU2FtZUVsZW1lbnRzQXMoJ3N0ZXZlcG0nLCAnc2Fsb21ha2knKSkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkX3NlcSk6CisgICAgIiIiSW5pdGlhbGl6ZS4KKworICAgIEFyZ3M6CisgICAgICBleHBlY3RlZF9zZXE6IGEgc2VxdWVuY2UKKyAgICAiIiIKKworICAgIHNlbGYuX2V4cGVjdGVkX3NlcSA9IGV4cGVjdGVkX3NlcQorCisgIGRlZiBlcXVhbHMoc2VsZiwgYWN0dWFsX3NlcSk6CisgICAgIiIiQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYWN0dWFsX3NlcSBoYXMgc2FtZSBlbGVtZW50cyBhcyBleHBlY3RlZF9zZXEuCisKKyAgICBBcmdzOgorICAgICAgYWN0dWFsX3NlcTogc2VxdWVuY2UKKworICAgIFJldHVybnM6CisgICAgICBib29sCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICBleHBlY3RlZCA9IGRpY3QoWyhlbGVtZW50LCBOb25lKSBmb3IgZWxlbWVudCBpbiBzZWxmLl9leHBlY3RlZF9zZXFdKQorICAgICAgYWN0dWFsID0gZGljdChbKGVsZW1lbnQsIE5vbmUpIGZvciBlbGVtZW50IGluIGFjdHVhbF9zZXFdKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAjIEZhbGwgYmFjayB0byBzbG93ZXIgbGlzdC1jb21wYXJlIGlmIGFueSBvZiB0aGUgb2JqZWN0cyBhcmUgdW5oYXNoYWJsZS4KKyAgICAgIGV4cGVjdGVkID0gbGlzdChzZWxmLl9leHBlY3RlZF9zZXEpCisgICAgICBhY3R1YWwgPSBsaXN0KGFjdHVhbF9zZXEpCisgICAgICBleHBlY3RlZC5zb3J0KCkKKyAgICAgIGFjdHVhbC5zb3J0KCkKKyAgICByZXR1cm4gZXhwZWN0ZWQgPT0gYWN0dWFsCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiAnPHNlcXVlbmNlIHdpdGggc2FtZSBlbGVtZW50cyBhcyBcJyVzXCc+JyAlIHNlbGYuX2V4cGVjdGVkX3NlcQorCisKK2NsYXNzIEFuZChDb21wYXJhdG9yKToKKyAgIiIiRXZhbHVhdGVzIG9uZSBvciBtb3JlIENvbXBhcmF0b3JzIG9uIFJIUyBhbmQgcmV0dXJucyBhbiBBTkQgb2YgdGhlIHJlc3VsdHMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgIiIiSW5pdGlhbGl6ZS4KKworICAgIEFyZ3M6CisgICAgICAqYXJnczogT25lIG9yIG1vcmUgQ29tcGFyYXRvcgorICAgICIiIgorCisgICAgc2VsZi5fY29tcGFyYXRvcnMgPSBhcmdzCisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIkNoZWNrcyB3aGV0aGVyIGFsbCBDb21wYXJhdG9ycyBhcmUgZXF1YWwgdG8gcmhzLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiBjYW4gYmUgYW55dGhpbmcKKworICAgIFJldHVybnM6CisgICAgICBib29sCisgICAgIiIiCisKKyAgICBmb3IgY29tcGFyYXRvciBpbiBzZWxmLl9jb21wYXJhdG9yczoKKyAgICAgIGlmIG5vdCBjb21wYXJhdG9yLmVxdWFscyhyaHMpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIHJldHVybiBUcnVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiAnPEFORCAlcz4nICUgc3RyKHNlbGYuX2NvbXBhcmF0b3JzKQorCisKK2NsYXNzIE9yKENvbXBhcmF0b3IpOgorICAiIiJFdmFsdWF0ZXMgb25lIG9yIG1vcmUgQ29tcGFyYXRvcnMgb24gUkhTIGFuZCByZXR1cm5zIGFuIE9SIG9mIHRoZSByZXN1bHRzLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgKmFyZ3M6IE9uZSBvciBtb3JlIE1veCBjb21wYXJhdG9ycworICAgICIiIgorCisgICAgc2VsZi5fY29tcGFyYXRvcnMgPSBhcmdzCisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIkNoZWNrcyB3aGV0aGVyIGFueSBDb21wYXJhdG9yIGlzIGVxdWFsIHRvIHJocy4KKworICAgIEFyZ3M6CisgICAgICAjIHJoczogY2FuIGJlIGFueXRoaW5nCisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbAorICAgICIiIgorCisgICAgZm9yIGNvbXBhcmF0b3IgaW4gc2VsZi5fY29tcGFyYXRvcnM6CisgICAgICBpZiBjb21wYXJhdG9yLmVxdWFscyhyaHMpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiAnPE9SICVzPicgJSBzdHIoc2VsZi5fY29tcGFyYXRvcnMpCisKKworY2xhc3MgRnVuYyhDb21wYXJhdG9yKToKKyAgIiIiQ2FsbCBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIHZlcmlmeSB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBjb3JyZWN0LgorCisgIFlvdSBtYXkgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJmb3JtIG1vcmUgYWR2YW5jZWQgb3BlcmF0aW9ucyBvbiB0aGUgcGFyYW1ldGVyCisgIGluIG9yZGVyIHRvIHZhbGlkYXRlIGl0LiAgWW91IGNhbiB1c2UgdGhpcyB0byBoYXZlIGEgY2FsbGFibGUgdmFsaWRhdGUgYW55CisgIHBhcmFtZXRlci4gVGhlIGNhbGxhYmxlIHNob3VsZCByZXR1cm4gZWl0aGVyIFRydWUgb3IgRmFsc2UuCisKKworICBFeGFtcGxlOgorCisgIGRlZiBteVBhcmFtVmFsaWRhdG9yKHBhcmFtKToKKyAgICAjIEFkdmFuY2VkIGxvZ2ljIGhlcmUKKyAgICByZXR1cm4gVHJ1ZQorCisgIG1vY2tfZGFvLkRvU29tZXRoaW5nKEZ1bmMobXlQYXJhbVZhbGlkYXRvciksIHRydWUpCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgIGZ1bmM6IGNhbGxhYmxlIHRoYXQgdGFrZXMgb25lIHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIGJvb2wKKyAgICAiIiIKKworICAgIHNlbGYuX2Z1bmMgPSBmdW5jCisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIlRlc3Qgd2hldGhlciByaHMgcGFzc2VzIHRoZSBmdW5jdGlvbiB0ZXN0LgorCisgICAgcmhzIGlzIHBhc3NlZCBpbnRvIGZ1bmMuCisKKyAgICBBcmdzOgorICAgICAgcmhzOiBhbnkgcHl0aG9uIG9iamVjdAorCisgICAgUmV0dXJuczoKKyAgICAgIHRoZSByZXN1bHQgb2YgZnVuYyhyaHMpCisgICAgIiIiCisKKyAgICByZXR1cm4gc2VsZi5fZnVuYyhyaHMpCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiBzdHIoc2VsZi5fZnVuYykKKworCitjbGFzcyBJZ25vcmVBcmcoQ29tcGFyYXRvcik6CisgICIiIklnbm9yZSBhbiBhcmd1bWVudC4KKworICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd2UgZG9uJ3QgY2FyZSBhYm91dCBhbiBhcmd1bWVudCBvZiBhIG1ldGhvZCBjYWxsLgorCisgIEV4YW1wbGU6CisgICMgQ2hlY2sgaWYgQ2FzdE1hZ2ljIGlzIGNhbGxlZCB3aXRoIDMgYXMgZmlyc3QgYXJnIGFuZCAnZGlzYXBwZWFyJyBhcyB0aGlyZC4KKyAgbXltb2NrLkNhc3RNYWdpYygzLCBJZ25vcmVBcmcoKSwgJ2Rpc2FwcGVhcicpCisgICIiIgorCisgIGRlZiBlcXVhbHMoc2VsZiwgdW51c2VkX3Jocyk6CisgICAgIiIiSWdub3JlcyBhcmd1bWVudHMgYW5kIHJldHVybnMgVHJ1ZS4KKworICAgIEFyZ3M6CisgICAgICB1bnVzZWRfcmhzOiBhbnkgcHl0aG9uIG9iamVjdAorCisgICAgUmV0dXJuczoKKyAgICAgIGFsd2F5cyByZXR1cm5zIFRydWUKKyAgICAiIiIKKworICAgIHJldHVybiBUcnVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiAnPElnbm9yZUFyZz4nCisKKworY2xhc3MgTWV0aG9kR3JvdXAob2JqZWN0KToKKyAgIiIiQmFzZSBjbGFzcyBjb250YWluaW5nIGNvbW1vbiBiZWhhdmlvdXIgZm9yIE1ldGhvZEdyb3Vwcy4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXBfbmFtZSk6CisgICAgc2VsZi5fZ3JvdXBfbmFtZSA9IGdyb3VwX25hbWUKKworICBkZWYgZ3JvdXBfbmFtZShzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fZ3JvdXBfbmFtZQorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHJldHVybiAnPCVzICIlcyI+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fZ3JvdXBfbmFtZSkKKworICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBJc1NhdGlzZmllZChzZWxmKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKK2NsYXNzIFVub3JkZXJlZEdyb3VwKE1ldGhvZEdyb3VwKToKKyAgIiIiVW5vcmRlcmVkR3JvdXAgaG9sZHMgYSBzZXQgb2YgbWV0aG9kIGNhbGxzIHRoYXQgbWF5IG9jY3VyIGluIGFueSBvcmRlci4KKworICBUaGlzIGNvbnN0cnVjdCBpcyBoZWxwZnVsIGZvciBub24tZGV0ZXJtaW5pc3RpYyBldmVudHMsIHN1Y2ggYXMgaXRlcmF0aW5nCisgIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0LgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXBfbmFtZSk6CisgICAgc3VwZXIoVW5vcmRlcmVkR3JvdXAsIHNlbGYpLl9faW5pdF9fKGdyb3VwX25hbWUpCisgICAgc2VsZi5fbWV0aG9kcyA9IFtdCisKKyAgZGVmIEFkZE1ldGhvZChzZWxmLCBtb2NrX21ldGhvZCk6CisgICAgIiIiQWRkIGEgbWV0aG9kIHRvIHRoaXMgZ3JvdXAuCisKKyAgICBBcmdzOgorICAgICAgbW9ja19tZXRob2Q6IEEgbW9jayBtZXRob2QgdG8gYmUgYWRkZWQgdG8gdGhpcyBncm91cC4KKyAgICAiIiIKKworICAgIHNlbGYuX21ldGhvZHMuYXBwZW5kKG1vY2tfbWV0aG9kKQorCisgIGRlZiBNZXRob2RDYWxsZWQoc2VsZiwgbW9ja19tZXRob2QpOgorICAgICIiIlJlbW92ZSBhIG1ldGhvZCBjYWxsIGZyb20gdGhlIGdyb3VwLgorCisgICAgSWYgdGhlIG1ldGhvZCBpcyBub3QgaW4gdGhlIHNldCwgYW4gVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciB3aWxsIGJlCisgICAgcmFpc2VkLgorCisgICAgQXJnczoKKyAgICAgIG1vY2tfbWV0aG9kOiBhIG1vY2sgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGVxdWFsIHRvIGEgbWV0aG9kIGluIHRoZSBncm91cC4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgbW9jayBtZXRob2QgZnJvbSB0aGUgZ3JvdXAKKworICAgIFJhaXNlczoKKyAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG1vY2tfbWV0aG9kIHdhcyBub3QgaW4gdGhlIGdyb3VwLgorICAgICIiIgorCisgICAgIyBDaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgZXhpc3RzLCBhbmQgaWYgc28sIHJlbW92ZSBpdCBmcm9tIHRoZSBzZXQKKyAgICAjIGFuZCByZXR1cm4gaXQuCisgICAgZm9yIG1ldGhvZCBpbiBzZWxmLl9tZXRob2RzOgorICAgICAgaWYgbWV0aG9kID09IG1vY2tfbWV0aG9kOgorICAgICAgICAjIFJlbW92ZSB0aGUgY2FsbGVkIG1vY2tfbWV0aG9kIGluc3RlYWQgb2YgdGhlIG1ldGhvZCBpbiB0aGUgZ3JvdXAuCisgICAgICAgICMgVGhlIGNhbGxlZCBtZXRob2Qgd2lsbCBtYXRjaCBhbnkgY29tcGFyYXRvcnMgd2hlbiBlcXVhbGl0eSBpcyBjaGVja2VkCisgICAgICAgICMgZHVyaW5nIHJlbW92YWwuICBUaGUgbWV0aG9kIGluIHRoZSBncm91cCBjb3VsZCBwYXNzIGEgY29tcGFyYXRvciB0bworICAgICAgICAjIGFub3RoZXIgY29tcGFyYXRvciBkdXJpbmcgdGhlIGVxdWFsaXR5IGNoZWNrLgorICAgICAgICBzZWxmLl9tZXRob2RzLnJlbW92ZShtb2NrX21ldGhvZCkKKworICAgICAgICAjIElmIHRoaXMgZ3JvdXAgaXMgbm90IGVtcHR5LCBwdXQgaXQgYmFjayBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisgICAgICAgIGlmIG5vdCBzZWxmLklzU2F0aXNmaWVkKCk6CisgICAgICAgICAgbW9ja19tZXRob2QuX2NhbGxfcXVldWUuYXBwZW5kbGVmdChzZWxmKQorCisgICAgICAgIHJldHVybiBzZWxmLCBtZXRob2QKKworICAgIHJhaXNlIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IobW9ja19tZXRob2QsIHNlbGYpCisKKyAgZGVmIElzU2F0aXNmaWVkKHNlbGYpOgorICAgICIiIlJldHVybiBUcnVlIGlmIHRoZXJlIGFyZSBub3QgYW55IG1ldGhvZHMgaW4gdGhpcyBncm91cC4iIiIKKworICAgIHJldHVybiBsZW4oc2VsZi5fbWV0aG9kcykgPT0gMAorCisKK2NsYXNzIE11bHRpcGxlVGltZXNHcm91cChNZXRob2RHcm91cCk6CisgICIiIk11bHRpcGxlVGltZXNHcm91cCBob2xkcyBtZXRob2RzIHRoYXQgbWF5IGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgorCisgIE5vdGU6IEVhY2ggbWV0aG9kIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCisKKyAgVGhpcyBpcyBoZWxwZnVsLCBpZiB5b3UgZG9uJ3Qga25vdyBvciBjYXJlIGhvdyBtYW55IHRpbWVzIGEgbWV0aG9kIGlzIGNhbGxlZC4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGdyb3VwX25hbWUpOgorICAgIHN1cGVyKE11bHRpcGxlVGltZXNHcm91cCwgc2VsZikuX19pbml0X18oZ3JvdXBfbmFtZSkKKyAgICBzZWxmLl9tZXRob2RzID0gc2V0KCkKKyAgICBzZWxmLl9tZXRob2RzX2NhbGxlZCA9IHNldCgpCisKKyAgZGVmIEFkZE1ldGhvZChzZWxmLCBtb2NrX21ldGhvZCk6CisgICAgIiIiQWRkIGEgbWV0aG9kIHRvIHRoaXMgZ3JvdXAuCisKKyAgICBBcmdzOgorICAgICAgbW9ja19tZXRob2Q6IEEgbW9jayBtZXRob2QgdG8gYmUgYWRkZWQgdG8gdGhpcyBncm91cC4KKyAgICAiIiIKKworICAgIHNlbGYuX21ldGhvZHMuYWRkKG1vY2tfbWV0aG9kKQorCisgIGRlZiBNZXRob2RDYWxsZWQoc2VsZiwgbW9ja19tZXRob2QpOgorICAgICIiIlJlbW92ZSBhIG1ldGhvZCBjYWxsIGZyb20gdGhlIGdyb3VwLgorCisgICAgSWYgdGhlIG1ldGhvZCBpcyBub3QgaW4gdGhlIHNldCwgYW4gVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciB3aWxsIGJlCisgICAgcmFpc2VkLgorCisgICAgQXJnczoKKyAgICAgIG1vY2tfbWV0aG9kOiBhIG1vY2sgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGVxdWFsIHRvIGEgbWV0aG9kIGluIHRoZSBncm91cC4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgbW9jayBtZXRob2QgZnJvbSB0aGUgZ3JvdXAKKworICAgIFJhaXNlczoKKyAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG1vY2tfbWV0aG9kIHdhcyBub3QgaW4gdGhlIGdyb3VwLgorICAgICIiIgorCisgICAgIyBDaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgZXhpc3RzLCBhbmQgaWYgc28gYWRkIGl0IHRvIHRoZSBzZXQgb2YKKyAgICAjIGNhbGxlZCBtZXRob2RzLgorCisgICAgZm9yIG1ldGhvZCBpbiBzZWxmLl9tZXRob2RzOgorICAgICAgaWYgbWV0aG9kID09IG1vY2tfbWV0aG9kOgorICAgICAgICBzZWxmLl9tZXRob2RzX2NhbGxlZC5hZGQobW9ja19tZXRob2QpCisgICAgICAgICMgQWx3YXlzIHB1dCB0aGlzIGdyb3VwIGJhY2sgb24gdG9wIG9mIHRoZSBxdWV1ZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93CisgICAgICAgICMgd2hlbiB3ZSBhcmUgZG9uZS4KKyAgICAgICAgbW9ja19tZXRob2QuX2NhbGxfcXVldWUuYXBwZW5kbGVmdChzZWxmKQorICAgICAgICByZXR1cm4gc2VsZiwgbWV0aG9kCisKKyAgICBpZiBzZWxmLklzU2F0aXNmaWVkKCk6CisgICAgICBuZXh0X21ldGhvZCA9IG1vY2tfbWV0aG9kLl9Qb3BOZXh0TWV0aG9kKCk7CisgICAgICByZXR1cm4gbmV4dF9tZXRob2QsIE5vbmUKKyAgICBlbHNlOgorICAgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihtb2NrX21ldGhvZCwgc2VsZikKKworICBkZWYgSXNTYXRpc2ZpZWQoc2VsZik6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgYWxsIG1ldGhvZHMgaW4gdGhpcyBncm91cCBhcmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuIiIiCisgICAgIyBOT1RFKHBzeWNobyk6IFdlIGNhbid0IHVzZSB0aGUgc2ltcGxlIHNldCBkaWZmZXJlbmNlIGhlcmUgYmVjYXVzZSB3ZSB3YW50CisgICAgIyB0byBtYXRjaCBkaWZmZXJlbnQgcGFyYW1ldGVycyB3aGljaCBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSBlLmcuIElzQShzdHIpCisgICAgIyBhbmQgc29tZSBzdHJpbmcuIFRoaXMgc29sdXRpb24gaXMgTyhuXjIpIGJ1dCBuIHNob3VsZCBiZSBzbWFsbC4KKyAgICB0bXAgPSBzZWxmLl9tZXRob2RzLmNvcHkoKQorICAgIGZvciBjYWxsZWQgaW4gc2VsZi5fbWV0aG9kc19jYWxsZWQ6CisgICAgICBmb3IgZXhwZWN0ZWQgaW4gdG1wOgorICAgICAgICBpZiBjYWxsZWQgPT0gZXhwZWN0ZWQ6CisgICAgICAgICAgdG1wLnJlbW92ZShleHBlY3RlZCkKKyAgICAgICAgICBpZiBub3QgdG1wOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICBicmVhaworICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIE1veE1ldGFUZXN0QmFzZSh0eXBlKToKKyAgIiIiTWV0YWNsYXNzIHRvIGFkZCBtb3ggY2xlYW51cCBhbmQgdmVyaWZpY2F0aW9uIHRvIGV2ZXJ5IHRlc3QuCisKKyAgQXMgdGhlIG1veCB1bml0IHRlc3RpbmcgY2xhc3MgaXMgYmVpbmcgY29uc3RydWN0ZWQgKE1veFRlc3RCYXNlIG9yIGEKKyAgc3ViY2xhc3MpLCB0aGlzIG1ldGFjbGFzcyB3aWxsIG1vZGlmeSBhbGwgdGVzdCBmdW5jdGlvbnMgdG8gY2FsbCB0aGUKKyAgQ2xlYW5VcE1veCBtZXRob2Qgb2YgdGhlIHRlc3QgY2xhc3MgYWZ0ZXIgdGhleSBmaW5pc2guIFRoaXMgbWVhbnMgdGhhdAorICB1bnN0dWJiaW5nIGFuZCB2ZXJpZnlpbmcgd2lsbCBoYXBwZW4gZm9yIGV2ZXJ5IHRlc3Qgd2l0aCBubyBhZGRpdGlvbmFsIGNvZGUsCisgIGFuZCBhbnkgZmFpbHVyZXMgd2lsbCByZXN1bHQgaW4gdGVzdCBmYWlsdXJlcyBhcyBvcHBvc2VkIHRvIGVycm9ycy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGQpOgorICAgIHR5cGUuX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZCkKKworICAgICMgYWxzbyBnZXQgYWxsIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGJhc2UgY2xhc3NlcyB0byBhY2NvdW50CisgICAgIyBmb3IgYSBjYXNlIHdoZW4gdGVzdCBjbGFzcyBpcyBub3QgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiBNb3hUZXN0QmFzZQorICAgIGZvciBiYXNlIGluIGJhc2VzOgorICAgICAgZm9yIGF0dHJfbmFtZSBpbiBkaXIoYmFzZSk6CisgICAgICAgIGRbYXR0cl9uYW1lXSA9IGdldGF0dHIoYmFzZSwgYXR0cl9uYW1lKQorCisgICAgZm9yIGZ1bmNfbmFtZSwgZnVuYyBpbiBkLml0ZW1zKCk6CisgICAgICBpZiBmdW5jX25hbWUuc3RhcnRzd2l0aCgndGVzdCcpIGFuZCBjYWxsYWJsZShmdW5jKToKKyAgICAgICAgc2V0YXR0cihjbHMsIGZ1bmNfbmFtZSwgTW94TWV0YVRlc3RCYXNlLkNsZWFuVXBUZXN0KGNscywgZnVuYykpCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgQ2xlYW5VcFRlc3QoY2xzLCBmdW5jKToKKyAgICAiIiJBZGRzIE1veCBjbGVhbnVwIGNvZGUgdG8gYW55IE1veFRlc3RCYXNlIG1ldGhvZC4KKworICAgIEFsd2F5cyB1bnNldHMgc3R1YnMgYWZ0ZXIgYSB0ZXN0LiBXaWxsIHZlcmlmeSBhbGwgbW9ja3MgZm9yIHRlc3RzIHRoYXQKKyAgICBvdGhlcndpc2UgcGFzcy4KKworICAgIEFyZ3M6CisgICAgICBjbHM6IE1veFRlc3RCYXNlIG9yIHN1YmNsYXNzOyB0aGUgY2xhc3Mgd2hvc2UgdGVzdCBtZXRob2Qgd2UgYXJlIGFsdGVyaW5nLgorICAgICAgZnVuYzogbWV0aG9kOyB0aGUgbWV0aG9kIG9mIHRoZSBNb3hUZXN0QmFzZSB0ZXN0IGNsYXNzIHdlIHdpc2ggdG8gYWx0ZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIG1vZGlmaWVkIG1ldGhvZC4KKyAgICAiIiIKKyAgICBkZWYgbmV3X21ldGhvZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgbW94X29iaiA9IGdldGF0dHIoc2VsZiwgJ21veCcsIE5vbmUpCisgICAgICBjbGVhbnVwX21veCA9IEZhbHNlCisgICAgICBpZiBtb3hfb2JqIGFuZCBpc2luc3RhbmNlKG1veF9vYmosIE1veCk6CisgICAgICAgIGNsZWFudXBfbW94ID0gVHJ1ZQorICAgICAgdHJ5OgorICAgICAgICBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgIGZpbmFsbHk6CisgICAgICAgIGlmIGNsZWFudXBfbW94OgorICAgICAgICAgIG1veF9vYmouVW5zZXRTdHVicygpCisgICAgICBpZiBjbGVhbnVwX21veDoKKyAgICAgICAgbW94X29iai5WZXJpZnlBbGwoKQorICAgIG5ld19tZXRob2QuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fCisgICAgbmV3X21ldGhvZC5fX2RvY19fID0gZnVuYy5fX2RvY19fCisgICAgbmV3X21ldGhvZC5fX21vZHVsZV9fID0gZnVuYy5fX21vZHVsZV9fCisgICAgcmV0dXJuIG5ld19tZXRob2QKKworCitjbGFzcyBNb3hUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICIiIkNvbnZlbmllbmNlIHRlc3QgY2xhc3MgdG8gbWFrZSBzdHViYmluZyBlYXNpZXIuCisKKyAgU2V0cyB1cCBhICJtb3giIGF0dHJpYnV0ZSB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiBNb3ggLSBhbnkgbW94IHRlc3RzIHdpbGwKKyAgd2FudCB0aGlzLiBBbHNvIGF1dG9tYXRpY2FsbHkgdW5zZXRzIGFueSBzdHVicyBhbmQgdmVyaWZpZXMgdGhhdCBhbGwgbW9jaworICBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHRlc3QsIGVsaW1pbmF0aW5nIGJvaWxlcnBsYXRlCisgIGNvZGUuCisgICIiIgorCisgIF9fbWV0YWNsYXNzX18gPSBNb3hNZXRhVGVzdEJhc2UKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5tb3ggPSBNb3goKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vc2V0dXAucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Nzc4MzlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9weXRob24vc2V0dXAucHkKQEAgLTAsMCArMSwxOTYgQEAKKyMhIC91c3IvYmluL3B5dGhvbgorIworIyBTZWUgUkVBRE1FIGZvciB1c2FnZSBpbnN0cnVjdGlvbnMuCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKKyMgV2UgbXVzdCB1c2Ugc2V0dXB0b29scywgbm90IGRpc3R1dGlscywgYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSB0aGUKKyMgbmFtZXNwYWNlX3BhY2thZ2VzIG9wdGlvbiBmb3IgdGhlICJnb29nbGUiIHBhY2thZ2UuCit0cnk6CisgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgorZXhjZXB0IEltcG9ydEVycm9yOgorICB0cnk6CisgICAgZnJvbSBlel9zZXR1cCBpbXBvcnQgdXNlX3NldHVwdG9vbHMKKyAgICB1c2Vfc2V0dXB0b29scygpCisgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCisgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBzeXMuc3RkZXJyLndyaXRlKAorICAgICAgICAiQ291bGQgbm90IGltcG9ydCBzZXR1cHRvb2xzOyBtYWtlIHN1cmUgeW91IGhhdmUgc2V0dXB0b29scyBvciAiCisgICAgICAgICJlel9zZXR1cCBpbnN0YWxsZWQuXG4iKQorICAgIHJhaXNlCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmNsZWFuIGltcG9ydCBjbGVhbiBhcyBfY2xlYW4KK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgaW1wb3J0IGJ1aWxkX3B5IGFzIF9idWlsZF9weQorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQorCittYWludGFpbmVyX2VtYWlsID0gInByb3RvYnVmQGdvb2dsZWdyb3Vwcy5jb20iCisKKyMgRmluZCB0aGUgUHJvdG9jb2wgQ29tcGlsZXIuCitpZiAnUFJPVE9DJyBpbiBvcy5lbnZpcm9uIGFuZCBvcy5wYXRoLmV4aXN0cyhvcy5lbnZpcm9uWydQUk9UT0MnXSk6CisgIHByb3RvYyA9IG9zLmVudmlyb25bJ1BST1RPQyddCitlbGlmIG9zLnBhdGguZXhpc3RzKCIuLi9zcmMvcHJvdG9jIik6CisgIHByb3RvYyA9ICIuLi9zcmMvcHJvdG9jIgorZWxpZiBvcy5wYXRoLmV4aXN0cygiLi4vc3JjL3Byb3RvYy5leGUiKToKKyAgcHJvdG9jID0gIi4uL3NyYy9wcm90b2MuZXhlIgorZWxpZiBvcy5wYXRoLmV4aXN0cygiLi4vdnNwcm9qZWN0cy9EZWJ1Zy9wcm90b2MuZXhlIik6CisgIHByb3RvYyA9ICIuLi92c3Byb2plY3RzL0RlYnVnL3Byb3RvYy5leGUiCitlbGlmIG9zLnBhdGguZXhpc3RzKCIuLi92c3Byb2plY3RzL1JlbGVhc2UvcHJvdG9jLmV4ZSIpOgorICBwcm90b2MgPSAiLi4vdnNwcm9qZWN0cy9SZWxlYXNlL3Byb3RvYy5leGUiCitlbHNlOgorICBwcm90b2MgPSBmaW5kX2V4ZWN1dGFibGUoInByb3RvYyIpCisKK2RlZiBnZW5lcmF0ZV9wcm90byhzb3VyY2UpOgorICAiIiJJbnZva2VzIHRoZSBQcm90b2NvbCBDb21waWxlciB0byBnZW5lcmF0ZSBhIF9wYjIucHkgZnJvbSB0aGUgZ2l2ZW4KKyAgLnByb3RvIGZpbGUuICBEb2VzIG5vdGhpbmcgaWYgdGhlIG91dHB1dCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbmV3ZXIgdGhhbgorICB0aGUgaW5wdXQuIiIiCisKKyAgb3V0cHV0ID0gc291cmNlLnJlcGxhY2UoIi5wcm90byIsICJfcGIyLnB5IikucmVwbGFjZSgiLi4vc3JjLyIsICIiKQorCisgIGlmIChub3Qgb3MucGF0aC5leGlzdHMob3V0cHV0KSBvcgorICAgICAgKG9zLnBhdGguZXhpc3RzKHNvdXJjZSkgYW5kCisgICAgICAgb3MucGF0aC5nZXRtdGltZShzb3VyY2UpID4gb3MucGF0aC5nZXRtdGltZShvdXRwdXQpKSk6CisgICAgcHJpbnQgIkdlbmVyYXRpbmcgJXMuLi4iICUgb3V0cHV0CisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlKToKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkNhbid0IGZpbmQgcmVxdWlyZWQgZmlsZTogJXNcbiIgJSBzb3VyY2UpCisgICAgICBzeXMuZXhpdCgtMSkKKworICAgIGlmIHByb3RvYyA9PSBOb25lOgorICAgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgICAicHJvdG9jIGlzIG5vdCBpbnN0YWxsZWQgbm9yIGZvdW5kIGluIC4uL3NyYy4gIFBsZWFzZSBjb21waWxlIGl0ICIKKyAgICAgICAgICAib3IgaW5zdGFsbCB0aGUgYmluYXJ5IHBhY2thZ2UuXG4iKQorICAgICAgc3lzLmV4aXQoLTEpCisKKyAgICBwcm90b2NfY29tbWFuZCA9IFsgcHJvdG9jLCAiLUkuLi9zcmMiLCAiLUkuIiwgIi0tcHl0aG9uX291dD0uIiwgc291cmNlIF0KKyAgICBpZiBzdWJwcm9jZXNzLmNhbGwocHJvdG9jX2NvbW1hbmQpICE9IDA6CisgICAgICBzeXMuZXhpdCgtMSkKKworZGVmIEdlbmVyYXRlVW5pdHRlc3RQcm90b3MoKToKKyAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIpCisgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byIpCisgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvIikKKyAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byIpCisgIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90byIpCisgIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zX2R5bmFtaWMucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8iKQorCitkZWYgTWFrZVRlc3RTdWl0ZSgpOgorICAjIFRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgb24gc29tZSBzeXN0ZW1zIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXN0cworICAjIHdvcmsgZXZlbiBpZiBhIHByZXZpb3VzIHZlcnNpb24gaXMgYWxyZWFkeSBpbnN0YWxsZWQuCisgIGlmICdnb29nbGUnIGluIHN5cy5tb2R1bGVzOgorICAgIGRlbCBzeXMubW9kdWxlc1snZ29vZ2xlJ10KKyAgR2VuZXJhdGVVbml0dGVzdFByb3RvcygpCisKKyAgaW1wb3J0IHVuaXR0ZXN0CisgIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZ2VuZXJhdG9yX3Rlc3QgICAgIGFzIGdlbmVyYXRvcl90ZXN0CisgIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZGVzY3JpcHRvcl90ZXN0ICAgIGFzIGRlc2NyaXB0b3JfdGVzdAorICBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLnJlZmxlY3Rpb25fdGVzdCAgICBhcyByZWZsZWN0aW9uX3Rlc3QKKyAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5zZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdCBcCisgICAgYXMgc2VydmljZV9yZWZsZWN0aW9uX3Rlc3QKKyAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC50ZXh0X2Zvcm1hdF90ZXN0ICAgYXMgdGV4dF9mb3JtYXRfdGVzdAorICBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLndpcmVfZm9ybWF0X3Rlc3QgICBhcyB3aXJlX2Zvcm1hdF90ZXN0CisgIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwudW5rbm93bl9maWVsZHNfdGVzdCBhcyB1bmtub3duX2ZpZWxkc190ZXN0CisgIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZGVzY3JpcHRvcl9kYXRhYmFzZV90ZXN0IFwKKyAgICAgIGFzIGRlc2NyaXB0b3JfZGF0YWJhc2VfdGVzdAorICBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmRlc2NyaXB0b3JfcG9vbF90ZXN0IGFzIGRlc2NyaXB0b3JfcG9vbF90ZXN0CisgIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwubWVzc2FnZV9mYWN0b3J5X3Rlc3QgYXMgbWVzc2FnZV9mYWN0b3J5X3Rlc3QKKyAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5tZXNzYWdlX2NwcF90ZXN0IGFzIG1lc3NhZ2VfY3BwX3Rlc3QKKyAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5yZWZsZWN0aW9uX2NwcF9nZW5lcmF0ZWRfdGVzdCBcCisgICAgICBhcyByZWZsZWN0aW9uX2NwcF9nZW5lcmF0ZWRfdGVzdAorCisgIGxvYWRlciA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyCisgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgZm9yIHRlc3QgaW4gWyBnZW5lcmF0b3JfdGVzdCwKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3Rlc3QsCisgICAgICAgICAgICAgICAgcmVmbGVjdGlvbl90ZXN0LAorICAgICAgICAgICAgICAgIHNlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LAorICAgICAgICAgICAgICAgIHRleHRfZm9ybWF0X3Rlc3QsCisgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXRfdGVzdCBdOgorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGVzdCkpCisKKyAgcmV0dXJuIHN1aXRlCisKKworY2xhc3MgY2xlYW4oX2NsZWFuKToKKyAgZGVmIHJ1bihzZWxmKToKKyAgICAjIERlbGV0ZSBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIGNvZGUgdHJlZS4KKyAgICBmb3IgKGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoIi4iKToKKyAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGZpbGVuYW1lKQorICAgICAgICBpZiBmaWxlcGF0aC5lbmRzd2l0aCgiX3BiMi5weSIpIG9yIGZpbGVwYXRoLmVuZHN3aXRoKCIucHljIikgb3IgXAorICAgICAgICAgIGZpbGVwYXRoLmVuZHN3aXRoKCIuc28iKSBvciBmaWxlcGF0aC5lbmRzd2l0aCgiLm8iKSBvciBcCisgICAgICAgICAgZmlsZXBhdGguZW5kc3dpdGgoJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9fX2luaXRfXy5weScpOgorICAgICAgICAgIG9zLnJlbW92ZShmaWxlcGF0aCkKKyAgICAjIF9jbGVhbiBpcyBhbiBvbGQtc3R5bGUgY2xhc3MsIHNvIHN1cGVyKCkgZG9lc24ndCB3b3JrLgorICAgIF9jbGVhbi5ydW4oc2VsZikKKworY2xhc3MgYnVpbGRfcHkoX2J1aWxkX3B5KToKKyAgZGVmIHJ1bihzZWxmKToKKyAgICAjIEdlbmVyYXRlIG5lY2Vzc2FyeSAucHJvdG8gZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKQorICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byIpCisKKyAgICBHZW5lcmF0ZVVuaXR0ZXN0UHJvdG9zKCkKKyAgICAjIE1ha2Ugc3VyZSBnb29nbGUucHJvdG9idWYuY29tcGlsZXIgaXMgYSB2YWxpZCBwYWNrYWdlLgorICAgIG9wZW4oJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9fX2luaXRfXy5weScsICdhJykuY2xvc2UoKQorICAgICMgX2J1aWxkX3B5IGlzIGFuIG9sZC1zdHlsZSBjbGFzcywgc28gc3VwZXIoKSBkb2Vzbid0IHdvcmsuCisgICAgX2J1aWxkX3B5LnJ1bihzZWxmKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBleHRfbW9kdWxlX2xpc3QgPSBbXQorCisgICMgQysrIGltcGxlbWVudGF0aW9uIGV4dGVuc2lvbgorICBpZiBvcy5nZXRlbnYoIlBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OIiwgInB5dGhvbiIpID09ICJjcHAiOgorICAgIHByaW50ICJVc2luZyBFWFBFUklNRU5UQUwgQysrIEltcGxtZW5ldGF0aW9uLiIKKyAgICBleHRfbW9kdWxlX2xpc3QuYXBwZW5kKEV4dGVuc2lvbigKKyAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5fbmV0X3Byb3RvMl9fX3B5dGhvbiIsCisgICAgICAgIFsgImdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5jYyIsCisgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcHJvdG9idWYuY2MiLAorICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLXByb3RvMi5jYyIgXSwKKyAgICAgICAgaW5jbHVkZV9kaXJzID0gWyAiLiIgXSwKKyAgICAgICAgbGlicmFyaWVzID0gWyAicHJvdG9idWYiIF0pKQorCisgIHNldHVwKG5hbWUgPSAncHJvdG9idWYnLAorICAgICAgICB2ZXJzaW9uID0gJzIuNS4wJywKKyAgICAgICAgcGFja2FnZXMgPSBbICdnb29nbGUnIF0sCisgICAgICAgIG5hbWVzcGFjZV9wYWNrYWdlcyA9IFsgJ2dvb2dsZScgXSwKKyAgICAgICAgdGVzdF9zdWl0ZSA9ICdzZXR1cC5NYWtlVGVzdFN1aXRlJywKKyAgICAgICAgIyBNdXN0IGxpc3QgbW9kdWxlcyBleHBsaWNpdGx5IHNvIHRoYXQgd2UgZG9uJ3QgaW5zdGFsbCB0ZXN0cy4KKyAgICAgICAgcHlfbW9kdWxlcyA9IFsKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmFwaV9pbXBsZW1lbnRhdGlvbicsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5jb250YWluZXJzJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmNwcF9tZXNzYWdlJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmRlY29kZXInLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZW5jb2RlcicsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5lbnVtX3R5cGVfd3JhcHBlcicsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5tZXNzYWdlX2xpc3RlbmVyJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLnB5dGhvbl9tZXNzYWdlJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLnR5cGVfY2hlY2tlcnMnLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwud2lyZV9mb3JtYXQnLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcicsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5wbHVnaW5fcGIyJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLm1lc3NhZ2UnLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9kYXRhYmFzZScsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3Bvb2wnLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYubWVzc2FnZV9mYWN0b3J5JywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnJlZmxlY3Rpb24nLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuc2VydmljZScsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5zZXJ2aWNlX3JlZmxlY3Rpb24nLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYudGV4dF9mb3JtYXQnIF0sCisgICAgICAgIGNtZGNsYXNzID0geyAnY2xlYW4nOiBjbGVhbiwgJ2J1aWxkX3B5JzogYnVpbGRfcHkgfSwKKyAgICAgICAgaW5zdGFsbF9yZXF1aXJlcyA9IFsnc2V0dXB0b29scyddLAorICAgICAgICBleHRfbW9kdWxlcyA9IGV4dF9tb2R1bGVfbGlzdCwKKyAgICAgICAgdXJsID0gJ2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8nLAorICAgICAgICBtYWludGFpbmVyID0gbWFpbnRhaW5lcl9lbWFpbCwKKyAgICAgICAgbWFpbnRhaW5lcl9lbWFpbCA9ICdwcm90b2J1ZkBnb29nbGVncm91cHMuY29tJywKKyAgICAgICAgbGljZW5zZSA9ICdOZXcgQlNEIExpY2Vuc2UnLAorICAgICAgICBkZXNjcmlwdGlvbiA9ICdQcm90b2NvbCBCdWZmZXJzJywKKyAgICAgICAgbG9uZ19kZXNjcmlwdGlvbiA9CisgICAgICAgICAgIlByb3RvY29sIEJ1ZmZlcnMgYXJlIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0LiIsCisgICAgICAgICkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvcHl0aG9uL3N0dWJvdXQucHkgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9zdHVib3V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlZTRmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3B5dGhvbi9zdHVib3V0LnB5CkBAIC0wLDAgKzEsMTQwIEBACisjIS91c3IvYmluL3B5dGhvbjIuNAorIworIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgdGVzdGluZy4gIFRoZSBvcmlnaW5hbCBpcyBhdDoKKyMgICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHltb3gvCisKK2NsYXNzIFN0dWJPdXRGb3JUZXN0aW5nOgorICAiIiJTYW1wbGUgVXNhZ2U6CisgICAgIFlvdSB3YW50IG9zLnBhdGguZXhpc3RzKCkgdG8gYWx3YXlzIHJldHVybiB0cnVlIGR1cmluZyB0ZXN0aW5nLgorCisgICAgIHN0dWJzID0gU3R1Yk91dEZvclRlc3RpbmcoKQorICAgICBzdHVicy5TZXQob3MucGF0aCwgJ2V4aXN0cycsIGxhbWJkYSB4OiAxKQorICAgICAgIC4uLgorICAgICBzdHVicy5VbnNldEFsbCgpCisKKyAgICAgVGhlIGFib3ZlIGNoYW5nZXMgb3MucGF0aC5leGlzdHMgaW50byBhIGxhbWJkYSB0aGF0IHJldHVybnMgMS4gIE9uY2UKKyAgICAgdGhlIC4uLiBwYXJ0IG9mIHRoZSBjb2RlIGZpbmlzaGVzLCB0aGUgVW5zZXRBbGwoKSBsb29rcyB1cCB0aGUgb2xkIHZhbHVlCisgICAgIG9mIG9zLnBhdGguZXhpc3RzIGFuZCByZXN0b3JlcyBpdC4KKworICAiIiIKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYuY2FjaGUgPSBbXQorICAgIHNlbGYuc3R1YnMgPSBbXQorCisgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgIHNlbGYuU21hcnRVbnNldEFsbCgpCisgICAgc2VsZi5VbnNldEFsbCgpCisKKyAgZGVmIFNtYXJ0U2V0KHNlbGYsIG9iaiwgYXR0cl9uYW1lLCBuZXdfYXR0cik6CisgICAgIiIiUmVwbGFjZSBvYmouYXR0cl9uYW1lIHdpdGggbmV3X2F0dHIuIFRoaXMgbWV0aG9kIGlzIHNtYXJ0IGFuZCB3b3JrcworICAgICAgIGF0IHRoZSBtb2R1bGUsIGNsYXNzLCBhbmQgaW5zdGFuY2UgbGV2ZWwgd2hpbGUgcHJlc2VydmluZyBwcm9wZXIKKyAgICAgICBpbmhlcml0YW5jZS4gSXQgd2lsbCBub3Qgc3R1YiBvdXQgQyB0eXBlcyBob3dldmVyIHVubGVzcyB0aGF0IGhhcyBiZWVuCisgICAgICAgZXhwbGljaXRseSBhbGxvd2VkIGJ5IHRoZSB0eXBlLgorCisgICAgICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGNhc2Ugd2hlcmUgYXR0cl9uYW1lIGlzIGEgc3RhdGljbWV0aG9kIG9yIGEKKyAgICAgICBjbGFzc21ldGhvZCBvZiBvYmouCisKKyAgICAgICBOb3RlczoKKyAgICAgIC0gSWYgb2JqIGlzIGFuIGluc3RhbmNlLCB0aGVuIGl0IGlzIGl0cyBjbGFzcyB0aGF0IHdpbGwgYWN0dWFsbHkgYmUKKyAgICAgICAgc3R1YmJlZC4gTm90ZSB0aGF0IHRoZSBtZXRob2QgU2V0KCkgZG9lcyBub3QgZG8gdGhhdDogaWYgb2JqIGlzCisgICAgICAgIGFuIGluc3RhbmNlLCBpdCAoYW5kIG5vdCBpdHMgY2xhc3MpIHdpbGwgYmUgc3R1YmJlZC4KKyAgICAgIC0gVGhlIHN0dWJiaW5nIGlzIHVzaW5nIHRoZSBidWlsdGluIGdldGF0dHIgYW5kIHNldGF0dHIuIFNvLCB0aGUgX19nZXRfXworICAgICAgICBhbmQgX19zZXRfXyB3aWxsIGJlIGNhbGxlZCB3aGVuIHN0dWJiaW5nIChUT0RPOiBBIGJldHRlciBpZGVhIHdvdWxkCisgICAgICAgIHByb2JhYmx5IGJlIHRvIG1hbmlwdWxhdGUgb2JqLl9fZGljdF9fIGluc3RlYWQgb2YgZ2V0YXR0cigpIGFuZAorICAgICAgICBzZXRhdHRyKCkpLgorCisgICAgICAgUmFpc2VzIEF0dHJpYnV0ZUVycm9yIGlmIHRoZSBhdHRyaWJ1dGUgY2Fubm90IGJlIGZvdW5kLgorICAgICIiIgorICAgIGlmIChpbnNwZWN0LmlzbW9kdWxlKG9iaikgb3IKKyAgICAgICAgKG5vdCBpbnNwZWN0LmlzY2xhc3Mob2JqKSBhbmQgb2JqLl9fZGljdF9fLmhhc19rZXkoYXR0cl9uYW1lKSkpOgorICAgICAgb3JpZ19vYmogPSBvYmoKKyAgICAgIG9yaWdfYXR0ciA9IGdldGF0dHIob2JqLCBhdHRyX25hbWUpCisKKyAgICBlbHNlOgorICAgICAgaWYgbm90IGluc3BlY3QuaXNjbGFzcyhvYmopOgorICAgICAgICBtcm8gPSBsaXN0KGluc3BlY3QuZ2V0bXJvKG9iai5fX2NsYXNzX18pKQorICAgICAgZWxzZToKKyAgICAgICAgbXJvID0gbGlzdChpbnNwZWN0LmdldG1ybyhvYmopKQorCisgICAgICBtcm8ucmV2ZXJzZSgpCisKKyAgICAgIG9yaWdfYXR0ciA9IE5vbmUKKworICAgICAgZm9yIGNscyBpbiBtcm86CisgICAgICAgIHRyeToKKyAgICAgICAgICBvcmlnX29iaiA9IGNscworICAgICAgICAgIG9yaWdfYXR0ciA9IGdldGF0dHIob2JqLCBhdHRyX25hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICBjb250aW51ZQorCisgICAgaWYgb3JpZ19hdHRyIGlzIE5vbmU6CisgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiQXR0cmlidXRlIG5vdCBmb3VuZC4iKQorCisgICAgIyBDYWxsaW5nIGdldGF0dHIoKSBvbiBhIHN0YXRpY21ldGhvZCB0cmFuc2Zvcm1zIGl0IHRvIGEgJ25vcm1hbCcgZnVuY3Rpb24uCisgICAgIyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIHB1dCBpdCBiYWNrIGFzIGEgc3RhdGljbWV0aG9kLgorICAgIG9sZF9hdHRyaWJ1dGUgPSBvYmouX19kaWN0X18uZ2V0KGF0dHJfbmFtZSkKKyAgICBpZiBvbGRfYXR0cmlidXRlIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKG9sZF9hdHRyaWJ1dGUsIHN0YXRpY21ldGhvZCk6CisgICAgICBvcmlnX2F0dHIgPSBzdGF0aWNtZXRob2Qob3JpZ19hdHRyKQorCisgICAgc2VsZi5zdHVicy5hcHBlbmQoKG9yaWdfb2JqLCBhdHRyX25hbWUsIG9yaWdfYXR0cikpCisgICAgc2V0YXR0cihvcmlnX29iaiwgYXR0cl9uYW1lLCBuZXdfYXR0cikKKworICBkZWYgU21hcnRVbnNldEFsbChzZWxmKToKKyAgICAiIiJSZXZlcnNlcyBhbGwgdGhlIFNtYXJ0U2V0KCkgY2FsbHMsIHJlc3RvcmluZyB0aGluZ3MgdG8gdGhlaXIgb3JpZ2luYWwKKyAgICBkZWZpbml0aW9uLiAgSXRzIG9rYXkgdG8gY2FsbCBTbWFydFVuc2V0QWxsKCkgcmVwZWF0ZWRseSwgYXMgbGF0ZXIgY2FsbHMKKyAgICBoYXZlIG5vIGVmZmVjdCBpZiBubyBTbWFydFNldCgpIGNhbGxzIGhhdmUgYmVlbiBtYWRlLgorCisgICAgIiIiCisgICAgc2VsZi5zdHVicy5yZXZlcnNlKCkKKworICAgIGZvciBhcmdzIGluIHNlbGYuc3R1YnM6CisgICAgICBzZXRhdHRyKCphcmdzKQorCisgICAgc2VsZi5zdHVicyA9IFtdCisKKyAgZGVmIFNldChzZWxmLCBwYXJlbnQsIGNoaWxkX25hbWUsIG5ld19jaGlsZCk6CisgICAgIiIiUmVwbGFjZSBjaGlsZF9uYW1lJ3Mgb2xkIGRlZmluaXRpb24gd2l0aCBuZXdfY2hpbGQsIGluIHRoZSBjb250ZXh0CisgICAgb2YgdGhlIGdpdmVuIHBhcmVudC4gIFRoZSBwYXJlbnQgY291bGQgYmUgYSBtb2R1bGUgd2hlbiB0aGUgY2hpbGQgaXMgYQorICAgIGZ1bmN0aW9uIGF0IG1vZHVsZSBzY29wZS4gIE9yIHRoZSBwYXJlbnQgY291bGQgYmUgYSBjbGFzcyB3aGVuIGEgY2xhc3MnCisgICAgbWV0aG9kIGlzIGJlaW5nIHJlcGxhY2VkLiAgVGhlIG5hbWVkIGNoaWxkIGlzIHNldCB0byBuZXdfY2hpbGQsIHdoaWxlCisgICAgdGhlIHByaW9yIGRlZmluaXRpb24gaXMgc2F2ZWQgYXdheSBmb3IgbGF0ZXIsIHdoZW4gVW5zZXRBbGwoKSBpcyBjYWxsZWQuCisKKyAgICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgY2FzZSB3aGVyZSBjaGlsZF9uYW1lIGlzIGEgc3RhdGljbWV0aG9kIG9yIGEKKyAgICBjbGFzc21ldGhvZCBvZiBwYXJlbnQuCisgICAgIiIiCisgICAgb2xkX2NoaWxkID0gZ2V0YXR0cihwYXJlbnQsIGNoaWxkX25hbWUpCisKKyAgICBvbGRfYXR0cmlidXRlID0gcGFyZW50Ll9fZGljdF9fLmdldChjaGlsZF9uYW1lKQorICAgIGlmIG9sZF9hdHRyaWJ1dGUgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uob2xkX2F0dHJpYnV0ZSwgc3RhdGljbWV0aG9kKToKKyAgICAgIG9sZF9jaGlsZCA9IHN0YXRpY21ldGhvZChvbGRfY2hpbGQpCisKKyAgICBzZWxmLmNhY2hlLmFwcGVuZCgocGFyZW50LCBvbGRfY2hpbGQsIGNoaWxkX25hbWUpKQorICAgIHNldGF0dHIocGFyZW50LCBjaGlsZF9uYW1lLCBuZXdfY2hpbGQpCisKKyAgZGVmIFVuc2V0QWxsKHNlbGYpOgorICAgICIiIlJldmVyc2VzIGFsbCB0aGUgU2V0KCkgY2FsbHMsIHJlc3RvcmluZyB0aGluZ3MgdG8gdGhlaXIgb3JpZ2luYWwKKyAgICBkZWZpbml0aW9uLiAgSXRzIG9rYXkgdG8gY2FsbCBVbnNldEFsbCgpIHJlcGVhdGVkbHksIGFzIGxhdGVyIGNhbGxzIGhhdmUKKyAgICBubyBlZmZlY3QgaWYgbm8gU2V0KCkgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuCisKKyAgICAiIiIKKyAgICAjIFVuZG8gY2FsbHMgdG8gU2V0KCkgaW4gcmV2ZXJzZSBvcmRlciwgaW4gY2FzZSBTZXQoKSB3YXMgY2FsbGVkIG9uIHRoZQorICAgICMgc2FtZSBhcmd1bWVudHMgcmVwZWF0ZWRseSAod2FudCB0aGUgb3JpZ2luYWwgY2FsbCB0byBiZSBsYXN0IG9uZSB1bmRvbmUpCisgICAgc2VsZi5jYWNoZS5yZXZlcnNlKCkKKworICAgIGZvciAocGFyZW50LCBvbGRfY2hpbGQsIGNoaWxkX25hbWUpIGluIHNlbGYuY2FjaGU6CisgICAgICBzZXRhdHRyKHBhcmVudCwgY2hpbGRfbmFtZSwgb2xkX2NoaWxkKQorICAgIHNlbGYuY2FjaGUgPSBbXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjczM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOTUgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitpZiBIQVZFX1pMSUIKK0daQ0hFQ0tQUk9HUkFNUyA9IHpjZ3ppcCB6Y2d1bnppcAorR1pIRUFERVJTID0gZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgKK0daVEVTVFMgPSBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gKK2Vsc2UKK0daQ0hFQ0tQUk9HUkFNUyA9CitHWkhFQURFUlMgPQorR1pURVNUUyA9CitlbmRpZgorCitpZiBHQ0MKKyMgVGhlc2UgYXJlIGdvb2Qgd2FybmluZ3MgdG8gdHVybiBvbiBieSBkZWZhdWx0CitOT19PUFRfQ1hYRkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKSAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdvdmVybG9hZGVkLXZpcnR1YWwgLVduby1zaWduLWNvbXBhcmUKK2Vsc2UKK05PX09QVF9DWFhGTEFHUyA9ICQoUFRIUkVBRF9DRkxBR1MpCitlbmRpZgorCitBTV9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKSAkKFBST1RPQlVGX09QVF9GTEFHKQorCitBTV9MREZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykKKworIyBJZiBJIHNheSAiZGlzdF9pbmNsdWRlX0RBVEEiLCBhdXRvbWFrZSBjb21wbGFpbnMgdGhhdCAkKGluY2x1ZGVkaXIpIGlzIG5vdAorIyBhICJsZWdpdGltYXRlIiBkaXJlY3RvcnkgZm9yIERBVEEuICBTY3JldyB5b3UsIGF1dG9tYWtlLgorcHJvdG9kaXIgPSAkKGluY2x1ZGVkaXIpCitub2Jhc2VfZGlzdF9wcm90b19EQVRBID0gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gXAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KKworIyBOb3Qgc3VyZSB3aHkgdGhlc2UgZG9uJ3QgZ2V0IGNsZWFuZWQgYXV0b21hdGljYWxseS4KK2NsZWFuLWxvY2FsOgorCXJtIC1mICoubG9UCisKK0NMRUFORklMRVMgPSAkKHByb3RvY19vdXRwdXRzKSB1bml0dGVzdF9wcm90b19taWRkbGVtYW4gXAorICAgICAgICAgICAgIHRlc3R6aXAuamFyIHRlc3R6aXAubGlzdCB0ZXN0emlwLnByb3RvIHRlc3R6aXAuemlwCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gICBcCisgIE1ha2VmaWxlLmluCisKK25vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fZ2NjLmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmggXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19tYWNvc3guaCAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWlwc19nY2MuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3BuYWNsLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICQoR1pIRUFERVJTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmgKKworbGliX0xUTElCUkFSSUVTID0gbGlicHJvdG9idWYtbGl0ZS5sYSBsaWJwcm90b2J1Zi5sYSBsaWJwcm90b2MubGEKKworbGlicHJvdG9idWZfbGl0ZV9sYV9MSUJBREQgPSAkKFBUSFJFQURfTElCUykKK2xpYnByb3RvYnVmX2xpdGVfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gODowOjAgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKK2xpYnByb3RvYnVmX2xpdGVfbGFfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjCisKK2xpYnByb3RvYnVmX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKQorbGlicHJvdG9idWZfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gODowOjAgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKK2xpYnByb3RvYnVmX2xhX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgJChsaWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYworCitsaWJwcm90b2NfbGFfTElCQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhCitsaWJwcm90b2NfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gODowOjAgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKK2xpYnByb3RvY19sYV9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5jYyAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmNjICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmNjICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuY2MgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaCAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaCAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5jYyAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCisKK2Jpbl9QUk9HUkFNUyA9IHByb3RvYworcHJvdG9jX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQorcHJvdG9jX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYworCisjIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3Byb3RvY19pbnB1dHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8gICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8gICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KKworRVhUUkFfRElTVCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKHByb3RvY19pbnB1dHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzb2xhcmlzL2xpYnN0ZGMrKy5sYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2ggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCAgXAorICBnb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90bworCitwcm90b2NfbGl0ZV9vdXRwdXRzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuaAorCitwcm90b2Nfb3V0cHV0cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICQocHJvdG9jX2xpdGVfb3V0cHV0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmgKKworQlVJTFRfU09VUkNFUyA9ICQocHJvdG9jX291dHB1dHMpCisKK2lmIFVTRV9FWFRFUk5BTF9QUk9UT0MKKwordW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuOiAkKHByb3RvY19pbnB1dHMpCisJJChQUk9UT0MpIC1JJChzcmNkaXIpIC0tY3BwX291dD0uICReCisJdG91Y2ggdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCisKK2Vsc2UKKworIyBXZSBoYXZlIHRvIGNkIHRvICQoc3JjZGlyKSBiZWZvcmUgZXhlY3V0aW5nIHByb3RvYyBiZWNhdXNlICQocHJvdG9jX2lucHV0cykgaXMKKyMgcmVsYXRpdmUgdG8gc3JjZGlyLCB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGVuCisjIGJ1aWxkaW5nIG91dC1vZi10cmVlLgordW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuOiBwcm90b2MkKEVYRUVYVCkgJChwcm90b2NfaW5wdXRzKQorCW9sZHB3ZD1gcHdkYCAmJiAoIGNkICQoc3JjZGlyKSAmJiAkJG9sZHB3ZC9wcm90b2MkKEVYRUVYVCkgLUkuIC0tY3BwX291dD0kJG9sZHB3ZCAkKHByb3RvY19pbnB1dHMpICkKKwl0b3VjaCB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KKworZW5kaWYKKworJChwcm90b2Nfb3V0cHV0cyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorCitDT01NT05fVEVTVF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaAorCitjaGVja19QUk9HUkFNUyA9IHByb3RvYyBwcm90b2J1Zi10ZXN0IHByb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0IFwKKyAgICAgICAgICAgICAgICAgcHJvdG9idWYtbGl0ZS10ZXN0IHRlc3RfcGx1Z2luICQoR1pDSEVDS1BST0dSQU1TKQorcHJvdG9idWZfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBsaWJwcm90b2MubGEgXAorICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3RfbWFpbi5sYQorcHJvdG9idWZfdGVzdF9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9ndGVzdC9pbmNsdWRlICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC1JJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2luY2x1ZGUKKyMgRGlzYWJsZSBvcHRpbWl6YXRpb24gZm9yIHRlc3RzIHVubGVzcyB0aGUgdXNlciBleHBsaWNpdGx5IGFza2VkIGZvciBpdCwKKyMgc2luY2UgdGVzdF91dGlsLmNjIHRha2VzIGZvcmV2ZXIgdG8gY29tcGlsZSB3aXRoIG9wdGltaXphdGlvbiAod2l0aCBHQ0MpLgorIyBTZWUgY29uZmlndXJlLmFjIGZvciBtb3JlIGluZm8uCitwcm90b2J1Zl90ZXN0X0NYWEZMQUdTID0gJChOT19PUFRfQ1hYRkxBR1MpCitwcm90b2J1Zl90ZXN0X1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcGx1Z2luX3VuaXR0ZXN0LmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYyAgICBcCisgICQoQ09NTU9OX1RFU1RfU09VUkNFUykKK25vZGlzdF9wcm90b2J1Zl90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19vdXRwdXRzKQorCisjIFJ1biBjcHBfdW5pdHRlc3QgYWdhaW4gd2l0aCBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTIGRlZmluZWQuCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdC5sYSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdF9tYWluLmxhCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9ndGVzdC9pbmNsdWRlICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUkkKHRvcF9idWlsZGRpcikvZ3Rlc3QvaW5jbHVkZSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTID0gJChOT19PUFRfQ1hYRkxBR1MpCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICBcCisgICQoQ09NTU9OX1RFU1RfU09VUkNFUykKK25vZGlzdF9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9TT1VSQ0VTID0gJChwcm90b2Nfb3V0cHV0cykKKworIyBCdWlsZCBsaXRlX3VuaXR0ZXN0IHNlcGFyYXRlbHksIHNpbmNlIGl0IGRvZXNuJ3QgdXNlIGd0ZXN0LgorcHJvdG9idWZfbGl0ZV90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLWxpdGUubGEKK3Byb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfbGl0ZV90ZXN0X1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaAorbm9kaXN0X3Byb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gJChwcm90b2NfbGl0ZV9vdXRwdXRzKQorCisjIFRlc3QgcGx1Z2luIGJpbmFyeS4KK3Rlc3RfcGx1Z2luX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCisgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEKK3Rlc3RfcGx1Z2luX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2d0ZXN0L2luY2x1ZGUgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIC1JJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2luY2x1ZGUKK3Rlc3RfcGx1Z2luX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjCisKK2lmIEhBVkVfWkxJQgoremNnemlwX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhCit6Y2d6aXBfU09VUkNFUyA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYworCit6Y2d1bnppcF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQoremNndW56aXBfU09VUkNFUyA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCitlbmRpZgorCitURVNUUyA9IHByb3RvYnVmLXRlc3QgcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QgcHJvdG9idWYtbGl0ZS10ZXN0IFwKKyAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2ggJChHWlRFU1RTKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvTWFrZWZpbGUuaW4gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q5NmNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzMTIxIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjMgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworCisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK2Jpbl9QUk9HUkFNUyA9IHByb3RvYyQoRVhFRVhUKQorY2hlY2tfUFJPR1JBTVMgPSBwcm90b2MkKEVYRUVYVCkgcHJvdG9idWYtdGVzdCQoRVhFRVhUKSBcCisJcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QkKEVYRUVYVCkgXAorCXByb3RvYnVmLWxpdGUtdGVzdCQoRVhFRVhUKSB0ZXN0X3BsdWdpbiQoRVhFRVhUKSBcCisJJChhbV9fRVhFRVhUXzEpCitURVNUUyA9IHByb3RvYnVmLXRlc3QkKEVYRUVYVCkgcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QkKEVYRUVYVCkgXAorCXByb3RvYnVmLWxpdGUtdGVzdCQoRVhFRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2ggXAorCSQoYW1fX0VYRUVYVF8yKQorc3ViZGlyID0gc3JjCitESVNUX0NPTU1PTiA9ICQoYW1fX25vYmFzZV9pbmNsdWRlX0hFQURFUlNfRElTVCkgXAorCSQobm9iYXNlX2Rpc3RfcHJvdG9fREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2FjX3N5c3RlbV9leHRlbnNpb25zLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2FjeF9jaGVja19zdW5jYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9hY3hfcHRocmVhZC5tNCAkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRvcHRpb25zLm00ICQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHZlcnNpb24ubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9zdGxfaGFzaC5tNCAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyID0geyBcCisgIHRlc3QgLXogIiQkZmlsZXMiIFwKKyAgICB8fCB7IHRlc3QgISAtZCAiJCRkaXIiICYmIHRlc3QgISAtZiAiJCRkaXIiICYmIHRlc3QgISAtciAiJCRkaXIiOyB9IFwKKyAgICB8fCB7IGVjaG8gIiAoIGNkICckJGRpcicgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisgICAgICAgICAkKGFtX19jZCkgIiQkZGlyIiAmJiBybSAtZiAkJGZpbGVzOyB9OyBcCisgIH0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChsaWJkaXIpIiAiJChERVNURElSKSQoYmluZGlyKSIgXAorCSIkKERFU1RESVIpJChwcm90b2RpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCithbV9fREVQRU5ERU5DSUVTXzEgPQorbGlicHJvdG9idWZfbGl0ZV9sYV9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2FtX2xpYnByb3RvYnVmX2xpdGVfbGFfT0JKRUNUUyA9IGF0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5sbyBcCisJYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5sbyBjb21tb24ubG8gb25jZS5sbyBcCisJc3RyaW5ncHJpbnRmLmxvIGV4dGVuc2lvbl9zZXQubG8gZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5sbyBcCisJbWVzc2FnZV9saXRlLmxvIHJlcGVhdGVkX2ZpZWxkLmxvIHdpcmVfZm9ybWF0X2xpdGUubG8gXAorCWNvZGVkX3N0cmVhbS5sbyB6ZXJvX2NvcHlfc3RyZWFtLmxvIFwKKwl6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5sbworbGlicHJvdG9idWZfbGl0ZV9sYV9PQkpFQ1RTID0gJChhbV9saWJwcm90b2J1Zl9saXRlX2xhX09CSkVDVFMpCitsaWJwcm90b2J1Zl9saXRlX2xhX0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSBcCisJJChDWFhGTEFHUykgJChsaWJwcm90b2J1Zl9saXRlX2xhX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK2xpYnByb3RvYnVmX2xhX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKQorYW1fX29iamVjdHNfMSA9IGF0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5sbyBcCisJYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5sbyBjb21tb24ubG8gb25jZS5sbyBcCisJc3RyaW5ncHJpbnRmLmxvIGV4dGVuc2lvbl9zZXQubG8gZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5sbyBcCisJbWVzc2FnZV9saXRlLmxvIHJlcGVhdGVkX2ZpZWxkLmxvIHdpcmVfZm9ybWF0X2xpdGUubG8gXAorCWNvZGVkX3N0cmVhbS5sbyB6ZXJvX2NvcHlfc3RyZWFtLmxvIFwKKwl6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5sbworYW1fbGlicHJvdG9idWZfbGFfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMSkgc3RydXRpbC5sbyBzdWJzdGl0dXRlLmxvIFwKKwlzdHJ1Y3R1cmFsbHlfdmFsaWQubG8gZGVzY3JpcHRvci5sbyBkZXNjcmlwdG9yLnBiLmxvIFwKKwlkZXNjcmlwdG9yX2RhdGFiYXNlLmxvIGR5bmFtaWNfbWVzc2FnZS5sbyBcCisJZXh0ZW5zaW9uX3NldF9oZWF2eS5sbyBnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmxvIFwKKwltZXNzYWdlLmxvIHJlZmxlY3Rpb25fb3BzLmxvIHNlcnZpY2UubG8gdGV4dF9mb3JtYXQubG8gXAorCXVua25vd25fZmllbGRfc2V0LmxvIHdpcmVfZm9ybWF0LmxvIGd6aXBfc3RyZWFtLmxvIHByaW50ZXIubG8gXAorCXRva2VuaXplci5sbyB6ZXJvX2NvcHlfc3RyZWFtX2ltcGwubG8gaW1wb3J0ZXIubG8gcGFyc2VyLmxvCitsaWJwcm90b2J1Zl9sYV9PQkpFQ1RTID0gJChhbV9saWJwcm90b2J1Zl9sYV9PQkpFQ1RTKQorbGlicHJvdG9idWZfbGFfTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYTEQpICQoQU1fQ1hYRkxBR1MpIFwKKwkkKENYWEZMQUdTKSAkKGxpYnByb3RvYnVmX2xhX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK2xpYnByb3RvY19sYV9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgbGlicHJvdG9idWYubGEKK2FtX2xpYnByb3RvY19sYV9PQkpFQ1RTID0gY29kZV9nZW5lcmF0b3IubG8gY29tbWFuZF9saW5lX2ludGVyZmFjZS5sbyBcCisJcGx1Z2luLmxvIHBsdWdpbi5wYi5sbyBzdWJwcm9jZXNzLmxvIHppcF93cml0ZXIubG8gY3BwX2VudW0ubG8gXAorCWNwcF9lbnVtX2ZpZWxkLmxvIGNwcF9leHRlbnNpb24ubG8gY3BwX2ZpZWxkLmxvIGNwcF9maWxlLmxvIFwKKwljcHBfZ2VuZXJhdG9yLmxvIGNwcF9oZWxwZXJzLmxvIGNwcF9tZXNzYWdlLmxvIFwKKwljcHBfbWVzc2FnZV9maWVsZC5sbyBjcHBfcHJpbWl0aXZlX2ZpZWxkLmxvIGNwcF9zZXJ2aWNlLmxvIFwKKwljcHBfc3RyaW5nX2ZpZWxkLmxvIGphdmFfZW51bS5sbyBqYXZhX2VudW1fZmllbGQubG8gXAorCWphdmFfZXh0ZW5zaW9uLmxvIGphdmFfZmllbGQubG8gamF2YV9maWxlLmxvIGphdmFfZ2VuZXJhdG9yLmxvIFwKKwlqYXZhX2hlbHBlcnMubG8gamF2YV9tZXNzYWdlLmxvIGphdmFfbWVzc2FnZV9maWVsZC5sbyBcCisJamF2YV9wcmltaXRpdmVfZmllbGQubG8gamF2YV9zZXJ2aWNlLmxvIGphdmFfc3RyaW5nX2ZpZWxkLmxvIFwKKwlqYXZhX2RvY19jb21tZW50LmxvIHB5dGhvbl9nZW5lcmF0b3IubG8KK2xpYnByb3RvY19sYV9PQkpFQ1RTID0gJChhbV9saWJwcm90b2NfbGFfT0JKRUNUUykKK2xpYnByb3RvY19sYV9MSU5LID0gJChMSUJUT09MKSAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDWFhMRCkgJChBTV9DWFhGTEFHUykgXAorCSQoQ1hYRkxBR1MpICQobGlicHJvdG9jX2xhX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0BIQVZFX1pMSUJfVFJVRUBhbV9fRVhFRVhUXzEgPSB6Y2d6aXAkKEVYRUVYVCkgemNndW56aXAkKEVYRUVYVCkKK1BST0dSQU1TID0gJChiaW5fUFJPR1JBTVMpCithbV9fb2JqZWN0c18yID0gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUuJChPQkpFWFQpCithbV9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9PQkpFQ1RTID0gIFwKKwlwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwkkKGFtX19vYmplY3RzXzIpCithbV9fb2JqZWN0c18zID0gIFwKKwlwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuJChPQkpFWFQpCithbV9fb2JqZWN0c180ID0gJChhbV9fb2JqZWN0c18zKSBcCisJcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi4kKE9CSkVYVCkgXAorCXByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi4kKE9CSkVYVCkgXAorCXByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi4kKE9CSkVYVCkgXAorCXByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuJChPQkpFWFQpCitub2Rpc3RfcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfNCkKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X09CSkVDVFMgPSAgXAorCSQoYW1fcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfT0JKRUNUUykgXAorCSQobm9kaXN0X3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X09CSkVDVFMpCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCWxpYnByb3RvYnVmLmxhICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEgXAorCSQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3RfbWFpbi5sYQorcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q1hYIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYTEQpIFwKKwkkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSBcCisJJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9wcm90b2J1Zl9saXRlX3Rlc3RfT0JKRUNUUyA9ICBcCisJcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUuJChPQkpFWFQpCithbV9fb2JqZWN0c181ID0gcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLiQoT0JKRVhUKQorbm9kaXN0X3Byb3RvYnVmX2xpdGVfdGVzdF9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c181KQorcHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMgPSAkKGFtX3Byb3RvYnVmX2xpdGVfdGVzdF9PQkpFQ1RTKSBcCisJJChub2Rpc3RfcHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMpCitwcm90b2J1Zl9saXRlX3Rlc3RfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwlsaWJwcm90b2J1Zi1saXRlLmxhCitwcm90b2J1Zl9saXRlX3Rlc3RfTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYTEQpIFwKKwkkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorYW1fX29iamVjdHNfNiA9IHByb3RvYnVmX3Rlc3QtdGVzdF91dGlsLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1maWxlLiQoT0JKRVhUKQorYW1fcHJvdG9idWZfdGVzdF9PQkpFQ1RTID0gcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LW9uY2VfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXN0cnV0aWxfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC10eXBlX3RyYWl0c191bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1jcHBfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LWNwcF9wbHVnaW5fdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LWphdmFfcGx1Z2luX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC1weXRob25fcGx1Z2luX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJJChhbV9fb2JqZWN0c182KQorYW1fX29iamVjdHNfNyA9IHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzggPSAkKGFtX19vYmplY3RzXzcpIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKSBcCisJcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi4kKE9CSkVYVCkgXAorCXByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuJChPQkpFWFQpIFwKKwlwcm90b2J1Zl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi4kKE9CSkVYVCkKK25vZGlzdF9wcm90b2J1Zl90ZXN0X09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzgpCitwcm90b2J1Zl90ZXN0X09CSkVDVFMgPSAkKGFtX3Byb3RvYnVmX3Rlc3RfT0JKRUNUUykgXAorCSQobm9kaXN0X3Byb3RvYnVmX3Rlc3RfT0JKRUNUUykKK3Byb3RvYnVmX3Rlc3RfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIGxpYnByb3RvYnVmLmxhIFwKKwlsaWJwcm90b2MubGEgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdF9tYWluLmxhCitwcm90b2J1Zl90ZXN0X0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENYWExEKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpIFwKKwkkKENYWEZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK2FtX3Byb3RvY19PQkpFQ1RTID0gbWFpbi4kKE9CSkVYVCkKK3Byb3RvY19PQkpFQ1RTID0gJChhbV9wcm90b2NfT0JKRUNUUykKK3Byb3RvY19ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgbGlicHJvdG9idWYubGEgXAorCWxpYnByb3RvYy5sYQorYW1fdGVzdF9wbHVnaW5fT0JKRUNUUyA9IHRlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IuJChPQkpFWFQpIFwKKwl0ZXN0X3BsdWdpbi1maWxlLiQoT0JKRVhUKSB0ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi4kKE9CSkVYVCkKK3Rlc3RfcGx1Z2luX09CSkVDVFMgPSAkKGFtX3Rlc3RfcGx1Z2luX09CSkVDVFMpCit0ZXN0X3BsdWdpbl9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgbGlicHJvdG9idWYubGEgXAorCWxpYnByb3RvYy5sYSAkKHRvcF9idWlsZGRpcikvZ3Rlc3QvbGliL2xpYmd0ZXN0LmxhCithbV9femNndW56aXBfU09VUkNFU19ESVNUID0gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MKK0BIQVZFX1pMSUJfVFJVRUBhbV96Y2d1bnppcF9PQkpFQ1RTID0gemNndW56aXAuJChPQkpFWFQpCit6Y2d1bnppcF9PQkpFQ1RTID0gJChhbV96Y2d1bnppcF9PQkpFQ1RTKQorQEhBVkVfWkxJQl9UUlVFQHpjZ3VuemlwX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCitASEFWRV9aTElCX1RSVUVACWxpYnByb3RvYnVmLmxhCithbV9femNnemlwX1NPVVJDRVNfRElTVCA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYworQEhBVkVfWkxJQl9UUlVFQGFtX3pjZ3ppcF9PQkpFQ1RTID0gemNnemlwLiQoT0JKRVhUKQoremNnemlwX09CSkVDVFMgPSAkKGFtX3pjZ3ppcF9PQkpFQ1RTKQorQEhBVkVfWkxJQl9UUlVFQHpjZ3ppcF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorQEhBVkVfWkxJQl9UUlVFQAlsaWJwcm90b2J1Zi5sYQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitMVENYWENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorQ1hYTEQgPSAkKENYWCkKK0NYWExJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGlicHJvdG9idWZfbGl0ZV9sYV9TT1VSQ0VTKSAkKGxpYnByb3RvYnVmX2xhX1NPVVJDRVMpIFwKKwkkKGxpYnByb3RvY19sYV9TT1VSQ0VTKSBcCisJJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9TT1VSQ0VTKSBcCisJJChub2Rpc3RfcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUykgXAorCSQocHJvdG9idWZfbGl0ZV90ZXN0X1NPVVJDRVMpIFwKKwkkKG5vZGlzdF9wcm90b2J1Zl9saXRlX3Rlc3RfU09VUkNFUykgJChwcm90b2J1Zl90ZXN0X1NPVVJDRVMpIFwKKwkkKG5vZGlzdF9wcm90b2J1Zl90ZXN0X1NPVVJDRVMpICQocHJvdG9jX1NPVVJDRVMpIFwKKwkkKHRlc3RfcGx1Z2luX1NPVVJDRVMpICQoemNndW56aXBfU09VUkNFUykgJCh6Y2d6aXBfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobGlicHJvdG9idWZfbGl0ZV9sYV9TT1VSQ0VTKSBcCisJJChsaWJwcm90b2J1Zl9sYV9TT1VSQ0VTKSAkKGxpYnByb3RvY19sYV9TT1VSQ0VTKSBcCisJJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9TT1VSQ0VTKSBcCisJJChwcm90b2J1Zl9saXRlX3Rlc3RfU09VUkNFUykgJChwcm90b2J1Zl90ZXN0X1NPVVJDRVMpIFwKKwkkKHByb3RvY19TT1VSQ0VTKSAkKHRlc3RfcGx1Z2luX1NPVVJDRVMpIFwKKwkkKGFtX196Y2d1bnppcF9TT1VSQ0VTX0RJU1QpICQoYW1fX3pjZ3ppcF9TT1VSQ0VTX0RJU1QpCitEQVRBID0gJChub2Jhc2VfZGlzdF9wcm90b19EQVRBKQorYW1fX25vYmFzZV9pbmNsdWRlX0hFQURFUlNfRElTVCA9IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fcW54LmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wbmFjbC5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHMuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIFwKKwlnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmggXAorCWdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmggXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmggXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmggXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmggXAorCWdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmggZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmggXAorCWdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oIFwKKwlnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmggXAorCWdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmggZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmggXAorCWdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaAorSEVBREVSUyA9ICQobm9iYXNlX2luY2x1ZGVfSEVBREVSUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK2FtX190dHlfY29sb3JzID0gXAorcmVkPTsgZ3JuPTsgbGduPTsgYmx1PTsgc3RkPQorQEhBVkVfWkxJQl9UUlVFQGFtX19FWEVFWFRfMiA9ICBcCitASEFWRV9aTElCX1RSVUVACWdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaAorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0lTQUlORk8gPSBASVNBSU5GT0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BPV19MSUIgPSBAUE9XX0xJQkAKK1BST1RPQlVGX09QVF9GTEFHID0gQFBST1RPQlVGX09QVF9GTEFHQAorUFJPVE9DID0gQFBST1RPQ0AKK1BUSFJFQURfQ0MgPSBAUFRIUkVBRF9DQ0AKK1BUSFJFQURfQ0ZMQUdTID0gQFBUSFJFQURfQ0ZMQUdTQAorUFRIUkVBRF9MSUJTID0gQFBUSFJFQURfTElCU0AKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQVIgPSBAYWNfY3RfQVJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithY3hfcHRocmVhZF9jb25maWcgPSBAYWN4X3B0aHJlYWRfY29uZmlnQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3ViZGlycyA9IEBzdWJkaXJzQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0ID0gQHRhcmdldEAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0YXJnZXRfY3B1ID0gQHRhcmdldF9jcHVACit0YXJnZXRfb3MgPSBAdGFyZ2V0X29zQAordGFyZ2V0X3ZlbmRvciA9IEB0YXJnZXRfdmVuZG9yQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0BIQVZFX1pMSUJfRkFMU0VAR1pDSEVDS1BST0dSQU1TID0gCitASEFWRV9aTElCX1RSVUVAR1pDSEVDS1BST0dSQU1TID0gemNnemlwIHpjZ3VuemlwCitASEFWRV9aTElCX0ZBTFNFQEdaSEVBREVSUyA9IAorQEhBVkVfWkxJQl9UUlVFQEdaSEVBREVSUyA9IGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCitASEFWRV9aTElCX0ZBTFNFQEdaVEVTVFMgPSAKK0BIQVZFX1pMSUJfVFJVRUBHWlRFU1RTID0gZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtX3VuaXR0ZXN0LnNoCitAR0NDX0ZBTFNFQE5PX09QVF9DWFhGTEFHUyA9ICQoUFRIUkVBRF9DRkxBR1MpCisKKyMgVGhlc2UgYXJlIGdvb2Qgd2FybmluZ3MgdG8gdHVybiBvbiBieSBkZWZhdWx0CitAR0NDX1RSVUVATk9fT1BUX0NYWEZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1Xb3ZlcmxvYWRlZC12aXJ0dWFsIC1Xbm8tc2lnbi1jb21wYXJlCitBTV9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKSAkKFBST1RPQlVGX09QVF9GTEFHKQorQU1fTERGTEFHUyA9ICQoUFRIUkVBRF9DRkxBR1MpCisKKyMgSWYgSSBzYXkgImRpc3RfaW5jbHVkZV9EQVRBIiwgYXV0b21ha2UgY29tcGxhaW5zIHRoYXQgJChpbmNsdWRlZGlyKSBpcyBub3QKKyMgYSAibGVnaXRpbWF0ZSIgZGlyZWN0b3J5IGZvciBEQVRBLiAgU2NyZXcgeW91LCBhdXRvbWFrZS4KK3Byb3RvZGlyID0gJChpbmNsdWRlZGlyKQorbm9iYXNlX2Rpc3RfcHJvdG9fREFUQSA9IGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvCisKK0NMRUFORklMRVMgPSAkKHByb3RvY19vdXRwdXRzKSB1bml0dGVzdF9wcm90b19taWRkbGVtYW4gXAorICAgICAgICAgICAgIHRlc3R6aXAuamFyIHRlc3R6aXAubGlzdCB0ZXN0emlwLnByb3RvIHRlc3R6aXAuemlwCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gXAorICBNYWtlZmlsZS5pbgorCitub2Jhc2VfaW5jbHVkZV9IRUFERVJTID0gXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9xbnguaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wbmFjbC5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKEdaSEVBREVSUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYnByb3RvYnVmLWxpdGUubGEgbGlicHJvdG9idWYubGEgbGlicHJvdG9jLmxhCitsaWJwcm90b2J1Zl9saXRlX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKQorbGlicHJvdG9idWZfbGl0ZV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyA4OjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAorbGlicHJvdG9idWZfbGl0ZV9sYV9TT1VSQ0VTID0gXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKKworbGlicHJvdG9idWZfbGFfTElCQUREID0gJChQVEhSRUFEX0xJQlMpCitsaWJwcm90b2J1Zl9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyA4OjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAorbGlicHJvdG9idWZfbGFfU09VUkNFUyA9IFwKKyAgJChsaWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYworCitsaWJwcm90b2NfbGFfTElCQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhCitsaWJwcm90b2NfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gODowOjAgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKK2xpYnByb3RvY19sYV9TT1VSQ0VTID0gXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MKKworcHJvdG9jX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQorcHJvdG9jX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYworCisjIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citwcm90b2NfaW5wdXRzID0gXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90byAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8gICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bworCitFWFRSQV9ESVNUID0gXAorICAkKHByb3RvY19pbnB1dHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzb2xhcmlzL2xpYnN0ZGMrKy5sYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2ggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCAgXAorICBnb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90bworCitwcm90b2NfbGl0ZV9vdXRwdXRzID0gXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmgKKworcHJvdG9jX291dHB1dHMgPSBcCisgICQocHJvdG9jX2xpdGVfb3V0cHV0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmgKKworQlVJTFRfU09VUkNFUyA9ICQocHJvdG9jX291dHB1dHMpCitDT01NT05fVEVTVF9TT1VSQ0VTID0gXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmgKKworcHJvdG9idWZfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBsaWJwcm90b2MubGEgXAorICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3RfbWFpbi5sYQorCitwcm90b2J1Zl90ZXN0X0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2d0ZXN0L2luY2x1ZGUgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgLUkkKHRvcF9idWlsZGRpcikvZ3Rlc3QvaW5jbHVkZQorCisjIERpc2FibGUgb3B0aW1pemF0aW9uIGZvciB0ZXN0cyB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgaXQsCisjIHNpbmNlIHRlc3RfdXRpbC5jYyB0YWtlcyBmb3JldmVyIHRvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb24gKHdpdGggR0NDKS4KKyMgU2VlIGNvbmZpZ3VyZS5hYyBmb3IgbW9yZSBpbmZvLgorcHJvdG9idWZfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfdGVzdF9TT1VSQ0VTID0gXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYyAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5oICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LmNjICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MgICAgXAorICAkKENPTU1PTl9URVNUX1NPVVJDRVMpCisKK25vZGlzdF9wcm90b2J1Zl90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19vdXRwdXRzKQorCisjIFJ1biBjcHBfdW5pdHRlc3QgYWdhaW4gd2l0aCBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTIGRlZmluZWQuCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdC5sYSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdF9tYWluLmxhCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2d0ZXN0L2luY2x1ZGUgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSSQodG9wX2J1aWxkZGlyKS9ndGVzdC9pbmNsdWRlICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUyA9IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgIFwKKyAgJChDT01NT05fVEVTVF9TT1VSQ0VTKQorCitub2Rpc3RfcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUyA9ICQocHJvdG9jX291dHB1dHMpCisKKyMgQnVpbGQgbGl0ZV91bml0dGVzdCBzZXBhcmF0ZWx5LCBzaW5jZSBpdCBkb2Vzbid0IHVzZSBndGVzdC4KK3Byb3RvYnVmX2xpdGVfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi1saXRlLmxhCitwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykKK3Byb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gXAorICBnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmgKKworbm9kaXN0X3Byb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gJChwcm90b2NfbGl0ZV9vdXRwdXRzKQorCisjIFRlc3QgcGx1Z2luIGJpbmFyeS4KK3Rlc3RfcGx1Z2luX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCisgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEKKwordGVzdF9wbHVnaW5fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvZ3Rlc3QvaW5jbHVkZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgLUkkKHRvcF9idWlsZGRpcikvZ3Rlc3QvaW5jbHVkZQorCit0ZXN0X3BsdWdpbl9TT1VSQ0VTID0gXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MKKworQEhBVkVfWkxJQl9UUlVFQHpjZ3ppcF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQorQEhBVkVfWkxJQl9UUlVFQHpjZ3ppcF9TT1VSQ0VTID0gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjCitASEFWRV9aTElCX1RSVUVAemNndW56aXBfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEKK0BIQVZFX1pMSUJfVFJVRUB6Y2d1bnppcF9TT1VSQ0VTID0gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MKK2FsbDogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgc3JjL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHNyYy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKK2luc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobGliZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobGliZGlyKSIKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCisJICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lOyBcCisJdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCisJICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgJyQoREVTVERJUikkKGxpYmRpciknIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgIiQoREVTVERJUikkKGxpYmRpcikiOyBcCisJfQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgJChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJyQoREVTVERJUikkKGxpYmRpcikvJCRmJyI7IFwKKwkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICIkKERFU1RESVIpJChsaWJkaXIpLyQkZiI7IFwKKwlkb25lCisKK2NsZWFuLWxpYkxUTElCUkFSSUVTOgorCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGRpcj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfC9bXi9dKiQkfHwnYCI7IFwKKwkgIHRlc3QgIiQkZGlyIiAhPSAiJCRwIiB8fCBkaXI9LjsgXAorCSAgZWNobyAicm0gLWYgXCIkJHtkaXJ9L3NvX2xvY2F0aW9uc1wiIjsgXAorCSAgcm0gLWYgIiQke2Rpcn0vc29fbG9jYXRpb25zIjsgXAorCWRvbmUKK2xpYnByb3RvYnVmLWxpdGUubGE6ICQobGlicHJvdG9idWZfbGl0ZV9sYV9PQkpFQ1RTKSAkKGxpYnByb3RvYnVmX2xpdGVfbGFfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2xpYnByb3RvYnVmX2xpdGVfbGFfREVQRU5ERU5DSUVTKSAKKwkkKGxpYnByb3RvYnVmX2xpdGVfbGFfTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYnByb3RvYnVmX2xpdGVfbGFfT0JKRUNUUykgJChsaWJwcm90b2J1Zl9saXRlX2xhX0xJQkFERCkgJChMSUJTKQorbGlicHJvdG9idWYubGE6ICQobGlicHJvdG9idWZfbGFfT0JKRUNUUykgJChsaWJwcm90b2J1Zl9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGlicHJvdG9idWZfbGFfREVQRU5ERU5DSUVTKSAKKwkkKGxpYnByb3RvYnVmX2xhX0xJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJwcm90b2J1Zl9sYV9PQkpFQ1RTKSAkKGxpYnByb3RvYnVmX2xhX0xJQkFERCkgJChMSUJTKQorbGlicHJvdG9jLmxhOiAkKGxpYnByb3RvY19sYV9PQkpFQ1RTKSAkKGxpYnByb3RvY19sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGlicHJvdG9jX2xhX0RFUEVOREVOQ0lFUykgCisJJChsaWJwcm90b2NfbGFfTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYnByb3RvY19sYV9PQkpFQ1RTKSAkKGxpYnByb3RvY19sYV9MSUJBREQpICQoTElCUykKK2luc3RhbGwtYmluUFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisJc2VkICdzLyQoRVhFRVhUKSQkLy8nIHwgXAorCXdoaWxlIHJlYWQgcCBwMTsgZG8gaWYgdGVzdCAtZiAkJHAgfHwgdGVzdCAtZiAkJHAxOyBcCisJICB0aGVuIGVjaG8gIiQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO247aCcgLWUgJ3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJyB8IFwKKwlzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxIH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsICQkMyAiLyIgJCQ0LCAkJDE7IH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICBpZiB0ZXN0ICIkJGRpciIgPSAuOyB0aGVuIGRpcj07IGVsc2UgZGlyPS8kJGRpcjsgZmk7IFwKKwkgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAnJChERVNURElSKSQoYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgIiQoREVTVERJUikkKGJpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKKwkgICAgfSBcCisJOyBkb25lCisKK3VuaW5zdGFsbC1iaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKGJpbmRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IFwKKwkgIHNlZCAtZSAnaDtzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pJyBcCisJICAgICAgLWUgJ3MvJCQvJChFWEVFWFQpLycgYDsgXAorCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKGJpbmRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK2NsZWFuLWJpblBST0dSQU1TOgorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCisJdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKKwlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QKKworY2xlYW4tY2hlY2tQUk9HUkFNUzoKKwlAbGlzdD0nJChjaGVja19QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCisJdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKKwlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QKK3Byb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0JChFWEVFWFQpOiAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X09CSkVDVFMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHByb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0JChFWEVFWFQpCisJJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9MSU5LKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X09CSkVDVFMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfTERBREQpICQoTElCUykKK3Byb3RvYnVmLWxpdGUtdGVzdCQoRVhFRVhUKTogJChwcm90b2J1Zl9saXRlX3Rlc3RfT0JKRUNUUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3Byb3RvYnVmX2xpdGVfdGVzdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBwcm90b2J1Zi1saXRlLXRlc3QkKEVYRUVYVCkKKwkkKHByb3RvYnVmX2xpdGVfdGVzdF9MSU5LKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9PQkpFQ1RTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9MREFERCkgJChMSUJTKQorcHJvdG9idWYtdGVzdCQoRVhFRVhUKTogJChwcm90b2J1Zl90ZXN0X09CSkVDVFMpICQocHJvdG9idWZfdGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfcHJvdG9idWZfdGVzdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBwcm90b2J1Zi10ZXN0JChFWEVFWFQpCisJJChwcm90b2J1Zl90ZXN0X0xJTkspICQocHJvdG9idWZfdGVzdF9PQkpFQ1RTKSAkKHByb3RvYnVmX3Rlc3RfTERBREQpICQoTElCUykKK3Byb3RvYyQoRVhFRVhUKTogJChwcm90b2NfT0JKRUNUUykgJChwcm90b2NfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3Byb3RvY19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBwcm90b2MkKEVYRUVYVCkKKwkkKENYWExJTkspICQocHJvdG9jX09CSkVDVFMpICQocHJvdG9jX0xEQUREKSAkKExJQlMpCit0ZXN0X3BsdWdpbiQoRVhFRVhUKTogJCh0ZXN0X3BsdWdpbl9PQkpFQ1RTKSAkKHRlc3RfcGx1Z2luX0RFUEVOREVOQ0lFUykgJChFWFRSQV90ZXN0X3BsdWdpbl9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB0ZXN0X3BsdWdpbiQoRVhFRVhUKQorCSQoQ1hYTElOSykgJCh0ZXN0X3BsdWdpbl9PQkpFQ1RTKSAkKHRlc3RfcGx1Z2luX0xEQUREKSAkKExJQlMpCit6Y2d1bnppcCQoRVhFRVhUKTogJCh6Y2d1bnppcF9PQkpFQ1RTKSAkKHpjZ3VuemlwX0RFUEVOREVOQ0lFUykgJChFWFRSQV96Y2d1bnppcF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB6Y2d1bnppcCQoRVhFRVhUKQorCSQoQ1hYTElOSykgJCh6Y2d1bnppcF9PQkpFQ1RTKSAkKHpjZ3VuemlwX0xEQUREKSAkKExJQlMpCit6Y2d6aXAkKEVYRUVYVCk6ICQoemNnemlwX09CSkVDVFMpICQoemNnemlwX0RFUEVOREVOQ0lFUykgJChFWFRSQV96Y2d6aXBfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgemNnemlwJChFWEVFWFQpCisJJChDWFhMSU5LKSAkKHpjZ3ppcF9PQkpFQ1RTKSAkKHpjZ3ppcF9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NvZGVfZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY29kZWRfc3RyZWFtLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY29tbWFuZF9saW5lX2ludGVyZmFjZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NvbW1vbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NwcF9lbnVtLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY3BwX2VudW1fZmllbGQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jcHBfZXh0ZW5zaW9uLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY3BwX2ZpZWxkLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY3BwX2ZpbGUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jcHBfZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY3BwX2hlbHBlcnMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jcHBfbWVzc2FnZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NwcF9tZXNzYWdlX2ZpZWxkLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY3BwX3ByaW1pdGl2ZV9maWVsZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NwcF9zZXJ2aWNlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY3BwX3N0cmluZ19maWVsZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rlc2NyaXB0b3IuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kZXNjcmlwdG9yLnBiLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGVzY3JpcHRvcl9kYXRhYmFzZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2R5bmFtaWNfbWVzc2FnZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2V4dGVuc2lvbl9zZXQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9leHRlbnNpb25fc2V0X2hlYXZ5LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nemlwX3N0cmVhbS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2ltcG9ydGVyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamF2YV9kb2NfY29tbWVudC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2phdmFfZW51bS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2phdmFfZW51bV9maWVsZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2phdmFfZXh0ZW5zaW9uLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamF2YV9maWVsZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2phdmFfZmlsZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2phdmFfZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamF2YV9oZWxwZXJzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamF2YV9tZXNzYWdlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamF2YV9tZXNzYWdlX2ZpZWxkLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamF2YV9wcmltaXRpdmVfZmllbGQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qYXZhX3NlcnZpY2UuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qYXZhX3N0cmluZ19maWVsZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21haW4uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21lc3NhZ2UuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tZXNzYWdlX2xpdGUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9vbmNlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcGFyc2VyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcGx1Z2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcGx1Z2luLnBiLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJpbnRlci5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF9wbHVnaW5fdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmlsZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qYXZhX3BsdWdpbl91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb25jZV91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1weXRob25fcGx1Z2luX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX3RyYWl0c191bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9weXRob25fZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmVmbGVjdGlvbl9vcHMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZXBlYXRlZF9maWVsZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3NlcnZpY2UuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHJpbmdwcmludGYuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHJ1Y3R1cmFsbHlfdmFsaWQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHJ1dGlsLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3VicHJvY2Vzcy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N1YnN0aXR1dGUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGV4dF9mb3JtYXQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90b2tlbml6ZXIuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS91bmtub3duX2ZpZWxkX3NldC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3dpcmVfZm9ybWF0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd2lyZV9mb3JtYXRfbGl0ZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3pjZ3VuemlwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS96Y2d6aXAuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3plcm9fY29weV9zdHJlYW0uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ppcF93cml0ZXIuUGxvQGFtX19xdW90ZUAKKworLmNjLm86CitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFhDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWENPTVBJTEUpIC1jIC1vICRAICQ8CisKKy5jYy5vYmo6CitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFhDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuY2MubG86CitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMVENYWENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMVENYWENPTVBJTEUpIC1jIC1vICRAICQ8CisKK2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5sbzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGF0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLlRwbyAtYyAtbyBhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5UcG8gJChERVBESVIpL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjJyBvYmplY3Q9J2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjCisKK2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMubG86IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5UcG8gLWMgLW8gYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLlRwbyAkKERFUERJUikvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5jYycgb2JqZWN0PSdhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MKKworY29tbW9uLmxvOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgY29tbW9uLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9jb21tb24uVHBvIC1jIC1vIGNvbW1vbi5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvY29tbW9uLlRwbyAkKERFUERJUikvY29tbW9uLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MnIG9iamVjdD0nY29tbW9uLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBjb21tb24ubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MKKworb25jZS5sbzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBvbmNlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9vbmNlLlRwbyAtYyAtbyBvbmNlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL29uY2UuVHBvICQoREVQRElSKS9vbmNlLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjJyBvYmplY3Q9J29uY2UubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG9uY2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5jYworCitzdHJpbmdwcmludGYubG86IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBzdHJpbmdwcmludGYubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0cmluZ3ByaW50Zi5UcG8gLWMgLW8gc3RyaW5ncHJpbnRmLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdHJpbmdwcmludGYuVHBvICQoREVQRElSKS9zdHJpbmdwcmludGYuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYycgb2JqZWN0PSdzdHJpbmdwcmludGYubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHN0cmluZ3ByaW50Zi5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYworCitleHRlbnNpb25fc2V0LmxvOiBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGV4dGVuc2lvbl9zZXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2V4dGVuc2lvbl9zZXQuVHBvIC1jIC1vIGV4dGVuc2lvbl9zZXQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZXh0ZW5zaW9uX3NldC5UcG8gJChERVBESVIpL2V4dGVuc2lvbl9zZXQuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MnIG9iamVjdD0nZXh0ZW5zaW9uX3NldC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZXh0ZW5zaW9uX3NldC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjCisKK2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwubG86IGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5UcG8gLWMgLW8gZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLlRwbyAkKERFUERJUikvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYycgb2JqZWN0PSdnZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MKKworbWVzc2FnZV9saXRlLmxvOiBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgbWVzc2FnZV9saXRlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9tZXNzYWdlX2xpdGUuVHBvIC1jIC1vIG1lc3NhZ2VfbGl0ZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbWVzc2FnZV9saXRlLlRwbyAkKERFUERJUikvbWVzc2FnZV9saXRlLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MnIG9iamVjdD0nbWVzc2FnZV9saXRlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBtZXNzYWdlX2xpdGUubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MKKworcmVwZWF0ZWRfZmllbGQubG86IGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHJlcGVhdGVkX2ZpZWxkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9yZXBlYXRlZF9maWVsZC5UcG8gLWMgLW8gcmVwZWF0ZWRfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9yZXBlYXRlZF9maWVsZC5UcG8gJChERVBESVIpL3JlcGVhdGVkX2ZpZWxkLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYycgb2JqZWN0PSdyZXBlYXRlZF9maWVsZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcmVwZWF0ZWRfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCisKK3dpcmVfZm9ybWF0X2xpdGUubG86IGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgd2lyZV9mb3JtYXRfbGl0ZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvd2lyZV9mb3JtYXRfbGl0ZS5UcG8gLWMgLW8gd2lyZV9mb3JtYXRfbGl0ZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS93aXJlX2Zvcm1hdF9saXRlLlRwbyAkKERFUERJUikvd2lyZV9mb3JtYXRfbGl0ZS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYycgb2JqZWN0PSd3aXJlX2Zvcm1hdF9saXRlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB3aXJlX2Zvcm1hdF9saXRlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MKKworY29kZWRfc3RyZWFtLmxvOiBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgY29kZWRfc3RyZWFtLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9jb2RlZF9zdHJlYW0uVHBvIC1jIC1vIGNvZGVkX3N0cmVhbS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvY29kZWRfc3RyZWFtLlRwbyAkKERFUERJUikvY29kZWRfc3RyZWFtLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MnIG9iamVjdD0nY29kZWRfc3RyZWFtLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBjb2RlZF9zdHJlYW0ubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MKKworemVyb19jb3B5X3N0cmVhbS5sbzogZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCB6ZXJvX2NvcHlfc3RyZWFtLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtLlRwbyAtYyAtbyB6ZXJvX2NvcHlfc3RyZWFtLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3plcm9fY29weV9zdHJlYW0uVHBvICQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjJyBvYmplY3Q9J3plcm9fY29weV9zdHJlYW0ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHplcm9fY29weV9zdHJlYW0ubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYworCit6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5sbzogZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLlRwbyAtYyAtbyB6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLlRwbyAkKERFUERJUikvemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjJyBvYmplY3Q9J3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKKworc3RydXRpbC5sbzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBzdHJ1dGlsLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHJ1dGlsLlRwbyAtYyAtbyBzdHJ1dGlsLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N0cnV0aWwuVHBvICQoREVQRElSKS9zdHJ1dGlsLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjJyBvYmplY3Q9J3N0cnV0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHN0cnV0aWwubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYworCitzdWJzdGl0dXRlLmxvOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHN1YnN0aXR1dGUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N1YnN0aXR1dGUuVHBvIC1jIC1vIHN1YnN0aXR1dGUubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3Vic3RpdHV0ZS5UcG8gJChERVBESVIpL3N1YnN0aXR1dGUuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MnIG9iamVjdD0nc3Vic3RpdHV0ZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc3Vic3RpdHV0ZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjCisKK3N0cnVjdHVyYWxseV92YWxpZC5sbzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHN0cnVjdHVyYWxseV92YWxpZC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3RydWN0dXJhbGx5X3ZhbGlkLlRwbyAtYyAtbyBzdHJ1Y3R1cmFsbHlfdmFsaWQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N0cnVjdHVyYWxseV92YWxpZC5UcG8gJChERVBESVIpL3N0cnVjdHVyYWxseV92YWxpZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjJyBvYmplY3Q9J3N0cnVjdHVyYWxseV92YWxpZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc3RydWN0dXJhbGx5X3ZhbGlkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjCisKK2Rlc2NyaXB0b3IubG86IGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZGVzY3JpcHRvci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvZGVzY3JpcHRvci5UcG8gLWMgLW8gZGVzY3JpcHRvci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9kZXNjcmlwdG9yLlRwbyAkKERFUERJUikvZGVzY3JpcHRvci5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYycgb2JqZWN0PSdkZXNjcmlwdG9yLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBkZXNjcmlwdG9yLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MKKworZGVzY3JpcHRvci5wYi5sbzogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBkZXNjcmlwdG9yLnBiLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9kZXNjcmlwdG9yLnBiLlRwbyAtYyAtbyBkZXNjcmlwdG9yLnBiLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2Rlc2NyaXB0b3IucGIuVHBvICQoREVQRElSKS9kZXNjcmlwdG9yLnBiLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjJyBvYmplY3Q9J2Rlc2NyaXB0b3IucGIubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGRlc2NyaXB0b3IucGIubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYworCitkZXNjcmlwdG9yX2RhdGFiYXNlLmxvOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGRlc2NyaXB0b3JfZGF0YWJhc2UubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2Rlc2NyaXB0b3JfZGF0YWJhc2UuVHBvIC1jIC1vIGRlc2NyaXB0b3JfZGF0YWJhc2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZGVzY3JpcHRvcl9kYXRhYmFzZS5UcG8gJChERVBESVIpL2Rlc2NyaXB0b3JfZGF0YWJhc2UuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MnIG9iamVjdD0nZGVzY3JpcHRvcl9kYXRhYmFzZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZGVzY3JpcHRvcl9kYXRhYmFzZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjCisKK2R5bmFtaWNfbWVzc2FnZS5sbzogZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGR5bmFtaWNfbWVzc2FnZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvZHluYW1pY19tZXNzYWdlLlRwbyAtYyAtbyBkeW5hbWljX21lc3NhZ2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2R5bmFtaWNfbWVzc2FnZS5UcG8gJChERVBESVIpL2R5bmFtaWNfbWVzc2FnZS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjJyBvYmplY3Q9J2R5bmFtaWNfbWVzc2FnZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZHluYW1pY19tZXNzYWdlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjCisKK2V4dGVuc2lvbl9zZXRfaGVhdnkubG86IGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZXh0ZW5zaW9uX3NldF9oZWF2eS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvZXh0ZW5zaW9uX3NldF9oZWF2eS5UcG8gLWMgLW8gZXh0ZW5zaW9uX3NldF9oZWF2eS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9leHRlbnNpb25fc2V0X2hlYXZ5LlRwbyAkKERFUERJUikvZXh0ZW5zaW9uX3NldF9oZWF2eS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYycgb2JqZWN0PSdleHRlbnNpb25fc2V0X2hlYXZ5LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBleHRlbnNpb25fc2V0X2hlYXZ5LmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MKKworZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5sbzogZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLlRwbyAtYyAtbyBnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uVHBvICQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjJyBvYmplY3Q9J2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24ubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYworCittZXNzYWdlLmxvOiBnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG1lc3NhZ2UubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL21lc3NhZ2UuVHBvIC1jIC1vIG1lc3NhZ2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbWVzc2FnZS5UcG8gJChERVBESVIpL21lc3NhZ2UuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MnIG9iamVjdD0nbWVzc2FnZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gbWVzc2FnZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjCisKK3JlZmxlY3Rpb25fb3BzLmxvOiBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCByZWZsZWN0aW9uX29wcy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvcmVmbGVjdGlvbl9vcHMuVHBvIC1jIC1vIHJlZmxlY3Rpb25fb3BzLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcmVmbGVjdGlvbl9vcHMuVHBvICQoREVQRElSKS9yZWZsZWN0aW9uX29wcy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MnIG9iamVjdD0ncmVmbGVjdGlvbl9vcHMubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHJlZmxlY3Rpb25fb3BzLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5jYworCitzZXJ2aWNlLmxvOiBnb29nbGUvcHJvdG9idWYvc2VydmljZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHNlcnZpY2UubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3NlcnZpY2UuVHBvIC1jIC1vIHNlcnZpY2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc2VydmljZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc2VydmljZS5UcG8gJChERVBESVIpL3NlcnZpY2UuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MnIG9iamVjdD0nc2VydmljZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc2VydmljZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmNjCisKK3RleHRfZm9ybWF0LmxvOiBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCB0ZXh0X2Zvcm1hdC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvdGV4dF9mb3JtYXQuVHBvIC1jIC1vIHRleHRfZm9ybWF0LmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvdGV4dF9mb3JtYXQuVHBvICQoREVQRElSKS90ZXh0X2Zvcm1hdC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MnIG9iamVjdD0ndGV4dF9mb3JtYXQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHRleHRfZm9ybWF0LmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYworCit1bmtub3duX2ZpZWxkX3NldC5sbzogZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgdW5rbm93bl9maWVsZF9zZXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Vua25vd25fZmllbGRfc2V0LlRwbyAtYyAtbyB1bmtub3duX2ZpZWxkX3NldC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Vua25vd25fZmllbGRfc2V0LlRwbyAkKERFUERJUikvdW5rbm93bl9maWVsZF9zZXQuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjJyBvYmplY3Q9J3Vua25vd25fZmllbGRfc2V0LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB1bmtub3duX2ZpZWxkX3NldC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKKword2lyZV9mb3JtYXQubG86IGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHdpcmVfZm9ybWF0LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS93aXJlX2Zvcm1hdC5UcG8gLWMgLW8gd2lyZV9mb3JtYXQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS93aXJlX2Zvcm1hdC5UcG8gJChERVBESVIpL3dpcmVfZm9ybWF0LlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYycgb2JqZWN0PSd3aXJlX2Zvcm1hdC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gd2lyZV9mb3JtYXQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjCisKK2d6aXBfc3RyZWFtLmxvOiBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnemlwX3N0cmVhbS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3ppcF9zdHJlYW0uVHBvIC1jIC1vIGd6aXBfc3RyZWFtLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3ppcF9zdHJlYW0uVHBvICQoREVQRElSKS9nemlwX3N0cmVhbS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MnIG9iamVjdD0nZ3ppcF9zdHJlYW0ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGd6aXBfc3RyZWFtLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYworCitwcmludGVyLmxvOiBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByaW50ZXIubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3ByaW50ZXIuVHBvIC1jIC1vIHByaW50ZXIubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJpbnRlci5UcG8gJChERVBESVIpL3ByaW50ZXIuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MnIG9iamVjdD0ncHJpbnRlci5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJpbnRlci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjCisKK3Rva2VuaXplci5sbzogZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHRva2VuaXplci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvdG9rZW5pemVyLlRwbyAtYyAtbyB0b2tlbml6ZXIubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Rva2VuaXplci5UcG8gJChERVBESVIpL3Rva2VuaXplci5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjJyBvYmplY3Q9J3Rva2VuaXplci5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gdG9rZW5pemVyLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjCisKK3plcm9fY29weV9zdHJlYW1faW1wbC5sbzogZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHplcm9fY29weV9zdHJlYW1faW1wbC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvemVyb19jb3B5X3N0cmVhbV9pbXBsLlRwbyAtYyAtbyB6ZXJvX2NvcHlfc3RyZWFtX2ltcGwubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbC5UcG8gJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjJyBvYmplY3Q9J3plcm9fY29weV9zdHJlYW1faW1wbC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gemVyb19jb3B5X3N0cmVhbV9pbXBsLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjCisKK2ltcG9ydGVyLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBpbXBvcnRlci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvaW1wb3J0ZXIuVHBvIC1jIC1vIGltcG9ydGVyLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvaW1wb3J0ZXIuVHBvICQoREVQRElSKS9pbXBvcnRlci5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MnIG9iamVjdD0naW1wb3J0ZXIubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGltcG9ydGVyLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYworCitwYXJzZXIubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwYXJzZXIubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3BhcnNlci5UcG8gLWMgLW8gcGFyc2VyLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wYXJzZXIuVHBvICQoREVQRElSKS9wYXJzZXIuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYycgb2JqZWN0PSdwYXJzZXIubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHBhcnNlci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYworCitjb2RlX2dlbmVyYXRvci5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgY29kZV9nZW5lcmF0b3IubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2NvZGVfZ2VuZXJhdG9yLlRwbyAtYyAtbyBjb2RlX2dlbmVyYXRvci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2NvZGVfZ2VuZXJhdG9yLlRwbyAkKERFUERJUikvY29kZV9nZW5lcmF0b3IuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J2NvZGVfZ2VuZXJhdG9yLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBjb2RlX2dlbmVyYXRvci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MKKworY29tbWFuZF9saW5lX2ludGVyZmFjZS5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLlRwbyAtYyAtbyBjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuVHBvICQoREVQRElSKS9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjJyBvYmplY3Q9J2NvbW1hbmRfbGluZV9pbnRlcmZhY2UubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGNvbW1hbmRfbGluZV9pbnRlcmZhY2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYworCitwbHVnaW4ubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwbHVnaW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3BsdWdpbi5UcG8gLWMgLW8gcGx1Z2luLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wbHVnaW4uVHBvICQoREVQRElSKS9wbHVnaW4uUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYycgb2JqZWN0PSdwbHVnaW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHBsdWdpbi5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYworCitwbHVnaW4ucGIubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwbHVnaW4ucGIubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3BsdWdpbi5wYi5UcG8gLWMgLW8gcGx1Z2luLnBiLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wbHVnaW4ucGIuVHBvICQoREVQRElSKS9wbHVnaW4ucGIuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYycgb2JqZWN0PSdwbHVnaW4ucGIubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHBsdWdpbi5wYi5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYworCitzdWJwcm9jZXNzLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHN1YnByb2Nlc3MubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N1YnByb2Nlc3MuVHBvIC1jIC1vIHN1YnByb2Nlc3MubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3VicHJvY2Vzcy5UcG8gJChERVBESVIpL3N1YnByb2Nlc3MuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MnIG9iamVjdD0nc3VicHJvY2Vzcy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gc3VicHJvY2Vzcy5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmNjCisKK3ppcF93cml0ZXIubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgemlwX3dyaXRlci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvemlwX3dyaXRlci5UcG8gLWMgLW8gemlwX3dyaXRlci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS96aXBfd3JpdGVyLlRwbyAkKERFUERJUikvemlwX3dyaXRlci5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYycgb2JqZWN0PSd6aXBfd3JpdGVyLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB6aXBfd3JpdGVyLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MKKworY3BwX2VudW0ubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBjcHBfZW51bS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvY3BwX2VudW0uVHBvIC1jIC1vIGNwcF9lbnVtLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9jcHBfZW51bS5UcG8gJChERVBESVIpL2NwcF9lbnVtLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MnIG9iamVjdD0nY3BwX2VudW0ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGNwcF9lbnVtLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjCisKK2NwcF9lbnVtX2ZpZWxkLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgY3BwX2VudW1fZmllbGQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2NwcF9lbnVtX2ZpZWxkLlRwbyAtYyAtbyBjcHBfZW51bV9maWVsZC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvY3BwX2VudW1fZmllbGQuVHBvICQoREVQRElSKS9jcHBfZW51bV9maWVsZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjJyBvYmplY3Q9J2NwcF9lbnVtX2ZpZWxkLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBjcHBfZW51bV9maWVsZC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYworCitjcHBfZXh0ZW5zaW9uLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBjcHBfZXh0ZW5zaW9uLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9jcHBfZXh0ZW5zaW9uLlRwbyAtYyAtbyBjcHBfZXh0ZW5zaW9uLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvY3BwX2V4dGVuc2lvbi5UcG8gJChERVBESVIpL2NwcF9leHRlbnNpb24uUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmNjJyBvYmplY3Q9J2NwcF9leHRlbnNpb24ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGNwcF9leHRlbnNpb24ubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmNjCisKK2NwcF9maWVsZC5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBjcHBfZmllbGQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2NwcF9maWVsZC5UcG8gLWMgLW8gY3BwX2ZpZWxkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2NwcF9maWVsZC5UcG8gJChERVBESVIpL2NwcF9maWVsZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYycgb2JqZWN0PSdjcHBfZmllbGQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGNwcF9maWVsZC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmNjCisKK2NwcF9maWxlLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgY3BwX2ZpbGUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2NwcF9maWxlLlRwbyAtYyAtbyBjcHBfZmlsZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvY3BwX2ZpbGUuVHBvICQoREVQRElSKS9jcHBfZmlsZS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjJyBvYmplY3Q9J2NwcF9maWxlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBjcHBfZmlsZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5jYworCitjcHBfZ2VuZXJhdG9yLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBjcHBfZ2VuZXJhdG9yLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9jcHBfZ2VuZXJhdG9yLlRwbyAtYyAtbyBjcHBfZ2VuZXJhdG9yLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvY3BwX2dlbmVyYXRvci5UcG8gJChERVBESVIpL2NwcF9nZW5lcmF0b3IuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J2NwcF9nZW5lcmF0b3IubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGNwcF9nZW5lcmF0b3IubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjCisKK2NwcF9oZWxwZXJzLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgY3BwX2hlbHBlcnMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2NwcF9oZWxwZXJzLlRwbyAtYyAtbyBjcHBfaGVscGVycy5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvY3BwX2hlbHBlcnMuVHBvICQoREVQRElSKS9jcHBfaGVscGVycy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjJyBvYmplY3Q9J2NwcF9oZWxwZXJzLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBjcHBfaGVscGVycy5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYworCitjcHBfbWVzc2FnZS5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGNwcF9tZXNzYWdlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9jcHBfbWVzc2FnZS5UcG8gLWMgLW8gY3BwX21lc3NhZ2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2NwcF9tZXNzYWdlLlRwbyAkKERFUERJUikvY3BwX21lc3NhZ2UuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYycgb2JqZWN0PSdjcHBfbWVzc2FnZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gY3BwX21lc3NhZ2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MKKworY3BwX21lc3NhZ2VfZmllbGQubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBjcHBfbWVzc2FnZV9maWVsZC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvY3BwX21lc3NhZ2VfZmllbGQuVHBvIC1jIC1vIGNwcF9tZXNzYWdlX2ZpZWxkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9jcHBfbWVzc2FnZV9maWVsZC5UcG8gJChERVBESVIpL2NwcF9tZXNzYWdlX2ZpZWxkLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MnIG9iamVjdD0nY3BwX21lc3NhZ2VfZmllbGQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGNwcF9tZXNzYWdlX2ZpZWxkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjCisKK2NwcF9wcmltaXRpdmVfZmllbGQubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGNwcF9wcmltaXRpdmVfZmllbGQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2NwcF9wcmltaXRpdmVfZmllbGQuVHBvIC1jIC1vIGNwcF9wcmltaXRpdmVfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9jcHBfcHJpbWl0aXZlX2ZpZWxkLlRwbyAkKERFUERJUikvY3BwX3ByaW1pdGl2ZV9maWVsZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MnIG9iamVjdD0nY3BwX3ByaW1pdGl2ZV9maWVsZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gY3BwX3ByaW1pdGl2ZV9maWVsZC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MKKworY3BwX3NlcnZpY2UubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBjcHBfc2VydmljZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvY3BwX3NlcnZpY2UuVHBvIC1jIC1vIGNwcF9zZXJ2aWNlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9jcHBfc2VydmljZS5UcG8gJChERVBESVIpL2NwcF9zZXJ2aWNlLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MnIG9iamVjdD0nY3BwX3NlcnZpY2UubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGNwcF9zZXJ2aWNlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjCisKK2NwcF9zdHJpbmdfZmllbGQubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGNwcF9zdHJpbmdfZmllbGQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2NwcF9zdHJpbmdfZmllbGQuVHBvIC1jIC1vIGNwcF9zdHJpbmdfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9jcHBfc3RyaW5nX2ZpZWxkLlRwbyAkKERFUERJUikvY3BwX3N0cmluZ19maWVsZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MnIG9iamVjdD0nY3BwX3N0cmluZ19maWVsZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gY3BwX3N0cmluZ19maWVsZC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MKKworamF2YV9lbnVtLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBqYXZhX2VudW0ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2phdmFfZW51bS5UcG8gLWMgLW8gamF2YV9lbnVtLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvamF2YV9lbnVtLlRwbyAkKERFUERJUikvamF2YV9lbnVtLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYycgb2JqZWN0PSdqYXZhX2VudW0ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGphdmFfZW51bS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MKKworamF2YV9lbnVtX2ZpZWxkLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBqYXZhX2VudW1fZmllbGQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2phdmFfZW51bV9maWVsZC5UcG8gLWMgLW8gamF2YV9lbnVtX2ZpZWxkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvamF2YV9lbnVtX2ZpZWxkLlRwbyAkKERFUERJUikvamF2YV9lbnVtX2ZpZWxkLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYycgb2JqZWN0PSdqYXZhX2VudW1fZmllbGQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGphdmFfZW51bV9maWVsZC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MKKworamF2YV9leHRlbnNpb24ubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgamF2YV9leHRlbnNpb24ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2phdmFfZXh0ZW5zaW9uLlRwbyAtYyAtbyBqYXZhX2V4dGVuc2lvbi5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9qYXZhX2V4dGVuc2lvbi5UcG8gJChERVBESVIpL2phdmFfZXh0ZW5zaW9uLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjJyBvYmplY3Q9J2phdmFfZXh0ZW5zaW9uLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBqYXZhX2V4dGVuc2lvbi5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCisKK2phdmFfZmllbGQubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBqYXZhX2ZpZWxkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9qYXZhX2ZpZWxkLlRwbyAtYyAtbyBqYXZhX2ZpZWxkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9qYXZhX2ZpZWxkLlRwbyAkKERFUERJUikvamF2YV9maWVsZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjJyBvYmplY3Q9J2phdmFfZmllbGQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGphdmFfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MKKworamF2YV9maWxlLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBqYXZhX2ZpbGUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2phdmFfZmlsZS5UcG8gLWMgLW8gamF2YV9maWxlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvamF2YV9maWxlLlRwbyAkKERFUERJUikvamF2YV9maWxlLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5jYycgb2JqZWN0PSdqYXZhX2ZpbGUubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGphdmFfZmlsZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKKworamF2YV9nZW5lcmF0b3IubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgamF2YV9nZW5lcmF0b3IubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2phdmFfZ2VuZXJhdG9yLlRwbyAtYyAtbyBqYXZhX2dlbmVyYXRvci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9qYXZhX2dlbmVyYXRvci5UcG8gJChERVBESVIpL2phdmFfZ2VuZXJhdG9yLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J2phdmFfZ2VuZXJhdG9yLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBqYXZhX2dlbmVyYXRvci5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjCisKK2phdmFfaGVscGVycy5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgamF2YV9oZWxwZXJzLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9qYXZhX2hlbHBlcnMuVHBvIC1jIC1vIGphdmFfaGVscGVycy5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2phdmFfaGVscGVycy5UcG8gJChERVBESVIpL2phdmFfaGVscGVycy5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MnIG9iamVjdD0namF2YV9oZWxwZXJzLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBqYXZhX2hlbHBlcnMubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjCisKK2phdmFfbWVzc2FnZS5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgamF2YV9tZXNzYWdlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9qYXZhX21lc3NhZ2UuVHBvIC1jIC1vIGphdmFfbWVzc2FnZS5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2phdmFfbWVzc2FnZS5UcG8gJChERVBESVIpL2phdmFfbWVzc2FnZS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MnIG9iamVjdD0namF2YV9tZXNzYWdlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBqYXZhX21lc3NhZ2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjCisKK2phdmFfbWVzc2FnZV9maWVsZC5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgamF2YV9tZXNzYWdlX2ZpZWxkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9qYXZhX21lc3NhZ2VfZmllbGQuVHBvIC1jIC1vIGphdmFfbWVzc2FnZV9maWVsZC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2phdmFfbWVzc2FnZV9maWVsZC5UcG8gJChERVBESVIpL2phdmFfbWVzc2FnZV9maWVsZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MnIG9iamVjdD0namF2YV9tZXNzYWdlX2ZpZWxkLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChMSUJUT09MKSAgLS10YWc9Q1hYICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBqYXZhX21lc3NhZ2VfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmNjCisKK2phdmFfcHJpbWl0aXZlX2ZpZWxkLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGphdmFfcHJpbWl0aXZlX2ZpZWxkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5UcG8gLWMgLW8gamF2YV9wcmltaXRpdmVfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvamF2YV9wcmltaXRpdmVfZmllbGQuVHBvICQoREVQRElSKS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYycgb2JqZWN0PSdqYXZhX3ByaW1pdGl2ZV9maWVsZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gamF2YV9wcmltaXRpdmVfZmllbGQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYworCitqYXZhX3NlcnZpY2UubG86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGphdmFfc2VydmljZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvamF2YV9zZXJ2aWNlLlRwbyAtYyAtbyBqYXZhX3NlcnZpY2UubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9qYXZhX3NlcnZpY2UuVHBvICQoREVQRElSKS9qYXZhX3NlcnZpY2UuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjJyBvYmplY3Q9J2phdmFfc2VydmljZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gamF2YV9zZXJ2aWNlLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYworCitqYXZhX3N0cmluZ19maWVsZC5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBqYXZhX3N0cmluZ19maWVsZC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvamF2YV9zdHJpbmdfZmllbGQuVHBvIC1jIC1vIGphdmFfc3RyaW5nX2ZpZWxkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2phdmFfc3RyaW5nX2ZpZWxkLlRwbyAkKERFUERJUikvamF2YV9zdHJpbmdfZmllbGQuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MnIG9iamVjdD0namF2YV9zdHJpbmdfZmllbGQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGphdmFfc3RyaW5nX2ZpZWxkLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKKworamF2YV9kb2NfY29tbWVudC5sbzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGphdmFfZG9jX2NvbW1lbnQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2phdmFfZG9jX2NvbW1lbnQuVHBvIC1jIC1vIGphdmFfZG9jX2NvbW1lbnQubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2phdmFfZG9jX2NvbW1lbnQuVHBvICQoREVQRElSKS9qYXZhX2RvY19jb21tZW50LlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuY2MnIG9iamVjdD0namF2YV9kb2NfY29tbWVudC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoTElCVE9PTCkgIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gamF2YV9kb2NfY29tbWVudC5sbyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5jYworCitweXRob25fZ2VuZXJhdG9yLmxvOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBweXRob25fZ2VuZXJhdG9yLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9weXRob25fZ2VuZXJhdG9yLlRwbyAtYyAtbyBweXRob25fZ2VuZXJhdG9yLmxvIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHl0aG9uX2dlbmVyYXRvci5UcG8gJChERVBESVIpL3B5dGhvbl9nZW5lcmF0b3IuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J3B5dGhvbl9nZW5lcmF0b3IubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKExJQlRPT0wpICAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHB5dGhvbl9nZW5lcmF0b3IubG8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MnOyBmaWAKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBmaWAKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgZmlgCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUubzogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5UcG8gLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLm9iajogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjCisKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJzsgZmlgCisKK3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MnOyBmaWAKKworcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyAtYyAtbyBwcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgb2JqZWN0PSdwcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCisKK3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vYmo6IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUuVHBvIC1jIC1vIHByb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJyBvYmplY3Q9J3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGZpYAorCitwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCisKK3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZmlgCisKK3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworCitwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBmaWAKKworcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKKworcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LW9uY2VfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb25jZV91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3Qtb25jZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1vbmNlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LW9uY2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb25jZV91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb25jZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3Qtb25jZV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3Qtb25jZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXN0cnV0aWxfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cnV0aWxfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV90cmFpdHNfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdHlwZV90cmFpdHNfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV90cmFpdHNfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdHlwZV90cmFpdHNfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC10eXBlX3RyYWl0c191bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdHlwZV90cmFpdHNfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX3RyYWl0c191bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXR5cGVfdHJhaXRzX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC10eXBlX3RyYWl0c191bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LW1lc3NhZ2VfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LW1lc3NhZ2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jb2RlZF9zdHJlYW1fdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1jb2RlZF9zdHJlYW1fdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC10b2tlbml6ZXJfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC10b2tlbml6ZXJfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXplcm9fY29weV9zdHJlYW1fdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXplcm9fY29weV9zdHJlYW1fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKKworcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3Iub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWNwcF9ib290c3RyYXBfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF9ib290c3RyYXBfdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWNwcF9ib290c3RyYXBfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF9ib290c3RyYXBfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF9ib290c3RyYXBfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgZmlgCisKK3Byb3RvYnVmX3Rlc3QtY3BwX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtY3BwX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNwcF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LWNwcF91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWNwcF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKKworcHJvdG9idWZfdGVzdC1jcHBfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWNwcF91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNwcF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtY3BwX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1jcHBfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MnOyBmaWAKKworcHJvdG9idWZfdGVzdC1jcHBfcGx1Z2luX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWNwcF9wbHVnaW5fdW5pdHRlc3QubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfcGx1Z2luX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWNwcF9wbHVnaW5fdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3BsdWdpbl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3BsdWdpbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LWNwcF9wbHVnaW5fdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1jcHBfcGx1Z2luX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtY3BwX3BsdWdpbl91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWNwcF9wbHVnaW5fdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF9wbHVnaW5fdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtY3BwX3BsdWdpbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfcGx1Z2luX3VuaXR0ZXN0LlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfcGx1Z2luX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtY3BwX3BsdWdpbl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtY3BwX3BsdWdpbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWphdmFfcGx1Z2luX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcGx1Z2luX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtamF2YV9wbHVnaW5fdW5pdHRlc3QubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1qYXZhX3BsdWdpbl91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1qYXZhX3BsdWdpbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9wbHVnaW5fdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWphdmFfcGx1Z2luX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1qYXZhX3BsdWdpbl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWphdmFfcGx1Z2luX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcGx1Z2luX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LWphdmFfcGx1Z2luX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1qYXZhX3BsdWdpbl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9wbHVnaW5fdW5pdHRlc3QuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtamF2YV9wbHVnaW5fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9wbHVnaW5fdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWphdmFfcGx1Z2luX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1qYXZhX3BsdWdpbl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtamF2YV9wbHVnaW5fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MnOyBmaWAKKworcHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWphdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJzsgZmlgCisKK3Byb3RvYnVmX3Rlc3QtcHl0aG9uX3BsdWdpbl91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1weXRob25fcGx1Z2luX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHl0aG9uX3BsdWdpbl91bml0dGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1weXRob25fcGx1Z2luX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXB5dGhvbl9wbHVnaW5fdW5pdHRlc3QuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXB5dGhvbl9wbHVnaW5fdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1weXRob25fcGx1Z2luX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtcHl0aG9uX3BsdWdpbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYworCitwcm90b2J1Zl90ZXN0LXB5dGhvbl9wbHVnaW5fdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1weXRob25fcGx1Z2luX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1weXRob25fcGx1Z2luX3VuaXR0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXB5dGhvbl9wbHVnaW5fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHl0aG9uX3BsdWdpbl91bml0dGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHl0aG9uX3BsdWdpbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXB5dGhvbl9wbHVnaW5fdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXB5dGhvbl9wbHVnaW5fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MnOyBmaWAKKworcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwubzogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC10ZXN0X3V0aWwubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYworCitwcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5vYmo6IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBmaWAKKworcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCisKK3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0LlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgZmlgCisKK3Byb3RvYnVmX3Rlc3QtZmlsZS5vOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtZmlsZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtZmlsZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtZmlsZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LWZpbGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworCitwcm90b2J1Zl90ZXN0LWZpbGUub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtZmlsZS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmlsZS5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtZmlsZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKKworcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCisKK3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCisKK3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MKKworcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXQucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKKworcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjCisKK3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCisKK3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuVHBvIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuVHBvICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKKworcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlRwbyAtYyAtbyBwcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJyBvYmplY3Q9J3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGZpYAorCitwcm90b2J1Zl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBwcm90b2J1Zl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5UcG8gJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnIG9iamVjdD0ncHJvdG9idWZfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gcHJvdG9idWZfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjCisKK3Byb3RvYnVmX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgcHJvdG9idWZfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5UcG8gLWMgLW8gcHJvdG9idWZfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyAkKERFUERJUikvcHJvdG9idWZfdGVzdC1jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgb2JqZWN0PSdwcm90b2J1Zl90ZXN0LWNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHByb3RvYnVmX3Rlc3QtY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJzsgZmlgCisKK21haW4ubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBtYWluLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21haW4uVHBvIC1jIC1vIG1haW4ubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9tYWluLlRwbyAkKERFUERJUikvbWFpbi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjJyBvYmplY3Q9J21haW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBtYWluLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYworCittYWluLm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBtYWluLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbWFpbi5UcG8gLWMgLW8gbWFpbi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbWFpbi5UcG8gJChERVBESVIpL21haW4uUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYycgb2JqZWN0PSdtYWluLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBtYWluLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjJzsgZmlgCisKK3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCB0ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IuVHBvIC1jIC1vIHRlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLlRwbyAkKERFUERJUikvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB0ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYworCit0ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCB0ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5UcG8gLWMgLW8gdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5UcG8gJChERVBESVIpL3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYycgb2JqZWN0PSd0ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB0ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgZmlgCisKK3Rlc3RfcGx1Z2luLWZpbGUubzogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHRlc3RfcGx1Z2luLWZpbGUubyAtTUQgLU1QIC1NRiAkKERFUERJUikvdGVzdF9wbHVnaW4tZmlsZS5UcG8gLWMgLW8gdGVzdF9wbHVnaW4tZmlsZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlRwbyAkKERFUERJUikvdGVzdF9wbHVnaW4tZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnIG9iamVjdD0ndGVzdF9wbHVnaW4tZmlsZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHRlc3RfcGx1Z2luLWZpbGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworCit0ZXN0X3BsdWdpbi1maWxlLm9iajogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHRlc3RfcGx1Z2luLWZpbGUub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlRwbyAtYyAtbyB0ZXN0X3BsdWdpbi1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlRwbyAkKERFUERJUikvdGVzdF9wbHVnaW4tZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnIG9iamVjdD0ndGVzdF9wbHVnaW4tZmlsZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gdGVzdF9wbHVnaW4tZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGZpYAorCit0ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCB0ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5UcG8gLWMgLW8gdGVzdF9wbHVnaW4tdGVzdF9wbHVnaW4ubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlRwbyAkKERFUERJUikvdGVzdF9wbHVnaW4tdGVzdF9wbHVnaW4uUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MnIG9iamVjdD0ndGVzdF9wbHVnaW4tdGVzdF9wbHVnaW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB0ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYworCit0ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHRlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvdGVzdF9wbHVnaW4tdGVzdF9wbHVnaW4uVHBvIC1jIC1vIHRlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5UcG8gJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJyBvYmplY3Q9J3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyB0ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYyc7IGZpYAorCit6Y2d1bnppcC5vOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHpjZ3VuemlwLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3pjZ3VuemlwLlRwbyAtYyAtbyB6Y2d1bnppcC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3pjZ3VuemlwLlRwbyAkKERFUERJUikvemNndW56aXAuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYycgb2JqZWN0PSd6Y2d1bnppcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHpjZ3VuemlwLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYworCit6Y2d1bnppcC5vYmo6IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgemNndW56aXAub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS96Y2d1bnppcC5UcG8gLWMgLW8gemNndW56aXAub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3pjZ3VuemlwLlRwbyAkKERFUERJUikvemNndW56aXAuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYycgb2JqZWN0PSd6Y2d1bnppcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gemNndW56aXAub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MnOyBmaWAKKworemNnemlwLm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIHpjZ3ppcC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS96Y2d6aXAuVHBvIC1jIC1vIHpjZ3ppcC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvemNnemlwLlRwbyAkKERFUERJUikvemNnemlwLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjJyBvYmplY3Q9J3pjZ3ppcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIHpjZ3ppcC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYworCit6Y2d6aXAub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCB6Y2d6aXAub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS96Y2d6aXAuVHBvIC1jIC1vIHpjZ3ppcC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvemNnemlwLlRwbyAkKERFUERJUikvemNnemlwLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjJyBvYmplY3Q9J3pjZ3ppcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gemNnemlwLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjJzsgZmlgCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCitpbnN0YWxsLW5vYmFzZV9kaXN0X3Byb3RvREFUQTogJChub2Jhc2VfZGlzdF9wcm90b19EQVRBKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQocHJvdG9kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChwcm90b2RpcikiCisJQGxpc3Q9JyQobm9iYXNlX2Rpc3RfcHJvdG9fREFUQSknOyB0ZXN0IC1uICIkKHByb3RvZGlyKSIgfHwgbGlzdD07IFwKKwkkKGFtX19ub2Jhc2VfbGlzdCkgfCB3aGlsZSByZWFkIGRpciBmaWxlczsgZG8gXAorCSAgeGZpbGVzPTsgZm9yIGZpbGUgaW4gJCRmaWxlczsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGZpbGUiOyB0aGVuIHhmaWxlcz0iJCR4ZmlsZXMgJCRmaWxlIjsgXAorCSAgICBlbHNlIHhmaWxlcz0iJCR4ZmlsZXMgJChzcmNkaXIpLyQkZmlsZSI7IGZpOyBkb25lOyBcCisJICB0ZXN0IC16ICIkJHhmaWxlcyIgfHwgeyBcCisJICAgIHRlc3QgIngkJGRpciIgPSB4LiB8fCB7IFwKKwkgICAgICBlY2hvICIkKE1LRElSX1ApICckKERFU1RESVIpJChwcm90b2RpcikvJCRkaXInIjsgXAorCSAgICAgICQoTUtESVJfUCkgIiQoREVTVERJUikkKHByb3RvZGlyKS8kJGRpciI7IH07IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJHhmaWxlcyAnJChERVNURElSKSQocHJvdG9kaXIpLyQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkeGZpbGVzICIkKERFU1RESVIpJChwcm90b2RpcikvJCRkaXIiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZQorCit1bmluc3RhbGwtbm9iYXNlX2Rpc3RfcHJvdG9EQVRBOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobm9iYXNlX2Rpc3RfcHJvdG9fREFUQSknOyB0ZXN0IC1uICIkKHByb3RvZGlyKSIgfHwgbGlzdD07IFwKKwkkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBmaWxlcz1gJChhbV9fbm9iYXNlX3N0cmlwKWA7IFwKKwlkaXI9JyQoREVTVERJUikkKHByb3RvZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKK2luc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTOiAkKG5vYmFzZV9pbmNsdWRlX0hFQURFUlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChpbmNsdWRlZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoaW5jbHVkZWRpcikiCisJQGxpc3Q9JyQobm9iYXNlX2luY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAorCSQoYW1fX25vYmFzZV9saXN0KSB8IHdoaWxlIHJlYWQgZGlyIGZpbGVzOyBkbyBcCisJICB4ZmlsZXM9OyBmb3IgZmlsZSBpbiAkJGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkZmlsZSI7IHRoZW4geGZpbGVzPSIkJHhmaWxlcyAkJGZpbGUiOyBcCisJICAgIGVsc2UgeGZpbGVzPSIkJHhmaWxlcyAkKHNyY2RpcikvJCRmaWxlIjsgZmk7IGRvbmU7IFwKKwkgIHRlc3QgLXogIiQkeGZpbGVzIiB8fCB7IFwKKwkgICAgdGVzdCAieCQkZGlyIiA9IHguIHx8IHsgXAorCSAgICAgIGVjaG8gIiQoTUtESVJfUCkgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpLyQkZGlyJyI7IFwKKwkgICAgICAkKE1LRElSX1ApICIkKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGRpciI7IH07IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9IRUFERVIpICQkeGZpbGVzICckKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9IRUFERVIpICQkeGZpbGVzICIkKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGRpciIgfHwgZXhpdCAkJD87IH07IFwKKwlkb25lCisKK3VuaW5zdGFsbC1ub2Jhc2VfaW5jbHVkZUhFQURFUlM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChub2Jhc2VfaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQoaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCisJJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgZmlsZXM9YCQoYW1fX25vYmFzZV9zdHJpcClgOyBcCisJZGlyPSckKERFU1RESVIpJChpbmNsdWRlZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworY2hlY2stVEVTVFM6ICQoVEVTVFMpCisJQGZhaWxlZD0wOyBhbGw9MDsgeGZhaWw9MDsgeHBhc3M9MDsgc2tpcD0wOyBcCisJc3JjZGlyPSQoc3JjZGlyKTsgZXhwb3J0IHNyY2RpcjsgXAorCWxpc3Q9JyAkKFRFU1RTKSAnOyBcCisJJChhbV9fdHR5X2NvbG9ycyk7IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKKwkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKKwkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKKwkJeHBhc3M9YGV4cHIgJCR4cGFzcyArIDFgOyBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPVhQQVNTOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJY29sPSQkZ3JuOyByZXM9UEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICBlc2FjOyBcCisJICAgIGVsaWYgdGVzdCAkJD8gLW5lIDc3OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhmYWlsPWBleHByICQkeGZhaWwgKyAxYDsgXAorCQljb2w9JCRsZ247IHJlcz1YRkFJTDsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPUZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbHNlIFwKKwkgICAgICBza2lwPWBleHByICQkc2tpcCArIDFgOyBcCisJICAgICAgY29sPSQkYmx1OyByZXM9U0tJUDsgXAorCSAgICBmaTsgXAorCSAgICBlY2hvICIkJHtjb2x9JCRyZXMkJHtzdGR9OiAkJHRzdCI7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIHRlc3QgIiQkYWxsIiAtZXEgMTsgdGhlbiBcCisJICAgIHRlc3RzPSJ0ZXN0IjsgXAorCSAgICBBbGw9IiI7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0cz0idGVzdHMiOyBcCisJICAgIEFsbD0iQWxsICI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAorCSAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMDsgdGhlbiBcCisJICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgcGFzc2VkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMTsgdGhlbiBmYWlsdXJlcz1mYWlsdXJlOyBlbHNlIGZhaWx1cmVzPWZhaWx1cmVzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIGJlaGF2ZWQgYXMgZXhwZWN0ZWQgKCQkeGZhaWwgZXhwZWN0ZWQgJCRmYWlsdXJlcykiOyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBmYWlsZWQiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAxOyB0aGVuIHBhc3Nlcz1wYXNzOyBlbHNlIHBhc3Nlcz1wYXNzZXM7IGZpOyBcCisJICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgJCRwYXNzZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwkgIGRhc2hlcz0iJCRiYW5uZXIiOyBcCisJICBza2lwcGVkPSIiOyBcCisJICBpZiB0ZXN0ICIkJHNraXAiIC1uZSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCRza2lwIiAtZXEgMTsgdGhlbiBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0IHdhcyBub3QgcnVuKSI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0cyB3ZXJlIG5vdCBydW4pIjsgXAorCSAgICBmaTsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHNraXBwZWQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKKwkgICAgICBkYXNoZXM9IiQkc2tpcHBlZCI7IFwKKwkgIGZpOyBcCisJICByZXBvcnQ9IiI7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtbmUgMCAmJiB0ZXN0IC1uICIkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IHRoZW4gXAorCSAgICByZXBvcnQ9IlBsZWFzZSByZXBvcnQgdG8gJChQQUNLQUdFX0JVR1JFUE9SVCkiOyBcCisJICAgIHRlc3QgYGVjaG8gIiQkcmVwb3J0IiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHJlcG9ydCI7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9YGVjaG8gIiQkZGFzaGVzIiB8IHNlZCBzLy4vPS9nYDsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgY29sPSIkJGdybiI7IFwKKwkgIGVsc2UgXAorCSAgICBjb2w9IiQkcmVkIjsgXAorCSAgZmk7IFwKKwkgIGVjaG8gIiQke2NvbH0kJGRhc2hlcyQke3N0ZH0iOyBcCisJICBlY2hvICIkJHtjb2x9JCRiYW5uZXIkJHtzdGR9IjsgXAorCSAgdGVzdCAteiAiJCRza2lwcGVkIiB8fCBlY2hvICIkJHtjb2x9JCRza2lwcGVkJCR7c3RkfSI7IFwKKwkgIHRlc3QgLXogIiQkcmVwb3J0IiB8fCBlY2hvICIkJHtjb2x9JCRyZXBvcnQkJHtzdGR9IjsgXAorCSAgZWNobyAiJCR7Y29sfSQkZGFzaGVzJCR7c3RkfSI7IFwKKwkgIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgXAorCWVsc2UgOjsgZmkKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJChjaGVja19QUk9HUkFNUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1URVNUUworY2hlY2s6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKFBST0dSQU1TKSAkKERBVEEpICQoSEVBREVSUykKK2luc3RhbGwtYmluUFJPR1JBTVM6IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiICIkKERFU1RESVIpJChwcm90b2RpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICAgaW5zdGFsbDsgXAorCWVsc2UgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCisJZmkKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1jaGVja1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgY2xlYW4tbG9jYWwgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbm9iYXNlX2Rpc3RfcHJvdG9EQVRBIFwKKwlpbnN0YWxsLW5vYmFzZV9pbmNsdWRlSEVBREVSUworCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCisJdW5pbnN0YWxsLW5vYmFzZV9kaXN0X3Byb3RvREFUQSBcCisJdW5pbnN0YWxsLW5vYmFzZV9pbmNsdWRlSEVBREVSUworCisuTUFLRTogYWxsIGNoZWNrIGNoZWNrLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1URVNUUyBjaGVjay1hbSBjbGVhbiBcCisJY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIGNsZWFuLWxvY2FsIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtbm9iYXNlX2Rpc3RfcHJvdG9EQVRBIGluc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIFwKKwlwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSBcCisJdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCisJdW5pbnN0YWxsLW5vYmFzZV9kaXN0X3Byb3RvREFUQSBcCisJdW5pbnN0YWxsLW5vYmFzZV9pbmNsdWRlSEVBREVSUworCisKKyMgTm90IHN1cmUgd2h5IHRoZXNlIGRvbid0IGdldCBjbGVhbmVkIGF1dG9tYXRpY2FsbHkuCitjbGVhbi1sb2NhbDoKKwlybSAtZiAqLmxvVAorCitAVVNFX0VYVEVSTkFMX1BST1RPQ19UUlVFQHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbjogJChwcm90b2NfaW5wdXRzKQorQFVTRV9FWFRFUk5BTF9QUk9UT0NfVFJVRUAJJChQUk9UT0MpIC1JJChzcmNkaXIpIC0tY3BwX291dD0uICReCitAVVNFX0VYVEVSTkFMX1BST1RPQ19UUlVFQAl0b3VjaCB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KKworIyBXZSBoYXZlIHRvIGNkIHRvICQoc3JjZGlyKSBiZWZvcmUgZXhlY3V0aW5nIHByb3RvYyBiZWNhdXNlICQocHJvdG9jX2lucHV0cykgaXMKKyMgcmVsYXRpdmUgdG8gc3JjZGlyLCB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGVuCisjIGJ1aWxkaW5nIG91dC1vZi10cmVlLgorQFVTRV9FWFRFUk5BTF9QUk9UT0NfRkFMU0VAdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuOiBwcm90b2MkKEVYRUVYVCkgJChwcm90b2NfaW5wdXRzKQorQFVTRV9FWFRFUk5BTF9QUk9UT0NfRkFMU0VACW9sZHB3ZD1gcHdkYCAmJiAoIGNkICQoc3JjZGlyKSAmJiAkJG9sZHB3ZC9wcm90b2MkKEVYRUVYVCkgLUkuIC0tY3BwX291dD0kJG9sZHB3ZCAkKHByb3RvY19pbnB1dHMpICkKK0BVU0VfRVhURVJOQUxfUFJPVE9DX0ZBTFNFQAl0b3VjaCB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KKworJChwcm90b2Nfb3V0cHV0cyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1YzIzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDgwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK0NvZGVHZW5lcmF0b3I6On5Db2RlR2VuZXJhdG9yKCkge30KK0dlbmVyYXRvckNvbnRleHQ6On5HZW5lcmF0b3JDb250ZXh0KCkge30KKworaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBHZW5lcmF0b3JDb250ZXh0OjpPcGVuRm9ySW5zZXJ0KAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KSB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJUaGlzIEdlbmVyYXRvckNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBpbnNlcnRpb24uIjsKKyAgcmV0dXJuIE5VTEw7ICAvLyBtYWtlIGNvbXBpbGVyIGhhcHB5Cit9CisKK3ZvaWQgR2VuZXJhdG9yQ29udGV4dDo6TGlzdFBhcnNlZEZpbGVzKAorICAgIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBvdXRwdXQpIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgR2VuZXJhdG9yQ29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IExpc3RQYXJzZWRGaWxlcyI7Cit9CisKKy8vIFBhcnNlcyBhIHNldCBvZiBjb21tYS1kZWxpbWl0ZWQgbmFtZS92YWx1ZSBwYWlycy4KK3ZvaWQgUGFyc2VHZW5lcmF0b3JQYXJhbWV0ZXIoY29uc3Qgc3RyaW5nJiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiogb3V0cHV0KSB7CisgIHZlY3RvcjxzdHJpbmc+IHBhcnRzOworICBTcGxpdFN0cmluZ1VzaW5nKHRleHQsICIsIiwgJnBhcnRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKSB7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgZXF1YWxzX3BvcyA9IHBhcnRzW2ldLmZpbmRfZmlyc3Rfb2YoJz0nKTsKKyAgICBwYWlyPHN0cmluZywgc3RyaW5nPiB2YWx1ZTsKKyAgICBpZiAoZXF1YWxzX3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHZhbHVlLmZpcnN0ID0gcGFydHNbaV07CisgICAgICB2YWx1ZS5zZWNvbmQgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgdmFsdWUuZmlyc3QgPSBwYXJ0c1tpXS5zdWJzdHIoMCwgZXF1YWxzX3Bvcyk7CisgICAgICB2YWx1ZS5zZWNvbmQgPSBwYXJ0c1tpXS5zdWJzdHIoZXF1YWxzX3BvcyArIDEpOworICAgIH0KKyAgICBvdXRwdXQtPnB1c2hfYmFjayh2YWx1ZSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyZjY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTQyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBEZWZpbmVzIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgZWFjaCBvZiB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMKKy8vIGNvZGUgZ2VuZXJhdG9ycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09ERV9HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT0RFX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGlvIHsgY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07IH0KK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworCituYW1lc3BhY2UgY29tcGlsZXIgeworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIENvZGVHZW5lcmF0b3I7CitjbGFzcyBHZW5lcmF0b3JDb250ZXh0OworCisvLyBUaGUgYWJzdHJhY3QgaW50ZXJmYWNlIHRvIGEgY2xhc3Mgd2hpY2ggZ2VuZXJhdGVzIGNvZGUgaW1wbGVtZW50aW5nIGEKKy8vIHBhcnRpY3VsYXIgcHJvdG8gZmlsZSBpbiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UuICBBIG51bWJlciBvZiB0aGVzZSBtYXkKKy8vIGJlIHJlZ2lzdGVyZWQgd2l0aCBDb21tYW5kTGluZUludGVyZmFjZSB0byBzdXBwb3J0IHZhcmlvdXMgbGFuZ3VhZ2VzLgorY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGlubGluZSBDb2RlR2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB+Q29kZUdlbmVyYXRvcigpOworCisgIC8vIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZ2l2ZW4gcHJvdG8gZmlsZSwgZ2VuZXJhdGluZyBvbmUgb3IgbW9yZSBmaWxlcyBpbgorICAvLyB0aGUgZ2l2ZW4gb3V0cHV0IGRpcmVjdG9yeS4KKyAgLy8KKyAgLy8gQSBwYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUKKyAgLy8gY29tbWFuZCBsaW5lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IEphdmEgYW5kIHNpbWlsYXIgbGFuZ3VhZ2VzCisgIC8vIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lmaWMgY2xhc3MgZnJvbSB0aGUgcHJvdG8gZmlsZSBpcyB0byBiZSBnZW5lcmF0ZWQsCisgIC8vIHRob3VnaCBpdCBjb3VsZCBoYXZlIG90aGVyIHVzZXMgYXMgd2VsbC4gIEl0IGlzIGVtcHR5IGlmIG5vIHBhcmFtZXRlciB3YXMKKyAgLy8gZ2l2ZW4uCisgIC8vCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlLCBzZXRzICplcnJvciB0byBhIGRlc2NyaXB0aW9uIG9mCisgIC8vIHRoZSBwcm9ibGVtIChlLmcuICJpbnZhbGlkIHBhcmFtZXRlciIpIGFuZCByZXR1cm5zIGZhbHNlLgorICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvZGVHZW5lcmF0b3IpOworfTsKKworLy8gQ29kZUdlbmVyYXRvcnMgZ2VuZXJhdGUgb25lIG9yIG1vcmUgZmlsZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkuICBUaGlzCisvLyBhYnN0cmFjdCBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgZGlyZWN0b3J5IHRvIHdoaWNoIHRoZSBDb2RlR2VuZXJhdG9yIGlzCisvLyB0byB3cml0ZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIEdlbmVyYXRvcgorLy8gcnVucy4KK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgR2VuZXJhdG9yQ29udGV4dCB7CisgcHVibGljOgorICBpbmxpbmUgR2VuZXJhdG9yQ29udGV4dCgpIHt9CisgIHZpcnR1YWwgfkdlbmVyYXRvckNvbnRleHQoKTsKKworICAvLyBPcGVucyB0aGUgZ2l2ZW4gZmlsZSwgdHJ1bmNhdGluZyBpdCBpZiBpdCBleGlzdHMsIGFuZCByZXR1cm5zIGEKKyAgLy8gWmVyb0NvcHlPdXRwdXRTdHJlYW0gdGhhdCB3cml0ZXMgdG8gdGhlIGZpbGUuICBUaGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcAorICAvLyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0LiAgVGhpcyBtZXRob2QgbmV2ZXIgZmFpbHMgKGEgZHVtbXkgc3RyZWFtIHdpbGwgYmUKKyAgLy8gcmV0dXJuZWQgaW5zdGVhZCkuCisgIC8vCisgIC8vIFRoZSBmaWxlbmFtZSBnaXZlbiBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorICAvLyBFLmcuIHRoZSBDKysgZ2VuZXJhdG9yLCB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgImZvby9iYXIucHJvdG8iLCB3aWxsCisgIC8vIGdlbmVyYXRlIHRoZSBmaWxlcyAiZm9vL2Jhci5wYi5oIiBhbmQgImZvby9iYXIucGIuY2MiOyBub3RlIHRoYXQKKyAgLy8gImZvby8iIGlzIGluY2x1ZGVkIGluIHRoZXNlIGZpbGVuYW1lcy4gIFRoZSBmaWxlbmFtZSBpcyBub3QgYWxsb3dlZCB0bworICAvLyBjb250YWluICIuIiBvciAiLi4iIGNvbXBvbmVudHMuCisgIHZpcnR1YWwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpID0gMDsKKworICAvLyBDcmVhdGVzIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gd2hpY2ggd2lsbCBpbnNlcnQgY29kZSBpbnRvIHRoZSBnaXZlbiBmaWxlCisgIC8vIGF0IHRoZSBnaXZlbiBpbnNlcnRpb24gcG9pbnQuICBTZWUgcGx1Z2luLnByb3RvIChwbHVnaW4ucGIuaCkgZm9yIG1vcmUKKyAgLy8gaW5mb3JtYXRpb24gb24gaW5zZXJ0aW9uIHBvaW50cy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgIC8vIGFzc2VydC1mYWlscyAtLSBpdCBleGlzdHMgb25seSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCisgIC8vCisgIC8vIFdBUk5JTkc6ICBUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIHZpcnR1YWwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuRm9ySW5zZXJ0KAorICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpOworCisgIC8vIFJldHVybnMgYSB2ZWN0b3Igb2YgRmlsZURlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGZpbGVzIGJlaW5nIGNvbXBpbGVkCisgIC8vIGluIHRoaXMgcnVuLiAgVXNlZnVsIGZvciBsYW5ndWFnZXMsIHN1Y2ggYXMgR28sIHRoYXQgdHJlYXQgZmlsZXMKKyAgLy8gZGlmZmVyZW50bHkgd2hlbiBjb21waWxlZCBhcyBhIHNldCByYXRoZXIgdGhhbiBpbmRpdmlkdWFsbHkuCisgIHZpcnR1YWwgdm9pZCBMaXN0UGFyc2VkRmlsZXModmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR2VuZXJhdG9yQ29udGV4dCk7Cit9OworCisvLyBUaGUgdHlwZSBHZW5lcmF0b3JDb250ZXh0IHdhcyBvbmNlIGNhbGxlZCBPdXRwdXREaXJlY3RvcnkuIFRoaXMgdHlwZWRlZgorLy8gcHJvdmlkZXMgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK3R5cGVkZWYgR2VuZXJhdG9yQ29udGV4dCBPdXRwdXREaXJlY3Rvcnk7CisKKy8vIFNldmVyYWwgY29kZSBnZW5lcmF0b3JzIHRyZWF0IHRoZSBwYXJhbWV0ZXIgYXJndW1lbnQgYXMgaG9sZGluZyBhCisvLyBsaXN0IG9mIG9wdGlvbnMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHBhcnNlcworLy8gYSBzZXQgb2YgY29tbWEtZGVsaW1pdGVkIG5hbWUvdmFsdWUgcGFpcnM6IGUuZy4sCisvLyAgICJmb289YmFyLGJheixxdXg9Y29yZ2UiCisvLyBwYXJzZXMgdG8gdGhlIHBhaXJzOgorLy8gICAoImZvbyIsICJiYXIiKSwgKCJiYXoiLCAiIiksICgicXV4IiwgImNvcmdlIikKK2V4dGVybiB2b2lkIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKGNvbnN0IHN0cmluZyYsCisgICAgICAgICAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiopOworCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT0RFX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyOTNjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMTQzNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNkZWZpbmUgbWtkaXIobmFtZSwgbW9kZSkgbWtkaXIobmFtZSkKKyNpZm5kZWYgV19PSworI2RlZmluZSBXX09LIDAyICAvLyBub3QgZGVmaW5lZCBieSBNU1ZDIGZvciB3aGF0ZXZlciByZWFzb24KKyNlbmRpZgorI2lmbmRlZiBGX09LCisjZGVmaW5lIEZfT0sgMDAgIC8vIG5vdCBkZWZpbmVkIGJ5IE1TVkMgZm9yIHdoYXRldmVyIHJlYXNvbgorI2VuZGlmCisjaWZuZGVmIFNURElOX0ZJTEVOTworI2RlZmluZSBTVERJTl9GSUxFTk8gMAorI2VuZGlmCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9fQklOQVJZCisjaWZkZWYgX09fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQorI2Vsc2UKKyNkZWZpbmUgT19CSU5BUlkgMCAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgcGxhdGZvcm0gZG9lc24ndCBuZWVkIGl0LgorI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKK3N0YXRpYyBjb25zdCBjaGFyKiBrUGF0aFNlcGFyYXRvciA9ICI7IjsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhcioga1BhdGhTZXBhcmF0b3IgPSAiOiI7CisjZW5kaWYKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGxvb2tzIGxpa2UgYSBXaW5kb3dzLXN0eWxlIGFic29sdXRlIHBhdGgsIHN0YXJ0aW5nCisvLyB3aXRoIGEgZHJpdmUgbGV0dGVyLiAgRXhhbXBsZTogICJDOlxmb28iLiAgVE9ETyhrZW50b24pOiAgU2hhcmUgdGhpcyB3aXRoCisvLyBjb3B5IGluIGltcG9ydGVyLmNjPworc3RhdGljIGJvb2wgSXNXaW5kb3dzQWJzb2x1dGVQYXRoKGNvbnN0IHN0cmluZyYgdGV4dCkgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIHJldHVybiB0ZXh0LnNpemUoKSA+PSAzICYmIHRleHRbMV0gPT0gJzonICYmCisgICAgICAgICBpc2FscGhhKHRleHRbMF0pICYmCisgICAgICAgICAodGV4dFsyXSA9PSAnLycgfHwgdGV4dFsyXSA9PSAnXFwnKSAmJgorICAgICAgICAgdGV4dC5maW5kX2xhc3Rfb2YoJzonKSA9PSAxOworI2Vsc2UKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK3ZvaWQgU2V0RmRUb1RleHRNb2RlKGludCBmZCkgeworI2lmZGVmIF9XSU4zMgorICBpZiAoX3NldG1vZGUoZmQsIF9PX1RFWFQpID09IC0xKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBJIHRoaW5rLgorICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIl9zZXRtb2RlKCIgPDwgZmQgPDwgIiwgX09fVEVYVCk6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICB9CisjZW5kaWYKKyAgLy8gKFRleHQgYW5kIGJpbmFyeSBhcmUgdGhlIHNhbWUgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLikKK30KKwordm9pZCBTZXRGZFRvQmluYXJ5TW9kZShpbnQgZmQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgaWYgKF9zZXRtb2RlKGZkLCBfT19CSU5BUlkpID09IC0xKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBJIHRoaW5rLgorICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIl9zZXRtb2RlKCIgPDwgZmQgPDwgIiwgX09fQklOQVJZKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgIH0KKyNlbmRpZgorICAvLyAoVGV4dCBhbmQgYmluYXJ5IGFyZSB0aGUgc2FtZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuKQorfQorCit2b2lkIEFkZFRyYWlsaW5nU2xhc2goc3RyaW5nKiBwYXRoKSB7CisgIGlmICghcGF0aC0+ZW1wdHkoKSAmJiBwYXRoLT5hdChwYXRoLT5zaXplKCkgLSAxKSAhPSAnLycpIHsKKyAgICBwYXRoLT5wdXNoX2JhY2soJy8nKTsKKyAgfQorfQorCitib29sIFZlcmlmeURpcmVjdG9yeUV4aXN0cyhjb25zdCBzdHJpbmcmIHBhdGgpIHsKKyAgaWYgKHBhdGguZW1wdHkoKSkgcmV0dXJuIHRydWU7CisKKyAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIEZfT0spID09IC0xKSB7CisgICAgY2VyciA8PCBwYXRoIDw8ICI6ICIgPDwgc3RyZXJyb3IoZXJybm8pIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKKy8vIFRyeSB0byBjcmVhdGUgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGdpdmVuIGZpbGUsIGNyZWF0aW5nIHRoZSBwYXJlbnQncworLy8gcGFyZW50IGlmIG5lY2Vzc2FyeSwgYW5kIHNvIG9uLiAgVGhlIGZ1bGwgZmlsZSBuYW1lIGlzIGFjdHVhbGx5CisvLyAocHJlZml4ICsgZmlsZW5hbWUpLCBidXQgd2UgYXNzdW1lIHxwcmVmaXh8IGFscmVhZHkgZXhpc3RzIGFuZCBvbmx5IGNyZWF0ZQorLy8gZGlyZWN0b3JpZXMgbGlzdGVkIGluIHxmaWxlbmFtZXwuCitib29sIFRyeUNyZWF0ZVBhcmVudERpcmVjdG9yeShjb25zdCBzdHJpbmcmIHByZWZpeCwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICAvLyBSZWN1cnNpdmVseSBjcmVhdGUgcGFyZW50IGRpcmVjdG9yaWVzIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgdmVjdG9yPHN0cmluZz4gcGFydHM7CisgIFNwbGl0U3RyaW5nVXNpbmcoZmlsZW5hbWUsICIvIiwgJnBhcnRzKTsKKyAgc3RyaW5nIHBhdGhfc29fZmFyID0gcHJlZml4OworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKSAtIDE7IGkrKykgeworICAgIHBhdGhfc29fZmFyICs9IHBhcnRzW2ldOworICAgIGlmIChta2RpcihwYXRoX3NvX2Zhci5jX3N0cigpLCAwNzc3KSAhPSAwKSB7CisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBkaXJlY3RvcnkgIgorICAgICAgICAgICAgIDw8IHBhdGhfc29fZmFyIDw8ICI6ICIgPDwgc3RyZXJyb3IoZXJybm8pIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcGF0aF9zb19mYXIgKz0gJy8nOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBBIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHRoYXQgcHJpbnRzIGVycm9ycyB0byBzdGRlcnIuCitjbGFzcyBDb21tYW5kTGluZUludGVyZmFjZTo6RXJyb3JQcmludGVyIDogcHVibGljIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgRXJyb3JQcmludGVyKEVycm9yRm9ybWF0IGZvcm1hdCwgRGlza1NvdXJjZVRyZWUgKnRyZWUgPSBOVUxMKQorICAgIDogZm9ybWF0Xyhmb3JtYXQpLCB0cmVlXyh0cmVlKSB7fQorICB+RXJyb3JQcmludGVyKCkge30KKworICAvLyBpbXBsZW1lbnRzIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworCisgICAgLy8gUHJpbnQgZnVsbCBwYXRoIHdoZW4gcnVubmluZyB1bmRlciBNU1ZTCisgICAgc3RyaW5nIGRmaWxlOworICAgIGlmIChmb3JtYXRfID09IENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfTVNWUyAmJgorICAgICAgICB0cmVlXyAhPSBOVUxMICYmCisgICAgICAgIHRyZWVfLT5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoZmlsZW5hbWUsICZkZmlsZSkpIHsKKyAgICAgIGNlcnIgPDwgZGZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNlcnIgPDwgZmlsZW5hbWU7CisgICAgfQorCisgICAgLy8gVXNlcnMgdHlwaWNhbGx5IGV4cGVjdCAxLWJhc2VkIGxpbmUvY29sdW1uIG51bWJlcnMsIHNvIHdlIGFkZCAxCisgICAgLy8gdG8gZWFjaCBoZXJlLgorICAgIGlmIChsaW5lICE9IC0xKSB7CisgICAgICAvLyBBbGxvdyBmb3IgYm90aCBHQ0MtIGFuZCBWaXN1YWwtU3R1ZGlvLWNvbXBhdGlibGUgb3V0cHV0LgorICAgICAgc3dpdGNoIChmb3JtYXRfKSB7CisgICAgICAgIGNhc2UgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkVSUk9SX0ZPUk1BVF9HQ0M6CisgICAgICAgICAgY2VyciA8PCAiOiIgPDwgKGxpbmUgKyAxKSA8PCAiOiIgPDwgKGNvbHVtbiArIDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfTVNWUzoKKyAgICAgICAgICBjZXJyIDw8ICIoIiA8PCAobGluZSArIDEpIDw8ICIpIDogZXJyb3IgaW4gY29sdW1uPSIgPDwgKGNvbHVtbiArIDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGNlcnIgPDwgIjogIiA8PCBtZXNzYWdlIDw8IGVuZGw7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIGlvOjpFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBBZGRFcnJvcigiaW5wdXQiLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBFcnJvckZvcm1hdCBmb3JtYXRfOworICBEaXNrU291cmNlVHJlZSAqdHJlZV87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEEgR2VuZXJhdG9yQ29udGV4dCBpbXBsZW1lbnRhdGlvbiB0aGF0IGJ1ZmZlcnMgZmlsZXMgaW4gbWVtb3J5LCB0aGVuIGR1bXBzCisvLyB0aGVtIGFsbCB0byBkaXNrIG9uIGRlbWFuZC4KK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbCA6IHB1YmxpYyBHZW5lcmF0b3JDb250ZXh0IHsKKyBwdWJsaWM6CisgIEdlbmVyYXRvckNvbnRleHRJbXBsKGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMpOworICB+R2VuZXJhdG9yQ29udGV4dEltcGwoKTsKKworICAvLyBXcml0ZSBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0byBkaXNrIGF0IHRoZSBnaXZlbiBvdXRwdXQgbG9jYXRpb24sCisgIC8vIHdoaWNoIG11c3QgZW5kIGluIGEgJy8nLgorICBib29sIFdyaXRlQWxsVG9EaXNrKGNvbnN0IHN0cmluZyYgcHJlZml4KTsKKworICAvLyBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkgdG8gYSBaSVAtZm9ybWF0IGFyY2hpdmUgd2l0aCB0aGUKKyAgLy8gZ2l2ZW4gbmFtZS4KKyAgYm9vbCBXcml0ZUFsbFRvWmlwKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworCisgIC8vIEFkZCBhIGJvaWxlcnBsYXRlIE1FVEEtSU5GL01BTklGRVNULk1GIGZpbGUgYXMgcmVxdWlyZWQgYnkgdGhlIEphdmEgSkFSCisgIC8vIGZvcm1hdCwgdW5sZXNzIG9uZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCisgIHZvaWQgQWRkSmFyTWFuaWZlc3QoKTsKKworICAvLyBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW5Gb3JJbnNlcnQoCisgICAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCk7CisgIHZvaWQgTGlzdFBhcnNlZEZpbGVzKHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBvdXRwdXQpIHsKKyAgICAqb3V0cHV0ID0gcGFyc2VkX2ZpbGVzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeU91dHB1dFN0cmVhbTsKKworICAvLyBtYXAgaW5zdGVhZCBvZiBoYXNoX21hcCBzbyB0aGF0IGZpbGVzIGFyZSB3cml0dGVuIGluIG9yZGVyIChnb29kIHdoZW4KKyAgLy8gd3JpdGluZyB6aXBzKS4KKyAgbWFwPHN0cmluZywgc3RyaW5nKj4gZmlsZXNfOworICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzXzsKKyAgYm9vbCBoYWRfZXJyb3JfOworfTsKKworY2xhc3MgQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1lbW9yeU91dHB1dFN0cmVhbQorICAgIDogcHVibGljIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICBNZW1vcnlPdXRwdXRTdHJlYW0oR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisgIE1lbW9yeU91dHB1dFN0cmVhbShHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5LCBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpOworICB2aXJ0dWFsIH5NZW1vcnlPdXRwdXRTdHJlYW0oKTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2aXJ0dWFsIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7IHJldHVybiBpbm5lcl8tPk5leHQoZGF0YSwgc2l6ZSk7IH0KKyAgdmlydHVhbCB2b2lkIEJhY2tVcChpbnQgY291bnQpICAgICAgICAgICAgeyAgICAgICAgaW5uZXJfLT5CYWNrVXAoY291bnQpOyAgICB9CisgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIGlubmVyXy0+Qnl0ZUNvdW50KCk7ICAgICAgfQorCisgcHJpdmF0ZToKKyAgLy8gV2hlcmUgdG8gaW5zZXJ0IHRoZSBzdHJpbmcgd2hlbiBpdCdzIGRvbmUuCisgIEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnlfOworICBzdHJpbmcgZmlsZW5hbWVfOworICBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50XzsKKworICAvLyBUaGUgc3RyaW5nIHdlJ3JlIGJ1aWxkaW5nLgorICBzdHJpbmcgZGF0YV87CisKKyAgLy8gU3RyaW5nT3V0cHV0U3RyZWFtIHdyaXRpbmcgdG8gZGF0YV8uCisgIHNjb3BlZF9wdHI8aW86OlN0cmluZ091dHB1dFN0cmVhbT4gaW5uZXJfOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OkdlbmVyYXRvckNvbnRleHRJbXBsKAorICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMpCisgICAgOiBwYXJzZWRfZmlsZXNfKHBhcnNlZF9maWxlcyksCisgICAgICBoYWRfZXJyb3JfKGZhbHNlKSB7Cit9CisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6fkdlbmVyYXRvckNvbnRleHRJbXBsKCkgeworICBTVExEZWxldGVWYWx1ZXMoJmZpbGVzXyk7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpXcml0ZUFsbFRvRGlzaygKKyAgICBjb25zdCBzdHJpbmcmIHByZWZpeCkgeworICBpZiAoaGFkX2Vycm9yXykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghVmVyaWZ5RGlyZWN0b3J5RXhpc3RzKHByZWZpeCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZyo+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZmlsZXNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBmaWxlc18uZW5kKCk7ICsraXRlcikgeworICAgIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfZmlsZW5hbWUgPSBpdGVyLT5maXJzdDsKKyAgICBjb25zdCBjaGFyKiBkYXRhID0gaXRlci0+c2Vjb25kLT5kYXRhKCk7CisgICAgaW50IHNpemUgPSBpdGVyLT5zZWNvbmQtPnNpemUoKTsKKworICAgIGlmICghVHJ5Q3JlYXRlUGFyZW50RGlyZWN0b3J5KHByZWZpeCwgcmVsYXRpdmVfZmlsZW5hbWUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0cmluZyBmaWxlbmFtZSA9IHByZWZpeCArIHJlbGF0aXZlX2ZpbGVuYW1lOworCisgICAgLy8gQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBpbnQgZmlsZV9kZXNjcmlwdG9yOworICAgIGRvIHsKKyAgICAgIGZpbGVfZGVzY3JpcHRvciA9CisgICAgICAgIG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNjY2KTsKKyAgICB9IHdoaWxlIChmaWxlX2Rlc2NyaXB0b3IgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgIGlmIChmaWxlX2Rlc2NyaXB0b3IgPCAwKSB7CisgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIGZpbGUuCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICBpbnQgd3JpdGVfcmVzdWx0OworICAgICAgZG8geworICAgICAgICB3cml0ZV9yZXN1bHQgPSB3cml0ZShmaWxlX2Rlc2NyaXB0b3IsIGRhdGEsIHNpemUpOworICAgICAgfSB3aGlsZSAod3JpdGVfcmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICAgIGlmICh3cml0ZV9yZXN1bHQgPD0gMCkgeworICAgICAgICAvLyBXcml0ZSBlcnJvci4KKworICAgICAgICAvLyBGSVhNRShrZW50b24pOiAgQWNjb3JkaW5nIHRvIHRoZSBtYW4gcGFnZSwgaWYgd3JpdGUoKSByZXR1cm5zIHplcm8sCisgICAgICAgIC8vICAgdGhlcmUgd2FzIG5vIGVycm9yOyB3cml0ZSgpIHNpbXBseSBkaWQgbm90IHdyaXRlIGFueXRoaW5nLiAgSXQncworICAgICAgICAvLyAgIHVuY2xlYXIgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoaXMgbWlnaHQgaGFwcGVuLCBidXQgcHJlc3VtYWJseQorICAgICAgICAvLyAgIGVycm5vIHdvbid0IGJlIHNldCBpbiB0aGlzIGNhc2UuICBJIGFtIGNvbmZ1c2VkIGFzIHRvIGhvdyBzdWNoIGFuCisgICAgICAgIC8vICAgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuICBGb3Igbm93IEknbSB0cmVhdGluZyBpdCBhcyBhbiBlcnJvciwKKyAgICAgICAgLy8gICBzaW5jZSByZXRyeWluZyBzZWVtcyBsaWtlIGl0IGNvdWxkIGxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC4gIEkKKyAgICAgICAgLy8gICBzdXNwZWN0IHRoaXMgbmV2ZXIgYWN0dWFsbHkgaGFwcGVucyBhbnl3YXkuCisKKyAgICAgICAgaWYgKHdyaXRlX3Jlc3VsdCA8IDApIHsKKyAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICBjZXJyIDw8IGZpbGVuYW1lIDw8ICI6IHdyaXRlOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjZXJyIDw8IGZpbGVuYW1lIDw8ICI6IHdyaXRlKCkgcmV0dXJuZWQgemVybz8iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBkYXRhICs9IHdyaXRlX3Jlc3VsdDsKKyAgICAgIHNpemUgLT0gd3JpdGVfcmVzdWx0OworICAgIH0KKworICAgIGlmIChjbG9zZShmaWxlX2Rlc2NyaXB0b3IpICE9IDApIHsKKyAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiBjbG9zZTogIiA8PCBzdHJlcnJvcihlcnJvcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpXcml0ZUFsbFRvWmlwKAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgaWYgKGhhZF9lcnJvcl8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLgorICBpbnQgZmlsZV9kZXNjcmlwdG9yOworICBkbyB7CisgICAgZmlsZV9kZXNjcmlwdG9yID0KKyAgICAgIG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNjY2KTsKKyAgfSB3aGlsZSAoZmlsZV9kZXNjcmlwdG9yIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKGZpbGVfZGVzY3JpcHRvciA8IDApIHsKKyAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICBjZXJyIDw8IGZpbGVuYW1lIDw8ICI6ICIgPDwgc3RyZXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgWmlwV3JpdGVyCisgIGlvOjpGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbShmaWxlX2Rlc2NyaXB0b3IpOworICBaaXBXcml0ZXIgemlwX3dyaXRlcigmc3RyZWFtKTsKKworICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZyo+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZmlsZXNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBmaWxlc18uZW5kKCk7ICsraXRlcikgeworICAgIHppcF93cml0ZXIuV3JpdGUoaXRlci0+Zmlyc3QsICppdGVyLT5zZWNvbmQpOworICB9CisKKyAgemlwX3dyaXRlci5Xcml0ZURpcmVjdG9yeSgpOworCisgIGlmIChzdHJlYW0uR2V0RXJybm8oKSAhPSAwKSB7CisgICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiAiIDw8IHN0cmVycm9yKHN0cmVhbS5HZXRFcnJubygpKSA8PCBlbmRsOworICB9CisKKyAgaWYgKCFzdHJlYW0uQ2xvc2UoKSkgeworICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihzdHJlYW0uR2V0RXJybm8oKSkgPDwgZW5kbDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6QWRkSmFyTWFuaWZlc3QoKSB7CisgIHN0cmluZyoqIG1hcF9zbG90ID0gJmZpbGVzX1siTUVUQS1JTkYvTUFOSUZFU1QuTUYiXTsKKyAgaWYgKCptYXBfc2xvdCA9PSBOVUxMKSB7CisgICAgKm1hcF9zbG90ID0gbmV3IHN0cmluZygKKyAgICAgICAgIk1hbmlmZXN0LVZlcnNpb246IDEuMFxuIgorICAgICAgICAiQ3JlYXRlZC1CeTogMS42LjAgKHByb3RvYylcbiIKKyAgICAgICAgIlxuIik7CisgIH0KK30KKworaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6Ok9wZW4oCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gbmV3IE1lbW9yeU91dHB1dFN0cmVhbSh0aGlzLCBmaWxlbmFtZSk7Cit9CisKK2lvOjpaZXJvQ29weU91dHB1dFN0cmVhbSoKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6T3BlbkZvckluc2VydCgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCkgeworICByZXR1cm4gbmV3IE1lbW9yeU91dHB1dFN0cmVhbSh0aGlzLCBmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb21tYW5kTGluZUludGVyZmFjZTo6TWVtb3J5T3V0cHV0U3RyZWFtOjpNZW1vcnlPdXRwdXRTdHJlYW0oCisgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkKKyAgICA6IGRpcmVjdG9yeV8oZGlyZWN0b3J5KSwKKyAgICAgIGZpbGVuYW1lXyhmaWxlbmFtZSksCisgICAgICBpbm5lcl8obmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oJmRhdGFfKSkgeworfQorCitDb21tYW5kTGluZUludGVyZmFjZTo6TWVtb3J5T3V0cHV0U3RyZWFtOjpNZW1vcnlPdXRwdXRTdHJlYW0oCisgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCkKKyAgICA6IGRpcmVjdG9yeV8oZGlyZWN0b3J5KSwKKyAgICAgIGZpbGVuYW1lXyhmaWxlbmFtZSksCisgICAgICBpbnNlcnRpb25fcG9pbnRfKGluc2VydGlvbl9wb2ludCksCisgICAgICBpbm5lcl8obmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oJmRhdGFfKSkgeworfQorCitDb21tYW5kTGluZUludGVyZmFjZTo6TWVtb3J5T3V0cHV0U3RyZWFtOjp+TWVtb3J5T3V0cHV0U3RyZWFtKCkgeworICAvLyBNYWtlIHN1cmUgYWxsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbi4KKyAgaW5uZXJfLnJlc2V0KCk7CisKKyAgLy8gSW5zZXJ0IGludG8gdGhlIGRpcmVjdG9yeS4KKyAgc3RyaW5nKiogbWFwX3Nsb3QgPSAmZGlyZWN0b3J5Xy0+ZmlsZXNfW2ZpbGVuYW1lX107CisKKyAgaWYgKGluc2VydGlvbl9wb2ludF8uZW1wdHkoKSkgeworICAgIC8vIFRoaXMgd2FzIGp1c3QgYSByZWd1bGFyIE9wZW4oKS4KKyAgICBpZiAoKm1hcF9zbG90ICE9IE5VTEwpIHsKKyAgICAgIGNlcnIgPDwgZmlsZW5hbWVfIDw8ICI6IFRyaWVkIHRvIHdyaXRlIHRoZSBzYW1lIGZpbGUgdHdpY2UuIiA8PCBlbmRsOworICAgICAgZGlyZWN0b3J5Xy0+aGFkX2Vycm9yXyA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgKm1hcF9zbG90ID0gbmV3IHN0cmluZzsKKyAgICAoKm1hcF9zbG90KS0+c3dhcChkYXRhXyk7CisgIH0gZWxzZSB7CisgICAgLy8gVGhpcyB3YXMgYW4gT3BlbkZvckluc2VydCgpLgorCisgICAgLy8gSWYgdGhlIGRhdGEgZG9lbnMndCBlbmQgd2l0aCBhIGNsZWFuIGxpbmUgYnJlYWssIGFkZCBvbmUuCisgICAgaWYgKCFkYXRhXy5lbXB0eSgpICYmIGRhdGFfW2RhdGFfLnNpemUoKSAtIDFdICE9ICdcbicpIHsKKyAgICAgIGRhdGFfLnB1c2hfYmFjaygnXG4nKTsKKyAgICB9CisKKyAgICAvLyBGaW5kIHRoZSBmaWxlIHdlIGFyZSBnb2luZyB0byBpbnNlcnQgaW50by4KKyAgICBpZiAoKm1hcF9zbG90ID09IE5VTEwpIHsKKyAgICAgIGNlcnIgPDwgZmlsZW5hbWVfIDw8ICI6IFRyaWVkIHRvIGluc2VydCBpbnRvIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LiIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGRpcmVjdG9yeV8tPmhhZF9lcnJvcl8gPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJpbmcqIHRhcmdldCA9ICptYXBfc2xvdDsKKworICAgIC8vIEZpbmQgdGhlIGluc2VydGlvbiBwb2ludC4KKyAgICBzdHJpbmcgbWFnaWNfc3RyaW5nID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgIkBAcHJvdG9jX2luc2VydGlvbl9wb2ludCgkMCkiLCBpbnNlcnRpb25fcG9pbnRfKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSB0YXJnZXQtPmZpbmQobWFnaWNfc3RyaW5nKTsKKworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBjZXJyIDw8IGZpbGVuYW1lXyA8PCAiOiBpbnNlcnRpb24gcG9pbnQgXCIiIDw8IGluc2VydGlvbl9wb2ludF8KKyAgICAgICAgICAgPDwgIlwiIG5vdCBmb3VuZC4iIDw8IGVuZGw7CisgICAgICBkaXJlY3RvcnlfLT5oYWRfZXJyb3JfID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTZWVrIGJhY2t3YXJkcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCB3aGljaCBpcyB3aGVyZSB3ZSB3aWxsCisgICAgLy8gaW5zZXJ0IHRoZSBkYXRhLiAgTm90ZSB0aGF0IHRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHVzaGluZyB0aGUgaW5zZXJ0aW9uCisgICAgLy8gcG9pbnQgZG93biwgc28gdGhlIGRhdGEgaXMgaW5zZXJ0ZWQgYmVmb3JlIGl0LiAgVGhpcyBpcyBpbnRlbnRpb25hbAorICAgIC8vIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCBtdWx0aXBsZSBpbnNlcnRpb25zIGF0IHRoZSBzYW1lIHBvaW50IHdpbGwgZW5kCisgICAgLy8gdXAgaW4gdGhlIGV4cGVjdGVkIG9yZGVyIGluIHRoZSBmaW5hbCBvdXRwdXQuCisgICAgcG9zID0gdGFyZ2V0LT5maW5kX2xhc3Rfb2YoJ1xuJywgcG9zKTsKKyAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgLy8gSW5zZXJ0aW9uIHBvaW50IGlzIG9uIHRoZSBmaXJzdCBsaW5lLgorICAgICAgcG9zID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQWR2YW5jZSB0byBjaGFyYWN0ZXIgYWZ0ZXIgJ1xuJy4KKyAgICAgICsrcG9zOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgaW5kZW50LgorICAgIHN0cmluZyBpbmRlbnRfKCp0YXJnZXQsIHBvcywgdGFyZ2V0LT5maW5kX2ZpcnN0X25vdF9vZigiIFx0IiwgcG9zKSAtIHBvcyk7CisKKyAgICBpZiAoaW5kZW50Xy5lbXB0eSgpKSB7CisgICAgICAvLyBObyBpbmRlbnQuICBUaGlzIG1ha2VzIHRoaW5ncyBlYXNpZXIuCisgICAgICB0YXJnZXQtPmluc2VydChwb3MsIGRhdGFfKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQuCisgICAgICBpbnQgaW5kZW50X3NpemUgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhXy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoZGF0YV9baV0gPT0gJ1xuJykgaW5kZW50X3NpemUgKz0gaW5kZW50Xy5zaXplKCk7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2UgYSBob2xlIGZvciBpdC4KKyAgICAgIHRhcmdldC0+aW5zZXJ0KHBvcywgZGF0YV8uc2l6ZSgpICsgaW5kZW50X3NpemUsICdcMCcpOworCisgICAgICAvLyBOb3cgY29weSBpbiB0aGUgZGF0YS4KKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIGRhdGFfcG9zID0gMDsKKyAgICAgIGNoYXIqIHRhcmdldF9wdHIgPSBzdHJpbmdfYXNfYXJyYXkodGFyZ2V0KSArIHBvczsKKyAgICAgIHdoaWxlIChkYXRhX3BvcyA8IGRhdGFfLnNpemUoKSkgeworICAgICAgICAvLyBDb3B5IGluZGVudC4KKyAgICAgICAgbWVtY3B5KHRhcmdldF9wdHIsIGluZGVudF8uZGF0YSgpLCBpbmRlbnRfLnNpemUoKSk7CisgICAgICAgIHRhcmdldF9wdHIgKz0gaW5kZW50Xy5zaXplKCk7CisKKyAgICAgICAgLy8gQ29weSBsaW5lIGZyb20gZGF0YV8uCisgICAgICAgIC8vIFdlIGFscmVhZHkgZ3VhcmFudGVlZCB0aGF0IGRhdGFfIGVuZHMgd2l0aCBhIG5ld2xpbmUgKGFib3ZlKSwgc28gdGhpcworICAgICAgICAvLyBzZWFyY2ggY2FuJ3QgZmFpbC4KKyAgICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbGluZV9sZW5ndGggPQorICAgICAgICAgICAgZGF0YV8uZmluZF9maXJzdF9vZignXG4nLCBkYXRhX3BvcykgKyAxIC0gZGF0YV9wb3M7CisgICAgICAgIG1lbWNweSh0YXJnZXRfcHRyLCBkYXRhXy5kYXRhKCkgKyBkYXRhX3BvcywgbGluZV9sZW5ndGgpOworICAgICAgICB0YXJnZXRfcHRyICs9IGxpbmVfbGVuZ3RoOworICAgICAgICBkYXRhX3BvcyArPSBsaW5lX2xlbmd0aDsKKyAgICAgIH0KKworICAgICAgR09PR0xFX0NIRUNLX0VRKHRhcmdldF9wdHIsCisgICAgICAgICAgc3RyaW5nX2FzX2FycmF5KHRhcmdldCkgKyBwb3MgKyBkYXRhXy5zaXplKCkgKyBpbmRlbnRfc2l6ZSk7CisgICAgfQorICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29tbWFuZExpbmVJbnRlcmZhY2U6OkNvbW1hbmRMaW5lSW50ZXJmYWNlKCkKKyAgOiBtb2RlXyhNT0RFX0NPTVBJTEUpLAorICAgIGVycm9yX2Zvcm1hdF8oRVJST1JfRk9STUFUX0dDQyksCisgICAgaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8oZmFsc2UpLAorICAgIHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XyhmYWxzZSksCisgICAgZGlzYWxsb3dfc2VydmljZXNfKGZhbHNlKSwKKyAgICBpbnB1dHNfYXJlX3Byb3RvX3BhdGhfcmVsYXRpdmVfKGZhbHNlKSB7fQorQ29tbWFuZExpbmVJbnRlcmZhY2U6On5Db21tYW5kTGluZUludGVyZmFjZSgpIHt9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlJlZ2lzdGVyR2VuZXJhdG9yKGNvbnN0IHN0cmluZyYgZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBoZWxwX3RleHQpIHsKKyAgR2VuZXJhdG9ySW5mbyBpbmZvOworICBpbmZvLmZsYWdfbmFtZSA9IGZsYWdfbmFtZTsKKyAgaW5mby5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgIGluZm8uaGVscF90ZXh0ID0gaGVscF90ZXh0OworICBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV9bZmxhZ19uYW1lXSA9IGluZm87Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlJlZ2lzdGVyR2VuZXJhdG9yKGNvbnN0IHN0cmluZyYgZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBoZWxwX3RleHQpIHsKKyAgR2VuZXJhdG9ySW5mbyBpbmZvOworICBpbmZvLmZsYWdfbmFtZSA9IGZsYWdfbmFtZTsKKyAgaW5mby5vcHRpb25fZmxhZ19uYW1lID0gb3B0aW9uX2ZsYWdfbmFtZTsKKyAgaW5mby5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgIGluZm8uaGVscF90ZXh0ID0gaGVscF90ZXh0OworICBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV9bZmxhZ19uYW1lXSA9IGluZm87CisgIGdlbmVyYXRvcnNfYnlfb3B0aW9uX25hbWVfW29wdGlvbl9mbGFnX25hbWVdID0gaW5mbzsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6QWxsb3dQbHVnaW5zKGNvbnN0IHN0cmluZyYgZXhlX25hbWVfcHJlZml4KSB7CisgIHBsdWdpbl9wcmVmaXhfID0gZXhlX25hbWVfcHJlZml4OworfQorCitpbnQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlJ1bihpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKSB7CisgIENsZWFyKCk7CisgIHN3aXRjaCAoUGFyc2VBcmd1bWVudHMoYXJnYywgYXJndikpIHsKKyAgICBjYXNlIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0VYSVQ6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFBBUlNFX0FSR1VNRU5UX0ZBSUw6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0NPTlRJTlVFOgorICAgICAgYnJlYWs7CisgIH0KKworICAvLyBTZXQgdXAgdGhlIHNvdXJjZSB0cmVlLgorICBEaXNrU291cmNlVHJlZSBzb3VyY2VfdHJlZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90b19wYXRoXy5zaXplKCk7IGkrKykgeworICAgIHNvdXJjZV90cmVlLk1hcFBhdGgocHJvdG9fcGF0aF9baV0uZmlyc3QsIHByb3RvX3BhdGhfW2ldLnNlY29uZCk7CisgIH0KKworICAvLyBNYXAgaW5wdXQgZmlsZXMgdG8gdmlydHVhbCBwYXRocyBpZiBuZWNlc3NhcnkuCisgIGlmICghaW5wdXRzX2FyZV9wcm90b19wYXRoX3JlbGF0aXZlXykgeworICAgIGlmICghTWFrZUlucHV0c0JlUHJvdG9QYXRoUmVsYXRpdmUoJnNvdXJjZV90cmVlKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgLy8gQWxsb2NhdGUgdGhlIEltcG9ydGVyLgorICBFcnJvclByaW50ZXIgZXJyb3JfY29sbGVjdG9yKGVycm9yX2Zvcm1hdF8sICZzb3VyY2VfdHJlZSk7CisgIEltcG9ydGVyIGltcG9ydGVyKCZzb3VyY2VfdHJlZSwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcGFyc2VkX2ZpbGVzOworCisgIC8vIFBhcnNlIGVhY2ggZmlsZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dF9maWxlc18uc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBJbXBvcnQgdGhlIGZpbGUuCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHBhcnNlZF9maWxlID0gaW1wb3J0ZXIuSW1wb3J0KGlucHV0X2ZpbGVzX1tpXSk7CisgICAgaWYgKHBhcnNlZF9maWxlID09IE5VTEwpIHJldHVybiAxOworICAgIHBhcnNlZF9maWxlcy5wdXNoX2JhY2socGFyc2VkX2ZpbGUpOworCisgICAgLy8gRW5mb3JjZSAtLWRpc2FsbG93X3NlcnZpY2VzLgorICAgIGlmIChkaXNhbGxvd19zZXJ2aWNlc18gJiYgcGFyc2VkX2ZpbGUtPnNlcnZpY2VfY291bnQoKSA+IDApIHsKKyAgICAgIGNlcnIgPDwgcGFyc2VkX2ZpbGUtPm5hbWUoKSA8PCAiOiBUaGlzIGZpbGUgY29udGFpbnMgc2VydmljZXMsIGJ1dCAiCisgICAgICAgICAgICAgICItLWRpc2FsbG93X3NlcnZpY2VzIHdhcyB1c2VkLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIC8vIFdlIGNvbnN0cnVjdCBhIHNlcGFyYXRlIEdlbmVyYXRvckNvbnRleHQgZm9yIGVhY2ggb3V0cHV0IGxvY2F0aW9uLiAgTm90ZQorICAvLyB0aGF0IHR3byBjb2RlIGdlbmVyYXRvcnMgbWF5IG91dHB1dCB0byB0aGUgc2FtZSBsb2NhdGlvbiwgaW4gd2hpY2ggY2FzZQorICAvLyB0aGV5IHNob3VsZCBzaGFyZSBhIHNpbmdsZSBHZW5lcmF0b3JDb250ZXh0IHNvIHRoYXQgT3BlbkZvckluc2VydCgpIHdvcmtzLgorICB0eXBlZGVmIGhhc2hfbWFwPHN0cmluZywgR2VuZXJhdG9yQ29udGV4dEltcGwqPiBHZW5lcmF0b3JDb250ZXh0TWFwOworICBHZW5lcmF0b3JDb250ZXh0TWFwIG91dHB1dF9kaXJlY3RvcmllczsKKworICAvLyBHZW5lcmF0ZSBvdXRwdXQuCisgIGlmIChtb2RlXyA9PSBNT0RFX0NPTVBJTEUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9kaXJlY3RpdmVzXy5zaXplKCk7IGkrKykgeworICAgICAgc3RyaW5nIG91dHB1dF9sb2NhdGlvbiA9IG91dHB1dF9kaXJlY3RpdmVzX1tpXS5vdXRwdXRfbG9jYXRpb247CisgICAgICBpZiAoIUhhc1N1ZmZpeFN0cmluZyhvdXRwdXRfbG9jYXRpb24sICIuemlwIikgJiYKKyAgICAgICAgICAhSGFzU3VmZml4U3RyaW5nKG91dHB1dF9sb2NhdGlvbiwgIi5qYXIiKSkgeworICAgICAgICBBZGRUcmFpbGluZ1NsYXNoKCZvdXRwdXRfbG9jYXRpb24pOworICAgICAgfQorICAgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqKiBtYXBfc2xvdCA9ICZvdXRwdXRfZGlyZWN0b3JpZXNbb3V0cHV0X2xvY2F0aW9uXTsKKworICAgICAgaWYgKCptYXBfc2xvdCA9PSBOVUxMKSB7CisgICAgICAgIC8vIEZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGlzIG91dHB1dCBsb2NhdGlvbi4KKyAgICAgICAgKm1hcF9zbG90ID0gbmV3IEdlbmVyYXRvckNvbnRleHRJbXBsKHBhcnNlZF9maWxlcyk7CisgICAgICB9CisKKyAgICAgIGlmICghR2VuZXJhdGVPdXRwdXQocGFyc2VkX2ZpbGVzLCBvdXRwdXRfZGlyZWN0aXZlc19baV0sICptYXBfc2xvdCkpIHsKKyAgICAgICAgU1RMRGVsZXRlVmFsdWVzKCZvdXRwdXRfZGlyZWN0b3JpZXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBXcml0ZSBhbGwgb3V0cHV0IHRvIGRpc2suCisgIGZvciAoR2VuZXJhdG9yQ29udGV4dE1hcDo6aXRlcmF0b3IgaXRlciA9IG91dHB1dF9kaXJlY3Rvcmllcy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gb3V0cHV0X2RpcmVjdG9yaWVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBjb25zdCBzdHJpbmcmIGxvY2F0aW9uID0gaXRlci0+Zmlyc3Q7CisgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSA9IGl0ZXItPnNlY29uZDsKKyAgICBpZiAoSGFzU3VmZml4U3RyaW5nKGxvY2F0aW9uLCAiLyIpKSB7CisgICAgICBpZiAoIWRpcmVjdG9yeS0+V3JpdGVBbGxUb0Rpc2sobG9jYXRpb24pKSB7CisgICAgICAgIFNUTERlbGV0ZVZhbHVlcygmb3V0cHV0X2RpcmVjdG9yaWVzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChIYXNTdWZmaXhTdHJpbmcobG9jYXRpb24sICIuamFyIikpIHsKKyAgICAgICAgZGlyZWN0b3J5LT5BZGRKYXJNYW5pZmVzdCgpOworICAgICAgfQorCisgICAgICBpZiAoIWRpcmVjdG9yeS0+V3JpdGVBbGxUb1ppcChsb2NhdGlvbikpIHsKKyAgICAgICAgU1RMRGVsZXRlVmFsdWVzKCZvdXRwdXRfZGlyZWN0b3JpZXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBTVExEZWxldGVWYWx1ZXMoJm91dHB1dF9kaXJlY3Rvcmllcyk7CisKKyAgaWYgKCFkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7CisgICAgaWYgKCFXcml0ZURlc2NyaXB0b3JTZXQocGFyc2VkX2ZpbGVzKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgaWYgKG1vZGVfID09IE1PREVfRU5DT0RFIHx8IG1vZGVfID09IE1PREVfREVDT0RFKSB7CisgICAgaWYgKGNvZGVjX3R5cGVfLmVtcHR5KCkpIHsKKyAgICAgIC8vIEhBQ0s6ICBEZWZpbmUgYW4gRW1wdHlNZXNzYWdlIHR5cGUgdG8gdXNlIGZvciBkZWNvZGluZy4KKyAgICAgIERlc2NyaXB0b3JQb29sIHBvb2w7CisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgICBmaWxlLnNldF9uYW1lKCJlbXB0eV9tZXNzYWdlLnByb3RvIik7CisgICAgICBmaWxlLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkVtcHR5TWVzc2FnZSIpOworICAgICAgR09PR0xFX0NIRUNLKHBvb2wuQnVpbGRGaWxlKGZpbGUpICE9IE5VTEwpOworICAgICAgY29kZWNfdHlwZV8gPSAiRW1wdHlNZXNzYWdlIjsKKyAgICAgIGlmICghRW5jb2RlT3JEZWNvZGUoJnBvb2wpKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUVuY29kZU9yRGVjb2RlKGltcG9ydGVyLnBvb2woKSkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkNsZWFyKCkgeworICAvLyBDbGVhciBhbGwgbWVtYmVycyB0aGF0IGFyZSBzZXQgYnkgUnVuKCkuICBOb3RlIHRoYXQgd2UgbXVzdCBub3QgY2xlYXIKKyAgLy8gbWVtYmVycyB3aGljaCBhcmUgc2V0IGJ5IG90aGVyIG1ldGhvZHMgYmVmb3JlIFJ1bigpIGlzIGNhbGxlZC4KKyAgZXhlY3V0YWJsZV9uYW1lXy5jbGVhcigpOworICBwcm90b19wYXRoXy5jbGVhcigpOworICBpbnB1dF9maWxlc18uY2xlYXIoKTsKKyAgb3V0cHV0X2RpcmVjdGl2ZXNfLmNsZWFyKCk7CisgIGNvZGVjX3R5cGVfLmNsZWFyKCk7CisgIGRlc2NyaXB0b3Jfc2V0X25hbWVfLmNsZWFyKCk7CisKKyAgbW9kZV8gPSBNT0RFX0NPTVBJTEU7CisgIGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfID0gZmFsc2U7CisgIHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XyA9IGZhbHNlOworICBkaXNhbGxvd19zZXJ2aWNlc18gPSBmYWxzZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6TWFrZUlucHV0c0JlUHJvdG9QYXRoUmVsYXRpdmUoCisgICAgRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRfZmlsZXNfLnNpemUoKTsgaSsrKSB7CisgICAgc3RyaW5nIHZpcnR1YWxfZmlsZSwgc2hhZG93aW5nX2Rpc2tfZmlsZTsKKyAgICBzd2l0Y2ggKHNvdXJjZV90cmVlLT5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICAgIGlucHV0X2ZpbGVzX1tpXSwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKSB7CisgICAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpTVUNDRVNTOgorICAgICAgICBpbnB1dF9maWxlc19baV0gPSB2aXJ0dWFsX2ZpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEaXNrU291cmNlVHJlZTo6U0hBRE9XRUQ6CisgICAgICAgIGNlcnIgPDwgaW5wdXRfZmlsZXNfW2ldIDw8ICI6IElucHV0IGlzIHNoYWRvd2VkIGluIHRoZSAtLXByb3RvX3BhdGggIgorICAgICAgICAgICAgICAgICJieSBcIiIgPDwgc2hhZG93aW5nX2Rpc2tfZmlsZSA8PCAiXCIuICBFaXRoZXIgdXNlIHRoZSBsYXR0ZXIgIgorICAgICAgICAgICAgICAgICJmaWxlIGFzIHlvdXIgaW5wdXQgb3IgcmVvcmRlciB0aGUgLS1wcm90b19wYXRoIHNvIHRoYXQgdGhlICIKKyAgICAgICAgICAgICAgICAiZm9ybWVyIGZpbGUncyBsb2NhdGlvbiBjb21lcyBmaXJzdC4iIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgRGlza1NvdXJjZVRyZWU6OkNBTk5PVF9PUEVOOgorICAgICAgICBjZXJyIDw8IGlucHV0X2ZpbGVzX1tpXSA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm5vKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HOgorICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgYXQgYWxsLgorICAgICAgICBpZiAoYWNjZXNzKGlucHV0X2ZpbGVzX1tpXS5jX3N0cigpLCBGX09LKSA8IDApIHsKKyAgICAgICAgICAvLyBGaWxlIGRvZXMgbm90IGV2ZW4gZXhpc3QuCisgICAgICAgICAgY2VyciA8PCBpbnB1dF9maWxlc19baV0gPDwgIjogIiA8PCBzdHJlcnJvcihFTk9FTlQpIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2VyciA8PCBpbnB1dF9maWxlc19baV0gPDwgIjogRmlsZSBkb2VzIG5vdCByZXNpZGUgd2l0aGluIGFueSBwYXRoICIKKyAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgdXNpbmcgLS1wcm90b19wYXRoIChvciAtSSkuICBZb3UgbXVzdCBzcGVjaWZ5IGEgIgorICAgICAgICAgICAgICAgICAgIi0tcHJvdG9fcGF0aCB3aGljaCBlbmNvbXBhc3NlcyB0aGlzIGZpbGUuICBOb3RlIHRoYXQgdGhlICIKKyAgICAgICAgICAgICAgICAgICJwcm90b19wYXRoIG11c3QgYmUgYW4gZXhhY3QgcHJlZml4IG9mIHRoZSAucHJvdG8gZmlsZSAiCisgICAgICAgICAgICAgICAgICAibmFtZXMgLS0gcHJvdG9jIGlzIHRvbyBkdW1iIHRvIGZpZ3VyZSBvdXQgd2hlbiB0d28gcGF0aHMgIgorICAgICAgICAgICAgICAgICAgIihlLmcuIGFic29sdXRlIGFuZCByZWxhdGl2ZSkgYXJlIGVxdWl2YWxlbnQgKGl0J3MgaGFyZGVyICIKKyAgICAgICAgICAgICAgICAgICJ0aGFuIHlvdSB0aGluaykuIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworQ29tbWFuZExpbmVJbnRlcmZhY2U6OlBhcnNlQXJndW1lbnRTdGF0dXMKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50cyhpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKSB7CisgIGV4ZWN1dGFibGVfbmFtZV8gPSBhcmd2WzBdOworCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYXJndW1lbnRzIGFuZCBwYXJzZSB0aGVtLgorICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIHN0cmluZyBuYW1lLCB2YWx1ZTsKKworICAgIGlmIChQYXJzZUFyZ3VtZW50KGFyZ3ZbaV0sICZuYW1lLCAmdmFsdWUpKSB7CisgICAgICAvLyBSZXR1cm5lZCB0cnVlID0+IFVzZSB0aGUgbmV4dCBhcmd1bWVudCBhcyB0aGUgZmxhZyB2YWx1ZS4KKyAgICAgIGlmIChpICsgMSA9PSBhcmdjIHx8IGFyZ3ZbaSsxXVswXSA9PSAnLScpIHsKKyAgICAgICAgY2VyciA8PCAiTWlzc2luZyB2YWx1ZSBmb3IgZmxhZzogIiA8PCBuYW1lIDw8IGVuZGw7CisgICAgICAgIGlmIChuYW1lID09ICItLWRlY29kZSIpIHsKKyAgICAgICAgICBjZXJyIDw8ICJUbyBkZWNvZGUgYW4gdW5rbm93biBtZXNzYWdlLCB1c2UgLS1kZWNvZGVfcmF3LiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsraTsKKyAgICAgICAgdmFsdWUgPSBhcmd2W2ldOworICAgICAgfQorICAgIH0KKworICAgIFBhcnNlQXJndW1lbnRTdGF0dXMgc3RhdHVzID0gSW50ZXJwcmV0QXJndW1lbnQobmFtZSwgdmFsdWUpOworICAgIGlmIChzdGF0dXMgIT0gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUUpCisgICAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgLy8gSWYgbm8gLS1wcm90b19wYXRoIHdhcyBnaXZlbiwgdXNlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICBpZiAocHJvdG9fcGF0aF8uZW1wdHkoKSkgeworICAgIC8vIERvbid0IHVzZSBtYWtlX3BhaXIgYXMgdGhlIG9sZC9kZWZhdWx0IHN0YW5kYXJkIGxpYnJhcnkgb24gU29sYXJpcworICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBpdCB3aXRob3V0IGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIHdoaWNoIGFyZQorICAgIC8vIGluY29tcGF0aWJsZSB3aXRoIEMrKzB4J3MgbWFrZV9wYWlyLgorICAgIHByb3RvX3BhdGhfLnB1c2hfYmFjayhwYWlyPHN0cmluZywgc3RyaW5nPigiIiwgIi4iKSk7CisgIH0KKworICAvLyBDaGVjayBzb21lIGVycnJvciBjYXNlcy4KKyAgYm9vbCBkZWNvZGluZ19yYXcgPSAobW9kZV8gPT0gTU9ERV9ERUNPREUpICYmIGNvZGVjX3R5cGVfLmVtcHR5KCk7CisgIGlmIChkZWNvZGluZ19yYXcgJiYgIWlucHV0X2ZpbGVzXy5lbXB0eSgpKSB7CisgICAgY2VyciA8PCAiV2hlbiB1c2luZyAtLWRlY29kZV9yYXcsIG5vIGlucHV0IGZpbGVzIHNob3VsZCBiZSBnaXZlbi4iIDw8IGVuZGw7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgIH0gZWxzZSBpZiAoIWRlY29kaW5nX3JhdyAmJiBpbnB1dF9maWxlc18uZW1wdHkoKSkgeworICAgIGNlcnIgPDwgIk1pc3NpbmcgaW5wdXQgZmlsZS4iIDw8IGVuZGw7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgIH0KKyAgaWYgKG1vZGVfID09IE1PREVfQ09NUElMRSAmJiBvdXRwdXRfZGlyZWN0aXZlc18uZW1wdHkoKSAmJgorICAgICAgZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgeworICAgIGNlcnIgPDwgIk1pc3Npbmcgb3V0cHV0IGRpcmVjdGl2ZXMuIiA8PCBlbmRsOworICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICB9CisgIGlmIChpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyAmJiBkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7CisgICAgY2VyciA8PCAiLS1pbmNsdWRlX2ltcG9ydHMgb25seSBtYWtlcyBzZW5zZSB3aGVuIGNvbWJpbmVkIHdpdGggIgorICAgICAgICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfb3V0LiIgPDwgZW5kbDsKKyAgfQorICBpZiAoc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfICYmIGRlc2NyaXB0b3Jfc2V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICBjZXJyIDw8ICItLWluY2x1ZGVfc291cmNlX2luZm8gb25seSBtYWtlcyBzZW5zZSB3aGVuIGNvbWJpbmVkIHdpdGggIgorICAgICAgICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfb3V0LiIgPDwgZW5kbDsKKyAgfQorCisgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9DT05USU5VRTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6UGFyc2VBcmd1bWVudChjb25zdCBjaGFyKiBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogbmFtZSwgc3RyaW5nKiB2YWx1ZSkgeworICBib29sIHBhcnNlZF92YWx1ZSA9IGZhbHNlOworCisgIGlmIChhcmdbMF0gIT0gJy0nKSB7CisgICAgLy8gTm90IGEgZmxhZy4KKyAgICBuYW1lLT5jbGVhcigpOworICAgIHBhcnNlZF92YWx1ZSA9IHRydWU7CisgICAgKnZhbHVlID0gYXJnOworICB9IGVsc2UgaWYgKGFyZ1sxXSA9PSAnLScpIHsKKyAgICAvLyBUd28gZGFzaGVzOiAgTXVsdGktY2hhcmFjdGVyIG5hbWUsIHdpdGggJz0nIHNlcGFyYXRpbmcgbmFtZSBhbmQKKyAgICAvLyAgIHZhbHVlLgorICAgIGNvbnN0IGNoYXIqIGVxdWFsc19wb3MgPSBzdHJjaHIoYXJnLCAnPScpOworICAgIGlmIChlcXVhbHNfcG9zICE9IE5VTEwpIHsKKyAgICAgICpuYW1lID0gc3RyaW5nKGFyZywgZXF1YWxzX3BvcyAtIGFyZyk7CisgICAgICAqdmFsdWUgPSBlcXVhbHNfcG9zICsgMTsKKyAgICAgIHBhcnNlZF92YWx1ZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICpuYW1lID0gYXJnOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBPbmUgZGFzaDogIE9uZS1jaGFyYWN0ZXIgbmFtZSwgYWxsIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBhcmUgdGhlCisgICAgLy8gICB2YWx1ZS4KKyAgICBpZiAoYXJnWzFdID09ICdcMCcpIHsKKyAgICAgIC8vIGFyZyBpcyBqdXN0ICItIi4gIFdlIHRyZWF0IHRoaXMgYXMgYW4gaW5wdXQgZmlsZSwgZXhjZXB0IHRoYXQgYXQKKyAgICAgIC8vIHByZXNlbnQgdGhpcyB3aWxsIGp1c3QgbGVhZCB0byBhICJmaWxlIG5vdCBmb3VuZCIgZXJyb3IuCisgICAgICBuYW1lLT5jbGVhcigpOworICAgICAgKnZhbHVlID0gYXJnOworICAgICAgcGFyc2VkX3ZhbHVlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgKm5hbWUgPSBzdHJpbmcoYXJnLCAyKTsKKyAgICAgICp2YWx1ZSA9IGFyZyArIDI7CisgICAgICBwYXJzZWRfdmFsdWUgPSAhdmFsdWUtPmVtcHR5KCk7CisgICAgfQorICB9CisKKyAgLy8gTmVlZCB0byByZXR1cm4gdHJ1ZSBpZmYgdGhlIG5leHQgYXJnIHNob3VsZCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhpcworICAvLyBvbmUsIGZhbHNlIG90aGVyd2lzZS4KKworICBpZiAocGFyc2VkX3ZhbHVlKSB7CisgICAgLy8gV2UgYWxyZWFkeSBwYXJzZWQgYSB2YWx1ZSBmb3IgdGhpcyBmbGFnLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICgqbmFtZSA9PSAiLWgiIHx8ICpuYW1lID09ICItLWhlbHAiIHx8CisgICAgICAqbmFtZSA9PSAiLS1kaXNhbGxvd19zZXJ2aWNlcyIgfHwKKyAgICAgICpuYW1lID09ICItLWluY2x1ZGVfaW1wb3J0cyIgfHwKKyAgICAgICpuYW1lID09ICItLWluY2x1ZGVfc291cmNlX2luZm8iIHx8CisgICAgICAqbmFtZSA9PSAiLS12ZXJzaW9uIiB8fAorICAgICAgKm5hbWUgPT0gIi0tZGVjb2RlX3JhdyIpIHsKKyAgICAvLyBIQUNLOiAgVGhlc2UgYXJlIHRoZSBvbmx5IGZsYWdzIHRoYXQgZG9uJ3QgdGFrZSBhIHZhbHVlLgorICAgIC8vICAgVGhleSBwcm9iYWJseSBzaG91bGQgbm90IGJlIGhhcmQtY29kZWQgbGlrZSB0aGlzIGJ1dCBmb3Igbm93IGl0J3MKKyAgICAvLyAgIG5vdCB3b3J0aCBkb2luZyBiZXR0ZXIuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gTmV4dCBhcmd1bWVudCBpcyB0aGUgZmxhZyB2YWx1ZS4KKyAgcmV0dXJuIHRydWU7Cit9CisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50U3RhdHVzCitDb21tYW5kTGluZUludGVyZmFjZTo6SW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgIC8vIE5vdCBhIGZsYWcuICBKdXN0IGEgZmlsZW5hbWUuCisgICAgaWYgKHZhbHVlLmVtcHR5KCkpIHsKKyAgICAgIGNlcnIgPDwgIllvdSBzZWVtIHRvIGhhdmUgcGFzc2VkIGFuIGVtcHR5IHN0cmluZyBhcyBvbmUgb2YgdGhlICIKKyAgICAgICAgICAgICAgImFyZ3VtZW50cyB0byAiIDw8IGV4ZWN1dGFibGVfbmFtZV8gPDwgIi4gIFRoaXMgaXMgYWN0dWFsbHkgIgorICAgICAgICAgICAgICAic29ydCBvZiBoYXJkIHRvIGRvLiAgQ29uZ3JhdHMuICBVbmZvcnR1bmF0ZWx5IGl0IGlzIG5vdCB2YWxpZCAiCisgICAgICAgICAgICAgICJpbnB1dCBzbyB0aGUgcHJvZ3JhbSBpcyBnb2luZyB0byBkaWUgbm93LiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKworICAgIGlucHV0X2ZpbGVzXy5wdXNoX2JhY2sodmFsdWUpOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLUkiIHx8IG5hbWUgPT0gIi0tcHJvdG9fcGF0aCIpIHsKKyAgICAvLyBKYXZhJ3MgLWNsYXNzcGF0aCAoYW5kIHNvbWUgb3RoZXIgbGFuZ3VhZ2VzKSBkZWxpbWl0cyBwYXRoIGNvbXBvbmVudHMKKyAgICAvLyB3aXRoIGNvbG9ucy4gIExldCdzIGFjY2VwdCB0aGF0IHN5bnRheCB0b28ganVzdCB0byBtYWtlIHRoaW5ncyBtb3JlCisgICAgLy8gaW50dWl0aXZlLgorICAgIHZlY3RvcjxzdHJpbmc+IHBhcnRzOworICAgIFNwbGl0U3RyaW5nVXNpbmcodmFsdWUsIGtQYXRoU2VwYXJhdG9yLCAmcGFydHMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5zaXplKCk7IGkrKykgeworICAgICAgc3RyaW5nIHZpcnR1YWxfcGF0aDsKKyAgICAgIHN0cmluZyBkaXNrX3BhdGg7CisKKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIGVxdWFsc19wb3MgPSBwYXJ0c1tpXS5maW5kX2ZpcnN0X29mKCc9Jyk7CisgICAgICBpZiAoZXF1YWxzX3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgdmlydHVhbF9wYXRoID0gIiI7CisgICAgICAgIGRpc2tfcGF0aCA9IHBhcnRzW2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmlydHVhbF9wYXRoID0gcGFydHNbaV0uc3Vic3RyKDAsIGVxdWFsc19wb3MpOworICAgICAgICBkaXNrX3BhdGggPSBwYXJ0c1tpXS5zdWJzdHIoZXF1YWxzX3BvcyArIDEpOworICAgICAgfQorCisgICAgICBpZiAoZGlza19wYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgY2VyciA8PCAiLS1wcm90b19wYXRoIHBhc3NlZCBlbXB0eSBkaXJlY3RvcnkgbmFtZS4gIChVc2UgXCIuXCIgZm9yICIKKyAgICAgICAgICAgICAgICAiY3VycmVudCBkaXJlY3RvcnkuKSIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2Ugc3VyZSBkaXNrIHBhdGggZXhpc3RzLCB3YXJuIG90aGVyd2lzZS4KKyAgICAgIGlmIChhY2Nlc3MoZGlza19wYXRoLmNfc3RyKCksIEZfT0spIDwgMCkgeworICAgICAgICBjZXJyIDw8IGRpc2tfcGF0aCA8PCAiOiB3YXJuaW5nOiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBEb24ndCB1c2UgbWFrZV9wYWlyIGFzIHRoZSBvbGQvZGVmYXVsdCBzdGFuZGFyZCBsaWJyYXJ5IG9uIFNvbGFyaXMKKyAgICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBpdCB3aXRob3V0IGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIHdoaWNoIGFyZQorICAgICAgLy8gaW5jb21wYXRpYmxlIHdpdGggQysrMHgncyBtYWtlX3BhaXIuCisgICAgICBwcm90b19wYXRoXy5wdXNoX2JhY2socGFpcjxzdHJpbmcsIHN0cmluZz4odmlydHVhbF9wYXRoLCBkaXNrX3BhdGgpKTsKKyAgICB9CisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItbyIgfHwgbmFtZSA9PSAiLS1kZXNjcmlwdG9yX3NldF9vdXQiKSB7CisgICAgaWYgKCFkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7CisgICAgICBjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisgICAgaWYgKHZhbHVlLmVtcHR5KCkpIHsKKyAgICAgIGNlcnIgPDwgbmFtZSA8PCAiIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHZhbHVlLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7CisgICAgICBjZXJyIDw8ICJDYW5ub3QgdXNlIC0tZW5jb2RlIG9yIC0tZGVjb2RlIGFuZCBnZW5lcmF0ZSBkZXNjcmlwdG9ycyBhdCB0aGUgIgorICAgICAgICAgICAgICAic2FtZSB0aW1lLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBkZXNjcmlwdG9yX3NldF9uYW1lXyA9IHZhbHVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1pbmNsdWRlX2ltcG9ydHMiKSB7CisgICAgaWYgKGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfKSB7CisgICAgICBjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisgICAgaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8gPSB0cnVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1pbmNsdWRlX3NvdXJjZV9pbmZvIikgeworICAgIGlmIChzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8pIHsKKyAgICAgIGNlcnIgPDwgbmFtZSA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8gPSB0cnVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLWgiIHx8IG5hbWUgPT0gIi0taGVscCIpIHsKKyAgICBQcmludEhlbHBUZXh0KCk7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0VYSVQ7ICAvLyBFeGl0IHdpdGhvdXQgcnVubmluZyBjb21waWxlci4KKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tdmVyc2lvbiIpIHsKKyAgICBpZiAoIXZlcnNpb25faW5mb18uZW1wdHkoKSkgeworICAgICAgY291dCA8PCB2ZXJzaW9uX2luZm9fIDw8IGVuZGw7CisgICAgfQorICAgIGNvdXQgPDwgImxpYnByb3RvYyAiCisgICAgICAgICA8PCBwcm90b2J1Zjo6aW50ZXJuYWw6OlZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pCisgICAgICAgICA8PCBlbmRsOworICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9FWElUOyAgLy8gRXhpdCB3aXRob3V0IHJ1bm5pbmcgY29tcGlsZXIuCisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItLWRpc2FsbG93X3NlcnZpY2VzIikgeworICAgIGRpc2FsbG93X3NlcnZpY2VzXyA9IHRydWU7CisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItLWVuY29kZSIgfHwgbmFtZSA9PSAiLS1kZWNvZGUiIHx8CisgICAgICAgICAgICAgbmFtZSA9PSAiLS1kZWNvZGVfcmF3IikgeworICAgIGlmIChtb2RlXyAhPSBNT0RFX0NPTVBJTEUpIHsKKyAgICAgIGNlcnIgPDwgIk9ubHkgb25lIG9mIC0tZW5jb2RlIGFuZCAtLWRlY29kZSBjYW4gYmUgc3BlY2lmaWVkLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBpZiAoIW91dHB1dF9kaXJlY3RpdmVzXy5lbXB0eSgpIHx8ICFkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7CisgICAgICBjZXJyIDw8ICJDYW5ub3QgdXNlICIgPDwgbmFtZQorICAgICAgICAgICA8PCAiIGFuZCBnZW5lcmF0ZSBjb2RlIG9yIGRlc2NyaXB0b3JzIGF0IHRoZSBzYW1lIHRpbWUuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorCisgICAgbW9kZV8gPSAobmFtZSA9PSAiLS1lbmNvZGUiKSA/IE1PREVfRU5DT0RFIDogTU9ERV9ERUNPREU7CisKKyAgICBpZiAodmFsdWUuZW1wdHkoKSAmJiBuYW1lICE9ICItLWRlY29kZV9yYXciKSB7CisgICAgICBjZXJyIDw8ICJUeXBlIG5hbWUgZm9yICIgPDwgbmFtZSA8PCAiIGNhbm5vdCBiZSBibGFuay4iIDw8IGVuZGw7CisgICAgICBpZiAobmFtZSA9PSAiLS1kZWNvZGUiKSB7CisgICAgICAgIGNlcnIgPDwgIlRvIGRlY29kZSBhbiB1bmtub3duIG1lc3NhZ2UsIHVzZSAtLWRlY29kZV9yYXcuIiA8PCBlbmRsOworICAgICAgfQorICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfSBlbHNlIGlmICghdmFsdWUuZW1wdHkoKSAmJiBuYW1lID09ICItLWRlY29kZV9yYXciKSB7CisgICAgICBjZXJyIDw8ICItLWRlY29kZV9yYXcgZG9lcyBub3QgdGFrZSBhIHBhcmFtZXRlci4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisKKyAgICBjb2RlY190eXBlXyA9IHZhbHVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1lcnJvcl9mb3JtYXQiKSB7CisgICAgaWYgKHZhbHVlID09ICJnY2MiKSB7CisgICAgICBlcnJvcl9mb3JtYXRfID0gRVJST1JfRk9STUFUX0dDQzsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJtc3ZzIikgeworICAgICAgZXJyb3JfZm9ybWF0XyA9IEVSUk9SX0ZPUk1BVF9NU1ZTOworICAgIH0gZWxzZSB7CisgICAgICBjZXJyIDw8ICJVbmtub3duIGVycm9yIGZvcm1hdDogIiA8PCB2YWx1ZSA8PCBlbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1wbHVnaW4iKSB7CisgICAgaWYgKHBsdWdpbl9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICAgIGNlcnIgPDwgIlRoaXMgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBwbHVnaW5zLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKworICAgIHN0cmluZyBwbHVnaW5fbmFtZTsKKyAgICBzdHJpbmcgcGF0aDsKKworICAgIHN0cmluZzo6c2l6ZV90eXBlIGVxdWFsc19wb3MgPSB2YWx1ZS5maW5kX2ZpcnN0X29mKCc9Jyk7CisgICAgaWYgKGVxdWFsc19wb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBVc2UgdGhlIGJhc2VuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2hfcG9zID0gdmFsdWUuZmluZF9sYXN0X29mKCcvJyk7CisgICAgICBpZiAoc2xhc2hfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgICBwbHVnaW5fbmFtZSA9IHZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGx1Z2luX25hbWUgPSB2YWx1ZS5zdWJzdHIoc2xhc2hfcG9zICsgMSk7CisgICAgICB9CisgICAgICBwYXRoID0gdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHBsdWdpbl9uYW1lID0gdmFsdWUuc3Vic3RyKDAsIGVxdWFsc19wb3MpOworICAgICAgcGF0aCA9IHZhbHVlLnN1YnN0cihlcXVhbHNfcG9zICsgMSk7CisgICAgfQorCisgICAgcGx1Z2luc19bcGx1Z2luX25hbWVdID0gcGF0aDsKKworICB9IGVsc2UgeworICAgIC8vIFNvbWUgb3RoZXIgZmxhZy4gIExvb2sgaXQgdXAgaW4gdGhlIGdlbmVyYXRvcnMgbGlzdC4KKyAgICBjb25zdCBHZW5lcmF0b3JJbmZvKiBnZW5lcmF0b3JfaW5mbyA9CisgICAgICAgIEZpbmRPck51bGwoZ2VuZXJhdG9yc19ieV9mbGFnX25hbWVfLCBuYW1lKTsKKyAgICBpZiAoZ2VuZXJhdG9yX2luZm8gPT0gTlVMTCAmJgorICAgICAgICAocGx1Z2luX3ByZWZpeF8uZW1wdHkoKSB8fCAhSGFzU3VmZml4U3RyaW5nKG5hbWUsICJfb3V0IikpKSB7CisgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgZ2VuZXJhdG9yIG9wdGlvbiBmbGFnLgorICAgICAgZ2VuZXJhdG9yX2luZm8gPSBGaW5kT3JOdWxsKGdlbmVyYXRvcnNfYnlfb3B0aW9uX25hbWVfLCBuYW1lKTsKKyAgICAgIGlmIChnZW5lcmF0b3JfaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGNlcnIgPDwgIlVua25vd24gZmxhZzogIiA8PCBuYW1lIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nKiBwYXJhbWV0ZXJzID0gJmdlbmVyYXRvcl9wYXJhbWV0ZXJzX1tnZW5lcmF0b3JfaW5mby0+ZmxhZ19uYW1lXTsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJzLT5lbXB0eSgpKSB7CisgICAgICAgICAgcGFyYW1ldGVycy0+YXBwZW5kKCIsIik7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1ldGVycy0+YXBwZW5kKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSXQncyBhbiBvdXRwdXQgZmxhZy4gIEFkZCBpdCB0byB0aGUgb3V0cHV0IGRpcmVjdGl2ZXMuCisgICAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7CisgICAgICAgIGNlcnIgPDwgIkNhbm5vdCB1c2UgLS1lbmNvZGUgb3IgLS1kZWNvZGUgYW5kIGdlbmVyYXRlIGNvZGUgYXQgdGhlICIKKyAgICAgICAgICAgICAgICAic2FtZSB0aW1lLiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgICB9CisKKyAgICAgIE91dHB1dERpcmVjdGl2ZSBkaXJlY3RpdmU7CisgICAgICBkaXJlY3RpdmUubmFtZSA9IG5hbWU7CisgICAgICBpZiAoZ2VuZXJhdG9yX2luZm8gPT0gTlVMTCkgeworICAgICAgICBkaXJlY3RpdmUuZ2VuZXJhdG9yID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpcmVjdGl2ZS5nZW5lcmF0b3IgPSBnZW5lcmF0b3JfaW5mby0+Z2VuZXJhdG9yOworICAgICAgfQorCisgICAgICAvLyBTcGxpdCB2YWx1ZSBhdCAnOicgdG8gc2VwYXJhdGUgdGhlIGdlbmVyYXRvciBwYXJhbWV0ZXIgZnJvbSB0aGUKKyAgICAgIC8vIGZpbGVuYW1lLiAgSG93ZXZlciwgYXZvaWQgZG9pbmcgdGhpcyBpZiB0aGUgY29sb24gaXMgcGFydCBvZiBhIHZhbGlkCisgICAgICAvLyBXaW5kb3dzLXN0eWxlIGFic29sdXRlIHBhdGguCisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvbl9wb3MgPSB2YWx1ZS5maW5kX2ZpcnN0X29mKCc6Jyk7CisgICAgICBpZiAoY29sb25fcG9zID09IHN0cmluZzo6bnBvcyB8fCBJc1dpbmRvd3NBYnNvbHV0ZVBhdGgodmFsdWUpKSB7CisgICAgICAgIGRpcmVjdGl2ZS5vdXRwdXRfbG9jYXRpb24gPSB2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpcmVjdGl2ZS5wYXJhbWV0ZXIgPSB2YWx1ZS5zdWJzdHIoMCwgY29sb25fcG9zKTsKKyAgICAgICAgZGlyZWN0aXZlLm91dHB1dF9sb2NhdGlvbiA9IHZhbHVlLnN1YnN0cihjb2xvbl9wb3MgKyAxKTsKKyAgICAgIH0KKworICAgICAgb3V0cHV0X2RpcmVjdGl2ZXNfLnB1c2hfYmFjayhkaXJlY3RpdmUpOworICAgIH0KKyAgfQorCisgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9DT05USU5VRTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UHJpbnRIZWxwVGV4dCgpIHsKKyAgLy8gU29ycnkgZm9yIGluZGVudGF0aW9uIGhlcmU7IGxpbmUgd3JhcHBpbmcgd291bGQgYmUgdWdsaWVyLgorICBjZXJyIDw8CisiVXNhZ2U6ICIgPDwgZXhlY3V0YWJsZV9uYW1lXyA8PCAiIFtPUFRJT05dIFBST1RPX0ZJTEVTXG4iCisiUGFyc2UgUFJPVE9fRklMRVMgYW5kIGdlbmVyYXRlIG91dHB1dCBiYXNlZCBvbiB0aGUgb3B0aW9ucyBnaXZlbjpcbiIKKyIgIC1JUEFUSCwgLS1wcm90b19wYXRoPVBBVEggICBTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2VhcmNoIGZvclxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydHMuICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzO1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIHdpbGwgYmUgc2VhcmNoZWQgaW4gb3JkZXIuICBJZiBub3RcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiwgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgdXNlZC5cbiIKKyIgIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICBTaG93IHZlcnNpb24gaW5mbyBhbmQgZXhpdC5cbiIKKyIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICBTaG93IHRoaXMgdGV4dCBhbmQgZXhpdC5cbiIKKyIgIC0tZW5jb2RlPU1FU1NBR0VfVFlQRSAgICAgICBSZWFkIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlIGl0IGluIGJpbmFyeVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBtZXNzYWdlIHR5cGUgbXVzdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGRlZmluZWQgaW4gUFJPVE9fRklMRVMgb3IgdGhlaXIgaW1wb3J0cy5cbiIKKyIgIC0tZGVjb2RlPU1FU1NBR0VfVFlQRSAgICAgICBSZWFkIGEgYmluYXJ5IG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZSBpdCBpbiB0ZXh0IGZvcm1hdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBtZXNzYWdlIHR5cGUgbXVzdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGRlZmluZWQgaW4gUFJPVE9fRklMRVMgb3IgdGhlaXIgaW1wb3J0cy5cbiIKKyIgIC0tZGVjb2RlX3JhdyAgICAgICAgICAgICAgICBSZWFkIGFuIGFyYml0cmFyeSBwcm90b2NvbCBtZXNzYWdlIGZyb21cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGUgdGhlIHJhdyB0YWcvdmFsdWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlycyBpbiB0ZXh0IGZvcm1hdCB0byBzdGFuZGFyZCBvdXRwdXQuICBOb1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPX0ZJTEVTIHNob3VsZCBiZSBnaXZlbiB3aGVuIHVzaW5nIHRoaXNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLlxuIgorIiAgLW9GSUxFLCAgICAgICAgICAgICAgICAgICAgIFdyaXRlcyBhIEZpbGVEZXNjcmlwdG9yU2V0IChhIHByb3RvY29sIGJ1ZmZlcixcbiIKKyIgICAgLS1kZXNjcmlwdG9yX3NldF9vdXQ9RklMRSBkZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8pIGNvbnRhaW5pbmcgYWxsIG9mXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IGZpbGVzIHRvIEZJTEUuXG4iCisiICAtLWluY2x1ZGVfaW1wb3J0cyAgICAgICAgICAgV2hlbiB1c2luZyAtLWRlc2NyaXB0b3Jfc2V0X291dCwgYWxzbyBpbmNsdWRlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGRlcGVuZGVuY2llcyBvZiB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCBzbyB0aGF0IHRoZSBzZXQgaXMgc2VsZi1jb250YWluZWQuXG4iCisiICAtLWluY2x1ZGVfc291cmNlX2luZm8gICAgICAgV2hlbiB1c2luZyAtLWRlc2NyaXB0b3Jfc2V0X291dCwgZG8gbm90IHN0cmlwXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlQ29kZUluZm8gZnJvbSB0aGUgRmlsZURlc2NyaXB0b3JQcm90by5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gdmFzdGx5IGxhcmdlciBkZXNjcmlwdG9ycyB0aGF0XG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiBvZiBlYWNoIGRlY2wgaW4gdGhlIHNvdXJjZSBmaWxlIGFzXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VsbCBhcyBzdXJyb3VuZGluZyBjb21tZW50cy5cbiIKKyIgIC0tZXJyb3JfZm9ybWF0PUZPUk1BVCAgICAgICBTZXQgdGhlIGZvcm1hdCBpbiB3aGljaCB0byBwcmludCBlcnJvcnMuXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIG1heSBiZSAnZ2NjJyAodGhlIGRlZmF1bHQpIG9yICdtc3ZzJ1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBmb3JtYXQpLiIgPDwgZW5kbDsKKyAgaWYgKCFwbHVnaW5fcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgY2VyciA8PAorIiAgLS1wbHVnaW49RVhFQ1VUQUJMRSAgICAgICAgIFNwZWNpZmllcyBhIHBsdWdpbiBleGVjdXRhYmxlIHRvIHVzZS5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxseSwgcHJvdG9jIHNlYXJjaGVzIHRoZSBQQVRIIGZvclxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnMsIGJ1dCB5b3UgbWF5IHNwZWNpZnkgYWRkaXRpb25hbFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVzIG5vdCBpbiB0aGUgcGF0aCB1c2luZyB0aGlzIGZsYWcuXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBFWEVDVVRBQkxFIG1heSBiZSBvZiB0aGUgZm9ybVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUU9UEFUSCwgaW4gd2hpY2ggY2FzZSB0aGUgZ2l2ZW4gcGx1Z2luIG5hbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuIGV4ZWN1dGFibGUgZXZlbiBpZlxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBleGVjdXRhYmxlJ3Mgb3duIG5hbWUgZGlmZmVycy4iIDw8IGVuZGw7CisgIH0KKworICBmb3IgKEdlbmVyYXRvck1hcDo6aXRlcmF0b3IgaXRlciA9IGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gZ2VuZXJhdG9yc19ieV9mbGFnX25hbWVfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAvLyBGSVhNRShrZW50b24pOiAgSWYgdGhlIHRleHQgaXMgbG9uZyBlbm91Z2ggaXQgd2lsbCB3cmFwLCB3aGljaCBpcyB1Z2x5LAorICAgIC8vICAgYnV0IGZpeGluZyB0aGlzIG5pY2VseSAoZS5nLiBzcGxpdHRpbmcgb24gc3BhY2VzKSBpcyBwcm9iYWJseSBtb3JlCisgICAgLy8gICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4KKyAgICBjZXJyIDw8ICIgICIgPDwgaXRlci0+Zmlyc3QgPDwgIj1PVVRfRElSICIKKyAgICAgICAgIDw8IHN0cmluZygxOSAtIGl0ZXItPmZpcnN0LnNpemUoKSwgJyAnKSAgLy8gU3BhY2VzIGZvciBhbGlnbm1lbnQuCisgICAgICAgICA8PCBpdGVyLT5zZWNvbmQuaGVscF90ZXh0IDw8IGVuZGw7CisgIH0KK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdGVPdXRwdXQoCisgICAgY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcywKKyAgICBjb25zdCBPdXRwdXREaXJlY3RpdmUmIG91dHB1dF9kaXJlY3RpdmUsCisgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQpIHsKKyAgLy8gQ2FsbCB0aGUgZ2VuZXJhdG9yLgorICBzdHJpbmcgZXJyb3I7CisgIGlmIChvdXRwdXRfZGlyZWN0aXZlLmdlbmVyYXRvciA9PSBOVUxMKSB7CisgICAgLy8gVGhpcyBpcyBhIHBsdWdpbi4KKyAgICBHT09HTEVfQ0hFQ0soSGFzUHJlZml4U3RyaW5nKG91dHB1dF9kaXJlY3RpdmUubmFtZSwgIi0tIikgJiYKKyAgICAgICAgICBIYXNTdWZmaXhTdHJpbmcob3V0cHV0X2RpcmVjdGl2ZS5uYW1lLCAiX291dCIpKQorICAgICAgICA8PCAiQmFkIG5hbWUgZm9yIHBsdWdpbiBnZW5lcmF0b3I6ICIgPDwgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lOworCisgICAgLy8gU3RyaXAgdGhlICItLSIgYW5kICJfb3V0IiBhbmQgYWRkIHRoZSBwbHVnaW4gcHJlZml4LgorICAgIHN0cmluZyBwbHVnaW5fbmFtZSA9IHBsdWdpbl9wcmVmaXhfICsgImdlbi0iICsKKyAgICAgICAgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lLnN1YnN0cigyLCBvdXRwdXRfZGlyZWN0aXZlLm5hbWUuc2l6ZSgpIC0gNik7CisKKyAgICBpZiAoIUdlbmVyYXRlUGx1Z2luT3V0cHV0KHBhcnNlZF9maWxlcywgcGx1Z2luX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyZWN0aXZlLnBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LCAmZXJyb3IpKSB7CisgICAgICBjZXJyIDw8IG91dHB1dF9kaXJlY3RpdmUubmFtZSA8PCAiOiAiIDw8IGVycm9yIDw8IGVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFJlZ3VsYXIgZ2VuZXJhdG9yLgorICAgIHN0cmluZyBwYXJhbWV0ZXJzID0gb3V0cHV0X2RpcmVjdGl2ZS5wYXJhbWV0ZXI7CisgICAgaWYgKCFnZW5lcmF0b3JfcGFyYW1ldGVyc19bb3V0cHV0X2RpcmVjdGl2ZS5uYW1lXS5lbXB0eSgpKSB7CisgICAgICBpZiAoIXBhcmFtZXRlcnMuZW1wdHkoKSkgeworICAgICAgICBwYXJhbWV0ZXJzLmFwcGVuZCgiLCIpOworICAgICAgfQorICAgICAgcGFyYW1ldGVycy5hcHBlbmQoZ2VuZXJhdG9yX3BhcmFtZXRlcnNfW291dHB1dF9kaXJlY3RpdmUubmFtZV0pOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKCFvdXRwdXRfZGlyZWN0aXZlLmdlbmVyYXRvci0+R2VuZXJhdGUocGFyc2VkX2ZpbGVzW2ldLCBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQsICZlcnJvcikpIHsKKyAgICAgICAgLy8gR2VuZXJhdG9yIHJldHVybmVkIGFuIGVycm9yLgorICAgICAgICBjZXJyIDw8IG91dHB1dF9kaXJlY3RpdmUubmFtZSA8PCAiOiAiIDw8IHBhcnNlZF9maWxlc1tpXS0+bmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICAgICA8PCBlcnJvciA8PCBlbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRlUGx1Z2luT3V0cHV0KAorICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgY29uc3Qgc3RyaW5nJiBwbHVnaW5fbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICBzdHJpbmcqIGVycm9yKSB7CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlcXVlc3Q7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSByZXNwb25zZTsKKworICAvLyBCdWlsZCB0aGUgcmVxdWVzdC4KKyAgaWYgKCFwYXJhbWV0ZXIuZW1wdHkoKSkgeworICAgIHJlcXVlc3Quc2V0X3BhcmFtZXRlcihwYXJhbWV0ZXIpOworICB9CisKKyAgc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gYWxyZWFkeV9zZWVuOworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgeworICAgIHJlcXVlc3QuYWRkX2ZpbGVfdG9fZ2VuZXJhdGUocGFyc2VkX2ZpbGVzW2ldLT5uYW1lKCkpOworICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMocGFyc2VkX2ZpbGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIEluY2x1ZGUgc291cmNlIGNvZGUgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHJlYWR5X3NlZW4sIHJlcXVlc3QubXV0YWJsZV9wcm90b19maWxlKCkpOworICB9CisKKyAgLy8gSW52b2tlIHRoZSBwbHVnaW4uCisgIFN1YnByb2Nlc3Mgc3VicHJvY2VzczsKKworICBpZiAocGx1Z2luc18uY291bnQocGx1Z2luX25hbWUpID4gMCkgeworICAgIHN1YnByb2Nlc3MuU3RhcnQocGx1Z2luc19bcGx1Z2luX25hbWVdLCBTdWJwcm9jZXNzOjpFWEFDVF9OQU1FKTsKKyAgfSBlbHNlIHsKKyAgICBzdWJwcm9jZXNzLlN0YXJ0KHBsdWdpbl9uYW1lLCBTdWJwcm9jZXNzOjpTRUFSQ0hfUEFUSCk7CisgIH0KKworICBzdHJpbmcgY29tbXVuaWNhdGVfZXJyb3I7CisgIGlmICghc3VicHJvY2Vzcy5Db21tdW5pY2F0ZShyZXF1ZXN0LCAmcmVzcG9uc2UsICZjb21tdW5pY2F0ZV9lcnJvcikpIHsKKyAgICAqZXJyb3IgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKCIkMDogJDEiLCBwbHVnaW5fbmFtZSwgY29tbXVuaWNhdGVfZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBmaWxlcy4gIFdlIGRvIHRoaXMgZXZlbiBpZiB0aGVyZSB3YXMgYSBnZW5lcmF0b3IgZXJyb3IgaW4gb3JkZXIKKyAgLy8gdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9mIGEgY29tcGlsZWQtaW4gZ2VuZXJhdG9yLgorICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gY3VycmVudF9vdXRwdXQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2UuZmlsZV9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6RmlsZSYgb3V0cHV0X2ZpbGUgPSByZXNwb25zZS5maWxlKGkpOworCisgICAgaWYgKCFvdXRwdXRfZmlsZS5pbnNlcnRpb25fcG9pbnQoKS5lbXB0eSgpKSB7CisgICAgICAvLyBPcGVuIGEgZmlsZSBmb3IgaW5zZXJ0LgorICAgICAgLy8gV2UgcmVzZXQgY3VycmVudF9vdXRwdXQgdG8gTlVMTCBmaXJzdCBzbyB0aGF0IHRoZSBvbGQgZmlsZSBpcyBjbG9zZWQKKyAgICAgIC8vIGJlZm9yZSB0aGUgbmV3IG9uZSBpcyBvcGVuZWQuCisgICAgICBjdXJyZW50X291dHB1dC5yZXNldCgpOworICAgICAgY3VycmVudF9vdXRwdXQucmVzZXQoZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW5Gb3JJbnNlcnQoCisgICAgICAgICAgb3V0cHV0X2ZpbGUubmFtZSgpLCBvdXRwdXRfZmlsZS5pbnNlcnRpb25fcG9pbnQoKSkpOworICAgIH0gZWxzZSBpZiAoIW91dHB1dF9maWxlLm5hbWUoKS5lbXB0eSgpKSB7CisgICAgICAvLyBTdGFydGluZyBhIG5ldyBmaWxlLiAgT3BlbiBpdC4KKyAgICAgIC8vIFdlIHJlc2V0IGN1cnJlbnRfb3V0cHV0IHRvIE5VTEwgZmlyc3Qgc28gdGhhdCB0aGUgb2xkIGZpbGUgaXMgY2xvc2VkCisgICAgICAvLyBiZWZvcmUgdGhlIG5ldyBvbmUgaXMgb3BlbmVkLgorICAgICAgY3VycmVudF9vdXRwdXQucmVzZXQoKTsKKyAgICAgIGN1cnJlbnRfb3V0cHV0LnJlc2V0KGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKG91dHB1dF9maWxlLm5hbWUoKSkpOworICAgIH0gZWxzZSBpZiAoY3VycmVudF9vdXRwdXQgPT0gTlVMTCkgeworICAgICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgIiQwOiBGaXJzdCBmaWxlIGNodW5rIHJldHVybmVkIGJ5IHBsdWdpbiBkaWQgbm90IHNwZWNpZnkgYSBmaWxlIG5hbWUuIiwKKyAgICAgICAgcGx1Z2luX25hbWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFVzZSBDb2RlZE91dHB1dFN0cmVhbSBmb3IgY29udmVuaWVuY2U7IG90aGVyd2lzZSB3ZSdkIG5lZWQgdG8gcHJvdmlkZQorICAgIC8vIG91ciBvd24gYnVmZmVyLWNvcHlpbmcgbG9vcC4KKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gd3JpdGVyKGN1cnJlbnRfb3V0cHV0LmdldCgpKTsKKyAgICB3cml0ZXIuV3JpdGVTdHJpbmcob3V0cHV0X2ZpbGUuY29udGVudCgpKTsKKyAgfQorCisgIC8vIENoZWNrIGZvciBlcnJvcnMuCisgIGlmICghcmVzcG9uc2UuZXJyb3IoKS5lbXB0eSgpKSB7CisgICAgLy8gR2VuZXJhdG9yIHJldHVybmVkIGFuIGVycm9yLgorICAgICplcnJvciA9IHJlc3BvbnNlLmVycm9yKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkVuY29kZU9yRGVjb2RlKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgIC8vIExvb2sgdXAgdGhlIHR5cGUuCisgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUgPSBwb29sLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29kZWNfdHlwZV8pOworICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgY2VyciA8PCAiVHlwZSBub3QgZGVmaW5lZDogIiA8PCBjb2RlY190eXBlXyA8PCBlbmRsOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBkeW5hbWljX2ZhY3RvcnkocG9vbCk7CisgIHNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShkeW5hbWljX2ZhY3RvcnkuR2V0UHJvdG90eXBlKHR5cGUpLT5OZXcoKSk7CisKKyAgaWYgKG1vZGVfID09IE1PREVfRU5DT0RFKSB7CisgICAgU2V0RmRUb1RleHRNb2RlKFNURElOX0ZJTEVOTyk7CisgICAgU2V0RmRUb0JpbmFyeU1vZGUoU1RET1VUX0ZJTEVOTyk7CisgIH0gZWxzZSB7CisgICAgU2V0RmRUb0JpbmFyeU1vZGUoU1RESU5fRklMRU5PKTsKKyAgICBTZXRGZFRvVGV4dE1vZGUoU1RET1VUX0ZJTEVOTyk7CisgIH0KKworICBpbzo6RmlsZUlucHV0U3RyZWFtIGluKFNURElOX0ZJTEVOTyk7CisgIGlvOjpGaWxlT3V0cHV0U3RyZWFtIG91dChTVERPVVRfRklMRU5PKTsKKworICBpZiAobW9kZV8gPT0gTU9ERV9FTkNPREUpIHsKKyAgICAvLyBJbnB1dCBpcyB0ZXh0LgorICAgIEVycm9yUHJpbnRlciBlcnJvcl9jb2xsZWN0b3IoZXJyb3JfZm9ybWF0Xyk7CisgICAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcik7CisgICAgcGFyc2VyLkFsbG93UGFydGlhbE1lc3NhZ2UodHJ1ZSk7CisKKyAgICBpZiAoIXBhcnNlci5QYXJzZSgmaW4sIG1lc3NhZ2UuZ2V0KCkpKSB7CisgICAgICBjZXJyIDw8ICJGYWlsZWQgdG8gcGFyc2UgaW5wdXQuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBJbnB1dCBpcyBiaW5hcnkuCisgICAgaWYgKCFtZXNzYWdlLT5QYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oJmluKSkgeworICAgICAgY2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIGlucHV0LiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAoIW1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSkgeworICAgIGNlcnIgPDwgIndhcm5pbmc6ICBJbnB1dCBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAgIgorICAgICAgICAgPDwgbWVzc2FnZS0+SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIDw8IGVuZGw7CisgIH0KKworICBpZiAobW9kZV8gPT0gTU9ERV9FTkNPREUpIHsKKyAgICAvLyBPdXRwdXQgaXMgYmluYXJ5LgorICAgIGlmICghbWVzc2FnZS0+U2VyaWFsaXplUGFydGlhbFRvWmVyb0NvcHlTdHJlYW0oJm91dCkpIHsKKyAgICAgIGNlcnIgPDwgIm91dHB1dDogSS9PIGVycm9yLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gT3V0cHV0IGlzIHRleHQuCisgICAgaWYgKCFUZXh0Rm9ybWF0OjpQcmludCgqbWVzc2FnZSwgJm91dCkpIHsKKyAgICAgIGNlcnIgPDwgIm91dHB1dDogSS9PIGVycm9yLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6V3JpdGVEZXNjcmlwdG9yU2V0KAorICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlcykgeworICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX3NldDsKKworICBpZiAoaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8pIHsKKyAgICBzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBhbHJlYWR5X3NlZW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMocGFyc2VkX2ZpbGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHJlYWR5X3NlZW4sIGZpbGVfc2V0Lm11dGFibGVfZmlsZSgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGVfcHJvdG8gPSBmaWxlX3NldC5hZGRfZmlsZSgpOworICAgICAgcGFyc2VkX2ZpbGVzW2ldLT5Db3B5VG8oZmlsZV9wcm90byk7CisgICAgICBpZiAoc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfKSB7CisgICAgICAgIHBhcnNlZF9maWxlc1tpXS0+Q29weVNvdXJjZUNvZGVJbmZvVG8oZmlsZV9wcm90byk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50IGZkOworICBkbyB7CisgICAgZmQgPSBvcGVuKGRlc2NyaXB0b3Jfc2V0X25hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDY2Nik7CisgIH0gd2hpbGUgKGZkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKGZkIDwgMCkgeworICAgIHBlcnJvcihkZXNjcmlwdG9yX3NldF9uYW1lXy5jX3N0cigpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbzo6RmlsZU91dHB1dFN0cmVhbSBvdXQoZmQpOworICBpZiAoIWZpbGVfc2V0LlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oJm91dCkpIHsKKyAgICBjZXJyIDw8IGRlc2NyaXB0b3Jfc2V0X25hbWVfIDw8ICI6ICIgPDwgc3RyZXJyb3Iob3V0LkdldEVycm5vKCkpIDw8IGVuZGw7CisgICAgb3V0LkNsb3NlKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghb3V0LkNsb3NlKCkpIHsKKyAgICBjZXJyIDw8IGRlc2NyaXB0b3Jfc2V0X25hbWVfIDw8ICI6ICIgPDwgc3RyZXJyb3Iob3V0LkdldEVycm5vKCkpIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvLAorICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4sCisgICAgUmVwZWF0ZWRQdHJGaWVsZDxGaWxlRGVzY3JpcHRvclByb3RvPiogb3V0cHV0KSB7CisgIGlmICghYWxyZWFkeV9zZWVuLT5pbnNlcnQoZmlsZSkuc2Vjb25kKSB7CisgICAgLy8gQWxyZWFkeSBzYXcgdGhpcyBmaWxlLiAgU2tpcC4KKyAgICByZXR1cm47CisgIH0KKworICAvLyBBZGQgYWxsIGRlcGVuZGVuY2llcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoZmlsZS0+ZGVwZW5kZW5jeShpKSwgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeV9zZWVuLCBvdXRwdXQpOworICB9CisKKyAgLy8gQWRkIHRoaXMgZmlsZS4KKyAgRmlsZURlc2NyaXB0b3JQcm90byogbmV3X2Rlc2NyaXB0b3IgPSBvdXRwdXQtPkFkZCgpOworICBmaWxlLT5Db3B5VG8obmV3X2Rlc2NyaXB0b3IpOworICBpZiAoaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvKSB7CisgICAgZmlsZS0+Q29weVNvdXJjZUNvZGVJbmZvVG8obmV3X2Rlc2NyaXB0b3IpOworICB9Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzUzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBJbXBsZW1lbnRzIHRoZSBQcm90b2NvbCBDb21waWxlciBmcm9udC1lbmQgc3VjaCB0aGF0IGl0IG1heSBiZSByZXVzZWQgYnkKKy8vIGN1c3RvbSBjb21waWxlcnMgd3JpdHRlbiB0byBzdXBwb3J0IG90aGVyIGxhbmd1YWdlcy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09NTUFORF9MSU5FX0lOVEVSRkFDRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPTU1BTkRfTElORV9JTlRFUkZBQ0VfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRmlsZURlc2NyaXB0b3I7ICAgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIERlc2NyaXB0b3JQb29sOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvOyAgIC8vIGRlc2NyaXB0b3IucGIuaAordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZDsgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworY2xhc3MgQ29kZUdlbmVyYXRvcjsgICAgICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKK2NsYXNzIEdlbmVyYXRvckNvbnRleHQ7ICAgICAgLy8gY29kZV9nZW5lcmF0b3IuaAorY2xhc3MgRGlza1NvdXJjZVRyZWU7ICAgICAgIC8vIGltcG9ydGVyLmgKKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRvIHRoZSBwcm90b2NvbCBjb21waWxlci4KKy8vIEl0IGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgdmVyeSBlYXN5IHRvIGNyZWF0ZSBhIGN1c3RvbSBwcm90b2NvbCBjb21waWxlcgorLy8gc3VwcG9ydGluZyB0aGUgbGFuZ3VhZ2VzIG9mIHlvdXIgY2hvaWNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KKy8vIGNyZWF0ZSBhIGN1c3RvbSBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgd2hpY2ggaW5jbHVkZXMgYm90aCB0aGUgcmVndWxhcgorLy8gQysrIHN1cHBvcnQgcGx1cyBzdXBwb3J0IGZvciB5b3VyIG93biBjdXN0b20gb3V0cHV0ICJGb28iLCB5b3Ugd291bGQKKy8vIHdyaXRlIGEgY2xhc3MgIkZvb0dlbmVyYXRvciIgd2hpY2ggaW1wbGVtZW50cyB0aGUgQ29kZUdlbmVyYXRvciBpbnRlcmZhY2UsCisvLyB0aGVuIHdyaXRlIGEgbWFpbigpIHByb2NlZHVyZSBsaWtlIHRoaXM6CisvLworLy8gICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisvLyAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKy8vCisvLyAgICAgLy8gU3VwcG9ydCBnZW5lcmF0aW9uIG9mIEMrKyBzb3VyY2UgYW5kIGhlYWRlcnMuCisvLyAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OmNwcDo6Q3BwR2VuZXJhdG9yIGNwcF9nZW5lcmF0b3I7CisvLyAgICAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWNwcF9vdXQiLCAmY3BwX2dlbmVyYXRvciwKKy8vICAgICAgICJHZW5lcmF0ZSBDKysgc291cmNlIGFuZCBoZWFkZXIuIik7CisvLworLy8gICAgIC8vIFN1cHBvcnQgZ2VuZXJhdGlvbiBvZiBGb28gY29kZS4KKy8vICAgICBGb29HZW5lcmF0b3IgZm9vX2dlbmVyYXRvcjsKKy8vICAgICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tZm9vX291dCIsICZmb29fZ2VuZXJhdG9yLAorLy8gICAgICAgIkdlbmVyYXRlIEZvbyBmaWxlLiIpOworLy8KKy8vICAgICByZXR1cm4gY2xpLlJ1bihhcmdjLCBhcmd2KTsKKy8vICAgfQorLy8KKy8vIFRoZSBjb21waWxlciBpcyBpbnZva2VkIHdpdGggc3ludGF4IGxpa2U6CisvLyAgIHByb3RvYyAtLWNwcF9vdXQ9b3V0ZGlyIC0tZm9vX291dD1vdXRkaXIgLS1wcm90b19wYXRoPXNyYyBzcmMvZm9vLnByb3RvCisvLworLy8gRm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZC1saW5lIHN5bnRheCwgaW52b2tlIGl0IHdpdGggLS1oZWxwLgorY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBDb21tYW5kTGluZUludGVyZmFjZSB7CisgcHVibGljOgorICBDb21tYW5kTGluZUludGVyZmFjZSgpOworICB+Q29tbWFuZExpbmVJbnRlcmZhY2UoKTsKKworICAvLyBSZWdpc3RlciBhIGNvZGUgZ2VuZXJhdG9yIGZvciBhIGxhbmd1YWdlLgorICAvLworICAvLyBQYXJhbWV0ZXJzOgorICAvLyAqIGZsYWdfbmFtZTogVGhlIGNvbW1hbmQtbGluZSBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSBvZgorICAvLyAgIHRoaXMgdHlwZS4gIFRoZSBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhICctJy4gIElmIHRoZSBuYW1lIGlzIGxvbmdlcgorICAvLyAgIHRoYW4gb25lIGxldHRlciwgaXQgbXVzdCBzdGFydCB3aXRoIHR3byAnLSdzLgorICAvLyAqIGdlbmVyYXRvcjogVGhlIENvZGVHZW5lcmF0b3Igd2hpY2ggd2lsbCBiZSBjYWxsZWQgdG8gZ2VuZXJhdGUgZmlsZXMKKyAgLy8gICBvZiB0aGlzIHR5cGUuCisgIC8vICogaGVscF90ZXh0OiBUZXh0IGRlc2NyaWJpbmcgdGhpcyBmbGFnIGluIHRoZSAtLWhlbHAgb3V0cHV0LgorICAvLworICAvLyBTb21lIGdlbmVyYXRvcnMgYWNjZXB0IGV4dHJhIHBhcmFtZXRlcnMuICBZb3UgY2FuIHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIKKyAgLy8gb24gdGhlIGNvbW1hbmQtbGluZSBieSBwbGFjaW5nIGl0IGJlZm9yZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgc2VwYXJhdGVkCisgIC8vIGJ5IGEgY29sb246CisgIC8vICAgcHJvdG9jIC0tZm9vX291dD1lbmFibGVfYmFyOm91dGRpcgorICAvLyBUaGUgdGV4dCBiZWZvcmUgdGhlIGNvbG9uIGlzIHBhc3NlZCB0byBDb2RlR2VuZXJhdG9yOjpHZW5lcmF0ZSgpIGFzIHRoZQorICAvLyAicGFyYW1ldGVyIi4KKyAgdm9pZCBSZWdpc3RlckdlbmVyYXRvcihjb25zdCBzdHJpbmcmIGZsYWdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBoZWxwX3RleHQpOworCisgIC8vIFJlZ2lzdGVyIGEgY29kZSBnZW5lcmF0b3IgZm9yIGEgbGFuZ3VhZ2UuCisgIC8vIEJlc2lkZXMgZmxhZ19uYW1lIHlvdSBjYW4gc3BlY2lmeSBhbm90aGVyIG9wdGlvbl9mbGFnX25hbWUgdGhhdCBjb3VsZCBiZQorICAvLyB1c2VkIHRvIHBhc3MgZXh0cmEgcGFyYW1ldGVycyB0byB0aGUgcmVnaXN0ZXJlZCBjb2RlIGdlbmVyYXRvci4KKyAgLy8gU3VwcG9zZSB5b3UgaGF2ZSByZWdpc3RlcmVkIGEgZ2VuZXJhdG9yIGJ5IGNhbGxpbmc6CisgIC8vICAgY29tbWFuZF9saW5lX2ludGVyZmFjZS5SZWdpc3RlckdlbmVyYXRvcigiLS1mb29fb3V0IiwgIi0tZm9vX29wdCIsIC4uLikKKyAgLy8gVGhlbiB5b3UgY291bGQgaW52b2tlIHRoZSBjb21waWxlciB3aXRoIGEgY29tbWFuZCBsaWtlOgorICAvLyAgIHByb3RvYyAtLWZvb19vdXQ9ZW5hYmxlX2JhcjpvdXRkaXIgLS1mb29fb3B0PWVuYWJsZV9iYXoKKyAgLy8gVGhpcyB3aWxsIHBhc3MgImVuYWJsZV9iYXIsZW5hYmxlX2JheiIgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUgZ2VuZXJhdG9yLgorICB2b2lkIFJlZ2lzdGVyR2VuZXJhdG9yKGNvbnN0IHN0cmluZyYgZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX2ZsYWdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBoZWxwX3RleHQpOworCisgIC8vIEVuYWJsZXMgInBsdWdpbnMiLiAgSW4gdGhpcyBtb2RlLCBpZiBhIGNvbW1hbmQtbGluZSBmbGFnIGVuZHMgd2l0aCAiX291dCIKKyAgLy8gYnV0IGRvZXMgbm90IG1hdGNoIGFueSByZWdpc3RlcmVkIGdlbmVyYXRvciwgdGhlIGNvbXBpbGVyIHdpbGwgYXR0ZW1wdCB0bworICAvLyBmaW5kIGEgInBsdWdpbiIgdG8gaW1wbGVtZW50IHRoZSBnZW5lcmF0b3IuICBQbHVnaW5zIGFyZSBqdXN0IGV4ZWN1dGFibGVzLgorICAvLyBUaGV5IHNob3VsZCBsaXZlIHNvbWV3aGVyZSBpbiB0aGUgUEFUSC4KKyAgLy8KKyAgLy8gVGhlIGNvbXBpbGVyIGRldGVybWluZXMgdGhlIGV4ZWN1dGFibGUgbmFtZSB0byBzZWFyY2ggZm9yIGJ5IGNvbmNhdGVuYXRpbmcKKyAgLy8gZXhlX25hbWVfcHJlZml4IHdpdGggdGhlIHVucmVjb2duaXplZCBmbGFnIG5hbWUsIHJlbW92aW5nICJfb3V0Ii4gIFNvLCBmb3IKKyAgLy8gZXhhbXBsZSwgaWYgZXhlX25hbWVfcHJlZml4IGlzICJwcm90b2MtIiBhbmQgeW91IHBhc3MgdGhlIGZsYWcgLS1mb29fb3V0LAorICAvLyB0aGUgY29tcGlsZXIgd2lsbCB0cnkgdG8gcnVuIHRoZSBwcm9ncmFtICJwcm90b2MtZm9vIi4KKyAgLy8KKyAgLy8gVGhlIHBsdWdpbiBwcm9ncmFtIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyB1c2FnZToKKyAgLy8gICBwbHVnaW4gWy0tb3V0PU9VVERJUl0gWy0tcGFyYW1ldGVyPVBBUkFNRVRFUl0gUFJPVE9fRklMRVMgPCBERVNDUklQVE9SUworICAvLyAtLW91dCBpbmRpY2F0ZXMgdGhlIG91dHB1dCBkaXJlY3RvcnkgKGFzIHBhc3NlZCB0byB0aGUgLS1mb29fb3V0CisgIC8vIHBhcmFtZXRlcik7IGlmIG9taXR0ZWQsIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZC4gIC0tcGFyYW1ldGVyCisgIC8vIGdpdmVzIHRoZSBnZW5lcmF0b3IgcGFyYW1ldGVyLCBpZiBhbnkgd2FzIHByb3ZpZGVkLiAgVGhlIFBST1RPX0ZJTEVTIGxpc3QKKyAgLy8gdGhlIC5wcm90byBmaWxlcyB3aGljaCB3ZXJlIGdpdmVuIG9uIHRoZSBjb21waWxlciBjb21tYW5kLWxpbmU7IHRoZXNlIGFyZQorICAvLyB0aGUgZmlsZXMgZm9yIHdoaWNoIHRoZSBwbHVnaW4gaXMgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgb3V0cHV0IGNvZGUuCisgIC8vIEZpbmFsbHksIERFU0NSSVBUT1JTIGlzIGFuIGVuY29kZWQgRmlsZURlc2NyaXB0b3JTZXQgKGFzIGRlZmluZWQgaW4KKyAgLy8gZGVzY3JpcHRvci5wcm90bykuICBUaGlzIGlzIHBpcGVkIHRvIHRoZSBwbHVnaW4ncyBzdGRpbi4gIFRoZSBzZXQgd2lsbAorICAvLyBpbmNsdWRlIGRlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGZpbGVzIGxpc3RlZCBpbiBQUk9UT19GSUxFUyBhcyB3ZWxsIGFzCisgIC8vIGFsbCBmaWxlcyB0aGF0IHRoZXkgaW1wb3J0LiAgVGhlIHBsdWdpbiBNVVNUIE5PVCBhdHRlbXB0IHRvIHJlYWQgdGhlCisgIC8vIFBST1RPX0ZJTEVTIGRpcmVjdGx5IC0tIGl0IG11c3QgdXNlIHRoZSBGaWxlRGVzY3JpcHRvclNldC4KKyAgLy8KKyAgLy8gVGhlIHBsdWdpbiBzaG91bGQgZ2VuZXJhdGUgd2hhdGV2ZXIgZmlsZXMgYXJlIG5lY2Vzc2FyeSwgYXMgY29kZSBnZW5lcmF0b3JzCisgIC8vIG5vcm1hbGx5IGRvLiAgSXQgc2hvdWxkIHdyaXRlIHRoZSBuYW1lcyBvZiBhbGwgZmlsZXMgaXQgZ2VuZXJhdGVzIHRvCisgIC8vIHN0ZG91dC4gIFRoZSBuYW1lcyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnksIE5PVCBhYnNvbHV0ZQorICAvLyBuYW1lcyBvciByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBJZiBhbnkgZXJyb3JzIG9jY3VyLCBlcnJvcgorICAvLyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbiB0byBzdGRlcnIuICBJZiBhbiBlcnJvciBpcyBmYXRhbCwgdGhlIHBsdWdpbgorICAvLyBzaG91bGQgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLgorICB2b2lkIEFsbG93UGx1Z2lucyhjb25zdCBzdHJpbmcmIGV4ZV9uYW1lX3ByZWZpeCk7CisKKyAgLy8gUnVuIHRoZSBQcm90b2NvbCBDb21waWxlciB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLWxpbmUgcGFyYW1ldGVycy4KKyAgLy8gUmV0dXJucyB0aGUgZXJyb3IgY29kZSB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgYnkgbWFpbigpLgorICAvLworICAvLyBJdCBtYXkgbm90IGJlIHNhZmUgdG8gY2FsbCBSdW4oKSBpbiBhIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50IGJlY2F1c2UKKyAgLy8gaXQgY2FsbHMgc3RyZXJyb3IoKS4gIEknbSBub3Qgc3VyZSB3aHkgeW91J2Qgd2FudCB0byBkbyB0aGlzIGFueXdheS4KKyAgaW50IFJ1bihpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKTsKKworICAvLyBDYWxsIFNldElucHV0c0FyZUN3ZFJlbGF0aXZlKHRydWUpIGlmIHRoZSBpbnB1dCBmaWxlcyBnaXZlbiBvbiB0aGUgY29tbWFuZAorICAvLyBsaW5lIHNob3VsZCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcHJvdG8gaW1wb3J0IHBhdGggc3BlY2lmaWVkCisgIC8vIHVzaW5nIC0tcHJvdG9fcGF0aCBvciAtSSBmbGFncy4gIE90aGVyd2lzZSwgaW5wdXQgZmlsZSBuYW1lcyB3aWxsIGJlCisgIC8vIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChvciBhcyBhYnNvbHV0ZQorICAvLyBwYXRocyBpZiB0aGV5IHN0YXJ0IHdpdGggJy8nKSwgdGhvdWdoIHRoZXkgbXVzdCBzdGlsbCByZXNpZGUgaW5zaWRlCisgIC8vIGEgZGlyZWN0b3J5IGdpdmVuIGJ5IC0tcHJvdG9fcGF0aCBvciB0aGUgY29tcGlsZXIgd2lsbCBmYWlsLiAgVGhlIGxhdHRlcgorICAvLyBtb2RlIGlzIGdlbmVyYWxseSBtb3JlIGludHVpdGl2ZSBhbmQgZWFzaWVyIHRvIHVzZSwgZXNwZWNpYWxseSBlLmcuIHdoZW4KKyAgLy8gZGVmaW5pbmcgaW1wbGljaXQgcnVsZXMgaW4gTWFrZWZpbGVzLgorICB2b2lkIFNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGJvb2wgZW5hYmxlKSB7CisgICAgaW5wdXRzX2FyZV9wcm90b19wYXRoX3JlbGF0aXZlXyA9IGVuYWJsZTsKKyAgfQorCisgIC8vIFByb3ZpZGVzIHNvbWUgdGV4dCB3aGljaCB3aWxsIGJlIHByaW50ZWQgd2hlbiB0aGUgLS12ZXJzaW9uIGZsYWcgaXMKKyAgLy8gdXNlZC4gIFRoZSB2ZXJzaW9uIG9mIGxpYnByb3RvYyB3aWxsIGFsc28gYmUgcHJpbnRlZCBvbiB0aGUgbmV4dCBsaW5lCisgIC8vIGFmdGVyIHRoaXMgdGV4dC4KKyAgdm9pZCBTZXRWZXJzaW9uSW5mbyhjb25zdCBzdHJpbmcmIHRleHQpIHsKKyAgICB2ZXJzaW9uX2luZm9fID0gdGV4dDsKKyAgfQorCisKKyBwcml2YXRlOgorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGNsYXNzIEVycm9yUHJpbnRlcjsKKyAgY2xhc3MgR2VuZXJhdG9yQ29udGV4dEltcGw7CisgIGNsYXNzIE1lbW9yeU91dHB1dFN0cmVhbTsKKworICAvLyBDbGVhciBzdGF0ZSBmcm9tIHByZXZpb3VzIFJ1bigpLgorICB2b2lkIENsZWFyKCk7CisKKyAgLy8gUmVtYXBzIGVhY2ggZmlsZSBpbiBpbnB1dF9maWxlc18gc28gdGhhdCBpdCBpcyByZWxhdGl2ZSB0byBvbmUgb2YgdGhlCisgIC8vIGRpcmVjdG9yaWVzIGluIHByb3RvX3BhdGhfLiAgUmV0dXJucyBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4gIFRoaXMKKyAgLy8gaXMgb25seSB1c2VkIGlmIGlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV8gaXMgZmFsc2UuCisgIGJvb2wgTWFrZUlucHV0c0JlUHJvdG9QYXRoUmVsYXRpdmUoCisgICAgRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlKTsKKworICAvLyBSZXR1cm4gc3RhdHVzIGZvciBQYXJzZUFyZ3VtZW50cygpIGFuZCBJbnRlcnByZXRBcmd1bWVudCgpLgorICBlbnVtIFBhcnNlQXJndW1lbnRTdGF0dXMgeworICAgIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0NPTlRJTlVFLAorICAgIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0VYSVQsCisgICAgUEFSU0VfQVJHVU1FTlRfRkFJTAorICB9OworCisgIC8vIFBhcnNlIGFsbCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorICBQYXJzZUFyZ3VtZW50U3RhdHVzIFBhcnNlQXJndW1lbnRzKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pOworCisgIC8vIFBhcnNlcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudCBpbnRvIGEgbmFtZS92YWx1ZSBwYWlyLiAgUmV0dXJucworICAvLyB0cnVlIGlmIHRoZSBuZXh0IGFyZ3VtZW50IGluIHRoZSBhcmd2IHNob3VsZCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSwKKyAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICAvLworICAvLyBFeG1hcGxlczoKKyAgLy8gICAiLUlzcmMvcHJvdG9zIiAtPgorICAvLyAgICAgbmFtZSA9ICItSSIsIHZhbHVlID0gInNyYy9wcm90b3MiCisgIC8vICAgIi0tY3BwX291dD1zcmMvZm9vLnBiMi5jYyIgLT4KKyAgLy8gICAgIG5hbWUgPSAiLS1jcHBfb3V0IiwgdmFsdWUgPSAic3JjL2Zvby5wYjIuY2MiCisgIC8vICAgImZvby5wcm90byIgLT4KKyAgLy8gICAgIG5hbWUgPSAiIiwgdmFsdWUgPSAiZm9vLnByb3RvIgorICBib29sIFBhcnNlQXJndW1lbnQoY29uc3QgY2hhciogYXJnLCBzdHJpbmcqIG5hbWUsIHN0cmluZyogdmFsdWUpOworCisgIC8vIEludGVycHJldHMgYXJndW1lbnRzIHBhcnNlZCB3aXRoIFBhcnNlQXJndW1lbnQuCisgIFBhcnNlQXJndW1lbnRTdGF0dXMgSW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpOworCisgIC8vIFByaW50IHRoZSAtLWhlbHAgdGV4dCB0byBzdGRlcnIuCisgIHZvaWQgUHJpbnRIZWxwVGV4dCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBmcm9tIHRoZSBnaXZlbiBpbnB1dC4KKyAgc3RydWN0IE91dHB1dERpcmVjdGl2ZTsgIC8vIHNlZSBiZWxvdworICBib29sIEdlbmVyYXRlT3V0cHV0KGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0RGlyZWN0aXZlJiBvdXRwdXRfZGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KTsKKyAgYm9vbCBHZW5lcmF0ZVBsdWdpbk91dHB1dChjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGx1Z2luX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcik7CisKKyAgLy8gSW1wbGVtZW50cyAtLWVuY29kZSBhbmQgLS1kZWNvZGUuCisgIGJvb2wgRW5jb2RlT3JEZWNvZGUoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpOworCisgIC8vIEltcGxlbWVudHMgdGhlIC0tZGVzY3JpcHRvcl9zZXRfb3V0IG9wdGlvbi4KKyAgYm9vbCBXcml0ZURlc2NyaXB0b3JTZXQoY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcGFyc2VkX2ZpbGVzKTsKKworICAvLyBHZXQgYWxsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG9mIHRoZSBnaXZlbiBmaWxlIChpbmNsdWRpbmcgdGhlIGZpbGUKKyAgLy8gaXRzZWxmKSwgYWRkaW5nIHRoZW0gdG8gdGhlIGdpdmVuIGxpc3Qgb2YgRmlsZURlc2NyaXB0b3JQcm90b3MuICBUaGUKKyAgLy8gcHJvdG9zIHdpbGwgYmUgb3JkZXJlZCBzdWNoIHRoYXQgZXZlcnkgZmlsZSBpcyBsaXN0ZWQgYmVmb3JlIGFueSBmaWxlIHRoYXQKKyAgLy8gZGVwZW5kcyBvbiBpdCwgc28gdGhhdCB5b3UgY2FuIGNhbGwgRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZSgpIG9uIHRoZW0KKyAgLy8gaW4gb3JkZXIuICBBbnkgZmlsZXMgaW4gKmFscmVhZHlfc2VlbiB3aWxsIG5vdCBiZSBhZGRlZCwgYW5kIGVhY2ggZmlsZQorICAvLyBhZGRlZCB3aWxsIGJlIGluc2VydGVkIGludG8gKmFscmVhZHlfc2Vlbi4gIElmIGluY2x1ZGVfc291cmNlX2NvZGVfaW5mbyBpcworICAvLyB0cnVlIHRoZW4gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgaW5mb3JtYXRpb24gaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG9zLgorICBzdGF0aWMgdm9pZCBHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKAorICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICBib29sIGluY2x1ZGVfc291cmNlX2NvZGVfaW5mbywKKyAgICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4sCisgICAgICBSZXBlYXRlZFB0ckZpZWxkPEZpbGVEZXNjcmlwdG9yUHJvdG8+KiBvdXRwdXQpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgYXMgaW52b2tlZCAoaS5lLiBhcmd2WzBdKS4KKyAgc3RyaW5nIGV4ZWN1dGFibGVfbmFtZV87CisKKyAgLy8gVmVyc2lvbiBpbmZvIHNldCB3aXRoIFNldFZlcnNpb25JbmZvKCkuCisgIHN0cmluZyB2ZXJzaW9uX2luZm9fOworCisgIC8vIFJlZ2lzdGVyZWQgZ2VuZXJhdG9ycy4KKyAgc3RydWN0IEdlbmVyYXRvckluZm8geworICAgIHN0cmluZyBmbGFnX25hbWU7CisgICAgc3RyaW5nIG9wdGlvbl9mbGFnX25hbWU7CisgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yOworICAgIHN0cmluZyBoZWxwX3RleHQ7CisgIH07CisgIHR5cGVkZWYgbWFwPHN0cmluZywgR2VuZXJhdG9ySW5mbz4gR2VuZXJhdG9yTWFwOworICBHZW5lcmF0b3JNYXAgZ2VuZXJhdG9yc19ieV9mbGFnX25hbWVfOworICBHZW5lcmF0b3JNYXAgZ2VuZXJhdG9yc19ieV9vcHRpb25fbmFtZV87CisgIC8vIEEgbWFwIGZyb20gZ2VuZXJhdG9yIG5hbWVzIHRvIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCB1c2luZyB0aGUgb3B0aW9uCisgIC8vIGZsYWcuIEZvciBleGFtcGxlLCBpZiB0aGUgdXNlciBpbnZva2VzIHRoZSBjb21waWxlciB3aXRoOgorICAvLyAgIHByb3RvYyAtLWZvb19vdXQ9b3V0cHV0ZGlyIC0tZm9vX29wdD1lbmFibGVfYmFyIC4uLgorICAvLyBUaGVuIHRoZXJlIHdpbGwgYmUgYW4gZW50cnkgKCItLWZvb19vdXQiLCAiZW5hYmxlX2JhciIpIGluIHRoaXMgbWFwLgorICBtYXA8c3RyaW5nLCBzdHJpbmc+IGdlbmVyYXRvcl9wYXJhbWV0ZXJzXzsKKworICAvLyBTZWUgQWxsb3dQbHVnaW5zKCkuICBJZiB0aGlzIGlzIGVtcHR5LCBwbHVnaW5zIGFyZW4ndCBhbGxvd2VkLgorICBzdHJpbmcgcGx1Z2luX3ByZWZpeF87CisKKyAgLy8gTWFwcyBzcGVjaWZpYyBwbHVnaW4gbmFtZXMgdG8gZmlsZXMuICBXaGVuIGV4ZWN1dGluZyBhIHBsdWdpbiwgdGhpcyBtYXAKKyAgLy8gaXMgc2VhcmNoZWQgZmlyc3QgdG8gZmluZCB0aGUgcGx1Z2luIGV4ZWN1dGFibGUuICBJZiBub3QgZm91bmQgaGVyZSwgdGhlCisgIC8vIFBBVEggKG9yIG90aGVyIE9TLXNwZWNpZmljIHNlYXJjaCBzdHJhdGVneSkgaXMgc2VhcmNoZWQuCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGx1Z2luc187CisKKyAgLy8gU3R1ZmYgcGFyc2VkIGZyb20gY29tbWFuZCBsaW5lLgorICBlbnVtIE1vZGUgeworICAgIE1PREVfQ09NUElMRSwgIC8vIE5vcm1hbCBtb2RlOiAgcGFyc2UgLnByb3RvIGZpbGVzIGFuZCBjb21waWxlIHRoZW0uCisgICAgTU9ERV9FTkNPREUsICAgLy8gLS1lbmNvZGU6ICByZWFkIHRleHQgZnJvbSBzdGRpbiwgd3JpdGUgYmluYXJ5IHRvIHN0ZG91dC4KKyAgICBNT0RFX0RFQ09ERSAgICAvLyAtLWRlY29kZTogIHJlYWQgYmluYXJ5IGZyb20gc3RkaW4sIHdyaXRlIHRleHQgdG8gc3Rkb3V0LgorICB9OworCisgIE1vZGUgbW9kZV87CisKKyAgZW51bSBFcnJvckZvcm1hdCB7CisgICAgRVJST1JfRk9STUFUX0dDQywgICAvLyBHQ0MgZXJyb3Igb3V0cHV0IGZvcm1hdCAoZGVmYXVsdCkuCisgICAgRVJST1JfRk9STUFUX01TVlMgICAvLyBWaXN1YWwgU3R1ZGlvIG91dHB1dCAoLS1lcnJvcl9mb3JtYXQ9bXN2cykuCisgIH07CisKKyAgRXJyb3JGb3JtYXQgZXJyb3JfZm9ybWF0XzsKKworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBwcm90b19wYXRoXzsgIC8vIFNlYXJjaCBwYXRoIGZvciBwcm90byBmaWxlcy4KKyAgdmVjdG9yPHN0cmluZz4gaW5wdXRfZmlsZXNfOyAgICAgICAgICAgICAgICAvLyBOYW1lcyBvZiB0aGUgaW5wdXQgcHJvdG8gZmlsZXMuCisKKyAgLy8gb3V0cHV0X2RpcmVjdGl2ZXNfIGxpc3RzIGFsbCB0aGUgZmlsZXMgd2UgYXJlIHN1cHBvc2VkIHRvIG91dHB1dCBhbmQgd2hhdAorICAvLyBnZW5lcmF0b3IgdG8gdXNlIGZvciBlYWNoLgorICBzdHJ1Y3QgT3V0cHV0RGlyZWN0aXZlIHsKKyAgICBzdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgLy8gRS5nLiAiLS1mb29fb3V0IgorICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcjsgICAvLyBOVUxMIGZvciBwbHVnaW5zCisgICAgc3RyaW5nIHBhcmFtZXRlcjsKKyAgICBzdHJpbmcgb3V0cHV0X2xvY2F0aW9uOworICB9OworICB2ZWN0b3I8T3V0cHV0RGlyZWN0aXZlPiBvdXRwdXRfZGlyZWN0aXZlc187CisKKyAgLy8gV2hlbiB1c2luZyAtLWVuY29kZSBvciAtLWRlY29kZSwgdGhpcyBuYW1lcyB0aGUgdHlwZSB3ZSBhcmUgZW5jb2Rpbmcgb3IKKyAgLy8gZGVjb2RpbmcuICAoRW1wdHkgc3RyaW5nIGluZGljYXRlcyAtLWRlY29kZV9yYXcuKQorICBzdHJpbmcgY29kZWNfdHlwZV87CisKKyAgLy8gSWYgLS1kZXNjcmlwdG9yX3NldF9vdXQgd2FzIGdpdmVuLCB0aGlzIGlzIHRoZSBmaWxlbmFtZSB0byB3aGljaCB0aGUKKyAgLy8gRmlsZURlc2NyaXB0b3JTZXQgc2hvdWxkIGJlIHdyaXR0ZW4uICBPdGhlcndpc2UsIGVtcHR5LgorICBzdHJpbmcgZGVzY3JpcHRvcl9zZXRfbmFtZV87CisKKyAgLy8gVHJ1ZSBpZiAtLWluY2x1ZGVfaW1wb3J0cyB3YXMgZ2l2ZW4sIG1lYW5pbmcgdGhhdCB3ZSBzaG91bGQKKyAgLy8gd3JpdGUgYWxsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRvIHRoZSBEZXNjcmlwdG9yU2V0LiAgT3RoZXJ3aXNlLCBvbmx5CisgIC8vIHRoZSAucHJvdG8gZmlsZXMgbGlzdGVkIG9uIHRoZSBjb21tYW5kLWxpbmUgYXJlIGFkZGVkLgorICBib29sIGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfOworCisgIC8vIFRydWUgaWYgLS1pbmNsdWRlX3NvdXJjZV9pbmZvIHdhcyBnaXZlbiwgbWVhbmluZyB0aGF0IHdlIHNob3VsZCBub3Qgc3RyaXAKKyAgLy8gU291cmNlQ29kZUluZm8gZnJvbSB0aGUgRGVzY3JpcHRvclNldC4KKyAgYm9vbCBzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF87CisKKyAgLy8gV2FzIHRoZSAtLWRpc2FsbG93X3NlcnZpY2VzIGZsYWcgdXNlZD8KKyAgYm9vbCBkaXNhbGxvd19zZXJ2aWNlc187CisKKyAgLy8gU2VlIFNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKCkuCisgIGJvb2wgaW5wdXRzX2FyZV9wcm90b19wYXRoX3JlbGF0aXZlXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29tbWFuZExpbmVJbnRlcmZhY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09NTUFORF9MSU5FX0lOVEVSRkFDRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1NTk5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTU2MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisjaWYgZGVmaW5lZChfV0lOMzIpCisjaWZuZGVmIFNURElOX0ZJTEVOTworI2RlZmluZSBTVERJTl9GSUxFTk8gMAorI2VuZGlmCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKyNpZm5kZWYgRl9PSworI2RlZmluZSBGX09LIDAwICAvLyBub3QgZGVmaW5lZCBieSBNU1ZDIGZvciB3aGF0ZXZlciByZWFzb24KKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworICAvLyBSdW5zIHRoZSBDb21tYW5kTGluZUludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBjb21tYW5kIGxpbmUuICBUaGUKKyAgLy8gY29tbWFuZCBpcyBhdXRvbWF0aWNhbGx5IHNwbGl0IG9uIHNwYWNlcywgYW5kIHRoZSBzdHJpbmcgIiR0bXBkaXIiCisgIC8vIGlzIHJlcGxhY2VkIHdpdGggVGVzdFRlbXBEaXIoKS4KKyAgdm9pZCBSdW4oY29uc3Qgc3RyaW5nJiBjb21tYW5kKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIHRvIHNldCB1cCB0aGUgdGVzdCAoY2FsbGVkIGJlZm9yZSBSdW4oKSkuCisKKyAgY2xhc3MgTnVsbENvZGVHZW5lcmF0b3I7CisKKyAgLy8gTm9ybWFsbHkgcGx1Z2lucyBhcmUgYWxsb3dlZCBmb3IgYWxsIHRlc3RzLiAgQ2FsbCB0aGlzIHRvIGV4cGxpY2l0bHkKKyAgLy8gZGlzYWJsZSB0aGVtLgorICB2b2lkIERpc2FsbG93UGx1Z2lucygpIHsgZGlzYWxsb3dfcGx1Z2luc18gPSB0cnVlOyB9CisKKyAgLy8gQ3JlYXRlIGEgdGVtcCBmaWxlIHdpdGhpbiB0ZW1wX2RpcmVjdG9yeV8gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgLy8gVGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5IGlzIGFsc28gY3JlYXRlZCBpZiBuZWNlc3NhcnkuCisgIHZvaWQgQ3JlYXRlVGVtcEZpbGUoY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKTsKKworICAvLyBDcmVhdGUgYSBzdWJkaXJlY3Rvcnkgd2l0aGluIHRlbXBfZGlyZWN0b3J5Xy4KKyAgdm9pZCBDcmVhdGVUZW1wRGlyKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgdm9pZCBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShib29sIGVuYWJsZSkgeworICAgIGNsaV8uU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoZW5hYmxlKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1ldGhvZHMgdG8gY2hlY2sgdGhlIHRlc3QgcmVzdWx0cyAoY2FsbGVkIGFmdGVyIFJ1bigpKS4KKworICAvLyBDaGVja3MgdGhhdCBubyB0ZXh0IHdhcyB3cml0dGVuIHRvIHN0ZGVyciBkdXJpbmcgUnVuKCksIGFuZCBSdW4oKQorICAvLyByZXR1cm5lZCAwLgorICB2b2lkIEV4cGVjdE5vRXJyb3JzKCk7CisKKyAgLy8gQ2hlY2tzIHRoYXQgUnVuKCkgcmV0dXJuZWQgbm9uLXplcm8gYW5kIHRoZSBzdGRlcnIgb3V0cHV0IGlzIGV4YWN0bHkKKyAgLy8gdGhlIHRleHQgZ2l2ZW4uICBleHBlY3RlZF90ZXN0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gIiR0bXBkaXIiLAorICAvLyB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHBhdGguCisgIHZvaWQgRXhwZWN0RXJyb3JUZXh0KGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfdGV4dCk7CisKKyAgLy8gQ2hlY2tzIHRoYXQgUnVuKCkgcmV0dXJuZWQgbm9uLXplcm8gYW5kIHRoZSBzdGRlcnIgY29udGFpbnMgdGhlIGdpdmVuCisgIC8vIHN1YnN0cmluZy4KKyAgdm9pZCBFeHBlY3RFcnJvclN1YnN0cmluZyhjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZyk7CisKKyAgLy8gTGlrZSBFeHBlY3RFcnJvclN1YnN0cmluZywgYnV0IGNoZWNrcyB0aGF0IFJ1bigpIHJldHVybmVkIHplcm8uCisgIHZvaWQgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoCisgICAgICBjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZyk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIEV4cGVjdEVycm9yU3Vic3RyaW5nKGV4cGVjdGVkX3N1YnN0cmluZykgd291bGQgcGFzcywgYnV0CisgIC8vIGRvZXMgbm90IGZhaWwgb3RoZXJ3aXNlLgorICBib29sIEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nKTsKKworICAvLyBDaGVja3MgdGhhdCBNb2NrQ29kZUdlbmVyYXRvcjo6R2VuZXJhdGUoKSB3YXMgY2FsbGVkIGluIHRoZSBnaXZlbgorICAvLyBjb250ZXh0IChvciB0aGUgZ2VuZXJhdG9yIGluIHRlc3RfcGx1Z2luLmNjLCB3aGljaCBwcm9kdWNlcyB0aGUgc2FtZQorICAvLyBvdXRwdXQpLiAgVGhhdCBpcywgdGhpcyB0ZXN0cyBpZiB0aGUgZ2VuZXJhdG9yIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAgLy8gd2FzIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXIgYW5kIHByb3RvIGZpbGUgYW5kIHByb2R1Y2VkIHRoZQorICAvLyBnaXZlbiBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgY2hlY2tlZCBieSByZWFkaW5nIHRoZSBvdXRwdXQgZmlsZSBhbmQKKyAgLy8gY2hlY2tpbmcgdGhhdCBpdCBjb250YWlucyB0aGUgY29udGVudCB0aGF0IE1vY2tDb2RlR2VuZXJhdG9yIHdvdWxkCisgIC8vIGdlbmVyYXRlIGdpdmVuIHRoZXNlIGlucHV0cy4gIG1lc3NhZ2VfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QKKyAgLy8gbWVzc2FnZSB0aGF0IGFwcGVhcmVkIGluIHRoZSBwcm90byBmaWxlOyB0aGlzIGlzIGp1c3QgdG8gbWFrZSBleHRyYQorICAvLyBzdXJlIHRoYXQgdGhlIGNvcnJlY3QgZmlsZSB3YXMgcGFyc2VkLgorICB2b2lkIEV4cGVjdEdlbmVyYXRlZChjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSk7CisgIHZvaWQgRXhwZWN0R2VuZXJhdGVkKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByb3RvX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG91dHB1dF9kaXJlY3RvcnkpOworICB2b2lkIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cyhjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGFsbF9wcm90b19uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSk7CisgIHZvaWQgRXhwZWN0R2VuZXJhdGVkV2l0aEluc2VydGlvbnMoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGluc2VydGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lKTsKKworICB2b2lkIEV4cGVjdE51bGxDb2RlR2VuZXJhdG9yQ2FsbGVkKGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyKTsKKworICB2b2lkIFJlYWREZXNjcmlwdG9yU2V0KGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JTZXQqIGRlc2NyaXB0b3Jfc2V0KTsKKworIHByaXZhdGU6CisgIC8vIFRoZSBvYmplY3Qgd2UgYXJlIHRlc3RpbmcuCisgIENvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaV87CisKKyAgLy8gV2FzIERpc2FsbG93UGx1Z2lucygpIGNhbGxlZD8KKyAgYm9vbCBkaXNhbGxvd19wbHVnaW5zXzsKKworICAvLyBXZSBjcmVhdGUgYSBkaXJlY3Rvcnkgd2l0aGluIFRlc3RUZW1wRGlyKCkgaW4gb3JkZXIgdG8gYWRkIGV4dHJhCisgIC8vIHByb3RlY3Rpb24gYWdhaW5zdCBhY2NpZGVudGFsbHkgZGVsZXRpbmcgdXNlciBmaWxlcyAoc2luY2Ugd2UgcmVjdXJzaXZlbHkKKyAgLy8gZGVsZXRlIHRoaXMgZGlyZWN0b3J5IGR1cmluZyB0aGUgdGVzdCkuICBUaGlzIGlzIHRoZSBmdWxsIHBhdGggb2YgdGhhdAorICAvLyBkaXJlY3RvcnkuCisgIHN0cmluZyB0ZW1wX2RpcmVjdG9yeV87CisKKyAgLy8gVGhlIHJlc3VsdCBvZiBSdW4oKS4KKyAgaW50IHJldHVybl9jb2RlXzsKKworICAvLyBUaGUgY2FwdHVyZWQgc3RkZXJyIG91dHB1dC4KKyAgc3RyaW5nIGVycm9yX3RleHRfOworCisgIC8vIFBvaW50ZXJzIHdoaWNoIG5lZWQgdG8gYmUgZGVsZXRlZCBsYXRlci4KKyAgdmVjdG9yPENvZGVHZW5lcmF0b3IqPiBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXzsKKworICBOdWxsQ29kZUdlbmVyYXRvciogbnVsbF9nZW5lcmF0b3JfOworfTsKKworY2xhc3MgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpOdWxsQ29kZUdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIE51bGxDb2RlR2VuZXJhdG9yKCkgOiBjYWxsZWRfKGZhbHNlKSB7fQorICB+TnVsbENvZGVHZW5lcmF0b3IoKSB7fQorCisgIG11dGFibGUgYm9vbCBjYWxsZWRfOworICBtdXRhYmxlIHN0cmluZyBwYXJhbWV0ZXJfOworCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgICAgY2FsbGVkXyA9IHRydWU7CisgICAgcGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6U2V0VXAoKSB7CisgIC8vIE1vc3Qgb2YgdGhlc2UgdGVzdHMgd2VyZSB3cml0dGVuIGJlZm9yZSB0aGlzIG9wdGlvbiB3YXMgYWRkZWQsIHNvIHdlCisgIC8vIHJ1biB3aXRoIHRoZSBvcHRpb24gb24gKHdoaWNoIHVzZWQgdG8gYmUgdGhlIG9ubHkgd2F5KSBleGNlcHQgaW4gY2VydGFpbgorICAvLyB0ZXN0cyB3aGVyZSB3ZSB0dXJuIGl0IG9mZi4KKyAgY2xpXy5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKKworICB0ZW1wX2RpcmVjdG9yeV8gPSBUZXN0VGVtcERpcigpICsgIi9wcm90bzJfY2xpX3Rlc3RfdGVtcCI7CisKKyAgLy8gSWYgdGhlIHRlbXAgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCBtdXN0IGJlIGxlZnQgb3ZlciBmcm9tIGEKKyAgLy8gcHJldmlvdXMgcnVuLiAgRGVsZXRlIGl0LgorICBpZiAoRmlsZTo6RXhpc3RzKHRlbXBfZGlyZWN0b3J5XykpIHsKKyAgICBGaWxlOjpEZWxldGVSZWN1cnNpdmVseSh0ZW1wX2RpcmVjdG9yeV8sIE5VTEwsIE5VTEwpOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSB0ZW1wIGRpcmVjdG9yeS4KKyAgR09PR0xFX0NIRUNLKEZpbGU6OkNyZWF0ZURpcih0ZW1wX2RpcmVjdG9yeV8uY19zdHIoKSwgREVGQVVMVF9GSUxFX01PREUpKTsKKworICAvLyBSZWdpc3RlciBnZW5lcmF0b3JzLgorICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBuZXcgTW9ja0NvZGVHZW5lcmF0b3IoInRlc3RfZ2VuZXJhdG9yIik7CisgIG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfLnB1c2hfYmFjayhnZW5lcmF0b3IpOworICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXRlc3Rfb3V0IiwgIi0tdGVzdF9vcHQiLCBnZW5lcmF0b3IsICJUZXN0IG91dHB1dC4iKTsKKyAgY2xpXy5SZWdpc3RlckdlbmVyYXRvcigiLXQiLCBnZW5lcmF0b3IsICJUZXN0IG91dHB1dC4iKTsKKworICBnZW5lcmF0b3IgPSBuZXcgTW9ja0NvZGVHZW5lcmF0b3IoImFsdF9nZW5lcmF0b3IiKTsKKyAgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGdlbmVyYXRvcik7CisgIGNsaV8uUmVnaXN0ZXJHZW5lcmF0b3IoIi0tYWx0X291dCIsIGdlbmVyYXRvciwgIkFsdCBvdXRwdXQuIik7CisKKyAgZ2VuZXJhdG9yID0gbnVsbF9nZW5lcmF0b3JfID0gbmV3IE51bGxDb2RlR2VuZXJhdG9yKCk7CisgIG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfLnB1c2hfYmFjayhnZW5lcmF0b3IpOworICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItLW51bGxfb3V0IiwgZ2VuZXJhdG9yLCAiTnVsbCBvdXRwdXQuIik7CisKKyAgZGlzYWxsb3dfcGx1Z2luc18gPSBmYWxzZTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OlRlYXJEb3duKCkgeworICAvLyBEZWxldGUgdGhlIHRlbXAgZGlyZWN0b3J5LgorICBGaWxlOjpEZWxldGVSZWN1cnNpdmVseSh0ZW1wX2RpcmVjdG9yeV8sIE5VTEwsIE5VTEwpOworCisgIC8vIERlbGV0ZSBhbGwgdGhlIE1vY2tDb2RlR2VuZXJhdG9ycy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5zaXplKCk7IGkrKykgeworICAgIGRlbGV0ZSBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlX1tpXTsKKyAgfQorICBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5jbGVhcigpOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6UnVuKGNvbnN0IHN0cmluZyYgY29tbWFuZCkgeworICB2ZWN0b3I8c3RyaW5nPiBhcmdzOworICBTcGxpdFN0cmluZ1VzaW5nKGNvbW1hbmQsICIgIiwgJmFyZ3MpOworCisgIGlmICghZGlzYWxsb3dfcGx1Z2luc18pIHsKKyAgICBjbGlfLkFsbG93UGx1Z2lucygicHJlZml4LSIpOworICAgIGNvbnN0IGNoYXIqIHBvc3NpYmxlX3BhdGhzW10gPSB7CisgICAgICAvLyBXaGVuIGJ1aWxkaW5nIHdpdGggc2hhcmVkIGxpYnJhcmllcywgbGlidG9vbCBoaWRlcyB0aGUgcmVhbCBleGVjdXRhYmxlCisgICAgICAvLyBpbiAubGlicyBhbmQgcHV0cyBhIGZha2Ugd3JhcHBlciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBkdWUgdG8gYW4gYXBwYXJlbnQgYnVnIG9uIEN5Z3dpbi9NaW5HVywgaWYgb25lIHByb2dyYW0KKyAgICAgIC8vIHdyYXBwZWQgaW4gdGhpcyB3YXkgKGUuZy4gcHJvdG9idWYtdGVzdHMuZXhlKSB0cmllcyB0byBleGVjdXRlIGFub3RoZXIKKyAgICAgIC8vIHByb2dyYW0gd3JhcHBlZCBpbiB0aGlzIHdheSAoZS5nLiB0ZXN0X3BsdWdpbi5leGUpLCB0aGUgbGF0dGVyIGZhaWxzCisgICAgICAvLyB3aXRoIGVycm9yIGNvZGUgMTI3IGFuZCBubyBleHBsYW5hdGlvbiBtZXNzYWdlLiAgUHJlc3VtYWJseSB0aGUgcHJvYmxlbQorICAgICAgLy8gaXMgdGhhdCB0aGUgd3JhcHBlciBmb3IgcHJvdG9idWYtdGVzdHMuZXhlIHNldCBzb21lIGVudmlyb25tZW50CisgICAgICAvLyB2YXJpYWJsZXMgdGhhdCBjb25mdXNlIHRoZSB3cmFwcGVyIGZvciB0ZXN0X3BsdWdpbi5leGUuICBMdWNraWx5LCBpdAorICAgICAgLy8gdHVybnMgb3V0IHRoYXQgaWYgd2Ugc2ltcGx5IGludm9rZSB0aGUgd3JhcHBlZCB0ZXN0X3BsdWdpbi5leGUKKyAgICAgIC8vIGRpcmVjdGx5LCBpdCB3b3JrcyAtLSBJIGd1ZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IGJ5IHRoZQorICAgICAgLy8gcHJvdG9idWYtdGVzdHMuZXhlIHdyYXBwZXIgaGFwcGVuIHRvIGJlIGNvcnJlY3QgZm9yIGl0IHRvby4gIFNvIHdlIGRvCisgICAgICAvLyB0aGF0LgorICAgICAgIi5saWJzL3Rlc3RfcGx1Z2luLmV4ZSIsICAvLyBXaW4zMiB3L2F1dG90b29sIChDeWd3aW4gLyBNaW5HVykKKyAgICAgICJ0ZXN0X3BsdWdpbi5leGUiLCAgICAgICAgLy8gT3RoZXIgV2luMzIgKE1TVkMpCisgICAgICAidGVzdF9wbHVnaW4iLCAgICAgICAgICAgIC8vIFVuaXgKKyAgICB9OworCisgICAgc3RyaW5nIHBsdWdpbl9wYXRoOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKHBvc3NpYmxlX3BhdGhzKTsgaSsrKSB7CisgICAgICBpZiAoYWNjZXNzKHBvc3NpYmxlX3BhdGhzW2ldLCBGX09LKSA9PSAwKSB7CisgICAgICAgIHBsdWdpbl9wYXRoID0gcG9zc2libGVfcGF0aHNbaV07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwbHVnaW5fcGF0aC5lbXB0eSgpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKQorICAgICAgICAgIDw8ICJQbHVnaW4gZXhlY3V0YWJsZSBub3QgZm91bmQuICBQbHVnaW4gdGVzdHMgYXJlIGxpa2VseSB0byBmYWlsLiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MucHVzaF9iYWNrKCItLXBsdWdpbj1wcmVmaXgtZ2VuLXBsdWc9IiArIHBsdWdpbl9wYXRoKTsKKyAgICB9CisgIH0KKworICBzY29wZWRfYXJyYXk8Y29uc3QgY2hhcio+IGFyZ3YobmV3IGNvbnN0IGNoYXIqW2FyZ3Muc2l6ZSgpXSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgYXJnc1tpXSA9IFN0cmluZ1JlcGxhY2UoYXJnc1tpXSwgIiR0bXBkaXIiLCB0ZW1wX2RpcmVjdG9yeV8sIHRydWUpOworICAgIGFyZ3ZbaV0gPSBhcmdzW2ldLmNfc3RyKCk7CisgIH0KKworICBDYXB0dXJlVGVzdFN0ZGVycigpOworCisgIHJldHVybl9jb2RlXyA9IGNsaV8uUnVuKGFyZ3Muc2l6ZSgpLCBhcmd2LmdldCgpKTsKKworICBlcnJvcl90ZXh0XyA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpDcmVhdGVUZW1wRmlsZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBjb250ZW50cykgeworICAvLyBDcmVhdGUgcGFyZW50IGRpcmVjdG9yeSwgaWYgbmVjZXNzYXJ5LgorICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaF9wb3MgPSBuYW1lLmZpbmRfbGFzdF9vZignLycpOworICBpZiAoc2xhc2hfcG9zICE9IHN0cmluZzo6bnBvcykgeworICAgIHN0cmluZyBkaXIgPSBuYW1lLnN1YnN0cigwLCBzbGFzaF9wb3MpOworICAgIEZpbGU6OlJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKHRlbXBfZGlyZWN0b3J5XyArICIvIiArIGRpciwgMDc3Nyk7CisgIH0KKworICAvLyBXcml0ZSBmaWxlLgorICBzdHJpbmcgZnVsbF9uYW1lID0gdGVtcF9kaXJlY3RvcnlfICsgIi8iICsgbmFtZTsKKyAgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZShjb250ZW50cywgZnVsbF9uYW1lKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkNyZWF0ZVRlbXBEaXIoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIEZpbGU6OlJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKHRlbXBfZGlyZWN0b3J5XyArICIvIiArIG5hbWUsIDA3NzcpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3ROb0Vycm9ycygpIHsKKyAgRVhQRUNUX0VRKDAsIHJldHVybl9jb2RlXyk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfdGV4dF8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JUZXh0KGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICBFWFBFQ1RfTkUoMCwgcmV0dXJuX2NvZGVfKTsKKyAgRVhQRUNUX0VRKFN0cmluZ1JlcGxhY2UoZXhwZWN0ZWRfdGV4dCwgIiR0bXBkaXIiLCB0ZW1wX2RpcmVjdG9yeV8sIHRydWUpLAorICAgICAgICAgICAgZXJyb3JfdGV4dF8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKKyAgRVhQRUNUX05FKDAsIHJldHVybl9jb2RlXyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIGV4cGVjdGVkX3N1YnN0cmluZywgZXJyb3JfdGV4dF8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoCisgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKKyAgRVhQRUNUX0VRKDAsIHJldHVybl9jb2RlXyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIGV4cGVjdGVkX3N1YnN0cmluZywgZXJyb3JfdGV4dF8pOworfQorCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6SGFzQWx0ZXJuYXRlRXJyb3JTdWJzdHJpbmcoCisgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKKyAgRVhQRUNUX05FKDAsIHJldHVybl9jb2RlXyk7CisgIHJldHVybiBlcnJvcl90ZXh0Xy5maW5kKGV4cGVjdGVkX3N1YnN0cmluZykgIT0gc3RyaW5nOjpucG9zOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0R2VuZXJhdGVkKAorICAgIGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lKSB7CisgIE1vY2tDb2RlR2VuZXJhdG9yOjpFeHBlY3RHZW5lcmF0ZWQoCisgICAgICBnZW5lcmF0b3JfbmFtZSwgcGFyYW1ldGVyLCAiIiwgcHJvdG9fbmFtZSwgbWVzc2FnZV9uYW1lLCBwcm90b19uYW1lLAorICAgICAgdGVtcF9kaXJlY3RvcnlfKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEdlbmVyYXRlZCgKKyAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIG91dHB1dF9kaXJlY3RvcnkpIHsKKyAgTW9ja0NvZGVHZW5lcmF0b3I6OkV4cGVjdEdlbmVyYXRlZCgKKyAgICAgIGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsICIiLCBwcm90b19uYW1lLCBtZXNzYWdlX25hbWUsIHByb3RvX25hbWUsCisgICAgICB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBvdXRwdXRfZGlyZWN0b3J5KTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygKKyAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgYWxsX3Byb3RvX25hbWVzLAorICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSkgeworICBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKAorICAgICAgZ2VuZXJhdG9yX25hbWUsICIiLCAiIiwgcHJvdG9fbmFtZSwgbWVzc2FnZV9uYW1lLAorICAgICAgYWxsX3Byb3RvX25hbWVzLAorICAgICAgdGVtcF9kaXJlY3RvcnlfKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEdlbmVyYXRlZFdpdGhJbnNlcnRpb25zKAorICAgIGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25zLAorICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSkgeworICBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKAorICAgICAgZ2VuZXJhdG9yX25hbWUsIHBhcmFtZXRlciwgaW5zZXJ0aW9ucywgcHJvdG9fbmFtZSwgbWVzc2FnZV9uYW1lLAorICAgICAgcHJvdG9fbmFtZSwgdGVtcF9kaXJlY3RvcnlfKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdE51bGxDb2RlR2VuZXJhdG9yQ2FsbGVkKAorICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyKSB7CisgIEVYUEVDVF9UUlVFKG51bGxfZ2VuZXJhdG9yXy0+Y2FsbGVkXyk7CisgIEVYUEVDVF9FUShwYXJhbWV0ZXIsIG51bGxfZ2VuZXJhdG9yXy0+cGFyYW1ldGVyXyk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpSZWFkRGVzY3JpcHRvclNldCgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBGaWxlRGVzY3JpcHRvclNldCogZGVzY3JpcHRvcl9zZXQpIHsKKyAgc3RyaW5nIHBhdGggPSB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBmaWxlbmFtZTsKKyAgc3RyaW5nIGZpbGVfY29udGVudHM7CisgIGlmICghRmlsZTo6UmVhZEZpbGVUb1N0cmluZyhwYXRoLCAmZmlsZV9jb250ZW50cykpIHsKKyAgICBGQUlMKCkgPDwgIkZpbGUgbm90IGZvdW5kOiAiIDw8IHBhdGg7CisgIH0KKyAgaWYgKCFkZXNjcmlwdG9yX3NldC0+UGFyc2VGcm9tU3RyaW5nKGZpbGVfY29udGVudHMpKSB7CisgICAgRkFJTCgpIDw8ICJDb3VsZCBub3QgcGFyc2UgZmlsZSBjb250ZW50czogIiA8PCBwYXRoOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQmFzaWNPdXRwdXQpIHsKKyAgLy8gVGVzdCB0aGF0IHRoZSBjb21tb24gY2FzZSB3b3Jrcy4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEJhc2ljUGx1Z2luKSB7CisgIC8vIFRlc3QgdGhhdCBiYXNpYyBwbHVnaW5zIHdvcmsuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JBbmRQbHVnaW4pIHsKKyAgLy8gSW52b2tlIGEgZ2VuZXJhdG9yIGFuZCBhIHBsdWdpbiBhdCB0aGUgc2FtZSB0aW1lLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9wbHVnaW4iLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTXVsdGlwbGVJbnB1dHMpIHsKKyAgLy8gVGVzdCBwYXJzaW5nIG11bHRpcGxlIGlucHV0IGZpbGVzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEJhciB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8gYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG8iLCAiRm9vIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9nZW5lcmF0b3IiLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFyLnByb3RvIiwgIkJhciIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X3BsdWdpbiIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE11bHRpcGxlSW5wdXRzV2l0aEltcG9ydCkgeworICAvLyBUZXN0IHBhcnNpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMgd2l0aCBhbiBpbXBvcnQgb2YgYSBzZXBhcmF0ZSBmaWxlLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJiYXoucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICIgIG9wdGlvbmFsIEJheiBhID0gMTtcbiIKKyAgICAifVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXoucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEJheiB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8gYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG8iLCAiRm9vIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9nZW5lcmF0b3IiLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFyLnByb3RvIiwgIkJhciIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X3BsdWdpbiIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIENyZWF0ZURpcmVjdG9yeSkgeworICAvLyBUZXN0IHRoYXQgd2hlbiB3ZSBvdXRwdXQgdG8gYSBzdWItZGlyZWN0b3J5LCBpdCBpcyBjcmVhdGVkLgorCisgIENyZWF0ZVRlbXBGaWxlKCJiYXIvYmF6L2Zvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcERpcigib3V0Iik7CisgIENyZWF0ZVRlbXBEaXIoInBsdWdvdXQiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpci9vdXQgLS1wbHVnX291dD0kdG1wZGlyL3BsdWdvdXQgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGJhci9iYXovZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiYmFyL2Jhei9mb28ucHJvdG8iLCAiRm9vIiwgIm91dCIpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfcGx1Z2luIiwgIiIsICJiYXIvYmF6L2Zvby5wcm90byIsICJGb28iLCAicGx1Z291dCIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JQYXJhbWV0ZXJzKSB7CisgIC8vIFRlc3QgdGhhdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBhcmUgY29ycmVjdGx5IHBhcnNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXBsdWdfb3V0PVRlc3RQbHVnaW5QYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICJUZXN0UGFyYW1ldGVyIiwgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICJUZXN0UGx1Z2luUGFyYW1ldGVyIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRXh0cmFHZW5lcmF0b3JQYXJhbWV0ZXJzKSB7CisgIC8vIFRlc3QgdGhhdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBzcGVjaWZpZWQgd2l0aCB0aGUgb3B0aW9uIGZsYWcgYXJlCisgIC8vIGNvcnJlY3RseSBwYXNzZWQgdG8gdGhlIGNvZGUgZ2VuZXJhdG9yLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIC8vIENyZWF0ZSB0aGUgImEiIGFuZCAiYiIgc3ViLWRpcmVjdG9yaWVzLgorICBDcmVhdGVUZW1wRGlyKCJhIik7CisgIENyZWF0ZVRlbXBEaXIoImIiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyICIKKyAgICAgICItLXRlc3Rfb3B0PWZvbzEgIgorICAgICAgIi0tdGVzdF9vdXQ9YmFyOiR0bXBkaXIvYSAiCisgICAgICAiLS10ZXN0X29wdD1mb28yICIKKyAgICAgICItLXRlc3Rfb3V0PWJhejokdG1wZGlyL2IgIgorICAgICAgIi0tdGVzdF9vcHQ9Zm9vMyAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKAorICAgICAgInRlc3RfZ2VuZXJhdG9yIiwgImJhcixmb28xLGZvbzIsZm9vMyIsICJmb28ucHJvdG8iLCAiRm9vIiwgImEiKTsKKyAgRXhwZWN0R2VuZXJhdGVkKAorICAgICAgInRlc3RfZ2VuZXJhdG9yIiwgImJheixmb28xLGZvbzIsZm9vMyIsICJmb28ucHJvdG8iLCAiRm9vIiwgImIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSW5zZXJ0KSB7CisgIC8vIFRlc3QgcnVubmluZyBhIGdlbmVyYXRvciB0aGF0IGluc2VydHMgY29kZSBpbnRvIGFub3RoZXIncyBvdXRwdXQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyICIKKyAgICAgICItLXRlc3Rfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wbHVnX291dD1UZXN0UGx1Z2luUGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tdGVzdF9vdXQ9aW5zZXJ0PXRlc3RfZ2VuZXJhdG9yLHRlc3RfcGx1Z2luOiR0bXBkaXIgIgorICAgICAgIi0tcGx1Z19vdXQ9aW5zZXJ0PXRlc3RfZ2VuZXJhdG9yLHRlc3RfcGx1Z2luOiR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhJbnNlcnRpb25zKAorICAgICAgInRlc3RfZ2VuZXJhdG9yIiwgIlRlc3RQYXJhbWV0ZXIiLCAidGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW4iLAorICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aEluc2VydGlvbnMoCisgICAgICAidGVzdF9wbHVnaW4iLCAiVGVzdFBsdWdpblBhcmFtZXRlciIsICJ0ZXN0X2dlbmVyYXRvcix0ZXN0X3BsdWdpbiIsCisgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCisjaWYgZGVmaW5lZChfV0lOMzIpCisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFdpbmRvd3NPdXRwdXRQYXRoKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgb3V0cHV0IHBhdGggY2FuIGJlIGEgV2luZG93cy1zdHlsZSBwYXRoLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLW51bGxfb3V0PUM6XFwgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdE51bGxDb2RlR2VuZXJhdG9yQ2FsbGVkKCIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV2luZG93c091dHB1dFBhdGhBbmRQYXJhbWV0ZXIpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbiBoYXZlIGEgd2luZG93cy1zdHlsZSBvdXRwdXQgcGF0aCBhbmQgYSBwYXJhbWV0ZXIuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tbnVsbF9vdXQ9YmFyOkM6XFwgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdE51bGxDb2RlR2VuZXJhdG9yQ2FsbGVkKCJiYXIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgVHJhaWxpbmdCYWNrc2xhc2gpIHsKKyAgLy8gVGVzdCB0aGF0IHRoZSBkaXJlY3RvcmllcyBjYW4gZW5kIGluIGJhY2tzbGFzaGVzLiAgU29tZSB1c2VycyBjbGFpbSB0aGlzCisgIC8vIGRvZXNuJ3Qgd29yayBvbiB0aGVpciBzeXN0ZW0uCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpclxcICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpclxcIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworI2VuZGlmICAvLyBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXRoTG9va3VwKSB7CisgIC8vIFRlc3QgdGhhdCBzcGVjaWZ5aW5nIG11bHRpcGxlIGRpcmVjdG9yaWVzIGluIHRoZSBwcm90byBzZWFyY2ggcGF0aCB3b3Jrcy4KKworICBDcmVhdGVUZW1wRmlsZSgiYi9iYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEJhciB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJhL2Zvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgIiAgb3B0aW9uYWwgQmFyIGEgPSAxO1xuIgorICAgICJ9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImIvZm9vLnByb3RvIiwgInRoaXMgc2hvdWxkIG5vdCBiZSBwYXJzZWRcbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpci9hIC0tcHJvdG9fcGF0aD0kdG1wZGlyL2IgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDb2xvbkRlbGltaXRlZFBhdGgpIHsKKyAgLy8gU2FtZSBhcyBQYXRoTG9va3VwLCBidXQgd2UgcHJvdmlkZSB0aGUgcHJvdG9fcGF0aCBpbiBhIHNpbmdsZSBmbGFnLgorCisgIENyZWF0ZVRlbXBGaWxlKCJiL2Jhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImEvZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICBvcHRpb25hbCBCYXIgYSA9IDE7XG4iCisgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYi9mb28ucHJvdG8iLCAidGhpcyBzaG91bGQgbm90IGJlIHBhcnNlZFxuIik7CisKKyN1bmRlZiBQQVRIX1NFUEFSQVRPUgorI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAiOyIKKyNlbHNlCisjZGVmaW5lIFBBVEhfU0VQQVJBVE9SICI6IgorI2VuZGlmCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2EiUEFUSF9TRVBBUkFUT1IiJHRtcGRpci9iIGZvby5wcm90byIpOworCisjdW5kZWYgUEFUSF9TRVBBUkFUT1IKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE5vblJvb3RNYXBwaW5nKSB7CisgIC8vIFRlc3Qgc2V0dGluZyB1cCBhIHNlYXJjaCBwYXRoIG1hcHBpbmcgYSBkaXJlY3RvcnkgdG8gYSBub24tcm9vdCBsb2NhdGlvbi4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9YmFyPSR0bXBkaXIgYmFyL2Zvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImJhci9mb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE11bHRpcGxlR2VuZXJhdG9ycykgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIGhhdmUgbXVsdGlwbGUgZ2VuZXJhdG9ycyBhbmQgdXNlIGJvdGggaW4gb25lIGludm9jYXRpb24sCisgIC8vIGVhY2ggd2l0aCBhIGRpZmZlcmVudCBvdXRwdXQgZGlyZWN0b3J5LgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIC8vIENyZWF0ZSB0aGUgImEiIGFuZCAiYiIgc3ViLWRpcmVjdG9yaWVzLgorICBDcmVhdGVUZW1wRGlyKCJhIik7CisgIENyZWF0ZVRlbXBEaXIoImIiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyICIKKyAgICAgICItLXRlc3Rfb3V0PSR0bXBkaXIvYSAiCisgICAgICAiLS1hbHRfb3V0PSR0bXBkaXIvYiAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIsICJhIik7CisgIEV4cGVjdEdlbmVyYXRlZCgiYWx0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIsICJiIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIERpc2FsbG93U2VydmljZXNOb1NlcnZpY2VzKSB7CisgIC8vIFRlc3QgdGhhdCAtLWRpc2FsbG93X3NlcnZpY2VzIGRvZXNuJ3QgY2F1c2UgYSBwcm9ibGVtIHdoZW4gdGhlcmUgYXJlIG5vCisgIC8vIHNlcnZpY2VzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRpc2FsbG93X3NlcnZpY2VzIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBEaXNhbGxvd1NlcnZpY2VzSGFzU2VydmljZSkgeworICAvLyBUZXN0IHRoYXQgLS1kaXNhbGxvd19zZXJ2aWNlcyBwcm9kdWNlcyBhbiBlcnJvciB3aGVuIHRoZXJlIGFyZSBzZXJ2aWNlcy4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIKKyAgICAic2VydmljZSBCYXIge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kaXNhbGxvd19zZXJ2aWNlcyAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJmb28ucHJvdG86IFRoaXMgZmlsZSBjb250YWlucyBzZXJ2aWNlcyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBBbGxvd1NlcnZpY2VzSGFzU2VydmljZSkgeworICAvLyBUZXN0IHRoYXQgc2VydmljZXMgd29yayBmaW5lIGFzIGxvbmcgYXMgLS1kaXNhbGxvd19zZXJ2aWNlcyBpcyBub3QgdXNlZC4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIKKyAgICAic2VydmljZSBCYXIge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEN3ZFJlbGF0aXZlSW5wdXRzKSB7CisgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gYWNjZXB0IHdvcmtpbmctZGlyZWN0b3J5LXJlbGF0aXZlIGlucHV0IGZpbGVzLgorCisgIFNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGZhbHNlKTsKKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciAkdG1wZGlyL2Zvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXNjcmlwdG9yU2V0KSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGJhci5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisKKyAgRmlsZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQ7CisgIFJlYWREZXNjcmlwdG9yU2V0KCJkZXNjcmlwdG9yX3NldCIsICZkZXNjcmlwdG9yX3NldCk7CisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICBBU1NFUlRfRVEoMSwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpKTsKKyAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIG5vdCBoYXZlIHNvdXJjZSBjb2RlIGluZm8uCisgIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlc2NyaXB0b3JTZXRXaXRoU291cmNlSW5mbykgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCisgICAgIm1lc3NhZ2UgQmFyIHtcbiIKKyAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKKyAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlc2NyaXB0b3Jfc2V0X291dD0kdG1wZGlyL2Rlc2NyaXB0b3Jfc2V0ICIKKyAgICAgICItLWluY2x1ZGVfc291cmNlX2luZm8gLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgIEFTU0VSVF9FUSgxLCBkZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOworICAvLyBTb3VyY2UgY29kZSBpbmZvIGluY2x1ZGVkLgorICBFWFBFQ1RfVFJVRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZVRyYW5zaXRpdmVEZXNjcmlwdG9yU2V0KSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgorICAgICAgIi0taW5jbHVkZV9pbXBvcnRzIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGJhci5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisKKyAgRmlsZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQ7CisgIFJlYWREZXNjcmlwdG9yU2V0KCJkZXNjcmlwdG9yX3NldCIsICZkZXNjcmlwdG9yX3NldCk7CisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICBBU1NFUlRfRVEoMiwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOworICBpZiAoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkgPT0gImJhci5wcm90byIpIHsKKyAgICBzdGQ6OnN3YXAoZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzBdLAorICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC5tdXRhYmxlX2ZpbGUoKS0+bXV0YWJsZV9kYXRhKClbMV0pOworICB9CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkubmFtZSgpKTsKKyAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIG5vdCBoYXZlIHNvdXJjZSBjb2RlIGluZm8uCisgIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworICBFWFBFQ1RfRkFMU0UoZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVUcmFuc2l0aXZlRGVzY3JpcHRvclNldFdpdGhTb3VyY2VJbmZvKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgorICAgICAgIi0taW5jbHVkZV9pbXBvcnRzIC0taW5jbHVkZV9zb3VyY2VfaW5mbyAtLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworCisgIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OworICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgQVNTRVJUX0VRKDIsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKKyAgaWYgKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpID09ICJiYXIucHJvdG8iKSB7CisgICAgc3RkOjpzd2FwKGRlc2NyaXB0b3Jfc2V0Lm11dGFibGVfZmlsZSgpLT5tdXRhYmxlX2RhdGEoKVswXSwKKyAgICAgICAgICAgICAgZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzFdKTsKKyAgfQorICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDEpLm5hbWUoKSk7CisgIC8vIFNvdXJjZSBjb2RlIGluZm8gaW5jbHVkZWQuCisgIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisgIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGFyc2VFcnJvcnMpIHsKKyAgLy8gVGVzdCB0aGF0IHBhcnNlIGVycm9ycyBhcmUgcmVwb3J0ZWQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImJhZHN5bnRheFxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAiZm9vLnByb3RvOjI6MTogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGFyc2VFcnJvcnNNdWx0aXBsZUZpbGVzKSB7CisgIC8vIFRlc3QgdGhhdCBwYXJzZSBlcnJvcnMgYXJlIHJlcG9ydGVkIGZyb20gbXVsdGlwbGUgZmlsZXMuCisKKyAgLy8gV2Ugc2V0IHVwIGZpbGVzIHN1Y2ggdGhhdCBmb28ucHJvdG8gYWN0dWFsbHkgZGVwZW5kcyBvbiBiYXIucHJvdG8gaW4KKyAgLy8gdHdvIHdheXM6ICBEaXJlY3RseSBhbmQgdGhyb3VnaCBiYXoucHJvdG8uICBiYXIucHJvdG8ncyBlcnJvcnMgc2hvdWxkCisgIC8vIG9ubHkgYmUgcmVwb3J0ZWQgb25jZS4KKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImJhZHN5bnRheFxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXoucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIpOworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgImltcG9ydCBcImJhei5wcm90b1wiO1xuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAiYmFyLnByb3RvOjI6MTogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iCisgICAgImJhei5wcm90bzogSW1wb3J0IFwiYmFyLnByb3RvXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLlxuIgorICAgICJmb28ucHJvdG86IEltcG9ydCBcImJhci5wcm90b1wiIHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy5cbiIKKyAgICAiZm9vLnByb3RvOiBJbXBvcnQgXCJiYXoucHJvdG9cIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSW5wdXROb3RGb3VuZEVycm9yKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbnB1dCBmaWxlIGlzIG5vdCBmb3VuZC4KKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICJmb28ucHJvdG86IEZpbGUgbm90IGZvdW5kLlxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEN3ZFJlbGF0aXZlSW5wdXROb3RGb3VuZEVycm9yKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gYSB3b3JraW5nLWRpcmVjdG9yeS1yZWxhdGl2ZSBpbnB1dCBmaWxlIGlzIG5vdAorICAvLyBmb3VuZC4KKworICBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShmYWxzZSk7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyICR0bXBkaXIvZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICIkdG1wZGlyL2Zvby5wcm90bzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEN3ZFJlbGF0aXZlSW5wdXROb3RNYXBwZWRFcnJvcikgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgd29ya2luZy1kaXJlY3RvcnktcmVsYXRpdmUgaW5wdXQgZmlsZSBpcyBub3QKKyAgLy8gbWFwcGVkIHRvIGEgdmlydHVhbCBwYXRoLgorCisgIFNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGZhbHNlKTsKKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBjYWxsZWQgImJhciIgc28gdGhhdCB3ZSBjYW4gcG9pbnQgLS1wcm90b19wYXRoIGF0IGl0LgorICBDcmVhdGVUZW1wRmlsZSgiYmFyL2R1bW15IiwgIiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpci9iYXIgJHRtcGRpci9mb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgIiR0bXBkaXIvZm9vLnByb3RvOiBGaWxlIGRvZXMgbm90IHJlc2lkZSB3aXRoaW4gYW55IHBhdGggIgorICAgICAgInNwZWNpZmllZCB1c2luZyAtLXByb3RvX3BhdGggKG9yIC1JKS4gIFlvdSBtdXN0IHNwZWNpZnkgYSAiCisgICAgICAiLS1wcm90b19wYXRoIHdoaWNoIGVuY29tcGFzc2VzIHRoaXMgZmlsZS4gIE5vdGUgdGhhdCB0aGUgIgorICAgICAgInByb3RvX3BhdGggbXVzdCBiZSBhbiBleGFjdCBwcmVmaXggb2YgdGhlIC5wcm90byBmaWxlICIKKyAgICAgICJuYW1lcyAtLSBwcm90b2MgaXMgdG9vIGR1bWIgdG8gZmlndXJlIG91dCB3aGVuIHR3byBwYXRocyAiCisgICAgICAiKGUuZy4gYWJzb2x1dGUgYW5kIHJlbGF0aXZlKSBhcmUgZXF1aXZhbGVudCAoaXQncyBoYXJkZXIgIgorICAgICAgInRoYW4geW91IHRoaW5rKS5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDd2RSZWxhdGl2ZUlucHV0Tm90Rm91bmRBbmROb3RNYXBwZWRFcnJvcikgeworICAvLyBDaGVjayB3aGF0IGhhcHBlbnMgaWYgdGhlIGlucHV0IGZpbGUgaXMgbm90IGZvdW5kICphbmQqIGlzIG5vdCBtYXBwZWQKKyAgLy8gaW4gdGhlIHByb3RvX3BhdGguCisKKyAgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoZmFsc2UpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBjYWxsZWQgImJhciIgc28gdGhhdCB3ZSBjYW4gcG9pbnQgLS1wcm90b19wYXRoIGF0IGl0LgorICBDcmVhdGVUZW1wRmlsZSgiYmFyL2R1bW15IiwgIiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpci9iYXIgJHRtcGRpci9mb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgIiR0bXBkaXIvZm9vLnByb3RvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3dkUmVsYXRpdmVJbnB1dFNoYWRvd2VkRXJyb3IpIHsKKyAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiBhIHdvcmtpbmctZGlyZWN0b3J5LXJlbGF0aXZlIGlucHV0IGZpbGUgaXMgc2hhZG93ZWQKKyAgLy8gYnkgYW5vdGhlciBmaWxlIGluIHRoZSB2aXJ0dWFsIHBhdGguCisKKyAgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoZmFsc2UpOworCisgIENyZWF0ZVRlbXBGaWxlKCJmb28vZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyL2Zvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIvZm9vIC0tcHJvdG9fcGF0aD0kdG1wZGlyL2JhciAiCisgICAgICAiJHRtcGRpci9iYXIvZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICIkdG1wZGlyL2Jhci9mb28ucHJvdG86IElucHV0IGlzIHNoYWRvd2VkIGluIHRoZSAtLXByb3RvX3BhdGggIgorICAgICJieSBcIiR0bXBkaXIvZm9vL2Zvby5wcm90b1wiLiAgRWl0aGVyIHVzZSB0aGUgbGF0dGVyICIKKyAgICAiZmlsZSBhcyB5b3VyIGlucHV0IG9yIHJlb3JkZXIgdGhlIC0tcHJvdG9fcGF0aCBzbyB0aGF0IHRoZSAiCisgICAgImZvcm1lciBmaWxlJ3MgbG9jYXRpb24gY29tZXMgZmlyc3QuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUHJvdG9QYXRoTm90Rm91bmRFcnJvcikgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyBpZiB0aGUgaW5wdXQgZmlsZSBpcyBub3QgZm91bmQuCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2ZvbyBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgIiR0bXBkaXIvZm9vOiB3YXJuaW5nOiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4iCisgICAgImZvby5wcm90bzogRmlsZSBub3QgZm91bmQuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTWlzc2luZ0lucHV0RXJyb3IpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGdldCBhbiBlcnJvciBpZiBubyBpbnB1dHMgYXJlIGdpdmVuLgorCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciIpOworCisgIEV4cGVjdEVycm9yVGV4dCgiTWlzc2luZyBpbnB1dCBmaWxlLlxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE1pc3NpbmdPdXRwdXRFcnJvcikgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJNaXNzaW5nIG91dHB1dCBkaXJlY3RpdmVzLlxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE91dHB1dFdyaXRlRXJyb3IpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBzdHJpbmcgb3V0cHV0X2ZpbGUgPQorICAgICAgTW9ja0NvZGVHZW5lcmF0b3I6OkdldE91dHB1dEZpbGVOYW1lKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8iKTsKKworICAvLyBDcmVhdGUgYSBkaXJlY3RvcnkgYmxvY2tpbmcgb3VyIG91dHB1dCBsb2NhdGlvbi4KKyAgQ3JlYXRlVGVtcERpcihvdXRwdXRfZmlsZSk7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIC8vIE1vY2tDb2RlR2VuZXJhdG9yIG5vIGxvbmdlciBkZXRlY3RzIGFuIGVycm9yIGJlY2F1c2Ugd2UgYWN0dWFsbHkgd3JpdGUgdG8KKyAgLy8gYW4gaW4tbWVtb3J5IGxvY2F0aW9uIGZpcnN0LCB0aGVuIGR1bXAgdG8gZGlzayBhdCB0aGUgZW5kLiAgVGhpcyBpcyBubworICAvLyBiaWcgZGVhbC4KKyAgLy8gICBFeHBlY3RFcnJvclN1YnN0cmluZygiTW9ja0NvZGVHZW5lcmF0b3IgZGV0ZWN0ZWQgd3JpdGUgZXJyb3IuIik7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyAgLy8gV2luZG93cyB3aXRoIE1TVkNSVC5kbGwgcHJvZHVjZXMgRVBFUk0gaW5zdGVhZCBvZiBFSVNESVIuCisgIGlmIChIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZyhvdXRwdXRfZmlsZSArICI6IFBlcm1pc3Npb24gZGVuaWVkIikpIHsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogSXMgYSBkaXJlY3RvcnkiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luT3V0cHV0V3JpdGVFcnJvcikgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIHN0cmluZyBvdXRwdXRfZmlsZSA9CisgICAgICBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZU5hbWUoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byIpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBibG9ja2luZyBvdXIgb3V0cHV0IGxvY2F0aW9uLgorICBDcmVhdGVUZW1wRGlyKG91dHB1dF9maWxlKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyAgLy8gV2luZG93cyB3aXRoIE1TVkNSVC5kbGwgcHJvZHVjZXMgRVBFUk0gaW5zdGVhZCBvZiBFSVNESVIuCisgIGlmIChIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZyhvdXRwdXRfZmlsZSArICI6IFBlcm1pc3Npb24gZGVuaWVkIikpIHsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogSXMgYSBkaXJlY3RvcnkiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgT3V0cHV0RGlyZWN0b3J5Tm90Rm91bmRFcnJvcikgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyL25vc3VjaGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIm5vc3VjaGRpci86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luT3V0cHV0RGlyZWN0b3J5Tm90Rm91bmRFcnJvcikgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD0kdG1wZGlyL25vc3VjaGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIm5vc3VjaGRpci86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgT3V0cHV0RGlyZWN0b3J5SXNGaWxlRXJyb3IpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpci9mb28ucHJvdG8gIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisgIC8vIFdpbmRvd3Mgd2l0aCBNU1ZDUlQuZGxsIHByb2R1Y2VzIEVJTlZBTCBpbnN0ZWFkIG9mIEVOT1RESVIuCisgIGlmIChIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZygiZm9vLnByb3RvLzogSW52YWxpZCBhcmd1bWVudCIpKSB7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiZm9vLnByb3RvLzogTm90IGEgZGlyZWN0b3J5Iik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvckVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAiLS10ZXN0X291dDogZm9vLnByb3RvOiBTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yLiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JQbHVnaW5FcnJvcikgeworICAvLyBUZXN0IGEgZ2VuZXJhdG9yIHBsdWdpbiB0aGF0IHJldHVybnMgYW4gZXJyb3IuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3Ige31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgIi0tcGx1Z19vdXQ6IGZvby5wcm90bzogU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvci4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yUGx1Z2luRmFpbCkgeworICAvLyBUZXN0IGEgZ2VuZXJhdG9yIHBsdWdpbiB0aGF0IGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0IHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0LiIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXBsdWdfb3V0OiBwcmVmaXgtZ2VuLXBsdWc6IFBsdWdpbiBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAxMjMuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbkNyYXNoKSB7CisgIC8vIFRlc3QgYSBnZW5lcmF0b3IgcGx1Z2luIHRoYXQgY3Jhc2hlcy4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydCB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfQWJvcnQuIik7CisKKyNpZmRlZiBfV0lOMzIKKyAgLy8gV2luZG93cyBkb2Vzbid0IGhhdmUgc2lnbmFscy4gIEl0IGxvb2tzIGxpa2UgYWJvcnQoKWluZyBjYXVzZXMgdGhlIHByb2Nlc3MKKyAgLy8gdG8gZXhpdCB3aXRoIHN0YXR1cyBjb2RlIDMsIGJ1dCBsZXQncyBub3QgZGVwZW5kIG9uIHRoZSBleGFjdCBudW1iZXIgaGVyZS4KKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAiLS1wbHVnX291dDogcHJlZml4LWdlbi1wbHVnOiBQbHVnaW4gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUiKTsKKyNlbHNlCisgIC8vIERvbid0IGRlcGVuZCBvbiB0aGUgZXhhY3Qgc2lnbmFsIG51bWJlci4KKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAiLS1wbHVnX291dDogcHJlZml4LWdlbi1wbHVnOiBQbHVnaW4ga2lsbGVkIGJ5IHNpZ25hbCIpOworI2VuZGlmCit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBsdWdpblJlY2VpdmVzU291cmNlQ29kZUluZm8pIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgTW9ja0NvZGVHZW5lcmF0b3JfSGFzU291cmNlQ29kZUluZm8ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD0kdG1wZGlyIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfSGFzU291cmNlQ29kZUluZm86IDEuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbk5vdEZvdW5kKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBwbHVnaW4gaXNuJ3QgZm91bmQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImVycm9yLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1iYWRwbHVnX291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tcGx1Z2luPXByZWZpeC1nZW4tYmFkcGx1Zz1ub19zdWNoX2ZpbGUgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGVycm9yLnByb3RvIik7CisKKyNpZmRlZiBfV0lOMzIKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIi0tYmFkcGx1Z19vdXQ6IHByZWZpeC1nZW4tYmFkcGx1ZzogIiArCisgICAgICBTdWJwcm9jZXNzOjpXaW4zMkVycm9yTWVzc2FnZShFUlJPUl9GSUxFX05PVF9GT1VORCkpOworI2Vsc2UKKyAgLy8gRXJyb3Igd3JpdHRlbiB0byBzdGRvdXQgYnkgY2hpbGQgcHJvY2VzcyBhZnRlciBleGVjKCkgZmFpbHMuCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgIm5vX3N1Y2hfZmlsZTogcHJvZ3JhbSBub3QgZm91bmQgb3IgaXMgbm90IGV4ZWN1dGFibGUiKTsKKworICAvLyBFcnJvciB3cml0dGVuIGJ5IHBhcmVudCBwcm9jZXNzIHdoZW4gY2hpbGQgZmFpbHMuCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgIi0tYmFkcGx1Z19vdXQ6IHByZWZpeC1nZW4tYmFkcGx1ZzogUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDEuIik7CisjZW5kaWYKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yUGx1Z2luTm90QWxsb3dlZCkgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyBpZiBwbHVnaW5zIGFyZW4ndCBhbGxvd2VkLgorCisgIENyZWF0ZVRlbXBGaWxlKCJlcnJvci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBEaXNhbGxvd1BsdWdpbnMoKTsKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZXJyb3IucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiVW5rbm93biBmbGFnOiAtLXBsdWdfb3V0Iik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEhlbHBUZXh0KSB7CisgIFJ1bigidGVzdF9leGVjX25hbWUgLS1oZWxwIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoIlVzYWdlOiB0ZXN0X2V4ZWNfbmFtZSAiKTsKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoIi0tdGVzdF9vdXQ9T1VUX0RJUiIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgiVGVzdCBvdXRwdXQuIik7CisgIEV4cGVjdEVycm9yU3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKCItLWFsdF9vdXQ9T1VUX0RJUiIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgiQWx0IG91dHB1dC4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2NjRm9ybWF0RXJyb3JzKSB7CisgIC8vIFRlc3QgLS1lcnJvcl9mb3JtYXQ9Z2NjICh3aGljaCBpcyB0aGUgZGVmYXVsdCwgYnV0IHdlIHdhbnQgdG8gdmVyaWZ5CisgIC8vIHRoYXQgaXQgY2FuIGJlIHNldCBleHBsaWNpdGx5KS4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiYmFkc3ludGF4XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgLS1lcnJvcl9mb3JtYXQ9Z2NjIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAiZm9vLnByb3RvOjI6MTogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTXN2c0Zvcm1hdEVycm9ycykgeworICAvLyBUZXN0IC0tZXJyb3JfZm9ybWF0PW1zdnMKKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiYmFkc3ludGF4XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgLS1lcnJvcl9mb3JtYXQ9bXN2cyBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgIiR0bXBkaXIvZm9vLnByb3RvKDIpIDogZXJyb3IgaW4gY29sdW1uPTE6IEV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgIgorICAgICAgIihlLmcuIFwibWVzc2FnZVwiKS5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBJbnZhbGlkRXJyb3JGb3JtYXQpIHsKKyAgLy8gVGVzdCAtLWVycm9yX2Zvcm1hdD1tc3ZzCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImJhZHN5bnRheFxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIC0tZXJyb3JfZm9ybWF0PWludmFsaWQgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICJVbmtub3duIGVycm9yIGZvcm1hdDogaW52YWxpZFxuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsYWcgcGFyc2luZyB0ZXN0cworCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZVNpbmdsZUNoYXJhY3RlckZsYWcpIHsKKyAgLy8gVGVzdCB0aGF0IGEgc2luZ2xlLWNoYXJhY3RlciBmbGFnIHdvcmtzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtdCR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGFyc2VTcGFjZURlbGltaXRlZFZhbHVlKSB7CisgIC8vIFRlc3QgdGhhdCBzZXBhcmF0aW5nIHRoZSBmbGFnIHZhbHVlIHdpdGggYSBzcGFjZSB3b3Jrcy4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dCAkdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBhcnNlU2luZ2xlQ2hhcmFjdGVyU3BhY2VEZWxpbWl0ZWRWYWx1ZSkgeworICAvLyBUZXN0IHRoYXQgc2VwYXJhdGluZyB0aGUgZmxhZyB2YWx1ZSB3aXRoIGEgc3BhY2Ugd29ya3MgZm9yCisgIC8vIHNpbmdsZS1jaGFyYWN0ZXIgZmxhZ3MuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC10ICR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTWlzc2luZ1ZhbHVlRXJyb3IpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGdldCBhbiBlcnJvciBpZiBhIGZsYWcgaXMgbWlzc2luZyBpdHMgdmFsdWUuCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0IC0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgiTWlzc2luZyB2YWx1ZSBmb3IgZmxhZzogLS10ZXN0X291dFxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE1pc3NpbmdWYWx1ZUF0RW5kRXJyb3IpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGdldCBhbiBlcnJvciBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBhIGZsYWcgcmVxdWlyaW5nIGEKKyAgLy8gdmFsdWUuCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0Iik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJNaXNzaW5nIHZhbHVlIGZvciBmbGFnOiAtLXRlc3Rfb3V0XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IGZvciAtLWVuY29kZSBhbmQgLS1kZWNvZGUuICBOb3RlIHRoYXQgaXQgd291bGQgYmUgZWFzaWVyIHRvIGRvIHRoaXMKKy8vIHRlc3QgYXMgYSBzaGVsbCBzY3JpcHQsIGJ1dCB3ZSdkIGxpa2UgdG8gYmUgYWJsZSB0byBydW4gdGhlIHRlc3Qgb24KKy8vIHBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgYSBCb3VybmUtY29tcGF0aWJsZSBzaGVsbCBhdmFpbGFibGUgKGVzcGVjaWFsbHkKKy8vIFdpbmRvd3MvTVNWQykuCitjbGFzcyBFbmNvZGVEZWNvZGVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGR1cGVkX3N0ZGluXyA9IGR1cChTVERJTl9GSUxFTk8pOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGR1cDIoZHVwZWRfc3RkaW5fLCBTVERJTl9GSUxFTk8pOworICAgIGNsb3NlKGR1cGVkX3N0ZGluXyk7CisgIH0KKworICB2b2lkIFJlZGlyZWN0U3RkaW5Gcm9tVGV4dChjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgICAgc3RyaW5nIGZpbGVuYW1lID0gVGVzdFRlbXBEaXIoKSArICIvdGVzdF9zdGRpbiI7CisgICAgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZShpbnB1dCwgZmlsZW5hbWUpOworICAgIEdPT0dMRV9DSEVDSyhSZWRpcmVjdFN0ZGluRnJvbUZpbGUoZmlsZW5hbWUpKTsKKyAgfQorCisgIGJvb2wgUmVkaXJlY3RTdGRpbkZyb21GaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgZHVwMihmZCwgU1RESU5fRklMRU5PKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBSZW1vdmUgJ1xyJyBjaGFyYWN0ZXJzIGZyb20gdGV4dC4KKyAgc3RyaW5nIFN0cmlwQ1IoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CisgICAgc3RyaW5nIHJlc3VsdDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5zaXplKCk7IGkrKykgeworICAgICAgaWYgKHRleHRbaV0gIT0gJ1xyJykgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKHRleHRbaV0pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBlbnVtIFR5cGUgeyBURVhULCBCSU5BUlkgfTsKKyAgZW51bSBSZXR1cm5Db2RlIHsgU1VDQ0VTUywgRVJST1IgfTsKKworICBib29sIFJ1bihjb25zdCBzdHJpbmcmIGNvbW1hbmQpIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBhcmdzOworICAgIGFyZ3MucHVzaF9iYWNrKCJwcm90b2MiKTsKKyAgICBTcGxpdFN0cmluZ1VzaW5nKGNvbW1hbmQsICIgIiwgJmFyZ3MpOworICAgIGFyZ3MucHVzaF9iYWNrKCItLXByb3RvX3BhdGg9IiArIFRlc3RTb3VyY2VEaXIoKSk7CisKKyAgICBzY29wZWRfYXJyYXk8Y29uc3QgY2hhcio+IGFyZ3YobmV3IGNvbnN0IGNoYXIqW2FyZ3Muc2l6ZSgpXSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICBhcmd2W2ldID0gYXJnc1tpXS5jX3N0cigpOworICAgIH0KKworICAgIENvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgICBjbGkuU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUodHJ1ZSk7CisKKyAgICBDYXB0dXJlVGVzdFN0ZG91dCgpOworICAgIENhcHR1cmVUZXN0U3RkZXJyKCk7CisKKyAgICBpbnQgcmVzdWx0ID0gY2xpLlJ1bihhcmdzLnNpemUoKSwgYXJndi5nZXQoKSk7CisKKyAgICBjYXB0dXJlZF9zdGRvdXRfID0gR2V0Q2FwdHVyZWRUZXN0U3Rkb3V0KCk7CisgICAgY2FwdHVyZWRfc3RkZXJyXyA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworCisgICAgcmV0dXJuIHJlc3VsdCA9PSAwOworICB9CisKKyAgdm9pZCBFeHBlY3RTdGRvdXRNYXRjaGVzQmluYXJ5RmlsZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgc3RyaW5nIGV4cGVjdGVkX291dHB1dDsKKyAgICBBU1NFUlRfVFJVRShGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKGZpbGVuYW1lLCAmZXhwZWN0ZWRfb3V0cHV0KSk7CisKKyAgICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmludCByYXcgYmluYXJ5IGRhdGEgdG8KKyAgICAvLyBzdGRvdXQgb24gZmFpbHVyZS4KKyAgICBFWFBFQ1RfVFJVRShjYXB0dXJlZF9zdGRvdXRfID09IGV4cGVjdGVkX291dHB1dCk7CisgIH0KKworICB2b2lkIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0RmlsZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgc3RyaW5nIGV4cGVjdGVkX291dHB1dDsKKyAgICBBU1NFUlRfVFJVRShGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKGZpbGVuYW1lLCAmZXhwZWN0ZWRfb3V0cHV0KSk7CisKKyAgICBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dChleHBlY3RlZF9vdXRwdXQpOworICB9CisKKyAgdm9pZCBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dChjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3RleHQpIHsKKyAgICBFWFBFQ1RfRVEoU3RyaXBDUihleHBlY3RlZF90ZXh0KSwgU3RyaXBDUihjYXB0dXJlZF9zdGRvdXRfKSk7CisgIH0KKworICB2b2lkIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICAgIEVYUEVDVF9FUShTdHJpcENSKGV4cGVjdGVkX3RleHQpLCBTdHJpcENSKGNhcHR1cmVkX3N0ZGVycl8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgaW50IGR1cGVkX3N0ZGluXzsKKyAgc3RyaW5nIGNhcHR1cmVkX3N0ZG91dF87CisgIHN0cmluZyBjYXB0dXJlZF9zdGRlcnJfOworfTsKKworVEVTVF9GKEVuY29kZURlY29kZVRlc3QsIEVuY29kZSkgeworICBSZWRpcmVjdFN0ZGluRnJvbUZpbGUoVGVzdFNvdXJjZURpcigpICsKKyAgICAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCIpOworICBFWFBFQ1RfVFJVRShSdW4oImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byAiCisgICAgICAgICAgICAgICAgICAiLS1lbmNvZGU9cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIikpOworICBFeHBlY3RTdGRvdXRNYXRjaGVzQmluYXJ5RmlsZShUZXN0U291cmNlRGlyKCkgKworICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIik7CisgIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KCIiKTsKK30KKworVEVTVF9GKEVuY29kZURlY29kZVRlc3QsIERlY29kZSkgeworICBSZWRpcmVjdFN0ZGluRnJvbUZpbGUoVGVzdFNvdXJjZURpcigpICsKKyAgICAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSIpOworICBFWFBFQ1RfVFJVRShSdW4oImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byAiCisgICAgICAgICAgICAgICAgICAiLS1kZWNvZGU9cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIikpOworICBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dEZpbGUoVGVzdFNvdXJjZURpcigpICsKKyAgICAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCIpOworICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgiIik7Cit9CisKK1RFU1RfRihFbmNvZGVEZWNvZGVUZXN0LCBQYXJ0aWFsKSB7CisgIFJlZGlyZWN0U3RkaW5Gcm9tVGV4dCgiIik7CisgIEVYUEVDVF9UUlVFKFJ1bigiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICIKKyAgICAgICAgICAgICAgICAgICItLWVuY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KCIiKTsKKyAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoCisgICAgIndhcm5pbmc6ICBJbnB1dCBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAgYSwgYiwgY1xuIik7Cit9CisKK1RFU1RfRihFbmNvZGVEZWNvZGVUZXN0LCBEZWNvZGVSYXcpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9zdHJpbmcoImZvbyIpOworICBzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgUmVkaXJlY3RTdGRpbkZyb21UZXh0KGRhdGEpOworICBFWFBFQ1RfVFJVRShSdW4oIi0tZGVjb2RlX3JhdyIpKTsKKyAgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHQoIjE6IDEyM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiMTQ6IFwiZm9vXCJcbiIpOworICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgiIik7Cit9CisKK1RFU1RfRihFbmNvZGVEZWNvZGVUZXN0LCBVbmtub3duVHlwZSkgeworICBFWFBFQ1RfRkFMU0UoUnVuKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8gIgorICAgICAgICAgICAgICAgICAgICItLWVuY29kZT1Ob1N1Y2hUeXBlIikpOworICBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dCgiIik7CisgIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KCJUeXBlIG5vdCBkZWZpbmVkOiBOb1N1Y2hUeXBlXG4iKTsKK30KKworVEVTVF9GKEVuY29kZURlY29kZVRlc3QsIFByb3RvUGFyc2VFcnJvcikgeworICBFWFBFQ1RfRkFMU0UoUnVuKCJnb29nbGUvcHJvdG9idWYvbm9fc3VjaF9maWxlLnByb3RvICIKKyAgICAgICAgICAgICAgICAgICAiLS1lbmNvZGU9Tm9TdWNoVHlwZSIpKTsKKyAgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHQoIiIpOworICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgKKyAgICAiZ29vZ2xlL3Byb3RvYnVmL25vX3N1Y2hfZmlsZS5wcm90bzogRmlsZSBub3QgZm91bmQuXG4iKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzE3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgdGVzdCBpbnN1cmVzIHRoYXQgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIue2gsY2N9IG1hdGNoIGV4YWN0bHkKKy8vIHdoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBjb21waWxlci4gIFRoZXNlIGZpbGVzIGFyZSBub3QKKy8vIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGJ1aWxkIHRpbWUgYmVjYXVzZSB0aGV5IGFyZSBjb21waWxlZCBpbnRvIHRoZQorLy8gcHJvdG9jb2wgY29tcGlsZXIgaXRzZWxmLiAgU28sIGlmIHRoZXkgd2VyZSBhdXRvLWdlbmVyYXRlZCwgeW91J2QgaGF2ZSBhCisvLyBjaGlja2VuLWFuZC1lZ2cgcHJvYmxlbS4KKy8vCisvLyBJZiB0aGlzIHRlc3QgZmFpbHMsIHJ1biB0aGUgc2NyaXB0CisvLyAiZ2VuZXJhdGVfZGVzY3JpcHRvcl9wcm90by5zaCIgYW5kIGFkZAorLy8gZGVzY3JpcHRvci5wYi57aCxjY30gdG8geW91ciBjaGFuZ2VsaXN0LgorCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKworICBzdHJpbmcgdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICB9Cit9OworCitjbGFzcyBNb2NrR2VuZXJhdG9yQ29udGV4dCA6IHB1YmxpYyBHZW5lcmF0b3JDb250ZXh0IHsKKyBwdWJsaWM6CisgIE1vY2tHZW5lcmF0b3JDb250ZXh0KCkge30KKyAgfk1vY2tHZW5lcmF0b3JDb250ZXh0KCkgeworICAgIFNUTERlbGV0ZVZhbHVlcygmZmlsZXNfKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0RmlsZU1hdGNoZXMoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGh5c2ljYWxfZmlsZW5hbWUpIHsKKyAgICBzdHJpbmcqIGV4cGVjdGVkX2NvbnRlbnRzID0gRmluZFB0ck9yTnVsbChmaWxlc18sIHZpcnR1YWxfZmlsZW5hbWUpOworICAgIEFTU0VSVF9UUlVFKGV4cGVjdGVkX2NvbnRlbnRzICE9IE5VTEwpCisgICAgICA8PCAiR2VuZXJhdG9yIGZhaWxlZCB0byBnZW5lcmF0ZSBmaWxlOiAiIDw8IHZpcnR1YWxfZmlsZW5hbWU7CisKKyAgICBzdHJpbmcgYWN0dWFsX2NvbnRlbnRzOworICAgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZSgKKyAgICAgIFRlc3RTb3VyY2VEaXIoKSArICIvIiArIHBoeXNpY2FsX2ZpbGVuYW1lLAorICAgICAgJmFjdHVhbF9jb250ZW50cyk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsX2NvbnRlbnRzID09ICpleHBlY3RlZF9jb250ZW50cykKKyAgICAgIDw8IHBoeXNpY2FsX2ZpbGVuYW1lIDw8ICIgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWQuICBQbGVhc2UgcnVuICIKKyAgICAgICAgICJnZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoIGFuZCBhZGQgdGhpcyBmaWxlICIKKyAgICAgICAgICJ0byB5b3VyIENMLiI7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgc3RyaW5nKiogbWFwX3Nsb3QgPSAmZmlsZXNfW2ZpbGVuYW1lXTsKKyAgICBpZiAoKm1hcF9zbG90ICE9IE5VTEwpIGRlbGV0ZSAqbWFwX3Nsb3Q7CisgICAgKm1hcF9zbG90ID0gbmV3IHN0cmluZzsKKworICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbSgqbWFwX3Nsb3QpOworICB9CisKKyBwcml2YXRlOgorICBtYXA8c3RyaW5nLCBzdHJpbmcqPiBmaWxlc187Cit9OworCitURVNUKEJvb3RzdHJhcFRlc3QsIEdlbmVyYXRlZERlc2NyaXB0b3JNYXRjaGVzKSB7CisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOworICBzb3VyY2VfdHJlZS5NYXBQYXRoKCIiLCBUZXN0U291cmNlRGlyKCkpOworICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHJvdG9fZmlsZSA9CisgICAgaW1wb3J0ZXIuSW1wb3J0KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGx1Z2luX3Byb3RvX2ZpbGUgPQorICAgIGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byIpOworICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7CisgIEFTU0VSVF9UUlVFKHByb3RvX2ZpbGUgIT0gTlVMTCk7CisgIEFTU0VSVF9UUlVFKHBsdWdpbl9wcm90b19maWxlICE9IE5VTEwpOworCisgIENwcEdlbmVyYXRvciBnZW5lcmF0b3I7CisgIE1vY2tHZW5lcmF0b3JDb250ZXh0IGNvbnRleHQ7CisgIHN0cmluZyBlcnJvcjsKKyAgc3RyaW5nIHBhcmFtZXRlcjsKKyAgcGFyYW1ldGVyID0gImRsbGV4cG9ydF9kZWNsPUxJQlBST1RPQlVGX0VYUE9SVCI7CisgIEFTU0VSVF9UUlVFKGdlbmVyYXRvci5HZW5lcmF0ZShwcm90b19maWxlLCBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwgJmVycm9yKSk7CisgIHBhcmFtZXRlciA9ICJkbGxleHBvcnRfZGVjbD1MSUJQUk9UT0NfRVhQT1JUIjsKKyAgQVNTRVJUX1RSVUUoZ2VuZXJhdG9yLkdlbmVyYXRlKHBsdWdpbl9wcm90b19maWxlLCBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwgJmVycm9yKSk7CisKKyAgY29udGV4dC5FeHBlY3RGaWxlTWF0Y2hlcygiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgiKTsKKyAgY29udGV4dC5FeHBlY3RGaWxlTWF0Y2hlcygiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYyIpOworICBjb250ZXh0LkV4cGVjdEZpbGVNYXRjaGVzKCJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmgiKTsKKyAgY29udGV4dC5FeHBlY3RGaWxlTWF0Y2hlcygiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2MxMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYwpAQCAtMCwwICsxLDI1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworRW51bUdlbmVyYXRvcjo6RW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICBjbGFzc25hbWVfKENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSkpLAorICAgIG9wdGlvbnNfKG9wdGlvbnMpIHsKK30KKworRW51bUdlbmVyYXRvcjo6fkVudW1HZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKKyAgdmFyc1sic2hvcnRfbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKKworICBwcmludGVyLT5QcmludCh2YXJzLCAiZW51bSAkY2xhc3NuYW1lJCB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbWluX3ZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKDApOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBtYXhfdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoMCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgdmFyc1sibmFtZSJdID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5uYW1lKCk7CisgICAgdmFyc1sibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkpOworICAgIHZhcnNbInByZWZpeCJdID0gKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSA/CisgICAgICAiIiA6IGNsYXNzbmFtZV8gKyAiXyI7CisKKyAgICBpZiAoaSA+IDApIHByaW50ZXItPlByaW50KCIsXG4iKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLCAiJHByZWZpeCQkbmFtZSQgPSAkbnVtYmVyJCIpOworCisgICAgaWYgKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkgPCBtaW5fdmFsdWUtPm51bWJlcigpKSB7CisgICAgICBtaW5fdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpID4gbWF4X3ZhbHVlLT5udW1iZXIoKSkgeworICAgICAgbWF4X3ZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpOworICAgIH0KKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIlxufTtcbiIpOworCisgIHZhcnNbIm1pbl9uYW1lIl0gPSBtaW5fdmFsdWUtPm5hbWUoKTsKKyAgdmFyc1sibWF4X25hbWUiXSA9IG1heF92YWx1ZS0+bmFtZSgpOworCisgIGlmIChvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpKSB7CisgICAgdmFyc1siZGxsZXhwb3J0Il0gPSAiIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJkbGxleHBvcnQiXSA9IG9wdGlvbnNfLmRsbGV4cG9ydF9kZWNsICsgIiAiOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiJGRsbGV4cG9ydCRib29sICRjbGFzc25hbWUkX0lzVmFsaWQoaW50IHZhbHVlKTtcbiIKKyAgICAiY29uc3QgJGNsYXNzbmFtZSQgJHByZWZpeCQkc2hvcnRfbmFtZSRfTUlOID0gJHByZWZpeCQkbWluX25hbWUkO1xuIgorICAgICJjb25zdCAkY2xhc3NuYW1lJCAkcHJlZml4JCRzaG9ydF9uYW1lJF9NQVggPSAkcHJlZml4JCRtYXhfbmFtZSQ7XG4iCisgICAgImNvbnN0IGludCAkcHJlZml4JCRzaG9ydF9uYW1lJF9BUlJBWVNJWkUgPSAkcHJlZml4JCRzaG9ydF9uYW1lJF9NQVggKyAxO1xuIgorICAgICJcbiIpOworCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiJGRsbGV4cG9ydCRjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCk7XG4iKTsKKyAgICAvLyBUaGUgX05hbWUgYW5kIF9QYXJzZSBtZXRob2RzCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSRfTmFtZSgkY2xhc3NuYW1lJCB2YWx1ZSkge1xuIgorICAgICAgIiAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oXG4iCisgICAgICAiICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKSwgdmFsdWUpO1xuIgorICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSRfUGFyc2UoXG4iCisgICAgICAiICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsICRjbGFzc25hbWUkKiB2YWx1ZSkge1xuIgorICAgICAgIiAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPCRjbGFzc25hbWUkPihcbiIKKyAgICAgICIgICAgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjoKK0dlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAidGVtcGxhdGUgPD5cbiIKKyAgICAgICJpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCAkY2xhc3NuYW1lJD4oKSB7XG4iCisgICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCB0cnVlKSk7CisgIH0KK30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZVN5bWJvbEltcG9ydHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJuZXN0ZWRfbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKKyAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOworICBwcmludGVyLT5QcmludCh2YXJzLCAidHlwZWRlZiAkY2xhc3NuYW1lJCAkbmVzdGVkX25hbWUkO1xuIik7CisKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaisrKSB7CisgICAgdmFyc1sidGFnIl0gPSBkZXNjcmlwdG9yXy0+dmFsdWUoaiktPm5hbWUoKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInN0YXRpYyBjb25zdCAkbmVzdGVkX25hbWUkICR0YWckID0gJGNsYXNzbmFtZSRfJHRhZyQ7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgInN0YXRpYyBpbmxpbmUgYm9vbCAkbmVzdGVkX25hbWUkX0lzVmFsaWQoaW50IHZhbHVlKSB7XG4iCisgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX0lzVmFsaWQodmFsdWUpO1xuIgorICAgICJ9XG4iCisgICAgInN0YXRpYyBjb25zdCAkbmVzdGVkX25hbWUkICRuZXN0ZWRfbmFtZSRfTUlOID1cbiIKKyAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX01JTjtcbiIKKyAgICAic3RhdGljIGNvbnN0ICRuZXN0ZWRfbmFtZSQgJG5lc3RlZF9uYW1lJF9NQVggPVxuIgorICAgICIgICRjbGFzc25hbWUkXyRuZXN0ZWRfbmFtZSRfTUFYO1xuIgorICAgICJzdGF0aWMgY29uc3QgaW50ICRuZXN0ZWRfbmFtZSRfQVJSQVlTSVpFID1cbiIKKyAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX0FSUkFZU0laRTtcbiIpOworCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAic3RhdGljIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKlxuIgorICAgICAgIiRuZXN0ZWRfbmFtZSRfZGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCk7XG4iCisgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJzdGF0aWMgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRuZXN0ZWRfbmFtZSRfTmFtZSgkbmVzdGVkX25hbWUkIHZhbHVlKSB7XG4iCisgICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfTmFtZSh2YWx1ZSk7XG4iCisgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJzdGF0aWMgaW5saW5lIGJvb2wgJG5lc3RlZF9uYW1lJF9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLFxuIgorICAgICAgIiAgICAkbmVzdGVkX25hbWUkKiB2YWx1ZSkge1xuIgorICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX1BhcnNlKG5hbWUsIHZhbHVlKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQgaW5kZXgpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJjbGFzc25hbWUiXSA9IGNsYXNzbmFtZV87CisgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGluZGV4KTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIiRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfID0gZmlsZS0+ZW51bV90eXBlKCRpbmRleCQpO1xuIik7CisgIH0gZWxzZSB7CisgICAgdmFyc1sicGFyZW50Il0gPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpLCBmYWxzZSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyA9ICRwYXJlbnQkX2Rlc2NyaXB0b3JfLT5lbnVtX3R5cGUoJGluZGV4JCk7XG4iKTsKKyAgfQorfQorCit2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKSB7XG4iCisgICAgICAiICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTtcbiIKKyAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXztcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgImJvb2wgJGNsYXNzbmFtZSRfSXNWYWxpZChpbnQgdmFsdWUpIHtcbiIKKyAgICAiICBzd2l0Y2godmFsdWUpIHtcbiIpOworCisgIC8vIE11bHRpcGxlIHZhbHVlcyBtYXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIuICBNYWtlIHN1cmUgd2Ugb25seSBjb3ZlcgorICAvLyBlYWNoIG51bWJlciBvbmNlIGJ5IGZpcnN0IGNvbnN0cnVjdGluZyBhIHNldCBjb250YWluaW5nIGFsbCB2YWxpZAorICAvLyBudW1iZXJzLCB0aGVuIHByaW50aW5nIGEgY2FzZSBzdGF0ZW1lbnQgZm9yIGVhY2ggZWxlbWVudC4KKworICBzZXQ8aW50PiBudW1iZXJzOworICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBqKyspIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShqKTsKKyAgICBudW1iZXJzLmluc2VydCh2YWx1ZS0+bnVtYmVyKCkpOworICB9CisKKyAgZm9yIChzZXQ8aW50Pjo6aXRlcmF0b3IgaXRlciA9IG51bWJlcnMuYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IG51bWJlcnMuZW5kKCk7ICsraXRlcikgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgICBjYXNlICRudW1iZXIkOlxuIiwKKyAgICAgICJudW1iZXIiLCBTaW1wbGVJdG9hKCppdGVyKSk7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIgICAgICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAiICAgIGRlZmF1bHQ6XG4iCisgICAgIiAgICAgIHJldHVybiBmYWxzZTtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICAvLyBXZSBuZWVkIHRvICJkZWZpbmUiIHRoZSBzdGF0aWMgY29uc3RhbnRzIHdoaWNoIHdlcmUgZGVjbGFyZWQgaW4gdGhlCisgICAgLy8gaGVhZGVyLCB0byBnaXZlIHRoZSBsaW5rZXIgYSBwbGFjZSB0byBwdXQgdGhlbS4gIE9yIGF0IGxlYXN0IHRoZSBDKysKKyAgICAvLyBzdGFuZGFyZCBzYXlzIHdlIGhhdmUgdG8uICBNU1ZDIGFjdHVhbGx5IGluc2lzdHMgdGhhIHdlIGRvIF9ub3RfIGRlZmluZQorICAgIC8vIHRoZW0gYWdhaW4gaW4gdGhlIC5jYyBmaWxlLgorICAgIHByaW50ZXItPlByaW50KCIjaWZuZGVmIF9NU0NfVkVSXG4iKTsKKworICAgIHZhcnNbInBhcmVudCJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwgZmFsc2UpOworICAgIHZhcnNbIm5lc3RlZF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgICAgdmFyc1sidmFsdWUiXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpOworICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgImNvbnN0ICRjbGFzc25hbWUkICRwYXJlbnQkOjokdmFsdWUkO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiY29uc3QgJGNsYXNzbmFtZSQgJHBhcmVudCQ6OiRuZXN0ZWRfbmFtZSRfTUlOO1xuIgorICAgICAgImNvbnN0ICRjbGFzc25hbWUkICRwYXJlbnQkOjokbmVzdGVkX25hbWUkX01BWDtcbiIKKyAgICAgICJjb25zdCBpbnQgJHBhcmVudCQ6OiRuZXN0ZWRfbmFtZSRfQVJSQVlTSVpFO1xuIik7CisKKyAgICBwcmludGVyLT5QcmludCgiI2VuZGlmICAvLyBfTVNDX1ZFUlxuIik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg1YTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworY2xhc3MgRW51bUdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgZXhwbGljaXQgRW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgfkVudW1HZW5lcmF0b3IoKTsKKworICAvLyBIZWFkZXIgc3R1ZmYuCisKKyAgLy8gR2VuZXJhdGUgaGVhZGVyIGNvZGUgZGVmaW5pbmcgdGhlIGVudW0uICBUaGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZAorICAvLyB3aXRoaW4gdGhlIGVudW0ncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0IE5PVCB3aXRoaW4gYW55IGNsYXNzLCBldmVuIGZvcgorICAvLyBuZXN0ZWQgZW51bXMuCisgIHZvaWQgR2VuZXJhdGVEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBzcGVjaWFsaXphdGlvbiBvZiBHZXRFbnVtRGVzY3JpcHRvcjxNeUVudW0+KCkuCisgIC8vIFByZWNvbmRpdGlvbjogaW4gOjpnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZS4KKyAgdm9pZCBHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBGb3IgZW51bXMgbmVzdGVkIHdpdGhpbiBhIG1lc3NhZ2UsIGdlbmVyYXRlIGNvZGUgdG8gaW1wb3J0IGFsbCB0aGUgZW51bSdzCisgIC8vIHN5bWJvbHMgKGUuZy4gdGhlIGVudW0gdHlwZSBuYW1lLCBhbGwgaXRzIHZhbHVlcywgZXRjLikgaW50byB0aGUgY2xhc3MncworICAvLyBuYW1lc3BhY2UuICBUaGlzIHNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZQorICAvLyBoZWFkZXIuCisgIHZvaWQgR2VuZXJhdGVTeW1ib2xJbXBvcnRzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBlbnVtJ3MKKyAgLy8gZGVzY3JpcHRvci4KKyAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IGluZGV4KTsKKworICAvLyBHZW5lcmF0ZSBub24taW5saW5lIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgZW51bSwgc3VjaCBhcyBJc1ZhbGlkVmFsdWUoKS4KKyAgLy8gR29lcyBpbiB0aGUgLmNjIGZpbGUuCisgIHZvaWQgR2VuZXJhdGVNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RyaW5nIGNsYXNzbmFtZV87CisgIE9wdGlvbnMgb3B0aW9uc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1HZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTE2MjBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYwpAQCAtMCwwICsxLDM2NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0RW51bVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzLCBvcHRpb25zKTsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVmYXVsdF92YWx1ZSA9IGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfZW51bSgpOworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yLT5lbnVtX3R5cGUoKSwgdHJ1ZSk7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gU2ltcGxlSXRvYShkZWZhdWx0X3ZhbHVlLT5udW1iZXIoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0VudW1GaWVsZEdlbmVyYXRvcjo6CitFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKK30KKworRW51bUZpZWxkR2VuZXJhdG9yOjp+RW51bUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiaW50ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgJHR5cGUkICRuYW1lJCgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgc2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICIgIHJldHVybiBzdGF0aWNfY2FzdDwgJHR5cGUkID4oJG5hbWUkXyk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiAgYXNzZXJ0KCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSk7XG4iCisgICAgIiAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzZXRfJG5hbWUkKGZyb20uJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGQ6OnN3YXAoJG5hbWUkXywgb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW50IHZhbHVlO1xuIgorICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgorICAgICIgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KFxuIgorICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIKKyAgICAiaWYgKCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSkge1xuIgorICAgICIgIHNldF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iKTsKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAiICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgkbnVtYmVyJCwgdmFsdWUpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oXG4iCisgICAgIiAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCBvdXRwdXQpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheShcbiIKKyAgICAiICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIHRhcmdldCk7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT4kbmFtZSQoKSk7XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXywgb3B0aW9ucyk7Cit9CisKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4gJG5hbWUkXztcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJiBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJtdXRhYmxlIGludCBfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSAkdHlwZSQgJG5hbWUkKGludCBpbmRleCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIGFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDxpbnQ+JiAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiogbXV0YWJsZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgorICAgICIgIHJldHVybiBzdGF0aWNfY2FzdDwgJHR5cGUkID4oJG5hbWUkXy5HZXQoaW5kZXgpKTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIgIGFzc2VydCgkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpO1xuIgorICAgICIgICRuYW1lJF8uU2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiAgYXNzZXJ0KCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSk7XG4iCisgICAgIiAgJG5hbWUkXy5BZGQodmFsdWUpO1xuIgorICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDxpbnQ+JlxuIgorICAgICIkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PipcbiIKKyAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uQ2xlYXIoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uTWVyZ2VGcm9tKGZyb20uJG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5Td2FwKCZvdGhlci0+JG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBOb3QgbmVlZGVkIGZvciByZXBlYXRlZCBmaWVsZHMuCit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBEb24ndCB1c2UgUmVhZFJlcGVhdGVkUHJpbWl0aXZlIGhlcmUgc28gdGhhdCB0aGUgZW51bSBjYW4gYmUgdmFsaWRhdGVkLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbnQgdmFsdWU7XG4iCisgICAgIkRPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8XG4iCisgICAgIiAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oXG4iCisgICAgIiAgICAgICBpbnB1dCwgJnZhbHVlKSkpO1xuIgorICAgICJpZiAoJHR5cGUkX0lzVmFsaWQodmFsdWUpKSB7XG4iCisgICAgIiAgYWRkXyRuYW1lJChzdGF0aWNfY2FzdDwgJHR5cGUkID4odmFsdWUpKTtcbiIpOworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICIgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KCRudW1iZXIkLCB2YWx1ZSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbVdpdGhQYWNraW5nKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIC8vIFdlIHVzZSBhIG5vbi1pbmxpbmVkIGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZSwgc2luY2UgdGhpcyBwYXRoIHdpbGwKKyAgICAvLyByYXJlbHkgYmUgZXhlY3V0ZWQuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkRW51bU5vSW5saW5lKFxuIgorICAgICAgIiAgICAgICBpbnB1dCxcbiIKKyAgICAgICIgICAgICAgJiR0eXBlJF9Jc1ZhbGlkLFxuIgorICAgICAgIiAgICAgICB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBsZW5ndGg7XG4iCisgICAgICAiRE9fKGlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpO1xuIgorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gIgorICAgICAgICAgICJpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7XG4iCisgICAgICAid2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHtcbiIKKyAgICAgICIgIGludCB2YWx1ZTtcbiIKKyAgICAgICIgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8XG4iCisgICAgICAiICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPihcbiIKKyAgICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIKKyAgICAgICIgIGlmICgkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpIHtcbiIKKyAgICAgICIgICAgYWRkXyRuYW1lJChzdGF0aWNfY2FzdDwgJHR5cGUkID4odmFsdWUpKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5wdXQtPlBvcExpbWl0KGxpbWl0KTtcbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICAvLyBXcml0ZSB0aGUgdGFnIGFuZCB0aGUgc2l6ZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICh0aGlzLT4kbmFtZSRfc2l6ZSgpID4gMCkge1xuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKFxuIgorICAgICAgIiAgICAkbnVtYmVyJCxcbiIKKyAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsXG4iCisgICAgICAiICAgIG91dHB1dCk7XG4iCisgICAgICAiICBvdXRwdXQtPldyaXRlVmFyaW50MzIoXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyk7XG4iCisgICAgICAifVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZyhcbiIKKyAgICAgICIgICAgdGhpcy0+JG5hbWUkKGkpLCBvdXRwdXQpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oXG4iCisgICAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgLy8gV3JpdGUgdGhlIHRhZyBhbmQgdGhlIHNpemUuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAodGhpcy0+JG5hbWUkX3NpemUoKSA+IDApIHtcbiIKKyAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoXG4iCisgICAgICAiICAgICRudW1iZXIkLFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCxcbiIKKyAgICAgICIgICAgdGFyZ2V0KTtcbiIKKyAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgiCisgICAgICAiICAgIF8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8sIHRhcmdldCk7XG4iCisgICAgICAifVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZ1RvQXJyYXkoXG4iCisgICAgICAiICAgIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheShcbiIKKyAgICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIntcbiIKKyAgICAiICBpbnQgZGF0YV9zaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIgorICAgICAgIiAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZShcbiIKKyAgICAgICIgICAgdGhpcy0+JG5hbWUkKGkpKTtcbiIKKyAgICAgICJ9XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKGRhdGFfc2l6ZSA+IDApIHtcbiIKKyAgICAgICIgIHRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCisgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoZGF0YV9zaXplKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTtcbiIKKyAgICAgICJfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfID0gZGF0YV9zaXplO1xuIgorICAgICAgIkdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpO1xuIgorICAgICAgInRvdGFsX3NpemUgKz0gZGF0YV9zaXplO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgKiB0aGlzLT4kbmFtZSRfc2l6ZSgpICsgZGF0YV9zaXplO1xuIik7CisgIH0KKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3NzAwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuaApAQCAtMCwwICsxLDEwNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FTlVNX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworY2xhc3MgRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgfkVudW1GaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bUZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU2YjVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmNjCkBAIC0wLDAgKzEsMjEwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworbmFtZXNwYWNlIHsKKworLy8gUmV0dXJucyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIGZpZWxkCisvLyBleHRlbmRzLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gdGhlIEdvb2dsZS1pbnRlcm5hbCBjb2RlIHRvIGhhbmRsZSBzb21lCisvLyBsZWdhY3kgY2FzZXMuCitzdHJpbmcgRXh0ZW5kZWVDbGFzc05hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlID0gZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCk7CisgIHJldHVybiBDbGFzc05hbWUoZXh0ZW5kZWUsIHRydWUpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK0V4dGVuc2lvbkdlbmVyYXRvcjo6RXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgb3B0aW9uc18ob3B0aW9ucykgeworICAvLyBDb25zdHJ1Y3QgdHlwZV90cmFpdHNfLgorICBpZiAoZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkpIHsKKyAgICB0eXBlX3RyYWl0c18gPSAiUmVwZWF0ZWQiOworICB9CisKKyAgc3dpdGNoIChkZXNjcmlwdG9yXy0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCJFbnVtVHlwZVRyYWl0czwgIik7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCksIHRydWUpKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIiwgIik7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCksIHRydWUpKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIl9Jc1ZhbGlkPiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiU3RyaW5nVHlwZVRyYWl0cyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIk1lc3NhZ2VUeXBlVHJhaXRzPCAiKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSwgdHJ1ZSkpOworICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiID4iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCJQcmltaXRpdmVUeXBlVHJhaXRzPCAiKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoUHJpbWl0aXZlVHlwZU5hbWUoZGVzY3JpcHRvcl8tPmNwcF90eXBlKCkpKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIiA+Iik7CisgICAgICBicmVhazsKKyAgfQorfQorCitFeHRlbnNpb25HZW5lcmF0b3I6On5FeHRlbnNpb25HZW5lcmF0b3IoKSB7fQorCit2b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbImV4dGVuZGVlIiAgICAgXSA9IEV4dGVuZGVlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKTsKKyAgdmFyc1sibnVtYmVyIiAgICAgICBdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+bnVtYmVyKCkpOworICB2YXJzWyJ0eXBlX3RyYWl0cyIgIF0gPSB0eXBlX3RyYWl0c187CisgIHZhcnNbIm5hbWUiICAgICAgICAgXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcnNbImZpZWxkX3R5cGUiICAgXSA9IFNpbXBsZUl0b2Eoc3RhdGljX2Nhc3Q8aW50PihkZXNjcmlwdG9yXy0+dHlwZSgpKSk7CisgIHZhcnNbInBhY2tlZCIgICAgICAgXSA9IGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICB2YXJzWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShkZXNjcmlwdG9yXyk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGNsYXNzIG1lbWJlciwgaXQgbmVlZHMgdG8gYmUgZGVjbGFyZWQgInN0YXRpYyIuICBPdGhlcndpc2UsCisgIC8vIGl0IG5lZWRzIHRvIGJlICJleHRlcm4iLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBpdCBhbHNvIG5lZWRzIHRoZSBETEwKKyAgLy8gZXhwb3J0L2ltcG9ydCBzcGVjaWZpZXIuCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCkgeworICAgIHZhcnNbInF1YWxpZmllciJdID0gImV4dGVybiI7CisgICAgaWYgKCFvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpKSB7CisgICAgICB2YXJzWyJxdWFsaWZpZXIiXSA9IG9wdGlvbnNfLmRsbGV4cG9ydF9kZWNsICsgIiAiICsgdmFyc1sicXVhbGlmaWVyIl07CisgICAgfQorICB9IGVsc2UgeworICAgIHZhcnNbInF1YWxpZmllciJdID0gInN0YXRpYyI7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICJzdGF0aWMgY29uc3QgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIgorICAgICIkcXVhbGlmaWVyJCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAkZXh0ZW5kZWUkLFxuIgorICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6JHR5cGVfdHJhaXRzJCwgJGZpZWxkX3R5cGUkLCAkcGFja2VkJCA+XG4iCisgICAgIiAgJG5hbWUkO1xuIgorICAgICk7CisKK30KKwordm9pZCBFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBJZiB0aGlzIGlzIGEgY2xhc3MgbWVtYmVyLCBpdCBuZWVkcyB0byBiZSBkZWNsYXJlZCBpbiBpdHMgY2xhc3Mgc2NvcGUuCisgIHN0cmluZyBzY29wZSA9IChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCkgPyAiIiA6CisgICAgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSwgZmFsc2UpICsgIjo6IjsKKyAgc3RyaW5nIG5hbWUgPSBzY29wZSArIGRlc2NyaXB0b3JfLT5uYW1lKCk7CisKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJleHRlbmRlZSIgICAgIF0gPSBFeHRlbmRlZUNsYXNzTmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcnNbInR5cGVfdHJhaXRzIiAgXSA9IHR5cGVfdHJhaXRzXzsKKyAgdmFyc1sibmFtZSIgICAgICAgICBdID0gbmFtZTsKKyAgdmFyc1siY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcl8pOworICB2YXJzWyJkZWZhdWx0IiAgICAgIF0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcl8pOworICB2YXJzWyJmaWVsZF90eXBlIiAgIF0gPSBTaW1wbGVJdG9hKHN0YXRpY19jYXN0PGludD4oZGVzY3JpcHRvcl8tPnR5cGUoKSkpOworICB2YXJzWyJwYWNrZWQiICAgICAgIF0gPSBkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgdmFyc1sic2NvcGUiICAgICAgICBdID0gc2NvcGU7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKKyAgICAvLyBXZSBuZWVkIHRvIGRlY2xhcmUgYSBnbG9iYWwgc3RyaW5nIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAvLyBXZSBjYW5ub3QgZGVjbGFyZSBpdCBhdCBjbGFzcyBzY29wZSBiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSBleHBvc2luZworICAgIC8vIGl0IGluIHRoZSBoZWFkZXIgd2hpY2ggd291bGQgYmUgYW5ub3lpbmcgZm9yIG90aGVyIHJlYXNvbnMuICBTbyB3ZQorICAgIC8vIHJlcGxhY2UgOjogd2l0aCBfIGluIHRoZSBuYW1lIGFuZCBkZWNsYXJlIGl0IGFzIGEgZ2xvYmFsLgorICAgIHN0cmluZyBnbG9iYWxfbmFtZSA9IFN0cmluZ1JlcGxhY2UobmFtZSwgIjo6IiwgIl8iLCB0cnVlKTsKKyAgICB2YXJzWyJnbG9iYWxfbmFtZSJdID0gZ2xvYmFsX25hbWU7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJjb25zdCA6OnN0ZDo6c3RyaW5nICRnbG9iYWxfbmFtZSRfZGVmYXVsdCgkZGVmYXVsdCQpO1xuIik7CisKKyAgICAvLyBVcGRhdGUgdGhlIGRlZmF1bHQgdG8gcmVmZXIgdG8gdGhlIHN0cmluZyBnbG9iYWwuCisgICAgdmFyc1siZGVmYXVsdCJdID0gZ2xvYmFsX25hbWUgKyAiX2RlZmF1bHQiOworICB9CisKKyAgLy8gTGlrZXdpc2UsIGNsYXNzIG1lbWJlcnMgbmVlZCB0byBkZWNsYXJlIHRoZSBmaWVsZCBjb25zdGFudCB2YXJpYWJsZS4KKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSAhPSBOVUxMKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIjaWZuZGVmIF9NU0NfVkVSXG4iCisgICAgICAiY29uc3QgaW50ICRzY29wZSQkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgICAiI2VuZGlmXG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICRleHRlbmRlZSQsXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjokdHlwZV90cmFpdHMkLCAkZmllbGRfdHlwZSQsICRwYWNrZWQkID5cbiIKKyAgICAiICAkbmFtZSQoJGNvbnN0YW50X25hbWUkLCAkZGVmYXVsdCQpO1xuIik7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVJlZ2lzdHJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbImV4dGVuZGVlIiAgIF0gPSBFeHRlbmRlZUNsYXNzTmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcnNbIm51bWJlciIgICAgIF0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5udW1iZXIoKSk7CisgIHZhcnNbImZpZWxkX3R5cGUiIF0gPSBTaW1wbGVJdG9hKHN0YXRpY19jYXN0PGludD4oZGVzY3JpcHRvcl8tPnR5cGUoKSkpOworICB2YXJzWyJpc19yZXBlYXRlZCJdID0gZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICB2YXJzWyJpc19wYWNrZWQiICBdID0gKGRlc2NyaXB0b3JfLT5pc19yZXBlYXRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gInRydWUiIDogImZhbHNlIjsKKworICBzd2l0Y2ggKGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRW51bUV4dGVuc2lvbihcbiIKKyAgICAgICAgIiAgJiRleHRlbmRlZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKKyAgICAgICAgIiAgJG51bWJlciQsICRmaWVsZF90eXBlJCwgJGlzX3JlcGVhdGVkJCwgJGlzX3BhY2tlZCQsXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICAmJHR5cGUkX0lzVmFsaWQpO1xuIiwKKyAgICAgICAgInR5cGUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpLCB0cnVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldDo6UmVnaXN0ZXJNZXNzYWdlRXh0ZW5zaW9uKFxuIgorICAgICAgICAiICAmJGV4dGVuZGVlJDo6ZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgorICAgICAgICAiICAkbnVtYmVyJCwgJGZpZWxkX3R5cGUkLCAkaXNfcmVwZWF0ZWQkLCAkaXNfcGFja2VkJCxcbiIpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICYkdHlwZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7XG4iLAorICAgICAgICAidHlwZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCksIHRydWUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0OjpSZWdpc3RlckV4dGVuc2lvbihcbiIKKyAgICAgICAgIiAgJiRleHRlbmRlZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKKyAgICAgICAgIiAgJG51bWJlciQsICRmaWVsZF90eXBlJCwgJGlzX3JlcGVhdGVkJCwgJGlzX3BhY2tlZCQpO1xuIik7CisgICAgICBicmVhazsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFkMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmgKQEAgLTAsMCArMSw4NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FWFRFTlNJT05fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRVhURU5TSU9OX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgY2xhc3MgRmllbGREZXNjcmlwdG9yOyAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZXh0ZW5zaW9uLCB3aGljaCBtYXkgYmUgd2l0aGluIHRoZSBzY29wZSBvZiBzb21lCisvLyBtZXNzYWdlIG9yIG1heSBiZSBhdCBmaWxlIHNjb3BlLiAgVGhpcyBpcyBtdWNoIHNpbXBsZXIgdGhhbiBGaWVsZEdlbmVyYXRvcgorLy8gc2luY2UgZXh0ZW5zaW9ucyBhcmUganVzdCBzaW1wbGUgaWRlbnRpZmllcnMgd2l0aCBpbnRlcmVzdGluZyB0eXBlcy4KK2NsYXNzIEV4dGVuc2lvbkdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgZXhwbGljaXQgRXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzeWNyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgfkV4dGVuc2lvbkdlbmVyYXRvcigpOworCisgIC8vIEhlYWRlciBzdHVmZi4KKyAgdm9pZCBHZW5lcmF0ZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KKyAgdm9pZCBHZW5lcmF0ZURlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGNvZGUgdG8gcmVnaXN0ZXIgdGhlIGV4dGVuc2lvbi4KKyAgdm9pZCBHZW5lcmF0ZVJlZ2lzdHJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdHJpbmcgdHlwZV90cmFpdHNfOworICBPcHRpb25zIG9wdGlvbnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFeHRlbnNpb25HZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ODYxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYwpAQCAtMCwwICsxLDE0MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKKwordm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICAoKnZhcmlhYmxlcylbIm5hbWUiXSA9IEZpZWxkTmFtZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJpbmRleCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5pbmRleCgpKTsKKyAgKCp2YXJpYWJsZXMpWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbImNsYXNzbmFtZSJdID0gQ2xhc3NOYW1lKEZpZWxkU2NvcGUoZGVzY3JpcHRvciksIGZhbHNlKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWNsYXJlZF90eXBlIl0gPSBEZWNsYXJlZFR5cGVNZXRob2ROYW1lKGRlc2NyaXB0b3ItPnR5cGUoKSk7CisKKyAgKCp2YXJpYWJsZXMpWyJ0YWdfc2l6ZSJdID0gU2ltcGxlSXRvYSgKKyAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBkZXNjcmlwdG9yLT50eXBlKCkpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQorICAgICAgPyAiIFBST1RPQlVGX0RFUFJFQ0FURUQiIDogIiI7CisKKyAgKCp2YXJpYWJsZXMpWyJjcHBnZXQiXSA9ICJHZXQiOworfQorCitGaWVsZEdlbmVyYXRvcjo6fkZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gUmVhY2hpbmcgaGVyZSBpbmRpY2F0ZXMgYSBidWcuIENhc2VzIGFyZToKKyAgLy8gICAtIFRoaXMgRmllbGRHZW5lcmF0b3Igc2hvdWxkIHN1cHBvcnQgcGFja2luZywgYnV0IHRoaXMgbWV0aG9kIHNob3VsZCBiZQorICAvLyAgICAgb3ZlcnJpZGRlbi4KKyAgLy8gICAtIFRoaXMgRmllbGRHZW5lcmF0b3IgZG9lc24ndCBzdXBwb3J0IHBhY2tpbmcsIGFuZCB0aGlzIG1ldGhvZCBzaG91bGQKKyAgLy8gICAgIG5ldmVyIGhhdmUgYmVlbiBjYWxsZWQuCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoKSAiCisgICAgICAgICAgICAgPDwgImNhbGxlZCBvbiBmaWVsZCBnZW5lcmF0b3IgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHBhY2tpbmcuIjsKKworfQorCitGaWVsZEdlbmVyYXRvck1hcDo6RmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgIGZpZWxkX2dlbmVyYXRvcnNfKG5ldyBzY29wZWRfcHRyPEZpZWxkR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXSkgeworICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc19baV0ucmVzZXQoTWFrZUdlbmVyYXRvcihkZXNjcmlwdG9yLT5maWVsZChpKSwgb3B0aW9ucykpOworICB9Cit9CisKK0ZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvck1hcDo6TWFrZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgaGFuZGxlcyB1bmtub3duIGN0eXBlcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIGhhbmRsZXMgdW5rbm93biBjdHlwZXMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IEVudW1GaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICB9CisgIH0KK30KKworRmllbGRHZW5lcmF0b3JNYXA6On5GaWVsZEdlbmVyYXRvck1hcCgpIHt9CisKK2NvbnN0IEZpZWxkR2VuZXJhdG9yJiBGaWVsZEdlbmVyYXRvck1hcDo6Z2V0KAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvcl8pOworICByZXR1cm4gKmZpZWxkX2dlbmVyYXRvcnNfW2ZpZWxkLT5pbmRleCgpXTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkOTliMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gSGVscGVyIGZ1bmN0aW9uOiBzZXQgdmFyaWFibGVzIGluIHRoZSBtYXAgdGhhdCBhcmUgdGhlIHNhbWUgZm9yIGFsbAorLy8gZmllbGQgY29kZSBnZW5lcmF0b3JzLgorLy8gWyduYW1lJywgJ2luZGV4JywgJ251bWJlcicsICdjbGFzc25hbWUnLCAnZGVjbGFyZWRfdHlwZScsICd0YWdfc2l6ZScsCisvLyAnZGVwcmVjYXRpb24nXS4KK3ZvaWQgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCitjbGFzcyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBGaWVsZEdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgfkZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSBkZWNsYXJpbmcgbWVtYmVycyBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgY2xhc3MKKyAgLy8gbmVlZGVkIHRvIHJlcHJlc2VudCB0aGlzIGZpZWxkLiAgVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIG1lc3NhZ2UKKyAgLy8gY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgYWxsIG9mIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGlzCisgIC8vIGZpZWxkLiAgVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGNsYXNzIGRlZmluaXRpb24uCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgaW5saW5lIGRlZmluaXRpb25zIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgdGhpcyBmaWVsZC4KKyAgLy8gVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGhlYWRlciBhZnRlciBhbGwgY2xhc3MgZGVmaW5pdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBvZiBhY2Nlc3NvcnMgdGhhdCBhcmVuJ3QgaW5saW5lZC4gIFRoZXNlIGFyZQorICAvLyBwbGFjZWQgc29tZXdoZXJlIGluIHRoZSAuY2MgZmlsZS4KKyAgLy8gTW9zdCBmaWVsZCB0eXBlcyBkb24ndCBuZWVkIHRoaXMsIHNvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7fQorCisgIC8vIEdlbmVyYXRlIGxpbmVzIG9mIGNvZGUgKHN0YXRlbWVudHMsIG5vdCBkZWNsYXJhdGlvbnMpIHdoaWNoIGNsZWFyIHRoZQorICAvLyBmaWVsZC4gIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGNsZWFyXyRuYW1lJCgpIG1ldGhvZCBhcyB3ZWxsIGFzCisgIC8vIHRoZSBDbGVhcigpIG1ldGhvZCBmb3IgdGhlIHdob2xlIG1lc3NhZ2UuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlIGxpbmVzIG9mIGNvZGUgKHN0YXRlbWVudHMsIG5vdCBkZWNsYXJhdGlvbnMpIHdoaWNoIG1lcmdlcyB0aGUKKyAgLy8gY29udGVudHMgb2YgdGhlIGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgbWVzc2FnZSB0byB0aGUgdGFyZ2V0IG1lc3NhZ2UsCisgIC8vIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgdmFyaWFibGUgImZyb20iLgorICAvLyBUaGlzIGlzIHVzZWQgdG8gZmlsbCBpbiB0aGUgTWVyZ2VGcm9tIG1ldGhvZCBmb3IgdGhlIHdob2xlIG1lc3NhZ2UuCisgIC8vIERldGFpbHMgb2YgdGhpcyB1c2FnZSBjYW4gYmUgZm91bmQgaW4gbWVzc2FnZS5jYyB1bmRlciB0aGUKKyAgLy8gR2VuZXJhdGVNZXJnZUZyb20gbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlIGxpbmVzIG9mIGNvZGUgKHN0YXRlbWVudHMsIG5vdCBkZWNsYXJhdGlvbnMpIHdoaWNoIHN3YXBzCisgIC8vIHRoaXMgZmllbGQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIG9mIGFub3RoZXIgbWVzc2FnZSwgd2hpY2gKKyAgLy8gaXMgc3RvcmVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB2YXJpYWJsZSAib3RoZXIiLiBUaGlzIGlzIHVzZWQgdG8KKyAgLy8gZGVmaW5lIHRoZSBTd2FwIG1ldGhvZC4gRGV0YWlscyBvZiB1c2FnZSBjYW4gYmUgZm91bmQgaW4KKyAgLy8gbWVzc2FnZS5jYyB1bmRlciB0aGUgR2VuZXJhdGVTd2FwIG1ldGhvZC4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgcHJpdmF0ZSBtZW1iZXJzIGRlY2xhcmVkIGJ5CisgIC8vIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoKS4gVGhlc2UgZ28gaW50byB0aGUgbWVzc2FnZSBjbGFzcydzIFNoYXJlZEN0b3IoKQorICAvLyBtZXRob2QsIGludm9rZWQgYnkgZWFjaCBvZiB0aGUgZ2VuZXJhdGVkIGNvbnN0cnVjdG9ycy4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgYW55IGNvZGUgdGhhdCBuZWVkcyB0byBnbyBpbiB0aGUgY2xhc3MncyBTaGFyZWREdG9yKCkgbWV0aG9kLAorICAvLyBpbnZva2VkIGJ5IHRoZSBkZXN0cnVjdG9yLgorICAvLyBNb3N0IGZpZWxkIHR5cGVzIGRvbid0IG5lZWQgdGhpcywgc28gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7fQorCisgIC8vIEdlbmVyYXRlIGNvZGUgdGhhdCBhbGxvY2F0ZXMgdGhlIGZpZWxkcydzIGRlZmF1bHQgaW5zdGFuY2UuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUFsbG9jYXRvcihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qge30KKworICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgc2hvdWxkIGJlIHJ1biB3aGVuIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCkgaXMgY2FsbGVkLAorICAvLyB0byBkZWxldGUgYWxsIGR5bmFtaWNhbGx5LWFsbG9jYXRlZCBvYmplY3RzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgdG8gZGVjb2RlIHRoaXMgZmllbGQsIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGluc2lkZSB0aGUKKyAgLy8gbWVzc2FnZSdzIE1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlIGxpbmVzIHRvIGRlY29kZSB0aGlzIGZpZWxkIGZyb20gYSBwYWNrZWQgdmFsdWUsIHdoaWNoIHdpbGwgYmUKKyAgLy8gcGxhY2VkIGluc2lkZSB0aGUgbWVzc2FnZSdzIE1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbVdpdGhQYWNraW5nKGlvOjpQcmludGVyKiBwcmludGVyKQorICAgICAgY29uc3Q7CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgdG8gc2VyaWFsaXplIHRoaXMgZmllbGQsIHdoaWNoIGFyZSBwbGFjZWQgd2l0aGluIHRoZQorICAvLyBtZXNzYWdlJ3MgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBzZXJpYWxpemUgdGhpcyBmaWVsZCBkaXJlY3RseSB0byB0aGUgYXJyYXkgInRhcmdldCIsCisgIC8vIHdoaWNoIGFyZSBwbGFjZWQgd2l0aGluIHRoZSBtZXNzYWdlJ3MgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpCisgIC8vIG1ldGhvZC4gVGhpcyBtdXN0IGFsc28gYWR2YW5jZSAidGFyZ2V0IiBwYXN0IHRoZSB3cml0dGVuIGJ5dGVzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBjb21wdXRlIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgdGhpcyBmaWVsZCwgd2hpY2gKKyAgLy8gYXJlIHBsYWNlZCBpbiB0aGUgbWVzc2FnZSdzIEJ5dGVTaXplKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yKTsKK307CisKKy8vIENvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGNvbnN0cnVjdHMgRmllbGRHZW5lcmF0b3JzIGZvciBhIERlc2NyaXB0b3IuCitjbGFzcyBGaWVsZEdlbmVyYXRvck1hcCB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgfkZpZWxkR2VuZXJhdG9yTWFwKCk7CisKKyAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGdldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj4gPiBmaWVsZF9nZW5lcmF0b3JzXzsKKworICBzdGF0aWMgRmllbGRHZW5lcmF0b3IqIE1ha2VHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZEdlbmVyYXRvck1hcCk7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTk2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjCkBAIC0wLDAgKzEsNjUyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpbGVHZW5lcmF0b3I6OkZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZmlsZV8oZmlsZSksCisgICAgbWVzc2FnZV9nZW5lcmF0b3JzXygKKyAgICAgIG5ldyBzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+W2ZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpXSksCisgICAgZW51bV9nZW5lcmF0b3JzXygKKyAgICAgIG5ldyBzY29wZWRfcHRyPEVudW1HZW5lcmF0b3I+W2ZpbGUtPmVudW1fdHlwZV9jb3VudCgpXSksCisgICAgc2VydmljZV9nZW5lcmF0b3JzXygKKyAgICAgIG5ldyBzY29wZWRfcHRyPFNlcnZpY2VHZW5lcmF0b3I+W2ZpbGUtPnNlcnZpY2VfY291bnQoKV0pLAorICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzXygKKyAgICAgIG5ldyBzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj5bZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCldKSwKKyAgICBvcHRpb25zXyhvcHRpb25zKSB7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKKyAgICAgIG5ldyBNZXNzYWdlR2VuZXJhdG9yKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgb3B0aW9ucykpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKKyAgICAgIG5ldyBFbnVtR2VuZXJhdG9yKGZpbGUtPmVudW1fdHlwZShpKSwgb3B0aW9ucykpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0ucmVzZXQoCisgICAgICBuZXcgU2VydmljZUdlbmVyYXRvcihmaWxlLT5zZXJ2aWNlKGkpLCBvcHRpb25zKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0ucmVzZXQoCisgICAgICBuZXcgRXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGUtPmV4dGVuc2lvbihpKSwgb3B0aW9ucykpOworICB9CisKKyAgU3BsaXRTdHJpbmdVc2luZyhmaWxlXy0+cGFja2FnZSgpLCAiLiIsICZwYWNrYWdlX3BhcnRzXyk7Cit9CisKK0ZpbGVHZW5lcmF0b3I6On5GaWxlR2VuZXJhdG9yKCkge30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUhlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBzdHJpbmcgZmlsZW5hbWVfaWRlbnRpZmllciA9IEZpbGVuYW1lSWRlbnRpZmllcihmaWxlXy0+bmFtZSgpKTsKKworICAvLyBHZW5lcmF0ZSB0b3Agb2YgaGVhZGVyLgorICBwcmludGVyLT5QcmludCgKKyAgICAiLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKKyAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgIlxuIgorICAgICIjaWZuZGVmIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIKKyAgICAiI2RlZmluZSBQUk9UT0JVRl8kZmlsZW5hbWVfaWRlbnRpZmllciRfX0lOQ0xVREVEXG4iCisgICAgIlxuIgorICAgICIjaW5jbHVkZSA8c3RyaW5nPlxuIgorICAgICJcbiIsCisgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSwKKyAgICAiZmlsZW5hbWVfaWRlbnRpZmllciIsIGZpbGVuYW1lX2lkZW50aWZpZXIpOworCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+XG4iCisgICAgIlxuIik7CisKKyAgLy8gVmVyaWZ5IHRoZSBwcm90b2J1ZiBsaWJyYXJ5IGhlYWRlciB2ZXJzaW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jCisgIC8vIHZlcnNpb24gYmVmb3JlIGdvaW5nIGFueSBmdXJ0aGVyLgorICBwcmludGVyLT5QcmludCgKKyAgICAiI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgJG1pbl9oZWFkZXJfdmVyc2lvbiRcbiIKKyAgICAiI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXNcbiIKKyAgICAiI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UgdXBkYXRlXG4iCisgICAgIiNlcnJvciB5b3VyIGhlYWRlcnMuXG4iCisgICAgIiNlbmRpZlxuIgorICAgICIjaWYgJHByb3RvY192ZXJzaW9uJCA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT05cbiIKKyAgICAiI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzXG4iCisgICAgIiNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlXG4iCisgICAgIiNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuXG4iCisgICAgIiNlbmRpZlxuIgorICAgICJcbiIsCisgICAgIm1pbl9oZWFkZXJfdmVyc2lvbiIsCisgICAgICBTaW1wbGVJdG9hKHByb3RvYnVmOjppbnRlcm5hbDo6a01pbkhlYWRlclZlcnNpb25Gb3JQcm90b2MpLAorICAgICJwcm90b2NfdmVyc2lvbiIsIFNpbXBsZUl0b2EoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pKTsKKworICAvLyBPSywgaXQncyBub3cgc2FmZSB0byAjaW5jbHVkZSBvdGhlciBmaWxlcy4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPlxuIik7CisgIGlmIChmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD5cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+XG4iKTsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD5cbiIKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+XG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pICYmIEhhc0VudW1EZWZpbml0aW9ucyhmaWxlXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD5cbiIpOworICB9CisKKyAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaD5cbiIpOworICB9CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZmlsZV8pICYmIGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+XG4iKTsKKyAgfQorCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIjaW5jbHVkZSBcIiRkZXBlbmRlbmN5JC5wYi5oXCJcbiIsCisgICAgICAiZGVwZW5kZW5jeSIsIFN0cmlwUHJvdG8oZmlsZV8tPmRlcGVuZGVuY3koaSktPm5hbWUoKSkpOworICB9CisKKworICBwcmludGVyLT5QcmludCgKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKVxuIik7CisKKworICAvLyBPcGVuIG5hbWVzcGFjZS4KKyAgR2VuZXJhdGVOYW1lc3BhY2VPcGVuZXJzKHByaW50ZXIpOworCisgIC8vIEZvcndhcmQtZGVjbGFyZSB0aGUgQWRkRGVzY3JpcHRvcnMsIEFzc2lnbkRlc2NyaXB0b3JzLCBhbmQgU2h1dGRvd25GaWxlCisgIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGVtIHRvIGJlIGZyaWVuZHMgb2YgZWFjaCBjbGFzcy4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuXG4iCisgICAgInZvaWQgJGRsbGV4cG9ydF9kZWNsJCAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIiwKKyAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpLAorICAgICJkbGxleHBvcnRfZGVjbCIsIG9wdGlvbnNfLmRsbGV4cG9ydF9kZWNsKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgcHV0IGRsbGV4cG9ydF9kZWNsIG9uIHRoZXNlIGJlY2F1c2UgdGhleSBhcmUgb25seQorICAgIC8vIGNhbGxlZCBieSB0aGUgLnBiLmNjIGZpbGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZC4KKyAgICAidm9pZCAkYXNzaWduZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgorICAgICJ2b2lkICRzaHV0ZG93bmZpbGVuYW1lJCgpO1xuIgorICAgICJcbiIsCisgICAgImFzc2lnbmRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSwKKyAgICAic2h1dGRvd25maWxlbmFtZSIsIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoZmlsZV8tPm5hbWUoKSkpOworCisgIC8vIEdlbmVyYXRlIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIGNsYXNzZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbihwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIC8vIEdlbmVyYXRlIGVudW0gZGVmaW5pdGlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhwcmludGVyKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZpbml0aW9uKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgLy8gR2VuZXJhdGUgY2xhc3MgZGVmaW5pdGlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOworICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgfQorICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgICAgLy8gR2VuZXJhdGUgc2VydmljZSBkZWZpbml0aW9ucy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgfQorICAgICAgc2VydmljZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWNsYXJhdGlvbnMocHJpbnRlcik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIC8vIERlY2xhcmUgZXh0ZW5zaW9uIGlkZW50aWZpZXJzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9uKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIC8vIEdlbmVyYXRlIGNsYXNzIGlubGluZSBtZXRob2RzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKVxuIik7CisKKyAgLy8gQ2xvc2UgdXAgbmFtZXNwYWNlLgorICBHZW5lcmF0ZU5hbWVzcGFjZUNsb3NlcnMocHJpbnRlcik7CisKKyAgLy8gRW1pdCBHZXRFbnVtRGVzY3JpcHRvciBzcGVjaWFsaXphdGlvbnMgaW50byBnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZToKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSkgeworICAgIC8vIFRoZSBTV0lHIGNvbmRpdGlvbmFsIGlzIHRvIGF2b2lkIGEgbnVsbC1wb2ludGVyIGRlcmVmZXJlbmNlCisgICAgLy8gKGJ1ZyAxOTg0OTY0KSBpbiBzd2lnLTEuMy4yMSByZXN1bHRpbmcgZnJvbSB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAgICAvLyAgIG5hbWVzcGFjZSBYIHsgdm9pZCBZPFo6Olc+KCk7IH0KKyAgICAvLyB3aGljaCBhcHBlYXJzIGluIEdldEVudW1EZXNjcmlwdG9yKCkgc3BlY2lhbGl6YXRpb25zLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiXG4iCisgICAgICAgICIjaWZuZGVmIFNXSUdcbiIKKyAgICAgICAgIm5hbWVzcGFjZSBnb29nbGUge1xubmFtZXNwYWNlIHByb3RvYnVmIHtcbiIKKyAgICAgICAgIlxuIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVHZXRFbnVtRGVzY3JpcHRvclNwZWNpYWxpemF0aW9ucyhwcmludGVyKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVHZXRFbnVtRGVzY3JpcHRvclNwZWNpYWxpemF0aW9ucyhwcmludGVyKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJcbiIKKyAgICAgICAgIn0gIC8vIG5hbWVzcGFjZSBnb29nbGVcbn0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZlxuIgorICAgICAgICAiI2VuZGlmICAvLyBTV0lHXG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSlcbiIKKyAgICAiXG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiI2VuZGlmICAvLyBQUk9UT0JVRl8kZmlsZW5hbWVfaWRlbnRpZmllciRfX0lOQ0xVREVEXG4iLAorICAgICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgIi8vIHNvdXJjZTogJGZpbGVuYW1lJFxuIgorICAgICJcbiIKKworICAgIC8vIFRoZSBnZW5lcmF0ZWQgY29kZSBjYWxscyBhY2Nlc3NvcnMgdGhhdCBtaWdodCBiZSBkZXByZWNhdGVkLiBXZSBkb24ndAorICAgIC8vIHdhbnQgdGhlIGNvbXBpbGVyIHRvIHdhcm4gaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgIiNkZWZpbmUgSU5URVJOQUxfU1VQUFJFU1NfUFJPVE9CVUZfRklFTERfREVQUkVDQVRJT05cbiIKKyAgICAiI2luY2x1ZGUgXCIkYmFzZW5hbWUkLnBiLmhcIlxuIgorICAgICJcbiIKKyAgICAiI2luY2x1ZGUgPGFsZ29yaXRobT5cbiIgICAgLy8gZm9yIHN3YXAoKQorICAgICJcbiIKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD5cbiIKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+XG4iCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+XG4iCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD5cbiIsCisgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSwKKyAgICAiYmFzZW5hbWUiLCBTdHJpcFByb3RvKGZpbGVfLT5uYW1lKCkpKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+XG4iCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+XG4iCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPlxuIgorICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD5cbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcylcbiIpOworCisgIEdlbmVyYXRlTmFtZXNwYWNlT3BlbmVycyhwcmludGVyKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAibmFtZXNwYWNlIHtcbiIKKyAgICAgICJcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiAkbmFtZSRfZGVzY3JpcHRvcl8gPSBOVUxMO1xuIiwKKyAgICAgICAgIm5hbWUiLCBDbGFzc05hbWUoZmlsZV8tPmVudW1fdHlwZShpKSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iLAorICAgICAgICAgICJuYW1lIiwgZmlsZV8tPnNlcnZpY2UoaSktPm5hbWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAifSAgLy8gbmFtZXNwYWNlXG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIERlZmluZSBvdXIgZXh0ZXJuYWxseS12aXNpYmxlIEJ1aWxkRGVzY3JpcHRvcnMoKSBmdW5jdGlvbi4gIChGb3IgdGhlIGxpdGUKKyAgLy8gbGlicmFyeSwgYWxsIHRoaXMgZG9lcyBpcyBpbml0aWFsaXplIGRlZmF1bHQgaW5zdGFuY2VzLikKKyAgR2VuZXJhdGVCdWlsZERlc2NyaXB0b3JzKHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGVudW1zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVNZXRob2RzKHByaW50ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xhc3Nlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc01ldGhvZHMocHJpbnRlcik7CisgIH0KKworICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfKSkgeworICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAoaSA9PSAwKSBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW1wbGVtZW50YXRpb24ocHJpbnRlcik7CisgICAgfQorICB9CisKKyAgLy8gRGVmaW5lIGV4dGVuc2lvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmaW5pdGlvbihwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSlcbiIpOworCisgIEdlbmVyYXRlTmFtZXNwYWNlQ2xvc2VycyhwcmludGVyKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpXG4iKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gQWRkRGVzY3JpcHRvcnMoKSBpcyBhIGZpbGUtbGV2ZWwgcHJvY2VkdXJlIHdoaWNoIGFkZHMgdGhlIGVuY29kZWQKKyAgLy8gRmlsZURlc2NyaXB0b3JQcm90byBmb3IgdGhpcyAucHJvdG8gZmlsZSB0byB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sIGZvcgorICAvLyBnZW5lcmF0ZWQgZmlsZXMgKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKS4gSXQgZWl0aGVyIHJ1bnMgYXQKKyAgLy8gc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUgKGJ5IGRlZmF1bHQpIG9yIHdoZW4gZGVmYXVsdF9pbnN0YW5jZSgpIGlzCisgIC8vIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKGluIExJVEVfUlVOVElNRSBtb2RlIHdpdGgKKyAgLy8gR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUiBmbGFnIGVuYWJsZWQpLiBUaGlzIHByb2NlZHVyZSBhbHNvCisgIC8vIGNvbnN0cnVjdHMgZGVmYXVsdCBpbnN0YW5jZXMgYW5kIHJlZ2lzdGVycyBleHRlbnNpb25zLgorICAvLworICAvLyBJdHMgc2libGluZywgQXNzaWduRGVzY3JpcHRvcnMoKSwgYWN0dWFsbHkgcHVsbHMgdGhlIGNvbXBpbGVkCisgIC8vIEZpbGVEZXNjcmlwdG9yIGZyb20gdGhlIERlc2NyaXB0b3JQb29sIGFuZCB1c2VzIGl0IHRvIHBvcHVsYXRlIGFsbCBvZgorICAvLyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBzdG9yZSBwb2ludGVycyB0byB0aGUgZGVzY3JpcHRvciBvYmplY3RzLgorICAvLyBJdCBhbHNvIGNvbnN0cnVjdHMgdGhlIHJlZmxlY3Rpb24gb2JqZWN0cy4gIEl0IGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZQorICAvLyBhbnlvbmUgY2FsbHMgZGVzY3JpcHRvcigpIG9yIEdldFJlZmxlY3Rpb24oKSBvbiBvbmUgb2YgdGhlIHR5cGVzIGRlZmluZWQKKyAgLy8gaW4gdGhlIGZpbGUuCisKKyAgLy8gSW4gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIG1vZGUsIHdlIGRvbid0IGdlbmVyYXRlIEFzc2lnbkRlc2NyaXB0b3JzKCkKKyAgLy8gYW5kIHdlIG9ubHkgdXNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYWxsb2NhdGUgZGVmYXVsdCBpbnN0YW5jZXMuCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICJ2b2lkICRhc3NpZ25kZXNjcmlwdG9yc25hbWUkKCkge1xuIiwKKyAgICAgICJhc3NpZ25kZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSkpOworICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBmaWxlIGhhcyBmb3VuZCBpdHMgd2F5IGludG8gdGhlIHBvb2wuICBJZiBhIGRlc2NyaXB0b3IKKyAgICAvLyBpcyByZXF1ZXN0ZWQgKmR1cmluZyogc3RhdGljIGluaXQgdGhlbiBBZGREZXNjcmlwdG9ycygpIG1heSBub3QgaGF2ZQorICAgIC8vIGJlZW4gY2FsbGVkIHlldCwgc28gd2UgY2FsbCBpdCBtYW51YWxseS4gIE5vdGUgdGhhdCBpdCdzIGZpbmUgaWYKKyAgICAvLyBBZGREZXNjcmlwdG9ycygpIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIiwKKyAgICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSkpOworCisgICAgLy8gR2V0IHRoZSBmaWxlJ3MgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3IqIGZpbGUgPVxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+RmluZEZpbGVCeU5hbWUoXG4iCisgICAgICAiICAgIFwiJGZpbGVuYW1lJFwiKTtcbiIKKyAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIEdPT0dMRV9DSEVDSyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBhIHdhcm5pbmcgYWJvdXQgImZpbGUiCisgICAgICAvLyBiZWluZyB1bnVzZWQgd2hlbiBjb21waWxpbmcgYW4gZW1wdHkgLnByb3RvIGZpbGUuCisgICAgICAiR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCk7XG4iLAorICAgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisKKyAgICAvLyBHbyB0aHJvdWdoIGFsbCB0aGUgc3R1ZmYgZGVmaW5lZCBpbiB0aGlzIGZpbGUgYW5kIGdlbmVyYXRlZCBjb2RlIHRvCisgICAgLy8gYXNzaWduIHRoZSBnbG9iYWwgZGVzY3JpcHRvciBwb2ludGVycyBiYXNlZCBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKHByaW50ZXIsIGkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihwcmludGVyLCBpKTsKKyAgICB9CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXykpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKHByaW50ZXIsIGkpOworICAgICAgfQorICAgIH0KKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk6ICBUaGUgZmlyc3QgdGltZSBpdCBpcyBjYWxsZWQsIGNhbGxzCisgICAgLy8gQXNzaWduRGVzY3JpcHRvcnMoKS4gIEFsbCBsYXRlciB0aW1lcywgd2FpdHMgZm9yIHRoZSBmaXJzdCBjYWxsIHRvCisgICAgLy8gY29tcGxldGUgYW5kIHRoZW4gcmV0dXJucy4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJuYW1lc3BhY2Uge1xuIgorICAgICAgIlxuIgorICAgICAgIkdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8pO1xuIgorICAgICAgImlubGluZSB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpIHtcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgJiRhc3NpZ25kZXNjcmlwdG9yc25hbWUkKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImFzc2lnbmRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSk7CisKKyAgICAvLyBwcm90b2J1Zl9SZWdpc3RlclR5cGVzKCk6ICBDYWxscworICAgIC8vIE1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkVHlwZSgpIGZvciBlYWNoIG1lc3NhZ2UgdHlwZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ2b2lkIHByb3RvYnVmX1JlZ2lzdGVyVHlwZXMoY29uc3QgOjpzdGQ6OnN0cmluZyYpIHtcbiIKKyAgICAgICIgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpO1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVR5cGVSZWdpc3RyYXRpb25zKHByaW50ZXIpOworICAgIH0KKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAifSAgLy8gbmFtZXNwYWNlXG4iKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gU2h1dGRvd25GaWxlKCk6ICBEZWxldGVzIGRlc2NyaXB0b3JzLCBkZWZhdWx0IGluc3RhbmNlcywgZXRjLiBvbiBzaHV0ZG93bi4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICJ2b2lkICRzaHV0ZG93bmZpbGVuYW1lJCgpIHtcbiIsCisgICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlU2h1dGRvd25Db2RlKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuXG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIE5vdyBnZW5lcmF0ZSB0aGUgQWRkRGVzY3JpcHRvcnMoKSBmdW5jdGlvbi4KKyAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgIGZpbGVfLCBwcmludGVyLAorICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkgc3BlY2lhbCBzeW5jaHJvbml6YXRpb24gaW4gdGhlIGZvbGxvd2luZyBjb2RlCisgICAgLy8gYmVjYXVzZSBpdCBpcyBjYWxsZWQgYXQgc3RhdGljIGluaXQgdGltZSBiZWZvcmUgYW55IHRocmVhZHMgZXhpc3QuCisgICAgInZvaWQgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKSB7XG4iCisgICAgIiAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7XG4iCisgICAgIiAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuO1xuIgorICAgICIgIGFscmVhZHlfaGVyZSA9IHRydWU7XG4iCisgICAgIiAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OO1xuIgorICAgICJcbiIsCisgICAgLy8gV2l0aG91dC4KKyAgICAidm9pZCAkYWRkZGVzY3JpcHRvcnNuYW1lJF9pbXBsKCkge1xuIgorICAgICIgIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjtcbiIKKyAgICAiXG4iLAorICAgIC8vIFZhcnMuCisgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSk7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gQ2FsbCB0aGUgQWRkRGVzY3JpcHRvcnMoKSBtZXRob2RzIGZvciBhbGwgb2Ygb3VyIGRlcGVuZGVuY2llcywgdG8gbWFrZQorICAvLyBzdXJlIHRoZXkgZ2V0IGFkZGVkIGZpcnN0LgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXBlbmRlbmN5ID0gZmlsZV8tPmRlcGVuZGVuY3koaSk7CisgICAgLy8gUHJpbnQgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSBkZXBlbmRlbmN5LgorICAgIHZlY3RvcjxzdHJpbmc+IGRlcGVuZGVuY3lfcGFja2FnZV9wYXJ0czsKKyAgICBTcGxpdFN0cmluZ1VzaW5nKGRlcGVuZGVuY3ktPnBhY2thZ2UoKSwgIi4iLCAmZGVwZW5kZW5jeV9wYWNrYWdlX3BhcnRzKTsKKyAgICBwcmludGVyLT5QcmludCgiOjoiKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlcGVuZGVuY3lfcGFja2FnZV9wYXJ0cy5zaXplKCk7IGorKykgeworICAgICAgcHJpbnRlci0+UHJpbnQoIiRuYW1lJDo6IiwKKyAgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgZGVwZW5kZW5jeV9wYWNrYWdlX3BhcnRzW2pdKTsKKyAgICB9CisgICAgLy8gQ2FsbCBpdHMgQWRkRGVzY3JpcHRvcnMgZnVuY3Rpb24uCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiJG5hbWUkKCk7XG4iLAorICAgICAgIm5hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZGVwZW5kZW5jeS0+bmFtZSgpKSk7CisgIH0KKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgICAgLy8gRW1iZWQgdGhlIGRlc2NyaXB0b3IuICBXZSBzaW1wbHkgc2VyaWFsaXplIHRoZSBlbnRpcmUgRmlsZURlc2NyaXB0b3JQcm90bworICAgIC8vIGFuZCBlbWJlZCBpdCBhcyBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBpcyBwYXJzZWQgYW5kIGJ1aWx0IGludG8gcmVhbAorICAgIC8vIGRlc2NyaXB0b3JzIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIGZpbGVfLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICAgIHN0cmluZyBmaWxlX2RhdGE7CisgICAgZmlsZV9wcm90by5TZXJpYWxpemVUb1N0cmluZygmZmlsZV9kYXRhKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OkludGVybmFsQWRkR2VuZXJhdGVkRmlsZSgiKTsKKworICAgIC8vIE9ubHkgd3JpdGUgNDAgYnl0ZXMgcGVyIGxpbmUuCisgICAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJMaW5lID0gNDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX2RhdGEuc2l6ZSgpOyBpICs9IGtCeXRlc1BlckxpbmUpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbiAgXCIkZGF0YSRcIiIsCisgICAgICAgICAgICAgICAgICAgICAiZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICBFc2NhcGVUcmlncmFwaHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0VzY2FwZShmaWxlX2RhdGEuc3Vic3RyKGksIGtCeXRlc1BlckxpbmUpKSkpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiwgJHNpemUkKTtcbiIsCisgICAgICAic2l6ZSIsIFNpbXBsZUl0b2EoZmlsZV9kYXRhLnNpemUoKSkpOworCisgICAgLy8gQ2FsbCBNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoKS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZShcbiIKKyAgICAgICIgIFwiJGZpbGVuYW1lJFwiLCAmcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyk7XG4iLAorICAgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisgIH0KKworICAvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkZWZhdWx0IGluc3RhbmNlcy4gIFRoaXMgY2FuJ3QgYmUgZG9uZSBsYXppbHkKKyAgLy8gc2luY2UgZGVmYXVsdCBpbnN0YW5jZXMgYXJlIHJldHVybmVkIGJ5IHNpbXBsZSBhY2Nlc3NvcnMgYW5kIGFyZSB1c2VkIHdpdGgKKyAgLy8gZXh0ZW5zaW9ucy4gIFNwZWFraW5nIG9mIHdoaWNoLCB3ZSBhbHNvIHJlZ2lzdGVyIGV4dGVuc2lvbnMgYXQgdGhpcyB0aW1lLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IocHJpbnRlcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVSZWdpc3RyYXRpb24ocHJpbnRlcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmYXVsdEluc3RhbmNlSW5pdGlhbGl6ZXIocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmJHNodXRkb3duZmlsZW5hbWUkKTtcbiIsCisgICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgIGZpbGVfLCBwcmludGVyLAorICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAiLy8gRm9yY2UgQWRkRGVzY3JpcHRvcnMoKSB0byBiZSBjYWxsZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUuXG4iCisgICAgInN0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfJGZpbGVuYW1lJCB7XG4iCisgICAgIiAgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyXyRmaWxlbmFtZSQoKSB7XG4iCisgICAgIiAgICAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgorICAgICIgIH1cbiIKKyAgICAifSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl8kZmlsZW5hbWUkXztcbiIsCisgICAgLy8gV2l0aG91dC4KKyAgICAiR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRSgkYWRkZGVzY3JpcHRvcnNuYW1lJF9vbmNlXyk7XG4iCisgICAgInZvaWQgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKSB7XG4iCisgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjo6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCYkYWRkZGVzY3JpcHRvcnNuYW1lJF9vbmNlXyxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAmJGFkZGRlc2NyaXB0b3JzbmFtZSRfaW1wbCk7XG4iCisgICAgIn1cbiIsCisgICAgLy8gVmFycy4KKyAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpLAorICAgICJmaWxlbmFtZSIsIEZpbGVuYW1lSWRlbnRpZmllcihmaWxlXy0+bmFtZSgpKSk7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVOYW1lc3BhY2VPcGVuZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChwYWNrYWdlX3BhcnRzXy5zaXplKCkgPiAwKSBwcmludGVyLT5QcmludCgiXG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VfcGFydHNfLnNpemUoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIm5hbWVzcGFjZSAkcGFydCQge1xuIiwKKyAgICAgICAgICAgICAgICAgICAicGFydCIsIHBhY2thZ2VfcGFydHNfW2ldKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlTmFtZXNwYWNlQ2xvc2Vycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAocGFja2FnZV9wYXJ0c18uc2l6ZSgpID4gMCkgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgZm9yIChpbnQgaSA9IHBhY2thZ2VfcGFydHNfLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIn0gIC8vIG5hbWVzcGFjZSAkcGFydCRcbiIsCisgICAgICAgICAgICAgICAgICAgInBhcnQiLCBwYWNrYWdlX3BhcnRzX1tpXSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGVlZmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklMRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUxFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgY2xhc3MgRmlsZURlc2NyaXB0b3I7ICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yOyAgICAgICAgICAgLy8gZW51bS5oCitjbGFzcyBNZXNzYWdlR2VuZXJhdG9yOyAgICAgICAgLy8gbWVzc2FnZS5oCitjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yOyAgICAgICAgLy8gc2VydmljZS5oCitjbGFzcyBFeHRlbnNpb25HZW5lcmF0b3I7ICAgICAgLy8gZXh0ZW5zaW9uLmgKKworY2xhc3MgRmlsZUdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgZXhwbGljaXQgRmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgfkZpbGVHZW5lcmF0b3IoKTsKKworICB2b2lkIEdlbmVyYXRlSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICAvLyBHZW5lcmF0ZSB0aGUgQnVpbGREZXNjcmlwdG9ycygpIHByb2NlZHVyZSwgd2hpY2ggYnVpbGRzIGFsbCBkZXNjcmlwdG9ycworICAvLyBmb3IgdHlwZXMgZGVmaW5lZCBpbiB0aGUgZmlsZS4KKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIHZvaWQgR2VuZXJhdGVOYW1lc3BhY2VPcGVuZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZU5hbWVzcGFjZUNsb3NlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKKworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPiA+IG1lc3NhZ2VfZ2VuZXJhdG9yc187CisgIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPEVudW1HZW5lcmF0b3I+ID4gZW51bV9nZW5lcmF0b3JzXzsKKyAgc2NvcGVkX2FycmF5PHNjb3BlZF9wdHI8U2VydmljZUdlbmVyYXRvcj4gPiBzZXJ2aWNlX2dlbmVyYXRvcnNfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+ID4gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfOworCisgIC8vIEUuZy4gaWYgdGhlIHBhY2thZ2UgaXMgZm9vLmJhciwgcGFja2FnZV9wYXJ0c18gaXMgeyJmb28iLCAiYmFyIn0uCisgIHZlY3RvcjxzdHJpbmc+IHBhY2thZ2VfcGFydHNfOworCisgIGNvbnN0IE9wdGlvbnMgb3B0aW9uc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJTEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxMzUxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitDcHBHZW5lcmF0b3I6OkNwcEdlbmVyYXRvcigpIHt9CitDcHBHZW5lcmF0b3I6On5DcHBHZW5lcmF0b3IoKSB7fQorCitib29sIENwcEdlbmVyYXRvcjo6R2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgeworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBvcHRpb25zOworICBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihwYXJhbWV0ZXIsICZvcHRpb25zKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBwYXJzZSBnZW5lcmF0b3Igb3B0aW9ucworCisgIC8vIFRPRE8oa2VudG9uKTogIElmIHdlIGV2ZXIgaGF2ZSBtb3JlIG9wdGlvbnMsIHdlIG1heSB3YW50IHRvIGNyZWF0ZSBhCisgIC8vICAgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlbSB3aGljaCB3ZSBjYW4gcGFzcyBkb3duIHRvIGFsbCB0aGUKKyAgLy8gICBnZW5lcmF0b3IgY2xhc3Nlcy4gIEN1cnJlbnRseSB3ZSBwYXNzIGRsbGV4cG9ydF9kZWNsIGRvd24gdG8gYWxsIG9mCisgIC8vICAgdGhlbSB2aWEgdGhlIGNvbnN0cnVjdG9ycywgYnV0IHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byBhZGQgYW5vdGhlcgorICAvLyAgIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBmb3IgZXZlcnkgb3B0aW9uLgorCisgIC8vIElmIHRoZSBkbGxleHBvcnRfZGVjbCBvcHRpb24gaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgd2UgbmVlZCB0byB3cml0ZQorICAvLyBpdCBpbiBmcm9udCBvZiBldmVyeSBzeW1ib2wgdGhhdCBzaG91bGQgYmUgZXhwb3J0ZWQgaWYgdGhpcyAucHJvdG8gaXMKKyAgLy8gY29tcGlsZWQgaW50byBhIFdpbmRvd3MgRExMLiAgRS5nLiwgaWYgdGhlIHVzZXIgaW52b2tlcyB0aGUgcHJvdG9jb2wKKyAgLy8gY29tcGlsZXIgYXM6CisgIC8vICAgcHJvdG9jIC0tY3BwX291dD1kbGxleHBvcnRfZGVjbD1GT09fRVhQT1JUOm91dGRpciBmb28ucHJvdG8KKyAgLy8gdGhlbiB3ZSdsbCBkZWZpbmUgY2xhc3NlcyBsaWtlIHRoaXM6CisgIC8vICAgY2xhc3MgRk9PX0VYUE9SVCBGb28geworICAvLyAgICAgLi4uCisgIC8vICAgfQorICAvLyBGT09fRVhQT1JUIGlzIGEgbWFjcm8gd2hpY2ggc2hvdWxkIGV4cGFuZCB0byBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgb3IKKyAgLy8gX19kZWNsc3BlYyhkbGxpbXBvcnQpIGRlcGVuZGluZyBvbiB3aGF0IGlzIGJlaW5nIGNvbXBpbGVkLgorICBPcHRpb25zIGZpbGVfb3B0aW9uczsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAiZGxsZXhwb3J0X2RlY2wiKSB7CisgICAgICBmaWxlX29wdGlvbnMuZGxsZXhwb3J0X2RlY2wgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gInNhZmVfYm91bmRhcnlfY2hlY2siKSB7CisgICAgICBmaWxlX29wdGlvbnMuc2FmZV9ib3VuZGFyeV9jaGVjayA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICplcnJvciA9ICJVbmtub3duIGdlbmVyYXRvciBvcHRpb246ICIgKyBvcHRpb25zW2ldLmZpcnN0OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICBzdHJpbmcgYmFzZW5hbWUgPSBTdHJpcFByb3RvKGZpbGUtPm5hbWUoKSk7CisgIGJhc2VuYW1lLmFwcGVuZCgiLnBiIik7CisKKyAgRmlsZUdlbmVyYXRvciBmaWxlX2dlbmVyYXRvcihmaWxlLCBmaWxlX29wdGlvbnMpOworCisgIC8vIEdlbmVyYXRlIGhlYWRlci4KKyAgeworICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihiYXNlbmFtZSArICIuaCIpKTsKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZUhlYWRlcigmcHJpbnRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjYyBmaWxlLgorICB7CisgICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGJhc2VuYW1lICsgIi5jYyIpKTsKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVNvdXJjZSgmcHJpbnRlcik7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwZTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEdlbmVyYXRlcyBDKysgY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0dFTkVSQVRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9HRU5FUkFUT1JfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ29kZUdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiB3aGljaCBnZW5lcmF0ZXMgYSBDKysgc291cmNlIGZpbGUgYW5kCisvLyBoZWFkZXIuICBJZiB5b3UgY3JlYXRlIHlvdXIgb3duIHByb3RvY29sIGNvbXBpbGVyIGJpbmFyeSBhbmQgeW91IHdhbnQKKy8vIGl0IHRvIHN1cHBvcnQgQysrIG91dHB1dCwgeW91IGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzCisvLyBDb2RlR2VuZXJhdG9yIHdpdGggdGhlIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgorY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBDcHBHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBDcHBHZW5lcmF0b3IoKTsKKyAgfkNwcEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3BwR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODkxMWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYwpAQCAtMCwwICsxLDQzOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSB7CisKK3N0cmluZyBEb3RzVG9VbmRlcnNjb3Jlcyhjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIFN0cmluZ1JlcGxhY2UobmFtZSwgIi4iLCAiXyIsIHRydWUpOworfQorCitzdHJpbmcgRG90c1RvQ29sb25zKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICByZXR1cm4gU3RyaW5nUmVwbGFjZShuYW1lLCAiLiIsICI6OiIsIHRydWUpOworfQorCitjb25zdCBjaGFyKiBjb25zdCBrS2V5d29yZExpc3RbXSA9IHsKKyAgImFuZCIsICJhbmRfZXEiLCAiYXNtIiwgImF1dG8iLCAiYml0YW5kIiwgImJpdG9yIiwgImJvb2wiLCAiYnJlYWsiLCAiY2FzZSIsCisgICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbXBsIiwgImNvbnN0IiwgImNvbnN0X2Nhc3QiLCAiY29udGludWUiLAorICAiZGVmYXVsdCIsICJkZWxldGUiLCAiZG8iLCAiZG91YmxlIiwgImR5bmFtaWNfY2FzdCIsICJlbHNlIiwgImVudW0iLAorICAiZXhwbGljaXQiLCAiZXh0ZXJuIiwgImZhbHNlIiwgImZsb2F0IiwgImZvciIsICJmcmllbmQiLCAiZ290byIsICJpZiIsCisgICJpbmxpbmUiLCAiaW50IiwgImxvbmciLCAibXV0YWJsZSIsICJuYW1lc3BhY2UiLCAibmV3IiwgIm5vdCIsICJub3RfZXEiLAorICAib3BlcmF0b3IiLCAib3IiLCAib3JfZXEiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwgInJlZ2lzdGVyIiwKKyAgInJlaW50ZXJwcmV0X2Nhc3QiLCAicmV0dXJuIiwgInNob3J0IiwgInNpZ25lZCIsICJzaXplb2YiLCAic3RhdGljIiwKKyAgInN0YXRpY19jYXN0IiwgInN0cnVjdCIsICJzd2l0Y2giLCAidGVtcGxhdGUiLCAidGhpcyIsICJ0aHJvdyIsICJ0cnVlIiwgInRyeSIsCisgICJ0eXBlZGVmIiwgInR5cGVpZCIsICJ0eXBlbmFtZSIsICJ1bmlvbiIsICJ1bnNpZ25lZCIsICJ1c2luZyIsICJ2aXJ0dWFsIiwKKyAgInZvaWQiLCAidm9sYXRpbGUiLCAid2NoYXJfdCIsICJ3aGlsZSIsICJ4b3IiLCAieG9yX2VxIgorfTsKKworaGFzaF9zZXQ8c3RyaW5nPiBNYWtlS2V5d29yZHNNYXAoKSB7CisgIGhhc2hfc2V0PHN0cmluZz4gcmVzdWx0OworICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoa0tleXdvcmRMaXN0KTsgaSsrKSB7CisgICAgcmVzdWx0Lmluc2VydChrS2V5d29yZExpc3RbaV0pOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2hhc2hfc2V0PHN0cmluZz4ga0tleXdvcmRzID0gTWFrZUtleXdvcmRzTWFwKCk7CisKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgY2FwX25leHRfbGV0dGVyKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgeworICAgICAgaWYgKGNhcF9uZXh0X2xldHRlcikgeworICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV0gKyAoJ0EnIC0gJ2EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoJ0EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICdaJykgeworICAgICAgLy8gQ2FwaXRhbCBsZXR0ZXJzIGFyZSBsZWZ0IGFzLWlzLgorICAgICAgcmVzdWx0ICs9IGlucHV0W2ldOworICAgICAgY2FwX25leHRfbGV0dGVyID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICgnMCcgPD0gaW5wdXRbaV0gJiYgaW5wdXRbaV0gPD0gJzknKSB7CisgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGRlc2NyaXB0b3IgaGFzIGFuIGV4dGVuc2lvbi4gVGhpcyBpbmNsdWRlcyBpdHMKKy8vIG5lc3RlZCB0eXBlcy4KK2Jvb2wgSGFzRXh0ZW5zaW9uKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgaWYgKGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc0V4dGVuc2lvbihkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitjb25zdCBjaGFyIGtUaGlja1NlcGFyYXRvcltdID0KKyAgIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Citjb25zdCBjaGFyIGtUaGluU2VwYXJhdG9yW10gPQorICAiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKworc3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIHF1YWxpZmllZCkgeworCisgIC8vIEZpbmQgIm91dGVyIiwgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHRvcC1sZXZlbCBtZXNzYWdlIGluIHdoaWNoCisgIC8vICJkZXNjcmlwdG9yIiBpcyBlbWJlZGRlZC4KKyAgY29uc3QgRGVzY3JpcHRvciogb3V0ZXIgPSBkZXNjcmlwdG9yOworICB3aGlsZSAob3V0ZXItPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIG91dGVyID0gb3V0ZXItPmNvbnRhaW5pbmdfdHlwZSgpOworCisgIGNvbnN0IHN0cmluZyYgb3V0ZXJfbmFtZSA9IG91dGVyLT5mdWxsX25hbWUoKTsKKyAgc3RyaW5nIGlubmVyX25hbWUgPSBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5zdWJzdHIob3V0ZXJfbmFtZS5zaXplKCkpOworCisgIGlmIChxdWFsaWZpZWQpIHsKKyAgICByZXR1cm4gIjo6IiArIERvdHNUb0NvbG9ucyhvdXRlcl9uYW1lKSArIERvdHNUb1VuZGVyc2NvcmVzKGlubmVyX25hbWUpOworICB9IGVsc2UgeworICAgIHJldHVybiBvdXRlci0+bmFtZSgpICsgRG90c1RvVW5kZXJzY29yZXMoaW5uZXJfbmFtZSk7CisgIH0KK30KKworc3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yLCBib29sIHF1YWxpZmllZCkgeworICBpZiAoZW51bV9kZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSB7CisgICAgaWYgKHF1YWxpZmllZCkgeworICAgICAgcmV0dXJuICI6OiIgKyBEb3RzVG9Db2xvbnMoZW51bV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBlbnVtX2Rlc2NyaXB0b3ItPm5hbWUoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IENsYXNzTmFtZShlbnVtX2Rlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLCBxdWFsaWZpZWQpOworICAgIHJlc3VsdCArPSAnXyc7CisgICAgcmVzdWx0ICs9IGVudW1fZGVzY3JpcHRvci0+bmFtZSgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworCitzdHJpbmcgU3VwZXJDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpKSA/CisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIiA6ICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlIjsKK30KKworc3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN0cmluZyByZXN1bHQgPSBmaWVsZC0+bmFtZSgpOworICBMb3dlclN0cmluZygmcmVzdWx0KTsKKyAgaWYgKGtLZXl3b3Jkcy5jb3VudChyZXN1bHQpID4gMCkgeworICAgIHJlc3VsdC5hcHBlbmQoIl8iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCkgeworICBzdHJpbmcgZmllbGRfbmFtZSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSk7CisgIHN0cmluZyByZXN1bHQgPSAiayIgKyBmaWVsZF9uYW1lICsgIkZpZWxkTnVtYmVyIjsKKworICBpZiAoIWZpZWxkLT5pc19leHRlbnNpb24oKSAmJgorICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoCisgICAgICAgIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKSAhPSBmaWVsZCkgeworICAgIC8vIFRoaXMgZmllbGQncyBjYW1lbGNhc2UgbmFtZSBpcyBub3QgdW5pcXVlLiAgQXMgYSBoYWNrLCBhZGQgdGhlIGZpZWxkCisgICAgLy8gbnVtYmVyIHRvIHRoZSBjb25zdGFudCBuYW1lLiAgVGhpcyBtYWtlcyB0aGUgY29uc3RhbnQgcmF0aGVyIHVzZWxlc3MsCisgICAgLy8gYnV0IHdoYXQgY2FuIHdlIGRvPworICAgIHJlc3VsdCArPSAiXyIgKyBTaW1wbGVJdG9hKGZpZWxkLT5udW1iZXIoKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgRmllbGRNZXNzYWdlVHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBOb3RlOiAgVGhlIEdvb2dsZS1pbnRlcm5hbCB2ZXJzaW9uIG9mIFByb3RvY29sIEJ1ZmZlcnMgdXNlcyB0aGlzIGZ1bmN0aW9uCisgIC8vICAgYXMgYSBob29rIHBvaW50IGZvciBoYWNrcyB0byBzdXBwb3J0IGxlZ2FjeSBjb2RlLgorICByZXR1cm4gQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgdHJ1ZSk7Cit9CisKK3N0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgaWYgKEhhc1N1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90b2RldmVsIikpIHsKKyAgICByZXR1cm4gU3RyaXBTdWZmaXhTdHJpbmcoZmlsZW5hbWUsICIucHJvdG9kZXZlbCIpOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90byIpOworICB9Cit9CisKK2NvbnN0IGNoYXIqIFByaW1pdGl2ZVR5cGVOYW1lKEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyICA6IHJldHVybiAiOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQgIDogcmV0dXJuICI6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzIgOiByZXR1cm4gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQgOiByZXR1cm4gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEUgOiByZXR1cm4gImRvdWJsZSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQgIDogcmV0dXJuICJmbG9hdCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTCAgIDogcmV0dXJuICJib29sIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNICAgOiByZXR1cm4gImludCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HIDogcmV0dXJuICI6OnN0ZDo6c3RyaW5nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiByZXR1cm4gTlVMTDsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gQ3BwVHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyKiBEZWNsYXJlZFR5cGVNZXRob2ROYW1lKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gIkludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuICJJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAiVUludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQgIDogcmV0dXJuICJVSW50NjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiAgOiByZXR1cm4gIlNJbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0ICA6IHJldHVybiAiU0ludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyIDogcmV0dXJuICJGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuICJGaXhlZDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjogcmV0dXJuICJTRml4ZWQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiAiU0ZpeGVkNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gIkZsb2F0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuICJEb3VibGUiOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiAiQm9vbCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRW51bSI7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgIDogcmV0dXJuICJTdHJpbmciOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTICAgOiByZXR1cm4gIkJ5dGVzIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAgIDogcmV0dXJuICJHcm91cCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSA6IHJldHVybiAiTWVzc2FnZSI7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuICIiOworfQorCitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgLy8gZ2NjIHJlamVjdHMgdGhlIGRlY2ltYWwgZm9ybSBvZiBraW50MzJtaW4gYW5kIGtpbnQ2NG1pbi4KKyAgICAgIGlmIChmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpID09IGtpbnQzMm1pbikgeworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgMidzIGNvbXBsZW1lbnQgc3lzdGVtLgorICAgICAgICBHT09HTEVfQ09NUElMRV9BU1NFUlQoa2ludDMybWluID09IC0weDgwMDAwMDAwLCBraW50MzJtaW5fdmFsdWVfZXJyb3IpOworICAgICAgICByZXR1cm4gIi0weDgwMDAwMDAwIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpKSArICJ1IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIC8vIFNlZSB0aGUgY29tbWVudHMgZm9yIENQUFRZUEVfSU5UMzIuCisgICAgICBpZiAoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50NjQoKSA9PSBraW50NjRtaW4pIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBpbiBhIDIncyBjb21wbGVtZW50IHN5c3RlbS4KKyAgICAgICAgR09PR0xFX0NPTVBJTEVfQVNTRVJUKGtpbnQ2NG1pbiA9PSBHT09HTEVfTE9OR0xPTkcoLTB4ODAwMDAwMDAwMDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgIGtpbnQ2NG1pbl92YWx1ZV9lcnJvcik7CisgICAgICAgIHJldHVybiAiR09PR0xFX0xPTkdMT05HKC0weDgwMDAwMDAwMDAwMDAwMDApIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAiR09PR0xFX0xPTkdMT05HKCIgKyBTaW1wbGVJdG9hKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkpICsgIikiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAiR09PR0xFX1VMT05HTE9ORygiICsgU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSkrICIpIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSB2YWx1ZSA9IGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpOworICAgICAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbmZpbml0eSgpIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICItOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW5maW5pdHkoKSI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFOKCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNpbXBsZUR0b2EodmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgIHsKKyAgICAgICAgZmxvYXQgdmFsdWUgPSBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxmbG9hdD4oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW5maW5pdHkoKSkiOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKKyAgICAgICAgICByZXR1cm4gInN0YXRpY19jYXN0PGZsb2F0PigtOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW5maW5pdHkoKSkiOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxmbG9hdD4oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFOKCkpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJpbmcgZmxvYXRfdmFsdWUgPSBTaW1wbGVGdG9hKHZhbHVlKTsKKyAgICAgICAgICAvLyBJZiBmbG9hdGluZyBwb2ludCB2YWx1ZSBjb250YWlucyBhIHBlcmlvZCAoLikgb3IgYW4gZXhwb25lbnQKKyAgICAgICAgICAvLyAoZWl0aGVyIEUgb3IgZSksIHRoZW4gYXBwZW5kIHN1ZmZpeCAnZicgdG8gbWFrZSBpdCBhIGZsb2F0CisgICAgICAgICAgLy8gbGl0ZXJhbC4KKyAgICAgICAgICBpZiAoZmxvYXRfdmFsdWUuZmluZF9maXJzdF9vZigiLmVFIikgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBmbG9hdF92YWx1ZS5wdXNoX2JhY2soJ2YnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGZsb2F0X3ZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9ib29sKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAvLyBMYXp5OiAgR2VuZXJhdGUgYSBzdGF0aWNfY2FzdCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYSBoZWxwZXIgZnVuY3Rpb24KKyAgICAgIC8vICAgdGhhdCBjb25zdHJ1Y3RzIHRoZSBmdWxsIG5hbWUgb2YgYW4gZW51bSB2YWx1ZS4KKyAgICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICJzdGF0aWNfY2FzdDwgJDAgPigkMSkiLAorICAgICAgICAgIENsYXNzTmFtZShmaWVsZC0+ZW51bV90eXBlKCksIHRydWUpLAorICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiXCIiICsgRXNjYXBlVHJpZ3JhcGhzKAorICAgICAgICBDRXNjYXBlKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSkgKworICAgICAgICAiXCIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gRmllbGRNZXNzYWdlVHlwZU5hbWUoZmllbGQpICsgIjo6ZGVmYXVsdF9pbnN0YW5jZSgpIjsKKyAgfQorICAvLyBDYW4ndCBhY3R1YWxseSBnZXQgaGVyZTsgbWFrZSBjb21waWxlciBoYXBweS4gIChXZSBjb3VsZCBhZGQgYSBkZWZhdWx0CisgIC8vIGNhc2UgYWJvdmUgYnV0IHRoZW4gd2Ugd291bGRuJ3QgZ2V0IHRoZSBuaWNlIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBhCisgIC8vIG5ldyB0eXBlIGlzIGFkZGVkLikKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAiIjsKK30KKworLy8gQ29udmVydCBhIGZpbGUgbmFtZSBpbnRvIGEgdmFsaWQgaWRlbnRpZmllci4KK3N0cmluZyBGaWxlbmFtZUlkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICBzdHJpbmcgcmVzdWx0OworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGFzY2lpX2lzYWxudW0oZmlsZW5hbWVbaV0pKSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKGZpbGVuYW1lW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm90IGFscGhhbnVtZXJpYy4gIFRvIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBuYW1lIGNvbmZsaWN0cyB3ZQorICAgICAgLy8gdXNlIHRoZSBoZXggY29kZSBmb3IgdGhlIGNoYXJhY3Rlci4KKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ18nKTsKKyAgICAgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoRmFzdEhleFRvQnVmZmVyKHN0YXRpY19jYXN0PHVpbnQ4PihmaWxlbmFtZVtpXSksIGJ1ZmZlcikpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEFkZERlc2NyaXB0b3JzKCkgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZmlsZS4KK3N0cmluZyBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gInByb3RvYnVmX0FkZERlc2NfIiArIEZpbGVuYW1lSWRlbnRpZmllcihmaWxlbmFtZSk7Cit9CisKKy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgQXNzaWduRGVzY3JpcHRvcnMoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgorc3RyaW5nIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHJldHVybiAicHJvdG9idWZfQXNzaWduRGVzY18iICsgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVuYW1lKTsKK30KKworLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBTaHV0ZG93bkZpbGUoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgorc3RyaW5nIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gInByb3RvYnVmX1NodXRkb3duRmlsZV8iICsgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVuYW1lKTsKK30KKworLy8gRXNjYXBlIEMrKyB0cmlncmFwaHMgYnkgZXNjYXBpbmcgcXVlc3Rpb24gbWFya3MgdG8gXD8KK3N0cmluZyBFc2NhcGVUcmlncmFwaHMoY29uc3Qgc3RyaW5nJiB0b19lc2NhcGUpIHsKKyAgcmV0dXJuIFN0cmluZ1JlcGxhY2UodG9fZXNjYXBlLCAiPyIsICJcXD8iLCB0cnVlKTsKK30KKworYm9vbCBTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGUpIHx8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChIYXNFeHRlbnNpb24oZmlsZS0+bWVzc2FnZV90eXBlKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQsCisgICAgY29uc3QgY2hhciogdmFyMSwgY29uc3Qgc3RyaW5nJiB2YWwxLAorICAgIGNvbnN0IGNoYXIqIHZhcjIsIGNvbnN0IHN0cmluZyYgdmFsMikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIGlmICh2YXIxKSB7CisgICAgdmFyc1t2YXIxXSA9IHZhbDE7CisgIH0KKyAgaWYgKHZhcjIpIHsKKyAgICB2YXJzW3ZhcjJdID0gdmFsMjsKKyAgfQorICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgICB2YXJzLCBmaWxlLCBwcmludGVyLCB3aXRoX3N0YXRpY19pbml0LCB3aXRob3V0X3N0YXRpY19pbml0KTsKK30KKwordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsCisgICAgY29uc3QgY2hhciogd2l0aG91dF9zdGF0aWNfaW5pdCkgeworICBpZiAoU3RhdGljSW5pdGlhbGl6ZXJzRm9yY2VkKGZpbGUpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywgd2l0aF9zdGF0aWNfaW5pdCk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywgKHN0cmluZygKKyAgICAgICIjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUlxuIikgKworICAgICAgd2l0aG91dF9zdGF0aWNfaW5pdCArCisgICAgICAiI2Vsc2VcbiIgKworICAgICAgd2l0aF9zdGF0aWNfaW5pdCArCisgICAgICAiI2VuZGlmXG4iKS5jX3N0cigpKTsKKyAgfQorfQorCisKK3N0YXRpYyBib29sIEhhc0VudW1EZWZpbml0aW9ucyhjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIHsKKyAgaWYgKG1lc3NhZ2VfdHlwZS0+ZW51bV90eXBlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGUtPm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChIYXNFbnVtRGVmaW5pdGlvbnMobWVzc2FnZV90eXBlLT5uZXN0ZWRfdHlwZShpKSkpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBIYXNFbnVtRGVmaW5pdGlvbnMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKGZpbGUtPmVudW1fdHlwZV9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChIYXNFbnVtRGVmaW5pdGlvbnMoZmlsZS0+bWVzc2FnZV90eXBlKGkpKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmUxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmgKQEAgLTAsMCArMSwxODYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfSEVMUEVSU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9IRUxQRVJTX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7Cit9CisKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ29tbW9ubHktdXNlZCBzZXBhcmF0b3IgY29tbWVudHMuICBUaGljayBpcyBhIGxpbmUgb2YgJz0nLCB0aGluIGlzIGEgbGluZQorLy8gb2YgJy0nLgorZXh0ZXJuIGNvbnN0IGNoYXIga1RoaWNrU2VwYXJhdG9yW107CitleHRlcm4gY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdOworCisvLyBSZXR1cm5zIHRoZSBub24tbmVzdGVkIHR5cGUgbmFtZSBmb3IgdGhlIGdpdmVuIHR5cGUuICBJZiAicXVhbGlmaWVkIiBpcworLy8gdHJ1ZSwgcHJlZml4IHRoZSB0eXBlIHdpdGggdGhlIGZ1bGwgbmFtZXNwYWNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQ6CisvLyAgIHBhY2thZ2UgZm9vLmJhcjsKKy8vICAgbWVzc2FnZSBCYXogeyBtZXNzYWdlIFF1eCB7fSB9CisvLyBUaGVuIHRoZSBxdWFsaWZpZWQgQ2xhc3NOYW1lIGZvciBRdXggd291bGQgYmU6CisvLyAgIDo6Zm9vOjpiYXI6OkJhel9RdXgKKy8vIFdoaWxlIHRoZSBub24tcXVhbGlmaWVkIHZlcnNpb24gd291bGQgYmU6CisvLyAgIEJhel9RdXgKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpOworc3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yLCBib29sIHF1YWxpZmllZCk7CisKK3N0cmluZyBTdXBlckNsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworLy8gR2V0IHRoZSAodW5xdWFsaWZpZWQpIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBmaWVsZCBpbiBDKysgY29kZS4KKy8vIFRoZSBuYW1lIGlzIGNvZXJjZWQgdG8gbG93ZXItY2FzZSB0byBlbXVsYXRlIHByb3RvMSBiZWhhdmlvci4gIFBlb3BsZQorLy8gc2hvdWxkIGJlIHVzaW5nIGxvd2VyY2FzZS13aXRoLXVuZGVyc2NvcmVzIHN0eWxlIGZvciBwcm90byBmaWVsZCBuYW1lcworLy8gYW55d2F5LCBzbyBub3JtYWxseSB0aGlzIGp1c3QgcmV0dXJucyBmaWVsZC0+bmFtZSgpLgorc3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gR2V0IHRoZSB1bnF1YWxpZmllZCBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgZmllbGQncyBmaWVsZAorLy8gbnVtYmVyIGNvbnN0YW50Lgorc3RyaW5nIEZpZWxkQ29uc3RhbnROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqZmllbGQpOworCisvLyBSZXR1cm5zIHRoZSBzY29wZSB3aGVyZSB0aGUgZmllbGQgd2FzIGRlZmluZWQgKGZvciBleHRlbnNpb25zLCB0aGlzIGlzCisvLyBkaWZmZXJlbnQgZnJvbSB0aGUgbWVzc2FnZSB0eXBlIHRvIHdoaWNoIHRoZSBmaWVsZCBhcHBsaWVzKS4KK2lubGluZSBjb25zdCBEZXNjcmlwdG9yKiBGaWVsZFNjb3BlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLT5pc19leHRlbnNpb24oKSA/CisgICAgZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpIDogZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpOworfQorCisvLyBSZXR1cm5zIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lIGZpZWxkLT5tZXNzYWdlX3R5cGUoKS4gIFVzdWFsbHkgdGhpcworLy8gaXMganVzdCBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCB0cnVlKTsKK3N0cmluZyBGaWVsZE1lc3NhZ2VUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gU3RyaXBzICIucHJvdG8iIG9yICIucHJvdG9kZXZlbCIgZnJvbSB0aGUgZW5kIG9mIGEgZmlsZW5hbWUuCitzdHJpbmcgU3RyaXBQcm90byhjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKKworLy8gR2V0IHRoZSBDKysgdHlwZSBuYW1lIGZvciBhIHByaW1pdGl2ZSB0eXBlIChlLmcuICJkb3VibGUiLCAiOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiIsIGV0Yy4pLgorLy8gTm90ZTogIG5vbi1idWlsdC1pbiB0eXBlIG5hbWVzIHdpbGwgYmUgcXVhbGlmaWVkLCBtZWFuaW5nIHRoZXkgd2lsbCBzdGFydAorLy8gd2l0aCBhIDo6LiAgSWYgeW91IGFyZSB1c2luZyB0aGUgdHlwZSBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlciwgeW91IHdpbGwKKy8vIG5lZWQgdG8gaW5zdXJlIHRoZXJlIGlzIGEgc3BhY2UgYmV0d2VlbiB0aGUgPCBhbmQgdGhlIDo6LCBiZWNhdXNlIHRoZQorLy8gcmlkaWN1bG91cyBDKysgc3RhbmRhcmQgZGVmaW5lcyAiPDoiIHRvIGJlIGEgc3lub255bSBmb3IgIlsiLgorY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIHR5cGUpOworCisvLyBHZXQgdGhlIGRlY2xhcmVkIHR5cGUgbmFtZSBpbiBDYW1lbENhc2UgZm9ybWF0LCBhcyBpcyB1c2VkIGUuZy4gZm9yIHRoZQorLy8gbWV0aG9kcyBvZiBXaXJlRm9ybWF0LiAgRm9yIGV4YW1wbGUsIFRZUEVfSU5UMzIgYmVjb21lcyAiSW50MzIiLgorY29uc3QgY2hhciogRGVjbGFyZWRUeXBlTWV0aG9kTmFtZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSk7CisKKy8vIEdldCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBmaWVsZCdzIGRlZmF1bHQgdmFsdWUuCitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBDb252ZXJ0IGEgZmlsZSBuYW1lIGludG8gYSB2YWxpZCBpZGVudGlmaWVyLgorc3RyaW5nIEZpbGVuYW1lSWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKKworLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBBZGREZXNjcmlwdG9ycygpIGZ1bmN0aW9uIGZvciBhIGdpdmVuIGZpbGUuCitzdHJpbmcgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworCisvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEFzc2lnbkRlc2NyaXB0b3JzKCkgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZmlsZS4KK3N0cmluZyBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgU2h1dGRvd25GaWxlKCkgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZmlsZS4KK3N0cmluZyBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworCisvLyBFc2NhcGUgQysrIHRyaWdyYXBocyBieSBlc2NhcGluZyBxdWVzdGlvbiBtYXJrcyB0byBcPworc3RyaW5nIEVzY2FwZVRyaWdyYXBocyhjb25zdCBzdHJpbmcmIHRvX2VzY2FwZSk7CisKKy8vIERvIG1lc3NhZ2UgY2xhc3NlcyBpbiB0aGlzIGZpbGUga2VlcCB0cmFjayBvZiB1bmtub3duIGZpZWxkcz8KK2lubGluZSBib29sIEhhc1Vua25vd25GaWVsZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQorCisKKy8vIERvZXMgdGhpcyBmaWxlIGhhdmUgYW55IGVudW0gdHlwZSBkZWZpbml0aW9ucz8KK2Jvb2wgSGFzRW51bURlZmluaXRpb25zKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gRG9lcyB0aGlzIGZpbGUgaGF2ZSBnZW5lcmF0ZWQgcGFyc2luZywgc2VyaWFsaXphdGlvbiwgYW5kIG90aGVyCisvLyBzdGFuZGFyZCBtZXRob2RzIGZvciB3aGljaCByZWZsZWN0aW9uLWJhc2VkIGZhbGxiYWNrIGltcGxlbWVudGF0aW9ucyBleGlzdD8KK2lubGluZSBib29sIEhhc0dlbmVyYXRlZE1ldGhvZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6Q09ERV9TSVpFOworfQorCisvLyBEbyBtZXNzYWdlIGNsYXNzZXMgaW4gdGhpcyBmaWxlIGhhdmUgZGVzY3JpcHRvciBhbmQgcmVmbGVjdGlvbiBtZXRob2RzPworaW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQorCisvLyBTaG91bGQgd2UgZ2VuZXJhdGUgZ2VuZXJpYyBzZXJ2aWNlcyBmb3IgdGhpcyBmaWxlPworaW5saW5lIGJvb2wgSGFzR2VuZXJpY1NlcnZpY2VzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHJldHVybiBmaWxlLT5zZXJ2aWNlX2NvdW50KCkgPiAwICYmCisgICAgICAgICBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgICAgZmlsZS0+b3B0aW9ucygpLmNjX2dlbmVyaWNfc2VydmljZXMoKTsKK30KKworLy8gU2hvdWxkIHN0cmluZyBmaWVsZHMgaW4gdGhpcyBmaWxlIHZlcmlmeSB0aGF0IHRoZWlyIGNvbnRlbnRzIGFyZSBVVEYtOD8KK2lubGluZSBib29sIEhhc1V0ZjhWZXJpZmljYXRpb24oY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQorCisvLyBTaG91bGQgd2UgZ2VuZXJhdGUgYSBzZXBhcmF0ZSwgc3VwZXItb3B0aW1pemVkIGNvZGUgcGF0aCBmb3Igc2VyaWFsaXppbmcgdG8KKy8vIGZsYXQgYXJyYXlzPyAgV2UgZG9uJ3QgZG8gdGhpcyBpbiBMaXRlIG1vZGUgYmVjYXVzZSB3ZSdkIHJhdGhlciByZWR1Y2UgY29kZQorLy8gc2l6ZS4KK2lubGluZSBib29sIEhhc0Zhc3RBcnJheVNlcmlhbGl6YXRpb24oY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSA9PSBGaWxlT3B0aW9uczo6U1BFRUQ7Cit9CisKKy8vIFJldHVybnMgd2hldGhlciB3ZSBoYXZlIHRvIGdlbmVyYXRlIGNvZGUgd2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorYm9vbCBTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCisvLyBQcmludHMgJ3dpdGhfc3RhdGljX2luaXQnIGlmIHN0YXRpYyBpbml0aWFsaXplcnMgaGF2ZSB0byBiZSB1c2VkIGZvciB0aGUKKy8vIHByb3ZpZGVkIGZpbGUuIE90aGVyd2lzZSBlbWl0cyBib3RoICd3aXRoX3N0YXRpY19pbml0JyBhbmQKKy8vICd3aXRob3V0X3N0YXRpY19pbml0JyB1c2luZyAjaWZkZWYuCit2b2lkIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgY29uc3QgY2hhciogd2l0aF9zdGF0aWNfaW5pdCwgY29uc3QgY2hhciogd2l0aG91dF9zdGF0aWNfaW5pdCwKKyAgICBjb25zdCBjaGFyKiB2YXIxID0gTlVMTCwgY29uc3Qgc3RyaW5nJiB2YWwxID0gIiIsCisgICAgY29uc3QgY2hhciogdmFyMiA9IE5VTEwsIGNvbnN0IHN0cmluZyYgdmFsMiA9ICIiKTsKKwordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsCisgICAgY29uc3QgY2hhciogd2l0aG91dF9zdGF0aWNfaW5pdCk7CisKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0hFTFBFUlNfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE0ZjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYwpAQCAtMCwwICsxLDIwMjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgUHJpbnRGaWVsZENvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gUHJpbnQgdGhlIGZpZWxkJ3MgcHJvdG8tc3ludGF4IGRlZmluaXRpb24gYXMgYSBjb21tZW50LiAgV2UgZG9uJ3Qgd2FudCB0bworICAvLyBwcmludCBncm91cCBib2RpZXMgc28gd2UgY3V0IG9mZiBhZnRlciB0aGUgZmlyc3QgbGluZS4KKyAgc3RyaW5nIGRlZiA9IGZpZWxkLT5EZWJ1Z1N0cmluZygpOworICBwcmludGVyLT5QcmludCgiLy8gJGRlZiRcbiIsCisgICAgImRlZiIsIGRlZi5zdWJzdHIoMCwgZGVmLmZpbmRfZmlyc3Rfb2YoJ1xuJykpKTsKK30KKworc3RydWN0IEZpZWxkT3JkZXJpbmdCeU51bWJlciB7CisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYikgY29uc3QgeworICAgIHJldHVybiBhLT5udW1iZXIoKSA8IGItPm51bWJlcigpOworICB9Cit9OworCitjb25zdCBjaGFyKiBrV2lyZVR5cGVOYW1lc1tdID0geworICAiVkFSSU5UIiwKKyAgIkZJWEVENjQiLAorICAiTEVOR1RIX0RFTElNSVRFRCIsCisgICJTVEFSVF9HUk9VUCIsCisgICJFTkRfR1JPVVAiLAorICAiRklYRUQzMiIsCit9OworCisvLyBTb3J0IHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIERlc2NyaXB0b3IgYnkgbnVtYmVyIGludG8gYSBuZXdbXSdkIGFycmF5CisvLyBhbmQgcmV0dXJuIGl0LgorY29uc3QgRmllbGREZXNjcmlwdG9yKiogU29ydEZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzID0KKyAgICBuZXcgY29uc3QgRmllbGREZXNjcmlwdG9yKltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgfQorICBzb3J0KGZpZWxkcywgZmllbGRzICsgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSwKKyAgICAgICBGaWVsZE9yZGVyaW5nQnlOdW1iZXIoKSk7CisgIHJldHVybiBmaWVsZHM7Cit9CisKKy8vIEZ1bmN0b3IgZm9yIHNvcnRpbmcgZXh0ZW5zaW9uIHJhbmdlcyBieSB0aGVpciAic3RhcnQiIGZpZWxkIG51bWJlci4KK3N0cnVjdCBFeHRlbnNpb25SYW5nZVNvcnRlciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByaWdodCkgY29uc3QgeworICAgIHJldHVybiBsZWZ0LT5zdGFydCA8IHJpZ2h0LT5zdGFydDsKKyAgfQorfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSAicmVxdWlyZWQiIHJlc3RyaWN0aW9uIGNoZWNrIHNob3VsZCBiZSBpZ25vcmVkIGZvciB0aGUKKy8vIGdpdmVuIGZpZWxkLgoraW5saW5lIHN0YXRpYyBib29sIFNob3VsZElnbm9yZVJlcXVpcmVkRmllbGRDaGVjaygKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIHR5cGUgaGFzIGFueSByZXF1aXJlZCBmaWVsZHMuICBJZiBpdCBkb2Vzbid0LAorLy8gd2UgY2FuIG9wdGltaXplIG91dCBjYWxscyB0byBpdHMgSXNJbml0aWFsaXplZCgpIG1ldGhvZC4KKy8vCisvLyBhbHJlYWR5X3NlZW4gaXMgdXNlZCB0byBhdm9pZCBjaGVja2luZyB0aGUgc2FtZSB0eXBlIG11bHRpcGxlIHRpbWVzCisvLyAoYW5kIGFsc28gdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2lvbikuCitzdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlLAorICAgIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiogYWxyZWFkeV9zZWVuKSB7CisgIGlmIChhbHJlYWR5X3NlZW4tPmNvdW50KHR5cGUpID4gMCkgeworICAgIC8vIFNpbmNlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgcmVxdWlyZWQgZmllbGQgY2F1c2VzIHRoZSB3aG9sZQorICAgIC8vIGZ1bmN0aW9uIHRvIHJldHVybiB0cnVlLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaWYgdGhlIHR5cGUgaXMgYWxyZWFkeQorICAgIC8vIGluIHRoZSBjYWNoZSBpdCBkaWRuJ3QgaGF2ZSBhbnkgcmVxdWlyZWQgZmllbGRzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBhbHJlYWR5X3NlZW4tPmluc2VydCh0eXBlKTsKKworICAvLyBJZiB0aGUgdHlwZSBoYXMgZXh0ZW5zaW9ucywgYW4gZXh0ZW5zaW9uIHdpdGggbWVzc2FnZSB0eXBlIGNvdWxkIGNvbnRhaW4KKyAgLy8gcmVxdWlyZWQgZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGJlIGNvbnNlcnZhdGl2ZSBhbmQgYXNzdW1lIHN1Y2ggYW4KKyAgLy8gZXh0ZW5zaW9uIGV4aXN0cy4KKyAgaWYgKHR5cGUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gdHlwZS0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAgICFTaG91bGRJZ25vcmVSZXF1aXJlZEZpZWxkQ2hlY2soZmllbGQpKSB7CisgICAgICBpZiAoSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBhbHJlYWR5X3NlZW4pKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgeworICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4gYWxyZWFkeV9zZWVuOworICByZXR1cm4gSGFzUmVxdWlyZWRGaWVsZHModHlwZSwgJmFscmVhZHlfc2Vlbik7Cit9CisKKy8vIFRoaXMgcmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgY29tcGlsZXIncyBhbGlnbm1lbnQgZm9yIHRoZSBmaWVsZC4gIFRoaXMKKy8vIGNhbid0IGd1YXJhbnRlZSB0byBiZSBjb3JyZWN0IGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBjb2RlIGNvdWxkIGJlIGNvbXBpbGVkIG9uCisvLyBkaWZmZXJlbnQgc3lzdGVtcyB3aXRoIGRpZmZlcmVudCBhbGlnbm1lbnQgcnVsZXMuICBUaGUgZXN0aW1hdGVzIGJlbG93IGFzc3VtZQorLy8gNjQtYml0IHBvaW50ZXJzLgoraW50IEVzdGltYXRlQWxpZ25tZW50U2l6ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChmaWVsZCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSByZXR1cm4gODsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIDQ7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIDg7CisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAtMTsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCit9CisKKy8vIEZpZWxkR3JvdXAgaXMganVzdCBhIGhlbHBlciBmb3IgT3B0aW1pemVQYWRkaW5nIGJlbG93LiAgSXQgaG9sZHMgYSB2ZWN0b3Igb2YKKy8vIGZpZWxkcyB0aGF0IGFyZSBncm91cGVkIHRvZ2V0aGVyIGJlY2F1c2UgdGhleSBoYXZlIGNvbXBhdGlibGUgYWxpZ25tZW50LCBhbmQKKy8vIGEgcHJlZmVycmVkIGxvY2F0aW9uIGluIHRoZSBmaW5hbCBmaWVsZCBvcmRlcmluZy4KK2NsYXNzIEZpZWxkR3JvdXAgeworIHB1YmxpYzoKKyAgRmllbGRHcm91cCgpCisgICAgICA6IHByZWZlcnJlZF9sb2NhdGlvbl8oMCkge30KKworICAvLyBBIGdyb3VwIHdpdGggYSBzaW5nbGUgZmllbGQuCisgIEZpZWxkR3JvdXAoZmxvYXQgcHJlZmVycmVkX2xvY2F0aW9uLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKQorICAgICAgOiBwcmVmZXJyZWRfbG9jYXRpb25fKHByZWZlcnJlZF9sb2NhdGlvbiksCisgICAgICAgIGZpZWxkc18oMSwgZmllbGQpIHt9CisKKyAgLy8gQXBwZW5kIHRoZSBmaWVsZHMgaW4gJ290aGVyJyB0byB0aGlzIGdyb3VwLgorICB2b2lkIEFwcGVuZChjb25zdCBGaWVsZEdyb3VwJiBvdGhlcikgeworICAgIGlmIChvdGhlci5maWVsZHNfLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gUHJlZmVycmVkIGxvY2F0aW9uIGlzIHRoZSBhdmVyYWdlIGFtb25nIGFsbCB0aGUgZmllbGRzLCBzbyB3ZSB3ZWlnaHQgYnkKKyAgICAvLyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvbiBlYWNoIEZpZWxkR3JvdXAgb2JqZWN0LgorICAgIHByZWZlcnJlZF9sb2NhdGlvbl8gPQorICAgICAgICAocHJlZmVycmVkX2xvY2F0aW9uXyAqIGZpZWxkc18uc2l6ZSgpICsKKyAgICAgICAgIChvdGhlci5wcmVmZXJyZWRfbG9jYXRpb25fICogb3RoZXIuZmllbGRzXy5zaXplKCkpKSAvCisgICAgICAgIChmaWVsZHNfLnNpemUoKSArIG90aGVyLmZpZWxkc18uc2l6ZSgpKTsKKyAgICBmaWVsZHNfLmluc2VydChmaWVsZHNfLmVuZCgpLCBvdGhlci5maWVsZHNfLmJlZ2luKCksIG90aGVyLmZpZWxkc18uZW5kKCkpOworICB9CisKKyAgdm9pZCBTZXRQcmVmZXJyZWRMb2NhdGlvbihmbG9hdCBsb2NhdGlvbikgeyBwcmVmZXJyZWRfbG9jYXRpb25fID0gbG9jYXRpb247IH0KKyAgY29uc3QgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMoKSBjb25zdCB7IHJldHVybiBmaWVsZHNfOyB9CisKKyAgLy8gRmllbGRHcm91cCBvYmplY3RzIHNvcnQgYnkgdGhlaXIgcHJlZmVycmVkIGxvY2F0aW9uLgorICBib29sIG9wZXJhdG9yPChjb25zdCBGaWVsZEdyb3VwJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiBwcmVmZXJyZWRfbG9jYXRpb25fIDwgb3RoZXIucHJlZmVycmVkX2xvY2F0aW9uXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gInByZWZlcnJlZF9sb2NhdGlvbl8iIGlzIGFuIGVzdGltYXRlIG9mIHdoZXJlIHRoaXMgZ3JvdXAgc2hvdWxkIGdvIGluIHRoZQorICAvLyBmaW5hbCBsaXN0IG9mIGZpZWxkcy4gIFdlIGNvbXB1dGUgdGhpcyBieSB0YWtpbmcgdGhlIGF2ZXJhZ2UgaW5kZXggb2YgZWFjaAorICAvLyBmaWVsZCBpbiB0aGlzIGdyb3VwIGluIHRoZSBvcmlnaW5hbCBvcmRlcmluZyBvZiBmaWVsZHMuICBUaGlzIGlzIHZlcnkKKyAgLy8gYXBwcm94aW1hdGUsIGJ1dCBzaG91bGQgcHV0IHRoaXMgZ3JvdXAgY2xvc2UgdG8gd2hlcmUgaXRzIG1lbWJlciBmaWVsZHMKKyAgLy8gb3JpZ2luYWxseSB3ZW50LgorICBmbG9hdCBwcmVmZXJyZWRfbG9jYXRpb25fOworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzXzsKKyAgLy8gV2UgcmVseSBvbiB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0gc28gdGhpcyB0eXBlIGNhbiBiZQorICAvLyB1c2VkIGluIGEgdmVjdG9yLgorfTsKKworLy8gUmVvcmRlciAnZmllbGRzJyBzbyB0aGF0IGlmIHRoZSBmaWVsZHMgYXJlIG91dHB1dCBpbnRvIGEgYysrIGNsYXNzIGluIHRoZSBuZXcKKy8vIG9yZGVyLCB0aGUgYWxpZ25tZW50IHBhZGRpbmcgaXMgbWluaW1pemVkLiAgV2UgdHJ5IHRvIGRvIHRoaXMgd2hpbGUga2VlcGluZworLy8gZWFjaCBmaWVsZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24gc28gdGhhdCB3ZSBkb24ndAorLy8gcmVkdWNlIGNhY2hlIGxvY2FsaXR5IG11Y2ggZm9yIGZ1bmN0aW9uIHRoYXQgYWNjZXNzIGVhY2ggZmllbGQgaW4gb3JkZXIuCit2b2lkIE9wdGltaXplUGFkZGluZyh2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIGZpZWxkcykgeworICAvLyBGaXJzdCBkaXZpZGUgZmllbGRzIGludG8gdGhvc2UgdGhhdCBhbGlnbiB0byAxIGJ5dGUsIDQgYnl0ZXMgb3IgOCBieXRlcy4KKyAgdmVjdG9yPEZpZWxkR3JvdXA+IGFsaWduZWRfdG9fMSwgYWxpZ25lZF90b180LCBhbGlnbmVkX3RvXzg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLT5zaXplKCk7ICsraSkgeworICAgIHN3aXRjaCAoRXN0aW1hdGVBbGlnbm1lbnRTaXplKCgqZmllbGRzKVtpXSkpIHsKKyAgICAgIGNhc2UgMTogYWxpZ25lZF90b18xLnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKKyAgICAgIGNhc2UgNDogYWxpZ25lZF90b180LnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKKyAgICAgIGNhc2UgODogYWxpZ25lZF90b184LnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmtub3duIGFsaWdubWVudCBzaXplLiI7CisgICAgfQorICB9CisKKyAgLy8gTm93IGdyb3VwIGZpZWxkcyBhbGlnbmVkIHRvIDEgYnl0ZSBpbnRvIHNldHMgb2YgNCwgYW5kIHRyZWF0IHRob3NlIGxpa2UgYQorICAvLyBzaW5nbGUgZmllbGQgYWxpZ25lZCB0byA0IGJ5dGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWduZWRfdG9fMS5zaXplKCk7IGkgKz0gNCkgeworICAgIEZpZWxkR3JvdXAgZmllbGRfZ3JvdXA7CisgICAgZm9yIChpbnQgaiA9IGk7IGogPCBhbGlnbmVkX3RvXzEuc2l6ZSgpICYmIGogPCBpICsgNDsgKytqKSB7CisgICAgICBmaWVsZF9ncm91cC5BcHBlbmQoYWxpZ25lZF90b18xW2pdKTsKKyAgICB9CisgICAgYWxpZ25lZF90b180LnB1c2hfYmFjayhmaWVsZF9ncm91cCk7CisgIH0KKyAgLy8gU29ydCBieSBwcmVmZXJyZWQgbG9jYXRpb24gdG8ga2VlcCBmaWVsZHMgYXMgY2xvc2UgdG8gdGhlaXIgb3JpZ2luYWwKKyAgLy8gbG9jYXRpb24gYXMgcG9zc2libGUuCisgIHNvcnQoYWxpZ25lZF90b180LmJlZ2luKCksIGFsaWduZWRfdG9fNC5lbmQoKSk7CisKKyAgLy8gTm93IGdyb3VwIGZpZWxkcyBhbGlnbmVkIHRvIDQgYnl0ZXMgKG9yIHRoZSA0LWZpZWxkIGdyb3VwcyBjcmVhdGVkIGFib3ZlKQorICAvLyBpbnRvIHBhaXJzLCBhbmQgdHJlYXQgdGhvc2UgbGlrZSBhIHNpbmdsZSBmaWVsZCBhbGlnbmVkIHRvIDggYnl0ZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpZ25lZF90b180LnNpemUoKTsgaSArPSAyKSB7CisgICAgRmllbGRHcm91cCBmaWVsZF9ncm91cDsKKyAgICBmb3IgKGludCBqID0gaTsgaiA8IGFsaWduZWRfdG9fNC5zaXplKCkgJiYgaiA8IGkgKyAyOyArK2opIHsKKyAgICAgIGZpZWxkX2dyb3VwLkFwcGVuZChhbGlnbmVkX3RvXzRbal0pOworICAgIH0KKyAgICBpZiAoaSA9PSBhbGlnbmVkX3RvXzQuc2l6ZSgpIC0gMSkgeworICAgICAgLy8gTW92ZSBpbmNvbXBsZXRlIDQtYnl0ZSBibG9jayB0byB0aGUgZW5kLgorICAgICAgZmllbGRfZ3JvdXAuU2V0UHJlZmVycmVkTG9jYXRpb24oZmllbGRzLT5zaXplKCkgKyAxKTsKKyAgICB9CisgICAgYWxpZ25lZF90b184LnB1c2hfYmFjayhmaWVsZF9ncm91cCk7CisgIH0KKyAgLy8gU29ydCBieSBwcmVmZXJyZWQgbG9jYXRpb24gdG8ga2VlcCBmaWVsZHMgYXMgY2xvc2UgdG8gdGhlaXIgb3JpZ2luYWwKKyAgLy8gbG9jYXRpb24gYXMgcG9zc2libGUuCisgIHNvcnQoYWxpZ25lZF90b184LmJlZ2luKCksIGFsaWduZWRfdG9fOC5lbmQoKSk7CisKKyAgLy8gTm93IHB1bGwgb3V0IGFsbCB0aGUgRmllbGREZXNjcmlwdG9ycyBpbiBvcmRlci4KKyAgZmllbGRzLT5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWduZWRfdG9fOC5zaXplKCk7ICsraSkgeworICAgIGZpZWxkcy0+aW5zZXJ0KGZpZWxkcy0+ZW5kKCksCisgICAgICAgICAgICAgICAgICAgYWxpZ25lZF90b184W2ldLmZpZWxkcygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgYWxpZ25lZF90b184W2ldLmZpZWxkcygpLmVuZCgpKTsKKyAgfQorfQorCit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZUdlbmVyYXRvcjo6TWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgIGNsYXNzbmFtZV8oQ2xhc3NOYW1lKGRlc2NyaXB0b3IsIGZhbHNlKSksCisgICAgb3B0aW9uc18ob3B0aW9ucyksCisgICAgZmllbGRfZ2VuZXJhdG9yc18oZGVzY3JpcHRvciwgb3B0aW9ucyksCisgICAgbmVzdGVkX2dlbmVyYXRvcnNfKG5ldyBzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+WworICAgICAgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKV0pLAorICAgIGVudW1fZ2VuZXJhdG9yc18obmV3IHNjb3BlZF9wdHI8RW51bUdlbmVyYXRvcj5bCisgICAgICBkZXNjcmlwdG9yLT5lbnVtX3R5cGVfY291bnQoKV0pLAorICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzXyhuZXcgc2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+WworICAgICAgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCldKSB7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0ucmVzZXQoCisgICAgICBuZXcgTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpKSwgb3B0aW9ucykpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKKyAgICAgIG5ldyBFbnVtR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmVudW1fdHlwZShpKSwgb3B0aW9ucykpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAorICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihkZXNjcmlwdG9yLT5leHRlbnNpb24oaSksIG9wdGlvbnMpKTsKKyAgfQorfQorCitNZXNzYWdlR2VuZXJhdG9yOjp+TWVzc2FnZUdlbmVyYXRvcigpIHt9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgiY2xhc3MgJGNsYXNzbmFtZSQ7XG4iLAorICAgICAgICAgICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVFbnVtRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlZmluaXRpb24ocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhmaWVsZCwgJnZhcnMsIG9wdGlvbnNfKTsKKyAgICB2YXJzWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShmaWVsZCk7CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsICJpbmxpbmUgaW50ICRuYW1lJF9zaXplKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsICJpbmxpbmUgYm9vbCBoYXNfJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQodmFycywgImlubGluZSB2b2lkIGNsZWFyXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsICJzdGF0aWMgY29uc3QgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIik7CisKKyAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29yIGRlY2xhcmF0aW9ucy4KKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7CisKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgLy8gR2VuZXJhdGUgYWNjZXNzb3JzIGZvciBleHRlbnNpb25zLiAgV2UganVzdCBjYWxsIGEgbWFjcm8gbG9jYXRlZCBpbgorICAgIC8vIGV4dGVuc2lvbl9zZXQuaCBzaW5jZSB0aGUgYWNjZXNzb3JzIGFib3V0IDgwIGxpbmVzIG9mIHN0YXRpYyBjb2RlLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIkdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKCRjbGFzc25hbWUkKVxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoIi8vICRjbGFzc25hbWUkXG5cbiIsICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOworCisgICAgLy8gR2VuZXJhdGUgaGFzXyRuYW1lJCgpIG9yICRuYW1lJF9zaXplKCkuCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiaW5saW5lIGludCAkY2xhc3NuYW1lJDo6JG5hbWUkX3NpemUoKSBjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTaW5ndWxhciBmaWVsZC4KKyAgICAgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgICAgIHZhcnNbImhhc19hcnJheV9pbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSAvIDMyKTsKKyAgICAgIHZhcnNbImhhc19tYXNrIl0gPSBGYXN0SGV4MzJUb0J1ZmZlcigxdSA8PCAoZmllbGQtPmluZGV4KCkgJSAzMiksIGJ1ZmZlcik7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSQ6Omhhc18kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiAoX2hhc19iaXRzX1skaGFzX2FycmF5X2luZGV4JF0gJiAweCRoYXNfbWFzayR1KSAhPSAwO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9oYXNfJG5hbWUkKCkge1xuIgorICAgICAgICAiICBfaGFzX2JpdHNfWyRoYXNfYXJyYXlfaW5kZXgkXSB8PSAweCRoYXNfbWFzayR1O1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyX2hhc18kbmFtZSQoKSB7XG4iCisgICAgICAgICIgIF9oYXNfYml0c19bJGhhc19hcnJheV9pbmRleCRdICY9IH4weCRoYXNfbWFzayR1O1xuIgorICAgICAgICAifVxuIgorICAgICAgICApOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGNsZWFyXyRuYW1lJCgpCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6Y2xlYXJfJG5hbWUkKCkge1xuIik7CisKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAiICBjbGVhcl9oYXNfJG5hbWUkKCk7XG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisKKyAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29ycy4KKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKKworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsYXNzRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOworICB2YXJzWyJmaWVsZF9jb3VudCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSk7CisgIGlmIChvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpKSB7CisgICAgdmFyc1siZGxsZXhwb3J0Il0gPSAiIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJkbGxleHBvcnQiXSA9IG9wdGlvbnNfLmRsbGV4cG9ydF9kZWNsICsgIiAiOworICB9CisgIHZhcnNbInN1cGVyY2xhc3MiXSA9IFN1cGVyQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKTsKKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICJjbGFzcyAkZGxsZXhwb3J0JCRjbGFzc25hbWUkIDogcHVibGljICRzdXBlcmNsYXNzJCB7XG4iCisgICAgIiBwdWJsaWM6XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiJGNsYXNzbmFtZSQoKTtcbiIKKyAgICAidmlydHVhbCB+JGNsYXNzbmFtZSQoKTtcbiIKKyAgICAiXG4iCisgICAgIiRjbGFzc25hbWUkKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKTtcbiIKKyAgICAiXG4iCisgICAgImlubGluZSAkY2xhc3NuYW1lJCYgb3BlcmF0b3I9KGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iCisgICAgIiAgQ29weUZyb20oZnJvbSk7XG4iCisgICAgIiAgcmV0dXJuICp0aGlzO1xuIgorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHtcbiIKKyAgICAgICIgIHJldHVybiAmX3Vua25vd25fZmllbGRzXztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIE9ubHkgZ2VuZXJhdGUgdGhpcyBtZW1iZXIgaWYgaXQncyBub3QgZGlzYWJsZWQuCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSAmJgorICAgICAgIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgInN0YXRpYyBjb25zdCAkY2xhc3NuYW1lJCYgZGVmYXVsdF9pbnN0YW5jZSgpO1xuIgorICAgICJcbiIpOworCisgIGlmICghU3RhdGljSW5pdGlhbGl6ZXJzRm9yY2VkKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUlxuIgorICAgICAgIi8vIFJldHVybnMgdGhlIGludGVybmFsIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBjYW5cbiIKKyAgICAgICIvLyByZXR1cm4gTlVMTCB0aHVzIHNob3VsZCBub3QgYmUgdXNlZCBieSB0aGUgdXNlci4gVGhpcyBpcyBpbnRlbmRlZFxuIgorICAgICAgIi8vIGZvciBQcm90b2J1ZiBpbnRlcm5hbCBjb2RlLiBQbGVhc2UgdXNlIGRlZmF1bHRfaW5zdGFuY2UoKSBkZWNsYXJlZFxuIgorICAgICAgIi8vIGFib3ZlIGluc3RlYWQuXG4iCisgICAgICAic3RhdGljIGlubGluZSBjb25zdCAkY2xhc3NuYW1lJCogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlXztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiI2VuZGlmXG4iCisgICAgICAiXG4iKTsKKyAgfQorCisKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAidm9pZCBTd2FwKCRjbGFzc25hbWUkKiBvdGhlcik7XG4iCisgICAgIlxuIgorICAgICIvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICJcbiIKKyAgICAiJGNsYXNzbmFtZSQqIE5ldygpIGNvbnN0O1xuIik7CisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICJ2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7XG4iCisgICAgICAgICJ2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICJ2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKTtcbiIpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAidm9pZCBDb3B5RnJvbShjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSk7XG4iCisgICAgICAidm9pZCBNZXJnZUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pO1xuIgorICAgICAgInZvaWQgQ2xlYXIoKTtcbiIKKyAgICAgICJib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDtcbiIKKyAgICAgICJcbiIKKyAgICAgICJpbnQgQnl0ZVNpemUoKSBjb25zdDtcbiIKKyAgICAgICJib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShcbiIKKyAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpO1xuIgorICAgICAgInZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDtcbiIpOworICAgIGlmIChIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDtcbiIpOworICAgIH0KKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgImludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfVxuIgorICAgICJwcml2YXRlOlxuIgorICAgICJ2b2lkIFNoYXJlZEN0b3IoKTtcbiIKKyAgICAidm9pZCBTaGFyZWREdG9yKCk7XG4iCisgICAgInZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7XG4iCisgICAgInB1YmxpYzpcbiIKKyAgICAiXG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7XG4iCisgICAgICAiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICIvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICJcbiIpOworCisgIC8vIEltcG9ydCBhbGwgbmVzdGVkIG1lc3NhZ2UgY2xhc3NlcyBpbnRvIHRoaXMgY2xhc3MncyBzY29wZSB3aXRoIHR5cGVkZWZzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZSA9IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKTsKKyAgICBwcmludGVyLT5QcmludCgidHlwZWRlZiAkbmVzdGVkX2Z1bGxfbmFtZSQgJG5lc3RlZF9uYW1lJDtcbiIsCisgICAgICAgICAgICAgICAgICAgIm5lc3RlZF9uYW1lIiwgbmVzdGVkX3R5cGUtPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAibmVzdGVkX2Z1bGxfbmFtZSIsIENsYXNzTmFtZShuZXN0ZWRfdHlwZSwgZmFsc2UpKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIC8vIEltcG9ydCBhbGwgbmVzdGVkIGVudW1zIGFuZCB0aGVpciB2YWx1ZXMgaW50byB0aGlzIGNsYXNzJ3Mgc2NvcGUgd2l0aAorICAvLyB0eXBlZGVmcyBhbmQgY29uc3RhbnRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTeW1ib2xJbXBvcnRzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgIlxuIik7CisKKyAgLy8gR2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcy4KKyAgR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zKHByaW50ZXIpOworCisgIC8vIERlY2xhcmUgZXh0ZW5zaW9uIGlkZW50aWZpZXJzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9uKHByaW50ZXIpOworICB9CisKKworICBwcmludGVyLT5QcmludCgKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKKyAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICAvLyBHZW5lcmF0ZSBwcml2YXRlIG1lbWJlcnMuCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIiBwcml2YXRlOlxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKCFkZXNjcmlwdG9yXy0+ZmllbGQoaSktPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaW5saW5lIHZvaWQgc2V0X2hhc18kbmFtZSQoKTtcbiIsCisgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGRlc2NyaXB0b3JfLT5maWVsZChpKSkpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpbmxpbmUgdm9pZCBjbGVhcl9oYXNfJG5hbWUkKCk7XG4iLAorICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgLy8gVG8gbWluaW1pemUgcGFkZGluZywgZGF0YSBtZW1iZXJzIGFyZSBkaXZpZGVkIGludG8gdGhyZWUgc2VjdGlvbnM6CisgIC8vICgxKSBtZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gOCBieXRlcworICAvLyAoMikgbWVtYmVycyBjb3JyZXNwb25kaW5nIHRvIG1lc3NhZ2UgZmllbGRzLCByZS1vcmRlcmVkIHRvIG9wdGltaXplCisgIC8vICAgICBhbGlnbm1lbnQuCisgIC8vICgzKSBtZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gNCBieXRlcy4KKworICAvLyBNZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gOCBieXRlczoKKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXztcbiIKKyAgICAgICJcbiIpOworICB9CisKKyAgLy8gRmllbGQgbWVtYmVyczoKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHMucHVzaF9iYWNrKGRlc2NyaXB0b3JfLT5maWVsZChpKSk7CisgIH0KKyAgT3B0aW1pemVQYWRkaW5nKCZmaWVsZHMpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZHNbaV0pLkdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMocHJpbnRlcik7CisgIH0KKworICAvLyBNZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gNCBieXRlczoKKworICAvLyBUT0RPKGtlbnRvbik6ICBNYWtlIF9jYWNoZWRfc2l6ZV8gYW4gYXRvbWljPGludD4gd2hlbiBDKysgc3VwcG9ydHMgaXQuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIlxuIgorICAgICAgIm11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87XG4iKTsKKworICAvLyBHZW5lcmF0ZSBfaGFzX2JpdHNfLgorICBpZiAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygkZmllbGRfY291bnQkICsgMzEpIC8gMzJdO1xuIgorICAgICAgIlxuIik7CisgIH0gZWxzZSB7CisgICAgLy8gWmVyby1zaXplIGFycmF5cyBhcmVuJ3QgdGVjaG5pY2FsbHkgYWxsb3dlZCwgYW5kIE1TVkMgaW4gcGFydGljdWxhcgorICAgIC8vIGRvZXNuJ3QgbGlrZSB0aGVtLiAgV2Ugc3RpbGwgbmVlZCB0byBkZWNsYXJlIHRoZXNlIGFycmF5cyB0byBtYWtlCisgICAgLy8gb3RoZXIgY29kZSBjb21waWxlLiAgU2luY2UgdGhpcyBpcyBhbiB1bmNvbW1vbiBjYXNlLCB3ZSdsbCBqdXN0IGRlY2xhcmUKKyAgICAvLyB0aGVtIHdpdGggc2l6ZSAxIGFuZCB3YXN0ZSBzb21lIHNwYWNlLiAgT2ggd2VsbC4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdO1xuIgorICAgICAgIlxuIik7CisgIH0KKworICAvLyBEZWNsYXJlIEFkZERlc2NyaXB0b3JzKCksIEJ1aWxkRGVzY3JpcHRvcnMoKSwgYW5kIFNodXRkb3duRmlsZSgpIGFzCisgIC8vIGZyaWVuZHMgc28gdGhhdCB0aGV5IGNhbiBhY2Nlc3MgcHJpdmF0ZSBzdGF0aWMgdmFyaWFibGVzIGxpa2UKKyAgLy8gZGVmYXVsdF9pbnN0YW5jZV8gYW5kIHJlZmxlY3Rpb25fLgorICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgImZyaWVuZCB2b2lkICRkbGxleHBvcnRfZGVjbCQgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIsCisgICAgLy8gV2l0aG91dC4KKyAgICAiZnJpZW5kIHZvaWQgJGRsbGV4cG9ydF9kZWNsJCAkYWRkZGVzY3JpcHRvcnNuYW1lJF9pbXBsKCk7XG4iLAorICAgIC8vIFZhcnMuCisgICAgImRsbGV4cG9ydF9kZWNsIiwgb3B0aW9uc18uZGxsZXhwb3J0X2RlY2wsCisgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsCisgICAgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJmcmllbmQgdm9pZCAkYXNzaWduZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgorICAgICJmcmllbmQgdm9pZCAkc2h1dGRvd25maWxlbmFtZSQoKTtcbiIKKyAgICAiXG4iLAorICAgICJhc3NpZ25kZXNjcmlwdG9yc25hbWUiLAorICAgICAgR2xvYmFsQXNzaWduRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSksCisgICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJ2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpO1xuIgorICAgICJzdGF0aWMgJGNsYXNzbmFtZSQqIGRlZmF1bHRfaW5zdGFuY2VfO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCh2YXJzLCAifTsiKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW5saW5lTWV0aG9kcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRGVzY3JpcHRvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiAkbmFtZSRfZGVzY3JpcHRvcl8gPSBOVUxMO1xuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbipcbiIKKyAgICAiICAkbmFtZSRfcmVmbGVjdGlvbl8gPSBOVUxMO1xuIiwKKyAgICAibmFtZSIsIGNsYXNzbmFtZV8pOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9yRGVjbGFyYXRpb25zKHByaW50ZXIpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iLAorICAgICAgIm5hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZShpKSwgZmFsc2UpKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCBpbmRleCkgeworICAvLyBUT0RPKGtlbnRvbik6ICBQYXNzaW5nIHRoZSBpbmRleCB0byB0aGlzIG1ldGhvZCBpcyByZWR1bmRhbnQ7IGp1c3QgdXNlCisgIC8vICAgZGVzY3JpcHRvcl8tPmluZGV4KCkgaW5zdGVhZC4KKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJjbGFzc25hbWUiXSA9IGNsYXNzbmFtZV87CisgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGluZGV4KTsKKworICAvLyBPYnRhaW4gdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUgcGFyZW50J3MgZGVzY3JpcHRvci4KKyAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgkaW5kZXgkKTtcbiIpOworICB9IGVsc2UgeworICAgIHZhcnNbInBhcmVudCJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwgZmFsc2UpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8gPSAiCisgICAgICAgICIkcGFyZW50JF9kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoJGluZGV4JCk7XG4iKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBvZmZzZXRzLgorICBHZW5lcmF0ZU9mZnNldHMocHJpbnRlcik7CisKKyAgLy8gQ29uc3RydWN0IHRoZSByZWZsZWN0aW9uIG9iamVjdC4KKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiJGNsYXNzbmFtZSRfcmVmbGVjdGlvbl8gPVxuIgorICAgICIgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbihcbiIKKyAgICAiICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfLFxuIgorICAgICIgICAgJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfLFxuIgorICAgICIgICAgJGNsYXNzbmFtZSRfb2Zmc2V0c18sXG4iCisgICAgIiAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCRjbGFzc25hbWUkLCBfaGFzX2JpdHNfWzBdKSxcbiIKKyAgICAiICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoIgorICAgICAgIiRjbGFzc25hbWUkLCBfdW5rbm93bl9maWVsZHNfKSxcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoIgorICAgICAgICAiJGNsYXNzbmFtZSQsIF9leHRlbnNpb25zXyksXG4iKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBObyBleHRlbnNpb25zLgorICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiICAgIC0xLFxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLFxuIik7CisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLFxuIik7CisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIiAgICBzaXplb2YoJGNsYXNzbmFtZSQpKTtcbiIpOworCisgIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIocHJpbnRlciwgaSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIocHJpbnRlciwgaSk7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlVHlwZVJlZ2lzdHJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gUmVnaXN0ZXIgdGhpcyBtZXNzYWdlIHR5cGUgd2l0aCB0aGUgbWVzc2FnZSBmYWN0b3J5LgorICBwcmludGVyLT5QcmludCgKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoXG4iCisgICAgIiAgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8sICYkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVUeXBlUmVnaXN0cmF0aW9ucyhwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gQ29uc3RydWN0IHRoZSBkZWZhdWx0IGluc3RhbmNlcyBvZiBhbGwgZmllbGRzLCBhcyB0aGV5IHdpbGwgYmUgdXNlZAorICAvLyB3aGVuIGNyZWF0aW5nIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBlbnRpcmUgbWVzc2FnZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUFsbG9jYXRvcihwcmludGVyKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdCB0aGUgZGVmYXVsdCBpbnN0YW5jZS4gIFdlIGNhbid0IGNhbGwgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeWV0CisgIC8vIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUgYWxsIGRlZmF1bHQgaW5zdGFuY2VzIHRoYXQgdGhpcyBvbmUgbWlnaHQKKyAgLy8gZGVwZW5kIG9uIGFyZSBjb25zdHJ1Y3RlZCBmaXJzdC4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiRjbGFzc25hbWUkOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyAkY2xhc3NuYW1lJCgpO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgLy8gSGFuZGxlIG5lc3RlZCB0eXBlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUFsbG9jYXRvcihwcmludGVyKTsKKyAgfQorCit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICIkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgLy8gUmVnaXN0ZXIgZXh0ZW5zaW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVSZWdpc3RyYXRpb24ocHJpbnRlcik7CisgIH0KKworICAvLyBIYW5kbGUgbmVzdGVkIHR5cGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmYXVsdEluc3RhbmNlSW5pdGlhbGl6ZXIocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2h1dGRvd25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJkZWxldGUgJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZGVsZXRlICRjbGFzc25hbWUkX3JlZmxlY3Rpb25fO1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgfQorCisgIC8vIEhhbmRsZSBkZWZhdWx0IGluc3RhbmNlcyBvZiBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVTaHV0ZG93bkNvZGUocHJpbnRlcik7CisgIH0KKworICAvLyBIYW5kbGUgbmVzdGVkIHR5cGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlU2h1dGRvd25Db2RlKHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsYXNzTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVNZXRob2RzKHByaW50ZXIpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUNsYXNzTWV0aG9kcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBub24taW5saW5lIGZpZWxkIGRlZmluaXRpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGZpZWxkIG51bWJlciBjb25zdGFudHMuCisgIHByaW50ZXItPlByaW50KCIjaWZuZGVmIF9NU0NfVkVSXG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjb25zdCBpbnQgJGNsYXNzbmFtZSQ6OiRjb25zdGFudF9uYW1lJDtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKEZpZWxkU2NvcGUoZmllbGQpLCBmYWxzZSksCisgICAgICAiY29uc3RhbnRfbmFtZSIsIEZpZWxkQ29uc3RhbnROYW1lKGZpZWxkKSk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiNlbmRpZiAgLy8gIV9NU0NfVkVSXG4iCisgICAgIlxuIik7CisKKyAgLy8gRGVmaW5lIGV4dGVuc2lvbiBpZGVudGlmaWVycy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZpbml0aW9uKHByaW50ZXIpOworICB9CisKKyAgR2VuZXJhdGVTdHJ1Y3RvcnMocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgR2VuZXJhdGVDbGVhcihwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAgIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0ocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgICBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAgIGlmIChIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisKKyAgICBHZW5lcmF0ZUJ5dGVTaXplKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgICAgR2VuZXJhdGVNZXJnZUZyb20ocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgICBHZW5lcmF0ZUNvcHlGcm9tKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgICAgR2VuZXJhdGVJc0luaXRpYWxpemVkKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgR2VuZXJhdGVTd2FwKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhICRjbGFzc25hbWUkOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHtcbiIKKyAgICAgICIgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpO1xuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTtcbiIKKyAgICAgICIgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXztcbiIKKyAgICAgICIgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSAkY2xhc3NuYW1lJF9yZWZsZWN0aW9uXztcbiIKKyAgICAgICIgIHJldHVybiBtZXRhZGF0YTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIjo6c3RkOjpzdHJpbmcgJGNsYXNzbmFtZSQ6OkdldFR5cGVOYW1lKCkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuIFwiJHR5cGVfbmFtZSRcIjtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgICAidHlwZV9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKyAgfQorCit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZU9mZnNldHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInN0YXRpYyBjb25zdCBpbnQgJGNsYXNzbmFtZSRfb2Zmc2V0c19bJGZpZWxkX2NvdW50JF0gPSB7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAorICAgICJmaWVsZF9jb3VudCIsIFNpbXBsZUl0b2EobWF4KDEsIGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKSkpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIkdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoJGNsYXNzbmFtZSQsICRuYW1lJF8pLFxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAorICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn07XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2hhcmVkQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJ2b2lkICRjbGFzc25hbWUkOjpTaGFyZWRDdG9yKCkge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJfY2FjaGVkX3NpemVfID0gMDtcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZVNoYXJlZERlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJ2b2lkICRjbGFzc25hbWUkOjpTaGFyZWREdG9yKCkge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworICAvLyBXcml0ZSB0aGUgZGVzdHJ1Y3RvcnMgZm9yIGVhY2ggZmllbGQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgfQorCisgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBwcmludGVyLAorICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAiaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHtcbiIsCisgICAgLy8gV2l0aG91dC4KKyAgICAiaWYgKHRoaXMgIT0gJmRlZmF1bHRfaW5zdGFuY2UoKSkge1xuIik7CisKKyAgLy8gV2UgbmVlZCB0byBkZWxldGUgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzLgorICAvLyBUT0RPKGtlbnRvbik6ICBJZiB3ZSBtYWtlIHVuc2V0IG1lc3NhZ2VzIHBvaW50IGF0IGRlZmF1bHQgaW5zdGFuY2VzCisgIC8vICAgaW5zdGVhZCBvZiBOVUxMLCB0aGVuIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gbW92ZSB0aGlzIGNvZGUgaW50bworICAvLyAgIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVEZXN0cnVjdG9yQ29kZSgpLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJgorICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoIiAgZGVsZXRlICRuYW1lJF87XG4iLAorICAgICAgICAgICAgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICB9CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgIH1cbiIKKyAgICAifVxuIgorICAgICJcbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVTdHJ1Y3RvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgc3RyaW5nIHN1cGVyY2xhc3MgPSBTdXBlckNsYXNzTmFtZShkZXNjcmlwdG9yXyk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIHByaW50ZXItPlByaW50KAorICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoKVxuIgorICAgICIgIDogJHN1cGVyY2xhc3MkKCkge1xuIgorICAgICIgIFNoYXJlZEN0b3IoKTtcbiIKKyAgICAifVxuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKKyAgICAic3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgLy8gVGhlIGRlZmF1bHQgaW5zdGFuY2UgbmVlZHMgYWxsIG9mIGl0cyBlbWJlZGRlZCBtZXNzYWdlIHBvaW50ZXJzCisgIC8vIGNyb3NzLWxpbmtlZCB0byBvdGhlciBkZWZhdWx0IGluc3RhbmNlcy4gIFdlIGNhbid0IGRvIHRoaXMgaW5pdGlhbGl6YXRpb24KKyAgLy8gaW4gdGhlIGNvbnN0cnVjdG9yIGJlY2F1c2Ugc29tZSBvdGhlciBkZWZhdWx0IGluc3RhbmNlcyBtYXkgbm90IGhhdmUgYmVlbgorICAvLyBjb25zdHJ1Y3RlZCB5ZXQgYXQgdGhhdCB0aW1lLgorICAvLyBUT0RPKGtlbnRvbik6ICBNYXliZSBhbGwgbWVzc2FnZSBmaWVsZHMgKGV2ZW4gZm9yIG5vbi1kZWZhdWx0IG1lc3NhZ2VzKQorICAvLyAgIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byBwb2ludCBhdCBkZWZhdWx0IGluc3RhbmNlcyByYXRoZXIgdGhhbiBOVUxMPworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJgorICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBwcmludGVyLAorICAgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgICAgICIgICRuYW1lJF8gPSBjb25zdF9jYXN0PCAkdHlwZSQqPigmJHR5cGUkOjpkZWZhdWx0X2luc3RhbmNlKCkpO1xuIiwKKyAgICAgICAgLy8gV2l0aG91dC4KKyAgICAgICAgIiAgJG5hbWUkXyA9IGNvbnN0X2Nhc3Q8ICR0eXBlJCo+KFxuIgorICAgICAgICAiICAgICAgJHR5cGUkOjppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpO1xuIiwKKyAgICAgICAgLy8gVmFycy4KKyAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpLAorICAgICAgICAidHlwZSIsIEZpZWxkTWVzc2FnZVR5cGVOYW1lKGZpZWxkKSk7CisgICAgfQorICB9CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNvcHkgY29uc3RydWN0b3IuCisgIHByaW50ZXItPlByaW50KAorICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pXG4iCisgICAgIiAgOiAkc3VwZXJjbGFzcyQoKSB7XG4iCisgICAgIiAgU2hhcmVkQ3RvcigpO1xuIgorICAgICIgIE1lcmdlRnJvbShmcm9tKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgInN1cGVyY2xhc3MiLCBzdXBlcmNsYXNzKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGNvbnN0cnVjdG9yIGNvZGUuCisgIEdlbmVyYXRlU2hhcmVkQ29uc3RydWN0b3JDb2RlKHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBkZXN0cnVjdG9yLgorICBwcmludGVyLT5QcmludCgKKyAgICAiJGNsYXNzbmFtZSQ6On4kY2xhc3NuYW1lJCgpIHtcbiIKKyAgICAiICBTaGFyZWREdG9yKCk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGRlc3RydWN0b3IgY29kZS4KKyAgR2VuZXJhdGVTaGFyZWREZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBTZXRDYWNoZWRTaXplLgorICBwcmludGVyLT5QcmludCgKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Qge1xuIgorICAgICIgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7XG4iCisgICAgIiAgX2NhY2hlZF9zaXplXyA9IHNpemU7XG4iCisgICAgIiAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7XG4iCisgICAgIn1cbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIC8vIE9ubHkgZ2VuZXJhdGUgdGhpcyBtZW1iZXIgaWYgaXQncyBub3QgZGlzYWJsZWQuCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSAmJgorICAgICAgIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiAkY2xhc3NuYW1lJDo6ZGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICIgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpO1xuIgorICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKKyAgICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLAorICAgICAgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImNvbnN0ICRjbGFzc25hbWUkJiAkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZSgpIHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBwcmludGVyLAorICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAiICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIsCisgICAgLy8gV2l0aG91dC4KKyAgICAiICAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIiwKKyAgICAvLyBWYXJzLgorICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLAorICAgIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpLT5uYW1lKCkpKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICIkY2xhc3NuYW1lJCogJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDtcbiIKKyAgICAiXG4iCisgICAgIiRjbGFzc25hbWUkKiAkY2xhc3NuYW1lJDo6TmV3KCkgY29uc3Qge1xuIgorICAgICIgIHJldHVybiBuZXcgJGNsYXNzbmFtZSQ7XG4iCisgICAgIn1cbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsCisgICAgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgidm9pZCAkY2xhc3NuYW1lJDo6Q2xlYXIoKSB7XG4iLAorICAgICAgICAgICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGludCBsYXN0X2luZGV4ID0gLTE7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgiX2V4dGVuc2lvbnNfLkNsZWFyKCk7XG4iKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAvLyBXZSBjYW4gdXNlIHRoZSBmYWN0IHRoYXQgX2hhc19iaXRzXyBpcyBhIGdpYW50IGJpdGZpZWxkIHRvIG91cgorICAgICAgLy8gYWR2YW50YWdlOiAgV2UgY2FuIGNoZWNrIHVwIHRvIDMyIGJpdHMgYXQgYSB0aW1lIGZvciBlcXVhbGl0eSB0bworICAgICAgLy8gemVybywgYW5kIHNraXAgdGhlIHdob2xlIHJhbmdlIGlmIHNvLiAgVGhpcyBjYW4gaW1wcm92ZSB0aGUgc3BlZWQKKyAgICAgIC8vIG9mIENsZWFyKCkgZm9yIG1lc3NhZ2VzIHdoaWNoIGNvbnRhaW4gYSB2ZXJ5IGxhcmdlIG51bWJlciBvZgorICAgICAgLy8gb3B0aW9uYWwgZmllbGRzIG9mIHdoaWNoIG9ubHkgYSBmZXcgYXJlIHVzZWQgYXQgYSB0aW1lLiAgSGVyZSwKKyAgICAgIC8vIHdlJ3ZlIGNob3NlbiB0byBjaGVjayA4IGJpdHMgYXQgYSB0aW1lIHJhdGhlciB0aGFuIDMyLgorICAgICAgaWYgKGkgLyA4ICE9IGxhc3RfaW5kZXggLyA4IHx8IGxhc3RfaW5kZXggPCAwKSB7CisgICAgICAgIGlmIChsYXN0X2luZGV4ID49IDApIHsKKyAgICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoX2hhc19iaXRzX1skaW5kZXgkIC8gMzJdICYgKDB4ZmZ1IDw8ICgkaW5kZXgkICUgMzIpKSkge1xuIiwKKyAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGZpZWxkLT5pbmRleCgpKSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorICAgICAgbGFzdF9pbmRleCA9IGk7CisKKyAgICAgIC8vIEl0J3MgZmFzdGVyIHRvIGp1c3Qgb3ZlcndyaXRlIHByaW1pdGl2ZSB0eXBlcywgYnV0IHdlIHNob3VsZAorICAgICAgLy8gb25seSBjbGVhciBzdHJpbmdzIGFuZCBtZXNzYWdlcyBpZiB0aGV5IHdlcmUgc2V0LgorICAgICAgLy8gVE9ETyhrZW50b24pOiAgTGV0IHRoZSBDcHBGaWVsZEdlbmVyYXRvciBkZWNpZGUgdGhpcyBzb21laG93LgorICAgICAgYm9vbCBzaG91bGRfY2hlY2tfYml0ID0KKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgfHwKKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzsKKworICAgICAgaWYgKHNob3VsZF9jaGVja19iaXQpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmIChoYXNfJG5hbWUkKCkpIHtcbiIsCisgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICB9CisKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVDbGVhcmluZ0NvZGUocHJpbnRlcik7CisKKyAgICAgIGlmIChzaG91bGRfY2hlY2tfYml0KSB7CisgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChsYXN0X2luZGV4ID49IDApIHsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICB9CisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGRvbid0IHVzZSBfaGFzX2JpdHNfIHNvIHdlIGNsZWFyIHRoZW0gaW4gYSBzZXBhcmF0ZQorICAvLyBwYXNzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworICAgIH0KKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICI6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpO1xuIik7CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBTd2FwIG1lbWJlciBmdW5jdGlvbi4KKyAgcHJpbnRlci0+UHJpbnQoInZvaWQgJGNsYXNzbmFtZSQ6OlN3YXAoJGNsYXNzbmFtZSQqIG90aGVyKSB7XG4iLAorICAgICAgICAgICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgiaWYgKG90aGVyICE9IHRoaXMpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVTd2FwcGluZ0NvZGUocHJpbnRlcik7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgKyAzMSkgLyAzMjsgKytpKSB7CisgICAgICBwcmludGVyLT5QcmludCgic3RkOjpzd2FwKF9oYXNfYml0c19bJGkkXSwgb3RoZXItPl9oYXNfYml0c19bJGkkXSk7XG4iLAorICAgICAgICAgICAgICAgICAgICAgImkiLCBTaW1wbGVJdG9hKGkpKTsKKyAgICB9CisKKyAgICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoIl91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCJzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pO1xuIik7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7XG4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoIkdldFJlZmxlY3Rpb24oKS0+U3dhcCh0aGlzLCBvdGhlcik7Iik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdlRnJvbShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZ2VuZXJhbGl6ZWQgTWVyZ2VGcm9tIChha2EgdGhhdCB3aGljaCB0YWtlcyBpbiB0aGUgTWVzc2FnZQorICAgIC8vIGJhc2UgY2xhc3MgYXMgYSBwYXJhbWV0ZXIpLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHtcbiIKKyAgICAgICIgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgLy8gQ2FzdCB0aGUgbWVzc2FnZSB0byB0aGUgcHJvcGVyIHR5cGUuIElmIHdlIGZpbmQgdGhhdCB0aGUgbWVzc2FnZSBpcworICAgIC8vICpub3QqIG9mIHRoZSBwcm9wZXIgdHlwZSwgd2UgY2FuIHN0aWxsIGNhbGwgTWVyZ2UgdmlhIHRoZSByZWZsZWN0aW9uCisgICAgLy8gc3lzdGVtLCBhcyB0aGUgR09PR0xFX0NIRUNLIGFib3ZlIGVuc3VyZWQgdGhhdCB3ZSBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3IKKyAgICAvLyBmb3IgZWFjaCBtZXNzYWdlLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgImNvbnN0ICRjbGFzc25hbWUkKiBzb3VyY2UgPVxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCAkY2xhc3NuYW1lJCo+KFxuIgorICAgICAgIiAgICAmZnJvbSk7XG4iCisgICAgICAiaWYgKHNvdXJjZSA9PSBOVUxMKSB7XG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTtcbiIKKyAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgIiAgTWVyZ2VGcm9tKCpzb3VyY2UpO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CisgIH0gZWxzZSB7CisgICAgLy8gR2VuZXJhdGUgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCkuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKFxuIgorICAgICAgIiAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKSB7XG4iCisgICAgICAiICBNZXJnZUZyb20oKjo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PGNvbnN0ICRjbGFzc25hbWUkKj4oJmZyb20pKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzLXNwZWNpZmljIE1lcmdlRnJvbSwgd2hpY2ggYXZvaWRzIHRoZSBHT09HTEVfQ0hFQ0sgYW5kIGNhc3QuCisgIHByaW50ZXItPlByaW50KAorICAgICJ2b2lkICRjbGFzc25hbWUkOjpNZXJnZUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pIHtcbiIKKyAgICAiICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIE1lcmdlIFJlcGVhdGVkIGZpZWxkcy4gVGhlc2UgZmllbGRzIGRvIG5vdCByZXF1aXJlIGEKKyAgLy8gY2hlY2sgYXMgd2UgY2FuIHNpbXBseSBpdGVyYXRlIG92ZXIgdGhlbS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZU1lcmdpbmdDb2RlKHByaW50ZXIpOworICAgIH0KKyAgfQorCisgIC8vIE1lcmdlIE9wdGlvbmFsIGFuZCBSZXF1aXJlZCBmaWVsZHMgKGFmdGVyIGEgX2hhc19iaXQgY2hlY2spLgorICBpbnQgbGFzdF9pbmRleCA9IC0xOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAvLyBTZWUgYWJvdmUgaW4gR2VuZXJhdGVDbGVhciBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcy4KKyAgICAgIGlmIChpIC8gOCAhPSBsYXN0X2luZGV4IC8gOCB8fCBsYXN0X2luZGV4IDwgMCkgeworICAgICAgICBpZiAobGFzdF9pbmRleCA+PSAwKSB7CisgICAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKGZyb20uX2hhc19iaXRzX1skaW5kZXgkIC8gMzJdICYgKDB4ZmZ1IDw8ICgkaW5kZXgkICUgMzIpKSkge1xuIiwKKyAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGZpZWxkLT5pbmRleCgpKSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorCisgICAgICBsYXN0X2luZGV4ID0gaTsKKworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoZnJvbS5oYXNfJG5hbWUkKCkpIHtcbiIsCisgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZU1lcmdpbmdDb2RlKHByaW50ZXIpOworCisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgICAgfQorICB9CisKKyAgaWYgKGxhc3RfaW5kZXggPj0gMCkgeworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KCJfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTtcbiIpOworICB9CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpO1xuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29weUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gR2VuZXJhdGUgdGhlIGdlbmVyYWxpemVkIENvcHlGcm9tIChha2EgdGhhdCB3aGljaCB0YWtlcyBpbiB0aGUgTWVzc2FnZQorICAgIC8vIGJhc2UgY2xhc3MgYXMgYSBwYXJhbWV0ZXIpLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47XG4iCisgICAgICAiQ2xlYXIoKTtcbiIKKyAgICAgICJNZXJnZUZyb20oZnJvbSk7XG4iKTsKKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBjbGFzcy1zcGVjaWZpYyBDb3B5RnJvbS4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkNvcHlGcm9tKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47XG4iCisgICAgIkNsZWFyKCk7XG4iCisgICAgIk1lcmdlRnJvbShmcm9tKTtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgLy8gU3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiYm9vbCAkY2xhc3NuYW1lJDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIHByaW50ZXIsCisgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgICAiICByZXR1cm4gX2V4dGVuc2lvbnNfLlBhcnNlTWVzc2FnZVNldChpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpO1xuIiwKKyAgICAgIC8vIFdpdGhvdXQuCisgICAgICAiICByZXR1cm4gX2V4dGVuc2lvbnNfLlBhcnNlTWVzc2FnZVNldChpbnB1dCwgJmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSk7XG4iLAorICAgICAgLy8gVmFycy4KKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJib29sICRjbGFzc25hbWUkOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkge1xuIgorICAgICIjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlXG4iCisgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnO1xuIgorICAgICIgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGlmIChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSA+IDApIHsKKyAgICAvLyBXZSBkb24ndCBldmVuIHdhbnQgdG8gcHJpbnQgdGhlIHN3aXRjaCgpIGlmIHdlIGhhdmUgbm8gZmllbGRzIGJlY2F1c2UKKyAgICAvLyBNU1ZDIGRpc2xpa2VzIHN3aXRjaCgpIHN0YXRlbWVudHMgdGhhdCBjb250YWluIG9ubHkgYSBkZWZhdWx0IHZhbHVlLgorCisgICAgLy8gTm90ZTogIElmIHdlIGp1c3Qgc3dpdGNoZWQgb24gdGhlIHRhZyByYXRoZXIgdGhhbiB0aGUgZmllbGQgbnVtYmVyLCB3ZQorICAgIC8vIGNvdWxkIGF2b2lkIHRoZSBuZWVkIGZvciB0aGUgaWYoKSB0byBjaGVjayB0aGUgd2lyZSB0eXBlIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAvLyBvZiBlYWNoIGNhc2UuICBIb3dldmVyLCB0aGlzIGlzIGFjdHVhbGx5IGEgYml0IHNsb3dlciBpbiBwcmFjdGljZSBhcyBpdAorICAgIC8vIGNyZWF0ZXMgYSBqdW1wIHRhYmxlIHRoYXQgaXMgOHggbGFyZ2VyIGFuZCBzcGFyc2VyLCBhbmQgbWVhbndoaWxlIHRoZQorICAgIC8vIGlmKClzIGFyZSBoaWdobHkgcHJlZGljdGFibGUuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAic3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkge1xuIik7CisKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIHNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBvcmRlcmVkX2ZpZWxkcygKKyAgICAgIFNvcnRGaWVsZHNCeU51bWJlcihkZXNjcmlwdG9yXykpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3JkZXJlZF9maWVsZHNbaV07CisKKyAgICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKKworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjYXNlICRudW1iZXIkOiB7XG4iLAorICAgICAgICAibnVtYmVyIiwgU2ltcGxlSXRvYShmaWVsZC0+bnVtYmVyKCkpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGZpZWxkX2dlbmVyYXRvciA9IGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCk7CisKKyAgICAgIC8vIEVtaXQgY29kZSB0byBwYXJzZSB0aGUgY29tbW9uLCBleHBlY3RlZCBjYXNlLgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT1cbiIKKyAgICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfJHdpcmV0eXBlJCkge1xuIiwKKyAgICAgICAgIndpcmV0eXBlIiwga1dpcmVUeXBlTmFtZXNbV2lyZUZvcm1hdDo6V2lyZVR5cGVGb3JGaWVsZChmaWVsZCldKTsKKworICAgICAgaWYgKGkgPiAwIHx8IChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiBwYXJzZV8kbmFtZSQ6XG4iLAorICAgICAgICAgICJuYW1lIiwgZmllbGQtPm5hbWUoKSk7CisgICAgICB9CisKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgaWYgKGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yLkdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhwcmludGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKHByaW50ZXIpOworICAgICAgfQorICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworCisgICAgICAvLyBFbWl0IGNvZGUgdG8gcGFyc2UgdW5leHBlY3RlZGx5IHBhY2tlZCBvciB1bnBhY2tlZCB2YWx1ZXMuCisgICAgICBpZiAoZmllbGQtPmlzX3BhY2thYmxlKCkgJiYgZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAifSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKVxuIgorICAgICAgICAgICIgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAgICAgICAiICAgICAgICAgICAgICBXSVJFVFlQRV8kd2lyZXR5cGUkKSB7XG4iLAorICAgICAgICAgICJ3aXJldHlwZSIsCisgICAgICAgICAga1dpcmVUeXBlTmFtZXNbV2lyZUZvcm1hdDo6V2lyZVR5cGVGb3JGaWVsZFR5cGUoZmllbGQtPnR5cGUoKSldKTsKKyAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKHByaW50ZXIpOworICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19wYWNrYWJsZSgpICYmICFmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJ9IGVsc2UgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpXG4iCisgICAgICAgICAgIiAgICAgICAgICAgPT0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICAgICAgICIgICAgICAgICAgICAgIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHtcbiIpOworICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yLkdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhwcmludGVyKTsKKyAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgfQorCisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAgICIgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7XG4iCisgICAgICAgICJ9XG4iKTsKKworICAgICAgLy8gc3dpdGNoKCkgaXMgc2xvdyBzaW5jZSBpdCBjYW4ndCBiZSBwcmVkaWN0ZWQgd2VsbC4gIEluc2VydCBzb21lIGlmKClzCisgICAgICAvLyBoZXJlIHRoYXQgYXR0ZW1wdCB0byBwcmVkaWN0IHRoZSBuZXh0IHRhZy4KKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgICAgICAvLyBFeHBlY3QgcmVwZWF0cyBvZiB0aGlzIGZpZWxkLgorICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKGlucHV0LT5FeHBlY3RUYWcoJHRhZyQpKSBnb3RvIHBhcnNlXyRuYW1lJDtcbiIsCisgICAgICAgICAgInRhZyIsIFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhmaWVsZCkpLAorICAgICAgICAgICJuYW1lIiwgZmllbGQtPm5hbWUoKSk7CisgICAgICB9CisKKyAgICAgIGlmIChpICsgMSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKSB7CisgICAgICAgIC8vIEV4cGVjdCB0aGUgbmV4dCBmaWVsZCBpbiBvcmRlci4KKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXh0X2ZpZWxkID0gb3JkZXJlZF9maWVsZHNbaSArIDFdOworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKGlucHV0LT5FeHBlY3RUYWcoJG5leHRfdGFnJCkpIGdvdG8gcGFyc2VfJG5leHRfbmFtZSQ7XG4iLAorICAgICAgICAgICJuZXh0X3RhZyIsIFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhuZXh0X2ZpZWxkKSksCisgICAgICAgICAgIm5leHRfbmFtZSIsIG5leHRfZmllbGQtPm5hbWUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFeHBlY3QgRU9GLgorICAgICAgICAvLyBUT0RPKGtlbnRvbik6ICBFeHBlY3QgZ3JvdXAgZW5kLXRhZz8KKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7XG4iKTsKKyAgICAgIH0KKworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJicmVhaztcbiIpOworCisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJkZWZhdWx0OiB7XG4iCisgICAgICAiaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgfQorCisgIC8vIElzIHRoaXMgYW4gZW5kLWdyb3VwIHRhZz8gIElmIHNvLCB0aGlzIG11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PVxuIgorICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkge1xuIgorICAgICIgIHJldHVybiB0cnVlO1xuIgorICAgICJ9XG4iKTsKKworICAvLyBIYW5kbGUgZXh0ZW5zaW9uIHJhbmdlcy4KKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAoIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlID0KKyAgICAgICAgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZShpKTsKKyAgICAgIGlmIChpID4gMCkgcHJpbnRlci0+UHJpbnQoIiB8fFxuICAgICIpOworCisgICAgICB1aW50MzIgc3RhcnRfdGFnID0gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgIHJhbmdlLT5zdGFydCwgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OldpcmVUeXBlPigwKSk7CisgICAgICB1aW50MzIgZW5kX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICByYW5nZS0+ZW5kLCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU+KDApKTsKKworICAgICAgaWYgKHJhbmdlLT5lbmQgPiBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIigkc3RhcnQkdSA8PSB0YWcpIiwKKyAgICAgICAgICAic3RhcnQiLCBTaW1wbGVJdG9hKHN0YXJ0X3RhZykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIigkc3RhcnQkdSA8PSB0YWcgJiYgdGFnIDwgJGVuZCR1KSIsCisgICAgICAgICAgInN0YXJ0IiwgU2ltcGxlSXRvYShzdGFydF90YWcpLAorICAgICAgICAgICJlbmQiLCBTaW1wbGVJdG9hKGVuZF90YWcpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoIikge1xuIik7CisgICAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgICAiICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTtcbiIsCisgICAgICAgIC8vIFdpdGhvdXQuCisgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBwcmludGVyLAorICAgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXykpO1xuIiwKKyAgICAgICAgLy8gV2l0aG91dC4KKyAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsICZkZWZhdWx0X2luc3RhbmNlKCkpKTtcbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIGNvbnRpbnVlO1xuIgorICAgICAgIn1cbiIpOworICB9CisKKyAgLy8gV2UgcmVhbGx5IGRvbid0IHJlY29nbml6ZSB0aGlzIHRhZy4gIFNraXAgaXQuCisgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZChcbiIKKyAgICAgICIgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTtcbiIpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KCJicmVhaztcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7ICAgIC8vIGRlZmF1bHQ6CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsgICAgLy8gc3dpdGNoCisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgfVxuIiAgICAgICAgICAgICAgICAgICAvLyB3aGlsZQorICAgICIgIHJldHVybiB0cnVlO1xuIgorICAgICIjdW5kZWYgRE9fXG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgdG9fYXJyYXkpIHsKKyAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOworCisgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgfQorCisgIGlmICh0b19hcnJheSkgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgICBwcmludGVyKTsKKyAgfSBlbHNlIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKHByaW50ZXIpOworICB9CisKKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlLAorICAgIGJvb2wgdG9fYXJyYXkpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJzdGFydCJdID0gU2ltcGxlSXRvYShyYW5nZS0+c3RhcnQpOworICB2YXJzWyJlbmQiXSA9IFNpbXBsZUl0b2EocmFuZ2UtPmVuZCk7CisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIi8vIEV4dGVuc2lvbiByYW5nZSBbJHN0YXJ0JCwgJGVuZCQpXG4iKTsKKyAgaWYgKHRvX2FycmF5KSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJ0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShcbiIKKyAgICAgICIgICAgJHN0YXJ0JCwgJGVuZCQsIHRhcmdldCk7XG5cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhcbiIKKyAgICAgICIgICAgJHN0YXJ0JCwgJGVuZCQsIG91dHB1dCk7XG5cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgLy8gU3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7XG4iCisgICAgICAiICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplcyhvdXRwdXQpO1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoXG4iCisgICAgICAgICIgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJ2b2lkICRjbGFzc25hbWUkOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNCb2R5KHByaW50ZXIsIGZhbHNlKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgLy8gU3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogJGNsYXNzbmFtZSQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoXG4iCisgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3Qge1xuIgorICAgICAgIiAgdGFyZ2V0ID1cbiIKKyAgICAgICIgICAgICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgICAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpcbiIKKyAgICAgICAgIiAgICAgICAgICAgICBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheShcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICByZXR1cm4gdGFyZ2V0O1xuIgorICAgICAgIn1cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiAkY2xhc3NuYW1lJDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShcbiIKKyAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3Qge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keShwcmludGVyLCB0cnVlKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgIHJldHVybiB0YXJnZXQ7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNCb2R5KGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHRvX2FycmF5KSB7CisgIHNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBvcmRlcmVkX2ZpZWxkcygKKyAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKKworICB2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqPiBzb3J0ZWRfZXh0ZW5zaW9uczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIHNvcnRlZF9leHRlbnNpb25zLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlKGkpKTsKKyAgfQorICBzb3J0KHNvcnRlZF9leHRlbnNpb25zLmJlZ2luKCksIHNvcnRlZF9leHRlbnNpb25zLmVuZCgpLAorICAgICAgIEV4dGVuc2lvblJhbmdlU29ydGVyKCkpOworCisgIC8vIE1lcmdlIHRoZSBmaWVsZHMgYW5kIHRoZSBleHRlbnNpb24gcmFuZ2VzLCBib3RoIHNvcnRlZCBieSBmaWVsZCBudW1iZXIuCisgIGludCBpLCBqOworICBmb3IgKGkgPSAwLCBqID0gMDsKKyAgICAgICBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgfHwgaiA8IHNvcnRlZF9leHRlbnNpb25zLnNpemUoKTsKKyAgICAgICApIHsKKyAgICBpZiAoaSA9PSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSkgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZShwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfZXh0ZW5zaW9uc1tqKytdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19hcnJheSk7CisgICAgfSBlbHNlIGlmIChqID09IHNvcnRlZF9leHRlbnNpb25zLnNpemUoKSkgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChwcmludGVyLCBvcmRlcmVkX2ZpZWxkc1tpKytdLCB0b19hcnJheSk7CisgICAgfSBlbHNlIGlmIChvcmRlcmVkX2ZpZWxkc1tpXS0+bnVtYmVyKCkgPCBzb3J0ZWRfZXh0ZW5zaW9uc1tqXS0+c3RhcnQpIHsKKyAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQocHJpbnRlciwgb3JkZXJlZF9maWVsZHNbaSsrXSwgdG9fYXJyYXkpOworICAgIH0gZWxzZSB7CisgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF9leHRlbnNpb25zW2orK10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX2FycmF5KTsKKyAgICB9CisgIH0KKworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KCJpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgaWYgKHRvX2FycmF5KSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInRhcmdldCA9ICIKKyAgICAgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheShcbiIKKyAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcyhcbiIKKyAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBTcGVjaWFsLWNhc2UgTWVzc2FnZVNldC4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpbnQgJGNsYXNzbmFtZSQ6OkJ5dGVTaXplKCkgY29uc3Qge1xuIgorICAgICAgIiAgaW50IHRvdGFsX3NpemUgPSBfZXh0ZW5zaW9uc18uTWVzc2FnZVNldEJ5dGVTaXplKCk7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpcbiIKKyAgICAgICAgIiAgICAgIENvbXB1dGVVbmtub3duTWVzc2FnZVNldEl0ZW1zU2l6ZSh1bmtub3duX2ZpZWxkcygpKTtcbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7XG4iCisgICAgICAiICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTtcbiIKKyAgICAgICIgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpO1xuIgorICAgICAgIiAgcmV0dXJuIHRvdGFsX3NpemU7XG4iCisgICAgICAifVxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImludCAkY2xhc3NuYW1lJDo6Qnl0ZVNpemUoKSBjb25zdCB7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJpbnQgdG90YWxfc2l6ZSA9IDA7XG4iCisgICAgIlxuIik7CisKKyAgaW50IGxhc3RfaW5kZXggPSAtMTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgLy8gU2VlIGFib3ZlIGluIEdlbmVyYXRlQ2xlYXIgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoaXMuCisgICAgICAvLyBUT0RPKGtlbnRvbik6ICBTaGFyZSBjb2RlPyAgVW5jbGVhciBob3cgdG8gZG8gc28gd2l0aG91dAorICAgICAgLy8gICBvdmVyLWVuZ2luZWVyaW5nLgorICAgICAgaWYgKChpIC8gOCkgIT0gKGxhc3RfaW5kZXggLyA4KSB8fAorICAgICAgICAgIGxhc3RfaW5kZXggPCAwKSB7CisgICAgICAgIGlmIChsYXN0X2luZGV4ID49IDApIHsKKyAgICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoX2hhc19iaXRzX1skaW5kZXgkIC8gMzJdICYgKDB4ZmZ1IDw8ICgkaW5kZXgkICUgMzIpKSkge1xuIiwKKyAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGZpZWxkLT5pbmRleCgpKSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorICAgICAgbGFzdF9pbmRleCA9IGk7CisKKyAgICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKKworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKKworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9XG4iCisgICAgICAgICJcbiIpOworICAgIH0KKyAgfQorCisgIGlmIChsYXN0X2luZGV4ID49IDApIHsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICB9CisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGRvbid0IHVzZSBfaGFzX2JpdHNfIHNvIHdlIGNvdW50IHRoZW0gaW4gYSBzZXBhcmF0ZQorICAvLyBwYXNzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ0b3RhbF9zaXplICs9XG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoXG4iCisgICAgICAiICAgIHVua25vd25fZmllbGRzKCkpO1xuIik7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIC8vIFdlIHVwZGF0ZSBfY2FjaGVkX3NpemVfIGV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBjb25zdCBtZXRob2QuICBJbiB0aGVvcnksCisgIC8vIHRoaXMgaXMgbm90IHRocmVhZC1jb21wYXRpYmxlLCBiZWNhdXNlIGNvbmN1cnJlbnQgd3JpdGVzIGhhdmUgdW5kZWZpbmVkCisgIC8vIHJlc3VsdHMuICBJbiBwcmFjdGljZSwgc2luY2UgYW55IGNvbmN1cnJlbnQgd3JpdGVzIHdpbGwgYmUgd3JpdGluZyB0aGUKKyAgLy8gZXhhY3Qgc2FtZSB2YWx1ZSwgaXQgd29ya3Mgb24gYWxsIGNvbW1vbiBwcm9jZXNzb3JzLiAgSW4gYSBmdXR1cmUgdmVyc2lvbgorICAvLyBvZiBDKyssIF9jYWNoZWRfc2l6ZV8gc2hvdWxkIGJlIG1hZGUgaW50byBhbiBhdG9taWM8aW50Pi4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIkdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7XG4iCisgICAgIl9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplO1xuIgorICAgICJHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTtcbiIKKyAgICAicmV0dXJuIHRvdGFsX3NpemU7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiYm9vbCAkY2xhc3NuYW1lJDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgaW4gdGhpcyBtZXNzYWdlIGFyZSBzZXQuICBXZSBjYW4gZG8gdGhpcworICAvLyBtb3N0IGVmZmljaWVudGx5IGJ5IGNoZWNraW5nIDMyICJoYXMgYml0cyIgYXQgYSB0aW1lLgorICBpbnQgaGFzX2JpdHNfYXJyYXlfc2l6ZSA9IChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSArIDMxKSAvIDMyOworICBmb3IgKGludCBpID0gMDsgaSA8IGhhc19iaXRzX2FycmF5X3NpemU7IGkrKykgeworICAgIHVpbnQzMiBtYXNrID0gMDsKKyAgICBmb3IgKGludCBiaXQgPSAwOyBiaXQgPCAzMjsgYml0KyspIHsKKyAgICAgIGludCBpbmRleCA9IGkgKiAzMiArIGJpdDsKKyAgICAgIGlmIChpbmRleCA+PSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSkgYnJlYWs7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGluZGV4KTsKKworICAgICAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICAgIG1hc2sgfD0gMSA8PCBiaXQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1hc2sgIT0gMCkgeworICAgICAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoKF9oYXNfYml0c19bJGkkXSAmIDB4JG1hc2skKSAhPSAweCRtYXNrJCkgcmV0dXJuIGZhbHNlO1xuIiwKKyAgICAgICAgImkiLCBTaW1wbGVJdG9hKGkpLAorICAgICAgICAibWFzayIsIEZhc3RIZXgzMlRvQnVmZmVyKG1hc2ssIGJ1ZmZlcikpOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBjaGVjayB0aGF0IGFsbCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgIHByaW50ZXItPlByaW50KCJcbiIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgICAhU2hvdWxkSWdub3JlUmVxdWlyZWRGaWVsZENoZWNrKGZpZWxkKSAmJgorICAgICAgICBIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCisgICAgICAgICAgIiAgaWYgKCF0aGlzLT4kbmFtZSQoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAgICAgIiAgaWYgKCF0aGlzLT4kbmFtZSQoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAiaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Iik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgIHJldHVybiB0cnVlO1xuIgorICAgICJ9XG4iKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTQzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK2NsYXNzIEVudW1HZW5lcmF0b3I7ICAgICAgICAgICAvLyBlbnVtLmgKK2NsYXNzIEV4dGVuc2lvbkdlbmVyYXRvcjsgICAgICAvLyBleHRlbnNpb24uaAorCitjbGFzcyBNZXNzYWdlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgorICBleHBsaWNpdCBNZXNzYWdlR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5NZXNzYWdlR2VuZXJhdG9yKCk7CisKKyAgLy8gSGVhZGVyIHN0dWZmLgorCisgIC8vIEdlbmVyYXRlIGZvd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHRoaXMgY2xhc3MgYW5kIGFsbCBpdHMgbmVzdGVkIHR5cGVzLgorICB2b2lkIEdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBvZiBhbGwgbmVzdGVkIGVudW1zIChtdXN0IGNvbWUgYmVmb3JlIGNsYXNzCisgIC8vIGRlZmluaXRpb25zIGJlY2F1c2UgdGhvc2UgY2xhc3NlcyB1c2UgdGhlIGVudW1zIGRlZmluaXRpb25zKS4KKyAgdm9pZCBHZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgc3BlY2lhbGl6YXRpb25zIG9mIEdldEVudW1EZXNjcmlwdG9yPE15RW51bT4oKS4KKyAgLy8gUHJlY29uZGl0aW9uOiBpbiA6Omdvb2dsZTo6cHJvdG9idWYgbmFtZXNwYWNlLgorICB2b2lkIEdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGRlZmluaXRpb25zIGZvciB0aGlzIGNsYXNzIGFuZCBhbGwgaXRzIG5lc3RlZCB0eXBlcy4KKyAgdm9pZCBHZW5lcmF0ZUNsYXNzRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgZGVmaW5pdGlvbnMgb2YgaW5saW5lIG1ldGhvZHMgKHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIKKyAgLy8gZmlsZSkuCisgIHZvaWQgR2VuZXJhdGVJbmxpbmVNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSBjb2RlIHdoaWNoIGRlY2xhcmVzIGFsbCB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IgcG9pbnRlcnMgd2hpY2gKKyAgLy8gd2lsbCBiZSBpbml0aWFsaXplZCBieSB0aGUgbWV0aG9kcyBiZWxvdy4KKyAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGNvZGUgdGhhdCBpbml0aWFsaXplcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHN0b3JpbmcgdGhlIG1lc3NhZ2UncworICAvLyBkZXNjcmlwdG9yLgorICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQgaW5kZXgpOworCisgIC8vIEdlbmVyYXRlIGNvZGUgdGhhdCBjYWxscyBNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoKQorICAvLyBmb3IgYWxsIHR5cGVzLgorICB2b2lkIEdlbmVyYXRlVHlwZVJlZ2lzdHJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlcyBjb2RlIHRoYXQgYWxsb2NhdGVzIHRoZSBtZXNzYWdlJ3MgZGVmYXVsdCBpbnN0YW5jZS4KKyAgdm9pZCBHZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUFsbG9jYXRvcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGVzIGNvZGUgdGhhdCBpbml0aWFsaXplcyB0aGUgbWVzc2FnZSdzIGRlZmF1bHQgaW5zdGFuY2UuICBUaGlzCisgIC8vIGlzIHNlcGFyYXRlIGZyb20gYWxsb2NhdGluZyBiZWNhdXNlIGFsbCBkZWZhdWx0IGluc3RhbmNlcyBtdXN0IGJlCisgIC8vIGFsbG9jYXRlZCBiZWZvcmUgYW55IGNhbiBiZSBpbml0aWFsaXplZC4KKyAgdm9pZCBHZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZXMgY29kZSB0aGF0IHNob3VsZCBiZSBydW4gd2hlbiBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpIGlzIGNhbGxlZCwKKyAgLy8gdG8gZGVsZXRlIGFsbCBkeW5hbWljYWxseS1hbGxvY2F0ZWQgb2JqZWN0cy4KKyAgdm9pZCBHZW5lcmF0ZVNodXRkb3duQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgYWxsIG5vbi1pbmxpbmUgbWV0aG9kcyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBHZW5lcmF0ZUNsYXNzTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICAvLyBHZW5lcmF0ZSBkZWNsYXJhdGlvbnMgYW5kIGRlZmluaXRpb25zIG9mIGFjY2Vzc29ycyBmb3IgZmllbGRzLgorICB2b2lkIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBmaWVsZCBvZmZzZXRzIGFycmF5LgorICB2b2lkIEdlbmVyYXRlT2Zmc2V0cyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yLgorICB2b2lkIEdlbmVyYXRlU3RydWN0b3JzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBUaGUgY29tcGlsZXIgdHlwaWNhbGx5IGdlbmVyYXRlcyBtdWx0aXBsZSBjb3BpZXMgb2YgZWFjaCBjb25zdHJ1Y3RvciBhbmQKKyAgLy8gZGVzdHJ1Y3RvcjogaHR0cDovL2djYy5nbnUub3JnL2J1Z3MuaHRtbCNub25idWdzX2N4eAorICAvLyBQbGFjaW5nIGNvbW1vbiBjb2RlIGluIGEgc2VwYXJhdGUgbWV0aG9kIHJlZHVjZXMgdGhlIGdlbmVyYXRlZCBjb2RlIHNpemUuCisgIC8vCisgIC8vIEdlbmVyYXRlIHRoZSBzaGFyZWQgY29uc3RydWN0b3IgY29kZS4KKyAgdm9pZCBHZW5lcmF0ZVNoYXJlZENvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIC8vIEdlbmVyYXRlIHRoZSBzaGFyZWQgZGVzdHJ1Y3RvciBjb2RlLgorICB2b2lkIEdlbmVyYXRlU2hhcmVkRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHN0YW5kYXJkIE1lc3NhZ2UgbWV0aG9kcy4KKyAgdm9pZCBHZW5lcmF0ZUNsZWFyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc0JvZHkoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdG9fYXJyYXkpOworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUNvcHlGcm9tKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVN3YXAoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gSGVscGVycyBmb3IgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoKS4KKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdW5ib3VuZGVkKTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSwKKyAgICAgIGJvb2wgdW5ib3VuZGVkKTsKKworCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdHJpbmcgY2xhc3NuYW1lXzsKKyAgT3B0aW9ucyBvcHRpb25zXzsKKyAgRmllbGRHZW5lcmF0b3JNYXAgZmllbGRfZ2VuZXJhdG9yc187CisgIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+ID4gbmVzdGVkX2dlbmVyYXRvcnNfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxFbnVtR2VuZXJhdG9yPiA+IGVudW1fZ2VuZXJhdG9yc187CisgIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdmOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5jYwpAQCAtMCwwICsxLDI5OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCit2b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gRmllbGRNZXNzYWdlVHlwZU5hbWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsic3RyZWFtX3dyaXRlciJdID0gKCp2YXJpYWJsZXMpWyJkZWNsYXJlZF90eXBlIl0gKworICAgICAgKEhhc0Zhc3RBcnJheVNlcmlhbGl6YXRpb24oZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPmZpbGUoKSkgPworICAgICAgICJNYXliZVRvQXJyYXkiIDoKKyAgICAgICAiIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKK30KKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjp+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJHR5cGUkKiAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgJHR5cGUkKiBtdXRhYmxlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lICR0eXBlJCogcmVsZWFzZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfJG5hbWUkKCR0eXBlJCogJG5hbWUkKSRkZXByZWNhdGlvbiQ7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCAkdHlwZSQmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iKTsKKworICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgdmFyaWFibGVzXywgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgIiAgcmV0dXJuICRuYW1lJF8gIT0gTlVMTCA/ICokbmFtZSRfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT4kbmFtZSRfO1xuIiwKKyAgICAvLyBXaXRob3V0LgorICAgICIgIHJldHVybiAkbmFtZSRfICE9IE5VTEwgPyAqJG5hbWUkXyA6ICpkZWZhdWx0X2luc3RhbmNlKCkuJG5hbWUkXztcbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIn1cbiIKKyAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICIgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgaWYgKCRuYW1lJF8gPT0gTlVMTCkgJG5hbWUkXyA9IG5ldyAkdHlwZSQ7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6OnJlbGVhc2VfJG5hbWUkKCkge1xuIgorICAgICIgIGNsZWFyX2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICAkdHlwZSQqIHRlbXAgPSAkbmFtZSRfO1xuIgorICAgICIgICRuYW1lJF8gPSBOVUxMO1xuIgorICAgICIgIHJldHVybiB0ZW1wO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCkge1xuIgorICAgICIgIGRlbGV0ZSAkbmFtZSRfO1xuIgorICAgICIgICRuYW1lJF8gPSAkbmFtZSQ7XG4iCisgICAgIiAgaWYgKCRuYW1lJCkge1xuIgorICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICB9IGVsc2Uge1xuIgorICAgICIgICAgY2xlYXJfaGFzXyRuYW1lJCgpO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkbmFtZSRfICE9IE5VTEwpICRuYW1lJF8tPiR0eXBlJDo6Q2xlYXIoKTtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIm11dGFibGVfJG5hbWUkKCktPiR0eXBlJDo6TWVyZ2VGcm9tKGZyb20uJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGQ6OnN3YXAoJG5hbWUkXywgb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gTlVMTDtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKFxuIgorICAgICAgIiAgICAgaW5wdXQsIG11dGFibGVfJG5hbWUkKCkpKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkR3JvdXBOb1ZpcnR1YWwoXG4iCisgICAgICAiICAgICAgJG51bWJlciQsIGlucHV0LCBtdXRhYmxlXyRuYW1lJCgpKSk7XG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkc3RyZWFtX3dyaXRlciQoXG4iCisgICAgIiAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCBvdXRwdXQpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgIiAgV3JpdGUkZGVjbGFyZWRfdHlwZSROb1ZpcnR1YWxUb0FycmF5KFxuIgorICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCB0YXJnZXQpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKKyAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZU5vVmlydHVhbChcbiIKKyAgICAiICAgIHRoaXMtPiRuYW1lJCgpKTtcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKK30KKworUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCAkdHlwZSQmICRuYW1lJChpbnQgaW5kZXgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lICR0eXBlJCogbXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSAkdHlwZSQqIGFkZF8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgIiAgICAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+KlxuIgorICAgICIgICAgbXV0YWJsZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy4kY3BwZ2V0JChpbmRleCk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKGludCBpbmRleCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLk11dGFibGUoaW5kZXgpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSAkdHlwZSQqICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLkFkZCgpO1xuIgorICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJiRuYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLkNsZWFyKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLk1lcmdlRnJvbShmcm9tLiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gTm90IG5lZWRlZCBmb3IgcmVwZWF0ZWQgZmllbGRzLgorfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoXG4iCisgICAgICAiICAgICAgaW5wdXQsIGFkZF8kbmFtZSQoKSkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRHcm91cE5vVmlydHVhbChcbiIKKyAgICAgICIgICAgICAkbnVtYmVyJCwgaW5wdXQsIGFkZF8kbmFtZSQoKSkpO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRzdHJlYW1fd3JpdGVyJChcbiIKKyAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIgorICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAiICAgIFdyaXRlJGRlY2xhcmVkX3R5cGUkTm9WaXJ0dWFsVG9BcnJheShcbiIKKyAgICAiICAgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgKiB0aGlzLT4kbmFtZSRfc2l6ZSgpO1xuIgorICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIgorICAgICIgIHRvdGFsX3NpemUgKz1cbiIKKyAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplTm9WaXJ0dWFsKFxuIgorICAgICIgICAgICB0aGlzLT4kbmFtZSQoaSkpO1xuIgorICAgICJ9XG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWVkNjhhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5oCkBAIC0wLDAgKzEsMTA0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgflJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODc3MDY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcmVubmllQGdvb2dsZS5jb20gKEplZmZyZXkgUmVubmllKQorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfT1BUSU9OU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9PUFRJT05TX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyBHZW5lcmF0b3Igb3B0aW9uczoKK3N0cnVjdCBPcHRpb25zIHsKKyAgT3B0aW9ucygpIDogc2FmZV9ib3VuZGFyeV9jaGVjayhmYWxzZSkgeworICB9CisgIHN0cmluZyBkbGxleHBvcnRfZGVjbDsKKyAgYm9vbCBzYWZlX2JvdW5kYXJ5X2NoZWNrOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfT1BUSU9OU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRhYTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTIxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gVE9ETyhrZW50b24pOiAgU2hhcmUgY29kZSB3aXRoIHRoZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3QgaW4gb3RoZXIgbGFuZ3VhZ2VzPworLy8gICBJdCBzZWVtZWQgbGlrZSBwYXJhbWV0ZXJpemluZyBpdCB3b3VsZCBhZGQgbW9yZSBjb21wbGV4aXR5IHRoYW4gaXQgaXMKKy8vICAgd29ydGguCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworbmFtZXNwYWNlIHsKKworY2xhc3MgVGVzdEdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RHZW5lcmF0b3IoKSB7fQorICB+VGVzdEdlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgeworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImluY2x1ZGVzIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAibmFtZXNwYWNlX3Njb3BlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZ2xvYmFsX3Njb3BlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiY2xhc3Nfc2NvcGU6Zm9vLkJhciIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImNsYXNzX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7CisKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuY2MiLCAiaW5jbHVkZXMiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuY2MiLCAibmFtZXNwYWNlX3Njb3BlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgImdsb2JhbF9zY29wZSIsIGNvbnRleHQpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBUcnlJbnNlcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCisgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKKyAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KSk7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgcHJpbnRlci5QcmludCgiLy8gaW5zZXJ0ZWQgJG5hbWUkXG4iLCAibmFtZSIsIGluc2VydGlvbl9wb2ludCk7CisgIH0KK307CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IGFsbCB0aGUgZXhwZWN0ZWQgaW5zZXJ0aW9uIHBvaW50cyBleGlzdC4gIEl0IGRvZXMKKy8vIG5vdCB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHktcGxhY2VkOyB0aGF0IHdvdWxkIHJlcXVpcmUgYWN0dWFsbHkKKy8vIGNvbXBpbGluZyB0aGUgb3V0cHV0IHdoaWNoIGlzIGEgYml0IG1vcmUgdGhhbiBJIGNhcmUgdG8gZG8gZm9yIHRoaXMgdGVzdC4KK1RFU1QoQ3BwUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgeworICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKKyAgICAgICJ9XG4iLAorICAgICAgVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIpOworCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7CisgIGNsaS5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKKworICBDcHBHZW5lcmF0b3IgY3BwX2dlbmVyYXRvcjsKKyAgVGVzdEdlbmVyYXRvciB0ZXN0X2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWNwcF9vdXQiLCAmY3BwX2dlbmVyYXRvciwgIiIpOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tdGVzdF9vdXQiLCAmdGVzdF9nZW5lcmF0b3IsICIiKTsKKworICBzdHJpbmcgcHJvdG9fcGF0aCA9ICItSSIgKyBUZXN0VGVtcERpcigpOworICBzdHJpbmcgY3BwX291dCA9ICItLWNwcF9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7CisgIHN0cmluZyB0ZXN0X291dCA9ICItLXRlc3Rfb3V0PSIgKyBUZXN0VGVtcERpcigpOworCisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAicHJvdG9jIiwKKyAgICBwcm90b19wYXRoLmNfc3RyKCksCisgICAgY3BwX291dC5jX3N0cigpLAorICAgIHRlc3Rfb3V0LmNfc3RyKCksCisgICAgInRlc3QucHJvdG8iCisgIH07CisKKyAgRVhQRUNUX0VRKDAsIGNsaS5SdW4oNSwgYXJndikpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNWZlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5jYwpAQCAtMCwwICsxLDM4NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKKworbmFtZXNwYWNlIHsKKworLy8gRm9yIGVuY29kaW5ncyB3aXRoIGZpeGVkIHNpemVzLCByZXR1cm5zIHRoYXQgc2l6ZSBpbiBieXRlcy4gIE90aGVyd2lzZQorLy8gcmV0dXJucyAtMS4KK2ludCBGaXhlZFNpemUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMiAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NCAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMiA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0ZpeGVkMzJTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGaXhlZDY0U2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkMzJTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtTRml4ZWQ2NFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0Zsb2F0U2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRG91YmxlU2l6ZTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0wgICAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtCb29sU2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgIDogcmV0dXJuIC0xOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSA6IHJldHVybiAtMTsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBQcmltaXRpdmVUeXBlTmFtZShkZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsidGFnIl0gPSBTaW1wbGVJdG9hKGludGVybmFsOjpXaXJlRm9ybWF0OjpNYWtlVGFnKGRlc2NyaXB0b3IpKTsKKyAgaW50IGZpeGVkX3NpemUgPSBGaXhlZFNpemUoZGVzY3JpcHRvci0+dHlwZSgpKTsKKyAgaWYgKGZpeGVkX3NpemUgIT0gLTEpIHsKKyAgICAoKnZhcmlhYmxlcylbImZpeGVkX3NpemUiXSA9IFNpbXBsZUl0b2EoZml4ZWRfc2l6ZSk7CisgIH0KKyAgKCp2YXJpYWJsZXMpWyJ3aXJlX2Zvcm1hdF9maWVsZF90eXBlIl0gPQorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoiICsgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9OYW1lKAorICAgICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+KGRlc2NyaXB0b3ItPnR5cGUoKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKK30KKworUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6On5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJHR5cGUkICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSAkdHlwZSQgJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzZXRfJG5hbWUkKGZyb20uJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInN0ZDo6c3dhcCgkbmFtZSRfLCBvdGhlci0+JG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxcbiIKKyAgICAiICAgICAgICAgJHR5cGUkLCAkd2lyZV9mb3JtYXRfZmllbGRfdHlwZSQ+KFxuIgorICAgICIgICAgICAgaW5wdXQsICYkbmFtZSRfKSkpO1xuIgorICAgICJzZXRfaGFzXyRuYW1lJCgpO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkKCIKKyAgICAgICIkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIG91dHB1dCk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAidGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkVG9BcnJheSgiCisgICAgICAiJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCB0YXJnZXQpO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpbnQgZml4ZWRfc2l6ZSA9IEZpeGVkU2l6ZShkZXNjcmlwdG9yXy0+dHlwZSgpKTsKKyAgaWYgKGZpeGVkX3NpemUgPT0gLTEpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZShcbiIKKyAgICAgICIgICAgdGhpcy0+JG5hbWUkKCkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgKyAkZml4ZWRfc2l6ZSQ7XG4iKTsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOworCisgIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICB2YXJpYWJsZXNfWyJwYWNrZWRfcmVhZGVyIl0gPSAiUmVhZFBhY2tlZFByaW1pdGl2ZSI7CisgICAgdmFyaWFibGVzX1sicmVwZWF0ZWRfcmVhZGVyIl0gPSAiUmVhZFJlcGVhdGVkUHJpbWl0aXZlTm9JbmxpbmUiOworICB9IGVsc2UgeworICAgIHZhcmlhYmxlc19bInBhY2tlZF9yZWFkZXIiXSA9ICJSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmUiOworICAgIHZhcmlhYmxlc19bInJlcGVhdGVkX3JlYWRlciJdID0gIlJlYWRSZXBlYXRlZFByaW1pdGl2ZSI7CisgIH0KK30KKworUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+ICRuYW1lJF87XG4iKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkgJiYgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAibXV0YWJsZSBpbnQgXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXztcbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSAkdHlwZSQgJG5hbWUkKGludCBpbmRleCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIGFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgIiAgICAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+KlxuIgorICAgICIgICAgbXV0YWJsZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uR2V0KGluZGV4KTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIgICRuYW1lJF8uU2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiAgJG5hbWUkXy5BZGQodmFsdWUpO1xuIgorICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJiRuYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uQ2xlYXIoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5NZXJnZUZyb20oZnJvbS4kbmFtZSRfKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBOb3QgbmVlZGVkIGZvciByZXBlYXRlZCBmaWVsZHMuCit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIkRPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRyZXBlYXRlZF9yZWFkZXIkPFxuIgorICAgICIgICAgICAgICAkdHlwZSQsICR3aXJlX2Zvcm1hdF9maWVsZF90eXBlJD4oXG4iCisgICAgIiAgICAgICAkdGFnX3NpemUkLCAkdGFnJCwgaW5wdXQsIHRoaXMtPm11dGFibGVfJG5hbWUkKCkpKSk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokcGFja2VkX3JlYWRlciQ8XG4iCisgICAgIiAgICAgICAgICR0eXBlJCwgJHdpcmVfZm9ybWF0X2ZpZWxkX3R5cGUkPihcbiIKKyAgICAiICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSkpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIC8vIFdyaXRlIHRoZSB0YWcgYW5kIHRoZSBzaXplLgorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKHRoaXMtPiRuYW1lJF9zaXplKCkgPiAwKSB7XG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoIgorICAgICAgICAgICIkbnVtYmVyJCwgIgorICAgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgIgorICAgICAgICAgICJvdXRwdXQpO1xuIgorICAgICAgIiAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKF8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8pO1xuIgorICAgICAgIn1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSROb1RhZyhcbiIKKyAgICAgICIgICAgdGhpcy0+JG5hbWUkKGkpLCBvdXRwdXQpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRkZWNsYXJlZF90eXBlJChcbiIKKyAgICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIC8vIFdyaXRlIHRoZSB0YWcgYW5kIHRoZSBzaXplLgorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKHRoaXMtPiRuYW1lJF9zaXplKCkgPiAwKSB7XG4iCisgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KFxuIgorICAgICAgIiAgICAkbnVtYmVyJCxcbiIKKyAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsXG4iCisgICAgICAiICAgIHRhcmdldCk7XG4iCisgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoXG4iCisgICAgICAiICAgIF8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8sIHRhcmdldCk7XG4iCisgICAgICAifVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAgICIgICAgV3JpdGUkZGVjbGFyZWRfdHlwZSROb1RhZ1RvQXJyYXkodGhpcy0+JG5hbWUkKGkpLCB0YXJnZXQpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAgICIgICAgV3JpdGUkZGVjbGFyZWRfdHlwZSRUb0FycmF5KCRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIntcbiIKKyAgICAiICBpbnQgZGF0YV9zaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgaW50IGZpeGVkX3NpemUgPSBGaXhlZFNpemUoZGVzY3JpcHRvcl8tPnR5cGUoKSk7CisgIGlmIChmaXhlZF9zaXplID09IC0xKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIgorICAgICAgIiAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAgICIgICAgJGRlY2xhcmVkX3R5cGUkU2l6ZSh0aGlzLT4kbmFtZSQoaSkpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZGF0YV9zaXplID0gJGZpeGVkX3NpemUkICogdGhpcy0+JG5hbWUkX3NpemUoKTtcbiIpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChkYXRhX3NpemUgPiAwKSB7XG4iCisgICAgICAiICB0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGRhdGFfc2l6ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgIkdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7XG4iCisgICAgICAiXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyA9IGRhdGFfc2l6ZTtcbiIKKyAgICAgICJHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTtcbiIKKyAgICAgICJ0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICogdGhpcy0+JG5hbWUkX3NpemUoKSArIGRhdGFfc2l6ZTtcbiIpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI0OWM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfUFJJTUlUSVZFX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BSSU1JVElWRV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BSSU1JVElWRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDAxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjCkBAIC0wLDAgKzEsMzM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK1NlcnZpY2VHZW5lcmF0b3I6OlNlcnZpY2VHZW5lcmF0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICB2YXJzX1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICB2YXJzX1siZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCk7CisgIGlmIChvcHRpb25zLmRsbGV4cG9ydF9kZWNsLmVtcHR5KCkpIHsKKyAgICB2YXJzX1siZGxsZXhwb3J0Il0gPSAiIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzX1siZGxsZXhwb3J0Il0gPSBvcHRpb25zLmRsbGV4cG9ydF9kZWNsICsgIiAiOworICB9Cit9CisKK1NlcnZpY2VHZW5lcmF0b3I6On5TZXJ2aWNlR2VuZXJhdG9yKCkge30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZURlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBGb3J3YXJkLWRlY2xhcmUgdGhlIHN0dWIgdHlwZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgImNsYXNzICRjbGFzc25hbWUkX1N0dWI7XG4iCisgICAgIlxuIik7CisKKyAgR2VuZXJhdGVJbnRlcmZhY2UocHJpbnRlcik7CisgIEdlbmVyYXRlU3R1YkRlZmluaXRpb24ocHJpbnRlcik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgImNsYXNzICRkbGxleHBvcnQkJGNsYXNzbmFtZSQgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlIHtcbiIKKyAgICAiIHByb3RlY3RlZDpcbiIKKyAgICAiICAvLyBUaGlzIGNsYXNzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuIGFic3RyYWN0IGludGVyZmFjZS5cbiIKKyAgICAiICBpbmxpbmUgJGNsYXNzbmFtZSQoKSB7fTtcbiIKKyAgICAiIHB1YmxpYzpcbiIKKyAgICAiICB2aXJ0dWFsIH4kY2xhc3NuYW1lJCgpO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KHZhcnNfLAorICAgICJcbiIKKyAgICAidHlwZWRlZiAkY2xhc3NuYW1lJF9TdHViIFN0dWI7XG4iCisgICAgIlxuIgorICAgICJzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcigpO1xuIgorICAgICJcbiIpOworCisgIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlcyhWSVJUVUFMLCBwcmludGVyKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIGltcGxlbWVudHMgU2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgIlxuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCk7XG4iCisgICAgInZvaWQgQ2FsbE1ldGhvZChjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCxcbiIKKyAgICAiICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAiICAgICAgICAgICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogcmVxdWVzdCxcbiIKKyAgICAiICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogcmVzcG9uc2UsXG4iCisgICAgIiAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkNsb3N1cmUqIGRvbmUpO1xuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIEdldFJlcXVlc3RQcm90b3R5cGUoXG4iCisgICAgIiAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0O1xuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIEdldFJlc3BvbnNlUHJvdG90eXBlKFxuIgorICAgICIgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdDtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIlxuIgorICAgICIgcHJpdmF0ZTpcbiIKKyAgICAiICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoJGNsYXNzbmFtZSQpO1xuIgorICAgICJ9O1xuIgorICAgICJcbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1YkRlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgImNsYXNzICRkbGxleHBvcnQkJGNsYXNzbmFtZSRfU3R1YiA6IHB1YmxpYyAkY2xhc3NuYW1lJCB7XG4iCisgICAgIiBwdWJsaWM6XG4iKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAiJGNsYXNzbmFtZSRfU3R1Yig6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NoYW5uZWwqIGNoYW5uZWwpO1xuIgorICAgICIkY2xhc3NuYW1lJF9TdHViKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ2hhbm5lbCogY2hhbm5lbCxcbiIKKyAgICAiICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2U6OkNoYW5uZWxPd25lcnNoaXAgb3duZXJzaGlwKTtcbiIKKyAgICAifiRjbGFzc25hbWUkX1N0dWIoKTtcbiIKKyAgICAiXG4iCisgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NoYW5uZWwqIGNoYW5uZWwoKSB7IHJldHVybiBjaGFubmVsXzsgfVxuIgorICAgICJcbiIKKyAgICAiLy8gaW1wbGVtZW50cyAkY2xhc3NuYW1lJCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAiXG4iKTsKKworICBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZXMoTk9OX1ZJUlRVQUwsIHByaW50ZXIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiBwcml2YXRlOlxuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ2hhbm5lbCogY2hhbm5lbF87XG4iCisgICAgIiAgYm9vbCBvd25zX2NoYW5uZWxfO1xuIgorICAgICIgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUygkY2xhc3NuYW1lJF9TdHViKTtcbiIKKyAgICAifTtcbiIKKyAgICAiXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZXMoCisgICAgVmlydHVhbE9yTm9uIHZpcnR1YWxfb3Jfbm9uLCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHN1Yl92YXJzOworICAgIHN1Yl92YXJzWyJuYW1lIl0gPSBtZXRob2QtPm5hbWUoKTsKKyAgICBzdWJfdmFyc1siaW5wdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpLCB0cnVlKTsKKyAgICBzdWJfdmFyc1sib3V0cHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCksIHRydWUpOworICAgIHN1Yl92YXJzWyJ2aXJ0dWFsIl0gPSB2aXJ0dWFsX29yX25vbiA9PSBWSVJUVUFMID8gInZpcnR1YWwgIiA6ICIiOworCisgICAgcHJpbnRlci0+UHJpbnQoc3ViX3ZhcnMsCisgICAgICAiJHZpcnR1YWwkdm9pZCAkbmFtZSQoOjpnb29nbGU6OnByb3RvYnVmOjpScGNDb250cm9sbGVyKiBjb250cm9sbGVyLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRpbnB1dF90eXBlJCogcmVxdWVzdCxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0X3R5cGUkKiByZXNwb25zZSxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkNsb3N1cmUqIGRvbmUpO1xuIik7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQgaW5kZXgpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGluZGV4KTsKKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyA9IGZpbGUtPnNlcnZpY2UoJGluZGV4JCk7XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlSW1wbGVtZW50YXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiRjbGFzc25hbWUkOjp+JGNsYXNzbmFtZSQoKSB7fVxuIgorICAgICJcbiIKKyAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvciogJGNsYXNzbmFtZSQ6OmRlc2NyaXB0b3IoKSB7XG4iCisgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iCisgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yKiAkY2xhc3NuYW1lJDo6R2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAiICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTtcbiIKKyAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl87XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKKworICAvLyBHZW5lcmF0ZSBtZXRob2RzIG9mIHRoZSBpbnRlcmZhY2UuCisgIEdlbmVyYXRlTm90SW1wbGVtZW50ZWRNZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZUNhbGxNZXRob2QocHJpbnRlcik7CisgIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFUVVFU1QsIHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVNQT05TRSwgcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgc3R1YiBpbXBsZW1lbnRhdGlvbi4KKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiRjbGFzc25hbWUkX1N0dWI6OiRjbGFzc25hbWUkX1N0dWIoOjpnb29nbGU6OnByb3RvYnVmOjpScGNDaGFubmVsKiBjaGFubmVsKVxuIgorICAgICIgIDogY2hhbm5lbF8oY2hhbm5lbCksIG93bnNfY2hhbm5lbF8oZmFsc2UpIHt9XG4iCisgICAgIiRjbGFzc25hbWUkX1N0dWI6OiRjbGFzc25hbWUkX1N0dWIoXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NoYW5uZWwqIGNoYW5uZWwsXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2U6OkNoYW5uZWxPd25lcnNoaXAgb3duZXJzaGlwKVxuIgorICAgICIgIDogY2hhbm5lbF8oY2hhbm5lbCksXG4iCisgICAgIiAgICBvd25zX2NoYW5uZWxfKG93bmVyc2hpcCA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2U6OlNUVUJfT1dOU19DSEFOTkVMKSB7fVxuIgorICAgICIkY2xhc3NuYW1lJF9TdHViOjp+JGNsYXNzbmFtZSRfU3R1YigpIHtcbiIKKyAgICAiICBpZiAob3duc19jaGFubmVsXykgZGVsZXRlIGNoYW5uZWxfO1xuIgorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgR2VuZXJhdGVTdHViTWV0aG9kcyhwcmludGVyKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU5vdEltcGxlbWVudGVkTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHN1Yl92YXJzOworICAgIHN1Yl92YXJzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgICAgc3ViX3ZhcnNbIm5hbWUiXSA9IG1ldGhvZC0+bmFtZSgpOworICAgIHN1Yl92YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICBzdWJfdmFyc1siaW5wdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpLCB0cnVlKTsKKyAgICBzdWJfdmFyc1sib3V0cHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCksIHRydWUpOworCisgICAgcHJpbnRlci0+UHJpbnQoc3ViX3ZhcnMsCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6JG5hbWUkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJGlucHV0X3R5cGUkKixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dF90eXBlJCosXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Q2xvc3VyZSogZG9uZSkge1xuIgorICAgICAgIiAgY29udHJvbGxlci0+U2V0RmFpbGVkKFwiTWV0aG9kICRuYW1lJCgpIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4iCisgICAgICAiICBkb25lLT5SdW4oKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q2FsbE1ldGhvZChjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXIsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiByZXF1ZXN0LFxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogcmVzcG9uc2UsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpDbG9zdXJlKiBkb25lKSB7XG4iCisgICAgIiAgR09PR0xFX0RDSEVDS19FUShtZXRob2QtPnNlcnZpY2UoKSwgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8pO1xuIgorICAgICIgIHN3aXRjaChtZXRob2QtPmluZGV4KCkpIHtcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc3ViX3ZhcnM7CisgICAgc3ViX3ZhcnNbIm5hbWUiXSA9IG1ldGhvZC0+bmFtZSgpOworICAgIHN1Yl92YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICBzdWJfdmFyc1siaW5wdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpLCB0cnVlKTsKKyAgICBzdWJfdmFyc1sib3V0cHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCksIHRydWUpOworCisgICAgLy8gTm90ZTogIGRvd25fY2FzdCBkb2VzIG5vdCB3b3JrIGhlcmUgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG9uIHBvaW50ZXJzLAorICAgIC8vICAgbm90IHJlZmVyZW5jZXMuCisgICAgcHJpbnRlci0+UHJpbnQoc3ViX3ZhcnMsCisgICAgICAiICAgIGNhc2UgJGluZGV4JDpcbiIKKyAgICAgICIgICAgICAkbmFtZSQoY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpkb3duX2Nhc3Q8Y29uc3QgJGlucHV0X3R5cGUkKj4ocmVxdWVzdCksXG4iCisgICAgICAiICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PCAkb3V0cHV0X3R5cGUkKj4ocmVzcG9uc2UpLFxuIgorICAgICAgIiAgICAgICAgICAgICBkb25lKTtcbiIKKyAgICAgICIgICAgICBicmVhaztcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiAgICBkZWZhdWx0OlxuIgorICAgICIgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCBcIkJhZCBtZXRob2QgaW5kZXg7IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi5cIjtcbiIKKyAgICAiICAgICAgYnJlYWs7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmICh3aGljaCA9PSBSRVFVRVNUKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiAkY2xhc3NuYW1lJDo6R2V0UmVxdWVzdFByb3RvdHlwZShcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcnNfLAorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgJGNsYXNzbmFtZSQ6OkdldFJlc3BvbnNlUHJvdG90eXBlKFxuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAiICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdCB7XG4iCisgICAgIiAgR09PR0xFX0RDSEVDS19FUShtZXRob2QtPnNlcnZpY2UoKSwgZGVzY3JpcHRvcigpKTtcbiIKKyAgICAiICBzd2l0Y2gobWV0aG9kLT5pbmRleCgpKSB7XG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlID0KKyAgICAgICh3aGljaCA9PSBSRVFVRVNUKSA/IG1ldGhvZC0+aW5wdXRfdHlwZSgpIDogbWV0aG9kLT5vdXRwdXRfdHlwZSgpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzdWJfdmFyczsKKyAgICBzdWJfdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7CisgICAgc3ViX3ZhcnNbInR5cGUiXSA9IENsYXNzTmFtZSh0eXBlLCB0cnVlKTsKKworICAgIHByaW50ZXItPlByaW50KHN1Yl92YXJzLAorICAgICAgIiAgICBjYXNlICRpbmRleCQ6XG4iCisgICAgICAiICAgICAgcmV0dXJuICR0eXBlJDo6ZGVmYXVsdF9pbnN0YW5jZSgpO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAiICAgIGRlZmF1bHQ6XG4iCisgICAgIiAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8IFwiQmFkIG1ldGhvZCBpbmRleDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLlwiO1xuIgorICAgICIgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSo+KE5VTEwpO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIgorICAgICJcbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1Yk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzdWJfdmFyczsKKyAgICBzdWJfdmFyc1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICAgIHN1Yl92YXJzWyJuYW1lIl0gPSBtZXRob2QtPm5hbWUoKTsKKyAgICBzdWJfdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7CisgICAgc3ViX3ZhcnNbImlucHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSwgdHJ1ZSk7CisgICAgc3ViX3ZhcnNbIm91dHB1dF90eXBlIl0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpLCB0cnVlKTsKKworICAgIHByaW50ZXItPlByaW50KHN1Yl92YXJzLAorICAgICAgInZvaWQgJGNsYXNzbmFtZSRfU3R1Yjo6JG5hbWUkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkaW5wdXRfdHlwZSQqIHJlcXVlc3QsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dF90eXBlJCogcmVzcG9uc2UsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpDbG9zdXJlKiBkb25lKSB7XG4iCisgICAgICAiICBjaGFubmVsXy0+Q2FsbE1ldGhvZChkZXNjcmlwdG9yKCktPm1ldGhvZCgkaW5kZXgkKSxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBkb25lKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGY5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU0VSVklDRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TRVJWSUNFX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgorICBleHBsaWNpdCBTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+U2VydmljZUdlbmVyYXRvcigpOworCisgIC8vIEhlYWRlciBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbnMgZm9yIHRoZSBzZXJ2aWNlJ3MgaW50ZXJmYWNlIGFuZCB0aGUKKyAgLy8gc3R1YiBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCBHZW5lcmF0ZURlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gU291cmNlIGZpbGUgc3R1ZmYuCisKKyAgLy8gR2VuZXJhdGUgY29kZSB0aGF0IGluaXRpYWxpemVzIHRoZSBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgc2VydmljZSdzCisgIC8vIGRlc2NyaXB0b3IuCisgIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCBpbmRleCk7CisKKyAgLy8gR2VuZXJhdGUgaW1wbGVtZW50YXRpb25zIG9mIGV2ZXJ5dGhpbmcgZGVjbGFyZWQgYnkgR2VuZXJhdGVEZWNsYXJhdGlvbnMoKS4KKyAgdm9pZCBHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIGVudW0gUmVxdWVzdE9yUmVzcG9uc2UgeyBSRVFVRVNULCBSRVNQT05TRSB9OworICBlbnVtIFZpcnR1YWxPck5vbiB7IFZJUlRVQUwsIE5PTl9WSVJUVUFMIH07CisKKyAgLy8gSGVhZGVyIHN0dWZmLgorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlIGFic3RyYWN0IGludGVyZmFjZS4KKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHN0dWIgY2xhc3MgZGVmaW5pdGlvbi4KKyAgdm9pZCBHZW5lcmF0ZVN0dWJEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBQcmludHMgc2lnbmF0dXJlcyBmb3IgYWxsIG1ldGhvZHMgaW4gdGhlCisgIHZvaWQgR2VuZXJhdGVNZXRob2RTaWduYXR1cmVzKFZpcnR1YWxPck5vbiB2aXJ0dWFsX29yX25vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIFNvdXJjZSBmaWxlIHN0dWZmLgorCisgIC8vIEdlbmVyYXRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2VydmljZSBtZXRob2RzLCB3aGljaAorICAvLyBwcm9kdWNlIGEgIm5vdCBpbXBsZW1lbnRlZCIgZXJyb3IuCisgIHZvaWQgR2VuZXJhdGVOb3RJbXBsZW1lbnRlZE1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBDYWxsTWV0aG9kKCkgbWV0aG9kIG9mIHRoZSBzZXJ2aWNlLgorICB2b2lkIEdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIEdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpIG1ldGhvZHMuCisgIHZvaWQgR2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsIGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc3R1YidzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2VydmljZSBtZXRob2RzLgorICB2b2lkIEdlbmVyYXRlU3R1Yk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2VydmljZUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU0VSVklDRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzA5MTFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjCkBAIC0wLDAgKzEsNDkxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCit2b2lkIFNldFN0cmluZ1ZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHRfbGVuZ3RoIl0gPQorICAgICAgU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmxlbmd0aCgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhcmlhYmxlIl0gPSBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkKKyAgICAgID8gIiY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmciCisgICAgICA6ICJfZGVmYXVsdF8iICsgRmllbGROYW1lKGRlc2NyaXB0b3IpICsgIl8iOworICAoKnZhcmlhYmxlcylbInBvaW50ZXJfdHlwZSJdID0KKyAgICAgIGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgPyAidm9pZCIgOiAiY2hhciI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK1N0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRTdHJpbmdWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOworfQorCitTdHJpbmdGaWVsZEdlbmVyYXRvcjo6flN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICI6OnN0ZDo6c3RyaW5nKiAkbmFtZSRfO1xuIik7CisgIGlmICghZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGF0aWMgOjpzdGQ6OnN0cmluZyogJGRlZmF1bHRfdmFyaWFibGUkO1xuIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIElmIHdlJ3JlIHVzaW5nIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIGZvciBhIGZpZWxkIHdpdGggYSBjdHlwZSwgaXQncworICAvLyBiZWNhdXNlIHRoYXQgY3R5cGUgaXNuJ3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzCisgIC8vIHRydWUgb2YgY3R5cGU9Q09SRCBhbmQgY3R5cGU9U1RSSU5HX1BJRUNFIGluIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLgorICAvLyBXZSBhcmVuJ3QgcmVsZWFzaW5nIENvcmQgYmVjYXVzZSBpdCBoYXMgdG9vIG1hbnkgR29vZ2xlLXNwZWNpZmljCisgIC8vIGRlcGVuZGVuY2llcyBhbmQgd2UgYXJlbid0IHJlbGVhc2luZyBTdHJpbmdQaWVjZSBiZWNhdXNlIGl0J3MgaGFyZGx5CisgIC8vIHVzZWZ1bCBvdXRzaWRlIG9mIEdvb2dsZSBhbmQgYmVjYXVzZSBpdCB3b3VsZCBnZXQgY29uZnVzaW5nIHRvIGhhdmUKKyAgLy8gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBTdHJpbmdQaWVjZSBjbGFzcyBpbiBkaWZmZXJlbnQgbGlicmFyaWVzIChQQ1JFCisgIC8vIGFscmVhZHkgaW5jbHVkZXMgaXQgZm9yIHRoZWlyIEMrKyBiaW5kaW5ncywgd2hpY2ggY2FtZSBmcm9tIEdvb2dsZSkuCisgIC8vCisgIC8vIEluIGFueSBjYXNlLCB3ZSBtYWtlIGFsbCB0aGUgYWNjZXNzb3JzIHByaXZhdGUgd2hpbGUgc3RpbGwgYWN0dWFsbHkKKyAgLy8gdXNpbmcgYSBzdHJpbmcgdG8gcmVwcmVzZW50IHRoZSBmaWVsZCBpbnRlcm5hbGx5LiAgVGhpcyB3YXksIHdlIGNhbgorICAvLyBndWFyYW50ZWUgdGhhdCBpZiB3ZSBkbyBldmVyIGltcGxlbWVudCB0aGUgY3R5cGUsIGl0IHdvbid0IGJyZWFrIGFueQorICAvLyBleGlzdGluZyB1c2VycyB3aG8gbWlnaHQgYmUgLS0gZm9yIHdoYXRldmVyIHJlYXNvbiAtLSBhbHJlYWR5IHVzaW5nIC5wcm90bworICAvLyBmaWxlcyB0aGF0IGFwcGxpZWQgdGhlIGN0eXBlLiAgVGhlIGZpZWxkIGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCB2aWEgdGhlCisgIC8vIHJlZmxlY3Rpb24gaW50ZXJmYWNlIHNpbmNlIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZSBpcyBpbmRlcGVuZGVudCBvZgorICAvLyB0aGUgc3RyaW5nJ3MgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4KKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPSBGaWVsZE9wdGlvbnM6OlNUUklORykgeworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgcHJpdmF0ZTpcbiIKKyAgICAgICIgIC8vIEhpZGRlbiBkdWUgdG8gdW5rbm93biBjdHlwZSBvcHRpb24uXG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgc2V0XyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfJG5hbWUkKCkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfJG5hbWUkKDo6c3RkOjpzdHJpbmcqICRuYW1lJCkkZGVwcmVjYXRpb24kO1xuIik7CisKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5jdHlwZSgpICE9IEZpZWxkT3B0aW9uczo6U1RSSU5HKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCIgcHVibGljOlxuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuICokbmFtZSRfO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCisgICAgIiAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICBpZiAoJG5hbWUkXyA9PSAkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgOjpzdGQ6OnN0cmluZztcbiIKKyAgICAiICB9XG4iCisgICAgIiAgJG5hbWUkXy0+YXNzaWduKHZhbHVlKTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgorICAgICIgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgaWYgKCRuYW1lJF8gPT0gJGRlZmF1bHRfdmFyaWFibGUkKSB7XG4iCisgICAgIiAgICAkbmFtZSRfID0gbmV3IDo6c3RkOjpzdHJpbmc7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRuYW1lJF8tPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lICIKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSB7XG4iCisgICAgIiAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICBpZiAoJG5hbWUkXyA9PSAkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgOjpzdGQ6OnN0cmluZztcbiIKKyAgICAiICB9XG4iCisgICAgIiAgJG5hbWUkXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICIgIGlmICgkbmFtZSRfID09ICRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgICAgJG5hbWUkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgICAgJG5hbWUkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nKCokZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiICB9XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjpyZWxlYXNlXyRuYW1lJCgpIHtcbiIKKyAgICAiICBjbGVhcl9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgaWYgKCRuYW1lJF8gPT0gJGRlZmF1bHRfdmFyaWFibGUkKSB7XG4iCisgICAgIiAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAiICB9IGVsc2Uge1xuIgorICAgICIgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9ICRuYW1lJF87XG4iCisgICAgIiAgICAkbmFtZSRfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKDo6c3RkOjpzdHJpbmcqICRuYW1lJCkge1xuIgorICAgICIgIGlmICgkbmFtZSRfICE9ICRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgorICAgICIgICAgZGVsZXRlICRuYW1lJF87XG4iCisgICAgIiAgfVxuIgorICAgICIgIGlmICgkbmFtZSQpIHtcbiIKKyAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgICAkbmFtZSRfID0gJG5hbWUkO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICBjbGVhcl9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgICAkbmFtZSRfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgLy8gSW5pdGlhbGl6ZWQgaW4gR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICI6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6JGRlZmF1bHRfdmFyaWFibGUkID0gTlVMTDtcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICgkbmFtZSRfICE9ICRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgorICAgICAgIiAgJG5hbWUkXy0+Y2xlYXIoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICgkbmFtZSRfICE9ICRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgorICAgICAgIiAgJG5hbWUkXy0+YXNzaWduKCokZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAic2V0XyRuYW1lJChmcm9tLiRuYW1lJCgpKTtcbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGQ6OnN3YXAoJG5hbWUkXywgb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigkZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJG5hbWUkXyAhPSAkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIKKyAgICAiICBkZWxldGUgJG5hbWUkXztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkY2xhc3NuYW1lJDo6JGRlZmF1bHRfdmFyaWFibGUkID1cbiIKKyAgICAgICIgICAgbmV3IDo6c3RkOjpzdHJpbmcoJGRlZmF1bHQkLCAkZGVmYXVsdF9sZW5ndGgkKTtcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJkZWxldGUgJGNsYXNzbmFtZSQ6OiRkZWZhdWx0X3ZhcmlhYmxlJDtcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWQkZGVjbGFyZWRfdHlwZSQoXG4iCisgICAgIiAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSk7XG4iKTsKKyAgaWYgKEhhc1V0ZjhWZXJpZmljYXRpb24oZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgICAgIGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhcbiIKKyAgICAgICIgIHRoaXMtPiRuYW1lJCgpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKCkubGVuZ3RoKCksXG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7XG4iKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCisgICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCisgICAgICAiICB0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRkZWNsYXJlZF90eXBlJChcbiIKKyAgICAiICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIG91dHB1dCk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc1V0ZjhWZXJpZmljYXRpb24oZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgICAgIGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhcbiIKKyAgICAgICIgIHRoaXMtPiRuYW1lJCgpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKCkubGVuZ3RoKCksXG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAidGFyZ2V0ID1cbiIKKyAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSRUb0FycmF5KFxuIgorICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCB0YXJnZXQpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplKFxuIgorICAgICIgICAgdGhpcy0+JG5hbWUkKCkpO1xuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CisgIFNldFN0cmluZ1ZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXywgb3B0aW9ucyk7Cit9CisKK1JlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFNlZSBjb21tZW50IGFib3ZlIGFib3V0IHVua25vd24gY3R5cGVzLgorICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5jdHlwZSgpICE9IEZpZWxkT3B0aW9uczo6U1RSSU5HKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiBwcml2YXRlOlxuIgorICAgICAgIiAgLy8gSGlkZGVuIGR1ZSB0byB1bmtub3duIGN0eXBlIG9wdGlvbi5cbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRuYW1lJChpbnQgaW5kZXgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfJG5hbWUkKGludCBpbmRleCkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSAiCisgICAgInZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsIGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqIGFkZF8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIGFkZF8kbmFtZSQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgYWRkXyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBhZGRfJG5hbWUkKGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJDtcbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiAkbmFtZSQoKSBjb25zdCIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlXyRuYW1lJCgpIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJDtcbiIpOworCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLmN0eXBlKCkgIT0gRmllbGRPcHRpb25zOjpTVFJJTkcpIHsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIiBwdWJsaWM6XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6JG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLiRjcHBnZXQkKGluZGV4KTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKGludCBpbmRleCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLk11dGFibGUoaW5kZXgpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHtcbiIKKyAgICAiICAkbmFtZSRfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHtcbiIKKyAgICAiICAkbmFtZSRfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICIKKyAgICAiJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQiCisgICAgIihpbnQgaW5kZXgsIGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHtcbiIKKyAgICAiICAkbmFtZSRfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oXG4iCisgICAgIiAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5BZGQoKTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkge1xuIgorICAgICIgICRuYW1lJF8uQWRkKCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpIHtcbiIKKyAgICAiICAkbmFtZSRfLkFkZCgpLT5hc3NpZ24odmFsdWUpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICIKKyAgICAiJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkge1xuIgorICAgICIgICRuYW1lJF8uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpO1xuIgorICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mXG4iCisgICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qXG4iCisgICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJiRuYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uQ2xlYXIoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5NZXJnZUZyb20oZnJvbS4kbmFtZSRfKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBOb3QgbmVlZGVkIGZvciByZXBlYXRlZCBmaWVsZHMuCit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZCRkZWNsYXJlZF90eXBlJChcbiIKKyAgICAiICAgICAgaW5wdXQsIHRoaXMtPmFkZF8kbmFtZSQoKSkpO1xuIik7CisgIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCisgICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCisgICAgICAiICB0aGlzLT4kbmFtZSQodGhpcy0+JG5hbWUkX3NpemUoKSAtIDEpLmRhdGEoKSxcbiIKKyAgICAgICIgIHRoaXMtPiRuYW1lJCh0aGlzLT4kbmFtZSRfc2l6ZSgpIC0gMSkubGVuZ3RoKCksXG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOworICBpZiAoSGFzVXRmOFZlcmlmaWNhdGlvbihkZXNjcmlwdG9yXy0+ZmlsZSgpKSAmJgorICAgICAgZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKFxuIgorICAgICAgIiAgdGhpcy0+JG5hbWUkKGkpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKGkpLmxlbmd0aCgpLFxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkKFxuIgorICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOworICBpZiAoSGFzVXRmOFZlcmlmaWNhdGlvbihkZXNjcmlwdG9yXy0+ZmlsZSgpKSAmJgorICAgICAgZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCisgICAgICAiICAgIHRoaXMtPiRuYW1lJChpKS5kYXRhKCksIHRoaXMtPiRuYW1lJChpKS5sZW5ndGgoKSxcbiIKKyAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICIgICAgV3JpdGUkZGVjbGFyZWRfdHlwZSRUb0FycmF5KCRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgKiB0aGlzLT4kbmFtZSRfc2l6ZSgpO1xuIgorICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIgorICAgICIgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRkZWNsYXJlZF90eXBlJFNpemUoXG4iCisgICAgIiAgICB0aGlzLT4kbmFtZSQoaSkpO1xuIgorICAgICJ9XG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2NDEzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NUUklOR19GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TVFJJTkdfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworY2xhc3MgU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgflN0cmluZ0ZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2h1dGRvd25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyaW5nRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgflJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NUUklOR19GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0YTgxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvCkBAIC0wLDAgKzEsMTIzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhhdCB2YXJpb3VzIGlkZW50aWZpZXJzIHdvcmsgYXMgZmllbGQgYW5kIHR5cGUgbmFtZXMgZXZlbgorLy8gdGhvdWdoIHRoZSBzYW1lIGlkZW50aWZpZXJzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIEMrKyBjb2RlIGdlbmVyYXRvci4KKworCisvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAorb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAorCisvLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKKy8vIFRlc3QgdGhhdCBmaWVsZHMgY2FuIGhhdmUgbmFtZXMgbGlrZSAiaW5wdXQiIGFuZCAiaSIgd2hpY2ggYXJlIGFsc28gdXNlZAorLy8gaW50ZXJuYWxseSBieSB0aGUgY29kZSBnZW5lcmF0b3IgZm9yIGxvY2FsIHZhcmlhYmxlcy4KK21lc3NhZ2UgVGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXMgeworICBtZXNzYWdlIEJ1aWxkRGVzY3JpcHRvcnMge30KKyAgbWVzc2FnZSBUeXBlVHJhaXRzIHt9CisKKyAgb3B0aW9uYWwgaW50MzIgaW5wdXQgPSAxOworICBvcHRpb25hbCBpbnQzMiBvdXRwdXQgPSAyOworICBvcHRpb25hbCBzdHJpbmcgbGVuZ3RoID0gMzsKKyAgcmVwZWF0ZWQgaW50MzIgaSA9IDQ7CisgIHJlcGVhdGVkIHN0cmluZyBuZXdfZWxlbWVudCA9IDUgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIGludDMyIHRvdGFsX3NpemUgPSA2OworICBvcHRpb25hbCBpbnQzMiB0YWcgPSA3OworCisgIGVudW0gVGVzdEVudW0geyBGT08gPSAxOyB9CisgIG1lc3NhZ2UgRGF0YTEgeyByZXBlYXRlZCBpbnQzMiBkYXRhID0gMTsgfQorICBtZXNzYWdlIERhdGEyIHsgcmVwZWF0ZWQgVGVzdEVudW0gZGF0YSA9IDE7IH0KKyAgbWVzc2FnZSBEYXRhMyB7IHJlcGVhdGVkIHN0cmluZyBkYXRhID0gMTsgfQorICBtZXNzYWdlIERhdGE0IHsgcmVwZWF0ZWQgRGF0YTQgZGF0YSA9IDE7IH0KKyAgbWVzc2FnZSBEYXRhNSB7IHJlcGVhdGVkIHN0cmluZyBkYXRhID0gMSBbY3R5cGU9U1RSSU5HX1BJRUNFXTsgfQorICBtZXNzYWdlIERhdGE2IHsgcmVwZWF0ZWQgc3RyaW5nIGRhdGEgPSAxIFtjdHlwZT1DT1JEXTsgfQorCisgIG9wdGlvbmFsIGludDMyIHNvdXJjZSA9IDg7CisgIG9wdGlvbmFsIGludDMyIHZhbHVlID0gOTsKKyAgb3B0aW9uYWwgaW50MzIgZmlsZSA9IDEwOworICBvcHRpb25hbCBpbnQzMiBmcm9tID0gMTE7CisgIG9wdGlvbmFsIGludDMyIGhhbmRsZV91bmludGVycHJldGVkID0gMTI7CisgIHJlcGVhdGVkIGludDMyIGluZGV4ID0gMTM7CisgIG9wdGlvbmFsIGludDMyIGNvbnRyb2xsZXIgPSAxNDsKKyAgb3B0aW9uYWwgaW50MzIgYWxyZWFkeV9oZXJlID0gMTU7CisKKyAgb3B0aW9uYWwgdWludDMyIHVpbnQzMiA9IDE2OworICBvcHRpb25hbCB1aW50NjQgdWludDY0ID0gMTc7CisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmcgPSAxODsKKyAgb3B0aW9uYWwgaW50MzIgbWVtc2V0ID0gMTk7CisgIG9wdGlvbmFsIGludDMyIGludDMyID0gMjA7CisgIG9wdGlvbmFsIGludDY0IGludDY0ID0gMjE7CisKKyAgb3B0aW9uYWwgdWludDMyIGNhY2hlZF9zaXplID0gMjI7CisgIG9wdGlvbmFsIHVpbnQzMiBleHRlbnNpb25zID0gMjM7CisgIG9wdGlvbmFsIHVpbnQzMiBiaXQgPSAyNDsKKyAgb3B0aW9uYWwgdWludDMyIGJpdHMgPSAyNTsKKyAgb3B0aW9uYWwgdWludDMyIG9mZnNldHMgPSAyNjsKKyAgb3B0aW9uYWwgdWludDMyIHJlZmxlY3Rpb24gPSAyNzsKKworICBtZXNzYWdlIENvcmQge30KKyAgb3B0aW9uYWwgc3RyaW5nIHNvbWVfY29yZCA9IDI4IFtjdHlwZT1DT1JEXTsKKworICBtZXNzYWdlIFN0cmluZ1BpZWNlIHt9CisgIG9wdGlvbmFsIHN0cmluZyBzb21lX3N0cmluZ19waWVjZSA9IDI5IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworCisgIC8vIFNvbWUga2V5d29yZHMuCisgIG9wdGlvbmFsIHVpbnQzMiBpbnQgPSAzMDsKKyAgb3B0aW9uYWwgdWludDMyIGZyaWVuZCA9IDMxOworCisgIC8vIFRoZSBnZW5lcmF0b3IgdXNlZCB0byAjZGVmaW5lIGEgbWFjcm8gY2FsbGVkICJETyIgaW5zaWRlIHRoZSAuY2MgZmlsZS4KKyAgbWVzc2FnZSBETyB7fQorICBvcHRpb25hbCBETyBkbyA9IDMyOworCisgIC8vIFNvbWUgdGVtcGxhdGUgcGFyYW1ldGVyIG5hbWVzIGZvciBleHRlbnNpb25zLgorICBvcHRpb25hbCBpbnQzMiBmaWVsZF90eXBlID0gMzM7CisgIG9wdGlvbmFsIGJvb2wgaXNfcGFja2VkID0gMzQ7CisKKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworbWVzc2FnZSBUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lc0V4dGVuc2lvbiB7CisgIGV4dGVuZCBUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lcyB7CisgICAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzJfZXh0ID0gMjA0MjM2MzggW3BhY2tlZD10cnVlXTsKKyAgfQorfQorCittZXNzYWdlIER1bW15TWVzc2FnZSB7fQorCitzZXJ2aWNlIFRlc3RDb25mbGljdGluZ01ldGhvZE5hbWVzIHsKKyAgcnBjIENsb3N1cmUoRHVtbXlNZXNzYWdlKSByZXR1cm5zIChEdW1teU1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWFlMjliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzU0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUbyB0ZXN0IHRoZSBjb2RlIGdlbmVyYXRvciwgd2UgYWN0dWFsbHkgdXNlIGl0IHRvIGdlbmVyYXRlIGNvZGUgZm9yCisvLyBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8sIHRoZW4gdGVzdCB0aGF0LiAgVGhpcyBtZWFucyB0aGF0IHdlCisvLyBhcmUgYWN0dWFsbHkgdGVzdGluZyB0aGUgcGFyc2VyIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtIGF0IHRoZSBzYW1lCisvLyB0aW1lLCBhbmQgdGhhdCBwcm9ibGVtcyBpbiB0aGUgZ2VuZXJhdG9yIG1heSBzaG93IHVwIGFzIGNvbXBpbGUtdGltZSBlcnJvcnMKKy8vIHJhdGhlciB0aGFuIHVuaXR0ZXN0IGZhaWx1cmVzLCB3aGljaCBtYXkgYmUgc3VycHJpc2luZy4gIEhvd2V2ZXIsIHRlc3RpbmcKKy8vIHRoZSBvdXRwdXQgb2YgdGhlIEMrKyBnZW5lcmF0b3IgZGlyZWN0bHkgd291bGQgYmUgdmVyeSBoYXJkLiAgV2UgY2FuJ3QgdmVyeQorLy8gd2VsbCBqdXN0IGNoZWNrIGl0IGFnYWluc3QgZ29sZGVuIGZpbGVzIHNpbmNlIHRob3NlIGZpbGVzIHdvdWxkIGhhdmUgdG8gYmUKKy8vIHVwZGF0ZWQgZm9yIGFueSBzbWFsbCBjaGFuZ2U7IHN1Y2ggYSB0ZXN0IHdvdWxkIGJlIHZlcnkgYnJpdHRsZSBhbmQgcHJvYmFibHkKKy8vIG5vdCB2ZXJ5IGhlbHBmdWwuICBXaGF0IHdlIHJlYWxseSB3YW50IHRvIHRlc3QgaXMgdGhhdCB0aGUgY29kZSBjb21waWxlcworLy8gY29ycmVjdGx5IGFuZCBwcm9kdWNlcyB0aGUgaW50ZXJmYWNlcyB3ZSBleHBlY3QsIHdoaWNoIGlzIHdoeSB0aGlzIHRlc3QKKy8vIGlzIHdyaXR0ZW4gdGhpcyB3YXkuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ2FuJ3QgdXNlIGFuIGFub255bW91cyBuYW1lc3BhY2UgaGVyZSBkdWUgdG8gYnJva2VubmVzcyBvZiBUcnU2NCBjb21waWxlci4KK25hbWVzcGFjZSBjcHBfdW5pdHRlc3QgeworCituYW1lc3BhY2UgcHJvdG9idWZfdW5pdHRlc3QgPSA6OnByb3RvYnVmX3VuaXR0ZXN0OworCisKK2NsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKworICBzdHJpbmcgdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICB9Cit9OworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworLy8gVGVzdCB0aGF0IGdlbmVyYXRlZCBjb2RlIGhhcyBwcm9wZXIgZGVzY3JpcHRvcnM6CisvLyBQYXJzZSBhIGRlc2NyaXB0b3IgZGlyZWN0bHkgKHVzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpJbXBvcnRlcikgYW5kCisvLyBjb21wYXJlIGl0IHRvIHRoZSBvbmUgdGhhdCB3YXMgcHJvZHVjZWQgYnkgZ2VuZXJhdGVkIGNvZGUuCitURVNUKEdlbmVyYXRlZERlc2NyaXB0b3JUZXN0LCBJZGVudGljYWxEZXNjcmlwdG9ycykgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZ2VuZXJhdGVkX2Rlc2NyaXB0b3IgPQorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworCisgIC8vIFNldCB1cCB0aGUgSW1wb3J0ZXIuCisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOworICBzb3VyY2VfdHJlZS5NYXBQYXRoKCIiLCBUZXN0U291cmNlRGlyKCkpOworICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIEltcG9ydCAocGFyc2UpIHVuaXR0ZXN0LnByb3RvLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGFyc2VkX2Rlc2NyaXB0b3IgPQorICAgIGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIik7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKKyAgQVNTRVJUX1RSVUUocGFyc2VkX2Rlc2NyaXB0b3IgIT0gTlVMTCk7CisKKyAgLy8gVGVzdCB0aGF0IGRlc2NyaXB0b3JzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5IGJ5IGNvbnZlcnRpbmcgdGhlbSB0bworICAvLyBGaWxlRGVzY3JpcHRvclByb3RvcyBhbmQgY29tcGFyaW5nLgorICBGaWxlRGVzY3JpcHRvclByb3RvIGdlbmVyYXRlZF9kZWNzcmlwdG9yX3Byb3RvLCBwYXJzZWRfZGVzY3JpcHRvcl9wcm90bzsKKyAgZ2VuZXJhdGVkX2Rlc2NyaXB0b3ItPkNvcHlUbygmZ2VuZXJhdGVkX2RlY3NyaXB0b3JfcHJvdG8pOworICBwYXJzZWRfZGVzY3JpcHRvci0+Q29weVRvKCZwYXJzZWRfZGVzY3JpcHRvcl9wcm90byk7CisKKyAgRVhQRUNUX0VRKHBhcnNlZF9kZXNjcmlwdG9yX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAgICAgICBnZW5lcmF0ZWRfZGVjc3JpcHRvcl9wcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIERlZmF1bHRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisKKyAgLy8gTWVzc2FnZXMgc2hvdWxkIHJldHVybiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyB1bnRpbCBmaXJzdCB1c2UuCisgIC8vIChUaGlzIGlzIG5vdCBjaGVja2VkIGJ5IEV4cGVjdENsZWFyKCkgc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHRydWUgYWZ0ZXIKKyAgLy8gdGhlIGZpZWxkcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGVuIGNsZWFyZWQuKQorICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXA6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsZ3JvdXAoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRmxvYXRpbmdQb2ludERlZmF1bHRzKSB7CisgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMmIGV4dHJlbWVfZGVmYXVsdCA9CisgICAgICB1bml0dGVzdDo6VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOjpkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgRVhQRUNUX0VRKDAuMGYsIGV4dHJlbWVfZGVmYXVsdC56ZXJvX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoMS4wZiwgZXh0cmVtZV9kZWZhdWx0Lm9uZV9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDEuNWYsIGV4dHJlbWVfZGVmYXVsdC5zbWFsbF9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKC0xLjBmLCBleHRyZW1lX2RlZmF1bHQubmVnYXRpdmVfb25lX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoLTEuNWYsIGV4dHJlbWVfZGVmYXVsdC5uZWdhdGl2ZV9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDIuMGU4ZiwgZXh0cmVtZV9kZWZhdWx0LmxhcmdlX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoLThlLTI4ZiwgZXh0cmVtZV9kZWZhdWx0LnNtYWxsX25lZ2F0aXZlX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEobnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSwKKyAgICAgICAgICAgIGV4dHJlbWVfZGVmYXVsdC5pbmZfZG91YmxlKCkpOworICBFWFBFQ1RfRVEoLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCksCisgICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQubmVnX2luZl9kb3VibGUoKSk7CisgIEVYUEVDVF9UUlVFKGV4dHJlbWVfZGVmYXVsdC5uYW5fZG91YmxlKCkgIT0gZXh0cmVtZV9kZWZhdWx0Lm5hbl9kb3VibGUoKSk7CisgIEVYUEVDVF9FUShudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCksCisgICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQuaW5mX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoLW51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSwKKyAgICAgICAgICAgIGV4dHJlbWVfZGVmYXVsdC5uZWdfaW5mX2Zsb2F0KCkpOworICBFWFBFQ1RfVFJVRShleHRyZW1lX2RlZmF1bHQubmFuX2Zsb2F0KCkgIT0gZXh0cmVtZV9kZWZhdWx0Lm5hbl9mbG9hdCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgVHJpZ3JhcGgpIHsKKyAgY29uc3QgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyYgZXh0cmVtZV9kZWZhdWx0ID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKworICBFWFBFQ1RfRVEoIj8gPyA/PyA/PyA/Pz8gP1w/LyA/XD8tIiwgZXh0cmVtZV9kZWZhdWx0LmNwcF90cmlncmFwaCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRXh0cmVtZVNtYWxsSW50ZWdlckRlZmF1bHQpIHsKKyAgY29uc3QgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyYgZXh0cmVtZV9kZWZhdWx0ID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgRVhQRUNUX0VRKC0weDgwMDAwMDAwLCBraW50MzJtaW4pOworICBFWFBFQ1RfRVEoR09PR0xFX0xPTkdMT05HKC0weDgwMDAwMDAwMDAwMDAwMDApLCBraW50NjRtaW4pOworICBFWFBFQ1RfRVEoa2ludDMybWluLCBleHRyZW1lX2RlZmF1bHQucmVhbGx5X3NtYWxsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoa2ludDY0bWluLCBleHRyZW1lX2RlZmF1bHQucmVhbGx5X3NtYWxsX2ludDY0KCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBBY2Nlc3NvcnMpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gZ28gYmFjayBhbmQgY2hlY2sgYWxsIHRob3NlCisgIC8vIHZhbHVlcy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBNdXRhYmxlU3RyaW5nRGVmYXVsdCkgeworICAvLyBtdXRhYmxlX2ZvbygpIGZvciBhIHN0cmluZyBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIGluaXRpYWxpemVkIHRvIGl0cworICAvLyBkZWZhdWx0IHZhbHVlLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0VRKCJoZWxsbyIsICptZXNzYWdlLm11dGFibGVfZGVmYXVsdF9zdHJpbmcoKSk7CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBmaXJzdCB0aW1lIHdlIGNhbGwgbXV0YWJsZV9mb28oKSwgd2UgZ2V0IGEgbmV3bHktYWxsb2NhdGVkCisgIC8vIHN0cmluZywgYnV0IGlmIHdlIGNsZWFyIGl0IGFuZCBjYWxsIGl0IGFnYWluLCB3ZSBnZXQgdGhlIHNhbWUgb2JqZWN0IGFnYWluLgorICAvLyBXZSBzaG91bGQgdmVyaWZ5IHRoYXQgaXQgaGFzIGl0cyBkZWZhdWx0IHZhbHVlIGluIGJvdGggY2FzZXMuCisgIG1lc3NhZ2Uuc2V0X2RlZmF1bHRfc3RyaW5nKCJibGFoIik7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKworICBFWFBFQ1RfRVEoImhlbGxvIiwgKm1lc3NhZ2UubXV0YWJsZV9kZWZhdWx0X3N0cmluZygpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3RyaW5nRGVmYXVsdHMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBtZXNzYWdlOworICAvLyBDaGVjayBpZiAnXDAwMCcgY2FuIGJlIHVzZWQgaW4gZGVmYXVsdCBzdHJpbmcgdmFsdWUuCisgIEVYUEVDVF9FUShzdHJpbmcoImhlbFwwMDBsbyIsIDYpLCBtZXNzYWdlLnN0cmluZ193aXRoX3plcm8oKSk7CisgIEVYUEVDVF9FUShzdHJpbmcoIndvclwwMDBsZCIsIDYpLCBtZXNzYWdlLmJ5dGVzX3dpdGhfemVybygpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVsZWFzZVN0cmluZykgeworICAvLyBDaGVjayB0aGF0IHJlbGVhc2VfZm9vKCkgc3RhcnRzIG91dCBOVUxMLCBhbmQgZ2l2ZXMgdXMgYSB2YWx1ZQorICAvLyB0aGF0IHdlIGNhbiBkZWxldGUgYWZ0ZXIgaXQncyBiZWVuIHNldC4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2VfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfZGVmYXVsdF9zdHJpbmcoImJsYWgiKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIHN0cmluZyogc3RyID0gbWVzc2FnZS5yZWxlYXNlX2RlZmF1bHRfc3RyaW5nKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3N0cmluZygpKTsKKyAgQVNTRVJUX1RSVUUoc3RyICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImJsYWgiLCAqc3RyKTsKKyAgZGVsZXRlIHN0cjsKKworICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX2RlZmF1bHRfc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBSZWxlYXNlTWVzc2FnZSkgeworICAvLyBDaGVjayB0aGF0IHJlbGVhc2VfZm9vKCkgc3RhcnRzIG91dCBOVUxMLCBhbmQgZ2l2ZXMgdXMgYSB2YWx1ZQorICAvLyB0aGF0IHdlIGNhbiBkZWxldGUgYWZ0ZXIgaXQncyBiZWVuIHNldC4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEpOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBuZXN0ID0KKyAgICAgIG1lc3NhZ2UucmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEFTU0VSVF9UUlVFKG5lc3QgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgxLCBuZXN0LT5iYigpKTsKKyAgZGVsZXRlIG5lc3Q7CisKKyAgRVhQRUNUX0VRKE5VTEwsIG1lc3NhZ2UucmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBTZXRBbGxvY2F0ZWRTdHJpbmcpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXRfYWxsb2NhdGVkX2ZvbygpIHdvcmtzIGZvciBzdHJpbmdzLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZygpKTsKKyAgY29uc3Qgc3RyaW5nIGtIZWxsbygiaGVsbG8iKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKGtIZWxsbyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZygpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfc3RyaW5nKE5VTEwpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworCisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9vcHRpb25hbF9zdHJpbmcobmV3IHN0cmluZyhrSGVsbG8pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoa0hlbGxvLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZygpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU2V0QWxsb2NhdGVkTWVzc2FnZSkgeworICAvLyBDaGVjayB0aGF0IHNldF9hbGxvY2F0ZWRfZm9vKCkgY2FuIGJlIGNhbGxlZCBpbiBhbGwgY2FzZXMuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5zZXRfYWxsb2NhdGVkX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKE5VTEwpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdCA9CisgICAgICBtZXNzYWdlLnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKyAgQVNTRVJUX1RSVUUobmVzdCAhPSBOVUxMKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworCisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZShuZXN0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIENsZWFyKSB7CisgIC8vIFNldCBldmVyeSBmaWVsZCB0byBhIHVuaXF1ZSB2YWx1ZSwgY2xlYXIgdGhlIG1lc3NhZ2UsIHRoZW4gY2hlY2sgdGhhdAorICAvLyBpdCBpcyBjbGVhcmVkLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworCisgIC8vIFVubGlrZSB3aXRoIHRoZSBkZWZhdWx0cyB0ZXN0LCB3ZSBkbyBOT1QgZXhwZWN0IHRoYXQgcmVxdWVzdGluZyBlbWJlZGRlZAorICAvLyBtZXNzYWdlcyB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2UuICBJbnN0ZWFkLCB0aGV5CisgIC8vIHNob3VsZCByZXR1cm4gdGhlIG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgd2hlbiBtdXRhYmxlX2JsYWgoKSB3YXMKKyAgLy8gY2FsbGVkLgorICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXA6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsZ3JvdXAoKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRW1iZWRkZWROdWxsc0luQnl0ZXNDaGFyU3RhcikgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgY29uc3QgY2hhciogdmFsdWUgPSAiXDBsYWxhbGFcMFwwIjsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfYnl0ZXModmFsdWUsIDkpOworICBBU1NFUlRfRVEoOSwgbWVzc2FnZS5vcHRpb25hbF9ieXRlcygpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAodmFsdWUsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMoKS5kYXRhKCksIDkpKTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9ieXRlcyh2YWx1ZSwgOSk7CisgIEFTU0VSVF9FUSg5LCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKDApLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAodmFsdWUsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMoMCkuZGF0YSgpLCA5KSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIENsZWFyT25lRmllbGQpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlLCB0aGVuIGNsZWFyIG9uZSB2YWx1ZSBhbmQgaW5zdXJlIHRoYXQKKyAgLy8gb25seSB0aGF0IG9uZSB2YWx1ZSBpcyBjbGVhcmVkLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIGludDY0IG9yaWdpbmFsX3ZhbHVlID0gbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCgpOworCisgIC8vIENsZWFyIHRoZSBmaWVsZCBhbmQgbWFrZSBzdXJlIGl0IHNob3dzIHVwIGFzIGNsZWFyZWQuCisgIG1lc3NhZ2UuY2xlYXJfb3B0aW9uYWxfaW50NjQoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCgpKTsKKworICAvLyBPdGhlciBhZGphY2VudCBmaWVsZHMgc2hvdWxkIG5vdCBiZSBjbGVhcmVkLgorICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyKCkpOworCisgIC8vIE1ha2Ugc3VyZSBpZiB3ZSBzZXQgaXQgYWdhaW4sIHRoZW4gYWxsIGZpZWxkcyBhcmUgc2V0LgorICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQ2NChvcmlnaW5hbF92YWx1ZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFN0cmluZ0NoYXJTdGFyTGVuZ3RoKSB7CisgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiB1c2UgYSBjaGFyKixsZW5ndGggdG8gc2V0IG9uZSBvZiB0aGUgc3RyaW5nIGZpZWxkcy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9zdHJpbmcoImFiY2RlZiIsIDMpOworICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworCisgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiB1c2UgYSBjaGFyKixsZW5ndGggdG8gYWRkIHRvIGEgcmVwZWF0ZWQgc3RyaW5nIGZpZWxkLgorICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImFiY2RlZiIsIDMpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJhYmMiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHVzZSBhIGNoYXIqLGxlbmd0aCB0byBzZXQgYSByZXBlYXRlZCBzdHJpbmcgZmllbGQuCisgIG1lc3NhZ2Uuc2V0X3JlcGVhdGVkX3N0cmluZygwLCAid3h5eiIsIDIpOworICBFWFBFQ1RfRVEoInd4IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoMCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBDb3B5RnJvbSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgLy8gQ29weWluZyBmcm9tIHNlbGYgc2hvdWxkIGJlIGEgbm8tb3AuCisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFN3YXBXaXRoRW1wdHkpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UyKTsKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UxKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3dhcFdpdGhTZWxmKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIG1lc3NhZ2UuU3dhcCgmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFN3YXBXaXRoT3RoZXIpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2ludDMyKDEyMyk7CisgIG1lc3NhZ2UxLnNldF9vcHRpb25hbF9zdHJpbmcoImFiYyIpOworICBtZXNzYWdlMS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9pbnQzMigxKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX2ludDMyKDIpOworICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhIik7CisgIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9zdHJpbmcoImIiKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig3KTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig4KTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOworCisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMig0NTYpOworICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKCJkZWYiKTsKKyAgbWVzc2FnZTIubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMik7CisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOworICBtZXNzYWdlMi5hZGRfcmVwZWF0ZWRfaW50MzIoMyk7CisgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9zdHJpbmcoImMiKTsKKyAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig5KTsKKyAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CisKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworCisgIEVYUEVDVF9FUSg0NTYsIG1lc3NhZ2UxLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoImRlZiIsIG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMsIG1lc3NhZ2UxLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UxLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImMiLCBtZXNzYWdlMS5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDksIG1lc3NhZ2UxLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworCisgIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2UyLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UyLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UyLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImEiLCBtZXNzYWdlMi5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBFWFBFQ1RfRVEoImIiLCBtZXNzYWdlMi5yZXBlYXRlZF9zdHJpbmcoMSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDcsIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOworICBFWFBFQ1RfRVEoOCwgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9lbnVtKDEpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UyKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIENvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisgIG1lc3NhZ2UyID0gbWVzc2FnZTE7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlbGYtYXNzaWdubWVudCBkb2VzIHNvbWV0aGluZyBzYW5lLgorICBtZXNzYWdlMi5vcGVyYXRvcj0obWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworI2lmICFkZWZpbmVkKFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMpIHx8IFwKKyAgICAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSkKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFVwY2FzdENvcHlGcm9tKSB7CisgIC8vIFRlc3QgdGhlIENvcHlGcm9tIG1ldGhvZCB0aGF0IHRha2VzIGluIHRoZSBnZW5lcmljIGNvbnN0IE1lc3NhZ2UmCisgIC8vIHBhcmFtZXRlci4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgIGNvbnN0IE1lc3NhZ2UqIHNvdXJjZSA9IGltcGxpY2l0X2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KCZtZXNzYWdlMSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKCpzb3VyY2UpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworfQorI2VuZGlmCisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBEeW5hbWljTWVzc2FnZUNvcHlGcm9tKSB7CisgIC8vIFRlc3QgY29weWluZyBmcm9tIGEgRHluYW1pY01lc3NhZ2UsIHdoaWNoIG11c3QgZmFsbCBiYWNrIHRvIHVzaW5nCisgIC8vIHJlZmxlY3Rpb24uCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IHZlcnNpb24gb2YgdGhlIGR5bmFtaWMgbWVzc2FnZSB2aWEgdGhlIGZhY3RvcnkuCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UxOworICBtZXNzYWdlMS5yZXNldChmYWN0b3J5LkdldFByb3RvdHlwZSgKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSktPk5ldygpKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UxLmdldCgpKTsKKworICBtZXNzYWdlMi5Db3B5RnJvbSgqbWVzc2FnZTEpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIE5vbkVtcHR5TWVyZ2VGcm9tKSB7CisgIC8vIFRlc3QgbWVyZ2luZyB3aXRoIGEgbm9uLWVtcHR5IG1lc3NhZ2UuIENvZGUgaXMgYSBtb2RpZmllZCBmb3JtCisgIC8vIG9mIHRoYXQgZm91bmQgaW4gZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisKKyAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMihtZXNzYWdlMS5vcHRpb25hbF9pbnQzMigpKTsKKyAgbWVzc2FnZTEuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICAvLyBUaGlzIHRlc3RzIG92ZXJ3cml0aW5nLgorICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX3N0cmluZygic29tZXRoaW5nIGVsc2UiKTsKKworICAvLyBUaGlzIHRlc3RzIGNvbmNhdGVuYXRpbmcuCisgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9pbnQzMihtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMigxKSk7CisgIGludDMyIGkgPSBtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMigwKTsKKyAgbWVzc2FnZTEuY2xlYXJfcmVwZWF0ZWRfaW50MzIoKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX2ludDMyKGkpOworCisgIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMSk7Cit9CisKKyNpZiAhZGVmaW5lZChQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTKSB8fCBcCisgICAgIWRlZmluZWQoR09PR0xFX1BST1RPQlVGX05PX1JUVEkpCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgTWVyZ2VGcm9tU2VsZikgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIEVYUEVDVF9ERUFUSChtZXNzYWdlLk1lcmdlRnJvbShtZXNzYWdlKSwgIiZmcm9tIik7CisgIEVYUEVDVF9ERUFUSChtZXNzYWdlLk1lcmdlRnJvbShpbXBsaWNpdF9jYXN0PGNvbnN0IE1lc3NhZ2UmPihtZXNzYWdlKSksCisgICAgICAgICAgICAgICAiJmZyb20iKTsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUyB8fCAhR09PR0xFX1BST1RPQlVGX05PX1JUVEkKKworLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoKSwKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFNlcmlhbGl6YXRpb25Ub0FycmF5KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBzdHJpbmcgZGF0YTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7CisgIGRhdGEucmVzaXplKHNpemUpOworICB1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7CisgIHVpbnQ4KiBlbmQgPSBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHN0YXJ0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUGFja2VkRmllbGRzU2VyaWFsaXphdGlvblRvQXJyYXkpIHsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBwYWNrZWRfbWVzc2FnZTEsIHBhY2tlZF9tZXNzYWdlMjsKKyAgc3RyaW5nIHBhY2tlZF9kYXRhOworICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZwYWNrZWRfbWVzc2FnZTEpOworICBpbnQgcGFja2VkX3NpemUgPSBwYWNrZWRfbWVzc2FnZTEuQnl0ZVNpemUoKTsKKyAgcGFja2VkX2RhdGEucmVzaXplKHBhY2tlZF9zaXplKTsKKyAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmcGFja2VkX2RhdGEpKTsKKyAgdWludDgqIGVuZCA9IHBhY2tlZF9tZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgRVhQRUNUX0VRKHBhY2tlZF9zaXplLCBlbmQgLSBzdGFydCk7CisgIEVYUEVDVF9UUlVFKHBhY2tlZF9tZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcocGFja2VkX2RhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChwYWNrZWRfbWVzc2FnZTIpOworfQorCisvLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkgYnkgZm9yY2luZyB0aGUgYnVmZmVyIHRvIHdyaXRlCisvLyBvbmUgYnl0ZSBhdCBhIHRpbWUuCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBTZXJpYWxpemF0aW9uVG9TdHJlYW0pIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICBzdHJpbmcgZGF0YTsKKyAgZGF0YS5yZXNpemUoc2l6ZSk7CisgIHsKKyAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBQYWNrZWRGaWVsZHNTZXJpYWxpemF0aW9uVG9TdHJlYW0pIHsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICBzdHJpbmcgZGF0YTsKKyAgZGF0YS5yZXNpemUoc2l6ZSk7CisgIHsKKyAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBSZXF1aXJlZCkgeworICAvLyBUZXN0IHRoYXQgSXNJbml0aWFsaXplZCgpIHJldHVybnMgZmFsc2UgaWYgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgorICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgbWVzc2FnZS5zZXRfYSgxKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgbWVzc2FnZS5zZXRfYigyKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgbWVzc2FnZS5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBSZXF1aXJlZEZvcmVpZ24pIHsKKyAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBpbiBuZXN0ZWQKKyAgLy8gbWVzc2FnZXMgYXJlIG1pc3NpbmcuCisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2U7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2EoMSk7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9iKDIpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICBtZXNzYWdlLm11dGFibGVfcmVwZWF0ZWRfbWVzc2FnZSgwKS0+c2V0X2EoMSk7CisgIG1lc3NhZ2UubXV0YWJsZV9yZXBlYXRlZF9tZXNzYWdlKDApLT5zZXRfYigyKTsKKyAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX21lc3NhZ2UoMCktPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIEZvcmVpZ25OZXN0ZWQpIHsKKyAgLy8gVGVzdCB0aGF0IFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSBjYW4gYmUgZW1iZWRkZWQgZGlyZWN0bHkgaW50bworICAvLyBhbm90aGVyIG1lc3NhZ2UuCisgIHVuaXR0ZXN0OjpUZXN0Rm9yZWlnbk5lc3RlZCBtZXNzYWdlOworCisgIC8vIElmIHRoaXMgY29tcGlsZXMgYW5kIHJ1bnMgd2l0aG91dCBjcmFzaGluZywgaXQgbXVzdCB3b3JrLiAgV2UgaGF2ZQorICAvLyBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdGVkID0KKyAgICBtZXNzYWdlLm11dGFibGVfZm9yZWlnbl9uZXN0ZWQoKTsKKyAgbmVzdGVkLT5zZXRfYmIoMSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFJlYWxseUxhcmdlVGFnTnVtYmVyKSB7CisgIC8vIFRlc3QgdGhhdCByZWFsbHkgbGFyZ2UgdGFnIG51bWJlcnMgZG9uJ3QgYnJlYWsgYW55dGhpbmcuCisgIHVuaXR0ZXN0OjpUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBzdHJpbmcgZGF0YTsKKworICAvLyBGb3IgdGhlIG1vc3QgcGFydCwgaWYgdGhpcyBjb21waWxlcyBhbmQgcnVucyB0aGVuIHdlJ3JlIHByb2JhYmx5IGdvb2QuCisgIC8vIChUaGUgbW9zdCBsaWtlbHkgY2F1c2UgZm9yIGZhaWx1cmUgd291bGQgYmUgaWYgc29tZXRoaW5nIHdlcmUgYXR0ZW1wdGluZworICAvLyB0byBhbGxvY2F0ZSBhIGxvb2t1cCB0YWJsZSBvZiBzb21lIHNvcnQgdXNpbmcgdGFnIG51bWJlcnMgYXMgdGhlIGluZGV4LikKKyAgLy8gV2UnbGwgdHJ5IHNlcmlhbGl6aW5nIGp1c3QgZm9yIGZ1bi4KKyAgbWVzc2FnZTEuc2V0X2EoMTIzNCk7CisgIG1lc3NhZ2UxLnNldF9iYig1Njc4KTsKKyAgbWVzc2FnZTEuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBFWFBFQ1RfRVEoMTIzNCwgbWVzc2FnZTIuYSgpKTsKKyAgRVhQRUNUX0VRKDU2NzgsIG1lc3NhZ2UyLmJiKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBNdXR1YWxSZWN1cnNpb24pIHsKKyAgLy8gVGVzdCB0aGF0IG11dHVhbGx5LXJlY3Vyc2l2ZSBtZXNzYWdlIHR5cGVzIHdvcmsuCisgIHVuaXR0ZXN0OjpUZXN0TXV0dWFsUmVjdXJzaW9uQSBtZXNzYWdlOworICB1bml0dGVzdDo6VGVzdE11dHVhbFJlY3Vyc2lvbkEqIG5lc3RlZCA9IG1lc3NhZ2UubXV0YWJsZV9iYigpLT5tdXRhYmxlX2EoKTsKKyAgdW5pdHRlc3Q6OlRlc3RNdXR1YWxSZWN1cnNpb25BKiBuZXN0ZWQyID0gbmVzdGVkLT5tdXRhYmxlX2JiKCktPm11dGFibGVfYSgpOworCisgIC8vIEFnYWluLCBpZiB0aGUgYWJvdmUgY29tcGlsZXMgYW5kIHJ1bnMsIHRoYXQncyBhbGwgd2UgcmVhbGx5IGhhdmUgdG8KKyAgLy8gdGVzdCwgYnV0IGp1c3QgZm9yIHJ1biB3ZSdsbCBjaGVjayB0aGF0IHRoZSBzeXN0ZW0gZGlkbid0IHNvbWVob3cgY29tZQorICAvLyB1cCB3aXRoIGEgcG9pbnRlciBsb29wLi4uCisgIEVYUEVDVF9ORSgmbWVzc2FnZSwgbmVzdGVkKTsKKyAgRVhQRUNUX05FKCZtZXNzYWdlLCBuZXN0ZWQyKTsKKyAgRVhQRUNUX05FKG5lc3RlZCwgbmVzdGVkMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIENhbWVsQ2FzZUZpZWxkTmFtZXMpIHsKKyAgLy8gVGhpcyB0ZXN0IGlzIG1haW5seSBjaGVja2luZyB0aGF0IHRoZSBmb2xsb3dpbmcgY29tcGlsZXMsIHdoaWNoIHZlcmlmaWVzCisgIC8vIHRoYXQgdGhlIGZpZWxkIG5hbWVzIHdlcmUgY29lcmNlZCB0byBsb3dlci1jYXNlLgorICAvLworICAvLyBQcm90b2NvbCBidWZmZXJzIHN0YW5kYXJkIHN0eWxlIGlzIHRvIHVzZSBsb3dlcmNhc2Utd2l0aC11bmRlcnNjb3JlcyBmb3IKKyAgLy8gZmllbGQgbmFtZXMuICBTb21lIG9sZCBwcm90bzEgLnByb3RvcyB1bmZvcnR1bmF0ZWx5IHVzZWQgY2FtZWwtY2FzZSBmaWVsZAorICAvLyBuYW1lcy4gIEluIHByb3RvMSwgdGhlc2UgbmFtZXMgd2VyZSBmb3JjZWQgdG8gbG93ZXItY2FzZS4gIFNvLCB3ZSBkbyB0aGUKKyAgLy8gc2FtZSB0aGluZyBpbiBwcm90bzIuCisKKyAgdW5pdHRlc3Q6OlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5zZXRfcHJpbWl0aXZlZmllbGQoMik7CisgIG1lc3NhZ2Uuc2V0X3N0cmluZ2ZpZWxkKCJmb28iKTsKKyAgbWVzc2FnZS5zZXRfZW51bWZpZWxkKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyk7CisgIG1lc3NhZ2UubXV0YWJsZV9tZXNzYWdlZmllbGQoKS0+c2V0X2MoNik7CisKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRwcmltaXRpdmVmaWVsZCg4KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRzdHJpbmdmaWVsZCgicXV4Iik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkZW51bWZpZWxkKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkbWVzc2FnZWZpZWxkKCktPnNldF9jKDE1KTsKKworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5wcmltaXRpdmVmaWVsZCgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBtZXNzYWdlLnN0cmluZ2ZpZWxkKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fRk9PLCBtZXNzYWdlLmVudW1maWVsZCgpKTsKKyAgRVhQRUNUX0VRKDYsIG1lc3NhZ2UubWVzc2FnZWZpZWxkKCkuYygpKTsKKworICBFWFBFQ1RfRVEoOCwgbWVzc2FnZS5yZXBlYXRlZHByaW1pdGl2ZWZpZWxkKDApKTsKKyAgRVhQRUNUX0VRKCJxdXgiLCBtZXNzYWdlLnJlcGVhdGVkc3RyaW5nZmllbGQoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLCBtZXNzYWdlLnJlcGVhdGVkZW51bWZpZWxkKDApKTsKKyAgRVhQRUNUX0VRKDE1LCBtZXNzYWdlLnJlcGVhdGVkbWVzc2FnZWZpZWxkKDApLmMoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzKSB7CisgIC8vIHRlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIHN1Y2Nlc3NmdWxseSBjb21waWxlZCwgdGhlbiBpdCB3b3Jrcy4gIFRoZQorICAvLyBmb2xsb3dpbmcgaXMganVzdCBhIHRva2VuIHVzYWdlIHRvIGluc3VyZSB0aGF0IHRoZSBjb2RlIGlzLCBpbiBmYWN0LAorICAvLyBiZWluZyBjb21waWxlZCBhbmQgbGlua2VkLgorCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lcyBtZXNzYWdlOworICBtZXNzYWdlLnNldF91aW50MzIoMSk7CisgIEVYUEVDVF9FUSgzLCBtZXNzYWdlLkJ5dGVTaXplKCkpOworCisgIG1lc3NhZ2Uuc2V0X2ZyaWVuZF8oNSk7CisgIEVYUEVDVF9FUSg1LCBtZXNzYWdlLmZyaWVuZF8oKSk7CisKKyAgLy8gSW5zdGFudGlhdGUgZXh0ZW5zaW9uIHRlbXBsYXRlIGZ1bmN0aW9ucyB0byB0ZXN0IGNvbmZsaWN0aW5nIHRlbXBsYXRlCisgIC8vIHBhcmFtZXRlciBuYW1lcy4KKyAgdHlwZWRlZiBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXNFeHRlbnNpb24gRXh0ZW5zaW9uTWVzc2FnZTsKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24oRXh0ZW5zaW9uTWVzc2FnZTo6cmVwZWF0ZWRfaW50MzJfZXh0LCAxMjMpOworICBFWFBFQ1RfRVEoMTIzLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oRXh0ZW5zaW9uTWVzc2FnZTo6cmVwZWF0ZWRfaW50MzJfZXh0LCAwKSk7Cit9CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0T3B0aW1pemVkRm9yU2l6ZSkgeworICAvLyBXZSByZWx5IG9uIHRoZSB0ZXN0cyBpbiByZWZsZWN0aW9uX29wc191bml0dGVzdCBhbmQgd2lyZV9mb3JtYXRfdW5pdHRlc3QKKyAgLy8gdG8gcmVhbGx5IHRlc3QgdGhhdCByZWZsZWN0aW9uLWJhc2VkIG1ldGhvZHMgd29yay4gIEhlcmUgd2UgYXJlIG1vc3RseQorICAvLyBqdXN0IG1ha2luZyBzdXJlIHRoYXQgVGVzdE9wdGltaXplZEZvclNpemUgYWN0dWFsbHkgYnVpbGRzIGFuZCBzZWVtcyB0bworICAvLyBmdW5jdGlvbi4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE9wdGltaXplZEZvclNpemUgbWVzc2FnZSwgbWVzc2FnZTI7CisgIG1lc3NhZ2Uuc2V0X2koMSk7CisgIG1lc3NhZ2UubXV0YWJsZV9tc2coKS0+c2V0X2MoMik7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTIuaSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UyLm1zZygpLmMoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUpIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCBzb21ldGhpbmcgb3B0aW1pemVkIGZvciBzcGVlZCBjYW4gY29udGFpbiBzb21ldGhpbmcgb3B0aW1pemVkCisgIC8vIGZvciBzaXplLgorCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIG1lc3NhZ2UsIG1lc3NhZ2UyOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfaSgxKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpLT5tdXRhYmxlX21zZygpLT5zZXRfYygyKTsKKyAgc3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBBU1NFUlRfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTIub3B0aW9uYWxfbWVzc2FnZSgpLmkoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9tZXNzYWdlKDApLm1zZygpLmMoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFRlc3RTcGFjZVVzZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKKyAgLy8gc2l6ZW9mIHByb3ZpZGVzIGEgbG93ZXIgYm91bmQgb24gU3BhY2VVc2VkKCkuCisgIEVYUEVDVF9MRShzaXplb2YodW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyksIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKKyAgY29uc3QgaW50IGVtcHR5X21lc3NhZ2Vfc2l6ZSA9IG1lc3NhZ2UxLlNwYWNlVXNlZCgpOworCisgIC8vIFNldHRpbmcgcHJpbWl0aXZlIHR5cGVzIHNob3VsZG4ndCBhZmZlY3QgdGhlIHNwYWNlIHVzZWQuCisgIG1lc3NhZ2UxLnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfaW50NjQoMTIzNDUpOworICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfdWludDMyKDEyMyk7CisgIG1lc3NhZ2UxLnNldF9vcHRpb25hbF91aW50NjQoMTIzNDUpOworICBFWFBFQ1RfRVEoZW1wdHlfbWVzc2FnZV9zaXplLCBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7CisKKyAgLy8gT24gc29tZSBTVEwgaW1wbGVtZW50YXRpb25zLCBzZXR0aW5nIHRoZSBzdHJpbmcgdG8gYSBzbWFsbCB2YWx1ZSBzaG91bGQKKyAgLy8gb25seSBpbmNyZWFzZSBTcGFjZVVzZWQoKSBieSB0aGUgc2l6ZSBvZiBhIHN0cmluZyBvYmplY3QsIHRob3VnaCB0aGlzIGlzCisgIC8vIG5vdCB0cnVlIGV2ZXJ5d2hlcmUuCisgIG1lc3NhZ2UxLnNldF9vcHRpb25hbF9zdHJpbmcoImFiYyIpOworICBFWFBFQ1RfTEUoZW1wdHlfbWVzc2FnZV9zaXplICsgc2l6ZW9mKHN0cmluZyksIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKKworICAvLyBTZXR0aW5nIGEgc3RyaW5nIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZyBvYmplY3QgaXRzZWxmIHNob3VsZAorICAvLyBpbmNyZWFzZSBTcGFjZVVzZWQoKSwgYmVjYXVzZSBpdCBjYW5ub3Qgc3RvcmUgdGhlIHZhbHVlIGludGVybmFsbHkuCisgIG1lc3NhZ2UxLnNldF9vcHRpb25hbF9zdHJpbmcoc3RyaW5nKHNpemVvZihzdHJpbmcpICsgMSwgJ3gnKSk7CisgIGludCBtaW5fZXhwZWN0ZWRfaW5jcmVhc2UgPSBtZXNzYWdlMS5vcHRpb25hbF9zdHJpbmcoKS5jYXBhY2l0eSgpICsKKyAgICAgIHNpemVvZihzdHJpbmcpOworICBFWFBFQ1RfTEUoZW1wdHlfbWVzc2FnZV9zaXplICsgbWluX2V4cGVjdGVkX2luY3JlYXNlLAorICAgICAgICAgICAgbWVzc2FnZTEuU3BhY2VVc2VkKCkpOworCisgIGludCBwcmV2aW91c19zaXplID0gbWVzc2FnZTEuU3BhY2VVc2VkKCk7CisgIC8vIEFkZGluZyBhbiBvcHRpb25hbCBtZXNzYWdlIHNob3VsZCBpbmNyZWFzZSB0aGUgc2l6ZSBieSB0aGUgc2l6ZSBvZiB0aGUKKyAgLy8gbmVzdGVkIG1lc3NhZ2UgdHlwZS4gTmVzdGVkTWVzc2FnZSBpcyBzaW1wbGUgZW5vdWdoICgxIGludCBmaWVsZCkgdGhhdCBpdAorICAvLyBpcyBlcXVhbCB0byBzaXplb2YoTmVzdGVkTWVzc2FnZSkKKyAgbWVzc2FnZTEubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBBU1NFUlRfRVEoc2l6ZW9mKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UpLAorICAgICAgICAgICAgbWVzc2FnZTEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5TcGFjZVVzZWQoKSk7CisgIEVYUEVDVF9FUShwcmV2aW91c19zaXplICsKKyAgICAgICAgICAgIHNpemVvZih1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKSwKKyAgICAgICAgICAgIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKK30KKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIEZpZWxkQ29uc3RhbnRWYWx1ZXMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlOjprQmJGaWVsZE51bWJlciwgMSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprT3B0aW9uYWxJbnQzMkZpZWxkTnVtYmVyLCAxKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtPcHRpb25hbGdyb3VwRmllbGROdW1iZXIsIDE2KTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciwgMTgpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a09wdGlvbmFsTmVzdGVkRW51bUZpZWxkTnVtYmVyLCAyMSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyLCAzMSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWRncm91cEZpZWxkTnVtYmVyLCA0Nik7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIsIDQ4KTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtSZXBlYXRlZE5lc3RlZEVudW1GaWVsZE51bWJlciwgNTEpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBFeHRlbnNpb25Db25zdGFudFZhbHVlcykgeworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6a1NpbmdsZUZpZWxkTnVtYmVyLCAxMDAwKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OmtNdWx0aUZpZWxkTnVtYmVyLCAxMDAxKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyLCAxKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprT3B0aW9uYWxncm91cEV4dGVuc2lvbkZpZWxkTnVtYmVyLCAxNik7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6a09wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyLCAxOCk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6a09wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyLCAyMSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6a1JlcGVhdGVkSW50MzJFeHRlbnNpb25GaWVsZE51bWJlciwgMzEpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OmtSZXBlYXRlZGdyb3VwRXh0ZW5zaW9uRmllbGROdW1iZXIsIDQ2KTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIsIDQ4KTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIsIDUxKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUKEdlbmVyYXRlZEVudW1UZXN0LCBFbnVtVmFsdWVzQXNTd2l0Y2hDYXNlcykgeworICAvLyBUZXN0IHRoYXQgb3VyIG5lc3RlZCBlbnVtIHZhbHVlcyBjYW4gYmUgdXNlZCBhcyBzd2l0Y2ggY2FzZXMuICBUaGlzIHRlc3QKKyAgLy8gZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZywgdGhlIHByb29mIHRoYXQgaXQgd29ya3MgaXMgdGhhdCBpdAorICAvLyBjb21waWxlcy4KKyAgaW50IGkgPTA7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0gYSA9IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUjsKKyAgc3dpdGNoIChhKSB7CisgICAgY2FzZSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT086CisgICAgICBpID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSOgorICAgICAgaSA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWjoKKyAgICAgIGkgPSAzOworICAgICAgYnJlYWs7CisgICAgLy8gbm8gZGVmYXVsdCBjYXNlOiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIHJlY29nbml6ZXMgdGhhdAorICAgIC8vICAgYWxsIGNhc2VzIGFyZSBjb3ZlcmVkLiAgKEdDQyB3YXJucyBpZiB5b3UgZG8gbm90IGNvdmVyIGFsbCBjYXNlcyBvZgorICAgIC8vICAgYW4gZW51bSBpbiBhIHN3aXRjaC4pCisgIH0KKworICAvLyBUb2tlbiBjaGVjayBqdXN0IGZvciBmdW4uCisgIEVYUEVDVF9FUSgyLCBpKTsKK30KKworVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgSXNWYWxpZFZhbHVlKSB7CisgIC8vIFRlc3QgZW51bSBJc1ZhbGlkVmFsdWUuCisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgxKSk7CisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgyKSk7CisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgzKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgwKSk7CisgIEVYUEVDVF9GQUxTRSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoNCkpOworCisgIC8vIE1ha2Ugc3VyZSBpdCBhbHNvIHdvcmtzIHdoZW4gdGhlcmUgYXJlIGR1cHMuCisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDEpKTsKKyAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX0lzVmFsaWQoMikpOworICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCgzKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDApKTsKKyAgRVhQRUNUX0ZBTFNFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDQpKTsKK30KKworVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgTWluQW5kTWF4KSB7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sCisgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTik7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosCisgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01BWCk7CisgIEVYUEVDVF9FUSg0LCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0FSUkFZU0laRSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywgdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX01JTik7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosIHVuaXR0ZXN0OjpGb3JlaWduRW51bV9NQVgpOworICBFWFBFQ1RfRVEoNywgdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX0FSUkFZU0laRSk7CisKKyAgRVhQRUNUX0VRKDEsIHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9NSU4pOworICBFWFBFQ1RfRVEoMywgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX01BWCk7CisgIEVYUEVDVF9FUSg0LCB1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfQVJSQVlTSVpFKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlNQQVJTRV9FLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTUlOKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpTUEFSU0VfQywgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX01BWCk7CisgIEVYUEVDVF9FUSgxMjU4OTIzNSwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX0FSUkFZU0laRSk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiB0YWtlIHRoZSBhZGRyZXNzIG9mIF9NSU4sIF9NQVggYW5kIF9BUlJBWVNJWkUuCisgIHZvaWQqIG51bGxfcG9pbnRlciA9IDA7ICAvLyBOVUxMIG1heSBiZSBpbnRlZ2VyLXR5cGUsIG5vdCBwb2ludGVyLXR5cGUuCisgIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTik7CisgIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01BWCk7CisgIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0FSUkFZU0laRSk7CisKKyAgRVhQRUNUX05FKG51bGxfcG9pbnRlciwgJnVuaXR0ZXN0OjpGb3JlaWduRW51bV9NSU4pOworICBFWFBFQ1RfTkUobnVsbF9wb2ludGVyLCAmdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX01BWCk7CisgIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6Rm9yZWlnbkVudW1fQVJSQVlTSVpFKTsKKworICAvLyBNYWtlIHN1cmUgd2UgY2FuIHVzZSBfTUlOIGFuZCBfTUFYIGFzIHN3aXRjaCBjYXNlcy4KKyAgc3dpdGNoICh1bml0dGVzdDo6U1BBUlNFX0EpIHsKKyAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9NSU46CisgICAgY2FzZSB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTUFYOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitURVNUKEdlbmVyYXRlZEVudW1UZXN0LCBOYW1lKSB7CisgIC8vICJOYW1lcyIgaW4gdGhlIHByZXNlbmNlIG9mIGR1cCB2YWx1ZXMgYXJlIGEgYml0IGFyYml0cmFyeS4KKyAgRVhQRUNUX0VRKCJGT08xIiwgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX05hbWUodW5pdHRlc3Q6OkZPTzEpKTsKKyAgRVhQRUNUX0VRKCJGT08xIiwgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX05hbWUodW5pdHRlc3Q6OkZPTzIpKTsKKworICBFWFBFQ1RfRVEoIlNQQVJTRV9BIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9BKSk7CisgIEVYUEVDVF9FUSgiU1BBUlNFX0IiLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTmFtZSh1bml0dGVzdDo6U1BBUlNFX0IpKTsKKyAgRVhQRUNUX0VRKCJTUEFSU0VfQyIsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9OYW1lKHVuaXR0ZXN0OjpTUEFSU0VfQykpOworICBFWFBFQ1RfRVEoIlNQQVJTRV9EIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9EKSk7CisgIEVYUEVDVF9FUSgiU1BBUlNFX0UiLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTmFtZSh1bml0dGVzdDo6U1BBUlNFX0UpKTsKKyAgRVhQRUNUX0VRKCJTUEFSU0VfRiIsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9OYW1lKHVuaXR0ZXN0OjpTUEFSU0VfRikpOworICBFWFBFQ1RfRVEoIlNQQVJTRV9HIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9HKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkRW51bVRlc3QsIFBhcnNlKSB7CisgIHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZSBkdXBfdmFsdWUgPSB1bml0dGVzdDo6Rk9PMTsKKyAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX1BhcnNlKCJGT08xIiwgJmR1cF92YWx1ZSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPTzEsIGR1cF92YWx1ZSk7CisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9QYXJzZSgiRk9PMiIsICZkdXBfdmFsdWUpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT08yLCBkdXBfdmFsdWUpOworICBFWFBFQ1RfRkFMU0UodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX1BhcnNlKCJGT08iLCAmZHVwX3ZhbHVlKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkRW51bVRlc3QsIEdldEVudW1EZXNjcmlwdG9yKSB7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX2Rlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgIEdldEVudW1EZXNjcmlwdG9yPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+KCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZvcmVpZ25FbnVtX2Rlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgIEdldEVudW1EZXNjcmlwdG9yPHVuaXR0ZXN0OjpGb3JlaWduRW51bT4oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfZGVzY3JpcHRvcigpLAorICAgICAgICAgICAgR2V0RW51bURlc2NyaXB0b3I8dW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlPigpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9kZXNjcmlwdG9yKCksCisgICAgICAgICAgICBHZXRFbnVtRGVzY3JpcHRvcjx1bml0dGVzdDo6VGVzdFNwYXJzZUVudW0+KCkpOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworLy8gU3VwcG9ydCBjb2RlIGZvciB0ZXN0aW5nIHNlcnZpY2VzLgorY2xhc3MgR2VuZXJhdGVkU2VydmljZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBjbGFzcyBNb2NrVGVzdFNlcnZpY2UgOiBwdWJsaWMgdW5pdHRlc3Q6OlRlc3RTZXJ2aWNlIHsKKyAgIHB1YmxpYzoKKyAgICBNb2NrVGVzdFNlcnZpY2UoKQorICAgICAgOiBjYWxsZWRfKGZhbHNlKSwKKyAgICAgICAgbWV0aG9kXygiIiksCisgICAgICAgIGNvbnRyb2xsZXJfKE5VTEwpLAorICAgICAgICByZXF1ZXN0XyhOVUxMKSwKKyAgICAgICAgcmVzcG9uc2VfKE5VTEwpLAorICAgICAgICBkb25lXyhOVUxMKSB7fQorCisgICAgfk1vY2tUZXN0U2VydmljZSgpIHt9CisKKyAgICB2b2lkIFJlc2V0KCkgeyBjYWxsZWRfID0gZmFsc2U7IH0KKworICAgIC8vIGltcGxlbWVudHMgVGVzdFNlcnZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgdm9pZCBGb28oUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgICAgICAgICBjb25zdCB1bml0dGVzdDo6Rm9vUmVxdWVzdCogcmVxdWVzdCwKKyAgICAgICAgICAgICB1bml0dGVzdDo6Rm9vUmVzcG9uc2UqIHJlc3BvbnNlLAorICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpIHsKKyAgICAgIEFTU0VSVF9GQUxTRShjYWxsZWRfKTsKKyAgICAgIGNhbGxlZF8gPSB0cnVlOworICAgICAgbWV0aG9kXyA9ICJGb28iOworICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOworICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OworICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7CisgICAgICBkb25lXyA9IGRvbmU7CisgICAgfQorCisgICAgdm9pZCBCYXIoUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgICAgICAgICBjb25zdCB1bml0dGVzdDo6QmFyUmVxdWVzdCogcmVxdWVzdCwKKyAgICAgICAgICAgICB1bml0dGVzdDo6QmFyUmVzcG9uc2UqIHJlc3BvbnNlLAorICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpIHsKKyAgICAgIEFTU0VSVF9GQUxTRShjYWxsZWRfKTsKKyAgICAgIGNhbGxlZF8gPSB0cnVlOworICAgICAgbWV0aG9kXyA9ICJCYXIiOworICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOworICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OworICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7CisgICAgICBkb25lXyA9IGRvbmU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBib29sIGNhbGxlZF87CisgICAgc3RyaW5nIG1ldGhvZF87CisgICAgUnBjQ29udHJvbGxlciogY29udHJvbGxlcl87CisgICAgY29uc3QgTWVzc2FnZSogcmVxdWVzdF87CisgICAgTWVzc2FnZSogcmVzcG9uc2VfOworICAgIENsb3N1cmUqIGRvbmVfOworICB9OworCisgIGNsYXNzIE1vY2tScGNDaGFubmVsIDogcHVibGljIFJwY0NoYW5uZWwgeworICAgcHVibGljOgorICAgIE1vY2tScGNDaGFubmVsKCkKKyAgICAgIDogY2FsbGVkXyhmYWxzZSksCisgICAgICAgIG1ldGhvZF8oTlVMTCksCisgICAgICAgIGNvbnRyb2xsZXJfKE5VTEwpLAorICAgICAgICByZXF1ZXN0XyhOVUxMKSwKKyAgICAgICAgcmVzcG9uc2VfKE5VTEwpLAorICAgICAgICBkb25lXyhOVUxMKSwKKyAgICAgICAgZGVzdHJveWVkXyhOVUxMKSB7fQorCisgICAgfk1vY2tScGNDaGFubmVsKCkgeworICAgICAgaWYgKGRlc3Ryb3llZF8gIT0gTlVMTCkgKmRlc3Ryb3llZF8gPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgUmVzZXQoKSB7IGNhbGxlZF8gPSBmYWxzZTsgfQorCisgICAgLy8gaW1wbGVtZW50cyBUZXN0U2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB2b2lkIENhbGxNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgeworICAgICAgQVNTRVJUX0ZBTFNFKGNhbGxlZF8pOworICAgICAgY2FsbGVkXyA9IHRydWU7CisgICAgICBtZXRob2RfID0gbWV0aG9kOworICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOworICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OworICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7CisgICAgICBkb25lXyA9IGRvbmU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBib29sIGNhbGxlZF87CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kXzsKKyAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyXzsKKyAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0XzsKKyAgICBNZXNzYWdlKiByZXNwb25zZV87CisgICAgQ2xvc3VyZSogZG9uZV87CisgICAgYm9vbCogZGVzdHJveWVkXzsKKyAgfTsKKworICBjbGFzcyBNb2NrQ29udHJvbGxlciA6IHB1YmxpYyBScGNDb250cm9sbGVyIHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIFJlc2V0KCkgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiUmVzZXQoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOworICAgIH0KKyAgICBib29sIEZhaWxlZCgpIGNvbnN0IHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkZhaWxlZCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0cmluZyBFcnJvclRleHQoKSBjb25zdCB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJFcnJvclRleHQoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICB2b2lkIFN0YXJ0Q2FuY2VsKCkgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiU3RhcnRDYW5jZWwoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOworICAgIH0KKyAgICB2b2lkIFNldEZhaWxlZChjb25zdCBzdHJpbmcmIHJlYXNvbikgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiU2V0RmFpbGVkKCkgbm90IGV4cGVjdGVkIGR1cmluZyB0aGlzIHRlc3QuIjsKKyAgICB9CisgICAgYm9vbCBJc0NhbmNlbGVkKCkgY29uc3QgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiSXNDYW5jZWxlZCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQgTm90aWZ5T25DYW5jZWwoQ2xvc3VyZSogY2FsbGJhY2spIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIk5vdGlmeU9uQ2FuY2VsKCkgbm90IGV4cGVjdGVkIGR1cmluZyB0aGlzIHRlc3QuIjsKKyAgICB9CisgIH07CisKKyAgR2VuZXJhdGVkU2VydmljZVRlc3QoKQorICAgIDogZGVzY3JpcHRvcl8odW5pdHRlc3Q6OlRlc3RTZXJ2aWNlOjpkZXNjcmlwdG9yKCkpLAorICAgICAgZm9vXyhkZXNjcmlwdG9yXy0+RmluZE1ldGhvZEJ5TmFtZSgiRm9vIikpLAorICAgICAgYmFyXyhkZXNjcmlwdG9yXy0+RmluZE1ldGhvZEJ5TmFtZSgiQmFyIikpLAorICAgICAgc3R1Yl8oJm1vY2tfY2hhbm5lbF8pLAorICAgICAgZG9uZV8oTmV3UGVybWFuZW50Q2FsbGJhY2soJkRvTm90aGluZykpIHt9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFTU0VSVF9UUlVFKGZvb18gIT0gTlVMTCk7CisgICAgQVNTRVJUX1RSVUUoYmFyXyAhPSBOVUxMKTsKKyAgfQorCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmFyXzsKKworICBNb2NrVGVzdFNlcnZpY2UgbW9ja19zZXJ2aWNlXzsKKyAgTW9ja0NvbnRyb2xsZXIgbW9ja19jb250cm9sbGVyXzsKKworICBNb2NrUnBjQ2hhbm5lbCBtb2NrX2NoYW5uZWxfOworICB1bml0dGVzdDo6VGVzdFNlcnZpY2U6OlN0dWIgc3R1Yl87CisKKyAgLy8gSnVzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlLWRlZmluZSB0aGVzZSB3aXRoIGV2ZXJ5IHRlc3QuCisgIHVuaXR0ZXN0OjpGb29SZXF1ZXN0IGZvb19yZXF1ZXN0XzsKKyAgdW5pdHRlc3Q6OkZvb1Jlc3BvbnNlIGZvb19yZXNwb25zZV87CisgIHVuaXR0ZXN0OjpCYXJSZXF1ZXN0IGJhcl9yZXF1ZXN0XzsKKyAgdW5pdHRlc3Q6OkJhclJlc3BvbnNlIGJhcl9yZXNwb25zZV87CisgIHNjb3BlZF9wdHI8Q2xvc3VyZT4gZG9uZV87Cit9OworCitURVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIEdldERlc2NyaXB0b3IpIHsKKyAgLy8gVGVzdCB0aGF0IEdldERlc2NyaXB0b3IoKSB3b3Jrcy4KKworICBFWFBFQ1RfRVEoZGVzY3JpcHRvcl8sIG1vY2tfc2VydmljZV8uR2V0RGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBHZXRDaGFubmVsKSB7CisgIEVYUEVDVF9FUSgmbW9ja19jaGFubmVsXywgc3R1Yl8uY2hhbm5lbCgpKTsKK30KKworVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBPd25zQ2hhbm5lbCkgeworICBNb2NrUnBjQ2hhbm5lbCogY2hhbm5lbCA9IG5ldyBNb2NrUnBjQ2hhbm5lbDsKKyAgYm9vbCBkZXN0cm95ZWQgPSBmYWxzZTsKKyAgY2hhbm5lbC0+ZGVzdHJveWVkXyA9ICZkZXN0cm95ZWQ7CisKKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0U2VydmljZTo6U3R1YiBvd25pbmdfc3R1YihjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlOjpTVFVCX09XTlNfQ0hBTk5FTCk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgIH0KKworICBFWFBFQ1RfVFJVRShkZXN0cm95ZWQpOworfQorCitURVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIENhbGxNZXRob2QpIHsKKyAgLy8gVGVzdCB0aGF0IENhbGxNZXRob2QoKSB3b3Jrcy4KKworICAvLyBDYWxsIEZvbygpIHZpYSBDYWxsTWV0aG9kKCkuCisgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChmb29fLCAmbW9ja19jb250cm9sbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb29fcmVxdWVzdF8sICZmb29fcmVzcG9uc2VfLCBkb25lXy5nZXQoKSk7CisKKyAgQVNTRVJUX1RSVUUobW9ja19zZXJ2aWNlXy5jYWxsZWRfKTsKKworICBFWFBFQ1RfRVEoIkZvbyIgICAgICAgICAgICAsIG1vY2tfc2VydmljZV8ubWV0aG9kXyAgICApOworICBFWFBFQ1RfRVEoJm1vY2tfY29udHJvbGxlcl8sIG1vY2tfc2VydmljZV8uY29udHJvbGxlcl8pOworICBFWFBFQ1RfRVEoJmZvb19yZXF1ZXN0XyAgICAsIG1vY2tfc2VydmljZV8ucmVxdWVzdF8gICApOworICBFWFBFQ1RfRVEoJmZvb19yZXNwb25zZV8gICAsIG1vY2tfc2VydmljZV8ucmVzcG9uc2VfICApOworICBFWFBFQ1RfRVEoZG9uZV8uZ2V0KCkgICAgICAsIG1vY2tfc2VydmljZV8uZG9uZV8gICAgICApOworCisgIC8vIFRyeSBhZ2FpbiwgYnV0IGNhbGwgQmFyKCkgaW5zdGVhZC4KKyAgbW9ja19zZXJ2aWNlXy5SZXNldCgpOworICBtb2NrX3NlcnZpY2VfLkNhbGxNZXRob2QoYmFyXywgJm1vY2tfY29udHJvbGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFyX3JlcXVlc3RfLCAmYmFyX3Jlc3BvbnNlXywgZG9uZV8uZ2V0KCkpOworCisgIEFTU0VSVF9UUlVFKG1vY2tfc2VydmljZV8uY2FsbGVkXyk7CisgIEVYUEVDVF9FUSgiQmFyIiwgbW9ja19zZXJ2aWNlXy5tZXRob2RfKTsKK30KKworVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBDYWxsTWV0aG9kVHlwZUZhaWx1cmUpIHsKKyAgLy8gVmVyaWZ5IGRlYXRoIGlmIHdlIGNhbGwgRm9vKCkgd2l0aCBCYXIncyBtZXNzYWdlIHR5cGVzLgorCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CisgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICBtb2NrX3NlcnZpY2VfLkNhbGxNZXRob2QoZm9vXywgJm1vY2tfY29udHJvbGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb29fcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSksCisgICAgImR5bmFtaWNfY2FzdCIpOworCisgIG1vY2tfc2VydmljZV8uUmVzZXQoKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKAorICAgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChmb29fLCAmbW9ja19jb250cm9sbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhcl9yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKSwKKyAgICAiZHluYW1pY19jYXN0Iik7CisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCit9CisKK1RFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgR2V0UHJvdG90eXBlcykgeworICAvLyBUZXN0IEdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpIG1ldGhvZHMuCisKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6Rm9vUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1vY2tfc2VydmljZV8uR2V0UmVxdWVzdFByb3RvdHlwZShmb29fKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkJhclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtb2NrX3NlcnZpY2VfLkdldFJlcXVlc3RQcm90b3R5cGUoYmFyXykpOworCisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkZvb1Jlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbW9ja19zZXJ2aWNlXy5HZXRSZXNwb25zZVByb3RvdHlwZShmb29fKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkJhclJlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbW9ja19zZXJ2aWNlXy5HZXRSZXNwb25zZVByb3RvdHlwZShiYXJfKSk7Cit9CisKK1RFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgU3R1YikgeworICAvLyBUZXN0IHRoYXQgdGhlIHN0dWIgY2xhc3Mgd29ya3MuCisKKyAgLy8gQ2FsbCBGb28oKSB2aWEgdGhlIHN0dWIuCisgIHN0dWJfLkZvbygmbW9ja19jb250cm9sbGVyXywgJmZvb19yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKTsKKworICBBU1NFUlRfVFJVRShtb2NrX2NoYW5uZWxfLmNhbGxlZF8pOworCisgIEVYUEVDVF9FUShmb29fICAgICAgICAgICAgICwgbW9ja19jaGFubmVsXy5tZXRob2RfICAgICk7CisgIEVYUEVDVF9FUSgmbW9ja19jb250cm9sbGVyXywgbW9ja19jaGFubmVsXy5jb250cm9sbGVyXyk7CisgIEVYUEVDVF9FUSgmZm9vX3JlcXVlc3RfICAgICwgbW9ja19jaGFubmVsXy5yZXF1ZXN0XyAgICk7CisgIEVYUEVDVF9FUSgmZm9vX3Jlc3BvbnNlXyAgICwgbW9ja19jaGFubmVsXy5yZXNwb25zZV8gICk7CisgIEVYUEVDVF9FUShkb25lXy5nZXQoKSAgICAgICwgbW9ja19jaGFubmVsXy5kb25lXyAgICAgICk7CisKKyAgLy8gQ2FsbCBCYXIoKSB2aWEgdGhlIHN0dWIuCisgIG1vY2tfY2hhbm5lbF8uUmVzZXQoKTsKKyAgc3R1Yl8uQmFyKCZtb2NrX2NvbnRyb2xsZXJfLCAmYmFyX3JlcXVlc3RfLCAmYmFyX3Jlc3BvbnNlXywgZG9uZV8uZ2V0KCkpOworCisgIEFTU0VSVF9UUlVFKG1vY2tfY2hhbm5lbF8uY2FsbGVkXyk7CisgIEVYUEVDVF9FUShiYXJfLCBtb2NrX2NoYW5uZWxfLm1ldGhvZF8pOworfQorCitURVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIE5vdEltcGxlbWVudGVkKSB7CisgIC8vIFRlc3QgdGhhdCBmYWlsaW5nIHRvIGltcGxlbWVudCBhIG1ldGhvZCBvZiBhIHNlcnZpY2UgY2F1c2VzIGl0IHRvIGZhaWwKKyAgLy8gd2l0aCBhICJub3QgaW1wbGVtZW50ZWQiIGVycm9yIG1lc3NhZ2UuCisKKyAgLy8gQSBzZXJ2aWNlIHdoaWNoIGRvZXNuJ3QgaW1wbGVtZW50IGFueSBtZXRob2RzLgorICBjbGFzcyBVbmltcGxlbWVudGVkU2VydmljZSA6IHB1YmxpYyB1bml0dGVzdDo6VGVzdFNlcnZpY2UgeworICAgcHVibGljOgorICAgIFVuaW1wbGVtZW50ZWRTZXJ2aWNlKCkge30KKyAgfTsKKworICBVbmltcGxlbWVudGVkU2VydmljZSB1bmltcGxlbWVudGVkX3NlcnZpY2U7CisKKyAgLy8gQW5kIGEgY29udHJvbGxlciB3aGljaCBleHBlY3RzIHRvIGdldCBhICJub3QgaW1wbGVtZW50ZWQiIGVycm9yLgorICBjbGFzcyBFeHBlY3RVbmltcGxlbWVudGVkQ29udHJvbGxlciA6IHB1YmxpYyBNb2NrQ29udHJvbGxlciB7CisgICBwdWJsaWM6CisgICAgRXhwZWN0VW5pbXBsZW1lbnRlZENvbnRyb2xsZXIoKSA6IGNhbGxlZF8oZmFsc2UpIHt9CisKKyAgICB2b2lkIFNldEZhaWxlZChjb25zdCBzdHJpbmcmIHJlYXNvbikgeworICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxlZF8pOworICAgICAgY2FsbGVkXyA9IHRydWU7CisgICAgICBFWFBFQ1RfRVEoIk1ldGhvZCBGb28oKSBub3QgaW1wbGVtZW50ZWQuIiwgcmVhc29uKTsKKyAgICB9CisKKyAgICBib29sIGNhbGxlZF87CisgIH07CisKKyAgRXhwZWN0VW5pbXBsZW1lbnRlZENvbnRyb2xsZXIgY29udHJvbGxlcjsKKworICAvLyBDYWxsIEZvby4KKyAgdW5pbXBsZW1lbnRlZF9zZXJ2aWNlLkZvbygmY29udHJvbGxlciwgJmZvb19yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8uZ2V0KCkpOworCisgIEVYUEVDVF9UUlVFKGNvbnRyb2xsZXIuY2FsbGVkXyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHBfdW5pdHRlc3QKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorCituYW1lc3BhY2Ugbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0IHsKKyAgLy8gVmVyaWZ5IHRoYXQgbm8gY2xhc3MgY2FsbGVkICJUZXN0U2VydmljZSIgd2FzIGRlZmluZWQgaW4KKyAgLy8gdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5oIGJ5IGRlZmluaW5nIGEgZGlmZmVyZW50IHR5cGUgYnkgdGhlIHNhbWUKKyAgLy8gbmFtZS4gIElmIHN1Y2ggYSBzZXJ2aWNlIHdhcyBnZW5lcmF0ZWQsIHRoaXMgd2lsbCBub3QgY29tcGlsZS4KKyAgc3RydWN0IFRlc3RTZXJ2aWNlIHsKKyAgICBpbnQgaTsKKyAgfTsKK30KKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworbmFtZXNwYWNlIGNwcF91bml0dGVzdCB7CisKK1RFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgTm9HZW5lcmljU2VydmljZXMpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgbm9uLXNlcnZpY2VzIGluIHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8gd2VyZQorICAvLyBnZW5lcmF0ZWQuCisgIG5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDo6VGVzdE1lc3NhZ2UgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfYSgxKTsKKyAgbWVzc2FnZS5TZXRFeHRlbnNpb24obm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0Ojp0ZXN0X2V4dGVuc2lvbiwgMTIzKTsKKyAgbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OjpUZXN0RW51bSBlID0gbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OjpGT087CisgIEVYUEVDVF9FUShlLCAxKTsKKworICAvLyBWZXJpZnkgdGhhdCBhIFNlcnZpY2VEZXNjcmlwdG9yIGlzIGdlbmVyYXRlZCBmb3IgdGhlIHNlcnZpY2UgZXZlbiBpZiB0aGUKKyAgLy8gY2xhc3MgaXRzZWxmIGlzIG5vdC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPQorICAgICAgbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OjpUZXN0TWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5maWxlKCk7CisKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPnNlcnZpY2VfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UiLCBmaWxlLT5zZXJ2aWNlKDApLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZmlsZS0+c2VydmljZSgwKS0+bWV0aG9kX2NvdW50KCkpOworICBFWFBFQ1RfRVEoIkZvbyIsIGZpbGUtPnNlcnZpY2UoMCktPm1ldGhvZCgwKS0+bmFtZSgpKTsKK30KKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRoaXMgdGVzdCBtdXN0IHJ1biBsYXN0LiAgSXQgdmVyaWZpZXMgdGhhdCBkZXNjcmlwdG9ycyB3ZXJlIG9yIHdlcmUgbm90CisvLyBpbml0aWFsaXplZCBkZXBlbmRpbmcgb24gd2hldGhlciBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTIHdhcyBkZWZpbmVkLgorLy8gV2hlbiB0aGlzIGlzIGRlZmluZWQsIHdlIHNraXAgYWxsIHRlc3RzIHdoaWNoIGFyZSBleHBlY3RlZCB0byB0cmlnZ2VyCisvLyBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uLiAgVGhpcyB2ZXJpZmllcyB0aGF0IGV2ZXJ5dGhpbmcgZWxzZSBzdGlsbCB3b3JrcworLy8gaWYgZGVzY3JpcHRvcnMgYXJlIG5vdCBpbml0aWFsaXplZC4KK1RFU1QoRGVzY3JpcHRvckluaXRpYWxpemF0aW9uVGVzdCwgSW5pdGlhbGl6ZWQpIHsKKyNpZmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIGJvb2wgc2hvdWxkX2hhdmVfZGVzY3JpcHRvcnMgPSBmYWxzZTsKKyNlbHNlCisgIGJvb2wgc2hvdWxkX2hhdmVfZGVzY3JpcHRvcnMgPSB0cnVlOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKHNob3VsZF9oYXZlX2Rlc2NyaXB0b3JzLAorICAgIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5JbnRlcm5hbElzRmlsZUxvYWRlZCgKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHBfdW5pdHRlc3QKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTFkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBuYW1lc3BhY2UgZ29vZ2xlOjpwcm90b2J1Zjo6cHJvdG9idWZfdW5pdHRlc3QgaW4gb3JkZXIgdG8gZXhwb3NlCisvLyBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgZ2VuZXJhdGVkIGNsYXNzIG5hbWVzLiBXZSB1c2UgdGhpcyBoZWFkZXIgdG8gZW5zdXJlCisvLyB1bml0dGVzdC5jYyB3aWxsIGRlY2xhcmUgdGhlIG5hbWVzcGFjZSBwcmlvciB0byBvdGhlciBpbmNsdWRlcywgd2hpbGUgb2JleWluZworLy8gbm9ybWFsIGluY2x1ZGUgb3JkZXJpbmcuCisvLworLy8gV2hlbiBnZW5lcmF0aW5nIGEgY2xhc3MgbmFtZSBvZiAiZm9vLkJhciIgd2UgbXVzdCBlbnN1cmUgd2UgcHJlZml4IHRoZSBjbGFzcworLy8gbmFtZSB3aXRoICI6OiIsIGluIGNhc2UgdGhlIG5hbWVzcGFjZSBnb29nbGU6OnByb3RvYnVmOjpmb28gZXhpc3RzLiBXZSBpbnRlbnRpb25hbGx5CisvLyB0cmlnZ2VyIHRoYXQgY2FzZSBoZXJlIGJ5IGRlY2xhcmluZyBnb29nbGU6OnByb3RvYnVmOjpwcm90b2J1Zl91bml0dGVzdC4KKy8vCisvLyBTZWUgQ2xhc3NOYW1lIGluIGhlbHBlcnMuaCBmb3IgbW9yZSBkZXRhaWxzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfVU5JVFRFU1RfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfVU5JVFRFU1RfSF9fCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBwcm90b2J1Zl91bml0dGVzdCB7fQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9VTklUVEVTVF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJmNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjCkBAIC0wLDAgKzEsNDU5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworI2lmZGVmIF9XSU4zMgorI2lmbmRlZiBGX09LCisjZGVmaW5lIEZfT0sgMDAgIC8vIG5vdCBkZWZpbmVkIGJ5IE1TVkMgZm9yIHdoYXRldmVyIHJlYXNvbgorI2VuZGlmCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgbG9va3MgbGlrZSBhIFdpbmRvd3Mtc3R5bGUgYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcKKy8vIHdpdGggYSBkcml2ZSBsZXR0ZXIuICBFeGFtcGxlOiAgIkM6XGZvbyIuICBUT0RPKGtlbnRvbik6ICBTaGFyZSB0aGlzIHdpdGgKKy8vIGNvcHkgaW4gY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYz8KK3N0YXRpYyBib29sIElzV2luZG93c0Fic29sdXRlUGF0aChjb25zdCBzdHJpbmcmIHRleHQpIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorICByZXR1cm4gdGV4dC5zaXplKCkgPj0gMyAmJiB0ZXh0WzFdID09ICc6JyAmJgorICAgICAgICAgaXNhbHBoYSh0ZXh0WzBdKSAmJgorICAgICAgICAgKHRleHRbMl0gPT0gJy8nIHx8IHRleHRbMl0gPT0gJ1xcJykgJiYKKyAgICAgICAgIHRleHQuZmluZF9sYXN0X29mKCc6JykgPT0gMTsKKyNlbHNlCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitNdWx0aUZpbGVFcnJvckNvbGxlY3Rvcjo6fk11bHRpRmlsZUVycm9yQ29sbGVjdG9yKCkge30KKworLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOgorLy8gLSBJdCBpbXBsZW1lbnRzIHRoZSBFcnJvckNvbGxlY3RvciBpbnRlcmZhY2UgKHVzZWQgYnkgVG9rZW5pemVyIGFuZCBQYXJzZXIpCisvLyAgIGluIHRlcm1zIG9mIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yLCB1c2luZyBhIHBhcnRpY3VsYXIgZmlsZW5hbWUuCisvLyAtIEl0IGxldHMgdXMgY2hlY2sgaWYgYW55IGVycm9ycyBoYXZlIG9jY3VycmVkLgorY2xhc3MgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6U2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yCisgICAgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIFNpbmdsZUZpbGVFcnJvckNvbGxlY3Rvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IqIG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yKQorICAgIDogZmlsZW5hbWVfKGZpbGVuYW1lKSwKKyAgICAgIG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yXyhtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3RvciksCisgICAgICBoYWRfZXJyb3JzXyhmYWxzZSkge30KKyAgflNpbmdsZUZpbGVFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgYm9vbCBoYWRfZXJyb3JzKCkgeyByZXR1cm4gaGFkX2Vycm9yc187IH0KKworICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBpZiAobXVsdGlfZmlsZV9lcnJvcl9jb2xsZWN0b3JfICE9IE5VTEwpIHsKKyAgICAgIG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoZmlsZW5hbWVfLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICAgIH0KKyAgICBoYWRfZXJyb3JzXyA9IHRydWU7CisgIH0KKworIHByaXZhdGU6CisgIHN0cmluZyBmaWxlbmFtZV87CisgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3Rvcl87CisgIGJvb2wgaGFkX2Vycm9yc187Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OlNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UoCisgICAgU291cmNlVHJlZSogc291cmNlX3RyZWUpCisgIDogc291cmNlX3RyZWVfKHNvdXJjZV90cmVlKSwKKyAgICBlcnJvcl9jb2xsZWN0b3JfKE5VTEwpLAorICAgIHVzaW5nX3ZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXyhmYWxzZSksCisgICAgdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3JfKHRoaXMpIHt9CisKK1NvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6On5Tb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKCkge30KKworYm9vbCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLT5PcGVuKGZpbGVuYW1lKSk7CisgIGlmIChpbnB1dCA9PSBOVUxMKSB7CisgICAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gTlVMTCkgeworICAgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoZmlsZW5hbWUsIC0xLCAwLCAiRmlsZSBub3QgZm91bmQuIik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyIGFuZCBwYXJzZXIuCisgIFNpbmdsZUZpbGVFcnJvckNvbGxlY3RvciBmaWxlX2Vycm9yX2NvbGxlY3RvcihmaWxlbmFtZSwgZXJyb3JfY29sbGVjdG9yXyk7CisgIGlvOjpUb2tlbml6ZXIgdG9rZW5pemVyKGlucHV0LmdldCgpLCAmZmlsZV9lcnJvcl9jb2xsZWN0b3IpOworCisgIFBhcnNlciBwYXJzZXI7CisgIGlmIChlcnJvcl9jb2xsZWN0b3JfICE9IE5VTEwpIHsKKyAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmZpbGVfZXJyb3JfY29sbGVjdG9yKTsKKyAgfQorICBpZiAodXNpbmdfdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3JfKSB7CisgICAgcGFyc2VyLlJlY29yZFNvdXJjZUxvY2F0aW9uc1RvKCZzb3VyY2VfbG9jYXRpb25zXyk7CisgIH0KKworICAvLyBQYXJzZSBpdC4KKyAgb3V0cHV0LT5zZXRfbmFtZShmaWxlbmFtZSk7CisgIHJldHVybiBwYXJzZXIuUGFyc2UoJnRva2VuaXplciwgb3V0cHV0KSAmJgorICAgICAgICAgIWZpbGVfZXJyb3JfY29sbGVjdG9yLmhhZF9lcnJvcnMoKTsKK30KKworYm9vbCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCisgICAgY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I6OgorVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UqIG93bmVyKQorICA6IG93bmVyXyhvd25lcikge30KKworU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yOjoKK35WYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoKSB7fQorCit2b2lkIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OlZhbGlkYXRpb25FcnJvckNvbGxlY3Rvcjo6QWRkRXJyb3IoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgIGlmIChvd25lcl8tPmVycm9yX2NvbGxlY3Rvcl8gPT0gTlVMTCkgcmV0dXJuOworCisgIGludCBsaW5lLCBjb2x1bW47CisgIG93bmVyXy0+c291cmNlX2xvY2F0aW9uc18uRmluZChkZXNjcmlwdG9yLCBsb2NhdGlvbiwgJmxpbmUsICZjb2x1bW4pOworICBvd25lcl8tPmVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltcG9ydGVyOjpJbXBvcnRlcihTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwKKyAgICAgICAgICAgICAgICAgICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKQorICA6IGRhdGFiYXNlXyhzb3VyY2VfdHJlZSksCisgICAgcG9vbF8oJmRhdGFiYXNlXywgZGF0YWJhc2VfLkdldFZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpKSB7CisgIGRhdGFiYXNlXy5SZWNvcmRFcnJvcnNUbyhlcnJvcl9jb2xsZWN0b3IpOworfQorCitJbXBvcnRlcjo6fkltcG9ydGVyKCkge30KKworY29uc3QgRmlsZURlc2NyaXB0b3IqIEltcG9ydGVyOjpJbXBvcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gcG9vbF8uRmluZEZpbGVCeU5hbWUoZmlsZW5hbWUpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NvdXJjZVRyZWU6On5Tb3VyY2VUcmVlKCkge30KKworRGlza1NvdXJjZVRyZWU6OkRpc2tTb3VyY2VUcmVlKCkge30KKworRGlza1NvdXJjZVRyZWU6On5EaXNrU291cmNlVHJlZSgpIHt9CisKK3N0YXRpYyBpbmxpbmUgY2hhciBMYXN0Q2hhcihjb25zdCBzdHJpbmcmIHN0cikgeworICByZXR1cm4gc3RyW3N0ci5zaXplKCkgLSAxXTsKK30KKworLy8gR2l2ZW4gYSBwYXRoLCByZXR1cm5zIGFuIGVxdWl2YWxlbnQgcGF0aCB3aXRoIHRoZXNlIGNoYW5nZXM6CisvLyAtIE9uIFdpbmRvd3MsIGFueSBiYWNrc2xhc2hlcyBhcmUgcmVwbGFjZWQgd2l0aCBmb3J3YXJkIHNsYXNoZXMuCisvLyAtIEFueSBpbnN0YW5jZXMgb2YgdGhlIGRpcmVjdG9yeSAiLiIgYXJlIHJlbW92ZWQuCisvLyAtIEFueSBjb25zZWN1dGl2ZSAnLydzIGFyZSBjb2xsYXBzZWQgaW50byBhIHNpbmdsZSBzbGFzaC4KKy8vIE5vdGUgdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyBtYXkgYmUgZW1wdHkuCisvLworLy8gVE9ETyhrZW50b24pOiAgSXQgd291bGQgYmUgbmljZSB0byBoYW5kbGUgIi4uIiwgZS5nLiBzbyB0aGF0IHdlIGNhbiBmaWd1cmUKKy8vICAgb3V0IHRoYXQgImZvby9iYXIucHJvdG8iIGlzIGluc2lkZSAiYmF6Ly4uL2ZvbyIuICBIb3dldmVyLCBpZiBiYXogaXMgYQorLy8gICBzeW1saW5rIG9yIGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhpbmdzIGdldCBjb21wbGljYXRlZCwgYW5kIHdlIGNhbid0CisvLyAgIGFjdHVhbGx5IGRldGVybWluZSB0aGlzIHdpdGhvdXQgaW52ZXN0aWdhdGluZyB0aGUgZmlsZXN5c3RlbSwgcHJvYmFibHkKKy8vICAgaW4gbm9uLXBvcnRhYmxlIHdheXMuICBTbywgd2UgcHVudC4KKy8vCisvLyBUT0RPKGtlbnRvbik6ICBJdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSByZWFscGF0aCgpIGhlcmUgZXhjZXB0IHRoYXQgaXQKKy8vICAgcmVzb2x2ZXMgc3ltYm9saWMgbGlua3MuICBUaGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zIGlmIHBlb3BsZSBwbGFjZQorLy8gICBzeW1ib2xpYyBsaW5rcyBpbiB0aGVpciBzb3VyY2UgdHJlZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgZXhlY3V0ZWQ6CisvLyAgICAgcHJvdG9jIC0tcHJvdG9fcGF0aD1mb28gZm9vL2Jhci9iYXoucHJvdG8KKy8vICAgdGhlbiBpZiBmb28vYmFyIGlzIGEgc3ltYm9saWMgbGluaywgZm9vL2Jhci9iYXoucHJvdG8gd2lsbCBjYW5vbmljYWxpemUKKy8vICAgdG8gYSBwYXRoIHdoaWNoIGRvZXMgbm90IGFwcGVhciB0byBiZSB1bmRlciBmb28sIGFuZCB0aHVzIHRoZSBjb21waWxlcgorLy8gICB3aWxsIGNvbXBsYWluIHRoYXQgYmF6LnByb3RvIGlzIG5vdCBpbnNpZGUgdGhlIC0tcHJvdG9fcGF0aC4KK3N0YXRpYyBzdHJpbmcgQ2Fub25pY2FsaXplUGF0aChzdHJpbmcgcGF0aCkgeworI2lmZGVmIF9XSU4zMgorICAvLyBUaGUgV2luMzIgQVBJIGFjY2VwdHMgZm9yd2FyZCBzbGFzaGVzIGFzIGEgcGF0aCBkZWxpbWl0ZXIgZXZlbiB0aG91Z2gKKyAgLy8gYmFja3NsYXNoZXMgYXJlIHN0YW5kYXJkLiAgTGV0J3MgYXZvaWQgY29uZnVzaW9uIGFuZCB1c2Ugb25seSBmb3J3YXJkCisgIC8vIHNsYXNoZXMuCisgIGlmIChIYXNQcmVmaXhTdHJpbmcocGF0aCwgIlxcXFwiKSkgeworICAgIC8vIEF2b2lkIGNvbnZlcnRpbmcgdHdvIGxlYWRpbmcgYmFja3NsYXNoZXMuCisgICAgcGF0aCA9ICJcXFxcIiArIFN0cmluZ1JlcGxhY2UocGF0aC5zdWJzdHIoMiksICJcXCIsICIvIiwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgcGF0aCA9IFN0cmluZ1JlcGxhY2UocGF0aCwgIlxcIiwgIi8iLCB0cnVlKTsKKyAgfQorI2VuZGlmCisKKyAgdmVjdG9yPHN0cmluZz4gcGFydHM7CisgIHZlY3RvcjxzdHJpbmc+IGNhbm9uaWNhbF9wYXJ0czsKKyAgU3BsaXRTdHJpbmdVc2luZyhwYXRoLCAiLyIsICZwYXJ0cyk7ICAvLyBOb3RlOiAgUmVtb3ZlcyBlbXB0eSBwYXJ0cy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5zaXplKCk7IGkrKykgeworICAgIGlmIChwYXJ0c1tpXSA9PSAiLiIpIHsKKyAgICAgIC8vIElnbm9yZS4KKyAgICB9IGVsc2UgeworICAgICAgY2Fub25pY2FsX3BhcnRzLnB1c2hfYmFjayhwYXJ0c1tpXSk7CisgICAgfQorICB9CisgIHN0cmluZyByZXN1bHQgPSBKb2luU3RyaW5ncyhjYW5vbmljYWxfcGFydHMsICIvIik7CisgIGlmICghcGF0aC5lbXB0eSgpICYmIHBhdGhbMF0gPT0gJy8nKSB7CisgICAgLy8gUmVzdG9yZSBsZWFkaW5nIHNsYXNoLgorICAgIHJlc3VsdCA9ICcvJyArIHJlc3VsdDsKKyAgfQorICBpZiAoIXBhdGguZW1wdHkoKSAmJiBMYXN0Q2hhcihwYXRoKSA9PSAnLycgJiYKKyAgICAgICFyZXN1bHQuZW1wdHkoKSAmJiBMYXN0Q2hhcihyZXN1bHQpICE9ICcvJykgeworICAgIC8vIFJlc3RvcmUgdHJhaWxpbmcgc2xhc2guCisgICAgcmVzdWx0ICs9ICcvJzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgQ29udGFpbnNQYXJlbnRSZWZlcmVuY2UoY29uc3Qgc3RyaW5nJiBwYXRoKSB7CisgIHJldHVybiBwYXRoID09ICIuLiIgfHwKKyAgICAgICAgIEhhc1ByZWZpeFN0cmluZyhwYXRoLCAiLi4vIikgfHwKKyAgICAgICAgIEhhc1N1ZmZpeFN0cmluZyhwYXRoLCAiLy4uIikgfHwKKyAgICAgICAgIHBhdGguZmluZCgiLy4uLyIpICE9IHN0cmluZzo6bnBvczsKK30KKworLy8gTWFwcyBhIGZpbGUgZnJvbSBhbiBvbGQgbG9jYXRpb24gdG8gYSBuZXcgb25lLiAgVHlwaWNhbGx5LCBvbGRfcHJlZml4IGlzCisvLyBhIHZpcnR1YWwgcGF0aCBhbmQgbmV3X3ByZWZpeCBpcyBpdHMgY29ycmVzcG9uZGluZyBkaXNrIHBhdGguICBSZXR1cm5zCisvLyBmYWxzZSBpZiB0aGUgZmlsZW5hbWUgZGlkIG5vdCBzdGFydCB3aXRoIG9sZF9wcmVmaXgsIG90aGVyd2lzZSByZXBsYWNlcworLy8gb2xkX3ByZWZpeCB3aXRoIG5ld19wcmVmaXggYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluICpyZXN1bHQuICBFeGFtcGxlczoKKy8vICAgc3RyaW5nIHJlc3VsdDsKKy8vICAgYXNzZXJ0KEFwcGx5TWFwcGluZygiZm9vL2JhciIsICIiLCAiYmF6IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQocmVzdWx0ID09ICJiYXovZm9vL2JhciIpOworLy8KKy8vICAgYXNzZXJ0KEFwcGx5TWFwcGluZygiZm9vL2JhciIsICJmb28iLCAiYmF6IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQocmVzdWx0ID09ICJiYXovYmFyIik7CisvLworLy8gICBhc3NlcnQoQXBwbHlNYXBwaW5nKCJmb28iLCAiZm9vIiwgImJhciIsICZyZXN1bHQpKTsKKy8vICAgYXNzZXJ0KHJlc3VsdCA9PSAiYmFyIik7CisvLworLy8gICBhc3NlcnQoIUFwcGx5TWFwcGluZygiZm9vL2JhciIsICJiYXoiLCAicXV4IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQoIUFwcGx5TWFwcGluZygiZm9vL2JhciIsICJiYXoiLCAicXV4IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQoIUFwcGx5TWFwcGluZygiZm9vYmFyIiwgImZvbyIsICJiYXoiLCAmcmVzdWx0KSk7CitzdGF0aWMgYm9vbCBBcHBseU1hcHBpbmcoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9sZF9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuZXdfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogcmVzdWx0KSB7CisgIGlmIChvbGRfcHJlZml4LmVtcHR5KCkpIHsKKyAgICAvLyBvbGRfcHJlZml4IG1hdGNoZXMgYW55IHJlbGF0aXZlIHBhdGguCisgICAgaWYgKENvbnRhaW5zUGFyZW50UmVmZXJlbmNlKGZpbGVuYW1lKSkgeworICAgICAgLy8gV2UgZG8gbm90IGFsbG93IHRoZSBmaWxlIG5hbWUgdG8gdXNlICIuLiIuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChIYXNQcmVmaXhTdHJpbmcoZmlsZW5hbWUsICIvIikgfHwKKyAgICAgICAgSXNXaW5kb3dzQWJzb2x1dGVQYXRoKGZpbGVuYW1lKSkgeworICAgICAgLy8gVGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBzbyBpdCBpc24ndCBtYXRjaGVkIGJ5IHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJlc3VsdC0+YXNzaWduKG5ld19wcmVmaXgpOworICAgIGlmICghcmVzdWx0LT5lbXB0eSgpKSByZXN1bHQtPnB1c2hfYmFjaygnLycpOworICAgIHJlc3VsdC0+YXBwZW5kKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChIYXNQcmVmaXhTdHJpbmcoZmlsZW5hbWUsIG9sZF9wcmVmaXgpKSB7CisgICAgLy8gb2xkX3ByZWZpeCBpcyBhIHByZWZpeCBvZiB0aGUgZmlsZW5hbWUuICBJcyBpdCB0aGUgd2hvbGUgZmlsZW5hbWU/CisgICAgaWYgKGZpbGVuYW1lLnNpemUoKSA9PSBvbGRfcHJlZml4LnNpemUoKSkgeworICAgICAgLy8gWWVwLCBpdCdzIGFuIGV4YWN0IG1hdGNoLgorICAgICAgKnJlc3VsdCA9IG5ld19wcmVmaXg7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm90IGFuIGV4YWN0IG1hdGNoLiAgSXMgdGhlIG5leHQgY2hhcmFjdGVyIGEgJy8nPyAgT3RoZXJ3aXNlLAorICAgICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSBhIG1hdGNoIGF0IGFsbC4gIEUuZy4gdGhlIHByZWZpeCAiZm9vL2JhciIKKyAgICAgIC8vIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlbmFtZSAiZm9vL2JhcmJheiIuCisgICAgICBpbnQgYWZ0ZXJfcHJlZml4X3N0YXJ0ID0gLTE7CisgICAgICBpZiAoZmlsZW5hbWVbb2xkX3ByZWZpeC5zaXplKCldID09ICcvJykgeworICAgICAgICBhZnRlcl9wcmVmaXhfc3RhcnQgPSBvbGRfcHJlZml4LnNpemUoKSArIDE7CisgICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lW29sZF9wcmVmaXguc2l6ZSgpIC0gMV0gPT0gJy8nKSB7CisgICAgICAgIC8vIG9sZF9wcmVmaXggaXMgbmV2ZXIgZW1wdHksIGFuZCBjYW5vbmljYWxpemVkIHBhdGhzIG5ldmVyIGhhdmUKKyAgICAgICAgLy8gY29uc2VjdXRpdmUgJy8nIGNoYXJhY3RlcnMuCisgICAgICAgIGFmdGVyX3ByZWZpeF9zdGFydCA9IG9sZF9wcmVmaXguc2l6ZSgpOworICAgICAgfQorICAgICAgaWYgKGFmdGVyX3ByZWZpeF9zdGFydCAhPSAtMSkgeworICAgICAgICAvLyBZZXAuICBTbyB0aGUgcHJlZml4ZXMgYXJlIGRpcmVjdG9yaWVzIGFuZCB0aGUgZmlsZW5hbWUgaXMgYSBmaWxlCisgICAgICAgIC8vIGluc2lkZSB0aGVtLgorICAgICAgICBzdHJpbmcgYWZ0ZXJfcHJlZml4ID0gZmlsZW5hbWUuc3Vic3RyKGFmdGVyX3ByZWZpeF9zdGFydCk7CisgICAgICAgIGlmIChDb250YWluc1BhcmVudFJlZmVyZW5jZShhZnRlcl9wcmVmaXgpKSB7CisgICAgICAgICAgLy8gV2UgZG8gbm90IGFsbG93IHRoZSBmaWxlIG5hbWUgdG8gdXNlICIuLiIuCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC0+YXNzaWduKG5ld19wcmVmaXgpOworICAgICAgICBpZiAoIXJlc3VsdC0+ZW1wdHkoKSkgcmVzdWx0LT5wdXNoX2JhY2soJy8nKTsKKyAgICAgICAgcmVzdWx0LT5hcHBlbmQoYWZ0ZXJfcHJlZml4KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIERpc2tTb3VyY2VUcmVlOjpNYXBQYXRoKGNvbnN0IHN0cmluZyYgdmlydHVhbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRpc2tfcGF0aCkgeworICBtYXBwaW5nc18ucHVzaF9iYWNrKE1hcHBpbmcodmlydHVhbF9wYXRoLCBDYW5vbmljYWxpemVQYXRoKGRpc2tfcGF0aCkpKTsKK30KKworRGlza1NvdXJjZVRyZWU6OkRpc2tGaWxlVG9WaXJ0dWFsRmlsZVJlc3VsdAorRGlza1NvdXJjZVRyZWU6OkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICBjb25zdCBzdHJpbmcmIGRpc2tfZmlsZSwKKyAgICBzdHJpbmcqIHZpcnR1YWxfZmlsZSwKKyAgICBzdHJpbmcqIHNoYWRvd2luZ19kaXNrX2ZpbGUpIHsKKyAgaW50IG1hcHBpbmdfaW5kZXggPSAtMTsKKyAgc3RyaW5nIGNhbm9uaWNhbF9kaXNrX2ZpbGUgPSBDYW5vbmljYWxpemVQYXRoKGRpc2tfZmlsZSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nc18uc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBBcHBseSB0aGUgbWFwcGluZyBpbiByZXZlcnNlLgorICAgIGlmIChBcHBseU1hcHBpbmcoY2Fub25pY2FsX2Rpc2tfZmlsZSwgbWFwcGluZ3NfW2ldLmRpc2tfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzX1tpXS52aXJ0dWFsX3BhdGgsIHZpcnR1YWxfZmlsZSkpIHsKKyAgICAgIC8vIFN1Y2Nlc3MuCisgICAgICBtYXBwaW5nX2luZGV4ID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChtYXBwaW5nX2luZGV4ID09IC0xKSB7CisgICAgcmV0dXJuIE5PX01BUFBJTkc7CisgIH0KKworICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG1hcHBpbmdzIHdpdGggaGlnaGVyIHByZWNlZGVuY2UgYW5kIHZlcmlmeSB0aGF0IG5vbmUKKyAgLy8gb2YgdGhlbSBtYXAgdGhpcyBmaWxlIHRvIHNvbWUgb3RoZXIgZXhpc3RpbmcgZmlsZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nX2luZGV4OyBpKyspIHsKKyAgICBpZiAoQXBwbHlNYXBwaW5nKCp2aXJ0dWFsX2ZpbGUsIG1hcHBpbmdzX1tpXS52aXJ0dWFsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nc19baV0uZGlza19wYXRoLCBzaGFkb3dpbmdfZGlza19maWxlKSkgeworICAgICAgaWYgKGFjY2VzcyhzaGFkb3dpbmdfZGlza19maWxlLT5jX3N0cigpLCBGX09LKSA+PSAwKSB7CisgICAgICAgIC8vIEZpbGUgZXhpc3RzLgorICAgICAgICByZXR1cm4gU0hBRE9XRUQ7CisgICAgICB9CisgICAgfQorICB9CisgIHNoYWRvd2luZ19kaXNrX2ZpbGUtPmNsZWFyKCk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIG9wZW4gdGhlIGZpbGUuICBOb3RlIHRoYXQgdGhpcyBhbHNvIGhhcyB0aGUgc2lkZS1lZmZlY3QKKyAgLy8gb2YgdmVyaWZ5aW5nIHRoYXQgd2UgYXJlIG5vdCBjYW5vbmljYWxpemluZyBhd2F5IGFueSBub24tZXhpc3RlbnQKKyAgLy8gZGlyZWN0b3JpZXMuCisgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IHN0cmVhbShPcGVuRGlza0ZpbGUoZGlza19maWxlKSk7CisgIGlmIChzdHJlYW0gPT0gTlVMTCkgeworICAgIHJldHVybiBDQU5OT1RfT1BFTjsKKyAgfQorCisgIHJldHVybiBTVUNDRVNTOworfQorCitib29sIERpc2tTb3VyY2VUcmVlOjpWaXJ0dWFsRmlsZVRvRGlza0ZpbGUoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBkaXNrX2ZpbGUpIHsKKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gc3RyZWFtKE9wZW5WaXJ0dWFsRmlsZSh2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlza19maWxlKSk7CisgIHJldHVybiBzdHJlYW0gIT0gTlVMTDsKK30KKworaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIERpc2tTb3VyY2VUcmVlOjpPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIE9wZW5WaXJ0dWFsRmlsZShmaWxlbmFtZSwgTlVMTCk7Cit9CisKK2lvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBEaXNrU291cmNlVHJlZTo6T3BlblZpcnR1YWxGaWxlKAorICAgIGNvbnN0IHN0cmluZyYgdmlydHVhbF9maWxlLAorICAgIHN0cmluZyogZGlza19maWxlKSB7CisgIGlmICh2aXJ0dWFsX2ZpbGUgIT0gQ2Fub25pY2FsaXplUGF0aCh2aXJ0dWFsX2ZpbGUpIHx8CisgICAgICBDb250YWluc1BhcmVudFJlZmVyZW5jZSh2aXJ0dWFsX2ZpbGUpKSB7CisgICAgLy8gV2UgZG8gbm90IGFsbG93IGltcG9ydGluZyBvZiBwYXRocyBjb250YWluaW5nIHRoaW5ncyBsaWtlICIuLiIgb3IKKyAgICAvLyBjb25zZWN1dGl2ZSBzbGFzaGVzIHNpbmNlIHRoZSBjb21waWxlciBleHBlY3RzIGZpbGVzIHRvIGJlIHVuaXF1ZWx5CisgICAgLy8gaWRlbnRpZmllZCBieSBmaWxlIG5hbWUuCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzXy5zaXplKCk7IGkrKykgeworICAgIHN0cmluZyB0ZW1wX2Rpc2tfZmlsZTsKKyAgICBpZiAoQXBwbHlNYXBwaW5nKHZpcnR1YWxfZmlsZSwgbWFwcGluZ3NfW2ldLnZpcnR1YWxfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzX1tpXS5kaXNrX3BhdGgsICZ0ZW1wX2Rpc2tfZmlsZSkpIHsKKyAgICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBzdHJlYW0gPSBPcGVuRGlza0ZpbGUodGVtcF9kaXNrX2ZpbGUpOworICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkaXNrX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICpkaXNrX2ZpbGUgPSB0ZW1wX2Rpc2tfZmlsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgfQorCisgICAgICBpZiAoZXJybm8gPT0gRUFDQ0VTKSB7CisgICAgICAgIC8vIFRoZSBmaWxlIGV4aXN0cyBidXQgaXMgbm90IHJlYWRhYmxlLgorICAgICAgICAvLyBUT0RPKGtlbnRvbik6ICBGaW5kIGEgd2F5IHRvIHJlcG9ydCB0aGlzIG1vcmUgbmljZWx5LgorICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJSZWFkIGFjY2VzcyBpcyBkZW5pZWQgZm9yIGZpbGU6ICIgPDwgdGVtcF9kaXNrX2ZpbGU7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogRGlza1NvdXJjZVRyZWU6Ok9wZW5EaXNrRmlsZSgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIGludCBmaWxlX2Rlc2NyaXB0b3I7CisgIGRvIHsKKyAgICBmaWxlX2Rlc2NyaXB0b3IgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgfSB3aGlsZSAoZmlsZV9kZXNjcmlwdG9yIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgIGlmIChmaWxlX2Rlc2NyaXB0b3IgPj0gMCkgeworICAgIGlvOjpGaWxlSW5wdXRTdHJlYW0qIHJlc3VsdCA9IG5ldyBpbzo6RmlsZUlucHV0U3RyZWFtKGZpbGVfZGVzY3JpcHRvcik7CisgICAgcmVzdWx0LT5TZXRDbG9zZU9uRGVsZXRlKHRydWUpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2MmZhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oCkBAIC0wLDAgKzEsMzA0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIC5wcm90byBmaWxlIHBhcnNlci4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSU1QT1JURVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9JTVBPUlRFUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW8geyBjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOyB9CisKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgSW1wb3J0ZXI7CitjbGFzcyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvcjsKK2NsYXNzIFNvdXJjZVRyZWU7CitjbGFzcyBEaXNrU291cmNlVHJlZTsKKworLy8gVE9ETyhrZW50b24pOiAgTW92ZSBhbGwgU291cmNlVHJlZSBzdHVmZiB0byBhIHNlcGFyYXRlIGZpbGU/CisKKy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIERlc2NyaXB0b3JEYXRhYmFzZSB3aGljaCBsb2FkcyBmaWxlcyBmcm9tIGEgU291cmNlVHJlZQorLy8gYW5kIHBhcnNlcyB0aGVtLgorLy8KKy8vIE5vdGU6ICBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZSBzaW5jZSBpdCBtYWludGFpbnMgYSB0YWJsZSBvZiBzb3VyY2UKKy8vICAgY29kZSBsb2NhdGlvbnMgZm9yIGVycm9yIHJlcG9ydGluZy4gIEhvd2V2ZXIsIHdoZW4gYSBEZXNjcmlwdG9yUG9vbCB3cmFwcworLy8gICBhIERlc2NyaXB0b3JEYXRhYmFzZSwgaXQgdXNlcyBtdXRleCBsb2NraW5nIHRvIG1ha2Ugc3VyZSBvbmx5IG9uZSBtZXRob2QKKy8vICAgb2YgdGhlIGRhdGFiYXNlIGlzIGNhbGxlZCBhdCBhIHRpbWUsIGV2ZW4gaWYgdGhlIERlc2NyaXB0b3JQb29sIGlzIHVzZWQKKy8vICAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLiAgVGhlcmVmb3JlLCB0aGVyZSBpcyBvbmx5IGEgcHJvYmxlbSBpZiB5b3UgY3JlYXRlCisvLyAgIG11bHRpcGxlIERlc2NyaXB0b3JQb29scyB3cmFwcGluZyB0aGUgc2FtZSBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlCisvLyAgIGFuZCB1c2UgdGhlbSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisvLworLy8gTm90ZTogIFRoaXMgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgpIG9yCisvLyAgIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpOyB0aGVzZSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZShTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSk7CisgIH5Tb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKCk7CisKKyAgLy8gSW5zdHJ1Y3RzIHRoZSBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIHRvIHJlcG9ydCBhbnkgcGFyc2UgZXJyb3JzCisgIC8vIHRvIHRoZSBnaXZlbiBNdWx0aUZpbGVFcnJvckNvbGxlY3Rvci4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKKyAgLy8gcGFyc2luZy4gIGVycm9yX2NvbGxlY3RvciBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbCBlaXRoZXIgdGhpcyBtZXRob2QKKyAgLy8gaXMgY2FsbGVkIGFnYWluIG9yIHRoZSBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIGlzIGRlc3Ryb3llZC4KKyAgdm9pZCBSZWNvcmRFcnJvcnNUbyhNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKSB7CisgICAgZXJyb3JfY29sbGVjdG9yXyA9IGVycm9yX2NvbGxlY3RvcjsKKyAgfQorCisgIC8vIEdldHMgYSBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3Igd2hpY2ggcmVjb3JkcyBlcnJvcnMgdG8gdGhlCisgIC8vIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHNwZWNpZmllZCB3aXRoIFJlY29yZEVycm9yc1RvKCkuICBUaGlzIGNvbGxlY3RvcgorICAvLyBoYXMgdGhlIGFiaWxpdHkgdG8gZGV0ZXJtaW5lIGV4YWN0IGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIG9mIGVycm9ycworICAvLyBmcm9tIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiB0byBpdCBieSB0aGUgRGVzY3JpcHRvclBvb2wuCisgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciogR2V0VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCkgeworICAgIHVzaW5nX3ZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXyA9IHRydWU7CisgICAgcmV0dXJuICZ2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl87CisgIH0KKworICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworCisgcHJpdmF0ZToKKyAgY2xhc3MgU2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yOworCisgIFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlXzsKKyAgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CisKKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFZhbGlkYXRpb25FcnJvckNvbGxlY3RvciA6IHB1YmxpYyBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IgeworICAgcHVibGljOgorICAgIFZhbGlkYXRpb25FcnJvckNvbGxlY3RvcihTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKiBvd25lcik7CisgICAgflZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpOworCisgICAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKKworICAgcHJpdmF0ZToKKyAgICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKiBvd25lcl87CisgIH07CisgIGZyaWVuZCBjbGFzcyBWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I7CisKKyAgYm9vbCB1c2luZ192YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl87CisgIFNvdXJjZUxvY2F0aW9uVGFibGUgc291cmNlX2xvY2F0aW9uc187CisgIFZhbGlkYXRpb25FcnJvckNvbGxlY3RvciB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl87Cit9OworCisvLyBTaW1wbGUgaW50ZXJmYWNlIGZvciBwYXJzaW5nIC5wcm90byBmaWxlcy4gIFRoaXMgd3JhcHMgdGhlIHByb2Nlc3MKKy8vIG9mIG9wZW5pbmcgdGhlIGZpbGUsIHBhcnNpbmcgaXQgd2l0aCBhIFBhcnNlciwgcmVjdXJzaXZlbHkgcGFyc2luZyBhbGwgaXRzCisvLyBpbXBvcnRzLCBhbmQgdGhlbiBjcm9zcy1saW5raW5nIHRoZSByZXN1bHRzIHRvIHByb2R1Y2UgYSBGaWxlRGVzY3JpcHRvci4KKy8vCisvLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgdGhpbiB3cmFwcGVyIGFyb3VuZCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlLgorLy8gWW91IG1heSBmaW5kIHRoYXQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBpcyBtb3JlIGZsZXhpYmxlLgorLy8KKy8vIFRPRE8oa2VudG9uKTogIEkgZmVlbCBsaWtlIHRoaXMgY2xhc3MgaXMgbm90IHdlbGwtbmFtZWQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgSW1wb3J0ZXIgeworIHB1YmxpYzoKKyAgSW1wb3J0ZXIoU291cmNlVHJlZSogc291cmNlX3RyZWUsCisgICAgICAgICAgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpOworICB+SW1wb3J0ZXIoKTsKKworICAvLyBJbXBvcnQgdGhlIGdpdmVuIGZpbGUgYW5kIGJ1aWxkIGEgRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIGl0LiAgSWYKKyAgLy8gdGhlIGZpbGUgaXMgYWxyZWFkeSBpbiB0aGUgRGVzY3JpcHRvclBvb2wsIHRoZSBleGlzdGluZyBGaWxlRGVzY3JpcHRvcgorICAvLyB3aWxsIGJlIHJldHVybmVkLiAgVGhlIEZpbGVEZXNjcmlwdG9yIGlzIHByb3BlcnR5IG9mIHRoZSBEZXNjcmlwdG9yUG9vbCwKKyAgLy8gYW5kIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIGl0IGlzIGRlc3Ryb3llZC4gIElmIGFueSBlcnJvcnMgb2NjdXIsIHRoZXkKKyAgLy8gd2lsbCBiZSByZXBvcnRlZCB1c2luZyB0aGUgZXJyb3IgY29sbGVjdG9yIGFuZCBJbXBvcnQoKSB3aWxsIHJldHVybiBOVUxMLgorICAvLworICAvLyBBIHBhcnRpY3VsYXIgSW1wb3J0ZXIgb2JqZWN0IHdpbGwgb25seSByZXBvcnQgZXJyb3JzIGZvciBhIHBhcnRpY3VsYXIKKyAgLy8gZmlsZSBvbmNlLiAgQWxsIGZ1dHVyZSBhdHRlbXB0cyB0byBpbXBvcnQgdGhlIHNhbWUgZmlsZSB3aWxsIHJldHVybiBOVUxMCisgIC8vIHdpdGhvdXQgcmVwb3J0aW5nIGFueSBlcnJvcnMuICBUaGUgaWRlYSBpcyB0aGF0IHlvdSBtaWdodCB3YW50IHRvIGltcG9ydAorICAvLyBhIGxvdCBvZiBmaWxlcyB3aXRob3V0IHNlZWluZyB0aGUgc2FtZSBlcnJvcnMgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gIElmCisgIC8vIHlvdSB3YW50IHRvIHNlZSBlcnJvcnMgZm9yIHRoZSBzYW1lIGZpbGVzIHJlcGVhdGVkbHksIHlvdSBjYW4gdXNlIGEKKyAgLy8gc2VwYXJhdGUgSW1wb3J0ZXIgb2JqZWN0IHRvIGltcG9ydCBlYWNoIG9uZSAoYnV0IHVzZSB0aGUgc2FtZQorICAvLyBEZXNjcmlwdG9yUG9vbCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNyb3NzLWxpbmtlZCkuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBJbXBvcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKyAgLy8gVGhlIERlc2NyaXB0b3JQb29sIGluIHdoaWNoIGFsbCBpbXBvcnRlZCBGaWxlRGVzY3JpcHRvcnMgYW5kIHRoZWlyCisgIC8vIGNvbnRlbnRzIGFyZSBzdG9yZWQuCisgIGlubGluZSBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gJnBvb2xfOworICB9CisKKyBwcml2YXRlOgorICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltcG9ydGVyKTsKK307CisKKy8vIElmIHRoZSBpbXBvcnRlciBlbmNvdW50ZXJzIHByb2JsZW1zIHdoaWxlIHRyeWluZyB0byBpbXBvcnQgdGhlIHByb3RvIGZpbGVzLAorLy8gaXQgcmVwb3J0cyB0aGVtIHRvIGEgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgaW5saW5lIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKCkge30KKyAgdmlydHVhbCB+TXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IoKTsKKworICAvLyBMaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBhcmUgemVyby1iYXNlZC4gIEEgbGluZSBudW1iZXIgb2YgLTEgaW5kaWNhdGVzCisgIC8vIGFuIGVycm9yIHdpdGggdGhlIGVudGlyZSBmaWxlIChlLmcuICJub3QgZm91bmQiKS4KKyAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IpOworfTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHdoaWNoIHJlcHJlc2VudHMgYSBkaXJlY3RvcnkgdHJlZSBjb250YWluaW5nIHByb3RvIGZpbGVzLgorLy8gVXNlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJbXBvcnRlciB0byByZXNvbHZlIGltcG9ydCBzdGF0ZW1lbnRzCisvLyBNb3N0IHVzZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0byB1c2UgdGhlIERpc2tTb3VyY2VUcmVlIGltcGxlbWVudGF0aW9uLAorLy8gYmVsb3cuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU291cmNlVHJlZSB7CisgcHVibGljOgorICBpbmxpbmUgU291cmNlVHJlZSgpIHt9CisgIHZpcnR1YWwgflNvdXJjZVRyZWUoKTsKKworICAvLyBPcGVuIHRoZSBnaXZlbiBmaWxlIGFuZCByZXR1cm4gYSBzdHJlYW0gdGhhdCByZWFkcyBpdCwgb3IgTlVMTCBpZiBub3QKKyAgLy8gZm91bmQuICBUaGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0LiAgVGhlIGZpbGVuYW1lCisgIC8vIG11c3QgYmUgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSBhbmQgbXVzdCBub3QKKyAgLy8gY29udGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzLgorICB2aXJ0dWFsIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb3VyY2VUcmVlKTsKK307CisKKy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFNvdXJjZVRyZWUgd2hpY2ggbG9hZHMgZmlsZXMgZnJvbSBsb2NhdGlvbnMgb24gZGlzay4KKy8vIE11bHRpcGxlIG1hcHBpbmdzIGNhbiBiZSBzZXQgdXAgdG8gbWFwIGxvY2F0aW9ucyBpbiB0aGUgRGlza1NvdXJjZVRyZWUgdG8KKy8vIGxvY2F0aW9ucyBpbiB0aGUgcGh5c2ljYWwgZmlsZXN5c3RlbS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEaXNrU291cmNlVHJlZSA6IHB1YmxpYyBTb3VyY2VUcmVlIHsKKyBwdWJsaWM6CisgIERpc2tTb3VyY2VUcmVlKCk7CisgIH5EaXNrU291cmNlVHJlZSgpOworCisgIC8vIE1hcCBhIHBhdGggb24gZGlzayB0byBhIGxvY2F0aW9uIGluIHRoZSBTb3VyY2VUcmVlLiAgVGhlIHBhdGggbWF5IGJlCisgIC8vIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuICBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgdGhlIGVudGlyZSB0cmVlCisgIC8vIHVuZGVyIGl0IHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBnaXZlbiB2aXJ0dWFsIGxvY2F0aW9uLiAgVG8gbWFwIGEgZGlyZWN0b3J5CisgIC8vIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSwgcGFzcyBhbiBlbXB0eSBzdHJpbmcgZm9yIHZpcnR1YWxfcGF0aC4KKyAgLy8KKyAgLy8gSWYgbXVsdGlwbGUgbWFwcGVkIHBhdGhzIGFwcGx5IHdoZW4gb3BlbmluZyBhIGZpbGUsIHRoZXkgd2lsbCBiZSBzZWFyY2hlZAorICAvLyBpbiBvcmRlci4gIEZvciBleGFtcGxlLCBpZiB5b3UgZG86CisgIC8vICAgTWFwUGF0aCgiYmFyIiwgImZvby9iYXIiKTsKKyAgLy8gICBNYXBQYXRoKCIiLCAiYmF6Iik7CisgIC8vIGFuZCB0aGVuIHlvdSBkbzoKKyAgLy8gICBPcGVuKCJiYXIvcXV4Iik7CisgIC8vIHRoZSBEaXNrU291cmNlVHJlZSB3aWxsIGZpcnN0IHRyeSB0byBvcGVuIGZvby9iYXIvcXV4LCB0aGVuIGJhei9iYXIvcXV4LAorICAvLyByZXR1cm5pbmcgdGhlIGZpcnN0IG9uZSB0aGF0IG9wZW5zIHN1Y2Nlc3NmdWx5LgorICAvLworICAvLyBkaXNrX3BhdGggbWF5IGJlIGFuIGFic29sdXRlIHBhdGggb3IgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAorICAvLyBqdXN0IGxpa2UgYSBwYXRoIHlvdSdkIHBhc3MgdG8gb3BlbigpLgorICB2b2lkIE1hcFBhdGgoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX3BhdGgsIGNvbnN0IHN0cmluZyYgZGlza19wYXRoKTsKKworICAvLyBSZXR1cm4gdHlwZSBmb3IgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKCkuCisgIGVudW0gRGlza0ZpbGVUb1ZpcnR1YWxGaWxlUmVzdWx0IHsKKyAgICBTVUNDRVNTLAorICAgIFNIQURPV0VELAorICAgIENBTk5PVF9PUEVOLAorICAgIE5PX01BUFBJTkcKKyAgfTsKKworICAvLyBHaXZlbiBhIHBhdGggdG8gYSBmaWxlIG9uIGRpc2ssIGZpbmQgYSB2aXJ0dWFsIHBhdGggbWFwcGluZyB0byB0aGF0CisgIC8vIGZpbGUuICBUaGUgZmlyc3QgbWFwcGluZyBjcmVhdGVkIHdpdGggTWFwUGF0aCgpIHdob3NlIGRpc2tfcGF0aCBjb250YWlucworICAvLyB0aGUgZmlsZW5hbWUgaXMgdXNlZC4gIEhvd2V2ZXIsIHRoYXQgdmlydHVhbCBwYXRoIG1heSBub3QgYWN0dWFsbHkgYmUKKyAgLy8gdXNhYmxlIHRvIG9wZW4gdGhlIGdpdmVuIGZpbGUuICBQb3NzaWJsZSByZXR1cm4gdmFsdWVzIGFyZToKKyAgLy8gKiBTVUNDRVNTOiBUaGUgbWFwcGluZyB3YXMgZm91bmQuICAqdmlydHVhbF9maWxlIGlzIGZpbGxlZCBpbiBzbyB0aGF0CisgIC8vICAgY2FsbGluZyBPcGVuKCp2aXJ0dWFsX2ZpbGUpIHdpbGwgb3BlbiB0aGUgZmlsZSBuYW1lZCBieSBkaXNrX2ZpbGUuCisgIC8vICogU0hBRE9XRUQ6IEEgbWFwcGluZyB3YXMgZm91bmQsIGJ1dCB1c2luZyBPcGVuKCkgdG8gb3BlbiB0aGlzIHZpcnR1YWwKKyAgLy8gICBwYXRoIHdpbGwgZW5kIHVwIHJldHVybmluZyBzb21lIGRpZmZlcmVudCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHNvbWUKKyAgLy8gICBvdGhlciBtYXBwaW5nIHdpdGggYSBoaWdoZXIgcHJlY2VkZW5jZSBhbHNvIG1hdGNoZXMgdGhpcyB2aXJ0dWFsIHBhdGgKKyAgLy8gICBhbmQgbWFwcyBpdCB0byBhIGRpZmZlcmVudCBmaWxlIHRoYXQgZXhpc3RzIG9uIGRpc2suICAqdmlydHVhbF9maWxlCisgIC8vICAgaXMgZmlsbGVkIGluIGFzIGl0IHdvdWxkIGJlIGluIHRoZSBTVUNDRVNTIGNhc2UuICAqc2hhZG93aW5nX2Rpc2tfZmlsZQorICAvLyAgIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBkaXNrIHBhdGggb2YgdGhlIGZpbGUgd2hpY2ggd291bGQgYmUgb3BlbmVkIGlmCisgIC8vICAgeW91IHdlcmUgdG8gY2FsbCBPcGVuKCp2aXJ0dWFsX2ZpbGUpLgorICAvLyAqIENBTk5PVF9PUEVOOiBUaGUgbWFwcGluZyB3YXMgZm91bmQgYW5kIHdhcyBub3Qgc2hhZG93ZWQsIGJ1dCB0aGUKKyAgLy8gICBmaWxlIHNwZWNpZmllZCBjYW5ub3QgYmUgb3BlbmVkLiAgV2hlbiB0aGlzIHZhbHVlIGlzIHJldHVybmVkLAorICAvLyAgIGVycm5vIHdpbGwgaW5kaWNhdGUgdGhlIHJlYXNvbiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLiAgKnZpcnR1YWxfZmlsZQorICAvLyAgIHdpbGwgYmUgc2V0IHRvIHRoZSB2aXJ0dWFsIHBhdGggYXMgaW4gdGhlIFNVQ0NFU1MgY2FzZSwgZXZlbiB0aG91Z2gKKyAgLy8gICBpdCBpcyBub3QgdXNlZnVsLgorICAvLyAqIE5PX01BUFBJTkc6IEluZGljYXRlcyB0aGF0IG5vIG1hcHBpbmcgd2FzIGZvdW5kIHdoaWNoIGNvbnRhaW5zIHRoaXMKKyAgLy8gICBmaWxlLgorICBEaXNrRmlsZVRvVmlydHVhbEZpbGVSZXN1bHQKKyAgICBEaXNrRmlsZVRvVmlydHVhbEZpbGUoY29uc3Qgc3RyaW5nJiBkaXNrX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHNoYWRvd2luZ19kaXNrX2ZpbGUpOworCisgIC8vIEdpdmVuIGEgdmlydHVhbCBwYXRoLCBmaW5kIHRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIGRpc2suCisgIC8vIFJldHVybiB0cnVlIGFuZCB1cGRhdGUgZGlza19maWxlIHdpdGggdGhlIG9uLWRpc2sgcGF0aCBpZiB0aGUgZmlsZSBleGlzdHMuCisgIC8vIFJldHVybiBmYWxzZSBhbmQgbGVhdmUgZGlza19maWxlIHVudG91Y2hlZCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgorICBib29sIFZpcnR1YWxGaWxlVG9EaXNrRmlsZShjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZSwgc3RyaW5nKiBkaXNrX2ZpbGUpOworCisgIC8vIGltcGxlbWVudHMgU291cmNlVHJlZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworCisgcHJpdmF0ZToKKyAgc3RydWN0IE1hcHBpbmcgeworICAgIHN0cmluZyB2aXJ0dWFsX3BhdGg7CisgICAgc3RyaW5nIGRpc2tfcGF0aDsKKworICAgIGlubGluZSBNYXBwaW5nKGNvbnN0IHN0cmluZyYgdmlydHVhbF9wYXRoX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGlza19wYXRoX3BhcmFtKQorICAgICAgOiB2aXJ0dWFsX3BhdGgodmlydHVhbF9wYXRoX3BhcmFtKSwgZGlza19wYXRoKGRpc2tfcGF0aF9wYXJhbSkge30KKyAgfTsKKyAgdmVjdG9yPE1hcHBpbmc+IG1hcHBpbmdzXzsKKworICAvLyBMaWtlIE9wZW4oKSwgYnV0IHJldHVybnMgdGhlIG9uLWRpc2sgcGF0aCBpbiBkaXNrX2ZpbGUgaWYgZGlza19maWxlIGlzCisgIC8vIG5vbi1OVUxMIGFuZCB0aGUgZmlsZSBjb3VsZCBiZSBzdWNjZXNzZnVsbHkgb3BlbmVkLgorICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3BlblZpcnR1YWxGaWxlKGNvbnN0IHN0cmluZyYgdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZGlza19maWxlKTsKKworICAvLyBMaWtlIE9wZW4oKSBidXQgZ2l2ZW4gdGhlIGFjdHVhbCBvbi1kaXNrIHBhdGguCisgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBPcGVuRGlza0ZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERpc2tTb3VyY2VUcmVlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0lNUE9SVEVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmFkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw2MDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK25hbWVzcGFjZSB7CisKKyNkZWZpbmUgRVhQRUNUX1NVQlNUUklORyhuZWVkbGUsIGhheXN0YWNrKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIChuZWVkbGUpLCAoaGF5c3RhY2spKQorCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgTW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKyAgfk1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgc3RyaW5nIHRleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTokMjogJDNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIFNvdXJjZVRyZWUgYmFja2VkIGJ5IGEgc2ltcGxlIG1hcC4KK2NsYXNzIE1vY2tTb3VyY2VUcmVlIDogcHVibGljIFNvdXJjZVRyZWUgeworIHB1YmxpYzoKKyAgTW9ja1NvdXJjZVRyZWUoKSB7fQorICB+TW9ja1NvdXJjZVRyZWUoKSB7fQorCisgIHZvaWQgQWRkRmlsZShjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGNvbnRlbnRzKSB7CisgICAgZmlsZXNfW25hbWVdID0gY29udGVudHM7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIFNvdXJjZVRyZWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgY29uc3QgY2hhciogY29udGVudHMgPSBGaW5kUHRyT3JOdWxsKGZpbGVzXywgZmlsZW5hbWUpOworICAgIGlmIChjb250ZW50cyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBpbzo6QXJyYXlJbnB1dFN0cmVhbShjb250ZW50cywgc3RybGVuKGNvbnRlbnRzKSk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBoYXNoX21hcDxzdHJpbmcsIGNvbnN0IGNoYXIqPiBmaWxlc187Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEltcG9ydGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEltcG9ydGVyVGVzdCgpCisgICAgOiBpbXBvcnRlcl8oJnNvdXJjZV90cmVlXywgJmVycm9yX2NvbGxlY3Rvcl8pIHt9CisKKyAgdm9pZCBBZGRGaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgICBzb3VyY2VfdHJlZV8uQWRkRmlsZShmaWxlbmFtZSwgdGV4dCk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGNvbGxlY3RlZCBlcnJvciB0ZXh0CisgIHN0cmluZyBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIGVycm9yX2NvbGxlY3Rvcl8udGV4dF87IH0KKworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yXzsKKyAgTW9ja1NvdXJjZVRyZWUgc291cmNlX3RyZWVfOworICBJbXBvcnRlciBpbXBvcnRlcl87Cit9OworCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBJbXBvcnQpIHsKKyAgLy8gVGVzdCBub3JtYWwgaW1wb3J0aW5nLgorICBBZGRGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKTsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoIkZvbyIsIGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+bmFtZSgpKTsKKworICAvLyBJbXBvcnRpbmcgYWdhaW4gc2hvdWxkIHJldHVybiBzYW1lIG9iamVjdC4KKyAgRVhQRUNUX0VRKGZpbGUsIGltcG9ydGVyXy5JbXBvcnQoImZvby5wcm90byIpKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgSW1wb3J0TmVzdGVkKSB7CisgIC8vIFRlc3QgdGhhdCBpbXBvcnRpbmcgYSBmaWxlIHdoaWNoIGltcG9ydHMgYW5vdGhlciBmaWxlIHdvcmtzLgorICBBZGRGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIG9wdGlvbmFsIEJhciBiYXIgPSAxO1xuIgorICAgICJ9XG4iKTsKKyAgQWRkRmlsZSgiYmFyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge31cbiIpOworCisgIC8vIE5vdGUgdGhhdCBib3RoIGZpbGVzIGFyZSBhY3R1YWxseSBwYXJzZWQgYnkgdGhlIGZpcnN0IGNhbGwgdG8gSW1wb3J0KCkKKyAgLy8gaGVyZSwgc2luY2UgZm9vLnByb3RvIGltcG9ydHMgYmFyLnByb3RvLiAgVGhlIHNlY29uZCBjYWxsIGp1c3QgcmV0dXJucworICAvLyB0aGUgc2FtZSBQcm90b0ZpbGUgZm9yIGJhci5wcm90byB3aGljaCB3YXMgY29uc3RydWN0ZWQgd2hpbGUgaW1wb3J0aW5nCisgIC8vIGZvby5wcm90by4gIFdlIHRlc3QgdGhhdCB0aGlzIGlzIHRoZSBjYXNlIGJlbG93IGJ5IGNoZWNraW5nIHRoYXQgYmFyCisgIC8vIGlzIGFtb25nIGZvbydzIGRlcGVuZGVuY2llcyAoYnkgcG9pbnRlcikuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb28gPSBpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IGltcG9ydGVyXy5JbXBvcnQoImJhci5wcm90byIpOworICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIEFTU0VSVF9UUlVFKGJhciAhPSBOVUxMKTsKKworICAvLyBDaGVjayB0aGF0IGZvbydzIGRlcGVuZGVuY3kgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIGJhci4KKyAgQVNTRVJUX0VRKDEsIGZvby0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGJhciwgZm9vLT5kZXBlbmRlbmN5KDApKTsKKworICAvLyBDaGVjayB0aGF0IGZvbyBwcm9wZXJseSBjcm9zcy1saW5rcyBiYXIuCisgIEFTU0VSVF9FUSgxLCBmb28tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDEsIGJhci0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPmZpZWxkX2NvdW50KCkpOworICBBU1NFUlRfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsCisgICAgICAgICAgICBmb28tPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCktPnR5cGUoKSk7CisgIEVYUEVDVF9FUShiYXItPm1lc3NhZ2VfdHlwZSgwKSwKKyAgICAgICAgICAgIGZvby0+bWVzc2FnZV90eXBlKDApLT5maWVsZCgwKS0+bWVzc2FnZV90eXBlKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBGaWxlTm90Rm91bmQpIHsKKyAgLy8gRXJyb3I6ICBQYXJzaW5nIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisgIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoImZvby5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfRVEoCisgICAgImZvby5wcm90bzotMTowOiBGaWxlIG5vdCBmb3VuZC5cbiIsCisgICAgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Cit9CisKK1RFU1RfRihJbXBvcnRlclRlc3QsIEltcG9ydE5vdEZvdW5kKSB7CisgIC8vIEVycm9yOiAgSW1wb3J0aW5nIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisgIEFkZEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIik7CisKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgiZm9vLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9FUSgKKyAgICAiYmFyLnByb3RvOi0xOjA6IEZpbGUgbm90IGZvdW5kLlxuIgorICAgICJmb28ucHJvdG86LTE6MDogSW1wb3J0IFwiYmFyLnByb3RvXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLlxuIiwKKyAgICBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgUmVjdXJzaXZlSW1wb3J0KSB7CisgIC8vIEVycm9yOiAgUmVjdXJzaXZlIGltcG9ydC4KKyAgQWRkRmlsZSgicmVjdXJzaXZlMS5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcInJlY3Vyc2l2ZTIucHJvdG9cIjtcbiIpOworICBBZGRGaWxlKCJyZWN1cnNpdmUyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwicmVjdXJzaXZlMS5wcm90b1wiO1xuIik7CisKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgicmVjdXJzaXZlMS5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfRVEoCisgICAgInJlY3Vyc2l2ZTEucHJvdG86LTE6MDogRmlsZSByZWN1cnNpdmVseSBpbXBvcnRzIGl0c2VsZjogcmVjdXJzaXZlMS5wcm90byAiCisgICAgICAiLT4gcmVjdXJzaXZlMi5wcm90byAtPiByZWN1cnNpdmUxLnByb3RvXG4iCisgICAgInJlY3Vyc2l2ZTIucHJvdG86LTE6MDogSW1wb3J0IFwicmVjdXJzaXZlMS5wcm90b1wiIHdhcyBub3QgZm91bmQgIgorICAgICAgIm9yIGhhZCBlcnJvcnMuXG4iCisgICAgInJlY3Vyc2l2ZTEucHJvdG86LTE6MDogSW1wb3J0IFwicmVjdXJzaXZlMi5wcm90b1wiIHdhcyBub3QgZm91bmQgIgorICAgICAgIm9yIGhhZCBlcnJvcnMuXG4iLAorICAgIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworfQorCisvLyBUT0RPKHNhbmpheSk6IFRoZSBNYXBGaWVsZCB0ZXN0cyBiZWxvdyBtb3JlIHByb3Blcmx5IGJlbG9uZyBpbgorLy8gZGVzY3JpcHRvcl91bml0dGVzdCwgYnV0IGFyZSBtb3JlIGNvbnZlbmllbnQgdG8gdGVzdCBoZXJlLgorVEVTVF9GKEltcG9ydGVyVGVzdCwgTWFwRmllbGRWYWxpZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW0ge1xuIgorICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGtleSA9IDE7XG4iCisgICAgICAifVxuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcGVhdGVkIEl0ZW0gaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwia2V5XCJdO1xuIgorICAgICAgIn1cbiIKKyAgICAgICk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIik7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCkgPDwgZXJyb3JfY29sbGVjdG9yXy50ZXh0XzsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKworICAvLyBDaGVjayB0aGF0IE1hcDo6aXRlbXMgcG9pbnRzIHRvIEl0ZW06OmtleQorICBjb25zdCBEZXNjcmlwdG9yKiBpdGVtX3R5cGUgPSBmaWxlLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkl0ZW0iKTsKKyAgQVNTRVJUX1RSVUUoaXRlbV90eXBlICE9IE5VTEwpOworICBjb25zdCBEZXNjcmlwdG9yKiBtYXBfdHlwZSA9IGZpbGUtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiTWFwIik7CisgIEFTU0VSVF9UUlVFKG1hcF90eXBlICE9IE5VTEwpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleV9maWVsZCA9IGl0ZW1fdHlwZS0+RmluZEZpZWxkQnlOYW1lKCJrZXkiKTsKKyAgQVNTRVJUX1RSVUUoa2V5X2ZpZWxkICE9IE5VTEwpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGl0ZW1zX2ZpZWxkID0gbWFwX3R5cGUtPkZpbmRGaWVsZEJ5TmFtZSgiaXRlbXMiKTsKKyAgQVNTRVJUX1RSVUUoaXRlbXNfZmllbGQgIT0gTlVMTCk7CisgIEVYUEVDVF9FUShpdGVtc19maWVsZC0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKSwga2V5X2ZpZWxkKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgTWFwRmllbGROb3RSZXBlYXRlZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW0ge1xuIgorICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGtleSA9IDE7XG4iCisgICAgICAifVxuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIEl0ZW0gaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwia2V5XCJdO1xuIgorICAgICAgIn1cbiIKKyAgICAgICk7CisgIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoIm1hcC5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfU1VCU1RSSU5HKCJvbmx5IGFsbG93ZWQgZm9yIHJlcGVhdGVkIGZpZWxkcyIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZE5vdE1lc3NhZ2VUeXBlKSB7CisgIEFkZEZpbGUoCisgICAgICAibWFwLnByb3RvIiwKKyAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcGVhdGVkIGludDMyIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXkgPSBcImtleVwiXTtcbiIKKyAgICAgICJ9XG4iCisgICAgICApOworICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJtYXAucHJvdG8iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1NVQlNUUklORygib25seSBhbGxvd2VkIGZvciBmaWVsZHMgd2l0aCBhIG1lc3NhZ2UgdHlwZSIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZFR5cGVOb3RGb3VuZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIE1hcCB7XG4iCisgICAgICAiICByZXBlYXRlZCBVbmtub3duIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXkgPSBcImtleVwiXTtcbiIKKyAgICAgICJ9XG4iCisgICAgICApOworICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJtYXAucHJvdG8iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1NVQlNUUklORygibm90IGRlZmluZWQiLCBlcnJvcigpKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgTWFwRmllbGRLZXlOb3RGb3VuZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW0ge1xuIgorICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGtleSA9IDE7XG4iCisgICAgICAifVxuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcGVhdGVkIEl0ZW0gaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwiYmFka2V5XCJdO1xuIgorICAgICAgIn1cbiIKKyAgICAgICk7CisgIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoIm1hcC5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfU1VCU1RSSU5HKCJDb3VsZCBub3QgZmluZCBmaWVsZCIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZEtleVJlcGVhdGVkKSB7CisgIEFkZEZpbGUoCisgICAgICAibWFwLnByb3RvIiwKKyAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgIm1lc3NhZ2UgSXRlbSB7XG4iCisgICAgICAiICByZXBlYXRlZCBzdHJpbmcga2V5ID0gMTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAibWVzc2FnZSBNYXAge1xuIgorICAgICAgIiAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5ID0gXCJrZXlcIl07XG4iCisgICAgICAifVxuIgorICAgICAgKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9TVUJTVFJJTkcoIm11c3Qgbm90IG5hbWUgYSByZXBlYXRlZCBmaWVsZCIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZEtleU5vdFNjYWxhcikgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW1LZXkgeyB9XG4iCisgICAgICAibWVzc2FnZSBJdGVtIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIEl0ZW1LZXkga2V5ID0gMTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAibWVzc2FnZSBNYXAge1xuIgorICAgICAgIiAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5ID0gXCJrZXlcIl07XG4iCisgICAgICAifVxuIgorICAgICAgKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9TVUJTVFJJTkcoIm11c3QgbmFtZSBhIHNjYWxhciBvciBzdHJpbmciLCBlcnJvcigpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBEaXNrU291cmNlVHJlZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZGlybmFtZXNfLnB1c2hfYmFjayhUZXN0VGVtcERpcigpICsgIi90ZXN0X3Byb3RvMl9pbXBvcnRfcGF0aF8xIik7CisgICAgZGlybmFtZXNfLnB1c2hfYmFjayhUZXN0VGVtcERpcigpICsgIi90ZXN0X3Byb3RvMl9pbXBvcnRfcGF0aF8yIik7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcm5hbWVzXy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKEZpbGU6OkV4aXN0cyhkaXJuYW1lc19baV0pKSB7CisgICAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGRpcm5hbWVzX1tpXSwgTlVMTCwgTlVMTCk7CisgICAgICB9CisgICAgICBHT09HTEVfQ0hFQ0soRmlsZTo6Q3JlYXRlRGlyKGRpcm5hbWVzX1tpXS5jX3N0cigpLCBERUZBVUxUX0ZJTEVfTU9ERSkpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcm5hbWVzXy5zaXplKCk7IGkrKykgeworICAgICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkoZGlybmFtZXNfW2ldLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgIH0KKworICB2b2lkIEFkZEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgY2hhciogY29udGVudHMpIHsKKyAgICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGNvbnRlbnRzLCBmaWxlbmFtZSk7CisgIH0KKworICB2b2lkIEFkZFN1YmRpcihjb25zdCBzdHJpbmcmIGRpcm5hbWUpIHsKKyAgICBHT09HTEVfQ0hFQ0soRmlsZTo6Q3JlYXRlRGlyKGRpcm5hbWUuY19zdHIoKSwgREVGQVVMVF9GSUxFX01PREUpKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0RmlsZUNvbnRlbnRzKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2NvbnRlbnRzKSB7CisgICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLk9wZW4oZmlsZW5hbWUpKTsKKworICAgIEFTU0VSVF9GQUxTRShpbnB1dCA9PSBOVUxMKTsKKworICAgIC8vIFJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUuCisgICAgc3RyaW5nIGZpbGVfY29udGVudHM7CisgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICB3aGlsZSAoaW5wdXQtPk5leHQoJmRhdGEsICZzaXplKSkgeworICAgICAgZmlsZV9jb250ZW50cy5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShleHBlY3RlZF9jb250ZW50cywgZmlsZV9jb250ZW50cyk7CisgIH0KKworICB2b2lkIEV4cGVjdEZpbGVOb3RGb3VuZChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLk9wZW4oZmlsZW5hbWUpKTsKKyAgICBFWFBFQ1RfVFJVRShpbnB1dCA9PSBOVUxMKTsKKyAgfQorCisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKKworICAvLyBQYXRocyBvZiB0d28gb24tZGlzayBkaXJlY3RvcmllcyB0byB1c2UgZHVyaW5nIHRoZSB0ZXN0LgorICB2ZWN0b3I8c3RyaW5nPiBkaXJuYW1lc187Cit9OworCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBNYXBSb290KSB7CisgIC8vIFRlc3Qgb3BlbmluZyBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIHJvb3Qgb2YgdGhlCisgIC8vIHNvdXJjZSB0cmVlLgorICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKKworICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXIiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTWFwRGlyZWN0b3J5KSB7CisgIC8vIFRlc3Qgb3BlbmluZyBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBtYXBwZWQgdG8gc29tZXdoZXJlIG90aGVyCisgIC8vIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorCisgIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJiYXoiLCBkaXJuYW1lc19bMF0pOworCisgIEV4cGVjdEZpbGVDb250ZW50cygiYmF6L2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXovYmFyIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiZm9vIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmFyIik7CisKKyAgLy8gTm9uLWNhbm9uaWNhbCBmaWxlIG5hbWVzIHNob3VsZCBub3Qgd29yay4KKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXovL2ZvbyIpOworICBFeHBlY3RGaWxlTm90Rm91bmQoImJhei8uLi9iYXovZm9vIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmF6Ly4vZm9vIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmF6L2Zvby8iKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTm9QYXJlbnQpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbm5vdCBvcGVuIGZpbGVzIGluIGEgcGFyZW50IG9mIGEgbWFwcGVkIGRpcmVjdG9yeS4KKworICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBBZGRTdWJkaXIoZGlybmFtZXNfWzBdICsgIi9iYXIiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2Jhci9iYXoiLCAiQmxhaC4iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoIiIsIGRpcm5hbWVzX1swXSArICIvYmFyIik7CisKKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJiYXoiLCAiQmxhaC4iKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCIuLi9mb28iKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCIuLi9iYXIvYmF6Iik7Cit9CisKK1RFU1RfRihEaXNrU291cmNlVHJlZVRlc3QsIE1hcEZpbGUpIHsKKyAgLy8gVGVzdCBvcGVuaW5nIGEgZmlsZSB0aGF0IGlzIG1hcHBlZCBkaXJlY3RseSBpbnRvIHRoZSBzb3VyY2UgdHJlZS4KKworICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZm9vIiwgZGlybmFtZXNfWzBdICsgIi9mb28iKTsKKworICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXIiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgU2VhcmNoTXVsdGlwbGVEaXJlY3RvcmllcykgeworICAvLyBUZXN0IG1hcHBpbmcgYW5kIHNlYXJjaGluZyBtdWx0aXBsZSBkaXJlY3Rvcmllcy4KKworICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBBZGRGaWxlKGRpcm5hbWVzX1sxXSArICIvZm9vIiwgIlRoaXMgZmlsZSBzaG91bGQgYmUgaGlkZGVuLiIpOworICBBZGRGaWxlKGRpcm5hbWVzX1sxXSArICIvYmFyIiwgIkdvb2RieWUgV29ybGQhIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCIiLCBkaXJuYW1lc19bMF0pOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzFdKTsKKworICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJiYXIiLCAiR29vZGJ5ZSBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXoiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgT3JkZXJpbmdUcnVtcHNTcGVjaWZpY2l0eSkgeworICAvLyBUZXN0IHRoYXQgZGlyZWN0b3JpZXMgYXJlIGFsd2F5cyBzZWFyY2hlZCBpbiBvcmRlciwgZXZlbiB3aGVuIGEgbGF0dGVyCisgIC8vIGRpcmVjdG9yeSBpcyBtb3JlLXNwZWNpZmljIHRoYW4gYSBmb3JtZXIgb25lLgorCisgIC8vIENyZWF0ZSB0aGUgImJhciIgZGlyZWN0b3J5IHNvIHdlIGNhbiBwdXQgYSBmaWxlIGluIGl0LgorICBBU1NFUlRfVFJVRShGaWxlOjpDcmVhdGVEaXIoKGRpcm5hbWVzX1swXSArICIvYmFyIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRklMRV9NT0RFKSk7CisKKyAgLy8gQWRkIGZpbGVzIGFuZCBtYXAgcGF0aHMuCisgIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9iYXIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBBZGRGaWxlKGRpcm5hbWVzX1sxXSArICIvZm9vIiwgIlRoaXMgZmlsZSBzaG91bGQgYmUgaGlkZGVuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1sxXSk7CisKKyAgLy8gQ2hlY2suCisgIEV4cGVjdEZpbGVDb250ZW50cygiYmFyL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKSB7CisgIC8vIFRlc3QgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlLgorCisgIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7CisgIEFkZEZpbGUoZGlybmFtZXNfWzFdICsgIi9mb28iLCAiVGhpcyBmaWxlIHNob3VsZCBiZSBoaWRkZW4uIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJiYXIiLCBkaXJuYW1lc19bMF0pOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzFdKTsKKworICBzdHJpbmcgdmlydHVhbF9maWxlOworICBzdHJpbmcgc2hhZG93aW5nX2Rpc2tfZmlsZTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6Ok5PX01BUFBJTkcsCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICIvZm9vIiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNIQURPV0VELAorICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICBkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiYmFyL2ZvbyIsIHZpcnR1YWxfZmlsZSk7CisgIEVYUEVDVF9FUShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsIHNoYWRvd2luZ19kaXNrX2ZpbGUpOworCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgIGRpcm5hbWVzX1sxXSArICIvYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJiYXIvYmF6IiwgdmlydHVhbF9maWxlKTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNVQ0NFU1MsCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgIGRpcm5hbWVzX1swXSArICIvZm9vIiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJiYXIvZm9vIiwgdmlydHVhbF9maWxlKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlQ2Fub25pY2FsaXphdGlvbikgeworICAvLyBUZXN0IGhhbmRsaW5nIG9mICIuLiIsICIuIiwgZXRjLiBpbiBEaXNrRmlsZVRvVmlydHVhbEZpbGUoKS4KKworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMSIsICIuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMiIsICIuLi8uLi9mb28iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjMiLCAiLi9mb28vYmFyLy4iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjQiLCAiLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgIi9xdXgiKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjUiLCAiL3F1dXgvIik7CisKKyAgc3RyaW5nIHZpcnR1YWxfZmlsZTsKKyAgc3RyaW5nIHNoYWRvd2luZ19kaXNrX2ZpbGU7CisKKyAgLy8gIi4uLy4uIiBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgdW5kZXIgIi4uIi4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HLAorICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICAiLi4vLi4vYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKworICAvLyAiL2ZvbyIgaXMgbm90IG1hcHBlZCAoaXQgc2hvdWxkIG5vdCBiZSBtaXNpbnRlcHJldGVkIGFzIGJlaW5nIHVuZGVyICIuIikuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgIi9mb28iLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworCisjaWZkZWYgV0lOMzIKKyAgLy8gIkM6XGZvbyIgaXMgbm90IG1hcHBlZCAoaXQgc2hvdWxkIG5vdCBiZSBtaXNpbnRlcHJldGVkIGFzIGJlaW5nIHVuZGVyICIuIikuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgIkM6XFxmb28iLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworI2VuZGlmICAvLyBXSU4zMgorCisgIC8vIEJ1dCAiLi4vYmF6IiBzaG91bGQgYmUuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICIuLi9iYXoiLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworICBFWFBFQ1RfRVEoImRpcjEvYmF6IiwgdmlydHVhbF9maWxlKTsKKworICAvLyAiLi4vLi4vZm9vL2JheiIgaXMgdW5kZXIgIi4uLy4uL2ZvbyIuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICIuLi8uLi9mb28vYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJkaXIyL2JheiIsIHZpcnR1YWxfZmlsZSk7CisKKyAgLy8gImZvby8uL2Jhci9iYXoiIGlzIHVuZGVyICIuL2Zvby9iYXIvLiIuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICJmb28vYmFyL2JheiIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyMy9iYXoiLCB2aXJ0dWFsX2ZpbGUpOworCisgIC8vICJiYXIiIGlzIHVuZGVyICIuIi4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgImJhciIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyNC9iYXIiLCB2aXJ0dWFsX2ZpbGUpOworCisgIC8vICIvcXV4L2JheiIgaXMgdW5kZXIgIi9xdXgiLgorICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OkNBTk5PVF9PUEVOLAorICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICAiL3F1eC9iYXoiLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworICBFWFBFQ1RfRVEoImJheiIsIHZpcnR1YWxfZmlsZSk7CisKKyAgLy8gIi9xdXV4L2JhciIgaXMgdW5kZXIgIi9xdXV4Ii4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgIi9xdXV4L2JhciIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyNS9iYXIiLCB2aXJ0dWFsX2ZpbGUpOworfQorCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUpIHsKKyAgLy8gVGVzdCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUuCisKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICJUaGlzIGZpbGUgc2hvdWxkIGJlIGhpZGRlbi4iKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL3F1dXgiLCAiVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaGlkZGVuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzBdKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1sxXSk7CisKKyAgLy8gRXhpc3RlbnQgZmlsZXMsIHNoYWRvd2VkIGFuZCBub24tc2hhZG93ZWQgY2FzZS4KKyAgc3RyaW5nIGRpc2tfZmlsZTsKKyAgRVhQRUNUX1RSVUUoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL2ZvbyIsICZkaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKGRpcm5hbWVzX1swXSArICIvZm9vIiwgZGlza19maWxlKTsKKyAgRVhQRUNUX1RSVUUoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL3F1dXgiLCAmZGlza19maWxlKSk7CisgIEVYUEVDVF9FUShkaXJuYW1lc19bMV0gKyAiL3F1dXgiLCBkaXNrX2ZpbGUpOworCisgIC8vIE5vbmV4aXN0ZW50IGZpbGUgaW4gZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB2aWNlIHZlcnNhLgorICBzdHJpbmcgbm90X3RvdWNoZWQgPSAibm90IHRvdWNoZWQiOworICBFWFBFQ1RfRkFMU0Uoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL2JheiIsICZub3RfdG91Y2hlZCkpOworICBFWFBFQ1RfRVEoIm5vdCB0b3VjaGVkIiwgbm90X3RvdWNoZWQpOworICBFWFBFQ1RfRkFMU0Uoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmF6L2ZvbyIsICZub3RfdG91Y2hlZCkpOworICBFWFBFQ1RfRVEoIm5vdCB0b3VjaGVkIiwgbm90X3RvdWNoZWQpOworCisgIC8vIEFjY2VwdCBOVUxMIGFzIG91dHB1dCBwYXJhbWV0ZXIuCisgIEVYUEVDVF9UUlVFKHNvdXJjZV90cmVlXy5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoImJhci9mb28iLCBOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShzb3VyY2VfdHJlZV8uVmlydHVhbEZpbGVUb0Rpc2tGaWxlKCJiYXovZm9vIiwgTlVMTCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjCkBAIC0wLDAgKzEsMjM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworc3RyaW5nIEVzY2FwZUphdmFkb2MoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShpbnB1dC5zaXplKCkgKiAyKTsKKworICBjaGFyIHByZXYgPSAnKic7CisKKyAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7CisgICAgY2hhciBjID0gaW5wdXRbaV07CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgLy8gQXZvaWQgIi8qIi4KKyAgICAgICAgaWYgKHByZXYgPT0gJy8nKSB7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJiM0MjsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIC8vIEF2b2lkICIqLyIuCisgICAgICAgIGlmIChwcmV2ID09ICcqJykgeworICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiYjNDc7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0AnOgorICAgICAgICAvLyAie0AiIHN0YXJ0cyBKYXZhZG9jIG1hcmt1cC4KKyAgICAgICAgaWYgKHByZXYgPT0gJ3snKSB7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJiM2NDsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIC8vIEF2b2lkIGludGVycHJldGF0aW9uIGFzIEhUTUwuCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZsdDsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgLy8gQXZvaWQgaW50ZXJwcmV0YXRpb24gYXMgSFRNTC4KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmd0OyIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnOgorICAgICAgICAvLyBBdm9pZCBpbnRlcnByZXRhdGlvbiBhcyBIVE1MLgorICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgLy8gSmF2YSBpbnRlcnByZXRzIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhbnl3aGVyZSEKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiJiM5MjsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXN1bHQucHVzaF9iYWNrKGMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwcmV2ID0gYzsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIFdyaXRlRG9jQ29tbWVudEJvZHlGb3JMb2NhdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgU291cmNlTG9jYXRpb24mIGxvY2F0aW9uKSB7CisgIHN0cmluZyBjb21tZW50cyA9IGxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMuZW1wdHkoKSA/CisgICAgICBsb2NhdGlvbi50cmFpbGluZ19jb21tZW50cyA6IGxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHM7CisgIGlmICghY29tbWVudHMuZW1wdHkoKSkgeworICAgIC8vIFRPRE8oa2VudG9uKTogIElkZWFsbHkgd2Ugc2hvdWxkIHBhcnNlIHRoZSBjb21tZW50IHRleHQgYXMgTWFya2Rvd24gYW5kCisgICAgLy8gICB3cml0ZSBpdCBiYWNrIGFzIEhUTUwsIGJ1dCB0aGlzIHJlcXVpcmVzIGEgTWFya2Rvd24gcGFyc2VyLiAgRm9yIG5vdworICAgIC8vICAgd2UganVzdCB1c2UgPHByZT4gdG8gZ2V0IGZpeGVkLXdpZHRoIHRleHQgZm9ybWF0dGluZy4KKworICAgIC8vIElmIHRoZSBjb21tZW50IGl0c2VsZiBjb250YWlucyBibG9jayBjb21tZW50IHN0YXJ0IG9yIGVuZCBtYXJrZXJzLAorICAgIC8vIEhUTUwtZXNjYXBlIHRoZW0gc28gdGhhdCB0aGV5IGRvbid0IGFjY2lkZW50YWxseSBjbG9zZSB0aGUgZG9jIGNvbW1lbnQuCisgICAgY29tbWVudHMgPSBFc2NhcGVKYXZhZG9jKGNvbW1lbnRzKTsKKworICAgIHZlY3RvcjxzdHJpbmc+IGxpbmVzOworICAgIFNwbGl0U3RyaW5nQWxsb3dFbXB0eShjb21tZW50cywgIlxuIiwgJmxpbmVzKTsKKyAgICB3aGlsZSAoIWxpbmVzLmVtcHR5KCkgJiYgbGluZXMuYmFjaygpLmVtcHR5KCkpIHsKKyAgICAgIGxpbmVzLnBvcF9iYWNrKCk7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgKlxuIgorICAgICAgICAiICogPHByZT5cbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIC8vIE1vc3QgbGluZXMgc2hvdWxkIHN0YXJ0IHdpdGggYSBzcGFjZS4gIFdhdGNoIG91dCBmb3IgbGluZXMgdGhhdCBzdGFydAorICAgICAgLy8gd2l0aCBhIC8sIHNpbmNlIHB1dHRpbmcgdGhhdCByaWdodCBhZnRlciB0aGUgbGVhZGluZyBhc3RlcmlzayB3aWxsCisgICAgICAvLyBjbG9zZSB0aGUgY29tbWVudC4KKyAgICAgIGlmICghbGluZXNbaV0uZW1wdHkoKSAmJiBsaW5lc1tpXVswXSA9PSAnLycpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIiAqICRsaW5lJFxuIiwgImxpbmUiLCBsaW5lc1tpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyLT5QcmludCgiICokbGluZSRcbiIsICJsaW5lIiwgbGluZXNbaV0pOworICAgICAgfQorICAgIH0KKyAgICBwcmludGVyLT5QcmludCgiICogPC9wcmU+XG4iKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclR5cGU+CitzdGF0aWMgdm9pZCBXcml0ZURvY0NvbW1lbnRCb2R5KAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yVHlwZSogZGVzY3JpcHRvcikgeworICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbjsKKyAgaWYgKGRlc2NyaXB0b3ItPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICBXcml0ZURvY0NvbW1lbnRCb2R5Rm9yTG9jYXRpb24ocHJpbnRlciwgbG9jYXRpb24pOworICB9Cit9CisKK3N0YXRpYyBzdHJpbmcgRmlyc3RMaW5lT2YoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBzdHJpbmcgcmVzdWx0ID0gdmFsdWU7CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gcmVzdWx0LmZpbmRfZmlyc3Rfb2YoJ1xuJyk7CisgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0LmVyYXNlKHBvcyk7CisgIH0KKworICAvLyBJZiBsaW5lIGVuZHMgaW4gYW4gb3BlbmluZyBicmFjZSwgbWFrZSBpdCAieyAuLi4gfSIgc28gaXQgbG9va3MgbmljZS4KKyAgaWYgKCFyZXN1bHQuZW1wdHkoKSAmJiByZXN1bHRbcmVzdWx0LnNpemUoKSAtIDFdID09ICd7JykgeworICAgIHJlc3VsdC5hcHBlbmQoIiAuLi4gfSIpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBXcml0ZU1lc3NhZ2VEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICIvKipcbiIKKyAgICAiICogUHJvdG9idWYgdHlwZSB7QGNvZGUgJGZ1bGxuYW1lJH1cbiIsCisgICAgImZ1bGxuYW1lIiwgRXNjYXBlSmF2YWRvYyhtZXNzYWdlLT5mdWxsX25hbWUoKSkpOworICBXcml0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIG1lc3NhZ2UpOworICBwcmludGVyLT5QcmludCgiICovXG4iKTsKK30KKwordm9pZCBXcml0ZUZpZWxkRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBJbiB0aGVvcnkgd2Ugc2hvdWxkIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IGNvbW1lbnRzIGZvciBzZXR0ZXJzLCBnZXR0ZXJzLAorICAvLyBldGMuLCBidXQgaW4gcHJhY3RpY2UgZXZlcnlvbmUgYWxyZWFkeSBrbm93cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlCisgIC8vIHNvIGl0J3MgcmVkdW5kYW50IGluZm9ybWF0aW9uLgorCisgIC8vIFdlIHVzZSB0aGUgZmllbGQgZGVjbGFyYXRpb24gYXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1lbnQsIGUuZy46CisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDU7CisgIC8vIFRoaXMgY29tbXVuaWNhdGVzIGEgbG90IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWVsZCBpbiBhIHNtYWxsIHNwYWNlLgorICAvLyBJZiB0aGUgZmllbGQgaXMgYSBncm91cCwgdGhlIGRlYnVnIHN0cmluZyBtaWdodCBlbmQgd2l0aCB7LgorICBwcmludGVyLT5QcmludCgKKyAgICAiLyoqXG4iCisgICAgIiAqIDxjb2RlPiRkZWYkPC9jb2RlPlxuIiwKKyAgICAiZGVmIiwgRXNjYXBlSmF2YWRvYyhGaXJzdExpbmVPZihmaWVsZC0+RGVidWdTdHJpbmcoKSkpKTsKKyAgV3JpdGVEb2NDb21tZW50Qm9keShwcmludGVyLCBmaWVsZCk7CisgIHByaW50ZXItPlByaW50KCIgKi9cbiIpOworfQorCit2b2lkIFdyaXRlRW51bURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXykgeworICBwcmludGVyLT5QcmludCgKKyAgICAiLyoqXG4iCisgICAgIiAqIFByb3RvYnVmIGVudW0ge0Bjb2RlICRmdWxsbmFtZSR9XG4iLAorICAgICJmdWxsbmFtZSIsIEVzY2FwZUphdmFkb2MoZW51bV8tPmZ1bGxfbmFtZSgpKSk7CisgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgZW51bV8pOworICBwcmludGVyLT5QcmludCgiICovXG4iKTsKK30KKwordm9pZCBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgeworICBwcmludGVyLT5QcmludCgKKyAgICAiLyoqXG4iCisgICAgIiAqIDxjb2RlPiRkZWYkPC9jb2RlPlxuIiwKKyAgICAiZGVmIiwgRXNjYXBlSmF2YWRvYyhGaXJzdExpbmVPZih2YWx1ZS0+RGVidWdTdHJpbmcoKSkpKTsKKyAgV3JpdGVEb2NDb21tZW50Qm9keShwcmludGVyLCB2YWx1ZSk7CisgIHByaW50ZXItPlByaW50KCIgKi9cbiIpOworfQorCit2b2lkIFdyaXRlU2VydmljZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8qKlxuIgorICAgICIgKiBQcm90b2J1ZiBzZXJ2aWNlIHtAY29kZSAkZnVsbG5hbWUkfVxuIiwKKyAgICAiZnVsbG5hbWUiLCBFc2NhcGVKYXZhZG9jKHNlcnZpY2UtPmZ1bGxfbmFtZSgpKSk7CisgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgc2VydmljZSk7CisgIHByaW50ZXItPlByaW50KCIgKi9cbiIpOworfQorCit2b2lkIFdyaXRlTWV0aG9kRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICBwcmludGVyLT5QcmludCgKKyAgICAiLyoqXG4iCisgICAgIiAqIDxjb2RlPiRkZWYkPC9jb2RlPlxuIiwKKyAgICAiZGVmIiwgRXNjYXBlSmF2YWRvYyhGaXJzdExpbmVPZihtZXRob2QtPkRlYnVnU3RyaW5nKCkpKSk7CisgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgbWV0aG9kKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqL1xuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDRkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmgKQEAgLTAsMCArMSw2OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRE9DX0NPTU1FTlRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0RPQ19DT01NRU5UX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCit2b2lkIFdyaXRlTWVzc2FnZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UpOwordm9pZCBXcml0ZUZpZWxkRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Cit2b2lkIFdyaXRlRW51bURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXyk7Cit2b2lkIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKTsKK3ZvaWQgV3JpdGVTZXJ2aWNlRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSk7Cit2b2lkIFdyaXRlTWV0aG9kRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCk7CisKKy8vIEV4cG9zZWQgZm9yIHRlc3Rpbmcgb25seS4KK0xJQlBST1RPQ19FWFBPUlQgc3RyaW5nIEVzY2FwZUphdmFkb2MoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0RPQ19DT01NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiNmQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw2NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoSmF2YURvY0NvbW1lbnRUZXN0LCBFc2NhcGluZykgeworICBFWFBFQ1RfRVEoImZvbyAvJiM0MjsgYmFyIComIzQ3OyBiYXoiLCBFc2NhcGVKYXZhZG9jKCJmb28gLyogYmFyICovIGJheiIpKTsKKyAgRVhQRUNUX0VRKCJmb28gLyYjNDI7JiM0NzsgYmF6IiwgRXNjYXBlSmF2YWRvYygiZm9vIC8qLyBiYXoiKSk7CisgIEVYUEVDVF9FUSgieyYjNjQ7Zm9vfSIsIEVzY2FwZUphdmFkb2MoIntAZm9vfSIpKTsKKyAgRVhQRUNUX0VRKCImbHQ7aSZndDsmYW1wOyZsdDsvaSZndDsiLCBFc2NhcGVKYXZhZG9jKCI8aT4mPC9pPiIpKTsKKyAgRVhQRUNUX0VRKCJmb28mIzkyO3UxMjM0YmFyIiwgRXNjYXBlSmF2YWRvYygiZm9vXFx1MTIzNGJhciIpKTsKK30KKworLy8gVE9ETyhrZW50b24pOiAgSXQncyBoYXJkIHRvIHdyaXRlIGEgcm9idXN0IHRlc3Qgb2YgdGhlIGRvYyBjb21tZW50cyAtLSB3ZQorLy8gICBjYW4gb25seSByZWFsbHkgY29tcGFyZSB0aGUgb3V0cHV0IGFnYWluc3QgYSBnb2xkZW4gdmFsdWUsIHdoaWNoIGlzIGEKKy8vICAgZmFpcmx5IHRlZGlvdXMgYW5kIGZyYWdpbGUgdGVzdGluZyBzdHJhdGVneS4gIElmIHdlIHdhbnQgdG8gZ28gdGhhdCByb3V0ZSwKKy8vICAgaXQgcHJvYmFibHkgbWFrZXMgc2Vuc2UgdG8gYml0ZSB0aGUgYnVsbGV0IGFuZCB3cml0ZSBhIHRlc3QgdGhhdCBjb21wYXJlcworLy8gICB0aGUgd2hvbGUgZ2VuZXJhdGVkIG91dHB1dCBmb3IgdW5pdHRlc3QucHJvdG8gYWdhaW5zdCBhIGdvbGRlbiB2YWx1ZSwgd2l0aAorLy8gICBhIHZlcnkgc2ltcGxlIHNjcmlwdCB0aGF0IGNhbiBiZSBydW4gdG8gcmVnZW5lcmF0ZSBpdCB3aXRoIHRoZSBsYXRlc3QgY29kZS4KKy8vICAgVGhpcyB3b3VsZCBtZWFuIHRoYXQgdXBkYXRlcyB0byB0aGUgZ29sZGVuIGZpbGUgd291bGQgaGF2ZSB0byBiZSBpbmNsdWRlZAorLy8gICBpbiBhbnkgY2hhbmdlIHRvIHRoZSBjb2RlIGdlbmVyYXRvciwgd2hpY2ggd291bGQgYWN0dWFsbHkgYmUgZmFpcmx5IHVzZWZ1bAorLy8gICBhcyBpdCBhbGxvd3MgdGhlIHJldmlld2VyIHRvIHNlZSBjbGVhcmx5IGhvdyB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMKKy8vICAgY2hhbmdpbmcuCisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlZDgxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYwpAQCAtMCwwICsxLDI3MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitFbnVtR2VuZXJhdG9yOjpFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSk7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogY2Fub25pY2FsX3ZhbHVlID0KKyAgICAgIGRlc2NyaXB0b3JfLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZS0+bnVtYmVyKCkpOworCisgICAgaWYgKHZhbHVlID09IGNhbm9uaWNhbF92YWx1ZSkgeworICAgICAgY2Fub25pY2FsX3ZhbHVlc18ucHVzaF9iYWNrKHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgQWxpYXMgYWxpYXM7CisgICAgICBhbGlhcy52YWx1ZSA9IHZhbHVlOworICAgICAgYWxpYXMuY2Fub25pY2FsX3ZhbHVlID0gY2Fub25pY2FsX3ZhbHVlOworICAgICAgYWxpYXNlc18ucHVzaF9iYWNrKGFsaWFzKTsKKyAgICB9CisgIH0KK30KKworRW51bUdlbmVyYXRvcjo6fkVudW1HZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIFdyaXRlRW51bURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIGVudW0gJGNsYXNzbmFtZSRcbiIKKyAgICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlByb3RvY29sTWVzc2FnZUVudW0ge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgZW51bSAkY2xhc3NuYW1lJFxuIgorICAgICAgIiAgICBpbXBsZW1lbnRzIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGUge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgfQorICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGNhbm9uaWNhbF92YWx1ZXNfLnNpemUoKTsgaSsrKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbIm5hbWUiXSA9IGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5uYW1lKCk7CisgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoY2Fub25pY2FsX3ZhbHVlc19baV0tPmluZGV4KCkpOworICAgIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShjYW5vbmljYWxfdmFsdWVzX1tpXS0+bnVtYmVyKCkpOworICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBjYW5vbmljYWxfdmFsdWVzX1tpXSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIkbmFtZSQoJGluZGV4JCwgJG51bWJlciQpLFxuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiO1xuIgorICAgICJcbiIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzXy5zaXplKCk7IGkrKykgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgICAgdmFyc1sibmFtZSJdID0gYWxpYXNlc19baV0udmFsdWUtPm5hbWUoKTsKKyAgICB2YXJzWyJjYW5vbmljYWxfbmFtZSJdID0gYWxpYXNlc19baV0uY2Fub25pY2FsX3ZhbHVlLT5uYW1lKCk7CisgICAgV3JpdGVFbnVtVmFsdWVEb2NDb21tZW50KHByaW50ZXIsIGFsaWFzZXNfW2ldLnZhbHVlKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgJGNsYXNzbmFtZSQgJG5hbWUkID0gJGNhbm9uaWNhbF9uYW1lJDtcbiIpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbIm5hbWUiXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpOworICAgIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpKTsKKyAgICBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8tPnZhbHVlKGkpKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRuYW1lJF9WQUxVRSA9ICRudW1iZXIkO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgInB1YmxpYyBmaW5hbCBpbnQgZ2V0TnVtYmVyKCkgeyByZXR1cm4gdmFsdWU7IH1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgdmFsdWVPZihpbnQgdmFsdWUpIHtcbiIKKyAgICAiICBzd2l0Y2ggKHZhbHVlKSB7XG4iLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY2Fub25pY2FsX3ZhbHVlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjYXNlICRudW1iZXIkOiByZXR1cm4gJG5hbWUkO1xuIiwKKyAgICAgICJuYW1lIiwgY2Fub25pY2FsX3ZhbHVlc19baV0tPm5hbWUoKSwKKyAgICAgICJudW1iZXIiLCBTaW1wbGVJdG9hKGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5udW1iZXIoKSkpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8JGNsYXNzbmFtZSQ+XG4iCisgICAgIiAgICBpbnRlcm5hbEdldFZhbHVlTWFwKCkge1xuIgorICAgICIgIHJldHVybiBpbnRlcm5hbFZhbHVlTWFwO1xuIgorICAgICJ9XG4iCisgICAgInByaXZhdGUgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8JGNsYXNzbmFtZSQ+XG4iCisgICAgIiAgICBpbnRlcm5hbFZhbHVlTWFwID1cbiIKKyAgICAiICAgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8JGNsYXNzbmFtZSQ+KCkge1xuIgorICAgICIgICAgICAgIHB1YmxpYyAkY2xhc3NuYW1lJCBmaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKSB7XG4iCisgICAgIiAgICAgICAgICByZXR1cm4gJGNsYXNzbmFtZSQudmFsdWVPZihudW1iZXIpO1xuIgorICAgICIgICAgICAgIH1cbiIKKyAgICAiICAgICAgfTtcbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBSZWZsZWN0aW9uCisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3JcbiIKKyAgICAgICIgICAgZ2V0VmFsdWVEZXNjcmlwdG9yKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKS5nZXQoaW5kZXgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvclxuIgorICAgICAgIiAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBnZXREZXNjcmlwdG9yKCk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvclxuIgorICAgICAgIiAgICBnZXREZXNjcmlwdG9yKCkge1xuIik7CisKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBDYWNoZSBzdGF0aWNhbGx5PyAgTm90ZSB0aGF0IHdlIGNhbid0IGFjY2VzcyBkZXNjcmlwdG9ycworICAgIC8vICAgYXQgbW9kdWxlIGluaXQgdGltZSBiZWNhdXNlIGl0IHdvdWxkbid0IHdvcmsgd2l0aCBkZXNjcmlwdG9yLnByb3RvLCBidXQKKyAgICAvLyAgIHdlIGNhbiBjYWNoZSB0aGUgdmFsdWUgdGhlIGZpcnN0IHRpbWUgZ2V0RGVzY3JpcHRvcigpIGlzIGNhbGxlZC4KKyAgICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICByZXR1cm4gJGZpbGUkLmdldERlc2NyaXB0b3IoKS5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAorICAgICAgICAiZmlsZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSwKKyAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgcmV0dXJuICRwYXJlbnQkLmdldERlc2NyaXB0b3IoKS5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAorICAgICAgICAicGFyZW50IiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSksCisgICAgICAgICJpbmRleCIsIFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgJGNsYXNzbmFtZSRbXSBWQUxVRVMgPSAiLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworCisgICAgaWYgKENhblVzZUVudW1WYWx1ZXMoKSkgeworICAgICAgLy8gSWYgdGhlIGNvbnN0YW50cyB3ZSBhcmUgZ29pbmcgdG8gb3V0cHV0IGFyZSBleGFjdGx5IHRoZSBvbmVzIHdlCisgICAgICAvLyBoYXZlIGRlY2xhcmVkIGluIHRoZSBKYXZhIGVudW0gaW4gdGhlIHNhbWUgb3JkZXIsIHRoZW4gd2UgY2FuIHVzZQorICAgICAgLy8gdGhlIHZhbHVlcygpIG1ldGhvZCB0aGF0IHRoZSBKYXZhIGNvbXBpbGVyIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzCisgICAgICAvLyBmb3IgZXZlcnkgZW51bS4KKyAgICAgIHByaW50ZXItPlByaW50KCJ2YWx1ZXMoKTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgIik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIiRuYW1lJCwgIiwKKyAgICAgICAgICAibmFtZSIsIGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJcbiIKKyAgICAgICAgICAifTtcbiIpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIlxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgdmFsdWVPZihcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGRlc2MpIHtcbiIKKyAgICAgICIgIGlmIChkZXNjLmdldFR5cGUoKSAhPSBnZXREZXNjcmlwdG9yKCkpIHtcbiIKKyAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgICAiICAgICAgXCJFbnVtVmFsdWVEZXNjcmlwdG9yIGlzIG5vdCBmb3IgdGhpcyB0eXBlLlwiKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiBWQUxVRVNbZGVzYy5nZXRJbmRleCgpXTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworCisgICAgLy8gaW5kZXggaXMgb25seSB1c2VkIGZvciByZWZsZWN0aW9uOyBsaXRlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IG5lZWQgaXQKKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7XG4iKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByaXZhdGUgZmluYWwgaW50IHZhbHVlO1xuXG4iCisgICAgInByaXZhdGUgJGNsYXNzbmFtZSQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiAgdGhpcy5pbmRleCA9IGluZGV4O1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuIgorICAgICJ9XG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChlbnVtX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKKyAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCitib29sIEVudW1HZW5lcmF0b3I6OkNhblVzZUVudW1WYWx1ZXMoKSB7CisgIGlmIChjYW5vbmljYWxfdmFsdWVzXy5zaXplKCkgIT0gZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpICE9IGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5uYW1lKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTllNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmgKQEAgLTAsMCArMSw4NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEVudW1HZW5lcmF0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+RW51bUdlbmVyYXRvcigpOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworCisgIC8vIFRoZSBwcm90byBsYW5ndWFnZSBhbGxvd3MgbXVsdGlwbGUgZW51bSBjb25zdGFudHMgdG8gaGF2ZSB0aGUgc2FtZSBudW1lcmljCisgIC8vIHZhbHVlLiAgSmF2YSwgaG93ZXZlciwgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgZW51bSBjb25zdGFudHMgdG8gYmUKKyAgLy8gY29uc2lkZXJlZCBlcXVpdmFsZW50LiAgV2UgdHJlYXQgdGhlIGZpcnN0IGRlZmluZWQgY29uc3RhbnQgZm9yIGFueQorICAvLyBnaXZlbiBudW1lcmljIHZhbHVlIGFzICJjYW5vbmljYWwiIGFuZCB0aGUgcmVzdCBhcyBhbGlhc2VzIG9mIHRoYXQKKyAgLy8gY2Fub25pY2FsIHZhbHVlLgorICB2ZWN0b3I8Y29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+IGNhbm9uaWNhbF92YWx1ZXNfOworCisgIHN0cnVjdCBBbGlhcyB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWU7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogY2Fub25pY2FsX3ZhbHVlOworICB9OworICB2ZWN0b3I8QWxpYXM+IGFsaWFzZXNfOworCisgIGJvb2wgQ2FuVXNlRW51bVZhbHVlcygpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbnVtR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwYjA2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYwpAQCAtMCwwICsxLDYwMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8oa2VudG9uKTogIEZhY3RvciBvdXQgYSAiU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoKSIgdG8gZ2V0IHJpZCBvZgorLy8gICByZXBlYXQgY29kZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBvdGhlciBmaWVsZCB0eXBlcy4KK3ZvaWQgU2V0RW51bVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgeworICAoKnZhcmlhYmxlcylbIm5hbWUiXSA9CisgICAgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF9uYW1lIl0gPQorICAgIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yLT5lbnVtX3R5cGUoKSk7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbInRhZyJdID0gU2ltcGxlSXRvYShpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7CisgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCisgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yLT5udW1iZXIoKSwgR2V0VHlwZShkZXNjcmlwdG9yKSkpOworICAvLyBUT0RPKGJpcmRvKTogQWRkIEBkZXByZWNhdGVkIGphdmFkb2Mgd2hlbiBnZW5lcmF0aW5nIGphdmFkb2MgaXMgc3VwcG9ydGVkCisgIC8vIGJ5IHRoZSBwcm90byBjb21waWxlcgorICAoKnZhcmlhYmxlcylbImRlcHJlY2F0aW9uIl0gPSBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiOworICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9CisgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgPyAib25DaGFuZ2VkKCk7IiA6ICIiOworCisgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlU2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisKKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPQorICAgICAgR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworCisgIC8vIEZvciByZXBhdGVkIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZS4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgLy8gRm9yIHJlcGVhdGVkIGZpZWxkcywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUKKyAgLy8gaW4gdGhlIHBhcnNpbmcgY29uc3RydWN0b3IuCisgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X3BhcnNlciJdID0KKyAgICAgIEdlbmVyYXRlR2V0Qml0TXV0YWJsZUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X3BhcnNlciJdID0KKyAgICAgIEdlbmVyYXRlU2V0Qml0TXV0YWJsZUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChtZXNzYWdlQml0SW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitFbnVtRmllbGRHZW5lcmF0b3I6OgorRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCAmdmFyaWFibGVzXyk7Cit9CisKK0VudW1GaWVsZEdlbmVyYXRvcjo6fkVudW1GaWVsZEdlbmVyYXRvcigpIHt9CisKK2ludCBFbnVtRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKworaW50IEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJHR5cGUkICRuYW1lJF87XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSAkdHlwZSQgJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgIiAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAiICB9XG4iCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgICRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgZW51bXMKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIKKyAgICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgorICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAifVxuIgorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICIkdHlwZSQgdmFsdWUgPSAkdHlwZSQudmFsdWVPZihyYXdWYWx1ZSk7XG4iKTsKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICIgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCgkbnVtYmVyJCwgcmF3VmFsdWUpO1xuIgorICAgICAgIn0gZWxzZSB7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICh2YWx1ZSAhPSBudWxsKSB7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBub29wIGZvciBlbnVtcworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBvdXRwdXQud3JpdGVFbnVtKCRudW1iZXIkLCAkbmFtZSRfLmdldE51bWJlcigpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlRW51bVNpemUoJG51bWJlciQsICRuYW1lJF8uZ2V0TnVtYmVyKCkpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInJlc3VsdCA9IHJlc3VsdCAmJlxuIgorICAgICIgICAgKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpID09IG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgaGFzaEVudW0oZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Cit9CisKK3N0cmluZyBFbnVtRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKKyAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICRuYW1lJF87XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkgJiYKKyAgICAgIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAicHJpdmF0ZSBpbnQgJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTtcbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgIC8vIE9uZSBmaWVsZCBpcyB0aGUgbGlzdCBhbmQgdGhlIG90aGVyIGZpZWxkIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlCisgICAgLy8gbGlzdCBpcyBpbW11dGFibGUuIElmIGl0J3MgaW1tdXRhYmxlLCB0aGUgaW52YXJpYW50IGlzIHRoYXQgaXQgbXVzdAorICAgIC8vIGVpdGhlciBhbiBpbnN0YW5jZSBvZiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSBvciBpdCdzIGFuIEFycmF5TGlzdAorICAgIC8vIHdyYXBwZWQgaW4gYSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCkgd3JhcHBlciBhbmQgbm9ib2R5IGVsc2UgaGFzCisgICAgLy8gYSByZWZlcmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bworICAgIC8vIHNoYXJlIGluc3RhbmNlcyBvZiBsaXN0cyBiZXR3ZWVuIHByb3RvY29sIGJ1ZmZlcnMgYXZvaWRpbmcgZXhwZW5zaXZlCisgICAgLy8gbWVtb3J5IGFsbG9jYXRpb25zLiBOb3RlLCBpbW11dGFibGUgaXMgYSBzdHJvbmcgZ3VhcmFudGVlIGhlcmUgLS0gbm90CisgICAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKKyAgICAvLyBsaXN0IGNhbiBuZXZlciBiZSBtb2RpZmllZC4KKyAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICRuYW1lJF8gPVxuIgorICAgICIgIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKKworICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgorICAgICIgIGlmICghJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgorICAgICIgICAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PCR0eXBlJD4oJG5hbWUkXyk7XG4iCisgICAgIiAgICAkc2V0X211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgIC8vIE5vdGU6ICBXZSByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGNhbGxlcgorICAgIC8vICAgY291bGQgaG9sZCBvbiB0byB0aGUgcmV0dXJuZWQgbGlzdCBhbmQgbW9kaWZ5IGl0IGFmdGVyIHRoZSBtZXNzYWdlCisgICAgLy8gICBoYXMgYmVlbiBidWlsdCwgdGh1cyBtdXRhdGluZyB0aGUgbWVzc2FnZSB3aGljaCBpcyBzdXBwb3NlZCB0byBiZQorICAgIC8vICAgaW1tdXRhYmxlLgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKKyAgICAiICByZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgIiAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAiICB9XG4iCisgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiAgJG5hbWUkXy5zZXQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTw/IGV4dGVuZHMgJHR5cGUkPiB2YWx1ZXMpIHtcbiIKKyAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICBzdXBlci5hZGRBbGwodmFsdWVzLCAkbmFtZSRfKTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iCisgICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgZW51bXMKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnM6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgIGlmICgkbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICAgJG5hbWUkXy5hZGRBbGwob3RoZXIuJG5hbWUkXyk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29kZSBiZWxvdyBlbnN1cmVzIHRoYXQgdGhlIHJlc3VsdCBoYXMgYW4gaW1tdXRhYmxlIGxpc3QuIElmIG91cgorICAvLyBsaXN0IGlzIGltbXV0YWJsZSwgd2UgY2FuIGp1c3QgcmV1c2UgaXQuIElmIG5vdCwgd2UgbWFrZSBpdCBpbW11dGFibGUuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgorICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIgorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFJlYWQgYW5kIHN0b3JlIHRoZSBlbnVtCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7XG4iCisgICAgIiR0eXBlJCB2YWx1ZSA9ICR0eXBlJC52YWx1ZU9mKHJhd1ZhbHVlKTtcbiIpOworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgIiAgdW5rbm93bkZpZWxkcy5tZXJnZVZhcmludEZpZWxkKCRudW1iZXIkLCByYXdWYWx1ZSk7XG4iCisgICAgICAifSBlbHNlIHtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKHZhbHVlICE9IG51bGwpIHtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkdHlwZSQ+KCk7XG4iCisgICAgIiAgICAkc2V0X211dGFibGVfYml0X3BhcnNlciQ7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV3JhcCBHZW5lcmF0ZVBhcnNpbmdDb2RlJ3MgY29udGVudHMgd2l0aCBhIHdoaWxlIGxvb3AuCisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpO1xuIgorICAgICJpbnQgb2xkTGltaXQgPSBpbnB1dC5wdXNoTGltaXQobGVuZ3RoKTtcbiIKKyAgICAid2hpbGUoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgR2VuZXJhdGVQYXJzaW5nQ29kZShwcmludGVyKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIn1cbiIKKyAgICAiaW5wdXQucG9wTGltaXQob2xkTGltaXQpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCkgPiAwKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkdGFnJCk7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVFbnVtTm9UYWcoJG5hbWUkXy5nZXQoaSkuZ2V0TnVtYmVyKCkpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVFbnVtKCRudW1iZXIkLCAkbmFtZSRfLmdldChpKS5nZXROdW1iZXIoKSk7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ7XG4iCisgICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAiICBkYXRhU2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgIiAgICAuY29tcHV0ZUVudW1TaXplTm9UYWcoJG5hbWUkXy5nZXQoaSkuZ2V0TnVtYmVyKCkpO1xuIgorICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInNpemUgKz0gZGF0YVNpemU7XG4iKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICghZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmlzRW1wdHkoKSkgeyIKKyAgICAgICIgIHNpemUgKz0gJHRhZ19zaXplJDtcbiIKKyAgICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgorICAgICAgIiAgICAuY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShkYXRhU2l6ZSk7XG4iCisgICAgICAifSIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAic2l6ZSArPSAkdGFnX3NpemUkICogJG5hbWUkXy5zaXplKCk7XG4iKTsKKyAgfQorCisgIC8vIGNhY2hlIHRoZSBkYXRhIHNpemUgZm9yIHBhY2tlZCBmaWVsZHMuCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCisgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgorICAgICIgIGhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAiICBoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoRW51bUxpc3QoZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3N0cmluZyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGZhZTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgfkVudW1GaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1GaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgflJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Q7CisgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWZlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYwpAQCAtMCwwICsxLDIxOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIqIFR5cGVOYW1lKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSBmaWVsZF90eXBlKSB7CisgIHN3aXRjaCAoZmllbGRfdHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gIklOVDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzIgIDogcmV0dXJuICJVSU5UMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiAgOiByZXR1cm4gIlNJTlQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMiA6IHJldHVybiAiRklYRUQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiAiU0ZJWEVEMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0ICAgOiByZXR1cm4gIklOVDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQgIDogcmV0dXJuICJVSU5UNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NCAgOiByZXR1cm4gIlNJTlQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NCA6IHJldHVybiAiRklYRUQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiAiU0ZJWEVENjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gIkZMT0FUIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuICJET1VCTEUiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0wgICAgOiByZXR1cm4gIkJPT0wiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gIlNUUklORyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgICA6IHJldHVybiAiQllURVMiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0gICAgOiByZXR1cm4gIkVOVU0iOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gIkdST1VQIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIDogcmV0dXJuICJNRVNTQUdFIjsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCit9CisKK0V4dGVuc2lvbkdlbmVyYXRvcjo6RXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgIT0gTlVMTCkgeworICAgIHNjb3BlXyA9IENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkpOworICB9IGVsc2UgeworICAgIHNjb3BlXyA9IENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKTsKKyAgfQorfQorCitFeHRlbnNpb25HZW5lcmF0b3I6On5FeHRlbnNpb25HZW5lcmF0b3IoKSB7fQorCisvLyBJbml0aWFsaXplcyB0aGUgdmFycyByZWZlcmVuY2VkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB0ZW1wbGF0ZXMuCit2b2lkIEluaXRUZW1wbGF0ZVZhcnMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyc19wb2ludGVyKSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gJnZhcnMgPSAqdmFyc19wb2ludGVyOworICB2YXJzWyJzY29wZSJdID0gc2NvcGU7CisgIHZhcnNbIm5hbWUiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcik7CisgIHZhcnNbImNvbnRhaW5pbmdfdHlwZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgdmFyc1sibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgdmFyc1siY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcik7CisgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPmluZGV4KCkpOworICB2YXJzWyJkZWZhdWx0Il0gPQorICAgICAgZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSA/ICIiIDogRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOworICB2YXJzWyJ0eXBlX2NvbnN0YW50Il0gPSBUeXBlTmFtZShHZXRUeXBlKGRlc2NyaXB0b3IpKTsKKyAgdmFyc1sicGFja2VkIl0gPSBkZXNjcmlwdG9yLT5vcHRpb25zKCkucGFja2VkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICB2YXJzWyJlbnVtX21hcCJdID0gIm51bGwiOworICB2YXJzWyJwcm90b3R5cGUiXSA9ICJudWxsIjsKKworICBKYXZhVHlwZSBqYXZhX3R5cGUgPSBHZXRKYXZhVHlwZShkZXNjcmlwdG9yKTsKKyAgc3RyaW5nIHNpbmd1bGFyX3R5cGU7CisgIHN3aXRjaCAoamF2YV90eXBlKSB7CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgc2luZ3VsYXJfdHlwZSA9IENsYXNzTmFtZShkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgICB2YXJzWyJwcm90b3R5cGUiXSA9IHNpbmd1bGFyX3R5cGUgKyAiLmdldERlZmF1bHRJbnN0YW5jZSgpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKKyAgICAgIHNpbmd1bGFyX3R5cGUgPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpOworICAgICAgdmFyc1siZW51bV9tYXAiXSA9IHNpbmd1bGFyX3R5cGUgKyAiLmludGVybmFsR2V0VmFsdWVNYXAoKSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc2luZ3VsYXJfdHlwZSA9IEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoamF2YV90eXBlKTsKKyAgICAgIGJyZWFrOworICB9CisgIHZhcnNbInR5cGUiXSA9IGRlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkgPworICAgICAgImphdmEudXRpbC5MaXN0PCIgKyBzaW5ndWxhcl90eXBlICsgIj4iIDogc2luZ3VsYXJfdHlwZTsKKyAgdmFyc1sic2luZ3VsYXJfdHlwZSJdID0gc2luZ3VsYXJfdHlwZTsKK30KKwordm9pZCBFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgSW5pdFRlbXBsYXRlVmFycyhkZXNjcmlwdG9yXywgc2NvcGVfLCAmdmFycyk7CisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJGNvbnN0YW50X25hbWUkID0gJG51bWJlciQ7XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIE5vbi1saXRlIGV4dGVuc2lvbnMKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKKyAgICAgIC8vIE5vbi1uZXN0ZWQKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcnMsCisgICAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWxcbiIKKyAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuR2VuZXJhdGVkRXh0ZW5zaW9uPFxuIgorICAgICAgICAgICIgICAgJGNvbnRhaW5pbmdfdHlwZSQsXG4iCisgICAgICAgICAgIiAgICAkdHlwZSQ+ICRuYW1lJCA9IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgorICAgICAgICAgICIgICAgICAgIC5uZXdGaWxlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgorICAgICAgICAgICIgICAgICAkc2luZ3VsYXJfdHlwZSQuY2xhc3MsXG4iCisgICAgICAgICAgIiAgICAgICRwcm90b3R5cGUkKTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOZXN0ZWQKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcnMsCisgICAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWxcbiIKKyAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuR2VuZXJhdGVkRXh0ZW5zaW9uPFxuIgorICAgICAgICAgICIgICAgJGNvbnRhaW5pbmdfdHlwZSQsXG4iCisgICAgICAgICAgIiAgICAkdHlwZSQ+ICRuYW1lJCA9IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgorICAgICAgICAgICIgICAgICAgIC5uZXdNZXNzYWdlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgorICAgICAgICAgICIgICAgICAkc2NvcGUkLmdldERlZmF1bHRJbnN0YW5jZSgpLFxuIgorICAgICAgICAgICIgICAgICAkaW5kZXgkLFxuIgorICAgICAgICAgICIgICAgICAkc2luZ3VsYXJfdHlwZSQuY2xhc3MsXG4iCisgICAgICAgICAgIiAgICAgICRwcm90b3R5cGUkKTtcbiIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBMaXRlIGV4dGVuc2lvbnMKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcnMsCisgICAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWxcbiIKKyAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKKyAgICAgICAgICAiICAgICRjb250YWluaW5nX3R5cGUkLFxuIgorICAgICAgICAgICIgICAgJHR5cGUkPiAkbmFtZSQgPSBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlXG4iCisgICAgICAgICAgIiAgICAgICAgLm5ld1JlcGVhdGVkR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgorICAgICAgICAgICIgICAgICAkY29udGFpbmluZ190eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSxcbiIKKyAgICAgICAgICAiICAgICAgJHByb3RvdHlwZSQsXG4iCisgICAgICAgICAgIiAgICAgICRlbnVtX21hcCQsXG4iCisgICAgICAgICAgIiAgICAgICRudW1iZXIkLFxuIgorICAgICAgICAgICIgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLldpcmVGb3JtYXQuRmllbGRUeXBlLiR0eXBlX2NvbnN0YW50JCxcbiIKKyAgICAgICAgICAiICAgICAgJHBhY2tlZCQpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcnMsCisgICAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWxcbiIKKyAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKKyAgICAgICAgICAiICAgICRjb250YWluaW5nX3R5cGUkLFxuIgorICAgICAgICAgICIgICAgJHR5cGUkPiAkbmFtZSQgPSBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlXG4iCisgICAgICAgICAgIiAgICAgICAgLm5ld1Npbmd1bGFyR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgorICAgICAgICAgICIgICAgICAkY29udGFpbmluZ190eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSxcbiIKKyAgICAgICAgICAiICAgICAgJGRlZmF1bHQkLFxuIgorICAgICAgICAgICIgICAgICAkcHJvdG90eXBlJCxcbiIKKyAgICAgICAgICAiICAgICAgJGVudW1fbWFwJCxcbiIKKyAgICAgICAgICAiICAgICAgJG51bWJlciQsXG4iCisgICAgICAgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuV2lyZUZvcm1hdC5GaWVsZFR5cGUuJHR5cGVfY29uc3RhbnQkKTtcbiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVOb25OZXN0ZWRJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMICYmCisgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIE9ubHkgYXBwbGllcyB0byBub24tbmVzdGVkLCBub24tbGl0ZSBleHRlbnNpb25zLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJG5hbWUkLmludGVybmFsSW5pdChkZXNjcmlwdG9yLmdldEV4dGVuc2lvbnMoKS5nZXQoJGluZGV4JCkpO1xuIiwKKyAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOworICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInJlZ2lzdHJ5LmFkZCgkc2NvcGUkLiRuYW1lJCk7XG4iLAorICAgICJzY29wZSIsIHNjb3BlXywKKyAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8pKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDllZDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaApAQCAtMCwwICsxLDc3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FWFRFTlNJT05fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBjbGFzcyBGaWVsZERlc2NyaXB0b3I7ICAgICAgIC8vIGRlc2NyaXB0b3IuaAorICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCisvLyBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZXh0ZW5zaW9uLCB3aGljaCBtYXkgYmUgd2l0aGluIHRoZSBzY29wZSBvZiBzb21lCisvLyBtZXNzYWdlIG9yIG1heSBiZSBhdCBmaWxlIHNjb3BlLiAgVGhpcyBpcyBtdWNoIHNpbXBsZXIgdGhhbiBGaWVsZEdlbmVyYXRvcgorLy8gc2luY2UgZXh0ZW5zaW9ucyBhcmUganVzdCBzaW1wbGUgaWRlbnRpZmllcnMgd2l0aCBpbnRlcmVzdGluZyB0eXBlcy4KK2NsYXNzIEV4dGVuc2lvbkdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfkV4dGVuc2lvbkdlbmVyYXRvcigpOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RyaW5nIHNjb3BlXzsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEV4dGVuc2lvbkdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkNDMzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MKQEAgLTAsMCArMSwxMzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK0ZpZWxkR2VuZXJhdG9yOjp+RmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBSZWFjaGluZyBoZXJlIGluZGljYXRlcyBhIGJ1Zy4gQ2FzZXMgYXJlOgorICAvLyAgIC0gVGhpcyBGaWVsZEdlbmVyYXRvciBzaG91bGQgc3VwcG9ydCBwYWNraW5nLCBidXQgdGhpcyBtZXRob2Qgc2hvdWxkIGJlCisgIC8vICAgICBvdmVycmlkZGVuLgorICAvLyAgIC0gVGhpcyBGaWVsZEdlbmVyYXRvciBkb2Vzbid0IHN1cHBvcnQgcGFja2luZywgYW5kIHRoaXMgbWV0aG9kIHNob3VsZAorICAvLyAgICAgbmV2ZXIgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKCkgIgorICAgICAgICAgICAgIDw8ICJjYWxsZWQgb24gZmllbGQgZ2VuZXJhdG9yIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBwYWNraW5nLiI7Cit9CisKK0ZpZWxkR2VuZXJhdG9yTWFwOjpGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgIGZpZWxkX2dlbmVyYXRvcnNfKAorICAgICAgbmV3IHNjb3BlZF9wdHI8RmllbGRHZW5lcmF0b3I+W2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCldKSwKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18oCisgICAgICBuZXcgc2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj5bZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCldKSB7CisKKyAgLy8gQ29uc3RydWN0IGFsbCB0aGUgRmllbGRHZW5lcmF0b3JzIGFuZCBhc3NpZ24gdGhlbSBiaXQgaW5kaWNlcyBmb3IgdGhlaXIKKyAgLy8gYml0IGZpZWxkcy4KKyAgaW50IG1lc3NhZ2VCaXRJbmRleCA9IDA7CisgIGludCBidWlsZGVyQml0SW5kZXggPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIEZpZWxkR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBNYWtlR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmZpZWxkKGkpLAorICAgICAgICBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7CisgICAgZmllbGRfZ2VuZXJhdG9yc19baV0ucmVzZXQoZ2VuZXJhdG9yKTsKKyAgICBtZXNzYWdlQml0SW5kZXggKz0gZ2VuZXJhdG9yLT5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICAgIGJ1aWxkZXJCaXRJbmRleCArPSBnZW5lcmF0b3ItPkdldE51bUJpdHNGb3JCdWlsZGVyKCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgRmllbGRHZW5lcmF0b3IqIGdlbmVyYXRvciA9IE1ha2VHZW5lcmF0b3IoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uKGkpLAorICAgICAgICBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLnJlc2V0KGdlbmVyYXRvcik7CisgICAgbWVzc2FnZUJpdEluZGV4ICs9IGdlbmVyYXRvci0+R2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKKyAgICBidWlsZGVyQml0SW5kZXggKz0gZ2VuZXJhdG9yLT5HZXROdW1CaXRzRm9yQnVpbGRlcigpOworICB9Cit9CisKK0ZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvck1hcDo6TWFrZUdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KSB7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7CisgICAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOworICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKKyAgICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOworICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IEVudW1GaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7CisgICAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKKyAgICB9CisgIH0KK30KKworRmllbGRHZW5lcmF0b3JNYXA6On5GaWVsZEdlbmVyYXRvck1hcCgpIHt9CisKK2NvbnN0IEZpZWxkR2VuZXJhdG9yJiBGaWVsZEdlbmVyYXRvck1hcDo6Z2V0KAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvcl8pOworICByZXR1cm4gKmZpZWxkX2dlbmVyYXRvcnNfW2ZpZWxkLT5pbmRleCgpXTsKK30KKworY29uc3QgRmllbGRHZW5lcmF0b3ImIEZpZWxkR2VuZXJhdG9yTWFwOjpnZXRfZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gKmV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpbmRleF07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDBlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUVMRF9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBGaWVsZEdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgfkZpZWxkR2VuZXJhdG9yKCk7CisKKyAgdmlydHVhbCBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKQorICAgICAgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdCA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmllbGRHZW5lcmF0b3IpOworfTsKKworLy8gQ29udmVuaWVuY2UgY2xhc3Mgd2hpY2ggY29uc3RydWN0cyBGaWVsZEdlbmVyYXRvcnMgZm9yIGEgRGVzY3JpcHRvci4KK2NsYXNzIEZpZWxkR2VuZXJhdG9yTWFwIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEZpZWxkR2VuZXJhdG9yTWFwKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+RmllbGRHZW5lcmF0b3JNYXAoKTsKKworICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2V0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2V0X2V4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPEZpZWxkR2VuZXJhdG9yPiA+IGZpZWxkX2dlbmVyYXRvcnNfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisKKyAgc3RhdGljIEZpZWxkR2VuZXJhdG9yKiBNYWtlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmllbGRHZW5lcmF0b3JNYXApOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzZTU1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5jYwpAQCAtMCwwICsxLDQ5MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCituYW1lc3BhY2UgeworCisKKy8vIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGNvbGxlY3QgZXh0ZW5zaW9ucy4KKy8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIGV4dGVuc2lvbnMgY2FuIGJlIHJlY29nbml6ZWQuIFRoZSBleHRlbnNpb25zIHdpbGwgYmUKKy8vIGFwcGVuZGVkIGluIHRvIHRoZSBleHRlbnNpb25zIHBhcmFtZXRlci4KKy8vIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgdW5rbm93biBmaWVsZHMsIGluIHdoaWNoIGNhc2UgdGhlIGRhdGEgaW4gdGhlCisvLyBleHRlbnNpb25zIG91dHB1dCBwYXJhbWV0ZXIgaXMgbm90IHJlbGlhYmxlIGFuZCBzaG91bGQgYmUgZGlzY2FyZGVkLgorYm9vbCBDb2xsZWN0RXh0ZW5zaW9ucyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIGV4dGVuc2lvbnMpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIC8vIFRoZXJlIGFyZSB1bmtub3duIGZpZWxkcyB0aGF0IGNvdWxkIGJlIGV4dGVuc2lvbnMsIHRodXMgdGhpcyBjYWxsIGZhaWxzLgorICBpZiAocmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKS5maWVsZF9jb3VudCgpID4gMCkgcmV0dXJuIGZhbHNlOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoZmllbGRzW2ldLT5pc19leHRlbnNpb24oKSkgZXh0ZW5zaW9ucy0+cHVzaF9iYWNrKGZpZWxkc1tpXSk7CisKKyAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGRzW2ldKSA9PSBKQVZBVFlQRV9NRVNTQUdFKSB7CisgICAgICBpZiAoZmllbGRzW2ldLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkc1tpXSk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkc1tpXSwgaik7CisgICAgICAgICAgaWYgKCFDb2xsZWN0RXh0ZW5zaW9ucyhzdWJfbWVzc2FnZSwgZXh0ZW5zaW9ucykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkc1tpXSk7CisgICAgICAgIGlmICghQ29sbGVjdEV4dGVuc2lvbnMoc3ViX21lc3NhZ2UsIGV4dGVuc2lvbnMpKSByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZpbmRzIGFsbCBleHRlbnNpb25zIGluIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBpdHMgc3ViLW1lc3NhZ2VzLiAgSWYgdGhlCisvLyBtZXNzYWdlIGNvbnRhaW5zIHVua25vd24gZmllbGRzICh3aGljaCBjb3VsZCBiZSBleHRlbnNpb25zKSwgdGhlbiB0aG9zZQorLy8gZXh0ZW5zaW9ucyBhcmUgZGVmaW5lZCBpbiBhbHRlcm5hdGVfcG9vbC4KKy8vIFRoZSBtZXNzYWdlIHdpbGwgYmUgY29udmVydGVkIHRvIGEgRHluYW1pY01lc3NhZ2UgYmFja2VkIGJ5IGFsdGVybmF0ZV9wb29sCisvLyBpbiBvcmRlciB0byBoYW5kbGUgdGhpcyBjYXNlLgordm9pZCBDb2xsZWN0RXh0ZW5zaW9ucyhjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlX3Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCYgYWx0ZXJuYXRlX3Bvb2wsCisgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogZXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlX2RhdGEpIHsKKyAgaWYgKCFDb2xsZWN0RXh0ZW5zaW9ucyhmaWxlX3Byb3RvLCBleHRlbnNpb25zKSkgeworICAgIC8vIFRoZXJlIGFyZSB1bmtub3duIGZpZWxkcyBpbiB0aGUgZmlsZV9wcm90bywgd2hpY2ggYXJlIHByb2JhYmx5CisgICAgLy8gZXh0ZW5zaW9ucy4gV2UgbmVlZCB0byBwYXJzZSB0aGUgZGF0YSBpbnRvIGEgZHluYW1pYyBtZXNzYWdlIGJhc2VkIG9uIHRoZQorICAgIC8vIGJ1aWxkZXItcG9vbCB0byBmaW5kIG91dCBhbGwgZXh0ZW5zaW9ucy4KKyAgICBjb25zdCBEZXNjcmlwdG9yKiBmaWxlX3Byb3RvX2Rlc2MgPSBhbHRlcm5hdGVfcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgIGZpbGVfcHJvdG8uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSk7CisgICAgR09PR0xFX0NIRUNLKGZpbGVfcHJvdG9fZGVzYykKKyAgICAgICAgPDwgIkZpbmQgdW5rbm93biBmaWVsZHMgaW4gRmlsZURlc2NyaXB0b3JQcm90byB3aGVuIGJ1aWxkaW5nICIKKyAgICAgICAgPDwgZmlsZV9wcm90by5uYW1lKCkKKyAgICAgICAgPDwgIi4gSXQncyBsaWtlbHkgdGhhdCB0aG9zZSBmaWVsZHMgYXJlIGN1c3RvbSBvcHRpb25zLCBob3dldmVyLCAiCisgICAgICAgICAgICJkZXNjcmlwdG9yLnByb3RvIGlzIG5vdCBpbiB0aGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMuICIKKyAgICAgICAgICAgIlRoaXMgbm9ybWFsbHkgc2hvdWxkIG5vdCBoYXBwZW4uIFBsZWFzZSByZXBvcnQgYSBidWcuIjsKKyAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeTsKKyAgICBzY29wZWRfcHRyPE1lc3NhZ2U+IGR5bmFtaWNfZmlsZV9wcm90bygKKyAgICAgICAgZmFjdG9yeS5HZXRQcm90b3R5cGUoZmlsZV9wcm90b19kZXNjKS0+TmV3KCkpOworICAgIEdPT0dMRV9DSEVDSyhkeW5hbWljX2ZpbGVfcHJvdG8uZ2V0KCkgIT0gTlVMTCk7CisgICAgR09PR0xFX0NIRUNLKGR5bmFtaWNfZmlsZV9wcm90by0+UGFyc2VGcm9tU3RyaW5nKGZpbGVfZGF0YSkpOworCisgICAgLy8gQ29sbGVjdCB0aGUgZXh0ZW5zaW9ucyBhZ2FpbiBmcm9tIHRoZSBkeW5hbWljIG1lc3NhZ2UuIFRoZXJlIHNob3VsZCBiZSBubworICAgIC8vIG1vcmUgdW5rbm93biBmaWVsZHMgdGhpcyB0aW1lLCBpLmUuIGFsbCB0aGUgY3VzdG9tIG9wdGlvbnMgc2hvdWxkIGJlCisgICAgLy8gcGFyc2VkIGFzIGV4dGVuc2lvbnMgbm93LgorICAgIGV4dGVuc2lvbnMtPmNsZWFyKCk7CisgICAgR09PR0xFX0NIRUNLKENvbGxlY3RFeHRlbnNpb25zKCpkeW5hbWljX2ZpbGVfcHJvdG8sIGV4dGVuc2lvbnMpKQorICAgICAgICA8PCAiRmluZCB1bmtub3duIGZpZWxkcyBpbiBGaWxlRGVzY3JpcHRvclByb3RvIHdoZW4gYnVpbGRpbmcgIgorICAgICAgICA8PCBmaWxlX3Byb3RvLm5hbWUoKQorICAgICAgICA8PCAiLiBJdCdzIGxpa2VseSB0aGF0IHRob3NlIGZpZWxkcyBhcmUgY3VzdG9tIG9wdGlvbnMsIGhvd2V2ZXIsICIKKyAgICAgICAgICAgInRob3NlIG9wdGlvbnMgY2Fubm90IGJlIHJlY29nbml6ZWQgaW4gdGhlIGJ1aWxkZXIgcG9vbC4gIgorICAgICAgICAgICAiVGhpcyBub3JtYWxseSBzaG91bGQgbm90IGhhcHBlbi4gUGxlYXNlIHJlcG9ydCBhIGJ1Zy4iOworICB9Cit9CisKKworfSAgLy8gbmFtZXNwYWNlCisKK0ZpbGVHZW5lcmF0b3I6OkZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpCisgIDogZmlsZV8oZmlsZSksCisgICAgamF2YV9wYWNrYWdlXyhGaWxlSmF2YVBhY2thZ2UoZmlsZSkpLAorICAgIGNsYXNzbmFtZV8oRmlsZUNsYXNzTmFtZShmaWxlKSkgeworfQorCitGaWxlR2VuZXJhdG9yOjp+RmlsZUdlbmVyYXRvcigpIHt9CisKK2Jvb2wgRmlsZUdlbmVyYXRvcjo6VmFsaWRhdGUoc3RyaW5nKiBlcnJvcikgeworICAvLyBDaGVjayB0aGF0IG5vIGNsYXNzIG5hbWUgbWF0Y2hlcyB0aGUgZmlsZSdzIGNsYXNzIG5hbWUuICBUaGlzIGlzIGEgY29tbW9uCisgIC8vIHByb2JsZW0gdGhhdCBsZWFkcyB0byBKYXZhIGNvbXBpbGUgZXJyb3JzIHRoYXQgY2FuIGJlIGhhcmQgdG8gdW5kZXJzdGFuZC4KKyAgLy8gSXQncyBlc3BlY2lhbGx5IGJhZCB3aGVuIHVzaW5nIHRoZSBqYXZhX211bHRpcGxlX2ZpbGVzLCBzaW5jZSB3ZSB3b3VsZAorICAvLyBlbmQgdXAgb3ZlcndyaXRpbmcgdGhlIG91dGVyIGNsYXNzIHdpdGggb25lIG9mIHRoZSBpbm5lciBvbmVzLgorCisgIGJvb2wgZm91bmRfY29uZmxpY3QgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCkgJiYgIWZvdW5kX2NvbmZsaWN0OyBpKyspIHsKKyAgICBpZiAoZmlsZV8tPmVudW1fdHlwZShpKS0+bmFtZSgpID09IGNsYXNzbmFtZV8pIHsKKyAgICAgIGZvdW5kX2NvbmZsaWN0ID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgJiYgIWZvdW5kX2NvbmZsaWN0OyBpKyspIHsKKyAgICBpZiAoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKS0+bmFtZSgpID09IGNsYXNzbmFtZV8pIHsKKyAgICAgIGZvdW5kX2NvbmZsaWN0ID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpICYmICFmb3VuZF9jb25mbGljdDsgaSsrKSB7CisgICAgaWYgKGZpbGVfLT5zZXJ2aWNlKGkpLT5uYW1lKCkgPT0gY2xhc3NuYW1lXykgeworICAgICAgZm91bmRfY29uZmxpY3QgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChmb3VuZF9jb25mbGljdCkgeworICAgIGVycm9yLT5hc3NpZ24oZmlsZV8tPm5hbWUoKSk7CisgICAgZXJyb3ItPmFwcGVuZCgKKyAgICAgICI6IENhbm5vdCBnZW5lcmF0ZSBKYXZhIG91dHB1dCBiZWNhdXNlIHRoZSBmaWxlJ3Mgb3V0ZXIgY2xhc3MgbmFtZSwgXCIiKTsKKyAgICBlcnJvci0+YXBwZW5kKGNsYXNzbmFtZV8pOworICAgIGVycm9yLT5hcHBlbmQoCisgICAgICAiXCIsIG1hdGNoZXMgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSB0eXBlcyBkZWNsYXJlZCBpbnNpZGUgaXQuICAiCisgICAgICAiUGxlYXNlIGVpdGhlciByZW5hbWUgdGhlIHR5cGUgb3IgdXNlIHRoZSBqYXZhX291dGVyX2NsYXNzbmFtZSAiCisgICAgICAib3B0aW9uIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgb3V0ZXIgY2xhc3MgbmFtZSBmb3IgdGhlIC5wcm90byBmaWxlLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIFdlIGRvbid0IGltcG9ydCBhbnl0aGluZyBiZWNhdXNlIHdlIHJlZmVyIHRvIGFsbCBjbGFzc2VzIGJ5IHRoZWlyCisgIC8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgIi8vIHNvdXJjZTogJGZpbGVuYW1lJFxuIgorICAgICJcbiIsCisgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisgIGlmICghamF2YV9wYWNrYWdlXy5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicGFja2FnZSAkcGFja2FnZSQ7XG4iCisgICAgICAiXG4iLAorICAgICAgInBhY2thZ2UiLCBqYXZhX3BhY2thZ2VfKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIHtcbiIKKyAgICAiICBwcml2YXRlICRjbGFzc25hbWUkKCkge31cbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJBbGxFeHRlbnNpb25zKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeSRsaXRlJCByZWdpc3RyeSkge1xuIiwKKyAgICAibGl0ZSIsIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSA/ICIiIDogIkxpdGUiKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgRXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGVfLT5leHRlbnNpb24oaSkpLkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBNZXNzYWdlR2VuZXJhdG9yKGZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpCisgICAgICAuR2VuZXJhdGVFeHRlbnNpb25SZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIik7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpZiAoIWZpbGVfLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgRW51bUdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpKS5HZW5lcmF0ZShwcmludGVyKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlR2VuZXJhdG9yKGZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOworICAgICAgbWVzc2FnZUdlbmVyYXRvci5HZW5lcmF0ZUludGVyZmFjZShwcmludGVyKTsKKyAgICAgIG1lc3NhZ2VHZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7CisgICAgfQorICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgICAgICBTZXJ2aWNlR2VuZXJhdG9yKGZpbGVfLT5zZXJ2aWNlKGkpKS5HZW5lcmF0ZShwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBFeHRlbnNpb25zIG11c3QgYmUgZ2VuZXJhdGVkIGluIHRoZSBvdXRlciBjbGFzcyBzaW5jZSB0aGV5IGFyZSB2YWx1ZXMsCisgIC8vIG5vdCBjbGFzc2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgRXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGVfLT5leHRlbnNpb24oaSkpLkdlbmVyYXRlKHByaW50ZXIpOworICB9CisKKyAgLy8gU3RhdGljIHZhcmlhYmxlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIC8vIFRPRE8oa2VudG9uKTogIFJldXNlIE1lc3NhZ2VHZW5lcmF0b3Igb2JqZWN0cz8KKyAgICBNZXNzYWdlR2VuZXJhdG9yKGZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpLkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSkgeworICAgIEdlbmVyYXRlRW1iZWRkZWREZXNjcmlwdG9yKHByaW50ZXIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInN0YXRpYyB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIC8vIFRPRE8oa2VudG9uKTogIFJldXNlIE1lc3NhZ2VHZW5lcmF0b3Igb2JqZWN0cz8KKyAgICAgIE1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkKKyAgICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMocHJpbnRlcik7CisgICAgfQorCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQob3V0ZXJfY2xhc3Nfc2NvcGUpXG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUVtYmVkZGVkRGVzY3JpcHRvcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBFbWJlZCB0aGUgZGVzY3JpcHRvci4gIFdlIHNpbXBseSBzZXJpYWxpemUgdGhlIGVudGlyZSBGaWxlRGVzY3JpcHRvclByb3RvCisgIC8vIGFuZCBlbWJlZCBpdCBhcyBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBpcyBwYXJzZWQgYW5kIGJ1aWx0IGludG8gcmVhbAorICAvLyBkZXNjcmlwdG9ycyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLiAgV2UgdW5mb3J0dW5hdGVseSBoYXZlIHRvIHB1dCBpdCBpbgorICAvLyBhIHN0cmluZyBsaXRlcmFsLCBub3QgYSBieXRlIGFycmF5LCBiZWNhdXNlIGFwcGFyZW50bHkgdXNpbmcgYSBsaXRlcmFsCisgIC8vIGJ5dGUgYXJyYXkgY2F1c2VzIHRoZSBKYXZhIGNvbXBpbGVyIHRvIGdlbmVyYXRlICppbnN0cnVjdGlvbnMqIHRvCisgIC8vIGluaXRpYWxpemUgZWFjaCBhbmQgZXZlcnkgYnl0ZSBvZiB0aGUgYXJyYXksIGUuZy4gYXMgaWYgeW91IHR5cGVkOgorICAvLyAgIGJbMF0gPSAxMjM7IGJbMV0gPSA0NTY7IGJbMl0gPSA3ODk7CisgIC8vIFRoaXMgbWFrZXMgaHVnZSBieXRlY29kZSBmaWxlcyBhbmQgY2FuIGVhc2lseSBoaXQgdGhlIGNvbXBpbGVyJ3MgaW50ZXJuYWwKKyAgLy8gY29kZSBzaXplIGxpbWl0cyAoZXJyb3IgImNvZGUgdG8gbGFyZ2UiKS4gIFN0cmluZyBsaXRlcmFscyBhcmUgYXBwYXJlbnRseQorICAvLyBlbWJlZGRlZCByYXcsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBmaWxlXy0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKworICBzdHJpbmcgZmlsZV9kYXRhOworICBmaWxlX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2RhdGEpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKKyAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCisgICAgIiAgcmV0dXJuIGRlc2NyaXB0b3I7XG4iCisgICAgIn1cbiIKKyAgICAicHJpdmF0ZSBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgorICAgICIgICAgZGVzY3JpcHRvcjtcbiIKKyAgICAic3RhdGljIHtcbiIKKyAgICAiICBqYXZhLmxhbmcuU3RyaW5nW10gZGVzY3JpcHRvckRhdGEgPSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIE9ubHkgd3JpdGUgNDAgYnl0ZXMgcGVyIGxpbmUuCisgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVyTGluZSA9IDQwOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZGF0YS5zaXplKCk7IGkgKz0ga0J5dGVzUGVyTGluZSkgeworICAgIGlmIChpID4gMCkgeworICAgICAgLy8gRXZlcnkgNDAwIGxpbmVzLCBzdGFydCBhIG5ldyBzdHJpbmcgbGl0ZXJhbCwgaW4gb3JkZXIgdG8gYXZvaWQgdGhlCisgICAgICAvLyA2NGsgbGVuZ3RoIGxpbWl0LgorICAgICAgaWYgKGkgJSA0MDAgPT0gMCkgeworICAgICAgICBwcmludGVyLT5QcmludCgiLFxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyLT5QcmludCgiICtcbiIpOworICAgICAgfQorICAgIH0KKyAgICBwcmludGVyLT5QcmludCgiXCIkZGF0YSRcIiIsCisgICAgICAiZGF0YSIsIENFc2NhcGUoZmlsZV9kYXRhLnN1YnN0cihpLCBrQnl0ZXNQZXJMaW5lKSkpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgiXG59O1xuIik7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lci4KKworICBwcmludGVyLT5QcmludCgKKyAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci4iCisgICAgICAiSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPVxuIgorICAgICIgIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLiIKKyAgICAgICJJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lcigpIHtcbiIKKyAgICAiICAgIHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5IGFzc2lnbkRlc2NyaXB0b3JzKFxuIgorICAgICIgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3Igcm9vdCkge1xuIgorICAgICIgICAgICBkZXNjcmlwdG9yID0gcm9vdDtcbiIpOworCisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIC8vIFRPRE8oa2VudG9uKTogIFJldXNlIE1lc3NhZ2VHZW5lcmF0b3Igb2JqZWN0cz8KKyAgICBNZXNzYWdlR2VuZXJhdG9yKGZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpCisgICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgRXh0ZW5zaW9uR2VuZXJhdG9yIG9iamVjdHM/CisgICAgRXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGVfLT5leHRlbnNpb24oaSkpCisgICAgICAgIC5HZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorCisgIC8vIFByb3RvIGNvbXBpbGVyIGJ1aWxkcyBhIERlc2NyaXB0b3JQb29sLCB3aGljaCBob2xkcyBhbGwgdGhlIGRlc2NyaXB0b3JzIHRvCisgIC8vIGdlbmVyYXRlLCB3aGVuIHByb2Nlc3NpbmcgdGhlICIucHJvdG8iIGZpbGVzLiBXZSBjYWxsIHRoaXMgRGVzY3JpcHRvclBvb2wKKyAgLy8gdGhlIHBhcnNlZCBwb29sIChhLmsuYS4gZmlsZV8tPnBvb2woKSkuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB3aGVuIHVzZXJzIHRyeSB0byBleHRlbmQgdGhlICguKilEZXNjcmlwdG9yUHJvdG8gaW4gdGhlaXIKKyAgLy8gIi5wcm90byIgZmlsZXMsIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgcHJlLWJ1aWx0IEZpbGVEZXNjcmlwdG9yUHJvdG8gY2xhc3MKKyAgLy8gaW4gcHJvdG8gY29tcGlsZXIuIFdoZW4gd2UgcHV0IHRoZSBkZXNjcmlwdG9yIGRhdGEgaW4gdGhlIGZpbGVfcHJvdG8sIHRob3NlCisgIC8vIGV4dGVuc2lvbnMgYmVjb21lIHVua25vd24gZmllbGRzLgorICAvLworICAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIG91dCBhbGwgdGhlIGV4dGVuc2lvbiB2YWx1ZSB0byB0aGUgKC4qKURlc2NyaXB0b3JQcm90bworICAvLyBpbiB0aGUgZmlsZV9wcm90byBtZXNzYWdlLCBhbmQgcHJlcGFyZSBhbiBFeHRlbnNpb25SZWdpc3RyeSB0byByZXR1cm4uCisgIC8vCisgIC8vIFRvIGZpbmQgdGhvc2UgZXh0ZW5zaW9ucywgd2UgbmVlZCB0byBwYXJzZSB0aGUgZGF0YSBpbnRvIGEgZHluYW1pYyBtZXNzYWdlCisgIC8vIG9mIHRoZSBGaWxlRGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgYnVpbGRlci1wb29sLCB0aGVuIHdlIGNhbiB1c2UKKyAgLy8gcmVmbGVjdGlvbnMgdG8gZmluZCBhbGwgZXh0ZW5zaW9uIGZpZWxkcworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZXh0ZW5zaW9uczsKKyAgQ29sbGVjdEV4dGVuc2lvbnMoZmlsZV9wcm90bywgKmZpbGVfLT5wb29sKCksICZleHRlbnNpb25zLCBmaWxlX2RhdGEpOworCisgIGlmIChleHRlbnNpb25zLnNpemUoKSA+IDApIHsKKyAgICAvLyBNdXN0IGNvbnN0cnVjdCBhbiBFeHRlbnNpb25SZWdpc3RyeSBjb250YWluaW5nIGFsbCBleGlzdGluZyBleHRlbnNpb25zCisgICAgLy8gYW5kIHJldHVybiBpdC4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID1cbiIKKyAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTtcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgRXh0ZW5zaW9uR2VuZXJhdG9yKGV4dGVuc2lvbnNbaV0pLkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicmV0dXJuIHJlZ2lzdHJ5O1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicmV0dXJuIG51bGw7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgICB9XG4iCisgICAgIiAgfTtcbiIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEludm9rZSBpbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oKSB0byBidWlsZCB0aGUgZmlsZS4KKworICBwcmludGVyLT5QcmludCgKKyAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgorICAgICIgIC5pbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsXG4iCisgICAgIiAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcltdIHtcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKFNob3VsZEluY2x1ZGVEZXBlbmRlbmN5KGZpbGVfLT5kZXBlbmRlbmN5KGkpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICAgICAkZGVwZW5kZW5jeSQuZ2V0RGVzY3JpcHRvcigpLFxuIiwKKyAgICAgICAgImRlcGVuZGVuY3kiLCBDbGFzc05hbWUoZmlsZV8tPmRlcGVuZGVuY3koaSkpKTsKKyAgICB9CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiICAgIH0sIGFzc2lnbmVyKTtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIn1cbiIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBHZW5lcmF0b3JDbGFzcywgdHlwZW5hbWUgRGVzY3JpcHRvckNsYXNzPgorc3RhdGljIHZvaWQgR2VuZXJhdGVTaWJsaW5nKGNvbnN0IHN0cmluZyYgcGFja2FnZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBqYXZhX3BhY2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvckNsYXNzKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGZpbGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWVfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKEdlbmVyYXRvckNsYXNzOjoqcGZuKShpbzo6UHJpbnRlciogcHJpbnRlcikpIHsKKyAgc3RyaW5nIGZpbGVuYW1lID0gcGFja2FnZV9kaXIgKyBkZXNjcmlwdG9yLT5uYW1lKCkgKyBuYW1lX3N1ZmZpeCArICIuamF2YSI7CisgIGZpbGVfbGlzdC0+cHVzaF9iYWNrKGZpbGVuYW1lKTsKKworICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KGNvbnRleHQtPk9wZW4oZmlsZW5hbWUpKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisKKyAgcHJpbnRlci5QcmludCgKKyAgICAiLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKKyAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgIlxuIiwKKyAgICAiZmlsZW5hbWUiLCBkZXNjcmlwdG9yLT5maWxlKCktPm5hbWUoKSk7CisgIGlmICghamF2YV9wYWNrYWdlLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgInBhY2thZ2UgJHBhY2thZ2UkO1xuIgorICAgICAgIlxuIiwKKyAgICAgICJwYWNrYWdlIiwgamF2YV9wYWNrYWdlKTsKKyAgfQorCisgIEdlbmVyYXRvckNsYXNzIGdlbmVyYXRvcihkZXNjcmlwdG9yKTsKKyAgKGdlbmVyYXRvci4qcGZuKSgmcHJpbnRlcik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTaWJsaW5ncyhjb25zdCBzdHJpbmcmIHBhY2thZ2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGZpbGVfbGlzdCkgeworICBpZiAoZmlsZV8tPm9wdGlvbnMoKS5qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBHZW5lcmF0ZVNpYmxpbmc8RW51bUdlbmVyYXRvcj4ocGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV8tPmVudW1fdHlwZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBmaWxlX2xpc3QsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIk9yQnVpbGRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKTsKKyAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlKTsKKyAgICB9CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXykpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICAgIEdlbmVyYXRlU2libGluZzxTZXJ2aWNlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfLT5zZXJ2aWNlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZmlsZV9saXN0LCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgRmlsZUdlbmVyYXRvcjo6U2hvdWxkSW5jbHVkZURlcGVuZGVuY3koY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTkxMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBjbGFzcyBGaWxlRGVzY3JpcHRvcjsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9CisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgY2xhc3MgR2VuZXJhdG9yQ29udGV4dDsgICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgRmlsZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKyAgfkZpbGVHZW5lcmF0b3IoKTsKKworICAvLyBDaGVja3MgZm9yIHByb2JsZW1zIHRoYXQgd291bGQgb3RoZXJ3aXNlIGxlYWQgdG8gY3J5cHRpYyBjb21waWxlIGVycm9ycy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBwcm9ibGVtcywgb3Igd3JpdGVzIGFuIGVycm9yIGRlc2NyaXB0aW9uIHRvCisgIC8vIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFZhbGlkYXRlKHN0cmluZyogZXJyb3IpOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIElmIHdlIGFyZW4ndCBwdXR0aW5nIGV2ZXJ5dGhpbmcgaW50byBvbmUgZmlsZSwgdGhpcyB3aWxsIHdyaXRlIGFsbCB0aGUKKyAgLy8gZmlsZXMgb3RoZXIgdGhhbiB0aGUgb3V0ZXIgZmlsZSAoaS5lLiBvbmUgZm9yIGVhY2ggbWVzc2FnZSwgZW51bSwgYW5kCisgIC8vIHNlcnZpY2UgdHlwZSkuCisgIHZvaWQgR2VuZXJhdGVTaWJsaW5ncyhjb25zdCBzdHJpbmcmIHBhY2thZ2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZmlsZV9saXN0KTsKKworICBjb25zdCBzdHJpbmcmIGphdmFfcGFja2FnZSgpIHsgcmV0dXJuIGphdmFfcGFja2FnZV87IH0KKyAgY29uc3Qgc3RyaW5nJiBjbGFzc25hbWUoKSAgICB7IHJldHVybiBjbGFzc25hbWVfOyAgICB9CisKKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgd2hldGhlciB0aGUgZGVwZW5kZW5jeSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgorICAvLyBBbHdheXMgcmV0dXJucyB0cnVlIGZvciBvcGVuc291cmNlLCBidXQgdXNlZCBpbnRlcm5hbGx5IGF0IEdvb2dsZSB0byBoZWxwCisgIC8vIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb24gMSBvZiBwcm90b2NvbCBidWZmZXJzLgorICBib29sIFNob3VsZEluY2x1ZGVEZXBlbmRlbmN5KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIHN0cmluZyBqYXZhX3BhY2thZ2VfOworICBzdHJpbmcgY2xhc3NuYW1lXzsKKworCisgIHZvaWQgR2VuZXJhdGVFbWJlZGRlZERlc2NyaXB0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Yzc5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKKworSmF2YUdlbmVyYXRvcjo6SmF2YUdlbmVyYXRvcigpIHt9CitKYXZhR2VuZXJhdG9yOjp+SmF2YUdlbmVyYXRvcigpIHt9CisKK2Jvb2wgSmF2YUdlbmVyYXRvcjo6R2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHBhcnNlIGdlbmVyYXRvciBvcHRpb25zCisKKyAgLy8gTmFtZSBhIGZpbGUgd2hlcmUgd2Ugd2lsbCB3cml0ZSBhIGxpc3Qgb2YgZ2VuZXJhdGVkIGZpbGUgbmFtZXMsIG9uZQorICAvLyBwZXIgbGluZS4KKyAgc3RyaW5nIG91dHB1dF9saXN0X2ZpbGU7CisKKworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBvcHRpb25zOworICBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihwYXJhbWV0ZXIsICZvcHRpb25zKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAib3V0cHV0X2xpc3RfZmlsZSIpIHsKKyAgICAgIG91dHB1dF9saXN0X2ZpbGUgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgKmVycm9yID0gIlVua25vd24gZ2VuZXJhdG9yIG9wdGlvbjogIiArIG9wdGlvbnNbaV0uZmlyc3Q7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgIGlmIChmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgPT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgZmlsZS0+b3B0aW9ucygpLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKKyAgICAqZXJyb3IgPSAiVGhlIFwiamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hcIiBvcHRpb24gaXMgaW5jb21wYXRpYmxlICIKKyAgICAgICAgICAgICAid2l0aCBcIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRVwiLiAgWW91IG11c3Qgb3B0aW1pemUgZm9yICIKKyAgICAgICAgICAgICAiU1BFRUQgb3IgQ09ERV9TSVpFIGlmIHlvdSB3YW50IHRvIHVzZSB0aGlzIG9wdGlvbi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEZpbGVHZW5lcmF0b3IgZmlsZV9nZW5lcmF0b3IoZmlsZSk7CisgIGlmICghZmlsZV9nZW5lcmF0b3IuVmFsaWRhdGUoZXJyb3IpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RyaW5nIHBhY2thZ2VfZGlyID0gSmF2YVBhY2thZ2VUb0RpcihmaWxlX2dlbmVyYXRvci5qYXZhX3BhY2thZ2UoKSk7CisKKyAgdmVjdG9yPHN0cmluZz4gYWxsX2ZpbGVzOworCisgIHN0cmluZyBqYXZhX2ZpbGVuYW1lID0gcGFja2FnZV9kaXI7CisgIGphdmFfZmlsZW5hbWUgKz0gZmlsZV9nZW5lcmF0b3IuY2xhc3NuYW1lKCk7CisgIGphdmFfZmlsZW5hbWUgKz0gIi5qYXZhIjsKKyAgYWxsX2ZpbGVzLnB1c2hfYmFjayhqYXZhX2ZpbGVuYW1lKTsKKworICAvLyBHZW5lcmF0ZSBtYWluIGphdmEgZmlsZS4KKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICBjb250ZXh0LT5PcGVuKGphdmFfZmlsZW5hbWUpKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgIGZpbGVfZ2VuZXJhdG9yLkdlbmVyYXRlKCZwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBzaWJsaW5nIGZpbGVzLgorICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVNpYmxpbmdzKHBhY2thZ2VfZGlyLCBjb250ZXh0LCAmYWxsX2ZpbGVzKTsKKworICAvLyBHZW5lcmF0ZSBvdXRwdXQgbGlzdCBpZiByZXF1ZXN0ZWQuCisgIGlmICghb3V0cHV0X2xpc3RfZmlsZS5lbXB0eSgpKSB7CisgICAgLy8gR2VuZXJhdGUgb3V0cHV0IGxpc3QuICBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgdGV4dCBmaWxlIHBsYWNlZCBpbiBhCisgICAgLy8gZGV0ZXJtaW5pc3RpYyBsb2NhdGlvbiB3aGljaCBsaXN0cyB0aGUgLmphdmEgZmlsZXMgYmVpbmcgZ2VuZXJhdGVkLgorICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBzcmNsaXN0X3Jhd19vdXRwdXQoCisgICAgICBjb250ZXh0LT5PcGVuKG91dHB1dF9saXN0X2ZpbGUpKTsKKyAgICBpbzo6UHJpbnRlciBzcmNsaXN0X3ByaW50ZXIoc3JjbGlzdF9yYXdfb3V0cHV0LmdldCgpLCAnJCcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICBzcmNsaXN0X3ByaW50ZXIuUHJpbnQoIiRmaWxlbmFtZSRcbiIsICJmaWxlbmFtZSIsIGFsbF9maWxlc1tpXSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4YjhkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gR2VuZXJhdGVzIEphdmEgY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworLy8gQ29kZUdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiB3aGljaCBnZW5lcmF0ZXMgSmF2YSBjb2RlLiAgSWYgeW91IGNyZWF0ZSB5b3VyCisvLyBvd24gcHJvdG9jb2wgY29tcGlsZXIgYmluYXJ5IGFuZCB5b3Ugd2FudCBpdCB0byBzdXBwb3J0IEphdmEgb3V0cHV0LCB5b3UKKy8vIGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIENvZGVHZW5lcmF0b3Igd2l0aCB0aGUKKy8vIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgorY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBKYXZhR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgSmF2YUdlbmVyYXRvcigpOworICB+SmF2YUdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKYXZhR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI0MWI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjCkBAIC0wLDAgKzEsNTAwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXSA9CisgICIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdID0KKyAgIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIqIGtEZWZhdWx0UGFja2FnZSA9ICIiOworCitjb25zdCBzdHJpbmcmIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIEdyb3VwcyBhcmUgaGFja3k6ICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgaXMganVzdCB0aGUgbG93ZXItY2FzZWQgbmFtZQorICAvLyBvZiB0aGUgZ3JvdXAgdHlwZS4gIEluIEphdmEsIHRob3VnaCwgd2Ugd291bGQgbGlrZSB0byByZXRhaW4gdGhlIG9yaWdpbmFsCisgIC8vIGNhcGl0YWxpemF0aW9uIG9mIHRoZSB0eXBlIG5hbWUuCisgIGlmIChHZXRUeXBlKGZpZWxkKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICByZXR1cm4gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZpZWxkLT5uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2VJbXBsKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgY2FwX25leHRfbGV0dGVyKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgeworICAgICAgaWYgKGNhcF9uZXh0X2xldHRlcikgeworICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV0gKyAoJ0EnIC0gJ2EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoJ0EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICdaJykgeworICAgICAgaWYgKGkgPT0gMCAmJiAhY2FwX25leHRfbGV0dGVyKSB7CisgICAgICAgIC8vIEZvcmNlIGZpcnN0IGxldHRlciB0byBsb3dlci1jYXNlIHVubGVzcyBleHBsaWNpdGx5IHRvbGQgdG8KKyAgICAgICAgLy8gY2FwaXRhbGl6ZSBpdC4KKyAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldICsgKCdhJyAtICdBJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDYXBpdGFsIGxldHRlcnMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBsZWZ0IGFzLWlzLgorICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICB9CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCcwJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAnOScpIHsKKyAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlSW1wbChGaWVsZE5hbWUoZmllbGQpLCBmYWxzZSk7Cit9CisKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwoRmllbGROYW1lKGZpZWxkKSwgdHJ1ZSk7Cit9CisKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwobWV0aG9kLT5uYW1lKCksIGZhbHNlKTsKK30KKworc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICBpZiAoSGFzU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvZGV2ZWwiKSkgeworICAgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90b2RldmVsIik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFN0cmlwU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvIik7CisgIH0KK30KKworc3RyaW5nIEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKGZpbGUtPm9wdGlvbnMoKS5oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgIHJldHVybiBmaWxlLT5vcHRpb25zKCkuamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgYmFzZW5hbWU7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IGZpbGUtPm5hbWUoKS5maW5kX2xhc3Rfb2YoJy8nKTsKKyAgICBpZiAobGFzdF9zbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGJhc2VuYW1lID0gZmlsZS0+bmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICBiYXNlbmFtZSA9IGZpbGUtPm5hbWUoKS5zdWJzdHIobGFzdF9zbGFzaCArIDEpOworICAgIH0KKyAgICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwoU3RyaXBQcm90byhiYXNlbmFtZSksIHRydWUpOworICB9Cit9CisKK3N0cmluZyBGaWxlSmF2YVBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKworICBpZiAoZmlsZS0+b3B0aW9ucygpLmhhc19qYXZhX3BhY2thZ2UoKSkgeworICAgIHJlc3VsdCA9IGZpbGUtPm9wdGlvbnMoKS5qYXZhX3BhY2thZ2UoKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBrRGVmYXVsdFBhY2thZ2U7CisgICAgaWYgKCFmaWxlLT5wYWNrYWdlKCkuZW1wdHkoKSkgeworICAgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICcuJzsKKyAgICAgIHJlc3VsdCArPSBmaWxlLT5wYWNrYWdlKCk7CisgICAgfQorICB9CisKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgSmF2YVBhY2thZ2VUb0RpcihzdHJpbmcgcGFja2FnZV9uYW1lKSB7CisgIHN0cmluZyBwYWNrYWdlX2RpciA9CisgICAgU3RyaW5nUmVwbGFjZShwYWNrYWdlX25hbWUsICIuIiwgIi8iLCB0cnVlKTsKKyAgaWYgKCFwYWNrYWdlX2Rpci5lbXB0eSgpKSBwYWNrYWdlX2RpciArPSAiLyI7CisgIHJldHVybiBwYWNrYWdlX2RpcjsKK30KKworc3RyaW5nIFRvSmF2YU5hbWUoY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIGlmIChmaWxlLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CisgICAgcmVzdWx0ID0gRmlsZUphdmFQYWNrYWdlKGZpbGUpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IENsYXNzTmFtZShmaWxlKTsKKyAgfQorICBpZiAoIXJlc3VsdC5lbXB0eSgpKSB7CisgICAgcmVzdWx0ICs9ICcuJzsKKyAgfQorICBpZiAoZmlsZS0+cGFja2FnZSgpLmVtcHR5KCkpIHsKKyAgICByZXN1bHQgKz0gZnVsbF9uYW1lOworICB9IGVsc2UgeworICAgIC8vIFN0cmlwIHRoZSBwcm90byBwYWNrYWdlIGZyb20gZnVsbF9uYW1lIHNpbmNlIHdlJ3ZlIHJlcGxhY2VkIGl0IHdpdGgKKyAgICAvLyB0aGUgSmF2YSBwYWNrYWdlLgorICAgIHJlc3VsdCArPSBmdWxsX25hbWUuc3Vic3RyKGZpbGUtPnBhY2thZ2UoKS5zaXplKCkgKyAxKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIFRvSmF2YU5hbWUoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIGRlc2NyaXB0b3ItPmZpbGUoKSk7Cit9CisKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIFRvSmF2YU5hbWUoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIGRlc2NyaXB0b3ItPmZpbGUoKSk7Cit9CisKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIFRvSmF2YU5hbWUoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIGRlc2NyaXB0b3ItPmZpbGUoKSk7Cit9CisKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RyaW5nIHJlc3VsdCA9IEZpbGVKYXZhUGFja2FnZShkZXNjcmlwdG9yKTsKKyAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICcuJzsKKyAgcmVzdWx0ICs9IEZpbGVDbGFzc05hbWUoZGVzY3JpcHRvcik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyBGaWVsZENvbnN0YW50TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7CisgIHN0cmluZyBuYW1lID0gZmllbGQtPm5hbWUoKSArICJfRklFTERfTlVNQkVSIjsKKyAgVXBwZXJTdHJpbmcoJm5hbWUpOworICByZXR1cm4gbmFtZTsKK30KKworRmllbGREZXNjcmlwdG9yOjpUeXBlIEdldFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gZmllbGQtPnR5cGUoKTsKK30KKworSmF2YVR5cGUgR2V0SmF2YVR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzd2l0Y2ggKEdldFR5cGUoZmllbGQpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX0lOVDsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIHJldHVybiBKQVZBVFlQRV9MT05HOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gSkFWQVRZUEVfRkxPQVQ7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gSkFWQVRZUEVfRE9VQkxFOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBKQVZBVFlQRV9CT09MRUFOOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX1NUUklORzsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX0JZVEVTOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIHJldHVybiBKQVZBVFlQRV9FTlVNOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBKQVZBVFlQRV9NRVNTQUdFOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIEpBVkFUWVBFX0lOVDsKK30KKworY29uc3QgY2hhciogQm94ZWRQcmltaXRpdmVUeXBlTmFtZShKYXZhVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UICAgIDogcmV0dXJuICJqYXZhLmxhbmcuSW50ZWdlciI7CisgICAgY2FzZSBKQVZBVFlQRV9MT05HICAgOiByZXR1cm4gImphdmEubGFuZy5Mb25nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUICA6IHJldHVybiAiamF2YS5sYW5nLkZsb2F0IjsKKyAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRSA6IHJldHVybiAiamF2YS5sYW5nLkRvdWJsZSI7CisgICAgY2FzZSBKQVZBVFlQRV9CT09MRUFOOiByZXR1cm4gImphdmEubGFuZy5Cb29sZWFuIjsKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORyA6IHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgY2FzZSBKQVZBVFlQRV9CWVRFUyAgOiByZXR1cm4gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyI7CisgICAgY2FzZSBKQVZBVFlQRV9FTlVNICAgOiByZXR1cm4gTlVMTDsKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6IHJldHVybiBOVUxMOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyBKYXZhVHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCitib29sIEFsbEFzY2lpKGNvbnN0IHN0cmluZyYgdGV4dCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoKHRleHRbaV0gJiAweDgwKSAhPSAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gU3dpdGNoIG9uIENwcFR5cGUgc2luY2Ugd2UgbmVlZCB0byBrbm93IHdoaWNoIGRlZmF1bHRfdmFsdWVfKiBtZXRob2QKKyAgLy8gb2YgRmllbGREZXNjcmlwdG9yIHRvIGNhbGwuCisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIC8vIE5lZWQgdG8gcHJpbnQgYXMgYSBzaWduZWQgaW50IHNpbmNlIEphdmEgaGFzIG5vIHVuc2lnbmVkLgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2Eoc3RhdGljX2Nhc3Q8aW50MzI+KGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKSArICJMIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShzdGF0aWNfY2FzdDxpbnQ2ND4oZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDY0KCkpKSArCisgICAgICAgICAgICAgIkwiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZG91YmxlKCk7CisgICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgICAgICByZXR1cm4gIkRvdWJsZS5QT1NJVElWRV9JTkZJTklUWSI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAiRG91YmxlLk5FR0FUSVZFX0lORklOSVRZIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICJEb3VibGUuTmFOIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTaW1wbGVEdG9hKHZhbHVlKSArICJEIjsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIGZsb2F0IHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZmxvYXQoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICJGbG9hdC5QT1NJVElWRV9JTkZJTklUWSI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICJGbG9hdC5ORUdBVElWRV9JTkZJTklUWSI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAiRmxvYXQuTmFOIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTaW1wbGVGdG9hKHZhbHVlKSArICJGIjsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9ib29sKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIGlmIChHZXRUeXBlKGZpZWxkKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpIHsKKyAgICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICAgICAgLy8gU2VlIGNvbW1lbnRzIGluIEludGVybmFsLmphdmEgZm9yIGdvcnkgZGV0YWlscy4KKyAgICAgICAgICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmJ5dGVzRGVmYXVsdFZhbHVlKFwiJDBcIikiLAorICAgICAgICAgICAgQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAiY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLkVNUFRZIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKEFsbEFzY2lpKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSkgeworICAgICAgICAgIC8vIEFsbCBjaGFycyBhcmUgQVNDSUkuICBJbiB0aGlzIGNhc2UgQ0VzY2FwZSgpIHdvcmtzIGZpbmUuCisgICAgICAgICAgcmV0dXJuICJcIiIgKyBDRXNjYXBlKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArICJcIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU2VlIGNvbW1lbnRzIGluIEludGVybmFsLmphdmEgZm9yIGdvcnkgZGV0YWlscy4KKyAgICAgICAgICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuc3RyaW5nRGVmYXVsdFZhbHVlKFwiJDBcIikiLAorICAgICAgICAgICAgICBDRXNjYXBlKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gQ2xhc3NOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSkgKyAiLiIgKworICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bmFtZSgpOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSArICIuZ2V0RGVmYXVsdEluc3RhbmNlKCkiOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuICIiOworfQorCitib29sIElzRGVmYXVsdFZhbHVlSmF2YURlZmF1bHQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBTd2l0Y2ggb24gQ3BwVHlwZSBzaW5jZSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggZGVmYXVsdF92YWx1ZV8qIG1ldGhvZAorICAvLyBvZiBGaWVsZERlc2NyaXB0b3IgdG8gY2FsbC4KKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkgPT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkgPT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpID09IDBMOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSA9PSAwTDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkgPT0gMC4wOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCkgPT0gMC4wOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID09IGZhbHNlOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBmYWxzZTsKK30KKworY29uc3QgY2hhciogYml0X21hc2tzW10gPSB7CisgICIweDAwMDAwMDAxIiwKKyAgIjB4MDAwMDAwMDIiLAorICAiMHgwMDAwMDAwNCIsCisgICIweDAwMDAwMDA4IiwKKyAgIjB4MDAwMDAwMTAiLAorICAiMHgwMDAwMDAyMCIsCisgICIweDAwMDAwMDQwIiwKKyAgIjB4MDAwMDAwODAiLAorCisgICIweDAwMDAwMTAwIiwKKyAgIjB4MDAwMDAyMDAiLAorICAiMHgwMDAwMDQwMCIsCisgICIweDAwMDAwODAwIiwKKyAgIjB4MDAwMDEwMDAiLAorICAiMHgwMDAwMjAwMCIsCisgICIweDAwMDA0MDAwIiwKKyAgIjB4MDAwMDgwMDAiLAorCisgICIweDAwMDEwMDAwIiwKKyAgIjB4MDAwMjAwMDAiLAorICAiMHgwMDA0MDAwMCIsCisgICIweDAwMDgwMDAwIiwKKyAgIjB4MDAxMDAwMDAiLAorICAiMHgwMDIwMDAwMCIsCisgICIweDAwNDAwMDAwIiwKKyAgIjB4MDA4MDAwMDAiLAorCisgICIweDAxMDAwMDAwIiwKKyAgIjB4MDIwMDAwMDAiLAorICAiMHgwNDAwMDAwMCIsCisgICIweDA4MDAwMDAwIiwKKyAgIjB4MTAwMDAwMDAiLAorICAiMHgyMDAwMDAwMCIsCisgICIweDQwMDAwMDAwIiwKKyAgIjB4ODAwMDAwMDAiLAorfTsKKworc3RyaW5nIEdldEJpdEZpZWxkTmFtZShpbnQgaW5kZXgpIHsKKyAgc3RyaW5nIHZhck5hbWUgPSAiYml0RmllbGQiOworICB2YXJOYW1lICs9IFNpbXBsZUl0b2EoaW5kZXgpOworICB2YXJOYW1lICs9ICJfIjsKKyAgcmV0dXJuIHZhck5hbWU7Cit9CisKK3N0cmluZyBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoaW50IGJpdEluZGV4KSB7CisgIHJldHVybiBHZXRCaXRGaWVsZE5hbWUoYml0SW5kZXggLyAzMik7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0cmluZyBHZW5lcmF0ZUdldEJpdEludGVybmFsKGNvbnN0IHN0cmluZyYgcHJlZml4LCBpbnQgYml0SW5kZXgpIHsKKyAgc3RyaW5nIHZhck5hbWUgPSBwcmVmaXggKyBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoYml0SW5kZXgpOworICBpbnQgYml0SW5WYXJJbmRleCA9IGJpdEluZGV4ICUgMzI7CisKKyAgc3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07CisgIHN0cmluZyByZXN1bHQgPSAiKCgiICsgdmFyTmFtZSArICIgJiAiICsgbWFzayArICIpID09ICIgKyBtYXNrICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgR2VuZXJhdGVTZXRCaXRJbnRlcm5hbChjb25zdCBzdHJpbmcmIHByZWZpeCwgaW50IGJpdEluZGV4KSB7CisgIHN0cmluZyB2YXJOYW1lID0gcHJlZml4ICsgR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKKyAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOworCisgIHN0cmluZyBtYXNrID0gYml0X21hc2tzW2JpdEluVmFySW5kZXhdOworICBzdHJpbmcgcmVzdWx0ID0gdmFyTmFtZSArICIgfD0gIiArIG1hc2s7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdHJpbmcgR2VuZXJhdGVHZXRCaXQoaW50IGJpdEluZGV4KSB7CisgIHJldHVybiBHZW5lcmF0ZUdldEJpdEludGVybmFsKCIiLCBiaXRJbmRleCk7Cit9CisKK3N0cmluZyBHZW5lcmF0ZVNldEJpdChpbnQgYml0SW5kZXgpIHsKKyAgcmV0dXJuIEdlbmVyYXRlU2V0Qml0SW50ZXJuYWwoIiIsIGJpdEluZGV4KTsKK30KKworc3RyaW5nIEdlbmVyYXRlQ2xlYXJCaXQoaW50IGJpdEluZGV4KSB7CisgIHN0cmluZyB2YXJOYW1lID0gR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKKyAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOworCisgIHN0cmluZyBtYXNrID0gYml0X21hc2tzW2JpdEluVmFySW5kZXhdOworICBzdHJpbmcgcmVzdWx0ID0gdmFyTmFtZSArICIgPSAoIiArIHZhck5hbWUgKyAiICYgfiIgKyBtYXNrICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoaW50IGJpdEluZGV4KSB7CisgIHJldHVybiBHZW5lcmF0ZUdldEJpdEludGVybmFsKCJmcm9tXyIsIGJpdEluZGV4KTsKK30KKworc3RyaW5nIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChpbnQgYml0SW5kZXgpIHsKKyAgcmV0dXJuIEdlbmVyYXRlU2V0Qml0SW50ZXJuYWwoInRvXyIsIGJpdEluZGV4KTsKK30KKworc3RyaW5nIEdlbmVyYXRlR2V0Qml0TXV0YWJsZUxvY2FsKGludCBiaXRJbmRleCkgeworICByZXR1cm4gR2VuZXJhdGVHZXRCaXRJbnRlcm5hbCgibXV0YWJsZV8iLCBiaXRJbmRleCk7Cit9CisKK3N0cmluZyBHZW5lcmF0ZVNldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpIHsKKyAgcmV0dXJuIEdlbmVyYXRlU2V0Qml0SW50ZXJuYWwoIm11dGFibGVfIiwgYml0SW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzN2YwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oCkBAIC0wLDAgKzEsMjIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9IRUxQRVJTX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9IRUxQRVJTX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworLy8gQ29tbW9ubHktdXNlZCBzZXBhcmF0b3IgY29tbWVudHMuICBUaGljayBpcyBhIGxpbmUgb2YgJz0nLCB0aGluIGlzIGEgbGluZQorLy8gb2YgJy0nLgorZXh0ZXJuIGNvbnN0IGNoYXIga1RoaWNrU2VwYXJhdG9yW107CitleHRlcm4gY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdOworCisvLyBDb252ZXJ0cyB0aGUgZmllbGQncyBuYW1lIHRvIGNhbWVsLWNhc2UsIGUuZy4gImZvb19iYXJfYmF6IiBiZWNvbWVzCisvLyAiZm9vQmFyQmF6IiBvciAiRm9vQmFyQmF6IiwgcmVzcGVjdGl2ZWx5Lgorc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CitzdHJpbmcgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBTaW1pbGFyLCBidXQgZm9yIG1ldGhvZCBuYW1lcy4gIChUeXBpY2FsbHksIHRoaXMgbWVyZWx5IGhhcyB0aGUgZWZmZWN0CisvLyBvZiBsb3dlci1jYXNpbmcgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgbmFtZS4pCitzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpOworCisvLyBTdHJpcHMgIi5wcm90byIgb3IgIi5wcm90b2RldmVsIiBmcm9tIHRoZSBlbmQgb2YgYSBmaWxlbmFtZS4KK3N0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworCisvLyBHZXRzIHRoZSB1bnF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgZmlsZS4gIEVhY2ggLnByb3RvIGZpbGUgYmVjb21lcyBhCisvLyBzaW5nbGUgSmF2YSBjbGFzcywgd2l0aCBhbGwgaXRzIGNvbnRlbnRzIG5lc3RlZCBpbiB0aGF0IGNsYXNzLgorc3RyaW5nIEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCisvLyBSZXR1cm5zIHRoZSBmaWxlJ3MgSmF2YSBwYWNrYWdlIG5hbWUuCitzdHJpbmcgRmlsZUphdmFQYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gUmV0dXJucyBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lLgorc3RyaW5nIEphdmFQYWNrYWdlVG9EaXIoc3RyaW5nIHBhY2thZ2VfbmFtZSk7CisKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgbmFtZSBpbiB0aGUgcHJvdG8gbmFtZXNwYWNlIHRvIGl0cworLy8gZnVsbHktcXVhbGlmaWVkIG5hbWUgaW4gdGhlIEphdmEgbmFtZXNwYWNlLCBnaXZlbiB0aGF0IGl0IGlzIGluIHRoZSBnaXZlbgorLy8gZmlsZS4KK3N0cmluZyBUb0phdmFOYW1lKGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKy8vIFRoZXNlIHJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKy8vIGRlc2NyaXB0b3IuCitzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworc3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitpbmxpbmUgc3RyaW5nIEV4dGVuc2lvbklkZW50aWZpZXJOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gVG9KYXZhTmFtZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgZGVzY3JpcHRvci0+ZmlsZSgpKTsKK30KKworLy8gR2V0IHRoZSB1bnF1YWxpZmllZCBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgZmllbGQncyBmaWVsZAorLy8gbnVtYmVyIGNvbnN0YW50Lgorc3RyaW5nIEZpZWxkQ29uc3RhbnROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqZmllbGQpOworCisvLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBGaWVsZERlc2NyaXB0b3IuCisvLyBUaGlzIGRvZXMgbm90aGluZyBpbnRlcmVzdGluZyBmb3IgdGhlIG9wZW4gc291cmNlIHJlbGVhc2UsIGJ1dCBpcyB1c2VkIGZvcgorLy8gaGFja3MgdGhhdCBpbXByb3ZlIGNvbXBhdGFiaWxpdHkgd2l0aCB2ZXJzaW9uIDEgcHJvdG9jb2wgYnVmZmVycyBhdCBHb29nbGUuCitGaWVsZERlc2NyaXB0b3I6OlR5cGUgR2V0VHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworZW51bSBKYXZhVHlwZSB7CisgIEpBVkFUWVBFX0lOVCwKKyAgSkFWQVRZUEVfTE9ORywKKyAgSkFWQVRZUEVfRkxPQVQsCisgIEpBVkFUWVBFX0RPVUJMRSwKKyAgSkFWQVRZUEVfQk9PTEVBTiwKKyAgSkFWQVRZUEVfU1RSSU5HLAorICBKQVZBVFlQRV9CWVRFUywKKyAgSkFWQVRZUEVfRU5VTSwKKyAgSkFWQVRZUEVfTUVTU0FHRQorfTsKKworSmF2YVR5cGUgR2V0SmF2YVR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgYm94ZWQgcHJpbWl0aXZlIHR5cGUsIGUuZy4KKy8vICJqYXZhLmxhbmcuSW50ZWdlciIgZm9yIEpBVkFUWVBFX0lOVC4gIFJldHVybnMgTlVMTCBmb3IgZW51bSBhbmQgbWVzc2FnZQorLy8gdHlwZXMuCitjb25zdCBjaGFyKiBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEphdmFUeXBlIHR5cGUpOworCitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworYm9vbCBJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBEb2VzIHRoaXMgbWVzc2FnZSBjbGFzcyBrZWVwIHRyYWNrIG9mIHVua25vd24gZmllbGRzPworaW5saW5lIGJvb2wgSGFzVW5rbm93bkZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPQorICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQorCisvLyBEb2VzIHRoaXMgbWVzc2FnZSBjbGFzcyBoYXZlIGdlbmVyYXRlZCBwYXJzaW5nLCBzZXJpYWxpemF0aW9uLCBhbmQgb3RoZXIKKy8vIHN0YW5kYXJkIG1ldGhvZHMgZm9yIHdoaWNoIHJlZmxlY3Rpb24tYmFzZWQgZmFsbGJhY2sgaW1wbGVtZW50YXRpb25zIGV4aXN0PworaW5saW5lIGJvb2wgSGFzR2VuZXJhdGVkTWV0aG9kcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPQorICAgICAgICAgICBGaWxlT3B0aW9uczo6Q09ERV9TSVpFOworfQorCisvLyBEb2VzIHRoaXMgbWVzc2FnZSBoYXZlIHNwZWNpYWxpemVkIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIG1ldGhvZHM/CitpbmxpbmUgYm9vbCBIYXNFcXVhbHNBbmRIYXNoQ29kZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOworfQorCisvLyBEb2VzIHRoaXMgbWVzc2FnZSBjbGFzcyBoYXZlIGRlc2NyaXB0b3IgYW5kIHJlZmxlY3Rpb24gbWV0aG9kcz8KK2lubGluZSBib29sIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9CisgICAgICAgICAgIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Cit9CitpbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KKyAgICAgICAgICAgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK30KK2lubGluZSBib29sIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KKyAgICAgICAgICAgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK30KKworaW5saW5lIGJvb2wgSGFzTmVzdGVkQnVpbGRlcnMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAvLyBUaGUgcHJvdG8tbGl0ZSB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgYnVpbGRlcnMuCisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPQorICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQorCisvLyBTaG91bGQgd2UgZ2VuZXJhdGUgZ2VuZXJpYyBzZXJ2aWNlcyBmb3IgdGhpcyBmaWxlPworaW5saW5lIGJvb2wgSGFzR2VuZXJpY1NlcnZpY2VzKGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlKSB7CisgIHJldHVybiBmaWxlLT5zZXJ2aWNlX2NvdW50KCkgPiAwICYmCisgICAgICAgICBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgICAgZmlsZS0+b3B0aW9ucygpLmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpOworfQorCisKKy8vIE1ldGhvZHMgZm9yIHNoYXJlZCBiaXRmaWVsZHMuCisKKy8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBiaXRmaWVsZCBmb3IgdGhlIGdpdmVuIGluZGV4Lgorc3RyaW5nIEdldEJpdEZpZWxkTmFtZShpbnQgaW5kZXgpOworCisvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgYml0ZmllbGQgZm9yIHRoZSBnaXZlbiBiaXQgaW5kZXguCisvLyBFZmZlY3RpdmVseSwgR2V0Qml0RmllbGROYW1lKGJpdEluZGV4IC8gMzIpCitzdHJpbmcgR2V0Qml0RmllbGROYW1lRm9yQml0KGludCBiaXRJbmRleCk7CisKKy8vIEdlbmVyYXRlcyB0aGUgamF2YSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUKKy8vIG9mIHRoZSBiaXQgb2YgdGhlIHNoYXJlZCBiaXRmaWVsZHMgZm9yIHRoZSBnaXZlbiBiaXQgaW5kZXguCisvLyBFeGFtcGxlOiAiKChiaXRGaWVsZDFfICYgMHgwNCkgPT0gMHgwNCkiCitzdHJpbmcgR2VuZXJhdGVHZXRCaXQoaW50IGJpdEluZGV4KTsKKworLy8gR2VuZXJhdGVzIHRoZSBqYXZhIGNvZGUgZm9yIHRoZSBleHByZXNzaW9uIHRoYXQgc2V0cyB0aGUgYml0IG9mIHRoZSBzaGFyZWQKKy8vIGJpdGZpZWxkcyBmb3IgdGhlIGdpdmVuIGJpdCBpbmRleC4KKy8vIEV4YW1wbGU6ICJiaXRGaWVsZDFfID0gKGJpdEZpZWxkMV8gfCAweDA0KSIKK3N0cmluZyBHZW5lcmF0ZVNldEJpdChpbnQgYml0SW5kZXgpOworCisvLyBHZW5lcmF0ZXMgdGhlIGphdmEgY29kZSBmb3IgdGhlIGV4cHJlc3Npb24gdGhhdCBjbGVhcnMgdGhlIGJpdCBvZiB0aGUgc2hhcmVkCisvLyBiaXRmaWVsZHMgZm9yIHRoZSBnaXZlbiBiaXQgaW5kZXguCisvLyBFeGFtcGxlOiAiYml0RmllbGQxXyA9IChiaXRGaWVsZDFfICYgfjB4MDQpIgorc3RyaW5nIEdlbmVyYXRlQ2xlYXJCaXQoaW50IGJpdEluZGV4KTsKKworLy8gRG9lcyB0aGUgc2FtZSBhcyBHZW5lcmF0ZUdldEJpdCBidXQgb3BlcmF0ZXMgb24gdGhlIGJpdCBmaWVsZCBvbiBhIGxvY2FsCisvLyB2YXJpYWJsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBidWlsZGVyIHRvIGNvcHkgdGhlIHZhbHVlIGluIHRoZSBidWlsZGVyIHRvCisvLyB0aGUgbWVzc2FnZS4KKy8vIEV4YW1wbGU6ICIoKGZyb21fYml0RmllbGQxXyAmIDB4MDQpID09IDB4MDQpIgorc3RyaW5nIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGludCBiaXRJbmRleCk7CisKKy8vIERvZXMgdGhlIHNhbWUgYXMgR2VuZXJhdGVTZXRCaXQgYnV0IG9wZXJhdGVzIG9uIHRoZSBiaXQgZmllbGQgb24gYSBsb2NhbAorLy8gdmFyaWFibGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgYnVpbGRlciB0byBjb3B5IHRoZSB2YWx1ZSBpbiB0aGUgYnVpbGRlciB0bworLy8gdGhlIG1lc3NhZ2UuCisvLyBFeGFtcGxlOiAidG9fYml0RmllbGQxXyA9ICh0b19iaXRGaWVsZDFfIHwgMHgwNCkiCitzdHJpbmcgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKGludCBiaXRJbmRleCk7CisKKy8vIERvZXMgdGhlIHNhbWUgYXMgR2VuZXJhdGVHZXRCaXQgYnV0IG9wZXJhdGVzIG9uIHRoZSBiaXQgZmllbGQgb24gYSBsb2NhbAorLy8gdmFyaWFibGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgcGFyc2luZyBjb25zdHJ1Y3RvciB0byByZWNvcmQgaWYgYSByZXBlYXRlZAorLy8gZmllbGQgaXMgbXV0YWJsZS4KKy8vIEV4YW1wbGU6ICIoKG11dGFibGVfYml0RmllbGQxXyAmIDB4MDQpID09IDB4MDQpIgorc3RyaW5nIEdlbmVyYXRlR2V0Qml0TXV0YWJsZUxvY2FsKGludCBiaXRJbmRleCk7CisKKy8vIERvZXMgdGhlIHNhbWUgYXMgR2VuZXJhdGVTZXRCaXQgYnV0IG9wZXJhdGVzIG9uIHRoZSBiaXQgZmllbGQgb24gYSBsb2NhbAorLy8gdmFyaWFibGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgcGFyc2luZyBjb25zdHJ1Y3RvciB0byByZWNvcmQgaWYgYSByZXBlYXRlZAorLy8gZmllbGQgaXMgbXV0YWJsZS4KKy8vIEV4YW1wbGU6ICJtdXRhYmxlX2JpdEZpZWxkMV8gPSAobXV0YWJsZV9iaXRGaWVsZDFfIHwgMHgwNCkiCitzdHJpbmcgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoaW50IGJpdEluZGV4KTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfSEVMUEVSU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzIyZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjCkBAIC0wLDAgKzEsMTQzNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgUHJpbnRGaWVsZENvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gUHJpbnQgdGhlIGZpZWxkJ3MgcHJvdG8tc3ludGF4IGRlZmluaXRpb24gYXMgYSBjb21tZW50LiAgV2UgZG9uJ3Qgd2FudCB0bworICAvLyBwcmludCBncm91cCBib2RpZXMgc28gd2UgY3V0IG9mZiBhZnRlciB0aGUgZmlyc3QgbGluZS4KKyAgc3RyaW5nIGRlZiA9IGZpZWxkLT5EZWJ1Z1N0cmluZygpOworICBwcmludGVyLT5QcmludCgiLy8gJGRlZiRcbiIsCisgICAgImRlZiIsIGRlZi5zdWJzdHIoMCwgZGVmLmZpbmRfZmlyc3Rfb2YoJ1xuJykpKTsKK30KKworc3RydWN0IEZpZWxkT3JkZXJpbmdCeU51bWJlciB7CisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYikgY29uc3QgeworICAgIHJldHVybiBhLT5udW1iZXIoKSA8IGItPm51bWJlcigpOworICB9Cit9OworCitzdHJ1Y3QgRXh0ZW5zaW9uUmFuZ2VPcmRlcmluZyB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogYSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEtPnN0YXJ0IDwgYi0+c3RhcnQ7CisgIH0KK307CisKKy8vIFNvcnQgdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gRGVzY3JpcHRvciBieSBudW1iZXIgaW50byBhIG5ld1tdJ2QgYXJyYXkKKy8vIGFuZCByZXR1cm4gaXQuCitjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBTb3J0RmllbGRzQnlOdW1iZXIoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBmaWVsZHMgPQorICAgIG5ldyBjb25zdCBGaWVsZERlc2NyaXB0b3IqW2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCldOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkc1tpXSA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICB9CisgIHNvcnQoZmllbGRzLCBmaWVsZHMgKyBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLAorICAgICAgIEZpZWxkT3JkZXJpbmdCeU51bWJlcigpKTsKKyAgcmV0dXJuIGZpZWxkczsKK30KKworLy8gR2V0IGFuIGlkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdHlwZSB3aXRoaW4gdGhlIGZpbGUuCisvLyBUaGlzIGlzIHVzZWQgdG8gZGVjbGFyZSBzdGF0aWMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdGhpcyB0eXBlIGF0IHRoZQorLy8gb3V0ZXJtb3N0IGZpbGUgc2NvcGUuCitzdHJpbmcgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiAic3RhdGljXyIgKyBTdHJpbmdSZXBsYWNlKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCAiLiIsICJfIiwgdHJ1ZSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSB0eXBlIGhhcyBhbnkgcmVxdWlyZWQgZmllbGRzLiAgSWYgaXQgZG9lc24ndCwKKy8vIHdlIGNhbiBvcHRpbWl6ZSBvdXQgY2FsbHMgdG8gaXRzIGlzSW5pdGlhbGl6ZWQoKSBtZXRob2QuCisvLworLy8gYWxyZWFkeV9zZWVuIGlzIHVzZWQgdG8gYXZvaWQgY2hlY2tpbmcgdGhlIHNhbWUgdHlwZSBtdWx0aXBsZSB0aW1lcworLy8gKGFuZCBhbHNvIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpb24pLgorc3RhdGljIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoCisgICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSwKKyAgICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbikgeworICBpZiAoYWxyZWFkeV9zZWVuLT5jb3VudCh0eXBlKSA+IDApIHsKKyAgICAvLyBUaGUgdHlwZSBpcyBhbHJlYWR5IGluIGNhY2hlLiAgVGhpcyBtZWFucyB0aGF0IGVpdGhlcjoKKyAgICAvLyBhLiBUaGUgdHlwZSBoYXMgbm8gcmVxdWlyZWQgZmllbGRzLgorICAgIC8vIGIuIFdlIGFyZSBpbiB0aGUgbWlkc3Qgb2YgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcywKKyAgICAvLyAgICBzb21ld2hlcmUgdXAgdGhlIHN0YWNrLiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHRoYXQgaWYgdGhlIHR5cGUKKyAgICAvLyAgICBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcywgdGhleSdsbCBiZSBmb3VuZCB3aGVuIHdlIHJldHVybiB0byBpdCwKKyAgICAvLyAgICBhbmQgdGhlIHdob2xlIGNhbGwgdG8gSGFzUmVxdWlyZWRGaWVsZHMoKSB3aWxsIHJldHVybiB0cnVlLgorICAgIC8vICAgIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpZiB0aGlzIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcworICAgIC8vICAgIGhlcmUuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGFscmVhZHlfc2Vlbi0+aW5zZXJ0KHR5cGUpOworCisgIC8vIElmIHRoZSB0eXBlIGhhcyBleHRlbnNpb25zLCBhbiBleHRlbnNpb24gd2l0aCBtZXNzYWdlIHR5cGUgY291bGQgY29udGFpbgorICAvLyByZXF1aXJlZCBmaWVsZHMsIHNvIHdlIGhhdmUgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgc3VjaCBhbgorICAvLyBleHRlbnNpb24gZXhpc3RzLgorICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCksIGFscmVhZHlfc2VlbikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSB7CisgIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBhbHJlYWR5X3NlZW47CisgIHJldHVybiBIYXNSZXF1aXJlZEZpZWxkcyh0eXBlLCAmYWxyZWFkeV9zZWVuKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZUdlbmVyYXRvcjo6TWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgIGZpZWxkX2dlbmVyYXRvcnNfKGRlc2NyaXB0b3IpIHsKK30KKworTWVzc2FnZUdlbmVyYXRvcjo6fk1lc3NhZ2VHZW5lcmF0b3IoKSB7fQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICAvLyBCZWNhdXNlIGRlc2NyaXB0b3IucHJvdG8gKGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvcykgaXMKKyAgICAvLyB1c2VkIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgZGVzY3JpcHRvcnMsIHdlIGhhdmUgYSB0cmlja3kgYm9vdHN0cmFwcGluZworICAgIC8vIHByb2JsZW0uICBUbyBoZWxwIGNvbnRyb2wgc3RhdGljIGluaXRpYWxpemF0aW9uIG9yZGVyLCB3ZSBtYWtlIHN1cmUgYWxsCisgICAgLy8gZGVzY3JpcHRvcnMgYW5kIG90aGVyIHN0YXRpYyBkYXRhIHRoYXQgZGVwZW5kcyBvbiB0aGVtIGFyZSBtZW1iZXJzIG9mCisgICAgLy8gdGhlIG91dGVybW9zdCBjbGFzcyBpbiB0aGUgZmlsZS4gIFRoaXMgd2F5LCB0aGV5IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4KKyAgICAvLyBhIGRldGVybWluaXN0aWMgb3JkZXIuCisKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siaWRlbnRpZmllciJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyk7CisgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpOworICAgIHZhcnNbImNsYXNzbmFtZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKTsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICAgIHZhcnNbInBhcmVudCJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcigKKyAgICAgICAgICBkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRvcl8tPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfbXVsdGlwbGVfZmlsZXMoKSkgeworICAgICAgLy8gV2UgY2FuIG9ubHkgbWFrZSB0aGVzZSBwYWNrYWdlLXByaXZhdGUgc2luY2UgdGhlIGNsYXNzZXMgdGhhdCB1c2UgdGhlbQorICAgICAgLy8gYXJlIGluIHNlcGFyYXRlIGZpbGVzLgorICAgICAgdmFyc1sicHJpdmF0ZSJdID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhcnNbInByaXZhdGUiXSA9ICJwcml2YXRlICI7CisgICAgfQorCisgICAgLy8gVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgdHlwZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIiRwcml2YXRlJHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3JcbiIKKyAgICAgICIgIGludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yO1xuIik7CisKKyAgICAvLyBBbmQgdGhlIEZpZWxkQWNjZXNzb3JUYWJsZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIiRwcml2YXRlJHN0YXRpY1xuIgorICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkZpZWxkQWNjZXNzb3JUYWJsZVxuIgorICAgICAgIiAgICBpbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlO1xuIik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzdGF0aWMgbWVtYmVycyBmb3IgYWxsIG5lc3RlZCB0eXBlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPworICAgIE1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKQorICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbImlkZW50aWZpZXIiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pOworICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKTsKKyAgICB2YXJzWyJjbGFzc25hbWUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yXyk7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7CisgICAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoCisgICAgICAgICAgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyB0eXBlLgorICAgIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yID1cbiIKKyAgICAgICAgIiAgZ2V0RGVzY3JpcHRvcigpLmdldE1lc3NhZ2VUeXBlcygpLmdldCgkaW5kZXgkKTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3IgPVxuIgorICAgICAgICAiICBpbnRlcm5hbF8kcGFyZW50JF9kZXNjcmlwdG9yLmdldE5lc3RlZFR5cGVzKCkuZ2V0KCRpbmRleCQpO1xuIik7CisgICAgfQorCisgICAgLy8gQW5kIHRoZSBGaWVsZEFjY2Vzc29yVGFibGUuCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJpbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlID0gbmV3XG4iCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlKFxuIgorICAgICAgIiAgICBpbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvcixcbiIKKyAgICAgICIgICAgbmV3IGphdmEubGFuZy5TdHJpbmdbXSB7ICIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJcIiRmaWVsZF9uYW1lJFwiLCAiLAorICAgICAgICAiZmllbGRfbmFtZSIsCisgICAgICAgICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3JfLT5maWVsZChpKSkpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIn0pO1xuIik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzdGF0aWMgbWVtYmVyIGluaXRpYWxpemVycyBmb3IgYWxsIG5lc3RlZCB0eXBlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPworICAgIE1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKQorICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMocHJpbnRlcik7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgaW50ZXJmYWNlICRjbGFzc25hbWUkT3JCdWlsZGVyIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuXG4iCisgICAgICAgICIgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPCRjbGFzc25hbWUkPiB7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlciBleHRlbmRzIFxuIgorICAgICAgICAiICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLlxuIgorICAgICAgICAiICAgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPCRjbGFzc25hbWUkPiB7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlclxuIgorICAgICAgICAiICAgIGV4dGVuZHMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgaW50ZXJmYWNlICRjbGFzc25hbWUkT3JCdWlsZGVyXG4iCisgICAgICAgICIgICAgZXh0ZW5kcyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICB9CisgIH0KKworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8tPmZpZWxkKGkpKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMocHJpbnRlcik7CisgICAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgYm9vbCBpc19vd25fZmlsZSA9CisgICAgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwgJiYKKyAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpOworCisgIFdyaXRlTWVzc2FnZURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworCisgIC8vIFRoZSBidWlsZGVyX3R5cGUgc3RvcmVzIHRoZSBzdXBlciB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZCBCdWlsZGVyIGNsYXNzLgorICBzdHJpbmcgYnVpbGRlcl90eXBlOworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljICRzdGF0aWMkIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRXh0ZW5kYWJsZU1lc3NhZ2U8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJD4gaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAorICAgICAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgICBidWlsZGVyX3R5cGUgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRXh0ZW5kYWJsZUJ1aWxkZXI8JDAsID8+IiwKKyAgICAgICAgICBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgJHN0YXRpYyQgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuRXh0ZW5kYWJsZU1lc3NhZ2U8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJD4gaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAorICAgICAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgICBidWlsZGVyX3R5cGUgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLkV4dGVuZGFibGVCdWlsZGVyPCQwLCA/PiIsCisgICAgICAgICAgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljICRzdGF0aWMkIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKKyAgICAgICAgIiAgICBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJzdGF0aWMiLCBpc19vd25fZmlsZSA/ICIiIDogInN0YXRpYyIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICAgIGJ1aWxkZXJfdHlwZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlcjw/PiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljICRzdGF0aWMkIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlXG4iCisgICAgICAgICIgICAgaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAorICAgICAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgICBidWlsZGVyX3R5cGUgPSAiY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5CdWlsZGVyIjsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIC8vIFVzaW5nIGJ1aWxkZXJfdHlwZSwgaW5zdGVhZCBvZiBCdWlsZGVyLCBwcmV2ZW50cyB0aGUgQnVpbGRlciBjbGFzcyBmcm9tCisgIC8vIGJlaW5nIGxvYWRlZCBpbnRvIFBlcm1HZW4gc3BhY2Ugd2hlbiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBjcmVhdGVkLgorICAvLyBUaGlzIG9wdGltaXplcyB0aGUgUGVybUdlbiBzcGFjZSB1c2FnZSBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdCBtb2RpZnkKKyAgLy8gbWVzc2FnZXMuCisgIHByaW50ZXItPlByaW50KAorICAgICIvLyBVc2UgJGNsYXNzbmFtZSQubmV3QnVpbGRlcigpIHRvIGNvbnN0cnVjdC5cbiIKKyAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJCgkYnVpbGRlcnR5cGUkIGJ1aWxkZXIpIHtcbiIKKyAgICAiICBzdXBlcihidWlsZGVyKTtcbiIKKyAgICAiJHNldF91bmtub3duX2ZpZWxkcyRcbiIKKyAgICAifVxuIiwKKyAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSwKKyAgICAiYnVpbGRlcnR5cGUiLCBidWlsZGVyX3R5cGUsCisgICAgInNldF91bmtub3duX2ZpZWxkcyIsIEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pCisgICAgICAgID8gIiAgdGhpcy51bmtub3duRmllbGRzID0gYnVpbGRlci5nZXRVbmtub3duRmllbGRzKCk7IiA6ICIiKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgLy8gVXNlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgZGVmYXVsdCBpbnN0YW5jZSwgd2hpY2ggY2Fubm90IGJlIGluaXRpYWxpemVkCisgICAgLy8gaW1tZWRpYXRlbHkgYmVjYXVzZSBpdCBtYXkgY3ljbGljYWxseSByZWZlciB0byBvdGhlciBkZWZhdWx0IGluc3RhbmNlcy4KKyAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJChib29sZWFuIG5vSW5pdCkgeyRzZXRfZGVmYXVsdF91bmtub3duX2ZpZWxkcyR9XG4iCisgICAgIlxuIgorICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJCBkZWZhdWx0SW5zdGFuY2U7XG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlKCkge1xuIgorICAgICIgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgorICAgICIgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpLAorICAgICJzZXRfZGVmYXVsdF91bmtub3duX2ZpZWxkcyIsIEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pCisgICAgICAgID8gIiB0aGlzLnVua25vd25GaWVsZHMgPSIKKyAgICAgICAgICAiIGNvbS5nb29nbGUucHJvdG9idWYuVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOyAiIDogIiIpOworCisgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHJpdmF0ZSBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLlVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzO1xuIgorICAgICAgICAiIgorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuVW5rbm93bkZpZWxkU2V0XG4iCisgICAgICAgICIgICAgZ2V0VW5rbm93bkZpZWxkcygpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHRoaXMudW5rbm93bkZpZWxkcztcbiIKKyAgICAgICAgIn1cbiIpOworICB9CisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgR2VuZXJhdGVQYXJzaW5nQ29uc3RydWN0b3IocHJpbnRlcik7CisgIH0KKworICBHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZVBhcnNlcihwcmludGVyKTsKKworICAvLyBOZXN0ZWQgdHlwZXMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEVudW1HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmVudW1fdHlwZShpKSkuR2VuZXJhdGUocHJpbnRlcik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKTsKKyAgICBtZXNzYWdlR2VuZXJhdG9yLkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworICAgIG1lc3NhZ2VHZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7CisgIH0KKworICAvLyBJbnRlZ2VycyBmb3IgYml0IGZpZWxkcy4KKyAgaW50IHRvdGFsQml0cyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHRvdGFsQml0cyArPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAuR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKKyAgfQorICBpbnQgdG90YWxJbnRzID0gKHRvdGFsQml0cyArIDMxKSAvIDMyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsSW50czsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoInByaXZhdGUgaW50ICRiaXRfZmllbGRfbmFtZSQ7XG4iLAorICAgICAgImJpdF9maWVsZF9uYW1lIiwgR2V0Qml0RmllbGROYW1lKGkpKTsKKyAgfQorCisgIC8vIEZpZWxkcworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOworICAgIHByaW50ZXItPlByaW50KCJwdWJsaWMgc3RhdGljIGZpbmFsIGludCAkY29uc3RhbnRfbmFtZSQgPSAkbnVtYmVyJDtcbiIsCisgICAgICAiY29uc3RhbnRfbmFtZSIsIEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3JfLT5maWVsZChpKSksCisgICAgICAibnVtYmVyIiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+ZmllbGQoaSktPm51bWJlcigpKSk7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2VuZXJhdGVNZW1iZXJzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgLy8gQ2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3RvciwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHRoZSBkZWZhdWx0IGluc3RhbmNlLAorICAvLyBpbiB3aGljaCBjYXNlIHRoaXMgaXMgY2FsbGVkIGJ5IHN0YXRpYyBpbml0IGNvZGUgbGF0ZXIgb24uCisgIHByaW50ZXItPlByaW50KCJwcml2YXRlIHZvaWQgaW5pdEZpZWxkcygpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKworICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQocHJpbnRlciwgTUVNT0laRSk7CisgICAgR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMocHJpbnRlcik7CisgIH0KKworICBpZiAoSGFzRXF1YWxzQW5kSGFzaENvZGUoZGVzY3JpcHRvcl8pKSB7CisgICAgR2VuZXJhdGVFcXVhbHNBbmRIYXNoQ29kZShwcmludGVyKTsKKyAgfQorCisgIEdlbmVyYXRlUGFyc2VGcm9tTWV0aG9kcyhwcmludGVyKTsKKyAgR2VuZXJhdGVCdWlsZGVyKHByaW50ZXIpOworCisgIC8vIENhcmVmdWxseSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGluc3RhbmNlIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBkb2Vzbid0CisgIC8vIGNvbmZsaWN0IHdpdGggb3RoZXIgaW5pdGlhbGl6YXRpb24uCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAic3RhdGljIHtcbiIKKyAgICAiICBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgJGNsYXNzbmFtZSQodHJ1ZSk7XG4iCisgICAgIiAgZGVmYXVsdEluc3RhbmNlLmluaXRGaWVsZHMoKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKKyAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSwKKyAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICAvLyBFeHRlbnNpb25zIG11c3QgYmUgZGVjbGFyZWQgYWZ0ZXIgdGhlIGRlZmF1bHRJbnN0YW5jZSBpcyBpbml0aWFsaXplZAorICAvLyBiZWNhdXNlIHRoZSBkZWZhdWx0SW5zdGFuY2UgaXMgdXNlZCBieSB0aGUgZXh0ZW5zaW9uIHRvIGxhemlseSByZXRyaWV2ZQorICAvLyB0aGUgb3V0ZXIgY2xhc3MncyBGaWxlRGVzY3JpcHRvci4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIEV4dGVuc2lvbkdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uKGkpKS5HZW5lcmF0ZShwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgc2NvcGVkX2FycmF5PGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IHNvcnRlZF9maWVsZHMoCisgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CisKKyAgdmVjdG9yPGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKj4gc29ydGVkX2V4dGVuc2lvbnM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyArK2kpIHsKKyAgICBzb3J0ZWRfZXh0ZW5zaW9ucy5wdXNoX2JhY2soZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZShpKSk7CisgIH0KKyAgc29ydChzb3J0ZWRfZXh0ZW5zaW9ucy5iZWdpbigpLCBzb3J0ZWRfZXh0ZW5zaW9ucy5lbmQoKSwKKyAgICAgICBFeHRlbnNpb25SYW5nZU9yZGVyaW5nKCkpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KVxuIgorICAgICIgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgLy8gd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIG1pZ2h0IGJlIGludm9rZWQgd2l0aG91dAorICAvLyBnZXRTZXJpYWxpemVkU2l6ZSgpIGV2ZXIgYmVpbmcgY2FsbGVkLCBidXQgd2UgbmVlZCB0aGUgbWVtb2l6ZWQKKyAgLy8gc2l6ZXMgaW4gY2FzZSB0aGlzIG1lc3NhZ2UgaGFzIHBhY2tlZCBmaWVsZHMuIFJhdGhlciB0aGFuIGVtaXQgY2hlY2tzIGZvcgorICAvLyBlYWNoIHBhY2tlZCBmaWVsZCwganVzdCBjYWxsIGdldFNlcmlhbGl6ZWRTaXplKCkgdXAgZnJvbnQgZm9yIGFsbCBtZXNzYWdlcy4KKyAgLy8gSW4gbW9zdCBjYXNlcywgZ2V0U2VyaWFsaXplZFNpemUoKSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbnl3YXkgYnkKKyAgLy8gb25lIG9mIHRoZSB3cmFwcGVyIHdyaXRlVG8oKSBtZXRob2RzLCBtYWtpbmcgdGhpcyBjYWxsIGNoZWFwLgorICBwcmludGVyLT5QcmludCgKKyAgICAiZ2V0U2VyaWFsaXplZFNpemUoKTtcbiIpOworCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkbGl0ZSRcbiIKKyAgICAgICAgIiAgLkV4dGVuZGFibGVNZXNzYWdlPCRjbGFzc25hbWUkPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID1cbiIKKyAgICAgICAgIiAgICBuZXdNZXNzYWdlU2V0RXh0ZW5zaW9uV3JpdGVyKCk7XG4iLAorICAgICAgICAibGl0ZSIsIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSA/ICIiIDogIkxpdGUiLAorICAgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJGxpdGUkXG4iCisgICAgICAgICIgIC5FeHRlbmRhYmxlTWVzc2FnZTwkY2xhc3NuYW1lJD4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9XG4iCisgICAgICAgICIgICAgbmV3RXh0ZW5zaW9uV3JpdGVyKCk7XG4iLAorICAgICAgICAibGl0ZSIsIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSA/ICIiIDogIkxpdGUiLAorICAgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgfQorICB9CisKKyAgLy8gTWVyZ2UgdGhlIGZpZWxkcyBhbmQgdGhlIGV4dGVuc2lvbiByYW5nZXMsIGJvdGggc29ydGVkIGJ5IGZpZWxkIG51bWJlci4KKyAgZm9yIChpbnQgaSA9IDAsIGogPSAwOworICAgICAgIGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSB8fCBqIDwgc29ydGVkX2V4dGVuc2lvbnMuc2l6ZSgpOworICAgICAgICkgeworICAgIGlmIChpID09IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKSB7CisgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKHByaW50ZXIsIHNvcnRlZF9leHRlbnNpb25zW2orK10pOworICAgIH0gZWxzZSBpZiAoaiA9PSBzb3J0ZWRfZXh0ZW5zaW9ucy5zaXplKCkpIHsKKyAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQocHJpbnRlciwgc29ydGVkX2ZpZWxkc1tpKytdKTsKKyAgICB9IGVsc2UgaWYgKHNvcnRlZF9maWVsZHNbaV0tPm51bWJlcigpIDwgc29ydGVkX2V4dGVuc2lvbnNbal0tPnN0YXJ0KSB7CisgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKHByaW50ZXIsIHNvcnRlZF9maWVsZHNbaSsrXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UocHJpbnRlciwgc29ydGVkX2V4dGVuc2lvbnNbaisrXSk7CisgICAgfQorICB9CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJnZXRVbmtub3duRmllbGRzKCkud3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiZ2V0VW5rbm93bkZpZWxkcygpLndyaXRlVG8ob3V0cHV0KTtcbiIpOworICAgIH0KKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTtcbiIKKyAgICAicHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHtcbiIKKyAgICAiICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7XG4iCisgICAgIiAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplO1xuIgorICAgICJcbiIKKyAgICAiICBzaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoc29ydGVkX2ZpZWxkc1tpXSkuR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUocHJpbnRlcik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAic2l6ZSArPSBleHRlbnNpb25zU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInNpemUgKz0gZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCk7XG4iKTsKKyAgICB9CisgIH0KKworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInNpemUgKz0gZ2V0VW5rbm93bkZpZWxkcygpLmdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0KCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJzaXplICs9IGdldFVua25vd25GaWVsZHMoKS5nZXRTZXJpYWxpemVkU2l6ZSgpO1xuIik7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTtcbiIKKyAgICAiICByZXR1cm4gc2l6ZTtcbiIKKyAgICAifVxuIgorICAgICJcbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDtcbiIKKyAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICJwcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCB3cml0ZVJlcGxhY2UoKVxuIgorICAgICIgICAgdGhyb3dzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gc3VwZXIud3JpdGVSZXBsYWNlKCk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2VGcm9tTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBOb3RlOiAgVGhlc2UgYXJlIHNlcGFyYXRlIGZyb20gR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoKQorICAvLyAgIGJlY2F1c2UgdGhleSBuZWVkIHRvIGJlIGdlbmVyYXRlZCBldmVuIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBvcHRpbWl6ZWQKKyAgLy8gICBmb3IgY29kZSBzaXplLgorICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgZGF0YSlcbiIKKyAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCisgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgZGF0YSxcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpXG4iCisgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICIgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGRhdGEpO1xuIgorICAgICJ9XG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICIgICAgYnl0ZVtdIGRhdGEsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCisgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgorICAgICJ9XG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQpXG4iCisgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oaW5wdXQpO1xuIgorICAgICJ9XG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICIgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dCxcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgorICAgICIgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZURlbGltaXRlZEZyb20oamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dClcbiIKKyAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZURlbGltaXRlZEZyb20oXG4iCisgICAgIiAgICBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0LFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAifVxuIgorICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRJbnB1dFN0cmVhbSBpbnB1dClcbiIKKyAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShpbnB1dCk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZCgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUocHJpbnRlcik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJleHRlbnNpb25Xcml0ZXIud3JpdGVVbnRpbCgkZW5kJCwgb3V0cHV0KTtcbiIsCisgICAgImVuZCIsIFNpbXBsZUl0b2EocmFuZ2UtPmVuZCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigpIHsgcmV0dXJuIEJ1aWxkZXIuY3JlYXRlKCk7IH1cbiIKKyAgICAicHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXdCdWlsZGVyKCk7IH1cbiIKKyAgICAicHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoJGNsYXNzbmFtZSQgcHJvdG90eXBlKSB7XG4iCisgICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20ocHJvdG90eXBlKTtcbiIKKyAgICAifVxuIgorICAgICJwdWJsaWMgQnVpbGRlciB0b0J1aWxkZXIoKSB7IHJldHVybiBuZXdCdWlsZGVyKHRoaXMpOyB9XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfKSkgeworICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHJvdGVjdGVkIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCkge1xuIgorICAgICAgIiAgQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIocGFyZW50KTtcbiIKKyAgICAgICIgIHJldHVybiBidWlsZGVyO1xuIgorICAgICAgIn1cbiIpOworICB9CisKKyAgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVCdWlsZGVyPFxuIgorICAgICAgICAiICAgICAgJGNsYXNzbmFtZSQsIEJ1aWxkZXI+IGltcGxlbWVudHMgJGNsYXNzbmFtZSRPckJ1aWxkZXIge1xuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5FeHRlbmRhYmxlQnVpbGRlcjxcbiIKKyAgICAgICAgIiAgICAgICRjbGFzc25hbWUkLCBCdWlsZGVyPiBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kc1xuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXI+XG4iCisgICAgICAgICAiICAgaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLkJ1aWxkZXI8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJCwgQnVpbGRlcj5cbiIKKyAgICAgICAgIiAgICBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgR2VuZXJhdGVEZXNjcmlwdG9yTWV0aG9kcyhwcmludGVyKTsKKyAgR2VuZXJhdGVDb21tb25CdWlsZGVyTWV0aG9kcyhwcmludGVyKTsKKworICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQocHJpbnRlciwgRE9OVF9NRU1PSVpFKTsKKyAgICBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nTWV0aG9kcyhwcmludGVyKTsKKyAgfQorCisgIC8vIEludGVnZXJzIGZvciBiaXQgZmllbGRzLgorICBpbnQgdG90YWxCaXRzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgdG90YWxCaXRzICs9IGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZXROdW1CaXRzRm9yQnVpbGRlcigpOworICB9CisgIGludCB0b3RhbEludHMgPSAodG90YWxCaXRzICsgMzEpIC8gMzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBpbnQgJGJpdF9maWVsZF9uYW1lJDtcbiIsCisgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8tPmZpZWxkKGkpKTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlQnVpbGRlck1lbWJlcnMocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChidWlsZGVyX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKKyAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCisgICAgICAgICIgICAgZ2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRmaWxlY2xhc3MkLmludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iLAorICAgICAgICAiZmlsZWNsYXNzIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAorICAgICAgICAiaWRlbnRpZmllciIsIFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJvdGVjdGVkIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5GaWVsZEFjY2Vzc29yVGFibGVcbiIKKyAgICAgICIgICAgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGZpbGVjbGFzcyQuaW50ZXJuYWxfJGlkZW50aWZpZXIkX2ZpZWxkQWNjZXNzb3JUYWJsZVxuIgorICAgICAgIiAgICAgIC5lbnN1cmVGaWVsZEFjY2Vzc29yc0luaXRpYWxpemVkKFxuIgorICAgICAgIiAgICAgICAgICAkY2xhc3NuYW1lJC5jbGFzcywgJGNsYXNzbmFtZSQuQnVpbGRlci5jbGFzcyk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pLAorICAgICAgImZpbGVjbGFzcyIsIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSwKKyAgICAgICJpZGVudGlmaWVyIiwgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXykpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUNvbW1vbkJ1aWxkZXJNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICIvLyBDb25zdHJ1Y3QgdXNpbmcgJGNsYXNzbmFtZSQubmV3QnVpbGRlcigpXG4iCisgICAgInByaXZhdGUgQnVpbGRlcigpIHtcbiIKKyAgICAiICBtYXliZUZvcmNlQnVpbGRlckluaXRpYWxpemF0aW9uKCk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJpdmF0ZSBCdWlsZGVyKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQpIHtcbiIKKyAgICAgICIgIHN1cGVyKHBhcmVudCk7XG4iCisgICAgICAiICBtYXliZUZvcmNlQnVpbGRlckluaXRpYWxpemF0aW9uKCk7XG4iCisgICAgICAifVxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgfQorCisKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInByaXZhdGUgdm9pZCBtYXliZUZvcmNlQnVpbGRlckluaXRpYWxpemF0aW9uKCkge1xuIgorICAgICAgIiAgaWYgKGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5hbHdheXNVc2VGaWVsZEJ1aWxkZXJzKSB7XG4iKTsKKworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAuR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUocHJpbnRlcik7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIHZvaWQgbWF5YmVGb3JjZUJ1aWxkZXJJbml0aWFsaXphdGlvbigpIHtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJwcml2YXRlIHN0YXRpYyBCdWlsZGVyIGNyZWF0ZSgpIHtcbiIKKyAgICAiICByZXR1cm4gbmV3IEJ1aWxkZXIoKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAicHVibGljIEJ1aWxkZXIgY2xlYXIoKSB7XG4iCisgICAgIiAgc3VwZXIuY2xlYXIoKTtcbiIsCisgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyBCdWlsZGVyIGNsb25lKCkge1xuIgorICAgICIgIHJldHVybiBjcmVhdGUoKS5tZXJnZUZyb20oYnVpbGRQYXJ0aWFsKCkpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCisgICAgICAiICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWxlY2xhc3MkLmludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiZmlsZWNsYXNzIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAorICAgICAgImlkZW50aWZpZXIiLCBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKSk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgorICAgICIgIHJldHVybiAkY2xhc3NuYW1lJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBidWlsZCgpIHtcbiIKKyAgICAiICAkY2xhc3NuYW1lJCByZXN1bHQgPSBidWlsZFBhcnRpYWwoKTtcbiIKKyAgICAiICBpZiAoIXJlc3VsdC5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAiICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKHJlc3VsdCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiByZXN1bHQ7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBidWlsZFBhcnRpYWwoKSB7XG4iCisgICAgIiAgJGNsYXNzbmFtZSQgcmVzdWx0ID0gbmV3ICRjbGFzc25hbWUkKHRoaXMpO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gTG9jYWwgdmFycyBmb3IgZnJvbSBhbmQgdG8gYml0IGZpZWxkcyB0byBhdm9pZCBhY2Nlc3NpbmcgdGhlIGJ1aWxkZXIgYW5kCisgIC8vIG1lc3NhZ2Ugb3ZlciBhbmQgb3ZlciBmb3IgdGhlc2UgZmllbGRzLiBTZWVtcyB0byBwcm92aWRlIGEgc2xpZ2h0CisgIC8vIHBlcmZvcmFtYW5jZSBpbXByb3ZlbWVudCBpbiBtaWNybyBiZW5jaG1hcmsgYW5kIHRoaXMgaXMgYWxzbyB3aGF0IHByb3RvMQorICAvLyBjb2RlIGRvZXMuCisgIGludCB0b3RhbEJ1aWxkZXJCaXRzID0gMDsKKyAgaW50IHRvdGFsTWVzc2FnZUJpdHMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZmllbGQgPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKTsKKyAgICB0b3RhbEJ1aWxkZXJCaXRzICs9IGZpZWxkLkdldE51bUJpdHNGb3JCdWlsZGVyKCk7CisgICAgdG90YWxNZXNzYWdlQml0cyArPSBmaWVsZC5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICB9CisgIGludCB0b3RhbEJ1aWxkZXJJbnRzID0gKHRvdGFsQnVpbGRlckJpdHMgKyAzMSkgLyAzMjsKKyAgaW50IHRvdGFsTWVzc2FnZUludHMgPSAodG90YWxNZXNzYWdlQml0cyArIDMxKSAvIDMyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsQnVpbGRlckludHM7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJpbnQgZnJvbV8kYml0X2ZpZWxkX25hbWUkID0gJGJpdF9maWVsZF9uYW1lJDtcbiIsCisgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxNZXNzYWdlSW50czsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImludCB0b18kYml0X2ZpZWxkX25hbWUkID0gMDtcbiIsCisgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisKKyAgLy8gT3V0cHV0IGdlbmVyYXRpb24gY29kZSBmb3IgZWFjaCBmaWVsZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2VuZXJhdGVCdWlsZGluZ0NvZGUocHJpbnRlcik7CisgIH0KKworICAvLyBDb3B5IHRoZSBiaXQgZmllbGQgcmVzdWx0cyB0byB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE1lc3NhZ2VJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicmVzdWx0LiRiaXRfZmllbGRfbmFtZSQgPSB0b18kYml0X2ZpZWxkX25hbWUkO1xuIiwKKyAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICIgIG9uQnVpbHQoKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgcmV0dXJuIHJlc3VsdDtcbiIKKyAgICAifVxuIgorICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gTWVyZ2VGcm9tKE1lc3NhZ2Ugb3RoZXIpIHJlcXVpcmVzIHRoZSBhYmlsaXR5IHRvIGRpc3Rpbmd1aXNoIHRoZSBvdGhlcgorICAgIC8vIG1lc3NhZ2VzIHR5cGUgYnkgaXRzIGRlc2NyaXB0b3IuCisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIG90aGVyKSB7XG4iCisgICAgICAgICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICRjbGFzc25hbWUkKSB7XG4iCisgICAgICAgICIgICAgcmV0dXJuIG1lcmdlRnJvbSgoJGNsYXNzbmFtZSQpb3RoZXIpO1xuIgorICAgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgICAiICAgIHN1cGVyLm1lcmdlRnJvbShvdGhlcik7XG4iCisgICAgICAgICIgICAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgkY2xhc3NuYW1lJCBvdGhlcikge1xuIgorICAgICAgLy8gT3B0aW1pemF0aW9uOiAgSWYgb3RoZXIgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2UsIHdlIGtub3cgbm9uZSBvZiBpdHMKKyAgICAgIC8vICAgZmllbGRzIGFyZSBzZXQgc28gd2UgY2FuIHNraXAgdGhlIG1lcmdlLgorICAgICAgIiAgaWYgKG90aGVyID09ICRjbGFzc25hbWUkLmdldERlZmF1bHRJbnN0YW5jZSgpKSByZXR1cm4gdGhpcztcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpLkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7CisgICAgfQorCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworCisgICAgLy8gaWYgbWVzc2FnZSB0eXBlIGhhcyBleHRlbnNpb25zCisgICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB0aGlzLm1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTtcbiIpOworICAgIH0KKworICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIHRoaXMubWVyZ2VVbmtub3duRmllbGRzKG90aGVyLmdldFVua25vd25GaWVsZHMoKSk7XG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0LFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgIiAgJGNsYXNzbmFtZSQgcGFyc2VkTWVzc2FnZSA9IG51bGw7XG4iCisgICAgIiAgdHJ5IHtcbiIKKyAgICAiICAgIHBhcnNlZE1lc3NhZ2UgPSBQQVJTRVIucGFyc2VQYXJ0aWFsRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgorICAgICIgIH0gY2F0Y2ggKGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHtcbiIKKyAgICAiICAgIHBhcnNlZE1lc3NhZ2UgPSAoJGNsYXNzbmFtZSQpIGUuZ2V0VW5maW5pc2hlZE1lc3NhZ2UoKTtcbiIKKyAgICAiICAgIHRocm93IGU7XG4iCisgICAgIiAgfSBmaW5hbGx5IHtcbiIKKyAgICAiICAgIGlmIChwYXJzZWRNZXNzYWdlICE9IG51bGwpIHtcbiIKKyAgICAiICAgICAgbWVyZ2VGcm9tKHBhcnNlZE1lc3NhZ2UpO1xuIgorICAgICIgICAgfVxuIgorICAgICIgIH1cbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIFVzZU1lbW9pemF0aW9uIHVzZU1lbW9pemF0aW9uKSB7CisgIGJvb2wgbWVtb2l6YXRpb24gPSB1c2VNZW1vaXphdGlvbiA9PSBNRU1PSVpFOworICBpZiAobWVtb2l6YXRpb24pIHsKKyAgICAvLyBNZW1vaXplcyB3aGV0aGVyIHRoZSBwcm90b2NvbCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgKGhhcyBhbGwKKyAgICAvLyByZXF1aXJlZCBmaWVsZHMpLiAtMSBtZWFucyBub3QgeWV0IGNvbXB1dGVkLiAwIG1lYW5zIGZhbHNlIGFuZCAxIG1lYW5zCisgICAgLy8gdHJ1ZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIGJ5dGUgbWVtb2l6ZWRJc0luaXRpYWxpemVkID0gLTE7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpZiAobWVtb2l6YXRpb24pIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJieXRlIGlzSW5pdGlhbGl6ZWQgPSBtZW1vaXplZElzSW5pdGlhbGl6ZWQ7XG4iCisgICAgICAiaWYgKGlzSW5pdGlhbGl6ZWQgIT0gLTEpIHJldHVybiBpc0luaXRpYWxpemVkID09IDE7XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4KKyAgLy8gVE9ETyhrZW50b24pOiAgV2UgY2FuIG9wdGltaXplIHRoaXMgd2hlbiB3ZSBzd2l0Y2ggdG8gcHV0dGluZyBhbGwgdGhlCisgIC8vICAgImhhcyIgZmllbGRzIGludG8gYSBzaW5nbGUgYml0ZmllbGQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKCFoYXMkbmFtZSQoKSkge1xuIgorICAgICAgICAiICAkbWVtb2l6ZSRcbiIKKyAgICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpLAorICAgICAgICAibWVtb2l6ZSIsIG1lbW9pemF0aW9uID8gIm1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7IiA6ICIiKTsKKyAgICB9CisgIH0KKworICAvLyBOb3cgY2hlY2sgdGhhdCBhbGwgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChHZXRKYXZhVHlwZShmaWVsZCkgPT0gSkFWQVRZUEVfTUVTU0FHRSAmJgorICAgICAgICBIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5sYWJlbCgpKSB7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVFVSVJFRDoKKyAgICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICJpZiAoIWdldCRuYW1lJCgpLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgorICAgICAgICAgICAgICIgICRtZW1vaXplJFxuIgorICAgICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICJ0eXBlIiwgQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSksCisgICAgICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShmaWVsZCksCisgICAgICAgICAgICAibWVtb2l6ZSIsIG1lbW9pemF0aW9uID8gIm1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7IiA6ICIiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMOgorICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIgorICAgICAgICAgICAgIiAgaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgICAgICIgICAgJG1lbW9pemUkXG4iCisgICAgICAgICAgICAiICAgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgInR5cGUiLCBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSwKKyAgICAgICAgICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGZpZWxkKSwKKyAgICAgICAgICAgICJtZW1vaXplIiwgbWVtb2l6YXRpb24gPyAibWVtb2l6ZWRJc0luaXRpYWxpemVkID0gMDsiIDogIiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQ6CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCBnZXQkbmFtZSRDb3VudCgpOyBpKyspIHtcbiIKKyAgICAgICAgICAgICIgIGlmICghZ2V0JG5hbWUkKGkpLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgorICAgICAgICAgICAgIiAgICAkbWVtb2l6ZSRcbiIKKyAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgICAidHlwZSIsIENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpLAorICAgICAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpLAorICAgICAgICAgICAgIm1lbW9pemUiLCBtZW1vaXphdGlvbiA/ICJtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwOyIgOiAiIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAoIWV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAiICAkbWVtb2l6ZSRcbiIKKyAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIm1lbW9pemUiLCBtZW1vaXphdGlvbiA/ICJtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwOyIgOiAiIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgaWYgKG1lbW9pemF0aW9uKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAxO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAifVxuIgorICAgICJcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVFcXVhbHNBbmRIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgamF2YS5sYW5nLk9iamVjdCBvYmopIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImlmIChvYmogPT0gdGhpcykge1xuIgorICAgICIgcmV0dXJuIHRydWU7XG4iCisgICAgIn1cbiIKKyAgICAiaWYgKCEob2JqIGluc3RhbmNlb2YgJGNsYXNzbmFtZSQpKSB7XG4iCisgICAgIiAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopO1xuIgorICAgICJ9XG4iCisgICAgIiRjbGFzc25hbWUkIG90aGVyID0gKCRjbGFzc25hbWUkKSBvYmo7XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoImJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTtcbiIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIChoYXMkbmFtZSQoKSA9PSBvdGhlci5oYXMkbmFtZSQoKSk7XG4iCisgICAgICAgICJpZiAoaGFzJG5hbWUkKCkpIHtcbiIsCisgICAgICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGZpZWxkKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICB9CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUVxdWFsc0NvZGUocHJpbnRlcik7CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9XG4iKTsKKyAgICB9CisgIH0KKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJlxuIgorICAgICAgIiAgICBnZXRVbmtub3duRmllbGRzKCkuZXF1YWxzKG90aGVyLmdldFVua25vd25GaWVsZHMoKSk7XG4iKTsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJyZXN1bHQgPSByZXN1bHQgJiZcbiIKKyAgICAgICAgIiAgICBnZXRFeHRlbnNpb25GaWVsZHMoKS5lcXVhbHMob3RoZXIuZ2V0RXh0ZW5zaW9uRmllbGRzKCkpO1xuIik7CisgICAgfQorICB9CisgIHByaW50ZXItPlByaW50KAorICAgICJyZXR1cm4gcmVzdWx0O1xuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIn1cbiIKKyAgICAiXG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAicHJpdmF0ZSBpbnQgbWVtb2l6ZWRIYXNoQ29kZSA9IDA7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAicHVibGljIGludCBoYXNoQ29kZSgpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImlmIChtZW1vaXplZEhhc2hDb2RlICE9IDApIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInJldHVybiBtZW1vaXplZEhhc2hDb2RlO1xuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIn1cbiIKKyAgICAiaW50IGhhc2ggPSA0MTtcbiIKKyAgICAiaGFzaCA9ICgxOSAqIGhhc2gpICsgZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5oYXNoQ29kZSgpO1xuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoaGFzJG5hbWUkKCkpIHtcbiIsCisgICAgICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGZpZWxkKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICB9CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUhhc2hDb2RlKHByaW50ZXIpOworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICB9CisgIH0KKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImhhc2ggPSBoYXNoRmllbGRzKGhhc2gsIGdldEV4dGVuc2lvbkZpZWxkcygpKTtcbiIpOworICAgIH0KKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAiaGFzaCA9ICgyOSAqIGhhc2gpICsgZ2V0VW5rbm93bkZpZWxkcygpLmhhc2hDb2RlKCk7XG4iCisgICAgIm1lbW9pemVkSGFzaENvZGUgPSBoYXNoO1xuIgorICAgICJyZXR1cm4gaGFzaDtcbiIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIEV4dGVuc2lvbkdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uKGkpKQorICAgICAgLkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIE1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKQorICAgICAgLkdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvbnN0cnVjdG9yKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBzb3J0ZWRfZmllbGRzKAorICAgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJChcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0LFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIEluaXRpYWxpemUgYWxsIGZpZWxkcyB0byBkZWZhdWx0LgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJpbml0RmllbGRzKCk7XG4iKTsKKworICAvLyBVc2UgYnVpbGRlciBiaXRzIHRvIHRyYWNrIG11dGFibGUgcmVwZWF0ZWQgZmllbGRzLgorICBpbnQgdG90YWxCdWlsZGVyQml0cyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBmaWVsZCA9IGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOworICAgIHRvdGFsQnVpbGRlckJpdHMgKz0gZmllbGQuR2V0TnVtQml0c0ZvckJ1aWxkZXIoKTsKKyAgfQorICBpbnQgdG90YWxCdWlsZGVySW50cyA9ICh0b3RhbEJ1aWxkZXJCaXRzICsgMzEpIC8gMzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxCdWlsZGVySW50czsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImludCBtdXRhYmxlXyRiaXRfZmllbGRfbmFtZSQgPSAwO1xuIiwKKyAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7CisgIH0KKworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPVxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgInRyeSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImJvb2xlYW4gZG9uZSA9IGZhbHNlO1xuIgorICAgICJ3aGlsZSAoIWRvbmUpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTtcbiIKKyAgICAic3dpdGNoICh0YWcpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiY2FzZSAwOlxuIiAgICAgICAgICAvLyB6ZXJvIHNpZ25hbHMgRU9GIC8gbGltaXQgcmVhY2hlZAorICAgICIgIGRvbmUgPSB0cnVlO1xuIgorICAgICIgIGJyZWFrO1xuIgorICAgICJkZWZhdWx0OiB7XG4iCisgICAgIiAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwkdW5rbm93bl9maWVsZHMkXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeSwgdGFnKSkge1xuIgorICAgICIgICAgZG9uZSA9IHRydWU7XG4iICAvLyBpdCdzIGFuIGVuZGdyb3VwIHRhZworICAgICIgIH1cbiIKKyAgICAiICBicmVhaztcbiIKKyAgICAifVxuIiwKKyAgICAidW5rbm93bl9maWVsZHMiLCBIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKQorICAgICAgICA/ICIgdW5rbm93bkZpZWxkcywiIDogIiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBzb3J0ZWRfZmllbGRzW2ldOworICAgIHVpbnQzMiB0YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksCisgICAgICBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkVHlwZShmaWVsZC0+dHlwZSgpKSk7CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjYXNlICR0YWckOiB7XG4iLAorICAgICAgInRhZyIsIFNpbXBsZUl0b2EodGFnKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlUGFyc2luZ0NvZGUocHJpbnRlcik7CisKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBicmVhaztcbiIKKyAgICAgICJ9XG4iKTsKKworICAgIGlmIChmaWVsZC0+aXNfcGFja2FibGUoKSkgeworICAgICAgLy8gVG8gbWFrZSBwYWNrZWQgPSB0cnVlIHdpcmUgY29tcGF0aWJsZSwgd2UgZ2VuZXJhdGUgcGFyc2luZyBjb2RlIGZyb20gYQorICAgICAgLy8gcGFja2VkIHZlcnNpb24gb2YgdGhpcyBmaWVsZCByZWdhcmRsZXNzIG9mIGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkuCisgICAgICB1aW50MzIgcGFja2VkX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjYXNlICR0YWckOiB7XG4iLAorICAgICAgICAidGFnIiwgU2ltcGxlSXRvYShwYWNrZWRfdGFnKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChwcmludGVyKTsKKworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIGJyZWFrO1xuIgorICAgICAgICAifVxuIik7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgfVxuIiAgICAgLy8gc3dpdGNoICh0YWcpCisgICAgICAifVxuIik7ICAgICAvLyB3aGlsZSAoIWRvbmUpCisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9IGNhdGNoIChjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7XG4iCisgICAgICAiICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKHRoaXMpO1xuIgorICAgICAgIn0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkge1xuIgorICAgICAgIiAgdGhyb3cgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKFxuIgorICAgICAgIiAgICAgIGUuZ2V0TWVzc2FnZSgpKS5zZXRVbmZpbmlzaGVkTWVzc2FnZSh0aGlzKTtcbiIKKyAgICAgICJ9IGZpbmFsbHkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIE1ha2UgcmVwZWF0ZWQgZmllbGQgbGlzdCBpbW11dGFibGUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBzb3J0ZWRfZmllbGRzW2ldOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUocHJpbnRlcik7CisgIH0KKworICAvLyBNYWtlIHVua25vd24gZmllbGRzIGltbXV0YWJsZS4KKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ0aGlzLnVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLmJ1aWxkKCk7XG4iKTsKKyAgfQorCisgIC8vIE1ha2UgZXh0ZW5zaW9ucyBpbW11dGFibGUuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIm1ha2VFeHRlbnNpb25zSW1tdXRhYmxlKCk7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICB9XG4iICAgICAvLyBmaW5hbGx5CisgICAgICAifVxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gUEFSU0VSID1cbiIKKyAgICAgICIgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RQYXJzZXI8JGNsYXNzbmFtZSQ+KCkge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBwYXJzZVBhcnRpYWxGcm9tKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIHJldHVybiBuZXcgJGNsYXNzbmFtZSQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXaGVuIHBhcnNpbmcgY29uc3RydWN0b3IgaXNuJ3QgZ2VuZXJhdGVkLCB1c2UgYnVpbGRlciB0byBwYXJzZSBtZXNzYWdlcy4KKyAgICAvLyBOb3RlLCB3aWxsIGZhbGxiYWNrIHRvIHVzZSByZWZsZWN0aW9uIGJhc2VkIG1lcmdlRmllbGRGcm9tKCkgaW4KKyAgICAvLyBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlci4KKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIkJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTtcbiIKKyAgICAgICAgInRyeSB7XG4iCisgICAgICAgICIgIGJ1aWxkZXIubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAgICJ9IGNhdGNoIChjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7XG4iCisgICAgICAgICIgIHRocm93IGUuc2V0VW5maW5pc2hlZE1lc3NhZ2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKSk7XG4iCisgICAgICAgICJ9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHtcbiIKKyAgICAgICAgIiAgdGhyb3cgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKFxuIgorICAgICAgICAiICAgICAgZS5nZXRNZXNzYWdlKCkpLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAicmV0dXJuIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7XG4iKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9O1xuIgorICAgICAgIlxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gZ2V0UGFyc2VyRm9yVHlwZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBQQVJTRVI7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMGYwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaApAQCAtMCwwICsxLDExMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIE1lc3NhZ2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfk1lc3NhZ2VHZW5lcmF0b3IoKTsKKworICAvLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBoYXZlIHRvIGJlIGRlY2xhcmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIGZpbGUKKyAgLy8gc28gdGhhdCB3ZSBjYW4gY29udHJvbCBpbml0aWFsaXphdGlvbiBvcmRlciwgd2hpY2ggaXMgaW1wb3J0YW50IGZvcgorICAvLyBEZXNjcmlwdG9yUHJvdG8gYm9vdHN0cmFwcGluZyB0byB3b3JrLgorICB2b2lkIEdlbmVyYXRlU3RhdGljVmFyaWFibGVzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBPdXRwdXQgY29kZSB3aGljaCBpbml0aWFsaXplcyB0aGUgc3RhdGljIHZhcmlhYmxlcyBnZW5lcmF0ZWQgYnkKKyAgLy8gR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoKS4KKyAgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3MgaXRzZWxmLgorICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZXMgdGhlIGJhc2UgaW50ZXJmYWNlIHRoYXQgYm90aCB0aGUgY2xhc3MgYW5kIGl0cyBidWlsZGVyIGltcGxlbWVudAorICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBjb2RlIHRvIHJlZ2lzdGVyIGFsbCBjb250YWluZWQgZXh0ZW5zaW9ucyB3aXRoIGFuCisgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5LgorICB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBlbnVtIFVzZU1lbW9pemF0aW9uIHsKKyAgICBNRU1PSVpFLAorICAgIERPTlRfTUVNT0laRQorICB9OworCisgIHZvaWQgR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlUGFyc2VGcm9tTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlKTsKKworICB2b2lkIEdlbmVyYXRlQnVpbGRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVDb21tb25CdWlsZGVyTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9yTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgIFVzZU1lbW9pemF0aW9uIHVzZU1lbW9pemF0aW9uKTsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICB2b2lkIEdlbmVyYXRlUGFyc2VyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb25zdHJ1Y3Rvcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIEZpZWxkR2VuZXJhdG9yTWFwIGZpZWxkX2dlbmVyYXRvcnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiMjg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYwpAQCAtMCwwICsxLDk3NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworbmFtZXNwYWNlIHsKKworLy8gVE9ETyhrZW50b24pOiAgRmFjdG9yIG91dCBhICJTZXRDb21tb25GaWVsZFZhcmlhYmxlcygpIiB0byBnZXQgcmlkIG9mCisvLyAgIHJlcGVhdCBjb2RlIGJldHdlZW4gdGhpcyBhbmQgdGhlIG90aGVyIGZpZWxkIHR5cGVzLgordm9pZCBTZXRNZXNzYWdlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7CisgICgqdmFyaWFibGVzKVsibmFtZSJdID0KKyAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9CisgICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJncm91cF9vcl9tZXNzYWdlIl0gPQorICAgIChHZXRUeXBlKGRlc2NyaXB0b3IpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgPworICAgICJHcm91cCIgOiAiTWVzc2FnZSI7CisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0KKyAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKSA/ICJvbkNoYW5nZWQoKTsiIDogIiI7CisKKyAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2VzIGFuZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB0aGUgaGFzRmllbGQgYml0LgorICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgLy8gRm9yIHJlcGF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgorICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAvLyBGb3IgcmVwZWF0ZWQgZmllbGRzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZQorICAvLyBpbiB0aGUgcGFyc2luZyBjb25zdHJ1Y3Rvci4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCkKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAorICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSB7CisgIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitNZXNzYWdlRmllbGRHZW5lcmF0b3I6On5NZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRPRE8oam9ucCk6IEluIHRoZSBmdXR1cmUsIGNvbnNpZGVyIGhhdmluZyBhIG1ldGhvZCBzcGVjaWZpYyB0byB0aGUKKyAgLy8gaW50ZXJmYWNlIHNvIHRoYXQgYnVpbGRlcnMgY2FuIGNob29zZSBkeW5hbWljYWxseSB0byBlaXRoZXIgcmV0dXJuIGEKKyAgLy8gbWVzc2FnZSBvciBhIG5lc3RlZCBidWlsZGVyLCBzbyB0aGF0IGFza2luZyBmb3IgdGhlIGludGVyZmFjZSBkb2Vzbid0CisgIC8vIGNhdXNlIGEgbWVzc2FnZSB0byBldmVyIGJlIGJ1aWx0LgorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworCisgIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKTtcbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlICR0eXBlJCAkbmFtZSRfO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIpOworCisgIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCisgICAgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSkgY29uc3QgeworICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIpOworICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgcmVndWxhcl9jYXNlKTsKKyAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICBwcmludGVyLT5QcmludCgifSBlbHNlIHtcbiIpOworICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgbmVzdGVkX2J1aWxkZXJfY2FzZSk7CisgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgfSBlbHNlIHsKKyAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgcmVndWxhcl9jYXNlKTsKKyAgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsCisgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCisgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBtZXRob2RfcHJvdG90eXBlKTsKKyAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLCByZWd1bGFyX2Nhc2UsIG5lc3RlZF9idWlsZGVyX2Nhc2UpOworICBpZiAodHJhaWxpbmdfY29kZSAhPSBOVUxMKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgdHJhaWxpbmdfY29kZSk7CisgIH0KKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCisgIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KKyAgLy8gZGVtYW5kIGFuZCB0aGVuIGZvcmV2ZXIgZGVsZWdhdGVzIHRvIGl0IGFmdGVyIGNyZWF0aW9uLgorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgLy8gVXNlZCB3aGVuIHRoZSBidWlsZGVyIGlzIG51bGwuCisgICAgInByaXZhdGUgJHR5cGUkICRuYW1lJF8gPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iKTsKKworICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAvLyBJZiB0aGlzIGJ1aWxkZXIgaXMgbm9uLW51bGwsIGl0IGlzIHVzZWQgYW5kIHRoZSBvdGhlciBmaWVsZHMgYXJlCisgICAgICAvLyBpZ25vcmVkLgorICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXI8XG4iCisgICAgICAiICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4gJG5hbWUkQnVpbGRlcl87IgorICAgICAgIlxuIik7CisgIH0KKworICAvLyBUaGUgY29tbWVudHMgYWJvdmUgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGJhc2VkIG9uIGEgaHlwb3RoZXRpY2FsCisgIC8vIGZpZWxkIG9mIHR5cGUgIkZpZWxkIiBjYWxsZWQgIkZpZWxkIi4KKworICAvLyBib29sZWFuIGhhc0ZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgIn1cbiIpOworCisgIC8vIEZpZWxkIGdldEZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSIsCisKKyAgICAicmV0dXJuICRuYW1lJF87XG4iLAorCisgICAgInJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlKCk7XG4iLAorCisgICAgTlVMTCk7CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkiLAorCisgICAgImlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgIiAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgIn1cbiIKKyAgICAiJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZSh2YWx1ZSk7XG4iLAorCisgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIHNldEZpZWxkKEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICAkdHlwZSQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIiwKKworICAgICIkbmFtZSRfID0gYnVpbGRlckZvclZhbHVlLmJ1aWxkKCk7XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIsCisKKyAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgbWVyZ2VGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgbWVyZ2UkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSIsCisKKyAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJCAmJlxuIgorICAgICIgICAgJG5hbWUkXyAhPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHtcbiIKKyAgICAiICAkbmFtZSRfID1cbiIKKyAgICAiICAgICR0eXBlJC5uZXdCdWlsZGVyKCRuYW1lJF8pLm1lcmdlRnJvbSh2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7XG4iCisgICAgIn0gZWxzZSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICJ9XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5tZXJnZUZyb20odmFsdWUpO1xuIiwKKworICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gRmllbGQuQnVpbGRlciBjbGVhckZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSIsCisKKyAgICAiJG5hbWUkXyA9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLmNsZWFyKCk7XG4iLAorCisgICAgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKCkge1xuIgorICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcigpO1xuIgorICAgICAgIn1cbiIpOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlcigpIHtcbiIKKyAgICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyAhPSBudWxsKSB7XG4iCisgICAgICAiICAgIHJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlT3JCdWlsZGVyKCk7XG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgorICAgICAgIiAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+IFxuIgorICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKSB7XG4iCisgICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgorICAgICAgIiAgICAkbmFtZSRCdWlsZGVyXyA9IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLlNpbmdsZUZpZWxkQnVpbGRlcjxcbiIKKyAgICAgICIgICAgICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4oXG4iCisgICAgICAiICAgICAgICAgICAgJG5hbWUkXyxcbiIKKyAgICAgICIgICAgICAgICAgICBnZXRQYXJlbnRGb3JDaGlsZHJlbigpLFxuIgorICAgICAgIiAgICAgICAgICAgIGlzQ2xlYW4oKSk7XG4iCisgICAgICAiICAgICRuYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKTtcbiIpOworfQorCisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKKyAgICAiJG5hbWUkXyA9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKKyAgICAiICBtZXJnZSRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIgorICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAgICJ9XG4iKTsKKworICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKKyAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIiwKKworICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJEJ1aWxkZXJfLmJ1aWxkKCk7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkdHlwZSQuQnVpbGRlciBzdWJCdWlsZGVyID0gbnVsbDtcbiIKKyAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJCkge1xuIgorICAgICIgIHN1YkJ1aWxkZXIgPSAkbmFtZSRfLnRvQnVpbGRlcigpO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoR2V0VHlwZShkZXNjcmlwdG9yXykgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkbmFtZSRfID0gaW5wdXQucmVhZEdyb3VwKCRudW1iZXIkLCAkdHlwZSQuUEFSU0VSLFxuIgorICAgICAgIiAgICBleHRlbnNpb25SZWdpc3RyeSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRuYW1lJF8gPSBpbnB1dC5yZWFkTWVzc2FnZSgkdHlwZSQuUEFSU0VSLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChzdWJCdWlsZGVyICE9IG51bGwpIHtcbiIKKyAgICAiICBzdWJCdWlsZGVyLm1lcmdlRnJvbSgkbmFtZSRfKTtcbiIKKyAgICAiICAkbmFtZSRfID0gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTtcbiIKKyAgICAifVxuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBub29wIGZvciBtZXNzYWdlcy4KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkKSB7XG4iCisgICAgIiAgb3V0cHV0LndyaXRlJGdyb3VwX29yX21lc3NhZ2UkKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlJGdyb3VwX29yX21lc3NhZ2UkU2l6ZSgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpXG4iCisgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkuaGFzaENvZGUoKTtcbiIpOworfQorCitzdHJpbmcgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCkKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAorICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSB7CisgIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUT0RPKGpvbnApOiBJbiB0aGUgZnV0dXJlLCBjb25zaWRlciBoYXZpbmcgbWV0aG9kcyBzcGVjaWZpYyB0byB0aGUKKyAgLy8gaW50ZXJmYWNlIHNvIHRoYXQgYnVpbGRlcnMgY2FuIGNob29zZSBkeW5hbWljYWxseSB0byBlaXRoZXIgcmV0dXJuIGEKKyAgLy8gbWVzc2FnZSBvciBhIG5lc3RlZCBidWlsZGVyLCBzbyB0aGF0IGFza2luZyBmb3IgdGhlIGludGVyZmFjZSBkb2Vzbid0CisgIC8vIGNhdXNlIGEgbWVzc2FnZSB0byBldmVyIGJlIGJ1aWx0LgorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IFxuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyTGlzdCgpO1xuIik7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoXG4iCisgICAgICAiICAgIGludCBpbmRleCk7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXztcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JHR5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyAkdHlwZSRPckJ1aWxkZXI+IFxuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyTGlzdCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKFxuIgorICAgICIgICAgaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIik7CisKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKKyAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlKSBjb25zdCB7CisgIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIik7CisgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCByZWd1bGFyX2Nhc2UpOworICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgIHByaW50ZXItPlByaW50KCJ9IGVsc2Uge1xuIik7CisgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBuZXN0ZWRfYnVpbGRlcl9jYXNlKTsKKyAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgICB9IGVsc2UgeworICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCByZWd1bGFyX2Nhc2UpOworICAgfQorfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLAorICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKKyAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlLAorICAgIGNvbnN0IGNoYXIqIHRyYWlsaW5nX2NvZGUpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgbWV0aG9kX3Byb3RvdHlwZSk7CisgIHByaW50ZXItPlByaW50KCIge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwgcmVndWxhcl9jYXNlLCBuZXN0ZWRfYnVpbGRlcl9jYXNlKTsKKyAgaWYgKHRyYWlsaW5nX2NvZGUgIT0gTlVMTCkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHRyYWlsaW5nX2NvZGUpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCisgIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KKyAgLy8gZGVtYW5kIGFuZCB0aGVuIGZvcmV2ZXIgZGVsZWdhdGVzIHRvIGl0IGFmdGVyIGNyZWF0aW9uLgorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgLy8gVXNlZCB3aGVuIHRoZSBidWlsZGVyIGlzIG51bGwuCisgICAgLy8gT25lIGZpZWxkIGlzIHRoZSBsaXN0IGFuZCB0aGUgb3RoZXIgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKKyAgICAvLyBsaXN0IGlzIGltbXV0YWJsZS4gSWYgaXQncyBpbW11dGFibGUsIHRoZSBpbnZhcmlhbnQgaXMgdGhhdCBpdCBtdXN0CisgICAgLy8gZWl0aGVyIGFuIGluc3RhbmNlIG9mIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIG9yIGl0J3MgYW4gQXJyYXlMaXN0CisgICAgLy8gd3JhcHBlZCBpbiBhIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKSB3cmFwcGVyIGFuZCBub2JvZHkgZWxzZSBoYXMKKyAgICAvLyBhIHJlZmVyZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIEFycmF5TGlzdC4gVGhpcyBpbnZhcmlhbnQgYWxsb3dzIHVzIHRvCisgICAgLy8gc2hhcmUgaW5zdGFuY2VzIG9mIGxpc3RzIGJldHdlZW4gcHJvdG9jb2wgYnVmZmVycyBhdm9pZGluZyBleHBlbnNpdmUKKyAgICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKKyAgICAvLyBqdXN0IHRoYXQgdGhlIGxpc3QgY2Fubm90IGJlIG1vZGlmaWVkIHZpYSB0aGUgcmVmZXJlbmNlIGJ1dCB0aGF0IHRoZQorICAgIC8vIGxpc3QgY2FuIG5ldmVyIGJlIG1vZGlmaWVkLgorICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXyA9XG4iCisgICAgIiAgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorCisgICAgInByaXZhdGUgdm9pZCBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKSB7XG4iCisgICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCisgICAgIiAgICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8JHR5cGUkPigkbmFtZSRfKTtcbiIKKyAgICAiICAgICRzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgIH1cbiIKKyAgICAifVxuIgorICAgICJcbiIpOworCisgIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgIC8vIElmIHRoaXMgYnVpbGRlciBpcyBub24tbnVsbCwgaXQgaXMgdXNlZCBhbmQgdGhlIG90aGVyIGZpZWxkcyBhcmUKKyAgICAgIC8vIGlnbm9yZWQuCisgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyPFxuIgorICAgICAgIiAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+ICRuYW1lJEJ1aWxkZXJfO1xuIgorICAgICAgIlxuIik7CisgIH0KKworICAvLyBUaGUgY29tbWVudHMgYWJvdmUgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGJhc2VkIG9uIGEgaHlwb3RoZXRpY2FsCisgIC8vIHJlcGVhdGVkIGZpZWxkIG9mIHR5cGUgIkZpZWxkIiBjYWxsZWQgIlJlcGVhdGVkRmllbGQiLgorCisgIC8vIExpc3Q8RmllbGQ+IGdldFJlcGVhdGVkRmllbGRMaXN0KCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIiwKKworICAgICJyZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iLAorICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZUxpc3QoKTtcbiIsCisKKyAgICBOVUxMKTsKKworICAvLyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIiwKKworICAgICJyZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iLAorICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0Q291bnQoKTtcbiIsCisKKyAgICBOVUxMKTsKKworICAvLyBGaWVsZCBnZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSIsCisKKyAgICAicmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIsCisKKyAgICAicmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2UoaW5kZXgpO1xuIiwKKworICAgIE5VTEwpOworCisgIC8vIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkiLAorICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UoaW5kZXgsIHZhbHVlKTtcbiIsCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGludCBpbmRleCwgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCisKKyAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiRuYW1lJF8uc2V0KGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAorCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSIsCisKKyAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAiICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAifVxuIgorICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiJG5hbWUkXy5hZGQodmFsdWUpO1xuIgorCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5hZGRNZXNzYWdlKHZhbHVlKTtcbiIsCisKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoaW50IGluZGV4LCBGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIiwKKworICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLmFkZChpbmRleCwgdmFsdWUpO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uYWRkTWVzc2FnZShpbmRleCwgdmFsdWUpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCisKKyAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiRuYW1lJF8uYWRkKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLmFkZE1lc3NhZ2UoYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAorCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLmFkZChpbmRleCwgYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uYWRkTWVzc2FnZShpbmRleCwgYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkQWxsUmVwZWF0ZWRGaWVsZChJdGVyYWJsZTxGaWVsZD4gdmFsdWVzKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICR0eXBlJD4gdmFsdWVzKSIsCisKKyAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgInN1cGVyLmFkZEFsbCh2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uYWRkQWxsTWVzc2FnZXModmFsdWVzKTtcbiIsCisKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBCdWlsZGVyIGNsZWFyQWxsUmVwZWF0ZWRGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkiLAorCisgICAgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iCisgICAgIiRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLmNsZWFyKCk7XG4iLAorCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gQnVpbGRlciByZW1vdmVSZXBlYXRlZEZpZWxkKGludCBpbmRleCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgcmVtb3ZlJGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkiLAorCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLnJlbW92ZShpbmRleCk7XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5yZW1vdmUoaW5kZXgpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKFxuIgorICAgICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5nZXRCdWlsZGVyKGluZGV4KTtcbiIKKyAgICAgICJ9XG4iKTsKKworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoXG4iCisgICAgICAiICAgIGludCBpbmRleCkge1xuIgorICAgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIKKyAgICAgICIgICAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTsiCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlcihpbmRleCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIik7CisKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlckxpc3QoKSB7XG4iCisgICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCkge1xuIgorICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlckxpc3QoKTtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKKworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJC5CdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXIoKSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuYWRkQnVpbGRlcihcbiIKKyAgICAgICIgICAgICAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIgorICAgICAgIn1cbiIpOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJC5CdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXIoXG4iCisgICAgICAiICAgIGludCBpbmRleCkge1xuIgorICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmFkZEJ1aWxkZXIoXG4iCisgICAgICAiICAgICAgaW5kZXgsICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7XG4iCisgICAgICAifVxuIik7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JHR5cGUkLkJ1aWxkZXI+IFxuIgorICAgICAgIiAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlckxpc3QoKSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlckxpc3QoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyPFxuIgorICAgICAgIiAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+IFxuIgorICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKSB7XG4iCisgICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgorICAgICAgIiAgICAkbmFtZSRCdWlsZGVyXyA9IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyPFxuIgorICAgICAgIiAgICAgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPihcbiIKKyAgICAgICIgICAgICAgICAgICAkbmFtZSRfLFxuIgorICAgICAgIiAgICAgICAgICAgICRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQsXG4iCisgICAgICAiICAgICAgICAgICAgZ2V0UGFyZW50Rm9yQ2hpbGRyZW4oKSxcbiIKKyAgICAgICIgICAgICAgICAgICBpc0NsZWFuKCkpO1xuIgorICAgICAgIiAgICAkbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRCdWlsZGVyXztcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAorICAgICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLmNsZWFyKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnMgKG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlKToKKyAgLy8gICAxLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBlbXB0eSwgdGhlcmUncyBub3RoaW5nIHRvIGRvLiBUaGlzIGVuc3VyZXMgd2UKKyAgLy8gICAgICBkb24ndCBhbGxvY2F0ZSBhIG5ldyBhcnJheSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW1tdXRhYmxlIG9uZS4KKyAgLy8gICAyLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBub24tZW1wdHkgYW5kIG91ciBjdXJyZW50IGxpc3QgaXMgZW1wdHksIHdlIGNhbgorICAvLyAgICAgIHJldXNlIHRoZSBvdGhlciBsaXN0IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW1tdXRhYmxlLgorICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKKyAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgIGlmICgkbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICAgJG5hbWUkXy5hZGRBbGwob3RoZXIuJG5hbWUkXyk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICJ9XG4iLAorCisgICAgImlmICghb3RoZXIuJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8uaXNFbXB0eSgpKSB7XG4iCisgICAgIiAgICAkbmFtZSRCdWlsZGVyXy5kaXNwb3NlKCk7XG4iCisgICAgIiAgICAkbmFtZSRCdWlsZGVyXyA9IG51bGw7XG4iCisgICAgIiAgICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKKyAgICAiICAgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAgICRuYW1lJEJ1aWxkZXJfID0gXG4iCisgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5hbHdheXNVc2VGaWVsZEJ1aWxkZXJzID9cbiIKKyAgICAiICAgICAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkgOiBudWxsO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICAkbmFtZSRCdWlsZGVyXy5hZGRBbGxNZXNzYWdlcyhvdGhlci4kbmFtZSRfKTtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IChub24tbmVzdGVkIGJ1aWxkZXIgY2FzZSkgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaGFzIGFuCisgIC8vIGltbXV0YWJsZSBsaXN0LiBJZiBvdXIgbGlzdCBpcyBpbW11dGFibGUsIHdlIGNhbiBqdXN0IHJldXNlIGl0LiBJZiBub3QsCisgIC8vIHdlIG1ha2UgaXQgaW1tdXRhYmxlLgorICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKKyAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICJ9XG4iCisgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIsCisKKyAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRCdWlsZGVyXy5idWlsZCgpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoISRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkdHlwZSQ+KCk7XG4iCisgICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoR2V0VHlwZShkZXNjcmlwdG9yXykgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkbmFtZSRfLmFkZChpbnB1dC5yZWFkR3JvdXAoJG51bWJlciQsICR0eXBlJC5QQVJTRVIsXG4iCisgICAgICAiICAgIGV4dGVuc2lvblJlZ2lzdHJ5KSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRuYW1lJF8uYWRkKGlucHV0LnJlYWRNZXNzYWdlKCR0eXBlJC5QQVJTRVIsIGV4dGVuc2lvblJlZ2lzdHJ5KSk7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgIiAgb3V0cHV0LndyaXRlJGdyb3VwX29yX21lc3NhZ2UkKCRudW1iZXIkLCAkbmFtZSRfLmdldChpKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgorICAgICIgICAgLmNvbXB1dGUkZ3JvdXBfb3JfbWVzc2FnZSRTaXplKCRudW1iZXIkLCAkbmFtZSRfLmdldChpKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCisgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgorICAgICIgIGhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAiICBoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuaGFzaENvZGUoKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3N0cmluZyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzgwNzhhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgfk1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7CisKKyAgdm9pZCBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgY29uc3QgY2hhciogbWV0aG9kX3Byb3RvdHlwZSwgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgICAgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSwKKyAgICAgIGNvbnN0IGNoYXIqIHRyYWlsaW5nX2NvZGUpIGNvbnN0OworfTsKKworY2xhc3MgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKTsKKworICB2b2lkIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSkgY29uc3Q7CisgIHZvaWQgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLCBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCisgICAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlLAorICAgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2M5NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBUT0RPKGtlbnRvbik6ICBTaGFyZSBjb2RlIHdpdGggdGhlIHZlcnNpb25zIG9mIHRoaXMgdGVzdCBpbiBvdGhlciBsYW5ndWFnZXM/CisvLyAgIEl0IHNlZW1lZCBsaWtlIHBhcmFtZXRlcml6aW5nIGl0IHdvdWxkIGFkZCBtb3JlIGNvbXBsZXhpdHkgdGhhbiBpdCBpcworLy8gICB3b3J0aC4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CituYW1lc3BhY2UgeworCitjbGFzcyBUZXN0R2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgVGVzdEdlbmVyYXRvcigpIHt9CisgIH5UZXN0R2VuZXJhdG9yKCkge30KKworICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgICAgc3RyaW5nIGZpbGVuYW1lID0gIlRlc3QuamF2YSI7CisgICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAib3V0ZXJfY2xhc3Nfc2NvcGUiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJjbGFzc19zY29wZTpmb28uQmFyIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAiY2xhc3Nfc2NvcGU6Zm9vLkJhci5CYXoiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJidWlsZGVyX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJidWlsZGVyX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAiZW51bV9zY29wZTpmb28uUXV4IiwgY29udGV4dCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIFRyeUluc2VydChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCwKKyAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCkgY29uc3QgeworICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICBjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KGZpbGVuYW1lLCBpbnNlcnRpb25fcG9pbnQpKTsKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICBwcmludGVyLlByaW50KCIvLyBpbnNlcnRlZCAkbmFtZSRcbiIsICJuYW1lIiwgaW5zZXJ0aW9uX3BvaW50KTsKKyAgfQorfTsKKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgYWxsIHRoZSBleHBlY3RlZCBpbnNlcnRpb24gcG9pbnRzIGV4aXN0LiAgSXQgZG9lcworLy8gbm90IHZlcmlmeSB0aGF0IHRoZXkgYXJlIGNvcnJlY3RseS1wbGFjZWQ7IHRoYXQgd291bGQgcmVxdWlyZSBhY3R1YWxseQorLy8gY29tcGlsaW5nIHRoZSBvdXRwdXQgd2hpY2ggaXMgYSBiaXQgbW9yZSB0aGFuIEkgY2FyZSB0byBkbyBmb3IgdGhpcyB0ZXN0LgorVEVTVChKYXZhUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgeworICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAib3B0aW9uIGphdmFfcGFja2FnZSA9IFwiXCI7XG4iCisgICAgICAib3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gXCJUZXN0XCI7XG4iCisgICAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKKyAgICAgICJ9XG4iCisgICAgICAiZW51bSBRdXggeyBCTEFIID0gMTsgfVxuIiwKKyAgICAgIFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3QucHJvdG8iKTsKKworICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29tbWFuZExpbmVJbnRlcmZhY2UgY2xpOworICBjbGkuU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUodHJ1ZSk7CisKKyAgSmF2YUdlbmVyYXRvciBqYXZhX2dlbmVyYXRvcjsKKyAgVGVzdEdlbmVyYXRvciB0ZXN0X2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWphdmFfb3V0IiwgJmphdmFfZ2VuZXJhdG9yLCAiIik7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS10ZXN0X291dCIsICZ0ZXN0X2dlbmVyYXRvciwgIiIpOworCisgIHN0cmluZyBwcm90b19wYXRoID0gIi1JIiArIFRlc3RUZW1wRGlyKCk7CisgIHN0cmluZyBqYXZhX291dCA9ICItLWphdmFfb3V0PSIgKyBUZXN0VGVtcERpcigpOworICBzdHJpbmcgdGVzdF9vdXQgPSAiLS10ZXN0X291dD0iICsgVGVzdFRlbXBEaXIoKTsKKworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgInByb3RvYyIsCisgICAgcHJvdG9fcGF0aC5jX3N0cigpLAorICAgIGphdmFfb3V0LmNfc3RyKCksCisgICAgdGVzdF9vdXQuY19zdHIoKSwKKyAgICAidGVzdC5wcm90byIKKyAgfTsKKworICBFWFBFQ1RfRVEoMCwgY2xpLlJ1big1LCBhcmd2KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNDBlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYwpAQCAtMCwwICsxLDc4NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIqIFByaW1pdGl2ZVR5cGVOYW1lKEphdmFUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBKQVZBVFlQRV9JTlQgICAgOiByZXR1cm4gImludCI7CisgICAgY2FzZSBKQVZBVFlQRV9MT05HICAgOiByZXR1cm4gImxvbmciOworICAgIGNhc2UgSkFWQVRZUEVfRkxPQVQgIDogcmV0dXJuICJmbG9hdCI7CisgICAgY2FzZSBKQVZBVFlQRV9ET1VCTEUgOiByZXR1cm4gImRvdWJsZSI7CisgICAgY2FzZSBKQVZBVFlQRV9CT09MRUFOOiByZXR1cm4gImJvb2xlYW4iOworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HIDogcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0JZVEVTICA6IHJldHVybiAiY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU0gICA6IHJldHVybiBOVUxMOworICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRTogcmV0dXJuIE5VTEw7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIEphdmFUeXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgSXNSZWZlcmVuY2VUeXBlKEphdmFUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBKQVZBVFlQRV9JTlQgICAgOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBKQVZBVFlQRV9MT05HICAgOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBKQVZBVFlQRV9GTE9BVCAgOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBKQVZBVFlQRV9ET1VCTEUgOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBKQVZBVFlQRV9CT09MRUFOOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkcgOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEpBVkFUWVBFX0JZVEVTICA6IHJldHVybiB0cnVlOworICAgIGNhc2UgSkFWQVRZUEVfRU5VTSAgIDogcmV0dXJuIHRydWU7CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOiByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gSmF2YVR5cGVzIGFyZSBhZGRlZC4KKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0IGNoYXIqIEdldENhcGl0YWxpemVkVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN3aXRjaCAoR2V0VHlwZShmaWVsZCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgIDogcmV0dXJuICJJbnQzMiIgICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAiVUludDMyIiAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiAgOiByZXR1cm4gIlNJbnQzMiIgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyIDogcmV0dXJuICJGaXhlZDMyIiA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiAiU0ZpeGVkMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0ICAgOiByZXR1cm4gIkludDY0IiAgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQgIDogcmV0dXJuICJVSW50NjQiICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0ICA6IHJldHVybiAiU0ludDY0IiAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gIkZpeGVkNjQiIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuICJTRml4ZWQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiAiRmxvYXQiICAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRSAgOiByZXR1cm4gIkRvdWJsZSIgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuICJCb29sIiAgICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICA6IHJldHVybiAiU3RyaW5nIiAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTICAgOiByZXR1cm4gIkJ5dGVzIiAgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgIDogcmV0dXJuICJFbnVtIiAgICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICA6IHJldHVybiAiR3JvdXAiICAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gIk1lc3NhZ2UiIDsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCisvLyBGb3IgZW5jb2RpbmdzIHdpdGggZml4ZWQgc2l6ZXMsIHJldHVybnMgdGhhdCBzaXplIGluIGJ5dGVzLiAgT3RoZXJ3aXNlCisvLyByZXR1cm5zIC0xLgoraW50IEZpeGVkU2l6ZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0ICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0ICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRml4ZWQzMlNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NCA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0ZpeGVkNjRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtTRml4ZWQzMlNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a1NGaXhlZDY0U2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVCAgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRmxvYXRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRSAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtEb3VibGVTaXplOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0Jvb2xTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0gICAgOiByZXR1cm4gLTE7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIDogcmV0dXJuIC0xOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAtMTsKK30KKwordm9pZCBTZXRQcmltaXRpdmVWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPQorICAgIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiY2FwaXRhbGl6ZWRfbmFtZSJdID0KKyAgICBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yKSk7CisgICgqdmFyaWFibGVzKVsiYm94ZWRfdHlwZSJdID0gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yKSk7CisgICgqdmFyaWFibGVzKVsiZmllbGRfdHlwZSJdID0gKCp2YXJpYWJsZXMpWyJ0eXBlIl07CisgICgqdmFyaWFibGVzKVsiZmllbGRfbGlzdF90eXBlIl0gPSAiamF2YS51dGlsLkxpc3Q8IiArCisgICAgICAoKnZhcmlhYmxlcylbImJveGVkX3R5cGUiXSArICI+IjsKKyAgKCp2YXJpYWJsZXMpWyJlbXB0eV9saXN0Il0gPSAiamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIjsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9pbml0Il0gPSBJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGRlc2NyaXB0b3IpID8KKyAgICAgICIiIDogKCI9ICIgKyBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcikpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX3R5cGUiXSA9IEdldENhcGl0YWxpemVkVHlwZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9IFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7CisgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCisgICAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7CisgIGlmIChJc1JlZmVyZW5jZVR5cGUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcikpKSB7CisgICAgKCp2YXJpYWJsZXMpWyJudWxsX2NoZWNrIl0gPQorICAgICAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICAgICAiICB9XG4iOworICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0gIiI7CisgIH0KKyAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAorICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKKyAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQorICAgICAgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKKyAgaW50IGZpeGVkX3NpemUgPSBGaXhlZFNpemUoR2V0VHlwZShkZXNjcmlwdG9yKSk7CisgIGlmIChmaXhlZF9zaXplICE9IC0xKSB7CisgICAgKCp2YXJpYWJsZXMpWyJmaXhlZF9zaXplIl0gPSBTaW1wbGVJdG9hKGZpeGVkX3NpemUpOworICB9CisgICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0KKyAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKSA/ICJvbkNoYW5nZWQoKTsiIDogIiI7CisKKyAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2VzIGFuZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB0aGUgaGFzRmllbGQgYml0LgorICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgLy8gRm9yIHJlcGF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgorICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAvLyBGb3IgcmVwZWF0ZWQgZmllbGRzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZQorICAvLyBpbiB0aGUgcGFyc2luZyBjb25zdHJ1Y3Rvci4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK1ByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6flByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlICRmaWVsZF90eXBlJCAkbmFtZSRfO1xuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCisgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJGZpZWxkX3R5cGUkICRuYW1lJF8gJGRlZmF1bHRfaW5pdCQ7XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiJG51bGxfY2hlY2skIgorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgICRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIik7CisgIEphdmFUeXBlIHR5cGUgPSBHZXRKYXZhVHlwZShkZXNjcmlwdG9yXyk7CisgIGlmICh0eXBlID09IEpBVkFUWVBFX1NUUklORyB8fCB0eXBlID09IEpBVkFUWVBFX0JZVEVTKSB7CisgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgaXMgbm90IGEgc2ltcGxlIGxpdGVyYWwgc28gd2Ugd2FudCB0byBhdm9pZCBleGVjdXRpbmcKKyAgICAvLyBpdCBtdWx0aXBsZSB0aW1lcy4gIEluc3RlYWQsIGdldCB0aGUgZGVmYXVsdCBvdXQgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgICRuYW1lJF8gPSBnZXREZWZhdWx0SW5zdGFuY2UoKS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICAkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CisgIC8vIG5vb3AgZm9yIHByaW1pdGl2ZXMKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIgorICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKG90aGVyLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpKSB7XG4iCisgICAgIiAgc2V0JGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIgorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCQ7XG4iCisgICAgIn1cbiIKKyAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCisgICAgIiRuYW1lJF8gPSBpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBub29wIGZvciBwcmltaXRpdmVzLgorfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJCkge1xuIgorICAgICIgIG91dHB1dC53cml0ZSRjYXBpdGFsaXplZF90eXBlJCgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlJGNhcGl0YWxpemVkX3R5cGUkU2l6ZSgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBzd2l0Y2ggKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgIGNhc2UgSkFWQVRZUEVfTE9ORzoKKyAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAiICAgID09IG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiAoRmxvYXQuZmxvYXRUb0ludEJpdHMoZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpIgorICAgICAgICAiICAgID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9ET1VCTEU6CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIChEb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkiCisgICAgICAgICIgICAgPT0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICBjYXNlIEpBVkFUWVBFX0JZVEVTOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIpOworICBzd2l0Y2ggKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfTE9ORzoKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoTG9uZyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9CT09MRUFOOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGhhc2hCb29sZWFuKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKFxuIgorICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRToKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoTG9uZyhcbiIKKyAgICAgICAgIiAgICBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgIGNhc2UgSkFWQVRZUEVfQllURVM6CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkuaGFzaENvZGUoKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0cmluZyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7Cit9CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMDsKK30KKworaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkYm94ZWRfdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iKTsKK30KKworCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJGZpZWxkX2xpc3RfdHlwZSQgJG5hbWUkXztcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JGJveGVkX3R5cGUkPlxuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkgJiYKKyAgICAgIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAicHJpdmF0ZSBpbnQgJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gT25lIGZpZWxkIGlzIHRoZSBsaXN0IGFuZCB0aGUgYml0IGZpZWxkIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlCisgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLiBJZiBpdCdzIGltbXV0YWJsZSwgdGhlIGludmFyaWFudCBpcyB0aGF0IGl0IG11c3QKKyAgLy8gZWl0aGVyIGFuIGluc3RhbmNlIG9mIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIG9yIGl0J3MgYW4gQXJyYXlMaXN0CisgIC8vIHdyYXBwZWQgaW4gYSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCkgd3JhcHBlciBhbmQgbm9ib2R5IGVsc2UgaGFzCisgIC8vIGEgcmVmZXJlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgQXJyYXlMaXN0LiBUaGlzIGludmFyaWFudCBhbGxvd3MgdXMgdG8KKyAgLy8gc2hhcmUgaW5zdGFuY2VzIG9mIGxpc3RzIGJldHdlZW4gcHJvdG9jb2wgYnVmZmVycyBhdm9pZGluZyBleHBlbnNpdmUKKyAgLy8gbWVtb3J5IGFsbG9jYXRpb25zLiBOb3RlLCBpbW11dGFibGUgaXMgYSBzdHJvbmcgZ3VhcmFudGVlIGhlcmUgLS0gbm90CisgIC8vIGp1c3QgdGhhdCB0aGUgbGlzdCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIHRoZSByZWZlcmVuY2UgYnV0IHRoYXQgdGhlCisgIC8vIGxpc3QgY2FuIG5ldmVyIGJlIG1vZGlmaWVkLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlICRmaWVsZF9saXN0X3R5cGUkICRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgorICAgICIgIGlmICghJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgorICAgICIgICAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PCRib3hlZF90eXBlJD4oJG5hbWUkXyk7XG4iCisgICAgIiAgICAkc2V0X211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICB9XG4iCisgICAgIn1cbiIpOworCisgICAgLy8gTm90ZTogIFdlIHJldHVybiBhbiB1bm1vZGlmaWFibGUgbGlzdCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgY2FsbGVyCisgICAgLy8gICBjb3VsZCBob2xkIG9uIHRvIHRoZSByZXR1cm5lZCBsaXN0IGFuZCBtb2RpZnkgaXQgYWZ0ZXIgdGhlIG1lc3NhZ2UKKyAgICAvLyAgIGhhcyBiZWVuIGJ1aWx0LCB0aHVzIG11dGF0aW5nIHRoZSBtZXNzYWdlIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlCisgICAgLy8gICBpbW11dGFibGUuCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkYm94ZWRfdHlwZSQ+XG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgorICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIkbnVsbF9jaGVjayQiCisgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyAkYm94ZWRfdHlwZSQ+IHZhbHVlcykge1xuIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgIHN1cGVyLmFkZEFsbCh2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CisgIC8vIG5vb3AgZm9yIHByaW1pdGl2ZXMKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnM6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgIGlmICgkbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICAgJG5hbWUkXy5hZGRBbGwob3RoZXIuJG5hbWUkXyk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCisgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICJ9XG4iCisgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoISRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkYm94ZWRfdHlwZSQ+KCk7XG4iCisgICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgorICAgICJ9XG4iCisgICAgIiRuYW1lJF8uYWRkKGlucHV0LnJlYWQkY2FwaXRhbGl6ZWRfdHlwZSQoKSk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTtcbiIKKyAgICAiaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7XG4iCisgICAgImlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkICYmIGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIgorICAgICIgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkYm94ZWRfdHlwZSQ+KCk7XG4iCisgICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgorICAgICJ9XG4iCisgICAgIndoaWxlIChpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHtcbiIKKyAgICAiICAkbmFtZSRfLmFkZChpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCkpO1xuIgorICAgICJ9XG4iCisgICAgImlucHV0LnBvcExpbWl0KGxpbWl0KTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKSA+IDApIHtcbiIKKyAgICAgICIgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKCR0YWckKTtcbiIKKyAgICAgICIgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKCRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemUpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICIgIG91dHB1dC53cml0ZSRjYXBpdGFsaXplZF90eXBlJE5vVGFnKCRuYW1lJF8uZ2V0KGkpKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlJGNhcGl0YWxpemVkX3R5cGUkKCRudW1iZXIkLCAkbmFtZSRfLmdldChpKSk7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIntcbiIKKyAgICAiICBpbnQgZGF0YVNpemUgPSAwO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGlmIChGaXhlZFNpemUoR2V0VHlwZShkZXNjcmlwdG9yXykpID09IC0xKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICIgIGRhdGFTaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgLmNvbXB1dGUkY2FwaXRhbGl6ZWRfdHlwZSRTaXplTm9UYWcoJG5hbWUkXy5nZXQoaSkpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZGF0YVNpemUgPSAkZml4ZWRfc2l6ZSQgKiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJzaXplICs9IGRhdGFTaXplO1xuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICghZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmlzRW1wdHkoKSkge1xuIgorICAgICAgIiAgc2l6ZSArPSAkdGFnX3NpemUkO1xuIgorICAgICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgICAiICAgICAgLmNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7XG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJzaXplICs9ICR0YWdfc2l6ZSQgKiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpO1xuIik7CisgIH0KKworICAvLyBjYWNoZSB0aGUgZGF0YSBzaXplIGZvciBwYWNrZWQgZmllbGRzLgorICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplO1xuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCisgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkgPiAwKSB7XG4iCisgICAgIiAgaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgorICAgICIgIGhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5oYXNoQ29kZSgpO1xuIgorICAgICJ9XG4iKTsKK30KKworc3RyaW5nIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjViNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaApAQCAtMCwwICsxLDEyMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfUFJJTUlUSVZFX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9QUklNSVRJVkVfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgflJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOworICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9QUklNSVRJVkVfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkODAzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYwpAQCAtMCwwICsxLDQ1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK1NlcnZpY2VHZW5lcmF0b3I6OlNlcnZpY2VHZW5lcmF0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikge30KKworU2VydmljZUdlbmVyYXRvcjo6flNlcnZpY2VHZW5lcmF0b3IoKSB7fQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGJvb2wgaXNfb3duX2ZpbGUgPSBkZXNjcmlwdG9yXy0+ZmlsZSgpLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpOworICBXcml0ZVNlcnZpY2VEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyAkc3RhdGljJCBhYnN0cmFjdCBjbGFzcyAkY2xhc3NuYW1lJFxuIgorICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2Uge1xuIiwKKyAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByb3RlY3RlZCAkY2xhc3NuYW1lJCgpIHt9XG5cbiIsCisgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworCisgIEdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworCisgIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZVNlcnZpY2VNZXRob2QocHJpbnRlcik7CisgIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZU1ldGhvZChwcmludGVyKTsKKworICBHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBnZXREZXNjcmlwdG9yKCkgYW5kIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuCisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yXG4iCisgICAgIiAgICBnZXREZXNjcmlwdG9yKCkge1xuIgorICAgICIgIHJldHVybiAkZmlsZSQuZ2V0RGVzY3JpcHRvcigpLmdldFNlcnZpY2VzKCkuZ2V0KCRpbmRleCQpO1xuIgorICAgICJ9XG4iLAorICAgICJmaWxlIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAorICAgICJpbmRleCIsIFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpKTsKKyAgR2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBtb3JlIHN0dWZmLgorICBHZW5lcmF0ZUNhbGxNZXRob2QocHJpbnRlcik7CisgIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFUVVFU1QsIHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVNQT05TRSwgcHJpbnRlcik7CisgIEdlbmVyYXRlU3R1YihwcmludGVyKTsKKyAgR2VuZXJhdGVCbG9ja2luZ1N0dWIocHJpbnRlcik7CisKKyAgLy8gQWRkIGFuIGluc2VydGlvbiBwb2ludC4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuU2VydmljZURlc2NyaXB0b3JcbiIKKyAgICAiICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkge1xuIgorICAgICIgIHJldHVybiBnZXREZXNjcmlwdG9yKCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KCJwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIEdlbmVyYXRlQWJzdHJhY3RNZXRob2RzKHByaW50ZXIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTmV3UmVmbGVjdGl2ZVNlcnZpY2VNZXRob2QoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlIG5ld1JlZmxlY3RpdmVTZXJ2aWNlKFxuIgorICAgICIgICAgZmluYWwgSW50ZXJmYWNlIGltcGwpIHtcbiIKKyAgICAiICByZXR1cm4gbmV3ICRjbGFzc25hbWUkKCkge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBwcmludGVyLT5QcmludCgiQGphdmEubGFuZy5PdmVycmlkZVxuIik7CisgICAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kLCBJU19DT05DUkVURSk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiIHtcbiIKKyAgICAgICIgIGltcGwuJG1ldGhvZCQoY29udHJvbGxlciwgcmVxdWVzdCwgZG9uZSk7XG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1ldGhvZCIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKSk7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9O1xuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVOZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlTWV0aG9kKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdTZXJ2aWNlXG4iCisgICAgIiAgICBuZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlKGZpbmFsIEJsb2NraW5nSW50ZXJmYWNlIGltcGwpIHtcbiIKKyAgICAiICByZXR1cm4gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdTZXJ2aWNlKCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBHZW5lcmF0ZUdldERlc2NyaXB0b3JGb3JUeXBlKHByaW50ZXIpOworCisgIEdlbmVyYXRlQ2FsbEJsb2NraW5nTWV0aG9kKHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVFVRVNULCBwcmludGVyKTsKKyAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUkVTUE9OU0UsIHByaW50ZXIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn07XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBXcml0ZU1ldGhvZERvY0NvbW1lbnQocHJpbnRlciwgbWV0aG9kKTsKKyAgICBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QsIElTX0FCU1RSQUNUKTsKKyAgICBwcmludGVyLT5QcmludCgiO1xuXG4iKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgInB1YmxpYyBmaW5hbCB2b2lkIGNhbGxNZXRob2QoXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2UgcmVxdWVzdCxcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2FsbGJhY2s8XG4iCisgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZT4gZG9uZSkge1xuIgorICAgICIgIGlmIChtZXRob2QuZ2V0U2VydmljZSgpICE9IGdldERlc2NyaXB0b3IoKSkge1xuIgorICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgIiAgICAgIFwiU2VydmljZS5jYWxsTWV0aG9kKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIFwiICtcbiIKKyAgICAiICAgICAgXCJzZXJ2aWNlIHR5cGUuXCIpO1xuIgorICAgICIgIH1cbiIKKyAgICAiICBzd2l0Y2gobWV0aG9kLmdldEluZGV4KCkpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOworICAgIHZhcnNbIm1ldGhvZCJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpOworICAgIHZhcnNbImlucHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOworICAgIHZhcnNbIm91dHB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJjYXNlICRpbmRleCQ6XG4iCisgICAgICAiICB0aGlzLiRtZXRob2QkKGNvbnRyb2xsZXIsICgkaW5wdXQkKXJlcXVlc3QsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjVXRpbC48JG91dHB1dCQ+c3BlY2lhbGl6ZUNhbGxiYWNrKFxuIgorICAgICAgIiAgICAgIGRvbmUpKTtcbiIKKyAgICAgICIgIHJldHVybjtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImRlZmF1bHQ6XG4iCisgICAgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5Bc3NlcnRpb25FcnJvcihcIkNhbid0IGdldCBoZXJlLlwiKTtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworCisgIHByaW50ZXItPlByaW50KAorICAgICIgIH1cbiIKKyAgICAifVxuIgorICAgICJcbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2FsbEJsb2NraW5nTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZSBjYWxsQmxvY2tpbmdNZXRob2QoXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2UgcmVxdWVzdClcbiIKKyAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VFeGNlcHRpb24ge1xuIgorICAgICIgIGlmIChtZXRob2QuZ2V0U2VydmljZSgpICE9IGdldERlc2NyaXB0b3IoKSkge1xuIgorICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgIiAgICAgIFwiU2VydmljZS5jYWxsQmxvY2tpbmdNZXRob2QoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3IgXCIgK1xuIgorICAgICIgICAgICBcIndyb25nIHNlcnZpY2UgdHlwZS5cIik7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHN3aXRjaChtZXRob2QuZ2V0SW5kZXgoKSkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7CisgICAgdmFyc1sibWV0aG9kIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCk7CisgICAgdmFyc1siaW5wdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7CisgICAgdmFyc1sib3V0cHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImNhc2UgJGluZGV4JDpcbiIKKyAgICAgICIgIHJldHVybiBpbXBsLiRtZXRob2QkKGNvbnRyb2xsZXIsICgkaW5wdXQkKXJlcXVlc3QpO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiZGVmYXVsdDpcbiIKKyAgICAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkFzc2VydGlvbkVycm9yKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpO1xuIik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8qCisgICAqIFRPRE8oY3Bvdmlyayk6IFRoZSBleGNlcHRpb24gbWVzc2FnZSBzYXlzICJTZXJ2aWNlLmZvbyIgd2hlbiBpdCBtYXkgYmUKKyAgICogIkJsb2NraW5nU2VydmljZS5mb28uIiAgQ29uc2lkZXIgZml4aW5nLgorICAgKi8KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VcbiIKKyAgICAiICAgIGdldCRyZXF1ZXN0X29yX3Jlc3BvbnNlJFByb3RvdHlwZShcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpIHtcbiIKKyAgICAiICBpZiAobWV0aG9kLmdldFNlcnZpY2UoKSAhPSBnZXREZXNjcmlwdG9yKCkpIHtcbiIKKyAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgorICAgICIgICAgICBcIlNlcnZpY2UuZ2V0JHJlcXVlc3Rfb3JfcmVzcG9uc2UkUHJvdG90eXBlKCkgZ2l2ZW4gbWV0aG9kIFwiICtcbiIKKyAgICAiICAgICAgXCJkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuXCIpO1xuIgorICAgICIgIH1cbiIKKyAgICAiICBzd2l0Y2gobWV0aG9kLmdldEluZGV4KCkpIHtcbiIsCisgICAgInJlcXVlc3Rfb3JfcmVzcG9uc2UiLCAod2hpY2ggPT0gUkVRVUVTVCkgPyAiUmVxdWVzdCIgOiAiUmVzcG9uc2UiKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICB2YXJzWyJ0eXBlIl0gPSBDbGFzc05hbWUoCisgICAgICAod2hpY2ggPT0gUkVRVUVTVCkgPyBtZXRob2QtPmlucHV0X3R5cGUoKSA6IG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJjYXNlICRpbmRleCQ6XG4iCisgICAgICAiICByZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiZGVmYXVsdDpcbiIKKyAgICAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkFzc2VydGlvbkVycm9yKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpO1xuIik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVTdHViKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljIFN0dWIgbmV3U3R1YihcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2hhbm5lbCBjaGFubmVsKSB7XG4iCisgICAgIiAgcmV0dXJuIG5ldyBTdHViKGNoYW5uZWwpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN0dWIgZXh0ZW5kcyAkY2xhc3NuYW1lJCBpbXBsZW1lbnRzIEludGVyZmFjZSB7IgorICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAicHJpdmF0ZSBTdHViKGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2hhbm5lbCBjaGFubmVsKSB7XG4iCisgICAgIiAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiIKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAicHJpdmF0ZSBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NoYW5uZWwgY2hhbm5lbDtcbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NoYW5uZWwgZ2V0Q2hhbm5lbCgpIHtcbiIKKyAgICAiICByZXR1cm4gY2hhbm5lbDtcbiIKKyAgICAifVxuIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kLCBJU19DT05DUkVURSk7CisgICAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICB2YXJzWyJvdXRwdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiY2hhbm5lbC5jYWxsTWV0aG9kKFxuIgorICAgICAgIiAgZ2V0RGVzY3JpcHRvcigpLmdldE1ldGhvZHMoKS5nZXQoJGluZGV4JCksXG4iCisgICAgICAiICBjb250cm9sbGVyLFxuIgorICAgICAgIiAgcmVxdWVzdCxcbiIKKyAgICAgICIgICRvdXRwdXQkLmdldERlZmF1bHRJbnN0YW5jZSgpLFxuIgorICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNVdGlsLmdlbmVyYWxpemVDYWxsYmFjayhcbiIKKyAgICAgICIgICAgZG9uZSxcbiIKKyAgICAgICIgICAgJG91dHB1dCQuY2xhc3MsXG4iCisgICAgICAiICAgICRvdXRwdXQkLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7XG4iKTsKKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVCbG9ja2luZ1N0dWIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBzdGF0aWMgQmxvY2tpbmdJbnRlcmZhY2UgbmV3QmxvY2tpbmdTdHViKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CbG9ja2luZ1JwY0NoYW5uZWwgY2hhbm5lbCkge1xuIgorICAgICIgIHJldHVybiBuZXcgQmxvY2tpbmdTdHViKGNoYW5uZWwpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBpbnRlcmZhY2UgQmxvY2tpbmdJbnRlcmZhY2UgeyIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBHZW5lcmF0ZUJsb2NraW5nTWV0aG9kU2lnbmF0dXJlKHByaW50ZXIsIG1ldGhvZCk7CisgICAgcHJpbnRlci0+UHJpbnQoIjtcbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIgorICAgICJcbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBCbG9ja2luZ1N0dWIgaW1wbGVtZW50cyBCbG9ja2luZ0ludGVyZmFjZSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByaXZhdGUgQmxvY2tpbmdTdHViKGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKKyAgICAiICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJwcml2YXRlIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdScGNDaGFubmVsIGNoYW5uZWw7XG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBHZW5lcmF0ZUJsb2NraW5nTWV0aG9kU2lnbmF0dXJlKHByaW50ZXIsIG1ldGhvZCk7CisgICAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICB2YXJzWyJvdXRwdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAicmV0dXJuICgkb3V0cHV0JCkgY2hhbm5lbC5jYWxsQmxvY2tpbmdNZXRob2QoXG4iCisgICAgICAiICBnZXREZXNjcmlwdG9yKCkuZ2V0TWV0aG9kcygpLmdldCgkaW5kZXgkKSxcbiIKKyAgICAgICIgIGNvbnRyb2xsZXIsXG4iCisgICAgICAiICByZXF1ZXN0LFxuIgorICAgICAgIiAgJG91dHB1dCQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIik7CisKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgIlxuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0Fic3RyYWN0IGlzX2Fic3RyYWN0KSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1sibmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpOworICB2YXJzWyJpbnB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpKTsKKyAgdmFyc1sib3V0cHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKKyAgdmFyc1siYWJzdHJhY3QiXSA9IChpc19hYnN0cmFjdCA9PSBJU19BQlNUUkFDVCkgPyAiYWJzdHJhY3QiIDogIiI7CisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgInB1YmxpYyAkYWJzdHJhY3QkIHZvaWQgJG5hbWUkKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsXG4iCisgICAgIiAgICAkaW5wdXQkIHJlcXVlc3QsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NhbGxiYWNrPCRvdXRwdXQkPiBkb25lKSIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQmxvY2tpbmdNZXRob2RTaWduYXR1cmUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1sibWV0aG9kIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCk7CisgIHZhcnNbImlucHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOworICB2YXJzWyJvdXRwdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICJcbiIKKyAgICAicHVibGljICRvdXRwdXQkICRtZXRob2QkKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsXG4iCisgICAgIiAgICAkaW5wdXQkIHJlcXVlc3QpXG4iCisgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRXhjZXB0aW9uIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdlZWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NFUlZJQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NFUlZJQ0VfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNlcnZpY2VHZW5lcmF0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+U2VydmljZUdlbmVyYXRvcigpOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKworICAvLyBHZW5lcmF0ZSB0aGUgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSBtZXRob2QuCisgIHZvaWQgR2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgYSBKYXZhIGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2UuCisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIG5ld1JlZmxlY3RpdmVTZXJ2aWNlKCkgbWV0aG9kLgorICB2b2lkIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZVNlcnZpY2VNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIG5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2UoKSBtZXRob2QuCisgIHZvaWQgR2VuZXJhdGVOZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBhYnN0cmFjdCBtZXRob2QgZGVjbGFyYXRpb25zIGZvciBhbGwgbWV0aG9kcy4KKyAgdm9pZCBHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIFNlcnZpY2UuY2FsbE1ldGhvZCgpLgorICB2b2lkIEdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIEJsb2NraW5nU2VydmljZS5jYWxsQmxvY2tpbmdNZXRob2QoKS4KKyAgdm9pZCBHZW5lcmF0ZUNhbGxCbG9ja2luZ01ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBTZXJ2aWNlLmdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpLgorICBlbnVtIFJlcXVlc3RPclJlc3BvbnNlIHsgUkVRVUVTVCwgUkVTUE9OU0UgfTsKKyAgdm9pZCBHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZSB3aGljaCwgaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGEgc3R1YiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KKyAgdm9pZCBHZW5lcmF0ZVN0dWIoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGEgbWV0aG9kIHNpZ25hdHVyZSwgcG9zc2libHkgYWJzdHJhY3QsIHdpdGhvdXQgYm9keSBvciB0cmFpbGluZworICAvLyBzZW1pY29sb24uCisgIGVudW0gSXNBYnN0cmFjdCB7IElTX0FCU1RSQUNULCBJU19DT05DUkVURSB9OworICB2b2lkIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0Fic3RyYWN0IGlzX2Fic3RyYWN0KTsKKworICAvLyBHZW5lcmF0ZSBhIGJsb2NraW5nIHN0dWIgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KKyAgdm9pZCBHZW5lcmF0ZUJsb2NraW5nU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIG1ldGhvZCBzaWduYXR1cmUgZm9yIG9uZSBtZXRob2Qgb2YgYSBibG9ja2luZyBzdHViLgorICB2b2lkIEdlbmVyYXRlQmxvY2tpbmdNZXRob2RTaWduYXR1cmUoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpOworCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2VydmljZUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworI2VuZGlmICAvLyBORVRfUFJPVE8yX0NPTVBJTEVSX0pBVkFfU0VSVklDRV9IX18KK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNTY2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmNjCkBAIC0wLDAgKzEsNzI2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBBdXRob3I6IGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCituYW1lc3BhY2UgeworCit2b2lkIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgeworICAoKnZhcmlhYmxlcylbIm5hbWUiXSA9CisgICAgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF9uYW1lIl0gPQorICAgIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbImVtcHR5X2xpc3QiXSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLkxhenlTdHJpbmdBcnJheUxpc3QuRU1QVFkiOworCisgICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHRfaW5pdCJdID0gKCI9ICIgKyBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcikpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX3R5cGUiXSA9ICJTdHJpbmciOworICAoKnZhcmlhYmxlcylbInRhZyJdID0gU2ltcGxlSXRvYShXaXJlRm9ybWF0OjpNYWtlVGFnKGRlc2NyaXB0b3IpKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWdfc2l6ZSJdID0gU2ltcGxlSXRvYSgKKyAgICAgIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZGVzY3JpcHRvci0+bnVtYmVyKCksIEdldFR5cGUoZGVzY3JpcHRvcikpKTsKKyAgKCp2YXJpYWJsZXMpWyJudWxsX2NoZWNrIl0gPQorICAgICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgICAiICB9XG4iOworCisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0KKyAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKSA/ICJvbkNoYW5nZWQoKTsiIDogIiI7CisKKyAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2VzIGFuZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB0aGUgaGFzRmllbGQgYml0LgorICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgLy8gRm9yIHJlcGF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgorICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAvLyBGb3IgcmVwZWF0ZWQgZmllbGRzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZQorICAvLyBpbiB0aGUgcGFyc2luZyBjb25zdHJ1Y3Rvci4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK1N0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitTdHJpbmdGaWVsZEdlbmVyYXRvcjo6flN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCisvLyBBIG5vdGUgYWJvdXQgaG93IHN0cmluZ3MgYXJlIGhhbmRsZWQuIFRoaXMgY29kZSB1c2VkIHRvIGp1c3Qgc3RvcmUgYSBTdHJpbmcKKy8vIGluIHRoZSBNZXNzYWdlLiBUaGlzIGhhZCB0d28gaXNzdWVzOgorLy8KKy8vICAxLiBJdCB3b3VsZG4ndCByb3VuZHRyaXAgYnl0ZSBhcnJheXMgdGhhdCB3ZXJlIG5vdCB2YWlkIFVURi04IGVuY29kZWQKKy8vICAgICBzdHJpbmdzLCBidXQgcmF0aGVyIGZpZWxkcyB0aGF0IHdlcmUgcmF3IGJ5dGVzIGluY29ycmVjdGx5IG1hcmtlZAorLy8gICAgIGFzIHN0cmluZ3MgaW4gdGhlIHByb3RvIGZpbGUuIFRoaXMgaXMgY29tbW9uIGJlY2F1c2UgaW4gdGhlIHByb3RvMQorLy8gICAgIHN5bnRheCwgc3RyaW5nIHdhcyB0aGUgd2F5IHRvIGluZGljYXRlIGJ5dGVzIGFuZCBDKysgZW5naW5lZXJzIGNhbgorLy8gICAgIGVhc2lseSBtYWtlIHRoaXMgbWlzdGFrZSB3aXRob3V0IGFmZmVjdGluZyB0aGUgQysrIEFQSS4gQnkgY29udmVydGluZyB0bworLy8gICAgIHN0cmluZ3MgaW1tZWRpYXRlbHksIHNvbWUgamF2YSBjb2RlIG1pZ2h0IGNvcnJ1cHQgdGhlc2UgYnl0ZSBhcnJheXMgYXMKKy8vICAgICBpdCBwYXNzZXMgdGhyb3VnaCBhIGphdmEgc2VydmVyIGV2ZW4gaWYgdGhlIGZpZWxkIHdhcyBuZXZlciBhY2Nlc3NlZCBieQorLy8gICAgIGFwcGxpY2F0aW9uIGNvZGUuCisvLworLy8gIDIuIFRoZXJlJ3MgYSBwZXJmb3JtYW5jZSBoaXQgdG8gY29udmVydGluZyBiZXR3ZWVuIGJ5dGVzIGFuZCBzdHJpbmdzIGFuZAorLy8gICAgIGl0IG1hbnkgY2FzZXMsIHRoZSBmaWVsZCBpcyBuZXZlciBldmVuIHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuIFRoaXMKKy8vICAgICBhdm9pZHMgdW5uZWNlc3NhcnkgY29udmVyc2lvbnMgaW4gdGhlIGNvbW1vbiB1c2UgY2FzZXMuCisvLworLy8gU28gbm93LCB0aGUgZmllbGQgZm9yIFN0cmluZyBpcyBtYWludGFpbmVkIGFzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2hpY2ggY2FuCisvLyBlaXRoZXIgc3RvcmUgYSBTdHJpbmcgb3IgYSBCeXRlU3RyaW5nLiBUaGUgY29kZSB1c2VzIGFuIGluc3RhbmNlb2YgY2hlY2sKKy8vIHRvIHNlZSB3aGljaCBvbmUgaXQgaGFzIGFuZCBjb252ZXJ0cyB0byB0aGUgb3RoZXIgb25lIGlmIG5lZWRlZC4gSXQgcmVtZW1iZXJzCisvLyB0aGUgbGFzdCB2YWx1ZSByZXF1ZXN0ZWQgKGluIGEgdGhyZWFkIHNhZmUgbWFubmVyKSBhcyB0aGlzIGlzIG1vc3QgbGlrZWx5CisvLyB0aGUgb25lIG5lZWRlZCBuZXh0LiBUaGUgdGhyZWFkIHNhZmV0eSBpcyBzdWNoIHRoYXQgaWYgdHdvIHRocmVhZHMgYm90aAorLy8gY29udmVydCB0aGUgZmllbGQgYmVjYXVzZSB0aGUgY2hhbmdlcyBtYWRlIGJ5IGVhY2ggdGhyZWFkIHdlcmUgbm90IHZpc2libGUgdG8KKy8vIHRoZSBvdGhlciwgdGhleSBtYXkgY2F1c2UgYSBjb252ZXJzaW9uIHRvIGhhcHBlbiBtb3JlIHRpbWVzIHRoYW4gd291bGQKKy8vIG90aGVyd2lzZSBiZSBuZWNlc3NhcnkuIFRoaXMgd2FzIGRlZW1lZCBiZXR0ZXIgdGhhbiBhZGRpbmcgc3luY2hyb25pemF0aW9uCisvLyBvdmVyaGVhZC4gSXQgd2lsbCBub3QgY2F1c2UgYW55IGNvcnJ1cHRpb24gaXNzdWVzIG9yIGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YKKy8vIHRoZSBBUEkuIFRoZSBpbnN0YW5jZW9mIGNoZWNrIGlzIGFsc28gaGlnaGx5IG9wdGltaXplZCBpbiB0aGUgSlZNIGFuZCB3ZQorLy8gZGVjaWRlZCBpdCB3YXMgYmV0dGVyIHRvIHJlZHVjZSB0aGUgbWVtb3J5IG92ZXJoZWFkIGJ5IG5vdCBoYXZpbmcgdHdvCisvLyBzZXBhcmF0ZSBmaWVsZHMgYnV0IHJhdGhlciB1c2UgZHluYW1pYyB0eXBlIGNoZWNraW5nLgorLy8KKy8vIEZvciBzaW5nbGUgZmllbGRzLCB0aGUgbG9naWMgZm9yIHRoaXMgaXMgZG9uZSBpbnNpZGUgdGhlIGdlbmVyYXRlZCBjb2RlLiBGb3IKKy8vIHJlcGVhdGVkIGZpZWxkcywgdGhlIGxvZ2ljIGlzIGRvbmUgaW4gTGF6eVN0cmluZ0FycmF5TGlzdCBhbmQKKy8vIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0Lgordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKTtcbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGphdmEubGFuZy5PYmplY3QgJG5hbWUkXztcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmID0gJG5hbWUkXztcbiIKKyAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykge1xuIgorICAgICIgICAgcmV0dXJuIChqYXZhLmxhbmcuU3RyaW5nKSByZWY7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IFxuIgorICAgICIgICAgICAgIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKKyAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIgorICAgICIgICAgaWYgKGJzLmlzVmFsaWRVdGY4KCkpIHtcbiIKKyAgICAiICAgICAgJG5hbWUkXyA9IHM7XG4iCisgICAgIiAgICB9XG4iCisgICAgIiAgICByZXR1cm4gcztcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpIHtcbiIKKyAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9ICRuYW1lJF87XG4iCisgICAgIiAgaWYgKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpIHtcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBiID0gXG4iCisgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChcbiIKKyAgICAiICAgICAgICAgICAgKGphdmEubGFuZy5TdHJpbmcpIHJlZik7XG4iCisgICAgIiAgICAkbmFtZSRfID0gYjtcbiIKKyAgICAiICAgIHJldHVybiBiO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGphdmEubGFuZy5PYmplY3QgJG5hbWUkXyAkZGVmYXVsdF9pbml0JDtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmID0gJG5hbWUkXztcbiIKKyAgICAiICBpZiAoIShyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSkge1xuIgorICAgICIgICAgamF2YS5sYW5nLlN0cmluZyBzID0gKChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZilcbiIKKyAgICAiICAgICAgICAudG9TdHJpbmdVdGY4KCk7XG4iCisgICAgIiAgICAkbmFtZSRfID0gcztcbiIKKyAgICAiICAgIHJldHVybiBzO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gKGphdmEubGFuZy5TdHJpbmcpIHJlZjtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmID0gJG5hbWUkXztcbiIKKyAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYiA9IFxuIgorICAgICIgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoXG4iCisgICAgIiAgICAgICAgICAgIChqYXZhLmxhbmcuU3RyaW5nKSByZWYpO1xuIgorICAgICIgICAgJG5hbWUkXyA9IGI7XG4iCisgICAgIiAgICByZXR1cm4gYjtcbiIKKyAgICAiICB9IGVsc2Uge1xuIgorICAgICIgICAgcmV0dXJuIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKKyAgICAiJG51bGxfY2hlY2skIgorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvIGF2b2lkIGV4ZWN1dGluZworICAvLyBpdCBtdWx0aXBsZSB0aW1lcy4gIEluc3RlYWQsIGdldCB0aGUgZGVmYXVsdCBvdXQgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgJG5hbWUkXyA9IGdldERlZmF1bHRJbnN0YW5jZSgpLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgcHJpbWl0aXZlcworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iCisgICAgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBBbGxvdyBhIHNsaWdodCBicmVhY2ggb2YgYWJzdHJhY3Rpb24gaGVyZSBpbiBvcmRlciB0byBhdm9pZCBmb3JjaW5nCisgIC8vIGFsbCBzdHJpbmcgZmllbGRzIHRvIFN0cmluZ3Mgd2hlbiBjb3B5aW5nIGZpZWxkcyBmcm9tIGEgTWVzc2FnZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKG90aGVyLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpKSB7XG4iCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAifVxuIgorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAiJG5hbWUkXyA9IGlucHV0LnJlYWRCeXRlcygpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3Igc3RyaW5ncy4KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBvdXRwdXQud3JpdGVCeXRlcygkbnVtYmVyJCwgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlQnl0ZXNTaXplKCRudW1iZXIkLCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5oYXNoQ29kZSgpO1xuIik7Cit9CisKK3N0cmluZyBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCkKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAorICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZXNfKTsKK30KKworUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCitpbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+XG4iCisgICAgImdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoaW50IGluZGV4KTtcbiIpOworfQorCisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLkxhenlTdHJpbmdMaXN0ICRuYW1lJF87XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+XG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKGludCBpbmRleCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLmdldEJ5dGVTdHJpbmcoaW5kZXgpO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJgorICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBiaXQgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKKyAgLy8gbGlzdCBpcyBpbW11dGFibGUuIElmIGl0J3MgaW1tdXRhYmxlLCB0aGUgaW52YXJpYW50IGlzIHRoYXQgaXQgbXVzdAorICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKKyAgLy8gd3JhcHBlZCBpbiBhIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKSB3cmFwcGVyIGFuZCBub2JvZHkgZWxzZSBoYXMKKyAgLy8gYSByZWZlcmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bworICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQorICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKKyAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKKyAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nTGlzdCAkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSB2b2lkIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpIHtcbiIKKyAgICAiICBpZiAoISRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nQXJyYXlMaXN0KCRuYW1lJF8pO1xuIgorICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAgfVxuIgorICAgICJ9XG4iKTsKKworICAgIC8vIE5vdGU6ICBXZSByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGNhbGxlcgorICAgIC8vICAgY291bGQgaG9sZCBvbiB0byB0aGUgcmV0dXJuZWQgbGlzdCBhbmQgbW9kaWZ5IGl0IGFmdGVyIHRoZSBtZXNzYWdlCisgICAgLy8gICBoYXMgYmVlbiBidWlsdCwgdGh1cyBtdXRhdGluZyB0aGUgbWVzc2FnZSB3aGljaCBpcyBzdXBwb3NlZCB0byBiZQorICAgIC8vICAgaW1tdXRhYmxlLgorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz5cbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCisgICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKGludCBpbmRleCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLmdldEJ5dGVTdHJpbmcoaW5kZXgpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgaW50IGluZGV4LCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICIkbnVsbF9jaGVjayQiCisgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPGphdmEubGFuZy5TdHJpbmc+IHZhbHVlcykge1xuIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgIHN1cGVyLmFkZEFsbCh2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CisgIC8vIG5vb3AgZm9yIHByaW1pdGl2ZXMKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnM6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgIGlmICgkbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICAgJG5hbWUkXy5hZGRBbGwob3RoZXIuJG5hbWUkXyk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCisgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChcbiIKKyAgICAiICAgICAgJG5hbWUkXyk7XG4iCisgICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICJ9XG4iCisgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoISRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nQXJyYXlMaXN0KCk7XG4iCisgICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgorICAgICJ9XG4iCisgICAgIiRuYW1lJF8uYWRkKGlucHV0LnJlYWRCeXRlcygpKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpO1xuIgorICAgICJpbnQgbGltaXQgPSBpbnB1dC5wdXNoTGltaXQobGVuZ3RoKTtcbiIKKyAgICAiaWYgKCEkZ2V0X211dGFibGVfYml0X3BhcnNlciQgJiYgaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkxhenlTdHJpbmdBcnJheUxpc3QoKTtcbiIKKyAgICAiICAkc2V0X211dGFibGVfYml0X3BhcnNlciQ7XG4iCisgICAgIn1cbiIKKyAgICAid2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIgorICAgICIgICRuYW1lJC5hZGQoaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpKTtcbiIKKyAgICAifVxuIgorICAgICJpbnB1dC5wb3BMaW1pdChsaW1pdCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QoJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCkgPiAwKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkdGFnJCk7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGUkY2FwaXRhbGl6ZWRfdHlwZSROb1RhZygkbmFtZSRfLmdldChpKSk7XG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICIgIG91dHB1dC53cml0ZUJ5dGVzKCRudW1iZXIkLCAkbmFtZSRfLmdldEJ5dGVTdHJpbmcoaSkpO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ7XG4iCisgICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAiICBkYXRhU2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgIiAgICAuY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0Qnl0ZVN0cmluZyhpKSk7XG4iCisgICAgIn1cbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgInNpemUgKz0gZGF0YVNpemU7XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKCFnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuaXNFbXB0eSgpKSB7XG4iCisgICAgICAiICBzaXplICs9ICR0YWdfc2l6ZSQ7XG4iCisgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgICAuY29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgInNpemUgKz0gJHRhZ19zaXplJCAqIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCk7XG4iKTsKKyAgfQorCisgIC8vIGNhY2hlIHRoZSBkYXRhIHNpemUgZm9yIHBhY2tlZCBmaWVsZHMuCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KClcbiIKKyAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSA+IDApIHtcbiIKKyAgICAiICBoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmhhc2hDb2RlKCk7XG4iCisgICAgIn1cbiIpOworfQorCitzdHJpbmcgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gIlN0cmluZyI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NTMyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU1RSSU5HX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5TdHJpbmdGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKyAgY29uc3QgaW50IG1lc3NhZ2VCaXRJbmRleF87CisgIGNvbnN0IGludCBidWlsZGVyQml0SW5kZXhfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5SZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Q7CisgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKyAgY29uc3QgaW50IG1lc3NhZ2VCaXRJbmRleF87CisgIGNvbnN0IGludCBidWlsZGVyQml0SW5kZXhfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NUUklOR19GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmYzVkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaD4KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgY2xpLkFsbG93UGx1Z2lucygicHJvdG9jLSIpOworCisgIC8vIFByb3RvMiBDKysKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OmNwcDo6Q3BwR2VuZXJhdG9yIGNwcF9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1jcHBfb3V0IiwgIi0tY3BwX29wdCIsICZjcHBfZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEMrKyBoZWFkZXIgYW5kIHNvdXJjZS4iKTsKKworICAvLyBQcm90bzIgSmF2YQorICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6amF2YTo6SmF2YUdlbmVyYXRvciBqYXZhX2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWphdmFfb3V0IiwgJmphdmFfZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEphdmEgc291cmNlIGZpbGUuIik7CisKKworICAvLyBQcm90bzIgUHl0aG9uCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpweXRob246OkdlbmVyYXRvciBweV9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1weXRob25fb3V0IiwgJnB5X2dlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBQeXRob24gc291cmNlIGZpbGUuIik7CisKKyAgcmV0dXJuIGNsaS5SdW4oYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzVlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI0MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBmaWxlcyBpbiBhbGxfZmlsZXMgaW4gdGhlIGZvcm0gb2YgYQorLy8gY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KK3N0cmluZyBDb21tYVNlcGFyYXRlZExpc3QoY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gYWxsX2ZpbGVzKSB7CisgIHZlY3RvcjxzdHJpbmc+IG5hbWVzOworICBmb3IgKGludCBpID0gMDsgaSA8IGFsbF9maWxlcy5zaXplKCk7IGkrKykgeworICAgIG5hbWVzLnB1c2hfYmFjayhhbGxfZmlsZXNbaV0tPm5hbWUoKSk7CisgIH0KKyAgcmV0dXJuIEpvaW5TdHJpbmdzKG5hbWVzLCAiLCIpOworfQorCitzdGF0aWMgY29uc3QgY2hhcioga0ZpcnN0SW5zZXJ0aW9uUG9pbnROYW1lID0gImZpcnN0X21vY2tfaW5zZXJ0aW9uX3BvaW50IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrU2Vjb25kSW5zZXJ0aW9uUG9pbnROYW1lID0gInNlY29uZF9tb2NrX2luc2VydGlvbl9wb2ludCI7CitzdGF0aWMgY29uc3QgY2hhcioga0ZpcnN0SW5zZXJ0aW9uUG9pbnQgPQorICAgICIjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaXJzdF9tb2NrX2luc2VydGlvbl9wb2ludCkgaXMgaGVyZVxuIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrU2Vjb25kSW5zZXJ0aW9uUG9pbnQgPQorICAgICIgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlY29uZF9tb2NrX2luc2VydGlvbl9wb2ludCkgaXMgaGVyZVxuIjsKKworTW9ja0NvZGVHZW5lcmF0b3I6Ok1vY2tDb2RlR2VuZXJhdG9yKGNvbnN0IHN0cmluZyYgbmFtZSkKKyAgICA6IG5hbWVfKG5hbWUpIHt9CisKK01vY2tDb2RlR2VuZXJhdG9yOjp+TW9ja0NvZGVHZW5lcmF0b3IoKSB7fQorCit2b2lkIE1vY2tDb2RlR2VuZXJhdG9yOjpFeHBlY3RHZW5lcmF0ZWQoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9ucywKKyAgICBjb25zdCBzdHJpbmcmIGZpbGUsCisgICAgY29uc3Qgc3RyaW5nJiBmaXJzdF9tZXNzYWdlX25hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBmaXJzdF9wYXJzZWRfZmlsZV9uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgb3V0cHV0X2RpcmVjdG9yeSkgeworICBzdHJpbmcgY29udGVudDsKKyAgQVNTRVJUX1RSVUUoRmlsZTo6UmVhZEZpbGVUb1N0cmluZygKKyAgICAgIG91dHB1dF9kaXJlY3RvcnkgKyAiLyIgKyBHZXRPdXRwdXRGaWxlTmFtZShuYW1lLCBmaWxlKSwgJmNvbnRlbnQpKTsKKworICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKKyAgU3BsaXRTdHJpbmdVc2luZyhjb250ZW50LCAiXG4iLCAmbGluZXMpOworCisgIHdoaWxlICghbGluZXMuZW1wdHkoKSAmJiBsaW5lcy5iYWNrKCkuZW1wdHkoKSkgeworICAgIGxpbmVzLnBvcF9iYWNrKCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgeworICAgIGxpbmVzW2ldICs9ICJcbiI7CisgIH0KKworICB2ZWN0b3I8c3RyaW5nPiBpbnNlcnRpb25fbGlzdDsKKyAgaWYgKCFpbnNlcnRpb25zLmVtcHR5KCkpIHsKKyAgICBTcGxpdFN0cmluZ1VzaW5nKGluc2VydGlvbnMsICIsIiwgJmluc2VydGlvbl9saXN0KTsKKyAgfQorCisgIEFTU0VSVF9FUShsaW5lcy5zaXplKCksIDMgKyBpbnNlcnRpb25fbGlzdC5zaXplKCkgKiAyKTsKKyAgRVhQRUNUX0VRKEdldE91dHB1dEZpbGVDb250ZW50KG5hbWUsIHBhcmFtZXRlciwgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3BhcnNlZF9maWxlX25hbWUsIGZpcnN0X21lc3NhZ2VfbmFtZSksCisgICAgICAgICAgICBsaW5lc1swXSk7CisKKyAgRVhQRUNUX0VRKGtGaXJzdEluc2VydGlvblBvaW50LCBsaW5lc1sxICsgaW5zZXJ0aW9uX2xpc3Quc2l6ZSgpXSk7CisgIEVYUEVDVF9FUShrU2Vjb25kSW5zZXJ0aW9uUG9pbnQsIGxpbmVzWzIgKyBpbnNlcnRpb25fbGlzdC5zaXplKCkgKiAyXSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnNlcnRpb25fbGlzdC5zaXplKCk7IGkrKykgeworICAgIEVYUEVDVF9FUShHZXRPdXRwdXRGaWxlQ29udGVudChpbnNlcnRpb25fbGlzdFtpXSwgImZpcnN0X2luc2VydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGZpbGUsIGZpcnN0X21lc3NhZ2VfbmFtZSksCisgICAgICAgICAgICAgIGxpbmVzWzEgKyBpXSk7CisgICAgLy8gU2Vjb25kIGluc2VydGlvbiBwb2ludCBpcyBpbmRlbnRlZCwgc28gdGhlIGluc2VydGVkIHRleHQgc2hvdWxkCisgICAgLy8gYXV0b21hdGljYWxseSBiZSBpbmRlbnRlZCB0b28uCisgICAgRVhQRUNUX0VRKCIgICIgKyBHZXRPdXRwdXRGaWxlQ29udGVudChpbnNlcnRpb25fbGlzdFtpXSwgInNlY29uZF9pbnNlcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgZmlsZSwgZmlyc3RfbWVzc2FnZV9uYW1lKSwKKyAgICAgICAgICAgICAgbGluZXNbMiArIGluc2VydGlvbl9saXN0LnNpemUoKSArIGldKTsKKyAgfQorfQorCitib29sIE1vY2tDb2RlR2VuZXJhdG9yOjpHZW5lcmF0ZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKEhhc1ByZWZpeFN0cmluZyhmaWxlLT5tZXNzYWdlX3R5cGUoaSktPm5hbWUoKSwgIk1vY2tDb2RlR2VuZXJhdG9yXyIpKSB7CisgICAgICBzdHJpbmcgY29tbWFuZCA9IFN0cmlwUHJlZml4U3RyaW5nKGZpbGUtPm1lc3NhZ2VfdHlwZShpKS0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9ja0NvZGVHZW5lcmF0b3JfIik7CisgICAgICBpZiAoY29tbWFuZCA9PSAiRXJyb3IiKSB7CisgICAgICAgICplcnJvciA9ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiRXhpdCIpIHsKKyAgICAgICAgY2VyciA8PCAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0LiIgPDwgZW5kbDsKKyAgICAgICAgZXhpdCgxMjMpOworICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJBYm9ydCIpIHsKKyAgICAgICAgY2VyciA8PCAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydC4iIDw8IGVuZGw7CisgICAgICAgIGFib3J0KCk7CisgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkhhc1NvdXJjZUNvZGVJbmZvIikgeworICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfZGVzY3JpcHRvcl9wcm90bzsKKyAgICAgICAgZmlsZS0+Q29weVNvdXJjZUNvZGVJbmZvVG8oJmZpbGVfZGVzY3JpcHRvcl9wcm90byk7CisgICAgICAgIGJvb2wgaGFzX3NvdXJjZV9jb2RlX2luZm8gPQorICAgICAgICAgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkgJiYKKyAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5zb3VyY2VfY29kZV9pbmZvKCkubG9jYXRpb25fc2l6ZSgpID4gMDsKKyAgICAgICAgY2VyciA8PCAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbzogIgorICAgICAgICAgICAgIDw8IGhhc19zb3VyY2VfY29kZV9pbmZvIDw8ICIuIiA8PCBlbmRsOworICAgICAgICBhYm9ydCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVua25vd24gTW9ja0NvZGVHZW5lcmF0b3IgY29tbWFuZDogIiA8PCBjb21tYW5kOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChIYXNQcmVmaXhTdHJpbmcocGFyYW1ldGVyLCAiaW5zZXJ0PSIpKSB7CisgICAgdmVjdG9yPHN0cmluZz4gaW5zZXJ0X2ludG87CisgICAgU3BsaXRTdHJpbmdVc2luZyhTdHJpcFByZWZpeFN0cmluZyhwYXJhbWV0ZXIsICJpbnNlcnQ9IiksCisgICAgICAgICAgICAgICAgICAgICAiLCIsICZpbnNlcnRfaW50byk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc2VydF9pbnRvLnNpemUoKTsgaSsrKSB7CisgICAgICB7CisgICAgICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgICAgICBjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KAorICAgICAgICAgICAgICBHZXRPdXRwdXRGaWxlTmFtZShpbnNlcnRfaW50b1tpXSwgZmlsZSksCisgICAgICAgICAgICAgIGtGaXJzdEluc2VydGlvblBvaW50TmFtZSkpOworICAgICAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICAgICAgcHJpbnRlci5QcmludFJhdyhHZXRPdXRwdXRGaWxlQ29udGVudChuYW1lXywgImZpcnN0X2luc2VydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgY29udGV4dCkpOworICAgICAgICBpZiAocHJpbnRlci5mYWlsZWQoKSkgeworICAgICAgICAgICplcnJvciA9ICJNb2NrQ29kZUdlbmVyYXRvciBkZXRlY3RlZCB3cml0ZSBlcnJvci4iOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgICAgICBjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KAorICAgICAgICAgICAgICBHZXRPdXRwdXRGaWxlTmFtZShpbnNlcnRfaW50b1tpXSwgZmlsZSksCisgICAgICAgICAgICAgIGtTZWNvbmRJbnNlcnRpb25Qb2ludE5hbWUpKTsKKyAgICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgICAgIHByaW50ZXIuUHJpbnRSYXcoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZV8sICJzZWNvbmRfaW5zZXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBjb250ZXh0KSk7CisgICAgICAgIGlmIChwcmludGVyLmZhaWxlZCgpKSB7CisgICAgICAgICAgKmVycm9yID0gIk1vY2tDb2RlR2VuZXJhdG9yIGRldGVjdGVkIHdyaXRlIGVycm9yLiI7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgIGNvbnRleHQtPk9wZW4oR2V0T3V0cHV0RmlsZU5hbWUobmFtZV8sIGZpbGUpKSk7CisKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICBwcmludGVyLlByaW50UmF3KEdldE91dHB1dEZpbGVDb250ZW50KG5hbWVfLCBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBjb250ZXh0KSk7CisgICAgcHJpbnRlci5QcmludFJhdyhrRmlyc3RJbnNlcnRpb25Qb2ludCk7CisgICAgcHJpbnRlci5QcmludFJhdyhrU2Vjb25kSW5zZXJ0aW9uUG9pbnQpOworCisgICAgaWYgKHByaW50ZXIuZmFpbGVkKCkpIHsKKyAgICAgICplcnJvciA9ICJNb2NrQ29kZUdlbmVyYXRvciBkZXRlY3RlZCB3cml0ZSBlcnJvci4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdHJpbmcgTW9ja0NvZGVHZW5lcmF0b3I6OkdldE91dHB1dEZpbGVOYW1lKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHJldHVybiBHZXRPdXRwdXRGaWxlTmFtZShnZW5lcmF0b3JfbmFtZSwgZmlsZS0+bmFtZSgpKTsKK30KKworc3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlTmFtZShjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUgKyAiLk1vY2tDb2RlR2VuZXJhdG9yLiIgKyBnZW5lcmF0b3JfbmFtZTsKK30KKworc3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlQ29udGVudCgKKyAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgIEdlbmVyYXRvckNvbnRleHQgKmNvbnRleHQpIHsKKyAgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gYWxsX2ZpbGVzOworICBjb250ZXh0LT5MaXN0UGFyc2VkRmlsZXMoJmFsbF9maWxlcyk7CisgIHJldHVybiBHZXRPdXRwdXRGaWxlQ29udGVudCgKKyAgICAgIGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsIGZpbGUtPm5hbWUoKSwKKyAgICAgIENvbW1hU2VwYXJhdGVkTGlzdChhbGxfZmlsZXMpLAorICAgICAgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkgPiAwID8KKyAgICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSA6ICIobm9uZSkiKTsKK30KKworc3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlQ29udGVudCgKKyAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgIGNvbnN0IHN0cmluZyYgZmlsZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcnNlZF9maWxlX2xpc3QsCisgICAgY29uc3Qgc3RyaW5nJiBmaXJzdF9tZXNzYWdlX25hbWUpIHsKKyAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwOiAkMSwgJDIsICQzLCAkNFxuIiwKKyAgICAgIGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsIGZpbGUsCisgICAgICBmaXJzdF9tZXNzYWdlX25hbWUsIHBhcnNlZF9maWxlX2xpc3QpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ZmQyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfTU9DS19DT0RFX0dFTkVSQVRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX01PQ0tfQ09ERV9HRU5FUkFUT1JfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIEEgbW9jayBDb2RlR2VuZXJhdG9yLCB1c2VkIGJ5IGNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuICBUaGlzIGlzIGluCisvLyBpdHMgb3duIGZpbGUgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBib3RoIGRpcmVjdGx5IGFuZCBhcyBhIHBsdWdpbi4KKy8vCisvLyBHZW5lcmF0ZSgpIHByb2R1Y2VzIHNvbWUgb3V0cHV0IHdoaWNoIGNhbiBiZSBjaGVja2VkIGJ5IEV4cGVjdENhbGxlZCgpLiAgVGhlCisvLyBnZW5lcmF0b3IgY2FuIHJ1biBpbiBhIGRpZmZlcmVudCBwcm9jZXNzIChlLmcuIGEgcGx1Z2luKS4KKy8vCisvLyBJZiB0aGUgcGFyYW1ldGVyIGlzICJpbnNlcnQ9TkFNRVMiLCB0aGUgTW9ja0NvZGVHZW5lcmF0b3Igd2lsbCBpbnNlcnQgbGluZXMKKy8vIGludG8gdGhlIGZpbGVzIGdlbmVyYXRlZCBieSBvdGhlciBNb2NrQ29kZUdlbmVyYXRvcnMgaW5zdGVhZCBvZiBjcmVhdGluZworLy8gaXRzIG93biBmaWxlLiAgTkFNRVMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhvc2Ugb3RoZXIKKy8vIE1vY2tDb2RlR2VuZXJhdG9ycy4KKy8vCisvLyBNb2NrQ29kZUdlbmVyYXRvciB3aWxsIGFsc28gbW9kaWZ5IGl0cyBiZWhhdmlvciBzbGlnaHRseSBpZiB0aGUgaW5wdXQgZmlsZQorLy8gY29udGFpbnMgYSBtZXNzYWdlIHR5cGUgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBuYW1lczoKKy8vICAgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3I6ICBDYXVzZXMgR2VuZXJhdGUoKSB0byByZXR1cm4gZmFsc2UgYW5kIHNldCB0aGUKKy8vICAgICBlcnJvciBtZXNzYWdlIHRvICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yLiIKKy8vICAgTW9ja0NvZGVHZW5lcmF0b3JfRXhpdDogIEdlbmVyYXRlKCkgcHJpbnRzICJTYXcgbWVzc2FnZSB0eXBlCisvLyAgICAgTW9ja0NvZGVHZW5lcmF0b3JfRXhpdC4iIHRvIHN0ZGVyciBhbmQgdGhlbiBjYWxscyBleGl0KDEyMykuCisvLyAgIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0OiAgR2VuZXJhdGUoKSBwcmludHMgIlNhdyBtZXNzYWdlIHR5cGUKKy8vICAgICBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydC4iIHRvIHN0ZGVyciBhbmQgdGhlbiBjYWxscyBhYm9ydCgpLgorLy8gICBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbzogIENhdXNlcyBHZW5lcmF0ZSgpIHRvIGFib3J0IGFmdGVyCisvLyAgICAgcHJpbnRpbmcgIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfSGFzU291cmNlQ29kZUluZm86IEZPTy4iIHRvCisvLyAgICAgc3RkZXJyLCB3aGVyZSBGT08gaXMgIjEiIGlmIHRoZSBzdXBwbGllZCBGaWxlRGVzY3JpcHRvclByb3RvIGhhcyBzb3VyY2UKKy8vICAgICBjb2RlIGluZm8sIGFuZCAiMCIgb3RoZXJ3aXNlLgorY2xhc3MgTW9ja0NvZGVHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBNb2NrQ29kZUdlbmVyYXRvcihjb25zdCBzdHJpbmcmIG5hbWUpOworICB2aXJ0dWFsIH5Nb2NrQ29kZUdlbmVyYXRvcigpOworCisgIC8vIEV4cGVjdCAodmlhIGdUZXN0KSB0aGF0IGEgTW9ja0NvZGVHZW5lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3YXMgY2FsbGVkCisgIC8vIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMgYnkgaW5zcGVjdGluZyB0aGUgb3V0cHV0IGxvY2F0aW9uLgorICAvLworICAvLyB8aW5zZXJ0aW9uc3wgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBuYW1lcyBvZiBNb2NrQ29kZUdlbmVyYXRvcnMgd2hpY2gKKyAgLy8gc2hvdWxkIGhhdmUgaW5zZXJ0ZWQgbGluZXMgaW50byB0aGlzIGZpbGUuCisgIC8vIHxwYXJzZWRfZmlsZV9saXN0fCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzIG9mIHRoZSBmaWxlcworICAvLyB0aGF0IGFyZSBiZWluZyBjb21waWxlZCB0b2dldGhlciBpbiB0aGlzIHJ1bi4KKyAgc3RhdGljIHZvaWQgRXhwZWN0R2VuZXJhdGVkKGNvbnN0IHN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaXJzdF9tZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcnNlZF9maWxlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG91dHB1dF9kaXJlY3RvcnkpOworCisgIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aGljaCB3b3VsZCBiZSB3cml0dGVuIGJ5IHRoZSBnaXZlbiBnZW5lcmF0b3IuCisgIHN0YXRpYyBzdHJpbmcgR2V0T3V0cHV0RmlsZU5hbWUoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisgIHN0YXRpYyBzdHJpbmcgR2V0T3V0cHV0RmlsZU5hbWUoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGUpOworCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdmlydHVhbCBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBzdHJpbmcgbmFtZV87CisKKyAgc3RhdGljIHN0cmluZyBHZXRPdXRwdXRGaWxlQ29udGVudChjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQgKmNvbnRleHQpOworICBzdGF0aWMgc3RyaW5nIEdldE91dHB1dEZpbGVDb250ZW50KGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyc2VkX2ZpbGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpcnN0X21lc3NhZ2VfbmFtZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9NT0NLX0NPREVfR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTcxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFja2FnZV9pbmZvLmgKQEAgLTAsMCArMSw2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGV4aXN0cyBzb2xlbHkgdG8gZG9jdW1lbnQgdGhlIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyIG5hbWVzcGFjZS4KKy8vIEl0IGlzIG5vdCBjb21waWxlZCBpbnRvIGFueXRoaW5nLCBidXQgaXQgbWF5IGJlIHJlYWQgYnkgYW4gYXV0b21hdGVkCisvLyBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4KKworbmFtZXNwYWNlIGdvb2dsZSB7CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQcm90b2NvbCBCdWZmZXIgY29tcGlsZXIuCisvLworLy8gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNvZGUgZm9yIHBhcnNpbmcgLnByb3RvIGZpbGVzIGFuZCBnZW5lcmF0aW5nIGNvZGUKKy8vIGJhc2VkIG9uIHRoZW0uICBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgeW91IG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gdGhpcworLy8gcGFja2FnZToKKy8vIC0gWW91IHdhbnQgdG8gcGFyc2UgLnByb3RvIGZpbGVzIGF0IHJ1bnRpbWUuICBJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQKKy8vICAgbG9vayBhdCBpbXBvcnRlci5oLiAgU2luY2UgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHdpZGVseSB1c2VmdWwsIGl0IGlzCisvLyAgIGluY2x1ZGVkIGluIHRoZSBsaWJwcm90b2J1ZiBiYXNlIGxpYnJhcnk7IHlvdSBkbyBub3QgaGF2ZSB0byBsaW5rIGFnYWluc3QKKy8vICAgbGlicHJvdG9jLgorLy8gLSBZb3Ugd2FudCB0byB3cml0ZSBhIGN1c3RvbSBwcm90b2NvbCBjb21waWxlciB3aGljaCBnZW5lcmF0ZXMgZGlmZmVyZW50CisvLyAgIGtpbmRzIG9mIGNvZGUsIGUuZy4gY29kZSBpbiBhIGRpZmZlcmVudCBsYW5ndWFnZSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkCisvLyAgIGJ5IHRoZSBvZmZpY2lhbCBjb21waWxlci4gIEZvciB0aGlzIHB1cnBvc2UsIGNvbW1hbmRfbGluZV9pbnRlcmZhY2UuaAorLy8gICBwcm92aWRlcyB5b3Ugd2l0aCBhIGNvbXBsZXRlIGNvbXBpbGVyIGZyb250LWVuZCwgc28gYWxsIHlvdSBuZWVkIHRvIGRvCisvLyAgIGlzIHdyaXRlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIENvZGVHZW5lcmF0b3IgYW5kIGEgdHJpdmlhbCBtYWluKCkKKy8vICAgZnVuY3Rpb24uICBZb3UgY2FuIGV2ZW4gbWFrZSB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgdGhlIG9mZmljaWFsIGxhbmd1YWdlcworLy8gICBpbiBhZGRpdGlvbiB0byB5b3VyIG93bi4gIFNpbmNlIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IHVzZWZ1bCB0byB0aG9zZQorLy8gICB3cml0aW5nIGN1c3RvbSBjb21waWxlcnMsIGl0IGlzIGluIGEgc2VwYXJhdGUgbGlicmFyeSBjYWxsZWQgImxpYnByb3RvYyIKKy8vICAgd2hpY2ggeW91IHdpbGwgaGF2ZSB0byBsaW5rIGFnYWluc3QuCituYW1lc3BhY2UgY29tcGlsZXIge30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FhMDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYwpAQCAtMCwwICsxLDE2MTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFJlY3Vyc2l2ZSBkZXNjZW50IEZUVy4KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKKworbmFtZXNwYWNlIHsKKwordHlwZWRlZiBoYXNoX21hcDxzdHJpbmcsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlPiBUeXBlTmFtZU1hcDsKKworVHlwZU5hbWVNYXAgTWFrZVR5cGVOYW1lVGFibGUoKSB7CisgIFR5cGVOYW1lTWFwIHJlc3VsdDsKKworICByZXN1bHRbImRvdWJsZSIgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEU7CisgIHJlc3VsdFsiZmxvYXQiICAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZMT0FUOworICByZXN1bHRbInVpbnQ2NCIgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UNjQ7CisgIHJlc3VsdFsiZml4ZWQ2NCIgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVENjQ7CisgIHJlc3VsdFsiZml4ZWQzMiIgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVEMzI7CisgIHJlc3VsdFsiYm9vbCIgICAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JPT0w7CisgIHJlc3VsdFsic3RyaW5nIiAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORzsKKyAgcmVzdWx0WyJncm91cCIgICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVA7CisKKyAgcmVzdWx0WyJieXRlcyIgICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQllURVM7CisgIHJlc3VsdFsidWludDMyIiAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQzMjsKKyAgcmVzdWx0WyJzZml4ZWQzMiJdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVEMzI7CisgIHJlc3VsdFsic2ZpeGVkNjQiXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDY0OworICByZXN1bHRbImludDMyIiAgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjsKKyAgcmVzdWx0WyJpbnQ2NCIgICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UNjQ7CisgIHJlc3VsdFsic2ludDMyIiAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NJTlQzMjsKKyAgcmVzdWx0WyJzaW50NjQiICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0lOVDY0OworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IFR5cGVOYW1lTWFwIGtUeXBlTmFtZXMgPSBNYWtlVHlwZU5hbWVUYWJsZSgpOworCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIE1ha2VzIGNvZGUgc2xpZ2h0bHkgbW9yZSByZWFkYWJsZS4gIFRoZSBtZWFuaW5nIG9mICJETyhmb28pIiBpcworLy8gIkV4ZWN1dGUgZm9vIGFuZCBmYWlsIGlmIGl0IGZhaWxzLiIsIHdoZXJlIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5CisvLyByZXR1cm5pbmcgZmFsc2UuCisjZGVmaW5lIERPKFNUQVRFTUVOVCkgaWYgKFNUQVRFTUVOVCkge30gZWxzZSByZXR1cm4gZmFsc2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQYXJzZXI6OlBhcnNlcigpCisgIDogaW5wdXRfKE5VTEwpLAorICAgIGVycm9yX2NvbGxlY3Rvcl8oTlVMTCksCisgICAgc291cmNlX2xvY2F0aW9uX3RhYmxlXyhOVUxMKSwKKyAgICBoYWRfZXJyb3JzXyhmYWxzZSksCisgICAgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8oZmFsc2UpLAorICAgIHN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfKGZhbHNlKSB7Cit9CisKK1BhcnNlcjo6flBhcnNlcigpIHsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgYm9vbCBQYXJzZXI6Okxvb2tpbmdBdChjb25zdCBjaGFyKiB0ZXh0KSB7CisgIHJldHVybiBpbnB1dF8tPmN1cnJlbnQoKS50ZXh0ID09IHRleHQ7Cit9CisKK2lubGluZSBib29sIFBhcnNlcjo6TG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUb2tlblR5cGUgdG9rZW5fdHlwZSkgeworICByZXR1cm4gaW5wdXRfLT5jdXJyZW50KCkudHlwZSA9PSB0b2tlbl90eXBlOworfQorCitpbmxpbmUgYm9vbCBQYXJzZXI6OkF0RW5kKCkgeworICByZXR1cm4gTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCk7Cit9CisKK2Jvb2wgUGFyc2VyOjpUcnlDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgaWYgKExvb2tpbmdBdCh0ZXh0KSkgeworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZShjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiBlcnJvcikgeworICBpZiAoVHJ5Q29uc3VtZSh0ZXh0KSkgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OkNvbnN1bWUoY29uc3QgY2hhciogdGV4dCkgeworICBpZiAoVHJ5Q29uc3VtZSh0ZXh0KSkgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKCJFeHBlY3RlZCBcIiIgKyBzdHJpbmcodGV4dCkgKyAiXCIuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lSWRlbnRpZmllcihzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICpvdXRwdXQgPSBpbnB1dF8tPmN1cnJlbnQoKS50ZXh0OworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OkNvbnN1bWVJbnRlZ2VyKGludCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcikgeworICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgdWludDY0IHZhbHVlID0gMDsKKyAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihpbnB1dF8tPmN1cnJlbnQoKS50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbnQzMm1heCwgJnZhbHVlKSkgeworICAgICAgQWRkRXJyb3IoIkludGVnZXIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgLy8gV2Ugc3RpbGwgcmV0dXJuIHRydWUgYmVjYXVzZSB3ZSBkaWQsIGluIGZhY3QsIHBhcnNlIGFuIGludGVnZXIuCisgICAgfQorICAgICpvdXRwdXQgPSB2YWx1ZTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lU2lnbmVkSW50ZWdlcihpbnQqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgYm9vbCBpc19uZWdhdGl2ZSA9IGZhbHNlOworICB1aW50NjQgbWF4X3ZhbHVlID0ga2ludDMybWF4OworICBpZiAoVHJ5Q29uc3VtZSgiLSIpKSB7CisgICAgaXNfbmVnYXRpdmUgPSB0cnVlOworICAgIG1heF92YWx1ZSArPSAxOworICB9CisgIHVpbnQ2NCB2YWx1ZSA9IDA7CisgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsIGVycm9yKSk7CisgIGlmIChpc19uZWdhdGl2ZSkgdmFsdWUgKj0gLTE7CisgICpvdXRwdXQgPSB2YWx1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lSW50ZWdlcjY0KHVpbnQ2NCBtYXhfdmFsdWUsIHVpbnQ2NCogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgIGlmICghaW86OlRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGlucHV0Xy0+Y3VycmVudCgpLnRleHQsIG1heF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpKSB7CisgICAgICBBZGRFcnJvcigiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAvLyBXZSBzdGlsbCByZXR1cm4gdHJ1ZSBiZWNhdXNlIHdlIGRpZCwgaW4gZmFjdCwgcGFyc2UgYW4gaW50ZWdlci4KKyAgICAgICpvdXRwdXQgPSAwOworICAgIH0KKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lTnVtYmVyKGRvdWJsZSogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcikgeworICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0ZMT0FUKSkgeworICAgICpvdXRwdXQgPSBpbzo6VG9rZW5pemVyOjpQYXJzZUZsb2F0KGlucHV0Xy0+Y3VycmVudCgpLnRleHQpOworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgIC8vIEFsc28gYWNjZXB0IGludGVnZXJzLgorICAgIHVpbnQ2NCB2YWx1ZSA9IDA7CisgICAgaWYgKCFpbzo6VG9rZW5pemVyOjpQYXJzZUludGVnZXIoaW5wdXRfLT5jdXJyZW50KCkudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdWludDY0bWF4LCAmdmFsdWUpKSB7CisgICAgICBBZGRFcnJvcigiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAvLyBXZSBzdGlsbCByZXR1cm4gdHJ1ZSBiZWNhdXNlIHdlIGRpZCwgaW4gZmFjdCwgcGFyc2UgYSBudW1iZXIuCisgICAgfQorICAgICpvdXRwdXQgPSB2YWx1ZTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoImluZiIpKSB7CisgICAgKm91dHB1dCA9IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJuYW4iKSkgeworICAgICpvdXRwdXQgPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lU3RyaW5nKHN0cmluZyogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcikgeworICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKKyAgICBpbzo6VG9rZW5pemVyOjpQYXJzZVN0cmluZyhpbnB1dF8tPmN1cnJlbnQoKS50ZXh0LCBvdXRwdXQpOworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIC8vIEFsbG93IEMrKyBsaWtlIGNvbmNhdGVuYXRpb24gb2YgYWRqYWNlbnQgc3RyaW5nIHRva2Vucy4KKyAgICB3aGlsZSAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKKyAgICAgIGlvOjpUb2tlbml6ZXI6OlBhcnNlU3RyaW5nQXBwZW5kKGlucHV0Xy0+Y3VycmVudCgpLnRleHQsIG91dHB1dCk7CisgICAgICBpbnB1dF8tPk5leHQoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6VHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyKiBsb2NhdGlvbikgeworICBpZiAoTG9va2luZ0F0KHRleHQpKSB7CisgICAgc3RyaW5nIGxlYWRpbmcsIHRyYWlsaW5nOworICAgIGlucHV0Xy0+TmV4dFdpdGhDb21tZW50cygmdHJhaWxpbmcsIE5VTEwsICZsZWFkaW5nKTsKKworICAgIC8vIFNhdmUgdGhlIGxlYWRpbmcgY29tbWVudHMgZm9yIG5leHQgdGltZSwgYW5kIHJlY2FsbCB0aGUgbGVhZGluZyBjb21tZW50cworICAgIC8vIGZyb20gbGFzdCB0aW1lLgorICAgIGxlYWRpbmcuc3dhcCh1cGNvbWluZ19kb2NfY29tbWVudHNfKTsKKworICAgIGlmIChsb2NhdGlvbiAhPSBOVUxMKSB7CisgICAgICBsb2NhdGlvbi0+QXR0YWNoQ29tbWVudHMoJmxlYWRpbmcsICZ0cmFpbGluZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyKiBsb2NhdGlvbikgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24odGV4dCwgbG9jYXRpb24pKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoIkV4cGVjdGVkIFwiIiArIHN0cmluZyh0ZXh0KSArICJcIi4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFBhcnNlcjo6QWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgZXJyb3IpIHsKKyAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gTlVMTCkgeworICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmUsIGNvbHVtbiwgZXJyb3IpOworICB9CisgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKK30KKwordm9pZCBQYXJzZXI6OkFkZEVycm9yKGNvbnN0IHN0cmluZyYgZXJyb3IpIHsKKyAgQWRkRXJyb3IoaW5wdXRfLT5jdXJyZW50KCkubGluZSwgaW5wdXRfLT5jdXJyZW50KCkuY29sdW1uLCBlcnJvcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpMb2NhdGlvblJlY29yZGVyKFBhcnNlciogcGFyc2VyKQorICA6IHBhcnNlcl8ocGFyc2VyKSwKKyAgICBsb2NhdGlvbl8ocGFyc2VyXy0+c291cmNlX2NvZGVfaW5mb18tPmFkZF9sb2NhdGlvbigpKSB7CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkubGluZSk7CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkuY29sdW1uKTsKK30KKworUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCkgeworICBJbml0KHBhcmVudCk7Cit9CisKK1BhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6TG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhdGgxKSB7CisgIEluaXQocGFyZW50KTsKKyAgQWRkUGF0aChwYXRoMSk7Cit9CisKK1BhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6TG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhdGgxLCBpbnQgcGF0aDIpIHsKKyAgSW5pdChwYXJlbnQpOworICBBZGRQYXRoKHBhdGgxKTsKKyAgQWRkUGF0aChwYXRoMik7Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpJbml0KGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCkgeworICBwYXJzZXJfID0gcGFyZW50LnBhcnNlcl87CisgIGxvY2F0aW9uXyA9IHBhcnNlcl8tPnNvdXJjZV9jb2RlX2luZm9fLT5hZGRfbG9jYXRpb24oKTsKKyAgbG9jYXRpb25fLT5tdXRhYmxlX3BhdGgoKS0+Q29weUZyb20ocGFyZW50LmxvY2F0aW9uXy0+cGF0aCgpKTsKKworICBsb2NhdGlvbl8tPmFkZF9zcGFuKHBhcnNlcl8tPmlucHV0Xy0+Y3VycmVudCgpLmxpbmUpOworICBsb2NhdGlvbl8tPmFkZF9zcGFuKHBhcnNlcl8tPmlucHV0Xy0+Y3VycmVudCgpLmNvbHVtbik7Cit9CisKK1BhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6fkxvY2F0aW9uUmVjb3JkZXIoKSB7CisgIGlmIChsb2NhdGlvbl8tPnNwYW5fc2l6ZSgpIDw9IDIpIHsKKyAgICBFbmRBdChwYXJzZXJfLT5pbnB1dF8tPnByZXZpb3VzKCkpOworICB9Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpBZGRQYXRoKGludCBwYXRoX2NvbXBvbmVudCkgeworICBsb2NhdGlvbl8tPmFkZF9wYXRoKHBhdGhfY29tcG9uZW50KTsKK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OlN0YXJ0QXQoY29uc3QgaW86OlRva2VuaXplcjo6VG9rZW4mIHRva2VuKSB7CisgIGxvY2F0aW9uXy0+c2V0X3NwYW4oMCwgdG9rZW4ubGluZSk7CisgIGxvY2F0aW9uXy0+c2V0X3NwYW4oMSwgdG9rZW4uY29sdW1uKTsKK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkVuZEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbikgeworICBpZiAodG9rZW4ubGluZSAhPSBsb2NhdGlvbl8tPnNwYW4oMCkpIHsKKyAgICBsb2NhdGlvbl8tPmFkZF9zcGFuKHRva2VuLmxpbmUpOworICB9CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4odG9rZW4uZW5kX2NvbHVtbik7Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpSZWNvcmRMZWdhY3lMb2NhdGlvbihjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbikgeworICBpZiAocGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXyAhPSBOVUxMKSB7CisgICAgcGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXy0+QWRkKAorICAgICAgICBkZXNjcmlwdG9yLCBsb2NhdGlvbiwgbG9jYXRpb25fLT5zcGFuKDApLCBsb2NhdGlvbl8tPnNwYW4oMSkpOworICB9Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpBdHRhY2hDb21tZW50cygKKyAgICBzdHJpbmcqIGxlYWRpbmcsIHN0cmluZyogdHJhaWxpbmcpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKCFsb2NhdGlvbl8tPmhhc19sZWFkaW5nX2NvbW1lbnRzKCkpOworICBHT09HTEVfQ0hFQ0soIWxvY2F0aW9uXy0+aGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpOworCisgIGlmICghbGVhZGluZy0+ZW1wdHkoKSkgeworICAgIGxvY2F0aW9uXy0+bXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCktPnN3YXAoKmxlYWRpbmcpOworICB9CisgIGlmICghdHJhaWxpbmctPmVtcHR5KCkpIHsKKyAgICBsb2NhdGlvbl8tPm11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKS0+c3dhcCgqdHJhaWxpbmcpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBQYXJzZXI6OlNraXBTdGF0ZW1lbnQoKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TWU1CT0wpKSB7CisgICAgICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoInsiKSkgeworICAgICAgICBTa2lwUmVzdE9mQmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChMb29raW5nQXQoIn0iKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGlucHV0Xy0+TmV4dCgpOworICB9Cit9CisKK3ZvaWQgUGFyc2VyOjpTa2lwUmVzdE9mQmxvY2soKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TWU1CT0wpKSB7CisgICAgICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoInsiKSkgeworICAgICAgICBTa2lwUmVzdE9mQmxvY2soKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfLT5OZXh0KCk7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitib29sIFBhcnNlcjo6UGFyc2UoaW86OlRva2VuaXplciogaW5wdXQsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUpIHsKKyAgaW5wdXRfID0gaW5wdXQ7CisgIGhhZF9lcnJvcnNfID0gZmFsc2U7CisgIHN5bnRheF9pZGVudGlmaWVyXy5jbGVhcigpOworCisgIC8vIE5vdGUgdGhhdCB8ZmlsZXwgY291bGQgYmUgTlVMTCBhdCB0aGlzIHBvaW50IGlmCisgIC8vIHN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfIGlzIHRydWUuICBTbywgd2UgY29uc2VydmF0aXZlbHkgYWxsb2NhdGUKKyAgLy8gU291cmNlQ29kZUluZm8gb24gdGhlIHN0YWNrLCB0aGVuIHN3YXAgaXQgaW50byB0aGUgRmlsZURlc2NyaXB0b3JQcm90bworICAvLyBsYXRlciBvbi4KKyAgU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbzsKKyAgc291cmNlX2NvZGVfaW5mb18gPSAmc291cmNlX2NvZGVfaW5mbzsKKworICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUQVJUKSkgeworICAgIC8vIEFkdmFuY2UgdG8gZmlyc3QgdG9rZW4uCisgICAgaW5wdXRfLT5OZXh0V2l0aENvbW1lbnRzKE5VTEwsIE5VTEwsICZ1cGNvbWluZ19kb2NfY29tbWVudHNfKTsKKyAgfQorCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIHJvb3RfbG9jYXRpb24odGhpcyk7CisKKyAgICBpZiAocmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8gfHwgTG9va2luZ0F0KCJzeW50YXgiKSkgeworICAgICAgaWYgKCFQYXJzZVN5bnRheElkZW50aWZpZXIoKSkgeworICAgICAgICAvLyBEb24ndCBhdHRlbXB0IHRvIHBhcnNlIHRoZSBmaWxlIGlmIHdlIGRpZG4ndCByZWNvZ25pemUgdGhlIHN5bnRheAorICAgICAgICAvLyBpZGVudGlmaWVyLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl8pIHsKKyAgICAgIHN5bnRheF9pZGVudGlmaWVyXyA9ICJwcm90bzIiOworICAgIH0KKworICAgIGlmIChzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXykgcmV0dXJuICFoYWRfZXJyb3JzXzsKKworICAgIC8vIFJlcGVhdGVkbHkgcGFyc2Ugc3RhdGVtZW50cyB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgIHdoaWxlICghQXRFbmQoKSkgeworICAgICAgaWYgKCFQYXJzZVRvcExldmVsU3RhdGVtZW50KGZpbGUsIHJvb3RfbG9jYXRpb24pKSB7CisgICAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGZhaWxlZCB0byBwYXJzZS4gIFNraXAgaXQsIGJ1dCBrZWVwIGxvb3BpbmcgdG8gcGFyc2UKKyAgICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KKyAgICAgICAgU2tpcFN0YXRlbWVudCgpOworCisgICAgICAgIGlmIChMb29raW5nQXQoIn0iKSkgeworICAgICAgICAgIEFkZEVycm9yKCJVbm1hdGNoZWQgXCJ9XCIuIik7CisgICAgICAgICAgaW5wdXRfLT5OZXh0V2l0aENvbW1lbnRzKE5VTEwsIE5VTEwsICZ1cGNvbWluZ19kb2NfY29tbWVudHNfKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlucHV0XyA9IE5VTEw7CisgIHNvdXJjZV9jb2RlX2luZm9fID0gTlVMTDsKKyAgc291cmNlX2NvZGVfaW5mby5Td2FwKGZpbGUtPm11dGFibGVfc291cmNlX2NvZGVfaW5mbygpKTsKKyAgcmV0dXJuICFoYWRfZXJyb3JzXzsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlU3ludGF4SWRlbnRpZmllcigpIHsKKyAgRE8oQ29uc3VtZSgic3ludGF4IiwgIkZpbGUgbXVzdCBiZWdpbiB3aXRoICdzeW50YXggPSBcInByb3RvMlwiOycuIikpOworICBETyhDb25zdW1lKCI9IikpOworICBpbzo6VG9rZW5pemVyOjpUb2tlbiBzeW50YXhfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgc3RyaW5nIHN5bnRheDsKKyAgRE8oQ29uc3VtZVN0cmluZygmc3ludGF4LCAiRXhwZWN0ZWQgc3ludGF4IGlkZW50aWZpZXIuIikpOworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsIE5VTEwpKTsKKworICBzeW50YXhfaWRlbnRpZmllcl8gPSBzeW50YXg7CisKKyAgaWYgKHN5bnRheCAhPSAicHJvdG8yIiAmJiAhc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl8pIHsKKyAgICBBZGRFcnJvcihzeW50YXhfdG9rZW4ubGluZSwgc3ludGF4X3Rva2VuLmNvbHVtbiwKKyAgICAgICJVbnJlY29nbml6ZWQgc3ludGF4IGlkZW50aWZpZXIgXCIiICsgc3ludGF4ICsgIlwiLiAgVGhpcyBwYXJzZXIgIgorICAgICAgIm9ubHkgcmVjb2duaXplcyBcInByb3RvMlwiLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VUb3BMZXZlbFN0YXRlbWVudChGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbikgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgeworICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJtZXNzYWdlIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwgZmlsZS0+bWVzc2FnZV90eXBlX3NpemUoKSk7CisgICAgcmV0dXJuIFBhcnNlTWVzc2FnZURlZmluaXRpb24oZmlsZS0+YWRkX21lc3NhZ2VfdHlwZSgpLCBsb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJlbnVtIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlciwgZmlsZS0+ZW51bV90eXBlX3NpemUoKSk7CisgICAgcmV0dXJuIFBhcnNlRW51bURlZmluaXRpb24oZmlsZS0+YWRkX2VudW1fdHlwZSgpLCBsb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJzZXJ2aWNlIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprU2VydmljZUZpZWxkTnVtYmVyLCBmaWxlLT5zZXJ2aWNlX3NpemUoKSk7CisgICAgcmV0dXJuIFBhcnNlU2VydmljZURlZmluaXRpb24oZmlsZS0+YWRkX3NlcnZpY2UoKSwgbG9jYXRpb24pOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZXh0ZW5kIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCisgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtFeHRlbnNpb25GaWVsZE51bWJlcik7CisgICAgcmV0dXJuIFBhcnNlRXh0ZW5kKGZpbGUtPm11dGFibGVfZXh0ZW5zaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGUtPm11dGFibGVfbWVzc2FnZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJpbXBvcnQiKSkgeworICAgIHJldHVybiBQYXJzZUltcG9ydChmaWxlLT5tdXRhYmxlX2RlcGVuZGVuY3koKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZS0+bXV0YWJsZV9wdWJsaWNfZGVwZW5kZW5jeSgpLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpLAorICAgICAgICAgICAgICAgICAgICAgICByb290X2xvY2F0aW9uKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoInBhY2thZ2UiKSkgeworICAgIHJldHVybiBQYXJzZVBhY2thZ2UoZmlsZSwgcm9vdF9sb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvcHRpb24iKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocm9vdF9sb2NhdGlvbiwKKyAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7CisgICAgcmV0dXJuIFBhcnNlT3B0aW9uKGZpbGUtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwgT1BUSU9OX1NUQVRFTUVOVCk7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoIkV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgKGUuZy4gXCJtZXNzYWdlXCIpLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNzYWdlcworCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlRGVmaW5pdGlvbihEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uKSB7CisgIERPKENvbnN1bWUoIm1lc3NhZ2UiKSk7CisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBtZXNzYWdlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKG1lc3NhZ2UtPm11dGFibGVfbmFtZSgpLCAiRXhwZWN0ZWQgbWVzc2FnZSBuYW1lLiIpKTsKKyAgfQorICBETyhQYXJzZU1lc3NhZ2VCbG9jayhtZXNzYWdlLCBtZXNzYWdlX2xvY2F0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga01heEV4dGVuc2lvblJhbmdlU2VudGluZWwgPSAtMTsKKworYm9vbCBJc01lc3NhZ2VTZXRXaXJlRm9ybWF0TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2UpIHsKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMgPSBtZXNzYWdlLm9wdGlvbnMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZCA9IG9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24oaSk7CisgICAgaWYgKHVuaW50ZXJwcmV0ZWQubmFtZV9zaXplKCkgPT0gMSAmJgorICAgICAgICB1bmludGVycHJldGVkLm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gIm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IiAmJgorICAgICAgICB1bmludGVycHJldGVkLmlkZW50aWZpZXJfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIE1vZGlmaWVzIGFueSBleHRlbnNpb24gcmFuZ2VzIHRoYXQgc3BlY2lmaWVkICdtYXgnIGFzIHRoZSBlbmQgb2YgdGhlCisvLyBleHRlbnNpb24gcmFuZ2UsIGFuZCBzZXRzIHRoZW0gdG8gdGhlIHR5cGUtc3BlY2lmaWMgbWF4aW11bS4gVGhlIGFjdHVhbCBtYXgKKy8vIHRhZyBudW1iZXIgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhZnRlciBhbGwgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkLgordm9pZCBBZGp1c3RFeHRlbnNpb25SYW5nZXNXaXRoTWF4RW5kTnVtYmVyKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSkgeworICBjb25zdCBib29sIGlzX21lc3NhZ2Vfc2V0ID0gSXNNZXNzYWdlU2V0V2lyZUZvcm1hdE1lc3NhZ2UoKm1lc3NhZ2UpOworICBjb25zdCBpbnQgbWF4X2V4dGVuc2lvbl9udW1iZXIgPSBpc19tZXNzYWdlX3NldCA/CisgICAgICBraW50MzJtYXggOgorICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyICsgMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlKGkpLmVuZCgpID09IGtNYXhFeHRlbnNpb25SYW5nZVNlbnRpbmVsKSB7CisgICAgICBtZXNzYWdlLT5tdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpKS0+c2V0X2VuZChtYXhfZXh0ZW5zaW9uX251bWJlcik7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlQmxvY2soRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oInsiLCAmbWVzc2FnZV9sb2NhdGlvbikpOworCisgIHdoaWxlICghVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBOVUxMKSkgeworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWVzc2FnZSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFQYXJzZU1lc3NhZ2VTdGF0ZW1lbnQobWVzc2FnZSwgbWVzc2FnZV9sb2NhdGlvbikpIHsKKyAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGZhaWxlZCB0byBwYXJzZS4gIFNraXAgaXQsIGJ1dCBrZWVwIGxvb3BpbmcgdG8gcGFyc2UKKyAgICAgIC8vIG90aGVyIHN0YXRlbWVudHMuCisgICAgICBTa2lwU3RhdGVtZW50KCk7CisgICAgfQorICB9CisKKyAgaWYgKG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCkgPiAwKSB7CisgICAgQWRqdXN0RXh0ZW5zaW9uUmFuZ2VzV2l0aE1heEVuZE51bWJlcihtZXNzYWdlKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZVN0YXRlbWVudChEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pIHsKKyAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgTlVMTCkpIHsKKyAgICAvLyBlbXB0eSBzdGF0ZW1lbnQ7IGlnbm9yZQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgibWVzc2FnZSIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprTmVzdGVkVHlwZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+bmVzdGVkX3R5cGVfc2l6ZSgpKTsKKyAgICByZXR1cm4gUGFyc2VNZXNzYWdlRGVmaW5pdGlvbihtZXNzYWdlLT5hZGRfbmVzdGVkX3R5cGUoKSwgbG9jYXRpb24pOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZW51bSIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmVudW1fdHlwZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZUVudW1EZWZpbml0aW9uKG1lc3NhZ2UtPmFkZF9lbnVtX3R5cGUoKSwgbG9jYXRpb24pOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZXh0ZW5zaW9ucyIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlcik7CisgICAgcmV0dXJuIFBhcnNlRXh0ZW5zaW9ucyhtZXNzYWdlLCBsb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJleHRlbmQiKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvbkZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VFeHRlbmQobWVzc2FnZS0+bXV0YWJsZV9leHRlbnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VPcHRpb24obWVzc2FnZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uLCBPUFRJT05fU1RBVEVNRU5UKTsKKyAgfSBlbHNlIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtGaWVsZEZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZmllbGRfc2l6ZSgpKTsKKyAgICByZXR1cm4gUGFyc2VNZXNzYWdlRmllbGQobWVzc2FnZS0+YWRkX2ZpZWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPm11dGFibGVfbmVzdGVkX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprTmVzdGVkVHlwZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZUZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbikgeworICAvLyBQYXJzZSBsYWJlbCBhbmQgdHlwZS4KKyAgaW86OlRva2VuaXplcjo6VG9rZW4gbGFiZWxfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0xhYmVsRmllbGROdW1iZXIpOworICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbDsKKyAgICBETyhQYXJzZUxhYmVsKCZsYWJlbCkpOworICAgIGZpZWxkLT5zZXRfbGFiZWwobGFiZWwpOworICB9CisKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24pOyAgLy8gYWRkIHBhdGggbGF0ZXIKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFKTsKKworICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUgPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjsKKyAgICBzdHJpbmcgdHlwZV9uYW1lOworICAgIERPKFBhcnNlVHlwZSgmdHlwZSwgJnR5cGVfbmFtZSkpOworICAgIGlmICh0eXBlX25hbWUuZW1wdHkoKSkgeworICAgICAgbG9jYXRpb24uQWRkUGF0aChGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVGaWVsZE51bWJlcik7CisgICAgICBmaWVsZC0+c2V0X3R5cGUodHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxvY2F0aW9uLkFkZFBhdGgoRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlTmFtZUZpZWxkTnVtYmVyKTsKKyAgICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKHR5cGVfbmFtZSk7CisgICAgfQorICB9CisKKyAgLy8gUGFyc2UgbmFtZSBhbmQgJz0nLgorICBpbzo6VG9rZW5pemVyOjpUb2tlbiBuYW1lX3Rva2VuID0gaW5wdXRfLT5jdXJyZW50KCk7CisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKGZpZWxkLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGZpZWxkLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIGZpZWxkIG5hbWUuIikpOworICB9CisgIERPKENvbnN1bWUoIj0iLCAiTWlzc2luZyBmaWVsZCBudW1iZXIuIikpOworCisgIC8vIFBhcnNlIGZpZWxkIG51bWJlci4KKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a051bWJlckZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgZmllbGQsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSKTsKKyAgICBpbnQgbnVtYmVyOworICAgIERPKENvbnN1bWVJbnRlZ2VyKCZudW1iZXIsICJFeHBlY3RlZCBmaWVsZCBudW1iZXIuIikpOworICAgIGZpZWxkLT5zZXRfbnVtYmVyKG51bWJlcik7CisgIH0KKworICAvLyBQYXJzZSBvcHRpb25zLgorICBETyhQYXJzZUZpZWxkT3B0aW9ucyhmaWVsZCwgZmllbGRfbG9jYXRpb24pKTsKKworICAvLyBEZWFsIHdpdGggZ3JvdXBzLgorICBpZiAoZmllbGQtPmhhc190eXBlKCkgJiYgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9HUk9VUCkgeworICAgIC8vIEF3a3dhcmQ6ICBTaW5jZSBhIGdyb3VwIGRlY2xhcmVzIGJvdGggYSBtZXNzYWdlIHR5cGUgYW5kIGEgZmllbGQsIHdlCisgICAgLy8gICBoYXZlIHRvIGNyZWF0ZSBvdmVybGFwcGluZyBsb2NhdGlvbnMuCisgICAgTG9jYXRpb25SZWNvcmRlciBncm91cF9sb2NhdGlvbihwYXJlbnRfbG9jYXRpb24pOworICAgIGdyb3VwX2xvY2F0aW9uLlN0YXJ0QXQobGFiZWxfdG9rZW4pOworICAgIGdyb3VwX2xvY2F0aW9uLkFkZFBhdGgobG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSk7CisgICAgZ3JvdXBfbG9jYXRpb24uQWRkUGF0aChtZXNzYWdlcy0+c2l6ZSgpKTsKKworICAgIERlc2NyaXB0b3JQcm90byogZ3JvdXAgPSBtZXNzYWdlcy0+QWRkKCk7CisgICAgZ3JvdXAtPnNldF9uYW1lKGZpZWxkLT5uYW1lKCkpOworCisgICAgLy8gUmVjb3JkIG5hbWUgbG9jYXRpb24gdG8gbWF0Y2ggdGhlIGZpZWxkIG5hbWUncyBsb2NhdGlvbi4KKyAgICB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGdyb3VwX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgICAgbG9jYXRpb24uU3RhcnRBdChuYW1lX3Rva2VuKTsKKyAgICAgIGxvY2F0aW9uLkVuZEF0KG5hbWVfdG9rZW4pOworICAgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgICAgZ3JvdXAsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgfQorCisgICAgLy8gVGhlIGZpZWxkJ3MgdHlwZV9uYW1lIGFsc28gY29tZXMgZnJvbSB0aGUgbmFtZS4gIENvbmZ1c2luZyEKKyAgICB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVOYW1lRmllbGROdW1iZXIpOworICAgICAgbG9jYXRpb24uU3RhcnRBdChuYW1lX3Rva2VuKTsKKyAgICAgIGxvY2F0aW9uLkVuZEF0KG5hbWVfdG9rZW4pOworICAgIH0KKworICAgIC8vIEFzIGEgaGFjayBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHksIHdlIGZvcmNlIHRoZSBncm91cCBuYW1lIHRvIHN0YXJ0CisgICAgLy8gd2l0aCBhIGNhcGl0YWwgbGV0dGVyIGFuZCBsb3dlci1jYXNlIHRoZSBmaWVsZCBuYW1lLiAgTmV3IGNvZGUgc2hvdWxkCisgICAgLy8gbm90IHVzZSBncm91cHM7IGl0IHNob3VsZCB1c2UgbmVzdGVkIG1lc3NhZ2VzLgorICAgIGlmIChncm91cC0+bmFtZSgpWzBdIDwgJ0EnIHx8ICdaJyA8IGdyb3VwLT5uYW1lKClbMF0pIHsKKyAgICAgIEFkZEVycm9yKG5hbWVfdG9rZW4ubGluZSwgbmFtZV90b2tlbi5jb2x1bW4sCisgICAgICAgICJHcm91cCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci4iKTsKKyAgICB9CisgICAgTG93ZXJTdHJpbmcoZmllbGQtPm11dGFibGVfbmFtZSgpKTsKKworICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKGdyb3VwLT5uYW1lKCkpOworICAgIGlmIChMb29raW5nQXQoInsiKSkgeworICAgICAgRE8oUGFyc2VNZXNzYWdlQmxvY2soZ3JvdXAsIGdyb3VwX2xvY2F0aW9uKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVycm9yKCJNaXNzaW5nIGdyb3VwIGJvZHkuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmZpZWxkX2xvY2F0aW9uKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRmllbGRPcHRpb25zKEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbikgeworICBpZiAoIUxvb2tpbmdBdCgiWyIpKSByZXR1cm4gdHJ1ZTsKKworICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKworICBETyhDb25zdW1lKCJbIikpOworCisgIC8vIFBhcnNlIGZpZWxkIG9wdGlvbnMuCisgIGRvIHsKKyAgICBpZiAoTG9va2luZ0F0KCJkZWZhdWx0IikpIHsKKyAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcGFzcyBmaWVsZF9sb2NhdGlvbiByYXRoZXIgdGhhbiBsb2NhdGlvbiBoZXJlLCBzaW5jZQorICAgICAgLy8gdGhlIGRlZmF1bHQgdmFsdWUgaXMgbm90IGFjdHVhbGx5IGFuIG9wdGlvbi4KKyAgICAgIERPKFBhcnNlRGVmYXVsdEFzc2lnbm1lbnQoZmllbGQsIGZpZWxkX2xvY2F0aW9uKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERPKFBhcnNlT3B0aW9uKGZpZWxkLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24sIE9QVElPTl9BU1NJR05NRU5UKSk7CisgICAgfQorICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOworCisgIERPKENvbnN1bWUoIl0iKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VEZWZhdWx0QXNzaWdubWVudChGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbikgeworICBpZiAoZmllbGQtPmhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICBBZGRFcnJvcigiQWxyZWFkeSBzZXQgb3B0aW9uIFwiZGVmYXVsdFwiLiIpOworICAgIGZpZWxkLT5jbGVhcl9kZWZhdWx0X3ZhbHVlKCk7CisgIH0KKworICBETyhDb25zdW1lKCJkZWZhdWx0IikpOworICBETyhDb25zdW1lKCI9IikpOworCisgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtEZWZhdWx0VmFsdWVGaWVsZE51bWJlcik7CisgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgZmllbGQsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSk7CisgIHN0cmluZyogZGVmYXVsdF92YWx1ZSA9IGZpZWxkLT5tdXRhYmxlX2RlZmF1bHRfdmFsdWUoKTsKKworICBpZiAoIWZpZWxkLT5oYXNfdHlwZSgpKSB7CisgICAgLy8gVGhlIGZpZWxkIGhhcyBhIHR5cGUgbmFtZSwgYnV0IHdlIGRvbid0IGtub3cgaWYgaXQgaXMgYSBtZXNzYWdlIG9yIGFuCisgICAgLy8gZW51bSB5ZXQuICBBc3N1bWUgYW4gZW51bSBmb3Igbm93LgorICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVENjQ6IHsKKyAgICAgIHVpbnQ2NCBtYXhfdmFsdWUgPSBraW50NjRtYXg7CisgICAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMiB8fAorICAgICAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0lOVDMyIHx8CisgICAgICAgICAgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQzMikgeworICAgICAgICBtYXhfdmFsdWUgPSBraW50MzJtYXg7CisgICAgICB9CisKKyAgICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBuZWdhdGl2ZS4KKyAgICAgIGlmIChUcnlDb25zdW1lKCItIikpIHsKKyAgICAgICAgZGVmYXVsdF92YWx1ZS0+YXBwZW5kKCItIik7CisgICAgICAgIC8vIFR3bydzIGNvbXBsZW1lbnQgYWx3YXlzIGhhcyBvbmUgbW9yZSBuZWdhdGl2ZSB2YWx1ZSB0aGFuIHBvc2l0aXZlLgorICAgICAgICArK21heF92YWx1ZTsKKyAgICAgIH0KKyAgICAgIC8vIFBhcnNlIHRoZSBpbnRlZ2VyIHRvIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCBvdXQtb2YtcmFuZ2UuCisgICAgICB1aW50NjQgdmFsdWU7CisgICAgICBETyhDb25zdW1lSW50ZWdlcjY0KG1heF92YWx1ZSwgJnZhbHVlLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7CisgICAgICAvLyBBbmQgc3RyaW5naWZ5IGl0IGFnYWluLgorICAgICAgZGVmYXVsdF92YWx1ZS0+YXBwZW5kKFNpbXBsZUl0b2EodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVENjQ6IHsKKyAgICAgIHVpbnQ2NCBtYXhfdmFsdWUgPSBrdWludDY0bWF4OworICAgICAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDMyIHx8CisgICAgICAgICAgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDMyKSB7CisgICAgICAgIG1heF92YWx1ZSA9IGt1aW50MzJtYXg7CisgICAgICB9CisKKyAgICAgIC8vIE51bWVyaWMsIG5vdCBuZWdhdGl2ZS4KKyAgICAgIGlmIChUcnlDb25zdW1lKCItIikpIHsKKyAgICAgICAgQWRkRXJyb3IoIlVuc2lnbmVkIGZpZWxkIGNhbid0IGhhdmUgbmVnYXRpdmUgZGVmYXVsdCB2YWx1ZS4iKTsKKyAgICAgIH0KKyAgICAgIC8vIFBhcnNlIHRoZSBpbnRlZ2VyIHRvIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCBvdXQtb2YtcmFuZ2UuCisgICAgICB1aW50NjQgdmFsdWU7CisgICAgICBETyhDb25zdW1lSW50ZWdlcjY0KG1heF92YWx1ZSwgJnZhbHVlLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7CisgICAgICAvLyBBbmQgc3RyaW5naWZ5IGl0IGFnYWluLgorICAgICAgZGVmYXVsdF92YWx1ZS0+YXBwZW5kKFNpbXBsZUl0b2EodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEU6CisgICAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgbmVnYXRpdmUuCisgICAgICBpZiAoVHJ5Q29uc3VtZSgiLSIpKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZCgiLSIpOworICAgICAgfQorICAgICAgLy8gUGFyc2UgdGhlIGludGVnZXIgYmVjYXVzZSB3ZSBoYXZlIHRvIGNvbnZlcnQgaGV4IGludGVnZXJzIHRvIGRlY2ltYWwKKyAgICAgIC8vIGZsb2F0cy4KKyAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgIERPKENvbnN1bWVOdW1iZXIoJnZhbHVlLCAiRXhwZWN0ZWQgbnVtYmVyLiIpKTsKKyAgICAgIC8vIEFuZCBzdHJpbmdpZnkgaXQgYWdhaW4uCisgICAgICBkZWZhdWx0X3ZhbHVlLT5hcHBlbmQoU2ltcGxlRHRvYSh2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JPT0w6CisgICAgICBpZiAoVHJ5Q29uc3VtZSgidHJ1ZSIpKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWUtPmFzc2lnbigidHJ1ZSIpOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJmYWxzZSIpKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWUtPmFzc2lnbigiZmFsc2UiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBcInRydWVcIiBvciBcImZhbHNlXCIuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkc6CisgICAgICBETyhDb25zdW1lU3RyaW5nKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBzdHJpbmcuIikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTOgorICAgICAgRE8oQ29uc3VtZVN0cmluZyhkZWZhdWx0X3ZhbHVlLCAiRXhwZWN0ZWQgc3RyaW5nLiIpKTsKKyAgICAgICpkZWZhdWx0X3ZhbHVlID0gQ0VzY2FwZSgqZGVmYXVsdF92YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTToKKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVA6CisgICAgICBBZGRFcnJvcigiTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VPcHRpb25OYW1lUGFydChVbmludGVycHJldGVkT3B0aW9uKiB1bmludGVycHJldGVkX29wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcnRfbG9jYXRpb24pIHsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbjo6TmFtZVBhcnQqIG5hbWUgPSB1bmludGVycHJldGVkX29wdGlvbi0+YWRkX25hbWUoKTsKKyAgc3RyaW5nIGlkZW50aWZpZXI7ICAvLyBXZSBwYXJzZSBpZGVudGlmaWVycyBpbnRvIHRoaXMgc3RyaW5nLgorICBpZiAoTG9va2luZ0F0KCIoIikpIHsgIC8vIFRoaXMgaXMgYW4gZXh0ZW5zaW9uLgorICAgIERPKENvbnN1bWUoIigiKSk7CisKKyAgICB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICAgIHBhcnRfbG9jYXRpb24sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ok5hbWVQYXJ0OjprTmFtZVBhcnRGaWVsZE51bWJlcik7CisgICAgICAvLyBBbiBleHRlbnNpb24gbmFtZSBjb25zaXN0cyBvZiBkb3Qtc2VwYXJhdGVkIGlkZW50aWZpZXJzLCBhbmQgbWF5IGJlZ2luCisgICAgICAvLyB3aXRoIGEgZG90LgorICAgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmaWRlbnRpZmllciwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOworICAgICAgICBuYW1lLT5tdXRhYmxlX25hbWVfcGFydCgpLT5hcHBlbmQoaWRlbnRpZmllcik7CisgICAgICB9CisgICAgICB3aGlsZSAoTG9va2luZ0F0KCIuIikpIHsKKyAgICAgICAgRE8oQ29uc3VtZSgiLiIpKTsKKyAgICAgICAgbmFtZS0+bXV0YWJsZV9uYW1lX3BhcnQoKS0+YXBwZW5kKCIuIik7CisgICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7CisgICAgICAgIG5hbWUtPm11dGFibGVfbmFtZV9wYXJ0KCktPmFwcGVuZChpZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBETyhDb25zdW1lKCIpIikpOworICAgIG5hbWUtPnNldF9pc19leHRlbnNpb24odHJ1ZSk7CisgIH0gZWxzZSB7ICAvLyBUaGlzIGlzIGEgcmVndWxhciBmaWVsZC4KKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICBwYXJ0X2xvY2F0aW9uLCBVbmludGVycHJldGVkT3B0aW9uOjpOYW1lUGFydDo6a05hbWVQYXJ0RmllbGROdW1iZXIpOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7CisgICAgbmFtZS0+bXV0YWJsZV9uYW1lX3BhcnQoKS0+YXBwZW5kKGlkZW50aWZpZXIpOworICAgIG5hbWUtPnNldF9pc19leHRlbnNpb24oZmFsc2UpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VVbmludGVycHJldGVkQmxvY2soc3RyaW5nKiB2YWx1ZSkgeworICAvLyBOb3RlIHRoYXQgZW5jbG9zaW5nIGJyYWNlcyBhcmUgbm90IGFkZGVkIHRvICp2YWx1ZS4KKyAgLy8gV2UgZG8gTk9UIHVzZSBDb25zdW1lRW5kT2ZTdGF0ZW1lbnQgZm9yIHRoaXMgYnJhY2UgYmVjYXVzZSBpdCdzIGRlbGltaXRpbmcKKyAgLy8gYW4gZXhwcmVzc2lvbiwgbm90IGEgYmxvY2sgb2Ygc3RhdGVtZW50cy4KKyAgRE8oQ29uc3VtZSgieyIpKTsKKyAgaW50IGJyYWNlX2RlcHRoID0gMTsKKyAgd2hpbGUgKCFBdEVuZCgpKSB7CisgICAgaWYgKExvb2tpbmdBdCgieyIpKSB7CisgICAgICBicmFjZV9kZXB0aCsrOworICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJ9IikpIHsKKyAgICAgIGJyYWNlX2RlcHRoLS07CisgICAgICBpZiAoYnJhY2VfZGVwdGggPT0gMCkgeworICAgICAgICBpbnB1dF8tPk5leHQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIC8vIFRPRE8oc2FuamF5KTogSW50ZXJwcmV0IGxpbmUvY29sdW1uIG51bWJlcnMgdG8gcHJlc2VydmUgZm9ybWF0dGluZworICAgIGlmICghdmFsdWUtPmVtcHR5KCkpIHZhbHVlLT5wdXNoX2JhY2soJyAnKTsKKyAgICB2YWx1ZS0+YXBwZW5kKGlucHV0Xy0+Y3VycmVudCgpLnRleHQpOworICAgIGlucHV0Xy0+TmV4dCgpOworICB9CisgIEFkZEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0gd2hpbGUgcGFyc2luZyBhZ2dyZWdhdGUgdmFsdWUuIik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gV2UgZG9uJ3QgaW50ZXJwcmV0IHRoZSBvcHRpb24gaGVyZS4gSW5zdGVhZCB3ZSBzdG9yZSBpdCBpbiBhbgorLy8gVW5pbnRlcnByZXRlZE9wdGlvbiwgdG8gYmUgaW50ZXJwcmV0ZWQgbGF0ZXIuCitib29sIFBhcnNlcjo6UGFyc2VPcHRpb24oTWVzc2FnZSogb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvcHRpb25zX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvblN0eWxlIHN0eWxlKSB7CisgIC8vIENyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgdW5pbnRlcnByZXRlZF9vcHRpb24gZmllbGQuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdW5pbnRlcnByZXRlZF9vcHRpb25fZmllbGQgPSBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPgorICAgICAgRmluZEZpZWxkQnlOYW1lKCJ1bmludGVycHJldGVkX29wdGlvbiIpOworICBHT09HTEVfQ0hFQ0sodW5pbnRlcnByZXRlZF9vcHRpb25fZmllbGQgIT0gTlVMTCkKKyAgICAgIDw8ICJObyBmaWVsZCBuYW1lZCBcInVuaW50ZXJwcmV0ZWRfb3B0aW9uXCIgaW4gdGhlIE9wdGlvbnMgcHJvdG8uIjsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpOworCisgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oCisgICAgICBvcHRpb25zX2xvY2F0aW9uLCB1bmludGVycHJldGVkX29wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkKSk7CisKKyAgaWYgKHN0eWxlID09IE9QVElPTl9TVEFURU1FTlQpIHsKKyAgICBETyhDb25zdW1lKCJvcHRpb24iKSk7CisgIH0KKworICBVbmludGVycHJldGVkT3B0aW9uKiB1bmludGVycHJldGVkX29wdGlvbiA9IGRvd25fY2FzdDxVbmludGVycHJldGVkT3B0aW9uKj4oCisgICAgICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkFkZE1lc3NhZ2Uob3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl9maWVsZCkpOworCisgIC8vIFBhcnNlIGRvdC1zZXBhcmF0ZWQgbmFtZS4KKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbmFtZV9sb2NhdGlvbihsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a05hbWVGaWVsZE51bWJlcik7CisgICAgbmFtZV9sb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1BUSU9OX05BTUUpOworCisgICAgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBwYXJ0X2xvY2F0aW9uKG5hbWVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPm5hbWVfc2l6ZSgpKTsKKyAgICAgIERPKFBhcnNlT3B0aW9uTmFtZVBhcnQodW5pbnRlcnByZXRlZF9vcHRpb24sIHBhcnRfbG9jYXRpb24pKTsKKyAgICB9CisKKyAgICB3aGlsZSAoTG9va2luZ0F0KCIuIikpIHsKKyAgICAgIERPKENvbnN1bWUoIi4iKSk7CisgICAgICBMb2NhdGlvblJlY29yZGVyIHBhcnRfbG9jYXRpb24obmFtZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bmFtZV9zaXplKCkpOworICAgICAgRE8oUGFyc2VPcHRpb25OYW1lUGFydCh1bmludGVycHJldGVkX29wdGlvbiwgcGFydF9sb2NhdGlvbikpOworICAgIH0KKyAgfQorCisgIERPKENvbnN1bWUoIj0iKSk7CisKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgdmFsdWVfbG9jYXRpb24obG9jYXRpb24pOworICAgIHZhbHVlX2xvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICB1bmludGVycHJldGVkX29wdGlvbiwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fVkFMVUUpOworCisgICAgLy8gQWxsIHZhbHVlcyBhcmUgYSBzaW5nbGUgdG9rZW4sIGV4Y2VwdCBmb3IgbmVnYXRpdmUgbnVtYmVycywgd2hpY2ggY29uc2lzdAorICAgIC8vIG9mIGEgc2luZ2xlICctJyBzeW1ib2wsIGZvbGxvd2VkIGJ5IGEgcG9zaXRpdmUgbnVtYmVyLgorICAgIGJvb2wgaXNfbmVnYXRpdmUgPSBUcnlDb25zdW1lKCItIik7CisKKyAgICBzd2l0Y2ggKGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpIHsKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9TVEFSVDoKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byByZWFkIHZhbHVlIGJlZm9yZSBhbnkgdG9rZW5zIGhhdmUgYmVlbiByZWFkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX0VORDoKKyAgICAgICAgQWRkRXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSBwYXJzaW5nIG9wdGlvbiB2YWx1ZS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUjogeworICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKAorICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0lkZW50aWZpZXJWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7CisgICAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgJy0nIHN5bWJvbCBiZWZvcmUgaWRlbnRpZmllci4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmdmFsdWUsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9pZGVudGlmaWVyX3ZhbHVlKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSOiB7CisgICAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgICAgdWludDY0IG1heF92YWx1ZSA9CisgICAgICAgICAgICBpc19uZWdhdGl2ZSA/IHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWF4KSArIDEgOiBrdWludDY0bWF4OworICAgICAgICBETyhDb25zdW1lSW50ZWdlcjY0KG1heF92YWx1ZSwgJnZhbHVlLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7CisgICAgICAgIGlmIChpc19uZWdhdGl2ZSkgeworICAgICAgICAgIHZhbHVlX2xvY2F0aW9uLkFkZFBhdGgoCisgICAgICAgICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmtOZWdhdGl2ZUludFZhbHVlRmllbGROdW1iZXIpOworICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5zZXRfbmVnYXRpdmVfaW50X3ZhbHVlKAorICAgICAgICAgICAgICAtc3RhdGljX2Nhc3Q8aW50NjQ+KHZhbHVlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKKyAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a1Bvc2l0aXZlSW50VmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9wb3NpdGl2ZV9pbnRfdmFsdWUodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRkxPQVQ6IHsKKyAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aChVbmludGVycHJldGVkT3B0aW9uOjprRG91YmxlVmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZU51bWJlcigmdmFsdWUsICJFeHBlY3RlZCBudW1iZXIuIikpOworICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2RvdWJsZV92YWx1ZShpc19uZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkc6IHsKKyAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aChVbmludGVycHJldGVkT3B0aW9uOjprU3RyaW5nVmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgIGlmIChpc19uZWdhdGl2ZSkgeworICAgICAgICAgIEFkZEVycm9yKCJJbnZhbGlkICctJyBzeW1ib2wgYmVmb3JlIHN0cmluZy4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgICBETyhDb25zdW1lU3RyaW5nKCZ2YWx1ZSwgIkV4cGVjdGVkIHN0cmluZy4iKSk7CisgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5zZXRfc3RyaW5nX3ZhbHVlKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9TWU1CT0w6CisgICAgICAgIGlmIChMb29raW5nQXQoInsiKSkgeworICAgICAgICAgIHZhbHVlX2xvY2F0aW9uLkFkZFBhdGgoCisgICAgICAgICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmtBZ2dyZWdhdGVWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgICBETyhQYXJzZVVuaW50ZXJwcmV0ZWRCbG9jaygKKyAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPm11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgb3B0aW9uIHZhbHVlLiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoc3R5bGUgPT0gT1BUSU9OX1NUQVRFTUVOVCkgeworICAgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmxvY2F0aW9uKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRXh0ZW5zaW9ucyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGV4dGVuc2lvbnNfbG9jYXRpb24pIHsKKyAgLy8gUGFyc2UgdGhlIGRlY2xhcmF0aW9uLgorICBETyhDb25zdW1lKCJleHRlbnNpb25zIikpOworCisgIGRvIHsKKyAgICAvLyBOb3RlIHRoYXQga0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIgd2FzIGFscmVhZHkgcHVzaGVkIGJ5IHRoZSBwYXJlbnQuCisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihleHRlbnNpb25zX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9IG1lc3NhZ2UtPmFkZF9leHRlbnNpb25fcmFuZ2UoKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgcmFuZ2UsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSKTsKKworICAgIGludCBzdGFydCwgZW5kOworICAgIGlvOjpUb2tlbml6ZXI6OlRva2VuIHN0YXJ0X3Rva2VuOworCisgICAgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBzdGFydF9sb2NhdGlvbigKKyAgICAgICAgICBsb2NhdGlvbiwgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZTo6a1N0YXJ0RmllbGROdW1iZXIpOworICAgICAgc3RhcnRfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZzdGFydCwgIkV4cGVjdGVkIGZpZWxkIG51bWJlciByYW5nZS4iKSk7CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWUoInRvIikpIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAorICAgICAgICAgIGxvY2F0aW9uLCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlOjprRW5kRmllbGROdW1iZXIpOworICAgICAgaWYgKFRyeUNvbnN1bWUoIm1heCIpKSB7CisgICAgICAgIC8vIFNldCB0byB0aGUgc2VudGluZWwgdmFsdWUgLSAxIHNpbmNlIHdlIGluY3JlbWVudCB0aGUgdmFsdWUgYmVsb3cuCisgICAgICAgIC8vIFRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugc2hvdWxkIGJlIHNldCB3aXRoCisgICAgICAgIC8vIEFkanVzdEV4dGVuc2lvblJhbmdlc1dpdGhNYXhFbmROdW1iZXIuCisgICAgICAgIGVuZCA9IGtNYXhFeHRlbnNpb25SYW5nZVNlbnRpbmVsIC0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZlbmQsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBlbmRfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2U6OmtFbmRGaWVsZE51bWJlcik7CisgICAgICBlbmRfbG9jYXRpb24uU3RhcnRBdChzdGFydF90b2tlbik7CisgICAgICBlbmRfbG9jYXRpb24uRW5kQXQoc3RhcnRfdG9rZW4pOworICAgICAgZW5kID0gc3RhcnQ7CisgICAgfQorCisgICAgLy8gVXNlcnMgbGlrZSB0byBzcGVjaWZ5IGluY2x1c2l2ZSByYW5nZXMsIGJ1dCBpbiBjb2RlIHdlIGxpa2UgdGhlIGVuZAorICAgIC8vIG51bWJlciB0byBiZSBleGNsdXNpdmUuCisgICAgKytlbmQ7CisKKyAgICByYW5nZS0+c2V0X3N0YXJ0KHN0YXJ0KTsKKyAgICByYW5nZS0+c2V0X2VuZChlbmQpOworICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOworCisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmV4dGVuc2lvbnNfbG9jYXRpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZUV4dGVuZChSZXBlYXRlZFB0ckZpZWxkPEZpZWxkRGVzY3JpcHRvclByb3RvPiogZXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBleHRlbmRfbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZSgiZXh0ZW5kIikpOworCisgIC8vIFBhcnNlIHRoZSBleHRlbmRlZSB0eXBlLgorICBpbzo6VG9rZW5pemVyOjpUb2tlbiBleHRlbmRlZV9zdGFydCA9IGlucHV0Xy0+Y3VycmVudCgpOworICBzdHJpbmcgZXh0ZW5kZWU7CisgIERPKFBhcnNlVXNlckRlZmluZWRUeXBlKCZleHRlbmRlZSkpOworICBpbzo6VG9rZW5pemVyOjpUb2tlbiBleHRlbmRlZV9lbmQgPSBpbnB1dF8tPnByZXZpb3VzKCk7CisKKyAgLy8gUGFyc2UgdGhlIGJsb2NrLgorICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZleHRlbmRfbG9jYXRpb24pKTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKworICBkbyB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBleHRlbmQgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCBrRXh0ZW5zaW9uRmllbGROdW1iZXIgd2FzIGFscmVhZHkgcHVzaGVkIGJ5IHRoZSBwYXJlbnQuCisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihleHRlbmRfbG9jYXRpb24sIGV4dGVuc2lvbnMtPnNpemUoKSk7CisKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBleHRlbnNpb25zLT5BZGQoKTsKKworICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZXh0ZW5kZWVfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIEZpZWxkRGVzY3JpcHRvclByb3RvOjprRXh0ZW5kZWVGaWVsZE51bWJlcik7CisgICAgICBleHRlbmRlZV9sb2NhdGlvbi5TdGFydEF0KGV4dGVuZGVlX3N0YXJ0KTsKKyAgICAgIGV4dGVuZGVlX2xvY2F0aW9uLkVuZEF0KGV4dGVuZGVlX2VuZCk7CisKKyAgICAgIGlmIChpc19maXJzdCkgeworICAgICAgICBleHRlbmRlZV9sb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgICAgIGZpZWxkLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFKTsKKyAgICAgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmaWVsZC0+c2V0X2V4dGVuZGVlKGV4dGVuZGVlKTsKKworICAgIGlmICghUGFyc2VNZXNzYWdlRmllbGQoZmllbGQsIG1lc3NhZ2VzLCBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pKSB7CisgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCisgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgU2tpcFN0YXRlbWVudCgpOworICAgIH0KKyAgfSB3aGlsZSAoIVRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgTlVMTCkpOworCisgIHJldHVybiB0cnVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnVtcworCitib29sIFBhcnNlcjo6UGFyc2VFbnVtRGVmaW5pdGlvbihFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uKSB7CisgIERPKENvbnN1bWUoImVudW0iKSk7CisKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZW51bV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBlbnVtX3R5cGUsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoZW51bV90eXBlLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIGVudW0gbmFtZS4iKSk7CisgIH0KKworICBETyhQYXJzZUVudW1CbG9jayhlbnVtX3R5cGUsIGVudW1fbG9jYXRpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZUVudW1CbG9jayhFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbikgeworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZlbnVtX2xvY2F0aW9uKSk7CisKKyAgd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBlbnVtIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVBhcnNlRW51bVN0YXRlbWVudChlbnVtX3R5cGUsIGVudW1fbG9jYXRpb24pKSB7CisgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCisgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgU2tpcFN0YXRlbWVudCgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VFbnVtU3RhdGVtZW50KEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbikgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgeworICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvcHRpb24iKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZW51bV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZU9wdGlvbihlbnVtX3R5cGUtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX1NUQVRFTUVOVCk7CisgIH0gZWxzZSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihlbnVtX2xvY2F0aW9uLAorICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprVmFsdWVGaWVsZE51bWJlciwgZW51bV90eXBlLT52YWx1ZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZUVudW1Db25zdGFudChlbnVtX3R5cGUtPmFkZF92YWx1ZSgpLCBsb2NhdGlvbik7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50KEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZW51bV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uKSB7CisgIC8vIFBhcnNlIG5hbWUuCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGVudW1fdmFsdWVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBlbnVtX3ZhbHVlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGVudW1fdmFsdWUtPm11dGFibGVfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBlbnVtIGNvbnN0YW50IG5hbWUuIikpOworICB9CisKKyAgRE8oQ29uc3VtZSgiPSIsICJNaXNzaW5nIG51bWVyaWMgdmFsdWUgZm9yIGVudW0gY29uc3RhbnQuIikpOworCisgIC8vIFBhcnNlIHZhbHVlLgorICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKKyAgICAgICAgZW51bV92YWx1ZV9sb2NhdGlvbiwgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprTnVtYmVyRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBlbnVtX3ZhbHVlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7CisKKyAgICBpbnQgbnVtYmVyOworICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZudW1iZXIsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICBlbnVtX3ZhbHVlLT5zZXRfbnVtYmVyKG51bWJlcik7CisgIH0KKworICBETyhQYXJzZUVudW1Db25zdGFudE9wdGlvbnMoZW51bV92YWx1ZSwgZW51bV92YWx1ZV9sb2NhdGlvbikpOworCisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmVudW1fdmFsdWVfbG9jYXRpb24pKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50T3B0aW9ucygKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHZhbHVlLAorICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24pIHsKKyAgaWYgKCFMb29raW5nQXQoIlsiKSkgcmV0dXJuIHRydWU7CisKKyAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKKyAgICAgIGVudW1fdmFsdWVfbG9jYXRpb24sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7CisKKyAgRE8oQ29uc3VtZSgiWyIpKTsKKworICBkbyB7CisgICAgRE8oUGFyc2VPcHRpb24odmFsdWUtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwgT1BUSU9OX0FTU0lHTk1FTlQpKTsKKyAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKKworICBETyhDb25zdW1lKCJdIikpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2VydmljZXMKKworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZURlZmluaXRpb24oU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZSgic2VydmljZSIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihzZXJ2aWNlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgIHNlcnZpY2UsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoc2VydmljZS0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBzZXJ2aWNlIG5hbWUuIikpOworICB9CisKKyAgRE8oUGFyc2VTZXJ2aWNlQmxvY2soc2VydmljZSwgc2VydmljZV9sb2NhdGlvbikpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZUJsb2NrKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbikgeworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZzZXJ2aWNlX2xvY2F0aW9uKSk7CisKKyAgd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBzZXJ2aWNlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVBhcnNlU2VydmljZVN0YXRlbWVudChzZXJ2aWNlLCBzZXJ2aWNlX2xvY2F0aW9uKSkgeworICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQorICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KKyAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZVN0YXRlbWVudChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uKSB7CisgIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsIE5VTEwpKSB7CisgICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKKyAgICAgICAgc2VydmljZV9sb2NhdGlvbiwgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7CisgICAgcmV0dXJuIFBhcnNlT3B0aW9uKHNlcnZpY2UtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwgT1BUSU9OX1NUQVRFTUVOVCk7CisgIH0gZWxzZSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihzZXJ2aWNlX2xvY2F0aW9uLAorICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTWV0aG9kRmllbGROdW1iZXIsIHNlcnZpY2UtPm1ldGhvZF9zaXplKCkpOworICAgIHJldHVybiBQYXJzZVNlcnZpY2VNZXRob2Qoc2VydmljZS0+YWRkX21ldGhvZCgpLCBsb2NhdGlvbik7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZU1ldGhvZChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWV0aG9kX2xvY2F0aW9uKSB7CisgIERPKENvbnN1bWUoInJwYyIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXRob2RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBtZXRob2QsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIobWV0aG9kLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIG1ldGhvZCBuYW1lLiIpKTsKKyAgfQorCisgIC8vIFBhcnNlIGlucHV0IHR5cGUuCisgIERPKENvbnN1bWUoIigiKSk7CisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a0lucHV0VHlwZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgbWV0aG9kLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OklOUFVUX1RZUEUpOworICAgIERPKFBhcnNlVXNlckRlZmluZWRUeXBlKG1ldGhvZC0+bXV0YWJsZV9pbnB1dF90eXBlKCkpKTsKKyAgfQorICBETyhDb25zdW1lKCIpIikpOworCisgIC8vIFBhcnNlIG91dHB1dCB0eXBlLgorICBETyhDb25zdW1lKCJyZXR1cm5zIikpOworICBETyhDb25zdW1lKCIoIikpOworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXRob2RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtPdXRwdXRUeXBlRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBtZXRob2QsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1VUUFVUX1RZUEUpOworICAgIERPKFBhcnNlVXNlckRlZmluZWRUeXBlKG1ldGhvZC0+bXV0YWJsZV9vdXRwdXRfdHlwZSgpKSk7CisgIH0KKyAgRE8oQ29uc3VtZSgiKSIpKTsKKworICBpZiAoTG9va2luZ0F0KCJ7IikpIHsKKyAgICAvLyBPcHRpb25zIQorICAgIERPKFBhcnNlT3B0aW9ucyhtZXRob2RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLT5tdXRhYmxlX29wdGlvbnMoKSkpOworICB9IGVsc2UgeworICAgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJm1ldGhvZF9sb2NhdGlvbikpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBQYXJzZXI6OlBhcnNlT3B0aW9ucyhjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG11dGFibGVfb3B0aW9ucykgeworICAvLyBPcHRpb25zIQorICBDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZwYXJlbnRfbG9jYXRpb24pOworICB3aGlsZSAoIVRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgTlVMTCkpIHsKKyAgICBpZiAoQXRFbmQoKSkgeworICAgICAgQWRkRXJyb3IoIlJlYWNoZWQgZW5kIG9mIGlucHV0IGluIG1ldGhvZCBvcHRpb25zIChtaXNzaW5nICd9JykuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgTlVMTCkpIHsKKyAgICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgfSBlbHNlIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zRmllbGROdW1iZXIpOworICAgICAgaWYgKCFQYXJzZU9wdGlvbihtdXRhYmxlX29wdGlvbnMsIGxvY2F0aW9uLCBPUFRJT05fU1RBVEVNRU5UKSkgeworICAgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvCisgICAgICAgIC8vIHBhcnNlIG90aGVyIHN0YXRlbWVudHMuCisgICAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitib29sIFBhcnNlcjo6UGFyc2VMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWwqIGxhYmVsKSB7CisgIGlmIChUcnlDb25zdW1lKCJvcHRpb25hbCIpKSB7CisgICAgKmxhYmVsID0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoInJlcGVhdGVkIikpIHsKKyAgICAqbGFiZWwgPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVQRUFURUQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgicmVxdWlyZWQiKSkgeworICAgICpsYWJlbCA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcigiRXhwZWN0ZWQgXCJyZXF1aXJlZFwiLCBcIm9wdGlvbmFsXCIsIG9yIFwicmVwZWF0ZWRcIi4iKTsKKyAgICAvLyBXZSBjYW4gYWN0dWFsbHkgcmVhc29uYWJseSByZWNvdmVyIGhlcmUgYnkganVzdCBhc3N1bWluZyB0aGUgdXNlcgorICAgIC8vIGZvcmdvdCB0aGUgbGFiZWwgYWx0b2dldGhlci4KKyAgICAqbGFiZWwgPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OlBhcnNlVHlwZShGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiB0eXBlX25hbWUpIHsKKyAgVHlwZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBrVHlwZU5hbWVzLmZpbmQoaW5wdXRfLT5jdXJyZW50KCkudGV4dCk7CisgIGlmIChpdGVyICE9IGtUeXBlTmFtZXMuZW5kKCkpIHsKKyAgICAqdHlwZSA9IGl0ZXItPnNlY29uZDsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgfSBlbHNlIHsKKyAgICBETyhQYXJzZVVzZXJEZWZpbmVkVHlwZSh0eXBlX25hbWUpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlVXNlckRlZmluZWRUeXBlKHN0cmluZyogdHlwZV9uYW1lKSB7CisgIHR5cGVfbmFtZS0+Y2xlYXIoKTsKKworICBUeXBlTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGtUeXBlTmFtZXMuZmluZChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0KTsKKyAgaWYgKGl0ZXIgIT0ga1R5cGVOYW1lcy5lbmQoKSkgeworICAgIC8vIE5vdGU6ICBUaGUgb25seSBwbGFjZSBlbnVtIHR5cGVzIGFyZSBhbGxvd2VkIGlzIGZvciBmaWVsZCB0eXBlcywgYnV0CisgICAgLy8gICBpZiB3ZSBhcmUgcGFyc2luZyBhIGZpZWxkIHR5cGUgdGhlbiB3ZSB3b3VsZCBub3QgZ2V0IGhlcmUgYmVjYXVzZQorICAgIC8vICAgcHJpbWl0aXZlcyBhcmUgYWxsb3dlZCB0aGVyZSBhcyB3ZWxsLiAgU28gdGhpcyBlcnJvciBtZXNzYWdlIGRvZXNuJ3QKKyAgICAvLyAgIG5lZWQgdG8gYWNjb3VudCBmb3IgZW51bXMuCisgICAgQWRkRXJyb3IoIkV4cGVjdGVkIG1lc3NhZ2UgdHlwZS4iKTsKKworICAgIC8vIFByZXRlbmQgdG8gYWNjZXB0IHRoaXMgdHlwZSBzbyB0aGF0IHdlIGNhbiBnbyBvbiBwYXJzaW5nLgorICAgICp0eXBlX25hbWUgPSBpbnB1dF8tPmN1cnJlbnQoKS50ZXh0OworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQSBsZWFkaW5nICIuIiBtZWFucyB0aGUgbmFtZSBpcyBmdWxseS1xdWFsaWZpZWQuCisgIGlmIChUcnlDb25zdW1lKCIuIikpIHR5cGVfbmFtZS0+YXBwZW5kKCIuIik7CisKKyAgLy8gQ29uc3VtZSB0aGUgZmlyc3QgcGFydCBvZiB0aGUgbmFtZS4KKyAgc3RyaW5nIGlkZW50aWZpZXI7CisgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgdHlwZSBuYW1lLiIpKTsKKyAgdHlwZV9uYW1lLT5hcHBlbmQoaWRlbnRpZmllcik7CisKKyAgLy8gQ29uc3VtZSBtb3JlIHBhcnRzLgorICB3aGlsZSAoVHJ5Q29uc3VtZSgiLiIpKSB7CisgICAgdHlwZV9uYW1lLT5hcHBlbmQoIi4iKTsKKyAgICBETyhDb25zdW1lSWRlbnRpZmllcigmaWRlbnRpZmllciwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOworICAgIHR5cGVfbmFtZS0+YXBwZW5kKGlkZW50aWZpZXIpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBQYXJzZXI6OlBhcnNlUGFja2FnZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uKSB7CisgIGlmIChmaWxlLT5oYXNfcGFja2FnZSgpKSB7CisgICAgQWRkRXJyb3IoIk11bHRpcGxlIHBhY2thZ2UgZGVmaW5pdGlvbnMuIik7CisgICAgLy8gRG9uJ3QgYXBwZW5kIHRoZSBuZXcgcGFja2FnZSB0byB0aGUgb2xkIG9uZS4gIEp1c3QgcmVwbGFjZSBpdC4gIE5vdAorICAgIC8vIHRoYXQgaXQgcmVhbGx5IG1hdHRlcnMgc2luY2UgdGhpcyBpcyBhbiBlcnJvciBhbnl3YXkuCisgICAgZmlsZS0+Y2xlYXJfcGFja2FnZSgpOworICB9CisKKyAgRE8oQ29uc3VtZSgicGFja2FnZSIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a1BhY2thZ2VGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oZmlsZSwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzdHJpbmcgaWRlbnRpZmllcjsKKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7CisgICAgICBmaWxlLT5tdXRhYmxlX3BhY2thZ2UoKS0+YXBwZW5kKGlkZW50aWZpZXIpOworICAgICAgaWYgKCFUcnlDb25zdW1lKCIuIikpIGJyZWFrOworICAgICAgZmlsZS0+bXV0YWJsZV9wYWNrYWdlKCktPmFwcGVuZCgiLiIpOworICAgIH0KKworICAgIGxvY2F0aW9uLkVuZEF0KGlucHV0Xy0+cHJldmlvdXMoKSk7CisKKyAgICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZsb2NhdGlvbikpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZUltcG9ydChSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qIGRlcGVuZGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMj4qIHB1YmxpY19kZXBlbmRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzI+KiB3ZWFrX2RlcGVuZGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbikgeworICBETyhDb25zdW1lKCJpbXBvcnQiKSk7CisgIGlmIChMb29raW5nQXQoInB1YmxpYyIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKKyAgICAgICAgcm9vdF9sb2NhdGlvbiwgRmlsZURlc2NyaXB0b3JQcm90bzo6a1B1YmxpY0RlcGVuZGVuY3lGaWVsZE51bWJlciwKKyAgICAgICAgcHVibGljX2RlcGVuZGVuY3ktPnNpemUoKSk7CisgICAgRE8oQ29uc3VtZSgicHVibGljIikpOworICAgICpwdWJsaWNfZGVwZW5kZW5jeS0+QWRkKCkgPSBkZXBlbmRlbmN5LT5zaXplKCk7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJ3ZWFrIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICByb290X2xvY2F0aW9uLCBGaWxlRGVzY3JpcHRvclByb3RvOjprV2Vha0RlcGVuZGVuY3lGaWVsZE51bWJlciwKKyAgICAgICAgd2Vha19kZXBlbmRlbmN5LT5zaXplKCkpOworICAgIERPKENvbnN1bWUoIndlYWsiKSk7CisgICAgKndlYWtfZGVwZW5kZW5jeS0+QWRkKCkgPSBkZXBlbmRlbmN5LT5zaXplKCk7CisgIH0KKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocm9vdF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtEZXBlbmRlbmN5RmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LT5zaXplKCkpOworICAgIERPKENvbnN1bWVTdHJpbmcoZGVwZW5kZW5jeS0+QWRkKCksCisgICAgICAiRXhwZWN0ZWQgYSBzdHJpbmcgbmFtaW5nIHRoZSBmaWxlIHRvIGltcG9ydC4iKSk7CisKKyAgICBsb2NhdGlvbi5FbmRBdChpbnB1dF8tPnByZXZpb3VzKCkpOworCisgICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbG9jYXRpb24pKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTb3VyY2VMb2NhdGlvblRhYmxlOjpTb3VyY2VMb2NhdGlvblRhYmxlKCkge30KK1NvdXJjZUxvY2F0aW9uVGFibGU6On5Tb3VyY2VMb2NhdGlvblRhYmxlKCkge30KKworYm9vbCBTb3VyY2VMb2NhdGlvblRhYmxlOjpGaW5kKAorICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgIGludCogbGluZSwgaW50KiBjb2x1bW4pIGNvbnN0IHsKKyAgY29uc3QgcGFpcjxpbnQsIGludD4qIHJlc3VsdCA9CisgICAgRmluZE9yTnVsbChsb2NhdGlvbl9tYXBfLCBtYWtlX3BhaXIoZGVzY3JpcHRvciwgbG9jYXRpb24pKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgKmxpbmUgICA9IC0xOworICAgICpjb2x1bW4gPSAwOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAqbGluZSAgID0gcmVzdWx0LT5maXJzdDsKKyAgICAqY29sdW1uID0gcmVzdWx0LT5zZWNvbmQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKwordm9pZCBTb3VyY2VMb2NhdGlvblRhYmxlOjpBZGQoCisgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgaW50IGxpbmUsIGludCBjb2x1bW4pIHsKKyAgbG9jYXRpb25fbWFwX1ttYWtlX3BhaXIoZGVzY3JpcHRvciwgbG9jYXRpb24pXSA9IG1ha2VfcGFpcihsaW5lLCBjb2x1bW4pOworfQorCit2b2lkIFNvdXJjZUxvY2F0aW9uVGFibGU6OkNsZWFyKCkgeworICBsb2NhdGlvbl9tYXBfLmNsZWFyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkMzY0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaApAQCAtMCwwICsxLDQ3NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gSW1wbGVtZW50cyBwYXJzaW5nIG9mIC5wcm90byBmaWxlcyB0byBGaWxlRGVzY3JpcHRvclByb3Rvcy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUEFSU0VSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUEFSU0VSX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7IGNsYXNzIE1lc3NhZ2U7IH0KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgUGFyc2VyOworY2xhc3MgU291cmNlTG9jYXRpb25UYWJsZTsKKworLy8gSW1wbGVtZW50cyBwYXJzaW5nIG9mIHByb3RvY29sIGRlZmluaXRpb25zIChzdWNoIGFzIC5wcm90byBmaWxlcykuCisvLworLy8gTm90ZSB0aGF0IG1vc3QgdXNlcnMgd2lsbCBiZSBtb3JlIGludGVyZXN0ZWQgaW4gdGhlIEltcG9ydGVyIGNsYXNzLgorLy8gUGFyc2VyIGlzIGEgbG93ZXItbGV2ZWwgY2xhc3Mgd2hpY2ggc2ltcGx5IGNvbnZlcnRzIGEgc2luZ2xlIC5wcm90byBmaWxlCisvLyB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8uICBJdCBkb2VzIG5vdCByZXNvbHZlIGltcG9ydCBkaXJlY3RpdmVzIG9yIHBlcmZvcm0KKy8vIG1hbnkgb3RoZXIga2luZHMgb2YgdmFsaWRhdGlvbiBuZWVkZWQgdG8gY29uc3RydWN0IGEgY29tcGxldGUKKy8vIEZpbGVEZXNjcmlwdG9yLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFBhcnNlciB7CisgcHVibGljOgorICBQYXJzZXIoKTsKKyAgflBhcnNlcigpOworCisgIC8vIFBhcnNlIHRoZSBlbnRpcmUgaW5wdXQgYW5kIGNvbnN0cnVjdCBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gcmVwcmVzZW50aW5nCisgIC8vIGl0LiAgUmV0dXJucyB0cnVlIGlmIG5vIGVycm9ycyBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFBhcnNlKGlvOjpUb2tlbml6ZXIqIGlucHV0LCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKTsKKworICAvLyBPcHRpb25hbCBmZXRhdXJlczoKKworICAvLyBERVBSRUNBVEVEOiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgU291cmNlQ29kZUluZm8gZW1iZWRkZWQgaW4gdGhlCisgIC8vICAgRmlsZURlc2NyaXB0b3JQcm90by4KKyAgLy8KKyAgLy8gUmVxdWVzdHMgdGhhdCBsb2NhdGlvbnMgb2YgY2VydGFpbiBkZWZpbml0aW9ucyBiZSByZWNvcmRlZCB0byB0aGUgZ2l2ZW4KKyAgLy8gU291cmNlTG9jYXRpb25UYWJsZSB3aGlsZSBwYXJzaW5nLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBsb29rIHVwIGV4YWN0IGxpbmUKKyAgLy8gYW5kIGNvbHVtbiBudW1iZXJzIGZvciBlcnJvcnMgcmVwb3J0ZWQgYnkgRGVzY3JpcHRvclBvb2wgZHVyaW5nIHZhbGlkYXRpb24uCisgIC8vIFNldCB0byBOVUxMICh0aGUgZGVmYXVsdCkgdG8gZGlzY2FyZCBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIHZvaWQgUmVjb3JkU291cmNlTG9jYXRpb25zVG8oU291cmNlTG9jYXRpb25UYWJsZSogbG9jYXRpb25fdGFibGUpIHsKKyAgICBzb3VyY2VfbG9jYXRpb25fdGFibGVfID0gbG9jYXRpb25fdGFibGU7CisgIH0KKworICAvLyBSZXF1ZXN0cyB0aGF0IGVycm9ycyBiZSByZWNvcmRlZCB0byB0aGUgZ2l2ZW4gRXJyb3JDb2xsZWN0b3Igd2hpbGUKKyAgLy8gcGFyc2luZy4gIFNldCB0byBOVUxMICh0aGUgZGVmYXVsdCkgdG8gZGlzY2FyZCBlcnJvciBtZXNzYWdlcy4KKyAgdm9pZCBSZWNvcmRFcnJvcnNUbyhpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgeworICAgIGVycm9yX2NvbGxlY3Rvcl8gPSBlcnJvcl9jb2xsZWN0b3I7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIHVzZWQgaW4gdGhlICJzeW50YXggPSAiIGRlY2xhcmF0aW9uLCBpZiBvbmUgd2FzCisgIC8vIHNlZW4gZHVyaW5nIHRoZSBsYXN0IGNhbGwgdG8gUGFyc2UoKSwgb3IgdGhlIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuCisgIGNvbnN0IHN0cmluZyYgR2V0U3ludGF4SWRlbnRpZmllcigpIHsgcmV0dXJuIHN5bnRheF9pZGVudGlmaWVyXzsgfQorCisgIC8vIElmIHNldCB0cnVlLCBpbnB1dCBmaWxlcyB3aWxsIGJlIHJlcXVpcmVkIHRvIGJlZ2luIHdpdGggYSBzeW50YXgKKyAgLy8gaWRlbnRpZmllci4gIE90aGVyd2lzZSwgZmlsZXMgbWF5IG9taXQgdGhpcy4gIElmIGEgc3ludGF4IGlkZW50aWZpZXIKKyAgLy8gaXMgcHJvdmlkZWQsIGl0IG11c3QgYmUgJ3N5bnRheCA9ICJwcm90bzIiOycgYW5kIG11c3QgYXBwZWFyIGF0IHRoZQorICAvLyB0b3Agb2YgdGhpcyBmaWxlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgaXQgd2FzIHJlcXVpcmVkLgorICB2b2lkIFNldFJlcXVpcmVTeW50YXhJZGVudGlmaWVyKGJvb2wgdmFsdWUpIHsKKyAgICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IHZhbHVlOworICB9CisKKyAgLy8gQ2FsbCBTZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKHRydWUpIHRvIHRlbGwgdGhlIHBhcnNlciB0byBzdG9wCisgIC8vIHBhcnNpbmcgYXMgc29vbiBhcyBpdCBoYXMgc2VlbiB0aGUgc3ludGF4IGlkZW50aWZpZXIsIG9yIGxhY2sgdGhlcmVvZi4KKyAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHF1aWNrbHkgaWRlbnRpZnlpbmcgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSB3aXRob3V0CisgIC8vIHBhcnNpbmcgdGhlIHdob2xlIHRoaW5nLiAgSWYgdGhpcyBpcyBlbmFibGVkLCBubyBlcnJvciB3aWxsIGJlIHJlY29yZGVkCisgIC8vIGlmIHRoZSBzeW50YXggaWRlbnRpZmllciBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiAicHJvdG8yIiAoc2luY2UKKyAgLy8gcHJlc3VtYWJseSB0aGUgY2FsbGVyIGludGVuZHMgdG8gZGVhbCB3aXRoIHRoYXQpLCBidXQgb3RoZXIga2luZHMgb2YKKyAgLy8gZXJyb3JzIChlLmcuIHBhcnNlIGVycm9ycykgd2lsbCBzdGlsbCBiZSByZXBvcnRlZC4gIFdoZW4gdGhpcyBpcyBlbmFibGVkLAorICAvLyB5b3UgbWF5IHBhc3MgYSBOVUxMIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gUGFyc2UoKS4KKyAgdm9pZCBTZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKGJvb2wgdmFsdWUpIHsKKyAgICBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXyA9IHZhbHVlOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBMb2NhdGlvblJlY29yZGVyOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEVycm9yIHJlY292ZXJ5IGhlbHBlcnMKKworICAvLyBDb25zdW1lIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gIFRoaXMgY29uc3VtZXMgdG9rZW5zCisgIC8vIHVudGlsIGl0IHNlZXMgb25lIG9mOgorICAvLyAgICc7JyAgQ29uc3VtZXMgdGhlIHRva2VuIGFuZCByZXR1cm5zLgorICAvLyAgICd7JyAgQ29uc3VtZXMgdGhlIGJyYWNlIHRoZW4gY2FsbHMgU2tpcFJlc3RPZkJsb2NrKCkuCisgIC8vICAgJ30nICBSZXR1cm5zIHdpdGhvdXQgY29uc3VtaW5nLgorICAvLyAgIEVPRiAgUmV0dXJucyAoY2FuJ3QgY29uc3VtZSkuCisgIC8vIFRoZSBQYXJzZXIgb2Z0ZW4gY2FsbHMgU2tpcFN0YXRlbWVudCgpIGFmdGVyIGVuY291bnRlcmluZyBhIHN5bnRheAorICAvLyBlcnJvci4gIFRoaXMgYWxsb3dzIGl0IHRvIGdvIG9uIHBhcnNpbmcgdGhlIGZvbGxvd2luZyBsaW5lcywgYWxsb3dpbmcKKyAgLy8gaXQgdG8gcmVwb3J0IG1vcmUgdGhhbiBqdXN0IG9uZSBlcnJvciBpbiB0aGUgZmlsZS4KKyAgdm9pZCBTa2lwU3RhdGVtZW50KCk7CisKKyAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCBibG9jaywgaW5jbHVkaW5nIG5lc3RlZCBibG9ja3MsCisgIC8vIGVuZGluZyBhZnRlciB0aGUgY2xvc2luZyAnfScgaXMgZW5jb3VudGVyZWQgYW5kIGNvbnN1bWVkLCBvciBhdCBFT0YuCisgIHZvaWQgU2tpcFJlc3RPZkJsb2NrKCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gU2luZ2xlLXRva2VuIGNvbnN1bWluZyBoZWxwZXJzCisgIC8vCisgIC8vIFRoZXNlIG1ha2UgcGFyc2luZyBjb2RlIG1vcmUgcmVhZGFibGUuCisKKyAgLy8gVHJ1ZSBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBUWVBFX0VORC4KKyAgaW5saW5lIGJvb2wgQXRFbmQoKTsKKworICAvLyBUcnVlIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRleHQuCisgIGlubGluZSBib29sIExvb2tpbmdBdChjb25zdCBjaGFyKiB0ZXh0KTsKKyAgLy8gVHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgaW5saW5lIGJvb2wgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUb2tlblR5cGUgdG9rZW5fdHlwZSk7CisKKyAgLy8gSWYgdGhlIG5leHQgdG9rZW4gZXhhY3RseSBtYXRjaGVzIHRoZSB0ZXh0IGdpdmVuLCBjb25zdW1lIGl0IGFuZCByZXR1cm4KKyAgLy8gdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlIHdpdGhvdXQgbG9nZ2luZyBhbiBlcnJvci4KKyAgYm9vbCBUcnlDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQpOworCisgIC8vIFRoZXNlIGF0dGVtcHQgdG8gcmVhZCBzb21lIGtpbmQgb2YgdG9rZW4gZnJvbSB0aGUgaW5wdXQuICBJZiBzdWNjZXNzZnVsLAorICAvLyB0aGV5IHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlIHRoZXkgcmV0dXJuIGZhbHNlIGFuZCBhZGQgdGhlIGdpdmVuIGVycm9yCisgIC8vIHRvIHRoZSBlcnJvciBsaXN0LgorCisgIC8vIENvbnN1bWUgYSB0b2tlbiB3aXRoIHRoZSBleGFjdCB0ZXh0IGdpdmVuLgorICBib29sIENvbnN1bWUoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgdGhlIGVycm9yICJFeHBlY3RlZCBcInRleHRcIi4iLAorICAvLyB3aGVyZSAidGV4dCIgaXMgdGhlIGV4cGVjdGVkIHRva2VuIHRleHQuCisgIGJvb2wgQ29uc3VtZShjb25zdCBjaGFyKiB0ZXh0KTsKKyAgLy8gQ29uc3VtZSBhIHRva2VuIG9mIHR5cGUgSURFTlRJRklFUiBhbmQgc3RvcmUgaXRzIHRleHQgaW4gIm91dHB1dCIuCisgIGJvb2wgQ29uc3VtZUlkZW50aWZpZXIoc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgLy8gQ29uc3VtZSBhbiBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuCisgIGJvb2wgQ29uc3VtZUludGVnZXIoaW50KiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgLy8gQ29uc3VtZSBhIHNpZ25lZCBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuCisgIGJvb2wgQ29uc3VtZVNpZ25lZEludGVnZXIoaW50KiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgLy8gQ29uc3VtZSBhIDY0LWJpdCBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuICBJZiB0aGUgdmFsdWUKKyAgLy8gaXMgZ3JlYXRlciB0aGFuIG1heF92YWx1ZSwgYW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZC4KKyAgYm9vbCBDb25zdW1lSW50ZWdlcjY0KHVpbnQ2NCBtYXhfdmFsdWUsIHVpbnQ2NCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7CisgIC8vIENvbnN1bWUgYSBudW1iZXIgYW5kIHN0b3JlIGl0cyB2YWx1ZSBpbiAib3V0cHV0Ii4gIFRoaXMgd2lsbCBhY2NlcHQKKyAgLy8gdG9rZW5zIG9mIGVpdGhlciBJTlRFR0VSIG9yIEZMT0FUIHR5cGUuCisgIGJvb2wgQ29uc3VtZU51bWJlcihkb3VibGUqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBDb25zdW1lIGEgc3RyaW5nIGxpdGVyYWwgYW5kIHN0b3JlIGl0cyAodW5lc2NhcGVkKSB2YWx1ZSBpbiAib3V0cHV0Ii4KKyAgYm9vbCBDb25zdW1lU3RyaW5nKHN0cmluZyogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7CisKKyAgLy8gQ29uc3VtZSBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIHRoZSBzdGF0ZW1lbnQuICBDb21tZW50cyBiZXR3ZWVuCisgIC8vIHRoaXMgdG9rZW4gYW5kIHRoZSBuZXh0IHdpbGwgYmUgaGFydmVzdGVkIGZvciBkb2N1bWVudGF0aW9uLiAgVGhlIGdpdmVuCisgIC8vIExvY2F0aW9uUmVjb3JkZXIgc2hvdWxkIHJlZmVyIHRvIHRoZSBkZWNsYXJhdGlvbiB0aGF0IHdhcyBqdXN0IHBhcnNlZDsKKyAgLy8gaXQgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGVzZSBjb21tZW50cy4KKyAgLy8KKyAgLy8gVE9ETyhrZW50b24pOiAgVGhlIExvY2F0aW9uUmVjb3JkZXIgaXMgY29uc3QgYmVjYXVzZSBoaXN0b3JpY2FsbHkgbG9jYXRpb25zCisgIC8vICAgaGF2ZSBiZWVuIHBhc3NlZCBhcm91bmQgYnkgY29uc3QgcmVmZXJlbmNlLCBmb3Igbm8gcGFydGljdWxhcmx5IGdvb2QKKyAgLy8gICByZWFzb24uICBXZSBzaG91bGQgcHJvYmFibHkgZ28gdGhyb3VnaCBhbmQgY2hhbmdlIHRoZW0gYWxsIHRvIG11dGFibGUKKyAgLy8gICBwb2ludGVyIHRvIG1ha2UgdGhpcyBtb3JlIGludHVpdGl2ZS4KKyAgYm9vbCBUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbihjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKTsKKyAgYm9vbCBDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbihjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFcnJvciBsb2dnaW5nIGhlbHBlcnMKKworICAvLyBJbnZva2VzIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKCksIGlmIGVycm9yX2NvbGxlY3Rvcl8gaXMgbm90IE5VTEwuCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgZXJyb3IpOworCisgIC8vIEludm9rZXMgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoKSB3aXRoIHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyCisgIC8vIG9mIHRoZSBjdXJyZW50IHRva2VuLgorICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZXJyb3IpOworCisgIC8vIFJlY29yZHMgYSBsb2NhdGlvbiBpbiB0aGUgU291cmNlQ29kZUluZm8ubG9jYXRpb24gdGFibGUgKHNlZQorICAvLyBkZXNjcmlwdG9yLnByb3RvKS4gIFdlIHVzZSBSQUlJIHRvIGVuc3VyZSB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9ucworICAvLyBhcmUgcmVjb3JkZWQgLS0gdGhlIGNvbnN0cnVjdG9yIHJlY29yZHMgdGhlIHN0YXJ0IGxvY2F0aW9uIGFuZCB0aGUKKyAgLy8gZGVzdHJ1Y3RvciByZWNvcmRzIHRoZSBlbmQgbG9jYXRpb24uICBTaW5jZSB0aGUgcGFyc2VyIGlzCisgIC8vIHJlY3Vyc2l2ZS1kZXNjZW50LCB0aGlzIHdvcmtzIG91dCBiZWF1dGlmdWxseS4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExvY2F0aW9uUmVjb3JkZXIgeworICAgcHVibGljOgorICAgIC8vIENvbnN0cnVjdCB0aGUgZmlsZSdzICJyb290IiBsb2NhdGlvbi4KKyAgICBMb2NhdGlvblJlY29yZGVyKFBhcnNlciogcGFyc2VyKTsKKworICAgIC8vIENvbnN0cnVjdCBhIGxvY2F0aW9uIHRoYXQgcmVwcmVzZW50cyBhIGRlY2xhcmF0aW9uIG5lc3RlZCB3aXRoaW4gdGhlCisgICAgLy8gZ2l2ZW4gcGFyZW50LiAgRS5nLiBhIGZpZWxkJ3MgbG9jYXRpb24gaXMgbmVzdGVkIHdpdGhpbiB0aGUgbG9jYXRpb24KKyAgICAvLyBmb3IgYSBtZXNzYWdlIHR5cGUuICBUaGUgcGFyZW50J3MgcGF0aCB3aWxsIGJlIGNvcGllZCwgc28geW91IHNob3VsZAorICAgIC8vIGNhbGwgQWRkUGF0aCgpIG9ubHkgdG8gYWRkIHRoZSBwYXRoIGNvbXBvbmVudHMgbGVhZGluZyBmcm9tIHRoZSBwYXJlbnQKKyAgICAvLyB0byB0aGUgY2hpbGQgKGFzIG9wcG9zZWQgdG8gbGVhZGluZyBmcm9tIHRoZSByb290IHRvIHRoZSBjaGlsZCkuCisgICAgTG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQpOworCisgICAgLy8gQ29udmVuaWVuY2UgY29uc3RydWN0b3JzIHRoYXQgY2FsbCBBZGRQYXRoKCkgb25lIG9yIHR3byB0aW1lcy4KKyAgICBMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCwgaW50IHBhdGgxKTsKKyAgICBMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCwgaW50IHBhdGgxLCBpbnQgcGF0aDIpOworCisgICAgfkxvY2F0aW9uUmVjb3JkZXIoKTsKKworICAgIC8vIEFkZCBhIHBhdGggY29tcG9uZW50LiAgU2VlIFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGggaW4KKyAgICAvLyBkZXNjcmlwdG9yLnByb3RvLgorICAgIHZvaWQgQWRkUGF0aChpbnQgcGF0aF9jb21wb25lbnQpOworCisgICAgLy8gQnkgZGVmYXVsdCB0aGUgbG9jYXRpb24gaXMgY29uc2lkZXJlZCB0byBzdGFydCBhdCB0aGUgY3VycmVudCB0b2tlbiBhdAorICAgIC8vIHRoZSB0aW1lIHRoZSBMb2NhdGlvblJlY29yZGVyIGlzIGNyZWF0ZWQuICBTdGFydEF0KCkgc2V0cyB0aGUgc3RhcnQKKyAgICAvLyBsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gdG9rZW4gaW5zdGVhZC4KKyAgICB2b2lkIFN0YXJ0QXQoY29uc3QgaW86OlRva2VuaXplcjo6VG9rZW4mIHRva2VuKTsKKworICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQgdG8gZW5kIGF0IHRoZSBwcmV2aW91cyB0b2tlbiBhdAorICAgIC8vIHRoZSB0aW1lIHRoZSBMb2NhdGlvblJlY29yZGVyIGlzIGRlc3Ryb3llZC4gIEVuZEF0KCkgc2V0cyB0aGUgZW5kCisgICAgLy8gbG9jYXRpb24gdG8gdGhlIGdpdmVuIHRva2VuIGluc3RlYWQuCisgICAgdm9pZCBFbmRBdChjb25zdCBpbzo6VG9rZW5pemVyOjpUb2tlbiYgdG9rZW4pOworCisgICAgLy8gUmVjb3JkcyB0aGUgc3RhcnQgcG9pbnQgb2YgdGhpcyBsb2NhdGlvbiB0byB0aGUgU291cmNlTG9jYXRpb25UYWJsZSB0aGF0CisgICAgLy8gd2FzIHBhc3NlZCB0byBSZWNvcmRTb3VyY2VMb2NhdGlvbnNUbygpLCBpZiBhbnkuICBTb3VyY2VMb2NhdGlvblRhYmxlCisgICAgLy8gaXMgYW4gb2xkZXIgd2F5IG9mIGtlZXBpbmcgdHJhY2sgb2Ygc291cmNlIGxvY2F0aW9ucyB3aGljaCBpcyBzdGlsbAorICAgIC8vIHVzZWQgaW4gc29tZSBwbGFjZXMuCisgICAgdm9pZCBSZWNvcmRMZWdhY3lMb2NhdGlvbihjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24pOworCisgICAgLy8gQXR0YWNoZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgY29tbWVudHMgdG8gdGhlIGxvY2F0aW9uLiAgVGhlIHR3byBzdHJpbmdzCisgICAgLy8gd2lsbCBiZSBzd2FwcGVkIGludG8gcGxhY2UsIHNvIGFmdGVyIHRoaXMgaXMgY2FsbGVkICpsZWFkaW5nIGFuZAorICAgIC8vICp0cmFpbGluZyB3aWxsIGJlIGVtcHR5LgorICAgIC8vCisgICAgLy8gVE9ETyhrZW50b24pOiAgU2VlIGNvbW1lbnQgb24gVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oKSwgYWJvdmUsIGZvcgorICAgIC8vICAgd2h5IHRoaXMgaXMgY29uc3QuCisgICAgdm9pZCBBdHRhY2hDb21tZW50cyhzdHJpbmcqIGxlYWRpbmcsIHN0cmluZyogdHJhaWxpbmcpIGNvbnN0OworCisgICBwcml2YXRlOgorICAgIFBhcnNlciogcGFyc2VyXzsKKyAgICBTb3VyY2VDb2RlSW5mbzo6TG9jYXRpb24qIGxvY2F0aW9uXzsKKworICAgIHZvaWQgSW5pdChjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQpOworICB9OworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIFBhcnNlcnMgZm9yIHZhcmlvdXMgbGFuZ3VhZ2UgY29uc3RydWN0cworCisgIC8vIFBhcnNlcyB0aGUgInN5bnRheCA9IFwicHJvdG8yXCI7IiBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICBSZXR1cm5zCisgIC8vIGZhbHNlIGlmIGl0IGZhaWxlZCB0byBwYXJzZSBvciBpZiB0aGUgc3ludGF4IGlkZW50aWZpZXIgd2FzIG5vdAorICAvLyByZWNvZ25pemVkLgorICBib29sIFBhcnNlU3ludGF4SWRlbnRpZmllcigpOworCisgIC8vIFRoZXNlIG1ldGhvZHMgcGFyc2UgdmFyaW91cyBpbmRpdmlkdWFsIGJpdHMgb2YgY29kZS4gIFRoZXkgcmV0dXJuCisgIC8vIGZhbHNlIGlmIHRoZXkgY29tcGxldGVseSBmYWlsIHRvIHBhcnNlIHRoZSBjb25zdHJ1Y3QuICBJbiB0aGlzIGNhc2UsCisgIC8vIGl0IGlzIHByb2JhYmx5IG5lY2Vzc2FyeSB0byBza2lwIHRoZSByZXN0IG9mIHRoZSBzdGF0ZW1lbnQgdG8gcmVjb3Zlci4KKyAgLy8gSG93ZXZlciwgaWYgdGhlc2UgbWV0aG9kcyByZXR1cm4gdHJ1ZSwgaXQgZG9lcyBOT1QgbWVhbiB0aGF0IHRoZXJlCisgIC8vIHdlcmUgbm8gZXJyb3JzOyBvbmx5IHRoYXQgdGhlcmUgd2VyZSBubyAqc3ludGF4KiBlcnJvcnMuICBGb3IgaW5zdGFuY2UsCisgIC8vIGlmIGEgc2VydmljZSBtZXRob2QgaXMgZGVmaW5lZCB1c2luZyBwcm9wZXIgc3ludGF4IGJ1dCB1c2VzIGEgcHJpbWl0aXZlCisgIC8vIHR5cGUgYXMgaXRzIGlucHV0IG9yIG91dHB1dCwgUGFyc2VNZXRob2RGaWVsZCgpIHN0aWxsIHJldHVybnMgdHJ1ZQorICAvLyBhbmQgb25seSByZXBvcnRzIHRoZSBlcnJvciBieSBjYWxsaW5nIEFkZEVycm9yKCkuICBJbiBwcmFjdGljZSwgdGhpcworICAvLyBtYWtlcyBsb2dpYyBtdWNoIHNpbXBsZXIgZm9yIHRoZSBjYWxsZXIuCisKKyAgLy8gUGFyc2UgYSB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgc2VydmljZSwgZXRjLgorICBib29sIFBhcnNlVG9wTGV2ZWxTdGF0ZW1lbnQoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24pOworCisgIC8vIFBhcnNlIHZhcmlvdXMgbGFuZ3VhZ2UgaGlnaC1sZXZlbCBsYW5ndWFnZSBjb25zdHJ1cmN0cy4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pOworICBib29sIFBhcnNlRW51bURlZmluaXRpb24oRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VTZXJ2aWNlRGVmaW5pdGlvbihTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VQYWNrYWdlKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24pOworICBib29sIFBhcnNlSW1wb3J0KFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogZGVwZW5kZW5jeSwKKyAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludDMyPiogcHVibGljX2RlcGVuZGVuY3ksCisgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMj4qIHdlYWtfZGVwZW5kZW5jeSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZU9wdGlvbihNZXNzYWdlKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9wdGlvbnNfbG9jYXRpb24pOworCisgIC8vIFRoZXNlIG1ldGhvZHMgcGFyc2UgdGhlIGNvbnRlbnRzIG9mIGEgbWVzc2FnZSwgZW51bSwgb3Igc2VydmljZSB0eXBlIGFuZAorICAvLyBhZGQgdGhlbSB0byB0aGUgZ2l2ZW4gb2JqZWN0LiAgVGhleSBjb25zdW1lIHRoZSBlbnRpcmUgYmxvY2sgaW5jbHVkaW5nCisgIC8vIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBicmFjZS4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VCbG9jayhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VFbnVtQmxvY2soRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24pOworICBib29sIFBhcnNlU2VydmljZUJsb2NrKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2Ugb25lIHN0YXRlbWVudCB3aXRoaW4gYSBtZXNzYWdlLCBlbnVtLCBvciBzZXJ2aWNlIGJsb2NrLCBpbmNsdW5kaW5nCisgIC8vIGZpbmFsIHNlbWljb2xvbi4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VTdGF0ZW1lbnQoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZUVudW1TdGF0ZW1lbnQoRW51bURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VTZXJ2aWNlU3RhdGVtZW50KFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24pOworCisgIC8vIFBhcnNlIGEgZmllbGQgb2YgYSBtZXNzYWdlLiAgSWYgdGhlIGZpZWxkIGlzIGEgZ3JvdXAsIGl0cyB0eXBlIHdpbGwgYmUKKyAgLy8gYWRkZWQgdG8gIm1lc3NhZ2VzIi4KKyAgLy8KKyAgLy8gcGFyZW50X2xvY2F0aW9uIGFuZCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlIGFyZSBuZWVkZWQgd2hlbgorICAvLyBwYXJzaW5nIGdyb3VwcyAtLSB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgbmVzdGVkIG1lc3NhZ2UgdHlwZSB3aXRoaW4gdGhlCisgIC8vIHBhcmVudCBhbmQgcmVjb3JkIGl0cyBsb2NhdGlvbiBhY2NvcmRpbmdseS4gIFNpbmNlIHRoZSBwYXJlbnQgY291bGQgYmUKKyAgLy8gZWl0aGVyIGEgRmlsZURlc2NyaXB0b3JQcm90byBvciBhIERlc2NyaXB0b3JQcm90bywgd2UgbXVzdCBwYXNzIGluIHRoZQorICAvLyBjb3JyZWN0IGZpZWxkIG51bWJlciB0byB1c2UuCisgIGJvb2wgUGFyc2VNZXNzYWdlRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSBhbiAiZXh0ZW5zaW9ucyIgZGVjbGFyYXRpb24uCisgIGJvb2wgUGFyc2VFeHRlbnNpb25zKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5zaW9uc19sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgYW4gImV4dGVuZCIgZGVjbGFyYXRpb24uICAoU2VlIGFsc28gY29tbWVudHMgZm9yCisgIC8vIFBhcnNlTWVzc2FnZUZpZWxkKCkuKQorICBib29sIFBhcnNlRXh0ZW5kKFJlcGVhdGVkUHRyRmllbGQ8RmllbGREZXNjcmlwdG9yUHJvdG8+KiBleHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGV4dGVuZF9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgYSBzaW5nbGUgZW51bSB2YWx1ZSB3aXRoaW4gYW4gZW51bSBibG9jay4KKyAgYm9vbCBQYXJzZUVudW1Db25zdGFudChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIGVudW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV92YWx1ZV9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgZW51bSBjb25zdGFudCBvcHRpb25zLCBpLmUuIHRoZSBsaXN0IGluIHNxdWFyZSBicmFja2V0cyBhdCB0aGUgZW5kCisgIC8vIG9mIHRoZSBlbnVtIGNvbnN0YW50IHZhbHVlIGRlZmluaXRpb24uCisgIGJvb2wgUGFyc2VFbnVtQ29uc3RhbnRPcHRpb25zKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24pOworCisgIC8vIFBhcnNlIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXJ2aWNlIGRlZmluaXRpb24uCisgIGJvb2wgUGFyc2VTZXJ2aWNlTWV0aG9kKE1ldGhvZERlc2NyaXB0b3JQcm90byogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXRob2RfbG9jYXRpb24pOworCisKKyAgLy8gUGFyc2Ugb3B0aW9ucyBvZiBhIHNpbmdsZSBtZXRob2Qgb3Igc3RyZWFtLgorICBib29sIFBhcnNlT3B0aW9ucyhjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG11dGFibGVfb3B0aW9ucyk7CisKKyAgLy8gUGFyc2UgInJlcXVpcmVkIiwgIm9wdGlvbmFsIiwgb3IgInJlcGVhdGVkIiBhbmQgZmlsbCBpbiAibGFiZWwiCisgIC8vIHdpdGggdGhlIHZhbHVlLgorICBib29sIFBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCk7CisKKyAgLy8gUGFyc2UgYSB0eXBlIG5hbWUgYW5kIGZpbGwgaW4gInR5cGUiIChpZiBpdCBpcyBhIHByaW1pdGl2ZSkgb3IKKyAgLy8gInR5cGVfbmFtZSIgKGlmIGl0IGlzIG5vdCkgd2l0aCB0aGUgdHlwZSBwYXJzZWQuCisgIGJvb2wgUGFyc2VUeXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICBzdHJpbmcqIHR5cGVfbmFtZSk7CisgIC8vIFBhcnNlIGEgdXNlci1kZWZpbmVkIHR5cGUgYW5kIGZpbGwgaW4gInR5cGVfbmFtZSIgd2l0aCB0aGUgbmFtZS4KKyAgLy8gSWYgYSBwcmltaXRpdmUgdHlwZSBpcyBuYW1lZCwgaXQgaXMgdHJlYXRlZCBhcyBhbiBlcnJvci4KKyAgYm9vbCBQYXJzZVVzZXJEZWZpbmVkVHlwZShzdHJpbmcqIHR5cGVfbmFtZSk7CisKKyAgLy8gUGFyc2VzIGZpZWxkIG9wdGlvbnMsIGkuZS4gdGhlIHN0dWZmIGluIHNxdWFyZSBicmFja2V0cyBhdCB0aGUgZW5kCisgIC8vIG9mIGEgZmllbGQgZGVmaW5pdGlvbi4gIEFsc28gcGFyc2VzIGRlZmF1bHQgdmFsdWUuCisgIGJvb2wgUGFyc2VGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSB0aGUgImRlZmF1bHQiIG9wdGlvbi4gIFRoaXMgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBiZWNhdXNlIGl0cworICAvLyB0eXBlIGlzIHRoZSBmaWVsZCdzIHR5cGUuCisgIGJvb2wgUGFyc2VEZWZhdWx0QXNzaWdubWVudChGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbik7CisKKyAgZW51bSBPcHRpb25TdHlsZSB7CisgICAgT1BUSU9OX0FTU0lHTk1FTlQsICAvLyBqdXN0ICJuYW1lID0gdmFsdWUiCisgICAgT1BUSU9OX1NUQVRFTUVOVCAgICAvLyAib3B0aW9uIG5hbWUgPSB2YWx1ZTsiCisgIH07CisKKyAgLy8gUGFyc2UgYSBzaW5nbGUgb3B0aW9uIG5hbWUvdmFsdWUgcGFpciwgZS5nLiAiY3R5cGUgPSBDT1JEIi4gIFRoZSBuYW1lCisgIC8vIGlkZW50aWZpZXMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gTWVzc2FnZSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IGZpZWxkCisgIC8vIGlzIHNldCB0byB0aGUgcGFyc2VkIHZhbHVlLgorICBib29sIFBhcnNlT3B0aW9uKE1lc3NhZ2UqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb3B0aW9uc19sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBPcHRpb25TdHlsZSBzdHlsZSk7CisKKyAgLy8gUGFyc2VzIGEgc2luZ2xlIHBhcnQgb2YgYSBtdWx0aXBhcnQgb3B0aW9uIG5hbWUuIEEgbXVsdGlwYXJ0IG5hbWUgY29uc2lzdHMKKyAgLy8gb2YgbmFtZXMgc2VwYXJhdGVkIGJ5IGRvdHMuIEVhY2ggbmFtZSBpcyBlaXRoZXIgYW4gaWRlbnRpZmllciBvciBhIHNlcmllcworICAvLyBvZiBpZGVudGlmaWVycyBzZXBhcmF0ZWQgYnkgZG90cyBhbmQgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMuIEUuZy4sCisgIC8vICJmb28uKGJhci5iYXopLnF1eCIuCisgIGJvb2wgUGFyc2VPcHRpb25OYW1lUGFydChVbmludGVycHJldGVkT3B0aW9uKiB1bmludGVycHJldGVkX29wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcnRfbG9jYXRpb24pOworCisgIC8vIFBhcnNlcyBhIHN0cmluZyBzdXJyb3VuZGVkIGJ5IGJhbGFuY2VkIGJyYWNlcy4gIFN0cmlwcyBvZmYgdGhlIG91dGVyCisgIC8vIGJyYWNlcyBhbmQgc3RvcmVzIHRoZSBlbmNsb3NlZCBzdHJpbmcgaW4gKnZhbHVlLgorICAvLyBFLmcuLAorICAvLyAgICAgeyBmb28gfSAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSBnZXRzICdmb28nCisgIC8vICAgICB7IGZvbyB7IGJhcjogYm94IH0gfSAgICAgICAgKnZhbHVlIGdldHMgJ2ZvbyB7IGJhcjogYm94IH0nCisgIC8vICAgICB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlIGdldHMgJycKKyAgLy8KKyAgLy8gUkVRVUlSRVM6IExvb2tpbmdBdCgieyIpCisgIC8vIFdoZW4gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LCB3ZSBhcmUgbG9va2luZyBhdCB0aGUgZmlyc3QgdG9rZW4gcGFzdAorICAvLyB0aGUgZW5kaW5nIGJyYWNlLgorICBib29sIFBhcnNlVW5pbnRlcnByZXRlZEJsb2NrKHN0cmluZyogdmFsdWUpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgaW86OlRva2VuaXplciogaW5wdXRfOworICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CisgIFNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvXzsKKyAgU291cmNlTG9jYXRpb25UYWJsZSogc291cmNlX2xvY2F0aW9uX3RhYmxlXzsgIC8vIGxlZ2FjeQorICBib29sIGhhZF9lcnJvcnNfOworICBib29sIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfOworICBib29sIHN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfOworICBzdHJpbmcgc3ludGF4X2lkZW50aWZpZXJfOworCisgIC8vIExlYWRpbmcgZG9jIGNvbW1lbnRzIGZvciB0aGUgbmV4dCBkZWNsYXJhdGlvbi4gIFRoZXNlIGFyZSBub3QgY29tcGxldGUKKyAgLy8geWV0OyB1c2UgQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oKSB0byBnZXQgdGhlIGNvbXBsZXRlIGNvbW1lbnRzLgorICBzdHJpbmcgdXBjb21pbmdfZG9jX2NvbW1lbnRzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VyKTsKK307CisKKy8vIEEgdGFibGUgbWFwcGluZyAoZGVzY3JpcHRvciwgRXJyb3JMb2NhdGlvbikgcGFpcnMgLS0gYXMgcmVwb3J0ZWQgYnkKKy8vIERlc2NyaXB0b3JQb29sIHdoZW4gdmFsaWRhdGluZyBkZXNjcmlwdG9ycyAtLSB0byBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycworLy8gd2l0aGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KKy8vCisvLyBUaGlzIGlzIHNlbWktb2Jzb2xldGU6ICBGaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8gbm93IGNvbnRhaW5zCisvLyBmYXIgbW9yZSBjb21wbGV0ZSBpbmZvcm1hdGlvbiBhYm91dCBzb3VyY2UgbG9jYXRpb25zLiAgSG93ZXZlciwgYXMgb2YgdGhpcworLy8gd3JpdGluZyB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgU291cmNlTG9jYXRpb25UYWJsZSB3aGVuIGludGVncmF0aW5nIHdpdGgKKy8vIERlc2NyaXB0b3JQb29sLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNvdXJjZUxvY2F0aW9uVGFibGUgeworIHB1YmxpYzoKKyAgU291cmNlTG9jYXRpb25UYWJsZSgpOworICB+U291cmNlTG9jYXRpb25UYWJsZSgpOworCisgIC8vIEZpbmRzIHRoZSBwcmVjaXNlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBlcnJvciBhbmQgZmlsbHMgaW4gKmxpbmUgYW5kCisgIC8vICpjb2x1bW4gd2l0aCB0aGUgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuICBJZiBub3QgZm91bmQsIHNldHMgKmxpbmUgdG8KKyAgLy8gLTEgYW5kICpjb2x1bW4gdG8gMCAoc2luY2UgbGluZSA9IC0xIGlzIHVzZWQgdG8gbWVhbiAiZXJyb3IgaGFzIG5vIGV4YWN0CisgIC8vIGxvY2F0aW9uIiBpbiB0aGUgRXJyb3JDb2xsZWN0b3IgaW50ZXJmYWNlKS4gIFJldHVybnMgdHJ1ZSBpZiBmb3VuZCwgZmFsc2UKKyAgLy8gb3RoZXJ3aXNlLgorICBib29sIEZpbmQoY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgIGludCogbGluZSwgaW50KiBjb2x1bW4pIGNvbnN0OworCisgIC8vIEFkZHMgYSBsb2NhdGlvbiB0byB0aGUgdGFibGUuCisgIHZvaWQgQWRkKGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgaW50IGxpbmUsIGludCBjb2x1bW4pOworCisgIC8vIENsZWFycyB0aGUgY29udGVudHMgb2YgdGhlIHRhYmxlLgorICB2b2lkIENsZWFyKCk7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIG1hcDwKKyAgICBwYWlyPGNvbnN0IE1lc3NhZ2UqLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24+LAorICAgIHBhaXI8aW50LCBpbnQ+ID4gTG9jYXRpb25NYXA7CisgIExvY2F0aW9uTWFwIGxvY2F0aW9uX21hcF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QQVJTRVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjFhYzYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDIzNzQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgTW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKyAgfk1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgc3RyaW5nIHRleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnRleHRfLCAiJDA6JDE6ICQyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorfTsKKworY2xhc3MgTW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3RvciA6IHB1YmxpYyBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgTW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3Rvcihjb25zdCBTb3VyY2VMb2NhdGlvblRhYmxlJiBzb3VyY2VfbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpFcnJvckNvbGxlY3Rvciogd3JhcHBlZF9jb2xsZWN0b3IpCisgICAgOiBzb3VyY2VfbG9jYXRpb25zXyhzb3VyY2VfbG9jYXRpb25zKSwKKyAgICAgIHdyYXBwZWRfY29sbGVjdG9yXyh3cmFwcGVkX2NvbGxlY3Rvcikge30KKyAgfk1vY2tWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoKSB7fQorCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgaW50IGxpbmUsIGNvbHVtbjsKKyAgICBzb3VyY2VfbG9jYXRpb25zXy5GaW5kKGRlc2NyaXB0b3IsIGxvY2F0aW9uLCAmbGluZSwgJmNvbHVtbik7CisgICAgd3JhcHBlZF9jb2xsZWN0b3JfLT5BZGRFcnJvcihsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBTb3VyY2VMb2NhdGlvblRhYmxlJiBzb3VyY2VfbG9jYXRpb25zXzsKKyAgaW86OkVycm9yQ29sbGVjdG9yKiB3cmFwcGVkX2NvbGxlY3Rvcl87Cit9OworCitjbGFzcyBQYXJzZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgUGFyc2VyVGVzdCgpCisgICAgOiByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyhmYWxzZSkge30KKworICAvLyBTZXQgdXAgdGhlIHBhcnNlciB0byBwYXJzZSB0aGUgZ2l2ZW4gdGV4dC4KKyAgdm9pZCBTZXR1cFBhcnNlcihjb25zdCBjaGFyKiB0ZXh0KSB7CisgICAgcmF3X2lucHV0Xy5yZXNldChuZXcgaW86OkFycmF5SW5wdXRTdHJlYW0odGV4dCwgc3RybGVuKHRleHQpKSk7CisgICAgaW5wdXRfLnJlc2V0KG5ldyBpbzo6VG9rZW5pemVyKHJhd19pbnB1dF8uZ2V0KCksICZlcnJvcl9jb2xsZWN0b3JfKSk7CisgICAgcGFyc2VyXy5yZXNldChuZXcgUGFyc2VyKCkpOworICAgIHBhcnNlcl8tPlJlY29yZEVycm9yc1RvKCZlcnJvcl9jb2xsZWN0b3JfKTsKKyAgICBwYXJzZXJfLT5TZXRSZXF1aXJlU3ludGF4SWRlbnRpZmllcihyZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyk7CisgIH0KKworICAvLyBQYXJzZSB0aGUgaW5wdXQgYW5kIGV4cGVjdCB0aGF0IHRoZSByZXN1bHRpbmcgRmlsZURlc2NyaXB0b3JQcm90byBtYXRjaGVzCisgIC8vIHRoZSBnaXZlbiBvdXRwdXQuICBUaGUgb3V0cHV0IGlzIGEgRmlsZURlc2NyaXB0b3JQcm90byBpbiBwcm90b2NvbCBidWZmZXIKKyAgLy8gdGV4dCBmb3JtYXQuCisgIHZvaWQgRXhwZWN0UGFyc2VzVG8oY29uc3QgY2hhciogaW5wdXQsIGNvbnN0IGNoYXIqIG91dHB1dCkgeworICAgIFNldHVwUGFyc2VyKGlucHV0KTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGFjdHVhbCwgZXhwZWN0ZWQ7CisKKyAgICBwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZhY3R1YWwpOworICAgIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7CisgICAgQVNTRVJUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKworICAgIC8vIFdlIGRvbid0IGNvdmVyIFNvdXJjZUNvZGVJbmZvIGluIHRoZXNlIHRlc3RzLgorICAgIGFjdHVhbC5jbGVhcl9zb3VyY2VfY29kZV9pbmZvKCk7CisKKyAgICAvLyBQYXJzZSB0aGUgQVNDSUkgcmVwcmVzZW50YXRpb24gaW4gb3JkZXIgdG8gY2Fub25pY2FsaXplIGl0LiAgV2UgY291bGQKKyAgICAvLyBqdXN0IGNvbXBhcmUgZGlyZWN0bHkgdG8gYWN0dWFsLkRlYnVnU3RyaW5nKCksIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUKKyAgICAvLyB0aGF0IHRoZSBjYWxsZXIgcHJlY2lzZWx5IG1hdGNoIHRoZSBmb3JtYXR0aW5nIHRoYXQgRGVidWdTdHJpbmcoKQorICAgIC8vIHByb2R1Y2VzLgorICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhvdXRwdXQsICZleHBlY3RlZCkpOworCisgICAgLy8gQ29tcGFyZSBieSBjb21wYXJpbmcgZGVidWcgc3RyaW5ncy4KKyAgICAvLyBUT0RPKGtlbnRvbik6ICBVc2UgZGlmZmVyZW5jZXIsIG9uY2UgaXQgaXMgYXZhaWxhYmxlLgorICAgIEVYUEVDVF9FUShleHBlY3RlZC5EZWJ1Z1N0cmluZygpLCBhY3R1YWwuRGVidWdTdHJpbmcoKSk7CisgIH0KKworICAvLyBQYXJzZSB0aGUgdGV4dCBhbmQgZXhwZWN0IHRoYXQgdGhlIGdpdmVuIGVycm9ycyBhcmUgcmVwb3J0ZWQuCisgIHZvaWQgRXhwZWN0SGFzRXJyb3JzKGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2Vycm9ycykgeworICAgIEV4cGVjdEhhc0Vhcmx5RXhpdEVycm9ycyh0ZXh0LCBleHBlY3RlZF9lcnJvcnMpOworICAgIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7CisgIH0KKworICAvLyBTYW1lIGFzIGFib3ZlIGJ1dCBkb2VzIG5vdCBleHBlY3QgdGhhdCB0aGUgcGFyc2VyIHBhcnNlcyB0aGUgY29tcGxldGUKKyAgLy8gaW5wdXQuCisgIHZvaWQgRXhwZWN0SGFzRWFybHlFeGl0RXJyb3JzKGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2Vycm9ycykgeworICAgIFNldHVwUGFyc2VyKHRleHQpOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZmaWxlKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZXJyb3JzLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKyAgfQorCisgIC8vIFBhcnNlIHRoZSB0ZXh0IGFzIGEgZmlsZSBhbmQgdmFsaWRhdGUgaXQgKHdpdGggYSBEZXNjcmlwdG9yUG9vbCksIGFuZAorICAvLyBleHBlY3QgdGhhdCB0aGUgdmFsaWRhdGlvbiBzdGVwIHJlcG9ydHMgdGhlIGdpdmVuIGVycm9ycy4KKyAgdm9pZCBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKGNvbnN0IGNoYXIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9lcnJvcnMpIHsKKyAgICBTZXR1cFBhcnNlcih0ZXh0KTsKKyAgICBTb3VyY2VMb2NhdGlvblRhYmxlIHNvdXJjZV9sb2NhdGlvbnM7CisgICAgcGFyc2VyXy0+UmVjb3JkU291cmNlTG9jYXRpb25zVG8oJnNvdXJjZV9sb2NhdGlvbnMpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIGZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworICAgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJmZpbGUpOworICAgIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7CisgICAgQVNTRVJUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKworICAgIE1vY2tWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IgdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3IoCisgICAgICBzb3VyY2VfbG9jYXRpb25zLCAmZXJyb3JfY29sbGVjdG9yXyk7CisgICAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlQ29sbGVjdGluZ0Vycm9ycygKKyAgICAgIGZpbGUsICZ2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3RvcikgPT0gTlVMTCk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Vycm9ycywgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIH0KKworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yXzsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gcmF3X2lucHV0XzsKKyAgc2NvcGVkX3B0cjxpbzo6VG9rZW5pemVyPiBpbnB1dF87CisgIHNjb3BlZF9wdHI8UGFyc2VyPiBwYXJzZXJfOworICBib29sIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUX0YoUGFyc2VyVGVzdCwgU3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcikgeworICBTZXR1cFBhcnNlcigKKyAgICAiLy8gYmxhaFxuIgorICAgICJzeW50YXggPSBcImZvb2JhclwiO1xuIgorICAgICJ0aGlzIGxpbmUgd2lsbCBub3QgYmUgcGFyc2VkXG4iKTsKKyAgcGFyc2VyXy0+U2V0U3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcih0cnVlKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCBOVUxMKSk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlclRlc3QsIFN0b3BBZnRlck9taXR0ZWRTeW50YXhJZGVudGlmaWVyKSB7CisgIFNldHVwUGFyc2VyKAorICAgICIvLyBibGFoXG4iCisgICAgInRoaXMgbGluZSB3aWxsIG5vdCBiZSBwYXJzZWRcbiIpOworICBwYXJzZXJfLT5TZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKHRydWUpOworICBFWFBFQ1RfVFJVRShwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksIE5VTEwpKTsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKyAgRVhQRUNUX0VRKCIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VyVGVzdCwgU3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcldpdGhFcnJvcnMpIHsKKyAgU2V0dXBQYXJzZXIoCisgICAgIi8vIGJsYWhcbiIKKyAgICAic3ludGF4ID0gZXJyb3I7XG4iKTsKKyAgcGFyc2VyXy0+U2V0U3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcih0cnVlKTsKKyAgRVhQRUNUX0ZBTFNFKHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgTlVMTCkpOworICBFWFBFQ1RfRVEoIjE6OTogRXhwZWN0ZWQgc3ludGF4IGlkZW50aWZpZXIuXG4iLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VNZXNzYWdlVGVzdDsKKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIFNpbXBsZU1lc3NhZ2UpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBJbXBsaWNpdFN5bnRheElkZW50aWZpZXIpIHsKKyAgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8gPSBmYWxzZTsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgorICAgICJ9Iik7CisgIEVYUEVDVF9FUSgicHJvdG8yIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4cGxpY2l0U3ludGF4SWRlbnRpZmllcikgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTtcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgIn0iKTsKKyAgRVhQRUNUX0VRKCJwcm90bzIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRXhwbGljaXRSZXF1aXJlZFN5bnRheElkZW50aWZpZXIpIHsKKyAgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8gPSB0cnVlOworICBFeHBlY3RQYXJzZXNUbygKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTtcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgIn0iKTsKKyAgRVhQRUNUX0VRKCJwcm90bzIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgU2ltcGxlRmllbGRzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxNTtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAzNDtcbiIKKyAgICAiICByZXBlYXRlZCBpbnQzMiBiYXogPSAzO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjE1IH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjozNCB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIGxhYmVsOkxBQkVMX1JFUEVBVEVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MyAgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgUHJpbWl0aXZlRmllbGRUeXBlcykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgcmVxdWlyZWQgaW50MzIgICAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQ2NCAgICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIHVpbnQzMiAgIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgdWludDY0ICAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBzaW50MzIgICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIHNpbnQ2NCAgIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgZml4ZWQzMiAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBmaXhlZDY0ICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIHNmaXhlZDMyIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgc2ZpeGVkNjQgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBmbG9hdCAgICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIGRvdWJsZSAgIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgc3RyaW5nICAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBieXRlcyAgICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIGJvb2wgICAgIGZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiAgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQ2NCAgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9VSU5UMzIgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9VSU5UNjQgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TSU5UMzIgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TSU5UNjQgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9GSVhFRDMyICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9GSVhFRDY0ICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TRklYRUQzMiBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TRklYRUQ2NCBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9GTE9BVCAgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9ET1VCTEUgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TVFJJTkcgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9CWVRFUyAgICBudW1iZXI6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9CT09MICAgICBudW1iZXI6MSB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBGaWVsZERlZmF1bHRzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0gIDEgIF07XG4iCisgICAgIiAgcmVxdWlyZWQgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9IC0yICBdO1xuIgorICAgICIgIHJlcXVpcmVkIGludDY0ICBmb28gPSAxIFtkZWZhdWx0PSAgMyAgXTtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0gLTQgIF07XG4iCisgICAgIiAgcmVxdWlyZWQgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9ICA1ICBdO1xuIgorICAgICIgIHJlcXVpcmVkIHVpbnQ2NCBmb28gPSAxIFtkZWZhdWx0PSAgNiAgXTtcbiIKKyAgICAiICByZXF1aXJlZCBmbG9hdCAgZm9vID0gMSBbZGVmYXVsdD0gIDcuNV07XG4iCisgICAgIiAgcmVxdWlyZWQgZmxvYXQgIGZvbyA9IDEgW2RlZmF1bHQ9IC04LjVdO1xuIgorICAgICIgIHJlcXVpcmVkIGZsb2F0ICBmb28gPSAxIFtkZWZhdWx0PSAgOSAgXTtcbiIKKyAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gMTAuNV07XG4iCisgICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9LTExLjVdO1xuIgorICAgICIgIHJlcXVpcmVkIGRvdWJsZSBmb28gPSAxIFtkZWZhdWx0PSAxMiAgXTtcbiIKKyAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gaW5mIF07XG4iCisgICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9LWluZiBdO1xuIgorICAgICIgIHJlcXVpcmVkIGRvdWJsZSBmb28gPSAxIFtkZWZhdWx0PSBuYW4gXTtcbiIKKyAgICAiICByZXF1aXJlZCBzdHJpbmcgZm9vID0gMSBbZGVmYXVsdD0nMTNcXDAwMSddO1xuIgorICAgICIgIHJlcXVpcmVkIHN0cmluZyBmb28gPSAxIFtkZWZhdWx0PSdhJyBcImJcIiBcbiBcImNcIl07XG4iCisgICAgIiAgcmVxdWlyZWQgYnl0ZXMgIGZvbyA9IDEgW2RlZmF1bHQ9JzE0XFwwMDInXTtcbiIKKyAgICAiICByZXF1aXJlZCBieXRlcyAgZm9vID0gMSBbZGVmYXVsdD0nYScgXCJiXCIgXG4gJ2MnXTtcbiIKKyAgICAiICByZXF1aXJlZCBib29sICAgZm9vID0gMSBbZGVmYXVsdD10cnVlIF07XG4iCisgICAgIiAgcmVxdWlyZWQgRm9vICAgIGZvbyA9IDEgW2RlZmF1bHQ9Rk9PICBdO1xuIgorCisgICAgIiAgcmVxdWlyZWQgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4N0ZGRkZGRkZdO1xuIgorICAgICIgIHJlcXVpcmVkIGludDMyICBmb28gPSAxIFtkZWZhdWx0PS0weDgwMDAwMDAwXTtcbiIKKyAgICAiICByZXF1aXJlZCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0gMHhGRkZGRkZGRl07XG4iCisgICAgIiAgcmVxdWlyZWQgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4N0ZGRkZGRkZGRkZGRkZGRl07XG4iCisgICAgIiAgcmVxdWlyZWQgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9LTB4ODAwMDAwMDAwMDAwMDAwMF07XG4iCisgICAgIiAgcmVxdWlyZWQgdWludDY0IGZvbyA9IDEgW2RlZmF1bHQ9IDB4RkZGRkZGRkZGRkZGRkZGRl07XG4iCisgICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9IDB4YWJjZF07XG4iCisgICAgIn1cbiIsCisKKyNkZWZpbmUgRVRDICJuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgbnVtYmVyOjEiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCIxXCIgICAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDMyICAgZGVmYXVsdF92YWx1ZTpcIi0yXCIgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiM1wiICAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQ2NCAgIGRlZmF1bHRfdmFsdWU6XCItNFwiICAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1VJTlQzMiAgZGVmYXVsdF92YWx1ZTpcIjVcIiAgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfVUlOVDY0ICBkZWZhdWx0X3ZhbHVlOlwiNlwiICAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9GTE9BVCAgIGRlZmF1bHRfdmFsdWU6XCI3LjVcIiAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0ZMT0FUICAgZGVmYXVsdF92YWx1ZTpcIi04LjVcIiAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRkxPQVQgICBkZWZhdWx0X3ZhbHVlOlwiOVwiICAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCIxMC41XCIgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIi0xMS41XCIgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiMTJcIiAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCJpbmZcIiAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIi1pbmZcIiAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwibmFuXCIgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9TVFJJTkcgIGRlZmF1bHRfdmFsdWU6XCIxM1xcMDAxXCIgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1NUUklORyAgZGVmYXVsdF92YWx1ZTpcImFiY1wiICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfQllURVMgICBkZWZhdWx0X3ZhbHVlOlwiMTRcXFxcMDAyXCIgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9CWVRFUyAgIGRlZmF1bHRfdmFsdWU6XCJhYmNcIiAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0JPT0wgICAgZGVmYXVsdF92YWx1ZTpcInRydWVcIiAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlX25hbWU6XCJGb29cIiBkZWZhdWx0X3ZhbHVlOlwiRk9PXCIgICAgICAgIkVUQyIgfSIKKworICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDMyICAgZGVmYXVsdF92YWx1ZTpcIjIxNDc0ODM2NDdcIiAgICAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCItMjE0NzQ4MzY0OFwiICAgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfVUlOVDMyICBkZWZhdWx0X3ZhbHVlOlwiNDI5NDk2NzI5NVwiICAgICAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIiAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQ2NCAgIGRlZmF1bHRfdmFsdWU6XCItOTIyMzM3MjAzNjg1NDc3NTgwOFwiICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfVUlOVDY0ICBkZWZhdWx0X3ZhbHVlOlwiMTg0NDY3NDQwNzM3MDk1NTE2MTVcIiAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIjQzOTgxXCIgICAgICAgICAgICAgICAgIkVUQyIgfSIKKyAgICAifSIpOworI3VuZGVmIEVUQworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRmllbGRPcHRpb25zKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMVxuIgorICAgICIgICAgICBbY3R5cGU9Q09SRCwgKGZvbyk9NywgZm9vLiguYmFyLmJheikucXV4LnF1dXguKGNvcmdlKT0tMzMsIFxuIgorICAgICIgICAgICAgKHF1dXgpPVwieFwwNDB5XCIsIChiYXoucXV4KT1oZXldO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfU1RSSU5HIG51bWJlcjogMSIKKyAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImN0eXBlXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiQ09SRFwiICB9IgorICAgICIgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uOiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiA3ICB9IgorICAgICIgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uOiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwiLmJhci5iYXpcIiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicXV4XCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicXV1eFwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImNvcmdlXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmVfaW50X3ZhbHVlOiAtMzMgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcInF1dXhcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwieCB5XCIgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhei5xdXhcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcImhleVwiIH0iCisgICAgIiAgICAgICAgICB9IgorICAgICIgIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEdyb3VwKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBncm91cCBUZXN0R3JvdXAgPSAxIHt9O1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiVGVzdEdyb3VwXCIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJ0ZXN0Z3JvdXBcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCBudW1iZXI6MSIKKyAgICAiICAgICAgICAgIHR5cGU6VFlQRV9HUk9VUCB0eXBlX25hbWU6IFwiVGVzdEdyb3VwXCIgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTmVzdGVkTWVzc2FnZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgbWVzc2FnZSBOZXN0ZWQge31cbiIKKyAgICAiICBvcHRpb25hbCBOZXN0ZWQgdGVzdF9uZXN0ZWQgPSAxO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiTmVzdGVkXCIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJ0ZXN0X25lc3RlZFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIG51bWJlcjoxIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOiBcIk5lc3RlZFwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE5lc3RlZEVudW0pIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIGVudW0gTmVzdGVkRW51bSB7fVxuIgorICAgICIgIG9wdGlvbmFsIE5lc3RlZEVudW0gdGVzdF9lbnVtID0gMTtcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZW51bV90eXBlIHsgbmFtZTogXCJOZXN0ZWRFbnVtXCIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJ0ZXN0X2VudW1cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCBudW1iZXI6MSIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTogXCJOZXN0ZWRFbnVtXCIgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRXh0ZW5zaW9uUmFuZ2UpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIGV4dGVuc2lvbnMgMTAgdG8gMTk7XG4iCisgICAgIiAgZXh0ZW5zaW9ucyAzMCB0byBtYXg7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwIGVuZDoyMCAgICAgICAgfSIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDozMCBlbmQ6NTM2ODcwOTEyIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIENvbXBvdW5kRXh0ZW5zaW9uUmFuZ2UpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIGV4dGVuc2lvbnMgMiwgMTUsIDkgdG8gMTEsIDEwMCB0byBtYXgsIDM7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjIgICBlbmQ6MyAgICAgICAgIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6MTUgIGVuZDoxNiAgICAgICAgfSIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDo5ICAgZW5kOjEyICAgICAgICB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwMCBlbmQ6NTM2ODcwOTEyIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6MyAgIGVuZDo0ICAgICAgICAgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTGFyZ2VyTWF4Rm9yTWVzc2FnZVNldFdpcmVGb3JtYXRNZXNzYWdlcykgeworICAvLyBNZXNzYWdlcyB1c2luZyB0aGUgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgb3B0aW9uIGNhbiBhY2NlcHQgbGFyZ2VyCisgIC8vIGV4dGVuc2lvbiBudW1iZXJzLCBhcyB0aGUgbnVtYmVycyBhcmUgbm90IGVuY29kZWQgYXMgaW50MzIgZmllbGQgdmFsdWVzCisgIC8vIHJhdGhlciB0aGFuIHRhZ3MuCisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBleHRlbnNpb25zIDQgdG8gbWF4O1xuIgorICAgICIgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgICAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6NCBlbmQ6IDB4N2ZmZmZmZmYgfSIKKyAgICAiICBvcHRpb25zIHtcbiIKKyAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgXG4iCisgICAgIiAgICAgIG5hbWUge1xuIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJtZXNzYWdlX3NldF93aXJlX2Zvcm1hdFwiXG4iCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZVxuIgorICAgICIgICAgICB9XG4iCisgICAgIiAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwidHJ1ZVwiXG4iCisgICAgIiAgICB9XG4iCisgICAgIiAgfVxuIgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHRlbnNpb25zKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJleHRlbmQgRXh0ZW5kZWUxIHsgb3B0aW9uYWwgaW50MzIgZm9vID0gMTI7IH1cbiIKKyAgICAiZXh0ZW5kIEV4dGVuZGVlMiB7IHJlcGVhdGVkIFRlc3RNZXNzYWdlIGJhciA9IDIyOyB9XG4iLAorCisgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEyIgorICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJFeHRlbmRlZTFcIiB9ICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhclwiIGxhYmVsOkxBQkVMX1JFUEVBVEVEIG51bWJlcjoyMiIKKyAgICAiICAgICAgICAgICAgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiBleHRlbmRlZTogXCJFeHRlbmRlZTJcIiB9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHRlbnNpb25zSW5NZXNzYWdlU2NvcGUpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIGV4dGVuZCBFeHRlbmRlZTEgeyBvcHRpb25hbCBpbnQzMiBmb28gPSAxMjsgfVxuIgorICAgICIgIGV4dGVuZCBFeHRlbmRlZTIgeyByZXBlYXRlZCBUZXN0TWVzc2FnZSBiYXIgPSAyMjsgfVxuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxMiIKKyAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJFeHRlbmRlZTFcIiB9IgorICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJiYXJcIiBsYWJlbDpMQUJFTF9SRVBFQVRFRCBudW1iZXI6MjIiCisgICAgIiAgICAgICAgICAgICAgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiBleHRlbmRlZTogXCJFeHRlbmRlZTJcIiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBNdWx0aXBsZUV4dGVuc2lvbnNPbmVFeHRlbmRlZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAiZXh0ZW5kIEV4dGVuZGVlMSB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTI7XG4iCisgICAgIiAgcmVwZWF0ZWQgVGVzdE1lc3NhZ2UgYmFyID0gMjI7XG4iCisgICAgIn1cbiIsCisKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MTIiCisgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcIkV4dGVuZGVlMVwiIH0gIgorICAgICJleHRlbnNpb24geyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfUkVQRUFURUQgbnVtYmVyOjIyIgorICAgICIgICAgICAgICAgICB0eXBlX25hbWU6XCJUZXN0TWVzc2FnZVwiIGV4dGVuZGVlOiBcIkV4dGVuZGVlMVwiIH0iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VFbnVtVGVzdDsKKworVEVTVF9GKFBhcnNlRW51bVRlc3QsIFNpbXBsZUVudW0pIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgImVudW0gVGVzdEVudW0ge1xuIgorICAgICIgIEZPTyA9IDA7XG4iCisgICAgIn1cbiIsCisKKyAgICAiZW51bV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0RW51bVwiIgorICAgICIgIHZhbHVlIHsgbmFtZTpcIkZPT1wiIG51bWJlcjowIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlRW51bVRlc3QsIFZhbHVlcykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgIiAgRk9PID0gMTM7XG4iCisgICAgIiAgQkFSID0gLTEwO1xuIgorICAgICIgIEJBWiA9IDUwMDtcbiIKKyAgICAiICBIRVhfTUFYID0gMHg3RkZGRkZGRjtcbiIKKyAgICAiICBIRVhfTUlOID0gLTB4ODAwMDAwMDA7XG4iCisgICAgIiAgSU5UX01BWCA9IDIxNDc0ODM2NDc7XG4iCisgICAgIiAgSU5UX01JTiA9IC0yMTQ3NDgzNjQ4O1xuIgorICAgICJ9XG4iLAorCisgICAgImVudW1fdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJGT09cIiBudW1iZXI6MTMgfSIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6LTEwIH0iCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFaXCIgbnVtYmVyOjUwMCB9IgorICAgICIgIHZhbHVlIHsgbmFtZTpcIkhFWF9NQVhcIiBudW1iZXI6MjE0NzQ4MzY0NyB9IgorICAgICIgIHZhbHVlIHsgbmFtZTpcIkhFWF9NSU5cIiBudW1iZXI6LTIxNDc0ODM2NDggfSIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJJTlRfTUFYXCIgbnVtYmVyOjIxNDc0ODM2NDcgfSIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJJTlRfTUlOXCIgbnVtYmVyOi0yMTQ3NDgzNjQ4IH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlRW51bVRlc3QsIFZhbHVlT3B0aW9ucykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgIiAgRk9PID0gMTM7XG4iCisgICAgIiAgQkFSID0gLTEwIFsgKHNvbWV0aGluZy50ZXh0KSA9ICdhYmMnIF07XG4iCisgICAgIiAgQkFaID0gNTAwIFsgKHNvbWV0aGluZy50ZXh0KSA9ICdkZWYnLCBvdGhlciA9IDEgXTtcbiIKKyAgICAifVxuIiwKKworICAgICJlbnVtX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RFbnVtXCIiCisgICAgIiAgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMTMgfSIKKyAgICAiICB2YWx1ZSB7IG5hbWU6IFwiQkFSXCIgbnVtYmVyOiAtMTAgIgorICAgICIgICAgb3B0aW9ucyB7ICIKKyAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJzb21ldGhpbmcudGV4dFwiIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICBzdHJpbmdfdmFsdWU6IFwiYWJjXCIgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgIH0gIgorICAgICIgIH0gIgorICAgICIgIHZhbHVlIHsgbmFtZTogXCJCQVpcIiBudW1iZXI6IDUwMCAiCisgICAgIiAgICBvcHRpb25zIHsgIgorICAgICIgICAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInNvbWV0aGluZy50ZXh0XCIgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgIHN0cmluZ192YWx1ZTogXCJkZWZcIiAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcIm90aGVyXCIgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAiICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgIH0gIgorICAgICIgIH0gIgorICAgICJ9Iik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlU2VydmljZVRlc3Q7CisKK1RFU1RfRihQYXJzZVNlcnZpY2VUZXN0LCBTaW1wbGVTZXJ2aWNlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKKyAgICAiICBycGMgRm9vKEluKSByZXR1cm5zIChPdXQpO1xuIgorICAgICJ9XG4iLAorCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTpcIkZvb1wiIGlucHV0X3R5cGU6XCJJblwiIG91dHB1dF90eXBlOlwiT3V0XCIgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VTZXJ2aWNlVGVzdCwgTWV0aG9kc0FuZFN0cmVhbXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgInNlcnZpY2UgVGVzdFNlcnZpY2Uge1xuIgorICAgICIgIHJwYyBGb28oSW4xKSByZXR1cm5zIChPdXQxKTtcbiIKKyAgICAiICBycGMgQmFyKEluMikgcmV0dXJucyAoT3V0Mik7XG4iCisgICAgIiAgcnBjIEJheihJbjMpIHJldHVybnMgKE91dDMpO1xuIgorICAgICJ9XG4iLAorCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTpcIkZvb1wiIGlucHV0X3R5cGU6XCJJbjFcIiBvdXRwdXRfdHlwZTpcIk91dDFcIiB9IgorICAgICIgIG1ldGhvZCB7IG5hbWU6XCJCYXJcIiBpbnB1dF90eXBlOlwiSW4yXCIgb3V0cHV0X3R5cGU6XCJPdXQyXCIgfSIKKyAgICAiICBtZXRob2QgeyBuYW1lOlwiQmF6XCIgaW5wdXRfdHlwZTpcIkluM1wiIG91dHB1dF90eXBlOlwiT3V0M1wiIH0iCisgICAgIn0iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gaW1wb3J0cyBhbmQgcGFja2FnZXMKKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlTWlzY1Rlc3Q7CisKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZUltcG9ydCkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAiaW1wb3J0IFwiZm9vL2Jhci9iYXoucHJvdG9cIjtcbiIsCisgICAgImRlcGVuZGVuY3k6IFwiZm9vL2Jhci9iYXoucHJvdG9cIiIpOworfQorCitURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VNdWx0aXBsZUltcG9ydHMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAiaW1wb3J0IFwiYmF6LnByb3RvXCI7XG4iLAorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhei5wcm90b1wiIik7Cit9CisKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZVB1YmxpY0ltcG9ydHMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJpbXBvcnQgcHVibGljIFwiYmFyLnByb3RvXCI7XG4iCisgICAgImltcG9ydCBcImJhei5wcm90b1wiO1xuIgorICAgICJpbXBvcnQgcHVibGljIFwicXV4LnByb3RvXCI7XG4iLAorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhei5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcInF1eC5wcm90b1wiIgorICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMSAiCisgICAgInB1YmxpY19kZXBlbmRlbmN5OiAzICIpOworfQorCitURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VQYWNrYWdlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJwYWNrYWdlIGZvby5iYXIuYmF6O1xuIiwKKyAgICAicGFja2FnZTogXCJmb28uYmFyLmJhelwiIik7Cit9CisKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZVBhY2thZ2VXaXRoU3BhY2VzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJwYWNrYWdlIGZvbyAgIC4gICBiYXIuICBcbiIKKyAgICAiICBiYXo7XG4iLAorICAgICJwYWNrYWdlOiBcImZvby5iYXIuYmF6XCIiKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gb3B0aW9ucworCitURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VGaWxlT3B0aW9ucykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAib3B0aW9uIGphdmFfcGFja2FnZSA9IFwiY29tLmdvb2dsZS5mb29cIjtcbiIKKyAgICAib3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsiLAorCisgICAgIm9wdGlvbnMgeyIKKyAgICAidW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImphdmFfcGFja2FnZVwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICIgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZTogXCJjb20uZ29vZ2xlLmZvb1wifSAiCisgICAgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJvcHRpbWl6ZV9mb3JcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIkNPREVfU0laRVwiIH0gIgorICAgICJ9Iik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEVycm9yIHRlc3RzCisvLworLy8gVGhlcmUgYXJlIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgcG9zc2libGUgZXJyb3JzIHRoYXQgdGhlIHBhcnNlciBjb3VsZAorLy8gcmVwb3J0LCBzbyBpdCdzIGluZmVhc2libGUgdG8gdGVzdCBldmVyeSBzaW5nbGUgb25lIG9mIHRoZW0uICBJbnN0ZWFkLAorLy8gd2UgdGVzdCBlYWNoIHVuaXF1ZSBjYWxsIHRvIEFkZEVycm9yKCkgaW4gcGFyc2VyLmguICBUaGlzIGRvZXMgbm90IG1lYW4KKy8vIHdlIGFyZSB0ZXN0aW5nIGV2ZXJ5IHBvc3NpYmxlIGVycm9yIHRoYXQgUGFyc2VyIGNhbiBnZW5lcmF0ZSBiZWNhdXNlCisvLyBlYWNoIHZhcmlhbnQgb2YgdGhlIENvbnN1bWUoKSBoZWxwZXIgb25seSBjb3VudHMgYXMgb25lIHVuaXF1ZSBjYWxsIHRvCisvLyBBZGRFcnJvcigpLgorCit0eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VFcnJvclRlc3Q7CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWlzc2luZ1N5bnRheElkZW50aWZpZXIpIHsKKyAgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8gPSB0cnVlOworICBFeHBlY3RIYXNFYXJseUV4aXRFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge30iLAorICAgICIwOjA6IEZpbGUgbXVzdCBiZWdpbiB3aXRoICdzeW50YXggPSBcInByb3RvMlwiOycuXG4iKTsKKyAgRVhQRUNUX0VRKCIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFVua25vd25TeW50YXhJZGVudGlmaWVyKSB7CisgIEV4cGVjdEhhc0Vhcmx5RXhpdEVycm9ycygKKyAgICAic3ludGF4ID0gXCJub19zdWNoX3N5bnRheFwiOyIsCisgICAgIjA6OTogVW5yZWNvZ25pemVkIHN5bnRheCBpZGVudGlmaWVyIFwibm9fc3VjaF9zeW50YXhcIi4gIFRoaXMgcGFyc2VyICIKKyAgICAgICJvbmx5IHJlY29nbml6ZXMgXCJwcm90bzJcIi5cbiIpOworICBFWFBFQ1RfRVEoIm5vX3N1Y2hfc3ludGF4IiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBTaW1wbGVTeW50YXhFcnJvcikgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2UgQCMkIHsgYmxhaCB9IiwKKyAgICAiMDoyMDogRXhwZWN0ZWQgXCJ7XCIuXG4iKTsKKyAgRVhQRUNUX0VRKCJwcm90bzIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4cGVjdGVkVG9wTGV2ZWwpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJibGFoOyIsCisgICAgIjA6MDogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBVbm1hdGNoZWRDbG9zZUJyYWNlKSB7CisgIC8vIFRoaXMgdXNlZCB0byBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLiAgRG9oLgorICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIn0iLAorICAgICIwOjA6IEV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgKGUuZy4gXCJtZXNzYWdlXCIpLlxuIgorICAgICIwOjA6IFVubWF0Y2hlZCBcIn1cIi5cbiIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNzYWdlIGVycm9ycworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1lc3NhZ2VNaXNzaW5nTmFtZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2Uge30iLAorICAgICIwOjg6IEV4cGVjdGVkIG1lc3NhZ2UgbmFtZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1lc3NhZ2VNaXNzaW5nQm9keSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2U7IiwKKyAgICAiMDoxOTogRXhwZWN0ZWQgXCJ7XCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJbk1lc3NhZ2UpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHsiLAorICAgICIwOjIxOiBSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBtZXNzYWdlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1pc3NpbmdGaWVsZE51bWJlcikgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIGludDMyIGZvbztcbiIKKyAgICAifVxuIiwKKyAgICAiMToyMDogTWlzc2luZyBmaWVsZCBudW1iZXIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFeHBlY3RlZEZpZWxkTnVtYmVyKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gO1xuIgorICAgICJ9XG4iLAorICAgICIxOjIzOiBFeHBlY3RlZCBmaWVsZCBudW1iZXIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBGaWVsZE51bWJlck91dE9mUmFuZ2UpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBmb28gPSAweDEwMDAwMDAwMDtcbiIKKyAgICAifVxuIiwKKyAgICAiMToyMzogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNaXNzaW5nTGFiZWwpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBpbnQzMiBmb28gPSAxO1xuIgorICAgICJ9XG4iLAorICAgICIxOjI6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFeHBlY3RlZE9wdGlvbk5hbWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMToyNzogRXhwZWN0ZWQgaWRlbnRpZmllci5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE5vbkV4dGVuc2lvbk9wdGlvbk5hbWVCZWdpbm5pbmdXaXRoRG90KSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgWy5mb289MV07XG4iCisgICAgIn1cbiIsCisgICAgIjE6Mjc6IEV4cGVjdGVkIGlkZW50aWZpZXIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVUeXBlTWlzbWF0Y2gpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD10cnVlXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMTozNTogRXhwZWN0ZWQgaW50ZWdlci5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU5vdEJvb2xlYW4pIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBib29sIGZvbyA9IDEgW2RlZmF1bHQ9YmxhaF07XG4iCisgICAgIn1cbiIsCisgICAgIjE6MzM6IEV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU5vdFN0cmluZykgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtkZWZhdWx0PTFdO1xuIgorICAgICJ9XG4iLAorICAgICIxOjM1OiBFeHBlY3RlZCBzdHJpbmcuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVVbnNpZ25lZE5lZ2F0aXZlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9LTFdO1xuIgorICAgICJ9XG4iLAorICAgICIxOjM2OiBVbnNpZ25lZCBmaWVsZCBjYW4ndCBoYXZlIG5lZ2F0aXZlIGRlZmF1bHQgdmFsdWUuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVUb29MYXJnZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIGludDMyICBmb28gPSAxIFtkZWZhdWx0PSAweDgwMDAwMDAwXTtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0tMHg4MDAwMDAwMV07XG4iCisgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9IDB4MTAwMDAwMDAwXTtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0gMHg4MDAwMDAwMDAwMDAwMDAwMF07XG4iCisgICAgIiAgb3B0aW9uYWwgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9LTB4ODAwMDAwMDAwMDAwMDAwMDFdO1xuIgorICAgICIgIG9wdGlvbmFsIHVpbnQ2NCBmb28gPSAxIFtkZWZhdWx0PSAweDEwMDAwMDAwMDAwMDAwMDAwMF07XG4iCisgICAgIn1cbiIsCisgICAgIjE6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICIyOjM2OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKKyAgICAiMzozNjogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iCisgICAgIjQ6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICI1OjM2OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKKyAgICAiNjozNjogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtVmFsdWVPdXRPZlJhbmdlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgIiAgSEVYX1RPT19CSUcgICA9ICAweDgwMDAwMDAwO1xuIgorICAgICIgIEhFWF9UT09fU01BTEwgPSAtMHg4MDAwMDAwMTtcbiIKKyAgICAiICBJTlRfVE9PX0JJRyAgID0gIDIxNDc0ODM2NDg7XG4iCisgICAgIiAgSU5UX1RPT19TTUFMTCA9IC0yMTQ3NDgzNjQ5O1xuIgorICAgICJ9XG4iLAorICAgICIxOjE5OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKKyAgICAiMjoxOTogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iCisgICAgIjM6MTk6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICI0OjE5OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU1pc3NpbmcpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD1dO1xuIgorICAgICJ9XG4iLAorICAgICIxOjM1OiBFeHBlY3RlZCBpbnRlZ2VyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlRm9yR3JvdXApIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBncm91cCBGb28gPSAxIFtkZWZhdWx0PWJsYWhdIHt9XG4iCisgICAgIn1cbiIsCisgICAgIjE6MzQ6IE1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEdXBsaWNhdGVEZWZhdWx0VmFsdWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0xLGRlZmF1bHQ9Ml07XG4iCisgICAgIn1cbiIsCisgICAgIjE6Mzc6IEFscmVhZHkgc2V0IG9wdGlvbiBcImRlZmF1bHRcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEdyb3VwTm90Q2FwaXRhbGl6ZWQpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBncm91cCBmb28gPSAxIHt9XG4iCisgICAgIn1cbiIsCisgICAgIjE6MTc6IEdyb3VwIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgR3JvdXBNaXNzaW5nQm9keSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIGdyb3VwIEZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjQ6IE1pc3NpbmcgZ3JvdXAgYm9keS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4dGVuZGluZ1ByaW1pdGl2ZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgImV4dGVuZCBpbnQzMiB7IG9wdGlvbmFsIHN0cmluZyBmb28gPSA0OyB9XG4iLAorICAgICIwOjc6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVycm9ySW5FeHRlbnNpb24pIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7IGV4dGVuc2lvbnMgMTAwIHRvIDE5OTsgfVxuIgorICAgICJleHRlbmQgRm9vIHsgb3B0aW9uYWwgc3RyaW5nIGZvbzsgfVxuIiwKKyAgICAiMTozMjogTWlzc2luZyBmaWVsZCBudW1iZXIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNdWx0aXBsZVBhcnNlRXJyb3JzKSB7CisgIC8vIFdoZW4gYSBzdGF0ZW1lbnQgaGFzIGEgcGFyc2UgZXJyb3IsIHRoZSBwYXJzZXIgc2hvdWxkIGJlIGFibGUgdG8gY29udGludWUKKyAgLy8gcGFyc2luZyBhdCB0aGUgbmV4dCBzdGF0ZW1lbnQuCisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vO1xuIgorICAgICIgICFpbnZhbGlkIHN0YXRlbWVudCBlbmRpbmcgaW4gYSBibG9jayB7IGJsYWggYmxhaCB7IGJsYWggfSBibGFoIH1cbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAzIHt9XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjA6IE1pc3NpbmcgZmllbGQgbnVtYmVyLlxuIgorICAgICIyOjI6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iCisgICAgIjI6MjogRXhwZWN0ZWQgdHlwZSBuYW1lLlxuIgorICAgICIzOjI1OiBFeHBlY3RlZCBcIjtcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluQWdncmVnYXRlVmFsdWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm9wdGlvbiAoZmlsZW9wdCkgPSB7IGk6MTAwXG4iLAorICAgICAgIjE6MDogVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHBhcnNpbmcgYWdncmVnYXRlIHZhbHVlLlxuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudW0gZXJyb3JzCisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRW9mSW5FbnVtKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAiZW51bSBUZXN0RW51bSB7IiwKKyAgICAiMDoxNTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gZW51bSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtVmFsdWVNaXNzaW5nTnVtYmVyKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgIiAgRk9PO1xuIgorICAgICJ9XG4iLAorICAgICIxOjU6IE1pc3NpbmcgbnVtZXJpYyB2YWx1ZSBmb3IgZW51bSBjb25zdGFudC5cbiIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXJ2aWNlIGVycm9ycworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluU2VydmljZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgInNlcnZpY2UgVGVzdFNlcnZpY2UgeyIsCisgICAgIjA6MjE6IFJlYWNoZWQgZW5kIG9mIGlucHV0IGluIHNlcnZpY2UgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgU2VydmljZU1ldGhvZFByaW1pdGl2ZVBhcmFtcykgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgInNlcnZpY2UgVGVzdFNlcnZpY2Uge1xuIgorICAgICIgIHJwYyBGb28oaW50MzIpIHJldHVybnMgKHN0cmluZyk7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MTA6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIKKyAgICAiMToyNjogRXhwZWN0ZWQgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJbk1ldGhvZE9wdGlvbnMpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKKyAgICAiICBycGMgRm9vKEJhcikgcmV0dXJucyhCYXIpIHsiLAorICAgICIxOjI5OiBSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBtZXRob2Qgb3B0aW9ucyAobWlzc2luZyAnfScpLlxuIgorICAgICIxOjI5OiBSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBzZXJ2aWNlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS5cbiIpOworfQorCisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgUHJpbWl0aXZlTWV0aG9kSW5wdXQpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKKyAgICAiICBycGMgRm9vKGludDMyKSByZXR1cm5zKEJhcik7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MTA6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIpOworfQorCisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWV0aG9kT3B0aW9uVHlwZUVycm9yKSB7CisgIC8vIFRoaXMgdXNlZCB0byBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLgorICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgQmF6IHt9XG4iCisgICAgInNlcnZpY2UgRm9vIHtcbiIKKyAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhCYXopIHsgb3B0aW9uIGludmFsaWQgc3ludGF4OyB9XG4iCisgICAgIn1cbiIsCisgICAgIjI6NDU6IEV4cGVjdGVkIFwiPVwiLlxuIik7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1wb3J0IGFuZCBwYWNrYWdlIGVycm9ycworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEltcG9ydE5vdFF1b3RlZCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgImltcG9ydCBmb287XG4iLAorICAgICIwOjc6IEV4cGVjdGVkIGEgc3RyaW5nIG5hbWluZyB0aGUgZmlsZSB0byBpbXBvcnQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNdWx0aXBsZVBhY2thZ2VzSW5GaWxlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAicGFja2FnZSBmb287XG4iCisgICAgInBhY2thZ2UgYmFyO1xuIiwKKyAgICAiMTowOiBNdWx0aXBsZSBwYWNrYWdlIGRlZmluaXRpb25zLlxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRlc3QgdGhhdCBlcnJvcnMgZGV0ZWN0ZWQgYnkgRGVzY3JpcHRvclBvb2wgY29ycmVjdGx5IHJlcG9ydCBsaW5lIGFuZAorLy8gY29sdW1uIG51bWJlcnMuICBXZSBoYXZlIG9uZSB0ZXN0IGZvciBldmVyeSBjYWxsIHRvIFJlY29yZExvY2F0aW9uKCkgaW4KKy8vIHBhcnNlci5jYy4KKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3Q7CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBQYWNrYWdlTmFtZUVycm9yKSB7CisgIC8vIENyZWF0ZSBhbm90aGVyIGZpbGUgd2hpY2ggZGVmaW5lcyBzeW1ib2wgImZvbyIuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXJfZmlsZTsKKyAgb3RoZXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgIG90aGVyX2ZpbGUuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiZm9vIik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShvdGhlcl9maWxlKSAhPSBOVUxMKTsKKworICAvLyBOb3cgdHJ5IHRvIGRlZmluZSBpdCBhcyBhIHBhY2thZ2UuCisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgInBhY2thZ2UgZm9vLmJhcjsiLAorICAgICIwOjg6IFwiZm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIHBhY2thZ2UpICIKKyAgICAgICJpbiBmaWxlIFwiYmFyLnByb3RvXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIE1lc3NhZ2VOYW1lRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAibWVzc2FnZSBGb28ge31cbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIsCisgICAgIjE6ODogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAxO1xuIgorICAgICIgIG9wdGlvbmFsIGludDMyIGJhciA9IDI7XG4iCisgICAgIn1cbiIsCisgICAgIjI6MTc6IFwiYmFyXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiRm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICBvcHRpb25hbCBCYXogYmFyID0gMTtcbiIKKyAgICAifVxuIiwKKyAgICAiMToxMTogXCJCYXpcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGROdW1iZXJFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMDtcbiIKKyAgICAifVxuIiwKKyAgICAiMToyMzogRmllbGQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZEV4dGVuZGVlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAiZXh0ZW5kIEJheiB7IG9wdGlvbmFsIGludDMyIGJhciA9IDE7IH1cbiIsCisgICAgIjA6NzogXCJCYXpcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGREZWZhdWx0VmFsdWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJlbnVtIEJheiB7IFFVWCA9IDE7IH1cbiIKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIG9wdGlvbmFsIEJheiBiYXIgPSAxIFtkZWZhdWx0PU5PX1NVQ0hfVkFMVUVdO1xuIgorICAgICJ9XG4iLAorICAgICIyOjMyOiBFbnVtIHR5cGUgXCJCYXpcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCJOT19TVUNIX1ZBTFVFXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpbGVPcHRpb25OYW1lRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAib3B0aW9uIGZvbyA9IDU7IiwKKyAgICAiMDo3OiBPcHRpb24gXCJmb29cIiB1bmtub3duLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWxlT3B0aW9uVmFsdWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSA1OyIsCisgICAgIjA6MzA6IFZhbHVlIG11c3QgYmUgcXVvdGVkIHN0cmluZyBmb3Igc3RyaW5nIG9wdGlvbiAiCisgICAgIlwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkT3B0aW9uTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICBvcHRpb25hbCBib29sIGJhciA9IDEgW2Zvbz0xXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMToyNTogT3B0aW9uIFwiZm9vXCIgdW5rbm93bi5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRPcHRpb25WYWx1ZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAxIFtjdHlwZT0xXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMTozMjogVmFsdWUgbXVzdCBiZSBpZGVudGlmaWVyIGZvciBlbnVtLXZhbHVlZCBvcHRpb24gIgorICAgICJcImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGVcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRXh0ZW5zaW9uUmFuZ2VOdW1iZXJFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgIiAgZXh0ZW5zaW9ucyAwO1xuIgorICAgICJ9XG4iLAorICAgICIxOjEzOiBFeHRlbnNpb24gbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgImVudW0gRm9vIHtBID0gMTt9XG4iCisgICAgImVudW0gRm9vIHtCID0gMTt9XG4iLAorICAgICIxOjU6IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtVmFsdWVOYW1lRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAiZW51bSBGb28ge1xuIgorICAgICIgIEJBUiA9IDE7XG4iCisgICAgIiAgQkFSID0gMTtcbiIKKyAgICAifVxuIiwKKyAgICAiMjoyOiBcIkJBUlwiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgU2VydmljZU5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJzZXJ2aWNlIEZvbyB7fVxuIgorICAgICJzZXJ2aWNlIEZvbyB7fVxuIiwKKyAgICAiMTo4OiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgTWV0aG9kTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm1lc3NhZ2UgQmF6IHt9XG4iCisgICAgInNlcnZpY2UgRm9vIHtcbiIKKyAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhCYXopO1xuIgorICAgICIgIHJwYyBCYXIoQmF6KSByZXR1cm5zKEJheik7XG4iCisgICAgIn1cbiIsCisgICAgIjM6NjogXCJCYXJcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gXCJGb29cIi5cbiIpOworfQorCisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXRob2RJbnB1dFR5cGVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEJheiB7fVxuIgorICAgICJzZXJ2aWNlIEZvbyB7XG4iCisgICAgIiAgcnBjIEJhcihRdXgpIHJldHVybnMoQmF6KTtcbiIKKyAgICAifVxuIiwKKyAgICAiMjoxMDogXCJRdXhcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXRob2RPdXRwdXRUeXBlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAibWVzc2FnZSBCYXoge31cbiIKKyAgICAic2VydmljZSBGb28ge1xuIgorICAgICIgIHJwYyBCYXIoQmF6KSByZXR1cm5zKFF1eCk7XG4iCisgICAgIn1cbiIsCisgICAgIjI6MjM6IFwiUXV4XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUZXN0IHRoYXQgdGhlIG91dHB1dCBmcm9tIEZpbGVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIChhbmQgYWxsIG90aGVyCisvLyBkZXNjcmlwdG9yIHR5cGVzKSBpcyBwYXJzZWFibGUsIGFuZCByZXN1bHRzIGluIHRoZSBzYW1lIERlc2NyaXB0b3IKKy8vIGRlZmluaXRpb25zIGFnYWluIGFmb3RlciBwYXJzaW5nIChub3QsIGhvd2V2ZXIsIHRoYXQgdGhlIG9yZGVyIG9mIG1lc3NhZ2VzCisvLyBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSkKKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlRGVjcmlwdG9yRGVidWdUZXN0OworCitjbGFzcyBDb21wYXJlRGVzY3JpcHRvck5hbWVzIHsKKyBwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBEZXNjcmlwdG9yUHJvdG8qIGxlZnQsIGNvbnN0IERlc2NyaXB0b3JQcm90byogcmlnaHQpIHsKKyAgICByZXR1cm4gbGVmdC0+bmFtZSgpIDwgcmlnaHQtPm5hbWUoKTsKKyAgfQorfTsKKworLy8gU29ydHMgbmVzdGVkIERlc2NyaXB0b3JQcm90b3Mgb2YgYSBEZXNjcmlwdG9Qcm90bywgYnkgbmFtZS4KK3ZvaWQgU29ydE1lc3NhZ2VzKERlc2NyaXB0b3JQcm90byAqZGVzY3JpcHRvcl9wcm90bykgeworICBpbnQgc2l6ZSA9IGRlc2NyaXB0b3JfcHJvdG8tPm5lc3RlZF90eXBlX3NpemUoKTsKKyAgLy8gcmVjdXJzaXZlbHkgc29ydDsgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBvZiBuZXN0ZWQgbWVzc2FnZXMgZWl0aGVyCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgU29ydE1lc3NhZ2VzKGRlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbmVzdGVkX3R5cGUoaSkpOworICB9CisgIERlc2NyaXB0b3JQcm90byAqKmRhdGEgPQorICAgIGRlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbmVzdGVkX3R5cGUoKS0+bXV0YWJsZV9kYXRhKCk7CisgIHNvcnQoZGF0YSwgZGF0YSArIHNpemUsIENvbXBhcmVEZXNjcmlwdG9yTmFtZXMoKSk7Cit9CisKKy8vIFNvcnRzIERlc2NyaXB0b3JQcm90b3MgYmVsb25naW5nIHRvIGEgRmlsZURlc2NyaXB0b3JQcm90bywgYnkgbmFtZS4KK3ZvaWQgU29ydE1lc3NhZ2VzKEZpbGVEZXNjcmlwdG9yUHJvdG8gKmZpbGVfZGVzY3JpcHRvcl9wcm90bykgeworICBpbnQgc2l6ZSA9IGZpbGVfZGVzY3JpcHRvcl9wcm90by0+bWVzc2FnZV90eXBlX3NpemUoKTsKKyAgLy8gcmVjdXJzaXZlbHkgc29ydDsgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBvZiBuZXN0ZWQgbWVzc2FnZXMgZWl0aGVyCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgU29ydE1lc3NhZ2VzKGZpbGVfZGVzY3JpcHRvcl9wcm90by0+bXV0YWJsZV9tZXNzYWdlX3R5cGUoaSkpOworICB9CisgIERlc2NyaXB0b3JQcm90byAqKmRhdGEgPQorICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+bXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+bXV0YWJsZV9kYXRhKCk7CisgIHNvcnQoZGF0YSwgZGF0YSArIHNpemUsIENvbXBhcmVEZXNjcmlwdG9yTmFtZXMoKSk7Cit9CisKK1RFU1RfRihQYXJzZURlY3JpcHRvckRlYnVnVGVzdCwgVGVzdEFsbERlc2NyaXB0b3JUeXBlcykgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogb3JpZ2luYWxfZmlsZSA9CisgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIGV4cGVjdGVkOworICBvcmlnaW5hbF9maWxlLT5Db3B5VG8oJmV4cGVjdGVkKTsKKworICAvLyBHZXQgdGhlIERlYnVnU3RyaW5nIG9mIHRoZSB1bml0dGVzdC5wcm90byBGaWxlRGVjcmlwdG9yLCB3aGljaCBpbmNsdWRlcworICAvLyBhbGwgb3RoZXIgZGVzY3JpcHRvciB0eXBlcworICBzdHJpbmcgZGVidWdfc3RyaW5nID0gb3JpZ2luYWxfZmlsZS0+RGVidWdTdHJpbmcoKTsKKworICAvLyBQYXJzZSB0aGUgZGVidWcgc3RyaW5nCisgIFNldHVwUGFyc2VyKGRlYnVnX3N0cmluZy5jX3N0cigpKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBwYXJzZWQ7CisgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZCk7CisgIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7CisgIEFTU0VSVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisKKyAgLy8gV2Ugbm93IGhhdmUgYSBGaWxlRGVzY3JpcHRvclByb3RvLCBidXQgdG8gY29tcGFyZSB3aXRoIHRoZSBleHBlY3RlZCB3ZQorICAvLyBuZWVkIHRvIGxpbmsgdG8gYSBGaWxlRGVjcmlwdG9yLCB0aGVuIG91dHB1dCBiYWNrIHRvIGEgcHJvdG8uIFdlJ2xsCisgIC8vIGFsc28gbmVlZCB0byBnaXZlIGl0IHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsLgorICBwYXJzZWQuc2V0X25hbWUoImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byIpOworICAvLyBXZSBuZWVkIHRoZSBpbXBvcnRlZCBkZXBlbmRlbmN5IGJlZm9yZSB3ZSBjYW4gYnVpbGQgb3VyIHBhcnNlZCBwcm90bworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHVibGljX2ltcG9ydCA9CisgICAgICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ6OlB1YmxpY0ltcG9ydE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIHB1YmxpY19pbXBvcnRfcHJvdG87CisgIHB1YmxpY19pbXBvcnQtPkNvcHlUbygmcHVibGljX2ltcG9ydF9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShwdWJsaWNfaW1wb3J0X3Byb3RvKSAhPSBOVUxMKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGltcG9ydCA9CisgICAgICAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBpbXBvcnRfcHJvdG87CisgIGltcG9ydC0+Q29weVRvKCZpbXBvcnRfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoaW1wb3J0X3Byb3RvKSAhPSBOVUxMKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGFjdHVhbCA9IHBvb2xfLkJ1aWxkRmlsZShwYXJzZWQpOworICBwYXJzZWQuQ2xlYXIoKTsKKyAgYWN0dWFsLT5Db3B5VG8oJnBhcnNlZCk7CisgIEFTU0VSVF9UUlVFKGFjdHVhbCAhPSBOVUxMKTsKKworICAvLyBUaGUgbWVzc2FnZXMgbWlnaHQgYmUgaW4gZGlmZmVyZW50IG9yZGVycywgbWFraW5nIHRoZW0gaGFyZCB0byBjb21wYXJlLgorICAvLyBTbywgc29ydCB0aGUgbWVzc2FnZXMgaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9zIChpbmNsdWRpbmcgbmVzdGVkIG1lc3NhZ2VzLAorICAvLyByZWN1cnNpdmVseSkuCisgIFNvcnRNZXNzYWdlcygmZXhwZWN0ZWQpOworICBTb3J0TWVzc2FnZXMoJnBhcnNlZCk7CisKKyAgLy8gSSByZWFsbHkgd2FudGVkIHRvIHVzZSBTdHJpbmdEaWZmIGhlcmUgZm9yIHRoZSBkZWJ1ZyBvdXRwdXQgb24gZmFpbCwKKyAgLy8gYnV0IHRoZSBzdHJpbmdzIGFyZSB0b28gbG9uZyBmb3IgaXQsIGFuZCBpZiBJIGluY3JlYXNlIGl0cyBtYXggc2l6ZSwKKyAgLy8gd2UgZ2V0IGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSA6KAorICBFWFBFQ1RfRVEoZXhwZWN0ZWQuRGVidWdTdHJpbmcoKSwgcGFyc2VkLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoUGFyc2VEZWNyaXB0b3JEZWJ1Z1Rlc3QsIFRlc3RDdXN0b21PcHRpb25zKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBvcmlnaW5hbF9maWxlID0KKyAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZU1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIGV4cGVjdGVkOworICBvcmlnaW5hbF9maWxlLT5Db3B5VG8oJmV4cGVjdGVkKTsKKworICBzdHJpbmcgZGVidWdfc3RyaW5nID0gb3JpZ2luYWxfZmlsZS0+RGVidWdTdHJpbmcoKTsKKworICAvLyBQYXJzZSB0aGUgZGVidWcgc3RyaW5nCisgIFNldHVwUGFyc2VyKGRlYnVnX3N0cmluZy5jX3N0cigpKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBwYXJzZWQ7CisgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZCk7CisgIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7CisgIEFTU0VSVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisKKyAgLy8gV2Ugbm93IGhhdmUgYSBGaWxlRGVzY3JpcHRvclByb3RvLCBidXQgdG8gY29tcGFyZSB3aXRoIHRoZSBleHBlY3RlZCB3ZQorICAvLyBuZWVkIHRvIGxpbmsgdG8gYSBGaWxlRGVjcmlwdG9yLCB0aGVuIG91dHB1dCBiYWNrIHRvIGEgcHJvdG8uIFdlJ2xsCisgIC8vIGFsc28gbmVlZCB0byBnaXZlIGl0IHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsLgorICBwYXJzZWQuc2V0X25hbWUob3JpZ2luYWxfZmlsZS0+bmFtZSgpKTsKKworICAvLyB1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byBkZXBlbmRzIG9uIGRlc2NyaXB0b3IucHJvdG8uCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBpbXBvcnQgPSBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBpbXBvcnRfcHJvdG87CisgIGltcG9ydC0+Q29weVRvKCZpbXBvcnRfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoaW1wb3J0X3Byb3RvKSAhPSBOVUxMKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGFjdHVhbCA9IHBvb2xfLkJ1aWxkRmlsZShwYXJzZWQpOworICBBU1NFUlRfVFJVRShhY3R1YWwgIT0gTlVMTCk7CisgIHBhcnNlZC5DbGVhcigpOworICBhY3R1YWwtPkNvcHlUbygmcGFyc2VkKTsKKworICAvLyBUaGUgbWVzc2FnZXMgbWlnaHQgYmUgaW4gZGlmZmVyZW50IG9yZGVycywgbWFraW5nIHRoZW0gaGFyZCB0byBjb21wYXJlLgorICAvLyBTbywgc29ydCB0aGUgbWVzc2FnZXMgaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9zIChpbmNsdWRpbmcgbmVzdGVkIG1lc3NhZ2VzLAorICAvLyByZWN1cnNpdmVseSkuCisgIFNvcnRNZXNzYWdlcygmZXhwZWN0ZWQpOworICBTb3J0TWVzc2FnZXMoJnBhcnNlZCk7CisKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLkRlYnVnU3RyaW5nKCksIHBhcnNlZC5EZWJ1Z1N0cmluZygpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU291cmNlQ29kZUluZm8gdGVzdHMuCisKKy8vIEZvbGxvd3MgYSBwYXRoIC0tIGFzIGRlZmluZWQgYnkgU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCAtLSBmcm9tIGEKKy8vIG1lc3NhZ2UgdG8gYSBwYXJ0aWN1bGFyIHN1Yi1maWVsZC4KKy8vICogSWYgdGhlIHRhcmdldCBpcyBpdHNlbGYgYSBtZXNzYWdlLCBzZXRzICpvdXRwdXRfbWVzc2FnZSB0byBwb2ludCBhdCBpdCwKKy8vICAgKm91dHB1dF9maWVsZCB0byBOVUxMLCBhbmQgKm91dHB1dF9pbmRleCB0byAtMS4KKy8vICogT3RoZXJ3aXNlLCBpZiB0aGUgdGFyZ2V0IGlzIGFuIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZCwgc2V0cworLy8gICAqb3V0cHV0X21lc3NhZ2UgdG8gdGhlIGNvbnRhaW5pbmcgbWVzc2FnZSwgKm91dHB1dF9maWVsZCB0byB0aGUgZGVzY3JpcHRvcgorLy8gICBvZiB0aGUgZmllbGQsIGFuZCAqb3V0cHV0X2luZGV4IHRvIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC4KKy8vICogT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0IGlzIGEgZmllbGQgKHBvc3NpYmx5IGEgcmVwZWF0ZWQgZmllbGQsIGJ1dCBub3QgYW55CisvLyAgIG9uZSBlbGVtZW50KS4gIFNldHMgKm91dHB1dF9tZXNzYWdlIHRvIHRoZSBjb250YWluaW5nIG1lc3NhZ2UsCisvLyAgICpvdXRwdXRfZmllbGQgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkLCBhbmQgKm91dHB1dF9pbmRleCB0byAtMS4KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCB3YXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4gIEEgZ1Rlc3QgZmFpbHVyZSBpcworLy8gcmVjb3JkZWQgYmVmb3JlIHJldHVybmluZyBmYWxzZS4KK2Jvb2wgRm9sbG93UGF0aChjb25zdCBNZXNzYWdlJiByb290LAorICAgICAgICAgICAgICAgIGNvbnN0IGludCogcGF0aF9iZWdpbiwgY29uc3QgaW50KiBwYXRoX2VuZCwKKyAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiogb3V0cHV0X21lc3NhZ2UsCisgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogb3V0cHV0X2ZpZWxkLAorICAgICAgICAgICAgICAgIGludCogb3V0cHV0X2luZGV4KSB7CisgIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7CisgICAgLy8gUGF0aCByZWZlcnMgdG8gdGhpcyB3aG9sZSBtZXNzYWdlLgorICAgICpvdXRwdXRfbWVzc2FnZSA9ICZyb290OworICAgICpvdXRwdXRfZmllbGQgPSBOVUxMOworICAgICpvdXRwdXRfaW5kZXggPSAtMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSByb290LkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHJvb3QuR2V0UmVmbGVjdGlvbigpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU51bWJlcigqcGF0aF9iZWdpbik7CisKKyAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiIGhhcyBubyBmaWVsZCBudW1iZXI6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICpwYXRoX2JlZ2luOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICsrcGF0aF9iZWdpbjsKKworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBpZiAocGF0aF9iZWdpbiA9PSBwYXRoX2VuZCkgeworICAgICAgLy8gUGF0aCByZWZlcnMgdG8gdGhlIHdob2xlIHJlcGVhdGVkIGZpZWxkLgorICAgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7CisgICAgICAqb3V0cHV0X2ZpZWxkID0gZmllbGQ7CisgICAgICAqb3V0cHV0X2luZGV4ID0gLTE7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQgaW5kZXggPSAqcGF0aF9iZWdpbisrOworICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKHJvb3QsIGZpZWxkKTsKKworICAgIGlmIChpbmRleCA+PSBzaXplKSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiLiIgPDwgZmllbGQtPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGhhcyBzaXplICIgPDwgc2l6ZSA8PCAiLCBidXQgcGF0aCBjb250YWluZWQgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZXg7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAvLyBEZXNjZW5kIGludG8gY2hpbGQgbWVzc2FnZS4KKyAgICAgIGNvbnN0IE1lc3NhZ2UmIGNoaWxkID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKHJvb3QsIGZpZWxkLCBpbmRleCk7CisgICAgICByZXR1cm4gRm9sbG93UGF0aChjaGlsZCwgcGF0aF9iZWdpbiwgcGF0aF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbWVzc2FnZSwgb3V0cHV0X2ZpZWxkLCBvdXRwdXRfaW5kZXgpOworICAgIH0gZWxzZSBpZiAocGF0aF9iZWdpbiA9PSBwYXRoX2VuZCkgeworICAgICAgLy8gUGF0aCByZWZlcnMgdG8gdGhpcyBlbGVtZW50LgorICAgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7CisgICAgICAqb3V0cHV0X2ZpZWxkID0gZmllbGQ7CisgICAgICAqb3V0cHV0X2luZGV4ID0gaW5kZXg7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCBkZXNjcmlwdG9yLT5uYW1lKCkgPDwgIi4iIDw8IGZpZWxkLT5uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYSBtZXNzYWdlOyBjYW5ub3QgZGVzY2VuZCBpbnRvIGl0LiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgY29uc3QgTWVzc2FnZSYgY2hpbGQgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKHJvb3QsIGZpZWxkKTsKKyAgICAgIHJldHVybiBGb2xsb3dQYXRoKGNoaWxkLCBwYXRoX2JlZ2luLCBwYXRoX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9tZXNzYWdlLCBvdXRwdXRfZmllbGQsIG91dHB1dF9pbmRleCk7CisgICAgfSBlbHNlIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7CisgICAgICAvLyBQYXRoIHJlZmVycyB0byB0aGlzIGZpZWxkLgorICAgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7CisgICAgICAqb3V0cHV0X2ZpZWxkID0gZmllbGQ7CisgICAgICAqb3V0cHV0X2luZGV4ID0gLTE7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCBkZXNjcmlwdG9yLT5uYW1lKCkgPDwgIi4iIDw8IGZpZWxkLT5uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYSBtZXNzYWdlOyBjYW5ub3QgZGVzY2VuZCBpbnRvIGl0LiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKKy8vIENoZWNrIGlmIHR3byBzcGFucyBhcmUgZXF1YWwuCitib29sIENvbXBhcmVTcGFucyhjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHNwYW4xLAorICAgICAgICAgICAgICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ+JiBzcGFuMikgeworICBpZiAoc3BhbjEuc2l6ZSgpICE9IHNwYW4yLnNpemUoKSkgcmV0dXJuIGZhbHNlOworICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW4xLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHNwYW4xLkdldChpKSAhPSBzcGFuMi5HZXQoaSkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGVzdCBmaXh0dXJlIGZvciBzb3VyY2UgaW5mbyB0ZXN0cywgd2hpY2ggY2hlY2sgdGhhdCBzb3VyY2UgbG9jYXRpb25zIGFyZQorLy8gcmVjb3JkZWQgY29ycmVjdGx5IGluIEZpbGVEZXNjcmlwdG9yUHJvdG8uc291cmNlX2NvZGVfaW5mby5sb2NhdGlvbi4KK2NsYXNzIFNvdXJjZUluZm9UZXN0IDogcHVibGljIFBhcnNlclRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gVGhlIHBhcnNlZCBmaWxlIChpbml0aWFsaXplZCBieSBQYXJzZSgpKS4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlXzsKKworICAvLyBQYXJzZSB0aGUgZ2l2ZW4gdGV4dCBhcyBhIC5wcm90byBmaWxlIGFuZCBwb3B1bGF0ZSB0aGUgc3BhbnNfIG1hcCB3aXRoCisgIC8vIGFsbCB0aGUgc291cmNlIGxvY2F0aW9uIHNwYW5zIGluIGl0cyBTb3VyY2VDb2RlSW5mbyB0YWJsZS4KKyAgYm9vbCBQYXJzZShjb25zdCBjaGFyKiB0ZXh0KSB7CisgICAgRXh0cmFjdE1hcmtlcnModGV4dCk7CisgICAgU2V0dXBQYXJzZXIodGV4dF93aXRob3V0X21hcmtlcnNfLmNfc3RyKCkpOworICAgIGlmICghcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmZmlsZV8pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgU291cmNlQ29kZUluZm8mIHNvdXJjZV9pbmZvID0gZmlsZV8uc291cmNlX2NvZGVfaW5mbygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlX2luZm8ubG9jYXRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICAgIGNvbnN0IFNvdXJjZUNvZGVJbmZvOjpMb2NhdGlvbiYgbG9jYXRpb24gPSBzb3VyY2VfaW5mby5sb2NhdGlvbihpKTsKKyAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3JfcHJvdG8gPSBOVUxMOworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IE5VTEw7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgaWYgKCFGb2xsb3dQYXRoKGZpbGVfLCBsb2NhdGlvbi5wYXRoKCkuYmVnaW4oKSwgbG9jYXRpb24ucGF0aCgpLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3Byb3RvLCAmZmllbGQsICZpbmRleCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBzcGFuc18uaW5zZXJ0KG1ha2VfcGFpcihTcGFuS2V5KCpkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZCwgaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2F0aW9uKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgRVhQRUNUX1RSVUUoc3BhbnNfLmVtcHR5KCkpCisgICAgICAgIDw8ICJGb3Jnb3QgdG8gY2FsbCBIYXNTcGFuKCkgZm9yOlxuIgorICAgICAgICA8PCBzcGFuc18uYmVnaW4oKS0+c2Vjb25kLT5EZWJ1Z1N0cmluZygpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSGFzU3BhbigpIGNoZWNrcyB0aGF0IHRoZSBzcGFuIG9mIHNvdXJjZSBjb2RlIGRlbGltaXRlZCBieSB0aGUgZ2l2ZW4KKyAgLy8gdGFncyAoY29tbWVudHMpIGNvcnJlc3BvbmQgdmlhIHRoZSBTb3VyY2VDb2RlSW5mbyB0YWJsZSB0byB0aGUgZ2l2ZW4KKyAgLy8gcGFydCBvZiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4gIChJZiB1bmNsZWFyLCBsb29rIGF0IHRoZSBhY3R1YWwgdGVzdHM7CisgIC8vIGl0IHNob3VsZCBxdWlja2x5IGJlY29tZSBvYnZpb3VzLikKKworICBib29sIEhhc1NwYW4oY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwKKyAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8pIHsKKyAgICByZXR1cm4gSGFzU3BhbldpdGhDb21tZW50KAorICAgICAgICBzdGFydF9tYXJrZXIsIGVuZF9tYXJrZXIsIGRlc2NyaXB0b3JfcHJvdG8sIE5VTEwsIC0xLCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIGJvb2wgSGFzU3BhbldpdGhDb21tZW50KGNoYXIgc3RhcnRfbWFya2VyLCBjaGFyIGVuZF9tYXJrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzKSB7CisgICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudCgKKyAgICAgICAgc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLCBOVUxMLCAtMSwKKyAgICAgICAgZXhwZWN0ZWRfbGVhZGluZ19jb21tZW50cywgZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMpOworICB9CisKKyAgYm9vbCBIYXNTcGFuKGNoYXIgc3RhcnRfbWFya2VyLCBjaGFyIGVuZF9tYXJrZXIsCisgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUpIHsKKyAgICByZXR1cm4gSGFzU3BhbihzdGFydF9tYXJrZXIsIGVuZF9tYXJrZXIsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkX25hbWUsIC0xKTsKKyAgfQorCisgIGJvb2wgSGFzU3BhbihjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAorICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIEhhc1NwYW4oc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLAorICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWUsIGluZGV4LCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIGJvb2wgSGFzU3BhbihjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAorICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywKKyAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfbGVhZGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICAgIGRlc2NyaXB0b3JfcHJvdG8uR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7CisgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgZGVzY3JpcHRvcl9wcm90by5HZXREZXNjcmlwdG9yKCktPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGhhcyBubyBzdWNoIGZpZWxkOiAiIDw8IGZpZWxkX25hbWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudCgKKyAgICAgICAgc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZCwgaW5kZXgsCisgICAgICAgIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsIGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzKTsKKyAgfQorCisgIGJvb2wgSGFzU3Bhbihjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvKSB7CisgICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudCgKKyAgICAgICAgJ1wwJywgJ1wwJywgZGVzY3JpcHRvcl9wcm90bywgTlVMTCwgLTEsIE5VTEwsIE5VTEwpOworICB9CisKKyAgYm9vbCBIYXNTcGFuKGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSkgeworICAgIHJldHVybiBIYXNTcGFuKCdcMCcsICdcMCcsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkX25hbWUsIC0xKTsKKyAgfQorCisgIGJvb2wgSGFzU3Bhbihjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gSGFzU3BhbignXDAnLCAnXDAnLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZF9uYW1lLCBpbmRleCk7CisgIH0KKworICBib29sIEhhc1NwYW5XaXRoQ29tbWVudChjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzKSB7CisgICAgcGFpcjxTcGFuTWFwOjppdGVyYXRvciwgU3Bhbk1hcDo6aXRlcmF0b3I+IHJhbmdlID0KKyAgICAgICAgc3BhbnNfLmVxdWFsX3JhbmdlKFNwYW5LZXkoZGVzY3JpcHRvcl9wcm90bywgZmllbGQsIGluZGV4KSk7CisKKyAgICBpZiAoc3RhcnRfbWFya2VyID09ICdcMCcpIHsKKyAgICAgIGlmIChyYW5nZS5maXJzdCA9PSByYW5nZS5zZWNvbmQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3BhbnNfLmVyYXNlKHJhbmdlLmZpcnN0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBhaXI8aW50LCBpbnQ+IHN0YXJ0X3BvcyA9IEZpbmRPckRpZShtYXJrZXJzXywgc3RhcnRfbWFya2VyKTsKKyAgICAgIHBhaXI8aW50LCBpbnQ+IGVuZF9wb3MgPSBGaW5kT3JEaWUobWFya2Vyc18sIGVuZF9tYXJrZXIpOworCisgICAgICBSZXBlYXRlZEZpZWxkPGludD4gZXhwZWN0ZWRfc3BhbjsKKyAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKHN0YXJ0X3Bvcy5maXJzdCk7CisgICAgICBleHBlY3RlZF9zcGFuLkFkZChzdGFydF9wb3Muc2Vjb25kKTsKKyAgICAgIGlmIChlbmRfcG9zLmZpcnN0ICE9IHN0YXJ0X3Bvcy5maXJzdCkgeworICAgICAgICBleHBlY3RlZF9zcGFuLkFkZChlbmRfcG9zLmZpcnN0KTsKKyAgICAgIH0KKyAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKGVuZF9wb3Muc2Vjb25kKTsKKworICAgICAgZm9yIChTcGFuTWFwOjppdGVyYXRvciBpdGVyID0gcmFuZ2UuZmlyc3Q7IGl0ZXIgIT0gcmFuZ2Uuc2Vjb25kOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKENvbXBhcmVTcGFucyhleHBlY3RlZF9zcGFuLCBpdGVyLT5zZWNvbmQtPnNwYW4oKSkpIHsKKyAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVhZGluZ19jb21tZW50cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXRlci0+c2Vjb25kLT5oYXNfbGVhZGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXRlci0+c2Vjb25kLT5oYXNfbGVhZGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bGVhZGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdGVyLT5zZWNvbmQtPmhhc190cmFpbGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXRlci0+c2Vjb25kLT5oYXNfdHJhaWxpbmdfY29tbWVudHMoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT50cmFpbGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzcGFuc18uZXJhc2UoaXRlcik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgc3RydWN0IFNwYW5LZXkgeworICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3JfcHJvdG87CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBpbmxpbmUgU3BhbktleSgpIHt9CisgICAgaW5saW5lIFNwYW5LZXkoY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90b19wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIGludCBpbmRleF9wYXJhbSkKKyAgICAgICAgOiBkZXNjcmlwdG9yX3Byb3RvKCZkZXNjcmlwdG9yX3Byb3RvX3BhcmFtKSwgZmllbGQoZmllbGRfcGFyYW0pLAorICAgICAgICAgIGluZGV4KGluZGV4X3BhcmFtKSB7fQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNwYW5LZXkmIG90aGVyKSBjb25zdCB7CisgICAgICBpZiAoZGVzY3JpcHRvcl9wcm90byA8IG90aGVyLmRlc2NyaXB0b3JfcHJvdG8pIHJldHVybiB0cnVlOworICAgICAgaWYgKGRlc2NyaXB0b3JfcHJvdG8gPiBvdGhlci5kZXNjcmlwdG9yX3Byb3RvKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoZmllbGQgPCBvdGhlci5maWVsZCkgcmV0dXJuIHRydWU7CisgICAgICBpZiAoZmllbGQgPiBvdGhlci5maWVsZCkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIGluZGV4IDwgb3RoZXIuaW5kZXg7CisgICAgfQorICB9OworCisgIHR5cGVkZWYgbXVsdGltYXA8U3BhbktleSwgY29uc3QgU291cmNlQ29kZUluZm86OkxvY2F0aW9uKj4gU3Bhbk1hcDsKKyAgU3Bhbk1hcCBzcGFuc187CisgIG1hcDxjaGFyLCBwYWlyPGludCwgaW50PiA+IG1hcmtlcnNfOworICBzdHJpbmcgdGV4dF93aXRob3V0X21hcmtlcnNfOworCisgIHZvaWQgRXh0cmFjdE1hcmtlcnMoY29uc3QgY2hhciogdGV4dCkgeworICAgIG1hcmtlcnNfLmNsZWFyKCk7CisgICAgdGV4dF93aXRob3V0X21hcmtlcnNfLmNsZWFyKCk7CisgICAgaW50IGxpbmUgPSAwOworICAgIGludCBjb2x1bW4gPSAwOworICAgIHdoaWxlICgqdGV4dCAhPSAnXDAnKSB7CisgICAgICBpZiAoKnRleHQgPT0gJyQnKSB7CisgICAgICAgICsrdGV4dDsKKyAgICAgICAgR09PR0xFX0NIRUNLX05FKCdcMCcsICp0ZXh0KTsKKyAgICAgICAgaWYgKCp0ZXh0ID09ICckJykgeworICAgICAgICAgIHRleHRfd2l0aG91dF9tYXJrZXJzXyArPSAnJCc7CisgICAgICAgICAgKytjb2x1bW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWFya2Vyc19bKnRleHRdID0gbWFrZV9wYWlyKGxpbmUsIGNvbHVtbik7CisgICAgICAgICAgKyt0ZXh0OworICAgICAgICAgIEdPT0dMRV9DSEVDS19FUSgnJCcsICp0ZXh0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICgqdGV4dCA9PSAnXG4nKSB7CisgICAgICAgICsrbGluZTsKKyAgICAgICAgY29sdW1uID0gMDsKKyAgICAgICAgdGV4dF93aXRob3V0X21hcmtlcnNfICs9ICp0ZXh0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dF93aXRob3V0X21hcmtlcnNfICs9ICp0ZXh0OworICAgICAgICArK2NvbHVtbjsKKyAgICAgIH0KKyAgICAgICsrdGV4dDsKKyAgICB9CisgIH0KK307CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgQmFzaWNGaWxlRGVjbHMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAiJGEkc3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJwYWNrYWdlICRiJGZvby5iYXIkYyQ7XG4iCisgICAgICAiaW1wb3J0ICRkJFwiYmF6LnByb3RvXCIkZSQ7XG4iCisgICAgICAiaW1wb3J0ICRmJFwicXV4LnByb3RvXCIkZyQ7JGgkXG4iCisgICAgICAiXG4iCisgICAgICAiLy8gY29tbWVudCBpZ25vcmVkXG4iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdoJywgZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmlsZV8sICJwYWNrYWdlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBmaWxlXywgImRlcGVuZGVuY3kiLCAwKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGZpbGVfLCAiZGVwZW5kZW5jeSIsIDEpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBNZXNzYWdlcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICIkYSRtZXNzYWdlICRiJEZvbyRjJCB7fSRkJFxuIgorICAgICAgIiRlJG1lc3NhZ2UgJGYkQmFyJGckIHt9JGgkXG4iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdkJywgZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnaCcsIGZpbGVfLm1lc3NhZ2VfdHlwZSgxKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMSksICJuYW1lIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIEZpZWxkcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICAkYSRvcHRpb25hbCRiJCAkYyRpbnQzMiRkJCAkZSRiYXIkZiQgPSAkZyQxJGgkOyRpJFxuIgorICAgICAgIiAgJGokcmVwZWF0ZWQkayQgJGwkWC5ZJG0kICRuJGJheiRvJCA9ICRwJDIkcSQ7JHIkXG4iCisgICAgICAifVxuIikpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDEgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdpJywgZmllbGQxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpZWxkMSwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBmaWVsZDEsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWVsZDEsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWVsZDEsICJudW1iZXIiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaicsICdyJywgZmllbGQyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnaycsIGZpZWxkMiwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBmaWVsZDIsICJ0eXBlX25hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ24nLCAnbycsIGZpZWxkMiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3AnLCAncScsIGZpZWxkMiwgIm51bWJlciIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIEV4dGVuc2lvbnMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAiJGEkZXh0ZW5kICRiJEZvbyRjJCB7XG4iCisgICAgICAiICAkZCRvcHRpb25hbCRlJCBpbnQzMiBiYXIgPSAxOyRmJFxuIgorICAgICAgIiAgJGckcmVwZWF0ZWQkaCQgWC5ZIGJheiA9IDI7JGkkXG4iCisgICAgICAifSRqJFxuIgorICAgICAgIiRrJGV4dGVuZCAkbCRCYXIkbSQge1xuIgorICAgICAgIiAgJG4kb3B0aW9uYWwgaW50MzIgcXV4ID0gMTskbyRcbiIKKyAgICAgICJ9JHAkXG4iKSk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMSA9IGZpbGVfLmV4dGVuc2lvbigwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMiA9IGZpbGVfLmV4dGVuc2lvbigxKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMyA9IGZpbGVfLmV4dGVuc2lvbigyKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2onLCBmaWxlXywgImV4dGVuc2lvbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaycsICdwJywgZmlsZV8sICJleHRlbnNpb24iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdmJywgZmllbGQxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIGZpZWxkMSwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWVsZDEsICJleHRlbmRlZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2knLCBmaWVsZDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdoJywgZmllbGQyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpZWxkMiwgImV4dGVuZGVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ24nLCAnbycsIGZpZWxkMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBmaWVsZDMsICJleHRlbmRlZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibnVtYmVyIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIE5lc3RlZEV4dGVuc2lvbnMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAibWVzc2FnZSBNZXNzYWdlIHtcbiIKKyAgICAgICIgICRhJGV4dGVuZCAkYiRGb28kYyQge1xuIgorICAgICAgIiAgICAkZCRvcHRpb25hbCRlJCBpbnQzMiBiYXIgPSAxOyRmJFxuIgorICAgICAgIiAgICAkZyRyZXBlYXRlZCRoJCBYLlkgYmF6ID0gMjskaSRcbiIKKyAgICAgICIgIH0kaiRcbiIKKyAgICAgICIgICRrJGV4dGVuZCAkbCRCYXIkbSQge1xuIgorICAgICAgIiAgICAkbiRvcHRpb25hbCBpbnQzMiBxdXggPSAxOyRvJFxuIgorICAgICAgIiAgfSRwJFxuIgorICAgICAgIn1cbiIpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbigwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMiA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb24oMSk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDMgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uKDIpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaicsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaycsICdwJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZicsIGZpZWxkMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBmaWVsZDEsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmllbGQxLCAiZXh0ZW5kZWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdpJywgZmllbGQyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpZWxkMiwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWVsZDIsICJleHRlbmRlZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCduJywgJ28nLCBmaWVsZDMpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgZmllbGQzLCAiZXh0ZW5kZWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibnVtYmVyIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIEV4dGVuc2lvblJhbmdlcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICJtZXNzYWdlIE1lc3NhZ2Uge1xuIgorICAgICAgIiAgJGEkZXh0ZW5zaW9ucyAkYiQxJGMkIHRvICRkJDQkZSQsICRmJDYkZyQ7JGgkXG4iCisgICAgICAiICAkaSRleHRlbnNpb25zICRqJDgkayQgdG8gJGwkbWF4JG0kOyRuJFxuIgorICAgICAgIn1cbiIpKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlJiByYW5nZTEgPQorICAgICAgZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbl9yYW5nZSgwKTsKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSYgcmFuZ2UyID0KKyAgICAgIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb25fcmFuZ2UoMSk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHJhbmdlMyA9CisgICAgICBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uX3JhbmdlKDIpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaCcsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbl9yYW5nZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaScsICduJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uX3JhbmdlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnZScsIHJhbmdlMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCByYW5nZTEsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgcmFuZ2UxLCAiZW5kIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIHJhbmdlMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCByYW5nZTIsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgcmFuZ2UyLCAiZW5kIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnbScsIHJhbmdlMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCByYW5nZTMsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgcmFuZ2UzLCAiZW5kIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTmVzdGVkTWVzc2FnZXMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgJGEkbWVzc2FnZSAkYiRCYXIkYyQge1xuIgorICAgICAgIiAgICAkZCRtZXNzYWdlICRlJEJheiRmJCB7fSRnJFxuIgorICAgICAgIiAgfSRoJFxuIgorICAgICAgIiAgJGkkbWVzc2FnZSAkaiRRdXgkayQge30kbCRcbiIKKyAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkubmVzdGVkX3R5cGUoMCk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgYmF6ID0gYmFyLm5lc3RlZF90eXBlKDApOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHF1eCA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2gnLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdnJywgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnbCcsIHF1eCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCBxdXgsICJuYW1lIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgR3JvdXBzKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIG1lc3NhZ2UgQmFyIHt9XG4iCisgICAgICAiICAkYSRvcHRpb25hbCRiJCAkYyRncm91cCRkJCAkZSRCYXokZiQgPSAkZyQxJGgkIHtcbiIKKyAgICAgICIgICAgJGkkbWVzc2FnZSBRdXgge30kaiRcbiIKKyAgICAgICIgIH0kayRcbiIKKyAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkubmVzdGVkX3R5cGUoMCk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLm5lc3RlZF90eXBlKDEpOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHF1eCA9IGJhei5uZXN0ZWRfdHlwZSgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaycsIGZpZWxkKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpZWxkLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2MnLCAnZCcsIGZpZWxkLCAidHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgZmllbGQsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWVsZCwgInR5cGVfbmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdoJywgZmllbGQsICJudW1iZXIiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdrJywgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnaicsIHF1eCkpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihxdXgsICJuYW1lIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIEVudW1zKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIiRhJGVudW0gJGIkRm9vJGMkIHt9JGQkXG4iCisgICAgICAiJGUkZW51bSAkZiRCYXIkZyQge30kaCRcbiIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2QnLCBmaWxlXy5lbnVtX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmlsZV8uZW51bV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdoJywgZmlsZV8uZW51bV90eXBlKDEpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGZpbGVfLmVudW1fdHlwZSgxKSwgIm5hbWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRW51bVZhbHVlcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICJlbnVtIEZvbyB7XG4iCisgICAgICAiICAkYSRCQVIkYiQgPSAkYyQxJGQkOyRlJFxuIgorICAgICAgIiAgJGYkQkFaJGckID0gJGgkMiRpJDskaiRcbiIKKyAgICAgICJ9IikpOworCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8uZW51bV90eXBlKDApLnZhbHVlKDApOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGJheiA9IGZpbGVfLmVudW1fdHlwZSgwKS52YWx1ZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2UnLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdiJywgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgYmFyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2onLCBiYXopKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgYmF6LCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaCcsICdpJywgYmF6LCAibnVtYmVyIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTmVzdGVkRW51bXMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgJGEkZW51bSAkYiRCYXIkYyQge30kZCRcbiIKKyAgICAgICIgICRlJGVudW0gJGYkQmF6JGckIHt9JGgkXG4iCisgICAgICAifVxuIikpOworCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5lbnVtX3R5cGUoMCk7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGJheiA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5lbnVtX3R5cGUoMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdkJywgYmFyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnaCcsIGJheikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBiYXosICJuYW1lIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgU2VydmljZXMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAiJGEkc2VydmljZSAkYiRGb28kYyQge30kZCRcbiIKKyAgICAgICIkZSRzZXJ2aWNlICRmJEJhciRnJCB7fSRoJFxuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZCcsIGZpbGVfLnNlcnZpY2UoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmlsZV8uc2VydmljZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnaCcsIGZpbGVfLnNlcnZpY2UoMSkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgZmlsZV8uc2VydmljZSgxKSwgIm5hbWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTWV0aG9kc0FuZFN0cmVhbXMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAic2VydmljZSBGb28ge1xuIgorICAgICAgIiAgJGEkcnBjICRiJEJhciRjJCgkZCRYJGUkKSByZXR1cm5zKCRmJFkkZyQpOyRoJCIKKyAgICAgICIgICRpJHJwYyAkaiRCYXokayQoJGwkWiRtJCkgcmV0dXJucygkbiRXJG8kKTskcCQiCisgICAgICAifSIpKTsKKworICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGJheiA9IGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaCcsIGJhcikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBiYXIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBiYXIsICJpbnB1dF90eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBiYXIsICJvdXRwdXRfdHlwZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdpJywgJ3AnLCBiYXopKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaicsICdrJywgYmF6LCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgYmF6LCAiaW5wdXRfdHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbicsICdvJywgYmF6LCAib3V0cHV0X3R5cGUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCksICJuYW1lIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIE9wdGlvbnMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAiJGEkb3B0aW9uICRiJGZvbyRjJC4kZCQoJGUkYmFyLmJheiRmJCkkZyQgPSAiCisgICAgICAgICAgIiRoJDEyMyRpJDskaiRcbiIKKyAgICAgICIkayRvcHRpb24gcXV4ID0gJGwkLTEyMyRtJDskbiRcbiIKKyAgICAgICIkbyRvcHRpb24gY29yZ2UgPSAkcCRhYmMkcSQ7JHIkXG4iCisgICAgICAiJHMkb3B0aW9uIGdyYXVsdCA9ICR0JCdibGFoJyR1JDskdiRcbiIKKyAgICAgICIkdyRvcHRpb24gZ2FycGx5ID0gJHgkeyB5YWRkYSB5YWRkYSB9JHkkOyR6JFxuIgorICAgICAgIiQwJG9wdGlvbiB3YWxkbyA9ICQxJDEyMy4wJDIkOyQzJFxuIgorICApKTsKKworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24xID0gZmlsZV8ub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24yID0gZmlsZV8ub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDEpOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24zID0gZmlsZV8ub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDIpOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb240ID0gZmlsZV8ub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDMpOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb241ID0gZmlsZV8ub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDQpOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb242ID0gZmlsZV8ub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDUpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaicsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2onLCBvcHRpb24xKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnZycsIG9wdGlvbjEsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBvcHRpb24xLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgb3B0aW9uMS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2cnLCBvcHRpb24xLm5hbWUoMSkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgb3B0aW9uMS5uYW1lKDEpLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdoJywgJ2knLCBvcHRpb24xLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2snLCAnbicsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBvcHRpb24yLCAibmVnYXRpdmVfaW50X3ZhbHVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ28nLCAncicsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdwJywgJ3EnLCBvcHRpb24zLCAiaWRlbnRpZmllcl92YWx1ZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdzJywgJ3YnLCBmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigndCcsICd1Jywgb3B0aW9uNCwgInN0cmluZ192YWx1ZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCd3JywgJ3onLCBmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigneCcsICd5Jywgb3B0aW9uNSwgImFnZ3JlZ2F0ZV92YWx1ZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCcwJywgJzMnLCBmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignMScsICcyJywgb3B0aW9uNiwgImRvdWJsZV92YWx1ZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjQpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb241KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjMsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjQsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjUsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjYsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjMubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjQubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjUubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjYubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24zLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNC5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjUubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb242Lm5hbWUoMCksICJuYW1lX3BhcnQiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgU2NvcGVkT3B0aW9ucykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgICRhJG9wdGlvbiBtb3B0ID0gMTskYiRcbiIKKyAgICAifVxuIgorICAgICJlbnVtIEJhciB7XG4iCisgICAgIiAgJGMkb3B0aW9uIGVvcHQgPSAxOyRkJFxuIgorICAgICJ9XG4iCisgICAgInNlcnZpY2UgQmF6IHtcbiIKKyAgICAiICAkZSRvcHRpb24gc29wdCA9IDE7JGYkXG4iCisgICAgIiAgcnBjIE0oWCkgcmV0dXJucyhZKSB7XG4iCisgICAgIiAgICAkZyRvcHRpb24gbW9wdCA9IDE7JGgkXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdiJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBmaWxlXy5lbnVtX3R5cGUoMCkub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKSkpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKSwgImlucHV0X3R5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCksICJvdXRwdXRfdHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIEZpZWxkT3B0aW9ucykgeworICAvLyBUaGUgYWN0dWFsICJuYW1lID0gdmFsdWUiIHBhaXJzIGFyZSBwYXJzZWQgYnkgdGhlIHNhbWUgY29kZSBhcyBmb3IKKyAgLy8gdG9wLWxldmVsIG9wdGlvbnMgc28gd2Ugd29uJ3QgcmUtdGVzdCB0aGF0IC0tIGp1c3QgbWFrZSBzdXJlIHRoYXQgdGhlCisgIC8vIHN5bnRheCB1c2VkIGZvciBmaWVsZCBvcHRpb25zIGlzIHVuZGVyc3Rvb2QuCisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIm1lc3NhZ2UgRm9vIHsiCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAxICIKKyAgICAgICAgICAiJGEkW2RlZmF1bHQ9JGIkMTIzJGMkLCRkJG9wdDE9MTIzJGUkLCIKKyAgICAgICAgICAiJGYkb3B0Mj0naGknJGckXSRoJDsiCisgICAgICAifVxuIgorICApKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjEgPSBmaWVsZC5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjIgPSBmaWVsZC5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdoJywgZmllbGQub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpZWxkLCAiZGVmYXVsdF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgb3B0aW9uMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBvcHRpb24yKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEsICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMiwgInN0cmluZ192YWx1ZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFbnVtVmFsdWVPcHRpb25zKSB7CisgIC8vIFRoZSBhY3R1YWwgIm5hbWUgPSB2YWx1ZSIgcGFpcnMgYXJlIHBhcnNlZCBieSB0aGUgc2FtZSBjb2RlIGFzIGZvcgorICAvLyB0b3AtbGV2ZWwgb3B0aW9ucyBzbyB3ZSB3b24ndCByZS10ZXN0IHRoYXQgLS0ganVzdCBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgLy8gc3ludGF4IHVzZWQgZm9yIGVudW0gb3B0aW9ucyBpcyB1bmRlcnN0b29kLgorICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICJlbnVtIEZvbyB7IgorICAgICAgIiAgQkFSID0gMSAkYSRbJGIkb3B0MT0xMjMkYyQsJGQkb3B0Mj0naGknJGUkXSRmJDsiCisgICAgICAifVxuIgorICApKTsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHZhbHVlID0gZmlsZV8uZW51bV90eXBlKDApLnZhbHVlKDApOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24xID0gdmFsdWUub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24yID0gdmFsdWUub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDEpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZicsIHZhbHVlLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBvcHRpb24xKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIG9wdGlvbjIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKHZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4odmFsdWUsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKHZhbHVlLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMSwgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAic3RyaW5nX3ZhbHVlIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIi8vIEZvbyBsZWFkaW5nXG4iCisgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAiJGEkbWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgLy8gRm9vIHRyYWlsaW5nXG4iCisgICAgICAiICAvLyBsaW5lIDJcbiIKKyAgICAgICJcbiIKKyAgICAgICIgIC8vIGlnbm9yZWRcbiIKKyAgICAgICJcbiIKKyAgICAgICIgIC8vIGJhciBsZWFkaW5nXG4iCisgICAgICAiICAkYiRvcHRpb25hbCBpbnQzMiBiYXIgPSAxOyRjJFxuIgorICAgICAgIiAgLy8gYmFyIHRyYWlsaW5nXG4iCisgICAgICAifSRkJFxuIgorICAgICAgIi8vIGlnbm9yZWRcbiIKKyAgKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBmb28gPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmb28uZmllbGQoMCk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdhJywgJ2QnLCBmb28sCisgICAgICAiIEZvbyBsZWFkaW5nXG4gbGluZSAyXG4iLAorICAgICAgIiBGb28gdHJhaWxpbmdcbiBsaW5lIDJcbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdiJywgJ2MnLCBiYXIsCisgICAgICAiIGJhciBsZWFkaW5nXG4iLAorICAgICAgIiBiYXIgdHJhaWxpbmdcbiIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28sICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJudW1iZXIiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRG9jQ29tbWVudHMyKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIi8vIGlnbm9yZWRcbiIKKyAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgIi8vIEZvbyBsZWFkaW5nXG4iCisgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAiJGEkbWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgLyogRm9vIHRyYWlsaW5nXG4iCisgICAgICAiICAgKiBsaW5lIDIgKi9cbiIKKyAgICAgICIgIC8vIGlnbm9yZWRcbiIKKyAgICAgICIgIC8qIGJhciBsZWFkaW5nXG4iCisgICAgICAiICAgKi8iCisgICAgICAiICAkYiRvcHRpb25hbCBpbnQzMiBiYXIgPSAxOyRjJCAgLy8gYmFyIHRyYWlsaW5nXG4iCisgICAgICAiICAvLyBpZ25vcmVkXG4iCisgICAgICAifSRkJFxuIgorICAgICAgIi8vIGlnbm9yZWRcbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBvcHRpb24gbGVhZGluZ1xuIgorICAgICAgIiRlJG9wdGlvbiBiYXogPSAxMjM7JGYkXG4iCisgICAgICAiLy8gb3B0aW9uIHRyYWlsaW5nXG4iCisgICkpOworCisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgZm9vID0gZmlsZV8ubWVzc2FnZV90eXBlKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgYmFyID0gZm9vLmZpZWxkKDApOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBiYXogPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdhJywgJ2QnLCBmb28sCisgICAgICAiIEZvbyBsZWFkaW5nXG4gbGluZSAyXG4iLAorICAgICAgIiBGb28gdHJhaWxpbmdcbiBsaW5lIDIgIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2InLCAnYycsIGJhciwKKyAgICAgICIgYmFyIGxlYWRpbmdcbiIsCisgICAgICAiIGJhciB0cmFpbGluZ1xuIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2UnLCAnZicsIGJheiwKKyAgICAgICIgb3B0aW9uIGxlYWRpbmdcbiIsCisgICAgICAiIG9wdGlvbiB0cmFpbGluZ1xuIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZvbywgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAidHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXosICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhei5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmF6Lm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmF6LCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzMykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICIkYSRtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICAvLyBiYXIgbGVhZGluZ1xuIgorICAgICAgIiAgJGIkb3B0aW9uYWwgaW50MzIgYmFyID0gMSBbKGJhei5xdXgpID0ge31dOyRjJFxuIgorICAgICAgIiAgLy8gYmFyIHRyYWlsaW5nXG4iCisgICAgICAifSRkJFxuIgorICAgICAgIi8vIGlnbm9yZWRcbiIKKyAgKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBmb28gPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmb28uZmllbGQoMCk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdiJywgJ2MnLCBiYXIsCisgICAgICAiIGJhciBsZWFkaW5nXG4iLAorICAgICAgIiBiYXIgdHJhaWxpbmdcbiIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28sICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJudW1iZXIiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhci5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigKKyAgICAgIGJhci5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigKKyAgICAgIGJhci5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJhZ2dyZWdhdGVfdmFsdWUiKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3Zjk0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MKQEAgLTAsMCArMSwxNjMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZm5kZWYgU1RESU5fRklMRU5PCisjZGVmaW5lIFNURElOX0ZJTEVOTyAwCisjZW5kaWYKKyNpZm5kZWYgU1RET1VUX0ZJTEVOTworI2RlZmluZSBTVERPVVRfRklMRU5PIDEKKyNlbmRpZgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCitjbGFzcyBHZW5lcmF0b3JSZXNwb25zZUNvbnRleHQgOiBwdWJsaWMgR2VuZXJhdG9yQ29udGV4dCB7CisgcHVibGljOgorICBHZW5lcmF0b3JSZXNwb25zZUNvbnRleHQoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMpCisgICAgICA6IHJlc3BvbnNlXyhyZXNwb25zZSksCisgICAgICAgIHBhcnNlZF9maWxlc18ocGFyc2VkX2ZpbGVzKSB7fQorICB2aXJ0dWFsIH5HZW5lcmF0b3JSZXNwb25zZUNvbnRleHQoKSB7fQorCisgIC8vIGltcGxlbWVudHMgR2VuZXJhdG9yQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHZpcnR1YWwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkZpbGUqIGZpbGUgPSByZXNwb25zZV8tPmFkZF9maWxlKCk7CisgICAgZmlsZS0+c2V0X25hbWUoZmlsZW5hbWUpOworICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbShmaWxlLT5tdXRhYmxlX2NvbnRlbnQoKSk7CisgIH0KKworICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckluc2VydCgKKyAgICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KSB7CisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpGaWxlKiBmaWxlID0gcmVzcG9uc2VfLT5hZGRfZmlsZSgpOworICAgIGZpbGUtPnNldF9uYW1lKGZpbGVuYW1lKTsKKyAgICBmaWxlLT5zZXRfaW5zZXJ0aW9uX3BvaW50KGluc2VydGlvbl9wb2ludCk7CisgICAgcmV0dXJuIG5ldyBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtKGZpbGUtPm11dGFibGVfY29udGVudCgpKTsKKyAgfQorCisgIHZvaWQgTGlzdFBhcnNlZEZpbGVzKHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBvdXRwdXQpIHsKKyAgICAqb3V0cHV0ID0gcGFyc2VkX2ZpbGVzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiByZXNwb25zZV87CisgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXNfOworfTsKKworaW50IFBsdWdpbk1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgY29uc3QgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yKSB7CisKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IFVua25vd24gb3B0aW9uOiAiIDw8IGFyZ3ZbMV0gPDwgZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisjaWZkZWYgX1dJTjMyCisgIF9zZXRtb2RlKFNURElOX0ZJTEVOTywgX09fQklOQVJZKTsKKyAgX3NldG1vZGUoU1RET1VUX0ZJTEVOTywgX09fQklOQVJZKTsKKyNlbmRpZgorCisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlcXVlc3Q7CisgIGlmICghcmVxdWVzdC5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihTVERJTl9GSUxFTk8pKSB7CisgICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IHByb3RvYyBzZW50IHVucGFyc2VhYmxlIHJlcXVlc3QgdG8gcGx1Z2luLiIgPDwgZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdC5wcm90b19maWxlX3NpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShyZXF1ZXN0LnByb3RvX2ZpbGUoaSkpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgIC8vIEJ1aWxkRmlsZSgpIGFscmVhZHkgd3JvdGUgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKKyAgICBwYXJzZWRfZmlsZXMucHVzaF9iYWNrKHBvb2wuRmluZEZpbGVCeU5hbWUocmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKGkpKSk7CisgICAgaWYgKHBhcnNlZF9maWxlcy5iYWNrKCkgPT0gTlVMTCkgeworICAgICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IHByb3RvYyBhc2tlZCBwbHVnaW4gdG8gZ2VuZXJhdGUgYSBmaWxlIGJ1dCAiCisgICAgICAgICAgICAgICJkaWQgbm90IHByb3ZpZGUgYSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZTogIgorICAgICAgICAgICA8PCByZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUoaSkgPDwgZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSByZXNwb25zZTsKKyAgR2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0IGNvbnRleHQoJnJlc3BvbnNlLCBwYXJzZWRfZmlsZXMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwYXJzZWRfZmlsZXNbaV07CisKKyAgICBzdHJpbmcgZXJyb3I7CisgICAgYm9vbCBzdWNjZWVkZWQgPSBnZW5lcmF0b3ItPkdlbmVyYXRlKAorICAgICAgICBmaWxlLCByZXF1ZXN0LnBhcmFtZXRlcigpLCAmY29udGV4dCwgJmVycm9yKTsKKworICAgIGlmICghc3VjY2VlZGVkICYmIGVycm9yLmVtcHR5KCkpIHsKKyAgICAgIGVycm9yID0gIkNvZGUgZ2VuZXJhdG9yIHJldHVybmVkIGZhbHNlIGJ1dCBwcm92aWRlZCBubyBlcnJvciAiCisgICAgICAgICAgICAgICJkZXNjcmlwdGlvbi4iOworICAgIH0KKyAgICBpZiAoIWVycm9yLmVtcHR5KCkpIHsKKyAgICAgIHJlc3BvbnNlLnNldF9lcnJvcihmaWxlLT5uYW1lKCkgKyAiOiAiICsgZXJyb3IpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFyZXNwb25zZS5TZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKFNURE9VVF9GSUxFTk8pKSB7CisgICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IEVycm9yIHdyaXRpbmcgdG8gc3Rkb3V0LiIgPDwgZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTJkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIEZyb250LWVuZCBmb3IgcHJvdG9jIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMgd3JpdHRlbiBpbiBDKysuCisvLworLy8gVG8gaW1wbGVtZW50IGEgcHJvdG9jIHBsdWdpbiBpbiBDKyssIHNpbXBseSB3cml0ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorLy8gQ29kZUdlbmVyYXRvciwgdGhlbiBjcmVhdGUgYSBtYWluKCkgZnVuY3Rpb24gbGlrZToKKy8vICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworLy8gICAgIE15Q29kZUdlbmVyYXRvciBnZW5lcmF0b3I7CisvLyAgICAgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpQbHVnaW5NYWluKGFyZ2MsIGFyZ3YsICZnZW5lcmF0b3IpOworLy8gICB9CisvLyBZb3UgbXVzdCBsaW5rIHlvdXIgcGx1Z2luIGFnYWluc3QgbGlicHJvdG9idWYgYW5kIGxpYnByb3RvYy4KKy8vCisvLyBUbyBnZXQgcHJvdG9jIHRvIHVzZSB0aGUgcGx1Z2luLCBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKy8vICogUGxhY2UgdGhlIHBsdWdpbiBiaW5hcnkgc29tZXdoZXJlIGluIHRoZSBQQVRIIGFuZCBnaXZlIGl0IHRoZSBuYW1lCisvLyAgICJwcm90b2MtZ2VuLU5BTUUiIChyZXBsYWNpbmcgIk5BTUUiIHdpdGggdGhlIG5hbWUgb2YgeW91ciBwbHVnaW4pLiAgSWYgeW91CisvLyAgIHRoZW4gaW52b2tlIHByb3RvYyB3aXRoIHRoZSBwYXJhbWV0ZXIgLS1OQU1FX291dD1PVVRfRElSIChhZ2FpbiwgcmVwbGFjZQorLy8gICAiTkFNRSIgd2l0aCB5b3VyIHBsdWdpbidzIG5hbWUpLCBwcm90b2Mgd2lsbCBpbnZva2UgeW91ciBwbHVnaW4gdG8gZ2VuZXJhdGUKKy8vICAgdGhlIG91dHB1dCwgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW4gT1VUX0RJUi4KKy8vICogUGxhY2UgdGhlIHBsdWdpbiBiaW5hcnkgYW55d2hlcmUsIHdpdGggYW55IG5hbWUsIGFuZCBwYXNzIHRoZSAtLXBsdWdpbgorLy8gICBwYXJhbWV0ZXIgdG8gcHJvdG9jIHRvIGRpcmVjdCBpdCB0byB5b3VyIHBsdWdpbiBsaWtlIHNvOgorLy8gICAgIHByb3RvYyAtLXBsdWdpbj1wcm90b2MtZ2VuLU5BTUU9cGF0aC90by9teWJpbmFyeSAtLU5BTUVfb3V0PU9VVF9ESVIKKy8vICAgT24gV2luZG93cywgbWFrZSBzdXJlIHRvIGluY2x1ZGUgdGhlIC5leGUgc3VmZml4OgorLy8gICAgIHByb3RvYyAtLXBsdWdpbj1wcm90b2MtZ2VuLU5BTUU9cGF0aC90by9teWJpbmFyeS5leGUgLS1OQU1FX291dD1PVVRfRElSCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BMVUdJTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BMVUdJTl9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK2NsYXNzIENvZGVHZW5lcmF0b3I7ICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKKworLy8gSW1wbGVtZW50cyBtYWluKCkgZm9yIGEgcHJvdG9jIHBsdWdpbiBleHBvc2luZyB0aGUgZ2l2ZW4gY29kZSBnZW5lcmF0b3IuCitMSUJQUk9UT0NfRVhQT1JUIGludCBQbHVnaW5NYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10sIGNvbnN0IENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcik7CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BMVUdJTl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMTRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCkBAIC0wLDAgKzEsMTA5MCBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bworCisjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCisjaW5jbHVkZSAiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDb2RlR2VuZXJhdG9yUmVxdWVzdF9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3RfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9yZWZsZWN0aW9uXyA9IE5VTEw7CisKK30gIC8vIG5hbWVzcGFjZQorCisKK3ZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKSB7CisgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3IqIGZpbGUgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkZpbmRGaWxlQnlOYW1lKAorICAgICAgImdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8iKTsKKyAgR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCk7CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0X2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOworICBzdGF0aWMgY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0X29mZnNldHNfWzNdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlcXVlc3QsIGZpbGVfdG9fZ2VuZXJhdGVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBwYXJhbWV0ZXJfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBwcm90b19maWxlXyksCisgIH07CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0X3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9kZXNjcmlwdG9yXywKKyAgICAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0X29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVxdWVzdCwgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoQ29kZUdlbmVyYXRvclJlcXVlc3QpKTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEpOworICBzdGF0aWMgY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9vZmZzZXRzX1syXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgZXJyb3JfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgZmlsZV8pLAorICB9OworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXywKKyAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2Vfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKENvZGVHZW5lcmF0b3JSZXNwb25zZSkpOworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXyA9IENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMCk7CisgIHN0YXRpYyBjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfb2Zmc2V0c19bM10gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSwgbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIGluc2VydGlvbl9wb2ludF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIGNvbnRlbnRfKSwKKyAgfTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX2Rlc2NyaXB0b3JfLAorICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSkpOworfQorCituYW1lc3BhY2UgeworCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfKTsKK2lubGluZSB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8sCisgICAgICAgICAgICAgICAgICZwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90byk7Cit9CisKK3ZvaWQgcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyhjb25zdCA6OnN0ZDo6c3RyaW5nJikgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl8sICZDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX2Rlc2NyaXB0b3JfLCAmQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXywgJkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCkgeworICBkZWxldGUgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgQ29kZUdlbmVyYXRvclJlcXVlc3RfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlX3JlZmxlY3Rpb25fOworICBkZWxldGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfcmVmbGVjdGlvbl87Cit9CisKK3ZvaWQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKSB7CisgIHN0YXRpYyBib29sIGFscmVhZHlfaGVyZSA9IGZhbHNlOworICBpZiAoYWxyZWFkeV9oZXJlKSByZXR1cm47CisgIGFscmVhZHlfaGVyZSA9IHRydWU7CisgIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OnByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxBZGRHZW5lcmF0ZWRGaWxlKAorICAgICJcbiVnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvXDAyMiIKKyAgICAiXDAzMGdvb2dsZS5wcm90b2J1Zi5jb21waWxlclwwMzIgZ29vZ2xlL3Byb3RvYiIKKyAgICAidWYvZGVzY3JpcHRvci5wcm90b1wifVxuXDAyNENvZGVHZW5lcmF0b3JSZXF1IgorICAgICJlc3RcMDIyXDAzMFxuXDAyMGZpbGVfdG9fZ2VuZXJhdGVcMDMwXDAwMSBcMDAzKFx0XDAyMlwwMjFcblx0cGFyYW1ldCIKKyAgICAiZXJcMDMwXDAwMiBcMDAxKFx0XDAyMjhcblxucHJvdG9fZmlsZVwwMzBcMDE3IFwwMDMoXDAxMzIkLmdvb2dsZS5wciIKKyAgICAib3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9cIlwyNTJcMDAxXG5cMDI1Q29kZUdlbmVyIgorICAgICJhdG9yUmVzcG9uc2VcMDIyXHJcblwwMDVlcnJvclwwMzBcMDAxIFwwMDEoXHRcMDIyQlxuXDAwNGZpbGVcMDMwXDAxNyBcMDAzKCIKKyAgICAiXDAxMzI0Lmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdCIKKyAgICAib3JSZXNwb25zZS5GaWxlXDAzMj5cblwwMDRGaWxlXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDI3XG4iCisgICAgIlwwMTdpbnNlcnRpb25fcG9pbnRcMDMwXDAwMiBcMDAxKFx0XDAyMlwwMTdcblwwMDdjb250ZW50XDAzMFwwMTcgXDAwMShcdEIiCisgICAgIixcblwwMzRjb20uZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyQlwwMTRQbHVnaW5QIgorICAgICJyb3RvcyIsIDQ0NSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAorICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIiwgJnByb3RvYnVmX1JlZ2lzdGVyVHlwZXMpOworICBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgQ29kZUdlbmVyYXRvclJlcXVlc3QoKTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCk7CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpPblNodXRkb3duKCZwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKTsKK30KKworLy8gRm9yY2UgQWRkRGVzY3JpcHRvcnMoKSB0byBiZSBjYWxsZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUuCitzdHJ1Y3QgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90byB7CisgIFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKSB7CisgICAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKKyAgfQorfSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6a0ZpbGVUb0dlbmVyYXRlRmllbGROdW1iZXI7Citjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmtQYXJhbWV0ZXJGaWVsZE51bWJlcjsKK2NvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6a1Byb3RvRmlsZUZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0KCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q29kZUdlbmVyYXRvclJlcXVlc3QoY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIHBhcmFtZXRlcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0Ojp+Q29kZUdlbmVyYXRvclJlcXVlc3QoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHBhcmFtZXRlcl8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBwYXJhbWV0ZXJfOworICB9CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXF1ZXN0X2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitDb2RlR2VuZXJhdG9yUmVxdWVzdCogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworQ29kZUdlbmVyYXRvclJlcXVlc3QqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgQ29kZUdlbmVyYXRvclJlcXVlc3Q7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKKyAgICAgIGlmIChwYXJhbWV0ZXJfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgcGFyYW1ldGVyXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZmlsZV90b19nZW5lcmF0ZV8uQ2xlYXIoKTsKKyAgcHJvdG9fZmlsZV8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZmlsZV90b19nZW5lcmF0ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPmFkZF9maWxlX3RvX2dlbmVyYXRlKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZSh0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKSAtIDEpLmRhdGEoKSwKKyAgICAgICAgICAgIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUodGhpcy0+ZmlsZV90b19nZW5lcmF0ZV9zaXplKCkgLSAxKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEwKSkgZ290byBwYXJzZV9maWxlX3RvX2dlbmVyYXRlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfcGFyYW1ldGVyOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfcGFyYW1ldGVyOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXJhbWV0ZXIoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5wYXJhbWV0ZXIoKS5kYXRhKCksIHRoaXMtPnBhcmFtZXRlcigpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTIyKSkgZ290byBwYXJzZV9wcm90b19maWxlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKKyAgICAgIGNhc2UgMTU6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfcHJvdG9fZmlsZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfcHJvdG9fZmlsZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX3Byb3RvX2ZpbGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLmRhdGEoKSwgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKS5sZW5ndGgoKSwKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDEsIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKKyAgaWYgKGhhc19wYXJhbWV0ZXIoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5wYXJhbWV0ZXIoKS5kYXRhKCksIHRoaXMtPnBhcmFtZXRlcigpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAyLCB0aGlzLT5wYXJhbWV0ZXIoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAxNSwgdGhpcy0+cHJvdG9fZmlsZShpKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKS5kYXRhKCksIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlU3RyaW5nVG9BcnJheSgxLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisgIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+cGFyYW1ldGVyKCkuZGF0YSgpLCB0aGlzLT5wYXJhbWV0ZXIoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDIsIHRoaXMtPnBhcmFtZXRlcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wcm90b19maWxlX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgMTUsIHRoaXMtPnByb3RvX2ZpbGUoaSksIHRhcmdldCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKworICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworICAgIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPnBhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgfQorICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fZmlsZSA9IDE1OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5wcm90b19maWxlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wcm90b19maWxlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5wcm90b19maWxlKGkpKTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBmaWxlX3RvX2dlbmVyYXRlXy5NZXJnZUZyb20oZnJvbS5maWxlX3RvX2dlbmVyYXRlXyk7CisgIHByb3RvX2ZpbGVfLk1lcmdlRnJvbShmcm9tLnByb3RvX2ZpbGVfKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19wYXJhbWV0ZXIoKSkgeworICAgICAgc2V0X3BhcmFtZXRlcihmcm9tLnBhcmFtZXRlcigpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG9fZmlsZV9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+cHJvdG9fZmlsZShpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U3dhcChDb2RlR2VuZXJhdG9yUmVxdWVzdCogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBmaWxlX3RvX2dlbmVyYXRlXy5Td2FwKCZvdGhlci0+ZmlsZV90b19nZW5lcmF0ZV8pOworICAgIHN0ZDo6c3dhcChwYXJhbWV0ZXJfLCBvdGhlci0+cGFyYW1ldGVyXyk7CisgICAgcHJvdG9fZmlsZV8uU3dhcCgmb3RoZXItPnByb3RvX2ZpbGVfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDb2RlR2VuZXJhdG9yUmVxdWVzdF9yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjprTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjprSW5zZXJ0aW9uUG9pbnRGaWVsZE51bWJlcjsKK2NvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6a0NvbnRlbnRGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgaW5zZXJ0aW9uX3BvaW50XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgY29udGVudF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjp+Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKGluc2VydGlvbl9wb2ludF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBpbnNlcnRpb25fcG9pbnRfOworICB9CisgIGlmIChjb250ZW50XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGNvbnRlbnRfOworICB9CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19pbnNlcnRpb25fcG9pbnQoKSkgeworICAgICAgaWYgKGluc2VydGlvbl9wb2ludF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBpbnNlcnRpb25fcG9pbnRfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX2NvbnRlbnQoKSkgeworICAgICAgaWYgKGNvbnRlbnRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgY29udGVudF8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICB9CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9pbnNlcnRpb25fcG9pbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9pbnNlcnRpb25fcG9pbnQ6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2luc2VydGlvbl9wb2ludCgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmRhdGEoKSwgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX2NvbnRlbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICAgICAgY2FzZSAxNTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9jb250ZW50OgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9jb250ZW50KCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+Y29udGVudCgpLmRhdGEoKSwgdGhpcy0+Y29udGVudCgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CisgIGlmIChoYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkuZGF0YSgpLCB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMiwgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICBpZiAoaGFzX2NvbnRlbnQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5jb250ZW50KCkuZGF0YSgpLCB0aGlzLT5jb250ZW50KCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDE1LCB0aGlzLT5jb250ZW50KCksIG91dHB1dCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CisgIGlmIChoYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkuZGF0YSgpLCB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDIsIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnQgPSAxNTsKKyAgaWYgKGhhc19jb250ZW50KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+Y29udGVudCgpLmRhdGEoKSwgdGhpcy0+Y29udGVudCgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMTUsIHRoaXMtPmNvbnRlbnQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOworICAgIGlmIChoYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmluc2VydGlvbl9wb2ludCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICAgIGlmIChoYXNfY29udGVudCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5jb250ZW50KCkpOworICAgIH0KKworICB9CisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ok1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX25hbWUoKSkgeworICAgICAgc2V0X25hbWUoZnJvbS5uYW1lKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKKyAgICAgIHNldF9pbnNlcnRpb25fcG9pbnQoZnJvbS5pbnNlcnRpb25fcG9pbnQoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19jb250ZW50KCkpIHsKKyAgICAgIHNldF9jb250ZW50KGZyb20uY29udGVudCgpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKKyAgICBzdGQ6OnN3YXAoaW5zZXJ0aW9uX3BvaW50Xywgb3RoZXItPmluc2VydGlvbl9wb2ludF8pOworICAgIHN0ZDo6c3dhcChjb250ZW50Xywgb3RoZXItPmNvbnRlbnRfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6a0Vycm9yRmllbGROdW1iZXI7Citjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjprRmlsZUZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvZGVHZW5lcmF0b3JSZXNwb25zZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBlcnJvcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0NvZGVHZW5lcmF0b3JSZXNwb25zZTo6fkNvZGVHZW5lcmF0b3JSZXNwb25zZSgpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGVycm9yXzsKKyAgfQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXzsKK30KKworY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChoYXNfZXJyb3IoKSkgeworICAgICAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGVycm9yXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZmlsZV8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2Vycm9yKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+ZXJyb3IoKS5kYXRhKCksIHRoaXMtPmVycm9yKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX2ZpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKKyAgICAgIGNhc2UgMTU6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZmlsZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZmlsZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX2ZpbGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7CisgIGlmIChoYXNfZXJyb3IoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5lcnJvcigpLmRhdGEoKSwgdGhpcy0+ZXJyb3IoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+ZXJyb3IoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMTUsIHRoaXMtPmZpbGUoaSksIG91dHB1dCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworICBpZiAoaGFzX2Vycm9yKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZXJyb3IoKS5kYXRhKCksIHRoaXMtPmVycm9yKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxLCB0aGlzLT5lcnJvcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDE1LCB0aGlzLT5maWxlKGkpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKKyAgICBpZiAoaGFzX2Vycm9yKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmVycm9yKCkpOworICAgIH0KKworICB9CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWxlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5maWxlKGkpKTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGZpbGVfLk1lcmdlRnJvbShmcm9tLmZpbGVfKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19lcnJvcigpKSB7CisgICAgICBzZXRfZXJyb3IoZnJvbS5lcnJvcigpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb3B5RnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChlcnJvcl8sIG90aGVyLT5lcnJvcl8pOworICAgIGZpbGVfLlN3YXAoJm90aGVyLT5maWxlXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Y2MyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmgKQEAgLTAsMCArMSw4NTYgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KKworI2lmbmRlZiBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fX0lOQ0xVREVECisjZGVmaW5lIFBST1RPQlVGX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b19fSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgMjAwNTAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDIwMDUwMDAgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCit2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKK3ZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKK3ZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworCitjbGFzcyBDb2RlR2VuZXJhdG9yUmVxdWVzdDsKK2NsYXNzIENvZGVHZW5lcmF0b3JSZXNwb25zZTsKK2NsYXNzIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvclJlcXVlc3QgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0KCk7CisgIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3JSZXF1ZXN0KCk7CisKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3QoY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pOworCisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChDb2RlR2VuZXJhdG9yUmVxdWVzdCogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3QqIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKKyAgaW5saW5lIGludCBmaWxlX3RvX2dlbmVyYXRlX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZmlsZV90b19nZW5lcmF0ZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtGaWxlVG9HZW5lcmF0ZUZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpOworICBpbmxpbmUgdm9pZCBzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIGFkZF9maWxlX3RvX2dlbmVyYXRlKCk7CisgIGlubGluZSB2b2lkIGFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBhZGRfZmlsZV90b19nZW5lcmF0ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgZmlsZV90b19nZW5lcmF0ZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9maWxlX3RvX2dlbmVyYXRlKCk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisgIGlubGluZSBib29sIGhhc19wYXJhbWV0ZXIoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfcGFyYW1ldGVyKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1BhcmFtZXRlckZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHBhcmFtZXRlcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfcGFyYW1ldGVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X3BhcmFtZXRlcihjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfcGFyYW1ldGVyKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3BhcmFtZXRlcigpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX3BhcmFtZXRlcig6OnN0ZDo6c3RyaW5nKiBwYXJhbWV0ZXIpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisgIGlubGluZSBpbnQgcHJvdG9fZmlsZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3Byb3RvX2ZpbGUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUHJvdG9GaWxlRmllbGROdW1iZXIgPSAxNTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG9fZmlsZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX3Byb3RvX2ZpbGUoaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogYWRkX3Byb3RvX2ZpbGUoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4mCisgICAgICBwcm90b19maWxlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9wcm90b19maWxlKCk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX3BhcmFtZXRlcigpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IGZpbGVfdG9fZ2VuZXJhdGVfOworICA6OnN0ZDo6c3RyaW5nKiBwYXJhbWV0ZXJfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+IHByb3RvX2ZpbGVfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9DX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCk7CisgIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCk7CisKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pOworCisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgb3BlcmF0b3I9KGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgaW5saW5lIGJvb2wgaGFzX2luc2VydGlvbl9wb2ludCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9pbnNlcnRpb25fcG9pbnQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrSW5zZXJ0aW9uUG9pbnRGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2luc2VydGlvbl9wb2ludChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2luc2VydGlvbl9wb2ludCgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9pbnNlcnRpb25fcG9pbnQoOjpzdGQ6OnN0cmluZyogaW5zZXJ0aW9uX3BvaW50KTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICBpbmxpbmUgYm9vbCBoYXNfY29udGVudCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9jb250ZW50KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0NvbnRlbnRGaWVsZE51bWJlciA9IDE1OworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgY29udGVudCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfY29udGVudChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2NvbnRlbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfY29udGVudCgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9jb250ZW50KCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfY29udGVudCg6OnN0ZDo6c3RyaW5nKiBjb250ZW50KTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfY29udGVudCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfY29udGVudCgpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisgIDo6c3RkOjpzdHJpbmcqIGluc2VydGlvbl9wb2ludF87CisgIDo6c3RkOjpzdHJpbmcqIGNvbnRlbnRfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9DX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvclJlc3BvbnNlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKTsKKyAgdmlydHVhbCB+Q29kZUdlbmVyYXRvclJlc3BvbnNlKCk7CisKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSk7CisKKyAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZSYgb3BlcmF0b3I9KGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZSogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0eXBlZGVmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlIEZpbGU7CisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfZXJyb3IoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZXJyb3IoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRXJyb3JGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBlcnJvcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXJyb3IoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXJyb3IoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9lcnJvcig6OnN0ZDo6c3RyaW5nKiBlcnJvcik7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CisgIGlubGluZSBpbnQgZmlsZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2ZpbGUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRmlsZUZpZWxkTnVtYmVyID0gMTU7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZmlsZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIG11dGFibGVfZmlsZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIGFkZF9maWxlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4mCisgICAgICBmaWxlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4qCisgICAgICBtdXRhYmxlX2ZpbGUoKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2Vycm9yKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19lcnJvcigpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpzdGQ6OnN0cmluZyogZXJyb3JfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4gZmlsZV87CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMiArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0NfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBDb2RlR2VuZXJhdG9yUmVxdWVzdAorCisvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CitpbmxpbmUgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpmaWxlX3RvX2dlbmVyYXRlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfZmlsZV90b19nZW5lcmF0ZSgpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKCkgeworICByZXR1cm4gZmlsZV90b19nZW5lcmF0ZV8uQWRkKCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmZpbGVfdG9fZ2VuZXJhdGUoKSBjb25zdCB7CisgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZSgpIHsKKyAgcmV0dXJuICZmaWxlX3RvX2dlbmVyYXRlXzsKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6aGFzX3BhcmFtZXRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2hhc19wYXJhbWV0ZXIoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfaGFzX3BhcmFtZXRlcigpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfcGFyYW1ldGVyKCkgeworICBpZiAocGFyYW1ldGVyXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcGFyYW1ldGVyXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnBhcmFtZXRlcigpIGNvbnN0IHsKKyAgcmV0dXJuICpwYXJhbWV0ZXJfOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKKyAgaWYgKHBhcmFtZXRlcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhcmFtZXRlcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBwYXJhbWV0ZXJfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKKyAgaWYgKHBhcmFtZXRlcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhcmFtZXRlcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBwYXJhbWV0ZXJfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfcGFyYW1ldGVyKCk7CisgIGlmIChwYXJhbWV0ZXJfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBwYXJhbWV0ZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcGFyYW1ldGVyXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcGFyYW1ldGVyKCkgeworICBzZXRfaGFzX3BhcmFtZXRlcigpOworICBpZiAocGFyYW1ldGVyXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcGFyYW1ldGVyXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBwYXJhbWV0ZXJfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpyZWxlYXNlX3BhcmFtZXRlcigpIHsKKyAgY2xlYXJfaGFzX3BhcmFtZXRlcigpOworICBpZiAocGFyYW1ldGVyXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IHBhcmFtZXRlcl87CisgICAgcGFyYW1ldGVyXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9hbGxvY2F0ZWRfcGFyYW1ldGVyKDo6c3RkOjpzdHJpbmcqIHBhcmFtZXRlcikgeworICBpZiAocGFyYW1ldGVyXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIHBhcmFtZXRlcl87CisgIH0KKyAgaWYgKHBhcmFtZXRlcikgeworICAgIHNldF9oYXNfcGFyYW1ldGVyKCk7CisgICAgcGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7CisgICAgcGFyYW1ldGVyXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fZmlsZSA9IDE1OworaW5saW5lIGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6cHJvdG9fZmlsZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gcHJvdG9fZmlsZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX3Byb3RvX2ZpbGUoKSB7CisgIHByb3RvX2ZpbGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvJiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6cHJvdG9fZmlsZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHByb3RvX2ZpbGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wcm90b19maWxlKGludCBpbmRleCkgeworICByZXR1cm4gcHJvdG9fZmlsZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX3Byb3RvX2ZpbGUoKSB7CisgIHJldHVybiBwcm90b19maWxlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGUoKSBjb25zdCB7CisgIHJldHVybiBwcm90b19maWxlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcHJvdG9fZmlsZSgpIHsKKyAgcmV0dXJuICZwcm90b19maWxlXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZQorCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfbmFtZSgpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfbmFtZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpuYW1lKCkgY29uc3QgeworICByZXR1cm4gKm5hbWVfOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gbmFtZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfbmFtZSgpIHsKKyAgY2xlYXJfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gbmFtZV87CisgICAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAobmFtZSkgeworICAgIHNldF9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOworaW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Omhhc19pbnNlcnRpb25fcG9pbnQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2luc2VydGlvbl9wb2ludCgpIHsKKyAgaWYgKGluc2VydGlvbl9wb2ludF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGluc2VydGlvbl9wb2ludF8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjppbnNlcnRpb25fcG9pbnQoKSBjb25zdCB7CisgIHJldHVybiAqaW5zZXJ0aW9uX3BvaW50XzsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIGlmIChpbnNlcnRpb25fcG9pbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnNlcnRpb25fcG9pbnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaW5zZXJ0aW9uX3BvaW50Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIGlmIChpbnNlcnRpb25fcG9pbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnNlcnRpb25fcG9pbnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaW5zZXJ0aW9uX3BvaW50Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOworICBpZiAoaW5zZXJ0aW9uX3BvaW50XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgaW5zZXJ0aW9uX3BvaW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGluc2VydGlvbl9wb2ludF8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX2luc2VydGlvbl9wb2ludCgpIHsKKyAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKKyAgaWYgKGluc2VydGlvbl9wb2ludF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGluc2VydGlvbl9wb2ludF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gaW5zZXJ0aW9uX3BvaW50XzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6cmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKSB7CisgIGNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKTsKKyAgaWYgKGluc2VydGlvbl9wb2ludF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBpbnNlcnRpb25fcG9pbnRfOworICAgIGluc2VydGlvbl9wb2ludF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX2luc2VydGlvbl9wb2ludCg6OnN0ZDo6c3RyaW5nKiBpbnNlcnRpb25fcG9pbnQpIHsKKyAgaWYgKGluc2VydGlvbl9wb2ludF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBpbnNlcnRpb25fcG9pbnRfOworICB9CisgIGlmIChpbnNlcnRpb25fcG9pbnQpIHsKKyAgICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOworICAgIGluc2VydGlvbl9wb2ludF8gPSBpbnNlcnRpb25fcG9pbnQ7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOworICAgIGluc2VydGlvbl9wb2ludF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnQgPSAxNTsKK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpoYXNfY29udGVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2hhc19jb250ZW50KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2hhc19jb250ZW50KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9jb250ZW50KCkgeworICBpZiAoY29udGVudF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGNvbnRlbnRfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19jb250ZW50KCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNvbnRlbnQoKSBjb25zdCB7CisgIHJldHVybiAqY29udGVudF87Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2NvbnRlbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19jb250ZW50KCk7CisgIGlmIChjb250ZW50XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgY29udGVudF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBjb250ZW50Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfY29udGVudChjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgaWYgKGNvbnRlbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBjb250ZW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGNvbnRlbnRfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgaWYgKGNvbnRlbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBjb250ZW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGNvbnRlbnRfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9jb250ZW50KCkgeworICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgaWYgKGNvbnRlbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBjb250ZW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBjb250ZW50XzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6cmVsZWFzZV9jb250ZW50KCkgeworICBjbGVhcl9oYXNfY29udGVudCgpOworICBpZiAoY29udGVudF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBjb250ZW50XzsKKyAgICBjb250ZW50XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9hbGxvY2F0ZWRfY29udGVudCg6OnN0ZDo6c3RyaW5nKiBjb250ZW50KSB7CisgIGlmIChjb250ZW50XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGNvbnRlbnRfOworICB9CisgIGlmIChjb250ZW50KSB7CisgICAgc2V0X2hhc19jb250ZW50KCk7CisgICAgY29udGVudF8gPSBjb250ZW50OworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19jb250ZW50KCk7CisgICAgY29udGVudF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UKKworLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6aGFzX2Vycm9yKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2hhc19lcnJvcigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfaGFzX2Vycm9yKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfZXJyb3IoKSB7CisgIGlmIChlcnJvcl8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGVycm9yXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfZXJyb3IoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmVycm9yKCkgY29uc3QgeworICByZXR1cm4gKmVycm9yXzsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2Vycm9yKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfZXJyb3IoKTsKKyAgaWYgKGVycm9yXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXJyb3JfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZXJyb3JfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19lcnJvcigpOworICBpZiAoZXJyb3JfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBlcnJvcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBlcnJvcl8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnNldF9lcnJvcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19lcnJvcigpOworICBpZiAoZXJyb3JfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBlcnJvcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBlcnJvcl8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9lcnJvcigpIHsKKyAgc2V0X2hhc19lcnJvcigpOworICBpZiAoZXJyb3JfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBlcnJvcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gZXJyb3JfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6cmVsZWFzZV9lcnJvcigpIHsKKyAgY2xlYXJfaGFzX2Vycm9yKCk7CisgIGlmIChlcnJvcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBlcnJvcl87CisgICAgZXJyb3JfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnNldF9hbGxvY2F0ZWRfZXJyb3IoOjpzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGVycm9yXzsKKyAgfQorICBpZiAoZXJyb3IpIHsKKyAgICBzZXRfaGFzX2Vycm9yKCk7CisgICAgZXJyb3JfID0gZXJyb3I7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2Vycm9yKCk7CisgICAgZXJyb3JfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OworaW5saW5lIGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfZmlsZSgpIHsKKyAgZmlsZV8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gZmlsZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2ZpbGUoaW50IGluZGV4KSB7CisgIHJldHVybiBmaWxlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjphZGRfZmlsZSgpIHsKKyAgcmV0dXJuIGZpbGVfLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiYKK0NvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZmlsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPioKK0NvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9maWxlKCkgeworICByZXR1cm4gJmZpbGVfOworfQorCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpZm5kZWYgU1dJRworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorI2VuZGlmICAvLyBTV0lHCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvX19JTkNMVURFRApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiODg4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KQEAgLTAsMCArMSwxNDcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBXQVJOSU5HOiAgVGhlIHBsdWdpbiBpbnRlcmZhY2UgaXMgY3VycmVudGx5IEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0bworLy8gICBjaGFuZ2UuCisvLworLy8gcHJvdG9jIChha2EgdGhlIFByb3RvY29sIENvbXBpbGVyKSBjYW4gYmUgZXh0ZW5kZWQgdmlhIHBsdWdpbnMuICBBIHBsdWdpbiBpcworLy8ganVzdCBhIHByb2dyYW0gdGhhdCByZWFkcyBhIENvZGVHZW5lcmF0b3JSZXF1ZXN0IGZyb20gc3RkaW4gYW5kIHdyaXRlcyBhCisvLyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgdG8gc3Rkb3V0LgorLy8KKy8vIFBsdWdpbnMgd3JpdHRlbiB1c2luZyBDKysgY2FuIHVzZSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmggaW5zdGVhZAorLy8gb2YgZGVhbGluZyB3aXRoIHRoZSByYXcgcHJvdG9jb2wgZGVmaW5lZCBoZXJlLgorLy8KKy8vIEEgcGx1Z2luIGV4ZWN1dGFibGUgbmVlZHMgb25seSB0byBiZSBwbGFjZWQgc29tZXdoZXJlIGluIHRoZSBwYXRoLiAgVGhlCisvLyBwbHVnaW4gc2hvdWxkIGJlIG5hbWVkICJwcm90b2MtZ2VuLSROQU1FIiwgYW5kIHdpbGwgdGhlbiBiZSB1c2VkIHdoZW4gdGhlCisvLyBmbGFnICItLSR7TkFNRX1fb3V0IiBpcyBwYXNzZWQgdG8gcHJvdG9jLgorCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5jb21waWxlcjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlciI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiUGx1Z2luUHJvdG9zIjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisKKy8vIEFuIGVuY29kZWQgQ29kZUdlbmVyYXRvclJlcXVlc3QgaXMgd3JpdHRlbiB0byB0aGUgcGx1Z2luJ3Mgc3RkaW4uCittZXNzYWdlIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHsKKyAgLy8gVGhlIC5wcm90byBmaWxlcyB0aGF0IHdlcmUgZXhwbGljaXRseSBsaXN0ZWQgb24gdGhlIGNvbW1hbmQtbGluZS4gIFRoZQorICAvLyBjb2RlIGdlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgY29kZSBvbmx5IGZvciB0aGVzZSBmaWxlcy4gIEVhY2ggZmlsZSdzCisgIC8vIGRlc2NyaXB0b3Igd2lsbCBiZSBpbmNsdWRlZCBpbiBwcm90b19maWxlLCBiZWxvdy4KKyAgcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworCisgIC8vIFRoZSBnZW5lcmF0b3IgcGFyYW1ldGVyIHBhc3NlZCBvbiB0aGUgY29tbWFuZC1saW5lLgorICBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKKworICAvLyBGaWxlRGVzY3JpcHRvclByb3RvcyBmb3IgYWxsIGZpbGVzIGluIGZpbGVzX3RvX2dlbmVyYXRlIGFuZCBldmVyeXRoaW5nCisgIC8vIHRoZXkgaW1wb3J0LiAgVGhlIGZpbGVzIHdpbGwgYXBwZWFyIGluIHRvcG9sb2dpY2FsIG9yZGVyLCBzbyBlYWNoIGZpbGUKKyAgLy8gYXBwZWFycyBiZWZvcmUgYW55IGZpbGUgdGhhdCBpbXBvcnRzIGl0LgorICAvLworICAvLyBwcm90b2MgZ3VhcmFudGVlcyB0aGF0IGFsbCBwcm90b19maWxlcyB3aWxsIGJlIHdyaXR0ZW4gYWZ0ZXIKKyAgLy8gdGhlIGZpZWxkcyBhYm92ZSwgZXZlbiB0aG91Z2ggdGhpcyBpcyBub3QgdGVjaG5pY2FsbHkgZ3VhcmFudGVlZCBieSB0aGUKKyAgLy8gcHJvdG9idWYgd2lyZSBmb3JtYXQuICBUaGlzIHRoZW9yZXRpY2FsbHkgY291bGQgYWxsb3cgYSBwbHVnaW4gdG8gc3RyZWFtCisgIC8vIGluIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvcyBhbmQgaGFuZGxlIHRoZW0gb25lIGJ5IG9uZSByYXRoZXIgdGhhbiByZWFkCisgIC8vIHRoZSBlbnRpcmUgc2V0IGludG8gbWVtb3J5IGF0IG9uY2UuICBIb3dldmVyLCBhcyBvZiB0aGlzIHdyaXRpbmcsIHRoaXMKKyAgLy8gaXMgbm90IHNpbWlsYXJseSBvcHRpbWl6ZWQgb24gcHJvdG9jJ3MgZW5kIC0tIGl0IHdpbGwgc3RvcmUgYWxsIGZpZWxkcyBpbgorICAvLyBtZW1vcnkgYXQgb25jZSBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIHRoZSBwbHVnaW4uCisgIHJlcGVhdGVkIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fZmlsZSA9IDE1OworfQorCisvLyBUaGUgcGx1Z2luIHdyaXRlcyBhbiBlbmNvZGVkIENvZGVHZW5lcmF0b3JSZXNwb25zZSB0byBzdGRvdXQuCittZXNzYWdlIENvZGVHZW5lcmF0b3JSZXNwb25zZSB7CisgIC8vIEVycm9yIG1lc3NhZ2UuICBJZiBub24tZW1wdHksIGNvZGUgZ2VuZXJhdGlvbiBmYWlsZWQuICBUaGUgcGx1Z2luIHByb2Nlc3MKKyAgLy8gc2hvdWxkIGV4aXQgd2l0aCBzdGF0dXMgY29kZSB6ZXJvIGV2ZW4gaWYgaXQgcmVwb3J0cyBhbiBlcnJvciBpbiB0aGlzIHdheS4KKyAgLy8KKyAgLy8gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBpbmRpY2F0ZSBlcnJvcnMgaW4gLnByb3RvIGZpbGVzIHdoaWNoIHByZXZlbnQgdGhlCisgIC8vIGNvZGUgZ2VuZXJhdG9yIGZyb20gZ2VuZXJhdGluZyBjb3JyZWN0IGNvZGUuICBFcnJvcnMgd2hpY2ggaW5kaWNhdGUgYQorICAvLyBwcm9ibGVtIGluIHByb3RvYyBpdHNlbGYgLS0gc3VjaCBhcyB0aGUgaW5wdXQgQ29kZUdlbmVyYXRvclJlcXVlc3QgYmVpbmcKKyAgLy8gdW5wYXJzZWFibGUgLS0gc2hvdWxkIGJlIHJlcG9ydGVkIGJ5IHdyaXRpbmcgYSBtZXNzYWdlIHRvIHN0ZGVyciBhbmQKKyAgLy8gZXhpdGluZyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzIGNvZGUuCisgIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7CisKKyAgLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBnZW5lcmF0ZWQgZmlsZS4KKyAgbWVzc2FnZSBGaWxlIHsKKyAgICAvLyBUaGUgZmlsZSBuYW1lLCByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRoZSBuYW1lIG11c3Qgbm90CisgICAgLy8gY29udGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzIGFuZCBtdXN0IGJlIHJlbGF0aXZlLCBub3QgYmUgYWJzb2x1dGUgKHNvLAorICAgIC8vIHRoZSBmaWxlIGNhbm5vdCBsaWUgb3V0c2lkZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSkuICAiLyIgbXVzdCBiZSB1c2VkIGFzCisgICAgLy8gdGhlIHBhdGggc2VwYXJhdG9yLCBub3QgIlwiLgorICAgIC8vCisgICAgLy8gSWYgdGhlIG5hbWUgaXMgb21pdHRlZCwgdGhlIGNvbnRlbnQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXMKKyAgICAvLyBmaWxlLiAgVGhpcyBhbGxvd3MgdGhlIGdlbmVyYXRvciB0byBicmVhayBsYXJnZSBmaWxlcyBpbnRvIHNtYWxsIGNodW5rcywKKyAgICAvLyBhbmQgYWxsb3dzIHRoZSBnZW5lcmF0ZWQgdGV4dCB0byBiZSBzdHJlYW1lZCBiYWNrIHRvIHByb3RvYyBzbyB0aGF0IGxhcmdlCisgICAgLy8gZmlsZXMgbmVlZCBub3QgcmVzaWRlIGNvbXBsZXRlbHkgaW4gbWVtb3J5IGF0IG9uZSB0aW1lLiAgTm90ZSB0aGF0IGFzIG9mCisgICAgLy8gdGhpcyB3cml0aW5nIHByb3RvYyBkb2VzIG5vdCBvcHRpbWl6ZSBmb3IgdGhpcyAtLSBpdCB3aWxsIHJlYWQgdGhlIGVudGlyZQorICAgIC8vIENvZGVHZW5lcmF0b3JSZXNwb25zZSBiZWZvcmUgd3JpdGluZyBmaWxlcyB0byBkaXNrLgorICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAgIC8vIElmIG5vbi1lbXB0eSwgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVkIGZpbGUgc2hvdWxkIGFscmVhZHkgZXhpc3QsIGFuZCB0aGUKKyAgICAvLyBjb250ZW50IGhlcmUgaXMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGF0IGZpbGUgYXQgYSBkZWZpbmVkIGluc2VydGlvbgorICAgIC8vIHBvaW50LiAgVGhpcyBmZWF0dXJlIGFsbG93cyBhIGNvZGUgZ2VuZXJhdG9yIHRvIGV4dGVuZCB0aGUgb3V0cHV0CisgICAgLy8gcHJvZHVjZWQgYnkgYW5vdGhlciBjb2RlIGdlbmVyYXRvci4gIFRoZSBvcmlnaW5hbCBnZW5lcmF0b3IgbWF5IHByb3ZpZGUKKyAgICAvLyBpbnNlcnRpb24gcG9pbnRzIGJ5IHBsYWNpbmcgc3BlY2lhbCBhbm5vdGF0aW9ucyBpbiB0aGUgZmlsZSB0aGF0IGxvb2sKKyAgICAvLyBsaWtlOgorICAgIC8vICAgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KE5BTUUpCisgICAgLy8gVGhlIGFubm90YXRpb24gY2FuIGhhdmUgYXJiaXRyYXJ5IHRleHQgYmVmb3JlIGFuZCBhZnRlciBpdCBvbiB0aGUgbGluZSwKKyAgICAvLyB3aGljaCBhbGxvd3MgaXQgdG8gYmUgcGxhY2VkIGluIGEgY29tbWVudC4gIE5BTUUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGgKKyAgICAvLyBhbiBpZGVudGlmaWVyIG5hbWluZyB0aGUgcG9pbnQgLS0gdGhpcyBpcyB3aGF0IG90aGVyIGdlbmVyYXRvcnMgd2lsbCB1c2UKKyAgICAvLyBhcyB0aGUgaW5zZXJ0aW9uX3BvaW50LiAgQ29kZSBpbnNlcnRlZCBhdCB0aGlzIHBvaW50IHdpbGwgYmUgcGxhY2VkCisgICAgLy8gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgaW5zZXJ0aW9uIHBvaW50ICh0aHVzIG11bHRpcGxlCisgICAgLy8gaW5zZXJ0aW9ucyB0byB0aGUgc2FtZSBwb2ludCB3aWxsIGNvbWUgb3V0IGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWRkZWQpLgorICAgIC8vIFRoZSBkb3VibGUtQCBpcyBpbnRlbmRlZCB0byBtYWtlIGl0IHVubGlrZWx5IHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlCisgICAgLy8gY291bGQgY29udGFpbiB0aGluZ3MgdGhhdCBsb29rIGxpa2UgaW5zZXJ0aW9uIHBvaW50cyBieSBhY2NpZGVudC4KKyAgICAvLworICAgIC8vIEZvciBleGFtcGxlLCB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHBsYWNlcyB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlCisgICAgLy8gLnBiLmggZmlsZXMgdGhhdCBpdCBnZW5lcmF0ZXM6CisgICAgLy8gICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorICAgIC8vIFRoaXMgbGluZSBhcHBlYXJzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGZpbGUncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0CisgICAgLy8gb3V0c2lkZSBvZiBhbnkgcGFydGljdWxhciBjbGFzcy4gIEFub3RoZXIgcGx1Z2luIGNhbiB0aGVuIHNwZWNpZnkgdGhlCisgICAgLy8gaW5zZXJ0aW9uX3BvaW50ICJuYW1lc3BhY2Vfc2NvcGUiIHRvIGdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3NlcyBvcgorICAgIC8vIG90aGVyIGRlY2xhcmF0aW9ucyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcyBzY29wZS4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCBpZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBpbnNlcnRpb24gcG9pbnQgYmVnaW5zIHdpdGgKKyAgICAvLyB3aGl0ZXNwYWNlLCB0aGUgc2FtZSB3aGl0ZXNwYWNlIHdpbGwgYmUgYWRkZWQgdG8gZXZlcnkgbGluZSBvZiB0aGUKKyAgICAvLyBpbnNlcnRlZCB0ZXh0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwgd2hlcmUKKyAgICAvLyBpbmRlbnRhdGlvbiBtYXR0ZXJzLiAgSW4gdGhlc2UgbGFuZ3VhZ2VzLCB0aGUgaW5zZXJ0aW9uIHBvaW50IGNvbW1lbnQKKyAgICAvLyBzaG91bGQgYmUgaW5kZW50ZWQgdGhlIHNhbWUgYW1vdW50IGFzIGFueSBpbnNlcnRlZCBjb2RlIHdpbGwgbmVlZCB0byBiZQorICAgIC8vIGluIG9yZGVyIHRvIHdvcmsgY29ycmVjdGx5IGluIHRoYXQgY29udGV4dC4KKyAgICAvLworICAgIC8vIFRoZSBjb2RlIGdlbmVyYXRvciB0aGF0IGdlbmVyYXRlcyB0aGUgaW5pdGlhbCBmaWxlIGFuZCB0aGUgb25lIHdoaWNoCisgICAgLy8gaW5zZXJ0cyBpbnRvIGl0IG11c3QgYm90aCBydW4gYXMgcGFydCBvZiBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHByb3RvYy4KKyAgICAvLyBDb2RlIGdlbmVyYXRvcnMgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUKKyAgICAvLyBjb21tYW5kIGxpbmUuCisgICAgLy8KKyAgICAvLyBJZiB8aW5zZXJ0aW9uX3BvaW50fCBpcyBwcmVzZW50LCB8bmFtZXwgbXVzdCBhbHNvIGJlIHByZXNlbnQuCisgICAgb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CisKKyAgICAvLyBUaGUgZmlsZSBjb250ZW50cy4KKyAgICBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICB9CisgIHJlcGVhdGVkIEZpbGUgZmlsZSA9IDE1OworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMWFjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMTU3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHJvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pCisvLworLy8gVGhpcyBtb2R1bGUgb3V0cHV0cyBwdXJlLVB5dGhvbiBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgdGhhdCB3aWxsCisvLyBsYXJnZWx5IGJlIGNvbnN0cnVjdGVkIGF0IHJ1bnRpbWUgdmlhIHRoZSBtZXRhY2xhc3MgaW4gcmVmbGVjdGlvbi5weS4KKy8vIEluIG90aGVyIHdvcmRzLCBvdXIgam9iIGlzIGJhc2ljYWxseSB0byBvdXRwdXQgYSBQeXRob24gZXF1aXZhbGVudAorLy8gb2YgdGhlIEMrKyAqRGVzY3JpcHRvciBvYmplY3RzLCBhbmQgZml4IHVwIGFsbCBjaXJjdWxhciByZWZlcmVuY2VzCisvLyB3aXRoaW4gdGhlc2Ugb2JqZWN0cy4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIHJ1bnRpbWUgcGVyZm9ybWFuY2Ugb2YgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGNyZWF0ZWQgaW4KKy8vIHRoaXMgd2F5IGlzIGV4cGVjdGVkIHRvIGJlIGxvdXN5LiAgVGhlIHBsYW4gaXMgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZQorLy8gZ2VuZXJhdG9yIHRoYXQgb3V0cHV0cyBhIFB5dGhvbi9DIGV4dGVuc2lvbiBtb2R1bGUgdGhhdCBsZXRzCisvLyBwZXJmb3JtYW5jZS1taW5kZWQgUHl0aG9uIGNvZGUgbGV2ZXJhZ2UgdGhlIGZhc3QgQysrIGltcGxlbWVudGF0aW9uCisvLyBkaXJlY3RseS4KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK25hbWVzcGFjZSB7CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHxmaWxlbmFtZXwgd2l0aCBhbnkgdHJhaWxpbmcgIi5wcm90b2RldmVsIiBvciAiLnByb3RvCisvLyBzdWZmaXggc3RyaXBwZWQuCisvLyBUT0RPKHJvYmluc29uKTogVW5pZnkgd2l0aCBjb3B5IGluIGNvbXBpbGVyL2NwcC9pbnRlcm5hbC9oZWxwZXJzLmNjLgorc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICBjb25zdCBjaGFyKiBzdWZmaXggPSBIYXNTdWZmaXhTdHJpbmcoZmlsZW5hbWUsICIucHJvdG9kZXZlbCIpCisgICAgICA/ICIucHJvdG9kZXZlbCIgOiAiLnByb3RvIjsKKyAgcmV0dXJuIFN0cmlwU3VmZml4U3RyaW5nKGZpbGVuYW1lLCBzdWZmaXgpOworfQorCisKKy8vIFJldHVybnMgdGhlIFB5dGhvbiBtb2R1bGUgbmFtZSBleHBlY3RlZCBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZW5hbWUuCitzdHJpbmcgTW9kdWxlTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0cmluZyBiYXNlbmFtZSA9IFN0cmlwUHJvdG8oZmlsZW5hbWUpOworICBTdHJpcFN0cmluZygmYmFzZW5hbWUsICItIiwgJ18nKTsKKyAgU3RyaXBTdHJpbmcoJmJhc2VuYW1lLCAiLyIsICcuJyk7CisgIHJldHVybiBiYXNlbmFtZSArICJfcGIyIjsKK30KKworCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIGFsbCBjb250YWluaW5nIHR5cGVzIGZvciBkZXNjcmlwdG9yLAorLy8gaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LCBmb2xsb3dlZCBieSBkZXNjcmlwdG9yJ3MKKy8vIG93biBuYW1lLiAgRWFjaCBuYW1lIGlzIHNlcGFyYXRlZCBieSB8c2VwYXJhdG9yfC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVD4KK3N0cmluZyBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc2VwYXJhdG9yKSB7CisgIHN0cmluZyBuYW1lID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIGZvciAoY29uc3QgRGVzY3JpcHRvciogY3VycmVudCA9IGRlc2NyaXB0b3IuY29udGFpbmluZ190eXBlKCk7CisgICAgICAgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+Y29udGFpbmluZ190eXBlKCkpIHsKKyAgICBuYW1lID0gY3VycmVudC0+bmFtZSgpICsgc2VwYXJhdG9yICsgbmFtZTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworCisvLyBOYW1lIG9mIHRoZSBjbGFzcyBhdHRyaWJ1dGUgd2hlcmUgd2Ugc3RvcmUgdGhlIFB5dGhvbgorLy8gZGVzY3JpcHRvci5EZXNjcmlwdG9yIGluc3RhbmNlIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzLgorLy8gTXVzdCBzdGF5IGNvbnNpc3RlbnQgd2l0aCB0aGUgX0RFU0NSSVBUT1JfS0VZIGNvbnN0YW50CisvLyBpbiBwcm90bzIvcHVibGljL3JlZmxlY3Rpb24ucHkuCitjb25zdCBjaGFyIGtEZXNjcmlwdG9yS2V5W10gPSAiREVTQ1JJUFRPUiI7CisKKworLy8gRG9lcyB0aGUgZmlsZSBoYXZlIHRvcC1sZXZlbCBlbnVtcz8KK2lubGluZSBib29sIEhhc1RvcExldmVsRW51bXMoY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPmVudW1fdHlwZV9jb3VudCgpID4gMDsKK30KKworCisvLyBTaG91bGQgd2UgZ2VuZXJhdGUgZ2VuZXJpYyBzZXJ2aWNlcyBmb3IgdGhpcyBmaWxlPworaW5saW5lIGJvb2wgSGFzR2VuZXJpY1NlcnZpY2VzKGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlKSB7CisgIHJldHVybiBmaWxlLT5zZXJ2aWNlX2NvdW50KCkgPiAwICYmCisgICAgICAgICBmaWxlLT5vcHRpb25zKCkucHlfZ2VuZXJpY19zZXJ2aWNlcygpOworfQorCisKKy8vIFByaW50cyB0aGUgY29tbW9uIGJvaWxlcnBsYXRlIG5lZWRlZCBhdCB0aGUgdG9wIG9mIGV2ZXJ5IC5weQorLy8gZmlsZSBvdXRwdXQgYnkgdGhpcyBnZW5lcmF0b3IuCit2b2lkIFByaW50VG9wQm9pbGVycGxhdGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGRlc2NyaXB0b3JfcHJvdG8pIHsKKyAgLy8gVE9ETyhyb2JpbnNvbik6IEFsbG93IHBhcmFtZXRlcml6YXRpb24gb2YgUHl0aG9uIHZlcnNpb24/CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKKyAgICAgICIjIHNvdXJjZTogJGZpbGVuYW1lJFxuIgorICAgICAgIlxuIiwKKyAgICAgICJmaWxlbmFtZSIsIGZpbGUtPm5hbWUoKSk7CisgIGlmIChIYXNUb3BMZXZlbEVudW1zKGZpbGUpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW51bV90eXBlX3dyYXBwZXJcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIF9kZXNjcmlwdG9yXG4iCisgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UgYXMgX21lc3NhZ2VcbiIKKyAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvblxuIgorICAgICAgKTsKKyAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UgYXMgX3NlcnZpY2VcbiIKKyAgICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlX3JlZmxlY3Rpb25cbiIpOworICB9CisKKyAgLy8gQXZvaWQgY2lyY3VsYXIgaW1wb3J0cyBpZiB0aGlzIG1vZHVsZSBpcyBkZXNjcmlwdG9yX3BiMi4KKyAgaWYgKCFkZXNjcmlwdG9yX3Byb3RvKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjJcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICIjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKVxuIik7CisgIHByaW50ZXItPlByaW50KCJcblxuIik7Cit9CisKKworLy8gUmV0dXJucyBhIFB5dGhvbiBsaXRlcmFsIGdpdmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmaWVsZC4KKy8vIElmIHRoZSBmaWVsZCBzcGVjaWZpZXMgbm8gZXhwbGljaXQgZGVmYXVsdCB2YWx1ZSwgd2UnbGwgcmV0dXJuCisvLyB0aGUgZGVmYXVsdCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmllbGQgdHlwZSAoemVybyBmb3IgbnVtYmVycywKKy8vIGVtcHR5IHN0cmluZyBmb3Igc3RyaW5ncywgZW1wdHkgbGlzdCBmb3IgcmVwZWF0ZWQgZmllbGRzLCBhbmQKKy8vIE5vbmUgZm9yIG5vbi1yZXBlYXRlZCwgY29tcG9zaXRlIGZpZWxkcykuCisvLworLy8gVE9ETyhyb2JpbnNvbik6IFVuaWZ5IHdpdGggY29kZSBmcm9tCisvLyAvL2NvbXBpbGVyL2NwcC9pbnRlcm5hbC9wcmltaXRpdmVfZmllbGQuY2MKKy8vIC8vY29tcGlsZXIvY3BwL2ludGVybmFsL2VudW1fZmllbGQuY2MKKy8vIC8vY29tcGlsZXIvY3BwL2ludGVybmFsL3N0cmluZ19maWVsZC5jYworc3RyaW5nIFN0cmluZ2lmeURlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkKSB7CisgIGlmIChmaWVsZC5pc19yZXBlYXRlZCgpKSB7CisgICAgcmV0dXJuICJbXSI7CisgIH0KKworICBzd2l0Y2ggKGZpZWxkLmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLmRlZmF1bHRfdmFsdWVfaW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQuZGVmYXVsdF92YWx1ZV91aW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC5kZWZhdWx0X3ZhbHVlX2ludDY0KCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLmRlZmF1bHRfdmFsdWVfdWludDY0KCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gZmllbGQuZGVmYXVsdF92YWx1ZV9kb3VibGUoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgICAgIC8vIFB5dGhvbiBwcmUtMi42IG9uIFdpbmRvd3MgZG9lcyBub3QgcGFyc2UgImluZiIgY29ycmVjdGx5LiAgSG93ZXZlciwKKyAgICAgICAgLy8gYSBudW1lcmljIGxpdGVyYWwgdGhhdCBpcyB0b28gYmlnIGZvciBhIGRvdWJsZSB3aWxsIGJlY29tZSBpbmZpbml0eS4KKyAgICAgICAgcmV0dXJuICIxZTEwMDAwIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgLy8gU2VlIGFib3ZlLgorICAgICAgICByZXR1cm4gIi0xZTEwMDAwIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgLy8gaW5maW5pdHkgKiAwID0gbmFuCisgICAgICAgIHJldHVybiAiKDFlMTAwMDAgKiAwKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU2ltcGxlRHRvYSh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRfdmFsdWVfZmxvYXQoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKKyAgICAgICAgLy8gUHl0aG9uIHByZS0yLjYgb24gV2luZG93cyBkb2VzIG5vdCBwYXJzZSAiaW5mIiBjb3JyZWN0bHkuICBIb3dldmVyLAorICAgICAgICAvLyBhIG51bWVyaWMgbGl0ZXJhbCB0aGF0IGlzIHRvbyBiaWcgZm9yIGEgZG91YmxlIHdpbGwgYmVjb21lIGluZmluaXR5LgorICAgICAgICByZXR1cm4gIjFlMTAwMDAiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgIC8vIFNlZSBhYm92ZS4KKyAgICAgICAgcmV0dXJuICItMWUxMDAwMCI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgIC8vIGluZmluaXR5IC0gaW5maW5pdHkgPSBuYW4KKyAgICAgICAgcmV0dXJuICIoMWUxMDAwMCAqIDApIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTaW1wbGVGdG9hKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBmaWVsZC5kZWZhdWx0X3ZhbHVlX2Jvb2woKSA/ICJUcnVlIiA6ICJGYWxzZSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgIHJldHVybiAidW5pY29kZShcIiIgKyBDRXNjYXBlKGZpZWxkLmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgXCJ1dGYtOFwiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlwiIiArIENFc2NhcGUoZmllbGQuZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkgKyAiXCIiOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICByZXR1cm4gIk5vbmUiOworICB9CisgIC8vIChXZSBjb3VsZCBhZGQgYSBkZWZhdWx0IGNhc2UgYWJvdmUgYnV0IHRoZW4gd2Ugd291bGRuJ3QgZ2V0IHRoZSBuaWNlCisgIC8vIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBhIG5ldyB0eXBlIGlzIGFkZGVkLikKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vdCByZWFjaGVkLiI7CisgIHJldHVybiAiIjsKK30KKworCisKK30gIC8vIG5hbWVzcGFjZQorCisKK0dlbmVyYXRvcjo6R2VuZXJhdG9yKCkgOiBmaWxlXyhOVUxMKSB7Cit9CisKK0dlbmVyYXRvcjo6fkdlbmVyYXRvcigpIHsKK30KKworYm9vbCBHZW5lcmF0b3I6OkdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgeworCisgIC8vIENvbXBsZXRlbHkgc2VyaWFsaXplIGFsbCBHZW5lcmF0ZSgpIGNhbGxzIG9uIHRoaXMgaW5zdGFuY2UuICBUaGUKKyAgLy8gdGhyZWFkLXNhZmV0eSBjb25zdHJhaW50cyBvZiB0aGUgQ29kZUdlbmVyYXRvciBpbnRlcmZhY2UgYXJlbid0IGNsZWFyIHNvCisgIC8vIGp1c3QgYmUgYXMgY29uc2VydmF0aXZlIGFzIHBvc3NpYmxlLiAgSXQncyBlYXNpZXIgdG8gcmVsYXggdGhpcyBsYXRlciBpZgorICAvLyB3ZSBuZWVkIHRvLCBidXQgSSBkb3VidCBpdCB3aWxsIGJlIGFuIGlzc3VlLgorICAvLyBUT0RPKGtlbnRvbik6ICBUaGUgcHJvcGVyIHRoaW5nIHRvIGRvIHdvdWxkIGJlIHRvIGFsbG9jYXRlIGFueSBzdGF0ZSBvbgorICAvLyAgIHRoZSBzdGFjayBhbmQgdXNlIHRoYXQsIHNvIHRoYXQgdGhlIEdlbmVyYXRvciBjbGFzcyBpdHNlbGYgZG9lcyBub3QgbmVlZAorICAvLyAgIHRvIGhhdmUgYW55IG11dGFibGUgbWVtYmVycy4gIFRoZW4gaXQgaXMgaW1wbGljaXRseSB0aHJlYWQtc2FmZS4KKyAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGZpbGVfID0gZmlsZTsKKyAgc3RyaW5nIG1vZHVsZV9uYW1lID0gTW9kdWxlTmFtZShmaWxlLT5uYW1lKCkpOworICBzdHJpbmcgZmlsZW5hbWUgPSBtb2R1bGVfbmFtZTsKKyAgU3RyaXBTdHJpbmcoJmZpbGVuYW1lLCAiLiIsICcvJyk7CisgIGZpbGVuYW1lICs9ICIucHkiOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmRwOworICBmaWxlXy0+Q29weVRvKCZmZHApOworICBmZHAuU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXyk7CisKKworICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KGNvbnRleHQtPk9wZW4oZmlsZW5hbWUpKTsKKyAgR09PR0xFX0NIRUNLKG91dHB1dC5nZXQoKSk7CisgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICBwcmludGVyXyA9ICZwcmludGVyOworCisgIFByaW50VG9wQm9pbGVycGxhdGUocHJpbnRlcl8sIGZpbGVfLCBHZW5lcmF0aW5nRGVzY3JpcHRvclByb3RvKCkpOworICBQcmludEltcG9ydHMoKTsKKyAgUHJpbnRGaWxlRGVzY3JpcHRvcigpOworICBQcmludFRvcExldmVsRW51bXMoKTsKKyAgUHJpbnRUb3BMZXZlbEV4dGVuc2lvbnMoKTsKKyAgUHJpbnRBbGxOZXN0ZWRFbnVtc0luRmlsZSgpOworICBQcmludE1lc3NhZ2VEZXNjcmlwdG9ycygpOworICBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9ycygpOworICBQcmludE1lc3NhZ2VzKCk7CisgIC8vIFdlIGhhdmUgdG8gZml4IHVwIHRoZSBleHRlbnNpb25zIGFmdGVyIHRoZSBtZXNzYWdlIGNsYXNzZXMgdGhlbXNlbHZlcywKKyAgLy8gc2luY2UgdGhleSBuZWVkIHRvIGNhbGwgc3RhdGljIFJlZ2lzdGVyRXh0ZW5zaW9uKCkgbWV0aG9kcyBvbiB0aGVzZQorICAvLyBjbGFzc2VzLgorICBGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb25zKCk7CisgIC8vIERlc2NyaXB0b3Igb3B0aW9ucyBtYXkgaGF2ZSBjdXN0b20gZXh0ZW5zaW9ucy4gVGhlc2UgY3VzdG9tIG9wdGlvbnMKKyAgLy8gY2FuIG9ubHkgYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBhZnRlciB3ZSByZWdpc3RlciBjb3JyZXNwb25kaW5nCisgIC8vIGV4dGVuc2lvbnMuIFRoZXJlZm9yZSB3ZSBwYXJzZSBhbGwgb3B0aW9ucyBhZ2FpbiBoZXJlIHRvIHJlY29nbml6ZQorICAvLyBjdXN0b20gb3B0aW9ucyB0aGF0IG1heSBiZSB1bmtub3duIHdoZW4gd2UgZGVmaW5lIHRoZSBkZXNjcmlwdG9ycy4KKyAgRml4QWxsRGVzY3JpcHRvck9wdGlvbnMoKTsKKyAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlKSkgeworICAgIFByaW50U2VydmljZXMoKTsKKyAgfQorCisgIHByaW50ZXIuUHJpbnQoCisgICAgIiMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSlcbiIpOworCisgIHJldHVybiAhcHJpbnRlci5mYWlsZWQoKTsKK30KKworLy8gUHJpbnRzIFB5dGhvbiBpbXBvcnRzIGZvciBhbGwgbW9kdWxlcyBpbXBvcnRlZCBieSB8ZmlsZXwuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRJbXBvcnRzKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7ICsraSkgeworICAgIHN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZV8tPmRlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCJpbXBvcnQgJG1vZHVsZSRcbiIsICJtb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworCisgIC8vIFByaW50IHB1YmxpYyBpbXBvcnRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyArK2kpIHsKKyAgICBzdHJpbmcgbW9kdWxlX25hbWUgPSBNb2R1bGVOYW1lKGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoImZyb20gJG1vZHVsZSQgaW1wb3J0ICpcbiIsICJtb2R1bGUiLCBtb2R1bGVfbmFtZSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworfQorCisvLyBQcmludHMgdGhlIHNpbmdsZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZmlsZS4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEZpbGVEZXNjcmlwdG9yKCkgY29uc3QgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CisgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIG1bIm5hbWUiXSA9IGZpbGVfLT5uYW1lKCk7CisgIG1bInBhY2thZ2UiXSA9IGZpbGVfLT5wYWNrYWdlKCk7CisgIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQorICAgICAgIiRkZXNjcmlwdG9yX25hbWUkID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoXG4iCisgICAgICAiICBuYW1lPSckbmFtZSQnLFxuIgorICAgICAgIiAgcGFja2FnZT0nJHBhY2thZ2UkJyxcbiI7CisgIHByaW50ZXJfLT5QcmludChtLCBmaWxlX2Rlc2NyaXB0b3JfdGVtcGxhdGUpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICJzZXJpYWxpemVkX3BiPSckdmFsdWUkJyIsCisgICAgICAidmFsdWUiLCBzdHJpbmdzOjpDSGV4RXNjYXBlKGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXykpOworCisgIC8vIFRPRE8oZmFsayk6IEFsc28gcHJpbnQgb3B0aW9ucyBhbmQgZml4IHRoZSBtZXNzYWdlX3R5cGUsIGVudW1fdHlwZSwKKyAgLy8gICAgICAgICAgICAgc2VydmljZSBhbmQgZXh0ZW5zaW9uIGxhdGVyIGluIHRoZSBnZW5lcmF0aW9uLgorCisgIHByaW50ZXJfLT5PdXRkZW50KCk7CisgIHByaW50ZXJfLT5QcmludCgiKVxuIik7CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKK30KKworLy8gUHJpbnRzIGRlc2NyaXB0b3JzIGFuZCBtb2R1bGUtbGV2ZWwgY29uc3RhbnRzIGZvciBhbGwgdG9wLWxldmVsCisvLyBlbnVtcyBkZWZpbmVkIGluIHxmaWxlfC4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludFRvcExldmVsRW51bXMoKSBjb25zdCB7CisgIHZlY3RvcjxwYWlyPHN0cmluZywgaW50PiA+IHRvcF9sZXZlbF9lbnVtX3ZhbHVlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yJiBlbnVtX2Rlc2NyaXB0b3IgPSAqZmlsZV8tPmVudW1fdHlwZShpKTsKKyAgICBQcmludEVudW0oZW51bV9kZXNjcmlwdG9yKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIiRuYW1lJCA9ICIKKyAgICAgICAgICAgICAgICAgICAgImVudW1fdHlwZV93cmFwcGVyLkVudW1UeXBlV3JhcHBlcigkZGVzY3JpcHRvcl9uYW1lJCkiLAorICAgICAgICAgICAgICAgICAgICAibmFtZSIsIGVudW1fZGVzY3JpcHRvci5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yX25hbWUiLAorICAgICAgICAgICAgICAgICAgICBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGVudW1fZGVzY3JpcHRvcikpOworICAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKKworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZW51bV9kZXNjcmlwdG9yLnZhbHVlX2NvdW50KCk7ICsraikgeworICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciYgdmFsdWVfZGVzY3JpcHRvciA9ICplbnVtX2Rlc2NyaXB0b3IudmFsdWUoaik7CisgICAgICB0b3BfbGV2ZWxfZW51bV92YWx1ZXMucHVzaF9iYWNrKAorICAgICAgICAgIG1ha2VfcGFpcih2YWx1ZV9kZXNjcmlwdG9yLm5hbWUoKSwgdmFsdWVfZGVzY3JpcHRvci5udW1iZXIoKSkpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9wX2xldmVsX2VudW1fdmFsdWVzLnNpemUoKTsgKytpKSB7CisgICAgcHJpbnRlcl8tPlByaW50KCIkbmFtZSQgPSAkdmFsdWUkXG4iLAorICAgICAgICAgICAgICAgICAgICAibmFtZSIsIHRvcF9sZXZlbF9lbnVtX3ZhbHVlc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlIiwgU2ltcGxlSXRvYSh0b3BfbGV2ZWxfZW51bV92YWx1ZXNbaV0uc2Vjb25kKSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworfQorCisvLyBQcmludHMgYWxsIGVudW1zIGNvbnRhaW5lZCBpbiBhbGwgbWVzc2FnZSB0eXBlcyBpbiB8ZmlsZXwuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRBbGxOZXN0ZWRFbnVtc0luRmlsZSgpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFByaW50TmVzdGVkRW51bXMoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOworICB9Cit9CisKKy8vIFByaW50cyBhIFB5dGhvbiBzdGF0ZW1lbnQgYXNzaWduaW5nIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGUtbGV2ZWwKKy8vIGVudW0gbmFtZSB0byBhIFB5dGhvbiBFbnVtRGVzY3JpcHRvciBvYmplY3QgZXF1aXZhbGVudCB0bworLy8gZW51bV9kZXNjcmlwdG9yLgordm9pZCBHZW5lcmF0b3I6OlByaW50RW51bShjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGVudW1fZGVzY3JpcHRvcik7CisgIG1bIm5hbWUiXSA9IGVudW1fZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bImZ1bGxfbmFtZSJdID0gZW51bV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSgpOworICBtWyJmaWxlIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgY29uc3QgY2hhciBlbnVtX2Rlc2NyaXB0b3JfdGVtcGxhdGVbXSA9CisgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQgPSBfZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcihcbiIKKyAgICAgICIgIG5hbWU9JyRuYW1lJCcsXG4iCisgICAgICAiICBmdWxsX25hbWU9JyRmdWxsX25hbWUkJyxcbiIKKyAgICAgICIgIGZpbGVuYW1lPU5vbmUsXG4iCisgICAgICAiICBmaWxlPSRmaWxlJCxcbiIKKyAgICAgICIgIHZhbHVlcz1bXG4iOworICBzdHJpbmcgb3B0aW9uc19zdHJpbmc7CisgIGVudW1fZGVzY3JpcHRvci5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKKyAgcHJpbnRlcl8tPlByaW50KG0sIGVudW1fZGVzY3JpcHRvcl90ZW1wbGF0ZSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fZGVzY3JpcHRvci52YWx1ZV9jb3VudCgpOyArK2kpIHsKKyAgICBQcmludEVudW1WYWx1ZURlc2NyaXB0b3IoKmVudW1fZGVzY3JpcHRvci52YWx1ZShpKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKKyAgfQorICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCJjb250YWluaW5nX3R5cGU9Tm9uZSxcbiIpOworICBwcmludGVyXy0+UHJpbnQoIm9wdGlvbnM9JG9wdGlvbnNfdmFsdWUkLFxuIiwKKyAgICAgICAgICAgICAgICAgICJvcHRpb25zX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgIE9wdGlvbnNWYWx1ZSgiRW51bU9wdGlvbnMiLCBvcHRpb25zX3N0cmluZykpOworICBFbnVtRGVzY3JpcHRvclByb3RvIGVkcDsKKyAgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbChlbnVtX2Rlc2NyaXB0b3IsIGVkcCk7CisgIHByaW50ZXJfLT5PdXRkZW50KCk7CisgIHByaW50ZXJfLT5QcmludCgiKVxuIik7CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKK30KKworLy8gUmVjdXJzaXZlbHkgcHJpbnRzIGVudW1zIGluIG5lc3RlZCB0eXBlcyB3aXRoaW4gZGVzY3JpcHRvciwgdGhlbgorLy8gcHJpbnRzIGVudW1zIGNvbnRhaW5lZCBhdCB0aGUgdG9wIGxldmVsIGluIGRlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRFbnVtcyhjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBQcmludE5lc3RlZEVudW1zKCpkZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnRFbnVtKCpkZXNjcmlwdG9yLmVudW1fdHlwZShpKSk7CisgIH0KK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50VG9wTGV2ZWxFeHRlbnNpb25zKCkgY29uc3QgeworICBjb25zdCBib29sIGlzX2V4dGVuc2lvbiA9IHRydWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGV4dGVuc2lvbl9maWVsZCA9ICpmaWxlXy0+ZXh0ZW5zaW9uKGkpOworICAgIHN0cmluZyBjb25zdGFudF9uYW1lID0gZXh0ZW5zaW9uX2ZpZWxkLm5hbWUoKSArICJfRklFTERfTlVNQkVSIjsKKyAgICBVcHBlclN0cmluZygmY29uc3RhbnRfbmFtZSk7CisgICAgcHJpbnRlcl8tPlByaW50KCIkY29uc3RhbnRfbmFtZSQgPSAkbnVtYmVyJFxuIiwKKyAgICAgICJjb25zdGFudF9uYW1lIiwgY29uc3RhbnRfbmFtZSwKKyAgICAgICJudW1iZXIiLCBTaW1wbGVJdG9hKGV4dGVuc2lvbl9maWVsZC5udW1iZXIoKSkpOworICAgIHByaW50ZXJfLT5QcmludCgiJG5hbWUkID0gIiwgIm5hbWUiLCBleHRlbnNpb25fZmllbGQubmFtZSgpKTsKKyAgICBQcmludEZpZWxkRGVzY3JpcHRvcihleHRlbnNpb25fZmllbGQsIGlzX2V4dGVuc2lvbik7CisgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKK30KKworLy8gUHJpbnRzIFB5dGhvbiBlcXVpdmFsZW50cyBvZiBhbGwgRGVzY3JpcHRvcnMgaW4gfGZpbGV8Lgordm9pZCBHZW5lcmF0b3I6OlByaW50TWVzc2FnZURlc2NyaXB0b3JzKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnREZXNjcmlwdG9yKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgIH0KK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZXMoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnRTZXJ2aWNlRGVzY3JpcHRvcigqZmlsZV8tPnNlcnZpY2UoaSkpOworICAgIFByaW50U2VydmljZUNsYXNzKCpmaWxlXy0+c2VydmljZShpKSk7CisgICAgUHJpbnRTZXJ2aWNlU3R1YigqZmlsZV8tPnNlcnZpY2UoaSkpOworICAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRTZXJ2aWNlRGVzY3JpcHRvcigKKyAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgIHN0cmluZyBzZXJ2aWNlX25hbWUgPSBNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZShkZXNjcmlwdG9yKTsKKyAgc3RyaW5nIG9wdGlvbnNfc3RyaW5nOworICBkZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOworCisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICIkc2VydmljZV9uYW1lJCA9IF9kZXNjcmlwdG9yLlNlcnZpY2VEZXNjcmlwdG9yKFxuIiwKKyAgICAgICJzZXJ2aWNlX25hbWUiLCBzZXJ2aWNlX25hbWUpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsibmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvci5mdWxsX25hbWUoKTsKKyAgbVsiZmlsZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIG1bImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3IuaW5kZXgoKSk7CisgIG1bIm9wdGlvbnNfdmFsdWUiXSA9IE9wdGlvbnNWYWx1ZSgiU2VydmljZU9wdGlvbnMiLCBvcHRpb25zX3N0cmluZyk7CisgIGNvbnN0IGNoYXIgcmVxdWlyZWRfZnVuY3Rpb25fYXJndW1lbnRzW10gPQorICAgICAgIm5hbWU9JyRuYW1lJCcsXG4iCisgICAgICAiZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCisgICAgICAiZmlsZT0kZmlsZSQsXG4iCisgICAgICAiaW5kZXg9JGluZGV4JCxcbiIKKyAgICAgICJvcHRpb25zPSRvcHRpb25zX3ZhbHVlJCxcbiI7CisgIHByaW50ZXJfLT5QcmludChtLCByZXF1aXJlZF9mdW5jdGlvbl9hcmd1bWVudHMpOworCisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2RwOworICBQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKGRlc2NyaXB0b3IsIHNkcCk7CisKKyAgcHJpbnRlcl8tPlByaW50KCJtZXRob2RzPVtcbiIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubWV0aG9kX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3IubWV0aG9kKGkpOworICAgIG1ldGhvZC0+b3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7CisKKyAgICBtLmNsZWFyKCk7CisgICAgbVsibmFtZSJdID0gbWV0aG9kLT5uYW1lKCk7CisgICAgbVsiZnVsbF9uYW1lIl0gPSBtZXRob2QtPmZ1bGxfbmFtZSgpOworICAgIG1bImluZGV4Il0gPSBTaW1wbGVJdG9hKG1ldGhvZC0+aW5kZXgoKSk7CisgICAgbVsic2VyaWFsaXplZF9vcHRpb25zIl0gPSBDRXNjYXBlKG9wdGlvbnNfc3RyaW5nKTsKKyAgICBtWyJpbnB1dF90eXBlIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKCoobWV0aG9kLT5pbnB1dF90eXBlKCkpKTsKKyAgICBtWyJvdXRwdXRfdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSkpOworICAgIG1bIm9wdGlvbnNfdmFsdWUiXSA9IE9wdGlvbnNWYWx1ZSgiTWV0aG9kT3B0aW9ucyIsIG9wdGlvbnNfc3RyaW5nKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIl9kZXNjcmlwdG9yLk1ldGhvZERlc2NyaXB0b3IoXG4iKTsKKyAgICBwcmludGVyXy0+SW5kZW50KCk7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICBtLAorICAgICAgICAibmFtZT0nJG5hbWUkJyxcbiIKKyAgICAgICAgImZ1bGxfbmFtZT0nJGZ1bGxfbmFtZSQnLFxuIgorICAgICAgICAiaW5kZXg9JGluZGV4JCxcbiIKKyAgICAgICAgImNvbnRhaW5pbmdfc2VydmljZT1Ob25lLFxuIgorICAgICAgICAiaW5wdXRfdHlwZT0kaW5wdXRfdHlwZSQsXG4iCisgICAgICAgICJvdXRwdXRfdHlwZT0kb3V0cHV0X3R5cGUkLFxuIgorICAgICAgICAib3B0aW9ucz0kb3B0aW9uc192YWx1ZSQsXG4iKTsKKyAgICBwcmludGVyXy0+T3V0ZGVudCgpOworICAgIHByaW50ZXJfLT5QcmludCgiKSxcbiIpOworICB9CisKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJdKVxuXG4iKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZUNsYXNzKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIFByaW50IHRoZSBzZXJ2aWNlLgorICBwcmludGVyXy0+UHJpbnQoImNsYXNzICRjbGFzc19uYW1lJChfc2VydmljZS5TZXJ2aWNlKTpcbiIsCisgICAgICAgICAgICAgICAgICAiY2xhc3NfbmFtZSIsIGRlc2NyaXB0b3IubmFtZSgpKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoCisgICAgICAiX19tZXRhY2xhc3NfXyA9IHNlcnZpY2VfcmVmbGVjdGlvbi5HZW5lcmF0ZWRTZXJ2aWNlVHlwZVxuIgorICAgICAgIiRkZXNjcmlwdG9yX2tleSQgPSAkZGVzY3JpcHRvcl9uYW1lJFxuIiwKKyAgICAgICJkZXNjcmlwdG9yX2tleSIsIGtEZXNjcmlwdG9yS2V5LAorICAgICAgImRlc2NyaXB0b3JfbmFtZSIsIE1vZHVsZUxldmVsU2VydmljZURlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpKTsKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZVN0dWIoY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgLy8gUHJpbnQgdGhlIHNlcnZpY2Ugc3R1Yi4KKyAgcHJpbnRlcl8tPlByaW50KCJjbGFzcyAkY2xhc3NfbmFtZSRfU3R1YigkY2xhc3NfbmFtZSQpOlxuIiwKKyAgICAgICAgICAgICAgICAgICJjbGFzc19uYW1lIiwgZGVzY3JpcHRvci5uYW1lKCkpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICJfX21ldGFjbGFzc19fID0gc2VydmljZV9yZWZsZWN0aW9uLkdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZVxuIgorICAgICAgIiRkZXNjcmlwdG9yX2tleSQgPSAkZGVzY3JpcHRvcl9uYW1lJFxuIiwKKyAgICAgICJkZXNjcmlwdG9yX2tleSIsIGtEZXNjcmlwdG9yS2V5LAorICAgICAgImRlc2NyaXB0b3JfbmFtZSIsIE1vZHVsZUxldmVsU2VydmljZURlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpKTsKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKK30KKworLy8gUHJpbnRzIHN0YXRlbWVudCBhc3NpZ25pbmcgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IpCisvLyB0byBhIFB5dGhvbiBEZXNjcmlwdG9yIG9iamVjdCBmb3IgbWVzc2FnZV9kZXNjcmlwdG9yLgorLy8KKy8vIE11dHVhbGx5IHJlY3Vyc2l2ZSB3aXRoIFByaW50TmVzdGVkRGVzY3JpcHRvcnMoKS4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludERlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIFByaW50TmVzdGVkRGVzY3JpcHRvcnMobWVzc2FnZV9kZXNjcmlwdG9yKTsKKworICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgIHByaW50ZXJfLT5QcmludCgiJGRlc2NyaXB0b3JfbmFtZSQgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKFxuIiwKKyAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yX25hbWUiLAorICAgICAgICAgICAgICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IpKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CisgIG1bIm5hbWUiXSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bImZ1bGxfbmFtZSJdID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSgpOworICBtWyJmaWxlIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgY29uc3QgY2hhciByZXF1aXJlZF9mdW5jdGlvbl9hcmd1bWVudHNbXSA9CisgICAgICAibmFtZT0nJG5hbWUkJyxcbiIKKyAgICAgICJmdWxsX25hbWU9JyRmdWxsX25hbWUkJyxcbiIKKyAgICAgICJmaWxlbmFtZT1Ob25lLFxuIgorICAgICAgImZpbGU9JGZpbGUkLFxuIgorICAgICAgImNvbnRhaW5pbmdfdHlwZT1Ob25lLFxuIjsKKyAgcHJpbnRlcl8tPlByaW50KG0sIHJlcXVpcmVkX2Z1bmN0aW9uX2FyZ3VtZW50cyk7CisgIFByaW50RmllbGRzSW5EZXNjcmlwdG9yKG1lc3NhZ2VfZGVzY3JpcHRvcik7CisgIFByaW50RXh0ZW5zaW9uc0luRGVzY3JpcHRvcihtZXNzYWdlX2Rlc2NyaXB0b3IpOworCisgIC8vIE5lc3RlZCB0eXBlcworICBwcmludGVyXy0+UHJpbnQoIm5lc3RlZF90eXBlcz1bIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IHN0cmluZyBuZXN0ZWRfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoCisgICAgICAgICptZXNzYWdlX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSkpOworICAgIHByaW50ZXJfLT5QcmludCgiJG5hbWUkLCAiLCAibmFtZSIsIG5lc3RlZF9uYW1lKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKKworICAvLyBFbnVtIHR5cGVzCisgIHByaW50ZXJfLT5QcmludCgiZW51bV90eXBlcz1bXG4iKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3Qgc3RyaW5nIGRlc2NyaXB0b3JfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoCisgICAgICAgICptZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV90eXBlKGkpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoZGVzY3JpcHRvcl9uYW1lLmNfc3RyKCkpOworICAgIHByaW50ZXJfLT5QcmludCgiLFxuIik7CisgIH0KKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7CisgIHN0cmluZyBvcHRpb25zX3N0cmluZzsKKyAgbWVzc2FnZV9kZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOworICBwcmludGVyXy0+UHJpbnQoCisgICAgICAib3B0aW9ucz0kb3B0aW9uc192YWx1ZSQsXG4iCisgICAgICAiaXNfZXh0ZW5kYWJsZT0kZXh0ZW5kYWJsZSQiLAorICAgICAgIm9wdGlvbnNfdmFsdWUiLCBPcHRpb25zVmFsdWUoIk1lc3NhZ2VPcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpLAorICAgICAgImV4dGVuZGFibGUiLCBtZXNzYWdlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwID8KKyAgICAgICAgICAgICAgICAgICAgICAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKKworICAvLyBFeHRlbnNpb24gcmFuZ2VzCisgIHByaW50ZXJfLT5QcmludCgiZXh0ZW5zaW9uX3Jhbmdlcz1bIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9kZXNjcmlwdG9yLmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UgPQorICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3JhbmdlKGkpOworICAgIHByaW50ZXJfLT5QcmludCgiKCRzdGFydCQsICRlbmQkKSwgIiwKKyAgICAgICAgICAgICAgICAgICAgInN0YXJ0IiwgU2ltcGxlSXRvYShyYW5nZS0+c3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAiZW5kIiwgU2ltcGxlSXRvYShyYW5nZS0+ZW5kKSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7CisKKyAgLy8gU2VyaWFsaXphdGlvbiBvZiBwcm90bworICBEZXNjcmlwdG9yUHJvdG8gZWRwOworICBQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKG1lc3NhZ2VfZGVzY3JpcHRvciwgZWRwKTsKKworICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIilcbiIpOworfQorCisvLyBQcmludHMgUHl0aG9uIERlc2NyaXB0b3Igb2JqZWN0cyBmb3IgYWxsIG5lc3RlZCB0eXBlcyBjb250YWluZWQgaW4KKy8vIG1lc3NhZ2VfZGVzY3JpcHRvci4KKy8vCisvLyBNdXR1YWxseSByZWN1cnNpdmUgd2l0aCBQcmludERlc2NyaXB0b3IoKS4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludE5lc3RlZERlc2NyaXB0b3JzKAorICAgIGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBQcmludERlc2NyaXB0b3IoKmNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7CisgIH0KK30KKworLy8gUHJpbnRzIGFsbCBtZXNzYWdlcyBpbiB8ZmlsZXwuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRNZXNzYWdlcygpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFByaW50TWVzc2FnZSgqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworICB9Cit9CisKKy8vIFByaW50cyBhIFB5dGhvbiBjbGFzcyBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UgZGVzY3JpcHRvci4gIFdlIGRlZmVyIHRvIHRoZQorLy8gbWV0YWNsYXNzIHRvIGRvIGFsbW9zdCBhbGwgb2YgdGhlIHdvcmsgb2YgYWN0dWFsbHkgY3JlYXRpbmcgYSB1c2VmdWwgY2xhc3MuCisvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGFuZCBpdHMgbWFueSBoZWxwZXIgZnVuY3Rpb25zIGFib3ZlIGlzIG1lcmVseQorLy8gdG8gb3V0cHV0IGEgUHl0aG9uIHZlcnNpb24gb2YgdGhlIGRlc2NyaXB0b3JzLCB3aGljaCB0aGUgbWV0YWNsYXNzIGluCisvLyByZWZsZWN0aW9uLnB5IHdpbGwgdXNlIHRvIGNvbnN0cnVjdCB0aGUgbWVhdCBvZiB0aGUgY2xhc3MgaXRzZWxmLgorLy8KKy8vIE11dHVhbGx5IHJlY3Vyc2l2ZSB3aXRoIFByaW50TmVzdGVkTWVzc2FnZXMoKS4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludE1lc3NhZ2UoCisgICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIHByaW50ZXJfLT5QcmludCgiY2xhc3MgJG5hbWUkKF9tZXNzYWdlLk1lc3NhZ2UpOlxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJfX21ldGFjbGFzc19fID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZVxuIik7CisgIFByaW50TmVzdGVkTWVzc2FnZXMobWVzc2FnZV9kZXNjcmlwdG9yKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtOworICBtWyJkZXNjcmlwdG9yX2tleSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IpOworICBwcmludGVyXy0+UHJpbnQobSwgIiRkZXNjcmlwdG9yX2tleSQgPSAkZGVzY3JpcHRvcl9uYW1lJFxuIik7CisKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICJcbiIKKyAgICAiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lKCkpOworCisgIHByaW50ZXJfLT5PdXRkZW50KCk7Cit9CisKKy8vIFByaW50cyBhbGwgbmVzdGVkIG1lc3NhZ2VzIHdpdGhpbiB8Y29udGFpbmluZ19kZXNjcmlwdG9yfC4KKy8vIE11dHVhbGx5IHJlY3Vyc2l2ZSB3aXRoIFByaW50TWVzc2FnZSgpLgordm9pZCBHZW5lcmF0b3I6OlByaW50TmVzdGVkTWVzc2FnZXMoCisgICAgY29uc3QgRGVzY3JpcHRvciYgY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmluZ19kZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgeworICAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKKyAgICBQcmludE1lc3NhZ2UoKmNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7CisgIH0KK30KKworLy8gUmVjdXJzaXZlbHkgZml4ZXMgZm9yZWlnbiBmaWVsZHMgaW4gYWxsIG5lc3RlZCB0eXBlcyBpbiB8ZGVzY3JpcHRvcnwsIHRoZW4KKy8vIHNldHMgdGhlIG1lc3NhZ2VfdHlwZSBhbmQgZW51bV90eXBlIG9mIGFsbCBtZXNzYWdlIGFuZCBlbnVtIGZpZWxkcyB0byBwb2ludAorLy8gdG8gdGhlaXIgcmVzcGVjdGl2ZSBkZXNjcmlwdG9ycy4KKy8vIEFyZ3M6CisvLyAgIGRlc2NyaXB0b3I6IGRlc2NyaXB0b3IgdG8gcHJpbnQgZmllbGRzIGZvci4KKy8vICAgY29udGFpbmluZ19kZXNjcmlwdG9yOiBpZiBkZXNjcmlwdG9yIGlzIGEgbmVzdGVkIHR5cGUsIHRoaXMgaXMgaXRzCisvLyAgICAgICBjb250YWluaW5nIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBhIHJvb3QvdG9wLWxldmVsIHR5cGUuCit2b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcigqZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSwgJmRlc2NyaXB0b3IpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGRfZGVzY3JpcHRvciA9ICpkZXNjcmlwdG9yLmZpZWxkKGkpOworICAgIEZpeEZvcmVpZ25GaWVsZHNJbkZpZWxkKCZkZXNjcmlwdG9yLCBmaWVsZF9kZXNjcmlwdG9yLCAiZmllbGRzX2J5X25hbWUiKTsKKyAgfQorCisgIEZpeENvbnRhaW5pbmdUeXBlSW5EZXNjcmlwdG9yKGRlc2NyaXB0b3IsIGNvbnRhaW5pbmdfZGVzY3JpcHRvcik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpkZXNjcmlwdG9yLmVudW1fdHlwZShpKTsKKyAgICBGaXhDb250YWluaW5nVHlwZUluRGVzY3JpcHRvcihlbnVtX2Rlc2NyaXB0b3IsICZkZXNjcmlwdG9yKTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRvcjo6QWRkTWVzc2FnZVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CisgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIG1bIm1lc3NhZ2VfbmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bIm1lc3NhZ2VfZGVzY3JpcHRvcl9uYW1lIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOworICBjb25zdCBjaGFyIGZpbGVfZGVzY3JpcHRvcl90ZW1wbGF0ZVtdID0KKyAgICAgICIkZGVzY3JpcHRvcl9uYW1lJC5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJyRtZXNzYWdlX25hbWUkJ10gPSAiCisgICAgICAiJG1lc3NhZ2VfZGVzY3JpcHRvcl9uYW1lJFxuIjsKKyAgcHJpbnRlcl8tPlByaW50KG0sIGZpbGVfZGVzY3JpcHRvcl90ZW1wbGF0ZSk7Cit9CisKKy8vIFNldHMgYW55IG5lY2Vzc2FyeSBtZXNzYWdlX3R5cGUgYW5kIGVudW1fdHlwZSBhdHRyaWJ1dGVzCisvLyBmb3IgdGhlIFB5dGhvbiB2ZXJzaW9uIG9mIHxmaWVsZHwuCisvLworLy8gY29udGFpbmluZ190eXBlIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBtb2R1bGUtbGV2ZWwgZmllbGQuCisvLworLy8gcHl0aG9uX2RpY3RfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUHl0aG9uIGRpY3Qgd2hlcmUgd2Ugc2hvdWxkCisvLyBsb29rIHRoZSBmaWVsZCB1cCBpbiB0aGUgY29udGFpbmluZyB0eXBlLiAgKGUuZy4sIGZpZWxkc19ieV9uYW1lCisvLyBvciBleHRlbnNpb25zX2J5X25hbWUpLiAgV2UgaWdub3JlIHB5dGhvbl9kaWN0X25hbWUgaWYgY29udGFpbmluZ190eXBlCisvLyBpcyBOVUxMLgordm9pZCBHZW5lcmF0b3I6OkZpeEZvcmVpZ25GaWVsZHNJbkZpZWxkKGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHl0aG9uX2RpY3RfbmFtZSkgY29uc3QgeworICBjb25zdCBzdHJpbmcgZmllbGRfcmVmZXJlbmNpbmdfZXhwcmVzc2lvbiA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKAorICAgICAgY29udGFpbmluZ190eXBlLCBmaWVsZCwgcHl0aG9uX2RpY3RfbmFtZSk7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsiZmllbGRfcmVmIl0gPSBmaWVsZF9yZWZlcmVuY2luZ19leHByZXNzaW9uOworICBjb25zdCBEZXNjcmlwdG9yKiBmb3JlaWduX21lc3NhZ2VfdHlwZSA9IGZpZWxkLm1lc3NhZ2VfdHlwZSgpOworICBpZiAoZm9yZWlnbl9tZXNzYWdlX3R5cGUpIHsKKyAgICBtWyJmb3JlaWduX3R5cGUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKmZvcmVpZ25fbWVzc2FnZV90eXBlKTsKKyAgICBwcmludGVyXy0+UHJpbnQobSwgIiRmaWVsZF9yZWYkLm1lc3NhZ2VfdHlwZSA9ICRmb3JlaWduX3R5cGUkXG4iKTsKKyAgfQorICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gZmllbGQuZW51bV90eXBlKCk7CisgIGlmIChlbnVtX3R5cGUpIHsKKyAgICBtWyJlbnVtX3R5cGUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKmVudW1fdHlwZSk7CisgICAgcHJpbnRlcl8tPlByaW50KG0sICIkZmllbGRfcmVmJC5lbnVtX3R5cGUgPSAkZW51bV90eXBlJFxuIik7CisgIH0KK30KKworLy8gUmV0dXJucyB0aGUgbW9kdWxlLWxldmVsIGV4cHJlc3Npb24gZm9yIHRoZSBnaXZlbiBGaWVsZERlc2NyaXB0b3IuCisvLyBPbmx5IHdvcmtzIGZvciBmaWVsZHMgaW4gdGhlIC5wcm90byBmaWxlIHRoaXMgR2VuZXJhdG9yIGlzIGdlbmVyYXRpbmcgZm9yLgorLy8KKy8vIGNvbnRhaW5pbmdfdHlwZSBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGEgbW9kdWxlLWxldmVsIGZpZWxkLgorLy8KKy8vIHB5dGhvbl9kaWN0X25hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIFB5dGhvbiBkaWN0IHdoZXJlIHdlIHNob3VsZAorLy8gbG9vayB0aGUgZmllbGQgdXAgaW4gdGhlIGNvbnRhaW5pbmcgdHlwZS4gIChlLmcuLCBmaWVsZHNfYnlfbmFtZQorLy8gb3IgZXh0ZW5zaW9uc19ieV9uYW1lKS4gIFdlIGlnbm9yZSBweXRob25fZGljdF9uYW1lIGlmIGNvbnRhaW5pbmdfdHlwZQorLy8gaXMgTlVMTC4KK3N0cmluZyBHZW5lcmF0b3I6OkZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAorICAgIGNvbnN0IHN0cmluZyYgcHl0aG9uX2RpY3RfbmFtZSkgY29uc3QgeworICAvLyBXZSBzaG91bGQgb25seSBldmVyIGJlIGxvb2tpbmcgdXAgZmllbGRzIGluIHRoZSBjdXJyZW50IGZpbGUuCisgIC8vIFRoZSBvbmx5IHRoaW5ncyB3ZSByZWZlciB0byBmcm9tIG90aGVyIGZpbGVzIGFyZSBtZXNzYWdlIGRlc2NyaXB0b3JzLgorICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQuZmlsZSgpLCBmaWxlXykgPDwgZmllbGQuZmlsZSgpLT5uYW1lKCkgPDwgIiB2cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWxlXy0+bmFtZSgpOworICBpZiAoIWNvbnRhaW5pbmdfdHlwZSkgeworICAgIHJldHVybiBmaWVsZC5uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAiJDAuJDFbJyQyJ10iLAorICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqY29udGFpbmluZ190eXBlKSwKKyAgICAgIHB5dGhvbl9kaWN0X25hbWUsIGZpZWxkLm5hbWUoKSk7Cit9CisKKy8vIFByaW50cyBjb250YWluaW5nX3R5cGUgZm9yIG5lc3RlZCBkZXNjcmlwdG9ycyBvciBlbnVtIGRlc2NyaXB0b3JzLgordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgordm9pZCBHZW5lcmF0b3I6OkZpeENvbnRhaW5pbmdUeXBlSW5EZXNjcmlwdG9yKAorICAgIGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3QgeworICBpZiAoY29udGFpbmluZ19kZXNjcmlwdG9yICE9IE5VTEwpIHsKKyAgICBjb25zdCBzdHJpbmcgbmVzdGVkX25hbWUgPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOworICAgIGNvbnN0IHN0cmluZyBwYXJlbnRfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoCisgICAgICAgICpjb250YWluaW5nX2Rlc2NyaXB0b3IpOworICAgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICAgIiRuZXN0ZWRfbmFtZSQuY29udGFpbmluZ190eXBlID0gJHBhcmVudF9uYW1lJDtcbiIsCisgICAgICAgICJuZXN0ZWRfbmFtZSIsIG5lc3RlZF9uYW1lLAorICAgICAgICAicGFyZW50X25hbWUiLCBwYXJlbnRfbmFtZSk7CisgIH0KK30KKworLy8gUHJpbnRzIHN0YXRlbWVudHMgc2V0dGluZyB0aGUgbWVzc2FnZV90eXBlIGFuZCBlbnVtX3R5cGUgZmllbGRzIGluIHRoZQorLy8gUHl0aG9uIGRlc2NyaXB0b3Igb2JqZWN0cyB3ZSd2ZSBhbHJlYWR5IG91dHB1dCBpbiB0aHMgZmlsZS4gIFdlIG11c3QKKy8vIGRvIHRoaXMgaW4gYSBzZXBhcmF0ZSBzdGVwIGR1ZSB0byBjaXJjdWxhciByZWZlcmVuY2VzIChvdGhlcndpc2UsIHdlJ2QKKy8vIGp1c3Qgc2V0IGV2ZXJ5dGhpbmcgaW4gdGhlIGluaXRpYWwgYXNzaWdubWVudCBzdGF0ZW1lbnRzKS4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9ycygpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3IoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSksIE5VTEwpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBBZGRNZXNzYWdlVG9GaWxlRGVzY3JpcHRvcigqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworfQorCisvLyBXZSBuZWVkIHRvIG5vdCBvbmx5IHNldCBhbnkgbmVjZXNzYXJ5IG1lc3NhZ2VfdHlwZSBmaWVsZHMsIGJ1dAorLy8gYWxzbyBuZWVkIHRvIGNhbGwgUmVnaXN0ZXJFeHRlbnNpb24oKSBvbiBlYWNoIG1lc3NhZ2Ugd2UncmUKKy8vIGV4dGVuZGluZy4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb25zKCkgY29uc3QgeworICAvLyBUb3AtbGV2ZWwgZXh0ZW5zaW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7ICsraSkgeworICAgIEZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbigqZmlsZV8tPmV4dGVuc2lvbihpKSk7CisgIH0KKyAgLy8gTmVzdGVkIGV4dGVuc2lvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5OZXN0ZWRFeHRlbnNpb25zKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb24oCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBleHRlbnNpb25fZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbl9maWVsZC5pc19leHRlbnNpb24oKSk7CisgIC8vIGV4dGVuc2lvbl9zY29wZSgpIHdpbGwgYmUgTlVMTCBmb3IgdG9wLWxldmVsIGV4dGVuc2lvbnMsIHdoaWNoIGlzCisgIC8vIGV4YWN0bHkgd2hhdCBGaXhGb3JlaWduRmllbGRzSW5GaWVsZCgpIHdhbnRzLgorICBGaXhGb3JlaWduRmllbGRzSW5GaWVsZChleHRlbnNpb25fZmllbGQuZXh0ZW5zaW9uX3Njb3BlKCksIGV4dGVuc2lvbl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvbnNfYnlfbmFtZSIpOworCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgLy8gQ29uZnVzaW5nbHksIGZvciBGaWVsZERlc2NyaXB0b3JzIHRoYXQgaGFwcGVuIHRvIGJlIGV4dGVuc2lvbnMsCisgIC8vIGNvbnRhaW5pbmdfdHlwZSgpIG1lYW5zICJleHRlbmRlZCB0eXBlLiIKKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGV4dGVuc2lvbl9zY29wZSgpIHdpbGwgZ2l2ZSB1cyB3aGF0IHdlIG5vcm1hbGx5CisgIC8vIG1lYW4gYnkgY29udGFpbmluZ190eXBlKCkuCisgIG1bImV4dGVuZGVkX21lc3NhZ2VfY2xhc3MiXSA9IE1vZHVsZUxldmVsTWVzc2FnZU5hbWUoCisgICAgICAqZXh0ZW5zaW9uX2ZpZWxkLmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgbVsiZmllbGQiXSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKGV4dGVuc2lvbl9maWVsZC5leHRlbnNpb25fc2NvcGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb25zX2J5X25hbWUiKTsKKyAgcHJpbnRlcl8tPlByaW50KG0sICIkZXh0ZW5kZWRfbWVzc2FnZV9jbGFzcyQuUmVnaXN0ZXJFeHRlbnNpb24oJGZpZWxkJClcbiIpOworfQorCit2b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luTmVzdGVkRXh0ZW5zaW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIFJlY3Vyc2l2ZWx5IGZpeCB1cCBleHRlbnNpb25zIGluIGFsbCBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5OZXN0ZWRFeHRlbnNpb25zKCpkZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorICAvLyBGaXggdXAgZXh0ZW5zaW9ucyBkaXJlY3RseSBjb250YWluZWQgd2l0aGluIHRoaXMgdHlwZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb24oKmRlc2NyaXB0b3IuZXh0ZW5zaW9uKGkpKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIGEgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBpbnN0YW50aWF0ZXMgYSBQeXRob24gRW51bVZhbHVlRGVzY3JpcHRvcgorLy8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gQysrIGRlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRFbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgLy8gVE9ETyhyb2JpbnNvbik6IEZpeCB1cCBFbnVtVmFsdWVEZXNjcmlwdG9yICJ0eXBlIiBmaWVsZHMuCisgIC8vIE1vcmUgY2lyY3VsYXIgcmVmZXJlbmNlcy4gIDo6c2lnaDo6CisgIHN0cmluZyBvcHRpb25zX3N0cmluZzsKKyAgZGVzY3JpcHRvci5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtOworICBtWyJuYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKKyAgbVsiaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci5pbmRleCgpKTsKKyAgbVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3IubnVtYmVyKCkpOworICBtWyJvcHRpb25zIl0gPSBPcHRpb25zVmFsdWUoIkVudW1WYWx1ZU9wdGlvbnMiLCBvcHRpb25zX3N0cmluZyk7CisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgIG0sCisgICAgICAiX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcihcbiIKKyAgICAgICIgIG5hbWU9JyRuYW1lJCcsIGluZGV4PSRpbmRleCQsIG51bWJlcj0kbnVtYmVyJCxcbiIKKyAgICAgICIgIG9wdGlvbnM9JG9wdGlvbnMkLFxuIgorICAgICAgIiAgdHlwZT1Ob25lKSIpOworfQorCisvLyBSZXR1cm5zIGEgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjYWxscyBkZXNjcmlwdG9yLl9QYXJzZU9wdGlvbnMgdXNpbmcKKy8vIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGNsYXNzIG5hbWUgYW5kIHNlcmlhbGl6ZWQgb3B0aW9ucyBwcm90b2J1ZiBzdHJpbmcuCitzdHJpbmcgR2VuZXJhdG9yOjpPcHRpb25zVmFsdWUoCisgICAgY29uc3Qgc3RyaW5nJiBjbGFzc19uYW1lLCBjb25zdCBzdHJpbmcmIHNlcmlhbGl6ZWRfb3B0aW9ucykgY29uc3QgeworICBpZiAoc2VyaWFsaXplZF9vcHRpb25zLmxlbmd0aCgpID09IDAgfHwgR2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpKSB7CisgICAgcmV0dXJuICJOb25lIjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgZnVsbF9jbGFzc19uYW1lID0gImRlc2NyaXB0b3JfcGIyLiIgKyBjbGFzc19uYW1lOworICAgIHJldHVybiAiX2Rlc2NyaXB0b3IuX1BhcnNlT3B0aW9ucygiICsgZnVsbF9jbGFzc19uYW1lICsgIigpLCAnIgorICAgICAgICArIENFc2NhcGUoc2VyaWFsaXplZF9vcHRpb25zKSsgIicpIjsKKyAgfQorfQorCisvLyBQcmludHMgYW4gZXhwcmVzc2lvbiBmb3IgYSBQeXRob24gRmllbGREZXNjcmlwdG9yIGZvciB8ZmllbGR8Lgordm9pZCBHZW5lcmF0b3I6OlByaW50RmllbGREZXNjcmlwdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsIGJvb2wgaXNfZXh0ZW5zaW9uKSBjb25zdCB7CisgIHN0cmluZyBvcHRpb25zX3N0cmluZzsKKyAgZmllbGQub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsibmFtZSJdID0gZmllbGQubmFtZSgpOworICBtWyJmdWxsX25hbWUiXSA9IGZpZWxkLmZ1bGxfbmFtZSgpOworICBtWyJpbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC5pbmRleCgpKTsKKyAgbVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGZpZWxkLm51bWJlcigpKTsKKyAgbVsidHlwZSJdID0gU2ltcGxlSXRvYShmaWVsZC50eXBlKCkpOworICBtWyJjcHBfdHlwZSJdID0gU2ltcGxlSXRvYShmaWVsZC5jcHBfdHlwZSgpKTsKKyAgbVsibGFiZWwiXSA9IFNpbXBsZUl0b2EoZmllbGQubGFiZWwoKSk7CisgIG1bImhhc19kZWZhdWx0X3ZhbHVlIl0gPSBmaWVsZC5oYXNfZGVmYXVsdF92YWx1ZSgpID8gIlRydWUiIDogIkZhbHNlIjsKKyAgbVsiZGVmYXVsdF92YWx1ZSJdID0gU3RyaW5naWZ5RGVmYXVsdFZhbHVlKGZpZWxkKTsKKyAgbVsiaXNfZXh0ZW5zaW9uIl0gPSBpc19leHRlbnNpb24gPyAiVHJ1ZSIgOiAiRmFsc2UiOworICBtWyJvcHRpb25zIl0gPSBPcHRpb25zVmFsdWUoIkZpZWxkT3B0aW9ucyIsIG9wdGlvbnNfc3RyaW5nKTsKKyAgLy8gV2UgYWx3YXlzIHNldCBtZXNzYWdlX3R5cGUgYW5kIGVudW1fdHlwZSB0byBOb25lIGF0IHRoaXMgcG9pbnQsIGFuZCB0aGVuCisgIC8vIHRoZXNlIGZpZWxkcyBpbiBjb3JyZWN0bHkgYWZ0ZXIgYWxsIHJlZmVyZW5jZWQgZGVzY3JpcHRvcnMgaGF2ZSBiZWVuCisgIC8vIGRlZmluZWQgYW5kL29yIGltcG9ydGVkIChzZWUgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcnMoKSkuCisgIGNvbnN0IGNoYXIgZmllbGRfZGVzY3JpcHRvcl9kZWNsW10gPQorICAgICJfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoXG4iCisgICAgIiAgbmFtZT0nJG5hbWUkJywgZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsIGluZGV4PSRpbmRleCQsXG4iCisgICAgIiAgbnVtYmVyPSRudW1iZXIkLCB0eXBlPSR0eXBlJCwgY3BwX3R5cGU9JGNwcF90eXBlJCwgbGFiZWw9JGxhYmVsJCxcbiIKKyAgICAiICBoYXNfZGVmYXVsdF92YWx1ZT0kaGFzX2RlZmF1bHRfdmFsdWUkLCBkZWZhdWx0X3ZhbHVlPSRkZWZhdWx0X3ZhbHVlJCxcbiIKKyAgICAiICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLFxuIgorICAgICIgIGlzX2V4dGVuc2lvbj0kaXNfZXh0ZW5zaW9uJCwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsXG4iCisgICAgIiAgb3B0aW9ucz0kb3B0aW9ucyQpIjsKKyAgcHJpbnRlcl8tPlByaW50KG0sIGZpZWxkX2Rlc2NyaXB0b3JfZGVjbCk7Cit9CisKKy8vIEhlbHBlciBmb3IgUHJpbnR7RmllbGRzLEV4dGVuc2lvbnN9SW5EZXNjcmlwdG9yKCkuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAorICAgIGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvciwKKyAgICBib29sIGlzX2V4dGVuc2lvbiwKKyAgICBjb25zdCBzdHJpbmcmIGxpc3RfdmFyaWFibGVfbmFtZSwKKyAgICBpbnQgKERlc2NyaXB0b3I6OipDb3VudEZuKSgpIGNvbnN0LAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogKERlc2NyaXB0b3I6OipHZXR0ZXJGbikoaW50KSBjb25zdCkgY29uc3QgeworICBwcmludGVyXy0+UHJpbnQoIiRsaXN0JD1bXG4iLCAibGlzdCIsIGxpc3RfdmFyaWFibGVfbmFtZSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAobWVzc2FnZV9kZXNjcmlwdG9yLipDb3VudEZuKSgpOyArK2kpIHsKKyAgICBQcmludEZpZWxkRGVzY3JpcHRvcigqKG1lc3NhZ2VfZGVzY3JpcHRvci4qR2V0dGVyRm4pKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbik7CisgICAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKKyAgfQorICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKK30KKworLy8gUHJpbnRzIGEgc3RhdGVtZW50IGFzc2lnbmluZyAiZmllbGRzIiB0byBhIGxpc3Qgb2YgUHl0aG9uIEZpZWxkRGVzY3JpcHRvcnMsCisvLyBvbmUgZm9yIGVhY2ggZmllbGQgcHJlc2VudCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWVsZHNJbkRlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIGNvbnN0IGJvb2wgaXNfZXh0ZW5zaW9uID0gZmFsc2U7CisgIFByaW50RmllbGREZXNjcmlwdG9yc0luRGVzY3JpcHRvcigKKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvciwgaXNfZXh0ZW5zaW9uLCAiZmllbGRzIiwKKyAgICAgICZEZXNjcmlwdG9yOjpmaWVsZF9jb3VudCwgJkRlc2NyaXB0b3I6OmZpZWxkKTsKK30KKworLy8gUHJpbnRzIGEgc3RhdGVtZW50IGFzc2lnbmluZyAiZXh0ZW5zaW9ucyIgdG8gYSBsaXN0IG9mIFB5dGhvbgorLy8gRmllbGREZXNjcmlwdG9ycywgb25lIGZvciBlYWNoIGV4dGVuc2lvbiBwcmVzZW50IGluIG1lc3NhZ2VfZGVzY3JpcHRvci4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEV4dGVuc2lvbnNJbkRlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIGNvbnN0IGJvb2wgaXNfZXh0ZW5zaW9uID0gdHJ1ZTsKKyAgUHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAorICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLCBpc19leHRlbnNpb24sICJleHRlbnNpb25zIiwKKyAgICAgICZEZXNjcmlwdG9yOjpleHRlbnNpb25fY291bnQsICZEZXNjcmlwdG9yOjpleHRlbnNpb24pOworfQorCitib29sIEdlbmVyYXRvcjo6R2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKK30KKworLy8gUmV0dXJucyB0aGUgdW5pcXVlIFB5dGhvbiBtb2R1bGUtbGV2ZWwgaWRlbnRpZmllciBnaXZlbiB0byBhIGRlc2NyaXB0b3IuCisvLyBUaGlzIG5hbWUgaXMgbW9kdWxlLXF1YWxpZmllZCBpZmYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGFuCisvLyBlbnRpdHkgdGhhdCBkb2Vzbid0IGNvbWUgZnJvbSB0aGUgY3VycmVudCBmaWxlLgordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgorc3RyaW5nIEdlbmVyYXRvcjo6TW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvcikgY29uc3QgeworICAvLyBGSVhNRShyb2JpbnNvbik6CisgIC8vIFdlIGN1cnJlbnRseSBkb24ndCB3b3JyeSBhYm91dCBjb2xsaXNpb25zIHdpdGggdW5kZXJzY29yZXMgaW4gdGhlIHR5cGUKKyAgLy8gbmFtZXMsIHNvIHRoZXNlIHdvdWxkIGNvbGxpZGUgaW4gbmFzdHkgd2F5cyBpZiBmb3VuZCBpbiB0aGUgc2FtZSBmaWxlOgorICAvLyAgIE91dGVyUHJvdG8uUHJvdG9BLlByb3RvQgorICAvLyAgIE91dGVyUHJvdG9fUHJvdG9BLlByb3RvQiAgIyBVbmRlcnNjb3JlIGluc3RlYWQgb2YgcGVyaW9kLgorICAvLyBBcyB3b3VsZCB0aGVzZToKKyAgLy8gICBPdXRlclByb3RvLlByb3RvQV8uUHJvdG9CCisgIC8vICAgT3V0ZXJQcm90by5Qcm90b0EuX1Byb3RvQiAgIyBMZWFkaW5nIHZzLiB0cmFpbGluZyB1bmRlcnNjb3JlLgorICAvLyAoQ29udHJpdmVkLCBidXQgY2VydGFpbmx5IHBvc3NpYmxlKS4KKyAgLy8KKyAgLy8gVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGd1YXJkIGFnYWluc3QgdGhpcyBlaXRoZXIuICBMZWF2aW5nCisgIC8vIGl0IGZvciBub3cuLi4KKyAgc3RyaW5nIG5hbWUgPSBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoZGVzY3JpcHRvciwgIl8iKTsKKyAgVXBwZXJTdHJpbmcoJm5hbWUpOworICAvLyBNb2R1bGUtcHJpdmF0ZSBmb3Igbm93LiAgRWFzeSB0byBtYWtlIHB1YmxpYyBsYXRlcjsgYWxtb3N0IGltcG9zc2libGUKKyAgLy8gdG8gbWFrZSBwcml2YXRlIGxhdGVyLgorICBuYW1lID0gIl8iICsgbmFtZTsKKyAgLy8gV2Ugbm93IGhhdmUgdGhlIG5hbWUgcmVsYXRpdmUgdG8gaXRzIG93biBtb2R1bGUuICBBbHNvIHF1YWxpZnkgd2l0aAorICAvLyB0aGUgbW9kdWxlIG5hbWUgaWZmIHRoaXMgZGVzY3JpcHRvciBpcyBmcm9tIGEgZGlmZmVyZW50IC5wcm90byBmaWxlLgorICBpZiAoZGVzY3JpcHRvci5maWxlKCkgIT0gZmlsZV8pIHsKKyAgICBuYW1lID0gTW9kdWxlTmFtZShkZXNjcmlwdG9yLmZpbGUoKS0+bmFtZSgpKSArICIuIiArIG5hbWU7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgY2xhc3MgaXRzZWxmLCBub3QgdGhlIGRlc2NyaXB0b3IuCisvLyBMaWtlIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKSwgbW9kdWxlLXF1YWxpZmllcyB0aGUgbmFtZSBpZmYKKy8vIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGRlc2NyaWJlcyBhbiBlbnRpdHkgdGhhdCBkb2Vzbid0IGNvbWUgZnJvbQorLy8gdGhlIGN1cnJlbnQgZmlsZS4KK3N0cmluZyBHZW5lcmF0b3I6Ok1vZHVsZUxldmVsTWVzc2FnZU5hbWUoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBzdHJpbmcgbmFtZSA9IE5hbWVQcmVmaXhlZFdpdGhOZXN0ZWRUeXBlcyhkZXNjcmlwdG9yLCAiLiIpOworICBpZiAoZGVzY3JpcHRvci5maWxlKCkgIT0gZmlsZV8pIHsKKyAgICBuYW1lID0gTW9kdWxlTmFtZShkZXNjcmlwdG9yLmZpbGUoKS0+bmFtZSgpKSArICIuIiArIG5hbWU7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgdGhlIHVuaXF1ZSBQeXRob24gbW9kdWxlLWxldmVsIGlkZW50aWZpZXIgZ2l2ZW4gdG8gYSBzZXJ2aWNlCisvLyBkZXNjcmlwdG9yLgorc3RyaW5nIEdlbmVyYXRvcjo6TW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgc3RyaW5nIG5hbWUgPSBkZXNjcmlwdG9yLm5hbWUoKTsKKyAgVXBwZXJTdHJpbmcoJm5hbWUpOworICBuYW1lID0gIl8iICsgbmFtZTsKKyAgaWYgKGRlc2NyaXB0b3IuZmlsZSgpICE9IGZpbGVfKSB7CisgICAgbmFtZSA9IE1vZHVsZU5hbWUoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOworICB9CisgIHJldHVybiBuYW1lOworfQorCisvLyBQcmludHMgc3RhbmRhcmQgY29uc3RydWN0b3IgYXJndW1lbnRzIHNlcmlhbGl6ZWRfc3RhcnQgYW5kIHNlcmlhbGl6ZWRfZW5kLgorLy8gQXJnczoKKy8vICAgZGVzY3JpcHRvcjogVGhlIGNwcCBkZXNjcmlwdG9yIHRvIGhhdmUgYSBzZXJpYWxpemVkIHJlZmVyZW5jZS4KKy8vICAgcHJvdG86IEEgcHJvdG8KKy8vIEV4YW1wbGUgcHJpbnRlciBvdXRwdXQ6CisvLyBzZXJpYWxpemVkX3N0YXJ0PTQxLAorLy8gc2VyaWFsaXplZF9lbmQ9NDMsCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JULCB0eXBlbmFtZSBEZXNjcmlwdG9yUHJvdG9UPgordm9pZCBHZW5lcmF0b3I6OlByaW50U2VyaWFsaXplZFBiSW50ZXJ2YWwoCisgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsIERlc2NyaXB0b3JQcm90b1QmIHByb3RvKSBjb25zdCB7CisgIGRlc2NyaXB0b3IuQ29weVRvKCZwcm90byk7CisgIHN0cmluZyBzcDsKKyAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNwKTsKKyAgaW50IG9mZnNldCA9IGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXy5maW5kKHNwKTsKKyAgR09PR0xFX0NIRUNLX0dFKG9mZnNldCwgMCk7CisKKyAgcHJpbnRlcl8tPlByaW50KCJzZXJpYWxpemVkX3N0YXJ0PSRzZXJpYWxpemVkX3N0YXJ0JCxcbiIKKyAgICAgICAgICAgICAgICAgICJzZXJpYWxpemVkX2VuZD0kc2VyaWFsaXplZF9lbmQkLFxuIiwKKyAgICAgICAgICAgICAgICAgICJzZXJpYWxpemVkX3N0YXJ0IiwgU2ltcGxlSXRvYShvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgInNlcmlhbGl6ZWRfZW5kIiwgU2ltcGxlSXRvYShvZmZzZXQgKyBzcC5zaXplKCkpKTsKK30KKworbmFtZXNwYWNlIHsKK3ZvaWQgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoY29uc3Qgc3RyaW5nJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBJIGhhdmUgYWRkZWQgYSBtZXRob2QgX1NldE9wdGlvbnMoKSB0byBEZXNjcmlwdG9yQmFzZQorICAvLyBpbiBwcm90bzIgcHl0aG9uIHJ1bnRpbWUgYnV0IGl0IGNvdWxkbid0IGJlIHVzZWQgaGVyZSBiZWNhdXNlIGFwcGVuZ2luZQorICAvLyB1c2VzIGEgc25hcHNob3QgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBpbiB3aGljaCB0aGUgbmV3IG1ldGhvZCBpcyBub3QKKyAgLy8geWV0IHByZXNlbnQuIEFmdGVyIGFwcGVuZ2luZSBoYXMgc3luY2VkIHRoZWlyIHJ1bnRpbWUgbGlicmFyeSwgdGhlIGNvZGUKKyAgLy8gYmVsb3cgc2hvdWxkIGJlIGNsZWFuZWQgdXAgdG8gdXNlIF9TZXRPcHRpb25zKCkuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiRkZXNjcmlwdG9yJC5oYXNfb3B0aW9ucyA9IFRydWVcbiIKKyAgICAgICIkZGVzY3JpcHRvciQuX29wdGlvbnMgPSAkb3B0aW9ucyRcbiIsCisgICAgICAiZGVzY3JpcHRvciIsIGRlc2NyaXB0b3IsICJvcHRpb25zIiwgb3B0aW9ucyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZpZWxkIG9mIGFsbCBkZXNjcmlwdG9ycy4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhBbGxEZXNjcmlwdG9yT3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gUHJpbnRzIGFuIGV4cHJlc3Npb24gdGhhdCBzZXRzIHRoZSBmaWxlIGRlc2NyaXB0b3IncyBvcHRpb25zLgorICBzdHJpbmcgZmlsZV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAorICAgICAgIkZpbGVPcHRpb25zIiwgZmlsZV8tPm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgaWYgKGZpbGVfb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShrRGVzY3JpcHRvcktleSwgZmlsZV9vcHRpb25zLCBwcmludGVyXyk7CisgIH0KKyAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGVudW1zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpmaWxlXy0+ZW51bV90eXBlKGkpOworICAgIEZpeE9wdGlvbnNGb3JFbnVtKGVudW1fZGVzY3JpcHRvcik7CisgIH0KKyAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGV4dGVuc2lvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmZpbGVfLT5leHRlbnNpb24oaSk7CisgICAgRml4T3B0aW9uc0ZvckZpZWxkKGZpZWxkKTsKKyAgfQorICAvLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGFsbCBtZXNzYWdlcywgbmVzdGVkIGVudW1zLAorICAvLyBuZXN0ZWQgZXh0ZW5zaW9ucyBhbmQgbWVzc2FnZSBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhPcHRpb25zRm9yTWVzc2FnZSgqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KK30KKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbiBlbnVtIGRlc2NyaXB0b3IgYW5kIGl0cworLy8gdmFsdWUgZGVzY3JpcHRvcnMuCit2b2lkIEdlbmVyYXRvcjo6Rml4T3B0aW9uc0ZvckVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvcikgY29uc3QgeworICBzdHJpbmcgZGVzY3JpcHRvcl9uYW1lID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShlbnVtX2Rlc2NyaXB0b3IpOworICBzdHJpbmcgZW51bV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAorICAgICAgIkVudW1PcHRpb25zIiwgZW51bV9kZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgaWYgKGVudW1fb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShkZXNjcmlwdG9yX25hbWUsIGVudW1fb3B0aW9ucywgcHJpbnRlcl8pOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV9kZXNjcmlwdG9yLnZhbHVlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIHZhbHVlX2Rlc2NyaXB0b3IgPSAqZW51bV9kZXNjcmlwdG9yLnZhbHVlKGkpOworICAgIHN0cmluZyB2YWx1ZV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAorICAgICAgICAiRW51bVZhbHVlT3B0aW9ucyIsIHZhbHVlX2Rlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICAgIGlmICh2YWx1ZV9vcHRpb25zICE9ICJOb25lIikgeworICAgICAgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoCisgICAgICAgICAgU3RyaW5nUHJpbnRmKCIlcy52YWx1ZXNfYnlfbmFtZVtcIiVzXCJdIiwgZGVzY3JpcHRvcl9uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2Rlc2NyaXB0b3IubmFtZSgpLmNfc3RyKCkpLAorICAgICAgICAgIHZhbHVlX29wdGlvbnMsIHByaW50ZXJfKTsKKyAgICB9CisgIH0KK30KKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBmaWVsZCBkZXNjcmlwdG9ycyAoaW5jbHVkaW5nCisvLyBleHRlbnNpb25zKS4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhPcHRpb25zRm9yRmllbGQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgY29uc3QgeworICBzdHJpbmcgZmllbGRfb3B0aW9ucyA9IE9wdGlvbnNWYWx1ZSgKKyAgICAgICJGaWVsZE9wdGlvbnMiLCBmaWVsZC5vcHRpb25zKCkuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIGlmIChmaWVsZF9vcHRpb25zICE9ICJOb25lIikgeworICAgIHN0cmluZyBmaWVsZF9uYW1lOworICAgIGlmIChmaWVsZC5pc19leHRlbnNpb24oKSkgeworICAgICAgaWYgKGZpZWxkLmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKKyAgICAgICAgLy8gVG9wIGxldmVsIGV4dGVuc2lvbnMuCisgICAgICAgIGZpZWxkX25hbWUgPSBmaWVsZC5uYW1lKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9uYW1lID0gRmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oCisgICAgICAgICAgICBmaWVsZC5leHRlbnNpb25fc2NvcGUoKSwgZmllbGQsICJleHRlbnNpb25zX2J5X25hbWUiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZmllbGRfbmFtZSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKAorICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZCwgImZpZWxkc19ieV9uYW1lIik7CisgICAgfQorICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGZpZWxkX25hbWUsIGZpZWxkX29wdGlvbnMsIHByaW50ZXJfKTsKKyAgfQorfQorCisvLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGEgbWVzc2FnZSBhbmQgYWxsIGl0cyBpbm5lcgorLy8gdHlwZXMgKG5lc3RlZCBtZXNzYWdlcywgbmVzdGVkIGVudW1zLCBleHRlbnNpb25zLCBmaWVsZHMpLgordm9pZCBHZW5lcmF0b3I6OkZpeE9wdGlvbnNGb3JNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgLy8gTmVzdGVkIG1lc3NhZ2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgRml4T3B0aW9uc0Zvck1lc3NhZ2UoKmRlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSkpOworICB9CisgIC8vIEVudW1zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEZpeE9wdGlvbnNGb3JFbnVtKCpkZXNjcmlwdG9yLmVudW1fdHlwZShpKSk7CisgIH0KKyAgLy8gRmllbGRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCA9ICpkZXNjcmlwdG9yLmZpZWxkKGkpOworICAgIEZpeE9wdGlvbnNGb3JGaWVsZChmaWVsZCk7CisgIH0KKyAgLy8gRXh0ZW5zaW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmRlc2NyaXB0b3IuZXh0ZW5zaW9uKGkpOworICAgIEZpeE9wdGlvbnNGb3JGaWVsZChmaWVsZCk7CisgIH0KKyAgLy8gTWVzc2FnZSBvcHRpb24gZm9yIHRoaXMgbWVzc2FnZS4KKyAgc3RyaW5nIG1lc3NhZ2Vfb3B0aW9ucyA9IE9wdGlvbnNWYWx1ZSgKKyAgICAgICJNZXNzYWdlT3B0aW9ucyIsIGRlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBpZiAobWVzc2FnZV9vcHRpb25zICE9ICJOb25lIikgeworICAgIHN0cmluZyBkZXNjcmlwdG9yX25hbWUgPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOworICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGRlc2NyaXB0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcl8pOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZjIyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDE2MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiByb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKQorLy8KKy8vIEdlbmVyYXRlcyBQeXRob24gY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUFlUSE9OX0dFTkVSQVRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9HRU5FUkFUT1JfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIEVudW1EZXNjcmlwdG9yOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworCituYW1lc3BhY2UgaW8geyBjbGFzcyBQcmludGVyOyB9CisKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworLy8gQ29kZUdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgZ2VuZXJhdGVkIFB5dGhvbiBwcm90b2NvbCBidWZmZXIgY2xhc3Nlcy4KKy8vIElmIHlvdSBjcmVhdGUgeW91ciBvd24gcHJvdG9jb2wgY29tcGlsZXIgYmluYXJ5IGFuZCB5b3Ugd2FudCBpdCB0byBzdXBwb3J0CisvLyBQeXRob24gb3V0cHV0LCB5b3UgY2FuIGRvIHNvIGJ5IHJlZ2lzdGVyaW5nIGFuIGluc3RhbmNlIG9mIHRoaXMKKy8vIENvZGVHZW5lcmF0b3Igd2l0aCB0aGUgQ29tbWFuZExpbmVJbnRlcmZhY2UgaW4geW91ciBtYWluKCkgZnVuY3Rpb24uCitjbGFzcyBMSUJQUk9UT0NfRVhQT1JUIEdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEdlbmVyYXRvcigpOworICB2aXJ0dWFsIH5HZW5lcmF0b3IoKTsKKworICAvLyBDb2RlR2VuZXJhdG9yIG1ldGhvZHMuCisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgUHJpbnRJbXBvcnRzKCkgY29uc3Q7CisgIHZvaWQgUHJpbnRGaWxlRGVzY3JpcHRvcigpIGNvbnN0OworICB2b2lkIFByaW50VG9wTGV2ZWxFbnVtcygpIGNvbnN0OworICB2b2lkIFByaW50QWxsTmVzdGVkRW51bXNJbkZpbGUoKSBjb25zdDsKKyAgdm9pZCBQcmludE5lc3RlZEVudW1zKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50RW51bShjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIFByaW50VG9wTGV2ZWxFeHRlbnNpb25zKCkgY29uc3Q7CisKKyAgdm9pZCBQcmludEZpZWxkRGVzY3JpcHRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsIGJvb2wgaXNfZXh0ZW5zaW9uKSBjb25zdDsKKyAgdm9pZCBQcmludEZpZWxkRGVzY3JpcHRvcnNJbkRlc2NyaXB0b3IoCisgICAgICBjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IsCisgICAgICBib29sIGlzX2V4dGVuc2lvbiwKKyAgICAgIGNvbnN0IHN0cmluZyYgbGlzdF92YXJpYWJsZV9uYW1lLAorICAgICAgaW50IChEZXNjcmlwdG9yOjoqQ291bnRGbikoKSBjb25zdCwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogKERlc2NyaXB0b3I6OipHZXR0ZXJGbikoaW50KSBjb25zdCkgY29uc3Q7CisgIHZvaWQgUHJpbnRGaWVsZHNJbkRlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludEV4dGVuc2lvbnNJbkRlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludE1lc3NhZ2VEZXNjcmlwdG9ycygpIGNvbnN0OworICB2b2lkIFByaW50RGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkRGVzY3JpcHRvcnMoY29uc3QgRGVzY3JpcHRvciYgY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIFByaW50TWVzc2FnZXMoKSBjb25zdDsKKyAgdm9pZCBQcmludE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludE5lc3RlZE1lc3NhZ2VzKGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3Q7CisKKyAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9ycygpIGNvbnN0OworICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3IoCisgICAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLAorICAgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5GaWVsZChjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHB5dGhvbl9kaWN0X25hbWUpIGNvbnN0OworICB2b2lkIEFkZE1lc3NhZ2VUb0ZpbGVEZXNjcmlwdG9yKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICBzdHJpbmcgRmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHl0aG9uX2RpY3RfbmFtZSkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVD4KKyAgdm9pZCBGaXhDb250YWluaW5nVHlwZUluRGVzY3JpcHRvcigKKyAgICAgIGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLAorICAgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbnMoKSBjb25zdDsKKyAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb24oCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGV4dGVuc2lvbl9maWVsZCkgY29uc3Q7CisgIHZvaWQgRml4Rm9yZWlnbkZpZWxkc0luTmVzdGVkRXh0ZW5zaW9ucyhjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIFByaW50U2VydmljZXMoKSBjb25zdDsKKyAgdm9pZCBQcmludFNlcnZpY2VEZXNjcmlwdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludFNlcnZpY2VDbGFzcyhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgUHJpbnRTZXJ2aWNlU3R1Yihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisKKyAgdm9pZCBQcmludEVudW1WYWx1ZURlc2NyaXB0b3IoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHN0cmluZyBPcHRpb25zVmFsdWUoY29uc3Qgc3RyaW5nJiBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc2VyaWFsaXplZF9vcHRpb25zKSBjb25zdDsKKyAgYm9vbCBHZW5lcmF0aW5nRGVzY3JpcHRvclByb3RvKCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgorICBzdHJpbmcgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHN0cmluZyBNb2R1bGVMZXZlbE1lc3NhZ2VOYW1lKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICBzdHJpbmcgTW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoCisgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JULCB0eXBlbmFtZSBEZXNjcmlwdG9yUHJvdG9UPgorICB2b2lkIFByaW50U2VyaWFsaXplZFBiSW50ZXJ2YWwoCisgICAgICBjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvciwgRGVzY3JpcHRvclByb3RvVCYgcHJvdG8pIGNvbnN0OworCisgIHZvaWQgRml4QWxsRGVzY3JpcHRvck9wdGlvbnMoKSBjb25zdDsKKyAgdm9pZCBGaXhPcHRpb25zRm9yRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgY29uc3Q7CisgIHZvaWQgRml4T3B0aW9uc0ZvckVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIEZpeE9wdGlvbnNGb3JNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworCisgIC8vIFZlcnkgY29hcnNlLWdyYWluZWQgbG9jayB0byBlbnN1cmUgdGhhdCBHZW5lcmF0ZSgpIGlzIHJlZW50cmFudC4KKyAgLy8gR3VhcmRzIGZpbGVfLCBwcmludGVyXyBhbmQgZmlsZV9kZXNjcmlwdG9yX3NlcmlhbGl6ZWRfLgorICBtdXRhYmxlIE11dGV4IG11dGV4XzsKKyAgbXV0YWJsZSBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87ICAvLyBTZXQgaW4gR2VuZXJhdGUoKS4gIFVuZGVyIG11dGV4Xy4KKyAgbXV0YWJsZSBzdHJpbmcgZmlsZV9kZXNjcmlwdG9yX3NlcmlhbGl6ZWRfOworICBtdXRhYmxlIGlvOjpQcmludGVyKiBwcmludGVyXzsgIC8vIFNldCBpbiBHZW5lcmF0ZSgpLiAgVW5kZXIgbXV0ZXhfLgorCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUFlUSE9OX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTYxOWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTE2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gVE9ETyhrZW50b24pOiAgU2hhcmUgY29kZSB3aXRoIHRoZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3QgaW4gb3RoZXIgbGFuZ3VhZ2VzPworLy8gICBJdCBzZWVtZWQgbGlrZSBwYXJhbWV0ZXJpemluZyBpdCB3b3VsZCBhZGQgbW9yZSBjb21wbGV4aXR5IHRoYW4gaXQgaXMKKy8vICAgd29ydGguCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBweXRob24geworbmFtZXNwYWNlIHsKKworY2xhc3MgVGVzdEdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RHZW5lcmF0b3IoKSB7fQorICB+VGVzdEdlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgeworICAgIFRyeUluc2VydCgidGVzdF9wYjIucHkiLCAiaW1wb3J0cyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdF9wYjIucHkiLCAibW9kdWxlX3Njb3BlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJjbGFzc19zY29wZTpmb28uQmFyIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJjbGFzc19zY29wZTpmb28uQmFyLkJheiIsIGNvbnRleHQpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBUcnlJbnNlcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCisgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKKyAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KSk7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgcHJpbnRlci5QcmludCgiLy8gaW5zZXJ0ZWQgJG5hbWUkXG4iLCAibmFtZSIsIGluc2VydGlvbl9wb2ludCk7CisgIH0KK307CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IGFsbCB0aGUgZXhwZWN0ZWQgaW5zZXJ0aW9uIHBvaW50cyBleGlzdC4gIEl0IGRvZXMKKy8vIG5vdCB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHktcGxhY2VkOyB0aGF0IHdvdWxkIHJlcXVpcmUgYWN0dWFsbHkKKy8vIGNvbXBpbGluZyB0aGUgb3V0cHV0IHdoaWNoIGlzIGEgYml0IG1vcmUgdGhhbiBJIGNhcmUgdG8gZG8gZm9yIHRoaXMgdGVzdC4KK1RFU1QoUHl0aG9uUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgeworICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKKyAgICAgICJ9XG4iLAorICAgICAgVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIpOworCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7CisgIGNsaS5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKKworICBweXRob246OkdlbmVyYXRvciBweXRob25fZ2VuZXJhdG9yOworICBUZXN0R2VuZXJhdG9yIHRlc3RfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tcHl0aG9uX291dCIsICZweXRob25fZ2VuZXJhdG9yLCAiIik7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS10ZXN0X291dCIsICZ0ZXN0X2dlbmVyYXRvciwgIiIpOworCisgIHN0cmluZyBwcm90b19wYXRoID0gIi1JIiArIFRlc3RUZW1wRGlyKCk7CisgIHN0cmluZyBweXRob25fb3V0ID0gIi0tcHl0aG9uX291dD0iICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RyaW5nIHRlc3Rfb3V0ID0gIi0tdGVzdF9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7CisKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJwcm90b2MiLAorICAgIHByb3RvX3BhdGguY19zdHIoKSwKKyAgICBweXRob25fb3V0LmNfc3RyKCksCisgICAgdGVzdF9vdXQuY19zdHIoKSwKKyAgICAidGVzdC5wcm90byIKKyAgfTsKKworICBFWFBFQ1RfRVEoMCwgY2xpLlJ1big1LCBhcmd2KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkYTEyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmNjCkBAIC0wLDAgKzEsNDYzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKyNpZmRlZiBfV0lOMzIKKworc3RhdGljIHZvaWQgQ2xvc2VIYW5kbGVPckRpZShIQU5ETEUgaGFuZGxlKSB7CisgIGlmICghQ2xvc2VIYW5kbGUoaGFuZGxlKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDbG9zZUhhbmRsZTogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IFN1YnByb2Nlc3M6OldpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorfQorCitTdWJwcm9jZXNzOjpTdWJwcm9jZXNzKCkKKyAgICA6IHByb2Nlc3Nfc3RhcnRfZXJyb3JfKEVSUk9SX1NVQ0NFU1MpLAorICAgICAgY2hpbGRfaGFuZGxlXyhOVUxMKSwgY2hpbGRfc3RkaW5fKE5VTEwpLCBjaGlsZF9zdGRvdXRfKE5VTEwpIHt9CisKK1N1YnByb2Nlc3M6On5TdWJwcm9jZXNzKCkgeworICBpZiAoY2hpbGRfc3RkaW5fICE9IE5VTEwpIHsKKyAgICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX3N0ZGluXyk7CisgIH0KKyAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gTlVMTCkgeworICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3Rkb3V0Xyk7CisgIH0KK30KKwordm9pZCBTdWJwcm9jZXNzOjpTdGFydChjb25zdCBzdHJpbmcmIHByb2dyYW0sIFNlYXJjaE1vZGUgc2VhcmNoX21vZGUpIHsKKyAgLy8gQ3JlYXRlIHRoZSBwaXBlcy4KKyAgSEFORExFIHN0ZGluX3BpcGVfcmVhZDsKKyAgSEFORExFIHN0ZGluX3BpcGVfd3JpdGU7CisgIEhBTkRMRSBzdGRvdXRfcGlwZV9yZWFkOworICBIQU5ETEUgc3Rkb3V0X3BpcGVfd3JpdGU7CisKKyAgaWYgKCFDcmVhdGVQaXBlKCZzdGRpbl9waXBlX3JlYWQsICZzdGRpbl9waXBlX3dyaXRlLCBOVUxMLCAwKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDcmVhdGVQaXBlOiAiIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorICBpZiAoIUNyZWF0ZVBpcGUoJnN0ZG91dF9waXBlX3JlYWQsICZzdGRvdXRfcGlwZV93cml0ZSwgTlVMTCwgMCkpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ3JlYXRlUGlwZTogIiA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgIH0KKworICAvLyBNYWtlIGNoaWxkIHNpZGUgb2YgdGhlIHBpcGVzIGluaGVyaXRhYmxlLgorICBpZiAoIVNldEhhbmRsZUluZm9ybWF0aW9uKHN0ZGluX3BpcGVfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkxBR19JTkhFUklULCBIQU5ETEVfRkxBR19JTkhFUklUKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJTZXRIYW5kbGVJbmZvcm1hdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorICBpZiAoIVNldEhhbmRsZUluZm9ybWF0aW9uKHN0ZG91dF9waXBlX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GTEFHX0lOSEVSSVQsIEhBTkRMRV9GTEFHX0lOSEVSSVQpKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNldEhhbmRsZUluZm9ybWF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9CisKKyAgLy8gU2V0dXAgU1RBUlRVUElORk8gdG8gcmVkaXJlY3QgaGFuZGxlcy4KKyAgU1RBUlRVUElORk9BIHN0YXJ0dXBfaW5mbzsKKyAgWmVyb01lbW9yeSgmc3RhcnR1cF9pbmZvLCBzaXplb2Yoc3RhcnR1cF9pbmZvKSk7CisgIHN0YXJ0dXBfaW5mby5jYiA9IHNpemVvZihzdGFydHVwX2luZm8pOworICBzdGFydHVwX2luZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOworICBzdGFydHVwX2luZm8uaFN0ZElucHV0ID0gc3RkaW5fcGlwZV9yZWFkOworICBzdGFydHVwX2luZm8uaFN0ZE91dHB1dCA9IHN0ZG91dF9waXBlX3dyaXRlOworICBzdGFydHVwX2luZm8uaFN0ZEVycm9yID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOworCisgIGlmIChzdGFydHVwX2luZm8uaFN0ZEVycm9yID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkdldFN0ZEhhbmRsZTogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorCisgIC8vIENyZWF0ZVByb2Nlc3MoKSBtdXRhdGVzIGl0cyBzZWNvbmQgcGFyYW1ldGVyLiAgV1RGPworICBjaGFyKiBuYW1lX2NvcHkgPSBzdHJkdXAocHJvZ3JhbS5jX3N0cigpKTsKKworICAvLyBDcmVhdGUgdGhlIHByb2Nlc3MuCisgIFBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc19pbmZvOworCisgIGlmIChDcmVhdGVQcm9jZXNzQSgoc2VhcmNoX21vZGUgPT0gU0VBUkNIX1BBVEgpID8gTlVMTCA6IHByb2dyYW0uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZWFyY2hfbW9kZSA9PSBTRUFSQ0hfUEFUSCkgPyBuYW1lX2NvcHkgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHByb2Nlc3Mgc2VjdXJpdHkgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHRocmVhZCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICBUUlVFLCAgLy8gaW5oZXJpdCBoYW5kbGVzPworICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8vIG9ic2N1cmUgY3JlYXRpb24gZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBlbnZpcm9ubWVudCAoaW5oZXJpdCBmcm9tIHBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBjdXJyZW50IGRpcmVjdG9yeSAoaW5oZXJpdCBmcm9tIHBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgICZzdGFydHVwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc19pbmZvKSkgeworICAgIGNoaWxkX2hhbmRsZV8gPSBwcm9jZXNzX2luZm8uaFByb2Nlc3M7CisgICAgQ2xvc2VIYW5kbGVPckRpZShwcm9jZXNzX2luZm8uaFRocmVhZCk7CisgICAgY2hpbGRfc3RkaW5fID0gc3RkaW5fcGlwZV93cml0ZTsKKyAgICBjaGlsZF9zdGRvdXRfID0gc3Rkb3V0X3BpcGVfcmVhZDsKKyAgfSBlbHNlIHsKKyAgICBwcm9jZXNzX3N0YXJ0X2Vycm9yXyA9IEdldExhc3RFcnJvcigpOworICAgIENsb3NlSGFuZGxlT3JEaWUoc3RkaW5fcGlwZV93cml0ZSk7CisgICAgQ2xvc2VIYW5kbGVPckRpZShzdGRvdXRfcGlwZV9yZWFkKTsKKyAgfQorCisgIENsb3NlSGFuZGxlT3JEaWUoc3RkaW5fcGlwZV9yZWFkKTsKKyAgQ2xvc2VIYW5kbGVPckRpZShzdGRvdXRfcGlwZV93cml0ZSk7CisgIGZyZWUobmFtZV9jb3B5KTsKK30KKworYm9vbCBTdWJwcm9jZXNzOjpDb21tdW5pY2F0ZShjb25zdCBNZXNzYWdlJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSB7CisgIGlmIChwcm9jZXNzX3N0YXJ0X2Vycm9yXyAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgKmVycm9yID0gV2luMzJFcnJvck1lc3NhZ2UocHJvY2Vzc19zdGFydF9lcnJvcl8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEdPT0dMRV9DSEVDSyhjaGlsZF9oYW5kbGVfICE9IE5VTEwpIDw8ICJNdXN0IGNhbGwgU3RhcnQoKSBmaXJzdC4iOworCisgIHN0cmluZyBpbnB1dF9kYXRhID0gaW5wdXQuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgc3RyaW5nIG91dHB1dF9kYXRhOworCisgIGludCBpbnB1dF9wb3MgPSAwOworCisgIHdoaWxlIChjaGlsZF9zdGRvdXRfICE9IE5VTEwpIHsKKyAgICBIQU5ETEUgaGFuZGxlc1syXTsKKyAgICBpbnQgaGFuZGxlX2NvdW50ID0gMDsKKworICAgIGlmIChjaGlsZF9zdGRpbl8gIT0gTlVMTCkgeworICAgICAgaGFuZGxlc1toYW5kbGVfY291bnQrK10gPSBjaGlsZF9zdGRpbl87CisgICAgfQorICAgIGlmIChjaGlsZF9zdGRvdXRfICE9IE5VTEwpIHsKKyAgICAgIGhhbmRsZXNbaGFuZGxlX2NvdW50KytdID0gY2hpbGRfc3Rkb3V0XzsKKyAgICB9CisKKyAgICBEV09SRCB3YWl0X3Jlc3VsdCA9CisgICAgICAgIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoaGFuZGxlX2NvdW50LCBoYW5kbGVzLCBGQUxTRSwgSU5GSU5JVEUpOworCisgICAgSEFORExFIHNpZ25hbGVkX2hhbmRsZTsKKyAgICBpZiAod2FpdF9yZXN1bHQgPj0gV0FJVF9PQkpFQ1RfMCAmJgorICAgICAgICB3YWl0X3Jlc3VsdCA8IFdBSVRfT0JKRUNUXzAgKyBoYW5kbGVfY291bnQpIHsKKyAgICAgIHNpZ25hbGVkX2hhbmRsZSA9IGhhbmRsZXNbd2FpdF9yZXN1bHQgLSBXQUlUX09CSkVDVF8wXTsKKyAgICB9IGVsc2UgaWYgKHdhaXRfcmVzdWx0ID09IFdBSVRfRkFJTEVEKSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiV2FpdEZvck11bHRpcGxlT2JqZWN0czogIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICAgIH0gZWxzZSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiV2FpdEZvck11bHRpcGxlT2JqZWN0czogVW5leHBlY3RlZCByZXR1cm4gY29kZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgd2FpdF9yZXN1bHQ7CisgICAgfQorCisgICAgaWYgKHNpZ25hbGVkX2hhbmRsZSA9PSBjaGlsZF9zdGRpbl8pIHsKKyAgICAgIERXT1JEIG47CisgICAgICBpZiAoIVdyaXRlRmlsZShjaGlsZF9zdGRpbl8sCisgICAgICAgICAgICAgICAgICAgICBpbnB1dF9kYXRhLmRhdGEoKSArIGlucHV0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGEuc2l6ZSgpIC0gaW5wdXRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgJm4sIE5VTEwpKSB7CisgICAgICAgIC8vIENoaWxkIGNsb3NlZCBwaXBlLiAgUHJlc3VtYWJseSBpdCB3aWxsIHJlcG9ydCBhbiBlcnJvciBsYXRlci4KKyAgICAgICAgLy8gUHJldGVuZCB3ZSdyZSBkb25lIGZvciBub3cuCisgICAgICAgIGlucHV0X3BvcyA9IGlucHV0X2RhdGEuc2l6ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRfcG9zICs9IG47CisgICAgICB9CisKKyAgICAgIGlmIChpbnB1dF9wb3MgPT0gaW5wdXRfZGF0YS5zaXplKCkpIHsKKyAgICAgICAgLy8gV2UncmUgZG9uZSB3cml0aW5nLiAgQ2xvc2UuCisgICAgICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3RkaW5fKTsKKyAgICAgICAgY2hpbGRfc3RkaW5fID0gTlVMTDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNpZ25hbGVkX2hhbmRsZSA9PSBjaGlsZF9zdGRvdXRfKSB7CisgICAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICAgIERXT1JEIG47CisKKyAgICAgIGlmICghUmVhZEZpbGUoY2hpbGRfc3Rkb3V0XywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJm4sIE5VTEwpKSB7CisgICAgICAgIC8vIFdlJ3JlIGRvbmUgcmVhZGluZy4gIENsb3NlLgorICAgICAgICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX3N0ZG91dF8pOworICAgICAgICBjaGlsZF9zdGRvdXRfID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dF9kYXRhLmFwcGVuZChidWZmZXIsIG4pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChjaGlsZF9zdGRpbl8gIT0gTlVMTCkgeworICAgIC8vIENoaWxkIGRpZCBub3QgZmluaXNoIHJlYWRpbmcgaW5wdXQgYmVmb3JlIGl0IGNsb3NlZCB0aGUgb3V0cHV0LgorICAgIC8vIFByZXN1bWFibHkgaXQgZXhpdGVkIHdpdGggYW4gZXJyb3IuCisgICAgQ2xvc2VIYW5kbGVPckRpZShjaGlsZF9zdGRpbl8pOworICAgIGNoaWxkX3N0ZGluXyA9IE5VTEw7CisgIH0KKworICBEV09SRCB3YWl0X3Jlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoY2hpbGRfaGFuZGxlXywgSU5GSU5JVEUpOworCisgIGlmICh3YWl0X3Jlc3VsdCA9PSBXQUlUX0ZBSUxFRCkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJXYWl0Rm9yU2luZ2xlT2JqZWN0OiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9IGVsc2UgaWYgKHdhaXRfcmVzdWx0ICE9IFdBSVRfT0JKRUNUXzApIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiV2FpdEZvclNpbmdsZU9iamVjdDogVW5leHBlY3RlZCByZXR1cm4gY29kZTogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHdhaXRfcmVzdWx0OworICB9CisKKyAgRFdPUkQgZXhpdF9jb2RlOworICBpZiAoIUdldEV4aXRDb2RlUHJvY2VzcyhjaGlsZF9oYW5kbGVfLCAmZXhpdF9jb2RlKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJHZXRFeGl0Q29kZVByb2Nlc3M6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgIH0KKworICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX2hhbmRsZV8pOworICBjaGlsZF9oYW5kbGVfID0gTlVMTDsKKworICBpZiAoZXhpdF9jb2RlICE9IDApIHsKKyAgICAqZXJyb3IgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAiUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICQwLiIsIGV4aXRfY29kZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFvdXRwdXQtPlBhcnNlRnJvbVN0cmluZyhvdXRwdXRfZGF0YSkpIHsKKyAgICAqZXJyb3IgPSAiUGx1Z2luIG91dHB1dCBpcyB1bnBhcnNlYWJsZTogIiArIENFc2NhcGUob3V0cHV0X2RhdGEpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdHJpbmcgU3VicHJvY2Vzczo6V2luMzJFcnJvck1lc3NhZ2UoRFdPUkQgZXJyb3JfY29kZSkgeworICBjaGFyKiBtZXNzYWdlOworCisgIC8vIFdURj8KKyAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKyAgICAgICAgICAgICAgICBOVUxMLCBlcnJvcl9jb2RlLCAwLAorICAgICAgICAgICAgICAgIChMUFRTVFIpJm1lc3NhZ2UsICAvLyBOT1QgQSBCVUchCisgICAgICAgICAgICAgICAgMCwgTlVMTCk7CisKKyAgc3RyaW5nIHJlc3VsdCA9IG1lc3NhZ2U7CisgIExvY2FsRnJlZShtZXNzYWdlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZWxzZSAgLy8gX1dJTjMyCisKK1N1YnByb2Nlc3M6OlN1YnByb2Nlc3MoKQorICAgIDogY2hpbGRfcGlkXygtMSksIGNoaWxkX3N0ZGluXygtMSksIGNoaWxkX3N0ZG91dF8oLTEpIHt9CisKK1N1YnByb2Nlc3M6On5TdWJwcm9jZXNzKCkgeworICBpZiAoY2hpbGRfc3RkaW5fICE9IC0xKSB7CisgICAgY2xvc2UoY2hpbGRfc3RkaW5fKTsKKyAgfQorICBpZiAoY2hpbGRfc3Rkb3V0XyAhPSAtMSkgeworICAgIGNsb3NlKGNoaWxkX3N0ZG91dF8pOworICB9Cit9CisKK3ZvaWQgU3VicHJvY2Vzczo6U3RhcnQoY29uc3Qgc3RyaW5nJiBwcm9ncmFtLCBTZWFyY2hNb2RlIHNlYXJjaF9tb2RlKSB7CisgIC8vIE5vdGUgdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIgdGhyZWFkcywgdGh1cyB3ZSBkb24ndCBoYXZlIHRvCisgIC8vIGRvIGNyYXp5IHN0dWZmIGxpa2UgdXNpbmcgc29ja2V0IHBhaXJzIG9yIGF2b2lkaW5nIGxpYmMgbG9ja3MuCisKKyAgLy8gWzBdIGlzIHJlYWQgZW5kLCBbMV0gaXMgd3JpdGUgZW5kLgorICBpbnQgc3RkaW5fcGlwZVsyXTsKKyAgaW50IHN0ZG91dF9waXBlWzJdOworCisgIEdPT0dMRV9DSEVDSyhwaXBlKHN0ZGluX3BpcGUpICE9IC0xKTsKKyAgR09PR0xFX0NIRUNLKHBpcGUoc3Rkb3V0X3BpcGUpICE9IC0xKTsKKworICBjaGFyKiBhcmd2WzJdID0geyBzdHJkdXAocHJvZ3JhbS5jX3N0cigpKSwgTlVMTCB9OworCisgIGNoaWxkX3BpZF8gPSBmb3JrKCk7CisgIGlmIChjaGlsZF9waWRfID09IC0xKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgImZvcms6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICB9IGVsc2UgaWYgKGNoaWxkX3BpZF8gPT0gMCkgeworICAgIC8vIFdlIGFyZSB0aGUgY2hpbGQuCisgICAgZHVwMihzdGRpbl9waXBlWzBdLCBTVERJTl9GSUxFTk8pOworICAgIGR1cDIoc3Rkb3V0X3BpcGVbMV0sIFNURE9VVF9GSUxFTk8pOworCisgICAgY2xvc2Uoc3RkaW5fcGlwZVswXSk7CisgICAgY2xvc2Uoc3RkaW5fcGlwZVsxXSk7CisgICAgY2xvc2Uoc3Rkb3V0X3BpcGVbMF0pOworICAgIGNsb3NlKHN0ZG91dF9waXBlWzFdKTsKKworICAgIHN3aXRjaCAoc2VhcmNoX21vZGUpIHsKKyAgICAgIGNhc2UgU0VBUkNIX1BBVEg6CisgICAgICAgIGV4ZWN2cChhcmd2WzBdLCBhcmd2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVYQUNUX05BTUU6CisgICAgICAgIGV4ZWN2KGFyZ3ZbMF0sIGFyZ3YpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBkaXJlY3RseSB0byBTVERFUlJfRklMRU5PIHRvIGF2b2lkIHN0ZGlvIGNvZGUgcGF0aHMgdGhhdCBtYXkgZG8KKyAgICAvLyBzdHVmZiB0aGF0IGlzIHVuc2FmZSBoZXJlLgorICAgIGludCBpZ25vcmVkOworICAgIGlnbm9yZWQgPSB3cml0ZShTVERFUlJfRklMRU5PLCBhcmd2WzBdLCBzdHJsZW4oYXJndlswXSkpOworICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UgPSAiOiBwcm9ncmFtIG5vdCBmb3VuZCBvciBpcyBub3QgZXhlY3V0YWJsZVxuIjsKKyAgICBpZ25vcmVkID0gd3JpdGUoU1RERVJSX0ZJTEVOTywgbWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpKTsKKyAgICAodm9pZCkgaWdub3JlZDsKKworICAgIC8vIE11c3QgdXNlIF9leGl0KCkgcmF0aGVyIHRoYW4gZXhpdCgpIHRvIGF2b2lkIGZsdXNoaW5nIG91dHB1dCBidWZmZXJzCisgICAgLy8gdGhhdCB3aWxsIGFsc28gYmUgZmx1c2hlZCBieSB0aGUgcGFyZW50LgorICAgIF9leGl0KDEpOworICB9IGVsc2UgeworICAgIGZyZWUoYXJndlswXSk7CisKKyAgICBjbG9zZShzdGRpbl9waXBlWzBdKTsKKyAgICBjbG9zZShzdGRvdXRfcGlwZVsxXSk7CisKKyAgICBjaGlsZF9zdGRpbl8gPSBzdGRpbl9waXBlWzFdOworICAgIGNoaWxkX3N0ZG91dF8gPSBzdGRvdXRfcGlwZVswXTsKKyAgfQorfQorCitib29sIFN1YnByb2Nlc3M6OkNvbW11bmljYXRlKGNvbnN0IE1lc3NhZ2UmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIHsKKworICBHT09HTEVfQ0hFQ0tfTkUoY2hpbGRfc3RkaW5fLCAtMSkgPDwgIk11c3QgY2FsbCBTdGFydCgpIGZpcnN0LiI7CisKKyAgLy8gVGhlICJzaWdoYW5kbGVyX3QiIHR5cGVkZWYgaXMgR05VLXNwZWNpZmljLCBzbyBkZWZpbmUgb3VyIG93bi4KKyAgdHlwZWRlZiB2b2lkIFNpZ25hbEhhbmRsZXIoaW50KTsKKworICAvLyBNYWtlIHN1cmUgU0lHUElQRSBpcyBkaXNhYmxlZCBzbyB0aGF0IGlmIHRoZSBjaGlsZCBkaWVzIGl0IGRvZXNuJ3Qga2lsbCB1cy4KKyAgU2lnbmFsSGFuZGxlciogb2xkX3BpcGVfaGFuZGxlciA9IHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworICBzdHJpbmcgaW5wdXRfZGF0YSA9IGlucHV0LlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgIHN0cmluZyBvdXRwdXRfZGF0YTsKKworICBpbnQgaW5wdXRfcG9zID0gMDsKKyAgaW50IG1heF9mZCA9IG1heChjaGlsZF9zdGRpbl8sIGNoaWxkX3N0ZG91dF8pOworCisgIHdoaWxlIChjaGlsZF9zdGRvdXRfICE9IC0xKSB7CisgICAgZmRfc2V0IHJlYWRfZmRzOworICAgIGZkX3NldCB3cml0ZV9mZHM7CisgICAgRkRfWkVSTygmcmVhZF9mZHMpOworICAgIEZEX1pFUk8oJndyaXRlX2Zkcyk7CisgICAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gLTEpIHsKKyAgICAgIEZEX1NFVChjaGlsZF9zdGRvdXRfLCAmcmVhZF9mZHMpOworICAgIH0KKyAgICBpZiAoY2hpbGRfc3RkaW5fICE9IC0xKSB7CisgICAgICBGRF9TRVQoY2hpbGRfc3RkaW5fLCAmd3JpdGVfZmRzKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0KG1heF9mZCArIDEsICZyZWFkX2ZkcywgJndyaXRlX2ZkcywgTlVMTCwgTlVMTCkgPCAwKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgLy8gSW50ZXJydXB0ZWQgYnkgc2lnbmFsLiAgVHJ5IGFnYWluLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJzZWxlY3Q6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGlsZF9zdGRpbl8gIT0gLTEgJiYgRkRfSVNTRVQoY2hpbGRfc3RkaW5fLCAmd3JpdGVfZmRzKSkgeworICAgICAgaW50IG4gPSB3cml0ZShjaGlsZF9zdGRpbl8sIGlucHV0X2RhdGEuZGF0YSgpICsgaW5wdXRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGEuc2l6ZSgpIC0gaW5wdXRfcG9zKTsKKyAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAvLyBDaGlsZCBjbG9zZWQgcGlwZS4gIFByZXN1bWFibHkgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgbGF0ZXIuCisgICAgICAgIC8vIFByZXRlbmQgd2UncmUgZG9uZSBmb3Igbm93LgorICAgICAgICBpbnB1dF9wb3MgPSBpbnB1dF9kYXRhLnNpemUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0X3BvcyArPSBuOworICAgICAgfQorCisgICAgICBpZiAoaW5wdXRfcG9zID09IGlucHV0X2RhdGEuc2l6ZSgpKSB7CisgICAgICAgIC8vIFdlJ3JlIGRvbmUgd3JpdGluZy4gIENsb3NlLgorICAgICAgICBjbG9zZShjaGlsZF9zdGRpbl8pOworICAgICAgICBjaGlsZF9zdGRpbl8gPSAtMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2hpbGRfc3Rkb3V0XyAhPSAtMSAmJiBGRF9JU1NFVChjaGlsZF9zdGRvdXRfLCAmcmVhZF9mZHMpKSB7CisgICAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICAgIGludCBuID0gcmVhZChjaGlsZF9zdGRvdXRfLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKworICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIG91dHB1dF9kYXRhLmFwcGVuZChidWZmZXIsIG4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UncmUgZG9uZSByZWFkaW5nLiAgQ2xvc2UuCisgICAgICAgIGNsb3NlKGNoaWxkX3N0ZG91dF8pOworICAgICAgICBjaGlsZF9zdGRvdXRfID0gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGNoaWxkX3N0ZGluXyAhPSAtMSkgeworICAgIC8vIENoaWxkIGRpZCBub3QgZmluaXNoIHJlYWRpbmcgaW5wdXQgYmVmb3JlIGl0IGNsb3NlZCB0aGUgb3V0cHV0LgorICAgIC8vIFByZXN1bWFibHkgaXQgZXhpdGVkIHdpdGggYW4gZXJyb3IuCisgICAgY2xvc2UoY2hpbGRfc3RkaW5fKTsKKyAgICBjaGlsZF9zdGRpbl8gPSAtMTsKKyAgfQorCisgIGludCBzdGF0dXM7CisgIHdoaWxlICh3YWl0cGlkKGNoaWxkX3BpZF8sICZzdGF0dXMsIDApID09IC0xKSB7CisgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAid2FpdHBpZDogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgfQorICB9CisKKyAgLy8gUmVzdG9yZSBTSUdQSVBFIGhhbmRsaW5nLgorICBzaWduYWwoU0lHUElQRSwgb2xkX3BpcGVfaGFuZGxlcik7CisKKyAgaWYgKFdJRkVYSVRFRChzdGF0dXMpKSB7CisgICAgaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkgeworICAgICAgaW50IGVycm9yX2NvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworICAgICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAiUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICQwLiIsIGVycm9yX2NvZGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisgICAgaW50IHNpZ25hbCA9IFdURVJNU0lHKHN0YXR1cyk7CisgICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgIlBsdWdpbiBraWxsZWQgYnkgc2lnbmFsICQwLiIsIHNpZ25hbCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgICplcnJvciA9ICJOZWl0aGVyIFdFWElUU1RBVFVTIG5vciBXVEVSTVNJRyBpcyB0cnVlPyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFvdXRwdXQtPlBhcnNlRnJvbVN0cmluZyhvdXRwdXRfZGF0YSkpIHsKKyAgICAqZXJyb3IgPSAiUGx1Z2luIG91dHB1dCBpcyB1bnBhcnNlYWJsZS4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYgIC8vICFfV0lOMzIKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTY0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NVQlBST0NFU1NfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9TVUJQUk9DRVNTX0hfXworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gICAvLyByaWdodC4uLgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlICAvLyBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gIV9XSU4zMgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIE1lc3NhZ2U7CisKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIFV0aWxpdHkgY2xhc3MgZm9yIGxhdW5jaGluZyBzdWItcHJvY2Vzc2VzLgorY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBTdWJwcm9jZXNzIHsKKyBwdWJsaWM6CisgIFN1YnByb2Nlc3MoKTsKKyAgflN1YnByb2Nlc3MoKTsKKworICBlbnVtIFNlYXJjaE1vZGUgeworICAgIFNFQVJDSF9QQVRILCAgIC8vIFVzZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIEVYQUNUX05BTUUgICAgIC8vIFByb2dyYW0gaXMgYW4gZXhhY3QgZmlsZSBuYW1lOyBkb24ndCB1c2UgdGhlIFBBVEguCisgIH07CisKKyAgLy8gU3RhcnQgdGhlIHN1YnByb2Nlc3MuICBDdXJyZW50bHkgd2UgZG9uJ3QgcHJvdmlkZSBhIHdheSB0byBzcGVjaWZ5CisgIC8vIGFyZ3VtZW50cyBhcyBwcm90b2MgcGx1Z2lucyBkb24ndCBoYXZlIGFueS4KKyAgdm9pZCBTdGFydChjb25zdCBzdHJpbmcmIHByb2dyYW0sIFNlYXJjaE1vZGUgc2VhcmNoX21vZGUpOworCisgIC8vIFNlcmlhbGl6ZSB0aGUgaW5wdXQgbWVzc2FnZSBhbmQgcGlwZSBpdCB0byB0aGUgc3VicHJvY2VzcydzIHN0ZGluLCB0aGVuCisgIC8vIGNsb3NlIHRoZSBwaXBlLiAgTWVhbndoaWxlLCByZWFkIGZyb20gdGhlIHN1YnByb2Nlc3MncyBzdGRvdXQgYW5kIHBhcnNlCisgIC8vIHRoZSBkYXRhIGludG8gKm91dHB1dC4gIEFsbCB0aGlzIGlzIGRvbmUgY2FyZWZ1bGx5IHRvIGF2b2lkIGRlYWRsb2Nrcy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuICBPbiBhbnkgc29ydCBvZiBlcnJvciwgcmV0dXJucyBmYWxzZSBhbmQgc2V0cworICAvLyAqZXJyb3IgdG8gYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbS4KKyAgYm9vbCBDb21tdW5pY2F0ZShjb25zdCBNZXNzYWdlJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0LCBzdHJpbmcqIGVycm9yKTsKKworI2lmZGVmIF9XSU4zMgorICAvLyBHaXZlbiBhbiBlcnJvciBjb2RlLCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4gIFRoaXMgaXMKKyAgLy8gZGVmaW5lZCBoZXJlIHNvIHRoYXQgQ29tbWFuZExpbmVJbnRlcmZhY2UgY2FuIHNoYXJlIGl0LgorICBzdGF0aWMgc3RyaW5nIFdpbjMyRXJyb3JNZXNzYWdlKERXT1JEIGVycm9yX2NvZGUpOworI2VuZGlmCisKKyBwcml2YXRlOgorI2lmZGVmIF9XSU4zMgorICBEV09SRCBwcm9jZXNzX3N0YXJ0X2Vycm9yXzsKKyAgSEFORExFIGNoaWxkX2hhbmRsZV87CisKKyAgLy8gVGhlIGZpbGUgaGFuZGxlcyBmb3Igb3VyIGVuZCBvZiB0aGUgY2hpbGQncyBwaXBlcy4gIFdlIGNsb3NlIGVhY2ggYW5kCisgIC8vIHNldCBpdCB0byBOVUxMIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAgSEFORExFIGNoaWxkX3N0ZGluXzsKKyAgSEFORExFIGNoaWxkX3N0ZG91dF87CisKKyNlbHNlICAvLyBfV0lOMzIKKyAgcGlkX3QgY2hpbGRfcGlkXzsKKworICAvLyBUaGUgZmlsZSBkZXNjcmlwdG9ycyBmb3Igb3VyIGVuZCBvZiB0aGUgY2hpbGQncyBwaXBlcy4gIFdlIGNsb3NlIGVhY2ggYW5kCisgIC8vIHNldCBpdCB0byAtMSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgIGludCBjaGlsZF9zdGRpbl87CisgIGludCBjaGlsZF9zdGRvdXRfOworCisjZW5kaWYgIC8vICFfV0lOMzIKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NVQlBST0NFU1NfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiYmYzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYwpAQCAtMCwwICsxLDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gVGhpcyBpcyBhIGR1bW15IGNvZGUgZ2VuZXJhdG9yIHBsdWdpbiB1c2VkIGJ5CisvLyBjb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyNpZmRlZiBfTVNDX1ZFUgorICAvLyBEb24ndCBwcmludCBhIHNpbGx5IG1lc3NhZ2Ugb3Igc3RpY2sgYSBtb2RhbCBkaWFsb2cgYm94IGluIG15IGZhY2UsCisgIC8vIHBsZWFzZS4KKyAgX3NldF9hYm9ydF9iZWhhdmlvcigwLCB+MCk7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpNb2NrQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IoInRlc3RfcGx1Z2luIik7CisgIHJldHVybiBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6UGx1Z2luTWFpbihhcmdjLCBhcmd2LCAmZ2VuZXJhdG9yKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfb3V0cHV0X3VuaXR0ZXN0LnNoIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2EwMjQzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfb3V0cHV0X3VuaXR0ZXN0LnNoCkBAIC0wLDAgKzEsOTEgQEAKKyMhL2Jpbi9zaAorIworIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorIworIyBUZXN0IHByb3RvYydzIHppcCBvdXRwdXQgbW9kZS4KKworZmFpbCgpIHsKKyAgZWNobyAiJEAiID4mMgorICBleGl0IDEKK30KKworVEVTVF9UTVBESVI9LgorUFJPVE9DPS4vcHJvdG9jCisKK2VjaG8gJworICBzeW50YXggPSAicHJvdG8yIjsKKyAgb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworICBvcHRpb24gamF2YV9wYWNrYWdlID0gInRlc3QuamFyIjsKKyAgb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIk91dGVyIjsKKyAgbWVzc2FnZSBGb28ge30KKyAgbWVzc2FnZSBCYXIge30KKycgPiAkVEVTVF9UTVBESVIvdGVzdHppcC5wcm90bworCiskUFJPVE9DIFwKKyAgICAtLWNwcF9vdXQ9JFRFU1RfVE1QRElSL3Rlc3R6aXAuemlwIC0tcHl0aG9uX291dD0kVEVTVF9UTVBESVIvdGVzdHppcC56aXAgXAorICAgIC0tamF2YV9vdXQ9JFRFU1RfVE1QRElSL3Rlc3R6aXAuamFyIC1JJFRFU1RfVE1QRElSIHRlc3R6aXAucHJvdG8gXAorICAgIHx8IGZhaWwgJ3Byb3RvYyBmYWlsZWQuJworCitlY2hvICJUZXN0aW5nIG91dHB1dCB0byB6aXAuLi4iCitpZiB1bnppcCAtaCA+IC9kZXYvbnVsbDsgdGhlbgorICB1bnppcCAtdCAkVEVTVF9UTVBESVIvdGVzdHppcC56aXAgPiAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0IHx8IGZhaWwgJ3VuemlwIGZhaWxlZC4nCisKKyAgZ3JlcCAndGVzdGluZzogdGVzdHppcFwucGJcLmNjICpPSyQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAorICAgIHx8IGZhaWwgJ3Rlc3R6aXAucGIuY2Mgbm90IGZvdW5kIGluIG91dHB1dCB6aXAuJworICBncmVwICd0ZXN0aW5nOiB0ZXN0emlwXC5wYlwuaCAqT0skJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICd0ZXN0emlwLnBiLmggbm90IGZvdW5kIGluIG91dHB1dCB6aXAuJworICBncmVwICd0ZXN0aW5nOiB0ZXN0emlwX3BiMlwucHkgKk9LJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgfHwgZmFpbCAndGVzdHppcF9wYjIucHkgbm90IGZvdW5kIGluIG91dHB1dCB6aXAuJworICBncmVwIC1pICdtYW5pZmVzdCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgJiYgZmFpbCAnWmlwIGZpbGUgY29udGFpbmVkIG1hbmlmZXN0LicKK2Vsc2UKKyAgZWNobyAiV2FybmluZzogICd1bnppcCcgY29tbWFuZCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcgdGVzdC4iCitmaQorCitlY2hvICJUZXN0aW5nIG91dHB1dCB0byBqYXIuLi4iCitpZiBqYXIgYyAkVEVTVF9UTVBESVIvdGVzdHppcC5wcm90byA+IC9kZXYvbnVsbDsgdGhlbgorICBqYXIgdGYgJFRFU1RfVE1QRElSL3Rlc3R6aXAuamFyID4gJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCB8fCBmYWlsICdqYXIgZmFpbGVkLicKKworICBncmVwICdedGVzdC9qYXIvRm9vXC5qYXZhJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgfHwgZmFpbCAnRm9vLmphdmEgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJworICBncmVwICdedGVzdC9qYXIvQmFyXC5qYXZhJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgfHwgZmFpbCAnQmFyLmphdmEgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJworICBncmVwICdedGVzdC9qYXIvT3V0ZXJcLmphdmEkJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICdPdXRlci5qYXZhIG5vdCBmb3VuZCBpbiBvdXRwdXQgamFyLicKKyAgZ3JlcCAnXk1FVEEtSU5GL01BTklGRVNUXC5NRiQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAorICAgIHx8IGZhaWwgJ01hbmlmZXN0IG5vdCBmb3VuZCBpbiBvdXRwdXQgamFyLicKK2Vsc2UKKyAgZWNobyAiV2FybmluZzogICdqYXInIGNvbW1hbmQgbm90IGF2YWlsYWJsZS4gIFNraXBwaW5nIHRlc3QuIgorZmkKKworZWNobyBQQVNTCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDczNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYwpAQCAtMCwwICsxLDIxOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBhbWJyb3NlQGdvb2dsZS5jb20gKEFtYnJvc2UgRmVpbnN0ZWluKSwKKy8vICAgICAgICAga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBCYXNlZCBvbiBodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworc3RhdGljIGNvbnN0IHVpbnQzMiBrQ1JDMzJUYWJsZVsyNTZdID0geworICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5LCAweDcwNmFmNDhmLAorICAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorICAweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LCAweDkwYmYxZDkxLCAweDFkYjcxMDY0LCAweDZhYjAyMGYyLAorICAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLCAweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAorICAweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LAorICAweGZhMGYzZDYzLCAweDhkMDgwZGY1LCAweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAorICAweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLCAweDM1YjVhOGZhLCAweDQyYjI5ODZjLAorICAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorICAweDI2ZDkzMGFjLCAweDUxZGUwMDNhLCAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LCAweDIxYjRmNGI1LCAweDU2YjNjNDIzLAorICAweGNmYmE5NTk5LCAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLCAweDAxZGI3MTA2LAorICAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLCAweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAorICAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLCAweGUxMGU5ODE4LCAweDdmNmEwZGJiLCAweDA4NmQzZDJkLAorICAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLCAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorICAweDZjMDY5NWVkLCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwLAorICAweDhiYmViOGVhLCAweGZjYjk4ODdjLCAweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAorICAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLCAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LAorICAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLCAweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAorICAweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLAorICAweGJlMGIxMDEwLCAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorICAweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LCAweDU5YjMzZDE3LCAweDJlYjQwZDgxLAorICAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLCAweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAorICAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LAorICAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LCAweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAorICAweGYwMGY5MzQ0LCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiLAorICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorICAweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LCAweGQ2ZDZhM2U4LCAweGExZDE5MzdlLAorICAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAorICAweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LAorICAweDMxNmU4ZWVmLCAweDQ2NjliZTc5LCAweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAorICAweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLCAweGM1YmEzYmJlLCAweGIyYmQwYjI4LAorICAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorICAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLCAweDAyNmQ5MzBhLCAweDljMDkwNmE5LCAweGViMGUzNjNmLAorICAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLCAweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAorICAweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLAorICAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLCAweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAorICAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLCAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LAorICAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorICAweGE3NjcyNjYxLCAweGQwNjAxNmY3LCAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLCAweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLAorICAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LCAweGNkZDcwNjkzLAorICAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLCAweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAorICAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLCAweDJkMDJlZjhkCit9OworCitzdGF0aWMgdWludDMyIENvbXB1dGVDUkMzMihjb25zdCBzdHJpbmcgJmJ1ZikgeworICB1aW50MzIgeCA9IH4wVTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuc2l6ZSgpOyArK2kpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGMgPSBidWZbaV07CisgICAgeCA9IGtDUkMzMlRhYmxlWyh4IF4gYykgJiAweGZmXSBeICh4ID4+IDgpOworICB9CisgIHJldHVybiB+eDsKK30KKworc3RhdGljIHZvaWQgV3JpdGVTaG9ydChpbzo6Q29kZWRPdXRwdXRTdHJlYW0gKm91dCwgdWludDE2IHZhbCkgeworICB1aW50OCBwWzJdOworICBwWzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbCk7CisgIHBbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsID4+IDgpOworICBvdXQtPldyaXRlUmF3KHAsIDIpOworfQorCitaaXBXcml0ZXI6OlppcFdyaXRlcihpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXQpCisgIDogcmF3X291dHB1dF8ocmF3X291dHB1dCkge30KK1ppcFdyaXRlcjo6flppcFdyaXRlcigpIHt9CisKK2Jvb2wgWmlwV3JpdGVyOjpXcml0ZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKSB7CisgIEZpbGVJbmZvIGluZm87CisKKyAgaW5mby5uYW1lID0gZmlsZW5hbWU7CisgIHVpbnQxNiBmaWxlbmFtZV9zaXplID0gZmlsZW5hbWUuc2l6ZSgpOworICBpbmZvLm9mZnNldCA9IHJhd19vdXRwdXRfLT5CeXRlQ291bnQoKTsKKyAgaW5mby5zaXplID0gY29udGVudHMuc2l6ZSgpOworICBpbmZvLmNyYzMyID0gQ29tcHV0ZUNSQzMyKGNvbnRlbnRzKTsKKworICBmaWxlc18ucHVzaF9iYWNrKGluZm8pOworCisgIC8vIHdyaXRlIGZpbGUgaGVhZGVyCisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQocmF3X291dHB1dF8pOworICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMigweDA0MDM0YjUwKTsgIC8vIG1hZ2ljCisgIFdyaXRlU2hvcnQoJm91dHB1dCwgMTApOyAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdAorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gZmxhZ3MKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGNvbXByZXNzaW9uIG1ldGhvZDogc3RvcmVkCisgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAvLyBsYXN0IG1vZGlmaWVkIHRpbWUKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGxhc3QgbW9kaWZpZWQgZGF0ZQorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihpbmZvLmNyYzMyKTsgIC8vIGNyYy0zMgorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihpbmZvLnNpemUpOyAgLy8gY29tcHJlc3NlZCBzaXplCisgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGluZm8uc2l6ZSk7ICAvLyB1bmNvbXByZXNzZWQgc2l6ZQorICBXcml0ZVNob3J0KCZvdXRwdXQsIGZpbGVuYW1lX3NpemUpOyAgLy8gZmlsZSBuYW1lIGxlbmd0aAorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aAorICBvdXRwdXQuV3JpdGVTdHJpbmcoZmlsZW5hbWUpOyAgLy8gZmlsZSBuYW1lCisgIG91dHB1dC5Xcml0ZVN0cmluZyhjb250ZW50cyk7ICAvLyBmaWxlIGRhdGEKKworICByZXR1cm4gIW91dHB1dC5IYWRFcnJvcigpOworfQorCitib29sIFppcFdyaXRlcjo6V3JpdGVEaXJlY3RvcnkoKSB7CisgIHVpbnQxNiBudW1fZW50cmllcyA9IGZpbGVzXy5zaXplKCk7CisgIHVpbnQzMiBkaXJfb2ZzID0gcmF3X291dHB1dF8tPkJ5dGVDb3VudCgpOworCisgIC8vIHdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQocmF3X291dHB1dF8pOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbnRyaWVzOyArK2kpIHsKKyAgICBjb25zdCBzdHJpbmcgJmZpbGVuYW1lID0gZmlsZXNfW2ldLm5hbWU7CisgICAgdWludDE2IGZpbGVuYW1lX3NpemUgPSBmaWxlbmFtZS5zaXplKCk7CisgICAgdWludDMyIGNyYzMyID0gZmlsZXNfW2ldLmNyYzMyOworICAgIHVpbnQzMiBzaXplID0gZmlsZXNfW2ldLnNpemU7CisgICAgdWludDMyIG9mZnNldCA9IGZpbGVzX1tpXS5vZmZzZXQ7CisKKyAgICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMigweDAyMDE0YjUwKTsgIC8vIG1hZ2ljCisgICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAxMCk7ICAvLyB2ZXJzaW9uIG1hZGUgYnkKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDEwKTsgIC8vIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gZmxhZ3MKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gY29tcHJlc3Npb24gbWV0aG9kOiBzdG9yZWQKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gbGFzdCBtb2RpZmllZCB0aW1lCisgICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGxhc3QgbW9kaWZpZWQgZGF0ZQorICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGNyYzMyKTsgIC8vIGNyYy0zMgorICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKHNpemUpOyAgLy8gY29tcHJlc3NlZCBzaXplCisgICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoc2l6ZSk7ICAvLyB1bmNvbXByZXNzZWQgc2l6ZQorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgZmlsZW5hbWVfc2l6ZSk7ICAvLyBmaWxlIG5hbWUgbGVuZ3RoCisgICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAvLyBleHRyYSBmaWVsZCBsZW5ndGgKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIGZpbGUgY29tbWVudCBsZW5ndGgKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIHN0YXJ0aW5nIGRpc2sgbnVtYmVyCisgICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAvLyBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMKKyAgICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMigwKTsgIC8vIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcworICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKG9mZnNldCk7ICAvLyBsb2NhbCBoZWFkZXIgb2Zmc2V0CisgICAgb3V0cHV0LldyaXRlU3RyaW5nKGZpbGVuYW1lKTsgIC8vIGZpbGUgbmFtZQorICB9CisgIHVpbnQzMiBkaXJfbGVuID0gb3V0cHV0LkJ5dGVDb3VudCgpOworCisgIC8vIHdyaXRlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBtYXJrZXIKKyAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoMHgwNjA1NGI1MCk7ICAvLyBtYWdpYworICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gZGlzayBudW1iZXIKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGRpc2sgd2l0aCBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeQorICBXcml0ZVNob3J0KCZvdXRwdXQsIG51bV9lbnRyaWVzKTsgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IGVudHJpZXMgKHRoaXMgZGlzaykKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCBudW1fZW50cmllcyk7ICAvLyBjZW50cmFsIGRpcmVjdG9yeSBlbnRyaWVzICh0b3RhbCkKKyAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoZGlyX2xlbik7ICAvLyBjZW50cmFsIGRpcmVjdG9yeSBieXRlIHNpemUKKyAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoZGlyX29mcyk7ICAvLyBjZW50cmFsIGRpcmVjdG9yeSBvZmZzZXQKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAvLyBjb21tZW50IGxlbmd0aAorCisgIHJldHVybiBvdXRwdXQuSGFkRXJyb3IoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzM5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworY2xhc3MgWmlwV3JpdGVyIHsKKyBwdWJsaWM6CisgIFppcFdyaXRlcihpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXQpOworICB+WmlwV3JpdGVyKCk7CisKKyAgYm9vbCBXcml0ZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKTsKKyAgYm9vbCBXcml0ZURpcmVjdG9yeSgpOworCisgcHJpdmF0ZToKKyAgc3RydWN0IEZpbGVJbmZvIHsKKyAgICBzdHJpbmcgbmFtZTsKKyAgICB1aW50MzIgb2Zmc2V0OworICAgIHVpbnQzMiBzaXplOworICAgIHVpbnQzMiBjcmMzMjsKKyAgfTsKKworICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXRfOworICB2ZWN0b3I8RmlsZUluZm8+IGZpbGVzXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDFhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYwpAQCAtMCwwICsxLDQ5NDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworI3VuZGVmIFBBQ0tBR0UgIC8vIGF1dG9oZWFkZXIgI2RlZmluZXMgdGhpcy4gIDooCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY29uc3QgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlCitGaWVsZERlc2NyaXB0b3I6OmtUeXBlVG9DcHBUeXBlTWFwW01BWF9UWVBFICsgMV0gPSB7CisgIHN0YXRpY19jYXN0PENwcFR5cGU+KDApLCAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgQ1BQVFlQRV9ET1VCTEUsICAgLy8gVFlQRV9ET1VCTEUKKyAgQ1BQVFlQRV9GTE9BVCwgICAgLy8gVFlQRV9GTE9BVAorICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX0lOVDY0CisgIENQUFRZUEVfVUlOVDY0LCAgIC8vIFRZUEVfVUlOVDY0CisgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfSU5UMzIKKyAgQ1BQVFlQRV9VSU5UNjQsICAgLy8gVFlQRV9GSVhFRDY0CisgIENQUFRZUEVfVUlOVDMyLCAgIC8vIFRZUEVfRklYRUQzMgorICBDUFBUWVBFX0JPT0wsICAgICAvLyBUWVBFX0JPT0wKKyAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9TVFJJTkcKKyAgQ1BQVFlQRV9NRVNTQUdFLCAgLy8gVFlQRV9HUk9VUAorICBDUFBUWVBFX01FU1NBR0UsICAvLyBUWVBFX01FU1NBR0UKKyAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9CWVRFUworICBDUFBUWVBFX1VJTlQzMiwgICAvLyBUWVBFX1VJTlQzMgorICBDUFBUWVBFX0VOVU0sICAgICAvLyBUWVBFX0VOVU0KKyAgQ1BQVFlQRV9JTlQzMiwgICAgLy8gVFlQRV9TRklYRUQzMgorICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX1NGSVhFRDY0CisgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfU0lOVDMyCisgIENQUFRZUEVfSU5UNjQsICAgIC8vIFRZUEVfU0lOVDY0Cit9OworCitjb25zdCBjaGFyICogY29uc3QgRmllbGREZXNjcmlwdG9yOjprVHlwZVRvTmFtZVtNQVhfVFlQRSArIDFdID0geworICAiRVJST1IiLCAgICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgImRvdWJsZSIsICAgIC8vIFRZUEVfRE9VQkxFCisgICJmbG9hdCIsICAgICAvLyBUWVBFX0ZMT0FUCisgICJpbnQ2NCIsICAgICAvLyBUWVBFX0lOVDY0CisgICJ1aW50NjQiLCAgICAvLyBUWVBFX1VJTlQ2NAorICAiaW50MzIiLCAgICAgLy8gVFlQRV9JTlQzMgorICAiZml4ZWQ2NCIsICAgLy8gVFlQRV9GSVhFRDY0CisgICJmaXhlZDMyIiwgICAvLyBUWVBFX0ZJWEVEMzIKKyAgImJvb2wiLCAgICAgIC8vIFRZUEVfQk9PTAorICAic3RyaW5nIiwgICAgLy8gVFlQRV9TVFJJTkcKKyAgImdyb3VwIiwgICAgIC8vIFRZUEVfR1JPVVAKKyAgIm1lc3NhZ2UiLCAgIC8vIFRZUEVfTUVTU0FHRQorICAiYnl0ZXMiLCAgICAgLy8gVFlQRV9CWVRFUworICAidWludDMyIiwgICAgLy8gVFlQRV9VSU5UMzIKKyAgImVudW0iLCAgICAgIC8vIFRZUEVfRU5VTQorICAic2ZpeGVkMzIiLCAgLy8gVFlQRV9TRklYRUQzMgorICAic2ZpeGVkNjQiLCAgLy8gVFlQRV9TRklYRUQ2NAorICAic2ludDMyIiwgICAgLy8gVFlQRV9TSU5UMzIKKyAgInNpbnQ2NCIsICAgIC8vIFRZUEVfU0lOVDY0Cit9OworCitjb25zdCBjaGFyICogY29uc3QgRmllbGREZXNjcmlwdG9yOjprQ3BwVHlwZVRvTmFtZVtNQVhfQ1BQVFlQRSArIDFdID0geworICAiRVJST1IiLCAgICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgImludDMyIiwgICAgIC8vIENQUFRZUEVfSU5UMzIKKyAgImludDY0IiwgICAgIC8vIENQUFRZUEVfSU5UNjQKKyAgInVpbnQzMiIsICAgIC8vIENQUFRZUEVfVUlOVDMyCisgICJ1aW50NjQiLCAgICAvLyBDUFBUWVBFX1VJTlQ2NAorICAiZG91YmxlIiwgICAgLy8gQ1BQVFlQRV9ET1VCTEUKKyAgImZsb2F0IiwgICAgIC8vIENQUFRZUEVfRkxPQVQKKyAgImJvb2wiLCAgICAgIC8vIENQUFRZUEVfQk9PTAorICAiZW51bSIsICAgICAgLy8gQ1BQVFlQRV9FTlVNCisgICJzdHJpbmciLCAgICAvLyBDUFBUWVBFX1NUUklORworICAibWVzc2FnZSIsICAgLy8gQ1BQVFlQRV9NRVNTQUdFCit9OworCitjb25zdCBjaGFyICogY29uc3QgRmllbGREZXNjcmlwdG9yOjprTGFiZWxUb05hbWVbTUFYX0xBQkVMICsgMV0gPSB7CisgICJFUlJPUiIsICAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKKworICAib3B0aW9uYWwiLCAgLy8gTEFCRUxfT1BUSU9OQUwKKyAgInJlcXVpcmVkIiwgIC8vIExBQkVMX1JFUVVJUkVECisgICJyZXBlYXRlZCIsICAvLyBMQUJFTF9SRVBFQVRFRAorfTsKKworI2lmbmRlZiBfTVNDX1ZFUiAgLy8gTVNWQyBkb2Vzbid0IG5lZWQgdGhlc2UgYW5kIHdvbid0IGV2ZW4gYWNjZXB0IHRoZW0uCitjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvcjo6a0ZpcnN0UmVzZXJ2ZWROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyOworI2VuZGlmCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHN0cmluZyBrRW1wdHlTdHJpbmc7CisKK3N0cmluZyBUb0NhbWVsQ2FzZShjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIGJvb2wgY2FwaXRhbGl6ZV9uZXh0ID0gZmFsc2U7CisgIHN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKGlucHV0LnNpemUoKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgeworICAgIGlmIChpbnB1dFtpXSA9PSAnXycpIHsKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChjYXBpdGFsaXplX25leHQpIHsKKyAgICAgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCisgICAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGlucHV0W2ldIC0gJ2EnICsgJ0EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soaW5wdXRbaV0pOworICAgICAgfQorICAgICAgY2FwaXRhbGl6ZV9uZXh0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soaW5wdXRbaV0pOworICAgIH0KKyAgfQorCisgIC8vIExvd2VyLWNhc2UgdGhlIGZpcnN0IGxldHRlci4KKyAgaWYgKCFyZXN1bHQuZW1wdHkoKSAmJiAnQScgPD0gcmVzdWx0WzBdICYmIHJlc3VsdFswXSA8PSAnWicpIHsKKyAgICByZXN1bHRbMF0gPSByZXN1bHRbMF0gLSAnQScgKyAnYSc7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBIERlc2NyaXB0b3JQb29sIGNvbnRhaW5zIGEgYnVuY2ggb2YgaGFzaF9tYXBzIHRvIGltcGxlbWVudCB0aGUKKy8vIHZhcmlvdXMgRmluZCpCeSooKSBtZXRob2RzLiAgU2luY2UgaGFzaHRhYmxlIGxvb2t1cHMgYXJlIE8oMSksIGl0J3MKKy8vIG1vc3QgZWZmaWNpZW50IHRvIGNvbnN0cnVjdCBhIGZpeGVkIHNldCBvZiBsYXJnZSBoYXNoX21hcHMgdXNlZCBieQorLy8gYWxsIG9iamVjdHMgaW4gdGhlIHBvb2wgcmF0aGVyIHRoYW4gY29uc3RydWN0IG9uZSBvciBtb3JlIHNtYWxsCisvLyBoYXNoX21hcHMgZm9yIGVhY2ggb2JqZWN0LgorLy8KKy8vIFRoZSBrZXlzIHRvIHRoZXNlIGhhc2hfbWFwcyBhcmUgKHBhcmVudCwgbmFtZSkgb3IgKHBhcmVudCwgbnVtYmVyKQorLy8gcGFpcnMuICBVbmZvcnR1bmF0ZWx5IFNUTCBkb2Vzbid0IHByb3ZpZGUgaGFzaCBmdW5jdGlvbnMgZm9yIHBhaXI8PiwKKy8vIHNvIHdlIG11c3QgaW52ZW50IG91ciBvd24uCisvLworLy8gVE9ETyhrZW50b24pOiAgVXNlIFN0cmluZ1BpZWNlIHJhdGhlciB0aGFuIGNvbnN0IGNoYXIqIGluIGtleXM/ICBJdCB3b3VsZAorLy8gICBiZSBhIGxvdCBjbGVhbmVyIGJ1dCB3ZSdkIGp1c3QgaGF2ZSB0byBjb252ZXJ0IGl0IGJhY2sgdG8gY29uc3QgY2hhcioKKy8vICAgZm9yIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLgorCit0eXBlZGVmIHBhaXI8Y29uc3Qgdm9pZCosIGNvbnN0IGNoYXIqPiBQb2ludGVyU3RyaW5nUGFpcjsKKworc3RydWN0IFBvaW50ZXJTdHJpbmdQYWlyRXF1YWwgeworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEuZmlyc3QgPT0gYi5maXJzdCAmJiBzdHJjbXAoYS5zZWNvbmQsIGIuc2Vjb25kKSA9PSAwOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWlyVHlwZT4KK3N0cnVjdCBQb2ludGVySW50ZWdlclBhaXJIYXNoIHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgUGFpclR5cGUmIHApIGNvbnN0IHsKKyAgICAvLyBGSVhNRShrZW50b24pOiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29tcHV0ZSB0aGlzIGhhc2g/ICBJIGhhdmUKKyAgICAvLyBubyBpZGVhISAgVGhpcyBzZWVtcyBhIGJpdCBiZXR0ZXIgdGhhbiBhbiBYT1IuCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHAuZmlyc3QpICogKCgxIDw8IDE2KSAtIDEpICsgcC5zZWNvbmQ7CisgIH0KKworICAvLyBVc2VkIG9ubHkgYnkgTVNWQyBhbmQgcGxhdGZvcm1zIHdoZXJlIGhhc2hfbWFwIGlzIG5vdCBhdmFpbGFibGUuCisgIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQYWlyVHlwZSYgYSwgY29uc3QgUGFpclR5cGUmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS5maXJzdCA8IGIuZmlyc3QgfHwKKyAgICAgICAgICAoYS5maXJzdCA9PSBiLmZpcnN0ICYmIGEuc2Vjb25kIDwgYi5zZWNvbmQpOworICB9Cit9OworCit0eXBlZGVmIHBhaXI8Y29uc3QgRGVzY3JpcHRvciosIGludD4gRGVzY3JpcHRvckludFBhaXI7Cit0eXBlZGVmIHBhaXI8Y29uc3QgRW51bURlc2NyaXB0b3IqLCBpbnQ+IEVudW1JbnRQYWlyOworCitzdHJ1Y3QgUG9pbnRlclN0cmluZ1BhaXJIYXNoIHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgUG9pbnRlclN0cmluZ1BhaXImIHApIGNvbnN0IHsKKyAgICAvLyBGSVhNRShrZW50b24pOiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29tcHV0ZSB0aGlzIGhhc2g/ICBJIGhhdmUKKyAgICAvLyBubyBpZGVhISAgVGhpcyBzZWVtcyBhIGJpdCBiZXR0ZXIgdGhhbiBhbiBYT1IuCisgICAgaGFzaDxjb25zdCBjaGFyKj4gY3N0cmluZ19oYXNoOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGludHB0cl90PihwLmZpcnN0KSAqICgoMSA8PCAxNikgLSAxKSArCisgICAgICAgICAgIGNzdHJpbmdfaGFzaChwLnNlY29uZCk7CisgIH0KKworICAvLyBVc2VkIG9ubHkgYnkgTVNWQyBhbmQgcGxhdGZvcm1zIHdoZXJlIGhhc2hfbWFwIGlzIG5vdCBhdmFpbGFibGUuCisgIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQb2ludGVyU3RyaW5nUGFpciYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyU3RyaW5nUGFpciYgYikgY29uc3QgeworICAgIGlmIChhLmZpcnN0IDwgYi5maXJzdCkgcmV0dXJuIHRydWU7CisgICAgaWYgKGEuZmlyc3QgPiBiLmZpcnN0KSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHN0cmNtcChhLnNlY29uZCwgYi5zZWNvbmQpIDwgMDsKKyAgfQorfTsKKworCitzdHJ1Y3QgU3ltYm9sIHsKKyAgZW51bSBUeXBlIHsKKyAgICBOVUxMX1NZTUJPTCwgTUVTU0FHRSwgRklFTEQsIEVOVU0sIEVOVU1fVkFMVUUsIFNFUlZJQ0UsIE1FVEhPRCwKKyAgICBQQUNLQUdFCisgIH07CisgIFR5cGUgdHlwZTsKKyAgdW5pb24geworICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yOworICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3I7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZV9kZXNjcmlwdG9yOworICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlX2Rlc2NyaXB0b3I7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kX2Rlc2NyaXB0b3I7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHBhY2thZ2VfZmlsZV9kZXNjcmlwdG9yOworICB9OworCisgIGlubGluZSBTeW1ib2woKSA6IHR5cGUoTlVMTF9TWU1CT0wpIHsgZGVzY3JpcHRvciA9IE5VTEw7IH0KKyAgaW5saW5lIGJvb2wgSXNOdWxsKCkgY29uc3QgeyByZXR1cm4gdHlwZSA9PSBOVUxMX1NZTUJPTDsgfQorICBpbmxpbmUgYm9vbCBJc1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gTUVTU0FHRSB8fCB0eXBlID09IEVOVU07CisgIH0KKyAgaW5saW5lIGJvb2wgSXNBZ2dyZWdhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gTUVTU0FHRSB8fCB0eXBlID09IFBBQ0tBR0UKKyAgICAgICAgfHwgdHlwZSA9PSBFTlVNIHx8IHR5cGUgPT0gU0VSVklDRTsKKyAgfQorCisjZGVmaW5lIENPTlNUUlVDVE9SKFRZUEUsIFRZUEVfQ09OU1RBTlQsIEZJRUxEKSAgXAorICBpbmxpbmUgZXhwbGljaXQgU3ltYm9sKGNvbnN0IFRZUEUqIHZhbHVlKSB7ICAgIFwKKyAgICB0eXBlID0gVFlQRV9DT05TVEFOVDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGhpcy0+RklFTEQgPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgQ09OU1RSVUNUT1IoRGVzY3JpcHRvciAgICAgICAgICwgTUVTU0FHRSAgICwgZGVzY3JpcHRvciAgICAgICAgICAgICApCisgIENPTlNUUlVDVE9SKEZpZWxkRGVzY3JpcHRvciAgICAsIEZJRUxEICAgICAsIGZpZWxkX2Rlc2NyaXB0b3IgICAgICAgKQorICBDT05TVFJVQ1RPUihFbnVtRGVzY3JpcHRvciAgICAgLCBFTlVNICAgICAgLCBlbnVtX2Rlc2NyaXB0b3IgICAgICAgICkKKyAgQ09OU1RSVUNUT1IoRW51bVZhbHVlRGVzY3JpcHRvciwgRU5VTV9WQUxVRSwgZW51bV92YWx1ZV9kZXNjcmlwdG9yICApCisgIENPTlNUUlVDVE9SKFNlcnZpY2VEZXNjcmlwdG9yICAsIFNFUlZJQ0UgICAsIHNlcnZpY2VfZGVzY3JpcHRvciAgICAgKQorICBDT05TVFJVQ1RPUihNZXRob2REZXNjcmlwdG9yICAgLCBNRVRIT0QgICAgLCBtZXRob2RfZGVzY3JpcHRvciAgICAgICkKKyAgQ09OU1RSVUNUT1IoRmlsZURlc2NyaXB0b3IgICAgICwgUEFDS0FHRSAgICwgcGFja2FnZV9maWxlX2Rlc2NyaXB0b3IpCisjdW5kZWYgQ09OU1RSVUNUT1IKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogR2V0RmlsZSgpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgTlVMTF9TWU1CT0w6IHJldHVybiBOVUxMOworICAgICAgY2FzZSBNRVNTQUdFICAgIDogcmV0dXJuIGRlc2NyaXB0b3IgICAgICAgICAgIC0+ZmlsZSgpOworICAgICAgY2FzZSBGSUVMRCAgICAgIDogcmV0dXJuIGZpZWxkX2Rlc2NyaXB0b3IgICAgIC0+ZmlsZSgpOworICAgICAgY2FzZSBFTlVNICAgICAgIDogcmV0dXJuIGVudW1fZGVzY3JpcHRvciAgICAgIC0+ZmlsZSgpOworICAgICAgY2FzZSBFTlVNX1ZBTFVFIDogcmV0dXJuIGVudW1fdmFsdWVfZGVzY3JpcHRvci0+dHlwZSgpLT5maWxlKCk7CisgICAgICBjYXNlIFNFUlZJQ0UgICAgOiByZXR1cm4gc2VydmljZV9kZXNjcmlwdG9yICAgLT5maWxlKCk7CisgICAgICBjYXNlIE1FVEhPRCAgICAgOiByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3IgICAgLT5zZXJ2aWNlKCktPmZpbGUoKTsKKyAgICAgIGNhc2UgUEFDS0FHRSAgICA6IHJldHVybiBwYWNrYWdlX2ZpbGVfZGVzY3JpcHRvcjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK307CisKK2NvbnN0IFN5bWJvbCBrTnVsbFN5bWJvbDsKKwordHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgU3ltYm9sLAorICAgICAgICAgICAgICAgICBoYXNoPGNvbnN0IGNoYXIqPiwgc3RyZXE+CisgIFN5bWJvbHNCeU5hbWVNYXA7Cit0eXBlZGVmIGhhc2hfbWFwPFBvaW50ZXJTdHJpbmdQYWlyLCBTeW1ib2wsCisgICAgICAgICAgICAgICAgIFBvaW50ZXJTdHJpbmdQYWlySGFzaCwgUG9pbnRlclN0cmluZ1BhaXJFcXVhbD4KKyAgU3ltYm9sc0J5UGFyZW50TWFwOwordHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgY29uc3QgRmlsZURlc2NyaXB0b3IqLAorICAgICAgICAgICAgICAgICBoYXNoPGNvbnN0IGNoYXIqPiwgc3RyZXE+CisgIEZpbGVzQnlOYW1lTWFwOwordHlwZWRlZiBoYXNoX21hcDxQb2ludGVyU3RyaW5nUGFpciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiwKKyAgICAgICAgICAgICAgICAgUG9pbnRlclN0cmluZ1BhaXJIYXNoLCBQb2ludGVyU3RyaW5nUGFpckVxdWFsPgorICBGaWVsZHNCeU5hbWVNYXA7Cit0eXBlZGVmIGhhc2hfbWFwPERlc2NyaXB0b3JJbnRQYWlyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqLAorICAgICAgICAgICAgICAgICBQb2ludGVySW50ZWdlclBhaXJIYXNoPERlc2NyaXB0b3JJbnRQYWlyPiA+CisgIEZpZWxkc0J5TnVtYmVyTWFwOwordHlwZWRlZiBoYXNoX21hcDxFbnVtSW50UGFpciwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciosCisgICAgICAgICAgICAgICAgIFBvaW50ZXJJbnRlZ2VyUGFpckhhc2g8RW51bUludFBhaXI+ID4KKyAgRW51bVZhbHVlc0J5TnVtYmVyTWFwOworLy8gVGhpcyBpcyBhIG1hcCByYXRoZXIgdGhhbiBhIGhhc2hfbWFwLCBzaW5jZSB3ZSB1c2UgaXQgdG8gaXRlcmF0ZQorLy8gdGhyb3VnaCBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdCBleHRlbmQgYSBnaXZlbiBEZXNjcmlwdG9yLCBhbmQgYW4KKy8vIG9yZGVyZWQgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpbXBsZW1lbnRzIGxvd2VyX2JvdW5kIGlzIGNvbnZlbmllbnQKKy8vIGZvciB0aGF0LgordHlwZWRlZiBtYXA8RGVzY3JpcHRvckludFBhaXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+CisgIEV4dGVuc2lvbnNHcm91cGVkQnlEZXNjcmlwdG9yTWFwOworCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlc2NyaXB0b3JQb29sOjpUYWJsZXMKKworY2xhc3MgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyB7CisgcHVibGljOgorICBUYWJsZXMoKTsKKyAgflRhYmxlcygpOworCisgIC8vIFJlY29yZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdGFibGVzIHRvIHRoZSBzdGFjayBvZiBjaGVja3BvaW50cy4KKyAgLy8gRWFjaCBjYWxsIHRvIEFkZENoZWNrcG9pbnQoKSBtdXN0IGJlIHBhaXJlZCB3aXRoIGV4YWN0bHkgb25lIGNhbGwgdG8gZWl0aGVyCisgIC8vIENsZWFyTGFzdENoZWNrcG9pbnQoKSBvciBSb2xsYmFja1RvTGFzdENoZWNrcG9pbnQoKS4KKyAgLy8KKyAgLy8gVGhpcyBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgZmlsZXMsIHNpbmNlIHNvbWUga2luZHMgb2YgdmFsaWRhdGlvbiBlcnJvcnMKKyAgLy8gY2Fubm90IGJlIGRldGVjdGVkIHVudGlsIHRoZSBmaWxlJ3MgZGVzY3JpcHRvcnMgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8KKyAgLy8gdGhlIHRhYmxlcy4KKyAgLy8KKyAgLy8gVGhpcyBzdXBwb3J0cyByZWN1cnNpdmUgY2hlY2twb2ludHMsIHNpbmNlIGJ1aWxkaW5nIGEgZmlsZSBtYXkgdHJpZ2dlcgorICAvLyByZWN1cnNpdmUgYnVpbGRpbmcgb2Ygb3RoZXIgZmlsZXMuIE5vdGUgdGhhdCByZWN1cnNpdmUgY2hlY2twb2ludHMgYXJlIG5vdAorICAvLyBub3JtYWxseSBuZWNlc3Nhcnk7IGV4cGxpY2l0IGRlcGVuZGVuY2llcyBhcmUgYnVpbHQgcHJpb3IgdG8gY2hlY2twb2ludGluZy4KKyAgLy8gU28gYWx0aG91Z2ggd2UgcmVjdXJzaXZlbHkgYnVpbGQgdHJhbnNpdGl2ZSBpbXBvcnRzLCB0aGVyZSBpcyBhdCBtb3N0IG9uZQorICAvLyBjaGVja3BvaW50IGluIHRoZSBzdGFjayBkdXJpbmcgZGVwZW5kZW5jeSBidWlsZGluZy4KKyAgLy8KKyAgLy8gUmVjdXJzaXZlIGNoZWNrcG9pbnRzIG9ubHkgYXJpc2UgZHVyaW5nIGNyb3NzLWxpbmtpbmcgb2YgdGhlIGRlc2NyaXB0b3JzLgorICAvLyBTeW1ib2wgcmVmZXJlbmNlcyBtdXN0IGJlIHJlc29sdmVkLCB2aWEgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2wgYW5kCisgIC8vIGZyaWVuZHMuIElmIHRoZSBwZW5kaW5nIGZpbGUgcmVmZXJlbmNlcyBhbiB1bmtub3duIHN5bWJvbAorICAvLyAoZS5nLiwgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHBlbmRpbmcgZmlsZSdzIGV4cGxpY2l0IGRlcGVuZGVuY2llcyksIGFuZAorICAvLyB0aGUgcG9vbCBpcyB1c2luZyBhIGZhbGxiYWNrIGRhdGFiYXNlLCBhbmQgdGhhdCBkYXRhYmFzZSBjb250YWlucyBhIGZpbGUKKyAgLy8gZGVmaW5pbmcgdGhhdCBzeW1ib2wsIGFuZCB0aGF0IGZpbGUgaGFzIG5vdCB5ZXQgYmVlbiBidWlsdCBieSB0aGUgcG9vbCwKKyAgLy8gdGhlIHBvb2wgYnVpbGRzIHRoZSBmaWxlIGR1cmluZyBjcm9zcy1saW5raW5nLCBsZWFkaW5nIHRvIGFub3RoZXIKKyAgLy8gY2hlY2twb2ludC4KKyAgdm9pZCBBZGRDaGVja3BvaW50KCk7CisKKyAgLy8gTWFyayB0aGUgbGFzdCBjaGVja3BvaW50IGFzIGhhdmluZyBjbGVhcmVkIHN1Y2Nlc3NmdWxseSwgcmVtb3ZpbmcgaXQgZnJvbQorICAvLyB0aGUgc3RhY2suIElmIHRoZSBzdGFjayBpcyBlbXB0eSwgYWxsIHBlbmRpbmcgc3ltYm9scyB3aWxsIGJlIGNvbW1pdHRlZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIHN5bWJvbHMgYWRkZWQgc2luY2UgdGhlIGxhc3QKKyAgLy8gY2hlY2twb2ludCB3b24ndCBiZSByb2xsZWQgYmFjazogaWYgYSBjaGVja3BvaW50IGdldHMgcm9sbGVkIGJhY2ssCisgIC8vIGV2ZXJ5dGhpbmcgcGFzdCB0aGF0IHBvaW50IGdldHMgcm9sbGVkIGJhY2ssIGluY2x1ZGluZyBzeW1ib2xzIGFkZGVkIGFmdGVyCisgIC8vIGNoZWNrcG9pbnRzIHRoYXQgd2VyZSBwdXNoZWQgb250byB0aGUgc3RhY2sgYWZ0ZXIgaXQgYW5kIG1hcmtlZCBhcyBjbGVhcmVkLgorICB2b2lkIENsZWFyTGFzdENoZWNrcG9pbnQoKTsKKworICAvLyBSb2xsIGJhY2sgdGhlIFRhYmxlcyB0byB0aGUgc3RhdGUgb2YgdGhlIGNoZWNrcG9pbnQgYXQgdGhlIHRvcCBvZiB0aGUKKyAgLy8gc3RhY2ssIHJlbW92aW5nIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgYWRkZWQgYWZ0ZXIgdGhhdCBwb2ludC4KKyAgdm9pZCBSb2xsYmFja1RvTGFzdENoZWNrcG9pbnQoKTsKKworICAvLyBUaGUgc3RhY2sgb2YgZmlsZXMgd2hpY2ggYXJlIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFVzZWQgdG8gZGV0ZWN0CisgIC8vIGN5Y2xpYyBkZXBlbmRlbmNpZXMgd2hlbiBsb2FkaW5nIGZpbGVzIGZyb20gYSBEZXNjcmlwdG9yRGF0YWJhc2UuICBOb3QKKyAgLy8gdXNlZCB3aGVuIGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMLgorICB2ZWN0b3I8c3RyaW5nPiBwZW5kaW5nX2ZpbGVzXzsKKworICAvLyBBIHNldCBvZiBmaWxlcyB3aGljaCB3ZSBoYXZlIHRyaWVkIHRvIGxvYWQgZnJvbSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UKKyAgLy8gYW5kIGVuY291bnRlcmVkIGVycm9ycy4gIFdlIHdpbGwgbm90IGF0dGVtcHQgdG8gbG9hZCB0aGVtIGFnYWluLgorICAvLyBOb3QgdXNlZCB3aGVuIGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMLgorICBoYXNoX3NldDxzdHJpbmc+IGtub3duX2JhZF9maWxlc187CisKKyAgLy8gVGhlIHNldCBvZiBkZXNjcmlwdG9ycyBmb3Igd2hpY2ggd2UndmUgYWxyZWFkeSBsb2FkZWQgdGhlIGZ1bGwKKyAgLy8gc2V0IG9mIGV4dGVuc2lvbnMgbnVtYmVycyBmcm9tIGZhbGxiYWNrX2RhdGFiYXNlXy4KKyAgaGFzaF9zZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGV4dGVuc2lvbnNfbG9hZGVkX2Zyb21fZGJfOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEZpbmRpbmcgaXRlbXMuCisKKyAgLy8gRmluZCBzeW1ib2xzLiAgVGhpcyByZXR1cm5zIGEgbnVsbCBTeW1ib2wgKHN5bWJvbC5Jc051bGwoKSBpcyB0cnVlKQorICAvLyBpZiBub3QgZm91bmQuCisgIGlubGluZSBTeW1ib2wgRmluZFN5bWJvbChjb25zdCBzdHJpbmcmIGtleSkgY29uc3Q7CisKKyAgLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBib2R5IG9mIERlc2NyaXB0b3JQb29sOjpGaW5kKkJ5TmFtZSgpLiAgSXQgc2hvdWxkCisgIC8vIHJlYWxseSBiZSBhIHByaXZhdGUgbWV0aG9kIG9mIERlc2NyaXB0b3JQb29sLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlCisgIC8vIGRlY2xhcmluZyBTeW1ib2wgaW4gZGVzY3JpcHRvci5oLCB3aGljaCB3b3VsZCBkcmFnIGFsbCBraW5kcyBvZiBvdGhlcgorICAvLyBzdHVmZiBpbnRvIHRoZSBoZWFkZXIuICBZYXkgQysrLgorICBTeW1ib2wgRmluZEJ5TmFtZUhlbHBlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBUaGVzZSByZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCisgIGlubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRmluZEZpbGUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0OworICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uKGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBpbmxpbmUgdm9pZCBGaW5kQWxsRXh0ZW5zaW9ucyhjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0OworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEFkZGluZyBpdGVtcy4KKworICAvLyBUaGVzZSBhZGQgaXRlbXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFibGVzLiAgVGhleSByZXR1cm4gZmFsc2UgaWYKKyAgLy8gdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdGFibGUuICBGb3IgQWRkU3ltYm9sKCksIHRoZSBzdHJpbmcgcGFzc2VkCisgIC8vIGluIG11c3QgYmUgb25lIHRoYXQgd2FzIGNvbnN0cnVjdGVkIHVzaW5nIEFsbG9jYXRlU3RyaW5nKCksIGFzIGl0IHdpbGwKKyAgLy8gYmUgdXNlZCBhcyBhIGtleSBpbiB0aGUgc3ltYm9sc19ieV9uYW1lXyBtYXAgd2l0aG91dCBjb3B5aW5nLgorICBib29sIEFkZFN5bWJvbChjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwgU3ltYm9sIHN5bWJvbCk7CisgIGJvb2wgQWRkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisgIGJvb2wgQWRkRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEFsbG9jYXRpbmcgbWVtb3J5LgorCisgIC8vIEFsbG9jYXRlIGFuIG9iamVjdCB3aGljaCB3aWxsIGJlIHJlY2xhaW1lZCB3aGVuIHRoZSBwb29sIGlzCisgIC8vIGRlc3Ryb3llZC4gIE5vdGUgdGhhdCB0aGUgb2JqZWN0J3MgZGVzdHJ1Y3RvciB3aWxsIG5ldmVyIGJlIGNhbGxlZCwKKyAgLy8gc28gaXRzIGZpZWxkcyBtdXN0IGJlIHBsYWluIG9sZCBkYXRhIChwcmltaXRpdmUgZGF0YSB0eXBlcyBhbmQKKyAgLy8gcG9pbnRlcnMpLiAgQWxsIG9mIHRoZSBkZXNjcmlwdG9yIHR5cGVzIGFyZSBzdWNoIG9iamVjdHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+IFR5cGUqIEFsbG9jYXRlKCk7CisKKyAgLy8gQWxsb2NhdGUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aGljaCB3aWxsIGJlIHJlY2xhaW1lZCB3aGVuIHRoZQorICAvLyBwb29sIGluIGRlc3Ryb3llZC4gIEFnYWluLCBkZXN0cnVjdG9ycyBhcmUgbmV2ZXIgY2FsbGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBUeXBlKiBBbGxvY2F0ZUFycmF5KGludCBjb3VudCk7CisKKyAgLy8gQWxsb2NhdGUgYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgcG9vbCBpcyBkZXN0cm95ZWQuCisgIC8vIFRoZSBzdHJpbmcgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGdpdmVuIHZhbHVlIGZvciBjb252ZW5pZW5jZS4KKyAgc3RyaW5nKiBBbGxvY2F0ZVN0cmluZyhjb25zdCBzdHJpbmcmIHZhbHVlKTsKKworICAvLyBBbGxvY2F0ZSBhIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LiAgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBHQ0MgaGF2ZQorICAvLyB0cm91YmxlIHVuZGVyc3RhbmRpbmcgZXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMgaW4gc29tZSBjYXNlcywgc28KKyAgLy8gaW4gdGhvc2UgY2FzZXMgd2UgaGF2ZSB0byBwYXNzIGEgZHVtbXkgcG9pbnRlciBvZiB0aGUgcmlnaHQgdHlwZSBhcyB0aGUKKyAgLy8gcGFyYW1ldGVyIGluc3RlYWQgb2Ygc3BlY2lmeWluZyB0aGUgdHlwZSBleHBsaWNpdGx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBUeXBlKiBBbGxvY2F0ZU1lc3NhZ2UoVHlwZSogZHVtbXkgPSBOVUxMKTsKKworICAvLyBBbGxvY2F0ZSBhIEZpbGVEZXNjcmlwdG9yVGFibGVzIG9iamVjdC4KKyAgRmlsZURlc2NyaXB0b3JUYWJsZXMqIEFsbG9jYXRlRmlsZVRhYmxlcygpOworCisgcHJpdmF0ZToKKyAgdmVjdG9yPHN0cmluZyo+IHN0cmluZ3NfOyAgICAvLyBBbGwgc3RyaW5ncyBpbiB0aGUgcG9vbC4KKyAgdmVjdG9yPE1lc3NhZ2UqPiBtZXNzYWdlc187ICAvLyBBbGwgbWVzc2FnZXMgaW4gdGhlIHBvb2wuCisgIHZlY3RvcjxGaWxlRGVzY3JpcHRvclRhYmxlcyo+IGZpbGVfdGFibGVzXzsgIC8vIEFsbCBmaWxlIHRhYmxlcyBpbiB0aGUgcG9vbC4KKyAgdmVjdG9yPHZvaWQqPiBhbGxvY2F0aW9uc187ICAvLyBBbGwgb3RoZXIgbWVtb3J5IGFsbG9jYXRlZCBpbiB0aGUgcG9vbC4KKworICBTeW1ib2xzQnlOYW1lTWFwICAgICAgc3ltYm9sc19ieV9uYW1lXzsKKyAgRmlsZXNCeU5hbWVNYXAgICAgICAgIGZpbGVzX2J5X25hbWVfOworICBFeHRlbnNpb25zR3JvdXBlZEJ5RGVzY3JpcHRvck1hcCBleHRlbnNpb25zXzsKKworICBzdHJ1Y3QgQ2hlY2tQb2ludCB7CisgICAgZXhwbGljaXQgQ2hlY2tQb2ludChjb25zdCBUYWJsZXMqIHRhYmxlcykKKyAgICAgIDogc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludCh0YWJsZXMtPnN0cmluZ3NfLnNpemUoKSksCisgICAgICAgIG1lc3NhZ2VzX2JlZm9yZV9jaGVja3BvaW50KHRhYmxlcy0+bWVzc2FnZXNfLnNpemUoKSksCisgICAgICAgIGZpbGVfdGFibGVzX2JlZm9yZV9jaGVja3BvaW50KHRhYmxlcy0+ZmlsZV90YWJsZXNfLnNpemUoKSksCisgICAgICAgIGFsbG9jYXRpb25zX2JlZm9yZV9jaGVja3BvaW50KHRhYmxlcy0+YWxsb2NhdGlvbnNfLnNpemUoKSksCisgICAgICAgIHBlbmRpbmdfc3ltYm9sc19iZWZvcmVfY2hlY2twb2ludCgKKyAgICAgICAgICAgIHRhYmxlcy0+c3ltYm9sc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCkpLAorICAgICAgICBwZW5kaW5nX2ZpbGVzX2JlZm9yZV9jaGVja3BvaW50KAorICAgICAgICAgICAgdGFibGVzLT5maWxlc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCkpLAorICAgICAgICBwZW5kaW5nX2V4dGVuc2lvbnNfYmVmb3JlX2NoZWNrcG9pbnQoCisgICAgICAgICAgICB0YWJsZXMtPmV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpKSB7CisgICAgfQorICAgIGludCBzdHJpbmdzX2JlZm9yZV9jaGVja3BvaW50OworICAgIGludCBtZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICBpbnQgZmlsZV90YWJsZXNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgaW50IGFsbG9jYXRpb25zX2JlZm9yZV9jaGVja3BvaW50OworICAgIGludCBwZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgaW50IHBlbmRpbmdfZmlsZXNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgaW50IHBlbmRpbmdfZXh0ZW5zaW9uc19iZWZvcmVfY2hlY2twb2ludDsKKyAgfTsKKyAgdmVjdG9yPENoZWNrUG9pbnQ+IGNoZWNrcG9pbnRzXzsKKyAgdmVjdG9yPGNvbnN0IGNoYXIqICAgICAgPiBzeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfOworICB2ZWN0b3I8Y29uc3QgY2hhciogICAgICA+IGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfOworICB2ZWN0b3I8RGVzY3JpcHRvckludFBhaXI+IGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF87CisKKyAgLy8gQWxsb2NhdGUgc29tZSBieXRlcyB3aGljaCB3aWxsIGJlIHJlY2xhaW1lZCB3aGVuIHRoZSBwb29sIGlzCisgIC8vIGRlc3Ryb3llZC4KKyAgdm9pZCogQWxsb2NhdGVCeXRlcyhpbnQgc2l6ZSk7Cit9OworCisvLyBDb250YWlucyB0YWJsZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGZpbGUuICBUaGVzZSB0YWJsZXMgYXJlIG5vdAorLy8gbW9kaWZpZWQgb25jZSB0aGUgZmlsZSBoYXMgYmVlbiBjb25zdHJ1Y3RlZCwgc28gdGhleSBuZWVkIG5vdCBiZQorLy8gcHJvdGVjdGVkIGJ5IGEgbXV0ZXguICBUaGlzIG1ha2VzIG9wZXJhdGlvbnMgdGhhdCBkZXBlbmQgb25seSBvbiB0aGUKKy8vIGNvbnRlbnRzIG9mIGEgc2luZ2xlIGZpbGUgLS0gZS5nLiBEZXNjcmlwdG9yOjpGaW5kRmllbGRCeU5hbWUoKSAtLQorLy8gbG9jay1mcmVlLgorLy8KKy8vIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgbWV0aG9kcyBvZgorLy8gRmlsZURlc2NyaXB0b3JUYWJsZXMgYW5kIERlc2NyaXB0b3JQb29sOjpUYWJsZXMgYXJlIGludGVybGVhdmVkIGJlbG93LgorLy8gVGhlc2UgdXNlZCB0byBiZSBhIHNpbmdsZSBjbGFzcy4KK2NsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGVzIHsKKyBwdWJsaWM6CisgIEZpbGVEZXNjcmlwdG9yVGFibGVzKCk7CisgIH5GaWxlRGVzY3JpcHRvclRhYmxlcygpOworCisgIC8vIEVtcHR5IHRhYmxlLCB1c2VkIHdpdGggcGxhY2Vob2xkZXIgZmlsZXMuCisgIHN0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyBrRW1wdHk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRmluZGluZyBpdGVtcy4KKworICAvLyBGaW5kIHN5bWJvbHMuICBUaGVzZSByZXR1cm4gYSBudWxsIFN5bWJvbCAoc3ltYm9sLklzTnVsbCgpIGlzIHRydWUpCisgIC8vIGlmIG5vdCBmb3VuZC4KKyAgaW5saW5lIFN5bWJvbCBGaW5kTmVzdGVkU3ltYm9sKGNvbnN0IHZvaWQqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGlubGluZSBTeW1ib2wgRmluZE5lc3RlZFN5bWJvbE9mVHlwZShjb25zdCB2b2lkKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2w6OlR5cGUgdHlwZSkgY29uc3Q7CisKKyAgLy8gVGhlc2UgcmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgorICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeU51bWJlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0OworICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoCisgICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIGxvd2VyY2FzZV9uYW1lKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKAorICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBjYW1lbGNhc2VfbmFtZSkgY29uc3Q7CisgIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOdW1iZXIoCisgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwgaW50IG51bWJlcikgY29uc3Q7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQWRkaW5nIGl0ZW1zLgorCisgIC8vIFRoZXNlIGFkZCBpdGVtcyB0byB0aGUgY29ycmVzcG9uZGluZyB0YWJsZXMuICBUaGV5IHJldHVybiBmYWxzZSBpZgorICAvLyB0aGUga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YWJsZS4gIEZvciBBZGRBbGlhc1VuZGVyUGFyZW50KCksIHRoZQorICAvLyBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb25lIHRoYXQgd2FzIGNvbnN0cnVjdGVkIHVzaW5nIEFsbG9jYXRlU3RyaW5nKCksCisgIC8vIGFzIGl0IHdpbGwgYmUgdXNlZCBhcyBhIGtleSBpbiB0aGUgc3ltYm9sc19ieV9wYXJlbnRfIG1hcCB3aXRob3V0IGNvcHlpbmcuCisgIGJvb2wgQWRkQWxpYXNVbmRlclBhcmVudChjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbCBzeW1ib2wpOworICBib29sIEFkZEZpZWxkQnlOdW1iZXIoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIGJvb2wgQWRkRW51bVZhbHVlQnlOdW1iZXIoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpOworCisgIC8vIEFkZHMgdGhlIGZpZWxkIHRvIHRoZSBsb3dlcmNhc2VfbmFtZSBhbmQgY2FtZWxjYXNlX25hbWUgbWFwcy4gIE5ldmVyCisgIC8vIGZhaWxzIGJlY2F1c2Ugd2UgYWxsb3cgZHVwbGljYXRlczsgdGhlIGZpcnN0IGZpZWxkIGJ5IHRoZSBuYW1lIHdpbnMuCisgIHZvaWQgQWRkRmllbGRCeVN0eWxpemVkTmFtZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyBwcml2YXRlOgorICBTeW1ib2xzQnlQYXJlbnRNYXAgICAgc3ltYm9sc19ieV9wYXJlbnRfOworICBGaWVsZHNCeU5hbWVNYXAgICAgICAgZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lXzsKKyAgRmllbGRzQnlOYW1lTWFwICAgICAgIGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV87CisgIEZpZWxkc0J5TnVtYmVyTWFwICAgICBmaWVsZHNfYnlfbnVtYmVyXzsgICAgICAgLy8gTm90IGluY2x1ZGluZyBleHRlbnNpb25zLgorICBFbnVtVmFsdWVzQnlOdW1iZXJNYXAgZW51bV92YWx1ZXNfYnlfbnVtYmVyXzsKK307CisKK0Rlc2NyaXB0b3JQb29sOjpUYWJsZXM6OlRhYmxlcygpCisgICAgLy8gU3RhcnQgc29tZSBoYXNoX21hcCBhbmQgaGFzaF9zZXQgb2JqZWN0cyB3aXRoIGEgc21hbGwgIyBvZiBidWNrZXRzCisgICAgOiBrbm93bl9iYWRfZmlsZXNfKDMpLAorICAgICAgZXh0ZW5zaW9uc19sb2FkZWRfZnJvbV9kYl8oMyksCisgICAgICBzeW1ib2xzX2J5X25hbWVfKDMpLAorICAgICAgZmlsZXNfYnlfbmFtZV8oMykge30KKworCitEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjp+VGFibGVzKCkgeworICBHT09HTEVfRENIRUNLKGNoZWNrcG9pbnRzXy5lbXB0eSgpKTsKKyAgLy8gTm90ZSB0aGF0IHRoZSBkZWxldGlvbiBvcmRlciBpcyBpbXBvcnRhbnQsIHNpbmNlIHRoZSBkZXN0cnVjdG9ycyBvZiBzb21lCisgIC8vIG1lc3NhZ2VzIG1heSByZWZlciB0byBvYmplY3RzIGluIGFsbG9jYXRpb25zXy4KKyAgU1RMRGVsZXRlRWxlbWVudHMoJm1lc3NhZ2VzXyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb2NhdGlvbnNfLnNpemUoKTsgaSsrKSB7CisgICAgb3BlcmF0b3IgZGVsZXRlKGFsbG9jYXRpb25zX1tpXSk7CisgIH0KKyAgU1RMRGVsZXRlRWxlbWVudHMoJnN0cmluZ3NfKTsKKyAgU1RMRGVsZXRlRWxlbWVudHMoJmZpbGVfdGFibGVzXyk7Cit9CisKK0ZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaWxlRGVzY3JpcHRvclRhYmxlcygpCisgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIGhhc2ggdGFibGVzIHRvIHN0YXJ0IG91dCB3aXRoIGEgc21hbGwgIyBvZiBidWNrZXRzCisgICAgOiBzeW1ib2xzX2J5X3BhcmVudF8oMyksCisgICAgICBmaWVsZHNfYnlfbG93ZXJjYXNlX25hbWVfKDMpLAorICAgICAgZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lXygzKSwKKyAgICAgIGZpZWxkc19ieV9udW1iZXJfKDMpLAorICAgICAgZW51bV92YWx1ZXNfYnlfbnVtYmVyXygzKSB7Cit9CisKK0ZpbGVEZXNjcmlwdG9yVGFibGVzOjp+RmlsZURlc2NyaXB0b3JUYWJsZXMoKSB7fQorCitjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyBGaWxlRGVzY3JpcHRvclRhYmxlczo6a0VtcHR5OworCit2b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZENoZWNrcG9pbnQoKSB7CisgIGNoZWNrcG9pbnRzXy5wdXNoX2JhY2soQ2hlY2tQb2ludCh0aGlzKSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6Q2xlYXJMYXN0Q2hlY2twb2ludCgpIHsKKyAgR09PR0xFX0RDSEVDSyghY2hlY2twb2ludHNfLmVtcHR5KCkpOworICBjaGVja3BvaW50c18ucG9wX2JhY2soKTsKKyAgaWYgKGNoZWNrcG9pbnRzXy5lbXB0eSgpKSB7CisgICAgLy8gQWxsIGNoZWNrcG9pbnRzIGhhdmUgYmVlbiBjbGVhcmVkOiB3ZSBjYW4gbm93IGNvbW1pdCBhbGwgb2YgdGhlIHBlbmRpbmcKKyAgICAvLyBkYXRhLgorICAgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKKyAgICBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOworICAgIGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OlJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpIHsKKyAgR09PR0xFX0RDSEVDSyghY2hlY2twb2ludHNfLmVtcHR5KCkpOworICBjb25zdCBDaGVja1BvaW50JiBjaGVja3BvaW50ID0gY2hlY2twb2ludHNfLmJhY2soKTsKKworICBmb3IgKGludCBpID0gY2hlY2twb2ludC5wZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgICAgaSA8IHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOworICAgICAgIGkrKykgeworICAgIHN5bWJvbHNfYnlfbmFtZV8uZXJhc2Uoc3ltYm9sc19hZnRlcl9jaGVja3BvaW50X1tpXSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IGNoZWNrcG9pbnQucGVuZGluZ19maWxlc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICAgICBpIDwgZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOworICAgICAgIGkrKykgeworICAgIGZpbGVzX2J5X25hbWVfLmVyYXNlKGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfW2ldKTsKKyAgfQorICBmb3IgKGludCBpID0gY2hlY2twb2ludC5wZW5kaW5nX2V4dGVuc2lvbnNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgICAgaSA8IGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOworICAgICAgIGkrKykgeworICAgIGV4dGVuc2lvbnNfLmVyYXNlKGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF9baV0pOworICB9CisKKyAgc3ltYm9sc19hZnRlcl9jaGVja3BvaW50Xy5yZXNpemUoCisgICAgICBjaGVja3BvaW50LnBlbmRpbmdfc3ltYm9sc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLnJlc2l6ZShjaGVja3BvaW50LnBlbmRpbmdfZmlsZXNfYmVmb3JlX2NoZWNrcG9pbnQpOworICBleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfLnJlc2l6ZSgKKyAgICAgIGNoZWNrcG9pbnQucGVuZGluZ19leHRlbnNpb25zX2JlZm9yZV9jaGVja3BvaW50KTsKKworICBTVExEZWxldGVDb250YWluZXJQb2ludGVycygKKyAgICAgIHN0cmluZ3NfLmJlZ2luKCkgKyBjaGVja3BvaW50LnN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnQsIHN0cmluZ3NfLmVuZCgpKTsKKyAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoCisgICAgICBtZXNzYWdlc18uYmVnaW4oKSArIGNoZWNrcG9pbnQubWVzc2FnZXNfYmVmb3JlX2NoZWNrcG9pbnQsCisgICAgICBtZXNzYWdlc18uZW5kKCkpOworICBTVExEZWxldGVDb250YWluZXJQb2ludGVycygKKyAgICAgIGZpbGVfdGFibGVzXy5iZWdpbigpICsgY2hlY2twb2ludC5maWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludCwKKyAgICAgIGZpbGVfdGFibGVzXy5lbmQoKSk7CisgIGZvciAoaW50IGkgPSBjaGVja3BvaW50LmFsbG9jYXRpb25zX2JlZm9yZV9jaGVja3BvaW50OworICAgICAgIGkgPCBhbGxvY2F0aW9uc18uc2l6ZSgpOworICAgICAgIGkrKykgeworICAgIG9wZXJhdG9yIGRlbGV0ZShhbGxvY2F0aW9uc19baV0pOworICB9CisKKyAgc3RyaW5nc18ucmVzaXplKGNoZWNrcG9pbnQuc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludCk7CisgIG1lc3NhZ2VzXy5yZXNpemUoY2hlY2twb2ludC5tZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGZpbGVfdGFibGVzXy5yZXNpemUoY2hlY2twb2ludC5maWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGFsbG9jYXRpb25zXy5yZXNpemUoY2hlY2twb2ludC5hbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGNoZWNrcG9pbnRzXy5wb3BfYmFjaygpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSBTeW1ib2wgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6RmluZFN5bWJvbChjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBjb25zdCBTeW1ib2wqIHJlc3VsdCA9IEZpbmRPck51bGwoc3ltYm9sc19ieV9uYW1lXywga2V5LmNfc3RyKCkpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICByZXR1cm4ga051bGxTeW1ib2w7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICpyZXN1bHQ7CisgIH0KK30KKworaW5saW5lIFN5bWJvbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZE5lc3RlZFN5bWJvbCgKKyAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBjb25zdCBTeW1ib2wqIHJlc3VsdCA9CisgICAgRmluZE9yTnVsbChzeW1ib2xzX2J5X3BhcmVudF8sIFBvaW50ZXJTdHJpbmdQYWlyKHBhcmVudCwgbmFtZS5jX3N0cigpKSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIHJldHVybiBrTnVsbFN5bWJvbDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKnJlc3VsdDsKKyAgfQorfQorCitpbmxpbmUgU3ltYm9sIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKAorICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBTeW1ib2w6OlR5cGUgdHlwZSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gRmluZE5lc3RlZFN5bWJvbChwYXJlbnQsIG5hbWUpOworICBpZiAocmVzdWx0LnR5cGUgIT0gdHlwZSkgcmV0dXJuIGtOdWxsU3ltYm9sOworICByZXR1cm4gcmVzdWx0OworfQorCitTeW1ib2wgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6RmluZEJ5TmFtZUhlbHBlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2socG9vbC0+bXV0ZXhfKTsKKyAgU3ltYm9sIHJlc3VsdCA9IEZpbmRTeW1ib2wobmFtZSk7CisKKyAgaWYgKHJlc3VsdC5Jc051bGwoKSAmJiBwb29sLT51bmRlcmxheV8gIT0gTlVMTCkgeworICAgIC8vIFN5bWJvbCBub3QgZm91bmQ7IGNoZWNrIHRoZSB1bmRlcmxheS4KKyAgICByZXN1bHQgPQorICAgICAgcG9vbC0+dW5kZXJsYXlfLT50YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHBvb2wtPnVuZGVybGF5XywgbmFtZSk7CisgIH0KKworICBpZiAocmVzdWx0LklzTnVsbCgpKSB7CisgICAgLy8gU3ltYm9sIHN0aWxsIG5vdCBmb3VuZCwgc28gY2hlY2sgZmFsbGJhY2sgZGF0YWJhc2UuCisgICAgaWYgKHBvb2wtPlRyeUZpbmRTeW1ib2xJbkZhbGxiYWNrRGF0YWJhc2UobmFtZSkpIHsKKyAgICAgIHJlc3VsdCA9IEZpbmRTeW1ib2wobmFtZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kRmlsZSgKKyAgICBjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICByZXR1cm4gRmluZFB0ck9yTnVsbChmaWxlc19ieV9uYW1lXywga2V5LmNfc3RyKCkpOworfQorCitpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZEZpZWxkQnlOdW1iZXIoCisgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LCBpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGZpZWxkc19ieV9udW1iZXJfLCBtYWtlX3BhaXIocGFyZW50LCBudW1iZXIpKTsKK30KKworaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKKyAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbG93ZXJjYXNlX25hbWUpIGNvbnN0IHsKKyAgcmV0dXJuIEZpbmRQdHJPck51bGwoZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclN0cmluZ1BhaXIocGFyZW50LCBsb3dlcmNhc2VfbmFtZS5jX3N0cigpKSk7Cit9CisKK2lubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoCisgICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIGNhbWVsY2FzZV9uYW1lKSBjb25zdCB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV8sCisgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJTdHJpbmdQYWlyKHBhcmVudCwgY2FtZWxjYXNlX25hbWUuY19zdHIoKSkpOworfQorCitpbmxpbmUgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRFbnVtVmFsdWVCeU51bWJlcigKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LCBpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGVudW1fdmFsdWVzX2J5X251bWJlcl8sIG1ha2VfcGFpcihwYXJlbnQsIG51bWJlcikpOworfQorCitpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kRXh0ZW5zaW9uKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGV4dGVuc2lvbnNfLCBtYWtlX3BhaXIoZXh0ZW5kZWUsIG51bWJlcikpOworfQorCitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kQWxsRXh0ZW5zaW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0IHsKKyAgRXh0ZW5zaW9uc0dyb3VwZWRCeURlc2NyaXB0b3JNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIGV4dGVuc2lvbnNfLmxvd2VyX2JvdW5kKG1ha2VfcGFpcihleHRlbmRlZSwgMCkpOworICBmb3IgKDsgaXQgIT0gZXh0ZW5zaW9uc18uZW5kKCkgJiYgaXQtPmZpcnN0LmZpcnN0ID09IGV4dGVuZGVlOyArK2l0KSB7CisgICAgb3V0LT5wdXNoX2JhY2soaXQtPnNlY29uZCk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitib29sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZFN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwgU3ltYm9sIHN5bWJvbCkgeworICBpZiAoSW5zZXJ0SWZOb3RQcmVzZW50KCZzeW1ib2xzX2J5X25hbWVfLCBmdWxsX25hbWUuY19zdHIoKSwgc3ltYm9sKSkgeworICAgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8ucHVzaF9iYWNrKGZ1bGxfbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6QWRkQWxpYXNVbmRlclBhcmVudCgKKyAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSwgU3ltYm9sIHN5bWJvbCkgeworICBQb2ludGVyU3RyaW5nUGFpciBieV9wYXJlbnRfa2V5KHBhcmVudCwgbmFtZS5jX3N0cigpKTsKKyAgcmV0dXJuIEluc2VydElmTm90UHJlc2VudCgmc3ltYm9sc19ieV9wYXJlbnRfLCBieV9wYXJlbnRfa2V5LCBzeW1ib2wpOworfQorCitib29sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZEZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKEluc2VydElmTm90UHJlc2VudCgmZmlsZXNfYnlfbmFtZV8sIGZpbGUtPm5hbWUoKS5jX3N0cigpLCBmaWxlKSkgeworICAgIGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLnB1c2hfYmFjayhmaWxlLT5uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkFkZEZpZWxkQnlTdHlsaXplZE5hbWVzKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgY29uc3Qgdm9pZCogcGFyZW50OworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgaWYgKGZpZWxkLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7CisgICAgICBwYXJlbnQgPSBmaWVsZC0+ZmlsZSgpOworICAgIH0gZWxzZSB7CisgICAgICBwYXJlbnQgPSBmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHBhcmVudCA9IGZpZWxkLT5jb250YWluaW5nX3R5cGUoKTsKKyAgfQorCisgIFBvaW50ZXJTdHJpbmdQYWlyIGxvd2VyY2FzZV9rZXkocGFyZW50LCBmaWVsZC0+bG93ZXJjYXNlX25hbWUoKS5jX3N0cigpKTsKKyAgSW5zZXJ0SWZOb3RQcmVzZW50KCZmaWVsZHNfYnlfbG93ZXJjYXNlX25hbWVfLCBsb3dlcmNhc2Vfa2V5LCBmaWVsZCk7CisKKyAgUG9pbnRlclN0cmluZ1BhaXIgY2FtZWxjYXNlX2tleShwYXJlbnQsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpLmNfc3RyKCkpOworICBJbnNlcnRJZk5vdFByZXNlbnQoJmZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV8sIGNhbWVsY2FzZV9rZXksIGZpZWxkKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6QWRkRmllbGRCeU51bWJlcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIERlc2NyaXB0b3JJbnRQYWlyIGtleShmaWVsZC0+Y29udGFpbmluZ190eXBlKCksIGZpZWxkLT5udW1iZXIoKSk7CisgIHJldHVybiBJbnNlcnRJZk5vdFByZXNlbnQoJmZpZWxkc19ieV9udW1iZXJfLCBrZXksIGZpZWxkKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6QWRkRW51bVZhbHVlQnlOdW1iZXIoCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIHsKKyAgRW51bUludFBhaXIga2V5KHZhbHVlLT50eXBlKCksIHZhbHVlLT5udW1iZXIoKSk7CisgIHJldHVybiBJbnNlcnRJZk5vdFByZXNlbnQoJmVudW1fdmFsdWVzX2J5X251bWJlcl8sIGtleSwgdmFsdWUpOworfQorCitib29sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIERlc2NyaXB0b3JJbnRQYWlyIGtleShmaWVsZC0+Y29udGFpbmluZ190eXBlKCksIGZpZWxkLT5udW1iZXIoKSk7CisgIGlmIChJbnNlcnRJZk5vdFByZXNlbnQoJmV4dGVuc2lvbnNfLCBrZXksIGZpZWxkKSkgeworICAgIGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8ucHVzaF9iYWNrKGtleSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlKCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUeXBlKj4oQWxsb2NhdGVCeXRlcyhzaXplb2YoVHlwZSkpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlQXJyYXkoaW50IGNvdW50KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFR5cGUqPihBbGxvY2F0ZUJ5dGVzKHNpemVvZihUeXBlKSAqIGNvdW50KSk7Cit9CisKK3N0cmluZyogRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWxsb2NhdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBzdHJpbmcqIHJlc3VsdCA9IG5ldyBzdHJpbmcodmFsdWUpOworICBzdHJpbmdzXy5wdXNoX2JhY2socmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlTWVzc2FnZShUeXBlKiBkdW1teSkgeworICBUeXBlKiByZXN1bHQgPSBuZXcgVHlwZTsKKyAgbWVzc2FnZXNfLnB1c2hfYmFjayhyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitGaWxlRGVzY3JpcHRvclRhYmxlcyogRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWxsb2NhdGVGaWxlVGFibGVzKCkgeworICBGaWxlRGVzY3JpcHRvclRhYmxlcyogcmVzdWx0ID0gbmV3IEZpbGVEZXNjcmlwdG9yVGFibGVzOworICBmaWxlX3RhYmxlc18ucHVzaF9iYWNrKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlQnl0ZXMoaW50IHNpemUpIHsKKyAgLy8gVE9ETyhrZW50b24pOiAgV291bGQgaXQgYmUgd29ydGh3aGlsZSB0byBpbXBsZW1lbnQgdGhpcyBpbiBzb21lIG1vcmUKKyAgLy8gc29waGlzdGljYXRlZCB3YXk/ICBQcm9iYWJseSBub3QgZm9yIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLCBidXQgZm9yCisgIC8vIGludGVybmFsIHVzZSB3ZSBjb3VsZCBlYXNpbHkgcGx1ZyBpbiBvbmUgb2Ygb3VyIGV4aXN0aW5nIG1lbW9yeSBwb29sCisgIC8vIGFsbG9jYXRvcnMuLi4KKyAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgdm9pZCogcmVzdWx0ID0gb3BlcmF0b3IgbmV3KHNpemUpOworICBhbGxvY2F0aW9uc18ucHVzaF9iYWNrKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlc2NyaXB0b3JQb29sCisKK0Rlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6fkVycm9yQ29sbGVjdG9yKCkge30KKworRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKCkKKyAgOiBtdXRleF8oTlVMTCksCisgICAgZmFsbGJhY2tfZGF0YWJhc2VfKE5VTEwpLAorICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKKyAgICB1bmRlcmxheV8oTlVMTCksCisgICAgdGFibGVzXyhuZXcgVGFibGVzKSwKKyAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCisgICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpIHt9CisKK0Rlc2NyaXB0b3JQb29sOjpEZXNjcmlwdG9yUG9vbChEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCisgIDogbXV0ZXhfKG5ldyBNdXRleCksCisgICAgZmFsbGJhY2tfZGF0YWJhc2VfKGZhbGxiYWNrX2RhdGFiYXNlKSwKKyAgICBkZWZhdWx0X2Vycm9yX2NvbGxlY3Rvcl8oZXJyb3JfY29sbGVjdG9yKSwKKyAgICB1bmRlcmxheV8oTlVMTCksCisgICAgdGFibGVzXyhuZXcgVGFibGVzKSwKKyAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCisgICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpIHsKK30KKworRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkKKyAgOiBtdXRleF8oTlVMTCksCisgICAgZmFsbGJhY2tfZGF0YWJhc2VfKE5VTEwpLAorICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKKyAgICB1bmRlcmxheV8odW5kZXJsYXkpLAorICAgIHRhYmxlc18obmV3IFRhYmxlcyksCisgICAgZW5mb3JjZV9kZXBlbmRlbmNpZXNfKHRydWUpLAorICAgIGFsbG93X3Vua25vd25fKGZhbHNlKSB7fQorCitEZXNjcmlwdG9yUG9vbDo6fkRlc2NyaXB0b3JQb29sKCkgeworICBpZiAobXV0ZXhfICE9IE5VTEwpIGRlbGV0ZSBtdXRleF87Cit9CisKKy8vIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoKSBkZWZpbmVkIGxhdGVyLgorLy8gRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoKSBkZWZpbmVkIGxhdGVyLgorCit2b2lkIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbERvbnRFbmZvcmNlRGVwZW5kZW5jaWVzKCkgeworICBlbmZvcmNlX2RlcGVuZGVuY2llc18gPSBmYWxzZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxJc0ZpbGVMb2FkZWQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgY29uc3QgeworICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisgIHJldHVybiB0YWJsZXNfLT5GaW5kRmlsZShmaWxlbmFtZSkgIT0gTlVMTDsKK30KKworLy8gZ2VuZXJhdGVkX3Bvb2wgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCituYW1lc3BhY2UgeworCisKK0VuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UqIGdlbmVyYXRlZF9kYXRhYmFzZV8gPSBOVUxMOworRGVzY3JpcHRvclBvb2wqIGdlbmVyYXRlZF9wb29sXyA9IE5VTEw7CitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKGdlbmVyYXRlZF9wb29sX2luaXRfKTsKKwordm9pZCBEZWxldGVHZW5lcmF0ZWRQb29sKCkgeworICBkZWxldGUgZ2VuZXJhdGVkX2RhdGFiYXNlXzsKKyAgZ2VuZXJhdGVkX2RhdGFiYXNlXyA9IE5VTEw7CisgIGRlbGV0ZSBnZW5lcmF0ZWRfcG9vbF87CisgIGdlbmVyYXRlZF9wb29sXyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIEluaXRHZW5lcmF0ZWRQb29sKCkgeworICBnZW5lcmF0ZWRfZGF0YWJhc2VfID0gbmV3IEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U7CisgIGdlbmVyYXRlZF9wb29sXyA9IG5ldyBEZXNjcmlwdG9yUG9vbChnZW5lcmF0ZWRfZGF0YWJhc2VfKTsKKworICBpbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlR2VuZXJhdGVkUG9vbCk7Cit9CisKK2lubGluZSB2b2lkIEluaXRHZW5lcmF0ZWRQb29sT25jZSgpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmZ2VuZXJhdGVkX3Bvb2xfaW5pdF8sICZJbml0R2VuZXJhdGVkUG9vbCk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworY29uc3QgRGVzY3JpcHRvclBvb2wqIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpIHsKKyAgSW5pdEdlbmVyYXRlZFBvb2xPbmNlKCk7CisgIHJldHVybiBnZW5lcmF0ZWRfcG9vbF87Cit9CisKK0Rlc2NyaXB0b3JQb29sKiBEZXNjcmlwdG9yUG9vbDo6aW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKSB7CisgIEluaXRHZW5lcmF0ZWRQb29sT25jZSgpOworICByZXR1cm4gZ2VuZXJhdGVkX3Bvb2xfOworfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCisgICAgY29uc3Qgdm9pZCogZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIGludCBzaXplKSB7CisgIC8vIFNvLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBpbml0aWFsaXppbmcgdGhlCisgIC8vIGRlc2NyaXB0b3JzIGZvciBnZW5lcmF0ZWQgcHJvdG8gY2xhc3Nlcy4gIEVhY2ggZ2VuZXJhdGVkIC5wYi5jYyBmaWxlCisgIC8vIGhhcyBhbiBpbnRlcm5hbCBwcm9jZWR1cmUgY2FsbGVkIEFkZERlc2NyaXB0b3JzKCkgd2hpY2ggaXMgY2FsbGVkIGF0CisgIC8vIHByb2Nlc3Mgc3RhcnR1cCwgYW5kIHRoYXQgZnVuY3Rpb24gY2FsbHMgdGhpcyBvbmUgaW4gb3JkZXIgdG8gcmVnaXN0ZXIKKyAgLy8gdGhlIHJhdyBieXRlcyBvZiB0aGUgRmlsZURlc2NyaXB0b3JQcm90byByZXByZXNlbnRpbmcgdGhlIGZpbGUuCisgIC8vCisgIC8vIFdlIGRvIG5vdCBhY3R1YWxseSBjb25zdHJ1Y3QgdGhlIGRlc2NyaXB0b3Igb2JqZWN0cyByaWdodCBhd2F5LiAgV2UganVzdAorICAvLyBoYW5nIG9uIHRvIHRoZSBieXRlcyB1bnRpbCB0aGV5IGFyZSBhY3R1YWxseSBuZWVkZWQuICBXZSBhY3R1YWxseSBjb25zdHJ1Y3QKKyAgLy8gdGhlIGRlc2NyaXB0b3IgdGhlIGZpcnN0IHRpbWUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhpbmdzIGhhcHBlbnM6CisgIC8vICogU29tZW9uZSBjYWxscyBhIG1ldGhvZCBsaWtlIGRlc2NyaXB0b3IoKSwgR2V0RGVzY3JpcHRvcigpLCBvcgorICAvLyAgIEdldFJlZmxlY3Rpb24oKSBvbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLCB3aGljaCByZXF1aXJlcyByZXR1cm5pbmcgdGhlCisgIC8vICAgZGVzY3JpcHRvciBvciBhbiBvYmplY3QgYmFzZWQgb24gaXQuCisgIC8vICogU29tZW9uZSBsb29rcyB1cCB0aGUgZGVzY3JpcHRvciBpbiBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS4KKyAgLy8KKyAgLy8gT25jZSBvbmUgb2YgdGhlc2UgaGFwcGVucywgdGhlIERlc2NyaXB0b3JQb29sIGFjdHVhbGx5IHBhcnNlcyB0aGUKKyAgLy8gRmlsZURlc2NyaXB0b3JQcm90byBhbmQgZ2VuZXJhdGVzIGEgRmlsZURlc2NyaXB0b3IgKGFuZCBhbGwgaXRzIGNoaWxkcmVuKQorICAvLyBiYXNlZCBvbiBpdC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IEZpbGVEZXNjcmlwdG9yUHJvdG8gaXMgaXRzZWxmIGEgZ2VuZXJhdGVkIHByb3RvY29sIG1lc3NhZ2UuCisgIC8vIFRoZXJlZm9yZSwgd2hlbiB3ZSBwYXJzZSBvbmUsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHRvIGF2b2lkIHVzaW5nCisgIC8vIGFueSBkZXNjcmlwdG9yLWJhc2VkIG9wZXJhdGlvbnMsIHNpbmNlIHRoaXMgbWlnaHQgY2F1c2UgaW5maW5pdGUgcmVjdXJzaW9uCisgIC8vIG9yIGRlYWRsb2NrLgorICBJbml0R2VuZXJhdGVkUG9vbE9uY2UoKTsKKyAgR09PR0xFX0NIRUNLKGdlbmVyYXRlZF9kYXRhYmFzZV8tPkFkZChlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgc2l6ZSkpOworfQorCisKKy8vIEZpbmQqQnkqIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVE9ETyhrZW50b24pOiAgVGhlcmUncyBhIGxvdCBvZiByZXBlYXRlZCBjb2RlIGhlcmUsIGJ1dCBJJ20gbm90IHN1cmUgaWYKKy8vICAgdGhlcmUncyBhbnkgZ29vZCB3YXkgdG8gZmFjdG9yIGl0IG91dC4gIFRoaW5rIGFib3V0IHRoaXMgc29tZSB0aW1lIHdoZW4KKy8vICAgdGhlcmUncyBub3RoaW5nIG1vcmUgaW1wb3J0YW50IHRvIGRvIChyZWFkOiBuZXZlcikuCisKK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRGaWxlKG5hbWUpOworICBpZiAocmVzdWx0ICE9IE5VTEwpIHJldHVybiByZXN1bHQ7CisgIGlmICh1bmRlcmxheV8gIT0gTlVMTCkgeworICAgIHJlc3VsdCA9IHVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUobmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OworICB9CisgIGlmIChUcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShuYW1lKSkgeworICAgIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRGaWxlKG5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgcmV0dXJuIHJlc3VsdDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSkgY29uc3QgeworICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKHN5bWJvbF9uYW1lKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHJldHVybiByZXN1bHQuR2V0RmlsZSgpOworICBpZiAodW5kZXJsYXlfICE9IE5VTEwpIHsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9yZXN1bHQgPQorICAgICAgdW5kZXJsYXlfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3ltYm9sX25hbWUpOworICAgIGlmIChmaWxlX3Jlc3VsdCAhPSBOVUxMKSByZXR1cm4gZmlsZV9yZXN1bHQ7CisgIH0KKyAgaWYgKFRyeUZpbmRTeW1ib2xJbkZhbGxiYWNrRGF0YWJhc2Uoc3ltYm9sX25hbWUpKSB7CisgICAgcmVzdWx0ID0gdGFibGVzXy0+RmluZFN5bWJvbChzeW1ib2xfbmFtZSk7CisgICAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHJldHVybiByZXN1bHQuR2V0RmlsZSgpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZE1lc3NhZ2VUeXBlQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKTsKKyAgcmV0dXJuIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6Ok1FU1NBR0UpID8gcmVzdWx0LmRlc2NyaXB0b3IgOiBOVUxMOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRmllbGRCeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOworICBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpGSUVMRCAmJgorICAgICAgIXJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiByZXN1bHQuZmllbGRfZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKTsKKyAgaWYgKHJlc3VsdC50eXBlID09IFN5bWJvbDo6RklFTEQgJiYKKyAgICAgIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiByZXN1bHQuZmllbGRfZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBFbnVtRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSk7CisgIHJldHVybiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpFTlVNKSA/IHJlc3VsdC5lbnVtX2Rlc2NyaXB0b3IgOiBOVUxMOworfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEVudW1WYWx1ZUJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSk7CisgIHJldHVybiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpFTlVNX1ZBTFVFKSA/CisgICAgcmVzdWx0LmVudW1fdmFsdWVfZGVzY3JpcHRvciA6IE5VTEw7Cit9CisKK2NvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZFNlcnZpY2VCeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOworICByZXR1cm4gKHJlc3VsdC50eXBlID09IFN5bWJvbDo6U0VSVklDRSkgPyByZXN1bHQuc2VydmljZV9kZXNjcmlwdG9yIDogTlVMTDsKK30KKworY29uc3QgTWV0aG9kRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRNZXRob2RCeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOworICByZXR1cm4gKHJlc3VsdC50eXBlID09IFN5bWJvbDo6TUVUSE9EKSA/IHJlc3VsdC5tZXRob2RfZGVzY3JpcHRvciA6IE5VTEw7Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeU51bWJlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgaW50IG51bWJlcikgY29uc3QgeworICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEV4dGVuc2lvbihleHRlbmRlZSwgbnVtYmVyKTsKKyAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAodW5kZXJsYXlfICE9IE5VTEwpIHsKKyAgICByZXN1bHQgPSB1bmRlcmxheV8tPkZpbmRFeHRlbnNpb25CeU51bWJlcihleHRlbmRlZSwgbnVtYmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKFRyeUZpbmRFeHRlbnNpb25JbkZhbGxiYWNrRGF0YWJhc2UoZXh0ZW5kZWUsIG51bWJlcikpIHsKKyAgICByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRXh0ZW5zaW9uKGV4dGVuZGVlLCBudW1iZXIpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OkZpbmRBbGxFeHRlbnNpb25zKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3QgeworICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisKKyAgLy8gSW5pdGlhbGl6ZSB0YWJsZXNfLT5leHRlbnNpb25zXyBmcm9tIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBmaXJzdAorICAvLyAoYnV0IGRvIHRoaXMgb25seSBvbmNlIHBlciBkZXNjcmlwdG9yKS4KKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyAhPSBOVUxMICYmCisgICAgICB0YWJsZXNfLT5leHRlbnNpb25zX2xvYWRlZF9mcm9tX2RiXy5jb3VudChleHRlbmRlZSkgPT0gMCkgeworICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoZXh0ZW5kZWUtPmZ1bGxfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJzKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGludCBudW1iZXIgPSBudW1iZXJzW2ldOworICAgICAgICBpZiAodGFibGVzXy0+RmluZEV4dGVuc2lvbihleHRlbmRlZSwgbnVtYmVyKSA9PSBOVUxMKSB7CisgICAgICAgICAgVHJ5RmluZEV4dGVuc2lvbkluRmFsbGJhY2tEYXRhYmFzZShleHRlbmRlZSwgbnVtYmVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGFibGVzXy0+ZXh0ZW5zaW9uc19sb2FkZWRfZnJvbV9kYl8uaW5zZXJ0KGV4dGVuZGVlKTsKKyAgICB9CisgIH0KKworICB0YWJsZXNfLT5GaW5kQWxsRXh0ZW5zaW9ucyhleHRlbmRlZSwgb3V0KTsKKyAgaWYgKHVuZGVybGF5XyAhPSBOVUxMKSB7CisgICAgdW5kZXJsYXlfLT5GaW5kQWxsRXh0ZW5zaW9ucyhleHRlbmRlZSwgb3V0KTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioKK0Rlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TnVtYmVyKGludCBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZEZpZWxkQnlOdW1iZXIodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8IHJlc3VsdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioKK0Rlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8IHJlc3VsdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioKK0Rlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8IHJlc3VsdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioKK0Rlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkZJRUxEKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkgJiYgIXJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiByZXN1bHQuZmllbGRfZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPQorICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6RklFTEQpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSAmJiByZXN1bHQuZmllbGRfZGVzY3JpcHRvci0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKgorRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFyZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSh0aGlzLCBrZXkpOworICBpZiAocmVzdWx0ID09IE5VTEwgfHwgIXJlc3VsdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2NvbnN0IERlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kTmVzdGVkVHlwZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6Ok1FU1NBR0UpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgeworICAgIHJldHVybiByZXN1bHQuZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBFbnVtRGVzY3JpcHRvcioKK0Rlc2NyaXB0b3I6OkZpbmRFbnVtVHlwZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkVOVU0pOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgeworICAgIHJldHVybiByZXN1bHQuZW51bV9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRW51bVZhbHVlQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPQorICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6RU5VTV9WQUxVRSk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcioKK0VudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpFTlVNX1ZBTFVFKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LmVudW1fdmFsdWVfZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKgorRW51bURlc2NyaXB0b3I6OkZpbmRWYWx1ZUJ5TnVtYmVyKGludCBrZXkpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGUoKS0+dGFibGVzXy0+RmluZEVudW1WYWx1ZUJ5TnVtYmVyKHRoaXMsIGtleSk7Cit9CisKK2NvbnN0IE1ldGhvZERlc2NyaXB0b3IqCitTZXJ2aWNlRGVzY3JpcHRvcjo6RmluZE1ldGhvZEJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6Ok1FVEhPRCk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5tZXRob2RfZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBEZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3I6OkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6TUVTU0FHRSk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEVudW1EZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3I6OkZpbmRFbnVtVHlwZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6RU5VTSk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5lbnVtX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcioKK0ZpbGVEZXNjcmlwdG9yOjpGaW5kRW51bVZhbHVlQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPQorICAgIHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkVOVU1fVkFMVUUpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgeworICAgIHJldHVybiByZXN1bHQuZW51bV92YWx1ZV9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3I6OkZpbmRTZXJ2aWNlQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpTRVJWSUNFKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LnNlcnZpY2VfZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6RklFTEQpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSAmJiByZXN1bHQuZmllbGRfZGVzY3JpcHRvci0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFyZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSh0aGlzLCBrZXkpOworICBpZiAocmVzdWx0ID09IE5VTEwgfHwgIXJlc3VsdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2Jvb2wgRGVzY3JpcHRvcjo6SXNFeHRlbnNpb25OdW1iZXIoaW50IG51bWJlcikgY29uc3QgeworICAvLyBMaW5lYXIgc2VhcmNoIHNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UgZG9uJ3QgZXhwZWN0IGEgbWVzc2FnZSB0byBoYXZlCisgIC8vIG1vcmUgdGhhbiBhIGNvdXBsZSBleHRlbnNpb24gcmFuZ2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAobnVtYmVyID49IGV4dGVuc2lvbl9yYW5nZShpKS0+c3RhcnQgJiYKKyAgICAgICAgbnVtYmVyIDwgIGV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OlRyeUZpbmRGaWxlSW5GYWxsYmFja0RhdGFiYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBpZiAoZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICBpZiAodGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jb3VudChuYW1lKSA+IDApIHJldHVybiBmYWxzZTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGlmICghZmFsbGJhY2tfZGF0YWJhc2VfLT5GaW5kRmlsZUJ5TmFtZShuYW1lLCAmZmlsZV9wcm90bykgfHwKKyAgICAgIEJ1aWxkRmlsZUZyb21EYXRhYmFzZShmaWxlX3Byb3RvKSA9PSBOVUxMKSB7CisgICAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5pbnNlcnQobmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OklzU3ViU3ltYm9sT2ZCdWlsdFR5cGUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIHN0cmluZyBwcmVmaXggPSBuYW1lOworICBmb3IgKDs7KSB7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHByZWZpeC5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgICBpZiAoZG90X3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmVmaXggPSBwcmVmaXguc3Vic3RyKDAsIGRvdF9wb3MpOworICAgIFN5bWJvbCBzeW1ib2wgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKHByZWZpeCk7CisgICAgLy8gSWYgdGhlIHN5bWJvbCB0eXBlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gUEFDS0FHRSwgdGhlbiBpdHMgY29tcGxldGUKKyAgICAvLyBkZWZpbml0aW9uIGlzIGFscmVhZHkga25vd24uCisgICAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgIT0gU3ltYm9sOjpQQUNLQUdFKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKHVuZGVybGF5XyAhPSBOVUxMKSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBwcmVmaXggb2YgdGhpcyBzeW1ib2wgZXhpc3RzIGluIHRoZSB1bmRlcmxheS4KKyAgICByZXR1cm4gdW5kZXJsYXlfLT5Jc1N1YlN5bWJvbE9mQnVpbHRUeXBlKG5hbWUpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbDo6VHJ5RmluZFN5bWJvbEluRmFsbGJhY2tEYXRhYmFzZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gV2Ugc2tpcCBsb29raW5nIGluIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBpZiB0aGUgbmFtZSBpcyBhIHN1Yi1zeW1ib2wgb2YKKyAgLy8gYW55IGRlc2NyaXB0b3IgdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGVzY3JpcHRvciBwb29sIChleGNlcHQgZm9yCisgIC8vIHBhY2thZ2UgZGVzY3JpcHRvcnMpLiAgVGhpcyBpcyB2YWxpZCBiZWNhdXNlIGFsbCBzeW1ib2xzIGV4Y2VwdCBmb3IKKyAgLy8gcGFja2FnZXMgYXJlIGRlZmluZWQgaW4gYSBzaW5nbGUgZmlsZSwgc28gaWYgdGhlIHN5bWJvbCBleGlzdHMgdGhlbiB3ZQorICAvLyBzaG91bGQgYWxyZWFkeSBoYXZlIGl0cyBkZWZpbml0aW9uLgorICAvLworICAvLyBUaGUgb3RoZXIgcmVhc29uIHRvIGRvIHRoaXMgaXMgdG8gc3VwcG9ydCAib3ZlcnJpZGluZyIgdHlwZSBkZWZpbml0aW9ucworICAvLyBieSBtZXJnaW5nIHR3byBkYXRhYmFzZXMgdGhhdCBkZWZpbmUgdGhlIHNhbWUgdHlwZS4gIChZZXMsIHBlb3BsZSBkbworICAvLyB0aGlzLikgIFRoZSBtYWluIGRpZmZpY3VsdHkgd2l0aCBtYWtpbmcgdGhpcyB3b3JrIGlzIHRoYXQKKyAgLy8gRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgaXMgYWxsb3dlZCB0byByZXR1cm4gYm90aCBmYWxzZSBwb3NpdGl2ZXMKKyAgLy8gKGUuZy4sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSwgVXBncmFkZWREZXNjcmlwdG9yRGF0YWJhc2UpIGFuZCBmYWxzZQorICAvLyBuZWdhdGl2ZXMgKGUuZy4gUHJvdG9GaWxlUGFyc2VyLCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKS4gIFdoZW4gdHdvCisgIC8vIHN1Y2ggZGF0YWJhc2VzIGFyZSBtZXJnZWQsIGxvb2tpbmcgdXAgYSBub24tZXhpc3RlbnQgc3ViLXN5bWJvbCBvZiBhIHR5cGUKKyAgLy8gdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGVzY3JpcHRvciBwb29sIGNhbiByZXN1bHQgaW4gYW4gYXR0ZW1wdCB0bworICAvLyBsb2FkIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgY2hlY2sgYmVsb3cgYXZvaWRzIHRoaXMuCisgIGlmIChJc1N1YlN5bWJvbE9mQnVpbHRUeXBlKG5hbWUpKSByZXR1cm4gZmFsc2U7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBpZiAoIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKG5hbWUsICZmaWxlX3Byb3RvKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICh0YWJsZXNfLT5GaW5kRmlsZShmaWxlX3Byb3RvLm5hbWUoKSkgIT0gTlVMTCkgeworICAgIC8vIFdlJ3ZlIGFscmVhZHkgbG9hZGVkIHRoaXMgZmlsZSwgYW5kIGl0IGFwcGFyZW50bHkgZG9lc24ndCBjb250YWluIHRoZQorICAgIC8vIHN5bWJvbCB3ZSdyZSBsb29raW5nIGZvci4gIFNvbWUgRGVzY3JpcHRvckRhdGFiYXNlcyByZXR1cm4gZmFsc2UKKyAgICAvLyBwb3NpdGl2ZXMuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKEJ1aWxkRmlsZUZyb21EYXRhYmFzZShmaWxlX3Byb3RvKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OlRyeUZpbmRFeHRlbnNpb25JbkZhbGxiYWNrRGF0YWJhc2UoCisgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLCBpbnQgZmllbGRfbnVtYmVyKSBjb25zdCB7CisgIGlmIChmYWxsYmFja19kYXRhYmFzZV8gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgaWYgKCFmYWxsYmFja19kYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKKyAgICAgICAgY29udGFpbmluZ190eXBlLT5mdWxsX25hbWUoKSwgZmllbGRfbnVtYmVyLCAmZmlsZV9wcm90bykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAodGFibGVzXy0+RmluZEZpbGUoZmlsZV9wcm90by5uYW1lKCkpICE9IE5VTEwpIHsKKyAgICAvLyBXZSd2ZSBhbHJlYWR5IGxvYWRlZCB0aGlzIGZpbGUsIGFuZCBpdCBhcHBhcmVudGx5IGRvZXNuJ3QgY29udGFpbiB0aGUKKyAgICAvLyBleHRlbnNpb24gd2UncmUgbG9va2luZyBmb3IuICBTb21lIERlc2NyaXB0b3JEYXRhYmFzZXMgcmV0dXJuIGZhbHNlCisgICAgLy8gcG9zaXRpdmVzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChCdWlsZEZpbGVGcm9tRGF0YWJhc2UoZmlsZV9wcm90bykgPT0gTlVMTCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0cmluZyBGaWVsZERlc2NyaXB0b3I6OkRlZmF1bHRWYWx1ZUFzU3RyaW5nKGJvb2wgcXVvdGVfc3RyaW5nX3R5cGUpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKGhhc19kZWZhdWx0X3ZhbHVlKCkpIDw8ICJObyBkZWZhdWx0IHZhbHVlIjsKKyAgc3dpdGNoIChjcHBfdHlwZSgpKSB7CisgICAgY2FzZSBDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGRlZmF1bHRfdmFsdWVfaW50NjQoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZGVmYXVsdF92YWx1ZV91aW50MzIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQUFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZGVmYXVsdF92YWx1ZV91aW50NjQoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gU2ltcGxlRnRvYShkZWZhdWx0X3ZhbHVlX2Zsb2F0KCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUFBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBTaW1wbGVEdG9hKGRlZmF1bHRfdmFsdWVfZG91YmxlKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV9ib29sKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUFBUWVBFX1NUUklORzoKKyAgICAgIGlmIChxdW90ZV9zdHJpbmdfdHlwZSkgeworICAgICAgICByZXR1cm4gIlwiIiArIENFc2NhcGUoZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkgKyAiXCIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGUoKSA9PSBUWVBFX0JZVEVTKSB7CisgICAgICAgICAgcmV0dXJuIENFc2NhcGUoZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfc3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BQVFlQRV9FTlVNOgorICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfZW51bSgpLT5uYW1lKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQUFRZUEVfTUVTU0FHRToKKyAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcyEiOworICAgICAgYnJlYWs7CisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlOiBmYWlsZWQgdG8gZ2V0IGRlZmF1bHQgdmFsdWUgYXMgc3RyaW5nIjsKKyAgcmV0dXJuICIiOworfQorCisvLyBDb3B5VG8gbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRmlsZURlc2NyaXB0b3I6OkNvcHlUbyhGaWxlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKyAgaWYgKCFwYWNrYWdlKCkuZW1wdHkoKSkgcHJvdG8tPnNldF9wYWNrYWdlKHBhY2thZ2UoKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHByb3RvLT5hZGRfZGVwZW5kZW5jeShkZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBwcm90by0+YWRkX3B1YmxpY19kZXBlbmRlbmN5KHB1YmxpY19kZXBlbmRlbmNpZXNfW2ldKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2Vha19kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHByb3RvLT5hZGRfd2Vha19kZXBlbmRlbmN5KHdlYWtfZGVwZW5kZW5jaWVzX1tpXSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX2VudW1fdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgc2VydmljZShpKS0+Q29weVRvKHByb3RvLT5hZGRfc2VydmljZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb24oaSktPkNvcHlUbyhwcm90by0+YWRkX2V4dGVuc2lvbigpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3I6OkNvcHlTb3VyY2VDb2RlSW5mb1RvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIGlmIChzb3VyY2VfY29kZV9pbmZvXyAhPSAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAgIHByb3RvLT5tdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKS0+Q29weUZyb20oKnNvdXJjZV9jb2RlX2luZm9fKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3I6OkNvcHlUbyhEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGQoaSktPkNvcHlUbyhwcm90by0+YWRkX2ZpZWxkKCkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX25lc3RlZF90eXBlKCkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGVudW1fdHlwZShpKS0+Q29weVRvKHByb3RvLT5hZGRfZW51bV90eXBlKCkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlID0gcHJvdG8tPmFkZF9leHRlbnNpb25fcmFuZ2UoKTsKKyAgICByYW5nZS0+c2V0X3N0YXJ0KGV4dGVuc2lvbl9yYW5nZShpKS0+c3RhcnQpOworICAgIHJhbmdlLT5zZXRfZW5kKGV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb24oaSktPkNvcHlUbyhwcm90by0+YWRkX2V4dGVuc2lvbigpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpDb3B5VG8oRmllbGREZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOworICBwcm90by0+c2V0X251bWJlcihudW1iZXIoKSk7CisKKyAgLy8gU29tZSBjb21waWxlcnMgZG8gbm90IGFsbG93IHN0YXRpY19jYXN0IGRpcmVjdGx5IGJldHdlZW4gdHdvIGVudW0gdHlwZXMsCisgIC8vIHNvIHdlIG11c3QgY2FzdCB0byBpbnQgZmlyc3QuCisgIHByb3RvLT5zZXRfbGFiZWwoc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsPigKKyAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihsYWJlbCgpKSkpOworICBwcm90by0+c2V0X3R5cGUoc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGU+KAorICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4odHlwZSgpKSkpOworCisgIGlmIChpc19leHRlbnNpb24oKSkgeworICAgIGlmICghY29udGFpbmluZ190eXBlKCktPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXykgeworICAgICAgcHJvdG8tPnNldF9leHRlbmRlZSgiLiIpOworICAgIH0KKyAgICBwcm90by0+bXV0YWJsZV9leHRlbmRlZSgpLT5hcHBlbmQoY29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgfQorCisgIGlmIChjcHBfdHlwZSgpID09IENQUFRZUEVfTUVTU0FHRSkgeworICAgIGlmIChtZXNzYWdlX3R5cGUoKS0+aXNfcGxhY2Vob2xkZXJfKSB7CisgICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBrbm93IGlmIHRoZSB0eXBlIGlzIGEgbWVzc2FnZSB0eXBlLiAgSXQgY291bGQgYmUKKyAgICAgIC8vIGFuIGVudW0uCisgICAgICBwcm90by0+Y2xlYXJfdHlwZSgpOworICAgIH0KKworICAgIGlmICghbWVzc2FnZV90eXBlKCktPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXykgeworICAgICAgcHJvdG8tPnNldF90eXBlX25hbWUoIi4iKTsKKyAgICB9CisgICAgcHJvdG8tPm11dGFibGVfdHlwZV9uYW1lKCktPmFwcGVuZChtZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworICB9IGVsc2UgaWYgKGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9FTlVNKSB7CisgICAgaWYgKCFlbnVtX3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgICBwcm90by0+c2V0X3R5cGVfbmFtZSgiLiIpOworICAgIH0KKyAgICBwcm90by0+bXV0YWJsZV90eXBlX25hbWUoKS0+YXBwZW5kKGVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSk7CisgIH0KKworICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUoKSkgeworICAgIHByb3RvLT5zZXRfZGVmYXVsdF92YWx1ZShEZWZhdWx0VmFsdWVBc1N0cmluZyhmYWxzZSkpOworICB9CisKKyAgaWYgKCZvcHRpb25zKCkgIT0gJkZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3I6OkNvcHlUbyhFbnVtRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIHZhbHVlKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF92YWx1ZSgpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvcjo6Q29weVRvKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7CisgIHByb3RvLT5zZXRfbnVtYmVyKG51bWJlcigpKTsKKworICBpZiAoJm9wdGlvbnMoKSAhPSAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3I6OkNvcHlUbyhTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBtZXRob2QoaSktPkNvcHlUbyhwcm90by0+YWRkX21ldGhvZCgpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvcjo6Q29weVRvKE1ldGhvZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7CisKKyAgaWYgKCFpbnB1dF90eXBlKCktPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXykgeworICAgIHByb3RvLT5zZXRfaW5wdXRfdHlwZSgiLiIpOworICB9CisgIHByb3RvLT5tdXRhYmxlX2lucHV0X3R5cGUoKS0+YXBwZW5kKGlucHV0X3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworCisgIGlmICghb3V0cHV0X3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgcHJvdG8tPnNldF9vdXRwdXRfdHlwZSgiLiIpOworICB9CisgIHByb3RvLT5tdXRhYmxlX291dHB1dF90eXBlKCktPmFwcGVuZChvdXRwdXRfdHlwZSgpLT5mdWxsX25hbWUoKSk7CisKKyAgaWYgKCZvcHRpb25zKCkgIT0gJk1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKKyAgfQorfQorCisvLyBEZWJ1Z1N0cmluZyBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK25hbWVzcGFjZSB7CisKKy8vIFVzZWQgYnkgZWFjaCBvZiB0aGUgb3B0aW9uIGZvcm1hdHRlcnMuCitib29sIFJldHJpZXZlT3B0aW9ucyhpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlICZvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4gKm9wdGlvbl9lbnRyaWVzKSB7CisgIG9wdGlvbl9lbnRyaWVzLT5jbGVhcigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gb3B0aW9ucy5HZXRSZWZsZWN0aW9uKCk7CisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMob3B0aW9ucywgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgaW50IGNvdW50ID0gMTsKKyAgICBib29sIHJlcGVhdGVkID0gZmFsc2U7CisgICAgaWYgKGZpZWxkc1tpXS0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgY291bnQgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUob3B0aW9ucywgZmllbGRzW2ldKTsKKyAgICAgIHJlcGVhdGVkID0gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICBzdHJpbmcgZmllbGR2YWw7CisgICAgICBpZiAoZmllbGRzW2ldLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAgIHN0cmluZyB0bXA7CisgICAgICAgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgICAgICAgcHJpbnRlci5TZXRJbml0aWFsSW5kZW50TGV2ZWwoZGVwdGggKyAxKTsKKyAgICAgICAgcHJpbnRlci5QcmludEZpZWxkVmFsdWVUb1N0cmluZyhvcHRpb25zLCBmaWVsZHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWQgPyBqIDogLTEsICZ0bXApOworICAgICAgICBmaWVsZHZhbC5hcHBlbmQoIntcbiIpOworICAgICAgICBmaWVsZHZhbC5hcHBlbmQodG1wKTsKKyAgICAgICAgZmllbGR2YWwuYXBwZW5kKGRlcHRoICogMiwgJyAnKTsKKyAgICAgICAgZmllbGR2YWwuYXBwZW5kKCJ9Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBUZXh0Rm9ybWF0OjpQcmludEZpZWxkVmFsdWVUb1N0cmluZyhvcHRpb25zLCBmaWVsZHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkID8gaiA6IC0xLCAmZmllbGR2YWwpOworICAgICAgfQorICAgICAgc3RyaW5nIG5hbWU7CisgICAgICBpZiAoZmllbGRzW2ldLT5pc19leHRlbnNpb24oKSkgeworICAgICAgICBuYW1lID0gIiguIiArIGZpZWxkc1tpXS0+ZnVsbF9uYW1lKCkgKyAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gZmllbGRzW2ldLT5uYW1lKCk7CisgICAgICB9CisgICAgICBvcHRpb25fZW50cmllcy0+cHVzaF9iYWNrKG5hbWUgKyAiID0gIiArIGZpZWxkdmFsKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFvcHRpb25fZW50cmllcy0+ZW1wdHkoKTsKK30KKworLy8gRm9ybWF0cyBvcHRpb25zIHRoYXQgYWxsIGFwcGVhciB0b2dldGhlciBpbiBicmFja2V0cy4gRG9lcyBub3QgaW5jbHVkZQorLy8gYnJhY2tldHMuCitib29sIEZvcm1hdEJyYWNrZXRlZE9wdGlvbnMoaW50IGRlcHRoLCBjb25zdCBNZXNzYWdlICZvcHRpb25zLCBzdHJpbmcgKm91dHB1dCkgeworICB2ZWN0b3I8c3RyaW5nPiBhbGxfb3B0aW9uczsKKyAgaWYgKFJldHJpZXZlT3B0aW9ucyhkZXB0aCwgb3B0aW9ucywgJmFsbF9vcHRpb25zKSkgeworICAgIG91dHB1dC0+YXBwZW5kKEpvaW5TdHJpbmdzKGFsbF9vcHRpb25zLCAiLCAiKSk7CisgIH0KKyAgcmV0dXJuICFhbGxfb3B0aW9ucy5lbXB0eSgpOworfQorCisvLyBGb3JtYXRzIG9wdGlvbnMgb25lIHBlciBsaW5lCitib29sIEZvcm1hdExpbmVPcHRpb25zKGludCBkZXB0aCwgY29uc3QgTWVzc2FnZSAmb3B0aW9ucywgc3RyaW5nICpvdXRwdXQpIHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgIHZlY3RvcjxzdHJpbmc+IGFsbF9vcHRpb25zOworICBpZiAoUmV0cmlldmVPcHRpb25zKGRlcHRoLCBvcHRpb25zLCAmYWxsX29wdGlvbnMpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxfb3B0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChvdXRwdXQsICIkMG9wdGlvbiAkMTtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgYWxsX29wdGlvbnNbaV0pOworICAgIH0KKyAgfQorICByZXR1cm4gIWFsbF9vcHRpb25zLmVtcHR5KCk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworc3RyaW5nIEZpbGVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgc3RyaW5nIGNvbnRlbnRzID0gInN5bnRheCA9IFwicHJvdG8yXCI7XG5cbiI7CisKKyAgc2V0PGludD4gcHVibGljX2RlcGVuZGVuY2llczsKKyAgc2V0PGludD4gd2Vha19kZXBlbmRlbmNpZXM7CisgIHB1YmxpY19kZXBlbmRlbmNpZXMuaW5zZXJ0KHB1YmxpY19kZXBlbmRlbmNpZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfZGVwZW5kZW5jaWVzXyArIHB1YmxpY19kZXBlbmRlbmN5X2NvdW50Xyk7CisgIHdlYWtfZGVwZW5kZW5jaWVzLmluc2VydCh3ZWFrX2RlcGVuZGVuY2llc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrX2RlcGVuZGVuY2llc18gKyB3ZWFrX2RlcGVuZGVuY3lfY291bnRfKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKHB1YmxpY19kZXBlbmRlbmNpZXMuY291bnQoaSkgPiAwKSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgImltcG9ydCBwdWJsaWMgXCIkMFwiO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgICB9IGVsc2UgaWYgKHdlYWtfZGVwZW5kZW5jaWVzLmNvdW50KGkpID4gMCkgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgd2VhayBcIiQwXCI7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgImltcG9ydCBcIiQwXCI7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgIH0KKyAgfQorCisgIGlmICghcGFja2FnZSgpLmVtcHR5KCkpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgInBhY2thZ2UgJDA7XG5cbiIsIHBhY2thZ2UoKSk7CisgIH0KKworICBpZiAoRm9ybWF0TGluZU9wdGlvbnMoMCwgb3B0aW9ucygpLCAmY29udGVudHMpKSB7CisgICAgY29udGVudHMuYXBwZW5kKCJcbiIpOyAgLy8gYWRkIHNvbWUgc3BhY2UgaWYgd2UgaGFkIG9wdGlvbnMKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGVudW1fdHlwZShpKS0+RGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgICBjb250ZW50cy5hcHBlbmQoIlxuIik7CisgIH0KKworICAvLyBGaW5kIGFsbCB0aGUgJ2dyb3VwJyB0eXBlIGV4dGVuc2lvbnM7IHdlIHdpbGwgbm90IG91dHB1dCB0aGVpciBuZXN0ZWQKKyAgLy8gZGVmaW5pdGlvbnMgKHRob3NlIHdpbGwgYmUgZG9uZSB3aXRoIHRoZWlyIGdyb3VwIGZpZWxkIGRlc2NyaXB0b3IpLgorICBzZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGdyb3VwczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGV4dGVuc2lvbihpKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgICAgZ3JvdXBzLmluc2VydChleHRlbnNpb24oaSktPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZ3JvdXBzLmNvdW50KG1lc3NhZ2VfdHlwZShpKSkgPT0gMCkgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJtZXNzYWdlICQwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlKGkpLT5uYW1lKCkpOworICAgICAgbWVzc2FnZV90eXBlKGkpLT5EZWJ1Z1N0cmluZygwLCAmY29udGVudHMpOworICAgICAgY29udGVudHMuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICBzZXJ2aWNlKGkpLT5EZWJ1Z1N0cmluZygmY29udGVudHMpOworICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsKKyAgfQorCisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSA9IE5VTEw7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGlmIChleHRlbnNpb24oaSktPmNvbnRhaW5pbmdfdHlwZSgpICE9IGNvbnRhaW5pbmdfdHlwZSkgeworICAgICAgaWYgKGkgPiAwKSBjb250ZW50cy5hcHBlbmQoIn1cblxuIik7CisgICAgICBjb250YWluaW5nX3R5cGUgPSBleHRlbnNpb24oaSktPmNvbnRhaW5pbmdfdHlwZSgpOworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJleHRlbmQgLiQwIHtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZS0+ZnVsbF9uYW1lKCkpOworICAgIH0KKyAgICBleHRlbnNpb24oaSktPkRlYnVnU3RyaW5nKDEsICZjb250ZW50cyk7CisgIH0KKyAgaWYgKGV4dGVuc2lvbl9jb3VudCgpID4gMCkgY29udGVudHMuYXBwZW5kKCJ9XG5cbiIpOworCisgIHJldHVybiBjb250ZW50czsKK30KKworc3RyaW5nIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgY29udGVudHM7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAibWVzc2FnZSAkMCIsIG5hbWUoKSk7CisgIERlYnVnU3RyaW5nKDAsICZjb250ZW50cyk7CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0IHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisgIGNvbnRlbnRzLT5hcHBlbmQoIiB7XG4iKTsKKworICBGb3JtYXRMaW5lT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCBjb250ZW50cyk7CisKKyAgLy8gRmluZCBhbGwgdGhlICdncm91cCcgdHlwZXMgZm9yIGZpZWxkcyBhbmQgZXh0ZW5zaW9uczsgd2Ugd2lsbCBub3Qgb3V0cHV0CisgIC8vIHRoZWlyIG5lc3RlZCBkZWZpbml0aW9ucyAodGhvc2Ugd2lsbCBiZSBkb25lIHdpdGggdGhlaXIgZ3JvdXAgZmllbGQKKyAgLy8gZGVzY3JpcHRvcikuCisgIHNldDxjb25zdCBEZXNjcmlwdG9yKj4gZ3JvdXBzOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGlmIChmaWVsZChpKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgICAgZ3JvdXBzLmluc2VydChmaWVsZChpKS0+bWVzc2FnZV90eXBlKCkpOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZXh0ZW5zaW9uKGkpLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBncm91cHMuaW5zZXJ0KGV4dGVuc2lvbihpKS0+bWVzc2FnZV90eXBlKCkpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGdyb3Vwcy5jb3VudChuZXN0ZWRfdHlwZShpKSkgPT0gMCkgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICBtZXNzYWdlICQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBuZXN0ZWRfdHlwZShpKS0+bmFtZSgpKTsKKyAgICAgIG5lc3RlZF90eXBlKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMpOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZChpKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgZXh0ZW5zaW9ucyAkMSB0byAkMjtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fcmFuZ2UoaSktPnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX3JhbmdlKGkpLT5lbmQgLSAxKTsKKyAgfQorCisgIC8vIEdyb3VwIGV4dGVuc2lvbnMgYnkgd2hhdCB0aGV5IGV4dGVuZCwgc28gdGhleSBjYW4gYmUgcHJpbnRlZCBvdXQgdG9nZXRoZXIuCisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSA9IE5VTEw7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGlmIChleHRlbnNpb24oaSktPmNvbnRhaW5pbmdfdHlwZSgpICE9IGNvbnRhaW5pbmdfdHlwZSkgeworICAgICAgaWYgKGkgPiAwKSBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIH1cbiIsIHByZWZpeCk7CisgICAgICBjb250YWluaW5nX3R5cGUgPSBleHRlbnNpb24oaSktPmNvbnRhaW5pbmdfdHlwZSgpOworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICBleHRlbmQgLiQxIHtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgY29udGFpbmluZ190eXBlLT5mdWxsX25hbWUoKSk7CisgICAgfQorICAgIGV4dGVuc2lvbihpKS0+RGVidWdTdHJpbmcoZGVwdGggKyAxLCBjb250ZW50cyk7CisgIH0KKyAgaWYgKGV4dGVuc2lvbl9jb3VudCgpID4gMCkKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIH1cbiIsIHByZWZpeCk7CisKKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKK30KKworc3RyaW5nIEZpZWxkRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBjb250ZW50czsKKyAgaW50IGRlcHRoID0gMDsKKyAgaWYgKGlzX2V4dGVuc2lvbigpKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJleHRlbmQgLiQwIHtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworICAgIGRlcHRoID0gMTsKKyAgfQorICBEZWJ1Z1N0cmluZyhkZXB0aCwgJmNvbnRlbnRzKTsKKyAgaWYgKGlzX2V4dGVuc2lvbigpKSB7CisgICAgIGNvbnRlbnRzLmFwcGVuZCgifVxuIik7CisgIH0KKyAgcmV0dXJuIGNvbnRlbnRzOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdCB7CisgIHN0cmluZyBwcmVmaXgoZGVwdGggKiAyLCAnICcpOworICBzdHJpbmcgZmllbGRfdHlwZTsKKyAgc3dpdGNoICh0eXBlKCkpIHsKKyAgICBjYXNlIFRZUEVfTUVTU0FHRToKKyAgICAgIGZpZWxkX3R5cGUgPSAiLiIgKyBtZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfRU5VTToKKyAgICAgIGZpZWxkX3R5cGUgPSAiLiIgKyBlbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZmllbGRfdHlwZSA9IGtUeXBlVG9OYW1lW3R5cGUoKV07CisgIH0KKworICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAkMSAkMiAkMyA9ICQ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0xhYmVsVG9OYW1lW2xhYmVsKCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09IFRZUEVfR1JPVVAgPyBtZXNzYWdlX3R5cGUoKS0+bmFtZSgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIoKSk7CisKKyAgYm9vbCBicmFja2V0ZWQgPSBmYWxzZTsKKyAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICBicmFja2V0ZWQgPSB0cnVlOworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIgW2RlZmF1bHQgPSAkMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWVBc1N0cmluZyh0cnVlKSk7CisgIH0KKworICBzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7CisgIGlmIChGb3JtYXRCcmFja2V0ZWRPcHRpb25zKGRlcHRoLCBvcHRpb25zKCksICZmb3JtYXR0ZWRfb3B0aW9ucykpIHsKKyAgICBjb250ZW50cy0+YXBwZW5kKGJyYWNrZXRlZCA/ICIsICIgOiAiIFsiKTsKKyAgICBicmFja2V0ZWQgPSB0cnVlOworICAgIGNvbnRlbnRzLT5hcHBlbmQoZm9ybWF0dGVkX29wdGlvbnMpOworICB9CisKKyAgaWYgKGJyYWNrZXRlZCkgeworICAgIGNvbnRlbnRzLT5hcHBlbmQoIl0iKTsKKyAgfQorCisgIGlmICh0eXBlKCkgPT0gVFlQRV9HUk9VUCkgeworICAgIG1lc3NhZ2VfdHlwZSgpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMpOworICB9IGVsc2UgeworICAgIGNvbnRlbnRzLT5hcHBlbmQoIjtcbiIpOworICB9Cit9CisKK3N0cmluZyBFbnVtRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBjb250ZW50czsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgcmV0dXJuIGNvbnRlbnRzOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0IHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMGVudW0gJDEge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIG5hbWUoKSk7CisKKyAgRm9ybWF0TGluZU9wdGlvbnMoZGVwdGgsIG9wdGlvbnMoKSwgY29udGVudHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgdmFsdWUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cyk7CisgIH0KKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKK30KKworc3RyaW5nIEVudW1WYWx1ZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgY29udGVudHM7CisgIERlYnVnU3RyaW5nKDAsICZjb250ZW50cyk7CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0IHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCQxID0gJDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgbmFtZSgpLCBudW1iZXIoKSk7CisKKyAgc3RyaW5nIGZvcm1hdHRlZF9vcHRpb25zOworICBpZiAoRm9ybWF0QnJhY2tldGVkT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCAmZm9ybWF0dGVkX29wdGlvbnMpKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiBbJDBdIiwgZm9ybWF0dGVkX29wdGlvbnMpOworICB9CisgIGNvbnRlbnRzLT5hcHBlbmQoIjtcbiIpOworfQorCitzdHJpbmcgU2VydmljZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgY29udGVudHM7CisgIERlYnVnU3RyaW5nKCZjb250ZW50cyk7CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoc3RyaW5nICpjb250ZW50cykgY29uc3QgeworICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAic2VydmljZSAkMCB7XG4iLCBuYW1lKCkpOworCisgIEZvcm1hdExpbmVPcHRpb25zKDEsIG9wdGlvbnMoKSwgY29udGVudHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIG1ldGhvZChpKS0+RGVidWdTdHJpbmcoMSwgY29udGVudHMpOworICB9CisKKyAgY29udGVudHMtPmFwcGVuZCgifVxuIik7Cit9CisKK3N0cmluZyBNZXRob2REZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgc3RyaW5nIGNvbnRlbnRzOworICBEZWJ1Z1N0cmluZygwLCAmY29udGVudHMpOworICByZXR1cm4gY29udGVudHM7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdCB7CisgIHN0cmluZyBwcmVmaXgoZGVwdGggKiAyLCAnICcpOworICArK2RlcHRoOworICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDBycGMgJDEoLiQyKSByZXR1cm5zICguJDMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIG5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlKCktPmZ1bGxfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKworICBzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7CisgIGlmIChGb3JtYXRMaW5lT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCAmZm9ybWF0dGVkX29wdGlvbnMpKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiB7XG4kMCQxfVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9vcHRpb25zLCBwcmVmaXgpOworICB9IGVsc2UgeworICAgIGNvbnRlbnRzLT5hcHBlbmQoIjtcbiIpOworICB9Cit9CisKKworLy8gTG9jYXRpb24gbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgYm9vbCBQYXRoc0VxdWFsKGNvbnN0IHZlY3RvcjxpbnQ+JiB4LCBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyPiYgeSkgeworICBpZiAoeC5zaXplKCkgIT0geS5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB4LnNpemUoKTsgKytpKSB7CisgICAgaWYgKHhbaV0gIT0geS5HZXQoaSkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oY29uc3QgdmVjdG9yPGludD4mIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDS19OT1ROVUxMKG91dF9sb2NhdGlvbik7CisgIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBpbmZvID0gc291cmNlX2NvZGVfaW5mb187CisgIGZvciAoaW50IGkgPSAwOyBpbmZvICYmIGkgPCBpbmZvLT5sb2NhdGlvbl9zaXplKCk7ICsraSkgeworICAgIGlmIChQYXRoc0VxdWFsKHBhdGgsIGluZm8tPmxvY2F0aW9uKGkpLnBhdGgoKSkpIHsKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzI+JiBzcGFuID0gaW5mby0+bG9jYXRpb24oaSkuc3BhbigpOworICAgICAgaWYgKHNwYW4uc2l6ZSgpID09IDMgfHwgc3Bhbi5zaXplKCkgPT0gNCkgeworICAgICAgICBvdXRfbG9jYXRpb24tPnN0YXJ0X2xpbmUgICA9IHNwYW4uR2V0KDApOworICAgICAgICBvdXRfbG9jYXRpb24tPnN0YXJ0X2NvbHVtbiA9IHNwYW4uR2V0KDEpOworICAgICAgICBvdXRfbG9jYXRpb24tPmVuZF9saW5lICAgICA9IHNwYW4uR2V0KHNwYW4uc2l6ZSgpID09IDMgPyAwIDogMik7CisgICAgICAgIG91dF9sb2NhdGlvbi0+ZW5kX2NvbHVtbiAgID0gc3Bhbi5HZXQoc3Bhbi5zaXplKCkgLSAxKTsKKworICAgICAgICBvdXRfbG9jYXRpb24tPmxlYWRpbmdfY29tbWVudHMgPSBpbmZvLT5sb2NhdGlvbihpKS5sZWFkaW5nX2NvbW1lbnRzKCk7CisgICAgICAgIG91dF9sb2NhdGlvbi0+dHJhaWxpbmdfY29tbWVudHMgPSBpbmZvLT5sb2NhdGlvbihpKS50cmFpbGluZ19jb21tZW50cygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfcGFja2VkKCkgY29uc3QgeworICByZXR1cm4gaXNfcGFja2FibGUoKSAmJiAob3B0aW9uc18gIT0gTlVMTCkgJiYgb3B0aW9uc18tPnBhY2tlZCgpOworfQorCitib29sIERlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgdmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBGaWVsZERlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgdmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBFbnVtRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3QgeworICB2ZWN0b3I8aW50PiBwYXRoOworICBHZXRMb2NhdGlvblBhdGgoJnBhdGgpOworICByZXR1cm4gZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOworfQorCitib29sIE1ldGhvZERlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgdmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIHNlcnZpY2UoKS0+ZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOworfQorCitib29sIFNlcnZpY2VEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHZlY3RvcjxpbnQ+IHBhdGg7CisgIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgIHJldHVybiBmaWxlKCktPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIG91dF9sb2NhdGlvbik7Cit9CisKK2Jvb2wgRW51bVZhbHVlRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oCisgICAgU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3QgeworICB2ZWN0b3I8aW50PiBwYXRoOworICBHZXRMb2NhdGlvblBhdGgoJnBhdGgpOworICByZXR1cm4gdHlwZSgpLT5maWxlKCktPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIG91dF9sb2NhdGlvbik7Cit9CisKK3ZvaWQgRGVzY3JpcHRvcjo6R2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKKyAgaWYgKGNvbnRhaW5pbmdfdHlwZSgpKSB7CisgICAgY29udGFpbmluZ190eXBlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlcik7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworICB9Cit9CisKK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3QgeworICBjb250YWluaW5nX3R5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7CisgIG91dHB1dC0+cHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a0ZpZWxkRmllbGROdW1iZXIpOworICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvcjo6R2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKKyAgaWYgKGNvbnRhaW5pbmdfdHlwZSgpKSB7CisgICAgY29udGFpbmluZ190eXBlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworICB9IGVsc2UgeworICAgIG91dHB1dC0+cHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyKTsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKKyAgfQorfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIHR5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7CisgIG91dHB1dC0+cHVzaF9iYWNrKEVudW1EZXNjcmlwdG9yUHJvdG86OmtWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIG91dHB1dC0+cHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTZXJ2aWNlRmllbGROdW1iZXIpOworICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3QgeworICBzZXJ2aWNlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOworICBvdXRwdXQtPnB1c2hfYmFjayhTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTWV0aG9kRmllbGROdW1iZXIpOworICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCituYW1lc3BhY2UgeworCisvLyBSZXByZXNlbnRzIGFuIG9wdGlvbnMgbWVzc2FnZSB0byBpbnRlcnByZXQuIEV4dGVuc2lvbiBuYW1lcyBpbiB0aGUgb3B0aW9uCisvLyBuYW1lIGFyZSByZXNwb2x2ZWQgcmVsYXRpdmUgdG8gbmFtZV9zY29wZS4gZWxlbWVudF9uYW1lIGFuZCBvcmlnX29wdCBhcmUKKy8vIHVzZWQgb25seSBmb3IgZXJyb3IgcmVwb3J0aW5nIChzaW5jZSB0aGUgcGFyc2VyIHJlY29yZHMgbG9jYXRpb25zIGFnYWluc3QKKy8vIHBvaW50ZXJzIGluIHRoZSBvcmlnaW5hbCBvcHRpb25zLCBub3QgdGhlIG11dGFibGUgY29weSkuIFRoZSBNZXNzYWdlIG11c3QgYmUKKy8vIG9uZSBvZiB0aGUgT3B0aW9ucyBtZXNzYWdlcyBpbiBkZXNjcmlwdG9yLnByb3RvLgorc3RydWN0IE9wdGlvbnNUb0ludGVycHJldCB7CisgIE9wdGlvbnNUb0ludGVycHJldChjb25zdCBzdHJpbmcmIG5zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBlbCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIG9yaWdfb3B0LAorICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3B0KQorICAgICAgOiBuYW1lX3Njb3BlKG5zKSwKKyAgICAgICAgZWxlbWVudF9uYW1lKGVsKSwKKyAgICAgICAgb3JpZ2luYWxfb3B0aW9ucyhvcmlnX29wdCksCisgICAgICAgIG9wdGlvbnMob3B0KSB7CisgIH0KKyAgc3RyaW5nIG5hbWVfc2NvcGU7CisgIHN0cmluZyBlbGVtZW50X25hbWU7CisgIGNvbnN0IE1lc3NhZ2UqIG9yaWdpbmFsX29wdGlvbnM7CisgIE1lc3NhZ2UqIG9wdGlvbnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXIgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvckJ1aWxkZXIoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpUYWJsZXMqIHRhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpOworICB+RGVzY3JpcHRvckJ1aWxkZXIoKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBPcHRpb25JbnRlcnByZXRlcjsKKworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbF87CisgIERlc2NyaXB0b3JQb29sOjpUYWJsZXMqIHRhYmxlc187ICAvLyBmb3IgY29udmVuaWVuY2UKKyAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3JfOworCisgIC8vIEFzIHdlIGJ1aWxkIGRlc2NyaXB0b3JzIHdlIHN0b3JlIGNvcGllcyBvZiB0aGUgb3B0aW9ucyBtZXNzYWdlcyBpbgorICAvLyB0aGVtLiBXZSBwdXQgcG9pbnRlcnMgdG8gdGhvc2UgY29waWVzIGluIHRoaXMgdmVjdG9yLCBhcyB3ZSBidWlsZCwgc28gd2UKKyAgLy8gY2FuIGxhdGVyIChhZnRlciBjcm9zcy1saW5raW5nKSBpbnRlcnByZXQgdGhvc2Ugb3B0aW9ucy4KKyAgdmVjdG9yPE9wdGlvbnNUb0ludGVycHJldD4gb3B0aW9uc190b19pbnRlcnByZXRfOworCisgIGJvb2wgaGFkX2Vycm9yc187CisgIHN0cmluZyBmaWxlbmFtZV87CisgIEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKKyAgRmlsZURlc2NyaXB0b3JUYWJsZXMqIGZpbGVfdGFibGVzXzsKKyAgc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gZGVwZW5kZW5jaWVzXzsKKworICAvLyBJZiBMb29rdXBTeW1ib2woKSBmaW5kcyBhIHN5bWJvbCB0aGF0IGlzIGluIGEgZmlsZSB3aGljaCBpcyBub3QgYSBkZWNsYXJlZAorICAvLyBkZXBlbmRlbmN5IG9mIHRoaXMgZmlsZSwgaXQgd2lsbCBmYWlsLCBidXQgd2lsbCBzZXQKKyAgLy8gcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyB0byBwb2ludCBhdCB0aGF0IGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZAorICAvLyBieSBBZGROb3REZWZpbmVkRXJyb3IoKSB0byByZXBvcnQgYSBtb3JlIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgorICAvLyBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IHdhcworICAvLyBhY3R1YWxseSBmb3VuZCBpbiBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfLCB3aGljaCBtYXkgYmUgYSBwYXJlbnQKKyAgLy8gb2YgdGhlIHN5bWJvbCBhY3R1YWxseSBsb29rZWQgZm9yLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XzsKKyAgc3RyaW5nIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV9uYW1lXzsKKworICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZXJyb3IpOworCisgIC8vIEFkZHMgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHVuZGVmaW5lZF9zeW1ib2wgd2FzIG5vdCBkZWZpbmVkLiAgTXVzdAorICAvLyBvbmx5IGJlIGNhbGxlZCBhZnRlciBMb29rdXBTeW1ib2woKSBmYWlscy4KKyAgdm9pZCBBZGROb3REZWZpbmVkRXJyb3IoCisgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvciwKKyAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgY29uc3Qgc3RyaW5nJiB1bmRlZmluZWRfc3ltYm9sKTsKKworICAvLyBTaWxseSBoZWxwZXIgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBpbiB0aGUgZ2l2ZW4gcGFja2FnZS4KKyAgLy8gSS5lLiwgZWl0aGVyIGZpbGUtPnBhY2thZ2UoKSA9PSBwYWNrYWdlX25hbWUgb3IgZmlsZS0+cGFja2FnZSgpIGlzIGEKKyAgLy8gbmVzdGVkIHBhY2thZ2Ugd2l0aGluIHBhY2thZ2VfbmFtZS4KKyAgYm9vbCBJc0luUGFja2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3Qgc3RyaW5nJiBwYWNrYWdlX25hbWUpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB3aGljaCBmaW5kcyBhbGwgcHVibGljIGRlcGVuZGVuY2llcyBvZiB0aGUgZ2l2ZW4gZmlsZSwgYW5kCisgIC8vIHN0b3JlcyB0aGUgdGhlbSBpbiB0aGUgZGVwZW5kZW5jaWVzXyBzZXQgaW4gdGhlIGJ1aWxkZXIuCisgIHZvaWQgUmVjb3JkUHVibGljRGVwZW5kZW5jaWVzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworICAvLyBMaWtlIHRhYmxlc18tPkZpbmRTeW1ib2woKSwgYnV0IGFkZGl0aW9uYWxseToKKyAgLy8gLSBTZWFyY2ggdGhlIHBvb2wncyB1bmRlcmxheSBpZiBub3QgZm91bmQgaW4gdGFibGVzXy4KKyAgLy8gLSBJbnN1cmUgdGhhdCB0aGUgcmVzdWx0aW5nIFN5bWJvbCBpcyBmcm9tIG9uZSBvZiB0aGUgZmlsZSdzIGRlY2xhcmVkCisgIC8vICAgZGVwZW5kZW5jaWVzLgorICBTeW1ib2wgRmluZFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIExpa2UgRmluZFN5bWJvbCgpIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlIHN5bWJvbCBpcyBpbiBvbmUgb2YgdGhlCisgIC8vIGZpbGUncyBkZWNsYXJlZCBkZXBlbmRlbmNpZXMuCisgIFN5bWJvbCBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcyhjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFRoaXMgaW1wbGVtZW50cyB0aGUgYm9keSBvZiBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygpLgorICBTeW1ib2wgRmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHNIZWxwZXIoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIExpa2UgRmluZFN5bWJvbCgpLCBidXQgbG9va3MgdXAgdGhlIG5hbWUgcmVsYXRpdmUgdG8gc29tZSBvdGhlciBzeW1ib2wKKyAgLy8gbmFtZS4gIFRoaXMgZmlyc3Qgc2VhcmNoZXMgc2libGluZ3Mgb2YgcmVsYXRpdmVfdG8sIHRoZW4gc2libGluZ3Mgb2YgaXRzCisgIC8vIHBhcmVudHMsIGV0Yy4gIEZvciBleGFtcGxlLCBMb29rdXBTeW1ib2woImZvby5iYXIiLCAiYmF6LnF1eC5jb3JnZSIpIG1ha2VzCisgIC8vIHRoZSBmb2xsb3dpbmcgY2FsbHMsIHJldHVybmluZyB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0OgorICAvLyBGaW5kU3ltYm9sKCJiYXoucXV4LmZvby5iYXIiKSwgRmluZFN5bWJvbCgiYmF6LmZvby5iYXIiKSwKKyAgLy8gRmluZFN5bWJvbCgiZm9vLmJhciIpLiAgSWYgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaGFzIGJlZW4gY2FsbGVkCisgIC8vIG9uIHRoZSBEZXNjcmlwdG9yUG9vbCwgdGhpcyB3aWxsIGdlbmVyYXRlIGEgcGxhY2Vob2xkZXIgdHlwZSBpZgorICAvLyB0aGUgbmFtZSBpcyBub3QgZm91bmQgKHVubGVzcyB0aGUgbmFtZSBpdHNlbGYgaXMgbWFsZm9ybWVkKS4gIFRoZQorICAvLyBwbGFjZWhvbGRlcl90eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIHBsYWNlaG9sZGVyIHNob3VsZCBiZQorICAvLyBjb25zdHJ1Y3RlZCBpbiB0aGlzIGNhc2UuICBUaGUgcmVzb2x2ZV9tb2RlIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoZXRoZXIKKyAgLy8gYW55IHN5bWJvbCBpcyByZXR1cm5lZCwgb3Igb25seSBzeW1ib2xzIHRoYXQgYXJlIHR5cGVzLiAgTm90ZSwgaG93ZXZlciwKKyAgLy8gdGhhdCBMb29rdXBTeW1ib2wgbWF5IHN0aWxsIHJldHVybiBhIG5vbi10eXBlIHN5bWJvbCBpbiBMT09LVVBfVFlQRVMgbW9kZSwKKyAgLy8gaWYgaXQgYmVsaWV2ZXMgdGhhdCdzIGFsbCBpdCBjb3VsZCByZWZlciB0by4gIFRoZSBjYWxsZXIgc2hvdWxkIGFsd2F5cworICAvLyBjaGVjayB0aGF0IGl0IHJlY2VpdmVzIHRoZSB0eXBlIG9mIHN5bWJvbCBpdCB3YXMgZXhwZWN0aW5nLgorICBlbnVtIFBsYWNlaG9sZGVyVHlwZSB7CisgICAgUExBQ0VIT0xERVJfTUVTU0FHRSwKKyAgICBQTEFDRUhPTERFUl9FTlVNLAorICAgIFBMQUNFSE9MREVSX0VYVEVOREFCTEVfTUVTU0FHRQorICB9OworICBlbnVtIFJlc29sdmVNb2RlIHsKKyAgICBMT09LVVBfQUxMLCBMT09LVVBfVFlQRVMKKyAgfTsKKyAgU3ltYm9sIExvb2t1cFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sCisgICAgICAgICAgICAgICAgICAgICAgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUgPSBQTEFDRUhPTERFUl9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSA9IExPT0tVUF9BTEwpOworCisgIC8vIExpa2UgTG9va3VwU3ltYm9sKCkgYnV0IHdpbGwgbm90IHJldHVybiBhIHBsYWNlaG9sZGVyIGV2ZW4gaWYKKyAgLy8gQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaGFzIGJlZW4gdXNlZC4KKyAgU3ltYm9sIExvb2t1cFN5bWJvbE5vUGxhY2Vob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHJlbGF0aXZlX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlTW9kZSByZXNvbHZlX21vZGUgPSBMT09LVVBfQUxMKTsKKworICAvLyBDcmVhdGVzIGEgcGxhY2Vob2xkZXIgdHlwZSBzdWl0YWJsZSBmb3IgcmV0dXJuIGZyb20gTG9va3VwU3ltYm9sKCkuICBNYXkKKyAgLy8gcmV0dXJuIGtOdWxsU3ltYm9sIGlmIHRoZSBuYW1lIGlzIG5vdCBhIHZhbGlkIHR5cGUgbmFtZS4KKyAgU3ltYm9sIE5ld1BsYWNlaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUpOworCisgIC8vIENyZWF0ZXMgYSBwbGFjZWhvbGRlciBmaWxlLiAgTmV2ZXIgcmV0dXJucyBOVUxMLiAgVGhpcyBpcyB1c2VkIHdoZW4gYW4KKyAgLy8gaW1wb3J0IGlzIG5vdCBmb3VuZCBhbmQgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaXMgZW5hYmxlZC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIE5ld1BsYWNlaG9sZGVyRmlsZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIENhbGxzIHRhYmxlc18tPkFkZFN5bWJvbCgpIGFuZCByZWNvcmRzIGFuIGVycm9yIGlmIGl0IGZhaWxzLiAgUmV0dXJucworICAvLyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgZmFsc2UgaWYgZmFpbGVkLCB0aG91Z2ggbW9zdCBjYWxsZXJzIGNhbiBpZ25vcmUKKyAgLy8gdGhlIHJldHVybiB2YWx1ZSBzaW5jZSBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlY29yZGVkLgorICBib29sIEFkZFN5bWJvbChjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHByb3RvLCBTeW1ib2wgc3ltYm9sKTsKKworICAvLyBMaWtlIEFkZFN5bWJvbCgpLCBidXQgc3VjY2VlZHMgaWYgdGhlIHN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgbG9uZworICAvLyBhcyB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBpcyBhbHNvIGEgcGFja2FnZSAoYmVjYXVzZSBpdCdzIE9LIHRvIGRlZmluZQorICAvLyB0aGUgc2FtZSBwYWNrYWdlIGluIHR3byBkaWZmZXJlbnQgZmlsZXMpLiAgQWxzbyBhZGRzIGFsbCBwYXJlbnRzIG9mIHRoZQorICAvLyBwYWNrZ2FlIHRvIHRoZSBzeW1ib2wgdGFibGUgKGUuZy4gQWRkUGFja2FnZSgiZm9vLmJhciIsIC4uLikgd2lsbCBhZGQKKyAgLy8gImZvby5iYXIiIGFuZCAiZm9vIiB0byB0aGUgdGFibGUpLgorICB2b2lkIEFkZFBhY2thZ2UoY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBNZXNzYWdlJiBwcm90bywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworICAvLyBDaGVja3MgdGhhdCB0aGUgc3ltYm9sIG5hbWUgY29udGFpbnMgb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQKKyAgLy8gdW5kZXJzY29yZXMuICBSZWNvcmRzIGFuIGVycm9yIG90aGVyd2lzZS4KKyAgdm9pZCBWYWxpZGF0ZVN5bWJvbE5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgcHJvdG8pOworCisgIC8vIExpa2UgVmFsaWRhdGVTeW1ib2xOYW1lKCksIGJ1dCB0aGUgbmFtZSBpcyBhbGxvd2VkIHRvIGNvbnRhaW4gcGVyaW9kcyBhbmQKKyAgLy8gYW4gZXJyb3IgaXMgaW5kaWNhdGVkIGJ5IHJldHVybmluZyBmYWxzZSAobm90IHJlY29yZGluZyB0aGUgZXJyb3IpLgorICBib29sIFZhbGlkYXRlUXVhbGlmaWVkTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFVzZWQgYnkgQlVJTERfQVJSQVkgbWFjcm8gKGJlbG93KSB0byBhdm9pZCBoYXZpbmcgdG8gaGF2ZSB0aGUgdHlwZQorICAvLyBzcGVjaWZpZWQgYXMgYSBtYWNybyBwYXJhbWV0ZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUFycmF5KGludCBzaXplLCBUeXBlKiogb3V0cHV0KSB7CisgICAgKm91dHB1dCA9IHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8VHlwZT4oc2l6ZSk7CisgIH0KKworICAvLyBBbGxvY2F0ZXMgYSBjb3B5IG9mIG9yaWdfb3B0aW9ucyBpbiB0YWJsZXNfIGFuZCBzdG9yZXMgaXQgaW4gdGhlCisgIC8vIGRlc2NyaXB0b3IuIFJlbWVtYmVycyBpdHMgdW5pbnRlcnByZXRlZCBvcHRpb25zLCB0byBiZSBpbnRlcnByZXRlZAorICAvLyBsYXRlci4gRGVzY3JpcHRvclQgbXVzdCBiZSBvbmUgb2YgdGhlIERlc2NyaXB0b3IgbWVzc2FnZXMgZnJvbQorICAvLyBkZXNjcmlwdG9yLnByb3RvLgorICB0ZW1wbGF0ZTxjbGFzcyBEZXNjcmlwdG9yVD4gdm9pZCBBbGxvY2F0ZU9wdGlvbnMoCisgICAgICBjb25zdCB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUmIG9yaWdfb3B0aW9ucywKKyAgICAgIERlc2NyaXB0b3JUKiBkZXNjcmlwdG9yKTsKKyAgLy8gU3BlY2lhbGl6YXRpb24gZm9yIEZpbGVPcHRpb25zLgorICB2b2lkIEFsbG9jYXRlT3B0aW9ucyhjb25zdCBGaWxlT3B0aW9ucyYgb3JpZ19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKyAgLy8gSW1wbGVtZW50YXRpb24gZm9yIEFsbG9jYXRlT3B0aW9ucygpLiBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuCisgIHRlbXBsYXRlPGNsYXNzIERlc2NyaXB0b3JUPiB2b2lkIEFsbG9jYXRlT3B0aW9uc0ltcGwoCisgICAgICBjb25zdCBzdHJpbmcmIG5hbWVfc2NvcGUsCisgICAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSYgb3JpZ19vcHRpb25zLAorICAgICAgRGVzY3JpcHRvclQqIGRlc2NyaXB0b3IpOworCisgIC8vIFRoZXNlIG1ldGhvZHMgYWxsIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlIGZvciB0aGUgc2FrZSBvZiB0aGUgQlVJTERfQVJSQVkKKyAgLy8gbWFjcm8sIGJlbG93LgorICB2b2lkIEJ1aWxkTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IqIHJlc3VsdCk7CisgIHZvaWQgQnVpbGRGaWVsZE9yRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHRlbnNpb24pOworICB2b2lkIEJ1aWxkRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yKiByZXN1bHQpIHsKKyAgICBCdWlsZEZpZWxkT3JFeHRlbnNpb24ocHJvdG8sIHBhcmVudCwgcmVzdWx0LCBmYWxzZSk7CisgIH0KKyAgdm9pZCBCdWlsZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciogcmVzdWx0KSB7CisgICAgQnVpbGRGaWVsZE9yRXh0ZW5zaW9uKHByb3RvLCBwYXJlbnQsIHJlc3VsdCwgdHJ1ZSk7CisgIH0KKyAgdm9pZCBCdWlsZEV4dGVuc2lvblJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJlc3VsdCk7CisgIHZvaWQgQnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yKiByZXN1bHQpOworICB2b2lkIEJ1aWxkRW51bVZhbHVlKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQpOworICB2b2lkIEJ1aWxkU2VydmljZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZHVtbXksCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yKiByZXN1bHQpOworICB2b2lkIEJ1aWxkTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yKiByZXN1bHQpOworCisgIC8vIE11c3QgYmUgcnVuIG9ubHkgYWZ0ZXIgYnVpbGRpbmcuCisgIC8vCisgIC8vIE5PVEU6IE9wdGlvbnMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGR1cmluZyBjcm9zcy1saW5raW5nLCBhcyB0aGV5CisgIC8vIGhhdmUgbm90IHlldCBiZWVuIGludGVycHJldGVkLiBEZWZlciBhbnkgaGFuZGxpbmcgb2Ygb3B0aW9ucyB0byB0aGUKKyAgLy8gVmFsaWRhdGUqT3B0aW9ucyBtZXRob2RzLgorICB2b2lkIENyb3NzTGlua0ZpbGUoRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBDcm9zc0xpbmtNZXNzYWdlKERlc2NyaXB0b3IqIG1lc3NhZ2UsIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua0ZpZWxkKEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBDcm9zc0xpbmtFbnVtKEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgQ3Jvc3NMaW5rRW51bVZhbHVlKEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua1NlcnZpY2UoU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgQ3Jvc3NMaW5rTWV0aG9kKE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisKKyAgLy8gTXVzdCBiZSBydW4gb25seSBhZnRlciBjcm9zcy1saW5raW5nLgorICB2b2lkIEludGVycHJldE9wdGlvbnMoKTsKKworICAvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW50ZXJwcmV0aW5nIG9wdGlvbnMuCisgIGNsYXNzIE9wdGlvbkludGVycHJldGVyIHsKKyAgIHB1YmxpYzoKKyAgICAvLyBDcmVhdGVzIGFuIGludGVycHJldGVyIHRoYXQgb3BlcmF0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBvb2wgb2YgdGhlCisgICAgLy8gc3BlY2lmaWVkIGJ1aWxkZXIsIHdoaWNoIG11c3Qgbm90IGJlIE5VTEwuIFdlIGRvbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZQorICAgIC8vIGJ1aWxkZXIuCisgICAgZXhwbGljaXQgT3B0aW9uSW50ZXJwcmV0ZXIoRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXIpOworCisgICAgfk9wdGlvbkludGVycHJldGVyKCk7CisKKyAgICAvLyBJbnRlcnByZXRzIHRoZSB1bmludGVycHJldGVkIG9wdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBPcHRpb25zIG1lc3NhZ2UuCisgICAgLy8gT24gZXJyb3IsIGNhbGxzIEFkZEVycm9yKCkgb24gdGhlIHVuZGVybHlpbmcgYnVpbGRlciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICAvLyBPdGhlcndpc2UgcmV0dXJucyB0cnVlLgorICAgIGJvb2wgSW50ZXJwcmV0T3B0aW9ucyhPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0KTsKKworICAgIGNsYXNzIEFnZ3JlZ2F0ZU9wdGlvbkZpbmRlcjsKKworICAgcHJpdmF0ZToKKyAgICAvLyBJbnRlcnByZXRzIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyBvbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIHdoaWNoCisgICAgLy8gbXVzdCBiZSB0aGUgbXV0YWJsZSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvcHRpb25zIG1lc3NhZ2UgdG8gd2hpY2gKKyAgICAvLyB1bmludGVycHJldGVkX29wdGlvbl8gYmVsb25ncy4KKyAgICBib29sIEludGVycHJldFNpbmdsZU9wdGlvbihNZXNzYWdlKiBvcHRpb25zKTsKKworICAgIC8vIEFkZHMgdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHRvIHRoZSBnaXZlbiBvcHRpb25zIG1lc3NhZ2UgdmVyYmF0aW0uCisgICAgLy8gVXNlZCB3aGVuIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGlzIGluIGVmZmVjdCBhbmQgd2UgY2FuJ3QgZmluZAorICAgIC8vIHRoZSBvcHRpb24ncyBkZWZpbml0aW9uLgorICAgIHZvaWQgQWRkV2l0aG91dEludGVycHJldGluZyhjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3B0aW9ucyk7CisKKyAgICAvLyBBIHJlY3Vyc2l2ZSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBkcmlsbHMgaW50byB0aGUgaW50ZXJtZWRpYXRlIGZpZWxkcworICAgIC8vIGluIHVua25vd25fZmllbGRzIHRvIGNoZWNrIGlmIGZpZWxkIGlubmVybW9zdF9maWVsZCBpcyBzZXQgb24gdGhlCisgICAgLy8gaW5uZXJtb3N0IG1lc3NhZ2UuIFJldHVybnMgZmFsc2UgYW5kIHNldHMgYW4gZXJyb3IgaWYgc28uCisgICAgYm9vbCBFeGFtaW5lSWZPcHRpb25Jc1NldCgKKyAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+Ojpjb25zdF9pdGVyYXRvciBpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIsCisgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW5uZXJtb3N0X2ZpZWxkLCBjb25zdCBzdHJpbmcmIGRlYnVnX21zZ19uYW1lLAorICAgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIFZhbGlkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBvcHRpb24gZmllbGQgb2YgdGhlIGN1cnJlbnRseSBpbnRlcnByZXRlZAorICAgIC8vIG9wdGlvbiBhbmQgdGhlbiBzZXRzIGl0IG9uIHRoZSB1bmtub3duX2ZpZWxkLgorICAgIGJvb2wgU2V0T3B0aW9uVmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25fZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIFBhcnNlcyBhbiBhZ2dyZWdhdGUgdmFsdWUgZm9yIGEgQ1BQVFlQRV9NRVNTQUdFIG9wdGlvbiBhbmQKKyAgICAvLyBzYXZlcyBpdCBpbnRvICp1bmtub3duX2ZpZWxkcy4KKyAgICBib29sIFNldEFnZ3JlZ2F0ZU9wdGlvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzZXQgYW4gaW50IGZpZWxkIHRoZSByaWdodCB3YXksIGRlcGVuZGluZyBvbgorICAgIC8vIGl0cyB3aXJlIHR5cGUgKGEgc2luZ2xlIGludCBDcHBUeXBlIGNhbiByZXByZXNlbnQgbXVsdGlwbGUgd2lyZSB0eXBlcykuCisgICAgdm9pZCBTZXRJbnQzMihpbnQgbnVtYmVyLCBpbnQzMiB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKyAgICB2b2lkIFNldEludDY0KGludCBudW1iZXIsIGludDY0IHZhbHVlLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworICAgIHZvaWQgU2V0VUludDMyKGludCBudW1iZXIsIHVpbnQzMiB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisgICAgdm9pZCBTZXRVSW50NjQoaW50IG51bWJlciwgdWludDY0IHZhbHVlLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgYWRkcyBhbiBlcnJvciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIG9mIHRoZQorICAgIC8vIG9wdGlvbiB3ZSdyZSBjdXJyZW50bHkgaW50ZXJwcmV0aW5nLCBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbXNnKSB7CisgICAgICBidWlsZGVyXy0+QWRkRXJyb3Iob3B0aW9uc190b19pbnRlcnByZXRfLT5lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKnVuaW50ZXJwcmV0ZWRfb3B0aW9uXywgbG9jYXRpb24sIG1zZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhZGRzIGFuIGVycm9yIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3B0aW9uIG5hbWUKKyAgICAvLyBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIEFkZE5hbWVFcnJvcihjb25zdCBzdHJpbmcmIG1zZykgeworICAgICAgcmV0dXJuIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1BUSU9OX05BTUUsIG1zZyk7CisgICAgfQorCisgICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhZGRzIGFuIGVycm9yIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3B0aW9uIG5hbWUKKyAgICAvLyBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIEFkZFZhbHVlRXJyb3IoY29uc3Qgc3RyaW5nJiBtc2cpIHsKKyAgICAgIHJldHVybiBBZGRPcHRpb25FcnJvcihEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9WQUxVRSwgbXNnKTsKKyAgICB9CisKKyAgICAvLyBXZSBpbnRlcnByZXQgYWdhaW5zdCB0aGlzIGJ1aWxkZXIncyBwb29sLiBJcyBuZXZlciBOVUxMLiBXZSBkb24ndCBvd24KKyAgICAvLyB0aGlzIHBvaW50ZXIuCisgICAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXJfOworCisgICAgLy8gVGhlIG9wdGlvbnMgd2UncmUgY3VycmVudGx5IGludGVycHJldGluZywgb3IgTlVMTCBpZiB3ZSdyZSBub3QgaW4gYSBjYWxsCisgICAgLy8gdG8gSW50ZXJwcmV0T3B0aW9ucy4KKyAgICBjb25zdCBPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0XzsKKworICAgIC8vIFRoZSBvcHRpb24gd2UncmUgY3VycmVudGx5IGludGVycHJldGluZyB3aXRoaW4gb3B0aW9uc190b19pbnRlcnByZXRfLCBvcgorICAgIC8vIE5VTEwgaWYgd2UncmUgbm90IGluIGEgY2FsbCB0byBJbnRlcnByZXRPcHRpb25zKCkuIFRoaXMgcG9pbnRzIHRvIGEKKyAgICAvLyBzdWJtZXNzYWdlIG9mIHRoZSBvcmlnaW5hbCBvcHRpb24sIG5vdCB0aGUgbXV0YWJsZSBjb3B5LiBUaGVyZWZvcmUgd2UKKyAgICAvLyBjYW4gdXNlIGl0IHRvIGZpbmQgbG9jYXRpb25zIHJlY29yZGVkIGJ5IHRoZSBwYXJzZXIuCisgICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb25fOworCisgICAgLy8gRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBtZXNzYWdlcyB3ZSBuZWVkIHRvIHBhcnNlCisgICAgLy8gYW55IGFnZ3JlZ2F0ZSBvcHRpb24gdmFsdWVzIHdlIGVuY291bnRlci4KKyAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZHluYW1pY19mYWN0b3J5XzsKKworICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPcHRpb25JbnRlcnByZXRlcik7CisgIH07CisKKyAgLy8gV29yay1hcm91bmQgZm9yIGJyb2tlbiBjb21waWxlcnM6ICBBY2NvcmRpbmcgdG8gdGhlIEMrKyBzdGFuZGFyZCwKKyAgLy8gT3B0aW9uSW50ZXJwcmV0ZXIgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgYW55IGNsYXNzCisgIC8vIHdoaWNoIGhhcyBkZWNsYXJlZCBEZXNjcmlwdG9yQnVpbGRlciBhcyBhIGZyaWVuZC4gIFVuZm9ydHVuYXRlbHkgc29tZSBvbGQKKyAgLy8gdmVyc2lvbnMgb2YgR0NDIGFuZCBvdGhlciBjb21waWxlcnMgZG8gbm90IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseS4gIFNvLAorICAvLyB3ZSBoYXZlIHRvIGhhdmUgdGhlc2UgaW50ZXJtZWRpYXRlIG1ldGhvZHMgdG8gcHJvdmlkZSBhY2Nlc3MuICBXZSBhbHNvCisgIC8vIHJlZHVuZGFudGx5IGRlY2xhcmUgT3B0aW9uSW50ZXJwcmV0ZXIgYSBmcmllbmQganVzdCB0byBtYWtlIHRoaW5ncyBleHRyYQorICAvLyBjbGVhciBmb3IgdGhlc2UgYmFkIGNvbXBpbGVycy4KKyAgZnJpZW5kIGNsYXNzIE9wdGlvbkludGVycHJldGVyOworICBmcmllbmQgY2xhc3MgT3B0aW9uSW50ZXJwcmV0ZXI6OkFnZ3JlZ2F0ZU9wdGlvbkZpbmRlcjsKKworICBzdGF0aWMgaW5saW5lIGJvb2wgZ2V0X2FsbG93X3Vua25vd24oY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKKyAgICByZXR1cm4gcG9vbC0+YWxsb3dfdW5rbm93bl87CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGdldF9pc19wbGFjZWhvbGRlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIGRlc2NyaXB0b3ItPmlzX3BsYWNlaG9sZGVyXzsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0X211dGV4X2hlbGQoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKKyAgICBpZiAocG9vbC0+bXV0ZXhfICE9IE5VTEwpIHsKKyAgICAgIHBvb2wtPm11dGV4Xy0+QXNzZXJ0SGVsZCgpOworICAgIH0KKyAgfQorCisgIC8vIE11c3QgYmUgcnVuIG9ubHkgYWZ0ZXIgb3B0aW9ucyBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQuCisgIC8vCisgIC8vIE5PVEU6IFZhbGlkYXRpb24gY29kZSBtdXN0IG9ubHkgcmVmZXJlbmNlIHRoZSBvcHRpb25zIGluIHRoZSBtdXRhYmxlCisgIC8vIGRlc2NyaXB0b3JzLCB3aGljaCBhcmUgdGhlIG9uZXMgdGhhdCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQuIFRoZSBjb25zdAorICAvLyBwcm90byByZWZlcmVuY2VzIGFyZSBwYXNzZWQgaW4gb25seSBzbyB0aGV5IGNhbiBiZSBwcm92aWRlZCB0byBjYWxscyB0bworICAvLyBBZGRFcnJvcigpLiBEbyBub3QgbG9vayBhdCB0aGVpciBvcHRpb25zLCB3aGljaCBoYXZlIG5vdCBiZWVuIGludGVycHJldGVkLgorICB2b2lkIFZhbGlkYXRlRmlsZU9wdGlvbnMoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVNZXNzYWdlT3B0aW9ucyhEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlRW51bU9wdGlvbnMoRW51bURlc2NyaXB0b3IqIGVubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZUVudW1WYWx1ZU9wdGlvbnMoRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVTZXJ2aWNlT3B0aW9ucyhTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZU1ldGhvZE9wdGlvbnMoTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworICB2b2lkIFZhbGlkYXRlTWFwS2V5KEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworfTsKKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgR09PR0xFX0NIRUNLKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKQorICAgIDw8ICJDYW5ub3QgY2FsbCBCdWlsZEZpbGUgb24gYSBEZXNjcmlwdG9yUG9vbCB0aGF0IHVzZXMgYSAiCisgICAgICAgIkRlc2NyaXB0b3JEYXRhYmFzZS4gIFlvdSBtdXN0IGluc3RlYWQgZmluZCBhIHdheSB0byBnZXQgeW91ciBmaWxlICIKKyAgICAgICAiaW50byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4iOworICBHT09HTEVfQ0hFQ0sobXV0ZXhfID09IE5VTEwpOyAgIC8vIEltcGxpZWQgYnkgdGhlIGFib3ZlIEdPT0dMRV9DSEVDSy4KKyAgcmV0dXJuIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksIE5VTEwpLkJ1aWxkRmlsZShwcm90byk7Cit9CisKK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlQ29sbGVjdGluZ0Vycm9ycygKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKSB7CisgIEdPT0dMRV9DSEVDSyhmYWxsYmFja19kYXRhYmFzZV8gPT0gTlVMTCkKKyAgICA8PCAiQ2Fubm90IGNhbGwgQnVpbGRGaWxlIG9uIGEgRGVzY3JpcHRvclBvb2wgdGhhdCB1c2VzIGEgIgorICAgICAgICJEZXNjcmlwdG9yRGF0YWJhc2UuICBZb3UgbXVzdCBpbnN0ZWFkIGZpbmQgYSB3YXkgdG8gZ2V0IHlvdXIgZmlsZSAiCisgICAgICAgImludG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuIjsKKyAgR09PR0xFX0NIRUNLKG11dGV4XyA9PSBOVUxMKTsgICAvLyBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBHT09HTEVfQ0hFQ0suCisgIHJldHVybiBEZXNjcmlwdG9yQnVpbGRlcih0aGlzLCB0YWJsZXNfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29sbGVjdG9yKS5CdWlsZEZpbGUocHJvdG8pOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZUZyb21EYXRhYmFzZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgY29uc3QgeworICBtdXRleF8tPkFzc2VydEhlbGQoKTsKKyAgcmV0dXJuIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2Vycm9yX2NvbGxlY3Rvcl8pLkJ1aWxkRmlsZShwcm90byk7Cit9CisKK0Rlc2NyaXB0b3JCdWlsZGVyOjpEZXNjcmlwdG9yQnVpbGRlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICBEZXNjcmlwdG9yUG9vbDo6VGFibGVzKiB0YWJsZXMsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCisgIDogcG9vbF8ocG9vbCksCisgICAgdGFibGVzXyh0YWJsZXMpLAorICAgIGVycm9yX2NvbGxlY3Rvcl8oZXJyb3JfY29sbGVjdG9yKSwKKyAgICBoYWRfZXJyb3JzXyhmYWxzZSksCisgICAgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyhOVUxMKSB7fQorCitEZXNjcmlwdG9yQnVpbGRlcjo6fkRlc2NyaXB0b3JCdWlsZGVyKCkge30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkRXJyb3IoCisgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvciwKKyAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcikgeworICBpZiAoZXJyb3JfY29sbGVjdG9yXyA9PSBOVUxMKSB7CisgICAgaWYgKCFoYWRfZXJyb3JzXykgeworICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkludmFsaWQgcHJvdG8gZGVzY3JpcHRvciBmb3IgZmlsZSBcIiIgPDwgZmlsZW5hbWVfCisgICAgICAgICAgICAgICAgIDw8ICJcIjoiOworICAgIH0KKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiICAiIDw8IGVsZW1lbnRfbmFtZSA8PCAiOiAiIDw8IGVycm9yOworICB9IGVsc2UgeworICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGZpbGVuYW1lXywgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yLCBsb2NhdGlvbiwgZXJyb3IpOworICB9CisgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkTm90RGVmaW5lZEVycm9yKAorICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgIGNvbnN0IHN0cmluZyYgdW5kZWZpbmVkX3N5bWJvbCkgeworICBpZiAocG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyA9PSBOVUxMKSB7CisgICAgQWRkRXJyb3IoZWxlbWVudF9uYW1lLCBkZXNjcmlwdG9yLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAiXCIiICsgdW5kZWZpbmVkX3N5bWJvbCArICJcIiBpcyBub3QgZGVmaW5lZC4iKTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLAorICAgICAgICAgICAgICJcIiIgKyBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gKworICAgICAgICAgICAgICJcIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluIFwiIiArCisgICAgICAgICAgICAgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5Xy0+bmFtZSgpICsgIlwiLCB3aGljaCBpcyBub3QgIgorICAgICAgICAgICAgICJpbXBvcnRlZCBieSBcIiIgKyBmaWxlbmFtZV8gKyAiXCIuICBUbyB1c2UgaXQgaGVyZSwgcGxlYXNlICIKKyAgICAgICAgICAgICAiYWRkIHRoZSBuZWNlc3NhcnkgaW1wb3J0LiIpOworICB9Cit9CisKK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6OklzSW5QYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYWNrYWdlX25hbWUpIHsKKyAgcmV0dXJuIEhhc1ByZWZpeFN0cmluZyhmaWxlLT5wYWNrYWdlKCksIHBhY2thZ2VfbmFtZSkgJiYKKyAgICAgICAgICAgKGZpbGUtPnBhY2thZ2UoKS5zaXplKCkgPT0gcGFja2FnZV9uYW1lLnNpemUoKSB8fAorICAgICAgICAgICAgZmlsZS0+cGFja2FnZSgpW3BhY2thZ2VfbmFtZS5zaXplKCldID09ICcuJyk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlJlY29yZFB1YmxpY0RlcGVuZGVuY2llcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBpZiAoZmlsZSA9PSBOVUxMIHx8ICFkZXBlbmRlbmNpZXNfLmluc2VydChmaWxlKS5zZWNvbmQpIHJldHVybjsKKyAgZm9yIChpbnQgaSA9IDA7IGZpbGUgIT0gTlVMTCAmJiBpIDwgZmlsZS0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgUmVjb3JkUHVibGljRGVwZW5kZW5jaWVzKGZpbGUtPnB1YmxpY19kZXBlbmRlbmN5KGkpKTsKKyAgfQorfQorCitTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzSGVscGVyKAorICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgLy8gSWYgd2UgYXJlIGxvb2tpbmcgYXQgYW4gdW5kZXJsYXksIHdlIG11c3QgbG9jayBpdHMgbXV0ZXhfLCBzaW5jZSB3ZSBhcmUKKyAgLy8gYWNjZXNzaW5nIHRoZSB1bmRlcmxheSdzIHRhYmxlc18gZGlyZWN0bHkuCisgIE11dGV4TG9ja01heWJlIGxvY2soKHBvb2wgPT0gcG9vbF8pID8gTlVMTCA6IHBvb2wtPm11dGV4Xyk7CisKKyAgU3ltYm9sIHJlc3VsdCA9IHBvb2wtPnRhYmxlc18tPkZpbmRTeW1ib2wobmFtZSk7CisgIGlmIChyZXN1bHQuSXNOdWxsKCkgJiYgcG9vbC0+dW5kZXJsYXlfICE9IE5VTEwpIHsKKyAgICAvLyBTeW1ib2wgbm90IGZvdW5kOyBjaGVjayB0aGUgdW5kZXJsYXkuCisgICAgcmVzdWx0ID0gRmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHNIZWxwZXIocG9vbC0+dW5kZXJsYXlfLCBuYW1lKTsKKyAgfQorCisgIGlmIChyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICAvLyBJbiB0aGVvcnksIHdlIHNob3VsZG4ndCBuZWVkIHRvIGNoZWNrIGZhbGxiYWNrX2RhdGFiYXNlXyBiZWNhdXNlIHRoZQorICAgIC8vIHN5bWJvbCBzaG91bGQgYmUgaW4gb25lIG9mIGl0cyBmaWxlJ3MgZGlyZWN0IGRlcGVuZGVuY2llcywgYW5kIHdlIGhhdmUKKyAgICAvLyBhbHJlYWR5IGxvYWRlZCB0aG9zZSBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZS4gIEJ1dCB3ZSBjaGVjayBhbnl3YXkgc28KKyAgICAvLyB0aGF0IHdlIGNhbiBnZW5lcmF0ZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB3aGVuIGRlcGVuZGVuY2llcyBhcmUgbWlzc2luZworICAgIC8vIChpLmUuLCAibWlzc2luZyBkZXBlbmRlbmN5IiByYXRoZXIgdGhhbiAidHlwZSBpcyBub3QgZGVmaW5lZCIpLgorICAgIGlmIChwb29sLT5UcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKG5hbWUpKSB7CisgICAgICByZXN1bHQgPSBwb29sLT50YWJsZXNfLT5GaW5kU3ltYm9sKG5hbWUpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK1N5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHMoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHJldHVybiBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwc0hlbHBlcihwb29sXywgbmFtZSk7Cit9CisKK1N5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgU3ltYm9sIHJlc3VsdCA9IEZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKG5hbWUpOworCisgIGlmIChyZXN1bHQuSXNOdWxsKCkpIHJldHVybiByZXN1bHQ7CisKKyAgaWYgKCFwb29sXy0+ZW5mb3JjZV9kZXBlbmRlbmNpZXNfKSB7CisgICAgLy8gSGFjayBmb3IgQ29tcGlsZXJVcGdyYWRlci4KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gT25seSBmaW5kIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIHRoaXMgZmlsZSBvciBvbmUgb2YgaXRzCisgIC8vIGRlcGVuZGVuY2llcy4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSByZXN1bHQuR2V0RmlsZSgpOworICBpZiAoZmlsZSA9PSBmaWxlXyB8fCBkZXBlbmRlbmNpZXNfLmNvdW50KGZpbGUpID4gMCkgcmV0dXJuIHJlc3VsdDsKKworICBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpQQUNLQUdFKSB7CisgICAgLy8gQXJnLCB0aGlzIGlzIG92ZXJjb21wbGljYXRlZC4gIFRoZSBzeW1ib2wgaXMgYSBwYWNrYWdlIG5hbWUuICBJdCBjb3VsZAorICAgIC8vIGJlIHRoYXQgdGhlIHBhY2thZ2Ugd2FzIGRlZmluZWQgaW4gbXVsdGlwbGUgZmlsZXMuICByZXN1bHQuR2V0RmlsZSgpCisgICAgLy8gcmV0dXJucyB0aGUgZmlyc3QgZmlsZSB3ZSBzYXcgdGhhdCB1c2VkIHRoaXMgcGFja2FnZS4gIFdlJ3ZlIGRldGVybWluZWQKKyAgICAvLyB0aGF0IHRoYXQgZmlsZSBpcyBub3QgYSBkaXJlY3QgZGVwZW5kZW5jeSBvZiB0aGUgZmlsZSB3ZSBhcmUgY3VycmVudGx5CisgICAgLy8gYnVpbGRpbmcsIGJ1dCBpdCBjb3VsZCBiZSB0aGF0IHNvbWUgb3RoZXIgZmlsZSB3aGljaCAqaXMqIGEgZGlyZWN0CisgICAgLy8gZGVwZW5kZW5jeSBhbHNvIGRlZmluZXMgdGhlIHNhbWUgcGFja2FnZS4gIFdlIGNhbid0IHJlYWxseSBydWxlIG91dCB0aGlzCisgICAgLy8gc3ltYm9sIHVubGVzcyBub25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lIGl0LgorICAgIGlmIChJc0luUGFja2FnZShmaWxlXywgbmFtZSkpIHJldHVybiByZXN1bHQ7CisgICAgZm9yIChzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkZXBlbmRlbmNpZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBkZXBlbmRlbmNpZXNfLmVuZCgpOyArK2l0KSB7CisgICAgICAvLyBOb3RlOiAgQSBkZXBlbmRlbmN5IG1heSBiZSBOVUxMIGlmIGl0IHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy4KKyAgICAgIGlmICgqaXQgIT0gTlVMTCAmJiBJc0luUGFja2FnZSgqaXQsIG5hbWUpKSByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgfQorCisgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gPSBmaWxlOworICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gPSBuYW1lOworICByZXR1cm4ga051bGxTeW1ib2w7Cit9CisKK1N5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6TG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcigKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSkgeworICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfID0gTlVMTDsKKworICBpZiAobmFtZS5zaXplKCkgPiAwICYmIG5hbWVbMF0gPT0gJy4nKSB7CisgICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUuCisgICAgcmV0dXJuIEZpbmRTeW1ib2wobmFtZS5zdWJzdHIoMSkpOworICB9CisKKyAgLy8gSWYgbmFtZSBpcyBzb21ldGhpbmcgbGlrZSAiRm9vLkJhci5iYXoiLCBhbmQgc3ltYm9scyBuYW1lZCAiRm9vIiBhcmUKKyAgLy8gZGVmaW5lZCBpbiBtdWx0aXBsZSBwYXJlbnQgc2NvcGVzLCB3ZSBvbmx5IHdhbnQgdG8gZmluZCAiQmFyLmJheiIgaW4gdGhlCisgIC8vIGlubmVybW9zdCBvbmUuICBFLmcuLCB0aGUgZm9sbG93aW5nIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yOgorICAvLyAgIG1lc3NhZ2UgQmFyIHsgbWVzc2FnZSBCYXoge30gfQorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG1lc3NhZ2UgQmFyIHsKKyAgLy8gICAgIH0KKyAgLy8gICAgIG9wdGlvbmFsIEJhci5CYXogYmF6ID0gMTsKKyAgLy8gICB9CisgIC8vIFNvLCB3ZSBsb29rIGZvciBqdXN0ICJGb28iIGZpcnN0LCB0aGVuIGxvb2sgZm9yICJCYXIuYmF6IiB3aXRoaW4gaXQgaWYKKyAgLy8gZm91bmQuCisgIHN0cmluZzo6c2l6ZV90eXBlIG5hbWVfZG90X3BvcyA9IG5hbWUuZmluZF9maXJzdF9vZignLicpOworICBzdHJpbmcgZmlyc3RfcGFydF9vZl9uYW1lOworICBpZiAobmFtZV9kb3RfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgIGZpcnN0X3BhcnRfb2ZfbmFtZSA9IG5hbWU7CisgIH0gZWxzZSB7CisgICAgZmlyc3RfcGFydF9vZl9uYW1lID0gbmFtZS5zdWJzdHIoMCwgbmFtZV9kb3RfcG9zKTsKKyAgfQorCisgIHN0cmluZyBzY29wZV90b190cnkocmVsYXRpdmVfdG8pOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gQ2hvcCBvZmYgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBzY29wZS4KKyAgICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gc2NvcGVfdG9fdHJ5LmZpbmRfbGFzdF9vZignLicpOworICAgIGlmIChkb3RfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgcmV0dXJuIEZpbmRTeW1ib2wobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNjb3BlX3RvX3RyeS5lcmFzZShkb3RfcG9zKTsKKyAgICB9CisKKyAgICAvLyBBcHBlbmQgIi5maXJzdF9wYXJ0X29mX25hbWUiIGFuZCB0cnkgdG8gZmluZC4KKyAgICBzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHNjb3BlX3RvX3RyeS5zaXplKCk7CisgICAgc2NvcGVfdG9fdHJ5LmFwcGVuZCgxLCAnLicpOworICAgIHNjb3BlX3RvX3RyeS5hcHBlbmQoZmlyc3RfcGFydF9vZl9uYW1lKTsKKyAgICBTeW1ib2wgcmVzdWx0ID0gRmluZFN5bWJvbChzY29wZV90b190cnkpOworICAgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgICBpZiAoZmlyc3RfcGFydF9vZl9uYW1lLnNpemUoKSA8IG5hbWUuc2l6ZSgpKSB7CisgICAgICAgIC8vIG5hbWUgaXMgYSBjb21wb3VuZCBzeW1ib2wsIG9mIHdoaWNoIHdlIG9ubHkgZm91bmQgdGhlIGZpcnN0IHBhcnQuCisgICAgICAgIC8vIE5vdyB0cnkgdG8gbG9vayB1cCB0aGUgcmVzdCBvZiBpdC4KKyAgICAgICAgaWYgKHJlc3VsdC5Jc0FnZ3JlZ2F0ZSgpKSB7CisgICAgICAgICAgc2NvcGVfdG9fdHJ5LmFwcGVuZChuYW1lLCBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zaXplKCkgLSBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpKTsKKyAgICAgICAgICByZXR1cm4gRmluZFN5bWJvbChzY29wZV90b190cnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3ltYm9sIGJ1dCBpdCdzIG5vdCBhbiBhZ2dyZWdhdGUuICBDb250aW51ZSB0aGUgbG9vcC4KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlc29sdmVfbW9kZSA9PSBMT09LVVBfVFlQRVMgJiYgIXJlc3VsdC5Jc1R5cGUoKSkgeworICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3ltYm9sIGJ1dCBpdCdzIG5vdCBhIHR5cGUuICBDb250aW51ZSB0aGUgbG9vcC4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm90IGZvdW5kLiAgUmVtb3ZlIHRoZSBuYW1lIHNvIHdlIGNhbiB0cnkgYWdhaW4uCisgICAgc2NvcGVfdG9fdHJ5LmVyYXNlKG9sZF9zaXplKTsKKyAgfQorfQorCitTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6Okxvb2t1cFN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sCisgICAgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUsIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSkgeworICBTeW1ib2wgcmVzdWx0ID0gTG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcigKKyAgICAgIG5hbWUsIHJlbGF0aXZlX3RvLCByZXNvbHZlX21vZGUpOworICBpZiAocmVzdWx0LklzTnVsbCgpICYmIHBvb2xfLT5hbGxvd191bmtub3duXykgeworICAgIC8vIE5vdCBmb3VuZCwgYnV0IEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGlzIGVuYWJsZWQuICBSZXR1cm4gYQorICAgIC8vIHBsYWNlaG9sZGVyIGluc3RlYWQuCisgICAgcmVzdWx0ID0gTmV3UGxhY2Vob2xkZXIobmFtZSwgcGxhY2Vob2xkZXJfdHlwZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU3ltYm9sIERlc2NyaXB0b3JCdWlsZGVyOjpOZXdQbGFjZWhvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYWNlaG9sZGVyVHlwZSBwbGFjZWhvbGRlcl90eXBlKSB7CisgIC8vIENvbXB1dGUgbmFtZXMuCisgIGNvbnN0IHN0cmluZyogcGxhY2Vob2xkZXJfZnVsbF9uYW1lOworICBjb25zdCBzdHJpbmcqIHBsYWNlaG9sZGVyX25hbWU7CisgIGNvbnN0IHN0cmluZyogcGxhY2Vob2xkZXJfcGFja2FnZTsKKworICBpZiAoIVZhbGlkYXRlUXVhbGlmaWVkTmFtZShuYW1lKSkgcmV0dXJuIGtOdWxsU3ltYm9sOworICBpZiAobmFtZVswXSA9PSAnLicpIHsKKyAgICAvLyBGdWxseS1xdWFsaWZpZWQuCisgICAgcGxhY2Vob2xkZXJfZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcobmFtZS5zdWJzdHIoMSkpOworICB9IGVsc2UgeworICAgIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKG5hbWUpOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90cG9zID0gcGxhY2Vob2xkZXJfZnVsbF9uYW1lLT5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgaWYgKGRvdHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwbGFjZWhvbGRlcl9wYWNrYWdlID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoCisgICAgICBwbGFjZWhvbGRlcl9mdWxsX25hbWUtPnN1YnN0cigwLCBkb3Rwb3MpKTsKKyAgICBwbGFjZWhvbGRlcl9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoCisgICAgICBwbGFjZWhvbGRlcl9mdWxsX25hbWUtPnN1YnN0cihkb3Rwb3MgKyAxKSk7CisgIH0gZWxzZSB7CisgICAgcGxhY2Vob2xkZXJfcGFja2FnZSA9ICZrRW1wdHlTdHJpbmc7CisgICAgcGxhY2Vob2xkZXJfbmFtZSA9IHBsYWNlaG9sZGVyX2Z1bGxfbmFtZTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgcGxhY2Vob2xkZXJzLgorICBGaWxlRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfZmlsZSA9IHRhYmxlc18tPkFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpOworICBtZW1zZXQocGxhY2Vob2xkZXJfZmlsZSwgMCwgc2l6ZW9mKCpwbGFjZWhvbGRlcl9maWxlKSk7CisKKyAgcGxhY2Vob2xkZXJfZmlsZS0+c291cmNlX2NvZGVfaW5mb18gPSAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKTsKKworICBwbGFjZWhvbGRlcl9maWxlLT5uYW1lXyA9CisgICAgdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoKnBsYWNlaG9sZGVyX2Z1bGxfbmFtZSArICIucGxhY2Vob2xkZXIucHJvdG8iKTsKKyAgcGxhY2Vob2xkZXJfZmlsZS0+cGFja2FnZV8gPSBwbGFjZWhvbGRlcl9wYWNrYWdlOworICBwbGFjZWhvbGRlcl9maWxlLT5wb29sXyA9IHBvb2xfOworICBwbGFjZWhvbGRlcl9maWxlLT5vcHRpb25zXyA9ICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICBwbGFjZWhvbGRlcl9maWxlLT50YWJsZXNfID0gJkZpbGVEZXNjcmlwdG9yVGFibGVzOjprRW1wdHk7CisgIC8vIEFsbCBvdGhlciBmaWVsZHMgYXJlIHplcm8gb3IgTlVMTC4KKworICBpZiAocGxhY2Vob2xkZXJfdHlwZSA9PSBQTEFDRUhPTERFUl9FTlVNKSB7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+ZW51bV90eXBlX2NvdW50XyA9IDE7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+ZW51bV90eXBlc18gPQorICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxFbnVtRGVzY3JpcHRvcj4oMSk7CisKKyAgICBFbnVtRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfZW51bSA9ICZwbGFjZWhvbGRlcl9maWxlLT5lbnVtX3R5cGVzX1swXTsKKyAgICBtZW1zZXQocGxhY2Vob2xkZXJfZW51bSwgMCwgc2l6ZW9mKCpwbGFjZWhvbGRlcl9lbnVtKSk7CisKKyAgICBwbGFjZWhvbGRlcl9lbnVtLT5mdWxsX25hbWVfID0gcGxhY2Vob2xkZXJfZnVsbF9uYW1lOworICAgIHBsYWNlaG9sZGVyX2VudW0tPm5hbWVfID0gcGxhY2Vob2xkZXJfbmFtZTsKKyAgICBwbGFjZWhvbGRlcl9lbnVtLT5maWxlXyA9IHBsYWNlaG9sZGVyX2ZpbGU7CisgICAgcGxhY2Vob2xkZXJfZW51bS0+b3B0aW9uc18gPSAmRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgICBwbGFjZWhvbGRlcl9lbnVtLT5pc19wbGFjZWhvbGRlcl8gPSB0cnVlOworICAgIHBsYWNlaG9sZGVyX2VudW0tPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA9IChuYW1lWzBdICE9ICcuJyk7CisKKyAgICAvLyBFbnVtcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHZhbHVlLgorICAgIHBsYWNlaG9sZGVyX2VudW0tPnZhbHVlX2NvdW50XyA9IDE7CisgICAgcGxhY2Vob2xkZXJfZW51bS0+dmFsdWVzXyA9IHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8RW51bVZhbHVlRGVzY3JpcHRvcj4oMSk7CisKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiBwbGFjZWhvbGRlcl92YWx1ZSA9ICZwbGFjZWhvbGRlcl9lbnVtLT52YWx1ZXNfWzBdOworICAgIG1lbXNldChwbGFjZWhvbGRlcl92YWx1ZSwgMCwgc2l6ZW9mKCpwbGFjZWhvbGRlcl92YWx1ZSkpOworCisgICAgcGxhY2Vob2xkZXJfdmFsdWUtPm5hbWVfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoIlBMQUNFSE9MREVSX1ZBTFVFIik7CisgICAgLy8gTm90ZSB0aGF0IGVudW0gdmFsdWUgbmFtZXMgYXJlIHNpYmxpbmdzIG9mIHRoZWlyIHR5cGUsIG5vdCBjaGlsZHJlbi4KKyAgICBwbGFjZWhvbGRlcl92YWx1ZS0+ZnVsbF9uYW1lXyA9CisgICAgICBwbGFjZWhvbGRlcl9wYWNrYWdlLT5lbXB0eSgpID8gcGxhY2Vob2xkZXJfdmFsdWUtPm5hbWVfIDoKKyAgICAgICAgdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoKnBsYWNlaG9sZGVyX3BhY2thZ2UgKyAiLlBMQUNFSE9MREVSX1ZBTFVFIik7CisKKyAgICBwbGFjZWhvbGRlcl92YWx1ZS0+bnVtYmVyXyA9IDA7CisgICAgcGxhY2Vob2xkZXJfdmFsdWUtPnR5cGVfID0gcGxhY2Vob2xkZXJfZW51bTsKKyAgICBwbGFjZWhvbGRlcl92YWx1ZS0+b3B0aW9uc18gPSAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworCisgICAgcmV0dXJuIFN5bWJvbChwbGFjZWhvbGRlcl9lbnVtKTsKKyAgfSBlbHNlIHsKKyAgICBwbGFjZWhvbGRlcl9maWxlLT5tZXNzYWdlX3R5cGVfY291bnRfID0gMTsKKyAgICBwbGFjZWhvbGRlcl9maWxlLT5tZXNzYWdlX3R5cGVzXyA9CisgICAgICB0YWJsZXNfLT5BbGxvY2F0ZUFycmF5PERlc2NyaXB0b3I+KDEpOworCisgICAgRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfbWVzc2FnZSA9ICZwbGFjZWhvbGRlcl9maWxlLT5tZXNzYWdlX3R5cGVzX1swXTsKKyAgICBtZW1zZXQocGxhY2Vob2xkZXJfbWVzc2FnZSwgMCwgc2l6ZW9mKCpwbGFjZWhvbGRlcl9tZXNzYWdlKSk7CisKKyAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5mdWxsX25hbWVfID0gcGxhY2Vob2xkZXJfZnVsbF9uYW1lOworICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPm5hbWVfID0gcGxhY2Vob2xkZXJfbmFtZTsKKyAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5maWxlXyA9IHBsYWNlaG9sZGVyX2ZpbGU7CisgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+b3B0aW9uc18gPSAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5pc19wbGFjZWhvbGRlcl8gPSB0cnVlOworICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA9IChuYW1lWzBdICE9ICcuJyk7CisKKyAgICBpZiAocGxhY2Vob2xkZXJfdHlwZSA9PSBQTEFDRUhPTERFUl9FWFRFTkRBQkxFX01FU1NBR0UpIHsKKyAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9jb3VudF8gPSAxOworICAgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZXh0ZW5zaW9uX3Jhbmdlc18gPQorICAgICAgICB0YWJsZXNfLT5BbGxvY2F0ZUFycmF5PERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlPigxKTsKKyAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZXNfLT5zdGFydCA9IDE7CisgICAgICAvLyBrTWF4TnVtYmVyICsgMSBiZWNhdXNlIEV4dGVuc2lvblJhbmdlOjplbmQgaXMgZXhjbHVzaXZlLgorICAgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZXh0ZW5zaW9uX3Jhbmdlc18tPmVuZCA9CisgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciArIDE7CisgICAgfQorCisgICAgcmV0dXJuIFN5bWJvbChwbGFjZWhvbGRlcl9tZXNzYWdlKTsKKyAgfQorfQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvckJ1aWxkZXI6Ok5ld1BsYWNlaG9sZGVyRmlsZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRmlsZURlc2NyaXB0b3IqIHBsYWNlaG9sZGVyID0gdGFibGVzXy0+QWxsb2NhdGU8RmlsZURlc2NyaXB0b3I+KCk7CisgIG1lbXNldChwbGFjZWhvbGRlciwgMCwgc2l6ZW9mKCpwbGFjZWhvbGRlcikpOworCisgIHBsYWNlaG9sZGVyLT5uYW1lXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKG5hbWUpOworICBwbGFjZWhvbGRlci0+cGFja2FnZV8gPSAma0VtcHR5U3RyaW5nOworICBwbGFjZWhvbGRlci0+cG9vbF8gPSBwb29sXzsKKyAgcGxhY2Vob2xkZXItPm9wdGlvbnNfID0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIHBsYWNlaG9sZGVyLT50YWJsZXNfID0gJkZpbGVEZXNjcmlwdG9yVGFibGVzOjprRW1wdHk7CisgIC8vIEFsbCBvdGhlciBmaWVsZHMgYXJlIHplcm8gb3IgTlVMTC4KKworICByZXR1cm4gcGxhY2Vob2xkZXI7Cit9CisKK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZFN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgY29uc3QgTWVzc2FnZSYgcHJvdG8sIFN5bWJvbCBzeW1ib2wpIHsKKyAgLy8gSWYgdGhlIGNhbGxlciBwYXNzZWQgTlVMTCBmb3IgdGhlIHBhcmVudCwgdGhlIHN5bWJvbCBpcyBhdCBmaWxlIHNjb3BlLgorICAvLyBVc2UgaXRzIGZpbGUgYXMgdGhlIHBhcmVudCBpbnN0ZWFkLgorICBpZiAocGFyZW50ID09IE5VTEwpIHBhcmVudCA9IGZpbGVfOworCisgIGlmICh0YWJsZXNfLT5BZGRTeW1ib2woZnVsbF9uYW1lLCBzeW1ib2wpKSB7CisgICAgaWYgKCFmaWxlX3RhYmxlc18tPkFkZEFsaWFzVW5kZXJQYXJlbnQocGFyZW50LCBuYW1lLCBzeW1ib2wpKSB7CisgICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIlwiIiA8PCBmdWxsX25hbWUgPDwgIlwiIG5vdCBwcmV2aW91c2x5IGRlZmluZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgInN5bWJvbHNfYnlfbmFtZV8sIGJ1dCB3YXMgZGVmaW5lZCBpbiBzeW1ib2xzX2J5X3BhcmVudF87ICIKKyAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHNob3VsZG4ndCBiZSBwb3NzaWJsZS4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogb3RoZXJfZmlsZSA9IHRhYmxlc18tPkZpbmRTeW1ib2woZnVsbF9uYW1lKS5HZXRGaWxlKCk7CisgICAgaWYgKG90aGVyX2ZpbGUgPT0gZmlsZV8pIHsKKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSBmdWxsX25hbWUuZmluZF9sYXN0X29mKCcuJyk7CisgICAgICBpZiAoZG90X3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQWRkRXJyb3IoZnVsbF9uYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICAgICAiXCIiICsgZnVsbF9uYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZC4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIGZ1bGxfbmFtZS5zdWJzdHIoZG90X3BvcyArIDEpICsKKyAgICAgICAgICAgICAgICAgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcIiIgKworICAgICAgICAgICAgICAgICBmdWxsX25hbWUuc3Vic3RyKDAsIGRvdF9wb3MpICsgIlwiLiIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBTeW1ib2wgc2VlbXMgdG8gaGF2ZSBiZWVuIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZS4KKyAgICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJcIiIgKyBmdWxsX25hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGZpbGUgXCIiICsKKyAgICAgICAgICAgICAgIG90aGVyX2ZpbGUtPm5hbWUoKSArICJcIi4iKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZFBhY2thZ2UoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBNZXNzYWdlJiBwcm90bywgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKHRhYmxlc18tPkFkZFN5bWJvbChuYW1lLCBTeW1ib2woZmlsZSkpKSB7CisgICAgLy8gU3VjY2Vzcy4gIEFsc28gYWRkIHBhcmVudCBwYWNrYWdlLCBpZiBhbnkuCisgICAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IG5hbWUuZmluZF9sYXN0X29mKCcuJyk7CisgICAgaWYgKGRvdF9wb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBObyBwYXJlbnRzLgorICAgICAgVmFsaWRhdGVTeW1ib2xOYW1lKG5hbWUsIG5hbWUsIHByb3RvKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSGFzIHBhcmVudC4KKyAgICAgIHN0cmluZyogcGFyZW50X25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhuYW1lLnN1YnN0cigwLCBkb3RfcG9zKSk7CisgICAgICBBZGRQYWNrYWdlKCpwYXJlbnRfbmFtZSwgcHJvdG8sIGZpbGUpOworICAgICAgVmFsaWRhdGVTeW1ib2xOYW1lKG5hbWUuc3Vic3RyKGRvdF9wb3MgKyAxKSwgbmFtZSwgcHJvdG8pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBTeW1ib2wgZXhpc3Rpbmdfc3ltYm9sID0gdGFibGVzXy0+RmluZFN5bWJvbChuYW1lKTsKKyAgICAvLyBJdCdzIE9LIHRvIHJlZGVmaW5lIGEgcGFja2FnZS4KKyAgICBpZiAoZXhpc3Rpbmdfc3ltYm9sLnR5cGUgIT0gU3ltYm9sOjpQQUNLQUdFKSB7CisgICAgICAvLyBTeW1ib2wgc2VlbXMgdG8gaGF2ZSBiZWVuIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZS4KKyAgICAgIEFkZEVycm9yKG5hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHNvbWV0aGluZyBvdGhlciB0aGFuICIKKyAgICAgICAgICAgICAgICJhIHBhY2thZ2UpIGluIGZpbGUgXCIiICsgZXhpc3Rpbmdfc3ltYm9sLkdldEZpbGUoKS0+bmFtZSgpICsKKyAgICAgICAgICAgICAgICJcIi4iKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVTeW1ib2xOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsIGNvbnN0IE1lc3NhZ2UmIHByb3RvKSB7CisgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICBBZGRFcnJvcihmdWxsX25hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgIk1pc3NpbmcgbmFtZS4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICAgIC8vIEkgZG9uJ3QgdHJ1c3QgaXNhbG51bSgpIGR1ZSB0byBsb2NhbGVzLiAgOigKKyAgICAgIGlmICgobmFtZVtpXSA8ICdhJyB8fCAneicgPCBuYW1lW2ldKSAmJgorICAgICAgICAgIChuYW1lW2ldIDwgJ0EnIHx8ICdaJyA8IG5hbWVbaV0pICYmCisgICAgICAgICAgKG5hbWVbaV0gPCAnMCcgfHwgJzknIDwgbmFtZVtpXSkgJiYKKyAgICAgICAgICAobmFtZVtpXSAhPSAnXycpKSB7CisgICAgICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllci4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVRdWFsaWZpZWROYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBib29sIGxhc3Rfd2FzX3BlcmlvZCA9IGZhbHNlOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgIC8vIEkgZG9uJ3QgdHJ1c3QgaXNhbG51bSgpIGR1ZSB0byBsb2NhbGVzLiAgOigKKyAgICBpZiAoKCdhJyA8PSBuYW1lW2ldICYmIG5hbWVbaV0gPD0gJ3onKSB8fAorICAgICAgICAoJ0EnIDw9IG5hbWVbaV0gJiYgbmFtZVtpXSA8PSAnWicpIHx8CisgICAgICAgICgnMCcgPD0gbmFtZVtpXSAmJiBuYW1lW2ldIDw9ICc5JykgfHwKKyAgICAgICAgKG5hbWVbaV0gPT0gJ18nKSkgeworICAgICAgbGFzdF93YXNfcGVyaW9kID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChuYW1lW2ldID09ICcuJykgeworICAgICAgaWYgKGxhc3Rfd2FzX3BlcmlvZCkgcmV0dXJuIGZhbHNlOworICAgICAgbGFzdF93YXNfcGVyaW9kID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiAhbmFtZS5lbXB0eSgpICYmICFsYXN0X3dhc19wZXJpb2Q7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBnZW5lcmljIGltcGxlbWVudGF0aW9uIGlzIGdvb2QgZm9yIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQKKy8vIEZpbGVEZXNjcmlwdG9yLgordGVtcGxhdGU8Y2xhc3MgRGVzY3JpcHRvclQ+IHZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFsbG9jYXRlT3B0aW9ucygKKyAgICBjb25zdCB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUmIG9yaWdfb3B0aW9ucywKKyAgICBEZXNjcmlwdG9yVCogZGVzY3JpcHRvcikgeworICBBbGxvY2F0ZU9wdGlvbnNJbXBsKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBvcmlnX29wdGlvbnMsIGRlc2NyaXB0b3IpOworfQorCisvLyBXZSBzcGVjaWFsaXplIGZvciBGaWxlRGVzY3JpcHRvci4KK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFsbG9jYXRlT3B0aW9ucyhjb25zdCBGaWxlT3B0aW9ucyYgb3JpZ19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIC8vIFdlIGFkZCB0aGUgZHVtbXkgdG9rZW4gc28gdGhhdCBMb29rdXBTeW1ib2wgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisgIEFsbG9jYXRlT3B0aW9uc0ltcGwoZGVzY3JpcHRvci0+cGFja2FnZSgpICsgIi5kdW1teSIsIGRlc2NyaXB0b3ItPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBvcmlnX29wdGlvbnMsIGRlc2NyaXB0b3IpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBEZXNjcmlwdG9yVD4gdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWxsb2NhdGVPcHRpb25zSW1wbCgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWVfc2NvcGUsCisgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgY29uc3QgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlJiBvcmlnX29wdGlvbnMsCisgICAgRGVzY3JpcHRvclQqIGRlc2NyaXB0b3IpIHsKKyAgLy8gV2UgbmVlZCB0byB1c2UgYSBkdW1teSBwb2ludGVyIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIG9sZGVyIHZlcnNpb25zIG9mCisgIC8vIEdDQy4gIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyB0d28gbGluZXMgY291bGQgYmUgcmVwbGFjZWQgd2l0aDoKKyAgLy8gICB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUqIG9wdGlvbnMgPQorICAvLyAgICAgICB0YWJsZXNfLT5BbGxvY2F0ZU1lc3NhZ2U8dHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlPigpOworICB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUqIGNvbnN0IGR1bW15ID0gTlVMTDsKKyAgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlKiBvcHRpb25zID0gdGFibGVzXy0+QWxsb2NhdGVNZXNzYWdlKGR1bW15KTsKKyAgLy8gQXZvaWQgdXNpbmcgTWVyZ2VGcm9tKCkvQ29weUZyb20oKSBpbiB0aGlzIGNsYXNzIHRvIG1ha2UgaXQgLWZuby1ydHRpCisgIC8vIGZyaWVuZGx5LiBXaXRob3V0IFJUVEksIE1lcmdlRnJvbSgpIGFuZCBDb3B5RnJvbSgpIHdpbGwgZmFsbGJhY2sgdG8gdGhlCisgIC8vIHJlZmxlY3Rpb24gYmFzZWQgbWV0aG9kLCB3aGljaCByZXF1aXJlcyB0aGUgRGVzY3JpcHRvci4gSG93ZXZlciwgd2UgYXJlIGluCisgIC8vIHRoZSBtaWRkbGUgb2YgYnVpbGRpbmcgdGhlIGRlc2NyaXB0b3JzLCB0aHVzIHRoZSBkZWFkbG9jay4KKyAgb3B0aW9ucy0+UGFyc2VGcm9tU3RyaW5nKG9yaWdfb3B0aW9ucy5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgZGVzY3JpcHRvci0+b3B0aW9uc18gPSBvcHRpb25zOworCisgIC8vIERvbid0IGFkZCB0byBvcHRpb25zX3RvX2ludGVycHJldF8gdW5sZXNzIHRoZXJlIHdlcmUgdW5pbnRlcnByZXRlZAorICAvLyBvcHRpb25zLiAgVGhpcyBub3Qgb25seSBhdm9pZHMgdW5uZWNlc3Nhcnkgd29yaywgYnV0IHByZXZlbnRzIGEKKyAgLy8gYm9vdHN0cmFwcGluZyBwcm9ibGVtIHdoZW4gYnVpbGRpbmcgZGVzY3JpcHRvcnMgZm9yIGRlc2NyaXB0b3IucHJvdG8uCisgIC8vIGRlc2NyaXB0b3IucHJvdG8gZG9lcyBub3QgY29udGFpbiBhbnkgdW5pbnRlcnByZXRlZCBvcHRpb25zLCBidXQKKyAgLy8gYXR0ZW1wdGluZyB0byBpbnRlcnByZXQgb3B0aW9ucyBhbnl3YXkgd2lsbCBjYXVzZQorICAvLyBPcHRpb25zVHlwZTo6R2V0RGVzY3JpcHRvcigpIHRvIGJlIGNhbGxlZCB3aGljaCBtYXkgdGhlbiBkZWFkbG9jayBzaW5jZQorICAvLyB3ZSdyZSBzdGlsbCB0cnlpbmcgdG8gYnVpbGQgaXQuCisgIGlmIChvcHRpb25zLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgPiAwKSB7CisgICAgb3B0aW9uc190b19pbnRlcnByZXRfLnB1c2hfYmFjaygKKyAgICAgICAgT3B0aW9uc1RvSW50ZXJwcmV0KG5hbWVfc2NvcGUsIGVsZW1lbnRfbmFtZSwgJm9yaWdfb3B0aW9ucywgb3B0aW9ucykpOworICB9Cit9CisKKworLy8gQSBjb21tb24gcGF0dGVybjogIFdlIHdhbnQgdG8gY29udmVydCBhIHJlcGVhdGVkIGZpZWxkIGluIHRoZSBkZXNjcmlwdG9yCisvLyB0byBhbiBhcnJheSBvZiB2YWx1ZXMsIGNhbGxpbmcgc29tZSBtZXRob2QgdG8gYnVpbGQgZWFjaCB2YWx1ZS4KKyNkZWZpbmUgQlVJTERfQVJSQVkoSU5QVVQsIE9VVFBVVCwgTkFNRSwgTUVUSE9ELCBQQVJFTlQpICAgICAgICAgICAgIFwKKyAgT1VUUFVULT5OQU1FIyNfY291bnRfID0gSU5QVVQuTkFNRSMjX3NpemUoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQWxsb2NhdGVBcnJheShJTlBVVC5OQU1FIyNfc2l6ZSgpLCAmT1VUUFVULT5OQU1FIyNzXyk7ICAgICAgICAgICAgIFwKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlBVVC5OQU1FIyNfc2l6ZSgpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNRVRIT0QoSU5QVVQuTkFNRShpKSwgUEFSRU5ULCBPVVRQVVQtPk5BTUUjI3NfICsgaSk7ICAgICAgICAgICAgIFwKKyAgfQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRmlsZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBmaWxlbmFtZV8gPSBwcm90by5uYW1lKCk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIGJlaW5nIGJ1aWx0LgorICAvLyBOb3RlOiAgVGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBpbnB1dCBpcyBjYW5vbmljYWwgLS0gdGhhdCBpcywgaXQKKyAgLy8gICBmdWxseS1xdWFsaWZpZXMgYWxsIHR5cGUgbmFtZXMsIGhhcyBubyBVbmludGVycHJldGVkT3B0aW9ucywgZXRjLgorICAvLyAgIFRoaXMgaXMgZmluZSwgYmVjYXVzZSB0aGlzIGlkZW1wb3RlbmN5ICJmZWF0dXJlIiByZWFsbHkgb25seSBleGlzdHMgdG8KKyAgLy8gICBhY2NvbW9kYXRlIG9uZSBoYWNrIGluIHRoZSBwcm90bzEtPnByb3RvMiBtaWdyYXRpb24gbGF5ZXIuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBleGlzdGluZ19maWxlID0gdGFibGVzXy0+RmluZEZpbGUoZmlsZW5hbWVfKTsKKyAgaWYgKGV4aXN0aW5nX2ZpbGUgIT0gTlVMTCkgeworICAgIC8vIEZpbGUgYWxyZWFkeSBpbiBwb29sLiAgQ29tcGFyZSB0aGUgZXhpc3Rpbmcgb25lIHRvIHRoZSBpbnB1dC4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGV4aXN0aW5nX3Byb3RvOworICAgIGV4aXN0aW5nX2ZpbGUtPkNvcHlUbygmZXhpc3RpbmdfcHJvdG8pOworICAgIGlmIChleGlzdGluZ19wcm90by5TZXJpYWxpemVBc1N0cmluZygpID09IHByb3RvLlNlcmlhbGl6ZUFzU3RyaW5nKCkpIHsKKyAgICAgIC8vIFRoZXkncmUgaWRlbnRpY2FsLiAgUmV0dXJuIHRoZSBleGlzdGluZyBkZXNjcmlwdG9yLgorICAgICAgcmV0dXJuIGV4aXN0aW5nX2ZpbGU7CisgICAgfQorCisgICAgLy8gTm90IGEgbWF0Y2guICBUaGUgZXJyb3Igd2lsbCBiZSBkZXRlY3RlZCBhbmQgaGFuZGxlZCBsYXRlci4KKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGZpbGUgaXMgYWxyZWFkeSBvbiB0aGUgcGVuZGluZyBmaWxlcyBsaXN0LgorICAvLyBUT0RPKGtlbnRvbik6ICBBbGxvdyByZWN1cnNpdmUgaW1wb3J0cz8gIEl0IG1heSBub3Qgd29yayB3aXRoIHNvbWUKKyAgLy8gICAobW9zdD8pIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIEUuZy4sIGluIEMrKywgYSBmb3J3YXJkIGRlY2xhcmF0aW9uCisgIC8vICAgb2YgYSB0eXBlIGlzIG5vdCBzdWZmaWNpZW50IHRvIGFsbG93IGl0IHRvIGJlIHVzZWQgZXZlbiBpbiBhCisgIC8vICAgZ2VuZXJhdGVkIGhlYWRlciBmaWxlIGR1ZSB0byBpbmxpbmluZy4gIFRoaXMgY291bGQgcGVyaGFwcyBiZQorICAvLyAgIHdvcmtlZCBhcm91bmQgdXNpbmcgdHJpY2tzIGludm9sdmluZyBpbnNlcnRpbmcgI2luY2x1ZGUgc3RhdGVtZW50cworICAvLyAgIG1pZC1maWxlLCBidXQgdGhhdCdzIHByZXR0eSB1Z2x5LCBhbmQgSSdtIHByZXR0eSBzdXJlIHRoZXJlIGFyZQorICAvLyAgIHNvbWUgbGFuZ3VhZ2VzIG91dCB0aGVyZSB0aGF0IGRvIG5vdCBhbGxvdyByZWN1cnNpdmUgZGVwZW5kZW5jaWVzCisgIC8vICAgYXQgYWxsLgorICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfW2ldID09IHByb3RvLm5hbWUoKSkgeworICAgICAgc3RyaW5nIGVycm9yX21lc3NhZ2UoIkZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIpOworICAgICAgZm9yICg7IGkgPCB0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzXy5zaXplKCk7IGkrKykgeworICAgICAgICBlcnJvcl9tZXNzYWdlLmFwcGVuZCh0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzX1tpXSk7CisgICAgICAgIGVycm9yX21lc3NhZ2UuYXBwZW5kKCIgLT4gIik7CisgICAgICB9CisgICAgICBlcnJvcl9tZXNzYWdlLmFwcGVuZChwcm90by5uYW1lKCkpOworCisgICAgICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICAvLyBJZiB3ZSBoYXZlIGEgZmFsbGJhY2tfZGF0YWJhc2VfLCBhdHRlbXB0IHRvIGxvYWQgYWxsIGRlcGVuZGVuY2llcyBub3csCisgIC8vIGJlZm9yZSBjaGVja3BvaW50aW5nIHRhYmxlc18uICBUaGlzIGF2b2lkcyBjb25mdXNpb24gd2l0aCByZWN1cnNpdmUKKyAgLy8gY2hlY2twb2ludHMuCisgIGlmIChwb29sXy0+ZmFsbGJhY2tfZGF0YWJhc2VfICE9IE5VTEwpIHsKKyAgICB0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzXy5wdXNoX2JhY2socHJvdG8ubmFtZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmICh0YWJsZXNfLT5GaW5kRmlsZShwcm90by5kZXBlbmRlbmN5KGkpKSA9PSBOVUxMICYmCisgICAgICAgICAgKHBvb2xfLT51bmRlcmxheV8gPT0gTlVMTCB8fAorICAgICAgICAgICBwb29sXy0+dW5kZXJsYXlfLT5GaW5kRmlsZUJ5TmFtZShwcm90by5kZXBlbmRlbmN5KGkpKSA9PSBOVUxMKSkgeworICAgICAgICAvLyBXZSBkb24ndCBjYXJlIHdoYXQgdGhpcyByZXR1cm5zIHNpbmNlIHdlJ2xsIGZpbmQgb3V0IGJlbG93IGFueXdheS4KKyAgICAgICAgcG9vbF8tPlRyeUZpbmRGaWxlSW5GYWxsYmFja0RhdGFiYXNlKHByb3RvLmRlcGVuZGVuY3koaSkpOworICAgICAgfQorICAgIH0KKyAgICB0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzXy5wb3BfYmFjaygpOworICB9CisKKyAgLy8gQ2hlY2twb2ludCB0aGUgdGFibGVzIHNvIHRoYXQgd2UgY2FuIHJvbGwgYmFjayBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgdGFibGVzXy0+QWRkQ2hlY2twb2ludCgpOworCisgIEZpbGVEZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5BbGxvY2F0ZTxGaWxlRGVzY3JpcHRvcj4oKTsKKyAgZmlsZV8gPSByZXN1bHQ7CisKKyAgaWYgKHByb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKKyAgICBTb3VyY2VDb2RlSW5mbyAqaW5mbyA9IHRhYmxlc18tPkFsbG9jYXRlTWVzc2FnZTxTb3VyY2VDb2RlSW5mbz4oKTsKKyAgICBpbmZvLT5Db3B5RnJvbShwcm90by5zb3VyY2VfY29kZV9pbmZvKCkpOworICAgIHJlc3VsdC0+c291cmNlX2NvZGVfaW5mb18gPSBpbmZvOworICB9IGVsc2UgeworICAgIHJlc3VsdC0+c291cmNlX2NvZGVfaW5mb18gPSAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZpbGVfdGFibGVzXyA9IHRhYmxlc18tPkFsbG9jYXRlRmlsZVRhYmxlcygpOworICBmaWxlXy0+dGFibGVzXyA9IGZpbGVfdGFibGVzXzsKKworICBpZiAoIXByb3RvLmhhc19uYW1lKCkpIHsKKyAgICBBZGRFcnJvcigiIiwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgIk1pc3NpbmcgZmllbGQ6IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZS4iKTsKKyAgfQorCisgIHJlc3VsdC0+bmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOworICBpZiAocHJvdG8uaGFzX3BhY2thZ2UoKSkgeworICAgIHJlc3VsdC0+cGFja2FnZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5wYWNrYWdlKCkpOworICB9IGVsc2UgeworICAgIC8vIFdlIGNhbm5vdCByZWx5IG9uIHByb3RvLnBhY2thZ2UoKSByZXR1cm5pbmcgYSB2YWxpZCBzdHJpbmcgaWYKKyAgICAvLyBwcm90by5oYXNfcGFja2FnZSgpIGlzIGZhbHNlLCBiZWNhdXNlIHdlIG1pZ2h0IGJlIHJ1bm5pbmcgYXQgc3RhdGljCisgICAgLy8gaW5pdGlhbGl6YXRpb24gdGltZSwgaW4gd2hpY2ggY2FzZSBkZWZhdWx0IHZhbHVlcyBoYXZlIG5vdCB5ZXQgYmVlbgorICAgIC8vIGluaXRpYWxpemVkLgorICAgIHJlc3VsdC0+cGFja2FnZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZygiIik7CisgIH0KKyAgcmVzdWx0LT5wb29sXyA9IHBvb2xfOworCisgIC8vIEFkZCB0byB0YWJsZXMuCisgIGlmICghdGFibGVzXy0+QWRkRmlsZShyZXN1bHQpKSB7CisgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAiQSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdGhlIHBvb2wuIik7CisgICAgLy8gQmFpbCBvdXQgZWFybHkgc28gdGhhdCBpZiB0aGlzIGlzIGFjdHVhbGx5IHRoZSBleGFjdCBzYW1lIGZpbGUsIHdlCisgICAgLy8gZG9uJ3QgZW5kIHVwIHJlcG9ydGluZyB0aGF0IGV2ZXJ5IHNpbmdsZSBzeW1ib2wgaXMgYWxyZWFkeSBkZWZpbmVkLgorICAgIHRhYmxlc18tPlJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghcmVzdWx0LT5wYWNrYWdlKCkuZW1wdHkoKSkgeworICAgIEFkZFBhY2thZ2UocmVzdWx0LT5wYWNrYWdlKCksIHByb3RvLCByZXN1bHQpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIGFsbCBkZXBlbmRlbmNpZXMgYXJlIGxvYWRlZC4KKyAgc2V0PHN0cmluZz4gc2Vlbl9kZXBlbmRlbmNpZXM7CisgIHJlc3VsdC0+ZGVwZW5kZW5jeV9jb3VudF8gPSBwcm90by5kZXBlbmRlbmN5X3NpemUoKTsKKyAgcmVzdWx0LT5kZXBlbmRlbmNpZXNfID0KKyAgICB0YWJsZXNfLT5BbGxvY2F0ZUFycmF5PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4ocHJvdG8uZGVwZW5kZW5jeV9zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXNlZW5fZGVwZW5kZW5jaWVzLmluc2VydChwcm90by5kZXBlbmRlbmN5KGkpKS5zZWNvbmQpIHsKKyAgICAgIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICAgIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGkpICsgIlwiIHdhcyBsaXN0ZWQgdHdpY2UuIik7CisgICAgfQorCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcGVuZGVuY3kgPSB0YWJsZXNfLT5GaW5kRmlsZShwcm90by5kZXBlbmRlbmN5KGkpKTsKKyAgICBpZiAoZGVwZW5kZW5jeSA9PSBOVUxMICYmIHBvb2xfLT51bmRlcmxheV8gIT0gTlVMTCkgeworICAgICAgZGVwZW5kZW5jeSA9IHBvb2xfLT51bmRlcmxheV8tPkZpbmRGaWxlQnlOYW1lKHByb3RvLmRlcGVuZGVuY3koaSkpOworICAgIH0KKworICAgIGlmIChkZXBlbmRlbmN5ID09IE5VTEwpIHsKKyAgICAgIGlmIChwb29sXy0+YWxsb3dfdW5rbm93bl8pIHsKKyAgICAgICAgZGVwZW5kZW5jeSA9IE5ld1BsYWNlaG9sZGVyRmlsZShwcm90by5kZXBlbmRlbmN5KGkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmluZyBtZXNzYWdlOworICAgICAgICBpZiAocG9vbF8tPmZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKSB7CisgICAgICAgICAgbWVzc2FnZSA9ICJJbXBvcnQgXCIiICsgcHJvdG8uZGVwZW5kZW5jeShpKSArCisgICAgICAgICAgICAgICAgICAgICJcIiBoYXMgbm90IGJlZW4gbG9hZGVkLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVzc2FnZSA9ICJJbXBvcnQgXCIiICsgcHJvdG8uZGVwZW5kZW5jeShpKSArCisgICAgICAgICAgICAgICAgICAgICJcIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuIjsKKyAgICAgICAgfQorICAgICAgICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQtPmRlcGVuZGVuY2llc19baV0gPSBkZXBlbmRlbmN5OworICB9CisKKyAgLy8gQ2hlY2sgcHVibGljIGRlcGVuZGVuY2llcy4KKyAgaW50IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50ID0gMDsKKyAgcmVzdWx0LT5wdWJsaWNfZGVwZW5kZW5jaWVzXyA9IHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8aW50PigKKyAgICAgIHByb3RvLnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ucHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBPbmx5IHB1dCB2YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleGVzLgorICAgIGludCBpbmRleCA9IHByb3RvLnB1YmxpY19kZXBlbmRlbmN5KGkpOworICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgcHJvdG8uZGVwZW5kZW5jeV9zaXplKCkpIHsKKyAgICAgIHJlc3VsdC0+cHVibGljX2RlcGVuZGVuY2llc19bcHVibGljX2RlcGVuZGVuY3lfY291bnQrK10gPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgICAiSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC4iKTsKKyAgICB9CisgIH0KKyAgcmVzdWx0LT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudF8gPSBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudDsKKworICAvLyBCdWlsZCBkZXBlbmRlbmN5IHNldAorICBkZXBlbmRlbmNpZXNfLmNsZWFyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIFJlY29yZFB1YmxpY0RlcGVuZGVuY2llcyhyZXN1bHQtPmRlcGVuZGVuY3koaSkpOworICB9CisKKyAgLy8gQ2hlY2sgd2VhayBkZXBlbmRlbmNpZXMuCisgIGludCB3ZWFrX2RlcGVuZGVuY3lfY291bnQgPSAwOworICByZXN1bHQtPndlYWtfZGVwZW5kZW5jaWVzXyA9IHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8aW50PigKKyAgICAgIHByb3RvLndlYWtfZGVwZW5kZW5jeV9zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLndlYWtfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIGludCBpbmRleCA9IHByb3RvLndlYWtfZGVwZW5kZW5jeShpKTsKKyAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpKSB7CisgICAgICByZXN1bHQtPndlYWtfZGVwZW5kZW5jaWVzX1t3ZWFrX2RlcGVuZGVuY3lfY291bnQrK10gPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgICAiSW52YWxpZCB3ZWFrIGRlcGVuZGVuY3kgaW5kZXguIik7CisgICAgfQorICB9CisgIHJlc3VsdC0+d2Vha19kZXBlbmRlbmN5X2NvdW50XyA9IHdlYWtfZGVwZW5kZW5jeV9jb3VudDsKKworICAvLyBDb252ZXJ0IGNoaWxkcmVuLgorICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBtZXNzYWdlX3R5cGUsIEJ1aWxkTWVzc2FnZSAgLCBOVUxMKTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZW51bV90eXBlICAgLCBCdWlsZEVudW0gICAgICwgTlVMTCk7CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIHNlcnZpY2UgICAgICwgQnVpbGRTZXJ2aWNlICAsIE5VTEwpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb24gICAsIEJ1aWxkRXh0ZW5zaW9uLCBOVUxMKTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgbXVzdCBvY2N1ciBpbiBleGFjdGx5IHRoZSBzcGVjaWZpZWQgb3JkZXIuCisKKyAgLy8gQ3Jvc3MtbGluay4KKyAgQ3Jvc3NMaW5rRmlsZShyZXN1bHQsIHByb3RvKTsKKworICAvLyBJbnRlcnByZXQgYW55IHJlbWFpbmluZyB1bmludGVycHJldGVkIG9wdGlvbnMgZ2F0aGVyZWQgaW50bworICAvLyBvcHRpb25zX3RvX2ludGVycHJldF8gZHVyaW5nIGRlc2NyaXB0b3IgYnVpbGRpbmcuICBDcm9zcy1saW5raW5nIGhhcyBtYWRlCisgIC8vIGV4dGVuc2lvbiBvcHRpb25zIGtub3duLCBzbyBhbGwgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBub3cgc3VjY2VlZC4KKyAgaWYgKCFoYWRfZXJyb3JzXykgeworICAgIE9wdGlvbkludGVycHJldGVyIG9wdGlvbl9pbnRlcnByZXRlcih0aGlzKTsKKyAgICBmb3IgKHZlY3RvcjxPcHRpb25zVG9JbnRlcnByZXQ+OjppdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgICBvcHRpb25zX3RvX2ludGVycHJldF8uYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gb3B0aW9uc190b19pbnRlcnByZXRfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIG9wdGlvbl9pbnRlcnByZXRlci5JbnRlcnByZXRPcHRpb25zKCYoKml0ZXIpKTsKKyAgICB9CisgICAgb3B0aW9uc190b19pbnRlcnByZXRfLmNsZWFyKCk7CisgIH0KKworICAvLyBWYWxpZGF0ZSBvcHRpb25zLgorICBpZiAoIWhhZF9lcnJvcnNfKSB7CisgICAgVmFsaWRhdGVGaWxlT3B0aW9ucyhyZXN1bHQsIHByb3RvKTsKKyAgfQorCisgIGlmIChoYWRfZXJyb3JzXykgeworICAgIHRhYmxlc18tPlJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpOworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIHRhYmxlc18tPkNsZWFyTGFzdENoZWNrcG9pbnQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKiByZXN1bHQpIHsKKyAgY29uc3Qgc3RyaW5nJiBzY29wZSA9IChwYXJlbnQgPT0gTlVMTCkgPworICAgIGZpbGVfLT5wYWNrYWdlKCkgOiBwYXJlbnQtPmZ1bGxfbmFtZSgpOworICBzdHJpbmcqIGZ1bGxfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHNjb3BlKTsKKyAgaWYgKCFmdWxsX25hbWUtPmVtcHR5KCkpIGZ1bGxfbmFtZS0+YXBwZW5kKDEsICcuJyk7CisgIGZ1bGxfbmFtZS0+YXBwZW5kKHByb3RvLm5hbWUoKSk7CisKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOworCisgIHJlc3VsdC0+bmFtZV8gICAgICAgICAgICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CisgIHJlc3VsdC0+ZnVsbF9uYW1lXyAgICAgICA9IGZ1bGxfbmFtZTsKKyAgcmVzdWx0LT5maWxlXyAgICAgICAgICAgID0gZmlsZV87CisgIHJlc3VsdC0+Y29udGFpbmluZ190eXBlXyA9IHBhcmVudDsKKyAgcmVzdWx0LT5pc19wbGFjZWhvbGRlcl8gID0gZmFsc2U7CisgIHJlc3VsdC0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfID0gZmFsc2U7CisKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZmllbGQgICAgICAgICAgLCBCdWlsZEZpZWxkICAgICAgICAgLCByZXN1bHQpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBuZXN0ZWRfdHlwZSAgICAsIEJ1aWxkTWVzc2FnZSAgICAgICAsIHJlc3VsdCk7CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIGVudW1fdHlwZSAgICAgICwgQnVpbGRFbnVtICAgICAgICAgICwgcmVzdWx0KTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZXh0ZW5zaW9uX3JhbmdlLCBCdWlsZEV4dGVuc2lvblJhbmdlLCByZXN1bHQpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb24gICAgICAsIEJ1aWxkRXh0ZW5zaW9uICAgICAsIHJlc3VsdCk7CisKKyAgLy8gQ29weSBvcHRpb25zLgorICBpZiAoIXByb3RvLmhhc19vcHRpb25zKCkpIHsKKyAgICByZXN1bHQtPm9wdGlvbnNfID0gTlVMTDsgIC8vIFdpbGwgc2V0IHRvIGRlZmF1bHRfaW5zdGFuY2UgbGF0ZXIuCisgIH0gZWxzZSB7CisgICAgQWxsb2NhdGVPcHRpb25zKHByb3RvLm9wdGlvbnMoKSwgcmVzdWx0KTsKKyAgfQorCisgIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQsIHJlc3VsdC0+bmFtZSgpLAorICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKKworICAvLyBDaGVjayB0aGF0IG5vIGZpZWxkcyBoYXZlIG51bWJlcnMgaW4gZXh0ZW5zaW9uIHJhbmdlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSByZXN1bHQtPmZpZWxkKGkpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0LT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaisrKSB7CisgICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UgPSByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZS0+c3RhcnQgPD0gZmllbGQtPm51bWJlcigpICYmIGZpZWxkLT5udW1iZXIoKSA8IHJhbmdlLT5lbmQpIHsKKyAgICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90by5leHRlbnNpb25fcmFuZ2UoaiksCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICAgICAgICAgICJFeHRlbnNpb24gcmFuZ2UgJDAgdG8gJDEgaW5jbHVkZXMgZmllbGQgXCIkMlwiICgkMykuIiwKKyAgICAgICAgICAgICAgICAgICByYW5nZS0+c3RhcnQsIHJhbmdlLT5lbmQgLSAxLAorICAgICAgICAgICAgICAgICAgIGZpZWxkLT5uYW1lKCksIGZpZWxkLT5udW1iZXIoKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHRoYXQgZXh0ZW5zaW9uIHJhbmdlcyBkb24ndCBvdmVybGFwLgorICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZTEgPSByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZShpKTsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZTIgPSByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZTEtPmVuZCA+IHJhbmdlMi0+c3RhcnQgJiYgcmFuZ2UyLT5lbmQgPiByYW5nZTEtPnN0YXJ0KSB7CisgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLmV4dGVuc2lvbl9yYW5nZShqKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkV4dGVuc2lvbiByYW5nZSAkMCB0byAkMSBvdmVybGFwcyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxyZWFkeS1kZWZpbmVkIHJhbmdlICQyIHRvICQzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UyLT5zdGFydCwgcmFuZ2UyLT5lbmQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlMS0+c3RhcnQsIHJhbmdlMS0+ZW5kIC0gMSkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZEZpZWxkT3JFeHRlbnNpb24oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4dGVuc2lvbikgeworICBjb25zdCBzdHJpbmcmIHNjb3BlID0gKHBhcmVudCA9PSBOVUxMKSA/CisgICAgZmlsZV8tPnBhY2thZ2UoKSA6IHBhcmVudC0+ZnVsbF9uYW1lKCk7CisgIHN0cmluZyogZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoc2NvcGUpOworICBpZiAoIWZ1bGxfbmFtZS0+ZW1wdHkoKSkgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKKyAgZnVsbF9uYW1lLT5hcHBlbmQocHJvdG8ubmFtZSgpKTsKKworICBWYWxpZGF0ZVN5bWJvbE5hbWUocHJvdG8ubmFtZSgpLCAqZnVsbF9uYW1lLCBwcm90byk7CisKKyAgcmVzdWx0LT5uYW1lXyAgICAgICAgID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8ubmFtZSgpKTsKKyAgcmVzdWx0LT5mdWxsX25hbWVfICAgID0gZnVsbF9uYW1lOworICByZXN1bHQtPmZpbGVfICAgICAgICAgPSBmaWxlXzsKKyAgcmVzdWx0LT5udW1iZXJfICAgICAgID0gcHJvdG8ubnVtYmVyKCk7CisgIHJlc3VsdC0+aXNfZXh0ZW5zaW9uXyA9IGlzX2V4dGVuc2lvbjsKKworICAvLyBJZiAucHJvdG8gZmlsZXMgZm9sbG93IHRoZSBzdHlsZSBndWlkZSB0aGVuIHRoZSBuYW1lIHNob3VsZCBhbHJlYWR5IGJlCisgIC8vIGxvd2VyLWNhc2VkLiAgSWYgdGhhdCdzIHRoZSBjYXNlIHdlIGNhbiBqdXN0IHJldXNlIHRoZSBzdHJpbmcgd2UgYWxyZWFkeQorICAvLyBhbGxvY2F0ZWQgcmF0aGVyIHRoYW4gYWxsb2NhdGUgYSBuZXcgb25lLgorICBzdHJpbmcgbG93ZXJjYXNlX25hbWUocHJvdG8ubmFtZSgpKTsKKyAgTG93ZXJTdHJpbmcoJmxvd2VyY2FzZV9uYW1lKTsKKyAgaWYgKGxvd2VyY2FzZV9uYW1lID09IHByb3RvLm5hbWUoKSkgeworICAgIHJlc3VsdC0+bG93ZXJjYXNlX25hbWVfID0gcmVzdWx0LT5uYW1lXzsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQtPmxvd2VyY2FzZV9uYW1lXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKGxvd2VyY2FzZV9uYW1lKTsKKyAgfQorCisgIC8vIERvbid0IGJvdGhlciB3aXRoIHRoZSBhYm92ZSBvcHRpbWl6YXRpb24gZm9yIGNhbWVsLWNhc2UgbmFtZXMgc2luY2UKKyAgLy8gLnByb3RvIGZpbGVzIHRoYXQgZm9sbG93IHRoZSBndWlkZSBzaG91bGRuJ3QgYmUgdXNpbmcgbmFtZXMgaW4gdGhpcworICAvLyBmb3JtYXQsIHNvIHRoZSBvcHRpbWl6YXRpb24gd291bGRuJ3QgaGVscCBtdWNoLgorICByZXN1bHQtPmNhbWVsY2FzZV9uYW1lXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKFRvQ2FtZWxDYXNlKHByb3RvLm5hbWUoKSkpOworCisgIC8vIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBzdGF0aWNfY2FzdCBkaXJlY3RseSBiZXR3ZWVuIHR3byBlbnVtIHR5cGVzLAorICAvLyBzbyB3ZSBtdXN0IGNhc3QgdG8gaW50IGZpcnN0LgorICByZXN1bHQtPnR5cGVfICA9IHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4oCisgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4ocHJvdG8udHlwZSgpKSk7CisgIHJlc3VsdC0+bGFiZWxfID0gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpMYWJlbD4oCisgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4ocHJvdG8ubGFiZWwoKSkpOworCisgIC8vIFNvbWUgb2YgdGhlc2UgbWF5IGJlIGZpbGxlZCBpbiB3aGVuIGNyb3NzLWxpbmtpbmcuCisgIHJlc3VsdC0+Y29udGFpbmluZ190eXBlXyA9IE5VTEw7CisgIHJlc3VsdC0+ZXh0ZW5zaW9uX3Njb3BlXyA9IE5VTEw7CisgIHJlc3VsdC0+ZXhwZXJpbWVudGFsX21hcF9rZXlfID0gTlVMTDsKKyAgcmVzdWx0LT5tZXNzYWdlX3R5cGVfID0gTlVMTDsKKyAgcmVzdWx0LT5lbnVtX3R5cGVfID0gTlVMTDsKKworICByZXN1bHQtPmhhc19kZWZhdWx0X3ZhbHVlXyA9IHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCk7CisgIGlmIChwcm90by5oYXNfZGVmYXVsdF92YWx1ZSgpICYmIHJlc3VsdC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKKyAgICAgICAgICAgICAiUmVwZWF0ZWQgZmllbGRzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgIH0KKworICBpZiAocHJvdG8uaGFzX3R5cGUoKSkgeworICAgIGlmIChwcm90by5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICBjaGFyKiBlbmRfcG9zID0gTlVMTDsKKyAgICAgIHN3aXRjaCAocmVzdWx0LT5jcHBfdHlwZSgpKSB7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9pbnQzMl8gPQorICAgICAgICAgICAgc3RydG9sKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcywgMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NF8gPQorICAgICAgICAgICAgc3RydG82NChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MsIDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX3VpbnQzMl8gPQorICAgICAgICAgICAgc3RydG91bChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MsIDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NF8gPQorICAgICAgICAgICAgc3RydG91NjQocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmNfc3RyKCksICZlbmRfcG9zLCAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAiaW5mIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9IG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAiLWluZiIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPSAtbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICJuYW4iKSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZmxvYXRfID0gbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKTsKKyAgICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPQorICAgICAgICAgICAgICBOb0xvY2FsZVN0cnRvZChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgICAgIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gImluZiIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAiLWluZiIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0gLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gIm5hbiIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7CisgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZG91YmxlXyA9CisgICAgICAgICAgICAgIE5vTG9jYWxlU3RydG9kKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3Bvcyk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgICAgIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gInRydWUiKSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfYm9vbF8gPSB0cnVlOworICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICJmYWxzZSIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9ib29sXyA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICJCb29sZWFuIGRlZmF1bHQgbXVzdCBiZSB0cnVlIG9yIGZhbHNlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZy4KKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZW51bV8gPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKHJlc3VsdC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUykgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX3N0cmluZ18gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZygKKyAgICAgICAgICAgICAgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKHByb3RvLmRlZmF1bHRfdmFsdWUoKSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nXyA9CisgICAgICAgICAgICAgICAgdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8uZGVmYXVsdF92YWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOworICAgICAgICAgIHJlc3VsdC0+aGFzX2RlZmF1bHRfdmFsdWVfID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChlbmRfcG9zICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZW5kX3BvcyBpcyBvbmx5IHNldCBub24tTlVMTCBieSB0aGUgcGFyc2VycyBmb3IgbnVtZXJpYyB0eXBlcywgYWJvdmUuCisgICAgICAgIC8vIFRoaXMgY2hlY2tzIHRoYXQgdGhlIGRlZmF1bHQgd2FzIG5vbi1lbXB0eSBhbmQgaGFkIG5vIGV4dHJhIGp1bmsKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbnVtYmVyLgorICAgICAgICBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmVtcHR5KCkgfHwgKmVuZF9wb3MgIT0gJ1wwJykgeworICAgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcGFyc2UgZGVmYXVsdCB2YWx1ZS4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBObyBleHBsaWNpdCBkZWZhdWx0IHZhbHVlCisgICAgICBzd2l0Y2ggKHJlc3VsdC0+Y3BwX3R5cGUoKSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfaW50MzJfID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2ludDY0XyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDMyXyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDY0XyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPSAwLjBmOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSAwLjA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Jvb2xfID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiB3aGVuIGNyb3NzLWxpbmtpbmcuCisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmdfID0gJmtFbXB0eVN0cmluZzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocmVzdWx0LT5udW1iZXIoKSA8PSAwKSB7CisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7CisgIH0gZWxzZSBpZiAoIWlzX2V4dGVuc2lvbiAmJiByZXN1bHQtPm51bWJlcigpID4gRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSB7CisgICAgLy8gT25seSB2YWxpZGF0ZSB0aGF0IHRoZSBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCBmaWVsZCByYW5nZSBpZiBpdCBpcworICAgIC8vIG5vdCBhbiBleHRlbnNpb24uIFNpbmNlIGV4dGVuc2lvbiBudW1iZXJzIGFyZSB2YWxpZGF0ZWQgd2l0aCB0aGUKKyAgICAvLyBleHRlbmRlZSdzIHZhbGlkIHNldCBvZiBleHRlbnNpb24gbnVtYmVycywgYW5kIHRob3NlIGFyZSBpbiB0dXJuCisgICAgLy8gdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1heCBhbGxvd2VkIG51bWJlciwgdGhlIGNoZWNrIGlzIHVubmVjZXNzYXJ5IGZvcgorICAgIC8vIGV4dGVuc2lvbiBmaWVsZHMuCisgICAgLy8gVGhpcyBhdm9pZHMgY3Jvc3MtbGlua2luZyBpc3N1ZXMgdGhhdCBhcmlzZSB3aGVuIGF0dGVtcHRpbmcgdG8gY2hlY2sgaWYKKyAgICAvLyB0aGUgZXh0ZW5kZWUgaXMgYSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCBtZXNzYWdlLCB3aGljaCBoYXMgYSBoaWdoZXIgbWF4CisgICAgLy8gb24gZXh0ZW5zaW9uIG51bWJlcnMuCisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAkMC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSk7CisgIH0gZWxzZSBpZiAocmVzdWx0LT5udW1iZXIoKSA+PSBGaWVsZERlc2NyaXB0b3I6OmtGaXJzdFJlc2VydmVkTnVtYmVyICYmCisgICAgICAgICAgICAgcmVzdWx0LT5udW1iZXIoKSA8PSBGaWVsZERlc2NyaXB0b3I6OmtMYXN0UmVzZXJ2ZWROdW1iZXIpIHsKKyAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAgICAgICJGaWVsZCBudW1iZXJzICQwIHRocm91Z2ggJDEgYXJlIHJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgIgorICAgICAgICAgICAgICAgImJ1ZmZlciBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLiIsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OmtGaXJzdFJlc2VydmVkTnVtYmVyLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyKSk7CisgIH0KKworICBpZiAoaXNfZXh0ZW5zaW9uKSB7CisgICAgaWYgKCFwcm90by5oYXNfZXh0ZW5kZWUoKSkgeworICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIG5vdCBzZXQgZm9yIGV4dGVuc2lvbiBmaWVsZC4iKTsKKyAgICB9CisKKyAgICByZXN1bHQtPmV4dGVuc2lvbl9zY29wZV8gPSBwYXJlbnQ7CisgIH0gZWxzZSB7CisgICAgaWYgKHByb3RvLmhhc19leHRlbmRlZSgpKSB7CisgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RVhURU5ERUUsCisgICAgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUgc2V0IGZvciBub24tZXh0ZW5zaW9uIGZpZWxkLiIpOworICAgIH0KKworICAgIHJlc3VsdC0+Y29udGFpbmluZ190eXBlXyA9IHBhcmVudDsKKyAgfQorCisgIC8vIENvcHkgb3B0aW9ucy4KKyAgaWYgKCFwcm90by5oYXNfb3B0aW9ucygpKSB7CisgICAgcmVzdWx0LT5vcHRpb25zXyA9IE5VTEw7ICAvLyBXaWxsIHNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyLgorICB9IGVsc2UgeworICAgIEFsbG9jYXRlT3B0aW9ucyhwcm90by5vcHRpb25zKCksIHJlc3VsdCk7CisgIH0KKworICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwKKyAgICAgICAgICAgIHByb3RvLCBTeW1ib2wocmVzdWx0KSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRXh0ZW5zaW9uUmFuZ2UoCisgICAgY29uc3QgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSYgcHJvdG8sCisgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgIERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByZXN1bHQpIHsKKyAgcmVzdWx0LT5zdGFydCA9IHByb3RvLnN0YXJ0KCk7CisgIHJlc3VsdC0+ZW5kID0gcHJvdG8uZW5kKCk7CisgIGlmIChyZXN1bHQtPnN0YXJ0IDw9IDApIHsKKyAgICBBZGRFcnJvcihwYXJlbnQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAiRXh0ZW5zaW9uIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy4iKTsKKyAgfQorCisgIC8vIENoZWNraW5nIG9mIHRoZSB1cHBlciBib3VuZCBvZiB0aGUgZXh0ZW5zaW9uIHJhbmdlIGlzIGRlZmVycmVkIHVudGlsIGFmdGVyCisgIC8vIG9wdGlvbnMgaW50ZXJwcmV0aW5nLiBUaGlzIGFsbG93cyBtZXNzYWdlcyB3aXRoIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IHRvCisgIC8vIGhhdmUgZXh0ZW5zaW9ucyBiZXlvbmQgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyLCBzaW5jZSB0aGUgZXh0ZW5zaW9uCisgIC8vIG51bWJlcnMgYXJlIGFjdHVhbGx5IHVzZWQgYXMgaW50MzJzIGluIHRoZSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KKworICBpZiAocmVzdWx0LT5zdGFydCA+PSByZXN1bHQtPmVuZCkgeworICAgIEFkZEVycm9yKHBhcmVudC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBzdGFydCBudW1iZXIuIik7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvciogcmVzdWx0KSB7CisgIGNvbnN0IHN0cmluZyYgc2NvcGUgPSAocGFyZW50ID09IE5VTEwpID8KKyAgICBmaWxlXy0+cGFja2FnZSgpIDogcGFyZW50LT5mdWxsX25hbWUoKTsKKyAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhzY29wZSk7CisgIGlmICghZnVsbF9uYW1lLT5lbXB0eSgpKSBmdWxsX25hbWUtPmFwcGVuZCgxLCAnLicpOworICBmdWxsX25hbWUtPmFwcGVuZChwcm90by5uYW1lKCkpOworCisgIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksICpmdWxsX25hbWUsIHByb3RvKTsKKworICByZXN1bHQtPm5hbWVfICAgICAgICAgICAgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOworICByZXN1bHQtPmZ1bGxfbmFtZV8gICAgICAgPSBmdWxsX25hbWU7CisgIHJlc3VsdC0+ZmlsZV8gICAgICAgICAgICA9IGZpbGVfOworICByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZV8gPSBwYXJlbnQ7CisgIHJlc3VsdC0+aXNfcGxhY2Vob2xkZXJfICA9IGZhbHNlOworICByZXN1bHQtPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA9IGZhbHNlOworCisgIGlmIChwcm90by52YWx1ZV9zaXplKCkgPT0gMCkgeworICAgIC8vIFdlIGNhbm5vdCBhbGxvdyBlbnVtcyB3aXRoIG5vIHZhbHVlcyBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB0aGVyZQorICAgIC8vIHdvdWxkIGJlIG5vIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICJFbnVtcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHZhbHVlLiIpOworICB9CisKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgdmFsdWUsIEJ1aWxkRW51bVZhbHVlLCByZXN1bHQpOworCisgIC8vIENvcHkgb3B0aW9ucy4KKyAgaWYgKCFwcm90by5oYXNfb3B0aW9ucygpKSB7CisgICAgcmVzdWx0LT5vcHRpb25zXyA9IE5VTEw7ICAvLyBXaWxsIHNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyLgorICB9IGVsc2UgeworICAgIEFsbG9jYXRlT3B0aW9ucyhwcm90by5vcHRpb25zKCksIHJlc3VsdCk7CisgIH0KKworICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwKKyAgICAgICAgICAgIHByb3RvLCBTeW1ib2wocmVzdWx0KSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRW51bVZhbHVlKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvciogcmVzdWx0KSB7CisgIHJlc3VsdC0+bmFtZV8gICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CisgIHJlc3VsdC0+bnVtYmVyXyA9IHByb3RvLm51bWJlcigpOworICByZXN1bHQtPnR5cGVfICAgPSBwYXJlbnQ7CisKKyAgLy8gTm90ZTogIGZ1bGxfbmFtZSBmb3IgZW51bSB2YWx1ZXMgaXMgYSBzaWJsaW5nIHRvIHRoZSBwYXJlbnQncyBuYW1lLCBub3QgYQorICAvLyAgIGNoaWxkIG9mIGl0LgorICBzdHJpbmcqIGZ1bGxfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCpwYXJlbnQtPmZ1bGxfbmFtZV8pOworICBmdWxsX25hbWUtPnJlc2l6ZShmdWxsX25hbWUtPnNpemUoKSAtIHBhcmVudC0+bmFtZV8tPnNpemUoKSk7CisgIGZ1bGxfbmFtZS0+YXBwZW5kKCpyZXN1bHQtPm5hbWVfKTsKKyAgcmVzdWx0LT5mdWxsX25hbWVfID0gZnVsbF9uYW1lOworCisgIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksICpmdWxsX25hbWUsIHByb3RvKTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgLy8gQWdhaW4sIGVudW0gdmFsdWVzIGFyZSB3ZWlyZCBiZWNhdXNlIHdlIG1ha2VzIHRoZW0gYXBwZWFyIGFzIHNpYmxpbmdzCisgIC8vIG9mIHRoZSBlbnVtIHR5cGUgaW5zdGVhZCBvZiBjaGlsZHJlbiBvZiBpdC4gIFNvLCB3ZSB1c2UKKyAgLy8gcGFyZW50LT5jb250YWluaW5nX3R5cGUoKSBhcyB0aGUgdmFsdWUncyBwYXJlbnQuCisgIGJvb2wgYWRkZWRfdG9fb3V0ZXJfc2NvcGUgPQorICAgIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQtPmNvbnRhaW5pbmdfdHlwZSgpLCByZXN1bHQtPm5hbWUoKSwKKyAgICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKKworICAvLyBIb3dldmVyLCB3ZSBhbHNvIHdhbnQgdG8gYmUgYWJsZSB0byBzZWFyY2ggZm9yIHZhbHVlcyB3aXRoaW4gYSBzaW5nbGUKKyAgLy8gZW51bSB0eXBlLCBzbyB3ZSBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGUgZW51bSB0eXBlIGl0c2VsZiwgdG9vLgorICAvLyBOb3RlOiAgVGhpcyBjb3VsZCBmYWlsLCBidXQgaWYgaXQgZG9lcywgdGhlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4KKyAgLy8gICByZXBvcnRlZCBieSB0aGUgYWJvdmUgQWRkU3ltYm9sKCkgY2FsbCwgc28gd2UgaWdub3JlIHRoZSByZXR1cm4gY29kZS4KKyAgYm9vbCBhZGRlZF90b19pbm5lcl9zY29wZSA9CisgICAgZmlsZV90YWJsZXNfLT5BZGRBbGlhc1VuZGVyUGFyZW50KHBhcmVudCwgcmVzdWx0LT5uYW1lKCksIFN5bWJvbChyZXN1bHQpKTsKKworICBpZiAoYWRkZWRfdG9faW5uZXJfc2NvcGUgJiYgIWFkZGVkX3RvX291dGVyX3Njb3BlKSB7CisgICAgLy8gVGhpcyB2YWx1ZSBkaWQgbm90IGNvbmZsaWN0IHdpdGggYW55IHZhbHVlcyBkZWZpbmVkIGluIHRoZSBzYW1lIGVudW0sCisgICAgLy8gYnV0IGl0IGRpZCBjb25mbGljdCB3aXRoIHNvbWUgb3RoZXIgc3ltYm9sIGRlZmluZWQgaW4gdGhlIGVudW0gdHlwZSdzCisgICAgLy8gc2NvcGUuICBMZXQncyBwcmludCBhbiBhZGRpdGlvbmFsIGVycm9yIHRvIGV4cGxhaW4gdGhpcy4KKyAgICBzdHJpbmcgb3V0ZXJfc2NvcGU7CisgICAgaWYgKHBhcmVudC0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgeworICAgICAgb3V0ZXJfc2NvcGUgPSBmaWxlXy0+cGFja2FnZSgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXRlcl9zY29wZSA9IHBhcmVudC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpOworICAgIH0KKworICAgIGlmIChvdXRlcl9zY29wZS5lbXB0eSgpKSB7CisgICAgICBvdXRlcl9zY29wZSA9ICJ0aGUgZ2xvYmFsIHNjb3BlIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ZXJfc2NvcGUgPSAiXCIiICsgb3V0ZXJfc2NvcGUgKyAiXCIiOworICAgIH0KKworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAiTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgbWVhbmluZyB0aGF0ICIKKyAgICAgICAgICAgICAiZW51bSB2YWx1ZXMgYXJlIHNpYmxpbmdzIG9mIHRoZWlyIHR5cGUsIG5vdCBjaGlsZHJlbiBvZiBpdC4gICIKKyAgICAgICAgICAgICAiVGhlcmVmb3JlLCBcIiIgKyByZXN1bHQtPm5hbWUoKSArICJcIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gIgorICAgICAgICAgICAgICsgb3V0ZXJfc2NvcGUgKyAiLCBub3QganVzdCB3aXRoaW4gXCIiICsgcGFyZW50LT5uYW1lKCkgKyAiXCIuIik7CisgIH0KKworICAvLyBBbiBlbnVtIGlzIGFsbG93ZWQgdG8gZGVmaW5lIHR3byBudW1iZXJzIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgdmFsdWUuCisgIC8vIEZpbmRWYWx1ZUJ5TnVtYmVyKCkgc2hvdWxkIHJldHVybiB0aGUgZmlyc3Qgc3VjaCB2YWx1ZSwgc28gd2Ugc2ltcGx5CisgIC8vIGlnbm9yZSBBZGRFbnVtVmFsdWVCeU51bWJlcigpJ3MgcmV0dXJuIGNvZGUuCisgIGZpbGVfdGFibGVzXy0+QWRkRW51bVZhbHVlQnlOdW1iZXIocmVzdWx0KTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRTZXJ2aWNlKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yKiByZXN1bHQpIHsKKyAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhmaWxlXy0+cGFja2FnZSgpKTsKKyAgaWYgKCFmdWxsX25hbWUtPmVtcHR5KCkpIGZ1bGxfbmFtZS0+YXBwZW5kKDEsICcuJyk7CisgIGZ1bGxfbmFtZS0+YXBwZW5kKHByb3RvLm5hbWUoKSk7CisKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOworCisgIHJlc3VsdC0+bmFtZV8gICAgICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CisgIHJlc3VsdC0+ZnVsbF9uYW1lXyA9IGZ1bGxfbmFtZTsKKyAgcmVzdWx0LT5maWxlXyAgICAgID0gZmlsZV87CisKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgbWV0aG9kLCBCdWlsZE1ldGhvZCwgcmVzdWx0KTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIE5VTEwsIHJlc3VsdC0+bmFtZSgpLAorICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yKiByZXN1bHQpIHsKKyAgcmVzdWx0LT5uYW1lXyAgICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CisgIHJlc3VsdC0+c2VydmljZV8gPSBwYXJlbnQ7CisKKyAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwYXJlbnQtPmZ1bGxfbmFtZSgpKTsKKyAgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKKyAgZnVsbF9uYW1lLT5hcHBlbmQoKnJlc3VsdC0+bmFtZV8pOworICByZXN1bHQtPmZ1bGxfbmFtZV8gPSBmdWxsX25hbWU7CisKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOworCisgIC8vIFRoZXNlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZy4KKyAgcmVzdWx0LT5pbnB1dF90eXBlXyA9IE5VTEw7CisgIHJlc3VsdC0+b3V0cHV0X3R5cGVfID0gTlVMTDsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHBhcmVudCwgcmVzdWx0LT5uYW1lKCksCisgICAgICAgICAgICBwcm90bywgU3ltYm9sKHJlc3VsdCkpOworfQorCisjdW5kZWYgQlVJTERfQVJSQVkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpDcm9zc0xpbmtGaWxlKAorICAgIEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAoZmlsZS0+b3B0aW9uc18gPT0gTlVMTCkgeworICAgIGZpbGUtPm9wdGlvbnNfID0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtNZXNzYWdlKCZmaWxlLT5tZXNzYWdlX3R5cGVzX1tpXSwgcHJvdG8ubWVzc2FnZV90eXBlKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0ZpZWxkKCZmaWxlLT5leHRlbnNpb25zX1tpXSwgcHJvdG8uZXh0ZW5zaW9uKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0VudW0oJmZpbGUtPmVudW1fdHlwZXNfW2ldLCBwcm90by5lbnVtX3R5cGUoaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua1NlcnZpY2UoJmZpbGUtPnNlcnZpY2VzX1tpXSwgcHJvdG8uc2VydmljZShpKSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rTWVzc2FnZSgKKyAgICBEZXNjcmlwdG9yKiBtZXNzYWdlLCBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChtZXNzYWdlLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgbWVzc2FnZS0+b3B0aW9uc18gPSAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rTWVzc2FnZSgmbWVzc2FnZS0+bmVzdGVkX3R5cGVzX1tpXSwgcHJvdG8ubmVzdGVkX3R5cGUoaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rRW51bSgmbWVzc2FnZS0+ZW51bV90eXBlc19baV0sIHByb3RvLmVudW1fdHlwZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0ZpZWxkKCZtZXNzYWdlLT5maWVsZHNfW2ldLCBwcm90by5maWVsZChpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtGaWVsZCgmbWVzc2FnZS0+ZXh0ZW5zaW9uc19baV0sIHByb3RvLmV4dGVuc2lvbihpKSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rRmllbGQoCisgICAgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChmaWVsZC0+b3B0aW9uc18gPT0gTlVMTCkgeworICAgIGZpZWxkLT5vcHRpb25zXyA9ICZGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGlmIChwcm90by5oYXNfZXh0ZW5kZWUoKSkgeworICAgIFN5bWJvbCBleHRlbmRlZSA9IExvb2t1cFN5bWJvbChwcm90by5leHRlbmRlZSgpLCBmaWVsZC0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMQUNFSE9MREVSX0VYVEVOREFCTEVfTUVTU0FHRSk7CisgICAgaWYgKGV4dGVuZGVlLklzTnVsbCgpKSB7CisgICAgICBBZGROb3REZWZpbmVkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLmV4dGVuZGVlKCkpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoZXh0ZW5kZWUudHlwZSAhPSBTeW1ib2w6Ok1FU1NBR0UpIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLmV4dGVuZGVlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlXyA9IGV4dGVuZGVlLmRlc2NyaXB0b3I7CisKKyAgICBpZiAoIWZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+SXNFeHRlbnNpb25OdW1iZXIoZmllbGQtPm51bWJlcigpKSkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiXCIkMFwiIGRvZXMgbm90IGRlY2xhcmUgJDEgYXMgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG51bWJlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpKTsKKyAgICB9CisgIH0KKworICBpZiAocHJvdG8uaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgLy8gQXNzdW1lIHdlIGFyZSBleHBlY3RpbmcgYSBtZXNzYWdlIHR5cGUgdW5sZXNzIHRoZSBwcm90byBjb250YWlucyBzb21lCisgICAgLy8gZXZpZGVuY2UgdGhhdCBpdCBleHBlY3RzIGFuIGVudW0gdHlwZS4gIFRoaXMgb25seSBtYWtlcyBhIGRpZmZlcmVuY2UgaWYKKyAgICAvLyB3ZSBlbmQgdXAgY3JlYXRpbmcgYSBwbGFjZWhvbGRlci4KKyAgICBib29sIGV4cGVjdGluZ19lbnVtID0gKHByb3RvLnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9FTlVNKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5oYXNfZGVmYXVsdF92YWx1ZSgpOworCisgICAgU3ltYm9sIHR5cGUgPQorICAgICAgTG9va3VwU3ltYm9sKHByb3RvLnR5cGVfbmFtZSgpLCBmaWVsZC0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgZXhwZWN0aW5nX2VudW0gPyBQTEFDRUhPTERFUl9FTlVNIDogUExBQ0VIT0xERVJfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICBMT09LVVBfVFlQRVMpOworCisgICAgaWYgKHR5cGUuSXNOdWxsKCkpIHsKKyAgICAgIEFkZE5vdERlZmluZWRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by50eXBlX25hbWUoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwcm90by5oYXNfdHlwZSgpKSB7CisgICAgICAvLyBDaG9vc2UgZmllbGQgdHlwZSBiYXNlZCBvbiBzeW1ib2wuCisgICAgICBpZiAodHlwZS50eXBlID09IFN5bWJvbDo6TUVTU0FHRSkgeworICAgICAgICBmaWVsZC0+dHlwZV8gPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS50eXBlID09IFN5bWJvbDo6RU5VTSkgeworICAgICAgICBmaWVsZC0+dHlwZV8gPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLnR5cGVfbmFtZSgpICsgIlwiIGlzIG5vdCBhIHR5cGUuIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmICh0eXBlLnR5cGUgIT0gU3ltYm9sOjpNRVNTQUdFKSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLnR5cGVfbmFtZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZV8gPSB0eXBlLmRlc2NyaXB0b3I7CisKKyAgICAgIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgeworICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUsCisgICAgICAgICAgICAgICAgICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pIHsKKyAgICAgIGlmICh0eXBlLnR5cGUgIT0gU3ltYm9sOjpFTlVNKSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLnR5cGVfbmFtZSgpICsgIlwiIGlzIG5vdCBhbiBlbnVtIHR5cGUuIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZpZWxkLT5lbnVtX3R5cGVfID0gdHlwZS5lbnVtX2Rlc2NyaXB0b3I7CisKKyAgICAgIGlmIChmaWVsZC0+ZW51bV90eXBlKCktPmlzX3BsYWNlaG9sZGVyXykgeworICAgICAgICAvLyBXZSBjYW4ndCBsb29rIHVwIGRlZmF1bHQgdmFsdWVzIGZvciBwbGFjZWhvbGRlciB0eXBlcy4gIFdlJ2xsIGhhdmUKKyAgICAgICAgLy8gdG8ganVzdCBkcm9wIHRoZW0uCisgICAgICAgIGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZV8gPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICAgIC8vIFdlIGNhbid0IGp1c3QgdXNlIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOYW1lKCkgaGVyZQorICAgICAgICAvLyBiZWNhdXNlIHRoYXQgbG9ja3MgdGhlIHBvb2wncyBtdXRleCwgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IGxvY2tlZAorICAgICAgICAvLyBhdCB0aGlzIHBvaW50LgorICAgICAgICBTeW1ib2wgZGVmYXVsdF92YWx1ZSA9CisgICAgICAgICAgTG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcihwcm90by5kZWZhdWx0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKworICAgICAgICBpZiAoZGVmYXVsdF92YWx1ZS50eXBlID09IFN5bWJvbDo6RU5VTV9WQUxVRSAmJgorICAgICAgICAgICAgZGVmYXVsdF92YWx1ZS5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3ItPnR5cGUoKSA9PSBmaWVsZC0+ZW51bV90eXBlKCkpIHsKKyAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IGRlZmF1bHRfdmFsdWUuZW51bV92YWx1ZV9kZXNjcmlwdG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIiIgKyBwcm90by5kZWZhdWx0X3ZhbHVlKCkgKyAiXCIuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZV9jb3VudCgpID4gMCkgeworICAgICAgICAvLyBBbGwgZW51bXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZSwgb3Igd2Ugd291bGQgaGF2ZSByZXBvcnRlZAorICAgICAgICAvLyBhbiBlcnJvciBlbHNld2hlcmUuICBXZSB1c2UgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUgYXMgdGhlIGRlZmF1bHQKKyAgICAgICAgLy8gaWYgYSBkZWZhdWx0IGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQuCisgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZSgwKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgIkZpZWxkIHdpdGggcHJpbWl0aXZlIHR5cGUgaGFzIHR5cGVfbmFtZS4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFIHx8CisgICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAiRmllbGQgd2l0aCBtZXNzYWdlIG9yIGVudW0gdHlwZSBtaXNzaW5nIHR5cGVfbmFtZS4iKTsKKyAgICB9CisgIH0KKworICAvLyBBZGQgdGhlIGZpZWxkIHRvIHRoZSBmaWVsZHMtYnktbnVtYmVyIHRhYmxlLgorICAvLyBOb3RlOiAgV2UgaGF2ZSB0byBkbyB0aGlzICphZnRlciogY3Jvc3MtbGlua2luZyBiZWNhdXNlIGV4dGVuc2lvbnMgZG8gbm90CisgIC8vICAga25vdyB0aGVpciBjb250YWluaW5nIHR5cGUgdW50aWwgbm93LgorICBpZiAoIWZpbGVfdGFibGVzXy0+QWRkRmllbGRCeU51bWJlcihmaWVsZCkpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNvbmZsaWN0aW5nX2ZpZWxkID0KKyAgICAgIGZpbGVfdGFibGVzXy0+RmluZEZpZWxkQnlOdW1iZXIoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpOworICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkV4dGVuc2lvbiBudW1iZXIgJDAgaGFzIGFscmVhZHkgYmVlbiB1c2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIFwiJDFcIiBieSBleHRlbnNpb24gXCIkMlwiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmdfZmllbGQtPmZ1bGxfbmFtZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIG51bWJlciAkMCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIkMVwiIGJ5IGZpZWxkIFwiJDJcIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nX2ZpZWxkLT5uYW1lKCkpKTsKKyAgICB9CisgIH0KKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgLy8gTm8gbmVlZCBmb3IgZXJyb3IgY2hlY2tpbmc6IGlmIHRoZSBleHRlbnNpb24gbnVtYmVyIGNvbGxpZGVkLAorICAgIC8vIHdlJ3ZlIGFscmVhZHkgYmVlbiBpbmZvcm1lZCBvZiBpdCBieSB0aGUgaWYoKSBhYm92ZS4KKyAgICB0YWJsZXNfLT5BZGRFeHRlbnNpb24oZmllbGQpOworICB9CisKKyAgLy8gQWRkIHRoZSBmaWVsZCB0byB0aGUgbG93ZXJjYXNlLW5hbWUgYW5kIGNhbWVsY2FzZS1uYW1lIHRhYmxlcy4KKyAgZmlsZV90YWJsZXNfLT5BZGRGaWVsZEJ5U3R5bGl6ZWROYW1lcyhmaWVsZCk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0VudW0oCisgICAgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKGVudW1fdHlwZS0+b3B0aW9uc18gPT0gTlVMTCkgeworICAgIGVudW1fdHlwZS0+b3B0aW9uc18gPSAmRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtFbnVtVmFsdWUoJmVudW1fdHlwZS0+dmFsdWVzX1tpXSwgcHJvdG8udmFsdWUoaSkpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0VudW1WYWx1ZSgKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlLCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChlbnVtX3ZhbHVlLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgZW51bV92YWx1ZS0+b3B0aW9uc18gPSAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua1NlcnZpY2UoCisgICAgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChzZXJ2aWNlLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgc2VydmljZS0+b3B0aW9uc18gPSAmU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZS0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua01ldGhvZCgmc2VydmljZS0+bWV0aG9kc19baV0sIHByb3RvLm1ldGhvZChpKSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rTWV0aG9kKAorICAgIE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAobWV0aG9kLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgbWV0aG9kLT5vcHRpb25zXyA9ICZNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKworICBTeW1ib2wgaW5wdXRfdHlwZSA9IExvb2t1cFN5bWJvbChwcm90by5pbnB1dF90eXBlKCksIG1ldGhvZC0+ZnVsbF9uYW1lKCkpOworICBpZiAoaW5wdXRfdHlwZS5Jc051bGwoKSkgeworICAgIEFkZE5vdERlZmluZWRFcnJvcihtZXRob2QtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTlBVVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90by5pbnB1dF90eXBlKCkpOworICB9IGVsc2UgaWYgKGlucHV0X3R5cGUudHlwZSAhPSBTeW1ib2w6Ok1FU1NBR0UpIHsKKyAgICBBZGRFcnJvcihtZXRob2QtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OklOUFVUX1RZUEUsCisgICAgICAgICAgICAgIlwiIiArIHByb3RvLmlucHV0X3R5cGUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7CisgIH0gZWxzZSB7CisgICAgbWV0aG9kLT5pbnB1dF90eXBlXyA9IGlucHV0X3R5cGUuZGVzY3JpcHRvcjsKKyAgfQorCisgIFN5bWJvbCBvdXRwdXRfdHlwZSA9IExvb2t1cFN5bWJvbChwcm90by5vdXRwdXRfdHlwZSgpLCBtZXRob2QtPmZ1bGxfbmFtZSgpKTsKKyAgaWYgKG91dHB1dF90eXBlLklzTnVsbCgpKSB7CisgICAgQWRkTm90RGVmaW5lZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9VVFBVVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90by5vdXRwdXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmIChvdXRwdXRfdHlwZS50eXBlICE9IFN5bWJvbDo6TUVTU0FHRSkgeworICAgIEFkZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1VUUFVUX1RZUEUsCisgICAgICAgICAgICAgIlwiIiArIHByb3RvLm91dHB1dF90eXBlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOworICB9IGVsc2UgeworICAgIG1ldGhvZC0+b3V0cHV0X3R5cGVfID0gb3V0cHV0X3R5cGUuZGVzY3JpcHRvcjsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGRlc2NyaXB0b3IsIGFycmF5X25hbWUsIHR5cGUpICBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+YXJyYXlfbmFtZSMjX2NvdW50KCk7ICsraSkgeyAgICAgXAorICAgIFZhbGlkYXRlIyN0eXBlIyNPcHRpb25zKGRlc2NyaXB0b3ItPmFycmF5X25hbWUjI3NfICsgaSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5hcnJheV9uYW1lKGkpKTsgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gRGV0ZXJtaW5lIGlmIHRoZSBmaWxlIHVzZXMgb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FLCBiZWluZyBjYXJlZnVsIHRvCisvLyBhdm9pZCBwcm9ibGVtcyB0aGF0IGV4aXN0IGF0IGluaXQgdGltZS4KK3N0YXRpYyBib29sIElzTGl0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICAvLyBUT0RPKGtlbnRvbik6ICBJIGRvbid0IGV2ZW4gcmVtZW1iZXIgaG93IG1hbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUKKyAgLy8gICBhY3R1YWxseSBwb3NzaWJsZS4gIEknbSBqdXN0IGJlaW5nIHN1cGVyLXNhZmUuCisgIHJldHVybiBmaWxlICE9IE5VTEwgJiYKKyAgICAgICAgICZmaWxlLT5vcHRpb25zKCkgIT0gTlVMTCAmJgorICAgICAgICAgJmZpbGUtPm9wdGlvbnMoKSAhPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSAmJgorICAgICAgICAgZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpID09IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRmlsZU9wdGlvbnMoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShmaWxlLCBtZXNzYWdlX3R5cGUsIE1lc3NhZ2UpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoZmlsZSwgZW51bV90eXBlLCBFbnVtKTsKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGZpbGUsIHNlcnZpY2UsIFNlcnZpY2UpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoZmlsZSwgZXh0ZW5zaW9uLCBGaWVsZCk7CisKKyAgLy8gTGl0ZSBmaWxlcyBjYW4gb25seSBiZSBpbXBvcnRlZCBieSBvdGhlciBMaXRlIGZpbGVzLgorICBpZiAoIUlzTGl0ZShmaWxlKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgIGlmIChJc0xpdGUoZmlsZS0+ZGVwZW5kZW5jeShpKSkpIHsKKyAgICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgZmlsZS0+bmFtZSgpLCBwcm90bywKKyAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICJGaWxlcyB0aGF0IGRvIG5vdCB1c2Ugb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIGNhbm5vdCBpbXBvcnQgIgorICAgICAgICAgICJmaWxlcyB3aGljaCBkbyB1c2UgdGhpcyBvcHRpb24uICBUaGlzIGZpbGUgaXMgbm90IGxpdGUsIGJ1dCBpdCAiCisgICAgICAgICAgImltcG9ydHMgXCIiICsgZmlsZS0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpICsgIlwiIHdoaWNoIGlzLiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNZXNzYWdlT3B0aW9ucyhEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShtZXNzYWdlLCBmaWVsZCwgRmllbGQpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgbmVzdGVkX3R5cGUsIE1lc3NhZ2UpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgZW51bV90eXBlLCBFbnVtKTsKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKG1lc3NhZ2UsIGV4dGVuc2lvbiwgRmllbGQpOworCisgIGNvbnN0IGludDY0IG1heF9leHRlbnNpb25fcmFuZ2UgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50NjQ+KG1lc3NhZ2UtPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBraW50MzJtYXggOgorICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2UoaSktPmVuZCA+IG1heF9leHRlbnNpb25fcmFuZ2UgKyAxKSB7CisgICAgICBBZGRFcnJvcigKKyAgICAgICAgICBtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGkpLAorICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkV4dGVuc2lvbiBudW1iZXJzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJDAuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9leHRlbnNpb25fcmFuZ2UpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKGZpZWxkLT5vcHRpb25zKCkuaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKKyAgICBWYWxpZGF0ZU1hcEtleShmaWVsZCwgcHJvdG8pOworICB9CisKKyAgLy8gT25seSBtZXNzYWdlIHR5cGUgZmllbGRzIG1heSBiZSBsYXp5LgorICBpZiAoZmllbGQtPm9wdGlvbnMoKS5sYXp5KCkpIHsKKyAgICBpZiAoZmllbGQtPnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICJbbGF6eSA9IHRydWVdIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3VibWVzc2FnZSBmaWVsZHMuIik7CisgICAgfQorICB9CisKKyAgLy8gT25seSByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIG1heSBiZSBwYWNrZWQuCisgIGlmIChmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpICYmICFmaWVsZC0+aXNfcGFja2FibGUoKSkgeworICAgIEFkZEVycm9yKAorICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICJbcGFja2VkID0gdHJ1ZV0gY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzLiIpOworICB9CisKKyAgLy8gTm90ZTogIERlZmF1bHQgaW5zdGFuY2UgbWF5IG5vdCB5ZXQgYmUgaW5pdGlhbGl6ZWQgaGVyZSwgc28gd2UgaGF2ZSB0bworICAvLyAgIGF2b2lkIHJlYWRpbmcgZnJvbSBpdC4KKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX3R5cGVfICE9IE5VTEwgJiYKKyAgICAgICZmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKSAhPQorICAgICAgJk1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgJiYKKyAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgICBpZiAoIWZpZWxkLT5pc19vcHRpb25hbCgpIHx8CisgICAgICAgICAgZmllbGQtPnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgeworICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAgICJFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgbWVzc2FnZXMuIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAiTWVzc2FnZVNldHMgY2Fubm90IGhhdmUgZmllbGRzLCBvbmx5IGV4dGVuc2lvbnMuIik7CisgICAgfQorICB9CisKKyAgLy8gTGl0ZSBleHRlbnNpb25zIGNhbiBvbmx5IGJlIG9mIExpdGUgdHlwZXMuCisgIGlmIChJc0xpdGUoZmllbGQtPmZpbGUoKSkgJiYKKyAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGVfICE9IE5VTEwgJiYKKyAgICAgICFJc0xpdGUoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5maWxlKCkpKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICJFeHRlbnNpb25zIHRvIG5vbi1saXRlIHR5cGVzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGluIG5vbi1saXRlICIKKyAgICAgICAgICAgICAiZmlsZXMuICBOb3RlIHRoYXQgeW91IGNhbm5vdCBleHRlbmQgYSBub24tbGl0ZSB0eXBlIHRvIGNvbnRhaW4gIgorICAgICAgICAgICAgICJhIGxpdGUgdHlwZSwgYnV0IHRoZSByZXZlcnNlIGlzIGFsbG93ZWQuIik7CisgIH0KKworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUVudW1PcHRpb25zKEVudW1EZXNjcmlwdG9yKiBlbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShlbm0sIHZhbHVlLCBFbnVtVmFsdWUpOworICBpZiAoIWVubS0+b3B0aW9ucygpLmhhc19hbGxvd19hbGlhcygpIHx8ICFlbm0tPm9wdGlvbnMoKS5hbGxvd19hbGlhcygpKSB7CisgICAgbWFwPGludCwgc3RyaW5nPiB1c2VkX3ZhbHVlczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGVubS0+dmFsdWVfY291bnQoKTsgKytpKSB7CisgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gZW5tLT52YWx1ZShpKTsKKyAgICAgIGlmICh1c2VkX3ZhbHVlcy5maW5kKGVudW1fdmFsdWUtPm51bWJlcigpKSAhPSB1c2VkX3ZhbHVlcy5lbmQoKSkgeworICAgICAgICBzdHJpbmcgZXJyb3IgPQorICAgICAgICAgICAgIlwiIiArIGVudW1fdmFsdWUtPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICJcIiB1c2VzIHRoZSBzYW1lIGVudW0gdmFsdWUgYXMgXCIiICsKKyAgICAgICAgICAgIHVzZWRfdmFsdWVzW2VudW1fdmFsdWUtPm51bWJlcigpXSArICJcIi4gSWYgdGhpcyBpcyBpbnRlbmRlZCwgc2V0ICIKKyAgICAgICAgICAgICInb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsnIHRvIHRoZSBlbnVtIGRlZmluaXRpb24uIjsKKyAgICAgICAgaWYgKCFlbm0tPm9wdGlvbnMoKS5hbGxvd19hbGlhcygpKSB7CisgICAgICAgICAgLy8gR2VuZXJhdGUgZXJyb3IgaWYgZHVwbGljYXRlZCBlbnVtIHZhbHVlcyBhcmUgZXhwbGljaXRseSBkaXNhbGxvd2VkLgorICAgICAgICAgIEFkZEVycm9yKGVubS0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBHZW5lcmF0ZSB3YXJuaW5nIGlmIGR1cGxpY2F0ZWQgdmFsdWVzIGFyZSBmb3VuZCBidXQgdGhlIG9wdGlvbgorICAgICAgICAgIC8vIGlzbid0IHNldC4KKyAgICAgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdXNlZF92YWx1ZXNbZW51bV92YWx1ZS0+bnVtYmVyKCldID0gZW51bV92YWx1ZS0+ZnVsbF9uYW1lKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRW51bVZhbHVlT3B0aW9ucygKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlLCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIC8vIE5vdGhpbmcgdG8gZG8gc28gZmFyLgorfQordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVTZXJ2aWNlT3B0aW9ucyhTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSwKKyAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAoSXNMaXRlKHNlcnZpY2UtPmZpbGUoKSkgJiYKKyAgICAgIChzZXJ2aWNlLT5maWxlKCktPm9wdGlvbnMoKS5jY19nZW5lcmljX3NlcnZpY2VzKCkgfHwKKyAgICAgICBzZXJ2aWNlLT5maWxlKCktPm9wdGlvbnMoKS5qYXZhX2dlbmVyaWNfc2VydmljZXMoKSkpIHsKKyAgICBBZGRFcnJvcihzZXJ2aWNlLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICJGaWxlcyB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjYW5ub3QgZGVmaW5lIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAidW5sZXNzIHlvdSBzZXQgYm90aCBvcHRpb25zIGNjX2dlbmVyaWNfc2VydmljZXMgYW5kICIKKyAgICAgICAgICAgICAiamF2YV9nZW5lcmljX3NldmljZXMgdG8gZmFsc2UuIik7CisgIH0KKworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoc2VydmljZSwgbWV0aG9kLCBNZXRob2QpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZU1ldGhvZE9wdGlvbnMoTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgLy8gTm90aGluZyB0byBkbyBzbyBmYXIuCit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlTWFwS2V5KEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAibWFwIHR5cGUgaXMgb25seSBhbGxvd2VkIGZvciByZXBlYXRlZCBmaWVsZHMuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICJtYXAgdHlwZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGZpZWxkcyB3aXRoIGEgbWVzc2FnZSB0eXBlLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IERlc2NyaXB0b3IqIGl0ZW1fdHlwZSA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgaWYgKGl0ZW1fdHlwZSA9PSBOVUxMKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBmaWVsZCB0eXBlLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEZpbmQgdGhlIGZpZWxkIGluIGl0ZW1fdHlwZSBuYW1lZCBieSAiZXhwZXJpbWVudGFsX21hcF9rZXkiCisgIGNvbnN0IHN0cmluZyYga2V5X25hbWUgPSBmaWVsZC0+b3B0aW9ucygpLmV4cGVyaW1lbnRhbF9tYXBfa2V5KCk7CisgIGNvbnN0IFN5bWJvbCBrZXlfc3ltYm9sID0gTG9va3VwU3ltYm9sKAorICAgICAga2V5X25hbWUsCisgICAgICAvLyBXZSBhcHBlbmQgIi5rZXlfbmFtZSIgdG8gdGhlIGNvbnRhaW5pbmcgdHlwZSdzIG5hbWUgc2luY2UKKyAgICAgIC8vIExvb2t1cFN5bWJvbCgpIHNlYXJjaGVzIGZvciBwZWVycyBvZiB0aGUgc3VwcGxpZWQgbmFtZSwgbm90CisgICAgICAvLyBjaGlsZHJlbiBvZiB0aGUgc3VwcGxpZWQgbmFtZS4KKyAgICAgIGl0ZW1fdHlwZS0+ZnVsbF9uYW1lKCkgKyAiLiIgKyBrZXlfbmFtZSk7CisKKyAgaWYgKGtleV9zeW1ib2wuSXNOdWxsKCkgfHwga2V5X3N5bWJvbC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgeworICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgZmllbGQgbmFtZWQgXCIiICsga2V5X25hbWUgKyAiXCIgaW4gdHlwZSBcIiIgKworICAgICAgICAgICAgIGl0ZW1fdHlwZS0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgcmV0dXJuOworICB9CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2ZpZWxkID0ga2V5X3N5bWJvbC5maWVsZF9kZXNjcmlwdG9yOworCisgIGlmIChrZXlfZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgIm1hcF9rZXkgbXVzdCBub3QgbmFtZSBhIHJlcGVhdGVkIGZpZWxkLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChrZXlfZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgIm1hcCBrZXkgbXVzdCBuYW1lIGEgc2NhbGFyIG9yIHN0cmluZyBmaWVsZC4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBmaWVsZC0+ZXhwZXJpbWVudGFsX21hcF9rZXlfID0ga2V5X2ZpZWxkOworfQorCisKKyN1bmRlZiBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6Ok9wdGlvbkludGVycHJldGVyKAorICAgIERlc2NyaXB0b3JCdWlsZGVyKiBidWlsZGVyKSA6IGJ1aWxkZXJfKGJ1aWxkZXIpIHsKKyAgR09PR0xFX0NIRUNLKGJ1aWxkZXJfKTsKK30KKworRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjp+T3B0aW9uSW50ZXJwcmV0ZXIoKSB7Cit9CisKK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpJbnRlcnByZXRPcHRpb25zKAorICAgIE9wdGlvbnNUb0ludGVycHJldCogb3B0aW9uc190b19pbnRlcnByZXQpIHsKKyAgLy8gTm90ZSB0aGF0IHRoZXNlIG1heSBiZSBpbiBkaWZmZXJlbnQgcG9vbHMsIHNvIHdlIGNhbid0IHVzZSB0aGUgc2FtZQorICAvLyBkZXNjcmlwdG9yIGFuZCByZWZsZWN0aW9uIG9iamVjdHMgb24gYm90aC4KKyAgTWVzc2FnZSogb3B0aW9ucyA9IG9wdGlvbnNfdG9faW50ZXJwcmV0LT5vcHRpb25zOworICBjb25zdCBNZXNzYWdlKiBvcmlnaW5hbF9vcHRpb25zID0gb3B0aW9uc190b19pbnRlcnByZXQtPm9yaWdpbmFsX29wdGlvbnM7CisKKyAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgb3B0aW9uc190b19pbnRlcnByZXRfID0gb3B0aW9uc190b19pbnRlcnByZXQ7CisKKyAgLy8gRmluZCB0aGUgdW5pbnRlcnByZXRlZF9vcHRpb24gZmllbGQgaW4gdGhlIG11dGFibGUgY29weSBvZiB0aGUgb3B0aW9ucworICAvLyBhbmQgY2xlYXIgdGhlbSwgc2luY2Ugd2UncmUgYWJvdXQgdG8gaW50ZXJwcmV0IHRoZW0uCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkID0KKyAgICAgIG9wdGlvbnMtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJ1bmludGVycHJldGVkX29wdGlvbiIpOworICBHT09HTEVfQ0hFQ0sodW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkICE9IE5VTEwpCisgICAgICA8PCAiTm8gZmllbGQgbmFtZWQgXCJ1bmludGVycHJldGVkX29wdGlvblwiIGluIHRoZSBPcHRpb25zIHByb3RvLiI7CisgIG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKS0+Q2xlYXJGaWVsZChvcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbnNfZmllbGQpOworCisgIC8vIEZpbmQgdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIGZpZWxkIGluIHRoZSBvcmlnaW5hbCBvcHRpb25zLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9yaWdpbmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCA9CisgICAgICBvcmlnaW5hbF9vcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPgorICAgICAgICAgIEZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKKyAgR09PR0xFX0NIRUNLKG9yaWdpbmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCAhPSBOVUxMKQorICAgICAgPDwgIk5vIGZpZWxkIG5hbWVkIFwidW5pbnRlcnByZXRlZF9vcHRpb25cIiBpbiB0aGUgT3B0aW9ucyBwcm90by4iOworCisgIGNvbnN0IGludCBudW1fdW5pbnRlcnByZXRlZF9vcHRpb25zID0gb3JpZ2luYWxfb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT4KKyAgICAgIEZpZWxkU2l6ZSgqb3JpZ2luYWxfb3B0aW9ucywgb3JpZ2luYWxfdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdW5pbnRlcnByZXRlZF9vcHRpb25zOyArK2kpIHsKKyAgICB1bmludGVycHJldGVkX29wdGlvbl8gPSBkb3duX2Nhc3Q8Y29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbio+KAorICAgICAgICAmb3JpZ2luYWxfb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICAgICAgICAqb3JpZ2luYWxfb3B0aW9ucywgb3JpZ2luYWxfdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkLCBpKSk7CisgICAgaWYgKCFJbnRlcnByZXRTaW5nbGVPcHRpb24ob3B0aW9ucykpIHsKKyAgICAgIC8vIEVycm9yIGFscmVhZHkgYWRkZWQgYnkgSW50ZXJwcmV0U2luZ2xlT3B0aW9uKCkuCisgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8vIFJlc2V0IHRoZXNlLCBzbyB3ZSBkb24ndCBoYXZlIGFueSBkYW5nbGluZyBwb2ludGVycy4KKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fID0gTlVMTDsKKyAgb3B0aW9uc190b19pbnRlcnByZXRfID0gTlVMTDsKKworICBpZiAoIWZhaWxlZCkgeworICAgIC8vIEludGVycHJldFNpbmdsZU9wdGlvbigpIGFkZGVkIHRoZSBpbnRlcnByZXRlZCBvcHRpb25zIGluIHRoZQorICAgIC8vIFVua25vd25GaWVsZFNldCwgaW4gY2FzZSB0aGUgb3B0aW9uIGlzbid0IHlldCBrbm93biB0byB1cy4gIE5vdyB3ZQorICAgIC8vIHNlcmlhbGl6ZSB0aGUgb3B0aW9ucyBtZXNzYWdlIGFuZCBkZXNlcmlhbGl6ZSBpdCBiYWNrLiAgVGhhdCB3YXksIGFueQorICAgIC8vIG9wdGlvbiBmaWVsZHMgdGhhdCB3ZSBkbyBoYXBwZW4gdG8ga25vdyBhYm91dCB3aWxsIGdldCBtb3ZlZCBmcm9tIHRoZQorICAgIC8vIFVua25vd25GaWVsZFNldCBpbnRvIHRoZSByZWFsIGZpZWxkcywgYW5kIHRodXMgYmUgYXZhaWxhYmxlIHJpZ2h0IGF3YXkuCisgICAgLy8gSWYgdGhleSBhcmUgbm90IGtub3duLCB0aGF0J3MgT0sgdG9vLiBUaGV5IHdpbGwgZ2V0IHJlcGFyc2VkIGludG8gdGhlCisgICAgLy8gVW5rbm93bkZpZWxkU2V0IGFuZCB3YWl0IHRoZXJlIHVudGlsIHRoZSBtZXNzYWdlIGlzIHBhcnNlZCBieSBzb21ldGhpbmcKKyAgICAvLyB0aGF0IGRvZXMga25vdyBhYm91dCB0aGUgb3B0aW9ucy4KKyAgICBzdHJpbmcgYnVmOworICAgIG9wdGlvbnMtPkFwcGVuZFRvU3RyaW5nKCZidWYpOworICAgIEdPT0dMRV9DSEVDSyhvcHRpb25zLT5QYXJzZUZyb21TdHJpbmcoYnVmKSkKKyAgICAgICAgPDwgIlByb3RvY29sIG1lc3NhZ2Ugc2VyaWFsaXplZCBpdHNlbGYgaW4gaW52YWxpZCBmYXNoaW9uLiI7CisgIH0KKworICByZXR1cm4gIWZhaWxlZDsKK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkludGVycHJldFNpbmdsZU9wdGlvbigKKyAgICBNZXNzYWdlKiBvcHRpb25zKSB7CisgIC8vIEZpcnN0IGRvIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi4KKyAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZV9zaXplKCkgPT0gMCkgeworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxlc3MgdGhlIHBhcnNlciBoYXMgZ29uZSBzZXJpb3VzbHkgYXdyeSBvcgorICAgIC8vIHNvbWVvbmUgaGFzIG1hbnVhbGx5IGNyZWF0ZWQgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uIGJhZGx5LgorICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBtdXN0IGhhdmUgYSBuYW1lLiIpOworICB9CisgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gInVuaW50ZXJwcmV0ZWRfb3B0aW9uIikgeworICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBtdXN0IG5vdCB1c2UgcmVzZXJ2ZWQgbmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJ1bmludGVycHJldGVkX29wdGlvblwiLiIpOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogb3B0aW9uc19kZXNjcmlwdG9yID0gTlVMTDsKKyAgLy8gR2V0IHRoZSBvcHRpb25zIG1lc3NhZ2UncyBkZXNjcmlwdG9yIGZyb20gdGhlIGJ1aWxkZXIncyBwb29sLCBzbyB0aGF0IHdlCisgIC8vIGdldCB0aGUgdmVyc2lvbiB0aGF0IGtub3dzIGFib3V0IGFueSBleHRlbnNpb24gb3B0aW9ucyBkZWNsYXJlZCBpbiB0aGUKKyAgLy8gZmlsZSB3ZSdyZSBjdXJyZW50bHkgYnVpbGRpbmcuIFRoZSBkZXNjcmlwdG9yIHNob3VsZCBiZSB0aGVyZSBhcyBsb25nIGFzCisgIC8vIHRoZSBmaWxlIHdlJ3JlIGJ1aWxkaW5nIGltcG9ydGVkICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcnMucHJvdG8iLgorCisgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKCksIG5vdAorICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCkgYmVjYXVzZSB3ZSdyZSBhbHJlYWR5IGhvbGRpbmcgdGhlCisgIC8vIHBvb2wncyBtdXRleCwgYW5kIHRoZSBsYXR0ZXIgbWV0aG9kIGxvY2tzIGl0IGFnYWluLiAgV2UgZG9uJ3QgdXNlCisgIC8vIEZpbmRTeW1ib2woKSBiZWNhdXNlIGZpbGVzIHRoYXQgdXNlIGN1c3RvbSBvcHRpb25zIG9ubHkgbmVlZCB0byBkZXBlbmQgb24KKyAgLy8gdGhlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBvcHRpb24sIG5vdCBkZXNjcmlwdG9yLnByb3RvIGl0c2VsZi4KKyAgU3ltYm9sIHN5bWJvbCA9IGJ1aWxkZXJfLT5GaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygKKyAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKTsKKyAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgPT0gU3ltYm9sOjpNRVNTQUdFKSB7CisgICAgb3B0aW9uc19kZXNjcmlwdG9yID0gc3ltYm9sLmRlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIG9wdGlvbnMgbWVzc2FnZSdzIGRlc2NyaXB0b3Igd2FzIG5vdCBpbiB0aGUgYnVpbGRlcidzIHBvb2wsIHNvIHVzZQorICAgIC8vIHRoZSBzdGFuZGFyZCB2ZXJzaW9uIGZyb20gdGhlIGdlbmVyYXRlZCBwb29sLiBXZSdyZSBub3QgaG9sZGluZyB0aGUKKyAgICAvLyBnZW5lcmF0ZWQgcG9vbCdzIG11dGV4LCBzbyB3ZSBjYW4gc2VhcmNoIGl0IHRoZSBzdHJhaWdodGZvcndhcmQgd2F5LgorICAgIG9wdGlvbnNfZGVzY3JpcHRvciA9IG9wdGlvbnMtPkdldERlc2NyaXB0b3IoKTsKKyAgfQorICBHT09HTEVfQ0hFQ0sob3B0aW9uc19kZXNjcmlwdG9yKTsKKworICAvLyBXZSBpdGVyYXRlIG92ZXIgdGhlIG5hbWUgcGFydHMgdG8gZHJpbGwgaW50byB0aGUgc3VibWVzc2FnZXMgdW50aWwgd2UgZmluZAorICAvLyB0aGUgbGVhZiBmaWVsZCBmb3IgdGhlIG9wdGlvbi4gQXMgd2UgZHJpbGwgZG93biB3ZSByZW1lbWJlciB0aGUgY3VycmVudAorICAvLyBzdWJtZXNzYWdlJ3MgZGVzY3JpcHRvciBpbiB8ZGVzY3JpcHRvcnwgYW5kIHRoZSBuZXh0IGZpZWxkIGluIHRoYXQKKyAgLy8gc3VibWVzc2FnZSBpbiB8ZmllbGR8LiBXZSBhbHNvIHRyYWNrIHRoZSBmaWVsZHMgd2UncmUgZHJpbGxpbmcgZG93bgorICAvLyB0aHJvdWdoIGluIHxpbnRlcm1lZGlhdGVfZmllbGRzfC4gQXMgd2UgZ28sIHdlIHJlY29uc3RydWN0IHRoZSBmdWxsIG9wdGlvbgorICAvLyBuYW1lIGluIHxkZWJ1Z19tc2dfbmFtZXwsIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXMuCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBvcHRpb25zX2Rlc2NyaXB0b3I7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gaW50ZXJtZWRpYXRlX2ZpZWxkczsKKyAgc3RyaW5nIGRlYnVnX21zZ19uYW1lID0gIiI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl8tPm5hbWVfc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBzdHJpbmcmIG5hbWVfcGFydCA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZShpKS5uYW1lX3BhcnQoKTsKKyAgICBpZiAoZGVidWdfbXNnX25hbWUuc2l6ZSgpID4gMCkgeworICAgICAgZGVidWdfbXNnX25hbWUgKz0gIi4iOworICAgIH0KKyAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lKGkpLmlzX2V4dGVuc2lvbigpKSB7CisgICAgICBkZWJ1Z19tc2dfbmFtZSArPSAiKCIgKyBuYW1lX3BhcnQgKyAiKSI7CisgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yIGFzIGFuIGV4dGVuc2lvbiBpbiB0aGUgYnVpbGRlcidzCisgICAgICAvLyBwb29sLiBOb3RlIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpMb29rdXBTeW1ib2woKSwgbm90CisgICAgICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpLCBmb3IgdHdvIHJlYXNvbnM6IDEpIEl0IGFsbG93cworICAgICAgLy8gcmVsYXRpdmUgbG9va3VwcywgYW5kIDIpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZSBwb29sJ3MKKyAgICAgIC8vIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uCisgICAgICBzeW1ib2wgPSBidWlsZGVyXy0+TG9va3VwU3ltYm9sKG5hbWVfcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc190b19pbnRlcnByZXRfLT5uYW1lX3Njb3BlKTsKKyAgICAgIGlmICghc3ltYm9sLklzTnVsbCgpICYmIHN5bWJvbC50eXBlID09IFN5bWJvbDo6RklFTEQpIHsKKyAgICAgICAgZmllbGQgPSBzeW1ib2wuZmllbGRfZGVzY3JpcHRvcjsKKyAgICAgIH0KKyAgICAgIC8vIElmIHdlIGRvbid0IGZpbmQgdGhlIGZpZWxkIHRoZW4gdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciB3YXMgbm90IGluIHRoZQorICAgICAgLy8gYnVpbGRlcidzIHBvb2wsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IGluIGxvb2tpbmcgaW4gdGhlIGdlbmVyYXRlZAorICAgICAgLy8gcG9vbC4gV2UgcmVxdWlyZSB0aGF0IHlvdSBpbXBvcnQgdGhlIGZpbGUgdGhhdCBkZWZpbmVzIGFueSBleHRlbnNpb25zCisgICAgICAvLyB5b3UgdXNlLCBzbyB0aGV5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgYnVpbGRlcidzIHBvb2wuCisgICAgfSBlbHNlIHsKKyAgICAgIGRlYnVnX21zZ19uYW1lICs9IG5hbWVfcGFydDsKKyAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciBhcyBhIHJlZ3VsYXIgZmllbGQuCisgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShuYW1lX3BhcnQpOworICAgIH0KKworICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICBpZiAoZ2V0X2FsbG93X3Vua25vd24oYnVpbGRlcl8tPnBvb2xfKSkgeworICAgICAgICAvLyBXZSBjYW4ndCBmaW5kIHRoZSBvcHRpb24sIGJ1dCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBpcyBlbmFibGVkLAorICAgICAgICAvLyBzbyB3ZSB3aWxsIGp1c3QgbGVhdmUgaXQgYXMgdW5pbnRlcnByZXRlZC4KKyAgICAgICAgQWRkV2l0aG91dEludGVycHJldGluZygqdW5pbnRlcnByZXRlZF9vcHRpb25fLCBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gXCIiICsgZGVidWdfbXNnX25hbWUgKyAiXCIgdW5rbm93bi4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSAhPSBkZXNjcmlwdG9yKSB7CisgICAgICBpZiAoZ2V0X2lzX3BsYWNlaG9sZGVyKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICAgICAgLy8gVGhlIGZpZWxkIGlzIGFuIGV4dGVuc2lvbiBvZiBhIHBsYWNlaG9sZGVyIHR5cGUsIHNvIHdlIGNhbid0CisgICAgICAgIC8vIHJlbGlhYmx5IHZlcmlmeSB3aGV0aGVyIGl0IGlzIGEgdmFsaWQgZXh0ZW5zaW9uIHRvIHVzZSBoZXJlIChlLmcuCisgICAgICAgIC8vIHdlIGRvbid0IGtub3cgaWYgaXQgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBjb3JyZWN0ICpPcHRpb25zIG1lc3NhZ2UsCisgICAgICAgIC8vIG9yIGlmIGl0IGhhcyBhIHZhbGlkIGZpZWxkIG51bWJlciwgZXRjLikuICBKdXN0IGxlYXZlIGl0IGFzCisgICAgICAgIC8vIHVuaW50ZXJwcmV0ZWQgaW5zdGVhZC4KKyAgICAgICAgQWRkV2l0aG91dEludGVycHJldGluZygqdW5pbnRlcnByZXRlZF9vcHRpb25fLCBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiwgZHVlIHRvIHNvbWUgaW5zYW5lIG1pc2NvbmZpZ3VyYXRpb24gb2YgdGhlCisgICAgICAgIC8vIHBvb2xzLCB3ZSBmaW5kIHRoZSBvcHRpb25zIG1lc3NhZ2UgaW4gb25lIHBvb2wgYnV0IHRoZSBmaWVsZCBpbgorICAgICAgICAvLyBhbm90aGVyLiBUaGlzIHdvdWxkIHByb2JhYmx5IGltcGx5IGEgaGVmdHkgYnVnIHNvbWV3aGVyZS4KKyAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIGZpZWxkIFwiIiArIGRlYnVnX21zZ19uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgbm90IGEgZmllbGQgb3IgZXh0ZW5zaW9uIG9mIG1lc3NhZ2UgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIGZpZWxkIFwiIiArIGRlYnVnX21zZ19uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIHJlcGVhdGVkLiBSZXBlYXRlZCBvcHRpb25zIGFyZSBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkLiIpOworICAgIH0gZWxzZSBpZiAoaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZV9zaXplKCkgLSAxKSB7CisgICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIFwiIiArICBkZWJ1Z19tc2dfbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIGFuIGF0b21pYyB0eXBlLCBub3QgYSBtZXNzYWdlLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRHJpbGwgZG93biBpbnRvIHRoZSBzdWJtZXNzYWdlLgorICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgICAgICAgIGRlc2NyaXB0b3IgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gV2UndmUgZm91bmQgdGhlIGxlYWYgZmllbGQuIE5vdyB3ZSB1c2UgVW5rbm93bkZpZWxkU2V0cyB0byBzZXQgaXRzIHZhbHVlCisgIC8vIG9uIHRoZSBvcHRpb25zIG1lc3NhZ2UuIFdlIGRvIHNvIGJlY2F1c2UgdGhlIG1lc3NhZ2UgbWF5IG5vdCB5ZXQga25vdworICAvLyBhYm91dCBpdHMgZXh0ZW5zaW9uIGZpZWxkcywgc28gd2UgbWF5IG5vdCBiZSBhYmxlIHRvIHNldCB0aGUgZmllbGRzCisgIC8vIGRpcmVjdGx5LiBCdXQgdGhlIFVua25vd25GaWVsZFNldHMgd2lsbCBzZXJpYWxpemUgdG8gdGhlIHNhbWUgd2lyZS1mb3JtYXQKKyAgLy8gbWVzc2FnZSwgc28gcmVhZGluZyB0aGF0IG1lc3NhZ2UgYmFjayBpbiBvbmNlIHRoZSBleHRlbnNpb24gZmllbGRzIGFyZQorICAvLyBrbm93biB3aWxsIHBvcHVsYXRlIHRoZW0gY29ycmVjdGx5LgorCisgIC8vIEZpcnN0IHNlZSBpZiB0aGUgb3B0aW9uIGlzIGFscmVhZHkgc2V0LgorICBpZiAoIUV4YW1pbmVJZk9wdGlvbklzU2V0KAorICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHMuYmVnaW4oKSwKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzLmVuZCgpLAorICAgICAgICAgIGZpZWxkLCBkZWJ1Z19tc2dfbmFtZSwKKyAgICAgICAgICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkdldFVua25vd25GaWVsZHMoKm9wdGlvbnMpKSkgeworICAgIHJldHVybiBmYWxzZTsgIC8vIEV4YW1pbmVJZk9wdGlvbklzU2V0KCkgYWxyZWFkeSBhZGRlZCB0aGUgZXJyb3IuCisgIH0KKworCisgIC8vIEZpcnN0IHNldCB0aGUgdmFsdWUgb24gdGhlIFVua25vd25GaWVsZFNldCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAvLyBpbm5lcm1vc3QgbWVzc2FnZS4KKyAgc2NvcGVkX3B0cjxVbmtub3duRmllbGRTZXQ+IHVua25vd25fZmllbGRzKG5ldyBVbmtub3duRmllbGRTZXQoKSk7CisgIGlmICghU2V0T3B0aW9uVmFsdWUoZmllbGQsIHVua25vd25fZmllbGRzLmdldCgpKSkgeworICAgIHJldHVybiBmYWxzZTsgIC8vIFNldE9wdGlvblZhbHVlKCkgYWxyZWFkeSBhZGRlZCB0aGUgZXJyb3IuCisgIH0KKworICAvLyBOb3cgd3JhcCB0aGUgVW5rbm93bkZpZWxkU2V0IHdpdGggVW5rbm93bkZpZWxkU2V0cyBjb3JyZXNwb25kaW5nIHRvIGFsbAorICAvLyB0aGUgaW50ZXJtZWRpYXRlIG1lc3NhZ2VzLgorICBmb3IgKHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkcy5yYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGludGVybWVkaWF0ZV9maWVsZHMucmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzY29wZWRfcHRyPFVua25vd25GaWVsZFNldD4gcGFyZW50X3Vua25vd25fZmllbGRzKG5ldyBVbmtub3duRmllbGRTZXQoKSk7CisgICAgc3dpdGNoICgoKml0ZXIpLT50eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRzdHIoCisgICAgICAgICAgICBwYXJlbnRfdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZCgoKml0ZXIpLT5udW1iZXIoKSkpOworICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0KCZvdXRzdHIpOworICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygqdW5rbm93bl9maWVsZHMsICZvdXQpOworICAgICAgICBHT09HTEVfQ0hFQ0soIW91dC5IYWRFcnJvcigpKQorICAgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZSB3aGlsZSBzZXJpYWxpemluZyBvcHRpb24gc3VibWVzc2FnZSAiCisgICAgICAgICAgICA8PCBkZWJ1Z19tc2dfbmFtZSA8PCAiXCIuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOiB7CisgICAgICAgICBwYXJlbnRfdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKCgqaXRlciktPm51bWJlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5NZXJnZUZyb20oKnVua25vd25fZmllbGRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9NRVNTQUdFOiAiCisgICAgICAgICAgICAgICAgICAgPDwgKCppdGVyKS0+dHlwZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVua25vd25fZmllbGRzLnJlc2V0KHBhcmVudF91bmtub3duX2ZpZWxkcy5yZWxlYXNlKCkpOworICB9CisKKyAgLy8gTm93IG1lcmdlIHRoZSBVbmtub3duRmllbGRTZXQgY29ycmVzcG9uZGluZyB0byB0aGUgdG9wLWxldmVsIG1lc3NhZ2UgaW50bworICAvLyB0aGUgb3B0aW9ucyBtZXNzYWdlLgorICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKG9wdGlvbnMpLT5NZXJnZUZyb20oCisgICAgICAqdW5rbm93bl9maWVsZHMpOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6QWRkV2l0aG91dEludGVycHJldGluZygKKyAgICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbiwgTWVzc2FnZSogb3B0aW9ucykgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKKyAgR09PR0xFX0NIRUNLKGZpZWxkICE9IE5VTEwpOworCisgIG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKS0+QWRkTWVzc2FnZShvcHRpb25zLCBmaWVsZCkKKyAgICAtPkNvcHlGcm9tKHVuaW50ZXJwcmV0ZWRfb3B0aW9uKTsKK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkV4YW1pbmVJZk9wdGlvbklzU2V0KAorICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyLAorICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBpbm5lcm1vc3RfZmllbGQsIGNvbnN0IHN0cmluZyYgZGVidWdfbXNnX25hbWUsCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcykgeworICAvLyBXZSBkbyBsaW5lYXIgc2VhcmNoZXMgb2YgdGhlIFVua25vd25GaWVsZFNldCBhbmQgaXRzIHN1Yi1ncm91cHMuICBUaGlzCisgIC8vIHNob3VsZCBiZSBmaW5lIHNpbmNlIGl0J3MgdW5saWtlbHkgdGhhdCBhbnkgb25lIG9wdGlvbnMgc3RydWN0dXJlIHdpbGwKKyAgLy8gY29udGFpbiBtb3JlIHRoYW4gYSBoYW5kZnVsIG9mIG9wdGlvbnMuCisKKyAgaWYgKGludGVybWVkaWF0ZV9maWVsZHNfaXRlciA9PSBpbnRlcm1lZGlhdGVfZmllbGRzX2VuZCkgeworICAgIC8vIFdlJ3JlIGF0IHRoZSBpbm5lcm1vc3Qgc3VibWVzc2FnZS4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKHVua25vd25fZmllbGRzLmZpZWxkKGkpLm51bWJlcigpID09IGlubmVybW9zdF9maWVsZC0+bnVtYmVyKCkpIHsKKyAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIFwiIiArIGRlYnVnX21zZ19uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgd2FzIGFscmVhZHkgc2V0LiIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKHVua25vd25fZmllbGRzLmZpZWxkKGkpLm51bWJlcigpID09CisgICAgICAgICgqaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyKS0+bnVtYmVyKCkpIHsKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZCogdW5rbm93bl9maWVsZCA9ICZ1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlID0gKCppbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIpLT50eXBlKCk7CisgICAgICAvLyBSZWN1cnNlIGludG8gdGhlIG5leHQgc3VibWVzc2FnZS4KKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmICh1bmtub3duX2ZpZWxkLT50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCBpbnRlcm1lZGlhdGVfdW5rbm93bl9maWVsZHM7CisgICAgICAgICAgICBpZiAoaW50ZXJtZWRpYXRlX3Vua25vd25fZmllbGRzLlBhcnNlRnJvbVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZC0+bGVuZ3RoX2RlbGltaXRlZCgpKSAmJgorICAgICAgICAgICAgICAgICFFeGFtaW5lSWZPcHRpb25Jc1NldChpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJtb3N0X2ZpZWxkLCBkZWJ1Z19tc2dfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX3Vua25vd25fZmllbGRzKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBFcnJvciBhbHJlYWR5IGFkZGVkLgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgICAgICBpZiAodW5rbm93bl9maWVsZC0+dHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9HUk9VUCkgeworICAgICAgICAgICAgaWYgKCFFeGFtaW5lSWZPcHRpb25Jc1NldChpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJtb3N0X2ZpZWxkLCBkZWJ1Z19tc2dfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZC0+Z3JvdXAoKSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gRXJyb3IgYWxyZWFkeSBhZGRlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfTUVTU0FHRTogIiA8PCB0eXBlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRPcHRpb25WYWx1ZSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbl9maWVsZCwKKyAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIC8vIFdlIHN3aXRjaCBvbiB0aGUgQ3BwVHlwZSB0byB2YWxpZGF0ZS4KKyAgc3dpdGNoIChvcHRpb25fZmllbGQtPmNwcF90eXBlKCkpIHsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpID4KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDMybWF4KSkgeworICAgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIGludDMyIG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU2V0SW50MzIob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+dHlwZSgpLCB1bmtub3duX2ZpZWxkcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmVnYXRpdmVfaW50X3ZhbHVlKCkgPAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjQ+KGtpbnQzMm1pbikpIHsKKyAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgb3V0IG9mIHJhbmdlIGZvciBpbnQzMiBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldEludDMyKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBpbnRlZ2VyIGZvciBpbnQzMiBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkgPgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0PihraW50NjRtYXgpKSB7CisgICAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW50NjQgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTZXRJbnQ2NChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT50eXBlKCksIHVua25vd25fZmllbGRzKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBTZXRJbnQ2NChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPm5lZ2F0aXZlX2ludF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgaW50ZWdlciBmb3IgaW50NjQgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSA+IGt1aW50MzJtYXgpIHsKKyAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgb3V0IG9mIHJhbmdlIGZvciB1aW50MzIgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5uYW1lKCkgKyAiXCIuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU2V0VUludDMyKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+dHlwZSgpLCB1bmtub3duX2ZpZWxkcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvciB1aW50MzIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIFwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBTZXRVSW50NjQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGludGVnZXIgZm9yIHVpbnQ2NCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIGZsb2F0IHZhbHVlOworICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5kb3VibGVfdmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpOworICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBudW1iZXIgZm9yIGZsb2F0IG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgfQorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVuY29kZUZsb2F0KHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19kb3VibGVfdmFsdWUoKSkgeworICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+ZG91YmxlX3ZhbHVlKCk7CisgICAgICB9IGVsc2UgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPm5lZ2F0aXZlX2ludF92YWx1ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgbnVtYmVyIGZvciBkb3VibGUgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQ2NChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW5jb2RlRG91YmxlKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgdWludDY0IHZhbHVlOworICAgICAgaWYgKCF1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgYm9vbGVhbiBvcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmlkZW50aWZpZXJfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgdmFsdWUgPSAxOworICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmlkZW50aWZpZXJfdmFsdWUoKSA9PSAiZmFsc2UiKSB7CisgICAgICAgIHZhbHVlID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiBmb3IgYm9vbGVhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICBpZiAoIXVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2lkZW50aWZpZXJfdmFsdWUoKSkgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBpZGVudGlmaWVyIGZvciBlbnVtLXZhbHVlZCBvcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBvcHRpb25fZmllbGQtPmVudW1fdHlwZSgpOworICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZV9uYW1lID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5pZGVudGlmaWVyX3ZhbHVlKCk7CisgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gTlVMTDsKKworICAgICAgaWYgKGVudW1fdHlwZS0+ZmlsZSgpLT5wb29sKCkgIT0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpIHsKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBlbnVtIHZhbHVlJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUgaXMgYSBzaWJsaW5nIG9mIHRoZQorICAgICAgICAvLyBlbnVtJ3MgbmFtZSwgbm90IGEgY2hpbGQgb2YgaXQuCisgICAgICAgIHN0cmluZyBmdWxseV9xdWFsaWZpZWRfbmFtZSA9IGVudW1fdHlwZS0+ZnVsbF9uYW1lKCk7CisgICAgICAgIGZ1bGx5X3F1YWxpZmllZF9uYW1lLnJlc2l6ZShmdWxseV9xdWFsaWZpZWRfbmFtZS5zaXplKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV90eXBlLT5uYW1lKCkuc2l6ZSgpKTsKKyAgICAgICAgZnVsbHlfcXVhbGlmaWVkX25hbWUgKz0gdmFsdWVfbmFtZTsKKworICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBlbnVtIHZhbHVlJ3MgZGVzY3JpcHRvciBpbiB0aGUgYnVpbGRlcidzIHBvb2wuIE5vdGUKKyAgICAgICAgLy8gdGhhdCB3ZSB1c2UgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKCksIG5vdAorICAgICAgICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZEVudW1WYWx1ZUJ5TmFtZSgpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nCisgICAgICAgIC8vIHRoZSBwb29sJ3MgbXV0ZXgsIGFuZCB0aGUgbGF0dGVyIG1ldGhvZCBsb2NrcyBpdCBhZ2Fpbi4KKyAgICAgICAgU3ltYm9sIHN5bWJvbCA9CisgICAgICAgICAgYnVpbGRlcl8tPkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKGZ1bGx5X3F1YWxpZmllZF9uYW1lKTsKKyAgICAgICAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgPT0gU3ltYm9sOjpFTlVNX1ZBTFVFKSB7CisgICAgICAgICAgaWYgKHN5bWJvbC5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3ItPnR5cGUoKSAhPSBlbnVtX3R5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJFbnVtIHR5cGUgXCIiICsgZW51bV90eXBlLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIiIgKyB2YWx1ZV9uYW1lICsgIlwiIGZvciBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAiXCIuIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbHVlIGZyb20gYSBzaWJsaW5nIHR5cGUuIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudW1fdmFsdWUgPSBzeW1ib2wuZW51bV92YWx1ZV9kZXNjcmlwdG9yOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGVudW0gdHlwZSBpcyBpbiB0aGUgZ2VuZXJhdGVkIHBvb2wsIHNvIHdlIGNhbiBzZWFyY2ggZm9yIHRoZQorICAgICAgICAvLyB2YWx1ZSB0aGVyZS4KKyAgICAgICAgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+RmluZFZhbHVlQnlOYW1lKHZhbHVlX25hbWUpOworICAgICAgfQorCisgICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJFbnVtIHR5cGUgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiIiArIHZhbHVlX25hbWUgKyAiXCIgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiBcIiIgKyBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2lnbi1leHRlbnNpb24gaXMgbm90IGEgcHJvYmxlbSwgc2luY2Ugd2UgY2FzdCBkaXJlY3RseSBmcm9tIGludDMyIHRvCisgICAgICAgIC8vIHVpbnQ2NCwgd2l0aG91dCBmaXJzdCBnb2luZyB0aHJvdWdoIHVpbnQzMi4KKyAgICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oc3RhdGljX2Nhc3Q8aW50NjQ+KGVudW1fdmFsdWUtPm51bWJlcigpKSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgaWYgKCF1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19zdHJpbmdfdmFsdWUoKSkgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBxdW90ZWQgc3RyaW5nIGZvciBzdHJpbmcgb3B0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICAvLyBUaGUgc3RyaW5nIGhhcyBhbHJlYWR5IGJlZW4gdW5xdW90ZWQgYW5kIHVuZXNjYXBlZCBieSB0aGUgcGFyc2VyLgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+c3RyaW5nX3ZhbHVlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgaWYgKCFTZXRBZ2dyZWdhdGVPcHRpb24ob3B0aW9uX2ZpZWxkLCB1bmtub3duX2ZpZWxkcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpBZ2dyZWdhdGVPcHRpb25GaW5kZXIKKyAgICA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaW5kZXIgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXJfOworCisgIHZpcnR1YWwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgICAgYXNzZXJ0X211dGV4X2hlbGQoYnVpbGRlcl8tPnBvb2xfKTsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworICAgIFN5bWJvbCByZXN1bHQgPSBidWlsZGVyXy0+TG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcigKKyAgICAgICAgbmFtZSwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkpOworICAgIGlmIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6OkZJRUxEICYmCisgICAgICAgIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgeworICAgICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOworICAgIH0gZWxzZSBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpNRVNTQUdFICYmCisgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgY29uc3QgRGVzY3JpcHRvciogZm9yZWlnbl90eXBlID0gcmVzdWx0LmRlc2NyaXB0b3I7CisgICAgICAvLyBUaGUgdGV4dCBmb3JtYXQgYWxsb3dzIE1lc3NhZ2VTZXQgaXRlbXMgdG8gYmUgc3BlY2lmaWVkIHVzaW5nCisgICAgICAvLyB0aGUgdHlwZSBuYW1lLCByYXRoZXIgdGhhbiB0aGUgZXh0ZW5zaW9uIGlkZW50aWZpZXIuIElmIHRoZSBzeW1ib2wKKyAgICAgIC8vIGxvb2t1cCByZXR1cm5lZCBhIE1lc3NhZ2UsIGFuZCB0aGUgZW5jbG9zaW5nIE1lc3NhZ2UgaGFzCisgICAgICAvLyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWUsIHRoZW4gcmV0dXJuIHRoZSBtZXNzYWdlIHNldAorICAgICAgLy8gZXh0ZW5zaW9uLCBpZiBvbmUgZXhpc3RzLgorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JlaWduX3R5cGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPSBmb3JlaWduX3R5cGUtPmV4dGVuc2lvbihpKTsKKyAgICAgICAgaWYgKGV4dGVuc2lvbi0+Y29udGFpbmluZ190eXBlKCkgPT0gZGVzY3JpcHRvciAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfb3B0aW9uYWwoKSAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3R5cGUoKSA9PSBmb3JlaWduX3R5cGUpIHsKKyAgICAgICAgICAvLyBGb3VuZCBpdC4KKyAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9Cit9OworCisvLyBBIGN1c3RvbSBlcnJvciBjb2xsZWN0b3IgdG8gcmVjb3JkIGFueSB0ZXh0LWZvcm1hdCBwYXJzaW5nIGVycm9ycworbmFtZXNwYWNlIHsKK2NsYXNzIEFnZ3JlZ2F0ZUVycm9yQ29sbGVjdG9yIDogcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBzdHJpbmcgZXJyb3JfOworCisgIHZpcnR1YWwgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgaWYgKCFlcnJvcl8uZW1wdHkoKSkgeworICAgICAgZXJyb3JfICs9ICI7ICI7CisgICAgfQorICAgIGVycm9yXyArPSBtZXNzYWdlOworICB9CisKKyAgdmlydHVhbCB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIC8vIElnbm9yZSB3YXJuaW5ncworICB9Cit9OworfQorCisvLyBXZSBjb25zdHJ1Y3QgYSBkeW5hbWljIG1lc3NhZ2Ugb2YgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0bworLy8gb3B0aW9uX2ZpZWxkLCBwYXJzZSB0aGUgc3VwcGxpZWQgdGV4dC1mb3JtYXQgc3RyaW5nIGludG8gdGhpcworLy8gbWVzc2FnZSwgYW5kIHNlcmlhbGl6ZSB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgdG8gcHJvZHVjZSB0aGUgdmFsdWUuCitib29sIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6U2V0QWdncmVnYXRlT3B0aW9uKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3B0aW9uX2ZpZWxkLAorICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgaWYgKCF1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19hZ2dyZWdhdGVfdmFsdWUoKSkgeworICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJPcHRpb24gXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIGEgbWVzc2FnZS4gVG8gc2V0IHRoZSBlbnRpcmUgbWVzc2FnZSwgdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4IGxpa2UgXCIiICsgb3B0aW9uX2ZpZWxkLT5uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICIgPSB7IDxwcm90byB0ZXh0IGZvcm1hdD4gfVwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRvIHNldCBmaWVsZHMgd2l0aGluIGl0LCB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggbGlrZSBcIiIgKyBvcHRpb25fZmllbGQtPm5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIi5mb28gPSB2YWx1ZVwiLiIpOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IG9wdGlvbl9maWVsZC0+bWVzc2FnZV90eXBlKCk7CisgIHNjb3BlZF9wdHI8TWVzc2FnZT4gZHluYW1pYyhkeW5hbWljX2ZhY3RvcnlfLkdldFByb3RvdHlwZSh0eXBlKS0+TmV3KCkpOworICBHT09HTEVfQ0hFQ0soZHluYW1pYy5nZXQoKSAhPSBOVUxMKQorICAgICAgPDwgIkNvdWxkIG5vdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgIiA8PCBvcHRpb25fZmllbGQtPkRlYnVnU3RyaW5nKCk7CisKKyAgQWdncmVnYXRlRXJyb3JDb2xsZWN0b3IgY29sbGVjdG9yOworICBBZ2dyZWdhdGVPcHRpb25GaW5kZXIgZmluZGVyOworICBmaW5kZXIuYnVpbGRlcl8gPSBidWlsZGVyXzsKKyAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgcGFyc2VyLlJlY29yZEVycm9yc1RvKCZjb2xsZWN0b3IpOworICBwYXJzZXIuU2V0RmluZGVyKCZmaW5kZXIpOworICBpZiAoIXBhcnNlci5QYXJzZUZyb21TdHJpbmcodW5pbnRlcnByZXRlZF9vcHRpb25fLT5hZ2dyZWdhdGVfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMuZ2V0KCkpKSB7CisgICAgQWRkVmFsdWVFcnJvcigiRXJyb3Igd2hpbGUgcGFyc2luZyBvcHRpb24gdmFsdWUgZm9yIFwiIiArCisgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPm5hbWUoKSArICJcIjogIiArIGNvbGxlY3Rvci5lcnJvcl8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgc2VyaWFsOworICAgIGR5bmFtaWMtPlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWwpOyAgLy8gTmV2ZXIgZmFpbHMKKyAgICBpZiAob3B0aW9uX2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwgc2VyaWFsKTsKKyAgICB9IGVsc2UgeworICAgICAgR09PR0xFX0NIRUNLX0VRKG9wdGlvbl9maWVsZC0+dHlwZSgpLCAgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKTsKKyAgICAgIFVua25vd25GaWVsZFNldCogZ3JvdXAgPSB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSk7CisgICAgICBncm91cC0+UGFyc2VGcm9tU3RyaW5nKHNlcmlhbCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRJbnQzMihpbnQgbnVtYmVyLCBpbnQzMiB2YWx1ZSwKKyAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLAorICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjQ+KHN0YXRpY19jYXN0PGludDY0Pih2YWx1ZSkpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQzMihudW1iZXIsIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChudW1iZXIsCisgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpaaWdaYWdFbmNvZGUzMih2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkludmFsaWQgd2lyZSB0eXBlIGZvciBDUFBUWVBFX0lOVDMyOiAiIDw8IHR5cGU7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6U2V0SW50NjQoaW50IG51bWJlciwgaW50NjQgdmFsdWUsCisgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KG51bWJlciwgc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwKKyAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlppZ1phZ0VuY29kZTY0KHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfSU5UNjQ6ICIgPDwgdHlwZTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRVSW50MzIoaW50IG51bWJlciwgdWludDMyIHZhbHVlLAorICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlLCBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQzMihudW1iZXIsIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9VSU5UMzI6ICIgPDwgdHlwZTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRVSW50NjQoaW50IG51bWJlciwgdWludDY0IHZhbHVlLAorICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlLCBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQ6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQ2NChudW1iZXIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9VSU5UNjQ6ICIgPDwgdHlwZTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlM2FmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwxNTIxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3NlcyB3aGljaCBkZXNjcmliZSBhIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZS4KKy8vIFlvdSBjYW4gdXNlIGEgbWVzc2FnZSdzIGRlc2NyaXB0b3IgdG8gbGVhcm4gYXQgcnVudGltZSB3aGF0IGZpZWxkcworLy8gaXQgY29udGFpbnMgYW5kIHdoYXQgdGhlIHR5cGVzIG9mIHRob3NlIGZpZWxkcyBhcmUuICBUaGUgTWVzc2FnZQorLy8gaW50ZXJmYWNlIGFsc28gYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseSBhY2Nlc3MgYW5kIG1vZGlmeSBpbmRpdmlkdWFsCisvLyBmaWVsZHMgYnkgcGFzc2luZyB0aGUgRmllbGREZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCB5b3UgYXJlIGludGVyZXN0ZWQKKy8vIGluLgorLy8KKy8vIE1vc3QgdXNlcnMgd2lsbCBub3QgY2FyZSBhYm91dCBkZXNjcmlwdG9ycywgYmVjYXVzZSB0aGV5IHdpbGwgd3JpdGUKKy8vIGNvZGUgc3BlY2lmaWMgdG8gY2VydGFpbiBwcm90b2NvbCB0eXBlcyBhbmQgd2lsbCBzaW1wbHkgdXNlIHRoZSBjbGFzc2VzCisvLyBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyIGRpcmVjdGx5LiAgQWR2YW5jZWQgdXNlcnMgd2hvIHdhbnQKKy8vIHRvIG9wZXJhdGUgb24gYXJiaXRyYXJ5IHR5cGVzIChub3Qga25vd24gYXQgY29tcGlsZSB0aW1lKSBtYXkgd2FudCB0bworLy8gcmVhZCBkZXNjcmlwdG9ycyBpbiBvcmRlciB0byBsZWFybiBhYm91dCB0aGUgY29udGVudHMgb2YgYSBtZXNzYWdlLgorLy8gQSB2ZXJ5IHNtYWxsIG51bWJlciBvZiB1c2VycyB3aWxsIHdhbnQgdG8gY29uc3RydWN0IHRoZWlyIG93bgorLy8gRGVzY3JpcHRvcnMsIGVpdGhlciBiZWNhdXNlIHRoZXkgYXJlIGltcGxlbWVudGluZyBNZXNzYWdlIG1hbnVhbGx5IG9yCisvLyBiZWNhdXNlIHRoZXkgYXJlIHdyaXRpbmcgc29tZXRoaW5nIGxpa2UgdGhlIHByb3RvY29sIGNvbXBpbGVyLgorLy8KKy8vIEZvciBhbiBleGFtcGxlIG9mIGhvdyB5b3UgbWlnaHQgdXNlIGRlc2NyaXB0b3JzLCBzZWUgdGhlIGNvZGUgZXhhbXBsZQorLy8gYXQgdGhlIHRvcCBvZiBtZXNzYWdlLmguCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKy8vIFRZUEVfQk9PTCBpcyBkZWZpbmVkIGluIHRoZSBNYWNPUydzIENvbmRpdGlvbmFsTWFjcm9zLmguCisjaWZkZWYgVFlQRV9CT09MCisjdW5kZWYgVFlQRV9CT09MCisjZW5kaWYgIC8vIFRZUEVfQk9PTAorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKK2NsYXNzIEVudW1EZXNjcmlwdG9yOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlOworY2xhc3MgRGVzY3JpcHRvclBvb2w7CisKKy8vIERlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90bworY2xhc3MgRGVzY3JpcHRvclByb3RvOworY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG87CitjbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOworY2xhc3MgU2VydmljZURlc2NyaXB0b3JQcm90bzsKK2NsYXNzIE1ldGhvZERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBNZXNzYWdlT3B0aW9uczsKK2NsYXNzIEZpZWxkT3B0aW9uczsKK2NsYXNzIEVudW1PcHRpb25zOworY2xhc3MgRW51bVZhbHVlT3B0aW9uczsKK2NsYXNzIFNlcnZpY2VPcHRpb25zOworY2xhc3MgTWV0aG9kT3B0aW9uczsKK2NsYXNzIEZpbGVPcHRpb25zOworY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbjsKK2NsYXNzIFNvdXJjZUNvZGVJbmZvOworCisvLyBEZWZpbmVkIGluIG1lc3NhZ2UuaAorY2xhc3MgTWVzc2FnZTsKKworLy8gRGVmaW5lZCBpbiBkZXNjcmlwdG9yLmNjCitjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGVzOworCisvLyBEZWZpbmVkIGluIHVua25vd25fZmllbGRfc2V0LmguCitjbGFzcyBVbmtub3duRmllbGQ7CisKKy8vIE5CLCBhbGwgaW5kaWNlcyBhcmUgemVyby1iYXNlZC4KK3N0cnVjdCBTb3VyY2VMb2NhdGlvbiB7CisgIGludCBzdGFydF9saW5lOworICBpbnQgZW5kX2xpbmU7CisgIGludCBzdGFydF9jb2x1bW47CisgIGludCBlbmRfY29sdW1uOworCisgIC8vIERvYyBjb21tZW50cyBmb3VuZCBhdCB0aGUgc291cmNlIGxvY2F0aW9uLgorICAvLyBUT0RPKGtlbnRvbik6ICBNYXliZSB0aGlzIHN0cnVjdCBzaG91bGQgaGF2ZSBiZWVuIG5hbWVkIFNvdXJjZUluZm8gb3IKKyAgLy8gICBzb21ldGhpbmcgaW5zdGVhZC4gIE9oIHdlbGwuCisgIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzOworICBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHM7Cit9OworCisvLyBEZXNjcmliZXMgYSB0eXBlIG9mIHByb3RvY29sIG1lc3NhZ2UsIG9yIGEgcGFydGljdWxhciBncm91cCB3aXRoaW4gYQorLy8gbWVzc2FnZS4gIFRvIG9idGFpbiB0aGUgRGVzY3JpcHRvciBmb3IgYSBnaXZlbiBtZXNzYWdlIG9iamVjdCwgY2FsbAorLy8gTWVzc2FnZTo6R2V0RGVzY3JpcHRvcigpLiAgR2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3NlcyBhbHNvIGhhdmUgYQorLy8gc3RhdGljIG1ldGhvZCBjYWxsZWQgZGVzY3JpcHRvcigpIHdoaWNoIHJldHVybnMgdGhlIHR5cGUncyBkZXNjcmlwdG9yLgorLy8gVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdCB5b3VyIG93biBkZXNjcmlwdG9ycy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIHR5cGUsIG5vdCBpbmNsdWRpbmcgaXRzIHNjb3BlLgorICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsKKworICAvLyBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG1lc3NhZ2UgdHlwZSwgc2NvcGUgZGVsaW1pdGVkIGJ5CisgIC8vIHBlcmlvZHMuICBGb3IgZXhhbXBsZSwgbWVzc2FnZSB0eXBlICJGb28iIHdoaWNoIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UKKyAgLy8gImJhciIgaGFzIGZ1bGwgbmFtZSAiYmFyLkZvbyIuICBJZiBhIHR5cGUgIkJheiIgaXMgbmVzdGVkIHdpdGhpbgorICAvLyBGb28sIEJheidzIGZ1bGxfbmFtZSBpcyAiYmFyLkZvby5CYXoiLiAgVG8gZ2V0IG9ubHkgdGhlIHBhcnQgdGhhdAorICAvLyBjb21lcyBhZnRlciB0aGUgbGFzdCAnLicsIHVzZSBuYW1lKCkuCisgIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lKCkgY29uc3Q7CisKKyAgLy8gSW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiB0aGUgZmlsZSBvciBjb250YWluaW5nIHR5cGUncyBtZXNzYWdlCisgIC8vIHR5cGUgYXJyYXkuCisgIGludCBpbmRleCgpIGNvbnN0OworCisgIC8vIFRoZSAucHJvdG8gZmlsZSBpbiB3aGljaCB0aGlzIG1lc3NhZ2UgdHlwZSB3YXMgZGVmaW5lZC4gIE5ldmVyIE5VTEwuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7CisKKyAgLy8gSWYgdGhpcyBEZXNjcmlwdG9yIGRlc2NyaWJlcyBhIG5lc3RlZCB0eXBlLCB0aGlzIHJldHVybnMgdGhlIHR5cGUKKyAgLy8gaW4gd2hpY2ggaXQgaXMgbmVzdGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zIE5VTEwuCisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSgpIGNvbnN0OworCisgIC8vIEdldCBvcHRpb25zIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4gIFRoZXNlIGFyZSBzcGVjaWZpZWQgaW4gdGhlIC5wcm90byBmaWxlCisgIC8vIGJ5IHBsYWNpbmcgbGluZXMgbGlrZSAib3B0aW9uIGZvbyA9IDEyMzQ7IiBpbiB0aGUgbWVzc2FnZSBkZWZpbml0aW9uLgorICAvLyBBbGxvd2VkIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgTWVzc2FnZU9wdGlvbnMgaW4KKyAgLy8gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8sIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdAorICAvLyBtZXNzYWdlLgorICBjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIERlc2NyaXB0b3IgaW50byB0aGUgZ2l2ZW4gRGVzY3JpcHRvclByb3RvLgorICAvLyBUaGUgdGFyZ2V0IERlc2NyaXB0b3JQcm90byBtdXN0IGJlIGNsZWFyIGJlZm9yZSBjYWxsaW5nIHRoaXM7IGlmIGl0CisgIC8vIGlzbid0LCB0aGUgcmVzdWx0IG1heSBiZSBnYXJiYWdlLgorICB2b2lkIENvcHlUbyhEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKworICAvLyBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhpcyBkZWNyaXB0b3IgaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtLiBPdXRwdXQKKyAgLy8gd2lsbCBiZSBzdWl0YWJsZSBmb3IgcmUtcGFyc2luZy4KKyAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gRmllbGQgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUaGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4KKyAgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSBmaWVsZCBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IGZpZWxkX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSBmaWVsZCBieSBkZWNsYXJlZCB0YWcgbnVtYmVyLiAgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggZmllbGQKKyAgLy8gZXhpc3RzLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5TnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworICAvLyBMb29rcyB1cCBhIGZpZWxkIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBmaWVsZCBleGlzdHMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSBmaWVsZCBieSBsb3dlcmNhc2VkIG5hbWUgKGFzIHJldHVybmVkIGJ5IGxvd2VyY2FzZV9uYW1lKCkpLgorICAvLyBUaGlzIGxvb2t1cCBtYXkgYmUgYW1iaWd1b3VzIGlmIG11bHRpcGxlIGZpZWxkIG5hbWVzIGRpZmZlciBvbmx5IGJ5IGNhc2UsCisgIC8vIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkIHJldHVybmVkIGlzIGNob3NlbiBhcmJpdHJhcmlseSBmcm9tIHRoZSBtYXRjaGVzLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKKyAgICAgIGNvbnN0IHN0cmluZyYgbG93ZXJjYXNlX25hbWUpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGEgZmllbGQgYnkgY2FtZWwtY2FzZSBuYW1lIChhcyByZXR1cm5lZCBieSBjYW1lbGNhc2VfbmFtZSgpKS4KKyAgLy8gVGhpcyBsb29rdXAgbWF5IGJlIGFtYmlndW91cyBpZiBtdWx0aXBsZSBmaWVsZCBuYW1lcyBkaWZmZXIgaW4gYSB3YXkgdGhhdAorICAvLyBsZWFkcyB0aGVtIHRvIGhhdmUgaWRlbnRpY2FsIGNhbWVsLWNhc2UgbmFtZXMsIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkCisgIC8vIHJldHVybmVkIGlzIGNob3NlbiBhcmJpdHJhcmlseSBmcm9tIHRoZSBtYXRjaGVzLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgKKyAgICAgIGNvbnN0IHN0cmluZyYgY2FtZWxjYXNlX25hbWUpIGNvbnN0OworCisgIC8vIE5lc3RlZCB0eXBlIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVGhlIG51bWJlciBvZiBuZXN0ZWQgdHlwZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCBuZXN0ZWRfdHlwZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGEgbmVzdGVkIHR5cGUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCBuZXN0ZWRfdHlwZV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRGVzY3JpcHRvciogbmVzdGVkX3R5cGUoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhIG5lc3RlZCB0eXBlIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBuZXN0ZWQgdHlwZQorICAvLyBleGlzdHMuCisgIGNvbnN0IERlc2NyaXB0b3IqIEZpbmROZXN0ZWRUeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisKKyAgLy8gRW51bSBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUaGUgbnVtYmVyIG9mIGVudW0gdHlwZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCBlbnVtX3R5cGVfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhbiBlbnVtIHR5cGUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCBlbnVtX3R5cGVfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhbiBlbnVtIHR5cGUgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIGVudW0gdHlwZSBleGlzdHMuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhbiBlbnVtIHZhbHVlIGJ5IG5hbWUsIGFtb25nIGFsbCBlbnVtIHR5cGVzIGluIHRoaXMgbWVzc2FnZS4KKyAgLy8gUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggdmFsdWUgZXhpc3RzLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisKKyAgLy8gRXh0ZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBBIHJhbmdlIG9mIGZpZWxkIG51bWJlcnMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgZm9yIHRoaXJkLXBhcnR5CisgIC8vIGV4dGVuc2lvbnMuCisgIHN0cnVjdCBFeHRlbnNpb25SYW5nZSB7CisgICAgaW50IHN0YXJ0OyAgLy8gaW5jbHVzaXZlCisgICAgaW50IGVuZDsgICAgLy8gZXhjbHVzaXZlCisgIH07CisKKyAgLy8gVGhlIG51bWJlciBvZiBleHRlbnNpb24gcmFuZ2VzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYW4gZXh0ZW5zaW9uIHJhbmdlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwKKyAgLy8gZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQKKyAgLy8gaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBFeHRlbnNpb25SYW5nZSogZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgaXMgaW4gb25lIG9mIHRoZSBleHRlbnNpb24gcmFuZ2VzLgorICBib29sIElzRXh0ZW5zaW9uTnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIFRoZSBudW1iZXIgb2YgZXh0ZW5zaW9ucyAtLSBleHRlbmRpbmcgKm90aGVyKiBtZXNzYWdlcyAtLSB0aGF0IHdlcmUKKyAgLy8gZGVmaW5lZCBuZXN0ZWQgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgc2NvcGUuCisgIGludCBleHRlbnNpb25fY291bnQoKSBjb25zdDsKKyAgLy8gR2V0IGFuIGV4dGVuc2lvbiBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IGV4dGVuc2lvbl9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhIG5hbWVkIGV4dGVuc2lvbiAod2hpY2ggZXh0ZW5kcyBzb21lICpvdGhlciogbWVzc2FnZSB0eXBlKQorICAvLyBkZWZpbmVkIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBTaW1pbGFyIHRvIEZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgpLCBidXQgZmluZHMgZXh0ZW5zaW9ucyBkZWZpbmVkIHdpdGhpbgorICAvLyB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBTaW1pbGFyIHRvIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgpLCBidXQgZmluZHMgZXh0ZW5zaW9ucyBkZWZpbmVkIHdpdGhpbgorICAvLyB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgbWVzc2FnZSBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcworICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KKyAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgTWVzc2FnZU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gSW50ZXJuYWwgdmVyc2lvbiBvZiBEZWJ1Z1N0cmluZzsgY29udHJvbHMgdGhlIGxldmVsIG9mIGluZGVudGluZyBmb3IKKyAgLy8gY29ycmVjdCBkZXB0aAorICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cykgY29uc3Q7CisKKyAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKKyAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KKyAgdm9pZCBHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CisKKyAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZV87CisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBvcHRpb25zXzsKKworICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgYW4gdW5rbm93biB0eXBlLgorICBib29sIGlzX3BsYWNlaG9sZGVyXzsKKyAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgYW5kIHRoZSB0eXBlIG5hbWUgd2Fzbid0IGZ1bGx5LXF1YWxpZmllZC4KKyAgYm9vbCBpc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl87CisKKyAgaW50IGZpZWxkX2NvdW50XzsKKyAgRmllbGREZXNjcmlwdG9yKiBmaWVsZHNfOworICBpbnQgbmVzdGVkX3R5cGVfY291bnRfOworICBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZXNfOworICBpbnQgZW51bV90eXBlX2NvdW50XzsKKyAgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZXNfOworICBpbnQgZXh0ZW5zaW9uX3JhbmdlX2NvdW50XzsKKyAgRXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZXNfOworICBpbnQgZXh0ZW5zaW9uX2NvdW50XzsKKyAgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb25zXzsKKyAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcworICAvLyBvZiBBbGxvY2F0ZTxEZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PERlc2NyaXB0b3I+KCkgaW4gZGVzY3JpcHRvci5jYworICAvLyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisKKyAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KKyAgRGVzY3JpcHRvcigpIHt9CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIEVudW1EZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JpcHRvcik7Cit9OworCisvLyBEZXNjcmliZXMgYSBzaW5nbGUgZmllbGQgb2YgYSBtZXNzYWdlLiAgVG8gZ2V0IHRoZSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuCisvLyBmaWVsZCwgZmlyc3QgZ2V0IHRoZSBEZXNjcmlwdG9yIGZvciB0aGUgbWVzc2FnZSBpbiB3aGljaCBpdCBpcyBkZWZpbmVkLAorLy8gdGhlbiBjYWxsIERlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TmFtZSgpLiAgVG8gZ2V0IGEgRmllbGREZXNjcmlwdG9yIGZvcgorLy8gYW4gZXh0ZW5zaW9uLCBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKy8vIC0gR2V0IHRoZSBEZXNjcmlwdG9yIG9yIEZpbGVEZXNjcmlwdG9yIGZvciBpdHMgY29udGFpbmluZyBzY29wZSwgdGhlbgorLy8gICBjYWxsIERlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeU5hbWUoKSBvcgorLy8gICBGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpLgorLy8gLSBHaXZlbiBhIERlc2NyaXB0b3JQb29sLCBjYWxsIERlc2NyaXB0b3JQb29sOjpGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoKS4KKy8vIC0gR2l2ZW4gYSBSZWZsZWN0aW9uIGZvciBhIG1lc3NhZ2Ugb2JqZWN0LCBjYWxsCisvLyAgIFJlZmxlY3Rpb246OkZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSgpIG9yCisvLyAgIFJlZmxlY3Rpb246OkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKCkuCisvLyBVc2UgRGVzY3JpcHRvclBvb2wgdG8gY29uc3RydWN0IHlvdXIgb3duIGRlc2NyaXB0b3JzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpZWxkRGVzY3JpcHRvciB7CisgcHVibGljOgorICAvLyBJZGVudGlmaWVzIGEgZmllbGQgdHlwZS4gIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy4gIFRoZSBvcmRlciBpcyB3ZWlyZAorICAvLyBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiAgVHlwZXMgMTIgYW5kIHVwIGFyZSBuZXcgaW4gcHJvdG8yLgorICBlbnVtIFR5cGUgeworICAgIFRZUEVfRE9VQkxFICAgICAgICAgPSAxLCAgIC8vIGRvdWJsZSwgZXhhY3RseSBlaWdodCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICBUWVBFX0ZMT0FUICAgICAgICAgID0gMiwgICAvLyBmbG9hdCwgZXhhY3RseSBmb3VyIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIFRZUEVfSU5UNjQgICAgICAgICAgPSAzLCAgIC8vIGludDY0LCB2YXJpbnQgb24gdGhlIHdpcmUuICBOZWdhdGl2ZSBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQ2NCBpZiBuZWdhdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgbGlrZWx5LgorICAgIFRZUEVfVUlOVDY0ICAgICAgICAgPSA0LCAgIC8vIHVpbnQ2NCwgdmFyaW50IG9uIHRoZSB3aXJlLgorICAgIFRZUEVfSU5UMzIgICAgICAgICAgPSA1LCAgIC8vIGludDMyLCB2YXJpbnQgb24gdGhlIHdpcmUuICBOZWdhdGl2ZSBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQzMiBpZiBuZWdhdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgbGlrZWx5LgorICAgIFRZUEVfRklYRUQ2NCAgICAgICAgPSA2LCAgIC8vIHVpbnQ2NCwgZXhhY3RseSBlaWdodCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICBUWVBFX0ZJWEVEMzIgICAgICAgID0gNywgICAvLyB1aW50MzIsIGV4YWN0bHkgZm91ciBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICBUWVBFX0JPT0wgICAgICAgICAgID0gOCwgICAvLyBib29sLCB2YXJpbnQgb24gdGhlIHdpcmUuCisgICAgVFlQRV9TVFJJTkcgICAgICAgICA9IDksICAgLy8gVVRGLTggdGV4dC4KKyAgICBUWVBFX0dST1VQICAgICAgICAgID0gMTAsICAvLyBUYWctZGVsaW1pdGVkIG1lc3NhZ2UuICBEZXByZWNhdGVkLgorICAgIFRZUEVfTUVTU0FHRSAgICAgICAgPSAxMSwgIC8vIExlbmd0aC1kZWxpbWl0ZWQgbWVzc2FnZS4KKworICAgIFRZUEVfQllURVMgICAgICAgICAgPSAxMiwgIC8vIEFyYml0cmFyeSBieXRlIGFycmF5LgorICAgIFRZUEVfVUlOVDMyICAgICAgICAgPSAxMywgIC8vIHVpbnQzMiwgdmFyaW50IG9uIHRoZSB3aXJlCisgICAgVFlQRV9FTlVNICAgICAgICAgICA9IDE0LCAgLy8gRW51bSwgdmFyaW50IG9uIHRoZSB3aXJlCisgICAgVFlQRV9TRklYRUQzMiAgICAgICA9IDE1LCAgLy8gaW50MzIsIGV4YWN0bHkgZm91ciBieXRlcyBvbiB0aGUgd2lyZQorICAgIFRZUEVfU0ZJWEVENjQgICAgICAgPSAxNiwgIC8vIGludDY0LCBleGFjdGx5IGVpZ2h0IGJ5dGVzIG9uIHRoZSB3aXJlCisgICAgVFlQRV9TSU5UMzIgICAgICAgICA9IDE3LCAgLy8gaW50MzIsIFppZ1phZy1lbmNvZGVkIHZhcmludCBvbiB0aGUgd2lyZQorICAgIFRZUEVfU0lOVDY0ICAgICAgICAgPSAxOCwgIC8vIGludDY0LCBaaWdaYWctZW5jb2RlZCB2YXJpbnQgb24gdGhlIHdpcmUKKworICAgIE1BWF9UWVBFICAgICAgICAgICAgPSAxOCwgIC8vIENvbnN0YW50IHVzZWZ1bCBmb3IgZGVmaW5pbmcgbG9va3VwIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZWQgYnkgVHlwZS4KKyAgfTsKKworICAvLyBTcGVjaWZpZXMgdGhlIEMrKyBkYXRhIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlIGZpZWxkLiAgVGhlcmUgaXMgYQorICAvLyBmaXhlZCBtYXBwaW5nIGZyb20gVHlwZSB0byBDcHBUeXBlIHdoZXJlIGVhY2ggVHlwZSBtYXBzIHRvIGV4YWN0bHkgb25lCisgIC8vIENwcFR5cGUuICAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuCisgIGVudW0gQ3BwVHlwZSB7CisgICAgQ1BQVFlQRV9JTlQzMiAgICAgICA9IDEsICAgICAvLyBUWVBFX0lOVDMyLCBUWVBFX1NJTlQzMiwgVFlQRV9TRklYRUQzMgorICAgIENQUFRZUEVfSU5UNjQgICAgICAgPSAyLCAgICAgLy8gVFlQRV9JTlQ2NCwgVFlQRV9TSU5UNjQsIFRZUEVfU0ZJWEVENjQKKyAgICBDUFBUWVBFX1VJTlQzMiAgICAgID0gMywgICAgIC8vIFRZUEVfVUlOVDMyLCBUWVBFX0ZJWEVEMzIKKyAgICBDUFBUWVBFX1VJTlQ2NCAgICAgID0gNCwgICAgIC8vIFRZUEVfVUlOVDY0LCBUWVBFX0ZJWEVENjQKKyAgICBDUFBUWVBFX0RPVUJMRSAgICAgID0gNSwgICAgIC8vIFRZUEVfRE9VQkxFCisgICAgQ1BQVFlQRV9GTE9BVCAgICAgICA9IDYsICAgICAvLyBUWVBFX0ZMT0FUCisgICAgQ1BQVFlQRV9CT09MICAgICAgICA9IDcsICAgICAvLyBUWVBFX0JPT0wKKyAgICBDUFBUWVBFX0VOVU0gICAgICAgID0gOCwgICAgIC8vIFRZUEVfRU5VTQorICAgIENQUFRZUEVfU1RSSU5HICAgICAgPSA5LCAgICAgLy8gVFlQRV9TVFJJTkcsIFRZUEVfQllURVMKKyAgICBDUFBUWVBFX01FU1NBR0UgICAgID0gMTAsICAgIC8vIFRZUEVfTUVTU0FHRSwgVFlQRV9HUk9VUAorCisgICAgTUFYX0NQUFRZUEUgICAgICAgICA9IDEwLCAgICAvLyBDb25zdGFudCB1c2VmdWwgZm9yIGRlZmluaW5nIGxvb2t1cCB0YWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZWQgYnkgQ3BwVHlwZS4KKyAgfTsKKworICAvLyBJZGVudGlmaWVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgcmVwZWF0ZWQuICAwIGlzCisgIC8vIHJlc2VydmVkIGZvciBlcnJvcnMuCisgIGVudW0gTGFiZWwgeworICAgIExBQkVMX09QVElPTkFMICAgICAgPSAxLCAgICAvLyBvcHRpb25hbAorICAgIExBQkVMX1JFUVVJUkVEICAgICAgPSAyLCAgICAvLyByZXF1aXJlZAorICAgIExBQkVMX1JFUEVBVEVEICAgICAgPSAzLCAgICAvLyByZXBlYXRlZAorCisgICAgTUFYX0xBQkVMICAgICAgICAgICA9IDMsICAgIC8vIENvbnN0YW50IHVzZWZ1bCBmb3IgZGVmaW5pbmcgbG9va3VwIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleGVkIGJ5IExhYmVsLgorICB9OworCisgIC8vIFZhbGlkIGZpZWxkIG51bWJlcnMgYXJlIHBvc2l0aXZlIGludGVnZXJzIHVwIHRvIGtNYXhOdW1iZXIuCisgIHN0YXRpYyBjb25zdCBpbnQga01heE51bWJlciA9ICgxIDw8IDI5KSAtIDE7CisKKyAgLy8gRmlyc3QgZmllbGQgbnVtYmVyIHJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uCisgIC8vIFVzZXJzIG1heSBub3QgZGVjbGFyZSBmaWVsZHMgdGhhdCB1c2UgcmVzZXJ2ZWQgbnVtYmVycy4KKyAgc3RhdGljIGNvbnN0IGludCBrRmlyc3RSZXNlcnZlZE51bWJlciA9IDE5MDAwOworICAvLyBMYXN0IGZpZWxkIG51bWJlciByZXNlcnZlZCBmb3IgdGhlIHByb3RvY29sIGJ1ZmZlciBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLgorICAvLyBVc2VycyBtYXkgbm90IGRlY2xhcmUgZmllbGRzIHRoYXQgdXNlIHJlc2VydmVkIG51bWJlcnMuCisgIHN0YXRpYyBjb25zdCBpbnQga0xhc3RSZXNlcnZlZE51bWJlciAgPSAxOTk5OTsKKworICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsgICAgICAgIC8vIE5hbWUgb2YgdGhpcyBmaWVsZCB3aXRoaW4gdGhlIG1lc3NhZ2UuCisgIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lKCkgY29uc3Q7ICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpZWxkLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSgpIGNvbnN0Oy8vIEZpbGUgaW4gd2hpY2ggdGhpcyBmaWVsZCB3YXMgZGVmaW5lZC4KKyAgYm9vbCBpc19leHRlbnNpb24oKSBjb25zdDsgICAgICAgICAvLyBJcyB0aGlzIGFuIGV4dGVuc2lvbiBmaWVsZD8KKyAgaW50IG51bWJlcigpIGNvbnN0OyAgICAgICAgICAgICAgICAvLyBEZWNsYXJlZCB0YWcgbnVtYmVyLgorCisgIC8vIFNhbWUgYXMgbmFtZSgpIGV4Y2VwdCBjb252ZXJ0ZWQgdG8gbG93ZXItY2FzZS4gIFRoaXMgKGFuZCBlc3BlY2lhbGx5IHRoZQorICAvLyBGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoKSBtZXRob2QpIGNhbiBiZSB1c2VmdWwgd2hlbiBwYXJzaW5nIGZvcm1hdHMKKyAgLy8gd2hpY2ggcHJlZmVyIHRvIHVzZSBsb3dlcmNhc2UgbmFtaW5nIHN0eWxlLiAgKEFsdGhvdWdoLCB0ZWNobmljYWxseQorICAvLyBmaWVsZCBuYW1lcyBzaG91bGQgYmUgbG93ZXJjYXNlZCBhbnl3YXkgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2J1ZiBzdHlsZQorICAvLyBndWlkZSwgc28gdGhpcyBvbmx5IG1ha2VzIGEgZGlmZmVyZW5jZSB3aGVuIGRlYWxpbmcgd2l0aCBvbGQgLnByb3RvIGZpbGVzCisgIC8vIHdoaWNoIGRvIG5vdCBmb2xsb3cgdGhlIGd1aWRlLikKKyAgY29uc3Qgc3RyaW5nJiBsb3dlcmNhc2VfbmFtZSgpIGNvbnN0OworCisgIC8vIFNhbWUgYXMgbmFtZSgpIGV4Y2VwdCBjb252ZXJ0ZWQgdG8gY2FtZWwtY2FzZS4gIEluIHRoaXMgY29udmVyc2lvbiwgYW55CisgIC8vIHRpbWUgYW4gdW5kZXJzY29yZSBhcHBlYXJzIGluIHRoZSBuYW1lLCBpdCBpcyByZW1vdmVkIGFuZCB0aGUgbmV4dAorICAvLyBsZXR0ZXIgaXMgY2FwaXRhbGl6ZWQuICBGdXJ0aGVybW9yZSwgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgbmFtZSBpcworICAvLyBsb3dlci1jYXNlZC4gIEV4YW1wbGVzOgorICAvLyAgIEZvb0JhciAtPiBmb29CYXIKKyAgLy8gICBmb29fYmFyIC0+IGZvb0JhcgorICAvLyAgIGZvb0JhciAtPiBmb29CYXIKKyAgLy8gVGhpcyAoYW5kIGVzcGVjaWFsbHkgdGhlIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgpIG1ldGhvZCkgY2FuIGJlIHVzZWZ1bAorICAvLyB3aGVuIHBhcnNpbmcgZm9ybWF0cyB3aGljaCBwcmVmZXIgdG8gdXNlIGNhbWVsLWNhc2UgbmFtaW5nIHN0eWxlLgorICBjb25zdCBzdHJpbmcmIGNhbWVsY2FzZV9uYW1lKCkgY29uc3Q7CisKKyAgVHlwZSB0eXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgLy8gRGVjbGFyZWQgdHlwZSBvZiB0aGlzIGZpZWxkLgorICBjb25zdCBjaGFyKiB0eXBlX25hbWUoKSBjb25zdDsgICAgICAvLyBOYW1lIG9mIHRoZSBkZWNsYXJlZCB0eXBlLgorICBDcHBUeXBlIGNwcF90eXBlKCkgY29uc3Q7ICAgICAgICAgICAvLyBDKysgdHlwZSBvZiB0aGlzIGZpZWxkLgorICBjb25zdCBjaGFyKiBjcHBfdHlwZV9uYW1lKCkgY29uc3Q7ICAvLyBOYW1lIG9mIHRoZSBDKysgdHlwZS4KKyAgTGFiZWwgbGFiZWwoKSBjb25zdDsgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwvcmVxdWlyZWQvcmVwZWF0ZWQKKworICBib29sIGlzX3JlcXVpcmVkKCkgY29uc3Q7ICAgICAgLy8gc2hvcnRoYW5kIGZvciBsYWJlbCgpID09IExBQkVMX1JFUVVJUkVECisgIGJvb2wgaXNfb3B0aW9uYWwoKSBjb25zdDsgICAgICAvLyBzaG9ydGhhbmQgZm9yIGxhYmVsKCkgPT0gTEFCRUxfT1BUSU9OQUwKKyAgYm9vbCBpc19yZXBlYXRlZCgpIGNvbnN0OyAgICAgIC8vIHNob3J0aGFuZCBmb3IgbGFiZWwoKSA9PSBMQUJFTF9SRVBFQVRFRAorICBib29sIGlzX3BhY2thYmxlKCkgY29uc3Q7ICAgICAgLy8gc2hvcnRoYW5kIGZvciBpc19yZXBlYXRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIElzVHlwZVBhY2thYmxlKHR5cGUoKSkKKyAgYm9vbCBpc19wYWNrZWQoKSBjb25zdDsgICAgICAgIC8vIHNob3J0aGFuZCBmb3IgaXNfcGFja2FibGUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBvcHRpb25zKCkucGFja2VkKCkKKworICAvLyBJbmRleCBvZiB0aGlzIGZpZWxkIHdpdGhpbiB0aGUgbWVzc2FnZSdzIGZpZWxkIGFycmF5LCBvciB0aGUgZmlsZSBvcgorICAvLyBleHRlbnNpb24gc2NvcGUncyBleHRlbnNpb25zIGFycmF5LgorICBpbnQgaW5kZXgoKSBjb25zdDsKKworICAvLyBEb2VzIHRoaXMgZmllbGQgaGF2ZSBhbiBleHBsaWNpdGx5LWRlY2xhcmVkIGRlZmF1bHQgdmFsdWU/CisgIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUoKSBjb25zdDsKKworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0lOVDMyLiAgSWYgbm8KKyAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4KKyAgaW50MzIgZGVmYXVsdF92YWx1ZV9pbnQzMigpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0lOVDY0LiAgSWYgbm8KKyAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4KKyAgaW50NjQgZGVmYXVsdF92YWx1ZV9pbnQ2NCgpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX1VJTlQzMi4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCisgIHVpbnQzMiBkZWZhdWx0X3ZhbHVlX3VpbnQzMigpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX1VJTlQ2NC4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCisgIHVpbnQ2NCBkZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0ZMT0FULiAgSWYgbm8KKyAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4wLgorICBmbG9hdCBkZWZhdWx0X3ZhbHVlX2Zsb2F0KCkgY29uc3Q7CisgIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfRE9VQkxFLiAgSWYgbm8KKyAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4wLgorICBkb3VibGUgZGVmYXVsdF92YWx1ZV9kb3VibGUoKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9CT09MLiAgSWYgbm8KKyAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgIGJvb2wgZGVmYXVsdF92YWx1ZV9ib29sKCkgY29uc3Q7CisgIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfRU5VTS4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIHRoZSBmaXJzdCB2YWx1ZSBkZWZpbmVkCisgIC8vIGluIHRoZSBlbnVtIHR5cGUgKGFsbCBlbnVtIHR5cGVzIGFyZSByZXF1aXJlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZSkuCisgIC8vIFRoaXMgbmV2ZXIgcmV0dXJucyBOVUxMLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZWZhdWx0X3ZhbHVlX2VudW0oKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9TVFJJTkcuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyB0aGUgZW1wdHkgc3RyaW5nLgorICBjb25zdCBzdHJpbmcmIGRlZmF1bHRfdmFsdWVfc3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gVGhlIERlc2NyaXB0b3IgZm9yIHRoZSBtZXNzYWdlIG9mIHdoaWNoIHRoaXMgaXMgYSBmaWVsZC4gIEZvciBleHRlbnNpb25zLAorICAvLyB0aGlzIGlzIHRoZSBleHRlbmRlZCB0eXBlLiAgTmV2ZXIgTlVMTC4KKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7CisKKyAgLy8gQW4gZXh0ZW5zaW9uIG1heSBiZSBkZWNsYXJlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFub3RoZXIgbWVzc2FnZS4gIElmIHRoaXMKKyAgLy8gZmllbGQgaXMgYW4gZXh0ZW5zaW9uIChpc19leHRlbnNpb24oKSBpcyB0cnVlKSwgdGhlbiBleHRlbnNpb25fc2NvcGUoKQorICAvLyByZXR1cm5zIHRoYXQgbWVzc2FnZSwgb3IgTlVMTCBpZiB0aGUgZXh0ZW5zaW9uIHdhcyBkZWNsYXJlZCBhdCBnbG9iYWwKKyAgLy8gc2NvcGUuICBJZiB0aGlzIGlzIG5vdCBhbiBleHRlbnNpb24sIGV4dGVuc2lvbl9zY29wZSgpIGlzIHVuZGVmaW5lZCAobWF5CisgIC8vIGFzc2VydC1mYWlsKS4KKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5zaW9uX3Njb3BlKCkgY29uc3Q7CisKKyAgLy8gSWYgdHlwZSBpcyBUWVBFX01FU1NBR0Ugb3IgVFlQRV9HUk9VUCwgcmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZQorICAvLyBtZXNzYWdlIG9yIHRoZSBncm91cCB0eXBlLiAgT3RoZXJ3aXNlLCB1bmRlZmluZWQuCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSgpIGNvbnN0OworICAvLyBJZiB0eXBlIGlzIFRZUEVfRU5VTSwgcmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBlbnVtLiAgT3RoZXJ3aXNlLAorICAvLyB1bmRlZmluZWQuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUoKSBjb25zdDsKKworICAvLyBFWFBFUklNRU5UQUw7IERPIE5PVCBVU0UuCisgIC8vIElmIHRoaXMgZmllbGQgaXMgYSBtYXAgZmllbGQsIGV4cGVyaW1lbnRhbF9tYXBfa2V5KCkgaXMgdGhlIGZpZWxkCisgIC8vIHRoYXQgaXMgdGhlIGtleSBmb3IgdGhpcyBtYXAuCisgIC8vIGV4cGVyaW1lbnRhbF9tYXBfa2V5KCktPmNvbnRhaW5pbmdfdHlwZSgpIGlzIHRoZSBzYW1lIGFzIG1lc3NhZ2VfdHlwZSgpLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3Q7CisKKyAgLy8gR2V0IHRoZSBGaWVsZE9wdGlvbnMgZm9yIHRoaXMgZmllbGQuICBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaXN0ZWQgaW4KKyAgLy8gc3F1YXJlIGJyYWNrZXRzIGFmdGVyIHRoZSBmaWVsZCBkZWZpbml0aW9uLiAgRS5nLiwgdGhlIGZpZWxkOgorICAvLyAgIG9wdGlvbmFsIHN0cmluZyB0ZXh0ID0gMSBbY3R5cGU9Q09SRF07CisgIC8vIGhhcyB0aGUgImN0eXBlIiBvcHRpb24gc2V0LiAgQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IEZpZWxkT3B0aW9ucworICAvLyBpbiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0CisgIC8vIG1lc3NhZ2UuCisgIGNvbnN0IEZpZWxkT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KKyAgdm9pZCBDb3B5VG8oRmllbGREZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIENwcFR5cGUgZm9yIGEgcGFydGljdWxhciBUeXBlLgorICBzdGF0aWMgQ3BwVHlwZSBUeXBlVG9DcHBUeXBlKFR5cGUgdHlwZSk7CisKKyAgLy8gUmV0dXJuIHRydWUgaWZmIFtwYWNrZWQgPSB0cnVlXSBpcyB2YWxpZCBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KKyAgc3RhdGljIGlubGluZSBib29sIElzVHlwZVBhY2thYmxlKFR5cGUgZmllbGRfdHlwZSk7CisKKyAgLy8gU291cmNlIExvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFVwZGF0ZXMgfCpvdXRfbG9jYXRpb258IHRvIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGNvbXBsZXRlCisgIC8vIGV4dGVudCBvZiB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBGaWVsZE9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKworICAvLyBmb3JtYXRzIHRoZSBkZWZhdWx0IHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHJldHVybnMgaXQgYXMgYSBzdHJpbmcuCisgIC8vIE11c3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgdG8gY2FsbCB0aGlzLiBJZiBxdW90ZV9zdHJpbmdfdHlwZSBpcyB0cnVlLCB0aGVuCisgIC8vIHR5cGVzIG9mIENQUFRZUEVfU1RSSU5HIHdoaWxsIGJlIHN1cnJvdW5kZWQgYnkgcXVvdGVzIGFuZCBDRXNjYXBlZC4KKyAgc3RyaW5nIERlZmF1bHRWYWx1ZUFzU3RyaW5nKGJvb2wgcXVvdGVfc3RyaW5nX3R5cGUpIGNvbnN0OworCisgIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCisgIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCisgIHZvaWQgR2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OworCisgIGNvbnN0IHN0cmluZyogbmFtZV87CisgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBsb3dlcmNhc2VfbmFtZV87CisgIGNvbnN0IHN0cmluZyogY2FtZWxjYXNlX25hbWVfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGludCBudW1iZXJfOworICBUeXBlIHR5cGVfOworICBMYWJlbCBsYWJlbF87CisgIGJvb2wgaXNfZXh0ZW5zaW9uXzsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5zaW9uX3Njb3BlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXhwZXJpbWVudGFsX21hcF9rZXlfOworICBjb25zdCBGaWVsZE9wdGlvbnMqIG9wdGlvbnNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPEZpZWxkRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxGaWVsZERlc2NyaXB0b3I+KCkgaW4KKyAgLy8gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisKKyAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZV87CisgIHVuaW9uIHsKKyAgICBpbnQzMiAgZGVmYXVsdF92YWx1ZV9pbnQzMl87CisgICAgaW50NjQgIGRlZmF1bHRfdmFsdWVfaW50NjRfOworICAgIHVpbnQzMiBkZWZhdWx0X3ZhbHVlX3VpbnQzMl87CisgICAgdWludDY0IGRlZmF1bHRfdmFsdWVfdWludDY0XzsKKyAgICBmbG9hdCAgZGVmYXVsdF92YWx1ZV9mbG9hdF87CisgICAgZG91YmxlIGRlZmF1bHRfdmFsdWVfZG91YmxlXzsKKyAgICBib29sICAgZGVmYXVsdF92YWx1ZV9ib29sXzsKKworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlZmF1bHRfdmFsdWVfZW51bV87CisgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3ZhbHVlX3N0cmluZ187CisgIH07CisKKyAgc3RhdGljIGNvbnN0IENwcFR5cGUga1R5cGVUb0NwcFR5cGVNYXBbTUFYX1RZUEUgKyAxXTsKKworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtUeXBlVG9OYW1lW01BWF9UWVBFICsgMV07CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrQ3BwVHlwZVRvTmFtZVtNQVhfQ1BQVFlQRSArIDFdOworCisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0xhYmVsVG9OYW1lW01BWF9MQUJFTCArIDFdOworCisgIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCisgIEZpZWxkRGVzY3JpcHRvcigpIHt9CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkRGVzY3JpcHRvcik7Cit9OworCisvLyBEZXNjcmliZXMgYW4gZW51bSB0eXBlIGRlZmluZWQgaW4gYSAucHJvdG8gZmlsZS4gIFRvIGdldCB0aGUgRW51bURlc2NyaXB0b3IKKy8vIGZvciBhIGdlbmVyYXRlZCBlbnVtIHR5cGUsIGNhbGwgVHlwZU5hbWVfZGVzY3JpcHRvcigpLiAgVXNlIERlc2NyaXB0b3JQb29sCisvLyB0byBjb25zdHJ1Y3QgeW91ciBvd24gZGVzY3JpcHRvcnMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bURlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgLy8gVGhlIG5hbWUgb2YgdGhpcyBlbnVtIHR5cGUgaW4gdGhlIGNvbnRhaW5pbmcgc2NvcGUuCisgIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OworCisgIC8vIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW51bSB0eXBlLCBzY29wZSBkZWxpbWl0ZWQgYnkgcGVyaW9kcy4KKyAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKKworICAvLyBJbmRleCBvZiB0aGlzIGVudW0gd2l0aGluIHRoZSBmaWxlIG9yIGNvbnRhaW5pbmcgbWVzc2FnZSdzIGVudW0gYXJyYXkuCisgIGludCBpbmRleCgpIGNvbnN0OworCisgIC8vIFRoZSAucHJvdG8gZmlsZSBpbiB3aGljaCB0aGlzIGVudW0gdHlwZSB3YXMgZGVmaW5lZC4gIE5ldmVyIE5VTEwuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgZm9yIHRoaXMgRW51bURlc2NyaXB0b3IuICBHdWFyYW50ZWVkIHRvIGJlIGdyZWF0ZXIKKyAgLy8gdGhhbiB6ZXJvLgorICBpbnQgdmFsdWVfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHZhbHVlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgdmFsdWVfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSB2YWx1ZSBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggdmFsdWUgZXhpc3RzLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kVmFsdWVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgLy8gTG9va3MgdXAgYSB2YWx1ZSBieSBudW1iZXIuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMuICBJZgorICAvLyBtdWx0aXBsZSB2YWx1ZXMgaGF2ZSB0aGlzIG51bWJlciwgdGhlIGZpcnN0IG9uZSBkZWZpbmVkIGlzIHJldHVybmVkLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKKworICAvLyBJZiB0aGlzIGVudW0gdHlwZSBpcyBuZXN0ZWQgaW4gYSBtZXNzYWdlIHR5cGUsIHRoaXMgaXMgdGhhdCBtZXNzYWdlIHR5cGUuCisgIC8vIE90aGVyd2lzZSwgTlVMTC4KKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7CisKKyAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgZW51bSB0eXBlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKKyAgLy8gcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIHRoZSBlbnVtIGRlZmluaXRpb24uICBBbGxvd2VkCisgIC8vIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgRW51bU9wdGlvbnMgaW4gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8sCisgIC8vIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdCBtZXNzYWdlLgorICBjb25zdCBFbnVtT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KKyAgdm9pZCBDb3B5VG8oRW51bURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgZW51bSBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcworICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KKyAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgRW51bU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdDsKKworICBjb25zdCBzdHJpbmcqIG5hbWVfOworICBjb25zdCBzdHJpbmcqIGZ1bGxfbmFtZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKKyAgY29uc3QgRW51bU9wdGlvbnMqIG9wdGlvbnNfOworCisgIC8vIFRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIHR5cGUuCisgIGJvb2wgaXNfcGxhY2Vob2xkZXJfOworICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBhbmQgdGhlIHR5cGUgbmFtZSB3YXNuJ3QgZnVsbHktcXVhbGlmaWVkLgorICBib29sIGlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXzsKKworICBpbnQgdmFsdWVfY291bnRfOworICBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZXNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPEVudW1EZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PEVudW1EZXNjcmlwdG9yPigpIGluCisgIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCisgIEVudW1EZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1EZXNjcmlwdG9yKTsKK307CisKKy8vIERlc2NyaWJlcyBhbiBpbmRpdmlkdWFsIGVudW0gY29uc3RhbnQgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuICBUbyBnZXQgdGhlCisvLyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciBhIGdpdmVuIGVudW0gdmFsdWUsIGZpcnN0IGdldCB0aGUgRW51bURlc2NyaXB0b3IKKy8vIGZvciBpdHMgdHlwZSwgdGhlbiB1c2UgRW51bURlc2NyaXB0b3I6OkZpbmRWYWx1ZUJ5TmFtZSgpIG9yCisvLyBFbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOdW1iZXIoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QKKy8vIHlvdXIgb3duIGRlc2NyaXB0b3JzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVudW1WYWx1ZURlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7ICAvLyBOYW1lIG9mIHRoaXMgZW51bSBjb25zdGFudC4KKyAgaW50IGluZGV4KCkgY29uc3Q7ICAgICAgICAgICAvLyBJbmRleCB3aXRoaW4gdGhlIGVudW1zJ3MgRGVzY3JpcHRvci4KKyAgaW50IG51bWJlcigpIGNvbnN0OyAgICAgICAgICAvLyBOdW1lcmljIHZhbHVlIG9mIHRoaXMgZW51bSBjb25zdGFudC4KKworICAvLyBUaGUgZnVsbF9uYW1lIG9mIGFuIGVudW0gdmFsdWUgaXMgYSBzaWJsaW5nIHN5bWJvbCBvZiB0aGUgZW51bSB0eXBlLgorICAvLyBlLmcuIHRoZSBmdWxsIG5hbWUgb2YgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIgaXMgYWN0dWFsbHkKKyAgLy8gImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UWVBFX0lOVDMyIiwgTk9UCisgIC8vICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZS5UWVBFX0lOVDMyIi4gIFRoaXMgaXMgdG8gY29uZm9ybQorICAvLyB3aXRoIEMrKyBzY29waW5nIHJ1bGVzIGZvciBlbnVtcy4KKyAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKKworICAvLyBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlLiAgTmV2ZXIgTlVMTC4KKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHR5cGUoKSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBlbnVtIHZhbHVlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUKKyAgLy8gYnkgYWRkaW5nIHRleHQgbGlrZSAiW2ZvbyA9IDEyMzRdIiBhZnRlciBhbiBlbnVtIHZhbHVlIGRlZmluaXRpb24uCisgIC8vIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBFbnVtVmFsdWVPcHRpb25zIGluCisgIC8vIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55IGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQKKyAgLy8gbWVzc2FnZS4KKyAgY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KKyAgdm9pZCBDb3B5VG8oRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhpcyBlbnVtIHZhbHVlIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBFbnVtVmFsdWVPcHRpb25zIE9wdGlvbnNUeXBlOworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cykgY29uc3Q7CisKKyAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKKyAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KKyAgdm9pZCBHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CisKKyAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOworICBpbnQgbnVtYmVyXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHR5cGVfOworICBjb25zdCBFbnVtVmFsdWVPcHRpb25zKiBvcHRpb25zXzsKKyAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcworICAvLyBvZiBBbGxvY2F0ZTxFbnVtVmFsdWVEZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PEVudW1WYWx1ZURlc2NyaXB0b3I+KCkKKyAgLy8gaW4gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisKKyAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KKyAgRW51bVZhbHVlRGVzY3JpcHRvcigpIHt9CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIEVudW1EZXNjcmlwdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bVZhbHVlRGVzY3JpcHRvcik7Cit9OworCisvLyBEZXNjcmliZXMgYW4gUlBDIHNlcnZpY2UuICBUbyBnZXQgdGhlIFNlcnZpY2VEZXNjcmlwdG9yIGZvciBhIHNlcnZpY2UsCisvLyBjYWxsIFNlcnZpY2U6OkdldERlc2NyaXB0b3IoKS4gIEdlbmVyYXRlZCBzZXJ2aWNlIGNsYXNzZXMgYWxzbyBoYXZlIGEKKy8vIHN0YXRpYyBtZXRob2QgY2FsbGVkIGRlc2NyaXB0b3IoKSB3aGljaCByZXR1cm5zIHRoZSB0eXBlJ3MKKy8vIFNlcnZpY2VEZXNjcmlwdG9yLiAgVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdCB5b3VyIG93biBkZXNjcmlwdG9ycy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTZXJ2aWNlRGVzY3JpcHRvciB7CisgcHVibGljOgorICAvLyBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSwgbm90IGluY2x1ZGluZyBpdHMgY29udGFpbmluZyBzY29wZS4KKyAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIC8vIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSwgc2NvcGUgZGVsaW1pdGVkIGJ5IHBlcmlvZHMuCisgIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lKCkgY29uc3Q7CisgIC8vIEluZGV4IG9mIHRoaXMgc2VydmljZSB3aXRoaW4gdGhlIGZpbGUncyBzZXJ2aWNlcyBhcnJheS4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gVGhlIC5wcm90byBmaWxlIGluIHdoaWNoIHRoaXMgc2VydmljZSB3YXMgZGVmaW5lZC4gIE5ldmVyIE5VTEwuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7CisKKyAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgc2VydmljZSB0eXBlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUKKyAgLy8gYnkgcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24uCisgIC8vIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBTZXJ2aWNlT3B0aW9ucyBpbgorICAvLyBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0CisgIC8vIG1lc3NhZ2UuCisgIGNvbnN0IFNlcnZpY2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBtZXRob2RzIHRoaXMgc2VydmljZSBkZWZpbmVzLgorICBpbnQgbWV0aG9kX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSBNZXRob2REZXNjcmlwdG9yIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgbWV0aG9kX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBMb29rIHVwIGEgTWV0aG9kRGVzY3JpcHRvciBieSBuYW1lLgorICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBGaW5kTWV0aG9kQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KKyAgdm9pZCBDb3B5VG8oU2VydmljZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgc2VydmljZSBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcworICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KKyAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgU2VydmljZU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHZvaWQgRGVidWdTdHJpbmcoc3RyaW5nICpjb250ZW50cykgY29uc3Q7CisKKyAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKKyAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KKyAgdm9pZCBHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CisKKyAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IFNlcnZpY2VPcHRpb25zKiBvcHRpb25zXzsKKyAgaW50IG1ldGhvZF9jb3VudF87CisgIE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZHNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPFNlcnZpY2VEZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PFNlcnZpY2VEZXNjcmlwdG9yPigpIGluCisgIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCisgIFNlcnZpY2VEZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBNZXRob2REZXNjcmlwdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2VydmljZURlc2NyaXB0b3IpOworfTsKKworLy8gRGVzY3JpYmVzIGFuIGluZGl2aWR1YWwgc2VydmljZSBtZXRob2QuICBUbyBvYnRhaW4gYSBNZXRob2REZXNjcmlwdG9yIGdpdmVuCisvLyBhIHNlcnZpY2UsIGZpcnN0IGdldCBpdHMgU2VydmljZURlc2NyaXB0b3IsIHRoZW4gY2FsbAorLy8gU2VydmljZURlc2NyaXB0b3I6OkZpbmRNZXRob2RCeU5hbWUoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QgeW91cgorLy8gb3duIGRlc2NyaXB0b3JzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1ldGhvZERlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgLy8gTmFtZSBvZiB0aGlzIG1ldGhvZCwgbm90IGluY2x1ZGluZyBjb250YWluaW5nIHNjb3BlLgorICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgLy8gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBtZXRob2QsIHNjb3BlIGRlbGltaXRlZCBieSBwZXJpb2RzLgorICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSgpIGNvbnN0OworICAvLyBJbmRleCB3aXRoaW4gdGhlIHNlcnZpY2UncyBEZXNjcmlwdG9yLgorICBpbnQgaW5kZXgoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBzZXJ2aWNlIHRvIHdoaWNoIHRoaXMgbWV0aG9kIGJlbG9uZ3MuICBOZXZlciBOVUxMLgorICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSB3aGljaCB0aGlzIG1ldGhvZCBhY2NlcHRzIGFzIGlucHV0LgorICBjb25zdCBEZXNjcmlwdG9yKiBpbnB1dF90eXBlKCkgY29uc3Q7CisgIC8vIEdldHMgdGhlIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSB3aGljaCB0aGlzIG1lc3NhZ2UgcHJvZHVjZXMgYXMgb3V0cHV0LgorICBjb25zdCBEZXNjcmlwdG9yKiBvdXRwdXRfdHlwZSgpIGNvbnN0OworCisgIC8vIEdldCBvcHRpb25zIGZvciB0aGlzIG1ldGhvZC4gIFRoZXNlIGFyZSBzcGVjaWZpZWQgaW4gdGhlIC5wcm90byBmaWxlIGJ5CisgIC8vIHBsYWNpbmcgbGluZXMgbGlrZSAib3B0aW9uIGZvbyA9IDEyMzQ7IiBpbiBjdXJseS1icmFjZXMgYWZ0ZXIgYSBtZXRob2QKKyAgLy8gZGVjbGFyYXRpb24uICBBbGxvd2VkIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgTWV0aG9kT3B0aW9ucyBpbgorICAvLyBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0CisgIC8vIG1lc3NhZ2UuCisgIGNvbnN0IE1ldGhvZE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgIHZvaWQgQ29weVRvKE1ldGhvZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBNZXRob2RPcHRpb25zIE9wdGlvbnNUeXBlOworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cykgY29uc3Q7CisKKyAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKKyAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KKyAgdm9pZCBHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CisKKyAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGlucHV0X3R5cGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBvdXRwdXRfdHlwZV87CisgIGNvbnN0IE1ldGhvZE9wdGlvbnMqIG9wdGlvbnNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPE1ldGhvZERlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8TWV0aG9kRGVzY3JpcHRvcj4oKSBpbgorICAvLyBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgorICBNZXRob2REZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgU2VydmljZURlc2NyaXB0b3I7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXRob2REZXNjcmlwdG9yKTsKK307CisKKworLy8gRGVzY3JpYmVzIGEgd2hvbGUgLnByb3RvIGZpbGUuICBUbyBnZXQgdGhlIEZpbGVEZXNjcmlwdG9yIGZvciBhIGNvbXBpbGVkLWluCisvLyBmaWxlLCBnZXQgdGhlIGRlc2NyaXB0b3IgZm9yIHNvbWV0aGluZyBkZWZpbmVkIGluIHRoYXQgZmlsZSBhbmQgY2FsbAorLy8gZGVzY3JpcHRvci0+ZmlsZSgpLiAgVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdCB5b3VyIG93biBkZXNjcmlwdG9ycy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWxlRGVzY3JpcHRvciB7CisgcHVibGljOgorICAvLyBUaGUgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgdHJlZS4KKyAgLy8gZS5nLiAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iCisgIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OworCisgIC8vIFRoZSBwYWNrYWdlLCBlLmcuICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIiLgorICBjb25zdCBzdHJpbmcmIHBhY2thZ2UoKSBjb25zdDsKKworICAvLyBUaGUgRGVzY3JpcHRvclBvb2wgaW4gd2hpY2ggdGhpcyBGaWxlRGVzY3JpcHRvciBhbmQgYWxsIGl0cyBjb250ZW50cyB3ZXJlCisgIC8vIGFsbG9jYXRlZC4gIE5ldmVyIE5VTEwuCisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBmaWxlcyBpbXBvcnRlZCBieSB0aGlzIG9uZS4KKyAgaW50IGRlcGVuZGVuY3lfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhbiBpbXBvcnRlZCBmaWxlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgZGVwZW5kZW5jeV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKworICAvLyBUaGUgbnVtYmVyIG9mIGZpbGVzIHB1YmxpYyBpbXBvcnRlZCBieSB0aGlzIG9uZS4KKyAgLy8gVGhlIHB1YmxpYyBkZXBlbmRlbmN5IGxpc3QgaXMgYSBzdWJzZXQgb2YgdGhlIGRlcGVuZGVuY3kgbGlzdC4KKyAgaW50IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSBwdWJsaWMgaW1wb3J0ZWQgZmlsZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8CisgIC8vIHB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKworICAvLyBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIGltcG9ydGVkIGZvciB3ZWFrIGZpZWxkcy4KKyAgLy8gVGhlIHdlYWsgZGVwZW5kZW5jeSBsaXN0IGlzIGEgc3Vic2V0IG9mIHRoZSBkZXBlbmRlbmN5IGxpc3QuCisgIGludCB3ZWFrX2RlcGVuZGVuY3lfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHdlYWsgaW1wb3J0ZWQgZmlsZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8CisgIC8vIHdlYWtfZGVwZW5kZW5jeV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHdlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIE51bWJlciBvZiB0b3AtbGV2ZWwgbWVzc2FnZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gIChUaGlzIGRvZXMgbm90CisgIC8vIGluY2x1ZGUgbmVzdGVkIHR5cGVzLikKKyAgaW50IG1lc3NhZ2VfdHlwZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGEgdG9wLWxldmVsIG1lc3NhZ2UgdHlwZSwgd2hlcmUgMCA8PSBpbmRleCA8IG1lc3NhZ2VfdHlwZV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTnVtYmVyIG9mIHRvcC1sZXZlbCBlbnVtIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKFRoaXMgZG9lcyBub3QKKyAgLy8gaW5jbHVkZSBuZXN0ZWQgdHlwZXMuKQorICBpbnQgZW51bV90eXBlX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSB0b3AtbGV2ZWwgZW51bSB0eXBlLCB3aGVyZSAwIDw9IGluZGV4IDwgZW51bV90eXBlX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTnVtYmVyIG9mIHNlcnZpY2VzIGRlZmluZWQgaW4gdGhpcyBmaWxlLgorICBpbnQgc2VydmljZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGEgc2VydmljZSwgd2hlcmUgMCA8PSBpbmRleCA8IHNlcnZpY2VfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTnVtYmVyIG9mIGV4dGVuc2lvbnMgZGVmaW5lZCBhdCBmaWxlIHNjb3BlLiAgKFRoaXMgZG9lcyBub3QgaW5jbHVkZQorICAvLyBleHRlbnNpb25zIG5lc3RlZCB3aXRoaW4gbWVzc2FnZSB0eXBlcy4pCisgIGludCBleHRlbnNpb25fY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhbiBleHRlbnNpb24ncyBkZXNjcmlwdG9yLCB3aGVyZSAwIDw9IGluZGV4IDwgZXh0ZW5zaW9uX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIEdldCBvcHRpb25zIGZvciB0aGlzIGZpbGUuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZSBieQorICAvLyBwbGFjaW5nIGxpbmVzIGxpa2UgIm9wdGlvbiBmb28gPSAxMjM0OyIgYXQgdGhlIHRvcCBsZXZlbCwgb3V0c2lkZSBvZiBhbnkKKyAgLy8gb3RoZXIgZGVmaW5pdGlvbnMuICBBbGxvd2VkIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgRmlsZU9wdGlvbnMgaW4KKyAgLy8gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8sIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdAorICAvLyBtZXNzYWdlLgorICBjb25zdCBGaWxlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIEZpbmQgYSB0b3AtbGV2ZWwgbWVzc2FnZSB0eXBlIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLgorICBjb25zdCBEZXNjcmlwdG9yKiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgLy8gRmluZCBhIHRvcC1sZXZlbCBlbnVtIHR5cGUgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgLy8gRmluZCBhbiBlbnVtIHZhbHVlIGRlZmluZWQgaW4gYW55IHRvcC1sZXZlbCBlbnVtIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYKKyAgLy8gbm90IGZvdW5kLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIC8vIEZpbmQgYSBzZXJ2aWNlIGRlZmluaXRpb24gYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBGaW5kU2VydmljZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICAvLyBGaW5kIGEgdG9wLWxldmVsIGV4dGVuc2lvbiBkZWZpbml0aW9uIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgLy8gU2ltaWxhciB0byBGaW5kRXh0ZW5zaW9uQnlOYW1lKCksIGJ1dCBzZWFyY2hlcyBieSBsb3dlcmNhc2VkLW5hbWUuICBTZWUKKyAgLy8gRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCkuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICAvLyBTaW1pbGFyIHRvIEZpbmRFeHRlbnNpb25CeU5hbWUoKSwgYnV0IHNlYXJjaGVzIGJ5IGNhbWVsY2FzZWQtbmFtZS4gIFNlZQorICAvLyBEZXNjcmlwdG9yOjpGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoKS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgorICAvLyBOb3RlczoKKyAgLy8gLSBUaGlzIG1ldGhvZCBkb2VzIE5PVCBjb3B5IHNvdXJjZSBjb2RlIGluZm9ybWF0aW9uIHNpbmNlIGl0IGlzIHJlbGF0aXZlbHkKKyAgLy8gICBsYXJnZSBhbmQgcmFyZWx5IG5lZWRlZC4gIFNlZSBDb3B5U291cmNlQ29kZUluZm9UbygpIGJlbG93LgorICB2b2lkIENvcHlUbyhGaWxlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisgIC8vIFdyaXRlIHRoZSBzb3VyY2UgY29kZSBpbmZvcm1hdGlvbiBvZiB0aGlzIEZpbGVEZXNjcmlwdG9yIGludG8gdGhlIGdpdmVuCisgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG8uICBTZWUgQ29weVRvKCkgYWJvdmUuCisgIHZvaWQgQ29weVNvdXJjZUNvZGVJbmZvVG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhlIGRlY2xhcmF0aW9uIG9yIGRlY2xhcmF0aW9uLXBhcnQgZGVub3RlZCBieSB8cGF0aHwuCisgIC8vIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbgorICAvLyBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4gIChTZWUgU291cmNlQ29kZUluZm8gZm9yCisgIC8vIGRlc2NyaXB0aW9uIG9mIHBhdGggZW5jb2RpbmcuKQorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKGNvbnN0IHZlY3RvcjxpbnQ+JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgIHR5cGVkZWYgRmlsZU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBwYWNrYWdlXzsKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2xfOworICBpbnQgZGVwZW5kZW5jeV9jb3VudF87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiogZGVwZW5kZW5jaWVzXzsKKyAgaW50IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50XzsKKyAgaW50KiBwdWJsaWNfZGVwZW5kZW5jaWVzXzsKKyAgaW50IHdlYWtfZGVwZW5kZW5jeV9jb3VudF87CisgIGludCogd2Vha19kZXBlbmRlbmNpZXNfOworICBpbnQgbWVzc2FnZV90eXBlX2NvdW50XzsKKyAgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlc187CisgIGludCBlbnVtX3R5cGVfY291bnRfOworICBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlc187CisgIGludCBzZXJ2aWNlX2NvdW50XzsKKyAgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2VzXzsKKyAgaW50IGV4dGVuc2lvbl9jb3VudF87CisgIEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uc187CisgIGNvbnN0IEZpbGVPcHRpb25zKiBvcHRpb25zXzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyogdGFibGVzXzsKKyAgY29uc3QgU291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm9fOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PEZpbGVEZXNjcmlwdG9yPigpIGluCisgIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIEZpbGVEZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIEVudW1EZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIE1ldGhvZERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVEZXNjcmlwdG9yKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVXNlZCB0byBjb25zdHJ1Y3QgZGVzY3JpcHRvcnMuCisvLworLy8gTm9ybWFsbHkgeW91IHdvbid0IHdhbnQgdG8gYnVpbGQgeW91ciBvd24gZGVzY3JpcHRvcnMuICBNZXNzYWdlIGNsYXNzZXMKKy8vIGNvbnN0cnVjdGVkIGJ5IHRoZSBwcm90b2NvbCBjb21waWxlciB3aWxsIHByb3ZpZGUgdGhlbSBmb3IgeW91LiAgSG93ZXZlciwKKy8vIGlmIHlvdSBhcmUgaW1wbGVtZW50aW5nIE1lc3NhZ2Ugb24geW91ciBvd24sIG9yIGlmIHlvdSBhcmUgd3JpdGluZyBhCisvLyBwcm9ncmFtIHdoaWNoIGNhbiBvcGVyYXRlIG9uIHRvdGFsbHkgYXJiaXRyYXJ5IHR5cGVzIGFuZCBuZWVkcyB0byBsb2FkCisvLyB0aGVtIGZyb20gc29tZSBzb3J0IG9mIGRhdGFiYXNlLCB5b3UgbWlnaHQgbmVlZCB0by4KKy8vCisvLyBTaW5jZSBEZXNjcmlwdG9ycyBhcmUgY29tcG9zZWQgb2YgYSB3aG9sZSBsb3Qgb2YgY3Jvc3MtbGlua2VkIGJpdHMgb2YKKy8vIGRhdGEgdGhhdCB3b3VsZCBiZSBhIHBhaW4gdG8gcHV0IHRvZ2V0aGVyIG1hbnVhbGx5LCB0aGUKKy8vIERlc2NyaXB0b3JQb29sIGNsYXNzIGlzIHByb3ZpZGVkIHRvIG1ha2UgdGhlIHByb2Nlc3MgZWFzaWVyLiAgSXQgY2FuCisvLyB0YWtlIGEgRmlsZURlc2NyaXB0b3JQcm90byAoZGVmaW5lZCBpbiBkZXNjcmlwdG9yLnByb3RvKSwgdmFsaWRhdGUgaXQsCisvLyBhbmQgY29udmVydCBpdCB0byBhIHNldCBvZiBuaWNlbHkgY3Jvc3MtbGlua2VkIERlc2NyaXB0b3JzLgorLy8KKy8vIERlc2NyaXB0b3JQb29sIGFsc28gaGVscHMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudC4gIERlc2NyaXB0b3JzIGFyZQorLy8gY29tcG9zZWQgb2YgbWFueSBvYmplY3RzIGNvbnRhaW5pbmcgc3RhdGljIGRhdGEgYW5kIHBvaW50ZXJzIHRvIGVhY2gKKy8vIG90aGVyLiAgSW4gYWxsIGxpa2VsaWhvb2QsIHdoZW4gaXQgY29tZXMgdGltZSB0byBkZWxldGUgdGhpcyBkYXRhLAorLy8geW91J2xsIHdhbnQgdG8gZGVsZXRlIGl0IGFsbCBhdCBvbmNlLiAgSW4gZmFjdCwgaXQgaXMgbm90IHVuY29tbW9uIHRvCisvLyBoYXZlIGEgd2hvbGUgcG9vbCBvZiBkZXNjcmlwdG9ycyBhbGwgY3Jvc3MtbGlua2VkIHdpdGggZWFjaCBvdGhlciB3aGljaAorLy8geW91IHdpc2ggdG8gZGVsZXRlIGFsbCBhdCBvbmNlLiAgVGhpcyBjbGFzcyByZXByZXNlbnRzIHN1Y2ggYSBwb29sLCBhbmQKKy8vIGhhbmRsZXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGZvciB5b3UuCisvLworLy8gWW91IGNhbiBhbHNvIHNlYXJjaCBmb3IgZGVzY3JpcHRvcnMgd2l0aGluIGEgRGVzY3JpcHRvclBvb2wgYnkgbmFtZSwgYW5kCisvLyBleHRlbnNpb25zIGJ5IG51bWJlci4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEZXNjcmlwdG9yUG9vbCB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBub3JtYWwsIGVtcHR5IERlc2NyaXB0b3JQb29sLgorICBEZXNjcmlwdG9yUG9vbCgpOworCisgIC8vIENvbnN0cnVjdHMgYSBEZXNjcmlwdG9yUG9vbCB0aGF0LCB3aGVuIGl0IGNhbid0IGZpbmQgc29tZXRoaW5nIGFtb25nIHRoZQorICAvLyBkZXNjcmlwdG9ycyBhbHJlYWR5IGluIHRoZSBwb29sLCBsb29rcyBmb3IgaXQgaW4gdGhlIGdpdmVuCisgIC8vIERlc2NyaXB0b3JEYXRhYmFzZS4KKyAgLy8gTm90ZXM6CisgIC8vIC0gSWYgYSBEZXNjcmlwdG9yUG9vbCBpcyBjb25zdHJ1Y3RlZCB0aGlzIHdheSwgaXRzIEJ1aWxkRmlsZSooKSBtZXRob2RzCisgIC8vICAgbXVzdCBub3QgYmUgY2FsbGVkICh0aGV5IHdpbGwgYXNzZXJ0LWZhaWwpLiAgVGhlIG9ubHkgd2F5IHRvIHBvcHVsYXRlCisgIC8vICAgdGhlIHBvb2wgd2l0aCBkZXNjcmlwdG9ycyBpcyB0byBjYWxsIHRoZSBGaW5kKkJ5KigpIG1ldGhvZHMuCisgIC8vIC0gVGhlIEZpbmQqQnkqKCkgbWV0aG9kcyBtYXkgYmxvY2sgdGhlIGNhbGxpbmcgdGhyZWFkIGlmIHRoZQorICAvLyAgIERlc2NyaXB0b3JEYXRhYmFzZSBibG9ja3MuICBUaGlzIGluIHR1cm4gbWVhbnMgdGhhdCBwYXJzaW5nIG1lc3NhZ2VzCisgIC8vICAgbWF5IGJsb2NrIGlmIHRoZXkgbmVlZCB0byBsb29rIHVwIGV4dGVuc2lvbnMuCisgIC8vIC0gVGhlIEZpbmQqQnkqKCkgbWV0aG9kcyB3aWxsIHVzZSBtdXRleGVzIGZvciB0aHJlYWQtc2FmZXR5LCB0aHVzIG1ha2luZworICAvLyAgIHRoZW0gc2xvd2VyIGV2ZW4gd2hlbiB0aGV5IGRvbid0IGhhdmUgdG8gZmFsbCBiYWNrIHRvIHRoZSBkYXRhYmFzZS4KKyAgLy8gICBJbiBmYWN0LCBldmVuIHRoZSBGaW5kKkJ5KigpIG1ldGhvZHMgb2YgZGVzY3JpcHRvciBvYmplY3RzIG93bmVkIGJ5CisgIC8vICAgdGhpcyBwb29sIHdpbGwgYmUgc2xvd2VyLCBzaW5jZSB0aGV5IHdpbGwgaGF2ZSB0byBvYnRhaW4gbG9ja3MgdG9vLgorICAvLyAtIEFuIEVycm9yQ29sbGVjdG9yIG1heSBvcHRpb25hbGx5IGJlIGdpdmVuIHRvIGNvbGxlY3QgdmFsaWRhdGlvbiBlcnJvcnMKKyAgLy8gICBpbiBmaWxlcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuICBJZiBub3QgZ2l2ZW4sIGVycm9ycyB3aWxsIGJlIHByaW50ZWQKKyAgLy8gICB0byBHT09HTEVfTE9HKEVSUk9SKS4gIFJlbWVtYmVyIHRoYXQgZmlsZXMgYXJlIGJ1aWx0IG9uLWRlbWFuZCwgc28gdGhpcworICAvLyAgIEVycm9yQ29sbGVjdG9yIG1heSBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkIHRoYXQgY2FsbHMgb25lIG9mIHRoZQorICAvLyAgIEZpbmQqQnkqKCkgbWV0aG9kcy4KKyAgY2xhc3MgRXJyb3JDb2xsZWN0b3I7CisgIGV4cGxpY2l0IERlc2NyaXB0b3JQb29sKERlc2NyaXB0b3JEYXRhYmFzZSogZmFsbGJhY2tfZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IgPSBOVUxMKTsKKworICB+RGVzY3JpcHRvclBvb2woKTsKKworICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBnZW5lcmF0ZWQgcG9vbC4gIEdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMKKyAgLy8gd2hpY2ggYXJlIGNvbXBpbGVkIGludG8gdGhlIGJpbmFyeSB3aWxsIGFsbG9jYXRlIHRoZWlyIGRlc2NyaXB0b3JzIGluCisgIC8vIHRoaXMgcG9vbC4gIERvIG5vdCBhZGQgeW91ciBvd24gZGVzY3JpcHRvcnMgdG8gdGhpcyBwb29sLgorICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvclBvb2wqIGdlbmVyYXRlZF9wb29sKCk7CisKKyAgLy8gRmluZCBhIEZpbGVEZXNjcmlwdG9yIGluIHRoZSBwb29sIGJ5IGZpbGUgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QKKyAgLy8gZm91bmQuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIEZpbmQgdGhlIEZpbGVEZXNjcmlwdG9yIGluIHRoZSBwb29sIHdoaWNoIGRlZmluZXMgdGhlIGdpdmVuIHN5bWJvbC4KKyAgLy8gSWYgYW55IG9mIHRoZSBGaW5kKkJ5TmFtZSgpIG1ldGhvZHMgYmVsb3cgd291bGQgc3VjY2VlZCwgdGhlbiB0aGlzIGlzCisgIC8vIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGF0IG1ldGhvZCBhbmQgY2FsbGluZyB0aGUgcmVzdWx0J3MgZmlsZSgpIG1ldGhvZC4KKyAgLy8gT3RoZXJ3aXNlIHRoaXMgcmV0dXJucyBOVUxMLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSkgY29uc3Q7CisKKyAgLy8gTG9va2luZyB1cCBkZXNjcmlwdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgZmluZCBkZXNjcmlwdG9ycyBieSBmdWxseS1xdWFsaWZpZWQgbmFtZS4gIFRoZXNlIHdpbGwgZmluZCBib3RoCisgIC8vIHRvcC1sZXZlbCBkZXNjcmlwdG9ycyBhbmQgbmVzdGVkIGRlc2NyaXB0b3JzLiAgVGhleSByZXR1cm4gTlVMTCBpZiBub3QKKyAgLy8gZm91bmQuCisKKyAgY29uc3QgRGVzY3JpcHRvciogRmluZE1lc3NhZ2VUeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICBjb25zdCBFbnVtRGVzY3JpcHRvciogRmluZEVudW1UeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRFbnVtVmFsdWVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEZpbmRTZXJ2aWNlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIEZpbmRNZXRob2RCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBGaW5kcyBhbiBleHRlbnNpb24gb2YgdGhlIGdpdmVuIHR5cGUgYnkgbnVtYmVyLiAgVGhlIGV4dGVuZGVlIG11c3QgYmUKKyAgLy8gYSBtZW1iZXIgb2YgdGhpcyBEZXNjcmlwdG9yUG9vbCBvciBvbmUgb2YgaXRzIHVuZGVybGF5cy4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIEZpbmRzIGV4dGVuc2lvbnMgb2YgZXh0ZW5kZWUuIFRoZSBleHRlbnNpb25zIHdpbGwgYmUgYXBwZW5kZWQgdG8KKyAgLy8gb3V0IGluIGFuIHVuZGVmaW5lZCBvcmRlci4gT25seSBleHRlbnNpb25zIGRlZmluZWQgZGlyZWN0bHkgaW4KKyAgLy8gdGhpcyBEZXNjcmlwdG9yUG9vbCBvciBvbmUgb2YgaXRzIHVuZGVybGF5cyBhcmUgZ3VhcmFudGVlZCB0byBiZQorICAvLyBmb3VuZDogZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBtaWdodCBub3QgYmUgZm91bmQKKyAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCBGaW5kQWxsRXh0ZW5zaW9ucyhjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3Q7CisKKyAgLy8gQnVpbGRpbmcgZGVzY3JpcHRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBXaGVuIGNvbnZlcnRpbmcgYSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIGEgRmlsZURlc2NyaXB0b3IsIHZhcmlvdXMKKyAgLy8gZXJyb3JzIG1pZ2h0IGJlIGRldGVjdGVkIGluIHRoZSBpbnB1dC4gIFRoZSBjYWxsZXIgbWF5IGhhbmRsZSB0aGVzZQorICAvLyBwcm9ncmFtbWF0aWNhbGx5IGJ5IGltcGxlbWVudGluZyBhbiBFcnJvckNvbGxlY3Rvci4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVycm9yQ29sbGVjdG9yIHsKKyAgIHB1YmxpYzoKKyAgICBpbmxpbmUgRXJyb3JDb2xsZWN0b3IoKSB7fQorICAgIHZpcnR1YWwgfkVycm9yQ29sbGVjdG9yKCk7CisKKyAgICAvLyBUaGVzZSBjb25zdGFudHMgc3BlY2lmeSB3aGF0IGV4YWN0IHBhcnQgb2YgdGhlIGNvbnN0cnVjdCBpcyBicm9rZW4uCisgICAgLy8gVGhpcyBpcyB1c2VmdWwgZS5nLiBmb3IgbWFwcGluZyB0aGUgZXJyb3IgYmFjayB0byBhbiBleGFjdCBsb2NhdGlvbgorICAgIC8vIGluIGEgLnByb3RvIGZpbGUuCisgICAgZW51bSBFcnJvckxvY2F0aW9uIHsKKyAgICAgIE5BTUUsICAgICAgICAgICAgICAvLyB0aGUgc3ltYm9sIG5hbWUsIG9yIHRoZSBwYWNrYWdlIG5hbWUgZm9yIGZpbGVzCisgICAgICBOVU1CRVIsICAgICAgICAgICAgLy8gZmllbGQgb3IgZXh0ZW5zaW9uIHJhbmdlIG51bWJlcgorICAgICAgVFlQRSwgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUKKyAgICAgIEVYVEVOREVFLCAgICAgICAgICAvLyBmaWVsZCBleHRlbmRlZQorICAgICAgREVGQVVMVF9WQUxVRSwgICAgIC8vIGZpZWxkIGRlZmF1bHQgdmFsdWUKKyAgICAgIElOUFVUX1RZUEUsICAgICAgICAvLyBtZXRob2QgaW5wdXQgdHlwZQorICAgICAgT1VUUFVUX1RZUEUsICAgICAgIC8vIG1ldGhvZCBvdXRwdXQgdHlwZQorICAgICAgT1BUSU9OX05BTUUsICAgICAgIC8vIG5hbWUgaW4gYXNzaWdubWVudAorICAgICAgT1BUSU9OX1ZBTFVFLCAgICAgIC8vIHZhbHVlIGluIG9wdGlvbiBhc3NpZ25tZW50CisgICAgICBPVEhFUiAgICAgICAgICAgICAgLy8gc29tZSBvdGhlciBwcm9ibGVtCisgICAgfTsKKworICAgIC8vIFJlcG9ydHMgYW4gZXJyb3IgaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uCisgICAgdmlydHVhbCB2b2lkIEFkZEVycm9yKAorICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgICAgICAvLyBGaWxlIG5hbWUgaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsICAvLyBGdWxsIG5hbWUgb2YgdGhlIGVycm9uZW91cyBlbGVtZW50LgorICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgICAvLyBEZXNjcmlwdG9yIG9mIHRoZSBlcnJvbmVvdXMgZWxlbWVudC4KKyAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sICAgICAgLy8gT25lIG9mIHRoZSBsb2NhdGlvbiBjb25zdGFudHMsIGFib3ZlLgorICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlICAgICAgICAvLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgICAgKSA9IDA7CisKKyAgIHByaXZhdGU6CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVycm9yQ29sbGVjdG9yKTsKKyAgfTsKKworICAvLyBDb252ZXJ0IHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHJlYWwgZGVzY3JpcHRvcnMgYW5kIHBsYWNlIHRoZW0gaW4KKyAgLy8gdGhpcyBEZXNjcmlwdG9yUG9vbC4gIEFsbCBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGJlIGluCisgIC8vIHRoZSBwb29sLiAgUmV0dXJucyB0aGUgcmVzdWx0aW5nIEZpbGVEZXNjcmlwdG9yLCBvciBOVUxMIGlmIHRoZXJlIHdlcmUKKyAgLy8gcHJvYmxlbXMgd2l0aCB0aGUgaW5wdXQgKGUuZy4gdGhlIG1lc3NhZ2Ugd2FzIGludmFsaWQsIG9yIGRlcGVuZGVuY2llcworICAvLyB3ZXJlIG1pc3NpbmcpLiAgRGV0YWlscyBhYm91dCB0aGUgZXJyb3JzIGFyZSB3cml0dGVuIHRvIEdPT0dMRV9MT0coRVJST1IpLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworICAvLyBTYW1lIGFzIEJ1aWxkRmlsZSgpIGV4Y2VwdCBlcnJvcnMgYXJlIHNlbnQgdG8gdGhlIGdpdmVuIEVycm9yQ29sbGVjdG9yLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlQ29sbGVjdGluZ0Vycm9ycygKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKTsKKworICAvLyBCeSBkZWZhdWx0LCBpdCBpcyBhbiBlcnJvciBpZiBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gY29udGFpbnMgcmVmZXJlbmNlcworICAvLyB0byB0eXBlcyBvciBvdGhlciBmaWxlcyB0aGF0IGFyZSBub3QgZm91bmQgaW4gdGhlIERlc2NyaXB0b3JQb29sIChvciBpdHMKKyAgLy8gYmFja2luZyBEZXNjcmlwdG9yRGF0YWJhc2UsIGlmIGFueSkuICBJZiB5b3UgY2FsbAorICAvLyBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSwgaG93ZXZlciwgdGhlbiB1bmtub3duIHR5cGVzIGFuZCBmaWxlcworICAvLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHBsYWNlaG9sZGVyIGRlc2NyaXB0b3JzLiAgVGhpcyBjYW4gYWxsb3cgeW91IHRvCisgIC8vIHBlcmZvcm0gc29tZSB1c2VmdWwgb3BlcmF0aW9ucyB3aXRoIGEgLnByb3RvIGZpbGUgZXZlbiBpZiB5b3UgZG8gbm90CisgIC8vIGhhdmUgYWNjZXNzIHRvIG90aGVyIC5wcm90byBmaWxlcyBvbiB3aGljaCBpdCBkZXBlbmRzLiAgSG93ZXZlciwgc29tZQorICAvLyBoZXVyaXN0aWNzIG11c3QgYmUgdXNlZCB0byBmaWxsIGluIHRoZSBnYXBzIGluIGluZm9ybWF0aW9uLCBhbmQgdGhlc2UKKyAgLy8gY2FuIGxlYWQgdG8gZGVzY3JpcHRvcnMgd2hpY2ggYXJlIGluYWNjdXJhdGUuICBGb3IgZXhhbXBsZSwgdGhlCisgIC8vIERlc2NyaXB0b3JQb29sIG1heSBiZSBmb3JjZWQgdG8gZ3Vlc3Mgd2hldGhlciBhbiB1bmtub3duIHR5cGUgaXMgYSBtZXNzYWdlCisgIC8vIG9yIGFuIGVudW0sIGFzIHdlbGwgYXMgd2hhdCBwYWNrYWdlIGl0IHJlc2lkZXMgaW4uICBGdXJ0aGVybW9yZSwKKyAgLy8gcGxhY2Vob2xkZXIgdHlwZXMgd2lsbCBub3QgYmUgZGlzY292ZXJhYmxlIHZpYSBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoKQorICAvLyBhbmQgc2ltaWxhciBtZXRob2RzLCB3aGljaCBjb3VsZCBjb25mdXNlIHNvbWUgZGVzY3JpcHRvci1iYXNlZCBhbGdvcml0aG1zLgorICAvLyBHZW5lcmFsbHksIHRoZSByZXN1bHRzIG9mIHRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHJlbGllZCB1cG9uIGZvcgorICAvLyBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgIHZvaWQgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgeyBhbGxvd191bmtub3duXyA9IHRydWU7IH0KKworICAvLyBJbnRlcm5hbCBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBtZXRob2RzIE1VU1QgTk9UIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIHByb3RvMiBsaWJyYXJ5LgorICAvLyBUaGVzZSBtZXRob2RzIG1heSBjb250YWluIGhpZGRlbiBwaXRmYWxscyBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYQorICAvLyBmdXR1cmUgbGlicmFyeSB2ZXJzaW9uLgorCisgIC8vIENyZWF0ZSBhIERlc2NyaXB0b3JQb29sIHdoaWNoIGlzIG92ZXJsYWlkIG9uIHRvcCBvZiBzb21lIG90aGVyIHBvb2wuCisgIC8vIElmIHlvdSBzZWFyY2ggZm9yIGEgZGVzY3JpcHRvciBpbiB0aGUgb3ZlcmxheSBhbmQgaXQgaXMgbm90IGZvdW5kLCB0aGUKKyAgLy8gdW5kZXJsYXkgd2lsbCBiZSBzZWFyY2hlZCBhcyBhIGJhY2t1cC4gIElmIHRoZSB1bmRlcmxheSBoYXMgaXRzIG93bgorICAvLyB1bmRlcmxheSwgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIG5leHQsIGFuZCBzbyBvbi4gIFRoaXMgYWxzbyBtZWFucyB0aGF0CisgIC8vIGZpbGVzIGJ1aWx0IGluIHRoZSBvdmVybGF5IHdpbGwgYmUgY3Jvc3MtbGlua2VkIHdpdGggdGhlIHVuZGVybGF5J3MKKyAgLy8gZGVzY3JpcHRvcnMgaWYgbmVjZXNzYXJ5LiAgVGhlIHVuZGVybGF5IHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGNhbGxlcjsKKyAgLy8gaXQgbXVzdCByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgbmV3bHktY29uc3RydWN0ZWQgcG9vbC4KKyAgLy8KKyAgLy8gRXhhbXBsZTogIFNheSB5b3Ugd2FudCB0byBwYXJzZSBhIC5wcm90byBmaWxlIGF0IHJ1bnRpbWUgaW4gb3JkZXIgdG8gdXNlCisgIC8vIGl0cyB0eXBlIHdpdGggYSBEeW5hbWljTWVzc2FnZS4gIFNheSB0aGlzIC5wcm90byBmaWxlIGhhcyBkZXBlbmRlbmNpZXMsCisgIC8vIGJ1dCB5b3Uga25vdyB0aGF0IGFsbCB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYmUgdGhpbmdzIHRoYXQgYXJlIGFscmVhZHkKKyAgLy8gY29tcGlsZWQgaW50byB0aGUgYmluYXJ5LiAgRm9yIGVhc2Ugb2YgdXNlLCB5b3UnZCBsaWtlIHRvIGxvYWQgdGhlIHR5cGVzCisgIC8vIHJpZ2h0IG91dCBvZiBnZW5lcmF0ZWRfcG9vbCgpIHJhdGhlciB0aGFuIGhhdmUgdG8gcGFyc2UgcmVkdW5kYW50IGNvcGllcworICAvLyBvZiBhbGwgdGhlc2UgLnByb3RvcyBhbmQgcnVudGltZS4gIEJ1dCwgeW91IGRvbid0IHdhbnQgdG8gYWRkIHRoZSBwYXJzZWQKKyAgLy8gdHlwZXMgZGlyZWN0bHkgaW50byBnZW5lcmF0ZWRfcG9vbCgpOiB0aGlzIGlzIG5vdCBhbGxvd2VkLCBhbmQgd291bGQgYmUKKyAgLy8gYmFkIGRlc2lnbiBhbnl3YXkuICBTbywgaW5zdGVhZCwgeW91IGNvdWxkIHVzZSBnZW5lcmF0ZWRfcG9vbCgpIGFzIGFuCisgIC8vIHVuZGVybGF5IGZvciBhIG5ldyBEZXNjcmlwdG9yUG9vbCBpbiB3aGljaCB5b3UgYWRkIG9ubHkgdGhlIG5ldyBmaWxlLgorICAvLworICAvLyBXQVJOSU5HOiAgVXNlIG9mIHVuZGVybGF5cyBjYW4gbGVhZCB0byBtYW55IHN1YnRsZSBnb3RjaGFzLiAgSW5zdGVhZCwKKyAgLy8gICB0cnkgdG8gZm9ybXVsYXRlIHdoYXQgeW91IHdhbnQgdG8gZG8gaW4gdGVybXMgb2YgRGVzY3JpcHRvckRhdGFiYXNlcy4KKyAgZXhwbGljaXQgRGVzY3JpcHRvclBvb2woY29uc3QgRGVzY3JpcHRvclBvb2wqIHVuZGVybGF5KTsKKworICAvLyBDYWxsZWQgYnkgZ2VuZXJhdGVkIGNsYXNzZXMgYXQgaW5pdCB0aW1lIHRvIGFkZCB0aGVpciBkZXNjcmlwdG9ycyB0bworICAvLyBnZW5lcmF0ZWRfcG9vbC4gIERvIE5PVCBjYWxsIHRoaXMgaW4geW91ciBvd24gY29kZSEgIGZpbGVuYW1lIG11c3QgYmUgYQorICAvLyBwZXJtYW5lbnQgc3RyaW5nIChlLmcuIGEgc3RyaW5nIGxpdGVyYWwpLgorICBzdGF0aWMgdm9pZCBJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCisgICAgICBjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpOworCisKKyAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiAgR2V0cyBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBnZW5lcmF0ZWQgcG9vbC4KKyAgLy8gVGhpcyBpcyBjYWxsZWQgYXQgc3RhdGljLWluaXRpYWxpemF0aW9uIHRpbWUgb25seSwgc28gdGhyZWFkLXNhZmV0eSBpcworICAvLyBub3QgYSBjb25jZXJuLiAgSWYgYm90aCBhbiB1bmRlcmxheSBhbmQgYSBmYWxsYmFjayBkYXRhYmFzZSBhcmUgcHJlc2VudCwKKyAgLy8gdGhlIHVuZGVybGF5IHRha2VzIHByZWNlZGVuY2UuCisgIHN0YXRpYyBEZXNjcmlwdG9yUG9vbCogaW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKTsKKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBDaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiBCdWlsZEZpbGUoKSBzdWNoIHRoYXQgaXQKKyAgLy8gYWxsb3dzIHRoZSBmaWxlIHRvIG1ha2UgcmVmZXJlbmNlIHRvIG1lc3NhZ2UgdHlwZXMgZGVjbGFyZWQgaW4gb3RoZXIgZmlsZXMKKyAgLy8gd2hpY2ggaXQgZGlkIG5vdCBvZmZpY2lhbGx5IGRlY2xhcmUgYXMgZGVwZW5kZW5jaWVzLgorICB2b2lkIEludGVybmFsRG9udEVuZm9yY2VEZXBlbmRlbmNpZXMoKTsKKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgIHZvaWQgaW50ZXJuYWxfc2V0X3VuZGVybGF5KGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkgeworICAgIHVuZGVybGF5XyA9IHVuZGVybGF5OworICB9CisKKyAgLy8gRm9yIGludGVybmFsICh1bml0IHRlc3QpIHVzZSBvbmx5OiAgUmV0dXJucyB0cnVlIGlmIGEgRmlsZURlc2NyaXB0b3IgaGFzCisgIC8vIGJlZW4gY29uc3RydWN0ZWQgZm9yIHRoZSBnaXZlbiBmaWxlLCBmYWxzZSBvdGhlcndpc2UuICBVc2VmdWwgZm9yIHRlc3RpbmcKKyAgLy8gbGF6eSBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uIGJlaGF2aW9yLgorICBib29sIEludGVybmFsSXNGaWxlTG9hZGVkKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWVsZERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhIHN1Yi1zeW1ib2wgb2YgYW55IG5vbi1wYWNrYWdlCisgIC8vIGRlc2NyaXB0b3IgdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGVzY3JpcHRvciBwb29sLiAgKFRoZSBmdWxsCisgIC8vIGRlZmluaXRpb24gb2Ygc3VjaCB0eXBlcyBpcyBhbHJlYWR5IGtub3duLikKKyAgYm9vbCBJc1N1YlN5bWJvbE9mQnVpbHRUeXBlKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisKKyAgLy8gVHJpZXMgdG8gZmluZCBzb21ldGhpbmcgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIGFuZCBsaW5rIGluIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIHByb3RvIGZpbGUuICBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgaW4gd2hpY2ggY2FzZQorICAvLyB0aGUgY2FsbGVyIHNob3VsZCBzZWFyY2ggZm9yIHRoZSB0aGluZyBhZ2Fpbi4gIFRoZXNlIGFyZSBkZWNsYXJlZAorICAvLyBjb25zdCBiZWNhdXNlIHRoZXkgYXJlIGNhbGxlZCBieSAoc2VtYW50aWNhbGx5KSBjb25zdCBtZXRob2RzLgorICBib29sIFRyeUZpbmRGaWxlSW5GYWxsYmFja0RhdGFiYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGJvb2wgVHJ5RmluZFN5bWJvbEluRmFsbGJhY2tEYXRhYmFzZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICBib29sIFRyeUZpbmRFeHRlbnNpb25JbkZhbGxiYWNrRGF0YWJhc2UoY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bWJlcikgY29uc3Q7CisKKyAgLy8gTGlrZSBCdWlsZEZpbGUoKSBidXQgY2FsbGVkIGludGVybmFsbHkgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiBsb2FkZWQgZnJvbQorICAvLyBmYWxsYmFja19kYXRhYmFzZV8uICBEZWNsYXJlZCBjb25zdCBiZWNhdXNlIGl0IGlzIGNhbGxlZCBieSAoc2VtYW50aWNhbGx5KQorICAvLyBjb25zdCBtZXRob2RzLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlRnJvbURhdGFiYXNlKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSBjb25zdDsKKworICAvLyBJZiBmYWxsYmFja19kYXRhYmFzZV8gaXMgTlVMTCwgdGhpcyBpcyBOVUxMLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIGEgbXV0ZXgKKyAgLy8gd2hpY2ggbXVzdCBiZSBsb2NrZWQgd2hpbGUgYWNjZXNzaW5nIHRhYmxlc18uCisgIE11dGV4KiBtdXRleF87CisKKyAgLy8gU2VlIGNvbnN0cnVjdG9yLgorICBEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlXzsKKyAgRXJyb3JDb2xsZWN0b3IqIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXzsKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHVuZGVybGF5XzsKKworICAvLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgbG90IG9mIGhhc2ggbWFwcyB3aXRoIGNvbXBsaWNhdGVkIHR5cGVzIHRoYXQKKyAgLy8gd2UnZCBsaWtlIHRvIGtlZXAgb3V0IG9mIHRoZSBoZWFkZXIuCisgIGNsYXNzIFRhYmxlczsKKyAgc2NvcGVkX3B0cjxUYWJsZXM+IHRhYmxlc187CisKKyAgYm9vbCBlbmZvcmNlX2RlcGVuZGVuY2llc187CisgIGJvb2wgYWxsb3dfdW5rbm93bl87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyaXB0b3JQb29sKTsKK307CisKKy8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGhlc2UgbWFjcm9zIG1ha2VzIHRoaXMgcmVwZXRpdGl2ZSBjb2RlIG1vcmUgcmVhZGFibGUuCisjZGVmaW5lIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihDTEFTUywgRklFTEQsIFRZUEUpIFwKKyAgaW5saW5lIFRZUEUgQ0xBU1M6OkZJRUxEKCkgY29uc3QgeyByZXR1cm4gRklFTEQjI187IH0KKworLy8gU3RyaW5ncyBmaWVsZHMgYXJlIHN0b3JlZCBhcyBwb2ludGVycyBidXQgcmV0dXJuZWQgYXMgY29uc3QgcmVmZXJlbmNlcy4KKyNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihDTEFTUywgRklFTEQpIFwKKyAgaW5saW5lIGNvbnN0IHN0cmluZyYgQ0xBU1M6OkZJRUxEKCkgY29uc3QgeyByZXR1cm4gKkZJRUxEIyNfOyB9CisKKy8vIEFycmF5cyB0YWtlIGFuIGluZGV4IHBhcmFtZXRlciwgb2J2aW91c2x5LgorI2RlZmluZSBQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoQ0xBU1MsIEZJRUxELCBUWVBFKSBcCisgIGlubGluZSBUWVBFIENMQVNTOjpGSUVMRChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIEZJRUxEIyNzXyArIGluZGV4OyB9CisKKyNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoQ0xBU1MsIFRZUEUpIFwKKyAgaW5saW5lIGNvbnN0IFRZUEUmIENMQVNTOjpvcHRpb25zKCkgY29uc3QgeyByZXR1cm4gKm9wdGlvbnNfOyB9CisKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRGVzY3JpcHRvciwgbmFtZSkKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRGVzY3JpcHRvciwgZnVsbF9uYW1lKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBjb250YWluaW5nX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQorCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZmllbGRfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBuZXN0ZWRfdHlwZV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGVudW1fdHlwZV9jb3VudCwgaW50KQorCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgZmllbGQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgbmVzdGVkX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIGVudW1fdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3IqKQorCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZXh0ZW5zaW9uX3JhbmdlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZXh0ZW5zaW9uX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgZXh0ZW5zaW9uX3JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKERlc2NyaXB0b3IsIE1lc3NhZ2VPcHRpb25zKQorCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgbmFtZSkKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgbG93ZXJjYXNlX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgY2FtZWxjYXNlX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBudW1iZXIsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGlzX2V4dGVuc2lvbiwgYm9vbCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIHR5cGUsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGxhYmVsLCBGaWVsZERlc2NyaXB0b3I6OkxhYmVsKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGV4dGVuc2lvbl9zY29wZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZW51bV90eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBleHBlcmltZW50YWxfbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBGaWVsZE9wdGlvbnMpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBoYXNfZGVmYXVsdF92YWx1ZSwgYm9vbCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfaW50MzIgLCBpbnQzMiApCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2ludDY0ICwgaW50NjQgKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV91aW50MzIsIHVpbnQzMikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfdWludDY0LCB1aW50NjQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2Zsb2F0ICwgZmxvYXQgKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9kb3VibGUsIGRvdWJsZSkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfYm9vbCAgLCBib29sICApCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2VudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9zdHJpbmcpCisKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIG5hbWUpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgdmFsdWVfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgRW51bU9wdGlvbnMpCisKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRW51bVZhbHVlRGVzY3JpcHRvciwgbmFtZSkKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRW51bVZhbHVlRGVzY3JpcHRvciwgZnVsbF9uYW1lKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIG51bWJlciwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIHR5cGUsIGNvbnN0IEVudW1EZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIEVudW1WYWx1ZU9wdGlvbnMpCisKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIG5hbWUpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvciwgbWV0aG9kX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBTZXJ2aWNlT3B0aW9ucykKKworUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBuYW1lKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgc2VydmljZSwgY29uc3QgU2VydmljZURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIGlucHV0X3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIG91dHB1dF90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIE1ldGhvZE9wdGlvbnMpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBuYW1lKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgcGFja2FnZSkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgcG9vbCwgY29uc3QgRGVzY3JpcHRvclBvb2wqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBkZXBlbmRlbmN5X2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHB1YmxpY19kZXBlbmRlbmN5X2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHdlYWtfZGVwZW5kZW5jeV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGVfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZW51bV90eXBlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHNlcnZpY2VfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZXh0ZW5zaW9uX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgRmlsZU9wdGlvbnMpCisKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgbWVzc2FnZV90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZW51bV90eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKikKKworI3VuZGVmIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUgorI3VuZGVmIFBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IKKyN1bmRlZiBQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IKKworLy8gQSBmZXcgYWNjZXNzb3JzIGRpZmZlciBmcm9tIHRoZSBtYWNyb3MuLi4KKworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjppc19yZXF1aXJlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGxhYmVsKCkgPT0gTEFCRUxfUkVRVUlSRUQ7Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfb3B0aW9uYWwoKSBjb25zdCB7CisgIHJldHVybiBsYWJlbCgpID09IExBQkVMX09QVElPTkFMOworfQorCitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX3JlcGVhdGVkKCkgY29uc3QgeworICByZXR1cm4gbGFiZWwoKSA9PSBMQUJFTF9SRVBFQVRFRDsKK30KKworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjppc19wYWNrYWJsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzX3JlcGVhdGVkKCkgJiYgSXNUeXBlUGFja2FibGUodHlwZSgpKTsKK30KKworLy8gVG8gc2F2ZSBzcGFjZSwgaW5kZXgoKSBpcyBjb21wdXRlZCBieSBsb29raW5nIGF0IHRoZSBkZXNjcmlwdG9yJ3MgcG9zaXRpb24KKy8vIGluIHRoZSBwYXJlbnQncyBhcnJheSBvZiBjaGlsZHJlbi4KK2lubGluZSBpbnQgRmllbGREZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKKyAgaWYgKCFpc19leHRlbnNpb25fKSB7CisgICAgcmV0dXJuIHRoaXMgLSBjb250YWluaW5nX3R5cGVfLT5maWVsZHNfOworICB9IGVsc2UgaWYgKGV4dGVuc2lvbl9zY29wZV8gIT0gTlVMTCkgeworICAgIHJldHVybiB0aGlzIC0gZXh0ZW5zaW9uX3Njb3BlXy0+ZXh0ZW5zaW9uc187CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRoaXMgLSBmaWxlXy0+ZXh0ZW5zaW9uc187CisgIH0KK30KKworaW5saW5lIGludCBEZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKKyAgaWYgKGNvbnRhaW5pbmdfdHlwZV8gPT0gTlVMTCkgeworICAgIHJldHVybiB0aGlzIC0gZmlsZV8tPm1lc3NhZ2VfdHlwZXNfOworICB9IGVsc2UgeworICAgIHJldHVybiB0aGlzIC0gY29udGFpbmluZ190eXBlXy0+bmVzdGVkX3R5cGVzXzsKKyAgfQorfQorCitpbmxpbmUgaW50IEVudW1EZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKKyAgaWYgKGNvbnRhaW5pbmdfdHlwZV8gPT0gTlVMTCkgeworICAgIHJldHVybiB0aGlzIC0gZmlsZV8tPmVudW1fdHlwZXNfOworICB9IGVsc2UgeworICAgIHJldHVybiB0aGlzIC0gY29udGFpbmluZ190eXBlXy0+ZW51bV90eXBlc187CisgIH0KK30KKworaW5saW5lIGludCBFbnVtVmFsdWVEZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRoaXMgLSB0eXBlXy0+dmFsdWVzXzsKK30KKworaW5saW5lIGludCBTZXJ2aWNlRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIHJldHVybiB0aGlzIC0gZmlsZV8tPnNlcnZpY2VzXzsKK30KKworaW5saW5lIGludCBNZXRob2REZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRoaXMgLSBzZXJ2aWNlXy0+bWV0aG9kc187Cit9CisKK2lubGluZSBjb25zdCBjaGFyKiBGaWVsZERlc2NyaXB0b3I6OnR5cGVfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGtUeXBlVG9OYW1lW3R5cGVfXTsKK30KKworaW5saW5lIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBGaWVsZERlc2NyaXB0b3I6OmNwcF90eXBlKCkgY29uc3QgeworICByZXR1cm4ga1R5cGVUb0NwcFR5cGVNYXBbdHlwZV9dOworfQorCitpbmxpbmUgY29uc3QgY2hhciogRmllbGREZXNjcmlwdG9yOjpjcHBfdHlwZV9uYW1lKCkgY29uc3QgeworICByZXR1cm4ga0NwcFR5cGVUb05hbWVba1R5cGVUb0NwcFR5cGVNYXBbdHlwZV9dXTsKK30KKworaW5saW5lIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBGaWVsZERlc2NyaXB0b3I6OlR5cGVUb0NwcFR5cGUoVHlwZSB0eXBlKSB7CisgIHJldHVybiBrVHlwZVRvQ3BwVHlwZU1hcFt0eXBlXTsKK30KKworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjpJc1R5cGVQYWNrYWJsZShUeXBlIGZpZWxkX3R5cGUpIHsKKyAgcmV0dXJuIChmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgJiYKKyAgICAgICAgICBmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAmJgorICAgICAgICAgIGZpZWxkX3R5cGUgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICBmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyk7Cit9CisKK2lubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OmRlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBkZXBlbmRlbmNpZXNfW2luZGV4XTsKK30KKworaW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvcjo6cHVibGljX2RlcGVuZGVuY3koCisgICAgaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBkZXBlbmRlbmNpZXNfW3B1YmxpY19kZXBlbmRlbmNpZXNfW2luZGV4XV07Cit9CisKK2lubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OndlYWtfZGVwZW5kZW5jeSgKKyAgICBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGRlcGVuZGVuY2llc19bd2Vha19kZXBlbmRlbmNpZXNfW2luZGV4XV07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTM3OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKQEAgLTAsMCArMSw4MTQ2IEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bworCisjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCisjaW5jbHVkZSAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclNldF9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRmlsZURlc2NyaXB0b3JTZXRfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBGaWxlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBGaWVsZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRW51bURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU2VydmljZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIEZpbGVPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBNZXNzYWdlT3B0aW9uc19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRmllbGRPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1PcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBFbnVtT3B0aW9uc19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIEVudW1WYWx1ZU9wdGlvbnNfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU2VydmljZU9wdGlvbnNfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBNZXRob2RPcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBNZXRob2RPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU291cmNlQ29kZUluZm9fcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fcmVmbGVjdGlvbl8gPSBOVUxMOworCit9ICAvLyBuYW1lc3BhY2UKKworCit2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKSB7CisgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvciogZmlsZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+RmluZEZpbGVCeU5hbWUoCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKTsKKyAgR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCk7CisgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOworICBzdGF0aWMgY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yU2V0X29mZnNldHNfWzFdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JTZXQsIGZpbGVfKSwKKyAgfTsKKyAgRmlsZURlc2NyaXB0b3JTZXRfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfLAorICAgICAgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRmlsZURlc2NyaXB0b3JTZXRfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yU2V0LCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JTZXQsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihGaWxlRGVzY3JpcHRvclNldCkpOworICBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEpOworICBzdGF0aWMgY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bMTFdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgcGFja2FnZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgZGVwZW5kZW5jeV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgcHVibGljX2RlcGVuZGVuY3lfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHdlYWtfZGVwZW5kZW5jeV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgbWVzc2FnZV90eXBlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBlbnVtX3R5cGVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHNlcnZpY2VfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIGV4dGVuc2lvbl8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgc291cmNlX2NvZGVfaW5mb18pLAorICB9OworICBGaWxlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAorICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKEZpbGVEZXNjcmlwdG9yUHJvdG8pKTsKKyAgRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDIpOworICBzdGF0aWMgY29uc3QgaW50IERlc2NyaXB0b3JQcm90b19vZmZzZXRzX1s3XSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBmaWVsZF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBleHRlbnNpb25fKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgbmVzdGVkX3R5cGVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgZW51bV90eXBlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIGV4dGVuc2lvbl9yYW5nZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCisgIH07CisgIERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAorICAgICAgRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIERlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoRGVzY3JpcHRvclByb3RvKSk7CisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXyA9IERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMCk7CisgIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX29mZnNldHNfWzJdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBzdGFydF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBlbmRfKSwKKyAgfTsKKyAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZGVzY3JpcHRvcl8sCisgICAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UpKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMyk7CisgIHN0YXRpYyBjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bOF0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIG51bWJlcl8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIGxhYmVsXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgdHlwZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIHR5cGVfbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIGV4dGVuZGVlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgZGVmYXVsdF92YWx1ZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKKyAgfTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAorICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihGaWVsZERlc2NyaXB0b3JQcm90bykpOworICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3JfID0gRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcl8gPSBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+ZW51bV90eXBlKDEpOworICBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDQpOworICBzdGF0aWMgY29uc3QgaW50IEVudW1EZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bM10gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCB2YWx1ZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAorICB9OworICBFbnVtRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAorICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBFbnVtRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bURlc2NyaXB0b3JQcm90bywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKEVudW1EZXNjcmlwdG9yUHJvdG8pKTsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDUpOworICBzdGF0aWMgY29uc3QgaW50IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19vZmZzZXRzX1szXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBudW1iZXJfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAorICB9OworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKKyAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykpOworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDYpOworICBzdGF0aWMgY29uc3QgaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bM10gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlRGVzY3JpcHRvclByb3RvLCBtZXRob2RfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKKyAgfTsKKyAgU2VydmljZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKKyAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihTZXJ2aWNlRGVzY3JpcHRvclByb3RvKSk7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg3KTsKKyAgc3RhdGljIGNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bNF0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgaW5wdXRfdHlwZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBvdXRwdXRfdHlwZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCisgIH07CisgIE1ldGhvZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAorICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoTWV0aG9kRGVzY3JpcHRvclByb3RvKSk7CisgIEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDgpOworICBzdGF0aWMgY29uc3QgaW50IEZpbGVPcHRpb25zX29mZnNldHNfWzEwXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBqYXZhX3BhY2thZ2VfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBqYXZhX291dGVyX2NsYXNzbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfbXVsdGlwbGVfZmlsZXNfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIG9wdGltaXplX2Zvcl8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGdvX3BhY2thZ2VfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBjY19nZW5lcmljX3NlcnZpY2VzXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgamF2YV9nZW5lcmljX3NlcnZpY2VzXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgcHlfZ2VuZXJpY19zZXJ2aWNlc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCisgIH07CisgIEZpbGVPcHRpb25zX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBGaWxlT3B0aW9uc19kZXNjcmlwdG9yXywKKyAgICAgIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIEZpbGVPcHRpb25zX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIF9leHRlbnNpb25zXyksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihGaWxlT3B0aW9ucykpOworICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcl8gPSBGaWxlT3B0aW9uc19kZXNjcmlwdG9yXy0+ZW51bV90eXBlKDApOworICBNZXNzYWdlT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg5KTsKKyAgc3RhdGljIGNvbnN0IGludCBNZXNzYWdlT3B0aW9uc19vZmZzZXRzX1szXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAorICB9OworICBNZXNzYWdlT3B0aW9uc19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl8sCisgICAgICBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBNZXNzYWdlT3B0aW9uc19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBfZXh0ZW5zaW9uc18pLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoTWVzc2FnZU9wdGlvbnMpKTsKKyAgRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEwKTsKKyAgc3RhdGljIGNvbnN0IGludCBGaWVsZE9wdGlvbnNfb2Zmc2V0c19bN10gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIGN0eXBlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIHBhY2tlZF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBsYXp5XyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIGRlcHJlY2F0ZWRfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgZXhwZXJpbWVudGFsX21hcF9rZXlfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgd2Vha18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAorICB9OworICBGaWVsZE9wdGlvbnNfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXywKKyAgICAgIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBGaWVsZE9wdGlvbnNfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKEZpZWxkT3B0aW9ucykpOworICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcl8gPSBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKKyAgRW51bU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTEpOworICBzdGF0aWMgY29uc3QgaW50IEVudW1PcHRpb25zX29mZnNldHNfWzJdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bU9wdGlvbnMsIGFsbG93X2FsaWFzXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKKyAgfTsKKyAgRW51bU9wdGlvbnNfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEVudW1PcHRpb25zX2Rlc2NyaXB0b3JfLAorICAgICAgRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRW51bU9wdGlvbnNfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bU9wdGlvbnMsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKEVudW1PcHRpb25zKSk7CisgIEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTIpOworICBzdGF0aWMgY29uc3QgaW50IEVudW1WYWx1ZU9wdGlvbnNfb2Zmc2V0c19bMV0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAorICB9OworICBFbnVtVmFsdWVPcHRpb25zX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfLAorICAgICAgRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBFbnVtVmFsdWVPcHRpb25zX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIF9leHRlbnNpb25zXyksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihFbnVtVmFsdWVPcHRpb25zKSk7CisgIFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEzKTsKKyAgc3RhdGljIGNvbnN0IGludCBTZXJ2aWNlT3B0aW9uc19vZmZzZXRzX1sxXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAorICB9OworICBTZXJ2aWNlT3B0aW9uc19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgU2VydmljZU9wdGlvbnNfZGVzY3JpcHRvcl8sCisgICAgICBTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBTZXJ2aWNlT3B0aW9uc19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZU9wdGlvbnMsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VPcHRpb25zLCBfZXh0ZW5zaW9uc18pLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoU2VydmljZU9wdGlvbnMpKTsKKyAgTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNCk7CisgIHN0YXRpYyBjb25zdCBpbnQgTWV0aG9kT3B0aW9uc19vZmZzZXRzX1sxXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZE9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCisgIH07CisgIE1ldGhvZE9wdGlvbnNfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl8sCisgICAgICBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIE1ldGhvZE9wdGlvbnNfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZE9wdGlvbnMsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKE1ldGhvZE9wdGlvbnMpKTsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNSk7CisgIHN0YXRpYyBjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbl9vZmZzZXRzX1s3XSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIG5hbWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIGlkZW50aWZpZXJfdmFsdWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIHBvc2l0aXZlX2ludF92YWx1ZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgbmVnYXRpdmVfaW50X3ZhbHVlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBkb3VibGVfdmFsdWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIHN0cmluZ192YWx1ZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgYWdncmVnYXRlX3ZhbHVlXyksCisgIH07CisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl8sCisgICAgICBVbmludGVycHJldGVkT3B0aW9uOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoVW5pbnRlcnByZXRlZE9wdGlvbikpOworICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2Rlc2NyaXB0b3JfID0gVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMCk7CisgIHN0YXRpYyBjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9vZmZzZXRzX1syXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQsIG5hbWVfcGFydF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgaXNfZXh0ZW5zaW9uXyksCisgIH07CisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl8sCisgICAgICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCkpOworICBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNik7CisgIHN0YXRpYyBjb25zdCBpbnQgU291cmNlQ29kZUluZm9fb2Zmc2V0c19bMV0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mbywgbG9jYXRpb25fKSwKKyAgfTsKKyAgU291cmNlQ29kZUluZm9fcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfLAorICAgICAgU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgU291cmNlQ29kZUluZm9fb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm8sIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihTb3VyY2VDb2RlSW5mbykpOworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZXNjcmlwdG9yXyA9IFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZSgwKTsKKyAgc3RhdGljIGNvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9vZmZzZXRzX1s0XSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCBwYXRoXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgc3Bhbl8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIGxlYWRpbmdfY29tbWVudHNfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCB0cmFpbGluZ19jb21tZW50c18pLAorICB9OworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fZGVzY3JpcHRvcl8sCisgICAgICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKSk7Cit9CisKK25hbWVzcGFjZSB7CisKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8pOworaW5saW5lIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc19vbmNlXywKKyAgICAgICAgICAgICAgICAgJnByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8pOworfQorCit2b2lkIHByb3RvYnVmX1JlZ2lzdGVyVHlwZXMoY29uc3QgOjpzdGQ6OnN0cmluZyYpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfLCAmRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXywgJkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgRW51bURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJlNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJk1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8sICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl8sICZNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBFbnVtT3B0aW9uc19kZXNjcmlwdG9yXywgJkVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgU2VydmljZU9wdGlvbnNfZGVzY3JpcHRvcl8sICZTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXywgJk1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl8sICZVbmludGVycHJldGVkT3B0aW9uOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2Rlc2NyaXB0b3JfLCAmVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl8sICZTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fZGVzY3JpcHRvcl8sICZTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCkgeworICBkZWxldGUgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgRmlsZURlc2NyaXB0b3JTZXRfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIEZpbGVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICBkZWxldGUgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIEZpZWxkRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICBkZWxldGUgRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBFbnVtRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICBkZWxldGUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgU2VydmljZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBNZXRob2REZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBGaWxlT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIE1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIE1lc3NhZ2VPcHRpb25zX3JlZmxlY3Rpb25fOworICBkZWxldGUgRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIEZpZWxkT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIEVudW1PcHRpb25zX3JlZmxlY3Rpb25fOworICBkZWxldGUgRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBFbnVtVmFsdWVPcHRpb25zX3JlZmxlY3Rpb25fOworICBkZWxldGUgU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgU2VydmljZU9wdGlvbnNfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIE1ldGhvZE9wdGlvbnNfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBVbmludGVycHJldGVkT3B0aW9uOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIFVuaW50ZXJwcmV0ZWRPcHRpb25fcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBTb3VyY2VDb2RlSW5mb19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3JlZmxlY3Rpb25fOworfQorCit2b2lkIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKSB7CisgIHN0YXRpYyBib29sIGFscmVhZHlfaGVyZSA9IGZhbHNlOworICBpZiAoYWxyZWFkeV9oZXJlKSByZXR1cm47CisgIGFscmVhZHlfaGVyZSA9IHRydWU7CisgIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCisgICAgIlxuIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXDAyMlwwMTdnb29nIgorICAgICJsZS5wcm90b2J1ZlwiR1xuXDAyMUZpbGVEZXNjcmlwdG9yU2V0XDAyMjJcblwwMDRmaWxlIgorICAgICJcMDMwXDAwMSBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQIgorICAgICJyb3RvXCJcMzEzXDAwM1xuXDAyM0ZpbGVEZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxIgorICAgICIoXHRcMDIyXDAxN1xuXDAwN3BhY2thZ2VcMDMwXDAwMiBcMDAxKFx0XDAyMlwwMjJcblxuZGVwZW5kZW5jeVwwMzBcMDAzIFwwMDMoXHRcMDIyIgorICAgICJcMDMxXG5cMDIxcHVibGljX2RlcGVuZGVuY3lcMDMwXG4gXDAwMyhcMDA1XDAyMlwwMjdcblwwMTd3ZWFrX2RlcGVuIgorICAgICJkZW5jeVwwMzBcMDEzIFwwMDMoXDAwNVwwMjI2XG5cMDE0bWVzc2FnZV90eXBlXDAzMFwwMDQgXDAwMyhcMDEzMiAuZ29vZyIKKyAgICAibGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvXDAyMjdcblx0ZW51bV90eXBlIgorICAgICJcMDMwXDAwNSBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQIgorICAgICJyb3RvXDAyMjhcblwwMDdzZXJ2aWNlXDAzMFwwMDYgXDAwMyhcMDEzMlwnLmdvb2dsZS5wcm90b2J1Zi4iCisgICAgIlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9cMDIyOFxuXHRleHRlbnNpb25cMDMwXDAwNyBcMDAzKCIKKyAgICAiXDAxMzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byIKKyAgICAiXDAyMi1cblwwMDdvcHRpb25zXDAzMFwwMTAgXDAwMShcMDEzMlwwMzQuZ29vZ2xlLnByb3RvYnVmLkZpbGUiCisgICAgIk9wdGlvbnNcMDIyOVxuXDAyMHNvdXJjZV9jb2RlX2luZm9cMDMwXHQgXDAwMShcMDEzMlwwMzcuZ29vZyIKKyAgICAibGUucHJvdG9idWYuU291cmNlQ29kZUluZm9cIlwyNTFcMDAzXG5cMDE3RGVzY3JpcHRvIgorICAgICJyUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMjRcblwwMDVmaWVsZFwwMzBcMDAyIFwwMDMoXDAxMzIlLmdvIgorICAgICJvZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvXDAyMjhcblx0ZXgiCisgICAgInRlbnNpb25cMDMwXDAwNiBcMDAzKFwwMTMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXMiCisgICAgImNyaXB0b3JQcm90b1wwMjI1XG5cMDEzbmVzdGVkX3R5cGVcMDMwXDAwMyBcMDAzKFwwMTMyIC5nb29nIgorICAgICJsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9cMDIyN1xuXHRlbnVtX3R5cGUiCisgICAgIlwwMzBcMDA0IFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclAiCisgICAgInJvdG9cMDIySFxuXDAxN2V4dGVuc2lvbl9yYW5nZVwwMzBcMDA1IFwwMDMoXDAxMzIvLmdvb2dsZS5wIgorICAgICJyb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZVwwMjIwIgorICAgICJcblwwMDdvcHRpb25zXDAzMFwwMDcgXDAwMShcMDEzMlwwMzcuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZyIKKyAgICAiZU9wdGlvbnNcMDMyLFxuXDAxNkV4dGVuc2lvblJhbmdlXDAyMlxyXG5cMDA1c3RhcnRcMDMwXDAwMSBcMDAxKCIKKyAgICAiXDAwNVwwMjJcMDEzXG5cMDAzZW5kXDAzMFwwMDIgXDAwMShcMDA1XCJcMjI0XDAwNVxuXDAyNEZpZWxkRGVzY3JpcHRvclByb3RvXDAyMiIKKyAgICAiXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMTZcblwwMDZudW1iZXJcMDMwXDAwMyBcMDAxKFwwMDVcMDIyOlxuXDAwNWxhYmVsXDAzMFwwMDQiCisgICAgIiBcMDAxKFwwMTYyKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHIiCisgICAgIm90by5MYWJlbFwwMjI4XG5cMDA0dHlwZVwwMzBcMDA1IFwwMDEoXDAxNjIqLmdvb2dsZS5wcm90b2J1IgorICAgICJmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVcMDIyXDAyMVxuXHR0eXBlX25hbWUiCisgICAgIlwwMzBcMDA2IFwwMDEoXHRcMDIyXDAyMFxuXDAxMGV4dGVuZGVlXDAzMFwwMDIgXDAwMShcdFwwMjJcMDI1XG5ccmRlZmF1bHRfdmFsdSIKKyAgICAiZVwwMzBcMDA3IFwwMDEoXHRcMDIyLlxuXDAwN29wdGlvbnNcMDMwXDAxMCBcMDAxKFwwMTMyXDAzNS5nb29nbGUucHJvdG9iIgorICAgICJ1Zi5GaWVsZE9wdGlvbnNcIlwyNjZcMDAyXG5cMDA0VHlwZVwwMjJcMDE3XG5cMDEzVFlQRV9ET1VCTEVcMDIwIgorICAgICJcMDAxXDAyMlwwMTZcblxuVFlQRV9GTE9BVFwwMjBcMDAyXDAyMlwwMTZcblxuVFlQRV9JTlQ2NFwwMjBcMDAzXDAyMlwwMTdcblwwMTNUWVAiCisgICAgIkVfVUlOVDY0XDAyMFwwMDRcMDIyXDAxNlxuXG5UWVBFX0lOVDMyXDAyMFwwMDVcMDIyXDAyMFxuXDAxNFRZUEVfRklYRUQiCisgICAgIjY0XDAyMFwwMDZcMDIyXDAyMFxuXDAxNFRZUEVfRklYRUQzMlwwMjBcMDA3XDAyMlxyXG5cdFRZUEVfQk9PTFwwMjBcMDEwXDAyMlwwMTdcbiIKKyAgICAiXDAxM1RZUEVfU1RSSU5HXDAyMFx0XDAyMlwwMTZcblxuVFlQRV9HUk9VUFwwMjBcblwwMjJcMDIwXG5cMDE0VFlQRV9NIgorICAgICJFU1NBR0VcMDIwXDAxM1wwMjJcMDE2XG5cblRZUEVfQllURVNcMDIwXDAxNFwwMjJcMDE3XG5cMDEzVFlQRV9VSU5UMzJcMDIwIgorICAgICJcclwwMjJcclxuXHRUWVBFX0VOVU1cMDIwXDAxNlwwMjJcMDIxXG5cclRZUEVfU0ZJWEVEMzJcMDIwXDAxN1wwMjJcMDIxXG5cclQiCisgICAgIllQRV9TRklYRUQ2NFwwMjBcMDIwXDAyMlwwMTdcblwwMTNUWVBFX1NJTlQzMlwwMjBcMDIxXDAyMlwwMTdcblwwMTNUWVBFXyIKKyAgICAiU0lOVDY0XDAyMFwwMjJcIkNcblwwMDVMYWJlbFwwMjJcMDIyXG5cMDE2TEFCRUxfT1BUSU9OQUxcMDIwXDAwMVwwMjJcMDIyXG4iCisgICAgIlwwMTZMQUJFTF9SRVFVSVJFRFwwMjBcMDAyXDAyMlwwMjJcblwwMTZMQUJFTF9SRVBFQVRFRFwwMjBcMDAzXCJcMjE0XDAwMSIKKyAgICAiXG5cMDIzRW51bURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyOFxuXDAwNXYiCisgICAgImFsdWVcMDMwXDAwMiBcMDAzKFwwMTMyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGUiCisgICAgInNjcmlwdG9yUHJvdG9cMDIyLVxuXDAwN29wdGlvbnNcMDMwXDAwMyBcMDAxKFwwMTMyXDAzNC5nb29nbGUuIgorICAgICJwcm90b2J1Zi5FbnVtT3B0aW9uc1wibFxuXDAzMEVudW1WYWx1ZURlc2NyaXAiCisgICAgInRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDE2XG5cMDA2bnVtYmVyXDAzMFwwMDIgXDAwMShcMDA1XDAyMjIiCisgICAgIlxuXDAwN29wdGlvbnNcMDMwXDAwMyBcMDAxKFwwMTMyIS5nb29nbGUucHJvdG9idWYuRW51bVZhIgorICAgICJsdWVPcHRpb25zXCJcMjIwXDAwMVxuXDAyNlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuIgorICAgICJcMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyNlxuXDAwNm1ldGhvZFwwMzBcMDAyIFwwMDMoXDAxMzImLmdvb2dsZS5wcm8iCisgICAgInRvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1wwMjIwXG5cMDA3b3B0aW9uc1wwMzBcMDAzIgorICAgICIgXDAwMShcMDEzMlwwMzcuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zXCJcMTc3XG4iCisgICAgIlwwMjVNZXRob2REZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMjJcblxuIgorICAgICJpbnB1dF90eXBlXDAzMFwwMDIgXDAwMShcdFwwMjJcMDIzXG5cMDEzb3V0cHV0X3R5cGVcMDMwXDAwMyBcMDAxKFx0XDAyMi9cbiIKKyAgICAiXDAwN29wdGlvbnNcMDMwXDAwNCBcMDAxKFwwMTMyXDAzNi5nb29nbGUucHJvdG9idWYuTWV0aG9kTyIKKyAgICAicHRpb25zXCJcMzUxXDAwM1xuXDAxM0ZpbGVPcHRpb25zXDAyMlwwMjRcblwwMTRqYXZhX3BhY2thZ2VcMDMwXDAwMSIKKyAgICAiIFwwMDEoXHRcMDIyXDAzNFxuXDAyNGphdmFfb3V0ZXJfY2xhc3NuYW1lXDAzMFwwMTAgXDAwMShcdFwwMjJcIlxuXDAyM2phIgorICAgICJ2YV9tdWx0aXBsZV9maWxlc1wwMzBcbiBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMixcblwwMzVqYXZhX2ciCisgICAgImVuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXDAzMFwwMjQgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJGXG5cMDE0IgorICAgICJvcHRpbWl6ZV9mb3JcMDMwXHQgXDAwMShcMDE2MikuZ29vZ2xlLnByb3RvYnVmLkZpbCIKKyAgICAiZU9wdGlvbnMuT3B0aW1pemVNb2RlOlwwMDVTUEVFRFwwMjJcMDIyXG5cbmdvX3BhY2thIgorICAgICJnZVwwMzBcMDEzIFwwMDEoXHRcMDIyXCJcblwwMjNjY19nZW5lcmljX3NlcnZpY2VzXDAzMFwwMjAgXDAwMShcMDEwOlwwMDVmIgorICAgICJhbHNlXDAyMiRcblwwMjVqYXZhX2dlbmVyaWNfc2VydmljZXNcMDMwXDAyMSBcMDAxKFwwMTA6XDAwNWZhbCIKKyAgICAic2VcMDIyXCJcblwwMjNweV9nZW5lcmljX3NlcnZpY2VzXDAzMFwwMjIgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJDIgorICAgICJcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbGUucCIKKyAgICAicm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCI6XG5cMDE0T3B0aW1pemVNIgorICAgICJvZGVcMDIyXHRcblwwMDVTUEVFRFwwMjBcMDAxXDAyMlxyXG5cdENPREVfU0laRVwwMjBcMDAyXDAyMlwwMjBcblwwMTRMSVRFX1JVIgorICAgICJOVElNRVwwMjBcMDAzKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJcMjcwXDAwMVxuXDAxNk1lc3NhZ2VPcHRpb25zXDAyMiZcbiIKKyAgICAiXDAyN21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XDAzMFwwMDEgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjIuXG4iCisgICAgIlwwMzdub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXDAzMFwwMDIgXDAwMShcMDEwOlwwMDUiCisgICAgImZhbHNlXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nIgorICAgICJvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XDAxMFwzNTBcMDA3XDAyMCIKKyAgICAiXDIwMFwyMDBcMjAwXDIwMFwwMDJcIlwyNzZcMDAyXG5cMDE0RmllbGRPcHRpb25zXDAyMjpcblwwMDVjdHlwZVwwMzBcMDAxIFwwMDEoXDAxNjIjLiIKKyAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZTpcMDA2U1RSSSIKKyAgICAiTkdcMDIyXDAxNlxuXDAwNnBhY2tlZFwwMzBcMDAyIFwwMDEoXDAxMFwwMjJcMDIzXG5cMDA0bGF6eVwwMzBcMDA1IFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyIgorICAgICJcMDMxXG5cbmRlcHJlY2F0ZWRcMDMwXDAwMyBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMzRcblwwMjRleHBlcmltZW50IgorICAgICJhbF9tYXBfa2V5XDAzMFx0IFwwMDEoXHRcMDIyXDAyM1xuXDAwNHdlYWtcMDMwXG4gXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJDXG4iCisgICAgIlwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbGUucHIiCisgICAgIm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCIvXG5cMDA1Q1R5cGVcMDIyXG5cblwwMDZTIgorICAgICJUUklOR1wwMjBcMDAwXDAyMlwwMTBcblwwMDRDT1JEXDAyMFwwMDFcMDIyXDAyMFxuXDAxNFNUUklOR19QSUVDRVwwMjBcMDAyKlx0XDAxMFwzNTBcMDA3IgorICAgICJcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcInhcblwwMTNFbnVtT3B0aW9uc1wwMjJcMDMxXG5cMDEzYWxsb3dfYWxpYXNcMDMwXDAwMiBcMDAxIgorICAgICIoXDAxMDpcMDA0dHJ1ZVwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiIKKyAgICAiJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFwwMTAiCisgICAgIlwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJiXG5cMDIwRW51bVZhbHVlT3B0aW9uc1wwMjJDXG5cMDI0dW5pbnRlcnAiCisgICAgInJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYuVW4iCisgICAgImludGVycHJldGVkT3B0aW9uKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJgXG5cMDE2U2VydmljZU8iCisgICAgInB0aW9uc1wwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuIgorICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwNyIKKyAgICAiXDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJfXG5cck1ldGhvZE9wdGlvbnNcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0ZWQiCisgICAgIl9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXIiCisgICAgInByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwiXDIzNlwwMDJcblwwMjNVbmludGVycHJldGUiCisgICAgImRPcHRpb25cMDIyO1xuXDAwNG5hbWVcMDMwXDAwMiBcMDAzKFwwMTMyLS5nb29nbGUucHJvdG9idWYuIgorICAgICJVbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0XDAyMlwwMzBcblwwMjBpZGVudGlmaSIKKyAgICAiZXJfdmFsdWVcMDMwXDAwMyBcMDAxKFx0XDAyMlwwMzJcblwwMjJwb3NpdGl2ZV9pbnRfdmFsdWVcMDMwXDAwNCBcMDAxIgorICAgICIoXDAwNFwwMjJcMDMyXG5cMDIybmVnYXRpdmVfaW50X3ZhbHVlXDAzMFwwMDUgXDAwMShcMDAzXDAyMlwwMjRcblwwMTRkb3VibGUiCisgICAgIl92YWx1ZVwwMzBcMDA2IFwwMDEoXDAwMVwwMjJcMDI0XG5cMDE0c3RyaW5nX3ZhbHVlXDAzMFwwMDcgXDAwMShcMDE0XDAyMlwwMjdcblwwMTdhZyIKKyAgICAiZ3JlZ2F0ZV92YWx1ZVwwMzBcMDEwIFwwMDEoXHRcMDMyM1xuXDAxME5hbWVQYXJ0XDAyMlwwMjFcblx0bmFtZV8iCisgICAgInBhcnRcMDMwXDAwMSBcMDAyKFx0XDAyMlwwMjRcblwwMTRpc19leHRlbnNpb25cMDMwXDAwMiBcMDAyKFwwMTBcIlwyNjFcMDAxXG5cMDE2U291IgorICAgICJyY2VDb2RlSW5mb1wwMjI6XG5cMDEwbG9jYXRpb25cMDMwXDAwMSBcMDAzKFwwMTMyKC5nb29nbGUucCIKKyAgICAicm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblwwMzJjXG5cMDEwTG9jYXQiCisgICAgImlvblwwMjJcMDIwXG5cMDA0cGF0aFwwMzBcMDAxIFwwMDMoXDAwNUJcMDAyXDAyMFwwMDFcMDIyXDAyMFxuXDAwNHNwYW5cMDMwXDAwMiBcMDAzKFwwMDVCXDAwMlwwMjBcMDAxXDAyMiIKKyAgICAiXDAzMFxuXDAyMGxlYWRpbmdfY29tbWVudHNcMDMwXDAwMyBcMDAxKFx0XDAyMlwwMzFcblwwMjF0cmFpbGluZ19jbyIKKyAgICAibW1lbnRzXDAzMFwwMDQgXDAwMShcdEIpXG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcMDIwRGVzIgorICAgICJjcmlwdG9yUHJvdG9zSFwwMDEiLCA0MTM1KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoCisgICAgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIiwgJnByb3RvYnVmX1JlZ2lzdGVyVHlwZXMpOworICBGaWxlRGVzY3JpcHRvclNldDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmlsZURlc2NyaXB0b3JTZXQoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmlsZURlc2NyaXB0b3JQcm90bygpOworICBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IERlc2NyaXB0b3JQcm90bygpOworICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpOworICBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmllbGREZXNjcmlwdG9yUHJvdG8oKTsKKyAgRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRW51bURlc2NyaXB0b3JQcm90bygpOworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpOworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCk7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgTWV0aG9kRGVzY3JpcHRvclByb3RvKCk7CisgIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBGaWxlT3B0aW9ucygpOworICBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgTWVzc2FnZU9wdGlvbnMoKTsKKyAgRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBGaWVsZE9wdGlvbnMoKTsKKyAgRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEVudW1PcHRpb25zKCk7CisgIEVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEVudW1WYWx1ZU9wdGlvbnMoKTsKKyAgU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFNlcnZpY2VPcHRpb25zKCk7CisgIE1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IE1ldGhvZE9wdGlvbnMoKTsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbigpOworICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCk7CisgIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBTb3VyY2VDb2RlSW5mbygpOworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKKyAgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIE1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIFNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIE1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJnByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90byk7Cit9CisKKy8vIEZvcmNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYmUgY2FsbGVkIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbiB0aW1lLgorc3RydWN0IFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90byB7CisgIFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpIHsKKyAgICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIH0KK30gc3RhdGljX2Rlc2NyaXB0b3JfaW5pdGlhbGl6ZXJfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclNldDo6a0ZpbGVGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK0ZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVzY3JpcHRvclNldCgpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworRmlsZURlc2NyaXB0b3JTZXQ6OkZpbGVEZXNjcmlwdG9yU2V0KGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitGaWxlRGVzY3JpcHRvclNldDo6fkZpbGVEZXNjcmlwdG9yU2V0KCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclNldDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yU2V0OjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0ZpbGVEZXNjcmlwdG9yU2V0KiBGaWxlRGVzY3JpcHRvclNldDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitGaWxlRGVzY3JpcHRvclNldCogRmlsZURlc2NyaXB0b3JTZXQ6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBGaWxlRGVzY3JpcHRvclNldDsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclNldDo6Q2xlYXIoKSB7CisgIGZpbGVfLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclNldDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2ZpbGU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2ZpbGUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2ZpbGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclNldDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMSwgdGhpcy0+ZmlsZShpKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBGaWxlRGVzY3JpcHRvclNldDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAxLCB0aGlzLT5maWxlKGkpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRmlsZURlc2NyaXB0b3JTZXQ6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWxlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5maWxlKGkpKTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0KiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRmlsZURlc2NyaXB0b3JTZXQqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6Ok1lcmdlRnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBmaWxlXy5NZXJnZUZyb20oZnJvbS5maWxlXyk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkNvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclNldDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPmZpbGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlN3YXAoRmlsZURlc2NyaXB0b3JTZXQqIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgZmlsZV8uU3dhcCgmb3RoZXItPmZpbGVfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWxlRGVzY3JpcHRvclNldDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRmlsZURlc2NyaXB0b3JTZXRfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBGaWxlRGVzY3JpcHRvclNldF9yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1BhY2thZ2VGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprRGVwZW5kZW5jeUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQdWJsaWNEZXBlbmRlbmN5RmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1dlYWtEZXBlbmRlbmN5RmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprU291cmNlQ29kZUluZm9GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OkZpbGVEZXNjcmlwdG9yUHJvdG8oKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKKyAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIHNvdXJjZV9jb2RlX2luZm9fID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitGaWxlRGVzY3JpcHRvclByb3RvOjpGaWxlRGVzY3JpcHRvclByb3RvKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIHBhY2thZ2VfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvcHRpb25zXyA9IE5VTEw7CisgIHNvdXJjZV9jb2RlX2luZm9fID0gTlVMTDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworRmlsZURlc2NyaXB0b3JQcm90bzo6fkZpbGVEZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAocGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBwYWNrYWdlXzsKKyAgfQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAgIGRlbGV0ZSBvcHRpb25zXzsKKyAgICBkZWxldGUgc291cmNlX2NvZGVfaW5mb187CisgIH0KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0ZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBGaWxlRGVzY3JpcHRvclByb3RvOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19wYWNrYWdlKCkpIHsKKyAgICAgIGlmIChwYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIHBhY2thZ2VfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoX2hhc19iaXRzX1s5IC8gMzJdICYgKDB4ZmZ1IDw8ICg5ICUgMzIpKSkgeworICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OkNsZWFyKCk7CisgICAgfQorICAgIGlmIChoYXNfc291cmNlX2NvZGVfaW5mbygpKSB7CisgICAgICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7CisgICAgfQorICB9CisgIGRlcGVuZGVuY3lfLkNsZWFyKCk7CisgIHB1YmxpY19kZXBlbmRlbmN5Xy5DbGVhcigpOworICB3ZWFrX2RlcGVuZGVuY3lfLkNsZWFyKCk7CisgIG1lc3NhZ2VfdHlwZV8uQ2xlYXIoKTsKKyAgZW51bV90eXBlXy5DbGVhcigpOworICBzZXJ2aWNlXy5DbGVhcigpOworICBleHRlbnNpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX3BhY2thZ2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfcGFja2FnZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfcGFja2FnZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPnBhY2thZ2UoKS5kYXRhKCksIHRoaXMtPnBhY2thZ2UoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9kZXBlbmRlbmN5OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2RlcGVuZGVuY3k6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5hZGRfZGVwZW5kZW5jeSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmRlcGVuZGVuY3kodGhpcy0+ZGVwZW5kZW5jeV9zaXplKCkgLSAxKS5kYXRhKCksCisgICAgICAgICAgICB0aGlzLT5kZXBlbmRlbmN5KHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpIC0gMSkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfZGVwZW5kZW5jeTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX21lc3NhZ2VfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfbWVzc2FnZV90eXBlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9tZXNzYWdlX3R5cGUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX21lc3NhZ2VfdHlwZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2VudW1fdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICAgICAgY2FzZSA1OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2VudW1fdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZW51bV90eXBlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9lbnVtX3R5cGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9zZXJ2aWNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICAgICAgY2FzZSA2OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3NlcnZpY2U6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3NlcnZpY2UoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX3NlcnZpY2U7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9leHRlbnNpb247CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CisgICAgICBjYXNlIDc6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZXh0ZW5zaW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9leHRlbnNpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2V4dGVuc2lvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworICAgICAgY2FzZSA4OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzQpKSBnb3RvIHBhcnNlX3NvdXJjZV9jb2RlX2luZm87CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworICAgICAgY2FzZSA5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3NvdXJjZV9jb2RlX2luZm86CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODApKSBnb3RvIHBhcnNlX3B1YmxpY19kZXBlbmRlbmN5OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKKyAgICAgIGNhc2UgMTA6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9wdWJsaWNfZGVwZW5kZW5jeToKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICAxLCA4MCwgaW5wdXQsIHRoaXMtPm11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSkpKTsKKyAgICAgICAgfSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKQorICAgICAgICAgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgICAgICAgICAgICAgICBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZU5vSW5saW5lPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDgwKSkgZ290byBwYXJzZV9wdWJsaWNfZGVwZW5kZW5jeTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODgpKSBnb3RvIHBhcnNlX3dlYWtfZGVwZW5kZW5jeTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOworICAgICAgY2FzZSAxMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX3dlYWtfZGVwZW5kZW5jeToKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICAxLCA4OCwgaW5wdXQsIHRoaXMtPm11dGFibGVfd2Vha19kZXBlbmRlbmN5KCkpKSk7CisgICAgICAgIH0gZWxzZSBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykKKyAgICAgICAgICAgICAgICAgICA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgICAgICAgICAgICAgICAgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODgpKSBnb3RvIHBhcnNlX3dlYWtfZGVwZW5kZW5jeTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CisgIGlmIChoYXNfcGFja2FnZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPnBhY2thZ2UoKS5kYXRhKCksIHRoaXMtPnBhY2thZ2UoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMiwgdGhpcy0+cGFja2FnZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICB0aGlzLT5kZXBlbmRlbmN5KGkpLmRhdGEoKSwgdGhpcy0+ZGVwZW5kZW5jeShpKS5sZW5ndGgoKSwKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDMsIHRoaXMtPmRlcGVuZGVuY3koaSksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA0LCB0aGlzLT5tZXNzYWdlX3R5cGUoaSksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNSwgdGhpcy0+ZW51bV90eXBlKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNiwgdGhpcy0+c2VydmljZShpKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNywgdGhpcy0+ZXh0ZW5zaW9uKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgOCwgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyBzb3VyY2VfY29kZV9pbmZvID0gOTsKKyAgaWYgKGhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgOSwgdGhpcy0+c291cmNlX2NvZGVfaW5mbygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKAorICAgICAgMTAsIHRoaXMtPnB1YmxpY19kZXBlbmRlbmN5KGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgd2Vha19kZXBlbmRlbmN5ID0gMTE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+d2Vha19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoCisgICAgICAxMSwgdGhpcy0+d2Vha19kZXBlbmRlbmN5KGkpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAyOworICBpZiAoaGFzX3BhY2thZ2UoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5wYWNrYWdlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAyLCB0aGlzLT5wYWNrYWdlKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5kZXBlbmRlbmN5KGkpLmRhdGEoKSwgdGhpcy0+ZGVwZW5kZW5jeShpKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVTdHJpbmdUb0FycmF5KDMsIHRoaXMtPmRlcGVuZGVuY3koaSksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDQsIHRoaXMtPm1lc3NhZ2VfdHlwZShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDUsIHRoaXMtPmVudW1fdHlwZShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zZXJ2aWNlX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgNiwgdGhpcy0+c2VydmljZShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA3LCB0aGlzLT5leHRlbnNpb24oaSksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDgsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisgIGlmIChoYXNfc291cmNlX2NvZGVfaW5mbygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOSwgdGhpcy0+c291cmNlX2NvZGVfaW5mbygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlSW50MzJUb0FycmF5KDEwLCB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPndlYWtfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlSW50MzJUb0FycmF5KDExLCB0aGlzLT53ZWFrX2RlcGVuZGVuY3koaSksIHRhcmdldCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBGaWxlRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKKyAgICBpZiAoaGFzX3BhY2thZ2UoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+cGFja2FnZSgpKTsKKyAgICB9CisKKyAgfQorICBpZiAoX2hhc19iaXRzX1s5IC8gMzJdICYgKDB4ZmZ1IDw8ICg5ICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgICB0aGlzLT5vcHRpb25zKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisgICAgaWYgKGhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgICB0aGlzLT5zb3VyY2VfY29kZV9pbmZvKCkpOworICAgIH0KKworICB9CisgIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZGVwZW5kZW5jeV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICB0aGlzLT5kZXBlbmRlbmN5KGkpKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CisgIHsKKyAgICBpbnQgZGF0YV9zaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnQzMlNpemUodGhpcy0+cHVibGljX2RlcGVuZGVuY3koaSkpOworICAgIH0KKyAgICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkgKyBkYXRhX3NpemU7CisgIH0KKworICAvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKKyAgeworICAgIGludCBkYXRhX3NpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+d2Vha19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnQzMlNpemUodGhpcy0+d2Vha19kZXBlbmRlbmN5KGkpKTsKKyAgICB9CisgICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+d2Vha19kZXBlbmRlbmN5X3NpemUoKSArIGRhdGFfc2l6ZTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPm1lc3NhZ2VfdHlwZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bWVzc2FnZV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5tZXNzYWdlX3R5cGUoaSkpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDU7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmVudW1fdHlwZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5lbnVtX3R5cGUoaSkpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5zZXJ2aWNlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zZXJ2aWNlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5zZXJ2aWNlKGkpKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPmV4dGVuc2lvbihpKSk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGRlcGVuZGVuY3lfLk1lcmdlRnJvbShmcm9tLmRlcGVuZGVuY3lfKTsKKyAgcHVibGljX2RlcGVuZGVuY3lfLk1lcmdlRnJvbShmcm9tLnB1YmxpY19kZXBlbmRlbmN5Xyk7CisgIHdlYWtfZGVwZW5kZW5jeV8uTWVyZ2VGcm9tKGZyb20ud2Vha19kZXBlbmRlbmN5Xyk7CisgIG1lc3NhZ2VfdHlwZV8uTWVyZ2VGcm9tKGZyb20ubWVzc2FnZV90eXBlXyk7CisgIGVudW1fdHlwZV8uTWVyZ2VGcm9tKGZyb20uZW51bV90eXBlXyk7CisgIHNlcnZpY2VfLk1lcmdlRnJvbShmcm9tLnNlcnZpY2VfKTsKKyAgZXh0ZW5zaW9uXy5NZXJnZUZyb20oZnJvbS5leHRlbnNpb25fKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3BhY2thZ2UoKSkgeworICAgICAgc2V0X3BhY2thZ2UoZnJvbS5wYWNrYWdlKCkpOworICAgIH0KKyAgfQorICBpZiAoZnJvbS5faGFzX2JpdHNfWzkgLyAzMl0gJiAoMHhmZnUgPDwgKDkgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgeworICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKKyAgICAgIG11dGFibGVfc291cmNlX2NvZGVfaW5mbygpLT46Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvOjpNZXJnZUZyb20oZnJvbS5zb3VyY2VfY29kZV9pbmZvKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+bWVzc2FnZV90eXBlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5lbnVtX3R5cGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5zZXJ2aWNlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5leHRlbnNpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTd2FwKEZpbGVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOworICAgIHN0ZDo6c3dhcChwYWNrYWdlXywgb3RoZXItPnBhY2thZ2VfKTsKKyAgICBkZXBlbmRlbmN5Xy5Td2FwKCZvdGhlci0+ZGVwZW5kZW5jeV8pOworICAgIHB1YmxpY19kZXBlbmRlbmN5Xy5Td2FwKCZvdGhlci0+cHVibGljX2RlcGVuZGVuY3lfKTsKKyAgICB3ZWFrX2RlcGVuZGVuY3lfLlN3YXAoJm90aGVyLT53ZWFrX2RlcGVuZGVuY3lfKTsKKyAgICBtZXNzYWdlX3R5cGVfLlN3YXAoJm90aGVyLT5tZXNzYWdlX3R5cGVfKTsKKyAgICBlbnVtX3R5cGVfLlN3YXAoJm90aGVyLT5lbnVtX3R5cGVfKTsKKyAgICBzZXJ2aWNlXy5Td2FwKCZvdGhlci0+c2VydmljZV8pOworICAgIGV4dGVuc2lvbl8uU3dhcCgmb3RoZXItPmV4dGVuc2lvbl8pOworICAgIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKKyAgICBzdGQ6OnN3YXAoc291cmNlX2NvZGVfaW5mb18sIG90aGVyLT5zb3VyY2VfY29kZV9pbmZvXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRmlsZURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRmlsZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpbGVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmtTdGFydEZpZWxkTnVtYmVyOworY29uc3QgaW50IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6a0VuZEZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBzdGFydF8gPSAwOworICBlbmRfID0gMDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjp+RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpTaGFyZWREdG9yKCkgeworICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXzsKK30KKworY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgc3RhcnRfID0gMDsKKyAgICBlbmRfID0gMDsKKyAgfQorICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmc3RhcnRfKSkpOworICAgICAgICAgIHNldF9oYXNfc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9lbmQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfZW5kOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmVuZF8pKSk7CisgICAgICAgICAgc2V0X2hhc19lbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgaWYgKGhhc19zdGFydCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMSwgdGhpcy0+c3RhcnQoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CisgIGlmIChoYXNfZW5kKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigyLCB0aGlzLT5lbmQoKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgaWYgKGhhc19zdGFydCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDEsIHRoaXMtPnN0YXJ0KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICBpZiAoaGFzX2VuZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPmVuZCgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICAgIGlmIChoYXNfc3RhcnQoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKKyAgICAgICAgICB0aGlzLT5zdGFydCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICAgIGlmIChoYXNfZW5kKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCisgICAgICAgICAgdGhpcy0+ZW5kKCkpOworICAgIH0KKworICB9CisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpNZXJnZUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfc3RhcnQoKSkgeworICAgICAgc2V0X3N0YXJ0KGZyb20uc3RhcnQoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19lbmQoKSkgeworICAgICAgc2V0X2VuZChmcm9tLmVuZCgpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlN3YXAoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChzdGFydF8sIG90aGVyLT5zdGFydF8pOworICAgIHN0ZDo6c3dhcChlbmRfLCBvdGhlci0+ZW5kXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprRmllbGRGaWVsZE51bWJlcjsKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtFeHRlbnNpb25GaWVsZE51bWJlcjsKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtFeHRlbnNpb25SYW5nZUZpZWxkTnVtYmVyOworY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK0Rlc2NyaXB0b3JQcm90bzo6RGVzY3JpcHRvclByb3RvKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKKyAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Cit9CisKK0Rlc2NyaXB0b3JQcm90bzo6RGVzY3JpcHRvclByb3RvKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvcHRpb25zXyA9IE5VTEw7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0Rlc2NyaXB0b3JQcm90bzo6fkRlc2NyaXB0b3JQcm90bygpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgICBkZWxldGUgb3B0aW9uc187CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvdG87Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoaGFzX25hbWUoKSkgeworICAgICAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgbmFtZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM6OkNsZWFyKCk7CisgICAgfQorICB9CisgIGZpZWxkXy5DbGVhcigpOworICBleHRlbnNpb25fLkNsZWFyKCk7CisgIG5lc3RlZF90eXBlXy5DbGVhcigpOworICBlbnVtX3R5cGVfLkNsZWFyKCk7CisgIGV4dGVuc2lvbl9yYW5nZV8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIERlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9maWVsZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2ZpZWxkOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9maWVsZCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfZmllbGQ7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9uZXN0ZWRfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKKyAgICAgIGNhc2UgMzogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9uZXN0ZWRfdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbmVzdGVkX3R5cGUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX25lc3RlZF90eXBlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfZW51bV90eXBlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZW51bV90eXBlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9lbnVtX3R5cGUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX2VudW1fdHlwZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2V4dGVuc2lvbl9yYW5nZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgICAgICBjYXNlIDU6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZXh0ZW5zaW9uX3JhbmdlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9leHRlbnNpb25fcmFuZ2UoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2V4dGVuc2lvbl9yYW5nZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2V4dGVuc2lvbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNjsKKyAgICAgIGNhc2UgNjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9leHRlbnNpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2V4dGVuc2lvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1MCkpIGdvdG8gcGFyc2VfZXh0ZW5zaW9uOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1OCkpIGdvdG8gcGFyc2Vfb3B0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CisgICAgICBjYXNlIDc6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2Vfb3B0aW9uczoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfb3B0aW9ucygpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmllbGRfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMiwgdGhpcy0+ZmllbGQoaSksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMywgdGhpcy0+bmVzdGVkX3R5cGUoaSksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNCwgdGhpcy0+ZW51bV90eXBlKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNSwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA2LCB0aGlzLT5leHRlbnNpb24oaSksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA3LCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpZWxkX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+ZmllbGQoaSksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAzLCB0aGlzLT5uZXN0ZWRfdHlwZShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDQsIHRoaXMtPmVudW1fdHlwZShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgNSwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlKGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDYsIHRoaXMtPmV4dGVuc2lvbihpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CisgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgNywgdGhpcy0+b3B0aW9ucygpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgICB0aGlzLT5vcHRpb25zKCkpOworICAgIH0KKworICB9CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWVsZF9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmllbGRfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPmZpZWxkKGkpKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNjsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPmV4dGVuc2lvbihpKSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPm5lc3RlZF90eXBlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5uZXN0ZWRfdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+bmVzdGVkX3R5cGUoaSkpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmVudW1fdHlwZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5lbnVtX3R5cGUoaSkpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPmV4dGVuc2lvbl9yYW5nZShpKSk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBmaWVsZF8uTWVyZ2VGcm9tKGZyb20uZmllbGRfKTsKKyAgZXh0ZW5zaW9uXy5NZXJnZUZyb20oZnJvbS5leHRlbnNpb25fKTsKKyAgbmVzdGVkX3R5cGVfLk1lcmdlRnJvbShmcm9tLm5lc3RlZF90eXBlXyk7CisgIGVudW1fdHlwZV8uTWVyZ2VGcm9tKGZyb20uZW51bV90eXBlXyk7CisgIGV4dGVuc2lvbl9yYW5nZV8uTWVyZ2VGcm9tKGZyb20uZXh0ZW5zaW9uX3JhbmdlXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7CisgICAgICBzZXRfbmFtZShmcm9tLm5hbWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKKyAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPmZpZWxkKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5leHRlbnNpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRfdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+bmVzdGVkX3R5cGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPmVudW1fdHlwZShpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghdGhpcy0+b3B0aW9ucygpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6U3dhcChEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOworICAgIGZpZWxkXy5Td2FwKCZvdGhlci0+ZmllbGRfKTsKKyAgICBleHRlbnNpb25fLlN3YXAoJm90aGVyLT5leHRlbnNpb25fKTsKKyAgICBuZXN0ZWRfdHlwZV8uU3dhcCgmb3RoZXItPm5lc3RlZF90eXBlXyk7CisgICAgZW51bV90eXBlXy5Td2FwKCZvdGhlci0+ZW51bV90eXBlXyk7CisgICAgZXh0ZW5zaW9uX3JhbmdlXy5Td2FwKCZvdGhlci0+ZXh0ZW5zaW9uX3JhbmdlXyk7CisgICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIERlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yXzsKK30KK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2godmFsdWUpIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjoKKyAgICBjYXNlIDc6CisgICAgY2FzZSA4OgorICAgIGNhc2UgOToKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTE6CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDEzOgorICAgIGNhc2UgMTQ6CisgICAgY2FzZSAxNToKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMTc6CisgICAgY2FzZSAxODoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEU7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZMT0FUOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQ2NDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDY0OworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQ2NDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQzMjsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQk9PTDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9HUk9VUDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRTsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQllURVM7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQzMjsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTTsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVEMzI7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDY0OworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzI7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NJTlQ2NDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGVfTUlOOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZV9NQVg7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGVfQVJSQVlTSVpFOworI2VuZGlmICAvLyBfTVNDX1ZFUgorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yXzsKK30KK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9NSU47Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfTUFYOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOdW1iZXJGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0xhYmVsRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprRXh0ZW5kZWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0RlZmF1bHRWYWx1ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRmllbGREZXNjcmlwdG9yUHJvdG86OkZpZWxkRGVzY3JpcHRvclByb3RvKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworICBvcHRpb25zXyA9IGNvbnN0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitGaWVsZERlc2NyaXB0b3JQcm90bzo6RmllbGREZXNjcmlwdG9yUHJvdG8oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBudW1iZXJfID0gMDsKKyAgbGFiZWxfID0gMTsKKyAgdHlwZV8gPSAxOworICB0eXBlX25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBleHRlbmRlZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIGRlZmF1bHRfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvcHRpb25zXyA9IE5VTEw7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvOjp+RmllbGREZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKHR5cGVfbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSB0eXBlX25hbWVfOworICB9CisgIGlmIChleHRlbmRlZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBleHRlbmRlZV87CisgIH0KKyAgaWYgKGRlZmF1bHRfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgZGVmYXVsdF92YWx1ZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgICBkZWxldGUgb3B0aW9uc187CisgIH0KK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitGaWVsZERlc2NyaXB0b3JQcm90byogRmllbGREZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBGaWVsZERlc2NyaXB0b3JQcm90bzsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBudW1iZXJfID0gMDsKKyAgICBsYWJlbF8gPSAxOworICAgIHR5cGVfID0gMTsKKyAgICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgICBpZiAodHlwZV9uYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIHR5cGVfbmFtZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChoYXNfZXh0ZW5kZWUoKSkgeworICAgICAgaWYgKGV4dGVuZGVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGV4dGVuZGVlXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICAgIGlmIChkZWZhdWx0X3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczo6Q2xlYXIoKTsKKyAgICB9CisgIH0KKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2V4dGVuZGVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9leHRlbmRlZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfZXh0ZW5kZWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5leHRlbmRlZSgpLmRhdGEoKSwgdGhpcy0+ZXh0ZW5kZWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9udW1iZXI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfbnVtYmVyOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJm51bWJlcl8pKSk7CisgICAgICAgICAgc2V0X2hhc19udW1iZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDMyKSkgZ290byBwYXJzZV9sYWJlbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworICAgICAgY2FzZSA0OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfbGFiZWw6CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKKyAgICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKHZhbHVlKSkgeworICAgICAgICAgICAgc2V0X2xhYmVsKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsID4odmFsdWUpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoNCwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQwKSkgZ290byBwYXJzZV90eXBlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OworICAgICAgY2FzZSA1OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfdHlwZToKKyAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOworICAgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZCh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgPih2YWx1ZSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCg1LCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX3R5cGVfbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworICAgICAgY2FzZSA2OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3R5cGVfbmFtZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfdHlwZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+dHlwZV9uYW1lKCkuZGF0YSgpLCB0aGlzLT50eXBlX25hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9kZWZhdWx0X3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworICAgICAgY2FzZSA3OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2RlZmF1bHRfdmFsdWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2RlZmF1bHRfdmFsdWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg2NikpIGdvdG8gcGFyc2Vfb3B0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworICAgICAgY2FzZSA4OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKKyAgaWYgKGhhc19leHRlbmRlZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmV4dGVuZGVlKCkuZGF0YSgpLCB0aGlzLT5leHRlbmRlZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAyLCB0aGlzLT5leHRlbmRlZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgaWYgKGhhc19udW1iZXIoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDMsIHRoaXMtPm51bWJlcigpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7CisgIGlmIChoYXNfbGFiZWwoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCisgICAgICA0LCB0aGlzLT5sYWJlbCgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OworICBpZiAoaGFzX3R5cGUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCisgICAgICA1LCB0aGlzLT50eXBlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKKyAgaWYgKGhhc190eXBlX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT50eXBlX25hbWUoKS5kYXRhKCksIHRoaXMtPnR5cGVfbmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA2LCB0aGlzLT50eXBlX25hbWUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKKyAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA3LCB0aGlzLT5kZWZhdWx0X3ZhbHVlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgOCwgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CisgIGlmIChoYXNfZXh0ZW5kZWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5leHRlbmRlZSgpLmRhdGEoKSwgdGhpcy0+ZXh0ZW5kZWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDIsIHRoaXMtPmV4dGVuZGVlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworICBpZiAoaGFzX251bWJlcigpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPm51bWJlcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7CisgIGlmIChoYXNfbGFiZWwoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgNCwgdGhpcy0+bGFiZWwoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKKyAgaWYgKGhhc190eXBlKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKKyAgICAgIDUsIHRoaXMtPnR5cGUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPnR5cGVfbmFtZSgpLmRhdGEoKSwgdGhpcy0+dHlwZV9uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICA2LCB0aGlzLT50eXBlX25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKKyAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgNywgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7CisgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOCwgdGhpcy0+b3B0aW9ucygpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgICBpZiAoaGFzX251bWJlcigpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAorICAgICAgICAgIHRoaXMtPm51bWJlcigpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKKyAgICBpZiAoaGFzX2xhYmVsKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5sYWJlbCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7CisgICAgaWYgKGhhc190eXBlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT50eXBlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworICAgIGlmIChoYXNfdHlwZV9uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPnR5cGVfbmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworICAgIGlmIChoYXNfZXh0ZW5kZWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+ZXh0ZW5kZWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworICAgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgICAgdGhpcy0+b3B0aW9ucygpKTsKKyAgICB9CisKKyAgfQorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX251bWJlcigpKSB7CisgICAgICBzZXRfbnVtYmVyKGZyb20ubnVtYmVyKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfbGFiZWwoKSkgeworICAgICAgc2V0X2xhYmVsKGZyb20ubGFiZWwoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc190eXBlKCkpIHsKKyAgICAgIHNldF90eXBlKGZyb20udHlwZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgICBzZXRfdHlwZV9uYW1lKGZyb20udHlwZV9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfZXh0ZW5kZWUoKSkgeworICAgICAgc2V0X2V4dGVuZGVlKGZyb20uZXh0ZW5kZWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICAgIHNldF9kZWZhdWx0X3ZhbHVlKGZyb20uZGVmYXVsdF92YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgeworICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U3dhcChGaWVsZERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobmFtZV8sIG90aGVyLT5uYW1lXyk7CisgICAgc3RkOjpzd2FwKG51bWJlcl8sIG90aGVyLT5udW1iZXJfKTsKKyAgICBzdGQ6OnN3YXAobGFiZWxfLCBvdGhlci0+bGFiZWxfKTsKKyAgICBzdGQ6OnN3YXAodHlwZV8sIG90aGVyLT50eXBlXyk7CisgICAgc3RkOjpzd2FwKHR5cGVfbmFtZV8sIG90aGVyLT50eXBlX25hbWVfKTsKKyAgICBzdGQ6OnN3YXAoZXh0ZW5kZWVfLCBvdGhlci0+ZXh0ZW5kZWVfKTsKKyAgICBzdGQ6OnN3YXAoZGVmYXVsdF92YWx1ZV8sIG90aGVyLT5kZWZhdWx0X3ZhbHVlXyk7CisgICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEZpZWxkRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpZWxkRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBFbnVtRGVzY3JpcHRvclByb3RvOjprVmFsdWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBFbnVtRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRW51bURlc2NyaXB0b3JQcm90bzo6RW51bURlc2NyaXB0b3JQcm90bygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworICBvcHRpb25zXyA9IGNvbnN0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqPigmOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKK30KKworRW51bURlc2NyaXB0b3JQcm90bzo6RW51bURlc2NyaXB0b3JQcm90byhjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvcHRpb25zXyA9IE5VTEw7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0VudW1EZXNjcmlwdG9yUHJvdG86On5FbnVtRGVzY3JpcHRvclByb3RvKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgICBkZWxldGUgb3B0aW9uc187CisgIH0KK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitFbnVtRGVzY3JpcHRvclByb3RvKiBFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0VudW1EZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBFbnVtRGVzY3JpcHRvclByb3RvOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9uczo6Q2xlYXIoKTsKKyAgICB9CisgIH0KKyAgdmFsdWVfLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3ZhbHVlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF92YWx1ZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfdmFsdWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9vcHRpb25zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICAgIGNhc2UgMzogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9vcHRpb25zOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnZhbHVlX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDIsIHRoaXMtPnZhbHVlKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMywgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEVudW1EZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnZhbHVlX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+dmFsdWUoaSksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDMsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEVudW1EZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgfQorCisgIH0KKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT52YWx1ZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dmFsdWVfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPnZhbHVlKGkpKTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8qPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgdmFsdWVfLk1lcmdlRnJvbShmcm9tLnZhbHVlXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7CisgICAgICBzZXRfbmFtZShmcm9tLm5hbWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKKyAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRW51bURlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT52YWx1ZShpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghdGhpcy0+b3B0aW9ucygpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlN3YXAoRW51bURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobmFtZV8sIG90aGVyLT5uYW1lXyk7CisgICAgdmFsdWVfLlN3YXAoJm90aGVyLT52YWx1ZV8pOworICAgIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBFbnVtRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRW51bURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtOdW1iZXJGaWVsZE51bWJlcjsKK2NvbnN0IGludCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIG9wdGlvbnNfID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKK30KKworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIG51bWJlcl8gPSAwOworICBvcHRpb25zXyA9IE5VTEw7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6fkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgICBkZWxldGUgb3B0aW9uc187CisgIH0KK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG87Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoaGFzX25hbWUoKSkgeworICAgICAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgbmFtZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIG51bWJlcl8gPSAwOworICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczo6Q2xlYXIoKTsKKyAgICB9CisgIH0KKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9udW1iZXI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfbnVtYmVyOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJm51bWJlcl8pKSk7CisgICAgICAgICAgc2V0X2hhc19udW1iZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9vcHRpb25zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoaGFzX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisgIGlmIChoYXNfbnVtYmVyKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigyLCB0aGlzLT5udW1iZXIoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMywgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoaGFzX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxLCB0aGlzLT5uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworICBpZiAoaGFzX251bWJlcigpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPm51bWJlcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDMsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICBpZiAoaGFzX25hbWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+bmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworICAgIGlmIChoYXNfbnVtYmVyKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCisgICAgICAgICAgdGhpcy0+bnVtYmVyKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgfQorCisgIH0KKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX251bWJlcigpKSB7CisgICAgICBzZXRfbnVtYmVyKGZyb20ubnVtYmVyKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfb3B0aW9ucygpKSB7CisgICAgICBtdXRhYmxlX29wdGlvbnMoKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgaWYgKCF0aGlzLT5vcHRpb25zKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobmFtZV8sIG90aGVyLT5uYW1lXyk7CisgICAgc3RkOjpzd2FwKG51bWJlcl8sIG90aGVyLT5udW1iZXJfKTsKKyAgICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtNZXRob2RGaWVsZE51bWJlcjsKK2NvbnN0IGludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2VydmljZURlc2NyaXB0b3JQcm90bygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworICBvcHRpb25zXyA9IGNvbnN0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqPigmOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKK30KKworU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2VydmljZURlc2NyaXB0b3JQcm90byhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvcHRpb25zXyA9IE5VTEw7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG86On5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgICBkZWxldGUgb3B0aW9uc187CisgIH0KK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU2VydmljZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9uczo6Q2xlYXIoKTsKKyAgICB9CisgIH0KKyAgbWV0aG9kXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9tZXRob2Q7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byBtZXRob2QgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX21ldGhvZDoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbWV0aG9kKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9tZXRob2Q7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9vcHRpb25zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICAgIGNhc2UgMzogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9vcHRpb25zOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXRob2Rfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMiwgdGhpcy0+bWV0aG9kKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMywgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXRob2Rfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAyLCB0aGlzLT5tZXRob2QoaSksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDMsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgfQorCisgIH0KKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bWV0aG9kX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXRob2Rfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPm1ldGhvZChpKSk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIG1ldGhvZF8uTWVyZ2VGcm9tKGZyb20ubWV0aG9kXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7CisgICAgICBzZXRfbmFtZShmcm9tLm5hbWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKKyAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZF9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+bWV0aG9kKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgaWYgKCF0aGlzLT5vcHRpb25zKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6U3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKKyAgICBtZXRob2RfLlN3YXAoJm90aGVyLT5tZXRob2RfKTsKKyAgICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgU2VydmljZURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprSW5wdXRUeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3V0cHV0VHlwZUZpZWxkTnVtYmVyOworY29uc3QgaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK01ldGhvZERlc2NyaXB0b3JQcm90bzo6TWV0aG9kRGVzY3JpcHRvclByb3RvKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKKyAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqPigmOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1ldGhvZERlc2NyaXB0b3JQcm90byhjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgaW5wdXRfdHlwZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIG91dHB1dF90eXBlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgb3B0aW9uc18gPSBOVUxMOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitNZXRob2REZXNjcmlwdG9yUHJvdG86On5NZXRob2REZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIG5hbWVfOworICB9CisgIGlmIChpbnB1dF90eXBlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGlucHV0X3R5cGVfOworICB9CisgIGlmIChvdXRwdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBvdXRwdXRfdHlwZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgICBkZWxldGUgb3B0aW9uc187CisgIH0KK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gTWV0aG9kRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworTWV0aG9kRGVzY3JpcHRvclByb3RvKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworTWV0aG9kRGVzY3JpcHRvclByb3RvKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBNZXRob2REZXNjcmlwdG9yUHJvdG87Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoaGFzX25hbWUoKSkgeworICAgICAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgbmFtZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChoYXNfaW5wdXRfdHlwZSgpKSB7CisgICAgICBpZiAoaW5wdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBpbnB1dF90eXBlXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19vdXRwdXRfdHlwZSgpKSB7CisgICAgICBpZiAob3V0cHV0X3R5cGVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgb3V0cHV0X3R5cGVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnM6OkNsZWFyKCk7CisgICAgfQorICB9CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfaW5wdXRfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9pbnB1dF90eXBlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pbnB1dF90eXBlKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+aW5wdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+aW5wdXRfdHlwZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX291dHB1dF90eXBlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKKyAgICAgIGNhc2UgMzogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9vdXRwdXRfdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfb3V0cHV0X3R5cGUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5vdXRwdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+b3V0cHV0X3R5cGUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDM0KSkgZ290byBwYXJzZV9vcHRpb25zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworICAgICAgY2FzZSA0OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoaGFzX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKKyAgaWYgKGhhc19pbnB1dF90eXBlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+aW5wdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+aW5wdXRfdHlwZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAyLCB0aGlzLT5pbnB1dF90eXBlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOworICBpZiAoaGFzX291dHB1dF90eXBlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+b3V0cHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPm91dHB1dF90eXBlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDMsIHRoaXMtPm91dHB1dF90eXBlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7CisgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDQsIHRoaXMtPm9wdGlvbnMoKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOworICBpZiAoaGFzX2lucHV0X3R5cGUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5pbnB1dF90eXBlKCkuZGF0YSgpLCB0aGlzLT5pbnB1dF90eXBlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAyLCB0aGlzLT5pbnB1dF90eXBlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOworICBpZiAoaGFzX291dHB1dF90eXBlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+b3V0cHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPm91dHB1dF90eXBlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAzLCB0aGlzLT5vdXRwdXRfdHlwZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDQsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICBpZiAoaGFzX25hbWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+bmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7CisgICAgaWYgKGhhc19pbnB1dF90eXBlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmlucHV0X3R5cGUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKKyAgICBpZiAoaGFzX291dHB1dF90eXBlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm91dHB1dF90eXBlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgfQorCisgIH0KKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2lucHV0X3R5cGUoKSkgeworICAgICAgc2V0X2lucHV0X3R5cGUoZnJvbS5pbnB1dF90eXBlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfb3V0cHV0X3R5cGUoKSkgeworICAgICAgc2V0X291dHB1dF90eXBlKGZyb20ub3V0cHV0X3R5cGUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKKyAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CisgICAgfQorICB9CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKKyAgICBzdGQ6OnN3YXAoaW5wdXRfdHlwZV8sIG90aGVyLT5pbnB1dF90eXBlXyk7CisgICAgc3RkOjpzd2FwKG91dHB1dF90eXBlXywgb3RoZXItPm91dHB1dF90eXBlXyk7CisgICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gTWV0aG9kRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gTWV0aG9kRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcl87Cit9Citib29sIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2godmFsdWUpIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpTUEVFRDsKK2NvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6Q09ERV9TSVpFOworY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Citjb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6Ok9wdGltaXplTW9kZV9NSU47Citjb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6Ok9wdGltaXplTW9kZV9NQVg7Citjb25zdCBpbnQgRmlsZU9wdGlvbnM6Ok9wdGltaXplTW9kZV9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtKYXZhUGFja2FnZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YU91dGVyQ2xhc3NuYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtKYXZhTXVsdGlwbGVGaWxlc0ZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaEZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprT3B0aW1pemVGb3JGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a0dvUGFja2FnZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprQ2NHZW5lcmljU2VydmljZXNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a0phdmFHZW5lcmljU2VydmljZXNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a1B5R2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitGaWxlT3B0aW9uczo6RmlsZU9wdGlvbnMoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK0ZpbGVPcHRpb25zOjpGaWxlT3B0aW9ucyhjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgamF2YV9wYWNrYWdlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBqYXZhX211bHRpcGxlX2ZpbGVzXyA9IGZhbHNlOworICBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSBmYWxzZTsKKyAgb3B0aW1pemVfZm9yXyA9IDE7CisgIGdvX3BhY2thZ2VfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBjY19nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICBqYXZhX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIHB5X2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0ZpbGVPcHRpb25zOjp+RmlsZU9wdGlvbnMoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBGaWxlT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKGphdmFfcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBqYXZhX3BhY2thZ2VfOworICB9CisgIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBqYXZhX291dGVyX2NsYXNzbmFtZV87CisgIH0KKyAgaWYgKGdvX3BhY2thZ2VfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgZ29fcGFja2FnZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIEZpbGVPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmlsZU9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEZpbGVPcHRpb25zJiBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRmlsZU9wdGlvbnMqIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0ZpbGVPcHRpb25zKiBGaWxlT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IEZpbGVPcHRpb25zOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpDbGVhcigpIHsKKyAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgeworICAgICAgaWYgKGphdmFfcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBqYXZhX3BhY2thZ2VfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKKyAgICAgIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gZmFsc2U7CisgICAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gZmFsc2U7CisgICAgb3B0aW1pemVfZm9yXyA9IDE7CisgICAgaWYgKGhhc19nb19wYWNrYWdlKCkpIHsKKyAgICAgIGlmIChnb19wYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGdvX3BhY2thZ2VfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBjY19nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICAgIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgfQorICBpZiAoX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgeworICAgIHB5X2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIH0KKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBGaWxlT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9qYXZhX3BhY2thZ2UoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5qYXZhX3BhY2thZ2UoKS5kYXRhKCksIHRoaXMtPmphdmFfcGFja2FnZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKKyAgICAgIGNhc2UgODogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9qYXZhX291dGVyX2NsYXNzbmFtZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDcyKSkgZ290byBwYXJzZV9vcHRpbWl6ZV9mb3I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICAgICAgY2FzZSA5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2Vfb3B0aW1pemVfZm9yOgorICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7CisgICAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0lzVmFsaWQodmFsdWUpKSB7CisgICAgICAgICAgICBzZXRfb3B0aW1pemVfZm9yKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSA+KHZhbHVlKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDksIHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MCkpIGdvdG8gcGFyc2VfamF2YV9tdWx0aXBsZV9maWxlczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAxMDogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX2phdmFfbXVsdGlwbGVfZmlsZXM6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZqYXZhX211bHRpcGxlX2ZpbGVzXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDkwKSkgZ290byBwYXJzZV9nb19wYWNrYWdlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKyAgICAgIGNhc2UgMTE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZ29fcGFja2FnZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfZ29fcGFja2FnZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmdvX3BhY2thZ2UoKS5kYXRhKCksIHRoaXMtPmdvX3BhY2thZ2UoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyOCkpIGdvdG8gcGFyc2VfY2NfZ2VuZXJpY19zZXJ2aWNlczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAxNjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX2NjX2dlbmVyaWNfc2VydmljZXM6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZjY19nZW5lcmljX3NlcnZpY2VzXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEzNikpIGdvdG8gcGFyc2VfamF2YV9nZW5lcmljX3NlcnZpY2VzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMTc6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9qYXZhX2dlbmVyaWNfc2VydmljZXM6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZqYXZhX2dlbmVyaWNfc2VydmljZXNfKSkpOworICAgICAgICAgIHNldF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNDQpKSBnb3RvIHBhcnNlX3B5X2dlbmVyaWNfc2VydmljZXM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMTg6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9weV9nZW5lcmljX3NlcnZpY2VzOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmcHlfZ2VuZXJpY19zZXJ2aWNlc18pKSk7CisgICAgICAgICAgc2V0X2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNjApKSBnb3RvIHBhcnNlX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAyMDogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfKSkpOworICAgICAgICAgIHNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgICAgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBGaWxlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CisgIGlmIChoYXNfamF2YV9wYWNrYWdlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+amF2YV9wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5qYXZhX3BhY2thZ2UoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+amF2YV9wYWNrYWdlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OworICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5kYXRhKCksIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDgsIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICBpZiAoaGFzX29wdGltaXplX2ZvcigpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKKyAgICAgIDksIHRoaXMtPm9wdGltaXplX2ZvcigpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxMCwgdGhpcy0+amF2YV9tdWx0aXBsZV9maWxlcygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKyAgaWYgKGhhc19nb19wYWNrYWdlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+Z29fcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+Z29fcGFja2FnZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxMSwgdGhpcy0+Z29fcGFja2FnZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxNiwgdGhpcy0+Y2NfZ2VuZXJpY19zZXJ2aWNlcygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMTcsIHRoaXMtPmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxOCwgdGhpcy0+cHlfZ2VuZXJpY19zZXJ2aWNlcygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIwLCB0aGlzLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7CisgIH0KKworICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRmlsZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworICBpZiAoaGFzX2phdmFfcGFja2FnZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmphdmFfcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9wYWNrYWdlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxLCB0aGlzLT5qYXZhX3BhY2thZ2UoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CisgIGlmIChoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDgsIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICBpZiAoaGFzX29wdGltaXplX2ZvcigpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCisgICAgICA5LCB0aGlzLT5vcHRpbWl6ZV9mb3IoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEwLCB0aGlzLT5qYXZhX211bHRpcGxlX2ZpbGVzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgZ29fcGFja2FnZSA9IDExOworICBpZiAoaGFzX2dvX3BhY2thZ2UoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5nb19wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5nb19wYWNrYWdlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxMSwgdGhpcy0+Z29fcGFja2FnZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMTYsIHRoaXMtPmNjX2dlbmVyaWNfc2VydmljZXMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxNywgdGhpcy0+amF2YV9nZW5lcmljX3NlcnZpY2VzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxOCwgdGhpcy0+cHlfZ2VuZXJpY19zZXJ2aWNlcygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyMCwgdGhpcy0+amF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIHRhcmdldCk7CisgIH0KKworICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRmlsZU9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKKyAgICBpZiAoaGFzX2phdmFfcGFja2FnZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5qYXZhX3BhY2thZ2UoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKKyAgICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKKyAgICBpZiAoaGFzX29wdGltaXplX2ZvcigpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+b3B0aW1pemVfZm9yKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBnb19wYWNrYWdlID0gMTE7CisgICAgaWYgKGhhc19nb19wYWNrYWdlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmdvX3BhY2thZ2UoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKworICB9CisgIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgICAgfQorCisgIH0KKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKKyAgfQorCisgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRmlsZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRmlsZU9wdGlvbnMqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBGaWxlT3B0aW9ucyo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBGaWxlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2phdmFfcGFja2FnZSgpKSB7CisgICAgICBzZXRfamF2YV9wYWNrYWdlKGZyb20uamF2YV9wYWNrYWdlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgICAgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGZyb20uamF2YV9vdXRlcl9jbGFzc25hbWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgICAgIHNldF9qYXZhX211bHRpcGxlX2ZpbGVzKGZyb20uamF2YV9tdWx0aXBsZV9maWxlcygpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKKyAgICAgIHNldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChmcm9tLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfb3B0aW1pemVfZm9yKCkpIHsKKyAgICAgIHNldF9vcHRpbWl6ZV9mb3IoZnJvbS5vcHRpbWl6ZV9mb3IoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19nb19wYWNrYWdlKCkpIHsKKyAgICAgIHNldF9nb19wYWNrYWdlKGZyb20uZ29fcGFja2FnZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSkgeworICAgICAgc2V0X2NjX2dlbmVyaWNfc2VydmljZXMoZnJvbS5jY19nZW5lcmljX3NlcnZpY2VzKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICAgIHNldF9qYXZhX2dlbmVyaWNfc2VydmljZXMoZnJvbS5qYXZhX2dlbmVyaWNfc2VydmljZXMoKSk7CisgICAgfQorICB9CisgIGlmIChmcm9tLl9oYXNfYml0c19bOCAvIDMyXSAmICgweGZmdSA8PCAoOCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgICBzZXRfcHlfZ2VuZXJpY19zZXJ2aWNlcyhmcm9tLnB5X2dlbmVyaWNfc2VydmljZXMoKSk7CisgICAgfQorICB9CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpDb3B5RnJvbShjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmlsZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpTd2FwKEZpbGVPcHRpb25zKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChqYXZhX3BhY2thZ2VfLCBvdGhlci0+amF2YV9wYWNrYWdlXyk7CisgICAgc3RkOjpzd2FwKGphdmFfb3V0ZXJfY2xhc3NuYW1lXywgb3RoZXItPmphdmFfb3V0ZXJfY2xhc3NuYW1lXyk7CisgICAgc3RkOjpzd2FwKGphdmFfbXVsdGlwbGVfZmlsZXNfLCBvdGhlci0+amF2YV9tdWx0aXBsZV9maWxlc18pOworICAgIHN0ZDo6c3dhcChqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8sIG90aGVyLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pOworICAgIHN0ZDo6c3dhcChvcHRpbWl6ZV9mb3JfLCBvdGhlci0+b3B0aW1pemVfZm9yXyk7CisgICAgc3RkOjpzd2FwKGdvX3BhY2thZ2VfLCBvdGhlci0+Z29fcGFja2FnZV8pOworICAgIHN0ZDo6c3dhcChjY19nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPmNjX2dlbmVyaWNfc2VydmljZXNfKTsKKyAgICBzdGQ6OnN3YXAoamF2YV9nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPmphdmFfZ2VuZXJpY19zZXJ2aWNlc18pOworICAgIHN0ZDo6c3dhcChweV9nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPnB5X2dlbmVyaWNfc2VydmljZXNfKTsKKyAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEZpbGVPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBGaWxlT3B0aW9uc19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpbGVPcHRpb25zX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtNZXNzYWdlU2V0V2lyZUZvcm1hdEZpZWxkTnVtYmVyOworY29uc3QgaW50IE1lc3NhZ2VPcHRpb25zOjprTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvckZpZWxkTnVtYmVyOworY29uc3QgaW50IE1lc3NhZ2VPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworTWVzc2FnZU9wdGlvbnM6Ok1lc3NhZ2VPcHRpb25zKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitNZXNzYWdlT3B0aW9uczo6TWVzc2FnZU9wdGlvbnMoY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZhbHNlOworICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IGZhbHNlOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitNZXNzYWdlT3B0aW9uczo6fk1lc3NhZ2VPcHRpb25zKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE1lc3NhZ2VPcHRpb25zOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBNZXNzYWdlT3B0aW9ucyYgTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK01lc3NhZ2VPcHRpb25zKiBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitNZXNzYWdlT3B0aW9ucyogTWVzc2FnZU9wdGlvbnM6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBNZXNzYWdlT3B0aW9uczsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6Q2xlYXIoKSB7CisgIF9leHRlbnNpb25zXy5DbGVhcigpOworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZhbHNlOworICAgIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfID0gZmFsc2U7CisgIH0KKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBNZXNzYWdlT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8pKSk7CisgICAgICAgICAgc2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2Vfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcjoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfKSkpOworICAgICAgICAgIHNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxLCB0aGlzLT5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIsIHRoaXMtPm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICAxMDAwLCA1MzY4NzA5MTIsIG91dHB1dCk7CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIE1lc3NhZ2VPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMSwgdGhpcy0+bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMiwgdGhpcy0+bm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBNZXNzYWdlT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICB9CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7CisgIH0KKworICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgTWVzc2FnZU9wdGlvbnMqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgICBzZXRfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoZnJvbS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSkgeworICAgICAgc2V0X25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoZnJvbS5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpOworICAgIH0KKyAgfQorICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6Q29weUZyb20oY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIE1lc3NhZ2VPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6U3dhcChNZXNzYWdlT3B0aW9ucyogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfLCBvdGhlci0+bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKTsKKyAgICBzdGQ6OnN3YXAobm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8sIG90aGVyLT5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyk7CisgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLlN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgICBfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBNZXNzYWdlT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBNZXNzYWdlT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3JfOworfQorYm9vbCBGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OlNUUklORzsKK2NvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OkNPUkQ7Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpTVFJJTkdfUElFQ0U7Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpDVHlwZV9NSU47Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpDVHlwZV9NQVg7Citjb25zdCBpbnQgRmllbGRPcHRpb25zOjpDVHlwZV9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRmllbGRPcHRpb25zOjprQ3R5cGVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtQYWNrZWRGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtMYXp5RmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGRPcHRpb25zOjprRGVwcmVjYXRlZEZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkT3B0aW9uczo6a0V4cGVyaW1lbnRhbE1hcEtleUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkT3B0aW9uczo6a1dlYWtGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitGaWVsZE9wdGlvbnM6OkZpZWxkT3B0aW9ucygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK0ZpZWxkT3B0aW9uczo6RmllbGRPcHRpb25zKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpZWxkT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIGN0eXBlXyA9IDA7CisgIHBhY2tlZF8gPSBmYWxzZTsKKyAgbGF6eV8gPSBmYWxzZTsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgZXhwZXJpbWVudGFsX21hcF9rZXlfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB3ZWFrXyA9IGZhbHNlOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitGaWVsZE9wdGlvbnM6On5GaWVsZE9wdGlvbnMoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OlNoYXJlZER0b3IoKSB7CisgIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBleHBlcmltZW50YWxfbWFwX2tleV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIEZpZWxkT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkT3B0aW9uczo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEZpZWxkT3B0aW9ucyYgRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitGaWVsZE9wdGlvbnMqIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitGaWVsZE9wdGlvbnMqIEZpZWxkT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IEZpZWxkT3B0aW9uczsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OkNsZWFyKCkgeworICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBjdHlwZV8gPSAwOworICAgIHBhY2tlZF8gPSBmYWxzZTsKKyAgICBsYXp5XyA9IGZhbHNlOworICAgIGRlcHJlY2F0ZWRfID0gZmFsc2U7CisgICAgaWYgKGhhc19leHBlcmltZW50YWxfbWFwX2tleSgpKSB7CisgICAgICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgZXhwZXJpbWVudGFsX21hcF9rZXlfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICB3ZWFrXyA9IGZhbHNlOworICB9CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgRmllbGRPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7CisgICAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlX0lzVmFsaWQodmFsdWUpKSB7CisgICAgICAgICAgICBzZXRfY3R5cGUoc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlID4odmFsdWUpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMSwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9wYWNrZWQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9wYWNrZWQ6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZwYWNrZWRfKSkpOworICAgICAgICAgIHNldF9oYXNfcGFja2VkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNCkpIGdvdG8gcGFyc2VfZGVwcmVjYXRlZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9kZXByZWNhdGVkOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmZGVwcmVjYXRlZF8pKSk7CisgICAgICAgICAgc2V0X2hhc19kZXByZWNhdGVkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MCkpIGdvdG8gcGFyc2VfbGF6eTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDU6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9sYXp5OgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmbGF6eV8pKSk7CisgICAgICAgICAgc2V0X2hhc19sYXp5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3NCkpIGdvdG8gcGFyc2VfZXhwZXJpbWVudGFsX21hcF9rZXk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXhwZXJpbWVudGFsX21hcF9rZXkgPSA5OworICAgICAgY2FzZSA5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2V4cGVyaW1lbnRhbF9tYXBfa2V5OgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9leHBlcmltZW50YWxfbWFwX2tleSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkuZGF0YSgpLCB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODApKSBnb3RvIHBhcnNlX3dlYWs7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMTA6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV93ZWFrOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmd2Vha18pKSk7CisgICAgICAgICAgc2V0X2hhc193ZWFrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKKyAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICBpZiAoaGFzX2N0eXBlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAorICAgICAgMSwgdGhpcy0+Y3R5cGUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKKyAgaWYgKGhhc19wYWNrZWQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMiwgdGhpcy0+cGFja2VkKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19sYXp5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDUsIHRoaXMtPmxhenkoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBleHBlcmltZW50YWxfbWFwX2tleSA9IDk7CisgIGlmIChoYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLmRhdGEoKSwgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOSwgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgd2VhayA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX3dlYWsoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMTAsIHRoaXMtPndlYWsoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICAxMDAwLCA1MzY4NzA5MTIsIG91dHB1dCk7CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpZWxkT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKKyAgaWYgKGhhc19jdHlwZSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCisgICAgICAxLCB0aGlzLT5jdHlwZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOworICBpZiAoaGFzX3BhY2tlZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMiwgdGhpcy0+cGFja2VkKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfbGF6eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNSwgdGhpcy0+bGF6eSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKKyAgaWYgKGhhc19leHBlcmltZW50YWxfbWFwX2tleSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkuZGF0YSgpLCB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgOSwgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgd2VhayA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX3dlYWsoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEwLCB0aGlzLT53ZWFrKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOworCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEZpZWxkT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107CisgICAgaWYgKGhhc19jdHlwZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+Y3R5cGUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOworICAgIGlmIChoYXNfcGFja2VkKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX2xhenkoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBleHBlcmltZW50YWxfbWFwX2tleSA9IDk7CisgICAgaWYgKGhhc19leHBlcmltZW50YWxfbWFwX2tleSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX3dlYWsoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgfQorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOworICB9CisKKyAgdG90YWxfc2l6ZSArPSBfZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRmllbGRPcHRpb25zKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRmllbGRPcHRpb25zKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIEZpZWxkT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19jdHlwZSgpKSB7CisgICAgICBzZXRfY3R5cGUoZnJvbS5jdHlwZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3BhY2tlZCgpKSB7CisgICAgICBzZXRfcGFja2VkKGZyb20ucGFja2VkKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfbGF6eSgpKSB7CisgICAgICBzZXRfbGF6eShmcm9tLmxhenkoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19kZXByZWNhdGVkKCkpIHsKKyAgICAgIHNldF9kZXByZWNhdGVkKGZyb20uZGVwcmVjYXRlZCgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKKyAgICAgIHNldF9leHBlcmltZW50YWxfbWFwX2tleShmcm9tLmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfd2VhaygpKSB7CisgICAgICBzZXRfd2Vhayhmcm9tLndlYWsoKSk7CisgICAgfQorICB9CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEZpZWxkT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmllbGRPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OlN3YXAoRmllbGRPcHRpb25zKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChjdHlwZV8sIG90aGVyLT5jdHlwZV8pOworICAgIHN0ZDo6c3dhcChwYWNrZWRfLCBvdGhlci0+cGFja2VkXyk7CisgICAgc3RkOjpzd2FwKGxhenlfLCBvdGhlci0+bGF6eV8pOworICAgIHN0ZDo6c3dhcChkZXByZWNhdGVkXywgb3RoZXItPmRlcHJlY2F0ZWRfKTsKKyAgICBzdGQ6OnN3YXAoZXhwZXJpbWVudGFsX21hcF9rZXlfLCBvdGhlci0+ZXhwZXJpbWVudGFsX21hcF9rZXlfKTsKKyAgICBzdGQ6OnN3YXAod2Vha18sIG90aGVyLT53ZWFrXyk7CisgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLlN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgICBfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWVsZE9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpZWxkT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IEVudW1PcHRpb25zOjprQWxsb3dBbGlhc0ZpZWxkTnVtYmVyOworY29uc3QgaW50IEVudW1PcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRW51bU9wdGlvbnM6OkVudW1PcHRpb25zKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitFbnVtT3B0aW9uczo6RW51bU9wdGlvbnMoY29uc3QgRW51bU9wdGlvbnMmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIGFsbG93X2FsaWFzXyA9IHRydWU7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0VudW1PcHRpb25zOjp+RW51bU9wdGlvbnMoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIEVudW1PcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bU9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRW51bU9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEVudW1PcHRpb25zJiBFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRW51bU9wdGlvbnMqIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0VudW1PcHRpb25zKiBFbnVtT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IEVudW1PcHRpb25zOworfQorCit2b2lkIEVudW1PcHRpb25zOjpDbGVhcigpIHsKKyAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgYWxsb3dfYWxpYXNfID0gdHJ1ZTsKKyAgfQorICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIEVudW1PcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMiBbZGVmYXVsdCA9IHRydWVdOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmYWxsb3dfYWxpYXNfKSkpOworICAgICAgICAgIHNldF9oYXNfYWxsb3dfYWxpYXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgICAgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBFbnVtT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDIgW2RlZmF1bHQgPSB0cnVlXTsKKyAgaWYgKGhhc19hbGxvd19hbGlhcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgyLCB0aGlzLT5hbGxvd19hbGlhcygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7CisgIH0KKworICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyIFtkZWZhdWx0ID0gdHJ1ZV07CisgIGlmIChoYXNfYWxsb3dfYWxpYXMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDIsIHRoaXMtPmFsbG93X2FsaWFzKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOworCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEVudW1PcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDIgW2RlZmF1bHQgPSB0cnVlXTsKKyAgICBpZiAoaGFzX2FsbG93X2FsaWFzKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorCisgIH0KKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKKyAgfQorCisgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRW51bU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRW51bU9wdGlvbnMqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBFbnVtT3B0aW9ucyo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBFbnVtT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2FsbG93X2FsaWFzKCkpIHsKKyAgICAgIHNldF9hbGxvd19hbGlhcyhmcm9tLmFsbG93X2FsaWFzKCkpOworICAgIH0KKyAgfQorICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6Q29weUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEVudW1PcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6U3dhcChFbnVtT3B0aW9ucyogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAoYWxsb3dfYWxpYXNfLCBvdGhlci0+YWxsb3dfYWxpYXNfKTsKKyAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEVudW1PcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBFbnVtT3B0aW9uc19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEVudW1PcHRpb25zX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRW51bVZhbHVlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK0VudW1WYWx1ZU9wdGlvbnM6OkVudW1WYWx1ZU9wdGlvbnMoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworRW51bVZhbHVlT3B0aW9uczo6RW51bVZhbHVlT3B0aW9ucyhjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0VudW1WYWx1ZU9wdGlvbnM6On5FbnVtVmFsdWVPcHRpb25zKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBFbnVtVmFsdWVPcHRpb25zOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIEVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0VudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworRW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IEVudW1WYWx1ZU9wdGlvbnM7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6Q2xlYXIoKSB7CisgIF9leHRlbnNpb25zXy5DbGVhcigpOworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKKyAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7CisgIH0KKworICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bVZhbHVlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBFbnVtVmFsdWVPcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7CisgIH0KKworICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRW51bVZhbHVlT3B0aW9ucyogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6Q29weUZyb20oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRW51bVZhbHVlT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6U3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5Td2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgICAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRW51bVZhbHVlT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRW51bVZhbHVlT3B0aW9uc19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEVudW1WYWx1ZU9wdGlvbnNfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBTZXJ2aWNlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK1NlcnZpY2VPcHRpb25zOjpTZXJ2aWNlT3B0aW9ucygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgU2VydmljZU9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworU2VydmljZU9wdGlvbnM6OlNlcnZpY2VPcHRpb25zKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgU2VydmljZU9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitTZXJ2aWNlT3B0aW9uczo6flNlcnZpY2VPcHRpb25zKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgU2VydmljZU9wdGlvbnM6OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFNlcnZpY2VPcHRpb25zOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBTZXJ2aWNlT3B0aW9ucyYgU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1NlcnZpY2VPcHRpb25zKiBTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitTZXJ2aWNlT3B0aW9ucyogU2VydmljZU9wdGlvbnM6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBTZXJ2aWNlT3B0aW9uczsKK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6Q2xlYXIoKSB7CisgIF9leHRlbnNpb25zXy5DbGVhcigpOworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIFNlcnZpY2VPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOworCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJ2aWNlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBTZXJ2aWNlT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOworICB9CisKKyAgdG90YWxfc2l6ZSArPSBfZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTsKKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBTZXJ2aWNlT3B0aW9ucyogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFNlcnZpY2VPcHRpb25zKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgU2VydmljZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpTd2FwKFNlcnZpY2VPcHRpb25zKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5Td2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgICAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgU2VydmljZU9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gU2VydmljZU9wdGlvbnNfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBNZXRob2RPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworTWV0aG9kT3B0aW9uczo6TWV0aG9kT3B0aW9ucygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitNZXRob2RPcHRpb25zOjpNZXRob2RPcHRpb25zKGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworTWV0aG9kT3B0aW9uczo6fk1ldGhvZE9wdGlvbnMoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpTaGFyZWREdG9yKCkgeworICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE1ldGhvZE9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXzsKK30KKworY29uc3QgTWV0aG9kT3B0aW9ucyYgTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworTWV0aG9kT3B0aW9ucyogTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitNZXRob2RPcHRpb25zKiBNZXRob2RPcHRpb25zOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgTWV0aG9kT3B0aW9uczsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpDbGVhcigpIHsKKyAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgTWV0aG9kT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgICAgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOworCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBNZXRob2RPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOworCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IE1ldGhvZE9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKKyAgfQorCisgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBNZXRob2RPcHRpb25zKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgTWV0aG9kT3B0aW9ucyo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShmcm9tLl9leHRlbnNpb25zXyk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpDb3B5RnJvbShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBNZXRob2RPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpTd2FwKE1ldGhvZE9wdGlvbnMqIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLlN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgICBfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBNZXRob2RPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBNZXRob2RPcHRpb25zX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gTWV0aG9kT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmtOYW1lUGFydEZpZWxkTnVtYmVyOworY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmtJc0V4dGVuc2lvbkZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbmFtZV9wYXJ0XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgaXNfZXh0ZW5zaW9uXyA9IGZhbHNlOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0Ojp+VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlNoYXJlZER0b3IoKSB7CisgIGlmIChuYW1lX3BhcnRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV9wYXJ0XzsKKyAgfQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZXNjcmlwdG9yXzsKK30KKworY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpDbGVhcigpIHsKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoaGFzX25hbWVfcGFydCgpKSB7CisgICAgICBpZiAobmFtZV9wYXJ0XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfcGFydF8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGlzX2V4dGVuc2lvbl8gPSBmYWxzZTsKKyAgfQorICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lX3BhcnQoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5uYW1lX3BhcnQoKS5kYXRhKCksIHRoaXMtPm5hbWVfcGFydCgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX2lzX2V4dGVuc2lvbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX2lzX2V4dGVuc2lvbjoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmlzX2V4dGVuc2lvbl8pKSk7CisgICAgICAgICAgc2V0X2hhc19pc19leHRlbnNpb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKKyAgaWYgKGhhc19uYW1lX3BhcnQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5uYW1lX3BhcnQoKS5kYXRhKCksIHRoaXMtPm5hbWVfcGFydCgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lX3BhcnQoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgaWYgKGhhc19pc19leHRlbnNpb24oKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMiwgdGhpcy0+aXNfZXh0ZW5zaW9uKCksIG91dHB1dCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgIGlmIChoYXNfbmFtZV9wYXJ0KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkuZGF0YSgpLCB0aGlzLT5uYW1lX3BhcnQoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWVfcGFydCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworICBpZiAoaGFzX2lzX2V4dGVuc2lvbigpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMiwgdGhpcy0+aXNfZXh0ZW5zaW9uKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgaWYgKGhhc19uYW1lX3BhcnQoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkpOworICAgIH0KKworICAgIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgICBpZiAoaGFzX2lzX2V4dGVuc2lvbigpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICB9CisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TWVyZ2VGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lX3BhcnQoKSkgeworICAgICAgc2V0X25hbWVfcGFydChmcm9tLm5hbWVfcGFydCgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2lzX2V4dGVuc2lvbigpKSB7CisgICAgICBzZXRfaXNfZXh0ZW5zaW9uKGZyb20uaXNfZXh0ZW5zaW9uKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Q29weUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMykgIT0gMHgwMDAwMDAwMykgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobmFtZV9wYXJ0Xywgb3RoZXItPm5hbWVfcGFydF8pOworICAgIHN0ZDo6c3dhcChpc19leHRlbnNpb25fLCBvdGhlci0+aXNfZXh0ZW5zaW9uXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OmtJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprUG9zaXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OmtOZWdhdGl2ZUludFZhbHVlRmllbGROdW1iZXI7Citjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0RvdWJsZVZhbHVlRmllbGROdW1iZXI7Citjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a1N0cmluZ1ZhbHVlRmllbGROdW1iZXI7Citjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitVbmludGVycHJldGVkT3B0aW9uOjpVbmludGVycHJldGVkT3B0aW9uKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK1VuaW50ZXJwcmV0ZWRPcHRpb246OlVuaW50ZXJwcmV0ZWRPcHRpb24oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBpZGVudGlmaWVyX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgcG9zaXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9VTE9OR0xPTkcoMCk7CisgIG5lZ2F0aXZlX2ludF92YWx1ZV8gPSBHT09HTEVfTE9OR0xPTkcoMCk7CisgIGRvdWJsZV92YWx1ZV8gPSAwOworICBzdHJpbmdfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBhZ2dyZWdhdGVfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitVbmludGVycHJldGVkT3B0aW9uOjp+VW5pbnRlcnByZXRlZE9wdGlvbigpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNoYXJlZER0b3IoKSB7CisgIGlmIChpZGVudGlmaWVyX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGlkZW50aWZpZXJfdmFsdWVfOworICB9CisgIGlmIChzdHJpbmdfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgc3RyaW5nX3ZhbHVlXzsKKyAgfQorICBpZiAoYWdncmVnYXRlX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGFnZ3JlZ2F0ZV92YWx1ZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBVbmludGVycHJldGVkT3B0aW9uOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1VuaW50ZXJwcmV0ZWRPcHRpb24qIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworVW5pbnRlcnByZXRlZE9wdGlvbiogVW5pbnRlcnByZXRlZE9wdGlvbjo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IFVuaW50ZXJwcmV0ZWRPcHRpb247Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7CisgICAgaWYgKGhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICAgIGlmIChpZGVudGlmaWVyX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGlkZW50aWZpZXJfdmFsdWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBwb3NpdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX1VMT05HTE9ORygwKTsKKyAgICBuZWdhdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX0xPTkdMT05HKDApOworICAgIGRvdWJsZV92YWx1ZV8gPSAwOworICAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICAgIGlmIChzdHJpbmdfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgc3RyaW5nX3ZhbHVlXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19hZ2dyZWdhdGVfdmFsdWUoKSkgeworICAgICAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBhZ2dyZWdhdGVfdmFsdWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorICBuYW1lXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0IG5hbWUgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX25hbWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX25hbWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX25hbWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9pZGVudGlmaWVyX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2lkZW50aWZpZXJfdmFsdWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2lkZW50aWZpZXJfdmFsdWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzMikpIGdvdG8gcGFyc2VfcG9zaXRpdmVfaW50X3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9wb3NpdGl2ZV9pbnRfdmFsdWU6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfVUlOVDY0PigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZwb3NpdGl2ZV9pbnRfdmFsdWVfKSkpOworICAgICAgICAgIHNldF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MCkpIGdvdG8gcGFyc2VfbmVnYXRpdmVfaW50X3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgICAgIGNhc2UgNTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX25lZ2F0aXZlX2ludF92YWx1ZToKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDY0PigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZuZWdhdGl2ZV9pbnRfdmFsdWVfKSkpOworICAgICAgICAgIHNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0OSkpIGdvdG8gcGFyc2VfZG91YmxlX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CisgICAgICBjYXNlIDY6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkgeworICAgICAgICAgcGFyc2VfZG91YmxlX3ZhbHVlOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgZG91YmxlLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmRvdWJsZV92YWx1ZV8pKSk7CisgICAgICAgICAgc2V0X2hhc19kb3VibGVfdmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9zdHJpbmdfdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICAgICAgY2FzZSA3OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3N0cmluZ192YWx1ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zdHJpbmdfdmFsdWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX2FnZ3JlZ2F0ZV92YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICAgICAgY2FzZSA4OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2FnZ3JlZ2F0ZV92YWx1ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmFtZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAyLCB0aGlzLT5uYW1lKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICBpZiAoaGFzX2lkZW50aWZpZXJfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDMsIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OworICBpZiAoaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0KDQsIHRoaXMtPnBvc2l0aXZlX2ludF92YWx1ZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0KDUsIHRoaXMtPm5lZ2F0aXZlX2ludF92YWx1ZSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CisgIGlmIChoYXNfZG91YmxlX3ZhbHVlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGUoNiwgdGhpcy0+ZG91YmxlX3ZhbHVlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICBpZiAoaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoCisgICAgICA3LCB0aGlzLT5zdHJpbmdfdmFsdWUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDgsIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5uYW1lX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+bmFtZShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKKyAgaWYgKGhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMywgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgIGlmIChoYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KDQsIHRoaXMtPnBvc2l0aXZlX2ludF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSg1LCB0aGlzLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OworICBpZiAoaGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlVG9BcnJheSg2LCB0aGlzLT5kb3VibGVfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CisgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXNUb0FycmF5KAorICAgICAgICA3LCB0aGlzLT5zdHJpbmdfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICA4LCB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgaWYgKF9oYXNfYml0c19bMSAvIDMyXSAmICgweGZmdSA8PCAoMSAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CisgICAgaWYgKGhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgICAgaWYgKGhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlVJbnQ2NFNpemUoCisgICAgICAgICAgdGhpcy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CisgICAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDY0U2l6ZSgKKyAgICAgICAgICB0aGlzLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CisgICAgaWYgKGhhc19kb3VibGVfdmFsdWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgODsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoCisgICAgICAgICAgdGhpcy0+c3RyaW5nX3ZhbHVlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICAgIGlmIChoYXNfYWdncmVnYXRlX3ZhbHVlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpKTsKKyAgICB9CisKKyAgfQorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPm5hbWVfc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm5hbWVfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPm5hbWUoaSkpOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbio+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBuYW1lXy5NZXJnZUZyb20oZnJvbS5uYW1lXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMSAvIDMyXSAmICgweGZmdSA8PCAoMSAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7CisgICAgICBzZXRfaWRlbnRpZmllcl92YWx1ZShmcm9tLmlkZW50aWZpZXJfdmFsdWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgc2V0X3Bvc2l0aXZlX2ludF92YWx1ZShmcm9tLnBvc2l0aXZlX2ludF92YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgICBzZXRfbmVnYXRpdmVfaW50X3ZhbHVlKGZyb20ubmVnYXRpdmVfaW50X3ZhbHVlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfZG91YmxlX3ZhbHVlKCkpIHsKKyAgICAgIHNldF9kb3VibGVfdmFsdWUoZnJvbS5kb3VibGVfdmFsdWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19zdHJpbmdfdmFsdWUoKSkgeworICAgICAgc2V0X3N0cmluZ192YWx1ZShmcm9tLnN0cmluZ192YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgICBzZXRfYWdncmVnYXRlX3ZhbHVlKGZyb20uYWdncmVnYXRlX3ZhbHVlKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Q29weUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPm5hbWUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6U3dhcChVbmludGVycHJldGVkT3B0aW9uKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIG5hbWVfLlN3YXAoJm90aGVyLT5uYW1lXyk7CisgICAgc3RkOjpzd2FwKGlkZW50aWZpZXJfdmFsdWVfLCBvdGhlci0+aWRlbnRpZmllcl92YWx1ZV8pOworICAgIHN0ZDo6c3dhcChwb3NpdGl2ZV9pbnRfdmFsdWVfLCBvdGhlci0+cG9zaXRpdmVfaW50X3ZhbHVlXyk7CisgICAgc3RkOjpzd2FwKG5lZ2F0aXZlX2ludF92YWx1ZV8sIG90aGVyLT5uZWdhdGl2ZV9pbnRfdmFsdWVfKTsKKyAgICBzdGQ6OnN3YXAoZG91YmxlX3ZhbHVlXywgb3RoZXItPmRvdWJsZV92YWx1ZV8pOworICAgIHN0ZDo6c3dhcChzdHJpbmdfdmFsdWVfLCBvdGhlci0+c3RyaW5nX3ZhbHVlXyk7CisgICAgc3RkOjpzd2FwKGFnZ3JlZ2F0ZV92YWx1ZV8sIG90aGVyLT5hZ2dyZWdhdGVfdmFsdWVfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBVbmludGVycHJldGVkT3B0aW9uOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBVbmludGVycHJldGVkT3B0aW9uX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gVW5pbnRlcnByZXRlZE9wdGlvbl9yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjprUGF0aEZpZWxkTnVtYmVyOworY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjprU3BhbkZpZWxkTnVtYmVyOworY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjprTGVhZGluZ0NvbW1lbnRzRmllbGROdW1iZXI7Citjb25zdCBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmtUcmFpbGluZ0NvbW1lbnRzRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24oKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbihjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbGVhZGluZ19jb21tZW50c18gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIHRyYWlsaW5nX2NvbW1lbnRzXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworU291cmNlQ29kZUluZm9fTG9jYXRpb246On5Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbigpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTaGFyZWREdG9yKCkgeworICBpZiAobGVhZGluZ19jb21tZW50c18gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBsZWFkaW5nX2NvbW1lbnRzXzsKKyAgfQorICBpZiAodHJhaWxpbmdfY29tbWVudHNfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgdHJhaWxpbmdfY29tbWVudHNfOworICB9CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzIgLyAzMl0gJiAoMHhmZnUgPDwgKDIgJSAzMikpKSB7CisgICAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICAgIGlmIChsZWFkaW5nX2NvbW1lbnRzXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGxlYWRpbmdfY29tbWVudHNfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpIHsKKyAgICAgIGlmICh0cmFpbGluZ19jb21tZW50c18gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICB0cmFpbGluZ19jb21tZW50c18tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICB9CisgIHBhdGhfLkNsZWFyKCk7CisgIHNwYW5fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfcGF0aCgpKSkpOworICAgICAgICB9IGVsc2UgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpCisgICAgICAgICAgICAgICAgICAgPT0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICAgICAgICAgICAgICAgIFdJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgMSwgMTAsIGlucHV0LCB0aGlzLT5tdXRhYmxlX3BhdGgoKSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9zcGFuOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3NwYW46CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3NwYW4oKSkpKTsKKyAgICAgICAgfSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKQorICAgICAgICAgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgICAgICAgICAgICAgICBXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIDEsIDE4LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zcGFuKCkpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfbGVhZGluZ19jb21tZW50czsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgICAgIGNhc2UgMzogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9sZWFkaW5nX2NvbW1lbnRzOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX3RyYWlsaW5nX2NvbW1lbnRzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKKyAgICAgIGNhc2UgNDogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV90cmFpbGluZ19jb21tZW50czoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICBpZiAodGhpcy0+cGF0aF9zaXplKCkgPiAwKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKDEsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wYXRoX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZygKKyAgICAgIHRoaXMtPnBhdGgoaSksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CisgIGlmICh0aGlzLT5zcGFuX3NpemUoKSA+IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNwYW5fc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnKAorICAgICAgdGhpcy0+c3BhbihpKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAzLCB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICBpZiAoaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKS5kYXRhKCksIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDQsIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCksIG91dHB1dCk7CisgIH0KKworICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgaWYgKHRoaXMtPnBhdGhfc2l6ZSgpID4gMCkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoCisgICAgICAxLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCisgICAgICB0YXJnZXQpOworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKKyAgICAgIF9wYXRoX2NhY2hlZF9ieXRlX3NpemVfLCB0YXJnZXQpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cGF0aF9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkodGhpcy0+cGF0aChpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgaWYgKHRoaXMtPnNwYW5fc2l6ZSgpID4gMCkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoCisgICAgICAyLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCisgICAgICB0YXJnZXQpOworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKKyAgICAgIF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfLCB0YXJnZXQpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+c3Bhbl9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkodGhpcy0+c3BhbihpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMywgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKKyAgaWYgKGhhc190cmFpbGluZ19jb21tZW50cygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCkuZGF0YSgpLCB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgNCwgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzIgLyAzMl0gJiAoMHhmZnUgPDwgKDIgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGxlYWRpbmdfY29tbWVudHMgPSAzOworICAgIGlmIChoYXNfbGVhZGluZ19jb21tZW50cygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFpbGluZ19jb21tZW50cyA9IDQ7CisgICAgaWYgKGhhc190cmFpbGluZ19jb21tZW50cygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT50cmFpbGluZ19jb21tZW50cygpKTsKKyAgICB9CisKKyAgfQorICAvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CisgIHsKKyAgICBpbnQgZGF0YV9zaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnBhdGhfc2l6ZSgpOyBpKyspIHsKKyAgICAgIGRhdGFfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludDMyU2l6ZSh0aGlzLT5wYXRoKGkpKTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA+IDApIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoZGF0YV9zaXplKTsKKyAgICB9CisgICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgICBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXyA9IGRhdGFfc2l6ZTsKKyAgICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgICB0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgeworICAgIGludCBkYXRhX3NpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+c3Bhbl9zaXplKCk7IGkrKykgeworICAgICAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50MzJTaXplKHRoaXMtPnNwYW4oaSkpOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShkYXRhX3NpemUpOworICAgIH0KKyAgICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICAgIF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfID0gZGF0YV9zaXplOworICAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICAgIHRvdGFsX3NpemUgKz0gZGF0YV9zaXplOworICB9CisKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbio+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHBhdGhfLk1lcmdlRnJvbShmcm9tLnBhdGhfKTsKKyAgc3Bhbl8uTWVyZ2VGcm9tKGZyb20uc3Bhbl8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzIgLyAzMl0gJiAoMHhmZnUgPDwgKDIgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2xlYWRpbmdfY29tbWVudHMoKSkgeworICAgICAgc2V0X2xlYWRpbmdfY29tbWVudHMoZnJvbS5sZWFkaW5nX2NvbW1lbnRzKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfdHJhaWxpbmdfY29tbWVudHMoKSkgeworICAgICAgc2V0X3RyYWlsaW5nX2NvbW1lbnRzKGZyb20udHJhaWxpbmdfY29tbWVudHMoKSk7CisgICAgfQorICB9CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkNvcHlGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U3dhcChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBwYXRoXy5Td2FwKCZvdGhlci0+cGF0aF8pOworICAgIHNwYW5fLlN3YXAoJm90aGVyLT5zcGFuXyk7CisgICAgc3RkOjpzd2FwKGxlYWRpbmdfY29tbWVudHNfLCBvdGhlci0+bGVhZGluZ19jb21tZW50c18pOworICAgIHN0ZDo6c3dhcCh0cmFpbGluZ19jb21tZW50c18sIG90aGVyLT50cmFpbGluZ19jb21tZW50c18pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgU291cmNlQ29kZUluZm86OmtMb2NhdGlvbkZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworU291cmNlQ29kZUluZm86OlNvdXJjZUNvZGVJbmZvKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mbzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitTb3VyY2VDb2RlSW5mbzo6U291cmNlQ29kZUluZm8oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mbzo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK1NvdXJjZUNvZGVJbmZvOjp+U291cmNlQ29kZUluZm8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mbzo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU291cmNlQ29kZUluZm86OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IFNvdXJjZUNvZGVJbmZvJiBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworU291cmNlQ29kZUluZm8qIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK1NvdXJjZUNvZGVJbmZvKiBTb3VyY2VDb2RlSW5mbzo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IFNvdXJjZUNvZGVJbmZvOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpDbGVhcigpIHsKKyAgbG9jYXRpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBTb3VyY2VDb2RlSW5mbzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfbG9jYXRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2xvY2F0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEwKSkgZ290byBwYXJzZV9sb2NhdGlvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5sb2NhdGlvbl9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAxLCB0aGlzLT5sb2NhdGlvbihpKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTb3VyY2VDb2RlSW5mbzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bG9jYXRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAxLCB0aGlzLT5sb2NhdGlvbihpKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFNvdXJjZUNvZGVJbmZvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5sb2NhdGlvbl9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bG9jYXRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPmxvY2F0aW9uKGkpKTsKKyAgfQorCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgU291cmNlQ29kZUluZm8qPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86Ok1lcmdlRnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBsb2NhdGlvbl8uTWVyZ2VGcm9tKGZyb20ubG9jYXRpb25fKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mbzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mbzo6Q29weUZyb20oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIFNvdXJjZUNvZGVJbmZvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpTd2FwKFNvdXJjZUNvZGVJbmZvKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIGxvY2F0aW9uXy5Td2FwKCZvdGhlci0+bG9jYXRpb25fKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBTb3VyY2VDb2RlSW5mbzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBTb3VyY2VDb2RlSW5mb19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjZjgwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgKQEAgLTAsMCArMSw1OTkyIEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bworCisjaWZuZGVmIFBST1RPQlVGX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX19JTkNMVURFRAorI2RlZmluZSBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19fSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgMjAwNTAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDIwMDUwMDAgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgY2FsbCB0aGVzZS4KK3ZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKK3ZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwordm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworY2xhc3MgRmlsZURlc2NyaXB0b3JTZXQ7CitjbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvOworY2xhc3MgRGVzY3JpcHRvclByb3RvOworY2xhc3MgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOworY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG87CitjbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOworY2xhc3MgU2VydmljZURlc2NyaXB0b3JQcm90bzsKK2NsYXNzIE1ldGhvZERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIEZpbGVPcHRpb25zOworY2xhc3MgTWVzc2FnZU9wdGlvbnM7CitjbGFzcyBGaWVsZE9wdGlvbnM7CitjbGFzcyBFbnVtT3B0aW9uczsKK2NsYXNzIEVudW1WYWx1ZU9wdGlvbnM7CitjbGFzcyBTZXJ2aWNlT3B0aW9uczsKK2NsYXNzIE1ldGhvZE9wdGlvbnM7CitjbGFzcyBVbmludGVycHJldGVkT3B0aW9uOworY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDsKK2NsYXNzIFNvdXJjZUNvZGVJbmZvOworY2xhc3MgU291cmNlQ29kZUluZm9fTG9jYXRpb247CisKK2VudW0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9ET1VCTEUgPSAxLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRkxPQVQgPSAyLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UNjQgPSAzLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfVUlOVDY0ID0gNCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDMyID0gNSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVENjQgPSA2LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRklYRUQzMiA9IDcsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9CT09MID0gOCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NUUklORyA9IDksCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9HUk9VUCA9IDEwLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfTUVTU0FHRSA9IDExLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQllURVMgPSAxMiwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQzMiA9IDEzLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRU5VTSA9IDE0LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVEMzIgPSAxNSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhFRDY0ID0gMTYsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UMzIgPSAxNywKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQ2NCA9IDE4Cit9OworTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVHlwZV9NSU4gPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfTUFYID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQ2NDsKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfQVJSQVlTSVpFID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01BWCArIDE7CisKK0xJQlBST1RPQlVGX0VYUE9SVCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKTsKK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX05hbWUoRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB2YWx1ZSkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9QYXJzZSgKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlKiB2YWx1ZSkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZT4oCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKK30KK2VudW0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgeworICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTCA9IDEsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUVVJUkVEID0gMiwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfUkVQRUFURUQgPSAzCit9OworTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfSXNWYWxpZChpbnQgdmFsdWUpOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfTUlOID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9OQUw7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NQVggPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRFRDsKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9BUlJBWVNJWkUgPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NQVggKyAxOworCitMSUJQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpOworaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX05hbWUoRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9QYXJzZSgKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCogdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsPigKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKK30KK2VudW0gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHsKKyAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX1NQRUVEID0gMSwKKyAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0NPREVfU0laRSA9IDIsCisgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9MSVRFX1JVTlRJTUUgPSAzCit9OworTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0lzVmFsaWQoaW50IHZhbHVlKTsKK2NvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX01JTiA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9TUEVFRDsKK2NvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX01BWCA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9MSVRFX1JVTlRJTUU7Citjb25zdCBpbnQgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9BUlJBWVNJWkUgPSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX01BWCArIDE7CisKK0xJQlBST1RPQlVGX0VYUE9SVCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpOworaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9OYW1lKEZpbGVPcHRpb25zX09wdGltaXplTW9kZSB2YWx1ZSkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfUGFyc2UoCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlKiB2YWx1ZSkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlPigKKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CitlbnVtIEZpZWxkT3B0aW9uc19DVHlwZSB7CisgIEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkcgPSAwLAorICBGaWVsZE9wdGlvbnNfQ1R5cGVfQ09SRCA9IDEsCisgIEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkdfUElFQ0UgPSAyCit9OworTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgRmllbGRPcHRpb25zX0NUeXBlX0lzVmFsaWQoaW50IHZhbHVlKTsKK2NvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnNfQ1R5cGVfQ1R5cGVfTUlOID0gRmllbGRPcHRpb25zX0NUeXBlX1NUUklORzsKK2NvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnNfQ1R5cGVfQ1R5cGVfTUFYID0gRmllbGRPcHRpb25zX0NUeXBlX1NUUklOR19QSUVDRTsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnNfQ1R5cGVfQ1R5cGVfQVJSQVlTSVpFID0gRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX01BWCArIDE7CisKK0xJQlBST1RPQlVGX0VYUE9SVCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpOworaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkT3B0aW9uc19DVHlwZV9OYW1lKEZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnNfQ1R5cGVfUGFyc2UoCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgRmllbGRPcHRpb25zX0NUeXBlKiB2YWx1ZSkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGRPcHRpb25zX0NUeXBlPigKKyAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWxlRGVzY3JpcHRvclNldCA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRmlsZURlc2NyaXB0b3JTZXQoKTsKKyAgdmlydHVhbCB+RmlsZURlc2NyaXB0b3JTZXQoKTsKKworICBGaWxlRGVzY3JpcHRvclNldChjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSk7CisKKyAgaW5saW5lIEZpbGVEZXNjcmlwdG9yU2V0JiBvcGVyYXRvcj0oY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKEZpbGVEZXNjcmlwdG9yU2V0KiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGaWxlRGVzY3JpcHRvclNldCogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICBpbmxpbmUgaW50IGZpbGVfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9maWxlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWxlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIGFkZF9maWxlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorICAgICAgZmlsZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfZmlsZSgpOworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCisgcHJpdmF0ZToKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4gZmlsZV87CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmlsZURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRmlsZURlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5GaWxlRGVzY3JpcHRvclByb3RvKCk7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byhjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKworICBpbmxpbmUgRmlsZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoRmlsZURlc2NyaXB0b3JQcm90byogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CisgIGlubGluZSBib29sIGhhc19wYWNrYWdlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3BhY2thZ2UoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUGFja2FnZUZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHBhY2thZ2UoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3BhY2thZ2UoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfcGFja2FnZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogcGFja2FnZSk7CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICBpbmxpbmUgaW50IGRlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9kZXBlbmRlbmN5KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0RlcGVuZGVuY3lGaWVsZE51bWJlciA9IDM7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2RlcGVuZGVuY3koaW50IGluZGV4KTsKKyAgaW5saW5lIHZvaWQgc2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBhZGRfZGVwZW5kZW5jeSgpOworICBpbmxpbmUgdm9pZCBhZGRfZGVwZW5kZW5jeShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIGFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIGRlcGVuZGVuY3koKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qIG11dGFibGVfZGVwZW5kZW5jeSgpOworCisgIC8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CisgIGlubGluZSBpbnQgcHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9wdWJsaWNfZGVwZW5kZW5jeSgpOworICBzdGF0aWMgY29uc3QgaW50IGtQdWJsaWNEZXBlbmRlbmN5RmllbGROdW1iZXIgPSAxMDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgcHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3B1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIGFkZF9wdWJsaWNfZGVwZW5kZW5jeSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorICAgICAgcHVibGljX2RlcGVuZGVuY3koKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorICAgICAgbXV0YWJsZV9wdWJsaWNfZGVwZW5kZW5jeSgpOworCisgIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOworICBpbmxpbmUgaW50IHdlYWtfZGVwZW5kZW5jeV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3dlYWtfZGVwZW5kZW5jeSgpOworICBzdGF0aWMgY29uc3QgaW50IGtXZWFrRGVwZW5kZW5jeUZpZWxkTnVtYmVyID0gMTE7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHdlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfd2Vha19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIGFkZF93ZWFrX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKKyAgICAgIHdlYWtfZGVwZW5kZW5jeSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCisgICAgICBtdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgIGlubGluZSBpbnQgbWVzc2FnZV90eXBlX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbWVzc2FnZV90eXBlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VUeXBlRmllbGROdW1iZXIgPSA0OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfbWVzc2FnZV90eXBlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogYWRkX21lc3NhZ2VfdHlwZSgpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgorICAgICAgbWVzc2FnZV90eXBlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX21lc3NhZ2VfdHlwZSgpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICBpbmxpbmUgaW50IGVudW1fdHlwZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2VudW1fdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtFbnVtVHlwZUZpZWxkTnVtYmVyID0gNTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZW51bV90eXBlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIGFkZF9lbnVtX3R5cGUoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCisgICAgICBlbnVtX3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX2VudW1fdHlwZSgpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgaW5saW5lIGludCBzZXJ2aWNlX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfc2VydmljZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtTZXJ2aWNlRmllbGROdW1iZXIgPSA2OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBzZXJ2aWNlKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfc2VydmljZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBhZGRfc2VydmljZSgpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIHNlcnZpY2UoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX3NlcnZpY2UoKTsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CisgIGlubGluZSBpbnQgZXh0ZW5zaW9uX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZXh0ZW5zaW9uKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9leHRlbnNpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIGFkZF9leHRlbnNpb24oKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgorICAgICAgZXh0ZW5zaW9uKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfZXh0ZW5zaW9uKCk7CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSA4OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnMpOworCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisgIGlubGluZSBib29sIGhhc19zb3VyY2VfY29kZV9pbmZvKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrU291cmNlQ29kZUluZm9GaWVsZE51bWJlciA9IDk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvJiBzb3VyY2VfY29kZV9pbmZvKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBtdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHJlbGVhc2Vfc291cmNlX2NvZGVfaW5mbygpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX3NvdXJjZV9jb2RlX2luZm8oOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogc291cmNlX2NvZGVfaW5mbyk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3BhY2thZ2UoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisgIDo6c3RkOjpzdHJpbmcqIHBhY2thZ2VfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IGRlcGVuZGVuY3lfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiBwdWJsaWNfZGVwZW5kZW5jeV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+IHdlYWtfZGVwZW5kZW5jeV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiBtZXNzYWdlX3R5cGVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+IGVudW1fdHlwZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvID4gc2VydmljZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+IGV4dGVuc2lvbl87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnNfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvXzsKKworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxMSArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBGaWxlRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpOworICB2aXJ0dWFsIH5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKTsKKworICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKTsKKworICBpbmxpbmUgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBvcGVyYXRvcj0oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfc3RhcnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfc3RhcnQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrU3RhcnRGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHN0YXJ0KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9zdGFydCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfZW5kKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2VuZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtFbmRGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVuZCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfc3RhcnQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3N0YXJ0KCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZW5kKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19lbmQoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc3RhcnRfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVuZF87CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMiArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvclByb3RvKCk7CisgIHZpcnR1YWwgfkRlc2NyaXB0b3JQcm90bygpOworCisgIERlc2NyaXB0b3JQcm90byhjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworCisgIGlubGluZSBEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERlc2NyaXB0b3JQcm90byogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgRXh0ZW5zaW9uUmFuZ2U7CisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSk7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIGlubGluZSBpbnQgZmllbGRfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9maWVsZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZEZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2ZpZWxkKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZmllbGQoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgorICAgICAgZmllbGQoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9maWVsZCgpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNjsKKyAgaW5saW5lIGludCBleHRlbnNpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9leHRlbnNpb24oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogYWRkX2V4dGVuc2lvbigpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCisgICAgICBleHRlbnNpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9leHRlbnNpb24oKTsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIGlubGluZSBpbnQgbmVzdGVkX3R5cGVfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uZXN0ZWRfdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOZXN0ZWRUeXBlRmllbGROdW1iZXIgPSAzOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIG5lc3RlZF90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogbXV0YWJsZV9uZXN0ZWRfdHlwZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIGFkZF9uZXN0ZWRfdHlwZSgpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgorICAgICAgbmVzdGVkX3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfbmVzdGVkX3R5cGUoKTsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKKyAgaW5saW5lIGludCBlbnVtX3R5cGVfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9lbnVtX3R5cGUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRW51bVR5cGVGaWVsZE51bWJlciA9IDQ7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBhZGRfZW51bV90eXBlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgorICAgICAgZW51bV90eXBlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9lbnVtX3R5cGUoKTsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSBleHRlbnNpb25fcmFuZ2UgPSA1OworICBpbmxpbmUgaW50IGV4dGVuc2lvbl9yYW5nZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2V4dGVuc2lvbl9yYW5nZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbnNpb25SYW5nZUZpZWxkTnVtYmVyID0gNTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBleHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBtdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIGFkZF9leHRlbnNpb25fcmFuZ2UoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPiYKKyAgICAgIGV4dGVuc2lvbl9yYW5nZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+KgorICAgICAgbXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoKTsKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OworICBpbmxpbmUgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDc7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogb3B0aW9ucyk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+IGZpZWxkXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4gZXh0ZW5zaW9uXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+IG5lc3RlZF90eXBlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiBlbnVtX3R5cGVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4gZXh0ZW5zaW9uX3JhbmdlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogb3B0aW9uc187CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soNyArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpZWxkRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBGaWVsZERlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5GaWVsZERlc2NyaXB0b3JQcm90bygpOworCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKworICBpbmxpbmUgRmllbGREZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIFR5cGU7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRE9VQkxFID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0RPVUJMRTsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9GTE9BVCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GTE9BVDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9JTlQ2NCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9JTlQ2NDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9VSU5UNjQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfVUlOVDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0lOVDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDMyOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZJWEVENjQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRklYRUQ2NDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9GSVhFRDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVEMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfQk9PTCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9CT09MOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NUUklORyA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TVFJJTkc7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfR1JPVVAgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfR1JPVVA7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfTUVTU0FHRSA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9NRVNTQUdFOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0JZVEVTID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JZVEVTOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1VJTlQzMiA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRU5VTSA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9FTlVNOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NGSVhFRDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhFRDMyOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NGSVhFRDY0ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhFRDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NJTlQzMiA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0lOVDY0ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQ2NDsKKyAgc3RhdGljIGlubGluZSBib29sIFR5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3QgVHlwZSBUeXBlX01JTiA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01JTjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVHlwZV9NQVggPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVHlwZV9NQVg7CisgIHN0YXRpYyBjb25zdCBpbnQgVHlwZV9BUlJBWVNJWkUgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVHlwZV9BUlJBWVNJWkU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcioKKyAgVHlwZV9kZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFR5cGVfTmFtZShUeXBlIHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfTmFtZSh2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIFR5cGVfUGFyc2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgIFR5cGUqIHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfUGFyc2UobmFtZSwgdmFsdWUpOworICB9CisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBMYWJlbDsKKyAgc3RhdGljIGNvbnN0IExhYmVsIExBQkVMX09QVElPTkFMID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9OQUw7CisgIHN0YXRpYyBjb25zdCBMYWJlbCBMQUJFTF9SRVFVSVJFRCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUVVJUkVEOworICBzdGF0aWMgY29uc3QgTGFiZWwgTEFCRUxfUkVQRUFURUQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRFRDsKKyAgc3RhdGljIGlubGluZSBib29sIExhYmVsX0lzVmFsaWQoaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdCBMYWJlbCBMYWJlbF9NSU4gPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xhYmVsX01JTjsKKyAgc3RhdGljIGNvbnN0IExhYmVsIExhYmVsX01BWCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfTUFYOworICBzdGF0aWMgY29uc3QgaW50IExhYmVsX0FSUkFZU0laRSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfQVJSQVlTSVpFOworICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqCisgIExhYmVsX2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIExhYmVsX05hbWUoTGFiZWwgdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTmFtZSh2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIExhYmVsX1BhcnNlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICBMYWJlbCogdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfUGFyc2UobmFtZSwgdmFsdWUpOworICB9CisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSk7CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgaW5saW5lIGJvb2wgaGFzX251bWJlcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9udW1iZXIoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTnVtYmVyRmllbGROdW1iZXIgPSAzOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBudW1iZXIoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X251bWJlcig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKKyAgaW5saW5lIGJvb2wgaGFzX2xhYmVsKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2xhYmVsKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0xhYmVsRmllbGROdW1iZXIgPSA0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBsYWJlbCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbGFiZWwoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OworICBpbmxpbmUgYm9vbCBoYXNfdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl90eXBlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1R5cGVGaWVsZE51bWJlciA9IDU7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworICBpbmxpbmUgYm9vbCBoYXNfdHlwZV9uYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3R5cGVfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtUeXBlTmFtZUZpZWxkTnVtYmVyID0gNjsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHR5cGVfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfdHlwZV9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF90eXBlX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdHlwZV9uYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3R5cGVfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX3R5cGVfbmFtZSg6OnN0ZDo6c3RyaW5nKiB0eXBlX25hbWUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CisgIGlubGluZSBib29sIGhhc19leHRlbmRlZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9leHRlbmRlZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbmRlZUZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGV4dGVuZGVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9leHRlbmRlZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9leHRlbmRlZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9leHRlbmRlZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9leHRlbmRlZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9leHRlbmRlZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX2V4dGVuZGVlKDo6c3RkOjpzdHJpbmcqIGV4dGVuZGVlKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CisgIGlubGluZSBib29sIGhhc19kZWZhdWx0X3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2RlZmF1bHRfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFZhbHVlRmllbGROdW1iZXIgPSA3OworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgZGVmYXVsdF92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZGVmYXVsdF92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZGVmYXVsdF92YWx1ZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfZGVmYXVsdF92YWx1ZSg6OnN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlKTsKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSA4OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBvcHRpb25zKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX251bWJlcigpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbnVtYmVyKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfbGFiZWwoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2xhYmVsKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfdHlwZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfdHlwZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3R5cGVfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfdHlwZV9uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZXh0ZW5kZWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2V4dGVuZGVlKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcl87CisgIGludCBsYWJlbF87CisgIDo6c3RkOjpzdHJpbmcqIHR5cGVfbmFtZV87CisgIDo6c3RkOjpzdHJpbmcqIGV4dGVuZGVlXzsKKyAgOjpzdGQ6OnN0cmluZyogZGVmYXVsdF92YWx1ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBvcHRpb25zXzsKKyAgaW50IHR5cGVfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDggKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgRmllbGREZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVudW1EZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIEVudW1EZXNjcmlwdG9yUHJvdG8oKTsKKyAgdmlydHVhbCB+RW51bURlc2NyaXB0b3JQcm90bygpOworCisgIEVudW1EZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisKKyAgaW5saW5lIEVudW1EZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVudW1EZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSk7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworICBpbmxpbmUgaW50IHZhbHVlX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVmFsdWVGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgdmFsdWUoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX3ZhbHVlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogYWRkX3ZhbHVlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4mCisgICAgICB2YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV92YWx1ZSgpOworCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgIGlubGluZSBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBvcHRpb25zKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPiB2YWx1ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIG9wdGlvbnNfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgRW51bURlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKTsKKyAgdmlydHVhbCB+RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCk7CisKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisKKyAgaW5saW5lIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKKworICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfbnVtYmVyKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX251bWJlcigpOworICBzdGF0aWMgY29uc3QgaW50IGtOdW1iZXJGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbnVtYmVyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSAzOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogb3B0aW9ucyk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfbnVtYmVyKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19udW1iZXIoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKworICA6OnN0ZDo6c3RyaW5nKiBuYW1lXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiBvcHRpb25zXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBudW1iZXJfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCk7CisgIHZpcnR1YWwgflNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKTsKKworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworCisgIGlubGluZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisgIGlubGluZSBpbnQgbWV0aG9kX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbWV0aG9kKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga01ldGhvZEZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBtZXRob2QoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX21ldGhvZChpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXRob2QoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG1ldGhvZCgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9tZXRob2QoKTsKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworICBpbmxpbmUgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDM7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogb3B0aW9ucyk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4gbWV0aG9kXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogb3B0aW9uc187CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMyArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXRob2REZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIE1ldGhvZERlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5NZXRob2REZXNjcmlwdG9yUHJvdG8oKTsKKworICBNZXRob2REZXNjcmlwdG9yUHJvdG8oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKworICBpbmxpbmUgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBNZXRob2REZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKKyAgaW5saW5lIGJvb2wgaGFzX2lucHV0X3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaW5wdXRfdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtJbnB1dFR5cGVGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpbnB1dF90eXBlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9pbnB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9pbnB1dF90eXBlKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2lucHV0X3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9pbnB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIGlucHV0X3R5cGUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CisgIGlubGluZSBib29sIGhhc19vdXRwdXRfdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9vdXRwdXRfdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtPdXRwdXRUeXBlRmllbGROdW1iZXIgPSAzOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgb3V0cHV0X3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X291dHB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X291dHB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X291dHB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX291dHB1dF90eXBlKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX291dHB1dF90eXBlKCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfb3V0cHV0X3R5cGUoOjpzdGQ6OnN0cmluZyogb3V0cHV0X3R5cGUpOworCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSA0OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogb3B0aW9ucyk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfaW5wdXRfdHlwZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfaW5wdXRfdHlwZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX291dHB1dF90eXBlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworICA6OnN0ZDo6c3RyaW5nKiBpbnB1dF90eXBlXzsKKyAgOjpzdGQ6OnN0cmluZyogb3V0cHV0X3R5cGVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIG9wdGlvbnNfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDQgKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgTWV0aG9kRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWxlT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRmlsZU9wdGlvbnMoKTsKKyAgdmlydHVhbCB+RmlsZU9wdGlvbnMoKTsKKworICBGaWxlT3B0aW9ucyhjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSk7CisKKyAgaW5saW5lIEZpbGVPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IEZpbGVPcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKEZpbGVPcHRpb25zKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGaWxlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHR5cGVkZWYgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIE9wdGltaXplTW9kZTsKKyAgc3RhdGljIGNvbnN0IE9wdGltaXplTW9kZSBTUEVFRCA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9TUEVFRDsKKyAgc3RhdGljIGNvbnN0IE9wdGltaXplTW9kZSBDT0RFX1NJWkUgPSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfQ09ERV9TSVpFOworICBzdGF0aWMgY29uc3QgT3B0aW1pemVNb2RlIExJVEVfUlVOVElNRSA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9MSVRFX1JVTlRJTUU7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBPcHRpbWl6ZU1vZGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgT3B0aW1pemVNb2RlX01JTiA9CisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9NSU47CisgIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgT3B0aW1pemVNb2RlX01BWCA9CisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9NQVg7CisgIHN0YXRpYyBjb25zdCBpbnQgT3B0aW1pemVNb2RlX0FSUkFZU0laRSA9CisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9BUlJBWVNJWkU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcioKKyAgT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBPcHRpbWl6ZU1vZGVfTmFtZShPcHRpbWl6ZU1vZGUgdmFsdWUpIHsKKyAgICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX05hbWUodmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBPcHRpbWl6ZU1vZGVfUGFyc2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgIE9wdGltaXplTW9kZSogdmFsdWUpIHsKKyAgICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX1BhcnNlKG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CisgIGlubGluZSBib29sIGhhc19qYXZhX3BhY2thZ2UoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9wYWNrYWdlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0phdmFQYWNrYWdlRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgamF2YV9wYWNrYWdlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfamF2YV9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX3BhY2thZ2UoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfamF2YV9wYWNrYWdlKCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfamF2YV9wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGphdmFfcGFja2FnZSk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKKyAgaW5saW5lIGJvb2wgaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0phdmFPdXRlckNsYXNzbmFtZUZpZWxkTnVtYmVyID0gODsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGphdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX2phdmFfb3V0ZXJfY2xhc3NuYW1lKDo6c3RkOjpzdHJpbmcqIGphdmFfb3V0ZXJfY2xhc3NuYW1lKTsKKworICAvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaW5saW5lIGJvb2wgaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9tdWx0aXBsZV9maWxlcygpOworICBzdGF0aWMgY29uc3QgaW50IGtKYXZhTXVsdGlwbGVGaWxlc0ZpZWxkTnVtYmVyID0gMTA7CisgIGlubGluZSBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOworICBpbmxpbmUgYm9vbCBoYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKKyAgc3RhdGljIGNvbnN0IGludCBrSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaEZpZWxkTnVtYmVyID0gMjA7CisgIGlubGluZSBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICBpbmxpbmUgYm9vbCBoYXNfb3B0aW1pemVfZm9yKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX29wdGltaXplX2ZvcigpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpbWl6ZUZvckZpZWxkTnVtYmVyID0gOTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfb3B0aW1pemVfZm9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgZ29fcGFja2FnZSA9IDExOworICBpbmxpbmUgYm9vbCBoYXNfZ29fcGFja2FnZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9nb19wYWNrYWdlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0dvUGFja2FnZUZpZWxkTnVtYmVyID0gMTE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBnb19wYWNrYWdlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9nb19wYWNrYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2dvX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZ29fcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9nb19wYWNrYWdlKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2dvX3BhY2thZ2UoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9nb19wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGdvX3BhY2thZ2UpOworCisgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOworICBpbmxpbmUgYm9vbCBoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9jY19nZW5lcmljX3NlcnZpY2VzKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0NjR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXIgPSAxNjsKKyAgaW5saW5lIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfY2NfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICBpbmxpbmUgYm9vbCBoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOworICBzdGF0aWMgY29uc3QgaW50IGtKYXZhR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXIgPSAxNzsKKyAgaW5saW5lIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUHlHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE4OworICBpbmxpbmUgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9weV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgaW5saW5lIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKworICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhGaWxlT3B0aW9ucykKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2phdmFfcGFja2FnZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGltaXplX2ZvcigpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW1pemVfZm9yKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZ29fcGFja2FnZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZ29fcGFja2FnZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpzdGQ6OnN0cmluZyogamF2YV9wYWNrYWdlXzsKKyAgOjpzdGQ6OnN0cmluZyogamF2YV9vdXRlcl9jbGFzc25hbWVfOworICBpbnQgb3B0aW1pemVfZm9yXzsKKyAgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzXzsKKyAgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF87CisgIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlc187CisgIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzXzsKKyAgOjpzdGQ6OnN0cmluZyogZ29fcGFja2FnZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIHB5X2dlbmVyaWNfc2VydmljZXNfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEwICsgMzEpIC8gMzJdOworCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIEZpbGVPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXNzYWdlT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgTWVzc2FnZU9wdGlvbnMoKTsKKyAgdmlydHVhbCB+TWVzc2FnZU9wdGlvbnMoKTsKKworICBNZXNzYWdlT3B0aW9ucyhjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7CisKKyAgaW5saW5lIE1lc3NhZ2VPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKE1lc3NhZ2VPcHRpb25zKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBNZXNzYWdlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0V2lyZUZvcm1hdEZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KGJvb2wgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvckZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcihib29sIHZhbHVlKTsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisKKyAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoTWVzc2FnZU9wdGlvbnMpCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XzsKKyAgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXzsKKworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOworCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIE1lc3NhZ2VPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWVsZE9wdGlvbnMgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIEZpZWxkT3B0aW9ucygpOworICB2aXJ0dWFsIH5GaWVsZE9wdGlvbnMoKTsKKworICBGaWVsZE9wdGlvbnMoY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKTsKKworICBpbmxpbmUgRmllbGRPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBGaWVsZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoRmllbGRPcHRpb25zKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGaWVsZE9wdGlvbnMqIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHR5cGVkZWYgRmllbGRPcHRpb25zX0NUeXBlIENUeXBlOworICBzdGF0aWMgY29uc3QgQ1R5cGUgU1RSSU5HID0gRmllbGRPcHRpb25zX0NUeXBlX1NUUklORzsKKyAgc3RhdGljIGNvbnN0IENUeXBlIENPUkQgPSBGaWVsZE9wdGlvbnNfQ1R5cGVfQ09SRDsKKyAgc3RhdGljIGNvbnN0IENUeXBlIFNUUklOR19QSUVDRSA9IEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkdfUElFQ0U7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBDVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZCh2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGNvbnN0IENUeXBlIENUeXBlX01JTiA9CisgICAgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX01JTjsKKyAgc3RhdGljIGNvbnN0IENUeXBlIENUeXBlX01BWCA9CisgICAgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX01BWDsKKyAgc3RhdGljIGNvbnN0IGludCBDVHlwZV9BUlJBWVNJWkUgPQorICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9BUlJBWVNJWkU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcioKKyAgQ1R5cGVfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENUeXBlX05hbWUoQ1R5cGUgdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX05hbWUodmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBDVHlwZV9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgQ1R5cGUqIHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkT3B0aW9uc19DVHlwZV9QYXJzZShuYW1lLCB2YWx1ZSk7CisgIH0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107CisgIGlubGluZSBib29sIGhhc19jdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9jdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtDdHlwZUZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIGN0eXBlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9jdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfcGFja2VkKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3BhY2tlZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtQYWNrZWRGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBib29sIHBhY2tlZCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfcGFja2VkKGJvb2wgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19sYXp5KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2xhenkoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTGF6eUZpZWxkTnVtYmVyID0gNTsKKyAgaW5saW5lIGJvb2wgbGF6eSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbGF6eShib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpbmxpbmUgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9kZXByZWNhdGVkKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0RlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDM7CisgIGlubGluZSBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKKyAgaW5saW5lIGJvb2wgaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4cGVyaW1lbnRhbE1hcEtleUZpZWxkTnVtYmVyID0gOTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGV4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX2V4cGVyaW1lbnRhbF9tYXBfa2V5KDo6c3RkOjpzdHJpbmcqIGV4cGVyaW1lbnRhbF9tYXBfa2V5KTsKKworICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaW5saW5lIGJvb2wgaGFzX3dlYWsoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfd2VhaygpOworICBzdGF0aWMgY29uc3QgaW50IGtXZWFrRmllbGROdW1iZXIgPSAxMDsKKyAgaW5saW5lIGJvb2wgd2VhaygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfd2Vhayhib29sIHZhbHVlKTsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisKKyAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoRmllbGRPcHRpb25zKQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2N0eXBlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19jdHlwZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3BhY2tlZCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcGFja2VkKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfbGF6eSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbGF6eSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc193ZWFrKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc193ZWFrKCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIGludCBjdHlwZV87CisgIGJvb2wgcGFja2VkXzsKKyAgYm9vbCBsYXp5XzsKKyAgYm9vbCBkZXByZWNhdGVkXzsKKyAgYm9vbCB3ZWFrXzsKKyAgOjpzdGQ6OnN0cmluZyogZXhwZXJpbWVudGFsX21hcF9rZXlfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg3ICsgMzEpIC8gMzJdOworCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIEZpZWxkT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bU9wdGlvbnMgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIEVudW1PcHRpb25zKCk7CisgIHZpcnR1YWwgfkVudW1PcHRpb25zKCk7CisKKyAgRW51bU9wdGlvbnMoY29uc3QgRW51bU9wdGlvbnMmIGZyb20pOworCisgIGlubGluZSBFbnVtT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBFbnVtT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChFbnVtT3B0aW9ucyogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRW51bU9wdGlvbnMqIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyIFtkZWZhdWx0ID0gdHJ1ZV07CisgIGlubGluZSBib29sIGhhc19hbGxvd19hbGlhcygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9hbGxvd19hbGlhcygpOworICBzdGF0aWMgY29uc3QgaW50IGtBbGxvd0FsaWFzRmllbGROdW1iZXIgPSAyOworICBpbmxpbmUgYm9vbCBhbGxvd19hbGlhcygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfYWxsb3dfYWxpYXMoYm9vbCB2YWx1ZSk7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBpbmxpbmUgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOworCisgIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKEVudW1PcHRpb25zKQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfYWxsb3dfYWxpYXMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2FsbG93X2FsaWFzKCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIGFsbG93X2FsaWFzXzsKKworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygyICsgMzEpIC8gMzJdOworCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIEVudW1PcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFbnVtVmFsdWVPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBFbnVtVmFsdWVPcHRpb25zKCk7CisgIHZpcnR1YWwgfkVudW1WYWx1ZU9wdGlvbnMoKTsKKworICBFbnVtVmFsdWVPcHRpb25zKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pOworCisgIGlubGluZSBFbnVtVmFsdWVPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFbnVtVmFsdWVPcHRpb25zKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBpbmxpbmUgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOworCisgIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKEVudW1WYWx1ZU9wdGlvbnMpCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyBwcml2YXRlOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOworCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIEVudW1WYWx1ZU9wdGlvbnMqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNlcnZpY2VPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBTZXJ2aWNlT3B0aW9ucygpOworICB2aXJ0dWFsIH5TZXJ2aWNlT3B0aW9ucygpOworCisgIFNlcnZpY2VPcHRpb25zKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKTsKKworICBpbmxpbmUgU2VydmljZU9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgU2VydmljZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoU2VydmljZU9wdGlvbnMqIG90aGVyKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNlcnZpY2VPcHRpb25zKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisKKyAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoU2VydmljZU9wdGlvbnMpCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCisgcHJpdmF0ZToKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTWV0aG9kT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgTWV0aG9kT3B0aW9ucygpOworICB2aXJ0dWFsIH5NZXRob2RPcHRpb25zKCk7CisKKyAgTWV0aG9kT3B0aW9ucyhjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKTsKKworICBpbmxpbmUgTWV0aG9kT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IE1ldGhvZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoTWV0aG9kT3B0aW9ucyogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgTWV0aG9kT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgaW5saW5lIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKworICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhNZXRob2RPcHRpb25zKQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCisgcHJpdmF0ZToKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBNZXRob2RPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0IDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCk7CisgIHZpcnR1YWwgflVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoKTsKKworICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pOworCisgIGlubGluZSBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBvcGVyYXRvcj0oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgIGlubGluZSBib29sIGhhc19uYW1lX3BhcnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZV9wYXJ0KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVQYXJ0RmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZV9wYXJ0KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uYW1lX3BhcnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZV9wYXJ0KGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lX3BhcnQoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZV9wYXJ0KCk7CisgIGlubGluZSB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZV9wYXJ0KDo6c3RkOjpzdHJpbmcqIG5hbWVfcGFydCk7CisKKyAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworICBpbmxpbmUgYm9vbCBoYXNfaXNfZXh0ZW5zaW9uKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2lzX2V4dGVuc2lvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtJc0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGJvb2wgaXNfZXh0ZW5zaW9uKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9pc19leHRlbnNpb24oYm9vbCB2YWx1ZSk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZV9wYXJ0KCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lX3BhcnQoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19pc19leHRlbnNpb24oKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2lzX2V4dGVuc2lvbigpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV9wYXJ0XzsKKyAgYm9vbCBpc19leHRlbnNpb25fOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDIgKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVW5pbnRlcnByZXRlZE9wdGlvbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgVW5pbnRlcnByZXRlZE9wdGlvbigpOworICB2aXJ0dWFsIH5VbmludGVycHJldGVkT3B0aW9uKCk7CisKKyAgVW5pbnRlcnByZXRlZE9wdGlvbihjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKKworICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVW5pbnRlcnByZXRlZE9wdGlvbiogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0eXBlZGVmIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgTmFtZVBhcnQ7CisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CisgIGlubGluZSBpbnQgbmFtZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgbmFtZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBtdXRhYmxlX25hbWUoaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogYWRkX25hbWUoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4mCisgICAgICBuYW1lKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgorICAgICAgbXV0YWJsZV9uYW1lKCk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICBpbmxpbmUgYm9vbCBoYXNfaWRlbnRpZmllcl92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9pZGVudGlmaWVyX3ZhbHVlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0lkZW50aWZpZXJWYWx1ZUZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGlkZW50aWZpZXJfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfaWRlbnRpZmllcl92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX2lkZW50aWZpZXJfdmFsdWUoOjpzdGQ6OnN0cmluZyogaWRlbnRpZmllcl92YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgIGlubGluZSBib29sIGhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfcG9zaXRpdmVfaW50X3ZhbHVlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1Bvc2l0aXZlSW50VmFsdWVGaWVsZE51bWJlciA9IDQ7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3Bvc2l0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgaW5saW5lIGJvb2wgaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmVnYXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyID0gNTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CisgIGlubGluZSBib29sIGhhc19kb3VibGVfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZG91YmxlX3ZhbHVlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0RvdWJsZVZhbHVlRmllbGROdW1iZXIgPSA2OworICBpbmxpbmUgZG91YmxlIGRvdWJsZV92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKKyAgaW5saW5lIGJvb2wgaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9zdHJpbmdfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrU3RyaW5nVmFsdWVGaWVsZE51bWJlciA9IDc7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHJpbmdfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3N0cmluZ192YWx1ZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9zdHJpbmdfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9zdHJpbmdfdmFsdWUoOjpzdGQ6OnN0cmluZyogc3RyaW5nX3ZhbHVlKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKKyAgaW5saW5lIGJvb2wgaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrQWdncmVnYXRlVmFsdWVGaWVsZE51bWJlciA9IDg7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBhZ2dyZWdhdGVfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF9hZ2dyZWdhdGVfdmFsdWUoOjpzdGQ6OnN0cmluZyogYWdncmVnYXRlX3ZhbHVlKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RvdWJsZV92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZG91YmxlX3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPiBuYW1lXzsKKyAgOjpzdGQ6OnN0cmluZyogaWRlbnRpZmllcl92YWx1ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IHBvc2l0aXZlX2ludF92YWx1ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlXzsKKyAgZG91YmxlIGRvdWJsZV92YWx1ZV87CisgIDo6c3RkOjpzdHJpbmcqIHN0cmluZ192YWx1ZV87CisgIDo6c3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZV87CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soNyArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBVbmludGVycHJldGVkT3B0aW9uKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKKyAgdmlydHVhbCB+U291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKKworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbihjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSk7CisKKyAgaW5saW5lIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBvcGVyYXRvcj0oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICBpbmxpbmUgaW50IHBhdGhfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9wYXRoKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1BhdGhGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHBhdGgoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3BhdGgoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgYWRkX3BhdGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKKyAgICAgIHBhdGgoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorICAgICAgbXV0YWJsZV9wYXRoKCk7CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOworICBpbmxpbmUgaW50IHNwYW5fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9zcGFuKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1NwYW5GaWVsZE51bWJlciA9IDI7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHNwYW4oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3NwYW4oaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgYWRkX3NwYW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKKyAgICAgIHNwYW4oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorICAgICAgbXV0YWJsZV9zcGFuKCk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGxlYWRpbmdfY29tbWVudHMgPSAzOworICBpbmxpbmUgYm9vbCBoYXNfbGVhZGluZ19jb21tZW50cygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9sZWFkaW5nX2NvbW1lbnRzKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0xlYWRpbmdDb21tZW50c0ZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGxlYWRpbmdfY29tbWVudHMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbGVhZGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbGVhZGluZ19jb21tZW50cygpOworICBpbmxpbmUgdm9pZCBzZXRfYWxsb2NhdGVkX2xlYWRpbmdfY29tbWVudHMoOjpzdGQ6OnN0cmluZyogbGVhZGluZ19jb21tZW50cyk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKKyAgaW5saW5lIGJvb2wgaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1RyYWlsaW5nQ29tbWVudHNGaWVsZE51bWJlciA9IDQ7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiB0cmFpbGluZ19jb21tZW50cygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2FsbG9jYXRlZF90cmFpbGluZ19jb21tZW50cyg6OnN0ZDo6c3RyaW5nKiB0cmFpbGluZ19jb21tZW50cyk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+IHBhdGhfOworICBtdXRhYmxlIGludCBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4gc3Bhbl87CisgIG11dGFibGUgaW50IF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfOworICA6OnN0ZDo6c3RyaW5nKiBsZWFkaW5nX2NvbW1lbnRzXzsKKyAgOjpzdGQ6OnN0cmluZyogdHJhaWxpbmdfY29tbWVudHNfOworCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDQgKyAzMSkgLyAzMl07CisKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNvdXJjZUNvZGVJbmZvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBTb3VyY2VDb2RlSW5mbygpOworICB2aXJ0dWFsIH5Tb3VyY2VDb2RlSW5mbygpOworCisgIFNvdXJjZUNvZGVJbmZvKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKTsKKworICBpbmxpbmUgU291cmNlQ29kZUluZm8mIG9wZXJhdG9yPShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgU291cmNlQ29kZUluZm8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICB2b2lkIFN3YXAoU291cmNlQ29kZUluZm8qIG90aGVyKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNvdXJjZUNvZGVJbmZvKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiBMb2NhdGlvbjsKKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOworICBpbmxpbmUgaW50IGxvY2F0aW9uX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbG9jYXRpb24oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTG9jYXRpb25GaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBsb2NhdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogbXV0YWJsZV9sb2NhdGlvbihpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogYWRkX2xvY2F0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiYKKyAgICAgIGxvY2F0aW9uKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPioKKyAgICAgIG11dGFibGVfbG9jYXRpb24oKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQorIHByaXZhdGU6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiBsb2NhdGlvbl87CisKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKKworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBTb3VyY2VDb2RlSW5mbyogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gRmlsZURlc2NyaXB0b3JTZXQKKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclNldDo6ZmlsZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZmlsZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OmNsZWFyX2ZpbGUoKSB7CisgIGZpbGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclNldDo6ZmlsZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclNldDo6bXV0YWJsZV9maWxlKGludCBpbmRleCkgeworICByZXR1cm4gZmlsZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclNldDo6YWRkX2ZpbGUoKSB7CisgIHJldHVybiBmaWxlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGUoKSBjb25zdCB7CisgIHJldHVybiBmaWxlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgorRmlsZURlc2NyaXB0b3JTZXQ6Om11dGFibGVfZmlsZSgpIHsKKyAgcmV0dXJuICZmaWxlXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGaWxlRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICByZXR1cm4gKm5hbWVfOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBuYW1lXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAobmFtZSkgeworICAgIHNldF9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKK2lubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19wYWNrYWdlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfcGFja2FnZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3BhY2thZ2UoKSB7CisgIGlmIChwYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcGFja2FnZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX3BhY2thZ2UoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpwYWNrYWdlKCkgY29uc3QgeworICByZXR1cm4gKnBhY2thZ2VfOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19wYWNrYWdlKCk7CisgIGlmIChwYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBwYWNrYWdlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfcGFja2FnZSgpOworICBpZiAocGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhY2thZ2VfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcGFja2FnZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19wYWNrYWdlKCk7CisgIGlmIChwYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBwYWNrYWdlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9wYWNrYWdlKCkgeworICBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgaWYgKHBhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBwYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBwYWNrYWdlXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3BhY2thZ2UoKSB7CisgIGNsZWFyX2hhc19wYWNrYWdlKCk7CisgIGlmIChwYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IHBhY2thZ2VfOworICAgIHBhY2thZ2VfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogcGFja2FnZSkgeworICBpZiAocGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBwYWNrYWdlXzsKKyAgfQorICBpZiAocGFja2FnZSkgeworICAgIHNldF9oYXNfcGFja2FnZSgpOworICAgIHBhY2thZ2VfID0gcGFja2FnZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfcGFja2FnZSgpOworICAgIHBhY2thZ2VfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVwZW5kZW5jeV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZGVwZW5kZW5jeV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZGVwZW5kZW5jeSgpIHsKKyAgZGVwZW5kZW5jeV8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gZGVwZW5kZW5jeV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlcGVuZGVuY3koaW50IGluZGV4KSB7CisgIHJldHVybiBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGRlcGVuZGVuY3lfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KCkgeworICByZXR1cm4gZGVwZW5kZW5jeV8uQWRkKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBkZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGRlcGVuZGVuY3lfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIGRlcGVuZGVuY3lfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVwZW5kZW5jeSgpIGNvbnN0IHsKKyAgcmV0dXJuIGRlcGVuZGVuY3lfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlcGVuZGVuY3koKSB7CisgIHJldHVybiAmZGVwZW5kZW5jeV87Cit9CisKKy8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CitpbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7CisgIHJldHVybiBwdWJsaWNfZGVwZW5kZW5jeV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcHVibGljX2RlcGVuZGVuY3koKSB7CisgIHB1YmxpY19kZXBlbmRlbmN5Xy5DbGVhcigpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRmlsZURlc2NyaXB0b3JQcm90bzo6cHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBwdWJsaWNfZGVwZW5kZW5jeV8uR2V0KGluZGV4KTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9wdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgcHVibGljX2RlcGVuZGVuY3lfLlNldChpbmRleCwgdmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3B1YmxpY19kZXBlbmRlbmN5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgcHVibGljX2RlcGVuZGVuY3lfLkFkZCh2YWx1ZSk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCitGaWxlRGVzY3JpcHRvclByb3RvOjpwdWJsaWNfZGVwZW5kZW5jeSgpIGNvbnN0IHsKKyAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5XzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSB7CisgIHJldHVybiAmcHVibGljX2RlcGVuZGVuY3lfOworfQorCisvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7CisgIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3dlYWtfZGVwZW5kZW5jeSgpIHsKKyAgd2Vha19kZXBlbmRlbmN5Xy5DbGVhcigpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gd2Vha19kZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3dlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgd2Vha19kZXBlbmRlbmN5Xy5TZXQoaW5kZXgsIHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF93ZWFrX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICB3ZWFrX2RlcGVuZGVuY3lfLkFkZCh2YWx1ZSk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCitGaWxlRGVzY3JpcHRvclByb3RvOjp3ZWFrX2RlcGVuZGVuY3koKSBjb25zdCB7CisgIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKSB7CisgIHJldHVybiAmd2Vha19kZXBlbmRlbmN5XzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBtZXNzYWdlX3R5cGVfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX21lc3NhZ2VfdHlwZSgpIHsKKyAgbWVzc2FnZV90eXBlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjptZXNzYWdlX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBtZXNzYWdlX3R5cGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWVzc2FnZV90eXBlKGludCBpbmRleCkgeworICByZXR1cm4gbWVzc2FnZV90eXBlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX21lc3NhZ2VfdHlwZSgpIHsKKyAgcmV0dXJuIG1lc3NhZ2VfdHlwZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlKCkgY29uc3QgeworICByZXR1cm4gbWVzc2FnZV90eXBlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZSgpIHsKKyAgcmV0dXJuICZtZXNzYWdlX3R5cGVfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBlbnVtX3R5cGVfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2VudW1fdHlwZSgpIHsKKyAgZW51bV90eXBlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gZW51bV90eXBlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoaW50IGluZGV4KSB7CisgIHJldHVybiBlbnVtX3R5cGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2VudW1fdHlwZSgpIHsKKyAgcmV0dXJuIGVudW1fdHlwZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGVudW1fdHlwZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKCkgeworICByZXR1cm4gJmVudW1fdHlwZV87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gc2VydmljZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfc2VydmljZSgpIHsKKyAgc2VydmljZV8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNlcnZpY2UoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBzZXJ2aWNlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9zZXJ2aWNlKGludCBpbmRleCkgeworICByZXR1cm4gc2VydmljZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfc2VydmljZSgpIHsKKyAgcmV0dXJuIHNlcnZpY2VfLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvID4mCitGaWxlRGVzY3JpcHRvclByb3RvOjpzZXJ2aWNlKCkgY29uc3QgeworICByZXR1cm4gc2VydmljZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc2VydmljZSgpIHsKKyAgcmV0dXJuICZzZXJ2aWNlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGV4dGVuc2lvbl8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5zaW9uKCkgeworICBleHRlbnNpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCkgeworICByZXR1cm4gZXh0ZW5zaW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZXh0ZW5zaW9uKCkgeworICByZXR1cm4gZXh0ZW5zaW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKKyAgcmV0dXJuIGV4dGVuc2lvbl87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbigpIHsKKyAgcmV0dXJuICZleHRlbnNpb25fOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworaW5saW5lIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAyMDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAyMDB1OworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAyMDB1OworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMmIEZpbGVEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIHNldF9oYXNfb3B0aW9ucygpOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczsKKyAgcmV0dXJuIG9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworaW5saW5lIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX3NvdXJjZV9jb2RlX2luZm8oKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDA0MDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDA0MDB1OworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3NvdXJjZV9jb2RlX2luZm8oKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA0MDB1OworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgaWYgKHNvdXJjZV9jb2RlX2luZm9fICE9IE5VTEwpIHNvdXJjZV9jb2RlX2luZm9fLT46Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvOjpDbGVhcigpOworICBjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8mIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNvdXJjZV9jb2RlX2luZm8oKSBjb25zdCB7CisgIHJldHVybiBzb3VyY2VfY29kZV9pbmZvXyAhPSBOVUxMID8gKnNvdXJjZV9jb2RlX2luZm9fIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5zb3VyY2VfY29kZV9pbmZvXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKSB7CisgIHNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpOworICBpZiAoc291cmNlX2NvZGVfaW5mb18gPT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbzsKKyAgcmV0dXJuIHNvdXJjZV9jb2RlX2luZm9fOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgY2xlYXJfaGFzX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogdGVtcCA9IHNvdXJjZV9jb2RlX2luZm9fOworICBzb3VyY2VfY29kZV9pbmZvXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9zb3VyY2VfY29kZV9pbmZvKDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm8pIHsKKyAgZGVsZXRlIHNvdXJjZV9jb2RlX2luZm9fOworICBzb3VyY2VfY29kZV9pbmZvXyA9IHNvdXJjZV9jb2RlX2luZm87CisgIGlmIChzb3VyY2VfY29kZV9pbmZvKSB7CisgICAgc2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZQorCisvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Omhhc19zdGFydCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9oYXNfc3RhcnQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmNsZWFyX2hhc19zdGFydCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmNsZWFyX3N0YXJ0KCkgeworICBzdGFydF8gPSAwOworICBjbGVhcl9oYXNfc3RhcnQoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c3RhcnQoKSBjb25zdCB7CisgIHJldHVybiBzdGFydF87Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9zdGFydCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHNldF9oYXNfc3RhcnQoKTsKKyAgc3RhcnRfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Omhhc19lbmQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzZXRfaGFzX2VuZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfaGFzX2VuZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmNsZWFyX2VuZCgpIHsKKyAgZW5kXyA9IDA7CisgIGNsZWFyX2hhc19lbmQoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZW5kKCkgY29uc3QgeworICByZXR1cm4gZW5kXzsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X2VuZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHNldF9oYXNfZW5kKCk7CisgIGVuZF8gPSB2YWx1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICByZXR1cm4gKm5hbWVfOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICBjbGVhcl9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKKyAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAobmFtZSkgeworICAgIHNldF9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmZpZWxkX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBmaWVsZF8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9maWVsZCgpIHsKKyAgZmllbGRfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpZWxkXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9maWVsZChpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGZpZWxkXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9maWVsZCgpIHsKKyAgcmV0dXJuIGZpZWxkXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZmllbGQoKSBjb25zdCB7CisgIHJldHVybiBmaWVsZF87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCitEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZmllbGQoKSB7CisgIHJldHVybiAmZmllbGRfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBleHRlbnNpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5zaW9uKCkgeworICBleHRlbnNpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBleHRlbnNpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfZXh0ZW5zaW9uKCkgeworICByZXR1cm4gZXh0ZW5zaW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb24oKSB7CisgIHJldHVybiAmZXh0ZW5zaW9uXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86Om5lc3RlZF90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBuZXN0ZWRfdHlwZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uZXN0ZWRfdHlwZSgpIHsKKyAgbmVzdGVkX3R5cGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBuZXN0ZWRfdHlwZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25lc3RlZF90eXBlKGludCBpbmRleCkgeworICByZXR1cm4gbmVzdGVkX3R5cGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9uZXN0ZWRfdHlwZSgpIHsKKyAgcmV0dXJuIG5lc3RlZF90eXBlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4mCitEZXNjcmlwdG9yUHJvdG86Om5lc3RlZF90eXBlKCkgY29uc3QgeworICByZXR1cm4gbmVzdGVkX3R5cGVfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uZXN0ZWRfdHlwZSgpIHsKKyAgcmV0dXJuICZuZXN0ZWRfdHlwZV87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZW51bV90eXBlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2VudW1fdHlwZSgpIHsKKyAgZW51bV90eXBlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKGludCBpbmRleCkgeworICByZXR1cm4gZW51bV90eXBlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2VudW1fdHlwZSgpIHsKKyAgcmV0dXJuIGVudW1fdHlwZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgeworICByZXR1cm4gZW51bV90eXBlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZSgpIHsKKyAgcmV0dXJuICZlbnVtX3R5cGVfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSBleHRlbnNpb25fcmFuZ2UgPSA1OworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2V4dGVuc2lvbl9yYW5nZSgpIHsKKyAgZXh0ZW5zaW9uX3JhbmdlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbl9yYW5nZSgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgorRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2UoKSBjb25zdCB7CisgIHJldHVybiBleHRlbnNpb25fcmFuZ2VfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoKSB7CisgIHJldHVybiAmZXh0ZW5zaW9uX3JhbmdlXzsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMmIERlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM7CisgIHJldHVybiBvcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogb3B0aW9ucykgeworICBkZWxldGUgb3B0aW9uc187CisgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb3B0aW9ucygpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmllbGREZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpuYW1lXzsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKG5hbWUpIHsKKyAgICBzZXRfaGFzX25hbWUoKTsKKyAgICBuYW1lXyA9IG5hbWU7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX25hbWUoKTsKKyAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19udW1iZXIoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbnVtYmVyKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19udW1iZXIoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX251bWJlcigpIHsKKyAgbnVtYmVyXyA9IDA7CisgIGNsZWFyX2hhc19udW1iZXIoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEZpZWxkRGVzY3JpcHRvclByb3RvOjpudW1iZXIoKSBjb25zdCB7CisgIHJldHVybiBudW1iZXJfOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX251bWJlcigpOworICBudW1iZXJfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19sYWJlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19sYWJlbCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbGFiZWwoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2xhYmVsKCkgeworICBsYWJlbF8gPSAxOworICBjbGVhcl9oYXNfbGFiZWwoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpsYWJlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsID4obGFiZWxfKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbGFiZWwoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSkgeworICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfbGFiZWwoKTsKKyAgbGFiZWxfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc190eXBlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc190eXBlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl90eXBlKCkgeworICB0eXBlXyA9IDE7CisgIGNsZWFyX2hhc190eXBlKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjp0eXBlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSA+KHR5cGVfKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpIHsKKyAgYXNzZXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfdHlwZSgpOworICB0eXBlXyA9IHZhbHVlOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfdHlwZV9uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3R5cGVfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfdHlwZV9uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl90eXBlX25hbWUoKSB7CisgIGlmICh0eXBlX25hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0eXBlX25hbWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc190eXBlX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6dHlwZV9uYW1lKCkgY29uc3QgeworICByZXR1cm4gKnR5cGVfbmFtZV87Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3R5cGVfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX3R5cGVfbmFtZSgpOworICBpZiAodHlwZV9uYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgdHlwZV9uYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHR5cGVfbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX3R5cGVfbmFtZSgpOworICBpZiAodHlwZV9uYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgdHlwZV9uYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHR5cGVfbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc190eXBlX25hbWUoKTsKKyAgaWYgKHR5cGVfbmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHR5cGVfbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICB0eXBlX25hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV90eXBlX25hbWUoKSB7CisgIHNldF9oYXNfdHlwZV9uYW1lKCk7CisgIGlmICh0eXBlX25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0eXBlX25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIHR5cGVfbmFtZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfdHlwZV9uYW1lKCkgeworICBjbGVhcl9oYXNfdHlwZV9uYW1lKCk7CisgIGlmICh0eXBlX25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gdHlwZV9uYW1lXzsKKyAgICB0eXBlX25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF90eXBlX25hbWUoOjpzdGQ6OnN0cmluZyogdHlwZV9uYW1lKSB7CisgIGlmICh0eXBlX25hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgdHlwZV9uYW1lXzsKKyAgfQorICBpZiAodHlwZV9uYW1lKSB7CisgICAgc2V0X2hhc190eXBlX25hbWUoKTsKKyAgICB0eXBlX25hbWVfID0gdHlwZV9uYW1lOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc190eXBlX25hbWUoKTsKKyAgICB0eXBlX25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2V4dGVuZGVlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2V4dGVuZGVlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19leHRlbmRlZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5kZWUoKSB7CisgIGlmIChleHRlbmRlZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGV4dGVuZGVlXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5kZWUoKSBjb25zdCB7CisgIHJldHVybiAqZXh0ZW5kZWVfOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9leHRlbmRlZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2V4dGVuZGVlKCk7CisgIGlmIChleHRlbmRlZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGV4dGVuZGVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGV4dGVuZGVlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19leHRlbmRlZSgpOworICBpZiAoZXh0ZW5kZWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBleHRlbmRlZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBleHRlbmRlZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2V4dGVuZGVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2V4dGVuZGVlKCk7CisgIGlmIChleHRlbmRlZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGV4dGVuZGVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGV4dGVuZGVlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5kZWUoKSB7CisgIHNldF9oYXNfZXh0ZW5kZWUoKTsKKyAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXh0ZW5kZWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIGV4dGVuZGVlXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9leHRlbmRlZSgpIHsKKyAgY2xlYXJfaGFzX2V4dGVuZGVlKCk7CisgIGlmIChleHRlbmRlZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBleHRlbmRlZV87CisgICAgZXh0ZW5kZWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9leHRlbmRlZSg6OnN0ZDo6c3RyaW5nKiBleHRlbmRlZSkgeworICBpZiAoZXh0ZW5kZWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgZXh0ZW5kZWVfOworICB9CisgIGlmIChleHRlbmRlZSkgeworICAgIHNldF9oYXNfZXh0ZW5kZWUoKTsKKyAgICBleHRlbmRlZV8gPSBleHRlbmRlZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKKyAgICBleHRlbmRlZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19kZWZhdWx0X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2RlZmF1bHRfdmFsdWUoKSB7CisgIGlmIChkZWZhdWx0X3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVmYXVsdF92YWx1ZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpkZWZhdWx0X3ZhbHVlXzsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZGVmYXVsdF92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgaWYgKGRlZmF1bHRfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWZhdWx0X3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGRlZmF1bHRfdmFsdWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpZiAoZGVmYXVsdF92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlZmF1bHRfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZGVmYXVsdF92YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpZiAoZGVmYXVsdF92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlZmF1bHRfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZGVmYXVsdF92YWx1ZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlZmF1bHRfdmFsdWUoKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpZiAoZGVmYXVsdF92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlZmF1bHRfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2RlZmF1bHRfdmFsdWUoKSB7CisgIGNsZWFyX2hhc19kZWZhdWx0X3ZhbHVlKCk7CisgIGlmIChkZWZhdWx0X3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGRlZmF1bHRfdmFsdWVfOworICAgIGRlZmF1bHRfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9kZWZhdWx0X3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUpIHsKKyAgaWYgKGRlZmF1bHRfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgZGVmYXVsdF92YWx1ZV87CisgIH0KKyAgaWYgKGRlZmF1bHRfdmFsdWUpIHsKKyAgICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgICBkZWZhdWx0X3ZhbHVlXyA9IGRlZmF1bHRfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgICBkZWZhdWx0X3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOworICByZXR1cm4gb3B0aW9uc187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187CisgIG9wdGlvbnNfID0gTlVMTDsKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBvcHRpb25zKSB7CisgIGRlbGV0ZSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBvcHRpb25zOworICBpZiAob3B0aW9ucykgeworICAgIHNldF9oYXNfb3B0aW9ucygpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBFbnVtRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICByZXR1cm4gKm5hbWVfOworfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBuYW1lXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAobmFtZSkgeworICAgIHNldF9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKK2lubGluZSBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHZhbHVlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl92YWx1ZSgpIHsKKyAgdmFsdWVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIEVudW1EZXNjcmlwdG9yUHJvdG86OnZhbHVlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdmFsdWVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdmFsdWUoaW50IGluZGV4KSB7CisgIHJldHVybiB2YWx1ZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86OmFkZF92YWx1ZSgpIHsKKyAgcmV0dXJuIHZhbHVlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4mCitFbnVtRGVzY3JpcHRvclByb3RvOjp2YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHZhbHVlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4qCitFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3ZhbHVlKCkgeworICByZXR1cm4gJnZhbHVlXzsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKK2lubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9uczo6Q2xlYXIoKTsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zJiBFbnVtRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM7CisgIHJldHVybiBvcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBvcHRpb25zKSB7CisgIGRlbGV0ZSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBvcHRpb25zOworICBpZiAob3B0aW9ucykgeworICAgIHNldF9oYXNfb3B0aW9ucygpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIGJvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICByZXR1cm4gKm5hbWVfOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICBjbGVhcl9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKKyAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAobmFtZSkgeworICAgIHNldF9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CitpbmxpbmUgYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Omhhc19udW1iZXIoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX251bWJlcigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX251bWJlcigpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX251bWJlcigpIHsKKyAgbnVtYmVyXyA9IDA7CisgIGNsZWFyX2hhc19udW1iZXIoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgeworICByZXR1cm4gbnVtYmVyXzsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X251bWJlcig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHNldF9oYXNfbnVtYmVyKCk7CisgIG51bWJlcl8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworaW5saW5lIGJvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczo6Q2xlYXIoKTsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMmIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIHNldF9oYXNfb3B0aW9ucygpOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zOworICByZXR1cm4gb3B0aW9uc187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187CisgIG9wdGlvbnNfID0gTlVMTDsKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIGJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfbmFtZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiAqbmFtZV87Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgY2xlYXJfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gbmFtZV87CisgICAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KK2lubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIG5hbWVfOworICB9CisgIGlmIChuYW1lKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CisgICAgbmFtZV8gPSBuYW1lOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19uYW1lKCk7CisgICAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKK2lubGluZSBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBtZXRob2RfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX21ldGhvZCgpIHsKKyAgbWV0aG9kXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2QoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBtZXRob2RfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWV0aG9kKGludCBpbmRleCkgeworICByZXR1cm4gbWV0aG9kXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogU2VydmljZURlc2NyaXB0b3JQcm90bzo6YWRkX21ldGhvZCgpIHsKKyAgcmV0dXJuIG1ldGhvZF8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+JgorU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kKCkgY29uc3QgeworICByZXR1cm4gbWV0aG9kXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4qCitTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21ldGhvZCgpIHsKKyAgcmV0dXJuICZtZXRob2RfOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworaW5saW5lIGJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIHNldF9oYXNfb3B0aW9ucygpOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9uczsKKyAgcmV0dXJuIG9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1ldGhvZERlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiAqbmFtZV87Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gbmFtZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIG5hbWVfOworICB9CisgIGlmIChuYW1lKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CisgICAgbmFtZV8gPSBuYW1lOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19uYW1lKCk7CisgICAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOworaW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfaW5wdXRfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfaW5wdXRfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2lucHV0X3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9pbnB1dF90eXBlKCkgeworICBpZiAoaW5wdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlucHV0X3R5cGVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjppbnB1dF90eXBlKCkgY29uc3QgeworICByZXR1cm4gKmlucHV0X3R5cGVfOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaW5wdXRfdHlwZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKKyAgaWYgKGlucHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnB1dF90eXBlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGlucHV0X3R5cGVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKKyAgaWYgKGlucHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnB1dF90eXBlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGlucHV0X3R5cGVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19pbnB1dF90eXBlKCk7CisgIGlmIChpbnB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgaW5wdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBpbnB1dF90eXBlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2lucHV0X3R5cGUoKSB7CisgIHNldF9oYXNfaW5wdXRfdHlwZSgpOworICBpZiAoaW5wdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlucHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIGlucHV0X3R5cGVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9pbnB1dF90eXBlKCkgeworICBjbGVhcl9oYXNfaW5wdXRfdHlwZSgpOworICBpZiAoaW5wdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBpbnB1dF90eXBlXzsKKyAgICBpbnB1dF90eXBlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2lucHV0X3R5cGUoOjpzdGQ6OnN0cmluZyogaW5wdXRfdHlwZSkgeworICBpZiAoaW5wdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBpbnB1dF90eXBlXzsKKyAgfQorICBpZiAoaW5wdXRfdHlwZSkgeworICAgIHNldF9oYXNfaW5wdXRfdHlwZSgpOworICAgIGlucHV0X3R5cGVfID0gaW5wdXRfdHlwZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfaW5wdXRfdHlwZSgpOworICAgIGlucHV0X3R5cGVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19vdXRwdXRfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3V0cHV0X3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vdXRwdXRfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX291dHB1dF90eXBlKCkgeworICBpZiAob3V0cHV0X3R5cGVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBvdXRwdXRfdHlwZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX291dHB1dF90eXBlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpvdXRwdXRfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpvdXRwdXRfdHlwZV87Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX291dHB1dF90eXBlKCk7CisgIGlmIChvdXRwdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG91dHB1dF90eXBlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG91dHB1dF90eXBlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X291dHB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKKyAgaWYgKG91dHB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgb3V0cHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgb3V0cHV0X3R5cGVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKKyAgaWYgKG91dHB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgb3V0cHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgb3V0cHV0X3R5cGVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3V0cHV0X3R5cGUoKSB7CisgIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKKyAgaWYgKG91dHB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgb3V0cHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG91dHB1dF90eXBlXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3V0cHV0X3R5cGUoKSB7CisgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOworICBpZiAob3V0cHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gb3V0cHV0X3R5cGVfOworICAgIG91dHB1dF90eXBlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX291dHB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIG91dHB1dF90eXBlKSB7CisgIGlmIChvdXRwdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBvdXRwdXRfdHlwZV87CisgIH0KKyAgaWYgKG91dHB1dF90eXBlKSB7CisgICAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOworICAgIG91dHB1dF90eXBlXyA9IG91dHB1dF90eXBlOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOworICAgIG91dHB1dF90eXBlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgc2V0X2hhc19vcHRpb25zKCk7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnM7CisgIHJldHVybiBvcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICBjbGVhcl9oYXNfb3B0aW9ucygpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogb3B0aW9ucykgeworICBkZWxldGUgb3B0aW9uc187CisgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb3B0aW9ucygpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmlsZU9wdGlvbnMKKworLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX3BhY2thZ2UoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfcGFja2FnZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9wYWNrYWdlKCkgeworICBpZiAoamF2YV9wYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgamF2YV9wYWNrYWdlXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmphdmFfcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpqYXZhX3BhY2thZ2VfOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKKyAgaWYgKGphdmFfcGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGphdmFfcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBqYXZhX3BhY2thZ2VfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKKyAgaWYgKGphdmFfcGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGphdmFfcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBqYXZhX3BhY2thZ2VfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CisgIGlmIChqYXZhX3BhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBqYXZhX3BhY2thZ2VfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgamF2YV9wYWNrYWdlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfamF2YV9wYWNrYWdlKCkgeworICBzZXRfaGFzX2phdmFfcGFja2FnZSgpOworICBpZiAoamF2YV9wYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgamF2YV9wYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBqYXZhX3BhY2thZ2VfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX2phdmFfcGFja2FnZSgpIHsKKyAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOworICBpZiAoamF2YV9wYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGphdmFfcGFja2FnZV87CisgICAgamF2YV9wYWNrYWdlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfamF2YV9wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGphdmFfcGFja2FnZSkgeworICBpZiAoamF2YV9wYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGphdmFfcGFja2FnZV87CisgIH0KKyAgaWYgKGphdmFfcGFja2FnZSkgeworICAgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CisgICAgamF2YV9wYWNrYWdlXyA9IGphdmFfcGFja2FnZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7CisgICAgamF2YV9wYWNrYWdlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3QgeworICByZXR1cm4gKmphdmFfb3V0ZXJfY2xhc3NuYW1lXzsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBqYXZhX291dGVyX2NsYXNzbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBqYXZhX291dGVyX2NsYXNzbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBqYXZhX291dGVyX2NsYXNzbmFtZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfamF2YV9vdXRlcl9jbGFzc25hbWUoKSB7CisgIGNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gamF2YV9vdXRlcl9jbGFzc25hbWVfOworICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfamF2YV9vdXRlcl9jbGFzc25hbWUoOjpzdGQ6OnN0cmluZyogamF2YV9vdXRlcl9jbGFzc25hbWUpIHsKKyAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGphdmFfb3V0ZXJfY2xhc3NuYW1lXzsKKyAgfQorICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWUpIHsKKyAgICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gamF2YV9vdXRlcl9jbGFzc25hbWU7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfbXVsdGlwbGVfZmlsZXMoKSB7CisgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gZmFsc2U7CisgIGNsZWFyX2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6amF2YV9tdWx0aXBsZV9maWxlcygpIGNvbnN0IHsKKyAgcmV0dXJuIGphdmFfbXVsdGlwbGVfZmlsZXNfOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX211bHRpcGxlX2ZpbGVzKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7CisgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIHsKKyAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gZmFsc2U7CisgIGNsZWFyX2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3QgeworICByZXR1cm4gamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKKyAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX29wdGltaXplX2ZvcigpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19vcHRpbWl6ZV9mb3IoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX29wdGltaXplX2ZvcigpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfb3B0aW1pemVfZm9yKCkgeworICBvcHRpbWl6ZV9mb3JfID0gMTsKKyAgY2xlYXJfaGFzX29wdGltaXplX2ZvcigpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpvcHRpbWl6ZV9mb3IoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgPihvcHRpbWl6ZV9mb3JfKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfb3B0aW1pemVfZm9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKSB7CisgIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfb3B0aW1pemVfZm9yKCk7CisgIG9wdGltaXplX2Zvcl8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfZ29fcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19nb19wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19nb19wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9nb19wYWNrYWdlKCkgeworICBpZiAoZ29fcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGdvX3BhY2thZ2VfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmdvX3BhY2thZ2UoKSBjb25zdCB7CisgIHJldHVybiAqZ29fcGFja2FnZV87Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2dvX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19nb19wYWNrYWdlKCk7CisgIGlmIChnb19wYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZ29fcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBnb19wYWNrYWdlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgaWYgKGdvX3BhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBnb19wYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGdvX3BhY2thZ2VfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9nb19wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgaWYgKGdvX3BhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBnb19wYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGdvX3BhY2thZ2VfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9nb19wYWNrYWdlKCkgeworICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgaWYgKGdvX3BhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBnb19wYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBnb19wYWNrYWdlXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9nb19wYWNrYWdlKCkgeworICBjbGVhcl9oYXNfZ29fcGFja2FnZSgpOworICBpZiAoZ29fcGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBnb19wYWNrYWdlXzsKKyAgICBnb19wYWNrYWdlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfZ29fcGFja2FnZSg6OnN0ZDo6c3RyaW5nKiBnb19wYWNrYWdlKSB7CisgIGlmIChnb19wYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGdvX3BhY2thZ2VfOworICB9CisgIGlmIChnb19wYWNrYWdlKSB7CisgICAgc2V0X2hhc19nb19wYWNrYWdlKCk7CisgICAgZ29fcGFja2FnZV8gPSBnb19wYWNrYWdlOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7CisgICAgZ29fcGFja2FnZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpjY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gY2NfZ2VuZXJpY19zZXJ2aWNlc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDgwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX2dlbmVyaWNfc2VydmljZXMoKSB7CisgIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIGphdmFfZ2VuZXJpY19zZXJ2aWNlc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAxMDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDEwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgcHlfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpweV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gcHlfZ2VuZXJpY19zZXJ2aWNlc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X3B5X2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKKyAgcHlfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRmlsZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWxlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpbGVPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK0ZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorRmlsZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1lc3NhZ2VPcHRpb25zCisKKy8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgeworICBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7Cit9CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdCB7CisgIHJldHVybiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF87Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOworICBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgeworICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IGZhbHNlOworICBjbGVhcl9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworfQoraW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Om5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdCB7CisgIHJldHVybiBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXzsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcihib29sIHZhbHVlKSB7CisgIHNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IHZhbHVlOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbmxpbmUgaW50IE1lc3NhZ2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBNZXNzYWdlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWVzc2FnZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCitNZXNzYWdlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmllbGRPcHRpb25zCisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19jdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfY3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19jdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2N0eXBlKCkgeworICBjdHlwZV8gPSAwOworICBjbGVhcl9oYXNfY3R5cGUoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OmN0eXBlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlID4oY3R5cGVfKTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2N0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIHZhbHVlKSB7CisgIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfY3R5cGUoKTsKKyAgY3R5cGVfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX3BhY2tlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfcGFja2VkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9oYXNfcGFja2VkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfcGFja2VkKCkgeworICBwYWNrZWRfID0gZmFsc2U7CisgIGNsZWFyX2hhc19wYWNrZWQoKTsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6cGFja2VkKCkgY29uc3QgeworICByZXR1cm4gcGFja2VkXzsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X3BhY2tlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfcGFja2VkKCk7CisgIHBhY2tlZF8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX2xhenkoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX2xhenkoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19sYXp5KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfbGF6eSgpIHsKKyAgbGF6eV8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2xhenkoKTsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6bGF6eSgpIGNvbnN0IHsKKyAgcmV0dXJuIGxhenlfOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfbGF6eShib29sIHZhbHVlKSB7CisgIHNldF9oYXNfbGF6eSgpOworICBsYXp5XyA9IHZhbHVlOworfQorCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gZGVwcmVjYXRlZF87Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19kZXByZWNhdGVkKCk7CisgIGRlcHJlY2F0ZWRfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBleHBlcmltZW50YWxfbWFwX2tleSA9IDk7CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19leHBlcmltZW50YWxfbWFwX2tleSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgeworICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBleHBlcmltZW50YWxfbWFwX2tleV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGRPcHRpb25zOjpleHBlcmltZW50YWxfbWFwX2tleSgpIGNvbnN0IHsKKyAgcmV0dXJuICpleHBlcmltZW50YWxfbWFwX2tleV87Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7CisgIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGV4cGVyaW1lbnRhbF9tYXBfa2V5Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2V4cGVyaW1lbnRhbF9tYXBfa2V5KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgaWYgKGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXhwZXJpbWVudGFsX21hcF9rZXlfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZXhwZXJpbWVudGFsX21hcF9rZXlfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfZXhwZXJpbWVudGFsX21hcF9rZXkoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgaWYgKGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXhwZXJpbWVudGFsX21hcF9rZXlfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZXhwZXJpbWVudGFsX21hcF9rZXlfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZE9wdGlvbnM6Om11dGFibGVfZXhwZXJpbWVudGFsX21hcF9rZXkoKSB7CisgIHNldF9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgaWYgKGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXhwZXJpbWVudGFsX21hcF9rZXlfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIGV4cGVyaW1lbnRhbF9tYXBfa2V5XzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZE9wdGlvbnM6OnJlbGVhc2VfZXhwZXJpbWVudGFsX21hcF9rZXkoKSB7CisgIGNsZWFyX2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gZXhwZXJpbWVudGFsX21hcF9rZXlfOworICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfYWxsb2NhdGVkX2V4cGVyaW1lbnRhbF9tYXBfa2V5KDo6c3RkOjpzdHJpbmcqIGV4cGVyaW1lbnRhbF9tYXBfa2V5KSB7CisgIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBleHBlcmltZW50YWxfbWFwX2tleV87CisgIH0KKyAgaWYgKGV4cGVyaW1lbnRhbF9tYXBfa2V5KSB7CisgICAgc2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IGV4cGVyaW1lbnRhbF9tYXBfa2V5OworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX3dlYWsoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX3dlYWsoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc193ZWFrKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfd2VhaygpIHsKKyAgd2Vha18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX3dlYWsoKTsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6d2VhaygpIGNvbnN0IHsKKyAgcmV0dXJuIHdlYWtfOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfd2Vhayhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfd2VhaygpOworICB3ZWFrXyA9IHZhbHVlOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbmxpbmUgaW50IEZpZWxkT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEZpZWxkT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitGaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCitGaWVsZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVudW1PcHRpb25zCisKKy8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyIFtkZWZhdWx0ID0gdHJ1ZV07CitpbmxpbmUgYm9vbCBFbnVtT3B0aW9uczo6aGFzX2FsbG93X2FsaWFzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpzZXRfaGFzX2FsbG93X2FsaWFzKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRW51bU9wdGlvbnM6OmNsZWFyX2hhc19hbGxvd19hbGlhcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfYWxsb3dfYWxpYXMoKSB7CisgIGFsbG93X2FsaWFzXyA9IHRydWU7CisgIGNsZWFyX2hhc19hbGxvd19hbGlhcygpOworfQoraW5saW5lIGJvb2wgRW51bU9wdGlvbnM6OmFsbG93X2FsaWFzKCkgY29uc3QgeworICByZXR1cm4gYWxsb3dfYWxpYXNfOworfQoraW5saW5lIHZvaWQgRW51bU9wdGlvbnM6OnNldF9hbGxvd19hbGlhcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfYWxsb3dfYWxpYXMoKTsKKyAgYWxsb3dfYWxpYXNfID0gdmFsdWU7Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgRW51bU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRW51bU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEVudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitFbnVtT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK0VudW1PcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtVmFsdWVPcHRpb25zCisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgRW51bVZhbHVlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bVZhbHVlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1WYWx1ZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorRW51bVZhbHVlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK0VudW1WYWx1ZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNlcnZpY2VPcHRpb25zCisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgU2VydmljZU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIFNlcnZpY2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogU2VydmljZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBTZXJ2aWNlT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitTZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK1NlcnZpY2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBNZXRob2RPcHRpb25zCisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBNZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWV0aG9kT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1ldGhvZE9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK01ldGhvZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQKKworLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpoYXNfbmFtZV9wYXJ0KCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9oYXNfbmFtZV9wYXJ0KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfaGFzX25hbWVfcGFydCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpjbGVhcl9uYW1lX3BhcnQoKSB7CisgIGlmIChuYW1lX3BhcnRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lX3BhcnRfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19uYW1lX3BhcnQoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpuYW1lX3BhcnQoKSBjb25zdCB7CisgIHJldHVybiAqbmFtZV9wYXJ0XzsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9uYW1lX3BhcnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lX3BhcnQoKTsKKyAgaWYgKG5hbWVfcGFydF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfcGFydF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lX3BhcnRfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWVfcGFydCgpOworICBpZiAobmFtZV9wYXJ0XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV9wYXJ0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfcGFydF8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfbmFtZV9wYXJ0KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWVfcGFydCgpOworICBpZiAobmFtZV9wYXJ0XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV9wYXJ0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfcGFydF8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Om11dGFibGVfbmFtZV9wYXJ0KCkgeworICBzZXRfaGFzX25hbWVfcGFydCgpOworICBpZiAobmFtZV9wYXJ0XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV9wYXJ0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBuYW1lX3BhcnRfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnJlbGVhc2VfbmFtZV9wYXJ0KCkgeworICBjbGVhcl9oYXNfbmFtZV9wYXJ0KCk7CisgIGlmIChuYW1lX3BhcnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gbmFtZV9wYXJ0XzsKKyAgICBuYW1lX3BhcnRfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfYWxsb2NhdGVkX25hbWVfcGFydCg6OnN0ZDo6c3RyaW5nKiBuYW1lX3BhcnQpIHsKKyAgaWYgKG5hbWVfcGFydF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lX3BhcnRfOworICB9CisgIGlmIChuYW1lX3BhcnQpIHsKKyAgICBzZXRfaGFzX25hbWVfcGFydCgpOworICAgIG5hbWVfcGFydF8gPSBuYW1lX3BhcnQ7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX25hbWVfcGFydCgpOworICAgIG5hbWVfcGFydF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6aGFzX2lzX2V4dGVuc2lvbigpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaGFzX2lzX2V4dGVuc2lvbigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX2hhc19pc19leHRlbnNpb24oKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfaXNfZXh0ZW5zaW9uKCkgeworICBpc19leHRlbnNpb25fID0gZmFsc2U7CisgIGNsZWFyX2hhc19pc19leHRlbnNpb24oKTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmlzX2V4dGVuc2lvbigpIGNvbnN0IHsKKyAgcmV0dXJuIGlzX2V4dGVuc2lvbl87Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaXNfZXh0ZW5zaW9uKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19pc19leHRlbnNpb24oKTsKKyAgaXNfZXh0ZW5zaW9uXyA9IHZhbHVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFVuaW50ZXJwcmV0ZWRPcHRpb24KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0IG5hbWUgPSAyOworaW5saW5lIGludCBVbmludGVycHJldGVkT3B0aW9uOjpuYW1lX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9uYW1lKCkgeworICBuYW1lXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgVW5pbnRlcnByZXRlZE9wdGlvbjo6bmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBVbmludGVycHJldGVkT3B0aW9uOjptdXRhYmxlX25hbWUoaW50IGluZGV4KSB7CisgIHJldHVybiBuYW1lXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb246OmFkZF9uYW1lKCkgeworICByZXR1cm4gbmFtZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPiYKK1VuaW50ZXJwcmV0ZWRPcHRpb246Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgorVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKCkgeworICByZXR1cm4gJm5hbWVfOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfaWRlbnRpZmllcl92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9pZGVudGlmaWVyX3ZhbHVlKCkgeworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlkZW50aWZpZXJfdmFsdWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6aWRlbnRpZmllcl92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuICppZGVudGlmaWVyX3ZhbHVlXzsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlkZW50aWZpZXJfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaWRlbnRpZmllcl92YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgaWYgKGlkZW50aWZpZXJfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpZGVudGlmaWVyX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGlkZW50aWZpZXJfdmFsdWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlkZW50aWZpZXJfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaWRlbnRpZmllcl92YWx1ZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpIHsKKyAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7CisgIGlmIChpZGVudGlmaWVyX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgaWRlbnRpZmllcl92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gaWRlbnRpZmllcl92YWx1ZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9pZGVudGlmaWVyX3ZhbHVlKCkgeworICBjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBpZGVudGlmaWVyX3ZhbHVlXzsKKyAgICBpZGVudGlmaWVyX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9pZGVudGlmaWVyX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGlkZW50aWZpZXJfdmFsdWUpIHsKKyAgaWYgKGlkZW50aWZpZXJfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgaWRlbnRpZmllcl92YWx1ZV87CisgIH0KKyAgaWYgKGlkZW50aWZpZXJfdmFsdWUpIHsKKyAgICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgICBpZGVudGlmaWVyX3ZhbHVlXyA9IGlkZW50aWZpZXJfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgICBpZGVudGlmaWVyX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCB1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlID0gNDsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX3Bvc2l0aXZlX2ludF92YWx1ZSgpIHsKKyAgcG9zaXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9VTE9OR0xPTkcoMCk7CisgIGNsZWFyX2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCBVbmludGVycHJldGVkT3B0aW9uOjpwb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBwb3NpdGl2ZV9pbnRfdmFsdWVfOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3Bvc2l0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCB2YWx1ZSkgeworICBzZXRfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOworICBwb3NpdGl2ZV9pbnRfdmFsdWVfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9uZWdhdGl2ZV9pbnRfdmFsdWUoKSB7CisgIG5lZ2F0aXZlX2ludF92YWx1ZV8gPSBHT09HTEVfTE9OR0xPTkcoMCk7CisgIGNsZWFyX2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IFVuaW50ZXJwcmV0ZWRPcHRpb246Om5lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5lZ2F0aXZlX2ludF92YWx1ZV87Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfbmVnYXRpdmVfaW50X3ZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpIHsKKyAgc2V0X2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKKyAgbmVnYXRpdmVfaW50X3ZhbHVlXyA9IHZhbHVlOworfQorCisvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19kb3VibGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19kb3VibGVfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfZG91YmxlX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2RvdWJsZV92YWx1ZSgpIHsKKyAgZG91YmxlX3ZhbHVlXyA9IDA7CisgIGNsZWFyX2hhc19kb3VibGVfdmFsdWUoKTsKK30KK2lubGluZSBkb3VibGUgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZG91YmxlX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gZG91YmxlX3ZhbHVlXzsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9kb3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKSB7CisgIHNldF9oYXNfZG91YmxlX3ZhbHVlKCk7CisgIGRvdWJsZV92YWx1ZV8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19zdHJpbmdfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19zdHJpbmdfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX3N0cmluZ192YWx1ZSgpIHsKKyAgaWYgKHN0cmluZ192YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHN0cmluZ192YWx1ZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX3N0cmluZ192YWx1ZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb246OnN0cmluZ192YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpzdHJpbmdfdmFsdWVfOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3N0cmluZ192YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOworICBpZiAoc3RyaW5nX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgc3RyaW5nX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHN0cmluZ192YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIGlmIChzdHJpbmdfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBzdHJpbmdfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgc3RyaW5nX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9zdHJpbmdfdmFsdWUoY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIGlmIChzdHJpbmdfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBzdHJpbmdfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgc3RyaW5nX3ZhbHVlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9zdHJpbmdfdmFsdWUoKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIGlmIChzdHJpbmdfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBzdHJpbmdfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIHN0cmluZ192YWx1ZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9zdHJpbmdfdmFsdWUoKSB7CisgIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKKyAgaWYgKHN0cmluZ192YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBzdHJpbmdfdmFsdWVfOworICAgIHN0cmluZ192YWx1ZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hbGxvY2F0ZWRfc3RyaW5nX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIHN0cmluZ192YWx1ZSkgeworICBpZiAoc3RyaW5nX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIHN0cmluZ192YWx1ZV87CisgIH0KKyAgaWYgKHN0cmluZ192YWx1ZSkgeworICAgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgICAgc3RyaW5nX3ZhbHVlXyA9IHN0cmluZ192YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgICAgc3RyaW5nX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19hZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKKyAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGFnZ3JlZ2F0ZV92YWx1ZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb246OmFnZ3JlZ2F0ZV92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuICphZ2dyZWdhdGVfdmFsdWVfOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBpZiAoYWdncmVnYXRlX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgYWdncmVnYXRlX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGFnZ3JlZ2F0ZV92YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIGlmIChhZ2dyZWdhdGVfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBhZ2dyZWdhdGVfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgYWdncmVnYXRlX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIGlmIChhZ2dyZWdhdGVfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBhZ2dyZWdhdGVfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgYWdncmVnYXRlX3ZhbHVlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9hZ2dyZWdhdGVfdmFsdWUoKSB7CisgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIGlmIChhZ2dyZWdhdGVfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBhZ2dyZWdhdGVfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIGFnZ3JlZ2F0ZV92YWx1ZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9hZ2dyZWdhdGVfdmFsdWUoKSB7CisgIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBhZ2dyZWdhdGVfdmFsdWVfOworICAgIGFnZ3JlZ2F0ZV92YWx1ZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hbGxvY2F0ZWRfYWdncmVnYXRlX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZSkgeworICBpZiAoYWdncmVnYXRlX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGFnZ3JlZ2F0ZV92YWx1ZV87CisgIH0KKyAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZSkgeworICAgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgICAgYWdncmVnYXRlX3ZhbHVlXyA9IGFnZ3JlZ2F0ZV92YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgICAgYWdncmVnYXRlX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uCisKKy8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKK2lubGluZSBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGhfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHBhdGhfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9wYXRoKCkgeworICBwYXRoXy5DbGVhcigpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGgoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBwYXRoXy5HZXQoaW5kZXgpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9wYXRoKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwYXRoXy5TZXQoaW5kZXgsIHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfcGF0aCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHBhdGhfLkFkZCh2YWx1ZSk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cGF0aCgpIGNvbnN0IHsKKyAgcmV0dXJuIHBhdGhfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfcGF0aCgpIHsKKyAgcmV0dXJuICZwYXRoXzsKK30KKworLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOworaW5saW5lIGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c3Bhbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gc3Bhbl8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX3NwYW4oKSB7CisgIHNwYW5fLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c3BhbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHNwYW5fLkdldChpbmRleCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3NwYW4oaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHNwYW5fLlNldChpbmRleCwgdmFsdWUpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9zcGFuKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc3Bhbl8uQWRkKHZhbHVlKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuKCkgY29uc3QgeworICByZXR1cm4gc3Bhbl87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9zcGFuKCkgeworICByZXR1cm4gJnNwYW5fOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CitpbmxpbmUgYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6aGFzX2xlYWRpbmdfY29tbWVudHMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfbGVhZGluZ19jb21tZW50cygpIHsKKyAgaWYgKGxlYWRpbmdfY29tbWVudHNfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBsZWFkaW5nX2NvbW1lbnRzXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICByZXR1cm4gKmxlYWRpbmdfY29tbWVudHNfOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOworICBpZiAobGVhZGluZ19jb21tZW50c18gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGxlYWRpbmdfY29tbWVudHNfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbGVhZGluZ19jb21tZW50c18tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGlmIChsZWFkaW5nX2NvbW1lbnRzXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbGVhZGluZ19jb21tZW50c18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBsZWFkaW5nX2NvbW1lbnRzXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGlmIChsZWFkaW5nX2NvbW1lbnRzXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbGVhZGluZ19jb21tZW50c18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBsZWFkaW5nX2NvbW1lbnRzXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfbGVhZGluZ19jb21tZW50cygpIHsKKyAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGlmIChsZWFkaW5nX2NvbW1lbnRzXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbGVhZGluZ19jb21tZW50c18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gbGVhZGluZ19jb21tZW50c187Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246OnJlbGVhc2VfbGVhZGluZ19jb21tZW50cygpIHsKKyAgY2xlYXJfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgaWYgKGxlYWRpbmdfY29tbWVudHNfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gbGVhZGluZ19jb21tZW50c187CisgICAgbGVhZGluZ19jb21tZW50c18gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfYWxsb2NhdGVkX2xlYWRpbmdfY29tbWVudHMoOjpzdGQ6OnN0cmluZyogbGVhZGluZ19jb21tZW50cykgeworICBpZiAobGVhZGluZ19jb21tZW50c18gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBsZWFkaW5nX2NvbW1lbnRzXzsKKyAgfQorICBpZiAobGVhZGluZ19jb21tZW50cykgeworICAgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOworICAgIGxlYWRpbmdfY29tbWVudHNfID0gbGVhZGluZ19jb21tZW50czsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpOworICAgIGxlYWRpbmdfY29tbWVudHNfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB9Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyB0cmFpbGluZ19jb21tZW50cyA9IDQ7CitpbmxpbmUgYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6aGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX2hhc190cmFpbGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfdHJhaWxpbmdfY29tbWVudHMoKSB7CisgIGlmICh0cmFpbGluZ19jb21tZW50c18gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHRyYWlsaW5nX2NvbW1lbnRzXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6dHJhaWxpbmdfY29tbWVudHMoKSBjb25zdCB7CisgIHJldHVybiAqdHJhaWxpbmdfY29tbWVudHNfOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF90cmFpbGluZ19jb21tZW50cyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIGlmICh0cmFpbGluZ19jb21tZW50c18gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHRyYWlsaW5nX2NvbW1lbnRzXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHRyYWlsaW5nX2NvbW1lbnRzXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOworICBpZiAodHJhaWxpbmdfY29tbWVudHNfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0cmFpbGluZ19jb21tZW50c18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICB0cmFpbGluZ19jb21tZW50c18tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIGlmICh0cmFpbGluZ19jb21tZW50c18gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHRyYWlsaW5nX2NvbW1lbnRzXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHRyYWlsaW5nX2NvbW1lbnRzXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKSB7CisgIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgaWYgKHRyYWlsaW5nX2NvbW1lbnRzXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgdHJhaWxpbmdfY29tbWVudHNfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIHRyYWlsaW5nX2NvbW1lbnRzXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cmVsZWFzZV90cmFpbGluZ19jb21tZW50cygpIHsKKyAgY2xlYXJfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIGlmICh0cmFpbGluZ19jb21tZW50c18gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSB0cmFpbGluZ19jb21tZW50c187CisgICAgdHJhaWxpbmdfY29tbWVudHNfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2FsbG9jYXRlZF90cmFpbGluZ19jb21tZW50cyg6OnN0ZDo6c3RyaW5nKiB0cmFpbGluZ19jb21tZW50cykgeworICBpZiAodHJhaWxpbmdfY29tbWVudHNfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgdHJhaWxpbmdfY29tbWVudHNfOworICB9CisgIGlmICh0cmFpbGluZ19jb21tZW50cykgeworICAgIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgICB0cmFpbGluZ19jb21tZW50c18gPSB0cmFpbGluZ19jb21tZW50czsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgICB0cmFpbGluZ19jb21tZW50c18gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTb3VyY2VDb2RlSW5mbworCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKK2lubGluZSBpbnQgU291cmNlQ29kZUluZm86OmxvY2F0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBsb2NhdGlvbl8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm86OmNsZWFyX2xvY2F0aW9uKCkgeworICBsb2NhdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBsb2NhdGlvbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mbzo6bXV0YWJsZV9sb2NhdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGxvY2F0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mbzo6YWRkX2xvY2F0aW9uKCkgeworICByZXR1cm4gbG9jYXRpb25fLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+JgorU291cmNlQ29kZUluZm86OmxvY2F0aW9uKCkgY29uc3QgeworICByZXR1cm4gbG9jYXRpb25fOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+KgorU291cmNlQ29kZUluZm86Om11dGFibGVfbG9jYXRpb24oKSB7CisgIHJldHVybiAmbG9jYXRpb25fOworfQorCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaWZuZGVmIFNXSUcKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZT4oKSB7CisgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWw+KCkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yKCk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGU+KCkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlPigpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisjZW5kaWYgIC8vIFNXSUcKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2VuZGlmICAvLyBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19fSU5DTFVERUQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4NWY3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCkBAIC0wLDAgKzEsNjIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGUgbWVzc2FnZXMgaW4gdGhpcyBmaWxlIGRlc2NyaWJlIHRoZSBkZWZpbml0aW9ucyBmb3VuZCBpbiAucHJvdG8gZmlsZXMuCisvLyBBIHZhbGlkIC5wcm90byBmaWxlIGNhbiBiZSB0cmFuc2xhdGVkIGRpcmVjdGx5IHRvIGEgRmlsZURlc2NyaXB0b3JQcm90bworLy8gd2l0aG91dCBhbnkgb3RoZXIgaW5mb3JtYXRpb24gKGUuZy4gd2l0aG91dCByZWFkaW5nIGl0cyBpbXBvcnRzKS4KKworCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJEZXNjcmlwdG9yUHJvdG9zIjsKKworLy8gZGVzY3JpcHRvci5wcm90byBtdXN0IGJlIG9wdGltaXplZCBmb3Igc3BlZWQgYmVjYXVzZSByZWZsZWN0aW9uLWJhc2VkCisvLyBhbGdvcml0aG1zIGRvbid0IHdvcmsgZHVyaW5nIGJvb3RzdHJhcHBpbmcuCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKKy8vIFRoZSBwcm90b2NvbCBjb21waWxlciBjYW4gb3V0cHV0IGEgRmlsZURlc2NyaXB0b3JTZXQgY29udGFpbmluZyB0aGUgLnByb3RvCisvLyBmaWxlcyBpdCBwYXJzZXMuCittZXNzYWdlIEZpbGVEZXNjcmlwdG9yU2V0IHsKKyAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKK30KKworLy8gRGVzY3JpYmVzIGEgY29tcGxldGUgLnByb3RvIGZpbGUuCittZXNzYWdlIEZpbGVEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7ICAgICAgIC8vIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZQorICBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7ICAgIC8vIGUuZy4gImZvbyIsICJmb28uYmFyIiwgZXRjLgorCisgIC8vIE5hbWVzIG9mIGZpbGVzIGltcG9ydGVkIGJ5IHRoaXMgZmlsZS4KKyAgcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICAvLyBJbmRleGVzIG9mIHRoZSBwdWJsaWMgaW1wb3J0ZWQgZmlsZXMgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdCBhYm92ZS4KKyAgcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKKyAgLy8gSW5kZXhlcyBvZiB0aGUgd2VhayBpbXBvcnRlZCBmaWxlcyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0LgorICAvLyBGb3IgR29vZ2xlLWludGVybmFsIG1pZ3JhdGlvbiBvbmx5LiBEbyBub3QgdXNlLgorICByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKKworICAvLyBBbGwgdG9wLWxldmVsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZS4KKyAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgIHJlcGVhdGVkIEVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKKyAgcmVwZWF0ZWQgU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKworICBvcHRpb25hbCBGaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKworICAvLyBUaGlzIGZpZWxkIGNvbnRhaW5zIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KKyAgLy8gWW91IG1heSBzYWZlbHkgcmVtb3ZlIHRoaXMgZW50aXJlIGZpZWxkIHdoaXRob3V0IGhhcm1pbmcgcnVudGltZQorICAvLyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkZXNjcmlwdG9ycyAtLSB0aGUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIG9ubHkgYnkKKyAgLy8gZGV2ZWxvcG1lbnQgdG9vbHMuCisgIG9wdGlvbmFsIFNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworfQorCisvLyBEZXNjcmliZXMgYSBtZXNzYWdlIHR5cGUuCittZXNzYWdlIERlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIHJlcGVhdGVkIEZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisKKyAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKKyAgcmVwZWF0ZWQgRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworCisgIG1lc3NhZ2UgRXh0ZW5zaW9uUmFuZ2UgeworICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgICBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICB9CisgIHJlcGVhdGVkIEV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisKKyAgb3B0aW9uYWwgTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7Cit9CisKKy8vIERlc2NyaWJlcyBhIGZpZWxkIHdpdGhpbiBhIG1lc3NhZ2UuCittZXNzYWdlIEZpZWxkRGVzY3JpcHRvclByb3RvIHsKKyAgZW51bSBUeXBlIHsKKyAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuCisgICAgLy8gT3JkZXIgaXMgd2VpcmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4KKyAgICBUWVBFX0RPVUJMRSAgICAgICAgID0gMTsKKyAgICBUWVBFX0ZMT0FUICAgICAgICAgID0gMjsKKyAgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UNjQgaWYKKyAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGxpa2VseS4KKyAgICBUWVBFX0lOVDY0ICAgICAgICAgID0gMzsKKyAgICBUWVBFX1VJTlQ2NCAgICAgICAgID0gNDsKKyAgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UMzIgaWYKKyAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGxpa2VseS4KKyAgICBUWVBFX0lOVDMyICAgICAgICAgID0gNTsKKyAgICBUWVBFX0ZJWEVENjQgICAgICAgID0gNjsKKyAgICBUWVBFX0ZJWEVEMzIgICAgICAgID0gNzsKKyAgICBUWVBFX0JPT0wgICAgICAgICAgID0gODsKKyAgICBUWVBFX1NUUklORyAgICAgICAgID0gOTsKKyAgICBUWVBFX0dST1VQICAgICAgICAgID0gMTA7ICAvLyBUYWctZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KKyAgICBUWVBFX01FU1NBR0UgICAgICAgID0gMTE7ICAvLyBMZW5ndGgtZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KKworICAgIC8vIE5ldyBpbiB2ZXJzaW9uIDIuCisgICAgVFlQRV9CWVRFUyAgICAgICAgICA9IDEyOworICAgIFRZUEVfVUlOVDMyICAgICAgICAgPSAxMzsKKyAgICBUWVBFX0VOVU0gICAgICAgICAgID0gMTQ7CisgICAgVFlQRV9TRklYRUQzMiAgICAgICA9IDE1OworICAgIFRZUEVfU0ZJWEVENjQgICAgICAgPSAxNjsKKyAgICBUWVBFX1NJTlQzMiAgICAgICAgID0gMTc7ICAvLyBVc2VzIFppZ1phZyBlbmNvZGluZy4KKyAgICBUWVBFX1NJTlQ2NCAgICAgICAgID0gMTg7ICAvLyBVc2VzIFppZ1phZyBlbmNvZGluZy4KKyAgfTsKKworICBlbnVtIExhYmVsIHsKKyAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKKyAgICBMQUJFTF9PUFRJT05BTCAgICAgID0gMTsKKyAgICBMQUJFTF9SRVFVSVJFRCAgICAgID0gMjsKKyAgICBMQUJFTF9SRVBFQVRFRCAgICAgID0gMzsKKyAgICAvLyBUT0RPKHNhbmpheSk6IFNob3VsZCB3ZSBhZGQgTEFCRUxfTUFQPworICB9OworCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgb3B0aW9uYWwgTGFiZWwgbGFiZWwgPSA0OworCisgIC8vIElmIHR5cGVfbmFtZSBpcyBzZXQsIHRoaXMgbmVlZCBub3QgYmUgc2V0LiAgSWYgYm90aCB0aGlzIGFuZCB0eXBlX25hbWUKKyAgLy8gYXJlIHNldCwgdGhpcyBtdXN0IGJlIGVpdGhlciBUWVBFX0VOVU0gb3IgVFlQRV9NRVNTQUdFLgorICBvcHRpb25hbCBUeXBlIHR5cGUgPSA1OworCisgIC8vIEZvciBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlLiAgSWYgdGhlIG5hbWUKKyAgLy8gc3RhcnRzIHdpdGggYSAnLicsIGl0IGlzIGZ1bGx5LXF1YWxpZmllZC4gIE90aGVyd2lzZSwgQysrLWxpa2Ugc2NvcGluZworICAvLyBydWxlcyBhcmUgdXNlZCB0byBmaW5kIHRoZSB0eXBlIChpLmUuIGZpcnN0IHRoZSBuZXN0ZWQgdHlwZXMgd2l0aGluIHRoaXMKKyAgLy8gbWVzc2FnZSBhcmUgc2VhcmNoZWQsIHRoZW4gd2l0aGluIHRoZSBwYXJlbnQsIG9uIHVwIHRvIHRoZSByb290CisgIC8vIG5hbWVzcGFjZSkuCisgIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworCisgIC8vIEZvciBleHRlbnNpb25zLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGJlaW5nIGV4dGVuZGVkLiAgSXQgaXMKKyAgLy8gcmVzb2x2ZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVfbmFtZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKKworICAvLyBGb3IgbnVtZXJpYyB0eXBlcywgY29udGFpbnMgdGhlIG9yaWdpbmFsIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLgorICAvLyBGb3IgYm9vbGVhbnMsICJ0cnVlIiBvciAiZmFsc2UiLgorICAvLyBGb3Igc3RyaW5ncywgY29udGFpbnMgdGhlIGRlZmF1bHQgdGV4dCBjb250ZW50cyAobm90IGVzY2FwZWQgaW4gYW55IHdheSkuCisgIC8vIEZvciBieXRlcywgY29udGFpbnMgdGhlIEMgZXNjYXBlZCB2YWx1ZS4gIEFsbCBieXRlcyA+PSAxMjggYXJlIGVzY2FwZWQuCisgIC8vIFRPRE8oa2VudG9uKTogIEJhc2UtNjQgZW5jb2RlPworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CisKKyAgb3B0aW9uYWwgRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworfQorCisvLyBEZXNjcmliZXMgYW4gZW51bSB0eXBlLgorbWVzc2FnZSBFbnVtRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgIHJlcGVhdGVkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CisKKyAgb3B0aW9uYWwgRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7Cit9CisKKy8vIERlc2NyaWJlcyBhIHZhbHVlIHdpdGhpbiBhbiBlbnVtLgorbWVzc2FnZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisKKyAgb3B0aW9uYWwgRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKK30KKworLy8gRGVzY3JpYmVzIGEgc2VydmljZS4KK21lc3NhZ2UgU2VydmljZURlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgcmVwZWF0ZWQgTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisKKyAgb3B0aW9uYWwgU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7Cit9CisKKy8vIERlc2NyaWJlcyBhIG1ldGhvZCBvZiBhIHNlcnZpY2UuCittZXNzYWdlIE1ldGhvZERlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAvLyBJbnB1dCBhbmQgb3V0cHV0IHR5cGUgbmFtZXMuICBUaGVzZSBhcmUgcmVzb2x2ZWQgaW4gdGhlIHNhbWUgd2F5IGFzCisgIC8vIEZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSwgYnV0IG11c3QgcmVmZXIgdG8gYSBtZXNzYWdlIHR5cGUuCisgIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKKworICBvcHRpb25hbCBNZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE9wdGlvbnMKKworLy8gRWFjaCBvZiB0aGUgZGVmaW5pdGlvbnMgYWJvdmUgbWF5IGhhdmUgIm9wdGlvbnMiIGF0dGFjaGVkLiAgVGhlc2UgYXJlCisvLyBqdXN0IGFubm90YXRpb25zIHdoaWNoIG1heSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseQorLy8gb3IgbWF5IGNvbnRhaW4gaGludHMgZm9yIGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBwcm90b2NvbCBtZXNzYWdlcy4KKy8vCisvLyBDbGllbnRzIG1heSBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgYXMgZXh0ZW5zaW9ucyBvZiB0aGUgKk9wdGlvbnMgbWVzc2FnZXMuCisvLyBUaGVzZSBleHRlbnNpb25zIG1heSBub3QgeWV0IGJlIGtub3duIGF0IHBhcnNpbmcgdGltZSwgc28gdGhlIHBhcnNlciBjYW5ub3QKKy8vIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlbS4gIEluc3RlYWQgaXQgc3RvcmVzIHRoZW0gaW4gYSBmaWVsZCBpbiB0aGUgKk9wdGlvbnMKKy8vIG1lc3NhZ2UgY2FsbGVkIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLiBUaGlzIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lCisvLyBhY3Jvc3MgYWxsICpPcHRpb25zIG1lc3NhZ2VzLiBXZSB0aGVuIHVzZSB0aGlzIGZpZWxkIHRvIHBvcHVsYXRlIHRoZQorLy8gZXh0ZW5zaW9ucyB3aGVuIHdlIGJ1aWxkIGEgZGVzY3JpcHRvciwgYXQgd2hpY2ggcG9pbnQgYWxsIHByb3RvcyBoYXZlIGJlZW4KKy8vIHBhcnNlZCBhbmQgc28gYWxsIGV4dGVuc2lvbnMgYXJlIGtub3duLgorLy8KKy8vIEV4dGVuc2lvbiBudW1iZXJzIGZvciBjdXN0b20gb3B0aW9ucyBtYXkgYmUgY2hvc2VuIGFzIGZvbGxvd3M6CisvLyAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvcgorLy8gICBvcmdhbml6YXRpb24sIG9yIGZvciBleHBlcmltZW50YWwgb3B0aW9ucywgdXNlIGZpZWxkIG51bWJlcnMgNTAwMDAKKy8vICAgdGhyb3VnaCA5OTk5OS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHVzZSB0aGUKKy8vICAgc2FtZSBudW1iZXIgZm9yIG11bHRpcGxlIG9wdGlvbnMuCisvLyAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCisvLyAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCisvLyAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCisvLyAgIE9iamVjdC1DIHBsdWdpbikgYW5kIHlvdXIgcG9yamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8gbmVlZAorLy8gICB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lIGV4dGVuc2lvbgorLy8gICBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uIG51bWJlciBieQorLy8gICBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mIHRoZSBkb2NzCisvLyAgIGZvciBleGFtcGxlczoKKy8vICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy9kb2NzL3Byb3RvLmh0bWwjb3B0aW9ucworLy8gICBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSBwb3B1bGFyLCBhIHdlYiBzZXJ2aWNlIHdpbGwgYmUgc2V0IHVwCisvLyAgIHRvIGF1dG9tYXRpY2FsbHkgYXNzaWduIG9wdGlvbiBudW1iZXJzLgorCisKK21lc3NhZ2UgRmlsZU9wdGlvbnMgeworCisgIC8vIFNldHMgdGhlIEphdmEgcGFja2FnZSB3aGVyZSBjbGFzc2VzIGdlbmVyYXRlZCBmcm9tIHRoaXMgLnByb3RvIHdpbGwgYmUKKyAgLy8gcGxhY2VkLiAgQnkgZGVmYXVsdCwgdGhlIHByb3RvIHBhY2thZ2UgaXMgdXNlZCwgYnV0IHRoaXMgaXMgb2Z0ZW4KKyAgLy8gaW5hcHByb3ByaWF0ZSBiZWNhdXNlIHByb3RvIHBhY2thZ2VzIGRvIG5vdCBub3JtYWxseSBzdGFydCB3aXRoIGJhY2t3YXJkcworICAvLyBkb21haW4gbmFtZXMuCisgIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworCisKKyAgLy8gSWYgc2V0LCBhbGwgdGhlIGNsYXNzZXMgZnJvbSB0aGUgLnByb3RvIGZpbGUgYXJlIHdyYXBwZWQgaW4gYSBzaW5nbGUKKyAgLy8gb3V0ZXIgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIFRoaXMgYXBwbGllcyB0byBib3RoIFByb3RvMQorICAvLyAoZXF1aXZhbGVudCB0byB0aGUgb2xkICItLW9uZV9qYXZhX2ZpbGUiIG9wdGlvbikgYW5kIFByb3RvMiAod2hlcmUKKyAgLy8gYSAucHJvdG8gYWx3YXlzIHRyYW5zbGF0ZXMgdG8gYSBzaW5nbGUgY2xhc3MsIGJ1dCB5b3UgbWF5IHdhbnQgdG8KKyAgLy8gZXhwbGljaXRseSBjaG9vc2UgdGhlIGNsYXNzIG5hbWUpLgorICBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OworCisgIC8vIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBzZXBhcmF0ZSAuamF2YQorICAvLyBmaWxlIGZvciBlYWNoIHRvcC1sZXZlbCBtZXNzYWdlLCBlbnVtLCBhbmQgc2VydmljZSBkZWZpbmVkIGluIHRoZSAucHJvdG8KKyAgLy8gZmlsZS4gIFRodXMsIHRoZXNlIHR5cGVzIHdpbGwgKm5vdCogYmUgbmVzdGVkIGluc2lkZSB0aGUgb3V0ZXIgY2xhc3MKKyAgLy8gbmFtZWQgYnkgamF2YV9vdXRlcl9jbGFzc25hbWUuICBIb3dldmVyLCB0aGUgb3V0ZXIgY2xhc3Mgd2lsbCBzdGlsbCBiZQorICAvLyBnZW5lcmF0ZWQgdG8gY29udGFpbiB0aGUgZmlsZSdzIGdldERlc2NyaXB0b3IoKSBtZXRob2QgYXMgd2VsbCBhcyBhbnkKKyAgLy8gdG9wLWxldmVsIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGUgZmlsZS4KKyAgb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgZXF1YWxzKCkgYW5kCisgIC8vIGhhc2hDb2RlKCkgbWV0aG9kcyBmb3IgYWxsIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLiBUaGlzIGlzCisgIC8vIHB1cmVseSBhIHNwZWVkIG9wdGltaXphdGlvbiwgYXMgdGhlIEFic3RyYWN0TWVzc2FnZSBiYXNlIGNsYXNzIGluY2x1ZGVzCisgIC8vIHJlZmxlY3Rpb24tYmFzZWQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIG1ldGhvZHMuCisgIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gR2VuZXJhdGVkIGNsYXNzZXMgY2FuIGJlIG9wdGltaXplZCBmb3Igc3BlZWQgb3IgY29kZSBzaXplLgorICBlbnVtIE9wdGltaXplTW9kZSB7CisgICAgU1BFRUQgPSAxOyAgICAgICAgLy8gR2VuZXJhdGUgY29tcGxldGUgY29kZSBmb3IgcGFyc2luZywgc2VyaWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAvLyBldGMuCisgICAgQ09ERV9TSVpFID0gMjsgICAgLy8gVXNlIFJlZmxlY3Rpb25PcHMgdG8gaW1wbGVtZW50IHRoZXNlIG1ldGhvZHMuCisgICAgTElURV9SVU5USU1FID0gMzsgLy8gR2VuZXJhdGUgY29kZSB1c2luZyBNZXNzYWdlTGl0ZSBhbmQgdGhlIGxpdGUgcnVudGltZS4KKyAgfQorICBvcHRpb25hbCBPcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdD1TUEVFRF07CisKKyAgLy8gU2V0cyB0aGUgR28gcGFja2FnZSB3aGVyZSBzdHJ1Y3RzIGdlbmVyYXRlZCBmcm9tIHRoaXMgLnByb3RvIHdpbGwgYmUKKyAgLy8gcGxhY2VkLiAgVGhlcmUgaXMgbm8gZGVmYXVsdC4KKyAgb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKworCisKKyAgLy8gU2hvdWxkIGdlbmVyaWMgc2VydmljZXMgYmUgZ2VuZXJhdGVkIGluIGVhY2ggbGFuZ3VhZ2U/ICAiR2VuZXJpYyIgc2VydmljZXMKKyAgLy8gYXJlIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhleSBhcmUgZ2VuZXJhdGVkIGJ5IHRoZQorICAvLyBtYWluIGNvZGUgZ2VuZXJhdG9ycyBpbiBlYWNoIGxhbmd1YWdlICh3aXRob3V0IGFkZGl0aW9uYWwgcGx1Z2lucykuCisgIC8vIEdlbmVyaWMgc2VydmljZXMgd2VyZSB0aGUgb25seSBraW5kIG9mIHNlcnZpY2UgZ2VuZXJhdGlvbiBzdXBwb3J0ZWQgYnkKKyAgLy8gZWFybHkgdmVyc2lvbnMgb2YgcHJvdG8yLgorICAvLworICAvLyBHZW5lcmljIHNlcnZpY2VzIGFyZSBub3cgY29uc2lkZXJlZCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHVzaW5nIHBsdWdpbnMKKyAgLy8gdGhhdCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHlvdXIgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhlcmVmb3JlLAorICAvLyB0aGVzZSBkZWZhdWx0IHRvIGZhbHNlLiAgT2xkIGNvZGUgd2hpY2ggZGVwZW5kcyBvbiBnZW5lcmljIHNlcnZpY2VzIHNob3VsZAorICAvLyBleHBsaWNpdGx5IHNldCB0aGVtIHRvIHRydWUuCisgIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0PWZhbHNlXTsKKworICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KKyAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworbWVzc2FnZSBNZXNzYWdlT3B0aW9ucyB7CisgIC8vIFNldCB0cnVlIHRvIHVzZSB0aGUgb2xkIHByb3RvMSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0IGZvciBleHRlbnNpb25zLgorICAvLyBUaGlzIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNZXNzYWdlU2V0IHdpcmUKKyAgLy8gZm9ybWF0LiAgWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZm9yIGFueSBvdGhlciByZWFzb246ICBJdCdzIGxlc3MKKyAgLy8gZWZmaWNpZW50LCBoYXMgZmV3ZXIgZmVhdHVyZXMsIGFuZCBpcyBtb3JlIGNvbXBsaWNhdGVkLgorICAvLworICAvLyBUaGUgbWVzc2FnZSBtdXN0IGJlIGRlZmluZWQgZXhhY3RseSBhcyBmb2xsb3dzOgorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7CisgIC8vICAgICBleHRlbnNpb25zIDQgdG8gbWF4OworICAvLyAgIH0KKyAgLy8gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGNhbm5vdCBoYXZlIGFueSBkZWZpbmVkIGZpZWxkczsgTWVzc2FnZVNldHMgb25seQorICAvLyBoYXZlIGV4dGVuc2lvbnMuCisgIC8vCisgIC8vIEFsbCBleHRlbnNpb25zIG9mIHlvdXIgdHlwZSBtdXN0IGJlIHNpbmd1bGFyIG1lc3NhZ2VzOyBlLmcuIHRoZXkgY2Fubm90CisgIC8vIGJlIGludDMycywgZW51bXMsIG9yIHJlcGVhdGVkIG1lc3NhZ2VzLgorICAvLworICAvLyBCZWNhdXNlIHRoaXMgaXMgYW4gb3B0aW9uLCB0aGUgYWJvdmUgdHdvIHJlc3RyaWN0aW9ucyBhcmUgbm90IGVuZm9yY2VkIGJ5CisgIC8vIHRoZSBwcm90b2NvbCBjb21waWxlci4KKyAgb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIERpc2FibGVzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBzdGFuZGFyZCAiZGVzY3JpcHRvcigpIiBhY2Nlc3Nvciwgd2hpY2ggY2FuCisgIC8vIGNvbmZsaWN0IHdpdGggYSBmaWVsZCBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyBtZWFudCB0byBtYWtlIG1pZ3JhdGlvbgorICAvLyBmcm9tIHByb3RvMSBlYXNpZXI7IG5ldyBjb2RlIHNob3VsZCBhdm9pZCBmaWVsZHMgbmFtZWQgImRlc2NyaXB0b3IiLgorICBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0PWZhbHNlXTsKKworICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KKyAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworbWVzc2FnZSBGaWVsZE9wdGlvbnMgeworICAvLyBUaGUgY3R5cGUgb3B0aW9uIGluc3RydWN0cyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIHVzZSBhIGRpZmZlcmVudAorICAvLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmllbGQgdGhhbiBpdCBub3JtYWxseSB3b3VsZC4gIFNlZSB0aGUgc3BlY2lmaWMKKyAgLy8gb3B0aW9ucyBiZWxvdy4gIFRoaXMgb3B0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gdGhlIG9wZW4gc291cmNlCisgIC8vIHJlbGVhc2UgLS0gc29ycnksIHdlJ2xsIHRyeSB0byBpbmNsdWRlIGl0IGluIGEgZnV0dXJlIHZlcnNpb24hCisgIG9wdGlvbmFsIENUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107CisgIGVudW0gQ1R5cGUgeworICAgIC8vIERlZmF1bHQgbW9kZS4KKyAgICBTVFJJTkcgPSAwOworCisgICAgQ09SRCA9IDE7CisKKyAgICBTVFJJTkdfUElFQ0UgPSAyOworICB9CisgIC8vIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQorICAvLyBhIG1vcmUgZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uIG9uIHRoZSB3aXJlLiBSYXRoZXIgdGhhbiByZXBlYXRlZGx5CisgIC8vIHdyaXRpbmcgdGhlIHRhZyBhbmQgdHlwZSBmb3IgZWFjaCBlbGVtZW50LCB0aGUgZW50aXJlIGFycmF5IGlzIGVuY29kZWQgYXMKKyAgLy8gYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLgorICBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CisKKworCisgIC8vIFNob3VsZCB0aGlzIGZpZWxkIGJlIHBhcnNlZCBsYXppbHk/ICBMYXp5IGFwcGxpZXMgb25seSB0byBtZXNzYWdlLXR5cGUKKyAgLy8gZmllbGRzLiAgSXQgbWVhbnMgdGhhdCB3aGVuIHRoZSBvdXRlciBtZXNzYWdlIGlzIGluaXRpYWxseSBwYXJzZWQsIHRoZQorICAvLyBpbm5lciBtZXNzYWdlJ3MgY29udGVudHMgd2lsbCBub3QgYmUgcGFyc2VkIGJ1dCBpbnN0ZWFkIHN0b3JlZCBpbiBlbmNvZGVkCisgIC8vIGZvcm0uICBUaGUgaW5uZXIgbWVzc2FnZSB3aWxsIGFjdHVhbGx5IGJlIHBhcnNlZCB3aGVuIGl0IGlzIGZpcnN0IGFjY2Vzc2VkLgorICAvLworICAvLyBUaGlzIGlzIG9ubHkgYSBoaW50LiAgSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZQorICAvLyBlYWdlciBvciBsYXp5IHBhcnNpbmcgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBvcHRpb24uICBIb3dldmVyLAorICAvLyBzZXR0aW5nIHRoaXMgb3B0aW9uIHRydWUgc3VnZ2VzdHMgdGhhdCB0aGUgcHJvdG9jb2wgYXV0aG9yIGJlbGlldmVzIHRoYXQKKyAgLy8gdXNpbmcgbGF6eSBwYXJzaW5nIG9uIHRoaXMgZmllbGQgaXMgd29ydGggdGhlIGFkZGl0aW9uYWwgYm9va2tlZXBpbmcKKyAgLy8gb3ZlcmhlYWQgdHlwaWNhbGx5IG5lZWRlZCB0byBpbXBsZW1lbnQgaXQuCisgIC8vCisgIC8vIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhbnkgZ2VuZXJhdGVkIGNvZGU7CisgIC8vIGFsbCBtZXRob2Qgc2lnbmF0dXJlcyByZW1haW4gdGhlIHNhbWUuICBGdXJ0aGVybW9yZSwgdGhyZWFkLXNhZmV0eSBvZiB0aGUKKyAgLy8gaW50ZXJmYWNlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbjsgY29uc3QgbWV0aG9kcyByZW1haW4gc2FmZSB0bworICAvLyBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHdoaWxlIG5vbi1jb25zdCBtZXRob2RzIGNvbnRpbnVlCisgIC8vIHRvIHJlcXVpcmUgZXhjbHVzaXZlIGFjY2Vzcy4KKyAgLy8KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIG5vdCB0byBjaGVjayByZXF1aXJlZCBmaWVsZHMgd2l0aGluCisgIC8vIGEgbGF6eSBzdWItbWVzc2FnZS4gIFRoYXQgaXMsIGNhbGxpbmcgSXNJbml0aWFsaXplZCgpIG9uIHRoZSBvdXRoZXIgbWVzc2FnZQorICAvLyBtYXkgcmV0dXJuIHRydWUgZXZlbiBpZiB0aGUgaW5uZXIgbWVzc2FnZSBoYXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBpbm5lciBtZXNzYWdlIHdvdWxkIGhhdmUgdG8gYmUKKyAgLy8gcGFyc2VkIGluIG9yZGVyIHRvIHBlcmZvcm0gdGhlIGNoZWNrLCBkZWZlYXRpbmcgdGhlIHB1cnBvc2Ugb2YgbGF6eQorICAvLyBwYXJzaW5nLiAgQW4gaW1wbGVtZW50YXRpb24gd2hpY2ggY2hvb3NlcyBub3QgdG8gY2hlY2sgcmVxdWlyZWQgZmllbGRzCisgIC8vIG11c3QgYmUgY29uc2lzdGVudCBhYm91dCBpdC4gIFRoYXQgaXMsIGZvciBhbnkgcGFydGljdWxhciBzdWItbWVzc2FnZSwgdGhlCisgIC8vIGltcGxlbWVudGF0aW9uIG11c3QgZWl0aGVyICphbHdheXMqIGNoZWNrIGl0cyByZXF1aXJlZCBmaWVsZHMsIG9yICpuZXZlcioKKyAgLy8gY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgbWVzc2FnZSBoYXMKKyAgLy8gYmVlbiBwYXJzZWQuCisgIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIElzIHRoaXMgZmllbGQgZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgYWNjZXNzb3JzLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsIHRoaXMKKyAgLy8gaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBmaWVsZHMuCisgIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIEVYUEVSSU1FTlRBTC4gIERPIE5PVCBVU0UuCisgIC8vIEZvciAibWFwIiBmaWVsZHMsIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgZW5jbG9zZWQgdHlwZSB0aGF0CisgIC8vIGlzIHRoZSBrZXkgZm9yIHRoaXMgbWFwLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZToKKyAgLy8gICBtZXNzYWdlIEl0ZW0geworICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIG5hbWUgPSAxOworICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIHZhbHVlID0gMjsKKyAgLy8gICB9CisgIC8vICAgbWVzc2FnZSBDb25maWcgeworICAvLyAgICAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5PSJuYW1lIl07CisgIC8vICAgfQorICAvLyBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIG1hcCBrZXkgZm9yIEl0ZW0gd2lsbCBiZSBzZXQgdG8gIm5hbWUiLgorICAvLyBUT0RPOiBGdWxseS1pbXBsZW1lbnQgdGhpcywgdGhlbiByZW1vdmUgdGhlICJleHBlcmltZW50YWxfIiBwcmVmaXguCisgIG9wdGlvbmFsIHN0cmluZyBleHBlcmltZW50YWxfbWFwX2tleSA9IDk7CisKKyAgLy8gRm9yIEdvb2dsZS1pbnRlcm5hbCBtaWdyYXRpb24gb25seS4gRG8gbm90IHVzZS4KKyAgb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIEVudW1PcHRpb25zIHsKKworICAvLyBTZXQgdGhpcyBvcHRpb24gdG8gZmFsc2UgdG8gZGlzYWxsb3cgbWFwcGluZyBkaWZmZXJlbnQgdGFnIG5hbWVzIHRvIGEgc2FtZQorICAvLyB2YWx1ZS4KKyAgb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDIgW2RlZmF1bHQ9dHJ1ZV07CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgRW51bVZhbHVlT3B0aW9ucyB7CisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIFNlcnZpY2VPcHRpb25zIHsKKworICAvLyBOb3RlOiAgRmllbGQgbnVtYmVycyAxIHRocm91Z2ggMzIgYXJlIHJlc2VydmVkIGZvciBHb29nbGUncyBpbnRlcm5hbCBSUEMKKyAgLy8gICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2VsdmVzLCBidXQKKyAgLy8gICB3ZSB3ZXJlIGFscmVhZHkgdXNpbmcgdGhlbSBsb25nIGJlZm9yZSB3ZSBkZWNpZGVkIHRvIHJlbGVhc2UgUHJvdG9jb2wKKyAgLy8gICBCdWZmZXJzLgorCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIE1ldGhvZE9wdGlvbnMgeworCisgIC8vIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQworICAvLyAgIGZyYW1ld29yay4gIFdlIGFwb2xvZ2l6ZSBmb3IgaG9hcmRpbmcgdGhlc2UgbnVtYmVycyB0byBvdXJzZWx2ZXMsIGJ1dAorICAvLyAgIHdlIHdlcmUgYWxyZWFkeSB1c2luZyB0aGVtIGxvbmcgYmVmb3JlIHdlIGRlY2lkZWQgdG8gcmVsZWFzZSBQcm90b2NvbAorICAvLyAgIEJ1ZmZlcnMuCisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKKworLy8gQSBtZXNzYWdlIHJlcHJlc2VudGluZyBhIG9wdGlvbiB0aGUgcGFyc2VyIGRvZXMgbm90IHJlY29nbml6ZS4gVGhpcyBvbmx5CisvLyBhcHBlYXJzIGluIG9wdGlvbnMgcHJvdG9zIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyOjpQYXJzZXIgY2xhc3MuCisvLyBEZXNjcmlwdG9yUG9vbCByZXNvbHZlcyB0aGVzZSB3aGVuIGJ1aWxkaW5nIERlc2NyaXB0b3Igb2JqZWN0cy4gVGhlcmVmb3JlLAorLy8gb3B0aW9ucyBwcm90b3MgaW4gZGVzY3JpcHRvciBvYmplY3RzIChlLmcuIHJldHVybmVkIGJ5IERlc2NyaXB0b3I6Om9wdGlvbnMoKSwKKy8vIG9yIHByb2R1Y2VkIGJ5IERlc2NyaXB0b3I6OkNvcHlUbygpKSB3aWxsIG5ldmVyIGhhdmUgVW5pbnRlcnByZXRlZE9wdGlvbnMKKy8vIGluIHRoZW0uCittZXNzYWdlIFVuaW50ZXJwcmV0ZWRPcHRpb24geworICAvLyBUaGUgbmFtZSBvZiB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24uICBFYWNoIHN0cmluZyByZXByZXNlbnRzIGEgc2VnbWVudCBpbgorICAvLyBhIGRvdC1zZXBhcmF0ZWQgbmFtZS4gIGlzX2V4dGVuc2lvbiBpcyB0cnVlIGlmZiBhIHNlZ21lbnQgcmVwcmVzZW50cyBhbgorICAvLyBleHRlbnNpb24gKGRlbm90ZWQgd2l0aCBwYXJlbnRoZXNlcyBpbiBvcHRpb25zIHNwZWNzIGluIC5wcm90byBmaWxlcykuCisgIC8vIEUuZy4seyBbImZvbyIsIGZhbHNlXSwgWyJiYXIuYmF6IiwgdHJ1ZV0sIFsicXV4IiwgZmFsc2VdIH0gcmVwcmVzZW50cworICAvLyAiZm9vLihiYXIuYmF6KS5xdXgiLgorICBtZXNzYWdlIE5hbWVQYXJ0IHsKKyAgICByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKKyAgICByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CisgIH0KKyAgcmVwZWF0ZWQgTmFtZVBhcnQgbmFtZSA9IDI7CisKKyAgLy8gVGhlIHZhbHVlIG9mIHRoZSB1bmludGVycHJldGVkIG9wdGlvbiwgaW4gd2hhdGV2ZXIgdHlwZSB0aGUgdG9rZW5pemVyCisgIC8vIGlkZW50aWZpZWQgaXQgYXMgZHVyaW5nIHBhcnNpbmcuIEV4YWN0bHkgb25lIG9mIHRoZXNlIHNob3VsZCBiZSBzZXQuCisgIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKKyAgb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CisgIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OworICBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT3B0aW9uYWwgc291cmNlIGNvZGUgaW5mbworCisvLyBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggYQorLy8gRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZ2VuZXJhdGVkLgorbWVzc2FnZSBTb3VyY2VDb2RlSW5mbyB7CisgIC8vIEEgTG9jYXRpb24gaWRlbnRpZmllcyBhIHBpZWNlIG9mIHNvdXJjZSBjb2RlIGluIGEgLnByb3RvIGZpbGUgd2hpY2gKKyAgLy8gY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGRlZmluaXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkCisgIC8vIHRvIGJlIHVzZWZ1bCB0byBJREVzLCBjb2RlIGluZGV4ZXJzLCBkb2N1bWVudGF0aW9uIGdlbmVyYXRvcnMsIGFuZCBzaW1pbGFyCisgIC8vIHRvb2xzLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgc2F5IHdlIGhhdmUgYSBmaWxlIGxpa2U6CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CisgIC8vICAgfQorICAvLyBMZXQncyBsb29rIGF0IGp1c3QgdGhlIGZpZWxkIGRlZmluaXRpb246CisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CisgIC8vICAgXiAgICAgICBeXiAgICAgXl4gIF4gIF5eXgorICAvLyAgIGEgICAgICAgYmMgICAgIGRlICBmICBnaGkKKyAgLy8gV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAgLy8gICBzcGFuICAgcGF0aCAgICAgICAgICAgICAgIHJlcHJlc2VudHMKKyAgLy8gICBbYSxpKSAgWyA0LCAwLCAyLCAwIF0gICAgIFRoZSB3aG9sZSBmaWVsZCBkZWZpbml0aW9uLgorICAvLyAgIFthLGIpICBbIDQsIDAsIDIsIDAsIDQgXSAgVGhlIGxhYmVsIChvcHRpb25hbCkuCisgIC8vICAgW2MsZCkgIFsgNCwgMCwgMiwgMCwgNSBdICBUaGUgdHlwZSAoc3RyaW5nKS4KKyAgLy8gICBbZSxmKSAgWyA0LCAwLCAyLCAwLCAxIF0gIFRoZSBuYW1lIChmb28pLgorICAvLyAgIFtnLGgpICBbIDQsIDAsIDIsIDAsIDMgXSAgVGhlIG51bWJlciAoMSkuCisgIC8vCisgIC8vIE5vdGVzOgorICAvLyAtIEEgbG9jYXRpb24gbWF5IHJlZmVyIHRvIGEgcmVwZWF0ZWQgZmllbGQgaXRzZWxmIChpLmUuIG5vdCB0byBhbnkKKyAgLy8gICBwYXJ0aWN1bGFyIGluZGV4IHdpdGhpbiBpdCkuICBUaGlzIGlzIHVzZWQgd2hlbmV2ZXIgYSBzZXQgb2YgZWxlbWVudHMgYXJlCisgIC8vICAgbG9naWNhbGx5IGVuY2xvc2VkIGluIGEgc2luZ2xlIGNvZGUgc2VnbWVudC4gIEZvciBleGFtcGxlLCBhbiBlbnRpcmUKKyAgLy8gICBleHRlbmQgYmxvY2sgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgZXh0ZW5zaW9uIGRlZmluaXRpb25zKSB3aWxsCisgIC8vICAgaGF2ZSBhbiBvdXRlciBsb2NhdGlvbiB3aG9zZSBwYXRoIHJlZmVycyB0byB0aGUgImV4dGVuc2lvbnMiIHJlcGVhdGVkCisgIC8vICAgZmllbGQgd2l0aG91dCBhbiBpbmRleC4KKyAgLy8gLSBNdWx0aXBsZSBsb2NhdGlvbnMgbWF5IGhhdmUgdGhlIHNhbWUgcGF0aC4gIFRoaXMgaGFwcGVucyB3aGVuIGEgc2luZ2xlCisgIC8vICAgbG9naWNhbCBkZWNsYXJhdGlvbiBpcyBzcHJlYWQgb3V0IGFjcm9zcyBtdWx0aXBsZSBwbGFjZXMuICBUaGUgbW9zdAorICAvLyAgIG9idmlvdXMgZXhhbXBsZSBpcyB0aGUgImV4dGVuZCIgYmxvY2sgYWdhaW4gLS0gdGhlcmUgbWF5IGJlIG11bHRpcGxlCisgIC8vICAgZXh0ZW5kIGJsb2NrcyBpbiB0aGUgc2FtZSBzY29wZSwgZWFjaCBvZiB3aGljaCB3aWxsIGhhdmUgdGhlIHNhbWUgcGF0aC4KKyAgLy8gLSBBIGxvY2F0aW9uJ3Mgc3BhbiBpcyBub3QgYWx3YXlzIGEgc3Vic2V0IG9mIGl0cyBwYXJlbnQncyBzcGFuLiAgRm9yCisgIC8vICAgZXhhbXBsZSwgdGhlICJleHRlbmRlZSIgb2YgYW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIGFwcGVhcnMgYXQgdGhlCisgIC8vICAgYmVnaW5uaW5nIG9mIHRoZSAiZXh0ZW5kIiBibG9jayBhbmQgaXMgc2hhcmVkIGJ5IGFsbCBleHRlbnNpb25zIHdpdGhpbgorICAvLyAgIHRoZSBibG9jay4KKyAgLy8gLSBKdXN0IGJlY2F1c2UgYSBsb2NhdGlvbidzIHNwYW4gaXMgYSBzdWJzZXQgb2Ygc29tZSBvdGhlciBsb2NhdGlvbidzIHNwYW4KKyAgLy8gICBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgYSBkZXNjZW5kZW50LiAgRm9yIGV4YW1wbGUsIGEgImdyb3VwIiBkZWZpbmVzCisgIC8vICAgYm90aCBhIHR5cGUgYW5kIGEgZmllbGQgaW4gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBUaHVzLCB0aGUgbG9jYXRpb25zCisgIC8vICAgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBhbmQgZmllbGQgYW5kIHRoZWlyIGNvbXBvbmVudHMgd2lsbCBvdmVybGFwLgorICAvLyAtIENvZGUgd2hpY2ggdHJpZXMgdG8gaW50ZXJwcmV0IGxvY2F0aW9ucyBzaG91bGQgcHJvYmFibHkgYmUgZGVzaWduZWQgdG8KKyAgLy8gICBpZ25vcmUgdGhvc2UgdGhhdCBpdCBkb2Vzbid0IHVuZGVyc3RhbmQsIGFzIG1vcmUgdHlwZXMgb2YgbG9jYXRpb25zIGNvdWxkCisgIC8vICAgYmUgcmVjb3JkZWQgaW4gdGhlIGZ1dHVyZS4KKyAgcmVwZWF0ZWQgTG9jYXRpb24gbG9jYXRpb24gPSAxOworICBtZXNzYWdlIExvY2F0aW9uIHsKKyAgICAvLyBJZGVudGlmaWVzIHdoaWNoIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGRlZmluZWQgYXQgdGhpcworICAgIC8vIGxvY2F0aW9uLgorICAgIC8vCisgICAgLy8gRWFjaCBlbGVtZW50IGlzIGEgZmllbGQgbnVtYmVyIG9yIGFuIGluZGV4LiAgVGhleSBmb3JtIGEgcGF0aCBmcm9tCisgICAgLy8gdGhlIHJvb3QgRmlsZURlc2NyaXB0b3JQcm90byB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIGRlZmluaXRpb24uICBGb3IKKyAgICAvLyBleGFtcGxlLCB0aGlzIHBhdGg6CisgICAgLy8gICBbIDQsIDMsIDIsIDcsIDEgXQorICAgIC8vIHJlZmVycyB0bzoKKyAgICAvLyAgIGZpbGUubWVzc2FnZV90eXBlKDMpICAvLyA0LCAzCisgICAgLy8gICAgICAgLmZpZWxkKDcpICAgICAgICAgLy8gMiwgNworICAgIC8vICAgICAgIC5uYW1lKCkgICAgICAgICAgIC8vIDEKKyAgICAvLyBUaGlzIGlzIGJlY2F1c2UgRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUgaGFzIGZpZWxkIG51bWJlciA0OgorICAgIC8vICAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgICAgLy8gYW5kIERlc2NyaXB0b3JQcm90by5maWVsZCBoYXMgZmllbGQgbnVtYmVyIDI6CisgICAgLy8gICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgICAgLy8gYW5kIEZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUgaGFzIGZpZWxkIG51bWJlciAxOgorICAgIC8vICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIC8vCisgICAgLy8gVGh1cywgdGhlIGFib3ZlIHBhdGggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIGEgZmllbGQgbmFtZS4gIElmIHdlIHJlbW92ZWQKKyAgICAvLyB0aGUgbGFzdCBlbGVtZW50OgorICAgIC8vICAgWyA0LCAzLCAyLCA3IF0KKyAgICAvLyB0aGlzIHBhdGggcmVmZXJzIHRvIHRoZSB3aG9sZSBmaWVsZCBkZWNsYXJhdGlvbiAoZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgLy8gb2YgdGhlIGxhYmVsIHRvIHRoZSB0ZXJtaW5hdGluZyBzZW1pY29sb24pLgorICAgIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQ9dHJ1ZV07CisKKyAgICAvLyBBbHdheXMgaGFzIGV4YWN0bHkgdGhyZWUgb3IgZm91ciBlbGVtZW50czogc3RhcnQgbGluZSwgc3RhcnQgY29sdW1uLAorICAgIC8vIGVuZCBsaW5lIChvcHRpb25hbCwgb3RoZXJ3aXNlIGFzc3VtZWQgc2FtZSBhcyBzdGFydCBsaW5lKSwgZW5kIGNvbHVtbi4KKyAgICAvLyBUaGVzZSBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgZmllbGQgZm9yIGVmZmljaWVuY3kuICBOb3RlIHRoYXQgbGluZQorICAgIC8vIGFuZCBjb2x1bW4gbnVtYmVycyBhcmUgemVyby1iYXNlZCAtLSB0eXBpY2FsbHkgeW91IHdpbGwgd2FudCB0byBhZGQKKyAgICAvLyAxIHRvIGVhY2ggYmVmb3JlIGRpc3BsYXlpbmcgdG8gYSB1c2VyLgorICAgIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQ9dHJ1ZV07CisKKyAgICAvLyBJZiB0aGlzIFNvdXJjZUNvZGVJbmZvIHJlcHJlc2VudHMgYSBjb21wbGV0ZSBkZWNsYXJhdGlvbiwgdGhlc2UgYXJlIGFueQorICAgIC8vIGNvbW1lbnRzIGFwcGVhcmluZyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNsYXJhdGlvbiB3aGljaCBhcHBlYXIgdG8gYmUKKyAgICAvLyBhdHRhY2hlZCB0byB0aGUgZGVjbGFyYXRpb24uCisgICAgLy8KKyAgICAvLyBBIHNlcmllcyBvZiBsaW5lIGNvbW1lbnRzIGFwcGVhcmluZyBvbiBjb25zZWN1dGl2ZSBsaW5lcywgd2l0aCBubyBvdGhlcgorICAgIC8vIHRva2VucyBhcHBlYXJpbmcgb24gdGhvc2UgbGluZXMsIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSBjb21tZW50LgorICAgIC8vCisgICAgLy8gT25seSB0aGUgY29tbWVudCBjb250ZW50IGlzIHByb3ZpZGVkOyBjb21tZW50IG1hcmtlcnMgKGUuZy4gLy8pIGFyZQorICAgIC8vIHN0cmlwcGVkIG91dC4gIEZvciBibG9jayBjb21tZW50cywgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBhbiBhc3RlcmlzaworICAgIC8vIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4KKyAgICAvLyBOZXdsaW5lcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KKyAgICAvLworICAgIC8vIEV4YW1wbGVzOgorICAgIC8vCisgICAgLy8gICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOyAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBmb28uCisgICAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhci4KKyAgICAvLyAgIG9wdGlvbmFsIGludDMyIGJhciA9IDI7CisgICAgLy8KKyAgICAvLyAgIG9wdGlvbmFsIHN0cmluZyBiYXogPSAzOworICAgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXouCisgICAgLy8gICAvLyBBbm90aGVyIGxpbmUgYXR0YWNoZWQgdG8gYmF6LgorICAgIC8vCisgICAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIHF1eC4KKyAgICAvLyAgIC8vCisgICAgLy8gICAvLyBBbm90aGVyIGxpbmUgYXR0YWNoZWQgdG8gcXV4LgorICAgIC8vICAgb3B0aW9uYWwgZG91YmxlIHF1eCA9IDQ7CisgICAgLy8KKyAgICAvLyAgIG9wdGlvbmFsIHN0cmluZyBjb3JnZSA9IDU7CisgICAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkCisgICAgLy8gICAgKiB0byBjb3JnZS4gIExlYWRpbmcgYXN0ZXJpc2tzCisgICAgLy8gICAgKiB3aWxsIGJlIHJlbW92ZWQuICovCisgICAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkIHRvCisgICAgLy8gICAgKiBncmF1bHQuICovCisgICAgLy8gICBvcHRpb25hbCBpbnQzMiBncmF1bHQgPSA2OworICAgIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgICBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYwpAQCAtMCwwICsxLDU0MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgorCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK0Rlc2NyaXB0b3JEYXRhYmFzZTo6fkRlc2NyaXB0b3JEYXRhYmFzZSgpIHt9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkFkZEZpbGUoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZSwKKyAgICBWYWx1ZSB2YWx1ZSkgeworICBpZiAoIUluc2VydElmTm90UHJlc2VudCgmYnlfbmFtZV8sIGZpbGUubmFtZSgpLCB2YWx1ZSkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRmlsZSBhbHJlYWR5IGV4aXN0cyBpbiBkYXRhYmFzZTogIiA8PCBmaWxlLm5hbWUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBXZSBtdXN0IGJlIGNhcmVmdWwgaGVyZSAtLSBjYWxsaW5nIGZpbGUucGFja2FnZSgpIGlmIGZpbGUuaGFzX3BhY2thZ2UoKSBpcworICAvLyBmYWxzZSBjb3VsZCBhY2Nlc3MgYW4gdW5pbml0aWFsaXplZCBzdGF0aWMtc3RvcmFnZSB2YXJpYWJsZSBpZiB3ZSBhcmUgYmVpbmcKKyAgLy8gcnVuIGF0IHN0YXJ0dXAgdGltZS4KKyAgc3RyaW5nIHBhdGggPSBmaWxlLmhhc19wYWNrYWdlKCkgPyBmaWxlLnBhY2thZ2UoKSA6IHN0cmluZygpOworICBpZiAoIXBhdGguZW1wdHkoKSkgcGF0aCArPSAnLic7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghQWRkU3ltYm9sKHBhdGggKyBmaWxlLm1lc3NhZ2VfdHlwZShpKS5uYW1lKCksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghQWRkTmVzdGVkRXh0ZW5zaW9ucyhmaWxlLm1lc3NhZ2VfdHlwZShpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghQWRkU3ltYm9sKHBhdGggKyBmaWxlLmVudW1fdHlwZShpKS5uYW1lKCksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIUFkZFN5bWJvbChwYXRoICsgZmlsZS5leHRlbnNpb24oaSkubmFtZSgpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUFkZEV4dGVuc2lvbihmaWxlLmV4dGVuc2lvbihpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLnNlcnZpY2Vfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIUFkZFN5bWJvbChwYXRoICsgZmlsZS5zZXJ2aWNlKGkpLm5hbWUoKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkFkZFN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsIFZhbHVlIHZhbHVlKSB7CisgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIG5vdCB0byB2aW9sYXRlIG91ciBtYXAgaW52YXJpYW50LgorCisgIC8vIElmIHRoZSBzeW1ib2wgbmFtZSBpcyBpbnZhbGlkIGl0IGNvdWxkIGJyZWFrIG91ciBsb29rdXAgYWxnb3JpdGhtICh3aGljaAorICAvLyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCAnLicgc29ydHMgYmVmb3JlIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgYXJlCisgIC8vIHZhbGlkIGluIHN5bWJvbCBuYW1lcykuCisgIGlmICghVmFsaWRhdGVTeW1ib2xOYW1lKG5hbWUpKSB7CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkludmFsaWQgc3ltYm9sIG5hbWU6ICIgPDwgbmFtZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBUcnkgdG8gbG9vayB1cCB0aGUgc3ltYm9sIHRvIG1ha2Ugc3VyZSBhIHN1cGVyLXN5bWJvbCBkb2Vzbid0IGFscmVhZHkKKyAgLy8gZXhpc3QuCisgIHR5cGVuYW1lIG1hcDxzdHJpbmcsIFZhbHVlPjo6aXRlcmF0b3IgaXRlciA9IEZpbmRMYXN0TGVzc09yRXF1YWwobmFtZSk7CisKKyAgaWYgKGl0ZXIgPT0gYnlfc3ltYm9sXy5lbmQoKSkgeworICAgIC8vIEFwcGFyZW50bHkgdGhlIG1hcCBpcyBjdXJyZW50bHkgZW1wdHkuICBKdXN0IGluc2VydCBhbmQgYmUgZG9uZSB3aXRoIGl0LgorICAgIGJ5X3N5bWJvbF8uaW5zZXJ0KHR5cGVuYW1lIG1hcDxzdHJpbmcsIFZhbHVlPjo6dmFsdWVfdHlwZShuYW1lLCB2YWx1ZSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKElzU3ViU3ltYm9sKGl0ZXItPmZpcnN0LCBuYW1lKSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJTeW1ib2wgbmFtZSBcIiIgPDwgbmFtZSA8PCAiXCIgY29uZmxpY3RzIHdpdGggdGhlIGV4aXN0aW5nICIKKyAgICAgICAgICAgICAgICAgICJzeW1ib2wgXCIiIDw8IGl0ZXItPmZpcnN0IDw8ICJcIi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE9LLCB0aGF0IHdvcmtlZC4gIE5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIHN5bWJvbCBpbiB0aGUgbWFwIGlzCisgIC8vIGEgc3ViLXN5bWJvbCBvZiB0aGUgb25lIHdlIGFyZSBpbnNlcnRpbmcuICBUaGUgb25seSBzeW1ib2wgd2hpY2ggY291bGQKKyAgLy8gYmUgc28gaXMgdGhlIGZpcnN0IHN5bWJvbCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IHN5bWJvbC4gIFNpbmNlCisgIC8vIHxpdGVyfCBwb2ludHMgYXQgdGhlIGxhc3Qgc3ltYm9sIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsLCB3ZSBqdXN0IGhhdmUKKyAgLy8gdG8gaW5jcmVtZW50IGl0LgorICArK2l0ZXI7CisKKyAgaWYgKGl0ZXIgIT0gYnlfc3ltYm9sXy5lbmQoKSAmJiBJc1N1YlN5bWJvbChuYW1lLCBpdGVyLT5maXJzdCkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiU3ltYm9sIG5hbWUgXCIiIDw8IG5hbWUgPDwgIlwiIGNvbmZsaWN0cyB3aXRoIHRoZSBleGlzdGluZyAiCisgICAgICAgICAgICAgICAgICAic3ltYm9sIFwiIiA8PCBpdGVyLT5maXJzdCA8PCAiXCIuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBPSywgbm8gY29uZmxpY3RzLgorCisgIC8vIEluc2VydCB0aGUgbmV3IHN5bWJvbCB1c2luZyB0aGUgaXRlcmF0b3IgYXMgYSBoaW50LCB0aGUgbmV3IGVudHJ5IHdpbGwKKyAgLy8gYXBwZWFyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgb25lIHRoZSBpdGVyYXRvciBpcyBwb2ludGluZyBhdC4KKyAgYnlfc3ltYm9sXy5pbnNlcnQoaXRlciwgdHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+Ojp2YWx1ZV90eXBlKG5hbWUsIHZhbHVlKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpBZGROZXN0ZWRFeHRlbnNpb25zKAorICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgbWVzc2FnZV90eXBlLAorICAgIFZhbHVlIHZhbHVlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV90eXBlLm5lc3RlZF90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCFBZGROZXN0ZWRFeHRlbnNpb25zKG1lc3NhZ2VfdHlwZS5uZXN0ZWRfdHlwZShpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGUuZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCFBZGRFeHRlbnNpb24obWVzc2FnZV90eXBlLmV4dGVuc2lvbihpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpBZGRFeHRlbnNpb24oCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkLAorICAgIFZhbHVlIHZhbHVlKSB7CisgIGlmICghZmllbGQuZXh0ZW5kZWUoKS5lbXB0eSgpICYmIGZpZWxkLmV4dGVuZGVlKClbMF0gPT0gJy4nKSB7CisgICAgLy8gVGhlIGV4dGVuc2lvbiBpcyBmdWxseS1xdWFsaWZpZWQuICBXZSBjYW4gdXNlIGl0IGFzIGEgbG9va3VwIGtleSBpbgorICAgIC8vIHRoZSBieV9zeW1ib2xfIHRhYmxlLgorICAgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KCZieV9leHRlbnNpb25fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcihmaWVsZC5leHRlbmRlZSgpLnN1YnN0cigxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubnVtYmVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSkgeworICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkV4dGVuc2lvbiBjb25mbGljdHMgd2l0aCBleHRlbnNpb24gYWxyZWFkeSBpbiBkYXRhYmFzZTogIgorICAgICAgICAgICAgICAgICAgICAiZXh0ZW5kICIgPDwgZmllbGQuZXh0ZW5kZWUoKSA8PCAiIHsgIgorICAgICAgICAgICAgICAgICA8PCBmaWVsZC5uYW1lKCkgPDwgIiA9ICIgPDwgZmllbGQubnVtYmVyKCkgPDwgIiB9IjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gTm90IGZ1bGx5LXF1YWxpZmllZC4gIFdlIGNhbid0IHJlYWxseSBkbyBhbnl0aGluZyBoZXJlLCB1bmZvcnR1bmF0ZWx5LgorICAgIC8vIFdlIGRvbid0IGNvbnNpZGVyIHRoaXMgYW4gZXJyb3IsIHRob3VnaCwgYmVjYXVzZSB0aGUgZGVzY3JpcHRvciBpcworICAgIC8vIHZhbGlkLgorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+CitWYWx1ZSBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkZpbmRGaWxlKAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIEZpbmRXaXRoRGVmYXVsdChieV9uYW1lXywgZmlsZW5hbWUsIFZhbHVlKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+CitWYWx1ZSBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkZpbmRTeW1ib2woCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHR5cGVuYW1lIG1hcDxzdHJpbmcsIFZhbHVlPjo6aXRlcmF0b3IgaXRlciA9IEZpbmRMYXN0TGVzc09yRXF1YWwobmFtZSk7CisKKyAgcmV0dXJuIChpdGVyICE9IGJ5X3N5bWJvbF8uZW5kKCkgJiYgSXNTdWJTeW1ib2woaXRlci0+Zmlyc3QsIG5hbWUpKSA/CisgICAgICAgICBpdGVyLT5zZWNvbmQgOiBWYWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+CitWYWx1ZSBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkZpbmRFeHRlbnNpb24oCisgICAgY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgaW50IGZpZWxkX251bWJlcikgeworICByZXR1cm4gRmluZFdpdGhEZWZhdWx0KGJ5X2V4dGVuc2lvbl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAorICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKKyAgdHlwZW5hbWUgbWFwPHBhaXI8c3RyaW5nLCBpbnQ+LCBWYWx1ZSA+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICBieV9leHRlbnNpb25fLmxvd2VyX2JvdW5kKG1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIDApKTsKKyAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisKKyAgZm9yICg7IGl0ICE9IGJ5X2V4dGVuc2lvbl8uZW5kKCkgJiYgaXQtPmZpcnN0LmZpcnN0ID09IGNvbnRhaW5pbmdfdHlwZTsKKyAgICAgICArK2l0KSB7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soaXQtPmZpcnN0LnNlY29uZCk7CisgICAgc3VjY2VzcyA9IHRydWU7CisgIH0KKworICByZXR1cm4gc3VjY2VzczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgordHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+OjppdGVyYXRvcgorU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpGaW5kTGFzdExlc3NPckVxdWFsKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICAvLyBGaW5kIHRoZSBsYXN0IGtleSBpbiB0aGUgbWFwIHdoaWNoIHNvcnRzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUKKyAgLy8gc3ltYm9sIG5hbWUuICBTaW5jZSB1cHBlcl9ib3VuZCgpIHJldHVybnMgdGhlICpmaXJzdCoga2V5IHRoYXQgc29ydHMKKyAgLy8gKmdyZWF0ZXIqIHRoYW4gdGhlIGlucHV0LCB3ZSB3YW50IHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGF0LgorICB0eXBlbmFtZSBtYXA8c3RyaW5nLCBWYWx1ZT46Oml0ZXJhdG9yIGl0ZXIgPSBieV9zeW1ib2xfLnVwcGVyX2JvdW5kKG5hbWUpOworICBpZiAoaXRlciAhPSBieV9zeW1ib2xfLmJlZ2luKCkpIC0taXRlcjsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpJc1N1YlN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIHN1Yl9zeW1ib2wsIGNvbnN0IHN0cmluZyYgc3VwZXJfc3ltYm9sKSB7CisgIHJldHVybiBzdWJfc3ltYm9sID09IHN1cGVyX3N5bWJvbCB8fAorICAgICAgICAgKEhhc1ByZWZpeFN0cmluZyhzdXBlcl9zeW1ib2wsIHN1Yl9zeW1ib2wpICYmCisgICAgICAgICAgICAgc3VwZXJfc3ltYm9sW3N1Yl9zeW1ib2wuc2l6ZSgpXSA9PSAnLicpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Citib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6VmFsaWRhdGVTeW1ib2xOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBJIGRvbid0IHRydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuICA6KAorICAgIGlmIChuYW1lW2ldICE9ICcuJyAmJiBuYW1lW2ldICE9ICdfJyAmJgorICAgICAgICAobmFtZVtpXSA8ICcwJyB8fCBuYW1lW2ldID4gJzknKSAmJgorICAgICAgICAobmFtZVtpXSA8ICdBJyB8fCBuYW1lW2ldID4gJ1onKSAmJgorICAgICAgICAobmFtZVtpXSA8ICdhJyB8fCBuYW1lW2ldID4gJ3onKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OlNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSgpIHt9CitTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6On5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoKSB7CisgIFNUTERlbGV0ZUVsZW1lbnRzKCZmaWxlc190b19kZWxldGVfKTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkFkZChjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG5ld19maWxlID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG87CisgIG5ld19maWxlLT5Db3B5RnJvbShmaWxlKTsKKyAgcmV0dXJuIEFkZEFuZE93bihuZXdfZmlsZSk7Cit9CisKK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpBZGRBbmRPd24oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSkgeworICBmaWxlc190b19kZWxldGVfLnB1c2hfYmFjayhmaWxlKTsKKyAgcmV0dXJuIGluZGV4Xy5BZGRGaWxlKCpmaWxlLCBmaWxlKTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZUNvcHkoaW5kZXhfLkZpbmRGaWxlKGZpbGVuYW1lKSwgb3V0cHV0KTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICByZXR1cm4gTWF5YmVDb3B5KGluZGV4Xy5GaW5kU3ltYm9sKHN5bWJvbF9uYW1lKSwgb3V0cHV0KTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKKyAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICByZXR1cm4gTWF5YmVDb3B5KGluZGV4Xy5GaW5kRXh0ZW5zaW9uKGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyKSwgb3V0cHV0KTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAorICAgIGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKKyAgICB2ZWN0b3I8aW50Piogb3V0cHV0KSB7CisgIHJldHVybiBpbmRleF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoZXh0ZW5kZWVfdHlwZSwgb3V0cHV0KTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6Ok1heWJlQ29weShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgaWYgKGZpbGUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICBvdXRwdXQtPkNvcHlGcm9tKCpmaWxlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSgpIHt9CitFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjp+RW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSgpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc190b19kZWxldGVfLnNpemUoKTsgaSsrKSB7CisgICAgb3BlcmF0b3IgZGVsZXRlKGZpbGVzX3RvX2RlbGV0ZV9baV0pOworICB9Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6QWRkKAorICAgIGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBpbnQgc2l6ZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgIGlmIChmaWxlLlBhcnNlRnJvbUFycmF5KGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBzaXplKSkgeworICAgIHJldHVybiBpbmRleF8uQWRkRmlsZShmaWxlLCBtYWtlX3BhaXIoZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIHNpemUpKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3IgZGF0YSBwYXNzZWQgdG8gIgorICAgICAgICAgICAgICAgICAgIkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkFkZCgpLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6QWRkQ29weSgKKyAgICBjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpIHsKKyAgdm9pZCogY29weSA9IG9wZXJhdG9yIG5ldyhzaXplKTsKKyAgbWVtY3B5KGNvcHksIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBzaXplKTsKKyAgZmlsZXNfdG9fZGVsZXRlXy5wdXNoX2JhY2soY29weSk7CisgIHJldHVybiBBZGQoY29weSwgc2l6ZSk7Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVCeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgcmV0dXJuIE1heWJlUGFyc2UoaW5kZXhfLkZpbmRGaWxlKGZpbGVuYW1lKSwgb3V0cHV0KTsKK30KKworYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgcmV0dXJuIE1heWJlUGFyc2UoaW5kZXhfLkZpbmRTeW1ib2woc3ltYm9sX25hbWUpLCBvdXRwdXQpOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgIHN0cmluZyogb3V0cHV0KSB7CisgIHBhaXI8Y29uc3Qgdm9pZCosIGludD4gZW5jb2RlZF9maWxlID0gaW5kZXhfLkZpbmRTeW1ib2woc3ltYm9sX25hbWUpOworICBpZiAoZW5jb2RlZF9maWxlLmZpcnN0ID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBPcHRpbWl6YXRpb246ICBUaGUgbmFtZSBzaG91bGQgYmUgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBlbmNvZGVkIG1lc3NhZ2UuCisgIC8vICAgVHJ5IHRvIGp1c3QgcmVhZCBpdCBkaXJlY3RseS4KKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGVuY29kZWRfZmlsZS5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfZmlsZS5zZWNvbmQpOworCisgIGNvbnN0IHVpbnQzMiBrTmFtZVRhZyA9IGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIsCisgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworCisgIGlmIChpbnB1dC5SZWFkVGFnKCkgPT0ga05hbWVUYWcpIHsKKyAgICAvLyBTdWNjZXNzIQorICAgIHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoJmlucHV0LCBvdXRwdXQpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aC4gIFBhcnNlIHdob2xlIG1lc3NhZ2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIGlmICghZmlsZV9wcm90by5QYXJzZUZyb21BcnJheShlbmNvZGVkX2ZpbGUuZmlyc3QsIGVuY29kZWRfZmlsZS5zZWNvbmQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpvdXRwdXQgPSBmaWxlX3Byb3RvLm5hbWUoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKKyAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICByZXR1cm4gTWF5YmVQYXJzZShpbmRleF8uRmluZEV4dGVuc2lvbihjb250YWluaW5nX3R5cGUsIGZpZWxkX251bWJlciksCisgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAorICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKKyAgcmV0dXJuIGluZGV4Xy5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhleHRlbmRlZV90eXBlLCBvdXRwdXQpOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6Ok1heWJlUGFyc2UoCisgICAgcGFpcjxjb25zdCB2b2lkKiwgaW50PiBlbmNvZGVkX2ZpbGUsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGlmIChlbmNvZGVkX2ZpbGUuZmlyc3QgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gb3V0cHV0LT5QYXJzZUZyb21BcnJheShlbmNvZGVkX2ZpbGUuZmlyc3QsIGVuY29kZWRfZmlsZS5zZWNvbmQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0Rlc2NyaXB0b3JQb29sRGF0YWJhc2U6OkRlc2NyaXB0b3JQb29sRGF0YWJhc2UoY29uc3QgRGVzY3JpcHRvclBvb2wmIHBvb2wpCisgIDogcG9vbF8ocG9vbCkge30KK0Rlc2NyaXB0b3JQb29sRGF0YWJhc2U6On5EZXNjcmlwdG9yUG9vbERhdGFiYXNlKCkge30KKworYm9vbCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlOjpGaW5kRmlsZUJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2xfLkZpbmRGaWxlQnlOYW1lKGZpbGVuYW1lKTsKKyAgaWYgKGZpbGUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICBvdXRwdXQtPkNsZWFyKCk7CisgIGZpbGUtPkNvcHlUbyhvdXRwdXQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3ltYm9sX25hbWUpOworICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgIG91dHB1dC0+Q2xlYXIoKTsKKyAgZmlsZS0+Q29weVRvKG91dHB1dCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIERlc2NyaXB0b3JQb29sRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKKyAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSA9IHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShjb250YWluaW5nX3R5cGUpOworICBpZiAoZXh0ZW5kZWUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0KKyAgICBwb29sXy5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5kZWUsIGZpZWxkX251bWJlcik7CisgIGlmIChleHRlbnNpb24gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIG91dHB1dC0+Q2xlYXIoKTsKKyAgZXh0ZW5zaW9uLT5maWxlKCktPkNvcHlUbyhvdXRwdXQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlOjpGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygKKyAgICBjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgdmVjdG9yPGludD4qIG91dHB1dCkgeworICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSA9IHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShleHRlbmRlZV90eXBlKTsKKyAgaWYgKGV4dGVuZGVlID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZXh0ZW5zaW9uczsKKyAgcG9vbF8uRmluZEFsbEV4dGVuc2lvbnMoZXh0ZW5kZWUsICZleHRlbnNpb25zKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhleHRlbnNpb25zW2ldLT5udW1iZXIoKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6Ok1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSgKKyAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTEsCisgICAgRGVzY3JpcHRvckRhdGFiYXNlKiBzb3VyY2UyKSB7CisgIHNvdXJjZXNfLnB1c2hfYmFjayhzb3VyY2UxKTsKKyAgc291cmNlc18ucHVzaF9iYWNrKHNvdXJjZTIpOworfQorTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoCisgICAgY29uc3QgdmVjdG9yPERlc2NyaXB0b3JEYXRhYmFzZSo+JiBzb3VyY2VzKQorICA6IHNvdXJjZXNfKHNvdXJjZXMpIHt9CitNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6On5NZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoKSB7fQorCitib29sIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVCeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzXy5zaXplKCk7IGkrKykgeworICAgIGlmIChzb3VyY2VzX1tpXS0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzXy5zaXplKCk7IGkrKykgeworICAgIGlmIChzb3VyY2VzX1tpXS0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbF9uYW1lLCBvdXRwdXQpKSB7CisgICAgICAvLyBUaGUgc3ltYm9sIHdhcyBmb3VuZCBpbiBzb3VyY2UgaS4gIEhvd2V2ZXIsIGlmIG9uZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgIC8vIHNvdXJjZXMgZGVmaW5lcyBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lICh3aGljaCBwcmVzdW1hYmx5IGRvZXNuJ3QKKyAgICAgIC8vIGNvbnRhaW4gdGhlIHN5bWJvbCwgc2luY2UgaXQgd2Fzbid0IGZvdW5kIGluIHRoYXQgc291cmNlKSwgdGhlbiB3ZQorICAgICAgLy8gbXVzdCBoaWRlIGl0IGZyb20gdGhlIGNhbGxlci4KKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdGVtcDsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgIGlmIChzb3VyY2VzX1tqXS0+RmluZEZpbGVCeU5hbWUob3V0cHV0LT5uYW1lKCksICZ0ZW1wKSkgeworICAgICAgICAgIC8vIEZvdW5kIGNvbmZsaWN0aW5nIGZpbGUgaW4gYSBwcmV2aW91cyBzb3VyY2UuCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoc291cmNlc19baV0tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKKyAgICAgICAgICBjb250YWluaW5nX3R5cGUsIGZpZWxkX251bWJlciwgb3V0cHV0KSkgeworICAgICAgLy8gVGhlIHN5bWJvbCB3YXMgZm91bmQgaW4gc291cmNlIGkuICBIb3dldmVyLCBpZiBvbmUgb2YgdGhlIHByZXZpb3VzCisgICAgICAvLyBzb3VyY2VzIGRlZmluZXMgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAod2hpY2ggcHJlc3VtYWJseSBkb2Vzbid0CisgICAgICAvLyBjb250YWluIHRoZSBzeW1ib2wsIHNpbmNlIGl0IHdhc24ndCBmb3VuZCBpbiB0aGF0IHNvdXJjZSksIHRoZW4gd2UKKyAgICAgIC8vIG11c3QgaGlkZSBpdCBmcm9tIHRoZSBjYWxsZXIuCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHRlbXA7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICBpZiAoc291cmNlc19bal0tPkZpbmRGaWxlQnlOYW1lKG91dHB1dC0+bmFtZSgpLCAmdGVtcCkpIHsKKyAgICAgICAgICAvLyBGb3VuZCBjb25mbGljdGluZyBmaWxlIGluIGEgcHJldmlvdXMgc291cmNlLgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAorICAgIGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKKyAgICB2ZWN0b3I8aW50Piogb3V0cHV0KSB7CisgIHNldDxpbnQ+IG1lcmdlZF9yZXN1bHRzOworICB2ZWN0b3I8aW50PiByZXN1bHRzOworICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHNvdXJjZXNfW2ldLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhleHRlbmRlZV90eXBlLCAmcmVzdWx0cykpIHsKKyAgICAgIGNvcHkocmVzdWx0cy5iZWdpbigpLCByZXN1bHRzLmVuZCgpLAorICAgICAgICAgICBpbnNlcnRfaXRlcmF0b3I8c2V0PGludD4gPihtZXJnZWRfcmVzdWx0cywgbWVyZ2VkX3Jlc3VsdHMuYmVnaW4oKSkpOworICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfQorICAgIHJlc3VsdHMuY2xlYXIoKTsKKyAgfQorCisgIGNvcHkobWVyZ2VkX3Jlc3VsdHMuYmVnaW4oKSwgbWVyZ2VkX3Jlc3VsdHMuZW5kKCksCisgICAgICAgaW5zZXJ0X2l0ZXJhdG9yPHZlY3RvcjxpbnQ+ID4oKm91dHB1dCwgb3V0cHV0LT5lbmQoKSkpOworCisgIHJldHVybiBzdWNjZXNzOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2IxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCkBAIC0wLDAgKzEsMzY3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBJbnRlcmZhY2UgZm9yIG1hbmlwdWxhdGluZyBkYXRhYmFzZXMgb2YgZGVzY3JpcHRvcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfREFUQUJBU0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0RBVEFCQVNFX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIERlc2NyaXB0b3JEYXRhYmFzZTsKK2NsYXNzIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTsKK2NsYXNzIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U7CitjbGFzcyBEZXNjcmlwdG9yUG9vbERhdGFiYXNlOworY2xhc3MgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGEgZGF0YWJhc2Ugb2YgZGVzY3JpcHRvcnMuCisvLworLy8gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgRGVzY3JpcHRvclBvb2wgd2hpY2ggbG9hZHMKKy8vIGRlc2NyaXB0b3JzIG9uLWRlbWFuZCBmcm9tIHNvbWUgc29ydCBvZiBsYXJnZSBkYXRhYmFzZS4gIElmIHRoZSBkYXRhYmFzZQorLy8gaXMgbGFyZ2UsIGl0IG1heSBiZSBpbmVmZmljaWVudCB0byBlbnVtZXJhdGUgZXZlcnkgLnByb3RvIGZpbGUgaW5zaWRlIGl0CisvLyBjYWxsaW5nIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoKSBmb3IgZWFjaCBvbmUuICBJbnN0ZWFkLCBhIERlc2NyaXB0b3JQb29sCisvLyBjYW4gYmUgY3JlYXRlZCB3aGljaCB3cmFwcyBhIERlc2NyaXB0b3JEYXRhYmFzZSBhbmQgb25seSBidWlsZHMgcGFydGljdWxhcgorLy8gZGVzY3JpcHRvcnMgd2hlbiB0aGV5IGFyZSBuZWVkZWQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyBwdWJsaWM6CisgIGlubGluZSBEZXNjcmlwdG9yRGF0YWJhc2UoKSB7fQorICB2aXJ0dWFsIH5EZXNjcmlwdG9yRGF0YWJhc2UoKTsKKworICAvLyBGaW5kIGEgZmlsZSBieSBmaWxlIG5hbWUuICBGaWxscyBpbiBpbiAqb3V0cHV0IGFuZCByZXR1cm5zIHRydWUgaWYgZm91bmQuCisgIC8vIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZSwgbGVhdmluZyB0aGUgY29udGVudHMgb2YgKm91dHB1dCB1bmRlZmluZWQuCisgIHZpcnR1YWwgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSA9IDA7CisKKyAgLy8gRmluZCB0aGUgZmlsZSB0aGF0IGRlY2xhcmVzIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgc3ltYm9sIG5hbWUuCisgIC8vIElmIGZvdW5kLCBmaWxscyBpbiAqb3V0cHV0IGFuZCByZXR1cm5zIHRydWUsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgIC8vIGFuZCBsZWF2ZXMgKm91dHB1dCB1bmRlZmluZWQuCisgIHZpcnR1YWwgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpID0gMDsKKworICAvLyBGaW5kIHRoZSBmaWxlIHdoaWNoIGRlZmluZXMgYW4gZXh0ZW5zaW9uIGV4dGVuZGluZyB0aGUgZ2l2ZW4gbWVzc2FnZSB0eXBlCisgIC8vIHdpdGggdGhlIGdpdmVuIGZpZWxkIG51bWJlci4gIElmIGZvdW5kLCBmaWxscyBpbiAqb3V0cHV0IGFuZCByZXR1cm5zIHRydWUsCisgIC8vIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMgKm91dHB1dCB1bmRlZmluZWQuICBjb250YWluaW5nX3R5cGUKKyAgLy8gbXVzdCBiZSBhIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUuCisgIHZpcnR1YWwgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpID0gMDsKKworICAvLyBGaW5kcyB0aGUgdGFnIG51bWJlcnMgdXNlZCBieSBhbGwga25vd24gZXh0ZW5zaW9ucyBvZgorICAvLyBleHRlbmRlZV90eXBlLCBhbmQgYXBwZW5kcyB0aGVtIHRvIG91dHB1dCBpbiBhbiB1bmRlZmluZWQKKyAgLy8gb3JkZXIuIFRoaXMgbWV0aG9kIGlzIGJlc3QtZWZmb3J0OiBpdCdzIG5vdCBndWFyYW50ZWVkIHRoYXQgdGhlCisgIC8vIGRhdGFiYXNlIHdpbGwgZmluZCBhbGwgZXh0ZW5zaW9ucywgYW5kIGl0J3Mgbm90IGd1YXJhbnRlZWQgdGhhdAorICAvLyBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24gd2lsbCByZXR1cm4gdHJ1ZSBvbiBhbGwgb2YgdGhlIGZvdW5kCisgIC8vIG51bWJlcnMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VhcmNoIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UKKyAgLy8gcmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzIG91dHB1dCB1bmNoYW5nZWQuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGhhdCBhbHdheXMgcmV0dXJucworICAvLyBmYWxzZS4KKyAgdmlydHVhbCBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmlwdG9yRGF0YWJhc2UpOworfTsKKworLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2UgaW50byB3aGljaCB5b3UgY2FuIGluc2VydCBmaWxlcyBtYW51YWxseS4KKy8vCisvLyBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woKSBpcyBmdWxseS1pbXBsZW1lbnRlZC4gIFdoZW4geW91IGFkZCBhIGZpbGUsIGl0cworLy8gc3ltYm9scyB3aWxsIGJlIGluZGV4ZWQgZm9yIHRoaXMgcHVycG9zZS4gIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24KKy8vIG1heSByZXR1cm4gZmFsc2UgcG9zaXRpdmVzLCBidXQgb25seSBpZiBpdCBpc24ndCBwb3NzaWJsZSBmb3IgdGhlIHN5bWJvbAorLy8gdG8gYmUgZGVmaW5lZCBpbiBhbnkgb3RoZXIgZmlsZS4gIEluIHBhcnRpY3VsYXIsIGlmIGEgZmlsZSBkZWZpbmVzIGEgc3ltYm9sCisvLyAiRm9vIiwgdGhlbiBzZWFyY2hpbmcgZm9yICJGb28uW2FueXRoaW5nXSIgd2lsbCBtYXRjaCB0aGF0IGZpbGUuICBUaGlzIHdheSwKKy8vIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBuZWVkIHRvIGFnZ3Jlc3NpdmVseSBpbmRleCBhbGwgY2hpbGRyZW4gb2YgYSBzeW1ib2wuCisvLworLy8gRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgaXMgbW9zdGx5LWltcGxlbWVudGVkLiAgSXQgd29ya3MgaWYgYW5kIG9ubHkKKy8vIGlmIHRoZSBvcmlnaW5hbCBGaWVsZERlc2NyaXB0b3JQcm90byBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uIGhhcyBhCisvLyBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lIGluIGl0cyAiZXh0ZW5kZWUiIGZpZWxkIChpLmUuIHN0YXJ0cyB3aXRoIGEgJy4nKS4KKy8vIElmIHRoZSBleHRlbmRlZSBpcyBhIHJlbGF0aXZlIG5hbWUsIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSB3aWxsIG5vdAorLy8gYXR0ZW1wdCB0byByZXNvbHZlIHRoZSB0eXBlLCBzbyBpdCB3aWxsIG5vdCBrbm93IHdoYXQgdHlwZSB0aGUgZXh0ZW5zaW9uIGlzCisvLyBleHRlbmRpbmcuICBUaGVyZWZvcmUsIGNhbGxpbmcgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgd2l0aCB0aGUKKy8vIGV4dGVuc2lvbidzIGNvbnRhaW5pbmcgdHlwZSB3aWxsIG5ldmVyIGFjdHVhbGx5IGZpbmQgdGhhdCBleHRlbnNpb24uICBOb3RlCisvLyB0aGF0IHRoaXMgaXMgYW4gdW5saWtlbHkgcHJvYmxlbSwgYXMgYWxsIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGNyZWF0ZWQgYnkgdGhlCisvLyBwcm90b2NvbCBjb21waWxlciAoYXMgd2VsbCBhcyBvbmVzIGNyZWF0ZWQgYnkgY2FsbGluZworLy8gRmlsZURlc2NyaXB0b3I6OkNvcHlUbygpKSB3aWxsIGFsd2F5cyB1c2UgZnVsbHktcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwKKy8vIHR5cGVzLiAgWW91IG9ubHkgbmVlZCB0byB3b3JyeSBpZiB5b3UgYXJlIGNvbnN0cnVjdGluZyBGaWxlRGVzY3JpcHRvclByb3RvcworLy8geW91cnNlbGYsIG9yIGFyZSBjYWxsaW5nIGNvbXBpbGVyOjpQYXJzZXIgZGlyZWN0bHkuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgcHVibGljOgorICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoKTsKKyAgflNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSgpOworCisgIC8vIEFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIGRhdGFiYXNlLCBtYWtpbmcgYSBjb3B5LiAgVGhlIG9iamVjdAorICAvLyBjYW4gYmUgZGVsZXRlZCBhZnRlciBBZGQoKSByZXR1cm5zLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb25mbGljdGVkCisgIC8vIHdpdGggYSBmaWxlIGFscmVhZHkgaW4gdGhlIGRhdGFiYXNlLCBpbiB3aGljaCBjYXNlIGFuIGVycm9yIHdpbGwgaGF2ZQorICAvLyBiZWVuIHdyaXR0ZW4gdG8gR09PR0xFX0xPRyhFUlJPUikuCisgIGJvb2wgQWRkKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpOworCisgIC8vIEFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIGRhdGFiYXNlIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgaXQuCisgIGJvb2wgQWRkQW5kT3duKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUpOworCisgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGludD4qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICAvLyBTbyB0aGF0IGl0IGNhbiB1c2UgRGVzY3JpcHRvckluZGV4LgorICBmcmllbmQgY2xhc3MgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTsKKworICAvLyBBbiBpbmRleCBtYXBwaW5nIGZpbGUgbmFtZXMsIHN5bWJvbCBuYW1lcywgYW5kIGV4dGVuc2lvbiBudW1iZXJzIHRvCisgIC8vIHNvbWUgc29ydCBvZiB2YWx1ZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KKyAgY2xhc3MgRGVzY3JpcHRvckluZGV4IHsKKyAgIHB1YmxpYzoKKyAgICAvLyBIZWxwZXJzIHRvIHJlY3Vyc2l2ZWx5IGFkZCBwYXJ0aWN1bGFyIGRlc2NyaXB0b3JzIGFuZCBhbGwgdGhlaXIgY29udGVudHMKKyAgICAvLyB0byB0aGUgaW5kZXguCisgICAgYm9vbCBBZGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUsCisgICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlKTsKKyAgICBib29sIEFkZFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUsIFZhbHVlIHZhbHVlKTsKKyAgICBib29sIEFkZE5lc3RlZEV4dGVuc2lvbnMoY29uc3QgRGVzY3JpcHRvclByb3RvJiBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlKTsKKyAgICBib29sIEFkZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgdmFsdWUpOworCisgICAgVmFsdWUgRmluZEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisgICAgVmFsdWUgRmluZFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUpOworICAgIFZhbHVlIEZpbmRFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIpOworICAgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50Piogb3V0cHV0KTsKKworICAgcHJpdmF0ZToKKyAgICBtYXA8c3RyaW5nLCBWYWx1ZT4gYnlfbmFtZV87CisgICAgbWFwPHN0cmluZywgVmFsdWU+IGJ5X3N5bWJvbF87CisgICAgbWFwPHBhaXI8c3RyaW5nLCBpbnQ+LCBWYWx1ZT4gYnlfZXh0ZW5zaW9uXzsKKworICAgIC8vIEludmFyaWFudDogIFRoZSBieV9zeW1ib2xfIG1hcCBkb2VzIG5vdCBjb250YWluIGFueSBzeW1ib2xzIHdoaWNoIGFyZQorICAgIC8vIHByZWZpeGVzIG9mIG90aGVyIHN5bWJvbHMgaW4gdGhlIG1hcC4gIEZvciBleGFtcGxlLCAiZm9vLmJhciIgaXMgYQorICAgIC8vIHByZWZpeCBvZiAiZm9vLmJhci5iYXoiIChidXQgaXMgbm90IGEgcHJlZml4IG9mICJmb28uYmFyYmF6IikuCisgICAgLy8KKyAgICAvLyBUaGlzIGludmFyaWFudCBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBtZWFucyB0aGF0IGdpdmVuIGEgc3ltYm9sIG5hbWUsCisgICAgLy8gd2UgY2FuIGZpbmQgYSBrZXkgaW4gdGhlIG1hcCB3aGljaCBpcyBhIHByZWZpeCBvZiB0aGUgc3ltYm9sIGluIE8obGcgbikKKyAgICAvLyB0aW1lLCBhbmQgd2Uga25vdyB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIHN1Y2gga2V5LgorICAgIC8vCisgICAgLy8gVGhlIHByZWZpeCBsb29rdXAgYWxnb3JpdGhtIHdvcmtzIGxpa2Ugc286CisgICAgLy8gMSkgRmluZCB0aGUgbGFzdCBrZXkgaW4gdGhlIG1hcCB3aGljaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICAgLy8gICAgc2VhcmNoIGtleS4KKyAgICAvLyAyKSBJZiB0aGUgZm91bmQga2V5IGlzIGEgcHJlZml4IG9mIHRoZSBzZWFyY2gga2V5LCB0aGVuIHJldHVybiBpdC4KKyAgICAvLyAgICBPdGhlcndpc2UsIHRoZXJlIGlzIG5vIG1hdGNoLgorICAgIC8vCisgICAgLy8gSSBhbSBzdXJlIHRoaXMgYWxnb3JpdGhtIGhhcyBiZWVuIGRlc2NyaWJlZCBlbHNld2hlcmUsIGJ1dCBzaW5jZSBJCisgICAgLy8gd2Fzbid0IGFibGUgdG8gZmluZCBpdCBxdWlja2x5IEkgd2lsbCBpbnN0ZWFkIHByb3ZlIHRoYXQgaXQgd29ya3MKKyAgICAvLyBteXNlbGYuICBUaGUga2V5IHRvIHRoZSBhbGdvcml0aG0gaXMgdGhhdCBpZiBhIG1hdGNoIGV4aXN0cywgc3RlcCAoMSkKKyAgICAvLyB3aWxsIGZpbmQgaXQuICBQcm9vZjoKKyAgICAvLyAxKSBEZWZpbmUgdGhlICJzZWFyY2gga2V5IiB0byBiZSB0aGUga2V5IHdlIGFyZSBsb29raW5nIGZvciwgdGhlICJmb3VuZAorICAgIC8vICAgIGtleSIgdG8gYmUgdGhlIGtleSBmb3VuZCBpbiBzdGVwICgxKSwgYW5kIHRoZSAibWF0Y2gga2V5IiB0byBiZSB0aGUKKyAgICAvLyAgICBrZXkgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGUgc2VyYWNoIGtleSAoaS5lLiB0aGUga2V5IHdlJ3JlIHRyeWluZworICAgIC8vICAgIHRvIGZpbmQpLgorICAgIC8vIDIpIFRoZSBmb3VuZCBrZXkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkgYnkKKyAgICAvLyAgICBkZWZpbml0aW9uLgorICAgIC8vIDMpIFRoZSBtYXRjaCBrZXkgbXVzdCBhbHNvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VhcmNoIGtleQorICAgIC8vICAgIChiZWNhdXNlIGl0IGlzIGEgcHJlZml4KS4KKyAgICAvLyA0KSBUaGUgbWF0Y2gga2V5IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIGZvdW5kIGtleSwgYmVjYXVzZSBpZiBpdAorICAgIC8vICAgIHdlcmUsIHRoZW4gc3RlcCAoMSkgb2YgdGhlIGFsZ29yaXRobSB3b3VsZCBoYXZlIHJldHVybmVkIHRoZSBtYXRjaAorICAgIC8vICAgIGtleSBpbnN0ZWFkIChzaW5jZSBpdCBmaW5kcyB0aGUgKmdyZWF0ZXN0KiBrZXkgd2hpY2ggaXMgbGVzcyB0aGFuIG9yCisgICAgLy8gICAgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkpLgorICAgIC8vIDUpIFRoZXJlZm9yZSwgdGhlIGZvdW5kIGtleSBtdXN0IGJlIGJldHdlZW4gdGhlIG1hdGNoIGtleSBhbmQgdGhlIHNlYXJjaAorICAgIC8vICAgIGtleSwgaW5jbHVzaXZlLgorICAgIC8vIDYpIFNpbmNlIHRoZSBzZWFyY2gga2V5IG11c3QgYmUgYSBzdWItc3ltYm9sIG9mIHRoZSBtYXRjaCBrZXksIGlmIGl0IGlzCisgICAgLy8gICAgbm90IGVxdWFsIHRvIHRoZSBtYXRjaCBrZXksIHRoZW4gc2VhcmNoX2tleVttYXRjaF9rZXkuc2l6ZSgpXSBtdXN0CisgICAgLy8gICAgYmUgJy4nLgorICAgIC8vIDcpIFNpbmNlICcuJyBzb3J0cyBiZWZvcmUgYW55IG90aGVyIGNoYXJhY3RlciB0aGF0IGlzIHZhbGlkIGluIGEgc3ltYm9sCisgICAgLy8gICAgbmFtZSwgdGhlbiBpZiB0aGUgZm91bmQga2V5IGlzIG5vdCBlcXVhbCB0byB0aGUgbWF0Y2gga2V5LCB0aGVuCisgICAgLy8gICAgZm91bmRfa2V5W21hdGNoX2tleS5zaXplKCldIG11c3QgYWxzbyBiZSAnLicsIGJlY2F1c2UgYW55IG90aGVyIHZhbHVlCisgICAgLy8gICAgd291bGQgbWFrZSBpdCBzb3J0IGFmdGVyIHRoZSBzZWFyY2gga2V5LgorICAgIC8vIDgpIFRoZXJlZm9yZSwgaWYgdGhlIGZvdW5kIGtleSBpcyBub3QgZXF1YWwgdG8gdGhlIG1hdGNoIGtleSwgdGhlbiB0aGUKKyAgICAvLyAgICBmb3VuZCBrZXkgbXVzdCBiZSBhIHN1Yi1zeW1ib2wgb2YgdGhlIG1hdGNoIGtleS4gIEhvd2V2ZXIsIHRoaXMgd291bGQKKyAgICAvLyAgICBjb250cmFkaWN0IG91ciBtYXAgaW52YXJpYW50IHdoaWNoIHNheXMgdGhhdCBubyBzeW1ib2wgaW4gdGhlIG1hcCBpcworICAgIC8vICAgIGEgc3ViLXN5bWJvbCBvZiBhbnkgb3RoZXIuCisgICAgLy8gOSkgVGhlcmVmb3JlLCB0aGUgZm91bmQga2V5IG11c3QgbWF0Y2ggdGhlIG1hdGNoIGtleS4KKyAgICAvLworICAgIC8vIFRoZSBhYm92ZSBwcm9vZiBhc3N1bWVzIHRoZSBtYXRjaCBrZXkgZXhpc3RzLiAgSW4gdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAvLyBtYXRjaCBrZXkgZG9lcyBub3QgZXhpc3QsIHRoZW4gc3RlcCAoMSkgd2lsbCByZXR1cm4gc29tZSBvdGhlciBzeW1ib2wuCisgICAgLy8gVGhhdCBzeW1ib2wgY2Fubm90IGJlIGEgc3VwZXItc3ltYm9sIG9mIHRoZSBzZWFyY2gga2V5IHNpbmNlIGlmIGl0IHdlcmUsCisgICAgLy8gdGhlbiBpdCB3b3VsZCBiZSBhIG1hdGNoLCBhbmQgd2UncmUgYXNzdW1pbmcgdGhlIG1hdGNoIGtleSBkb2Vzbid0IGV4aXN0LgorICAgIC8vIFRoZXJlZm9yZSwgc3RlcCAyIHdpbGwgY29ycmVjdGx5IHJldHVybiBubyBtYXRjaC4KKworICAgIC8vIEZpbmQgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGJ5X3N5bWJvbF8gbWFwIHdob3NlIGtleSBpcyBsZXNzIHRoYW4gb3IKKyAgICAvLyBlcXVhbCB0byB0aGUgZ2l2ZW4gbmFtZS4KKyAgICB0eXBlbmFtZSBtYXA8c3RyaW5nLCBWYWx1ZT46Oml0ZXJhdG9yIEZpbmRMYXN0TGVzc09yRXF1YWwoCisgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgICAvLyBUcnVlIGlmIGVpdGhlciB0aGUgYXJndW1lbnRzIGFyZSBlcXVhbCBvciBzdXBlcl9zeW1ib2wgaWRlbnRpZmllcyBhCisgICAgLy8gcGFyZW50IHN5bWJvbCBvZiBzdWJfc3ltYm9sIChlLmcuICJmb28uYmFyIiBpcyBhIHBhcmVudCBvZgorICAgIC8vICJmb28uYmFyLmJheiIsIGJ1dCBub3QgYSBwYXJlbnQgb2YgImZvby5iYXJiYXoiKS4KKyAgICBib29sIElzU3ViU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ViX3N5bWJvbCwgY29uc3Qgc3RyaW5nJiBzdXBlcl9zeW1ib2wpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBuYW1lIGFyZSBhbHBoYW51bWVyaWNzLAorICAgIC8vIHVuZGVyc2NvcmVzLCBvciBwZXJpb2RzLgorICAgIGJvb2wgVmFsaWRhdGVTeW1ib2xOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7CisgIH07CisKKworICBEZXNjcmlwdG9ySW5kZXg8Y29uc3QgRmlsZURlc2NyaXB0b3JQcm90byo+IGluZGV4XzsKKyAgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qPiBmaWxlc190b19kZWxldGVfOworCisgIC8vIElmIGZpbGUgaXMgbm9uLU5VTEwsIGNvcHkgaXQgaW50byAqb3V0cHV0IGFuZCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlCisgIC8vIHJldHVybiBmYWxzZS4KKyAgYm9vbCBNYXliZUNvcHkoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKTsKK307CisKKy8vIFZlcnkgc2ltaWxhciB0byBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UsIGJ1dCBzdG9yZXMgYWxsIHRoZSBkZXNjcmlwdG9ycworLy8gYXMgcmF3IGJ5dGVzIGFuZCBnZW5lcmFsbHkgdHJpZXMgdG8gdXNlIGFzIGxpdHRsZSBtZW1vcnkgYXMgcG9zc2libGUuCisvLworLy8gVGhlIHNhbWUgY2F2ZWF0cyByZWdhcmRpbmcgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgYXBwbHkgYXMgd2l0aAorLy8gU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyBwdWJsaWM6CisgIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKKyAgfkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKKworICAvLyBBZGRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBkYXRhYmFzZS4gIFRoZSBkZXNjcmlwdG9yIGlzIHByb3ZpZGVkCisgIC8vIGluIGVuY29kZWQgZm9ybS4gIFRoZSBkYXRhYmFzZSBkb2VzIG5vdCBtYWtlIGEgY29weSBvZiB0aGUgYnl0ZXMsIG5vcgorICAvLyBkb2VzIGl0IHRha2Ugb3duZXJzaGlwOyBpdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHRoZSBieXRlcworICAvLyByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBkYXRhYmFzZS4gIFJldHVybnMgZmFsc2UgYW5kIGxvZ3MgYW4gZXJyb3IKKyAgLy8gaWYgdGhlIGJ5dGVzIGFyZSBub3QgYSB2YWxpZCBGaWxlRGVzY3JpcHRvclByb3RvIG9yIGlmIHRoZSBmaWxlIGNvbmZsaWN0ZWQKKyAgLy8gd2l0aCBhIGZpbGUgYWxyZWFkeSBpbiB0aGUgZGF0YWJhc2UuCisgIGJvb2wgQWRkKGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBpbnQgc2l6ZSk7CisKKyAgLy8gTGlrZSBBZGQoKSwgYnV0IG1ha2VzIGEgY29weSBvZiB0aGUgZGF0YSwgc28gdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CisgIC8vIG5lZWQgdG8ga2VlcCBpdCBhcm91bmQuCisgIGJvb2wgQWRkQ29weShjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpOworCisgIC8vIExpa2UgRmluZEZpbGVDb250YWluaW5nU3ltYm9sIGJ1dCByZXR1cm5zIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgIGJvb2wgRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KTsKKworICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpOworCisgcHJpdmF0ZToKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8cGFpcjxjb25zdCB2b2lkKiwgaW50PiA+IGluZGV4XzsKKyAgdmVjdG9yPHZvaWQqPiBmaWxlc190b19kZWxldGVfOworCisgIC8vIElmIGVuY29kZWRfZmlsZS5maXJzdCBpcyBub24tTlVMTCwgcGFyc2UgdGhlIGRhdGEgaW50byAqb3V0cHV0IGFuZCByZXR1cm4KKyAgLy8gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCBNYXliZVBhcnNlKHBhaXI8Y29uc3Qgdm9pZCosIGludD4gZW5jb2RlZF9maWxlLAorICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSk7Cit9OworCisvLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB0aGF0IGZldGNoZXMgZmlsZXMgZnJvbSBhIGdpdmVuIHBvb2wuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclBvb2xEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvclBvb2xEYXRhYmFzZShjb25zdCBEZXNjcmlwdG9yUG9vbCYgcG9vbCk7CisgIH5EZXNjcmlwdG9yUG9vbERhdGFiYXNlKCk7CisKKyAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworICBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50Piogb3V0cHV0KTsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3JQb29sJiBwb29sXzsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyaXB0b3JQb29sRGF0YWJhc2UpOworfTsKKworLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2UgdGhhdCB3cmFwcyB0d28gb3IgbW9yZSBvdGhlcnMuICBJdCBmaXJzdCBzZWFyY2hlcyB0aGUKKy8vIGZpcnN0IGRhdGFiYXNlIGFuZCwgaWYgdGhhdCBmYWlscywgdHJpZXMgdGhlIHNlY29uZCwgYW5kIHNvIG9uLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgLy8gTWVyZ2UganVzdCB0d28gZGF0YWJhc2VzLiAgVGhlIHNvdXJjZXMgcmVtYWluIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIuCisgIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZShEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTIpOworICAvLyBNZXJnZSBtb3JlIHRoYW4gdHdvIGRhdGFiYXNlcy4gIFRoZSBzb3VyY2VzIHJlbWFpbiBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyLgorICAvLyBUaGUgdmVjdG9yIG1heSBiZSBkZWxldGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIGJ1dCB0aGUKKyAgLy8gRGVzY3JpcHRvckRhdGFiYXNlcyBuZWVkIHRvIHN0aWNrIGFyb3VuZC4KKyAgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKGNvbnN0IHZlY3RvcjxEZXNjcmlwdG9yRGF0YWJhc2UqPiYgc291cmNlcyk7CisgIH5NZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKKworICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIC8vIE1lcmdlcyB0aGUgcmVzdWx0cyBvZiBjYWxsaW5nIGFsbCBkYXRhYmFzZXMuIFJldHVybnMgdHJ1ZSBpZmYgYW55CisgIC8vIG9mIHRoZSBkYXRhYmFzZXMgcmV0dXJuZWQgdHJ1ZS4KKyAgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGludD4qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICB2ZWN0b3I8RGVzY3JpcHRvckRhdGFiYXNlKj4gc291cmNlc187CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfREFUQUJBU0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNzJkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDc0OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgUkZDIDMwOTIuICA6KQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworc3RhdGljIHZvaWQgQWRkVG9EYXRhYmFzZShTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3RleHQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOworICBkYXRhYmFzZS0+QWRkKGZpbGVfcHJvdG8pOworfQorCitzdGF0aWMgdm9pZCBFeHBlY3RDb250YWluc1R5cGUoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAocHJvdG8ubWVzc2FnZV90eXBlKGkpLm5hbWUoKSA9PSB0eXBlX25hbWUpIHJldHVybjsKKyAgfQorICBBRERfRkFJTFVSRSgpIDw8ICJcIiIgPDwgcHJvdG8ubmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIlwiIGRpZCBub3QgY29udGFpbiBleHBlY3RlZCB0eXBlIFwiIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSA8PCAiXCIuIjsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlLCBhbmQKKy8vIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgY2FsbCBmb3IgdmVyeSBzaW1pbGFyIHRlc3RzLiAgSW5zdGVhZCBvZiB3cml0aW5nCisvLyB0aHJlZSBuZWFybHktaWRlbnRpY2FsIHNldHMgb2YgdGVzdHMsIHdlIHVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzIHRvIGFwcGx5CisvLyB0aGUgc2FtZSBjb2RlIHRvIGFsbCB0aHJlZS4KKworLy8gVGhlIHBhcmFtZXRlcml6ZWQgdGVzdCBydW5zIGFnYWluc3QgYSBEZXNjcmlwdGFyRGF0YWJhc2VUZXN0Q2FzZS4gIFdlIGhhdmUKKy8vIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgY2xhc3NlcyB3ZSB3YW50IHRvIHRlc3QuCitjbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5EZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9CisKKyAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgQWRkVG9EYXRhYmFzZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSA9IDA7Cit9OworCisvLyBGYWN0b3J5IGZ1bmN0aW9uIHR5cGUuCit0eXBlZGVmIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlKiBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZUZhY3RvcnkoKTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZS4KK2NsYXNzIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogTmV3KCkgeworICAgIHJldHVybiBuZXcgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U7CisgIH0KKworICB2aXJ0dWFsIH5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9CisKKyAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgeworICAgIHJldHVybiAmZGF0YWJhc2VfOworICB9CisgIHZpcnR1YWwgYm9vbCBBZGRUb0RhdGFiYXNlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpIHsKKyAgICByZXR1cm4gZGF0YWJhc2VfLkFkZChmaWxlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKK307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlLgorY2xhc3MgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogTmV3KCkgeworICAgIHJldHVybiBuZXcgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlOworICB9CisKKyAgdmlydHVhbCB+RW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlKCkge30KKworICB2aXJ0dWFsIERlc2NyaXB0b3JEYXRhYmFzZSogR2V0RGF0YWJhc2UoKSB7CisgICAgcmV0dXJuICZkYXRhYmFzZV87CisgIH0KKyAgdmlydHVhbCBib29sIEFkZFRvRGF0YWJhc2UoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZSkgeworICAgIHN0cmluZyBkYXRhOworICAgIGZpbGUuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICAgIHJldHVybiBkYXRhYmFzZV8uQWRkQ29weShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICB9CisKKyBwcml2YXRlOgorICBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKK307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBEZXNjcmlwdG9yUG9vbERhdGFiYXNlLgorY2xhc3MgRGVzY3JpcHRvclBvb2xEYXRhYmFzZVRlc3RDYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogTmV3KCkgeworICAgIHJldHVybiBuZXcgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlOworICB9CisKKyAgRGVzY3JpcHRvclBvb2xEYXRhYmFzZVRlc3RDYXNlKCkgOiBkYXRhYmFzZV8ocG9vbF8pIHt9CisgIHZpcnR1YWwgfkRlc2NyaXB0b3JQb29sRGF0YWJhc2VUZXN0Q2FzZSgpIHt9CisKKyAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgeworICAgIHJldHVybiAmZGF0YWJhc2VfOworICB9CisgIHZpcnR1YWwgYm9vbCBBZGRUb0RhdGFiYXNlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpIHsKKyAgICByZXR1cm4gcG9vbF8uQnVpbGRGaWxlKGZpbGUpOworICB9CisKKyBwcml2YXRlOgorICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKKyAgRGVzY3JpcHRvclBvb2xEYXRhYmFzZSBkYXRhYmFzZV87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERlc2NyaXB0b3JEYXRhYmFzZVRlc3QKKyAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlRmFjdG9yeSo+IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICB0ZXN0X2Nhc2VfLnJlc2V0KEdldFBhcmFtKCkoKSk7CisgICAgZGF0YWJhc2VfID0gdGVzdF9jYXNlXy0+R2V0RGF0YWJhc2UoKTsKKyAgfQorCisgIHZvaWQgQWRkVG9EYXRhYmFzZShjb25zdCBjaGFyKiBmaWxlX2Rlc2NyaXB0b3JfdGV4dCkgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV9kZXNjcmlwdG9yX3RleHQsICZmaWxlX3Byb3RvKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9jYXNlXy0+QWRkVG9EYXRhYmFzZShmaWxlX3Byb3RvKSk7CisgIH0KKworICB2b2lkIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoY29uc3QgY2hhciogZmlsZV9kZXNjcmlwdG9yX3RleHQpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKGZpbGVfZGVzY3JpcHRvcl90ZXh0LCAmZmlsZV9wcm90bykpOworICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2VfLT5BZGRUb0RhdGFiYXNlKGZpbGVfcHJvdG8pKTsKKyAgfQorCisgIHNjb3BlZF9wdHI8RGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U+IHRlc3RfY2FzZV87CisgIERlc2NyaXB0b3JEYXRhYmFzZSogZGF0YWJhc2VfOworfTsKKworVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQnlOYW1lKSB7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiRm9vXCIgfSIpOworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhclwiIH0iKTsKKworICB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUoImZvby5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkJhciIpOworICB9CisKKyAgeworICAgIC8vIEZhaWxzIHRvIGZpbmQgdW5kZWZpbmVkIGZpbGVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIiwgJmZpbGUpKTsKKyAgfQorfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKSB7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgIiAgZmllbGQgeyBuYW1lOlwicXV4XCIgfSIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiR3JhdWx0XCIgfSAiCisgICAgIiAgZW51bV90eXBlIHsgbmFtZTogXCJHYXJwbHlcIiB9ICIKKyAgICAifSAiCisgICAgImVudW1fdHlwZSB7ICIKKyAgICAiICBuYW1lOiBcIldhbGRvXCIgIgorICAgICIgIHZhbHVlIHsgbmFtZTpcIkZSRURcIiB9ICIKKyAgICAifSAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwicGx1Z2hcIiB9ICIKKyAgICAic2VydmljZSB7ICIKKyAgICAiICBuYW1lOiBcIlh5enp5XCIgIgorICAgICIgIG1ldGhvZCB7IG5hbWU6IFwiVGh1ZFwiIH0gIgorICAgICJ9IgorICAgICk7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcImNvcmdlXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKKworICB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28iLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIGZpZWxkcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5xdXgiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIG5lc3RlZCB0eXBlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5HcmF1bHQiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIG5lc3RlZCBlbnVtcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5HYXJwbHkiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIGVudW0gdHlwZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJXYWxkbyIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgZW51bSB2YWx1ZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJXYWxkby5GUkVEIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBleHRlbnNpb25zLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgicGx1Z2giLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIHNlcnZpY2VzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiWHl6enkiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIG1ldGhvZHMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJYeXp6eS5UaHVkIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCB0aGluZ3MgaW4gcGFja2FnZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJjb3JnZS5CYXIiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIEZhaWxzIHRvIGZpbmQgdW5kZWZpbmVkIHN5bWJvbHMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiQmF6IiwgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBOYW1lcyBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJCYXIiLCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24pIHsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAiICBuYW1lOiBcIkZvb1wiICIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCisgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcInF1eFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6NSAiCisgICAgIiAgICAgICAgICAgICAgZXh0ZW5kZWU6IFwiLkZvb1wiIH0iCisgICAgIn0iKTsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwiY29yZ2VcIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJCYXJcIiAiCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0gIgorICAgICJ9ICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImdyYXVsdFwiIGV4dGVuZGVlOiBcIi5Gb29cIiAgICAgICBudW1iZXI6MzIgfSAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJnYXJwbHlcIiBleHRlbmRlZTogXCIuY29yZ2UuQmFyXCIgbnVtYmVyOjcwIH0gIgorICAgICJleHRlbnNpb24geyBuYW1lOlwid2FsZG9cIiAgZXh0ZW5kZWU6IFwiQmFyXCIgICAgICAgIG51bWJlcjo1NiB9ICIpOworCisgIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkZvbyIsIDUsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCAzMiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBleHRlbnNpb25zIGZvciBxdWFsaWZpZWQgdHlwZSBuYW1lcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oImNvcmdlLkJhciIsIDcwLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyB3aG9zZSBleHRlbmRlZSB3YXMgbm90IGZ1bGx5LXF1YWxpZmllZCBpbiB0aGUKKyAgICAvLyBGaWxlRGVzY3JpcHRvclByb3RvLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJhciIsIDU2LCAmZmlsZSkpOworICAgIEVYUEVDVF9GQUxTRSgKKyAgICAgICAgZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oImNvcmdlLkJhciIsIDU2LCAmZmlsZSkpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgbm9uLWV4aXN0ZW50IGV4dGVuc2lvbiBudW1iZXJzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkZvbyIsIDEyLCAmZmlsZSkpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyBmb3Igbm9uLWV4aXN0ZW50IHR5cGVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoCisgICAgICAgIGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJOb1N1Y2hUeXBlIiwgNSwgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIHVucXVhbGlmaWVkIHR5cGUgbmFtZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiQmFyIiwgNzAsICZmaWxlKSk7CisgIH0KK30KKworVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKSB7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0gIgorICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJxdXhcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjUgIgorICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIi5Gb29cIiB9IgorICAgICJ9Iik7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcImNvcmdlXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiQmFyXCIgIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwMCB9ICIKKyAgICAifSAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJncmF1bHRcIiBleHRlbmRlZTogXCIuRm9vXCIgICAgICAgbnVtYmVyOjMyIH0gIgorICAgICJleHRlbnNpb24geyBuYW1lOlwiZ2FycGx5XCIgZXh0ZW5kZWU6IFwiLmNvcmdlLkJhclwiIG51bWJlcjo3MCB9ICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcIndhbGRvXCIgIGV4dGVuZGVlOiBcIkJhclwiICAgICAgICBudW1iZXI6NTYgfSAiKTsKKworICB7CisgICAgdmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJGb28iLCAmbnVtYmVycykpOworICAgIEFTU0VSVF9FUSgyLCBudW1iZXJzLnNpemUoKSk7CisgICAgc29ydChudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCkpOworICAgIEVYUEVDVF9FUSg1LCBudW1iZXJzWzBdKTsKKyAgICBFWFBFQ1RfRVEoMzIsIG51bWJlcnNbMV0pOworICB9CisKKyAgeworICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiY29yZ2UuQmFyIiwgJm51bWJlcnMpKTsKKyAgICAvLyBOb3RlOiB3b24ndCBmaW5kIGV4dGVuc2lvbiA1NiBkdWUgdG8gdGhlIG5hbWUgbm90IGJlaW5nIGZ1bGx5IHF1YWxpZmllZC4KKyAgICBBU1NFUlRfRVEoMSwgbnVtYmVycy5zaXplKCkpOworICAgIEVYUEVDVF9FUSg3MCwgbnVtYmVyc1swXSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBleHRlbnNpb25zIGZvciBub24tZXhpc3RlbnQgdHlwZXMuCisgICAgdmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiTm9TdWNoVHlwZSIsICZudW1iZXJzKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBleHRlbnNpb25zIGZvciB1bnF1YWxpZmllZCB0eXBlcy4KKyAgICB2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJCYXIiLCAmbnVtYmVycykpOworICB9Cit9CisKK1RFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBDb25mbGljdGluZ0ZpbGVFcnJvcikgeworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICJ9Iik7CisgIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJCYXJcIiAiCisgICAgIn0iKTsKK30KKworVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIENvbmZsaWN0aW5nVHlwZUVycm9yKSB7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgIn0iKTsKKyAgQWRkVG9EYXRhYmFzZVdpdGhFcnJvcigKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAiICBuYW1lOiBcIkZvb1wiICIKKyAgICAifSIpOworfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgQ29uZmxpY3RpbmdFeHRlbnNpb25FcnJvcikgeworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6NSAiCisgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcIi5Gb29cIiB9Iik7CisgIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjo1ICIKKyAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiLkZvb1wiIH0iKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2ltcGxlLCBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LAorICAgIHRlc3Rpbmc6OlZhbHVlcygmU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U6Ok5ldykpOworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVtb3J5Q29uc2VydmluZywgRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwKKyAgICB0ZXN0aW5nOjpWYWx1ZXMoJkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZTo6TmV3KSk7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQb29sLCBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LAorICAgIHRlc3Rpbmc6OlZhbHVlcygmRGVzY3JpcHRvclBvb2xEYXRhYmFzZVRlc3RDYXNlOjpOZXcpKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCitURVNUKEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VFeHRyYVRlc3QsIEZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCkgeworICAvLyBDcmVhdGUgdHdvIGZpbGVzLCBvbmUgb2Ygd2hpY2ggaXMgaW4gdHdvIHBhcnRzLgorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGUxLCBmaWxlMmEsIGZpbGUyYjsKKyAgZmlsZTEuc2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlMS5zZXRfcGFja2FnZSgiZm9vIik7CisgIGZpbGUxLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworICBmaWxlMmEuc2V0X25hbWUoImJhci5wcm90byIpOworICBmaWxlMmIuc2V0X3BhY2thZ2UoImJhciIpOworICBmaWxlMmIuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiQmFyIik7CisKKyAgLy8gTm9ybWFsIHNlcmlhbGl6YXRpb24gYWxsb3dzIG91ciBvcHRpbWl6YXRpb24gdG8ga2ljayBpbi4KKyAgc3RyaW5nIGRhdGExID0gZmlsZTEuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICAvLyBGb3JjZSBvdXQtb2Ytb3JkZXIgc2VyaWFsaXphdGlvbiB0byB0ZXN0IHNsb3cgcGF0aC4KKyAgc3RyaW5nIGRhdGEyID0gZmlsZTJiLlNlcmlhbGl6ZUFzU3RyaW5nKCkgKyBmaWxlMmEuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICAvLyBDcmVhdGUgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSBjb250YWluaW5nIGJvdGggZmlsZXMuCisgIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UgZGI7CisgIGRiLkFkZChkYXRhMS5kYXRhKCksIGRhdGExLnNpemUoKSk7CisgIGRiLkFkZChkYXRhMi5kYXRhKCksIGRhdGEyLnNpemUoKSk7CisKKyAgLy8gVGVzdCEKKyAgc3RyaW5nIGZpbGVuYW1lOworICBFWFBFQ1RfVFJVRShkYi5GaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woImZvby5Gb28iLCAmZmlsZW5hbWUpKTsKKyAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlbmFtZSk7CisgIEVYUEVDVF9UUlVFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiZm9vLkZvby5CbGFoIiwgJmZpbGVuYW1lKSk7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZW5hbWUpOworICBFWFBFQ1RfVFJVRShkYi5GaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woImJhci5CYXIiLCAmZmlsZW5hbWUpKTsKKyAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlbmFtZSk7CisgIEVYUEVDVF9GQUxTRShkYi5GaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woImZvbyIsICZmaWxlbmFtZSkpOworICBFWFBFQ1RfRkFMU0UoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJiYXIiLCAmZmlsZW5hbWUpKTsKKyAgRVhQRUNUX0ZBTFNFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiYmF6LkJheiIsICZmaWxlbmFtZSkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0KCkKKyAgICA6IGZvcndhcmRfbWVyZ2VkXygmZGF0YWJhc2UxXywgJmRhdGFiYXNlMl8pLAorICAgICAgcmV2ZXJzZV9tZXJnZWRfKCZkYXRhYmFzZTJfLCAmZGF0YWJhc2UxXykge30KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2UxXywKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiRm9vXCIgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAgfSB9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOlwiZm9vX2V4dFwiIGV4dGVuZGVlOiBcIi5Gb29cIiBudW1iZXI6MyAiCisgICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIik7CisgICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2UyXywKKyAgICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiQmFyXCIgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAgfSB9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOlwiYmFyX2V4dFwiIGV4dGVuZGVlOiBcIi5CYXJcIiBudW1iZXI6NSAiCisgICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIik7CisKKyAgICAvLyBiYXoucHJvdG8gZXhpc3RzIGluIGJvdGggcG9vbHMsIHdpdGggZGlmZmVyZW50IGRlZmluaXRpb25zLgorICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlMV8sCisgICAgICAibmFtZTogXCJiYXoucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhelwiIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkZyb21Qb29sMVwiIH0gIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXpfZXh0XCIgZXh0ZW5kZWU6IFwiLkJhelwiIG51bWJlcjoxMiAiCisgICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJkYXRhYmFzZTFfb25seV9leHRcIiBleHRlbmRlZTogXCIuQmF6XCIgbnVtYmVyOjEzICIKKyAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKKyAgICBBZGRUb0RhdGFiYXNlKCZkYXRhYmFzZTJfLAorICAgICAgIm5hbWU6IFwiYmF6LnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJCYXpcIiBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMCB9IH0gIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJGcm9tUG9vbDJcIiB9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOlwiYmF6X2V4dFwiIGV4dGVuZGVlOiBcIi5CYXpcIiBudW1iZXI6MTIgIgorICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIpOworICB9CisKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlMV87CisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZTJfOworCisgIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSBmb3J3YXJkX21lcmdlZF87CisgIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSByZXZlcnNlX21lcmdlZF87Cit9OworCitURVNUX0YoTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEZpbGVCeU5hbWUpIHsKKyAgeworICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMV8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUJ5TmFtZSgiZm9vLnByb3RvIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZvbyIpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMl8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkJhciIpOworICB9CisKKyAgeworICAgIC8vIEluIGZvcndhcmRfbWVyZ2VkXywgZGF0YWJhc2UxXydzIGJhei5wcm90byB0YWtlcyBwcmVjZWRlbmNlLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoImJhei5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGcm9tUG9vbDEiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiByZXZlcnNlX21lcmdlZF8sIGRhdGFiYXNlMl8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUocmV2ZXJzZV9tZXJnZWRfLkZpbmRGaWxlQnlOYW1lKCJiYXoucHJvdG8iLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wyIik7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBub24tZXhpc3RlbnQgZmlsZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUJ5TmFtZSgibm9fc3VjaC5wcm90byIsICZmaWxlKSk7CisgIH0KK30KKworVEVTVF9GKE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCkgeworICB7CisgICAgLy8gQ2FuIGZpbmQgZmlsZSB0aGF0IGlzIG9ubHkgaW4gZGF0YWJhc2UxXy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZvbyIpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMl8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkJhciIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJCYXIiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiBmb3J3YXJkX21lcmdlZF8sIGRhdGFiYXNlMV8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiQmF6IiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMSIpOworICB9CisKKyAgeworICAgIC8vIEluIHJldmVyc2VfbWVyZ2VkXywgZGF0YWJhc2UyXydzIGJhei5wcm90byB0YWtlcyBwcmVjZWRlbmNlLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShyZXZlcnNlX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJCYXoiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wyIik7CisgIH0KKworICB7CisgICAgLy8gRnJvbVBvb2wxIG9ubHkgc2hvd3MgdXAgaW4gZm9yd2FyZF9tZXJnZWRfIGJlY2F1c2UgaXQgaXMgbWFza2VkIGJ5CisgICAgLy8gZGF0YWJhc2UyXydzIGJhei5wcm90byBpbiByZXZlcnNlX21lcmdlZF8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZyb21Qb29sMSIsICZmaWxlKSk7CisgICAgRVhQRUNUX0ZBTFNFKHJldmVyc2VfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZyb21Qb29sMSIsICZmaWxlKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBub24tZXhpc3RlbnQgc3ltYm9sLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoCisgICAgICBmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJOb1N1Y2hUeXBlIiwgJmZpbGUpKTsKKyAgfQorfQorCitURVNUX0YoTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKSB7CisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTFfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgIGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkZvbyIsIDMsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTJfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgIGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJhciIsIDUsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJCYXIiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiBmb3J3YXJkX21lcmdlZF8sIGRhdGFiYXNlMV8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICBmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXoiLCAxMiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMSIpOworICB9CisKKyAgeworICAgIC8vIEluIHJldmVyc2VfbWVyZ2VkXywgZGF0YWJhc2UyXydzIGJhei5wcm90byB0YWtlcyBwcmVjZWRlbmNlLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgIHJldmVyc2VfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJheiIsIDEyLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wyIik7CisgIH0KKworICB7CisgICAgLy8gQmF6J3MgZXh0ZW5zaW9uIDEzIG9ubHkgc2hvd3MgdXAgaW4gZm9yd2FyZF9tZXJnZWRfIGJlY2F1c2UgaXQgaXMKKyAgICAvLyBtYXNrZWQgYnkgZGF0YWJhc2UyXydzIGJhei5wcm90byBpbiByZXZlcnNlX21lcmdlZF8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJheiIsIDEzLCAmZmlsZSkpOworICAgIEVYUEVDVF9GQUxTRShyZXZlcnNlX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXoiLCAxMywgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIG5vbi1leGlzdGVudCBleHRlbnNpb24uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9GQUxTRSgKKyAgICAgIGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkZvbyIsIDYsICZmaWxlKSk7CisgIH0KK30KKworVEVTVF9GKE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKSB7CisgIHsKKyAgICAvLyBNZXNzYWdlIG9ubHkgaGFzIGV4dGVuc2lvbiBpbiBkYXRhYmFzZTFfCisgICAgdmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkZvbyIsICZudW1iZXJzKSk7CisgICAgQVNTRVJUX0VRKDEsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMywgbnVtYmVyc1swXSk7CisgIH0KKworICB7CisgICAgLy8gTWVzc2FnZSBvbmx5IGhhcyBleHRlbnNpb24gaW4gZGF0YWJhc2UyXworICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJCYXIiLCAmbnVtYmVycykpOworICAgIEFTU0VSVF9FUSgxLCBudW1iZXJzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDUsIG51bWJlcnNbMF0pOworICB9CisKKyAgeworICAgIC8vIE1lcmdlIHJlc3VsdHMgZnJvbSB0aGUgdHdvIGRhdGFiYXNlcy4KKyAgICB2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiQmF6IiwgJm51bWJlcnMpKTsKKyAgICBBU1NFUlRfRVEoMiwgbnVtYmVycy5zaXplKCkpOworICAgIHNvcnQobnVtYmVycy5iZWdpbigpLCBudW1iZXJzLmVuZCgpKTsKKyAgICBFWFBFQ1RfRVEoMTIsIG51bWJlcnNbMF0pOworICAgIEVYUEVDVF9FUSgxMywgbnVtYmVyc1sxXSk7CisgIH0KKworICB7CisgICAgdmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfVFJVRShyZXZlcnNlX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJheiIsICZudW1iZXJzKSk7CisgICAgQVNTRVJUX0VRKDIsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CisgICAgRVhQRUNUX0VRKDEyLCBudW1iZXJzWzBdKTsKKyAgICBFWFBFQ1RfRVEoMTMsIG51bWJlcnNbMV0pOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyBmb3IgYSBub24tZXhpc3RlbnQgbWVzc2FnZS4KKyAgICB2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9GQUxTRShyZXZlcnNlX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJsYWgiLCAmbnVtYmVycykpOworICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmU2YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0NjU2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiBSRkMgMzA5Mi4gIDopCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBDYW4ndCB1c2UgYW4gYW5vbnltb3VzIG5hbWVzcGFjZSBoZXJlIGR1ZSB0byBicm9rZW5uZXNzIG9mIFRydTY0IGNvbXBpbGVyLgorbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QgeworCisvLyBTb21lIGhlbHBlcnMgdG8gbWFrZSBhc3NlbWJsaW5nIGRlc2NyaXB0b3JzIGZhc3Rlci4KK0Rlc2NyaXB0b3JQcm90byogQWRkTWVzc2FnZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBmaWxlLT5hZGRfbWVzc2FnZV90eXBlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0Rlc2NyaXB0b3JQcm90byogQWRkTmVzdGVkTWVzc2FnZShEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfbmVzdGVkX3R5cGUoKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworRW51bURlc2NyaXB0b3JQcm90byogQWRkRW51bShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRW51bURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZmlsZS0+YWRkX2VudW1fdHlwZSgpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitFbnVtRGVzY3JpcHRvclByb3RvKiBBZGROZXN0ZWRFbnVtKERlc2NyaXB0b3JQcm90byogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRW51bURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfZW51bV90eXBlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEFkZFNlcnZpY2UoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IGZpbGUtPmFkZF9zZXJ2aWNlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBBZGRGaWVsZChEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsIGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUpIHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IHBhcmVudC0+YWRkX2ZpZWxkKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOworICByZXN1bHQtPnNldF9sYWJlbChsYWJlbCk7CisgIHJlc3VsdC0+c2V0X3R5cGUodHlwZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBBZGRFeHRlbnNpb24oRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWwgbGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUpIHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IGZpbGUtPmFkZF9leHRlbnNpb24oKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmVzdWx0LT5zZXRfbnVtYmVyKG51bWJlcik7CisgIHJlc3VsdC0+c2V0X2xhYmVsKGxhYmVsKTsKKyAgcmVzdWx0LT5zZXRfdHlwZSh0eXBlKTsKKyAgcmVzdWx0LT5zZXRfZXh0ZW5kZWUoZXh0ZW5kZWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitGaWVsZERlc2NyaXB0b3JQcm90byogQWRkTmVzdGVkRXh0ZW5zaW9uKERlc2NyaXB0b3JQcm90byogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdHlwZSkgeworICBGaWVsZERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOworICByZXN1bHQtPnNldF9sYWJlbChsYWJlbCk7CisgIHJlc3VsdC0+c2V0X3R5cGUodHlwZSk7CisgIHJlc3VsdC0+c2V0X2V4dGVuZGVlKGV4dGVuZGVlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogQWRkRXh0ZW5zaW9uUmFuZ2UoRGVzY3JpcHRvclByb3RvKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uX3JhbmdlKCk7CisgIHJlc3VsdC0+c2V0X3N0YXJ0KHN0YXJ0KTsKKyAgcmVzdWx0LT5zZXRfZW5kKGVuZCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90byogQWRkRW51bVZhbHVlKEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIpIHsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBlbnVtX3Byb3RvLT5hZGRfdmFsdWUoKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmVzdWx0LT5zZXRfbnVtYmVyKG51bWJlcik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK01ldGhvZERlc2NyaXB0b3JQcm90byogQWRkTWV0aG9kKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGlucHV0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG91dHB1dF90eXBlKSB7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gc2VydmljZS0+YWRkX21ldGhvZCgpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXN1bHQtPnNldF9pbnB1dF90eXBlKGlucHV0X3R5cGUpOworICByZXN1bHQtPnNldF9vdXRwdXRfdHlwZShvdXRwdXRfdHlwZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEVtcHR5IGVudW1zIHRlY2huaWNhbGx5IGFyZW4ndCBhbGxvd2VkLiAgV2UgbmVlZCB0byBpbnNlcnQgYSBkdW1teSB2YWx1ZQorLy8gaW50byB0aGVtLgordm9pZCBBZGRFbXB0eUVudW0oRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIEFkZEVudW1WYWx1ZShBZGRFbnVtKGZpbGUsIG5hbWUpLCBuYW1lICsgIl9EVU1NWSIsIDEpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3Qgc2ltcGxlIGZpbGVzLgorY2xhc3MgRmlsZURlc2NyaXB0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIEJ1aWxkIGRlc2NyaXB0b3JzIGZvciB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgorICAgIC8vCisgICAgLy8gICAvLyBpbiAiZm9vLnByb3RvIgorICAgIC8vICAgbWVzc2FnZSBGb29NZXNzYWdlIHsgZXh0ZW5zaW9ucyAxOyB9CisgICAgLy8gICBlbnVtIEZvb0VudW0ge0ZPT19FTlVNX1ZBTFVFID0gMTt9CisgICAgLy8gICBzZXJ2aWNlIEZvb1NlcnZpY2Uge30KKyAgICAvLyAgIGV4dGVuZCBGb29NZXNzYWdlIHsgb3B0aW9uYWwgaW50MzIgZm9vX2V4dGVuc2lvbiA9IDE7IH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKKyAgICAvLyAgIHBhY2thZ2UgYmFyX3BhY2thZ2U7CisgICAgLy8gICBtZXNzYWdlIEJhck1lc3NhZ2UgeyBleHRlbnNpb25zIDE7IH0KKyAgICAvLyAgIGVudW0gQmFyRW51bSB7QkFSX0VOVU1fVkFMVUUgPSAxO30KKyAgICAvLyAgIHNlcnZpY2UgQmFyU2VydmljZSB7fQorICAgIC8vICAgZXh0ZW5kIEJhck1lc3NhZ2UgeyBvcHRpb25hbCBpbnQzMiBiYXJfZXh0ZW5zaW9uID0gMTsgfQorICAgIC8vCisgICAgLy8gQWxzbywgd2UgaGF2ZSBhbiBlbXB0eSBmaWxlICJiYXoucHJvdG8iLiAgVGhpcyBmaWxlJ3MgcHVycG9zZSBpcyB0bworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZW4gdGhvdWdoIGl0IGhhcyB0aGUgc2FtZSBwYWNrYWdlIGFzIGZvby5wcm90bywKKyAgICAvLyBzZWFyY2hpbmcgaXQgZm9yIG1lbWJlcnMgb2YgZm9vLnByb3RvIHdvbid0IHdvcmsuCisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgICBBZGRFeHRlbnNpb25SYW5nZShBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkZvb01lc3NhZ2UiKSwgMSwgMik7CisgICAgQWRkRW51bVZhbHVlKEFkZEVudW0oJmZvb19maWxlLCAiRm9vRW51bSIpLCAiRk9PX0VOVU1fVkFMVUUiLCAxKTsKKyAgICBBZGRTZXJ2aWNlKCZmb29fZmlsZSwgIkZvb1NlcnZpY2UiKTsKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vTWVzc2FnZSIsICJmb29fZXh0ZW5zaW9uIiwgMSwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhcl9maWxlOworICAgIGJhcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgICBiYXJfZmlsZS5zZXRfcGFja2FnZSgiYmFyX3BhY2thZ2UiKTsKKyAgICBiYXJfZmlsZS5hZGRfZGVwZW5kZW5jeSgiZm9vLnByb3RvIik7CisgICAgQWRkRXh0ZW5zaW9uUmFuZ2UoQWRkTWVzc2FnZSgmYmFyX2ZpbGUsICJCYXJNZXNzYWdlIiksIDEsIDIpOworICAgIEFkZEVudW1WYWx1ZShBZGRFbnVtKCZiYXJfZmlsZSwgIkJhckVudW0iKSwgIkJBUl9FTlVNX1ZBTFVFIiwgMSk7CisgICAgQWRkU2VydmljZSgmYmFyX2ZpbGUsICJCYXJTZXJ2aWNlIik7CisgICAgQWRkRXh0ZW5zaW9uKCZiYXJfZmlsZSwgImJhcl9wYWNrYWdlLkJhck1lc3NhZ2UiLCAiYmFyX2V4dGVuc2lvbiIsIDEsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXpfZmlsZTsKKyAgICBiYXpfZmlsZS5zZXRfbmFtZSgiYmF6LnByb3RvIik7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIGJhel9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXpfZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoYmF6X2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvb19tZXNzYWdlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBmb29fZW51bV8gPSBmb29fZmlsZV8tPmVudW1fdHlwZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgZm9vX2VudW1fLT52YWx1ZV9jb3VudCgpKTsKKyAgICBmb29fZW51bV92YWx1ZV8gPSBmb29fZW51bV8tPnZhbHVlKDApOworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgZm9vX3NlcnZpY2VfID0gZm9vX2ZpbGVfLT5zZXJ2aWNlKDApOworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgICBmb29fZXh0ZW5zaW9uXyA9IGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGJhcl9tZXNzYWdlXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBiYXJfZW51bV8gPSBiYXJfZmlsZV8tPmVudW1fdHlwZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgYmFyX2VudW1fLT52YWx1ZV9jb3VudCgpKTsKKyAgICBiYXJfZW51bV92YWx1ZV8gPSBiYXJfZW51bV8tPnZhbHVlKDApOworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgYmFyX3NlcnZpY2VfID0gYmFyX2ZpbGVfLT5zZXJ2aWNlKDApOworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgICBiYXJfZXh0ZW5zaW9uXyA9IGJhcl9maWxlXy0+ZXh0ZW5zaW9uKDApOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhel9maWxlXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiAgICAgICAgICBmb29fbWVzc2FnZV87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiAgICAgIGZvb19lbnVtXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZm9vX2VudW1fdmFsdWVfOworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogICBmb29fc2VydmljZV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogICAgIGZvb19leHRlbnNpb25fOworCisgIGNvbnN0IERlc2NyaXB0b3IqICAgICAgICAgIGJhcl9tZXNzYWdlXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqICAgICAgYmFyX2VudW1fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXJfZW51bV92YWx1ZV87CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiAgIGJhcl9zZXJ2aWNlXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAgICAgYmFyX2V4dGVuc2lvbl87Cit9OworCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBOYW1lKSB7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vX2ZpbGVfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGJhcl9maWxlXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBiYXpfZmlsZV8tPm5hbWUoKSk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIFBhY2thZ2UpIHsKKyAgRVhQRUNUX0VRKCIiLCBmb29fZmlsZV8tPnBhY2thZ2UoKSk7CisgIEVYUEVDVF9FUSgiYmFyX3BhY2thZ2UiLCBiYXJfZmlsZV8tPnBhY2thZ2UoKSk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIERlcGVuZGVuY2llcykgeworICBFWFBFQ1RfRVEoMCwgZm9vX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBiYXJfZmlsZV8tPmRlcGVuZGVuY3koMCkpOworfQorCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kTWVzc2FnZVR5cGVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19tZXNzYWdlXywgZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvb01lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUShiYXJfbWVzc2FnZV8sIGJhcl9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXJNZXNzYWdlIikpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXJNZXNzYWdlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7CisKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaE1lc3NhZ2UiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvb0VudW0iKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZEVudW1UeXBlQnlOYW1lKSB7CisgIEVYUEVDVF9FUShmb29fZW51bV8sIGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb29FbnVtIikpOworICBFWFBFQ1RfRVEoYmFyX2VudW1fLCBiYXJfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQmFyRW51bSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQmFyRW51bSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShiYXJfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vRW51bSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShiYXpfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vRW51bSIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hFbnVtIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRFbnVtVmFsdWVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19lbnVtX3ZhbHVlXywgZm9vX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGT09fRU5VTV9WQUxVRSIpKTsKKyAgRVhQRUNUX0VRKGJhcl9lbnVtX3ZhbHVlXywgYmFyX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCQVJfRU5VTV9WQUxVRSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkJBUl9FTlVNX1ZBTFVFIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiRk9PX0VOVU1fVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmF6X2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGT09fRU5VTV9WQUxVRSIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkZvb01lc3NhZ2UiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZFNlcnZpY2VCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19zZXJ2aWNlXywgZm9vX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vU2VydmljZSIpKTsKKyAgRVhQRUNUX0VRKGJhcl9zZXJ2aWNlXywgYmFyX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiQmFyU2VydmljZSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRTZXJ2aWNlQnlOYW1lKCJCYXJTZXJ2aWNlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIkZvb1NlcnZpY2UiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmF6X2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vU2VydmljZSIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIk5vU3VjaFNlcnZpY2UiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vTWVzc2FnZSIpID09IE5VTEwpOworfQorCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOYW1lKSB7CisgIEVYUEVDVF9FUShmb29fZXh0ZW5zaW9uXywgZm9vX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fZXh0ZW5zaW9uIikpOworICBFWFBFQ1RfRVEoYmFyX2V4dGVuc2lvbl8sIGJhcl9maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiYmFyX2V4dGVuc2lvbiIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImJhcl9leHRlbnNpb24iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmFyX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fZXh0ZW5zaW9uIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX2V4dGVuc2lvbiIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHRlbnNpb24iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRFeHRlbnNpb25CeU51bWJlcikgeworICBFWFBFQ1RfRVEoZm9vX2V4dGVuc2lvbl8sIHBvb2xfLkZpbmRFeHRlbnNpb25CeU51bWJlcihmb29fbWVzc2FnZV8sIDEpKTsKKyAgRVhQRUNUX0VRKGJhcl9leHRlbnNpb25fLCBwb29sXy5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoYmFyX21lc3NhZ2VfLCAxKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZvb19tZXNzYWdlXywgMikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEJ1aWxkQWdhaW4pIHsKKyAgLy8gVGVzdCB0aGF0IGlmIHRlIGNhbGwgQnVpbGRGaWxlIGFnYWluIG9uIHRoZSBzYW1lIGlucHV0IHdlIGdldCB0aGUgc2FtZQorICAvLyBGaWxlRGVzY3JpcHRvciBiYWNrLgorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgIGZvb19maWxlXy0+Q29weVRvKCZmaWxlKTsKKyAgRVhQRUNUX0VRKGZvb19maWxlXywgcG9vbF8uQnVpbGRGaWxlKGZpbGUpKTsKKworICAvLyBCdXQgaWYgd2UgY2hhbmdlIHRoZSBmaWxlIHRoZW4gaXQgd29uJ3Qgd29yay4KKyAgZmlsZS5zZXRfcGFja2FnZSgic29tZS5vdGhlci5wYWNrYWdlIik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShmaWxlKSA9PSBOVUxMKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IHNpbXBsZSBmbGF0IG1lc3NhZ2VzIGFuZCBmaWVsZHMuCitjbGFzcyBEZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdEZvcmVpZ24ge30KKyAgICAvLyAgIGVudW0gVGVzdEVudW0ge30KKyAgICAvLworICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7CisgICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyAgICAgIGZvbyA9IDE7CisgICAgLy8gICAgIG9wdGlvbmFsIFRlc3RFbnVtICAgIGJhciA9IDY7CisgICAgLy8gICAgIHJlcGVhdGVkIFRlc3RGb3JlaWduIGJheiA9IDUwMDAwMDAwMDsKKyAgICAvLyAgICAgb3B0aW9uYWwgZ3JvdXAgICAgICAgcXV4ID0gMTUge30KKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKKyAgICAvLyAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0OworICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZTIgeworICAgIC8vICAgICByZXF1aXJlZCBzdHJpbmcgZm9vID0gMTsKKyAgICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIGJhciA9IDI7CisgICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyBxdXV4ID0gNjsKKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vIFdlIGNoZWF0IGFuZCB1c2UgVGVzdEZvcmVpZ24gYXMgdGhlIHR5cGUgZm9yIHF1eCByYXRoZXIgdGhhbiBjcmVhdGUKKyAgICAvLyBhbiBhY3R1YWwgbmVzdGVkIHR5cGUuCisgICAgLy8KKyAgICAvLyBTaW5jZSBhbGwgcHJpbWl0aXZlIHR5cGVzIChpbmNsdWRpbmcgc3RyaW5nKSB1c2UgdGhlIHNhbWUgYnVpbGRpbmcKKyAgICAvLyBjb2RlLCB0aGVyZSdzIG5vIG5lZWQgdG8gdGVzdCBlYWNoIG9uZSBpbmRpdmlkdWFsbHkuCisgICAgLy8KKyAgICAvLyBUZXN0TWVzc2FnZTIgaXMgcHJpbWFyaWx5IGhlcmUgdG8gdGVzdCBGaW5kRmllbGRCeU5hbWUgYW5kIGZyaWVuZHMuCisgICAgLy8gQWxsIG1lc3NhZ2VzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKKyAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vX2ZpbGU7CisgICAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiVGVzdEZvcmVpZ24iKTsKKyAgICBBZGRFbXB0eUVudW0oJmZvb19maWxlLCAiVGVzdEVudW0iKTsKKworICAgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZSA9IEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiVGVzdE1lc3NhZ2UiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vIiwgMSwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiYmFyIiwgNiwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSkKKyAgICAgIC0+c2V0X3R5cGVfbmFtZSgiVGVzdEVudW0iKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiYmF6IiwgNTAwMDAwMDAwLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFKQorICAgICAgLT5zZXRfdHlwZV9uYW1lKCJUZXN0Rm9yZWlnbiIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJxdXgiLCAxNSwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVApCisgICAgICAtPnNldF90eXBlX25hbWUoIlRlc3RGb3JlaWduIik7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhcl9maWxlOworICAgIGJhcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgICBiYXJfZmlsZS5zZXRfcGFja2FnZSgiY29yZ2UuZ3JhdWx0Iik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UyID0gQWRkTWVzc2FnZSgmYmFyX2ZpbGUsICJUZXN0TWVzc2FnZTIiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlMiwgImZvbyIsIDEsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CisgICAgQWRkRmllbGQobWVzc2FnZTIsICJiYXIiLCAyLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UyLCAicXV1eCIsIDYsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBlbnVtXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvcmVpZ25fID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgbWVzc2FnZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSg0LCBtZXNzYWdlXy0+ZmllbGRfY291bnQoKSk7CisgICAgZm9vXyA9IG1lc3NhZ2VfLT5maWVsZCgwKTsKKyAgICBiYXJfID0gbWVzc2FnZV8tPmZpZWxkKDEpOworICAgIGJhel8gPSBtZXNzYWdlXy0+ZmllbGQoMik7CisgICAgcXV4XyA9IG1lc3NhZ2VfLT5maWVsZCgzKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlMl8gPSBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgzLCBtZXNzYWdlMl8tPmZpZWxkX2NvdW50KCkpOworICAgIGZvbzJfICA9IG1lc3NhZ2UyXy0+ZmllbGQoMCk7CisgICAgYmFyMl8gID0gbWVzc2FnZTJfLT5maWVsZCgxKTsKKyAgICBxdXV4Ml8gPSBtZXNzYWdlMl8tPmZpZWxkKDIpOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZTJfOworICBjb25zdCBEZXNjcmlwdG9yKiBmb3JlaWduXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiYXJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhel87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcXV4XzsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZvbzJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhcjJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHF1dXgyXzsKK307CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgTmFtZSkgeworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UiLCBtZXNzYWdlXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBtZXNzYWdlXy0+ZmlsZSgpKTsKKworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlMiIsIG1lc3NhZ2UyXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyIiwgbWVzc2FnZTJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIG1lc3NhZ2UyXy0+ZmlsZSgpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBDb250YWluaW5nVHlwZSkgeworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRzQnlJbmRleCkgeworICBBU1NFUlRfRVEoNCwgbWVzc2FnZV8tPmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPmZpZWxkKDApKTsKKyAgRVhQRUNUX0VRKGJhcl8sIG1lc3NhZ2VfLT5maWVsZCgxKSk7CisgIEVYUEVDVF9FUShiYXpfLCBtZXNzYWdlXy0+ZmllbGQoMikpOworICBFWFBFQ1RfRVEocXV4XywgbWVzc2FnZV8tPmZpZWxkKDMpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU5hbWUpIHsKKyAgLy8gQWxsIG1lc3NhZ2VzIGluIHRoZSBzYW1lIERlc2NyaXB0b3JQb29sIHNoYXJlIGEgc2luZ2xlIGxvb2t1cCB0YWJsZSBmb3IKKyAgLy8gZmllbGRzLiAgU28sIGluIGFkZGl0aW9uIHRvIHRlc3RpbmcgdGhhdCBGaW5kRmllbGRCeU5hbWUgZmluZHMgdGhlIGZpZWxkcworICAvLyBvZiB0aGUgbWVzc2FnZSwgd2UgbmVlZCB0byB0ZXN0IHRoYXQgaXQgZG9lcyAqbm90KiBmaW5kIHRoZSBmaWVsZHMgb2YKKyAgLy8gKm90aGVyKiBtZXNzYWdlcy4KKworICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiZm9vIikpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiYmFyIikpOworICBFWFBFQ1RfRVEoYmF6XywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiYmF6IikpOworICBFWFBFQ1RfRVEocXV4XywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgicXV4IikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoInF1dXgiKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZm9vMl8gLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgiZm9vIiApKTsKKyAgRVhQRUNUX0VRKGJhcjJfICwgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU5hbWUoImJhciIgKSk7CisgIEVYUEVDVF9FUShxdXV4Ml8sIG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOYW1lKCJxdXV4IikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgiYmF6IikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOYW1lKCJxdXgiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU51bWJlcikgeworICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcl8sIG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcig2KSk7CisgIEVYUEVDVF9FUShiYXpfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoNTAwMDAwMDAwKSk7CisgIEVYUEVDVF9FUShxdXhfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoMTUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDgzNzU5MikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcigyKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZm9vMl8gLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcjJfICwgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU51bWJlcigyKSk7CisgIEVYUEVDVF9FUShxdXV4Ml8sIG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOdW1iZXIoNikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDE1KSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRmllbGRCeU51bWJlcig1MDAwMDAwMDApID09IE5VTEwpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkTmFtZSkgeworICBFWFBFQ1RfRVEoImZvbyIsIGZvb18tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgYmFyXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCBiYXpfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoInF1eCIsIHF1eF8tPm5hbWUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRGdWxsTmFtZSkgeworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLmZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5iYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuYmF6IiwgYmF6Xy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLnF1eCIsIHF1eF8tPmZ1bGxfbmFtZSgpKTsKKworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuZm9vIiwgZm9vMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLmJhciIsIGJhcjJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RNZXNzYWdlMi5xdXV4IiwgcXV1eDJfLT5mdWxsX25hbWUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRGaWxlKSB7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGZvb18tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGJhcl8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGJhel8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIHF1eF8tPmZpbGUoKSk7CisKKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgZm9vMl8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIGJhcjJfLT5maWxlKCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBxdXV4Ml8tPmZpbGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRJbmRleCkgeworICBFWFBFQ1RfRVEoMCwgZm9vXy0+aW5kZXgoKSk7CisgIEVYUEVDVF9FUSgxLCBiYXJfLT5pbmRleCgpKTsKKyAgRVhQRUNUX0VRKDIsIGJhel8tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMywgcXV4Xy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGROdW1iZXIpIHsKKyAgRVhQRUNUX0VRKCAgICAgICAgMSwgZm9vXy0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoICAgICAgICA2LCBiYXJfLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSg1MDAwMDAwMDAsIGJhel8tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKCAgICAgICAxNSwgcXV4Xy0+bnVtYmVyKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkVHlwZSkgeworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAsIGZvb18tPnR5cGUoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICwgYmFyXy0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXpfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAsIHF1eF8tPnR5cGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRMYWJlbCkgeworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVFVSVJFRCwgZm9vXy0+bGFiZWwoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMLCBiYXJfLT5sYWJlbCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIGJhel8tPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgcXV4Xy0+bGFiZWwoKSk7CisKKyAgRVhQRUNUX1RSVUUgKGZvb18tPmlzX3JlcXVpcmVkKCkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+aXNfb3B0aW9uYWwoKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5pc19yZXBlYXRlZCgpKTsKKworICBFWFBFQ1RfRkFMU0UoYmFyXy0+aXNfcmVxdWlyZWQoKSk7CisgIEVYUEVDVF9UUlVFIChiYXJfLT5pc19vcHRpb25hbCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhcl8tPmlzX3JlcGVhdGVkKCkpOworCisgIEVYUEVDVF9GQUxTRShiYXpfLT5pc19yZXF1aXJlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhel8tPmlzX29wdGlvbmFsKCkpOworICBFWFBFQ1RfVFJVRSAoYmF6Xy0+aXNfcmVwZWF0ZWQoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRIYXNEZWZhdWx0KSB7CisgIEVYUEVDVF9GQUxTRShmb29fLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhcl8tPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UoYmF6Xy0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShxdXhfLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZENvbnRhaW5pbmdUeXBlKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXywgZm9vXy0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZV8sIGJhcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLCBiYXpfLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXywgcXV4Xy0+Y29udGFpbmluZ190eXBlKCkpOworCisgIEVYUEVDVF9FUShtZXNzYWdlMl8sIGZvbzJfIC0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBiYXIyXyAtPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgcXV1eDJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRNZXNzYWdlVHlwZSkgeworICBFWFBFQ1RfVFJVRShmb29fLT5tZXNzYWdlX3R5cGUoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmFyXy0+bWVzc2FnZV90eXBlKCkgPT0gTlVMTCk7CisKKyAgRVhQRUNUX0VRKGZvcmVpZ25fLCBiYXpfLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb3JlaWduXywgcXV4Xy0+bWVzc2FnZV90eXBlKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkRW51bVR5cGUpIHsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+ZW51bV90eXBlKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhel8tPmVudW1fdHlwZSgpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShxdXhfLT5lbnVtX3R5cGUoKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZW51bV8sIGJhcl8tPmVudW1fdHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTdHlsaXplZEZpZWxkTmFtZXNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBBZGRFeHRlbnNpb25SYW5nZShBZGRNZXNzYWdlKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiKSwgMSwgMTAwMCk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmaWxlLCAiVGVzdE1lc3NhZ2UiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vX2ZvbyIsIDEsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiRm9vQmFyIiwgMiwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb29CYXoiLCAzLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQobWVzc2FnZSwgImZvb0ZvbyIsIDQsICAvLyBDYW1lbC1jYXNlIGNvbmZsaWN0IHdpdGggZm9vX2Zvby4KKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb29iYXIiLCA1LCAgLy8gTG93ZXItY2FzZSBjb25mbGljdCB3aXRoIEZvb0Jhci4KKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJiYXJfZm9vIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXJCYXIiLCAyLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGROZXN0ZWRFeHRlbnNpb24obWVzc2FnZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgIkJhckJheiIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyRm9vIiwgNCwgIC8vIENvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyYmFyIiwgNSwgIC8vIENvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6X2ZvbyIsIDExLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRFeHRlbnNpb24oJmZpbGUsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXpCYXIiLCAxMiwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiQmF6QmF6IiwgMTMsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEV4dGVuc2lvbigmZmlsZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgImJhekZvbyIsIDE0LCAgLy8gQ29uZmxpY3QKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6YmFyIiwgMTUsICAvLyBDb25mbGljdAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKworICAgIGZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZpbGUpOworICAgIEFTU0VSVF9UUlVFKGZpbGVfICE9IE5VTEwpOworICAgIEFTU0VSVF9FUSgyLCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIG1lc3NhZ2VfID0gZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKKyAgICBBU1NFUlRfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPm5hbWUoKSk7CisgICAgQVNTRVJUX0VRKDUsIG1lc3NhZ2VfLT5maWVsZF9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNSwgbWVzc2FnZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNSwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfOworfTsKKworVEVTVF9GKFN0eWxpemVkRmllbGROYW1lc1Rlc3QsIExvd2VyY2FzZU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJmb29fZm9vIiwgbWVzc2FnZV8tPmZpZWxkKDApLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiICwgbWVzc2FnZV8tPmZpZWxkKDEpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXoiICwgbWVzc2FnZV8tPmZpZWxkKDIpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29mb28iICwgbWVzc2FnZV8tPmZpZWxkKDMpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiICwgbWVzc2FnZV8tPmZpZWxkKDQpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKworICBFWFBFQ1RfRVEoImJhcl9mb28iLCBtZXNzYWdlXy0+ZXh0ZW5zaW9uKDApLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXJiYXIiICwgbWVzc2FnZV8tPmV4dGVuc2lvbigxKS0+bG93ZXJjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmFyYmF6IiAsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmZvbyIgLCBtZXNzYWdlXy0+ZXh0ZW5zaW9uKDMpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXJiYXIiICwgbWVzc2FnZV8tPmV4dGVuc2lvbig0KS0+bG93ZXJjYXNlX25hbWUoKSk7CisKKyAgRVhQRUNUX0VRKCJiYXpfZm9vIiwgZmlsZV8tPmV4dGVuc2lvbigwKS0+bG93ZXJjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6YmFyIiAsIGZpbGVfLT5leHRlbnNpb24oMSktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhemJheiIgLCBmaWxlXy0+ZXh0ZW5zaW9uKDIpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXpmb28iICwgZmlsZV8tPmV4dGVuc2lvbigzKS0+bG93ZXJjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6YmFyIiAsIGZpbGVfLT5leHRlbnNpb24oNCktPmxvd2VyY2FzZV9uYW1lKCkpOworfQorCitURVNUX0YoU3R5bGl6ZWRGaWVsZE5hbWVzVGVzdCwgQ2FtZWxjYXNlTmFtZSkgeworICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgwKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vQmFyIiwgbWVzc2FnZV8tPmZpZWxkKDEpLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29CYXoiLCBtZXNzYWdlXy0+ZmllbGQoMiktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgzKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgbWVzc2FnZV8tPmZpZWxkKDQpLT5jYW1lbGNhc2VfbmFtZSgpKTsKKworICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMCktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMSktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckJheiIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMyktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oNCktPmNhbWVsY2FzZV9uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigwKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6QmFyIiwgZmlsZV8tPmV4dGVuc2lvbigxKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6QmF6IiwgZmlsZV8tPmV4dGVuc2lvbigyKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigzKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6YmFyIiwgZmlsZV8tPmV4dGVuc2lvbig0KS0+Y2FtZWxjYXNlX25hbWUoKSk7Cit9CisKK1RFU1RfRihTdHlsaXplZEZpZWxkTmFtZXNUZXN0LCBGaW5kQnlMb3dlcmNhc2VOYW1lKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMCksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJmb29fZm9vIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmZpZWxkKDEpLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vYmFyIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmZpZWxkKDIpLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vYmF6IikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJGb29CYXIiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vQmF6IikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoImJhcl9mb28iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigwKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJfZm9vIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigxKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJiYXIiKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZXh0ZW5zaW9uKDIpLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhcmJheiIpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoIkJhckJhciIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiYmFyQmF6IikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJmb29fZm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOworCisgIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDApLAorICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhel9mb28iKSk7CisgIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDEpLAorICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhemJhciIpKTsKKyAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMiksCisgICAgICAgICAgICBmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiYmF6YmF6IikpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiQmF6QmFyIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXpCYXoiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoIm5vc3VjaGZpZWxkIikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihTdHlsaXplZEZpZWxkTmFtZXNUZXN0LCBGaW5kQnlDYW1lbGNhc2VOYW1lKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMCksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29Gb28iKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMSksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29CYXIiKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMiksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29CYXoiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoImZvb19mb28iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgiRm9vQmFyIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoImJhckZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOworCisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZXh0ZW5zaW9uKDApLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImJhckZvbyIpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLT5leHRlbnNpb24oMSksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmFyQmFyIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigyKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJCYXoiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJfZm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJCYXJCYXIiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImZvb0ZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZmlsZV8tPmV4dGVuc2lvbigwKSwKKyAgICAgICAgICAgIGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXpGb28iKSk7CisgIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDEpLAorICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImJhekJhciIpKTsKKyAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMiksCisgICAgICAgICAgICBmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6QmF6IikpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6X2ZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiQmF6QmFyIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3QgZW51bSBkZXNjcmlwdG9ycy4KK2NsYXNzIEVudW1EZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgIGVudW0gVGVzdEVudW0geworICAgIC8vICAgICBGT08gPSAxOworICAgIC8vICAgICBCQVIgPSAyOworICAgIC8vICAgfQorICAgIC8vCisgICAgLy8gICAvLyBpbiAiYmFyLnByb3RvIgorICAgIC8vICAgcGFja2FnZSBjb3JnZS5ncmF1bHQ7CisgICAgLy8gICBlbnVtIFRlc3RFbnVtMiB7CisgICAgLy8gICAgIEZPTyA9IDE7CisgICAgLy8gICAgIEJBWiA9IDM7CisgICAgLy8gICB9CisgICAgLy8KKyAgICAvLyBUZXN0RW51bTIgaXMgcHJpbWFyaWx5IGhlcmUgdG8gdGVzdCBGaW5kVmFsdWVCeU5hbWUgYW5kIGZyaWVuZHMuCisgICAgLy8gQWxsIGVudW1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKKyAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KKworICAgIC8vIFRlc3RFbnVtCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3Byb3RvID0gQWRkRW51bSgmZm9vX2ZpbGUsICJUZXN0RW51bSIpOworICAgIEFkZEVudW1WYWx1ZShlbnVtX3Byb3RvLCAiRk9PIiwgMSk7CisgICAgQWRkRW51bVZhbHVlKGVudW1fcHJvdG8sICJCQVIiLCAyKTsKKworICAgIC8vIFRlc3RFbnVtMgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmFyX2ZpbGU7CisgICAgYmFyX2ZpbGUuc2V0X25hbWUoImJhci5wcm90byIpOworICAgIGJhcl9maWxlLnNldF9wYWNrYWdlKCJjb3JnZS5ncmF1bHQiKTsKKworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW0yX3Byb3RvID0gQWRkRW51bSgmYmFyX2ZpbGUsICJUZXN0RW51bTIiKTsKKyAgICBBZGRFbnVtVmFsdWUoZW51bTJfcHJvdG8sICJGT08iLCAxKTsKKyAgICBBZGRFbnVtVmFsdWUoZW51bTJfcHJvdG8sICJCQVoiLCAzKTsKKworICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KKyAgICBmb29fZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoZm9vX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGZvb19maWxlXyAhPSBOVUxMKTsKKworICAgIGJhcl9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXJfZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+ZW51bV90eXBlX2NvdW50KCkpOworICAgIGVudW1fID0gZm9vX2ZpbGVfLT5lbnVtX3R5cGUoMCk7CisKKyAgICBBU1NFUlRfRVEoMiwgZW51bV8tPnZhbHVlX2NvdW50KCkpOworICAgIGZvb18gPSBlbnVtXy0+dmFsdWUoMCk7CisgICAgYmFyXyA9IGVudW1fLT52YWx1ZSgxKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBlbnVtMl8gPSBiYXJfZmlsZV8tPmVudW1fdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgyLCBlbnVtMl8tPnZhbHVlX2NvdW50KCkpOworICAgIGZvbzJfID0gZW51bTJfLT52YWx1ZSgwKTsKKyAgICBiYXoyXyA9IGVudW0yXy0+dmFsdWUoMSk7CisgIH0KKworICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZm9vX2ZpbGVfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFyX2ZpbGVfOworCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW0yXzsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXJfOworCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvbzJfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXoyXzsKK307CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIE5hbWUpIHsKKyAgRVhQRUNUX0VRKCJUZXN0RW51bSIsIGVudW1fLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RFbnVtIiwgZW51bV8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKGZvb19maWxlXywgZW51bV8tPmZpbGUoKSk7CisKKyAgRVhQRUNUX0VRKCJUZXN0RW51bTIiLCBlbnVtMl8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RFbnVtMiIsIGVudW0yXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBlbnVtMl8tPmZpbGUoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIENvbnRhaW5pbmdUeXBlKSB7CisgIEVYUEVDVF9UUlVFKGVudW1fLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZW51bTJfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVzQnlJbmRleCkgeworICBBU1NFUlRfRVEoMiwgZW51bV8tPnZhbHVlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vXywgZW51bV8tPnZhbHVlKDApKTsKKyAgRVhQRUNUX0VRKGJhcl8sIGVudW1fLT52YWx1ZSgxKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIEZpbmRWYWx1ZUJ5TmFtZSkgeworICBFWFBFQ1RfRVEoZm9vXyAsIGVudW1fIC0+RmluZFZhbHVlQnlOYW1lKCJGT08iKSk7CisgIEVYUEVDVF9FUShiYXJfICwgZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIpKTsKKyAgRVhQRUNUX0VRKGZvbzJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TmFtZSgiRk9PIikpOworICBFWFBFQ1RfRVEoYmF6Ml8sIGVudW0yXy0+RmluZFZhbHVlQnlOYW1lKCJCQVoiKSk7CisKKyAgRVhQRUNUX1RSVUUoZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIkJBWiIgICAgICAgICAgKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZW51bTJfLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIgICAgICAgICAgKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgRmluZFZhbHVlQnlOdW1iZXIpIHsKKyAgRVhQRUNUX0VRKGZvb18gLCBlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcl8gLCBlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDIpKTsKKyAgRVhQRUNUX0VRKGZvbzJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhejJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDMpKTsKKworICBFWFBFQ1RfVFJVRShlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDQxNikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGVudW1fIC0+RmluZFZhbHVlQnlOdW1iZXIoMykgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGVudW0yXy0+RmluZFZhbHVlQnlOdW1iZXIoMikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlTmFtZSkgeworICBFWFBFQ1RfRVEoIkZPTyIsIGZvb18tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQkFSIiwgYmFyXy0+bmFtZSgpKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVGdWxsTmFtZSkgeworICBFWFBFQ1RfRVEoIkZPTyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCQVIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LkZPTyIsIGZvbzJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LkJBWiIsIGJhejJfLT5mdWxsX25hbWUoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlSW5kZXgpIHsKKyAgRVhQRUNUX0VRKDAsIGZvb18tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyXy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlTnVtYmVyKSB7CisgIEVYUEVDVF9FUSgxLCBmb29fLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgyLCBiYXJfLT5udW1iZXIoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlVHlwZSkgeworICBFWFBFQ1RfRVEoZW51bV8gLCBmb29fIC0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKGVudW1fICwgYmFyXyAtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShlbnVtMl8sIGZvbzJfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoZW51bTJfLCBiYXoyXy0+dHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IHNlcnZpY2UgZGVzY3JpcHRvcnMuCitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgYW5kIHNlcnZpY2U6CisgICAgLy8gICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgICBtZXNzYWdlIEZvb1JlcXVlc3QgIHt9CisgICAgLy8gICAgbWVzc2FnZSBGb29SZXNwb25zZSB7fQorICAgIC8vICAgIG1lc3NhZ2UgQmFyUmVxdWVzdCAge30KKyAgICAvLyAgICBtZXNzYWdlIEJhclJlc3BvbnNlIHt9CisgICAgLy8gICAgbWVzc2FnZSBCYXpSZXF1ZXN0ICB7fQorICAgIC8vICAgIG1lc3NhZ2UgQmF6UmVzcG9uc2Uge30KKyAgICAvLworICAgIC8vICAgIHNlcnZpY2UgVGVzdFNlcnZpY2UgeworICAgIC8vICAgICAgcnBjIEZvbyhGb29SZXF1ZXN0KSByZXR1cm5zIChGb29SZXNwb25zZSk7CisgICAgLy8gICAgICBycGMgQmFyKEJhclJlcXVlc3QpIHJldHVybnMgKEJhclJlc3BvbnNlKTsKKyAgICAvLyAgICB9CisgICAgLy8KKyAgICAvLyAgICAvLyBpbiAiYmFyLnByb3RvIgorICAgIC8vICAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0CisgICAgLy8gICAgc2VydmljZSBUZXN0U2VydmljZTIgeworICAgIC8vICAgICAgcnBjIEZvbyhGb29SZXF1ZXN0KSByZXR1cm5zIChGb29SZXNwb25zZSk7CisgICAgLy8gICAgICBycGMgQmF6KEJhelJlcXVlc3QpIHJldHVybnMgKEJhelJlc3BvbnNlKTsKKyAgICAvLyAgICB9CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiRm9vUmVxdWVzdCIpOworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiRm9vUmVzcG9uc2UiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhclJlcXVlc3QiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhclJlc3BvbnNlIik7CisgICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJCYXpSZXF1ZXN0Iik7CisgICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJCYXpSZXNwb25zZSIpOworCisgICAgU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSA9IEFkZFNlcnZpY2UoJmZvb19maWxlLCAiVGVzdFNlcnZpY2UiKTsKKyAgICBBZGRNZXRob2Qoc2VydmljZSwgIkZvbyIsICJGb29SZXF1ZXN0IiwgIkZvb1Jlc3BvbnNlIik7CisgICAgQWRkTWV0aG9kKHNlcnZpY2UsICJCYXIiLCAiQmFyUmVxdWVzdCIsICJCYXJSZXNwb25zZSIpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKKyAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImNvcmdlLmdyYXVsdCIpOworICAgIGJhcl9maWxlLmFkZF9kZXBlbmRlbmN5KCJmb28ucHJvdG8iKTsKKworICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UyID0gQWRkU2VydmljZSgmYmFyX2ZpbGUsICJUZXN0U2VydmljZTIiKTsKKyAgICBBZGRNZXRob2Qoc2VydmljZTIsICJGb28iLCAiRm9vUmVxdWVzdCIsICJGb29SZXNwb25zZSIpOworICAgIEFkZE1ldGhvZChzZXJ2aWNlMiwgIkJheiIsICJCYXpSZXF1ZXN0IiwgIkJhelJlc3BvbnNlIik7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIEFTU0VSVF9FUSg2LCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBmb29fcmVxdWVzdF8gID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgZm9vX3Jlc3BvbnNlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDEpOworICAgIGJhcl9yZXF1ZXN0XyAgPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKKyAgICBiYXJfcmVzcG9uc2VfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMyk7CisgICAgYmF6X3JlcXVlc3RfICA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDQpOworICAgIGJhel9yZXNwb25zZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSg1KTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgc2VydmljZV8gPSBmb29fZmlsZV8tPnNlcnZpY2UoMCk7CisKKyAgICBBU1NFUlRfRVEoMiwgc2VydmljZV8tPm1ldGhvZF9jb3VudCgpKTsKKyAgICBmb29fID0gc2VydmljZV8tPm1ldGhvZCgwKTsKKyAgICBiYXJfID0gc2VydmljZV8tPm1ldGhvZCgxKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgc2VydmljZTJfID0gYmFyX2ZpbGVfLT5zZXJ2aWNlKDApOworCisgICAgQVNTRVJUX0VRKDIsIHNlcnZpY2UyXy0+bWV0aG9kX2NvdW50KCkpOworICAgIGZvbzJfID0gc2VydmljZTJfLT5tZXRob2QoMCk7CisgICAgYmF6Ml8gPSBzZXJ2aWNlMl8tPm1ldGhvZCgxKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vX3JlcXVlc3RfOworICBjb25zdCBEZXNjcmlwdG9yKiBmb29fcmVzcG9uc2VfOworICBjb25zdCBEZXNjcmlwdG9yKiBiYXJfcmVxdWVzdF87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhcl9yZXNwb25zZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhel9yZXF1ZXN0XzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmF6X3Jlc3BvbnNlXzsKKworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV87CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlMl87CisKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmFyXzsKKworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBmb28yXzsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmF6Ml87Cit9OworCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBOYW1lKSB7CisgIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UiLCBzZXJ2aWNlXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZSIsIHNlcnZpY2VfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIHNlcnZpY2VfLT5maWxlKCkpOworCisgIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UyIiwgc2VydmljZTJfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0U2VydmljZTIiLCBzZXJ2aWNlMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgc2VydmljZTJfLT5maWxlKCkpOworfQorCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2RzQnlJbmRleCkgeworICBBU1NFUlRfRVEoMiwgc2VydmljZV8tPm1ldGhvZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvb18sIHNlcnZpY2VfLT5tZXRob2QoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgc2VydmljZV8tPm1ldGhvZCgxKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIEZpbmRNZXRob2RCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb18gLCBzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhcl8gLCBzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkJhciIpKTsKKyAgRVhQRUNUX0VRKGZvbzJfLCBzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhejJfLCBzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkJheiIpKTsKKworICBFWFBFQ1RfVFJVRShzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIk5vU3VjaE1ldGhvZCIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkJheiIgICAgICAgICApID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkJhciIgICAgICAgICApID09IE5VTEwpOworfQorCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2ROYW1lKSB7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCYXIiLCBiYXJfLT5uYW1lKCkpOworfQorCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2RGdWxsTmFtZSkgeworICBFWFBFQ1RfRVEoIlRlc3RTZXJ2aWNlLkZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZS5CYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RTZXJ2aWNlMi5Gb28iLCBmb28yXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0U2VydmljZTIuQmF6IiwgYmF6Ml8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5kZXgpIHsKKyAgRVhQRUNUX0VRKDAsIGZvb18tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyXy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZFBhcmVudCkgeworICBFWFBFQ1RfRVEoc2VydmljZV8sIGZvb18tPnNlcnZpY2UoKSk7CisgIEVYUEVDVF9FUShzZXJ2aWNlXywgYmFyXy0+c2VydmljZSgpKTsKK30KKworVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5wdXRUeXBlKSB7CisgIEVYUEVDVF9FUShmb29fcmVxdWVzdF8sIGZvb18tPmlucHV0X3R5cGUoKSk7CisgIEVYUEVDVF9FUShiYXJfcmVxdWVzdF8sIGJhcl8tPmlucHV0X3R5cGUoKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZE91dHB1dFR5cGUpIHsKKyAgRVhQRUNUX0VRKGZvb19yZXNwb25zZV8sIGZvb18tPm91dHB1dF90eXBlKCkpOworICBFWFBFQ1RfRVEoYmFyX3Jlc3BvbnNlXywgYmFyXy0+b3V0cHV0X3R5cGUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGVzdCBuZXN0ZWQgdHlwZXMuCitjbGFzcyBOZXN0ZWREZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UgeworICAgIC8vICAgICBtZXNzYWdlIEZvbyB7fQorICAgIC8vICAgICBtZXNzYWdlIEJhciB7fQorICAgIC8vICAgICBlbnVtIEJheiB7IEEgPSAxOyB9CisgICAgLy8gICAgIGVudW0gUXV4IHsgQiA9IDE7IH0KKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKKyAgICAvLyAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0OworICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZTIgeworICAgIC8vICAgICBtZXNzYWdlIEZvbyB7fQorICAgIC8vICAgICBtZXNzYWdlIEJheiB7fQorICAgIC8vICAgICBlbnVtIFF1eCAgeyBBID0gMTsgfQorICAgIC8vICAgICBlbnVtIFF1dXggeyBDID0gMTsgfQorICAgIC8vICAgfQorICAgIC8vCisgICAgLy8gVGVzdE1lc3NhZ2UyIGlzIHByaW1hcmlseSBoZXJlIHRvIHRlc3QgRmluZE5lc3RlZFR5cGVCeU5hbWUgYW5kIGZyaWVuZHMuCisgICAgLy8gQWxsIG1lc3NhZ2VzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKKyAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KKyAgICAvLworICAgIC8vIFdlIGFkZCBlbnVtIHZhbHVlcyB0byB0aGUgZW51bXMgaW4gb3JkZXIgdG8gdGVzdCBzZWFyY2hpbmcgZm9yIGVudW0KKyAgICAvLyB2YWx1ZXMgYWNyb3NzIGEgbWVzc2FnZSdzIHNjb3BlLgorCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlRlc3RNZXNzYWdlIik7CisgICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlLCAiRm9vIik7CisgICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlLCAiQmFyIik7CisgICAgRW51bURlc2NyaXB0b3JQcm90byogYmF6ID0gQWRkTmVzdGVkRW51bShtZXNzYWdlLCAiQmF6Iik7CisgICAgQWRkRW51bVZhbHVlKGJheiwgIkEiLCAxKTsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBxdXggPSBBZGROZXN0ZWRFbnVtKG1lc3NhZ2UsICJRdXgiKTsKKyAgICBBZGRFbnVtVmFsdWUocXV4LCAiQiIsIDEpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKKyAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImNvcmdlLmdyYXVsdCIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlMiA9IEFkZE1lc3NhZ2UoJmJhcl9maWxlLCAiVGVzdE1lc3NhZ2UyIik7CisgICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlMiwgIkZvbyIpOworICAgIEFkZE5lc3RlZE1lc3NhZ2UobWVzc2FnZTIsICJCYXoiKTsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBxdXgyID0gQWRkTmVzdGVkRW51bShtZXNzYWdlMiwgIlF1eCIpOworICAgIEFkZEVudW1WYWx1ZShxdXgyLCAiQSIsIDEpOworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIHF1dXgyID0gQWRkTmVzdGVkRW51bShtZXNzYWdlMiwgIlF1dXgiKTsKKyAgICBBZGRFbnVtVmFsdWUocXV1eDIsICJDIiwgMSk7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2VfLT5uZXN0ZWRfdHlwZV9jb3VudCgpKTsKKyAgICBmb29fID0gbWVzc2FnZV8tPm5lc3RlZF90eXBlKDApOworICAgIGJhcl8gPSBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMSk7CisKKyAgICBBU1NFUlRfRVEoMiwgbWVzc2FnZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBiYXpfID0gbWVzc2FnZV8tPmVudW1fdHlwZSgwKTsKKyAgICBxdXhfID0gbWVzc2FnZV8tPmVudW1fdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXpfLT52YWx1ZV9jb3VudCgpKTsKKyAgICBhXyA9IGJhel8tPnZhbHVlKDApOworICAgIEFTU0VSVF9FUSgxLCBxdXhfLT52YWx1ZV9jb3VudCgpKTsKKyAgICBiXyA9IHF1eF8tPnZhbHVlKDApOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIG1lc3NhZ2UyXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UyXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgICAgZm9vMl8gPSBtZXNzYWdlMl8tPm5lc3RlZF90eXBlKDApOworICAgIGJhejJfID0gbWVzc2FnZTJfLT5uZXN0ZWRfdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMl8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBxdXgyXyA9IG1lc3NhZ2UyXy0+ZW51bV90eXBlKDApOworICAgIHF1dXgyXyA9IG1lc3NhZ2UyXy0+ZW51bV90eXBlKDEpOworCisgICAgQVNTRVJUX0VRKDEsIHF1eDJfLT52YWx1ZV9jb3VudCgpKTsKKyAgICBhMl8gPSBxdXgyXy0+dmFsdWUoMCk7CisgICAgQVNTRVJUX0VRKDEsIHF1dXgyXy0+dmFsdWVfY291bnQoKSk7CisgICAgYzJfID0gcXV1eDJfLT52YWx1ZSgwKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UyXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBEZXNjcmlwdG9yKiBiYXJfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogYmF6XzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHF1eF87CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGFfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb28yXzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmF6Ml87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBxdXgyXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHF1dXgyXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYTJfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBjMl87Cit9OworCitURVNUX0YoTmVzdGVkRGVzY3JpcHRvclRlc3QsIE1lc3NhZ2VOYW1lKSB7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vXyAtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgYmFyXyAtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vMl8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQmF6IiwgYmF6Ml8tPm5hbWUoKSk7CisKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5Gb28iLCBmb29fLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuQmFyIiwgYmFyXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuRm9vIiwgZm9vMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLkJheiIsIGJhejJfLT5mdWxsX25hbWUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTWVzc2FnZUNvbnRhaW5pbmdUeXBlKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXyAsIGZvb18gLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXyAsIGJhcl8gLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMl8sIGZvbzJfLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMl8sIGJhejJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTmVzdGVkTWVzc2FnZXNCeUluZGV4KSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU5hbWVEb2VzbnRGaW5kTmVzdGVkVHlwZXMpIHsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoIlF1eCIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJRdXgiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kTmVzdGVkVHlwZUJ5TmFtZSkgeworICBFWFBFQ1RfRVEoZm9vXyAsIG1lc3NhZ2VfIC0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhcl8gLCBtZXNzYWdlXyAtPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJCYXIiKSk7CisgIEVYUEVDVF9FUShmb28yXywgbWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiRm9vIikpOworICBFWFBFQ1RfRVEoYmF6Ml8sIG1lc3NhZ2UyXy0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkJheiIpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXyAtPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfIC0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkJheiIgICAgICAgKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiQmFyIiAgICAgICApID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiUXV4IikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgRW51bU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJCYXoiICwgYmF6XyAtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiUXV4IiAsIHF1eF8gLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIlF1eCIgLCBxdXgyXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJRdXV4IiwgcXV1eDJfLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuQmF6IiwgYmF6Xy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLlF1eCIsIHF1eF8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLlF1eCIgLCBxdXgyXyAtPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLlF1dXgiLCBxdXV4Ml8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBFbnVtQ29udGFpbmluZ1R5cGUpIHsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfICwgYmF6XyAgLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXyAsIHF1eF8gIC0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBxdXgyXyAtPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgcXV1eDJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTmVzdGVkRW51bXNCeUluZGV4KSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVR5cGVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGJhel8gICwgbWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIgKSk7CisgIEVYUEVDVF9FUShxdXhfICAsIG1lc3NhZ2VfIC0+RmluZEVudW1UeXBlQnlOYW1lKCJRdXgiICkpOworICBFWFBFQ1RfRVEocXV4Ml8gLCBtZXNzYWdlMl8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiUXV4IiApKTsKKyAgRVhQRUNUX0VRKHF1dXgyXywgbWVzc2FnZTJfLT5GaW5kRW51bVR5cGVCeU5hbWUoIlF1dXgiKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIlF1dXgiICAgICAgKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIgICAgICAgKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVZhbHVlQnlOYW1lKSB7CisgIEVYUEVDVF9FUShhXyAsIG1lc3NhZ2VfIC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQSIpKTsKKyAgRVhQRUNUX0VRKGJfICwgbWVzc2FnZV8gLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCIikpOworICBFWFBFQ1RfRVEoYTJfLCBtZXNzYWdlMl8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkEiKSk7CisgIEVYUEVDVF9FUShjMl8sIG1lc3NhZ2UyXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQyIpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXyAtPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJDIiAgICAgICAgICAgICkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQiIgICAgICAgICAgICApID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IGV4dGVuc2lvbnMuCitjbGFzcyBFeHRlbnNpb25EZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgZW51bSBCYXoge30KKyAgICAvLyAgIG1lc3NhZ2UgUXV4IHt9CisgICAgLy8KKyAgICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgICAvLyAgICAgZXh0ZW5zaW9ucyAxMCB0byAxOTsKKyAgICAvLyAgICAgZXh0ZW5zaW9ucyAzMCB0byAzOTsKKyAgICAvLyAgIH0KKyAgICAvLyAgIGV4dGVuZHMgRm9vIHdpdGggb3B0aW9uYWwgaW50MzIgZm9vX2ludDMyID0gMTA7CisgICAgLy8gICBleHRlbmRzIEZvbyB3aXRoIHJlcGVhdGVkIFRlc3RFbnVtIGZvb19lbnVtID0gMTk7CisgICAgLy8gICBtZXNzYWdlIEJhciB7CisgICAgLy8gICAgIGV4dGVuZHMgRm9vIHdpdGggb3B0aW9uYWwgUXV4IGZvb19tZXNzYWdlID0gMzA7CisgICAgLy8gICAgIC8vICh1c2luZyBRdXggYXMgdGhlIGdyb3VwIHR5cGUpCisgICAgLy8gICAgIGV4dGVuZHMgRm9vIHdpdGggcmVwZWF0ZWQgZ3JvdXAgZm9vX2dyb3VwID0gMzk7CisgICAgLy8gICB9CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICAgIEFkZEVtcHR5RW51bSgmZm9vX2ZpbGUsICJCYXoiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlF1eCIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBmb28gPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkZvbyIpOworICAgIEFkZEV4dGVuc2lvblJhbmdlKGZvbywgMTAsIDIwKTsKKyAgICBBZGRFeHRlbnNpb25SYW5nZShmb28sIDMwLCA0MCk7CisKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19pbnQzMiIsIDEwLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19lbnVtIiwgMTksCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSkKKyAgICAgIC0+c2V0X3R5cGVfbmFtZSgiQmF6Iik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIGJhciA9IEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiQmFyIik7CisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKGJhciwgIkZvbyIsICJmb29fbWVzc2FnZSIsIDMwLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0UpCisgICAgICAtPnNldF90eXBlX25hbWUoIlF1eCIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihiYXIsICJGb28iLCAiZm9vX2dyb3VwIiwgMzksCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVApCisgICAgICAtPnNldF90eXBlX25hbWUoIlF1eCIpOworCisgICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgorICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+ZW51bV90eXBlX2NvdW50KCkpOworICAgIGJhel8gPSBmb29fZmlsZV8tPmVudW1fdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgzLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBxdXhfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgZm9vXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDEpOworICAgIGJhcl8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmFyXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGJhel87CisgIGNvbnN0IERlc2NyaXB0b3IqIHF1eF87Cit9OworCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEV4dGVuc2lvblJhbmdlcykgeworICBFWFBFQ1RfRVEoMCwgYmFyXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICBBU1NFUlRfRVEoMiwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworCisgIEVYUEVDVF9FUSgxMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDApLT5zdGFydCk7CisgIEVYUEVDVF9FUSgzMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5zdGFydCk7CisKKyAgRVhQRUNUX0VRKDIwLCBmb29fLT5leHRlbnNpb25fcmFuZ2UoMCktPmVuZCk7CisgIEVYUEVDVF9FUSg0MCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5lbmQpOworfTsKKworVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBFeHRlbnNpb25zKSB7CisgIEVYUEVDVF9FUSgwLCBmb29fLT5leHRlbnNpb25fY291bnQoKSk7CisgIEFTU0VSVF9FUSgyLCBmb29fZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDIsIGJhcl8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+aXNfZXh0ZW5zaW9uKCkpOworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+aXNfZXh0ZW5zaW9uKCkpOworICBFWFBFQ1RfVFJVRShiYXJfLT5leHRlbnNpb24oMCktPmlzX2V4dGVuc2lvbigpKTsKKyAgRVhQRUNUX1RSVUUoYmFyXy0+ZXh0ZW5zaW9uKDEpLT5pc19leHRlbnNpb24oKSk7CisKKyAgRVhQRUNUX0VRKCJmb29faW50MzIiICAsIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvb19lbnVtIiAgICwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX21lc3NhZ2UiLCBiYXJfLT5leHRlbnNpb24oMCktPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX2dyb3VwIiAgLCBiYXJfLT5leHRlbnNpb24oMSktPm5hbWUoKSk7CisKKyAgRVhQRUNUX0VRKDEwLCBmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMTksIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgzMCwgYmFyXy0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgzOSwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5udW1iZXIoKSk7CisKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgLCBmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXJfLT5leHRlbnNpb24oMCktPnR5cGUoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT50eXBlKCkpOworCisgIEVYUEVDVF9FUShiYXpfLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+ZW51bV90eXBlKCkpOworICBFWFBFQ1RfRVEocXV4XywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9FUShxdXhfLCBiYXJfLT5leHRlbnNpb24oMSktPm1lc3NhZ2VfdHlwZSgpKTsKKworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMCktPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgYmFyXy0+ZXh0ZW5zaW9uKDApLT5sYWJlbCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIGJhcl8tPmV4dGVuc2lvbigxKS0+bGFiZWwoKSk7CisKKyAgRVhQRUNUX0VRKGZvb18sIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb29fLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEoZm9vXywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb29fLCBiYXJfLT5leHRlbnNpb24oMSktPmNvbnRhaW5pbmdfdHlwZSgpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX0VRKGJhcl8sIGJhcl8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkpOworICBFWFBFQ1RfRVEoYmFyXywgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSk7Cit9OworCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIElzRXh0ZW5zaW9uTnVtYmVyKSB7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlciggOSkpOworICBFWFBFQ1RfVFJVRSAoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMTApKTsKKyAgRVhQRUNUX1RSVUUgKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDE5KSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigyMCkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMjkpKTsKKyAgRVhQRUNUX1RSVUUgKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDMwKSk7CisgIEVYUEVDVF9UUlVFIChmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigzOSkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoNDApKTsKK30KKworVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOYW1lKSB7CisgIC8vIE5vdGUgdGhhdCBGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpIGlzIHRlc3RlZCBieQorICAvLyBGaWxlRGVzY3JpcHRvclRlc3QuCisgIEFTU0VSVF9FUSgyLCBiYXJfLT5leHRlbnNpb25fY291bnQoKSk7CisKKyAgRVhQRUNUX0VRKGJhcl8tPmV4dGVuc2lvbigwKSwgYmFyXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUShiYXJfLT5leHRlbnNpb24oMSksIGJhcl8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19ncm91cCIgICkpOworCisgIEVYUEVDVF9UUlVFKGJhcl8tPkZpbmRFeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvb18tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19pbnQzMiIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb29fLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fbWVzc2FnZSIpID09IE5VTEwpOworfQorCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEZpbmRBbGxFeHRlbnNpb25zKSB7CisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOworICBwb29sXy5GaW5kQWxsRXh0ZW5zaW9ucyhmb29fLCAmZXh0ZW5zaW9ucyk7CisgIEFTU0VSVF9FUSg0LCBleHRlbnNpb25zLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgZXh0ZW5zaW9uc1swXS0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMTksIGV4dGVuc2lvbnNbMV0tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKDMwLCBleHRlbnNpb25zWzJdLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgzOSwgZXh0ZW5zaW9uc1szXS0+bnVtYmVyKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE1pc2NUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gRnVuY3Rpb24gd2hpY2ggbWFrZXMgYSBmaWVsZCBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiB0eXBlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEdldEZpZWxkRGVzY3JpcHRvck9mVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBmaWxlX3Byb3RvLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgICBBZGRFbXB0eUVudW0oJmZpbGVfcHJvdG8sICJEdW1teUVudW0iKTsKKworICAgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZSA9IEFkZE1lc3NhZ2UoJmZpbGVfcHJvdG8sICJUZXN0TWVzc2FnZSIpOworICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCA9CisgICAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vIiwgMSwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGU+KHN0YXRpY19jYXN0PGludD4odHlwZSkpKTsKKworICAgIGlmICh0eXBlID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIHx8CisgICAgICAgIHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBmaWVsZC0+c2V0X3R5cGVfbmFtZSgiVGVzdE1lc3NhZ2UiKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0pIHsKKyAgICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKCJEdW1teUVudW0iKTsKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgcG9vbF8ucmVzZXQobmV3IERlc2NyaXB0b3JQb29sKCkpOworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8tPkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKworICAgIGlmIChmaWxlICE9IE5VTEwgJiYKKyAgICAgICAgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkgPT0gMSAmJgorICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPmZpZWxkX2NvdW50KCkgPT0gMSkgeworICAgICAgcmV0dXJuIGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIGNvbnN0IGNoYXIqIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IEdldEZpZWxkRGVzY3JpcHRvck9mVHlwZSh0eXBlKTsKKyAgICByZXR1cm4gZmllbGQgIT0gTlVMTCA/IGZpZWxkLT50eXBlX25hbWUoKSA6ICIiOworICB9CisKKyAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKHR5cGUpOworICAgIHJldHVybiBmaWVsZCAhPSBOVUxMID8gZmllbGQtPmNwcF90eXBlKCkgOgorICAgICAgICBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGU+KDApOworICB9CisKKyAgY29uc3QgY2hhciogR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKHR5cGUpOworICAgIHJldHVybiBmaWVsZCAhPSBOVUxMID8gZmllbGQtPmNwcF90eXBlX25hbWUoKSA6ICIiOworICB9CisKKyAgc2NvcGVkX3B0cjxEZXNjcmlwdG9yUG9vbD4gcG9vbF87Cit9OworCitURVNUX0YoTWlzY1Rlc3QsIFR5cGVOYW1lcykgeworICAvLyBUZXN0IHRoYXQgY29ycmVjdCB0eXBlIG5hbWVzIGFyZSByZXR1cm5lZC4KKworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZworCisgIEVYUEVDVF9TVFJFUSgiZG91YmxlIiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUgICkpOworICBFWFBFQ1RfU1RSRVEoImZsb2F0IiAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDY0ICAgKSk7CisgIEVYUEVDVF9TVFJFUSgidWludDY0IiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UNjQgICkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJmaXhlZDY0IiAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZJWEVENjQgKSk7CisgIEVYUEVDVF9TVFJFUSgiZml4ZWQzMiIgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDMyICkpOworICBFWFBFQ1RfU1RSRVEoImJvb2wiICAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQk9PTCAgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHJpbmciICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NUUklORyAgKSk7CisgIEVYUEVDVF9TVFJFUSgiZ3JvdXAiICAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9HUk9VUCAgICkpOworICBFWFBFQ1RfU1RSRVEoIm1lc3NhZ2UiICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSApKTsKKyAgRVhQRUNUX1NUUkVRKCJieXRlcyIgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JZVEVTICAgKSk7CisgIEVYUEVDVF9TVFJFUSgidWludDMyIiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UMzIgICkpOworICBFWFBFQ1RfU1RSRVEoImVudW0iICAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRU5VTSAgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJzZml4ZWQzMiIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDMyKSk7CisgIEVYUEVDVF9TVFJFUSgic2ZpeGVkNjQiLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQ2NCkpOworICBFWFBFQ1RfU1RSRVEoInNpbnQzMiIgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyICApKTsKKyAgRVhQRUNUX1NUUkVRKCJzaW50NjQiICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQ2NCAgKSk7Cit9CisKK1RFU1RfRihNaXNjVGVzdCwgQ3BwVHlwZXMpIHsKKyAgLy8gVGVzdCB0aGF0IENQUCB0eXBlcyBhcmUgYXNzaWduZWQgY29ycmVjdGx5LgorCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0RPVUJMRSAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRE9VQkxFICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0ZMT0FUICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQgICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDY0ICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UNjQgICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQ2NCAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0ICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDMyICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIgICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQ2NCAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQ2NCApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQzMiAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMiApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0JPT0wgICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQk9PTCAgICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1NUUklORyAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU1RSSU5HICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX01FU1NBR0UsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfR1JPVVAgICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX01FU1NBR0UsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1NUUklORyAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQllURVMgICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQzMiAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0VOVU0gICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRU5VTSAgICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDMyICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVEMzIpKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDY0ICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDMyICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyICApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDY0ICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0ICApKTsKK30KKworVEVTVF9GKE1pc2NUZXN0LCBDcHBUeXBlTmFtZXMpIHsKKyAgLy8gVGVzdCB0aGF0IGNvcnJlY3QgQ1BQIHR5cGUgbmFtZXMgYXJlIHJldHVybmVkLgorCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX1NUUkVRKCJkb3VibGUiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRE9VQkxFICApKTsKKyAgRVhQRUNUX1NUUkVRKCJmbG9hdCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UNjQgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0ICApKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQ2NCApKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50MzIiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMiApKTsKKyAgRVhQRUNUX1NUUkVRKCJib29sIiAgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQk9PTCAgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHJpbmciICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU1RSSU5HICApKTsKKyAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfR1JPVVAgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSApKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHJpbmciICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQllURVMgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50MzIiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyICApKTsKKyAgRVhQRUNUX1NUUkVRKCJlbnVtIiAgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRU5VTSAgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVEMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyICApKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0ICApKTsKK30KKworVEVTVF9GKE1pc2NUZXN0LCBEZWZhdWx0VmFsdWVzKSB7CisgIC8vIFRlc3QgdGhhdCBzZXR0aW5nIGRlZmF1bHQgdmFsdWVzIHdvcmtzLgorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOworCisgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZV9wcm90byA9IEFkZEVudW0oJmZpbGVfcHJvdG8sICJEdW1teUVudW0iKTsKKyAgQWRkRW51bVZhbHVlKGVudW1fdHlwZV9wcm90bywgIkEiLCAxKTsKKyAgQWRkRW51bVZhbHVlKGVudW1fdHlwZV9wcm90bywgIkIiLCAyKTsKKworICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2VfcHJvdG8gPSBBZGRNZXNzYWdlKCZmaWxlX3Byb3RvLCAiVGVzdE1lc3NhZ2UiKTsKKworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvclByb3RvIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisgIGNvbnN0IEZEOjpMYWJlbCBsYWJlbCA9IEZEOjpMQUJFTF9PUFRJT05BTDsKKworICAvLyBDcmVhdGUgZmllbGRzIG9mIGV2ZXJ5IENQUCB0eXBlIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbnQzMiIgLCAxLCBsYWJlbCwgRkQ6OlRZUEVfSU5UMzIgKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIi0xIik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbnQ2NCIgLCAyLCBsYWJlbCwgRkQ6OlRZUEVfSU5UNjQgKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIi0xMDAwMDAwMDAwMDAwIik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJ1aW50MzIiLCAzLCBsYWJlbCwgRkQ6OlRZUEVfVUlOVDMyKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIjQyIik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJ1aW50NjQiLCA0LCBsYWJlbCwgRkQ6OlRZUEVfVUlOVDY0KQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIjIwMDAwMDAwMDAwMDAiKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImZsb2F0IiAsIDUsIGxhYmVsLCBGRDo6VFlQRV9GTE9BVCApCisgICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiNC41Iik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJkb3VibGUiLCA2LCBsYWJlbCwgRkQ6OlRZUEVfRE9VQkxFKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIjEwZTEwMCIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiYm9vbCIgICwgNywgbGFiZWwsIEZEOjpUWVBFX0JPT0wgICkKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCJ0cnVlIik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJzdHJpbmciLCA4LCBsYWJlbCwgRkQ6OlRZUEVfU1RSSU5HKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoImhlbGxvIik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJkYXRhIiAgLCA5LCBsYWJlbCwgRkQ6OlRZUEVfQllURVMgKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIlxcMDAxXFwwMDJcXDAwMyIpOworCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBlbnVtX2ZpZWxkID0KKyAgICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZW51bSIsIDEwLCBsYWJlbCwgRkQ6OlRZUEVfRU5VTSk7CisgIGVudW1fZmllbGQtPnNldF90eXBlX25hbWUoIkR1bW15RW51bSIpOworICBlbnVtX2ZpZWxkLT5zZXRfZGVmYXVsdF92YWx1ZSgiQiIpOworCisgIC8vIFN0cmluZ3MgYXJlIGFsbG93ZWQgdG8gaGF2ZSBlbXB0eSBkZWZhdWx0cy4gIChBdCBvbmUgcG9pbnQsIGR1ZSB0bworICAvLyBhIGJ1ZywgZW1wdHkgZGVmYXVsdHMgZm9yIHN0cmluZ3Mgd2VyZSByZWplY3RlZC4gIE9vcHMuKQorICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZW1wdHlfc3RyaW5nIiwgMTEsIGxhYmVsLCBGRDo6VFlQRV9TVFJJTkcpCisgICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiIik7CisKKyAgLy8gQWRkIGEgc2Vjb25kIHNldCBvZiBmaWVsZHMgd2l0aCBpbXBsaWNpdCBkZWZhbHV0IHZhbHVlcy4KKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2ludDMyIiAsIDIxLCBsYWJlbCwgRkQ6OlRZUEVfSU5UMzIgKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2ludDY0IiAsIDIyLCBsYWJlbCwgRkQ6OlRZUEVfSU5UNjQgKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X3VpbnQzMiIsIDIzLCBsYWJlbCwgRkQ6OlRZUEVfVUlOVDMyKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X3VpbnQ2NCIsIDI0LCBsYWJlbCwgRkQ6OlRZUEVfVUlOVDY0KTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2Zsb2F0IiAsIDI1LCBsYWJlbCwgRkQ6OlRZUEVfRkxPQVQgKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2RvdWJsZSIsIDI2LCBsYWJlbCwgRkQ6OlRZUEVfRE9VQkxFKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2Jvb2wiICAsIDI3LCBsYWJlbCwgRkQ6OlRZUEVfQk9PTCAgKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X3N0cmluZyIsIDI4LCBsYWJlbCwgRkQ6OlRZUEVfU1RSSU5HKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2RhdGEiICAsIDI5LCBsYWJlbCwgRkQ6OlRZUEVfQllURVMgKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2VudW0iICAsIDMwLCBsYWJlbCwgRkQ6OlRZUEVfRU5VTSkKKyAgICAtPnNldF90eXBlX25hbWUoIkR1bW15RW51bSIpOworCisgIC8vIEJ1aWxkIGl0LgorICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworCisgIEFTU0VSVF9FUSgxLCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKSk7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBmaWxlLT5lbnVtX3R5cGUoMCk7CisgIEFTU0VSVF9FUSgyLCBlbnVtX3R5cGUtPnZhbHVlX2NvdW50KCkpOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2EgPSBlbnVtX3R5cGUtPnZhbHVlKDApOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2IgPSBlbnVtX3R5cGUtPnZhbHVlKDEpOworCisgIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UgPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCk7CisKKyAgQVNTRVJUX0VRKDIxLCBtZXNzYWdlLT5maWVsZF9jb3VudCgpKTsKKworICAvLyBDaGVjayB0aGUgZGVmYXVsdCB2YWx1ZXMuCisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDApLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoMSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCgyKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDMpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoNCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg1KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDYpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoNyktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg4KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDkpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoMTApLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKworICBFWFBFQ1RfRVEoLTEgICAgICAgICAgICAgICwgbWVzc2FnZS0+ZmllbGQoMCktPmRlZmF1bHRfdmFsdWVfaW50MzIgKCkpOworICBFWFBFQ1RfRVEoLUdPT0dMRV9VTE9OR0xPTkcoMTAwMDAwMDAwMDAwMCksCisgICAgICAgICAgICBtZXNzYWdlLT5maWVsZCgxKS0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCAoKSk7CisgIEVYUEVDVF9FUSg0MiAgICAgICAgICAgICAgLCBtZXNzYWdlLT5maWVsZCgyKS0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSk7CisgIEVYUEVDVF9FUShHT09HTEVfVUxPTkdMT05HKDIwMDAwMDAwMDAwMDApLAorICAgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoMyktPmRlZmF1bHRfdmFsdWVfdWludDY0KCkpOworICBFWFBFQ1RfRVEoNC41ICAgICAgICAgICAgICwgbWVzc2FnZS0+ZmllbGQoNCktPmRlZmF1bHRfdmFsdWVfZmxvYXQgKCkpOworICBFWFBFQ1RfRVEoMTBlMTAwICAgICAgICAgICwgbWVzc2FnZS0+ZmllbGQoNSktPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkpOworICBFWFBFQ1RfVFJVRSggICAgICAgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoNiktPmRlZmF1bHRfdmFsdWVfYm9vbCAgKCkpOworICBFWFBFQ1RfRVEoImhlbGxvIiAgICAgICAgICwgbWVzc2FnZS0+ZmllbGQoNyktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIlwwMDFcMDAyXDAwMyIgICwgbWVzc2FnZS0+ZmllbGQoOCktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZV9iICAgICwgbWVzc2FnZS0+ZmllbGQoOSktPmRlZmF1bHRfdmFsdWVfZW51bSAgKCkpOworICBFWFBFQ1RfRVEoIiIgICAgICAgICAgICAgICwgbWVzc2FnZS0+ZmllbGQoMTApLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTEpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDEyKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxMyktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTQpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE1KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxNiktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTcpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE4KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxOSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMjApLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UtPmZpZWxkKDExKS0+ZGVmYXVsdF92YWx1ZV9pbnQzMiAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS0+ZmllbGQoMTIpLT5kZWZhdWx0X3ZhbHVlX2ludDY0ICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLT5maWVsZCgxMyktPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UtPmZpZWxkKDE0KS0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSk7CisgIEVYUEVDVF9FUSgwLjBmICwgbWVzc2FnZS0+ZmllbGQoMTUpLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0ICgpKTsKKyAgRVhQRUNUX0VRKDAuMCAgLCBtZXNzYWdlLT5maWVsZCgxNiktPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UtPmZpZWxkKDE3KS0+ZGVmYXVsdF92YWx1ZV9ib29sICAoKSk7CisgIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS0+ZmllbGQoMTgpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLT5maWVsZCgxOSktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZV9hLCBtZXNzYWdlLT5maWVsZCgyMCktPmRlZmF1bHRfdmFsdWVfZW51bSgpKTsKK30KKworVEVTVF9GKE1pc2NUZXN0LCBGaWVsZE9wdGlvbnMpIHsKKyAgLy8gVHJ5IHNldHRpbmcgZmllbGQgb3B0aW9ucy4KKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOworCisgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZV9wcm90byA9IEFkZE1lc3NhZ2UoJmZpbGVfcHJvdG8sICJUZXN0TWVzc2FnZSIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZm9vIiwgMSwKKyAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBiYXJfcHJvdG8gPQorICAgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJiYXIiLCAyLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisKKyAgRmllbGRPcHRpb25zKiBvcHRpb25zID0gYmFyX3Byb3RvLT5tdXRhYmxlX29wdGlvbnMoKTsKKyAgb3B0aW9ucy0+c2V0X2N0eXBlKEZpZWxkT3B0aW9uczo6Q09SRCk7CisKKyAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgorICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworCisgIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UgPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UtPmZpZWxkX2NvdW50KCkpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZvbyA9IG1lc3NhZ2UtPmZpZWxkKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhciA9IG1lc3NhZ2UtPmZpZWxkKDEpOworCisgIC8vICJmb28iIGhhZCBubyBvcHRpb25zIHNldCwgc28gaXQgc2hvdWxkIHJldHVybiB0aGUgZGVmYXVsdCBvcHRpb25zLgorICBFWFBFQ1RfRVEoJkZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpLCAmZm9vLT5vcHRpb25zKCkpOworCisgIC8vICJiYXIiIGhhZCBvcHRpb25zIHNldC4KKyAgRVhQRUNUX05FKCZGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSwgb3B0aW9ucyk7CisgIEVYUEVDVF9UUlVFKGJhci0+b3B0aW9ucygpLmhhc19jdHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkT3B0aW9uczo6Q09SRCwgYmFyLT5vcHRpb25zKCkuY3R5cGUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2VudW0gRGVzY3JpcHRvclBvb2xNb2RlIHsKKyAgTk9fREFUQUJBU0UsCisgIEZBTExCQUNLX0RBVEFCQVNFCit9OworCitjbGFzcyBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0CisgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxEZXNjcmlwdG9yUG9vbE1vZGU+IHsKKyBwcm90ZWN0ZWQ6CisgIERlc2NyaXB0b3JQb29sTW9kZSBtb2RlKCkgeworICAgIHJldHVybiBHZXRQYXJhbSgpOworICAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19wcm90bywgYmFyX3Byb3RvOworCisgICAgc3dpdGNoIChtb2RlKCkpIHsKKyAgICAgIGNhc2UgTk9fREFUQUJBU0U6CisgICAgICAgIHBvb2xfLnJlc2V0KG5ldyBEZXNjcmlwdG9yUG9vbCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGQUxMQkFDS19EQVRBQkFTRToKKyAgICAgICAgcG9vbF8ucmVzZXQobmV3IERlc2NyaXB0b3JQb29sKCZkYl8pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcG9vbF8tPkFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpOworCisgICAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nIgorICAgICAgImRlcGVuZGVuY3k6ICdiYXIucHJvdG8nIgorICAgICAgImRlcGVuZGVuY3k6ICdiYXoucHJvdG8nIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0ZvbyciCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidCYXInIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2JheicgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidCYXonIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6J3F1eCcgbnVtYmVyOjMgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCisgICAgICAiICAgIHR5cGVfbmFtZTogJy5jb3JnZS5RdXgnIgorICAgICAgIiAgICB0eXBlOiBUWVBFX0VOVU0iCisgICAgICAiICAgIG9wdGlvbnMgeyIKKyAgICAgICIgICAgICB1bmludGVycHJldGVkX29wdGlvbiB7IgorICAgICAgIiAgICAgICAgbmFtZSB7IgorICAgICAgIiAgICAgICAgICBuYW1lX3BhcnQ6ICdncmF1bHQnIgorICAgICAgIiAgICAgICAgICBpc19leHRlbnNpb246IHRydWUiCisgICAgICAiICAgICAgICB9IgorICAgICAgIiAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0IgorICAgICAgIiAgICAgIH0iCisgICAgICAiICAgIH0iCisgICAgICAiICB9IgorICAgICAgIn0iLAorICAgICAgJmZvb19wcm90bykpOworICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAgICJuYW1lOiAnYmFyLnByb3RvJyIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiAnQmFyJyB9IiwKKyAgICAgICZiYXJfcHJvdG8pKTsKKworICAgIC8vIENvbGxlY3QgcG9pbnRlcnMgdG8gc3R1ZmYuCisgICAgYmFyX2ZpbGVfID0gQnVpbGRGaWxlKGJhcl9wcm90byk7CisgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGJhcl90eXBlXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgZm9vX2ZpbGVfID0gQnVpbGRGaWxlKGZvb19wcm90byk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvb190eXBlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDMsIGZvb190eXBlXy0+ZmllbGRfY291bnQoKSk7CisgICAgYmFyX2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMCk7CisgICAgYmF6X2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMSk7CisgICAgcXV4X2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMik7CisgIH0KKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgICAgc3dpdGNoIChtb2RlKCkpIHsKKyAgICAgIGNhc2UgTk9fREFUQUJBU0U6CisgICAgICAgIHJldHVybiBwb29sXy0+QnVpbGRGaWxlKHByb3RvKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZBTExCQUNLX0RBVEFCQVNFOiB7CisgICAgICAgIEVYUEVDVF9UUlVFKGRiXy5BZGQocHJvdG8pKTsKKyAgICAgICAgcmV0dXJuIHBvb2xfLT5GaW5kRmlsZUJ5TmFtZShwcm90by5uYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhcl90eXBlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vX3R5cGVfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhcl9maWVsZF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmF6X2ZpZWxkXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBxdXhfZmllbGRfOworCisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYl87ICAgICAgICAvLyB1c2VkIGlmIGluIEZBTExCQUNLX0RBVEFCQVNFIG1vZGUuCisgIHNjb3BlZF9wdHI8RGVzY3JpcHRvclBvb2w+IHBvb2xfOworfTsKKworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFBsYWNlaG9sZGVyRmlsZSkgeworICBBU1NFUlRfRVEoMiwgZm9vX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBmb29fZmlsZV8tPmRlcGVuZGVuY3koMCkpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXpfZmlsZSA9IGZvb19maWxlXy0+ZGVwZW5kZW5jeSgxKTsKKyAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBiYXpfZmlsZS0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKDAsIGJhel9maWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisKKyAgLy8gUGxhY2Vob2xkZXIgZmlsZXMgc2hvdWxkIG5vdCBiZSBmaW5kYWJsZS4KKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgcG9vbF8tPkZpbmRGaWxlQnlOYW1lKGJhcl9maWxlXy0+bmFtZSgpKSk7CisgIEVYUEVDVF9UUlVFKHBvb2xfLT5GaW5kRmlsZUJ5TmFtZShiYXpfZmlsZS0+bmFtZSgpKSA9PSBOVUxMKTsKK30KKworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFBsYWNlaG9sZGVyVHlwZXMpIHsKKyAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXJfZmllbGRfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYmFyX3R5cGVfLCBiYXJfZmllbGRfLT5tZXNzYWdlX3R5cGUoKSk7CisKKyAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXpfZmllbGRfLT50eXBlKCkpOworICBjb25zdCBEZXNjcmlwdG9yKiBiYXpfdHlwZSA9IGJhel9maWVsZF8tPm1lc3NhZ2VfdHlwZSgpOworICBFWFBFQ1RfRVEoIkJheiIsIGJhel90eXBlLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIkJheiIsIGJhel90eXBlLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiQmF6LnBsYWNlaG9sZGVyLnByb3RvIiwgYmF6X3R5cGUtPmZpbGUoKS0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKDAsIGJhel90eXBlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSk7CisKKyAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNLCBxdXhfZmllbGRfLT50eXBlKCkpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogcXV4X3R5cGUgPSBxdXhfZmllbGRfLT5lbnVtX3R5cGUoKTsKKyAgRVhQRUNUX0VRKCJRdXgiLCBxdXhfdHlwZS0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5RdXgiLCBxdXhfdHlwZS0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLlF1eC5wbGFjZWhvbGRlci5wcm90byIsIHF1eF90eXBlLT5maWxlKCktPm5hbWUoKSk7CisKKyAgLy8gUGxhY2Vob2xkZXIgdHlwZXMgc2hvdWxkIG5vdCBiZSBmaW5kYWJsZS4KKyAgRVhQRUNUX0VRKGJhcl90eXBlXywgcG9vbF8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShiYXJfdHlwZV8tPmZ1bGxfbmFtZSgpKSk7CisgIEVYUEVDVF9UUlVFKHBvb2xfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoYmF6X3R5cGUtPmZ1bGxfbmFtZSgpKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8tPkZpbmRFbnVtVHlwZUJ5TmFtZShxdXhfdHlwZS0+ZnVsbF9uYW1lKCkpID09IE5VTEwpOworfQorCitURVNUX1AoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgQ29weVRvKSB7CisgIC8vIEZpZWxkRGVzY3JpcHRvcjo6Q29weVRvKCkgc2hvdWxkIHdyaXRlIG5vbi1mdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lcworICAvLyBmb3IgcGxhY2Vob2xkZXIgdHlwZXMgd2hpY2ggd2VyZSBub3Qgb3JpZ2luYWxseSBmdWxseS1xdWFsaWZpZWQuCisgIEZpZWxkRGVzY3JpcHRvclByb3RvIHByb3RvOworCisgIC8vIEJhciBpcyBub3QgYSBwbGFjZWhvbGRlciwgc28gaXQgaXMgZnVsbHktcXVhbGlmaWVkLgorICBiYXJfZmllbGRfLT5Db3B5VG8oJnByb3RvKTsKKyAgRVhQRUNUX0VRKCIuQmFyIiwgcHJvdG8udHlwZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRSwgcHJvdG8udHlwZSgpKTsKKworICAvLyBCYXogaXMgYW4gdW5xdWFsaWZpZWQgcGxhY2Vob2xkZXIuCisgIHByb3RvLkNsZWFyKCk7CisgIGJhel9maWVsZF8tPkNvcHlUbygmcHJvdG8pOworICBFWFBFQ1RfRVEoIkJheiIsIHByb3RvLnR5cGVfbmFtZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHByb3RvLmhhc190eXBlKCkpOworCisgIC8vIFF1eCBpcyBhIGZ1bGx5LXF1YWxpZmllZCBwbGFjZWhvbGRlci4KKyAgcHJvdG8uQ2xlYXIoKTsKKyAgcXV4X2ZpZWxkXy0+Q29weVRvKCZwcm90byk7CisgIEVYUEVDVF9FUSgiLmNvcmdlLlF1eCIsIHByb3RvLnR5cGVfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0VOVU0sIHByb3RvLnR5cGUoKSk7Cit9CisKK1RFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBDdXN0b21PcHRpb25zKSB7CisgIC8vIFF1eCBzaG91bGQgc3RpbGwgaGF2ZSB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24gYXR0YWNoZWQuCisgIEFTU0VSVF9FUSgxLCBxdXhfZmllbGRfLT5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uID0KKyAgICBxdXhfZmllbGRfLT5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7CisgIEFTU0VSVF9FUSgxLCBvcHRpb24ubmFtZV9zaXplKCkpOworICBFWFBFQ1RfRVEoImdyYXVsdCIsIG9wdGlvbi5uYW1lKDApLm5hbWVfcGFydCgpKTsKK30KKworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFVua25vd25FeHRlbmRlZSkgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIGV4dGVuZCBhbiB1bmtub3duIHR5cGUuICBUaGlzIGlzIHNsaWdodGx5IHRyaWNreSBiZWNhdXNlCisgIC8vIGl0IG1lYW5zIHRoYXQgdGhlIHBsYWNlaG9sZGVyIHR5cGUgbXVzdCBoYXZlIGFuIGV4dGVuc2lvbiByYW5nZS4KKworICBGaWxlRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbl9wcm90bzsKKworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgIm5hbWU6ICdleHRlbnNpb24ucHJvdG8nIgorICAgICJleHRlbnNpb24geyBleHRlbmRlZTogJ1Vua25vd25UeXBlJyBuYW1lOidzb21lX2V4dGVuc2lvbicgbnVtYmVyOjEyMyIKKyAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iLAorICAgICZleHRlbnNpb25fcHJvdG8pKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBCdWlsZEZpbGUoZXh0ZW5zaW9uX3Byb3RvKTsKKworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworCisgIEFTU0VSVF9FUSgxLCBmaWxlLT5leHRlbnNpb25fY291bnQoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlID0gZmlsZS0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKTsKKyAgRVhQRUNUX0VRKCJVbmtub3duVHlwZSIsIGV4dGVuZGVlLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIGV4dGVuZGVlLT5leHRlbnNpb25fcmFuZ2UoMCktPnN0YXJ0KTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciArIDEsIGV4dGVuZGVlLT5leHRlbnNpb25fcmFuZ2UoMCktPmVuZCk7Cit9CisKK1RFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBDdXN0b21PcHRpb24pIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbiB1c2UgYSBjdXN0b20gb3B0aW9uIHdpdGhvdXQgaGF2aW5nIHBhcnNlZAorICAvLyBkZXNjcmlwdG9yLnByb3RvLgorCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3B0aW9uX3Byb3RvOworCisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAibmFtZTogXCJ1bmtub3duX2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyAiCisgICAgIiAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgIgorICAgICIgIG5hbWU6IFwic29tZV9vcHRpb25cIiAiCisgICAgIiAgbnVtYmVyOiAxMjM0NTYgIgorICAgICIgIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgdHlwZTogVFlQRV9JTlQzMiAiCisgICAgIn0gIgorICAgICJvcHRpb25zIHsgIgorICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgbmFtZSB7ICIKKyAgICAiICAgICAgbmFtZV9wYXJ0OiBcInNvbWVfb3B0aW9uXCIgIgorICAgICIgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICIgICAgfSAiCisgICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICIgIH0gIgorICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgbmFtZSB7ICIKKyAgICAiICAgICAgbmFtZV9wYXJ0OiBcInVua25vd25fb3B0aW9uXCIgIgorICAgICIgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICIgICAgfSAiCisgICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICIgIH0gIgorICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgbmFtZSB7ICIKKyAgICAiICAgICAgbmFtZV9wYXJ0OiBcIm9wdGltaXplX2ZvclwiICIKKyAgICAiICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiU1BFRURcIiAiCisgICAgIiAgfSAiCisgICAgIn0iLAorICAgICZvcHRpb25fcHJvdG8pKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IEJ1aWxkRmlsZShvcHRpb25fcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworCisgIC8vIFZlcmlmeSB0aGF0IG5vIGV4dGVuc2lvbiBvcHRpb25zIHdlcmUgc2V0LCBidXQgdGhleSB3ZXJlIGxlZnQgYXMKKyAgLy8gdW5pbnRlcnByZXRlZF9vcHRpb25zLgorICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBmaWxlLT5vcHRpb25zKCkuR2V0UmVmbGVjdGlvbigpLT5MaXN0RmllbGRzKGZpbGUtPm9wdGlvbnMoKSwgJmZpZWxkcyk7CisgIEFTU0VSVF9FUSgyLCBmaWVsZHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoZmlsZS0+b3B0aW9ucygpLmhhc19vcHRpbWl6ZV9mb3IoKSk7CisgIEVYUEVDVF9FUSgyLCBmaWxlLT5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsKK30KKworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsCisgICAgICAgVW5kZWNsYXJlZERlcGVuZGVuY3lUcmlnZ2Vyc0J1aWxkT2ZEZXBlbmRlbmN5KSB7CisgIC8vIENyYXp5IGNhc2U6IHN1cHBvc2UgZm9vLnByb3RvIHJlZmVycyB0byBhIHN5bWJvbCB3aXRob3V0IGRlY2xhcmluZyB0aGUKKyAgLy8gZGVwZW5kZW5jeSB0aGF0IGZpbmRzIGl0LiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9vbCBpcyBiYWNrZWQgYnkgYQorICAvLyBEZXNjcmlwdG9yRGF0YWJhc2UsIHRoZSBwb29sIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBzeW1ib2wgaW4gdGhlCisgIC8vIGRhdGFiYXNlLiBJZiBzdWNjZXNzZnVsLCBpdCB3aWxsIGJ1aWxkIHRoZSB1bmRlY2xhcmVkIGRlcGVuZGVuY3kgdG8gdmVyaWZ5CisgIC8vIHRoYXQgdGhlIGZpbGUgZG9lcyBpbmRlZWQgY29udGFpbiB0aGUgc3ltYm9sLiBJZiB0aGF0IGZpbGUgZmFpbHMgdG8gYnVpbGQsCisgIC8vIHRoZW4gaXRzIGRlc2NyaXB0b3JzIG11c3QgYmUgcm9sbGVkIGJhY2suIEhvd2V2ZXIsIHdlIHN0aWxsIHdhbnQgZm9vLnByb3RvCisgIC8vIHRvIGJ1aWxkIHN1Y2Nlc3NmdWxseSwgc2luY2Ugd2UgYXJlIGFsbG93aW5nIHVua25vd24gZGVwZW5kZW5jaWVzLgorCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5kZWNsYXJlZF9kZXBfcHJvdG87CisgIC8vIFdlIG1ha2UgdGhpcyBmaWxlIGZhaWwgdG8gYnVpbGQgYnkgZ2l2aW5nIGl0IHR3byBmaWVsZHMgd2l0aCB0YWcgMS4KKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICJuYW1lOiBcImludmFsaWRfZmlsZV9hc191bmRlY2xhcmVkX2RlcC5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJ1bmRlY2xhcmVkXCIgIgorICAgICJtZXNzYWdlX3R5cGU6IHsgICIKKyAgICAiICBuYW1lOiBcIlF1dXhcIiAgIgorICAgICIgIGZpZWxkIHsgIgorICAgICIgICAgbmFtZToncXV4JyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyICIKKyAgICAiICB9IgorICAgICIgIGZpZWxkIHsgIgorICAgICIgICAgbmFtZToncXV1eCcgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQ2NCAiCisgICAgIiAgfSIKKyAgICAifSIsCisgICAgJnVuZGVjbGFyZWRfZGVwX3Byb3RvKSk7CisgIC8vIFdlIGNhbid0IHVzZSB0aGUgQnVpbGRGaWxlKCkgaGVscGVyIGJlY2F1c2Ugd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBidWlsZAorICAvLyBpdCBpbnRvIHRoZSBkZXNjcmlwdG9yIHBvb2wgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIGNhc2U6IGl0IGp1c3QgbmVlZHMgdG8KKyAgLy8gYmUgc2l0dGluZyBpbiB0aGUgZGF0YWJhc2Ugc28gdGhhdCBpdCBnZXRzIGJ1aWx0IGR1cmluZyB0aGUgYnVpbGRpbmcgb2YKKyAgLy8gdGVzdC5wcm90byBiZWxvdy4KKyAgc3dpdGNoIChtb2RlKCkpIHsKKyAgICBjYXNlIE5PX0RBVEFCQVNFOiB7CisgICAgICBBU1NFUlRfVFJVRShwb29sXy0+QnVpbGRGaWxlKHVuZGVjbGFyZWRfZGVwX3Byb3RvKSA9PSBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZBTExCQUNLX0RBVEFCQVNFOiB7CisgICAgICBBU1NFUlRfVFJVRShkYl8uQWRkKHVuZGVjbGFyZWRfZGVwX3Byb3RvKSk7CisgICAgfQorICB9CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byB0ZXN0X3Byb3RvOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgIm5hbWU6IFwidGVzdC5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlOiB7ICIKKyAgICAiICBuYW1lOiBcIkNvcmdlXCIgIgorICAgICIgIGZpZWxkIHsgIgorICAgICIgICAgbmFtZToncXV1eCcgbnVtYmVyOjEgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgIHR5cGVfbmFtZTondW5kZWNsYXJlZC5RdXV4JyB0eXBlOiBUWVBFX01FU1NBR0UgIgorICAgICIgIH0iCisgICAgIn0iLAorICAgICZ0ZXN0X3Byb3RvKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBCdWlsZEZpbGUodGVzdF9wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgZmlsZS0+RGVidWdTdHJpbmcoKTsKKworICBFWFBFQ1RfRVEoMCwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgY29uc3QgRGVzY3JpcHRvciogY29yZ2VfZGVzYyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKTsKKyAgQVNTRVJUX0VRKCJDb3JnZSIsIGNvcmdlX2Rlc2MtPm5hbWUoKSk7CisgIEFTU0VSVF9FUSgxLCBjb3JnZV9kZXNjLT5maWVsZF9jb3VudCgpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHF1dXhfZmllbGQgPSBjb3JnZV9kZXNjLT5maWVsZCgwKTsKKyAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBxdXV4X2ZpZWxkLT50eXBlKCkpOworICBBU1NFUlRfRVEoIlF1dXgiLCBxdXV4X2ZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bmFtZSgpKTsKKyAgQVNTRVJUX0VRKCJ1bmRlY2xhcmVkLlF1dXgiLCBxdXV4X2ZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoInVuZGVjbGFyZWQuUXV1eC5wbGFjZWhvbGRlci5wcm90byIsCisgICAgICAgICAgICBxdXV4X2ZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpLT5uYW1lKCkpOworICAvLyBUaGUgcGxhY2UgaG9sZGVyIHR5cGUgc2hvdWxkIG5vdCBiZSBmaW5kYWJsZS4KKyAgQVNTRVJUX1RSVUUocG9vbF8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgidW5kZWNsYXJlZC5RdXV4IikgPT0gTlVMTCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERhdGFiYXNlU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhOT19EQVRBQkFTRSwgRkFMTEJBQ0tfREFUQUJBU0UpKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUKEN1c3RvbU9wdGlvbnMsIE9wdGlvbkxvY2F0aW9ucykgeworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlID0KKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zOjpkZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gbWVzc2FnZS0+ZmlsZSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbWVzc2FnZS0+RmluZEZpZWxkQnlOYW1lKCJmaWVsZDEiKTsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVubSA9IG1lc3NhZ2UtPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQW5FbnVtIik7CisgIC8vIFRPRE8oYmVuankpOiBTdXBwb3J0IEVudW1WYWx1ZSBvcHRpb25zLCBvbmNlIHRoZSBjb21waWxlciBkb2VzLgorICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSA9CisgICAgICBmaWxlLT5GaW5kU2VydmljZUJ5TmFtZSgiVGVzdFNlcnZpY2VXaXRoQ3VzdG9tT3B0aW9ucyIpOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBzZXJ2aWNlLT5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKTsKKworICBFWFBFQ1RfRVEoR09PR0xFX0xPTkdMT05HKDk4NzY1NDMyMTApLAorICAgICAgICAgICAgZmlsZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmlsZV9vcHQxKSk7CisgIEVYUEVDVF9FUSgtNTYsCisgICAgICAgICAgICBtZXNzYWdlLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjptZXNzYWdlX29wdDEpKTsKKyAgRVhQRUNUX0VRKEdPT0dMRV9MT05HTE9ORyg4NzY1NDMyMTA5KSwKKyAgICAgICAgICAgIGZpZWxkLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaWVsZF9vcHQxKSk7CisgIEVYUEVDVF9FUSg0MiwgIC8vIENoZWNrIHRoYXQgd2UgZ2V0IHRoZSBkZWZhdWx0IGZvciBhbiBvcHRpb24gd2UgZG9uJ3Qgc2V0LgorICAgICAgICAgICAgZmllbGQtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpZWxkX29wdDIpKTsKKyAgRVhQRUNUX0VRKC03ODksCisgICAgICAgICAgICBlbm0tPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmVudW1fb3B0MSkpOworICBFWFBFQ1RfRVEoMTIzLAorICAgICAgICAgICAgZW5tLT52YWx1ZSgxKS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OmVudW1fdmFsdWVfb3B0MSkpOworICBFWFBFQ1RfRVEoR09PR0xFX0xPTkdMT05HKC05ODc2NTQzMjEwKSwKKyAgICAgICAgICAgIHNlcnZpY2UtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNlcnZpY2Vfb3B0MSkpOworICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6Ok1FVEhPRE9QVDFfVkFMMiwKKyAgICAgICAgICAgIG1ldGhvZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6bWV0aG9kX29wdDEpKTsKKworICAvLyBTZWUgdGhhdCB0aGUgcmVndWxhciBvcHRpb25zIHdlbnQgdGhyb3VnaCB1bnNjYXRoZWQuCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPm9wdGlvbnMoKS5oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSk7CisgIEVYUEVDVF9FUShGaWVsZE9wdGlvbnM6OkNPUkQsIGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSk7Cit9CisKK1RFU1QoQ3VzdG9tT3B0aW9ucywgT3B0aW9uVHlwZXMpIHsKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMqIG9wdGlvbnMgPSBOVUxMOworCisgIG9wdGlvbnMgPQorICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpib29sX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDMybWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDMyX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDY0bWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDY0X29wdCkpOworICBFWFBFQ1RfRVEoMCAgICAgICAgLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnVpbnQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKDAgICAgICAgICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojp1aW50NjRfb3B0KSk7CisgIEVYUEVDVF9FUShraW50MzJtaW4sIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ludDMyX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDY0bWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNpbnQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKDAgICAgICAgICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaXhlZDMyX29wdCkpOworICBFWFBFQ1RfRVEoMCAgICAgICAgLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpeGVkNjRfb3B0KSk7CisgIEVYUEVDVF9FUShraW50MzJtaW4sIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ZpeGVkMzJfb3B0KSk7CisgIEVYUEVDVF9FUShraW50NjRtaW4sIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ZpeGVkNjRfb3B0KSk7CisKKyAgb3B0aW9ucyA9CisgICAgICAmcHJvdG9idWZfdW5pdHRlc3Q6OkN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXM6OmRlc2NyaXB0b3IoKS0+b3B0aW9ucygpOworICBFWFBFQ1RfVFJVRSggICAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpib29sX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDMybWF4ICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjppbnQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQ2NG1heCAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6aW50NjRfb3B0KSk7CisgIEVYUEVDVF9FUShrdWludDMybWF4LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnVpbnQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGt1aW50NjRtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6dWludDY0X29wdCkpOworICBFWFBFQ1RfRVEoa2ludDMybWF4ICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzaW50MzJfb3B0KSk7CisgIEVYUEVDVF9FUShraW50NjRtYXggLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNpbnQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGt1aW50MzJtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Zml4ZWQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGt1aW50NjRtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Zml4ZWQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQzMm1heCAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ZpeGVkMzJfb3B0KSk7CisgIEVYUEVDVF9FUShraW50NjRtYXggLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNmaXhlZDY0X29wdCkpOworCisgIG9wdGlvbnMgPQorICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpDdXN0b21PcHRpb25PdGhlclZhbHVlczo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUSgtMTAwLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDMyX29wdCkpOworICBFWFBFQ1RfRkxPQVRfRVEoMTIuMzQ1Njc4OSwKKyAgICAgICAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmxvYXRfb3B0KSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMS4yMzQ1Njc4OTAxMjM0NTY3ODksCisgICAgICAgICAgICAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpkb3VibGVfb3B0KSk7CisgIEVYUEVDVF9FUSgiSGVsbG8sIFwiV29ybGRcIiIsCisgICAgICAgICAgICBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnN0cmluZ19vcHQpKTsKKworICBFWFBFQ1RfRVEoc3RyaW5nKCJIZWxsb1wwV29ybGQiLCAxMSksCisgICAgICAgICAgICBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmJ5dGVzX29wdCkpOworCisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6RHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW06OlRFU1RfT1BUSU9OX0VOVU1fVFlQRTIsCisgICAgICAgICAgICBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmVudW1fb3B0KSk7CisKKyAgb3B0aW9ucyA9CisgICAgICAmcHJvdG9idWZfdW5pdHRlc3Q6OlNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHM6OmRlc2NyaXB0b3IoKS0+b3B0aW9ucygpOworICBFWFBFQ1RfRkxPQVRfRVEoMTIsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmxvYXRfb3B0KSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMTU0LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmRvdWJsZV9vcHQpKTsKKworICBvcHRpb25zID0KKyAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6U2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50czo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9GTE9BVF9FUSgtMTIsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmxvYXRfb3B0KSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLTE1NCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpkb3VibGVfb3B0KSk7Cit9CisKK1RFU1QoQ3VzdG9tT3B0aW9ucywgQ29tcGxleEV4dGVuc2lvbk9wdGlvbnMpIHsKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMqIG9wdGlvbnMgPQorICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpWYXJpb3VzQ29tcGxleE9wdGlvbnM6OmRlc2NyaXB0b3IoKS0+b3B0aW9ucygpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbygpLCA0Mik7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnF1dXgpLCAzMjQpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLgorICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb3JnZSkucXV4KCksIDg3Nik7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuYmF6KCksIDk4Nyk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmdyYXVsdCksIDY1NCk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuYmFyKCkuZm9vKCksCisgICAgICAgICAgICA3NDMpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcigpLgorICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpxdXV4KSwgMTk5OSk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuYmFyKCkuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvcmdlKS5xdXgoKSwgMjAwOCk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmdhcnBseSkuZm9vKCksIDc0MSk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmdhcnBseSkuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnF1dXgpLCAxOTk4KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Z2FycGx5KS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29yZ2UpLnF1eCgpLCAyMTIxKTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpDb21wbGV4T3B0aW9uVHlwZTI6OkNvbXBsZXhPcHRpb25UeXBlNDo6Y29tcGxleF9vcHQ0KS4KKyAgICAgICAgICAgIHdhbGRvKCksIDE5NzEpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLgorICAgICAgICAgICAgZnJlZCgpLndhbGRvKCksIDMyMSk7CisgIEVYUEVDVF9FUSg5LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MykucXV4KCkpOworICBFWFBFQ1RfRVEoMjIsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQzKS4KKyAgICAgICAgICAgICAgICBjb21wbGV4b3B0aW9udHlwZTUoKS5wbHVnaCgpKTsKKyAgRVhQRUNUX0VRKDI0LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhvcHQ2KS54eXp6eSgpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBPcHRpb25zRnJvbU90aGVyRmlsZSkgeworICAvLyBUZXN0IHRoYXQgdG8gdXNlIGEgY3VzdG9tIG9wdGlvbiwgd2Ugb25seSBuZWVkIHRvIGltcG9ydCB0aGUgZmlsZQorICAvLyBkZWZpbmluZyB0aGUgb3B0aW9uOyB3ZSBkbyBub3QgYWxzbyBoYXZlIHRvIGltcG9ydCBkZXNjcmlwdG9yLnByb3RvLgorICBEZXNjcmlwdG9yUG9vbCBwb29sOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zOjpkZXNjcmlwdG9yKCkKKyAgICAtPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7CisKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICJuYW1lOiBcImN1c3RvbV9vcHRpb25zX2ltcG9ydC5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJwcm90b2J1Zl91bml0dGVzdFwiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG9cIiAiCisgICAgIm9wdGlvbnMgeyAiCisgICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICBuYW1lIHsgIgorICAgICIgICAgICBuYW1lX3BhcnQ6IFwiZmlsZV9vcHQxXCIgIgorICAgICIgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICIgICAgfSAiCisgICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICIgIH0gIgorICAgIC8vIFRlc3QgYSBub24tZXh0ZW5zaW9uIG9wdGlvbiB0b28uICAoQXQgb25lIHBvaW50IHRoaXMgZmFpbGVkIGR1ZSB0byBhCisgICAgLy8gYnVnLikKKyAgICAiICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgIG5hbWUgeyAiCisgICAgIiAgICAgIG5hbWVfcGFydDogXCJqYXZhX3BhY2thZ2VcIiAiCisgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICIgICAgfSAiCisgICAgIiAgICBzdHJpbmdfdmFsdWU6IFwiZm9vXCIgIgorICAgICIgIH0gIgorICAgIC8vIFRlc3QgdGhhdCBlbnVtLXR5cGVkIG9wdGlvbnMgc3RpbGwgd29yayB0b28uICAoQXQgb25lIHBvaW50IHRoaXMgYWxzbworICAgIC8vIGZhaWxlZCBkdWUgdG8gYSBidWcuKQorICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgbmFtZSB7ICIKKyAgICAiICAgICAgbmFtZV9wYXJ0OiBcIm9wdGltaXplX2ZvclwiICIKKyAgICAiICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiU1BFRURcIiAiCisgICAgIiAgfSAiCisgICAgIn0iCisgICAgLAorICAgICZmaWxlX3Byb3RvKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDEyMzQsIGZpbGUtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVfb3B0MSkpOworICBFWFBFQ1RfVFJVRShmaWxlLT5vcHRpb25zKCkuaGFzX2phdmFfcGFja2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBmaWxlLT5vcHRpb25zKCkuamF2YV9wYWNrYWdlKCkpOworICBFWFBFQ1RfVFJVRShmaWxlLT5vcHRpb25zKCkuaGFzX29wdGltaXplX2ZvcigpKTsKKyAgRVhQRUNUX0VRKEZpbGVPcHRpb25zOjpTUEVFRCwgZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBNZXNzYWdlT3B0aW9uVGhyZWVGaWVsZHNTZXQpIHsKKyAgLy8gVGhpcyB0ZXN0cyBhIGJ1ZyB3aGljaCBwcmV2aW91c2x5IGV4aXN0ZWQgaW4gY3VzdG9tIG9wdGlvbnMgcGFyc2luZy4gIFRoZQorICAvLyBidWcgb2NjdXJyZWQgd2hlbiB5b3UgZGVmaW5lZCBhIGN1c3RvbSBvcHRpb24gd2l0aCBtZXNzYWdlIHR5cGUgYW5kIHRoZW4KKyAgLy8gc2V0IHRocmVlIGZpZWxkcyBvZiB0aGF0IG9wdGlvbiBvbiBhIHNpbmdsZSBkZWZpbml0aW9uIChzZWUgdGhlIGV4YW1wbGUKKyAgLy8gYmVsb3cpLiAgVGhlIGJ1ZyBpcyBhIGJpdCBoYXJkIHRvIGV4cGxhaW4sIHNvIGNoZWNrIHRoZSBjaGFuZ2UgaGlzdG9yeSBpZgorICAvLyB5b3Ugd2FudCB0byBrbm93IG1vcmUuCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKQorICAgIC0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKworICAvLyBUaGUgZm9sbG93aW5nIHJlcHJlc2VudHMgdGhlIGRlZmluaXRpb246CisgIC8vCisgIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iCisgIC8vICAgcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKyAgLy8gICBtZXNzYWdlIEZvbyB7CisgIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MSkuZm9vICA9IDEyMzQ7CisgIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MSkuZm9vMiA9IDEyMzQ7CisgIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MSkuZm9vMyA9IDEyMzQ7CisgIC8vICAgfQorICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcInByb3RvYnVmX3VuaXR0ZXN0XCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICIgIG9wdGlvbnMgeyAiCisgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiY29tcGxleF9vcHQxXCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICIgICAgfSAiCisgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiY29tcGxleF9vcHQxXCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb28yXCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0ICIKKyAgICAiICAgIH0gIgorICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiZm9vM1wiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMTIzNCAiCisgICAgIiAgICB9ICIKKyAgICAiICB9ICIKKyAgICAifSIsCisgICAgJmZpbGVfcHJvdG8pKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworCisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zID0gZmlsZS0+bWVzc2FnZV90eXBlKDApLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUSgxMjM0LCBvcHRpb25zLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKS5mb28oKSk7Cit9CisKKy8vIENoZWNrIHRoYXQgYWdncmVnYXRlIG9wdGlvbnMgd2VyZSBwYXJzZWQgYW5kIHNhdmVkIGNvcnJlY3RseSBpbgorLy8gdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0b3JzLgorVEVTVChDdXN0b21PcHRpb25zLCBBZ2dyZWdhdGVPcHRpb25zKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1zZyA9IHByb3RvYnVmX3VuaXR0ZXN0OjpBZ2dyZWdhdGVNZXNzYWdlOjpkZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gbXNnLT5maWxlKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtc2ctPkZpbmRGaWVsZEJ5TmFtZSgiZmllbGRuYW1lIik7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtZCA9IGZpbGUtPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQWdncmVnYXRlRW51bSIpOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtdiA9IGVudW1kLT5GaW5kVmFsdWVCeU5hbWUoIlZBTFVFIik7CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlID0gZmlsZS0+RmluZFNlcnZpY2VCeU5hbWUoCisgICAgICAiQWdncmVnYXRlU2VydmljZSIpOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBzZXJ2aWNlLT5GaW5kTWV0aG9kQnlOYW1lKCJNZXRob2QiKTsKKworICAvLyBUZXN0cyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGVtYmVkZGVkIGluIGZpbGVvcHQKKyAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZSYgZmlsZV9vcHRpb25zID0KKyAgICAgIGZpbGUtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVvcHQpOworICBFWFBFQ1RfRVEoMTAwLCBmaWxlX29wdGlvbnMuaSgpKTsKKyAgRVhQRUNUX0VRKCJGaWxlQW5ub3RhdGlvbiIsIGZpbGVfb3B0aW9ucy5zKCkpOworICBFWFBFQ1RfRVEoIk5lc3RlZEZpbGVBbm5vdGF0aW9uIiwgZmlsZV9vcHRpb25zLnN1YigpLnMoKSk7CisgIEVYUEVDVF9FUSgiRmlsZUV4dGVuc2lvbkFubm90YXRpb24iLAorICAgICAgICAgICAgZmlsZV9vcHRpb25zLmZpbGUoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVvcHQpLnMoKSk7CisgIEVYUEVDVF9FUSgiRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCIsCisgICAgICAgICAgICBmaWxlX29wdGlvbnMubXNldCgpLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6QWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQKKyAgICAgICAgICAgICAgICA6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikucygpKTsKKworICAvLyBTaW1wbGUgdGVzdHMgZm9yIGFsbCB0aGUgb3RoZXIgdHlwZXMgb2YgYW5ub3RhdGlvbnMKKyAgRVhQRUNUX0VRKCJNZXNzYWdlQW5ub3RhdGlvbiIsCisgICAgICAgICAgICBtc2ctPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6Om1zZ29wdCkucygpKTsKKyAgRVhQRUNUX0VRKCJGaWVsZEFubm90YXRpb24iLAorICAgICAgICAgICAgZmllbGQtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpZWxkb3B0KS5zKCkpOworICBFWFBFQ1RfRVEoIkVudW1Bbm5vdGF0aW9uIiwKKyAgICAgICAgICAgIGVudW1kLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtb3B0KS5zKCkpOworICBFWFBFQ1RfRVEoIkVudW1WYWx1ZUFubm90YXRpb24iLAorICAgICAgICAgICAgZW51bXYtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmVudW12YWxvcHQpLnMoKSk7CisgIEVYUEVDVF9FUSgiU2VydmljZUFubm90YXRpb24iLAorICAgICAgICAgICAgc2VydmljZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2VydmljZW9wdCkucygpKTsKKyAgRVhQRUNUX0VRKCJNZXRob2RBbm5vdGF0aW9uIiwKKyAgICAgICAgICAgIG1ldGhvZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6bWV0aG9kb3B0KS5zKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRoZSB0ZXN0cyBiZWxvdyB0cmlnZ2VyIGV2ZXJ5IHVuaXF1ZSBjYWxsIHRvIEFkZEVycm9yKCkgaW4gZGVzY3JpcHRvci5jYywKKy8vIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGF0IGZpbGUuICBJJ20gdXNpbmcgVGV4dEZvcm1hdCBoZXJlCisvLyB0byBzcGVjaWZ5IHRoZSBpbnB1dCBkZXNjcmlwdG9ycyBiZWNhdXNlIGJ1aWxkaW5nIHRoZW0gdXNpbmcgY29kZSB3b3VsZAorLy8gYmUgdG9vIGJ1bGt5LgorCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorCisgIHN0cmluZyB0ZXh0XzsKKworICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgY29uc3QgY2hhciogbG9jYXRpb25fbmFtZSA9IE5VTEw7CisgICAgc3dpdGNoIChsb2NhdGlvbikgeworICAgICAgY2FzZSBOQU1FICAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk5BTUUiICAgICAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJOVU1CRVIiICAgICAgIDsgYnJlYWs7CisgICAgICBjYXNlIFRZUEUgICAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiVFlQRSIgICAgICAgICA7IGJyZWFrOworICAgICAgY2FzZSBFWFRFTkRFRSAgICAgOiBsb2NhdGlvbl9uYW1lID0gIkVYVEVOREVFIiAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgREVGQVVMVF9WQUxVRTogbG9jYXRpb25fbmFtZSA9ICJERUZBVUxUX1ZBTFVFIjsgYnJlYWs7CisgICAgICBjYXNlIE9QVElPTl9OQU1FICA6IGxvY2F0aW9uX25hbWUgPSAiT1BUSU9OX05BTUUiICA7IGJyZWFrOworICAgICAgY2FzZSBPUFRJT05fVkFMVUUgOiBsb2NhdGlvbl9uYW1lID0gIk9QVElPTl9WQUxVRSIgOyBicmVhazsKKyAgICAgIGNhc2UgSU5QVVRfVFlQRSAgIDogbG9jYXRpb25fbmFtZSA9ICJJTlBVVF9UWVBFIiAgIDsgYnJlYWs7CisgICAgICBjYXNlIE9VVFBVVF9UWVBFICA6IGxvY2F0aW9uX25hbWUgPSAiT1VUUFVUX1RZUEUiICA7IGJyZWFrOworICAgICAgY2FzZSBPVEhFUiAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk9USEVSIiAgICAgICAgOyBicmVhazsKKyAgICB9CisKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKAorICAgICAgJnRleHRfLCAiJDA6ICQxOiAkMjogJDNcbiIsCisgICAgICBmaWxlbmFtZSwgZWxlbWVudF9uYW1lLCBsb2NhdGlvbl9uYW1lLCBtZXNzYWdlKTsKKyAgfQorfTsKKworY2xhc3MgVmFsaWRhdGlvbkVycm9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFBhcnNlIGZpbGVfdGV4dCBhcyBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW4gdGV4dCBmb3JtYXQgYW5kIGFkZCBpdAorICAvLyB0byB0aGUgRGVzY3JpcHRvclBvb2wuICBFeHBlY3Qgbm8gZXJyb3JzLgorICB2b2lkIEJ1aWxkRmlsZShjb25zdCBzdHJpbmcmIGZpbGVfdGV4dCkgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOworICAgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKyAgfQorCisgIC8vIFBhcnNlIGZpbGVfdGV4dCBhcyBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW4gdGV4dCBmb3JtYXQgYW5kIGFkZCBpdAorICAvLyB0byB0aGUgRGVzY3JpcHRvclBvb2wuICBFeHBlY3QgZXJyb3JzIHRvIGJlIHByb2R1Y2VkIHdoaWNoIG1hdGNoIHRoZQorICAvLyBnaXZlbiBlcnJvciB0ZXh0LgorICB2b2lkIEJ1aWxkRmlsZVdpdGhFcnJvcnMoY29uc3Qgc3RyaW5nJiBmaWxlX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGV4cGVjdGVkX2Vycm9ycykgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOworCisgICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgIHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywgJmVycm9yX2NvbGxlY3RvcikgPT0gTlVMTCk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Vycm9ycywgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKKyAgfQorCisgIC8vIEJ1aWxkcyBzb21lIGFscmVhZHktcGFyc2VkIGZpbGUgaW4gb3VyIHRlc3QgcG9vbC4KKyAgdm9pZCBCdWlsZEZpbGVJblRlc3RQb29sKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIGZpbGUtPkNvcHlUbygmZmlsZV9wcm90byk7CisgICAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworICB9CisKKyAgLy8gQnVpbGQgZGVzY3JpcHRvci5wcm90byBpbiBvdXIgdGVzdCBwb29sLiBUaGlzIGFsbG93cyB1cyB0byBleHRlbmQgaXQgaW4KKyAgLy8gdGhlIHRlc3QgcG9vbCwgc28gd2UgY2FuIHRlc3QgY3VzdG9tIG9wdGlvbnMuCisgIHZvaWQgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCkgeworICAgIEJ1aWxkRmlsZUluVGVzdFBvb2woRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKSk7CisgIH0KKworICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKK307CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBbHJlYWR5RGVmaW5lZCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9IgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iLAorCisgICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQWxyZWFkeURlZmluZWRJblBhY2thZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwiZm9vLmJhclwiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9IgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iLAorCisgICAgImZvby5wcm90bzogZm9vLmJhci5Gb286IE5BTUU6IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluICIKKyAgICAgICJcImZvby5iYXJcIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQWxyZWFkeURlZmluZWRJbk90aGVyRmlsZSkgeworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9IiwKKworICAgICJiYXIucHJvdG86IEZvbzogTkFNRTogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZmlsZSAiCisgICAgICAiXCJmb28ucHJvdG9cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUGFja2FnZUFscmVhZHlEZWZpbmVkKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiZm9vXCIgfSIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJmb28uYmFyXCIiLAorCisgICAgImJhci5wcm90bzogZm9vOiBOQU1FOiBcImZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgc29tZXRoaW5nIG90aGVyICIKKyAgICAgICJ0aGFuIGEgcGFja2FnZSkgaW4gZmlsZSBcImZvby5wcm90b1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtVmFsdWVBbHJlYWR5RGVmaW5lZEluUGFyZW50KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb1wiIHZhbHVlIHsgbmFtZTogXCJGT09cIiBudW1iZXI6IDEgfSB9ICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6IFwiRk9PXCIgbnVtYmVyOiAxIH0gfSAiLAorCisgICAgImZvby5wcm90bzogRk9POiBOQU1FOiBcIkZPT1wiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIKKyAgICAiZm9vLnByb3RvOiBGT086IE5BTUU6IE5vdGUgdGhhdCBlbnVtIHZhbHVlcyB1c2UgQysrIHNjb3BpbmcgcnVsZXMsICIKKyAgICAgICJtZWFuaW5nIHRoYXQgZW51bSB2YWx1ZXMgYXJlIHNpYmxpbmdzIG9mIHRoZWlyIHR5cGUsIG5vdCBjaGlsZHJlbiBvZiAiCisgICAgICAiaXQuICBUaGVyZWZvcmUsIFwiRk9PXCIgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBnbG9iYWwgc2NvcGUsIG5vdCAiCisgICAgICAianVzdCB3aXRoaW4gXCJCYXJcIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bVZhbHVlQWxyZWFkeURlZmluZWRJblBhcmVudE5vbkdsb2JhbCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJwa2dcIiAiCisgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vXCIgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMSB9IH0gIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTogXCJGT09cIiBudW1iZXI6IDEgfSB9ICIsCisKKyAgICAiZm9vLnByb3RvOiBwa2cuRk9POiBOQU1FOiBcIkZPT1wiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcInBrZ1wiLlxuIgorICAgICJmb28ucHJvdG86IHBrZy5GT086IE5BTUU6IE5vdGUgdGhhdCBlbnVtIHZhbHVlcyB1c2UgQysrIHNjb3BpbmcgcnVsZXMsICIKKyAgICAgICJtZWFuaW5nIHRoYXQgZW51bSB2YWx1ZXMgYXJlIHNpYmxpbmdzIG9mIHRoZWlyIHR5cGUsIG5vdCBjaGlsZHJlbiBvZiAiCisgICAgICAiaXQuICBUaGVyZWZvcmUsIFwiRk9PXCIgbXVzdCBiZSB1bmlxdWUgd2l0aGluIFwicGtnXCIsIG5vdCBqdXN0IHdpdGhpbiAiCisgICAgICAiXCJCYXJcIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWlzc2luZ05hbWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IH0iLAorCisgICAgImZvby5wcm90bzogOiBOQU1FOiBNaXNzaW5nIG5hbWUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludmFsaWROYW1lKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIiRcIiB9IiwKKworICAgICJmb28ucHJvdG86ICQ6IE5BTUU6IFwiJFwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludmFsaWRQYWNrYWdlTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJmb28uJFwiIiwKKworICAgICJmb28ucHJvdG86IGZvby4kOiBOQU1FOiBcIiRcIiBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNaXNzaW5nRmlsZU5hbWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAiIiwKKworICAgICI6IDogT1RIRVI6IE1pc3NpbmcgZmllbGQ6IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRHVwZURlcGVuZGVuY3kpIHsKKyAgQnVpbGRGaWxlKCJuYW1lOiBcImZvby5wcm90b1wiIik7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiLAorCisgICAgImJhci5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW1wb3J0IFwiZm9vLnByb3RvXCIgd2FzIGxpc3RlZCB0d2ljZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVW5rbm93bkRlcGVuZGVuY3kpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIiwKKworICAgICJiYXIucHJvdG86IGJhci5wcm90bzogT1RIRVI6IEltcG9ydCBcImZvby5wcm90b1wiIGhhcyBub3QgYmVlbiBsb2FkZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludmFsaWRQdWJsaWNEZXBlbmRlbmN5SW5kZXgpIHsKKyAgQnVpbGRGaWxlKCJuYW1lOiBcImZvby5wcm90b1wiIik7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKKyAgICAicHVibGljX2RlcGVuZGVuY3k6IDEiLAorICAgICJiYXIucHJvdG86IGJhci5wcm90bzogT1RIRVI6IEludmFsaWQgcHVibGljIGRlcGVuZGVuY3kgaW5kZXguXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZvcmVpZ25VbmltcG9ydGVkUGFja2FnZU5vQ3Jhc2gpIHsKKyAgLy8gVXNlZCB0byBjcmFzaDogIElmIHdlIGRlcGVuZCBvbiBhIG5vbi1leGlzdGVudCBmaWxlIGFuZCB0aGVuIHJlZmVyIHRvIGEKKyAgLy8gcGFja2FnZSBkZWZpbmVkIGluIGEgZmlsZSB0aGF0IHdlIGRpZG4ndCBpbXBvcnQsIGFuZCB0aGF0IHBhY2thZ2UgaXMKKyAgLy8gbmVzdGVkIHdpdGhpbiBhIHBhcmVudCBwYWNrYWdlIHdoaWNoIHRoaXMgZmlsZSBpcyBhbHNvIGluLCBhbmQgd2UgZG9uJ3QKKyAgLy8gaW5jbHVkZSB0aGF0IHBhcmVudCBwYWNrYWdlIGluIHRoZSBuYW1lIChpLmUuIHdlIGRvIGEgcmVsYXRpdmUgbG9va3VwKS4uLgorICAvLyBZZXMsIHJlYWxseS4KKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgInBhY2thZ2U6ICdvdXRlci5mb28nICIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiAnYmFyLnByb3RvJyAiCisgICAgImRlcGVuZGVuY3k6ICdiYXoucHJvdG8nICIKKyAgICAicGFja2FnZTogJ291dGVyLmJhcicgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogJ0JhcicgIgorICAgICIgIGZpZWxkIHsgbmFtZTonYmFyJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6J2Zvby5Gb28nIH0iCisgICAgIn0iLAorCisgICAgImJhci5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW1wb3J0IFwiYmF6LnByb3RvXCIgaGFzIG5vdCBiZWVuIGxvYWRlZC5cbiIKKyAgICAiYmFyLnByb3RvOiBvdXRlci5iYXIuQmFyLmJhcjogVFlQRTogXCJvdXRlci5mb29cIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluICIKKyAgICAgICJcImZvby5wcm90b1wiLCB3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJiYXIucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCAiCisgICAgICAicGxlYXNlIGFkZCB0aGUgbmVjZXNzYXJ5IGltcG9ydC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRHVwZUZpbGUpIHsKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9Iik7CisgIC8vIE5vdGU6ICBXZSBzaG91bGQgKm5vdCogZ2V0IHJlZHVuZGFudCBlcnJvcnMgYWJvdXQgIkZvbyIgYWxyZWFkeSBiZWluZworICAvLyAgIGRlZmluZWQuCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgIC8vIEFkZCBhbm90aGVyIHR5cGUgc28gdGhhdCB0aGUgZmlsZXMgYXJlbid0IGlkZW50aWNhbCAoaW4gd2hpY2ggY2FzZSB0aGVyZQorICAgIC8vIHdvdWxkIGJlIG5vIGVycm9yKS4KKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1RIRVI6IEEgZmlsZSB3aXRoIHRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHRoZSAiCisgICAgICAicG9vbC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRJbkV4dGVuc2lvblJhbmdlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6ICA5IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXJcIiBudW1iZXI6IDEwIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXpcIiBudW1iZXI6IDE5IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJxdXhcIiBudW1iZXI6IDIwIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmJhcjogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTAgdG8gMTkgaW5jbHVkZXMgZmllbGQgIgorICAgICAgIlwiYmFyXCIgKDEwKS5cbiIKKyAgICAiZm9vLnByb3RvOiBGb28uYmF6OiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZSAxMCB0byAxOSBpbmNsdWRlcyBmaWVsZCAiCisgICAgICAiXCJiYXpcIiAoMTkpLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPdmVybGFwcGluZ0V4dGVuc2lvblJhbmdlcykgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAyMCBlbmQ6IDMwIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDE5IGVuZDogMjEgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIDE5IHRvIDIwIG92ZXJsYXBzIHdpdGggIgorICAgICAgImFscmVhZHktZGVmaW5lZCByYW5nZSAxMCB0byAxOS5cbiIKKyAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIDE5IHRvIDIwIG92ZXJsYXBzIHdpdGggIgorICAgICAgImFscmVhZHktZGVmaW5lZCByYW5nZSAyMCB0byAyOS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZERlZmF1bHRzKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorCisgICAgLy8gSW52YWxpZCBudW1iZXIuCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQzMiIKKyAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiYWJjXCIgfSIKKworICAgIC8vIEVtcHR5IGRlZmF1bHQgdmFsdWUuCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMiBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQzMiIKKyAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiXCIgfSIKKworICAgIC8vIEludmFsaWQgYm9vbGVhbi4KKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiYmF6XCIgbnVtYmVyOiAzIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0JPT0wiCisgICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcImFiY1wiIH0iCisKKyAgICAvLyBNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHRzLgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJxdXhcIiBudW1iZXI6IDQgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfTUVTU0FHRSIKKyAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiYWJjXCIgdHlwZV9uYW1lOiBcIkZvb1wiIH0iCisKKyAgICAvLyBTYW1lIHRoaW5nLCBidXQgd2UgZG9uJ3Qga25vdyB0aGF0IHRoaXMgZmllbGQgaGFzIG1lc3NhZ2UgdHlwZSB1bnRpbAorICAgIC8vIHdlIGxvb2sgdXAgdGhlIHR5cGUgbmFtZS4KKyAgICAiICBmaWVsZCB7IG5hbWU6IFwicXV1eFwiIG51bWJlcjogNSBsYWJlbDogTEFCRUxfT1BUSU9OQUwiCisgICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcImFiY1wiIHR5cGVfbmFtZTogXCJGb29cIiB9IgorCisgICAgLy8gUmVwZWF0ZWRzIGNhbid0IGhhdmUgZGVmYXVsdHMuCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImNvcmdlXCIgbnVtYmVyOiA2IGxhYmVsOiBMQUJFTF9SRVBFQVRFRCB0eXBlOiBUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCIxXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBERUZBVUxUX1ZBTFVFOiBDb3VsZG4ndCBwYXJzZSBkZWZhdWx0IHZhbHVlLlxuIgorICAgICJmb28ucHJvdG86IEZvby5iYXI6IERFRkFVTFRfVkFMVUU6IENvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUuXG4iCisgICAgImZvby5wcm90bzogRm9vLmJhejogREVGQVVMVF9WQUxVRTogQm9vbGVhbiBkZWZhdWx0IG11c3QgYmUgdHJ1ZSBvciAiCisgICAgICAiZmFsc2UuXG4iCisgICAgImZvby5wcm90bzogRm9vLnF1eDogREVGQVVMVF9WQUxVRTogTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy5cbiIKKyAgICAiZm9vLnByb3RvOiBGb28uY29yZ2U6IERFRkFVTFRfVkFMVUU6IFJlcGVhdGVkIGZpZWxkcyBjYW4ndCBoYXZlIGRlZmF1bHQgIgorICAgICAgInZhbHVlcy5cbiIKKyAgICAvLyBUaGlzIGVuZHMgdXAgYmVpbmcgcmVwb3J0ZWQgbGF0ZXIgYmVjYXVzZSB0aGUgZXJyb3IgaXMgZGV0ZWN0ZWQgYXQKKyAgICAvLyBjcm9zcy1saW5raW5nIHRpbWUuCisgICAgImZvby5wcm90bzogRm9vLnF1dXg6IERFRkFVTFRfVkFMVUU6IE1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCAiCisgICAgICAidmFsdWVzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOZWdhdGl2ZUZpZWxkTnVtYmVyKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IC0xIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IE5VTUJFUjogRmllbGQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBIdWdlRmllbGROdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMHg3MDAwMDAwMCAiCisgICAgIiAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOVU1CRVI6IEZpZWxkIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAiNTM2ODcwOTExLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZEZpZWxkTnVtYmVyKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHtuYW1lOlwiZm9vXCIgbnVtYmVyOiAxODk5OSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAiICBmaWVsZCB7bmFtZTpcImJhclwiIG51bWJlcjogMTkwMDAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIiAgZmllbGQge25hbWU6XCJiYXpcIiBudW1iZXI6IDE5OTk5IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIGZpZWxkIHtuYW1lOlwicXV4XCIgbnVtYmVyOiAyMDAwMCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBOVU1CRVI6IEZpZWxkIG51bWJlcnMgMTkwMDAgdGhyb3VnaCAxOTk5OSBhcmUgIgorICAgICAgInJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uXG4iCisgICAgImZvby5wcm90bzogRm9vLmJhejogTlVNQkVSOiBGaWVsZCBudW1iZXJzIDE5MDAwIHRocm91Z2ggMTk5OTkgYXJlICIKKyAgICAgICJyZXNlcnZlZCBmb3IgdGhlIHByb3RvY29sIGJ1ZmZlciBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFeHRlbnNpb25NaXNzaW5nRXh0ZW5kZWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDEgbGFiZWw6IExBQkVMX09QVElPTkFMIgorICAgICIgICAgICAgICAgICAgIHR5cGVfbmFtZTogXCJGb29cIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IEVYVEVOREVFOiBGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBub3Qgc2V0IGZvciAiCisgICAgICAiZXh0ZW5zaW9uIGZpZWxkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb25FeHRlbnNpb25XaXRoRXh0ZW5kZWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAyIH0iCisgICAgIn0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDogTEFCRUxfT1BUSU9OQUwiCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6IFwiRm9vXCIgZXh0ZW5kZWU6IFwiQmFyXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBFWFRFTkRFRTogRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUgc2V0IGZvciAiCisgICAgICAibm9uLWV4dGVuc2lvbiBmaWVsZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGROdW1iZXJDb25mbGljdCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXJcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmJhcjogTlVNQkVSOiBGaWVsZCBudW1iZXIgMSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gIgorICAgICAgIlwiRm9vXCIgYnkgZmllbGQgXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQmFkTWVzc2FnZVNldEV4dGVuc2lvblR5cGUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiTWVzc2FnZVNldFwiIgorICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiA0IGVuZDogNSB9IgorICAgICJ9IgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBudW1iZXI6NCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIiCisgICAgIiAgICAgICAgICAgICAgZXh0ZW5kZWU6IFwiTWVzc2FnZVNldFwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsICIKKyAgICAgICJtZXNzYWdlcy5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQmFkTWVzc2FnZVNldEV4dGVuc2lvbkxhYmVsKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIk1lc3NhZ2VTZXRcIiIKKyAgICAiICBvcHRpb25zIHsgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQ6IHRydWUgfSIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogNCBlbmQ6IDUgfSIKKyAgICAifSIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjQgbGFiZWw6TEFCRUxfUkVQRUFURUQgdHlwZTpUWVBFX01FU1NBR0UiCisgICAgIiAgICAgICAgICAgICAgdHlwZV9uYW1lOiBcIkZvb1wiIGV4dGVuZGVlOiBcIk1lc3NhZ2VTZXRcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IEV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldHMgbXVzdCBiZSBvcHRpb25hbCAiCisgICAgICAibWVzc2FnZXMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkSW5NZXNzYWdlU2V0KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogTkFNRTogTWVzc2FnZVNldHMgY2Fubm90IGhhdmUgZmllbGRzLCBvbmx5ICIKKyAgICAgICJleHRlbnNpb25zLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOZWdhdGl2ZUV4dGVuc2lvblJhbmdlTnVtYmVyKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAtMTAgZW5kOiAtMSB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBIdWdlRXh0ZW5zaW9uUmFuZ2VOdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAweDcwMDAwMDAwIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IEV4dGVuc2lvbiBudW1iZXJzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gIgorICAgICAgIjUzNjg3MDkxMS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRXh0ZW5zaW9uUmFuZ2VFbmRCZWZvcmVTdGFydCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAxMCB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDUgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIGVuZCBudW1iZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gIgorICAgICAgInN0YXJ0IG51bWJlci5cbiIKKyAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIGVuZCBudW1iZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gIgorICAgICAgInN0YXJ0IG51bWJlci5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW1wdHlFbnVtKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iCisgICAgLy8gQWxzbyB1c2UgdGhlIGVtcHR5IGVudW0gaW4gYSBtZXNzYWdlIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gY3Jhc2hlcworICAgIC8vIGR1cmluZyB2YWxpZGF0aW9uIChwb3NzaWJsZSBpZiB0aGUgY29kZSBhdHRlbXB0cyB0byBkZXJpdmUgYSBkZWZhdWx0CisgICAgLy8gdmFsdWUgZm9yIHRoZSBmaWVsZCkuCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJGb29cIiB9IgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXJcIiBudW1iZXI6IDIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiRm9vXCIgIgorICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJOT19TVUNIX1ZBTFVFXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEVudW1zIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmFsdWUuXG4iCisgICAgImZvby5wcm90bzogQmFyLmJhcjogREVGQVVMVF9WQUxVRTogRW51bSB0eXBlIFwiRm9vXCIgaGFzIG5vIHZhbHVlIG5hbWVkICIKKyAgICAgICJcIk5PX1NVQ0hfVkFMVUVcIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVW5kZWZpbmVkRXh0ZW5kZWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiIKKyAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IEVYVEVOREVFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb25NZXNzYWdlRXh0ZW5kZWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOlwiRFVNTVlcIiBudW1iZXI6MCB9IH0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiIKKyAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IEVYVEVOREVFOiBcIkJhclwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTm90QW5FeHRlbnNpb25OdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgIn0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiIKKyAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IE5VTUJFUjogXCJCYXJcIiBkb2VzIG5vdCBkZWNsYXJlIDEgYXMgYW4gZXh0ZW5zaW9uICIKKyAgICAgICJudW1iZXIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVuZGVmaW5lZEZpZWxkVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZURlZmluZWRJblVuZGVjbGFyZWREZXBlbmRlbmN5KSB7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSAiKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIkJhclwiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gXCJiYXIucHJvdG9cIiwgIgorICAgICAgIndoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImZvby5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSBhZGQgdGhlICIKKyAgICAgICJuZWNlc3NhcnkgaW1wb3J0LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVEZWZpbmVkSW5JbmRpcmVjdERlcGVuZGVuY3kpIHsKKyAgLy8gVGVzdCBmb3IgaGlkZGVuIGRlcGVuZGVuY2llcy4KKyAgLy8KKyAgLy8gLy8gYmFyLnByb3RvCisgIC8vIG1lc3NhZ2UgQmFye30KKyAgLy8KKyAgLy8gLy8gZm9yd2FyZC5wcm90bworICAvLyBpbXBvcnQgImJhci5wcm90byIKKyAgLy8KKyAgLy8gLy8gZm9vLnByb3RvCisgIC8vIGltcG9ydCAiZm9yd2FyZC5wcm90byIKKyAgLy8gbWVzc2FnZSBGb28geworICAvLyAgIG9wdGlvbmFsIEJhciBmb28gPSAxOyAgLy8gRXJyb3IsIG5lZWRzIHRvIGltcG9ydCBiYXIucHJvdG8gZXhwbGljaXRseS4KKyAgLy8gfQorICAvLworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKKworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiIik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZC5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIkJhclwiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gXCJiYXIucHJvdG9cIiwgIgorICAgICAgIndoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImZvby5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSBhZGQgdGhlICIKKyAgICAgICJuZWNlc3NhcnkgaW1wb3J0LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVEZWZpbmVkSW5QdWJsaWNEZXBlbmRlbmN5KSB7CisgIC8vIFRlc3QgZm9yIHB1YmxpYyBkZXBlbmRlbmNpZXMuCisgIC8vCisgIC8vIC8vIGJhci5wcm90bworICAvLyBtZXNzYWdlIEJhcnt9CisgIC8vCisgIC8vIC8vIGZvcndhcmQucHJvdG8KKyAgLy8gaW1wb3J0IHB1YmxpYyAiYmFyLnByb3RvIgorICAvLworICAvLyAvLyBmb28ucHJvdG8KKyAgLy8gaW1wb3J0ICJmb3J3YXJkLnByb3RvIgorICAvLyBtZXNzYWdlIEZvbyB7CisgIC8vICAgb3B0aW9uYWwgQmFyIGZvbyA9IDE7ICAvLyBDb3JyZWN0LiAiYmFyLnByb3RvIiBpcyBwdWJsaWMgaW1wb3J0ZWQgaW50bworICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yd2FyZC5wcm90bywgc28gd2hlbiAiZm9vLnByb3RvIiBpbXBvcnRzCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiZm9yd2FyZC5wcm90byIsIGl0IGltcG9ydHMgImJhci5wcm90byIgdG9vLgorICAvLyB9CisgIC8vCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb3J3YXJkLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIgorICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMCIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZC5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVEZWZpbmVkSW5UcmFuc2l0aXZlUHVibGljRGVwZW5kZW5jeSkgeworICAvLyBUZXN0IGZvciBwdWJsaWMgZGVwZW5kZW5jaWVzLgorICAvLworICAvLyAvLyBiYXIucHJvdG8KKyAgLy8gbWVzc2FnZSBCYXJ7fQorICAvLworICAvLyAvLyBmb3J3YXJkLnByb3RvCisgIC8vIGltcG9ydCBwdWJsaWMgImJhci5wcm90byIKKyAgLy8KKyAgLy8gLy8gZm9yd2FyZDIucHJvdG8KKyAgLy8gaW1wb3J0IHB1YmxpYyAiZm9yd2FyZC5wcm90byIKKyAgLy8KKyAgLy8gLy8gZm9vLnByb3RvCisgIC8vIGltcG9ydCAiZm9yd2FyZDIucHJvdG8iCisgIC8vIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICBvcHRpb25hbCBCYXIgZm9vID0gMTsgIC8vIENvcnJlY3QsIHB1YmxpYyBpbXBvcnRzIGFyZSB0cmFuc2l0aXZlLgorICAvLyB9CisgIC8vCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb3J3YXJkLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIgorICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMCIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb3J3YXJkMi5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImZvcndhcmQucHJvdG9cIiAiCisgICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7CisKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkMi5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LAorICAgICAgIEZpZWxkVHlwZURlZmluZWRJblByaXZhdGVEZXBlbmRlbmN5T2ZQdWJsaWNEZXBlbmRlbmN5KSB7CisgIC8vIFRlc3QgZm9yIHB1YmxpYyBkZXBlbmRlbmNpZXMuCisgIC8vCisgIC8vIC8vIGJhci5wcm90bworICAvLyBtZXNzYWdlIEJhcnt9CisgIC8vCisgIC8vIC8vIGZvcndhcmQucHJvdG8KKyAgLy8gaW1wb3J0ICJiYXIucHJvdG8iCisgIC8vCisgIC8vIC8vIGZvcndhcmQyLnByb3RvCisgIC8vIGltcG9ydCBwdWJsaWMgImZvcndhcmQucHJvdG8iCisgIC8vCisgIC8vIC8vIGZvby5wcm90bworICAvLyBpbXBvcnQgImZvcndhcmQyLnByb3RvIgorICAvLyBtZXNzYWdlIEZvbyB7CisgIC8vICAgb3B0aW9uYWwgQmFyIGZvbyA9IDE7ICAvLyBFcnJvciwgdGhlICJiYXIucHJvdG8iIGlzIG5vdCBwdWJsaWMgaW1wb3J0ZWQKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gImZvcndhcmQucHJvdG8iLCBzbyB3aWxsIG5vdCBiZSBpbXBvcnRlZAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byBlaXRoZXIgImZvcndhcmQyLnByb3RvIiBvciAiZm9vLnByb3RvIi4KKyAgLy8gfQorICAvLworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKKworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiIik7CisKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvcndhcmQyLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZC5wcm90b1wiICIKKyAgICAicHVibGljX2RlcGVuZGVuY3k6IDAiKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkMi5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIkJhclwiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gXCJiYXIucHJvdG9cIiwgIgorICAgICAgIndoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImZvby5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSBhZGQgdGhlICIKKyAgICAgICJuZWNlc3NhcnkgaW1wb3J0LlxuIik7Cit9CisKKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFNlYXJjaE1vc3RMb2NhbEZpcnN0KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHByb2R1Y2UgYW4gZXJyb3IgdGhhdCBCYXIuQmF6IGlzIG5vdCBkZWZpbmVkOgorICAvLyAgIG1lc3NhZ2UgQmFyIHsgbWVzc2FnZSBCYXoge30gfQorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG1lc3NhZ2UgQmFyIHsKKyAgLy8gICAgICAgLy8gUGxhY2luZyAibWVzc2FnZSBCYXp7fSIgaGVyZSwgb3IgcmVtb3ZpbmcgRm9vLkJhciBhbHRvZ2V0aGVyLAorICAvLyAgICAgICAvLyB3b3VsZCBmaXggdGhlIGVycm9yLgorICAvLyAgICAgfQorICAvLyAgICAgb3B0aW9uYWwgQmFyLkJheiBiYXogPSAxOworICAvLyAgIH0KKyAgLy8gQW4gb25lIHBvaW50IHRoZSBsb29rdXAgY29kZSBpbmNvcnJlY3RseSBkaWQgbm90IHByb2R1Y2UgYW4gZXJyb3IgaW4gdGhpcworICAvLyBjYXNlLCBiZWNhdXNlIHdoZW4gbG9va2luZyBmb3IgQmFyLkJheiwgaXQgd291bGQgdHJ5ICJGb28uQmFyLkJheiIgZmlyc3QsCisgIC8vIGZhaWwsIGFuZCB0ZW4gdHJ5ICJCYXIuQmF6IiBhbmQgc3VjY2VlZCwgZXZlbiB0aG91Z2ggIkJhciIgc2hvdWxkIGFjdHVhbGx5CisgIC8vIHJlZmVyIHRvIHRoZSBpbm5lciBCYXIsIG5vdCB0aGUgb3V0ZXIgb25lLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiQmF6XCIgfSIKKyAgICAifSIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXpcIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhci5CYXpcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5iYXo6IFRZUEU6IFwiQmFyLkJhelwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBTZWFyY2hNb3N0TG9jYWxGaXJzdDIpIHsKKyAgLy8gVGhpcyB0ZXN0IHdvdWxkIGZpbmQgdGhlIG1vc3QgbG9jYWwgIkJhciIgZmlyc3QsIGFuZCBkb2VzLCBidXQKKyAgLy8gcHJvY2VlZHMgdG8gZmluZCB0aGUgb3V0ZXIgb25lIGJlY2F1c2UgdGhlIGlubmVyIG9uZSdzIG5vdCBhbgorICAvLyBhZ2dyZWdhdGUuCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIkJhelwiIH0iCisgICAgIn0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcIkJhclwiIG51bWJlcjoxIHR5cGU6VFlQRV9CWVRFUyB9ICIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXpcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhci5CYXpcIiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBQYWNrYWdlT3JpZ2luYWxseURlY2xhcmVkSW5UcmFuc2l0aXZlRGVwZW5kZW50KSB7CisgIC8vIEltYWdpbmUgd2UgaGF2ZSB0aGUgZm9sbG93aW5nOgorICAvLworICAvLyBmb28ucHJvdG86CisgIC8vICAgcGFja2FnZSBmb28uYmFyOworICAvLyBiYXIucHJvdG86CisgIC8vICAgcGFja2FnZSBmb28uYmFyOworICAvLyAgIGltcG9ydCAiZm9vLnByb3RvIjsKKyAgLy8gICBtZXNzYWdlIEJhciB7fQorICAvLyBiYXoucHJvdG86CisgIC8vICAgcGFja2FnZSBmb287CisgIC8vICAgaW1wb3J0ICJiYXIucHJvdG8iCisgIC8vICAgbWVzc2FnZSBCYXogeyBvcHRpb25hbCBiYXIuQmFyIHF1eCA9IDE7IH0KKyAgLy8KKyAgLy8gV2hlbiB2YWxpZGF0aW5nIGJhei5wcm90bywgd2Ugd2lsbCBsb29rIHVwICJiYXIuQmFyIi4gIEFzIHBhcnQgb2YgdGhpcworICAvLyBsb29rdXAsIHdlIGZpcnN0IGxvb2t1cCAiYmFyIiB0aGVuIHRyeSB0byBmaW5kICJCYXIiIHdpdGhpbiBpdC4gICJiYXIiCisgIC8vIHNob3VsZCByZXNvbHZlIHRvICJmb28uYmFyIi4gIE5vdGUsIHRob3VnaCwgdGhhdCAiZm9vLmJhciIgd2FzIG9yaWdpbmFsbHkKKyAgLy8gZGVmaW5lZCBpbiBmb28ucHJvdG8sIHdoaWNoIGlzIG5vdCBhIGRpcmVjdCBkZXBlbmRlbmN5IG9mIGJhei5wcm90by4gIFRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBGaW5kU3ltYm9sKCkgbm9ybWFsbHkgb25seSByZXR1cm5zIHN5bWJvbHMgaW4gZGlyZWN0CisgIC8vIGRlcGVuZGVuY2llcywgbm90IGluZGlyZWN0IG9uZXMuICBUaGlzIHRlc3QgaW5zdXJlcyB0aGF0IHRoaXMgZG9lcyBub3QKKyAgLy8gcHJldmVudCBpdCBmcm9tIGZpbmRpbmcgImZvby5iYXIiLgorCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwiZm9vLmJhclwiICIpOworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcImZvby5iYXJcIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImJhei5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJmb29cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJCYXpcIiAiCisgICAgIiAgZmllbGQgeyBuYW1lOlwicXV4XCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiYmFyLkJhclwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZU5vdEFUeXBlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIi5Gb28uYmFyXCIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXJcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIi5Gb28uYmFyXCIgaXMgbm90IGEgdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVsYXRpdmVGaWVsZFR5cGVOb3RBVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmVzdGVkX3R5cGUgeyIKKyAgICAiICAgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgICBmaWVsZCB7IG5hbWU6XCJCYXpcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAiICB9IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiQmFyLkJhelwiIH0iCisgICAgIn0iLAorICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyLkJhelwiIGlzIG5vdCBhIHR5cGUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZU1heUJlSXRzTmFtZSkgeworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICJ9IgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcIkJhclwiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1GaWVsZFR5cGVJc01lc3NhZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0VOVU0iCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgaXMgbm90IGFuIGVudW0gdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWVzc2FnZUZpZWxkVHlwZUlzRW51bSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX01FU1NBR0UiCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCYWRFbnVtRGVmYXVsdFZhbHVlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTpcIkRVTU1ZXCIgbnVtYmVyOjAgfSB9ICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiIKKyAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6XCJOT19TVUNIX1ZBTFVFXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBERUZBVUxUX1ZBTFVFOiBFbnVtIHR5cGUgXCJCYXJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgIgorICAgICAgIlwiTk9fU1VDSF9WQUxVRVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBQcmltaXRpdmVXaXRoVHlwZU5hbWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiRm9vXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBGaWVsZCB3aXRoIHByaW1pdGl2ZSB0eXBlIGhhcyB0eXBlX25hbWUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vblByaW1pdGl2ZVdpdGhvdXRUeXBlTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfTUVTU0FHRSB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IEZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyAiCisgICAgICAidHlwZV9uYW1lLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnB1dFR5cGVOb3REZWZpbmVkKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgICJzZXJ2aWNlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgorICAgICIgIG1ldGhvZCB7IG5hbWU6IFwiQVwiIGlucHV0X3R5cGU6IFwiQmFyXCIgb3V0cHV0X3R5cGU6IFwiRm9vXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBJTlBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICAgICk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnB1dFR5cGVOb3RBTWVzc2FnZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJCYXJcIiBvdXRwdXRfdHlwZTogXCJGb29cIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IElOUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIgorICAgICk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPdXRwdXRUeXBlTm90RGVmaW5lZCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAic2VydmljZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAiICBtZXRob2QgeyBuYW1lOiBcIkFcIiBpbnB1dF90eXBlOiBcIkZvb1wiIG91dHB1dF90eXBlOiBcIkJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQTogT1VUUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iCisgICAgKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE91dHB1dFR5cGVOb3RBTWVzc2FnZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJGb29cIiBvdXRwdXRfdHlwZTogXCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IE9VVFBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS5cbiIKKyAgICApOworfQorCisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbGxlZ2FsUGFja2VkRmllbGQpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7XG4iCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJwYWNrZWRfc3RyaW5nXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfUkVQRUFURUQgIgorICAgICIgICAgICAgICAgdHlwZTpUWVBFX1NUUklORyAiCisgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKKyAgICAiICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJwYWNrZWRcIiBpc19leHRlbnNpb246IGZhbHNlIH0iCisgICAgIiAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwidHJ1ZVwiIH19fVxuIgorICAgICIgIGZpZWxkIHsgbmFtZTpcInBhY2tlZF9tZXNzYWdlXCIgbnVtYmVyOjMgbGFiZWw6TEFCRUxfUkVQRUFURUQgIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOiBcIkZvb1wiIgorICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsiCisgICAgIiAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicGFja2VkXCIgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICIgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcInRydWVcIiB9fX1cbiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJvcHRpb25hbF9pbnQzMlwiIG51bWJlcjogNCBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IgorICAgICIgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInBhY2tlZFwiIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJ0cnVlXCIgfX19XG4iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLnBhY2tlZF9zdHJpbmc6IFRZUEU6IFtwYWNrZWQgPSB0cnVlXSBjYW4gb25seSBiZSAiCisgICAgICAgICJzcGVjaWZpZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMuXG4iCisgICAgImZvby5wcm90bzogRm9vLnBhY2tlZF9tZXNzYWdlOiBUWVBFOiBbcGFja2VkID0gdHJ1ZV0gY2FuIG9ubHkgYmUgIgorICAgICAgICAic3BlY2lmaWVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzLlxuIgorICAgICJmb28ucHJvdG86IEZvby5vcHRpb25hbF9pbnQzMjogVFlQRTogW3BhY2tlZCA9IHRydWVdIGNhbiBvbmx5IGJlICIKKyAgICAgICAgInNwZWNpZmllZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcy5cbiIKKyAgICAgICAgKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE9wdGlvbldyb25nVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiAiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX1NUUklORyAiCisgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImN0eXBlXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMSB9IgorICAgICIgICAgICAgICAgfSIKKyAgICAiICB9IgorICAgICJ9XG4iLAorCisgICAgImZvby5wcm90bzogVGVzdE1lc3NhZ2UuZm9vOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgIgorICAgICJlbnVtLXZhbHVlZCBvcHRpb24gXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE9wdGlvbkV4dGVuZHNBdG9taWNUeXBlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiICIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfU1RSSU5HICIKKyAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiY3R5cGVcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgfSIKKyAgICAiICAgICAgICAgIH0iCisgICAgIiAgfSIKKyAgICAifVxuIiwKKworICAgICJmb28ucHJvdG86IFRlc3RNZXNzYWdlLmZvbzogT1BUSU9OX05BTUU6IE9wdGlvbiBcImN0eXBlXCIgaXMgYW4gIgorICAgICJhdG9taWMgdHlwZSwgbm90IGEgbWVzc2FnZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRHVwT3B0aW9uKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiICIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfVUlOVDMyICIKKyAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiY3R5cGVcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJDT1JEXCIgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiY3R5cGVcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJDT1JEXCIgfSIKKyAgICAiICAgICAgICAgIH0iCisgICAgIiAgfSIKKyAgICAifVxuIiwKKworICAgICJmb28ucHJvdG86IFRlc3RNZXNzYWdlLmZvbzogT1BUSU9OX05BTUU6IE9wdGlvbiBcImN0eXBlXCIgd2FzICIKKyAgICAiYWxyZWFkeSBzZXQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludmFsaWRPcHRpb25OYW1lKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiICIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfQk9PTCAiCisgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInVuaW50ZXJwcmV0ZWRfb3B0aW9uXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgfSIKKyAgICAiICAgICAgICAgIH0iCisgICAgIiAgfSIKKyAgICAifVxuIiwKKworICAgICJmb28ucHJvdG86IFRlc3RNZXNzYWdlLmZvbzogT1BUSU9OX05BTUU6IE9wdGlvbiBtdXN0IG5vdCB1c2UgIgorICAgICJyZXNlcnZlZCBuYW1lIFwidW5pbnRlcnByZXRlZF9vcHRpb25cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVwZWF0ZWRPcHRpb24pIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9SRVBFQVRFRCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfRkxPQVQgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZV92YWx1ZTogMS4yIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9OQU1FOiBPcHRpb24gZmllbGQgXCIoZm9vKVwiIGlzIHJlcGVhdGVkLiAiCisgICAgIlJlcGVhdGVkIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEN1c3RvbU9wdGlvbkNvbmZsaWN0aW5nRmllbGROdW1iZXIpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vMVwiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNcIiB9IgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvbzJcIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCIgfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28yOiBOVU1CRVI6IEV4dGVuc2lvbiBudW1iZXIgNzY3Mjc1NyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgIgorICAgICJpbiBcImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNcIiBieSBleHRlbnNpb24gXCJmb28xXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludDMyT3B0aW9uVmFsdWVPdXRPZlBvc2l0aXZlUmFuZ2UpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMHg4MDAwMDAwMCB9ICIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgb3V0IG9mIHJhbmdlICIKKyAgICAiZm9yIGludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQzMk9wdGlvblZhbHVlT3V0T2ZOZWdhdGl2ZVJhbmdlKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZV9pbnRfdmFsdWU6IC0weDgwMDAwMDAxIH0gIgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBvdXQgb2YgcmFuZ2UgIgorICAgICJmb3IgaW50MzIgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludDMyT3B0aW9uVmFsdWVJc05vdFBvc2l0aXZlSW50KSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwiNVwiIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBpbnRlZ2VyICIKKyAgICAiZm9yIGludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQ2NE9wdGlvblZhbHVlT3V0T2ZSYW5nZSkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQ2NCBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAweDgwMDAwMDAwMDAwMDAwMDAgfSAiCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG91dCBvZiByYW5nZSAiCisgICAgImZvciBpbnQ2NCBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW50NjRPcHRpb25WYWx1ZUlzTm90UG9zaXRpdmVJbnQpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UNjQgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiNVwiIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBpbnRlZ2VyICIKKyAgICAiZm9yIGludDY0IG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVSW50MzJPcHRpb25WYWx1ZU91dE9mUmFuZ2UpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfVUlOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDB4MTAwMDAwMDAwIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgb3V0IG9mIHJhbmdlICIKKyAgICAiZm9yIHVpbnQzMiBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVUludDMyT3B0aW9uVmFsdWVJc05vdFBvc2l0aXZlSW50KSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX1VJTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlX3ZhbHVlOiAtNS42IH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciAiCisgICAgImZvciB1aW50MzIgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVJbnQ2NE9wdGlvblZhbHVlSXNOb3RQb3NpdGl2ZUludCkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9VSU5UNjQgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlX2ludF92YWx1ZTogLTUgfSB9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyICIKKyAgICAiZm9yIHVpbnQ2NCBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmxvYXRPcHRpb25WYWx1ZUlzTm90TnVtYmVyKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0ZMT0FUIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwiYmFyXCIgfSB9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIG51bWJlciAiCisgICAgImZvciBmbG9hdCBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRG91YmxlT3B0aW9uVmFsdWVJc05vdE51bWJlcikgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9ET1VCTEUgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZTogXCJiYXJcIiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgbnVtYmVyICIKKyAgICAiZm9yIGRvdWJsZSBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQm9vbE9wdGlvblZhbHVlSXNOb3RUcnVlT3JGYWxzZSkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9CT09MIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcImJhclwiIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBcInRydWVcIiBvciBcImZhbHNlXCIgIgorICAgICJmb3IgYm9vbGVhbiBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU9wdGlvblZhbHVlSXNOb3RJZGVudGlmaWVyKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW1cIiB2YWx1ZSB7IG5hbWU6IFwiQkFSXCIgbnVtYmVyOiAxIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiAyIH0gfSIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9FTlVNIHR5cGVfbmFtZTogXCJGb29FbnVtXCIgIgorICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcIlFVVVhcIiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgIgorICAgICJlbnVtLXZhbHVlZCBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU9wdGlvblZhbHVlSXNOb3RFbnVtVmFsdWVOYW1lKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW1cIiB2YWx1ZSB7IG5hbWU6IFwiQkFSXCIgbnVtYmVyOiAxIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiAyIH0gfSIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9FTlVNIHR5cGVfbmFtZTogXCJGb29FbnVtXCIgIgorICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJRVVVYXCIgfSB9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBFbnVtIHR5cGUgXCJGb29FbnVtXCIgaGFzIG5vIHZhbHVlICIKKyAgICAibmFtZWQgXCJRVVVYXCIgZm9yIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtT3B0aW9uVmFsdWVJc1NpYmxpbmdFbnVtVmFsdWVOYW1lKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW0xXCIgdmFsdWUgeyBuYW1lOiBcIkJBUlwiIG51bWJlcjogMSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHsgbmFtZTogXCJCQVpcIiBudW1iZXI6IDIgfSB9IgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW0yXCIgdmFsdWUgeyBuYW1lOiBcIlFVWFwiIG51bWJlcjogMSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHsgbmFtZTogXCJRVVVYXCIgbnVtYmVyOiAyIH0gfSIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9FTlVNIHR5cGVfbmFtZTogXCJGb29FbnVtMVwiICIKKyAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiUVVVWFwiIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogRW51bSB0eXBlIFwiRm9vRW51bTFcIiBoYXMgbm8gdmFsdWUgIgorICAgICJuYW1lZCBcIlFVVVhcIiBmb3Igb3B0aW9uIFwiZm9vXCIuIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbHVlIGZyb20gYSAiCisgICAgInNpYmxpbmcgdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgU3RyaW5nT3B0aW9uVmFsdWVJc05vdFN0cmluZykgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9TVFJJTkcgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiUVVVWFwiIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBxdW90ZWQgc3RyaW5nIGZvciAiCisgICAgInN0cmluZyBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHRlc3RzIHRoYXQgY2hlY2sgZm9yIGFnZ3JlZ2F0ZSB2YWx1ZSBwYXJzaW5nCisvLyBlcnJvcnMuICBUaGUgInZhbHVlIiBhcmd1bWVudCBpcyBlbWJlZGRlZCBpbnNpZGUgdGhlCisvLyAidW5pbnRlcnByZXRlZF9vcHRpb24iIHBvcnRpb24gb2YgdGhlIHJlc3VsdC4KK3N0YXRpYyBzdHJpbmcgRW1iZWRBZ2dyZWdhdGVWYWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX01FU1NBR0UgdHlwZV9uYW1lOiBcIkZvb1wiICIKKyAgICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDAgfSB9IiwKKyAgICAgIHZhbHVlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFnZ3JlZ2F0ZVZhbHVlTm90Rm91bmQpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgIEVtYmVkQWdncmVnYXRlVmFsdWUoInN0cmluZ192YWx1ZTogXCJcIiIpLAorICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IE9wdGlvbiBcImZvb1wiIGlzIGEgbWVzc2FnZS4gIgorICAgICAgIlRvIHNldCB0aGUgZW50aXJlIG1lc3NhZ2UsIHVzZSBzeW50YXggbGlrZSAiCisgICAgICAiXCJmb28gPSB7IDxwcm90byB0ZXh0IGZvcm1hdD4gfVwiLiBUbyBzZXQgZmllbGRzIHdpdGhpbiBpdCwgdXNlICIKKyAgICAgICJzeW50YXggbGlrZSBcImZvby5mb28gPSB2YWx1ZVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBZ2dyZWdhdGVWYWx1ZVBhcnNlRXJyb3IpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgIEVtYmVkQWdncmVnYXRlVmFsdWUoImFnZ3JlZ2F0ZV92YWx1ZTogXCIxKzJcIiIpLAorICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IEVycm9yIHdoaWxlIHBhcnNpbmcgb3B0aW9uICIKKyAgICAgICJ2YWx1ZSBmb3IgXCJmb29cIjogRXhwZWN0ZWQgaWRlbnRpZmllci5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQWdncmVnYXRlVmFsdWVVbmtub3duRmllbGRzKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBFbWJlZEFnZ3JlZ2F0ZVZhbHVlKCJhZ2dyZWdhdGVfdmFsdWU6IFwieDoxMDBcIiIpLAorICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IEVycm9yIHdoaWxlIHBhcnNpbmcgb3B0aW9uICIKKyAgICAgICJ2YWx1ZSBmb3IgXCJmb29cIjogTWVzc2FnZSB0eXBlIFwiRm9vXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwieFwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb3RMaXRlSW1wb3J0c0xpdGUpIHsKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAib3B0aW9ucyB7IG9wdGltaXplX2ZvcjogTElURV9SVU5USU1FIH0gIik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1RIRVI6IEZpbGVzIHRoYXQgZG8gbm90IHVzZSBvcHRpbWl6ZV9mb3IgPSAiCisgICAgICAiTElURV9SVU5USU1FIGNhbm5vdCBpbXBvcnQgZmlsZXMgd2hpY2ggZG8gdXNlIHRoaXMgb3B0aW9uLiAgVGhpcyBmaWxlICIKKyAgICAgICJpcyBub3QgbGl0ZSwgYnV0IGl0IGltcG9ydHMgXCJiYXIucHJvdG9cIiB3aGljaCBpcy5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTGl0ZUV4dGVuZHNOb3RMaXRlKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZTogeyIKKyAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwMCB9IgorICAgICJ9Iik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIgorICAgICJvcHRpb25zIHsgb3B0aW1pemVfZm9yOiBMSVRFX1JVTlRJTUUgfSAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZXh0XCIgbnVtYmVyOiAxMjMgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJCYXJcIiB9IiwKKworICAgICJmb28ucHJvdG86IGV4dDogRVhURU5ERUU6IEV4dGVuc2lvbnMgdG8gbm9uLWxpdGUgdHlwZXMgY2FuIG9ubHkgYmUgIgorICAgICAgImRlY2xhcmVkIGluIG5vbi1saXRlIGZpbGVzLiAgTm90ZSB0aGF0IHlvdSBjYW5ub3QgZXh0ZW5kIGEgbm9uLWxpdGUgIgorICAgICAgInR5cGUgdG8gY29udGFpbiBhIGxpdGUgdHlwZSwgYnV0IHRoZSByZXZlcnNlIGlzIGFsbG93ZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vTGl0ZVNlcnZpY2VzKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJvcHRpb25zIHsiCisgICAgIiAgb3B0aW1pemVfZm9yOiBMSVRFX1JVTlRJTUUiCisgICAgIiAgY2NfZ2VuZXJpY19zZXJ2aWNlczogdHJ1ZSIKKyAgICAiICBqYXZhX2dlbmVyaWNfc2VydmljZXM6IHRydWUiCisgICAgIn0gIgorICAgICJzZXJ2aWNlIHsgbmFtZTogXCJGb29cIiB9IiwKKworICAgICJmb28ucHJvdG86IEZvbzogTkFNRTogRmlsZXMgd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUgY2Fubm90ICIKKyAgICAiZGVmaW5lIHNlcnZpY2VzIHVubGVzcyB5b3Ugc2V0IGJvdGggb3B0aW9ucyBjY19nZW5lcmljX3NlcnZpY2VzIGFuZCAiCisgICAgImphdmFfZ2VuZXJpY19zZXZpY2VzIHRvIGZhbHNlLlxuIik7CisKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAib3B0aW9ucyB7IgorICAgICIgIG9wdGltaXplX2ZvcjogTElURV9SVU5USU1FIgorICAgICIgIGNjX2dlbmVyaWNfc2VydmljZXM6IGZhbHNlIgorICAgICIgIGphdmFfZ2VuZXJpY19zZXJ2aWNlczogZmFsc2UiCisgICAgIn0gIgorICAgICJzZXJ2aWNlIHsgbmFtZTogXCJCYXJcIiB9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSb2xsYmFja0FmdGVyRXJyb3IpIHsKKyAgLy8gQnVpbGQgYSBmaWxlIHdoaWNoIGNvbnRhaW5zIGV2ZXJ5IGtpbmQgb2YgY29uc3RydWN0IGJ1dCByZWZlcmVuY2VzIGFuCisgIC8vIHVuZGVmaW5lZCB0eXBlLiAgQWxsIHRoZXNlIGNvbnN0cnVjdHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgc3ltYm9sIHRhYmxlCisgIC8vIGJlZm9yZSB0aGUgdW5kZWZpbmVkIHR5cGUgZXJyb3IgaXMgbm90aWNlZC4gIFRoZSBEZXNjcmlwdG9yUG9vbCB3aWxsIHRoZW4KKyAgLy8gaGF2ZSB0byByb2xsIGV2ZXJ5dGhpbmcgYmFjay4KKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKKyAgICAifSAiCisgICAgImVudW1fdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6MSB9IgorICAgICJ9ICIKKyAgICAic2VydmljZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAiICBtZXRob2QgeyIKKyAgICAiICAgIG5hbWU6IFwiQmF6XCIiCisgICAgIiAgICBpbnB1dF90eXBlOiBcIk5vU3VjaFR5cGVcIiIgICAgLy8gZXJyb3IKKyAgICAiICAgIG91dHB1dF90eXBlOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5CYXo6IElOUFVUX1RZUEU6IFwiTm9TdWNoVHlwZVwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICAgICk7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgaWYgd2UgYnVpbGQgdGhlIHNhbWUgZmlsZSBhZ2FpbiB3aXRoIHRoZSBlcnJvciBmaXhlZCwKKyAgLy8gaXQgd29ya3MuICBJZiB0aGUgYWJvdmUgcm9sbGJhY2sgd2FzIGluY29tcGxldGUsIHRoZW4gc29tZSBzeW1ib2xzIHdpbGwKKyAgLy8gYmUgbGVmdCBkZWZpbmVkLCBhbmQgdGhpcyBzZWNvbmQgYXR0ZW1wdCB3aWxsIGZhaWwgc2luY2UgaXQgdHJpZXMgdG8KKyAgLy8gcmUtZGVmaW5lIHRoZSBzYW1lIHN5bWJvbHMuCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKKyAgICAifSAiCisgICAgImVudW1fdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6MSB9IgorICAgICJ9ICIKKyAgICAic2VydmljZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAiICBtZXRob2QgeyBuYW1lOlwiQmF6XCIiCisgICAgIiAgICAgICAgICAgaW5wdXRfdHlwZTpcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgICAgICAgICAgb3V0cHV0X3R5cGU6XCJUZXN0TWVzc2FnZVwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVycm9yc1JlcG9ydGVkVG9Mb2dFcnJvcikgeworICAvLyBUZXN0IHRoYXQgZXJyb3JzIGFyZSByZXBvcnRlZCB0byBHT09HTEVfTE9HKEVSUk9SKSBpZiBubyBlcnJvciBjb2xsZWN0b3IgaXMKKyAgLy8gcHJvdmlkZWQuCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIiwKKyAgICAmZmlsZV9wcm90bykpOworCisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGUoZmlsZV9wcm90bykgPT0gTlVMTCk7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorCisgIEFTU0VSVF9FUSgyLCBlcnJvcnMuc2l6ZSgpKTsKKworICBFWFBFQ1RfRVEoIkludmFsaWQgcHJvdG8gZGVzY3JpcHRvciBmb3IgZmlsZSBcImZvby5wcm90b1wiOiIsIGVycm9yc1swXSk7CisgIEVYUEVDVF9FUSgiICBGb286IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIsIGVycm9yc1sxXSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEaXNhbGxvd0VudW1BbGlhcykgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZW51bV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJFTlVNX0FcIiBudW1iZXI6MCB9IgorICAgICIgIHZhbHVlIHsgbmFtZTpcIkVOVU1fQlwiIG51bWJlcjowIH0iCisgICAgIiAgb3B0aW9ucyB7IGFsbG93X2FsaWFzOiBmYWxzZSB9IgorICAgICJ9IiwKKyAgICAiZm9vLnByb3RvOiBCYXI6IE5VTUJFUjogIgorICAgICJcIkVOVU1fQlwiIHVzZXMgdGhlIHNhbWUgZW51bSB2YWx1ZSBhcyBcIkVOVU1fQVwiLiAiCisgICAgIklmIHRoaXMgaXMgaW50ZW5kZWQsIHNldCAnb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsnIHRvIHRoZSBlbnVtICIKKyAgICAiZGVmaW5pdGlvbi5cbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZXNjcmlwdG9yRGF0YWJhc2UKKworc3RhdGljIHZvaWQgQWRkVG9EYXRhYmFzZShTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3RleHQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOworICBkYXRhYmFzZS0+QWRkKGZpbGVfcHJvdG8pOworfQorCitjbGFzcyBEYXRhYmFzZUJhY2tlZFBvb2xUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgRGF0YWJhc2VCYWNrZWRQb29sVGVzdCgpIHt9CisKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2VfLAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOidGb28nIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTonVGVzdEVudW0nIHZhbHVlIHsgbmFtZTonRFVNTVknIG51bWJlcjowIH0gfSAiCisgICAgICAic2VydmljZSB7IG5hbWU6J1Rlc3RTZXJ2aWNlJyB9ICIpOworICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlXywKKyAgICAgICJuYW1lOiAnYmFyLnByb3RvJyAiCisgICAgICAiZGVwZW5kZW5jeTogJ2Zvby5wcm90bycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6J0JhcicgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTonZm9vX2V4dCcgZXh0ZW5kZWU6ICcuRm9vJyBudW1iZXI6NSAiCisgICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIik7CisgICAgLy8gQmF6IGhhcyBhbiB1bmRlY2xhcmVkIGRlcGVuZGVuY3kgb24gRm9vLgorICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlXywKKyAgICAgICJuYW1lOiAnYmF6LnByb3RvJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTonQmF6JyAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2ZvbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidGb28nIH0gIgorICAgICAgIn0iKTsKKyAgfQorCisgIC8vIFdlIGNhbid0IGluamVjdCBhIGZpbGUgY29udGFpbmluZyBlcnJvcnMgaW50byBhIERlc2NyaXB0b3JQb29sLCBzbyB3ZQorICAvLyBuZWVkIGFuIGFjdHVhbCBtb2NrIERlc2NyaXB0b3JEYXRhYmFzZSB0byB0ZXN0IGVycm9ycy4KKyAgY2xhc3MgRXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBFcnJvckRlc2NyaXB0b3JEYXRhYmFzZSgpIHt9CisgICAgfkVycm9yRGVzY3JpcHRvckRhdGFiYXNlKCkge30KKworICAgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgLy8gZXJyb3IucHJvdG8gYW5kIGVycm9yMi5wcm90byBjeWNsaWNhbGx5IGltcG9ydCBlYWNoIG90aGVyLgorICAgICAgaWYgKGZpbGVuYW1lID09ICJlcnJvci5wcm90byIpIHsKKyAgICAgICAgb3V0cHV0LT5DbGVhcigpOworICAgICAgICBvdXRwdXQtPnNldF9uYW1lKCJlcnJvci5wcm90byIpOworICAgICAgICBvdXRwdXQtPmFkZF9kZXBlbmRlbmN5KCJlcnJvcjIucHJvdG8iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lID09ICJlcnJvcjIucHJvdG8iKSB7CisgICAgICAgIG91dHB1dC0+Q2xlYXIoKTsKKyAgICAgICAgb3V0cHV0LT5zZXRfbmFtZSgiZXJyb3IyLnByb3RvIik7CisgICAgICAgIG91dHB1dC0+YWRkX2RlcGVuZGVuY3koImVycm9yLnByb3RvIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfTsKKworICAvLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB0aGF0IGNvdW50cyBob3cgbWFueSB0aW1lcyBlYWNoIG1ldGhvZCBoYXMgYmVlbgorICAvLyBjYWxsZWQgYW5kIGZvcndhcmRzIHRvIHNvbWUgb3RoZXIgRGVzY3JpcHRvckRhdGFiYXNlLgorICBjbGFzcyBDYWxsQ291bnRpbmdEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworICAgcHVibGljOgorICAgIENhbGxDb3VudGluZ0RhdGFiYXNlKERlc2NyaXB0b3JEYXRhYmFzZSogd3JhcHBlZF9kYikKKyAgICAgIDogd3JhcHBlZF9kYl8od3JhcHBlZF9kYikgeworICAgICAgQ2xlYXIoKTsKKyAgICB9CisgICAgfkNhbGxDb3VudGluZ0RhdGFiYXNlKCkge30KKworICAgIERlc2NyaXB0b3JEYXRhYmFzZSogd3JhcHBlZF9kYl87CisKKyAgICBpbnQgY2FsbF9jb3VudF87CisKKyAgICB2b2lkIENsZWFyKCkgeworICAgICAgY2FsbF9jb3VudF8gPSAwOworICAgIH0KKworICAgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgKytjYWxsX2NvdW50XzsKKyAgICAgIHJldHVybiB3cmFwcGVkX2RiXy0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCk7CisgICAgfQorICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgICArK2NhbGxfY291bnRfOworICAgICAgcmV0dXJuIHdyYXBwZWRfZGJfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3ltYm9sX25hbWUsIG91dHB1dCk7CisgICAgfQorICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgICArK2NhbGxfY291bnRfOworICAgICAgcmV0dXJuIHdyYXBwZWRfZGJfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyLCBvdXRwdXQpOworICAgIH0KKyAgfTsKKworICAvLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB3aGljaCBmYWxzZWx5IGFsd2F5cyByZXR1cm5zIGZvby5wcm90byB3aGVuIHNlYXJjaGluZworICAvLyBmb3IgYW55IHN5bWJvbCBvciBleHRlbnNpb24gbnVtYmVyLiAgVGhpcyBzaG91bGRuJ3QgY2F1c2UgdGhlCisgIC8vIERlc2NyaXB0b3JQb29sIHRvIHJlbG9hZCBmb28ucHJvdG8gaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuCisgIGNsYXNzIEZhbHNlUG9zaXRpdmVEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworICAgcHVibGljOgorICAgIEZhbHNlUG9zaXRpdmVEYXRhYmFzZShEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGIpCisgICAgICA6IHdyYXBwZWRfZGJfKHdyYXBwZWRfZGIpIHt9CisgICAgfkZhbHNlUG9zaXRpdmVEYXRhYmFzZSgpIHt9CisKKyAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGJfOworCisgICAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgICByZXR1cm4gd3JhcHBlZF9kYl8tPkZpbmRGaWxlQnlOYW1lKGZpbGVuYW1lLCBvdXRwdXQpOworICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIEZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCBvdXRwdXQpOworICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIEZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCBvdXRwdXQpOworICAgIH0KKyAgfTsKK307CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBGaW5kRmlsZUJ5TmFtZSkgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZvby0+bmFtZSgpKTsKKyAgQVNTRVJUX0VRKDEsIGZvby0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoIkZvbyIsIGZvby0+bWVzc2FnZV90eXBlKDApLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUShmb28sIHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJub19zdWNoX2ZpbGUucHJvdG8iKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbmN5QmVmb3JlRGVwZW5kZW50KSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOworICBBU1NFUlRfVFJVRShiYXIgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbnRCZWZvcmVEZXBlbmRlbmN5KSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOworICBBU1NFUlRfVFJVRShiYXIgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEFTU0VSVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEFTU0VSVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCkgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvbyIpOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUtPm5hbWUoKSk7CisgIEVYUEVDVF9FUShmaWxlLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIk5vU3VjaFN5bWJvbCIpID09IE5VTEwpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZE1lc3NhZ2VUeXBlQnlOYW1lKSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUodHlwZSAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKCJGb28iLCB0eXBlLT5uYW1lKCkpOworICBFWFBFQ1RfRVEodHlwZS0+ZmlsZSgpLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRFeHRlbnNpb25CeU51bWJlcikgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gcG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vLCA1KTsKKyAgQVNTRVJUX1RSVUUoZXh0ZW5zaW9uICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImZvb19leHQiLCBleHRlbnNpb24tPm5hbWUoKSk7CisgIEVYUEVDVF9FUShleHRlbnNpb24tPmZpbGUoKSwgcG9vbC5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIikpOworCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZvbywgMTIpID09IE5VTEwpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZEFsbEV4dGVuc2lvbnMpIHsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZGF0YWJhc2VfKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAvLyBSZXBlYXQgdGhlIGxvb2t1cCB0d2ljZSwgdG8gY2hlY2sgdGhhdCB3ZSBnZXQgY29uc2lzdGVudAorICAgIC8vIHJlc3VsdHMgZGVzcGl0ZSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgbG9va3VwIG11dGF0aW5nIHRoZSBwb29sLgorICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOworICAgIHBvb2wuRmluZEFsbEV4dGVuc2lvbnMoZm9vLCAmZXh0ZW5zaW9ucyk7CisgICAgQVNTRVJUX0VRKDEsIGV4dGVuc2lvbnMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgZXh0ZW5zaW9uc1swXS0+bnVtYmVyKCkpOworICB9Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBFcnJvcldpdGhvdXRFcnJvckNvbGxlY3RvcikgeworICBFcnJvckRlc2NyaXB0b3JEYXRhYmFzZSBlcnJvcl9kYXRhYmFzZTsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZXJyb3JfZGF0YWJhc2UpOworCisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IE5VTEwpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBFWFBFQ1RfRkFMU0UoZXJyb3JzLmVtcHR5KCkpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRXJyb3JXaXRoRXJyb3JDb2xsZWN0b3IpIHsKKyAgRXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UgZXJyb3JfZGF0YWJhc2U7CisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmVycm9yX2RhdGFiYXNlLCAmZXJyb3JfY29sbGVjdG9yKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfRVEoCisgICAgImVycm9yLnByb3RvOiBlcnJvci5wcm90bzogT1RIRVI6IEZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIKKyAgICAgICJlcnJvci5wcm90byAtPiBlcnJvcjIucHJvdG8gLT4gZXJyb3IucHJvdG9cbiIKKyAgICAiZXJyb3IyLnByb3RvOiBlcnJvcjIucHJvdG86IE9USEVSOiBJbXBvcnQgXCJlcnJvci5wcm90b1wiIHdhcyBub3QgIgorICAgICAgImZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iCisgICAgImVycm9yLnByb3RvOiBlcnJvci5wcm90bzogT1RIRVI6IEltcG9ydCBcImVycm9yMi5wcm90b1wiIHdhcyBub3QgIgorICAgICAgImZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iLAorICAgIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBVbmRlY2xhcmVkRGVwZW5kZW5jeU9uVW5idWlsdFR5cGUpIHsKKyAgLy8gQ2hlY2sgdGhhdCB3ZSBmaW5kIGFuZCByZXBvcnQgdW5kZWNsYXJlZCBkZXBlbmRlbmNpZXMgb24gdHlwZXMgdGhhdCBleGlzdAorICAvLyBpbiB0aGUgZGVzY3JpcHRvciBkYXRhYmFzZSBidXQgdGhhdCBoYXZlIG5vdCBub3QgYmVlbiBidWlsdCB5ZXQuCisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXywgJmVycm9yX2NvbGxlY3Rvcik7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXoiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX0VRKAorICAgICJiYXoucHJvdG86IEJhei5mb286IFRZUEU6IFwiRm9vXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcImZvby5wcm90b1wiLCAiCisgICAgIndoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImJhei5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSBhZGQgIgorICAgICJ0aGUgbmVjZXNzYXJ5IGltcG9ydC5cbiIsCisgICAgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIFJvbGxiYWNrQWZ0ZXJFcnJvcikgeworICAvLyBNYWtlIHN1cmUgdGhhdCBhbGwgdHJhY2VzIG9mIGJhZCB0eXBlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBwb29sLiBUaGlzIHVzZWQKKyAgLy8gdG8gYmUgYi80NTI5NDM2LCBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhIHN5bWJvbCByZXNvbHV0aW9uIGZhaWx1cmUgY291bGQKKyAgLy8gcG90ZW50aWFsbHkgY2F1c2UgYW5vdGhlciBmaWxlIHRvIGJlIHJlY3Vyc2l2ZWx5IGJ1aWx0LCB3aGljaCB3b3VsZCB0cmlnZ2VyCisgIC8vIGEgY2hlY2twb2ludCBfcGFzdF8gcG9zc2libHkgaW52YWxpZCBzeW1ib2xzLgorICAvLyBCYXogaXMgZGVmaW5lZCBpbiB0aGUgZGF0YWJhc2UsIGJ1dCB0aGUgZmlsZSBpcyBpbnZhbGlkIGJlY2F1c2UgaXQgaXMKKyAgLy8gbWlzc2luZyBhIG5lY2Vzc2FyeSBpbXBvcnQuCisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXoiKSA9PSBOVUxMKTsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgc2VhcmNoaW5nIGFnYWluIGZvciB0aGUgZmlsZSBvciB0aGUgdHlwZSBmYWlscy4KKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXoiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIFVuaXR0ZXN0UHJvdG8pIHsKKyAgLy8gVHJ5IHRvIGxvYWQgYWxsIG9mIHVuaXR0ZXN0LnByb3RvIGZyb20gYSBEZXNjcmlwdG9yRGF0YWJhc2UuICBUaGlzIHNob3VsZAorICAvLyB0aG9yb3VnaGx5IHRlc3QgYWxsIHBhdGhzIHRocm91Z2ggRGVzY3JpcHRvckJ1aWxkZXIgdG8gaW5zdXJlIHRoYXQgdGhlcmUKKyAgLy8gYXJlIG5vIGRlYWRsb2NraW5nIHByb2JsZW1zIHdoZW4gcG9vbF8tPm11dGV4XyBpcyBub24tTlVMTC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIG9yaWdpbmFsX2ZpbGUgPQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworCisgIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgZGF0YWJhc2UoKkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZGF0YWJhc2UpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9mcm9tX2RhdGFiYXNlID0KKyAgICBwb29sLkZpbmRGaWxlQnlOYW1lKG9yaWdpbmFsX2ZpbGUtPm5hbWUoKSk7CisKKyAgQVNTRVJUX1RSVUUoZmlsZV9mcm9tX2RhdGFiYXNlICE9IE5VTEwpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWxfZmlsZV9wcm90bzsKKyAgb3JpZ2luYWxfZmlsZS0+Q29weVRvKCZvcmlnaW5hbF9maWxlX3Byb3RvKTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfZnJvbV9kYXRhYmFzZV9wcm90bzsKKyAgZmlsZV9mcm9tX2RhdGFiYXNlLT5Db3B5VG8oJmZpbGVfZnJvbV9kYXRhYmFzZV9wcm90byk7CisKKyAgRVhQRUNUX0VRKG9yaWdpbmFsX2ZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwKKyAgICAgICAgICAgIGZpbGVfZnJvbV9kYXRhYmFzZV9wcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIERvZXNudFJldHJ5RGJVbm5lY2Vzc2FyaWx5KSB7CisgIC8vIFNlYXJjaGluZyBmb3IgYSBjaGlsZCBvZiBhbiBleGlzdGluZyBkZXNjcmlwdG9yIHNob3VsZCBuZXZlciBmYWxsIGJhY2sKKyAgLy8gdG8gdGhlIERlc2NyaXB0b3JEYXRhYmFzZSBldmVuIGlmIGl0IGlzbid0IGZvdW5kLCBiZWNhdXNlIHdlIGtub3cgYWxsCisgIC8vIGNoaWxkcmVuIGFyZSBhbHJlYWR5IGxvYWRlZC4KKyAgQ2FsbENvdW50aW5nRGF0YWJhc2UgY2FsbF9jb3VudGVyKCZkYXRhYmFzZV8pOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZjYWxsX2NvdW50ZXIpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5GaW5kRmlsZUJ5TmFtZSgiZm9vLnByb3RvIik7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogdGVzdF9lbnVtID0gcG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoIlRlc3RFbnVtIik7CisgIEFTU0VSVF9UUlVFKHRlc3RfZW51bSAhPSBOVUxMKTsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHRlc3Rfc2VydmljZSA9IHBvb2wuRmluZFNlcnZpY2VCeU5hbWUoIlRlc3RTZXJ2aWNlIik7CisgIEFTU0VSVF9UUlVFKHRlc3Rfc2VydmljZSAhPSBOVUxMKTsKKworICBFWFBFQ1RfTkUoMCwgY2FsbF9jb3VudGVyLmNhbGxfY291bnRfKTsKKyAgY2FsbF9jb3VudGVyLkNsZWFyKCk7CisKKyAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kRmllbGRCeU5hbWUoIm5vX3N1Y2hfZmllbGQiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dGVuc2lvbiIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb28tPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJOb1N1Y2hNZXNzYWdlVHlwZSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb28tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoRW51bVR5cGUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHRlc3RfZW51bS0+RmluZFZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHRlc3Rfc2VydmljZS0+RmluZE1ldGhvZEJ5TmFtZSgiTm9TdWNoTWV0aG9kIikgPT0gTlVMTCk7CisKKyAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hNZXNzYWdlVHlwZSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmaWxlLT5GaW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaEVudW1UeXBlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZFNlcnZpY2VCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHRlbnNpb24iKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vLm5vLnN1Y2guZmllbGQiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5ub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28uTm9TdWNoTWVzc2FnZVR5cGUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmllbGRCeU5hbWUoIkZvby5ub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZSgiRm9vLm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCJGb28uTm9TdWNoRW51bVR5cGUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRW51bVZhbHVlQnlOYW1lKCJGb28uTk9fU1VDSF9WQUxVRSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXRob2RCeU5hbWUoIlRlc3RTZXJ2aWNlLk5vU3VjaE1ldGhvZCIpID09IE5VTEwpOworCisgIEVYUEVDVF9FUSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRG9lc250UmVsb2FkRmlsZXNVbmNlc2Vzc2FyaWx5KSB7CisgIC8vIElmIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgpIG9yIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIHJldHVybiBhCisgIC8vIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgaXQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvCisgIC8vIHJlbG9hZCB0aGUgZmlsZS4KKyAgRmFsc2VQb3NpdGl2ZURhdGFiYXNlIGZhbHNlX3Bvc2l0aXZlX2RhdGFiYXNlKCZkYXRhYmFzZV8pOworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZmYWxzZV9wb3NpdGl2ZV9kYXRhYmFzZSwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgLy8gRmlyc3QgbWFrZSBzdXJlIGZvby5wcm90byBpcyBsb2FkZWQuCisgIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOworCisgIC8vIFRyeSBpbmR1Y2luZyBmYWxzZSBwb3NpdGl2ZXMuCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hTeW1ib2wiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vLCAyMikgPT0gTlVMTCk7CisKKyAgLy8gTm8gZXJyb3JzIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQuICAoSWYgZm9vLnByb3RvIHdhcyBpbmNvcnJlY3RseQorICAvLyBsb2FkZWQgbXVsdGlwbGUgdGltZXMsIGVycm9ycyB3b3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQuKQorICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBEb2VzbnRSZWxvYWRLbm93bkJhZEZpbGVzKSB7CisgIEVycm9yRGVzY3JpcHRvckRhdGFiYXNlIGVycm9yX2RhdGFiYXNlOworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZlcnJvcl9kYXRhYmFzZSwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUJ5TmFtZSgiZXJyb3IucHJvdG8iKSA9PSBOVUxMKTsKKyAgZXJyb3JfY29sbGVjdG9yLnRleHRfLmNsZWFyKCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpbGVCeU5hbWUoImVycm9yLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIERvZXNudEZhbGxiYWNrT25Xcm9uZ1R5cGUpIHsKKyAgLy8gSWYgYSBsb29rdXAgZmluZHMgYSBzeW1ib2wgb2YgdGhlIHdyb25nIHR5cGUgKGUuZy4gd2UgcGFzcyBhIHR5cGUgbmFtZQorICAvLyB0byBGaW5kRmllbGRCeU5hbWUoKSksIHdlIHNob3VsZCBmYWlsIGZhc3QsIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGZhbGxiYWNrCisgIC8vIGRhdGFiYXNlLgorICBDYWxsQ291bnRpbmdEYXRhYmFzZSBjYWxsX2NvdW50ZXIoJmRhdGFiYXNlXyk7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmNhbGxfY291bnRlcik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vID0gcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvbyIpOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiB0ZXN0X2VudW0gPSBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgiVGVzdEVudW0iKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9lbnVtICE9IE5VTEwpOworCisgIEVYUEVDVF9ORSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOworICBjYWxsX2NvdW50ZXIuQ2xlYXIoKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiVGVzdEVudW0iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmllbGRCeU5hbWUoIkZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFeHRlbnNpb25CeU5hbWUoIkZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEVudW1WYWx1ZUJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZFNlcnZpY2VCeU5hbWUoIkZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpID09IE5VTEwpOworCisgIEVYUEVDVF9FUSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEFib3J0aW5nRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIEFib3J0aW5nRXJyb3JDb2xsZWN0b3IoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBBZGRFcnJvcigKKyAgICAgIGNvbnN0IHN0cmluZyAmZmlsZW5hbWUsCisgICAgICBjb25zdCBzdHJpbmcgJmVsZW1lbnRfbmFtZSwKKyAgICAgIGNvbnN0IE1lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgY29uc3Qgc3RyaW5nICZlcnJvcl9tZXNzYWdlKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkFkZEVycm9yKCkgY2FsbGVkIHVuZXhwZWN0ZWRseTogIiA8PCBmaWxlbmFtZSA8PCAiOiAiCisgICAgICAgICAgICAgICA8PCBlcnJvcl9tZXNzYWdlOworICB9CisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFib3J0aW5nRXJyb3JDb2xsZWN0b3IpOworfTsKKworLy8gQSBzb3VyY2UgdHJlZSBjb250YWluaW5nIG9ubHkgb25lIGZpbGUuCitjbGFzcyBTaW5nbGV0b25Tb3VyY2VUcmVlIDogcHVibGljIGNvbXBpbGVyOjpTb3VyY2VUcmVlIHsKKyBwdWJsaWM6CisgIFNpbmdsZXRvblNvdXJjZVRyZWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBjb250ZW50cykKKyAgICAgIDogZmlsZW5hbWVfKGZpbGVuYW1lKSwgY29udGVudHNfKGNvbnRlbnRzKSB7fQorCisgIHZpcnR1YWwgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICAgIHJldHVybiBmaWxlbmFtZSA9PSBmaWxlbmFtZV8gPworICAgICAgICBuZXcgaW86OkFycmF5SW5wdXRTdHJlYW0oY29udGVudHNfLmRhdGEoKSwgY29udGVudHNfLnNpemUoKSkgOiBOVUxMOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBzdHJpbmcgZmlsZW5hbWVfOworICBjb25zdCBzdHJpbmcgY29udGVudHNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTaW5nbGV0b25Tb3VyY2VUcmVlKTsKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IGtTb3VyY2VMb2NhdGlvblRlc3RJbnB1dCA9CisgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAibWVzc2FnZSBBIHtcbiIKKyAgIiAgb3B0aW9uYWwgaW50MzIgYSA9IDE7XG4iCisgICIgIG1lc3NhZ2UgQiB7XG4iCisgICIgICAgcmVxdWlyZWQgZG91YmxlIGIgPSAxO1xuIgorICAiICB9XG4iCisgICJ9XG4iCisgICJlbnVtIEluZGVjaXNpb24ge1xuIgorICAiICBZRVMgICA9IDE7XG4iCisgICIgIE5PICAgID0gMjtcbiIKKyAgIiAgTUFZQkUgPSAzO1xuIgorICAifVxuIgorICAic2VydmljZSBTIHtcbiIKKyAgIiAgcnBjIE1ldGhvZChBKSByZXR1cm5zIChBLkIpO1xuIgorICAvLyBQdXQgYW4gZW1wdHkgbGluZSBoZXJlIHRvIG1ha2UgdGhlIHNvdXJjZSBsb2NhdGlvbiByYW5nZSBtYXRjaC4KKyAgIlxuIgorICAifVxuIjsKKworY2xhc3MgU291cmNlTG9jYXRpb25UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgU291cmNlTG9jYXRpb25UZXN0KCkKKyAgICAgIDogc291cmNlX3RyZWVfKCIvdGVzdC90ZXN0LnByb3RvIiwga1NvdXJjZUxvY2F0aW9uVGVzdElucHV0KSwKKyAgICAgICAgZGJfKCZzb3VyY2VfdHJlZV8pLAorICAgICAgICBwb29sXygmZGJfLCAmY29sbGVjdG9yXykge30KKworICBzdGF0aWMgc3RyaW5nIFByaW50U291cmNlTG9jYXRpb24oY29uc3QgU291cmNlTG9jYXRpb24gJmxvYykgeworICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKCIkMDokMS0kMjokMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGxvYy5zdGFydF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBsb2Muc3RhcnRfY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBsb2MuZW5kX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGxvYy5lbmRfY29sdW1uKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgQWJvcnRpbmdFcnJvckNvbGxlY3RvciBjb2xsZWN0b3JfOworICBTaW5nbGV0b25Tb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKKyAgY29tcGlsZXI6OlNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgZGJfOworCisgcHJvdGVjdGVkOgorICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKK307CisKKy8vIFRPRE8oYWRvbm92YW4pOiBpbXBsZW1lbnQgc3VwcG9ydCBmb3Igb3B0aW9uIGZpZWxkcyBhbmQgZm9yCisvLyBzdWJwYXJ0cyBvZiBkZWNsYXJhdGlvbnMuCisKK1RFU1RfRihTb3VyY2VMb2NhdGlvblRlc3QsIEdldFNvdXJjZUxvY2F0aW9uKSB7CisgIFNvdXJjZUxvY2F0aW9uIGxvYzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOworCisgIGNvbnN0IERlc2NyaXB0b3IgKmFfZGVzYyA9IGZpbGVfZGVzYy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJBIik7CisgIEVYUEVDVF9UUlVFKGFfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworICBFWFBFQ1RfRVEoIjI6MS03OjIiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworCisgIGNvbnN0IERlc2NyaXB0b3IgKmFfYl9kZXNjID0gYV9kZXNjLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiQiIpOworICBFWFBFQ1RfVFJVRShhX2JfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworICBFWFBFQ1RfRVEoIjQ6My02OjQiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yICplX2Rlc2MgPSBmaWxlX2Rlc2MtPkZpbmRFbnVtVHlwZUJ5TmFtZSgiSW5kZWNpc2lvbiIpOworICBFWFBFQ1RfVFJVRShlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKKyAgRVhQRUNUX0VRKCI4OjEtMTI6MiIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciAqeWVzX2Rlc2MgPSBlX2Rlc2MtPkZpbmRWYWx1ZUJ5TmFtZSgiWUVTIik7CisgIEVYUEVDVF9UUlVFKHllc19kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiOTozLTk6MTMiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yICpzX2Rlc2MgPSBmaWxlX2Rlc2MtPkZpbmRTZXJ2aWNlQnlOYW1lKCJTIik7CisgIEVYUEVDVF9UUlVFKHNfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworICBFWFBFQ1RfRVEoIjEzOjEtMTY6MiIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciAqbV9kZXNjID0gc19kZXNjLT5GaW5kTWV0aG9kQnlOYW1lKCJNZXRob2QiKTsKKyAgRVhQRUNUX1RSVUUobV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiMTQ6My0xNDozMSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKK30KKworLy8gTWlzc2luZyBTb3VyY2VDb2RlSW5mbyBkb2Vzbid0IGNhdXNlIGNyYXNoOgorVEVTVF9GKFNvdXJjZUxvY2F0aW9uVGVzdCwgR2V0U291cmNlTG9jYXRpb25fTWlzc2luZ1NvdXJjZUNvZGVJbmZvKSB7CisgIFNvdXJjZUxvY2F0aW9uIGxvYzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgIGZpbGVfZGVzYy0+Q29weVRvKCZwcm90byk7ICAvLyBOb3RlLCB0aGlzIGRpc2NhcmRzIHRoZSBTb3VyY2VDb2RlSW5mby4KKyAgRVhQRUNUX0ZBTFNFKHByb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworCisgIERlc2NyaXB0b3JQb29sIGJhZDFfcG9vbCgmcG9vbF8pOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFkMV9maWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwoYmFkMV9wb29sLkJ1aWxkRmlsZShwcm90bykpOworICBjb25zdCBEZXNjcmlwdG9yICpiYWQxX2FfZGVzYyA9IGJhZDFfZmlsZV9kZXNjLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkEiKTsKKyAgRVhQRUNUX0ZBTFNFKGJhZDFfYV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7Cit9CisKKy8vIENvcnJ1cHQgU291cmNlQ29kZUluZm8gZG9lc24ndCBjYXVzZSBjcmFzaDoKK1RFU1RfRihTb3VyY2VMb2NhdGlvblRlc3QsIEdldFNvdXJjZUxvY2F0aW9uX0JvZ3VzU291cmNlQ29kZUluZm8pIHsKKyAgU291cmNlTG9jYXRpb24gbG9jOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgZmlsZV9kZXNjLT5Db3B5VG8oJnByb3RvKTsgIC8vIE5vdGUsIHRoaXMgZGlzY2FyZHMgdGhlIFNvdXJjZUNvZGVJbmZvLgorICBFWFBFQ1RfRkFMU0UocHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uICpsb2NfbXNnID0KKyAgICAgIHByb3RvLm11dGFibGVfc291cmNlX2NvZGVfaW5mbygpLT5hZGRfbG9jYXRpb24oKTsKKyAgbG9jX21zZy0+YWRkX3BhdGgoMSk7CisgIGxvY19tc2ctPmFkZF9wYXRoKDIpOworICBsb2NfbXNnLT5hZGRfcGF0aCgzKTsKKyAgbG9jX21zZy0+YWRkX3NwYW4oNCk7CisgIGxvY19tc2ctPmFkZF9zcGFuKDUpOworICBsb2NfbXNnLT5hZGRfc3Bhbig2KTsKKworICBEZXNjcmlwdG9yUG9vbCBiYWQyX3Bvb2woJnBvb2xfKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhZDJfZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKGJhZDJfcG9vbC5CdWlsZEZpbGUocHJvdG8pKTsKKyAgY29uc3QgRGVzY3JpcHRvciAqYmFkMl9hX2Rlc2MgPSBiYWQyX2ZpbGVfZGVzYy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJBIik7CisgIEVYUEVDVF9GQUxTRShiYWQyX2FfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NvbnN0IGNoYXIqIGNvbnN0IGtDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3RJbnB1dCA9CisgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAibWVzc2FnZSBGb28ge31cbiI7CisKKy8vIFJlcXVpcmVkIHNpbmNlIHNvdXJjZSBjb2RlIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZXJ2ZWQgYnkKKy8vIEZpbGVEZXNjcmlwdG9yVGVzdC4KK2NsYXNzIENvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIENvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdCgpCisgICAgICA6IHNvdXJjZV90cmVlXygiL3Rlc3QvdGVzdC5wcm90byIsIGtDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3RJbnB1dCksCisgICAgICAgIGRiXygmc291cmNlX3RyZWVfKSwKKyAgICAgICAgcG9vbF8oJmRiXywgJmNvbGxlY3Rvcl8pIHt9CisKKyBwcml2YXRlOgorICBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yIGNvbGxlY3Rvcl87CisgIFNpbmdsZXRvblNvdXJjZVRyZWUgc291cmNlX3RyZWVfOworICBjb21waWxlcjo6U291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBkYl87CisKKyBwcm90ZWN0ZWQ6CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworfTsKKworVEVTVF9GKENvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdCwgQ29weVRvX0RvZXNOb3RDb3B5U291cmNlQ29kZUluZm8pIHsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX2Rlc2NfcHJvdG87CisgIEFTU0VSVF9GQUxTRShmaWxlX2Rlc2NfcHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisKKyAgZmlsZV9kZXNjLT5Db3B5VG8oJmZpbGVfZGVzY19wcm90byk7CisgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2NfcHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Cit9CisKK1RFU1RfRihDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3QsIENvcHlTb3VyY2VDb2RlSW5mb1RvKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9kZXNjX3Byb3RvOworICBBU1NFUlRfRkFMU0UoZmlsZV9kZXNjX3Byb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworCisgIGZpbGVfZGVzYy0+Q29weVNvdXJjZUNvZGVJbmZvVG8oJmZpbGVfZGVzY19wcm90byk7CisgIGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBpbmZvID0gZmlsZV9kZXNjX3Byb3RvLnNvdXJjZV9jb2RlX2luZm8oKTsKKyAgQVNTRVJUX0VRKDMsIGluZm8ubG9jYXRpb25fc2l6ZSgpKTsKKyAgLy8gR2V0IHRoZSBGb28gbWVzc2FnZSBsb2NhdGlvbgorICBjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZm9vX2xvY2F0aW9uID0gaW5mby5sb2NhdGlvbigxKTsKKyAgQVNTRVJUX0VRKDIsIGZvb19sb2NhdGlvbi5wYXRoX3NpemUoKSk7CisgIEVYUEVDVF9FUShGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwgZm9vX2xvY2F0aW9uLnBhdGgoMCkpOworICBFWFBFQ1RfRVEoMCwgZm9vX2xvY2F0aW9uLnBhdGgoMSkpOyAgICAgIC8vIEZvbyBpcyB0aGUgZmlyc3QgbWVzc2FnZSBkZWZpbmVkCisgIEFTU0VSVF9FUSgzLCBmb29fbG9jYXRpb24uc3Bhbl9zaXplKCkpOyAgLy8gRm9vIHNwYW5zIG9uZSBsaW5lCisgIEVYUEVDVF9FUSgxLCBmb29fbG9jYXRpb24uc3BhbigwKSk7ICAgICAgLy8gRm9vIGlzIGRlY2xhcmVkIG9uIGxpbmUgMQorICBFWFBFQ1RfRVEoMCwgZm9vX2xvY2F0aW9uLnNwYW4oMSkpOyAgICAgIC8vIEZvbyBzdGFydHMgYXQgY29sdW1uIDAKKyAgRVhQRUNUX0VRKDE0LCBmb29fbG9jYXRpb24uc3BhbigyKSk7ICAgICAvLyBGb28gZW5kcyBvbiBjb2x1bW4gMTQKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK30gIC8vIG5hbWVzcGFjZSBkZXNjcmlwdG9yX3VuaXR0ZXN0Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmVjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjCkBAIC0wLDAgKzEsNTcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBEeW5hbWljTWVzc2FnZSBpcyBpbXBsZW1lbnRlZCBieSBjb25zdHJ1Y3RpbmcgYSBkYXRhIHN0cnVjdHVyZSB3aGljaAorLy8gaGFzIHJvdWdobHkgdGhlIHNhbWUgbWVtb3J5IGxheW91dCBhcyBhIGdlbmVyYXRlZCBtZXNzYWdlIHdvdWxkIGhhdmUuCisvLyBUaGVuLCB3ZSB1c2UgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24gdG8gaW1wbGVtZW50IG91ciByZWZsZWN0aW9uCisvLyBpbnRlcmZhY2UuICBBbGwgdGhlIG90aGVyIG9wZXJhdGlvbnMgd2UgbmVlZCB0byBpbXBsZW1lbnQgKGUuZy4KKy8vIHBhcnNpbmcsIGNvcHlpbmcsIGV0Yy4pIGFyZSBhbHJlYWR5IGltcGxlbWVudGVkIGluIHRlcm1zIG9mCisvLyBSZWZsZWN0aW9uLCBzbyB0aGUgcmVzdCBpcyBlYXN5LgorLy8KKy8vIFRoZSB1cCBzaWRlIG9mIHRoaXMgc3RyYXRlZ3kgaXMgdGhhdCBpdCdzIHZlcnkgZWZmaWNpZW50LiAgV2UgZG9uJ3QKKy8vIG5lZWQgdG8gdXNlIGhhc2hfbWFwcyBvciBnZW5lcmljIHJlcHJlc2VudGF0aW9ucyBvZiBmaWVsZHMuICBUaGUKKy8vIGRvd24gc2lkZSBpcyB0aGF0IHRoaXMgaXMgYSBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQgaGFjayB3aGljaAorLy8gY2FuIGJlIHRyaWNreSB0byBnZXQgcmlnaHQuCisvLworLy8gQXMgbWVudGlvbmVkIGluIHRoZSBoZWFkZXIsIHdlIG9ubHkgZXhwb3NlIGEgRHluYW1pY01lc3NhZ2VGYWN0b3J5CisvLyBwdWJsaWNseSwgbm90IHRoZSBEeW5hbWljTWVzc2FnZSBjbGFzcyBpdHNlbGYuICBUaGlzIGlzIGJlY2F1c2UKKy8vIEdlbmVyaWNNZXNzYWdlUmVmbGVjdGlvbiB3YW50cyB0byBoYXZlIGEgcG9pbnRlciB0byBhICJkZWZhdWx0IgorLy8gY29weSBvZiB0aGUgY2xhc3MsIHdpdGggYWxsIGZpZWxkcyBpbml0aWFsaXplZCB0byB0aGVpciBkZWZhdWx0CisvLyB2YWx1ZXMuICBXZSBvbmx5IHdhbnQgdG8gY29uc3RydWN0IG9uZSBvZiB0aGVzZSBwZXIgbWVzc2FnZSB0eXBlLAorLy8gc28gRHluYW1pY01lc3NhZ2VGYWN0b3J5IHN0b3JlcyBhIGNhY2hlIG9mIGRlZmF1bHQgbWVzc2FnZXMgZm9yCisvLyBlYWNoIHR5cGUgaXQgc2VlcyAoZWFjaCB1bmlxdWUgRGVzY3JpcHRvciBwb2ludGVyKS4gIFRoZSBjb2RlCisvLyByZWZlcnMgdG8gdGhlICJkZWZhdWx0IiBjb3B5IG9mIHRoZSBjbGFzcyBhcyB0aGUgInByb3RvdHlwZSIuCisvLworLy8gTm90ZSBvbiBtZW1vcnkgYWxsb2NhdGlvbjogIFRoaXMgbW9kdWxlIG9mdGVuIGNhbGxzICJvcGVyYXRvciBuZXcoKSIKKy8vIHRvIGFsbG9jYXRlIHVudHlwZWQgbWVtb3J5LCByYXRoZXIgdGhhbiBjYWxsaW5nIHNvbWV0aGluZyBsaWtlCisvLyAibmV3IHVpbnQ4W10iLiAgVGhpcyBpcyBiZWNhdXNlICJvcGVyYXRvciBuZXcoKSIgbWVhbnMgIkdpdmUgbWUgc29tZQorLy8gc3BhY2Ugd2hpY2ggSSBjYW4gdXNlIGFzIEkgcGxlYXNlLiIgd2hpbGUgIm5ldyB1aW50OFtdIiBtZWFucyAiR2l2ZQorLy8gbWUgYW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnMuIi4gIEluIHByYWN0aWNlLCB0aGUgbGF0ZXIgbWF5IHJldHVybgorLy8gYSBwb2ludGVyIHRoYXQgaXMgbm90IGFsaWduZWQgY29ycmVjdGx5IGZvciBnZW5lcmFsIHVzZS4gIEkgYmVsaWV2ZQorLy8gSXRlbSA4IG9mICJNb3JlIEVmZmVjdGl2ZSBDKysiIGRpc2N1c3NlcyB0aGlzIGluIG1vcmUgZGV0YWlsLCB0aG91Z2gKKy8vIEkgZG9uJ3QgaGF2ZSB0aGUgYm9vayBvbiBtZSByaWdodCBub3cgc28gSSdtIG5vdCBzdXJlLgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgaW50ZXJuYWw6OkV4dGVuc2lvblNldDsKK3VzaW5nIGludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTb21lIGhlbHBlciB0YWJsZXMgYW5kIGZ1bmN0aW9ucy4uLgorCituYW1lc3BhY2UgeworCisvLyBDb21wdXRlIHRoZSBieXRlIHNpemUgb2YgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmllbGQuCitpbnQgRmllbGRTcGFjZVVzZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIGxpbmUgd3JhcHBpbmcKKyAgaWYgKGZpZWxkLT5sYWJlbCgpID09IEZEOjpMQUJFTF9SRVBFQVRFRCkgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfSU5UMzIgIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGludDMyICAgPik7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0lOVDY0ICA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDxpbnQ2NCAgID4pOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9VSU5UMzIgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8dWludDMyICA+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfVUlOVDY0IDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPHVpbnQ2NCAgPik7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0RPVUJMRSA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDxkb3VibGUgID4pOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9GTE9BVCAgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8ZmxvYXQgICA+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfQk9PTCAgIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGJvb2wgICAgPik7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0VOVU0gICA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDxpbnQgICAgID4pOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9NRVNTQUdFOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4pOworCisgICAgICBjYXNlIEZEOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0lOVDMyICA6IHJldHVybiBzaXplb2YoaW50MzIgICApOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQ2NCAgOiByZXR1cm4gc2l6ZW9mKGludDY0ICAgKTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfVUlOVDMyIDogcmV0dXJuIHNpemVvZih1aW50MzIgICk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX1VJTlQ2NCA6IHJldHVybiBzaXplb2YodWludDY0ICApOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9ET1VCTEUgOiByZXR1cm4gc2l6ZW9mKGRvdWJsZSAgKTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRkxPQVQgIDogcmV0dXJuIHNpemVvZihmbG9hdCAgICk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0JPT0wgICA6IHJldHVybiBzaXplb2YoYm9vbCAgICApOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9FTlVNICAgOiByZXR1cm4gc2l6ZW9mKGludCAgICAgKTsKKworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICByZXR1cm4gc2l6ZW9mKE1lc3NhZ2UqKTsKKworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIHJldHVybiBzaXplb2Yoc3RyaW5nKik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gMDsKK30KKworaW5saW5lIGludCBEaXZpZGVSb3VuZGluZ1VwKGludCBpLCBpbnQgaikgeworICByZXR1cm4gKGkgKyAoaiAtIDEpKSAvIGo7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga1NhZmVBbGlnbm1lbnQgPSBzaXplb2YodWludDY0KTsKKworaW5saW5lIGludCBBbGlnblRvKGludCBvZmZzZXQsIGludCBhbGlnbm1lbnQpIHsKKyAgcmV0dXJuIERpdmlkZVJvdW5kaW5nVXAob2Zmc2V0LCBhbGlnbm1lbnQpICogYWxpZ25tZW50OworfQorCisvLyBSb3VuZHMgdGhlIGdpdmVuIGJ5dGUgb2Zmc2V0IHVwIHRvIHRoZSBuZXh0IG9mZnNldCBhbGlnbmVkIHN1Y2ggdGhhdCBhbnkKKy8vIHR5cGUgbWF5IGJlIHN0b3JlZCBhdCBpdC4KK2lubGluZSBpbnQgQWxpZ25PZmZzZXQoaW50IG9mZnNldCkgeworICByZXR1cm4gQWxpZ25UbyhvZmZzZXQsIGtTYWZlQWxpZ25tZW50KTsKK30KKworI2RlZmluZSBiaXRzaXplb2YoVCkgKHNpemVvZihUKSAqIDgpCisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIER5bmFtaWNNZXNzYWdlIDogcHVibGljIE1lc3NhZ2UgeworIHB1YmxpYzoKKyAgc3RydWN0IFR5cGVJbmZvIHsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgaGFzX2JpdHNfb2Zmc2V0OworICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQ7CisgICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0OworCisgICAgLy8gTm90IG93bmVkIGJ5IHRoZSBUeXBlSW5mby4KKyAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkqIGZhY3Rvcnk7ICAvLyBUaGUgZmFjdG9yeSB0aGF0IGNyZWF0ZWQgdGhpcyBvYmplY3QuCisgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2w7ICAgICAgLy8gVGhlIGZhY3RvcnkncyBEZXNjcmlwdG9yUG9vbC4KKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlOyAgICAgICAgICAvLyBUeXBlIG9mIHRoaXMgRHluYW1pY01lc3NhZ2UuCisKKyAgICAvLyBXYXJuaW5nOiAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIGRlZmluZWQgaXMKKyAgICAvLyAgIGltcG9ydGFudCAodGhlIHByb3RvdHlwZSBtdXN0IGJlIGRlbGV0ZWQgKmJlZm9yZSogdGhlIG9mZnNldHMpLgorICAgIHNjb3BlZF9hcnJheTxpbnQ+IG9mZnNldHM7CisgICAgc2NvcGVkX3B0cjxjb25zdCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbj4gcmVmbGVjdGlvbjsKKyAgICAvLyBEb24ndCB1c2UgYSBzY29wZWRfcHRyIHRvIGhvbGQgdGhlIHByb3RvdHlwZTogdGhlIGRlc3RydWN0b3IgZm9yCisgICAgLy8gRHluYW1pY01lc3NhZ2UgbmVlZHMgdG8ga25vdyB3aGV0aGVyIGl0IGlzIHRoZSBwcm90b3R5cGUsIGFuZCBkb2VzIHNvIGJ5CisgICAgLy8gbG9va2luZyBiYWNrIGF0IHRoaXMgZmllbGQuIFRoaXMgd291bGQgYXNzdW1lIGRldGFpbHMgYWJvdXQgdGhlCisgICAgLy8gaW1wbGVtZW50YXRpb24gb2Ygc2NvcGVkX3B0ci4KKyAgICBjb25zdCBEeW5hbWljTWVzc2FnZSogcHJvdG90eXBlOworCisgICAgVHlwZUluZm8oKSA6IHByb3RvdHlwZShOVUxMKSB7fQorCisgICAgflR5cGVJbmZvKCkgeworICAgICAgZGVsZXRlIHByb3RvdHlwZTsKKyAgICB9CisgIH07CisKKyAgRHluYW1pY01lc3NhZ2UoY29uc3QgVHlwZUluZm8qIHR5cGVfaW5mbyk7CisgIH5EeW5hbWljTWVzc2FnZSgpOworCisgIC8vIENhbGxlZCBvbiB0aGUgcHJvdG90eXBlIGFmdGVyIGNvbnN0cnVjdGlvbiB0byBpbml0aWFsaXplIG1lc3NhZ2UgZmllbGRzLgorICB2b2lkIENyb3NzTGlua1Byb3RvdHlwZXMoKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIE1lc3NhZ2UqIE5ldygpIGNvbnN0OworCisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3Q7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisKKyAgTWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEeW5hbWljTWVzc2FnZSk7CisKKyAgaW5saW5lIGJvb2wgaXNfcHJvdG90eXBlKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlX2luZm9fLT5wcm90b3R5cGUgPT0gdGhpcyB8fAorICAgICAgICAgICAvLyBJZiB0eXBlX2luZm9fLT5wcm90b3R5cGUgaXMgTlVMTCwgdGhlbiB3ZSBtdXN0IGJlIGNvbnN0cnVjdGluZworICAgICAgICAgICAvLyB0aGUgcHJvdG90eXBlIG5vdywgd2hpY2ggbWVhbnMgd2UgbXVzdCBiZSB0aGUgcHJvdG90eXBlLgorICAgICAgICAgICB0eXBlX2luZm9fLT5wcm90b3R5cGUgPT0gTlVMTDsKKyAgfQorCisgIGlubGluZSB2b2lkKiBPZmZzZXRUb1BvaW50ZXIoaW50IG9mZnNldCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4odGhpcykgKyBvZmZzZXQ7CisgIH0KKyAgaW5saW5lIGNvbnN0IHZvaWQqIE9mZnNldFRvUG9pbnRlcihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPih0aGlzKSArIG9mZnNldDsKKyAgfQorCisgIGNvbnN0IFR5cGVJbmZvKiB0eXBlX2luZm9fOworCisgIC8vIFRPRE8oa2VudG9uKTogIE1ha2UgdGhpcyBhbiBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KKyAgbXV0YWJsZSBpbnQgY2FjaGVkX2J5dGVfc2l6ZV87Cit9OworCitEeW5hbWljTWVzc2FnZTo6RHluYW1pY01lc3NhZ2UoY29uc3QgVHlwZUluZm8qIHR5cGVfaW5mbykKKyAgOiB0eXBlX2luZm9fKHR5cGVfaW5mbyksCisgICAgY2FjaGVkX2J5dGVfc2l6ZV8oMCkgeworICAvLyBXZSBuZWVkIHRvIGNhbGwgY29uc3RydWN0b3JzIGZvciB2YXJpb3VzIGZpZWxkcyBtYW51YWxseSBhbmQgc2V0CisgIC8vIGRlZmF1bHQgdmFsdWVzIHdoZXJlIGFwcHJvcHJpYXRlLiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgdG8gY2FsbAorICAvLyBjb25zdHJ1Y3RvcnMuICBJZiB5b3UgaGF2ZW4ndCBoZWFyZCBvZiBwbGFjZW1lbnQgbmV3LCBJIHN1Z2dlc3QgR29vZ2xpbmcKKyAgLy8gaXQgbm93LiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgZXZlbiBmb3IgcHJpbWl0aXZlIHR5cGVzIHRoYXQgZG9uJ3QgaGF2ZQorICAvLyBjb25zdHJ1Y3RvcnMgZm9yIGNvbnNpc3RlbmN5LiAgKEluIHRoZW9yeSwgcGxhY2VtZW50IG5ldyBzaG91bGQgYmUgdXNlZAorICAvLyBhbnkgdGltZSB5b3UgYXJlIHRyeWluZyB0byBjb252ZXJ0IHVudHlwZWQgbWVtb3J5IHRvIHR5cGVkIG1lbW9yeSwgdGhvdWdoCisgIC8vIGluIHByYWN0aWNlIHRoYXQncyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvciB0eXBlcyB0aGF0IGRvbid0IGhhdmUgYQorICAvLyBjb25zdHJ1Y3Rvci4pCisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHR5cGVfaW5mb18tPnR5cGU7CisKKyAgbmV3KE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT51bmtub3duX2ZpZWxkc19vZmZzZXQpKSBVbmtub3duRmllbGRTZXQ7CisKKyAgaWYgKHR5cGVfaW5mb18tPmV4dGVuc2lvbnNfb2Zmc2V0ICE9IC0xKSB7CisgICAgbmV3KE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5leHRlbnNpb25zX29mZnNldCkpIEV4dGVuc2lvblNldDsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICAgIHZvaWQqIGZpZWxkX3B0ciA9IE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5vZmZzZXRzW2ldKTsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbmV3KGZpZWxkX3B0cikgVFlQRShmaWVsZC0+ZGVmYXVsdF92YWx1ZV8jI1RZUEUoKSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG5ldyhmaWVsZF9wdHIpIFJlcGVhdGVkRmllbGQ8VFlQRT4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyICwgaW50MzIgKTsKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0ICwgaW50NjQgKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wgICwgYm9vbCAgKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgbmV3KGZpZWxkX3B0cikgaW50KGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5ldyhmaWVsZF9wdHIpIFJlcGVhdGVkRmllbGQ8aW50PigpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgICAgaWYgKGlzX3Byb3RvdHlwZSgpKSB7CisgICAgICAgICAgICAgICAgbmV3KGZpZWxkX3B0cikgY29uc3Qgc3RyaW5nKigmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmluZyogZGVmYXVsdF92YWx1ZSA9CisgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxzdHJpbmcqIGNvbnN0Kj4oCisgICAgICAgICAgICAgICAgICAgIHR5cGVfaW5mb18tPnByb3RvdHlwZS0+T2Zmc2V0VG9Qb2ludGVyKAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVfaW5mb18tPm9mZnNldHNbaV0pKTsKKyAgICAgICAgICAgICAgICBuZXcoZmllbGRfcHRyKSBzdHJpbmcqKGRlZmF1bHRfdmFsdWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBuZXcoZmllbGRfcHRyKSBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7CisgICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBuZXcoZmllbGRfcHRyKSBNZXNzYWdlKihOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXcoZmllbGRfcHRyKSBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK0R5bmFtaWNNZXNzYWdlOjp+RHluYW1pY01lc3NhZ2UoKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSB0eXBlX2luZm9fLT50eXBlOworCisgIHJlaW50ZXJwcmV0X2Nhc3Q8VW5rbm93bkZpZWxkU2V0Kj4oCisgICAgT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPnVua25vd25fZmllbGRzX29mZnNldCkpLT5+VW5rbm93bkZpZWxkU2V0KCk7CisKKyAgaWYgKHR5cGVfaW5mb18tPmV4dGVuc2lvbnNfb2Zmc2V0ICE9IC0xKSB7CisgICAgcmVpbnRlcnByZXRfY2FzdDxFeHRlbnNpb25TZXQqPigKKyAgICAgIE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5leHRlbnNpb25zX29mZnNldCkpLT5+RXh0ZW5zaW9uU2V0KCk7CisgIH0KKworICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IHJ1biB0aGUgZGVzdHJ1Y3RvcnMgZm9yIHJlcGVhdGVkIGZpZWxkcyBhbmQgc3RyaW5ncywKKyAgLy8ganVzdCBhcyB3ZSByYW4gdGhlaXIgY29uc3RydWN0b3JzIGluIHRoZSB0aGUgRHluYW1pY01lc3NhZ2UgY29uc3RydWN0b3IuCisgIC8vIEFkZGl0aW9uYWxseSwgaWYgYW55IHNpbmd1bGFyIGVtYmVkZGVkIG1lc3NhZ2VzIGhhdmUgYmVlbiBhbGxvY2F0ZWQsIHdlCisgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZW0sIFVOTEVTUyB3ZSBhcmUgdGhlIHByb3RvdHlwZSBtZXNzYWdlIG9mIHRoaXMgdHlwZSwKKyAgLy8gaW4gd2hpY2ggY2FzZSBhbnkgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIG90aGVyIHByb3RvdHlwZXMgYW5kIHNob3VsZG4ndAorICAvLyBiZSB0b3VjaGVkLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgICB2b2lkKiBmaWVsZF9wdHIgPSBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSk7CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPio+KGZpZWxkX3B0cikgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Kj4oZmllbGRfcHRyKQorICAgICAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPio+KGZpZWxkX3B0cikKKyAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPigpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICAgIHN0cmluZyogcHRyID0gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RyaW5nKio+KGZpZWxkX3B0cik7CisgICAgICAgICAgaWYgKHB0ciAhPSAmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgaWYgKCFpc19wcm90b3R5cGUoKSkgeworICAgICAgICBNZXNzYWdlKiBtZXNzYWdlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8TWVzc2FnZSoqPihmaWVsZF9wdHIpOworICAgICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICAgICAgZGVsZXRlIG1lc3NhZ2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBEeW5hbWljTWVzc2FnZTo6Q3Jvc3NMaW5rUHJvdG90eXBlcygpIHsKKyAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gdGhlIHByb3RvdHlwZSBtZXNzYWdlLgorICBHT09HTEVfQ0hFQ0soaXNfcHJvdG90eXBlKCkpOworCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IHR5cGVfaW5mb18tPmZhY3Rvcnk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSB0eXBlX2luZm9fLT50eXBlOworCisgIC8vIENyb3NzLWxpbmsgZGVmYXVsdCBtZXNzYWdlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7CisgICAgdm9pZCogZmllbGRfcHRyID0gT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPm9mZnNldHNbaV0pOworCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAgICFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgLy8gRm9yIGZpZWxkcyB3aXRoIG1lc3NhZ2UgdHlwZXMsIHdlIG5lZWQgdG8gY3Jvc3MtbGluayB3aXRoIHRoZQorICAgICAgLy8gcHJvdG90eXBlIGZvciB0aGUgZmllbGQncyB0eXBlLgorICAgICAgLy8gRm9yIHNpbmd1bGFyIGZpZWxkcywgdGhlIGZpZWxkIGlzIGp1c3QgYSBwb2ludGVyIHdoaWNoIHNob3VsZAorICAgICAgLy8gcG9pbnQgdG8gdGhlIHByb3RvdHlwZS4KKyAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IE1lc3NhZ2UqKj4oZmllbGRfcHRyKSA9CisgICAgICAgIGZhY3RvcnktPkdldFByb3RvdHlwZU5vTG9jayhmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICAgIH0KKyAgfQorfQorCitNZXNzYWdlKiBEeW5hbWljTWVzc2FnZTo6TmV3KCkgY29uc3QgeworICB2b2lkKiBuZXdfYmFzZSA9IG9wZXJhdG9yIG5ldyh0eXBlX2luZm9fLT5zaXplKTsKKyAgbWVtc2V0KG5ld19iYXNlLCAwLCB0eXBlX2luZm9fLT5zaXplKTsKKyAgcmV0dXJuIG5ldyhuZXdfYmFzZSkgRHluYW1pY01lc3NhZ2UodHlwZV9pbmZvXyk7Cit9CisKK2ludCBEeW5hbWljTWVzc2FnZTo6R2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGNhY2hlZF9ieXRlX3NpemVfOworfQorCit2b2lkIER5bmFtaWNNZXNzYWdlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIC8vIFRoaXMgaXMgdGhlb3JldGljYWxseSBub3QgdGhyZWFkLWNvbXBhdGlibGUsIGJ1dCBpbiBwcmFjdGljZSBpdCB3b3JrcworICAvLyBiZWNhdXNlIGlmIG11bHRpcGxlIHRocmVhZHMgd3JpdGUgdGhpcyBzaW11bHRhbmVvdXNseSwgdGhleSB3aWxsIGJlCisgIC8vIHdyaXRpbmcgdGhlIGV4YWN0IHNhbWUgdmFsdWUuCisgIGNhY2hlZF9ieXRlX3NpemVfID0gc2l6ZTsKK30KKworTWV0YWRhdGEgRHluYW1pY01lc3NhZ2U6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IHR5cGVfaW5mb18tPnR5cGU7CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSB0eXBlX2luZm9fLT5yZWZsZWN0aW9uLmdldCgpOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RydWN0IER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6UHJvdG90eXBlTWFwIHsKKyAgdHlwZWRlZiBoYXNoX21hcDxjb25zdCBEZXNjcmlwdG9yKiwgY29uc3QgRHluYW1pY01lc3NhZ2U6OlR5cGVJbmZvKj4gTWFwOworICBNYXAgbWFwXzsKK307CisKK0R5bmFtaWNNZXNzYWdlRmFjdG9yeTo6RHluYW1pY01lc3NhZ2VGYWN0b3J5KCkKKyAgOiBwb29sXyhOVUxMKSwgZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfKGZhbHNlKSwKKyAgICBwcm90b3R5cGVzXyhuZXcgUHJvdG90eXBlTWFwKSB7Cit9CisKK0R5bmFtaWNNZXNzYWdlRmFjdG9yeTo6RHluYW1pY01lc3NhZ2VGYWN0b3J5KGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKQorICA6IHBvb2xfKHBvb2wpLCBkZWxlZ2F0ZV90b19nZW5lcmF0ZWRfZmFjdG9yeV8oZmFsc2UpLAorICAgIHByb3RvdHlwZXNfKG5ldyBQcm90b3R5cGVNYXApIHsKK30KKworRHluYW1pY01lc3NhZ2VGYWN0b3J5Ojp+RHluYW1pY01lc3NhZ2VGYWN0b3J5KCkgeworICBmb3IgKFByb3RvdHlwZU1hcDo6TWFwOjppdGVyYXRvciBpdGVyID0gcHJvdG90eXBlc18tPm1hcF8uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IHByb3RvdHlwZXNfLT5tYXBfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBkZWxldGUgaXRlci0+c2Vjb25kOworICB9Cit9CisKK2NvbnN0IE1lc3NhZ2UqIER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6R2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKKyAgTXV0ZXhMb2NrIGxvY2soJnByb3RvdHlwZXNfbXV0ZXhfKTsKKyAgcmV0dXJuIEdldFByb3RvdHlwZU5vTG9jayh0eXBlKTsKK30KKworY29uc3QgTWVzc2FnZSogRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpHZXRQcm90b3R5cGVOb0xvY2soCisgICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSkgeworICBpZiAoZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfICYmCisgICAgICB0eXBlLT5maWxlKCktPnBvb2woKSA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSkgeworICAgIHJldHVybiBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKHR5cGUpOworICB9CisKKyAgY29uc3QgRHluYW1pY01lc3NhZ2U6OlR5cGVJbmZvKiogdGFyZ2V0ID0gJnByb3RvdHlwZXNfLT5tYXBfW3R5cGVdOworICBpZiAoKnRhcmdldCAhPSBOVUxMKSB7CisgICAgLy8gQWxyZWFkeSBleGlzdHMuCisgICAgcmV0dXJuICgqdGFyZ2V0KS0+cHJvdG90eXBlOworICB9CisKKyAgRHluYW1pY01lc3NhZ2U6OlR5cGVJbmZvKiB0eXBlX2luZm8gPSBuZXcgRHluYW1pY01lc3NhZ2U6OlR5cGVJbmZvOworICAqdGFyZ2V0ID0gdHlwZV9pbmZvOworCisgIHR5cGVfaW5mby0+dHlwZSA9IHR5cGU7CisgIHR5cGVfaW5mby0+cG9vbCA9IChwb29sXyA9PSBOVUxMKSA/IHR5cGUtPmZpbGUoKS0+cG9vbCgpIDogcG9vbF87CisgIHR5cGVfaW5mby0+ZmFjdG9yeSA9IHRoaXM7CisKKyAgLy8gV2UgbmVlZCB0byBjb25zdHJ1Y3QgYWxsIHRoZSBzdHJ1Y3R1cmVzIHBhc3NlZCB0bworICAvLyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbidzIGNvbnN0cnVjdG9yLiAgVGhpcyBpbmNsdWRlczoKKyAgLy8gLSBBIGJsb2NrIG9mIG1lbW9yeSB0aGF0IGNvbnRhaW5zIHNwYWNlIGZvciBhbGwgdGhlIG1lc3NhZ2UncyBmaWVsZHMuCisgIC8vIC0gQW4gYXJyYXkgb2YgaW50ZWdlcnMgaW5kaWNhdGluZyB0aGUgYnl0ZSBvZmZzZXQgb2YgZWFjaCBmaWVsZCB3aXRoaW4KKyAgLy8gICB0aGlzIGJsb2NrLgorICAvLyAtIEEgYmlnIGJpdGZpZWxkIGNvbnRhaW5pbmcgYSBiaXQgZm9yIGVhY2ggZmllbGQgaW5kaWNhdGluZyB3aGV0aGVyCisgIC8vICAgb3Igbm90IHRoYXQgZmllbGQgaXMgc2V0LgorCisgIC8vIENvbXB1dGUgc2l6ZSBhbmQgb2Zmc2V0cy4KKyAgaW50KiBvZmZzZXRzID0gbmV3IGludFt0eXBlLT5maWVsZF9jb3VudCgpXTsKKyAgdHlwZV9pbmZvLT5vZmZzZXRzLnJlc2V0KG9mZnNldHMpOworCisgIC8vIERlY2lkZSBhbGwgZmllbGQgb2Zmc2V0cyBieSBwYWNraW5nIGluIG9yZGVyLgorICAvLyBXZSBwbGFjZSB0aGUgRHluYW1pY01lc3NhZ2Ugb2JqZWN0IGl0c2VsZiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhbGxvY2F0ZWQKKyAgLy8gc3BhY2UuCisgIGludCBzaXplID0gc2l6ZW9mKER5bmFtaWNNZXNzYWdlKTsKKyAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOworCisgIC8vIE5leHQgdGhlIGhhc19iaXRzLCB3aGljaCBpcyBhbiBhcnJheSBvZiB1aW50MzJzLgorICB0eXBlX2luZm8tPmhhc19iaXRzX29mZnNldCA9IHNpemU7CisgIGludCBoYXNfYml0c19hcnJheV9zaXplID0KKyAgICBEaXZpZGVSb3VuZGluZ1VwKHR5cGUtPmZpZWxkX2NvdW50KCksIGJpdHNpemVvZih1aW50MzIpKTsKKyAgc2l6ZSArPSBoYXNfYml0c19hcnJheV9zaXplICogc2l6ZW9mKHVpbnQzMik7CisgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKworICAvLyBUaGUgRXh0ZW5zaW9uU2V0LCBpZiBhbnkuCisgIGlmICh0eXBlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICB0eXBlX2luZm8tPmV4dGVuc2lvbnNfb2Zmc2V0ID0gc2l6ZTsKKyAgICBzaXplICs9IHNpemVvZihFeHRlbnNpb25TZXQpOworICAgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBObyBleHRlbnNpb25zLgorICAgIHR5cGVfaW5mby0+ZXh0ZW5zaW9uc19vZmZzZXQgPSAtMTsKKyAgfQorCisgIC8vIEFsbCB0aGUgZmllbGRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIC8vIE1ha2Ugc3VyZSBmaWVsZCBpcyBhbGlnbmVkIHRvIGF2b2lkIGJ1cyBlcnJvcnMuCisgICAgaW50IGZpZWxkX3NpemUgPSBGaWVsZFNwYWNlVXNlZCh0eXBlLT5maWVsZChpKSk7CisgICAgc2l6ZSA9IEFsaWduVG8oc2l6ZSwgbWluKGtTYWZlQWxpZ25tZW50LCBmaWVsZF9zaXplKSk7CisgICAgb2Zmc2V0c1tpXSA9IHNpemU7CisgICAgc2l6ZSArPSBmaWVsZF9zaXplOworICB9CisKKyAgLy8gQWRkIHRoZSBVbmtub3duRmllbGRTZXQgdG8gdGhlIGVuZC4KKyAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOworICB0eXBlX2luZm8tPnVua25vd25fZmllbGRzX29mZnNldCA9IHNpemU7CisgIHNpemUgKz0gc2l6ZW9mKFVua25vd25GaWVsZFNldCk7CisKKyAgLy8gQWxpZ24gdGhlIGZpbmFsIHNpemUgdG8gbWFrZSBzdXJlIG5vIGNsZXZlciBhbGxvY2F0b3JzIHRoaW5rIHRoYXQKKyAgLy8gYWxpZ25tZW50IGlzIG5vdCBuZWNlc3NhcnkuCisgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKyAgdHlwZV9pbmZvLT5zaXplID0gc2l6ZTsKKworICAvLyBBbGxvY2F0ZSB0aGUgcHJvdG90eXBlLgorICB2b2lkKiBiYXNlID0gb3BlcmF0b3IgbmV3KHNpemUpOworICBtZW1zZXQoYmFzZSwgMCwgc2l6ZSk7CisgIER5bmFtaWNNZXNzYWdlKiBwcm90b3R5cGUgPSBuZXcoYmFzZSkgRHluYW1pY01lc3NhZ2UodHlwZV9pbmZvKTsKKyAgdHlwZV9pbmZvLT5wcm90b3R5cGUgPSBwcm90b3R5cGU7CisKKyAgLy8gQ29uc3RydWN0IHRoZSByZWZsZWN0aW9uIG9iamVjdC4KKyAgdHlwZV9pbmZvLT5yZWZsZWN0aW9uLnJlc2V0KAorICAgIG5ldyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIHR5cGVfaW5mby0+dHlwZSwKKyAgICAgIHR5cGVfaW5mby0+cHJvdG90eXBlLAorICAgICAgdHlwZV9pbmZvLT5vZmZzZXRzLmdldCgpLAorICAgICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQsCisgICAgICB0eXBlX2luZm8tPnVua25vd25fZmllbGRzX29mZnNldCwKKyAgICAgIHR5cGVfaW5mby0+ZXh0ZW5zaW9uc19vZmZzZXQsCisgICAgICB0eXBlX2luZm8tPnBvb2wsCisgICAgICB0aGlzLAorICAgICAgdHlwZV9pbmZvLT5zaXplKSk7CisKKyAgLy8gQ3Jvc3MgbGluayBwcm90b3R5cGVzLgorICBwcm90b3R5cGUtPkNyb3NzTGlua1Byb3RvdHlwZXMoKTsKKworICByZXR1cm4gcHJvdG90eXBlOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2QxZTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBEZWZpbmVzIGFuIGltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2Ugd2hpY2ggY2FuIGVtdWxhdGUgdHlwZXMgd2hpY2ggYXJlIG5vdAorLy8ga25vd24gYXQgY29tcGlsZS10aW1lLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9EWU5BTUlDX01FU1NBR0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9EWU5BTUlDX01FU1NBR0VfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgorY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgRGVzY3JpcHRvclBvb2w7ICAgIC8vIGRlc2NyaXB0b3IuaAorCisvLyBDb25zdHJ1Y3RzIGltcGxlbWVudGF0aW9ucyBvZiBNZXNzYWdlIHdoaWNoIGNhbiBlbXVsYXRlIHR5cGVzIHdoaWNoIGFyZSBub3QKKy8vIGtub3duIGF0IGNvbXBpbGUtdGltZS4KKy8vCisvLyBTb21ldGltZXMgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBtYW5pcHVsYXRlIHByb3RvY29sIHR5cGVzIHRoYXQgeW91IGRvbid0CisvLyBrbm93IGFib3V0IGF0IGNvbXBpbGUgdGltZS4gIEl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBjb25zdHJ1Y3QKKy8vIGEgTWVzc2FnZSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgbWVzc2FnZSB0eXBlIGdpdmVuIGJ5IGFueSBhcmJpdHJhcnkKKy8vIERlc2NyaXB0b3IuICBEeW5hbWljTWVzc2FnZSBwcm92aWRlcyB0aGlzLgorLy8KKy8vIEFzIGl0IHR1cm5zIG91dCwgYSBEeW5hbWljTWVzc2FnZSBuZWVkcyB0byBjb25zdHJ1Y3QgZXh0cmEKKy8vIGluZm9ybWF0aW9uIGFib3V0IGl0cyB0eXBlIGluIG9yZGVyIHRvIG9wZXJhdGUuICBNb3N0IG9mIHRoaXMgaW5mb3JtYXRpb24KKy8vIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBhbGwgRHluYW1pY01lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuICBCdXQsIGNhY2hpbmcKKy8vIHRoaXMgaW5mb3JtYXRpb24gaW4gc29tZSBzb3J0IG9mIGdsb2JhbCBtYXAgd291bGQgYmUgYSBiYWQgaWRlYSwgc2luY2UKKy8vIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBkZXNjcmlwdG9yIGNvdWxkIG91dGxpdmUgdGhlCisvLyBkZXNjcmlwdG9yIGl0c2VsZi4gIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgRHluYW1pY01lc3NhZ2VGYWN0b3J5CisvLyBlbmNhcHN1bGF0ZXMgdGhpcyAiY2FjaGUiLiAgQWxsIER5bmFtaWNNZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlIGNyZWF0ZWQKKy8vIGZyb20gdGhlIHNhbWUgZmFjdG9yeSB3aWxsIHNoYXJlIHRoZSBzYW1lIHN1cHBvcnQgZGF0YS4gIEFueSBEZXNjcmlwdG9ycworLy8gdXNlZCB3aXRoIGEgcGFydGljdWxhciBmYWN0b3J5IG11c3Qgb3V0bGl2ZSB0aGUgZmFjdG9yeS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEeW5hbWljTWVzc2FnZUZhY3RvcnkgOiBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0IGEgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHRoYXQgd2lsbCBzZWFyY2ggZm9yIGV4dGVuc2lvbnMgaW4KKyAgLy8gdGhlIERlc2NyaXB0b3JQb29sIGluIHdoaWNoIHRoZSBleHRlbmRlZSBpcyBkZWZpbmVkLgorICBEeW5hbWljTWVzc2FnZUZhY3RvcnkoKTsKKworICAvLyBDb25zdHJ1Y3QgYSBEeW5hbWljTWVzc2FnZUZhY3RvcnkgdGhhdCB3aWxsIHNlYXJjaCBmb3IgZXh0ZW5zaW9ucyBpbgorICAvLyB0aGUgZ2l2ZW4gRGVzY3JpcHRvclBvb2wuCisgIC8vCisgIC8vIERFUFJFQ0FURUQ6ICBVc2UgQ29kZWRJbnB1dFN0cmVhbTo6U2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSB0byB0ZWxsIHRoZQorICAvLyAgIHBhcnNlciB0byBsb29rIGZvciBleHRlbnNpb25zIGluIGFuIGFsdGVybmF0ZSBwb29sLiAgSG93ZXZlciwgbm90ZSB0aGF0CisgIC8vICAgdGhpcyBpcyBhbG1vc3QgbmV2ZXIgd2hhdCB5b3Ugd2FudCB0byBkby4gIEFsbW9zdCBhbGwgdXNlcnMgc2hvdWxkIHVzZQorICAvLyAgIHRoZSB6ZXJvLWFyZyBjb25zdHJ1Y3Rvci4KKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5KGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKTsKKworICB+RHluYW1pY01lc3NhZ2VGYWN0b3J5KCk7CisKKyAgLy8gQ2FsbCB0aGlzIHRvIHRlbGwgdGhlIER5bmFtaWNNZXNzYWdlRmFjdG9yeSB0aGF0IGlmIGl0IGlzIGdpdmVuIGEKKyAgLy8gRGVzY3JpcHRvciBkIGZvciB3aGljaDoKKyAgLy8gICBkLT5maWxlKCktPnBvb2woKSA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgLy8gdGhlbiBpdCBzaG91bGQgZGVsZWdhdGUgdG8gTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkgaW5zdGVhZAorICAvLyBvZiBjb25zdHJ1Y3RpbmcgYSBkeW5hbWljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiAgSW4gdGhlb3J5IHRoZXJlCisgIC8vIGlzIG5vIGRvd24gc2lkZSB0byBkb2luZyB0aGlzLCBzbyBpdCBtYXkgYmVjb21lIHRoZSBkZWZhdWx0IGluIHRoZSBmdXR1cmUuCisgIHZvaWQgU2V0RGVsZWdhdGVUb0dlbmVyYXRlZEZhY3RvcnkoYm9vbCBlbmFibGUpIHsKKyAgICBkZWxlZ2F0ZV90b19nZW5lcmF0ZWRfZmFjdG9yeV8gPSBlbmFibGU7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2VGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIEdpdmVuIGEgRGVzY3JpcHRvciwgY29uc3RydWN0cyB0aGUgZGVmYXVsdCAocHJvdG90eXBlKSBNZXNzYWdlIG9mIHRoYXQKKyAgLy8gdHlwZS4gIFlvdSBjYW4gdGhlbiBjYWxsIHRoYXQgbWVzc2FnZSdzIE5ldygpIG1ldGhvZCB0byBjb25zdHJ1Y3QgYQorICAvLyBtdXRhYmxlIG1lc3NhZ2Ugb2YgdGhhdCB0eXBlLgorICAvLworICAvLyBDYWxsaW5nIHRoaXMgbWV0aG9kIHR3aWNlIHdpdGggdGhlIHNhbWUgRGVzY3JpcHRvciByZXR1cm5zIHRoZSBzYW1lCisgIC8vIG9iamVjdC4gIFRoZSByZXR1cm5lZCBvYmplY3QgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgZmFjdG9yeSBhbmQgd2lsbAorICAvLyBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgZmFjdG9yeSBpcyBkZXN0cm95ZWQuICBBbHNvLCBhbnkgb2JqZWN0cyBjcmVhdGVkCisgIC8vIGJ5IGNhbGxpbmcgdGhlIHByb3RvdHlwZSdzIE5ldygpIG1ldGhvZCBzaGFyZSBzb21lIGRhdGEgd2l0aCB0aGUKKyAgLy8gcHJvdG90eXBlLCBzbyB0aGVzZSBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhlIER5bmFtaWNNZXNzYWdlRmFjdG9yeQorICAvLyBpcyBkZXN0cm95ZWQuCisgIC8vCisgIC8vIFRoZSBnaXZlbiBkZXNjcmlwdG9yIG11c3Qgb3V0bGl2ZSB0aGUgcmV0dXJuZWQgbWVzc2FnZSwgYW5kIGhlbmNlIG11c3QKKyAgLy8gb3V0bGl2ZSB0aGUgRHluYW1pY01lc3NhZ2VGYWN0b3J5LgorICAvLworICAvLyBUaGUgbWV0aG9kIGlzIHRocmVhZC1zYWZlLgorICBjb25zdCBNZXNzYWdlKiBHZXRQcm90b3R5cGUoY29uc3QgRGVzY3JpcHRvciogdHlwZSk7CisKKyBwcml2YXRlOgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbF87CisgIGJvb2wgZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfOworCisgIC8vIFRoaXMgc3RydWN0IGp1c3QgY29udGFpbnMgYSBoYXNoX21hcC4gIFdlIGNhbid0ICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPiBmcm9tCisgIC8vIHRoaXMgaGVhZGVyIGR1ZSB0byBoYWNrcyBuZWVkZWQgZm9yIGhhc2hfbWFwIHBvcnRhYmlsaXR5IGluIHRoZSBvcGVuIHNvdXJjZQorICAvLyByZWxlYXNlLiAgTmFtZWx5LCBzdHVicy9oYXNoLmgsIHdoaWNoIGRlZmluZXMgaGFzaF9tYXAgcG9ydGFibHksIGlzIG5vdCBhCisgIC8vIHB1YmxpYyBoZWFkZXIgKGZvciBnb29kIHJlYXNvbiksIGJ1dCBkeW5hbWljX21lc3NhZ2UuaCBpcywgYW5kIHB1YmxpYworICAvLyBoZWFkZXJzIG1heSBvbmx5ICNpbmNsdWRlIG90aGVyIHB1YmxpYyBoZWFkZXJzLgorICBzdHJ1Y3QgUHJvdG90eXBlTWFwOworICBzY29wZWRfcHRyPFByb3RvdHlwZU1hcD4gcHJvdG90eXBlc187CisgIG11dGFibGUgTXV0ZXggcHJvdG90eXBlc19tdXRleF87CisKKyAgZnJpZW5kIGNsYXNzIER5bmFtaWNNZXNzYWdlOworICBjb25zdCBNZXNzYWdlKiBHZXRQcm90b3R5cGVOb0xvY2soY29uc3QgRGVzY3JpcHRvciogdHlwZSk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKER5bmFtaWNNZXNzYWdlRmFjdG9yeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfRFlOQU1JQ19NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2MTU5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFNpbmNlIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZSBmb3IgRHluYW1pY01lc3NhZ2UgaXMgaW1wbGVtZW50ZWQgYnkKKy8vIEdlbmVyaWNNZXNzYWdlUmVmbGVjdGlvbiwgdGhlIG9ubHkgdGhpbmcgd2UgcmVhbGx5IGhhdmUgdG8gdGVzdCBpcworLy8gdGhhdCBEeW5hbWljTWVzc2FnZSBjb3JyZWN0bHkgc2V0cyB1cCB0aGUgaW5mb3JtYXRpb24gdGhhdAorLy8gR2VuZXJpY01lc3NhZ2VSZWZsZWN0aW9uIG5lZWRzIHRvIHVzZS4gIFNvLCB3ZSBmb2N1cyBvbiB0aGF0IGluIHRoaXMKKy8vIHRlc3QuICBPdGhlciB0ZXN0cywgc3VjaCBhcyBnZW5lcmljX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdCBhbmQKKy8vIHJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LCBjb3ZlciB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5CisvLyBEeW5hbWljTWVzc2FnZS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIER5bmFtaWNNZXNzYWdlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbnNpb25zX2Rlc2NyaXB0b3JfOworICBjb25zdCBNZXNzYWdlKiBleHRlbnNpb25zX3Byb3RvdHlwZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIHBhY2tlZF9kZXNjcmlwdG9yXzsKKyAgY29uc3QgTWVzc2FnZSogcGFja2VkX3Byb3RvdHlwZV87CisKKyAgRHluYW1pY01lc3NhZ2VUZXN0KCk6IGZhY3RvcnlfKCZwb29sXykge30KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBEeW5hbWljTWVzc2FnZSB3b3JrcyAocGFydGljdWxhcmx5IHdpdGgKKyAgICAvLyBleHRlbnNpb25zKSBldmVuIGlmIHdlIHVzZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSAqbm90KiBmcm9tIGNvbXBpbGVkLWluCisgICAgLy8gdHlwZXMsIHNvIHdlIG1ha2UgY29waWVzIG9mIHRoZSBkZXNjcmlwdG9ycyBmb3IgdW5pdHRlc3QucHJvdG8gYW5kCisgICAgLy8gdW5pdHRlc3RfaW1wb3J0LnByb3RvLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5pdHRlc3RfZmlsZTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIHVuaXR0ZXN0X2ltcG9ydF9maWxlOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19maWxlOworCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmdW5pdHRlc3RfZmlsZSk7CisgICAgdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKAorICAgICAgJnVuaXR0ZXN0X2ltcG9ydF9maWxlKTsKKyAgICB1bml0dGVzdF9pbXBvcnQ6OlB1YmxpY0ltcG9ydE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oCisgICAgICAmdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19maWxlKTsKKworICAgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZSh1bml0dGVzdF9pbXBvcnRfcHVibGljX2ZpbGUpICE9IE5VTEwpOworICAgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZSh1bml0dGVzdF9pbXBvcnRfZmlsZSkgIT0gTlVMTCk7CisgICAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKHVuaXR0ZXN0X2ZpbGUpICE9IE5VTEwpOworCisgICAgZGVzY3JpcHRvcl8gPSBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpOworICAgIEFTU0VSVF9UUlVFKGRlc2NyaXB0b3JfICE9IE5VTEwpOworICAgIHByb3RvdHlwZV8gPSBmYWN0b3J5Xy5HZXRQcm90b3R5cGUoZGVzY3JpcHRvcl8pOworCisgICAgZXh0ZW5zaW9uc19kZXNjcmlwdG9yXyA9CisgICAgICBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zIik7CisgICAgQVNTRVJUX1RSVUUoZXh0ZW5zaW9uc19kZXNjcmlwdG9yXyAhPSBOVUxMKTsKKyAgICBleHRlbnNpb25zX3Byb3RvdHlwZV8gPSBmYWN0b3J5Xy5HZXRQcm90b3R5cGUoZXh0ZW5zaW9uc19kZXNjcmlwdG9yXyk7CisKKyAgICBwYWNrZWRfZGVzY3JpcHRvcl8gPQorICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UGFja2VkVHlwZXMiKTsKKyAgICBBU1NFUlRfVFJVRShwYWNrZWRfZGVzY3JpcHRvcl8gIT0gTlVMTCk7CisgICAgcGFja2VkX3Byb3RvdHlwZV8gPSBmYWN0b3J5Xy5HZXRQcm90b3R5cGUocGFja2VkX2Rlc2NyaXB0b3JfKTsKKyAgfQorfTsKKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgRGVzY3JpcHRvcikgeworICAvLyBDaGVjayB0aGF0IHRoZSBkZXNjcmlwdG9yIG9uIHRoZSBEeW5hbWljTWVzc2FnZSBtYXRjaGVzIHRoZSBkZXNjcmlwdG9yCisgIC8vIHBhc3NlZCB0byBHZXRQcm90b3R5cGUoKS4KKyAgRVhQRUNUX0VRKHByb3RvdHlwZV8tPkdldERlc2NyaXB0b3IoKSwgZGVzY3JpcHRvcl8pOworfQorCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBPbmVQcm90b3R5cGUpIHsKKyAgLy8gQ2hlY2sgdGhhdCByZXF1ZXN0aW5nIHRoZSBzYW1lIHByb3RvdHlwZSB0d2ljZSBwcm9kdWNlcyB0aGUgc2FtZSBvYmplY3QuCisgIEVYUEVDVF9FUShwcm90b3R5cGVfLCBmYWN0b3J5Xy5HZXRQcm90b3R5cGUoZGVzY3JpcHRvcl8pKTsKK30KKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgRGVmYXVsdHMpIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCBjb3JyZWN0bHkgaW4gdGhlIGluaXRpYWwgbWVzc2FnZS4KKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZGVzY3JpcHRvcl8pOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RDbGVhclZpYVJlZmxlY3Rpb24oKnByb3RvdHlwZV8pOworfQorCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBJbmRlcGVuZGVudE9mZnNldHMpIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgaW5kZXBlbmRlbnQgb2Zmc2V0cyBieSBzZXR0aW5nIGVhY2gKKyAgLy8gb25lIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gY2hlY2tpbmcgdGhhdCB0aGV5IGFsbCBzdGlsbCBoYXZlIHRob3NlCisgIC8vIHVuaXF1ZSB2YWx1ZXMgKGkuZS4gdGhleSBkb24ndCBzdG9tcCBlYWNoIG90aGVyKS4KKyAgc2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKHByb3RvdHlwZV8tPk5ldygpKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZGVzY3JpcHRvcl8pOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oKm1lc3NhZ2UpOworfQorCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBFeHRlbnNpb25zKSB7CisgIC8vIENoZWNrIHRoYXQgZXh0ZW5zaW9ucyB3b3JrLgorICBzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UoZXh0ZW5zaW9uc19wcm90b3R5cGVfLT5OZXcoKSk7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGV4dGVuc2lvbnNfZGVzY3JpcHRvcl8pOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oKm1lc3NhZ2UpOworfQorCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBQYWNrZWRGaWVsZHMpIHsKKyAgLy8gQ2hlY2sgdGhhdCBwYWNrZWQgZmllbGRzIHdvcmsgcHJvcGVybHkuCisgIHNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShwYWNrZWRfcHJvdG90eXBlXy0+TmV3KCkpOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihwYWNrZWRfZGVzY3JpcHRvcl8pOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldFBhY2tlZEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oKm1lc3NhZ2UpOworfQorCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBTcGFjZVVzZWQpIHsKKyAgLy8gVGVzdCB0aGF0IFNwYWNlVXNlZCgpIHdvcmtzIHByb3Blcmx5CisKKyAgLy8gU2luY2Ugd2Ugc2hhcmUgdGhlIGltcGxlbWVudGF0aW9uIHdpdGggZ2VuZXJhdGVkIG1lc3NhZ2VzLCB3ZSBkb24ndCBuZWVkCisgIC8vIHRvIHRlc3QgdmVyeSBtdWNoIGhlcmUuICBKdXN0IG1ha2Ugc3VyZSBpdCBhcHBlYXJzIHRvIGJlIHdvcmtpbmcuCisKKyAgc2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKHByb3RvdHlwZV8tPk5ldygpKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZGVzY3JpcHRvcl8pOworCisgIGludCBpbml0aWFsX3NwYWNlX3VzZWQgPSBtZXNzYWdlLT5TcGFjZVVzZWQoKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOworICBFWFBFQ1RfTFQoaW5pdGlhbF9zcGFjZV91c2VkLCBtZXNzYWdlLT5TcGFjZVVzZWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2JiYThmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MKQEAgLTAsMCArMSwxNDYxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIHsKKworaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgcmVhbF90eXBlKEZpZWxkVHlwZSB0eXBlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodHlwZSA+IDAgJiYgdHlwZSA8PSBXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4odHlwZSk7Cit9CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6Q3BwVHlwZSBjcHBfdHlwZShGaWVsZFR5cGUgdHlwZSkgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZVRvQ3BwVHlwZShyZWFsX3R5cGUodHlwZSkpOworfQorCisvLyBSZWdpc3RyeSBzdHVmZi4KK3R5cGVkZWYgaGFzaF9tYXA8cGFpcjxjb25zdCBNZXNzYWdlTGl0ZSosIGludD4sCisgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkluZm8+IEV4dGVuc2lvblJlZ2lzdHJ5OworRXh0ZW5zaW9uUmVnaXN0cnkqIHJlZ2lzdHJ5XyA9IE5VTEw7CitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHJlZ2lzdHJ5X2luaXRfKTsKKwordm9pZCBEZWxldGVSZWdpc3RyeSgpIHsKKyAgZGVsZXRlIHJlZ2lzdHJ5XzsKKyAgcmVnaXN0cnlfID0gTlVMTDsKK30KKwordm9pZCBJbml0UmVnaXN0cnkoKSB7CisgIHJlZ2lzdHJ5XyA9IG5ldyBFeHRlbnNpb25SZWdpc3RyeTsKKyAgT25TaHV0ZG93bigmRGVsZXRlUmVnaXN0cnkpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGF0IHN0YXJ0dXAsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRocmVhZC0KKy8vIHNhZmV0eS4KK3ZvaWQgUmVnaXN0ZXIoY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyBpbmZvKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnJlZ2lzdHJ5X2luaXRfLCAmSW5pdFJlZ2lzdHJ5KTsKKworICBpZiAoIUluc2VydElmTm90UHJlc2VudChyZWdpc3RyeV8sIG1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIG51bWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk11bHRpcGxlIGV4dGVuc2lvbiByZWdpc3RyYXRpb25zIGZvciB0eXBlIFwiIgorICAgICAgICAgICAgICAgPDwgY29udGFpbmluZ190eXBlLT5HZXRUeXBlTmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIGZpZWxkIG51bWJlciAiIDw8IG51bWJlciA8PCAiLiI7CisgIH0KK30KKworY29uc3QgRXh0ZW5zaW9uSW5mbyogRmluZFJlZ2lzdGVyZWRFeHRlbnNpb24oCisgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwgaW50IG51bWJlcikgeworICByZXR1cm4gKHJlZ2lzdHJ5XyA9PSBOVUxMKSA/IE5VTEwgOgorICAgICAgICAgRmluZE9yTnVsbCgqcmVnaXN0cnlfLCBtYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCBudW1iZXIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0V4dGVuc2lvbkZpbmRlcjo6fkV4dGVuc2lvbkZpbmRlcigpIHt9CisKK2Jvb2wgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyOjpGaW5kKGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8qIG91dHB1dCkgeworICBjb25zdCBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24gPQorICAgICAgRmluZFJlZ2lzdGVyZWRFeHRlbnNpb24oY29udGFpbmluZ190eXBlXywgbnVtYmVyKTsKKyAgaWYgKGV4dGVuc2lvbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgICpvdXRwdXQgPSAqZXh0ZW5zaW9uOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpSZWdpc3RlckV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkKSB7CisgIEdPT0dMRV9DSEVDS19ORSh0eXBlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNKTsKKyAgR09PR0xFX0NIRUNLX05FKHR5cGUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UpOworICBHT09HTEVfQ0hFQ0tfTkUodHlwZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVApOworICBFeHRlbnNpb25JbmZvIGluZm8odHlwZSwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk7CisgIFJlZ2lzdGVyKGNvbnRhaW5pbmdfdHlwZSwgbnVtYmVyLCBpbmZvKTsKK30KKworc3RhdGljIGJvb2wgQ2FsbE5vQXJnVmFsaWRpdHlGdW5jKGNvbnN0IHZvaWQqIGFyZywgaW50IG51bWJlcikgeworICAvLyBOb3RlOiAgTXVzdCB1c2UgQy1zdHlsZSBjYXN0IGhlcmUgcmF0aGVyIHRoYW4gcmVpbnRlcnByZXRfY2FzdCBiZWNhdXNlCisgIC8vICAgdGhlIEMrKyBzdGFuZGFyZCBhdCBvbmUgcG9pbnQgZGlkIG5vdCBhbGxvdyBjYXN0cyBiZXR3ZWVuIGZ1bmN0aW9uIGFuZAorICAvLyAgIGRhdGEgcG9pbnRlcnMgYW5kIHNvbWUgY29tcGlsZXJzIGVuZm9yY2UgdGhpcyBmb3IgQysrLXN0eWxlIGNhc3RzLiAgTm8KKyAgLy8gICBjb21waWxlciBlbmZvcmNlcyBpdCBmb3IgQy1zdHlsZSBjYXN0cyBzaW5jZSBsb3RzIG9mIEMtc3R5bGUgY29kZSBoYXMKKyAgLy8gICByZWxpZWQgb24gdGhlc2Uga2luZHMgb2YgY2FzdHMgZm9yIGEgbG9uZyB0aW1lLCBkZXNwaXRlIGJlaW5nCisgIC8vICAgdGVjaG5pY2FsbHkgdW5kZWZpbmVkLiAgU2VlOgorICAvLyAgICAgaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE5NQorICAvLyBBbHNvIG5vdGU6ICBTb21lIGNvbXBpbGVycyBkbyBub3QgYWxsb3cgZnVuY3Rpb24gcG9pbnRlcnMgdG8gYmUgImNvbnN0Ii4KKyAgLy8gICBXaGljaCBtYWtlcyBzZW5zZSwgSSBzdXBwb3NlLCBiZWNhdXNlIGl0J3MgbWVhbmluZ2xlc3MuCisgIHJldHVybiAoKEVudW1WYWxpZGl0eUZ1bmMqKWFyZykobnVtYmVyKTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRW51bUV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1WYWxpZGl0eUZ1bmMqIGlzX3ZhbGlkKSB7CisgIEdPT0dMRV9DSEVDS19FUSh0eXBlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNKTsKKyAgRXh0ZW5zaW9uSW5mbyBpbmZvKHR5cGUsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOworICBpbmZvLmVudW1fdmFsaWRpdHlfY2hlY2suZnVuYyA9IENhbGxOb0FyZ1ZhbGlkaXR5RnVuYzsKKyAgLy8gU2VlIGNvbW1lbnQgaW4gQ2FsbE5vQXJnVmFsaWRpdHlGdW5jKCkgYWJvdXQgd2h5IHdlIHVzZSBhIGMtc3R5bGUgY2FzdC4KKyAgaW5mby5lbnVtX3ZhbGlkaXR5X2NoZWNrLmFyZyA9ICh2b2lkKilpc192YWxpZDsKKyAgUmVnaXN0ZXIoY29udGFpbmluZ190eXBlLCBudW1iZXIsIGluZm8pOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJNZXNzYWdlRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcGVhdGVkLCBib29sIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZSkgeworICBHT09HTEVfQ0hFQ0sodHlwZSA9PSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFIHx8CisgICAgICAgIHR5cGUgPT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVApOworICBFeHRlbnNpb25JbmZvIGluZm8odHlwZSwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk7CisgIGluZm8ubWVzc2FnZV9wcm90b3R5cGUgPSBwcm90b3R5cGU7CisgIFJlZ2lzdGVyKGNvbnRhaW5pbmdfdHlwZSwgbnVtYmVyLCBpbmZvKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25zdHJ1Y3RvcnMgYW5kIGJhc2ljIG1ldGhvZHMuCisKK0V4dGVuc2lvblNldDo6RXh0ZW5zaW9uU2V0KCkge30KKworRXh0ZW5zaW9uU2V0Ojp+RXh0ZW5zaW9uU2V0KCkgeworICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgeworICAgIGl0ZXItPnNlY29uZC5GcmVlKCk7CisgIH0KK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gdm9pZCBFeHRlbnNpb25TZXQ6OkFwcGVuZFRvTGlzdChjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QKKworYm9vbCBFeHRlbnNpb25TZXQ6OkhhcyhpbnQgbnVtYmVyKSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSByZXR1cm4gZmFsc2U7CisgIEdPT0dMRV9EQ0hFQ0soIWl0ZXItPnNlY29uZC5pc19yZXBlYXRlZCk7CisgIHJldHVybiAhaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQ7Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6Ok51bUV4dGVuc2lvbnMoKSBjb25zdCB7CisgIGludCByZXN1bHQgPSAwOworICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgeworICAgIGlmICghaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQpIHsKKyAgICAgICsrcmVzdWx0OworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb25TaXplKGludCBudW1iZXIpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC5HZXRTaXplKCk7Cit9CisKK0ZpZWxkVHlwZSBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvblR5cGUoaW50IG51bWJlcikgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiRG9uJ3QgbG9va3VwIGV4dGVuc2lvbiB0eXBlcyBpZiB0aGV5IGFyZW4ndCBwcmVzZW50ICgxKS4gIjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkRvbid0IGxvb2t1cCBleHRlbnNpb24gdHlwZXMgaWYgdGhleSBhcmVuJ3QgcHJlc2VudCAoMikuICI7CisgIH0KKyAgcmV0dXJuIGl0ZXItPnNlY29uZC50eXBlOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6Q2xlYXJFeHRlbnNpb24oaW50IG51bWJlcikgeworICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgcmV0dXJuOworICBpdGVyLT5zZWNvbmQuQ2xlYXIoKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmllbGQgYWNjZXNzb3JzCisKK25hbWVzcGFjZSB7CisKK2VudW0gQ2FyZGluYWxpdHkgeworICBSRVBFQVRFRCwKKyAgT1BUSU9OQUwKK307CisKK30gIC8vIG5hbWVzcGFjZQorCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfVFlQRShFWFRFTlNJT04sIExBQkVMLCBDUFBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT09HTEVfRENIRUNLX0VRKChFWFRFTlNJT04pLmlzX3JlcGVhdGVkID8gUkVQRUFURUQgOiBPUFRJT05BTCwgTEFCRUwpOyAgICAgICAgIFwKKyAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZSgoRVhURU5TSU9OKS50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNDUFBUWVBFKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmltaXRpdmVzCisKKyNkZWZpbmUgUFJJTUlUSVZFX0FDQ0VTU09SUyhVUFBFUkNBU0UsIExPV0VSQ0FTRSwgQ0FNRUxDQVNFKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTE9XRVJDQVNFIEV4dGVuc2lvblNldDo6R2V0IyNDQU1FTENBU0UoaW50IG51bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPV0VSQ0FTRSBkZWZhdWx0X3ZhbHVlKSBjb25zdCB7ICAgICAgICBcCisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7ICAgICAgICAgXAorICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSB8fCBpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBVUFBFUkNBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5MT1dFUkNBU0UjI192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBFeHRlbnNpb25TZXQ6OlNldCMjQ0FNRUxDQVNFKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1dFUkNBU0UgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7ICAgICAgICAgXAorICBFeHRlbnNpb24qIGV4dGVuc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0UpOyBcCisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4dGVuc2lvbi0+TE9XRVJDQVNFIyNfdmFsdWUgPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitMT1dFUkNBU0UgRXh0ZW5zaW9uU2V0OjpHZXRSZXBlYXRlZCMjQ0FNRUxDQVNFKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgeyAgXAorICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOyAgICAgICAgIFwKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsgXAorICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBSRVBFQVRFRCwgVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGluZGV4KTsgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIEV4dGVuc2lvblNldDo6U2V0UmVwZWF0ZWQjI0NBTUVMQ0FTRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBudW1iZXIsIGludCBpbmRleCwgTE9XRVJDQVNFIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsgICAgICAgICAgICAgICBcCisgIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7IFwKKyAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+U2V0KGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBFeHRlbnNpb25TZXQ6OkFkZCMjQ0FNRUxDQVNFKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhY2tlZCwgTE9XRVJDQVNFIHZhbHVlLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7ICAgICAgICAgXAorICBFeHRlbnNpb24qIGV4dGVuc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0UpOyBcCisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gcGFja2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUgPSBuZXcgUmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+KCk7ICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRCwgVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPmlzX3BhY2tlZCwgcGFja2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+QWRkKHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitQUklNSVRJVkVfQUNDRVNTT1JTKCBJTlQzMiwgIGludDMyLCAgSW50MzIpCitQUklNSVRJVkVfQUNDRVNTT1JTKCBJTlQ2NCwgIGludDY0LCAgSW50NjQpCitQUklNSVRJVkVfQUNDRVNTT1JTKFVJTlQzMiwgdWludDMyLCBVSW50MzIpCitQUklNSVRJVkVfQUNDRVNTT1JTKFVJTlQ2NCwgdWludDY0LCBVSW50NjQpCitQUklNSVRJVkVfQUNDRVNTT1JTKCBGTE9BVCwgIGZsb2F0LCAgRmxvYXQpCitQUklNSVRJVkVfQUNDRVNTT1JTKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCitQUklNSVRJVkVfQUNDRVNTT1JTKCAgQk9PTCwgICBib29sLCAgIEJvb2wpCisKKyN1bmRlZiBQUklNSVRJVkVfQUNDRVNTT1JTCisKK3ZvaWQqIEV4dGVuc2lvblNldDo6TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoaW50IG51bWJlcikgeworICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgdGhlIFJlcGVhdGVkRmllbGQ8PiogcG9pbnRlcnMgaGF2ZSB0aGUgc2FtZQorICAvLyBzaXplIGFuZCBhbGlnbm1lbnQgd2l0aGluIHRoZSBhbm9ueW1vdXMgdW5pb24gaW4gRXh0ZW5zaW9uLgorICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIm5vIGV4dGVuc2lvbiBudW1iZXJlZCAiIDw8IG51bWJlcjsKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9pbnQzMl92YWx1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW51bXMKKworaW50IEV4dGVuc2lvblNldDo6R2V0RW51bShpbnQgbnVtYmVyLCBpbnQgZGVmYXVsdF92YWx1ZSkgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSB8fCBpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZCkgeworICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBFTlVNKTsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kLmVudW1fdmFsdWU7CisgIH0KK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlNldEVudW0oaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKKyAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTSk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTCwgRU5VTSk7CisgIH0KKyAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgIGV4dGVuc2lvbi0+ZW51bV92YWx1ZSA9IHZhbHVlOworfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpHZXRSZXBlYXRlZEVudW0oaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBFTlVNKTsKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9lbnVtX3ZhbHVlLT5HZXQoaW5kZXgpOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6U2V0UmVwZWF0ZWRFbnVtKGludCBudW1iZXIsIGludCBpbmRleCwgaW50IHZhbHVlKSB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBFTlVNKTsKKyAgaXRlci0+c2Vjb25kLnJlcGVhdGVkX2VudW1fdmFsdWUtPlNldChpbmRleCwgdmFsdWUpOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6QWRkRW51bShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGFja2VkLCBpbnQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0VOVU0pOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOworICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gcGFja2VkOworICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZSA9IG5ldyBSZXBlYXRlZEZpZWxkPGludD4oKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIEVOVU0pOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIHBhY2tlZCk7CisgIH0KKyAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9lbnVtX3ZhbHVlLT5BZGQodmFsdWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpbmdzCisKK2NvbnN0IHN0cmluZyYgRXh0ZW5zaW9uU2V0OjpHZXRTdHJpbmcoaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkZWZhdWx0X3ZhbHVlKSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpIHx8IGl0ZXItPnNlY29uZC5pc19jbGVhcmVkKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIFNUUklORyk7CisgICAgcmV0dXJuICppdGVyLT5zZWNvbmQuc3RyaW5nX3ZhbHVlOworICB9Cit9CisKK3N0cmluZyogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlU3RyaW5nKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkcpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPnN0cmluZ192YWx1ZSA9IG5ldyBzdHJpbmc7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBTVFJJTkcpOworICB9CisgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICByZXR1cm4gZXh0ZW5zaW9uLT5zdHJpbmdfdmFsdWU7Cit9CisKK2NvbnN0IHN0cmluZyYgRXh0ZW5zaW9uU2V0OjpHZXRSZXBlYXRlZFN0cmluZyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIFNUUklORyk7CisgIHJldHVybiBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLT5HZXQoaW5kZXgpOworfQorCitzdHJpbmcqIEV4dGVuc2lvblNldDo6TXV0YWJsZVJlcGVhdGVkU3RyaW5nKGludCBudW1iZXIsIGludCBpbmRleCkgeworICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOworICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBSRVBFQVRFRCwgU1RSSU5HKTsKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9zdHJpbmdfdmFsdWUtPk11dGFibGUoaW5kZXgpOworfQorCitzdHJpbmcqIEV4dGVuc2lvblNldDo6QWRkU3RyaW5nKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORyk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7CisgICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX3N0cmluZ192YWx1ZSA9IG5ldyBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4oKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIFNUUklORyk7CisgIH0KKyAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLT5BZGQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVzc2FnZXMKKworY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0TWVzc2FnZSgKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgZGVmYXVsdF92YWx1ZSkgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgeworICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBNRVNTQUdFKTsKKyAgICBpZiAoaXRlci0+c2Vjb25kLmlzX2xhenkpIHsKKyAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWUtPkdldE1lc3NhZ2UoZGVmYXVsdF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7CisgICAgfQorICB9Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIGNvbnN0IE1lc3NhZ2VMaXRlJiBFeHRlbnNpb25TZXQ6OkdldE1lc3NhZ2UoaW50IG51bWJlciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QKKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZU1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gcHJvdG90eXBlLk5ldygpOworICAgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICAgIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBNRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKKyAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TXV0YWJsZU1lc3NhZ2UocHJvdG90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICB9CisgIH0KK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZU1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkKKwordm9pZCBFeHRlbnNpb25TZXQ6OlNldEFsbG9jYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgQ2xlYXJFeHRlbnNpb24obnVtYmVyKTsKKyAgICByZXR1cm47CisgIH0KKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPmlzX2xhenkgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTCwgTUVTU0FHRSk7CisgICAgaWYgKGV4dGVuc2lvbi0+aXNfbGF6eSkgeworICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+U2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVsZXRlIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2U7CisgICAgfQorICB9CisgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSkgeworICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgeworICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIE5VTEwuCisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIE1lc3NhZ2VMaXRlKiByZXQgPSBOVUxMOworICAgIGlmIChpdGVyLT5zZWNvbmQuaXNfbGF6eSkgeworICAgICAgcmV0ID0gaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlLT5SZWxlYXNlTWVzc2FnZShwcm90b3R5cGUpOworICAgICAgZGVsZXRlIGl0ZXItPnNlY29uZC5sYXp5bWVzc2FnZV92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7CisgICAgfQorICAgIGV4dGVuc2lvbnNfLmVyYXNlKG51bWJlcik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCisvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCisvLyBNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSk7CisKK2NvbnN0IE1lc3NhZ2VMaXRlJiBFeHRlbnNpb25TZXQ6OkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICBpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIE1FU1NBR0UpOworICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkdldChpbmRleCk7Cit9CisKK01lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVSZXBlYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgaW50IGluZGV4KSB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBNRVNTQUdFKTsKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5NdXRhYmxlKGluZGV4KTsKK30KKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6QWRkTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQorICAgICAgbmV3IFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+KCk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVELCBNRVNTQUdFKTsKKyAgfQorCisgIC8vIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+IGRvZXMgbm90IGtub3cgaG93IHRvIEFkZCgpIHNpbmNlIGl0IGNhbm5vdAorICAvLyBhbGxvY2F0ZSBhbiBhYnN0cmFjdCBvYmplY3QsIHNvIHdlIGhhdmUgdG8gYmUgdHJpY2t5LgorICBNZXNzYWdlTGl0ZSogcmVzdWx0ID0gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlCisgICAgICAtPkFkZEZyb21DbGVhcmVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4gPigpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICByZXN1bHQgPSBwcm90b3R5cGUuTmV3KCk7CisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5BZGRBbGxvY2F0ZWQocmVzdWx0KTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCisvLyBNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpBZGRNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KQorCisjdW5kZWYgR09PR0xFX0RDSEVDS19UWVBFCisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpSZW1vdmVMYXN0KGludCBudW1iZXIpIHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9ICZpdGVyLT5zZWNvbmQ7CisgIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCk7CisKKyAgc3dpdGNoKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSkpIHsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDMyOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQzMl92YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50NjRfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50MzJfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50NjRfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Zsb2F0X3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZG91YmxlX3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0JPT0w6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Jvb2xfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3N0cmluZ192YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgfQorfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTGFzdChpbnQgbnVtYmVyKSB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSAmaXRlci0+c2Vjb25kOworICBHT09HTEVfRENIRUNLKGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQpOworICBHT09HTEVfRENIRUNLKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSkgPT0gV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRSk7CisgIHJldHVybiBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPlJlbGVhc2VMYXN0KCk7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpTd2FwRWxlbWVudHMoaW50IG51bWJlciwgaW50IGluZGV4MSwgaW50IGluZGV4MikgeworICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOworCisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gJml0ZXItPnNlY29uZDsKKyAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKworICBzd2l0Y2goY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSkgeworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfSU5UMzI6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2ludDMyX3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50NjRfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfdWludDMyX3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3VpbnQ2NF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Zsb2F0X3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2RvdWJsZV92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfQk9PTDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfYm9vbF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9zdHJpbmdfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpDbGVhcigpIHsKKyAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBpdGVyLT5zZWNvbmQuQ2xlYXIoKTsKKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6TWVyZ2VGcm9tKGNvbnN0IEV4dGVuc2lvblNldCYgb3RoZXIpIHsKKyAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gb3RoZXIuZXh0ZW5zaW9uc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IG90aGVyLmV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBjb25zdCBFeHRlbnNpb24mIG90aGVyX2V4dGVuc2lvbiA9IGl0ZXItPnNlY29uZDsKKworICAgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsKKyAgICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgICAgYm9vbCBpc19uZXcgPSBNYXliZU5ld0V4dGVuc2lvbihpdGVyLT5maXJzdCwgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24pOworICAgICAgaWYgKGlzX25ldykgeworICAgICAgICAvLyBFeHRlbnNpb24gZGlkIG5vdCBhbHJlYWR5IGV4aXN0IGluIHNldC4KKyAgICAgICAgZXh0ZW5zaW9uLT50eXBlID0gb3RoZXJfZXh0ZW5zaW9uLnR5cGU7CisgICAgICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gb3RoZXJfZXh0ZW5zaW9uLmlzX3BhY2tlZDsKKyAgICAgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBHT09HTEVfRENIRUNLX0VRKGV4dGVuc2lvbi0+dHlwZSwgb3RoZXJfZXh0ZW5zaW9uLnR5cGUpOworICAgICAgICBHT09HTEVfRENIRUNLX0VRKGV4dGVuc2lvbi0+aXNfcGFja2VkLCBvdGhlcl9leHRlbnNpb24uaXNfcGFja2VkKTsKKyAgICAgICAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChjcHBfdHlwZShvdGhlcl9leHRlbnNpb24udHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UsIFJFUEVBVEVEX1RZUEUpICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoaXNfbmV3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZSA9ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgbmV3IFJFUEVBVEVEX1RZUEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPk1lcmdlRnJvbSggICAgICAgIFwKKyAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ucmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZSk7ICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyLCBSZXBlYXRlZEZpZWxkICAgPCAgaW50MzI+KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBJTlQ2NCwgICBpbnQ2NCwgUmVwZWF0ZWRGaWVsZCAgIDwgIGludDY0Pik7CisgICAgICAgIEhBTkRMRV9UWVBFKCBVSU5UMzIsICB1aW50MzIsIFJlcGVhdGVkRmllbGQgICA8IHVpbnQzMj4pOworICAgICAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0LCBSZXBlYXRlZEZpZWxkICAgPCB1aW50NjQ+KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBGTE9BVCwgICBmbG9hdCwgUmVwZWF0ZWRGaWVsZCAgIDwgIGZsb2F0Pik7CisgICAgICAgIEhBTkRMRV9UWVBFKCBET1VCTEUsICBkb3VibGUsIFJlcGVhdGVkRmllbGQgICA8IGRvdWJsZT4pOworICAgICAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sLCBSZXBlYXRlZEZpZWxkICAgPCAgIGJvb2w+KTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgRU5VTSwgICAgZW51bSwgUmVwZWF0ZWRGaWVsZCAgIDwgICAgaW50Pik7CisgICAgICAgIEhBTkRMRV9UWVBFKCBTVFJJTkcsICBzdHJpbmcsIFJlcGVhdGVkUHRyRmllbGQ8IHN0cmluZz4pOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmIChpc19uZXcpIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSA9CisgICAgICAgICAgICAgIG5ldyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPigpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBXZSBjYW4ndCBjYWxsIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+OjpNZXJnZUZyb20oKSBiZWNhdXNlCisgICAgICAgICAgLy8gaXQgd291bGQgYXR0ZW1wdCB0byBhbGxvY2F0ZSBuZXcgb2JqZWN0cy4KKyAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiogb3RoZXJfcmVwZWF0ZWRfbWVzc2FnZSA9CisgICAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJfcmVwZWF0ZWRfbWVzc2FnZS0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBvdGhlcl9tZXNzYWdlID0gb3RoZXJfcmVwZWF0ZWRfbWVzc2FnZS0+R2V0KGkpOworICAgICAgICAgICAgTWVzc2FnZUxpdGUqIHRhcmdldCA9IGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZQorICAgICAgICAgICAgICAgICAgICAgLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+ID4oKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICB0YXJnZXQgPSBvdGhlcl9tZXNzYWdlLk5ldygpOworICAgICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZCh0YXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0LT5DaGVja1R5cGVBbmRNZXJnZUZyb20ob3RoZXJfbWVzc2FnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIW90aGVyX2V4dGVuc2lvbi5pc19jbGVhcmVkKSB7CisgICAgICAgIHN3aXRjaCAoY3BwX3R5cGUob3RoZXJfZXh0ZW5zaW9uLnR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFLCBDQU1FTENBU0UpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU2V0IyNDQU1FTENBU0UoaXRlci0+Zmlyc3QsIG90aGVyX2V4dGVuc2lvbi50eXBlLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uTE9XRVJDQVNFIyNfdmFsdWUsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5kZXNjcmlwdG9yKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMiwgIEludDMyKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRSggSU5UNjQsICBpbnQ2NCwgIEludDY0KTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMiwgVUludDMyKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCwgVUludDY0KTsKKyAgICAgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCwgIEZsb2F0KTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCwgICBCb29sKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRSggIEVOVU0sICAgZW51bSwgICBFbnVtKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICAgICAgU2V0U3RyaW5nKGl0ZXItPmZpcnN0LCBvdGhlcl9leHRlbnNpb24udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLnN0cmluZ192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgICAgICAgICAgYm9vbCBpc19uZXcgPSBNYXliZU5ld0V4dGVuc2lvbihpdGVyLT5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24pOworICAgICAgICAgICAgaWYgKGlzX25ldykgeworICAgICAgICAgICAgICBleHRlbnNpb24tPnR5cGUgPSBvdGhlcl9leHRlbnNpb24udHlwZTsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBvdGhlcl9leHRlbnNpb24uaXNfcGFja2VkOworICAgICAgICAgICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfbGF6eSkgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfbGF6eSA9IHRydWU7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5sYXp5bWVzc2FnZV92YWx1ZS0+TmV3KCk7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb24tPmlzX2xhenkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZS0+TmV3KCk7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT50eXBlLCBvdGhlcl9leHRlbnNpb24udHlwZSk7CisgICAgICAgICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsb3RoZXJfZXh0ZW5zaW9uLmlzX3BhY2tlZCk7CisgICAgICAgICAgICAgIEdPT0dMRV9EQ0hFQ0soIWV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQpOworICAgICAgICAgICAgICBpZiAob3RoZXJfZXh0ZW5zaW9uLmlzX2xhenkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICAgICAgICAgICAgICBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5NZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5sYXp5bWVzc2FnZV92YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZS0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5sYXp5bWVzc2FnZV92YWx1ZS0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICAgICAgICAgICAgICBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLm1lc3NhZ2VfdmFsdWUpLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZS0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6U3dhcChFeHRlbnNpb25TZXQqIHgpIHsKKyAgZXh0ZW5zaW9uc18uc3dhcCh4LT5leHRlbnNpb25zXyk7Cit9CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAvLyBFeHRlbnNpb25zIGFyZSBuZXZlciByZXF1aXJlZC4gIEhvd2V2ZXIsIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCBhbGwKKyAgLy8gZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgorICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgeworICAgIGNvbnN0IEV4dGVuc2lvbiYgZXh0ZW5zaW9uID0gaXRlci0+c2Vjb25kOworICAgIGlmIChjcHBfdHlwZShleHRlbnNpb24udHlwZSkgPT0gV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgaWYgKGV4dGVuc2lvbi5pc19yZXBlYXRlZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbi5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5zaXplKCk7IGkrKykgeworICAgICAgICAgIGlmICghZXh0ZW5zaW9uLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkdldChpKS5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZXh0ZW5zaW9uLmlzX2NsZWFyZWQpIHsKKyAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzX2xhenkpIHsKKyAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFleHRlbnNpb24ubWVzc2FnZV92YWx1ZS0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpGaW5kRXh0ZW5zaW9uSW5mb0Zyb21UYWcoCisgICAgdWludDMyIHRhZywgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAorICAgIGludCogZmllbGRfbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24pIHsKKyAgKmZpZWxkX251bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOworICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisKKyAgYm9vbCBpc191bmtub3duOworICBpZiAoIWV4dGVuc2lvbl9maW5kZXItPkZpbmQoKmZpZWxkX251bWJlciwgZXh0ZW5zaW9uKSkgeworICAgIGlzX3Vua25vd24gPSB0cnVlOworICB9IGVsc2UgaWYgKGV4dGVuc2lvbi0+aXNfcGFja2VkKSB7CisgICAgaXNfdW5rbm93biA9ICh3aXJlX3R5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICB9IGVsc2UgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBleHBlY3RlZF93aXJlX3R5cGUgPQorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGVGb3JGaWVsZFR5cGUocmVhbF90eXBlKGV4dGVuc2lvbi0+dHlwZSkpOworICAgIGlzX3Vua25vd24gPSAod2lyZV90eXBlICE9IGV4cGVjdGVkX3dpcmVfdHlwZSk7CisgIH0KKyAgcmV0dXJuICFpc191bmtub3duOworfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpIHsKKyAgaW50IG51bWJlcjsKKyAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247CisgIGlmICghRmluZEV4dGVuc2lvbkluZm9Gcm9tVGFnKHRhZywgZXh0ZW5zaW9uX2ZpbmRlciwgJm51bWJlciwgJmV4dGVuc2lvbikpIHsKKyAgICByZXR1cm4gZmllbGRfc2tpcHBlci0+U2tpcEZpZWxkKGlucHV0LCB0YWcpOworICB9IGVsc2UgeworICAgIHJldHVybiBQYXJzZUZpZWxkV2l0aEV4dGVuc2lvbkluZm8obnVtYmVyLCBleHRlbnNpb24sIGlucHV0LCBmaWVsZF9za2lwcGVyKTsKKyAgfQorfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZFdpdGhFeHRlbnNpb25JbmZvKAorICAgIGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvbkluZm8mIGV4dGVuc2lvbiwKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgRmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7CisgIGlmIChleHRlbnNpb24uaXNfcGFja2VkKSB7CisgICAgdWludDMyIHNpemU7CisgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZzaXplKSkgcmV0dXJuIGZhbHNlOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQoc2l6ZSk7CisKKyAgICBzd2l0Y2ggKGV4dGVuc2lvbi50eXBlKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ1BQX0NBTUVMQ0FTRSwgQ1BQX0xPV0VSQ0FTRSkgICAgICAgIFwKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIENQUF9MT1dFUkNBU0UgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBDUFBfTE9XRVJDQVNFLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRT4oICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBBZGQjI0NQUF9DQU1FTENBU0UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHZhbHVlLCBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICBJbnQzMiwgICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgIEludDY0LCAgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCBVSW50MzIsICB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsIFVJbnQ2NCwgIHVpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgIEludDMyLCAgIGludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgSW50NjQsICAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsIFVJbnQzMiwgIHVpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgVUludDY0LCAgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCAgSW50MzIsICAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsICBJbnQ2NCwgICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgIEZsb2F0LCAgIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCBEb3VibGUsICBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgQm9vbCwgICAgYm9vbCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNOgorICAgICAgICB3aGlsZSAoaW5wdXQtPkJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlmIChleHRlbnNpb24uZW51bV92YWxpZGl0eV9jaGVjay5mdW5jKAorICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmVudW1fdmFsaWRpdHlfY2hlY2suYXJnLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgIEFkZEVudW0obnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNLCB0cnVlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc6CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDoKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRToKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChleHRlbnNpb24udHlwZSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENQUF9DQU1FTENBU0UsIENQUF9MT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENQUF9MT1dFUkNBU0UgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDUFBfTE9XRVJDQVNFLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRT4oICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEFkZCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHZhbHVlLCBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFNldCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCB2YWx1ZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBicmVhaworCisgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgIEludDMyLCAgIGludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgSW50NjQsICAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsIFVJbnQzMiwgIHVpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgVUludDY0LCAgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgSW50MzIsICAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICBJbnQ2NCwgICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgVUludDMyLCAgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCBVSW50NjQsICB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsICBJbnQzMiwgICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgIEludDY0LCAgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgRmxvYXQsICAgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsIERvdWJsZSwgIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICBCb29sLCAgICBib29sKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU06IHsKKyAgICAgICAgaW50IHZhbHVlOworICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIWV4dGVuc2lvbi5lbnVtX3ZhbGlkaXR5X2NoZWNrLmZ1bmMoCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmVudW1fdmFsaWRpdHlfY2hlY2suYXJnLCB2YWx1ZSkpIHsKKyAgICAgICAgICAvLyBJbnZhbGlkIHZhbHVlLiAgVHJlYXQgYXMgdW5rbm93bi4KKyAgICAgICAgICBmaWVsZF9za2lwcGVyLT5Ta2lwVW5rbm93bkVudW0obnVtYmVyLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7CisgICAgICAgICAgQWRkRW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIGZhbHNlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTZXRFbnVtKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HOiAgeworICAgICAgICBzdHJpbmcqIHZhbHVlID0gZXh0ZW5zaW9uLmlzX3JlcGVhdGVkID8KKyAgICAgICAgICBBZGRTdHJpbmcobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkcsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKSA6CisgICAgICAgICAgTXV0YWJsZVN0cmluZyhudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZyhpbnB1dCwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOiAgeworICAgICAgICBzdHJpbmcqIHZhbHVlID0gZXh0ZW5zaW9uLmlzX3JlcGVhdGVkID8KKyAgICAgICAgICBBZGRTdHJpbmcobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUywgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpIDoKKyAgICAgICAgICBNdXRhYmxlU3RyaW5nKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcyhpbnB1dCwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQOiB7CisgICAgICAgIE1lc3NhZ2VMaXRlKiB2YWx1ZSA9IGV4dGVuc2lvbi5pc19yZXBlYXRlZCA/CisgICAgICAgICAgICBBZGRNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVAsCisgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9wcm90b3R5cGUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKSA6CisgICAgICAgICAgICBNdXRhYmxlTWVzc2FnZShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi5tZXNzYWdlX3Byb3RvdHlwZSwgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkR3JvdXAobnVtYmVyLCBpbnB1dCwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgTWVzc2FnZUxpdGUqIHZhbHVlID0gZXh0ZW5zaW9uLmlzX3JlcGVhdGVkID8KKyAgICAgICAgICAgIEFkZE1lc3NhZ2UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZW5zaW9uLm1lc3NhZ2VfcHJvdG90eXBlLCBleHRlbnNpb24uZGVzY3JpcHRvcikgOgorICAgICAgICAgICAgTXV0YWJsZU1lc3NhZ2UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi5tZXNzYWdlX3Byb3RvdHlwZSwgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZShpbnB1dCwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlKSB7CisgIEZpZWxkU2tpcHBlciBza2lwcGVyOworICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7CisgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpCisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIGJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKwordm9pZCBFeHRlbnNpb25TZXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICBpbnQgc3RhcnRfZmllbGRfbnVtYmVyLCBpbnQgZW5kX2ZpZWxkX251bWJlciwKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBleHRlbnNpb25zXy5sb3dlcl9ib3VuZChzdGFydF9maWVsZF9udW1iZXIpOworICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkgJiYgaXRlci0+Zmlyc3QgPCBlbmRfZmllbGRfbnVtYmVyOworICAgICAgICsraXRlcikgeworICAgIGl0ZXItPnNlY29uZC5TZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcyhpdGVyLT5maXJzdCwgb3V0cHV0KTsKKyAgfQorfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgdG90YWxfc2l6ZSArPSBpdGVyLT5zZWNvbmQuQnl0ZVNpemUoaXRlci0+Zmlyc3QpOworICB9CisKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIGludCBFeHRlbnNpb25TZXQ6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdAorCitib29sIEV4dGVuc2lvblNldDo6TWF5YmVOZXdFeHRlbnNpb24oaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKiogcmVzdWx0KSB7CisgIHBhaXI8bWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IsIGJvb2w+IGluc2VydF9yZXN1bHQgPQorICAgICAgZXh0ZW5zaW9uc18uaW5zZXJ0KG1ha2VfcGFpcihudW1iZXIsIEV4dGVuc2lvbigpKSk7CisgICpyZXN1bHQgPSAmaW5zZXJ0X3Jlc3VsdC5maXJzdC0+c2Vjb25kOworICAoKnJlc3VsdCktPmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICByZXR1cm4gaW5zZXJ0X3Jlc3VsdC5zZWNvbmQ7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE1ldGhvZHMgb2YgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24KKwordm9pZCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6Q2xlYXIoKSB7CisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5DbGVhcigpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoICBJTlQzMiwgICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggIElOVDY0LCAgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCBVSU5UMzIsICB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoIFVJTlQ2NCwgIHVpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggIEZMT0FULCAgIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCBET1VCTEUsICBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoICAgQk9PTCwgICAgYm9vbCk7CisgICAgICBIQU5ETEVfVFlQRSggICBFTlVNLCAgICBlbnVtKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBTVFJJTkcsICBzdHJpbmcpOworICAgICAgSEFORExFX1RZUEUoTUVTU0FHRSwgbWVzc2FnZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFpc19jbGVhcmVkKSB7CisgICAgICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICAgIHN0cmluZ192YWx1ZS0+Y2xlYXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmIChpc19sYXp5KSB7CisgICAgICAgICAgICBsYXp5bWVzc2FnZV92YWx1ZS0+Q2xlYXIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVzc2FnZV92YWx1ZS0+Q2xlYXIoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZy4gIEdldCooKSB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgIC8vIGFzIGxvbmcgYXMgaXNfY2xlYXJlZCBpcyB0cnVlIGFuZCBTZXQqKCkgd2lsbCBvdmVyd3JpdGUgdGhlCisgICAgICAgICAgLy8gcHJldmlvdXMgdmFsdWUuCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlzX2NsZWFyZWQgPSB0cnVlOworICAgIH0KKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcygKKyAgICBpbnQgbnVtYmVyLAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIGlmIChpc19wYWNrZWQpIHsKKyAgICAgIGlmIChjYWNoZWRfc2l6ZSA9PSAwKSByZXR1cm47CisKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZyhudW1iZXIsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoY2FjaGVkX3NpemUpOworCisgICAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7IGkrKykgeyAgXAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UjI05vVGFnKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpLCBvdXRwdXQpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UNjQsICAgIEludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UMzIsICAgU0ludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCAgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsICBGaXhlZDY0LCAgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICAgIEZsb2F0LCAgIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlLCAgZG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgICBib29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICBlbnVtKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6CisgICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7ICBcCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI0NBTUVMQ0FTRShudW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSksIG91dHB1dCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWsKKworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgICBVSW50MzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgICBTSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgZmxvYXQpOworICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsICBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgIGJvb2wpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRSggICBCWVRFUywgICAgQnl0ZXMsICBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgIGVudW0pOworICAgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsIG1lc3NhZ2UpOworICAgICAgICBIQU5ETEVfVFlQRSggTUVTU0FHRSwgIE1lc3NhZ2UsIG1lc3NhZ2UpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKCFpc19jbGVhcmVkKSB7CisgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIFZBTFVFKSAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ0FNRUxDQVNFKG51bWJlciwgVkFMVUUsIG91dHB1dCk7IFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgICBpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgIGludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgICB1aW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgIHVpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgIGludDMyX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICAgaW50NjRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCAgIHVpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICAgdWludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgICAgaW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgICBpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgIGZsb2F0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgICBkb3VibGVfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgICAgYm9vbF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICAqc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgICpzdHJpbmdfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICAgZW51bV92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsICptZXNzYWdlX3ZhbHVlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoaXNfbGF6eSkgeworICAgICAgICAgIGxhenltZXNzYWdlX3ZhbHVlLT5Xcml0ZU1lc3NhZ2UobnVtYmVyLCBvdXRwdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2UobnVtYmVyLCAqbWVzc2FnZV92YWx1ZSwgb3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpCeXRlU2l6ZShpbnQgbnVtYmVyKSBjb25zdCB7CisgIGludCByZXN1bHQgPSAwOworCisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIGlmIChpc19wYWNrZWQpIHsKKyAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7ICBcCisgICAgICAgICAgICByZXN1bHQgKz0gV2lyZUZvcm1hdExpdGU6OkNBTUVMQ0FTRSMjU2l6ZSggICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWsKKworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgICBVSW50MzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgICBTSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgIGVudW0pOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgLy8gU3R1ZmYgd2l0aCBmaXhlZCBzaXplLgorI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjprIyNDQU1FTENBU0UjI1NpemUgKiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhaworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCwgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCwgIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlLCBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgYm9vbCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUzoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOgorICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb24tcHJpbWl0aXZlIHR5cGVzIGNhbid0IGJlIHBhY2tlZC4iOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYWNoZWRfc2l6ZSA9IHJlc3VsdDsKKyAgICAgIGlmIChyZXN1bHQgPiAwKSB7CisgICAgICAgIHJlc3VsdCArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhudW1iZXIsCisgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IHRhZ19zaXplID0gV2lyZUZvcm1hdExpdGU6OlRhZ1NpemUobnVtYmVyLCByZWFsX3R5cGUodHlwZSkpOworCisgICAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVzdWx0ICs9IHRhZ19zaXplICogcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyAgICAgICAgXAorICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgIFwKKyAgICAgICAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6Q0FNRUxDQVNFIyNTaXplKCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgICBJbnQzMiwgICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCAgIFVJbnQ2NCwgIHVpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU1RSSU5HLCAgIFN0cmluZywgIHN0cmluZyk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgIHN0cmluZyk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgZW51bSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIEdST1VQLCAgICBHcm91cCwgbWVzc2FnZSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgbWVzc2FnZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICAvLyBTdHVmZiB3aXRoIGZpeGVkIHNpemUuCisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZXN1bHQgKz0gKHRhZ19zaXplICsgV2lyZUZvcm1hdExpdGU6OmsjI0NBTUVMQ0FTRSMjU2l6ZSkgKiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrCisgICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMiwgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsICBGaXhlZDY0LCB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICAgIEZsb2F0LCAgZmxvYXQpOworICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsIGRvdWJsZSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgICAgQm9vbCwgICBib29sKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICghaXNfY2xlYXJlZCkgeworICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6VGFnU2l6ZShudW1iZXIsIHJlYWxfdHlwZSh0eXBlKSk7CisgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6Q0FNRUxDQVNFIyNTaXplKExPV0VSQ0FTRSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgICBpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgIGludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgICB1aW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgIHVpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgIGludDMyX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICAgaW50NjRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBTVFJJTkcsICAgU3RyaW5nLCAgKnN0cmluZ192YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBCWVRFUywgICAgQnl0ZXMsICAqc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgIGVudW1fdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgR1JPVVAsICAgIEdyb3VwLCAqbWVzc2FnZV92YWx1ZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRTogeworICAgICAgICBpZiAoaXNfbGF6eSkgeworICAgICAgICAgIGludCBzaXplID0gbGF6eW1lc3NhZ2VfdmFsdWUtPkJ5dGVTaXplKCk7CisgICAgICAgICAgcmVzdWx0ICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHNpemUpICsgc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgKz0gV2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKCptZXNzYWdlX3ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gU3R1ZmYgd2l0aCBmaXhlZCBzaXplLgorI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjprIyNDQU1FTENBU0UjI1NpemU7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhaworICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUpOworICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6R2V0U2l6ZSgpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhpc19yZXBlYXRlZCk7CisgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpCisKKyAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyKTsKKyAgICBIQU5ETEVfVFlQRSggIElOVDY0LCAgIGludDY0KTsKKyAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyKTsKKyAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0KTsKKyAgICBIQU5ETEVfVFlQRSggIEZMT0FULCAgIGZsb2F0KTsKKyAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlKTsKKyAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sKTsKKyAgICBIQU5ETEVfVFlQRSggICBFTlVNLCAgICBlbnVtKTsKKyAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nKTsKKyAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBtZXNzYWdlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAwOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpGcmVlKCkgeworICBpZiAoaXNfcmVwZWF0ZWQpIHsKKyAgICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVsZXRlIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKCAgSU5UMzIsICAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoICBJTlQ2NCwgICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBVSU5UNjQsICB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoICBGTE9BVCwgICBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEJPT0wsICAgIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoICAgRU5VTSwgICAgZW51bSk7CisgICAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nKTsKKyAgICAgIEhBTkRMRV9UWVBFKE1FU1NBR0UsIG1lc3NhZ2UpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICBkZWxldGUgc3RyaW5nX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgKGlzX2xhenkpIHsKKyAgICAgICAgICBkZWxldGUgbGF6eW1lc3NhZ2VfdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VfdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOGYxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oCkBAIC0wLDAgKzEsMTAwNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCisvLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9TRVRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fU0VUX0hfXworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgY2xhc3MgRmllbGREZXNjcmlwdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgY2xhc3MgRGVzY3JpcHRvclBvb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgY2xhc3MgTWVzc2FnZUxpdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlX2xpdGUuaAorICBjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuaAorICBjbGFzcyBNZXNzYWdlRmFjdG9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuaAorICBjbGFzcyBVbmtub3duRmllbGRTZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVua25vd25fZmllbGRfc2V0LmgKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCisgICAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlZF9zdHJlYW0uaAorICB9CisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgY2xhc3MgRmllbGRTa2lwcGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXJlX2Zvcm1hdF9saXRlLmgKKyAgICBjbGFzcyBSZXBlYXRlZFB0ckZpZWxkQmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4gY2xhc3MgUmVwZWF0ZWRGaWVsZDsgICAgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+IGNsYXNzIFJlcGVhdGVkUHRyRmllbGQ7ICAvLyByZXBlYXRlZF9maWVsZC5oCit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVc2VkIHRvIHN0b3JlIHZhbHVlcyBvZiB0eXBlIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgd2l0aG91dCBoYXZpbmcgdG8KKy8vICNpbmNsdWRlIHdpcmVfZm9ybWF0X2xpdGUuaC4gIEFsc28sIGVuc3VyZXMgdGhhdCB3ZSB1c2Ugb25seSBvbmUgYnl0ZSB0bworLy8gc3RvcmUgdGhlc2UgdmFsdWVzLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8ga2VlcCB0aGUgbGF5b3V0IG9mCisvLyBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiBzbWFsbC4KK3R5cGVkZWYgdWludDggRmllbGRUeXBlOworCisvLyBBIGZ1bmN0aW9uIHdoaWNoLCBnaXZlbiBhbiBpbnRlZ2VyIHZhbHVlLCByZXR1cm5zIHRydWUgaWYgdGhlIG51bWJlcgorLy8gbWF0Y2hlcyBvbmUgb2YgdGhlIGRlZmluZWQgdmFsdWVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBlbnVtIHR5cGUuICBUaGlzCisvLyBpcyB1c2VkIHdpdGggUmVnaXN0ZXJFbnVtRXh0ZW5zaW9uLCBiZWxvdy4KK3R5cGVkZWYgYm9vbCBFbnVtVmFsaWRpdHlGdW5jKGludCBudW1iZXIpOworCisvLyBWZXJzaW9uIG9mIHRoZSBhYm92ZSB3aGljaCB0YWtlcyBhbiBhcmd1bWVudC4gIFRoaXMgaXMgbmVlZGVkIHRvIGRlYWwgd2l0aAorLy8gZXh0ZW5zaW9ucyB0aGF0IGFyZSBub3QgY29tcGlsZWQgaW4uCit0eXBlZGVmIGJvb2wgRW51bVZhbGlkaXR5RnVuY1dpdGhBcmcoY29uc3Qgdm9pZCogYXJnLCBpbnQgbnVtYmVyKTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYSByZWdpc3RlcmVkIGV4dGVuc2lvbi4KK3N0cnVjdCBFeHRlbnNpb25JbmZvIHsKKyAgaW5saW5lIEV4dGVuc2lvbkluZm8oKSB7fQorICBpbmxpbmUgRXh0ZW5zaW9uSW5mbyhGaWVsZFR5cGUgdHlwZV9wYXJhbSwgYm9vbCBpc3JlcGVhdGVkLCBib29sIGlzcGFja2VkKQorICAgICAgOiB0eXBlKHR5cGVfcGFyYW0pLCBpc19yZXBlYXRlZChpc3JlcGVhdGVkKSwgaXNfcGFja2VkKGlzcGFja2VkKSwKKyAgICAgICAgZGVzY3JpcHRvcihOVUxMKSB7fQorCisgIEZpZWxkVHlwZSB0eXBlOworICBib29sIGlzX3JlcGVhdGVkOworICBib29sIGlzX3BhY2tlZDsKKworICBzdHJ1Y3QgRW51bVZhbGlkaXR5Q2hlY2sgeworICAgIEVudW1WYWxpZGl0eUZ1bmNXaXRoQXJnKiBmdW5jOworICAgIGNvbnN0IHZvaWQqIGFyZzsKKyAgfTsKKworICB1bmlvbiB7CisgICAgRW51bVZhbGlkaXR5Q2hlY2sgZW51bV92YWxpZGl0eV9jaGVjazsKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogbWVzc2FnZV9wcm90b3R5cGU7CisgIH07CisKKyAgLy8gVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZXh0ZW5zaW9uLCBpZiBvbmUgZXhpc3RzIGFuZCBpcyBrbm93bi4gIE1heSBiZQorICAvLyBOVUxMLiAgTXVzdCBub3QgYmUgTlVMTCBpZiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGV4dGVuc2lvbiBkb2VzIG5vdAorICAvLyBsaXZlIGluIHRoZSBzYW1lIHBvb2wgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb250YWluaW5nIHR5cGUuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcjsKK307CisKKy8vIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYW4gb2JqZWN0IHdoaWNoIGxvb2tzIHVwIGV4dGVuc2lvbiBkZWZpbml0aW9ucy4gIFVzZWQKKy8vIHdoZW4gcGFyc2luZy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFeHRlbnNpb25GaW5kZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RXh0ZW5zaW9uRmluZGVyKCk7CisKKyAgLy8gRmluZCB0aGUgZXh0ZW5zaW9uIHdpdGggdGhlIGdpdmVuIGNvbnRhaW5pbmcgdHlwZSBhbmQgbnVtYmVyLgorICB2aXJ0dWFsIGJvb2wgRmluZChpbnQgbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBvdXRwdXQpID0gMDsKK307CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIEV4dGVuc2lvbkZpbmRlciB3aGljaCBmaW5kcyBleHRlbnNpb25zIGRlZmluZWQgaW4gLnByb3RvCisvLyBmaWxlcyB3aGljaCBoYXZlIGJlZW4gY29tcGlsZWQgaW50byB0aGUgYmluYXJ5LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlciA6IHB1YmxpYyBFeHRlbnNpb25GaW5kZXIgeworIHB1YmxpYzoKKyAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUpCisgICAgICA6IGNvbnRhaW5pbmdfdHlwZV8oY29udGFpbmluZ190eXBlKSB7fQorICB2aXJ0dWFsIH5HZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIoKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBhbmQgZmlsbHMgaW4gKm91dHB1dCBpZiBmb3VuZCwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBGaW5kKGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlXzsKK307CisKKy8vIE5vdGU6ICBleHRlbnNpb25fc2V0X2hlYXZ5LmNjIGRlZmluZXMgRGVzY3JpcHRvclBvb2xFeHRlbnNpb25GaW5kZXIgZm9yCisvLyBmaW5kaW5nIGV4dGVuc2lvbnMgZnJvbSBhIERlc2NyaXB0b3JQb29sLgorCisvLyBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlciBjbGFzcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGhpbiB0aGUgcHJvdG9jb2wgYnVmZmVyCisvLyBsaWJyYXJ5IGFuZCBnZW5lcmF0ZWQgY2xhc3Nlcy4gIENsaWVudHMgc2hvdWxkIG5vdCB1c2UgaXQgZGlyZWN0bHkuICBJbnN0ZWFkLAorLy8gdXNlIHRoZSBnZW5lcmF0ZWQgYWNjZXNzb3JzIHN1Y2ggYXMgR2V0RXh0ZW5zaW9uKCkgb2YgdGhlIGNsYXNzIGJlaW5nCisvLyBleHRlbmRlZC4KKy8vCisvLyBUaGlzIGNsYXNzIG1hbmFnZXMgZXh0ZW5zaW9ucyBmb3IgYSBwcm90b2NvbCBtZXNzYWdlIG9iamVjdC4gIFRoZQorLy8gbWVzc2FnZSdzIEhhc0V4dGVuc2lvbigpLCBHZXRFeHRlbnNpb24oKSwgTXV0YWJsZUV4dGVuc2lvbigpLCBhbmQKKy8vIENsZWFyRXh0ZW5zaW9uKCkgbWV0aG9kcyBhcmUganVzdCB0aGluIHdyYXBwZXJzIGFyb3VuZCB0aGUgZW1iZWRkZWQKKy8vIEV4dGVuc2lvblNldC4gIFdoZW4gcGFyc2luZywgaWYgYSB0YWcgbnVtYmVyIGlzIGVuY291bnRlcmVkIHdoaWNoIGlzCisvLyBpbnNpZGUgb25lIG9mIHRoZSBtZXNzYWdlIHR5cGUncyBleHRlbnNpb24gcmFuZ2VzLCB0aGUgdGFnIGlzIHBhc3NlZAorLy8gb2ZmIHRvIHRoZSBFeHRlbnNpb25TZXQgZm9yIHBhcnNpbmcuICBFdGMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRXh0ZW5zaW9uU2V0IHsKKyBwdWJsaWM6CisgIEV4dGVuc2lvblNldCgpOworICB+RXh0ZW5zaW9uU2V0KCk7CisKKyAgLy8gVGhlc2UgYXJlIGNhbGxlZCBhdCBzdGFydHVwIGJ5IHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlIHRvCisgIC8vIHJlZ2lzdGVyIGtub3duIGV4dGVuc2lvbnMuICBUaGUgcmVnaXN0cmF0aW9ucyBhcmUgdXNlZCBieSBQYXJzZUZpZWxkKCkKKyAgLy8gdG8gbG9vayB1cCBleHRlbnNpb25zIGZvciBwYXJzZWQgZmllbGQgbnVtYmVycy4gIE5vdGUgdGhhdCBkeW5hbWljIHBhcnNpbmcKKyAgLy8gZG9lcyBub3QgdXNlIFBhcnNlRmllbGQoKTsgb25seSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgcGFyc2luZworICAvLyBtZXRob2RzIGRvLgorICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQpOworICBzdGF0aWMgdm9pZCBSZWdpc3RlckVudW1FeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsaWRpdHlGdW5jKiBpc192YWxpZCk7CisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTWVzc2FnZUV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcGVhdGVkLCBib29sIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLy8gQWRkIGFsbCBmaWVsZHMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcmVzZW50IHRvIHRoZSBnaXZlbiB2ZWN0b3IuICBUaGlzCisgIC8vIGlzIHVzZWZ1bCB0byBpbXBsZW1lbnQgUmVmbGVjdGlvbjo6TGlzdEZpZWxkcygpLgorICB2b2lkIEFwcGVuZFRvTGlzdChjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3Q7CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQWNjZXNzb3JzCisgIC8vCisgIC8vIEdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgaW5jbHVkZSB0eXBlLXNhZmUgdGVtcGxhdGVkIHdyYXBwZXJzIGFyb3VuZAorICAvLyB0aGVzZSBtZXRob2RzLiAgR2VuZXJhbGx5IHlvdSBzaG91bGQgdXNlIHRob3NlIHJhdGhlciB0aGFuIGNhbGwgdGhlc2UKKyAgLy8gZGlyZWN0bHksIHVubGVzcyB5b3UgYXJlIGRvaW5nIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudC4KKyAgLy8KKyAgLy8gV2hlbiBjYWxsaW5nIGFueSBvZiB0aGVzZSBhY2Nlc3NvcnMsIHRoZSBleHRlbnNpb24gbnVtYmVyIHJlcXVlc3RlZAorICAvLyBNVVNUIGV4aXN0IGluIHRoZSBEZXNjcmlwdG9yUG9vbCBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IuICBPdGhlcml3c2UsCisgIC8vIHRoZSBtZXRob2Qgd2lsbCBmYWlsIGFuIGFzc2VydC4gIE5vcm1hbGx5LCB0aG91Z2gsIHlvdSB3b3VsZCBub3QgY2FsbAorICAvLyB0aGVzZSBkaXJlY3RseTsgeW91IHdvdWxkIGVpdGhlciBjYWxsIHRoZSBnZW5lcmF0ZWQgYWNjZXNzb3JzIG9mIHlvdXIKKyAgLy8gbWVzc2FnZSBjbGFzcyAoZS5nLiBHZXRFeHRlbnNpb24oKSkgb3IgeW91IHdvdWxkIGNhbGwgdGhlIGFjY2Vzc29ycworICAvLyBvZiB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UuICBJbiBib3RoIGNhc2VzLCBpdCBpcyBpbXBvc3NpYmxlIHRvCisgIC8vIHRyaWdnZXIgdGhpcyBhc3NlcnQgZmFpbHVyZTogIHRoZSBnZW5lcmF0ZWQgYWNjZXNzb3JzIG9ubHkgYWNjZXB0CisgIC8vIGxpbmtlZC1pbiBleHRlbnNpb24gdHlwZXMgYXMgcGFyYW1ldGVycywgd2hpbGUgdGhlIFJlZmxlY3Rpb24gaW50ZXJmYWNlCisgIC8vIHJlcXVpcmVzIHlvdSB0byBwcm92aWRlIHRoZSBGaWVsZERlc2NyaXB0b3IgZGVzY3JpYmluZyB0aGUgZXh0ZW5zaW9uLgorICAvLworICAvLyBXaGVuIGNhbGxpbmcgYW55IG9mIHRoZXNlIGFjY2Vzc29ycywgYSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQKKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVuc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBudW1iZXIgTVVTVAorICAvLyBiZSBsaW5rZWQgaW4sIGFuZCB0aGUgRmllbGREZXNjcmlwdG9yIHVzZWQgdG8gcmVmZXIgdG8gaXQgTVVTVCBiZQorICAvLyB0aGUgb25lIGdlbmVyYXRlZCBieSB0aGF0IGxpbmtlZC1pbiBjb2RlLiAgT3RoZXJ3aXNlLCB0aGUgbWV0aG9kIHdpbGwKKyAgLy8gZGllIG9uIGFuIGFzc2VydCBmYWlsdXJlLiAgVGhlIG1lc3NhZ2Ugb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgbWVzc2FnZQorICAvLyBhY2Nlc3NvcnMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgb2YgdGhlIGNvcnJlY3QgbGlua2VkLWluIHR5cGUuCisgIC8vCisgIC8vIFRoZXNlIG1ldGhvZHMgcHJldHR5IG11Y2ggbWF0Y2ggUmVmbGVjdGlvbiBleGNlcHQgdGhhdDoKKyAgLy8gLSBUaGV5J3JlIG5vdCB2aXJ0dWFsLgorICAvLyAtIFRoZXkgaWRlbnRpZnkgZmllbGRzIGJ5IG51bWJlciByYXRoZXIgdGhhbiBGaWVsZERlc2NyaXB0b3JzLgorICAvLyAtIFRoZXkgaWRlbnRpZnkgZW51bSB2YWx1ZXMgdXNpbmcgaW50ZWdlcnMgcmF0aGVyIHRoYW4gZGVzY3JpcHRvcnMuCisgIC8vIC0gU3RyaW5ncyBwcm92aWRlIE11dGFibGUoKSBpbiBhZGRpdGlvbiB0byBTZXQoKSBhY2Nlc3NvcnMuCisKKyAgYm9vbCBIYXMoaW50IG51bWJlcikgY29uc3Q7CisgIGludCBFeHRlbnNpb25TaXplKGludCBudW1iZXIpIGNvbnN0OyAgIC8vIFNpemUgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uCisgIGludCBOdW1FeHRlbnNpb25zKCkgY29uc3Q7ICAvLyBUaGUgbnVtYmVyIG9mIGV4dGVuc2lvbnMKKyAgRmllbGRUeXBlIEV4dGVuc2lvblR5cGUoaW50IG51bWJlcikgY29uc3Q7CisgIHZvaWQgQ2xlYXJFeHRlbnNpb24oaW50IG51bWJlcik7CisKKyAgLy8gc2luZ3VsYXIgZmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpbnQzMiAgR2V0SW50MzIgKGludCBudW1iZXIsIGludDMyICBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgaW50NjQgIEdldEludDY0IChpbnQgbnVtYmVyLCBpbnQ2NCAgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIHVpbnQzMiBHZXRVSW50MzIoaW50IG51bWJlciwgdWludDMyIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICB1aW50NjQgR2V0VUludDY0KGludCBudW1iZXIsIHVpbnQ2NCBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgZmxvYXQgIEdldEZsb2F0IChpbnQgbnVtYmVyLCBmbG9hdCAgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGRvdWJsZSBHZXREb3VibGUoaW50IG51bWJlciwgZG91YmxlIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBib29sICAgR2V0Qm9vbCAgKGludCBudW1iZXIsIGJvb2wgICBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgaW50ICAgIEdldEVudW0gIChpbnQgbnVtYmVyLCBpbnQgICAgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IHN0cmluZyAmIEdldFN0cmluZyAoaW50IG51bWJlciwgY29uc3Qgc3RyaW5nJiAgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IE1lc3NhZ2VMaXRlJiBHZXRNZXNzYWdlKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgY29uc3QgTWVzc2FnZUxpdGUmIEdldE1lc3NhZ2UoaW50IG51bWJlciwgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3Q7CisKKyAgLy8gfGRlc2NyaXB0b3J8IG1heSBiZSBOVUxMIHNvIGxvbmcgYXMgaXQgaXMga25vd24gdGhhdCB0aGUgZGVzY3JpcHRvciBmb3IKKyAgLy8gdGhlIGV4dGVuc2lvbiBsaXZlcyBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgY29udGFpbmluZworICAvLyB0eXBlLgorI2RlZmluZSBkZXNjIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciAgLy8gYXZvaWQgbGluZSB3cmFwcGluZworICB2b2lkIFNldEludDMyIChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgaW50MzIgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXRJbnQ2NCAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGludDY0ICB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0VUludDMyKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCB1aW50MzIgdmFsdWUsIGRlc2MpOworICB2b2lkIFNldFVJbnQ2NChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgdWludDY0IHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXRGbG9hdCAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGZsb2F0ICB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0RG91YmxlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBkb3VibGUgdmFsdWUsIGRlc2MpOworICB2b2lkIFNldEJvb2wgIChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCAgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXRFbnVtICAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGludCAgICB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0U3RyaW5nKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBjb25zdCBzdHJpbmcmIHZhbHVlLCBkZXNjKTsKKyAgc3RyaW5nICogTXV0YWJsZVN0cmluZyAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGRlc2MpOworICBNZXNzYWdlTGl0ZSogTXV0YWJsZU1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLCBkZXNjKTsKKyAgTWVzc2FnZUxpdGUqIE11dGFibGVNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVjc3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKKyAgLy8gQWRkcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byB0aGUgRXh0ZW5zaW9uU2V0LCB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZQorICAvLyBtZXNzYWdlIG9iamVjdC4gRXhpc3RpbmcgbWVzc2FnZSB3aXRoIHRoZSBzYW1lIG51bWJlciB3aWxsIGJlIGRlbGV0ZWQuCisgIC8vIElmICJtZXNzYWdlIiBpcyBOVUxMLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gIkNsZWFyRXh0ZW5zaW9uKG51bWJlcikiLgorICB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7CisgIE1lc3NhZ2VMaXRlKiBSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKTsKKyAgTWVzc2FnZUxpdGUqIFJlbGVhc2VNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKKyN1bmRlZiBkZXNjCisKKyAgLy8gcmVwZWF0ZWQgZmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB2b2lkKiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyKTsKKworICBpbnQzMiAgR2V0UmVwZWF0ZWRJbnQzMiAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgaW50NjQgIEdldFJlcGVhdGVkSW50NjQgKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQzMiBHZXRSZXBlYXRlZFVJbnQzMihpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICB1aW50NjQgR2V0UmVwZWF0ZWRVSW50NjQoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgZmxvYXQgIEdldFJlcGVhdGVkRmxvYXQgKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGRvdWJsZSBHZXRSZXBlYXRlZERvdWJsZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBib29sICAgR2V0UmVwZWF0ZWRCb29sICAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgaW50ICAgIEdldFJlcGVhdGVkRW51bSAgKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IHN0cmluZyAmIEdldFJlcGVhdGVkU3RyaW5nIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCBNZXNzYWdlTGl0ZSYgR2V0UmVwZWF0ZWRNZXNzYWdlKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisKKyAgdm9pZCBTZXRSZXBlYXRlZEludDMyIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGludDMyICB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRJbnQ2NCAoaW50IG51bWJlciwgaW50IGluZGV4LCBpbnQ2NCAgdmFsdWUpOworICB2b2lkIFNldFJlcGVhdGVkVUludDMyKGludCBudW1iZXIsIGludCBpbmRleCwgdWludDMyIHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZFVJbnQ2NChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIHVpbnQ2NCB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRGbG9hdCAoaW50IG51bWJlciwgaW50IGluZGV4LCBmbG9hdCAgdmFsdWUpOworICB2b2lkIFNldFJlcGVhdGVkRG91YmxlKGludCBudW1iZXIsIGludCBpbmRleCwgZG91YmxlIHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZEJvb2wgIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGJvb2wgICB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRFbnVtICAoaW50IG51bWJlciwgaW50IGluZGV4LCBpbnQgICAgdmFsdWUpOworICB2b2lkIFNldFJlcGVhdGVkU3RyaW5nKGludCBudW1iZXIsIGludCBpbmRleCwgY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CisgIHN0cmluZyAqIE11dGFibGVSZXBlYXRlZFN0cmluZyAoaW50IG51bWJlciwgaW50IGluZGV4KTsKKyAgTWVzc2FnZUxpdGUqIE11dGFibGVSZXBlYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgaW50IGluZGV4KTsKKworI2RlZmluZSBkZXNjIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciAgLy8gYXZvaWQgbGluZSB3cmFwcGluZworICB2b2lkIEFkZEludDMyIChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIGludDMyICB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkSW50NjQgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgaW50NjQgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRVSW50MzIoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCB1aW50MzIgdmFsdWUsIGRlc2MpOworICB2b2lkIEFkZFVJbnQ2NChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIHVpbnQ2NCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkRmxvYXQgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgZmxvYXQgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGREb3VibGUoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBkb3VibGUgdmFsdWUsIGRlc2MpOworICB2b2lkIEFkZEJvb2wgIChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIGJvb2wgICB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkRW51bSAgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgaW50ICAgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGNvbnN0IHN0cmluZyYgdmFsdWUsIGRlc2MpOworICBzdHJpbmcgKiBBZGRTdHJpbmcgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBkZXNjKTsKKyAgTWVzc2FnZUxpdGUqIEFkZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsIGRlc2MpOworICBNZXNzYWdlTGl0ZSogQWRkTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKKyN1bmRlZiBkZXNjCisKKyAgdm9pZCBSZW1vdmVMYXN0KGludCBudW1iZXIpOworICBNZXNzYWdlTGl0ZSogUmVsZWFzZUxhc3QoaW50IG51bWJlcik7CisgIHZvaWQgU3dhcEVsZW1lbnRzKGludCBudW1iZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRPRE8oa2VudG9uKTogIEhhcmRjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFjY2Vzc29ycworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGltcGxlbWVudGluZyBtZXRob2RzIG9mIE1lc3NhZ2UKKyAgLy8KKyAgLy8gVGhlc2UgY291bGQgYWxsIGJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBvdGhlciBtZXRob2RzIG9mIHRoaXMKKyAgLy8gY2xhc3MsIGJ1dCBwcm92aWRpbmcgdGhlbSBoZXJlIGhlbHBzIGtlZXAgdGhlIGdlbmVyYXRlZCBjb2RlIHNpemUgZG93bi4KKworICB2b2lkIENsZWFyKCk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEV4dGVuc2lvblNldCYgb3RoZXIpOworICB2b2lkIFN3YXAoRXh0ZW5zaW9uU2V0KiBvdGhlcik7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIC8vIFBhcnNlcyBhIHNpbmdsZSBleHRlbnNpb24gZnJvbSB0aGUgaW5wdXQuIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQgb3V0CisgIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4KKyAgYm9vbCBQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7CisKKyAgLy8gU3BlY2lmaWMgdmVyc2lvbnMgZm9yIGxpdGUgb3IgZnVsbCBtZXNzYWdlcyAoY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUKKyAgLy8gRmllbGRTa2lwcGVyIGF1dG9tYXRpY2FsbHkpLiAgfGNvbnRhaW5pbmdfdHlwZXwgaXMgdGhlIGRlZmF1bHQKKyAgLy8gaW5zdGFuY2UgZm9yIHRoZSBjb250YWluaW5nIG1lc3NhZ2U7IGl0IGlzIHVzZWQgb25seSB0byBsb29rIHVwIHRoZQorICAvLyBleHRlbnNpb24gYnkgbnVtYmVyLiAgU2VlIFJlZ2lzdGVyRXh0ZW5zaW9uKCksIGFib3ZlLiAgVW5saWtlIHRoZSBvdGhlcgorICAvLyBtZXRob2RzIG9mIEV4dGVuc2lvblNldCwgdGhpcyBvbmx5IHdvcmtzIGZvciBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlcyAtLQorICAvLyBpdCBsb29rcyB1cCBleHRlbnNpb25zIHJlZ2lzdGVyZWQgdXNpbmcgUmVnaXN0ZXJFeHRlbnNpb24oKS4KKyAgYm9vbCBQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUpOworICBib29sIFBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKKyAgLy8gUGFyc2UgYW4gZW50aXJlIG1lc3NhZ2UgaW4gTWVzc2FnZVNldCBmb3JtYXQuICBTdWNoIG1lc3NhZ2VzIGhhdmUgbm8KKyAgLy8gZmllbGRzLCBvbmx5IGV4dGVuc2lvbnMuCisgIGJvb2wgUGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpOworCisgIC8vIFNwZWNpZmljIHZlcnNpb25zIGZvciBsaXRlIG9yIGZ1bGwgbWVzc2FnZXMgKGNvbnN0cnVjdHMgdGhlIGFwcHJvcHJpYXRlCisgIC8vIEZpZWxkU2tpcHBlciBhdXRvbWF0aWNhbGx5KS4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlKTsKKyAgYm9vbCBQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworCisgIC8vIFdyaXRlIGFsbCBleHRlbnNpb24gZmllbGRzIHdpdGggZmllbGQgbnVtYmVycyBpbiB0aGUgcmFuZ2UKKyAgLy8gICBbc3RhcnRfZmllbGRfbnVtYmVyLCBlbmRfZmllbGRfbnVtYmVyKQorICAvLyB0byB0aGUgb3V0cHV0IHN0cmVhbSwgdXNpbmcgdGhlIGNhY2hlZCBzaXplcyBjb21wdXRlZCB3aGVuIEJ5dGVTaXplKCkgd2FzCisgIC8vIGxhc3QgY2FsbGVkLiAgTm90ZSB0aGF0IHRoZSByYW5nZSBib3VuZHMgYXJlIGluY2x1c2l2ZS1leGNsdXNpdmUuCisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGludCBzdGFydF9maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRfZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisKKyAgLy8gU2FtZSBhcyBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMsIGJ1dCB3aXRob3V0IGFueSBib3VuZHMgY2hlY2tpbmcuCisgIC8vIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0YXJnZXQgaGFzIHN1ZmZpY2llbnQgY2FwYWNpdHkgZm9yIHRoZQorICAvLyBzZXJpYWxpemVkIGV4dGVuc2lvbnMuCisgIC8vCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHBhc3QgdGhlIGxhc3Qgd3JpdHRlbiBieXRlLgorICB1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbnQgc3RhcnRfZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kX2ZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgY29uc3Q7CisKKyAgLy8gTGlrZSBhYm92ZSBidXQgc2VyaWFsaXplcyBpbiBNZXNzYWdlU2V0IGZvcm1hdC4KKyAgdm9pZCBTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgdWludDgqIFNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHVpbnQ4KiB0YXJnZXQpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHRvdGFsIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhbGwgdGhlIGV4dGVuc2lvbnMuCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworCisgIC8vIExpa2UgQnl0ZVNpemUoKSBidXQgdXNlcyBNZXNzYWdlU2V0IGZvcm1hdC4KKyAgaW50IE1lc3NhZ2VTZXRCeXRlU2l6ZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgKGFuIGVzdGltYXRlIG9mKSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIHN0b3JpbmcgdGhlCisgIC8vIGV4dGVuc2lvbnMgaW4gbWVtb3J5LCBleGNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4gIElmIHRoZSBFeHRlbnNpb25TZXQgaXMKKyAgLy8gZm9yIGEgbGl0ZSBtZXNzYWdlIChhbmQgdGh1cyBwb3NzaWJseSBjb250YWlucyBsaXRlIG1lc3NhZ2VzKSwgdGhlIHJlc3VsdHMKKyAgLy8gYXJlIHVuZGVmaW5lZCAobWlnaHQgd29yaywgbWlnaHQgY3Jhc2gsIG1pZ2h0IGNvcnJ1cHQgZGF0YSwgbWlnaHQgbm90IGV2ZW4KKyAgLy8gYmUgbGlua2VkIGluKS4gIEl0J3MgdXAgdG8gdGhlIHByb3RvY29sIGNvbXBpbGVyIHRvIGF2b2lkIGNhbGxpbmcgdGhpcyBvbgorICAvLyBzdWNoIEV4dGVuc2lvblNldHMgKGVhc3kgZW5vdWdoIHNpbmNlIGxpdGUgbWVzc2FnZXMgZG9uJ3QgaW1wbGVtZW50CisgIC8vIFNwYWNlVXNlZCgpKS4KKyAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdDsKKworIHByaXZhdGU6CisKKyAgLy8gSW50ZXJmYWNlIG9mIGEgbGF6aWx5IHBhcnNlZCBzaW5ndWxhciBtZXNzYWdlIGV4dGVuc2lvbi4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExhenlNZXNzYWdlRXh0ZW5zaW9uIHsKKyAgIHB1YmxpYzoKKyAgICBMYXp5TWVzc2FnZUV4dGVuc2lvbigpIHt9CisgICAgdmlydHVhbCB+TGF6eU1lc3NhZ2VFeHRlbnNpb24oKSB7fQorCisgICAgdmlydHVhbCBMYXp5TWVzc2FnZUV4dGVuc2lvbiogTmV3KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3QgTWVzc2FnZUxpdGUmIEdldE1lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIE1lc3NhZ2VMaXRlKiBNdXRhYmxlTWVzc2FnZShjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZUxpdGUgKm1lc3NhZ2UpID0gMDsKKyAgICB2aXJ0dWFsIE1lc3NhZ2VMaXRlKiBSZWxlYXNlTWVzc2FnZShjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBCeXRlU2l6ZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBTcGFjZVVzZWQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IExhenlNZXNzYWdlRXh0ZW5zaW9uJiBvdGhlcikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBDbGVhcigpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBSZWFkTWVzc2FnZShjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgV3JpdGVNZXNzYWdlKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdWludDgqIFdyaXRlTWVzc2FnZVRvQXJyYXkoaW50IG51bWJlciwgdWludDgqIHRhcmdldCkgY29uc3QgPSAwOworICAgcHJpdmF0ZToKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTGF6eU1lc3NhZ2VFeHRlbnNpb24pOworICB9OworICBzdHJ1Y3QgRXh0ZW5zaW9uIHsKKyAgICAvLyBUaGUgb3JkZXIgb2YgdGhlc2UgZmllbGRzIHBhY2tzIEV4dGVuc2lvbiBpbnRvIDI0IGJ5dGVzIHdoZW4gdXNpbmcgOAorICAgIC8vIGJ5dGUgYWxpZ25tZW50LiBDb25zaWRlciB0aGlzIHdoZW4gYWRkaW5nIG9yIHJlbW92aW5nIGZpZWxkcyBoZXJlLgorICAgIHVuaW9uIHsKKyAgICAgIGludDMyICAgICAgICAgICAgICAgICBpbnQzMl92YWx1ZTsKKyAgICAgIGludDY0ICAgICAgICAgICAgICAgICBpbnQ2NF92YWx1ZTsKKyAgICAgIHVpbnQzMiAgICAgICAgICAgICAgICB1aW50MzJfdmFsdWU7CisgICAgICB1aW50NjQgICAgICAgICAgICAgICAgdWludDY0X3ZhbHVlOworICAgICAgZmxvYXQgICAgICAgICAgICAgICAgIGZsb2F0X3ZhbHVlOworICAgICAgZG91YmxlICAgICAgICAgICAgICAgIGRvdWJsZV92YWx1ZTsKKyAgICAgIGJvb2wgICAgICAgICAgICAgICAgICBib29sX3ZhbHVlOworICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGVudW1fdmFsdWU7CisgICAgICBzdHJpbmcqICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOworICAgICAgTWVzc2FnZUxpdGUqICAgICAgICAgIG1lc3NhZ2VfdmFsdWU7CisgICAgICBMYXp5TWVzc2FnZUV4dGVuc2lvbiogbGF6eW1lc3NhZ2VfdmFsdWU7CisKKyAgICAgIFJlcGVhdGVkRmllbGQgICA8aW50MzIgICAgICA+KiByZXBlYXRlZF9pbnQzMl92YWx1ZTsKKyAgICAgIFJlcGVhdGVkRmllbGQgICA8aW50NjQgICAgICA+KiByZXBlYXRlZF9pbnQ2NF92YWx1ZTsKKyAgICAgIFJlcGVhdGVkRmllbGQgICA8dWludDMyICAgICA+KiByZXBlYXRlZF91aW50MzJfdmFsdWU7CisgICAgICBSZXBlYXRlZEZpZWxkICAgPHVpbnQ2NCAgICAgPiogcmVwZWF0ZWRfdWludDY0X3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxmbG9hdCAgICAgID4qIHJlcGVhdGVkX2Zsb2F0X3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxkb3VibGUgICAgID4qIHJlcGVhdGVkX2RvdWJsZV92YWx1ZTsKKyAgICAgIFJlcGVhdGVkRmllbGQgICA8Ym9vbCAgICAgICA+KiByZXBlYXRlZF9ib29sX3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxpbnQgICAgICAgID4qIHJlcGVhdGVkX2VudW1fdmFsdWU7CisgICAgICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZyAgICAgPiogcmVwZWF0ZWRfc3RyaW5nX3ZhbHVlOworICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4qIHJlcGVhdGVkX21lc3NhZ2VfdmFsdWU7CisgICAgfTsKKworICAgIEZpZWxkVHlwZSB0eXBlOworICAgIGJvb2wgaXNfcmVwZWF0ZWQ7CisKKyAgICAvLyBGb3Igc2luZ3VsYXIgdHlwZXMsIGluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIGlzICJjbGVhcmVkIi4gIFRoaXMKKyAgICAvLyBoYXBwZW5zIHdoZW4gYW4gZXh0ZW5zaW9uIGlzIHNldCBhbmQgdGhlbiBsYXRlciBjbGVhcmVkIGJ5IHRoZSBjYWxsZXIuCisgICAgLy8gV2Ugd2FudCB0byBrZWVwIHRoZSBFeHRlbnNpb24gb2JqZWN0IGFyb3VuZCBmb3IgcmV1c2UsIHNvIGluc3RlYWQgb2YKKyAgICAvLyByZW1vdmluZyBpdCBmcm9tIHRoZSBtYXAsIHdlIGp1c3Qgc2V0IGlzX2NsZWFyZWQgPSB0cnVlLiAgVGhpcyBoYXMgbm8KKyAgICAvLyBtZWFuaW5nIGZvciByZXBlYXRlZCB0eXBlczsgZm9yIHRob3NlLCB0aGUgc2l6ZSBvZiB0aGUgUmVwZWF0ZWRGaWVsZAorICAgIC8vIHNpbXBseSBiZWNvbWVzIHplcm8gd2hlbiBjbGVhcmVkLgorICAgIGJvb2wgaXNfY2xlYXJlZCA6IDQ7CisKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZSB0eXBlcywgaW5kaWNhdGVzIHdoZXRoZXIgbGF6eSBwYXJzaW5nIGlzIGVuYWJsZWQKKyAgICAvLyBmb3IgdGhpcyBleHRlbnNpb24uIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCB3aGVuIHR5cGUgPT0gVFlQRV9NRVNTQUdFCisgICAgLy8gYW5kICFpc19yZXBlYXRlZCBiZWNhdXNlIHdlIG9ubHkgc3VwcG9ydCBsYXp5IHBhcnNpbmcgZm9yIHNpbmd1bGFyCisgICAgLy8gbWVzc2FnZSB0eXBlcyBjdXJyZW50bHkuIElmIGlzX2xhenkgPSB0cnVlLCB0aGUgZXh0ZW5zaW9uIGlzIHN0b3JlZCBpbgorICAgIC8vIGxhenltZXNzYWdlX3ZhbHVlLiBPdGhlcndpc2UsIHRoZSBleHRlbnNpb24gd2lsbCBiZSBtZXNzYWdlX3ZhbHVlLgorICAgIGJvb2wgaXNfbGF6eSA6IDQ7CisKKyAgICAvLyBGb3IgcmVwZWF0ZWQgdHlwZXMsIHRoaXMgaW5kaWNhdGVzIGlmIHRoZSBbcGFja2VkPXRydWVdIG9wdGlvbiBpcyBzZXQuCisgICAgYm9vbCBpc19wYWNrZWQ7CisKKyAgICAvLyBGb3IgcGFja2VkIGZpZWxkcywgdGhlIHNpemUgb2YgdGhlIHBhY2tlZCBkYXRhIGlzIHJlY29yZGVkIGhlcmUgd2hlbgorICAgIC8vIEJ5dGVTaXplKCkgaXMgY2FsbGVkIHRoZW4gdXNlZCBkdXJpbmcgc2VyaWFsaXphdGlvbi4KKyAgICAvLyBUT0RPKGtlbnRvbik6ICBVc2UgYXRvbWljPGludD4gd2hlbiBDKysgc3VwcG9ydHMgaXQuCisgICAgbXV0YWJsZSBpbnQgY2FjaGVkX3NpemU7CisKKyAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyBleHRlbnNpb24sIGlmIG9uZSBleGlzdHMgYW5kIGlzIGtub3duLiAgTWF5IGJlCisgICAgLy8gTlVMTC4gIE11c3Qgbm90IGJlIE5VTEwgaWYgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBleHRlbnNpb24gZG9lcyBub3QKKyAgICAvLyBsaXZlIGluIHRoZSBzYW1lIHBvb2wgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb250YWluaW5nIHR5cGUuCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yOworCisgICAgLy8gU29tZSBoZWxwZXIgbWV0aG9kcyBmb3Igb3BlcmF0aW9ucyBvbiBhIHNpbmdsZSBFeHRlbnNpb24uCisgICAgdm9pZCBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcygKKyAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAgIHVpbnQ4KiBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAgIGludCBudW1iZXIsCisgICAgICAgIHVpbnQ4KiB0YXJnZXQpIGNvbnN0OworICAgIHZvaWQgU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoCisgICAgICAgIGludCBudW1iZXIsCisgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgICB1aW50OCogU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICB1aW50OCogdGFyZ2V0KSBjb25zdDsKKyAgICBpbnQgQnl0ZVNpemUoaW50IG51bWJlcikgY29uc3Q7CisgICAgaW50IE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoaW50IG51bWJlcikgY29uc3Q7CisgICAgdm9pZCBDbGVhcigpOworICAgIGludCBHZXRTaXplKCkgY29uc3Q7CisgICAgdm9pZCBGcmVlKCk7CisgICAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdDsKKyAgfTsKKworCisgIC8vIFJldHVybnMgdHJ1ZSBhbmQgZmlsbHMgZmllbGRfbnVtYmVyIGFuZCBleHRlbnNpb24gaWYgZXh0ZW5zaW9uIGlzIGZvdW5kLgorICBib29sIEZpbmRFeHRlbnNpb25JbmZvRnJvbVRhZyh1aW50MzIgdGFnLCBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmllbGRfbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24pOworCisgIC8vIFBhcnNlcyBhIHNpbmdsZSBleHRlbnNpb24gZnJvbSB0aGUgaW5wdXQuIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQgb3V0CisgIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHdpcmUgdGFnLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4KKyAgLy8gUGFyc2VGaWVsZCgpIGFmdGVyIGZpZWxkIG51bWJlciBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgd2lyZSB0YWcgYW5kCisgIC8vIEV4dGVuc2lvbkluZm8gaXMgZm91bmQgYnkgdGhlIGZpZWxkIG51bWJlci4KKyAgYm9vbCBQYXJzZUZpZWxkV2l0aEV4dGVuc2lvbkluZm8oaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uSW5mbyYgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7CisKKyAgLy8gTGlrZSBQYXJzZUZpZWxkKCksIGJ1dCB0aGlzIG1ldGhvZCBtYXkgcGFyc2Ugc2luZ3VsYXIgbWVzc2FnZSBleHRlbnNpb25zCisgIC8vIGxhemlseSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIEZMQUdTX2VhZ2VybHlfcGFyc2VfbWVzc2FnZV9zZXRzLgorICBib29sIFBhcnNlRmllbGRNYXliZUxhemlseSh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKTsKKworICAvLyBHZXRzIHRoZSBleHRlbnNpb24gd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLCBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdAorICAvLyBhbHJlYWR5IGV4aXN0LiAgUmV0dXJucyB0cnVlIGlmIHRoZSBleHRlbnNpb24gZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgorICBib29sIE1heWJlTmV3RXh0ZW5zaW9uKGludCBudW1iZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb24qKiByZXN1bHQpOworCisgIC8vIFBhcnNlIGEgc2luZ2xlIE1lc3NhZ2VTZXQgaXRlbSAtLSBjYWxsZWQganVzdCBhZnRlciB0aGUgaXRlbSBncm91cCBzdGFydAorICAvLyB0YWcgaGFzIGJlZW4gcmVhZC4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VTZXRJdGVtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7CisKKworICAvLyBIYWNrOiAgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZGVjbGFyZXMgRXh0ZW5zaW9uU2V0IGFzIGEgZnJpZW5kLiAgVGhpcworICAvLyAgIGZyaWVuZHNoaXAgc2hvdWxkIGF1dG9tYXRpY2FsbHkgZXh0ZW5kIHRvIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uLCBidXQKKyAgLy8gICB1bmZvcnR1bmF0ZWx5IHNvbWUgb2xkZXIgY29tcGlsZXJzIChlLmcuIEdDQyAzLjQuNCkgZG8gbm90IGltcGxlbWVudCB0aGlzCisgIC8vICAgY29ycmVjdGx5LiAgU28sIHdlIG11c3QgcHJvdmlkZSBoZWxwZXJzIGZvciBjYWxsaW5nIG1ldGhvZHMgb2YgdGhhdAorICAvLyAgIGNsYXNzLgorCisgIC8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKyAgc3RhdGljIGlubGluZSBpbnQgUmVwZWF0ZWRNZXNzYWdlX1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoCisgICAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZSogZmllbGQpOworCisgIC8vIFRoZSBFeHRlbnNpb24gc3RydWN0IGlzIHNtYWxsIGVub3VnaCB0byBiZSBwYXNzZWQgYnkgdmFsdWUsIHNvIHdlIHVzZSBpdAorICAvLyBkaXJlY3RseSBhcyB0aGUgdmFsdWUgdHlwZSBpbiB0aGUgbWFwIHJhdGhlciB0aGFuIHVzZSBwb2ludGVycy4gIFdlIHVzZQorICAvLyBhIG1hcCByYXRoZXIgdGhhbiBoYXNoX21hcCBoZXJlIGJlY2F1c2Ugd2UgZXhwZWN0IG1vc3QgRXh0ZW5zaW9uU2V0cyB3aWxsCisgIC8vIG9ubHkgY29udGFpbiBhIHNtYWxsIG51bWJlciBvZiBleHRlbnNpb25zIHdoZXJlYXMgaGFzaF9tYXAgaXMgb3B0aW1pemVkCisgIC8vIGZvciAxMDAgZWxlbWVudHMgb3IgbW9yZS4gIEFsc28sIHdlIHdhbnQgQXBwZW5kVG9MaXN0KCkgdG8gb3JkZXIgZmllbGRzCisgIC8vIGJ5IGZpZWxkIG51bWJlci4KKyAgc3RkOjptYXA8aW50LCBFeHRlbnNpb24+IGV4dGVuc2lvbnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFeHRlbnNpb25TZXQpOworfTsKKworLy8gVGhlc2UgYXJlIGp1c3QgZm9yIGNvbnZlbmllbmNlLi4uCitpbmxpbmUgdm9pZCBFeHRlbnNpb25TZXQ6OlNldFN0cmluZyhpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgTXV0YWJsZVN0cmluZyhudW1iZXIsIHR5cGUsIGRlc2NyaXB0b3IpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRXh0ZW5zaW9uU2V0OjpTZXRSZXBlYXRlZFN0cmluZyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgTXV0YWJsZVJlcGVhdGVkU3RyaW5nKG51bWJlciwgaW5kZXgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRXh0ZW5zaW9uU2V0OjpBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEFkZFN0cmluZyhudW1iZXIsIHR5cGUsIGRlc2NyaXB0b3IpLT5hc3NpZ24odmFsdWUpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBHbHVlIGZvciBnZW5lcmF0ZWQgZXh0ZW5zaW9uIGFjY2Vzc29ycworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZW1wbGF0ZSBtYWdpYworCisvLyBGaXJzdCB3ZSBoYXZlIGEgc2V0IG9mIGNsYXNzZXMgcmVwcmVzZW50aW5nICJ0eXBlIHRyYWl0cyIgZm9yIGRpZmZlcmVudAorLy8gZmllbGQgdHlwZXMuICBBIHR5cGUgdHJhaXRzIGNsYXNzIGtub3dzIGhvdyB0byBpbXBsZW1lbnQgYmFzaWMgYWNjZXNzb3JzCisvLyBmb3IgZXh0ZW5zaW9ucyBvZiBhIHBhcnRpY3VsYXIgdHlwZSBnaXZlbiBhbiBFeHRlbnNpb25TZXQuICBUaGUgc2lnbmF0dXJlCisvLyBmb3IgYSB0eXBlIHRyYWl0cyBjbGFzcyBsb29rcyBsaWtlIHRoaXM6CisvLworLy8gICBjbGFzcyBUeXBlVHJhaXRzIHsKKy8vICAgIHB1YmxpYzoKKy8vICAgICB0eXBlZGVmID8gQ29uc3RUeXBlOworLy8gICAgIHR5cGVkZWYgPyBNdXRhYmxlVHlwZTsKKy8vCisvLyAgICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0KTsKKy8vICAgICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIENvbnN0VHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpOworLy8gICAgIHN0YXRpYyBpbmxpbmUgTXV0YWJsZVR5cGUgTXV0YWJsZShpbnQgbnVtYmVyLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLworLy8gICAgIC8vIFZhcmlhbnRzIGZvciByZXBlYXRlZCBmaWVsZHMuCisvLyAgICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworLy8gICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgaW50IGluZGV4LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLyAgICAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBNdXRhYmxlKGludCBudW1iZXIsIGludCBpbmRleCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpOworLy8gICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLyAgICAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBBZGQoaW50IG51bWJlciwgRXh0ZW5zaW9uU2V0KiBzZXQpOworLy8gICB9OworLy8KKy8vIE5vdCBhbGwgb2YgdGhlc2UgbWV0aG9kcyBtYWtlIHNlbnNlIGZvciBhbGwgZmllbGQgdHlwZXMuICBGb3IgZXhhbXBsZSwgdGhlCisvLyAiTXV0YWJsZSIgbWV0aG9kcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHN0cmluZ3MgYW5kIG1lc3NhZ2VzLCBhbmQgdGhlCisvLyByZXBlYXRlZCBtZXRob2RzIG9ubHkgbWFrZSBzZW5zZSBmb3IgcmVwZWF0ZWQgdHlwZXMuICBTbywgZWFjaCB0eXBlCisvLyB0cmFpdHMgY2xhc3MgaW1wbGVtZW50cyBvbmx5IHRoZSBzZXQgb2YgbWV0aG9kcyBmcm9tIHRoaXMgc2lnbmF0dXJlIHRoYXQgaXQKKy8vIGFjdHVhbGx5IHN1cHBvcnRzLiAgVGhpcyB3aWxsIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IgaWYgdGhlIHVzZXIgdHJpZXMgdG8KKy8vIGFjY2VzcyBhbiBleHRlbnNpb24gdXNpbmcgYSBtZXRob2QgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIGl0cyB0eXBlLgorLy8gRm9yIGV4YW1wbGUsIGlmICJmb28iIGlzIGFuIGV4dGVuc2lvbiBvZiB0eXBlICJvcHRpb25hbCBpbnQzMiIsIHRoZW4gaWYgeW91CisvLyB0cnkgdG8gd3JpdGUgY29kZSBsaWtlOgorLy8gICBteV9tZXNzYWdlLk11dGFibGVFeHRlbnNpb24oZm9vKQorLy8geW91IHdpbGwgZ2V0IGEgY29tcGlsZSBlcnJvciBiZWNhdXNlIFByaW1pdGl2ZVR5cGVUcmFpdHM8aW50MzI+IGRvZXMgbm90CisvLyBoYXZlIGEgIk11dGFibGUoKSIgbWV0aG9kLgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmltaXRpdmVUeXBlVHJhaXRzCisKKy8vIFNpbmNlIHRoZSBFeHRlbnNpb25TZXQgaGFzIGRpZmZlcmVudCBtZXRob2RzIGZvciBlYWNoIHByaW1pdGl2ZSB0eXBlLAorLy8gd2UgbXVzdCBleHBsaWNpdGx5IGRlZmluZSB0aGUgbWV0aG9kcyBvZiB0aGUgdHlwZSB0cmFpdHMgY2xhc3MgZm9yIGVhY2gKKy8vIGtub3duIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIFByaW1pdGl2ZVR5cGVUcmFpdHMgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUeXBlIENvbnN0VHlwZTsKKworICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgVHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsIGludCBpbmRleCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgaW50IGluZGV4LCBUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQsIFR5cGUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KTsKK307CisKKyNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIFRZUEUgUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0KCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgVFlQRSBkZWZhdWx0X3ZhbHVlKSB7ICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHNldC5HZXQjI01FVEhPRChudW1iZXIsIGRlZmF1bHRfdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQgUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6U2V0KCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgVFlQRSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsgICAgIFwKKyAgc2V0LT5TZXQjI01FVEhPRChudW1iZXIsIGZpZWxkX3R5cGUsIHZhbHVlLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIFRZUEUgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpHZXQoICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHNldC5HZXRSZXBlYXRlZCMjTUVUSE9EKG51bWJlciwgaW5kZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpTZXQoICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIFRZUEUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7ICAgICAgICAgICAgICAgIFwKKyAgc2V0LT5TZXRSZXBlYXRlZCMjTUVUSE9EKG51bWJlciwgaW5kZXgsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpBZGQoICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgYm9vbCBpc19wYWNrZWQsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2V0LT5BZGQjI01FVEhPRChudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgdmFsdWUsIE5VTEwpOyAgICAgICAgICAgIFwKK30KKworUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBpbnQzMiwgIEludDMyKQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBpbnQ2NCwgIEludDY0KQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKHVpbnQzMiwgVUludDMyKQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKHVpbnQ2NCwgVUludDY0KQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBmbG9hdCwgIEZsb2F0KQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKGRvdWJsZSwgRG91YmxlKQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCAgYm9vbCwgICBCb29sKQorCisjdW5kZWYgUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZ1R5cGVUcmFpdHMKKworLy8gU3RyaW5ncyBzdXBwb3J0IGJvdGggU2V0KCkgYW5kIE11dGFibGUoKS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdUeXBlVHJhaXRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgY29uc3Qgc3RyaW5nJiBDb25zdFR5cGU7CisgIHR5cGVkZWYgc3RyaW5nKiBNdXRhYmxlVHlwZTsKKworICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKSB7CisgICAgcmV0dXJuIHNldC5HZXRTdHJpbmcobnVtYmVyLCBkZWZhdWx0X3ZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5TZXRTdHJpbmcobnVtYmVyLCBmaWVsZF90eXBlLCB2YWx1ZSwgTlVMTCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdHJpbmcqIE11dGFibGUoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHNldC0+TXV0YWJsZVN0cmluZyhudW1iZXIsIGZpZWxkX3R5cGUsIE5VTEwpOworICB9Cit9OworCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRTdHJpbmdUeXBlVHJhaXRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgY29uc3Qgc3RyaW5nJiBDb25zdFR5cGU7CisgIHR5cGVkZWYgc3RyaW5nKiBNdXRhYmxlVHlwZTsKKworICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICAgIHJldHVybiBzZXQuR2V0UmVwZWF0ZWRTdHJpbmcobnVtYmVyLCBpbmRleCk7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIFNldChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICBzZXQtPlNldFJlcGVhdGVkU3RyaW5nKG51bWJlciwgaW5kZXgsIHZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHN0cmluZyogTXV0YWJsZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHNldC0+TXV0YWJsZVJlcGVhdGVkU3RyaW5nKG51bWJlciwgaW5kZXgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzX3BhY2tlZCovLCBjb25zdCBzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5BZGRTdHJpbmcobnVtYmVyLCBmaWVsZF90eXBlLCB2YWx1ZSwgTlVMTCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdHJpbmcqIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHJldHVybiBzZXQtPkFkZFN0cmluZyhudW1iZXIsIGZpZWxkX3R5cGUsIE5VTEwpOworICB9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnVtVHlwZVRyYWl0cworCisvLyBFeHRlbnNpb25TZXQgcmVwcmVzZW50cyBlbnVtcyB1c2luZyBpbnRlZ2VycyBpbnRlcm5hbGx5LCBzbyB3ZSBoYXZlIHRvCisvLyBzdGF0aWNfY2FzdCBhcm91bmQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZSwgYm9vbCBJc1ZhbGlkKGludCk+CitjbGFzcyBFbnVtVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHNldC5HZXRFbnVtKG51bWJlciwgZGVmYXVsdF92YWx1ZSkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIEdPT0dMRV9EQ0hFQ0soSXNWYWxpZCh2YWx1ZSkpOworICAgIHNldC0+U2V0RW51bShudW1iZXIsIGZpZWxkX3R5cGUsIHZhbHVlLCBOVUxMKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIGJvb2wgSXNWYWxpZChpbnQpPgorY2xhc3MgUmVwZWF0ZWRFbnVtVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHNldC5HZXRSZXBlYXRlZEVudW0obnVtYmVyLCBpbmRleCkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICBHT09HTEVfRENIRUNLKElzVmFsaWQodmFsdWUpKTsKKyAgICBzZXQtPlNldFJlcGVhdGVkRW51bShudW1iZXIsIGluZGV4LCB2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIEdPT0dMRV9EQ0hFQ0soSXNWYWxpZCh2YWx1ZSkpOworICAgIHNldC0+QWRkRW51bShudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgdmFsdWUsIE5VTEwpOworICB9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNzYWdlVHlwZVRyYWl0cworCisvLyBFeHRlbnNpb25TZXQgZ3VhcmFudGVlcyB0aGF0IHdoZW4gbWFuaXB1bGF0aW5nIGV4dGVuc2lvbnMgd2l0aCBtZXNzYWdlCisvLyB0eXBlcywgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgd2lsbCBiZSB0aGUgY29tcGlsZWQtaW4gY2xhc3MgcmVwcmVzZW50aW5nCisvLyB0aGF0IHR5cGUuICBTbywgd2UgY2FuIHN0YXRpY19jYXN0IGRvd24gdG8gdGhlIGV4YWN0IHR5cGUgd2UgZXhwZWN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitjbGFzcyBNZXNzYWdlVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIGNvbnN0IFR5cGUmIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBUeXBlKiBNdXRhYmxlVHlwZTsKKworICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUeXBlJj4oCisgICAgICAgIHNldC5HZXRNZXNzYWdlKG51bWJlciwgZGVmYXVsdF92YWx1ZSkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgTXV0YWJsZVR5cGUgTXV0YWJsZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGUqPigKKyAgICAgIHNldC0+TXV0YWJsZU1lc3NhZ2UobnVtYmVyLCBmaWVsZF90eXBlLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCksIE5VTEwpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0QWxsb2NhdGVkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGFibGVUeXBlIG1lc3NhZ2UsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5TZXRBbGxvY2F0ZWRNZXNzYWdlKG51bWJlciwgZmllbGRfdHlwZSwgTlVMTCwgbWVzc2FnZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBSZWxlYXNlKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KHNldC0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICAgIG51bWJlciwgVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorY2xhc3MgUmVwZWF0ZWRNZXNzYWdlVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIGNvbnN0IFR5cGUmIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBUeXBlKiBNdXRhYmxlVHlwZTsKKworICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsIGludCBpbmRleCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUeXBlJj4oc2V0LkdldFJlcGVhdGVkTWVzc2FnZShudW1iZXIsIGluZGV4KSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBNdXRhYmxlKGludCBudW1iZXIsIGludCBpbmRleCwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KHNldC0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShudW1iZXIsIGluZGV4KSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBBZGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGUqPigKKyAgICAgICAgc2V0LT5BZGRNZXNzYWdlKG51bWJlciwgZmllbGRfdHlwZSwgVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBOVUxMKSk7CisgIH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4dGVuc2lvbklkZW50aWZpZXIKKworLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBhY3R1YWwgZXh0ZW5zaW9uIG9iamVjdHMuICBFLmcuIGlmIHlvdSBoYXZlOgorLy8gICBleHRlbmRzIEZvbyB3aXRoIG9wdGlvbmFsIGludDMyIGJhciA9IDEyMzQ7CisvLyB0aGVuICJiYXIiIHdpbGwgYmUgZGVmaW5lZCBpbiBDKysgYXM6CisvLyAgIEV4dGVuc2lvbklkZW50aWZpZXI8Rm9vLCBQcmltaXRpdmVUeXBlVHJhaXRzPGludDMyPiwgMSwgZmFsc2U+IGJhcigxMjM0KTsKKy8vCisvLyBOb3RlIHRoYXQgd2UgY291bGQsIGluIHRoZW9yeSwgc3VwcGx5IHRoZSBmaWVsZCBudW1iZXIgYXMgYSB0ZW1wbGF0ZQorLy8gcGFyYW1ldGVyLCBhbmQgdGh1cyBtYWtlIGFuIGluc3RhbmNlIG9mIEV4dGVuc2lvbklkZW50aWZpZXIgaGF2ZSBubworLy8gYWN0dWFsIGNvbnRlbnRzLiAgSG93ZXZlciwgaWYgd2UgZGlkIHRoYXQsIHRoZW4gdXNpbmcgYXQgZXh0ZW5zaW9uCisvLyBpZGVudGlmaWVyIHdvdWxkIG5vdCBuZWNlc3NhcmlseSBjYXVzZSB0aGUgY29tcGlsZXIgdG8gb3V0cHV0IGFueSBzb3J0CisvLyBvZiByZWZlcmVuY2UgdG8gYW55IHNpbXBsZSBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24ncyAucGIubyBmaWxlLiAgU29tZQorLy8gbGlua2VycyB3aWxsIGFjdHVhbGx5IGRyb3Agb2JqZWN0IGZpbGVzIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IHJlZmVyZW5jZWQsCisvLyBidXQgdGhhdCB3b3VsZCBiZSBiYWQgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSB0aGlzIGV4dGVuc2lvbiB0byBub3QgYmUKKy8vIHJlZ2lzdGVyZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uLCBhbmQgdGhlcmVmb3JlIHVzaW5nIGl0IHdvdWxkIGNyYXNoLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXh0ZW5kZWVUeXBlLCB0eXBlbmFtZSBUeXBlVHJhaXRzVHlwZSwKKyAgICAgICAgICBGaWVsZFR5cGUgZmllbGRfdHlwZSwgYm9vbCBpc19wYWNrZWQ+CitjbGFzcyBFeHRlbnNpb25JZGVudGlmaWVyIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVHlwZVRyYWl0c1R5cGUgVHlwZVRyYWl0czsKKyAgdHlwZWRlZiBFeHRlbmRlZVR5cGUgRXh0ZW5kZWU7CisKKyAgRXh0ZW5zaW9uSWRlbnRpZmllcihpbnQgbnVtYmVyLCB0eXBlbmFtZSBUeXBlVHJhaXRzOjpDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSkKKyAgICAgIDogbnVtYmVyXyhudW1iZXIpLCBkZWZhdWx0X3ZhbHVlXyhkZWZhdWx0X3ZhbHVlKSB7fQorICBpbmxpbmUgaW50IG51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG51bWJlcl87IH0KKyAgdHlwZW5hbWUgVHlwZVRyYWl0czo6Q29uc3RUeXBlIGRlZmF1bHRfdmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBpbnQgbnVtYmVyXzsKKyAgdHlwZW5hbWUgVHlwZVRyYWl0czo6Q29uc3RUeXBlIGRlZmF1bHRfdmFsdWVfOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2VuZXJhdGVkIGFjY2Vzc29ycworCisvLyBUaGlzIG1hY3JvIHNob3VsZCBiZSBleHBhbmRlZCBpbiB0aGUgY29udGV4dCBvZiBhIGdlbmVyYXRlZCB0eXBlIHdoaWNoCisvLyBoYXMgZXh0ZW5zaW9ucy4KKy8vCisvLyBXZSB1c2UgIl9wcm90b19UeXBlVHJhaXRzIiBhcyBhIHR5cGUgbmFtZSBiZWxvdyBiZWNhdXNlICJUeXBlVHJhaXRzIgorLy8gY2F1c2VzIHByb2JsZW1zIGlmIHRoZSBjbGFzcyBoYXMgYSBuZXN0ZWQgbWVzc2FnZSBvciBlbnVtIHR5cGUgd2l0aCB0aGF0CisvLyBuYW1lIGFuZCAiX1R5cGVUcmFpdHMiIGlzIHRlY2huaWNhbGx5IHJlc2VydmVkIGZvciB0aGUgQysrIGxpYnJhcnkgc2luY2UKKy8vIGl0IHN0YXJ0cyB3aXRoIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYSBjYXBpdGFsIGxldHRlci4KKy8vCisvLyBGb3Igc2ltaWxhciByZWFzb24sIHdlIHVzZSAiX2ZpZWxkX3R5cGUiIGFuZCAiX2lzX3BhY2tlZCIgYXMgcGFyYW1ldGVyIG5hbWVzCisvLyBiZWxvdywgc28gdGhhdCAiZmllbGRfdHlwZSIgYW5kICJpc19wYWNrZWQiIGNhbiBiZSB1c2VkIGFzIGZpZWxkIG5hbWVzLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhDTEFTU05BTUUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBIYXMsIFNpemUsIENsZWFyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIGJvb2wgSGFzRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsgICBcCisgICAgcmV0dXJuIF9leHRlbnNpb25zXy5IYXMoaWQubnVtYmVyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBDbGVhckV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeyAgICAgICAgIFwKKyAgICBfZXh0ZW5zaW9uc18uQ2xlYXJFeHRlbnNpb24oaWQubnVtYmVyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBpbnQgRXh0ZW5zaW9uU2l6ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgXAorICAgIHJldHVybiBfZXh0ZW5zaW9uc18uRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBTaW5ndWxhciBhY2Nlc3NvcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsgICBcCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9leHRlbnNpb25zXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuZGVmYXVsdF92YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeyAgICAgICAgIFwKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGUoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9leHRlbnNpb25zXyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OkNvbnN0VHlwZSB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwgJl9leHRlbnNpb25zXyk7ICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHZvaWQgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsICAgICAgICAgICBcCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZVR5cGUgdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgJl9leHRlbnNpb25zXyk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVUeXBlIFJlbGVhc2VFeHRlbnNpb24oICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeyAgICAgICAgIFwKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OlJlbGVhc2UoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9leHRlbnNpb25zXyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogUmVwZWF0ZWQgYWNjZXNzb3JzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAorICAgICAgaW50IGluZGV4KSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0KGlkLm51bWJlcigpLCBfZXh0ZW5zaW9uc18sIGluZGV4KTsgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlVHlwZSBNdXRhYmxlRXh0ZW5zaW9uKCAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsICAgICAgICAgICBcCisgICAgICBpbnQgaW5kZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBpbmRleCwgJl9leHRlbnNpb25zXyk7ICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBTZXRFeHRlbnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwgICAgICAgICAgIFwKKyAgICAgIGludCBpbmRleCwgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OkNvbnN0VHlwZSB2YWx1ZSkgeyAgICAgICAgICAgICAgIFwKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBpbmRleCwgdmFsdWUsICZfZXh0ZW5zaW9uc18pOyAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZVR5cGUgQWRkRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgXAorICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgJl9leHRlbnNpb25zXyk7ICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHZvaWQgQWRkRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsICAgICAgICAgICBcCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6Q29uc3RUeXBlIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OkFkZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgJl9leHRlbnNpb25zXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX1NFVF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzZDcwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjCkBAIC0wLDAgKzEsNzExIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBDb250YWlucyBtZXRob2RzIGRlZmluZWQgaW4gZXh0ZW5zaW9uX3NldC5oIHdoaWNoIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZQorLy8gbGl0ZSBsaWJyYXJ5IGJlY2F1c2UgdGhleSB1c2UgZGVzY3JpcHRvcnMgb3IgcmVmbGVjdGlvbi4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKworLy8gSW1wbGVtZW50YXRpb24gb2YgRXh0ZW5zaW9uRmluZGVyIHdoaWNoIGZpbmRzIGV4dGVuc2lvbnMgaW4gYSBnaXZlbgorLy8gRGVzY3JpcHRvclBvb2wsIHVzaW5nIHRoZSBnaXZlbiBNZXNzYWdlRmFjdG9yeSB0byBjb25zdHJ1Y3Qgc3ViLW9iamVjdHMuCisvLyBUaGlzIGNsYXNzIGlzIGltcGxlbWVudGVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCitjbGFzcyBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlciA6IHB1YmxpYyBFeHRlbnNpb25GaW5kZXIgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvclBvb2xFeHRlbnNpb25GaW5kZXIoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUpCisgICAgICA6IHBvb2xfKHBvb2wpLCBmYWN0b3J5XyhmYWN0b3J5KSwgY29udGFpbmluZ190eXBlXyhjb250YWluaW5nX3R5cGUpIHt9CisgIHZpcnR1YWwgfkRlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyKCkge30KKworICB2aXJ0dWFsIGJvb2wgRmluZChpbnQgbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBvdXRwdXQpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2xfOworICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZV87Cit9OworCit2b2lkIEV4dGVuc2lvblNldDo6QXBwZW5kVG9MaXN0KGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdCB7CisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgYm9vbCBoYXMgPSBmYWxzZTsKKyAgICBpZiAoaXRlci0+c2Vjb25kLmlzX3JlcGVhdGVkKSB7CisgICAgICBoYXMgPSBpdGVyLT5zZWNvbmQuR2V0U2l6ZSgpID4gMDsKKyAgICB9IGVsc2UgeworICAgICAgaGFzID0gIWl0ZXItPnNlY29uZC5pc19jbGVhcmVkOworICAgIH0KKworICAgIGlmIChoYXMpIHsKKyAgICAgIC8vIFRPRE8oa2VudG9uKTogTG9va2luZyB1cCBlYWNoIGZpZWxkIGJ5IG51bWJlciBpcyBzb21ld2hhdCB1bmZvcnR1bmF0ZS4KKyAgICAgIC8vICAgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5PyAgVGhlIHByb2JsZW0gaXMgdGhhdCBkZXNjcmlwdG9ycyBhcmUgbGF6aWx5LQorICAgICAgLy8gICBpbml0aWFsaXplZCwgc28gdGhleSBtaWdodCBub3QgZXZlbiBiZSBjb25zdHJ1Y3RlZCB1bnRpbAorICAgICAgLy8gICBBcHBlbmRUb0xpc3QoKSBpcyBjYWxsZWQuCisKKyAgICAgIGlmIChpdGVyLT5zZWNvbmQuZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKHBvb2wtPkZpbmRFeHRlbnNpb25CeU51bWJlcigKKyAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgaXRlci0+Zmlyc3QpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGl0ZXItPnNlY29uZC5kZXNjcmlwdG9yKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworaW5saW5lIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSByZWFsX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKKyAgR09PR0xFX0RDSEVDSyh0eXBlID4gMCAmJiB0eXBlIDw9IEZpZWxkRGVzY3JpcHRvcjo6TUFYX1RZUEUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpUeXBlPih0eXBlKTsKK30KKworaW5saW5lIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZShGaWVsZFR5cGUgdHlwZSkgeworICByZXR1cm4gRmllbGREZXNjcmlwdG9yOjpUeXBlVG9DcHBUeXBlKAorICAgICAgc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpUeXBlPih0eXBlKSk7Cit9CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGZpZWxkX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKKyAgR09PR0xFX0RDSEVDSyh0eXBlID4gMCAmJiB0eXBlIDw9IFdpcmVGb3JtYXRMaXRlOjpNQVhfRklFTERfVFlQRSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPih0eXBlKTsKK30KKworI2RlZmluZSBHT09HTEVfRENIRUNLX1RZUEUoRVhURU5TSU9OLCBMQUJFTCwgQ1BQVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT09HTEVfRENIRUNLX0VRKChFWFRFTlNJT04pLmlzX3JlcGVhdGVkID8gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgICAgICBcCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkxBQkVMXyMjTEFCRUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZSgoRVhURU5TSU9OKS50eXBlKSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRSkKKworY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0TWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpIHx8IGl0ZXItPnNlY29uZC5pc19jbGVhcmVkKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcmV0dXJuICpmYWN0b3J5LT5HZXRQcm90b3R5cGUobWVzc2FnZV90eXBlKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBPUFRJT05BTCwgTUVTU0FHRSk7CisgICAgaWYgKGl0ZXItPnNlY29uZC5pc19sYXp5KSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlLT5HZXRNZXNzYWdlKAorICAgICAgICAgICpmYWN0b3J5LT5HZXRQcm90b3R5cGUobWVzc2FnZV90eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7CisgICAgfQorICB9Cit9CisKK01lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24oZGVzY3JpcHRvci0+bnVtYmVyKCksIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gZGVzY3JpcHRvci0+dHlwZSgpOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IGZhbHNlOworICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUgPQorICAgICAgICBmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgIGV4dGVuc2lvbi0+aXNfbGF6eSA9IGZhbHNlOworICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IHByb3RvdHlwZS0+TmV3KCk7CisgICAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAqZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CisgICAgfQorICB9Cit9CisKK01lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OlJlbGVhc2VNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIHsKKyAgICAvLyBOb3QgcHJlc2VudC4gIFJldHVybiBOVUxMLgorICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBNRVNTQUdFKTsKKyAgICBNZXNzYWdlTGl0ZSogcmV0ID0gTlVMTDsKKyAgICBpZiAoaXRlci0+c2Vjb25kLmlzX2xhenkpIHsKKyAgICAgIHJldCA9IGl0ZXItPnNlY29uZC5sYXp5bWVzc2FnZV92YWx1ZS0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICAgICpmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpKTsKKyAgICAgIGRlbGV0ZSBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IGl0ZXItPnNlY29uZC5tZXNzYWdlX3ZhbHVlOworICAgIH0KKyAgICBleHRlbnNpb25zXy5lcmFzZShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpBZGRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihkZXNjcmlwdG9yLT5udW1iZXIoKSwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKKyAgICBleHRlbnNpb24tPnR5cGUgPSBkZXNjcmlwdG9yLT50eXBlKCk7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7CisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlID0KKyAgICAgIG5ldyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPigpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRCwgTUVTU0FHRSk7CisgIH0KKworICAvLyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+IGRvZXMgbm90IGtub3cgaG93IHRvIEFkZCgpIHNpbmNlIGl0IGNhbm5vdAorICAvLyBhbGxvY2F0ZSBhbiBhYnN0cmFjdCBvYmplY3QsIHNvIHdlIGhhdmUgdG8gYmUgdHJpY2t5LgorICBNZXNzYWdlTGl0ZSogcmVzdWx0ID0gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlCisgICAgICAtPkFkZEZyb21DbGVhcmVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4gPigpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlOworICAgIGlmIChleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPnNpemUoKSA9PSAwKSB7CisgICAgICBwcm90b3R5cGUgPSBmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgICAgR09PR0xFX0NIRUNLKHByb3RvdHlwZSAhPSBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG90eXBlID0gJmV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+R2V0KDApOworICAgIH0KKyAgICByZXN1bHQgPSBwcm90b3R5cGUtPk5ldygpOworICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+QWRkQWxsb2NhdGVkKHJlc3VsdCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGJvb2wgVmFsaWRhdGVFbnVtVXNpbmdEZXNjcmlwdG9yKGNvbnN0IHZvaWQqIGFyZywgaW50IG51bWJlcikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnVtRGVzY3JpcHRvcio+KGFyZykKKyAgICAgIC0+RmluZFZhbHVlQnlOdW1iZXIobnVtYmVyKSAhPSBOVUxMOworfQorCitib29sIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyOjpGaW5kKGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8qIG91dHB1dCkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbiA9CisgICAgICBwb29sXy0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGNvbnRhaW5pbmdfdHlwZV8sIG51bWJlcik7CisgIGlmIChleHRlbnNpb24gPT0gTlVMTCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXQtPnR5cGUgPSBleHRlbnNpb24tPnR5cGUoKTsKKyAgICBvdXRwdXQtPmlzX3JlcGVhdGVkID0gZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCgpOworICAgIG91dHB1dC0+aXNfcGFja2VkID0gZXh0ZW5zaW9uLT5vcHRpb25zKCkucGFja2VkKCk7CisgICAgb3V0cHV0LT5kZXNjcmlwdG9yID0gZXh0ZW5zaW9uOworICAgIGlmIChleHRlbnNpb24tPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIG91dHB1dC0+bWVzc2FnZV9wcm90b3R5cGUgPQorICAgICAgICAgIGZhY3RvcnlfLT5HZXRQcm90b3R5cGUoZXh0ZW5zaW9uLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgICBHT09HTEVfQ0hFQ0sob3V0cHV0LT5tZXNzYWdlX3Byb3RvdHlwZSAhPSBOVUxMKQorICAgICAgICAgIDw8ICJFeHRlbnNpb24gZmFjdG9yeSdzIEdldFByb3RvdHlwZSgpIHJldHVybmVkIE5VTEwgZm9yIGV4dGVuc2lvbjogIgorICAgICAgICAgIDw8IGV4dGVuc2lvbi0+ZnVsbF9uYW1lKCk7CisgICAgfSBlbHNlIGlmIChleHRlbnNpb24tPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pIHsKKyAgICAgIG91dHB1dC0+ZW51bV92YWxpZGl0eV9jaGVjay5mdW5jID0gVmFsaWRhdGVFbnVtVXNpbmdEZXNjcmlwdG9yOworICAgICAgb3V0cHV0LT5lbnVtX3ZhbGlkaXR5X2NoZWNrLmFyZyA9IGV4dGVuc2lvbi0+ZW51bV90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBVbmtub3duRmllbGRTZXRGaWVsZFNraXBwZXIgc2tpcHBlcih1bmtub3duX2ZpZWxkcyk7CisgIGlmIChpbnB1dC0+R2V0RXh0ZW5zaW9uUG9vbCgpID09IE5VTEwpIHsKKyAgICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7CisgICAgcmV0dXJuIFBhcnNlRmllbGQodGFnLCBpbnB1dCwgJmZpbmRlciwgJnNraXBwZXIpOworICB9IGVsc2UgeworICAgIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihpbnB1dC0+R2V0RXh0ZW5zaW9uUG9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPkdldERlc2NyaXB0b3IoKSk7CisgICAgcmV0dXJuIFBhcnNlRmllbGQodGFnLCBpbnB1dCwgJmZpbmRlciwgJnNraXBwZXIpOworICB9Cit9CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOworICBpZiAoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSA9PSBOVUxMKSB7CisgICAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VTZXQoaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKKyAgfSBlbHNlIHsKKyAgICBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlciBmaW5kZXIoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPkdldEV4dGVuc2lvbkZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlLT5HZXREZXNjcmlwdG9yKCkpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VTZXQoaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKKyAgfQorfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9CisgICAgICBleHRlbnNpb25zXy5zaXplKCkgKiBzaXplb2YobWFwPGludCwgRXh0ZW5zaW9uPjo6dmFsdWVfdHlwZSk7CisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCksCisgICAgICAgZW5kID0gZXh0ZW5zaW9uc18uZW5kKCk7CisgICAgICAgaXRlciAhPSBlbmQ7CisgICAgICAgKytpdGVyKSB7CisgICAgdG90YWxfc2l6ZSArPSBpdGVyLT5zZWNvbmQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOworICB9CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCitpbmxpbmUgaW50IEV4dGVuc2lvblNldDo6UmVwZWF0ZWRNZXNzYWdlX1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoCisgICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIGZpZWxkKSB7CisgIHJldHVybiBmaWVsZC0+U3BhY2VVc2VkRXhjbHVkaW5nU2VsZjxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgaWYgKGlzX3JlcGVhdGVkKSB7CisgICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpyZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlKSArICAgICAgXAorICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpO1wKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoICBJTlQzMiwgICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggIElOVDY0LCAgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCBVSU5UMzIsICB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoIFVJTlQ2NCwgIHVpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggIEZMT0FULCAgIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCBET1VCTEUsICBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoICAgQk9PTCwgICAgYm9vbCk7CisgICAgICBIQU5ETEVfVFlQRSggICBFTlVNLCAgICBlbnVtKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBTVFJJTkcsICBzdHJpbmcpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIC8vIHJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgaXMgYWN0dWFsbHkgYSBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiwKKyAgICAgICAgLy8gYnV0IE1lc3NhZ2VMaXRlIGhhcyBubyBTcGFjZVVzZWQoKSwgc28gd2UgbXVzdCBkaXJlY3RseSBjYWxsCisgICAgICAgIC8vIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgd2l0aCBhIGRpZmZlcmVudCB0eXBlCisgICAgICAgIC8vIGhhbmRsZXIuCisgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpyZXBlYXRlZF9tZXNzYWdlX3ZhbHVlKSArCisgICAgICAgICAgICBSZXBlYXRlZE1lc3NhZ2VfU3BhY2VVc2VkRXhjbHVkaW5nU2VsZihyZXBlYXRlZF9tZXNzYWdlX3ZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKnN0cmluZ192YWx1ZSkgKworICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKnN0cmluZ192YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgKGlzX2xhenkpIHsKKyAgICAgICAgICB0b3RhbF9zaXplICs9IGxhenltZXNzYWdlX3ZhbHVlLT5TcGFjZVVzZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0b3RhbF9zaXplICs9IGRvd25fY2FzdDxNZXNzYWdlKj4obWVzc2FnZV92YWx1ZSktPlNwYWNlVXNlZCgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gTm8gZXh0cmEgc3RvcmFnZSBjb3N0cyBmb3IgcHJpbWl0aXZlIHR5cGVzLgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKKy8vIFRoZSBTZXJpYWxpemUqVG9BcnJheSBtZXRob2RzIGFyZSBvbmx5IG5lZWRlZCBpbiB0aGUgaGVhdnkgbGlicmFyeSwgYXMKKy8vIHRoZSBsaXRlIGxpYnJhcnkgb25seSBnZW5lcmF0ZXMgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzLgordWludDgqIEV4dGVuc2lvblNldDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICBpbnQgc3RhcnRfZmllbGRfbnVtYmVyLCBpbnQgZW5kX2ZpZWxkX251bWJlciwKKyAgICB1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGV4dGVuc2lvbnNfLmxvd2VyX2JvdW5kKHN0YXJ0X2ZpZWxkX251bWJlcik7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSAmJiBpdGVyLT5maXJzdCA8IGVuZF9maWVsZF9udW1iZXI7CisgICAgICAgKytpdGVyKSB7CisgICAgdGFyZ2V0ID0gaXRlci0+c2Vjb25kLlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzVG9BcnJheShpdGVyLT5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKwordWludDgqIEV4dGVuc2lvblNldDo6U2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgdWludDgqIHRhcmdldCkgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOyBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICB0YXJnZXQgPSBpdGVyLT5zZWNvbmQuU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgICBpdGVyLT5maXJzdCwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCit1aW50OCogRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICBpbnQgbnVtYmVyLCB1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIGlmIChpc19wYWNrZWQpIHsKKyAgICAgIGlmIChjYWNoZWRfc2l6ZSA9PSAwKSByZXR1cm4gdGFyZ2V0OworCisgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KG51bWJlciwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWdUb0FycmF5KGNhY2hlZF9zaXplLCB0YXJnZXQpOworCisgICAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7IGkrKykgeyAgXAorICAgICAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UjI05vVGFnVG9BcnJheSggICAgICAgIFwKKyAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpLCB0YXJnZXQpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UNjQsICAgIEludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UMzIsICAgU0ludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCAgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsICBGaXhlZDY0LCAgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICAgIEZsb2F0LCAgIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlLCAgZG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgICBib29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICBlbnVtKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6CisgICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7ICBcCisgICAgICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI0NBTUVMQ0FTRSMjVG9BcnJheShudW1iZXIsICAgICAgXAorICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSksIHRhcmdldCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWsKKworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgICBVSW50MzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgICBTSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgZmxvYXQpOworICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsICBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgIGJvb2wpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRSggICBCWVRFUywgICAgQnl0ZXMsICBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgIGVudW0pOworICAgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsIG1lc3NhZ2UpOworICAgICAgICBIQU5ETEVfVFlQRSggTUVTU0FHRSwgIE1lc3NhZ2UsIG1lc3NhZ2UpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKCFpc19jbGVhcmVkKSB7CisgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIFZBTFVFKSAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ0FNRUxDQVNFIyNUb0FycmF5KCAgICAgIFwKKyAgICAgICAgICAgIG51bWJlciwgVkFMVUUsIHRhcmdldCk7IFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgICBpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgIGludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgICB1aW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgIHVpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgIGludDMyX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICAgaW50NjRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCAgIHVpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICAgdWludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgICAgaW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgICBpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgIGZsb2F0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgICBkb3VibGVfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgICAgYm9vbF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICAqc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgICpzdHJpbmdfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICAgZW51bV92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsICptZXNzYWdlX3ZhbHVlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgKGlzX2xhenkpIHsKKyAgICAgICAgICB0YXJnZXQgPSBsYXp5bWVzc2FnZV92YWx1ZS0+V3JpdGVNZXNzYWdlVG9BcnJheShudW1iZXIsIHRhcmdldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZVRvQXJyYXkoCisgICAgICAgICAgICAgIG51bWJlciwgKm1lc3NhZ2VfdmFsdWUsIHRhcmdldCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3VpbnQ4KiBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6U2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIGludCBudW1iZXIsCisgICAgdWludDgqIHRhcmdldCkgY29uc3QgeworICBpZiAodHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFIHx8IGlzX3JlcGVhdGVkKSB7CisgICAgLy8gTm90IGEgdmFsaWQgTWVzc2FnZVNldCBleHRlbnNpb24sIGJ1dCBzZXJpYWxpemUgaXQgdGhlIG5vcm1hbCB3YXkuCisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiSW52YWxpZCBtZXNzYWdlIHNldCBleHRlbnNpb24uIjsKKyAgICByZXR1cm4gU2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KG51bWJlciwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChpc19jbGVhcmVkKSByZXR1cm4gdGFyZ2V0OworCisgIC8vIFN0YXJ0IGdyb3VwLgorICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKKyAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwgbnVtYmVyLCB0YXJnZXQpOworICAvLyBXcml0ZSBtZXNzYWdlLgorICBpZiAoaXNfbGF6eSkgeworICAgIHRhcmdldCA9IGxhenltZXNzYWdlX3ZhbHVlLT5Xcml0ZU1lc3NhZ2VUb0FycmF5KAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLCB0YXJnZXQpOworICB9IGVsc2UgeworICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VUb0FycmF5KAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLCAqbWVzc2FnZV92YWx1ZSwgdGFyZ2V0KTsKKyAgfQorICAvLyBFbmQgZ3JvdXAuCisgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZywgdGFyZ2V0KTsKKyAgcmV0dXJuIHRhcmdldDsKK30KKworCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZE1heWJlTGF6aWx5KAorICAgIHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgRmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7CisgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpOworfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnOgorICAgICAgICBpZiAoIVBhcnNlTWVzc2FnZVNldEl0ZW0oaW5wdXQsIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCFQYXJzZUZpZWxkKHRhZywgaW5wdXQsIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSkgeworICBGaWVsZFNraXBwZXIgc2tpcHBlcjsKKyAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOworICByZXR1cm4gUGFyc2VNZXNzYWdlU2V0KGlucHV0LCAmZmluZGVyLCAmc2tpcHBlcik7Cit9CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXRJdGVtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcikgeworICAvLyBUT0RPKGtlbnRvbik6ICBJdCB3b3VsZCBiZSBuaWNlIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiB0aGlzIGFuZAorICAvLyBXaXJlRm9ybWF0TGl0ZTo6UGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRJdGVtKCksIGJ1dCBJIHRoaW5rIHRoZQorICAvLyBkaWZmZXJlbmNlcyB3b3VsZCBiZSBoYXJkIHRvIGZhY3RvciBvdXQuCisKKyAgLy8gVGhpcyBtZXRob2QgcGFyc2VzIGEgZ3JvdXAgd2hpY2ggc2hvdWxkIGNvbnRhaW4gdHdvIGZpZWxkczoKKyAgLy8gICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgLy8gICByZXF1aXJlZCBkYXRhIG1lc3NhZ2UgPSAzOworCisgIC8vIE9uY2Ugd2Ugc2VlIGEgdHlwZV9pZCwgd2UnbGwgY29uc3RydWN0IGEgZmFrZSB0YWcgZm9yIHRoaXMgZXh0ZW5zaW9uCisgIC8vIHdoaWNoIGlzIHRoZSB0YWcgaXQgd291bGQgaGF2ZSBoYWQgdW5kZXIgdGhlIHByb3RvMiBleHRlbnNpb25zIHdpcmUKKyAgLy8gZm9ybWF0LgorICB1aW50MzIgZmFrZV90YWcgPSAwOworCisgIC8vIElmIHdlIHNlZSBtZXNzYWdlIGRhdGEgYmVmb3JlIHRoZSB0eXBlX2lkLCB3ZSdsbCBhcHBlbmQgaXQgdG8gdGhpcyBzbworICAvLyB3ZSBjYW4gcGFyc2UgaXQgbGF0ZXIuCisgIHN0cmluZyBtZXNzYWdlX2RhdGE7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKKyAgICBpZiAodGFnID09IDApIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZzogeworICAgICAgICB1aW50MzIgdHlwZV9pZDsKKyAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0eXBlX2lkKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBmYWtlX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKHR5cGVfaWQsCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisKKyAgICAgICAgaWYgKCFtZXNzYWdlX2RhdGEuZW1wdHkoKSkgeworICAgICAgICAgIC8vIFdlIHNhdyBzb21lIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQuICBIYXZlIHRvIHBhcnNlIGl0CisgICAgICAgICAgLy8gbm93LgorICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIHN1Yl9pbnB1dCgKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KG1lc3NhZ2VfZGF0YS5kYXRhKCkpLAorICAgICAgICAgICAgICBtZXNzYWdlX2RhdGEuc2l6ZSgpKTsKKyAgICAgICAgICBpZiAoIVBhcnNlRmllbGRNYXliZUxhemlseShmYWtlX3RhZywgJnN1Yl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fZmluZGVyLCBmaWVsZF9za2lwcGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICBtZXNzYWdlX2RhdGEuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VUYWc6IHsKKyAgICAgICAgaWYgKGZha2VfdGFnID09IDApIHsKKyAgICAgICAgICAvLyBXZSBoYXZlbid0IHNlZW4gYSB0eXBlX2lkIHlldC4gIEFwcGVuZCB0aGlzIGRhdGEgdG8gbWVzc2FnZV9kYXRhLgorICAgICAgICAgIHN0cmluZyB0ZW1wOworICAgICAgICAgIHVpbnQzMiBsZW5ndGg7CisgICAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFN0cmluZygmdGVtcCwgbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmbWVzc2FnZV9kYXRhKTsKKyAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgICAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMihsZW5ndGgpOworICAgICAgICAgIGNvZGVkX291dHB1dC5Xcml0ZVN0cmluZyh0ZW1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBBbHJlYWR5IHNhdyB0eXBlX2lkLCBzbyB3ZSBjYW4gcGFyc2UgdGhpcyBkaXJlY3RseS4KKyAgICAgICAgICBpZiAoIVBhcnNlRmllbGRNYXliZUxhemlseShmYWtlX3RhZywgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnOiB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmICghZmllbGRfc2tpcHBlci0+U2tpcEZpZWxkKGlucHV0LCB0YWcpKSByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzKAorICAgIGludCBudW1iZXIsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgaWYgKHR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSB8fCBpc19yZXBlYXRlZCkgeworICAgIC8vIE5vdCBhIHZhbGlkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLCBidXQgc2VyaWFsaXplIGl0IHRoZSBub3JtYWwgd2F5LgorICAgIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKG51bWJlciwgb3V0cHV0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaXNfY2xlYXJlZCkgcmV0dXJuOworCisgIC8vIFN0YXJ0IGdyb3VwLgorICBvdXRwdXQtPldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZyk7CisKKyAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIC8vIFdyaXRlIG1lc3NhZ2UuCisgIGlmIChpc19sYXp5KSB7CisgICAgbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZSgKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwgb3V0cHV0KTsKKyAgfSBlbHNlIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLAorICAgICAgICAqbWVzc2FnZV92YWx1ZSwKKyAgICAgICAgb3V0cHV0KTsKKyAgfQorCisgIC8vIEVuZCBncm91cC4KKyAgb3V0cHV0LT5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKK30KKworaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGludCBudW1iZXIpIGNvbnN0IHsKKyAgaWYgKHR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSB8fCBpc19yZXBlYXRlZCkgeworICAgIC8vIE5vdCBhIHZhbGlkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLCBidXQgY29tcHV0ZSB0aGUgYnl0ZSBzaXplIGZvciBpdCB0aGUKKyAgICAvLyBub3JtYWwgd2F5LgorICAgIHJldHVybiBCeXRlU2l6ZShudW1iZXIpOworICB9CisKKyAgaWYgKGlzX2NsZWFyZWQpIHJldHVybiAwOworCisgIGludCBvdXJfc2l6ZSA9IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZTsKKworICAvLyB0eXBlX2lkCisgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKG51bWJlcik7CisKKyAgLy8gbWVzc2FnZQorICBpbnQgbWVzc2FnZV9zaXplID0gMDsKKyAgaWYgKGlzX2xhenkpIHsKKyAgICBtZXNzYWdlX3NpemUgPSBsYXp5bWVzc2FnZV92YWx1ZS0+Qnl0ZVNpemUoKTsKKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlX3NpemUgPSBtZXNzYWdlX3ZhbHVlLT5CeXRlU2l6ZSgpOworICB9CisKKyAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobWVzc2FnZV9zaXplKTsKKyAgb3VyX3NpemUgKz0gbWVzc2FnZV9zaXplOworCisgIHJldHVybiBvdXJfc2l6ZTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXMoCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgaXRlci0+c2Vjb25kLlNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzKGl0ZXItPmZpcnN0LCBvdXRwdXQpOworICB9Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6Ok1lc3NhZ2VTZXRCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgdG90YWxfc2l6ZSArPSBpdGVyLT5zZWNvbmQuTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZShpdGVyLT5maXJzdCk7CisgIH0KKworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5ZGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNzI2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKKy8vIFRoaXMgdGVzdCBjbG9zZWx5IG1pcnJvcnMgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYworLy8gZXhjZXB0IHRoYXQgaXQgdXNlcyBleHRlbnNpb25zIHJhdGhlciB0aGFuIHJlZ3VsYXIgZmllbGRzLgorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIERlZmF1bHRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisKKyAgLy8gTWVzc2FnZXMgc2hvdWxkIHJldHVybiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyB1bnRpbCBmaXJzdCB1c2UuCisgIC8vIChUaGlzIGlzIG5vdCBjaGVja2VkIGJ5IEV4cGVjdENsZWFyKCkgc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHRydWUgYWZ0ZXIKKyAgLy8gdGhlIGZpZWxkcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGVuIGNsZWFyZWQuKQorICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpPcHRpb25hbEdyb3VwX2V4dGVuc2lvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEFjY2Vzc29ycykgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBnbyBiYWNrIGFuZCBjaGVjayBhbGwgdGhvc2UKKyAgLy8gdmFsdWVzLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQ2xlYXIpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlLCBjbGVhciB0aGUgbWVzc2FnZSwgdGhlbiBjaGVjayB0aGF0CisgIC8vIGl0IGlzIGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworCisgIC8vIFVubGlrZSB3aXRoIHRoZSBkZWZhdWx0cyB0ZXN0LCB3ZSBkbyBOT1QgZXhwZWN0IHRoYXQgcmVxdWVzdGluZyBlbWJlZGRlZAorICAvLyBtZXNzYWdlcyB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2UuICBJbnN0ZWFkLCB0aGV5CisgIC8vIHNob3VsZCByZXR1cm4gdGhlIG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgd2hlbiBtdXRhYmxlX2JsYWgoKSB3YXMKKyAgLy8gY2FsbGVkLgorICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpPcHRpb25hbEdyb3VwX2V4dGVuc2lvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikpOworICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworCisgIC8vIE1ha2Ugc3VyZSBzZXR0aW5nIHN0dWZmIGFnYWluIGFmdGVyIGNsZWFyaW5nIHdvcmtzLiAgKFRoaXMgdGFrZXMgc2xpZ2h0bHkKKyAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aHMgc2luY2UgdGhlIG9iamVjdHMgYXJlIHJldXNlZC4pCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQ2xlYXJPbmVGaWVsZCkgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUsIHRoZW4gY2xlYXIgb25lIHZhbHVlIGFuZCBpbnN1cmUgdGhhdAorICAvLyBvbmx5IHRoYXQgb25lIHZhbHVlIGlzIGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgaW50NjQgb3JpZ2luYWxfdmFsdWUgPQorICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24pOworCisgIC8vIENsZWFyIHRoZSBmaWVsZCBhbmQgbWFrZSBzdXJlIGl0IHNob3dzIHVwIGFzIGNsZWFyZWQuCisgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gT3RoZXIgYWRqYWNlbnQgZmllbGRzIHNob3VsZCBub3QgYmUgY2xlYXJlZC4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbikpOworCisgIC8vIE1ha2Ugc3VyZSBpZiB3ZSBzZXQgaXQgYWdhaW4sIHRoZW4gYWxsIGZpZWxkcyBhcmUgc2V0LgorICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uLCBvcmlnaW5hbF92YWx1ZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFNldEFsbG9jYXRlZEV4dGVuc2luKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICAvLyBBZGQgYSBleHRlbnNpb24gdXNpbmcgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uCisgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogZm9yZWlnbl9tZXNzYWdlID0gbmV3IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSgpOworICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbl9tZXNzYWdlKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoZm9yZWlnbl9tZXNzYWdlLAorICAgICAgICAgICAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKworICAvLyBTZXRBbGxvY2F0ZWRFeHRlbnNpb24gc2hvdWxkIGRlbGV0ZSB0aGUgcHJldmlvdXNseSBleGlzdGluZyBleHRlbnNpb24uCisgIC8vIChXZSByZXBseSBvbiB1bml0dGVzdCB0byBjaGVjayBtZW1vcnkgbGVha3MgZm9yIHRoaXMgY2FzZSkKKyAgbWVzc2FnZS5TZXRBbGxvY2F0ZWRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKCkpOworCisgIC8vIFNldEFsbG9jYXRlZEV4dGVuc2lvbiB3aXRoIGEgTlVMTCBwYXJhbWV0ZXIgaXMgZXF1aXZhbGVudCB0byBDbGVhckV4dGVuaW9uLgorICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFJlbGVhc2VFeHRlbnNpb24pIHsKKyAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2U7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikpOworICAvLyBBZGQgYSBleHRlbnNpb24gdXNpbmcgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIGV4dGVuc2lvbiA9CisgICAgICBuZXcgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpOworICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiwKKyAgICAgIGV4dGVuc2lvbik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKSk7CisgIC8vIFJlbGVhc2UgdGhlIGV4dGVuc2lvbiB1c2luZyBSZWxlYXNlRXh0ZW5zaW9uCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIHJlbGVhc2VkX2V4dGVuc2lvbiA9CisgICAgICBtZXNzYWdlLlJlbGVhc2VFeHRlbnNpb24oCisgICAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgIEVYUEVDVF9FUShleHRlbnNpb24sIHJlbGVhc2VkX2V4dGVuc2lvbik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikpOworICAvLyBSZWxlYXNlRXh0ZW5zaW9uIHdpbGwgcmV0dXJuIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBldmVuIGFmdGVyCisgIC8vIENsZWFyRXh0ZW5zaW9uIGlzIGNhbGxlZC4KKyAgbWVzc2FnZS5TZXRBbGxvY2F0ZWRFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24sCisgICAgICBleHRlbnNpb24pOworICBtZXNzYWdlLkNsZWFyRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKKyAgcmVsZWFzZWRfZXh0ZW5zaW9uID0gbWVzc2FnZS5SZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZF9leHRlbnNpb24gIT0gTlVMTCk7CisgIGRlbGV0ZSByZWxlYXNlZF9leHRlbnNpb247Cit9CisKKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBDb3B5RnJvbSkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7ICAvLyBleGVyY2lzZSBjb3B5IHdoZW4gZmllbGRzIGFscmVhZHkgZXhpc3QKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvU2V0VGVzdCwgQ29weUZyb21QYWNrZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTEpOyAgLy8gZXhlcmNpc2UgY29weSB3aGVuIGZpZWxkcyBhbHJlYWR5IGV4aXN0CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBDb3B5RnJvbVVwY2FzdGVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIGNvbnN0IE1lc3NhZ2UmIHVwY2FzdGVkX21lc3NhZ2UgPSBtZXNzYWdlMTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbSh1cGNhc3RlZF9tZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICAvLyBleGVyY2lzZSBjb3B5IHdoZW4gZmllbGRzIGFscmVhZHkgZXhpc3QKKyAgbWVzc2FnZTIuQ29weUZyb20odXBjYXN0ZWRfbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwV2l0aEVtcHR5KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UyKTsKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTEpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBXaXRoU2VsZikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworICBtZXNzYWdlLlN3YXAoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTZXJpYWxpemF0aW9uVG9BcnJheSkgeworICAvLyBTZXJpYWxpemUgYXMgVGVzdEFsbEV4dGVuc2lvbnMgYW5kIHBhcnNlIGFzIFRlc3RBbGxUeXBlcyB0byBpbnN1cmUgd2lyZQorICAvLyBjb21wYXRpYmlsaXR5IG9mIGV4dGVuc2lvbnMuCisgIC8vCisgIC8vIFRoaXMgY2hlY2tzIHNlcmlhbGl6YXRpb24gdG8gYSBmbGF0IGFycmF5IGJ5IGV4cGxpY2l0bHkgcmVzZXJ2aW5nIHNwYWNlIGluCisgIC8vIHRoZSBzdHJpbmcgYW5kIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCBtZXNzYWdlJ3MKKyAgLy8gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheS4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBkZXN0aW5hdGlvbjsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJnNvdXJjZSk7CisgIGludCBzaXplID0gc291cmNlLkJ5dGVTaXplKCk7CisgIHN0cmluZyBkYXRhOworICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgdWludDgqIHRhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKKyAgdWludDgqIGVuZCA9IHNvdXJjZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7CisgIEVYUEVDVF9FUShzaXplLCBlbmQgLSB0YXJnZXQpOworICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTZXJpYWxpemF0aW9uVG9TdHJlYW0pIHsKKyAgLy8gU2VyaWFsaXplIGFzIFRlc3RBbGxFeHRlbnNpb25zIGFuZCBwYXJzZSBhcyBUZXN0QWxsVHlwZXMgdG8gaW5zdXJlIHdpcmUKKyAgLy8gY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLgorICAvLworICAvLyBUaGlzIGNoZWNrcyBzZXJpYWxpemF0aW9uIHRvIGFuIG91dHB1dCBzdHJlYW0gYnkgY3JlYXRpbmcgYW4gYXJyYXkgb3V0cHV0CisgIC8vIHN0cmVhbSB0aGF0IGNhbiBvbmx5IGJ1ZmZlciAxIGJ5dGUgYXQgYSB0aW1lIC0gdGhpcyBwcmV2ZW50cyB0aGUgbWVzc2FnZQorICAvLyBmcm9tIGV2ZXIganVtcGluZyB0byB0aGUgZmFzdCBwYXRoLCBlbnN1cmluZyB0aGF0IHNlcmlhbGl6YXRpb24gaGFwcGVucyB2aWEKKyAgLy8gdGhlIENvZGVkT3V0cHV0U3RyZWFtLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgc291cmNlOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGRlc3RpbmF0aW9uOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgaW50IHNpemUgPSBzb3VyY2UuQnl0ZVNpemUoKTsKKyAgc3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB7CisgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBzb3VyY2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBQYWNrZWRTZXJpYWxpemF0aW9uVG9BcnJheSkgeworICAvLyBTZXJpYWxpemUgYXMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgYW5kIHBhcnNlIGFzIFRlc3RQYWNrZWRUeXBlcyB0byBpbnN1cmUKKyAgLy8gd2lyZSBjb21wYXRpYmlsaXR5IG9mIGV4dGVuc2lvbnMuCisgIC8vCisgIC8vIFRoaXMgY2hlY2tzIHNlcmlhbGl6YXRpb24gdG8gYSBmbGF0IGFycmF5IGJ5IGV4cGxpY2l0bHkgcmVzZXJ2aW5nIHNwYWNlIGluCisgIC8vIHRoZSBzdHJpbmcgYW5kIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCBtZXNzYWdlJ3MKKyAgLy8gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheS4KKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBkZXN0aW5hdGlvbjsKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJnNvdXJjZSk7CisgIGludCBzaXplID0gc291cmNlLkJ5dGVTaXplKCk7CisgIHN0cmluZyBkYXRhOworICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgdWludDgqIHRhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKKyAgdWludDgqIGVuZCA9IHNvdXJjZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7CisgIEVYUEVDVF9FUShzaXplLCBlbmQgLSB0YXJnZXQpOworICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBQYWNrZWRTZXJpYWxpemF0aW9uVG9TdHJlYW0pIHsKKyAgLy8gU2VyaWFsaXplIGFzIFRlc3RQYWNrZWRFeHRlbnNpb25zIGFuZCBwYXJzZSBhcyBUZXN0UGFja2VkVHlwZXMgdG8gaW5zdXJlCisgIC8vIHdpcmUgY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLgorICAvLworICAvLyBUaGlzIGNoZWNrcyBzZXJpYWxpemF0aW9uIHRvIGFuIG91dHB1dCBzdHJlYW0gYnkgY3JlYXRpbmcgYW4gYXJyYXkgb3V0cHV0CisgIC8vIHN0cmVhbSB0aGF0IGNhbiBvbmx5IGJ1ZmZlciAxIGJ5dGUgYXQgYSB0aW1lIC0gdGhpcyBwcmV2ZW50cyB0aGUgbWVzc2FnZQorICAvLyBmcm9tIGV2ZXIganVtcGluZyB0byB0aGUgZmFzdCBwYXRoLCBlbnN1cmluZyB0aGF0IHNlcmlhbGl6YXRpb24gaGFwcGVucyB2aWEKKyAgLy8gdGhlIENvZGVkT3V0cHV0U3RyZWFtLgorICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMgc291cmNlOworICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIGRlc3RpbmF0aW9uOworICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgaW50IHNpemUgPSBzb3VyY2UuQnl0ZVNpemUoKTsKKyAgc3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB7CisgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBzb3VyY2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBQYXJzaW5nKSB7CisgIC8vIFNlcmlhbGl6ZSBhcyBUZXN0QWxsVHlwZXMgYW5kIHBhcnNlIGFzIFRlc3RBbGxFeHRlbnNpb25zLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIGRlc3RpbmF0aW9uOworICBzdHJpbmcgZGF0YTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChkZXN0aW5hdGlvbik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUGFja2VkUGFyc2luZykgeworICAvLyBTZXJpYWxpemUgYXMgVGVzdFBhY2tlZFR5cGVzIGFuZCBwYXJzZSBhcyBUZXN0UGFja2VkRXh0ZW5zaW9ucy4KKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBzb3VyY2U7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBkZXN0aW5hdGlvbjsKKyAgc3RyaW5nIGRhdGE7CisKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmc291cmNlKTsKKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoZGVzdGluYXRpb24pOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIElzSW5pdGlhbGl6ZWQpIHsKKyAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBpbiBuZXN0ZWQKKyAgLy8gZXh0ZW5zaW9ucyBhcmUgbWlzc2luZy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYSgxKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9iKDIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2EoMSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9iKDIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIE11dGFibGVTdHJpbmcpIHsKKyAgLy8gVGVzdCB0aGUgbXV0YWJsZSBzdHJpbmcgYWNjZXNzb3JzLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pLT5hc3NpZ24oImZvbyIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoImZvbyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pLT5hc3NpZ24oImJhciIpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCAwKSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZikgeworICAvLyBTY2FsYXIgcHJpbWl0aXZlIGV4dGVuc2lvbnMgc2hvdWxkIGluY3JlYXNlIHRoZSBleHRlbnNpb24gc2V0IHNpemUgYnkgYQorICAvLyBtaW5pbXVtIG9mIHRoZSBzaXplIG9mIHRoZSBwcmltaXRpdmUgdHlwZS4KKyNkZWZpbmUgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHR5cGUsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfIyN0eXBlIyNfZXh0ZW5zaW9uLCB2YWx1ZSk7ICAgICAgIFwKKyAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBiYXNlX3NpemUgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZW9mKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF8jI3R5cGUjI19leHRlbnNpb24pKTsgIFwKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoaW50MzIgICAsIDEwMSk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQ2NCAgICwgMTAyKTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHVpbnQzMiAgLCAxMDMpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQodWludDY0ICAsIDEwNCk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzaW50MzIgICwgMTA1KTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNpbnQ2NCAgLCAxMDYpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZml4ZWQzMiAsIDEwNyk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDY0ICwgMTA4KTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNmaXhlZDMyLCAxMDkpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ZpeGVkNjQsIDExMCk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmbG9hdCAgICwgMTExKTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKGRvdWJsZSAgLCAxMTIpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoYm9vbCAgICAsIHRydWUpOworI3VuZGVmIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRAorICB7CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgICAgY29uc3QgaW50IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7CisgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOworICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IGJhc2Vfc2l6ZSArCisgICAgICAgIHNpemVvZihtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKTsKKyAgfQorICB7CisgICAgLy8gU3RyaW5ncyBtYXkgY2F1c2UgZXh0cmEgYWxsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZWlyIGxlbmd0aDsgZW5zdXJlCisgICAgLy8gdGhhdCBnZXRzIGluY2x1ZGVkIGFzIHdlbGwuCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgICAgY29uc3QgaW50IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7CisgICAgY29uc3Qgc3RyaW5nIHMoInRoaXMgaXMgYSBmYWlybHkgbGFyZ2Ugc3RyaW5nIHRoYXQgd2lsbCBjYXVzZSBzb21lICIKKyAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGlvbiBpbiBvcmRlciB0byBzdG9yZSBpdCBpbiB0aGUgZXh0ZW5zaW9uIik7CisgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24sIHMpOworICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IGJhc2Vfc2l6ZSArIHMubGVuZ3RoKCk7CisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKTsKKyAgfQorICB7CisgICAgLy8gTWVzc2FnZXMgYWxzbyBoYXZlIGFkZGl0aW9uYWwgYWxsb2NhdGlvbiB0aGF0IG5lZWQgdG8gYmUgY291bnRlZC4KKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsKKyAgICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UgZm9yZWlnbjsKKyAgICBmb3JlaWduLnNldF9jKDQyKTsKKyAgICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT4KKyAgICAgICAgQ29weUZyb20oZm9yZWlnbik7CisgICAgaW50IG1pbl9leHBlY3RlZF9zaXplID0gYmFzZV9zaXplICsgZm9yZWlnbi5TcGFjZVVzZWQoKTsKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOworICB9CisKKyAgLy8gUmVwZWF0ZWQgcHJpbWl0aXZlIGV4dGVuc2lvbnMgd2lsbCBpbmNyZWFzZSBzcGFjZSB1c2VkIGJ5IGF0IGxlYXN0IGEKKyAgLy8gUmVwZWF0ZWRGaWVsZDxUPiwgYW5kIHdpbGwgY2F1c2UgYWRkaXRpb25hbCBhbGxvY2F0aW9ucyB3aGVuIHRoZSBhcnJheQorICAvLyBnZXRzIHRvbyBiaWcgZm9yIHRoZSBpbml0aWFsIHNwYWNlLgorICAvLyBUaGlzIG1hY3JvOgorICAvLyAgIC0gQWRkcyBhIHZhbHVlIHRvIHRoZSByZXBlYXRlZCBleHRlbnNpb24sIHRoZW4gY2xlYXJzIGl0LCBlc3RhYmxpc2hpbmcKKyAgLy8gICAgIHRoZSBiYXNlIHNpemUuCisgIC8vICAgLSBBZGRzIGEgc21hbGwgbnVtYmVyIG9mIHZhbHVlcywgdGVzdGluZyB0aGF0IGl0IGRvZXNuJ3QgaW5jcmVhc2UgdGhlCisgIC8vICAgICBTcGFjZVVzZWQoKQorICAvLyAgIC0gQWRkcyBhIGxhcmdlIG51bWJlciBvZiB2YWx1ZXMgKHJlcXVpcmluZyBhbGxvY2F0aW9uIGluIHRoZSByZXBlYXRlZAorICAvLyAgICAgZmllbGQpLCBhbmQgZW5zdXJlcyB0aGF0IHRoYXQgYWxsb2NhdGlvbiBpcyBpbmNsdWRlZCBpbiBTcGFjZVVzZWQoKQorI2RlZmluZSBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRCh0eXBlLCBjcHB0eXBlLCB2YWx1ZSkgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBiYXNlX3NpemUgPSBtZXNzYWdlLlNwYWNlVXNlZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBzaXplb2YoUmVwZWF0ZWRGaWVsZDxjcHB0eXBlPikgKyBiYXNlX3NpemU7ICAgICAgICBcCisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbiwgdmFsdWUpOyAgICAgICAgXAorICAgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbik7ICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgZW1wdHlfcmVwZWF0ZWRfZmllbGRfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7ICAgICAgICAgICAgICAgICBcCisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBlbXB0eV9yZXBlYXRlZF9maWVsZF9zaXplKSA8PCAjdHlwZTsgICAgICAgICAgXAorICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICAgIFwKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uLCB2YWx1ZSk7ICAgICAgICBcCisgICAgRVhQRUNUX0VRKGVtcHR5X3JlcGVhdGVkX2ZpZWxkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpIDw8ICN0eXBlOyAgICAgICAgXAorICAgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbik7ICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uLCB2YWx1ZSk7ICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihjcHB0eXBlKSAqICgxNiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUpICsgZW1wdHlfcmVwZWF0ZWRfZmllbGRfc2l6ZTsgICAgICAgICAgXAorICAgIEVYUEVDVF9FUShleHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKSA8PCAjdHlwZTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQzMiAgICwgaW50MzIgLCAxMDEpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQ2NCAgICwgaW50NjQgLCAxMDIpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRCh1aW50MzIgICwgdWludDMyLCAxMDMpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRCh1aW50NjQgICwgdWludDY0LCAxMDQpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzaW50MzIgICwgaW50MzIgLCAxMDUpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzaW50NjQgICwgaW50NjQgLCAxMDYpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDMyICwgdWludDMyLCAxMDcpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDY0ICwgdWludDY0LCAxMDgpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzZml4ZWQzMiwgaW50MzIgLCAxMDkpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzZml4ZWQ2NCwgaW50NjQgLCAxMTApOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmbG9hdCAgICwgZmxvYXQgLCAxMTEpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChkb3VibGUgICwgZG91YmxlLCAxMTIpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChib29sICAgICwgYm9vbCAgLCB0cnVlKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQobmVzdGVkX2VudW0sIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyN1bmRlZiBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRAorICAvLyBSZXBlYXRlZCBzdHJpbmdzCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsKKyAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBzaXplb2YoUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KSArIGJhc2Vfc2l6ZTsKKyAgICBjb25zdCBzdHJpbmcgdmFsdWUoMjU2LCAneCcpOworICAgIC8vIE9uY2UgaXRlbXMgYXJlIGFsbG9jYXRlZCwgdGhleSBtYXkgc3RpY2sgYXJvdW5kIGV2ZW4gd2hlbiBjbGVhcmVkIHNvCisgICAgLy8gd2l0aG91dCB0aGUgaGFyZGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYWNjZXNzb3JzIHRoZXJlIGlzbid0IGEgbm90aW9uIG9mCisgICAgLy8gdGhlIGVtcHR5IHJlcGVhdGVkIGZpZWxkIG1lbW9yeSB1c2FnZSBhcyB0aGVyZSBpcyB3aXRoIHByaW1pdGl2ZSB0eXBlcy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCB2YWx1ZSk7CisgICAgfQorICAgIG1pbl9leHBlY3RlZF9zaXplICs9IChzaXplb2YodmFsdWUpICsgdmFsdWUuc2l6ZSgpKSAqCisgICAgICAgICgxNiAtIGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUpOworICAgIEVYUEVDVF9MRShtaW5fZXhwZWN0ZWRfc2l6ZSwgbWVzc2FnZS5TcGFjZVVzZWQoKSk7CisgIH0KKyAgLy8gUmVwZWF0ZWQgbWVzc2FnZXMKKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICAgIGNvbnN0IGludCBiYXNlX3NpemUgPSBtZXNzYWdlLlNwYWNlVXNlZCgpOworICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihSZXBlYXRlZFB0ckZpZWxkPHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZT4pICsKKyAgICAgICAgYmFzZV9zaXplOworICAgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSBwcm90b3R5cGU7CisgICAgcHJvdG90eXBlLnNldF9jKDIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT4KKyAgICAgICAgICBDb3B5RnJvbShwcm90b3R5cGUpOworICAgIH0KKyAgICBtaW5fZXhwZWN0ZWRfc2l6ZSArPQorICAgICAgICAoMTYgLSBrTWluUmVwZWF0ZWRGaWVsZEFsbG9jYXRpb25TaXplKSAqIHByb3RvdHlwZS5TcGFjZVVzZWQoKTsKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOworICB9Cit9CisKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEludmFsaWRFbnVtRGVhdGgpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bml0dGVzdDo6Rm9yZWlnbkVudW0+KDUzKSksCisgICAgIklzVmFsaWQiKTsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIER5bmFtaWNFeHRlbnNpb25zKSB7CisgIC8vIFRlc3QgYWRkaW5nIGEgZHluYW1pYyBleHRlbnNpb24gdG8gYSBjb21waWxlZC1pbiBtZXNzYWdlIG9iamVjdC4KKworICBGaWxlRGVzY3JpcHRvclByb3RvIGR5bmFtaWNfcHJvdG87CisgIGR5bmFtaWNfcHJvdG8uc2V0X25hbWUoImR5bmFtaWNfZXh0ZW5zaW9uc190ZXN0LnByb3RvIik7CisgIGR5bmFtaWNfcHJvdG8uYWRkX2RlcGVuZGVuY3koCisgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5uYW1lKCkpOworICBkeW5hbWljX3Byb3RvLnNldF9wYWNrYWdlKCJkeW5hbWljX2V4dGVuc2lvbnMiKTsKKworICAvLyBDb3B5IHRoZSBmaWVsZHMgYW5kIG5lc3RlZCB0eXBlcyBmcm9tIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBpbnRvIG91ciBuZXcKKyAgLy8gcHJvdG8sIGNvbnZlcnRpbmcgdGhlIGZpZWxkcyBpbnRvIGV4dGVuc2lvbnMuCisgIGNvbnN0IERlc2NyaXB0b3IqIHRlbXBsYXRlX2Rlc2NyaXB0b3IgPQorICAgICAgdW5pdHRlc3Q6OlRlc3REeW5hbWljRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpOworICBEZXNjcmlwdG9yUHJvdG8gdGVtcGxhdGVfZGVzY3JpcHRvcl9wcm90bzsKKyAgdGVtcGxhdGVfZGVzY3JpcHRvci0+Q29weVRvKCZ0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvKTsKKyAgZHluYW1pY19wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpLT5NZXJnZUZyb20oCisgICAgICB0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvLm5lc3RlZF90eXBlKCkpOworICBkeW5hbWljX3Byb3RvLm11dGFibGVfZW51bV90eXBlKCktPk1lcmdlRnJvbSgKKyAgICAgIHRlbXBsYXRlX2Rlc2NyaXB0b3JfcHJvdG8uZW51bV90eXBlKCkpOworICBkeW5hbWljX3Byb3RvLm11dGFibGVfZXh0ZW5zaW9uKCktPk1lcmdlRnJvbSgKKyAgICAgIHRlbXBsYXRlX2Rlc2NyaXB0b3JfcHJvdG8uZmllbGQoKSk7CisKKyAgLy8gRm9yIGVhY2ggZXh0ZW5zaW9uIHRoYXQgd2UgYWRkZWQuLi4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkeW5hbWljX3Byb3RvLmV4dGVuc2lvbl9zaXplKCk7IGkrKykgeworICAgIC8vIFNldCBpdHMgZXh0ZW5kZWUgdG8gVGVzdEFsbEV4dGVuc2lvbnMuCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGV4dGVuc2lvbiA9IGR5bmFtaWNfcHJvdG8ubXV0YWJsZV9leHRlbnNpb24oaSk7CisgICAgZXh0ZW5zaW9uLT5zZXRfZXh0ZW5kZWUoCisgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSk7CisKKyAgICAvLyBJZiB0aGUgZmllbGQgcmVmZXJzIHRvIG9uZSBvZiB0aGUgdHlwZXMgbmVzdGVkIGluIFRlc3REeW5hbWljRXh0ZW5zaW9ucywKKyAgICAvLyBtYWtlIGl0IHJlZmVyIHRvIHRoZSB0eXBlIGluIG91ciBkeW5hbWljIHByb3RvIGluc3RlYWQuCisgICAgc3RyaW5nIHByZWZpeCA9ICIuIiArIHRlbXBsYXRlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIi4iOworICAgIGlmIChleHRlbnNpb24tPmhhc190eXBlX25hbWUoKSkgeworICAgICAgc3RyaW5nKiB0eXBlX25hbWUgPSBleHRlbnNpb24tPm11dGFibGVfdHlwZV9uYW1lKCk7CisgICAgICBpZiAoSGFzUHJlZml4U3RyaW5nKCp0eXBlX25hbWUsIHByZWZpeCkpIHsKKyAgICAgICAgdHlwZV9uYW1lLT5yZXBsYWNlKDAsIHByZWZpeC5zaXplKCksICIuZHluYW1pY19leHRlbnNpb25zLiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE5vdyBidWlsZCB0aGUgZmlsZSwgdXNpbmcgdGhlIGdlbmVyYXRlZCBwb29sIGFzIGFuIHVuZGVybGF5LgorICBEZXNjcmlwdG9yUG9vbCBkeW5hbWljX3Bvb2woRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IGR5bmFtaWNfcG9vbC5CdWlsZEZpbGUoZHluYW1pY19wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBkeW5hbWljX2ZhY3RvcnkoJmR5bmFtaWNfcG9vbCk7CisgIGR5bmFtaWNfZmFjdG9yeS5TZXREZWxlZ2F0ZVRvR2VuZXJhdGVkRmFjdG9yeSh0cnVlKTsKKworICAvLyBDb25zdHJ1Y3QgYSBtZXNzYWdlIHRoYXQgd2UgY2FuIHBhcnNlIHdpdGggdGhlIGV4dGVuc2lvbnMgd2UgZGVmaW5lZC4KKyAgLy8gU2luY2UgdGhlIGV4dGVuc2lvbnMgd2VyZSBiYXNlZCBvZmYgb2YgdGhlIGZpZWxkcyBvZiBUZXN0RHluYW1pY0V4dGVuc2lvbnMsCisgIC8vIHdlIGNhbiB1c2UgdGhhdCBtZXNzYWdlIHRvIGNyZWF0ZSB0aGlzIHRlc3QgbWVzc2FnZS4KKyAgc3RyaW5nIGRhdGE7CisgIHsKKyAgICB1bml0dGVzdDo6VGVzdER5bmFtaWNFeHRlbnNpb25zIG1lc3NhZ2U7CisgICAgbWVzc2FnZS5zZXRfc2NhbGFyX2V4dGVuc2lvbigxMjMpOworICAgIG1lc3NhZ2Uuc2V0X2VudW1fZXh0ZW5zaW9uKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUik7CisgICAgbWVzc2FnZS5zZXRfZHluYW1pY19lbnVtX2V4dGVuc2lvbigKKyAgICAgICAgdW5pdHRlc3Q6OlRlc3REeW5hbWljRXh0ZW5zaW9uczo6RFlOQU1JQ19CQVopOworICAgIG1lc3NhZ2UubXV0YWJsZV9tZXNzYWdlX2V4dGVuc2lvbigpLT5zZXRfYyg0NTYpOworICAgIG1lc3NhZ2UubXV0YWJsZV9keW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uKCktPnNldF9keW5hbWljX2ZpZWxkKDc4OSk7CisgICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZXh0ZW5zaW9uKCJmb28iKTsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9leHRlbnNpb24oImJhciIpOworICAgIG1lc3NhZ2UuYWRkX3BhY2tlZF9leHRlbnNpb24oMTIpOworICAgIG1lc3NhZ2UuYWRkX3BhY2tlZF9leHRlbnNpb24oLTM0KTsKKyAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKDU2KTsKKyAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKC03OCk7CisKKyAgICAvLyBBbHNvIGFkZCBzb21lIHVua25vd24gZmllbGRzLgorCisgICAgLy8gQW4gdW5rbm93biBlbnVtIHZhbHVlIChmb3IgYSBrbm93biBmaWVsZCkuCisgICAgbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OmtEeW5hbWljRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyLAorICAgICAgMTIzNDUpOworICAgIC8vIEEgcmVndWxhciB1bmtub3duIGZpZWxkLgorICAgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRMZW5ndGhEZWxpbWl0ZWQoNTQzMjEsICJ1bmtub3duIik7CisKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgfQorCisgIC8vIE5vdyB3ZSBjYW4gcGFyc2UgdGhpcyB1c2luZyBvdXIgZHluYW1pYyBleHRlbnNpb24gZGVmaW5pdGlvbnMuLi4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRFeHRlbnNpb25SZWdpc3RyeSgmZHluYW1pY19wb29sLCAmZHluYW1pY19mYWN0b3J5KTsKKyAgICBBU1NFUlRfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworICAgIEFTU0VSVF9UUlVFKGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKKyAgfQorCisgIC8vIENhbiB3ZSBwcmludCBpdD8KKyAgRVhQRUNUX0VRKAorICAgICJbZHluYW1pY19leHRlbnNpb25zLnNjYWxhcl9leHRlbnNpb25dOiAxMjNcbiIKKyAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFSXG4iCisgICAgIltkeW5hbWljX2V4dGVuc2lvbnMuZHluYW1pY19lbnVtX2V4dGVuc2lvbl06IERZTkFNSUNfQkFaXG4iCisgICAgIltkeW5hbWljX2V4dGVuc2lvbnMubWVzc2FnZV9leHRlbnNpb25dIHtcbiIKKyAgICAiICBjOiA0NTZcbiIKKyAgICAifVxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLmR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb25dIHtcbiIKKyAgICAiICBkeW5hbWljX2ZpZWxkOiA3ODlcbiIKKyAgICAifVxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLnJlcGVhdGVkX2V4dGVuc2lvbl06IFwiZm9vXCJcbiIKKyAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5yZXBlYXRlZF9leHRlbnNpb25dOiBcImJhclwiXG4iCisgICAgIltkeW5hbWljX2V4dGVuc2lvbnMucGFja2VkX2V4dGVuc2lvbl06IDEyXG4iCisgICAgIltkeW5hbWljX2V4dGVuc2lvbnMucGFja2VkX2V4dGVuc2lvbl06IC0zNFxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiA1NlxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiAtNzhcbiIKKyAgICAiMjAwMjogMTIzNDVcbiIKKyAgICAiNTQzMjE6IFwidW5rbm93blwiXG4iLAorICAgIG1lc3NhZ2UuRGVidWdTdHJpbmcoKSk7CisKKyAgLy8gQ2FuIHdlIHNlcmlhbGl6ZSBpdD8KKyAgLy8gKERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1bXAgcmF3IGJpbmFyeSBkYXRhIHRvIHRoZQorICAvLyB0ZXJtaW5hbCBvbiBmYWlsdXJlLikKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpID09IGRhdGEpOworCisgIC8vIFdoYXQgaWYgd2UgcGFyc2UgdXNpbmcgdGhlIHJlZmxlY3Rpb24tYmFzZWQgcGFyc2VyPworICB7CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICAgIGlucHV0LlNldEV4dGVuc2lvblJlZ2lzdHJ5KCZkeW5hbWljX3Bvb2wsICZkeW5hbWljX2ZhY3RvcnkpOworICAgIEFTU0VSVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJm1lc3NhZ2UyKSk7CisgICAgQVNTRVJUX1RSVUUoaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlLkRlYnVnU3RyaW5nKCksIG1lc3NhZ2UyLkRlYnVnU3RyaW5nKCkpOworICB9CisKKyAgLy8gQXJlIHRoZSBlbWJlZGRlZCBnZW5lcmF0ZWQgdHlwZXMgYWN0dWFsbHkgdXNpbmcgdGhlIGdlbmVyYXRlZCBvYmplY3RzPworICB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtZXNzYWdlX2V4dGVuc2lvbiA9CisgICAgICAgIGZpbGUtPkZpbmRFeHRlbnNpb25CeU5hbWUoIm1lc3NhZ2VfZXh0ZW5zaW9uIik7CisgICAgQVNTRVJUX1RSVUUobWVzc2FnZV9leHRlbnNpb24gIT0gTlVMTCk7CisgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPQorICAgICAgICBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZShtZXNzYWdlLCBtZXNzYWdlX2V4dGVuc2lvbik7CisgICAgY29uc3QgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiB0eXBlZF9zdWJfbWVzc2FnZSA9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1JUVEkKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKKyNlbHNlCisgICAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqPigmc3ViX21lc3NhZ2UpOworI2VuZGlmCisgICAgQVNTRVJUX1RSVUUodHlwZWRfc3ViX21lc3NhZ2UgIT0gTlVMTCk7CisgICAgRVhQRUNUX0VRKDQ1NiwgdHlwZWRfc3ViX21lc3NhZ2UtPmMoKSk7CisgIH0KKworICAvLyBXaGF0IGRvZXMgR2V0TWVzc2FnZSgpIHJldHVybiBmb3IgdGhlIGVtYmVkZGVkIGR5bmFtaWMgdHlwZSBpZiBpdCBpc24ndAorICAvLyBwcmVzZW50PworICB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uID0KKyAgICAgICAgZmlsZS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbiIpOworICAgIEFTU0VSVF9UUlVFKGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24gIT0gTlVMTCk7CisgICAgY29uc3QgTWVzc2FnZSYgcGFyZW50ID0gdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPQorICAgICAgICBwYXJlbnQuR2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKHBhcmVudCwgZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHluYW1pY19mYWN0b3J5KTsKKyAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUgPQorICAgICAgICBkeW5hbWljX2ZhY3RvcnkuR2V0UHJvdG90eXBlKGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24tPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEocHJvdG90eXBlLCAmc3ViX21lc3NhZ2UpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWE1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oCkBAIC0wLDAgKzEsODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogamFzb25oQGdvb2dsZS5jb20gKEphc29uIEhzdWVoKQorLy8KKy8vIFRoaXMgaGVhZGVyIGlzIGxvZ2ljYWxseSBpbnRlcm5hbCwgYnV0IGlzIG1hZGUgcHVibGljIGJlY2F1c2UgaXQgaXMgdXNlZAorLy8gZnJvbSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgY29kZSwgd2hpY2ggbWF5IHJlc2lkZSBpbiBvdGhlciBjb21wb25lbnRzLgorLy8gSXQgcHJvdmlkZXMgcmVmbGVjdGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0ZWQgZW51bXMsIGFuZCBpcyBpbmNsdWRlZCBpbgorLy8gZ2VuZXJhdGVkIC5wYi5oIGZpbGVzIGFuZCBzaG91bGQgaGF2ZSBtaW5pbWFsIGRlcGVuZGVuY2llcy4gVGhlIG1ldGhvZHMgYXJlCisvLyBpbXBsZW1lbnRlZCBpbiBnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfRU5VTV9SRUZMRUNUSU9OX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX0VOVU1fUkVGTEVDVElPTl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBSZXR1cm5zIHRoZSBFbnVtRGVzY3JpcHRvciBmb3IgZW51bSB0eXBlIEUsIHdoaWNoIG11c3QgYmUgYQorLy8gcHJvdG8tZGVjbGFyZWQgZW51bSB0eXBlLiAgQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyCisvLyB3aWxsIGluY2x1ZGUgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgdGVtcGxhdGUgZm9yIGVhY2ggZW51bSB0eXBlIGRlY2xhcmVkLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+Citjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3IoKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gSGVscGVyIGZvciBFbnVtVHlwZV9QYXJzZSBmdW5jdGlvbnM6IHRyeSB0byBwYXJzZSB0aGUgc3RyaW5nICduYW1lJyBhcyBhbgorLy8gZW51bSBuYW1lIG9mIHRoZSBnaXZlbiB0eXBlLCByZXR1cm5pbmcgdHJ1ZSBhbmQgZmlsbGluZyBpbiB2YWx1ZSBvbiBzdWNjZXNzLAorLy8gb3IgcmV0dXJuaW5nIGZhbHNlIGFuZCBsZWF2aW5nIHZhbHVlIHVuY2hhbmdlZCBvbiBmYWlsdXJlLgorTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgUGFyc2VOYW1lZEVudW0oY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW50KiB2YWx1ZSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEVudW1UeXBlPgorYm9vbCBQYXJzZU5hbWVkRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICBFbnVtVHlwZSogdmFsdWUpIHsKKyAgaW50IHRtcDsKKyAgaWYgKCFQYXJzZU5hbWVkRW51bShkZXNjcmlwdG9yLCBuYW1lLCAmdG1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxFbnVtVHlwZT4odG1wKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEp1c3QgYSB3cmFwcGVyIGFyb3VuZCBwcmludGluZyB0aGUgbmFtZSBvZiBhIHZhbHVlLiBUaGUgbWFpbiBwb2ludCBvZiB0aGlzCisvLyBmdW5jdGlvbiBpcyBub3QgdG8gYmUgaW5saW5lZCwgc28gdGhhdCB5b3UgY2FuIGRvIHRoaXMgd2l0aG91dCBpbmNsdWRpbmcKKy8vIGRlc2NyaXB0b3IuaC4KK0xJQlBST1RPQlVGX0VYUE9SVCBjb25zdCBzdHJpbmcmIE5hbWVPZkVudW0oY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCB2YWx1ZSk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9FTlVNX1JFRkxFQ1RJT05fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDA4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYwpAQCAtMCwwICsxLDEyOTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2ludCBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIGNvbnN0IHZvaWQqIHN0YXJ0ID0gJnN0cjsKKyAgY29uc3Qgdm9pZCogZW5kID0gJnN0ciArIDE7CisKKyAgaWYgKHN0YXJ0IDw9IHN0ci5kYXRhKCkgJiYgc3RyLmRhdGEoKSA8PSBlbmQpIHsKKyAgICAvLyBUaGUgc3RyaW5nJ3MgZGF0YSBpcyBzdG9yZWQgaW5zaWRlIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZi4KKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RyLmNhcGFjaXR5KCk7CisgIH0KK30KKworYm9vbCBQYXJzZU5hbWVkRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbHVlKSB7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGQgPSBkZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU5hbWUobmFtZSk7CisgIGlmIChkID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gZC0+bnVtYmVyKCk7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBzdHJpbmcmIE5hbWVPZkVudW0oY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCB2YWx1ZSkgeworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkID0gZGVzY3JpcHRvci0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICByZXR1cm4gKGQgPT0gTlVMTCA/IGtFbXB0eVN0cmluZyA6IGQtPm5hbWUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhlbHBlcnMgZm9yIHJlcG9ydGluZyB1c2FnZSBlcnJvcnMgKGUuZy4gdHJ5aW5nIHRvIHVzZSBHZXRJbnQzMigpIG9uCisvLyBhIHN0cmluZyBmaWVsZCkuCisKK25hbWVzcGFjZSB7CisKK3ZvaWQgUmVwb3J0UmVmbGVjdGlvblVzYWdlRXJyb3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBjaGFyKiBtZXRob2QsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgIEdPT0dMRV9MT0coRkFUQUwpCisgICAgPDwgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgorICAgICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6IiA8PCBtZXRob2QgPDwgIlxuIgorICAgICAgICIgIE1lc3NhZ2UgdHlwZTogIiA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSA8PCAiXG4iCisgICAgICAgIiAgRmllbGQgICAgICAgOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKSA8PCAiXG4iCisgICAgICAgIiAgUHJvYmxlbSAgICAgOiAiIDw8IGRlc2NyaXB0aW9uOworfQorCitjb25zdCBjaGFyKiBjcHB0eXBlX25hbWVzX1tGaWVsZERlc2NyaXB0b3I6Ok1BWF9DUFBUWVBFICsgMV0gPSB7CisgICJJTlZBTElEX0NQUFRZUEUiLAorICAiQ1BQVFlQRV9JTlQzMiIsCisgICJDUFBUWVBFX0lOVDY0IiwKKyAgIkNQUFRZUEVfVUlOVDMyIiwKKyAgIkNQUFRZUEVfVUlOVDY0IiwKKyAgIkNQUFRZUEVfRE9VQkxFIiwKKyAgIkNQUFRZUEVfRkxPQVQiLAorICAiQ1BQVFlQRV9CT09MIiwKKyAgIkNQUFRZUEVfRU5VTSIsCisgICJDUFBUWVBFX1NUUklORyIsCisgICJDUFBUWVBFX01FU1NBR0UiCit9OworCitzdGF0aWMgdm9pZCBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VUeXBlRXJyb3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBjaGFyKiBtZXRob2QsCisgICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGV4cGVjdGVkX3R5cGUpIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICA8PCAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjoiIDw8IG1ldGhvZCA8PCAiXG4iCisgICAgICAgIiAgTWVzc2FnZSB0eXBlOiAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpIDw8ICJcbiIKKyAgICAgICAiICBGaWVsZCAgICAgICA6ICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpIDw8ICJcbiIKKyAgICAgICAiICBQcm9ibGVtICAgICA6IEZpZWxkIGlzIG5vdCB0aGUgcmlnaHQgdHlwZSBmb3IgdGhpcyBtZXNzYWdlOlxuIgorICAgICAgICIgICAgRXhwZWN0ZWQgIDogIiA8PCBjcHB0eXBlX25hbWVzX1tleHBlY3RlZF90eXBlXSA8PCAiXG4iCisgICAgICAgIiAgICBGaWVsZCB0eXBlOiAiIDw8IGNwcHR5cGVfbmFtZXNfW2ZpZWxkLT5jcHBfdHlwZSgpXTsKK30KKworc3RhdGljIHZvaWQgUmVwb3J0UmVmbGVjdGlvblVzYWdlRW51bVR5cGVFcnJvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IGNoYXIqIG1ldGhvZCwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICA8PCAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjoiIDw8IG1ldGhvZCA8PCAiXG4iCisgICAgICAgIiAgTWVzc2FnZSB0eXBlOiAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpIDw8ICJcbiIKKyAgICAgICAiICBGaWVsZCAgICAgICA6ICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpIDw8ICJcbiIKKyAgICAgICAiICBQcm9ibGVtICAgICA6IEVudW0gdmFsdWUgZGlkIG5vdCBtYXRjaCBmaWVsZCB0eXBlOlxuIgorICAgICAgICIgICAgRXhwZWN0ZWQgIDogIiA8PCBmaWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpIDw8ICJcbiIKKyAgICAgICAiICAgIEFjdHVhbCAgICA6ICIgPDwgdmFsdWUtPmZ1bGxfbmFtZSgpOworfQorCisjZGVmaW5lIFVTQUdFX0NIRUNLKENPTkRJVElPTiwgTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShDT05ESVRJT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VFcnJvcihkZXNjcmlwdG9yXywgZmllbGQsICNNRVRIT0QsIEVSUk9SX0RFU0NSSVBUSU9OKQorI2RlZmluZSBVU0FHRV9DSEVDS19FUShBLCBCLCBNRVRIT0QsIEVSUk9SX0RFU0NSSVBUSU9OKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBR0VfQ0hFQ0soKEEpID09IChCKSwgTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikKKyNkZWZpbmUgVVNBR0VfQ0hFQ0tfTkUoQSwgQiwgTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQUdFX0NIRUNLKChBKSAhPSAoQiksIE1FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pCisKKyNkZWZpbmUgVVNBR0VfQ0hFQ0tfVFlQRShNRVRIT0QsIENQUFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFKSAgICAgICAgICAgICAgICAgXAorICAgIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZVR5cGVFcnJvcihkZXNjcmlwdG9yXywgZmllbGQsICNNRVRIT0QsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRSkKKworI2RlZmluZSBVU0FHRV9DSEVDS19FTlVNX1ZBTFVFKE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHZhbHVlLT50eXBlKCkgIT0gZmllbGQtPmVudW1fdHlwZSgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUmVwb3J0UmVmbGVjdGlvblVzYWdlRW51bVR5cGVFcnJvcihkZXNjcmlwdG9yXywgZmllbGQsICNNRVRIT0QsIHZhbHVlKQorCisjZGVmaW5lIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FHRV9DSEVDS19FUShmaWVsZC0+Y29udGFpbmluZ190eXBlKCksIGRlc2NyaXB0b3JfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgTUVUSE9ELCAiRmllbGQgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOworI2RlZmluZSBVU0FHRV9DSEVDS19TSU5HVUxBUihNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBR0VfQ0hFQ0tfTkUoZmllbGQtPmxhYmVsKCksIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIE1FVEhPRCwgICAgICBcCisgICAgICAgICAgICAgICAgICJGaWVsZCBpcyByZXBlYXRlZDsgdGhlIG1ldGhvZCByZXF1aXJlcyBhIHNpbmd1bGFyIGZpZWxkLiIpCisjZGVmaW5lIFVTQUdFX0NIRUNLX1JFUEVBVEVEKE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FHRV9DSEVDS19FUShmaWVsZC0+bGFiZWwoKSwgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgTUVUSE9ELCAgICAgIFwKKyAgICAgICAgICAgICAgICAgIkZpZWxkIGlzIHNpbmd1bGFyOyB0aGUgbWV0aG9kIHJlcXVpcmVzIGEgcmVwZWF0ZWQgZmllbGQuIikKKworI2RlZmluZSBVU0FHRV9DSEVDS19BTEwoTUVUSE9ELCBMQUJFTCwgQ1BQVFlQRSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVU0FHRV9DSEVDS19NRVNTQUdFX1RZUEUoTUVUSE9EKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVNBR0VfQ0hFQ0tfIyNMQUJFTChNRVRIT0QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX1RZUEUoTUVUSE9ELCBDUFBUWVBFKQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlLAorICAgIGNvbnN0IGludCBvZmZzZXRzW10sCisgICAgaW50IGhhc19iaXRzX29mZnNldCwKKyAgICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0LAorICAgIGludCBleHRlbnNpb25zX29mZnNldCwKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogZGVzY3JpcHRvcl9wb29sLAorICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAorICAgIGludCBvYmplY3Rfc2l6ZSkKKyAgOiBkZXNjcmlwdG9yXyAgICAgICAoZGVzY3JpcHRvciksCisgICAgZGVmYXVsdF9pbnN0YW5jZV8gKGRlZmF1bHRfaW5zdGFuY2UpLAorICAgIG9mZnNldHNfICAgICAgICAgIChvZmZzZXRzKSwKKyAgICBoYXNfYml0c19vZmZzZXRfICAoaGFzX2JpdHNfb2Zmc2V0KSwKKyAgICB1bmtub3duX2ZpZWxkc19vZmZzZXRfKHVua25vd25fZmllbGRzX29mZnNldCksCisgICAgZXh0ZW5zaW9uc19vZmZzZXRfKGV4dGVuc2lvbnNfb2Zmc2V0KSwKKyAgICBvYmplY3Rfc2l6ZV8gICAgICAob2JqZWN0X3NpemUpLAorICAgIGRlc2NyaXB0b3JfcG9vbF8gICgoZGVzY3JpcHRvcl9wb29sID09IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sKSwKKyAgICBtZXNzYWdlX2ZhY3RvcnlfICAoZmFjdG9yeSkgeworfQorCitHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6fkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKCkge30KKworY29uc3QgVW5rbm93bkZpZWxkU2V0JiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0VW5rbm93bkZpZWxkcygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkc19vZmZzZXRfOworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVW5rbm93bkZpZWxkU2V0Kj4ocHRyKTsKK30KK1Vua25vd25GaWVsZFNldCogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVVbmtub3duRmllbGRzKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgdW5rbm93bl9maWVsZHNfb2Zmc2V0XzsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VW5rbm93bkZpZWxkU2V0Kj4ocHRyKTsKK30KKworaW50IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTcGFjZVVzZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICAvLyBvYmplY3Rfc2l6ZV8gYWxyZWFkeSBpbmNsdWRlcyB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggZmllbGQKKyAgLy8gaW4gdGhlIG1lc3NhZ2UsIHNvIHdlIG9ubHkgbmVlZCB0byBhY2NvdW50IGZvciBhZGRpdGlvbmFsIG1lbW9yeSB1c2VkIGJ5CisgIC8vIHRoZSBmaWVsZHMuCisgIGludCB0b3RhbF9zaXplID0gb2JqZWN0X3NpemVfOworCisgIHRvdGFsX3NpemUgKz0gR2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKS5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCk7CisKKyAgaWYgKGV4dGVuc2lvbnNfb2Zmc2V0XyAhPSAtMSkgeworICAgIHRvdGFsX3NpemUgKz0gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB0b3RhbF9zaXplICs9IEdldFJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gR2V0UmF3PFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiA+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGljaCBzdWJjbGFzcyBvZiBSZXBlYXRlZFB0ckZpZWxkQmFzZSB0aGUgdHlwZSBpcywKKyAgICAgICAgICAvLyBzbyB3ZSB1c2UgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZGlyZWN0bHkuCisgICAgICAgICAgdG90YWxfc2l6ZSArPQorICAgICAgICAgICAgICBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgICAgIC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzIgOgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NCA6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUIDoKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTCAgOgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNICA6CisgICAgICAgICAgLy8gRmllbGQgaXMgaW5saW5lLCBzbyB3ZSd2ZSBhbHJlYWR5IGNvdW50ZWQgaXQuCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICAgICAgICBjb25zdCBzdHJpbmcqIHB0ciA9IEdldEZpZWxkPGNvbnN0IHN0cmluZyo+KG1lc3NhZ2UsIGZpZWxkKTsKKworICAgICAgICAgICAgICAvLyBJbml0aWFsbHksIHRoZSBzdHJpbmcgcG9pbnRzIHRvIHRoZSBkZWZhdWx0IHZhbHVlIHN0b3JlZCBpbgorICAgICAgICAgICAgICAvLyB0aGUgcHJvdG90eXBlLiBPbmx5IGNvdW50IHRoZSBzdHJpbmcgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZAorICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgICAgICBjb25zdCBzdHJpbmcqIGRlZmF1bHRfcHRyID0gRGVmYXVsdFJhdzxjb25zdCBzdHJpbmcqPihmaWVsZCk7CisKKyAgICAgICAgICAgICAgaWYgKHB0ciAhPSBkZWZhdWx0X3B0cikgeworICAgICAgICAgICAgICAgIC8vIHN0cmluZyBmaWVsZHMgYXJlIHJlcHJlc2VudGVkIGJ5IGp1c3QgYSBwb2ludGVyLCBzbyBhbHNvCisgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSBzaXplb2Yoc3RyaW5nKSBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpwdHIpICsgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigqcHRyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmICgmbWVzc2FnZSA9PSBkZWZhdWx0X2luc3RhbmNlXykgeworICAgICAgICAgICAgLy8gRm9yIHNpbmd1bGFyIGZpZWxkcywgdGhlIHByb3RvdHlwZSBqdXN0IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlCisgICAgICAgICAgICAvLyBleHRlcm5hbCB0eXBlJ3MgcHJvdG90eXBlLCBzbyB0aGVyZSBpcyBubyBleHRyYSBtZW1vcnkgdXNhZ2UuCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlID0gR2V0UmF3PGNvbnN0IE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgICAgICBpZiAoc3ViX21lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICB0b3RhbF9zaXplICs9IHN1Yl9tZXNzYWdlLT5TcGFjZVVzZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlN3YXAoCisgICAgTWVzc2FnZSogbWVzc2FnZTEsCisgICAgTWVzc2FnZSogbWVzc2FnZTIpIGNvbnN0IHsKKyAgaWYgKG1lc3NhZ2UxID09IG1lc3NhZ2UyKSByZXR1cm47CisKKyAgLy8gVE9ETyhrZW50b24pOiAgT3RoZXIgUmVmbGVjdGlvbiBtZXRob2RzIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGlzIHRvby4KKyAgR09PR0xFX0NIRUNLX0VRKG1lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCksIHRoaXMpCisgICAgPDwgIkZpcnN0IGFyZ3VtZW50IHRvIFN3YXAoKSAob2YgdHlwZSBcIiIKKyAgICA8PCBtZXNzYWdlMS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKQorICAgIDw8ICJcIikgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlZmxlY3Rpb24gb2JqZWN0ICh3aGljaCBpcyBmb3IgdHlwZSBcIiIKKyAgICA8PCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkKKyAgICA8PCAiXCIpLiAgTm90ZSB0aGF0IHRoZSBleGFjdCBzYW1lIGNsYXNzIGlzIHJlcXVpcmVkOyBub3QganVzdCB0aGUgc2FtZSAiCisgICAgICAgImRlc2NyaXB0b3IuIjsKKyAgR09PR0xFX0NIRUNLX0VRKG1lc3NhZ2UyLT5HZXRSZWZsZWN0aW9uKCksIHRoaXMpCisgICAgPDwgIlNlY29uZCBhcmd1bWVudCB0byBTd2FwKCkgKG9mIHR5cGUgXCIiCisgICAgPDwgbWVzc2FnZTItPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkKKyAgICA8PCAiXCIpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyByZWZsZWN0aW9uIG9iamVjdCAod2hpY2ggaXMgZm9yIHR5cGUgXCIiCisgICAgPDwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpCisgICAgPDwgIlwiKS4gIE5vdGUgdGhhdCB0aGUgZXhhY3Qgc2FtZSBjbGFzcyBpcyByZXF1aXJlZDsgbm90IGp1c3QgdGhlIHNhbWUgIgorICAgICAgICJkZXNjcmlwdG9yLiI7CisKKyAgdWludDMyKiBoYXNfYml0czEgPSBNdXRhYmxlSGFzQml0cyhtZXNzYWdlMSk7CisgIHVpbnQzMiogaGFzX2JpdHMyID0gTXV0YWJsZUhhc0JpdHMobWVzc2FnZTIpOworICBpbnQgaGFzX2JpdHNfc2l6ZSA9IChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSArIDMxKSAvIDMyOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzX2JpdHNfc2l6ZTsgaSsrKSB7CisgICAgc3RkOjpzd2FwKGhhc19iaXRzMVtpXSwgaGFzX2JpdHMyW2ldKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIFNXQVBfQVJSQVlTKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUWVBFPiA+KG1lc3NhZ2UxLCBmaWVsZCktPlN3YXAoICAgICAgICAgICBcCisgICAgICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUWVBFPiA+KG1lc3NhZ2UyLCBmaWVsZCkpOyAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAgIFNXQVBfQVJSQVlTKElOVDMyICwgaW50MzIgKTsKKyAgICAgICAgICBTV0FQX0FSUkFZUyhJTlQ2NCAsIGludDY0ICk7CisgICAgICAgICAgU1dBUF9BUlJBWVMoVUlOVDMyLCB1aW50MzIpOworICAgICAgICAgIFNXQVBfQVJSQVlTKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgICAgICBTV0FQX0FSUkFZUyhGTE9BVCAsIGZsb2F0ICk7CisgICAgICAgICAgU1dBUF9BUlJBWVMoRE9VQkxFLCBkb3VibGUpOworICAgICAgICAgIFNXQVBfQVJSQVlTKEJPT0wgICwgYm9vbCAgKTsKKyAgICAgICAgICBTV0FQX0FSUkFZUyhFTlVNICAsIGludCAgICk7CisjdW5kZWYgU1dBUF9BUlJBWVMKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZTEsIGZpZWxkKS0+U3dhcCgKKyAgICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZTIsIGZpZWxkKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCB0eXBlOiAiIDw8IGZpZWxkLT5jcHBfdHlwZSgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIFNXQVBfVkFMVUVTKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHN0ZDo6c3dhcCgqTXV0YWJsZVJhdzxUWVBFPihtZXNzYWdlMSwgZmllbGQpLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICpNdXRhYmxlUmF3PFRZUEU+KG1lc3NhZ2UyLCBmaWVsZCkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAgIFNXQVBfVkFMVUVTKElOVDMyICwgaW50MzIgKTsKKyAgICAgICAgICBTV0FQX1ZBTFVFUyhJTlQ2NCAsIGludDY0ICk7CisgICAgICAgICAgU1dBUF9WQUxVRVMoVUlOVDMyLCB1aW50MzIpOworICAgICAgICAgIFNXQVBfVkFMVUVTKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgICAgICBTV0FQX1ZBTFVFUyhGTE9BVCAsIGZsb2F0ICk7CisgICAgICAgICAgU1dBUF9WQUxVRVMoRE9VQkxFLCBkb3VibGUpOworICAgICAgICAgIFNXQVBfVkFMVUVTKEJPT0wgICwgYm9vbCAgKTsKKyAgICAgICAgICBTV0FQX1ZBTFVFUyhFTlVNICAsIGludCAgICk7CisjdW5kZWYgU1dBUF9WQUxVRVMKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBzdGQ6OnN3YXAoKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UxLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlMiwgZmllbGQpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgICAgc3RkOjpzd2FwKCpNdXRhYmxlUmF3PHN0cmluZyo+KG1lc3NhZ2UxLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAqTXV0YWJsZVJhdzxzdHJpbmcqPihtZXNzYWdlMiwgZmllbGQpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZC0+Y3BwX3R5cGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZXh0ZW5zaW9uc19vZmZzZXRfICE9IC0xKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMSktPlN3YXAoTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMikpOworICB9CisKKyAgTXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZTEpLT5Td2FwKE11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UyKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6SGFzRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKEhhc0ZpZWxkKTsKKyAgVVNBR0VfQ0hFQ0tfU0lOR1VMQVIoSGFzRmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkhhcyhmaWVsZC0+bnVtYmVyKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBIYXNCaXQobWVzc2FnZSwgZmllbGQpOworICB9Cit9CisKK2ludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6RmllbGRTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShGaWVsZFNpemUpOworICBVU0FHRV9DSEVDS19SRVBFQVRFRChGaWVsZFNpemUpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkV4dGVuc2lvblNpemUoZmllbGQtPm51bWJlcigpKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpLnNpemUoKQorCisgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggSU5UNjQsICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCk7CisgICAgICBIQU5ETEVfVFlQRSggIEVOVU0sICAgIGludCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLnNpemUoKTsKKyAgICB9CisKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpDbGVhckZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKENsZWFyRmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5DbGVhckV4dGVuc2lvbihmaWVsZC0+bnVtYmVyKCkpOworICB9IGVsc2UgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGlmIChIYXNCaXQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgQ2xlYXJCaXQobWVzc2FnZSwgZmllbGQpOworCisgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgZmllbGQgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgQ0xFQVJfVFlQRShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKk11dGFibGVSYXc8VFlQRT4obWVzc2FnZSwgZmllbGQpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjVFlQRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENMRUFSX1RZUEUoSU5UMzIgLCBpbnQzMiApOworICAgICAgICBDTEVBUl9UWVBFKElOVDY0ICwgaW50NjQgKTsKKyAgICAgICAgQ0xFQVJfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICAgIENMRUFSX1RZUEUoVUlOVDY0LCB1aW50NjQpOworICAgICAgICBDTEVBUl9UWVBFKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgICAgQ0xFQVJfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICAgIENMRUFSX1RZUEUoQk9PTCAgLCBib29sICApOworI3VuZGVmIENMRUFSX1RZUEUKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICAgICpNdXRhYmxlUmF3PGludD4obWVzc2FnZSwgZmllbGQpID0KKyAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3B0ciA9IERlZmF1bHRSYXc8Y29uc3Qgc3RyaW5nKj4oZmllbGQpOworICAgICAgICAgICAgICBzdHJpbmcqKiB2YWx1ZSA9IE11dGFibGVSYXc8c3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOworICAgICAgICAgICAgICBpZiAoKnZhbHVlICE9IGRlZmF1bHRfcHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAoKnZhbHVlKS0+YXNzaWduKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgKCp2YWx1ZSktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgKCpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCkpLT5DbGVhcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpLT5DbGVhcigpOyAgICAgICBcCisgICAgICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBJTlQ2NCwgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBGTE9BVCwgIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRU5VTSwgICAgaW50KTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gPihtZXNzYWdlLCBmaWVsZCktPkNsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoaWNoIHN1YmNsYXNzIG9mIFJlcGVhdGVkUHRyRmllbGRCYXNlIHRoZSB0eXBlIGlzLAorICAgICAgICAvLyBzbyB3ZSB1c2UgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZGlyZWN0bHkuCisgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgLT5DbGVhcjxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6UmVtb3ZlTGFzdCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKFJlbW92ZUxhc3QpOworICBVU0FHRV9DSEVDS19SRVBFQVRFRChSZW1vdmVMYXN0KTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+UmVtb3ZlTGFzdChmaWVsZC0+bnVtYmVyKCkpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCktPlJlbW92ZUxhc3QoKTsgIFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoIElOVDMyLCAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoICBCT09MLCAgIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gPihtZXNzYWdlLCBmaWVsZCktPlJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgIC0+UmVtb3ZlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlJlbGVhc2VMYXN0KAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoUmVsZWFzZUxhc3QsIFJFUEVBVEVELCBNRVNTQUdFKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+UmVsZWFzZUxhc3QoZmllbGQtPm51bWJlcigpKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAtPlJlbGVhc2VMYXN0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcEVsZW1lbnRzKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgaW5kZXgxLAorICAgIGludCBpbmRleDIpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKFN3YXApOworICBVU0FHRV9DSEVDS19SRVBFQVRFRChTd2FwKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U3dhcEVsZW1lbnRzKGZpZWxkLT5udW1iZXIoKSwgaW5kZXgxLCBpbmRleDIpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoIElOVDMyLCAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoICBCT09MLCAgIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworbmFtZXNwYWNlIHsKKy8vIENvbXBhcmlzb24gZnVuY3RvciBmb3Igc29ydGluZyBGaWVsZERlc2NyaXB0b3JzIGJ5IGZpZWxkIG51bWJlci4KK3N0cnVjdCBGaWVsZE51bWJlclNvcnRlciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGxlZnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuIGxlZnQtPm51bWJlcigpIDwgcmlnaHQtPm51bWJlcigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Okxpc3RGaWVsZHMoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QgeworICBvdXRwdXQtPmNsZWFyKCk7CisKKyAgLy8gT3B0aW1pemF0aW9uOiAgVGhlIGRlZmF1bHQgaW5zdGFuY2UgbmV2ZXIgaGFzIGFueSBmaWVsZHMgc2V0LgorICBpZiAoJm1lc3NhZ2UgPT0gZGVmYXVsdF9pbnN0YW5jZV8pIHJldHVybjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgaWYgKEZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCkgPiAwKSB7CisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKEhhc0JpdChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgICAgb3V0cHV0LT5wdXNoX2JhY2soZmllbGQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChleHRlbnNpb25zX29mZnNldF8gIT0gLTEpIHsKKyAgICBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuQXBwZW5kVG9MaXN0KGRlc2NyaXB0b3JfLCBkZXNjcmlwdG9yX3Bvb2xfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgfQorCisgIC8vIExpc3RGaWVsZHMoKSBtdXN0IHNvcnQgb3V0cHV0IGJ5IGZpZWxkIG51bWJlci4KKyAgc29ydChvdXRwdXQtPmJlZ2luKCksIG91dHB1dC0+ZW5kKCksIEZpZWxkTnVtYmVyU29ydGVyKCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyN1bmRlZiBERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUworI2RlZmluZSBERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhUWVBFTkFNRSwgVFlQRSwgUEFTU1RZUEUsIENQUFRZUEUpICAgICAgICBcCisgIFBBU1NUWVBFIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChHZXQjI1RZUEVOQU1FLCBTSU5HVUxBUiwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0IyNUWVBFTkFNRSggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjUEFTU1RZUEUoKSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRGaWVsZDxUWVBFPihtZXNzYWdlLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChTZXQjI1RZUEVOQU1FLCBTSU5HVUxBUiwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5TZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIHZhbHVlLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldEZpZWxkPFRZUEU+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQVNTVFlQRSBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZCMjVFlQRU5BTUUsIFJFUEVBVEVELCBDUFBUWVBFKTsgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0UmVwZWF0ZWQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRSZXBlYXRlZEZpZWxkPFRZUEU+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZCMjVFlQRU5BTUUoICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCBpbmRleCwgUEFTU1RZUEUgdmFsdWUpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChTZXRSZXBlYXRlZCMjVFlQRU5BTUUsIFJFUEVBVEVELCBDUFBUWVBFKTsgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkIyNUWVBFTkFNRSggICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldFJlcGVhdGVkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChBZGQjI1RZUEVOQU1FLCBSRVBFQVRFRCwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZCMjVFlQRU5BTUUoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCksIHZhbHVlLCAgICBcCisgICAgICAgIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQWRkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhJbnQzMiAsIGludDMyICwgaW50MzIgLCBJTlQzMiApCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhJbnQ2NCAsIGludDY0ICwgaW50NjQgLCBJTlQ2NCApCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhVSW50MzIsIHVpbnQzMiwgdWludDMyLCBVSU5UMzIpCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhVSW50NjQsIHVpbnQ2NCwgdWludDY0LCBVSU5UNjQpCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhGbG9hdCAsIGZsb2F0ICwgZmxvYXQgLCBGTE9BVCApCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhEb3VibGUsIGRvdWJsZSwgZG91YmxlLCBET1VCTEUpCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhCb29sICAsIGJvb2wgICwgYm9vbCAgLCBCT09MICApCisjdW5kZWYgREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJpbmcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFN0cmluZygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRTdHJpbmcsIFNJTkdVTEFSLCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRTdHJpbmcoZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICByZXR1cm4gKkdldEZpZWxkPGNvbnN0IHN0cmluZyo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4ga0VtcHR5U3RyaW5nOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KKyAgfQorfQorCitjb25zdCBzdHJpbmcmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRTdHJpbmdSZWZlcmVuY2UoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBzdHJpbmcqIHNjcmF0Y2gpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldFN0cmluZ1JlZmVyZW5jZSwgU0lOR1VMQVIsIFNUUklORyk7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldFN0cmluZyhmaWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgIHJldHVybiAqR2V0RmllbGQ8Y29uc3Qgc3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOworICAgIH0KKworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICAgIHJldHVybiBrRW1wdHlTdHJpbmc7ICAvLyBNYWtlIGNvbXBpbGVyIGhhcHB5LgorICB9Cit9CisKKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0U3RyaW5nKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoU2V0U3RyaW5nLCBTSU5HVUxBUiwgU1RSSU5HKTsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5TZXRTdHJpbmcoZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPnR5cGUoKSwgdmFsdWUsIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICAgIHN0cmluZyoqIHB0ciA9IE11dGFibGVGaWVsZDxzdHJpbmcqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgIGlmICgqcHRyID09IERlZmF1bHRSYXc8Y29uc3Qgc3RyaW5nKj4oZmllbGQpKSB7CisgICAgICAgICAgKnB0ciA9IG5ldyBzdHJpbmcodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgqcHRyKS0+YXNzaWduKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdHJpbmcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJlcGVhdGVkU3RyaW5nKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRTdHJpbmcsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZFN0cmluZyhmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICByZXR1cm4gR2V0UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7CisgICAgfQorCisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgcmV0dXJuIGtFbXB0eVN0cmluZzsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCisgIH0KK30KKworY29uc3Qgc3RyaW5nJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgaW5kZXgsIHN0cmluZyogc2NyYXRjaCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZFN0cmluZyhmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICByZXR1cm4gR2V0UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7CisgICAgfQorCisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgcmV0dXJuIGtFbXB0eVN0cmluZzsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCisgIH0KK30KKworCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZFN0cmluZygKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGludCBpbmRleCwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoU2V0UmVwZWF0ZWRTdHJpbmcsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0UmVwZWF0ZWRTdHJpbmcoCisgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4LCB2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgKk11dGFibGVSZXBlYXRlZEZpZWxkPHN0cmluZz4obWVzc2FnZSwgZmllbGQsIGluZGV4KSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGRTdHJpbmcoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChBZGRTdHJpbmcsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+QWRkU3RyaW5nKGZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPnR5cGUoKSwgdmFsdWUsIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAqQWRkRmllbGQ8c3RyaW5nPihtZXNzYWdlLCBmaWVsZCkgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0RW51bSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRFbnVtLCBTSU5HVUxBUiwgRU5VTSk7CisKKyAgaW50IHZhbHVlOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgdmFsdWUgPSBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0RW51bSgKKyAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7CisgIH0gZWxzZSB7CisgICAgdmFsdWUgPSBHZXRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgfQorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpIDw8ICJWYWx1ZSAiIDw8IHZhbHVlIDw8ICIgaXMgbm90IHZhbGlkIGZvciBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+ZnVsbF9uYW1lKCkgPDwgIiBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgPDwgIi4iOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRFbnVtKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFNldEVudW0sIFNJTkdVTEFSLCBFTlVNKTsKKyAgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShTZXRFbnVtKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0RW51bShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+bnVtYmVyKCksIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZS0+bnVtYmVyKCkpOworICB9Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEVudW0oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZEVudW0sIFJFUEVBVEVELCBFTlVNKTsKKworICBpbnQgdmFsdWU7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICB2YWx1ZSA9IEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZEVudW0oZmllbGQtPm51bWJlcigpLCBpbmRleCk7CisgIH0gZWxzZSB7CisgICAgdmFsdWUgPSBHZXRSZXBlYXRlZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIGluZGV4KTsKKyAgfQorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpIDw8ICJWYWx1ZSAiIDw8IHZhbHVlIDw8ICIgaXMgbm90IHZhbGlkIGZvciBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+ZnVsbF9uYW1lKCkgPDwgIiBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgPDwgIi4iOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZEVudW0oCisgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFNldFJlcGVhdGVkRW51bSwgUkVQRUFURUQsIEVOVU0pOworICBVU0FHRV9DSEVDS19FTlVNX1ZBTFVFKFNldFJlcGVhdGVkRW51bSk7CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkRW51bSgKKyAgICAgIGZpZWxkLT5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLT5udW1iZXIoKSk7CisgIH0gZWxzZSB7CisgICAgU2V0UmVwZWF0ZWRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCwgdmFsdWUtPm51bWJlcigpKTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGRFbnVtKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEFkZEVudW0sIFJFUEVBVEVELCBFTlVNKTsKKyAgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShBZGRFbnVtKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+QWRkRW51bShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm51bWJlcigpLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgQWRkRmllbGQ8aW50PihtZXNzYWdlLCBmaWVsZCwgdmFsdWUtPm51bWJlcigpKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IE1lc3NhZ2UmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRNZXNzYWdlKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldE1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKKworICBpZiAoZmFjdG9yeSA9PSBOVUxMKSBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5XzsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IE1lc3NhZ2UmPigKKyAgICAgICAgR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldE1lc3NhZ2UoCisgICAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+bWVzc2FnZV90eXBlKCksIGZhY3RvcnkpKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBNZXNzYWdlKiByZXN1bHQ7CisgICAgcmVzdWx0ID0gR2V0UmF3PGNvbnN0IE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICByZXN1bHQgPSBEZWZhdWx0UmF3PGNvbnN0IE1lc3NhZ2UqPihmaWVsZCk7CisgICAgfQorICAgIHJldHVybiAqcmVzdWx0OworICB9Cit9CisKK01lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNdXRhYmxlTWVzc2FnZSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChNdXRhYmxlTWVzc2FnZSwgU0lOR1VMQVIsIE1FU1NBR0UpOworCisgIGlmIChmYWN0b3J5ID09IE5VTEwpIGZhY3RvcnkgPSBtZXNzYWdlX2ZhY3RvcnlfOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWVzc2FnZSo+KAorICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5NdXRhYmxlTWVzc2FnZShmaWVsZCwgZmFjdG9yeSkpOworICB9IGVsc2UgeworICAgIE1lc3NhZ2UqIHJlc3VsdDsKKyAgICBNZXNzYWdlKiogcmVzdWx0X2hvbGRlciA9IE11dGFibGVGaWVsZDxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOworICAgIGlmICgqcmVzdWx0X2hvbGRlciA9PSBOVUxMKSB7CisgICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X21lc3NhZ2UgPSBEZWZhdWx0UmF3PGNvbnN0IE1lc3NhZ2UqPihmaWVsZCk7CisgICAgICAqcmVzdWx0X2hvbGRlciA9IGRlZmF1bHRfbWVzc2FnZS0+TmV3KCk7CisgICAgfQorICAgIHJlc3VsdCA9ICpyZXN1bHRfaG9sZGVyOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlJlbGVhc2VNZXNzYWdlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoUmVsZWFzZU1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKKworICBpZiAoZmFjdG9yeSA9PSBOVUxMKSBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5XzsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+UmVsZWFzZU1lc3NhZ2UoZmllbGQsIGZhY3RvcnkpKTsKKyAgfSBlbHNlIHsKKyAgICBDbGVhckJpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgTWVzc2FnZSoqIHJlc3VsdCA9IE11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICBNZXNzYWdlKiByZXQgPSAqcmVzdWx0OworICAgICpyZXN1bHQgPSBOVUxMOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworY29uc3QgTWVzc2FnZSYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldFJlcGVhdGVkTWVzc2FnZSwgUkVQRUFURUQsIE1FU1NBR0UpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTWVzc2FnZSY+KAorICAgICAgICBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0UmVwZWF0ZWRNZXNzYWdlKGZpZWxkLT5udW1iZXIoKSwgaW5kZXgpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gR2V0UmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgLkdldDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihpbmRleCk7CisgIH0KK30KKworTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZE1lc3NhZ2UoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCisgICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UoCisgICAgICAgICAgZmllbGQtPm51bWJlcigpLCBpbmRleCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgLT5NdXRhYmxlPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KGluZGV4KTsKKyAgfQorfQorCitNZXNzYWdlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkTWVzc2FnZSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChBZGRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7CisKKyAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeV87CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCisgICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZE1lc3NhZ2UoZmllbGQsIGZhY3RvcnkpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBjYW4ndCB1c2UgQWRkRmllbGQ8TWVzc2FnZT4oKSBiZWNhdXNlIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRvZXNuJ3QKKyAgICAvLyBrbm93IGhvdyB0byBhbGxvY2F0ZSBvbmUuCisgICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIHJlcGVhdGVkID0KKyAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpOworICAgIE1lc3NhZ2UqIHJlc3VsdCA9IHJlcGVhdGVkLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgLy8gV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBvYmplY3QuCisgICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGU7CisgICAgICBpZiAocmVwZWF0ZWQtPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHByb3RvdHlwZSA9IGZhY3RvcnktPkdldFByb3RvdHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvdG90eXBlID0gJnJlcGVhdGVkLT5HZXQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oMCk7CisgICAgICB9CisgICAgICByZXN1bHQgPSBwcm90b3R5cGUtPk5ldygpOworICAgICAgcmVwZWF0ZWQtPkFkZEFsbG9jYXRlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK3ZvaWQqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHB0eXBlLAorICAgIGludCBjdHlwZSwgY29uc3QgRGVzY3JpcHRvciogZGVzYykgY29uc3QgeworICBVU0FHRV9DSEVDS19SRVBFQVRFRCgiTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQiKTsKKyAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IGNwcHR5cGUpCisgICAgUmVwb3J0UmVmbGVjdGlvblVzYWdlVHlwZUVycm9yKGRlc2NyaXB0b3JfLAorICAgICAgICBmaWVsZCwgIk11dGFibGVSYXdSZXBlYXRlZEZpZWxkIiwgY3BwdHlwZSk7CisgIGlmIChjdHlwZSA+PSAwKQorICAgIEdPT0dMRV9DSEVDS19FUShmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCksIGN0eXBlKSA8PCAic3VidHlwZSBtaXNtYXRjaCI7CisgIGlmIChkZXNjICE9IE5VTEwpCisgICAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgZGVzYykgPDwgIndyb25nIHN1Ym1lc3NhZ2UgdHlwZSI7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpCisgICAgcmV0dXJuIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAorICAgICAgICBmaWVsZC0+bnVtYmVyKCkpOworICBlbHNlCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBpZiAoZXh0ZW5zaW9uc19vZmZzZXRfID09IC0xKSByZXR1cm4gTlVMTDsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IGRlc2NyaXB0b3JfcG9vbF8tPkZpbmRFeHRlbnNpb25CeU5hbWUobmFtZSk7CisgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZSgpID09IGRlc2NyaXB0b3JfKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBNZXNzYWdlU2V0IGV4dGVuc2lvbnMgbWF5IGJlIGlkZW50aWZpZWQgYnkgdHlwZSBuYW1lLgorICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUgPSBkZXNjcmlwdG9yX3Bvb2xfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUobmFtZSk7CisgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgLy8gTG9vayBmb3IgYSBtYXRjaGluZyBleHRlbnNpb24gaW4gdGhlIGZvcmVpZ24gdHlwZSdzIHNjb3BlLgorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gdHlwZS0+ZXh0ZW5zaW9uKGkpOworICAgICAgICBpZiAoZXh0ZW5zaW9uLT5jb250YWluaW5nX3R5cGUoKSA9PSBkZXNjcmlwdG9yXyAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfb3B0aW9uYWwoKSAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3R5cGUoKSA9PSB0eXBlKSB7CisgICAgICAgICAgLy8gRm91bmQgaXQuCisgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpGaW5kS25vd25FeHRlbnNpb25CeU51bWJlcigKKyAgICBpbnQgbnVtYmVyKSBjb25zdCB7CisgIGlmIChleHRlbnNpb25zX29mZnNldF8gPT0gLTEpIHJldHVybiBOVUxMOworICByZXR1cm4gZGVzY3JpcHRvcl9wb29sXy0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3JfLCBudW1iZXIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTb21lIHByaXZhdGUgaGVscGVycy4KKworLy8gVGhlc2Ugc2ltcGxlIHRlbXBsYXRlIGFjY2Vzc29ycyBvYnRhaW4gcG9pbnRlcnMgKG9yIHJlZmVyZW5jZXMpIHRvCisvLyB0aGUgZ2l2ZW4gZmllbGQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBjb25zdCBUeXBlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmF3KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArCisgICAgICAgICAgICAgICAgICAgIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFR5cGUqPihwdHIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZVJhdygKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VHlwZSo+KHB0cik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIGNvbnN0IFR5cGUmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpEZWZhdWx0UmF3KAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRlZmF1bHRfaW5zdGFuY2VfKSArCisgICAgICAgICAgICAgICAgICAgIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFR5cGUqPihwdHIpOworfQorCitpbmxpbmUgY29uc3QgdWludDMyKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0SGFzQml0cygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKyBoYXNfYml0c19vZmZzZXRfOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIqPihwdHIpOworfQoraW5saW5lIHVpbnQzMiogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVIYXNCaXRzKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgaGFzX2JpdHNfb2Zmc2V0XzsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyKj4ocHRyKTsKK30KKworaW5saW5lIGNvbnN0IEV4dGVuc2lvblNldCYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEV4dGVuc2lvblNldCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfTkUoZXh0ZW5zaW9uc19vZmZzZXRfLCAtMSk7CisgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKworICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zX29mZnNldF87CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHRlbnNpb25TZXQqPihwdHIpOworfQoraW5saW5lIEV4dGVuc2lvblNldCogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVFeHRlbnNpb25TZXQoCisgICAgTWVzc2FnZSogbWVzc2FnZSkgY29uc3QgeworICBHT09HTEVfRENIRUNLX05FKGV4dGVuc2lvbnNfb2Zmc2V0XywgLTEpOworICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBleHRlbnNpb25zX29mZnNldF87CisgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4dGVuc2lvblNldCo+KHB0cik7Cit9CisKKy8vIFNpbXBsZSBhY2Nlc3NvcnMgZm9yIG1hbmlwdWxhdGluZyBoYXNfYml0c18uCitpbmxpbmUgYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6SGFzQml0KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEhhc0JpdHMobWVzc2FnZSlbZmllbGQtPmluZGV4KCkgLyAzMl0gJgorICAgICgxIDw8IChmaWVsZC0+aW5kZXgoKSAlIDMyKSk7Cit9CisKK2lubGluZSB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRCaXQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBNdXRhYmxlSGFzQml0cyhtZXNzYWdlKVtmaWVsZC0+aW5kZXgoKSAvIDMyXSB8PSAoMSA8PCAoZmllbGQtPmluZGV4KCkgJSAzMikpOworfQorCitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6Q2xlYXJCaXQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBNdXRhYmxlSGFzQml0cyhtZXNzYWdlKVtmaWVsZC0+aW5kZXgoKSAvIDMyXSAmPSB+KDEgPDwgKGZpZWxkLT5pbmRleCgpICUgMzIpKTsKK30KKworLy8gVGVtcGxhdGUgaW1wbGVtZW50YXRpb25zIG9mIGJhc2ljIGFjY2Vzc29ycy4gIElubGluZSBiZWNhdXNlIGVhY2gKKy8vIHRlbXBsYXRlIGluc3RhbmNlIGlzIG9ubHkgY2FsbGVkIGZyb20gb25lIGxvY2F0aW9uLiAgVGhlc2UgYXJlCisvLyB1c2VkIGZvciBhbGwgdHlwZXMgZXhjZXB0IG1lc3NhZ2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgY29uc3QgVHlwZSYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEZpZWxkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJhdzxUeXBlPihtZXNzYWdlLCBmaWVsZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdCB7CisgICpNdXRhYmxlUmF3PFR5cGU+KG1lc3NhZ2UsIGZpZWxkKSA9IHZhbHVlOworICBTZXRCaXQobWVzc2FnZSwgZmllbGQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZUZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgU2V0Qml0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIE11dGFibGVSYXc8VHlwZT4obWVzc2FnZSwgZmllbGQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBjb25zdCBUeXBlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRGaWVsZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZEZpZWxkPFR5cGU+ID4obWVzc2FnZSwgZmllbGQpLkdldChpbmRleCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIGNvbnN0IFR5cGUmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZFB0ckZpZWxkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3PFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCkuR2V0KGluZGV4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRGaWVsZCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGludCBpbmRleCwgVHlwZSB2YWx1ZSkgY29uc3QgeworICBNdXRhYmxlUmF3PFJlcGVhdGVkRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCktPlNldChpbmRleCwgdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkRmllbGQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qIHJlcGVhdGVkID0KKyAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCk7CisgIHJldHVybiByZXBlYXRlZC0+TXV0YWJsZShpbmRleCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZEZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdCB7CisgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKS0+QWRkKHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgVHlwZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZEZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiogcmVwZWF0ZWQgPQorICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIHJlcGVhdGVkLT5BZGQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzE0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oCkBAIC0wLDAgKzEsNDE5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKKy8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfUkVGTEVDVElPTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1JFRkxFQ1RJT05fSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKy8vIFRPRE8oamFzb25oKTogUmVtb3ZlIHRoaXMgb25jZSB0aGUgY29tcGlsZXIgY2hhbmdlIHRvIGRpcmVjdGx5IGluY2x1ZGUgdGhpcworLy8gaXMgcmVsZWFzZWQgdG8gY29tcG9uZW50cy4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgdXBiIHsKK25hbWVzcGFjZSBnb29nbGVfb3BlbnNvdXJjZSB7CitjbGFzcyBHTVJfSGFuZGxlcnM7Cit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlX29wZW5zb3VyY2UKK30gIC8vIG5hbWVzcGFjZSB1cGIKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgY2xhc3MgRGVzY3JpcHRvclBvb2w7Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOworCisvLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgorY2xhc3MgRXh0ZW5zaW9uU2V0OyAgICAgICAgICAgICAvLyBleHRlbnNpb25fc2V0LmgKKworLy8gVEhJUyBDTEFTUyBJUyBOT1QgSU5URU5ERUQgRk9SIERJUkVDVCBVU0UuICBJdCBpcyBpbnRlbmRlZCBmb3IgdXNlCisvLyBieSBnZW5lcmF0ZWQgY29kZS4gIFRoaXMgY2xhc3MgaXMganVzdCBhIGJpZyBoYWNrIHRoYXQgcmVkdWNlcyBjb2RlCisvLyBzaXplLgorLy8KKy8vIEEgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgUmVmbGVjdGlvbgorLy8gd2hpY2ggZXhwZWN0cyBhbGwgZmllbGRzIHRvIGJlIGJhY2tlZCBieSBzaW1wbGUgdmFyaWFibGVzIGxvY2F0ZWQgaW4KKy8vIG1lbW9yeS4gIFRoZSBsb2NhdGlvbnMgYXJlIGdpdmVuIHVzaW5nIGEgYmFzZSBwb2ludGVyIGFuZCBhIHNldCBvZgorLy8gb2Zmc2V0cy4KKy8vCisvLyBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZSB1c2VyIHJlcHJlc2VudHMgZmllbGRzIG9mIGVhY2ggdHlwZSBpbiBhIHN0YW5kYXJkCisvLyB3YXksIHNvIHRoYXQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24gY2FuIGNhc3QgdGhlIHZvaWQqIHBvaW50ZXIgdG8KKy8vIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiAgRm9yIHByaW1pdGl2ZSBmaWVsZHMgYW5kIHN0cmluZyBmaWVsZHMsIGVhY2ggZmllbGQKKy8vIHNob3VsZCBiZSByZXByZXNlbnRlZCB1c2luZyB0aGUgb2J2aW91cyBDKysgcHJpbWl0aXZlIHR5cGUuICBFbnVtcyBhbmQKKy8vIE1lc3NhZ2VzIGFyZSBkaWZmZXJlbnQ6CisvLyAgLSBTaW5ndWxhciBNZXNzYWdlIGZpZWxkcyBhcmUgc3RvcmVkIGFzIGEgcG9pbnRlciB0byBhIE1lc3NhZ2UuICBUaGVzZQorLy8gICAgc2hvdWxkIHN0YXJ0IG91dCBOVUxMLCBleGNlcHQgZm9yIGluIHRoZSBkZWZhdWx0IGluc3RhbmNlIHdoZXJlIHRoZXkKKy8vICAgIHNob3VsZCBzdGFydCBvdXQgcG9pbnRpbmcgdG8gb3RoZXIgZGVmYXVsdCBpbnN0YW5jZXMuCisvLyAgLSBFbnVtIGZpZWxkcyBhcmUgc3RvcmVkIGFzIGFuIGludC4gIFRoaXMgaW50IG11c3QgYWx3YXlzIGNvbnRhaW4KKy8vICAgIGEgdmFsaWQgdmFsdWUsIHN1Y2ggdGhhdCBFbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOdW1iZXIoKSB3b3VsZAorLy8gICAgbm90IHJldHVybiBOVUxMLgorLy8gIC0gUmVwZWF0ZWQgZmllbGRzIGFyZSBzdG9yZWQgYXMgUmVwZWF0ZWRGaWVsZHMgb3IgUmVwZWF0ZWRQdHJGaWVsZHMKKy8vICAgIG9mIHdoYXRldmVyIHR5cGUgdGhlIGluZGl2aWR1YWwgZmllbGQgd291bGQgYmUuICBTdHJpbmdzIGFuZAorLy8gICAgTWVzc2FnZXMgdXNlIFJlcGVhdGVkUHRyRmllbGRzIHdoaWxlIGV2ZXJ5dGhpbmcgZWxzZSB1c2VzCisvLyAgICBSZXBlYXRlZEZpZWxkcy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiA6IHB1YmxpYyBSZWZsZWN0aW9uIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbi4KKyAgLy8gUGFyYW1ldGVyczoKKyAgLy8gICBkZXNjcmlwdG9yOiAgICBUaGUgZGVzY3JpcHRvciBmb3IgdGhlIG1lc3NhZ2UgdHlwZSBiZWluZyBpbXBsZW1lbnRlZC4KKyAgLy8gICBkZWZhdWx0X2luc3RhbmNlOiAgVGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIG1lc3NhZ2UuICBUaGlzIGlzIG9ubHkKKyAgLy8gICAgICAgICAgICAgICAgICB1c2VkIHRvIG9idGFpbiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyBvZiBlbWJlZGRlZAorICAvLyAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLCB3aGljaCBHZXRNZXNzYWdlKCkgd2lsbCByZXR1cm4gaWYgdGhlIHBhcnRpY3VsYXIKKyAgLy8gICAgICAgICAgICAgICAgICBzdWItbWVzc2FnZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiAgKFRodXMsIGFsbAorICAvLyAgICAgICAgICAgICAgICAgIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGRzICptdXN0KiBoYXZlIG5vbi1OVUxMIHBvaW50ZXJzCisgIC8vICAgICAgICAgICAgICAgICAgaW4gdGhlIGRlZmF1bHQgaW5zdGFuY2UuKQorICAvLyAgIG9mZnNldHM6ICAgICAgIEFuIGFycmF5IG9mIGludHMgZ2l2aW5nIHRoZSBieXRlIG9mZnNldHMsIHJlbGF0aXZlIHRvCisgIC8vICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlIG9iamVjdCwgb2YgZWFjaCBmaWVsZC4gIFRoZXNlIGNhbgorICAvLyAgICAgICAgICAgICAgICAgIGJlIGNvbXB1dGVkIGF0IGNvbXBpbGUgdGltZSB1c2luZyB0aGUKKyAgLy8gICAgICAgICAgICAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCkgbWFjcm8sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICAgICAgICBiZWxvdy4KKyAgLy8gICBoYXNfYml0c19vZmZzZXQ6ICBPZmZzZXQgaW4gdGhlIG1lc3NhZ2Ugb2YgYW4gYXJyYXkgb2YgdWludDMycyBvZiBzaXplCisgIC8vICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKS8zMiwgcm91bmRlZCB1cC4gIFRoaXMgaXMgYQorICAvLyAgICAgICAgICAgICAgICAgIGJpdGZpZWxkIHdoZXJlIGVhY2ggYml0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgLy8gICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIGZpZWxkIG9mIHRoZSBtZXNzYWdlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAvLyAgICAgICAgICAgICAgICAgIFRoZSBiaXQgZm9yIGZpZWxkIGluZGV4IGkgaXMgb2J0YWluZWQgYnkgdGhlIGV4cHJlc3Npb246CisgIC8vICAgICAgICAgICAgICAgICAgICBoYXNfYml0c1tpIC8gMzJdICYgKDEgPDwgKGkgJSAzMikpCisgIC8vICAgdW5rbm93bl9maWVsZHNfb2Zmc2V0OiAgT2Zmc2V0IGluIHRoZSBtZXNzYWdlIG9mIHRoZSBVbmtub3duRmllbGRTZXQgZm9yCisgIC8vICAgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UuCisgIC8vICAgZXh0ZW5zaW9uc19vZmZzZXQ6ICBPZmZzZXQgaW4gdGhlIG1lc3NhZ2Ugb2YgdGhlIEV4dGVuc2lvblNldCBmb3IgdGhlCisgIC8vICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgb3IgLTEgaWYgdGhlIG1lc3NhZ2UgdHlwZSBoYXMgbm8gZXh0ZW5zaW9uCisgIC8vICAgICAgICAgICAgICAgICAgcmFuZ2VzLgorICAvLyAgIHBvb2w6ICAgICAgICAgIERlc2NyaXB0b3JQb29sIHRvIHNlYXJjaCBmb3IgZXh0ZW5zaW9uIGRlZmluaXRpb25zLiAgT25seQorICAvLyAgICAgICAgICAgICAgICAgIHVzZWQgYnkgRmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKCkgYW5kCisgIC8vICAgICAgICAgICAgICAgICAgRmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoKS4KKyAgLy8gICBmYWN0b3J5OiAgICAgICBNZXNzYWdlRmFjdG9yeSB0byB1c2UgdG8gY29uc3RydWN0IGV4dGVuc2lvbiBtZXNzYWdlcy4KKyAgLy8gICBvYmplY3Rfc2l6ZTogICBUaGUgc2l6ZSBvZiBhIG1lc3NhZ2Ugb2JqZWN0IG9mIHRoaXMgdHlwZSwgYXMgbWVhc3VyZWQKKyAgLy8gICAgICAgICAgICAgICAgICBieSBzaXplb2YoKS4KKyAgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9mZnNldHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19iaXRzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVua25vd25fZmllbGRzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvYmplY3Rfc2l6ZSk7CisgIH5HZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigpOworCisgIC8vIGltcGxlbWVudHMgUmVmbGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBHZXRVbmtub3duRmllbGRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworICBVbmtub3duRmllbGRTZXQqIE11dGFibGVVbmtub3duRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworCisgIGludCBTcGFjZVVzZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CisKKyAgYm9vbCBIYXNGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgaW50IEZpZWxkU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgdm9pZCBDbGVhckZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB2b2lkIFJlbW92ZUxhc3QoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIE1lc3NhZ2UqIFJlbGVhc2VMYXN0KE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB2b2lkIFN3YXAoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyKSBjb25zdDsKKyAgdm9pZCBTd2FwRWxlbWVudHMoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgIGludCBpbmRleDEsIGludCBpbmRleDIpIGNvbnN0OworICB2b2lkIExpc3RGaWVsZHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdDsKKworICBpbnQzMiAgR2V0SW50MzIgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGludDY0ICBHZXRJbnQ2NCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgdWludDMyIEdldFVJbnQzMihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB1aW50NjQgR2V0VUludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGZsb2F0ICBHZXRGbG9hdCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgZG91YmxlIEdldERvdWJsZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBib29sICAgR2V0Qm9vbCAgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHN0cmluZyBHZXRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgY29uc3Qgc3RyaW5nJiBHZXRTdHJpbmdSZWZlcmVuY2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBzY3JhdGNoKSBjb25zdDsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0RW51bShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBjb25zdCBNZXNzYWdlJiBHZXRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OworCisgIHZvaWQgU2V0SW50MzIgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDMyICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0SW50NjQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDY0ICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0VUludDMyKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQzMiB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0VUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQ2NCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0RmxvYXQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGZsb2F0ICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0RG91YmxlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0Qm9vbCAgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0U3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldEVudW0gIChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3Q7CisgIE1lc3NhZ2UqIE11dGFibGVNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3Q7CisgIE1lc3NhZ2UqIFJlbGVhc2VNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3Q7CisKKyAgaW50MzIgIEdldFJlcGVhdGVkSW50MzIgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OworICBpbnQ2NCAgR2V0UmVwZWF0ZWRJbnQ2NCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQzMiBHZXRSZXBlYXRlZFVJbnQzMihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKKyAgdWludDY0IEdldFJlcGVhdGVkVUludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OworICBmbG9hdCAgR2V0UmVwZWF0ZWRGbG9hdCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIGRvdWJsZSBHZXRSZXBlYXRlZERvdWJsZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKKyAgYm9vbCAgIEdldFJlcGVhdGVkQm9vbCAgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OworICBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IHN0cmluZyYgR2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgc3RyaW5nKiBzY3JhdGNoKSBjb25zdDsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0UmVwZWF0ZWRFbnVtKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKyAgY29uc3QgTWVzc2FnZSYgR2V0UmVwZWF0ZWRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKworICAvLyBTZXQgdGhlIHZhbHVlIG9mIGEgZmllbGQuCisgIHZvaWQgU2V0UmVwZWF0ZWRJbnQzMiAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGludDMyICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRJbnQ2NCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGludDY0ICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRVSW50MzIoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIHVpbnQzMiB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRVSW50NjQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIHVpbnQ2NCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRGbG9hdCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGZsb2F0ICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWREb3VibGUoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRCb29sICAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGJvb2wgICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0OworICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gYSBmaWVsZCB3aXRoIGEgbWVzc2FnZSB0eXBlLgorICBNZXNzYWdlKiBNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworCisgIHZvaWQgQWRkSW50MzIgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDMyICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkSW50NjQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDY0ICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkVUludDMyKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQzMiB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkVUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQ2NCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkRmxvYXQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGZsb2F0ICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkRG91YmxlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkQm9vbCAgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgICB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkU3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZEVudW0oTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3Q7CisgIE1lc3NhZ2UqIEFkZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoaW50IG51bWJlcikgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCogTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUsCisgICAgICBpbnQgY3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2U7CisKKyAgLy8gVG8gcGFyc2UgZGlyZWN0bHkgaW50byBhIHByb3RvMiBnZW5lcmF0ZWQgY2xhc3MsIHRoZSBjbGFzcyBHTVJfSGFuZGxlcnMKKyAgLy8gbmVlZHMgYWNjZXNzIHRvIG1lbWJlciBvZmZzZXRzIGFuZCBoYXNiaXRzLgorICBmcmllbmQgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIHVwYjo6Z29vZ2xlX29wZW5zb3VyY2U6OkdNUl9IYW5kbGVyczsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9pbnN0YW5jZV87CisgIGNvbnN0IGludCogb2Zmc2V0c187CisKKyAgaW50IGhhc19iaXRzX29mZnNldF87CisgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXRfOworICBpbnQgZXh0ZW5zaW9uc19vZmZzZXRfOworICBpbnQgb2JqZWN0X3NpemVfOworCisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBkZXNjcmlwdG9yX3Bvb2xfOworICBNZXNzYWdlRmFjdG9yeSogbWVzc2FnZV9mYWN0b3J5XzsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIGNvbnN0IFR5cGUmIEdldFJhdyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIFR5cGUqIE11dGFibGVSYXcoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgY29uc3QgVHlwZSYgRGVmYXVsdFJhdyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICBpbmxpbmUgY29uc3QgdWludDMyKiBHZXRIYXNCaXRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworICBpbmxpbmUgdWludDMyKiBNdXRhYmxlSGFzQml0cyhNZXNzYWdlKiBtZXNzYWdlKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IEV4dGVuc2lvblNldCYgR2V0RXh0ZW5zaW9uU2V0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworICBpbmxpbmUgRXh0ZW5zaW9uU2V0KiBNdXRhYmxlRXh0ZW5zaW9uU2V0KE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworCisgIGlubGluZSBib29sIEhhc0JpdChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFNldEJpdChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIENsZWFyQml0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgY29uc3QgVHlwZSYgR2V0RmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIHZvaWQgU2V0RmllbGQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgVHlwZSYgdmFsdWUpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIFR5cGUqIE11dGFibGVGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIGNvbnN0IFR5cGUmIEdldFJlcGVhdGVkRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSBjb25zdCBUeXBlJiBHZXRSZXBlYXRlZFB0ckZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgdm9pZCBTZXRSZXBlYXRlZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdmFsdWUpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIFR5cGUqIE11dGFibGVSZXBlYXRlZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSB2b2lkIEFkZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSBUeXBlKiBBZGRGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgaW50IEdldEV4dGVuc2lvbk51bWJlck9yRGllKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIGNvbnN0OworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbik7Cit9OworCisvLyBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIGZpZWxkIHdpdGhpbiB0aGUgZ2l2ZW4gYWdncmVnYXRlIHR5cGUuCisvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEFOU0kgQyBvZmZzZXRvZigpIG1hY3JvLiAgSG93ZXZlciwgYWNjb3JkaW5nCisvLyB0byB0aGUgQysrIHN0YW5kYXJkLCBvZmZzZXRvZigpIG9ubHkgd29ya3Mgb24gUE9EIHR5cGVzLCBhbmQgR0NDCisvLyBlbmZvcmNlcyB0aGlzIHJlcXVpcmVtZW50IHdpdGggYSB3YXJuaW5nLiAgSW4gcHJhY3RpY2UsIHRoaXMgcnVsZSBpcworLy8gdW5uZWNlc3NhcmlseSBzdHJpY3Q7IHRoZXJlIGlzIHByb2JhYmx5IG5vIGNvbXBpbGVyIG9yIHBsYXRmb3JtIG9uCisvLyB3aGljaCB0aGUgb2Zmc2V0cyBvZiB0aGUgZGlyZWN0IGZpZWxkcyBvZiBhIGNsYXNzIGFyZSBub24tY29uc3RhbnQuCisvLyBGaWVsZHMgaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzICpjYW4qIGhhdmUgbm9uLWNvbnN0YW50IG9mZnNldHMsCisvLyBidXQgdGhhdCdzIG5vdCB3aGF0IHRoaXMgbWFjcm8gd2lsbCBiZSB1c2VkIGZvci4KKy8vCisvLyBOb3RlIHRoYXQgd2UgY2FsY3VsYXRlIHJlbGF0aXZlIHRvIHRoZSBwb2ludGVyIHZhbHVlIDE2IGhlcmUgc2luY2UgaWYgd2UKKy8vIGp1c3QgdXNlIHplcm8sIEdDQyBjb21wbGFpbnMgYWJvdXQgZGVyZWZlcmVuY2luZyBhIE5VTEwgcG9pbnRlci4gIFdlCisvLyBjaG9vc2UgMTYgcmF0aGVyIHRoYW4gc29tZSBvdGhlciBudW1iZXIganVzdCBpbiBjYXNlIHRoZSBjb21waWxlciB3b3VsZAorLy8gYmUgY29uZnVzZWQgYnkgYW4gdW5hbGlnbmVkIHBvaW50ZXIuCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVFlQRSwgRklFTEQpICAgIFwKKyAgc3RhdGljX2Nhc3Q8aW50PiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAmcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oMTYpLT5GSUVMRCkgLSAgICAgICAgICAgIFwKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigxNikpCisKKy8vIFRoZXJlIGFyZSBzb21lIHBsYWNlcyBpbiBwcm90bzIgd2hlcmUgZHluYW1pY19jYXN0IHdvdWxkIGJlIHVzZWZ1bCBhcyBhbgorLy8gb3B0aW1pemF0aW9uLiAgRm9yIGV4YW1wbGUsIHRha2UgTWVzc2FnZTo6TWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIG90aGVyKS4KKy8vIEZvciBhIGdpdmVuIGdlbmVyYXRlZCBtZXNzYWdlIEZvb01lc3NhZ2UsIHdlIGdlbmVyYXRlIHRoZXNlIHR3byBtZXRob2RzOgorLy8gICB2b2lkIE1lcmdlRnJvbShjb25zdCBGb29NZXNzYWdlJiBvdGhlcik7CisvLyAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIG90aGVyKTsKKy8vIFRoZSBmb3JtZXIgbWV0aG9kIGNhbiBiZSBpbXBsZW1lbnRlZCBkaXJlY3RseSBpbiB0ZXJtcyBvZiBGb29NZXNzYWdlJ3MKKy8vIGlubGluZSBhY2Nlc3NvcnMsIGJ1dCB0aGUgbGF0dGVyIG1ldGhvZCBtdXN0IHdvcmsgd2l0aCB0aGUgcmVmbGVjdGlvbgorLy8gaW50ZXJmYWNlLiAgSG93ZXZlciwgaWYgdGhlIHBhcmFtZXRlciB0byB0aGUgbGF0dGVyIG1ldGhvZCBpcyBhY3R1YWxseSBvZgorLy8gdHlwZSBGb29NZXNzYWdlLCB0aGVuIHdlJ2QgbGlrZSB0byBiZSBhYmxlIHRvIGp1c3QgY2FsbCB0aGUgb3RoZXIgbWV0aG9kCisvLyBhcyBhbiBvcHRpbWl6YXRpb24uICBTbywgd2UgdXNlIGR5bmFtaWNfY2FzdCB0byBjaGVjayB0aGlzLgorLy8KKy8vIFRoYXQgc2FpZCwgZHluYW1pY19jYXN0IHJlcXVpcmVzIFJUVEksIHdoaWNoIG1hbnkgcGVvcGxlIGxpa2UgdG8gZGlzYWJsZQorLy8gZm9yIHBlcmZvcm1hbmNlIGFuZCBjb2RlIHNpemUgcmVhc29ucy4gIFdoZW4gUlRUSSBpcyBub3QgYXZhaWxhYmxlLCB3ZQorLy8gc3RpbGwgbmVlZCB0byBwcm9kdWNlIGNvcnJlY3QgcmVzdWx0cy4gIFNvLCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBmYWxsCisvLyBiYWNrIHRvIHVzaW5nIHJlZmxlY3Rpb24sIHdoaWNoIGlzIHdoYXQgd2Ugd291bGQgaGF2ZSBkb25lIGFueXdheSBpZiB0aGUKKy8vIG9iamVjdHMgd2VyZSBub3Qgb2YgdGhlIGV4YWN0IHNhbWUgY2xhc3MuCisvLworLy8gZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZSgpIGltcGxlbWVudHMgdGhpcyBsb2dpYy4gIElmIFJUVEkgaXMKKy8vIGVuYWJsZWQsIGl0IGRvZXMgYSBkeW5hbWljX2Nhc3QuICBJZiBSVFRJIGlzIGRpc2FibGVkLCBpdCBqdXN0IHJldHVybnMKKy8vIE5VTEwuCisvLworLy8gSWYgeW91IG5lZWQgdG8gY29tcGlsZSB3aXRob3V0IFJUVEksIHNpbXBseSAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJLgorLy8gT24gTVNWQywgdGhpcyBzaG91bGQgYmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4KK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgoraW5saW5lIFRvIGR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGUoRnJvbSBmcm9tKSB7CisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSkgfHwgKGRlZmluZWQoX01TQ19WRVIpJiYhZGVmaW5lZChfQ1BQUlRUSSkpCisgIHJldHVybiBOVUxMOworI2Vsc2UKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxUbz4oZnJvbSk7CisjZW5kaWYKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfUkVGTEVDVElPTl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhYTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNDg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUbyB0ZXN0IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uLCB3ZSBhY3R1YWxseSBsZXQgdGhlIHByb3RvY29sIGNvbXBpbGVyCisvLyBnZW5lcmF0ZSBhIGZ1bGwgcHJvdG9jb2wgbWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlbiB0ZXN0IGl0cworLy8gcmVmbGVjdGlvbiBpbnRlcmZhY2UuICBUaGlzIGlzIG11Y2ggZWFzaWVyIGFuZCBtb3JlIG1haW50YWluYWJsZSB0aGFuCisvLyB0cnlpbmcgdG8gY3JlYXRlIG91ciBvd24gTWVzc2FnZSBjbGFzcyBmb3IgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24KKy8vIHRvIHdyYXAuCisvLworLy8gVGhlIHRlc3RzIGhlcmUgY2xvc2VseSBtaXJyb3Igc29tZSBvZiB0aGUgdGVzdHMgaW4KKy8vIGNvbXBpbGVyL2NwcC91bml0dGVzdCwgZXhjZXB0IHVzaW5nIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZQorLy8gcmF0aGVyIHRoYW4gZ2VuZXJhdGVkIGFjY2Vzc29ycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHsKKworLy8gU2hvcnRoYW5kIHRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBmaWVsZCBvZiB1bml0dGVzdDo6VGVzdEFsbFR5cGVzLgorY29uc3QgRmllbGREZXNjcmlwdG9yKiBGKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUobmFtZSk7CisgIEdPT0dMRV9DSEVDSyhyZXN1bHQgIT0gTlVMTCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBEZWZhdWx0cykgeworICAvLyBDaGVjayB0aGF0IGFsbCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgaW5pdGlhbCBtZXNzYWdlLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICAvLyBNZXNzYWdlcyBzaG91bGQgcmV0dXJuIHBvaW50ZXJzIHRvIGRlZmF1bHQgaW5zdGFuY2VzIHVudGlsIGZpcnN0IHVzZS4KKyAgLy8gKFRoaXMgaXMgbm90IGNoZWNrZWQgYnkgRXhwZWN0Q2xlYXIoKSBzaW5jZSBpdCBpcyBub3QgYWN0dWFsbHkgdHJ1ZSBhZnRlcgorICAvLyB0aGUgZmllbGRzIGhhdmUgYmVlbiBzZXQgYW5kIHRoZW4gY2xlYXJlZC4pCisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEFjY2Vzc29ycykgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBnbyBiYWNrIGFuZCBjaGVjayBhbGwgdGhvc2UKKyAgLy8gdmFsdWVzLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuTW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBHZXRTdHJpbmdSZWZlcmVuY2UpIHsKKyAgLy8gVGVzdCB0aGF0IEdldFN0cmluZ1JlZmVyZW5jZSgpIHJldHVybnMgdGhlIHVuZGVybHlpbmcgc3RyaW5nIHdoZW4gaXQgaXMKKyAgLy8gYSBub3JtYWwgc3RyaW5nIGZpZWxkLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZm9vIik7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdHJpbmcgc2NyYXRjaDsKKworICBFWFBFQ1RfRVEoJm1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCksCisgICAgICAmcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIpLCAmc2NyYXRjaCkpCisgICAgPDwgIkZvciBzaW1wbGUgc3RyaW5nIGZpZWxkcywgR2V0U3RyaW5nUmVmZXJlbmNlKCkgc2hvdWxkIHJldHVybiBhICIKKyAgICAgICAicmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmluZy4iOworICBFWFBFQ1RfRVEoJm1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApLAorICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZzY3JhdGNoKSkKKyAgICA8PCAiRm9yIHNpbXBsZSBzdHJpbmcgZmllbGRzLCBHZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgpIHNob3VsZCByZXR1cm4gIgorICAgICAgICJhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBzdHJpbmcuIjsKK30KKworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgRGVmYXVsdHNBZnRlckNsZWFyKSB7CisgIC8vIENoZWNrIHRoYXQgYWZ0ZXIgc2V0dGluZyBhbGwgZmllbGRzIGFuZCB0aGVuIGNsZWFyaW5nLCBnZXR0aW5nIGFuCisgIC8vIGVtYmVkZGVkIG1lc3NhZ2UgZG9lcyBOT1QgcmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfTkUoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpOworfQorCisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcFdpdGhCb3RoU2V0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEZpZWxkcygmbWVzc2FnZTIpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2ludDMyKDUzMjgxOSk7CisKKyAgcmVmbGVjdGlvbi0+U3dhcCgmbWVzc2FnZTEsICZtZXNzYWdlMik7CisKKyAgRVhQRUNUX0VRKDUzMjgxOSwgbWVzc2FnZTIub3B0aW9uYWxfaW50MzIoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwRXh0ZW5zaW9ucykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwVW5rbm93bikgeworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgbWVzc2FnZTEubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNCwgMSk7CisKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlMi51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5Td2FwKCZtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMi51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVtb3ZlTGFzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuUmVtb3ZlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRzUmVtb3ZlZChtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbW92ZUxhc3RFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlJlbW92ZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkRXh0ZW5zaW9uc1JlbW92ZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZWxlYXNlTGFzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZGVzY3JpcHRvcik7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuUmVsZWFzZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlLCBmYWxzZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZHNSZWxlYXNlZChtZXNzYWdlKTsKKworICAvLyBOb3cgdGVzdCB0aGF0IHdlIGFjdHVhbGx5IHJlbGVhc2UgdGhlIHJpZ2h0IG1lc3NhZ2UuCisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBjb25zdCBwcm90b2J1Zl91bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqIGV4cGVjdGVkID0KKyAgICAgIG1lc3NhZ2UubXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSk7CisgIHNjb3BlZF9wdHI8TWVzc2FnZT4gcmVsZWFzZWQobWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLCByZWxlYXNlZC5nZXQoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZWxlYXNlTGFzdEV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZGVzY3JpcHRvcik7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlJlbGVhc2VMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSwgdHJ1ZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZWxlYXNlZChtZXNzYWdlKTsKKworICAvLyBOb3cgdGVzdCB0aGF0IHdlIGFjdHVhbGx5IHJlbGVhc2UgdGhlIHJpZ2h0IG1lc3NhZ2UuCisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKAorICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBleHBlY3RlZCA9IG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKTsKKyAgc2NvcGVkX3B0cjxNZXNzYWdlPiByZWxlYXNlZChtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+UmVsZWFzZUxhc3QoCisgICAgICAmbWVzc2FnZSwgZGVzY3JpcHRvci0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uIikpKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLCByZWxlYXNlZC5nZXQoKSk7CisKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBSZXBlYXRlZEVsZW1lbnRzKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKworICAvLyBTd2FwIGFuZCB0ZXN0IHRoYXQgZmllbGRzIGFyZSBhbGwgc3dhcHBlZC4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRzU3dhcHBlZChtZXNzYWdlKTsKKworICAvLyBTd2FwIGJhY2sgYW5kIHRlc3QgdGhhdCBmaWVsZHMgYXJlIGFsbCBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlcy4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcFJlcGVhdGVkRWxlbWVudHNFeHRlbnNpb24pIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgLy8gU3dhcCBhbmQgdGVzdCB0aGF0IGZpZWxkcyBhcmUgYWxsIHN3YXBwZWQuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlN3YXBSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc1N3YXBwZWQobWVzc2FnZSk7CisKKyAgLy8gU3dhcCBiYWNrIGFuZCB0ZXN0IHRoYXQgZmllbGRzIGFyZSBhbGwgYmFjayB0byBvcmlnaW5hbCB2YWx1ZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlN3YXBSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBFeHRlbnNpb25zKSB7CisgIC8vIFNldCBldmVyeSBleHRlbnNpb24gdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBnbyBiYWNrIGFuZCBjaGVjayBhbGwgdGhvc2UKKyAgLy8gdmFsdWVzLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5Nb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBGaW5kRXh0ZW5zaW9uVHlwZUJ5TnVtYmVyKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPQorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldFJlZmxlY3Rpb24oKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbjEgPQorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgICAib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uMiA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICJyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uIik7CisKKyAgRVhQRUNUX0VRKGV4dGVuc2lvbjEsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcihleHRlbnNpb24xLT5udW1iZXIoKSkpOworICBFWFBFQ1RfRVEoZXh0ZW5zaW9uMiwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuc2lvbjItPm51bWJlcigpKSk7CisKKyAgLy8gTm9uLWV4aXN0ZW50IGV4dGVuc2lvbi4KKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoNjIzNDEpID09IE5VTEwpOworCisgIC8vIEV4dGVuc2lvbnMgb2YgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIG5vdCBzaG93IHVwIGFzIGV4dGVuc2lvbnMgb2YKKyAgLy8gb3RoZXIgdHlwZXMuCisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXRSZWZsZWN0aW9uKCktPgorICAgICAgICAgICAgICBGaW5kS25vd25FeHRlbnNpb25CeU51bWJlcihleHRlbnNpb24xLT5udW1iZXIoKSkgPT0gTlVMTCk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBGaW5kS25vd25FeHRlbnNpb25CeU5hbWUpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uMSA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICJvcHRpb25hbF9pbnQzMl9leHRlbnNpb24iKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24yID0KKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgInJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24iKTsKKworICBFWFBFQ1RfRVEoZXh0ZW5zaW9uMSwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZShleHRlbnNpb24xLT5mdWxsX25hbWUoKSkpOworICBFWFBFQ1RfRVEoZXh0ZW5zaW9uMiwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZShleHRlbnNpb24yLT5mdWxsX25hbWUoKSkpOworCisgIC8vIE5vbi1leGlzdGVudCBleHRlbnNpb24uCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHQiKSA9PSBOVUxMKTsKKworICAvLyBFeHRlbnNpb25zIG9mIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBub3Qgc2hvdyB1cCBhcyBleHRlbnNpb25zIG9mCisgIC8vIG90aGVyIHR5cGVzLgorICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpLT4KKyAgICAgICAgICAgICAgRmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGV4dGVuc2lvbjEtPmZ1bGxfbmFtZSgpKSA9PSBOVUxMKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbGVhc2VNZXNzYWdlVGVzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgLy8gV2hlbiBub3RoaW5nIGlzIHNldCwgd2UgZXhwZWN0IGFsbCByZWxlYXNlZCBtZXNzYWdlcyB0byBiZSBOVUxMLgorICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBzZXQgd2Ugc2hvdWxkIGdldCBub24tTlVMTCByZWxlYXNlcy4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgQ2xlYXIoKSB3ZSBtYXkgb3IgbWF5IG5vdCBnZXQgYSBtZXNzYWdlIGZyb20gUmVsZWFzZU1lc3NhZ2UoKS4KKyAgLy8gVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkNBTl9CRV9OVUxMKTsKKworICAvLyBUZXN0IGEgZGlmZmVyZW50IGNvZGUgcGF0aCBmb3Igc2V0dGluZyBhZnRlciByZWxlYXNpbmcuCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZUV4dGVuc2lvbk1lc3NhZ2VUZXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7CisKKyAgLy8gV2hlbiBub3RoaW5nIGlzIHNldCwgd2UgZXhwZWN0IGFsbCByZWxlYXNlZCBtZXNzYWdlcyB0byBiZSBOVUxMLgorICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBzZXQgd2Ugc2hvdWxkIGdldCBub24tTlVMTCByZWxlYXNlcy4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgQ2xlYXIoKSB3ZSBtYXkgb3IgbWF5IG5vdCBnZXQgYSBtZXNzYWdlIGZyb20gUmVsZWFzZU1lc3NhZ2UoKS4KKyAgLy8gVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkNBTl9CRV9OVUxMKTsKKworICAvLyBUZXN0IGEgZGlmZmVyZW50IGNvZGUgcGF0aCBmb3Igc2V0dGluZyBhZnRlciByZWxlYXNpbmcuCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Cit9CisKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgVXNhZ2VFcnJvcnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKworI2RlZmluZSBmKE5BTUUpIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShOQU1FKQorCisgIC8vIFRlc3RpbmcgZXZlcnkgc2luZ2xlIGZhaWx1cmUgbW9kZSB3b3VsZCBiZSB0b28gbXVjaCB3b3JrLiAgTGV0J3MganVzdAorICAvLyBjaGVjayBhIGZldy4KKyAgRVhQRUNUX0RFQVRIKAorICAgIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQ2NCIpKSwKKyAgICAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjpHZXRJbnQzMlxuIgorICAgICIgIE1lc3NhZ2UgdHlwZTogcHJvdG9idWZfdW5pdHRlc3RcXC5UZXN0QWxsVHlwZXNcbiIKKyAgICAiICBGaWVsZCAgICAgICA6IHByb3RvYnVmX3VuaXR0ZXN0XFwuVGVzdEFsbFR5cGVzXFwub3B0aW9uYWxfaW50NjRcbiIKKyAgICAiICBQcm9ibGVtICAgICA6IEZpZWxkIGlzIG5vdCB0aGUgcmlnaHQgdHlwZSBmb3IgdGhpcyBtZXNzYWdlOlxuIgorICAgICIgICAgRXhwZWN0ZWQgIDogQ1BQVFlQRV9JTlQzMlxuIgorICAgICIgICAgRmllbGQgdHlwZTogQ1BQVFlQRV9JTlQ2NCIpOworICBFWFBFQ1RfREVBVEgoCisgICAgcmVmbGVjdGlvbi0+R2V0SW50MzIoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIikpLAorICAgICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKKyAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246OkdldEludDMyXG4iCisgICAgIiAgTWVzc2FnZSB0eXBlOiBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcbiIKKyAgICAiICBGaWVsZCAgICAgICA6IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5yZXBlYXRlZF9pbnQzMlxuIgorICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgaXMgcmVwZWF0ZWQ7IHRoZSBtZXRob2QgcmVxdWlyZXMgYSBzaW5ndWxhciBmaWVsZC4iKTsKKyAgRVhQRUNUX0RFQVRIKAorICAgIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiYyIpKSwKKyAgICAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjpHZXRJbnQzMlxuIgorICAgICIgIE1lc3NhZ2UgdHlwZTogcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXG4iCisgICAgIiAgRmllbGQgICAgICAgOiBwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZS5jXG4iCisgICAgIiAgUHJvYmxlbSAgICAgOiBGaWVsZCBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7CisgIEVYUEVDVF9ERUFUSCgKKyAgICByZWZsZWN0aW9uLT5IYXNGaWVsZCgKKyAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImMiKSksCisgICAgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgorICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6SGFzRmllbGRcbiIKKyAgICAiICBNZXNzYWdlIHR5cGU6IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1xuIgorICAgICIgIEZpZWxkICAgICAgIDogcHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2UuY1xuIgorICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOworCisjdW5kZWYgZgorfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisKKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzMjE1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjCkBAIC0wLDAgKzEsNTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworZG91YmxlIEluZmluaXR5KCkgeworICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOworfQorZG91YmxlIE5hTigpIHsKKyAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7Cit9CisKK2NvbnN0IDo6c3RkOjpzdHJpbmcga0VtcHR5U3RyaW5nOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmYjhmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmgKQEAgLTAsMCArMSw3NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgaGVscGVyIGNvZGUgdXNlZCBieSBnZW5lcmF0ZWQgY29kZSAtLQorLy8gaW5jbHVkaW5nIGxpdGUgdHlwZXMgLS0gYnV0IHdoaWNoIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSB1c2Vycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVVRJTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1VUSUxfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBbm5vdGF0aW9uIGZvciB0aGUgY29tcGlsZXIgdG8gZW1pdCBhIGRlcHJlY2F0aW9uIG1lc3NhZ2UgaWYgYSBmaWVsZCBtYXJrZWQKKy8vIHdpdGggb3B0aW9uICdkZXByZWNhdGVkPXRydWUnIGlzIHVzZWQgaW4gdGhlIGNvZGUsIG9yIGZvciBvdGhlciB0aGluZ3MgaW4KKy8vIGdlbmVyYXRlZCBjb2RlIHdoaWNoIGFyZSBkZXByZWNhdGVkLgorLy8KKy8vIEZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIHBiLmNjIGZpbGVzLCBkZXByZWNhdGlvbiB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZAorLy8gdGhlcmUuCisjdW5kZWYgREVQUkVDQVRFRF9QUk9UT0JVRl9GSUVMRAorI2RlZmluZSBQUk9UT0JVRl9ERVBSRUNBVEVECisKKworLy8gQ29uc3RhbnRzIGZvciBzcGVjaWFsIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KK0xJQlBST1RPQlVGX0VYUE9SVCBkb3VibGUgSW5maW5pdHkoKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBkb3VibGUgTmFOKCk7CisKKy8vIENvbnN0YW50IHVzZWQgZm9yIGVtcHR5IGRlZmF1bHQgc3RyaW5ncy4KK0xJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gY29uc3QgOjpzdGQ6OnN0cmluZyBrRW1wdHlTdHJpbmc7CisKKy8vIERlZmluZWQgaW4gZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYyAtLSBub3QgYWN0dWFsbHkgcGFydCBvZiB0aGUgbGl0ZQorLy8gbGlicmFyeS4KKy8vCisvLyBUT0RPKGphc29uaCk6IFRoZSB2YXJpb3VzIGNhbGxlcnMgZ2V0IHRoaXMgZGVjbGFyYXRpb24gZnJvbSBhIHZhcmlldHkgb2YKKy8vIHBsYWNlczogcHJvYmFibHkgaW4gbW9zdCBjYXNlcyByZXBlYXRlZF9maWVsZC5oLiBDbGVhbiB0aGVzZSB1cCBzbyB0aGV5IGFsbAorLy8gZ2V0IHRoZSBkZWNsYXJhdGlvbiBmcm9tIHRoaXMgZmlsZS4KK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZihjb25zdCBzdHJpbmcmIHN0cik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFkZDhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYwpAQCAtMCwwICsxLDg1NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoZWF2aWx5IG9wdGltaXplZCB0byBtYWtlIHJlYWRzIGFuZCB3cml0ZXMKKy8vIG9mIHNtYWxsIHZhbHVlcyAoZXNwZWNpYWxseSB2YXJpbnRzKSBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgSW4KKy8vIHBhcnRpY3VsYXIsIHdlIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgdGhhdCBhIHJlYWQgb3IgYSB3cml0ZQorLy8gd2lsbCBub3QgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBzaW5jZSB3ZSBjYW4gYXZvaWQgYSBsb3QKKy8vIG9mIGJyYW5jaGluZyBpbiB0aGlzIGNhc2UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3QgaW50IGtNYXhWYXJpbnRCeXRlcyA9IDEwOworc3RhdGljIGNvbnN0IGludCBrTWF4VmFyaW50MzJCeXRlcyA9IDU7CisKKworaW5saW5lIGJvb2wgTmV4dE5vbkVtcHR5KFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgYm9vbCBzdWNjZXNzOworICBkbyB7CisgICAgc3VjY2VzcyA9IGlucHV0LT5OZXh0KGRhdGEsIHNpemUpOworICB9IHdoaWxlIChzdWNjZXNzICYmICpzaXplID09IDApOworICByZXR1cm4gc3VjY2VzczsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIENvZGVkSW5wdXRTdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29kZWRJbnB1dFN0cmVhbTo6fkNvZGVkSW5wdXRTdHJlYW0oKSB7CisgIGlmIChpbnB1dF8gIT0gTlVMTCkgeworICAgIEJhY2tVcElucHV0VG9DdXJyZW50UG9zaXRpb24oKTsKKyAgfQorCisgIGlmICh0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8gPT0gLTIpIHsKKyAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgd2FzICIgPDwgdG90YWxfYnl0ZXNfcmVhZF87CisgIH0KK30KKworLy8gU3RhdGljLgoraW50IENvZGVkSW5wdXRTdHJlYW06OmRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XyA9IDEwMDsKKworCit2b2lkIENvZGVkSW5wdXRTdHJlYW06OkJhY2tVcElucHV0VG9DdXJyZW50UG9zaXRpb24oKSB7CisgIGludCBiYWNrdXBfYnl0ZXMgPSBCdWZmZXJTaXplKCkgKyBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gKyBvdmVyZmxvd19ieXRlc187CisgIGlmIChiYWNrdXBfYnl0ZXMgPiAwKSB7CisgICAgaW5wdXRfLT5CYWNrVXAoYmFja3VwX2J5dGVzKTsKKworICAgIC8vIHRvdGFsX2J5dGVzX3JlYWRfIGRvZXNuJ3QgaW5jbHVkZSBvdmVyZmxvd19ieXRlc18uCisgICAgdG90YWxfYnl0ZXNfcmVhZF8gLT0gQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOworICAgIGJ1ZmZlcl9lbmRfID0gYnVmZmVyXzsKKyAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPSAwOworICAgIG92ZXJmbG93X2J5dGVzXyA9IDA7CisgIH0KK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6UmVjb21wdXRlQnVmZmVyTGltaXRzKCkgeworICBidWZmZXJfZW5kXyArPSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF87CisgIGludCBjbG9zZXN0X2xpbWl0ID0gbWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOworICBpZiAoY2xvc2VzdF9saW1pdCA8IHRvdGFsX2J5dGVzX3JlYWRfKSB7CisgICAgLy8gVGhlIGxpbWl0IHBvc2l0aW9uIGlzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4gIFdlIG11c3QgYWRqdXN0CisgICAgLy8gdGhlIGJ1ZmZlciBzaXplIGFjY29yZGluZ2x5LgorICAgIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyA9IHRvdGFsX2J5dGVzX3JlYWRfIC0gY2xvc2VzdF9saW1pdDsKKyAgICBidWZmZXJfZW5kXyAtPSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF87CisgIH0gZWxzZSB7CisgICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID0gMDsKKyAgfQorfQorCitDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBDb2RlZElucHV0U3RyZWFtOjpQdXNoTGltaXQoaW50IGJ5dGVfbGltaXQpIHsKKyAgLy8gQ3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCisgIGludCBjdXJyZW50X3Bvc2l0aW9uID0gQ3VycmVudFBvc2l0aW9uKCk7CisKKyAgTGltaXQgb2xkX2xpbWl0ID0gY3VycmVudF9saW1pdF87CisKKyAgLy8gc2VjdXJpdHk6IGJ5dGVfbGltaXQgaXMgcG9zc2libHkgZXZpbCwgc28gY2hlY2sgZm9yIG5lZ2F0aXZlIHZhbHVlcworICAvLyBhbmQgb3ZlcmZsb3cuCisgIGlmIChieXRlX2xpbWl0ID49IDAgJiYKKyAgICAgIGJ5dGVfbGltaXQgPD0gSU5UX01BWCAtIGN1cnJlbnRfcG9zaXRpb24pIHsKKyAgICBjdXJyZW50X2xpbWl0XyA9IGN1cnJlbnRfcG9zaXRpb24gKyBieXRlX2xpbWl0OworICB9IGVsc2UgeworICAgIC8vIE5lZ2F0aXZlIG9yIG92ZXJmbG93LgorICAgIGN1cnJlbnRfbGltaXRfID0gSU5UX01BWDsKKyAgfQorCisgIC8vIFdlIG5lZWQgdG8gZW5mb3JjZSBhbGwgbGltaXRzLCBub3QganVzdCB0aGUgbmV3IG9uZSwgc28gaWYgdGhlIHByZXZpb3VzCisgIC8vIGxpbWl0IHdhcyBiZWZvcmUgdGhlIG5ldyByZXF1ZXN0ZWQgbGltaXQsIHdlIGNvbnRpbnVlIHRvIGVuZm9yY2UgdGhlCisgIC8vIHByZXZpb3VzIGxpbWl0LgorICBjdXJyZW50X2xpbWl0XyA9IG1pbihjdXJyZW50X2xpbWl0Xywgb2xkX2xpbWl0KTsKKworICBSZWNvbXB1dGVCdWZmZXJMaW1pdHMoKTsKKyAgcmV0dXJuIG9sZF9saW1pdDsKK30KKwordm9pZCBDb2RlZElucHV0U3RyZWFtOjpQb3BMaW1pdChMaW1pdCBsaW1pdCkgeworICAvLyBUaGUgbGltaXQgcGFzc2VkIGluIGlzIGFjdHVhbGx5IHRoZSAqb2xkKiBsaW1pdCwgd2hpY2ggd2UgcmV0dXJuZWQgZnJvbQorICAvLyBQdXNoTGltaXQoKS4KKyAgY3VycmVudF9saW1pdF8gPSBsaW1pdDsKKyAgUmVjb21wdXRlQnVmZmVyTGltaXRzKCk7CisKKyAgLy8gV2UgbWF5IG5vIGxvbmdlciBiZSBhdCBhIGxlZ2l0aW1hdGUgbWVzc2FnZSBlbmQuICBSZWFkVGFnKCkgbmVlZHMgdG8gYmUKKyAgLy8gY2FsbGVkIGFnYWluIHRvIGZpbmQgb3V0LgorICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IGZhbHNlOworfQorCitpbnQgQ29kZWRJbnB1dFN0cmVhbTo6Qnl0ZXNVbnRpbExpbWl0KCkgY29uc3QgeworICBpZiAoY3VycmVudF9saW1pdF8gPT0gSU5UX01BWCkgcmV0dXJuIC0xOworICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IEN1cnJlbnRQb3NpdGlvbigpOworCisgIHJldHVybiBjdXJyZW50X2xpbWl0XyAtIGN1cnJlbnRfcG9zaXRpb247Cit9CisKK3ZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6U2V0VG90YWxCeXRlc0xpbWl0KAorICAgIGludCB0b3RhbF9ieXRlc19saW1pdCwgaW50IHdhcm5pbmdfdGhyZXNob2xkKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGUgbGltaXQgaXNuJ3QgYWxyZWFkeSBwYXN0LCBzaW5jZSB0aGlzIGNvdWxkIGNvbmZ1c2Ugb3RoZXIKKyAgLy8gY29kZS4KKyAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSBDdXJyZW50UG9zaXRpb24oKTsKKyAgdG90YWxfYnl0ZXNfbGltaXRfID0gbWF4KGN1cnJlbnRfcG9zaXRpb24sIHRvdGFsX2J5dGVzX2xpbWl0KTsKKyAgaWYgKHdhcm5pbmdfdGhyZXNob2xkID49IDApIHsKKyAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8gPSB3YXJuaW5nX3RocmVzaG9sZDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3YXJuaW5nX3RocmVzaG9sZCBpcyBuZWdhdGl2ZQorICAgIHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXyA9IC0xOworICB9CisgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOworfQorCit2b2lkIENvZGVkSW5wdXRTdHJlYW06OlByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKSB7CisgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJBIHByb3RvY29sIG1lc3NhZ2Ugd2FzIHJlamVjdGVkIGJlY2F1c2UgaXQgd2FzIHRvbyAiCisgICAgICAgICAgICAgICAgImJpZyAobW9yZSB0aGFuICIgPDwgdG90YWxfYnl0ZXNfbGltaXRfCisgICAgICAgICAgICAgPDwgIiBieXRlcykuICBUbyBpbmNyZWFzZSB0aGUgbGltaXQgKG9yIHRvIGRpc2FibGUgdGhlc2UgIgorICAgICAgICAgICAgICAgICJ3YXJuaW5ncyksIHNlZSBDb2RlZElucHV0U3RyZWFtOjpTZXRUb3RhbEJ5dGVzTGltaXQoKSAiCisgICAgICAgICAgICAgICAgImluIGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaC4iOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGlmIChjb3VudCA8IDApIHJldHVybiBmYWxzZTsgIC8vIHNlY3VyaXR5OiBjb3VudCBpcyBvZnRlbiB1c2VyLXN1cHBsaWVkCisKKyAgY29uc3QgaW50IG9yaWdpbmFsX2J1ZmZlcl9zaXplID0gQnVmZmVyU2l6ZSgpOworCisgIGlmIChjb3VudCA8PSBvcmlnaW5hbF9idWZmZXJfc2l6ZSkgeworICAgIC8vIEp1c3Qgc2tpcHBpbmcgd2l0aGluIHRoZSBjdXJyZW50IGJ1ZmZlci4gIEVhc3kuCisgICAgQWR2YW5jZShjb3VudCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCkgeworICAgIC8vIFdlIGhpdCBhIGxpbWl0IGluc2lkZSB0aGlzIGJ1ZmZlci4gIEFkdmFuY2UgdG8gdGhlIGxpbWl0IGFuZCBmYWlsLgorICAgIEFkdmFuY2Uob3JpZ2luYWxfYnVmZmVyX3NpemUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvdW50IC09IG9yaWdpbmFsX2J1ZmZlcl9zaXplOworICBidWZmZXJfID0gTlVMTDsKKyAgYnVmZmVyX2VuZF8gPSBidWZmZXJfOworCisgIC8vIE1ha2Ugc3VyZSB0aGlzIHNraXAgZG9lc24ndCB0cnkgdG8gc2tpcCBwYXN0IHRoZSBjdXJyZW50IGxpbWl0LgorICBpbnQgY2xvc2VzdF9saW1pdCA9IG1pbihjdXJyZW50X2xpbWl0XywgdG90YWxfYnl0ZXNfbGltaXRfKTsKKyAgaW50IGJ5dGVzX3VudGlsX2xpbWl0ID0gY2xvc2VzdF9saW1pdCAtIHRvdGFsX2J5dGVzX3JlYWRfOworICBpZiAoYnl0ZXNfdW50aWxfbGltaXQgPCBjb3VudCkgeworICAgIC8vIFdlIGhpdCB0aGUgbGltaXQuICBTa2lwIHVwIHRvIGl0IHRoZW4gZmFpbC4KKyAgICBpZiAoYnl0ZXNfdW50aWxfbGltaXQgPiAwKSB7CisgICAgICB0b3RhbF9ieXRlc19yZWFkXyA9IGNsb3Nlc3RfbGltaXQ7CisgICAgICBpbnB1dF8tPlNraXAoYnl0ZXNfdW50aWxfbGltaXQpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0b3RhbF9ieXRlc19yZWFkXyArPSBjb3VudDsKKyAgcmV0dXJuIGlucHV0Xy0+U2tpcChjb3VudCk7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6R2V0RGlyZWN0QnVmZmVyUG9pbnRlcihjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChCdWZmZXJTaXplKCkgPT0gMCAmJiAhUmVmcmVzaCgpKSByZXR1cm4gZmFsc2U7CisKKyAgKmRhdGEgPSBidWZmZXJfOworICAqc2l6ZSA9IEJ1ZmZlclNpemUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFJhdyh2b2lkKiBidWZmZXIsIGludCBzaXplKSB7CisgIGludCBjdXJyZW50X2J1ZmZlcl9zaXplOworICB3aGlsZSAoKGN1cnJlbnRfYnVmZmVyX3NpemUgPSBCdWZmZXJTaXplKCkpIDwgc2l6ZSkgeworICAgIC8vIFJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLiAgQ29weSB3aGF0IHdlIGhhdmUsIHRoZW4gcmVmcmVzaC4KKyAgICBtZW1jcHkoYnVmZmVyLCBidWZmZXJfLCBjdXJyZW50X2J1ZmZlcl9zaXplKTsKKyAgICBidWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYnVmZmVyKSArIGN1cnJlbnRfYnVmZmVyX3NpemU7CisgICAgc2l6ZSAtPSBjdXJyZW50X2J1ZmZlcl9zaXplOworICAgIEFkdmFuY2UoY3VycmVudF9idWZmZXJfc2l6ZSk7CisgICAgaWYgKCFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG1lbWNweShidWZmZXIsIGJ1ZmZlcl8sIHNpemUpOworICBBZHZhbmNlKHNpemUpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRTdHJpbmcoc3RyaW5nKiBidWZmZXIsIGludCBzaXplKSB7CisgIGlmIChzaXplIDwgMCkgcmV0dXJuIGZhbHNlOyAgLy8gc2VjdXJpdHk6IHNpemUgaXMgb2Z0ZW4gdXNlci1zdXBwbGllZAorICByZXR1cm4gSW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKGJ1ZmZlciwgc2l6ZSk7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFN0cmluZ0ZhbGxiYWNrKHN0cmluZyogYnVmZmVyLCBpbnQgc2l6ZSkgeworICBpZiAoIWJ1ZmZlci0+ZW1wdHkoKSkgeworICAgIGJ1ZmZlci0+Y2xlYXIoKTsKKyAgfQorCisgIGludCBjdXJyZW50X2J1ZmZlcl9zaXplOworICB3aGlsZSAoKGN1cnJlbnRfYnVmZmVyX3NpemUgPSBCdWZmZXJTaXplKCkpIDwgc2l6ZSkgeworICAgIC8vIFNvbWUgU1RMIGltcGxlbWVudGF0aW9ucyAiaGVscGZ1bGx5IiBjcmFzaCBvbiBidWZmZXItPmFwcGVuZChOVUxMLCAwKS4KKyAgICBpZiAoY3VycmVudF9idWZmZXJfc2l6ZSAhPSAwKSB7CisgICAgICAvLyBOb3RlOiAgc3RyaW5nMS5hcHBlbmQoc3RyaW5nMikgaXMgTyhzdHJpbmcyLnNpemUoKSkgKGFzIG9wcG9zZWQgdG8KKyAgICAgIC8vICAgTyhzdHJpbmcxLnNpemUoKSArIHN0cmluZzIuc2l6ZSgpKSwgd2hpY2ggd291bGQgYmUgYmFkKS4KKyAgICAgIGJ1ZmZlci0+YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcl8pLAorICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXJfc2l6ZSk7CisgICAgfQorICAgIHNpemUgLT0gY3VycmVudF9idWZmZXJfc2l6ZTsKKyAgICBBZHZhbmNlKGN1cnJlbnRfYnVmZmVyX3NpemUpOworICAgIGlmICghUmVmcmVzaCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICBidWZmZXItPmFwcGVuZChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXJfKSwgc2l6ZSk7CisgIEFkdmFuY2Uoc2l6ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGYWxsYmFjayh1aW50MzIqIHZhbHVlKSB7CisgIHVpbnQ4IGJ5dGVzW3NpemVvZigqdmFsdWUpXTsKKworICBjb25zdCB1aW50OCogcHRyOworICBpZiAoQnVmZmVyU2l6ZSgpID49IHNpemVvZigqdmFsdWUpKSB7CisgICAgLy8gRmFzdCBwYXRoOiAgRW5vdWdoIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcmVhZCBkaXJlY3RseS4KKyAgICBwdHIgPSBidWZmZXJfOworICAgIEFkdmFuY2Uoc2l6ZW9mKCp2YWx1ZSkpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogIEhhZCB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgIGlmICghUmVhZFJhdyhieXRlcywgc2l6ZW9mKCp2YWx1ZSkpKSByZXR1cm4gZmFsc2U7CisgICAgcHRyID0gYnl0ZXM7CisgIH0KKyAgUmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5KHB0ciwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuNjRGYWxsYmFjayh1aW50NjQqIHZhbHVlKSB7CisgIHVpbnQ4IGJ5dGVzW3NpemVvZigqdmFsdWUpXTsKKworICBjb25zdCB1aW50OCogcHRyOworICBpZiAoQnVmZmVyU2l6ZSgpID49IHNpemVvZigqdmFsdWUpKSB7CisgICAgLy8gRmFzdCBwYXRoOiAgRW5vdWdoIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcmVhZCBkaXJlY3RseS4KKyAgICBwdHIgPSBidWZmZXJfOworICAgIEFkdmFuY2Uoc2l6ZW9mKCp2YWx1ZSkpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogIEhhZCB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgIGlmICghUmVhZFJhdyhieXRlcywgc2l6ZW9mKCp2YWx1ZSkpKSByZXR1cm4gZmFsc2U7CisgICAgcHRyID0gYnl0ZXM7CisgIH0KKyAgUmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KHB0ciwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHsKKworaW5saW5lIGNvbnN0IHVpbnQ4KiBSZWFkVmFyaW50MzJGcm9tQXJyYXkoCisgICAgY29uc3QgdWludDgqIGJ1ZmZlciwgdWludDMyKiB2YWx1ZSkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworaW5saW5lIGNvbnN0IHVpbnQ4KiBSZWFkVmFyaW50MzJGcm9tQXJyYXkoY29uc3QgdWludDgqIGJ1ZmZlciwgdWludDMyKiB2YWx1ZSkgeworICAvLyBGYXN0IHBhdGg6ICBXZSBoYXZlIGVub3VnaCBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIgdG8gZ3VhcmFudGVlIHRoYXQKKyAgLy8gdGhpcyByZWFkIHdvbid0IGNyb3NzIHRoZSBlbmQsIHNvIHdlIGNhbiBza2lwIHRoZSBjaGVja3MuCisgIGNvbnN0IHVpbnQ4KiBwdHIgPSBidWZmZXI7CisgIHVpbnQzMiBiOworICB1aW50MzIgcmVzdWx0OworCisgIGIgPSAqKHB0cisrKTsgcmVzdWx0ICA9IChiICYgMHg3RikgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICBiID0gKihwdHIrKyk7IHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgYiA9ICoocHRyKyspOyByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgIGIgPSAqKHB0cisrKTsgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgMjE7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICBiID0gKihwdHIrKyk7IHJlc3VsdCB8PSAgYiAgICAgICAgIDw8IDI4OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKworICAvLyBJZiB0aGUgaW5wdXQgaXMgbGFyZ2VyIHRoYW4gMzIgYml0cywgd2Ugc3RpbGwgbmVlZCB0byByZWFkIGl0IGFsbAorICAvLyBhbmQgZGlzY2FyZCB0aGUgaGlnaC1vcmRlciBiaXRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhWYXJpbnRCeXRlcyAtIGtNYXhWYXJpbnQzMkJ5dGVzOyBpKyspIHsKKyAgICBiID0gKihwdHIrKyk7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICB9CisKKyAgLy8gV2UgaGF2ZSBvdmVycnVuIHRoZSBtYXhpbXVtIHNpemUgb2YgYSB2YXJpbnQgKDEwIGJ5dGVzKS4gIEFzc3VtZQorICAvLyB0aGUgZGF0YSBpcyBjb3JydXB0LgorICByZXR1cm4gTlVMTDsKKworIGRvbmU6CisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHB0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyU2xvdyh1aW50MzIqIHZhbHVlKSB7CisgIHVpbnQ2NCByZXN1bHQ7CisgIC8vIERpcmVjdGx5IGludm9rZSBSZWFkVmFyaW50NjRGYWxsYmFjaywgc2luY2Ugd2UgYWxyZWFkeSB0cmllZCB0byBvcHRpbWl6ZQorICAvLyBmb3Igb25lLWJ5dGUgdmFyaW50cy4KKyAgaWYgKCFSZWFkVmFyaW50NjRGYWxsYmFjaygmcmVzdWx0KSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSAodWludDMyKXJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyRmFsbGJhY2sodWludDMyKiB2YWx1ZSkgeworICBpZiAoQnVmZmVyU2l6ZSgpID49IGtNYXhWYXJpbnRCeXRlcyB8fAorICAgICAgLy8gT3B0aW1pemF0aW9uOiAgSWYgdGhlIHZhcmludCBlbmRzIGF0IGV4YWN0bHkgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLAorICAgICAgLy8gd2UgY2FuIGRldGVjdCB0aGF0IGFuZCBzdGlsbCB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICAgIChidWZmZXJfZW5kXyA+IGJ1ZmZlcl8gJiYgIShidWZmZXJfZW5kX1stMV0gJiAweDgwKSkpIHsKKyAgICBjb25zdCB1aW50OCogZW5kID0gUmVhZFZhcmludDMyRnJvbUFycmF5KGJ1ZmZlcl8sIHZhbHVlKTsKKyAgICBpZiAoZW5kID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICBidWZmZXJfID0gZW5kOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIC8vIFJlYWxseSBzbG93IGNhc2U6IHdlIHdpbGwgaW5jdXIgdGhlIGNvc3Qgb2YgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbCBoZXJlLAorICAgIC8vIGJ1dCBtb3ZpbmcgdGhpcyBvdXQgb2YgbGluZSByZWR1Y2VzIHRoZSBzaXplIG9mIHRoaXMgZnVuY3Rpb24sIHdoaWNoCisgICAgLy8gaW1wcm92ZXMgdGhlIGNvbW1vbiBjYXNlLiBJbiBtaWNybyBiZW5jaG1hcmtzLCB0aGlzIGlzIHdvcnRoIGFib3V0IDEwLTE1JQorICAgIHJldHVybiBSZWFkVmFyaW50MzJTbG93KHZhbHVlKTsKKyAgfQorfQorCit1aW50MzIgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFRhZ1Nsb3coKSB7CisgIGlmIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfKSB7CisgICAgLy8gQ2FsbCByZWZyZXNoLgorICAgIGlmICghUmVmcmVzaCgpKSB7CisgICAgICAvLyBSZWZyZXNoIGZhaWxlZC4gIE1ha2Ugc3VyZSB0aGF0IGl0IGZhaWxlZCBkdWUgdG8gRU9GLCBub3QgYmVjYXVzZQorICAgICAgLy8gd2UgaGl0IHRvdGFsX2J5dGVzX2xpbWl0Xywgd2hpY2gsIHVubGlrZSBub3JtYWwgbGltaXRzLCBpcyBub3QgYQorICAgICAgLy8gdmFsaWQgcGxhY2UgdG8gZW5kIGEgbWVzc2FnZS4KKyAgICAgIGludCBjdXJyZW50X3Bvc2l0aW9uID0gdG90YWxfYnl0ZXNfcmVhZF8gLSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF87CisgICAgICBpZiAoY3VycmVudF9wb3NpdGlvbiA+PSB0b3RhbF9ieXRlc19saW1pdF8pIHsKKyAgICAgICAgLy8gSGl0IHRvdGFsX2J5dGVzX2xpbWl0Xy4gIEJ1dCBpZiB3ZSBhbHNvIGhpdCB0aGUgbm9ybWFsIGxpbWl0LAorICAgICAgICAvLyB3ZSdyZSBzdGlsbCBPSy4KKyAgICAgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gPSBjdXJyZW50X2xpbWl0XyA9PSB0b3RhbF9ieXRlc19saW1pdF87CisgICAgICB9IGVsc2UgeworICAgICAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICAvLyBGb3IgdGhlIHNsb3cgcGF0aCwganVzdCBkbyBhIDY0LWJpdCByZWFkLiBUcnkgdG8gb3B0aW1pemUgZm9yIG9uZS1ieXRlIHRhZ3MKKyAgLy8gYWdhaW4sIHNpbmNlIHdlIGhhdmUgbm93IHJlZnJlc2hlZCB0aGUgYnVmZmVyLgorICB1aW50NjQgcmVzdWx0ID0gMDsKKyAgaWYgKCFSZWFkVmFyaW50NjQoJnJlc3VsdCkpIHJldHVybiAwOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPihyZXN1bHQpOworfQorCit1aW50MzIgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFRhZ0ZhbGxiYWNrKCkgeworICBjb25zdCBpbnQgYnVmX3NpemUgPSBCdWZmZXJTaXplKCk7CisgIGlmIChidWZfc2l6ZSA+PSBrTWF4VmFyaW50Qnl0ZXMgfHwKKyAgICAgIC8vIE9wdGltaXphdGlvbjogIElmIHRoZSB2YXJpbnQgZW5kcyBhdCBleGFjdGx5IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwKKyAgICAgIC8vIHdlIGNhbiBkZXRlY3QgdGhhdCBhbmQgc3RpbGwgdXNlIHRoZSBmYXN0IHBhdGguCisgICAgICAoYnVmX3NpemUgPiAwICYmICEoYnVmZmVyX2VuZF9bLTFdICYgMHg4MCkpKSB7CisgICAgdWludDMyIHRhZzsKKyAgICBjb25zdCB1aW50OCogZW5kID0gUmVhZFZhcmludDMyRnJvbUFycmF5KGJ1ZmZlcl8sICZ0YWcpOworICAgIGlmIChlbmQgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGJ1ZmZlcl8gPSBlbmQ7CisgICAgcmV0dXJuIHRhZzsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBhcmUgY29tbW9ubHkgYXQgYSBsaW1pdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCB0YWdzLiBUcnkgdG8gcXVpY2tseQorICAgIC8vIGRldGVjdCB0aGlzIGNhc2Ugd2l0aG91dCBtYWtpbmcgYW5vdGhlciBmdW5jdGlvbiBjYWxsLgorICAgIGlmICgoYnVmX3NpemUgPT0gMCkgJiYKKyAgICAgICAgKChidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPiAwKSB8fAorICAgICAgICAgKHRvdGFsX2J5dGVzX3JlYWRfID09IGN1cnJlbnRfbGltaXRfKSkgJiYKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGxpbWl0IHdlIGhpdCBpcyBub3QgdG90YWxfYnl0ZXNfbGltaXRfLCBzaW5jZQorICAgICAgICAvLyBpbiB0aGF0IGNhc2Ugd2Ugc3RpbGwgbmVlZCB0byBjYWxsIFJlZnJlc2goKSBzbyB0aGF0IGl0IHByaW50cyBhbgorICAgICAgICAvLyBlcnJvci4KKyAgICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gLSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPCB0b3RhbF9ieXRlc19saW1pdF8pIHsKKyAgICAgIC8vIFdlIGhpdCBhIGJ5dGUgbGltaXQuCisgICAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IHRydWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIFJlYWRUYWdTbG93KCk7CisgIH0KK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50NjRTbG93KHVpbnQ2NCogdmFsdWUpIHsKKyAgLy8gU2xvdyBwYXRoOiAgVGhpcyByZWFkIG1pZ2h0IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgc28gd2UKKyAgLy8gbmVlZCB0byBjaGVjayBhbmQgcmVmcmVzaCB0aGUgYnVmZmVyIGlmIGFuZCB3aGVuIGl0IGRvZXMuCisKKyAgdWludDY0IHJlc3VsdCA9IDA7CisgIGludCBjb3VudCA9IDA7CisgIHVpbnQzMiBiOworCisgIGRvIHsKKyAgICBpZiAoY291bnQgPT0ga01heFZhcmludEJ5dGVzKSByZXR1cm4gZmFsc2U7CisgICAgd2hpbGUgKGJ1ZmZlcl8gPT0gYnVmZmVyX2VuZF8pIHsKKyAgICAgIGlmICghUmVmcmVzaCgpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGIgPSAqYnVmZmVyXzsKKyAgICByZXN1bHQgfD0gc3RhdGljX2Nhc3Q8dWludDY0PihiICYgMHg3RikgPDwgKDcgKiBjb3VudCk7CisgICAgQWR2YW5jZSgxKTsKKyAgICArK2NvdW50OworICB9IHdoaWxlIChiICYgMHg4MCk7CisKKyAgKnZhbHVlID0gcmVzdWx0OworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50NjRGYWxsYmFjayh1aW50NjQqIHZhbHVlKSB7CisgIGlmIChCdWZmZXJTaXplKCkgPj0ga01heFZhcmludEJ5dGVzIHx8CisgICAgICAvLyBPcHRpbWl6YXRpb246ICBJZiB0aGUgdmFyaW50IGVuZHMgYXQgZXhhY3RseSB0aGUgZW5kIG9mIHRoZSBidWZmZXIsCisgICAgICAvLyB3ZSBjYW4gZGV0ZWN0IHRoYXQgYW5kIHN0aWxsIHVzZSB0aGUgZmFzdCBwYXRoLgorICAgICAgKGJ1ZmZlcl9lbmRfID4gYnVmZmVyXyAmJiAhKGJ1ZmZlcl9lbmRfWy0xXSAmIDB4ODApKSkgeworICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAorICAgIC8vIHRoaXMgcmVhZCB3b24ndCBjcm9zcyB0aGUgZW5kLCBzbyB3ZSBjYW4gc2tpcCB0aGUgY2hlY2tzLgorCisgICAgY29uc3QgdWludDgqIHB0ciA9IGJ1ZmZlcl87CisgICAgdWludDMyIGI7CisKKyAgICAvLyBTcGxpdHRpbmcgaW50byAzMi1iaXQgcGllY2VzIGdpdmVzIGJldHRlciBwZXJmb3JtYW5jZSBvbiAzMi1iaXQKKyAgICAvLyBwcm9jZXNzb3JzLgorICAgIHVpbnQzMiBwYXJ0MCA9IDAsIHBhcnQxID0gMCwgcGFydDIgPSAwOworCisgICAgYiA9ICoocHRyKyspOyBwYXJ0MCAgPSAoYiAmIDB4N0YpICAgICAgOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQwIHw9IChiICYgMHg3RikgPDwgIDc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIGIgPSAqKHB0cisrKTsgcGFydDAgfD0gKGIgJiAweDdGKSA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MCB8PSAoYiAmIDB4N0YpIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQxICA9IChiICYgMHg3RikgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIGIgPSAqKHB0cisrKTsgcGFydDEgfD0gKGIgJiAweDdGKSA8PCAgNzsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MSB8PSAoYiAmIDB4N0YpIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQxIHw9IChiICYgMHg3RikgPDwgMjE7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIGIgPSAqKHB0cisrKTsgcGFydDIgID0gKGIgJiAweDdGKSAgICAgIDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MiB8PSAoYiAmIDB4N0YpIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKworICAgIC8vIFdlIGhhdmUgb3ZlcnJ1biB0aGUgbWF4aW11bSBzaXplIG9mIGEgdmFyaW50ICgxMCBieXRlcykuICBUaGUgZGF0YQorICAgIC8vIG11c3QgYmUgY29ycnVwdC4KKyAgICByZXR1cm4gZmFsc2U7CisKKyAgIGRvbmU6CisgICAgQWR2YW5jZShwdHIgLSBidWZmZXJfKTsKKyAgICAqdmFsdWUgPSAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MCkgICAgICApIHwKKyAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MSkgPDwgMjgpIHwKKyAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MikgPDwgNTYpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkVmFyaW50NjRTbG93KHZhbHVlKTsKKyAgfQorfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlZnJlc2goKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoMCwgQnVmZmVyU2l6ZSgpKTsKKworICBpZiAoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCB8fCBvdmVyZmxvd19ieXRlc18gPiAwIHx8CisgICAgICB0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykgeworICAgIC8vIFdlJ3ZlIGhpdCBhIGxpbWl0LiAgU3RvcC4KKyAgICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2J5dGVzX3JlYWRfIC0gYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOworCisgICAgaWYgKGN1cnJlbnRfcG9zaXRpb24gPj0gdG90YWxfYnl0ZXNfbGltaXRfICYmCisgICAgICAgIHRvdGFsX2J5dGVzX2xpbWl0XyAhPSBjdXJyZW50X2xpbWl0XykgeworICAgICAgLy8gSGl0IHRvdGFsX2J5dGVzX2xpbWl0Xy4KKyAgICAgIFByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAodG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfID49IDAgJiYKKyAgICAgIHRvdGFsX2J5dGVzX3JlYWRfID49IHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXykgeworICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiUmVhZGluZyBkYW5nZXJvdXNseSBsYXJnZSBwcm90b2NvbCBtZXNzYWdlLiAgSWYgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0dXJucyBvdXQgdG8gYmUgbGFyZ2VyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgIDw8IHRvdGFsX2J5dGVzX2xpbWl0XyA8PCAiIGJ5dGVzLCBwYXJzaW5nIHdpbGwgYmUgaGFsdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAiZm9yIHNlY3VyaXR5IHJlYXNvbnMuICBUbyBpbmNyZWFzZSB0aGUgbGltaXQgKG9yIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZSB0aGVzZSB3YXJuaW5ncyksIHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgIkNvZGVkSW5wdXRTdHJlYW06OlNldFRvdGFsQnl0ZXNMaW1pdCgpIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oLiI7CisKKyAgICAvLyBEb24ndCB3YXJuIGFnYWluIGZvciB0aGlzIHN0cmVhbSwgYW5kIHByaW50IHRvdGFsIHNpemUgYXQgdGhlIGVuZC4KKyAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8gPSAtMjsKKyAgfQorCisgIGNvbnN0IHZvaWQqIHZvaWRfYnVmZmVyOworICBpbnQgYnVmZmVyX3NpemU7CisgIGlmIChOZXh0Tm9uRW1wdHkoaW5wdXRfLCAmdm9pZF9idWZmZXIsICZidWZmZXJfc2l6ZSkpIHsKKyAgICBidWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHZvaWRfYnVmZmVyKTsKKyAgICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJfc2l6ZTsKKyAgICBHT09HTEVfQ0hFQ0tfR0UoYnVmZmVyX3NpemUsIDApOworCisgICAgaWYgKHRvdGFsX2J5dGVzX3JlYWRfIDw9IElOVF9NQVggLSBidWZmZXJfc2l6ZSkgeworICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gKz0gYnVmZmVyX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE92ZXJmbG93LiAgUmVzZXQgYnVmZmVyX2VuZF8gdG8gbm90IGluY2x1ZGUgdGhlIGJ5dGVzIGJleW9uZCBJTlRfTUFYLgorICAgICAgLy8gV2UgY2FuJ3QgZ2V0IHRoYXQgZmFyIGFueXdheSwgYmVjYXVzZSB0b3RhbF9ieXRlc19saW1pdF8gaXMgZ3VhcmFudGVlZAorICAgICAgLy8gdG8gYmUgbGVzcyB0aGFuIGl0LiAgV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgIC8vIHdlIGRpc2NhcmRlZCwgdGhvdWdoLCBzbyB0aGF0IHdlIGNhbiBjYWxsIGlucHV0Xy0+QmFja1VwKCkgdG8gYmFjaworICAgICAgLy8gdXAgb3ZlciB0aGVtIG9uIGRlc3RydWN0aW9uLgorCisgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAgIC8vICAgb3ZlcmZsb3dfYnl0ZXNfID0gdG90YWxfYnl0ZXNfcmVhZF8gKyBidWZmZXJfc2l6ZSAtIElOVF9NQVg7CisgICAgICAvLyBleGNlcHQgdGhhdCBpdCBhdm9pZHMgb3ZlcmZsb3dzLiAgU2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgaGFzCisgICAgICAvLyB1bmRlZmluZWQgcmVzdWx0cyBhY2NvcmRpbmcgdG8gdGhlIEMgc3RhbmRhcmQuCisgICAgICBvdmVyZmxvd19ieXRlc18gPSB0b3RhbF9ieXRlc19yZWFkXyAtIChJTlRfTUFYIC0gYnVmZmVyX3NpemUpOworICAgICAgYnVmZmVyX2VuZF8gLT0gb3ZlcmZsb3dfYnl0ZXNfOworICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gPSBJTlRfTUFYOworICAgIH0KKworICAgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIGJ1ZmZlcl8gPSBOVUxMOworICAgIGJ1ZmZlcl9lbmRfID0gTlVMTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gQ29kZWRPdXRwdXRTdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb2RlZE91dHB1dFN0cmVhbTo6Q29kZWRPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkKKyAgOiBvdXRwdXRfKG91dHB1dCksCisgICAgYnVmZmVyXyhOVUxMKSwKKyAgICBidWZmZXJfc2l6ZV8oMCksCisgICAgdG90YWxfYnl0ZXNfKDApLAorICAgIGhhZF9lcnJvcl8oZmFsc2UpIHsKKyAgLy8gRWFnZXJseSBSZWZyZXNoKCkgc28gYnVmZmVyIHNwYWNlIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgUmVmcmVzaCgpOworICAvLyBUaGUgUmVmcmVzaCgpIG1heSBoYXZlIGZhaWxlZC4gSWYgdGhlIGNsaWVudCBkb2Vzbid0IHdyaXRlIGFueSBkYXRhLAorICAvLyB0aG91Z2gsIGRvbid0IGNvbnNpZGVyIHRoaXMgYW4gZXJyb3IuIElmIHRoZSBjbGllbnQgZG9lcyB3cml0ZSBkYXRhLCB0aGVuCisgIC8vIGFub3RoZXIgUmVmcmVzaCgpIHdpbGwgYmUgYXR0ZW1wdGVkIGFuZCBpdCB3aWxsIHNldCB0aGUgZXJyb3Igb25jZSBhZ2Fpbi4KKyAgaGFkX2Vycm9yXyA9IGZhbHNlOworfQorCitDb2RlZE91dHB1dFN0cmVhbTo6fkNvZGVkT3V0cHV0U3RyZWFtKCkgeworICBpZiAoYnVmZmVyX3NpemVfID4gMCkgeworICAgIG91dHB1dF8tPkJhY2tVcChidWZmZXJfc2l6ZV8pOworICB9Cit9CisKK2Jvb2wgQ29kZWRPdXRwdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGlmIChjb3VudCA8IDApIHJldHVybiBmYWxzZTsKKworICB3aGlsZSAoY291bnQgPiBidWZmZXJfc2l6ZV8pIHsKKyAgICBjb3VudCAtPSBidWZmZXJfc2l6ZV87CisgICAgaWYgKCFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEFkdmFuY2UoY291bnQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlZE91dHB1dFN0cmVhbTo6R2V0RGlyZWN0QnVmZmVyUG9pbnRlcih2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChidWZmZXJfc2l6ZV8gPT0gMCAmJiAhUmVmcmVzaCgpKSByZXR1cm4gZmFsc2U7CisKKyAgKmRhdGEgPSBidWZmZXJfOworICAqc2l6ZSA9IGJ1ZmZlcl9zaXplXzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlUmF3KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKSB7CisgIHdoaWxlIChidWZmZXJfc2l6ZV8gPCBzaXplKSB7CisgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIGJ1ZmZlcl9zaXplXyk7CisgICAgc2l6ZSAtPSBidWZmZXJfc2l6ZV87CisgICAgZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSArIGJ1ZmZlcl9zaXplXzsKKyAgICBpZiAoIVJlZnJlc2goKSkgcmV0dXJuOworICB9CisKKyAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIHNpemUpOworICBBZHZhbmNlKHNpemUpOworfQorCit1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlUmF3VG9BcnJheSgKKyAgICBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgdWludDgqIHRhcmdldCkgeworICBtZW1jcHkodGFyZ2V0LCBkYXRhLCBzaXplKTsKKyAgcmV0dXJuIHRhcmdldCArIHNpemU7Cit9CisKKwordm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMih1aW50MzIgdmFsdWUpIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKHZhbHVlKV07CisKKyAgYm9vbCB1c2VfZmFzdCA9IGJ1ZmZlcl9zaXplXyA+PSBzaXplb2YodmFsdWUpOworICB1aW50OCogcHRyID0gdXNlX2Zhc3QgPyBidWZmZXJfIDogYnl0ZXM7CisKKyAgV3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkodmFsdWUsIHB0cik7CisKKyAgaWYgKHVzZV9mYXN0KSB7CisgICAgQWR2YW5jZShzaXplb2YodmFsdWUpKTsKKyAgfSBlbHNlIHsKKyAgICBXcml0ZVJhdyhieXRlcywgc2l6ZW9mKHZhbHVlKSk7CisgIH0KK30KKwordm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW42NCh1aW50NjQgdmFsdWUpIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKHZhbHVlKV07CisKKyAgYm9vbCB1c2VfZmFzdCA9IGJ1ZmZlcl9zaXplXyA+PSBzaXplb2YodmFsdWUpOworICB1aW50OCogcHRyID0gdXNlX2Zhc3QgPyBidWZmZXJfIDogYnl0ZXM7CisKKyAgV3JpdGVMaXR0bGVFbmRpYW42NFRvQXJyYXkodmFsdWUsIHB0cik7CisKKyAgaWYgKHVzZV9mYXN0KSB7CisgICAgQWR2YW5jZShzaXplb2YodmFsdWUpKTsKKyAgfSBlbHNlIHsKKyAgICBXcml0ZVJhdyhieXRlcywgc2l6ZW9mKHZhbHVlKSk7CisgIH0KK30KKworaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheUlubGluZSgKKyAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0WzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlIHwgMHg4MCk7CisgIGlmICh2YWx1ZSA+PSAoMSA8PCA3KSkgeworICAgIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigodmFsdWUgPj4gIDcpIHwgMHg4MCk7CisgICAgaWYgKHZhbHVlID49ICgxIDw8IDE0KSkgeworICAgICAgdGFyZ2V0WzJdID0gc3RhdGljX2Nhc3Q8dWludDg+KCh2YWx1ZSA+PiAxNCkgfCAweDgwKTsKKyAgICAgIGlmICh2YWx1ZSA+PSAoMSA8PCAyMSkpIHsKKyAgICAgICAgdGFyZ2V0WzNdID0gc3RhdGljX2Nhc3Q8dWludDg+KCh2YWx1ZSA+PiAyMSkgfCAweDgwKTsKKyAgICAgICAgaWYgKHZhbHVlID49ICgxIDw8IDI4KSkgeworICAgICAgICAgIHRhcmdldFs0XSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSA+PiAyOCk7CisgICAgICAgICAgcmV0dXJuIHRhcmdldCArIDU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGFyZ2V0WzNdICY9IDB4N0Y7CisgICAgICAgICAgcmV0dXJuIHRhcmdldCArIDQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldFsyXSAmPSAweDdGOworICAgICAgICByZXR1cm4gdGFyZ2V0ICsgMzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGFyZ2V0WzFdICY9IDB4N0Y7CisgICAgICByZXR1cm4gdGFyZ2V0ICsgMjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGFyZ2V0WzBdICY9IDB4N0Y7CisgICAgcmV0dXJuIHRhcmdldCArIDE7CisgIH0KK30KKwordm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMih1aW50MzIgdmFsdWUpIHsKKyAgaWYgKGJ1ZmZlcl9zaXplXyA+PSBrTWF4VmFyaW50MzJCeXRlcykgeworICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAorICAgIC8vIHRoaXMgd3JpdGUgd29uJ3QgY3Jvc3MgdGhlIGVuZCwgc28gd2UgY2FuIHNraXAgdGhlIGNoZWNrcy4KKyAgICB1aW50OCogdGFyZ2V0ID0gYnVmZmVyXzsKKyAgICB1aW50OCogZW5kID0gV3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheUlubGluZSh2YWx1ZSwgdGFyZ2V0KTsKKyAgICBpbnQgc2l6ZSA9IGVuZCAtIHRhcmdldDsKKyAgICBBZHZhbmNlKHNpemUpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogIFRoaXMgd3JpdGUgbWlnaHQgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBzbyB3ZQorICAgIC8vIGNvbXBvc2UgdGhlIGJ5dGVzIGZpcnN0IHRoZW4gdXNlIFdyaXRlUmF3KCkuCisgICAgdWludDggYnl0ZXNba01heFZhcmludDMyQnl0ZXNdOworICAgIGludCBzaXplID0gMDsKKyAgICB3aGlsZSAodmFsdWUgPiAweDdGKSB7CisgICAgICBieXRlc1tzaXplKytdID0gKHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSkgJiAweDdGKSB8IDB4ODA7CisgICAgICB2YWx1ZSA+Pj0gNzsKKyAgICB9CisgICAgYnl0ZXNbc2l6ZSsrXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSkgJiAweDdGOworICAgIFdyaXRlUmF3KGJ5dGVzLCBzaXplKTsKKyAgfQorfQorCit1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXkoCisgICAgdWludDMyIHZhbHVlLCB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5SW5saW5lKHZhbHVlLCB0YXJnZXQpOworfQorCitpbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSgKKyAgICB1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgLy8gU3BsaXR0aW5nIGludG8gMzItYml0IHBpZWNlcyBnaXZlcyBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gMzItYml0CisgIC8vIHByb2Nlc3NvcnMuCisgIHVpbnQzMiBwYXJ0MCA9IHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUgICAgICApOworICB1aW50MzIgcGFydDEgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlID4+IDI4KTsKKyAgdWludDMyIHBhcnQyID0gc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSA+PiA1Nik7CisKKyAgaW50IHNpemU7CisKKyAgLy8gSGVyZSB3ZSBjYW4ndCByZWFsbHkgb3B0aW1pemUgZm9yIHNtYWxsIG51bWJlcnMsIHNpbmNlIHRoZSB2YWx1ZSBpcworICAvLyBzcGxpdCBpbnRvIHRocmVlIHBhcnRzLiAgQ2hla2luZyBmb3IgbnVtYmVycyA8IDEyOCwgZm9yIGluc3RhbmNlLAorICAvLyB3b3VsZCByZXF1aXJlIHRocmVlIGNvbXBhcmlzb25zLCBzaW5jZSB5b3UnZCBoYXZlIHRvIG1ha2Ugc3VyZSBwYXJ0MQorICAvLyBhbmQgcGFydDIgYXJlIHplcm8uICBIb3dldmVyLCBpZiB0aGUgY2FsbGVyIGlzIHVzaW5nIDY0LWJpdCBpbnRlZ2VycywKKyAgLy8gaXQgaXMgbGlrZWx5IHRoYXQgdGhleSBleHBlY3QgdGhlIG51bWJlcnMgdG8gb2Z0ZW4gYmUgdmVyeSBsYXJnZSwgc28KKyAgLy8gd2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBvcHRpbWl6ZSBmb3Igc21hbGwgbnVtYmVycyBhbnl3YXkuICBUaHVzLAorICAvLyB3ZSBlbmQgdXAgd2l0aCBhIGhhcmRjb2RlZCBiaW5hcnkgc2VhcmNoIHRyZWUuLi4KKyAgaWYgKHBhcnQyID09IDApIHsKKyAgICBpZiAocGFydDEgPT0gMCkgeworICAgICAgaWYgKHBhcnQwIDwgKDEgPDwgMTQpKSB7CisgICAgICAgIGlmIChwYXJ0MCA8ICgxIDw8IDcpKSB7CisgICAgICAgICAgc2l6ZSA9IDE7IGdvdG8gc2l6ZTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2l6ZSA9IDI7IGdvdG8gc2l6ZTI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwYXJ0MCA8ICgxIDw8IDIxKSkgeworICAgICAgICAgIHNpemUgPSAzOyBnb3RvIHNpemUzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNpemUgPSA0OyBnb3RvIHNpemU0OworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwYXJ0MSA8ICgxIDw8IDE0KSkgeworICAgICAgICBpZiAocGFydDEgPCAoMSA8PCA3KSkgeworICAgICAgICAgIHNpemUgPSA1OyBnb3RvIHNpemU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNpemUgPSA2OyBnb3RvIHNpemU2OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFydDEgPCAoMSA8PCAyMSkpIHsKKyAgICAgICAgICBzaXplID0gNzsgZ290byBzaXplNzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzaXplID0gODsgZ290byBzaXplODsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocGFydDIgPCAoMSA8PCA3KSkgeworICAgICAgc2l6ZSA9IDk7IGdvdG8gc2l6ZTk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNpemUgPSAxMDsgZ290byBzaXplMTA7CisgICAgfQorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisKKyAgc2l6ZTEwOiB0YXJnZXRbOV0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQyID4+ICA3KSB8IDB4ODApOworICBzaXplOSA6IHRhcmdldFs4XSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDIgICAgICApIHwgMHg4MCk7CisgIHNpemU4IDogdGFyZ2V0WzddID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MSA+PiAyMSkgfCAweDgwKTsKKyAgc2l6ZTcgOiB0YXJnZXRbNl0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQxID4+IDE0KSB8IDB4ODApOworICBzaXplNiA6IHRhcmdldFs1XSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDEgPj4gIDcpIHwgMHg4MCk7CisgIHNpemU1IDogdGFyZ2V0WzRdID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MSAgICAgICkgfCAweDgwKTsKKyAgc2l6ZTQgOiB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQwID4+IDIxKSB8IDB4ODApOworICBzaXplMyA6IHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDAgPj4gMTQpIHwgMHg4MCk7CisgIHNpemUyIDogdGFyZ2V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MCA+PiAgNykgfCAweDgwKTsKKyAgc2l6ZTEgOiB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQwICAgICAgKSB8IDB4ODApOworCisgIHRhcmdldFtzaXplLTFdICY9IDB4N0Y7CisgIHJldHVybiB0YXJnZXQgKyBzaXplOworfQorCit2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0KHVpbnQ2NCB2YWx1ZSkgeworICBpZiAoYnVmZmVyX3NpemVfID49IGtNYXhWYXJpbnRCeXRlcykgeworICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAorICAgIC8vIHRoaXMgd3JpdGUgd29uJ3QgY3Jvc3MgdGhlIGVuZCwgc28gd2UgY2FuIHNraXAgdGhlIGNoZWNrcy4KKyAgICB1aW50OCogdGFyZ2V0ID0gYnVmZmVyXzsKKworICAgIHVpbnQ4KiBlbmQgPSBXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSh2YWx1ZSwgdGFyZ2V0KTsKKyAgICBpbnQgc2l6ZSA9IGVuZCAtIHRhcmdldDsKKyAgICBBZHZhbmNlKHNpemUpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogIFRoaXMgd3JpdGUgbWlnaHQgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBzbyB3ZQorICAgIC8vIGNvbXBvc2UgdGhlIGJ5dGVzIGZpcnN0IHRoZW4gdXNlIFdyaXRlUmF3KCkuCisgICAgdWludDggYnl0ZXNba01heFZhcmludEJ5dGVzXTsKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgd2hpbGUgKHZhbHVlID4gMHg3RikgeworICAgICAgYnl0ZXNbc2l6ZSsrXSA9IChzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpICYgMHg3RikgfCAweDgwOworICAgICAgdmFsdWUgPj49IDc7CisgICAgfQorICAgIGJ5dGVzW3NpemUrK10gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpICYgMHg3RjsKKyAgICBXcml0ZVJhdyhieXRlcywgc2l6ZSk7CisgIH0KK30KKwordWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheSgKKyAgICB1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlVmFyaW50NjRUb0FycmF5SW5saW5lKHZhbHVlLCB0YXJnZXQpOworfQorCitib29sIENvZGVkT3V0cHV0U3RyZWFtOjpSZWZyZXNoKCkgeworICB2b2lkKiB2b2lkX2J1ZmZlcjsKKyAgaWYgKG91dHB1dF8tPk5leHQoJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemVfKSkgeworICAgIGJ1ZmZlcl8gPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4odm9pZF9idWZmZXIpOworICAgIHRvdGFsX2J5dGVzXyArPSBidWZmZXJfc2l6ZV87CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgYnVmZmVyXyA9IE5VTEw7CisgICAgYnVmZmVyX3NpemVfID0gMDsKKyAgICBoYWRfZXJyb3JfID0gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworaW50IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJGYWxsYmFjayh1aW50MzIgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgKDEgPDwgNykpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxIDw8IDE0KSkgeworICAgIHJldHVybiAyOworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMjEpKSB7CisgICAgcmV0dXJuIDM7CisgIH0gZWxzZSBpZiAodmFsdWUgPCAoMSA8PCAyOCkpIHsKKyAgICByZXR1cm4gNDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gNTsKKyAgfQorfQorCitpbnQgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NCh1aW50NjQgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgMzUpKSB7CisgICAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNykpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAxNCkpIHsKKyAgICAgIHJldHVybiAyOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAyMSkpIHsKKyAgICAgIHJldHVybiAzOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAyOCkpIHsKKyAgICAgIHJldHVybiA0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gNTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNDIpKSB7CisgICAgICByZXR1cm4gNjsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNDkpKSB7CisgICAgICByZXR1cm4gNzsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNTYpKSB7CisgICAgICByZXR1cm4gODsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNjMpKSB7CisgICAgICByZXR1cm4gOTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDEwOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Y2JlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmgKQEAgLTAsMCArMSwxMTM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIENvZGVkSW5wdXRTdHJlYW0gYW5kIENvZGVkT3V0cHV0U3RyZWFtIGNsYXNzZXMsCisvLyB3aGljaCB3cmFwIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSBvciBaZXJvQ29weU91dHB1dFN0cmVhbSwgcmVzcGVjdGl2ZWx5LAorLy8gYW5kIGFsbG93IHlvdSB0byByZWFkIG9yIHdyaXRlIGluZGl2aWR1YWwgcGllY2VzIG9mIGRhdGEgaW4gdmFyaW91cworLy8gZm9ybWF0cy4gIEluIHBhcnRpY3VsYXIsIHRoZXNlIGltcGxlbWVudCB0aGUgdmFyaW50IGVuY29kaW5nIGZvcgorLy8gaW50ZWdlcnMsIGEgc2ltcGxlIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZyBpbiB3aGljaCBzbWFsbGVyIG51bWJlcnMKKy8vIHRha2UgZmV3ZXIgYnl0ZXMuCisvLworLy8gVHlwaWNhbGx5IHRoZXNlIGNsYXNzZXMgd2lsbCBvbmx5IGJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgcHJvdG9jb2wKKy8vIGJ1ZmZlciBsaWJyYXJ5IGluIG9yZGVyIHRvIGVuY29kZSBhbmQgZGVjb2RlIHByb3RvY29sIGJ1ZmZlcnMuICBDbGllbnRzCisvLyBvZiB0aGUgbGlicmFyeSBvbmx5IG5lZWQgdG8ga25vdyBhYm91dCB0aGlzIGNsYXNzIGlmIHRoZXkgd2lzaCB0byB3cml0ZQorLy8gY3VzdG9tIG1lc3NhZ2UgcGFyc2luZyBvciBzZXJpYWxpemF0aW9uIHByb2NlZHVyZXMuCisvLworLy8gQ29kZWRPdXRwdXRTdHJlYW0gZXhhbXBsZToKKy8vICAgLy8gV3JpdGUgc29tZSBkYXRhIHRvICJteWZpbGUiLiAgRmlyc3Qgd2Ugd3JpdGUgYSA0LWJ5dGUgIm1hZ2ljIG51bWJlciIKKy8vICAgLy8gdG8gaWRlbnRpZnkgdGhlIGZpbGUgdHlwZSwgdGhlbiB3cml0ZSBhIGxlbmd0aC1kZWxpbWl0ZWQgc3RyaW5nLiAgVGhlCisvLyAgIC8vIHN0cmluZyBpcyBjb21wb3NlZCBvZiBhIHZhcmludCBnaXZpbmcgdGhlIGxlbmd0aCBmb2xsb3dlZCBieSB0aGUgcmF3CisvLyAgIC8vIGJ5dGVzLgorLy8gICBpbnQgZmQgPSBvcGVuKCJteWZpbGUiLCBPX1dST05MWSk7CisvLyAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiByYXdfb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmQpOworLy8gICBDb2RlZE91dHB1dFN0cmVhbSogY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd19vdXRwdXQpOworLy8KKy8vICAgaW50IG1hZ2ljX251bWJlciA9IDEyMzQ7CisvLyAgIGNoYXIgdGV4dFtdID0gIkhlbGxvIHdvcmxkISI7CisvLyAgIGNvZGVkX291dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihtYWdpY19udW1iZXIpOworLy8gICBjb2RlZF9vdXRwdXQtPldyaXRlVmFyaW50MzIoc3RybGVuKHRleHQpKTsKKy8vICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyh0ZXh0LCBzdHJsZW4odGV4dCkpOworLy8KKy8vICAgZGVsZXRlIGNvZGVkX291dHB1dDsKKy8vICAgZGVsZXRlIHJhd19vdXRwdXQ7CisvLyAgIGNsb3NlKGZkKTsKKy8vCisvLyBDb2RlZElucHV0U3RyZWFtIGV4YW1wbGU6CisvLyAgIC8vIFJlYWQgYSBmaWxlIGNyZWF0ZWQgYnkgdGhlIGFib3ZlIGNvZGUuCisvLyAgIGludCBmZCA9IG9wZW4oIm15ZmlsZSIsIE9fUkRPTkxZKTsKKy8vICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogcmF3X2lucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZCk7CisvLyAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShyYXdfaW5wdXQpOworLy8KKy8vICAgY29kZWRfaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmbWFnaWNfbnVtYmVyKTsKKy8vICAgaWYgKG1hZ2ljX251bWJlciAhPSAxMjM0KSB7CisvLyAgICAgY2VyciA8PCAiRmlsZSBub3QgaW4gZXhwZWN0ZWQgZm9ybWF0LiIgPDwgZW5kbDsKKy8vICAgICByZXR1cm47CisvLyAgIH0KKy8vCisvLyAgIHVpbnQzMiBzaXplOworLy8gICBjb2RlZF9pbnB1dC0+UmVhZFZhcmludDMyKCZzaXplKTsKKy8vCisvLyAgIGNoYXIqIHRleHQgPSBuZXcgY2hhcltzaXplICsgMV07CisvLyAgIGNvZGVkX2lucHV0LT5SZWFkUmF3KGJ1ZmZlciwgc2l6ZSk7CisvLyAgIHRleHRbc2l6ZV0gPSAnXDAnOworLy8KKy8vICAgZGVsZXRlIGNvZGVkX2lucHV0OworLy8gICBkZWxldGUgcmF3X2lucHV0OworLy8gICBjbG9zZShmZCk7CisvLworLy8gICBjb3V0IDw8ICJUZXh0IGlzOiAiIDw8IHRleHQgPDwgZW5kbDsKKy8vICAgZGVsZXRlIFtdIHRleHQ7CisvLworLy8gRm9yIHRob3NlIHdobyBhcmUgaW50ZXJlc3RlZCwgdmFyaW50IGVuY29kaW5nIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKy8vCisvLyBUaGUgZW5jb2Rpbmcgb3BlcmF0ZXMgb24gdW5zaWduZWQgaW50ZWdlcnMgb2YgdXAgdG8gNjQgYml0cyBpbiBsZW5ndGguCisvLyBFYWNoIGJ5dGUgb2YgdGhlIGVuY29kZWQgdmFsdWUgaGFzIHRoZSBmb3JtYXQ6CisvLyAqIGJpdHMgMC02OiBTZXZlbiBiaXRzIG9mIHRoZSBudW1iZXIgYmVpbmcgZW5jb2RlZC4KKy8vICogYml0IDc6IFplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBlbmNvZGluZyAoaW4gd2hpY2gKKy8vICAgY2FzZSBhbGwgcmVtYWluaW5nIGJpdHMgb2YgdGhlIG51bWJlciBhcmUgemVybykgb3IgMSBpZgorLy8gICBtb3JlIGJ5dGVzIGZvbGxvdy4KKy8vIFRoZSBmaXJzdCBieXRlIGNvbnRhaW5zIHRoZSBsZWFzdC1zaWduaWZpY2FudCA3IGJpdHMgb2YgdGhlIG51bWJlciwgdGhlCisvLyBzZWNvbmQgYnl0ZSAoaWYgcHJlc2VudCkgY29udGFpbnMgdGhlIG5leHQtbGVhc3Qtc2lnbmlmaWNhbnQgNyBiaXRzLAorLy8gYW5kIHNvIG9uLiAgU28sIHRoZSBiaW5hcnkgbnVtYmVyIDEwMTEwMDAxMDEwMTEgd291bGQgYmUgZW5jb2RlZCBpbiB0d28KKy8vIGJ5dGVzIGFzICIxMDEwMTAxMSAwMDEwMTEwMCIuCisvLworLy8gSW4gdGhlb3J5LCB2YXJpbnQgY291bGQgYmUgdXNlZCB0byBlbmNvZGUgaW50ZWdlcnMgb2YgYW55IGxlbmd0aC4KKy8vIEhvd2V2ZXIsIGZvciBwcmFjdGljYWxpdHkgd2Ugc2V0IGEgbGltaXQgYXQgNjQgYml0cy4gIFRoZSBtYXhpbXVtIGVuY29kZWQKKy8vIGxlbmd0aCBvZiBhIG51bWJlciBpcyB0aHVzIDEwIGJ5dGVzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaWZkZWYgX01TQ19WRVIKKyAgI2lmIGRlZmluZWQoX01fSVg4NikgJiYgXAorICAgICAgIWRlZmluZWQoUFJPVE9CVUZfRElTQUJMRV9MSVRUTEVfRU5ESUFOX09QVF9GT1JfVEVTVCkKKyAgICAjZGVmaW5lIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gMQorICAjZW5kaWYKKyAgI2lmIF9NU0NfVkVSID49IDEzMDAKKyAgICAvLyBJZiBNU1ZDIGhhcyAiL1JUQ2MiIHNldCwgaXQgd2lsbCBjb21wbGFpbiBhYm91dCB0cnVuY2F0aW5nIGNhc3RzIGF0CisgICAgLy8gcnVudGltZS4gIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGludGVudGlvbmFsIHRydW5jYXRpbmcgY2FzdHMuCisgICAgI3ByYWdtYSBydW50aW1lX2NoZWNrcygiYyIsIG9mZikKKyAgI2VuZGlmCisjZWxzZQorICAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+ICAgLy8gX19CWVRFX09SREVSCisgICNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiAmJiBcCisgICAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorICAgICNkZWZpbmUgUFJPVE9CVUZfTElUVExFX0VORElBTiAxCisgICNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRGVzY3JpcHRvclBvb2w7CitjbGFzcyBNZXNzYWdlRmFjdG9yeTsKKworbmFtZXNwYWNlIGlvIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBDb2RlZElucHV0U3RyZWFtOworY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07CisKKy8vIERlZmluZWQgaW4gb3RoZXIgZmlsZXMuCitjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOyAgICAgICAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCitjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsgICAgICAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisKKy8vIENsYXNzIHdoaWNoIHJlYWRzIGFuZCBkZWNvZGVzIGJpbmFyeSBkYXRhIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHZhcmludC0KKy8vIGVuY29kZWQgaW50ZWdlcnMgYW5kIGZpeGVkLXdpZHRoIHBpZWNlcy4gIFdyYXBzIGEgWmVyb0NvcHlJbnB1dFN0cmVhbS4KKy8vIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0byBkZWFsIHdpdGggQ29kZWRJbnB1dFN0cmVhbS4KKy8vCisvLyBNb3N0IG1ldGhvZHMgb2YgQ29kZWRJbnB1dFN0cmVhbSB0aGF0IHJldHVybiBhIGJvb2wgcmV0dXJuIGZhbHNlIGlmIGFuCisvLyB1bmRlcmx5aW5nIEkvTyBlcnJvciBvY2N1cnMgb3IgaWYgdGhlIGRhdGEgaXMgbWFsZm9ybWVkLiAgT25jZSBzdWNoIGEKKy8vIGZhaWx1cmUgb2NjdXJzLCB0aGUgQ29kZWRJbnB1dFN0cmVhbSBpcyBicm9rZW4gYW5kIGlzIG5vIGxvbmdlciB1c2VmdWwuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29kZWRJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBDb2RlZElucHV0U3RyZWFtIHRoYXQgcmVhZHMgZnJvbSB0aGUgZ2l2ZW4gWmVyb0NvcHlJbnB1dFN0cmVhbS4KKyAgZXhwbGljaXQgQ29kZWRJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCk7CisKKyAgLy8gQ3JlYXRlIGEgQ29kZWRJbnB1dFN0cmVhbSB0aGF0IHJlYWRzIGZyb20gdGhlIGdpdmVuIGZsYXQgYXJyYXkuICBUaGlzIGlzCisgIC8vIGZhc3RlciB0aGFuIHVzaW5nIGFuIEFycmF5SW5wdXRTdHJlYW0uICBQdXNoTGltaXQoc2l6ZSkgaXMgaW1wbGllZCBieQorICAvLyB0aGlzIGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBDb2RlZElucHV0U3RyZWFtKGNvbnN0IHVpbnQ4KiBidWZmZXIsIGludCBzaXplKTsKKworICAvLyBEZXN0cm95IHRoZSBDb2RlZElucHV0U3RyZWFtIGFuZCBwb3NpdGlvbiB0aGUgdW5kZXJseWluZworICAvLyBaZXJvQ29weUlucHV0U3RyZWFtIGF0IHRoZSBmaXJzdCB1bnJlYWQgYnl0ZS4gIElmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlCisgIC8vIHJlYWRpbmcgKGNhdXNpbmcgYSBtZXRob2QgdG8gcmV0dXJuIGZhbHNlKSwgdGhlbiB0aGUgZXhhY3QgcG9zaXRpb24gb2YKKyAgLy8gdGhlIGlucHV0IHN0cmVhbSBtYXkgYmUgYW55d2hlcmUgYmV0d2VlbiB0aGUgbGFzdCB2YWx1ZSB0aGF0IHdhcyByZWFkCisgIC8vIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHN0cmVhbSdzIGJ5dGUgbGltaXQuCisgIH5Db2RlZElucHV0U3RyZWFtKCk7CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBDb2RlZElucHV0U3RyZWFtIHJlYWRzIGZyb20gYSBmbGF0IGFycmF5IGluc3RlYWQgb2YKKyAgLy8gYSBaZXJvQ29weUlucHV0U3RyZWFtLgorICBpbmxpbmUgYm9vbCBJc0ZsYXQoKSBjb25zdDsKKworICAvLyBTa2lwcyBhIG51bWJlciBvZiBieXRlcy4gIFJldHVybnMgZmFsc2UgaWYgYW4gdW5kZXJseWluZyByZWFkIGVycm9yCisgIC8vIG9jY3Vycy4KKyAgYm9vbCBTa2lwKGludCBjb3VudCk7CisKKyAgLy8gU2V0cyAqZGF0YSB0byBwb2ludCBkaXJlY3RseSBhdCB0aGUgdW5yZWFkIHBhcnQgb2YgdGhlIENvZGVkSW5wdXRTdHJlYW0ncworICAvLyB1bmRlcmx5aW5nIGJ1ZmZlciwgYW5kICpzaXplIHRvIHRoZSBzaXplIG9mIHRoYXQgYnVmZmVyLCBidXQgZG9lcyBub3QKKyAgLy8gYWR2YW5jZSB0aGUgc3RyZWFtJ3MgY3VycmVudCBwb3NpdGlvbi4gIFRoaXMgd2lsbCBhbHdheXMgZWl0aGVyIHByb2R1Y2UKKyAgLy8gYSBub24tZW1wdHkgYnVmZmVyIG9yIHJldHVybiBmYWxzZS4gIElmIHRoZSBjYWxsZXIgY29uc3VtZXMgYW55IG9mCisgIC8vIHRoaXMgZGF0YSwgaXQgc2hvdWxkIHRoZW4gY2FsbCBTa2lwKCkgdG8gc2tpcCBvdmVyIHRoZSBjb25zdW1lZCBieXRlcy4KKyAgLy8gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgZXh0ZXJuYWwgZmFzdCBwYXJzaW5nIHJvdXRpbmVzIGZvcgorICAvLyB0eXBlcyBvZiBkYXRhIG5vdCBjb3ZlcmVkIGJ5IHRoZSBDb2RlZElucHV0U3RyZWFtIGludGVyZmFjZS4KKyAgYm9vbCBHZXREaXJlY3RCdWZmZXJQb2ludGVyKGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworCisgIC8vIExpa2UgR2V0RGlyZWN0QnVmZmVyUG9pbnRlciwgYnV0IHRoaXMgbWV0aG9kIGlzIGlubGluZWQsIGFuZCBkb2VzIG5vdAorICAvLyBhdHRlbXB0IHRvIFJlZnJlc2goKSBpZiB0aGUgYnVmZmVyIGlzIGN1cnJlbnRseSBlbXB0eS4KKyAgaW5saW5lIHZvaWQgR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZShjb25zdCB2b2lkKiogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemUpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKworICAvLyBSZWFkIHJhdyBieXRlcywgY29weWluZyB0aGVtIGludG8gdGhlIGdpdmVuIGJ1ZmZlci4KKyAgYm9vbCBSZWFkUmF3KHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOworCisgIC8vIExpa2UgUmVhZFJhdywgYnV0IHJlYWRzIGludG8gYSBzdHJpbmcuCisgIC8vCisgIC8vIEltcGxlbWVudGF0aW9uIE5vdGU6ICBSZWFkU3RyaW5nKCkgZ3Jvd3MgdGhlIHN0cmluZyBncmFkdWFsbHkgYXMgaXQKKyAgLy8gcmVhZHMgaW4gdGhlIGRhdGEsIHJhdGhlciB0aGFuIGFsbG9jYXRpbmcgdGhlIGVudGlyZSByZXF1ZXN0ZWQgc2l6ZQorICAvLyB1cGZyb250LiAgVGhpcyBwcmV2ZW50cyBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzIGluIHdoaWNoIGEgY2xpZW50CisgIC8vIGNvdWxkIGNsYWltIHRoYXQgYSBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgTUFYX0lOVCBieXRlcyBsb25nIGluIG9yZGVyIHRvCisgIC8vIGNyYXNoIHRoZSBzZXJ2ZXIgYmVjYXVzZSBpdCBjYW4ndCBhbGxvY2F0ZSB0aGlzIG11Y2ggc3BhY2UgYXQgb25jZS4KKyAgYm9vbCBSZWFkU3RyaW5nKHN0cmluZyogYnVmZmVyLCBpbnQgc2l6ZSk7CisgIC8vIExpa2UgdGhlIGFib3ZlLCB3aXRoIGlubGluZWQgb3B0aW1pemF0aW9ucy4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkCisgIC8vIGJ5IHRoZSBwcm90b2J1ZiBpbXBsZW1lbnRhdGlvbi4KKyAgaW5saW5lIGJvb2wgSW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKHN0cmluZyogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKworCisgIC8vIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgorICBib29sIFJlYWRMaXR0bGVFbmRpYW4zMih1aW50MzIqIHZhbHVlKTsKKyAgLy8gUmVhZCBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIGJvb2wgUmVhZExpdHRsZUVuZGlhbjY0KHVpbnQ2NCogdmFsdWUpOworCisgIC8vIFRoZXNlIG1ldGhvZHMgcmVhZCBmcm9tIGFuIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyLiBUaGUgY2FsbGVyIGlzCisgIC8vIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBidWZmZXIgaGFzIHN1ZmZpY2llbnQgc3BhY2UuCisgIC8vIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgorICBzdGF0aWMgY29uc3QgdWludDgqIFJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheShjb25zdCB1aW50OCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyKiB2YWx1ZSk7CisgIC8vIFJlYWQgYSA2NC1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgorICBzdGF0aWMgY29uc3QgdWludDgqIFJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShjb25zdCB1aW50OCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0KiB2YWx1ZSk7CisKKyAgLy8gUmVhZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLCB0cnVuY2F0aW5nIHRvIDMyIGJpdHMuCisgIC8vIFJlYWRpbmcgYSAzMi1iaXQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byByZWFkaW5nIGEgNjQtYml0IG9uZSBhbmQgY2FzdGluZworICAvLyBpdCB0byB1aW50MzIsIGJ1dCBtYXkgYmUgbW9yZSBlZmZpY2llbnQuCisgIGJvb2wgUmVhZFZhcmludDMyKHVpbnQzMiogdmFsdWUpOworICAvLyBSZWFkIGFuIHVuc2lnbmVkIGludGVnZXIgd2l0aCBWYXJpbnQgZW5jb2RpbmcuCisgIGJvb2wgUmVhZFZhcmludDY0KHVpbnQ2NCogdmFsdWUpOworCisgIC8vIFJlYWQgYSB0YWcuICBUaGlzIGNhbGxzIFJlYWRWYXJpbnQzMigpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQsIG9yIHJldHVybnMKKyAgLy8gemVybyAod2hpY2ggaXMgbm90IGEgdmFsaWQgdGFnKSBpZiBSZWFkVmFyaW50MzIoKSBmYWlscy4gIEFsc28sIGl0IHVwZGF0ZXMKKyAgLy8gdGhlIGxhc3QgdGFnIHZhbHVlLCB3aGljaCBjYW4gYmUgY2hlY2tlZCB3aXRoIExhc3RUYWdXYXMoKS4KKyAgLy8gQWx3YXlzIGlubGluZSBiZWNhdXNlIHRoaXMgaXMgb25seSBjYWxsZWQgaW4gb25jZSBwbGFjZSBwZXIgcGFyc2UgbG9vcAorICAvLyBidXQgaXQgaXMgY2FsbGVkIGZvciBldmVyeSBpdGVyYXRpb24gb2Ygc2FpZCBsb29wLCBzbyBpdCBzaG91bGQgYmUgZmFzdC4KKyAgLy8gR0NDIGRvZXNuJ3Qgd2FudCB0byBpbmxpbmUgdGhpcyBieSBkZWZhdWx0LgorICB1aW50MzIgUmVhZFRhZygpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKworICAvLyBVc3VhbGx5IHJldHVybnMgdHJ1ZSBpZiBjYWxsaW5nIFJlYWRWYXJpbnQzMigpIG5vdyB3b3VsZCBwcm9kdWNlIHRoZSBnaXZlbgorICAvLyB2YWx1ZS4gIFdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSBpZiBSZWFkVmFyaW50MzIoKSB3b3VsZCBub3QgcmV0dXJuIHRoZQorICAvLyBnaXZlbiB2YWx1ZS4gIElmIEV4cGVjdFRhZygpIHJldHVybnMgdHJ1ZSwgaXQgYWxzbyBhZHZhbmNlcyBwYXN0CisgIC8vIHRoZSB2YXJpbnQuICBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgdXNlIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGFzIHRoZQorICAvLyBwYXJhbWV0ZXIuCisgIC8vIEFsd2F5cyBpbmxpbmUgYmVjYXVzZSB0aGlzIGNvbGxhcHNlcyB0byBhIHNtYWxsIG51bWJlciBvZiBpbnN0cnVjdGlvbnMKKyAgLy8gd2hlbiBnaXZlbiBhIGNvbnN0YW50IHBhcmFtZXRlciwgYnV0IEdDQyBkb2Vzbid0IHdhbnQgdG8gaW5saW5lIGJ5IGRlZmF1bHQuCisgIGJvb2wgRXhwZWN0VGFnKHVpbnQzMiBleHBlY3RlZCkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisgIC8vIExpa2UgYWJvdmUsIGV4Y2VwdCB0aGlzIHJlYWRzIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuIFRoZSBjYWxsZXIgaXMKKyAgLy8gcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gcmVhZCBhIHZhcmludAorICAvLyBvZiB0aGUgZXhwZWN0ZWQgc2l6ZS4gRm9yIGJlc3QgcGVyZm9ybWFuY2UsIHVzZSBhIGNvbXBpbGUtdGltZSBjb25zdGFudCBhcworICAvLyB0aGUgZXhwZWN0ZWQgdGFnIHBhcmFtZXRlci4KKyAgLy8KKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgYmV5b25kIHRoZSBleHBlY3RlZCB0YWcgaWYgaXQgd2FzIGZvdW5kLCBvciBOVUxMIGlmIGl0CisgIC8vIHdhcyBub3QuCisgIHN0YXRpYyBjb25zdCB1aW50OCogRXhwZWN0VGFnRnJvbUFycmF5KAorICAgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICAgIHVpbnQzMiBleHBlY3RlZCkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisgIC8vIFVzdWFsbHkgcmV0dXJucyB0cnVlIGlmIG5vIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBBbHdheXMgcmV0dXJucyBmYWxzZQorICAvLyBpZiBtb3JlIGJ5dGVzIGNhbiBiZSByZWFkLiAgSWYgRXhwZWN0QXRFbmQoKSByZXR1cm5zIHRydWUsIGEgc3Vic2VxdWVudAorICAvLyBjYWxsIHRvIExhc3RUYWdXYXMoKSB3aWxsIGFjdCBhcyBpZiBSZWFkVGFnKCkgaGFkIGJlZW4gY2FsbGVkIGFuZCByZXR1cm5lZAorICAvLyB6ZXJvLCBhbmQgQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgd2lsbCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBFeHBlY3RBdEVuZCgpOworCisgIC8vIElmIHRoZSBsYXN0IGNhbGwgdG8gUmVhZFRhZygpIHJldHVybmVkIHRoZSBnaXZlbiB2YWx1ZSwgcmV0dXJucyB0cnVlLgorICAvLyBPdGhlcndpc2UsIHJldHVybnMgZmFsc2U7CisgIC8vCisgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcGFyc2VycyBmb3Igc29tZSB0eXBlcyBvZiBlbWJlZGRlZCBtZXNzYWdlcworICAvLyAod2l0aCBmaWVsZCB0eXBlIFRZUEVfR1JPVVApIGRvbid0IGFjdHVhbGx5IGtub3cgdGhhdCB0aGV5J3ZlIHJlYWNoZWQgdGhlCisgIC8vIGVuZCBvZiBhIG1lc3NhZ2UgdW50aWwgdGhleSBzZWUgYW4gRU5ER1JPVVAgdGFnLCB3aGljaCB3YXMgYWN0dWFsbHkgcGFydAorICAvLyBvZiB0aGUgZW5jbG9zaW5nIG1lc3NhZ2UuICBUaGUgZW5jbG9zaW5nIG1lc3NhZ2Ugd291bGQgbGlrZSB0byBjaGVjayB0aGF0CisgIC8vIHRhZyB0byBtYWtlIHN1cmUgaXQgaGFkIHRoZSByaWdodCBudW1iZXIsIHNvIGl0IGNhbGxzIExhc3RUYWdXYXMoKSBvbgorICAvLyByZXR1cm4gZnJvbSB0aGUgZW1iZWRkZWQgcGFyc2VyIHRvIGNoZWNrLgorICBib29sIExhc3RUYWdXYXModWludDMyIGV4cGVjdGVkKTsKKworICAvLyBXaGVuIHBhcnNpbmcgbWVzc2FnZSAoYnV0IE5PVCBhIGdyb3VwKSwgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKKyAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSByZXR1cm5zIChpZiBpdCByZXR1cm5zIHRydWUpCisgIC8vIHRvIGZ1cnRoZXIgdmVyaWZ5IHRoYXQgdGhlIG1lc3NhZ2UgZW5kZWQgaW4gYSBsZWdpdGltYXRlIHdheS4gIEZvcgorICAvLyBleGFtcGxlLCB0aGlzIHZlcmlmaWVzIHRoYXQgcGFyc2luZyBkaWQgbm90IGVuZCBvbiBhbiBlbmQtZ3JvdXAgdGFnLgorICAvLyBJdCBhbHNvIGNoZWNrcyBmb3Igc29tZSBjYXNlcyB3aGVyZSwgZHVlIHRvIG9wdGltaXphdGlvbnMsCisgIC8vIE1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgY2FuIGluY29ycmVjdGx5IHJldHVybiB0cnVlLgorICBib29sIENvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworCisgIC8vIExpbWl0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIExpbWl0cyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgbGVuZ3RoLWRlbGltaXRlZCBlbWJlZGRlZCBtZXNzYWdlcy4KKyAgLy8gQWZ0ZXIgdGhlIG1lc3NhZ2UncyBsZW5ndGggaXMgcmVhZCwgUHVzaExpbWl0KCkgaXMgdXNlZCB0byBwcmV2ZW50CisgIC8vIHRoZSBDb2RlZElucHV0U3RyZWFtIGZyb20gcmVhZGluZyBiZXlvbmQgdGhhdCBsZW5ndGguICBPbmNlIHRoZQorICAvLyBlbWJlZGRlZCBtZXNzYWdlIGhhcyBiZWVuIHBhcnNlZCwgUG9wTGltaXQoKSBpcyBjYWxsZWQgdG8gdW5kbyB0aGUKKyAgLy8gbGltaXQuCisKKyAgLy8gT3BhcXVlIHR5cGUgdXNlZCB3aXRoIFB1c2hMaW1pdCgpIGFuZCBQb3BMaW1pdCgpLiAgRG8gbm90IG1vZGlmeQorICAvLyB2YWx1ZXMgb2YgdGhpcyB0eXBlIHlvdXJzZWxmLiAgVGhlIG9ubHkgcmVhc29uIHRoYXQgdGhpcyBpc24ndCBhCisgIC8vIHN0cnVjdCB3aXRoIHByaXZhdGUgaW50ZXJuYWxzIGlzIGZvciBlZmZpY2llbmN5LgorICB0eXBlZGVmIGludCBMaW1pdDsKKworICAvLyBQbGFjZXMgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIHN0cmVhbSBtYXkgcmVhZCwKKyAgLy8gc3RhcnRpbmcgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4gIE9uY2UgdGhlIHN0cmVhbSBoaXRzIHRoaXMgbGltaXQsCisgIC8vIGl0IHdpbGwgYWN0IGxpa2UgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaGFzIGJlZW4gcmVhY2hlZCB1bnRpbCBQb3BMaW1pdCgpCisgIC8vIGlzIGNhbGxlZC4KKyAgLy8KKyAgLy8gQXMgdGhlIG5hbWVzIGltcGx5LCB0aGUgc3RyZWFtIGNvbmNlcHR1YWxseSBoYXMgYSBzdGFjayBvZiBsaW1pdHMuICBUaGUKKyAgLy8gc2hvcnRlc3QgbGltaXQgb24gdGhlIHN0YWNrIGlzIGFsd2F5cyBlbmZvcmNlZCwgZXZlbiBpZiBpdCBpcyBub3QgdGhlCisgIC8vIHRvcCBsaW1pdC4KKyAgLy8KKyAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IFB1c2hMaW1pdCgpIGlzIG9wYXF1ZSB0byB0aGUgY2FsbGVyLCBhbmQgbXVzdAorICAvLyBiZSBwYXNzZWQgdW5jaGFuZ2VkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgdG8gUG9wTGltaXQoKS4KKyAgTGltaXQgUHVzaExpbWl0KGludCBieXRlX2xpbWl0KTsKKworICAvLyBQb3BzIHRoZSBsYXN0IGxpbWl0IHB1c2hlZCBieSBQdXNoTGltaXQoKS4gIFRoZSBpbnB1dCBtdXN0IGJlIHRoZSB2YWx1ZQorICAvLyByZXR1cm5lZCBieSB0aGF0IGNhbGwgdG8gUHVzaExpbWl0KCkuCisgIHZvaWQgUG9wTGltaXQoTGltaXQgbGltaXQpOworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHVudGlsIHRoZSBuZWFyZXN0IGxpbWl0IG9uIHRoZQorICAvLyBzdGFjayBpcyBoaXQsIG9yIC0xIGlmIG5vIGxpbWl0cyBhcmUgaW4gcGxhY2UuCisgIGludCBCeXRlc1VudGlsTGltaXQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICBpbnQgQ3VycmVudFBvc2l0aW9uKCkgY29uc3Q7CisKKyAgLy8gVG90YWwgQnl0ZXMgTGltaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVG8gcHJldmVudCBtYWxpY2lvdXMgdXNlcnMgZnJvbSBzZW5kaW5nIGV4Y2Vzc2l2ZWx5IGxhcmdlIG1lc3NhZ2VzCisgIC8vIGFuZCBjYXVzaW5nIGludGVnZXIgb3ZlcmZsb3dzIG9yIG1lbW9yeSBleGhhdXN0aW9uLCBDb2RlZElucHV0U3RyZWFtCisgIC8vIGltcG9zZXMgYSBoYXJkIGxpbWl0IG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaXQgd2lsbCByZWFkLgorCisgIC8vIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhpcyBDb2RlZElucHV0U3RyZWFtIHdpbGwgcmVhZAorICAvLyBiZWZvcmUgcmVmdXNpbmcgdG8gY29udGludWUuICBUbyBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGluIHRoZQorICAvLyBwcm90b2NvbCBidWZmZXJzIGltcGxlbWVudGF0aW9uLCBhcyB3ZWxsIGFzIHRvIHByZXZlbnQgc2VydmVycyBmcm9tCisgIC8vIGFsbG9jYXRpbmcgZW5vcm1vdXMgYW1vdW50cyBvZiBtZW1vcnkgdG8gaG9sZCBwYXJzZWQgbWVzc2FnZXMsIHRoZQorICAvLyBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoIHNob3VsZCBiZSBsaW1pdGVkIHRvIHRoZSBzaG9ydGVzdCBsZW5ndGggdGhhdAorICAvLyB3aWxsIG5vdCBoYXJtIHVzYWJpbGl0eS4gIFRoZSB0aGVvcmV0aWNhbCBzaG9ydGVzdCBtZXNzYWdlIHRoYXQgY291bGQKKyAgLy8gY2F1c2UgaW50ZWdlciBvdmVyZmxvd3MgaXMgNTEyTUIuICBUaGUgZGVmYXVsdCBsaW1pdCBpcyA2NE1CLiAgQXBwcworICAvLyBzaG91bGQgc2V0IHNob3J0ZXIgbGltaXRzIGlmIHBvc3NpYmxlLiAgSWYgd2FybmluZ190aHJlc2hvbGQgaXMgbm90IC0xLAorICAvLyBhIHdhcm5pbmcgd2lsbCBiZSBwcmludGVkIHRvIHN0ZGVyciBhZnRlciB3YXJuaW5nX3RocmVzaG9sZCBieXRlcyBhcmUKKyAgLy8gcmVhZC4gIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbGwgbmVnYXRpdmUgdmFsdWVzIGdldCBzcXVhY2hlZCB0byAtMSwKKyAgLy8gYXMgb3RoZXIgbmVnYXRpdmUgdmFsdWVzIG1pZ2h0IGhhdmUgc3BlY2lhbCBpbnRlcm5hbCBtZWFuaW5ncy4KKyAgLy8gQW4gZXJyb3Igd2lsbCBhbHdheXMgYmUgcHJpbnRlZCB0byBzdGRlcnIgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuCisgIC8vCisgIC8vIFRoaXMgaXMgdW5yZWxhdGVkIHRvIFB1c2hMaW1pdCgpL1BvcExpbWl0KCkuCisgIC8vCisgIC8vIEhpbnQ6ICBJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBiZWNhdXNlIHlvdXIgcHJvZ3JhbSBpcyBwcmludGluZyBhCisgIC8vICAgd2FybmluZyBhYm91dCBkYW5nZXJvdXNseSBsYXJnZSBwcm90b2NvbCBtZXNzYWdlcywgeW91IG1heSBiZQorICAvLyAgIGNvbmZ1c2VkIGFib3V0IHdoYXQgdG8gZG8gbmV4dC4gIFRoZSBiZXN0IG9wdGlvbiBpcyB0byBjaGFuZ2UgeW91cgorICAvLyAgIGRlc2lnbiBzdWNoIHRoYXQgZXhjZXNzaXZlbHkgbGFyZ2UgbWVzc2FnZXMgYXJlIG5vdCBuZWNlc3NhcnkuCisgIC8vICAgRm9yIGV4YW1wbGUsIHRyeSB0byBkZXNpZ24gZmlsZSBmb3JtYXRzIHRvIGNvbnNpc3Qgb2YgbWFueSBzbWFsbAorICAvLyAgIG1lc3NhZ2VzIHJhdGhlciB0aGFuIGEgc2luZ2xlIGxhcmdlIG9uZS4gIElmIHRoaXMgaXMgaW5mZWFzaWJsZSwKKyAgLy8gICB5b3Ugd2lsbCBuZWVkIHRvIGluY3JlYXNlIHRoZSBsaW1pdC4gIENoYW5jZXMgYXJlLCB0aG91Z2gsIHRoYXQKKyAgLy8gICB5b3VyIGNvZGUgbmV2ZXIgY29uc3RydWN0cyBhIENvZGVkSW5wdXRTdHJlYW0gb24gd2hpY2ggdGhlIGxpbWl0CisgIC8vICAgY2FuIGJlIHNldC4gIFlvdSBwcm9iYWJseSBwYXJzZSBtZXNzYWdlcyBieSBjYWxsaW5nIHRoaW5ncyBsaWtlCisgIC8vICAgTWVzc2FnZTo6UGFyc2VGcm9tU3RyaW5nKCkuICBJbiB0aGlzIGNhc2UsIHlvdSB3aWxsIG5lZWQgdG8gY2hhbmdlCisgIC8vICAgeW91ciBjb2RlIHRvIGluc3RlYWQgY29uc3RydWN0IHNvbWUgc29ydCBvZiBaZXJvQ29weUlucHV0U3RyZWFtCisgIC8vICAgKGUuZy4gYW4gQXJyYXlJbnB1dFN0cmVhbSksIGNvbnN0cnVjdCBhIENvZGVkSW5wdXRTdHJlYW0gYXJvdW5kCisgIC8vICAgdGhhdCwgdGhlbiBjYWxsIE1lc3NhZ2U6OlBhcnNlRnJvbUNvZGVkU3RyZWFtKCkgaW5zdGVhZC4gIFRoZW4KKyAgLy8gICB5b3UgY2FuIGFkanVzdCB0aGUgbGltaXQuICBZZXMsIGl0J3MgbW9yZSB3b3JrLCBidXQgeW91J3JlIGRvaW5nCisgIC8vICAgc29tZXRoaW5nIHVudXN1YWwuCisgIHZvaWQgU2V0VG90YWxCeXRlc0xpbWl0KGludCB0b3RhbF9ieXRlc19saW1pdCwgaW50IHdhcm5pbmdfdGhyZXNob2xkKTsKKworICAvLyBSZWN1cnNpb24gTGltaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUbyBwcmV2ZW50IGNvcnJ1cHQgb3IgbWFsaWNpb3VzIG1lc3NhZ2VzIGZyb20gY2F1c2luZyBzdGFjayBvdmVyZmxvd3MsCisgIC8vIHdlIG11c3Qga2VlcCB0cmFjayBvZiB0aGUgZGVwdGggb2YgcmVjdXJzaW9uIHdoZW4gcGFyc2luZyBlbWJlZGRlZAorICAvLyBtZXNzYWdlcyBhbmQgZ3JvdXBzLiAgQ29kZWRJbnB1dFN0cmVhbSBrZWVwcyB0cmFjayBvZiB0aGlzIGJlY2F1c2UgaXQKKyAgLy8gaXMgdGhlIG9ubHkgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGRvd24gdGhlIHN0YWNrIGR1cmluZyBwYXJzaW5nLgorCisgIC8vIFNldHMgdGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLiAgVGhlIGRlZmF1bHQgaXMgMTAwLgorICB2b2lkIFNldFJlY3Vyc2lvbkxpbWl0KGludCBsaW1pdCk7CisKKworICAvLyBJbmNyZW1lbnRzIHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVwdGggaXMKKyAgLy8gdW5kZXIgdGhlIGxpbWl0LCBmYWxzZSBpZiBpdCBoYXMgZ29uZSBvdmVyLgorICBib29sIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisKKyAgLy8gRGVjcmVtZW50cyB0aGUgcmVjdXJzaW9uIGRlcHRoLgorICB2b2lkIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisKKyAgLy8gRXh0ZW5zaW9uIFJlZ2lzdHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQURWQU5DRUQgVVNBR0U6ICA5OS45JSBvZiBwZW9wbGUgY2FuIGlnbm9yZSB0aGlzIHNlY3Rpb24uCisgIC8vCisgIC8vIEJ5IGRlZmF1bHQsIHdoZW4gcGFyc2luZyBleHRlbnNpb25zLCB0aGUgcGFyc2VyIGxvb2tzIGZvciBleHRlbnNpb24KKyAgLy8gZGVmaW5pdGlvbnMgaW4gdGhlIHBvb2wgd2hpY2ggb3ducyB0aGUgb3V0ZXIgbWVzc2FnZSdzIERlc2NyaXB0b3IuCisgIC8vIEhvd2V2ZXIsIHlvdSBtYXkgY2FsbCBTZXRFeHRlbnNpb25SZWdpc3RyeSgpIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUKKyAgLy8gcG9vbCBpbnN0ZWFkLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGV4YW1wbGUsIHRvIHBhcnNlIGEgbWVzc2FnZQorICAvLyB1c2luZyBhIGdlbmVyYXRlZCBjbGFzcywgYnV0IHJlcHJlc2VudCBzb21lIGV4dGVuc2lvbnMgdXNpbmcKKyAgLy8gRHluYW1pY01lc3NhZ2UuCisKKyAgLy8gU2V0IHRoZSBwb29sIHVzZWQgdG8gbG9vayB1cCBleHRlbnNpb25zLiAgTW9zdCB1c2VycyBkbyBub3QgbmVlZCB0byBjYWxsCisgIC8vIHRoaXMgYXMgdGhlIGNvcnJlY3QgcG9vbCB3aWxsIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5LgorICAvLworICAvLyBXQVJOSU5HOiAgSXQgaXMgdmVyeSBlYXN5IHRvIG1pc3VzZSB0aGlzLiAgQ2FyZWZ1bGx5IHJlYWQgdGhlIHJlcXVpcmVtZW50cworICAvLyAgIGJlbG93LiAgRG8gbm90IHVzZSB0aGlzIHVubGVzcyB5b3UgYXJlIHN1cmUgeW91IG5lZWQgaXQuICBBbG1vc3Qgbm8gb25lCisgIC8vICAgZG9lcy4KKyAgLy8KKyAgLy8gTGV0J3Mgc2F5IHlvdSBhcmUgcGFyc2luZyBhIG1lc3NhZ2UgaW50byBtZXNzYWdlIG9iamVjdCBtLCBhbmQgeW91IHdhbnQKKyAgLy8gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS4gIFlvdSBtdXN0IGZvbGxvdyB0aGVzZQorICAvLyByZXF1aXJlbWVudHM6CisgIC8vCisgIC8vIFRoZSBnaXZlbiBEZXNjcmlwdG9yUG9vbCBtdXN0IGNvbnRhaW4gbS0+R2V0RGVzY3JpcHRvcigpLiAgSXQgaXMgbm90CisgIC8vIHN1ZmZpY2llbnQgZm9yIGl0IHRvIHNpbXBseSBjb250YWluIGEgZGVzY3JpcHRvciB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lCisgIC8vIGFuZCBjb250ZW50IC0tIGl0IG11c3QgYmUgdGhlICpleGFjdCBvYmplY3QqLiAgSW4gb3RoZXIgd29yZHM6CisgIC8vICAgYXNzZXJ0KHBvb2wtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShtLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKSA9PQorICAvLyAgICAgICAgICBtLT5HZXREZXNjcmlwdG9yKCkpOworICAvLyBUaGVyZSBhcmUgdHdvIHdheXMgdG8gc2F0aXNmeSB0aGlzIHJlcXVpcmVtZW50OgorICAvLyAxKSBVc2UgbS0+R2V0RGVzY3JpcHRvcigpLT5wb29sKCkgYXMgdGhlIHBvb2wuICBUaGlzIGlzIGdlbmVyYWxseSB1c2VsZXNzCisgIC8vICAgIGJlY2F1c2UgdGhpcyBpcyB0aGUgcG9vbCB0aGF0IHdvdWxkIGJlIHVzZWQgYW55d2F5IGlmIHlvdSBkaWRuJ3QgY2FsbAorICAvLyAgICBTZXRFeHRlbnNpb25SZWdpc3RyeSgpIGF0IGFsbC4KKyAgLy8gMikgVXNlIGEgRGVzY3JpcHRvclBvb2wgd2hpY2ggaGFzIG0tPkdldERlc2NyaXB0b3IoKS0+cG9vbCgpIGFzIGFuCisgIC8vICAgICJ1bmRlcmxheSIuICBSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBEZXNjcmlwdG9yUG9vbCBmb3IgbW9yZQorICAvLyAgICBpbmZvcm1hdGlvbiBhYm91dCB1bmRlcmxheXMuCisgIC8vCisgIC8vIFlvdSBtdXN0IGFsc28gcHJvdmlkZSBhIE1lc3NhZ2VGYWN0b3J5LiAgVGhpcyBmYWN0b3J5IHdpbGwgYmUgdXNlZCB0bworICAvLyBjb25zdHJ1Y3QgTWVzc2FnZSBvYmplY3RzIHJlcHJlc2VudGluZyBleHRlbnNpb25zLiAgVGhlIGZhY3RvcnkncworICAvLyBHZXRQcm90b3R5cGUoKSBNVVNUIHJldHVybiBub24tTlVMTCBmb3IgYW55IERlc2NyaXB0b3Igd2hpY2ggY2FuIGJlIGZvdW5kCisgIC8vIHRocm91Z2ggdGhlIHByb3ZpZGVkIHBvb2wuCisgIC8vCisgIC8vIElmIHRoZSBwcm92aWRlZCBmYWN0b3J5IG1pZ2h0IHJldHVybiBpbnN0YW5jZXMgb2YgcHJvdG9jb2wtY29tcGlsZXItCisgIC8vIGdlbmVyYXRlZCAoaS5lLiBjb21waWxlZC1pbikgdHlwZXMsIG9yIGlmIHRoZSBvdXRlciBtZXNzYWdlIG9iamVjdCBtIGlzCisgIC8vIGEgZ2VuZXJhdGVkIHR5cGUsIHRoZW4gdGhlIGdpdmVuIGZhY3RvcnkgTVVTVCBoYXZlIHRoaXMgcHJvcGVydHk6ICBJZgorICAvLyBHZXRQcm90b3R5cGUoKSBpcyBnaXZlbiBhIERlc2NyaXB0b3Igd2hpY2ggcmVzaWRlcyBpbgorICAvLyBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwgdGhlIGZhY3RvcnkgTVVTVCByZXR1cm4gdGhlIHNhbWUKKyAgLy8gcHJvdG90eXBlIHdoaWNoIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpIHdvdWxkIHJldHVybi4gIFRoYXQKKyAgLy8gaXMsIGdpdmVuIGEgZGVzY3JpcHRvciBmb3IgYSBnZW5lcmF0ZWQgdHlwZSwgdGhlIGZhY3RvcnkgbXVzdCByZXR1cm4gYW4KKyAgLy8gaW5zdGFuY2Ugb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoTk9UIER5bmFtaWNNZXNzYWdlKS4gIEhvd2V2ZXIsIHdoZW4KKyAgLy8gZ2l2ZW4gYSBkZXNjcmlwdG9yIGZvciBhIHR5cGUgdGhhdCBpcyBOT1QgaW4gZ2VuZXJhdGVkX3Bvb2wsIHRoZSBmYWN0b3J5CisgIC8vIGlzIGZyZWUgdG8gcmV0dXJuIGFueSBpbXBsZW1lbnRhdGlvbi4KKyAgLy8KKyAgLy8gVGhlIHJlYXNvbiBmb3IgdGhpcyByZXF1aXJlbWVudCBpcyB0aGF0IGdlbmVyYXRlZCBzdWItb2JqZWN0cyBtYXkgYmUKKyAgLy8gYWNjZXNzZWQgdmlhIHRoZSBzdGFuZGFyZCAobm9uLXJlZmxlY3Rpb24pIGV4dGVuc2lvbiBhY2Nlc3NvciBtZXRob2RzLAorICAvLyBhbmQgdGhlc2UgbWV0aG9kcyB3aWxsIGRvd24tY2FzdCB0aGUgb2JqZWN0IHRvIHRoZSBnZW5lcmF0ZWQgY2xhc3MgdHlwZS4KKyAgLy8gSWYgdGhlIG9iamVjdCBpcyBub3QgYWN0dWFsbHkgb2YgdGhhdCB0eXBlLCB0aGUgcmVzdWx0cyB3b3VsZCBiZSB1bmRlZmluZWQuCisgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBhbiBleHRlbnNpb24gaXMgbm90IGNvbXBpbGVkIGluLCB0aGVuIHRoZXJlIGlzIG5vCisgIC8vIHdheSB0aGUgY29kZSBjb3VsZCBlbmQgdXAgYWNjZXNzaW5nIGl0IHZpYSB0aGUgc3RhbmRhcmQgYWNjZXNzb3JzIC0tIHRoZQorICAvLyBvbmx5IHdheSB0byBhY2Nlc3MgdGhlIGV4dGVuc2lvbiBpcyB2aWEgcmVmbGVjdGlvbi4gIFdoZW4gdXNpbmcgcmVmbGVjdGlvbiwKKyAgLy8gRHluYW1pY01lc3NhZ2UgYW5kIGdlbmVyYXRlZCBtZXNzYWdlcyBhcmUgaW5kaXN0aW5ndWlzaGFibGUsIHNvIGl0J3MgZmluZQorICAvLyBpZiB0aGVzZSBvYmplY3RzIGFyZSByZXByZXNlbnRlZCB1c2luZyBEeW5hbWljTWVzc2FnZS4KKyAgLy8KKyAgLy8gVXNpbmcgRHluYW1pY01lc3NhZ2VGYWN0b3J5IG9uIHdoaWNoIHlvdSBoYXZlIGNhbGxlZAorICAvLyBTZXREZWxlZ2F0ZVRvR2VuZXJhdGVkRmFjdG9yeSh0cnVlKSBzaG91bGQgYmUgc3VmZmljaWVudCB0byBzYXRpc2Z5IHRoZQorICAvLyBhYm92ZSByZXF1aXJlbWVudC4KKyAgLy8KKyAgLy8gSWYgZWl0aGVyIHBvb2wgb3IgZmFjdG9yeSBpcyBOVUxMLCBib3RoIG11c3QgYmUgTlVMTC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBpZ25vcmVkIHdoZW4gcGFyc2luZyAibGl0ZSIgbWVzc2FnZXMgYXMgdGhleSBkbworICAvLyBub3QgaGF2ZSBkZXNjcmlwdG9ycy4KKyAgdm9pZCBTZXRFeHRlbnNpb25SZWdpc3RyeShjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSk7CisKKyAgLy8gR2V0IHRoZSBEZXNjcmlwdG9yUG9vbCBzZXQgdmlhIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCksIG9yIE5VTEwgaWYgbm8gcG9vbAorICAvLyBoYXMgYmVlbiBwcm92aWRlZC4KKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIEdldEV4dGVuc2lvblBvb2woKTsKKworICAvLyBHZXQgdGhlIE1lc3NhZ2VGYWN0b3J5IHNldCB2aWEgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgb3IgTlVMTCBpZiBubworICAvLyBmYWN0b3J5IGhhcyBiZWVuIHByb3ZpZGVkLgorICBNZXNzYWdlRmFjdG9yeSogR2V0RXh0ZW5zaW9uRmFjdG9yeSgpOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvZGVkSW5wdXRTdHJlYW0pOworCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0XzsKKyAgY29uc3QgdWludDgqIGJ1ZmZlcl87CisgIGNvbnN0IHVpbnQ4KiBidWZmZXJfZW5kXzsgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICBpbnQgdG90YWxfYnl0ZXNfcmVhZF87ICAvLyB0b3RhbCBieXRlcyByZWFkIGZyb20gaW5wdXRfLCBpbmNsdWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgYnVmZmVyCisKKyAgLy8gSWYgdG90YWxfYnl0ZXNfcmVhZF8gc3VycGFzc2VzIElOVF9NQVgsIHdlIHJlY29yZCB0aGUgZXh0cmEgYnl0ZXMgaGVyZQorICAvLyBzbyB0aGF0IHdlIGNhbiBCYWNrVXAoKSBvbiBkZXN0cnVjdGlvbi4KKyAgaW50IG92ZXJmbG93X2J5dGVzXzsKKworICAvLyBMYXN0VGFnV2FzKCkgc3R1ZmYuCisgIHVpbnQzMiBsYXN0X3RhZ187ICAgICAgICAgLy8gcmVzdWx0IG9mIGxhc3QgUmVhZFRhZygpLgorCisgIC8vIFRoaXMgaXMgc2V0IHRydWUgYnkgUmVhZFRhZ3tGYWxsYmFjay9TbG93fSgpIGlmIGl0IGlzIGNhbGxlZCB3aGVuIGV4YWN0bHkKKyAgLy8gYXQgRU9GLCBvciBieSBFeHBlY3RBdEVuZCgpIHdoZW4gaXQgcmV0dXJucyB0cnVlLiAgVGhpcyBoYXBwZW5zIHdoZW4gd2UKKyAgLy8gcmVhY2ggdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYW5kIGF0dGVtcHQgdG8gcmVhZCBhbm90aGVyIHRhZy4KKyAgYm9vbCBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXzsKKworICAvLyBTZWUgRW5hYmxlQWxpYXNpbmcoKS4KKyAgYm9vbCBhbGlhc2luZ19lbmFibGVkXzsKKworICAvLyBMaW1pdHMKKyAgTGltaXQgY3VycmVudF9saW1pdF87ICAgLy8gaWYgcG9zaXRpb24gPSAtMSwgbm8gbGltaXQgaXMgYXBwbGllZAorCisgIC8vIEZvciBzaW1wbGljaXR5LCBpZiB0aGUgY3VycmVudCBidWZmZXIgY3Jvc3NlcyBhIGxpbWl0IChlaXRoZXIgYSBub3JtYWwKKyAgLy8gbGltaXQgY3JlYXRlZCBieSBQdXNoTGltaXQoKSBvciB0aGUgdG90YWwgYnl0ZXMgbGltaXQpLCBidWZmZXJfc2l6ZV8KKyAgLy8gb25seSB0cmFja3MgdGhlIG51bWJlciBvZiBieXRlcyBiZWZvcmUgdGhhdCBsaW1pdC4gIFRoaXMgZmllbGQKKyAgLy8gY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBhZnRlciBpdC4gIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgdGhhdCBpZgorICAvLyBidWZmZXJfc2l6ZV8gPT0gMCBhbmQgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCwgd2Uga25vdyB3ZSd2ZQorICAvLyBoaXQgYSBsaW1pdC4gIEhvd2V2ZXIsIGlmIGJvdGggYXJlIHplcm8sIGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbgorICAvLyB3ZSBhcmVuJ3QgYXQgYSBsaW1pdCAtLSB0aGUgYnVmZmVyIG1heSBoYXZlIGVuZGVkIGV4YWN0bHkgYXQgdGhlIGxpbWl0LgorICBpbnQgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOworCisgIC8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQsIHBlcmlvZC4gIFRoaXMgaXMgdW5yZWxhdGVkIHRvCisgIC8vIGN1cnJlbnRfbGltaXRfLiAgU2V0IHVzaW5nIFNldFRvdGFsQnl0ZXNMaW1pdCgpLgorICBpbnQgdG90YWxfYnl0ZXNfbGltaXRfOworCisgIC8vIElmIHBvc2l0aXZlLzA6IExpbWl0IGZvciBieXRlcyByZWFkIGFmdGVyIHdoaWNoIGEgd2FybmluZyBkdWUgdG8gc2l6ZQorICAvLyBzaG91bGQgYmUgbG9nZ2VkLgorICAvLyBJZiAtMTogUHJpbnRpbmcgb2Ygd2FybmluZyBkaXNhYmxlZC4gQ2FuIGJlIHNldCBieSBjbGllbnQuCisgIC8vIElmIC0yOiBJbnRlcm5hbDogTGltaXQgaGFzIGJlZW4gcmVhY2hlZCwgcHJpbnQgZnVsbCBzaXplIHdoZW4gZGVzdHJ1Y3RpbmcuCisgIGludCB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF87CisKKyAgLy8gQ3VycmVudCByZWN1cnNpb24gZGVwdGgsIGNvbnRyb2xsZWQgYnkgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSBhbmQKKyAgLy8gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKS4KKyAgaW50IHJlY3Vyc2lvbl9kZXB0aF87CisgIC8vIFJlY3Vyc2lvbiBkZXB0aCBsaW1pdCwgc2V0IGJ5IFNldFJlY3Vyc2lvbkxpbWl0KCkuCisgIGludCByZWN1cnNpb25fbGltaXRfOworCisgIC8vIFNlZSBTZXRFeHRlbnNpb25SZWdpc3RyeSgpLgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCogZXh0ZW5zaW9uX3Bvb2xfOworICBNZXNzYWdlRmFjdG9yeSogZXh0ZW5zaW9uX2ZhY3RvcnlfOworCisgIC8vIFByaXZhdGUgbWVtYmVyIGZ1bmN0aW9ucy4KKworICAvLyBBZHZhbmNlIHRoZSBidWZmZXIgYnkgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgIHZvaWQgQWR2YW5jZShpbnQgYW1vdW50KTsKKworICAvLyBCYWNrIHVwIGlucHV0XyB0byB0aGUgY3VycmVudCBidWZmZXIgcG9zaXRpb24uCisgIHZvaWQgQmFja1VwSW5wdXRUb0N1cnJlbnRQb3NpdGlvbigpOworCisgIC8vIFJlY29tcHV0ZXMgdGhlIHZhbHVlIG9mIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0Xy4gIE11c3QgYmUgY2FsbGVkIGFmdGVyCisgIC8vIGN1cnJlbnRfbGltaXRfIG9yIHRvdGFsX2J5dGVzX2xpbWl0XyBjaGFuZ2VzLgorICB2b2lkIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOworCisgIC8vIFdyaXRlcyBhbiBlcnJvciBtZXNzYWdlIHNheWluZyB0aGF0IHdlIGhpdCB0b3RhbF9ieXRlc19saW1pdF8uCisgIHZvaWQgUHJpbnRUb3RhbEJ5dGVzTGltaXRFcnJvcigpOworCisgIC8vIENhbGxlZCB3aGVuIHRoZSBidWZmZXIgcnVucyBvdXQgdG8gcmVxdWVzdCBtb3JlIGRhdGEuICBJbXBsaWVzIGFuCisgIC8vIEFkdmFuY2UoQnVmZmVyU2l6ZSgpKS4KKyAgYm9vbCBSZWZyZXNoKCk7CisKKyAgLy8gV2hlbiBwYXJzaW5nIHZhcmludHMsIHdlIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2Ygc21hbGwgdmFsdWVzLCBhbmQKKyAgLy8gdGhlbiBvcHRpbWl6ZSBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgdmFyaW50IGZpdHMgd2l0aGluIHRoZSBjdXJyZW50IGJ1ZmZlcgorICAvLyBwaWVjZS4gVGhlIEZhbGxiYWNrIG1ldGhvZCBpcyB1c2VkIHdoZW4gd2UgY2FuJ3QgdXNlIHRoZSBvbmUtYnl0ZQorICAvLyBvcHRpbWl6YXRpb24uIFRoZSBTbG93IG1ldGhvZCBpcyB5ZXQgYW5vdGhlciBmYWxsYmFjayB3aGVuIHRoZSBidWZmZXIgaXMKKyAgLy8gbm90IGxhcmdlIGVub3VnaC4gTWFraW5nIHRoZSBzbG93IHBhdGggb3V0LW9mLWxpbmUgc3BlZWRzIHVwIHRoZSBjb21tb24KKyAgLy8gY2FzZSBieSAxMC0xNSUuIFRoZSBzbG93IHBhdGggaXMgZmFpcmx5IHVuY29tbW9uOiBpdCBvbmx5IHRyaWdnZXJzIHdoZW4gYQorICAvLyBtZXNzYWdlIGNyb3NzZXMgbXVsdGlwbGUgYnVmZmVycy4KKyAgYm9vbCBSZWFkVmFyaW50MzJGYWxsYmFjayh1aW50MzIqIHZhbHVlKTsKKyAgYm9vbCBSZWFkVmFyaW50NjRGYWxsYmFjayh1aW50NjQqIHZhbHVlKTsKKyAgYm9vbCBSZWFkVmFyaW50MzJTbG93KHVpbnQzMiogdmFsdWUpOworICBib29sIFJlYWRWYXJpbnQ2NFNsb3codWludDY0KiB2YWx1ZSk7CisgIGJvb2wgUmVhZExpdHRsZUVuZGlhbjMyRmFsbGJhY2sodWludDMyKiB2YWx1ZSk7CisgIGJvb2wgUmVhZExpdHRsZUVuZGlhbjY0RmFsbGJhY2sodWludDY0KiB2YWx1ZSk7CisgIC8vIEZhbGxiYWNrL3Nsb3cgbWV0aG9kcyBmb3IgcmVhZGluZyB0YWdzLiBUaGVzZSBkbyBub3QgdXBkYXRlIGxhc3RfdGFnXywKKyAgLy8gYnV0IHdpbGwgc2V0IGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICAvLyBzdHJlYW0uCisgIHVpbnQzMiBSZWFkVGFnRmFsbGJhY2soKTsKKyAgdWludDMyIFJlYWRUYWdTbG93KCk7CisgIGJvb2wgUmVhZFN0cmluZ0ZhbGxiYWNrKHN0cmluZyogYnVmZmVyLCBpbnQgc2l6ZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCisgIGludCBCdWZmZXJTaXplKCkgY29uc3Q7CisKKyAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFRvdGFsQnl0ZXNMaW1pdCA9IDY0IDw8IDIwOyAgLy8gNjRNQgorCisgIHN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRUb3RhbEJ5dGVzV2FybmluZ1RocmVzaG9sZCA9IDMyIDw8IDIwOyAgLy8gMzJNQgorCisgIHN0YXRpYyBpbnQgZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfOyAgLy8gMTAwIGJ5IGRlZmF1bHQuCit9OworCisvLyBDbGFzcyB3aGljaCBlbmNvZGVzIGFuZCB3cml0ZXMgYmluYXJ5IGRhdGEgd2hpY2ggaXMgY29tcG9zZWQgb2YgdmFyaW50LQorLy8gZW5jb2RlZCBpbnRlZ2VycyBhbmQgZml4ZWQtd2lkdGggcGllY2VzLiAgV3JhcHMgYSBaZXJvQ29weU91dHB1dFN0cmVhbS4KKy8vIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0byBkZWFsIHdpdGggQ29kZWRPdXRwdXRTdHJlYW0uCisvLworLy8gTW9zdCBtZXRob2RzIG9mIENvZGVkT3V0cHV0U3RyZWFtIHdoaWNoIHJldHVybiBhIGJvb2wgcmV0dXJuIGZhbHNlIGlmIGFuCisvLyB1bmRlcmx5aW5nIEkvTyBlcnJvciBvY2N1cnMuICBPbmNlIHN1Y2ggYSBmYWlsdXJlIG9jY3VycywgdGhlCisvLyBDb2RlZE91dHB1dFN0cmVhbSBpcyBicm9rZW4gYW5kIGlzIG5vIGxvbmdlciB1c2VmdWwuIFRoZSBXcml0ZSogbWV0aG9kcyBkbworLy8gbm90IHJldHVybiB0aGUgc3RyZWFtIHN0YXR1cywgYnV0IHdpbGwgaW52YWxpZGF0ZSB0aGUgc3RyZWFtIGlmIGFuIGVycm9yCisvLyBvY2N1cnMuIFRoZSBjbGllbnQgY2FuIHByb2JlIEhhZEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0dXMuCisvLworLy8gTm90ZSB0aGF0IGV2ZXJ5IG1ldGhvZCBvZiBDb2RlZE91dHB1dFN0cmVhbSB3aGljaCB3cml0ZXMgc29tZSBkYXRhIGhhcworLy8gYSBjb3JyZXNwb25kaW5nIHN0YXRpYyAiVG9BcnJheSIgdmVyc2lvbi4gVGhlc2UgdmVyc2lvbnMgd3JpdGUgZGlyZWN0bHkKKy8vIHRvIHRoZSBwcm92aWRlZCBidWZmZXIsIHJldHVybmluZyBhIHBvaW50ZXIgcGFzdCB0aGUgbGFzdCB3cml0dGVuIGJ5dGUuCisvLyBUaGV5IHJlcXVpcmUgdGhhdCB0aGUgYnVmZmVyIGhhcyBzdWZmaWNpZW50IGNhcGFjaXR5IGZvciB0aGUgZW5jb2RlZCBkYXRhLgorLy8gVGhpcyBhbGxvd3MgYW4gb3B0aW1pemF0aW9uIHdoZXJlIHdlIGNoZWNrIGlmIGFuIG91dHB1dCBzdHJlYW0gaGFzIGVub3VnaAorLy8gc3BhY2UgZm9yIGFuIGVudGlyZSBtZXNzYWdlIGJlZm9yZSB3ZSBzdGFydCB3cml0aW5nIGFuZCwgaWYgdGhlcmUgaXMsIHdlCisvLyBjYWxsIG9ubHkgdGhlIFRvQXJyYXkgbWV0aG9kcyB0byBhdm9pZCBkb2luZyBib3VuZCBjaGVja3MgZm9yIGVhY2gKKy8vIGluZGl2aWR1YWwgdmFsdWUuCisvLyBpLmUuLCBpbiB0aGUgZXhhbXBsZSBhYm92ZToKKy8vCisvLyAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShyYXdfb3V0cHV0KTsKKy8vICAgaW50IG1hZ2ljX251bWJlciA9IDEyMzQ7CisvLyAgIGNoYXIgdGV4dFtdID0gIkhlbGxvIHdvcmxkISI7CisvLworLy8gICBpbnQgY29kZWRfc2l6ZSA9IHNpemVvZihtYWdpY19udW1iZXIpICsKKy8vICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHN0cmxlbih0ZXh0KSkgKworLy8gICAgICAgICAgICAgICAgICAgIHN0cmxlbih0ZXh0KTsKKy8vCisvLyAgIHVpbnQ4KiBidWZmZXIgPQorLy8gICAgICAgY29kZWRfb3V0cHV0LT5HZXREaXJlY3RCdWZmZXJGb3JOQnl0ZXNBbmRBZHZhbmNlKGNvZGVkX3NpemUpOworLy8gICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKKy8vICAgICAvLyBUaGUgb3V0cHV0IHN0cmVhbSBoYXMgZW5vdWdoIHNwYWNlIGluIHRoZSBidWZmZXI6IHdyaXRlIGRpcmVjdGx5IHRvCisvLyAgICAgLy8gdGhlIGFycmF5LgorLy8gICAgIGJ1ZmZlciA9IENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheShtYWdpY19udW1iZXIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisvLyAgICAgYnVmZmVyID0gQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHN0cmxlbih0ZXh0KSwgYnVmZmVyKTsKKy8vICAgICBidWZmZXIgPSBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVSYXdUb0FycmF5KHRleHQsIHN0cmxlbih0ZXh0KSwgYnVmZmVyKTsKKy8vICAgfSBlbHNlIHsKKy8vICAgICAvLyBNYWtlIGJvdW5kLWNoZWNrZWQgd3JpdGVzLCB3aGljaCB3aWxsIGFzayB0aGUgdW5kZXJseWluZyBzdHJlYW0gZm9yCisvLyAgICAgLy8gbW9yZSBzcGFjZSBhcyBuZWVkZWQuCisvLyAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKG1hZ2ljX251bWJlcik7CisvLyAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKHN0cmxlbih0ZXh0KSk7CisvLyAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyh0ZXh0LCBzdHJsZW4odGV4dCkpOworLy8gICB9CisvLworLy8gICBkZWxldGUgY29kZWRfb3V0cHV0OworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvZGVkT3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhbiBDb2RlZE91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4gWmVyb0NvcHlPdXRwdXRTdHJlYW0uCisgIGV4cGxpY2l0IENvZGVkT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIC8vIERlc3Ryb3kgdGhlIENvZGVkT3V0cHV0U3RyZWFtIGFuZCBwb3NpdGlvbiB0aGUgdW5kZXJseWluZworICAvLyBaZXJvQ29weU91dHB1dFN0cmVhbSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBieXRlIHdyaXR0ZW4uCisgIH5Db2RlZE91dHB1dFN0cmVhbSgpOworCisgIC8vIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzLCBsZWF2aW5nIHRoZSBieXRlcyB1bm1vZGlmaWVkIGluIHRoZSB1bmRlcmx5aW5nCisgIC8vIGJ1ZmZlci4gIFJldHVybnMgZmFsc2UgaWYgYW4gdW5kZXJseWluZyB3cml0ZSBlcnJvciBvY2N1cnMuICBUaGlzIGlzCisgIC8vIG1haW5seSB1c2VmdWwgd2l0aCBHZXREaXJlY3RCdWZmZXJQb2ludGVyKCkuCisgIGJvb2wgU2tpcChpbnQgY291bnQpOworCisgIC8vIFNldHMgKmRhdGEgdG8gcG9pbnQgZGlyZWN0bHkgYXQgdGhlIHVud3JpdHRlbiBwYXJ0IG9mIHRoZQorICAvLyBDb2RlZE91dHB1dFN0cmVhbSdzIHVuZGVybHlpbmcgYnVmZmVyLCBhbmQgKnNpemUgdG8gdGhlIHNpemUgb2YgdGhhdAorICAvLyBidWZmZXIsIGJ1dCBkb2VzIG5vdCBhZHZhbmNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IHBvc2l0aW9uLiAgVGhpcyB3aWxsCisgIC8vIGFsd2F5cyBlaXRoZXIgcHJvZHVjZSBhIG5vbi1lbXB0eSBidWZmZXIgb3IgcmV0dXJuIGZhbHNlLiAgSWYgdGhlIGNhbGxlcgorICAvLyB3cml0ZXMgYW55IGRhdGEgdG8gdGhpcyBidWZmZXIsIGl0IHNob3VsZCB0aGVuIGNhbGwgU2tpcCgpIHRvIHNraXAgb3ZlcgorICAvLyB0aGUgY29uc3VtZWQgYnl0ZXMuICBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBleHRlcm5hbCBmYXN0CisgIC8vIHNlcmlhbGl6YXRpb24gcm91dGluZXMgZm9yIHR5cGVzIG9mIGRhdGEgbm90IGNvdmVyZWQgYnkgdGhlCisgIC8vIENvZGVkT3V0cHV0U3RyZWFtIGludGVyZmFjZS4KKyAgYm9vbCBHZXREaXJlY3RCdWZmZXJQb2ludGVyKHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworCisgIC8vIElmIHRoZXJlIGFyZSBhdCBsZWFzdCAic2l6ZSIgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlciwKKyAgLy8gcmV0dXJucyBhIHBvaW50ZXIgZGlyZWN0bHkgaW50byB0aGUgYnVmZmVyIGFuZCBhZHZhbmNlcyBvdmVyIHRoZXNlIGJ5dGVzLgorICAvLyBUaGUgY2FsbGVyIG1heSB0aGVuIHdyaXRlIGRpcmVjdGx5IGludG8gdGhpcyBidWZmZXIgKGUuZy4gdXNpbmcgdGhlCisgIC8vICpUb0FycmF5IHN0YXRpYyBtZXRob2RzKSByYXRoZXIgdGhhbiBnbyB0aHJvdWdoIENvZGVkT3V0cHV0U3RyZWFtLiAgSWYKKyAgLy8gdGhlcmUgYXJlIG5vdCBlbm91Z2ggYnl0ZXMgYXZhaWxhYmxlLCByZXR1cm5zIE5VTEwuICBUaGUgcmV0dXJuIHBvaW50ZXIgaXMKKyAgLy8gaW52YWxpZGF0ZWQgYXMgc29vbiBhcyBhbnkgb3RoZXIgbm9uLWNvbnN0IG1ldGhvZCBvZiBDb2RlZE91dHB1dFN0cmVhbQorICAvLyBpcyBjYWxsZWQuCisgIGlubGluZSB1aW50OCogR2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShpbnQgc2l6ZSk7CisKKyAgLy8gV3JpdGUgcmF3IGJ5dGVzLCBjb3B5aW5nIHRoZW0gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLgorICB2b2lkIFdyaXRlUmF3KGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOworICAvLyBMaWtlIFdyaXRlUmF3KCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCisgIC8vIFRoaXMgaXMgX25vdF8gaW5saW5lZCwgYXMgdGhlIGNvbXBpbGVyIG9mdGVuIG9wdGltaXplcyBtZW1jcHkgaW50byBpbmxpbmUKKyAgLy8gY29weSBsb29wcy4gU2luY2UgdGhpcyBnZXRzIGNhbGxlZCBieSBldmVyeSBmaWVsZCB3aXRoIHN0cmluZyBvciBieXRlcworICAvLyB0eXBlLCBpbmxpbmluZyBtYXkgbGVhZCB0byBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb2RlIGJsb2F0LCB3aXRoIG9ubHkgYQorICAvLyBtaW5vciBwZXJmb3JtYW5jZSBnYWluLgorICBzdGF0aWMgdWludDgqIFdyaXRlUmF3VG9BcnJheShjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplLCB1aW50OCogdGFyZ2V0KTsKKworICAvLyBFcXVpdmFsZW50IHRvIFdyaXRlUmF3KHN0ci5kYXRhKCksIHN0ci5zaXplKCkpLgorICB2b2lkIFdyaXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyKTsKKyAgLy8gTGlrZSBXcml0ZVN0cmluZygpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgorICBzdGF0aWMgdWludDgqIFdyaXRlU3RyaW5nVG9BcnJheShjb25zdCBzdHJpbmcmIHN0ciwgdWludDgqIHRhcmdldCk7CisKKworICAvLyBXcml0ZSBhIDMyLWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHZvaWQgV3JpdGVMaXR0bGVFbmRpYW4zMih1aW50MzIgdmFsdWUpOworICAvLyBMaWtlIFdyaXRlTGl0dGxlRW5kaWFuMzIoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSh1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworICAvLyBXcml0ZSBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHZvaWQgV3JpdGVMaXR0bGVFbmRpYW42NCh1aW50NjQgdmFsdWUpOworICAvLyBMaWtlIFdyaXRlTGl0dGxlRW5kaWFuNjQoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworCisgIC8vIFdyaXRlIGFuIHVuc2lnbmVkIGludGVnZXIgd2l0aCBWYXJpbnQgZW5jb2RpbmcuICBXcml0aW5nIGEgMzItYml0IHZhbHVlCisgIC8vIGlzIGVxdWl2YWxlbnQgdG8gY2FzdGluZyBpdCB0byB1aW50NjQgYW5kIHdyaXRpbmcgaXQgYXMgYSA2NC1iaXQgdmFsdWUsCisgIC8vIGJ1dCBtYXkgYmUgbW9yZSBlZmZpY2llbnQuCisgIHZvaWQgV3JpdGVWYXJpbnQzMih1aW50MzIgdmFsdWUpOworICAvLyBMaWtlIFdyaXRlVmFyaW50MzIoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDMyVG9BcnJheSh1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworICAvLyBXcml0ZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLgorICB2b2lkIFdyaXRlVmFyaW50NjQodWludDY0IHZhbHVlKTsKKyAgLy8gTGlrZSBXcml0ZVZhcmludDY0KCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCisgIHN0YXRpYyB1aW50OCogV3JpdGVWYXJpbnQ2NFRvQXJyYXkodWludDY0IHZhbHVlLCB1aW50OCogdGFyZ2V0KTsKKworICAvLyBFcXVpdmFsZW50IHRvIFdyaXRlVmFyaW50MzIoKSBleGNlcHQgd2hlbiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUsCisgIC8vIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIGEgZnVsbCAxMCBieXRlcy4KKyAgdm9pZCBXcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKGludDMyIHZhbHVlKTsKKyAgLy8gTGlrZSBXcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCisgIHN0YXRpYyB1aW50OCogV3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZFRvQXJyYXkoaW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworCisgIC8vIFRoaXMgaXMgaWRlbnRpY2FsIHRvIFdyaXRlVmFyaW50MzIoKSwgYnV0IG9wdGltaXplZCBmb3Igd3JpdGluZyB0YWdzLgorICAvLyBJbiBwYXJ0aWN1bGFyLCBpZiB0aGUgaW5wdXQgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQsIHRoaXMgbWV0aG9kCisgIC8vIGNvbXBpbGVzIGRvd24gdG8gYSBjb3VwbGUgaW5zdHJ1Y3Rpb25zLgorICAvLyBBbHdheXMgaW5saW5lIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBhZm9ybWVudGlvbmVkIG9wdGltaXphdGlvbiBjYW4ndCB3b3JrLAorICAvLyBidXQgR0NDIGJ5IGRlZmF1bHQgZG9lc24ndCB3YW50IHRvIGlubGluZSB0aGlzLgorICB2b2lkIFdyaXRlVGFnKHVpbnQzMiB2YWx1ZSk7CisgIC8vIExpa2UgV3JpdGVUYWcoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVRhZ1RvQXJyYXkoCisgICAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSB2YXJpbnQuCisgIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyKHVpbnQzMiB2YWx1ZSk7CisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHZhcmludC4KKyAgc3RhdGljIGludCBWYXJpbnRTaXplNjQodWludDY0IHZhbHVlKTsKKworICAvLyBJZiBuZWdhdGl2ZSwgMTAgYnl0ZXMuICBPdGhlcml3c2UsIHNhbWUgYXMgVmFyaW50U2l6ZTMyKCkuCisgIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyU2lnbkV4dGVuZGVkKGludDMyIHZhbHVlKTsKKworICAvLyBDb21waWxlLXRpbWUgZXF1aXZhbGVudCBvZiBWYXJpbnRTaXplMzIoKS4KKyAgdGVtcGxhdGUgPHVpbnQzMiBWYWx1ZT4KKyAgc3RydWN0IFN0YXRpY1ZhcmludFNpemUzMiB7CisgICAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9CisgICAgICAgIChWYWx1ZSA8ICgxIDw8IDcpKQorICAgICAgICAgICAgPyAxCisgICAgICAgICAgICA6IChWYWx1ZSA8ICgxIDw8IDE0KSkKKyAgICAgICAgICAgICAgICA/IDIKKyAgICAgICAgICAgICAgICA6IChWYWx1ZSA8ICgxIDw8IDIxKSkKKyAgICAgICAgICAgICAgICAgICAgPyAzCisgICAgICAgICAgICAgICAgICAgIDogKFZhbHVlIDwgKDEgPDwgMjgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyA0CisgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisgIH07CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCisgIGlubGluZSBpbnQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiB1bmRlcmx5aW5nIEkvTyBlcnJvciBzaW5jZSB0aGlzIG9iamVjdCB3YXMKKyAgLy8gY3JlYXRlZC4KKyAgYm9vbCBIYWRFcnJvcigpIGNvbnN0IHsgcmV0dXJuIGhhZF9lcnJvcl87IH0KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlZE91dHB1dFN0cmVhbSk7CisKKyAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dF87CisgIHVpbnQ4KiBidWZmZXJfOworICBpbnQgYnVmZmVyX3NpemVfOworICBpbnQgdG90YWxfYnl0ZXNfOyAgLy8gU3VtIG9mIHNpemVzIG9mIGFsbCBidWZmZXJzIHNlZW4gc28gZmFyLgorICBib29sIGhhZF9lcnJvcl87ICAgLy8gV2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgb3V0cHV0LgorCisgIC8vIEFkdmFuY2UgdGhlIGJ1ZmZlciBieSBhIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgdm9pZCBBZHZhbmNlKGludCBhbW91bnQpOworCisgIC8vIENhbGxlZCB3aGVuIHRoZSBidWZmZXIgcnVucyBvdXQgdG8gcmVxdWVzdCBtb3JlIGRhdGEuICBJbXBsaWVzIGFuCisgIC8vIEFkdmFuY2UoYnVmZmVyX3NpemVfKS4KKyAgYm9vbCBSZWZyZXNoKCk7CisKKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5KHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCk7CisKKyAgLy8gQWx3YXlzLWlubGluZWQgdmVyc2lvbnMgb2YgV3JpdGVWYXJpbnQqIGZ1bmN0aW9ucyBzbyB0aGF0IGNvZGUgY2FuIGJlCisgIC8vIHJldXNlZCwgd2hpbGUgc3RpbGwgY29udHJvbGxpbmcgc2l6ZS4gRm9yIGluc3RhbmNlLCBXcml0ZVZhcmludDMyVG9BcnJheSgpCisgIC8vIHNob3VsZCBub3QgZGlyZWN0bHkgY2FsbCB0aGlzOiBzaW5jZSBpdCBpcyBpbmxpbmVkIGl0c2VsZiwgZG9pbmcgc28KKyAgLy8gd291bGQgZ3JlYXRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiBnZW5lcmF0ZWQgY29kZS4gSW5zdGVhZCwgaXQgc2hvdWxkIGNhbGwKKyAgLy8gV3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheS4gIE1lYW53aGlsZSwgV3JpdGVWYXJpbnQzMigpIGlzIGFscmVhZHkKKyAgLy8gb3V0LW9mLWxpbmUsIHNvIGl0IHNob3VsZCBqdXN0IGludm9rZSB0aGlzIGRpcmVjdGx5IHRvIGF2b2lkIGFueSBleHRyYQorICAvLyBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgorICBzdGF0aWMgdWludDgqIFdyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXlJbmxpbmUoCisgICAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSgKKyAgICAgIHVpbnQ2NCB2YWx1ZSwgdWludDgqIHRhcmdldCkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisgIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyRmFsbGJhY2sodWludDMyIHZhbHVlKTsKK307CisKKy8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSB2YXN0IG1ham9yaXR5IG9mIHZhcmludHMgYXJlIG9ubHkgb25lIGJ5dGUuICBUaGVzZSBpbmxpbmUKKy8vIG1ldGhvZHMgb3B0aW1pemUgZm9yIHRoYXQgY2FzZS4KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyKHVpbnQzMiogdmFsdWUpIHsKKyAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiAqYnVmZmVyXyA8IDB4ODApIHsKKyAgICAqdmFsdWUgPSAqYnVmZmVyXzsKKyAgICBBZHZhbmNlKDEpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkVmFyaW50MzJGYWxsYmFjayh2YWx1ZSk7CisgIH0KK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDY0KHVpbnQ2NCogdmFsdWUpIHsKKyAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiAqYnVmZmVyXyA8IDB4ODApIHsKKyAgICAqdmFsdWUgPSAqYnVmZmVyXzsKKyAgICBBZHZhbmNlKDEpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkVmFyaW50NjRGYWxsYmFjayh2YWx1ZSk7CisgIH0KK30KKworLy8gc3RhdGljCitpbmxpbmUgY29uc3QgdWludDgqIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheSgKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLAorICAgIHVpbnQzMiogdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisgIG1lbWNweSh2YWx1ZSwgYnVmZmVyLCBzaXplb2YoKnZhbHVlKSk7CisgIHJldHVybiBidWZmZXIgKyBzaXplb2YoKnZhbHVlKTsKKyNlbHNlCisgICp2YWx1ZSA9IChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclswXSkgICAgICApIHwKKyAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzFdKSA8PCAgOCkgfAorICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMl0pIDw8IDE2KSB8CisgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclszXSkgPDwgMjQpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZW5kaWYKK30KKy8vIHN0YXRpYworaW5saW5lIGNvbnN0IHVpbnQ4KiBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkoCisgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICB1aW50NjQqIHZhbHVlKSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorICBtZW1jcHkodmFsdWUsIGJ1ZmZlciwgc2l6ZW9mKCp2YWx1ZSkpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZWxzZQorICB1aW50MzIgcGFydDAgPSAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMF0pICAgICAgKSB8CisgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclsxXSkgPDwgIDgpIHwKKyAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzJdKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbM10pIDw8IDI0KTsKKyAgdWludDMyIHBhcnQxID0gKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzRdKSAgICAgICkgfAorICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbNV0pIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlcls2XSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzddKSA8PCAyNCk7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ2ND4ocGFydDApIHwKKyAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MSkgPDwgMzIpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyKHVpbnQzMiogdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisgIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKEJ1ZmZlclNpemUoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZigqdmFsdWUpKSkpIHsKKyAgICBtZW1jcHkodmFsdWUsIGJ1ZmZlcl8sIHNpemVvZigqdmFsdWUpKTsKKyAgICBBZHZhbmNlKHNpemVvZigqdmFsdWUpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gUmVhZExpdHRsZUVuZGlhbjMyRmFsbGJhY2sodmFsdWUpOworICB9CisjZWxzZQorICByZXR1cm4gUmVhZExpdHRsZUVuZGlhbjMyRmFsbGJhY2sodmFsdWUpOworI2VuZGlmCit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NCh1aW50NjQqIHZhbHVlKSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorICBpZiAoR09PR0xFX1BSRURJQ1RfVFJVRShCdWZmZXJTaXplKCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoKnZhbHVlKSkpKSB7CisgICAgbWVtY3B5KHZhbHVlLCBidWZmZXJfLCBzaXplb2YoKnZhbHVlKSk7CisgICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHZhbHVlKTsKKyAgfQorI2Vsc2UKKyAgcmV0dXJuIFJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHZhbHVlKTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludDMyIENvZGVkSW5wdXRTdHJlYW06OlJlYWRUYWcoKSB7CisgIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKGJ1ZmZlcl8gPCBidWZmZXJfZW5kXykgJiYgYnVmZmVyX1swXSA8IDB4ODApIHsKKyAgICBsYXN0X3RhZ18gPSBidWZmZXJfWzBdOworICAgIEFkdmFuY2UoMSk7CisgICAgcmV0dXJuIGxhc3RfdGFnXzsKKyAgfSBlbHNlIHsKKyAgICBsYXN0X3RhZ18gPSBSZWFkVGFnRmFsbGJhY2soKTsKKyAgICByZXR1cm4gbGFzdF90YWdfOworICB9Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06Okxhc3RUYWdXYXModWludDMyIGV4cGVjdGVkKSB7CisgIHJldHVybiBsYXN0X3RhZ18gPT0gZXhwZWN0ZWQ7Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpIHsKKyAgcmV0dXJuIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfOworfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWcodWludDMyIGV4cGVjdGVkKSB7CisgIGlmIChleHBlY3RlZCA8ICgxIDw8IDcpKSB7CisgICAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiBidWZmZXJfWzBdID09IGV4cGVjdGVkKSB7CisgICAgICBBZHZhbmNlKDEpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPCAoMSA8PCAxNCkpIHsKKyAgICBpZiAoR09PR0xFX1BSRURJQ1RfVFJVRShCdWZmZXJTaXplKCkgPj0gMikgJiYKKyAgICAgICAgYnVmZmVyX1swXSA9PSBzdGF0aWNfY2FzdDx1aW50OD4oZXhwZWN0ZWQgfCAweDgwKSAmJgorICAgICAgICBidWZmZXJfWzFdID09IHN0YXRpY19jYXN0PHVpbnQ4PihleHBlY3RlZCA+PiA3KSkgeworICAgICAgQWR2YW5jZSgyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIERvbid0IGJvdGhlciBvcHRpbWl6aW5nIGZvciBsYXJnZXIgdmFsdWVzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgY29uc3QgdWludDgqIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZ0Zyb21BcnJheSgKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLCB1aW50MzIgZXhwZWN0ZWQpIHsKKyAgaWYgKGV4cGVjdGVkIDwgKDEgPDwgNykpIHsKKyAgICBpZiAoYnVmZmVyWzBdID09IGV4cGVjdGVkKSB7CisgICAgICByZXR1cm4gYnVmZmVyICsgMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPCAoMSA8PCAxNCkpIHsKKyAgICBpZiAoYnVmZmVyWzBdID09IHN0YXRpY19jYXN0PHVpbnQ4PihleHBlY3RlZCB8IDB4ODApICYmCisgICAgICAgIGJ1ZmZlclsxXSA9PSBzdGF0aWNfY2FzdDx1aW50OD4oZXhwZWN0ZWQgPj4gNykpIHsKKyAgICAgIHJldHVybiBidWZmZXIgKyAyOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6R2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZShjb25zdCB2b2lkKiogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzaXplKSB7CisgICpkYXRhID0gYnVmZmVyXzsKKyAgKnNpemUgPSBidWZmZXJfZW5kXyAtIGJ1ZmZlcl87Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdEF0RW5kKCkgeworICAvLyBJZiB3ZSBhcmUgYXQgYSBsaW1pdCB3ZSBrbm93IG5vIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBPdGhlcndpc2UsIGl0J3MKKyAgLy8gaGFyZCB0byBzYXkgd2l0aG91dCBjYWxsaW5nIFJlZnJlc2goKSwgYW5kIHdlJ2QgcmF0aGVyIG5vdCBkbyB0aGF0LgorCisgIGlmIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfICYmCisgICAgICAoKGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyAhPSAwKSB8fAorICAgICAgICh0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykpKSB7CisgICAgbGFzdF90YWdfID0gMDsgICAgICAgICAgICAgICAgICAgLy8gUHJldGVuZCB3ZSBjYWxsZWQgUmVhZFRhZygpLi4uCisgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gPSB0cnVlOyAgLy8gLi4uIGFuZCBpdCBoaXQgRU9GLgorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgaW50IENvZGVkSW5wdXRTdHJlYW06OkN1cnJlbnRQb3NpdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHRvdGFsX2J5dGVzX3JlYWRfIC0gKEJ1ZmZlclNpemUoKSArIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0Xyk7Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2UoaW50IHNpemUpIHsKKyAgaWYgKGJ1ZmZlcl9zaXplXyA8IHNpemUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICB1aW50OCogcmVzdWx0ID0gYnVmZmVyXzsKKyAgICBBZHZhbmNlKHNpemUpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkodWludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIGlmICh2YWx1ZSA8IDB4ODApIHsKKyAgICAqdGFyZ2V0ID0gdmFsdWU7CisgICAgcmV0dXJuIHRhcmdldCArIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFdyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXkodmFsdWUsIHRhcmdldCk7CisgIH0KK30KKworaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQoaW50MzIgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgMCkgeworICAgIFdyaXRlVmFyaW50NjQoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworICB9IGVsc2UgeworICAgIFdyaXRlVmFyaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOworICB9Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KAorICAgIGludDMyIHZhbHVlLCB1aW50OCogdGFyZ2V0KSB7CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICByZXR1cm4gV3JpdGVWYXJpbnQ2NFRvQXJyYXkoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSksIHRhcmdldCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFdyaXRlVmFyaW50MzJUb0FycmF5KHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpLCB0YXJnZXQpOworICB9Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisgIG1lbWNweSh0YXJnZXQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisjZWxzZQorICB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpOworICB0YXJnZXRbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gIDgpOworICB0YXJnZXRbMl0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gMTYpOworICB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gMjQpOworI2VuZGlmCisgIHJldHVybiB0YXJnZXQgKyBzaXplb2YodmFsdWUpOworfQorCitpbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh1aW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorICBtZW1jcHkodGFyZ2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworI2Vsc2UKKyAgdWludDMyIHBhcnQwID0gc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSk7CisgIHVpbnQzMiBwYXJ0MSA9IHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUgPj4gMzIpOworCisgIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCk7CisgIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAgOCk7CisgIHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAxNik7CisgIHRhcmdldFszXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAyNCk7CisgIHRhcmdldFs0XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSk7CisgIHRhcmdldFs1XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAgOCk7CisgIHRhcmdldFs2XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAxNik7CisgIHRhcmdldFs3XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAyNCk7CisjZW5kaWYKKyAgcmV0dXJuIHRhcmdldCArIHNpemVvZih2YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZyh1aW50MzIgdmFsdWUpIHsKKyAgV3JpdGVWYXJpbnQzMih2YWx1ZSk7Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgaWYgKHZhbHVlIDwgKDEgPDwgNykpIHsKKyAgICB0YXJnZXRbMF0gPSB2YWx1ZTsKKyAgICByZXR1cm4gdGFyZ2V0ICsgMTsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxIDw8IDE0KSkgeworICAgIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSB8IDB4ODApOworICAgIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSA+PiA3KTsKKyAgICByZXR1cm4gdGFyZ2V0ICsgMjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gV3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKKyAgfQorfQorCitpbmxpbmUgaW50IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodWludDMyIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA8ICgxIDw8IDcpKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSAgeworICAgIHJldHVybiBWYXJpbnRTaXplMzJGYWxsYmFjayh2YWx1ZSk7CisgIH0KK30KKworaW5saW5lIGludCBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyU2lnbkV4dGVuZGVkKGludDMyIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICByZXR1cm4gMTA7ICAgICAvLyBUT0RPKGtlbnRvbik6ICBNYWtlIHRoaXMgYSBzeW1ib2xpYyBjb25zdGFudC4KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVmFyaW50U2l6ZTMyKHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgV3JpdGVSYXcoc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzdHIuc2l6ZSgpKSk7Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICBjb25zdCBzdHJpbmcmIHN0ciwgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVSYXdUb0FycmF5KHN0ci5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oc3RyLnNpemUoKSksIHRhcmdldCk7Cit9CisKK2lubGluZSBpbnQgQ29kZWRPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRvdGFsX2J5dGVzXyAtIGJ1ZmZlcl9zaXplXzsKK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6QWR2YW5jZShpbnQgYW1vdW50KSB7CisgIGJ1ZmZlcl8gKz0gYW1vdW50OworfQorCitpbmxpbmUgdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6QWR2YW5jZShpbnQgYW1vdW50KSB7CisgIGJ1ZmZlcl8gKz0gYW1vdW50OworICBidWZmZXJfc2l6ZV8gLT0gYW1vdW50OworfQorCitpbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpTZXRSZWN1cnNpb25MaW1pdChpbnQgbGltaXQpIHsKKyAgcmVjdXJzaW9uX2xpbWl0XyA9IGxpbWl0OworfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIHsKKyAgKytyZWN1cnNpb25fZGVwdGhfOworICByZXR1cm4gcmVjdXJzaW9uX2RlcHRoXyA8PSByZWN1cnNpb25fbGltaXRfOworfQorCitpbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIHsKKyAgaWYgKHJlY3Vyc2lvbl9kZXB0aF8gPiAwKSAtLXJlY3Vyc2lvbl9kZXB0aF87Cit9CisKK2lubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OlNldEV4dGVuc2lvblJlZ2lzdHJ5KGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgZXh0ZW5zaW9uX3Bvb2xfID0gcG9vbDsKKyAgZXh0ZW5zaW9uX2ZhY3RvcnlfID0gZmFjdG9yeTsKK30KKworaW5saW5lIGNvbnN0IERlc2NyaXB0b3JQb29sKiBDb2RlZElucHV0U3RyZWFtOjpHZXRFeHRlbnNpb25Qb29sKCkgeworICByZXR1cm4gZXh0ZW5zaW9uX3Bvb2xfOworfQorCitpbmxpbmUgTWVzc2FnZUZhY3RvcnkqIENvZGVkSW5wdXRTdHJlYW06OkdldEV4dGVuc2lvbkZhY3RvcnkoKSB7CisgIHJldHVybiBleHRlbnNpb25fZmFjdG9yeV87Cit9CisKK2lubGluZSBpbnQgQ29kZWRJbnB1dFN0cmVhbTo6QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGJ1ZmZlcl9lbmRfIC0gYnVmZmVyXzsKK30KKworaW5saW5lIENvZGVkSW5wdXRTdHJlYW06OkNvZGVkSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpCisgIDogaW5wdXRfKGlucHV0KSwKKyAgICBidWZmZXJfKE5VTEwpLAorICAgIGJ1ZmZlcl9lbmRfKE5VTEwpLAorICAgIHRvdGFsX2J5dGVzX3JlYWRfKDApLAorICAgIG92ZXJmbG93X2J5dGVzXygwKSwKKyAgICBsYXN0X3RhZ18oMCksCisgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8oZmFsc2UpLAorICAgIGFsaWFzaW5nX2VuYWJsZWRfKGZhbHNlKSwKKyAgICBjdXJyZW50X2xpbWl0XyhraW50MzJtYXgpLAorICAgIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XygwKSwKKyAgICB0b3RhbF9ieXRlc19saW1pdF8oa0RlZmF1bHRUb3RhbEJ5dGVzTGltaXQpLAorICAgIHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXyhrRGVmYXVsdFRvdGFsQnl0ZXNXYXJuaW5nVGhyZXNob2xkKSwKKyAgICByZWN1cnNpb25fZGVwdGhfKDApLAorICAgIHJlY3Vyc2lvbl9saW1pdF8oZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfKSwKKyAgICBleHRlbnNpb25fcG9vbF8oTlVMTCksCisgICAgZXh0ZW5zaW9uX2ZhY3RvcnlfKE5VTEwpIHsKKyAgLy8gRWFnZXJseSBSZWZyZXNoKCkgc28gYnVmZmVyIHNwYWNlIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgUmVmcmVzaCgpOworfQorCitpbmxpbmUgQ29kZWRJbnB1dFN0cmVhbTo6Q29kZWRJbnB1dFN0cmVhbShjb25zdCB1aW50OCogYnVmZmVyLCBpbnQgc2l6ZSkKKyAgOiBpbnB1dF8oTlVMTCksCisgICAgYnVmZmVyXyhidWZmZXIpLAorICAgIGJ1ZmZlcl9lbmRfKGJ1ZmZlciArIHNpemUpLAorICAgIHRvdGFsX2J5dGVzX3JlYWRfKHNpemUpLAorICAgIG92ZXJmbG93X2J5dGVzXygwKSwKKyAgICBsYXN0X3RhZ18oMCksCisgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8oZmFsc2UpLAorICAgIGFsaWFzaW5nX2VuYWJsZWRfKGZhbHNlKSwKKyAgICBjdXJyZW50X2xpbWl0XyhzaXplKSwKKyAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8oMCksCisgICAgdG90YWxfYnl0ZXNfbGltaXRfKGtEZWZhdWx0VG90YWxCeXRlc0xpbWl0KSwKKyAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8oa0RlZmF1bHRUb3RhbEJ5dGVzV2FybmluZ1RocmVzaG9sZCksCisgICAgcmVjdXJzaW9uX2RlcHRoXygwKSwKKyAgICByZWN1cnNpb25fbGltaXRfKGRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XyksCisgICAgZXh0ZW5zaW9uX3Bvb2xfKE5VTEwpLAorICAgIGV4dGVuc2lvbl9mYWN0b3J5XyhOVUxMKSB7CisgIC8vIE5vdGUgdGhhdCBzZXR0aW5nIGN1cnJlbnRfbGltaXRfID09IHNpemUgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgc29tZQorICAvLyBjb2RlIHBhdGhzIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyBpbnB1dF8gYW5kIHNlZ2ZhdWx0aW5nLgorfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpJc0ZsYXQoKSBjb25zdCB7CisgIHJldHVybiBpbnB1dF8gPT0gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTMwMAorICAjcHJhZ21hIHJ1bnRpbWVfY2hlY2tzKCJjIiwgcmVzdG9yZSkKKyNlbmRpZiAgLy8gX01TQ19WRVIKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fQ09ERURfU1RSRUFNX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1faW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0ZjQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1faW5sLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqYXNvbmhAZ29vZ2xlLmNvbSAoSmFzb24gSHN1ZWgpCisvLworLy8gSW1wbGVtZW50cyBtZXRob2RzIG9mIGNvZGVkX3N0cmVhbS5oIHRoYXQgbmVlZCB0byBiZSBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZQorLy8gcmVhc29ucywgYnV0IHNob3VsZCBub3QgYmUgZGVmaW5lZCBpbiBhIHB1YmxpYyBoZWFkZXIuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX0NPREVEX1NUUkVBTV9JTkxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSU5MX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6SW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKHN0cmluZyogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIGlmIChzaXplIDwgMCkgcmV0dXJuIGZhbHNlOyAgLy8gc2VjdXJpdHk6IHNpemUgaXMgb2Z0ZW4gdXNlci1zdXBwbGllZAorCisgIGlmIChCdWZmZXJTaXplKCkgPj0gc2l6ZSkgeworICAgIFNUTFN0cmluZ1Jlc2l6ZVVuaW5pdGlhbGl6ZWQoYnVmZmVyLCBzaXplKTsKKyAgICAvLyBXaGVuIGJ1ZmZlciBpcyBlbXB0eSwgc3RyaW5nX2FzX2FycmF5KGJ1ZmZlcikgd2lsbCByZXR1cm4gTlVMTCBidXQgbWVtY3B5CisgICAgLy8gcmVxdWlyZXMgbm9uLU5VTEwgcG9pbnRlcnMgZXZlbiB3aGVuIHNpemUgaXMgMC4gSGVuY2ggdGhpcyBjaGVjay4KKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgIG1lbWNweShzdHJpbmdfYXNfYXJyYXkoYnVmZmVyKSwgYnVmZmVyXywgc2l6ZSk7CisgICAgICBBZHZhbmNlKHNpemUpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBSZWFkU3RyaW5nRmFsbGJhY2soYnVmZmVyLCBzaXplKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX0NPREVEX1NUUkVBTV9JTkxfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFhYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDExOTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0ZXN0cyBhbmQgYmVuY2htYXJrcy4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworCisvLyBUaGlzIGRlY2xhcmVzIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlZ2VyIGxpdGVyYWwgaW4gYSBwb3J0YWJsZSB3YXkuCisvLyAoVGhlIG9yaWdpbmFsIG1hY3JvIGlzIHdheSB0b28gYmlnIGFuZCBydWlucyBteSBmb3JtYXR0aW5nLikKKyN1bmRlZiBVTEwKKyNkZWZpbmUgVUxMKHgpIEdPT0dMRV9VTE9OR0xPTkcoeCkKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKK25hbWVzcGFjZSB7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERhdGEtRHJpdmVuIFRlc3QgSW5mcmFzdHJ1Y3R1cmUKKworLy8gVEVTVF8xRCBhbmQgVEVTVF8yRCBhcmUgbWFjcm9zIEknZCBldmVudHVhbGx5IGxpa2UgdG8gc2VlIGFkZGVkIHRvCisvLyBnVGVzdC4gIFRoZXNlIG1hY3JvcyBjYW4gYmUgdXNlZCB0byBkZWNsYXJlIHRlc3RzIHdoaWNoIHNob3VsZCBiZQorLy8gcnVuIG11bHRpcGxlIHRpbWVzLCBvbmNlIGZvciBlYWNoIGl0ZW0gaW4gc29tZSBpbnB1dCBhcnJheS4gIFRFU1RfMUQKKy8vIHRlc3RzIGFsbCBjYXNlcyBpbiBhIHNpbmdsZSBpbnB1dCBhcnJheS4gIFRFU1RfMkQgdGVzdHMgYWxsCisvLyBjb21iaW5hdGlvbnMgb2YgY2FzZXMgZnJvbSB0d28gYXJyYXlzLiAgVGhlIGFycmF5cyBtdXN0IGJlIHN0YXRpY2FsbHkKKy8vIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBHT09HTEVfQVJSQVlTSVpFKCkgbWFjcm8gd29ya3Mgb24gdGhlbS4gIEV4YW1wbGU6CisvLworLy8gaW50IGtDYXNlc1tdID0gezEsIDIsIDMsIDR9CisvLyBURVNUXzFEKE15Rml4dHVyZSwgTXlUZXN0LCBrQ2FzZXMpIHsKKy8vICAgRVhQRUNUX0dUKGtDYXNlc19jYXNlLCAwKTsKKy8vIH0KKy8vCisvLyBUaGlzIHRlc3QgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbnVtYmVycyAxLCAyLCAzLCBhbmQgNCBhbmQgdGVzdHMgdGhhdAorLy8gdGhleSBhcmUgYWxsIGdyYXRlciB0aGFuIHplcm8uICBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSBleGFjdCBjYXNlCisvLyB3aGljaCBmYWlsZWQgd2lsbCBiZSBwcmludGVkLiAgVGhlIGNhc2UgdHlwZSBtdXN0IGJlIHByaW50YWJsZSB1c2luZworLy8gb3N0cmVhbTo6b3BlcmF0b3I8PC4KKworLy8gVE9ETyhrZW50b24pOiAgZ1Rlc3Qgbm93IHN1cHBvcnRzICJwYXJhbWV0ZXJpemVkIHRlc3RzIiB3aGljaCB3b3VsZCBiZQorLy8gICBhIGJldHRlciB3YXkgdG8gYWNjb21wbGlzaCB0aGlzLiAgUmV3cml0ZSB3aGVuIHRpbWUgcGVybWl0cy4KKworI2RlZmluZSBURVNUXzFEKEZJWFRVUkUsIE5BTUUsIENBU0VTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBGSVhUVVJFIyNfIyNOQU1FIyNfREQgOiBwdWJsaWMgRklYVFVSRSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlJiBDQVNFUyMjX2Nhc2UpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBURVNUX0YoRklYVFVSRSMjXyMjTkFNRSMjX0RELCBOQU1FKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShDQVNFUyk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPDwgI0NBU0VTICIgY2FzZSAjIiA8PCBpIDw8ICI6ICIgPDwgQ0FTRVNbaV0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERvU2luZ2xlQ2FzZShDQVNFU1tpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGSVhUVVJFIyNfIyNOQU1FIyNfREQ6OkRvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZSYgQ0FTRVMjI19jYXNlKQorCisjZGVmaW5lIFRFU1RfMkQoRklYVFVSRSwgTkFNRSwgQ0FTRVMxLCBDQVNFUzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIEZJWFRVUkUjI18jI05BTUUjI19ERCA6IHB1YmxpYyBGSVhUVVJFIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlMSwgdHlwZW5hbWUgQ2FzZVR5cGUyPiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUxJiBDQVNFUzEjI19jYXNlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FzZVR5cGUyJiBDQVNFUzIjI19jYXNlKTsgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRFU1RfRihGSVhUVVJFIyNfIyNOQU1FIyNfREQsIE5BTUUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTMSk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTMik7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA8PCAjQ0FTRVMxICIgY2FzZSAjIiA8PCBpIDw8ICI6ICIgPDwgQ0FTRVMxW2ldIDw8ICIsICIgICAgICAgICAgIFwKKyAgICAgICAgICA8PCAjQ0FTRVMyICIgY2FzZSAjIiA8PCBqIDw8ICI6ICIgPDwgQ0FTRVMyW2pdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRG9TaW5nbGVDYXNlKENBU0VTMVtpXSwgQ0FTRVMyW2pdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlMSwgdHlwZW5hbWUgQ2FzZVR5cGUyPiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGSVhUVVJFIyNfIyNOQU1FIyNfREQ6OkRvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZTEmIENBU0VTMSMjX2Nhc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXNlVHlwZTImIENBU0VTMiMjX2Nhc2UpCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgQ29kZWRTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gSGVscGVyIG1ldGhvZCB1c2VkIGJ5IHRlc3RzIGZvciBieXRlcyB3YXJuaW5nLiBTZWUgaW1wbGVtZW50YXRpb24gY29tbWVudAorICAvLyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAgc3RhdGljIHZvaWQgU2V0dXBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nVGVzdCgKKyAgICAgIGludCB0b3RhbF9ieXRlc19saW1pdCwgaW50IHdhcm5pbmdfdGhyZXNob2xkLAorICAgICAgdmVjdG9yPHN0cmluZz4qIG91dF9lcnJvcnMsIHZlY3RvcjxzdHJpbmc+KiBvdXRfd2FybmluZ3MpOworCisgIC8vIEJ1ZmZlciB1c2VkIGR1cmluZyBtb3N0IG9mIHRoZSB0ZXN0cy4gVGhpcyBhc3N1bWVzIHRlc3RzIHJ1biBzZXF1ZW50aWFsbHkuCisgIHN0YXRpYyBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAxMDI0ICogNjQ7CisgIHN0YXRpYyB1aW50OCBidWZmZXJfW2tCdWZmZXJTaXplXTsKK307CisKK3VpbnQ4IENvZGVkU3RyZWFtVGVzdDo6YnVmZmVyX1tDb2RlZFN0cmVhbVRlc3Q6OmtCdWZmZXJTaXplXTsKKworLy8gV2UgdGVzdCBlYWNoIG9wZXJhdGlvbiBvdmVyIGEgdmFyaWV0eSBvZiBibG9jayBzaXplcyB0byBpbnN1cmUgdGhhdAorLy8gd2UgdGVzdCBjYXNlcyB3aGVyZSByZWFkcyBvciB3cml0ZXMgY3Jvc3MgYnVmZmVyIGJvdW5kYXJpZXMsIGNhc2VzCisvLyB3aGVyZSB0aGV5IGRvbid0LCBhbmQgY2FzZXMgd2hlcmUgdGhlcmUgaXMgc28gbXVjaCBidWZmZXIgbGVmdCB0aGF0CisvLyB3ZSBjYW4gdXNlIHNwZWNpYWwgb3B0aW1pemVkIHBhdGhzIHRoYXQgZG9uJ3Qgd29ycnkgYWJvdXQgYm91bmRzCisvLyBjaGVja3MuCitjb25zdCBpbnQga0Jsb2NrU2l6ZXNbXSA9IHsxLCAyLCAzLCA1LCA3LCAxMywgMzIsIDEwMjR9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpbnQgdGVzdHMuCisKK3N0cnVjdCBWYXJpbnRDYXNlIHsKKyAgdWludDggYnl0ZXNbMTBdOyAgICAgICAgICAvLyBFbmNvZGVkIGJ5dGVzLgorICBpbnQgc2l6ZTsgICAgICAgICAgICAgICAgIC8vIEVuY29kZWQgc2l6ZSwgaW4gYnl0ZXMuCisgIHVpbnQ2NCB2YWx1ZTsgICAgICAgICAgICAgLy8gUGFyc2VkIHZhbHVlLgorfTsKKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBWYXJpbnRDYXNlJiBjKSB7CisgIHJldHVybiBvcyA8PCBjLnZhbHVlOworfQorCitWYXJpbnRDYXNlIGtWYXJpbnRDYXNlc1tdID0geworICAvLyAzMi1iaXQgdmFsdWVzCisgIHt7MHgwMH0gICAgICAsIDEsIDB9LAorICB7ezB4MDF9ICAgICAgLCAxLCAxfSwKKyAge3sweDdmfSAgICAgICwgMSwgMTI3fSwKKyAge3sweGEyLCAweDc0fSwgMiwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KX0sICAgICAgICAgIC8vIDE0ODgyCisgIHt7MHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYn0sIDUsICAgICAgICAgICAgICAgICAgICAvLyAyOTYxNDg4ODMwCisgICAgKDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8ICgweDA0IDw8IDIxKSB8CisgICAgKFVMTCgweDBiKSA8PCAyOCl9LAorCisgIC8vIDY0LWJpdAorICB7ezB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MWJ9LCA1LCAgICAgICAgICAgICAgICAgICAgLy8gNzI1NjQ1NjEyNgorICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfAorICAgIChVTEwoMHgxYikgPDwgMjgpfSwKKyAge3sweDgwLCAweGU2LCAweGViLCAweDljLCAweGMzLCAweGM5LCAweGE0LCAweDQ5fSwgOCwgIC8vIDQxMjU2MjAyNTgwNzE4MzM2CisgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8CisgICAgKFVMTCgweDQzKSA8PCAyOCkgfCAoVUxMKDB4NDkpIDw8IDM1KSB8IChVTEwoMHgyNCkgPDwgNDIpIHwKKyAgICAoVUxMKDB4NDkpIDw8IDQ5KX0sCisgIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxCisgIHt7MHg5YiwgMHhhOCwgMHhmOSwgMHhjMiwgMHhiYiwgMHhkNiwgMHg4MCwgMHg4NSwgMHhhNiwgMHgwMX0sIDEwLAorICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAorICAgIChVTEwoMHgzYikgPDwgMjgpIHwgKFVMTCgweDU2KSA8PCAzNSkgfCAoVUxMKDB4MDApIDw8IDQyKSB8CisgICAgKFVMTCgweDA1KSA8PCA0OSkgfCAoVUxMKDB4MjYpIDw8IDU2KSB8IChVTEwoMHgwMSkgPDwgNjMpfSwKK307CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50MzIsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICB1aW50MzIgdmFsdWU7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFZhcmludDMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKSwgdmFsdWUpOworICB9CisKKyAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRUYWcsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICB1aW50MzIgZXhwZWN0ZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdmFsdWUsIGNvZGVkX2lucHV0LlJlYWRUYWcoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5MYXN0VGFnV2FzKGV4cGVjdGVkX3ZhbHVlKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0Lkxhc3RUYWdXYXMoZXhwZWN0ZWRfdmFsdWUgKyAxKSk7CisgIH0KKworICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCisvLyBUaGlzIGlzIHRoZSByZWdyZXNzaW9uIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IHRoZXJlIGlzIG5vIGlzc3VlcworLy8gd2l0aCB0aGUgZW1wdHkgaW5wdXQgYnVmZmVycyBoYW5kbGluZy4KK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIEVtcHR5SW5wdXRCZWZvcmVFb3MpIHsKKyAgY2xhc3MgSW4gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgICBwdWJsaWM6CisgICAgSW4oKSA6IGNvdW50XygwKSB7fQorICAgcHJpdmF0ZToKKyAgICB2aXJ0dWFsIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgICAgICAqZGF0YSA9IE5VTEw7CisgICAgICAqc2l6ZSA9IDA7CisgICAgICByZXR1cm4gY291bnRfKysgPCAyOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgQmFja1VwKGludCBjb3VudCkgIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJUZXN0cyBuZXZlciBjYWxsIHRoaXMuIjsKKyAgICB9CisgICAgdmlydHVhbCBib29sIFNraXAoaW50IGNvdW50KSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGVzdHMgbmV2ZXIgY2FsbCB0aGlzLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIGludCBjb3VudF87CisgIH0gaW47CisgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJmluKTsKKyAgaW5wdXQuUmVhZFRhZygpOworICBFWFBFQ1RfVFJVRShpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7Cit9CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBFeHBlY3RUYWcsIGtWYXJpbnRDYXNlcykgeworICAvLyBMZWF2ZSBvbmUgYnl0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc28gd2UgY2FuIHJlYWQgaXQKKyAgLy8gdG8gZm9yY2UgdGhlIGZpcnN0IGJ1ZmZlciB0byBiZSBsb2FkZWQuCisgIGJ1ZmZlcl9bMF0gPSAnXDAnOworICBtZW1jcHkoYnVmZmVyXyArIDEsIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICAvLyBSZWFkIG9uZSBieXRlIHRvIGZvcmNlIGNvZGVkX2lucHV0LlJlZmlsbCgpIHRvIGJlIGNhbGxlZC4gIE90aGVyd2lzZSwKKyAgICAvLyBFeHBlY3RUYWcoKSB3aWxsIHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlLgorICAgIHVpbnQ4IGR1bW15OworICAgIGNvZGVkX2lucHV0LlJlYWRSYXcoJmR1bW15LCAxKTsKKyAgICBFWFBFQ1RfRVEoKHVpbnQpJ1wwJywgKHVpbnQpZHVtbXkpOworCisgICAgdWludDMyIGV4cGVjdGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSk7CisKKyAgICAvLyBFeHBlY3RUYWcoKSBwcm9kdWNlcyBmYWxzZSBuZWdhdGl2ZXMgZm9yIGxhcmdlIHZhbHVlcy4KKyAgICBpZiAoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSA8PSAyKSB7CisgICAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuRXhwZWN0VGFnKGV4cGVjdGVkX3ZhbHVlICsgMSkpOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuRXhwZWN0VGFnKGV4cGVjdGVkX3ZhbHVlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5FeHBlY3RUYWcoZXhwZWN0ZWRfdmFsdWUpKTsKKyAgICB9CisgIH0KKworICBpZiAoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSA8PSAyKSB7CisgICAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUgKyAxLCBpbnB1dC5CeXRlQ291bnQoKSk7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX0VRKDEsIGlucHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorfQorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgRXhwZWN0VGFnRnJvbUFycmF5LCBrVmFyaW50Q2FzZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKworICBjb25zdCB1aW50MzIgZXhwZWN0ZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKTsKKworICAvLyBJZiB0aGUgZXhwZWN0YXRpb24gc3VjY2VlZHMsIGl0IHNob3VsZCByZXR1cm4gYSBwb2ludGVyIHBhc3QgdGhlIHRhZy4KKyAgaWYgKGtWYXJpbnRDYXNlc19jYXNlLnNpemUgPD0gMikgeworICAgIEVYUEVDVF9UUlVFKE5VTEwgPT0KKyAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWdGcm9tQXJyYXkoYnVmZmVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdmFsdWUgKyAxKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyXyArIGtWYXJpbnRDYXNlc19jYXNlLnNpemUgPT0KKyAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWdGcm9tQXJyYXkoYnVmZmVyXywgZXhwZWN0ZWRfdmFsdWUpKTsKKyAgfSBlbHNlIHsKKyAgICBFWFBFQ1RfVFJVRShOVUxMID09CisgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KGJ1ZmZlcl8sIGV4cGVjdGVkX3ZhbHVlKSk7CisgIH0KK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRWYXJpbnQ2NCwga1ZhcmludENhc2VzLCBrQmxvY2tTaXplcykgeworICBtZW1jcHkoYnVmZmVyXywga1ZhcmludENhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkVmFyaW50NjQoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlLCB2YWx1ZSk7CisgIH0KKworICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgV3JpdGVWYXJpbnQzMiwga1ZhcmludENhc2VzLCBrQmxvY2tTaXplcykgeworICBpZiAoa1ZhcmludENhc2VzX2Nhc2UudmFsdWUgPiBVTEwoMHgwMDAwMDAwMEZGRkZGRkZGKSkgeworICAgIC8vIFNraXAgdGhpcyB0ZXN0IGZvciB0aGUgNjQtYml0IHZhbHVlcy4KKyAgICByZXR1cm47CisgIH0KKworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlVmFyaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS5zaXplLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfRVEoMCwKKyAgICBtZW1jbXAoYnVmZmVyXywga1ZhcmludENhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRDYXNlc19jYXNlLnNpemUpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlVmFyaW50NjQsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDY0KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSk7CisgIH0KKworICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgbWVtY21wKGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKSk7Cit9CisKKy8vIFRoaXMgdGVzdCBjYXVzZXMgZ2NjIDMuMy41IChhbmQgZWFybGllcj8pIHRvIGdpdmUgdGhlIGNyeXB0aWMgZXJyb3I6CisvLyAgICJzb3JyeSwgdW5pbXBsZW1lbnRlZDogYG1ldGhvZF9jYWxsX2V4cHInIG5vdCBzdXBwb3J0ZWQgYnkgZHVtcF9leHByIgorI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPiAzKQorCitpbnQzMiBrU2lnbkV4dGVuZGVkVmFyaW50Q2FzZXNbXSA9IHsKKyAgMCwgMSwgLTEsIDEyMzc4OTQsIC0zNzg5NTEzOAorfTsKKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQsCisgICAgICAgIGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgaWYgKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlIDwgMCkgeworICAgICAgRVhQRUNUX0VRKDEwLCBjb2RlZF9vdXRwdXQuQnl0ZUNvdW50KCkpOworICAgIH0gZWxzZSB7CisgICAgICBFWFBFQ1RfTEUoY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpLCA1KTsKKyAgICB9CisgIH0KKworICBpZiAoa1NpZ25FeHRlbmRlZFZhcmludENhc2VzX2Nhc2UgPCAwKSB7CisgICAgRVhQRUNUX0VRKDEwLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICB9IGVsc2UgeworICAgIEVYUEVDVF9MRShvdXRwdXQuQnl0ZUNvdW50KCksIDUpOworICB9CisKKyAgLy8gUmVhZCB2YWx1ZSBiYWNrIGluIGFzIGEgdmFyaW50NjQgYW5kIGluc3VyZSBpdCBtYXRjaGVzLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkVmFyaW50NjQoJnZhbHVlKSk7CisKKyAgICBFWFBFQ1RfRVEoa1NpZ25FeHRlbmRlZFZhcmludENhc2VzX2Nhc2UsIHN0YXRpY19jYXN0PGludDY0Pih2YWx1ZSkpOworICB9CisKKyAgRVhQRUNUX0VRKG91dHB1dC5CeXRlQ291bnQoKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpbnQgZmFpbHVyZSB0ZXN0LgorCitzdHJ1Y3QgVmFyaW50RXJyb3JDYXNlIHsKKyAgdWludDggYnl0ZXNbMTJdOworICBpbnQgc2l6ZTsKKyAgYm9vbCBjYW5fcGFyc2U7Cit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFZhcmludEVycm9yQ2FzZSYgYykgeworICByZXR1cm4gb3MgPDwgInNpemUgIiA8PCBjLnNpemU7Cit9CisKK2NvbnN0IFZhcmludEVycm9yQ2FzZSBrVmFyaW50RXJyb3JDYXNlc1tdID0geworICAvLyBDb250cm9sIGNhc2UuICAoSW5zdXJlcyB0aGF0IHRoZXJlIGlzbid0IHNvbWV0aGluZyBlbHNlIHdyb25nIHRoYXQKKyAgLy8gbWFrZXMgcGFyc2luZyBhbHdheXMgZmFpbC4pCisgIHt7MHgwMH0sIDEsIHRydWV9LAorCisgIC8vIE5vIGlucHV0IGRhdGEuCisgIHt7fSwgMCwgZmFsc2V9LAorCisgIC8vIElucHV0IGVuZHMgdW5leHBlY3RlZGx5LgorICB7ezB4ZjAsIDB4YWJ9LCAyLCBmYWxzZX0sCisKKyAgLy8gSW5wdXQgZW5kcyB1bmV4cGVjdGVkbHkgYWZ0ZXIgMzIgYml0cy4KKyAge3sweGYwLCAweGFiLCAweGM5LCAweDlhLCAweGY4LCAweGIyfSwgNiwgZmFsc2V9LAorCisgIC8vIExvbmdlciB0aGFuIDEwIGJ5dGVzLgorICB7ezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDF9LAorICAgMTEsIGZhbHNlfSwKK307CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50MzJFcnJvciwga1ZhcmludEVycm9yQ2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2Uuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIHVpbnQzMiB2YWx1ZTsKKyAgRVhQRUNUX0VRKGtWYXJpbnRFcnJvckNhc2VzX2Nhc2UuY2FuX3BhcnNlLCBjb2RlZF9pbnB1dC5SZWFkVmFyaW50MzIoJnZhbHVlKSk7Cit9CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50NjRFcnJvciwga1ZhcmludEVycm9yQ2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2Uuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIHVpbnQ2NCB2YWx1ZTsKKyAgRVhQRUNUX0VRKGtWYXJpbnRFcnJvckNhc2VzX2Nhc2UuY2FuX3BhcnNlLCBjb2RlZF9pbnB1dC5SZWFkVmFyaW50NjQoJnZhbHVlKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmludFNpemUKKworc3RydWN0IFZhcmludFNpemVDYXNlIHsKKyAgdWludDY0IHZhbHVlOworICBpbnQgc2l6ZTsKK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVmFyaW50U2l6ZUNhc2UmIGMpIHsKKyAgcmV0dXJuIG9zIDw8IGMudmFsdWU7Cit9CisKK1ZhcmludFNpemVDYXNlIGtWYXJpbnRTaXplQ2FzZXNbXSA9IHsKKyAgezB1LCAxfSwKKyAgezF1LCAxfSwKKyAgezEyN3UsIDF9LAorICB7MTI4dSwgMn0sCisgIHs3NTg5MjN1LCAzfSwKKyAgezQwMDAwMDAwMDB1LCA1fSwKKyAge1VMTCg0MTI1NjIwMjU4MDcxODMzNiksIDh9LAorICB7VUxMKDExOTY0Mzc4MzMwOTc4NzM1MTMxKSwgMTB9LAorfTsKKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFZhcmludFNpemUzMiwga1ZhcmludFNpemVDYXNlcykgeworICBpZiAoa1ZhcmludFNpemVDYXNlc19jYXNlLnZhbHVlID4gMHhmZmZmZmZmZnUpIHsKKyAgICAvLyBTa2lwIDY0LWJpdCB2YWx1ZXMuCisgICAgcmV0dXJuOworICB9CisKKyAgRVhQRUNUX0VRKGtWYXJpbnRTaXplQ2FzZXNfY2FzZS5zaXplLAorICAgIENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRTaXplQ2FzZXNfY2FzZS52YWx1ZSkpKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFZhcmludFNpemU2NCwga1ZhcmludFNpemVDYXNlcykgeworICBFWFBFQ1RfRVEoa1ZhcmludFNpemVDYXNlc19jYXNlLnNpemUsCisgICAgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NChrVmFyaW50U2l6ZUNhc2VzX2Nhc2UudmFsdWUpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRml4ZWQtc2l6ZSBpbnQgdGVzdHMKKworc3RydWN0IEZpeGVkMzJDYXNlIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKHVpbnQzMildOyAgICAgICAgICAvLyBFbmNvZGVkIGJ5dGVzLgorICB1aW50MzIgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlZCB2YWx1ZS4KK307CisKK3N0cnVjdCBGaXhlZDY0Q2FzZSB7CisgIHVpbnQ4IGJ5dGVzW3NpemVvZih1aW50NjQpXTsgICAgICAgICAgLy8gRW5jb2RlZCBieXRlcy4KKyAgdWludDY0IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZWQgdmFsdWUuCit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEZpeGVkMzJDYXNlJiBjKSB7CisgIHJldHVybiBvcyA8PCAiMHgiIDw8IGhleCA8PCBjLnZhbHVlIDw8IGRlYzsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBGaXhlZDY0Q2FzZSYgYykgeworICByZXR1cm4gb3MgPDwgIjB4IiA8PCBoZXggPDwgYy52YWx1ZSA8PCBkZWM7Cit9CisKK0ZpeGVkMzJDYXNlIGtGaXhlZDMyQ2FzZXNbXSA9IHsKKyAge3sweGVmLCAweGNkLCAweGFiLCAweDkwfSwgMHg5MGFiY2RlZnV9LAorICB7ezB4MTIsIDB4MzQsIDB4NTYsIDB4Nzh9LCAweDc4NTYzNDEydX0sCit9OworCitGaXhlZDY0Q2FzZSBrRml4ZWQ2NENhc2VzW10gPSB7CisgIHt7MHhlZiwgMHhjZCwgMHhhYiwgMHg5MCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OH0sIFVMTCgweDc4NTYzNDEyOTBhYmNkZWYpfSwKKyAge3sweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4fSwgVUxMKDB4ODg3NzY2NTU0NDMzMjIxMSl9LAorfTsKKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRMaXR0bGVFbmRpYW4zMiwga0ZpeGVkMzJDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQzMiB2YWx1ZTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKGtGaXhlZDMyQ2FzZXNfY2FzZS52YWx1ZSwgdmFsdWUpOworICB9CisKKyAgRVhQRUNUX0VRKHNpemVvZih1aW50MzIpLCBpbnB1dC5CeXRlQ291bnQoKSk7Cit9CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkTGl0dGxlRW5kaWFuNjQsIGtGaXhlZDY0Q2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrRml4ZWQ2NENhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZihrRml4ZWQ2NENhc2VzX2Nhc2UuYnl0ZXMpKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICB1aW50NjQgdmFsdWU7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjY0KCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUShrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2YodWludDY0KSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgV3JpdGVMaXR0bGVFbmRpYW4zMiwga0ZpeGVkMzJDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGtGaXhlZDMyQ2FzZXNfY2FzZS52YWx1ZSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX291dHB1dC5IYWRFcnJvcigpKTsKKworICAgIEVYUEVDVF9FUShzaXplb2YodWludDMyKSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2YodWludDMyKSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcChidWZmZXJfLCBrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZih1aW50MzIpKSk7Cit9CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBXcml0ZUxpdHRsZUVuZGlhbjY0LCBrRml4ZWQ2NENhc2VzLCBrQmxvY2tTaXplcykgeworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuNjQoa0ZpeGVkNjRDYXNlc19jYXNlLnZhbHVlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgRVhQRUNUX0VRKHNpemVvZih1aW50NjQpLCBjb2RlZF9vdXRwdXQuQnl0ZUNvdW50KCkpOworICB9CisKKyAgRVhQRUNUX0VRKHNpemVvZih1aW50NjQpLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJ1ZmZlcl8sIGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKHVpbnQ2NCkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgdGhlIHN0YXRpYyBtZXRob2RzIHRvIHJlYWQgZml4ZWQtc2l6ZSB2YWx1ZXMgZnJvbSByYXcgYXJyYXlzLgorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5LCBrRml4ZWQzMkNhc2VzKSB7CisgIG1lbWNweShidWZmZXJfLCBrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZihrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMpKTsKKworICB1aW50MzIgdmFsdWU7CisgIGNvbnN0IHVpbnQ4KiBlbmQgPSBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoCisgICAgICBidWZmZXJfLCAmdmFsdWUpOworICBFWFBFQ1RfRVEoa0ZpeGVkMzJDYXNlc19jYXNlLnZhbHVlLCB2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGVuZCA9PSBidWZmZXJfICsgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXksIGtGaXhlZDY0Q2FzZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcykpOworCisgIHVpbnQ2NCB2YWx1ZTsKKyAgY29uc3QgdWludDgqIGVuZCA9IENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheSgKKyAgICAgIGJ1ZmZlcl8sICZ2YWx1ZSk7CisgIEVYUEVDVF9FUShrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoZW5kID09IGJ1ZmZlcl8gKyBzaXplb2YodmFsdWUpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmF3IHJlYWRzIGFuZCB3cml0ZXMKKworY29uc3QgY2hhciBrUmF3Qnl0ZXNbXSA9ICJTb21lIGJ5dGVzIHdoaWNoIHdpbGwgYmUgd3JpdHRlbiBhbmQgcmVhZCByYXcuIjsKKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRSYXcsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworICBjaGFyIHJlYWRfYnVmZmVyW3NpemVvZihrUmF3Qnl0ZXMpXTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFJhdyhyZWFkX2J1ZmZlciwgc2l6ZW9mKGtSYXdCeXRlcykpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGtSYXdCeXRlcywgcmVhZF9idWZmZXIsIHNpemVvZihrUmF3Qnl0ZXMpKSk7CisgIH0KKworICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlUmF3LCBrQmxvY2tTaXplcykgeworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlUmF3KGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSk7CisgIH0KKworICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIG91dHB1dC5CeXRlQ291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSkpOworfQorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHN0cmluZyBzdHI7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOworICAgIEVYUEVDVF9FUShrUmF3Qnl0ZXMsIHN0cik7CisgIH0KKworICBFWFBFQ1RfRVEoc3RybGVuKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIFJlYWRTdHJpbmcgZG9lc24ndCBjcmFzaCBvbiBpbXBvc3NpYmx5IGxhcmdlIHN0cmluZ3MuCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ0ltcG9zc2libHlMYXJnZSwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBzdHJpbmcgc3RyOworICAgIC8vIFRyeSB0byByZWFkIGEgZ2lnYWJ5dGUuCisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOworICB9Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdJbXBvc3NpYmx5TGFyZ2VGcm9tU3RyaW5nT25TdGFjaykgeworICAvLyBTYW1lIHRlc3QgYXMgYWJvdmUsIGV4Y2VwdCBkaXJlY3RseSB1c2UgYSBidWZmZXIuIFRoaXMgdXNlZCB0byBjYXVzZQorICAvLyBjcmFzaGVzIHdoaWxlIHRoZSBhYm92ZSBkaWQgbm90LgorICB1aW50OCBidWZmZXJbOF07CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoYnVmZmVyLCA4KTsKKyAgc3RyaW5nIHN0cjsKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nSW1wb3NzaWJseUxhcmdlRnJvbVN0cmluZ09uSGVhcCkgeworICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcihuZXcgdWludDhbOF0pOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KGJ1ZmZlci5nZXQoKSwgOCk7CisgIHN0cmluZyBzdHI7CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEgPDwgMzApKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTa2lwCisKK2NvbnN0IGNoYXIga1NraXBUZXN0Qnl0ZXNbXSA9CisgICI8QmVmb3JlIHNraXBwaW5nPjxUbyBiZSBza2lwcGVkPjxBZnRlciBza2lwcGluZz4iOworY29uc3QgY2hhciBrU2tpcE91dHB1dFRlc3RCeXRlc1tdID0KKyAgIi0tLS0tLS0tLS0tLS0tLS0tPFRvIGJlIHNraXBwZWQ+LS0tLS0tLS0tLS0tLS0tLSI7CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBTa2lwSW5wdXQsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrU2tpcFRlc3RCeXRlcywgc2l6ZW9mKGtTa2lwVGVzdEJ5dGVzKSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbigiPEJlZm9yZSBza2lwcGluZz4iKSkpOworICAgIEVYUEVDVF9FUSgiPEJlZm9yZSBza2lwcGluZz4iLCBzdHIpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoc3RybGVuKCI8VG8gYmUgc2tpcHBlZD4iKSkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKCI8QWZ0ZXIgc2tpcHBpbmc+IikpKTsKKyAgICBFWFBFQ1RfRVEoIjxBZnRlciBza2lwcGluZz4iLCBzdHIpOworICB9CisKKyAgRVhQRUNUX0VRKHN0cmxlbihrU2tpcFRlc3RCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2V0RGlyZWN0QnVmZmVyUG9pbnRlcgorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5wdXQpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDgpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgY29uc3Qgdm9pZCogcHRyOworICBpbnQgc2l6ZTsKKworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfLCBwdHIpOworICBFWFBFQ1RfRVEoOCwgc2l6ZSk7CisKKyAgLy8gUGVla2luZyBhZ2FpbiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHBvaW50ZXIuCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7CisgIEVYUEVDVF9FUSg4LCBzaXplKTsKKworICAvLyBTa2lwIGZvcndhcmQgaW4gdGhlIHNhbWUgYnVmZmVyIHRoZW4gcGVlayBhZ2Fpbi4KKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuU2tpcCgzKSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8gKyAzLCBwdHIpOworICBFWFBFQ1RfRVEoNSwgc2l6ZSk7CisKKyAgLy8gU2tpcCB0byBlbmQgb2YgYnVmZmVyIGFuZCBwZWVrIC0tIHNob3VsZCBnZXQgbmV4dCBidWZmZXIuCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoNSkpOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgOCwgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lSW5wdXQpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDgpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgY29uc3Qgdm9pZCogcHRyOworICBpbnQgc2l6ZTsKKworICBjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZwdHIsICZzaXplKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7CisgIEVYUEVDVF9FUSg4LCBzaXplKTsKKworICAvLyBQZWVraW5nIGFnYWluIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcG9pbnRlci4KKyAgY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZSgmcHRyLCAmc2l6ZSk7CisgIEVYUEVDVF9FUShidWZmZXJfLCBwdHIpOworICBFWFBFQ1RfRVEoOCwgc2l6ZSk7CisKKyAgLy8gU2tpcCBmb3J3YXJkIGluIHRoZSBzYW1lIGJ1ZmZlciB0aGVuIHBlZWsgYWdhaW4uCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoMykpOworICBjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZwdHIsICZzaXplKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8gKyAzLCBwdHIpOworICBFWFBFQ1RfRVEoNSwgc2l6ZSk7CisKKyAgLy8gU2tpcCB0byBlbmQgb2YgYnVmZmVyIGFuZCBwZWVrIC0tIHNob3VsZCByZXR1cm4gZmFsc2UgYW5kIHByb3ZpZGUgYW4gZW1wdHkKKyAgLy8gYnVmZmVyLiBJdCBkb2VzIG5vdCB0cnkgdG8gUmVmcmVzaCgpLgorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDUpKTsKKyAgY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZSgmcHRyLCAmc2l6ZSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgOCwgcHRyKTsKKyAgRVhQRUNUX0VRKDAsIHNpemUpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBHZXREaXJlY3RCdWZmZXJQb2ludGVyT3V0cHV0KSB7CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDgpOworICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dCk7CisKKyAgdm9pZCogcHRyOworICBpbnQgc2l6ZTsKKworICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFBlZWtpbmcgYWdhaW4gc2hvdWxkIHJldHVybiB0aGUgc2FtZSBwb2ludGVyLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFNraXAgZm9yd2FyZCBpbiB0aGUgc2FtZSBidWZmZXIgdGhlbiBwZWVrIGFnYWluLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuU2tpcCgzKSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX291dHB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgMywgcHRyKTsKKyAgRVhQRUNUX0VRKDUsIHNpemUpOworCisgIC8vIFNraXAgdG8gZW5kIG9mIGJ1ZmZlciBhbmQgcGVlayAtLSBzaG91bGQgZ2V0IG5leHQgYnVmZmVyLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuU2tpcCg1KSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX291dHB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgOCwgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFNraXAgb3ZlciBtdWx0aXBsZSBidWZmZXJzLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuU2tpcCgyMikpOworICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXyArIDMwLCBwdHIpOworICBFWFBFQ1RfRVEoMiwgc2l6ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpbWl0cworCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgQmFzaWNMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg4KTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IHRoZSBsaW1pdC4KKyAgICB1aW50MzIgdmFsdWU7CisgICAgRVhQRUNUX0VRKDgsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisKKyAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIH0KKworICBFWFBFQ1RfRVEoMTIsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIHR3byBsaW1pdHMgd2hlcmUgdGhlIHNlY29uZCAodG9wKSBvbmUgaXMKKy8vIHNob3J0ZXIuCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgU21hbGxMaW1pdE9uVG9wT2ZCaWdMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDEgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoOCk7CisgICAgRVhQRUNUX0VRKDgsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDIgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoNCk7CisKKyAgICB1aW50MzIgdmFsdWU7CisKKyAgICAvLyBSZWFkIHVudGlsIHdlIGhpdCBsaW1pdDIsIHRoZSB0b3AgYW5kIHNob3J0ZXN0IGxpbWl0LgorICAgIEVYUEVDVF9FUSg0LCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworCisgICAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQyKTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IGxpbWl0MS4KKyAgICBFWFBFQ1RfRVEoNCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKworICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0MSk7CisKKyAgICAvLyBObyBtb3JlIGxpbWl0cy4KKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIH0KKworICBFWFBFQ1RfRVEoMTIsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIHR3byBsaW1pdHMgd2hlcmUgdGhlIHNlY29uZCAodG9wKSBvbmUgaXMKKy8vIGxvbmdlci4gIEluIHRoaXMgY2FzZSwgdGhlIHRvcCBsaW1pdCBpcyBzaG9ydGVuZWQgdG8gbWF0Y2ggdGhlIHByZXZpb3VzCisvLyBsaW1pdC4KK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBCaWdMaW1pdE9uVG9wT2ZTbWFsbExpbWl0LCBrQmxvY2tTaXplcykgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0MSA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg0KTsKKyAgICBFWFBFQ1RfRVEoNCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0MiA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg4KTsKKworICAgIHVpbnQzMiB2YWx1ZTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IGxpbWl0Mi4gIEV4Y2VwdCwgd2FpdCEgIGxpbWl0MSBpcyBzaG9ydGVyLCBzbworICAgIC8vIHdlIGVuZCB1cCBoaXR0aW5nIHRoYXQgZmlyc3QsIGRlc3BpdGUgaGF2aW5nIDQgYnl0ZXMgdG8gZ28gb24KKyAgICAvLyBsaW1pdDIuCisgICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisKKyAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdDIpOworCisgICAgLy8gT0ssIHBvcHBlZCBsaW1pdDIsIG5vdyBsaW1pdDEgaXMgb24gdG9wLCB3aGljaCB3ZSd2ZSBhbHJlYWR5IGhpdC4KKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKworICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0MSk7CisKKyAgICAvLyBObyBtb3JlIGxpbWl0cy4KKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIH0KKworICBFWFBFQ1RfRVEoOCwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBFeHBlY3RBdEVuZCkgeworICAvLyBUZXN0IEV4cGVjdEF0RW5kKCksIHdoaWNoIGlzIGJhc2VkIG9uIGxpbWl0cy4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkV4cGVjdEF0RW5kKCkpOworCisgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KDQpOworCisgIHVpbnQzMiB2YWx1ZTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5FeHBlY3RBdEVuZCgpKTsKKworICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5FeHBlY3RBdEVuZCgpKTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgTmVnYXRpdmVMaW1pdCkgeworICAvLyBDaGVjayB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIGEgbmVnYXRpdmUgbGltaXQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KC0xMjM0KTsKKyAgLy8gQnl0ZXNVbnRpbExpbWl0KCkgcmV0dXJucyAtMSB0byBtZWFuICJubyBsaW1pdCIsIHdoaWNoIGFjdHVhbGx5IG1lYW5zCisgIC8vICJ0aGUgbGltaXQgaXMgSU5UX01BWCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0iLgorICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBOZWdhdGl2ZUxpbWl0QWZ0ZXJSZWFkaW5nKSB7CisgIC8vIENoZWNrIHdoYXQgaGFwcGVucyB3aGVuIHdlIHB1c2ggYSBuZWdhdGl2ZSBsaW1pdC4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgIEFTU0VSVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoMTI4KSk7CisKKyAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoLTY0KTsKKyAgLy8gQnl0ZXNVbnRpbExpbWl0KCkgcmV0dXJucyAtMSB0byBtZWFuICJubyBsaW1pdCIsIHdoaWNoIGFjdHVhbGx5IG1lYW5zCisgIC8vICJ0aGUgbGltaXQgaXMgSU5UX01BWCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0iLgorICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBPdmVyZmxvd0xpbWl0KSB7CisgIC8vIENoZWNrIHdoYXQgaGFwcGVucyB3aGVuIHdlIHB1c2ggYSBsaW1pdCBsYXJnZSBlbm91Z2ggdGhhdCBpdHMgYWJzb2x1dGUKKyAgLy8gcG9zaXRpb24gaXMgbW9yZSB0aGFuIDJHQiBpbnRvIHRoZSBzdHJlYW0uCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworICBBU1NFUlRfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDEyOCkpOworCisgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KElOVF9NQVgpOworICAvLyBCeXRlc1VudGlsTGltaXQoKSByZXR1cm5zIC0xIHRvIG1lYW4gIm5vIGxpbWl0Iiwgd2hpY2ggYWN0dWFsbHkgbWVhbnMKKyAgLy8gInRoZSBsaW1pdCBpcyBJTlRfTUFYIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSIuCisgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFRvdGFsQnl0ZXNMaW1pdCkgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KDE2LCAtMSk7CisKKyAgc3RyaW5nIHN0cjsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworCisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGVycm9yX2xvZzsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxKSk7CisgICAgZXJyb3JzID0gZXJyb3JfbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorCisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywKKyAgICAiQSBwcm90b2NvbCBtZXNzYWdlIHdhcyByZWplY3RlZCBiZWNhdXNlIGl0IHdhcyB0b28gYmlnIiwgZXJyb3JzWzBdKTsKKworICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMzIsIC0xKTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBUb3RhbEJ5dGVzTGltaXROb3RWYWxpZE1lc3NhZ2VFbmQpIHsKKyAgLy8gdG90YWxfYnl0ZXNfbGltaXRfIGlzIG5vdCBhIHZhbGlkIHBsYWNlIGZvciBhIG1lc3NhZ2UgdG8gZW5kLgorCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIC8vIFNldCBib3RoIHRvdGFsX2J5dGVzX2xpbWl0IGFuZCBhIHJlZ3VsYXIgbGltaXQgYXQgMTYgYnl0ZXMuCisgIGNvZGVkX2lucHV0LlNldFRvdGFsQnl0ZXNMaW1pdCgxNiwgLTEpOworICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCgxNik7CisKKyAgLy8gUmVhZCAxNiBieXRlcy4KKyAgc3RyaW5nIHN0cjsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworCisgIC8vIFJlYWQgYSB0YWcuICBTaG91bGQgZmFpbCwgYnV0IHJlcG9ydCBiZWluZyBhIHZhbGlkIGVuZHBvaW50IHNpbmNlIGl0J3MKKyAgLy8gYSByZWd1bGFyIGxpbWl0LgorICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuUmVhZFRhZygpKTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOworCisgIC8vIFBvcCB0aGUgbGltaXQuCisgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKKworICAvLyBSZWFkIGEgdGFnLiAgU2hvdWxkIGZhaWwsIGFuZCByZXBvcnQgKm5vdCogYmVpbmcgYSB2YWxpZCBlbmRwb2ludCwgc2luY2UKKyAgLy8gdGhpcyB0aW1lIHdlJ3JlIGhpdHRpbmcgdGhlIHRvdGFsIGJ5dGVzIGxpbWl0LgorICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuUmVhZFRhZygpKTsKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKK30KKworLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgdGVzdHMgYmVsb3cuCisvLyBJdCBjb25zdHJ1Y3RzIGEgQ29kZWRJbnB1dFN0cmVhbSB3aXRoIHRoZSBnaXZlbiBsaW1pdHMgYW5kIHRyaWVzIHRvIHJlYWQgMktpQgorLy8gb2YgZGF0YSBmcm9tIGl0LiBUaGVuIGl0IHJldHVybnMgdGhlIGxvZ2dlZCBlcnJvcnMgYW5kIHdhcm5pbmdzIGluIHRoZSBnaXZlbgorLy8gdmVjdG9ycy4KK3ZvaWQgQ29kZWRTdHJlYW1UZXN0OjpTZXR1cFRvdGFsQnl0ZXNMaW1pdFdhcm5pbmdUZXN0KAorICAgIGludCB0b3RhbF9ieXRlc19saW1pdCwgaW50IHdhcm5pbmdfdGhyZXNob2xkLAorICAgIHZlY3RvcjxzdHJpbmc+KiBvdXRfZXJyb3JzLCB2ZWN0b3I8c3RyaW5nPiogb3V0X3dhcm5pbmdzKSB7CisgIEFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgMTI4KTsKKworICBTY29wZWRNZW1vcnlMb2cgc2NvcGVkX2xvZzsKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgICAgaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KHRvdGFsX2J5dGVzX2xpbWl0LCB3YXJuaW5nX3RocmVzaG9sZCk7CisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShpbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDIwNDgpKTsKKyAgfQorCisgICpvdXRfZXJyb3JzID0gc2NvcGVkX2xvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgICpvdXRfd2FybmluZ3MgPSBzY29wZWRfbG9nLkdldE1lc3NhZ2VzKFdBUk5JTkcpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nKSB7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgdmVjdG9yPHN0cmluZz4gd2FybmluZ3M7CisgIFNldHVwVG90YWxCeXRlc0xpbWl0V2FybmluZ1Rlc3QoMTAyNDAsIDEwMjQsICZlcnJvcnMsICZ3YXJuaW5ncyk7CisKKyAgRVhQRUNUX0VRKDAsIGVycm9ycy5zaXplKCkpOworCisgIEFTU0VSVF9FUSgyLCB3YXJuaW5ncy5zaXplKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLAorICAgICJSZWFkaW5nIGRhbmdlcm91c2x5IGxhcmdlIHByb3RvY29sIG1lc3NhZ2UuICBJZiB0aGUgbWVzc2FnZSB0dXJucyBvdXQgdG8gIgorICAgICJiZSBsYXJnZXIgdGhhbiAxMDI0MCBieXRlcywgcGFyc2luZyB3aWxsIGJlIGhhbHRlZCBmb3Igc2VjdXJpdHkgcmVhc29ucy4iLAorICAgIHdhcm5pbmdzWzBdKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywKKyAgICAiVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIHdhcyAyMDQ4IiwKKyAgICB3YXJuaW5nc1sxXSk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFRvdGFsQnl0ZXNMaW1pdFdhcm5pbmdEaXNhYmxlZCkgeworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHZlY3RvcjxzdHJpbmc+IHdhcm5pbmdzOworCisgIC8vIFRlc3Qgd2l0aCAtMQorICBTZXR1cFRvdGFsQnl0ZXNMaW1pdFdhcm5pbmdUZXN0KDEwMjQwLCAtMSwgJmVycm9ycywgJndhcm5pbmdzKTsKKyAgRVhQRUNUX0VRKDAsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgd2FybmluZ3Muc2l6ZSgpKTsKKworICAvLyBUZXN0IGFnYWluIHdpdGggLTIsIGV4cGVjdGluZyB0aGUgc2FtZSByZXN1bHQKKyAgU2V0dXBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nVGVzdCgxMDI0MCwgLTIsICZlcnJvcnMsICZ3YXJuaW5ncyk7CisgIEVYUEVDVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIHdhcm5pbmdzLnNpemUoKSk7Cit9CisKKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVjdXJzaW9uTGltaXQpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgIGNvZGVkX2lucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDQpOworCisgIC8vIFRoaXMgaXMgd2F5IHRvbyBtdWNoIHRlc3RpbmcgZm9yIGEgY291bnRlci4KKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gMQorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyAyCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDMKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gNAorICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAvLyA1CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgIC8vIDYKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gNQorICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAvLyA2CisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDUKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gNAorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyAzCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDQKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgLy8gNQorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyA0CisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDMKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gMgorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyAxCisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDAKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gMAorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyAwCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDEKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gMgorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyAzCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDQKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgLy8gNQorCisgIGNvZGVkX2lucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDYpOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyA2CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgIC8vIDcKK30KKworCitjbGFzcyBSZWFsbHlCaWdJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIFJlYWxseUJpZ0lucHV0U3RyZWFtKCkgOiBiYWNrdXBfYW1vdW50XygwKSwgYnVmZmVyX2NvdW50XygwKSB7fQorICB+UmVhbGx5QmlnSW5wdXRTdHJlYW0oKSB7fQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgICAgLy8gV2Ugb25seSBleHBlY3QgQmFja1VwKCkgdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQuCisgICAgRVhQRUNUX0VRKDAsIGJhY2t1cF9hbW91bnRfKTsKKworICAgIHN3aXRjaCAoYnVmZmVyX2NvdW50XysrKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgICpkYXRhID0gYnVmZmVyXzsKKyAgICAgICAgKnNpemUgPSBzaXplb2YoYnVmZmVyXyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSAxOgorICAgICAgICAvLyBSZXR1cm4gYW4gZW5vcm1vdXNseSBsYXJnZSBidWZmZXIgdGhhdCwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSAxaworICAgICAgICAvLyByZXR1cm5lZCBhbHJlYWR5LCBzaG91bGQgb3ZlcmZsb3cgdGhlIHRvdGFsX2J5dGVzX3JlYWRfIGNvdW50ZXIgaW4KKyAgICAgICAgLy8gQ29kZWRJbnB1dFN0cmVhbS4gIE5vdGUgdGhhdCB3ZSdsbCBvbmx5IHJlYWQgdGhlIGZpcnN0IDEwMjQgYnl0ZXMKKyAgICAgICAgLy8gb2YgdGhpcyBidWZmZXIgc28gaXQncyBPSyB0aGF0IHdlIGhhdmUgaXQgcG9pbnQgYXQgYnVmZmVyXy4KKyAgICAgICAgKmRhdGEgPSBidWZmZXJfOworICAgICAgICAqc2l6ZSA9IElOVF9NQVg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgeworICAgIGJhY2t1cF9hbW91bnRfID0gY291bnQ7CisgIH0KKworICBib29sIFNraXAoaW50IGNvdW50KSAgICB7IEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgaW1wbGVtZW50ZWQuIjsgcmV0dXJuIGZhbHNlOyB9CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0IHsgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vdCBpbXBsZW1lbnRlZC4iOyByZXR1cm4gMDsgfQorCisgIGludCBiYWNrdXBfYW1vdW50XzsKKworIHByaXZhdGU6CisgIGNoYXIgYnVmZmVyX1sxMDI0XTsKKyAgaW50NjQgYnVmZmVyX2NvdW50XzsKK307CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIElucHV0T3ZlcjJHKSB7CisgIC8vIENvZGVkSW5wdXRTdHJlYW0gc2hvdWxkIGdyYWNlZnVsbHkgaGFuZGxlIGlucHV0IG92ZXIgMkcgYW5kIGNhbGwKKyAgLy8gaW5wdXQuQmFja1VwKCkgd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgb24gZGVzdHJ1Y3Rpb24uCisgIFJlYWxseUJpZ0lucHV0U3RyZWFtIGlucHV0OworCisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGVycm9yX2xvZzsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDUxMikpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMTAyNCkpOworICAgIGVycm9ycyA9IGVycm9yX2xvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBFWFBFQ1RfRVEoSU5UX01BWCAtIDUxMiwgaW5wdXQuYmFja3VwX2Ftb3VudF8pOworICBFWFBFQ1RfRVEoMCwgZXJyb3JzLnNpemUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxZjMzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYwpAQCAtMCwwICsxLDMyNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgY2xhc3NlcyBHemlwSW5wdXRTdHJlYW0gYW5kCisvLyBHemlwT3V0cHV0U3RyZWFtLgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX1pMSUIKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdEJ1ZmZlclNpemUgPSA2NTUzNjsKKworR3ppcElucHV0U3RyZWFtOjpHemlwSW5wdXRTdHJlYW0oCisgICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogc3ViX3N0cmVhbSwgRm9ybWF0IGZvcm1hdCwgaW50IGJ1ZmZlcl9zaXplKQorICAgIDogZm9ybWF0Xyhmb3JtYXQpLCBzdWJfc3RyZWFtXyhzdWJfc3RyZWFtKSwgemVycm9yXyhaX09LKSB7CisgIHpjb250ZXh0Xy56YWxsb2MgPSBaX05VTEw7CisgIHpjb250ZXh0Xy56ZnJlZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLm9wYXF1ZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLnRvdGFsX291dCA9IDA7CisgIHpjb250ZXh0Xy5uZXh0X2luID0gTlVMTDsKKyAgemNvbnRleHRfLmF2YWlsX2luID0gMDsKKyAgemNvbnRleHRfLnRvdGFsX2luID0gMDsKKyAgemNvbnRleHRfLm1zZyA9IE5VTEw7CisgIGlmIChidWZmZXJfc2l6ZSA9PSAtMSkgeworICAgIG91dHB1dF9idWZmZXJfbGVuZ3RoXyA9IGtEZWZhdWx0QnVmZmVyU2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXRfYnVmZmVyX2xlbmd0aF8gPSBidWZmZXJfc2l6ZTsKKyAgfQorICBvdXRwdXRfYnVmZmVyXyA9IG9wZXJhdG9yIG5ldyhvdXRwdXRfYnVmZmVyX2xlbmd0aF8pOworICBHT09HTEVfQ0hFQ0sob3V0cHV0X2J1ZmZlcl8gIT0gTlVMTCk7CisgIHpjb250ZXh0Xy5uZXh0X291dCA9IHN0YXRpY19jYXN0PEJ5dGVmKj4ob3V0cHV0X2J1ZmZlcl8pOworICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gb3V0cHV0X2J1ZmZlcl9sZW5ndGhfOworICBvdXRwdXRfcG9zaXRpb25fID0gb3V0cHV0X2J1ZmZlcl87Cit9CitHemlwSW5wdXRTdHJlYW06On5HemlwSW5wdXRTdHJlYW0oKSB7CisgIG9wZXJhdG9yIGRlbGV0ZShvdXRwdXRfYnVmZmVyXyk7CisgIHplcnJvcl8gPSBpbmZsYXRlRW5kKCZ6Y29udGV4dF8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbnRlcm5hbEluZmxhdGVJbml0MigKKyAgICB6X3N0cmVhbSogemNvbnRleHQsIEd6aXBJbnB1dFN0cmVhbTo6Rm9ybWF0IGZvcm1hdCkgeworICBpbnQgd2luZG93Qml0c0Zvcm1hdCA9IDA7CisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHemlwSW5wdXRTdHJlYW06OkdaSVA6IHdpbmRvd0JpdHNGb3JtYXQgPSAxNjsgYnJlYWs7CisgICAgY2FzZSBHemlwSW5wdXRTdHJlYW06OkFVVE86IHdpbmRvd0JpdHNGb3JtYXQgPSAzMjsgYnJlYWs7CisgICAgY2FzZSBHemlwSW5wdXRTdHJlYW06OlpMSUI6IHdpbmRvd0JpdHNGb3JtYXQgPSAwOyBicmVhazsKKyAgfQorICByZXR1cm4gaW5mbGF0ZUluaXQyKHpjb250ZXh0LCAvKiB3aW5kb3dCaXRzICovMTUgfCB3aW5kb3dCaXRzRm9ybWF0KTsKK30KKworaW50IEd6aXBJbnB1dFN0cmVhbTo6SW5mbGF0ZShpbnQgZmx1c2gpIHsKKyAgaWYgKCh6ZXJyb3JfID09IFpfT0spICYmICh6Y29udGV4dF8uYXZhaWxfb3V0ID09IDApKSB7CisgICAgLy8gcHJldmlvdXMgaW5mbGF0ZSBmaWxsZWQgb3V0cHV0IGJ1ZmZlci4gZG9uJ3QgY2hhbmdlIGlucHV0IHBhcmFtcyB5ZXQuCisgIH0gZWxzZSBpZiAoemNvbnRleHRfLmF2YWlsX2luID09IDApIHsKKyAgICBjb25zdCB2b2lkKiBpbjsKKyAgICBpbnQgaW5fc2l6ZTsKKyAgICBib29sIGZpcnN0ID0gemNvbnRleHRfLm5leHRfaW4gPT0gTlVMTDsKKyAgICBib29sIG9rID0gc3ViX3N0cmVhbV8tPk5leHQoJmluLCAmaW5fc2l6ZSk7CisgICAgaWYgKCFvaykgeworICAgICAgemNvbnRleHRfLm5leHRfb3V0ID0gTlVMTDsKKyAgICAgIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSAwOworICAgICAgcmV0dXJuIFpfU1RSRUFNX0VORDsKKyAgICB9CisgICAgemNvbnRleHRfLm5leHRfaW4gPSBzdGF0aWNfY2FzdDxCeXRlZio+KGNvbnN0X2Nhc3Q8dm9pZCo+KGluKSk7CisgICAgemNvbnRleHRfLmF2YWlsX2luID0gaW5fc2l6ZTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGludCBlcnJvciA9IGludGVybmFsSW5mbGF0ZUluaXQyKCZ6Y29udGV4dF8sIGZvcm1hdF8pOworICAgICAgaWYgKGVycm9yICE9IFpfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorICAgIH0KKyAgfQorICB6Y29udGV4dF8ubmV4dF9vdXQgPSBzdGF0aWNfY2FzdDxCeXRlZio+KG91dHB1dF9idWZmZXJfKTsKKyAgemNvbnRleHRfLmF2YWlsX291dCA9IG91dHB1dF9idWZmZXJfbGVuZ3RoXzsKKyAgb3V0cHV0X3Bvc2l0aW9uXyA9IG91dHB1dF9idWZmZXJfOworICBpbnQgZXJyb3IgPSBpbmZsYXRlKCZ6Y29udGV4dF8sIGZsdXNoKTsKKyAgcmV0dXJuIGVycm9yOworfQorCit2b2lkIEd6aXBJbnB1dFN0cmVhbTo6RG9OZXh0T3V0cHV0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgKmRhdGEgPSBvdXRwdXRfcG9zaXRpb25fOworICAqc2l6ZSA9ICgodWludHB0cl90KXpjb250ZXh0Xy5uZXh0X291dCkgLSAoKHVpbnRwdHJfdClvdXRwdXRfcG9zaXRpb25fKTsKKyAgb3V0cHV0X3Bvc2l0aW9uXyA9IHpjb250ZXh0Xy5uZXh0X291dDsKK30KKworLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Jvb2wgR3ppcElucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgYm9vbCBvayA9ICh6ZXJyb3JfID09IFpfT0spIHx8ICh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHx8ICh6ZXJyb3JfID09IFpfQlVGX0VSUk9SKTsKKyAgaWYgKCghb2spIHx8ICh6Y29udGV4dF8ubmV4dF9vdXQgPT0gTlVMTCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHpjb250ZXh0Xy5uZXh0X291dCAhPSBvdXRwdXRfcG9zaXRpb25fKSB7CisgICAgRG9OZXh0T3V0cHV0KGRhdGEsIHNpemUpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkgeworICAgIGlmICh6Y29udGV4dF8ubmV4dF9vdXQgIT0gTlVMTCkgeworICAgICAgLy8gc3ViX3N0cmVhbV8gbWF5IGhhdmUgY29uY2F0ZW5hdGVkIHN0cmVhbXMgdG8gZm9sbG93CisgICAgICB6ZXJyb3JfID0gaW5mbGF0ZUVuZCgmemNvbnRleHRfKTsKKyAgICAgIGlmICh6ZXJyb3JfICE9IFpfT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgemVycm9yXyA9IGludGVybmFsSW5mbGF0ZUluaXQyKCZ6Y29udGV4dF8sIGZvcm1hdF8pOworICAgICAgaWYgKHplcnJvcl8gIT0gWl9PSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICpkYXRhID0gTlVMTDsKKyAgICAgICpzaXplID0gMDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgemVycm9yXyA9IEluZmxhdGUoWl9OT19GTFVTSCk7CisgIGlmICgoemVycm9yXyA9PSBaX1NUUkVBTV9FTkQpICYmICh6Y29udGV4dF8ubmV4dF9vdXQgPT0gTlVMTCkpIHsKKyAgICAvLyBUaGUgdW5kZXJseWluZyBzdHJlYW0ncyBOZXh0IHJldHVybmVkIGZhbHNlIGluc2lkZSBJbmZsYXRlLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBvayA9ICh6ZXJyb3JfID09IFpfT0spIHx8ICh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHx8ICh6ZXJyb3JfID09IFpfQlVGX0VSUk9SKTsKKyAgaWYgKCFvaykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBEb05leHRPdXRwdXQoZGF0YSwgc2l6ZSk7CisgIHJldHVybiB0cnVlOworfQordm9pZCBHemlwSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgb3V0cHV0X3Bvc2l0aW9uXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG91dHB1dF9wb3NpdGlvbl8pIC0gY291bnQpOworfQorYm9vbCBHemlwSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGNvbnN0IHZvaWQqIGRhdGE7CisgIGludCBzaXplOworICBib29sIG9rID0gTmV4dCgmZGF0YSwgJnNpemUpOworICB3aGlsZSAob2sgJiYgKHNpemUgPCBjb3VudCkpIHsKKyAgICBjb3VudCAtPSBzaXplOworICAgIG9rID0gTmV4dCgmZGF0YSwgJnNpemUpOworICB9CisgIGlmIChzaXplID4gY291bnQpIHsKKyAgICBCYWNrVXAoc2l6ZSAtIGNvdW50KTsKKyAgfQorICByZXR1cm4gb2s7Cit9CitpbnQ2NCBHemlwSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHpjb250ZXh0Xy50b3RhbF9vdXQgKworICAgICgoKHVpbnRwdHJfdCl6Y29udGV4dF8ubmV4dF9vdXQpIC0gKCh1aW50cHRyX3Qpb3V0cHV0X3Bvc2l0aW9uXykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0d6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnM6Ok9wdGlvbnMoKQorICAgIDogZm9ybWF0KEdaSVApLAorICAgICAgYnVmZmVyX3NpemUoa0RlZmF1bHRCdWZmZXJTaXplKSwKKyAgICAgIGNvbXByZXNzaW9uX2xldmVsKFpfREVGQVVMVF9DT01QUkVTU0lPTiksCisgICAgICBjb21wcmVzc2lvbl9zdHJhdGVneShaX0RFRkFVTFRfU1RSQVRFR1kpIHt9CisKK0d6aXBPdXRwdXRTdHJlYW06Okd6aXBPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0pIHsKKyAgSW5pdChzdWJfc3RyZWFtLCBPcHRpb25zKCkpOworfQorCitHemlwT3V0cHV0U3RyZWFtOjpHemlwT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIEluaXQoc3ViX3N0cmVhbSwgb3B0aW9ucyk7Cit9CisKK3ZvaWQgR3ppcE91dHB1dFN0cmVhbTo6SW5pdChaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN1Yl9zdHJlYW1fID0gc3ViX3N0cmVhbTsKKyAgc3ViX2RhdGFfID0gTlVMTDsKKyAgc3ViX2RhdGFfc2l6ZV8gPSAwOworCisgIGlucHV0X2J1ZmZlcl9sZW5ndGhfID0gb3B0aW9ucy5idWZmZXJfc2l6ZTsKKyAgaW5wdXRfYnVmZmVyXyA9IG9wZXJhdG9yIG5ldyhpbnB1dF9idWZmZXJfbGVuZ3RoXyk7CisgIEdPT0dMRV9DSEVDSyhpbnB1dF9idWZmZXJfICE9IE5VTEwpOworCisgIHpjb250ZXh0Xy56YWxsb2MgPSBaX05VTEw7CisgIHpjb250ZXh0Xy56ZnJlZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLm9wYXF1ZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLm5leHRfb3V0ID0gTlVMTDsKKyAgemNvbnRleHRfLmF2YWlsX291dCA9IDA7CisgIHpjb250ZXh0Xy50b3RhbF9vdXQgPSAwOworICB6Y29udGV4dF8ubmV4dF9pbiA9IE5VTEw7CisgIHpjb250ZXh0Xy5hdmFpbF9pbiA9IDA7CisgIHpjb250ZXh0Xy50b3RhbF9pbiA9IDA7CisgIHpjb250ZXh0Xy5tc2cgPSBOVUxMOworICAvLyBkZWZhdWx0IHRvIEdaSVAgZm9ybWF0CisgIGludCB3aW5kb3dCaXRzRm9ybWF0ID0gMTY7CisgIGlmIChvcHRpb25zLmZvcm1hdCA9PSBaTElCKSB7CisgICAgd2luZG93Qml0c0Zvcm1hdCA9IDA7CisgIH0KKyAgemVycm9yXyA9IGRlZmxhdGVJbml0MigKKyAgICAgICZ6Y29udGV4dF8sCisgICAgICBvcHRpb25zLmNvbXByZXNzaW9uX2xldmVsLAorICAgICAgWl9ERUZMQVRFRCwKKyAgICAgIC8qIHdpbmRvd0JpdHMgKi8xNSB8IHdpbmRvd0JpdHNGb3JtYXQsCisgICAgICAvKiBtZW1MZXZlbCAoZGVmYXVsdCkgKi84LAorICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbl9zdHJhdGVneSk7Cit9CisKK0d6aXBPdXRwdXRTdHJlYW06On5HemlwT3V0cHV0U3RyZWFtKCkgeworICBDbG9zZSgpOworICBpZiAoaW5wdXRfYnVmZmVyXyAhPSBOVUxMKSB7CisgICAgb3BlcmF0b3IgZGVsZXRlKGlucHV0X2J1ZmZlcl8pOworICB9Cit9CisKKy8vIHByaXZhdGUKK2ludCBHemlwT3V0cHV0U3RyZWFtOjpEZWZsYXRlKGludCBmbHVzaCkgeworICBpbnQgZXJyb3IgPSBaX09LOworICBkbyB7CisgICAgaWYgKChzdWJfZGF0YV8gPT0gTlVMTCkgfHwgKHpjb250ZXh0Xy5hdmFpbF9vdXQgPT0gMCkpIHsKKyAgICAgIGJvb2wgb2sgPSBzdWJfc3RyZWFtXy0+TmV4dCgmc3ViX2RhdGFfLCAmc3ViX2RhdGFfc2l6ZV8pOworICAgICAgaWYgKCFvaykgeworICAgICAgICBzdWJfZGF0YV8gPSBOVUxMOworICAgICAgICBzdWJfZGF0YV9zaXplXyA9IDA7CisgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKKyAgICAgIH0KKyAgICAgIEdPT0dMRV9DSEVDS19HVChzdWJfZGF0YV9zaXplXywgMCk7CisgICAgICB6Y29udGV4dF8ubmV4dF9vdXQgPSBzdGF0aWNfY2FzdDxCeXRlZio+KHN1Yl9kYXRhXyk7CisgICAgICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gc3ViX2RhdGFfc2l6ZV87CisgICAgfQorICAgIGVycm9yID0gZGVmbGF0ZSgmemNvbnRleHRfLCBmbHVzaCk7CisgIH0gd2hpbGUgKGVycm9yID09IFpfT0sgJiYgemNvbnRleHRfLmF2YWlsX291dCA9PSAwKTsKKyAgaWYgKChmbHVzaCA9PSBaX0ZVTExfRkxVU0gpIHx8IChmbHVzaCA9PSBaX0ZJTklTSCkpIHsKKyAgICAvLyBOb3RpZnkgbG93ZXIgbGF5ZXIgb2YgZGF0YS4KKyAgICBzdWJfc3RyZWFtXy0+QmFja1VwKHpjb250ZXh0Xy5hdmFpbF9vdXQpOworICAgIC8vIFdlIGRvbid0IG93biB0aGUgYnVmZmVyIGFueW1vcmUuCisgICAgc3ViX2RhdGFfID0gTlVMTDsKKyAgICBzdWJfZGF0YV9zaXplXyA9IDA7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCisvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYm9vbCBHemlwT3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgaWYgKCh6ZXJyb3JfICE9IFpfT0spICYmICh6ZXJyb3JfICE9IFpfQlVGX0VSUk9SKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoemNvbnRleHRfLmF2YWlsX2luICE9IDApIHsKKyAgICB6ZXJyb3JfID0gRGVmbGF0ZShaX05PX0ZMVVNIKTsKKyAgICBpZiAoemVycm9yXyAhPSBaX09LKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIGlmICh6Y29udGV4dF8uYXZhaWxfaW4gPT0gMCkgeworICAgIC8vIGFsbCBpbnB1dCB3YXMgY29uc3VtZWQuIHJlc2V0IHRoZSBidWZmZXIuCisgICAgemNvbnRleHRfLm5leHRfaW4gPSBzdGF0aWNfY2FzdDxCeXRlZio+KGlucHV0X2J1ZmZlcl8pOworICAgIHpjb250ZXh0Xy5hdmFpbF9pbiA9IGlucHV0X2J1ZmZlcl9sZW5ndGhfOworICAgICpkYXRhID0gaW5wdXRfYnVmZmVyXzsKKyAgICAqc2l6ZSA9IGlucHV0X2J1ZmZlcl9sZW5ndGhfOworICB9IGVsc2UgeworICAgIC8vIFRoZSBsb29wIGluIERlZmxhdGUgc2hvdWxkIGNvbnN1bWUgYWxsIGF2YWlsX2luCisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJEZWZsYXRlIGxlZnQgYnl0ZXMgdW5jb25zdW1lZCI7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9Cit2b2lkIEd6aXBPdXRwdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgR09PR0xFX0NIRUNLX0dFKHpjb250ZXh0Xy5hdmFpbF9pbiwgY291bnQpOworICB6Y29udGV4dF8uYXZhaWxfaW4gLT0gY291bnQ7Cit9CitpbnQ2NCBHemlwT3V0cHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiB6Y29udGV4dF8udG90YWxfaW4gKyB6Y29udGV4dF8uYXZhaWxfaW47Cit9CisKK2Jvb2wgR3ppcE91dHB1dFN0cmVhbTo6Rmx1c2goKSB7CisgIHplcnJvcl8gPSBEZWZsYXRlKFpfRlVMTF9GTFVTSCk7CisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBmbHVzaCBzdWNjZWVkZWQgb3IgaWYgaXQgd2FzIGEgbm8tb3AuCisgIHJldHVybiAgKHplcnJvcl8gPT0gWl9PSykgfHwKKyAgICAgICh6ZXJyb3JfID09IFpfQlVGX0VSUk9SICYmIHpjb250ZXh0Xy5hdmFpbF9pbiA9PSAwICYmCisgICAgICAgemNvbnRleHRfLmF2YWlsX291dCAhPSAwKTsKK30KKworYm9vbCBHemlwT3V0cHV0U3RyZWFtOjpDbG9zZSgpIHsKKyAgaWYgKCh6ZXJyb3JfICE9IFpfT0spICYmICh6ZXJyb3JfICE9IFpfQlVGX0VSUk9SKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBkbyB7CisgICAgemVycm9yXyA9IERlZmxhdGUoWl9GSU5JU0gpOworICB9IHdoaWxlICh6ZXJyb3JfID09IFpfT0spOworICB6ZXJyb3JfID0gZGVmbGF0ZUVuZCgmemNvbnRleHRfKTsKKyAgYm9vbCBvayA9IHplcnJvcl8gPT0gWl9PSzsKKyAgemVycm9yXyA9IFpfU1RSRUFNX0VORDsKKyAgcmV0dXJuIG9rOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEhBVkVfWkxJQgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjVlOWVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogYnJpYW5vbHNvbkBnb29nbGUuY29tIChCcmlhbiBPbHNvbikKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gZm9yIGNsYXNzZXMgR3ppcElucHV0U3RyZWFtIGFuZAorLy8gR3ppcE91dHB1dFN0cmVhbS4KKy8vCisvLyBHemlwSW5wdXRTdHJlYW0gZGVjb21wcmVzc2VzIGRhdGEgZnJvbSBhbiB1bmRlcmx5aW5nCisvLyBaZXJvQ29weUlucHV0U3RyZWFtIGFuZCBwcm92aWRlcyB0aGUgZGVjb21wcmVzc2VkIGRhdGEgYXMgYQorLy8gWmVyb0NvcHlJbnB1dFN0cmVhbS4KKy8vCisvLyBHemlwT3V0cHV0U3RyZWFtIGlzIGFuIFplcm9Db3B5T3V0cHV0U3RyZWFtIHRoYXQgY29tcHJlc3NlcyBkYXRhIHRvCisvLyBhbiB1bmRlcmx5aW5nIFplcm9Db3B5T3V0cHV0U3RyZWFtLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19HWklQX1NUUkVBTV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX0daSVBfU1RSRUFNX0hfXworCisjaW5jbHVkZSA8emxpYi5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKKy8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSB0aGF0IHJlYWRzIGNvbXByZXNzZWQgZGF0YSB0aHJvdWdoIHpsaWIKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBHemlwSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBGb3JtYXQga2V5IGZvciBjb25zdHJ1Y3RvcgorICBlbnVtIEZvcm1hdCB7CisgICAgLy8gemxpYiB3aWxsIGF1dG9kZXRlY3QgZ3ppcCBoZWFkZXIgb3IgZGVmbGF0ZSBzdHJlYW0KKyAgICBBVVRPID0gMCwKKworICAgIC8vIEdaSVAgc3RyZWFtcyBoYXZlIHNvbWUgZXh0cmEgaGVhZGVyIGRhdGEgZm9yIGZpbGUgYXR0cmlidXRlcy4KKyAgICBHWklQID0gMSwKKworICAgIC8vIFNpbXBsZXIgemxpYiBzdHJlYW0gZm9ybWF0LgorICAgIFpMSUIgPSAyLAorICB9OworCisgIC8vIGJ1ZmZlcl9zaXplIGFuZCBmb3JtYXQgbWF5IGJlIC0xIGZvciBkZWZhdWx0IG9mIDY0a0IgYW5kIEdaSVAgZm9ybWF0CisgIGV4cGxpY2l0IEd6aXBJbnB1dFN0cmVhbSgKKyAgICAgIFplcm9Db3B5SW5wdXRTdHJlYW0qIHN1Yl9zdHJlYW0sCisgICAgICBGb3JtYXQgZm9ybWF0ID0gQVVUTywKKyAgICAgIGludCBidWZmZXJfc2l6ZSA9IC0xKTsKKyAgdmlydHVhbCB+R3ppcElucHV0U3RyZWFtKCk7CisKKyAgLy8gUmV0dXJuIGxhc3QgZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIG5vIGVycm9yLgorICBpbmxpbmUgY29uc3QgY2hhciogWmxpYkVycm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gemNvbnRleHRfLm1zZzsKKyAgfQorICBpbmxpbmUgaW50IFpsaWJFcnJvckNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHplcnJvcl87CisgIH0KKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGJvb2wgU2tpcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIEZvcm1hdCBmb3JtYXRfOworCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIHN1Yl9zdHJlYW1fOworCisgIHpfc3RyZWFtIHpjb250ZXh0XzsKKyAgaW50IHplcnJvcl87CisKKyAgdm9pZCogb3V0cHV0X2J1ZmZlcl87CisgIHZvaWQqIG91dHB1dF9wb3NpdGlvbl87CisgIHNpemVfdCBvdXRwdXRfYnVmZmVyX2xlbmd0aF87CisKKyAgaW50IEluZmxhdGUoaW50IGZsdXNoKTsKKyAgdm9pZCBEb05leHRPdXRwdXQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEd6aXBJbnB1dFN0cmVhbSk7Cit9OworCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBHemlwT3V0cHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIEZvcm1hdCBrZXkgZm9yIGNvbnN0cnVjdG9yCisgIGVudW0gRm9ybWF0IHsKKyAgICAvLyBHWklQIHN0cmVhbXMgaGF2ZSBzb21lIGV4dHJhIGhlYWRlciBkYXRhIGZvciBmaWxlIGF0dHJpYnV0ZXMuCisgICAgR1pJUCA9IDEsCisKKyAgICAvLyBTaW1wbGVyIHpsaWIgc3RyZWFtIGZvcm1hdC4KKyAgICBaTElCID0gMiwKKyAgfTsKKworICBzdHJ1Y3QgTElCUFJPVE9CVUZfRVhQT1JUIE9wdGlvbnMgeworICAgIC8vIERlZmF1bHRzIHRvIEdaSVAuCisgICAgRm9ybWF0IGZvcm1hdDsKKworICAgIC8vIFdoYXQgc2l6ZSBidWZmZXIgdG8gdXNlIGludGVybmFsbHkuICBEZWZhdWx0cyB0byA2NGtCLgorICAgIGludCBidWZmZXJfc2l6ZTsKKworICAgIC8vIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOSwgd2hlcmUgMCBpcyBubyBjb21wcmVzc2lvbiBhbmQgOSBpcyBiZXN0CisgICAgLy8gY29tcHJlc3Npb24uICBEZWZhdWx0cyB0byBaX0RFRkFVTFRfQ09NUFJFU1NJT04gKHNlZSB6bGliLmgpLgorICAgIGludCBjb21wcmVzc2lvbl9sZXZlbDsKKworICAgIC8vIERlZmF1bHRzIHRvIFpfREVGQVVMVF9TVFJBVEVHWS4gIENhbiBhbHNvIGJlIHNldCB0byBaX0ZJTFRFUkVELAorICAgIC8vIFpfSFVGRk1BTl9PTkxZLCBvciBaX1JMRS4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGVmbGF0ZUluaXQyIGluCisgICAgLy8gemxpYi5oIGZvciBkZWZpbml0aW9ucyBvZiB0aGVzZSBjb25zdGFudHMuCisgICAgaW50IGNvbXByZXNzaW9uX3N0cmF0ZWd5OworCisgICAgT3B0aW9ucygpOyAgLy8gSW5pdGlhbGl6ZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgfTsKKworICAvLyBDcmVhdGUgYSBHemlwT3V0cHV0U3RyZWFtIHdpdGggZGVmYXVsdCBvcHRpb25zLgorICBleHBsaWNpdCBHemlwT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtKTsKKworICAvLyBDcmVhdGUgYSBHemlwT3V0cHV0U3RyZWFtIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuCisgIEd6aXBPdXRwdXRTdHJlYW0oCisgICAgICBaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSwKKyAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisgIHZpcnR1YWwgfkd6aXBPdXRwdXRTdHJlYW0oKTsKKworICAvLyBSZXR1cm4gbGFzdCBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgbm8gZXJyb3IuCisgIGlubGluZSBjb25zdCBjaGFyKiBabGliRXJyb3JNZXNzYWdlKCkgY29uc3QgeworICAgIHJldHVybiB6Y29udGV4dF8ubXNnOworICB9CisgIGlubGluZSBpbnQgWmxpYkVycm9yQ29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gemVycm9yXzsKKyAgfQorCisgIC8vIEZsdXNoZXMgZGF0YSB3cml0dGVuIHNvIGZhciB0byB6aXBwZWQgZGF0YSBpbiB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIC8vIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmbHVzaCB0aGUgdW5kZXJseWluZyBzdHJlYW0gaWYKKyAgLy8gbmVjZXNzYXJ5LgorICAvLyBDb21wcmVzc2lvbiBtYXkgYmUgbGVzcyBlZmZpY2llbnQgc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIGFyb3VuZCBmbHVzaGVzLgorICAvLyBSZXR1cm5zIHRydWUgaWYgbm8gZXJyb3IuCisgIC8vCisgIC8vIFBsZWFzZSBlbnN1cmUgdGhhdCBibG9jayBzaXplIGlzID4gNi4gSGVyZSBpcyBhbiBleGNlcnB0IGZyb20gdGhlIHpsaWIKKyAgLy8gZG9jIHRoYXQgZXhwbGFpbnMgd2h5OgorICAvLworICAvLyBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0IGF2YWlsX291dAorICAvLyBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCisgIC8vIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KKyAgYm9vbCBGbHVzaCgpOworCisgIC8vIFdyaXRlcyBvdXQgYWxsIGRhdGEgYW5kIGNsb3NlcyB0aGUgZ3ppcCBzdHJlYW0uCisgIC8vIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjbG9zZSB0aGUgdW5kZXJseWluZyBzdHJlYW0gaWYKKyAgLy8gbmVjZXNzYXJ5LgorICAvLyBSZXR1cm5zIHRydWUgaWYgbm8gZXJyb3IuCisgIGJvb2wgQ2xvc2UoKTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW1fOworICAvLyBSZXN1bHQgZnJvbSBjYWxsaW5nIE5leHQoKSBvbiBzdWJfc3RyZWFtXworICB2b2lkKiBzdWJfZGF0YV87CisgIGludCBzdWJfZGF0YV9zaXplXzsKKworICB6X3N0cmVhbSB6Y29udGV4dF87CisgIGludCB6ZXJyb3JfOworICB2b2lkKiBpbnB1dF9idWZmZXJfOworICBzaXplX3QgaW5wdXRfYnVmZmVyX2xlbmd0aF87CisKKyAgLy8gU2hhcmVkIGNvbnN0cnVjdG9yIGNvZGUuCisgIHZvaWQgSW5pdChaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgLy8gRG8gc29tZSBjb21wcmVzc2lvbi4KKyAgLy8gVGFrZXMgemxpYiBmbHVzaCBtb2RlLgorICAvLyBSZXR1cm5zIHpsaWIgZXJyb3IgY29kZS4KKyAgaW50IERlZmxhdGUoaW50IGZsdXNoKTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR3ppcE91dHB1dFN0cmVhbSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19HWklQX1NUUkVBTV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZThhMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtX3VuaXR0ZXN0LnNoCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaCAteAorIworIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisjIEF1dGhvcjogYnJpYW5vbHNvbkBnb29nbGUuY29tIChCcmlhbiBPbHNvbikKKyMKKyMgVGVzdCBjb21wYXRpYmlsaXR5IGJldHdlZW4gY29tbWFuZCBsaW5lIGd6aXAvZ3VuemlwIGJpbmFyaWVzIGFuZAorIyBaZXJvQ29weVN0cmVhbSB2ZXJzaW9ucy4KKworVEVTVEZJTEU9TWFrZWZpbGUKKworKC4vemNnemlwIDwgJHtURVNURklMRX0gfCBndW56aXAgfCBjbXAgLSAke1RFU1RGSUxFfSkgJiYgXAorKGd6aXAgPCAke1RFU1RGSUxFfSB8IC4vemNndW56aXAgfCBjbXAgLSAke1RFU1RGSUxFfSkKKworIyBSZXN1bHQgb2YgIihjbWQpICYmIChjbWQpIiBpbXBsaWNpdGx5IGJlY29tZXMgcmVzdWx0IG9mIHRoaXMgc2NyaXB0CisjIGFuZCB0aHVzIHRoZSB0ZXN0LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhN2E0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGV4aXN0cyBzb2xlbHkgdG8gZG9jdW1lbnQgdGhlIGdvb2dsZTo6cHJvdG9idWY6OmlvIG5hbWVzcGFjZS4KKy8vIEl0IGlzIG5vdCBjb21waWxlZCBpbnRvIGFueXRoaW5nLCBidXQgaXQgbWF5IGJlIHJlYWQgYnkgYW4gYXV0b21hdGVkCisvLyBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4KKworbmFtZXNwYWNlIGdvb2dsZSB7CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIEF1eGlsaWFyeSBjbGFzc2VzIHVzZWQgZm9yIEkvTy4KKy8vCisvLyBUaGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkgdXNlcyB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgdG8gZGVhbCB3aXRoCisvLyBJL08gYW5kIGVuY29kaW5nL2RlY29kaW5nIHJhdyBieXRlcy4gIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0bworLy8gZGVhbCB3aXRoIHRoaXMgcGFja2FnZS4gIEhvd2V2ZXIsIHVzZXJzIHdobyB3YW50IHRvIGFkYXB0IHRoZSBzeXN0ZW0gdG8KKy8vIHdvcmsgd2l0aCB0aGVpciBvd24gSS9PIGFic3RyYWN0aW9ucyAtLSBlLmcuLCB0byBhbGxvdyBQcm90b2NvbCBCdWZmZXJzCisvLyB0byBiZSByZWFkIGZyb20gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBzdHJlYW0gd2l0aG91dCB0aGUgbmVlZCBmb3IgYQorLy8gdGVtcG9yYXJ5IGJ1ZmZlciAtLSBzaG91bGQgdGFrZSBhIGNsb3NlciBsb29rLgorbmFtZXNwYWNlIGlvIHt9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJmM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MKQEAgLTAsMCArMSwxOTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworUHJpbnRlcjo6UHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlcikKKyAgOiB2YXJpYWJsZV9kZWxpbWl0ZXJfKHZhcmlhYmxlX2RlbGltaXRlciksCisgICAgb3V0cHV0XyhvdXRwdXQpLAorICAgIGJ1ZmZlcl8oTlVMTCksCisgICAgYnVmZmVyX3NpemVfKDApLAorICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAorICAgIGZhaWxlZF8oZmFsc2UpIHsKK30KKworUHJpbnRlcjo6flByaW50ZXIoKSB7CisgIC8vIE9ubHkgQmFja1VwKCkgaWYgd2UgaGF2ZSBjYWxsZWQgTmV4dCgpIGF0IGxlYXN0IG9uY2UgYW5kIG5ldmVyIGZhaWxlZC4KKyAgaWYgKGJ1ZmZlcl9zaXplXyA+IDAgJiYgIWZhaWxlZF8pIHsKKyAgICBvdXRwdXRfLT5CYWNrVXAoYnVmZmVyX3NpemVfKTsKKyAgfQorfQorCit2b2lkIFByaW50ZXI6OlByaW50KGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywgY29uc3QgY2hhciogdGV4dCkgeworICBpbnQgc2l6ZSA9IHN0cmxlbih0ZXh0KTsKKyAgaW50IHBvcyA9IDA7ICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlJ3ZlIHdyaXR0ZW4gc28gZmFyLgorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKHRleHRbaV0gPT0gJ1xuJykgeworICAgICAgLy8gU2F3IG5ld2xpbmUuICBJZiB0aGVyZSBpcyBtb3JlIHRleHQsIHdlIG1heSBuZWVkIHRvIGluc2VydCBhbiBpbmRlbnQKKyAgICAgIC8vIGhlcmUuICBTbywgd3JpdGUgd2hhdCB3ZSBoYXZlIHNvIGZhciwgaW5jbHVkaW5nIHRoZSAnXG4nLgorICAgICAgV3JpdGVSYXcodGV4dCArIHBvcywgaSAtIHBvcyArIDEpOworICAgICAgcG9zID0gaSArIDE7CisKKyAgICAgIC8vIFNldHRpbmcgdGhpcyB0cnVlIHdpbGwgY2F1c2UgdGhlIG5leHQgV3JpdGVSYXcoKSB0byBpbnNlcnQgYW4gaW5kZW50CisgICAgICAvLyBmaXJzdC4KKyAgICAgIGF0X3N0YXJ0X29mX2xpbmVfID0gdHJ1ZTsKKworICAgIH0gZWxzZSBpZiAodGV4dFtpXSA9PSB2YXJpYWJsZV9kZWxpbWl0ZXJfKSB7CisgICAgICAvLyBTYXcgdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbmFtZS4KKworICAgICAgLy8gV3JpdGUgd2hhdCB3ZSBoYXZlIHNvIGZhci4KKyAgICAgIFdyaXRlUmF3KHRleHQgKyBwb3MsIGkgLSBwb3MpOworICAgICAgcG9zID0gaSArIDE7CisKKyAgICAgIC8vIEZpbmQgY2xvc2luZyBkZWxpbWl0ZXIuCisgICAgICBjb25zdCBjaGFyKiBlbmQgPSBzdHJjaHIodGV4dCArIHBvcywgdmFyaWFibGVfZGVsaW1pdGVyXyk7CisgICAgICBpZiAoZW5kID09IE5VTEwpIHsKKyAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgVW5jbG9zZWQgdmFyaWFibGUgbmFtZS4iOworICAgICAgICBlbmQgPSB0ZXh0ICsgcG9zOworICAgICAgfQorICAgICAgaW50IGVuZHBvcyA9IGVuZCAtIHRleHQ7CisKKyAgICAgIHN0cmluZyB2YXJuYW1lKHRleHQgKyBwb3MsIGVuZHBvcyAtIHBvcyk7CisgICAgICBpZiAodmFybmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIFR3byBkZWxpbWl0ZXJzIGluIGEgcm93IHJlZHVjZSB0byBhIGxpdGVyYWwgZGVsaW1pdGVyIGNoYXJhY3Rlci4KKyAgICAgICAgV3JpdGVSYXcoJnZhcmlhYmxlX2RlbGltaXRlcl8sIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVwbGFjZSB3aXRoIHRoZSB2YXJpYWJsZSdzIHZhbHVlLgorICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gdmFyaWFibGVzLmZpbmQodmFybmFtZSk7CisgICAgICAgIGlmIChpdGVyID09IHZhcmlhYmxlcy5lbmQoKSkgeworICAgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIFVuZGVmaW5lZCB2YXJpYWJsZTogIiA8PCB2YXJuYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdyaXRlUmF3KGl0ZXItPnNlY29uZC5kYXRhKCksIGl0ZXItPnNlY29uZC5zaXplKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEFkdmFuY2UgcGFzdCB0aGlzIHZhcmlhYmxlLgorICAgICAgaSA9IGVuZHBvczsKKyAgICAgIHBvcyA9IGVuZHBvcyArIDE7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgdGhlIHJlc3QuCisgIFdyaXRlUmF3KHRleHQgKyBwb3MsIHNpemUgLSBwb3MpOworfQorCit2b2lkIFByaW50ZXI6OlByaW50KGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgc3RhdGljIG1hcDxzdHJpbmcsIHN0cmluZz4gZW1wdHk7CisgIFByaW50KGVtcHR5LCB0ZXh0KTsKK30KKwordm9pZCBQcmludGVyOjpQcmludChjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGVdID0gdmFsdWU7CisgIFByaW50KHZhcnMsIHRleHQpOworfQorCit2b2lkIFByaW50ZXI6OlByaW50KGNvbnN0IGNoYXIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzW3ZhcmlhYmxlMV0gPSB2YWx1ZTE7CisgIHZhcnNbdmFyaWFibGUyXSA9IHZhbHVlMjsKKyAgUHJpbnQodmFycywgdGV4dCk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMykgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKKyAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOworICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7CisgIFByaW50KHZhcnMsIHRleHQpOworfQorCit2b2lkIFByaW50ZXI6OkluZGVudCgpIHsKKyAgaW5kZW50XyArPSAiICAiOworfQorCit2b2lkIFByaW50ZXI6Ok91dGRlbnQoKSB7CisgIGlmIChpbmRlbnRfLmVtcHR5KCkpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIiBPdXRkZW50KCkgd2l0aG91dCBtYXRjaGluZyBJbmRlbnQoKS4iOworICAgIHJldHVybjsKKyAgfQorCisgIGluZGVudF8ucmVzaXplKGluZGVudF8uc2l6ZSgpIC0gMik7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnRSYXcoY29uc3Qgc3RyaW5nJiBkYXRhKSB7CisgIFdyaXRlUmF3KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnRSYXcoY29uc3QgY2hhciogZGF0YSkgeworICBpZiAoZmFpbGVkXykgcmV0dXJuOworICBXcml0ZVJhdyhkYXRhLCBzdHJsZW4oZGF0YSkpOworfQorCit2b2lkIFByaW50ZXI6OldyaXRlUmF3KGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgIGlmIChmYWlsZWRfKSByZXR1cm47CisgIGlmIChzaXplID09IDApIHJldHVybjsKKworICBpZiAoYXRfc3RhcnRfb2ZfbGluZV8gJiYgKHNpemUgPiAwKSAmJiAoZGF0YVswXSAhPSAnXG4nKSkgeworICAgIC8vIEluc2VydCBhbiBpbmRlbnQuCisgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSBmYWxzZTsKKyAgICBXcml0ZVJhdyhpbmRlbnRfLmRhdGEoKSwgaW5kZW50Xy5zaXplKCkpOworICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgIH0KKworICB3aGlsZSAoc2l6ZSA+IGJ1ZmZlcl9zaXplXykgeworICAgIC8vIERhdGEgZXhjZWVkcyBzcGFjZSBpbiB0aGUgYnVmZmVyLiAgQ29weSB3aGF0IHdlIGNhbiBhbmQgcmVxdWVzdCBhCisgICAgLy8gbmV3IGJ1ZmZlci4KKyAgICBtZW1jcHkoYnVmZmVyXywgZGF0YSwgYnVmZmVyX3NpemVfKTsKKyAgICBkYXRhICs9IGJ1ZmZlcl9zaXplXzsKKyAgICBzaXplIC09IGJ1ZmZlcl9zaXplXzsKKyAgICB2b2lkKiB2b2lkX2J1ZmZlcjsKKyAgICBmYWlsZWRfID0gIW91dHB1dF8tPk5leHQoJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemVfKTsKKyAgICBpZiAoZmFpbGVkXykgcmV0dXJuOworICAgIGJ1ZmZlcl8gPSByZWludGVycHJldF9jYXN0PGNoYXIqPih2b2lkX2J1ZmZlcik7CisgIH0KKworICAvLyBCdWZmZXIgaXMgYmlnIGVub3VnaCB0byByZWNlaXZlIHRoZSBkYXRhOyBjb3B5IGl0LgorICBtZW1jcHkoYnVmZmVyXywgZGF0YSwgc2l6ZSk7CisgIGJ1ZmZlcl8gKz0gc2l6ZTsKKyAgYnVmZmVyX3NpemVfIC09IHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmU0ODU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaApAQCAtMCwwICsxLDEzNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVXRpbGl0eSBjbGFzcyBmb3Igd3JpdGluZyB0ZXh0IHRvIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0uCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1BSSU5URVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19QUklOVEVSX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKK2NsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOyAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisKKy8vIFRoaXMgc2ltcGxlIHV0aWxpdHkgY2xhc3MgYXNzaXN0cyBpbiBjb2RlIGdlbmVyYXRpb24uICBJdCBiYXNpY2FsbHkKKy8vIGFsbG93cyB0aGUgY2FsbGVyIHRvIGRlZmluZSBhIHNldCBvZiB2YXJpYWJsZXMgYW5kIHRoZW4gb3V0cHV0IHNvbWUKKy8vIHRleHQgd2l0aCB2YXJpYWJsZSBzdWJzdGl0dXRpb25zLiAgRXhhbXBsZSB1c2FnZToKKy8vCisvLyAgIFByaW50ZXIgcHJpbnRlcihvdXRwdXQsICckJyk7CisvLyAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKy8vICAgdmFyc1sibmFtZSJdID0gIkJvYiI7CisvLyAgIHByaW50ZXIuUHJpbnQodmFycywgIk15IG5hbWUgaXMgJG5hbWUkLiIpOworLy8KKy8vIFRoZSBhYm92ZSB3cml0ZXMgIk15IG5hbWUgaXMgQm9iLiIgdG8gdGhlIG91dHB1dCBzdHJlYW0uCisvLworLy8gUHJpbnRlciBhZ2dyZXNzaXZlbHkgZW5mb3JjZXMgY29ycmVjdCB1c2FnZSwgY3Jhc2hpbmcgKHdpdGggYXNzZXJ0IGZhaWx1cmVzKQorLy8gaW4gdGhlIGNhc2Ugb2YgdW5kZWZpbmVkIHZhcmlhYmxlcyBpbiBkZWJ1ZyBidWlsZHMuIFRoaXMgaGVscHMgZ3JlYXRseSBpbgorLy8gZGVidWdnaW5nIGNvZGUgd2hpY2ggdXNlcyBpdC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBQcmludGVyIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhIHByaW50ZXIgdGhhdCB3cml0ZXMgdGV4dCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4gIFVzZSB0aGUKKyAgLy8gZ2l2ZW4gY2hhcmFjdGVyIGFzIHRoZSBkZWxpbWl0ZXIgZm9yIHZhcmlhYmxlcy4KKyAgUHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlcik7CisgIH5QcmludGVyKCk7CisKKyAgLy8gUHJpbnQgc29tZSB0ZXh0IGFmdGVyIGFwcGx5aW5nIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMuICBJZiBhIHBhcnRpY3VsYXIKKyAgLy8gdmFyaWFibGUgaW4gdGhlIHRleHQgaXMgbm90IGRlZmluZWQsIHRoaXMgd2lsbCBjcmFzaC4gIFZhcmlhYmxlcyB0byBiZQorICAvLyBzdWJzdGl0dXRlZCBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBuYW1lcyBzdXJyb3VuZGVkIGJ5IGRlbGltaXRlcgorICAvLyBjaGFyYWN0ZXJzIChhcyBnaXZlbiB0byB0aGUgY29uc3RydWN0b3IpLiAgVGhlIHZhcmlhYmxlIGJpbmRpbmdzIGFyZQorICAvLyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBtYXAuCisgIHZvaWQgUHJpbnQoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFyaWFibGVzLCBjb25zdCBjaGFyKiB0ZXh0KTsKKworICAvLyBMaWtlIHRoZSBmaXJzdCBQcmludCgpLCBleGNlcHQgdGhlIHN1YnN0aXR1dGlvbnMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCk7CisgIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CisgIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIpOworICAvLyBMaWtlIHRoZSBmaXJzdCBQcmludCgpLCBleGNlcHQgdGhlIHN1YnN0aXR1dGlvbnMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMywgY29uc3Qgc3RyaW5nJiB2YWx1ZTMpOworICAvLyBUT0RPKGtlbnRvbik6ICBPdmVybG9hZGVkIHZlcnNpb25zIHdpdGggbW9yZSB2YXJpYWJsZXM/ICBUaHJlZSBzZWVtcworICAvLyAgIHRvIGJlIGVub3VnaC4KKworICAvLyBJbmRlbnQgdGV4dCBieSB0d28gc3BhY2VzLiAgQWZ0ZXIgY2FsbGluZyBJbmRlbnQoKSwgdHdvIHNwYWNlcyB3aWxsIGJlCisgIC8vIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIG9mIHRleHQuICBJbmRlbnQoKSBtYXkgYmUgY2FsbGVkCisgIC8vIG11bHRpcGxlIHRpbWVzIHRvIHByb2R1Y2UgZGVlcGVyIGluZGVudHMuCisgIHZvaWQgSW5kZW50KCk7CisKKyAgLy8gUmVkdWNlcyB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwgYnkgdHdvIHNwYWNlcywgb3IgY3Jhc2hlcyBpZiB0aGUgaW5kZW50CisgIC8vIGxldmVsIGlzIHplcm8uCisgIHZvaWQgT3V0ZGVudCgpOworCisgIC8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICAvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBsb29rIGZvciBuZXdsaW5lcyB0byBhZGQgaW5kZW50YXRpb24uCisgIHZvaWQgUHJpbnRSYXcoY29uc3Qgc3RyaW5nJiBkYXRhKTsKKworICAvLyBXcml0ZSBhIHplcm8tZGVsaW1pdGVkIHN0cmluZyB0byBvdXRwdXQgYnVmZmVyLgorICAvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBsb29rIGZvciBuZXdsaW5lcyB0byBhZGQgaW5kZW50YXRpb24uCisgIHZvaWQgUHJpbnRSYXcoY29uc3QgY2hhciogZGF0YSk7CisKKyAgLy8gV3JpdGUgc29tZSBieXRlcyB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgbG9vayBmb3IgbmV3bGluZXMgdG8gYWRkIGluZGVudGF0aW9uLgorICB2b2lkIFdyaXRlUmF3KGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKTsKKworICAvLyBUcnVlIGlmIGFueSB3cml0ZSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0gZmFpbGVkLiAgKFdlIGRvbid0IGp1c3QKKyAgLy8gY3Jhc2ggaW4gdGhpcyBjYXNlIGJlY2F1c2UgdGhpcyBpcyBhbiBJL08gZmFpbHVyZSwgbm90IGEgcHJvZ3JhbW1pbmcKKyAgLy8gZXJyb3IuKQorICBib29sIGZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhaWxlZF87IH0KKworIHByaXZhdGU6CisgIGNvbnN0IGNoYXIgdmFyaWFibGVfZGVsaW1pdGVyXzsKKworICBaZXJvQ29weU91dHB1dFN0cmVhbSogY29uc3Qgb3V0cHV0XzsKKyAgY2hhciogYnVmZmVyXzsKKyAgaW50IGJ1ZmZlcl9zaXplXzsKKworICBzdHJpbmcgaW5kZW50XzsKKyAgYm9vbCBhdF9zdGFydF9vZl9saW5lXzsKKyAgYm9vbCBmYWlsZWRfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcmludGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX1BSSU5URVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjMwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDI4NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKK25hbWVzcGFjZSB7CisKKy8vIEVhY2ggdGVzdCByZXBlYXRzIG92ZXIgc2V2ZXJhbCBibG9jayBzaXplcyBpbiBvcmRlciB0byB0ZXN0IGJvdGggY2FzZXMKKy8vIHdoZXJlIHBhcnRpY3VsYXIgd3JpdGVzIGNyb3NzIGEgYnVmZmVyIGJvdW5kYXJ5IGFuZCBjYXNlcyB3aGVyZSB0aGV5IGRvCisvLyBub3QuCisKK1RFU1QoUHJpbnRlciwgRW1wdHlQcmludGVyKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBjb25zdCBpbnQgYmxvY2tfc2l6ZSA9IDEwMDsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgR09PR0xFX0FSUkFZU0laRShidWZmZXIpLCBibG9ja19zaXplKTsKKyAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICdcMCcpOworICBFWFBFQ1RfVFJVRSghcHJpbnRlci5mYWlsZWQoKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgQmFzaWNQcmludGluZykgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKworICBmb3IgKGludCBibG9ja19zaXplID0gMTsgYmxvY2tfc2l6ZSA8IDUxMjsgYmxvY2tfc2l6ZSAqPSAyKSB7CisgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGJsb2NrX3NpemUpOworCisgICAgeworICAgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICdcMCcpOworCisgICAgICBwcmludGVyLlByaW50KCJIZWxsbyBXb3JsZCEiKTsKKyAgICAgIHByaW50ZXIuUHJpbnQoIiAgVGhpcyBpcyB0aGUgc2FtZSBsaW5lLlxuIik7CisgICAgICBwcmludGVyLlByaW50KCJCdXQgdGhpcyBpcyBhIG5ldyBvbmUuXG5BbmQgdGhpcyBpcyBhbm90aGVyIG9uZS4iKTsKKworICAgICAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOworICAgIH0KKworICAgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKKworICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8gV29ybGQhICBUaGlzIGlzIHRoZSBzYW1lIGxpbmUuXG4iCisgICAgICAgICAgICAgICAgICJCdXQgdGhpcyBpcyBhIG5ldyBvbmUuXG4iCisgICAgICAgICAgICAgICAgICJBbmQgdGhpcyBpcyBhbm90aGVyIG9uZS4iLAorICAgICAgICAgICAgICAgICBidWZmZXIpOworICB9Cit9CisKK1RFU1QoUHJpbnRlciwgV3JpdGVSYXcpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisKKyAgZm9yIChpbnQgYmxvY2tfc2l6ZSA9IDE7IGJsb2NrX3NpemUgPCA1MTI7IGJsb2NrX3NpemUgKj0gMikgeworICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpLCBibG9ja19zaXplKTsKKworICAgIHsKKyAgICAgIHN0cmluZyBzdHJpbmdfb2JqID0gIkZyb20gYW4gb2JqZWN0XG4iOworICAgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgICBwcmludGVyLldyaXRlUmF3KCJIZWxsbyBXb3JsZCEiLCAxMik7CisgICAgICBwcmludGVyLlByaW50UmF3KCIgIFRoaXMgaXMgdGhlIHNhbWUgbGluZS5cbiIpOworICAgICAgcHJpbnRlci5QcmludFJhdygiQnV0IHRoaXMgaXMgYSBuZXcgb25lLlxuQW5kIHRoaXMgaXMgYW5vdGhlciBvbmUuIik7CisgICAgICBwcmludGVyLldyaXRlUmF3KCJcbiIsIDEpOworICAgICAgcHJpbnRlci5QcmludFJhdyhzdHJpbmdfb2JqKTsKKyAgICAgIEVYUEVDVF9GQUxTRShwcmludGVyLmZhaWxlZCgpKTsKKyAgICB9CisKKyAgICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisKKyAgICBFWFBFQ1RfU1RSRVEoIkhlbGxvIFdvcmxkISAgVGhpcyBpcyB0aGUgc2FtZSBsaW5lLlxuIgorICAgICAgICAgICAgICAgICAiQnV0IHRoaXMgaXMgYSBuZXcgb25lLlxuIgorICAgICAgICAgICAgICAgICAiQW5kIHRoaXMgaXMgYW5vdGhlciBvbmUuIgorICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICJGcm9tIGFuIG9iamVjdFxuIiwKKyAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKyAgfQorfQorCitURVNUKFByaW50ZXIsIFZhcmlhYmxlU3Vic3RpdHV0aW9uKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworCisgIGZvciAoaW50IGJsb2NrX3NpemUgPSAxOyBibG9ja19zaXplIDwgNTEyOyBibG9ja19zaXplICo9IDIpIHsKKyAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgYmxvY2tfc2l6ZSk7CisKKyAgICB7CisgICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKworICAgICAgdmFyc1siZm9vIl0gPSAiV29ybGQiOworICAgICAgdmFyc1siYmFyIl0gPSAiJGZvbyQiOworICAgICAgdmFyc1siYWJjZGVmZyJdID0gIjEyMzQiOworCisgICAgICBwcmludGVyLlByaW50KHZhcnMsICJIZWxsbyAkZm9vJCFcbmJhciA9ICRiYXIkXG4iKTsKKyAgICAgIHByaW50ZXIuUHJpbnRSYXcoIlJhd0JpdFxuIik7CisgICAgICBwcmludGVyLlByaW50KHZhcnMsICIkYWJjZGVmZyRcbkEgbGl0ZXJhbCBkb2xsYXIgc2lnbjogICQkIik7CisKKyAgICAgIHZhcnNbImZvbyJdID0gImJsYWgiOworICAgICAgcHJpbnRlci5QcmludCh2YXJzLCAiXG5Ob3cgZm9vID0gJGZvbyQuIik7CisKKyAgICAgIEVYUEVDVF9GQUxTRShwcmludGVyLmZhaWxlZCgpKTsKKyAgICB9CisKKyAgICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisKKyAgICBFWFBFQ1RfU1RSRVEoIkhlbGxvIFdvcmxkIVxuIgorICAgICAgICAgICAgICAgICAiYmFyID0gJGZvbyRcbiIKKyAgICAgICAgICAgICAgICAgIlJhd0JpdFxuIgorICAgICAgICAgICAgICAgICAiMTIzNFxuIgorICAgICAgICAgICAgICAgICAiQSBsaXRlcmFsIGRvbGxhciBzaWduOiAgJFxuIgorICAgICAgICAgICAgICAgICAiTm93IGZvbyA9IGJsYWguIiwKKyAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKyAgfQorfQorCitURVNUKFByaW50ZXIsIElubGluZVZhcmlhYmxlU3Vic3RpdHV0aW9uKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgcHJpbnRlci5QcmludCgiSGVsbG8gJGZvbyQhXG4iLCAiZm9vIiwgIldvcmxkIik7CisgICAgcHJpbnRlci5QcmludFJhdygiUmF3Qml0XG4iKTsKKyAgICBwcmludGVyLlByaW50KCIkZm9vJCAkYmFyJFxuIiwgImZvbyIsICJvbmUiLCAiYmFyIiwgInR3byIpOworICAgIEVYUEVDVF9GQUxTRShwcmludGVyLmZhaWxlZCgpKTsKKyAgfQorCisgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKKworICBFWFBFQ1RfU1RSRVEoIkhlbGxvIFdvcmxkIVxuIgorICAgICAgICAgICAgICAgIlJhd0JpdFxuIgorICAgICAgICAgICAgICAgIm9uZSB0d29cbiIsCisgICAgICAgICAgICAgICBidWZmZXIpOworfQorCitURVNUKFByaW50ZXIsIEluZGVudGluZykgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKworICBmb3IgKGludCBibG9ja19zaXplID0gMTsgYmxvY2tfc2l6ZSA8IDUxMjsgYmxvY2tfc2l6ZSAqPSAyKSB7CisgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGJsb2NrX3NpemUpOworCisgICAgeworICAgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisKKyAgICAgIHZhcnNbIm5ld2xpbmUiXSA9ICJcbiI7CisKKyAgICAgIHByaW50ZXIuUHJpbnQoIlRoaXMgaXMgbm90IGluZGVudGVkLlxuIik7CisgICAgICBwcmludGVyLkluZGVudCgpOworICAgICAgcHJpbnRlci5QcmludCgiVGhpcyBpcyBpbmRlbnRlZFxuQW5kIHNvIGlzIHRoaXNcbiIpOworICAgICAgcHJpbnRlci5PdXRkZW50KCk7CisgICAgICBwcmludGVyLlByaW50KCJCdXQgdGhpcyBpcyBub3QuIik7CisgICAgICBwcmludGVyLkluZGVudCgpOworICAgICAgcHJpbnRlci5QcmludCgiICBBbmQgdGhpcyBpcyBzdGlsbCB0aGUgc2FtZSBsaW5lLlxuIgorICAgICAgICAgICAgICAgICAgICAiQnV0IHRoaXMgaXMgaW5kZW50ZWQuXG4iKTsKKyAgICAgIHByaW50ZXIuUHJpbnRSYXcoIlJhd0JpdCBoYXMgaW5kZW50IGF0IHN0YXJ0XG4iKTsKKyAgICAgIHByaW50ZXIuUHJpbnRSYXcoImJ1dCBub3QgYWZ0ZXIgYSByYXcgbmV3bGluZVxuIik7CisgICAgICBwcmludGVyLlByaW50KHZhcnMsICJOb3RlIHRoYXQgYSBuZXdsaW5lIGluIGEgdmFyaWFibGUgd2lsbCBicmVhayAiCisgICAgICAgICAgICAgICAgICAgICJpbmRlbnRpbmcsIGFzIHdlIHNlZSRuZXdsaW5lJGhlcmUuXG4iKTsKKyAgICAgIHByaW50ZXIuSW5kZW50KCk7CisgICAgICBwcmludGVyLlByaW50KCJBbmQgdGhpcyIpOworICAgICAgcHJpbnRlci5PdXRkZW50KCk7CisgICAgICBwcmludGVyLk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXIuUHJpbnQoIiBpcyBkb3VibGUtaW5kZW50ZWRcbkJhY2sgdG8gbm9ybWFsLiIpOworCisgICAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisgICAgfQorCisgICAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworCisgICAgRVhQRUNUX1NUUkVRKAorICAgICAgIlRoaXMgaXMgbm90IGluZGVudGVkLlxuIgorICAgICAgIiAgVGhpcyBpcyBpbmRlbnRlZFxuIgorICAgICAgIiAgQW5kIHNvIGlzIHRoaXNcbiIKKyAgICAgICJCdXQgdGhpcyBpcyBub3QuICBBbmQgdGhpcyBpcyBzdGlsbCB0aGUgc2FtZSBsaW5lLlxuIgorICAgICAgIiAgQnV0IHRoaXMgaXMgaW5kZW50ZWQuXG4iCisgICAgICAiICBSYXdCaXQgaGFzIGluZGVudCBhdCBzdGFydFxuIgorICAgICAgImJ1dCBub3QgYWZ0ZXIgYSByYXcgbmV3bGluZVxuIgorICAgICAgIk5vdGUgdGhhdCBhIG5ld2xpbmUgaW4gYSB2YXJpYWJsZSB3aWxsIGJyZWFrIGluZGVudGluZywgYXMgd2Ugc2VlXG4iCisgICAgICAiaGVyZS5cbiIKKyAgICAgICIgICAgQW5kIHRoaXMgaXMgZG91YmxlLWluZGVudGVkXG4iCisgICAgICAiQmFjayB0byBub3JtYWwuIiwKKyAgICAgIGJ1ZmZlcik7CisgIH0KK30KKworLy8gRGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyBhcyBvZiB5ZXQuCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKK1RFU1QoUHJpbnRlciwgRGVhdGgpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKworICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5QcmludCgiJG5vc3VjaHZhciQiKSwgIlVuZGVmaW5lZCB2YXJpYWJsZSIpOworICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5QcmludCgiJHVuY2xvc2VkIiksICJVbmNsb3NlZCB2YXJpYWJsZSBuYW1lIik7CisgIEVYUEVDVF9ERUJVR19ERUFUSChwcmludGVyLk91dGRlbnQoKSwgIndpdGhvdXQgbWF0Y2hpbmcgSW5kZW50Iik7Cit9CisjZW5kaWYgIC8vIFBST1RPQlVGX19IQVNfREVBVEhfVEVTVAorCitURVNUKFByaW50ZXIsIFdyaXRlRmFpbHVyZVBhcnRpYWwpIHsKKyAgY2hhciBidWZmZXJbMTddOworCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisKKyAgLy8gUHJpbnQgMTYgYnl0ZXMgdG8gYWxtb3N0IGZpbGwgdGhlIGJ1ZmZlciAoc2hvdWxkIG5vdCBmYWlsKS4KKyAgcHJpbnRlci5QcmludCgiMDEyMzQ1Njc4OWFiY2RlZiIpOworICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisKKyAgLy8gVHJ5IHRvIHByaW50IDIgY2hhcnMuIE9ubHkgb25lIGZpdHMuCisgIHByaW50ZXIuUHJpbnQoIjw+Iik7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGZhaWwgdG9vLgorICBwcmludGVyLlByaW50KCIgIik7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuZmFpbGVkKCkpOworICBwcmludGVyLlByaW50KCJibGFoIik7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIEJ1ZmZlciBzaG91bGQgY29udGFpbiB0aGUgZmlyc3QgMTcgYnl0ZXMgd3JpdHRlbi4KKyAgRVhQRUNUX0VRKCIwMTIzNDU2Nzg5YWJjZGVmPCIsIHN0cmluZyhidWZmZXIsIHNpemVvZihidWZmZXIpKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgV3JpdGVGYWlsdXJlRXhhY3QpIHsKKyAgY2hhciBidWZmZXJbMTZdOworCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisKKyAgLy8gUHJpbnQgMTYgYnl0ZXMgdG8gZmlsbCB0aGUgYnVmZmVyIGV4YWN0bHkgKHNob3VsZCBub3QgZmFpbCkuCisgIHByaW50ZXIuUHJpbnQoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIFRyeSB0byBwcmludCBvbmUgbW9yZSBieXRlIChzaG91bGQgZmFpbCkuCisgIHByaW50ZXIuUHJpbnQoIiAiKTsKKyAgRVhQRUNUX1RSVUUocHJpbnRlci5mYWlsZWQoKSk7CisKKyAgLy8gU2hvdWxkIG5vdCBjcmFzaAorICBwcmludGVyLlByaW50KCJibGFoIik7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIEJ1ZmZlciBzaG91bGQgY29udGFpbiB0aGUgZmlyc3QgMTYgYnl0ZXMgd3JpdHRlbi4KKyAgRVhQRUNUX0VRKCIwMTIzNDU2Nzg5YWJjZGVmIiwgc3RyaW5nKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyMmI3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MKQEAgLTAsMCArMSwxMDkxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBIZXJlIHdlIGhhdmUgYSBoYW5kLXdyaXR0ZW4gbGV4ZXIuICBBdCBmaXJzdCB5b3UgbWlnaHQgYXNrIHlvdXJzZWxmLAorLy8gIkhhbmQtd3JpdHRlbiB0ZXh0IHByb2Nlc3Npbmc/ICBJcyBLZW50b24gY3Jhenk/ISIgIFdlbGwsIGZpcnN0IG9mIGFsbCwKKy8vIHllcyBJIGFtIGNyYXp5LCBidXQgdGhhdCdzIGJlc2lkZSB0aGUgcG9pbnQuICBUaGVyZSBhcmUgYWN0dWFsbHkgcmVhc29ucworLy8gd2h5IEkgZW5kZWQgdXAgd3JpdGluZyB0aGlzIHRoaXMgd2F5LgorLy8KKy8vIFRoZSB0cmFkaXRpb25hbCBhcHByb2FjaCB0byBsZXhpbmcgaXMgdG8gdXNlIGxleCB0byBnZW5lcmF0ZSBhIGxleGVyIGZvcgorLy8geW91LiAgVW5mb3J0dW5hdGVseSwgbGV4J3Mgb3V0cHV0IGlzIHJpZGljdWxvdXNseSB1Z2x5IGFuZCBkaWZmaWN1bHQgdG8KKy8vIGludGVncmF0ZSBjbGVhbmx5IHdpdGggQysrIGNvZGUsIGVzcGVjaWFsbHkgYWJzdHJhY3QgY29kZSBvciBjb2RlIG1lYW50CisvLyBhcyBhIGxpYnJhcnkuICBCZXR0ZXIgcGFyc2VyLWdlbmVyYXRvcnMgZXhpc3QgYnV0IHdvdWxkIGFkZCBkZXBlbmRlbmNpZXMKKy8vIHdoaWNoIG1vc3QgdXNlcnMgd29uJ3QgYWxyZWFkeSBoYXZlLCB3aGljaCB3ZSdkIGxpa2UgdG8gYXZvaWQuICAoR05VIGZsZXgKKy8vIGhhcyBhIEMrKyBvdXRwdXQgb3B0aW9uLCBidXQgaXQncyBzdGlsbCByaWRpY3Vsb3VzbHkgdWdseSwgbm9uLWFic3RyYWN0LAorLy8gYW5kIG5vdCBsaWJyYXJ5LWZyaWVuZGx5LikKKy8vCisvLyBUaGUgbmV4dCBhcHByb2FjaCB0aGF0IGFueSBnb29kIHNvZnR3YXJlIGVuZ2luZWVyIHNob3VsZCBsb29rIGF0IGlzIHRvCisvLyB1c2UgcmVndWxhciBleHByZXNzaW9ucy4gIEFuZCwgaW5kZWVkLCBJIGRpZC4gIEkgaGF2ZSBjb2RlIHdoaWNoCisvLyBpbXBsZW1lbnRzIHRoaXMgc2FtZSBjbGFzcyB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zLiAgSXQncyBhYm91dCAyMDAKKy8vIGxpbmVzIHNob3J0ZXIuICBIb3dldmVyOgorLy8gLSBSYXRoZXIgdGhhbiBlcnJvciBtZXNzYWdlcyB0ZWxsaW5nIHlvdSAiVGhpcyBzdHJpbmcgaGFzIGFuIGludmFsaWQKKy8vICAgZXNjYXBlIHNlcXVlbmNlIGF0IGxpbmUgNSwgY29sdW1uIDQ1IiwgeW91IGdldCBlcnJvciBtZXNzYWdlcyBsaWtlCisvLyAgICJQYXJzZSBlcnJvciBvbiBsaW5lIDUiLiAgR2l2aW5nIG1vcmUgcHJlY2lzZSBlcnJvcnMgcmVxdWlyZXMgYWRkaW5nCisvLyAgIGEgbG90IG9mIGNvZGUgdGhhdCBlbmRzIHVwIGJhc2ljYWxseSBhcyBjb21wbGV4IGFzIHRoZSBoYW5kLWNvZGVkCisvLyAgIHZlcnNpb24gYW55d2F5LgorLy8gLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGEgc3RyaW5nIGxpdGVyYWwgbG9va3MgbGlrZSB0aGlzOgorLy8gICAgIGtTdHJpbmcgID0gbmV3IFJFKCIoXCIoW15cIlxcXFxdfCIgICAgICAgICAgICAgIC8vIG5vbi1lc2NhcGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgIlxcXFxbYWJmbnJ0dj9cIidcXFxcMC03XXwiICAgLy8gbm9ybWFsIGVzY2FwZQorLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxceFswLTlhLWZBLUZdKSpcInwiICAgICAgIC8vIGhleCBlc2NhcGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAiXCcoW15cJ1xcXFxdfCIgICAgICAgIC8vIEFsc28gc3VwcG9ydCBzaW5nbGUtcXVvdGVzLgorLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxcW2FiZm5ydHY/XCInXFxcXDAtN118IgorLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxceFswLTlhLWZBLUZdKSpcJykiKTsKKy8vICAgVmVyaWZ5aW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGlzIGxpbmUgbm9pc2UgaXMgYWN0dWFsbHkgaGFyZGVyIHRoYW4KKy8vICAgdmVyaWZ5aW5nIHRoZSBjb3JyZWN0bmVzcyBvZiBDb25zdW1lU3RyaW5nKCksIGRlZmluZWQgYmVsb3cuICBJJ20gbm90CisvLyAgIGV2ZW4gY29uZmlkZW50IHRoYXQgdGhlIGFib3ZlIGlzIGNvcnJlY3QsIGFmdGVyIHN0YXJpbmcgYXQgaXQgZm9yIHNvbWUKKy8vICAgdGltZS4KKy8vIC0gUENSRSBpcyBmYXN0LCBidXQgdGhlcmUncyBzdGlsbCBtb3JlIG92ZXJoZWFkIGludm9sdmVkIHRoYW4gdGhlIGNvZGUKKy8vICAgYmVsb3cuCisvLyAtIFNhZGx5LCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3QgcGFydCBvZiB0aGUgQyBzdGFuZGFyZCBsaWJyYXJ5LCBzbworLy8gICB1c2luZyB0aGVtIHdvdWxkIHJlcXVpcmUgZGVwZW5kaW5nIG9uIHNvbWUgb3RoZXIgbGlicmFyeS4gIEZvciB0aGUKKy8vICAgb3BlbiBzb3VyY2UgcmVsZWFzZSwgdGhpcyBjb3VsZCBiZSByZWFsbHkgYW5ub3lpbmcuICBOb2JvZHkgbGlrZXMKKy8vICAgZG93bmxvYWRpbmcgb25lIHBpZWNlIG9mIHNvZnR3YXJlIGp1c3QgdG8gZmluZCB0aGF0IHRoZXkgbmVlZCB0bworLy8gICBkb3dubG9hZCBzb21ldGhpbmcgZWxzZSB0byBtYWtlIGl0IHdvcmssIGFuZCBpbiBhbGwgbGlrZWxpaG9vZAorLy8gICBwZW9wbGUgZG93bmxvYWRpbmcgUHJvdG9jb2wgQnVmZmVycyB3aWxsIGFscmVhZHkgYmUgZG9pbmcgc28ganVzdAorLy8gICB0byBtYWtlIHNvbWV0aGluZyBlbHNlIHdvcmsuICBXZSBjb3VsZCBpbmNsdWRlIGEgY29weSBvZiBQQ1JFIHdpdGgKKy8vICAgb3VyIGNvZGUsIGJ1dCB0aGF0IG9ibGlnYXRlcyB1cyB0byBrZWVwIGl0IHVwLXRvLWRhdGUgYW5kIGp1c3Qgc2VlbXMKKy8vICAgbGlrZSBhIGJpZyB3YXN0ZSBqdXN0IHRvIHNhdmUgMjAwIGxpbmVzIG9mIGNvZGUuCisvLworLy8gT24gYSBzaW1pbGFyIGJ1dCB1bnJlbGF0ZWQgbm90ZSwgSSdtIGV2ZW4gc2NhcmVkIHRvIHVzZSBjdHlwZS5oLgorLy8gQXBwYXJlbnRseSBmdW5jdGlvbnMgbGlrZSBpc2FscGhhKCkgYXJlIGxvY2FsZS1kZXBlbmRlbnQuICBTbywgaWYgd2UgdXNlZAorLy8gdGhhdCwgdGhlbiBpZiB0aGlzIGNvZGUgaXMgYmVpbmcgY2FsbGVkIGZyb20gc29tZSBwcm9ncmFtIHRoYXQgZG9lc24ndAorLy8gaGF2ZSBpdHMgbG9jYWxlIHNldCB0byAiQyIsIGl0IHdvdWxkIGJlaGF2ZSBzdHJhbmdlbHkuICBXZSBjYW4ndCBqdXN0IHNldAorLy8gdGhlIGxvY2FsZSB0byAiQyIgb3Vyc2VsdmVzIHNpbmNlIHdlIG1pZ2h0IGJyZWFrIHRoZSBjYWxsaW5nIHByb2dyYW0gdGhhdAorLy8gd2F5LCBwYXJ0aWN1bGFybHkgaWYgaXQgaXMgbXVsdGktdGhyZWFkZWQuICBXVEY/ICBTb21lb25lIHBsZWFzZSBsZXQgbWUKKy8vIChLZW50b24pIGtub3cgaWYgSSdtIG1pc3Npbmcgc29tZXRoaW5nIGhlcmUuLi4KKy8vCisvLyBJJ2QgbG92ZSB0byBoZWFyIGFib3V0IG90aGVyIGFsdGVybmF0aXZlcywgdGhvdWdoLCBhcyB0aGlzIGNvZGUgaXNuJ3QKKy8vIGV4YWN0bHkgcHJldHR5LgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworbmFtZXNwYWNlIHsKKworLy8gQXMgbWVudGlvbmVkIGFib3ZlLCBJIGRvbid0IHRydXN0IGN0eXBlLmggZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiAibG9jYWxlcyIuCisvLyBTbywgSSBoYXZlIHdyaXR0ZW4gcmVwbGFjZW1lbnQgZnVuY3Rpb25zIGhlcmUuICBTb21lb25lIHBsZWFzZSBzbWFjayBtZSBpZgorLy8gdGhpcyBpcyBhIGJhZCBpZGVhIG9yIGlmIHRoZXJlIGlzIHNvbWUgd2F5IGFyb3VuZCB0aGlzLgorLy8KKy8vIFRoZXNlICJjaGFyYWN0ZXIgY2xhc3NlcyIgYXJlIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gdGVtcGxhdGUgbWV0aG9kcy4KKy8vIEZvciBpbnN0YW5jZSwgVG9rZW5pemVyOjpDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlPigpIHdpbGwgZWF0CisvLyB3aGl0ZXNwYWNlLgorCisvLyBOb3RlOiAgTm8gY2xhc3MgaXMgYWxsb3dlZCB0byBjb250YWluICdcMCcsIHNpbmNlIHRoaXMgaXMgdXNlZCB0byBtYXJrIGVuZC0KKy8vICAgb2YtaW5wdXQgYW5kIGlzIGhhbmRsZWQgc3BlY2lhbGx5LgorCisjZGVmaW5lIENIQVJBQ1RFUl9DTEFTUyhOQU1FLCBFWFBSRVNTSU9OKSAgICAgIFwKKyAgY2xhc3MgTkFNRSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBib29sIEluQ2xhc3MoY2hhciBjKSB7ICAgICAgIFwKKyAgICAgIHJldHVybiBFWFBSRVNTSU9OOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworQ0hBUkFDVEVSX0NMQVNTKFdoaXRlc3BhY2UsIGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcdCcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID09ICdccicgfHwgYyA9PSAnXHYnIHx8IGMgPT0gJ1xmJyk7CitDSEFSQUNURVJfQ0xBU1MoV2hpdGVzcGFjZU5vTmV3bGluZSwgYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnXHInIHx8IGMgPT0gJ1x2JyB8fCBjID09ICdcZicpOworCitDSEFSQUNURVJfQ0xBU1MoVW5wcmludGFibGUsIGMgPCAnICcgJiYgYyA+ICdcMCcpOworCitDSEFSQUNURVJfQ0xBU1MoRGlnaXQsICcwJyA8PSBjICYmIGMgPD0gJzknKTsKK0NIQVJBQ1RFUl9DTEFTUyhPY3RhbERpZ2l0LCAnMCcgPD0gYyAmJiBjIDw9ICc3Jyk7CitDSEFSQUNURVJfQ0xBU1MoSGV4RGlnaXQsICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhJyA8PSBjICYmIGMgPD0gJ2YnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnRicpKTsKKworQ0hBUkFDVEVSX0NMQVNTKExldHRlciwgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGMgPT0gJ18nKSk7CisKK0NIQVJBQ1RFUl9DTEFTUyhBbHBoYW51bWVyaWMsICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjID09ICdfJykpOworCitDSEFSQUNURVJfQ0xBU1MoRXNjYXBlLCBjID09ICdhJyB8fCBjID09ICdiJyB8fCBjID09ICdmJyB8fCBjID09ICduJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAncicgfHwgYyA9PSAndCcgfHwgYyA9PSAndicgfHwgYyA9PSAnXFwnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjID09ICc/JyB8fCBjID09ICdcJycgfHwgYyA9PSAnXCInKTsKKworI3VuZGVmIENIQVJBQ1RFUl9DTEFTUworCisvLyBHaXZlbiBhIGNoYXIsIGludGVycHJldCBpdCBhcyBhIG51bWVyaWMgZGlnaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCisvLyBUaGlzIHN1cHBvcnRzIGFueSBudW1iZXIgYmFzZSB1cCB0byAzNi4KK2lubGluZSBpbnQgRGlnaXRWYWx1ZShjaGFyIGRpZ2l0KSB7CisgIGlmICgnMCcgPD0gZGlnaXQgJiYgZGlnaXQgPD0gJzknKSByZXR1cm4gZGlnaXQgLSAnMCc7CisgIGlmICgnYScgPD0gZGlnaXQgJiYgZGlnaXQgPD0gJ3onKSByZXR1cm4gZGlnaXQgLSAnYScgKyAxMDsKKyAgaWYgKCdBJyA8PSBkaWdpdCAmJiBkaWdpdCA8PSAnWicpIHJldHVybiBkaWdpdCAtICdBJyArIDEwOworICByZXR1cm4gLTE7Cit9CisKKy8vIElubGluZSBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGluIG9uZSBwbGFjZS4KK2lubGluZSBjaGFyIFRyYW5zbGF0ZUVzY2FwZShjaGFyIGMpIHsKKyAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAnYSc6ICByZXR1cm4gJ1xhJzsKKyAgICBjYXNlICdiJzogIHJldHVybiAnXGInOworICAgIGNhc2UgJ2YnOiAgcmV0dXJuICdcZic7CisgICAgY2FzZSAnbic6ICByZXR1cm4gJ1xuJzsKKyAgICBjYXNlICdyJzogIHJldHVybiAnXHInOworICAgIGNhc2UgJ3QnOiAgcmV0dXJuICdcdCc7CisgICAgY2FzZSAndic6ICByZXR1cm4gJ1x2JzsKKyAgICBjYXNlICdcXCc6IHJldHVybiAnXFwnOworICAgIGNhc2UgJz8nOiAgcmV0dXJuICdcPyc7ICAgIC8vIFRyaWdyYXBocyA9IDooCisgICAgY2FzZSAnXCcnOiByZXR1cm4gJ1wnJzsKKyAgICBjYXNlICciJzogIHJldHVybiAnXCInOworCisgICAgLy8gV2UgZXhwZWN0IGVzY2FwZSBzZXF1ZW5jZXMgdG8gaGF2ZSBiZWVuIHZhbGlkYXRlZCBzZXBhcmF0ZWx5LgorICAgIGRlZmF1bHQ6ICAgcmV0dXJuICc/JzsKKyAgfQorfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK0Vycm9yQ29sbGVjdG9yOjp+RXJyb3JDb2xsZWN0b3IoKSB7fQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1Rva2VuaXplcjo6VG9rZW5pemVyKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikKKyAgOiBpbnB1dF8oaW5wdXQpLAorICAgIGVycm9yX2NvbGxlY3Rvcl8oZXJyb3JfY29sbGVjdG9yKSwKKyAgICBidWZmZXJfKE5VTEwpLAorICAgIGJ1ZmZlcl9zaXplXygwKSwKKyAgICBidWZmZXJfcG9zXygwKSwKKyAgICByZWFkX2Vycm9yXyhmYWxzZSksCisgICAgbGluZV8oMCksCisgICAgY29sdW1uXygwKSwKKyAgICByZWNvcmRfdGFyZ2V0XyhOVUxMKSwKKyAgICByZWNvcmRfc3RhcnRfKC0xKSwKKyAgICBhbGxvd19mX2FmdGVyX2Zsb2F0XyhmYWxzZSksCisgICAgY29tbWVudF9zdHlsZV8oQ1BQX0NPTU1FTlRfU1RZTEUpIHsKKworICBjdXJyZW50Xy5saW5lID0gMDsKKyAgY3VycmVudF8uY29sdW1uID0gMDsKKyAgY3VycmVudF8uZW5kX2NvbHVtbiA9IDA7CisgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUQVJUOworCisgIFJlZnJlc2goKTsKK30KKworVG9rZW5pemVyOjp+VG9rZW5pemVyKCkgeworICAvLyBJZiB3ZSBoYWQgYW55IGJ1ZmZlciBsZWZ0IHVucmVhZCwgcmV0dXJuIGl0IHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbQorICAvLyBzbyB0aGF0IHNvbWVvbmUgZWxzZSBjYW4gcmVhZCBpdC4KKyAgaWYgKGJ1ZmZlcl9zaXplXyA+IGJ1ZmZlcl9wb3NfKSB7CisgICAgaW5wdXRfLT5CYWNrVXAoYnVmZmVyX3NpemVfIC0gYnVmZmVyX3Bvc18pOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIGhlbHBlcnMuCisKK3ZvaWQgVG9rZW5pemVyOjpOZXh0Q2hhcigpIHsKKyAgLy8gVXBkYXRlIG91ciBsaW5lIGFuZCBjb2x1bW4gY291bnRlcnMgYmFzZWQgb24gdGhlIGNoYXJhY3RlciBiZWluZworICAvLyBjb25zdW1lZC4KKyAgaWYgKGN1cnJlbnRfY2hhcl8gPT0gJ1xuJykgeworICAgICsrbGluZV87CisgICAgY29sdW1uXyA9IDA7CisgIH0gZWxzZSBpZiAoY3VycmVudF9jaGFyXyA9PSAnXHQnKSB7CisgICAgY29sdW1uXyArPSBrVGFiV2lkdGggLSBjb2x1bW5fICUga1RhYldpZHRoOworICB9IGVsc2UgeworICAgICsrY29sdW1uXzsKKyAgfQorCisgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyLgorICArK2J1ZmZlcl9wb3NfOworICBpZiAoYnVmZmVyX3Bvc18gPCBidWZmZXJfc2l6ZV8pIHsKKyAgICBjdXJyZW50X2NoYXJfID0gYnVmZmVyX1tidWZmZXJfcG9zX107CisgIH0gZWxzZSB7CisgICAgUmVmcmVzaCgpOworICB9Cit9CisKK3ZvaWQgVG9rZW5pemVyOjpSZWZyZXNoKCkgeworICBpZiAocmVhZF9lcnJvcl8pIHsKKyAgICBjdXJyZW50X2NoYXJfID0gJ1wwJzsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiB3ZSdyZSBpbiBhIHRva2VuLCBhcHBlbmQgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciB0byBpdC4KKyAgaWYgKHJlY29yZF90YXJnZXRfICE9IE5VTEwgJiYgcmVjb3JkX3N0YXJ0XyA8IGJ1ZmZlcl9zaXplXykgeworICAgIHJlY29yZF90YXJnZXRfLT5hcHBlbmQoYnVmZmVyXyArIHJlY29yZF9zdGFydF8sIGJ1ZmZlcl9zaXplXyAtIHJlY29yZF9zdGFydF8pOworICAgIHJlY29yZF9zdGFydF8gPSAwOworICB9CisKKyAgY29uc3Qgdm9pZCogZGF0YSA9IE5VTEw7CisgIGJ1ZmZlcl8gPSBOVUxMOworICBidWZmZXJfcG9zXyA9IDA7CisgIGRvIHsKKyAgICBpZiAoIWlucHV0Xy0+TmV4dCgmZGF0YSwgJmJ1ZmZlcl9zaXplXykpIHsKKyAgICAgIC8vIGVuZCBvZiBzdHJlYW0gKG9yIHJlYWQgZXJyb3IpCisgICAgICBidWZmZXJfc2l6ZV8gPSAwOworICAgICAgcmVhZF9lcnJvcl8gPSB0cnVlOworICAgICAgY3VycmVudF9jaGFyXyA9ICdcMCc7CisgICAgICByZXR1cm47CisgICAgfQorICB9IHdoaWxlIChidWZmZXJfc2l6ZV8gPT0gMCk7CisKKyAgYnVmZmVyXyA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKTsKKworICBjdXJyZW50X2NoYXJfID0gYnVmZmVyX1swXTsKK30KKworaW5saW5lIHZvaWQgVG9rZW5pemVyOjpSZWNvcmRUbyhzdHJpbmcqIHRhcmdldCkgeworICByZWNvcmRfdGFyZ2V0XyA9IHRhcmdldDsKKyAgcmVjb3JkX3N0YXJ0XyA9IGJ1ZmZlcl9wb3NfOworfQorCitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OlN0b3BSZWNvcmRpbmcoKSB7CisgIC8vIE5vdGU6ICBUaGUgaWYoKSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIFNUTCBpbXBsZW1lbnRhdGlvbnMgY3Jhc2ggd2hlbgorICAvLyAgIHlvdSBjYWxsIHN0cmluZzo6YXBwZW5kKE5VTEwsIDApLCBwcmVzdW1hYmx5IGJlY2F1c2UgdGhleSBhcmUgdHJ5aW5nIHRvCisgIC8vICAgYmUgaGVscGZ1bCBieSBkZXRlY3RpbmcgdGhlIE5VTEwgcG9pbnRlciwgZXZlbiB0aG91Z2ggdGhlcmUncyBub3RoaW5nCisgIC8vICAgd3Jvbmcgd2l0aCByZWFkaW5nIHplcm8gYnl0ZXMgZnJvbSBOVUxMLgorICBpZiAoYnVmZmVyX3Bvc18gIT0gcmVjb3JkX3N0YXJ0XykgeworICAgIHJlY29yZF90YXJnZXRfLT5hcHBlbmQoYnVmZmVyXyArIHJlY29yZF9zdGFydF8sIGJ1ZmZlcl9wb3NfIC0gcmVjb3JkX3N0YXJ0Xyk7CisgIH0KKyAgcmVjb3JkX3RhcmdldF8gPSBOVUxMOworICByZWNvcmRfc3RhcnRfID0gLTE7Cit9CisKK2lubGluZSB2b2lkIFRva2VuaXplcjo6U3RhcnRUb2tlbigpIHsKKyAgY3VycmVudF8udHlwZSA9IFRZUEVfU1RBUlQ7ICAgIC8vIEp1c3QgZm9yIHRoZSBzYWtlIG9mIGluaXRpYWxpemluZyBpdC4KKyAgY3VycmVudF8udGV4dC5jbGVhcigpOworICBjdXJyZW50Xy5saW5lID0gbGluZV87CisgIGN1cnJlbnRfLmNvbHVtbiA9IGNvbHVtbl87CisgIFJlY29yZFRvKCZjdXJyZW50Xy50ZXh0KTsKK30KKworaW5saW5lIHZvaWQgVG9rZW5pemVyOjpFbmRUb2tlbigpIHsKKyAgU3RvcFJlY29yZGluZygpOworICBjdXJyZW50Xy5lbmRfY29sdW1uID0gY29sdW1uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIG1ldGhvZHMgdGhhdCBjb25zdW1lIGNoYXJhY3RlcnMuCisKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgoraW5saW5lIGJvb2wgVG9rZW5pemVyOjpMb29raW5nQXQoKSB7CisgIHJldHVybiBDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhjdXJyZW50X2NoYXJfKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+CitpbmxpbmUgYm9vbCBUb2tlbml6ZXI6OlRyeUNvbnN1bWVPbmUoKSB7CisgIGlmIChDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhjdXJyZW50X2NoYXJfKSkgeworICAgIE5leHRDaGFyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2lubGluZSBib29sIFRva2VuaXplcjo6VHJ5Q29uc3VtZShjaGFyIGMpIHsKKyAgaWYgKGN1cnJlbnRfY2hhcl8gPT0gYykgeworICAgIE5leHRDaGFyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgoraW5saW5lIHZvaWQgVG9rZW5pemVyOjpDb25zdW1lWmVyb09yTW9yZSgpIHsKKyAgd2hpbGUgKENoYXJhY3RlckNsYXNzOjpJbkNsYXNzKGN1cnJlbnRfY2hhcl8pKSB7CisgICAgTmV4dENoYXIoKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KK2lubGluZSB2b2lkIFRva2VuaXplcjo6Q29uc3VtZU9uZU9yTW9yZShjb25zdCBjaGFyKiBlcnJvcikgeworICBpZiAoIUNoYXJhY3RlckNsYXNzOjpJbkNsYXNzKGN1cnJlbnRfY2hhcl8pKSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIE5leHRDaGFyKCk7CisgICAgfSB3aGlsZSAoQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXykpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldGhvZHMgdGhhdCByZWFkIHdob2xlIHBhdHRlcm5zIG1hdGNoaW5nIGNlcnRhaW4ga2luZHMgb2YgdG9rZW5zCisvLyBvciBjb21tZW50cy4KKwordm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVTdHJpbmcoY2hhciBkZWxpbWl0ZXIpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzd2l0Y2ggKGN1cnJlbnRfY2hhcl8pIHsKKyAgICAgIGNhc2UgJ1wwJzoKKyAgICAgIGNhc2UgJ1xuJzogeworICAgICAgICBBZGRFcnJvcigiU3RyaW5nIGxpdGVyYWxzIGNhbm5vdCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY2FzZSAnXFwnOiB7CisgICAgICAgIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgICAgTmV4dENoYXIoKTsKKyAgICAgICAgaWYgKFRyeUNvbnN1bWVPbmU8RXNjYXBlPigpKSB7CisgICAgICAgICAgLy8gVmFsaWQgZXNjYXBlIHNlcXVlbmNlLgorICAgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWVPbmU8T2N0YWxEaWdpdD4oKSkgeworICAgICAgICAgIC8vIFBvc3NpYmx5IGZvbGxvd2VkIGJ5IHR3byBtb3JlIG9jdGFsIGRpZ2l0cywgYnV0IHRoZXNlIHdpbGwKKyAgICAgICAgICAvLyBqdXN0IGJlIGNvbnN1bWVkIGJ5IHRoZSBtYWluIGxvb3AgYW55d2F5IHNvIHdlIGRvbid0IG5lZWQKKyAgICAgICAgICAvLyB0byBkbyBzbyBleHBsaWNpdGx5IGhlcmUuCisgICAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgneCcpIHx8IFRyeUNvbnN1bWUoJ1gnKSkgeworICAgICAgICAgIGlmICghVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSkgeworICAgICAgICAgICAgQWRkRXJyb3IoIkV4cGVjdGVkIGhleCBkaWdpdHMgZm9yIGVzY2FwZSBzZXF1ZW5jZS4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gUG9zc2libHkgZm9sbG93ZWQgYnkgYW5vdGhlciBoZXggZGlnaXQsIGJ1dCBhZ2FpbiB3ZSBkb24ndCBjYXJlLgorICAgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ3UnKSkgeworICAgICAgICAgIGlmICghVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSkgeworICAgICAgICAgICAgQWRkRXJyb3IoIkV4cGVjdGVkIGZvdXIgaGV4IGRpZ2l0cyBmb3IgXFx1IGVzY2FwZSBzZXF1ZW5jZS4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgnVScpKSB7CisgICAgICAgICAgLy8gV2UgZXhwZWN0IDggaGV4IGRpZ2l0czsgYnV0IG9ubHkgdGhlIHJhbmdlIHVwIHRvIDB4MTBmZmZmIGlzCisgICAgICAgICAgLy8gbGVnYWwuCisgICAgICAgICAgaWYgKCFUcnlDb25zdW1lKCcwJykgfHwKKyAgICAgICAgICAgICAgIVRyeUNvbnN1bWUoJzAnKSB8fAorICAgICAgICAgICAgICAhKFRyeUNvbnN1bWUoJzAnKSB8fCBUcnlDb25zdW1lKCcxJykpIHx8CisgICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpIHx8CisgICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpIHx8CisgICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpIHx8CisgICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpIHx8CisgICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpKSB7CisgICAgICAgICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgZWlnaHQgaGV4IGRpZ2l0cyB1cCB0byAxMGZmZmYgZm9yIFxcVSBlc2NhcGUgIgorICAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZEVycm9yKCJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpbiBzdHJpbmcgbGl0ZXJhbC4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgICBpZiAoY3VycmVudF9jaGFyXyA9PSBkZWxpbWl0ZXIpIHsKKyAgICAgICAgICBOZXh0Q2hhcigpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBOZXh0Q2hhcigpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworVG9rZW5pemVyOjpUb2tlblR5cGUgVG9rZW5pemVyOjpDb25zdW1lTnVtYmVyKGJvb2wgc3RhcnRlZF93aXRoX3plcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGVkX3dpdGhfZG90KSB7CisgIGJvb2wgaXNfZmxvYXQgPSBmYWxzZTsKKworICBpZiAoc3RhcnRlZF93aXRoX3plcm8gJiYgKFRyeUNvbnN1bWUoJ3gnKSB8fCBUcnlDb25zdW1lKCdYJykpKSB7CisgICAgLy8gQSBoZXggbnVtYmVyIChzdGFydGVkIHdpdGggIjB4IikuCisgICAgQ29uc3VtZU9uZU9yTW9yZTxIZXhEaWdpdD4oIlwiMHhcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGhleCBkaWdpdHMuIik7CisKKyAgfSBlbHNlIGlmIChzdGFydGVkX3dpdGhfemVybyAmJiBMb29raW5nQXQ8RGlnaXQ+KCkpIHsKKyAgICAvLyBBbiBvY3RhbCBudW1iZXIgKGhhZCBhIGxlYWRpbmcgemVybykuCisgICAgQ29uc3VtZVplcm9Pck1vcmU8T2N0YWxEaWdpdD4oKTsKKyAgICBpZiAoTG9va2luZ0F0PERpZ2l0PigpKSB7CisgICAgICBBZGRFcnJvcigiTnVtYmVycyBzdGFydGluZyB3aXRoIGxlYWRpbmcgemVybyBtdXN0IGJlIGluIG9jdGFsLiIpOworICAgICAgQ29uc3VtZVplcm9Pck1vcmU8RGlnaXQ+KCk7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLy8gQSBkZWNpbWFsIG51bWJlci4KKyAgICBpZiAoc3RhcnRlZF93aXRoX2RvdCkgeworICAgICAgaXNfZmxvYXQgPSB0cnVlOworICAgICAgQ29uc3VtZVplcm9Pck1vcmU8RGlnaXQ+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvbnN1bWVaZXJvT3JNb3JlPERpZ2l0PigpOworCisgICAgICBpZiAoVHJ5Q29uc3VtZSgnLicpKSB7CisgICAgICAgIGlzX2Zsb2F0ID0gdHJ1ZTsKKyAgICAgICAgQ29uc3VtZVplcm9Pck1vcmU8RGlnaXQ+KCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWUoJ2UnKSB8fCBUcnlDb25zdW1lKCdFJykpIHsKKyAgICAgIGlzX2Zsb2F0ID0gdHJ1ZTsKKyAgICAgIFRyeUNvbnN1bWUoJy0nKSB8fCBUcnlDb25zdW1lKCcrJyk7CisgICAgICBDb25zdW1lT25lT3JNb3JlPERpZ2l0PigiXCJlXCIgbXVzdCBiZSBmb2xsb3dlZCBieSBleHBvbmVudC4iKTsKKyAgICB9CisKKyAgICBpZiAoYWxsb3dfZl9hZnRlcl9mbG9hdF8gJiYgKFRyeUNvbnN1bWUoJ2YnKSB8fCBUcnlDb25zdW1lKCdGJykpKSB7CisgICAgICBpc19mbG9hdCA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKExvb2tpbmdBdDxMZXR0ZXI+KCkpIHsKKyAgICBBZGRFcnJvcigiTmVlZCBzcGFjZSBiZXR3ZWVuIG51bWJlciBhbmQgaWRlbnRpZmllci4iKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X2NoYXJfID09ICcuJykgeworICAgIGlmIChpc19mbG9hdCkgeworICAgICAgQWRkRXJyb3IoCisgICAgICAgICJBbHJlYWR5IHNhdyBkZWNpbWFsIHBvaW50IG9yIGV4cG9uZW50OyBjYW4ndCBoYXZlIGFub3RoZXIgb25lLiIpOworICAgIH0gZWxzZSB7CisgICAgICBBZGRFcnJvcigiSGV4IGFuZCBvY3RhbCBudW1iZXJzIG11c3QgYmUgaW50ZWdlcnMuIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGlzX2Zsb2F0ID8gVFlQRV9GTE9BVCA6IFRZUEVfSU5URUdFUjsKK30KKwordm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVMaW5lQ29tbWVudChzdHJpbmcqIGNvbnRlbnQpIHsKKyAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgUmVjb3JkVG8oY29udGVudCk7CisKKyAgd2hpbGUgKGN1cnJlbnRfY2hhcl8gIT0gJ1wwJyAmJiBjdXJyZW50X2NoYXJfICE9ICdcbicpIHsKKyAgICBOZXh0Q2hhcigpOworICB9CisgIFRyeUNvbnN1bWUoJ1xuJyk7CisKKyAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgU3RvcFJlY29yZGluZygpOworfQorCit2b2lkIFRva2VuaXplcjo6Q29uc3VtZUJsb2NrQ29tbWVudChzdHJpbmcqIGNvbnRlbnQpIHsKKyAgaW50IHN0YXJ0X2xpbmUgPSBsaW5lXzsKKyAgaW50IHN0YXJ0X2NvbHVtbiA9IGNvbHVtbl8gLSAyOworCisgIGlmIChjb250ZW50ICE9IE5VTEwpIFJlY29yZFRvKGNvbnRlbnQpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgd2hpbGUgKGN1cnJlbnRfY2hhcl8gIT0gJ1wwJyAmJgorICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICcqJyAmJgorICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICcvJyAmJgorICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICdcbicpIHsKKyAgICAgIE5leHRDaGFyKCk7CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWUoJ1xuJykpIHsKKyAgICAgIGlmIChjb250ZW50ICE9IE5VTEwpIFN0b3BSZWNvcmRpbmcoKTsKKworICAgICAgLy8gQ29uc3VtZSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFzdGVyaXNrOworICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZU5vTmV3bGluZT4oKTsKKyAgICAgIGlmIChUcnlDb25zdW1lKCcqJykpIHsKKyAgICAgICAgaWYgKFRyeUNvbnN1bWUoJy8nKSkgeworICAgICAgICAgIC8vIEVuZCBvZiBjb21tZW50LgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjb250ZW50ICE9IE5VTEwpIFJlY29yZFRvKGNvbnRlbnQpOworICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgnKicpICYmIFRyeUNvbnN1bWUoJy8nKSkgeworICAgICAgLy8gRW5kIG9mIGNvbW1lbnQuCisgICAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CisgICAgICAgIFN0b3BSZWNvcmRpbmcoKTsKKyAgICAgICAgLy8gU3RyaXAgdHJhaWxpbmcgIiovIi4KKyAgICAgICAgY29udGVudC0+ZXJhc2UoY29udGVudC0+c2l6ZSgpIC0gMik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJy8nKSAmJiBjdXJyZW50X2NoYXJfID09ICcqJykgeworICAgICAgLy8gTm90ZTogIFdlIGRpZG4ndCBjb25zdW1lIHRoZSAnKicgYmVjYXVzZSBpZiB0aGVyZSBpcyBhICcvJyBhZnRlciBpdAorICAgICAgLy8gICB3ZSB3YW50IHRvIGludGVycHJldCB0aGF0IGFzIHRoZSBlbmQgb2YgdGhlIGNvbW1lbnQuCisgICAgICBBZGRFcnJvcigKKyAgICAgICAgIlwiLypcIiBpbnNpZGUgYmxvY2sgY29tbWVudC4gIEJsb2NrIGNvbW1lbnRzIGNhbm5vdCBiZSBuZXN0ZWQuIik7CisgICAgfSBlbHNlIGlmIChjdXJyZW50X2NoYXJfID09ICdcMCcpIHsKKyAgICAgIEFkZEVycm9yKCJFbmQtb2YtZmlsZSBpbnNpZGUgYmxvY2sgY29tbWVudC4iKTsKKyAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKAorICAgICAgICBzdGFydF9saW5lLCBzdGFydF9jb2x1bW4sICIgIENvbW1lbnQgc3RhcnRlZCBoZXJlLiIpOworICAgICAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgU3RvcFJlY29yZGluZygpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK1Rva2VuaXplcjo6TmV4dENvbW1lbnRTdGF0dXMgVG9rZW5pemVyOjpUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkgeworICBpZiAoY29tbWVudF9zdHlsZV8gPT0gQ1BQX0NPTU1FTlRfU1RZTEUgJiYgVHJ5Q29uc3VtZSgnLycpKSB7CisgICAgaWYgKFRyeUNvbnN1bWUoJy8nKSkgeworICAgICAgcmV0dXJuIExJTkVfQ09NTUVOVDsKKyAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJyonKSkgeworICAgICAgcmV0dXJuIEJMT0NLX0NPTU1FTlQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE9vcHMsIGl0IHdhcyBqdXN0IGEgc2xhc2guICBSZXR1cm4gaXQuCisgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9TWU1CT0w7CisgICAgICBjdXJyZW50Xy50ZXh0ID0gIi8iOworICAgICAgY3VycmVudF8ubGluZSA9IGxpbmVfOworICAgICAgY3VycmVudF8uY29sdW1uID0gY29sdW1uXyAtIDE7CisgICAgICBjdXJyZW50Xy5lbmRfY29sdW1uID0gY29sdW1uXzsKKyAgICAgIHJldHVybiBTTEFTSF9OT1RfQ09NTUVOVDsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29tbWVudF9zdHlsZV8gPT0gU0hfQ09NTUVOVF9TVFlMRSAmJiBUcnlDb25zdW1lKCcjJykpIHsKKyAgICByZXR1cm4gTElORV9DT01NRU5UOworICB9IGVsc2UgeworICAgIHJldHVybiBOT19DT01NRU5UOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBUb2tlbml6ZXI6Ok5leHQoKSB7CisgIHByZXZpb3VzXyA9IGN1cnJlbnRfOworCisgIHdoaWxlICghcmVhZF9lcnJvcl8pIHsKKyAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlPigpOworCisgICAgc3dpdGNoIChUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkpIHsKKyAgICAgIGNhc2UgTElORV9DT01NRU5UOgorICAgICAgICBDb25zdW1lTGluZUNvbW1lbnQoTlVMTCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBCTE9DS19DT01NRU5UOgorICAgICAgICBDb25zdW1lQmxvY2tDb21tZW50KE5VTEwpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgU0xBU0hfTk9UX0NPTU1FTlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBOT19DT01NRU5UOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgRU9GIGJlZm9yZSBjb250aW51aW5nLgorICAgIGlmIChyZWFkX2Vycm9yXykgYnJlYWs7CisKKyAgICBpZiAoTG9va2luZ0F0PFVucHJpbnRhYmxlPigpIHx8IGN1cnJlbnRfY2hhcl8gPT0gJ1wwJykgeworICAgICAgQWRkRXJyb3IoIkludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuIik7CisgICAgICBOZXh0Q2hhcigpOworICAgICAgLy8gU2tpcCBtb3JlIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMsIHRvby4gIEJ1dCwgcmVtZW1iZXIgdGhhdCAnXDAnIGlzCisgICAgICAvLyBhbHNvIHdoYXQgY3VycmVudF9jaGFyXyBpcyBzZXQgdG8gYWZ0ZXIgRU9GIC8gcmVhZCBlcnJvci4gIFdlIGhhdmUKKyAgICAgIC8vIHRvIGJlIGNhcmVmdWwgbm90IHRvIGdvIGludG8gYW4gaW5maW5pdGUgbG9vcCBvZiB0cnlpbmcgdG8gY29uc3VtZQorICAgICAgLy8gaXQsIHNvIG1ha2Ugc3VyZSB0byBjaGVjayByZWFkX2Vycm9yXyBleHBsaWNpdGx5IGJlZm9yZSBjb25zdW1pbmcKKyAgICAgIC8vICdcMCcuCisgICAgICB3aGlsZSAoVHJ5Q29uc3VtZU9uZTxVbnByaW50YWJsZT4oKSB8fAorICAgICAgICAgICAgICghcmVhZF9lcnJvcl8gJiYgVHJ5Q29uc3VtZSgnXDAnKSkpIHsKKyAgICAgICAgLy8gSWdub3JlLgorICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFJlYWRpbmcgc29tZSBzb3J0IG9mIHRva2VuLgorICAgICAgU3RhcnRUb2tlbigpOworCisgICAgICBpZiAoVHJ5Q29uc3VtZU9uZTxMZXR0ZXI+KCkpIHsKKyAgICAgICAgQ29uc3VtZVplcm9Pck1vcmU8QWxwaGFudW1lcmljPigpOworICAgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9JREVOVElGSUVSOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcwJykpIHsKKyAgICAgICAgY3VycmVudF8udHlwZSA9IENvbnN1bWVOdW1iZXIodHJ1ZSwgZmFsc2UpOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcuJykpIHsKKyAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSB0aGUgYmVnaW5uaW5nIG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBvciBpdCBjb3VsZAorICAgICAgICAvLyBqdXN0IGJlIGEgJy4nIHN5bWJvbC4KKworICAgICAgICBpZiAoVHJ5Q29uc3VtZU9uZTxEaWdpdD4oKSkgeworICAgICAgICAgIC8vIEl0J3MgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgICAgICAgaWYgKHByZXZpb3VzXy50eXBlID09IFRZUEVfSURFTlRJRklFUiAmJgorICAgICAgICAgICAgICBjdXJyZW50Xy5saW5lID09IHByZXZpb3VzXy5saW5lICYmCisgICAgICAgICAgICAgIGN1cnJlbnRfLmNvbHVtbiA9PSBwcmV2aW91c18uZW5kX2NvbHVtbikgeworICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYWNjZXB0IHN5bnRheCBsaWtlICJibGFoLjEyMyIuCisgICAgICAgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihsaW5lXywgY29sdW1uXyAtIDIsCisgICAgICAgICAgICAgICJOZWVkIHNwYWNlIGJldHdlZW4gaWRlbnRpZmllciBhbmQgZGVjaW1hbCBwb2ludC4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY3VycmVudF8udHlwZSA9IENvbnN1bWVOdW1iZXIoZmFsc2UsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NZTUJPTDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lT25lPERpZ2l0PigpKSB7CisgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBDb25zdW1lTnVtYmVyKGZhbHNlLCBmYWxzZSk7CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ1wiJykpIHsKKyAgICAgICAgQ29uc3VtZVN0cmluZygnXCInKTsKKyAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1RSSU5HOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCdcJycpKSB7CisgICAgICAgIENvbnN1bWVTdHJpbmcoJ1wnJyk7CisgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUUklORzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE5leHRDaGFyKCk7CisgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NZTUJPTDsKKyAgICAgIH0KKworICAgICAgRW5kVG9rZW4oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIEVPRgorICBjdXJyZW50Xy50eXBlID0gVFlQRV9FTkQ7CisgIGN1cnJlbnRfLnRleHQuY2xlYXIoKTsKKyAgY3VycmVudF8ubGluZSA9IGxpbmVfOworICBjdXJyZW50Xy5jb2x1bW4gPSBjb2x1bW5fOworICBjdXJyZW50Xy5lbmRfY29sdW1uID0gY29sdW1uXzsKKyAgcmV0dXJuIGZhbHNlOworfQorCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgY2xhc3MgZm9yIGNvbGxlY3RpbmcgY29tbWVudHMgYW5kIHB1dHRpbmcgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2VzLgorLy8KKy8vIFRoaXMgYmFzaWNhbGx5IGp1c3QgYnVmZmVycyB0aGUgbW9zdCByZWNlbnQgY29tbWVudCB1bnRpbCBpdCBjYW4gYmUgZGVjaWRlZAorLy8gZXhhY3RseSB3aGVyZSB0aGF0IGNvbW1lbnQgc2hvdWxkIGJlIHBsYWNlZC4gIFdoZW4gRmx1c2goKSBpcyBjYWxsZWQsIHRoZQorLy8gY3VycmVudCBjb21tZW50IGdvZXMgaW50byBlaXRoZXIgcHJldl90cmFpbGluZ19jb21tZW50cyBvciBkZXRhY2hlZF9jb21tZW50cy4KKy8vIFdoZW4gdGhlIENvbW1lbnRDb2xsZWN0b3IgaXMgZGVzdHJveWVkLCB0aGUgbGFzdCBidWZmZXJlZCBjb21tZW50IGdvZXMgaW50bworLy8gbmV4dF9sZWFkaW5nX2NvbW1lbnRzLgorY2xhc3MgQ29tbWVudENvbGxlY3RvciB7CisgcHVibGljOgorICBDb21tZW50Q29sbGVjdG9yKHN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBuZXh0X2xlYWRpbmdfY29tbWVudHMpCisgICAgICA6IHByZXZfdHJhaWxpbmdfY29tbWVudHNfKHByZXZfdHJhaWxpbmdfY29tbWVudHMpLAorICAgICAgICBkZXRhY2hlZF9jb21tZW50c18oZGV0YWNoZWRfY29tbWVudHMpLAorICAgICAgICBuZXh0X2xlYWRpbmdfY29tbWVudHNfKG5leHRfbGVhZGluZ19jb21tZW50cyksCisgICAgICAgIGhhc19jb21tZW50XyhmYWxzZSksCisgICAgICAgIGlzX2xpbmVfY29tbWVudF8oZmFsc2UpLAorICAgICAgICBjYW5fYXR0YWNoX3RvX3ByZXZfKHRydWUpIHsKKyAgICBpZiAocHJldl90cmFpbGluZ19jb21tZW50cyAhPSBOVUxMKSBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzLT5jbGVhcigpOworICAgIGlmIChkZXRhY2hlZF9jb21tZW50cyAhPSBOVUxMKSBkZXRhY2hlZF9jb21tZW50cy0+Y2xlYXIoKTsKKyAgICBpZiAobmV4dF9sZWFkaW5nX2NvbW1lbnRzICE9IE5VTEwpIG5leHRfbGVhZGluZ19jb21tZW50cy0+Y2xlYXIoKTsKKyAgfQorCisgIH5Db21tZW50Q29sbGVjdG9yKCkgeworICAgIC8vIFdoYXRldmVyIGlzIGluIHRoZSBidWZmZXIgaXMgYSBsZWFkaW5nIGNvbW1lbnQuCisgICAgaWYgKG5leHRfbGVhZGluZ19jb21tZW50c18gIT0gTlVMTCAmJiBoYXNfY29tbWVudF8pIHsKKyAgICAgIGNvbW1lbnRfYnVmZmVyXy5zd2FwKCpuZXh0X2xlYWRpbmdfY29tbWVudHNfKTsKKyAgICB9CisgIH0KKworICAvLyBBYm91dCB0byByZWFkIGEgbGluZSBjb21tZW50LiAgR2V0IHRoZSBjb21tZW50IGJ1ZmZlciBwb2ludGVyIGluIG9yZGVyIHRvCisgIC8vIHJlYWQgaW50byBpdC4KKyAgc3RyaW5nKiBHZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpIHsKKyAgICAvLyBXZSB3YW50IHRvIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBsaW5lIGNvbW1lbnRzLCBidXQgbm90IGJsb2NrIGNvbW1lbnRzLgorICAgIGlmIChoYXNfY29tbWVudF8gJiYgIWlzX2xpbmVfY29tbWVudF8pIHsKKyAgICAgIEZsdXNoKCk7CisgICAgfQorICAgIGhhc19jb21tZW50XyA9IHRydWU7CisgICAgaXNfbGluZV9jb21tZW50XyA9IHRydWU7CisgICAgcmV0dXJuICZjb21tZW50X2J1ZmZlcl87CisgIH0KKworICAvLyBBYm91dCB0byByZWFkIGEgYmxvY2sgY29tbWVudC4gIEdldCB0aGUgY29tbWVudCBidWZmZXIgcG9pbnRlciBpbiBvcmRlciB0bworICAvLyByZWFkIGludG8gaXQuCisgIHN0cmluZyogR2V0QnVmZmVyRm9yQmxvY2tDb21tZW50KCkgeworICAgIGlmIChoYXNfY29tbWVudF8pIHsKKyAgICAgIEZsdXNoKCk7CisgICAgfQorICAgIGhhc19jb21tZW50XyA9IHRydWU7CisgICAgaXNfbGluZV9jb21tZW50XyA9IGZhbHNlOworICAgIHJldHVybiAmY29tbWVudF9idWZmZXJfOworICB9CisKKyAgdm9pZCBDbGVhckJ1ZmZlcigpIHsKKyAgICBjb21tZW50X2J1ZmZlcl8uY2xlYXIoKTsKKyAgICBoYXNfY29tbWVudF8gPSBmYWxzZTsKKyAgfQorCisgIC8vIENhbGxlZCBvbmNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWVudCBidWZmZXIgaXMgY29tcGxldGUgYW5kIGlzICpub3QqCisgIC8vIGNvbm5lY3RlZCB0byB0aGUgbmV4dCB0b2tlbi4KKyAgdm9pZCBGbHVzaCgpIHsKKyAgICBpZiAoaGFzX2NvbW1lbnRfKSB7CisgICAgICBpZiAoY2FuX2F0dGFjaF90b19wcmV2XykgeworICAgICAgICBpZiAocHJldl90cmFpbGluZ19jb21tZW50c18gIT0gTlVMTCkgeworICAgICAgICAgIHByZXZfdHJhaWxpbmdfY29tbWVudHNfLT5hcHBlbmQoY29tbWVudF9idWZmZXJfKTsKKyAgICAgICAgfQorICAgICAgICBjYW5fYXR0YWNoX3RvX3ByZXZfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGV0YWNoZWRfY29tbWVudHNfICE9IE5VTEwpIHsKKyAgICAgICAgICBkZXRhY2hlZF9jb21tZW50c18tPnB1c2hfYmFjayhjb21tZW50X2J1ZmZlcl8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBDbGVhckJ1ZmZlcigpOworICAgIH0KKyAgfQorCisgIHZvaWQgRGV0YWNoRnJvbVByZXYoKSB7CisgICAgY2FuX2F0dGFjaF90b19wcmV2XyA9IGZhbHNlOworICB9CisKKyBwcml2YXRlOgorICBzdHJpbmcqIHByZXZfdHJhaWxpbmdfY29tbWVudHNfOworICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHNfOworICBzdHJpbmcqIG5leHRfbGVhZGluZ19jb21tZW50c187CisKKyAgc3RyaW5nIGNvbW1lbnRfYnVmZmVyXzsKKworICAvLyBUcnVlIGlmIGFueSBjb21tZW50cyB3ZXJlIHJlYWQgaW50byBjb21tZW50X2J1ZmZlcl8uICBUaGlzIGNhbiBiZSB0cnVlIGV2ZW4KKyAgLy8gaWYgY29tbWVudF9idWZmZXJfIGlzIGVtcHR5LCBuYW1lbHkgaWYgdGhlIGNvbW1lbnQgd2FzICIvKiovIi4KKyAgYm9vbCBoYXNfY29tbWVudF87CisKKyAgLy8gSXMgdGhlIGNvbW1lbnQgaW4gdGhlIGNvbW1lbnQgYnVmZmVyIGEgbGluZSBjb21tZW50PworICBib29sIGlzX2xpbmVfY29tbWVudF87CisKKyAgLy8gSXMgaXQgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSBjb3VsZCBiZSByZWFkaW5nIGEgY29tbWVudCBhdHRhY2hlZCB0byB0aGUKKyAgLy8gcHJldmlvdXMgdG9rZW4/CisgIGJvb2wgY2FuX2F0dGFjaF90b19wcmV2XzsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK2Jvb2wgVG9rZW5pemVyOjpOZXh0V2l0aENvbW1lbnRzKHN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogbmV4dF9sZWFkaW5nX2NvbW1lbnRzKSB7CisgIENvbW1lbnRDb2xsZWN0b3IgY29sbGVjdG9yKHByZXZfdHJhaWxpbmdfY29tbWVudHMsIGRldGFjaGVkX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xlYWRpbmdfY29tbWVudHMpOworCisgIGlmIChjdXJyZW50Xy50eXBlID09IFRZUEVfU1RBUlQpIHsKKyAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBBIGNvbW1lbnQgYXBwZWFyaW5nIG9uIHRoZSBzYW1lIGxpbmUgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMKKyAgICAvLyBkZWNsYXJhdGlvbi4KKyAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworICAgIHN3aXRjaCAoVHJ5Q29uc3VtZUNvbW1lbnRTdGFydCgpKSB7CisgICAgICBjYXNlIExJTkVfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUxpbmVDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpKTsKKworICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKKyAgICAgICAgLy8gY29tbWVudC4KKyAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCTE9DS19DT01NRU5UOgorICAgICAgICBDb25zdW1lQmxvY2tDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JCbG9ja0NvbW1lbnQoKSk7CisKKyAgICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZU5vTmV3bGluZT4oKTsKKyAgICAgICAgaWYgKCFUcnlDb25zdW1lKCdcbicpKSB7CisgICAgICAgICAgLy8gT29wcywgdGhlIG5leHQgdG9rZW4gaXMgb24gdGhlIHNhbWUgbGluZS4gIElmIHdlIHJlY29yZGVkIGEgY29tbWVudAorICAgICAgICAgIC8vIHdlIHJlYWxseSBoYXZlIG5vIGlkZWEgd2hpY2ggdG9rZW4gaXQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgorICAgICAgICAgIGNvbGxlY3Rvci5DbGVhckJ1ZmZlcigpOworICAgICAgICAgIHJldHVybiBOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKKyAgICAgICAgLy8gY29tbWVudC4KKyAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTEFTSF9OT1RfQ09NTUVOVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIE5PX0NPTU1FTlQ6CisgICAgICAgIGlmICghVHJ5Q29uc3VtZSgnXG4nKSkgeworICAgICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIG9uIHRoZSBzYW1lIGxpbmUuICBUaGVyZSBhcmUgbm8gY29tbWVudHMuCisgICAgICAgICAgcmV0dXJuIE5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBPSywgd2UgYXJlIG5vdyBvbiB0aGUgbGluZSAqYWZ0ZXIqIHRoZSBwcmV2aW91cyB0b2tlbi4KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworCisgICAgc3dpdGNoIChUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkpIHsKKyAgICAgIGNhc2UgTElORV9DT01NRU5UOgorICAgICAgICBDb25zdW1lTGluZUNvbW1lbnQoY29sbGVjdG9yLkdldEJ1ZmZlckZvckxpbmVDb21tZW50KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQkxPQ0tfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUJsb2NrQ29tbWVudChjb2xsZWN0b3IuR2V0QnVmZmVyRm9yQmxvY2tDb21tZW50KCkpOworCisgICAgICAgIC8vIENvbnN1bWUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgc28gdGhhdCB3ZSBkb24ndCBpbnRlcnByZXQgaXQgYXMgYQorICAgICAgICAvLyBibGFuayBsaW5lIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wLgorICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworICAgICAgICBUcnlDb25zdW1lKCdcbicpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0xBU0hfTk9UX0NPTU1FTlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBOT19DT01NRU5UOgorICAgICAgICBpZiAoVHJ5Q29uc3VtZSgnXG4nKSkgeworICAgICAgICAgIC8vIENvbXBsZXRlbHkgYmxhbmsgbGluZS4KKyAgICAgICAgICBjb2xsZWN0b3IuRmx1c2goKTsKKyAgICAgICAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBib29sIHJlc3VsdCA9IE5leHQoKTsKKyAgICAgICAgICBpZiAoIXJlc3VsdCB8fAorICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICJ9IiB8fAorICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICJdIiB8fAorICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICIpIikgeworICAgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgc2NvcGUuICBJbiB0aGlzIGNhc2UgaXQKKyAgICAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIGF0dGFjaCBhIGNvbW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0b2tlbi4KKyAgICAgICAgICAgIGNvbGxlY3Rvci5GbHVzaCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUb2tlbi1wYXJzaW5nIGhlbHBlcnMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGRvbid0IG5lZWQgdG8gcmVwb3J0CisvLyBlcnJvcnMgc2luY2UgYW55IGVycm9ycyBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gcmVwb3J0ZWQgd2hpbGUKKy8vIHRva2VuaXppbmcuICBBbHNvLCB0aGVzZSBjYW4gYXNzdW1lIHRoYXQgd2hhdGV2ZXIgdGV4dCB0aGV5CisvLyBhcmUgZ2l2ZW4gaXMgdGV4dCB0aGF0IHRoZSB0b2tlbml6ZXIgYWN0dWFsbHkgcGFyc2VkIGFzIGEgdG9rZW4KKy8vIG9mIHRoZSBnaXZlbiB0eXBlLgorCitib29sIFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGNvbnN0IHN0cmluZyYgdGV4dCwgdWludDY0IG1heF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0KiBvdXRwdXQpIHsKKyAgLy8gU2FkbHksIHdlIGNhbid0IGp1c3QgdXNlIHN0cnRvdWwoKSBzaW5jZSBpdCBpcyBvbmx5IDMyLWJpdCBhbmQgc3RydG91bGwoKQorICAvLyBpcyBub24tc3RhbmRhcmQuICBJIGhhdGUgdGhlIEMgc3RhbmRhcmQgbGlicmFyeS4gIDooCisKKy8vICByZXR1cm4gc3RydG91bGwodGV4dC5jX3N0cigpLCBOVUxMLCAwKTsKKworICBjb25zdCBjaGFyKiBwdHIgPSB0ZXh0LmNfc3RyKCk7CisgIGludCBiYXNlID0gMTA7CisgIGlmIChwdHJbMF0gPT0gJzAnKSB7CisgICAgaWYgKHB0clsxXSA9PSAneCcgfHwgcHRyWzFdID09ICdYJykgeworICAgICAgLy8gVGhpcyBpcyBoZXguCisgICAgICBiYXNlID0gMTY7CisgICAgICBwdHIgKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhpcyBpcyBvY3RhbC4KKyAgICAgIGJhc2UgPSA4OworICAgIH0KKyAgfQorCisgIHVpbnQ2NCByZXN1bHQgPSAwOworICBmb3IgKDsgKnB0ciAhPSAnXDAnOyBwdHIrKykgeworICAgIGludCBkaWdpdCA9IERpZ2l0VmFsdWUoKnB0cik7CisgICAgR09PR0xFX0xPR19JRihERkFUQUwsIGRpZ2l0IDwgMCB8fCBkaWdpdCA+PSBiYXNlKQorICAgICAgPDwgIiBUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigpIHBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiIKKyAgICAgICAgICIgdG9rZW5pemVkIGFzIGFuIGludGVnZXI6ICIgPDwgQ0VzY2FwZSh0ZXh0KTsKKyAgICBpZiAoZGlnaXQgPiBtYXhfdmFsdWUgfHwgcmVzdWx0ID4gKG1heF92YWx1ZSAtIGRpZ2l0KSAvIGJhc2UpIHsKKyAgICAgIC8vIE92ZXJmbG93LgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgZGlnaXQ7CisgIH0KKworICAqb3V0cHV0ID0gcmVzdWx0OworICByZXR1cm4gdHJ1ZTsKK30KKworZG91YmxlIFRva2VuaXplcjo6UGFyc2VGbG9hdChjb25zdCBzdHJpbmcmIHRleHQpIHsKKyAgY29uc3QgY2hhciogc3RhcnQgPSB0ZXh0LmNfc3RyKCk7CisgIGNoYXIqIGVuZDsKKyAgZG91YmxlIHJlc3VsdCA9IE5vTG9jYWxlU3RydG9kKHN0YXJ0LCAmZW5kKTsKKworICAvLyAiMWUiIGlzIG5vdCBhIHZhbGlkIGZsb2F0LCBidXQgaWYgdGhlIHRva2VuaXplciByZWFkcyBpdCwgaXQgd2lsbAorICAvLyByZXBvcnQgYW4gZXJyb3IgYnV0IHN0aWxsIHJldHVybiBpdCBhcyBhIHZhbGlkIHRva2VuLiAgV2UgbmVlZCB0bworICAvLyBhY2NlcHQgYW55dGhpbmcgdGhlIHRva2VuaXplciBjb3VsZCBwb3NzaWJseSByZXR1cm4sIGVycm9yIG9yIG5vdC4KKyAgaWYgKCplbmQgPT0gJ2UnIHx8ICplbmQgPT0gJ0UnKSB7CisgICAgKytlbmQ7CisgICAgaWYgKCplbmQgPT0gJy0nIHx8ICplbmQgPT0gJysnKSArK2VuZDsKKyAgfQorCisgIC8vIElmIHRoZSBUb2tlbml6ZXIgaGFkIGFsbG93X2ZfYWZ0ZXJfZmxvYXRfIGVuYWJsZWQsIHRoZSBmbG9hdCBtYXkgYmUKKyAgLy8gc3VmZml4ZWQgd2l0aCB0aGUgbGV0dGVyICdmJy4KKyAgaWYgKCplbmQgPT0gJ2YnIHx8ICplbmQgPT0gJ0YnKSB7CisgICAgKytlbmQ7CisgIH0KKworICBHT09HTEVfTE9HX0lGKERGQVRBTCwgZW5kIC0gc3RhcnQgIT0gdGV4dC5zaXplKCkgfHwgKnN0YXJ0ID09ICctJykKKyAgICA8PCAiIFRva2VuaXplcjo6UGFyc2VGbG9hdCgpIHBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiIKKyAgICAgICAiIHRva2VuaXplZCBhcyBhIGZsb2F0OiAiIDw8IENFc2NhcGUodGV4dCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEhlbHBlciB0byBhcHBlbmQgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBzdHJpbmcgYXMgVVRGOCwgd2l0aG91dCBicmluZ2luZworLy8gaW4gYW55IGV4dGVybmFsIGRlcGVuZGVuY2llcy4KK3N0YXRpYyB2b2lkIEFwcGVuZFVURjgodWludDMyIGNvZGVfcG9pbnQsIHN0cmluZyogb3V0cHV0KSB7CisgIHVpbnQzMiB0bXAgPSAwOworICBpbnQgbGVuID0gMDsKKyAgaWYgKGNvZGVfcG9pbnQgPD0gMHg3ZikgeworICAgIHRtcCA9IGNvZGVfcG9pbnQ7CisgICAgbGVuID0gMTsKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4MDdmZikgeworICAgIHRtcCA9IDB4MDAwMGMwODAgfAorICAgICAgICAoKGNvZGVfcG9pbnQgJiAweDA3YzApIDw8IDIpIHwKKyAgICAgICAgKGNvZGVfcG9pbnQgJiAweDAwM2YpOworICAgIGxlbiA9IDI7CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSAweGZmZmYpIHsKKyAgICB0bXAgPSAweDAwZTA4MDgwIHwKKyAgICAgICAgKChjb2RlX3BvaW50ICYgMHhmMDAwKSA8PCA0KSB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MGZjMCkgPDwgMikgfAorICAgICAgICAoY29kZV9wb2ludCAmIDB4MDAzZik7CisgICAgbGVuID0gMzsKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4MWZmZmZmKSB7CisgICAgdG1wID0gMHhmMDgwODA4MCB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MWMwMDAwKSA8PCA2KSB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MDNmMDAwKSA8PCA0KSB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MDAwZmMwKSA8PCAyKSB8CisgICAgICAgIChjb2RlX3BvaW50ICYgMHgwMDNmKTsKKyAgICBsZW4gPSA0OworICB9IGVsc2UgeworICAgIC8vIFVURi0xNiBpcyBvbmx5IGRlZmluZWQgZm9yIGNvZGUgcG9pbnRzIHVwIHRvIDB4MTBGRkZGLCBhbmQgVVRGLTggaXMKKyAgICAvLyBub3JtYWxseSBvbmx5IGRlZmluZWQgdXAgdG8gdGhlcmUgYXMgd2VsbC4KKyAgICBTdHJpbmdBcHBlbmRGKG91dHB1dCwgIlxcVSUwOHgiLCBjb2RlX3BvaW50KTsKKyAgICByZXR1cm47CisgIH0KKyAgdG1wID0gZ2h0b25sKHRtcCk7CisgIG91dHB1dC0+YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApICsgc2l6ZW9mKHRtcCkgLSBsZW4sIGxlbik7Cit9CisKKy8vIFRyeSB0byByZWFkIDxsZW4+IGhleCBkaWdpdHMgZnJvbSBwdHIsIGFuZCBzdHVmZiB0aGUgbnVtZXJpYyByZXN1bHQgaW50bworLy8gKnJlc3VsdC4gUmV0dXJucyB0cnVlIGlmIHRoYXQgbWFueSBkaWdpdHMgd2VyZSBzdWNjZXNzZnVsbHkgY29uc3VtZWQuCitzdGF0aWMgYm9vbCBSZWFkSGV4RGlnaXRzKGNvbnN0IGNoYXIqIHB0ciwgaW50IGxlbiwgdWludDMyKiByZXN1bHQpIHsKKyAgKnJlc3VsdCA9IDA7CisgIGlmIChsZW4gPT0gMCkgcmV0dXJuIGZhbHNlOworICBmb3IgKGNvbnN0IGNoYXIqIGVuZCA9IHB0ciArIGxlbjsgcHRyIDwgZW5kOyArK3B0cikgeworICAgIGlmICgqcHRyID09ICdcMCcpIHJldHVybiBmYWxzZTsKKyAgICAqcmVzdWx0ID0gKCpyZXN1bHQgPDwgNCkgKyBEaWdpdFZhbHVlKCpwdHIpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBIYW5kbGluZyBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLiBVVEYtMTYgZW5jb2RlcyBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UKKy8vIDB4MTAwMDAuLi4weDEwZmZmZiBhcyBhIHBhaXIgb2YgbnVtYmVycywgYSBoZWFkIHN1cnJvZ2F0ZSBmb2xsb3dlZCBieSBhIHRyYWlsCisvLyBzdXJyb2dhdGUuIFRoZXNlIG51bWJlcnMgYXJlIGluIGEgcmVzZXJ2ZWQgcmFuZ2Ugb2YgVW5pY29kZSBjb2RlIHBvaW50cywgc28KKy8vIGlmIHdlIGVuY291bnRlciBzdWNoIGEgcGFpciB3ZSBrbm93IGhvdyB0byBwYXJzZSBpdCBhbmQgY29udmVydCBpdCBpbnRvIGEKKy8vIHNpbmdsZSBjb2RlIHBvaW50Lgorc3RhdGljIGNvbnN0IHVpbnQzMiBrTWluSGVhZFN1cnJvZ2F0ZSA9IDB4ZDgwMDsKK3N0YXRpYyBjb25zdCB1aW50MzIga01heEhlYWRTdXJyb2dhdGUgPSAweGRjMDA7CitzdGF0aWMgY29uc3QgdWludDMyIGtNaW5UcmFpbFN1cnJvZ2F0ZSA9IDB4ZGMwMDsKK3N0YXRpYyBjb25zdCB1aW50MzIga01heFRyYWlsU3Vycm9nYXRlID0gMHhlMDAwOworCitzdGF0aWMgaW5saW5lIGJvb2wgSXNIZWFkU3Vycm9nYXRlKHVpbnQzMiBjb2RlX3BvaW50KSB7CisgIHJldHVybiAoY29kZV9wb2ludCA+PSBrTWluSGVhZFN1cnJvZ2F0ZSkgJiYgKGNvZGVfcG9pbnQgPCBrTWF4SGVhZFN1cnJvZ2F0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBJc1RyYWlsU3Vycm9nYXRlKHVpbnQzMiBjb2RlX3BvaW50KSB7CisgIHJldHVybiAoY29kZV9wb2ludCA+PSBrTWluVHJhaWxTdXJyb2dhdGUpICYmCisgICAgICAoY29kZV9wb2ludCA8IGtNYXhUcmFpbFN1cnJvZ2F0ZSk7Cit9CisKKy8vIENvbWJpbmUgYSBoZWFkIGFuZCB0cmFpbCBzdXJyb2dhdGUgaW50byBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQuCitzdGF0aWMgdWludDMyIEFzc2VtYmxlVVRGMTYodWludDMyIGhlYWRfc3Vycm9nYXRlLCB1aW50MzIgdHJhaWxfc3Vycm9nYXRlKSB7CisgIEdPT0dMRV9EQ0hFQ0soSXNIZWFkU3Vycm9nYXRlKGhlYWRfc3Vycm9nYXRlKSk7CisgIEdPT0dMRV9EQ0hFQ0soSXNUcmFpbFN1cnJvZ2F0ZSh0cmFpbF9zdXJyb2dhdGUpKTsKKyAgcmV0dXJuIDB4MTAwMDAgKyAoKChoZWFkX3N1cnJvZ2F0ZSAtIGtNaW5IZWFkU3Vycm9nYXRlKSA8PCAxMCkgfAorICAgICAgKHRyYWlsX3N1cnJvZ2F0ZSAtIGtNaW5UcmFpbFN1cnJvZ2F0ZSkpOworfQorCisvLyBDb252ZXJ0IHRoZSBlc2NhcGUgc2VxdWVuY2UgcGFyYW1ldGVyIHRvIGEgbnVtYmVyIG9mIGV4cGVjdGVkIGhleCBkaWdpdHMuCitzdGF0aWMgaW5saW5lIGludCBVbmljb2RlTGVuZ3RoKGNoYXIga2V5KSB7CisgIGlmIChrZXkgPT0gJ3UnKSByZXR1cm4gNDsKKyAgaWYgKGtleSA9PSAnVScpIHJldHVybiA4OworICByZXR1cm4gMDsKK30KKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSAndScgb3IgJ1UnIHN0YXJ0aW5nIGEgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UsIGF0dGVtcHQKKy8vIHRvIHBhcnNlIHRoYXQgc2VxdWVuY2UuIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyCisvLyBiZXlvbmQgdGhhdCBzZXF1ZW5jZSwgYW5kIGZpbGxzIGluICpjb2RlX3BvaW50LiBPbiBmYWlsdXJlLCByZXR1cm5zIHB0cgorLy8gaXRzZWxmLgorc3RhdGljIGNvbnN0IGNoYXIqIEZldGNoVW5pY29kZVBvaW50KGNvbnN0IGNoYXIqIHB0ciwgdWludDMyKiBjb2RlX3BvaW50KSB7CisgIGNvbnN0IGNoYXIqIHAgPSBwdHI7CisgIC8vIEZldGNoIHRoZSBjb2RlIHBvaW50LgorICBjb25zdCBpbnQgbGVuID0gVW5pY29kZUxlbmd0aCgqcCsrKTsKKyAgaWYgKCFSZWFkSGV4RGlnaXRzKHAsIGxlbiwgY29kZV9wb2ludCkpCisgICAgcmV0dXJuIHB0cjsKKyAgcCArPSBsZW47CisKKyAgLy8gQ2hlY2sgaWYgdGhlIGNvZGUgcG9pbnQgd2UgcmVhZCBpcyBhICJoZWFkIHN1cnJvZ2F0ZS4iIElmIHNvLCB0aGVuIHdlCisgIC8vIGV4cGVjdCBpdCB0byBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIGNvZGUgcG9pbnQgd2hpY2ggaXMgYSB2YWxpZAorICAvLyAidHJhaWwgc3Vycm9nYXRlLCIgYW5kIHRvZ2V0aGVyIHRoZXkgZm9ybSBhIFVURi0xNiBwYWlyIHdoaWNoIGRlY29kZXMgaW50bworICAvLyBhIHNpbmdsZSBVbmljb2RlIHBvaW50LiBUcmFpbCBzdXJyb2dhdGVzIG1heSBvbmx5IHVzZSBcdSwgbm90IFxVLgorICBpZiAoSXNIZWFkU3Vycm9nYXRlKCpjb2RlX3BvaW50KSAmJiAqcCA9PSAnXFwnICYmICoocCArIDEpID09ICd1JykgeworICAgIHVpbnQzMiB0cmFpbF9zdXJyb2dhdGU7CisgICAgaWYgKFJlYWRIZXhEaWdpdHMocCArIDIsIDQsICZ0cmFpbF9zdXJyb2dhdGUpICYmCisgICAgICAgIElzVHJhaWxTdXJyb2dhdGUodHJhaWxfc3Vycm9nYXRlKSkgeworICAgICAgKmNvZGVfcG9pbnQgPSBBc3NlbWJsZVVURjE2KCpjb2RlX3BvaW50LCB0cmFpbF9zdXJyb2dhdGUpOworICAgICAgcCArPSA2OworICAgIH0KKyAgICAvLyBJZiB0aGlzIGZhaWxlZCwgdGhlbiB3ZSBqdXN0IGVtaXQgdGhlIGhlYWQgc3Vycm9nYXRlIGFzIGEgY29kZSBwb2ludC4KKyAgICAvLyBJdCdzIGJvZ3VzLCBidXQgc28gaXMgdGhlIHN0cmluZy4KKyAgfQorCisgIHJldHVybiBwOworfQorCisvLyBUaGUgdGV4dCBzdHJpbmcgbXVzdCBiZWdpbiBhbmQgZW5kIHdpdGggc2luZ2xlIG9yIGRvdWJsZSBxdW90ZQorLy8gY2hhcmFjdGVycy4KK3ZvaWQgVG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZChjb25zdCBzdHJpbmcmIHRleHQsIHN0cmluZyogb3V0cHV0KSB7CisgIC8vIFJlbWluZGVyOiB0ZXh0WzBdIGlzIGFsd2F5cyBhIHF1b3RlIGNoYXJhY3Rlci4gIChJZiB0ZXh0IGlzCisgIC8vIGVtcHR5LCBpdCdzIGludmFsaWQsIHNvIHdlJ2xsIGp1c3QgcmV0dXJuKS4KKyAgY29uc3Qgc2l6ZV90IHRleHRfc2l6ZSA9IHRleHQuc2l6ZSgpOworICBpZiAodGV4dF9zaXplID09IDApIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkKKyAgICAgIDw8ICIgVG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZCgpIHBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IgorICAgICAgICAgIiBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgc3RyaW5nOiAiIDw8IENFc2NhcGUodGV4dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gUmVzZXJ2ZSByb29tIGZvciBuZXcgc3RyaW5nLiBUaGUgYnJhbmNoIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGlmCisgIC8vIHRoZXJlIGlzIGFscmVhZHkgc3BhY2UgYXZhaWxhYmxlIHRoZSByZXNlcnZlKCkgY2FsbCBtaWdodAorICAvLyBkb3duc2l6ZSB0aGUgb3V0cHV0LgorICBjb25zdCBzaXplX3QgbmV3X2xlbiA9IHRleHRfc2l6ZSArIG91dHB1dC0+c2l6ZSgpOworICBpZiAobmV3X2xlbiA+IG91dHB1dC0+Y2FwYWNpdHkoKSkgeworICAgIG91dHB1dC0+cmVzZXJ2ZShuZXdfbGVuKTsKKyAgfQorCisgIC8vIExvb3AgdGhyb3VnaCB0aGUgc3RyaW5nIGNvcHlpbmcgY2hhcmFjdGVycyB0byAib3V0cHV0IiBhbmQKKyAgLy8gaW50ZXJwcmV0aW5nIGVzY2FwZSBzZXF1ZW5jZXMuICBOb3RlIHRoYXQgYW55IGludmFsaWQgZXNjYXBlCisgIC8vIHNlcXVlbmNlcyBvciBvdGhlciBlcnJvcnMgd2VyZSBhbHJlYWR5IHJlcG9ydGVkIHdoaWxlIHRva2VuaXppbmcuCisgIC8vIEluIHRoaXMgY2FzZSB3ZSBkbyBub3QgbmVlZCB0byBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuCisgIGZvciAoY29uc3QgY2hhciogcHRyID0gdGV4dC5jX3N0cigpICsgMTsgKnB0ciAhPSAnXDAnOyBwdHIrKykgeworICAgIGlmICgqcHRyID09ICdcXCcgJiYgcHRyWzFdICE9ICdcMCcpIHsKKyAgICAgIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgICsrcHRyOworCisgICAgICBpZiAoT2N0YWxEaWdpdDo6SW5DbGFzcygqcHRyKSkgeworICAgICAgICAvLyBBbiBvY3RhbCBlc2NhcGUuICBNYXkgb25lLCB0d28sIG9yIHRocmVlIGRpZ2l0cy4KKyAgICAgICAgaW50IGNvZGUgPSBEaWdpdFZhbHVlKCpwdHIpOworICAgICAgICBpZiAoT2N0YWxEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7CisgICAgICAgICAgKytwdHI7CisgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgRGlnaXRWYWx1ZSgqcHRyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoT2N0YWxEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7CisgICAgICAgICAgKytwdHI7CisgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgRGlnaXRWYWx1ZSgqcHRyKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihjb2RlKSk7CisKKyAgICAgIH0gZWxzZSBpZiAoKnB0ciA9PSAneCcpIHsKKyAgICAgICAgLy8gQSBoZXggZXNjYXBlLiAgTWF5IHplcm8sIG9uZSwgb3IgdHdvIGRpZ2l0cy4gIChUaGUgemVybyBjYXNlCisgICAgICAgIC8vIHdpbGwgaGF2ZSBiZWVuIGNhdWdodCBhcyBhbiBlcnJvciBlYXJsaWVyLikKKyAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICBpZiAoSGV4RGlnaXQ6OkluQ2xhc3MocHRyWzFdKSkgeworICAgICAgICAgICsrcHRyOworICAgICAgICAgIGNvZGUgPSBEaWdpdFZhbHVlKCpwdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChIZXhEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7CisgICAgICAgICAgKytwdHI7CisgICAgICAgICAgY29kZSA9IGNvZGUgKiAxNiArIERpZ2l0VmFsdWUoKnB0cik7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0LT5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oY29kZSkpOworCisgICAgICB9IGVsc2UgaWYgKCpwdHIgPT0gJ3UnIHx8ICpwdHIgPT0gJ1UnKSB7CisgICAgICAgIHVpbnQzMiB1bmljb2RlOworICAgICAgICBjb25zdCBjaGFyKiBlbmQgPSBGZXRjaFVuaWNvZGVQb2ludChwdHIsICZ1bmljb2RlKTsKKyAgICAgICAgaWYgKGVuZCA9PSBwdHIpIHsKKyAgICAgICAgICAvLyBGYWlsdXJlOiBKdXN0IGR1bXAgb3V0IHdoYXQgd2Ugc2F3LCBkb24ndCB0cnkgdG8gcGFyc2UgaXQuCisgICAgICAgICAgb3V0cHV0LT5wdXNoX2JhY2soKnB0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQXBwZW5kVVRGOCh1bmljb2RlLCBvdXRwdXQpOworICAgICAgICAgIHB0ciA9IGVuZCAtIDE7ICAvLyBCZWNhdXNlIHdlJ3JlIGFib3V0IHRvICsrcHRyLgorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBTb21lIG90aGVyIGVzY2FwZSBjb2RlLgorICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhUcmFuc2xhdGVFc2NhcGUoKnB0cikpOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICgqcHRyID09IHRleHRbMF0gJiYgcHRyWzFdID09ICdcMCcpIHsKKyAgICAgIC8vIElnbm9yZSBmaW5hbCBxdW90ZSBtYXRjaGluZyB0aGUgc3RhcnRpbmcgcXVvdGUuCisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dC0+cHVzaF9iYWNrKCpwdHIpOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWI4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmgKQEAgLTAsMCArMSwzODQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIENsYXNzIGZvciBwYXJzaW5nIHRva2VuaXplZCB0ZXh0IGZyb20gYSBaZXJvQ29weUlucHV0U3RyZWFtLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19UT0tFTklaRVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19UT0tFTklaRVJfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsgICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAorCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIEVycm9yQ29sbGVjdG9yOworY2xhc3MgVG9rZW5pemVyOworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB3aGljaCBjb2xsZWN0cyB0aGUgZXJyb3JzIHRoYXQgb2NjdXIKKy8vIGR1cmluZyBwYXJzaW5nLiAgQSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIG1pZ2h0IHNpbXBseSBwcmludCB0aGUgZXJyb3JzCisvLyB0byBzdGRvdXQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgaW5saW5lIEVycm9yQ29sbGVjdG9yKCkge30KKyAgdmlydHVhbCB+RXJyb3JDb2xsZWN0b3IoKTsKKworICAvLyBJbmRpY2F0ZXMgdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGlucHV0IGF0IHRoZSBnaXZlbiBsaW5lIGFuZAorICAvLyBjb2x1bW4gbnVtYmVycy4gIFRoZSBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkLCBzbyB5b3UgbWF5IHdhbnQgdG8gYWRkCisgIC8vIDEgdG8gZWFjaCBiZWZvcmUgcHJpbnRpbmcgdGhlbS4KKyAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpID0gMDsKKworICAvLyBJbmRpY2F0ZXMgdGhhdCB0aGVyZSB3YXMgYSB3YXJuaW5nIGluIHRoZSBpbnB1dCBhdCB0aGUgZ2l2ZW4gbGluZSBhbmQKKyAgLy8gY29sdW1uIG51bWJlcnMuICBUaGUgbnVtYmVycyBhcmUgemVyby1iYXNlZCwgc28geW91IG1heSB3YW50IHRvIGFkZAorICAvLyAxIHRvIGVhY2ggYmVmb3JlIHByaW50aW5nIHRoZW0uCisgIHZpcnR1YWwgdm9pZCBBZGRXYXJuaW5nKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsgfQorCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVycm9yQ29sbGVjdG9yKTsKK307CisKKy8vIFRoaXMgY2xhc3MgY29udmVydHMgYSBzdHJlYW0gb2YgcmF3IHRleHQgaW50byBhIHN0cmVhbSBvZiB0b2tlbnMgZm9yCisvLyB0aGUgcHJvdG9jb2wgZGVmaW5pdGlvbiBwYXJzZXIgdG8gcGFyc2UuICBUaGUgdG9rZW5zIHJlY29nbml6ZWQgYXJlCisvLyBzaW1pbGFyIHRvIHRob3NlIHRoYXQgbWFrZSB1cCB0aGUgQyBsYW5ndWFnZTsgc2VlIHRoZSBUb2tlblR5cGUgZW51bSBmb3IKKy8vIHByZWNpc2UgZGVzY3JpcHRpb25zLiAgV2hpdGVzcGFjZSBhbmQgY29tbWVudHMgYXJlIHNraXBwZWQuICBCeSBkZWZhdWx0LAorLy8gQy0gYW5kIEMrKy1zdHlsZSBjb21tZW50cyBhcmUgcmVjb2duaXplZCwgYnV0IG90aGVyIHN0eWxlcyBjYW4gYmUgdXNlZCBieQorLy8gY2FsbGluZyBzZXRfY29tbWVudF9zdHlsZSgpLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFRva2VuaXplciB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3QgYSBUb2tlbml6ZXIgdGhhdCByZWFkcyBhbmQgdG9rZW5pemVzIHRleHQgZnJvbSB0aGUgZ2l2ZW4KKyAgLy8gaW5wdXQgc3RyZWFtIGFuZCB3cml0ZXMgZXJyb3JzIHRvIHRoZSBnaXZlbiBlcnJvcl9jb2xsZWN0b3IuCisgIC8vIFRoZSBjYWxsZXIga2VlcHMgb3duZXJzaGlwIG9mIGlucHV0IGFuZCBlcnJvcl9jb2xsZWN0b3IuCisgIFRva2VuaXplcihaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcik7CisgIH5Ub2tlbml6ZXIoKTsKKworICBlbnVtIFRva2VuVHlwZSB7CisgICAgVFlQRV9TVEFSVCwgICAgICAgLy8gTmV4dCgpIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkLgorICAgIFRZUEVfRU5ELCAgICAgICAgIC8vIEVuZCBvZiBpbnB1dCByZWFjaGVkLiAgInRleHQiIGlzIGVtcHR5LgorCisgICAgVFlQRV9JREVOVElGSUVSLCAgLy8gQSBzZXF1ZW5jZSBvZiBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3Jlcywgbm90CisgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgd2l0aCBhIGRpZ2l0LiAgSXQgaXMgYW4gZXJyb3IgZm9yIGEgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciB3aXRoIG5vIHNwYWNlIGluCisgICAgICAgICAgICAgICAgICAgICAgLy8gYmV0d2Vlbi4KKyAgICBUWVBFX0lOVEVHRVIsICAgICAvLyBBIHNlcXVlbmNlIG9mIGRpZ2l0cyByZXByZXNlbnRpbmcgYW4gaW50ZWdlci4gIE5vcm1hbGx5CisgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRpZ2l0cyBhcmUgZGVjaW1hbCwgYnV0IGEgcHJlZml4IG9mICIweCIgaW5kaWNhdGVzCisgICAgICAgICAgICAgICAgICAgICAgLy8gYSBoZXggbnVtYmVyIGFuZCBhIGxlYWRpbmcgemVybyBpbmRpY2F0ZXMgb2N0YWwsIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIHdpdGggQyBudW1lcmljIGxpdGVyYWxzLiAgQSBsZWFkaW5nIG5lZ2F0aXZlIHNpZ24KKyAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBOT1QgaW5jbHVkZWQgaW4gdGhlIHRva2VuOyBpdCdzIHVwIHRvIHRoZSBwYXJzZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnByZXQgdGhlIHVuYXJ5IG1pbnVzIG9wZXJhdG9yIG9uIGl0cyBvd24uCisgICAgVFlQRV9GTE9BVCwgICAgICAgLy8gQSBmbG9hdGluZyBwb2ludCBsaXRlcmFsLCB3aXRoIGEgZnJhY3Rpb25hbCBwYXJ0IGFuZC9vcgorICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGV4cG9uZW50LiAgQWx3YXlzIGluIGRlY2ltYWwuICBBZ2FpbiwgbmV2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZS4KKyAgICBUWVBFX1NUUklORywgICAgICAvLyBBIHF1b3RlZCBzZXF1ZW5jZSBvZiBlc2NhcGVkIGNoYXJhY3RlcnMuICBFaXRoZXIgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgZG91YmxlIHF1b3RlcyBjYW4gYmUgdXNlZCwgYnV0IHRoZXkgbXVzdCBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBjcm9zcyBhIGxpbmUgYnJlYWsuCisgICAgVFlQRV9TWU1CT0wsICAgICAgLy8gQW55IG90aGVyIHByaW50YWJsZSBjaGFyYWN0ZXIsIGxpa2UgJyEnIG9yICcrJy4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2xzIGFyZSBhbHdheXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBzbyAiISskJSIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VyIHRva2Vucy4KKyAgfTsKKworICAvLyBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgdG9rZW4gcmVhZCBmcm9tIHRoZSB0b2tlbiBzdHJlYW0uCisgIHN0cnVjdCBUb2tlbiB7CisgICAgVG9rZW5UeXBlIHR5cGU7CisgICAgc3RyaW5nIHRleHQ7ICAgICAgIC8vIFRoZSBleGFjdCB0ZXh0IG9mIHRoZSB0b2tlbiBhcyBpdCBhcHBlYXJlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQuICBlLmcuIHRva2VucyBvZiBUWVBFX1NUUklORyB3aWxsIHN0aWxsCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGVzY2FwZWQgYW5kIGluIHF1b3Rlcy4KKworICAgIC8vICJsaW5lIiBhbmQgImNvbHVtbiIgc3BlY2lmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZgorICAgIC8vIHRoZSB0b2tlbiB3aXRoaW4gdGhlIGlucHV0IHN0cmVhbS4gIFRoZXkgYXJlIHplcm8tYmFzZWQuCisgICAgaW50IGxpbmU7CisgICAgaW50IGNvbHVtbjsKKyAgICBpbnQgZW5kX2NvbHVtbjsKKyAgfTsKKworICAvLyBHZXQgdGhlIGN1cnJlbnQgdG9rZW4uICBUaGlzIGlzIHVwZGF0ZWQgd2hlbiBOZXh0KCkgaXMgY2FsbGVkLiAgQmVmb3JlCisgIC8vIHRoZSBmaXJzdCBjYWxsIHRvIE5leHQoKSwgY3VycmVudCgpIGhhcyB0eXBlIFRZUEVfU1RBUlQgYW5kIG5vIGNvbnRlbnRzLgorICBjb25zdCBUb2tlbiYgY3VycmVudCgpOworCisgIC8vIFJldHVybiB0aGUgcHJldmlvdXMgdG9rZW4gLS0gaS5lLiB3aGF0IGN1cnJlbnQoKSByZXR1cm5lZCBiZWZvcmUgdGhlCisgIC8vIHByZXZpb3VzIGNhbGwgdG8gTmV4dCgpLgorICBjb25zdCBUb2tlbiYgcHJldmlvdXMoKTsKKworICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHRva2VuLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcworICAvLyByZWFjaGVkLgorICBib29sIE5leHQoKTsKKworICAvLyBMaWtlIE5leHQoKSwgYnV0IGFsc28gY29sbGVjdHMgY29tbWVudHMgd2hpY2ggYXBwZWFyIGJldHdlZW4gdGhlIHByZXZpb3VzCisgIC8vIGFuZCBuZXh0IHRva2Vucy4KKyAgLy8KKyAgLy8gQ29tbWVudHMgd2hpY2ggYXBwZWFyIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyB0b2tlbiBhcmUgc3RvcmVkCisgIC8vIGluICpwcmV2X3RhaWxpbmdfY29tbWVudHMuICBDb21tZW50cyB3aGljaCBhcHBlYXIgdG8gYmUgYXR0YWNoZWQgdG8gdGhlCisgIC8vIG5leHQgdG9rZW4gYXJlIHN0b3JlZCBpbiAqbmV4dF9sZWFkaW5nX2NvbW1lbnRzLiAgQ29tbWVudHMgYXBwZWFyaW5nIGluCisgIC8vIGJldHdlZW4gd2hpY2ggZG8gbm90IGFwcGVhciB0byBiZSBhdHRhY2hlZCB0byBlaXRoZXIgd2lsbCBiZSBhZGRlZCB0bworICAvLyBkZXRhY2hlZF9jb21tZW50cy4gIEFueSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBOVUxMIHRvIHNpbXBseSBkaXNjYXJkCisgIC8vIHRoZSBjb21tZW50cy4KKyAgLy8KKyAgLy8gQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKKyAgLy8gdG9rZW5zIGFwcGVhcmluZyBvbiB0aG9zZSBsaW5lcywgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIGNvbW1lbnQuCisgIC8vCisgIC8vIE9ubHkgdGhlIGNvbW1lbnQgY29udGVudCBpcyByZXR1cm5lZDsgY29tbWVudCBtYXJrZXJzIChlLmcuIC8vKSBhcmUKKyAgLy8gc3RyaXBwZWQgb3V0LiAgRm9yIGJsb2NrIGNvbW1lbnRzLCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFuIGFzdGVyaXNrIHdpbGwKKyAgLy8gYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4gIE5ld2xpbmVzCisgIC8vIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorICAvLworICAvLyBFeGFtcGxlczoKKyAgLy8KKyAgLy8gICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOyAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBmb28uCisgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCisgIC8vICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKKyAgLy8KKyAgLy8gICBvcHRpb25hbCBzdHJpbmcgYmF6ID0gMzsKKyAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KKyAgLy8gICAvLyBBbm90aGVyIGxpbmUgYXR0YWNoZWQgdG8gYmF6LgorICAvLworICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gcXV4LgorICAvLyAgIC8vCisgIC8vICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIHF1eC4KKyAgLy8gICBvcHRpb25hbCBkb3VibGUgcXV4ID0gNDsKKyAgLy8KKyAgLy8gICAvLyBEZXRhY2hlZCBjb21tZW50LiAgVGhpcyBpcyBub3QgYXR0YWNoZWQgdG8gcXV4IG9yIGNvcmdlCisgIC8vICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgYmxhbmsgbGluZXMgc2VwYXJhdGluZyBpdCBmcm9tIGJvdGguCisgIC8vCisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGNvcmdlID0gNTsKKyAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkCisgIC8vICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcworICAvLyAgICAqIHdpbGwgYmUgcmVtb3ZlZC4gKi8KKyAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkIHRvCisgIC8vICAgICogZ3JhdWx0LiAqLworICAvLyAgIG9wdGlvbmFsIGludDMyIGdyYXVsdCA9IDY7CisgIGJvb2wgTmV4dFdpdGhDb21tZW50cyhzdHJpbmcqIHByZXZfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIG5leHRfbGVhZGluZ19jb21tZW50cyk7CisKKyAgLy8gUGFyc2UgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBQYXJzZXMgYSBUWVBFX0ZMT0FUIHRva2VuLiAgVGhpcyBuZXZlciBmYWlscywgc28gbG9uZyBhcyB0aGUgdGV4dCBhY3R1YWxseQorICAvLyBjb21lcyBmcm9tIGEgVFlQRV9GTE9BVCB0b2tlbiBwYXJzZWQgYnkgVG9rZW5pemVyLiAgSWYgaXQgZG9lc24ndCwgdGhlCisgIC8vIHJlc3VsdCBpcyB1bmRlZmluZWQgKHBvc3NpYmx5IGFuIGFzc2VydCBmYWlsdXJlKS4KKyAgc3RhdGljIGRvdWJsZSBQYXJzZUZsb2F0KGNvbnN0IHN0cmluZyYgdGV4dCk7CisKKyAgLy8gUGFyc2VzIGEgVFlQRV9TVFJJTkcgdG9rZW4uICBUaGlzIG5ldmVyIGZhaWxzLCBzbyBsb25nIGFzIHRoZSB0ZXh0IGFjdHVhbGx5CisgIC8vIGNvbWVzIGZyb20gYSBUWVBFX1NUUklORyB0b2tlbiBwYXJzZWQgYnkgVG9rZW5pemVyLiAgSWYgaXQgZG9lc24ndCwgdGhlCisgIC8vIHJlc3VsdCBpcyB1bmRlZmluZWQgKHBvc3NpYmx5IGFuIGFzc2VydCBmYWlsdXJlKS4KKyAgc3RhdGljIHZvaWQgUGFyc2VTdHJpbmcoY29uc3Qgc3RyaW5nJiB0ZXh0LCBzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gSWRlbnRpY2FsIHRvIFBhcnNlU3RyaW5nLCBidXQgYXBwZW5kcyB0byBvdXRwdXQuCisgIHN0YXRpYyB2b2lkIFBhcnNlU3RyaW5nQXBwZW5kKGNvbnN0IHN0cmluZyYgdGV4dCwgc3RyaW5nKiBvdXRwdXQpOworCisgIC8vIFBhcnNlcyBhIFRZUEVfSU5URUdFUiB0b2tlbi4gIFJldHVybnMgZmFsc2UgaWYgdGhlIHJlc3VsdCB3b3VsZCBiZQorICAvLyBncmVhdGVyIHRoYW4gbWF4X3ZhbHVlLiAgT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUgYW5kIHNldHMgKm91dHB1dCB0byB0aGUKKyAgLy8gcmVzdWx0LiAgSWYgdGhlIHRleHQgaXMgbm90IGZyb20gYSBUb2tlbiBvZiB0eXBlIFRZUEVfSU5URUdFUiBvcmlnaW5hbGx5CisgIC8vIHBhcnNlZCBieSBhIFRva2VuaXplciwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgKHBvc3NpYmx5IGFuIGFzc2VydAorICAvLyBmYWlsdXJlKS4KKyAgc3RhdGljIGJvb2wgUGFyc2VJbnRlZ2VyKGNvbnN0IHN0cmluZyYgdGV4dCwgdWludDY0IG1heF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCogb3V0cHV0KTsKKworICAvLyBPcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFNldCB0cnVlIHRvIGFsbG93IGZsb2F0cyB0byBiZSBzdWZmaXhlZCB3aXRoIHRoZSBsZXR0ZXIgJ2YnLiAgVG9rZW5zCisgIC8vIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBpbnRlZ2VycyBidXQgd2hpY2ggaGF2ZSB0aGUgJ2YnIHN1ZmZpeCB3aWxsIGJlCisgIC8vIGZvcmNlZCB0byBiZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMuICBGb3IgYWxsIG90aGVyIHB1cnBvc2VzLCB0aGUgJ2YnIGlzCisgIC8vIGlnbm9yZWQuCisgIHZvaWQgc2V0X2FsbG93X2ZfYWZ0ZXJfZmxvYXQoYm9vbCB2YWx1ZSkgeyBhbGxvd19mX2FmdGVyX2Zsb2F0XyA9IHZhbHVlOyB9CisKKyAgLy8gVmFsaWQgdmFsdWVzIGZvciBzZXRfY29tbWVudF9zdHlsZSgpLgorICBlbnVtIENvbW1lbnRTdHlsZSB7CisgICAgLy8gTGluZSBjb21tZW50cyBiZWdpbiB3aXRoICIvLyIsIGJsb2NrIGNvbW1lbnRzIGFyZSBkZWxpbWl0ZWQgYnkgIi8qIiBhbmQKKyAgICAvLyAiKi8iLgorICAgIENQUF9DT01NRU5UX1NUWUxFLAorICAgIC8vIExpbmUgY29tbWVudHMgYmVnaW4gd2l0aCAiIyIuICBObyB3YXkgdG8gd3JpdGUgYmxvY2sgY29tbWVudHMuCisgICAgU0hfQ09NTUVOVF9TVFlMRQorICB9OworCisgIC8vIFNldHMgdGhlIGNvbW1lbnQgc3R5bGUuCisgIHZvaWQgc2V0X2NvbW1lbnRfc3R5bGUoQ29tbWVudFN0eWxlIHN0eWxlKSB7IGNvbW1lbnRfc3R5bGVfID0gc3R5bGU7IH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUb2tlbml6ZXIpOworCisgIFRva2VuIGN1cnJlbnRfOyAgICAgICAgICAgLy8gUmV0dXJuZWQgYnkgY3VycmVudCgpLgorICBUb2tlbiBwcmV2aW91c187ICAgICAgICAgIC8vIFJldHVybmVkIGJ5IHByZXZpb3VzKCkuCisKKyAgWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXRfOworICBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKKworICBjaGFyIGN1cnJlbnRfY2hhcl87ICAgICAgIC8vID09IGJ1ZmZlcl9bYnVmZmVyX3Bvc19dLCB1cGRhdGVkIGJ5IE5leHRDaGFyKCkuCisgIGNvbnN0IGNoYXIqIGJ1ZmZlcl87ICAgICAgLy8gQ3VycmVudCBidWZmZXIgcmV0dXJuZWQgZnJvbSBpbnB1dF8uCisgIGludCBidWZmZXJfc2l6ZV87ICAgICAgICAgLy8gU2l6ZSBvZiBidWZmZXJfLgorICBpbnQgYnVmZmVyX3Bvc187ICAgICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBidWZmZXIuCisgIGJvb2wgcmVhZF9lcnJvcl87ICAgICAgICAgLy8gRGlkIHdlIHByZXZpb3VzbHkgZW5jb3VudGVyIGEgcmVhZCBlcnJvcj8KKworICAvLyBMaW5lIGFuZCBjb2x1bW4gbnVtYmVyIG9mIGN1cnJlbnRfY2hhcl8gd2l0aGluIHRoZSB3aG9sZSBpbnB1dCBzdHJlYW0uCisgIGludCBsaW5lXzsKKyAgaW50IGNvbHVtbl87CisKKyAgLy8gU3RyaW5nIHRvIHdoaWNoIHRleHQgc2hvdWxkIGJlIGFwcGVuZGVkIGFzIHdlIGFkdmFuY2UgdGhyb3VnaCBpdC4KKyAgLy8gQ2FsbCBSZWNvcmRUbygmc3RyKSB0byBzdGFydCByZWNvcmRpbmcgYW5kIFN0b3BSZWNvcmRpbmcoKSB0byBzdG9wLgorICAvLyBFLmcuIFN0YXJ0VG9rZW4oKSBjYWxscyBSZWNvcmRUbygmY3VycmVudF8udGV4dCkuICByZWNvcmRfc3RhcnRfIGlzIHRoZQorICAvLyBwb3NpdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVyIHdoZXJlIHJlY29yZGluZyBzdGFydGVkLgorICBzdHJpbmcqIHJlY29yZF90YXJnZXRfOworICBpbnQgcmVjb3JkX3N0YXJ0XzsKKworICAvLyBPcHRpb25zLgorICBib29sIGFsbG93X2ZfYWZ0ZXJfZmxvYXRfOworICBDb21tZW50U3R5bGUgY29tbWVudF9zdHlsZV87CisKKyAgLy8gU2luY2Ugd2UgY291bnQgY29sdW1ucyB3ZSBuZWVkIHRvIGludGVycHJldCB0YWJzIHNvbWVob3cuICBXZSdsbCB0YWtlCisgIC8vIHRoZSBzdGFuZGFyZCA4LWNoYXJhY3RlciBkZWZpbml0aW9uIGZvciBsYWNrIG9mIGFueSB3YXkgdG8gZG8gYmV0dGVyLgorICBzdGF0aWMgY29uc3QgaW50IGtUYWJXaWR0aCA9IDg7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSGVscGVyIG1ldGhvZHMuCisKKyAgLy8gQ29uc3VtZSB0aGlzIGNoYXJhY3RlciBhbmQgYWR2YW5jZSB0byB0aGUgbmV4dCBvbmUuCisgIHZvaWQgTmV4dENoYXIoKTsKKworICAvLyBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBpbnB1dC4KKyAgdm9pZCBSZWZyZXNoKCk7CisKKyAgaW5saW5lIHZvaWQgUmVjb3JkVG8oc3RyaW5nKiB0YXJnZXQpOworICBpbmxpbmUgdm9pZCBTdG9wUmVjb3JkaW5nKCk7CisKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBuZXcKKyAgLy8gdG9rZW4gKG5vdCBpbmNsdWRpbmcgd2hpdGVzcGFjZSBvciBjb21tZW50cykuCisgIGlubGluZSB2b2lkIFN0YXJ0VG9rZW4oKTsKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlCisgIC8vIGVuZCBvZiB0aGUgbGFzdCB0b2tlbi4gIEFmdGVyIHRoaXMgcmV0dXJucywgY3VycmVudF8udGV4dCB3aWxsCisgIC8vIGNvbnRhaW4gYWxsIHRleHQgY29uc3VtZWQgc2luY2UgU3RhcnRUb2tlbigpIHdhcyBjYWxsZWQuCisgIGlubGluZSB2b2lkIEVuZFRva2VuKCk7CisKKyAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCBhbiBlcnJvciBhdCB0aGUgY3VycmVudCBsaW5lIGFuZCBjb2x1bW4uCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZV8sIGNvbHVtbl8sIG1lc3NhZ2UpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlIGZvbGxvd2luZyBmb3VyIG1ldGhvZHMgYXJlIHVzZWQgdG8gY29uc3VtZSB0b2tlbnMgb2Ygc3BlY2lmaWMKKyAgLy8gdHlwZXMuICBUaGV5IGFyZSBhY3R1YWxseSB1c2VkIHRvIGNvbnN1bWUgYWxsIGNoYXJhY3RlcnMgKmFmdGVyKgorICAvLyB0aGUgZmlyc3QsIHNpbmNlIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGNvbnN1bWVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgLy8gaW4gb3JkZXIgdG8gZGVjaWRlIHdoYXQga2luZCBvZiB0b2tlbiBpcyBiZWluZyByZWFkLgorCisgIC8vIFJlYWQgYW5kIGNvbnN1bWUgYSBzdHJpbmcsIGVuZGluZyB3aGVuIHRoZSBnaXZlbiBkZWxpbWl0ZXIgaXMKKyAgLy8gY29uc3VtZWQuCisgIHZvaWQgQ29uc3VtZVN0cmluZyhjaGFyIGRlbGltaXRlcik7CisKKyAgLy8gUmVhZCBhbmQgY29uc3VtZSBhIG51bWJlciwgcmV0dXJuaW5nIFRZUEVfRkxPQVQgb3IgVFlQRV9JTlRFR0VSCisgIC8vIGRlcGVuZGluZyBvbiB3aGF0IHdhcyByZWFkLiAgVGhpcyBuZWVkcyB0byBrbm93IGlmIHRoZSBmaXJzdAorICAvLyBjaGFyYWN0ZXIgd2FzIGEgemVybyBpbiBvcmRlciB0byBjb3JyZWN0bHkgcmVjb2duaXplIGhleCBhbmQgb2N0YWwKKyAgLy8gbnVtYmVycy4KKyAgLy8gSXQgYWxzbyBuZWVkcyB0byBrbm93IGlmIHRoZSBmaXJzdCBjaGFyYWN0ZWQgd2FzIGEgLiB0byBwYXJzZSBmbG9hdGluZworICAvLyBwb2ludCBjb3JyZWN0bHkuCisgIFRva2VuVHlwZSBDb25zdW1lTnVtYmVyKGJvb2wgc3RhcnRlZF93aXRoX3plcm8sIGJvb2wgc3RhcnRlZF93aXRoX2RvdCk7CisKKyAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiBhIGxpbmUuCisgIHZvaWQgQ29uc3VtZUxpbmVDb21tZW50KHN0cmluZyogY29udGVudCk7CisgIC8vIENvbnN1bWUgdW50aWwgIiovIi4KKyAgdm9pZCBDb25zdW1lQmxvY2tDb21tZW50KHN0cmluZyogY29udGVudCk7CisKKyAgZW51bSBOZXh0Q29tbWVudFN0YXR1cyB7CisgICAgLy8gU3RhcnRlZCBhIGxpbmUgY29tbWVudC4KKyAgICBMSU5FX0NPTU1FTlQsCisKKyAgICAvLyBTdGFydGVkIGEgYmxvY2sgY29tbWVudC4KKyAgICBCTE9DS19DT01NRU5ULAorCisgICAgLy8gQ29uc3VtZWQgYSBzbGFzaCwgdGhlbiByZWFsaXplZCBpdCB3YXNuJ3QgYSBjb21tZW50LiAgY3VycmVudF8gaGFzCisgICAgLy8gYmVlbiBmaWxsZWQgaW4gd2l0aCBhIHNsYXNoIHRva2VuLiAgVGhlIGNhbGxlciBzaG91bGQgcmV0dXJuIGl0LgorICAgIFNMQVNIX05PVF9DT01NRU5ULAorCisgICAgLy8gV2UgZG8gbm90IGFwcGVhciB0byBiZSBzdGFydGluZyBhIGNvbW1lbnQgaGVyZS4KKyAgICBOT19DT01NRU5UCisgIH07CisKKyAgLy8gSWYgd2UncmUgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IGNvbW1lbnQsIGNvbnN1bWUgaXQgYW5kIHJldHVybiB3aGF0IGtpbmQKKyAgLy8gb2YgY29tbWVudCBpdCBpcy4KKyAgTmV4dENvbW1lbnRTdGF0dXMgVHJ5Q29uc3VtZUNvbW1lbnRTdGFydCgpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIGhlbHBlciBtZXRob2RzIG1ha2UgdGhlIHBhcnNpbmcgY29kZSBtb3JlIHJlYWRhYmxlLiAgVGhlCisgIC8vICJjaGFyYWN0ZXIgY2xhc3NlcyIgcmVmZXJlZCB0byBhcmUgZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRoZSAuY2MgZmlsZS4KKyAgLy8gQmFzaWNhbGx5IGl0IGlzIGEgQysrIGNsYXNzIHdpdGggb25lIG1ldGhvZDoKKyAgLy8gICBzdGF0aWMgYm9vbCBJbkNsYXNzKGNoYXIgYyk7CisgIC8vIFRoZSBtZXRob2QgcmV0dXJucyB0cnVlIGlmIGMgaXMgYSBtZW1iZXIgb2YgdGhpcyAiY2xhc3MiLCBsaWtlICJMZXR0ZXIiCisgIC8vIG9yICJEaWdpdCIuCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyCisgIC8vIGNsYXNzLCBidXQgZG9lcyBub3QgY29uc3VtZSBhbnl0aGluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+CisgIGlubGluZSBib29sIExvb2tpbmdBdCgpOworCisgIC8vIElmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBpbiB0aGUgZ2l2ZW4gY2xhc3MsIGNvbnN1bWUgaXQgYW5kIHJldHVybgorICAvLyB0cnVlLiAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgLy8gZS5nLiBUcnlDb25zdW1lT25lPExldHRlcj4oKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KKyAgaW5saW5lIGJvb2wgVHJ5Q29uc3VtZU9uZSgpOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCB0cnkgdG8gY29uc3VtZSB0aGUgc3BlY2lmaWMgY2hhcmFjdGVyIGluZGljYXRlZC4KKyAgaW5saW5lIGJvb2wgVHJ5Q29uc3VtZShjaGFyIGMpOworCisgIC8vIENvbnN1bWUgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY2xhc3MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgorICBpbmxpbmUgdm9pZCBDb25zdW1lWmVyb09yTW9yZSgpOworCisgIC8vIENvbnN1bWUgb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGNoYXJhY3RlciBjbGFzcyBvciBsb2cgdGhlIGdpdmVuCisgIC8vIGVycm9yIG1lc3NhZ2UuCisgIC8vIGUuZy4gQ29uc3VtZU9uZU9yTW9yZTxEaWdpdD4oIkV4cGVjdGVkIGRpZ2l0cy4iKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+CisgIGlubGluZSB2b2lkIENvbnN1bWVPbmVPck1vcmUoY29uc3QgY2hhciogZXJyb3IpOworfTsKKworLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW5saW5lIGNvbnN0IFRva2VuaXplcjo6VG9rZW4mIFRva2VuaXplcjo6Y3VycmVudCgpIHsKKyAgcmV0dXJuIGN1cnJlbnRfOworfQorCitpbmxpbmUgY29uc3QgVG9rZW5pemVyOjpUb2tlbiYgVG9rZW5pemVyOjpwcmV2aW91cygpIHsKKyAgcmV0dXJuIHByZXZpb3VzXzsKK30KKworaW5saW5lIHZvaWQgVG9rZW5pemVyOjpQYXJzZVN0cmluZyhjb25zdCBzdHJpbmcmIHRleHQsIHN0cmluZyogb3V0cHV0KSB7CisgIG91dHB1dC0+Y2xlYXIoKTsKKyAgUGFyc2VTdHJpbmdBcHBlbmQodGV4dCwgb3V0cHV0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fVE9LRU5JWkVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNWJlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMDAxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworbmFtZXNwYWNlIHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRGF0YS1Ecml2ZW4gVGVzdCBJbmZyYXN0cnVjdHVyZQorCisvLyBUT0RPKGtlbnRvbik6ICBUaGlzIGlzIGNvcGllZCBmcm9tIGNvZGVkX3N0cmVhbV91bml0dGVzdC4gIFRoaXMgaXMKKy8vICAgdGVtcG9yYXJ5IHVudGlsIHRoZXNlIGZldGF1cmVzIGFyZSBpbnRlZ3JhdGVkIGludG8gZ1Rlc3QgaXRzZWxmLgorCisvLyBURVNUXzFEIGFuZCBURVNUXzJEIGFyZSBtYWNyb3MgSSdkIGV2ZW50dWFsbHkgbGlrZSB0byBzZWUgYWRkZWQgdG8KKy8vIGdUZXN0LiAgVGhlc2UgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUgdGVzdHMgd2hpY2ggc2hvdWxkIGJlCisvLyBydW4gbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yIGVhY2ggaXRlbSBpbiBzb21lIGlucHV0IGFycmF5LiAgVEVTVF8xRAorLy8gdGVzdHMgYWxsIGNhc2VzIGluIGEgc2luZ2xlIGlucHV0IGFycmF5LiAgVEVTVF8yRCB0ZXN0cyBhbGwKKy8vIGNvbWJpbmF0aW9ucyBvZiBjYXNlcyBmcm9tIHR3byBhcnJheXMuICBUaGUgYXJyYXlzIG11c3QgYmUgc3RhdGljYWxseQorLy8gZGVmaW5lZCBzdWNoIHRoYXQgdGhlIEdPT0dMRV9BUlJBWVNJWkUoKSBtYWNybyB3b3JrcyBvbiB0aGVtLiAgRXhhbXBsZToKKy8vCisvLyBpbnQga0Nhc2VzW10gPSB7MSwgMiwgMywgNH0KKy8vIFRFU1RfMUQoTXlGaXh0dXJlLCBNeVRlc3QsIGtDYXNlcykgeworLy8gICBFWFBFQ1RfR1Qoa0Nhc2VzX2Nhc2UsIDApOworLy8gfQorLy8KKy8vIFRoaXMgdGVzdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBudW1iZXJzIDEsIDIsIDMsIGFuZCA0IGFuZCB0ZXN0cyB0aGF0CisvLyB0aGV5IGFyZSBhbGwgZ3JhdGVyIHRoYW4gemVyby4gIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIGV4YWN0IGNhc2UKKy8vIHdoaWNoIGZhaWxlZCB3aWxsIGJlIHByaW50ZWQuICBUaGUgY2FzZSB0eXBlIG11c3QgYmUgcHJpbnRhYmxlIHVzaW5nCisvLyBvc3RyZWFtOjpvcGVyYXRvcjw8LgorCisjZGVmaW5lIFRFU1RfMUQoRklYVFVSRSwgTkFNRSwgQ0FTRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIEZJWFRVUkUjI18jI05BTUUjI19ERCA6IHB1YmxpYyBGSVhUVVJFIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUmIENBU0VTIyNfY2FzZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRFU1RfRihGSVhUVVJFIyNfIyNOQU1FIyNfREQsIE5BTUUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA8PCAjQ0FTRVMgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFU1tpXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRG9TaW5nbGVDYXNlKENBU0VTW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEZJWFRVUkUjI18jI05BTUUjI19ERDo6RG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlJiBDQVNFUyMjX2Nhc2UpCisKKyNkZWZpbmUgVEVTVF8yRChGSVhUVVJFLCBOQU1FLCBDQVNFUzEsIENBU0VTMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgRklYVFVSRSMjXyMjTkFNRSMjX0REIDogcHVibGljIEZJWFRVUkUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGUxLCB0eXBlbmFtZSBDYXNlVHlwZTI+ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIERvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZTEmIENBU0VTMSMjX2Nhc2UsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXNlVHlwZTImIENBU0VTMiMjX2Nhc2UpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEVTVF9GKEZJWFRVUkUjI18jI05BTUUjI19ERCwgTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMxKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMyKTsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDw8ICNDQVNFUzEgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFUzFbaV0gPDwgIiwgIiAgICAgICAgICAgXAorICAgICAgICAgIDw8ICNDQVNFUzIgIiBjYXNlICMiIDw8IGogPDwgIjogIiA8PCBDQVNFUzJbal0pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBEb1NpbmdsZUNhc2UoQ0FTRVMxW2ldLCBDQVNFUzJbal0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGUxLCB0eXBlbmFtZSBDYXNlVHlwZTI+ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEZJWFRVUkUjI18jI05BTUUjI19ERDo6RG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlMSYgQ0FTRVMxIyNfY2FzZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc2VUeXBlMiYgQ0FTRVMyIyNfY2FzZSkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBbiBpbnB1dCBzdHJlYW0gdGhhdCBpcyBiYXNpY2FsbHkgbGlrZSBhbiBBcnJheUlucHV0U3RyZWFtIGJ1dCBzb21ldGltZXMKKy8vIHJldHVybnMgZW1wdHkgYnVmZmVycywganVzdCB0byB0aHJvdyB1cyBvZmYuCitjbGFzcyBUZXN0SW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICBUZXN0SW5wdXRTdHJlYW0oY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplKQorICAgIDogYXJyYXlfc3RyZWFtXyhkYXRhLCBzaXplLCBibG9ja19zaXplKSwgY291bnRlcl8oMCkge30KKyAgflRlc3RJbnB1dFN0cmVhbSgpIHt9CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgICAvLyBXZSdsbCByZXR1cm4gZW1wdHkgYnVmZmVycyBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBidWZmZXIsIGFuZCBldmVyeQorICAgIC8vIDMgYW5kIDUgYnVmZmVycyBhZnRlciB0aGF0LgorICAgIGlmIChjb3VudGVyXyAlIDMgPT0gMCB8fCBjb3VudGVyXyAlIDUgPT0gMCkgeworICAgICAgKmRhdGEgPSBOVUxMOworICAgICAgKnNpemUgPSAwOworICAgICAgKytjb3VudGVyXzsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICArK2NvdW50ZXJfOworICAgICAgcmV0dXJuIGFycmF5X3N0cmVhbV8uTmV4dChkYXRhLCBzaXplKTsKKyAgICB9CisgIH0KKworICB2b2lkIEJhY2tVcChpbnQgY291bnQpICB7IHJldHVybiBhcnJheV9zdHJlYW1fLkJhY2tVcChjb3VudCk7IH0KKyAgYm9vbCBTa2lwKGludCBjb3VudCkgICAgeyByZXR1cm4gYXJyYXlfc3RyZWFtXy5Ta2lwKGNvdW50KTsgICB9CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFycmF5X3N0cmVhbV8uQnl0ZUNvdW50KCk7ICAgfQorCisgcHJpdmF0ZToKKyAgQXJyYXlJbnB1dFN0cmVhbSBhcnJheV9zdHJlYW1fOworICBpbnQgY291bnRlcl87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEFuIGVycm9yIGNvbGxlY3RvciB3aGljaCBzaW1wbHkgY29uY2F0ZW5hdGVzIGFsbCBpdHMgZXJyb3JzIGludG8gYSBiaWcKKy8vIGJsb2NrIG9mIHRleHQgd2hpY2ggY2FuIGJlIGNoZWNrZWQuCitjbGFzcyBUZXN0RXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgVGVzdEVycm9yQ29sbGVjdG9yKCkge30KKyAgflRlc3RFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgc3RyaW5nIHRleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnRleHRfLCAiJDA6JDE6ICQyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXZSB0ZXN0IGVhY2ggb3BlcmF0aW9uIG92ZXIgYSB2YXJpZXR5IG9mIGJsb2NrIHNpemVzIHRvIGluc3VyZSB0aGF0CisvLyB3ZSB0ZXN0IGNhc2VzIHdoZXJlIHJlYWRzIGNyb3NzIGJ1ZmZlciBib3VuZGFyaWVzIGFzIHdlbGwgYXMgY2FzZXMKKy8vIHdoZXJlIHRoZXkgZG9uJ3QuICBUaGlzIGlzIHNvcnQgb2YgYSBicnV0ZS1mb3JjZSBhcHByb2FjaCB0byB0aGlzLAorLy8gYnV0IGl0J3MgZWFzeSB0byB3cml0ZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLgorY29uc3QgaW50IGtCbG9ja1NpemVzW10gPSB7MSwgMiwgMywgNSwgNywgMTMsIDMyLCAxMDI0fTsKKworY2xhc3MgVG9rZW5pemVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIEZvciBlYXN5IHRlc3RpbmcuCisgIHVpbnQ2NCBQYXJzZUludGVnZXIoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CisgICAgdWludDY0IHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0ZXh0LCBrdWludDY0bWF4LCAmcmVzdWx0KSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUaGVzZSB0ZXN0cyBjYXVzZXMgZ2NjIDMuMy41IChhbmQgZWFybGllcj8pIHRvIGdpdmUgdGhlIGNyeXB0aWMgZXJyb3I6CisvLyAgICJzb3JyeSwgdW5pbXBsZW1lbnRlZDogYG1ldGhvZF9jYWxsX2V4cHInIG5vdCBzdXBwb3J0ZWQgYnkgZHVtcF9leHByIgorI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPiAzKQorCisvLyBJbiBlYWNoIHRlc3QgY2FzZSwgdGhlIGVudGlyZSBpbnB1dCB0ZXh0IHNob3VsZCBwYXJzZSBhcyBhIHNpbmdsZSB0b2tlbgorLy8gb2YgdGhlIGdpdmVuIHR5cGUuCitzdHJ1Y3QgU2ltcGxlVG9rZW5DYXNlIHsKKyAgc3RyaW5nIGlucHV0OworICBUb2tlbml6ZXI6OlRva2VuVHlwZSB0eXBlOworfTsKKworaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlVG9rZW5DYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIG91dCA8PCBDRXNjYXBlKHRlc3RfY2FzZS5pbnB1dCk7Cit9CisKK1NpbXBsZVRva2VuQ2FzZSBrU2ltcGxlVG9rZW5DYXNlc1tdID0geworICAvLyBUZXN0IGlkZW50aWZpZXJzLgorICB7ICJoZWxsbyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSIH0sCisKKyAgLy8gVGVzdCBpbnRlZ2Vycy4KKyAgeyAiMTIzIiwgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAorICB7ICIweGFiNiIsICAgICAgIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSIH0sCisgIHsgIjBYQUI2IiwgICAgICAgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVIgfSwKKyAgeyAiMFgxMjM0NTY3IiwgICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAorICB7ICIweDg5YWJjZGVmIiwgIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSIH0sCisgIHsgIjB4ODlBQkNERUYiLCAgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVIgfSwKKyAgeyAiMDEyMzQ1NjciLCAgICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAorCisgIC8vIFRlc3QgZmxvYXRzLgorICB7ICIxMjMuNDUiLCAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIxLiIsICAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIxZTMiLCAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIxRTMiLCAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIxZS0zIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIxZSszIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIxLmUzIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIxLjJlMyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIuMSIsICAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIuMWUzIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIuMWUtMyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorICB7ICIuMWUrMyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAorCisgIC8vIFRlc3Qgc3RyaW5ncy4KKyAgeyAiJ2hlbGxvJyIsICAgICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCisgIHsgIlwiZm9vXCIiLCAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAorICB7ICInYVwiYiciLCAgICAgIFRva2VuaXplcjo6VFlQRV9TVFJJTkcgfSwKKyAgeyAiXCJhJ2JcIiIsICAgICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCisgIHsgIidhXFwnYiciLCAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAorICB7ICJcImFcXFwiYlwiIiwgIFRva2VuaXplcjo6VFlQRV9TVFJJTkcgfSwKKyAgeyAiJ1xceGYnIiwgICAgICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCisgIHsgIidcXDAnIiwgICAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAorCisgIC8vIFRlc3Qgc3ltYm9scy4KKyAgeyAiKyIsICAgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MIH0sCisgIHsgIi4iLCAgICAgICAgICAgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCB9LAorfTsKKworVEVTVF8yRChUb2tlbml6ZXJUZXN0LCBTaW1wbGVUb2tlbnMsIGtTaW1wbGVUb2tlbkNhc2VzLCBrQmxvY2tTaXplcykgeworICAvLyBTZXQgdXAgdGhlIHRva2VuaXplci4KKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga1NpbXBsZVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIEJlZm9yZSBOZXh0KCkgaXMgY2FsbGVkLCB0aGUgaW5pdGlhbCB0b2tlbiBzaG91bGQgYWx3YXlzIGJlIFRZUEVfU1RBUlQuCisgIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfU1RBUlQsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIC8vIFBhcnNlIHRoZSB0b2tlbi4KKyAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBpdCBoYXMgdGhlIHJpZ2h0IHR5cGUuCisgIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLnR5cGUsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgIC8vIENoZWNrIHRoYXQgaXQgY29udGFpbnMgdGhlIGNvbXBsZXRlIGlucHV0IHRleHQuCisgIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICAvLyBDaGVjayB0aGF0IGl0IGlzIGxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgIHRva2VuaXplci5jdXJyZW50KCkuZW5kX2NvbHVtbik7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgaW5wdXQuCisgIEVYUEVDVF9GQUxTRSh0b2tlbml6ZXIuTmV4dCgpKTsKKworICAvLyBBZnRlciBOZXh0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHRva2VuIHNob3VsZCBoYXZlIHR5cGUgVFlQRV9FTkQuCisgIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfRU5ELCB0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUpOworICBFWFBFQ1RfRVEoIiIsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmxpbmUpOworICBFWFBFQ1RfRVEoa1NpbXBsZVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksIHRva2VuaXplci5jdXJyZW50KCkuY29sdW1uKTsKKyAgRVhQRUNUX0VRKGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAorICAgICAgICAgICAgdG9rZW5pemVyLmN1cnJlbnQoKS5lbmRfY29sdW1uKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXJyb3JzLgorICBFWFBFQ1RfVFJVRShlcnJvcl9jb2xsZWN0b3IudGV4dF8uZW1wdHkoKSk7Cit9CisKK1RFU1RfMUQoVG9rZW5pemVyVGVzdCwgRmxvYXRTdWZmaXgsIGtCbG9ja1NpemVzKSB7CisgIC8vIFRlc3QgdGhlICJhbGxvd19mX2FmdGVyX2Zsb2F0IiBvcHRpb24uCisKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIGNvbnN0IGNoYXIqIHRleHQgPSAiMWYgMi41ZiA2ZTNmIDdGIjsKKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KHRleHQsIHN0cmxlbih0ZXh0KSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKyAgdG9rZW5pemVyLnNldF9hbGxvd19mX2FmdGVyX2Zsb2F0KHRydWUpOworCisgIC8vIEFkdmFuY2UgdGhyb3VnaCB0b2tlbnMgYW5kIGNoZWNrIHRoYXQgdGhleSBhcmUgcGFyc2VkIGFzIGV4cGVjdGVkLgorICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwgIjFmIik7CisgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUsIFRva2VuaXplcjo6VFlQRV9GTE9BVCk7CisgIEFTU0VSVF9UUlVFKHRva2VuaXplci5OZXh0KCkpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0LCAiMi41ZiIpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50eXBlLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVQpOworICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwgIjZlM2YiKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudHlwZSwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUKTsKKyAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnRleHQsICI3RiIpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50eXBlLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVQpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGlucHV0LgorICBFWFBFQ1RfRkFMU0UodG9rZW5pemVyLk5leHQoKSk7CisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBlcnJvcnMuCisgIEVYUEVDVF9UUlVFKGVycm9yX2NvbGxlY3Rvci50ZXh0Xy5lbXB0eSgpKTsKK30KKworI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW4gZWFjaCBjYXNlLCB0aGUgaW5wdXQgaXMgcGFyc2VkIHRvIHByb2R1Y2UgYSBsaXN0IG9mIHRva2Vucy4gIFRoZQorLy8gbGFzdCB0b2tlbiBpbiAib3V0cHV0IiBtdXN0IGhhdmUgdHlwZSBUWVBFX0VORC4KK3N0cnVjdCBNdWx0aVRva2VuQ2FzZSB7CisgIHN0cmluZyBpbnB1dDsKKyAgVG9rZW5pemVyOjpUb2tlbiBvdXRwdXRbMTBdOyAgLy8gVGhlIGNvbXBpbGVyIHdhbnRzIGEgY29uc3RhbnQgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBmb3IgaW5pdGlhbGl6YXRpb24gdG8gd29yay4gIFRoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vIHJlYXNvbiB0aGlzIGNhbid0IGJlIGluY3JlYXNlZCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQuCit9OworCitpbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aVRva2VuQ2FzZSYgdGVzdF9jYXNlKSB7CisgIHJldHVybiBvdXQgPDwgQ0VzY2FwZSh0ZXN0X2Nhc2UuaW5wdXQpOworfQorCitNdWx0aVRva2VuQ2FzZSBrTXVsdGlUb2tlbkNhc2VzW10gPSB7CisgIC8vIFRlc3QgZW1wdHkgaW5wdXQuCisgIHsgIiIsIHsKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICAgLCAwLCAgMCB9LAorICB9fSwKKworICAvLyBUZXN0IGFsbCB0b2tlbiB0eXBlcyBhdCB0aGUgc2FtZSB0aW1lLgorICB7ICJmb28gMSAxLjIgKyAnYmFyJyIsIHsKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiZm9vIiAgLCAwLCAgMCwgIDMgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JTlRFR0VSICAgLCAiMSIgICAgLCAwLCAgNCwgIDUgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9GTE9BVCAgICAgLCAiMS4yIiAgLCAwLCAgNiwgIDkgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9TWU1CT0wgICAgLCAiKyIgICAgLCAwLCAxMCwgMTEgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9TVFJJTkcgICAgLCAiJ2JhciciLCAwLCAxMiwgMTcgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICAgLCAwLCAxNywgMTcgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCB0aGF0IGNvbnNlY3V0aXZlIHN5bWJvbHMgYXJlIHBhcnNlZCBhcyBzZXBhcmF0ZSB0b2tlbnMuCisgIHsgIiFAKyUiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIiEiICAgICwgMCwgMCwgMSB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCAgICAsICJAIiAgICAsIDAsIDEsIDIgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9TWU1CT0wgICAgLCAiKyIgICAgLCAwLCAyLCAzIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIiUiICAgICwgMCwgMywgNCB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgICAsIDAsIDQsIDQgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCB0aGF0IG5ld2xpbmVzIGFmZmVjdCBsaW5lIG51bWJlcnMgY29ycmVjdGx5LgorICB7ICJmb28gYmFyXG5yYWIgb29mIiwgeworICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAgMCwgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAwLCAgNCwgNyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJyYWIiLCAxLCAgMCwgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJvb2YiLCAxLCAgNCwgNyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgLCAxLCAgNywgNyB9LAorICB9fSwKKworICAvLyBUZXN0IHRoYXQgdGFicyBhZmZlY3QgY29sdW1uIG51bWJlcnMgY29ycmVjdGx5LgorICB7ICJmb29cdGJhciAgXHRiYXoiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsICAwLCAgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAwLCAgOCwgMTEgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmF6IiwgMCwgMTYsIDE5IH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAsIDAsIDE5LCAxOSB9LAorICB9fSwKKworICAvLyBUZXN0IHRoYXQgdGFicyBpbiBzdHJpbmcgbGl0ZXJhbHMgYWZmZWN0IGNvbHVtbiBudW1iZXJzIGNvcnJlY3RseS4KKyAgeyAiXCJmb29cdGJhclwiIGJheiIsIHsKKyAgICB7IFRva2VuaXplcjo6VFlQRV9TVFJJTkcgICAgLCAiXCJmb29cdGJhclwiIiwgMCwgIDAsIDEyIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJheiIgICAgICAgICAsIDAsIDEzLCAxNiB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgICAgICAgICAgLCAwLCAxNiwgMTYgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCB0aGF0IGxpbmUgY29tbWVudHMgYXJlIGlnbm9yZWQuCisgIHsgImZvbyAvLyBUaGlzIGlzIGEgY29tbWVudFxuIgorICAgICJiYXIgLy8gVGhpcyBpcyBhbm90aGVyIGNvbW1lbnQiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsICAwLCAgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAxLCAgMCwgIDMgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICwgMSwgMzAsIDMwIH0sCisgIH19LAorCisgIC8vIFRlc3QgdGhhdCBibG9jayBjb21tZW50cyBhcmUgaWdub3JlZC4KKyAgeyAiZm9vIC8qIFRoaXMgaXMgYSBibG9jayBjb21tZW50ICovIGJhciIsIHsKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiZm9vIiwgMCwgIDAsICAzIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJhciIsIDAsIDM0LCAzNyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgLCAwLCAzNywgMzcgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCB0aGF0IHNoLXN0eWxlIGNvbW1lbnRzIGFyZSBub3QgaWdub3JlZCBieSBkZWZhdWx0LgorICB7ICJmb28gIyBiYXJcbiIKKyAgICAiYmF6IiwgeworICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAwLCAzIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIiMiICAsIDAsIDQsIDUgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMCwgNiwgOSB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXoiLCAxLCAwLCAzIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAsIDEsIDMsIDMgfSwKKyAgfX0sCisKKyAgLy8gQnl0ZXMgd2l0aCB0aGUgaGlnaC1vcmRlciBiaXQgc2V0IHNob3VsZCBub3QgYmUgc2VlbiBhcyBjb250cm9sIGNoYXJhY3RlcnMuCisgIHsgIlwzMDAiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MLCAiXDMwMCIsIDAsIDAsIDEgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAsICIiICAgICwgMCwgMSwgMSB9LAorICB9fSwKKworICAvLyBUZXN0IGFsbCB3aGl0ZXNwYWNlIGNoYXJzCisgIHsgImZvb1xuXHRcclx2XGZiYXIiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsICAwLCAgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAxLCAxMSwgMTQgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICwgMSwgMTQsIDE0IH0sCisgIH19LAorfTsKKworVEVTVF8yRChUb2tlbml6ZXJUZXN0LCBNdWx0aXBsZVRva2Vucywga011bHRpVG9rZW5DYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dChrTXVsdGlUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga011bHRpVG9rZW5DYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOworICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgLy8gQmVmb3JlIE5leHQoKSBpcyBjYWxsZWQsIHRoZSBpbml0aWFsIHRva2VuIHNob3VsZCBhbHdheXMgYmUgVFlQRV9TVEFSVC4KKyAgRVhQRUNUX0VRKFRva2VuaXplcjo6VFlQRV9TVEFSVCwgdG9rZW5pemVyLmN1cnJlbnQoKS50eXBlKTsKKyAgRVhQRUNUX0VRKCIiLCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICBFWFBFQ1RfRVEoMCwgdG9rZW5pemVyLmN1cnJlbnQoKS5saW5lKTsKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkuY29sdW1uKTsKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkuZW5kX2NvbHVtbik7CisKKyAgLy8gTG9vcCB0aHJvdWdoIGFsbCBleHBlY3RlZCB0b2tlbnMuCisgIGludCBpID0gMDsKKyAgVG9rZW5pemVyOjpUb2tlbiB0b2tlbjsKKyAgZG8geworICAgIHRva2VuID0ga011bHRpVG9rZW5DYXNlc19jYXNlLm91dHB1dFtpKytdOworCisgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiVG9rZW4gIyIgPDwgaSA8PCAiOiAiIDw8IHRva2VuLnRleHQpOworCisgICAgVG9rZW5pemVyOjpUb2tlbiBwcmV2aW91cyA9IHRva2VuaXplci5jdXJyZW50KCk7CisKKyAgICAvLyBOZXh0KCkgc2hvdWxkIG9ubHkgcmV0dXJuIGZhbHNlIHdoZW4gaXQgaGl0cyB0aGUgZW5kIHRva2VuLgorICAgIGlmICh0b2tlbi50eXBlICE9IFRva2VuaXplcjo6VFlQRV9FTkQpIHsKKyAgICAgIEFTU0VSVF9UUlVFKHRva2VuaXplci5OZXh0KCkpOworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfRkFMU0UodG9rZW5pemVyLk5leHQoKSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgc2V0IGNvcnJlY3RseS4KKyAgICBFWFBFQ1RfRVEocHJldmlvdXMudHlwZSwgdG9rZW5pemVyLnByZXZpb3VzKCkudHlwZSk7CisgICAgRVhQRUNUX0VRKHByZXZpb3VzLnRleHQsIHRva2VuaXplci5wcmV2aW91cygpLnRleHQpOworICAgIEVYUEVDVF9FUShwcmV2aW91cy5saW5lLCB0b2tlbml6ZXIucHJldmlvdXMoKS5saW5lKTsKKyAgICBFWFBFQ1RfRVEocHJldmlvdXMuY29sdW1uLCB0b2tlbml6ZXIucHJldmlvdXMoKS5jb2x1bW4pOworICAgIEVYUEVDVF9FUShwcmV2aW91cy5lbmRfY29sdW1uLCB0b2tlbml6ZXIucHJldmlvdXMoKS5lbmRfY29sdW1uKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIHRva2VuIG1hdGNoZXMgdGhlIGV4cGVjdGVkIG9uZS4KKyAgICBFWFBFQ1RfRVEodG9rZW4udHlwZSwgdG9rZW5pemVyLmN1cnJlbnQoKS50eXBlKTsKKyAgICBFWFBFQ1RfRVEodG9rZW4udGV4dCwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgICBFWFBFQ1RfRVEodG9rZW4ubGluZSwgdG9rZW5pemVyLmN1cnJlbnQoKS5saW5lKTsKKyAgICBFWFBFQ1RfRVEodG9rZW4uY29sdW1uLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgICAgRVhQRUNUX0VRKHRva2VuLmVuZF9jb2x1bW4sIHRva2VuaXplci5jdXJyZW50KCkuZW5kX2NvbHVtbik7CisKKyAgfSB3aGlsZSAodG9rZW4udHlwZSAhPSBUb2tlbml6ZXI6OlRZUEVfRU5EKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXJyb3JzLgorICBFWFBFQ1RfVFJVRShlcnJvcl9jb2xsZWN0b3IudGV4dF8uZW1wdHkoKSk7Cit9CisKKy8vIFRoaXMgdGVzdCBjYXVzZXMgZ2NjIDMuMy41IChhbmQgZWFybGllcj8pIHRvIGdpdmUgdGhlIGNyeXB0aWMgZXJyb3I6CisvLyAgICJzb3JyeSwgdW5pbXBsZW1lbnRlZDogYG1ldGhvZF9jYWxsX2V4cHInIG5vdCBzdXBwb3J0ZWQgYnkgZHVtcF9leHByIgorI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPiAzKQorCitURVNUXzFEKFRva2VuaXplclRlc3QsIFNoQ29tbWVudFN0eWxlLCBrQmxvY2tTaXplcykgeworICAvLyBUZXN0IHRoZSAiY29tbWVudF9zdHlsZSIgb3B0aW9uLgorCisgIGNvbnN0IGNoYXIqIHRleHQgPSAiZm9vICMgYmFyXG4iCisgICAgICAgICAgICAgICAgICAgICAiYmF6IC8vIHF1eFxuIgorICAgICAgICAgICAgICAgICAgICAgImNvcmdlIC8qIGdyYXVsdCAqL1xuIgorICAgICAgICAgICAgICAgICAgICAgImdhcnBseSI7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGtUb2tlbnNbXSA9IHsiZm9vIiwgIC8vICIjIGJhciIgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJheiIsICIvIiwgIi8iLCAicXV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JnZSIsICIvIiwgIioiLCAiZ3JhdWx0IiwgIioiLCAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2FycGx5In07CisKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dCh0ZXh0LCBzdHJsZW4odGV4dCksIGtCbG9ja1NpemVzX2Nhc2UpOworICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7CisgIHRva2VuaXplci5zZXRfY29tbWVudF9zdHlsZShUb2tlbml6ZXI6OlNIX0NPTU1FTlRfU1RZTEUpOworCisgIC8vIEFkdmFuY2UgdGhyb3VnaCB0b2tlbnMgYW5kIGNoZWNrIHRoYXQgdGhleSBhcmUgcGFyc2VkIGFzIGV4cGVjdGVkLgorICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoa1Rva2Vucyk7IGkrKykgeworICAgIEVYUEVDVF9UUlVFKHRva2VuaXplci5OZXh0KCkpOworICAgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnRleHQsIGtUb2tlbnNbaV0pOworICB9CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgaW5wdXQuCisgIEVYUEVDVF9GQUxTRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGVycm9ycy4KKyAgRVhQRUNUX1RSVUUoZXJyb3JfY29sbGVjdG9yLnRleHRfLmVtcHR5KCkpOworfQorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbiBlYWNoIGNhc2UsIHRoZSBpbnB1dCBpcyBleHBlY3RlZCB0byBoYXZlIHR3byB0b2tlbnMgbmFtZWQgInByZXYiIGFuZAorLy8gIm5leHQiIHdpdGggY29tbWVudHMgaW4gYmV0d2Vlbi4KK3N0cnVjdCBEb2NDb21tZW50Q2FzZSB7CisgIHN0cmluZyBpbnB1dDsKKworICBjb25zdCBjaGFyKiBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzOworICBjb25zdCBjaGFyKiBkZXRhY2hlZF9jb21tZW50c1sxMF07CisgIGNvbnN0IGNoYXIqIG5leHRfbGVhZGluZ19jb21tZW50czsKK307CisKK2lubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvY0NvbW1lbnRDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIG91dCA8PCBDRXNjYXBlKHRlc3RfY2FzZS5pbnB1dCk7Cit9CisKK0RvY0NvbW1lbnRDYXNlIGtEb2NDb21tZW50Q2FzZXNbXSA9IHsKKyAgeworICAgICJwcmV2IG5leHQiLAorCisgICAgIiIsCisgICAge30sCisgICAgIiIKKyAgICAgIH0sCisKKyAgICAgICAgeworICAgICAgInByZXYgLyogaWdub3JlZCAqLyBuZXh0IiwKKworICAgICAgIiIsCisgICAgICB7fSwKKyAgICAgICIiCisgICAgICAgIH0sCisKKyAgICAgICAgICB7CisgICAgICAgICJwcmV2IC8vIHRyYWlsaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICJuZXh0IiwKKworICAgICAgICAgICAgIiB0cmFpbGluZyBjb21tZW50XG4iLAorICAgICAgICAgICAge30sCisgICAgICAgICAgICAiIgorICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAicHJldlxuIgorICAgICAgICAgICAgICAiLy8gbGVhZGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICIvLyBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgIiBsaW5lIDJcbiIKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgInByZXZcbiIKKyAgICAgICAgICAgICAgICAiLy8gdHJhaWxpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICIvLyBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICAgIiB0cmFpbGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgIiBsaW5lIDJcbiIsCisgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgInByZXYgLy8gdHJhaWxpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgIi8vIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgIi8vIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICAgICAiIHRyYWlsaW5nIGNvbW1lbnRcbiIsCisgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICIgbGVhZGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAiIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAicHJldiAvKiB0cmFpbGluZyBibG9jayBjb21tZW50ICovXG4iCisgICAgICAgICAgICAgICAgICAgICIvKiBsZWFkaW5nIGJsb2NrIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgICAgICAiICogbGluZSAzICovIgorICAgICAgICAgICAgICAgICAgICAibmV4dCIsCisKKyAgICAgICAgICAgICAgICAgICAgIiB0cmFpbGluZyBibG9jayBjb21tZW50ICIsCisgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAiIGxlYWRpbmcgYmxvY2sgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAiIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgICAgICAiIGxpbmUgMyAiCisgICAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICJwcmV2XG4iCisgICAgICAgICAgICAgICAgICAgICAgIi8qIHRyYWlsaW5nIGJsb2NrIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICogbGluZSAyXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgM1xuIgorICAgICAgICAgICAgICAgICAgICAgICIgKi9cbiIKKyAgICAgICAgICAgICAgICAgICAgICAiLyogbGVhZGluZyBibG9jayBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgKiBsaW5lIDMgKi8iCisgICAgICAgICAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICAgICAgICAgIiB0cmFpbGluZyBibG9jayBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiIGxpbmUgM1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAiIGxlYWRpbmcgYmxvY2sgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgbGluZSAyXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDMgIgorICAgICAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAicHJldlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi8vIHRyYWlsaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIvLyBkZXRhY2hlZCBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiLy8gc2Vjb25kIGRldGFjaGVkIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIvKiB0aGlyZCBkZXRhY2hlZCBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICogbGluZSAyICovXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiLy8gbGVhZGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAibmV4dCIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICIgdHJhaWxpbmcgY29tbWVudFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAiIGRldGFjaGVkIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgc2Vjb25kIGRldGFjaGVkIGNvbW1lbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhpcmQgZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxpbmUgMiAiCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAicHJldiAvKiovXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyBkZXRhY2hlZCBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV4dCIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJldiAvKiovXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCitURVNUXzJEKFRva2VuaXplclRlc3QsIERvY0NvbW1lbnRzLCBrRG9jQ29tbWVudENhc2VzLCBrQmxvY2tTaXplcykgeworICAvLyBTZXQgdXAgdGhlIHRva2VuaXplci4KKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtEb2NDb21tZW50Q2FzZXNfY2FzZS5pbnB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrRG9jQ29tbWVudENhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKworICAvLyBTZXQgdXAgYSBzZWNvbmQgdG9rZW5pemVyIHdoZXJlIHdlJ2xsIHBhc3MgYWxsIE5VTExzIHRvIE5leHRXaXRoQ29tbWVudHMoKS4KKyAgVGVzdElucHV0U3RyZWFtIGlucHV0MihrRG9jQ29tbWVudENhc2VzX2Nhc2UuaW5wdXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga0RvY0NvbW1lbnRDYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOworICBUb2tlbml6ZXIgdG9rZW5pemVyMigmaW5wdXQyLCAmZXJyb3JfY29sbGVjdG9yKTsKKworICB0b2tlbml6ZXIuTmV4dCgpOworICB0b2tlbml6ZXIyLk5leHQoKTsKKworICBFWFBFQ1RfRVEoInByZXYiLCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICBFWFBFQ1RfRVEoInByZXYiLCB0b2tlbml6ZXIyLmN1cnJlbnQoKS50ZXh0KTsKKworICBzdHJpbmcgcHJldl90cmFpbGluZ19jb21tZW50czsKKyAgdmVjdG9yPHN0cmluZz4gZGV0YWNoZWRfY29tbWVudHM7CisgIHN0cmluZyBuZXh0X2xlYWRpbmdfY29tbWVudHM7CisgIHRva2VuaXplci5OZXh0V2l0aENvbW1lbnRzKCZwcmV2X3RyYWlsaW5nX2NvbW1lbnRzLCAmZGV0YWNoZWRfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0X2xlYWRpbmdfY29tbWVudHMpOworICB0b2tlbml6ZXIyLk5leHRXaXRoQ29tbWVudHMoTlVMTCwgTlVMTCwgTlVMTCk7CisgIEVYUEVDVF9FUSgibmV4dCIsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7CisgIEVYUEVDVF9FUSgibmV4dCIsIHRva2VuaXplcjIuY3VycmVudCgpLnRleHQpOworCisgIEVYUEVDVF9FUShrRG9jQ29tbWVudENhc2VzX2Nhc2UucHJldl90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgIHByZXZfdHJhaWxpbmdfY29tbWVudHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV0YWNoZWRfY29tbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICBBU1NFUlRfTFQoaSwgR09PR0xFX0FSUkFZU0laRShrRG9jQ29tbWVudENhc2VzKSk7CisgICAgQVNTRVJUX1RSVUUoa0RvY0NvbW1lbnRDYXNlc19jYXNlLmRldGFjaGVkX2NvbW1lbnRzW2ldICE9IE5VTEwpOworICAgIEVYUEVDVF9FUShrRG9jQ29tbWVudENhc2VzX2Nhc2UuZGV0YWNoZWRfY29tbWVudHNbaV0sCisgICAgICAgICAgICAgIGRldGFjaGVkX2NvbW1lbnRzW2ldKTsKKyAgfQorCisgIC8vIFZlcmlmeSB0aGF0IHdlIG1hdGNoZWQgYWxsIHRoZSBkZXRhY2hlZCBjb21tZW50cy4KKyAgRVhQRUNUX0VRKE5VTEwsCisgICAgICBrRG9jQ29tbWVudENhc2VzX2Nhc2UuZGV0YWNoZWRfY29tbWVudHNbZGV0YWNoZWRfY29tbWVudHMuc2l6ZSgpXSk7CisKKyAgRVhQRUNUX0VRKGtEb2NDb21tZW50Q2FzZXNfY2FzZS5uZXh0X2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICBuZXh0X2xlYWRpbmdfY29tbWVudHMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRlc3QgcGFyc2UgaGVscGVycy4gIEl0J3Mgbm90IHJlYWxseSB3b3J0aCBzZXR0aW5nIHVwIGEgZnVsbCBkYXRhLWRyaXZlbgorLy8gdGVzdCBoZXJlLgorVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlSW50ZWdlcikgeworICBFWFBFQ1RfRVEoMCwgUGFyc2VJbnRlZ2VyKCIwIikpOworICBFWFBFQ1RfRVEoMTIzLCBQYXJzZUludGVnZXIoIjEyMyIpKTsKKyAgRVhQRUNUX0VRKDB4YWJjZGVmMTJ1LCBQYXJzZUludGVnZXIoIjB4YWJjZGVmMTIiKSk7CisgIEVYUEVDVF9FUSgweGFiY2RlZjEydSwgUGFyc2VJbnRlZ2VyKCIweEFCQ0RFRjEyIikpOworICBFWFBFQ1RfRVEoa3VpbnQ2NG1heCwgUGFyc2VJbnRlZ2VyKCIweEZGRkZGRkZGRkZGRkZGRkYiKSk7CisgIEVYUEVDVF9FUSgwMTIzNDU2NywgUGFyc2VJbnRlZ2VyKCIwMTIzNDU2NyIpKTsKKyAgRVhQRUNUX0VRKDBYMTIzLCBQYXJzZUludGVnZXIoIjBYMTIzIikpOworCisgIC8vIFRlc3QgaW52YWxpZCBpbnRlZ2VycyB0aGF0IG1heSBzdGlsbCBiZSB0b2tlbml6ZWQgYXMgaW50ZWdlcnMuCisgIEVYUEVDVF9FUSgwLCBQYXJzZUludGVnZXIoIjB4IikpOworCisgIHVpbnQ2NCBpOworI2lmZGVmIFBST1RPQlVGX0hBU0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CisgIC8vIFRlc3QgaW52YWxpZCBpbnRlZ2VycyB0aGF0IHdpbGwgbmV2ZXIgYmUgdG9rZW5pemVkIGFzIGludGVnZXJzLgorICBFWFBFQ1RfREVCVUdfREVBVEgoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoInp4eSIsIGt1aW50NjRtYXgsICZpKSwKKyAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7CisgIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMS4yIiwga3VpbnQ2NG1heCwgJmkpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGFuIGludGVnZXIiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIwOCIsIGt1aW50NjRtYXgsICZpKSwKKyAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7CisgIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMHhnIiwga3VpbnQ2NG1heCwgJmkpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGFuIGludGVnZXIiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCItMSIsIGt1aW50NjRtYXgsICZpKSwKKyAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7CisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU0RFQVRIX1RFU1QKKworICAvLyBUZXN0IG92ZXJmbG93cy4KKyAgRVhQRUNUX1RSVUUgKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIwIiwgMCwgJmkpKTsKKyAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIxIiwgMCwgJmkpKTsKKyAgRVhQRUNUX1RSVUUgKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIxIiwgMSwgJmkpKTsKKyAgRVhQRUNUX1RSVUUgKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIxMjM0NSIsIDEyMzQ1LCAmaSkpOworICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjEyMzQ2IiwgMTIzNDUsICZpKSk7CisgIEVYUEVDVF9UUlVFIChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMHhGRkZGRkZGRkZGRkZGRkZGIiAsIGt1aW50NjRtYXgsICZpKSk7CisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMHgxMDAwMDAwMDAwMDAwMDAwMCIsIGt1aW50NjRtYXgsICZpKSk7Cit9CisKK1RFU1RfRihUb2tlbml6ZXJUZXN0LCBQYXJzZUZsb2F0KSB7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSAgICAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS4iKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMWUzICAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUzIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDFlMyAgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFFMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLjVlMywgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLjVlMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSguMSAgICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMSIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSguMjUgICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMjUiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLjFlMyAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLjFlMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSguMjVlMywgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMjVlMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSguMWUrMywgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMWUrMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSguMWUtMywgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMWUtMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSg1ICAgICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCI1IikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDZlLTEyLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjZlLTEyIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDEuMiAgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjEuMiIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLmUyICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLmUyIikpOworCisgIC8vIFRlc3QgaW52YWxpZCBpbnRlZ2VycyB0aGF0IG1heSBzdGlsbCBiZSB0b2tlbml6ZWQgYXMgaW50ZWdlcnMuCisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxZSIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlLSIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjEuZSIpKTsKKworICAvLyBUZXN0ICdmJyBzdWZmaXguCisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxZiIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjEuMGYiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxRiIpKTsKKworICAvLyBUaGVzZSBzaG91bGQgcGFyc2Ugc3VjY2Vzc2Z1bGx5IGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG91dCBvZiByYW5nZS4KKyAgLy8gT3ZlcmZsb3dzIGJlY29tZSBpbmZpbml0eSBhbmQgdW5kZXJmbG93cyBiZWNvbWUgemVyby4KKyAgRVhQRUNUX0VRKCAgICAgMC4wLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKSk7CisgIEVYUEVDVF9FUShIVUdFX1ZBTCwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxZSs5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IikpOworCisjaWZkZWYgUFJPVE9CVUZfSEFTREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQKKyAgLy8gVGVzdCBpbnZhbGlkIGludGVnZXJzIHRoYXQgd2lsbCBuZXZlciBiZSB0b2tlbml6ZWQgYXMgaW50ZWdlcnMuCisgIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlRmxvYXQoInp4eSIpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS1lMCIpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLTEuMCIpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTREVBVEhfVEVTVAorfQorCitURVNUX0YoVG9rZW5pemVyVGVzdCwgUGFyc2VTdHJpbmcpIHsKKyAgc3RyaW5nIG91dHB1dDsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ2hlbGxvJyIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgb3V0cHV0KTsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiXCJibGFoXFxuYmxhaDJcIiIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoImJsYWhcbmJsYWgyIiwgb3V0cHV0KTsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcMXhcXDFcXDEyM1xcNzM5XFw1MlxcMzM0blxcMyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJcMXhcMVwxMjNcNzM5XDUyXDMzNG5cMyIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHgyMFxceDQnIiwgJm91dHB1dCk7CisgIEVYUEVDVF9FUSgiXHgyMFx4NCIsIG91dHB1dCk7CisKKyAgLy8gVGVzdCBpbnZhbGlkIHN0cmluZ3MgdGhhdCBtYXkgc3RpbGwgYmUgdG9rZW5pemVkIGFzIHN0cmluZ3MuCisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIlwiXFxhXFxsXFx2XFx0IiwgJm91dHB1dCk7ICAvLyBcbCBpcyBpbnZhbGlkCisgIEVYUEVDVF9FUSgiXGE/XHZcdCIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIiciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCIiLCBvdXRwdXQpOworICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInXFwiLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJcXCIsIG91dHB1dCk7CisKKyAgLy8gRXhwZXJpbWVudCB3aXRoIFVuaWNvZGUgZXNjYXBlcy4gSGVyZSBhcmUgb25lLSwgdHdvLSBhbmQgdGhyZWUtYnl0ZSBVbmljb2RlCisgIC8vIGNoYXJhY3RlcnMuCisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHUwMDI0XFx1MDBhMlxcdTIwYWNcXFUwMDAyNGI2MlhYJyIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoIiTCouKCrPCkraJYWCIsIG91dHB1dCk7CisgIC8vIFNhbWUgdGhpbmcgZW5jb2RlZCB1c2luZyBVVEYxNi4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcdTAwMjRcXHUwMGEyXFx1MjBhY1xcdWQ4NTJcXHVkZjYyWFgnIiwgJm91dHB1dCk7CisgIEVYUEVDVF9FUSgiJMKi4oKs8KStolhYIiwgb3V0cHV0KTsKKyAgLy8gSGVyZSdzIHNvbWUgYnJva2VuIFVURjE2OyB0aGVyZSdzIGEgaGVhZCBzdXJyb2dhdGUgd2l0aCBubyB0YWlsIHN1cnJvZ2F0ZS4KKyAgLy8gV2UganVzdCBvdXRwdXQgdGhpcyBhcyBpZiBpdCB3ZXJlIFVURjg7IGl0J3Mgbm90IGEgZGVmaW5lZCBjb2RlIHBvaW50LCBidXQKKyAgLy8gaXQgaGFzIGEgZGVmaW5lZCBlbmNvZGluZy4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcdWQ4NTJYWCciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJceGVkXHhhMVx4OTJYWCIsIG91dHB1dCk7CisgIC8vIE1hbGZvcm1lZCBlc2NhcGU6IERlbW9ucyBtYXkgZmx5IG91dCBvZiB0aGUgbm9zZS4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiXFx1MCIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoInUwIiwgb3V0cHV0KTsKKworICAvLyBUZXN0IGludmFsaWQgc3RyaW5ncyB0aGF0IHdpbGwgbmV2ZXIgYmUgdG9rZW5pemVkIGFzIHN0cmluZ3MuCisjaWZkZWYgUFJPVE9CVUZfSEFTREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIiIsICZvdXRwdXQpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgc3RyaW5nIik7CisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU0RFQVRIX1RFU1QKK30KKworVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlU3RyaW5nQXBwZW5kKSB7CisgIC8vIENoZWNrIHRoYXQgUGFyc2VTdHJpbmcgYW5kIFBhcnNlU3RyaW5nQXBwZW5kIGRpZmZlci4KKyAgc3RyaW5nIG91dHB1dCgic3R1ZmYrIik7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQoIidoZWxsbyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJzdHVmZitoZWxsbyIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidoZWxsbyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG91dHB1dCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRWFjaCBjYXNlIHBhcnNlcyBzb21lIGlucHV0IHRleHQsIGlnbm9yaW5nIHRoZSB0b2tlbnMgcHJvZHVjZWQsIGFuZAorLy8gY2hlY2tzIHRoYXQgdGhlIGVycm9yIG91dHB1dCBtYXRjaGVzIHdoYXQgaXMgZXhwZWN0ZWQuCitzdHJ1Y3QgRXJyb3JDYXNlIHsKKyAgc3RyaW5nIGlucHV0OworICBib29sIHJlY292ZXJhYmxlOyAgLy8gVHJ1ZSBpZiB0aGUgdG9rZW5pemVyIHNob3VsZCBiZSBhYmxlIHRvIHJlY292ZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb3JlIHRva2VucyBhZnRlciBzZWVpbmcgdGhpcyBlcnJvci4gIENhc2VzCisgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igd2hpY2ggdGhpcyBpcyB0cnVlIG11c3QgZW5kIHdpdGggImZvbyIgYXMKKyAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IHRva2VuLCB3aGljaCB0aGUgdGVzdCB3aWxsIGNoZWNrIGZvci4KKyAgY29uc3QgY2hhciogZXJyb3JzOworfTsKKworaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIG91dCA8PCBDRXNjYXBlKHRlc3RfY2FzZS5pbnB1dCk7Cit9CisKK0Vycm9yQ2FzZSBrRXJyb3JDYXNlc1tdID0geworICAvLyBTdHJpbmcgZXJyb3JzLgorICB7ICInXFxsJyBmb28iLCB0cnVlLAorICAgICIwOjI6IEludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsLlxuIiB9LAorICB7ICInXFx4JyBmb28iLCB0cnVlLAorICAgICIwOjM6IEV4cGVjdGVkIGhleCBkaWdpdHMgZm9yIGVzY2FwZSBzZXF1ZW5jZS5cbiIgfSwKKyAgeyAiJ2ZvbyIsIGZhbHNlLAorICAgICIwOjQ6IFN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLlxuIiB9LAorICB7ICInYmFyXG5mb28iLCB0cnVlLAorICAgICIwOjQ6IFN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLlxuIiB9LAorICB7ICInXFx1MDEnIGZvbyIsIHRydWUsCisgICAgIjA6NTogRXhwZWN0ZWQgZm91ciBoZXggZGlnaXRzIGZvciBcXHUgZXNjYXBlIHNlcXVlbmNlLlxuIiB9LAorICB7ICInXFx1MDEnIGZvbyIsIHRydWUsCisgICAgIjA6NTogRXhwZWN0ZWQgZm91ciBoZXggZGlnaXRzIGZvciBcXHUgZXNjYXBlIHNlcXVlbmNlLlxuIiB9LAorICB7ICInXFx1WFlaJyBmb28iLCB0cnVlLAorICAgICIwOjM6IEV4cGVjdGVkIGZvdXIgaGV4IGRpZ2l0cyBmb3IgXFx1IGVzY2FwZSBzZXF1ZW5jZS5cbiIgfSwKKworICAvLyBJbnRlZ2VyIGVycm9ycy4KKyAgeyAiMTIzZm9vIiwgdHJ1ZSwKKyAgICAiMDozOiBOZWVkIHNwYWNlIGJldHdlZW4gbnVtYmVyIGFuZCBpZGVudGlmaWVyLlxuIiB9LAorCisgIC8vIEhleC9vY3RhbCBlcnJvcnMuCisgIHsgIjB4IGZvbyIsIHRydWUsCisgICAgIjA6MjogXCIweFwiIG11c3QgYmUgZm9sbG93ZWQgYnkgaGV4IGRpZ2l0cy5cbiIgfSwKKyAgeyAiMDU0MTgyMyBmb28iLCB0cnVlLAorICAgICIwOjQ6IE51bWJlcnMgc3RhcnRpbmcgd2l0aCBsZWFkaW5nIHplcm8gbXVzdCBiZSBpbiBvY3RhbC5cbiIgfSwKKyAgeyAiMHgxMjN6IGZvbyIsIHRydWUsCisgICAgIjA6NTogTmVlZCBzcGFjZSBiZXR3ZWVuIG51bWJlciBhbmQgaWRlbnRpZmllci5cbiIgfSwKKyAgeyAiMHgxMjMuNCBmb28iLCB0cnVlLAorICAgICIwOjU6IEhleCBhbmQgb2N0YWwgbnVtYmVycyBtdXN0IGJlIGludGVnZXJzLlxuIiB9LAorICB7ICIwMTIzLjQgZm9vIiwgdHJ1ZSwKKyAgICAiMDo0OiBIZXggYW5kIG9jdGFsIG51bWJlcnMgbXVzdCBiZSBpbnRlZ2Vycy5cbiIgfSwKKworICAvLyBGbG9hdCBlcnJvcnMuCisgIHsgIjFlIGZvbyIsIHRydWUsCisgICAgIjA6MjogXCJlXCIgbXVzdCBiZSBmb2xsb3dlZCBieSBleHBvbmVudC5cbiIgfSwKKyAgeyAiMWUtIGZvbyIsIHRydWUsCisgICAgIjA6MzogXCJlXCIgbXVzdCBiZSBmb2xsb3dlZCBieSBleHBvbmVudC5cbiIgfSwKKyAgeyAiMS4yLjMgZm9vIiwgdHJ1ZSwKKyAgICAiMDozOiBBbHJlYWR5IHNhdyBkZWNpbWFsIHBvaW50IG9yIGV4cG9uZW50OyBjYW4ndCBoYXZlIGFub3RoZXIgb25lLlxuIiB9LAorICB7ICIxZTIuMyBmb28iLCB0cnVlLAorICAgICIwOjM6IEFscmVhZHkgc2F3IGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQ7IGNhbid0IGhhdmUgYW5vdGhlciBvbmUuXG4iIH0sCisgIHsgImEuMSBmb28iLCB0cnVlLAorICAgICIwOjE6IE5lZWQgc3BhY2UgYmV0d2VlbiBpZGVudGlmaWVyIGFuZCBkZWNpbWFsIHBvaW50LlxuIiB9LAorICAvLyBhbGxvd19mX2FmdGVyX2Zsb2F0IG5vdCBlbmFibGVkLCBzbyB0aGlzIHNob3VsZCBiZSBhbiBlcnJvci4KKyAgeyAiMS4wZiBmb28iLCB0cnVlLAorICAgICIwOjM6IE5lZWQgc3BhY2UgYmV0d2VlbiBudW1iZXIgYW5kIGlkZW50aWZpZXIuXG4iIH0sCisKKyAgLy8gQmxvY2sgY29tbWVudCBlcnJvcnMuCisgIHsgIi8qIiwgZmFsc2UsCisgICAgIjA6MjogRW5kLW9mLWZpbGUgaW5zaWRlIGJsb2NrIGNvbW1lbnQuXG4iCisgICAgIjA6MDogICBDb21tZW50IHN0YXJ0ZWQgaGVyZS5cbiJ9LAorICB7ICIvKi8qLyBmb28iLCB0cnVlLAorICAgICIwOjM6IFwiLypcIiBpbnNpZGUgYmxvY2sgY29tbWVudC4gIEJsb2NrIGNvbW1lbnRzIGNhbm5vdCBiZSBuZXN0ZWQuXG4ifSwKKworICAvLyBDb250cm9sIGNoYXJhY3RlcnMuICBNdWx0aXBsZSBjb25zZWN1dGl2ZSBjb250cm9sIGNoYXJhY3RlcnMgc2hvdWxkIG9ubHkKKyAgLy8gcHJvZHVjZSBvbmUgZXJyb3IuCisgIHsgIlxiIGZvbyIsIHRydWUsCisgICAgIjA6MDogSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC5cbiIgfSwKKyAgeyAiXGJcYiBmb28iLCB0cnVlLAorICAgICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4iIH0sCisKKyAgLy8gQ2hlY2sgdGhhdCBjb250cm9sIGNoYXJhY3RlcnMgYXQgZW5kIG9mIGlucHV0IGRvbid0IHJlc3VsdCBpbiBhbgorICAvLyBpbmZpbml0ZSBsb29wLgorICB7ICJcYiIsIGZhbHNlLAorICAgICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4iIH0sCisKKyAgLy8gQ2hlY2sgcmVjb3ZlcnkgZnJvbSAnXDAnLiAgV2UgaGF2ZSB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIGxlbmd0aCBvZgorICAvLyB0aGVzZSBzdHJpbmdzIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBzdHJpbmcgY29uc3RydWN0b3Igd2lsbCBqdXN0IGNhbGwKKyAgLy8gc3RybGVuKCkgd2hpY2ggd2lsbCBzZWUgdGhlIGZpcnN0ICdcMCcgYW5kIHRoaW5rIHRoYXQgaXMgdGhlIGVuZCBvZiB0aGUKKyAgLy8gc3RyaW5nLgorICB7IHN0cmluZygiXDBmb28iLCA0KSwgdHJ1ZSwKKyAgICAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIiB9LAorICB7IHN0cmluZygiXDBcMGZvbyIsIDUpLCB0cnVlLAorICAgICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4iIH0sCit9OworCitURVNUXzJEKFRva2VuaXplclRlc3QsIEVycm9ycywga0Vycm9yQ2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgorICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQoa0Vycm9yQ2FzZXNfY2FzZS5pbnB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrRXJyb3JDYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOworICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgLy8gSWdub3JlIGFsbCBpbnB1dCwgZXhjZXB0IHJlbWVtYmVyIGlmIHRoZSBsYXN0IHRva2VuIHdhcyAiZm9vIi4KKyAgYm9vbCBsYXN0X3dhc19mb28gPSBmYWxzZTsKKyAgd2hpbGUgKHRva2VuaXplci5OZXh0KCkpIHsKKyAgICBsYXN0X3dhc19mb28gPSB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQgPT0gImZvbyI7CisgIH0KKworICAvLyBDaGVjayB0aGF0IHRoZSBlcnJvcnMgbWF0Y2ggd2hhdCB3YXMgZXhwZWN0ZWQuCisgIEVYUEVDVF9FUShrRXJyb3JDYXNlc19jYXNlLmVycm9ycywgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKKworICAvLyBJZiB0aGUgZXJyb3Igd2FzIHJlY292ZXJhYmxlLCBtYWtlIHN1cmUgd2Ugc2F3ICJmb28iIGFmdGVyIGl0LgorICBpZiAoa0Vycm9yQ2FzZXNfY2FzZS5yZWNvdmVyYWJsZSkgeworICAgIEVYUEVDVF9UUlVFKGxhc3Rfd2FzX2Zvbyk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitURVNUXzFEKFRva2VuaXplclRlc3QsIEJhY2tVcE9uRGVzdHJ1Y3Rpb24sIGtCbG9ja1NpemVzKSB7CisgIHN0cmluZyB0ZXh0ID0gImZvbyBiYXIiOworICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQodGV4dC5kYXRhKCksIHRleHQuc2l6ZSgpLCBrQmxvY2tTaXplc19jYXNlKTsKKworICAvLyBDcmVhdGUgYSB0b2tlbml6ZXIsIHJlYWQgb25lIHRva2VuLCB0aGVuIGRlc3Ryb3kgaXQuCisgIHsKKyAgICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKworICAgIHRva2VuaXplci5OZXh0KCk7CisgIH0KKworICAvLyBPbmx5ICJmb28iIHNob3VsZCBoYXZlIGJlZW4gcmVhZC4KKyAgRVhQRUNUX0VRKHN0cmxlbigiZm9vIiksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDZmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYwpAQCAtMCwwICsxLDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworWmVyb0NvcHlJbnB1dFN0cmVhbTo6flplcm9Db3B5SW5wdXRTdHJlYW0oKSB7fQorWmVyb0NvcHlPdXRwdXRTdHJlYW06On5aZXJvQ29weU91dHB1dFN0cmVhbSgpIHt9CisKKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTMyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oCkBAIC0wLDAgKzEsMjM4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFplcm9Db3B5SW5wdXRTdHJlYW0gYW5kIFplcm9Db3B5T3V0cHV0U3RyZWFtCisvLyBpbnRlcmZhY2VzLCB3aGljaCByZXByZXNlbnQgYWJzdHJhY3QgSS9PIHN0cmVhbXMgdG8gYW5kIGZyb20gd2hpY2gKKy8vIHByb3RvY29sIGJ1ZmZlcnMgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uICBGb3IgYSBmZXcgc2ltcGxlCisvLyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgaW50ZXJmYWNlcywgc2VlIHplcm9fY29weV9zdHJlYW1faW1wbC5oLgorLy8KKy8vIFRoZXNlIGludGVyZmFjZXMgYXJlIGRpZmZlcmVudCBmcm9tIGNsYXNzaWMgSS9PIHN0cmVhbXMgaW4gdGhhdCB0aGV5CisvLyB0cnkgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBkYXRhIGNvcHlpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lLgorLy8gVG8gYWNjb21wbGlzaCB0aGlzLCByZXNwb25zaWJpbGl0eSBmb3IgYWxsb2NhdGluZyBidWZmZXJzIGlzIG1vdmVkIHRvCisvLyB0aGUgc3RyZWFtIG9iamVjdCwgcmF0aGVyIHRoYW4gYmVpbmcgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIuCisvLyBTbywgdGhlIHN0cmVhbSBjYW4gcmV0dXJuIGEgYnVmZmVyIHdoaWNoIGFjdHVhbGx5IHBvaW50cyBkaXJlY3RseSBpbnRvCisvLyB0aGUgZmluYWwgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgdGhlIGJ5dGVzIGFyZSB0byBiZSBzdG9yZWQsIGFuZCB0aGUgY2FsbGVyCisvLyBjYW4gaW50ZXJhY3QgZGlyZWN0bHkgd2l0aCB0aGF0IGJ1ZmZlciwgZWxpbWluYXRpbmcgYW4gaW50ZXJtZWRpYXRlIGNvcHkKKy8vIG9wZXJhdGlvbi4KKy8vCisvLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgY29tbW9uIGNhc2UgaW4gd2hpY2ggeW91IGFyZSByZWFkaW5nIGJ5dGVzCisvLyBmcm9tIGFuIGFycmF5IHRoYXQgaXMgYWxyZWFkeSBpbiBtZW1vcnkgKG9yIHBlcmhhcHMgYW4gbW1hcCgpZWQgZmlsZSkuCisvLyBXaXRoIGNsYXNzaWMgSS9PIHN0cmVhbXMsIHlvdSB3b3VsZCBkbyBzb21ldGhpbmcgbGlrZToKKy8vICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworLy8gICBpbnB1dC0+UmVhZChidWZmZXIsIEJVRkZFUl9TSVpFKTsKKy8vICAgRG9Tb21ldGhpbmcoYnVmZmVyLCBCVUZGRVJfU0laRSk7CisvLyBUaGVuLCB0aGUgc3RyZWFtIGJhc2ljYWxseSBqdXN0IGNhbGxzIG1lbWNweSgpIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQorLy8gdGhlIGFycmF5IGludG8geW91ciBidWZmZXIuICBXaXRoIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSwgeW91IHdvdWxkIGRvCisvLyB0aGlzIGluc3RlYWQ6CisvLyAgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKKy8vICAgaW50IHNpemU7CisvLyAgIGlucHV0LT5OZXh0KCZidWZmZXIsICZzaXplKTsKKy8vICAgRG9Tb21ldGhpbmcoYnVmZmVyLCBzaXplKTsKKy8vIEhlcmUsIG5vIGNvcHkgaXMgcGVyZm9ybWVkLiAgVGhlIGlucHV0IHN0cmVhbSByZXR1cm5zIGEgcG9pbnRlciBkaXJlY3RseQorLy8gaW50byB0aGUgYmFja2luZyBhcnJheSwgYW5kIHRoZSBjYWxsZXIgZW5kcyB1cCByZWFkaW5nIGRpcmVjdGx5IGZyb20gaXQuCisvLworLy8gSWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBvbGQtZmFzaGlvbiB3YXksIHlvdSBjYW4gY3JlYXRlCisvLyBhIENvZGVkSW5wdXRTdHJlYW0gb3IgQ29kZWRPdXRwdXRTdHJlYW0gd3JhcHBpbmcgdGhlc2Ugb2JqZWN0cyBhbmQgdXNlCisvLyB0aGVpciBSZWFkUmF3KCkvV3JpdGVSYXcoKSBtZXRob2RzLiAgVGhlc2Ugd2lsbCwgb2YgY291cnNlLCBhZGQgYSBjb3B5CisvLyBzdGVwLCBidXQgQ29kZWQqU3RyZWFtIHdpbGwgaGFuZGxlIGJ1ZmZlcmluZyBzbyBhdCBsZWFzdCBpdCB3aWxsIGJlCisvLyByZWFzb25hYmx5IGVmZmljaWVudC4KKy8vCisvLyBaZXJvQ29weUlucHV0U3RyZWFtIGV4YW1wbGU6CisvLyAgIC8vIFJlYWQgaW4gYSBmaWxlIGFuZCBwcmludCBpdHMgY29udGVudHMgdG8gc3Rkb3V0LgorLy8gICBpbnQgZmQgPSBvcGVuKCJteWZpbGUiLCBPX1JET05MWSk7CisvLyAgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZCk7CisvLworLy8gICBjb25zdCB2b2lkKiBidWZmZXI7CisvLyAgIGludCBzaXplOworLy8gICB3aGlsZSAoaW5wdXQtPk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisvLyAgICAgY291dC53cml0ZShidWZmZXIsIHNpemUpOworLy8gICB9CisvLworLy8gICBkZWxldGUgaW5wdXQ7CisvLyAgIGNsb3NlKGZkKTsKKy8vCisvLyBaZXJvQ29weU91dHB1dFN0cmVhbSBleGFtcGxlOgorLy8gICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiAiaW5maWxlIiB0byAib3V0ZmlsZSIsIHVzaW5nIHBsYWluIHJlYWQoKSBmb3IKKy8vICAgLy8gImluZmlsZSIgYnV0IGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gZm9yICJvdXRmaWxlIi4KKy8vICAgaW50IGluZmQgPSBvcGVuKCJpbmZpbGUiLCBPX1JET05MWSk7CisvLyAgIGludCBvdXRmZCA9IG9wZW4oIm91dGZpbGUiLCBPX1dST05MWSk7CisvLyAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmZCk7CisvLworLy8gICB2b2lkKiBidWZmZXI7CisvLyAgIGludCBzaXplOworLy8gICB3aGlsZSAob3V0cHV0LT5OZXh0KCZidWZmZXIsICZzaXplKSkgeworLy8gICAgIGludCBieXRlcyA9IHJlYWQoaW5mZCwgYnVmZmVyLCBzaXplKTsKKy8vICAgICBpZiAoYnl0ZXMgPCBzaXplKSB7CisvLyAgICAgICAvLyBSZWFjaGVkIEVPRi4KKy8vICAgICAgIG91dHB1dC0+QmFja1VwKHNpemUgLSBieXRlcyk7CisvLyAgICAgICBicmVhazsKKy8vICAgICB9CisvLyAgIH0KKy8vCisvLyAgIGRlbGV0ZSBvdXRwdXQ7CisvLyAgIGNsb3NlKGluZmQpOworLy8gICBjbG9zZShvdXRmZCk7CisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07CitjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHNpbWlsYXIgdG8gYW4gaW5wdXQgc3RyZWFtIGJ1dCBkZXNpZ25lZCB0byBtaW5pbWl6ZQorLy8gY29weWluZy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIGlubGluZSBaZXJvQ29weUlucHV0U3RyZWFtKCkge30KKyAgdmlydHVhbCB+WmVyb0NvcHlJbnB1dFN0cmVhbSgpOworCisgIC8vIE9idGFpbnMgYSBjaHVuayBvZiBkYXRhIGZyb20gdGhlIHN0cmVhbS4KKyAgLy8KKyAgLy8gUHJlY29uZGl0aW9uczoKKyAgLy8gKiAic2l6ZSIgYW5kICJkYXRhIiBhcmUgbm90IE5VTEwuCisgIC8vCisgIC8vIFBvc3Rjb25kaXRpb25zOgorICAvLyAqIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBmYWxzZSwgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHJldHVybiBvcgorICAvLyAgIGFuIGVycm9yIG9jY3VycmVkLiAgQWxsIGVycm9ycyBhcmUgcGVybWFuZW50LgorICAvLyAqIE90aGVyd2lzZSwgInNpemUiIHBvaW50cyB0byB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkIGFuZCAiZGF0YSIKKyAgLy8gICBwb2ludHMgdG8gYSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlc2UgYnl0ZXMuCisgIC8vICogT3duZXJzaGlwIG9mIHRoaXMgYnVmZmVyIHJlbWFpbnMgd2l0aCB0aGUgc3RyZWFtLCBhbmQgdGhlIGJ1ZmZlcgorICAvLyAgIHJlbWFpbnMgdmFsaWQgb25seSB1bnRpbCBzb21lIG90aGVyIG1ldGhvZCBvZiB0aGUgc3RyZWFtIGlzIGNhbGxlZAorICAvLyAgIG9yIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgorICAvLyAqIEl0IGlzIGxlZ2FsIGZvciB0aGUgcmV0dXJuZWQgYnVmZmVyIHRvIGhhdmUgemVybyBzaXplLCBhcyBsb25nCisgIC8vICAgYXMgcmVwZWF0ZWRseSBjYWxsaW5nIE5leHQoKSBldmVudHVhbGx5IHlpZWxkcyBhIGJ1ZmZlciB3aXRoIG5vbi16ZXJvCisgIC8vICAgc2l6ZS4KKyAgdmlydHVhbCBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgPSAwOworCisgIC8vIEJhY2tzIHVwIGEgbnVtYmVyIG9mIGJ5dGVzLCBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gTmV4dCgpIHJldHVybnMKKyAgLy8gZGF0YSBhZ2FpbiB0aGF0IHdhcyBhbHJlYWR5IHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gTmV4dCgpLiAgVGhpcworICAvLyBpcyB1c2VmdWwgd2hlbiB3cml0aW5nIHByb2NlZHVyZXMgdGhhdCBhcmUgb25seSBzdXBwb3NlZCB0byByZWFkIHVwCisgIC8vIHRvIGEgY2VydGFpbiBwb2ludCBpbiB0aGUgaW5wdXQsIHRoZW4gcmV0dXJuLiAgSWYgTmV4dCgpIHJldHVybnMgYQorICAvLyBidWZmZXIgdGhhdCBnb2VzIGJleW9uZCB3aGF0IHlvdSB3YW50ZWQgdG8gcmVhZCwgeW91IGNhbiB1c2UgQmFja1VwKCkKKyAgLy8gdG8gcmV0dXJuIHRvIHRoZSBwb2ludCB3aGVyZSB5b3UgaW50ZW5kZWQgdG8gZmluaXNoLgorICAvLworICAvLyBQcmVjb25kaXRpb25zOgorICAvLyAqIFRoZSBsYXN0IG1ldGhvZCBjYWxsZWQgbXVzdCBoYXZlIGJlZW4gTmV4dCgpLgorICAvLyAqIGNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBsYXN0IGJ1ZmZlcgorICAvLyAgIHJldHVybmVkIGJ5IE5leHQoKS4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogVGhlIGxhc3QgImNvdW50IiBieXRlcyBvZiB0aGUgbGFzdCBidWZmZXIgcmV0dXJuZWQgYnkgTmV4dCgpIHdpbGwgYmUKKyAgLy8gICBwdXNoZWQgYmFjayBpbnRvIHRoZSBzdHJlYW0uICBTdWJzZXF1ZW50IGNhbGxzIHRvIE5leHQoKSB3aWxsIHJldHVybgorICAvLyAgIHRoZSBzYW1lIGRhdGEgYWdhaW4gYmVmb3JlIHByb2R1Y2luZyBuZXcgZGF0YS4KKyAgdmlydHVhbCB2b2lkIEJhY2tVcChpbnQgY291bnQpID0gMDsKKworICAvLyBTa2lwcyBhIG51bWJlciBvZiBieXRlcy4gIFJldHVybnMgZmFsc2UgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzCisgIC8vIHJlYWNoZWQgb3Igc29tZSBpbnB1dCBlcnJvciBvY2N1cnJlZC4gIEluIHRoZSBlbmQtb2Ytc3RyZWFtIGNhc2UsIHRoZQorICAvLyBzdHJlYW0gaXMgYWR2YW5jZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIChzbyBCeXRlQ291bnQoKSB3aWxsIHJldHVybgorICAvLyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc3RyZWFtKS4KKyAgdmlydHVhbCBib29sIFNraXAoaW50IGNvdW50KSA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCisgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgPSAwOworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWmVyb0NvcHlJbnB1dFN0cmVhbSk7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2Ugc2ltaWxhciB0byBhbiBvdXRwdXQgc3RyZWFtIGJ1dCBkZXNpZ25lZCB0byBtaW5pbWl6ZQorLy8gY29weWluZy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICBpbmxpbmUgWmVyb0NvcHlPdXRwdXRTdHJlYW0oKSB7fQorICB2aXJ0dWFsIH5aZXJvQ29weU91dHB1dFN0cmVhbSgpOworCisgIC8vIE9idGFpbnMgYSBidWZmZXIgaW50byB3aGljaCBkYXRhIGNhbiBiZSB3cml0dGVuLiAgQW55IGRhdGEgd3JpdHRlbgorICAvLyBpbnRvIHRoaXMgYnVmZmVyIHdpbGwgZXZlbnR1YWxseSAobWF5YmUgaW5zdGFudGx5LCBtYXliZSBsYXRlciBvbikKKyAgLy8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0LgorICAvLworICAvLyBQcmVjb25kaXRpb25zOgorICAvLyAqICJzaXplIiBhbmQgImRhdGEiIGFyZSBub3QgTlVMTC4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogSWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIGZhbHNlLCBhbiBlcnJvciBvY2N1cnJlZC4gIEFsbCBlcnJvcnMgYXJlCisgIC8vICAgcGVybWFuZW50LgorICAvLyAqIE90aGVyd2lzZSwgInNpemUiIHBvaW50cyB0byB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCisgIC8vICAgYW5kICJkYXRhIiBwb2ludHMgdG8gdGhlIGJ1ZmZlci4KKyAgLy8gKiBPd25lcnNoaXAgb2YgdGhpcyBidWZmZXIgcmVtYWlucyB3aXRoIHRoZSBzdHJlYW0sIGFuZCB0aGUgYnVmZmVyCisgIC8vICAgcmVtYWlucyB2YWxpZCBvbmx5IHVudGlsIHNvbWUgb3RoZXIgbWV0aG9kIG9mIHRoZSBzdHJlYW0gaXMgY2FsbGVkCisgIC8vICAgb3IgdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuCisgIC8vICogQW55IGRhdGEgd2hpY2ggdGhlIGNhbGxlciBzdG9yZXMgaW4gdGhpcyBidWZmZXIgd2lsbCBldmVudHVhbGx5IGJlCisgIC8vICAgd3JpdHRlbiB0byB0aGUgb3V0cHV0ICh1bmxlc3MgQmFja1VwKCkgaXMgY2FsbGVkKS4KKyAgLy8gKiBJdCBpcyBsZWdhbCBmb3IgdGhlIHJldHVybmVkIGJ1ZmZlciB0byBoYXZlIHplcm8gc2l6ZSwgYXMgbG9uZworICAvLyAgIGFzIHJlcGVhdGVkbHkgY2FsbGluZyBOZXh0KCkgZXZlbnR1YWxseSB5aWVsZHMgYSBidWZmZXIgd2l0aCBub24temVybworICAvLyAgIHNpemUuCisgIHZpcnR1YWwgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpID0gMDsKKworICAvLyBCYWNrcyB1cCBhIG51bWJlciBvZiBieXRlcywgc28gdGhhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGJ1ZmZlciByZXR1cm5lZAorICAvLyBieSBOZXh0KCkgaXMgbm90IGFjdHVhbGx5IHdyaXR0ZW4uICBUaGlzIGlzIG5lZWRlZCB3aGVuIHlvdSBmaW5pc2gKKyAgLy8gd3JpdGluZyBhbGwgdGhlIGRhdGEgeW91IHdhbnQgdG8gd3JpdGUsIGJ1dCB0aGUgbGFzdCBidWZmZXIgd2FzIGJpZ2dlcgorICAvLyB0aGFuIHlvdSBuZWVkZWQuICBZb3UgZG9uJ3Qgd2FudCB0byB3cml0ZSBhIGJ1bmNoIG9mIGdhcmJhZ2UgYWZ0ZXIgdGhlCisgIC8vIGVuZCBvZiB5b3VyIGRhdGEsIHNvIHlvdSB1c2UgQmFja1VwKCkgdG8gYmFjayB1cC4KKyAgLy8KKyAgLy8gUHJlY29uZGl0aW9uczoKKyAgLy8gKiBUaGUgbGFzdCBtZXRob2QgY2FsbGVkIG11c3QgaGF2ZSBiZWVuIE5leHQoKS4KKyAgLy8gKiBjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBidWZmZXIKKyAgLy8gICByZXR1cm5lZCBieSBOZXh0KCkuCisgIC8vICogVGhlIGNhbGxlciBtdXN0IG5vdCBoYXZlIHdyaXR0ZW4gYW55dGhpbmcgdG8gdGhlIGxhc3QgImNvdW50IiBieXRlcworICAvLyAgIG9mIHRoYXQgYnVmZmVyLgorICAvLworICAvLyBQb3N0Y29uZGl0aW9uczoKKyAgLy8gKiBUaGUgbGFzdCAiY291bnQiIGJ5dGVzIG9mIHRoZSBsYXN0IGJ1ZmZlciByZXR1cm5lZCBieSBOZXh0KCkgd2lsbCBiZQorICAvLyAgIGlnbm9yZWQuCisgIHZpcnR1YWwgdm9pZCBCYWNrVXAoaW50IGNvdW50KSA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCisgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgPSAwOworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWmVyb0NvcHlPdXRwdXRTdHJlYW0pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmY2JiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjCkBAIC0wLDAgKzEsNDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKKyNpZmRlZiBfV0lOMzIKKy8vIFdpbjMyIGxzZWVrIGlzIGJyb2tlbjogIElmIGludm9rZWQgb24gYSBub24tc2Vla2FibGUgZmlsZSBkZXNjcmlwdG9yLCBpdHMKKy8vIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuICBXZSByZS1kZWZpbmUgaXQgdG8gYWx3YXlzIHByb2R1Y2UgYW4gZXJyb3IuCisjZGVmaW5lIGxzZWVrKGZkLCBvZmZzZXQsIG9yaWdpbikgKChvZmZfdCktMSkKKyNlbmRpZgorCituYW1lc3BhY2UgeworCisvLyBFSU5UUiBzdWNrcy4KK2ludCBjbG9zZV9ub19laW50cihpbnQgZmQpIHsKKyAgaW50IHJlc3VsdDsKKyAgZG8geworICAgIHJlc3VsdCA9IGNsb3NlKGZkKTsKKyAgfSB3aGlsZSAocmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRmlsZUlucHV0U3RyZWFtOjpGaWxlSW5wdXRTdHJlYW0oaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGJsb2NrX3NpemUpCisgIDogY29weWluZ19pbnB1dF8oZmlsZV9kZXNjcmlwdG9yKSwKKyAgICBpbXBsXygmY29weWluZ19pbnB1dF8sIGJsb2NrX3NpemUpIHsKK30KKworRmlsZUlucHV0U3RyZWFtOjp+RmlsZUlucHV0U3RyZWFtKCkge30KKworYm9vbCBGaWxlSW5wdXRTdHJlYW06OkNsb3NlKCkgeworICByZXR1cm4gY29weWluZ19pbnB1dF8uQ2xvc2UoKTsKK30KKworYm9vbCBGaWxlSW5wdXRTdHJlYW06Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICByZXR1cm4gaW1wbF8uTmV4dChkYXRhLCBzaXplKTsKK30KKwordm9pZCBGaWxlSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgaW1wbF8uQmFja1VwKGNvdW50KTsKK30KKworYm9vbCBGaWxlSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIHJldHVybiBpbXBsXy5Ta2lwKGNvdW50KTsKK30KKworaW50NjQgRmlsZUlucHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy5CeXRlQ291bnQoKTsKK30KKworRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtKAorICAgIGludCBmaWxlX2Rlc2NyaXB0b3IpCisgIDogZmlsZV8oZmlsZV9kZXNjcmlwdG9yKSwKKyAgICBjbG9zZV9vbl9kZWxldGVfKGZhbHNlKSwKKyAgICBpc19jbG9zZWRfKGZhbHNlKSwKKyAgICBlcnJub18oMCksCisgICAgcHJldmlvdXNfc2Vla19mYWlsZWRfKGZhbHNlKSB7Cit9CisKK0ZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbTo6fkNvcHlpbmdGaWxlSW5wdXRTdHJlYW0oKSB7CisgIGlmIChjbG9zZV9vbl9kZWxldGVfKSB7CisgICAgaWYgKCFDbG9zZSgpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiY2xvc2UoKSBmYWlsZWQ6ICIgPDwgc3RyZXJyb3IoZXJybm9fKTsKKyAgICB9CisgIH0KK30KKworYm9vbCBGaWxlSW5wdXRTdHJlYW06OkNvcHlpbmdGaWxlSW5wdXRTdHJlYW06OkNsb3NlKCkgeworICBHT09HTEVfQ0hFQ0soIWlzX2Nsb3NlZF8pOworCisgIGlzX2Nsb3NlZF8gPSB0cnVlOworICBpZiAoY2xvc2Vfbm9fZWludHIoZmlsZV8pICE9IDApIHsKKyAgICAvLyBUaGUgZG9jcyBvbiBjbG9zZSgpIGRvIG5vdCBzcGVjaWZ5IHdoZXRoZXIgYSBmaWxlIGRlc2NyaXB0b3IgaXMgc3RpbGwKKyAgICAvLyBvcGVuIGFmdGVyIGNsb3NlKCkgZmFpbHMgd2l0aCBFSU8uICBIb3dldmVyLCB0aGUgZ2xpYmMgc291cmNlIGNvZGUKKyAgICAvLyBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIG5vdC4KKyAgICBlcnJub18gPSBlcnJubzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IEZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbTo6UmVhZCh2b2lkKiBidWZmZXIsIGludCBzaXplKSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisKKyAgaW50IHJlc3VsdDsKKyAgZG8geworICAgIHJlc3VsdCA9IHJlYWQoZmlsZV8sIGJ1ZmZlciwgc2l6ZSk7CisgIH0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgLy8gUmVhZCBlcnJvciAobm90IEVPRikuCisgICAgZXJybm9fID0gZXJybm87CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0soIWlzX2Nsb3NlZF8pOworCisgIGlmICghcHJldmlvdXNfc2Vla19mYWlsZWRfICYmCisgICAgICBsc2VlayhmaWxlXywgY291bnQsIFNFRUtfQ1VSKSAhPSAob2ZmX3QpLTEpIHsKKyAgICAvLyBTZWVrIHN1Y2NlZWRlZC4KKyAgICByZXR1cm4gY291bnQ7CisgIH0gZWxzZSB7CisgICAgLy8gRmFpbGVkIHRvIHNlZWsuCisKKyAgICAvLyBOb3RlIHRvIHNlbGY6ICBEb24ndCBzZWVrIGFnYWluLiAgVGhpcyBmaWxlIGRlc2NyaXB0b3IgZG9lc24ndAorICAgIC8vIHN1cHBvcnQgaXQuCisgICAgcHJldmlvdXNfc2Vla19mYWlsZWRfID0gdHJ1ZTsKKworICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKyAgICByZXR1cm4gQ29weWluZ0lucHV0U3RyZWFtOjpTa2lwKGNvdW50KTsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpbGVPdXRwdXRTdHJlYW06OkZpbGVPdXRwdXRTdHJlYW0oaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGJsb2NrX3NpemUpCisgIDogY29weWluZ19vdXRwdXRfKGZpbGVfZGVzY3JpcHRvciksCisgICAgaW1wbF8oJmNvcHlpbmdfb3V0cHV0XywgYmxvY2tfc2l6ZSkgeworfQorCitGaWxlT3V0cHV0U3RyZWFtOjp+RmlsZU91dHB1dFN0cmVhbSgpIHsKKyAgaW1wbF8uRmx1c2goKTsKK30KKworYm9vbCBGaWxlT3V0cHV0U3RyZWFtOjpDbG9zZSgpIHsKKyAgYm9vbCBmbHVzaF9zdWNjZWVkZWQgPSBpbXBsXy5GbHVzaCgpOworICByZXR1cm4gY29weWluZ19vdXRwdXRfLkNsb3NlKCkgJiYgZmx1c2hfc3VjY2VlZGVkOworfQorCitib29sIEZpbGVPdXRwdXRTdHJlYW06OkZsdXNoKCkgeworICByZXR1cm4gaW1wbF8uRmx1c2goKTsKK30KKworYm9vbCBGaWxlT3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgcmV0dXJuIGltcGxfLk5leHQoZGF0YSwgc2l6ZSk7Cit9CisKK3ZvaWQgRmlsZU91dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBpbXBsXy5CYWNrVXAoY291bnQpOworfQorCitpbnQ2NCBGaWxlT3V0cHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy5CeXRlQ291bnQoKTsKK30KKworRmlsZU91dHB1dFN0cmVhbTo6Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW06OkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtKAorICAgIGludCBmaWxlX2Rlc2NyaXB0b3IpCisgIDogZmlsZV8oZmlsZV9kZXNjcmlwdG9yKSwKKyAgICBjbG9zZV9vbl9kZWxldGVfKGZhbHNlKSwKKyAgICBpc19jbG9zZWRfKGZhbHNlKSwKKyAgICBlcnJub18oMCkgeworfQorCitGaWxlT3V0cHV0U3RyZWFtOjpDb3B5aW5nRmlsZU91dHB1dFN0cmVhbTo6fkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtKCkgeworICBpZiAoY2xvc2Vfb25fZGVsZXRlXykgeworICAgIGlmICghQ2xvc2UoKSkgeworICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgImNsb3NlKCkgZmFpbGVkOiAiIDw8IHN0cmVycm9yKGVycm5vXyk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgRmlsZU91dHB1dFN0cmVhbTo6Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW06OkNsb3NlKCkgeworICBHT09HTEVfQ0hFQ0soIWlzX2Nsb3NlZF8pOworCisgIGlzX2Nsb3NlZF8gPSB0cnVlOworICBpZiAoY2xvc2Vfbm9fZWludHIoZmlsZV8pICE9IDApIHsKKyAgICAvLyBUaGUgZG9jcyBvbiBjbG9zZSgpIGRvIG5vdCBzcGVjaWZ5IHdoZXRoZXIgYSBmaWxlIGRlc2NyaXB0b3IgaXMgc3RpbGwKKyAgICAvLyBvcGVuIGFmdGVyIGNsb3NlKCkgZmFpbHMgd2l0aCBFSU8uICBIb3dldmVyLCB0aGUgZ2xpYmMgc291cmNlIGNvZGUKKyAgICAvLyBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIG5vdC4KKyAgICBlcnJub18gPSBlcnJubzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaWxlT3V0cHV0U3RyZWFtOjpDb3B5aW5nRmlsZU91dHB1dFN0cmVhbTo6V3JpdGUoCisgICAgY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgeworICBHT09HTEVfQ0hFQ0soIWlzX2Nsb3NlZF8pOworICBpbnQgdG90YWxfd3JpdHRlbiA9IDA7CisKKyAgY29uc3QgdWludDgqIGJ1ZmZlcl9iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGJ1ZmZlcik7CisKKyAgd2hpbGUgKHRvdGFsX3dyaXR0ZW4gPCBzaXplKSB7CisgICAgaW50IGJ5dGVzOworICAgIGRvIHsKKyAgICAgIGJ5dGVzID0gd3JpdGUoZmlsZV8sIGJ1ZmZlcl9iYXNlICsgdG90YWxfd3JpdHRlbiwgc2l6ZSAtIHRvdGFsX3dyaXR0ZW4pOworICAgIH0gd2hpbGUgKGJ5dGVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgLy8gV3JpdGUgZXJyb3IuCisKKyAgICAgIC8vIEZJWE1FKGtlbnRvbik6ICBBY2NvcmRpbmcgdG8gdGhlIG1hbiBwYWdlLCBpZiB3cml0ZSgpIHJldHVybnMgemVybywKKyAgICAgIC8vICAgdGhlcmUgd2FzIG5vIGVycm9yOyB3cml0ZSgpIHNpbXBseSBkaWQgbm90IHdyaXRlIGFueXRoaW5nLiAgSXQncworICAgICAgLy8gICB1bmNsZWFyIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGlzIG1pZ2h0IGhhcHBlbiwgYnV0IHByZXN1bWFibHkKKyAgICAgIC8vICAgZXJybm8gd29uJ3QgYmUgc2V0IGluIHRoaXMgY2FzZS4gIEkgYW0gY29uZnVzZWQgYXMgdG8gaG93IHN1Y2ggYW4KKyAgICAgIC8vICAgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuICBGb3Igbm93IEknbSB0cmVhdGluZyBpdCBhcyBhbiBlcnJvciwgc2luY2UKKyAgICAgIC8vICAgcmV0cnlpbmcgc2VlbXMgbGlrZSBpdCBjb3VsZCBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuICBJIHN1c3BlY3QKKyAgICAgIC8vICAgdGhpcyBuZXZlciBhY3R1YWxseSBoYXBwZW5zIGFueXdheS4KKworICAgICAgaWYgKGJ5dGVzIDwgMCkgeworICAgICAgICBlcnJub18gPSBlcnJubzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdG90YWxfd3JpdHRlbiArPSBieXRlczsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lzdHJlYW1JbnB1dFN0cmVhbTo6SXN0cmVhbUlucHV0U3RyZWFtKGlzdHJlYW0qIGlucHV0LCBpbnQgYmxvY2tfc2l6ZSkKKyAgOiBjb3B5aW5nX2lucHV0XyhpbnB1dCksCisgICAgaW1wbF8oJmNvcHlpbmdfaW5wdXRfLCBibG9ja19zaXplKSB7Cit9CisKK0lzdHJlYW1JbnB1dFN0cmVhbTo6fklzdHJlYW1JbnB1dFN0cmVhbSgpIHt9CisKK2Jvb2wgSXN0cmVhbUlucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgcmV0dXJuIGltcGxfLk5leHQoZGF0YSwgc2l6ZSk7Cit9CisKK3ZvaWQgSXN0cmVhbUlucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIGltcGxfLkJhY2tVcChjb3VudCk7Cit9CisKK2Jvb2wgSXN0cmVhbUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICByZXR1cm4gaW1wbF8uU2tpcChjb3VudCk7Cit9CisKK2ludDY0IElzdHJlYW1JbnB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbF8uQnl0ZUNvdW50KCk7Cit9CisKK0lzdHJlYW1JbnB1dFN0cmVhbTo6Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbTo6Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSgKKyAgICBpc3RyZWFtKiBpbnB1dCkKKyAgOiBpbnB1dF8oaW5wdXQpIHsKK30KKworSXN0cmVhbUlucHV0U3RyZWFtOjpDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtOjp+Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSgpIHt9CisKK2ludCBJc3RyZWFtSW5wdXRTdHJlYW06OkNvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW06OlJlYWQoCisgICAgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgeworICBpbnB1dF8tPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyKSwgc2l6ZSk7CisgIGludCByZXN1bHQgPSBpbnB1dF8tPmdjb3VudCgpOworICBpZiAocmVzdWx0ID09IDAgJiYgaW5wdXRfLT5mYWlsKCkgJiYgIWlucHV0Xy0+ZW9mKCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPc3RyZWFtT3V0cHV0U3RyZWFtOjpPc3RyZWFtT3V0cHV0U3RyZWFtKG9zdHJlYW0qIG91dHB1dCwgaW50IGJsb2NrX3NpemUpCisgIDogY29weWluZ19vdXRwdXRfKG91dHB1dCksCisgICAgaW1wbF8oJmNvcHlpbmdfb3V0cHV0XywgYmxvY2tfc2l6ZSkgeworfQorCitPc3RyZWFtT3V0cHV0U3RyZWFtOjp+T3N0cmVhbU91dHB1dFN0cmVhbSgpIHsKKyAgaW1wbF8uRmx1c2goKTsKK30KKworYm9vbCBPc3RyZWFtT3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgcmV0dXJuIGltcGxfLk5leHQoZGF0YSwgc2l6ZSk7Cit9CisKK3ZvaWQgT3N0cmVhbU91dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBpbXBsXy5CYWNrVXAoY291bnQpOworfQorCitpbnQ2NCBPc3RyZWFtT3V0cHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy5CeXRlQ291bnQoKTsKK30KKworT3N0cmVhbU91dHB1dFN0cmVhbTo6Q29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW06OkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtKAorICAgIG9zdHJlYW0qIG91dHB1dCkKKyAgOiBvdXRwdXRfKG91dHB1dCkgeworfQorCitPc3RyZWFtT3V0cHV0U3RyZWFtOjpDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbTo6fkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtKCkgeworfQorCitib29sIE9zdHJlYW1PdXRwdXRTdHJlYW06OkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtOjpXcml0ZSgKKyAgICBjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplKSB7CisgIG91dHB1dF8tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlciksIHNpemUpOworICByZXR1cm4gb3V0cHV0Xy0+Z29vZCgpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbTo6Q29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKAorICAgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGNvbnN0IHN0cmVhbXNbXSwgaW50IGNvdW50KQorICA6IHN0cmVhbXNfKHN0cmVhbXMpLCBzdHJlYW1fY291bnRfKGNvdW50KSwgYnl0ZXNfcmV0aXJlZF8oMCkgeworfQorCitDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW06On5Db25jYXRlbmF0aW5nSW5wdXRTdHJlYW0oKSB7Cit9CisKK2Jvb2wgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgd2hpbGUgKHN0cmVhbV9jb3VudF8gPiAwKSB7CisgICAgaWYgKHN0cmVhbXNfWzBdLT5OZXh0KGRhdGEsIHNpemUpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFRoYXQgc3RyZWFtIGlzIGRvbmUuICBBZHZhbmNlIHRvIHRoZSBuZXh0IG9uZS4KKyAgICBieXRlc19yZXRpcmVkXyArPSBzdHJlYW1zX1swXS0+Qnl0ZUNvdW50KCk7CisgICAgKytzdHJlYW1zXzsKKyAgICAtLXN0cmVhbV9jb3VudF87CisgIH0KKworICAvLyBObyBtb3JlIHN0cmVhbXMuCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgaWYgKHN0cmVhbV9jb3VudF8gPiAwKSB7CisgICAgc3RyZWFtc19bMF0tPkJhY2tVcChjb3VudCk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJDYW4ndCBCYWNrVXAoKSBhZnRlciBmYWlsZWQgTmV4dCgpLiI7CisgIH0KK30KKworYm9vbCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIHdoaWxlIChzdHJlYW1fY291bnRfID4gMCkgeworICAgIC8vIEFzc3VtZSB0aGF0IEJ5dGVDb3VudCgpIGNhbiBiZSB1c2VkIHRvIGZpbmQgb3V0IGhvdyBtdWNoIHdlIGFjdHVhbGx5CisgICAgLy8gc2tpcHBlZCB3aGVuIFNraXAoKSBmYWlscy4KKyAgICBpbnQ2NCB0YXJnZXRfYnl0ZV9jb3VudCA9IHN0cmVhbXNfWzBdLT5CeXRlQ291bnQoKSArIGNvdW50OworICAgIGlmIChzdHJlYW1zX1swXS0+U2tpcChjb3VudCkpIHJldHVybiB0cnVlOworCisgICAgLy8gSGl0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIEZpZ3VyZSBvdXQgaG93IG1hbnkgbW9yZSBieXRlcyB3ZSBzdGlsbCBoYXZlCisgICAgLy8gdG8gc2tpcC4KKyAgICBpbnQ2NCBmaW5hbF9ieXRlX2NvdW50ID0gc3RyZWFtc19bMF0tPkJ5dGVDb3VudCgpOworICAgIEdPT0dMRV9EQ0hFQ0tfTFQoZmluYWxfYnl0ZV9jb3VudCwgdGFyZ2V0X2J5dGVfY291bnQpOworICAgIGNvdW50ID0gdGFyZ2V0X2J5dGVfY291bnQgLSBmaW5hbF9ieXRlX2NvdW50OworCisgICAgLy8gVGhhdCBzdHJlYW0gaXMgZG9uZS4gIEFkdmFuY2UgdG8gdGhlIG5leHQgb25lLgorICAgIGJ5dGVzX3JldGlyZWRfICs9IGZpbmFsX2J5dGVfY291bnQ7CisgICAgKytzdHJlYW1zXzsKKyAgICAtLXN0cmVhbV9jb3VudF87CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDY0IENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgeworICBpZiAoc3RyZWFtX2NvdW50XyA9PSAwKSB7CisgICAgcmV0dXJuIGJ5dGVzX3JldGlyZWRfOworICB9IGVsc2UgeworICAgIHJldHVybiBieXRlc19yZXRpcmVkXyArIHN0cmVhbXNfWzBdLT5CeXRlQ291bnQoKTsKKyAgfQorfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGltaXRpbmdJbnB1dFN0cmVhbTo6TGltaXRpbmdJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgbGltaXQpCisgIDogaW5wdXRfKGlucHV0KSwgbGltaXRfKGxpbWl0KSB7fQorCitMaW1pdGluZ0lucHV0U3RyZWFtOjp+TGltaXRpbmdJbnB1dFN0cmVhbSgpIHsKKyAgLy8gSWYgd2Ugb3ZlcnNob3QgdGhlIGxpbWl0LCBiYWNrIHVwLgorICBpZiAobGltaXRfIDwgMCkgaW5wdXRfLT5CYWNrVXAoLWxpbWl0Xyk7Cit9CisKK2Jvb2wgTGltaXRpbmdJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChsaW1pdF8gPD0gMCkgcmV0dXJuIGZhbHNlOworICBpZiAoIWlucHV0Xy0+TmV4dChkYXRhLCBzaXplKSkgcmV0dXJuIGZhbHNlOworCisgIGxpbWl0XyAtPSAqc2l6ZTsKKyAgaWYgKGxpbWl0XyA8IDApIHsKKyAgICAvLyBXZSBvdmVyc2hvdCB0aGUgbGltaXQuICBSZWR1Y2UgKnNpemUgdG8gaGlkZSB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgorICAgICpzaXplICs9IGxpbWl0XzsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMaW1pdGluZ0lucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIGlmIChsaW1pdF8gPCAwKSB7CisgICAgaW5wdXRfLT5CYWNrVXAoY291bnQgLSBsaW1pdF8pOworICAgIGxpbWl0XyA9IGNvdW50OworICB9IGVsc2UgeworICAgIGlucHV0Xy0+QmFja1VwKGNvdW50KTsKKyAgICBsaW1pdF8gKz0gY291bnQ7CisgIH0KK30KKworYm9vbCBMaW1pdGluZ0lucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICBpZiAoY291bnQgPiBsaW1pdF8pIHsKKyAgICBpZiAobGltaXRfIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlucHV0Xy0+U2tpcChsaW1pdF8pOworICAgIGxpbWl0XyA9IDA7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGlmICghaW5wdXRfLT5Ta2lwKGNvdW50KSkgcmV0dXJuIGZhbHNlOworICAgIGxpbWl0XyAtPSBjb3VudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitpbnQ2NCBMaW1pdGluZ0lucHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIGlmIChsaW1pdF8gPCAwKSB7CisgICAgcmV0dXJuIGlucHV0Xy0+Qnl0ZUNvdW50KCkgKyBsaW1pdF87CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGlucHV0Xy0+Qnl0ZUNvdW50KCk7CisgIH0KK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZGIwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaApAQCAtMCwwICsxLDM1NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGludGVyZmFjZXMgZGVmaW5lZCBpbgorLy8gemVyb19jb3B5X3N0cmVhbS5oIHdoaWNoIGFyZSBvbmx5IGluY2x1ZGVkIGluIHRoZSBmdWxsIChub24tbGl0ZSkKKy8vIHByb3RvYnVmIGxpYnJhcnkuICBUaGVzZSBpbXBsZW1lbnRhdGlvbnMgaW5jbHVkZSBVbml4IGZpbGUgZGVzY3JpcHRvcnMKKy8vIGFuZCBDKysgaW9zdHJlYW1zLiAgU2VlIGFsc286ICB6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSB3aGljaCByZWFkcyBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLgorLy8KKy8vIEZpbGVJbnB1dFN0cmVhbSBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBhbiBpZnN0cmVhbSB3aXRoIElzdHJlYW1JbnB1dFN0cmVhbS4KKy8vIFRoZSBsYXR0ZXIgd2lsbCBpbnRyb2R1Y2UgYW4gZXh0cmEgbGF5ZXIgb2YgYnVmZmVyaW5nLCBoYXJtaW5nIHBlcmZvcm1hbmNlLgorLy8gQWxzbywgaXQncyBjb25jZWl2YWJsZSB0aGF0IEZpbGVJbnB1dFN0cmVhbSBjb3VsZCBzb21lZGF5IGJlIGVuaGFuY2VkCisvLyB0byB1c2UgemVyby1jb3B5IGZpbGUgZGVzY3JpcHRvcnMgb24gT1NzIHdoaWNoIHN1cHBvcnQgdGhlbS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWxlSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgcmVhZHMgZnJvbSB0aGUgZ2l2ZW4gVW5peCBmaWxlIGRlc2NyaXB0b3IuCisgIC8vIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAorICAvLyBzaG91bGQgYmUgcmVhZCBhbmQgcmV0dXJuZWQgd2l0aCBlYWNoIGNhbGwgdG8gTmV4dCgpLiAgT3RoZXJ3aXNlLAorICAvLyBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLgorICBleHBsaWNpdCBGaWxlSW5wdXRTdHJlYW0oaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGJsb2NrX3NpemUgPSAtMSk7CisgIH5GaWxlSW5wdXRTdHJlYW0oKTsKKworICAvLyBGbHVzaGVzIGFueSBidWZmZXJzIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgZmlsZS4gIFJldHVybnMgZmFsc2UgaWYKKyAgLy8gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgcHJvY2VzczsgdXNlIEdldEVycm5vKCkgdG8gZXhhbWluZSB0aGUgZXJyb3IuCisgIC8vIEV2ZW4gaWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCB3aGVuIHRoaXMgcmV0dXJucy4KKyAgYm9vbCBDbG9zZSgpOworCisgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGNsb3NlZCB3aGVuIHRoZSBzdHJlYW0gaXMKKyAgLy8gZGVzdHJveWVkLiAgQ2FsbCBTZXRDbG9zZU9uRGVsZXRlKHRydWUpIHRvIGNoYW5nZSB0aGF0LiAgV0FSTklORzoKKyAgLy8gVGhpcyBsZWF2ZXMgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGRldGVjdCBpZiBjbG9zZSgpIGZhaWxzLiAgSWYKKyAgLy8gZGV0ZWN0aW5nIGNsb3NlKCkgZXJyb3JzIGlzIGltcG9ydGFudCB0byB5b3UsIHlvdSBzaG91bGQgYXJyYW5nZQorICAvLyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciB5b3Vyc2VsZi4KKyAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY29weWluZ19pbnB1dF8uU2V0Q2xvc2VPbkRlbGV0ZSh2YWx1ZSk7IH0KKworICAvLyBJZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkIG9uIHRoaXMgZmlsZSBkZXNjcmlwdG9yLCB0aGlzIGlzIHRoZQorICAvLyBlcnJubyBmcm9tIHRoYXQgZXJyb3IuICBPdGhlcndpc2UsIHRoaXMgaXMgemVyby4gIE9uY2UgYW4gZXJyb3IKKyAgLy8gb2NjdXJzLCB0aGUgc3RyZWFtIGlzIGJyb2tlbiBhbmQgYWxsIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB3aWxsCisgIC8vIGZhaWwuCisgIGludCBHZXRFcnJubygpIHsgcmV0dXJuIGNvcHlpbmdfaW5wdXRfLkdldEVycm5vKCk7IH0KKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGJvb2wgU2tpcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nRmlsZUlucHV0U3RyZWFtIDogcHVibGljIENvcHlpbmdJbnB1dFN0cmVhbSB7CisgICBwdWJsaWM6CisgICAgQ29weWluZ0ZpbGVJbnB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yKTsKKyAgICB+Q29weWluZ0ZpbGVJbnB1dFN0cmVhbSgpOworCisgICAgYm9vbCBDbG9zZSgpOworICAgIHZvaWQgU2V0Q2xvc2VPbkRlbGV0ZShib29sIHZhbHVlKSB7IGNsb3NlX29uX2RlbGV0ZV8gPSB2YWx1ZTsgfQorICAgIGludCBHZXRFcnJubygpIHsgcmV0dXJuIGVycm5vXzsgfQorCisgICAgLy8gaW1wbGVtZW50cyBDb3B5aW5nSW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgaW50IFJlYWQodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7CisgICAgaW50IFNraXAoaW50IGNvdW50KTsKKworICAgcHJpdmF0ZToKKyAgICAvLyBUaGUgZmlsZSBkZXNjcmlwdG9yLgorICAgIGNvbnN0IGludCBmaWxlXzsKKyAgICBib29sIGNsb3NlX29uX2RlbGV0ZV87CisgICAgYm9vbCBpc19jbG9zZWRfOworCisgICAgLy8gVGhlIGVycm5vIG9mIHRoZSBJL08gZXJyb3IsIGlmIG9uZSBoYXMgb2NjdXJyZWQuICBPdGhlcndpc2UsIHplcm8uCisgICAgaW50IGVycm5vXzsKKworICAgIC8vIERpZCB3ZSB0cnkgdG8gc2VlayBvbmNlIGFuZCBmYWlsPyAgSWYgc28sIHdlIGFzc3VtZSB0aGlzIGZpbGUgZGVzY3JpcHRvcgorICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBzZWVraW5nIGFuZCB3b24ndCB0cnkgYWdhaW4uCisgICAgYm9vbCBwcmV2aW91c19zZWVrX2ZhaWxlZF87CisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ0ZpbGVJbnB1dFN0cmVhbSk7CisgIH07CisKKyAgQ29weWluZ0ZpbGVJbnB1dFN0cmVhbSBjb3B5aW5nX2lucHV0XzsKKyAgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvciBpbXBsXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZUlucHV0U3RyZWFtKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCB3cml0ZXMgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisvLworLy8gRmlsZU91dHB1dFN0cmVhbSBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBhbiBvZnN0cmVhbSB3aXRoCisvLyBPc3RyZWFtT3V0cHV0U3RyZWFtLiAgVGhlIGxhdHRlciB3aWxsIGludHJvZHVjZSBhbiBleHRyYSBsYXllciBvZiBidWZmZXJpbmcsCisvLyBoYXJtaW5nIHBlcmZvcm1hbmNlLiAgQWxzbywgaXQncyBjb25jZWl2YWJsZSB0aGF0IEZpbGVPdXRwdXRTdHJlYW0gY291bGQKKy8vIHNvbWVkYXkgYmUgZW5oYW5jZWQgdG8gdXNlIHplcm8tY29weSBmaWxlIGRlc2NyaXB0b3JzIG9uIE9TcyB3aGljaAorLy8gc3VwcG9ydCB0aGVtLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpbGVPdXRwdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlPdXRwdXRTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4gVW5peCBmaWxlIGRlc2NyaXB0b3IuCisgIC8vIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXJzCisgIC8vIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGJ5IE5leHQoKS4gIE90aGVyd2lzZSwgYSByZWFzb25hYmxlIGRlZmF1bHQKKyAgLy8gaXMgdXNlZC4KKyAgZXhwbGljaXQgRmlsZU91dHB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKyAgfkZpbGVPdXRwdXRTdHJlYW0oKTsKKworICAvLyBGbHVzaGVzIGFueSBidWZmZXJzIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgZmlsZS4gIFJldHVybnMgZmFsc2UgaWYKKyAgLy8gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgcHJvY2VzczsgdXNlIEdldEVycm5vKCkgdG8gZXhhbWluZSB0aGUgZXJyb3IuCisgIC8vIEV2ZW4gaWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCB3aGVuIHRoaXMgcmV0dXJucy4KKyAgYm9vbCBDbG9zZSgpOworCisgIC8vIEZsdXNoZXMgRmlsZU91dHB1dFN0cmVhbSdzIGJ1ZmZlcnMgYnV0IGRvZXMgbm90IGNsb3NlIHRoZQorICAvLyB1bmRlcmx5aW5nIGZpbGUuIE5vIHNwZWNpYWwgbWVhc3VyZXMgYXJlIHRha2VuIHRvIGVuc3VyZSB0aGF0CisgIC8vIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSBmaWxlIG9iamVjdCBpcyBzeW5jaHJvbml6ZWQgdG8gZGlzay4KKyAgYm9vbCBGbHVzaCgpOworCisgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGNsb3NlZCB3aGVuIHRoZSBzdHJlYW0gaXMKKyAgLy8gZGVzdHJveWVkLiAgQ2FsbCBTZXRDbG9zZU9uRGVsZXRlKHRydWUpIHRvIGNoYW5nZSB0aGF0LiAgV0FSTklORzoKKyAgLy8gVGhpcyBsZWF2ZXMgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGRldGVjdCBpZiBjbG9zZSgpIGZhaWxzLiAgSWYKKyAgLy8gZGV0ZWN0aW5nIGNsb3NlKCkgZXJyb3JzIGlzIGltcG9ydGFudCB0byB5b3UsIHlvdSBzaG91bGQgYXJyYW5nZQorICAvLyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciB5b3Vyc2VsZi4KKyAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY29weWluZ19vdXRwdXRfLlNldENsb3NlT25EZWxldGUodmFsdWUpOyB9CisKKyAgLy8gSWYgYW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZCBvbiB0aGlzIGZpbGUgZGVzY3JpcHRvciwgdGhpcyBpcyB0aGUKKyAgLy8gZXJybm8gZnJvbSB0aGF0IGVycm9yLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIHplcm8uICBPbmNlIGFuIGVycm9yCisgIC8vIG9jY3VycywgdGhlIHN0cmVhbSBpcyBicm9rZW4gYW5kIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgd2lsbAorICAvLyBmYWlsLgorICBpbnQgR2V0RXJybm8oKSB7IHJldHVybiBjb3B5aW5nX291dHB1dF8uR2V0RXJybm8oKTsgfQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ0ZpbGVPdXRwdXRTdHJlYW0gOiBwdWJsaWMgQ29weWluZ091dHB1dFN0cmVhbSB7CisgICBwdWJsaWM6CisgICAgQ29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oaW50IGZpbGVfZGVzY3JpcHRvcik7CisgICAgfkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtKCk7CisKKyAgICBib29sIENsb3NlKCk7CisgICAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY2xvc2Vfb25fZGVsZXRlXyA9IHZhbHVlOyB9CisgICAgaW50IEdldEVycm5vKCkgeyByZXR1cm4gZXJybm9fOyB9CisKKyAgICAvLyBpbXBsZW1lbnRzIENvcHlpbmdPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBib29sIFdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOworCisgICBwcml2YXRlOgorICAgIC8vIFRoZSBmaWxlIGRlc2NyaXB0b3IuCisgICAgY29uc3QgaW50IGZpbGVfOworICAgIGJvb2wgY2xvc2Vfb25fZGVsZXRlXzsKKyAgICBib29sIGlzX2Nsb3NlZF87CisKKyAgICAvLyBUaGUgZXJybm8gb2YgdGhlIEkvTyBlcnJvciwgaWYgb25lIGhhcyBvY2N1cnJlZC4gIE90aGVyd2lzZSwgemVyby4KKyAgICBpbnQgZXJybm9fOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdGaWxlT3V0cHV0U3RyZWFtKTsKKyAgfTsKKworICBDb3B5aW5nRmlsZU91dHB1dFN0cmVhbSBjb3B5aW5nX291dHB1dF87CisgIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIGltcGxfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlT3V0cHV0U3RyZWFtKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHdoaWNoIHJlYWRzIGZyb20gYSBDKysgaXN0cmVhbS4KKy8vCisvLyBOb3RlIHRoYXQgZm9yIHJlYWRpbmcgZmlsZXMgKG9yIGFueXRoaW5nIHJlcHJlc2VudGVkIGJ5IGEgZmlsZSBkZXNjcmlwdG9yKSwKKy8vIEZpbGVJbnB1dFN0cmVhbSBpcyBtb3JlIGVmZmljaWVudC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBJc3RyZWFtSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgcmVhZHMgZnJvbSB0aGUgZ2l2ZW4gQysrIGlzdHJlYW0uCisgIC8vIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAorICAvLyBzaG91bGQgYmUgcmVhZCBhbmQgcmV0dXJuZWQgd2l0aCBlYWNoIGNhbGwgdG8gTmV4dCgpLiAgT3RoZXJ3aXNlLAorICAvLyBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLgorICBleHBsaWNpdCBJc3RyZWFtSW5wdXRTdHJlYW0oaXN0cmVhbSogc3RyZWFtLCBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKyAgfklzdHJlYW1JbnB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgYm9vbCBTa2lwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW0gOiBwdWJsaWMgQ29weWluZ0lucHV0U3RyZWFtIHsKKyAgIHB1YmxpYzoKKyAgICBDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKGlzdHJlYW0qIGlucHV0KTsKKyAgICB+Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSgpOworCisgICAgLy8gaW1wbGVtZW50cyBDb3B5aW5nSW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgaW50IFJlYWQodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7CisgICAgLy8gKFdlIHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBTa2lwKCkuKQorCisgICBwcml2YXRlOgorICAgIC8vIFRoZSBzdHJlYW0uCisgICAgaXN0cmVhbSogaW5wdXRfOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW0pOworICB9OworCisgIENvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW0gY29weWluZ19pbnB1dF87CisgIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IgaW1wbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElzdHJlYW1JbnB1dFN0cmVhbSk7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gd2hpY2ggd3JpdGVzIHRvIGEgQysrIG9zdHJlYW0uCisvLworLy8gTm90ZSB0aGF0IGZvciB3cml0aW5nIGZpbGVzIChvciBhbnl0aGluZyByZXByZXNlbnRlZCBieSBhIGZpbGUgZGVzY3JpcHRvciksCisvLyBGaWxlT3V0cHV0U3RyZWFtIGlzIG1vcmUgZWZmaWNpZW50LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE9zdHJlYW1PdXRwdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlPdXRwdXRTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4gQysrIG9zdHJlYW0uCisgIC8vIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXJzCisgIC8vIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGJ5IE5leHQoKS4gIE90aGVyd2lzZSwgYSByZWFzb25hYmxlIGRlZmF1bHQKKyAgLy8gaXMgdXNlZC4KKyAgZXhwbGljaXQgT3N0cmVhbU91dHB1dFN0cmVhbShvc3RyZWFtKiBzdHJlYW0sIGludCBibG9ja19zaXplID0gLTEpOworICB+T3N0cmVhbU91dHB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0gOiBwdWJsaWMgQ29weWluZ091dHB1dFN0cmVhbSB7CisgICBwdWJsaWM6CisgICAgQ29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0ob3N0cmVhbSogb3V0cHV0KTsKKyAgICB+Q29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0oKTsKKworICAgIC8vIGltcGxlbWVudHMgQ29weWluZ091dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgV3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgLy8gVGhlIHN0cmVhbS4KKyAgICBvc3RyZWFtKiBvdXRwdXRfOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtKTsKKyAgfTsKKworICBDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSBjb3B5aW5nX291dHB1dF87CisgIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIGltcGxfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPc3RyZWFtT3V0cHV0U3RyZWFtKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHdoaWNoIHJlYWRzIGZyb20gc2V2ZXJhbCBvdGhlciBzdHJlYW1zIGluIHNlcXVlbmNlLgorLy8gQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtIGlzIHVuYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVuZC1vZi1zdHJlYW0KKy8vIGFuZCByZWFkIGVycm9ycyBpbiB0aGUgdW5kZXJseWluZyBzdHJlYW1zLCBzbyBpdCBhc3N1bWVzIGFueSBlcnJvcnMgbWVhbgorLy8gZW5kLW9mLXN0cmVhbS4gIFNvLCBpZiB0aGUgdW5kZXJseWluZyBzdHJlYW1zIGZhaWwgZm9yIGFueSBvdGhlciByZWFzb24sCisvLyBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gbWF5IGRvIG9kZCB0aGluZ3MuICBJdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3UgZG8KKy8vIG5vdCB1c2UgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtIG9uIHN0cmVhbXMgdGhhdCBtaWdodCBwcm9kdWNlIHJlYWQgZXJyb3JzCisvLyBvdGhlciB0aGFuIGVuZC1vZi1zdHJlYW0uCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gQWxsIHN0cmVhbXMgcGFzc2VkIGluIGFzIHdlbGwgYXMgdGhlIGFycmF5IGl0c2VsZiBtdXN0IHJlbWFpbiB2YWxpZAorICAvLyB1bnRpbCB0aGUgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtIGlzIGRlc3Ryb3llZC4KKyAgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKFplcm9Db3B5SW5wdXRTdHJlYW0qIGNvbnN0IHN0cmVhbXNbXSwgaW50IGNvdW50KTsKKyAgfkNvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgYm9vbCBTa2lwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisKKyBwcml2YXRlOgorICAvLyBBcyBzdHJlYW1zIGFyZSByZXRpcmVkLCBzdHJlYW1zXyBpcyBpbmNyZW1lbnRlZCBhbmQgY291bnRfIGlzCisgIC8vIGRlY3JlbWVudGVkLgorICBaZXJvQ29weUlucHV0U3RyZWFtKiBjb25zdCogc3RyZWFtc187CisgIGludCBzdHJlYW1fY291bnRfOworICBpbnQ2NCBieXRlc19yZXRpcmVkXzsgIC8vIEJ5dGVzIHJlYWQgZnJvbSBwcmV2aW91cyBzdHJlYW1zLgorCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggd3JhcHMgc29tZSBvdGhlciBzdHJlYW0gYW5kIGxpbWl0cyBpdCB0bworLy8gYSBwYXJ0aWN1bGFyIGJ5dGUgY291bnQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTGltaXRpbmdJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIExpbWl0aW5nSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGludDY0IGxpbWl0KTsKKyAgfkxpbWl0aW5nSW5wdXRTdHJlYW0oKTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGJvb2wgU2tpcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworCisgcHJpdmF0ZToKKyAgWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXRfOworICBpbnQ2NCBsaW1pdF87ICAvLyBEZWNyZWFzZXMgYXMgd2UgZ28sIGJlY29tZXMgbmVnYXRpdmUgaWYgd2Ugb3ZlcnNob290LgorCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaW1pdGluZ0lucHV0U3RyZWFtKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTJlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKQEAgLTAsMCArMSwzOTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCituYW1lc3BhY2UgeworCisvLyBEZWZhdWx0IGJsb2NrIHNpemUgZm9yIENvcHlpbmd7SW4sT3V0fXB1dFN0cmVhbUFkYXB0b3IuCitzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0QmxvY2tTaXplID0gODE5MjsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXJyYXlJbnB1dFN0cmVhbTo6QXJyYXlJbnB1dFN0cmVhbShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUpCisgIDogZGF0YV8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEpKSwKKyAgICBzaXplXyhzaXplKSwKKyAgICBibG9ja19zaXplXyhibG9ja19zaXplID4gMCA/IGJsb2NrX3NpemUgOiBzaXplKSwKKyAgICBwb3NpdGlvbl8oMCksCisgICAgbGFzdF9yZXR1cm5lZF9zaXplXygwKSB7Cit9CisKK0FycmF5SW5wdXRTdHJlYW06On5BcnJheUlucHV0U3RyZWFtKCkgeworfQorCitib29sIEFycmF5SW5wdXRTdHJlYW06Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAocG9zaXRpb25fIDwgc2l6ZV8pIHsKKyAgICBsYXN0X3JldHVybmVkX3NpemVfID0gbWluKGJsb2NrX3NpemVfLCBzaXplXyAtIHBvc2l0aW9uXyk7CisgICAgKmRhdGEgPSBkYXRhXyArIHBvc2l0aW9uXzsKKyAgICAqc2l6ZSA9IGxhc3RfcmV0dXJuZWRfc2l6ZV87CisgICAgcG9zaXRpb25fICs9IGxhc3RfcmV0dXJuZWRfc2l6ZV87CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gV2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisgICAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAgLy8gRG9uJ3QgbGV0IGNhbGxlciBiYWNrIHVwLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIEFycmF5SW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgR09PR0xFX0NIRUNLX0dUKGxhc3RfcmV0dXJuZWRfc2l6ZV8sIDApCisgICAgICA8PCAiQmFja1VwKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBOZXh0KCkuIjsKKyAgR09PR0xFX0NIRUNLX0xFKGNvdW50LCBsYXN0X3JldHVybmVkX3NpemVfKTsKKyAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKTsKKyAgcG9zaXRpb25fIC09IGNvdW50OworICBsYXN0X3JldHVybmVkX3NpemVfID0gMDsgIC8vIERvbid0IGxldCBjYWxsZXIgYmFjayB1cCBmdXJ0aGVyLgorfQorCitib29sIEFycmF5SW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7CisgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSAwOyAgIC8vIERvbid0IGxldCBjYWxsZXIgYmFjayB1cC4KKyAgaWYgKGNvdW50ID4gc2l6ZV8gLSBwb3NpdGlvbl8pIHsKKyAgICBwb3NpdGlvbl8gPSBzaXplXzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcG9zaXRpb25fICs9IGNvdW50OworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2ludDY0IEFycmF5SW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHBvc2l0aW9uXzsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FycmF5T3V0cHV0U3RyZWFtOjpBcnJheU91dHB1dFN0cmVhbSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgaW50IGJsb2NrX3NpemUpCisgIDogZGF0YV8ocmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGRhdGEpKSwKKyAgICBzaXplXyhzaXplKSwKKyAgICBibG9ja19zaXplXyhibG9ja19zaXplID4gMCA/IGJsb2NrX3NpemUgOiBzaXplKSwKKyAgICBwb3NpdGlvbl8oMCksCisgICAgbGFzdF9yZXR1cm5lZF9zaXplXygwKSB7Cit9CisKK0FycmF5T3V0cHV0U3RyZWFtOjp+QXJyYXlPdXRwdXRTdHJlYW0oKSB7Cit9CisKK2Jvb2wgQXJyYXlPdXRwdXRTdHJlYW06Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAocG9zaXRpb25fIDwgc2l6ZV8pIHsKKyAgICBsYXN0X3JldHVybmVkX3NpemVfID0gbWluKGJsb2NrX3NpemVfLCBzaXplXyAtIHBvc2l0aW9uXyk7CisgICAgKmRhdGEgPSBkYXRhXyArIHBvc2l0aW9uXzsKKyAgICAqc2l6ZSA9IGxhc3RfcmV0dXJuZWRfc2l6ZV87CisgICAgcG9zaXRpb25fICs9IGxhc3RfcmV0dXJuZWRfc2l6ZV87CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gV2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisgICAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAgLy8gRG9uJ3QgbGV0IGNhbGxlciBiYWNrIHVwLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIEFycmF5T3V0cHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDS19HVChsYXN0X3JldHVybmVkX3NpemVfLCAwKQorICAgICAgPDwgIkJhY2tVcCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgTmV4dCgpLiI7CisgIEdPT0dMRV9DSEVDS19MRShjb3VudCwgbGFzdF9yZXR1cm5lZF9zaXplXyk7CisgIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7CisgIHBvc2l0aW9uXyAtPSBjb3VudDsKKyAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAvLyBEb24ndCBsZXQgY2FsbGVyIGJhY2sgdXAgZnVydGhlci4KK30KKworaW50NjQgQXJyYXlPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHBvc2l0aW9uXzsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdHJpbmdPdXRwdXRTdHJlYW06OlN0cmluZ091dHB1dFN0cmVhbShzdHJpbmcqIHRhcmdldCkKKyAgOiB0YXJnZXRfKHRhcmdldCkgeworfQorCitTdHJpbmdPdXRwdXRTdHJlYW06On5TdHJpbmdPdXRwdXRTdHJlYW0oKSB7Cit9CisKK2Jvb2wgU3RyaW5nT3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgaW50IG9sZF9zaXplID0gdGFyZ2V0Xy0+c2l6ZSgpOworCisgIC8vIEdyb3cgdGhlIHN0cmluZy4KKyAgaWYgKG9sZF9zaXplIDwgdGFyZ2V0Xy0+Y2FwYWNpdHkoKSkgeworICAgIC8vIFJlc2l6ZSB0aGUgc3RyaW5nIHRvIG1hdGNoIGl0cyBjYXBhY2l0eSwgc2luY2Ugd2UgY2FuIGdldCBhd2F5CisgICAgLy8gd2l0aG91dCBhIG1lbW9yeSBhbGxvY2F0aW9uIHRoaXMgd2F5LgorICAgIFNUTFN0cmluZ1Jlc2l6ZVVuaW5pdGlhbGl6ZWQodGFyZ2V0XywgdGFyZ2V0Xy0+Y2FwYWNpdHkoKSk7CisgIH0gZWxzZSB7CisgICAgLy8gU2l6ZSBoYXMgcmVhY2hlZCBjYXBhY2l0eSwgc28gZG91YmxlIHRoZSBzaXplLiAgQWxzbyBtYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBuZXcgc2l6ZSBpcyBhdCBsZWFzdCBrTWluaW11bVNpemUuCisgICAgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZCgKKyAgICAgIHRhcmdldF8sCisgICAgICBtYXgob2xkX3NpemUgKiAyLAorICAgICAgICAgIGtNaW5pbXVtU2l6ZSArIDApKTsgIC8vICIrIDAiIHdvcmtzIGFyb3VuZCBHQ0M0IHdlaXJkbmVzcy4KKyAgfQorCisgICpkYXRhID0gc3RyaW5nX2FzX2FycmF5KHRhcmdldF8pICsgb2xkX3NpemU7CisgICpzaXplID0gdGFyZ2V0Xy0+c2l6ZSgpIC0gb2xkX3NpemU7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0cmluZ091dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOworICBHT09HTEVfQ0hFQ0tfTEUoY291bnQsIHRhcmdldF8tPnNpemUoKSk7CisgIHRhcmdldF8tPnJlc2l6ZSh0YXJnZXRfLT5zaXplKCkgLSBjb3VudCk7Cit9CisKK2ludDY0IFN0cmluZ091dHB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgeworICByZXR1cm4gdGFyZ2V0Xy0+c2l6ZSgpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlpbmdJbnB1dFN0cmVhbTo6fkNvcHlpbmdJbnB1dFN0cmVhbSgpIHt9CisKK2ludCBDb3B5aW5nSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGNoYXIganVua1s0MDk2XTsKKyAgaW50IHNraXBwZWQgPSAwOworICB3aGlsZSAoc2tpcHBlZCA8IGNvdW50KSB7CisgICAgaW50IGJ5dGVzID0gUmVhZChqdW5rLCBtaW4oY291bnQgLSBza2lwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihzaXplb2YoanVuaykpKSk7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgIC8vIEVPRiBvciByZWFkIGVycm9yLgorICAgICAgcmV0dXJuIHNraXBwZWQ7CisgICAgfQorICAgIHNraXBwZWQgKz0gYnl0ZXM7CisgIH0KKyAgcmV0dXJuIHNraXBwZWQ7Cit9CisKK0NvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OkNvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IoCisgICAgQ29weWluZ0lucHV0U3RyZWFtKiBjb3B5aW5nX3N0cmVhbSwgaW50IGJsb2NrX3NpemUpCisgIDogY29weWluZ19zdHJlYW1fKGNvcHlpbmdfc3RyZWFtKSwKKyAgICBvd25zX2NvcHlpbmdfc3RyZWFtXyhmYWxzZSksCisgICAgZmFpbGVkXyhmYWxzZSksCisgICAgcG9zaXRpb25fKDApLAorICAgIGJ1ZmZlcl9zaXplXyhibG9ja19zaXplID4gMCA/IGJsb2NrX3NpemUgOiBrRGVmYXVsdEJsb2NrU2l6ZSksCisgICAgYnVmZmVyX3VzZWRfKDApLAorICAgIGJhY2t1cF9ieXRlc18oMCkgeworfQorCitDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjp+Q29weWluZ0lucHV0U3RyZWFtQWRhcHRvcigpIHsKKyAgaWYgKG93bnNfY29weWluZ19zdHJlYW1fKSB7CisgICAgZGVsZXRlIGNvcHlpbmdfc3RyZWFtXzsKKyAgfQorfQorCitib29sIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAoZmFpbGVkXykgeworICAgIC8vIEFscmVhZHkgZmFpbGVkIG9uIGEgcHJldmlvdXMgcmVhZC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCk7CisKKyAgaWYgKGJhY2t1cF9ieXRlc18gPiAwKSB7CisgICAgLy8gV2UgaGF2ZSBkYXRhIGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgQmFja1VwKCksIHNvIGp1c3QgcmV0dXJuIHRoYXQuCisgICAgKmRhdGEgPSBidWZmZXJfLmdldCgpICsgYnVmZmVyX3VzZWRfIC0gYmFja3VwX2J5dGVzXzsKKyAgICAqc2l6ZSA9IGJhY2t1cF9ieXRlc187CisgICAgYmFja3VwX2J5dGVzXyA9IDA7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBSZWFkIG5ldyBkYXRhIGludG8gdGhlIGJ1ZmZlci4KKyAgYnVmZmVyX3VzZWRfID0gY29weWluZ19zdHJlYW1fLT5SZWFkKGJ1ZmZlcl8uZ2V0KCksIGJ1ZmZlcl9zaXplXyk7CisgIGlmIChidWZmZXJfdXNlZF8gPD0gMCkgeworICAgIC8vIEVPRiBvciByZWFkIGVycm9yLiAgV2UgZG9uJ3QgbmVlZCB0aGUgYnVmZmVyIGFueW1vcmUuCisgICAgaWYgKGJ1ZmZlcl91c2VkXyA8IDApIHsKKyAgICAgIC8vIFJlYWQgZXJyb3IgKG5vdCBFT0YpLgorICAgICAgZmFpbGVkXyA9IHRydWU7CisgICAgfQorICAgIEZyZWVCdWZmZXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcG9zaXRpb25fICs9IGJ1ZmZlcl91c2VkXzsKKworICAqc2l6ZSA9IGJ1ZmZlcl91c2VkXzsKKyAgKmRhdGEgPSBidWZmZXJfLmdldCgpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDSyhiYWNrdXBfYnl0ZXNfID09IDAgJiYgYnVmZmVyXy5nZXQoKSAhPSBOVUxMKQorICAgIDw8ICIgQmFja1VwKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIE5leHQoKS4iOworICBHT09HTEVfQ0hFQ0tfTEUoY291bnQsIGJ1ZmZlcl91c2VkXykKKyAgICA8PCAiIENhbid0IGJhY2sgdXAgb3ZlciBtb3JlIGJ5dGVzIHRoYW4gd2VyZSByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsIgorICAgICAgICIgdG8gTmV4dCgpLiI7CisgIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCkKKyAgICA8PCAiIFBhcmFtZXRlciB0byBCYWNrVXAoKSBjYW4ndCBiZSBuZWdhdGl2ZS4iOworCisgIGJhY2t1cF9ieXRlc18gPSBjb3VudDsKK30KKworYm9vbCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpTa2lwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOworCisgIGlmIChmYWlsZWRfKSB7CisgICAgLy8gQWxyZWFkeSBmYWlsZWQgb24gYSBwcmV2aW91cyByZWFkLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEZpcnN0IHNraXAgYW55IGJ5dGVzIGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgQmFja1VwKCkuCisgIGlmIChiYWNrdXBfYnl0ZXNfID49IGNvdW50KSB7CisgICAgLy8gV2UgaGF2ZSBtb3JlIGRhdGEgbGVmdCBvdmVyIHRoYW4gd2UncmUgdHJ5aW5nIHRvIHNraXAuICBKdXN0IGNob3AgaXQuCisgICAgYmFja3VwX2J5dGVzXyAtPSBjb3VudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvdW50IC09IGJhY2t1cF9ieXRlc187CisgIGJhY2t1cF9ieXRlc18gPSAwOworCisgIGludCBza2lwcGVkID0gY29weWluZ19zdHJlYW1fLT5Ta2lwKGNvdW50KTsKKyAgcG9zaXRpb25fICs9IHNraXBwZWQ7CisgIHJldHVybiBza2lwcGVkID09IGNvdW50OworfQorCitpbnQ2NCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBwb3NpdGlvbl8gLSBiYWNrdXBfYnl0ZXNfOworfQorCit2b2lkIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OkFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKSB7CisgIGlmIChidWZmZXJfLmdldCgpID09IE5VTEwpIHsKKyAgICBidWZmZXJfLnJlc2V0KG5ldyB1aW50OFtidWZmZXJfc2l6ZV9dKTsKKyAgfQorfQorCit2b2lkIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OkZyZWVCdWZmZXIoKSB7CisgIEdPT0dMRV9DSEVDS19FUShiYWNrdXBfYnl0ZXNfLCAwKTsKKyAgYnVmZmVyX3VzZWRfID0gMDsKKyAgYnVmZmVyXy5yZXNldCgpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlpbmdPdXRwdXRTdHJlYW06On5Db3B5aW5nT3V0cHV0U3RyZWFtKCkge30KKworQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OkNvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKAorICAgIENvcHlpbmdPdXRwdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtLCBpbnQgYmxvY2tfc2l6ZSkKKyAgOiBjb3B5aW5nX3N0cmVhbV8oY29weWluZ19zdHJlYW0pLAorICAgIG93bnNfY29weWluZ19zdHJlYW1fKGZhbHNlKSwKKyAgICBmYWlsZWRfKGZhbHNlKSwKKyAgICBwb3NpdGlvbl8oMCksCisgICAgYnVmZmVyX3NpemVfKGJsb2NrX3NpemUgPiAwID8gYmxvY2tfc2l6ZSA6IGtEZWZhdWx0QmxvY2tTaXplKSwKKyAgICBidWZmZXJfdXNlZF8oMCkgeworfQorCitDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6fkNvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKCkgeworICBXcml0ZUJ1ZmZlcigpOworICBpZiAob3duc19jb3B5aW5nX3N0cmVhbV8pIHsKKyAgICBkZWxldGUgY29weWluZ19zdHJlYW1fOworICB9Cit9CisKK2Jvb2wgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OkZsdXNoKCkgeworICByZXR1cm4gV3JpdGVCdWZmZXIoKTsKK30KKworYm9vbCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChidWZmZXJfdXNlZF8gPT0gYnVmZmVyX3NpemVfKSB7CisgICAgaWYgKCFXcml0ZUJ1ZmZlcigpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICBBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCk7CisKKyAgKmRhdGEgPSBidWZmZXJfLmdldCgpICsgYnVmZmVyX3VzZWRfOworICAqc2l6ZSA9IGJ1ZmZlcl9zaXplXyAtIGJ1ZmZlcl91c2VkXzsKKyAgYnVmZmVyX3VzZWRfID0gYnVmZmVyX3NpemVfOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6QmFja1VwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOworICBHT09HTEVfQ0hFQ0tfRVEoYnVmZmVyX3VzZWRfLCBidWZmZXJfc2l6ZV8pCisgICAgPDwgIiBCYWNrVXAoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgTmV4dCgpLiI7CisgIEdPT0dMRV9DSEVDS19MRShjb3VudCwgYnVmZmVyX3VzZWRfKQorICAgIDw8ICIgQ2FuJ3QgYmFjayB1cCBvdmVyIG1vcmUgYnl0ZXMgdGhhbiB3ZXJlIHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwiCisgICAgICAgIiB0byBOZXh0KCkuIjsKKworICBidWZmZXJfdXNlZF8gLT0gY291bnQ7Cit9CisKK2ludDY0IENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBwb3NpdGlvbl8gKyBidWZmZXJfdXNlZF87Cit9CisKK2Jvb2wgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OldyaXRlQnVmZmVyKCkgeworICBpZiAoZmFpbGVkXykgeworICAgIC8vIEFscmVhZHkgZmFpbGVkIG9uIGEgcHJldmlvdXMgd3JpdGUuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGJ1ZmZlcl91c2VkXyA9PSAwKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoY29weWluZ19zdHJlYW1fLT5Xcml0ZShidWZmZXJfLmdldCgpLCBidWZmZXJfdXNlZF8pKSB7CisgICAgcG9zaXRpb25fICs9IGJ1ZmZlcl91c2VkXzsKKyAgICBidWZmZXJfdXNlZF8gPSAwOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIGZhaWxlZF8gPSB0cnVlOworICAgIEZyZWVCdWZmZXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6QWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpIHsKKyAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgeworICAgIGJ1ZmZlcl8ucmVzZXQobmV3IHVpbnQ4W2J1ZmZlcl9zaXplX10pOworICB9Cit9CisKK3ZvaWQgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OkZyZWVCdWZmZXIoKSB7CisgIGJ1ZmZlcl91c2VkXyA9IDA7CisgIGJ1ZmZlcl8ucmVzZXQoKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNmNTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgKQEAgLTAsMCArMSwzNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2VzIGRlZmluZWQgaW4KKy8vIHplcm9fY29weV9zdHJlYW0uaCB3aGljaCBhcmUgaW5jbHVkZWQgaW4gdGhlICJsaXRlIiBwcm90b2J1ZiBsaWJyYXJ5LgorLy8gVGhlc2UgaW1wbGVtZW50YXRpb25zIGNvdmVyIEkvTyBvbiByYXcgYXJyYXlzIGFuZCBzdHJpbmdzLCBhcyB3ZWxsIGFzCisvLyBhZGFwdG9ycyB3aGljaCBtYWtlIGl0IGVhc3kgdG8gaW1wbGVtZW50IHN0cmVhbXMgYmFzZWQgb24gdHJhZGl0aW9uYWwKKy8vIHN0cmVhbXMuICBPZiBjb3Vyc2UsIG1hbnkgdXNlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRvIHdyaXRlIHRoZWlyIG93bgorLy8gaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIGludGVyZmFjZXMgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgSS9PCisvLyBhYnN0cmFjdGlvbnMgdGhleSBwcmVmZXIgdG8gdXNlLCBidXQgdGhlc2Ugc2hvdWxkIGNvdmVyIHRoZSBtb3N0IGNvbW1vbgorLy8gY2FzZXMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0xJVEVfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIGJhY2tlZCBieSBhbiBpbi1tZW1vcnkgYXJyYXkgb2YgYnl0ZXMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQXJyYXlJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhbiBJbnB1dFN0cmVhbSB0aGF0IHJldHVybnMgdGhlIGJ5dGVzIHBvaW50ZWQgdG8gYnkgImRhdGEiLgorICAvLyAiZGF0YSIgcmVtYWlucyB0aGUgcHJvcGVydHkgb2YgdGhlIGNhbGxlciBidXQgbXVzdCByZW1haW4gdmFsaWQgdW50aWwKKyAgLy8gdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuICBJZiBhIGJsb2NrX3NpemUgaXMgZ2l2ZW4sIGNhbGxzIHRvIE5leHQoKQorICAvLyB3aWxsIHJldHVybiBkYXRhIGJsb2NrcyBubyBsYXJnZXIgdGhhbiB0aGUgZ2l2ZW4gc2l6ZS4gIE90aGVyd2lzZSwgdGhlCisgIC8vIGZpcnN0IGNhbGwgdG8gTmV4dCgpIHJldHVybnMgdGhlIGVudGlyZSBhcnJheS4gIGJsb2NrX3NpemUgaXMgbWFpbmx5CisgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZzsgaW4gcHJvZHVjdGlvbiB5b3Ugd291bGQgcHJvYmFibHkgbmV2ZXIgd2FudCB0byBzZXQKKyAgLy8gaXQuCisgIEFycmF5SW5wdXRTdHJlYW0oY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplID0gLTEpOworICB+QXJyYXlJbnB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgYm9vbCBTa2lwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisKKyBwcml2YXRlOgorICBjb25zdCB1aW50OCogY29uc3QgZGF0YV87ICAvLyBUaGUgYnl0ZSBhcnJheS4KKyAgY29uc3QgaW50IHNpemVfOyAgICAgICAgICAgLy8gVG90YWwgc2l6ZSBvZiB0aGUgYXJyYXkuCisgIGNvbnN0IGludCBibG9ja19zaXplXzsgICAgIC8vIEhvdyBtYW55IGJ5dGVzIHRvIHJldHVybiBhdCBhIHRpbWUuCisKKyAgaW50IHBvc2l0aW9uXzsKKyAgaW50IGxhc3RfcmV0dXJuZWRfc2l6ZV87ICAgLy8gSG93IG1hbnkgYnl0ZXMgd2UgcmV0dXJuZWQgbGFzdCB0aW1lIE5leHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgY2FsbGVkICh1c2VkIGZvciBlcnJvciBjaGVja2luZyBvbmx5KS4KKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQXJyYXlJbnB1dFN0cmVhbSk7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gYmFja2VkIGJ5IGFuIGluLW1lbW9yeSBhcnJheSBvZiBieXRlcy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBBcnJheU91dHB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYW4gT3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBieXRlcyBwb2ludGVkIHRvIGJ5ICJkYXRhIi4KKyAgLy8gImRhdGEiIHJlbWFpbnMgdGhlIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIgYnV0IG11c3QgcmVtYWluIHZhbGlkIHVudGlsCisgIC8vIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLiAgSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBjYWxscyB0byBOZXh0KCkKKyAgLy8gd2lsbCByZXR1cm4gZGF0YSBibG9ja3Mgbm8gbGFyZ2VyIHRoYW4gdGhlIGdpdmVuIHNpemUuICBPdGhlcndpc2UsIHRoZQorICAvLyBmaXJzdCBjYWxsIHRvIE5leHQoKSByZXR1cm5zIHRoZSBlbnRpcmUgYXJyYXkuICBibG9ja19zaXplIGlzIG1haW5seQorICAvLyB1c2VmdWwgZm9yIHRlc3Rpbmc7IGluIHByb2R1Y3Rpb24geW91IHdvdWxkIHByb2JhYmx5IG5ldmVyIHdhbnQgdG8gc2V0CisgIC8vIGl0LgorICBBcnJheU91dHB1dFN0cmVhbSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgaW50IGJsb2NrX3NpemUgPSAtMSk7CisgIH5BcnJheU91dHB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB1aW50OCogY29uc3QgZGF0YV87ICAgICAgICAvLyBUaGUgYnl0ZSBhcnJheS4KKyAgY29uc3QgaW50IHNpemVfOyAgICAgICAgICAgLy8gVG90YWwgc2l6ZSBvZiB0aGUgYXJyYXkuCisgIGNvbnN0IGludCBibG9ja19zaXplXzsgICAgIC8vIEhvdyBtYW55IGJ5dGVzIHRvIHJldHVybiBhdCBhIHRpbWUuCisKKyAgaW50IHBvc2l0aW9uXzsKKyAgaW50IGxhc3RfcmV0dXJuZWRfc2l6ZV87ICAgLy8gSG93IG1hbnkgYnl0ZXMgd2UgcmV0dXJuZWQgbGFzdCB0aW1lIE5leHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgY2FsbGVkICh1c2VkIGZvciBlcnJvciBjaGVja2luZyBvbmx5KS4KKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQXJyYXlPdXRwdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIGFwcGVuZHMgYnl0ZXMgdG8gYSBzdHJpbmcuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU3RyaW5nT3V0cHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhIFN0cmluZ091dHB1dFN0cmVhbSB3aGljaCBhcHBlbmRzIGJ5dGVzIHRvIHRoZSBnaXZlbiBzdHJpbmcuCisgIC8vIFRoZSBzdHJpbmcgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyLCBidXQgaXQgTVVTVCBOT1QgYmUgYWNjZXNzZWQKKyAgLy8gaW4gYW55IHdheSB1bnRpbCB0aGUgc3RyZWFtIGlzIGRlc3Ryb3llZC4KKyAgLy8KKyAgLy8gSGludDogIElmIHlvdSBjYWxsIHRhcmdldC0+cmVzZXJ2ZShuKSBiZWZvcmUgY3JlYXRpbmcgdGhlIHN0cmVhbSwKKyAgLy8gICB0aGUgZmlyc3QgY2FsbCB0byBOZXh0KCkgd2lsbCByZXR1cm4gYXQgbGVhc3QgbiBieXRlcyBvZiBidWZmZXIKKyAgLy8gICBzcGFjZS4KKyAgZXhwbGljaXQgU3RyaW5nT3V0cHV0U3RyZWFtKHN0cmluZyogdGFyZ2V0KTsKKyAgflN0cmluZ091dHB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgaW50IGtNaW5pbXVtU2l6ZSA9IDE2OworCisgIHN0cmluZyogdGFyZ2V0XzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyaW5nT3V0cHV0U3RyZWFtKTsKK307CisKKy8vIE5vdGU6ICBUaGVyZSBpcyBubyBTdHJpbmdJbnB1dFN0cmVhbS4gIEluc3RlYWQsIGp1c3QgY3JlYXRlIGFuCisvLyBBcnJheUlucHV0U3RyZWFtIGFzIGZvbGxvd3M6CisvLyAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBnZW5lcmljIHRyYWRpdGlvbmFsIGlucHV0IHN0cmVhbSBpbnRlcmZhY2UuCisvLworLy8gTG90cyBvZiB0cmFkaXRpb25hbCBpbnB1dCBzdHJlYW1zIChlLmcuIGZpbGUgZGVzY3JpcHRvcnMsIEMgc3RkaW8KKy8vIHN0cmVhbXMsIGFuZCBDKysgaW9zdHJlYW1zKSBleHBvc2UgYW4gaW50ZXJmYWNlIHdoZXJlIGV2ZXJ5IHJlYWQKKy8vIGludm9sdmVzIGNvcHlpbmcgYnl0ZXMgaW50byBhIGJ1ZmZlci4gIElmIHlvdSB3YW50IHRvIHRha2Ugc3VjaCBhbgorLy8gaW50ZXJmYWNlIGFuZCBtYWtlIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSBiYXNlZCBvbiBpdCwgc2ltcGx5IGltcGxlbWVudAorLy8gQ29weWluZ0lucHV0U3RyZWFtIGFuZCB0aGVuIHVzZSBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yLgorLy8KKy8vIENvcHlpbmdJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGF2b2lkIGJ1ZmZlcmluZyBpZiBwb3NzaWJsZS4KKy8vIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IgZG9lcyBpdHMgb3duIGJ1ZmZlcmluZyBhbmQgd2lsbCByZWFkIGRhdGEKKy8vIGluIGxhcmdlIGJsb2Nrcy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nSW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q29weWluZ0lucHV0U3RyZWFtKCk7CisKKyAgLy8gUmVhZHMgdXAgdG8gInNpemUiIGJ5dGVzIGludG8gdGhlIGdpdmVuIGJ1ZmZlci4gIFJldHVybnMgdGhlIG51bWJlciBvZgorICAvLyBieXRlcyByZWFkLiAgUmVhZCgpIHdhaXRzIHVudGlsIGF0IGxlYXN0IG9uZSBieXRlIGlzIGF2YWlsYWJsZSwgb3IKKyAgLy8gcmV0dXJucyB6ZXJvIGlmIG5vIGJ5dGVzIHdpbGwgZXZlciBiZWNvbWUgYXZhaWxhYmxlIChFT0YpLCBvciAtMSBpZiBhCisgIC8vIHBlcm1hbmVudCByZWFkIGVycm9yIG9jY3VycmVkLgorICB2aXJ0dWFsIGludCBSZWFkKHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpID0gMDsKKworICAvLyBTa2lwcyB0aGUgbmV4dCAiY291bnQiIGJ5dGVzIG9mIGlucHV0LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgIC8vIGFjdHVhbGx5IHNraXBwZWQuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGV4YWN0bHkgZXF1YWwgdG8gImNvdW50IiB1bmxlc3MKKyAgLy8gRU9GIHdhcyByZWFjaGVkIG9yIGEgcGVybWFuZW50IHJlYWQgZXJyb3Igb2NjdXJyZWQuCisgIC8vCisgIC8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmVwZWF0ZWRseSBjYWxscyBSZWFkKCkgaW50byBhIHNjcmF0Y2gKKyAgLy8gYnVmZmVyLgorICB2aXJ0dWFsIGludCBTa2lwKGludCBjb3VudCk7Cit9OworCisvLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBhIENvcHlpbmdJbnB1dFN0cmVhbS4gIFRoaXMgaXMKKy8vIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIFplcm9Db3B5SW5wdXRTdHJlYW1zIHRoYXQgcmVhZCBmcm9tIHRyYWRpdGlvbmFsCisvLyBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgbm90IHJlYWxseSB6ZXJvLWNvcHkuCisvLworLy8gSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGZpbGUgZGVzY3JpcHRvcnMgb3IgQysrIGlzdHJlYW1zLCB0aGlzIGlzCisvLyBhbHJlYWR5IGltcGxlbWVudGVkIGZvciB5b3U6ICB1c2UgRmlsZUlucHV0U3RyZWFtIG9yIElzdHJlYW1JbnB1dFN0cmVhbQorLy8gcmVzcGVjdGl2ZWx5LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IgOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgcmVhZHMgZnJvbSB0aGUgZ2l2ZW4gQ29weWluZ0lucHV0U3RyZWFtLgorICAvLyBJZiBhIGJsb2NrX3NpemUgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQKKyAgLy8gc2hvdWxkIGJlIHJlYWQgYW5kIHJldHVybmVkIHdpdGggZWFjaCBjYWxsIHRvIE5leHQoKS4gIE90aGVyd2lzZSwKKyAgLy8gYSByZWFzb25hYmxlIGRlZmF1bHQgaXMgdXNlZC4gIFRoZSBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YKKyAgLy8gY29weWluZ19zdHJlYW0gdW5sZXNzIFNldE93bnNDb3B5aW5nU3RyZWFtKHRydWUpIGlzIGNhbGxlZC4KKyAgZXhwbGljaXQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcihDb3B5aW5nSW5wdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19zaXplID0gLTEpOworICB+Q29weWluZ0lucHV0U3RyZWFtQWRhcHRvcigpOworCisgIC8vIENhbGwgU2V0T3duc0NvcHlpbmdTdHJlYW0odHJ1ZSkgdG8gdGVsbCB0aGUgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvciB0bworICAvLyBkZWxldGUgdGhlIHVuZGVybHlpbmcgQ29weWluZ0lucHV0U3RyZWFtIHdoZW4gaXQgaXMgZGVzdHJveWVkLgorICB2b2lkIFNldE93bnNDb3B5aW5nU3RyZWFtKGJvb2wgdmFsdWUpIHsgb3duc19jb3B5aW5nX3N0cmVhbV8gPSB2YWx1ZTsgfQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgYm9vbCBTa2lwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gSW5zdXJlcyB0aGF0IGJ1ZmZlcl8gaXMgbm90IE5VTEwuCisgIHZvaWQgQWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpOworICAvLyBGcmVlcyB0aGUgYnVmZmVyIGFuZCByZXNldHMgYnVmZmVyX3VzZWRfLgorICB2b2lkIEZyZWVCdWZmZXIoKTsKKworICAvLyBUaGUgdW5kZXJseWluZyBjb3B5aW5nIHN0cmVhbS4KKyAgQ29weWluZ0lucHV0U3RyZWFtKiBjb3B5aW5nX3N0cmVhbV87CisgIGJvb2wgb3duc19jb3B5aW5nX3N0cmVhbV87CisKKyAgLy8gVHJ1ZSBpZiB3ZSBoYXZlIHNlZW4gYSBwZXJtZW5hbnQgZXJyb3IgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIGJvb2wgZmFpbGVkXzsKKworICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiBjb3B5aW5nX3N0cmVhbV8sIHJlbGF0aXZlIHRvIHRoZSBwb2ludCB3aGVyZQorICAvLyB3ZSBzdGFydGVkIHJlYWRpbmcuCisgIGludDY0IHBvc2l0aW9uXzsKKworICAvLyBEYXRhIGlzIHJlYWQgaW50byB0aGlzIGJ1ZmZlci4gIEl0IG1heSBiZSBOVUxMIGlmIG5vIGJ1ZmZlciBpcyBjdXJyZW50bHkKKyAgLy8gaW4gdXNlLiAgT3RoZXJ3aXNlLCBpdCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZSBidWZmZXJfc2l6ZV8uCisgIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyXzsKKyAgY29uc3QgaW50IGJ1ZmZlcl9zaXplXzsKKworICAvLyBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIgKGkuZS4gdGhlIHNpemUgbGFzdAorICAvLyByZXR1cm5lZCBieSBOZXh0KCkpLiAgMCA8PSBidWZmZXJfdXNlZF8gPD0gYnVmZmVyX3NpemVfLgorICBpbnQgYnVmZmVyX3VzZWRfOworCisgIC8vIE51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHdoaWNoIHdlcmUgYmFja2VkIHVwIG92ZXIgYnkgYSBjYWxsIHRvCisgIC8vIEJhY2tVcCgpLiAgVGhlc2UgbmVlZCB0byBiZSByZXR1cm5lZCBhZ2Fpbi4KKyAgLy8gMCA8PSBiYWNrdXBfYnl0ZXNfIDw9IGJ1ZmZlcl91c2VkXworICBpbnQgYmFja3VwX2J5dGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcik7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgZ2VuZXJpYyB0cmFkaXRpb25hbCBvdXRwdXQgc3RyZWFtIGludGVyZmFjZS4KKy8vCisvLyBMb3RzIG9mIHRyYWRpdGlvbmFsIG91dHB1dCBzdHJlYW1zIChlLmcuIGZpbGUgZGVzY3JpcHRvcnMsIEMgc3RkaW8KKy8vIHN0cmVhbXMsIGFuZCBDKysgaW9zdHJlYW1zKSBleHBvc2UgYW4gaW50ZXJmYWNlIHdoZXJlIGV2ZXJ5IHdyaXRlCisvLyBpbnZvbHZlcyBjb3B5aW5nIGJ5dGVzIGZyb20gYSBidWZmZXIuICBJZiB5b3Ugd2FudCB0byB0YWtlIHN1Y2ggYW4KKy8vIGludGVyZmFjZSBhbmQgbWFrZSBhIFplcm9Db3B5T3V0cHV0U3RyZWFtIGJhc2VkIG9uIGl0LCBzaW1wbHkgaW1wbGVtZW50CisvLyBDb3B5aW5nT3V0cHV0U3RyZWFtIGFuZCB0aGVuIHVzZSBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvci4KKy8vCisvLyBDb3B5aW5nT3V0cHV0U3RyZWFtIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYXZvaWQgYnVmZmVyaW5nIGlmIHBvc3NpYmxlLgorLy8gQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgZG9lcyBpdHMgb3duIGJ1ZmZlcmluZyBhbmQgd2lsbCB3cml0ZSBkYXRhCisvLyBpbiBsYXJnZSBibG9ja3MuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ091dHB1dFN0cmVhbSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Db3B5aW5nT3V0cHV0U3RyZWFtKCk7CisKKyAgLy8gV3JpdGVzICJzaXplIiBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIgdG8gdGhlIG91dHB1dC4gIFJldHVybnMgdHJ1ZQorICAvLyBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvbiBhIHdyaXRlIGVycm9yLgorICB2aXJ0dWFsIGJvb2wgV3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgPSAwOworfTsKKworLy8gQSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCB3cml0ZXMgdG8gYSBDb3B5aW5nT3V0cHV0U3RyZWFtLiAgVGhpcyBpcworLy8gdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgWmVyb0NvcHlPdXRwdXRTdHJlYW1zIHRoYXQgd3JpdGUgdG8gdHJhZGl0aW9uYWwKKy8vIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgcmVhbGx5IHplcm8tY29weS4KKy8vCisvLyBJZiB5b3Ugd2FudCB0byB3cml0ZSB0byBmaWxlIGRlc2NyaXB0b3JzIG9yIEMrKyBvc3RyZWFtcywgdGhpcyBpcworLy8gYWxyZWFkeSBpbXBsZW1lbnRlZCBmb3IgeW91OiAgdXNlIEZpbGVPdXRwdXRTdHJlYW0gb3IgT3N0cmVhbU91dHB1dFN0cmVhbQorLy8gcmVzcGVjdGl2ZWx5LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIFVuaXggZmlsZSBkZXNjcmlwdG9yLgorICAvLyBJZiBhIGJsb2NrX3NpemUgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycworICAvLyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBieSBOZXh0KCkuICBPdGhlcndpc2UsIGEgcmVhc29uYWJsZSBkZWZhdWx0CisgIC8vIGlzIHVzZWQuCisgIGV4cGxpY2l0IENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKENvcHlpbmdPdXRwdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKyAgfkNvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKCk7CisKKyAgLy8gV3JpdGVzIGFsbCBwZW5kaW5nIGRhdGEgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAgUmV0dXJucyBmYWxzZSBpZiBhCisgIC8vIHdyaXRlIGVycm9yIG9jY3VycmVkIG9uIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gIChUaGUgdW5kZXJseWluZworICAvLyBzdHJlYW0gaXRzZWxmIGlzIG5vdCBuZWNlc3NhcmlseSBmbHVzaGVkLikKKyAgYm9vbCBGbHVzaCgpOworCisgIC8vIENhbGwgU2V0T3duc0NvcHlpbmdTdHJlYW0odHJ1ZSkgdG8gdGVsbCB0aGUgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgdG8KKyAgLy8gZGVsZXRlIHRoZSB1bmRlcmx5aW5nIENvcHlpbmdPdXRwdXRTdHJlYW0gd2hlbiBpdCBpcyBkZXN0cm95ZWQuCisgIHZvaWQgU2V0T3duc0NvcHlpbmdTdHJlYW0oYm9vbCB2YWx1ZSkgeyBvd25zX2NvcHlpbmdfc3RyZWFtXyA9IHZhbHVlOyB9CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFdyaXRlIHRoZSBjdXJyZW50IGJ1ZmZlciwgaWYgaXQgaXMgcHJlc2VudC4KKyAgYm9vbCBXcml0ZUJ1ZmZlcigpOworICAvLyBJbnN1cmVzIHRoYXQgYnVmZmVyXyBpcyBub3QgTlVMTC4KKyAgdm9pZCBBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCk7CisgIC8vIEZyZWVzIHRoZSBidWZmZXIuCisgIHZvaWQgRnJlZUJ1ZmZlcigpOworCisgIC8vIFRoZSB1bmRlcmx5aW5nIGNvcHlpbmcgc3RyZWFtLgorICBDb3B5aW5nT3V0cHV0U3RyZWFtKiBjb3B5aW5nX3N0cmVhbV87CisgIGJvb2wgb3duc19jb3B5aW5nX3N0cmVhbV87CisKKyAgLy8gVHJ1ZSBpZiB3ZSBoYXZlIHNlZW4gYSBwZXJtZW5hbnQgZXJyb3IgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIGJvb2wgZmFpbGVkXzsKKworICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiBjb3B5aW5nX3N0cmVhbV8sIHJlbGF0aXZlIHRvIHRoZSBwb2ludCB3aGVyZQorICAvLyB3ZSBzdGFydGVkIHdyaXRpbmcuCisgIGludDY0IHBvc2l0aW9uXzsKKworICAvLyBEYXRhIGlzIHdyaXR0ZW4gZnJvbSB0aGlzIGJ1ZmZlci4gIEl0IG1heSBiZSBOVUxMIGlmIG5vIGJ1ZmZlciBpcworICAvLyBjdXJyZW50bHkgaW4gdXNlLiAgT3RoZXJ3aXNlLCBpdCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZSBidWZmZXJfc2l6ZV8uCisgIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyXzsKKyAgY29uc3QgaW50IGJ1ZmZlcl9zaXplXzsKKworICAvLyBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIgKGkuZS4gdGhlIHNpemUgbGFzdAorICAvLyByZXR1cm5lZCBieSBOZXh0KCkpLiAgV2hlbiBCYWNrVXAoKSBpcyBjYWxsZWQsIHdlIGp1c3QgcmVkdWNlIHRoaXMuCisgIC8vIDAgPD0gYnVmZmVyX3VzZWRfIDw9IGJ1ZmZlcl9zaXplXy4KKyAgaW50IGJ1ZmZlcl91c2VkXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IpOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0lNUExfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxNTVkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsOTQ0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUZXN0aW5nIHN0cmF0ZWd5OiAgRm9yIGVhY2ggdHlwZSBvZiBJL08gKGFycmF5LCBzdHJpbmcsIGZpbGUsIGV0Yy4pIHdlCisvLyBjcmVhdGUgYW4gb3V0cHV0IHN0cmVhbSBhbmQgd3JpdGUgc29tZSBkYXRhIHRvIGl0LCB0aGVuIGNyZWF0ZSBhCisvLyBjb3JyZXNwb25kaW5nIGlucHV0IHN0cmVhbSB0byByZWFkIHRoZSBzYW1lIGRhdGEgYmFjayBhbmQgZXhwZWN0IGl0IHRvCisvLyBtYXRjaC4gIFdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbiwgaXQgaXMgd3JpdHRlbiBpbiBzZXZlcmFsIHNtYWxsIGNodW5rcworLy8gb2YgdmFyeWluZyBzaXplcywgd2l0aCBhIEJhY2tVcCgpIGFmdGVyIGVhY2ggY2h1bmsuICBJdCBpcyByZWFkIGJhY2sKKy8vIHNpbWlsYXJseSwgYnV0IHdpdGggY2h1bmtzIHNlcGFyYXRlZCBhdCBkaWZmZXJlbnQgcG9pbnRzLiAgVGhlIHdob2xlCisvLyBwcm9jZXNzIGlzIHJ1biB3aXRoIGEgdmFyaWV0eSBvZiBibG9jayBzaXplcyBmb3IgYm90aCB0aGUgaW5wdXQgYW5kCisvLyB0aGUgb3V0cHV0LgorLy8KKy8vIFRPRE8oa2VudG9uKTogIFJld3JpdGUgdGhpcyB0ZXN0IHRvIGJyaW5nIGl0IHVwIHRvIHRoZSBzdGFuZGFyZHMgb2YgYWxsCisvLyAgIHRoZSBvdGhlciBwcm90bzIgdGVzdHMuICBNYXkgd2FudCB0byB3YWl0IGZvciBnVGVzdCB0byBpbXBsZW1lbnQKKy8vICAgInBhcmFtZXRpemVkIHRlc3RzIiBzbyB0aGF0IG9uZSBzZXQgb2YgdGVzdHMgY2FuIGJlIHVzZWQgb24gYWxsIHRoZQorLy8gICBpbXBsZW1lbnRhdGlvbnMuCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKworI2lmIEhBVkVfWkxJQgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworbmFtZXNwYWNlIHsKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBwaXBlKGZkcykgX3BpcGUoZmRzLCA0MDk2LCBPX0JJTkFSWSkKKyNlbmRpZgorCisjaWZuZGVmIE9fQklOQVJZCisjaWZkZWYgX09fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQorI2Vsc2UKKyNkZWZpbmUgT19CSU5BUlkgMCAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgcGxhdGZvcm0gZG9lc24ndCBuZWVkIGl0LgorI2VuZGlmCisjZW5kaWYKKworY2xhc3MgSW9UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gVGVzdCBoZWxwZXJzLgorCisgIC8vIEhlbHBlciB0byB3cml0ZSBhbiBhcnJheSBvZiBkYXRhIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgIGJvb2wgV3JpdGVUb091dHB1dChaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7CisgIC8vIEhlbHBlciB0byByZWFkIGEgZml4ZWQtbGVuZ3RoIGFycmF5IG9mIGRhdGEgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCisgIGludCBSZWFkRnJvbUlucHV0KFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7CisgIC8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICB2b2lkIFdyaXRlU3RyaW5nKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsIGNvbnN0IHN0cmluZyYgc3RyKTsKKyAgLy8gUmVhZCBhIG51bWJlciBvZiBieXRlcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCBjaGVja3MKKyAgLy8gdGhhdCBpdCBtYXRjaGVzIHRoZSBzdHJpbmcuCisgIHZvaWQgUmVhZFN0cmluZyhaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgY29uc3Qgc3RyaW5nJiBzdHIpOworICAvLyBXcml0ZXMgc29tZSB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIGEgcGFydGljdWxhciBvcmRlci4gIFJldHVybnMKKyAgLy8gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBpbmNhc2UgdGhlIGNhbGxlciBuZWVkcyB0aGF0IHRvIHNldCB1cCBhbgorICAvLyBpbnB1dCBzdHJlYW0uCisgIGludCBXcml0ZVN0dWZmKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBSZWFkcyB0ZXh0IGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCBleHBlY3RzIGl0IHRvIG1hdGNoIHdoYXQKKyAgLy8gV3JpdGVTdHVmZigpIHdyaXRlcy4KKyAgdm9pZCBSZWFkU3R1ZmYoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworCisgIC8vIFNpbWlsYXIgdG8gV3JpdGVTdHVmZiwgYnV0IHBlcmZvcm1zIG1vcmUgc29waGlzdGljYXRlZCB0ZXN0aW5nLgorICBpbnQgV3JpdGVTdHVmZkxhcmdlKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBSZWFkcyBhbmQgdGVzdHMgYSBzdHJlYW0gdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8KKyAgLy8gdmlhIFdyaXRlU3R1ZmZMYXJnZSgpLgorICB2b2lkIFJlYWRTdHVmZkxhcmdlKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKKworI2lmIEhBVkVfWkxJQgorICBzdHJpbmcgQ29tcHJlc3MoY29uc3Qgc3RyaW5nJiBkYXRhLCBjb25zdCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zJiBvcHRpb25zKTsKKyAgc3RyaW5nIFVuY29tcHJlc3MoY29uc3Qgc3RyaW5nJiBkYXRhKTsKKyNlbmRpZgorCisgIHN0YXRpYyBjb25zdCBpbnQga0Jsb2NrU2l6ZXNbXTsKKyAgc3RhdGljIGNvbnN0IGludCBrQmxvY2tTaXplQ291bnQ7Cit9OworCitjb25zdCBpbnQgSW9UZXN0OjprQmxvY2tTaXplc1tdID0gey0xLCAxLCAyLCA1LCA3LCAxMCwgMjMsIDY0fTsKK2NvbnN0IGludCBJb1Rlc3Q6OmtCbG9ja1NpemVDb3VudCA9IEdPT0dMRV9BUlJBWVNJWkUoSW9UZXN0OjprQmxvY2tTaXplcyk7CisKK2Jvb2wgSW9UZXN0OjpXcml0ZVRvT3V0cHV0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICBjb25zdCB1aW50OCogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZGF0YSk7CisgIGludCBpbl9zaXplID0gc2l6ZTsKKworICB2b2lkKiBvdXQ7CisgIGludCBvdXRfc2l6ZTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICghb3V0cHV0LT5OZXh0KCZvdXQsICZvdXRfc2l6ZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgRVhQRUNUX0dUKG91dF9zaXplLCAwKTsKKworICAgIGlmIChpbl9zaXplIDw9IG91dF9zaXplKSB7CisgICAgICBtZW1jcHkob3V0LCBpbiwgaW5fc2l6ZSk7CisgICAgICBvdXRwdXQtPkJhY2tVcChvdXRfc2l6ZSAtIGluX3NpemUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbWVtY3B5KG91dCwgaW4sIG91dF9zaXplKTsKKyAgICBpbiArPSBvdXRfc2l6ZTsKKyAgICBpbl9zaXplIC09IG91dF9zaXplOworICB9Cit9CisKKyNkZWZpbmUgTUFYX1JFUEVBVEVEX1pFUk9TIDEwMAorCitpbnQgSW9UZXN0OjpSZWFkRnJvbUlucHV0KFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICB1aW50OCogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGRhdGEpOworICBpbnQgb3V0X3NpemUgPSBzaXplOworCisgIGNvbnN0IHZvaWQqIGluOworICBpbnQgaW5fc2l6ZSA9IDA7CisKKyAgaW50IHJlcGVhdGVkX3plcm9zID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICghaW5wdXQtPk5leHQoJmluLCAmaW5fc2l6ZSkpIHsKKyAgICAgIHJldHVybiBzaXplIC0gb3V0X3NpemU7CisgICAgfQorICAgIEVYUEVDVF9HVChpbl9zaXplLCAtMSk7CisgICAgaWYgKGluX3NpemUgPT0gMCkgeworICAgICAgcmVwZWF0ZWRfemVyb3MrKzsKKyAgICB9IGVsc2UgeworICAgICAgcmVwZWF0ZWRfemVyb3MgPSAwOworICAgIH0KKyAgICBFWFBFQ1RfTFQocmVwZWF0ZWRfemVyb3MsIE1BWF9SRVBFQVRFRF9aRVJPUyk7CisKKyAgICBpZiAob3V0X3NpemUgPD0gaW5fc2l6ZSkgeworICAgICAgbWVtY3B5KG91dCwgaW4sIG91dF9zaXplKTsKKyAgICAgIGlmIChpbl9zaXplID4gb3V0X3NpemUpIHsKKyAgICAgICAgaW5wdXQtPkJhY2tVcChpbl9zaXplIC0gb3V0X3NpemUpOworICAgICAgfQorICAgICAgcmV0dXJuIHNpemU7ICAvLyBDb3BpZWQgYWxsIG9mIGl0LgorICAgIH0KKworICAgIG1lbWNweShvdXQsIGluLCBpbl9zaXplKTsKKyAgICBvdXQgKz0gaW5fc2l6ZTsKKyAgICBvdXRfc2l6ZSAtPSBpbl9zaXplOworICB9Cit9CisKK3ZvaWQgSW9UZXN0OjpXcml0ZVN0cmluZyhaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjb25zdCBzdHJpbmcmIHN0cikgeworICBFWFBFQ1RfVFJVRShXcml0ZVRvT3V0cHV0KG91dHB1dCwgc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpKTsKK30KKwordm9pZCBJb1Rlc3Q6OlJlYWRTdHJpbmcoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHNjb3BlZF9hcnJheTxjaGFyPiBidWZmZXIobmV3IGNoYXJbc3RyLnNpemUoKSArIDFdKTsKKyAgYnVmZmVyW3N0ci5zaXplKCldID0gJ1wwJzsKKyAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsIGJ1ZmZlci5nZXQoKSwgc3RyLnNpemUoKSksIHN0ci5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoc3RyLmNfc3RyKCksIGJ1ZmZlci5nZXQoKSk7Cit9CisKK2ludCBJb1Rlc3Q6OldyaXRlU3R1ZmYoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVN0cmluZyhvdXRwdXQsICJIZWxsbyB3b3JsZCFcbiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJTb21lIHRlIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgInh0LiAgQmxhaCBibGFoLiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJhYmNkZWZnIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgImZvb2JhciIpOworCisgIEVYUEVDVF9FUShvdXRwdXQtPkJ5dGVDb3VudCgpLCA2OCk7CisKKyAgaW50IHJlc3VsdCA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIHRleHQgZnJvbSBhbiBpbnB1dCBzdHJlYW0gYW5kIGV4cGVjdHMgaXQgdG8gbWF0Y2ggd2hhdCBXcml0ZVN0dWZmKCkKKy8vIHdyaXRlcy4KK3ZvaWQgSW9UZXN0OjpSZWFkU3R1ZmYoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgUmVhZFN0cmluZyhpbnB1dCwgIkhlbGxvIHdvcmxkIVxuIik7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJTb21lIHRleHQuICAiKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgIkJsYWggIik7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJibGFoLiIpOworICBSZWFkU3RyaW5nKGlucHV0LCAiYWJjZGVmZyIpOworICBFWFBFQ1RfVFJVRShpbnB1dC0+U2tpcCgyMCkpOworICBSZWFkU3RyaW5nKGlucHV0LCAiZm9vIik7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJiYXIiKTsKKworICBFWFBFQ1RfRVEoaW5wdXQtPkJ5dGVDb3VudCgpLCA2OCk7CisKKyAgdWludDggYnl0ZTsKKyAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsICZieXRlLCAxKSwgMCk7Cit9CisKK2ludCBJb1Rlc3Q6OldyaXRlU3R1ZmZMYXJnZShaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgIkhlbGxvIHdvcmxkIVxuIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgIlNvbWUgdGUiKTsKKyAgV3JpdGVTdHJpbmcob3V0cHV0LCAieHQuICBCbGFoIGJsYWguIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgc3RyaW5nKDEwMDAwMCwgJ3gnKSk7ICAvLyBBIHZlcnkgbG9uZyBzdHJpbmcKKyAgV3JpdGVTdHJpbmcob3V0cHV0LCBzdHJpbmcoMTAwMDAwLCAneScpKTsgIC8vIEEgdmVyeSBsb25nIHN0cmluZworICBXcml0ZVN0cmluZyhvdXRwdXQsICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOworCisgIEVYUEVDVF9FUShvdXRwdXQtPkJ5dGVDb3VudCgpLCAyMDAwNTUpOworCisgIGludCByZXN1bHQgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZWFkcyB0ZXh0IGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCBleHBlY3RzIGl0IHRvIG1hdGNoIHdoYXQgV3JpdGVTdHVmZigpCisvLyB3cml0ZXMuCit2b2lkIElvVGVzdDo6UmVhZFN0dWZmTGFyZ2UoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgUmVhZFN0cmluZyhpbnB1dCwgIkhlbGxvIHdvcmxkIVxuU29tZSB0ZXh0LiAgIik7CisgIEVYUEVDVF9UUlVFKGlucHV0LT5Ta2lwKDUpKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgImJsYWguIik7CisgIEVYUEVDVF9UUlVFKGlucHV0LT5Ta2lwKDEwMDAwMCAtIDEwKSk7CisgIFJlYWRTdHJpbmcoaW5wdXQsIHN0cmluZygxMCwgJ3gnKSArIHN0cmluZygxMDAwMDAgLSAyMDAwMCwgJ3knKSk7CisgIEVYUEVDVF9UUlVFKGlucHV0LT5Ta2lwKDIwMDAwIC0gMTApKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgInl5eXl5eXl5eXkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOworCisgIEVYUEVDVF9FUShpbnB1dC0+Qnl0ZUNvdW50KCksIDIwMDA1NSk7CisKKyAgdWludDggYnl0ZTsKKyAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsICZieXRlLCAxKSwgMCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVF9GKElvVGVzdCwgQXJyYXlJbykgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyNTY7CisgIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIGludCBzaXplOworICAgICAgeworICAgICAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICBzaXplID0gV3JpdGVTdHVmZigmb3V0cHV0KTsKKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1RFU1RfRihJb1Rlc3QsIFR3b1Nlc3Npb25Xcml0ZSkgeworICAvLyBUZXN0IHRoYXQgdHdvIGNvbmNhdGVuYXRlZCB3cml0ZSBzZXNzaW9ucyByZWFkIGNvcnJlY3RseQorCisgIHN0YXRpYyBjb25zdCBjaGFyKiBzdHJBID0gIjAxMjM0NTY3ODkiOworICBzdGF0aWMgY29uc3QgY2hhciogc3RyQiA9ICJXaGlybGVkUGVhcyI7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisgIGNoYXIqIHRlbXBfYnVmZmVyID0gbmV3IGNoYXJbNDBdOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBBcnJheU91dHB1dFN0cmVhbSogb3V0cHV0ID0KKyAgICAgICAgICBuZXcgQXJyYXlPdXRwdXRTdHJlYW0oYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShvdXRwdXQpOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKHN0cmxlbihzdHJBKSk7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckEsIHN0cmxlbihzdHJBKSk7CisgICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKKyAgICAgIGludDY0IHBvcyA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgICAgICBkZWxldGUgb3V0cHV0OworICAgICAgb3V0cHV0ID0gbmV3IEFycmF5T3V0cHV0U3RyZWFtKAorICAgICAgICAgIGJ1ZmZlciArIHBvcywga0J1ZmZlclNpemUgLSBwb3MsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShvdXRwdXQpOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKHN0cmxlbihzdHJCKSk7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckIsIHN0cmxlbihzdHJCKSk7CisgICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKKyAgICAgIGludDY0IHNpemUgPSBwb3MgKyBvdXRwdXQtPkJ5dGVDb3VudCgpOworICAgICAgZGVsZXRlIG91dHB1dDsKKworICAgICAgQXJyYXlJbnB1dFN0cmVhbSogaW5wdXQgPQorICAgICAgICAgIG5ldyBBcnJheUlucHV0U3RyZWFtKGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgQ29kZWRJbnB1dFN0cmVhbSogY29kZWRfaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShpbnB1dCk7CisgICAgICB1aW50MzIgaW5zaXplOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7CisgICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckEpLCBpbnNpemUpOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRSYXcodGVtcF9idWZmZXIsIGluc2l6ZSkpOworICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh0ZW1wX2J1ZmZlciwgc3RyQSwgaW5zaXplKSk7CisKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkVmFyaW50MzIoJmluc2l6ZSkpOworICAgICAgRVhQRUNUX0VRKHN0cmxlbihzdHJCKSwgaW5zaXplKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckIsIGluc2l6ZSkpOworCisgICAgICBkZWxldGUgY29kZWRfaW5wdXQ7CisgICAgICBkZWxldGUgaW5wdXQ7CisgICAgfQorICB9CisKKyAgZGVsZXRlIFtdIHRlbXBfYnVmZmVyOworICBkZWxldGUgW10gYnVmZmVyOworfQorCisjaWYgSEFWRV9aTElCCitURVNUX0YoSW9UZXN0LCBHemlwSW8pIHsKKyAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gMioxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIGZvciAoaW50IHogPSAwOyB6IDwga0Jsb2NrU2l6ZUNvdW50OyB6KyspIHsKKyAgICAgICAgaW50IGd6aXBfYnVmZmVyX3NpemUgPSBrQmxvY2tTaXplc1t6XTsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIHsKKyAgICAgICAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICAgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKKyAgICAgICAgICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OkdaSVA7CisgICAgICAgICAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYnVmZmVyX3NpemUgPSBnemlwX2J1ZmZlcl9zaXplOworICAgICAgICAgIH0KKyAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOworICAgICAgICAgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKKyAgICAgICAgICBnem91dC5DbG9zZSgpOworICAgICAgICAgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyLCBzaXplLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgICAgR3ppcElucHV0U3RyZWFtIGd6aW4oCisgICAgICAgICAgICAgICZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpHWklQLCBnemlwX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICBSZWFkU3R1ZmYoJmd6aW4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisKK1RFU1RfRihJb1Rlc3QsIEd6aXBJb1dpdGhGbHVzaCkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CisgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOworICAvLyBXZSBzdGFydCB3aXRoIGkgPSA0IGFzIHdlIHdhbnQgYSBibG9jayBzaXplID4gNi4gV2l0aCBibG9jayBzaXplIDw9IDYKKyAgLy8gRmx1c2goKSBmaWxscyB1cCB0aGUgZW50aXJlIDJLIGJ1ZmZlciB3aXRoIGZsdXNoIG1hcmtlcnMgYW5kIHRoZSB0ZXN0CisgIC8vIGZhaWxzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgRmx1c2goKSBmb3IgbW9yZSBkZXRhaWwuCisgIGZvciAoaW50IGkgPSA0OyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGtCbG9ja1NpemVDb3VudDsgeisrKSB7CisgICAgICAgIGludCBnemlwX2J1ZmZlcl9zaXplID0ga0Jsb2NrU2l6ZXNbel07CisgICAgICAgIGludCBzaXplOworICAgICAgICB7CisgICAgICAgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgICAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpHWklQOworICAgICAgICAgIGlmIChnemlwX2J1ZmZlcl9zaXplICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICAgICAgICBXcml0ZVN0dWZmKCZnem91dCk7CisgICAgICAgICAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7CisgICAgICAgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICAgICAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKAorICAgICAgICAgICAgICAmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6R1pJUCwgZ3ppcF9idWZmZXJfc2l6ZSk7CisgICAgICAgICAgUmVhZFN0dWZmKCZnemluKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBkZWxldGUgW10gYnVmZmVyOworfQorCitURVNUX0YoSW9UZXN0LCBHemlwSW9Db250aWd1b3VzRmx1c2hlcykgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CisgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOworCisgIGludCBibG9ja19zaXplID0ga0Jsb2NrU2l6ZXNbNF07CisgIGludCBnemlwX2J1ZmZlcl9zaXplID0gYmxvY2tfc2l6ZTsKKyAgaW50IHNpemU7CisKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGJsb2NrX3NpemUpOworICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKKyAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgfQorICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOworICBXcml0ZVN0dWZmKCZnem91dCk7CisgIEVYUEVDVF9UUlVFKGd6b3V0LkZsdXNoKCkpOworICBFWFBFQ1RfVFJVRShnem91dC5GbHVzaCgpKTsKKyAgZ3pvdXQuQ2xvc2UoKTsKKyAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKKworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwgYmxvY2tfc2l6ZSk7CisgIEd6aXBJbnB1dFN0cmVhbSBnemluKAorICAgICAgJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OkdaSVAsIGd6aXBfYnVmZmVyX3NpemUpOworICBSZWFkU3R1ZmYoJmd6aW4pOworCisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisKK1RFU1RfRihJb1Rlc3QsIEd6aXBJb1JlYWRBZnRlckZsdXNoKSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisKKyAgaW50IGJsb2NrX3NpemUgPSBrQmxvY2tTaXplc1s0XTsKKyAgaW50IGd6aXBfYnVmZmVyX3NpemUgPSBibG9ja19zaXplOworICBpbnQgc2l6ZTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGJsb2NrX3NpemUpOworICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKKyAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgfQorCisgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKKyAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7CisgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGJsb2NrX3NpemUpOworICBHemlwSW5wdXRTdHJlYW0gZ3ppbigKKyAgICAgICZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpHWklQLCBnemlwX2J1ZmZlcl9zaXplKTsKKyAgUmVhZFN0dWZmKCZnemluKTsKKworICBnem91dC5DbG9zZSgpOworCisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisKK1RFU1RfRihJb1Rlc3QsIFpsaWJJbykgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CisgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCBrQmxvY2tTaXplQ291bnQ7IHorKykgeworICAgICAgICBpbnQgZ3ppcF9idWZmZXJfc2l6ZSA9IGtCbG9ja1NpemVzW3pdOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgeworICAgICAgICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgICAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOworICAgICAgICAgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6WkxJQjsKKyAgICAgICAgICBpZiAoZ3ppcF9idWZmZXJfc2l6ZSAhPSAtMSkgeworICAgICAgICAgICAgb3B0aW9ucy5idWZmZXJfc2l6ZSA9IGd6aXBfYnVmZmVyX3NpemU7CisgICAgICAgICAgfQorICAgICAgICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgICAgICAgICAgV3JpdGVTdHVmZigmZ3pvdXQpOworICAgICAgICAgIGd6b3V0LkNsb3NlKCk7CisgICAgICAgICAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgICBHemlwSW5wdXRTdHJlYW0gZ3ppbigKKyAgICAgICAgICAgICAgJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OlpMSUIsIGd6aXBfYnVmZmVyX3NpemUpOworICAgICAgICAgIFJlYWRTdHVmZigmZ3ppbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZGVsZXRlIFtdIGJ1ZmZlcjsKK30KKworVEVTVF9GKElvVGVzdCwgWmxpYklvSW5wdXRBdXRvZGV0ZWN0KSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisgIGludCBzaXplOworICB7CisgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUpOworICAgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OlpMSUI7CisgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICBXcml0ZVN0dWZmKCZnem91dCk7CisgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOworICB9CisgIHsKKyAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSk7CisgICAgR3ppcElucHV0U3RyZWFtIGd6aW4oJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OkFVVE8pOworICAgIFJlYWRTdHVmZigmZ3ppbik7CisgIH0KKyAgeworICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplKTsKKyAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpHWklQOworICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgICAgV3JpdGVTdHVmZigmZ3pvdXQpOworICAgIGd6b3V0LkNsb3NlKCk7CisgICAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKKyAgfQorICB7CisgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUpOworICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpBVVRPKTsKKyAgICBSZWFkU3R1ZmYoJmd6aW4pOworICB9CisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisKK3N0cmluZyBJb1Rlc3Q6OkNvbXByZXNzKGNvbnN0IHN0cmluZyYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgeworICAgIFN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnJlc3VsdCk7CisgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICBXcml0ZVRvT3V0cHV0KCZnem91dCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgSW9UZXN0OjpVbmNvbXByZXNzKGNvbnN0IHN0cmluZyYgZGF0YSkgeworICBzdHJpbmcgcmVzdWx0OworICB7CisgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCk7CisgICAgY29uc3Qgdm9pZCogYnVmZmVyOworICAgIGludCBzaXplOworICAgIHdoaWxlIChnemluLk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlciksIHNpemUpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitURVNUX0YoSW9UZXN0LCBDb21wcmVzc2lvbk9wdGlvbnMpIHsKKyAgLy8gU29tZSBhZC1ob2MgdGVzdGluZyBvZiBjb21wcmVzc2lvbiBvcHRpb25zLgorCisgIHN0cmluZyBnb2xkZW47CisgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZSgKKyAgICBUZXN0U291cmNlRGlyKCkgKyAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSIsCisgICAgJmdvbGRlbik7CisKKyAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOworICBzdHJpbmcgZ3ppcF9jb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBvcHRpb25zKTsKKworICBvcHRpb25zLmNvbXByZXNzaW9uX2xldmVsID0gMDsKKyAgc3RyaW5nIG5vdF9jb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBvcHRpb25zKTsKKworICAvLyBUcnkgemxpYiBjb21wcmVzc2lvbiBmb3IgZnVuLgorICBvcHRpb25zID0gR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucygpOworICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OlpMSUI7CisgIHN0cmluZyB6bGliX2NvbXByZXNzZWQgPSBDb21wcmVzcyhnb2xkZW4sIG9wdGlvbnMpOworCisgIC8vIFVuY29tcHJlc3NlZCBzaG91bGQgYmUgYmlnZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIHNpbmNlIGl0IHNob3VsZCBoYXZlIHNvbWUKKyAgLy8gc29ydCBvZiBoZWFkZXIuCisgIEVYUEVDVF9HVChub3RfY29tcHJlc3NlZC5zaXplKCksIGdvbGRlbi5zaXplKCkpOworCisgIC8vIEhpZ2hlciBjb21wcmVzc2lvbiBsZXZlbHMgc2hvdWxkIHJlc3VsdCBpbiBzbWFsbGVyIHNpemVzLgorICBFWFBFQ1RfTFQoemxpYl9jb21wcmVzc2VkLnNpemUoKSwgbm90X2NvbXByZXNzZWQuc2l6ZSgpKTsKKworICAvLyBaTElCIGZvcm1hdCBzaG91bGQgZGlmZmVyIGZyb20gR1pJUCBmb3JtYXQuCisgIEVYUEVDVF9UUlVFKHpsaWJfY29tcHJlc3NlZCAhPSBnemlwX2NvbXByZXNzZWQpOworCisgIC8vIEV2ZXJ5dGhpbmcgc2hvdWxkIGRlY29tcHJlc3MgY29ycmVjdGx5LgorICBFWFBFQ1RfVFJVRShVbmNvbXByZXNzKG5vdF9jb21wcmVzc2VkKSA9PSBnb2xkZW4pOworICBFWFBFQ1RfVFJVRShVbmNvbXByZXNzKGd6aXBfY29tcHJlc3NlZCkgPT0gZ29sZGVuKTsKKyAgRVhQRUNUX1RSVUUoVW5jb21wcmVzcyh6bGliX2NvbXByZXNzZWQpID09IGdvbGRlbik7Cit9CisKK1RFU1RfRihJb1Rlc3QsIFR3b1Nlc3Npb25Xcml0ZUd6aXApIHsKKyAgLy8gVGVzdCB0aGF0IHR3byBjb25jYXRlbmF0ZWQgZ3ppcCBzdHJlYW1zIGNhbiBiZSByZWFkIGNvcnJlY3RseQorCisgIHN0YXRpYyBjb25zdCBjaGFyKiBzdHJBID0gIjAxMjM0NTY3ODkiOworICBzdGF0aWMgY29uc3QgY2hhciogc3RyQiA9ICJRdWlja0Jyb3duRm94IjsKKyAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gMioxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKyAgY2hhciogdGVtcF9idWZmZXIgPSBuZXcgY2hhcls0MF07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIEFycmF5T3V0cHV0U3RyZWFtKiBvdXRwdXQgPQorICAgICAgICAgIG5ldyBBcnJheU91dHB1dFN0cmVhbShidWZmZXIsIGtCdWZmZXJTaXplLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICBHemlwT3V0cHV0U3RyZWFtKiBnem91dCA9IG5ldyBHemlwT3V0cHV0U3RyZWFtKG91dHB1dCk7CisgICAgICBDb2RlZE91dHB1dFN0cmVhbSogY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGd6b3V0KTsKKyAgICAgIGludDMyIG91dGxlbiA9IHN0cmxlbihzdHJBKSArIDE7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlVmFyaW50MzIob3V0bGVuKTsKKyAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVSYXcoc3RyQSwgb3V0bGVuKTsKKyAgICAgIGRlbGV0ZSBjb2RlZF9vdXRwdXQ7ICAvLyBmbHVzaAorICAgICAgZGVsZXRlIGd6b3V0OyAgLy8gZmx1c2gKKyAgICAgIGludDY0IHBvcyA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgICAgICBkZWxldGUgb3V0cHV0OworICAgICAgb3V0cHV0ID0gbmV3IEFycmF5T3V0cHV0U3RyZWFtKAorICAgICAgICAgIGJ1ZmZlciArIHBvcywga0J1ZmZlclNpemUgLSBwb3MsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgIGd6b3V0ID0gbmV3IEd6aXBPdXRwdXRTdHJlYW0ob3V0cHV0KTsKKyAgICAgIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShnem91dCk7CisgICAgICBvdXRsZW4gPSBzdHJsZW4oc3RyQikgKyAxOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKG91dGxlbik7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckIsIG91dGxlbik7CisgICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKKyAgICAgIGRlbGV0ZSBnem91dDsgIC8vIGZsdXNoCisgICAgICBpbnQ2NCBzaXplID0gcG9zICsgb3V0cHV0LT5CeXRlQ291bnQoKTsKKyAgICAgIGRlbGV0ZSBvdXRwdXQ7CisKKyAgICAgIEFycmF5SW5wdXRTdHJlYW0qIGlucHV0ID0KKyAgICAgICAgICBuZXcgQXJyYXlJbnB1dFN0cmVhbShidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgIEd6aXBJbnB1dFN0cmVhbSogZ3ppbiA9IG5ldyBHemlwSW5wdXRTdHJlYW0oaW5wdXQpOworICAgICAgQ29kZWRJbnB1dFN0cmVhbSogY29kZWRfaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShnemluKTsKKyAgICAgIHVpbnQzMiBpbnNpemU7CisgICAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC0+UmVhZFZhcmludDMyKCZpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUShzdHJsZW4oc3RyQSkgKyAxLCBpbnNpemUpOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRSYXcodGVtcF9idWZmZXIsIGluc2l6ZSkpOworICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh0ZW1wX2J1ZmZlciwgc3RyQSwgaW5zaXplKSkKKyAgICAgICAgICA8PCAic3RyQT0iIDw8IHN0ckEgPDwgIiBpbj0iIDw8IHRlbXBfYnVmZmVyOworCisgICAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC0+UmVhZFZhcmludDMyKCZpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUShzdHJsZW4oc3RyQikgKyAxLCBpbnNpemUpOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRSYXcodGVtcF9idWZmZXIsIGluc2l6ZSkpOworICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh0ZW1wX2J1ZmZlciwgc3RyQiwgaW5zaXplKSkKKyAgICAgICAgICA8PCAiIG91dF9ibG9ja19zaXplPSIgPDwga0Jsb2NrU2l6ZXNbaV0KKyAgICAgICAgICA8PCAiIGluX2Jsb2NrX3NpemU9IiA8PCBrQmxvY2tTaXplc1tqXQorICAgICAgICAgIDw8ICIgcG9zPSIgPDwgcG9zCisgICAgICAgICAgPDwgIiBzaXplPSIgPDwgc2l6ZQorICAgICAgICAgIDw8ICIgc3RyQj0iIDw8IHN0ckIgPDwgIiBpbj0iIDw8IHRlbXBfYnVmZmVyOworCisgICAgICBkZWxldGUgY29kZWRfaW5wdXQ7CisgICAgICBkZWxldGUgZ3ppbjsKKyAgICAgIGRlbGV0ZSBpbnB1dDsKKyAgICB9CisgIH0KKworICBkZWxldGUgW10gdGVtcF9idWZmZXI7CisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisjZW5kaWYKKworLy8gVGhlcmUgaXMgbm8gc3RyaW5nIGlucHV0LCBvbmx5IHN0cmluZyBvdXRwdXQuICBBbHNvLCBpdCBkb2Vzbid0IHN1cHBvcnQKKy8vIGV4cGxpY2l0IGJsb2NrIHNpemVzLiAgU28sIHdlJ2xsIG9ubHkgcnVuIG9uZSB0ZXN0IGFuZCB3ZSdsbCB1c2UKKy8vIEFycmF5SW5wdXQgdG8gcmVhZCBiYWNrIHRoZSByZXN1bHRzLgorVEVTVF9GKElvVGVzdCwgU3RyaW5nSW8pIHsKKyAgc3RyaW5nIHN0cjsKKyAgeworICAgIFN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnN0cik7CisgICAgV3JpdGVTdHVmZigmb3V0cHV0KTsKKyAgfQorICB7CisgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKKyAgICBSZWFkU3R1ZmYoJmlucHV0KTsKKyAgfQorfQorCisKKy8vIFRvIHRlc3QgZmlsZXMsIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlLCB3cml0ZSwgcmVhZCwgdHJ1bmNhdGUsIHJlcGVhdC4KK1RFU1RfRihJb1Rlc3QsIEZpbGVJbykgeworICBzdHJpbmcgZmlsZW5hbWUgPSBUZXN0VGVtcERpcigpICsgIi96ZXJvX2NvcHlfc3RyZWFtX3Rlc3RfZmlsZSI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIC8vIE1ha2UgYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgIGludCBmaWxlID0KKyAgICAgICAgb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNzc3KTsKKyAgICAgIEFTU0VSVF9HRShmaWxlLCAwKTsKKworICAgICAgeworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dChmaWxlLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJld2luZC4KKyAgICAgIEFTU0VSVF9ORShsc2VlayhmaWxlLCAwLCBTRUVLX1NFVCksIChvZmZfdCktMSk7CisKKyAgICAgIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0KGZpbGUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKKyAgICAgIH0KKworICAgICAgY2xvc2UoZmlsZSk7CisgICAgfQorICB9Cit9CisKKyNpZiBIQVZFX1pMSUIKK1RFU1RfRihJb1Rlc3QsIEd6aXBGaWxlSW8pIHsKKyAgc3RyaW5nIGZpbGVuYW1lID0gVGVzdFRlbXBEaXIoKSArICIvemVyb19jb3B5X3N0cmVhbV90ZXN0X2ZpbGUiOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgICBpbnQgZmlsZSA9CisgICAgICAgIG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDc3Nyk7CisgICAgICBBU1NFUlRfR0UoZmlsZSwgMCk7CisgICAgICB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0KTsKKyAgICAgICAgV3JpdGVTdHVmZkxhcmdlKCZnem91dCk7CisgICAgICAgIGd6b3V0LkNsb3NlKCk7CisgICAgICAgIG91dHB1dC5GbHVzaCgpOworICAgICAgICBFWFBFQ1RfRVEoMCwgb3V0cHV0LkdldEVycm5vKCkpOworICAgICAgfQorCisgICAgICAvLyBSZXdpbmQuCisgICAgICBBU1NFUlRfTkUobHNlZWsoZmlsZSwgMCwgU0VFS19TRVQpLCAob2ZmX3QpLTEpOworCisgICAgICB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dChmaWxlLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCk7CisgICAgICAgIFJlYWRTdHVmZkxhcmdlKCZnemluKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGlucHV0LkdldEVycm5vKCkpOworICAgICAgfQorCisgICAgICBjbG9zZShmaWxlKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvLyBNU1ZDIHJhaXNlcyB2YXJpb3VzIGRlYnVnZ2luZyBleGNlcHRpb25zIGlmIHdlIHRyeSB0byB1c2UgYSBmaWxlCisvLyBkZXNjcmlwdG9yIG9mIC0xLCBkZWZlYXRpbmcgb3VyIHRlc3RzIGJlbG93LiAgVGhpcyBjbGFzcyB3aWxsIGRpc2FibGUKKy8vIHRoZXNlIGRlYnVnIGFzc2VydGlvbnMgd2hpbGUgaW4gc2NvcGUuCitjbGFzcyBNc3ZjRGVidWdEaXNhYmxlciB7CisgcHVibGljOgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE0MDAKKyAgTXN2Y0RlYnVnRGlzYWJsZXIoKSB7CisgICAgb2xkX2hhbmRsZXJfID0gX3NldF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyKE15SGFuZGxlcik7CisgICAgb2xkX21vZGVfID0gX0NydFNldFJlcG9ydE1vZGUoX0NSVF9BU1NFUlQsIDApOworICB9CisgIH5Nc3ZjRGVidWdEaXNhYmxlcigpIHsKKyAgICBvbGRfaGFuZGxlcl8gPSBfc2V0X2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIob2xkX2hhbmRsZXJfKTsKKyAgICBvbGRfbW9kZV8gPSBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgb2xkX21vZGVfKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIE15SGFuZGxlcihjb25zdCB3Y2hhcl90ICpleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCAqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBwUmVzZXJ2ZWQpIHsKKyAgICAvLyBkbyBub3RoaW5nCisgIH0KKworICBfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlciBvbGRfaGFuZGxlcl87CisgIGludCBvbGRfbW9kZV87CisjZWxzZQorICAvLyBEdW1teSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0byBlbnN1cmUgdGhhdCBHQ0MgZG9lc24ndCBjb21wbGFpbgorICAvLyB0aGF0IGRlYnVnX2Rpc2FibGVyIGlzIGFuIHVudXNlZCB2YXJpYWJsZS4KKyAgTXN2Y0RlYnVnRGlzYWJsZXIoKSB7fQorICB+TXN2Y0RlYnVnRGlzYWJsZXIoKSB7fQorI2VuZGlmCit9OworCisvLyBUZXN0IHRoYXQgRmlsZUlucHV0U3RyZWFtcyByZXBvcnQgZXJyb3JzIGNvcnJlY3RseS4KK1RFU1RfRihJb1Rlc3QsIEZpbGVSZWFkRXJyb3IpIHsKKyAgTXN2Y0RlYnVnRGlzYWJsZXIgZGVidWdfZGlzYWJsZXI7CisKKyAgLy8gLTEgPSBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvci4KKyAgRmlsZUlucHV0U3RyZWFtIGlucHV0KC0xKTsKKworICBjb25zdCB2b2lkKiBidWZmZXI7CisgIGludCBzaXplOworICBFWFBFQ1RfRkFMU0UoaW5wdXQuTmV4dCgmYnVmZmVyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoRUJBREYsIGlucHV0LkdldEVycm5vKCkpOworfQorCisvLyBUZXN0IHRoYXQgRmlsZU91dHB1dFN0cmVhbXMgcmVwb3J0IGVycm9ycyBjb3JyZWN0bHkuCitURVNUX0YoSW9UZXN0LCBGaWxlV3JpdGVFcnJvcikgeworICBNc3ZjRGVidWdEaXNhYmxlciBkZWJ1Z19kaXNhYmxlcjsKKworICAvLyAtMSA9IGludmFsaWQgZmlsZSBkZXNjcmlwdG9yLgorICBGaWxlT3V0cHV0U3RyZWFtIGlucHV0KC0xKTsKKworICB2b2lkKiBidWZmZXI7CisgIGludCBzaXplOworCisgIC8vIFRoZSBmaXJzdCBjYWxsIHRvIE5leHQoKSBzdWNjZWVkcyBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0bworICAvLyB3cml0ZSB5ZXQuCisgIEVYUEVDVF9UUlVFKGlucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKTsKKworICAvLyBTZWNvbmQgY2FsbCBmYWlscy4KKyAgRVhQRUNUX0ZBTFNFKGlucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKTsKKworICBFWFBFQ1RfRVEoRUJBREYsIGlucHV0LkdldEVycm5vKCkpOworfQorCisvLyBQaXBlcyBhcmUgbm90IHNlZWthYmxlLCBzbyBGaWxle0lucHV0LE91dHB1dH1TdHJlYW0gZW5kcyB1cCBkb2luZyBzb21lCisvLyBkaWZmZXJlbnQgdGhpbmdzIHRvIGhhbmRsZSB0aGVtLiAgV2UnbGwgdGVzdCBieSB3cml0aW5nIHRvIGEgcGlwZSBhbmQKKy8vIHJlYWRpbmcgYmFjayBmcm9tIGl0LgorVEVTVF9GKElvVGVzdCwgUGlwZUlvKSB7CisgIGludCBmaWxlc1syXTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcGlwZSBlYWNoIHRpbWUgYmVjYXVzZSBSZWFkU3R1ZmYoKSBleHBlY3RzCisgICAgICAvLyB0byBzZWUgRU9GIGF0IHRoZSBlbmQuCisgICAgICBBU1NFUlRfRVEocGlwZShmaWxlcyksIDApOworCisgICAgICB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVzWzFdLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisgICAgICBjbG9zZShmaWxlc1sxXSk7ICAvLyBTZW5kIEVPRi4KKworICAgICAgeworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZXNbMF0sIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKKyAgICAgIH0KKyAgICAgIGNsb3NlKGZpbGVzWzBdKTsKKyAgICB9CisgIH0KK30KKworLy8gVGVzdCB1c2luZyBDKysgaW9zdHJlYW1zLgorVEVTVF9GKElvVGVzdCwgSW9zdHJlYW1JbykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgeworICAgICAgICBzdHJpbmdzdHJlYW0gc3RyZWFtOworCisgICAgICAgIHsKKyAgICAgICAgICBPc3RyZWFtT3V0cHV0U3RyZWFtIG91dHB1dCgmc3RyZWFtLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgICAgV3JpdGVTdHVmZigmb3V0cHV0KTsKKyAgICAgICAgICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLmZhaWwoKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgSXN0cmVhbUlucHV0U3RyZWFtIGlucHV0KCZzdHJlYW0sIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgICBSZWFkU3R1ZmYoJmlucHV0KTsKKyAgICAgICAgICBFWFBFQ1RfVFJVRShzdHJlYW0uZW9mKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgc3RyaW5nc3RyZWFtIHN0cmVhbTsKKworICAgICAgICB7CisgICAgICAgICAgT3N0cmVhbU91dHB1dFN0cmVhbSBvdXRwdXQoJnN0cmVhbSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICAgIFdyaXRlU3R1ZmZMYXJnZSgmb3V0cHV0KTsKKyAgICAgICAgICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLmZhaWwoKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgSXN0cmVhbUlucHV0U3RyZWFtIGlucHV0KCZzdHJlYW0sIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgICBSZWFkU3R1ZmZMYXJnZSgmaW5wdXQpOworICAgICAgICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5lb2YoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gVG8gdGVzdCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0sIHdlIGNyZWF0ZSBzZXZlcmFsIEFycmF5SW5wdXRTdHJlYW1zCisvLyBjb3ZlcmluZyBhIGJ1ZmZlciBhbmQgdGhlbiBjb25jYXRlbmF0ZSB0aGVtLgorVEVTVF9GKElvVGVzdCwgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDI1NjsKKyAgdWludDggYnVmZmVyW2tCdWZmZXJTaXplXTsKKworICAvLyBGaWxsIHRoZSBidWZmZXIuCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplKTsKKyAgV3JpdGVTdHVmZigmb3V0cHV0KTsKKworICAvLyBOb3cgc3BsaXQgaXQgdXAgaW50byBtdWx0aXBsZSBzdHJlYW1zIG9mIHZhcnlpbmcgc2l6ZXMuCisgIEFTU0VSVF9FUSg2OCwgb3V0cHV0LkJ5dGVDb3VudCgpKTsgIC8vIFRlc3QgZGVwZW5kcyBvbiB0aGlzLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0MShidWZmZXIgICAgICwgMTIpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0MihidWZmZXIgKyAxMiwgIDcpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0MyhidWZmZXIgKyAxOSwgIDYpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0NChidWZmZXIgKyAyNSwgMTUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0NShidWZmZXIgKyA0MCwgIDApOworICAvLyBOb3RlOiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIHN0cmVhbSBib3VuZGFyeSBzb21ld2hlcmUgYmV0d2VlbgorICAvLyBieXRlcyA0MiBhbmQgNjIsIHdoaWNoIGlzIHRoZSByYW5nZSB0aGF0IGl0IFNraXAoKWVkIGJ5IFJlYWRTdHVmZigpLiAgVGhpcworICAvLyB0ZXN0cyB0aGF0IGEgYnVnIHRoYXQgZXhpc3RlZCBpbiB0aGUgb3JpZ2luYWwgY29kZSBmb3IgU2tpcCgpIGlzIGZpeGVkLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0NihidWZmZXIgKyA0MCwgMTApOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0NyhidWZmZXIgKyA1MCwgMTgpOyAgLy8gVG90YWwgPSA2OCBieXRlcy4KKworICBaZXJvQ29weUlucHV0U3RyZWFtKiBzdHJlYW1zW10gPQorICAgIHsmaW5wdXQxLCAmaW5wdXQyLCAmaW5wdXQzLCAmaW5wdXQ0LCAmaW5wdXQ1LCAmaW5wdXQ2LCAmaW5wdXQ3fTsKKworICAvLyBDcmVhdGUgdGhlIGNvbmNhdGVuYXRpbmcgc3RyZWFtIGFuZCByZWFkLgorICBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaW5wdXQoc3RyZWFtcywgR09PR0xFX0FSUkFZU0laRShzdHJlYW1zKSk7CisgIFJlYWRTdHVmZigmaW5wdXQpOworfQorCisvLyBUbyB0ZXN0IExpbWl0aW5nSW5wdXRTdHJlYW0sIHdlIHdyaXRlIG91ciBnb2xkZW4gdGV4dCB0byBhIGJ1ZmZlciwgdGhlbgorLy8gY3JlYXRlIGFuIEFycmF5SW5wdXRTdHJlYW0gdGhhdCBjb250YWlucyB0aGUgd2hvbGUgYnVmZmVyIChub3QganVzdCB0aGUKKy8vIGJ5dGVzIHdyaXR0ZW4pLCB0aGVuIHVzZSBhIExpbWl0aW5nSW5wdXRTdHJlYW0gdG8gbGltaXQgaXQganVzdCB0byB0aGUKKy8vIGJ5dGVzIHdyaXR0ZW4uCitURVNUX0YoSW9UZXN0LCBMaW1pdGluZ0lucHV0U3RyZWFtKSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDI1NjsKKyAgdWludDggYnVmZmVyW2tCdWZmZXJTaXplXTsKKworICAvLyBGaWxsIHRoZSBidWZmZXIuCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplKTsKKyAgV3JpdGVTdHVmZigmb3V0cHV0KTsKKworICAvLyBTZXQgdXAgaW5wdXQuCisgIEFycmF5SW5wdXRTdHJlYW0gYXJyYXlfaW5wdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7CisgIExpbWl0aW5nSW5wdXRTdHJlYW0gaW5wdXQoJmFycmF5X2lucHV0LCBvdXRwdXQuQnl0ZUNvdW50KCkpOworCisgIFJlYWRTdHVmZigmaW5wdXQpOworfQorCisvLyBDaGVjayB0aGF0IGEgemVyby1zaXplIGFycmF5IGRvZXNuJ3QgY29uZnVzZSB0aGUgY29kZS4KK1RFU1QoWmVyb1NpemVBcnJheSwgSW5wdXQpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChOVUxMLCAwKTsKKyAgY29uc3Qgdm9pZCogZGF0YTsKKyAgaW50IHNpemU7CisgIEVYUEVDVF9GQUxTRShpbnB1dC5OZXh0KCZkYXRhLCAmc2l6ZSkpOworfQorCitURVNUKFplcm9TaXplQXJyYXksIE91dHB1dCkgeworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoTlVMTCwgMCk7CisgIHZvaWQqIGRhdGE7CisgIGludCBzaXplOworICBFWFBFQ1RfRkFMU0Uob3V0cHV0Lk5leHQoJmRhdGEsICZzaXplKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwYTU3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIHsKKy8vIEhlbHBlciBtZXRob2RzIHRvIHRlc3QgcGFyc2luZyBtZXJnZSBiZWhhdmlvci4KK3ZvaWQgRXhwZWN0TWVzc2FnZU1lcmdlZChjb25zdCBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICBHT09HTEVfQ0hFQ0sobWVzc2FnZS5vcHRpb25hbF9pbnQzMigpID09IDMpOworICBHT09HTEVfQ0hFQ0sobWVzc2FnZS5vcHRpb25hbF9pbnQ2NCgpID09IDIpOworICBHT09HTEVfQ0hFQ0sobWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSA9PSAiaGVsbG8iKTsKK30KKwordm9pZCBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcygKKyAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbXNnMSwKKyAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbXNnMiwKKyAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbXNnMykgeworICBtc2cxLT5zZXRfb3B0aW9uYWxfaW50MzIoMSk7CisgIG1zZzItPnNldF9vcHRpb25hbF9pbnQ2NCgyKTsKKyAgbXNnMy0+c2V0X29wdGlvbmFsX2ludDMyKDMpOworICBtc2czLT5zZXRfb3B0aW9uYWxfc3RyaW5nKCJoZWxsbyIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBzdHJpbmcgZGF0YSwgcGFja2VkX2RhdGE7CisKKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyLCBtZXNzYWdlMzsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlKTsKKyAgICBkYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIG1lc3NhZ2UzLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTMpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHMoJm1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyLCBtZXNzYWdlMzsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICAgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UpOworICAgIHN0cmluZyBleHRlbnNpb25zX2RhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbnNfZGF0YSA9PSBkYXRhKTsKKyAgICBtZXNzYWdlMy5QYXJzZUZyb21TdHJpbmcoZXh0ZW5zaW9uc19kYXRhKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTMpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOworICAgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMiwgbWVzc2FnZTM7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRDbGVhcihtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OlNldFBhY2tlZEZpZWxkcygmbWVzc2FnZSk7CisgICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7CisgICAgcGFja2VkX2RhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgbWVzc2FnZTMuUGFyc2VGcm9tU3RyaW5nKHBhY2tlZF9kYXRhKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQobWVzc2FnZTMpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOworICAgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7CisgICAgc3RyaW5nIHBhY2tlZF9leHRlbnNpb25zX2RhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgR09PR0xFX0NIRUNLKHBhY2tlZF9leHRlbnNpb25zX2RhdGEgPT0gcGFja2VkX2RhdGEpOworICAgIG1lc3NhZ2UzLlBhcnNlRnJvbVN0cmluZyhwYWNrZWRfZXh0ZW5zaW9uc19kYXRhKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZTMpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgdGhhdCBpZiBhbiBvcHRpb25hbCBvciByZXF1aXJlZCBtZXNzYWdlL2dyb3VwIGZpZWxkIGFwcGVhcnMgbXVsdGlwbGUKKyAgICAvLyB0aW1lcyBpbiB0aGUgaW5wdXQsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQuCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2VMaXRlOjpSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciBnZW5lcmF0b3I7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzE7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzI7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzM7CisKKyNkZWZpbmUgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKEZJRUxEKSAgICAgICAgICAgICAgICBcCisgIG1zZzEgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgICAgICAgICAgICAgICAgXAorICBtc2cyID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgbXNnMyA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICAgICAgICAgICAgICAgICBcCisgIEFzc2lnblBhcnNpbmdNZXJnZU1lc3NhZ2VzKG1zZzEsIG1zZzIsIG1zZzMpCisKKyAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQxKTsKKyAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQyKTsKKyAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQzKTsKKyAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZXh0MSk7CisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGV4dDIpOworCisjdW5kZWYgQVNTSUdOX1JFUEVBVEVEX0ZJRUxECisjZGVmaW5lIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChGSUVMRCkgICAgICAgICAgICAgICAgXAorICBtc2cxID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKKyAgbXNnMiA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCisgIG1zZzMgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAorICBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcyhtc2cxLCBtc2cyLCBtc2czKQorCisgICAgQVNTSUdOX1JFUEVBVEVEX0dST1VQKGdyb3VwMSk7CisgICAgQVNTSUdOX1JFUEVBVEVEX0dST1VQKGdyb3VwMik7CisKKyN1bmRlZiBBU1NJR05fUkVQRUFURURfR1JPVVAKKworICAgIHN0cmluZyBidWZmZXI7CisgICAgZ2VuZXJhdG9yLlNlcmlhbGl6ZVRvU3RyaW5nKCZidWZmZXIpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlTGl0ZSBwYXJzaW5nX21lcmdlOworICAgIHBhcnNpbmdfbWVyZ2UuUGFyc2VGcm9tU3RyaW5nKGJ1ZmZlcik7CisKKyAgICAvLyBSZXF1aXJlZCBhbmQgb3B0aW9uYWwgZmllbGRzIHNob3VsZCBiZSBtZXJnZWQuCisgICAgRXhwZWN0TWVzc2FnZU1lcmdlZChwYXJzaW5nX21lcmdlLnJlcXVpcmVkX2FsbF90eXBlcygpKTsKKyAgICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxfYWxsX3R5cGVzKCkpOworICAgIEV4cGVjdE1lc3NhZ2VNZXJnZWQoCisgICAgICAgIHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxncm91cCgpLm9wdGlvbmFsX2dyb3VwX2FsbF90eXBlcygpKTsKKyAgICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2UuR2V0RXh0ZW5zaW9uKAorICAgICAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZUxpdGU6Om9wdGlvbmFsX2V4dCkpOworCisgICAgLy8gUmVwZWF0ZWQgZmllbGRzIHNob3VsZCBub3QgYmUgbWVyZ2VkLgorICAgIEdPT0dMRV9DSEVDSyhwYXJzaW5nX21lcmdlLnJlcGVhdGVkX2FsbF90eXBlc19zaXplKCkgPT0gMyk7CisgICAgR09PR0xFX0NIRUNLKHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRncm91cF9zaXplKCkgPT0gMyk7CisgICAgR09PR0xFX0NIRUNLKHBhcnNpbmdfbWVyZ2UuRXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2VMaXRlOjpyZXBlYXRlZF9leHQpID09IDMpOworICB9CisKKyAgY291dCA8PCAiUEFTUyIgPDwgZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiN2VmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYwpAQCAtMCwwICsxLDM1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgaW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM7CisKK01lc3NhZ2U6On5NZXNzYWdlKCkge30KKwordm9pZCBNZXNzYWdlOjpNZXJnZUZyb20oY29uc3QgTWVzc2FnZSYgZnJvbSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0RGVzY3JpcHRvcigpOworICBHT09HTEVfQ0hFQ0tfRVEoZnJvbS5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpCisgICAgPDwgIjogVHJpZWQgdG8gbWVyZ2UgZnJvbSBhIG1lc3NhZ2Ugd2l0aCBhIGRpZmZlcmVudCB0eXBlLiAgIgorICAgICAgICJ0bzogIiA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSA8PCAiLCAiCisgICAgICAgImZyb206IiA8PCBmcm9tLkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7CisgIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworfQorCit2b2lkIE1lc3NhZ2U6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXIpIHsKKyAgTWVyZ2VGcm9tKCpkb3duX2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KCZvdGhlcikpOworfQorCit2b2lkIE1lc3NhZ2U6OkNvcHlGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IEdldERlc2NyaXB0b3IoKTsKKyAgR09PR0xFX0NIRUNLX0VRKGZyb20uR2V0RGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yKQorICAgIDw8ICI6IFRyaWVkIHRvIGNvcHkgZnJvbSBhIG1lc3NhZ2Ugd2l0aCBhIGRpZmZlcmVudCB0eXBlLiIKKyAgICAgICAidG86ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIiwgIgorICAgICAgICJmcm9tOiIgPDwgZnJvbS5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpOworICBSZWZsZWN0aW9uT3BzOjpDb3B5KGZyb20sIHRoaXMpOworfQorCitzdHJpbmcgTWVzc2FnZTo6R2V0VHlwZU5hbWUoKSBjb25zdCB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpOworfQorCit2b2lkIE1lc3NhZ2U6OkNsZWFyKCkgeworICBSZWZsZWN0aW9uT3BzOjpDbGVhcih0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZCgqdGhpcyk7Cit9CisKK3ZvaWQgTWVzc2FnZTo6RmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHZlY3RvcjxzdHJpbmc+KiBlcnJvcnMpIGNvbnN0IHsKKyAgcmV0dXJuIFJlZmxlY3Rpb25PcHM6OkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygqdGhpcywgIiIsIGVycm9ycyk7Cit9CisKK3N0cmluZyBNZXNzYWdlOjpJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgY29uc3QgeworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycygmZXJyb3JzKTsKKyAgcmV0dXJuIEpvaW5TdHJpbmdzKGVycm9ycywgIiwgIik7Cit9CisKK3ZvaWQgTWVzc2FnZTo6Q2hlY2tJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKElzSW5pdGlhbGl6ZWQoKSkKKyAgICA8PCAiTWVzc2FnZSBvZiB0eXBlIFwiIiA8PCBHZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCisgICAgPDwgIlwiIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiIDw8IEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKTsKK30KKwordm9pZCBNZXNzYWdlOjpEaXNjYXJkVW5rbm93bkZpZWxkcygpIHsKKyAgcmV0dXJuIFJlZmxlY3Rpb25PcHM6OkRpc2NhcmRVbmtub3duRmllbGRzKHRoaXMpOworfQorCitib29sIE1lc3NhZ2U6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKGlucHV0LCB0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlOjpQYXJzZUZyb21GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSB7CisgIGlvOjpGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZV9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCZpbnB1dCkgJiYgaW5wdXQuR2V0RXJybm8oKSA9PSAwOworfQorCitib29sIE1lc3NhZ2U6OlBhcnNlUGFydGlhbEZyb21GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSB7CisgIGlvOjpGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZV9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgmaW5wdXQpICYmIGlucHV0LkdldEVycm5vKCkgPT0gMDsKK30KKworYm9vbCBNZXNzYWdlOjpQYXJzZUZyb21Jc3RyZWFtKGlzdHJlYW0qIGlucHV0KSB7CisgIGlvOjpJc3RyZWFtSW5wdXRTdHJlYW0gemVyb19jb3B5X2lucHV0KGlucHV0KTsKKyAgcmV0dXJuIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCZ6ZXJvX2NvcHlfaW5wdXQpICYmIGlucHV0LT5lb2YoKTsKK30KKworYm9vbCBNZXNzYWdlOjpQYXJzZVBhcnRpYWxGcm9tSXN0cmVhbShpc3RyZWFtKiBpbnB1dCkgeworICBpbzo6SXN0cmVhbUlucHV0U3RyZWFtIHplcm9fY29weV9pbnB1dChpbnB1dCk7CisgIHJldHVybiBQYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oJnplcm9fY29weV9pbnB1dCkgJiYgaW5wdXQtPmVvZigpOworfQorCisKK3ZvaWQgTWVzc2FnZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygqdGhpcywgR2V0Q2FjaGVkU2l6ZSgpLCBvdXRwdXQpOworfQorCitpbnQgTWVzc2FnZTo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCBzaXplID0gV2lyZUZvcm1hdDo6Qnl0ZVNpemUoKnRoaXMpOworICBTZXRDYWNoZWRTaXplKHNpemUpOworICByZXR1cm4gc2l6ZTsKK30KKwordm9pZCBNZXNzYWdlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJNZXNzYWdlIGNsYXNzIFwiIiA8PCBHZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiIGltcGxlbWVudHMgbmVpdGhlciBTZXRDYWNoZWRTaXplKCkgbm9yIEJ5dGVTaXplKCkuICAiCisgICAgICAgICAgICAgICAgIk11c3QgaW1wbGVtZW50IG9uZSBvciB0aGUgb3RoZXIuIjsKK30KKworaW50IE1lc3NhZ2U6OlNwYWNlVXNlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJlZmxlY3Rpb24oKS0+U3BhY2VVc2VkKCp0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlOjpTZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVfZGVzY3JpcHRvcik7CisgIHJldHVybiBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCZvdXRwdXQpOworfQorCitib29sIE1lc3NhZ2U6OlNlcmlhbGl6ZVBhcnRpYWxUb0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVfZGVzY3JpcHRvcik7CisgIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgmb3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlOjpTZXJpYWxpemVUb09zdHJlYW0ob3N0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIHsKKyAgICBpbzo6T3N0cmVhbU91dHB1dFN0cmVhbSB6ZXJvX2NvcHlfb3V0cHV0KG91dHB1dCk7CisgICAgaWYgKCFTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCZ6ZXJvX2NvcHlfb3V0cHV0KSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBvdXRwdXQtPmdvb2QoKTsKK30KKworYm9vbCBNZXNzYWdlOjpTZXJpYWxpemVQYXJ0aWFsVG9Pc3RyZWFtKG9zdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBpbzo6T3N0cmVhbU91dHB1dFN0cmVhbSB6ZXJvX2NvcHlfb3V0cHV0KG91dHB1dCk7CisgIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgmemVyb19jb3B5X291dHB1dCk7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFJlZmxlY3Rpb24gYW5kIGFzc29jaWF0ZWQgVGVtcGxhdGUgU3BlY2lhbGl6YXRpb25zCisKK1JlZmxlY3Rpb246On5SZWZsZWN0aW9uKCkge30KKworI2RlZmluZSBIQU5ETEVfVFlQRShUWVBFLCBDUFBUWVBFLCBDVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjb25zdCBSZXBlYXRlZEZpZWxkPFRZUEU+JiBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEZpZWxkPFRZUEU+KCAgICAgICAgXAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsgICAgIFwKKyAgcmV0dXJuICpzdGF0aWNfY2FzdDxSZXBlYXRlZEZpZWxkPFRZUEU+KiA+KCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgQ1BQVFlQRSwgQ1RZUEUsIE5VTEwpKTsgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1JlcGVhdGVkRmllbGQ8VFlQRT4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZEZpZWxkPFRZUEU+KCAgICAgICAgICBcCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeyAgICAgICAgICAgXAorICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUWVBFPiogPiggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLCBDUFBUWVBFLCBDVFlQRSwgTlVMTCkpOyBcCit9CisKK0hBTkRMRV9UWVBFKGludDMyLCAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyLCAgLTEpOworSEFORExFX1RZUEUoaW50NjQsICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQsICAtMSk7CitIQU5ETEVfVFlQRSh1aW50MzIsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzIsIC0xKTsKK0hBTkRMRV9UWVBFKHVpbnQ2NCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NCwgLTEpOworSEFORExFX1RZUEUoZmxvYXQsICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQsICAtMSk7CitIQU5ETEVfVFlQRShkb3VibGUsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEUsIC0xKTsKK0hBTkRMRV9UWVBFKGJvb2wsICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0wsICAgLTEpOworCisKKyN1bmRlZiBIQU5ETEVfVFlQRQorCit2b2lkKiBSZWZsZWN0aW9uOjpNdXRhYmxlUmF3UmVwZWF0ZWRTdHJpbmcoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCBpc19zdHJpbmcpIGNvbnN0IHsKKyAgcmV0dXJuIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLAorICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORywgRmllbGRPcHRpb25zOjpTVFJJTkcsIE5VTEwpOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNZXNzYWdlRmFjdG9yeQorCitNZXNzYWdlRmFjdG9yeTo6fk1lc3NhZ2VGYWN0b3J5KCkge30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkgOiBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgeworIHB1YmxpYzoKKyAgR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkoKTsKKyAgfkdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KCk7CisKKyAgc3RhdGljIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KiBzaW5nbGV0b24oKTsKKworICB0eXBlZGVmIHZvaWQgUmVnaXN0cmF0aW9uRnVuYyhjb25zdCBzdHJpbmcmKTsKKyAgdm9pZCBSZWdpc3RlckZpbGUoY29uc3QgY2hhciogZmlsZSwgUmVnaXN0cmF0aW9uRnVuYyogcmVnaXN0cmF0aW9uX2Z1bmMpOworICB2b2lkIFJlZ2lzdGVyVHlwZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZUZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGNvbnN0IE1lc3NhZ2UqIEdldFByb3RvdHlwZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlKTsKKworIHByaXZhdGU6CisgIC8vIE9ubHkgd3JpdHRlbiBhdCBzdGF0aWMgaW5pdCB0aW1lLCBzbyBkb2VzIG5vdCByZXF1aXJlIGxvY2tpbmcuCisgIGhhc2hfbWFwPGNvbnN0IGNoYXIqLCBSZWdpc3RyYXRpb25GdW5jKiwKKyAgICAgICAgICAgaGFzaDxjb25zdCBjaGFyKj4sIHN0cmVxPiBmaWxlX21hcF87CisKKyAgLy8gSW5pdGlhbGl6ZWQgbGF6aWx5LCBzbyByZXF1aXJlcyBsb2NraW5nLgorICBNdXRleCBtdXRleF87CisgIGhhc2hfbWFwPGNvbnN0IERlc2NyaXB0b3IqLCBjb25zdCBNZXNzYWdlKj4gdHlwZV9tYXBfOworfTsKKworR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkqIGdlbmVyYXRlZF9tZXNzYWdlX2ZhY3RvcnlfID0gTlVMTDsKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UoZ2VuZXJhdGVkX21lc3NhZ2VfZmFjdG9yeV9vbmNlX2luaXRfKTsKKwordm9pZCBTaHV0ZG93bkdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KCkgeworICBkZWxldGUgZ2VuZXJhdGVkX21lc3NhZ2VfZmFjdG9yeV87Cit9CisKK3ZvaWQgSW5pdEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KCkgeworICBnZW5lcmF0ZWRfbWVzc2FnZV9mYWN0b3J5XyA9IG5ldyBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTsKKyAgaW50ZXJuYWw6Ok9uU2h1dGRvd24oJlNodXRkb3duR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkpOworfQorCitHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6R2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkoKSB7fQorR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6On5HZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSgpIHt9CisKK0dlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KiBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6c2luZ2xldG9uKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZnZW5lcmF0ZWRfbWVzc2FnZV9mYWN0b3J5X29uY2VfaW5pdF8sCisgICAgICAgICAgICAgICAgICZJbml0R2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkpOworICByZXR1cm4gZ2VuZXJhdGVkX21lc3NhZ2VfZmFjdG9yeV87Cit9CisKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OlJlZ2lzdGVyRmlsZSgKKyAgICBjb25zdCBjaGFyKiBmaWxlLCBSZWdpc3RyYXRpb25GdW5jKiByZWdpc3RyYXRpb25fZnVuYykgeworICBpZiAoIUluc2VydElmTm90UHJlc2VudCgmZmlsZV9tYXBfLCBmaWxlLCByZWdpc3RyYXRpb25fZnVuYykpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiRmlsZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICIgPDwgZmlsZTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpSZWdpc3RlclR5cGUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUpIHsKKyAgR09PR0xFX0RDSEVDS19FUShkZXNjcmlwdG9yLT5maWxlKCktPnBvb2woKSwgRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpCisgICAgPDwgIlRyaWVkIHRvIHJlZ2lzdGVyIGEgbm9uLWdlbmVyYXRlZCB0eXBlIHdpdGggdGhlIGdlbmVyYXRlZCAiCisgICAgICAgInR5cGUgcmVnaXN0cnkuIjsKKworICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiBjYWxsaW5nIGEgZmlsZSByZWdpc3RyYXRpb24KKyAgLy8gZnVuY3Rpb24gZHVyaW5nIEdldFByb3RvdHlwZSgpLCBpbiB3aGljaCBjYXNlIHdlIGFscmVhZHkgaGF2ZSBsb2NrZWQKKyAgLy8gdGhlIG11dGV4LgorICBtdXRleF8uQXNzZXJ0SGVsZCgpOworICBpZiAoIUluc2VydElmTm90UHJlc2VudCgmdHlwZV9tYXBfLCBkZXNjcmlwdG9yLCBwcm90b3R5cGUpKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJUeXBlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZDogIiA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKKyAgfQorfQorCisKK2NvbnN0IE1lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpHZXRQcm90b3R5cGUoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgeworICB7CisgICAgUmVhZGVyTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgICAgY29uc3QgTWVzc2FnZSogcmVzdWx0ID0gRmluZFB0ck9yTnVsbCh0eXBlX21hcF8sIHR5cGUpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIElmIHRoZSB0eXBlIGlzIG5vdCBpbiB0aGUgZ2VuZXJhdGVkIHBvb2wsIHRoZW4gd2UgY2FuJ3QgcG9zc2libHkgaGFuZGxlCisgIC8vIGl0LgorICBpZiAodHlwZS0+ZmlsZSgpLT5wb29sKCkgIT0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpIHJldHVybiBOVUxMOworCisgIC8vIEFwcGFyZW50bHkgdGhlIGZpbGUgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCB5ZXQuICBMZXQncyBkbyB0aGF0IG5vdy4KKyAgUmVnaXN0cmF0aW9uRnVuYyogcmVnaXN0cmF0aW9uX2Z1bmMgPQorICAgICAgRmluZFB0ck9yTnVsbChmaWxlX21hcF8sIHR5cGUtPmZpbGUoKS0+bmFtZSgpLmNfc3RyKCkpOworICBpZiAocmVnaXN0cmF0aW9uX2Z1bmMgPT0gTlVMTCkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiRmlsZSBhcHBlYXJzIHRvIGJlIGluIGdlbmVyYXRlZCBwb29sIGJ1dCB3YXNuJ3QgIgorICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkOiAiIDw8IHR5cGUtPmZpbGUoKS0+bmFtZSgpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgV3JpdGVyTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisKKyAgLy8gQ2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgcHJlZW1wdGVkIHVzLgorICBjb25zdCBNZXNzYWdlKiByZXN1bHQgPSBGaW5kUHRyT3JOdWxsKHR5cGVfbWFwXywgdHlwZSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIC8vIE5vcGUuICBPSywgcmVnaXN0ZXIgZXZlcnl0aGluZy4KKyAgICByZWdpc3RyYXRpb25fZnVuYyh0eXBlLT5maWxlKCktPm5hbWUoKSk7CisgICAgLy8gU2hvdWxkIGJlIGhlcmUgbm93LgorICAgIHJlc3VsdCA9IEZpbmRQdHJPck51bGwodHlwZV9tYXBfLCB0eXBlKTsKKyAgfQorCisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiVHlwZSBhcHBlYXJzIHRvIGJlIGluIGdlbmVyYXRlZCBwb29sIGJ1dCB3YXNuJ3QgIgorICAgICAgICAgICAgICAgIDw8ICJyZWdpc3RlcmVkOiAiIDw8IHR5cGUtPmZ1bGxfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK01lc3NhZ2VGYWN0b3J5KiBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSB7CisgIHJldHVybiBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6c2luZ2xldG9uKCk7Cit9CisKK3ZvaWQgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAorICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCB2b2lkICgqcmVnaXN0ZXJfbWVzc2FnZXMpKGNvbnN0IHN0cmluZyYpKSB7CisgIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpzaW5nbGV0b24oKS0+UmVnaXN0ZXJGaWxlKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9tZXNzYWdlcyk7Cit9CisKK3ZvaWQgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSkgeworICBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6c2luZ2xldG9uKCktPlJlZ2lzdGVyVHlwZShkZXNjcmlwdG9yLCBwcm90b3R5cGUpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5MGJjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmgKQEAgLTAsMCArMSw4MzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIERlZmluZXMgTWVzc2FnZSwgdGhlIGFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBub24tbGl0ZQorLy8gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzLiAgQWx0aG91Z2ggaXQncyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcworLy8gaW50ZXJmYWNlIG1hbnVhbGx5LCBtb3N0IHVzZXJzIHdpbGwgdXNlIHRoZSBwcm90b2NvbCBjb21waWxlciB0bworLy8gZ2VuZXJhdGUgaW1wbGVtZW50YXRpb25zLgorLy8KKy8vIEV4YW1wbGUgdXNhZ2U6CisvLworLy8gU2F5IHlvdSBoYXZlIGEgbWVzc2FnZSBkZWZpbmVkIGFzOgorLy8KKy8vICAgbWVzc2FnZSBGb28geworLy8gICAgIG9wdGlvbmFsIHN0cmluZyB0ZXh0ID0gMTsKKy8vICAgICByZXBlYXRlZCBpbnQzMiBudW1iZXJzID0gMjsKKy8vICAgfQorLy8KKy8vIFRoZW4sIGlmIHlvdSB1c2VkIHRoZSBwcm90b2NvbCBjb21waWxlciB0byBnZW5lcmF0ZSBhIGNsYXNzIGZyb20gdGhlIGFib3ZlCisvLyBkZWZpbml0aW9uLCB5b3UgY291bGQgdXNlIGl0IGxpa2Ugc286CisvLworLy8gICBzdHJpbmcgZGF0YTsgIC8vIFdpbGwgc3RvcmUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuCisvLworLy8gICB7CisvLyAgICAgLy8gQ3JlYXRlIGEgbWVzc2FnZSBhbmQgc2VyaWFsaXplIGl0LgorLy8gICAgIEZvbyBmb287CisvLyAgICAgZm9vLnNldF90ZXh0KCJIZWxsbyBXb3JsZCEiKTsKKy8vICAgICBmb28uYWRkX251bWJlcnMoMSk7CisvLyAgICAgZm9vLmFkZF9udW1iZXJzKDUpOworLy8gICAgIGZvby5hZGRfbnVtYmVycyg0Mik7CisvLworLy8gICAgIGZvby5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisvLyAgIH0KKy8vCisvLyAgIHsKKy8vICAgICAvLyBQYXJzZSB0aGUgc2VyaWFsaXplZCBtZXNzYWdlIGFuZCBjaGVjayB0aGF0IGl0IGNvbnRhaW5zIHRoZQorLy8gICAgIC8vIGNvcnJlY3QgZGF0YS4KKy8vICAgICBGb28gZm9vOworLy8gICAgIGZvby5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisvLworLy8gICAgIGFzc2VydChmb28udGV4dCgpID09ICJIZWxsbyBXb3JsZCEiKTsKKy8vICAgICBhc3NlcnQoZm9vLm51bWJlcnNfc2l6ZSgpID09IDMpOworLy8gICAgIGFzc2VydChmb28ubnVtYmVycygwKSA9PSAxKTsKKy8vICAgICBhc3NlcnQoZm9vLm51bWJlcnMoMSkgPT0gNSk7CisvLyAgICAgYXNzZXJ0KGZvby5udW1iZXJzKDIpID09IDQyKTsKKy8vICAgfQorLy8KKy8vICAgeworLy8gICAgIC8vIFNhbWUgYXMgdGhlIGxhc3QgYmxvY2ssIGJ1dCBkbyBpdCBkeW5hbWljYWxseSB2aWEgdGhlIE1lc3NhZ2UKKy8vICAgICAvLyByZWZsZWN0aW9uIGludGVyZmFjZS4KKy8vICAgICBNZXNzYWdlKiBmb28gPSBuZXcgRm9vOworLy8gICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBmb28tPkdldERlc2NyaXB0b3IoKTsKKy8vCisvLyAgICAgLy8gR2V0IHRoZSBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpZWxkcyB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCB2ZXJpZnkKKy8vICAgICAvLyB0aGVpciB0eXBlcy4KKy8vICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHRleHRfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInRleHQiKTsKKy8vICAgICBhc3NlcnQodGV4dF9maWVsZCAhPSBOVUxMKTsKKy8vICAgICBhc3NlcnQodGV4dF9maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpOworLy8gICAgIGFzc2VydCh0ZXh0X2ZpZWxkLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwpOworLy8gICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbnVtYmVyc19maWVsZCA9IGRlc2NyaXB0b3ItPgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRGaWVsZEJ5TmFtZSgibnVtYmVycyIpOworLy8gICAgIGFzc2VydChudW1iZXJzX2ZpZWxkICE9IE5VTEwpOworLy8gICAgIGFzc2VydChudW1iZXJzX2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyKTsKKy8vICAgICBhc3NlcnQobnVtYmVyc19maWVsZC0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKTsKKy8vCisvLyAgICAgLy8gUGFyc2UgdGhlIG1lc3NhZ2UuCisvLyAgICAgZm9vLT5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisvLworLy8gICAgIC8vIFVzZSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UgdG8gZXhhbWluZSB0aGUgY29udGVudHMuCisvLyAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGZvby0+R2V0UmVmbGVjdGlvbigpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRTdHJpbmcoZm9vLCB0ZXh0X2ZpZWxkKSA9PSAiSGVsbG8gV29ybGQhIik7CisvLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShmb28sIG51bWJlcnNfZmllbGQpID09IDMpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKGZvbywgbnVtYmVyc19maWVsZCwgMCkgPT0gMSk7CisvLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoZm9vLCBudW1iZXJzX2ZpZWxkLCAxKSA9PSA1KTsKKy8vICAgICBhc3NlcnQocmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihmb28sIG51bWJlcnNfZmllbGQsIDIpID09IDQyKTsKKy8vCisvLyAgICAgZGVsZXRlIGZvbzsKKy8vICAgfQorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9IX18KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZmRlZiBfX0RFQ0NYWAorLy8gSFAgQysrJ3MgaW9zZndkIGRvZXNuJ3Qgd29yay4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbHNlCisjaW5jbHVkZSA8aW9zZndkPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgTWVzc2FnZTsKK2NsYXNzIFJlZmxlY3Rpb247CitjbGFzcyBNZXNzYWdlRmFjdG9yeTsKKworLy8gRGVmaW5lZCBpbiBvdGhlciBmaWxlcy4KK2NsYXNzIFVua25vd25GaWVsZFNldDsgICAgICAgICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCituYW1lc3BhY2UgaW8geworICBjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOyAgIC8vIHplcm9fY29weV9zdHJlYW0uaAorICBjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsgIC8vIHplcm9fY29weV9zdHJlYW0uaAorICBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCisgIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOyAgICAgLy8gY29kZWRfc3RyZWFtLmgKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgUmVwZWF0ZWRGaWVsZDsgICAgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGQ7ICAvLyByZXBlYXRlZF9maWVsZC5oCisKKy8vIEEgY29udGFpbmVyIHRvIGhvbGQgbWVzc2FnZSBtZXRhZGF0YS4KK3N0cnVjdCBNZXRhZGF0YSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb247Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHByb3RvY29sIG1lc3NhZ2VzLgorLy8KKy8vIFNlZSBhbHNvIE1lc3NhZ2VMaXRlLCB3aGljaCBjb250YWlucyBtb3N0IGV2ZXJ5LWRheSBvcGVyYXRpb25zLiAgTWVzc2FnZQorLy8gYWRkcyBkZXNjcmlwdG9ycyBhbmQgcmVmbGVjdGlvbiBvbiB0b3Agb2YgdGhhdC4KKy8vCisvLyBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHRoYXQgYXJlIHZpcnR1YWwgYnV0IG5vdCBwdXJlLXZpcnR1YWwgaGF2ZQorLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgYmFzZWQgb24gcmVmbGVjdGlvbi4gIE1lc3NhZ2UgY2xhc3NlcyB3aGljaCBhcmUKKy8vIG9wdGltaXplZCBmb3Igc3BlZWQgd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoZXNlIHdpdGggZmFzdGVyIGltcGxlbWVudGF0aW9ucywKKy8vIGJ1dCBjbGFzc2VzIG9wdGltaXplZCBmb3IgY29kZSBzaXplIG1heSBiZSBoYXBweSB3aXRoIGtlZXBpbmcgdGhlbS4gIFNlZQorLy8gdGhlIG9wdGltaXplX2ZvciBvcHRpb24gaW4gZGVzY3JpcHRvci5wcm90by4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXNzYWdlIDogcHVibGljIE1lc3NhZ2VMaXRlIHsKKyBwdWJsaWM6CisgIGlubGluZSBNZXNzYWdlKCkge30KKyAgdmlydHVhbCB+TWVzc2FnZSgpOworCisgIC8vIEJhc2ljIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBPd25lcnNoaXAgaXMgcGFzc2VkIHRvIHRoZQorICAvLyBjYWxsZXIuICAoVGhpcyBpcyBhbHNvIGRlZmluZWQgaW4gTWVzc2FnZUxpdGUsIGJ1dCBpcyBkZWZpbmVkIGFnYWluIGhlcmUKKyAgLy8gZm9yIHJldHVybi10eXBlIGNvdmFyaWFuY2UuKQorICB2aXJ0dWFsIE1lc3NhZ2UqIE5ldygpIGNvbnN0ID0gMDsKKworICAvLyBNYWtlIHRoaXMgbWVzc2FnZSBpbnRvIGEgY29weSBvZiB0aGUgZ2l2ZW4gbWVzc2FnZS4gIFRoZSBnaXZlbiBtZXNzYWdlCisgIC8vIG11c3QgaGF2ZSB0aGUgc2FtZSBkZXNjcmlwdG9yLCBidXQgbmVlZCBub3QgbmVjZXNzYXJpbHkgYmUgdGhlIHNhbWUgY2xhc3MuCisgIC8vIEJ5IGRlZmF1bHQgdGhpcyBpcyBqdXN0IGltcGxlbWVudGVkIGFzICJDbGVhcigpOyBNZXJnZUZyb20oZnJvbSk7Ii4KKyAgdmlydHVhbCB2b2lkIENvcHlGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pOworCisgIC8vIE1lcmdlIHRoZSBmaWVsZHMgZnJvbSB0aGUgZ2l2ZW4gbWVzc2FnZSBpbnRvIHRoaXMgbWVzc2FnZS4gIFNpbmd1bGFyCisgIC8vIGZpZWxkcyB3aWxsIGJlIG92ZXJ3cml0dGVuLCBleGNlcHQgZm9yIGVtYmVkZGVkIG1lc3NhZ2VzIHdoaWNoIHdpbGwKKyAgLy8gYmUgbWVyZ2VkLiAgUmVwZWF0ZWQgZmllbGRzIHdpbGwgYmUgY29uY2F0ZW5hdGVkLiAgVGhlIGdpdmVuIG1lc3NhZ2UKKyAgLy8gbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgbWVzc2FnZSAoaS5lLiB0aGUgZXhhY3Qgc2FtZSBjbGFzcykuCisgIHZpcnR1YWwgdm9pZCBNZXJnZUZyb20oY29uc3QgTWVzc2FnZSYgZnJvbSk7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBJc0luaXRpYWxpemVkKCkgcmV0dXJucyB0cnVlLiAgR09PR0xFX0NIRUNLLWZhaWxzIG90aGVyd2lzZSwgd2l0aAorICAvLyBhIG5pY2UgZXJyb3IgbWVzc2FnZS4KKyAgdm9pZCBDaGVja0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgLy8gU2xvd2x5IGJ1aWxkIGEgbGlzdCBvZiBhbGwgcmVxdWlyZWQgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQuCisgIC8vIFRoaXMgaXMgbXVjaCwgbXVjaCBzbG93ZXIgdGhhbiBJc0luaXRpYWxpemVkKCkgYXMgaXQgaXMgaW1wbGVtZW50ZWQKKyAgLy8gcHVyZWx5IHZpYSByZWZsZWN0aW9uLiAgR2VuZXJhbGx5LCB5b3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgdW5sZXNzIHlvdQorICAvLyBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0IGFuIGVycm9yIGV4aXN0cyBieSBjYWxsaW5nIElzSW5pdGlhbGl6ZWQoKS4KKyAgdm9pZCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnModmVjdG9yPHN0cmluZz4qIGVycm9ycykgY29uc3Q7CisKKyAgLy8gTGlrZSBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMsIGJ1dCBqb2lucyBhbGwgdGhlIHN0cmluZ3MsIGRlbGltaXRlZCBieQorICAvLyBjb21tYXMsIGFuZCByZXR1cm5zIHRoZW0uCisgIHN0cmluZyBJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gQ2xlYXJzIGFsbCB1bmtub3duIGZpZWxkcyBmcm9tIHRoaXMgbWVzc2FnZSBhbmQgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzLgorICAvLyBOb3JtYWxseSwgaWYgdW5rbm93biB0YWcgbnVtYmVycyBhcmUgZW5jb3VudGVyZWQgd2hlbiBwYXJzaW5nIGEgbWVzc2FnZSwKKyAgLy8gdGhlIHRhZyBhbmQgdmFsdWUgYXJlIHN0b3JlZCBpbiB0aGUgbWVzc2FnZSdzIFVua25vd25GaWVsZFNldCBhbmQKKyAgLy8gdGhlbiB3cml0dGVuIGJhY2sgb3V0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc2VyaWFsaXplZC4gIFRoaXMgYWxsb3dzIHNlcnZlcnMKKyAgLy8gd2hpY2ggc2ltcGx5IHJvdXRlIG1lc3NhZ2VzIHRvIG90aGVyIHNlcnZlcnMgdG8gcGFzcyB0aHJvdWdoIG1lc3NhZ2VzCisgIC8vIHRoYXQgaGF2ZSBuZXcgZmllbGQgZGVmaW5pdGlvbnMgd2hpY2ggdGhleSBkb24ndCB5ZXQga25vdyBhYm91dC4gIEhvd2V2ZXIsCisgIC8vIHRoaXMgYmVoYXZpb3IgY2FuIGhhdmUgc2VjdXJpdHkgaW1wbGljYXRpb25zLiAgVG8gYXZvaWQgaXQsIGNhbGwgdGhpcworICAvLyBtZXRob2QgYWZ0ZXIgcGFyc2luZy4KKyAgLy8KKyAgLy8gU2VlIFJlZmxlY3Rpb246OkdldFVua25vd25GaWVsZHMoKSBmb3IgbW9yZSBvbiB1bmtub3duIGZpZWxkcy4KKyAgdmlydHVhbCB2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKCk7CisKKyAgLy8gQ29tcHV0ZXMgKGFuIGVzdGltYXRlIG9mKSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSB1c2VkIGZvcgorICAvLyBzdG9yaW5nIHRoZSBtZXNzYWdlIGluIG1lbW9yeS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHRoZQorICAvLyBSZWZsZWN0aW9uIG9iamVjdCdzIFNwYWNlVXNlZCgpIG1ldGhvZC4KKyAgdmlydHVhbCBpbnQgU3BhY2VVc2VkKCkgY29uc3Q7CisKKyAgLy8gRGVidWdnaW5nICYgVGVzdGluZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBHZW5lcmF0ZXMgYSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoaXMgbWVzc2FnZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyAgLy8gYW5kIG90aGVyIHB1cnBvc2VzLgorICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKKyAgLy8gTGlrZSBEZWJ1Z1N0cmluZygpLCBidXQgd2l0aCBsZXNzIHdoaXRlc3BhY2UuCisgIHN0cmluZyBTaG9ydERlYnVnU3RyaW5nKCkgY29uc3Q7CisgIC8vIExpa2UgRGVidWdTdHJpbmcoKSwgYnV0IGRvIG5vdCBlc2NhcGUgVVRGLTggYnl0ZSBzZXF1ZW5jZXMuCisgIHN0cmluZyBVdGY4RGVidWdTdHJpbmcoKSBjb25zdDsKKyAgLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZnVsIGluIEdEQi4gIFByaW50cyBEZWJ1Z1N0cmluZygpIHRvIHN0ZG91dC4KKyAgdm9pZCBQcmludERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gSGVhdnkgSS9PIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQWRkaXRpb25hbCBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uIG1ldGhvZHMgbm90IGltcGxlbWVudGVkIGJ5CisgIC8vIE1lc3NhZ2VMaXRlIGJlY2F1c2UgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgbGl0ZSBsaWJyYXJ5LgorCisgIC8vIFBhcnNlIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IuICBJZiBzdWNjZXNzZnVsLCB0aGUgZW50aXJlCisgIC8vIGlucHV0IHdpbGwgYmUgY29uc3VtZWQuCisgIGJvb2wgUGFyc2VGcm9tRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcik7CisgIC8vIExpa2UgUGFyc2VGcm9tRmlsZURlc2NyaXB0b3IoKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpOworICAvLyBQYXJzZSBhIHByb3RvY29sIGJ1ZmZlciBmcm9tIGEgQysrIGlzdHJlYW0uICBJZiBzdWNjZXNzZnVsLCB0aGUgZW50aXJlCisgIC8vIGlucHV0IHdpbGwgYmUgY29uc3VtZWQuCisgIGJvb2wgUGFyc2VGcm9tSXN0cmVhbShpc3RyZWFtKiBpbnB1dCk7CisgIC8vIExpa2UgUGFyc2VGcm9tSXN0cmVhbSgpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZSBtaXNzaW5nCisgIC8vIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBQYXJzZVBhcnRpYWxGcm9tSXN0cmVhbShpc3RyZWFtKiBpbnB1dCk7CisKKyAgLy8gU2VyaWFsaXplIHRoZSBtZXNzYWdlIGFuZCB3cml0ZSBpdCB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAgQWxsCisgIC8vIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIGNvbnN0OworICAvLyBMaWtlIFNlcmlhbGl6ZVRvRmlsZURlc2NyaXB0b3IoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgLy8gU2VyaWFsaXplIHRoZSBtZXNzYWdlIGFuZCB3cml0ZSBpdCB0byB0aGUgZ2l2ZW4gQysrIG9zdHJlYW0uICBBbGwKKyAgLy8gcmVxdWlyZWQgZmllbGRzIG11c3QgYmUgc2V0LgorICBib29sIFNlcmlhbGl6ZVRvT3N0cmVhbShvc3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAvLyBMaWtlIFNlcmlhbGl6ZVRvT3N0cmVhbSgpLCBidXQgYWxsb3dzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICBib29sIFNlcmlhbGl6ZVBhcnRpYWxUb09zdHJlYW0ob3N0cmVhbSogb3V0cHV0KSBjb25zdDsKKworCisgIC8vIFJlZmxlY3Rpb24tYmFzZWQgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIHB1cmUtdmlydHVhbCBpbiBNZXNzYWdlTGl0ZSwgYnV0IE1lc3NhZ2UgcHJvdmlkZXMKKyAgLy8gcmVmbGVjdGlvbi1iYXNlZCBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4KKworICB2aXJ0dWFsIHN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKTsKKyAgdmlydHVhbCBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXIpOworICB2aXJ0dWFsIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZpcnR1YWwgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gVGhpcyBpcyBjYWxsZWQgb25seSBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBCeXRlU2l6ZSgpLCB0bworICAvLyB1cGRhdGUgdGhlIGNhY2hlZCBzaXplLiAgSWYgeW91IG92ZXJyaWRlIEJ5dGVTaXplKCksIHlvdSBkbyBub3QgbmVlZAorICAvLyB0byBvdmVycmlkZSB0aGlzLiAgSWYgeW91IGRvIG5vdCBvdmVycmlkZSBCeXRlU2l6ZSgpLCB5b3UgTVVTVCBvdmVycmlkZQorICAvLyB0aGlzOyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGNyYXNoLgorICAvLworICAvLyBUaGUgbWV0aG9kIGlzIHByaXZhdGUgYmVjYXVzZSBzdWJjbGFzc2VzIHNob3VsZCBuZXZlciBjYWxsIGl0OyBvbmx5CisgIC8vIG92ZXJyaWRlIGl0LiAgWWVzLCBDKysgbGV0cyB5b3UgZG8gdGhhdC4gIENyYXp5LCBodWg/CisgIHZpcnR1YWwgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKworIHB1YmxpYzoKKworICAvLyBJbnRyb3NwZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFR5cGVkZWYgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICB0eXBlZGVmIGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24gUmVmbGVjdGlvbjsKKworICAvLyBHZXQgYSBEZXNjcmlwdG9yIGZvciB0aGlzIG1lc3NhZ2UncyB0eXBlLiAgVGhpcyBkZXNjcmliZXMgd2hhdAorICAvLyBmaWVsZHMgdGhlIG1lc3NhZ2UgY29udGFpbnMsIHRoZSB0eXBlcyBvZiB0aG9zZSBmaWVsZHMsIGV0Yy4KKyAgY29uc3QgRGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIEdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsgfQorCisgIC8vIEdldCB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2UgZm9yIHRoaXMgTWVzc2FnZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAgLy8gcmVhZCBhbmQgbW9kaWZ5IHRoZSBmaWVsZHMgb2YgdGhlIE1lc3NhZ2UgZHluYW1pY2FsbHkgKGluIG90aGVyIHdvcmRzLAorICAvLyB3aXRob3V0IGtub3dpbmcgdGhlIG1lc3NhZ2UgdHlwZSBhdCBjb21waWxlIHRpbWUpLiAgVGhpcyBvYmplY3QgcmVtYWlucworICAvLyBwcm9wZXJ0eSBvZiB0aGUgTWVzc2FnZS4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgcmVtYWlucyB2aXJ0dWFsIGluIGNhc2UgYSBzdWJjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQKKyAgLy8gcmVmbGVjdGlvbiBhbmQgd2FudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisgIHZpcnR1YWwgY29uc3QgUmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIEdldCBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBtZXRhZGF0YSBmb3IgdGhlIE1lc3NhZ2UuIE1vc3Qgc3ViY2xhc3NlcyBvbmx5CisgIC8vIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLCByYXRoZXIgdGhhbiB0aGUgR2V0RGVzY3JpcHRvcigpIGFuZAorICAvLyBHZXRSZWZsZWN0aW9uKCkgd3JhcHBlcnMuCisgIHZpcnR1YWwgTWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCAgPSAwOworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZSk7Cit9OworCisvLyBUaGlzIGludGVyZmFjZSBjb250YWlucyBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgYWNjZXNzCisvLyBhbmQgbW9kaWZ5IHRoZSBmaWVsZHMgb2YgYSBwcm90b2NvbCBtZXNzYWdlLiAgVGhlaXIgc2VtYW50aWNzIGFyZQorLy8gc2ltaWxhciB0byB0aGUgYWNjZXNzb3JzIHRoZSBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMuCisvLworLy8gVG8gZ2V0IHRoZSBSZWZsZWN0aW9uIGZvciBhIGdpdmVuIE1lc3NhZ2UsIGNhbGwgTWVzc2FnZTo6R2V0UmVmbGVjdGlvbigpLgorLy8KKy8vIFRoaXMgaW50ZXJmYWNlIGlzIHNlcGFyYXRlIGZyb20gTWVzc2FnZSBvbmx5IGZvciBlZmZpY2llbmN5IHJlYXNvbnM7CisvLyB0aGUgdmFzdCBtYWpvcml0eSBvZiBpbXBsZW1lbnRhdGlvbnMgb2YgTWVzc2FnZSB3aWxsIHNoYXJlIHRoZSBzYW1lCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBSZWZsZWN0aW9uIChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiwKKy8vIGRlZmluZWQgaW4gZ2VuZXJhdGVkX21lc3NhZ2UuaCksIGFuZCBhbGwgTWVzc2FnZXMgb2YgYSBwYXJ0aWN1bGFyIGNsYXNzCisvLyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgUmVmbGVjdGlvbiBvYmplY3QgKHRob3VnaCB5b3Ugc2hvdWxkIG5vdCByZWx5IG9uCisvLyB0aGUgbGF0dGVyIGZhY3QpLgorLy8KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdGhhdCB0aGVzZSBtZXRob2RzIGNhbiBiZSB1c2VkIGluY29ycmVjdGx5LiAgRm9yCisvLyBleGFtcGxlLCBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHdpbGwgbGVhZCB0byB1bmRlZmluZWQKKy8vIHJlc3VsdHMgKHByb2JhYmx5IGFzc2VydGlvbiBmYWlsdXJlcyk6CisvLyAtIFRoZSBGaWVsZERlc2NyaXB0b3IgaXMgbm90IGEgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHR5cGUuCisvLyAtIFRoZSBtZXRob2QgY2FsbGVkIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpZWxkJ3MgdHlwZS4gIEZvcgorLy8gICBlYWNoIGZpZWxkIHR5cGUgaW4gRmllbGREZXNjcmlwdG9yOjpUWVBFXyosIHRoZXJlIGlzIG9ubHkgb25lCisvLyAgIEdldCooKSBtZXRob2QsIG9uZSBTZXQqKCkgbWV0aG9kLCBhbmQgb25lIEFkZCooKSBtZXRob2QgdGhhdCBpcworLy8gICB2YWxpZCBmb3IgdGhhdCB0eXBlLiAgSXQgc2hvdWxkIGJlIG9idmlvdXMgd2hpY2ggKGV4Y2VwdCBtYXliZQorLy8gICBmb3IgVFlQRV9CWVRFUywgd2hpY2ggYXJlIHJlcHJlc2VudGVkIHVzaW5nIHN0cmluZ3MgaW4gQysrKS4KKy8vIC0gQSBHZXQqKCkgb3IgU2V0KigpIG1ldGhvZCBmb3Igc2luZ3VsYXIgZmllbGRzIGlzIGNhbGxlZCBvbiBhIHJlcGVhdGVkCisvLyAgIGZpZWxkLgorLy8gLSBHZXRSZXBlYXRlZCooKSwgU2V0UmVwZWF0ZWQqKCksIG9yIEFkZCooKSBpcyBjYWxsZWQgb24gYSBub24tcmVwZWF0ZWQKKy8vICAgZmllbGQuCisvLyAtIFRoZSBNZXNzYWdlIG9iamVjdCBwYXNzZWQgdG8gYW55IG1ldGhvZCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGUgZm9yCisvLyAgIHRoaXMgUmVmbGVjdGlvbiBvYmplY3QgKGkuZS4gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCkgIT0gcmVmbGVjdGlvbikuCisvLworLy8gWW91IG1pZ2h0IHdvbmRlciB3aHkgdGhlcmUgaXMgbm90IGFueSBhYnN0cmFjdCByZXByZXNlbnRhdGlvbiBmb3IgYSBmaWVsZAorLy8gb2YgYXJiaXRyYXJ5IHR5cGUuICBFLmcuLCB3aHkgaXNuJ3QgdGhlcmUganVzdCBhICJHZXRGaWVsZCgpIiBtZXRob2QgdGhhdAorLy8gcmV0dXJucyAiY29uc3QgRmllbGQmIiwgd2hlcmUgIkZpZWxkIiBpcyBzb21lIGNsYXNzIHdpdGggYWNjZXNzb3JzIGxpa2UKKy8vICJHZXRJbnQzMlZhbHVlKCkiLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBzb21lb25lIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoCisvLyBhbGxvY2F0aW5nIHRoZXNlIEZpZWxkIG9iamVjdHMuICBGb3IgZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3NlcywgaGF2aW5nIHRvCisvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gYWRkaXRpb25hbCBvYmplY3QgdG8gd3JhcCBldmVyeSBmaWVsZCB3b3VsZCBhdCBsZWFzdAorLy8gZG91YmxlIHRoZSBtZXNzYWdlJ3MgbWVtb3J5IGZvb3RwcmludCwgcHJvYmFibHkgd29yc2UuICBBbGxvY2F0aW5nIHRoZQorLy8gb2JqZWN0cyBvbi1kZW1hbmQsIG9uIHRoZSBvdGhlciBoYW5kLCB3b3VsZCBiZSBleHBlbnNpdmUgYW5kIHByb25lIHRvCisvLyBtZW1vcnkgbGVha3MuICBTbywgaW5zdGVhZCB3ZSBlbmRlZCB1cCB3aXRoIHRoaXMgZmxhdCBpbnRlcmZhY2UuCisvLworLy8gVE9ETyhrZW50b24pOiAgQ3JlYXRlIGEgdXRpbGl0eSBjbGFzcyB3aGljaCBjYWxsZXJzIGNhbiB1c2UgdG8gcmVhZCBhbmQKKy8vICAgd3JpdGUgZmllbGRzIGZyb20gYSBSZWZsZWN0aW9uIHdpdGhvdXQgcGF5aW5nIGF0dGVudGlvbiB0byB0aGUgdHlwZS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBSZWZsZWN0aW9uIHsKKyBwdWJsaWM6CisgIGlubGluZSBSZWZsZWN0aW9uKCkge30KKyAgdmlydHVhbCB+UmVmbGVjdGlvbigpOworCisgIC8vIEdldCB0aGUgVW5rbm93bkZpZWxkU2V0IGZvciB0aGUgbWVzc2FnZS4gIFRoaXMgY29udGFpbnMgZmllbGRzIHdoaWNoCisgIC8vIHdlcmUgc2VlbiB3aGVuIHRoZSBNZXNzYWdlIHdhcyBwYXJzZWQgYnV0IHdlcmUgbm90IHJlY29nbml6ZWQgYWNjb3JkaW5nCisgIC8vIHRvIHRoZSBNZXNzYWdlJ3MgZGVmaW5pdGlvbi4KKyAgdmlydHVhbCBjb25zdCBVbmtub3duRmllbGRTZXQmIEdldFVua25vd25GaWVsZHMoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCA9IDA7CisgIC8vIEdldCBhIG11dGFibGUgcG9pbnRlciB0byB0aGUgVW5rbm93bkZpZWxkU2V0IGZvciB0aGUgbWVzc2FnZS4gIFRoaXMKKyAgLy8gY29udGFpbnMgZmllbGRzIHdoaWNoIHdlcmUgc2VlbiB3aGVuIHRoZSBNZXNzYWdlIHdhcyBwYXJzZWQgYnV0IHdlcmUgbm90CisgIC8vIHJlY29nbml6ZWQgYWNjb3JkaW5nIHRvIHRoZSBNZXNzYWdlJ3MgZGVmaW5pdGlvbi4KKyAgdmlydHVhbCBVbmtub3duRmllbGRTZXQqIE11dGFibGVVbmtub3duRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0ID0gMDsKKworICAvLyBFc3RpbWF0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBtZXNzYWdlIG9iamVjdC4KKyAgdmlydHVhbCBpbnQgU3BhY2VVc2VkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0ID0gMDsKKworICAvLyBDaGVjayBpZiB0aGUgZ2l2ZW4gbm9uLXJlcGVhdGVkIGZpZWxkIGlzIHNldC4KKyAgdmlydHVhbCBib29sIEhhc0ZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4KKyAgdmlydHVhbCBpbnQgRmllbGRTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisKKyAgLy8gQ2xlYXIgdGhlIHZhbHVlIG9mIGEgZmllbGQsIHNvIHRoYXQgSGFzRmllbGQoKSByZXR1cm5zIGZhbHNlIG9yCisgIC8vIEZpZWxkU2l6ZSgpIHJldHVybnMgemVyby4KKyAgdmlydHVhbCB2b2lkIENsZWFyRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworCisgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLgorICAvLyBXZSBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHJlbW92ZSBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBsYXN0CisgIC8vIGJlY2F1c2UgaXQgaW52aXRlcyBpbmVmZmljaWVudCB1c2UsIHN1Y2ggYXMgTyhuXjIpIGZpbHRlcmluZyBsb29wcworICAvLyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gTyhuKS4gIElmIHlvdSB3YW50IHRvIHJlbW92ZSBhbiBlbGVtZW50IG90aGVyCisgIC8vIHRoYW4gdGhlIGxhc3QsIHRoZSBiZXN0IHdheSB0byBkbyBpdCBpcyB0byByZS1hcnJhbmdlIHRoZSBlbGVtZW50cworICAvLyAodXNpbmcgU3dhcCgpKSBzbyB0aGF0IHRoZSBvbmUgeW91IHdhbnQgcmVtb3ZlZCBpcyBhdCB0aGUgZW5kLCB0aGVuCisgIC8vIGNhbGwgUmVtb3ZlTGFzdCgpLgorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlTGFzdChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQsIGFuZCByZXR1cm5zIHRoZQorICAvLyBwb2ludGVyIHRvIHRoZSBjYWxsZXIuICBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBwb2ludGVyLgorICB2aXJ0dWFsIE1lc3NhZ2UqIFJlbGVhc2VMYXN0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworCisgIC8vIFN3YXAgdGhlIGNvbXBsZXRlIGNvbnRlbnRzIG9mIHR3byBtZXNzYWdlcy4KKyAgdmlydHVhbCB2b2lkIFN3YXAoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyKSBjb25zdCA9IDA7CisKKyAgLy8gU3dhcCB0d28gZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4KKyAgdmlydHVhbCB2b2lkIFN3YXBFbGVtZW50cyhNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyKSBjb25zdCA9IDA7CisKKyAgLy8gTGlzdCBhbGwgZmllbGRzIG9mIHRoZSBtZXNzYWdlIHdoaWNoIGFyZSBjdXJyZW50bHkgc2V0LiAgVGhpcyBpbmNsdWRlcworICAvLyBleHRlbnNpb25zLiAgU2luZ3VsYXIgZmllbGRzIHdpbGwgb25seSBiZSBsaXN0ZWQgaWYgSGFzRmllbGQoZmllbGQpIHdvdWxkCisgIC8vIHJldHVybiB0cnVlIGFuZCByZXBlYXRlZCBmaWVsZHMgd2lsbCBvbmx5IGJlIGxpc3RlZCBpZiBGaWVsZFNpemUoZmllbGQpCisgIC8vIHdvdWxkIHJldHVybiBub24temVyby4gIEZpZWxkcyAoYm90aCBub3JtYWwgZmllbGRzIGFuZCBleHRlbnNpb24gZmllbGRzKQorICAvLyB3aWxsIGJlIGxpc3RlZCBvcmRlcmVkIGJ5IGZpZWxkIG51bWJlci4KKyAgdmlydHVhbCB2b2lkIExpc3RGaWVsZHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0ID0gMDsKKworICAvLyBTaW5ndWxhciBmaWVsZCBnZXR0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBnZXQgdGhlIHZhbHVlIG9mIGEgbm9uLXJlcGVhdGVkIGZpZWxkLiAgVGhleSByZXR1cm4gdGhlIGRlZmF1bHQKKyAgLy8gdmFsdWUgZm9yIGZpZWxkcyB0aGF0IGFyZW4ndCBzZXQuCisKKyAgdmlydHVhbCBpbnQzMiAgR2V0SW50MzIgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50NjQgIEdldEludDY0IChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMiBHZXRVSW50MzIoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjQgR2V0VUludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZmxvYXQgIEdldEZsb2F0IChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGRvdWJsZSBHZXREb3VibGUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sICAgR2V0Qm9vbCAgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RyaW5nIEdldFN0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdldEVudW0oCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIC8vIFNlZSBNdXRhYmxlTWVzc2FnZSgpIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgImZhY3RvcnkiIHBhcmFtZXRlci4KKyAgdmlydHVhbCBjb25zdCBNZXNzYWdlJiBHZXRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdCA9IDA7CisKKyAgLy8gR2V0IGEgc3RyaW5nIHZhbHVlIHdpdGhvdXQgY29weWluZywgaWYgcG9zc2libGUuCisgIC8vCisgIC8vIEdldFN0cmluZygpIG5lY2Vzc2FyaWx5IHJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcuICBUaGlzIGNhbiBiZQorICAvLyBpbmVmZmljaWVudCB3aGVuIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSBzdG9yZWQgaW4gYSBzdHJpbmcgb2JqZWN0IGluIHRoZQorICAvLyB1bmRlcmx5aW5nIG1lc3NhZ2UuICBHZXRTdHJpbmdSZWZlcmVuY2UoKSB3aWxsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUKKyAgLy8gdW5kZXJseWluZyBzdHJpbmcgaW4gdGhpcyBjYXNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGNvcHkgdGhlIHN0cmluZyBpbnRvCisgIC8vICpzY3JhdGNoIGFuZCByZXR1cm4gdGhhdC4KKyAgLy8KKyAgLy8gTm90ZTogIEl0IGlzIHBlcmZlY3RseSByZWFzb25hYmxlIGFuZCB1c2VmdWwgdG8gd3JpdGUgY29kZSBsaWtlOgorICAvLyAgICAgc3RyID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKGZpZWxkLCAmc3RyKTsKKyAgLy8gICBUaGlzIGxpbmUgd291bGQgZW5zdXJlIHRoYXQgb25seSBvbmUgY29weSBvZiB0aGUgc3RyaW5nIGlzIG1hZGUKKyAgLy8gICByZWdhcmRsZXNzIG9mIHRoZSBmaWVsZCdzIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uICBXaGVuIGluaXRpYWxpemluZworICAvLyAgIGEgbmV3bHktY29uc3RydWN0ZWQgc3RyaW5nLCB0aG91Z2gsIGl0J3MganVzdCBhcyBmYXN0IGFuZCBtb3JlIHJlYWRhYmxlCisgIC8vICAgdG8gdXNlIGNvZGUgbGlrZToKKyAgLy8gICAgIHN0cmluZyBzdHIgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoZmllbGQpOworICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0U3RyaW5nUmVmZXJlbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHNjcmF0Y2gpIGNvbnN0ID0gMDsKKworCisgIC8vIFNpbmd1bGFyIGZpZWxkIG11dGF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIG11dGF0ZSB0aGUgdmFsdWUgb2YgYSBub24tcmVwZWF0ZWQgZmllbGQuCisKKyAgdmlydHVhbCB2b2lkIFNldEludDMyIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDMyICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0SW50NjQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50NjQgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRVSW50MzIoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50MzIgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQ2NCB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0RmxvYXQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgZmxvYXQgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXREb3VibGUoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBkb3VibGUgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEJvb2wgIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0U3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRFbnVtICAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCA9IDA7CisgIC8vIEdldCBhIG11dGFibGUgcG9pbnRlciB0byBhIGZpZWxkIHdpdGggYSBtZXNzYWdlIHR5cGUuICBJZiBhIE1lc3NhZ2VGYWN0b3J5CisgIC8vIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY29uc3RydWN0IGluc3RhbmNlcyBvZiB0aGUgc3ViLW1lc3NhZ2U7CisgIC8vIG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgZmFjdG9yeSBpcyB1c2VkLiAgSWYgdGhlIGZpZWxkIGlzIGFuIGV4dGVuc2lvbiB0aGF0CisgIC8vIGRvZXMgbm90IGxpdmUgaW4gdGhlIHNhbWUgcG9vbCBhcyB0aGUgY29udGFpbmluZyBtZXNzYWdlJ3MgZGVzY3JpcHRvciAoZS5nLgorICAvLyBpdCBsaXZlcyBpbiBhbiBvdmVybGF5IHBvb2wpLCB0aGVuIGEgTWVzc2FnZUZhY3RvcnkgbXVzdCBiZSBwcm92aWRlZC4KKyAgLy8gSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IHRoYXQgbWVhbnQsIHRoZW4geW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gd29ycnkKKyAgLy8gYWJvdXQgaXQgKGRvbid0IHByb3ZpZGUgYSBNZXNzYWdlRmFjdG9yeSkuICBXQVJOSU5HOiAgSWYgdGhlCisgIC8vIEZpZWxkRGVzY3JpcHRvciBpcyBmb3IgYSBjb21waWxlZC1pbiBleHRlbnNpb24sIHRoZW4KKyAgLy8gZmFjdG9yeS0+R2V0UHJvdG90eXBlKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSBNVVNUIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgLy8gY29tcGlsZWQtaW4gY2xhc3MgZm9yIHRoaXMgdHlwZSwgTk9UIER5bmFtaWNNZXNzYWdlLgorICB2aXJ0dWFsIE1lc3NhZ2UqIE11dGFibGVNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0ID0gMDsKKyAgLy8gUmVsZWFzZXMgdGhlIG1lc3NhZ2Ugc3BlY2lmaWVkIGJ5ICdmaWVsZCcgYW5kIHJldHVybnMgdGhlIHBvaW50ZXIsCisgIC8vIFJlbGVhc2VNZXNzYWdlKCkgd2lsbCByZXR1cm4gdGhlIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IGlmIGl0IGV4aXN0cy4KKyAgLy8gT3RoZXJ3aXNlLCBpdCBtYXkgb3IgbWF5IG5vdCByZXR1cm4gTlVMTC4gIEluIGFueSBjYXNlLCBpZiB0aGUgcmV0dXJuIHZhbHVlCisgIC8vIGlzIG5vbi1OVUxMLCB0aGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlci4KKyAgLy8gSWYgdGhlIGZpZWxkIGV4aXN0ZWQgKEhhc0ZpZWxkKCkgaXMgdHJ1ZSksIHRoZW4gdGhlIHJldHVybmVkIHBvaW50ZXIgd2lsbAorICAvLyBiZSB0aGUgc2FtZSBhcyB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBNdXRhYmxlTWVzc2FnZSgpLgorICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQ2xlYXJGaWVsZCgpLgorICB2aXJ0dWFsIE1lc3NhZ2UqIFJlbGVhc2VNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0ID0gMDsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkIGdldHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIGdldCB0aGUgdmFsdWUgb2Ygb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZC4KKworICB2aXJ0dWFsIGludDMyICBHZXRSZXBlYXRlZEludDMyIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQ2NCAgR2V0UmVwZWF0ZWRJbnQ2NCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyIEdldFJlcGVhdGVkVUludDMyKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NCBHZXRSZXBlYXRlZFVJbnQ2NChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBmbG9hdCAgR2V0UmVwZWF0ZWRGbG9hdCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgICBHZXRSZXBlYXRlZEJvb2wgIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0UmVwZWF0ZWRFbnVtKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UmIEdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKworICAvLyBTZWUgR2V0U3RyaW5nUmVmZXJlbmNlKCksIGFib3ZlLgorICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgaW50IGluZGV4LCBzdHJpbmcqIHNjcmF0Y2gpIGNvbnN0ID0gMDsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkIG11dGF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIG11dGF0ZSB0aGUgdmFsdWUgb2Ygb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZC4KKworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRJbnQzMiAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludDMyICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRJbnQ2NCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludDY0ICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRVSW50MzIoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIHVpbnQzMiB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRVSW50NjQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIHVpbnQ2NCB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRGbG9hdCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGZsb2F0ICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWREb3VibGUoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRCb29sICAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGJvb2wgICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFJlcGVhdGVkRW51bShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgPSAwOworICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkIHdpdGggYSBtZXNzYWdlCisgIC8vIHR5cGUuCisgIHZpcnR1YWwgTWVzc2FnZSogTXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOworCisKKyAgLy8gUmVwZWF0ZWQgZmllbGQgYWRkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgYWRkIGFuIGVsZW1lbnQgdG8gYSByZXBlYXRlZCBmaWVsZC4KKworICB2aXJ0dWFsIHZvaWQgQWRkSW50MzIgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50MzIgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBBZGRJbnQ2NCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQ2NCAgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQzMiB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgQWRkVUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgdWludDY0IHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBBZGRGbG9hdCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBmbG9hdCAgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgQWRkQm9vbCAgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCAgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBBZGRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZEVudW0gIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0ID0gMDsKKyAgLy8gU2VlIE11dGFibGVNZXNzYWdlKCkgZm9yIGNvbW1lbnRzIG9uIHRoZSAiZmFjdG9yeSIgcGFyYW1ldGVyLgorICB2aXJ0dWFsIE1lc3NhZ2UqIEFkZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0ID0gMDsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkIGFjY2Vzc29ycyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGUgbWV0aG9kcyBhYm92ZSwgZS5nLiBHZXRSZXBlYXRlZEludDMyKG1zZywgZmQsIGluZGV4KSwgcHJvdmlkZSBzaW5ndWxhcgorICAvLyBhY2Nlc3MgdG8gdGhlIGRhdGEgaW4gYSBSZXBlYXRlZEZpZWxkLiAgVGhlIG1ldGhvZHMgYmVsb3cgcHJvdmlkZSBhZ2dyZWdhdGUKKyAgLy8gYWNjZXNzIGJ5IGV4cG9zaW5nIHRoZSBSZXBlYXRlZEZpZWxkIG9iamVjdCBpdHNlbGYgd2l0aCB0aGUgTWVzc2FnZS4KKyAgLy8gQXBwbHlpbmcgdGhlc2UgdGVtcGxhdGVzIHRvIGluYXBwcm9wcmlhdGUgdHlwZXMgd2lsbCBsZWFkIHRvIGFuIHVuZGVmaW5lZAorICAvLyByZWZlcmVuY2UgYXQgbGluayB0aW1lIChlLmcuIEdldFJlcGVhdGVkRmllbGQ8KioqZG91YmxlPiksIG9yIHBvc3NpYmx5IGEKKyAgLy8gdGVtcGxhdGUgbWF0Y2hpbmcgZXJyb3IgYXQgY29tcGlsZSB0aW1lIChlLmcuIEdldFJlcGVhdGVkUHRyRmllbGQ8RmlsZT4pLgorICAvLworICAvLyBVc2FnZSBleGFtcGxlOiBteV9kb3VicyA9IHJlZmwtPkdldFJlcGVhdGVkRmllbGQ8ZG91YmxlPihtc2csIGZkKTsKKworICAvLyBmb3IgVCA9IENvcmQgYW5kIGFsbCBwcm90b2J1ZiBzY2FsYXIgdHlwZXMgZXhjZXB0IGVudW1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBjb25zdCBSZXBlYXRlZEZpZWxkPFQ+JiBHZXRSZXBlYXRlZEZpZWxkKAorICAgICAgY29uc3QgTWVzc2FnZSYsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopIGNvbnN0OworCisgIC8vIGZvciBUID0gQ29yZCBhbmQgYWxsIHByb3RvYnVmIHNjYWxhciB0eXBlcyBleGNlcHQgZW51bXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFJlcGVhdGVkRmllbGQ8VD4qIE11dGFibGVSZXBlYXRlZEZpZWxkKAorICAgICAgTWVzc2FnZSosIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopIGNvbnN0OworCisgIC8vIGZvciBUID0gc3RyaW5nLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U3RyaW5nUGllY2VGaWVsZAorICAvLyAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgJiBkZXNjZW5kYW50cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxUPiYgR2V0UmVwZWF0ZWRQdHJGaWVsZCgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqKSBjb25zdDsKKworICAvLyBmb3IgVCA9IHN0cmluZywgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlN0cmluZ1BpZWNlRmllbGQKKyAgLy8gICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlICYgZGVzY2VuZGFudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIE11dGFibGVSZXBlYXRlZFB0ckZpZWxkKAorICAgICAgTWVzc2FnZSosIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopIGNvbnN0OworCisgIC8vIEV4dGVuc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFRyeSB0byBmaW5kIGFuIGV4dGVuc2lvbiBvZiB0aGlzIG1lc3NhZ2UgdHlwZSBieSBmdWxseS1xdWFsaWZpZWQgZmllbGQKKyAgLy8gbmFtZS4gIFJldHVybnMgTlVMTCBpZiBubyBleHRlbnNpb24gaXMga25vd24gZm9yIHRoaXMgbmFtZSBvciBudW1iZXIuCisgIHZpcnR1YWwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kS25vd25FeHRlbnNpb25CeU5hbWUoCisgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0ID0gMDsKKworICAvLyBUcnkgdG8gZmluZCBhbiBleHRlbnNpb24gb2YgdGhpcyBtZXNzYWdlIHR5cGUgYnkgZmllbGQgbnVtYmVyLgorICAvLyBSZXR1cm5zIE5VTEwgaWYgbm8gZXh0ZW5zaW9uIGlzIGtub3duIGZvciB0aGlzIG5hbWUgb3IgbnVtYmVyLgorICB2aXJ0dWFsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoCisgICAgICBpbnQgbnVtYmVyKSBjb25zdCA9IDA7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBwcm90ZWN0ZWQ6CisgIC8vIE9idGFpbiBhIHBvaW50ZXIgdG8gYSBSZXBlYXRlZCBGaWVsZCBTdHJ1Y3R1cmUgYW5kIGRvIHNvbWUgdHlwZSBjaGVja2luZzoKKyAgLy8gICBvbiBmaWVsZC0+Y3BwX3R5cGUoKSwKKyAgLy8gICBvbiBmaWVsZC0+ZmllbGRfb3B0aW9uKCkuY3R5cGUoKSAoaWYgY3R5cGUgPj0gMCkKKyAgLy8gICBvZiBmaWVsZC0+bWVzc2FnZV90eXBlKCkgKGlmIG1lc3NhZ2VfdHlwZSAhPSBOVUxMKS4KKyAgLy8gV2UgdXNlIDEgcm91dGluZSByYXRoZXIgdGhhbiA0IChjb25zdCB2cyBtdXRhYmxlKSB4IChzY2FsYXIgdnMgcG9pbnRlcikuCisgIHZpcnR1YWwgdm9pZCogTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUsCisgICAgICBpbnQgY3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgLy8gU3BlY2lhbCB2ZXJzaW9uIGZvciBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RyaW5nLiAgV2UgY2FuJ3QgY2FsbAorICAvLyBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCBkaXJlY3RseSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KKyAgLy8gRmllbGRPcHRpb25zOjoqIHdoaWNoIGFyZSBkZWZpbmVkIGluIGRlc2NyaXB0b3IucGIuaC4gIEluY2x1ZGluZyB0aGF0CisgIC8vIGZpbGUgaGVyZSBpcyBub3QgcG9zc2libGUgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSBhIGNpcmN1bGFyIGluY2x1ZGUgY3ljbGUuCisgIHZvaWQqIE11dGFibGVSYXdSZXBlYXRlZFN0cmluZygKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgaXNfc3RyaW5nKSBjb25zdDsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVmbGVjdGlvbik7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGEgZmFjdG9yeSBmb3IgbWVzc2FnZSBvYmplY3RzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1lc3NhZ2VGYWN0b3J5IHsKKyBwdWJsaWM6CisgIGlubGluZSBNZXNzYWdlRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgfk1lc3NhZ2VGYWN0b3J5KCk7CisKKyAgLy8gR2l2ZW4gYSBEZXNjcmlwdG9yLCBnZXRzIG9yIGNvbnN0cnVjdHMgdGhlIGRlZmF1bHQgKHByb3RvdHlwZSkgTWVzc2FnZQorICAvLyBvZiB0aGF0IHR5cGUuICBZb3UgY2FuIHRoZW4gY2FsbCB0aGF0IG1lc3NhZ2UncyBOZXcoKSBtZXRob2QgdG8gY29uc3RydWN0CisgIC8vIGEgbXV0YWJsZSBtZXNzYWdlIG9mIHRoYXQgdHlwZS4KKyAgLy8KKyAgLy8gQ2FsbGluZyB0aGlzIG1ldGhvZCB0d2ljZSB3aXRoIHRoZSBzYW1lIERlc2NyaXB0b3IgcmV0dXJucyB0aGUgc2FtZQorICAvLyBvYmplY3QuICBUaGUgcmV0dXJuZWQgb2JqZWN0IHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGZhY3RvcnkuICBBbHNvLCBhbnkKKyAgLy8gb2JqZWN0cyBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIHByb3RvdHlwZSdzIE5ldygpIG1ldGhvZCBzaGFyZSBzb21lIGRhdGEKKyAgLy8gd2l0aCB0aGUgcHJvdG90eXBlLCBzbyB0aGVzZSBtdXN0IGJlIGRlc3RveWVkIGJlZm9yZSB0aGUgTWVzc2FnZUZhY3RvcnkKKyAgLy8gaXMgZGVzdHJveWVkLgorICAvLworICAvLyBUaGUgZ2l2ZW4gZGVzY3JpcHRvciBtdXN0IG91dGxpdmUgdGhlIHJldHVybmVkIG1lc3NhZ2UsIGFuZCBoZW5jZSBtdXN0CisgIC8vIG91dGxpdmUgdGhlIE1lc3NhZ2VGYWN0b3J5LgorICAvLworICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyBkbyBub3Qgc3VwcG9ydCBhbGwgdHlwZXMuICBHZXRQcm90b3R5cGUoKSB3aWxsCisgIC8vIHJldHVybiBOVUxMIGlmIHRoZSBkZXNjcmlwdG9yIHBhc3NlZCBpbiBpcyBub3Qgc3VwcG9ydGVkLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBtYXkgb3IgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZSBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgorICAvLyBFYWNoIGltcGxlbWVudGF0aW9uIHNob3VsZCBkb2N1bWVudCBpdHMgb3duIGRlZ3JlZSB0aHJlYWQtc2FmZXR5LgorICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UqIEdldFByb3RvdHlwZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSA9IDA7CisKKyAgLy8gR2V0cyBhIE1lc3NhZ2VGYWN0b3J5IHdoaWNoIHN1cHBvcnRzIGFsbCBnZW5lcmF0ZWQsIGNvbXBpbGVkLWluIG1lc3NhZ2VzLgorICAvLyBJbiBvdGhlciB3b3JkcywgZm9yIGFueSBjb21waWxlZC1pbiB0eXBlIEZvb01lc3NhZ2UsIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKyAgLy8gICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKAorICAvLyAgICAgRm9vTWVzc2FnZTo6ZGVzY3JpcHRvcigpKSA9PSBGb29NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkKKyAgLy8gVGhpcyBmYWN0b3J5IHN1cHBvcnRzIGFsbCB0eXBlcyB3aGljaCBhcmUgZm91bmQgaW4KKyAgLy8gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkuICBJZiBnaXZlbiBhIGRlc2NyaXB0b3IgZnJvbSBhbnkgb3RoZXIKKyAgLy8gcG9vbCwgR2V0UHJvdG90eXBlKCkgd2lsbCByZXR1cm4gTlVMTC4gIChZb3UgY2FuIGFsc28gY2hlY2sgaWYgYQorICAvLyBkZXNjcmlwdG9yIGlzIGZvciBhIGdlbmVyYXRlZCBtZXNzYWdlIGJ5IGNoZWNraW5nIGlmCisgIC8vIGRlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpID09IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLikKKyAgLy8KKyAgLy8gVGhpcyBmYWN0b3J5IGlzIDEwMCUgdGhyZWFkLXNhZmU7IGNhbGxpbmcgR2V0UHJvdG90eXBlKCkgZG9lcyBub3QgbW9kaWZ5CisgIC8vIGFueSBzaGFyZWQgZGF0YS4KKyAgLy8KKyAgLy8gVGhpcyBmYWN0b3J5IGlzIGEgc2luZ2xldG9uLiAgVGhlIGNhbGxlciBtdXN0IG5vdCBkZWxldGUgdGhlIG9iamVjdC4KKyAgc3RhdGljIE1lc3NhZ2VGYWN0b3J5KiBnZW5lcmF0ZWRfZmFjdG9yeSgpOworCisgIC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seTogIFJlZ2lzdGVycyBhIC5wcm90byBmaWxlIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbgorICAvLyB0aW1lLCB0byBiZSBwbGFjZWQgaW4gZ2VuZXJhdGVkX2ZhY3RvcnkuICBUaGUgZmlyc3QgdGltZSBHZXRQcm90b3R5cGUoKQorICAvLyBpcyBjYWxsZWQgd2l0aCBhIGRlc2NyaXB0b3IgZnJvbSB0aGlzIGZpbGUsIHxyZWdpc3Rlcl9tZXNzYWdlc3wgd2lsbCBiZQorICAvLyBjYWxsZWQsIHdpdGggdGhlIGZpbGUgbmFtZSBhcyB0aGUgcGFyYW1ldGVyLiAgSXQgbXVzdCBjYWxsCisgIC8vIEludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKCkgKGJlbG93KSB0byByZWdpc3RlciBlYWNoIG1lc3NhZ2UgdHlwZQorICAvLyBpbiB0aGUgZmlsZS4gIFRoaXMgc3RyYW5nZSBtZWNoYW5pc20gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZGVzY3JpcHRvcnMgYXJlCisgIC8vIGJ1aWx0IGxhemlseSwgc28gd2UgY2FuJ3QgcmVnaXN0ZXIgdHlwZXMgYnkgdGhlaXIgZGVzY3JpcHRvciB1bnRpbCB3ZQorICAvLyBrbm93IHRoYXQgdGhlIGRlc2NyaXB0b3IgZXhpc3RzLiAgfGZpbGVuYW1lfCBtdXN0IGJlIGEgcGVybWFuZW50IHN0cmluZy4KKyAgc3RhdGljIHZvaWQgSW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoCisgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwgdm9pZCAoKnJlZ2lzdGVyX21lc3NhZ2VzKShjb25zdCBzdHJpbmcmKSk7CisKKyAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiAgUmVnaXN0ZXJzIGEgbWVzc2FnZSB0eXBlLiAgQ2FsbGVkIG9ubHkgYnkgdGhlCisgIC8vIGZ1bmN0aW9ucyB3aGljaCBhcmUgcmVnaXN0ZXJlZCB3aXRoIEludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKCksCisgIC8vIGFib3ZlLgorICBzdGF0aWMgdm9pZCBJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUpOworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUZhY3RvcnkpOworfTsKKworI2RlZmluZSBERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0xJQlBST1RPQlVGX0VYUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorY29uc3QgUmVwZWF0ZWRGaWVsZDxUWVBFPiYgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRGaWVsZDxUWVBFPiggICBcCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitMSUJQUk9UT0JVRl9FWFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1JlcGVhdGVkRmllbGQ8VFlQRT4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZEZpZWxkPFRZUEU+KCAgICAgXAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCitERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChpbnQzMikKK0RFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKGludDY0KQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQodWludDMyKQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQodWludDY0KQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoZmxvYXQpCitERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChkb3VibGUpCitERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChib29sKQorCisjdW5kZWYgREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIHtHZXQsTXV0YWJsZX1SYXdSZXBlYXRlZFB0ckZpZWxkLiAgV2UgcHJvdmlkZQorLy8gc3BlY2lhbGl6YXRpb25zIGZvciA8c3RyaW5nPiwgPFN0cmluZ1BpZWNlRmllbGQ+IGFuZCA8TWVzc2FnZT4gYW5kIGhhbmRsZQorLy8gZXZlcnl0aGluZyBlbHNlIHdpdGggdGhlIGRlZmF1bHQgdGVtcGxhdGUgd2hpY2ggd2lsbCBtYXRjaCBhbnkgdHlwZSBoYXZpbmcKKy8vIGEgbWV0aG9kIHdpdGggc2lnbmF0dXJlICJzdGF0aWMgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIi4KKy8vIFN1Y2ggYSB0eXBlIHByZXN1bWFibHkgaXMgYSBkZXNjZW5kYW50IG9mIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UuCisKK3RlbXBsYXRlPD4KK2lubGluZSBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4mIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiA+KAorICAgICAgTXV0YWJsZVJhd1JlcGVhdGVkU3RyaW5nKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQsIHRydWUpKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qID4oCisgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHRydWUpKTsKK30KKworCisvLyAtLS0tLQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiYgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRQdHJGaWVsZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogPigKKyAgICAgIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQsCisgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UsIC0xLAorICAgICAgICAgIE5VTEwpKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZFB0ckZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qID4oCisgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwgLTEsCisgICAgICAgICAgTlVMTCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBQQj4KK2lubGluZSBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFBCPiYgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRQdHJGaWVsZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxQQj4qID4oCisgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkLAorICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFLCAtMSwKKyAgICAgICAgICBQQjo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldERlc2NyaXB0b3IoKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBQQj4KK2lubGluZSBSZXBlYXRlZFB0ckZpZWxkPFBCPiogUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxQQj4qID4oCisgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwgLTEsCisgICAgICAgICAgUEI6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXREZXNjcmlwdG9yKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWRiZTZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYwpAQCAtMCwwICsxLDMzNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yczogd2lua0Bnb29nbGUuY29tIChXaW5rIFNhdmlsbGUpLAorLy8gICAgICAgICAga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK01lc3NhZ2VMaXRlOjp+TWVzc2FnZUxpdGUoKSB7fQorCitzdHJpbmcgTWVzc2FnZUxpdGU6OkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiAiKGNhbm5vdCBkZXRlcm1pbmUgbWlzc2luZyBmaWVsZHMgZm9yIGxpdGUgbWVzc2FnZSkiOworfQorCituYW1lc3BhY2UgeworCisvLyBXaGVuIHNlcmlhbGl6aW5nLCB3ZSBmaXJzdCBjb21wdXRlIHRoZSBieXRlIHNpemUsIHRoZW4gc2VyaWFsaXplIHRoZSBtZXNzYWdlLgorLy8gSWYgc2VyaWFsaXphdGlvbiBwcm9kdWNlcyBhIGRpZmZlcmVudCBudW1iZXIgb2YgYnl0ZXMgdGhhbiBleHBlY3RlZCwgd2UKKy8vIGNhbGwgdGhpcyBmdW5jdGlvbiwgd2hpY2ggY3Jhc2hlcy4gIFRoZSBwcm9ibGVtIGNvdWxkIGJlIGR1ZSB0byBhIGJ1ZyBpbiB0aGUKKy8vIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIGJ1dCBpcyBtb3JlIGxpa2VseSBjYXVzZWQgYnkgY29uY3VycmVudCBtb2RpZmljYXRpb24KKy8vIG9mIHRoZSBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gYW5kCisvLyBwcm92aWRlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuCit2b2lkIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihpbnQgYnl0ZV9zaXplX2JlZm9yZV9zZXJpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVfc2l6ZV9hZnRlcl9zZXJpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzX3Byb2R1Y2VkX2J5X3NlcmlhbGl6YXRpb24pIHsKKyAgR09PR0xFX0NIRUNLX0VRKGJ5dGVfc2l6ZV9iZWZvcmVfc2VyaWFsaXphdGlvbiwgYnl0ZV9zaXplX2FmdGVyX3NlcmlhbGl6YXRpb24pCisgICAgICA8PCAiUHJvdG9jb2wgbWVzc2FnZSB3YXMgbW9kaWZpZWQgY29uY3VycmVudGx5IGR1cmluZyBzZXJpYWxpemF0aW9uLiI7CisgIEdPT0dMRV9DSEVDS19FUShieXRlc19wcm9kdWNlZF9ieV9zZXJpYWxpemF0aW9uLCBieXRlX3NpemVfYmVmb3JlX3NlcmlhbGl6YXRpb24pCisgICAgICA8PCAiQnl0ZSBzaXplIGNhbGN1bGF0aW9uIGFuZCBzZXJpYWxpemF0aW9uIHdlcmUgaW5jb25zaXN0ZW50LiAgVGhpcyAiCisgICAgICAgICAibWF5IGluZGljYXRlIGEgYnVnIGluIHByb3RvY29sIGJ1ZmZlcnMgb3IgaXQgbWF5IGJlIGNhdXNlZCBieSAiCisgICAgICAgICAiY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlIG1lc3NhZ2UuIjsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpZiBhbGwgdGhlIHNpemVzIGFyZSBlcXVhbC4iOworfQorCitzdHJpbmcgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoY29uc3QgY2hhciogYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBtZXNzYWdlKSB7CisgIC8vIE5vdGU6ICBXZSB3YW50IHRvIGF2b2lkIGRlcGVuZGluZyBvbiBzdHJ1dGlsIGluIHRoZSBsaXRlIGxpYnJhcnksIG90aGVyd2lzZQorICAvLyAgIHdlJ2QgdXNlOgorICAvLworICAvLyByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgLy8gICAiQ2FuJ3QgJDAgbWVzc2FnZSBvZiB0eXBlIFwiJDFcIiBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgcmVxdWlyZWQgIgorICAvLyAgICJmaWVsZHM6ICQyIiwKKyAgLy8gICBhY3Rpb24sIG1lc3NhZ2UuR2V0VHlwZU5hbWUoKSwKKyAgLy8gICBtZXNzYWdlLkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7CisKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0ICs9ICJDYW4ndCAiOworICByZXN1bHQgKz0gYWN0aW9uOworICByZXN1bHQgKz0gIiBtZXNzYWdlIG9mIHR5cGUgXCIiOworICByZXN1bHQgKz0gbWVzc2FnZS5HZXRUeXBlTmFtZSgpOworICByZXN1bHQgKz0gIlwiIGJlY2F1c2UgaXQgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICI7CisgIHJlc3VsdCArPSBtZXNzYWdlLkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gU2V2ZXJhbCBvZiB0aGUgUGFyc2UgbWV0aG9kcyBiZWxvdyBqdXN0IGRvIG9uZSB0aGluZyBhbmQgdGhlbiBjYWxsIGFub3RoZXIKKy8vIG1ldGhvZC4gIEluIGEgbmFpdmUgaW1wbGVtZW50YXRpb24sIHdlIG1pZ2h0IGhhdmUgUGFyc2VGcm9tU3RyaW5nKCkgY2FsbAorLy8gUGFyc2VGcm9tQXJyYXkoKSB3aGljaCB3b3VsZCBjYWxsIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCkgd2hpY2ggd291bGQgY2FsbAorLy8gUGFyc2VGcm9tQ29kZWRTdHJlYW0oKSB3aGljaCB3b3VsZCBjYWxsIE1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgd2hpY2ggd291bGQKKy8vIGNhbGwgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCkuICBIb3dldmVyLCB3aGVuIHBhcnNpbmcgdmVyeSBzbWFsbAorLy8gbWVzc2FnZXMsIGV2ZXJ5IGZ1bmN0aW9uIGNhbGwgaW50cm9kdWNlcyBzaWduaWZpY2FudCBvdmVyaGVhZC4gIFRvIGF2b2lkCisvLyB0aGlzIHdpdGhvdXQgcmVwcm9kdWNpbmcgY29kZSwgd2UgdXNlIHRoZXNlIGZvcmNlZC1pbmxpbmUgaGVscGVycy4KKy8vCisvLyBOb3RlOiAgR0NDIG9ubHkgYWxsb3dzIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBvbiBkZWNsYXJhdGlvbnMsIG5vdAorLy8gICBkZWZpbml0aW9ucy4KK2lubGluZSBib29sIElubGluZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworaW5saW5lIGJvb2wgSW5saW5lUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CitpbmxpbmUgYm9vbCBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKK2lubGluZSBib29sIElubGluZVBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CitpbmxpbmUgYm9vbCBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCitib29sIElubGluZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKKyAgaWYgKCFtZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKSByZXR1cm4gZmFsc2U7CisgIGlmICghbWVzc2FnZS0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInBhcnNlIiwgKm1lc3NhZ2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbmxpbmVQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPkNsZWFyKCk7CisgIHJldHVybiBJbmxpbmVNZXJnZUZyb21Db2RlZFN0cmVhbShpbnB1dCwgbWVzc2FnZSk7Cit9CisKK2Jvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPkNsZWFyKCk7CisgIHJldHVybiBtZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpOworfQorCitib29sIElubGluZVBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZGF0YSksIHNpemUpOworICByZXR1cm4gSW5saW5lUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0LCBtZXNzYWdlKSAmJgorICAgICAgICAgaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7Cit9CisKK2Jvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEpLCBzaXplKTsKKyAgcmV0dXJuIElubGluZVBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgmaW5wdXQsIG1lc3NhZ2UpICYmCisgICAgICAgICBpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgTWVzc2FnZUxpdGU6Ok1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gSW5saW5lTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW5wdXQsIHRoaXMpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIElubGluZVBhcnNlRnJvbUNvZGVkU3RyZWFtKGlucHV0LCB0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0LCB0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGRlY29kZXIoaW5wdXQpOworICByZXR1cm4gUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmRlY29kZXIpICYmIGRlY29kZXIuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgKKyAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gZGVjb2RlcihpbnB1dCk7CisgIHJldHVybiBQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmRlY29kZXIpICYmCisgICAgICAgICBkZWNvZGVyLkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgc2l6ZSkgeworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBkZWNvZGVyKGlucHV0KTsKKyAgZGVjb2Rlci5QdXNoTGltaXQoc2l6ZSk7CisgIHJldHVybiBQYXJzZUZyb21Db2RlZFN0cmVhbSgmZGVjb2RlcikgJiYKKyAgICAgICAgIGRlY29kZXIuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgJiYKKyAgICAgICAgIGRlY29kZXIuQnl0ZXNVbnRpbExpbWl0KCkgPT0gMDsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgKKyAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGludCBzaXplKSB7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGRlY29kZXIoaW5wdXQpOworICBkZWNvZGVyLlB1c2hMaW1pdChzaXplKTsKKyAgcmV0dXJuIFBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgmZGVjb2RlcikgJiYKKyAgICAgICAgIGRlY29kZXIuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgJiYKKyAgICAgICAgIGRlY29kZXIuQnl0ZXNVbnRpbExpbWl0KCkgPT0gMDsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSkgeworICByZXR1cm4gSW5saW5lUGFyc2VGcm9tQXJyYXkoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCB0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGRhdGEpIHsKKyAgcmV0dXJuIElubGluZVBhcnNlUGFydGlhbEZyb21BcnJheShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIHRoaXMpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICByZXR1cm4gSW5saW5lUGFyc2VGcm9tQXJyYXkoZGF0YSwgc2l6ZSwgdGhpcyk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICByZXR1cm4gSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGRhdGEsIHNpemUsIHRoaXMpOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordWludDgqIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gV2Ugb25seSBvcHRpbWl6ZSB0aGlzIHdoZW4gdXNpbmcgb3B0aW1pemVfZm9yID0gU1BFRUQuICBJbiBvdGhlciBjYXNlcworICAvLyB3ZSBqdXN0IHVzZSB0aGUgQ29kZWRPdXRwdXRTdHJlYW0gcGF0aC4KKyAgaW50IHNpemUgPSBHZXRDYWNoZWRTaXplKCk7CisgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBvdXQodGFyZ2V0LCBzaXplKTsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dCgmb3V0KTsKKyAgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZjb2RlZF9vdXQpOworICBHT09HTEVfQ0hFQ0soIWNvZGVkX291dC5IYWRFcnJvcigpKTsKKyAgcmV0dXJuIHRhcmdldCArIHNpemU7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhJc0luaXRpYWxpemVkKCkpIDw8IEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCJzZXJpYWxpemUiLCAqdGhpcyk7CisgIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbShvdXRwdXQpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbSgKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBjb25zdCBpbnQgc2l6ZSA9IEJ5dGVTaXplKCk7ICAvLyBGb3JjZSBzaXplIHRvIGJlIGNhY2hlZC4KKyAgdWludDgqIGJ1ZmZlciA9IG91dHB1dC0+R2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShzaXplKTsKKyAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgdWludDgqIGVuZCA9IFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoYnVmZmVyKTsKKyAgICBpZiAoZW5kIC0gYnVmZmVyICE9IHNpemUpIHsKKyAgICAgIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihzaXplLCBCeXRlU2l6ZSgpLCBlbmQgLSBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgb3JpZ2luYWxfYnl0ZV9jb3VudCA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgICAgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7CisgICAgaWYgKG91dHB1dC0+SGFkRXJyb3IoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgZmluYWxfYnl0ZV9jb3VudCA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7CisKKyAgICBpZiAoZmluYWxfYnl0ZV9jb3VudCAtIG9yaWdpbmFsX2J5dGVfY291bnQgIT0gc2l6ZSkgeworICAgICAgQnl0ZVNpemVDb25zaXN0ZW5jeUVycm9yKHNpemUsIEJ5dGVTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfYnl0ZV9jb3VudCAtIG9yaWdpbmFsX2J5dGVfY291bnQpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGVuY29kZXIob3V0cHV0KTsKKyAgcmV0dXJuIFNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oJmVuY29kZXIpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgKKyAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gZW5jb2RlcihvdXRwdXQpOworICByZXR1cm4gU2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0oJmVuY29kZXIpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpBcHBlbmRUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKElzSW5pdGlhbGl6ZWQoKSkgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInNlcmlhbGl6ZSIsICp0aGlzKTsKKyAgcmV0dXJuIEFwcGVuZFBhcnRpYWxUb1N0cmluZyhvdXRwdXQpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpBcHBlbmRQYXJ0aWFsVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgaW50IG9sZF9zaXplID0gb3V0cHV0LT5zaXplKCk7CisgIGludCBieXRlX3NpemUgPSBCeXRlU2l6ZSgpOworICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKG91dHB1dCwgb2xkX3NpemUgKyBieXRlX3NpemUpOworICB1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KG91dHB1dCkgKyBvbGRfc2l6ZSk7CisgIHVpbnQ4KiBlbmQgPSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgaWYgKGVuZCAtIHN0YXJ0ICE9IGJ5dGVfc2l6ZSkgeworICAgIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihieXRlX3NpemUsIEJ5dGVTaXplKCksIGVuZCAtIHN0YXJ0KTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgb3V0cHV0LT5jbGVhcigpOworICByZXR1cm4gQXBwZW5kVG9TdHJpbmcob3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdCB7CisgIG91dHB1dC0+Y2xlYXIoKTsKKyAgcmV0dXJuIEFwcGVuZFBhcnRpYWxUb1N0cmluZyhvdXRwdXQpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVUb0FycmF5KHZvaWQqIGRhdGEsIGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soSXNJbml0aWFsaXplZCgpKSA8PCBJbml0aWFsaXphdGlvbkVycm9yTWVzc2FnZSgic2VyaWFsaXplIiwgKnRoaXMpOworICByZXR1cm4gU2VyaWFsaXplUGFydGlhbFRvQXJyYXkoZGF0YSwgc2l6ZSk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVBhcnRpYWxUb0FycmF5KHZvaWQqIGRhdGEsIGludCBzaXplKSBjb25zdCB7CisgIGludCBieXRlX3NpemUgPSBCeXRlU2l6ZSgpOworICBpZiAoc2l6ZSA8IGJ5dGVfc2l6ZSkgcmV0dXJuIGZhbHNlOworICB1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oZGF0YSk7CisgIHVpbnQ4KiBlbmQgPSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgaWYgKGVuZCAtIHN0YXJ0ICE9IGJ5dGVfc2l6ZSkgeworICAgIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihieXRlX3NpemUsIEJ5dGVTaXplKCksIGVuZCAtIHN0YXJ0KTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RyaW5nIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgLy8gSWYgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgdGhlIChOYW1lZCkgUmV0dXJuIFZhbHVlIE9wdGltaXphdGlvbiwKKyAgLy8gdGhlIGxvY2FsIHZhcmlhYmxlICdyZXN1bHQnIHdpbGwgbm90IGFjdHVhbGx5IHJlc2lkZSBvbiB0aGUgc3RhY2sKKyAgLy8gb2YgdGhpcyBmdW5jdGlvbiwgYnV0IHdpbGwgYmUgb3ZlcmxhaWQgd2l0aCB0aGUgb2JqZWN0IHRoYXQgdGhlCisgIC8vIGNhbGxlciBzdXBwbGllZCBmb3IgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBjb25zdHJ1Y3RlZCBpbi4KKyAgc3RyaW5nIG91dHB1dDsKKyAgaWYgKCFBcHBlbmRUb1N0cmluZygmb3V0cHV0KSkKKyAgICBvdXRwdXQuY2xlYXIoKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworc3RyaW5nIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBvdXRwdXQ7CisgIGlmICghQXBwZW5kUGFydGlhbFRvU3RyaW5nKCZvdXRwdXQpKQorICAgIG91dHB1dC5jbGVhcigpOworICByZXR1cm4gb3V0cHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWMzMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oCkBAIC0wLDAgKzEsMjQ2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3JzOiB3aW5rQGdvb2dsZS5jb20gKFdpbmsgU2F2aWxsZSksCisvLyAgICAgICAgICBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gRGVmaW5lcyBNZXNzYWdlTGl0ZSwgdGhlIGFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgKGxpdGUKKy8vIGFuZCBub24tbGl0ZSkgcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0xJVEVfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGlvIHsKKyAgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsKKyAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07CisgIGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07CisgIGNsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOworfQorCisvLyBJbnRlcmZhY2UgdG8gbGlnaHQgd2VpZ2h0IHByb3RvY29sIG1lc3NhZ2VzLgorLy8KKy8vIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBwcm90b2NvbCBtZXNzYWdlIG9iamVjdHMuICBOb24tbGl0ZQorLy8gbWVzc2FnZXMgYWRkaXRpb25hbGx5IGltcGxlbWVudCB0aGUgTWVzc2FnZSBpbnRlcmZhY2UsIHdoaWNoIGlzIGEKKy8vIHN1YmNsYXNzIG9mIE1lc3NhZ2VMaXRlLiAgVXNlIE1lc3NhZ2VMaXRlIGluc3RlYWQgd2hlbiB5b3Ugb25seSBuZWVkCisvLyB0aGUgc3Vic2V0IG9mIGZlYXR1cmVzIHdoaWNoIGl0IHN1cHBvcnRzIC0tIG5hbWVseSwgbm90aGluZyB0aGF0IHVzZXMKKy8vIGRlc2NyaXB0b3JzIG9yIHJlZmxlY3Rpb24uICBZb3UgY2FuIGluc3RydWN0IHRoZSBwcm90b2NvbCBjb21waWxlcgorLy8gdG8gZ2VuZXJhdGUgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgb25seSBNZXNzYWdlTGl0ZSwgbm90IHRoZSBmdWxsCisvLyBNZXNzYWdlIGludGVyZmFjZSwgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aGUgLnByb3RvIGZpbGU6CisvLworLy8gICBvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworLy8KKy8vIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBvbiByZXNvdXJjZS1jb25zdHJhaW5lZCBzeXN0ZW1zIHdoZXJlCisvLyB0aGUgZnVsbCBwcm90b2NvbCBidWZmZXJzIHJ1bnRpbWUgbGlicmFyeSBpcyB0b28gYmlnLgorLy8KKy8vIE5vdGUgdGhhdCBvbiBub24tY29uc3RyYWluZWQgc3lzdGVtcyAoZS5nLiBzZXJ2ZXJzKSB3aGVuIHlvdSBuZWVkCisvLyB0byBsaW5rIGluIGxvdHMgb2YgcHJvdG9jb2wgZGVmaW5pdGlvbnMsIGEgYmV0dGVyIHdheSB0byByZWR1Y2UKKy8vIHRvdGFsIGNvZGUgZm9vdHByaW50IGlzIHRvIHVzZSBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUuICBUaGlzCisvLyB3aWxsIG1ha2UgdGhlIGdlbmVyYXRlZCBjb2RlIHNtYWxsZXIgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBhbGwgdGhlCisvLyBzYW1lIGZlYXR1cmVzIChhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZCkuICBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUKKy8vIGlzIGJlc3Qgd2hlbiB5b3Ugb25seSBoYXZlIGEgc21hbGwgbnVtYmVyIG9mIG1lc3NhZ2UgdHlwZXMgbGlua2VkCisvLyBpbnRvIHlvdXIgYmluYXJ5LCBpbiB3aGljaCBjYXNlIHRoZSBzaXplIG9mIHRoZSBwcm90b2NvbCBidWZmZXJzCisvLyBydW50aW1lIGl0c2VsZiBpcyB0aGUgYmlnZ2VzdCBwcm9ibGVtLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1lc3NhZ2VMaXRlIHsKKyBwdWJsaWM6CisgIGlubGluZSBNZXNzYWdlTGl0ZSgpIHt9CisgIHZpcnR1YWwgfk1lc3NhZ2VMaXRlKCk7CisKKyAgLy8gQmFzaWMgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhpcyBtZXNzYWdlIHR5cGUsIGUuZy4gImZvby5iYXIuQmF6UHJvdG8iLgorICB2aXJ0dWFsIHN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0ID0gMDsKKworICAvLyBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZS4gIE93bmVyc2hpcCBpcyBwYXNzZWQgdG8gdGhlCisgIC8vIGNhbGxlci4KKyAgdmlydHVhbCBNZXNzYWdlTGl0ZSogTmV3KCkgY29uc3QgPSAwOworCisgIC8vIENsZWFyIGFsbCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgYW5kIHNldCB0aGVtIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAvLyBDbGVhcigpIGF2b2lkcyBmcmVlaW5nIG1lbW9yeSwgYXNzdW1pbmcgdGhhdCBhbnkgbWVtb3J5IGFsbG9jYXRlZAorICAvLyB0byBob2xkIHBhcnRzIG9mIHRoZSBtZXNzYWdlIHdpbGwgYmUgbmVlZGVkIGFnYWluIHRvIGhvbGQgdGhlIG5leHQKKyAgLy8gbWVzc2FnZS4gIElmIHlvdSBhY3R1YWxseSB3YW50IHRvIGZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IGEgTWVzc2FnZSwKKyAgLy8geW91IG11c3QgZGVsZXRlIGl0LgorICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKSA9IDA7CisKKyAgLy8gUXVpY2tseSBjaGVjayBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgdmFsdWVzIHNldC4KKyAgdmlydHVhbCBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCA9IDA7CisKKyAgLy8gVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIExpdGUgbWVzc2FnZXMgLS0gaXQganVzdCByZXR1cm5zICIoY2Fubm90CisgIC8vIGRldGVybWluZSBtaXNzaW5nIGZpZWxkcyBmb3IgbGl0ZSBtZXNzYWdlKSIuICBIb3dldmVyLCBpdCBpcyBpbXBsZW1lbnRlZAorICAvLyBmb3IgZnVsbCBtZXNzYWdlcy4gIFNlZSBtZXNzYWdlLmguCisgIHZpcnR1YWwgc3RyaW5nIEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdDsKKworICAvLyBJZiB8b3RoZXJ8IGlzIHRoZSBleGFjdCBzYW1lIGNsYXNzIGFzIHRoaXMsIGNhbGxzIE1lcmdlRnJvbSgpLiAgT3RoZXJ3aXNlLAorICAvLyByZXN1bHRzIGFyZSB1bmRlZmluZWQgKHByb2JhYmx5IGNyYXNoKS4KKyAgdmlydHVhbCB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXIpID0gMDsKKworICAvLyBQYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIGZvciBwYXJzaW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlIGFyZQorICAvLyBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4KKworICAvLyBGaWxsIHRoZSBtZXNzYWdlIHdpdGggYSBwcm90b2NvbCBidWZmZXIgcGFyc2VkIGZyb20gdGhlIGdpdmVuIGlucHV0CisgIC8vIHN0cmVhbS4gIFJldHVybnMgZmFsc2Ugb24gYSByZWFkIGVycm9yIG9yIGlmIHRoZSBpbnB1dCBpcyBpbiB0aGUKKyAgLy8gd3JvbmcgZm9ybWF0LgorICBib29sIFBhcnNlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIC8vIExpa2UgUGFyc2VGcm9tQ29kZWRTdHJlYW0oKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIC8vIFJlYWQgYSBwcm90b2NvbCBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gemVyby1jb3B5IGlucHV0IHN0cmVhbS4gIElmCisgIC8vIHN1Y2Nlc3NmdWwsIHRoZSBlbnRpcmUgaW5wdXQgd2lsbCBiZSBjb25zdW1lZC4KKyAgYm9vbCBQYXJzZUZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworICAvLyBMaWtlIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG1pc3NpbmcKKyAgLy8gcmVxdWlyZWQgZmllbGRzLgorICBib29sIFBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworICAvLyBSZWFkIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gdGhlIGdpdmVuIHplcm8tY29weSBpbnB1dCBzdHJlYW0sIGV4cGVjdGluZworICAvLyB0aGUgbWVzc2FnZSB0byBiZSBleGFjdGx5ICJzaXplIiBieXRlcyBsb25nLiAgSWYgc3VjY2Vzc2Z1bCwgZXhhY3RseQorICAvLyB0aGlzIG1hbnkgYnl0ZXMgd2lsbCBoYXZlIGJlZW4gY29uc3VtZWQgZnJvbSB0aGUgaW5wdXQuCisgIGJvb2wgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgaW50IHNpemUpOworICAvLyBMaWtlIFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZQorICAvLyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBQYXJzZVBhcnRpYWxGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKKyAgLy8gUGFyc2UgYSBwcm90b2NvbCBidWZmZXIgY29udGFpbmVkIGluIGEgc3RyaW5nLgorICBib29sIFBhcnNlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGRhdGEpOworICAvLyBMaWtlIFBhcnNlRnJvbVN0cmluZygpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZSBtaXNzaW5nCisgIC8vIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBQYXJzZVBhcnRpYWxGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSk7CisgIC8vIFBhcnNlIGEgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5lZCBpbiBhbiBhcnJheSBvZiBieXRlcy4KKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7CisgIC8vIExpa2UgUGFyc2VGcm9tQXJyYXkoKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKKworCisgIC8vIFJlYWRzIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gdGhlIHN0cmVhbSBhbmQgbWVyZ2VzIGl0IGludG8gdGhpcworICAvLyBNZXNzYWdlLiAgU2luZ3VsYXIgZmllbGRzIHJlYWQgZnJvbSB0aGUgaW5wdXQgb3ZlcndyaXRlIHdoYXQgaXMKKyAgLy8gYWxyZWFkeSBpbiB0aGUgTWVzc2FnZSBhbmQgcmVwZWF0ZWQgZmllbGRzIGFyZSBhcHBlbmRlZCB0byB0aG9zZQorICAvLyBhbHJlYWR5IHByZXNlbnQuCisgIC8vCisgIC8vIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGNhbGwgaW5wdXQtPkxhc3RUYWdXYXMoKQorICAvLyAoZm9yIGdyb3Vwcykgb3IgaW5wdXQtPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpIChmb3Igbm9uLWdyb3VwcykgYWZ0ZXIKKyAgLy8gdGhpcyByZXR1cm5zIHRvIHZlcmlmeSB0aGF0IHRoZSBtZXNzYWdlJ3MgZW5kIHdhcyBkZWxpbWl0ZWQgY29ycmVjdGx5LgorICAvLworICAvLyBQYXJzZWZyb21Db2RlZFN0cmVhbSgpIGlzIGltcGxlbWVudGVkIGFzIENsZWFyKCkgZm9sbG93ZWQgYnkKKyAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4KKyAgYm9vbCBNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworCisgIC8vIExpa2UgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSwgYnV0IHN1Y2NlZWRzIGV2ZW4gaWYgcmVxdWlyZWQgZmllbGRzIGFyZQorICAvLyBtaXNzaW5nIGluIHRoZSBpbnB1dC4KKyAgLy8KKyAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSBpcyBqdXN0IGltcGxlbWVudGVkIGFzIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpCisgIC8vIGZvbGxvd2VkIGJ5IElzSW5pdGlhbGl6ZWQoKS4KKyAgdmlydHVhbCBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpID0gMDsKKworCisgIC8vIFNlcmlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1ldGhvZHMgZm9yIHNlcmlhbGl6aW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlCisgIC8vIGFyZSBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgQnl0ZVNpemUoKSBhbmQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuCisKKyAgLy8gV3JpdGUgYSBwcm90b2NvbCBidWZmZXIgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBnaXZlbiBvdXRwdXQuICBSZXR1cm5zCisgIC8vIGZhbHNlIG9uIGEgd3JpdGUgZXJyb3IuICBJZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcywKKyAgLy8gdGhpcyBtYXkgR09PR0xFX0NIRUNLLWZhaWwuCisgIGJvb2wgU2VyaWFsaXplVG9Db2RlZFN0cmVhbShpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIC8vIExpa2UgU2VyaWFsaXplVG9Db2RlZFN0cmVhbSgpLCBidXQgYWxsb3dzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICBib29sIFNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgLy8gV3JpdGUgdGhlIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIHplcm8tY29weSBvdXRwdXQgc3RyZWFtLiAgQWxsIHJlcXVpcmVkCisgIC8vIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgLy8gTGlrZSBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAvLyBTZXJpYWxpemUgdGhlIG1lc3NhZ2UgYW5kIHN0b3JlIGl0IGluIHRoZSBnaXZlbiBzdHJpbmcuICBBbGwgcmVxdWlyZWQKKyAgLy8gZmllbGRzIG11c3QgYmUgc2V0LgorICBib29sIFNlcmlhbGl6ZVRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdDsKKyAgLy8gTGlrZSBTZXJpYWxpemVUb1N0cmluZygpLCBidXQgYWxsb3dzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICBib29sIFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3Q7CisgIC8vIFNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgc3RvcmUgaXQgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuICBBbGwgcmVxdWlyZWQKKyAgLy8gZmllbGRzIG11c3QgYmUgc2V0LgorICBib29sIFNlcmlhbGl6ZVRvQXJyYXkodm9pZCogZGF0YSwgaW50IHNpemUpIGNvbnN0OworICAvLyBMaWtlIFNlcmlhbGl6ZVRvQXJyYXkoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9BcnJheSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgY29uc3Q7CisKKyAgLy8gTWFrZSBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWVzc2FnZS4gSXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgIC8vIFNlcmlhbGl6ZVRvU3RyaW5nKCkgb24gYSBzdHJpbmcgYW5kIHVzaW5nIHRoYXQuICBSZXR1cm5zIHRoZSBlbXB0eQorICAvLyBzdHJpbmcgaWYgU2VyaWFsaXplVG9TdHJpbmcoKSB3b3VsZCBoYXZlIHJldHVybmVkIGFuIGVycm9yLgorICAvLyBOb3RlOiBJZiB5b3UgaW50ZW5kIHRvIGdlbmVyYXRlIG1hbnkgc3VjaCBzdHJpbmdzLCB5b3UgbWF5CisgIC8vIHJlZHVjZSBoZWFwIGZyYWdtZW50YXRpb24gYnkgaW5zdGVhZCByZS11c2luZyB0aGUgc2FtZSBzdHJpbmcKKyAgLy8gb2JqZWN0IHdpdGggY2FsbHMgdG8gU2VyaWFsaXplVG9TdHJpbmcoKS4KKyAgc3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Q7CisgIC8vIExpa2UgU2VyaWFsaXplQXNTdHJpbmcoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgc3RyaW5nIFNlcmlhbGl6ZVBhcnRpYWxBc1N0cmluZygpIGNvbnN0OworCisgIC8vIExpa2UgU2VyaWFsaXplVG9TdHJpbmcoKSwgYnV0IGFwcGVuZHMgdG8gdGhlIGRhdGEgdG8gdGhlIHN0cmluZydzIGV4aXN0aW5nCisgIC8vIGNvbnRlbnRzLiAgQWxsIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBBcHBlbmRUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3Q7CisgIC8vIExpa2UgQXBwZW5kVG9TdHJpbmcoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBBcHBlbmRQYXJ0aWFsVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0OworCisgIC8vIENvbXB1dGVzIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgdGhlIG1lc3NhZ2UuICBUaGlzIHJlY3Vyc2l2ZWx5IGNhbGxzCisgIC8vIEJ5dGVTaXplKCkgb24gYWxsIGVtYmVkZGVkIG1lc3NhZ2VzLiAgSWYgYSBzdWJjbGFzcyBkb2VzIG5vdCBvdmVycmlkZQorICAvLyB0aGlzLCBpdCBNVVNUIG92ZXJyaWRlIFNldENhY2hlZFNpemUoKS4KKyAgdmlydHVhbCBpbnQgQnl0ZVNpemUoKSBjb25zdCA9IDA7CisKKyAgLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB3aXRob3V0IHJlY29tcHV0aW5nIHRoZSBzaXplLiAgVGhlIG1lc3NhZ2UgbXVzdAorICAvLyBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gQnl0ZVNpemUoKTsgaWYgaXQgaGFzLCB0aGUgcmVzdWx0cworICAvLyBhcmUgdW5kZWZpbmVkLgorICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0ID0gMDsKKworICAvLyBMaWtlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcywgYnV0IHdyaXRlcyBkaXJlY3RseSB0byAqdGFyZ2V0LCByZXR1cm5pbmcKKyAgLy8gYSBwb2ludGVyIHRvIHRoZSBieXRlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbi4gICJ0YXJnZXQiCisgIC8vIG11c3QgcG9pbnQgYXQgYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IEJ5dGVTaXplKCkgYnl0ZXMuCisgIHZpcnR1YWwgdWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGNhbGwgdG8gQnl0ZVNpemUoKS4gIEFuIGVtYmVkZGVkIG1lc3NhZ2UncworICAvLyBzaXplIGlzIG5lZWRlZCBib3RoIHRvIHNlcmlhbGl6ZSBpdCAoYmVjYXVzZSBlbWJlZGRlZCBtZXNzYWdlcyBhcmUKKyAgLy8gbGVuZ3RoLWRlbGltaXRlZCkgYW5kIHRvIGNvbXB1dGUgdGhlIG91dGVyIG1lc3NhZ2UncyBzaXplLiAgQ2FjaGluZworICAvLyB0aGUgc2l6ZSBhdm9pZHMgY29tcHV0aW5nIGl0IG11bHRpcGxlIHRpbWVzLgorICAvLworICAvLyBCeXRlU2l6ZSgpIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBjYWNoZWQgc2l6ZSB3aGVuIGF2YWlsYWJsZQorICAvLyBiZWNhdXNlIHRoaXMgd291bGQgcmVxdWlyZSBpbnZhbGlkYXRpbmcgaXQgZXZlcnkgdGltZSB0aGUgbWVzc2FnZSB3YXMKKyAgLy8gbW9kaWZpZWQsIHdoaWNoIHdvdWxkIGJlIHRvbyBoYXJkIGFuZCBleHBlbnNpdmUuICAoRS5nLiBpZiBhIGRlZXBseS1uZXN0ZWQKKyAgLy8gc3ViLW1lc3NhZ2UgaXMgY2hhbmdlZCwgYWxsIG9mIGl0cyBwYXJlbnRzJyBjYWNoZWQgc2l6ZXMgd291bGQgbmVlZCB0byBiZQorICAvLyBpbnZhbGlkYXRlZCwgd2hpY2ggaXMgdG9vIG11Y2ggd29yayBmb3IgYW4gb3RoZXJ3aXNlIGlubGluZWQgc2V0dGVyCisgIC8vIG1ldGhvZC4pCisgIHZpcnR1YWwgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUxpdGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX01FU1NBR0VfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0NDljNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMzU0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZuZGVmIE9fQklOQVJZCisjaWZkZWYgX09fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQorI2Vsc2UKKyNkZWZpbmUgT19CSU5BUlkgMCAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgcGxhdGZvcm0gZG9lc24ndCBuZWVkIGl0LgorI2VuZGlmCisjZW5kaWYKKworVEVTVChNZXNzYWdlVGVzdCwgU2VyaWFsaXplSGVscGVycykgeworICAvLyBUT0RPKGtlbnRvbik6ICBUZXN0IG1vcmUgaGVscGVycz8gIFRoZXkncmUgYWxsIHR3by1saW5lcnMgc28gaXQgc2VlbXMKKyAgLy8gICBsaWtlIGEgd2FzdGUgb2YgdGltZS4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBzdHJpbmdzdHJlYW0gc3RyZWFtOworCisgIHN0cmluZyBzdHIxKCJmb28iKTsKKyAgc3RyaW5nIHN0cjIoImJhciIpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJnN0cjEpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5BcHBlbmRUb1N0cmluZygmc3RyMikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlNlcmlhbGl6ZVRvT3N0cmVhbSgmc3RyZWFtKSk7CisKKyAgRVhQRUNUX0VRKHN0cjEuc2l6ZSgpICsgMywgc3RyMi5zaXplKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHN0cjIuc3Vic3RyKDAsIDMpKTsKKyAgLy8gRG9uJ3QgdXNlIEVYUEVDVF9FUSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZHVtcCByYXcgYmluYXJ5IGRhdGEgdG8KKyAgLy8gc3Rkb3V0LgorICBFWFBFQ1RfVFJVRShzdHIyLnN1YnN0cigzKSA9PSBzdHIxKTsKKworICAvLyBHQ0MgZ2l2ZXMgc29tZSBzb3J0IG9mIGVycm9yIGlmIHdlIHRyeSB0byBqdXN0IGRvIHN0cmVhbS5zdHIoKSA9PSBzdHIxLgorICBzdHJpbmcgdGVtcCA9IHN0cmVhbS5zdHIoKTsKKyAgRVhQRUNUX1RSVUUodGVtcCA9PSBzdHIxKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCkgPT0gc3RyMSk7CisKK30KKworVEVTVChNZXNzYWdlVGVzdCwgU2VyaWFsaXplVG9Ccm9rZW5Pc3RyZWFtKSB7CisgIG9mc3RyZWFtIG91dDsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlNlcmlhbGl6ZVRvT3N0cmVhbSgmb3V0KSk7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIFBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKSB7CisgIHN0cmluZyBmaWxlbmFtZSA9IFRlc3RTb3VyY2VEaXIoKSArCisgICAgICAgICAgICAgICAgICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIjsKKyAgaW50IGZpbGUgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZIHwgT19CSU5BUlkpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihmaWxlKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisKKyAgRVhQRUNUX0dFKGNsb3NlKGZpbGUpLCAwKTsKK30KKworVEVTVChNZXNzYWdlVGVzdCwgUGFyc2VQYWNrZWRGcm9tRmlsZURlc2NyaXB0b3IpIHsKKyAgc3RyaW5nIGZpbGVuYW1lID0KKyAgICAgIFRlc3RTb3VyY2VEaXIoKSArCisgICAgICAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlIjsKKyAgaW50IGZpbGUgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZIHwgT19CSU5BUlkpOworCisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihmaWxlKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQobWVzc2FnZSk7CisKKyAgRVhQRUNUX0dFKGNsb3NlKGZpbGUpLCAwKTsKK30KKworVEVTVChNZXNzYWdlVGVzdCwgUGFyc2VIZWxwZXJzKSB7CisgIC8vIFRPRE8oa2VudG9uKTogIFRlc3QgbW9yZSBoZWxwZXJzPyAgVGhleSdyZSBhbGwgdHdvLWxpbmVycyBzbyBpdCBzZWVtcworICAvLyAgIGxpa2UgYSB3YXN0ZSBvZiB0aW1lLgorICBzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gU2V0IHVwLgorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IFBhcnNlRnJvbVN0cmluZy4KKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIH0KKworICB7CisgICAgLy8gVGVzdCBQYXJzZUZyb21Jc3RyZWFtLgorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgICBzdHJpbmdzdHJlYW0gc3RyZWFtKGRhdGEpOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tSXN0cmVhbSgmc3RyZWFtKSk7CisgICAgRVhQRUNUX1RSVUUoc3RyZWFtLmVvZigpKTsKKyAgICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtLgorICAgIHN0cmluZyBkYXRhX3dpdGhfanVuayhkYXRhKTsKKyAgICBkYXRhX3dpdGhfanVuay5hcHBlbmQoInNvbWUganVuayBvbiB0aGUgZW5kIik7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gc3RyZWFtKGRhdGFfd2l0aF9qdW5rLmRhdGEoKSwgZGF0YV93aXRoX2p1bmsuc2l6ZSgpKTsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oJnN0cmVhbSwgZGF0YS5zaXplKCkpKTsKKyAgICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgdGhhdCBQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0gZmFpbHMgKGJ1dCBkb2Vzbid0IGNyYXNoKSBpZgorICAgIC8vIEVPRiBpcyByZWFjaGVkIGJlZm9yZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHN0cmVhbShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLlBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgmc3RyZWFtLCBkYXRhLnNpemUoKSArIDEpKTsKKyAgfQorfQorCitURVNUKE1lc3NhZ2VUZXN0LCBQYXJzZUZhaWxzSWZOb3RJbml0aWFsaXplZCkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoIiIpKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisKKyAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoIkNhbid0IHBhcnNlIG1lc3NhZ2Ugb2YgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZFwiICIKKyAgICAgICAgICAgICJiZWNhdXNlIGl0IGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBhLCBiLCBjIiwKKyAgICAgICAgICAgIGVycm9yc1swXSk7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIEJ5cGFzc0luaXRpYWxpemF0aW9uQ2hlY2tPblBhcnNlKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KE5VTEwsIDApOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBFWFBFQ1RfRVEoImEsIGIsIGMiLCBtZXNzYWdlLkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7Cit9CisKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCitURVNUKE1lc3NhZ2VUZXN0LCBTZXJpYWxpemVGYWlsc0lmTm90SW5pdGlhbGl6ZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBzdHJpbmcgZGF0YTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpKSwKKyAgICAiQ2FuJ3Qgc2VyaWFsaXplIG1lc3NhZ2Ugb2YgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZFwiIGJlY2F1c2UgIgorICAgICJpdCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIpOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBDaGVja0luaXRpYWxpemVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRVhQRUNUX0RFQVRIKG1lc3NhZ2UuQ2hlY2tJbml0aWFsaXplZCgpLAorICAgICJNZXNzYWdlIG9mIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWRcIiBpcyBtaXNzaW5nIHJlcXVpcmVkICIKKyAgICAiZmllbGRzOiBhLCBiLCBjIik7Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChNZXNzYWdlVGVzdCwgQnlwYXNzSW5pdGlhbGl6YXRpb25DaGVja09uU2VyaWFsaXplKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgaW86OkFycmF5T3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoTlVMTCwgMCk7CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKCZvdXRwdXQpKTsKK30KKworVEVTVChNZXNzYWdlVGVzdCwgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICBtZXNzYWdlLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygmZXJyb3JzKTsKKyAgQVNTRVJUX0VRKDMsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoImEiLCBlcnJvcnNbMF0pOworICBFWFBFQ1RfRVEoImIiLCBlcnJvcnNbMV0pOworICBFWFBFQ1RfRVEoImMiLCBlcnJvcnNbMl0pOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBQYXJzZUZhaWxzT25JbnZhbGlkTWVzc2FnZUVuZCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgLy8gQ29udHJvbCBjYXNlLgorICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUFycmF5KCIiLCAwKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQsIGJ1dCBub3QgYSB2YWxpZCB0YWcgKHplcm8pLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21BcnJheSgiXDAiLCAxKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSBtYWxmb3JtZWQgdmFyaW50LgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21BcnJheSgiXDIwMCIsIDEpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhbiBlbmRncm91cCB0YWcsIGJ1dCB3ZSBhcmVuJ3QgcGFyc2luZyBhIGdyb3VwLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21BcnJheSgiXDAxNCIsIDEpKTsKK30KKworbmFtZXNwYWNlIHsKKwordm9pZCBFeHBlY3RNZXNzYWdlTWVyZ2VkKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX0VRKDMsIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7Cit9CisKK3ZvaWQgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMoCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbXNnMSwKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtc2cyLAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1zZzMpIHsKKyAgbXNnMS0+c2V0X29wdGlvbmFsX2ludDMyKDEpOworICBtc2cyLT5zZXRfb3B0aW9uYWxfaW50NjQoMik7CisgIG1zZzMtPnNldF9vcHRpb25hbF9pbnQzMigzKTsKKyAgbXNnMy0+c2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFRlc3QgdGhhdCBpZiBhbiBvcHRpb25hbCBvciByZXF1aXJlZCBtZXNzYWdlL2dyb3VwIGZpZWxkIGFwcGVhcnMgbXVsdGlwbGUKKy8vIHRpbWVzIGluIHRoZSBpbnB1dCwgdGhleSBuZWVkIHRvIGJlIG1lcmdlZC4KK1RFU1QoTWVzc2FnZVRlc3QsIFBhcnNpbmdNZXJnZSkgeworICB1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZTo6UmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgZ2VuZXJhdG9yOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtc2cyOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtc2czOworCisjZGVmaW5lIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChGSUVMRCkgICAgICAgICAgICAgICAgXAorICBtc2cxID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgbXNnMiA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICAgICAgICAgICAgICAgICBcCisgIG1zZzMgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgICAgICAgICAgICAgICAgXAorICBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcyhtc2cxLCBtc2cyLCBtc2czKQorCisgIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChmaWVsZDEpOworICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQyKTsKKyAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMyk7CisgIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChleHQxKTsKKyAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGV4dDIpOworCisjdW5kZWYgQVNTSUdOX1JFUEVBVEVEX0ZJRUxECisjZGVmaW5lIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChGSUVMRCkgICAgICAgICAgICAgICAgXAorICBtc2cxID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKKyAgbXNnMiA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCisgIG1zZzMgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAorICBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcyhtc2cxLCBtc2cyLCBtc2czKQorCisgIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChncm91cDEpOworICBBU1NJR05fUkVQRUFURURfR1JPVVAoZ3JvdXAyKTsKKworI3VuZGVmIEFTU0lHTl9SRVBFQVRFRF9HUk9VUAorCisgIHN0cmluZyBidWZmZXI7CisgIGdlbmVyYXRvci5TZXJpYWxpemVUb1N0cmluZygmYnVmZmVyKTsKKyAgdW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2UgcGFyc2luZ19tZXJnZTsKKyAgcGFyc2luZ19tZXJnZS5QYXJzZUZyb21TdHJpbmcoYnVmZmVyKTsKKworICAvLyBSZXF1aXJlZCBhbmQgb3B0aW9uYWwgZmllbGRzIHNob3VsZCBiZSBtZXJnZWQuCisgIEV4cGVjdE1lc3NhZ2VNZXJnZWQocGFyc2luZ19tZXJnZS5yZXF1aXJlZF9hbGxfdHlwZXMoKSk7CisgIEV4cGVjdE1lc3NhZ2VNZXJnZWQocGFyc2luZ19tZXJnZS5vcHRpb25hbF9hbGxfdHlwZXMoKSk7CisgIEV4cGVjdE1lc3NhZ2VNZXJnZWQoCisgICAgICBwYXJzaW5nX21lcmdlLm9wdGlvbmFsZ3JvdXAoKS5vcHRpb25hbF9ncm91cF9hbGxfdHlwZXMoKSk7CisgIEV4cGVjdE1lc3NhZ2VNZXJnZWQoCisgICAgICBwYXJzaW5nX21lcmdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZTo6b3B0aW9uYWxfZXh0KSk7CisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIHNob3VsZCBub3QgYmUgbWVyZ2VkLgorICBFWFBFQ1RfRVEoMywgcGFyc2luZ19tZXJnZS5yZXBlYXRlZF9hbGxfdHlwZXNfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMsIHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRncm91cF9zaXplKCkpOworICBFWFBFQ1RfRVEoMywgcGFyc2luZ19tZXJnZS5FeHRlbnNpb25TaXplKAorICAgICAgdW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2U6OnJlcGVhdGVkX2V4dCkpOworfQorCitURVNUKE1lc3NhZ2VGYWN0b3J5VGVzdCwgR2VuZXJhdGVkRmFjdG9yeUxvb2t1cCkgeworICBFWFBFQ1RfRVEoCisgICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCktPkdldFByb3RvdHlwZSgKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSksCisgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Cit9CisKK1RFU1QoTWVzc2FnZUZhY3RvcnlUZXN0LCBHZW5lcmF0ZWRGYWN0b3J5VW5rbm93blR5cGUpIHsKKyAgLy8gQ29uc3RydWN0IGEgbmV3IGRlc2NyaXB0b3IuCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgIGZpbGUuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiRm9vIik7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBwb29sLkJ1aWxkRmlsZShmaWxlKS0+bWVzc2FnZV90eXBlKDApOworCisgIC8vIFRyeWluZyB0byBjb25zdHJ1Y3QgaXQgc2hvdWxkIHJldHVybiBOVUxMLgorICBFWFBFQ1RfVFJVRSgKKyAgICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3IpID09IE5VTEwpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2QzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmgKQEAgLTAsMCArMSw2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGV4aXN0cyBzb2xlbHkgdG8gZG9jdW1lbnQgdGhlIGdvb2dsZTo6cHJvdG9idWYgbmFtZXNwYWNlLgorLy8gSXQgaXMgbm90IGNvbXBpbGVkIGludG8gYW55dGhpbmcsIGJ1dCBpdCBtYXkgYmUgcmVhZCBieSBhbiBhdXRvbWF0ZWQKKy8vIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLgorCituYW1lc3BhY2UgZ29vZ2xlIHsKKworLy8gQ29yZSBjb21wb25lbnRzIG9mIHRoZSBQcm90b2NvbCBCdWZmZXJzIHJ1bnRpbWUgbGlicmFyeS4KKy8vCisvLyBUaGUgZmlsZXMgaW4gdGhpcyBwYWNrYWdlIHJlcHJlc2VudCB0aGUgY29yZSBvZiB0aGUgUHJvdG9jb2wgQnVmZmVyCisvLyBzeXN0ZW0uICBBbGwgb2YgdGhlbSBhcmUgcGFydCBvZiB0aGUgbGlicHJvdG9idWYgbGlicmFyeS4KKy8vCisvLyBBIG5vdGUgb24gdGhyZWFkLXNhZmV0eToKKy8vCisvLyBUaHJlYWQtc2FmZXR5IGluIHRoZSBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBmb2xsb3dzIGEgc2ltcGxlIHJ1bGU6CisvLyB1bmxlc3MgZXhwbGljaXRseSBub3RlZCBvdGhlcndpc2UsIGl0IGlzIGFsd2F5cyBzYWZlIHRvIHVzZSBhbiBvYmplY3QKKy8vIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseSBhcyBsb25nIGFzIHRoZSBvYmplY3QgaXMgZGVjbGFyZWQKKy8vIGNvbnN0IGluIGFsbCB0aHJlYWRzIChvciwgaXQgaXMgb25seSB1c2VkIGluIHdheXMgdGhhdCB3b3VsZCBiZSBhbGxvd2VkCisvLyBpZiBpdCB3ZXJlIGRlY2xhcmVkIGNvbnN0KS4gIEhvd2V2ZXIsIGlmIGFuIG9iamVjdCBpcyBhY2Nlc3NlZCBpbiBvbmUKKy8vIHRocmVhZCBpbiBhIHdheSB0aGF0IHdvdWxkIG5vdCBiZSBhbGxvd2VkIGlmIGl0IHdlcmUgY29uc3QsIHRoZW4gaXQgaXMKKy8vIG5vdCBzYWZlIHRvIGFjY2VzcyB0aGF0IG9iamVjdCBpbiBhbnkgb3RoZXIgdGhyZWFkIHNpbXVsdGFuZW91c2x5LgorLy8KKy8vIFB1dCBzaW1wbHksIHJlYWQtb25seSBhY2Nlc3MgdG8gYW4gb2JqZWN0IGNhbiBoYXBwZW4gaW4gbXVsdGlwbGUgdGhyZWFkcworLy8gc2ltdWx0YW5lb3VzbHksIGJ1dCB3cml0ZSBhY2Nlc3MgY2FuIG9ubHkgaGFwcGVuIGluIGEgc2luZ2xlIHRocmVhZCBhdAorLy8gYSB0aW1lLgorLy8KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIGNvbnRhaW4gc29tZSAiY29uc3QiIG1ldGhvZHMgd2hpY2ggYWN0dWFsbHkgbW9kaWZ5CisvLyB0aGUgb2JqZWN0IGJlaGluZCB0aGUgc2NlbmVzIC0tIGUuZy4sIHRvIGNhY2hlIHJlc3VsdHMgLS0gYnV0IGluIHRoZXNlIGNhc2VzCisvLyBtdXRleCBsb2NraW5nIGlzIHVzZWQgdG8gbWFrZSB0aGUgYWNjZXNzIHRocmVhZC1zYWZlLgorbmFtZXNwYWNlIHByb3RvYnVmIHt9Cit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwOTk3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5jYwpAQCAtMCwwICsxLDI2NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgUmVmbGVjdGlvbk9wczo6Q29weShjb25zdCBNZXNzYWdlJiBmcm9tLCBNZXNzYWdlKiB0bykgeworICBpZiAoJmZyb20gPT0gdG8pIHJldHVybjsKKyAgQ2xlYXIodG8pOworICBNZXJnZShmcm9tLCB0byk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbk9wczo6TWVyZ2UoY29uc3QgTWVzc2FnZSYgZnJvbSwgTWVzc2FnZSogdG8pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0byk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IGZyb20uR2V0RGVzY3JpcHRvcigpOworICBHT09HTEVfQ0hFQ0tfRVEodG8tPkdldERlc2NyaXB0b3IoKSwgZGVzY3JpcHRvcikKKyAgICA8PCAiVHJpZWQgdG8gbWVyZ2UgbWVzc2FnZXMgb2YgZGlmZmVyZW50IHR5cGVzLiI7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogZnJvbV9yZWZsZWN0aW9uID0gZnJvbS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHRvX3JlZmxlY3Rpb24gPSB0by0+R2V0UmVmbGVjdGlvbigpOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGZyb21fcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhmcm9tLCAmZmllbGRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOworCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBpbnQgY291bnQgPSBmcm9tX3JlZmxlY3Rpb24tPkZpZWxkU2l6ZShmcm9tLCBmaWVsZCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShDUFBUWVBFLCBNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0b19yZWZsZWN0aW9uLT5BZGQjI01FVEhPRCh0bywgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkIyNNRVRIT0QoZnJvbSwgZmllbGQsIGopKTsgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgSEFORExFX1RZUEUoSU5UMzIgLCBJbnQzMiApOworICAgICAgICAgIEhBTkRMRV9UWVBFKElOVDY0ICwgSW50NjQgKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIFVJbnQzMik7CisgICAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQpOworICAgICAgICAgIEhBTkRMRV9UWVBFKEZMT0FUICwgRmxvYXQgKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIERvdWJsZSk7CisgICAgICAgICAgSEFORExFX1RZUEUoQk9PTCAgLCBCb29sICApOworICAgICAgICAgIEhBTkRMRV9UWVBFKFNUUklORywgU3RyaW5nKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShFTlVNICAsIEVudW0gICk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgICB0b19yZWZsZWN0aW9uLT5BZGRNZXNzYWdlKHRvLCBmaWVsZCktPk1lcmdlRnJvbSgKKyAgICAgICAgICAgICAgZnJvbV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UoZnJvbSwgZmllbGQsIGopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoQ1BQVFlQRSwgTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRvX3JlZmxlY3Rpb24tPlNldCMjTUVUSE9EKHRvLCBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZyb21fcmVmbGVjdGlvbi0+R2V0IyNNRVRIT0QoZnJvbSwgZmllbGQpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgSEFORExFX1RZUEUoSU5UMzIgLCBJbnQzMiApOworICAgICAgICBIQU5ETEVfVFlQRShJTlQ2NCAsIEludDY0ICk7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShGTE9BVCAsIEZsb2F0ICk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgRG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoQk9PTCAgLCBCb29sICApOworICAgICAgICBIQU5ETEVfVFlQRShTVFJJTkcsIFN0cmluZyk7CisgICAgICAgIEhBTkRMRV9UWVBFKEVOVU0gICwgRW51bSAgKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgdG9fcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UodG8sIGZpZWxkKS0+TWVyZ2VGcm9tKAorICAgICAgICAgICAgZnJvbV9yZWZsZWN0aW9uLT5HZXRNZXNzYWdlKGZyb20sIGZpZWxkKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdG9fcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHModG8pLT5NZXJnZUZyb20oCisgICAgZnJvbV9yZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKGZyb20pKTsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpDbGVhcihNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBmaWVsZHNbaV0pOworICB9CisKKyAgcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSktPkNsZWFyKCk7Cit9CisKK2Jvb2wgUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIC8vIENoZWNrIHJlcXVpcmVkIGZpZWxkcyBvZiB0aGlzIG1lc3NhZ2UuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPmZpZWxkKGkpLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICBpZiAoIXJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2NyaXB0b3ItPmZpZWxkKGkpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgdGhhdCBzdWItbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgorICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UsICZmaWVsZHMpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICBpZiAoIXJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLklzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKS5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSktPkNsZWFyKCk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGQpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGopCisgICAgICAgICAgICAgICAgICAgIC0+RGlzY2FyZFVua25vd25GaWVsZHMoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLT5EaXNjYXJkVW5rbm93bkZpZWxkcygpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgc3RyaW5nIFN1Yk1lc3NhZ2VQcmVmaXgoY29uc3Qgc3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgc3RyaW5nIHJlc3VsdChwcmVmaXgpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiKCIpOworICAgIHJlc3VsdC5hcHBlbmQoZmllbGQtPmZ1bGxfbmFtZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKCIpIik7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0LmFwcGVuZChmaWVsZC0+bmFtZSgpKTsKKyAgfQorICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICByZXN1bHQuYXBwZW5kKCJbIik7CisgICAgcmVzdWx0LmFwcGVuZChTaW1wbGVJdG9hKGluZGV4KSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXSIpOworICB9CisgIHJlc3VsdC5hcHBlbmQoIi4iKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKKyAgICB2ZWN0b3I8c3RyaW5nPiogZXJyb3JzKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIC8vIENoZWNrIHJlcXVpcmVkIGZpZWxkcyBvZiB0aGlzIG1lc3NhZ2UuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPmZpZWxkKGkpLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICBpZiAoIXJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2NyaXB0b3ItPmZpZWxkKGkpKSkgeworICAgICAgICBlcnJvcnMtPnB1c2hfYmFjayhwcmVmaXggKyBkZXNjcmlwdG9yLT5maWVsZChpKS0+bmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGVjayBzdWItbWVzc2FnZXMuCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaik7CisgICAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIGopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTY1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaApAQCAtMCwwICsxLDgxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKKy8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUkVGTEVDVElPTl9PUFNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRUZMRUNUSU9OX09QU19IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBCYXNpYyBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCB1c2luZyByZWZsZWN0aW9uLgorLy8gVGhlc2UgY2FuIGJlIHVzZWQgYXMgYSBjaGVhcCB3YXkgdG8gaW1wbGVtZW50IHRoZSBjb3JyZXNwb25kaW5nCisvLyBtZXRob2RzIG9mIHRoZSBNZXNzYWdlIGludGVyZmFjZSwgdGhvdWdoIHRoZXkgYXJlIGxpa2VseSB0byBiZQorLy8gc2xvd2VyIHRoYW4gaW1wbGVtZW50YXRpb25zIHRhaWxvcmVkIGZvciB0aGUgc3BlY2lmaWMgbWVzc2FnZSB0eXBlLgorLy8KKy8vIFRoaXMgY2xhc3Mgc2hvdWxkIHN0YXkgbGltaXRlZCB0byBvcGVyYXRpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKKy8vIHRoZSBNZXNzYWdlIGludGVyZmFjZS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHJlYWxseSBhIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVmbGVjdGlvbk9wcyB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBDb3B5KGNvbnN0IE1lc3NhZ2UmIGZyb20sIE1lc3NhZ2UqIHRvKTsKKyAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgTWVzc2FnZSYgZnJvbSwgTWVzc2FnZSogdG8pOworICBzdGF0aWMgdm9pZCBDbGVhcihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgc3RhdGljIGJvb2wgSXNJbml0aWFsaXplZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRGlzY2FyZFVua25vd25GaWVsZHMoTWVzc2FnZSogbWVzc2FnZSk7CisKKyAgLy8gRmluZHMgYWxsIHVuc2V0IHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhbmQgYWRkcyB0aGVpciBmdWxsCisgIC8vIHBhdGhzIChlLmcuICJmb28uYmFyWzVdLmJheiIpIHRvICpuYW1lcy4gICJwcmVmaXgiIHdpbGwgYmUgYXR0YWNoZWQgdG8KKyAgLy8gdGhlIGZyb250IG9mIGVhY2ggbmFtZS4KKyAgc3RhdGljIHZvaWQgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBlcnJvcnMpOworCisgcHJpdmF0ZToKKyAgLy8gQWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4gIE5vIG5lZWQgdG8gY29uc3RydWN0LgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVmbGVjdGlvbk9wcyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9SRUZMRUNUSU9OX09QU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTIyOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNDA1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBTYW5pdHlDaGVjaykgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENvcHkpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKworICBSZWZsZWN0aW9uT3BzOjpDb3B5KG1lc3NhZ2UsICZtZXNzYWdlMik7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgLy8gQ29weWluZyBmcm9tIHNlbGYgc2hvdWxkIGJlIGEgbm8tb3AuCisgIFJlZmxlY3Rpb25PcHM6OkNvcHkobWVzc2FnZTIsICZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDb3B5RXh0ZW5zaW9ucykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSwgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIFJlZmxlY3Rpb25PcHM6OkNvcHkobWVzc2FnZSwgJm1lc3NhZ2UyKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlKSB7CisgIC8vIE5vdGU6ICBDb3B5IGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIE1lcmdlKCkgc28gdGVjaG5pY2FsbHkgdGhlIENvcHkKKyAgLy8gICB0ZXN0IGFscmVhZHkgdGVzdGVkIG1vc3Qgb2YgdGhpcy4KKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIC8vIFRoaXMgZmllbGQgd2lsbCB0ZXN0IG1lcmdpbmcgaW50byBhbiBlbXB0eSBzcG90LgorICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfaW50MzIobWVzc2FnZS5vcHRpb25hbF9pbnQzMigpKTsKKyAgbWVzc2FnZS5jbGVhcl9vcHRpb25hbF9pbnQzMigpOworCisgIC8vIFRoaXMgdGVzdHMgb3ZlcndyaXRpbmcuCisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9zdHJpbmcobWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygic29tZXRoaW5nIGVsc2UiKTsKKworICAvLyBUaGlzIHRlc3RzIGNvbmNhdGVuYXRpbmcuCisgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9pbnQzMihtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgaW50MzIgaSA9IG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMCk7CisgIG1lc3NhZ2UuY2xlYXJfcmVwZWF0ZWRfaW50MzIoKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW50MzIoaSk7CisKKyAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTIsICZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBNZXJnZUV4dGVuc2lvbnMpIHsKKyAgLy8gTm90ZTogIENvcHkgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgTWVyZ2UoKSBzbyB0ZWNobmljYWxseSB0aGUgQ29weQorICAvLyAgIHRlc3QgYWxyZWFkeSB0ZXN0ZWQgbW9zdCBvZiB0aGlzLgorCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCisgIG1lc3NhZ2UyLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLAorICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKKyAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKTsKKworICAvLyBUaGlzIHRlc3RzIG92ZXJ3cml0aW5nLgorICBtZXNzYWdlMi5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24sCisgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pKTsKKyAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24sICJzb21ldGhpbmcgZWxzZSIpOworCisgIC8vIFRoaXMgdGVzdHMgY29uY2F0ZW5hdGluZy4KKyAgbWVzc2FnZTIuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sCisgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMSkpOworICBpbnQzMiBpID0gbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMCk7CisgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbik7CisgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIGkpOworCisgIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UyLCAmbWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlVW5rbm93bikgeworICAvLyBUZXN0IHRoYXQgdGhlIG1lc3NhZ2VzJyBVbmtub3duRmllbGRTZXRzIGFyZSBjb3JyZWN0bHkgbWVyZ2VkLgorICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIG1lc3NhZ2UxLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQsIDEpOworICBtZXNzYWdlMi5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxMjM0LCAyKTsKKworICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlMiwgJm1lc3NhZ2UxKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZTEudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsCisgICAgICAgICAgICBtZXNzYWdlMS51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLnR5cGUoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMS51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLnZhcmludCgpKTsKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsCisgICAgICAgICAgICBtZXNzYWdlMS51bmtub3duX2ZpZWxkcygpLmZpZWxkKDEpLnR5cGUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlMS51bmtub3duX2ZpZWxkcygpLmZpZWxkKDEpLnZhcmludCgpKTsKK30KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlRnJvbVNlbGYpIHsKKyAgLy8gTm90ZTogIENvcHkgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgTWVyZ2UoKSBzbyB0ZWNobmljYWxseSB0aGUgQ29weQorICAvLyAgIHRlc3QgYWxyZWFkeSB0ZXN0ZWQgbW9zdCBvZiB0aGlzLgorCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBFWFBFQ1RfREVBVEgoCisgICAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZSwgJm1lc3NhZ2UpLAorICAgICImZnJvbSIpOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENsZWFyKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKworICBSZWZsZWN0aW9uT3BzOjpDbGVhcigmbWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgZ2V0dGluZyBlbWJlZGRlZCBtZXNzYWdlcyByZXR1cm5zIHRoZSBvYmplY3RzIGNyZWF0ZWQgZHVyaW5nCisgIC8vIFNldEFsbEZpZWxkcygpIHJhdGhlciB0aGFuIGRlZmF1bHQgaW5zdGFuY2VzLgorICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXA6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsZ3JvdXAoKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ2xlYXJFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICBSZWZsZWN0aW9uT3BzOjpDbGVhcigmbWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGdldHRpbmcgZW1iZWRkZWQgbWVzc2FnZXMgcmV0dXJucyB0aGUgb2JqZWN0cyBjcmVhdGVkIGR1cmluZworICAvLyBTZXRBbGxFeHRlbnNpb25zKCkgcmF0aGVyIHRoYW4gZGVmYXVsdCBpbnN0YW5jZXMuCisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6Ok9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENsZWFyVW5rbm93bikgeworICAvLyBUZXN0IHRoYXQgdGhlIG1lc3NhZ2UncyBVbmtub3duRmllbGRTZXQgaXMgY29ycmVjdGx5IGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNCwgMSk7CisKKyAgUmVmbGVjdGlvbk9wczo6Q2xlYXIoJm1lc3NhZ2UpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIERpc2NhcmRVbmtub3duRmllbGRzKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisKKyAgLy8gU2V0IHNvbWUgdW5rbm93biBmaWVsZHMgaW4gbWVzc2FnZS4KKyAgbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKKyAgICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKQorICAgICAgICAtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKQorICAgICAgICAtPkFkZFZhcmludCgxMjM0NTYsIDY1NDMyMSk7CisgIG1lc3NhZ2UubXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKQorICAgICAgICAtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKQorICAgICAgICAtPkFkZFZhcmludCgxMjM0NTYsIDY1NDMyMSk7CisKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKQorICAgICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworCisgIC8vIERpc2NhcmQgdGhlbS4KKyAgUmVmbGVjdGlvbk9wczo6RGlzY2FyZFVua25vd25GaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRGlzY2FyZFVua25vd25FeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgLy8gU2V0IHNvbWUgdW5rbm93biBmaWVsZHMuCisgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgIC0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgIC0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwKKyAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgICAudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsCisgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiwgMCkKKyAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisKKyAgLy8gRGlzY2FyZCB0aGVtLgorICBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLAorICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMCwKKyAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKQorICAgICAgICAgICAudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgSXNJbml0aWFsaXplZCkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworICBtZXNzYWdlLnNldF9hKDEpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIG1lc3NhZ2Uuc2V0X2IoMik7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEZvcmVpZ25Jc0luaXRpYWxpemVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2U7CisKKyAgLy8gU3RhcnRzIG91dCBpbml0aWFsaXplZCBiZWNhdXNlIHRoZSBmb3JlaWduIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIG9wdGlvbmFsCisgIC8vIGZpZWxkLgorICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKworICAvLyBPbmNlIHdlIGNyZWF0ZSB0aGF0IGZpZWxkLCB0aGUgbWVzc2FnZSBpcyBubyBsb25nZXIgaW5pdGlhbGl6ZWQuCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKworICAvLyBJbml0aWFsaXplIGl0LiAgTm93IHdlJ3JlIGluaXRpYWxpemVkLgorICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYSgxKTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2IoMik7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKworICAvLyBBZGQgYSByZXBlYXRlZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLiAgTm8gbG9uZ2VyIGluaXRpYWxpemVkLgorICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkKiBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIEluaXRpYWxpemUgdGhhdCByZXBlYXRlZCB2ZXJzaW9uLgorICBzdWJfbWVzc2FnZS0+c2V0X2EoMSk7CisgIHN1Yl9tZXNzYWdlLT5zZXRfYigyKTsKKyAgc3ViX21lc3NhZ2UtPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRXh0ZW5zaW9uSXNJbml0aWFsaXplZCkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICAvLyBTdGFydHMgb3V0IGluaXRpYWxpemVkIGJlY2F1c2UgdGhlIGZvcmVpZ24gbWVzc2FnZSBpcyBpdHNlbGYgYW4gb3B0aW9uYWwKKyAgLy8gZmllbGQuCisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIE9uY2Ugd2UgY3JlYXRlIHRoYXQgZmllbGQsIHRoZSBtZXNzYWdlIGlzIG5vIGxvbmdlciBpbml0aWFsaXplZC4KKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKworICAvLyBJbml0aWFsaXplIGl0LiAgTm93IHdlJ3JlIGluaXRpYWxpemVkLgorICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2EoMSk7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYigyKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKworICAvLyBBZGQgYSByZXBlYXRlZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLiAgTm8gbG9uZ2VyIGluaXRpYWxpemVkLgorICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKworICAvLyBJbml0aWFsaXplIHRoYXQgcmVwZWF0ZWQgdmVyc2lvbi4KKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2EoMSk7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9iKDIpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICBSZWZsZWN0aW9uT3BzOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSwgIiIsICZlcnJvcnMpOworICByZXR1cm4gSm9pblN0cmluZ3MoZXJyb3JzLCAiLCIpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBFWFBFQ1RfRVEoImEsYixjIiwgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRmluZEZvcmVpZ25Jbml0aWFsaXphdGlvbkVycm9ycykgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkRm9yZWlnbiBtZXNzYWdlOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKTsKKyAgRVhQRUNUX0VRKCJvcHRpb25hbF9tZXNzYWdlLmEsIgorICAgICAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYiwiCisgICAgICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5jLCIKKyAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmEsIgorICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYiwiCisgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5jLCIKKyAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmEsIgorICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYiwiCisgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5jIiwKKyAgICAgICAgICAgIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhtZXNzYWdlKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEZpbmRFeHRlbnNpb25Jbml0aWFsaXphdGlvbkVycm9ycykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSk7CisgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpKTsKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGkpOworICBFWFBFQ1RfRVEoIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQuc2luZ2xlKS5hLCIKKyAgICAgICAgICAgICIocHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkLnNpbmdsZSkuYiwiCisgICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5zaW5nbGUpLmMsIgorICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmEsIgorICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmIsIgorICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmMsIgorICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmEsIgorICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmIsIgorICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmMiLAorICAgICAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMWY3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuY2MKQEAgLTAsMCArMSw4NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVzZXJ2ZShpbnQgbmV3X3NpemUpIHsKKyAgaWYgKHRvdGFsX3NpemVfID49IG5ld19zaXplKSByZXR1cm47CisKKyAgdm9pZCoqIG9sZF9lbGVtZW50cyA9IGVsZW1lbnRzXzsKKyAgdG90YWxfc2l6ZV8gPSBtYXgoa01pblJlcGVhdGVkRmllbGRBbGxvY2F0aW9uU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbWF4KHRvdGFsX3NpemVfICogMiwgbmV3X3NpemUpKTsKKyAgZWxlbWVudHNfID0gbmV3IHZvaWQqW3RvdGFsX3NpemVfXTsKKyAgaWYgKG9sZF9lbGVtZW50cyAhPSBOVUxMKSB7CisgICAgbWVtY3B5KGVsZW1lbnRzXywgb2xkX2VsZW1lbnRzLCBhbGxvY2F0ZWRfc2l6ZV8gKiBzaXplb2YoZWxlbWVudHNfWzBdKSk7CisgICAgZGVsZXRlIFtdIG9sZF9lbGVtZW50czsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTd2FwKFJlcGVhdGVkUHRyRmllbGRCYXNlKiBvdGhlcikgeworICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuOworICB2b2lkKiogc3dhcF9lbGVtZW50cyAgICAgICA9IGVsZW1lbnRzXzsKKyAgaW50ICAgIHN3YXBfY3VycmVudF9zaXplICAgPSBjdXJyZW50X3NpemVfOworICBpbnQgICAgc3dhcF9hbGxvY2F0ZWRfc2l6ZSA9IGFsbG9jYXRlZF9zaXplXzsKKyAgaW50ICAgIHN3YXBfdG90YWxfc2l6ZSAgICAgPSB0b3RhbF9zaXplXzsKKworICBlbGVtZW50c18gICAgICAgPSBvdGhlci0+ZWxlbWVudHNfOworICBjdXJyZW50X3NpemVfICAgPSBvdGhlci0+Y3VycmVudF9zaXplXzsKKyAgYWxsb2NhdGVkX3NpemVfID0gb3RoZXItPmFsbG9jYXRlZF9zaXplXzsKKyAgdG90YWxfc2l6ZV8gICAgID0gb3RoZXItPnRvdGFsX3NpemVfOworCisgIG90aGVyLT5lbGVtZW50c18gICAgICAgPSBzd2FwX2VsZW1lbnRzOworICBvdGhlci0+Y3VycmVudF9zaXplXyAgID0gc3dhcF9jdXJyZW50X3NpemU7CisgIG90aGVyLT5hbGxvY2F0ZWRfc2l6ZV8gPSBzd2FwX2FsbG9jYXRlZF9zaXplOworICBvdGhlci0+dG90YWxfc2l6ZV8gICAgID0gc3dhcF90b3RhbF9zaXplOworfQorCitzdHJpbmcqIFN0cmluZ1R5cGVIYW5kbGVyQmFzZTo6TmV3KCkgeworICByZXR1cm4gbmV3IHN0cmluZzsKK30KK3ZvaWQgU3RyaW5nVHlwZUhhbmRsZXJCYXNlOjpEZWxldGUoc3RyaW5nKiB2YWx1ZSkgeworICBkZWxldGUgdmFsdWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBkNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmgKQEAgLTAsMCArMSwxNTE5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIGFyZSB1c2VkIGJ5IGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlCisvLyBjbGFzc2VzIHRvIG1hbmlwdWxhdGUgcmVwZWF0ZWQgZmllbGRzLiAgVGhlc2UgY2xhc3NlcyBhcmUgdmVyeSBzaW1pbGFyIHRvCisvLyBTVEwncyB2ZWN0b3IsIGJ1dCBpbmNsdWRlIGEgbnVtYmVyIG9mIG9wdGltaXphdGlvbnMgZm91bmQgdG8gYmUgdXNlZnVsCisvLyBzcGVjaWZpY2FsbHkgaW4gdGhlIGNhc2Ugb2YgUHJvdG9jb2wgQnVmZmVycy4gIFJlcGVhdGVkUHRyRmllbGQgaXMKKy8vIHBhcnRpY3VsYXJseSBkaWZmZXJlbnQgZnJvbSBTVEwgdmVjdG9yIGFzIGl0IG1hbmFnZXMgb3duZXJzaGlwIG9mIHRoZQorLy8gcG9pbnRlcnMgdGhhdCBpdCBjb250YWlucy4KKy8vCisvLyBUeXBpY2FsbHksIGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGFjY2VzcyBSZXBlYXRlZEZpZWxkIG9iamVjdHMgZGlyZWN0bHksCisvLyBidXQgc2hvdWxkIGluc3RlYWQgdXNlIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlCisvLyBwcm90b2NvbCBjb21waWxlci4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUkVQRUFURURfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9GSUVMRF9IX18KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKKworbmFtZXNwYWNlIHVwYiB7CituYW1lc3BhY2UgZ29vZ2xlX29wZW5zb3VyY2UgeworY2xhc3MgR01SX0hhbmRsZXJzOworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZV9vcGVuc291cmNlCit9ICAvLyBuYW1lc3BhY2UgdXBiCisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIE1lc3NhZ2U7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0YXRpYyBjb25zdCBpbnQga01pblJlcGVhdGVkRmllbGRBbGxvY2F0aW9uU2l6ZSA9IDQ7CisKKy8vIEEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgbG9nZ2luZyB0aGF0IGRvZXNuJ3QgbmVlZCBhbnkgdGVtcGxhdGUgdHlwZXMuCit2b2lkIExvZ0luZGV4T3V0T2ZCb3VuZHMoaW50IGluZGV4LCBpbnQgc2l6ZSk7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvLyBSZXBlYXRlZEZpZWxkIGlzIHVzZWQgdG8gcmVwcmVzZW50IHJlcGVhdGVkIGZpZWxkcyBvZiBhIHByaW1pdGl2ZSB0eXBlIChpbgorLy8gb3RoZXIgd29yZHMsIGV2ZXJ5dGhpbmcgZXhjZXB0IHN0cmluZ3MgYW5kIG5lc3RlZCBNZXNzYWdlcykuICBNb3N0IHVzZXJzIHdpbGwKKy8vIG5vdCBldmVyIHVzZSBhIFJlcGVhdGVkRmllbGQgZGlyZWN0bHk7IHRoZXkgd2lsbCB1c2UgdGhlIGdldC1ieS1pbmRleCwKKy8vIHNldC1ieS1pbmRleCwgYW5kIGFkZCBhY2Nlc3NvcnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBhbGwgcmVwZWF0ZWQgZmllbGRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZEZpZWxkIHsKKyBwdWJsaWM6CisgIFJlcGVhdGVkRmllbGQoKTsKKyAgUmVwZWF0ZWRGaWVsZChjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgorICBSZXBlYXRlZEZpZWxkKEl0ZXIgYmVnaW4sIGNvbnN0IEl0ZXImIGVuZCk7CisgIH5SZXBlYXRlZEZpZWxkKCk7CisKKyAgUmVwZWF0ZWRGaWVsZCYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKworICBpbnQgc2l6ZSgpIGNvbnN0OworCisgIGNvbnN0IEVsZW1lbnQmIEdldChpbnQgaW5kZXgpIGNvbnN0OworICBFbGVtZW50KiBNdXRhYmxlKGludCBpbmRleCk7CisgIHZvaWQgU2V0KGludCBpbmRleCwgY29uc3QgRWxlbWVudCYgdmFsdWUpOworICB2b2lkIEFkZChjb25zdCBFbGVtZW50JiB2YWx1ZSk7CisgIEVsZW1lbnQqIEFkZCgpOworICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgIHZvaWQgUmVtb3ZlTGFzdCgpOworCisgIC8vIEV4dHJhY3QgZWxlbWVudHMgd2l0aCBpbmRpY2VzIGluICJbc3RhcnQgLi4gc3RhcnQrbnVtLTFdIi4KKyAgLy8gQ29weSB0aGVtIGludG8gImVsZW1lbnRzWzAgLi4gbnVtLTFdIiBpZiAiZWxlbWVudHMiIGlzIG5vdCBOVUxMLgorICAvLyBDYXV0aW9uOiBpbXBsZW1lbnRhdGlvbiBhbHNvIG1vdmVzIGVsZW1lbnRzIHdpdGggaW5kaWNlcyBbc3RhcnQrbnVtIC4uXS4KKyAgLy8gQ2FsbGluZyB0aGlzIHJvdXRpbmUgaW5zaWRlIGEgbG9vcCBjYW4gY2F1c2UgcXVhZHJhdGljIGJlaGF2aW9yLgorICB2b2lkIEV4dHJhY3RTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqIGVsZW1lbnRzKTsKKworICB2b2lkIENsZWFyKCk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7CisKKyAgLy8gUmVzZXJ2ZSBzcGFjZSB0byBleHBhbmQgdGhlIGZpZWxkIHRvIGF0IGxlYXN0IHRoZSBnaXZlbiBzaXplLiAgSWYgdGhlCisgIC8vIGFycmF5IGlzIGdyb3duLCBpdCB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBkb3VibGVkIGluIHNpemUuCisgIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOworCisgIC8vIFJlc2l6ZSB0aGUgUmVwZWF0ZWRGaWVsZCB0byBhIG5ldywgc21hbGxlciBzaXplLiAgVGhpcyBpcyBPKDEpLgorICB2b2lkIFRydW5jYXRlKGludCBuZXdfc2l6ZSk7CisKKyAgdm9pZCBBZGRBbHJlYWR5UmVzZXJ2ZWQoY29uc3QgRWxlbWVudCYgdmFsdWUpOworICBFbGVtZW50KiBBZGRBbHJlYWR5UmVzZXJ2ZWQoKTsKKyAgaW50IENhcGFjaXR5KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgdW5kZXJseWluZyBhcnJheS4gIFRoaXMgcG9pbnRlciBpcyBwb3NzaWJseSBpbnZhbGlkYXRlZCBieQorICAvLyBhbnkgYWRkIG9yIHJlbW92ZSBvcGVyYXRpb24uCisgIEVsZW1lbnQqIG11dGFibGVfZGF0YSgpOworICBjb25zdCBFbGVtZW50KiBkYXRhKCkgY29uc3Q7CisKKyAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLgorICB2b2lkIFN3YXAoUmVwZWF0ZWRGaWVsZCogb3RoZXIpOworCisgIC8vIFN3YXAgdHdvIGVsZW1lbnRzLgorICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKKworICAvLyBTVEwtbGlrZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgRWxlbWVudCogaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgRWxlbWVudCogY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIGludCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICBpdGVyYXRvciBiZWdpbigpOworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworICBpdGVyYXRvciBlbmQoKTsKKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7CisKKyAgLy8gUmV2ZXJzZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7CisgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7CisgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgdGhlIHJlcGVhdGVkIGZpZWxkLCBleGNsdWRpbmcKKyAgLy8gc2l6ZW9mKCp0aGlzKQorICBpbnQgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbFNpemUgPSAwOworCisgIEVsZW1lbnQqIGVsZW1lbnRzXzsKKyAgaW50ICAgICAgY3VycmVudF9zaXplXzsKKyAgaW50ICAgICAgdG90YWxfc2l6ZV87CisKKyAgLy8gTW92ZSB0aGUgY29udGVudHMgb2YgfGZyb218IGludG8gfHRvfCwgcG9zc2libHkgY2xvYmJlcmluZyB8ZnJvbXwgaW4gdGhlCisgIC8vIHByb2Nlc3MuICBGb3IgcHJpbWl0aXZlIHR5cGVzIHRoaXMgaXMganVzdCBhIG1lbWNweSgpLCBidXQgaXQgY291bGQgYmUKKyAgLy8gc3BlY2lhbGl6ZWQgZm9yIG5vbi1wcmltaXRpdmUgdHlwZXMgdG8sIHNheSwgc3dhcCBlYWNoIGVsZW1lbnQgaW5zdGVhZC4KKyAgdm9pZCBNb3ZlQXJyYXkoRWxlbWVudCB0b1tdLCBFbGVtZW50IGZyb21bXSwgaW50IHNpemUpOworCisgIC8vIENvcHkgdGhlIGVsZW1lbnRzIG9mIHxmcm9tfCBpbnRvIHx0b3wuCisgIHZvaWQgQ29weUFycmF5KEVsZW1lbnQgdG9bXSwgY29uc3QgRWxlbWVudCBmcm9tW10sIGludCBzaXplKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXQ+IGNsYXNzIFJlcGVhdGVkUHRySXRlcmF0b3I7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXQsIHR5cGVuYW1lIFZvaWRQdHI+IGNsYXNzIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGlzIGEgaGVscGVyIHRlbXBsYXRlIHRvIGNvcHkgYW4gYXJyYXkgb2YgZWxlbWVudHMgZWZmZWNpZW50bHkgd2hlbiB0aGV5CisvLyBoYXZlIGEgdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yLCBhbmQgY29ycmVjdGx5IG90aGVyd2lzZS4gVGhpcyByZWFsbHkKKy8vIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCBvdXIgY29tcGlsZXIgZG9lc24ndCBvcHRpbWl6ZSBzdGQ6OmNvcHkgdmVyeQorLy8gZWZmZWN0aXZlbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudCwKKyAgICAgICAgICBib29sIEhhc1RyaXZpYWxDb3B5ID0gaGFzX3RyaXZpYWxfY29weTxFbGVtZW50Pjo6dmFsdWU+CitzdHJ1Y3QgRWxlbWVudENvcGllciB7CisgIHZvaWQgb3BlcmF0b3IoKShFbGVtZW50IHRvW10sIGNvbnN0IEVsZW1lbnQgZnJvbVtdLCBpbnQgYXJyYXlfc2l6ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIFJlcGVhdGVkUHRyRmllbGRzLiAgSXQgZGVhbHMgb25seSBpbiB2b2lkKgorLy8gcG9pbnRlcnMuICBVc2VycyBzaG91bGQgbm90IHVzZSB0aGlzIGludGVyZmFjZSBkaXJlY3RseS4KKy8vCisvLyBUaGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSBjb3JyZXNwb25kIHRvIHRoZSBtZXRob2RzIG9mIFJlcGVhdGVkUHRyRmllbGQsCisvLyBidXQgbWF5IGhhdmUgYSB0ZW1wbGF0ZSBhcmd1bWVudCBjYWxsZWQgVHlwZUhhbmRsZXIuICBJdHMgc2lnbmF0dXJlIGlzOgorLy8gICBjbGFzcyBUeXBlSGFuZGxlciB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgdHlwZWRlZiBNeVR5cGUgVHlwZTsKKy8vICAgICBzdGF0aWMgVHlwZSogTmV3KCk7CisvLyAgICAgc3RhdGljIHZvaWQgRGVsZXRlKFR5cGUqKTsKKy8vICAgICBzdGF0aWMgdm9pZCBDbGVhcihUeXBlKik7CisvLyAgICAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgVHlwZSYgZnJvbSwgVHlwZSogdG8pOworLy8KKy8vICAgICAvLyBPbmx5IG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGlmIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBpcyBjYWxsZWQuCisvLyAgICAgc3RhdGljIGludCBTcGFjZVVzZWQoY29uc3QgVHlwZSYpOworLy8gICB9OworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFJlcGVhdGVkUHRyRmllbGRCYXNlIHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFRoZSByZWZsZWN0aW9uIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIGNhbGwgcHJvdGVjdGVkIG1ldGhvZHMgZGlyZWN0bHksCisgIC8vIHJlaW50ZXJwcmV0aW5nIHBvaW50ZXJzIGFzIGJlaW5nIHRvIE1lc3NhZ2UgaW5zdGVhZCBvZiBhIHNwZWNpZmljIE1lc3NhZ2UKKyAgLy8gc3ViY2xhc3MuCisgIGZyaWVuZCBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKKworICAvLyBFeHRlbnNpb25TZXQgc3RvcmVzIHJlcGVhdGVkIG1lc3NhZ2UgZXh0ZW5zaW9ucyBhcworICAvLyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiwgYnV0IG5vbi1saXRlIEV4dGVuc2lvblNldHMgbmVlZCB0bworICAvLyBpbXBsZW1lbnQgU3BhY2VVc2VkKCksIGFuZCB0aHVzIG5lZWQgdG8gY2FsbCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkKKyAgLy8gcmVpbnRlcnByZXRpbmcgTWVzc2FnZUxpdGUgYXMgTWVzc2FnZS4gIEV4dGVuc2lvblNldCBhbHNvIG5lZWRzIHRvIG1ha2UKKyAgLy8gdXNlIG9mIEFkZEZyb21DbGVhcmVkKCksIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgorICBmcmllbmQgY2xhc3MgRXh0ZW5zaW9uU2V0OworCisgIC8vIFRvIHBhcnNlIGRpcmVjdGx5IGludG8gYSBwcm90bzIgZ2VuZXJhdGVkIGNsYXNzLCB0aGUgdXBiIGNsYXNzIEdNUl9IYW5kbGVycworICAvLyBuZWVkcyB0byBiZSBhYmxlIHRvIG1vZGlmeSBhIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRpcmVjdGx5LgorICBmcmllbmQgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIHVwYjo6Z29vZ2xlX29wZW5zb3VyY2U6OkdNUl9IYW5kbGVyczsKKworICBSZXBlYXRlZFB0ckZpZWxkQmFzZSgpOworCisgIC8vIE11c3QgYmUgY2FsbGVkIGZyb20gZGVzdHJ1Y3Rvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB2b2lkIERlc3Ryb3koKTsKKworICBpbnQgc2l6ZSgpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUmIEdldChpbnQgaW5kZXgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBNdXRhYmxlKGludCBpbmRleCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIEFkZCgpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgUmVtb3ZlTGFzdCgpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgQ2xlYXIoKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB2b2lkIE1lcmdlRnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgQ29weUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIG90aGVyKTsKKworICB2b2lkIENsb3NlR2FwKGludCBzdGFydCwgaW50IG51bSkgeworICAgIC8vIENsb3NlIHVwIGEgZ2FwIG9mICJudW0iIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IG9mZnNldCAic3RhcnQiLgorICAgIGZvciAoaW50IGkgPSBzdGFydCArIG51bTsgaSA8IGFsbG9jYXRlZF9zaXplXzsgKytpKQorICAgICAgZWxlbWVudHNfW2kgLSBudW1dID0gZWxlbWVudHNfW2ldOworICAgIGN1cnJlbnRfc2l6ZV8gLT0gbnVtOworICAgIGFsbG9jYXRlZF9zaXplXyAtPSBudW07CisgIH0KKworICB2b2lkIFJlc2VydmUoaW50IG5ld19zaXplKTsKKworICBpbnQgQ2FwYWNpdHkoKSBjb25zdDsKKworICAvLyBVc2VkIGZvciBjb25zdHJ1Y3RpbmcgaXRlcmF0b3JzLgorICB2b2lkKiBjb25zdCogcmF3X2RhdGEoKSBjb25zdDsKKyAgdm9pZCoqIHJhd19tdXRhYmxlX2RhdGEoKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiogbXV0YWJsZV9kYXRhKCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNvbnN0KiBkYXRhKCkgY29uc3Q7CisKKyAgdm9pZCBTd2FwKFJlcGVhdGVkUHRyRmllbGRCYXNlKiBvdGhlcik7CisKKyAgdm9pZCBTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4Mik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBpbnQgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0OworCisKKyAgLy8gQWR2YW5jZWQgbWVtb3J5IG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBMaWtlIEFkZCgpLCBidXQgaWYgdGhlcmUgYXJlIG5vIGNsZWFyZWQgb2JqZWN0cyB0byB1c2UsIHJldHVybnMgTlVMTC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogQWRkRnJvbUNsZWFyZWQoKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgQWRkQWxsb2NhdGVkKHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlbGVhc2VMYXN0KCk7CisKKyAgaW50IENsZWFyZWRDb3VudCgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgQWRkQ2xlYXJlZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZWxlYXNlQ2xlYXJlZCgpOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkUHRyRmllbGRCYXNlKTsKKworICBzdGF0aWMgY29uc3QgaW50IGtJbml0aWFsU2l6ZSA9IDA7CisKKyAgdm9pZCoqIGVsZW1lbnRzXzsKKyAgaW50ICAgIGN1cnJlbnRfc2l6ZV87CisgIGludCAgICBhbGxvY2F0ZWRfc2l6ZV87CisgIGludCAgICB0b3RhbF9zaXplXzsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNhc3Qodm9pZCogZWxlbWVudCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4oZWxlbWVudCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjYXN0KGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSo+KGVsZW1lbnQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJpY1R5cGU+CitjbGFzcyBHZW5lcmljVHlwZUhhbmRsZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBHZW5lcmljVHlwZSBUeXBlOworICBzdGF0aWMgR2VuZXJpY1R5cGUqIE5ldygpIHsgcmV0dXJuIG5ldyBHZW5lcmljVHlwZTsgfQorICBzdGF0aWMgdm9pZCBEZWxldGUoR2VuZXJpY1R5cGUqIHZhbHVlKSB7IGRlbGV0ZSB2YWx1ZTsgfQorICBzdGF0aWMgdm9pZCBDbGVhcihHZW5lcmljVHlwZSogdmFsdWUpIHsgdmFsdWUtPkNsZWFyKCk7IH0KKyAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgR2VuZXJpY1R5cGUmIGZyb20sIEdlbmVyaWNUeXBlKiB0bykgeworICAgIHRvLT5NZXJnZUZyb20oZnJvbSk7CisgIH0KKyAgc3RhdGljIGludCBTcGFjZVVzZWQoY29uc3QgR2VuZXJpY1R5cGUmIHZhbHVlKSB7IHJldHVybiB2YWx1ZS5TcGFjZVVzZWQoKTsgfQorICBzdGF0aWMgY29uc3QgVHlwZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsgcmV0dXJuIFR5cGU6OmRlZmF1bHRfaW5zdGFuY2UoKTsgfQorfTsKKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46Ok1lcmdlKAorICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBmcm9tLCBNZXNzYWdlTGl0ZSogdG8pIHsKKyAgdG8tPkNoZWNrVHlwZUFuZE1lcmdlRnJvbShmcm9tKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBNZXNzYWdlTGl0ZSYgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgLy8gWWVzLCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNvZGUgaXMgdW5kZWZpbmVkLCBidXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5CisgIC8vIGNhbGxlZCB3aGVuIHdlJ3JlIGFscmVhZHkgZGVlcCBpbnRvIHRoZSB3b3JsZCBvZiB1bmRlZmluZWQsIGJlY2F1c2UgdGhlCisgIC8vIGNhbGxlciBjYWxsZWQgR2V0KGluZGV4KSBvdXQgb2YgYm91bmRzLgorICBNZXNzYWdlTGl0ZSogbnVsbCA9IE5VTEw7CisgIHJldHVybiAqbnVsbDsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBNZXNzYWdlJiBHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT46OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIC8vIFllcywgdGhlIGJlaGF2aW9yIG9mIHRoZSBjb2RlIGlzIHVuZGVmaW5lZCwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgb25seQorICAvLyBjYWxsZWQgd2hlbiB3ZSdyZSBhbHJlYWR5IGRlZXAgaW50byB0aGUgd29ybGQgb2YgdW5kZWZpbmVkLCBiZWNhdXNlIHRoZQorICAvLyBjYWxsZXIgY2FsbGVkIEdldChpbmRleCkgb3V0IG9mIGJvdW5kcy4KKyAgTWVzc2FnZSogbnVsbCA9IE5VTEw7CisgIHJldHVybiAqbnVsbDsKK30KKworCisvLyBIQUNLOiAgSWYgYSBjbGFzcyBpcyBkZWNsYXJlZCBhcyBETEwtZXhwb3J0ZWQgaW4gTVNWQywgaXQgaW5zaXN0cyBvbgorLy8gICBnZW5lcmF0aW5nIGNvcGllcyBvZiBhbGwgaXRzIG1ldGhvZHMgLS0gZXZlbiBpbmxpbmUgb25lcyAtLSB0byBpbmNsdWRlCisvLyAgIGluIHRoZSBETEwuICBCdXQgU3BhY2VVc2VkKCkgY2FsbHMgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIHdoaWNoCisvLyAgIGlzbid0IGluIHRoZSBsaXRlIGxpYnJhcnksIHRoZXJlZm9yZSB0aGUgbGl0ZSBsaWJyYXJ5IGNhbm5vdCBsaW5rIGlmCisvLyAgIFN0cmluZ1R5cGVIYW5kbGVyIGlzIGV4cG9ydGVkLiAgU28sIHdlIGZhY3RvciBvdXQgU3RyaW5nVHlwZUhhbmRsZXJCYXNlLAorLy8gICBleHBvcnQgdGhhdCwgdGhlbiBtYWtlIFN0cmluZ1R5cGVIYW5kbGVyIGJlIGEgc3ViY2xhc3Mgd2hpY2ggaXMgTk9UCisvLyAgIGV4cG9ydGVkLgorLy8gVE9ETyhrZW50b24pOiAgVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdUeXBlSGFuZGxlckJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBzdHJpbmcgVHlwZTsKKyAgc3RhdGljIHN0cmluZyogTmV3KCk7CisgIHN0YXRpYyB2b2lkIERlbGV0ZShzdHJpbmcqIHZhbHVlKTsKKyAgc3RhdGljIHZvaWQgQ2xlYXIoc3RyaW5nKiB2YWx1ZSkgeyB2YWx1ZS0+Y2xlYXIoKTsgfQorICBzdGF0aWMgdm9pZCBNZXJnZShjb25zdCBzdHJpbmcmIGZyb20sIHN0cmluZyogdG8pIHsgKnRvID0gZnJvbTsgfQorICBzdGF0aWMgY29uc3QgVHlwZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nOworICB9Cit9OworCitjbGFzcyBTdHJpbmdUeXBlSGFuZGxlciA6IHB1YmxpYyBTdHJpbmdUeXBlSGFuZGxlckJhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIGludCBTcGFjZVVzZWQoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgIHsKKyAgICByZXR1cm4gc2l6ZW9mKHZhbHVlKSArIFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYodmFsdWUpOworICB9Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBSZXBlYXRlZFB0ckZpZWxkIGlzIGxpa2UgUmVwZWF0ZWRGaWVsZCwgYnV0IHVzZWQgZm9yIHJlcGVhdGVkIHN0cmluZ3Mgb3IKKy8vIE1lc3NhZ2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkIDogcHVibGljIGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFzZSB7CisgcHVibGljOgorICBSZXBlYXRlZFB0ckZpZWxkKCk7CisgIFJlcGVhdGVkUHRyRmllbGQoY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KKyAgUmVwZWF0ZWRQdHJGaWVsZChJdGVyIGJlZ2luLCBjb25zdCBJdGVyJiBlbmQpOworICB+UmVwZWF0ZWRQdHJGaWVsZCgpOworCisgIFJlcGVhdGVkUHRyRmllbGQmIG9wZXJhdG9yPShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CisKKyAgaW50IHNpemUoKSBjb25zdDsKKworICBjb25zdCBFbGVtZW50JiBHZXQoaW50IGluZGV4KSBjb25zdDsKKyAgRWxlbWVudCogTXV0YWJsZShpbnQgaW5kZXgpOworICBFbGVtZW50KiBBZGQoKTsKKworICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgIC8vIE93bmVyc2hpcCBvZiB0aGUgZWxlbWVudCBpcyByZXRhaW5lZCBieSB0aGUgYXJyYXkuCisgIHZvaWQgUmVtb3ZlTGFzdCgpOworCisgIC8vIERlbGV0ZSBlbGVtZW50cyB3aXRoIGluZGljZXMgaW4gdGhlIHJhbmdlIFtzdGFydCAuLiBzdGFydCtudW0tMV0uCisgIC8vIENhdXRpb246IGltcGxlbWVudGF0aW9uIG1vdmVzIGFsbCBlbGVtZW50cyB3aXRoIGluZGljZXMgW3N0YXJ0K251bSAuLiBdLgorICAvLyBDYWxsaW5nIHRoaXMgcm91dGluZSBpbnNpZGUgYSBsb29wIGNhbiBjYXVzZSBxdWFkcmF0aWMgYmVoYXZpb3IuCisgIHZvaWQgRGVsZXRlU3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtKTsKKworICB2b2lkIENsZWFyKCk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CisKKyAgLy8gUmVzZXJ2ZSBzcGFjZSB0byBleHBhbmQgdGhlIGZpZWxkIHRvIGF0IGxlYXN0IHRoZSBnaXZlbiBzaXplLiAgVGhpcyBvbmx5CisgIC8vIHJlc2l6ZXMgdGhlIHBvaW50ZXIgYXJyYXk7IGl0IGRvZXNuJ3QgYWxsb2NhdGUgYW55IG9iamVjdHMuICBJZiB0aGUKKyAgLy8gYXJyYXkgaXMgZ3Jvd24sIGl0IHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IGRvdWJsZWQgaW4gc2l6ZS4KKyAgdm9pZCBSZXNlcnZlKGludCBuZXdfc2l6ZSk7CisKKyAgaW50IENhcGFjaXR5KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgdW5kZXJseWluZyBhcnJheS4gIFRoaXMgcG9pbnRlciBpcyBwb3NzaWJseSBpbnZhbGlkYXRlZCBieQorICAvLyBhbnkgYWRkIG9yIHJlbW92ZSBvcGVyYXRpb24uCisgIEVsZW1lbnQqKiBtdXRhYmxlX2RhdGEoKTsKKyAgY29uc3QgRWxlbWVudCogY29uc3QqIGRhdGEoKSBjb25zdDsKKworICAvLyBTd2FwIGVudGlyZSBjb250ZW50cyB3aXRoICJvdGhlciIuCisgIHZvaWQgU3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcik7CisKKyAgLy8gU3dhcCB0d28gZWxlbWVudHMuCisgIHZvaWQgU3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpOworCisgIC8vIFNUTC1saWtlIGl0ZXJhdG9yIHN1cHBvcnQKKyAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJJdGVyYXRvcjxFbGVtZW50PiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJJdGVyYXRvcjxjb25zdCBFbGVtZW50PiBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBFbGVtZW50IHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgaW50IHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworCisgIGl0ZXJhdG9yIGJlZ2luKCk7CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisgIGl0ZXJhdG9yIGVuZCgpOworICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAvLyBSZXZlcnNlIGl0ZXJhdG9yIHN1cHBvcnQKKyAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKworICAvLyBDdXN0b20gU1RMLWxpa2UgaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIGFuZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nCisgIC8vIHBvaW50ZXJzIHRvIEVsZW1lbnQgcmF0aGVyIHRoYW4gRWxlbWVudCBpdHNlbGYuCisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxFbGVtZW50LCB2b2lkKj4KKyAgcG9pbnRlcl9pdGVyYXRvcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yPGNvbnN0IEVsZW1lbnQsIGNvbnN0IHZvaWQqPgorICBjb25zdF9wb2ludGVyX2l0ZXJhdG9yOworICBwb2ludGVyX2l0ZXJhdG9yIHBvaW50ZXJfYmVnaW4oKTsKKyAgY29uc3RfcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2JlZ2luKCkgY29uc3Q7CisgIHBvaW50ZXJfaXRlcmF0b3IgcG9pbnRlcl9lbmQoKTsKKyAgY29uc3RfcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2VuZCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgKGFuIGVzdGltYXRlIG9mKSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgdGhlIHJlcGVhdGVkIGZpZWxkLAorICAvLyBleGNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4KKyAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdDsKKworICAvLyBBZHZhbmNlZCBtZW1vcnkgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBXaGVuIGhhcmRjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGJlY29tZXMgbmVjZXNzYXJ5IC0tIGFzIGl0IHNvbWV0aW1lcworICAvLyBkb2VzIGhlcmUgYXQgR29vZ2xlIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBtYXkgYmUgdXNlZnVsLgorCisgIC8vIEFkZCBhbiBhbHJlYWR5LWFsbG9jYXRlZCBvYmplY3QsIHBhc3Npbmcgb3duZXJzaGlwIHRvIHRoZQorICAvLyBSZXBlYXRlZFB0ckZpZWxkLgorICB2b2lkIEFkZEFsbG9jYXRlZChFbGVtZW50KiB2YWx1ZSk7CisgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IGFuZCByZXR1cm4gaXQsIHBhc3Npbmcgb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIuCisgIC8vIFJlcXVpcmVzOiAgc2l6ZSgpID4gMAorICBFbGVtZW50KiBSZWxlYXNlTGFzdCgpOworCisgIC8vIEV4dHJhY3QgZWxlbWVudHMgd2l0aCBpbmRpY2VzIGluIHRoZSByYW5nZSAiW3N0YXJ0IC4uIHN0YXJ0K251bS0xXSIuCisgIC8vIFRoZSBjYWxsZXIgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIGV4dHJhY3RlZCBlbGVtZW50cyBhbmQgaXMgcmVzcG9uc2libGUKKyAgLy8gZm9yIGRlbGV0aW5nIHRoZW0gd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLgorICAvLyBJZiAiZWxlbWVudHMiIGlzIG5vbi1OVUxMLCB0aGVuIHBvaW50ZXJzIHRvIHRoZSBleHRyYWN0ZWQgZWxlbWVudHMKKyAgLy8gYXJlIHN0b3JlZCBpbiAiZWxlbWVudHNbMCAuLiBudW0tMV0iIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGNhbGxlci4KKyAgLy8gSWYgImVsZW1lbnRzIiBpcyBOVUxMLCB0aGVuIHRoZSBjYWxsZXIgbXVzdCB1c2Ugc29tZSBvdGhlciBtZWNoYW5pc20KKyAgLy8gdG8gcGVyZm9ybSBhbnkgZnVydGhlciBvcGVyYXRpb25zIChsaWtlIGRlbGV0aW9uKSBvbiB0aGVzZSBlbGVtZW50cy4KKyAgLy8gQ2F1dGlvbjogaW1wbGVtZW50YXRpb24gYWxzbyBtb3ZlcyBlbGVtZW50cyB3aXRoIGluZGljZXMgW3N0YXJ0K251bSAuLl0uCisgIC8vIENhbGxpbmcgdGhpcyByb3V0aW5lIGluc2lkZSBhIGxvb3AgY2FuIGNhdXNlIHF1YWRyYXRpYyBiZWhhdmlvci4KKyAgdm9pZCBFeHRyYWN0U3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMpOworCisgIC8vIFdoZW4gZWxlbWVudHMgYXJlIHJlbW92ZWQgYnkgY2FsbHMgdG8gUmVtb3ZlTGFzdCgpIG9yIENsZWFyKCksIHRoZXkKKyAgLy8gYXJlIG5vdCBhY3R1YWxseSBmcmVlZC4gIEluc3RlYWQsIHRoZXkgYXJlIGNsZWFyZWQgYW5kIGtlcHQgc28gdGhhdAorICAvLyB0aGV5IGNhbiBiZSByZXVzZWQgbGF0ZXIuICBUaGlzIGNhbiBzYXZlIGxvdHMgb2YgQ1BVIHRpbWUgd2hlbgorICAvLyByZXBlYXRlZGx5IHJldXNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIGZvciBzaW1pbGFyIHB1cnBvc2VzLgorICAvLworICAvLyBIYXJkY29yZSBwcm9ncmFtcyBtYXkgY2hvb3NlIHRvIG1hbmlwdWxhdGUgdGhlc2UgY2xlYXJlZCBvYmplY3RzCisgIC8vIHRvIGJldHRlciBvcHRpbWl6ZSBtZW1vcnkgbWFuYWdlbWVudCB1c2luZyB0aGUgZm9sbG93aW5nIHJvdXRpbmVzLgorCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNsZWFyZWQgb2JqZWN0cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcga2VwdAorICAvLyBhcm91bmQgZm9yIHJldXNlLgorICBpbnQgQ2xlYXJlZENvdW50KCkgY29uc3Q7CisgIC8vIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBwb29sIG9mIGNsZWFyZWQgb2JqZWN0cywgcGFzc2luZyBvd25lcnNoaXAgdG8KKyAgLy8gdGhlIFJlcGVhdGVkUHRyRmllbGQuICBUaGUgZWxlbWVudCBtdXN0IGJlIGNsZWFyZWQgcHJpb3IgdG8gY2FsbGluZworICAvLyB0aGlzIG1ldGhvZC4KKyAgdm9pZCBBZGRDbGVhcmVkKEVsZW1lbnQqIHZhbHVlKTsKKyAgLy8gUmVtb3ZlIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSB0aGUgY2xlYXJlZCBwb29sIGFuZCByZXR1cm4gaXQsIHBhc3NpbmcKKyAgLy8gb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIuICBUaGUgZWxlbWVudCBpcyBndWFyYW50ZWVkIHRvIGJlIGNsZWFyZWQuCisgIC8vIFJlcXVpcmVzOiAgQ2xlYXJlZENvdW50KCkgPiAwCisgIEVsZW1lbnQqIFJlbGVhc2VDbGVhcmVkKCk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6ICBSZXBlYXRlZFB0ckZpZWxkIFNIT1VMRCBOT1QgYmUgc3ViY2xhc3NlZCBieSB1c2Vycy4gIFdlIG9ubHkKKyAgLy8gICBzdWJjbGFzcyBpdCBpbiBvbmUgcGxhY2UgYXMgYSBoYWNrIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLiAgVGhlCisgIC8vICAgc3ViY2xhc3MgbmVlZHMgdG8ga25vdyBhYm91dCBUeXBlSGFuZGxlciBpbiBvcmRlciB0byBjYWxsIHByb3RlY3RlZAorICAvLyAgIG1ldGhvZHMgb24gUmVwZWF0ZWRQdHJGaWVsZEJhc2UuCisgIGNsYXNzIFR5cGVIYW5kbGVyOworCit9OworCisvLyBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkRmllbGQoKQorICA6IGVsZW1lbnRzXyhOVUxMKSwKKyAgICBjdXJyZW50X3NpemVfKDApLAorICAgIHRvdGFsX3NpemVfKGtJbml0aWFsU2l6ZSkgeworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZEZpZWxkKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKQorICA6IGVsZW1lbnRzXyhOVUxMKSwKKyAgICBjdXJyZW50X3NpemVfKDApLAorICAgIHRvdGFsX3NpemVfKGtJbml0aWFsU2l6ZSkgeworICBDb3B5RnJvbShvdGhlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CitpbmxpbmUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZChJdGVyIGJlZ2luLCBjb25zdCBJdGVyJiBlbmQpCisgIDogZWxlbWVudHNfKE5VTEwpLAorICAgIGN1cnJlbnRfc2l6ZV8oMCksCisgICAgdG90YWxfc2l6ZV8oa0luaXRpYWxTaXplKSB7CisgIGZvciAoOyBiZWdpbiAhPSBlbmQ7ICsrYmVnaW4pIHsKKyAgICBBZGQoKmJlZ2luKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK1JlcGVhdGVkRmllbGQ8RWxlbWVudD46On5SZXBlYXRlZEZpZWxkKCkgeworICBkZWxldGUgW10gZWxlbWVudHNfOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+JgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6b3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKSB7CisgIGlmICh0aGlzICE9ICZvdGhlcikKKyAgICBDb3B5RnJvbShvdGhlcik7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgaW50IFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OnNpemUoKSBjb25zdCB7CisgIHJldHVybiBjdXJyZW50X3NpemVfOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBpbnQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Q2FwYWNpdHkoKSBjb25zdCB7CisgIHJldHVybiB0b3RhbF9zaXplXzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZEFscmVhZHlSZXNlcnZlZChjb25zdCBFbGVtZW50JiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLX0xUKHNpemUoKSwgQ2FwYWNpdHkoKSk7CisgIGVsZW1lbnRzX1tjdXJyZW50X3NpemVfKytdID0gdmFsdWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkQWxyZWFkeVJlc2VydmVkKCkgeworICBHT09HTEVfRENIRUNLX0xUKHNpemUoKSwgQ2FwYWNpdHkoKSk7CisgIHJldHVybiAmZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK107Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGNvbnN0IEVsZW1lbnQmIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkdldChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgc2l6ZSgpKTsKKyAgcmV0dXJuIGVsZW1lbnRzX1tpbmRleF07Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Ok11dGFibGUoaW50IGluZGV4KSB7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIHNpemUoKSk7CisgIHJldHVybiBlbGVtZW50c18gKyBpbmRleDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTZXQoaW50IGluZGV4LCBjb25zdCBFbGVtZW50JiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBzaXplKCkpOworICBlbGVtZW50c19baW5kZXhdID0gdmFsdWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkKGNvbnN0IEVsZW1lbnQmIHZhbHVlKSB7CisgIGlmIChjdXJyZW50X3NpemVfID09IHRvdGFsX3NpemVfKSBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7CisgIGVsZW1lbnRzX1tjdXJyZW50X3NpemVfKytdID0gdmFsdWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZCgpIHsKKyAgaWYgKGN1cnJlbnRfc2l6ZV8gPT0gdG90YWxfc2l6ZV8pIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKKyAgcmV0dXJuICZlbGVtZW50c19bY3VycmVudF9zaXplXysrXTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZW1vdmVMYXN0KCkgeworICBHT09HTEVfRENIRUNLX0dUKGN1cnJlbnRfc2l6ZV8sIDApOworICAtLWN1cnJlbnRfc2l6ZV87Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgordm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpFeHRyYWN0U3VicmFuZ2UoCisgICAgaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiBlbGVtZW50cykgeworICBHT09HTEVfRENIRUNLX0dFKHN0YXJ0LCAwKTsKKyAgR09PR0xFX0RDSEVDS19HRShudW0sIDApOworICBHT09HTEVfRENIRUNLX0xFKHN0YXJ0ICsgbnVtLCB0aGlzLT5zaXplKCkpOworCisgIC8vIFNhdmUgdGhlIHZhbHVlcyBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cyBpZiByZXF1ZXN0ZWQuCisgIGlmIChlbGVtZW50cyAhPSBOVUxMKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkKKyAgICAgIGVsZW1lbnRzW2ldID0gdGhpcy0+R2V0KGkgKyBzdGFydCk7CisgIH0KKworICAvLyBTbGlkZSByZW1haW5pbmcgZWxlbWVudHMgZG93biB0byBmaWxsIHRoZSBnYXAuCisgIGlmIChudW0gPiAwKSB7CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgbnVtOyBpIDwgdGhpcy0+c2l6ZSgpOyArK2kpCisgICAgICB0aGlzLT5TZXQoaSAtIG51bSwgdGhpcy0+R2V0KGkpKTsKKyAgICB0aGlzLT5UcnVuY2F0ZSh0aGlzLT5zaXplKCkgLSBudW0pOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Q2xlYXIoKSB7CisgIGN1cnJlbnRfc2l6ZV8gPSAwOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Ok1lcmdlRnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcikgeworICBpZiAob3RoZXIuY3VycmVudF9zaXplXyAhPSAwKSB7CisgICAgUmVzZXJ2ZShjdXJyZW50X3NpemVfICsgb3RoZXIuY3VycmVudF9zaXplXyk7CisgICAgQ29weUFycmF5KGVsZW1lbnRzXyArIGN1cnJlbnRfc2l6ZV8sIG90aGVyLmVsZW1lbnRzXywgb3RoZXIuY3VycmVudF9zaXplXyk7CisgICAgY3VycmVudF9zaXplXyArPSBvdGhlci5jdXJyZW50X3NpemVfOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Q29weUZyb20oY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpIHsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6bXV0YWJsZV9kYXRhKCkgeworICByZXR1cm4gZWxlbWVudHNfOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBjb25zdCBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpkYXRhKCkgY29uc3QgeworICByZXR1cm4gZWxlbWVudHNfOworfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgordm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTd2FwKFJlcGVhdGVkRmllbGQqIG90aGVyKSB7CisgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm47CisgIEVsZW1lbnQqIHN3YXBfZWxlbWVudHMgICAgID0gZWxlbWVudHNfOworICBpbnQgICAgICBzd2FwX2N1cnJlbnRfc2l6ZSA9IGN1cnJlbnRfc2l6ZV87CisgIGludCAgICAgIHN3YXBfdG90YWxfc2l6ZSAgID0gdG90YWxfc2l6ZV87CisKKyAgZWxlbWVudHNfICAgICA9IG90aGVyLT5lbGVtZW50c187CisgIGN1cnJlbnRfc2l6ZV8gPSBvdGhlci0+Y3VycmVudF9zaXplXzsKKyAgdG90YWxfc2l6ZV8gICA9IG90aGVyLT50b3RhbF9zaXplXzsKKworICBvdGhlci0+ZWxlbWVudHNfICAgICA9IHN3YXBfZWxlbWVudHM7CisgIG90aGVyLT5jdXJyZW50X3NpemVfID0gc3dhcF9jdXJyZW50X3NpemU7CisgIG90aGVyLT50b3RhbF9zaXplXyAgID0gc3dhcF90b3RhbF9zaXplOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgc3RkOjpzd2FwKGVsZW1lbnRzX1tpbmRleDFdLCBlbGVtZW50c19baW5kZXgyXSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplbmQoKSB7CisgIHJldHVybiBlbGVtZW50c18gKyBjdXJyZW50X3NpemVfOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkRmllbGQ8RWxlbWVudD46OmVuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGVsZW1lbnRzXyArIGN1cnJlbnRfc2l6ZV87Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgeworICByZXR1cm4gKGVsZW1lbnRzXyAhPSBOVUxMKSA/IHRvdGFsX3NpemVfICogc2l6ZW9mKGVsZW1lbnRzX1swXSkgOiAwOworfQorCisvLyBBdm9pZCBpbmxpbmluZyBvZiBSZXNlcnZlKCk6IG5ldywgY29weSwgYW5kIGRlbGV0ZVtdIGxlYWQgdG8gYSBzaWduaWZpY2FudAorLy8gYW1vdW50IG9mIGNvZGUgYmxvYXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVzZXJ2ZShpbnQgbmV3X3NpemUpIHsKKyAgaWYgKHRvdGFsX3NpemVfID49IG5ld19zaXplKSByZXR1cm47CisKKyAgRWxlbWVudCogb2xkX2VsZW1lbnRzID0gZWxlbWVudHNfOworICB0b3RhbF9zaXplXyA9IG1heChnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a01pblJlcGVhdGVkRmllbGRBbGxvY2F0aW9uU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbWF4KHRvdGFsX3NpemVfICogMiwgbmV3X3NpemUpKTsKKyAgZWxlbWVudHNfID0gbmV3IEVsZW1lbnRbdG90YWxfc2l6ZV9dOworICBpZiAob2xkX2VsZW1lbnRzICE9IE5VTEwpIHsKKyAgICBNb3ZlQXJyYXkoZWxlbWVudHNfLCBvbGRfZWxlbWVudHMsIGN1cnJlbnRfc2l6ZV8pOworICAgIGRlbGV0ZSBbXSBvbGRfZWxlbWVudHM7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpUcnVuY2F0ZShpbnQgbmV3X3NpemUpIHsKKyAgR09PR0xFX0RDSEVDS19MRShuZXdfc2l6ZSwgY3VycmVudF9zaXplXyk7CisgIGN1cnJlbnRfc2l6ZV8gPSBuZXdfc2l6ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpNb3ZlQXJyYXkoCisgICAgRWxlbWVudCB0b1tdLCBFbGVtZW50IGZyb21bXSwgaW50IGFycmF5X3NpemUpIHsKKyAgQ29weUFycmF5KHRvLCBmcm9tLCBhcnJheV9zaXplKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpDb3B5QXJyYXkoCisgICAgRWxlbWVudCB0b1tdLCBjb25zdCBFbGVtZW50IGZyb21bXSwgaW50IGFycmF5X3NpemUpIHsKKyAgaW50ZXJuYWw6OkVsZW1lbnRDb3BpZXI8RWxlbWVudD4oKSh0bywgZnJvbSwgYXJyYXlfc2l6ZSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50LCBib29sIEhhc1RyaXZpYWxDb3B5Pgordm9pZCBFbGVtZW50Q29waWVyPEVsZW1lbnQsIEhhc1RyaXZpYWxDb3B5Pjo6b3BlcmF0b3IoKSgKKyAgICBFbGVtZW50IHRvW10sIGNvbnN0IEVsZW1lbnQgZnJvbVtdLCBpbnQgYXJyYXlfc2l6ZSkgeworICBzdGQ6OmNvcHkoZnJvbSwgZnJvbSArIGFycmF5X3NpemUsIHRvKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitzdHJ1Y3QgRWxlbWVudENvcGllcjxFbGVtZW50LCB0cnVlPiB7CisgIHZvaWQgb3BlcmF0b3IoKShFbGVtZW50IHRvW10sIGNvbnN0IEVsZW1lbnQgZnJvbVtdLCBpbnQgYXJyYXlfc2l6ZSkgeworICAgIG1lbWNweSh0bywgZnJvbSwgYXJyYXlfc2l6ZSAqIHNpemVvZihFbGVtZW50KSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworaW5saW5lIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZXBlYXRlZFB0ckZpZWxkQmFzZSgpCisgIDogZWxlbWVudHNfKE5VTEwpLAorICAgIGN1cnJlbnRfc2l6ZV8oMCksCisgICAgYWxsb2NhdGVkX3NpemVfKDApLAorICAgIHRvdGFsX3NpemVfKGtJbml0aWFsU2l6ZSkgeworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Cit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpEZXN0cm95KCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGFsbG9jYXRlZF9zaXplXzsgaSsrKSB7CisgICAgVHlwZUhhbmRsZXI6OkRlbGV0ZShjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19baV0pKTsKKyAgfQorICBkZWxldGUgW10gZWxlbWVudHNfOworfQorCitpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpzaXplKCkgY29uc3QgeworICByZXR1cm4gY3VycmVudF9zaXplXzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlJgorUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkdldChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgc2l6ZSgpKTsKKyAgcmV0dXJuICpjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19baW5kZXhdKTsKK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqCitSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZShpbnQgaW5kZXgpIHsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgc2l6ZSgpKTsKKyAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tpbmRleF0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGQoKSB7CisgIGlmIChjdXJyZW50X3NpemVfIDwgYWxsb2NhdGVkX3NpemVfKSB7CisgICAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tjdXJyZW50X3NpemVfKytdKTsKKyAgfQorICBpZiAoYWxsb2NhdGVkX3NpemVfID09IHRvdGFsX3NpemVfKSBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7CisgICsrYWxsb2NhdGVkX3NpemVfOworICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0gVHlwZUhhbmRsZXI6Ok5ldygpOworICBlbGVtZW50c19bY3VycmVudF9zaXplXysrXSA9IHJlc3VsdDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlbW92ZUxhc3QoKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR1QoY3VycmVudF9zaXplXywgMCk7CisgIFR5cGVIYW5kbGVyOjpDbGVhcihjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19bLS1jdXJyZW50X3NpemVfXSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Cit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50X3NpemVfOyBpKyspIHsKKyAgICBUeXBlSGFuZGxlcjo6Q2xlYXIoY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfW2ldKSk7CisgIH0KKyAgY3VycmVudF9zaXplXyA9IDA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNZXJnZUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIG90aGVyKSB7CisgIFJlc2VydmUoY3VycmVudF9zaXplXyArIG90aGVyLmN1cnJlbnRfc2l6ZV8pOworICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyLmN1cnJlbnRfc2l6ZV87IGkrKykgeworICAgIFR5cGVIYW5kbGVyOjpNZXJnZShvdGhlci50ZW1wbGF0ZSBHZXQ8VHlwZUhhbmRsZXI+KGkpLCBBZGQ8VHlwZUhhbmRsZXI+KCkpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDb3B5RnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsZWFyPFR5cGVIYW5kbGVyPigpOworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TWVyZ2VGcm9tPFR5cGVIYW5kbGVyPihvdGhlcik7Cit9CisKK2lubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNhcGFjaXR5KCkgY29uc3QgeworICByZXR1cm4gdG90YWxfc2l6ZV87Cit9CisKK2lubGluZSB2b2lkKiBjb25zdCogUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OnJhd19kYXRhKCkgY29uc3QgeworICByZXR1cm4gZWxlbWVudHNfOworfQorCitpbmxpbmUgdm9pZCoqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpyYXdfbXV0YWJsZV9kYXRhKCkgY29uc3QgeworICByZXR1cm4gZWxlbWVudHNfOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6bXV0YWJsZV9kYXRhKCkgeworICAvLyBUT0RPKGtlbnRvbik6ICBCcmVha3MgQysrIGFsaWFzaW5nIHJ1bGVzLiAgV2Ugc2hvdWxkIHByb2JhYmx5IHJlbW92ZSB0aGlzCisgIC8vICAgbWV0aG9kIGVudGlyZWx5LgorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSoqPihlbGVtZW50c18pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNvbnN0KgorUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmRhdGEoKSBjb25zdCB7CisgIC8vIFRPRE8oa2VudG9uKTogIEJyZWFrcyBDKysgYWxpYXNpbmcgcnVsZXMuICBXZSBzaG91bGQgcHJvYmFibHkgcmVtb3ZlIHRoaXMKKyAgLy8gICBtZXRob2QgZW50aXJlbHkuCisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb25zdCo+KGVsZW1lbnRzXyk7Cit9CisKK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4MikgeworICBzdGQ6OnN3YXAoZWxlbWVudHNfW2luZGV4MV0sIGVsZW1lbnRzX1tpbmRleDJdKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0IHsKKyAgaW50IGFsbG9jYXRlZF9ieXRlcyA9CisgICAgICAoZWxlbWVudHNfICE9IE5VTEwpID8gdG90YWxfc2l6ZV8gKiBzaXplb2YoZWxlbWVudHNfWzBdKSA6IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb2NhdGVkX3NpemVfOyArK2kpIHsKKyAgICBhbGxvY2F0ZWRfYnl0ZXMgKz0gVHlwZUhhbmRsZXI6OlNwYWNlVXNlZCgqY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfW2ldKSk7CisgIH0KKyAgcmV0dXJuIGFsbG9jYXRlZF9ieXRlczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkRnJvbUNsZWFyZWQoKSB7CisgIGlmIChjdXJyZW50X3NpemVfIDwgYWxsb2NhdGVkX3NpemVfKSB7CisgICAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tjdXJyZW50X3NpemVfKytdKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Cit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRBbGxvY2F0ZWQoCisgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKSB7CisgIC8vIE1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBwb2ludGVyLgorICBpZiAoY3VycmVudF9zaXplXyA9PSB0b3RhbF9zaXplXykgeworICAgIC8vIFRoZSBhcnJheSBpcyBjb21wbGV0ZWx5IGZ1bGwgd2l0aCBubyBjbGVhcmVkIG9iamVjdHMsIHNvIGdyb3cgaXQuCisgICAgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOworICAgICsrYWxsb2NhdGVkX3NpemVfOworICB9IGVsc2UgaWYgKGFsbG9jYXRlZF9zaXplXyA9PSB0b3RhbF9zaXplXykgeworICAgIC8vIFRoZXJlIGlzIG5vIG1vcmUgc3BhY2UgaW4gdGhlIHBvaW50ZXIgYXJyYXkgYmVjYXVzZSBpdCBjb250YWlucyBzb21lCisgICAgLy8gY2xlYXJlZCBvYmplY3RzIGF3YWl0aW5nIHJldXNlLiAgV2UgZG9uJ3Qgd2FudCB0byBncm93IHRoZSBhcnJheSBpbiB0aGlzCisgICAgLy8gY2FzZSBiZWNhdXNlIG90aGVyd2lzZSBhIGxvb3AgY2FsbGluZyBBZGRBbGxvY2F0ZWQoKSBmb2xsb3dlZCBieSBDbGVhcigpCisgICAgLy8gd291bGQgbGVhayBtZW1vcnkuCisgICAgVHlwZUhhbmRsZXI6OkRlbGV0ZShjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19bY3VycmVudF9zaXplX10pKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X3NpemVfIDwgYWxsb2NhdGVkX3NpemVfKSB7CisgICAgLy8gV2UgaGF2ZSBzb21lIGNsZWFyZWQgb2JqZWN0cy4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlaXIgb3JkZXIsIHNvIHdlCisgICAgLy8gY2FuIGp1c3QgbW92ZSB0aGUgZmlyc3Qgb25lIHRvIHRoZSBlbmQgdG8gbWFrZSBzcGFjZS4KKyAgICBlbGVtZW50c19bYWxsb2NhdGVkX3NpemVfXSA9IGVsZW1lbnRzX1tjdXJyZW50X3NpemVfXTsKKyAgICArK2FsbG9jYXRlZF9zaXplXzsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGVyZSBhcmUgbm8gY2xlYXJlZCBvYmplY3RzLgorICAgICsrYWxsb2NhdGVkX3NpemVfOworICB9CisKKyAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUxhc3QoKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR1QoY3VycmVudF9zaXplXywgMCk7CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiByZXN1bHQgPQorICAgICAgY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfWy0tY3VycmVudF9zaXplX10pOworICAtLWFsbG9jYXRlZF9zaXplXzsKKyAgaWYgKGN1cnJlbnRfc2l6ZV8gPCBhbGxvY2F0ZWRfc2l6ZV8pIHsKKyAgICAvLyBUaGVyZSBhcmUgY2xlYXJlZCBlbGVtZW50cyBvbiB0aGUgZW5kOyByZXBsYWNlIHRoZSByZW1vdmVkIGVsZW1lbnQKKyAgICAvLyB3aXRoIHRoZSBsYXN0IGFsbG9jYXRlZCBlbGVtZW50LgorICAgIGVsZW1lbnRzX1tjdXJyZW50X3NpemVfXSA9IGVsZW1lbnRzX1thbGxvY2F0ZWRfc2l6ZV9dOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2lubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsZWFyZWRDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGFsbG9jYXRlZF9zaXplXyAtIGN1cnJlbnRfc2l6ZV87Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRDbGVhcmVkKAorICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSkgeworICBpZiAoYWxsb2NhdGVkX3NpemVfID09IHRvdGFsX3NpemVfKSBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7CisgIGVsZW1lbnRzX1thbGxvY2F0ZWRfc2l6ZV8rK10gPSB2YWx1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUNsZWFyZWQoKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR1QoYWxsb2NhdGVkX3NpemVfLCBjdXJyZW50X3NpemVfKTsKKyAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1stLWFsbG9jYXRlZF9zaXplX10pOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlR5cGVIYW5kbGVyCisgICAgOiBwdWJsaWMgaW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjxFbGVtZW50PiB7Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjpUeXBlSGFuZGxlcgorICAgIDogcHVibGljIGludGVybmFsOjpTdHJpbmdUeXBlSGFuZGxlciB7Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkUHRyRmllbGQoKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZFB0ckZpZWxkKAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKSB7CisgIENvcHlGcm9tKG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZFB0ckZpZWxkKAorICAgIEl0ZXIgYmVnaW4sIGNvbnN0IEl0ZXImIGVuZCkgeworICBmb3IgKDsgYmVnaW4gIT0gZW5kOyArK2JlZ2luKSB7CisgICAgKkFkZCgpID0gKmJlZ2luOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6flJlcGVhdGVkUHRyRmllbGQoKSB7CisgIERlc3Ryb3k8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD4mIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Om9wZXJhdG9yPSgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcikgeworICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgQ29weUZyb20ob3RoZXIpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpzaXplKCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OnNpemUoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgY29uc3QgRWxlbWVudCYgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6R2V0KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkdldDxUeXBlSGFuZGxlcj4oaW5kZXgpOworfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Ok11dGFibGUoaW50IGluZGV4KSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpBZGQoKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkPFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlbW92ZUxhc3QoKSB7CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZW1vdmVMYXN0PFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkRlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSkgeworICBHT09HTEVfRENIRUNLX0dFKHN0YXJ0LCAwKTsKKyAgR09PR0xFX0RDSEVDS19HRShudW0sIDApOworICBHT09HTEVfRENIRUNLX0xFKHN0YXJ0ICsgbnVtLCBzaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKQorICAgIGRlbGV0ZSBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oc3RhcnQgKyBpKTsKKyAgRXh0cmFjdFN1YnJhbmdlKHN0YXJ0LCBudW0sIE5VTEwpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkV4dHJhY3RTdWJyYW5nZSgKKyAgICBpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cykgeworICBHT09HTEVfRENIRUNLX0dFKHN0YXJ0LCAwKTsKKyAgR09PR0xFX0RDSEVDS19HRShudW0sIDApOworICBHT09HTEVfRENIRUNLX0xFKHN0YXJ0ICsgbnVtLCBzaXplKCkpOworCisgIGlmIChudW0gPiAwKSB7CisgICAgLy8gU2F2ZSB0aGUgdmFsdWVzIG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzIGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoZWxlbWVudHMgIT0gTlVMTCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkKKyAgICAgICAgZWxlbWVudHNbaV0gPSBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oaSArIHN0YXJ0KTsKKyAgICB9CisgICAgQ2xvc2VHYXAoc3RhcnQsIG51bSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpDbGVhcigpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsZWFyPFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Ok1lcmdlRnJvbSgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcikgeworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TWVyZ2VGcm9tPFR5cGVIYW5kbGVyPihvdGhlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Q29weUZyb20oCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNvcHlGcm9tPFR5cGVIYW5kbGVyPihvdGhlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqKiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjptdXRhYmxlX2RhdGEoKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6bXV0YWJsZV9kYXRhPFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBjb25zdCBFbGVtZW50KiBjb25zdCogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6ZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpkYXRhPFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6U3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcikgeworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcChvdGhlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgordm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4MikgeworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZjxUeXBlSGFuZGxlcj4oKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpBZGRBbGxvY2F0ZWQoRWxlbWVudCogdmFsdWUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZEFsbG9jYXRlZDxUeXBlSGFuZGxlcj4odmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZWxlYXNlTGFzdCgpIHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZWxlYXNlTGFzdDxUeXBlSGFuZGxlcj4oKTsKK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Q2xlYXJlZENvdW50KCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsZWFyZWRDb3VudCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkFkZENsZWFyZWQoRWxlbWVudCogdmFsdWUpIHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRDbGVhcmVkPFR5cGVIYW5kbGVyPih2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlbGVhc2VDbGVhcmVkKCkgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlbGVhc2VDbGVhcmVkPFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlc2VydmUoaW50IG5ld19zaXplKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVzZXJ2ZShuZXdfc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpDYXBhY2l0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDYXBhY2l0eSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFNUTC1saWtlIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBSZXBlYXRlZFB0ckZpZWxkLiAgWW91IHNob3VsZCBub3QKKy8vIHJlZmVyIHRvIHRoaXMgY2xhc3MgZGlyZWN0bHk7IHVzZSBSZXBlYXRlZFB0ckZpZWxkPFQ+OjppdGVyYXRvciBpbnN0ZWFkLgorLy8KKy8vIFRoZSBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZDxUPiwgUmVwZWF0ZWRQdHJJdGVyYXRvcjxUPiwgaXMKKy8vIHZlcnkgc2ltaWxhciB0byBpdGVyYXRvcl9wdHI8VCoqPiBpbiB1dGlsL2d0bC9pdGVyYXRvcl9hZGFwdG9ycy5oLAorLy8gYnV0IGFkZHMgcmFuZG9tLWFjY2VzcyBvcGVyYXRvcnMgYW5kIGlzIG1vZGlmaWVkIHRvIHdyYXAgYSB2b2lkKiogYmFzZQorLy8gaXRlcmF0b3IgKHNpbmNlIFJlcGVhdGVkUHRyRmllbGQgc3RvcmVzIGl0cyBhcnJheSBhcyBhIHZvaWQqIGFycmF5IGFuZAorLy8gY2FzdGluZyB2b2lkKiogdG8gVCoqIHdvdWxkIHZpb2xhdGUgQysrIGFsaWFzaW5nIHJ1bGVzKS4KKy8vCisvLyBUaGlzIGNvZGUgYmFzZWQgb24gbmV0L3Byb3RvL3Byb3RvLWFycmF5LWludGVybmFsLmggYnkgSmVmZnJleSBZYXNza2luCisvLyAoanlhc3NraW5AZ29vZ2xlLmNvbSkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgorY2xhc3MgUmVwZWF0ZWRQdHJJdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8CisgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgRWxlbWVudD4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSZXBlYXRlZFB0ckl0ZXJhdG9yPEVsZW1lbnQ+IGl0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3I8CisgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgRWxlbWVudD4gc3VwZXJjbGFzczsKKworICAvLyBMZXQgdGhlIGNvbXBpbGVyIGtub3cgdGhhdCB0aGVzZSBhcmUgdHlwZSBuYW1lcywgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAvLyB3cml0ZSAidHlwZW5hbWUiIGluIGZyb250IG9mIHRoZW0gZXZlcnl3aGVyZS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyY2xhc3M6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIFJlcGVhdGVkUHRySXRlcmF0b3IoKSA6IGl0XyhOVUxMKSB7fQorICBleHBsaWNpdCBSZXBlYXRlZFB0ckl0ZXJhdG9yKHZvaWQqIGNvbnN0KiBpdCkgOiBpdF8oaXQpIHt9CisKKyAgLy8gQWxsb3cgInVwY2FzdGluZyIgZnJvbSBSZXBlYXRlZFB0ckl0ZXJhdG9yPFQqKj4gdG8KKyAgLy8gUmVwZWF0ZWRQdHJJdGVyYXRvcjxjb25zdCBUKmNvbnN0Kj4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRWxlbWVudD4KKyAgUmVwZWF0ZWRQdHJJdGVyYXRvcihjb25zdCBSZXBlYXRlZFB0ckl0ZXJhdG9yPE90aGVyRWxlbWVudD4mIG90aGVyKQorICAgICAgOiBpdF8ob3RoZXIuaXRfKSB7CisgICAgLy8gRm9yY2UgYSBjb21waWxlciBlcnJvciBpZiB0aGUgb3RoZXIgdHlwZSBpcyBub3QgY29udmVydGlibGUgdG8gb3Vycy4KKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIGltcGxpY2l0X2Nhc3Q8RWxlbWVudCosIE90aGVyRWxlbWVudCo+KDApOworICAgIH0KKyAgfQorCisgIC8vIGRlcmVmZXJlbmNlYWJsZQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8RWxlbWVudCo+KCppdF8pOyB9CisgIHBvaW50ZXIgICBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAvLyB7aW5jLGRlY31yZW1lbnRhYmxlCisgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyArK2l0XzsgcmV0dXJuICp0aGlzOyB9CisgIGl0ZXJhdG9yICBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfKyspOyB9CisgIGl0ZXJhdG9yJiBvcGVyYXRvci0tKCkgeyAtLWl0XzsgcmV0dXJuICp0aGlzOyB9CisgIGl0ZXJhdG9yICBvcGVyYXRvci0tKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfLS0pOyB9CisKKyAgLy8gZXF1YWxpdHlfY29tcGFyYWJsZQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA9PSB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyAhPSB4Lml0XzsgfQorCisgIC8vIGxlc3NfdGhhbl9jb21wYXJhYmxlCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPCB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA8PSB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfID4geC5pdF87IH0KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPj0geC5pdF87IH0KKworICAvLyBhZGRhYmxlLCBzdWJ0cmFjdGFibGUKKyAgaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdF8gKz0gZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yKyhpdGVyYXRvciBpdCwgZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdCArPSBkOworICAgIHJldHVybiBpdDsKKyAgfQorICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBkLCBpdGVyYXRvciBpdCkgeworICAgIGl0ICs9IGQ7CisgICAgcmV0dXJuIGl0OworICB9CisgIGl0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXRfIC09IGQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvci0oaXRlcmF0b3IgaXQsIGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXQgLT0gZDsKKyAgICByZXR1cm4gaXQ7CisgIH0KKworICAvLyBpbmRleGFibGUKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIGQpIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBkKTsgfQorCisgIC8vIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IKKyAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfIC0geC5pdF87IH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRWxlbWVudD4KKyAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkUHRySXRlcmF0b3I7CisKKyAgLy8gVGhlIGludGVybmFsIGl0ZXJhdG9yLgorICB2b2lkKiBjb25zdCogaXRfOworfTsKKworLy8gUHJvdmlkZSBhbiBpdGVyYXRvciB0aGF0IG9wZXJhdGVzIG9uIHBvaW50ZXJzIHRvIHRoZSB1bmRlcmx5aW5nIG9iamVjdHMKKy8vIHJhdGhlciB0aGFuIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXMgUmVwZWF0ZWRQdHJJdGVyYXRvciBkb2VzLgorLy8gQ29uc2lkZXIgdXNpbmcgdGhpcyB3aGVuIHdvcmtpbmcgd2l0aCBzdGwgYWxnb3JpdGhtcyB0aGF0IGNoYW5nZQorLy8gdGhlIGFycmF5LgorLy8gVGhlIFZvaWRQdHIgdGVtcGxhdGUgcGFyYW1ldGVyIGhvbGRzIHRoZSB0eXBlLWFnbm9zdGljIHBvaW50ZXIgdmFsdWUKKy8vIHJlZmVyZW5jZWQgYnkgdGhlIGl0ZXJhdG9yLiAgSXQgc2hvdWxkIGVpdGhlciBiZSAidm9pZCAqIiBmb3IgYSBtdXRhYmxlCisvLyBpdGVyYXRvciwgb3IgImNvbnN0IHZvaWQgKiIgZm9yIGEgY29uc3RhbnQgaXRlcmF0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50LCB0eXBlbmFtZSBWb2lkUHRyPgorY2xhc3MgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFbGVtZW50Kj4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3I8RWxlbWVudCwgVm9pZFB0cj4gaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjwKKyAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFbGVtZW50Kj4gc3VwZXJjbGFzczsKKworICAvLyBMZXQgdGhlIGNvbXBpbGVyIGtub3cgdGhhdCB0aGVzZSBhcmUgdHlwZSBuYW1lcywgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAvLyB3cml0ZSAidHlwZW5hbWUiIGluIGZyb250IG9mIHRoZW0gZXZlcnl3aGVyZS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyY2xhc3M6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcigpIDogaXRfKE5VTEwpIHt9CisgIGV4cGxpY2l0IFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcihWb2lkUHRyKiBpdCkgOiBpdF8oaXQpIHt9CisKKyAgLy8gZGVyZWZlcmVuY2VhYmxlCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxFbGVtZW50Kio+KGl0Xyk7IH0KKyAgcG9pbnRlciAgIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorCisgIC8vIHtpbmMsZGVjfXJlbWVudGFibGUKKyAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICsraXRfOyByZXR1cm4gKnRoaXM7IH0KKyAgaXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiBpdGVyYXRvcihpdF8rKyk7IH0KKyAgaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IC0taXRfOyByZXR1cm4gKnRoaXM7IH0KKyAgaXRlcmF0b3IgIG9wZXJhdG9yLS0oaW50KSB7IHJldHVybiBpdGVyYXRvcihpdF8tLSk7IH0KKworICAvLyBlcXVhbGl0eV9jb21wYXJhYmxlCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfID09IHguaXRfOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfICE9IHguaXRfOyB9CisKKyAgLy8gbGVzc190aGFuX2NvbXBhcmFibGUKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA8IHguaXRfOyB9CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfIDw9IHguaXRfOyB9CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPiB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA+PSB4Lml0XzsgfQorCisgIC8vIGFkZGFibGUsIHN1YnRyYWN0YWJsZQorICBpdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgZCkgeworICAgIGl0XyArPSBkOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGl0ZXJhdG9yIGl0LCBkaWZmZXJlbmNlX3R5cGUgZCkgeworICAgIGl0ICs9IGQ7CisgICAgcmV0dXJuIGl0OworICB9CisgIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIGQsIGl0ZXJhdG9yIGl0KSB7CisgICAgaXQgKz0gZDsKKyAgICByZXR1cm4gaXQ7CisgIH0KKyAgaXRlcmF0b3ImIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdF8gLT0gZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yLShpdGVyYXRvciBpdCwgZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdCAtPSBkOworICAgIHJldHVybiBpdDsKKyAgfQorCisgIC8vIGluZGV4YWJsZQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgZCkgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIGQpOyB9CisKKyAgLy8gcmFuZG9tIGFjY2VzcyBpdGVyYXRvcgorICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gLSB4Lml0XzsgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJFbGVtZW50PgorICBmcmllbmQgY2xhc3MgUmVwZWF0ZWRQdHJJdGVyYXRvcjsKKworICAvLyBUaGUgaW50ZXJuYWwgaXRlcmF0b3IuCisgIFZvaWRQdHIqIGl0XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjppdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6YmVnaW4oKSB7CisgIHJldHVybiBpdGVyYXRvcihyYXdfZGF0YSgpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGl0ZXJhdG9yKHJhd19kYXRhKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6aXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmVuZCgpIHsKKyAgcmV0dXJuIGl0ZXJhdG9yKHJhd19kYXRhKCkgKyBzaXplKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmVuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGl0ZXJhdG9yKHJhd19kYXRhKCkgKyBzaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2l0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2JlZ2luKCkgeworICByZXR1cm4gcG9pbnRlcl9pdGVyYXRvcihyYXdfbXV0YWJsZV9kYXRhKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9iZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3IoY29uc3RfY2FzdDxjb25zdCB2b2lkKio+KHJhd19tdXRhYmxlX2RhdGEoKSkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9lbmQoKSB7CisgIHJldHVybiBwb2ludGVyX2l0ZXJhdG9yKHJhd19tdXRhYmxlX2RhdGEoKSArIHNpemUoKSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3IoCisgICAgICBjb25zdF9jYXN0PGNvbnN0IHZvaWQqKj4ocmF3X211dGFibGVfZGF0YSgpICsgc2l6ZSgpKSk7Cit9CisKKworLy8gSXRlcmF0b3JzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgZm9sbG93IHRoZSBzcGlyaXQgb2YgdGhlIFNUTAorLy8gc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvciBhbmQgc3RkOjpiYWNrX2luc2VydGVyIGJ1dCBhcmUgdGFpbG9yLW1hZGUKKy8vIGZvciBSZXBlYXRlZEZpZWxkIGFuZCBSZXBhdGVkUHRyRmllbGQuIFR5cGljYWwgdXNhZ2Ugd291bGQgYmU6CisvLworLy8gICBzdGQ6OmNvcHkoc29tZV9zZXF1ZW5jZS5iZWdpbigpLCBzb21lX3NlcXVlbmNlLmVuZCgpLAorLy8gICAgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihwcm90by5tdXRhYmxlX3NlcXVlbmNlKCkpKTsKKy8vCisvLyBQb3J0ZWQgYnkgam9oYW5uZXMgZnJvbSB1dGlsL2d0bC9wcm90by1hcnJheS1pdGVyYXRvcnMuaAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gQSBiYWNrIGluc2VydGVyIGZvciBSZXBlYXRlZEZpZWxkIG9iamVjdHMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIFQ+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IoCisgICAgICBSZXBlYXRlZEZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKQorICAgICAgOiBmaWVsZF8obXV0YWJsZV9maWVsZCkgeworICB9CisgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yPShjb25zdCBUJiB2YWx1ZSkgeworICAgIGZpZWxkXy0+QWRkKHZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKGludCAvKiB1bnVzZWQgKi8pIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIFJlcGVhdGVkRmllbGQ8VD4qIGZpZWxkXzsKK307CisKKy8vIEEgYmFjayBpbnNlcnRlciBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBvYmplY3RzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpvdXRwdXRfaXRlcmF0b3JfdGFnLCBUPiB7CisgcHVibGljOgorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yKAorICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkKKyAgICAgIDogZmllbGRfKG11dGFibGVfZmllbGQpIHsKKyAgfQorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oY29uc3QgVCYgdmFsdWUpIHsKKyAgICAqZmllbGRfLT5BZGQoKSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oCisgICAgICBjb25zdCBUKiBjb25zdCBwdHJfdG9fdmFsdWUpIHsKKyAgICAqZmllbGRfLT5BZGQoKSA9ICpwdHJfdG9fdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKigpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKyhpbnQgLyogdW51c2VkICovKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyBwcml2YXRlOgorICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBmaWVsZF87Cit9OworCisvLyBBIGJhY2sgaW5zZXJ0ZXIgZm9yIFJlcGVhdGVkUHRyRmllbGRzIHRoYXQgaW5zZXJ0cyBieSB0cmFuc2ZlcmluZyBvd25lcnNoaXAKKy8vIG9mIGEgcG9pbnRlci4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgVD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcigKKyAgICAgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpCisgICAgICA6IGZpZWxkXyhtdXRhYmxlX2ZpZWxkKSB7CisgIH0KKyAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3I9KAorICAgICAgVCogY29uc3QgcHRyX3RvX3ZhbHVlKSB7CisgICAgZmllbGRfLT5BZGRBbGxvY2F0ZWQocHRyX3RvX3ZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKAorICAgICAgaW50IC8qIHVudXNlZCAqLykgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogZmllbGRfOworfTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBQcm92aWRlcyBhIGJhY2sgaW5zZXJ0IGl0ZXJhdG9yIGZvciBSZXBlYXRlZEZpZWxkIGluc3RhbmNlcywKKy8vIHNpbWlsYXIgdG8gc3RkOjpiYWNrX2luc2VydGVyKCkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPgorUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihSZXBlYXRlZEZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPihtdXRhYmxlX2ZpZWxkKTsKK30KKworLy8gUHJvdmlkZXMgYSBiYWNrIGluc2VydCBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBpbnN0YW5jZXMsCisvLyBzaW1pbGFyIHRvIHN0ZDo6YmFja19pbnNlcnRlcigpLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4KK1JlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkgeworICByZXR1cm4gaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4obXV0YWJsZV9maWVsZCk7Cit9CisKKy8vIFNwZWNpYWwgYmFjayBpbnNlcnQgaXRlcmF0b3IgZm9yIFJlcGVhdGVkUHRyRmllbGQgaW5zdGFuY2VzLCBqdXN0IGluCisvLyBjYXNlIHNvbWVvbmUgd2FudHMgdG8gd3JpdGUgZ2VuZXJpYyB0ZW1wbGF0ZSBjb2RlIHRoYXQgY2FuIGFjY2VzcyBib3RoCisvLyBSZXBlYXRlZEZpZWxkcyBhbmQgUmVwZWF0ZWRQdHJGaWVsZHMgdXNpbmcgYSBjb21tb24gbmFtZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+CitSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKFJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+KG11dGFibGVfZmllbGQpOworfQorCisvLyBQcm92aWRlcyBhIGJhY2sgaW5zZXJ0IGl0ZXJhdG9yIGZvciBSZXBlYXRlZFB0ckZpZWxkIGluc3RhbmNlcworLy8gc2ltaWxhciB0byBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKSB3aGljaCB0cmFuc2ZlcnMgdGhlIG93bmVyc2hpcCB3aGlsZQorLy8gY29weWluZyBlbGVtZW50cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGludGVybmFsOjpBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+CitBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyKAorICAgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+KAorICAgICAgbXV0YWJsZV9maWVsZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwMTYyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTk1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHRnc0Bnb29nbGUuY29tIChUb20gU3p5bWFuc2tpKQorLy8KKy8vIFRlc3QgcmVmbGVjdGlvbiBtZXRob2RzIGZvciBhZ2dyZWdhdGUgYWNjZXNzIHRvIFJlcGVhdGVkW1B0cl1GaWVsZHMuCisvLyBUaGlzIHRlc3QgcHJvdG8yIG1ldGhvZHMgb24gYSBwcm90bzIgbGF5b3V0LgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCit1c2luZyB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U7Cit1c2luZyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOwordXNpbmcgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOworCituYW1lc3BhY2UgeworCitzdGF0aWMgaW50IEZ1bmMoaW50IGksIGludCBqKSB7CisgIHJldHVybiBpICogajsKK30KKworc3RhdGljIHN0cmluZyBTdHJGdW5jKGludCBpLCBpbnQgaikgeworICBzdHJpbmcgc3RyOworICBTU3RyaW5nUHJpbnRmKCZzdHIsICIlZCIsIEZ1bmMoaSwgNCkpOworICByZXR1cm4gc3RyOworfQorCisKK1RFU1QoUmVwZWF0ZWRGaWVsZFJlZmxlY3Rpb25UZXN0LCBSZWd1bGFyRmllbGRzKSB7CisgIFRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQzMihGdW5jKGksIDEpKTsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoRnVuYyhpLCAyKSk7CisgICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKFN0ckZ1bmMoaSwgNSkpOworICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYyhGdW5jKGksIDYpKTsKKyAgfQorCisgIC8vIEdldCBGaWVsZERlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9yZXBlYXRlZF9pbnQzMiA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfZG91YmxlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZG91YmxlIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfc3RyaW5nID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfc3RyaW5nIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIik7CisKKyAgLy8gR2V0IFJlcGVhdGVkRmllbGQgb2JqZWN0cyBmb3IgYWxsIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMj4mIHJmX2ludDMyID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGQ8aW50MzI+KG1lc3NhZ2UsIGZkX3JlcGVhdGVkX2ludDMyKTsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZDxkb3VibGU+JiByZl9kb3VibGUgPQorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRGaWVsZDxkb3VibGU+KG1lc3NhZ2UsIGZkX3JlcGVhdGVkX2RvdWJsZSk7CisKKyAgLy8gR2V0IG11dGFibGUgUmVwZWF0ZWRGaWVsZCBvYmplY3RzIGZvciBhbGwgZmllbGRzIG9mIGludGVyZXN0LgorICBSZXBlYXRlZEZpZWxkPGludDMyPiogbXJmX2ludDMyID0KKyAgICAgIHJlZmwtPk11dGFibGVSZXBlYXRlZEZpZWxkPGludDMyPigmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfaW50MzIpOworICBSZXBlYXRlZEZpZWxkPGRvdWJsZT4qIG1yZl9kb3VibGUgPQorICAgICAgcmVmbC0+TXV0YWJsZVJlcGVhdGVkRmllbGQ8ZG91YmxlPigmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZG91YmxlKTsKKworICAvLyBHZXQgUmVwZWF0ZWRQdHJGaWVsZCBvYmplY3RzIGZvciBhbGwgZmllbGRzIG9mIGludGVyZXN0LgorICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4mIHJwZl9zdHJpbmcgPQorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KG1lc3NhZ2UsIGZkX3JlcGVhdGVkX3N0cmluZyk7CisgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8Rm9yZWlnbk1lc3NhZ2U+JiBycGZfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkUHRyRmllbGQ8Rm9yZWlnbk1lc3NhZ2U+KAorICAgICAgICAgIG1lc3NhZ2UsIGZkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSk7CisgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4mIHJwZl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oCisgICAgICAgICAgbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKTsKKworICAvLyBHZXQgbXV0YWJsZSBSZXBlYXRlZFB0ckZpZWxkIG9iamVjdHMgZm9yIGFsbCBmaWVsZHMgb2YgaW50ZXJlc3QuCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogbXJwZl9zdHJpbmcgPQorICAgICAgcmVmbC0+TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfc3RyaW5nKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxGb3JlaWduTWVzc2FnZT4qIG1ycGZfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPk11dGFibGVSZXBlYXRlZFB0ckZpZWxkPEZvcmVpZ25NZXNzYWdlPigKKyAgICAgICAgICAmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogbXJwZl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPk11dGFibGVSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KAorICAgICAgICAgICZtZXNzYWdlLCBmZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gZG8gZ2V0IGFuZCBzZXRzIHRocm91Z2ggdGhlIFJlcGVhdGVkW1B0cl1GaWVsZCBvYmplY3RzLgorICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAvLyBDaGVjayBnZXRzIHRocm91Z2ggY29uc3Qgb2JqZWN0cy4KKyAgICBFWFBFQ1RfRVEocmZfaW50MzIuR2V0KGkpLCBGdW5jKGksIDEpKTsKKyAgICBFWFBFQ1RfRVEocmZfZG91YmxlLkdldChpKSwgRnVuYyhpLCAyKSk7CisgICAgRVhQRUNUX0VRKHJwZl9zdHJpbmcuR2V0KGkpLCBTdHJGdW5jKGksIDUpKTsKKyAgICBFWFBFQ1RfRVEocnBmX2ZvcmVpZ25fbWVzc2FnZS5HZXQoaSkuYygpLCBGdW5jKGksIDYpKTsKKyAgICBFWFBFQ1RfRVEoZG93bl9jYXN0PGNvbnN0IEZvcmVpZ25NZXNzYWdlKj4oJnJwZl9tZXNzYWdlLkdldChpKSktPmMoKSwKKyAgICAgICAgICAgICAgRnVuYyhpLCA2KSk7CisKKyAgICAvLyBDaGVjayBnZXRzIHRocm91Z2ggbXV0YWJsZSBvYmplY3RzLgorICAgIEVYUEVDVF9FUShtcmZfaW50MzItPkdldChpKSwgRnVuYyhpLCAxKSk7CisgICAgRVhQRUNUX0VRKG1yZl9kb3VibGUtPkdldChpKSwgRnVuYyhpLCAyKSk7CisgICAgRVhQRUNUX0VRKG1ycGZfc3RyaW5nLT5HZXQoaSksIFN0ckZ1bmMoaSwgNSkpOworICAgIEVYUEVDVF9FUShtcnBmX2ZvcmVpZ25fbWVzc2FnZS0+R2V0KGkpLmMoKSwgRnVuYyhpLCA2KSk7CisgICAgRVhQRUNUX0VRKGRvd25fY2FzdDxjb25zdCBGb3JlaWduTWVzc2FnZSo+KCZtcnBmX21lc3NhZ2UtPkdldChpKSktPmMoKSwKKyAgICAgICAgICAgICAgRnVuYyhpLCA2KSk7CisKKyAgICAvLyBDaGVjayBzZXRzIHRocm91Z2ggbXV0YWJsZSBvYmplY3RzLgorICAgIG1yZl9pbnQzMi0+U2V0KGksIEZ1bmMoaSwgLTEpKTsKKyAgICBtcmZfZG91YmxlLT5TZXQoaSwgRnVuYyhpLCAtMikpOworICAgIG1ycGZfc3RyaW5nLT5NdXRhYmxlKGkpLT5hc3NpZ24oU3RyRnVuYyhpLCAtNSkpOworICAgIG1ycGZfZm9yZWlnbl9tZXNzYWdlLT5NdXRhYmxlKGkpLT5zZXRfYyhGdW5jKGksIC02KSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoaSksIEZ1bmMoaSwgLTEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoaSksIEZ1bmMoaSwgLTIpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoaSksIFN0ckZ1bmMoaSwgLTUpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoaSkuYygpLCBGdW5jKGksIC02KSk7CisgICAgZG93bl9jYXN0PEZvcmVpZ25NZXNzYWdlKj4obXJwZl9tZXNzYWdlLT5NdXRhYmxlKGkpKS0+c2V0X2MoRnVuYyhpLCA3KSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKGkpLmMoKSwgRnVuYyhpLCA3KSk7CisgIH0KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisgIC8vIE1ha2Ugc3VyZSB0eXBlcyBhcmUgY2hlY2tlZCBjb3JyZWN0bHkgYXQgcnVudGltZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9vcHRpb25hbF9pbnQzMiA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7CisgIEVYUEVDVF9ERUFUSChyZWZsLT5HZXRSZXBlYXRlZEZpZWxkPGludDMyPigKKyAgICAgIG1lc3NhZ2UsIGZkX29wdGlvbmFsX2ludDMyKSwgInJlcXVpcmVzIGEgcmVwZWF0ZWQgZmllbGQiKTsKKyAgRVhQRUNUX0RFQVRIKHJlZmwtPkdldFJlcGVhdGVkRmllbGQ8ZG91YmxlPigKKyAgICAgIG1lc3NhZ2UsIGZkX3JlcGVhdGVkX2ludDMyKSwgIm5vdCB0aGUgcmlnaHQgdHlwZSIpOworICBFWFBFQ1RfREVBVEgocmVmbC0+R2V0UmVwZWF0ZWRQdHJGaWVsZDxUZXN0QWxsVHlwZXM+KAorICAgICAgbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSwgIndyb25nIHN1Ym1lc3NhZ2UgdHlwZSIpOworI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorfQorCisKKworCitURVNUKFJlcGVhdGVkRmllbGRSZWZsZWN0aW9uVGVzdCwgRXh0ZW5zaW9uRmllbGRzKSB7CisgIFRlc3RBbGxFeHRlbnNpb25zIGV4dGVuZGVkX21lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmwgPSBleHRlbmRlZF9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzYyA9IGV4dGVuZGVkX21lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIGV4dGVuZGVkX21lc3NhZ2UuQWRkRXh0ZW5zaW9uKAorICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCBGdW5jKGksIDEpKTsKKyAgfQorCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uID0KKyAgICAgIGRlc2MtPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgicmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uIik7CisgIEdPT0dMRV9DSEVDSyhmZF9yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gIT0gTlVMTCk7CisKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2ND4mIHJmX2ludDY0X2V4dGVuc2lvbiA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkPGludDY0PihleHRlbmRlZF9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uKTsKKworICBSZXBlYXRlZEZpZWxkPGludDY0PiogbXJmX2ludDY0X2V4dGVuc2lvbiA9CisgICAgICByZWZsLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZDxpbnQ2ND4oJmV4dGVuZGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAxKSwgcmZfaW50NjRfZXh0ZW5zaW9uLkdldChpKSk7CisgICAgbXJmX2ludDY0X2V4dGVuc2lvbi0+U2V0KGksIEZ1bmMoaSwgLTEpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAtMSksCisgICAgICAgIGV4dGVuZGVkX21lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sIGkpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzcwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzU3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUT0RPKGtlbnRvbik6ICBJbXByb3ZlIHRoaXMgdW5pdHRlc3QgdG8gYnJpbmcgaXQgdXAgdG8gdGhlIHN0YW5kYXJkcyBvZgorLy8gICBvdGhlciBwcm90bzIgdW5pdHRlc3RzLgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgewordXNpbmcgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczsKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKKy8vIFRlc3Qgb3BlcmF0aW9ucyBvbiBhIHNtYWxsIFJlcGVhdGVkRmllbGQuCitURVNUKFJlcGVhdGVkRmllbGQsIFNtYWxsKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAwKTsKKworICBmaWVsZC5BZGQoNSk7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDUpOworCisgIGZpZWxkLkFkZCg0Mik7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDEpLCA0Mik7CisKKyAgZmllbGQuU2V0KDEsIDIzKTsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksIDIzKTsKKworICBmaWVsZC5SZW1vdmVMYXN0KCk7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDUpOworCisgIGZpZWxkLkNsZWFyKCk7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7CisgIGludCBleHBlY3RlZF91c2FnZSA9IDQgKiBzaXplb2YoaW50KTsKKyAgRVhQRUNUX0VRKGZpZWxkLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSwgZXhwZWN0ZWRfdXNhZ2UpOworfQorCisKKy8vIFRlc3Qgb3BlcmF0aW9ucyBvbiBhIFJlcGVhdGVkRmllbGQgd2hpY2ggaXMgbGFyZ2UgZW5vdWdoIHRvIGFsbG9jYXRlIGEKKy8vIHNlcGFyYXRlIGFycmF5LgorVEVTVChSZXBlYXRlZEZpZWxkLCBMYXJnZSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZmllbGQuQWRkKGkgKiBpKTsKKyAgfQorCisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDE2KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQuR2V0KGkpLCBpICogaSk7CisgIH0KKworICBpbnQgZXhwZWN0ZWRfdXNhZ2UgPSAxNiAqIHNpemVvZihpbnQpOworICBFWFBFQ1RfR0UoZmllbGQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpLCBleHBlY3RlZF91c2FnZSk7Cit9CisKKy8vIFRlc3Qgc3dhcHBpbmcgYmV0d2VlbiB2YXJpb3VzIHR5cGVzIG9mIFJlcGVhdGVkRmllbGRzLgorVEVTVChSZXBlYXRlZEZpZWxkLCBTd2FwU21hbGxTbWFsbCkgeworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQxOworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQyOworCisgIGZpZWxkMS5BZGQoNSk7CisgIGZpZWxkMS5BZGQoNDIpOworCisgIGZpZWxkMS5Td2FwKCZmaWVsZDIpOworCisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAwKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCA0Mik7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgU3dhcExhcmdlU21hbGwpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMTsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBmaWVsZDEuQWRkKGkgKiBpKTsKKyAgfQorICBmaWVsZDIuQWRkKDUpOworICBmaWVsZDIuQWRkKDQyKTsKKyAgZmllbGQxLlN3YXAoJmZpZWxkMik7CisKKyAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQxLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDEpLCA0Mik7CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxNik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpLCBpICogaSk7CisgIH0KK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBTd2FwTGFyZ2VMYXJnZSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQxOworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQyOworCisgIGZpZWxkMS5BZGQoNSk7CisgIGZpZWxkMS5BZGQoNDIpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBmaWVsZDEuQWRkKGkpOworICAgIGZpZWxkMi5BZGQoaSAqIGkpOworICB9CisgIGZpZWxkMi5Td2FwKCZmaWVsZDEpOworCisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAxNik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDEuR2V0KGkpLCBpICogaSk7CisgIH0KKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDE4KTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgxKSwgNDIpOworICBmb3IgKGludCBpID0gMjsgaSA8IDE4OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKSwgaSAtIDIpOworICB9Cit9CisKKy8vIERldGVybWluZXMgaG93IG11Y2ggc3BhY2Ugd2FzIHJlc2VydmVkIGJ5IHRoZSBnaXZlbiBmaWVsZCBieSBhZGRpbmcgZWxlbWVudHMKKy8vIHRvIGl0IHVudGlsIGl0IHJlLWFsbG9jYXRlcyBpdHMgc3BhY2UuCitzdGF0aWMgaW50IFJlc2VydmVkU3BhY2UoUmVwZWF0ZWRGaWVsZDxpbnQ+KiBmaWVsZCkgeworICBjb25zdCBpbnQqIHB0ciA9IGZpZWxkLT5kYXRhKCk7CisgIGRvIHsKKyAgICBmaWVsZC0+QWRkKDApOworICB9IHdoaWxlIChmaWVsZC0+ZGF0YSgpID09IHB0cik7CisKKyAgcmV0dXJuIGZpZWxkLT5zaXplKCkgLSAxOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVNb3JlVGhhbkRvdWJsZSkgeworICAvLyBSZXNlcnZlIG1vcmUgdGhhbiBkb3VibGUgdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQorICAvLyBmaWVsZCB0byByZXNlcnZlIGV4YWN0bHkgdGhlIGFtb3VudCBzcGVjaWZpZWQuCisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKyAgZmllbGQuUmVzZXJ2ZSgyMCk7CisKKyAgRVhQRUNUX0VRKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVMZXNzVGhhbkRvdWJsZSkgeworICAvLyBSZXNlcnZlIGxlc3MgdGhhbiBkb3VibGUgdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQorICAvLyBmaWVsZCB0byBncm93IGJ5IGRvdWJsZSBpbnN0ZWFkLgorICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CisgIGZpZWxkLlJlc2VydmUoMjApOworICBmaWVsZC5SZXNlcnZlKDMwKTsKKworICBFWFBFQ1RfRVEoNDAsIFJlc2VydmVkU3BhY2UoJmZpZWxkKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgUmVzZXJ2ZUxlc3NUaGFuRXhpc3RpbmcpIHsKKyAgLy8gUmVzZXJ2ZSBsZXNzIHRoYW4gdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQorICAvLyBmaWVsZCB0byBub3QgcmUtYWxsb2NhdGUgYXQgYWxsLgorICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CisgIGZpZWxkLlJlc2VydmUoMjApOworICBjb25zdCBpbnQqIHByZXZpb3VzX3B0ciA9IGZpZWxkLmRhdGEoKTsKKyAgZmllbGQuUmVzZXJ2ZSgxMCk7CisKKyAgRVhQRUNUX0VRKHByZXZpb3VzX3B0ciwgZmllbGQuZGF0YSgpKTsKKyAgRVhQRUNUX0VRKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIE1lcmdlRnJvbSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCBkZXN0aW5hdGlvbjsKKyAgc291cmNlLkFkZCg0KTsKKyAgc291cmNlLkFkZCg1KTsKKyAgZGVzdGluYXRpb24uQWRkKDEpOworICBkZXN0aW5hdGlvbi5BZGQoMik7CisgIGRlc3RpbmF0aW9uLkFkZCgzKTsKKworICBkZXN0aW5hdGlvbi5NZXJnZUZyb20oc291cmNlKTsKKworICBBU1NFUlRfRVEoNSwgZGVzdGluYXRpb24uc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIGRlc3RpbmF0aW9uLkdldCgwKSk7CisgIEVYUEVDVF9FUSgyLCBkZXN0aW5hdGlvbi5HZXQoMSkpOworICBFWFBFQ1RfRVEoMywgZGVzdGluYXRpb24uR2V0KDIpKTsKKyAgRVhQRUNUX0VRKDQsIGRlc3RpbmF0aW9uLkdldCgzKSk7CisgIEVYUEVDVF9FUSg1LCBkZXN0aW5hdGlvbi5HZXQoNCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIENvcHlGcm9tKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2UsIGRlc3RpbmF0aW9uOworICBzb3VyY2UuQWRkKDQpOworICBzb3VyY2UuQWRkKDUpOworICBkZXN0aW5hdGlvbi5BZGQoMSk7CisgIGRlc3RpbmF0aW9uLkFkZCgyKTsKKyAgZGVzdGluYXRpb24uQWRkKDMpOworCisgIGRlc3RpbmF0aW9uLkNvcHlGcm9tKHNvdXJjZSk7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisgIEVYUEVDVF9FUSg0LCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoNSwgZGVzdGluYXRpb24uR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5Q29uc3RydWN0KSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2U7CisgIHNvdXJjZS5BZGQoMSk7CisgIHNvdXJjZS5BZGQoMik7CisKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGRlc3RpbmF0aW9uKHNvdXJjZSk7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoMiwgZGVzdGluYXRpb24uR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBJdGVyYXRvckNvbnN0cnVjdCkgeworICB2ZWN0b3I8aW50PiB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soMSk7CisgIHZhbHVlcy5wdXNoX2JhY2soMik7CisKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgZmllbGQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1swXSwgZmllbGQuR2V0KDApKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXSwgZmllbGQuR2V0KDEpKTsKKworICBSZXBlYXRlZEZpZWxkPGludD4gb3RoZXIoZmllbGQuYmVnaW4oKSwgZmllbGQuZW5kKCkpOworICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgb3RoZXIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1swXSwgb3RoZXIuR2V0KDApKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXSwgb3RoZXIuR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5QXNzaWduKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2UsIGRlc3RpbmF0aW9uOworICBzb3VyY2UuQWRkKDQpOworICBzb3VyY2UuQWRkKDUpOworICBkZXN0aW5hdGlvbi5BZGQoMSk7CisgIGRlc3RpbmF0aW9uLkFkZCgyKTsKKyAgZGVzdGluYXRpb24uQWRkKDMpOworCisgIGRlc3RpbmF0aW9uID0gc291cmNlOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoNCwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKDUsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgU2VsZkFzc2lnbikgeworICAvLyBWZXJpZnkgdGhhdCBhc3NpZ25tZW50IHRvIHNlbGYgZG9lcyBub3QgZGVzdHJveSBkYXRhLgorICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCAqcDsKKyAgcCA9ICZzb3VyY2U7CisgIHNvdXJjZS5BZGQoNyk7CisgIHNvdXJjZS5BZGQoOCk7CisKKyAgKnAgPSBzb3VyY2U7CisKKyAgQVNTRVJUX0VRKDIsIHNvdXJjZS5zaXplKCkpOworICBFWFBFQ1RfRVEoNywgc291cmNlLkdldCgwKSk7CisgIEVYUEVDVF9FUSg4LCBzb3VyY2UuR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBNdXRhYmxlRGF0YUlzTXV0YWJsZSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CisgIGZpZWxkLkFkZCgxKTsKKyAgRVhQRUNUX0VRKDEsIGZpZWxkLkdldCgwKSk7CisgIC8vIFRoZSBmYWN0IHRoYXQgdGhpcyBsaW5lIGNvbXBpbGVzIHdvdWxkIGJlIGVub3VnaCwgYnV0IHdlJ2xsIGNoZWNrIHRoZQorICAvLyB2YWx1ZSBhbnl3YXkuCisgICpmaWVsZC5tdXRhYmxlX2RhdGEoKSA9IDI7CisgIEVYUEVDVF9FUSgyLCBmaWVsZC5HZXQoMCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFRydW5jYXRlKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKworICBmaWVsZC5BZGQoMTIpOworICBmaWVsZC5BZGQoMzQpOworICBmaWVsZC5BZGQoNTYpOworICBmaWVsZC5BZGQoNzgpOworICBFWFBFQ1RfRVEoNCwgZmllbGQuc2l6ZSgpKTsKKworICBmaWVsZC5UcnVuY2F0ZSgzKTsKKyAgRVhQRUNUX0VRKDMsIGZpZWxkLnNpemUoKSk7CisKKyAgZmllbGQuQWRkKDkwKTsKKyAgRVhQRUNUX0VRKDQsIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9FUSg5MCwgZmllbGQuR2V0KDMpKTsKKworICAvLyBUcnVuY2F0aW9ucyB0aGF0IGRvbid0IGNoYW5nZSB0aGUgc2l6ZSBhcmUgYWxsb3dlZCwgYnV0IGdyb3dpbmcgaXMgbm90CisgIC8vIGFsbG93ZWQuCisgIGZpZWxkLlRydW5jYXRlKGZpZWxkLnNpemUoKSk7CisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKGZpZWxkLlRydW5jYXRlKGZpZWxkLnNpemUoKSArIDEpLCAibmV3X3NpemUiKTsKKyNlbmRpZgorfQorCisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgRXh0cmFjdFN1YnJhbmdlKSB7CisgIC8vIEV4aGF1c3RpdmVseSB0ZXN0IGV2ZXJ5IHN1YnJhbmdlIGluIGFycmF5cyBvZiBhbGwgc2l6ZXMgZnJvbSAwIHRocm91Z2ggOS4KKyAgZm9yIChpbnQgc3ogPSAwOyBzeiA8IDEwOyArK3N6KSB7CisgICAgZm9yIChpbnQgbnVtID0gMDsgbnVtIDw9IHN6OyArK251bSkgeworICAgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHN6IC0gbnVtOyArK3N0YXJ0KSB7CisgICAgICAgIC8vIENyZWF0ZSBSZXBlYXRlZEZpZWxkIHdpdGggc3ogZWxlbWVudHMgaGF2aW5nIHZhbHVlcyAwIHRocm91Z2ggc3otMS4KKyAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMj4gZmllbGQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3o7ICsraSkKKyAgICAgICAgICBmaWVsZC5BZGQoaSk7CisgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6KTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjYXRjaGVyIGFycmF5IGFuZCBjYWxsIEV4dHJhY3RTdWJyYW5nZS4KKyAgICAgICAgaW50MzIgY2F0Y2hlclsxMF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgICAgICBjYXRjaGVyW2ldID0gLTE7CisgICAgICAgIGZpZWxkLkV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBjYXRjaGVyKTsKKworICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgaGF2ZSB0aGUgcmlnaHQgc2l6ZT8KKyAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogLSBudW0pOworCisgICAgICAgIC8vIFdlcmUgdGhlIHJlbW92ZWQgZWxlbWVudHMgZXh0cmFjdGVkIGludG8gdGhlIGNhdGNoZXIgYXJyYXk/CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpCisgICAgICAgICAgRVhQRUNUX0VRKGNhdGNoZXJbaV0sIHN0YXJ0ICsgaSk7CisgICAgICAgIEVYUEVDVF9FUShjYXRjaGVyW251bV0sIC0xKTsKKworICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzPworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0OyArK2kpCisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLkdldChpKSwgaSk7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGZpZWxkLnNpemUoKTsgKytpKQorICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSksIGkgKyBudW0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZXBlYXRlZFB0ckZpZWxkIHRlc3RzLiAgVGhlc2UgcHJldHR5IG11Y2gganVzdCBtaXJyb3IgdGhlIFJlcGVhdGVkRmllbGQKKy8vIHRlc3RzIGFib3ZlLgorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFNtYWxsKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAwKTsKKworICBmaWVsZC5BZGQoKS0+YXNzaWduKCJmb28iKTsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgImZvbyIpOworCisgIGZpZWxkLkFkZCgpLT5hc3NpZ24oImJhciIpOworCisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksICJiYXIiKTsKKworICBmaWVsZC5NdXRhYmxlKDEpLT5hc3NpZ24oImJheiIpOworCisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksICJiYXoiKTsKKworICBmaWVsZC5SZW1vdmVMYXN0KCk7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKKworICBmaWVsZC5DbGVhcigpOworCisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDApOworfQorCisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTGFyZ2UpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICpmaWVsZC5BZGQoKSArPSAnYScgKyBpOworICB9CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMTYpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSkuc2l6ZSgpLCAxKTsKKyAgICBFWFBFQ1RfRVEoZmllbGQuR2V0KGkpWzBdLCAnYScgKyBpKTsKKyAgfQorCisgIGludCBtaW5fZXhwZWN0ZWRfdXNhZ2UgPSAxNiAqIHNpemVvZihzdHJpbmcpOworICBFWFBFQ1RfR0UoZmllbGQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpLCBtaW5fZXhwZWN0ZWRfdXNhZ2UpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFN3YXBTbWFsbFNtYWxsKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDE7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDI7CisKKyAgZmllbGQxLkFkZCgpLT5hc3NpZ24oImZvbyIpOworICBmaWVsZDEuQWRkKCktPmFzc2lnbigiYmFyIik7CisgIGZpZWxkMS5Td2FwKCZmaWVsZDIpOworCisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAwKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgwKSwgImZvbyIpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgxKSwgImJhciIpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFN3YXBMYXJnZVNtYWxsKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDE7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDI7CisKKyAgZmllbGQyLkFkZCgpLT5hc3NpZ24oImZvbyIpOworICBmaWVsZDIuQWRkKCktPmFzc2lnbigiYmFyIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICpmaWVsZDEuQWRkKCkgKz0gJ2EnICsgaTsKKyAgfQorICBmaWVsZDEuU3dhcCgmZmllbGQyKTsKKworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDEpLCAiYmFyIik7CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxNik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpLnNpemUoKSwgMSk7CisgICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSlbMF0sICdhJyArIGkpOworICB9Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU3dhcExhcmdlTGFyZ2UpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMjsKKworICBmaWVsZDEuQWRkKCktPmFzc2lnbigiZm9vIik7CisgIGZpZWxkMS5BZGQoKS0+YXNzaWduKCJiYXIiKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgKmZpZWxkMS5BZGQoKSArPSAnQScgKyBpOworICAgICpmaWVsZDIuQWRkKCkgKz0gJ2EnICsgaTsKKyAgfQorICBmaWVsZDIuU3dhcCgmZmllbGQxKTsKKworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMTYpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQxLkdldChpKS5zaXplKCksIDEpOworICAgIEVYUEVDVF9FUShmaWVsZDEuR2V0KGkpWzBdLCAnYScgKyBpKTsKKyAgfQorICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMTgpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgwKSwgImZvbyIpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgxKSwgImJhciIpOworICBmb3IgKGludCBpID0gMjsgaSA8IDE4OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKS5zaXplKCksIDEpOworICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpWzBdLCAnQScgKyBpIC0gMik7CisgIH0KK30KKworc3RhdGljIGludCBSZXNlcnZlZFNwYWNlKFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogZmllbGQpIHsKKyAgY29uc3Qgc3RyaW5nKiBjb25zdCogcHRyID0gZmllbGQtPmRhdGEoKTsKKyAgZG8geworICAgIGZpZWxkLT5BZGQoKTsKKyAgfSB3aGlsZSAoZmllbGQtPmRhdGEoKSA9PSBwdHIpOworCisgIHJldHVybiBmaWVsZC0+c2l6ZSgpIC0gMTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBSZXNlcnZlTW9yZVRoYW5Eb3VibGUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOworICBmaWVsZC5SZXNlcnZlKDIwKTsKKworICBFWFBFQ1RfRVEoMjAsIFJlc2VydmVkU3BhY2UoJmZpZWxkKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgUmVzZXJ2ZUxlc3NUaGFuRG91YmxlKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKKyAgZmllbGQuUmVzZXJ2ZSgyMCk7CisgIGZpZWxkLlJlc2VydmUoMzApOworCisgIEVYUEVDVF9FUSg0MCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBSZXNlcnZlTGVzc1RoYW5FeGlzdGluZykgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisgIGZpZWxkLlJlc2VydmUoMjApOworICBjb25zdCBzdHJpbmcqIGNvbnN0KiBwcmV2aW91c19wdHIgPSBmaWVsZC5kYXRhKCk7CisgIGZpZWxkLlJlc2VydmUoMTApOworCisgIEVYUEVDVF9FUShwcmV2aW91c19wdHIsIGZpZWxkLmRhdGEoKSk7CisgIEVYUEVDVF9FUSgyMCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBSZXNlcnZlRG9lc250TG9zZUFsbG9jYXRlZCkgeworICAvLyBDaGVjayB0aGF0IGEgYnVnIGlzIGZpeGVkOiAgQW4gZWFybGllciBpbXBsZW1lbnRhdGlvbiBvZiBSZXNlcnZlKCkKKyAgLy8gZmFpbGVkIHRvIGNvcHkgcG9pbnRlcnMgdG8gYWxsb2NhdGVkLWJ1dC1jbGVhcmVkIG9iamVjdHMsIHBvc3NpYmx5CisgIC8vIGxlYWRpbmcgdG8gc2VnZmF1bHRzLgorICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisgIHN0cmluZyogZmlyc3QgPSBmaWVsZC5BZGQoKTsKKyAgZmllbGQuUmVtb3ZlTGFzdCgpOworCisgIGZpZWxkLlJlc2VydmUoMjApOworICBFWFBFQ1RfRVEoZmlyc3QsIGZpZWxkLkFkZCgpKTsKK30KKworLy8gQ2xlYXJpbmcgZWxlbWVudHMgaXMgdHJpY2t5IHdpdGggUmVwZWF0ZWRQdHJGaWVsZHMgc2luY2UgdGhlIG1lbW9yeSBmb3IKKy8vIHRoZSBlbGVtZW50cyBpcyByZXRhaW5lZCBhbmQgcmV1c2VkLgorVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDbGVhcmVkRWxlbWVudHMpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOworCisgIHN0cmluZyogb3JpZ2luYWwgPSBmaWVsZC5BZGQoKTsKKyAgKm9yaWdpbmFsID0gImZvbyI7CisKKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKKworICBmaWVsZC5SZW1vdmVMYXN0KCk7CisgIEVYUEVDVF9UUlVFKG9yaWdpbmFsLT5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAxKTsKKworICBFWFBFQ1RfRVEoZmllbGQuQWRkKCksIG9yaWdpbmFsKTsgIC8vIFNob3VsZCByZXR1cm4gc2FtZSBzdHJpbmcgZm9yIHJldXNlLgorCisgIEVYUEVDVF9FUShmaWVsZC5SZWxlYXNlTGFzdCgpLCBvcmlnaW5hbCk7ICAvLyBXZSB0YWtlIG93bmVyc2hpcC4KKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKKworICBFWFBFQ1RfTkUoZmllbGQuQWRkKCksIG9yaWdpbmFsKTsgIC8vIFNob3VsZCBOT1QgcmV0dXJuIHRoZSBzYW1lIHN0cmluZy4KKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKKworICBmaWVsZC5BZGRBbGxvY2F0ZWQob3JpZ2luYWwpOyAgLy8gR2l2ZSBvd25lcnNoaXAgYmFjay4KKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKKyAgRVhQRUNUX0VRKGZpZWxkLk11dGFibGUoMSksIG9yaWdpbmFsKTsKKworICBmaWVsZC5DbGVhcigpOworICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQuUmVsZWFzZUNsZWFyZWQoKSwgb3JpZ2luYWwpOyAgLy8gVGFrZSBvd25lcnNoaXAgYWdhaW4uCisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMSk7CisgIEVYUEVDVF9ORShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOworICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworICBFWFBFQ1RfTkUoZmllbGQuQWRkKCksIG9yaWdpbmFsKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKKworICBmaWVsZC5BZGRDbGVhcmVkKG9yaWdpbmFsKTsgIC8vIEdpdmUgb3duZXJzaGlwIGJhY2ssIGJ1dCBhcyBhIGNsZWFyZWQgb2JqZWN0LgorICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDEpOworICBFWFBFQ1RfRVEoZmllbGQuQWRkKCksIG9yaWdpbmFsKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKK30KKworLy8gVGVzdCBhbGwgY29kZSBwYXRocyBpbiBBZGRBbGxvY2F0ZWQoKS4KK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgQWRkQWxvY2F0ZWQpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOworICB3aGlsZSAoZmllbGQuc2l6ZSgpIDwgZmllbGQuQ2FwYWNpdHkoKSkgeworICAgIGZpZWxkLkFkZCgpLT5hc3NpZ24oImZpbGxlciIpOworICB9CisKKyAgaW50IGluZGV4ID0gZmllbGQuc2l6ZSgpOworCisgIC8vIEZpcnN0IGJyYW5jaDogIEZpZWxkIGlzIGF0IGNhcGFjaXR5IHdpdGggbm8gY2xlYXJlZCBvYmplY3RzLgorICBzdHJpbmcqIGZvbyA9IG5ldyBzdHJpbmcoImZvbyIpOworICBmaWVsZC5BZGRBbGxvY2F0ZWQoZm9vKTsKKyAgRVhQRUNUX0VRKGluZGV4ICsgMSwgZmllbGQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLkNsZWFyZWRDb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgJmZpZWxkLkdldChpbmRleCkpOworCisgIC8vIExhc3QgYnJhbmNoOiAgRmllbGQgaXMgbm90IGF0IGNhcGFjaXR5IGFuZCB0aGVyZSBhcmUgbm8gY2xlYXJlZCBvYmplY3RzLgorICBzdHJpbmcqIGJhciA9IG5ldyBzdHJpbmcoImJhciIpOworICBmaWVsZC5BZGRBbGxvY2F0ZWQoYmFyKTsKKyAgKytpbmRleDsKKyAgRVhQRUNUX0VRKGluZGV4ICsgMSwgZmllbGQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLkNsZWFyZWRDb3VudCgpKTsKKyAgRVhQRUNUX0VRKGJhciwgJmZpZWxkLkdldChpbmRleCkpOworCisgIC8vIFRoaXJkIGJyYW5jaDogIEZpZWxkIGlzIG5vdCBhdCBjYXBhY2l0eSBhbmQgdGhlcmUgYXJlIG5vIGNsZWFyZWQgb2JqZWN0cy4KKyAgZmllbGQuUmVtb3ZlTGFzdCgpOworICBzdHJpbmcqIGJheiA9IG5ldyBzdHJpbmcoImJheiIpOworICBmaWVsZC5BZGRBbGxvY2F0ZWQoYmF6KTsKKyAgRVhQRUNUX0VRKGluZGV4ICsgMSwgZmllbGQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIGZpZWxkLkNsZWFyZWRDb3VudCgpKTsKKyAgRVhQRUNUX0VRKGJheiwgJmZpZWxkLkdldChpbmRleCkpOworCisgIC8vIFNlY29uZCBicmFuY2g6ICBGaWVsZCBpcyBhdCBjYXBhY2l0eSBidXQgaGFzIHNvbWUgY2xlYXJlZCBvYmplY3RzLgorICB3aGlsZSAoZmllbGQuc2l6ZSgpIDwgZmllbGQuQ2FwYWNpdHkoKSkgeworICAgIGZpZWxkLkFkZCgpLT5hc3NpZ24oImZpbGxlcjIiKTsKKyAgfQorICBmaWVsZC5SZW1vdmVMYXN0KCk7CisgIGluZGV4ID0gZmllbGQuc2l6ZSgpOworICBzdHJpbmcqIHF1eCA9IG5ldyBzdHJpbmcoInF1eCIpOworICBmaWVsZC5BZGRBbGxvY2F0ZWQocXV4KTsKKyAgRVhQRUNUX0VRKGluZGV4ICsgMSwgZmllbGQuc2l6ZSgpKTsKKyAgLy8gV2Ugc2hvdWxkIGhhdmUgZGlzY2FyZGVkIHRoZSBjbGVhcmVkIG9iamVjdC4KKyAgRVhQRUNUX0VRKDAsIGZpZWxkLkNsZWFyZWRDb3VudCgpKTsKKyAgRVhQRUNUX0VRKHF1eCwgJmZpZWxkLkdldChpbmRleCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIE1lcmdlRnJvbSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlLCBkZXN0aW5hdGlvbjsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjQiKTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjUiKTsKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMSIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIyIik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjMiKTsKKworICBkZXN0aW5hdGlvbi5NZXJnZUZyb20oc291cmNlKTsKKworICBBU1NFUlRfRVEoNSwgZGVzdGluYXRpb24uc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCIxIiwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKCIyIiwgZGVzdGluYXRpb24uR2V0KDEpKTsKKyAgRVhQRUNUX0VRKCIzIiwgZGVzdGluYXRpb24uR2V0KDIpKTsKKyAgRVhQRUNUX0VRKCI0IiwgZGVzdGluYXRpb24uR2V0KDMpKTsKKyAgRVhQRUNUX0VRKCI1IiwgZGVzdGluYXRpb24uR2V0KDQpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5RnJvbSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlLCBkZXN0aW5hdGlvbjsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjQiKTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjUiKTsKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMSIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIyIik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjMiKTsKKworICBkZXN0aW5hdGlvbi5Db3B5RnJvbShzb3VyY2UpOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoIjQiLCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoIjUiLCBkZXN0aW5hdGlvbi5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIENvcHlDb25zdHJ1Y3QpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IHNvdXJjZTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjEiKTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjIiKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZGVzdGluYXRpb24oc291cmNlKTsKKworICBBU1NFUlRfRVEoMiwgZGVzdGluYXRpb24uc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCIxIiwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKCIyIiwgZGVzdGluYXRpb24uR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBJdGVyYXRvckNvbnN0cnVjdF9TdHJpbmcpIHsKKyAgdmVjdG9yPHN0cmluZz4gdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKCIxIik7CisgIHZhbHVlcy5wdXNoX2JhY2soIjIiKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLCBmaWVsZC5HZXQoMCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLCBmaWVsZC5HZXQoMSkpOworCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBvdGhlcihmaWVsZC5iZWdpbigpLCBmaWVsZC5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBvdGhlci5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLCBvdGhlci5HZXQoMCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLCBvdGhlci5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIEl0ZXJhdG9yQ29uc3RydWN0X1Byb3RvKSB7CisgIHR5cGVkZWYgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlIE5lc3RlZDsKKyAgdmVjdG9yPE5lc3RlZD4gdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKE5lc3RlZCgpKTsKKyAgdmFsdWVzLmJhY2soKS5zZXRfYmIoMSk7CisgIHZhbHVlcy5wdXNoX2JhY2soTmVzdGVkKCkpOworICB2YWx1ZXMuYmFjaygpLnNldF9iYigyKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPE5lc3RlZD4gZmllbGQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLmJiKCksIGZpZWxkLkdldCgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXS5iYigpLCBmaWVsZC5HZXQoMSkuYmIoKSk7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxOZXN0ZWQ+IG90aGVyKGZpZWxkLmJlZ2luKCksIGZpZWxkLmVuZCgpKTsKKyAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIG90aGVyLnNpemUoKSk7CisgIEVYUEVDVF9FUSh2YWx1ZXNbMF0uYmIoKSwgb3RoZXIuR2V0KDApLmJiKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLmJiKCksIG90aGVyLkdldCgxKS5iYigpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5QXNzaWduKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBzb3VyY2UsIGRlc3RpbmF0aW9uOworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNCIpOworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNSIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIxIik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjIiKTsKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMyIpOworCisgIGRlc3RpbmF0aW9uID0gc291cmNlOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoIjQiLCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoIjUiLCBkZXN0aW5hdGlvbi5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFNlbGZBc3NpZ24pIHsKKyAgLy8gVmVyaWZ5IHRoYXQgYXNzaWdubWVudCB0byBzZWxmIGRvZXMgbm90IGRlc3Ryb3kgZGF0YS4KKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IHNvdXJjZSwgKnA7CisgIHAgPSAmc291cmNlOworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNyIpOworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiOCIpOworCisgICpwID0gc291cmNlOworCisgIEFTU0VSVF9FUSgyLCBzb3VyY2Uuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCI3Iiwgc291cmNlLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiOCIsIHNvdXJjZS5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIE11dGFibGVEYXRhSXNNdXRhYmxlKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKKyAgKmZpZWxkLkFkZCgpID0gIjEiOworICBFWFBFQ1RfRVEoIjEiLCBmaWVsZC5HZXQoMCkpOworICAvLyBUaGUgZmFjdCB0aGF0IHRoaXMgbGluZSBjb21waWxlcyB3b3VsZCBiZSBlbm91Z2gsIGJ1dCB3ZSdsbCBjaGVjayB0aGUKKyAgLy8gdmFsdWUgYW55d2F5LgorICBzdHJpbmcqKiBkYXRhID0gZmllbGQubXV0YWJsZV9kYXRhKCk7CisgICoqZGF0YSA9ICIyIjsKKyAgRVhQRUNUX0VRKCIyIiwgZmllbGQuR2V0KDApKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBFeHRyYWN0U3VicmFuZ2UpIHsKKyAgLy8gRXhoYXVzdGl2ZWx5IHRlc3QgZXZlcnkgc3VicmFuZ2UgaW4gYXJyYXlzIG9mIGFsbCBzaXplcyBmcm9tIDAgdGhyb3VnaCA5CisgIC8vIHdpdGggMCB0aHJvdWdoIDMgY2xlYXJlZCBlbGVtZW50cyBhdCB0aGUgZW5kLgorICBmb3IgKGludCBzeiA9IDA7IHN6IDwgMTA7ICsrc3opIHsKKyAgICBmb3IgKGludCBudW0gPSAwOyBudW0gPD0gc3o7ICsrbnVtKSB7CisgICAgICBmb3IgKGludCBzdGFydCA9IDA7IHN0YXJ0IDwgc3ogLSBudW07ICsrc3RhcnQpIHsKKyAgICAgICAgZm9yIChpbnQgZXh0cmEgPSAwOyBleHRyYSA8IDQ7ICsrZXh0cmEpIHsKKyAgICAgICAgICB2ZWN0b3I8c3RyaW5nKj4gc3ViamVjdDsKKworICAgICAgICAgIC8vIENyZWF0ZSBhbiBhcnJheSB3aXRoICJzeiIgZWxlbWVudHMgYW5kICJleHRyYSIgY2xlYXJlZCBlbGVtZW50cy4KKyAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeiArIGV4dHJhOyArK2kpIHsKKyAgICAgICAgICAgIHN1YmplY3QucHVzaF9iYWNrKG5ldyBzdHJpbmcoKSk7CisgICAgICAgICAgICBmaWVsZC5BZGRBbGxvY2F0ZWQoc3ViamVjdFtpXSk7CisgICAgICAgICAgfQorICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6ICsgZXh0cmEpOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmE7ICsraSkKKyAgICAgICAgICAgIGZpZWxkLlJlbW92ZUxhc3QoKTsKKyAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCBzeik7CisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCBleHRyYSk7CisKKyAgICAgICAgICAvLyBDcmVhdGUgYSBjYXRjaGVyIGFycmF5IGFuZCBjYWxsIEV4dHJhY3RTdWJyYW5nZS4KKyAgICAgICAgICBzdHJpbmcqIGNhdGNoZXJbMTBdOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgICAgICAgIGNhdGNoZXJbaV0gPSBOVUxMOworICAgICAgICAgIGZpZWxkLkV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBjYXRjaGVyKTsKKworICAgICAgICAgIC8vIERvZXMgdGhlIHJlc3VsdGluZyBhcnJheSBoYXZlIHRoZSByaWdodCBzaXplPworICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6IC0gbnVtKTsKKworICAgICAgICAgIC8vIFdlcmUgdGhlIHJlbW92ZWQgZWxlbWVudHMgZXh0cmFjdGVkIGludG8gdGhlIGNhdGNoZXIgYXJyYXk/CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkKKyAgICAgICAgICAgIEVYUEVDVF9FUShjYXRjaGVyW2ldLCBzdWJqZWN0W3N0YXJ0ICsgaV0pOworICAgICAgICAgIEVYUEVDVF9FUShOVUxMLCBjYXRjaGVyW251bV0pOworCisgICAgICAgICAgLy8gRG9lcyB0aGUgcmVzdWx0aW5nIGFycmF5IGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlcz8KKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0OyArK2kpCisgICAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuTXV0YWJsZShpKSwgc3ViamVjdFtpXSk7CisgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZmllbGQuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuTXV0YWJsZShpKSwgc3ViamVjdFtpICsgbnVtXSk7CisKKyAgICAgICAgICAvLyBSZWluc3RhdGUgdGhlIGNsZWFyZWQgZWxlbWVudHMuCisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCBleHRyYSk7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYTsgKytpKQorICAgICAgICAgICAgZmllbGQuQWRkKCk7CisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKKyAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCBzeiAtIG51bSArIGV4dHJhKTsKKworICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXh0cmEgZWxlbWVudHMgYXJlIGFsbCB0aGVyZSAoaW4gc29tZSBvcmRlcikuCisgICAgICAgICAgZm9yIChpbnQgaSA9IHN6OyBpIDwgc3ogKyBleHRyYTsgKytpKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IHN6OyBqIDwgc3ogKyBleHRyYTsgKytqKSB7CisgICAgICAgICAgICAgIGlmIChmaWVsZC5NdXRhYmxlKGogLSBudW0pID09IHN1YmplY3RbaV0pCisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVYUEVDVF9FUShjb3VudCwgMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgY2F1Z2h0IGVsZW1lbnRzLgorICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpCisgICAgICAgICAgICBkZWxldGUgY2F0Y2hlcltpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIERlbGV0ZVN1YnJhbmdlKSB7CisgIC8vIERlbGV0ZVN1YnJhbmdlIGlzIGEgdHJpdmlhbCBleHRlbnNpb24gb2YgRXh0ZW5kU3VicmFuZ2UuCit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gSXRlcmF0b3IgdGVzdHMgc3RvbGVuIGZyb20gbmV0L3Byb3RvL3Byb3RvLWFycmF5X3VuaXR0ZXN0LgorY2xhc3MgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgcHJvdG9fYXJyYXlfLkFkZChpKTsKKyAgICB9CisgIH0KKworICBSZXBlYXRlZEZpZWxkPGludD4gcHJvdG9fYXJyYXlfOworfTsKKworVEVTVF9GKFJlcGVhdGVkRmllbGRJdGVyYXRvclRlc3QsIENvbnZlcnRpYmxlKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBSZXBlYXRlZEZpZWxkPGludD46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlciA9IGl0ZXI7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6dmFsdWVfdHlwZSB2YWx1ZSA9ICpjX2l0ZXI7CisgIEVYUEVDVF9FUSgwLCB2YWx1ZSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhYmxlSXRlcmF0aW9uKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBFWFBFQ1RfRVEoMCwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgxLCAqaXRlcisrKTsKKyAgRVhQRUNUX0VRKDIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8uZW5kKCkgPT0gaXRlcik7CisKKyAgRVhQRUNUX0VRKDIsICoocHJvdG9fYXJyYXlfLmVuZCgpIC0gMSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yVGVzdCwgQ29uc3RJdGVyYXRpb24pIHsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ+JiBjb25zdF9wcm90b19hcnJheSA9IHByb3RvX2FycmF5XzsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gY29uc3RfcHJvdG9fYXJyYXkuYmVnaW4oKTsKKyAgRVhQRUNUX0VRKDAsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoMSwgKml0ZXIrKyk7CisgIEVYUEVDVF9FUSgyLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX1RSVUUocHJvdG9fYXJyYXlfLmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoMiwgKihwcm90b19hcnJheV8uZW5kKCkgLSAxKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhdGlvbikgeworICBSZXBlYXRlZEZpZWxkPGludD46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKKyAgKml0ZXIgPSA3OworICBFWFBFQ1RfRVEoNywgcHJvdG9fYXJyYXlfLkdldCgwKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZm9vIik7CisgICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImJhciIpOworICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXoiKTsKKyAgfQorCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBwcm90b19hcnJheV87Cit9OworCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgQ29udmVydGlibGUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyID0gaXRlcjsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojp2YWx1ZV90eXBlIHZhbHVlID0gKmNfaXRlcjsKKyAgRVhQRUNUX0VRKCJmb28iLCB2YWx1ZSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhYmxlSXRlcmF0aW9uKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKHByb3RvX2FycmF5Xy5lbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKC0tcHJvdG9fYXJyYXlfLmVuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb25zdEl0ZXJhdGlvbikgeworICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4mIGNvbnN0X3Byb3RvX2FycmF5ID0gcHJvdG9fYXJyYXlfOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBjb25zdF9wcm90b19hcnJheS5iZWdpbigpOworICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5LmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoImJheiIsICooLS1jb25zdF9wcm90b19hcnJheS5lbmQoKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgTXV0YWJsZVJldmVyc2VJdGVyYXRpb24pIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8ucmJlZ2luKCk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgiYmFyIiwgKihpdGVyKyspKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX1RSVUUocHJvdG9fYXJyYXlfLnJlbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqKC0tcHJvdG9fYXJyYXlfLnJlbmQoKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgQ29uc3RSZXZlcnNlSXRlcmF0aW9uKSB7CisgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiYgY29uc3RfcHJvdG9fYXJyYXkgPSBwcm90b19hcnJheV87CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdGVyCisgICAgICA9IGNvbnN0X3Byb3RvX2FycmF5LnJiZWdpbigpOworICBFWFBFQ1RfRVEoImJheiIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5LnJlbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqKC0tY29uc3RfcHJvdG9fYXJyYXkucmVuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBSYW5kb21BY2Nlc3MpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6aXRlcmF0b3IgaXRlcjIgPSBpdGVyOworICArK2l0ZXIyOworICArK2l0ZXIyOworICBFWFBFQ1RfVFJVRShpdGVyICsgMiA9PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gaXRlcjIgLSAyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCBpdGVyWzJdKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKGl0ZXIgKyAyKSk7CisgIEVYUEVDVF9FUSgzLCBwcm90b19hcnJheV8uZW5kKCkgLSBwcm90b19hcnJheV8uYmVnaW4oKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIyID0gaXRlciArIDE7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDwgaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlcjIgPiBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlcjIgPj0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPj0gaXRlcik7Cit9CisKKy8vIFVuaW5pdGlhbGl6ZWQgaXRlcmF0b3IgZG9lcyBub3QgcG9pbnQgdG8gYW55IG9mIHRoZSBSZXBlYXRlZFB0ckZpZWxkLgorVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIFVuaW5pdGlhbGl6ZWRJdGVyYXRvcikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46Oml0ZXJhdG9yIGl0ZXI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLmJlZ2luKCkpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5iZWdpbigpICsgMSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLmJlZ2luKCkgKyAyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8uYmVnaW4oKSArIDMpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5lbmQoKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBTVExBbGdvcml0aG1zX2xvd2VyX2JvdW5kKSB7CisgIHByb3RvX2FycmF5Xy5DbGVhcigpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYSIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYyIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigibiIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigicCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieSIpOworCisgIHN0cmluZyB2ID0gImYiOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIGxvd2VyX2JvdW5kKHByb3RvX2FycmF5Xy5iZWdpbigpLCBwcm90b19hcnJheV8uZW5kKCksIHYpOworCisgIEVYUEVDVF9FUSgqaXQsICJuIik7CisgIEVYUEVDVF9UUlVFKGl0ID09IHByb3RvX2FycmF5Xy5iZWdpbigpICsgMyk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhdGlvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKKyAgKml0ZXIgPSAicXV4IjsKKyAgRVhQRUNUX0VRKCJxdXgiLCBwcm90b19hcnJheV8uR2V0KDApKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZm9vIik7CisgICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImJhciIpOworICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXoiKTsKKyAgICBjb25zdF9wcm90b19hcnJheV8gPSAmcHJvdG9fYXJyYXlfOworICB9CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IHByb3RvX2FycmF5XzsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiBjb25zdF9wcm90b19hcnJheV87Cit9OworCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIENvbnZlcnRpYmxlUHRyKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgICh2b2lkKSBpdGVyOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIENvbnZlcnRpYmxlQ29uc3RQdHIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCk7CisgICh2b2lkKSBpdGVyOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIE11dGFibGVQdHJJdGVyYXRpb24pIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgiYmFyIiwgKiooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKippdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKigtLXByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgTXV0YWJsZUNvbnN0UHRySXRlcmF0aW9uKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpOworICBFWFBFQ1RfRVEoImZvbyIsICoqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX0VRKCJiYXIiLCAqKihpdGVyKyspKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9lbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKigtLWNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9lbmQoKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFJhbmRvbVB0ckFjY2VzcykgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlcjIgPSBpdGVyOworICArK2l0ZXIyOworICArK2l0ZXIyOworICBFWFBFQ1RfVFJVRShpdGVyICsgMiA9PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gaXRlcjIgLSAyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlclsyXSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKiooaXRlciArIDIpKTsKKyAgRVhQRUNUX0VRKDMsIHByb3RvX2FycmF5Xy5lbmQoKSAtIHByb3RvX2FycmF5Xy5iZWdpbigpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBSYW5kb21Db25zdFB0ckFjY2VzcykgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIyID0gaXRlcjsKKyAgKytpdGVyMjsKKyAgKytpdGVyMjsKKyAgRVhQRUNUX1RSVUUoaXRlciArIDIgPT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIyIC0gMik7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXJbMl0pOworICBFWFBFQ1RfRVEoImJheiIsICoqKGl0ZXIgKyAyKSk7CisgIEVYUEVDVF9FUSgzLCBjb25zdF9wcm90b19hcnJheV8tPmVuZCgpIC0gY29uc3RfcHJvdG9fYXJyYXlfLT5iZWdpbigpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlUHRyKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyMiA9IGl0ZXIgKyAxOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID4gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID49IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyID49IGl0ZXIpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIENvbXBhcmFibGVDb25zdFB0cikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIyID0gaXRlciArIDE7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDwgaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlcjIgPiBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlcjIgPj0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPj0gaXRlcik7Cit9CisKKy8vIFVuaW5pdGlhbGl6ZWQgaXRlcmF0b3IgZG9lcyBub3QgcG9pbnQgdG8gYW55IG9mIHRoZSBSZXBlYXRlZFB0ck92ZXJQdHJzLgorLy8gRGVyZWZlcmVuY2luZyBhbiB1bmluaXRpYWxpemVkIGl0ZXJhdG9yIGNyYXNoZXMgdGhlIHByb2Nlc3MuCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFVuaW5pdGlhbGl6ZWRQdHJJdGVyYXRvcikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlcjsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpICsgMSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSArIDIpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgVW5pbml0aWFsaXplZENvbnN0UHRySXRlcmF0b3IpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCkpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpICsgMSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCkgKyAyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSArIDMpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9lbmQoKSk7Cit9CisKKy8vIFRoaXMgY29tcGFyaXNvbiBmdW5jdG9yIGlzIHJlcXVpcmVkIGJ5IHRoZSB0ZXN0cyBmb3IgUmVwZWF0ZWRQdHJPdmVyUHRycy4KKy8vIFRoZXkgb3BlcmF0ZSBvbiBzdHJpbmdzIGFuZCBuZWVkIHRvIGNvbXBhcmUgc3RyaW5ncyBhcyBzdHJpbmdzIGluCisvLyBhbnkgc3RsIGFsZ29yaXRobSwgZXZlbiB0aG91Z2ggdGhlIGl0ZXJhdG9yIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nCisvLyAtIGkuZS4gKml0ZXIgaGFzIHR5cGUgc3RyaW5nKi4KK3N0cnVjdCBTdHJpbmdMZXNzVGhhbiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcqIHosIGNvbnN0IHN0cmluZyYgeSkgeworICAgIHJldHVybiAqeiA8IHk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyogeiwgY29uc3Qgc3RyaW5nKiB5KSB7CisgICAgcmV0dXJuICp6IDwgKnk7CisgIH0KK307CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgUHRyU1RMQWxnb3JpdGhtc19sb3dlcl9ib3VuZCkgeworICBwcm90b19hcnJheV8uQ2xlYXIoKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImEiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImMiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImQiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oIm4iKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oInAiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oIngiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oInkiKTsKKworICB7CisgICAgc3RyaW5nIHYgPSAiZiI7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgbG93ZXJfYm91bmQocHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSwgcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCksCisgICAgICAgICAgICAgICAgICAgICZ2LCBTdHJpbmdMZXNzVGhhbigpKTsKKworICAgIEdPT0dMRV9DSEVDSygqaXQgIT0gTlVMTCk7CisKKyAgICBFWFBFQ1RfRVEoKippdCwgIm4iKTsKKyAgICBFWFBFQ1RfVFJVRShpdCA9PSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpICsgMyk7CisgIH0KKyAgeworICAgIHN0cmluZyB2ID0gImYiOworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdCA9CisgICAgICAgIGxvd2VyX2JvdW5kKGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCksCisgICAgICAgICAgICAgICAgICAgICZ2LCBTdHJpbmdMZXNzVGhhbigpKTsKKworICAgIEdPT0dMRV9DSEVDSygqaXQgIT0gTlVMTCk7CisKKyAgICBFWFBFQ1RfRVEoKippdCwgIm4iKTsKKyAgICBFWFBFQ1RfVFJVRShpdCA9PSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSArIDMpOworICB9Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgUHRyTXV0YXRpb24pIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKKyAgKippdGVyID0gInF1eCI7CisgIEVYUEVDVF9FUSgicXV4IiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7CisKKyAgRVhQRUNUX0VRKCJiYXIiLCBwcm90b19hcnJheV8uR2V0KDEpKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCBwcm90b19hcnJheV8uR2V0KDIpKTsKKyAgKytpdGVyOworICBkZWxldGUgKml0ZXI7CisgICppdGVyID0gbmV3IHN0cmluZygiYSIpOworICArK2l0ZXI7CisgIGRlbGV0ZSAqaXRlcjsKKyAgKml0ZXIgPSBuZXcgc3RyaW5nKCJiIik7CisgIEVYUEVDVF9FUSgiYSIsIHByb3RvX2FycmF5Xy5HZXQoMSkpOworICBFWFBFQ1RfRVEoImIiLCBwcm90b19hcnJheV8uR2V0KDIpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBTb3J0KSB7CisgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJjIik7CisgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJkIik7CisgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJuIik7CisgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJwIik7CisgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJhIik7CisgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJ5Iik7CisgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJ4Iik7CisgIEVYUEVDVF9FUSgiZm9vIiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7CisgIEVYUEVDVF9FUSgibiIsIHByb3RvX2FycmF5Xy5HZXQoNSkpOworICBFWFBFQ1RfRVEoIngiLCBwcm90b19hcnJheV8uR2V0KDkpKTsKKyAgc29ydChwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpLAorICAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpLAorICAgICAgIFN0cmluZ0xlc3NUaGFuKCkpOworICBFWFBFQ1RfRVEoImEiLCBwcm90b19hcnJheV8uR2V0KDApKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCBwcm90b19hcnJheV8uR2V0KDIpKTsKKyAgRVhQRUNUX0VRKCJ5IiwgcHJvdG9fYXJyYXlfLkdldCg5KSk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuaXQtdGVzdHMgZm9yIHRoZSBpbnNlcnQgaXRlcmF0b3JzCisvLyBnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyLAorLy8gZ29vZ2xlOjpwcm90b2J1Zjo6QWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcgorLy8gUG9ydGVkIGZyb20gdXRpbC9ndGwvcHJvdG8tYXJyYXktaXRlcmF0b3JzX3VuaXR0ZXN0LgorCitjbGFzcyBSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6bGlzdDxkb3VibGU+IGhhbHZlczsKKyAgc3RkOjpsaXN0PGludD4gZmlib25hY2NpOworICBzdGQ6OnZlY3RvcjxzdHJpbmc+IHdvcmRzOworICB0eXBlZGVmIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSBOZXN0ZWQ7CisgIE5lc3RlZCBuZXN0ZWRzWzJdOworICBzdGQ6OnZlY3RvcjxOZXN0ZWQqPiBuZXN0ZWRfcHRyczsKKyAgVGVzdEFsbFR5cGVzIHByb3RvYnVmZmVyOworCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDEpOworICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soMSk7CisgICAgZmlib25hY2NpLnB1c2hfYmFjaygyKTsKKyAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDMpOworICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soNSk7CisgICAgZmlib25hY2NpLnB1c2hfYmFjayg4KTsKKyAgICBzdGQ6OmNvcHkoZmlib25hY2NpLmJlZ2luKCksIGZpYm9uYWNjaS5lbmQoKSwKKyAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX2ludDMyKCkpKTsKKworICAgIGhhbHZlcy5wdXNoX2JhY2soMS4wKTsKKyAgICBoYWx2ZXMucHVzaF9iYWNrKDAuNSk7CisgICAgaGFsdmVzLnB1c2hfYmFjaygwLjI1KTsKKyAgICBoYWx2ZXMucHVzaF9iYWNrKDAuMTI1KTsKKyAgICBoYWx2ZXMucHVzaF9iYWNrKDAuMDYyNSk7CisgICAgc3RkOjpjb3B5KGhhbHZlcy5iZWdpbigpLCBoYWx2ZXMuZW5kKCksCisgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIocHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9kb3VibGUoKSkpOworCisgICAgd29yZHMucHVzaF9iYWNrKCJBYmxlIik7CisgICAgd29yZHMucHVzaF9iYWNrKCJ3YXMiKTsKKyAgICB3b3Jkcy5wdXNoX2JhY2soIkkiKTsKKyAgICB3b3Jkcy5wdXNoX2JhY2soImVyZSIpOworICAgIHdvcmRzLnB1c2hfYmFjaygiSSIpOworICAgIHdvcmRzLnB1c2hfYmFjaygic2F3Iik7CisgICAgd29yZHMucHVzaF9iYWNrKCJFbGJhIik7CisgICAgc3RkOjpjb3B5KHdvcmRzLmJlZ2luKCksIHdvcmRzLmVuZCgpLAorICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKKworICAgIG5lc3RlZHNbMF0uc2V0X2JiKDE3KTsKKyAgICBuZXN0ZWRzWzFdLnNldF9iYig0NzExKTsKKyAgICBzdGQ6OmNvcHkoJm5lc3RlZHNbMF0sICZuZXN0ZWRzWzJdLAorICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKAorICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpKSk7CisKKyAgICBuZXN0ZWRfcHRycy5wdXNoX2JhY2sobmV3IE5lc3RlZCk7CisgICAgbmVzdGVkX3B0cnMuYmFjaygpLT5zZXRfYmIoMTcwKTsKKyAgICBuZXN0ZWRfcHRycy5wdXNoX2JhY2sobmV3IE5lc3RlZCk7CisgICAgbmVzdGVkX3B0cnMuYmFjaygpLT5zZXRfYmIoNDcxMTApOworICAgIHN0ZDo6Y29weShuZXN0ZWRfcHRycy5iZWdpbigpLCBuZXN0ZWRfcHRycy5lbmQoKSwKKyAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgICAgICAgIHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKSkpOworCisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMobmVzdGVkX3B0cnMuYmVnaW4oKSwgbmVzdGVkX3B0cnMuZW5kKCkpOworICB9Cit9OworCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIEZpYm9uYWNjaSkgeworICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGZpYm9uYWNjaS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpYm9uYWNjaS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5yZXBlYXRlZF9pbnQzMigpLmJlZ2luKCkpKTsKKyAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChwcm90b2J1ZmZlci5yZXBlYXRlZF9pbnQzMigpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfaW50MzIoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWJvbmFjY2kuYmVnaW4oKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIEhhbHZlcykgeworICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGhhbHZlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbHZlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5yZXBlYXRlZF9kb3VibGUoKS5iZWdpbigpKSk7CisgIEVYUEVDVF9UUlVFKHN0ZDo6ZXF1YWwocHJvdG9idWZmZXIucmVwZWF0ZWRfZG91YmxlKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5yZXBlYXRlZF9kb3VibGUoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYWx2ZXMuYmVnaW4oKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIFdvcmRzKSB7CisgIEFTU0VSVF9FUSh3b3Jkcy5zaXplKCksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmRzLnNpemUoKTsgKytpKQorICAgIEVYUEVDVF9FUSh3b3Jkcy5hdChpKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKGkpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0LCBXb3JkczIpIHsKKyAgd29yZHMuY2xlYXIoKTsKKyAgd29yZHMucHVzaF9iYWNrKCJzaW5nIik7CisgIHdvcmRzLnB1c2hfYmFjaygiYSIpOworICB3b3Jkcy5wdXNoX2JhY2soInNvbmciKTsKKyAgd29yZHMucHVzaF9iYWNrKCJvZiIpOworICB3b3Jkcy5wdXNoX2JhY2soInNpeCIpOworICB3b3Jkcy5wdXNoX2JhY2soInBlbmNlIik7CisgIHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCktPkNsZWFyKCk7CisgIHN0ZDo6Y29weSh3b3Jkcy5iZWdpbigpLCB3b3Jkcy5lbmQoKSwgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgIHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKKyAgQVNTRVJUX0VRKHdvcmRzLnNpemUoKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMuc2l6ZSgpOyArK2kpCisgICAgRVhQRUNUX0VRKHdvcmRzLmF0KGkpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoaSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIE5lc3RlZHMpIHsKKyAgQVNTRVJUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSwgNCk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpLCAxNyk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS5iYigpLCA0NzExKTsKKyAgRVhQRUNUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDIpLmJiKCksIDE3MCk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgzKS5iYigpLCA0NzExMCk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwKKyAgICAgICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZ0ludERhdGEpIHsKKyAgdmVjdG9yPE5lc3RlZCo+IGRhdGE7CisgIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgTmVzdGVkKiBuZXdfZGF0YSA9IG5ldyBOZXN0ZWQ7CisgICAgbmV3X2RhdGEtPnNldF9iYihpKTsKKyAgICBkYXRhLnB1c2hfYmFjayhuZXdfZGF0YSk7CisKKyAgICBuZXdfZGF0YSA9IGdvbGRlbnByb3RvLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpOworICAgIG5ld19kYXRhLT5zZXRfYmIoaSk7CisgIH0KKyAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKKyAgY29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksCisgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgdGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKSkpOworICBFWFBFQ1RfRVEodGVzdHByb3RvLkRlYnVnU3RyaW5nKCksIGdvbGRlbnByb3RvLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsCisgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZFdpdGhTdHJpbmcpIHsKKyAgdmVjdG9yPHN0cmluZyo+IGRhdGE7CisgIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgc3RyaW5nKiBuZXdfZGF0YSA9IG5ldyBzdHJpbmc7CisgICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7CisgICAgZGF0YS5wdXNoX2JhY2sobmV3X2RhdGEpOworCisgICAgbmV3X2RhdGEgPSBnb2xkZW5wcm90by5hZGRfcmVwZWF0ZWRfc3RyaW5nKCk7CisgICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7CisgIH0KKyAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKKyAgY29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksCisgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgdGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKKyAgRVhQRUNUX0VRKHRlc3Rwcm90by5EZWJ1Z1N0cmluZygpLCBnb2xkZW5wcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWY5NjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MKQEAgLTAsMCArMSw0NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc2VydmljZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK1NlcnZpY2U6On5TZXJ2aWNlKCkge30KK1JwY0NoYW5uZWw6On5ScGNDaGFubmVsKCkge30KK1JwY0NvbnRyb2xsZXI6On5ScGNDb250cm9sbGVyKCkge30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTdkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5oCkBAIC0wLDAgKzEsMjkxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBERVBSRUNBVEVEOiAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFic3RyYWN0IGludGVyZmFjZXMgdW5kZXJseWluZyBwcm90bzIKKy8vIFJQQyBzZXJ2aWNlcy4gIFRoZXNlIGFyZSBpbnRlbnRlZCB0byBiZSBpbmRlcGVuZGVudCBvZiBhbnkgcGFydGljdWxhciBSUEMKKy8vIGltcGxlbWVudGF0aW9uLCBzbyB0aGF0IHByb3RvMiBzZXJ2aWNlcyBjYW4gYmUgdXNlZCBvbiB0b3Agb2YgYSB2YXJpZXR5CisvLyBvZiBpbXBsZW1lbnRhdGlvbnMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCisvLyBub3QgdHJ5IHRvIGJ1aWxkIG9uIHRoZXNlLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zCisvLyB3aGljaCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5CisvLyB0aGUgZ2VuZXJhdGVkIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UKKy8vIGFuZCBjYW4gYXZvaWQgdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgorLy8KKy8vCisvLyBXaGVuIHlvdSB1c2UgdGhlIHByb3RvY29sIGNvbXBpbGVyIHRvIGNvbXBpbGUgYSBzZXJ2aWNlIGRlZmluaXRpb24sIGl0CisvLyBnZW5lcmF0ZXMgdHdvIGNsYXNzZXM6ICBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRoZSBzZXJ2aWNlICh3aXRoCisvLyBtZXRob2RzIG1hdGNoaW5nIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24pIGFuZCBhICJzdHViIiBpbXBsZW1lbnRhdGlvbi4KKy8vIEEgc3R1YiBpcyBqdXN0IGEgdHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIGFuIFJwY0NoYW5uZWwgd2hpY2ggZW11bGF0ZXMgYQorLy8gbG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCisvLworLy8gRm9yIGV4YW1wbGUsIHRoZSBzZXJ2aWNlIGRlZmluaXRpb246CisvLyAgIHNlcnZpY2UgTXlTZXJ2aWNlIHsKKy8vICAgICBycGMgRm9vKE15UmVxdWVzdCkgcmV0dXJucyhNeVJlc3BvbnNlKTsKKy8vICAgfQorLy8gd2lsbCBnZW5lcmF0ZSBhYnN0cmFjdCBpbnRlcmZhY2UgIk15U2VydmljZSIgYW5kIGNsYXNzICJNeVNlcnZpY2U6OlN0dWIiLgorLy8gWW91IGNvdWxkIGltcGxlbWVudCBhIE15U2VydmljZSBhcyBmb2xsb3dzOgorLy8gICBjbGFzcyBNeVNlcnZpY2VJbXBsIDogcHVibGljIE15U2VydmljZSB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgTXlTZXJ2aWNlSW1wbCgpIHt9CisvLyAgICAgfk15U2VydmljZUltcGwoKSB7fQorLy8KKy8vICAgICAvLyBpbXBsZW1lbnRzIE15U2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgdm9pZCBGb28oZ29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKy8vICAgICAgICAgICAgICBjb25zdCBNeVJlcXVlc3QqIHJlcXVlc3QsCisvLyAgICAgICAgICAgICAgTXlSZXNwb25zZSogcmVzcG9uc2UsCisvLyAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgeworLy8gICAgICAgLy8gLi4uIHJlYWQgcmVxdWVzdCBhbmQgZmlsbCBpbiByZXNwb25zZSAuLi4KKy8vICAgICAgIGRvbmUtPlJ1bigpOworLy8gICAgIH0KKy8vICAgfTsKKy8vIFlvdSB3b3VsZCB0aGVuIHJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mIE15U2VydmljZUltcGwgd2l0aCB5b3VyIFJQQyBzZXJ2ZXIKKy8vIGltcGxlbWVudGF0aW9uLiAgKEhvdyB0byBkbyB0aGF0IGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uLikKKy8vCisvLyBUbyBjYWxsIGEgcmVtb3RlIE15U2VydmljZUltcGwsIGZpcnN0IHlvdSBuZWVkIGFuIFJwY0NoYW5uZWwgY29ubmVjdGVkIHRvIGl0LgorLy8gSG93IHRvIGNvbnN0cnVjdCBhIGNoYW5uZWwgZGVwZW5kcywgYWdhaW4sIG9uIHlvdXIgUlBDIGltcGxlbWVudGF0aW9uLgorLy8gSGVyZSB3ZSB1c2UgYSBoeXBvdGhlbnRpY2FsICJNeVJwY0NoYW5uZWwiIGFzIGFuIGV4YW1wbGU6CisvLyAgIE15UnBjQ2hhbm5lbCBjaGFubmVsKCJycGM6aG9zdG5hbWU6MTIzNC9teXNlcnZpY2UiKTsKKy8vICAgTXlScGNDb250cm9sbGVyIGNvbnRyb2xsZXI7CisvLyAgIE15U2VydmljZUltcGw6OlN0dWIgc3R1YigmY2hhbm5lbCk7CisvLyAgIEZvb1JlcXVlc3QgcmVxdWVzdDsKKy8vICAgRm9vUmVzcG5vc2UgcmVzcG9uc2U7CisvLworLy8gICAvLyAuLi4gZmlsbCBpbiByZXF1ZXN0IC4uLgorLy8KKy8vICAgc3R1Yi5Gb28oJmNvbnRyb2xsZXIsIHJlcXVlc3QsICZyZXNwb25zZSwgTmV3Q2FsbGJhY2soSGFuZGxlUmVzcG9uc2UpKTsKKy8vCisvLyBPbiBUaHJlYWQtU2FmZXR5OgorLy8KKy8vIERpZmZlcmVudCBSUEMgaW1wbGVtZW50YXRpb25zIG1heSBtYWtlIGRpZmZlcmVudCBndWFyYW50ZWVzIGFib3V0IHdoYXQKKy8vIHRocmVhZHMgdGhleSBtYXkgcnVuIGNhbGxiYWNrcyBvbiwgYW5kIHdoYXQgdGhyZWFkcyB0aGUgYXBwbGljYXRpb24gaXMKKy8vIGFsbG93ZWQgdG8gdXNlIHRvIGNhbGwgdGhlIFJQQyBzeXN0ZW0uICBQb3J0YWJsZSBzb2Z0d2FyZSBzaG91bGQgYmUgcmVhZHkKKy8vIGZvciBjYWxsYmFja3MgdG8gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQsIGJ1dCBzaG91bGQgbm90IHRyeSB0byBjYWxsIHRoZQorLy8gUlBDIHN5c3RlbSBmcm9tIGFueSB0aHJlYWQgZXhjZXB0IGZvciB0aGUgb25lcyBvbiB3aGljaCBpdCByZWNlaXZlZCB0aGUKKy8vIGNhbGxiYWNrcy4gIFJlYWxpc3RpY2FsbHksIHRob3VnaCwgc2ltcGxlIHNvZnR3YXJlIHdpbGwgcHJvYmFibHkgd2FudCB0bworLy8gdXNlIGEgc2luZ2xlLXRocmVhZGVkIFJQQyBzeXN0ZW0gd2hpbGUgaGlnaC1lbmQgc29mdHdhcmUgd2lsbCB3YW50IHRvCisvLyB1c2UgbXVsdGlwbGUgdGhyZWFkcy4gIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHByb3ZpZGUgbXVsdGlwbGUKKy8vIGNob2ljZXMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TRVJWSUNFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIFNlcnZpY2U7CitjbGFzcyBScGNDb250cm9sbGVyOworY2xhc3MgUnBjQ2hhbm5lbDsKKworLy8gRGVmaW5lZCBpbiBvdGhlciBmaWxlcy4KK2NsYXNzIERlc2NyaXB0b3I7ICAgICAgICAgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIE1lc3NhZ2U7ICAgICAgICAgICAgICAgLy8gbWVzc2FnZS5oCisKKy8vIEFic3RyYWN0IGJhc2UgaW50ZXJmYWNlIGZvciBwcm90b2NvbC1idWZmZXItYmFzZWQgUlBDIHNlcnZpY2VzLiAgU2VydmljZXMKKy8vIHRoZW1zZWx2ZXMgYXJlIGFic3RyYWN0IGludGVyZmFjZXMgKGltcGxlbWVudGVkIGVpdGhlciBieSBzZXJ2ZXJzIG9yIGFzCisvLyBzdHVicyksIGJ1dCB0aGV5IHN1YmNsYXNzIHRoaXMgYmFzZSBpbnRlcmZhY2UuICBUaGUgbWV0aG9kcyBvZiB0aGlzCisvLyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgbWV0aG9kcyBvZiB0aGUgU2VydmljZSB3aXRob3V0IGtub3dpbmcKKy8vIGl0cyBleGFjdCB0eXBlIGF0IGNvbXBpbGUgdGltZSAoYW5hbG9nb3VzIHRvIFJlZmxlY3Rpb24pLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNlcnZpY2UgeworIHB1YmxpYzoKKyAgaW5saW5lIFNlcnZpY2UoKSB7fQorICB2aXJ0dWFsIH5TZXJ2aWNlKCk7CisKKyAgLy8gV2hlbiBjb25zdHJ1Y3RpbmcgYSBzdHViLCB5b3UgbWF5IHBhc3MgU1RVQl9PV05TX0NIQU5ORUwgYXMgdGhlIHNlY29uZAorICAvLyBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yIHRvIHRlbGwgaXQgdG8gZGVsZXRlIGl0cyBScGNDaGFubmVsIHdoZW4KKyAgLy8gZGVzdHJveWVkLgorICBlbnVtIENoYW5uZWxPd25lcnNoaXAgeworICAgIFNUVUJfT1dOU19DSEFOTkVMLAorICAgIFNUVUJfRE9FU05UX09XTl9DSEFOTkVMCisgIH07CisKKyAgLy8gR2V0IHRoZSBTZXJ2aWNlRGVzY3JpcHRvciBkZXNjcmliaW5nIHRoaXMgc2VydmljZSBhbmQgaXRzIG1ldGhvZHMuCisgIHZpcnR1YWwgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSA9IDA7CisKKyAgLy8gQ2FsbCBhIG1ldGhvZCBvZiB0aGUgc2VydmljZSBzcGVjaWZpZWQgYnkgTWV0aG9kRGVzY3JpcHRvci4gIFRoaXMgaXMKKyAgLy8gbm9ybWFsbHkgaW1wbGVtZW50ZWQgYXMgYSBzaW1wbGUgc3dpdGNoKCkgdGhhdCBjYWxscyB0aGUgc3RhbmRhcmQKKyAgLy8gZGVmaW5pdGlvbnMgb2YgdGhlIHNlcnZpY2UncyBtZXRob2RzLgorICAvLworICAvLyBQcmVjb25kaXRpb25zOgorICAvLyAqIG1ldGhvZC0+c2VydmljZSgpID09IEdldERlc2NyaXB0b3IoKQorICAvLyAqIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGFyZSBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzc2VzIGFzIHRoZSBvYmplY3RzCisgIC8vICAgcmV0dXJuZWQgYnkgR2V0UmVxdWVzdFByb3RvdHlwZShtZXRob2QpIGFuZAorICAvLyAgIEdldFJlc3BvbnNlUHJvdG90eXBlKG1ldGhvZCkuCisgIC8vICogQWZ0ZXIgdGhlIGNhbGwgaGFzIHN0YXJ0ZWQsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkIGFuZCB0aGUKKyAgLy8gICByZXNwb25zZSBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBhdCBhbGwgdW50aWwgImRvbmUiIGlzIGNhbGxlZC4KKyAgLy8gKiAiY29udHJvbGxlciIgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBiZWluZworICAvLyAgIHVzZWQgYnkgdGhpcyBTZXJ2aWNlLiAgRm9yIHN0dWJzLCB0aGUgImNvcnJlY3QgdHlwZSIgZGVwZW5kcyBvbiB0aGUKKyAgLy8gICBScGNDaGFubmVsIHdoaWNoIHRoZSBzdHViIGlzIHVzaW5nLiAgU2VydmVyLXNpZGUgU2VydmljZQorICAvLyAgIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXB0IHdoYXRldmVyIHR5cGUgb2YgUnBjQ29udHJvbGxlcgorICAvLyAgIHRoZSBzZXJ2ZXItc2lkZSBSUEMgaW1wbGVtZW50YXRpb24gdXNlcy4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogImRvbmUiIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1ldGhvZCBpcyBjb21wbGV0ZS4gIFRoaXMgbWF5IGJlCisgIC8vICAgYmVmb3JlIENhbGxNZXRob2QoKSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgIC8vICogSWYgdGhlIFJQQyBzdWNjZWVkZWQsICJyZXNwb25zZSIgY29udGFpbnMgdGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5CisgIC8vICAgdGhlIHNlcnZlci4KKyAgLy8gKiBJZiB0aGUgUlBDIGZhaWxlZCwgInJlc3BvbnNlIidzIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQuICBUaGUKKyAgLy8gICBScGNDb250cm9sbGVyIGNhbiBiZSBxdWVyaWVkIHRvIGRldGVybWluZSBpZiBhbiBlcnJvciBvY2N1cnJlZCBhbmQKKyAgLy8gICBwb3NzaWJseSB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCisgIHZpcnR1YWwgdm9pZCBDYWxsTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpID0gMDsKKworICAvLyBDYWxsTWV0aG9kKCkgcmVxdWlyZXMgdGhhdCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcGFzc2VkIGluIGFyZSBvZiBhCisgIC8vIHBhcnRpY3VsYXIgc3ViY2xhc3Mgb2YgTWVzc2FnZS4gIEdldFJlcXVlc3RQcm90b3R5cGUoKSBhbmQKKyAgLy8gR2V0UmVzcG9uc2VQcm90b3R5cGUoKSBnZXQgdGhlIGRlZmF1bHQgaW5zdGFuY2VzIG9mIHRoZXNlIHJlcXVpcmVkIHR5cGVzLgorICAvLyBZb3UgY2FuIHRoZW4gY2FsbCBNZXNzYWdlOjpOZXcoKSBvbiB0aGVzZSBpbnN0YW5jZXMgdG8gY29uc3RydWN0IG11dGFibGUKKyAgLy8gb2JqZWN0cyB3aGljaCB5b3UgY2FuIHRoZW4gcGFzcyB0byBDYWxsTWV0aG9kKCkuCisgIC8vCisgIC8vIEV4YW1wbGU6CisgIC8vICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0KKyAgLy8gICAgIHNlcnZpY2UtPkdldERlc2NyaXB0b3IoKS0+RmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7CisgIC8vICAgTWVzc2FnZSogcmVxdWVzdCAgPSBzdHViLT5HZXRSZXF1ZXN0UHJvdG90eXBlIChtZXRob2QpLT5OZXcoKTsKKyAgLy8gICBNZXNzYWdlKiByZXNwb25zZSA9IHN0dWItPkdldFJlc3BvbnNlUHJvdG90eXBlKG1ldGhvZCktPk5ldygpOworICAvLyAgIHJlcXVlc3QtPlBhcnNlRnJvbVN0cmluZyhpbnB1dCk7CisgIC8vICAgc2VydmljZS0+Q2FsbE1ldGhvZChtZXRob2QsICpyZXF1ZXN0LCByZXNwb25zZSwgY2FsbGJhY2spOworICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UmIEdldFJlcXVlc3RQcm90b3R5cGUoCisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgTWVzc2FnZSYgR2V0UmVzcG9uc2VQcm90b3R5cGUoCisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdCA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2VydmljZSk7Cit9OworCisvLyBBbiBScGNDb250cm9sbGVyIG1lZGlhdGVzIGEgc2luZ2xlIG1ldGhvZCBjYWxsLiAgVGhlIHByaW1hcnkgcHVycG9zZSBvZgorLy8gdGhlIGNvbnRyb2xsZXIgaXMgdG8gcHJvdmlkZSBhIHdheSB0byBtYW5pcHVsYXRlIHNldHRpbmdzIHNwZWNpZmljIHRvIHRoZQorLy8gUlBDIGltcGxlbWVudGF0aW9uIGFuZCB0byBmaW5kIG91dCBhYm91dCBSUEMtbGV2ZWwgZXJyb3JzLgorLy8KKy8vIFRoZSBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSBScGNDb250cm9sbGVyIGludGVyZmFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgYQorLy8gImxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciIgc2V0IG9mIGZlYXR1cmVzIHdoaWNoIHdlIGV4cGVjdCBhbGwKKy8vIGltcGxlbWVudGF0aW9ucyB0byBzdXBwb3J0LiAgU3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIG1vcmUKKy8vIGFkdmFuY2VkIGZlYXR1cmVzIChlLmcuIGRlYWRsaW5lIHByb3BhZ2F0aW9uKS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBScGNDb250cm9sbGVyIHsKKyBwdWJsaWM6CisgIGlubGluZSBScGNDb250cm9sbGVyKCkge30KKyAgdmlydHVhbCB+UnBjQ29udHJvbGxlcigpOworCisgIC8vIENsaWVudC1zaWRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIGNhbGxzIG1heSBiZSBtYWRlIGZyb20gdGhlIGNsaWVudCBzaWRlIG9ubHkuICBUaGVpciByZXN1bHRzCisgIC8vIGFyZSB1bmRlZmluZWQgb24gdGhlIHNlcnZlciBzaWRlIChtYXkgY3Jhc2gpLgorCisgIC8vIFJlc2V0cyB0aGUgUnBjQ29udHJvbGxlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgaW4KKyAgLy8gYSBuZXcgY2FsbC4gIE11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSBhbiBSUEMgaXMgaW4gcHJvZ3Jlc3MuCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKKworICAvLyBBZnRlciBhIGNhbGwgaGFzIGZpbmlzaGVkLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZmFpbGVkLiAgVGhlIHBvc3NpYmxlCisgIC8vIHJlYXNvbnMgZm9yIGZhaWx1cmUgZGVwZW5kIG9uIHRoZSBSUEMgaW1wbGVtZW50YXRpb24uICBGYWlsZWQoKSBtdXN0IG5vdAorICAvLyBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCBoYXMgZmluaXNoZWQuICBJZiBGYWlsZWQoKSByZXR1cm5zIHRydWUsIHRoZQorICAvLyBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBhcmUgdW5kZWZpbmVkLgorICB2aXJ0dWFsIGJvb2wgRmFpbGVkKCkgY29uc3QgPSAwOworCisgIC8vIElmIEZhaWxlZCgpIGlzIHRydWUsIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCisgIHZpcnR1YWwgc3RyaW5nIEVycm9yVGV4dCgpIGNvbnN0ID0gMDsKKworICAvLyBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCisgIC8vIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAorICAvLyB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuICBJZiB0aGUgY2FsbCBpcworICAvLyBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKKyAgLy8gd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCisgIHZpcnR1YWwgdm9pZCBTdGFydENhbmNlbCgpID0gMDsKKworICAvLyBTZXJ2ZXItc2lkZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBjYWxscyBtYXkgYmUgbWFkZSBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSBvbmx5LiAgVGhlaXIgcmVzdWx0cworICAvLyBhcmUgdW5kZWZpbmVkIG9uIHRoZSBjbGllbnQgc2lkZSAobWF5IGNyYXNoKS4KKworICAvLyBDYXVzZXMgRmFpbGVkKCkgdG8gcmV0dXJuIHRydWUgb24gdGhlIGNsaWVudCBzaWRlLiAgInJlYXNvbiIgd2lsbCBiZQorICAvLyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbWVzc2FnZSByZXR1cm5lZCBieSBFcnJvclRleHQoKS4gIElmIHlvdSBmaW5kCisgIC8vIHlvdSBuZWVkIHRvIHJldHVybiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGFib3V0IGZhaWx1cmVzLCB5b3UKKyAgLy8gc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8geW91ciByZXNwb25zZSBwcm90b2NvbCBidWZmZXIgYW5kIHNob3VsZAorICAvLyBOT1QgY2FsbCBTZXRGYWlsZWQoKS4KKyAgdmlydHVhbCB2b2lkIFNldEZhaWxlZChjb25zdCBzdHJpbmcmIHJlYXNvbikgPSAwOworCisgIC8vIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgY2FuY2VsZWQgdGhlIFJQQywgc28gdGhlIHNlcnZlciBtYXkKKyAgLy8gYXMgd2VsbCBnaXZlIHVwIG9uIHJlcGx5aW5nIHRvIGl0LiAgVGhlIHNlcnZlciBzaG91bGQgc3RpbGwgY2FsbCB0aGUKKyAgLy8gZmluYWwgImRvbmUiIGNhbGxiYWNrLgorICB2aXJ0dWFsIGJvb2wgSXNDYW5jZWxlZCgpIGNvbnN0ID0gMDsKKworICAvLyBBc2tzIHRoYXQgdGhlIGdpdmVuIGNhbGxiYWNrIGJlIGNhbGxlZCB3aGVuIHRoZSBSUEMgaXMgY2FuY2VsZWQuICBUaGUKKyAgLy8gY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4gIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQKKyAgLy8gYmVpbmcgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhZnRlciBjb21wbGV0aW9uLiAgSWYgdGhlIFJQQworICAvLyBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkIHdoZW4gTm90aWZ5T25DYW5jZWwoKSBpcyBjYWxsZWQsIHRoZSBjYWxsYmFjaworICAvLyB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseS4KKyAgLy8KKyAgLy8gTm90aWZ5T25DYW5jZWwoKSBtdXN0IGJlIGNhbGxlZCBubyBtb3JlIHRoYW4gb25jZSBwZXIgcmVxdWVzdC4KKyAgdmlydHVhbCB2b2lkIE5vdGlmeU9uQ2FuY2VsKENsb3N1cmUqIGNhbGxiYWNrKSA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUnBjQ29udHJvbGxlcik7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIFJQQyBjaGFubmVsLiAgQW4gUnBjQ2hhbm5lbCByZXByZXNlbnRzIGEKKy8vIGNvbW11bmljYXRpb24gbGluZSB0byBhIFNlcnZpY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGF0IFNlcnZpY2UncworLy8gbWV0aG9kcy4gIFRoZSBTZXJ2aWNlIG1heSBiZSBydW5uaW5nIG9uIGFub3RoZXIgbWFjaGluZS4gIE5vcm1hbGx5LCB5b3UKKy8vIHNob3VsZCBub3QgY2FsbCBhbiBScGNDaGFubmVsIGRpcmVjdGx5LCBidXQgaW5zdGVhZCBjb25zdHJ1Y3QgYSBzdHViIFNlcnZpY2UKKy8vIHdyYXBwaW5nIGl0LiAgRXhhbXBsZToKKy8vICAgUnBjQ2hhbm5lbCogY2hhbm5lbCA9IG5ldyBNeVJwY0NoYW5uZWwoInJlbW90ZWhvc3QuZXhhbXBsZS5jb206MTIzNCIpOworLy8gICBNeVNlcnZpY2UqIHNlcnZpY2UgPSBuZXcgTXlTZXJ2aWNlOjpTdHViKGNoYW5uZWwpOworLy8gICBzZXJ2aWNlLT5NeU1ldGhvZChyZXF1ZXN0LCAmcmVzcG9uc2UsIGNhbGxiYWNrKTsKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBScGNDaGFubmVsIHsKKyBwdWJsaWM6CisgIGlubGluZSBScGNDaGFubmVsKCkge30KKyAgdmlydHVhbCB+UnBjQ2hhbm5lbCgpOworCisgIC8vIENhbGwgdGhlIGdpdmVuIG1ldGhvZCBvZiB0aGUgcmVtb3RlIHNlcnZpY2UuICBUaGUgc2lnbmF0dXJlIG9mIHRoaXMKKyAgLy8gcHJvY2VkdXJlIGxvb2tzIHRoZSBzYW1lIGFzIFNlcnZpY2U6OkNhbGxNZXRob2QoKSwgYnV0IHRoZSByZXF1aXJlbWVudHMKKyAgLy8gYXJlIGxlc3Mgc3RyaWN0IGluIG9uZSBpbXBvcnRhbnQgd2F5OiAgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG9iamVjdHMKKyAgLy8gbmVlZCBub3QgYmUgb2YgYW55IHNwZWNpZmljIGNsYXNzIGFzIGxvbmcgYXMgdGhlaXIgZGVzY3JpcHRvcnMgYXJlCisgIC8vIG1ldGhvZC0+aW5wdXRfdHlwZSgpIGFuZCBtZXRob2QtPm91dHB1dF90eXBlKCkuCisgIHZpcnR1YWwgdm9pZCBDYWxsTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhScGNDaGFubmVsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TRVJWSUNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTgxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoZSByb3V0aW5lcyBleHBvcnRlZCBieSB0aGlzIG1vZHVsZSBhcmUgc3VidGxlLiAgSWYgeW91IHVzZSB0aGVtLCBldmVuIGlmCisvLyB5b3UgZ2V0IHRoZSBjb2RlIHJpZ2h0LCBpdCB3aWxsIGRlcGVuZCBvbiBjYXJlZnVsIHJlYXNvbmluZyBhYm91dCBhdG9taWNpdHkKKy8vIGFuZCBtZW1vcnkgb3JkZXJpbmc7IGl0IHdpbGwgYmUgbGVzcyByZWFkYWJsZSwgYW5kIGhhcmRlciB0byBtYWludGFpbi4gIElmCisvLyB5b3UgcGxhbiB0byB1c2UgdGhlc2Ugcm91dGluZXMsIHlvdSBzaG91bGQgaGF2ZSBhIGdvb2QgcmVhc29uLCBzdWNoIGFzIHNvbGlkCisvLyBldmlkZW5jZSB0aGF0IHBlcmZvcm1hbmNlIHdvdWxkIG90aGVyd2lzZSBzdWZmZXIsIG9yIHRoZXJlIGJlaW5nIG5vCisvLyBhbHRlcm5hdGl2ZS4gIFlvdSBzaG91bGQgYXNzdW1lIG9ubHkgcHJvcGVydGllcyBleHBsaWNpdGx5IGd1YXJhbnRlZWQgYnkgdGhlCisvLyBzcGVjaWZpY2F0aW9ucyBpbiB0aGlzIGZpbGUuICBZb3UgYXJlIGFsbW9zdCBjZXJ0YWlubHkgX25vdF8gd3JpdGluZyBjb2RlCisvLyBqdXN0IGZvciB0aGUgeDg2OyBpZiB5b3UgYXNzdW1lIHg4NiBzZW1hbnRpY3MsIHg4NiBoYXJkd2FyZSBidWdzIGFuZAorLy8gaW1wbGVtZW50YXRpb25zIG9uIG90aGVyIGFyY2h0ZWN0dXJlcyB3aWxsIGNhdXNlIHlvdXIgY29kZSB0byBicmVhay4gIElmIHlvdQorLy8gZG8gbm90IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBhdm9pZCB0aGVzZSByb3V0aW5lcywgYW5kIHVzZSBhIE11dGV4LgorLy8KKy8vIEl0IGlzIGluY29ycmVjdCB0byBtYWtlIGRpcmVjdCBhc3NpZ25tZW50cyB0by9mcm9tIGFuIGF0b21pYyB2YXJpYWJsZS4KKy8vIFlvdSBzaG91bGQgdXNlIG9uZSBvZiB0aGUgTG9hZCBvciBTdG9yZSByb3V0aW5lcy4gIFRoZSBOb0JhcnJpZXIKKy8vIHZlcnNpb25zIGFyZSBwcm92aWRlZCB3aGVuIG5vIGJhcnJpZXJzIGFyZSBuZWVkZWQ6CisvLyAgIE5vQmFycmllcl9TdG9yZSgpCisvLyAgIE5vQmFycmllcl9Mb2FkKCkKKy8vIEFsdGhvdWdoIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gY29tcGlsZXIgZW5mb3JjZW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZAorLy8gdG8gdXNlIHRoZXNlLgorCisvLyBUaGlzIGhlYWRlciBhbmQgdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCBwbGF0Zm9ybSAobG9jYXRlZCBpbgorLy8gYXRvbWljb3BzX2ludGVybmFsc18qKSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB1cHN0cmVhbSBjb2RlIChWOCkuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0hfCisKKy8vIERvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGZvciBwZW9wbGUgbm90IGNvbmNlcm5lZCBhYm91dCB0aHJlYWQgc2FmZXR5LgorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0eXBlZGVmIGludDMyIEF0b21pYzMyOworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVAorLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGdvIGJldHdlZW4gQXRvbWljNjQgYW5kIEF0b21pY1dvcmQgaW1wbGljaXRseS4gIFRoaXMKKy8vIG1lYW5zIEF0b21pYzY0IGFuZCBBdG9taWNXb3JkIHNob3VsZCBiZSB0aGUgc2FtZSB0eXBlIG9uIDY0LWJpdC4KKyNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19OQUNMKQorLy8gTmFDbCdzIGludHB0cl90IGlzIG5vdCBhY3R1YWxseSA2NC1iaXRzIG9uIDY0LWJpdCEKKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9uYXRpdmVjbGllbnQvaXNzdWVzL2RldGFpbD9pZD0xMTYyCit0eXBlZGVmIGludDY0IEF0b21pYzY0OworI2Vsc2UKK3R5cGVkZWYgaW50cHRyX3QgQXRvbWljNjQ7CisjZW5kaWYKKyNlbmRpZgorCisvLyBVc2UgQXRvbWljV29yZCBmb3IgYSBtYWNoaW5lLXNpemVkIHBvaW50ZXIuICBJdCB3aWxsIHVzZSB0aGUgQXRvbWljMzIgb3IKKy8vIEF0b21pYzY0IHJvdXRpbmVzIGJlbG93LCBkZXBlbmRpbmcgb24geW91ciBhcmNoaXRlY3R1cmUuCit0eXBlZGVmIGludHB0cl90IEF0b21pY1dvcmQ7CisKKy8vIEF0b21pY2FsbHkgZXhlY3V0ZToKKy8vICAgICAgcmVzdWx0ID0gKnB0cjsKKy8vICAgICAgaWYgKCpwdHIgPT0gb2xkX3ZhbHVlKQorLy8gICAgICAgICpwdHIgPSBuZXdfdmFsdWU7CisvLyAgICAgIHJldHVybiByZXN1bHQ7CisvLworLy8gSS5lLiwgcmVwbGFjZSAiKnB0ciIgd2l0aCAibmV3X3ZhbHVlIiBpZiAiKnB0ciIgdXNlZCB0byBiZSAib2xkX3ZhbHVlIi4KKy8vIEFsd2F5cyByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiAiKnB0ciIKKy8vCisvLyBUaGlzIHJvdXRpbmUgaW1wbGllcyBubyBtZW1vcnkgYmFycmllcnMuCitBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKTsKKworLy8gQXRvbWljYWxseSBzdG9yZSBuZXdfdmFsdWUgaW50byAqcHRyLCByZXR1cm5pbmcgdGhlIHByZXZpb3VzIHZhbHVlIGhlbGQgaW4KKy8vICpwdHIuICBUaGlzIHJvdXRpbmUgaW1wbGllcyBubyBtZW1vcnkgYmFycmllcnMuCitBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgbmV3X3ZhbHVlKTsKKworLy8gQXRvbWljYWxseSBpbmNyZW1lbnQgKnB0ciBieSAiaW5jcmVtZW50Ii4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZgorLy8gKnB0ciB3aXRoIHRoZSBpbmNyZW1lbnQgYXBwbGllZC4gIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KK0F0b21pYzMyIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgaW5jcmVtZW50KTsKKworQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCk7CisKKy8vIFRoZXNlIGZvbGxvd2luZyBsb3dlci1sZXZlbCBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgdXNlZnVsIG9ubHkgdG8gcGVvcGxlCisvLyBpbXBsZW1lbnRpbmcgaGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zIGxpa2Ugc3BpbmxvY2tzLAorLy8gbXV0ZXhlcywgYW5kIGNvbmRpdGlvbi12YXJpYWJsZXMuICBUaGV5IGNvbWJpbmUgQ29tcGFyZUFuZFN3YXAoKSwgYSBsb2FkLCBvcgorLy8gYSBzdG9yZSB3aXRoIGFwcHJvcHJpYXRlIG1lbW9yeS1vcmRlcmluZyBpbnN0cnVjdGlvbnMuICAiQWNxdWlyZSIgb3BlcmF0aW9ucworLy8gZW5zdXJlIHRoYXQgbm8gbGF0ZXIgbWVtb3J5IGFjY2VzcyBjYW4gYmUgcmVvcmRlcmVkIGFoZWFkIG9mIHRoZSBvcGVyYXRpb24uCisvLyAiUmVsZWFzZSIgb3BlcmF0aW9ucyBlbnN1cmUgdGhhdCBubyBwcmV2aW91cyBtZW1vcnkgYWNjZXNzIGNhbiBiZSByZW9yZGVyZWQKKy8vIGFmdGVyIHRoZSBvcGVyYXRpb24uICAiQmFycmllciIgb3BlcmF0aW9ucyBoYXZlIGJvdGggIkFjcXVpcmUiIGFuZCAiUmVsZWFzZSIKKy8vIHNlbWFudGljcy4gICBBIE1lbW9yeUJhcnJpZXIoKSBoYXMgIkJhcnJpZXIiIHNlbWFudGljcywgYnV0IGRvZXMgbm8gbWVtb3J5CisvLyBhY2Nlc3MuCitBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKTsKK0F0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpOworCit2b2lkIE1lbW9yeUJhcnJpZXIoKTsKK3ZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKTsKK3ZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSk7Cit2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpOworCitBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKTsKK0F0b21pYzMyIEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKTsKK0F0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKTsKKworLy8gNjQtYml0IGF0b21pYyBvcGVyYXRpb25zIChvbmx5IGF2YWlsYWJsZSBvbiA2NC1iaXQgcHJvY2Vzc29ycykuCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUCitBdG9taWM2NCBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKTsKK0F0b21pYzY0IE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCBuZXdfdmFsdWUpOworQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCBpbmNyZW1lbnQpOworQXRvbWljNjQgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgaW5jcmVtZW50KTsKKworQXRvbWljNjQgQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSk7CitBdG9taWM2NCBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKTsKK3ZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKTsKK3ZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSk7Cit2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpOworQXRvbWljNjQgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cik7CitBdG9taWM2NCBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cik7CitBdG9taWM2NCBSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cik7CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisvLyBJbmNsdWRlIG91ciBwbGF0Zm9ybSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUiBcCisjZXJyb3IgIkF0b21pYyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHlvdXIgcGxhdGZvcm0iCisKKy8vIE1TVkMuCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX0lBMzIpIHx8IGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfWDY0KQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmg+CisjZWxzZQorR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgorI2VuZGlmCisKKy8vIEFwcGxlLgorI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfQVBQTEUpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4Lmg+CisKKy8vIEdDQy4KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9JQTMyKSB8fCBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX1g2NCkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmg+CisjZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX0FSTSkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fZ2NjLmg+CisjZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX0FSTV9RTlgpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oPgorI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmg+CisjZWxpZiBkZWZpbmVkKF9fcG5hY2xfXykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wbmFjbC5oPgorI2Vsc2UKK0dPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IKKyNlbmRpZgorCisvLyBVbmtub3duLgorI2Vsc2UKK0dPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IKKyNlbmRpZgorCisvLyBPbiBzb21lIHBsYXRmb3JtcyB3ZSBuZWVkIGFkZGl0aW9uYWwgZGVjbGFyYXRpb25zIHRvIG1ha2UgQXRvbWljV29yZAorLy8gY29tcGF0aWJsZSB3aXRoIG91ciBvdGhlciBBdG9taWMqIHR5cGVzLgorI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX0FQUExFKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0Lmg+CisjZW5kaWYKKworI3VuZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjRkZWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oCkBAIC0wLDAgKzEsMTUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKy8vCisvLyBMaW51eEtlcm5lbENtcHhjaGcgYW5kIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50IGFyZSBmcm9tIEdvb2dsZSBHZWFycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19BUk1fR0NDX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX0FSTV9HQ0NfSF8KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gMHhmZmZmMGZjMCBpcyB0aGUgaGFyZCBjb2RlZCBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gcHJvdmlkZWQgYnkKKy8vIHRoZSBrZXJuZWwgd2hpY2ggaW1wbGVtZW50cyBhbiBhdG9taWMgY29tcGFyZS1leGNoYW5nZS4gT24gb2xkZXIKKy8vIEFSTSBhcmNoaXRlY3R1cmUgcmV2aXNpb25zIChwcmUtdjYpIHRoaXMgbWF5IGJlIGltcGxlbWVudGVkIHVzaW5nCisvLyBhIHN5c2NhbGwuIFRoaXMgYWRkcmVzcyBpcyBzdGFibGUsIGFuZCBpbiBhY3RpdmUgdXNlIChoYXJkIGNvZGVkKQorLy8gYnkgYXQgbGVhc3QgZ2xpYmMtMi43IGFuZCB0aGUgQW5kcm9pZCBDIGxpYnJhcnkuCit0eXBlZGVmIEF0b21pYzMyICgqTGludXhLZXJuZWxDbXB4Y2hnRnVuYykoQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBBdG9taWMzMiogcHRyKTsKK0xpbnV4S2VybmVsQ21weGNoZ0Z1bmMgcExpbnV4S2VybmVsQ21weGNoZyBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgPQorICAgIChMaW51eEtlcm5lbENtcHhjaGdGdW5jKSAweGZmZmYwZmMwOworCit0eXBlZGVmIHZvaWQgKCpMaW51eEtlcm5lbE1lbW9yeUJhcnJpZXJGdW5jKSh2b2lkKTsKK0xpbnV4S2VybmVsTWVtb3J5QmFycmllckZ1bmMgcExpbnV4S2VybmVsTWVtb3J5QmFycmllciBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgPQorICAgIChMaW51eEtlcm5lbE1lbW9yeUJhcnJpZXJGdW5jKSAweGZmZmYwZmEwOworCisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgcHJldl92YWx1ZSA9ICpwdHI7CisgIGRvIHsKKyAgICBpZiAoIXBMaW51eEtlcm5lbENtcHhjaGcob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSkgeworICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgICB9CisgICAgcHJldl92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKKyAgcmV0dXJuIHByZXZfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzMyIG9sZF92YWx1ZTsKKyAgZG8geworICAgIG9sZF92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKHBMaW51eEtlcm5lbENtcHhjaGcob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxBdG9taWMzMio+KHB0cikpKTsKKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgeworICByZXR1cm4gQmFycmllcl9BdG9taWNJbmNyZW1lbnQocHRyLCBpbmNyZW1lbnQpOworfQorCitpbmxpbmUgQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgZm9yICg7OykgeworICAgIC8vIEF0b21pYyBleGNoYW5nZSB0aGUgb2xkIHZhbHVlIHdpdGggYW4gaW5jcmVtZW50ZWQgb25lLgorICAgIEF0b21pYzMyIG9sZF92YWx1ZSA9ICpwdHI7CisgICAgQXRvbWljMzIgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgaW5jcmVtZW50OworICAgIGlmIChwTGludXhLZXJuZWxDbXB4Y2hnKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSA9PSAwKSB7CisgICAgICAvLyBUaGUgZXhjaGFuZ2UgdG9vayBwbGFjZSBhcyBleHBlY3RlZC4KKyAgICAgIHJldHVybiBuZXdfdmFsdWU7CisgICAgfQorICAgIC8vIE90aGVyd2lzZSwgKnB0ciBjaGFuZ2VkIG1pZC1sb29wIGFuZCB3ZSBuZWVkIHRvIHJldHJ5LgorICB9Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgdm9pZCBNZW1vcnlCYXJyaWVyKCkgeworICBwTGludXhLZXJuZWxNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworICBNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIHJldHVybiAqcHRyOworfQorCitpbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVJNX0dDQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTA3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fcW54LmgKQEAgLTAsMCArMSwxNDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBhbiBpbnRlcm5hbCBhdG9taWMgaW1wbGVtZW50YXRpb24sIHVzZSBhdG9taWNvcHMuaCBpbnN0ZWFkLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX0FSTV9RTlhfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVJNX1FOWF9IXworCisvLyBGb3IgX3NtcF9jbXB4Y2hnKCkKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSBBdG9taWMzMiBRTlhDbXB4Y2hnKEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIEF0b21pYzMyKiBwdHIpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pYzMyPigKKyAgICAgIF9zbXBfY21weGNoZygodm9sYXRpbGUgdW5zaWduZWQgKilwdHIsCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3X3ZhbHVlKSk7Cit9CisKKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICBBdG9taWMzMiBwcmV2X3ZhbHVlID0gKnB0cjsKKyAgZG8geworICAgIGlmICghUU5YQ21weGNoZyhvbGRfdmFsdWUsIG5ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxBdG9taWMzMio+KHB0cikpKSB7CisgICAgICByZXR1cm4gb2xkX3ZhbHVlOworICAgIH0KKyAgICBwcmV2X3ZhbHVlID0gKnB0cjsKKyAgfSB3aGlsZSAocHJldl92YWx1ZSA9PSBvbGRfdmFsdWUpOworICByZXR1cm4gcHJldl92YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgb2xkX3ZhbHVlOworICBkbyB7CisgICAgb2xkX3ZhbHVlID0gKnB0cjsKKyAgfSB3aGlsZSAoUU5YQ21weGNoZyhvbGRfdmFsdWUsIG5ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSkpOworICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7CisgIHJldHVybiBCYXJyaWVyX0F0b21pY0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7Cit9CisKK2lubGluZSBBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgeworICBmb3IgKDs7KSB7CisgICAgLy8gQXRvbWljIGV4Y2hhbmdlIHRoZSBvbGQgdmFsdWUgd2l0aCBhbiBpbmNyZW1lbnRlZCBvbmUuCisgICAgQXRvbWljMzIgb2xkX3ZhbHVlID0gKnB0cjsKKyAgICBBdG9taWMzMiBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBpbmNyZW1lbnQ7CisgICAgaWYgKFFOWENtcHhjaGcob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxBdG9taWMzMio+KHB0cikpID09IDApIHsKKyAgICAgIC8vIFRoZSBleGNoYW5nZSB0b29rIHBsYWNlIGFzIGV4cGVjdGVkLgorICAgICAgcmV0dXJuIG5ld192YWx1ZTsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlLCAqcHRyIGNoYW5nZWQgbWlkLWxvb3AgYW5kIHdlIG5lZWQgdG8gcmV0cnkuCisgIH0KK30KKworaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIE1lbW9yeUJhcnJpZXIoKSB7CisgIF9fc3luY19zeW5jaHJvbml6ZSgpOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKKyAgTWVtb3J5QmFycmllcigpOworfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICByZXR1cm4gKnB0cjsKK30KKworaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIEF0b21pYzMyIHZhbHVlID0gKnB0cjsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiAqcHRyOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX0FSTV9RTlhfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDg2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oCkBAIC0wLDAgKzEsMTIyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19BVE9NSUNXT1JEX0NPTVBBVF9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19BVE9NSUNXT1JEX0NPTVBBVF9IXworCisvLyBBdG9taWNXb3JkIGlzIGEgc3lub255bSBmb3IgaW50cHRyX3QsIGFuZCBBdG9taWMzMiBpcyBhIHN5bm9ueW0gZm9yIGludDMyLAorLy8gd2hpY2ggaW4gdHVybiBtZWFucyBpbnQuIE9uIHNvbWUgTFAzMiBwbGF0Zm9ybXMsIGludHB0cl90IGlzIGFuIGludCwgYnV0CisvLyBvbiBvdGhlcnMsIGl0J3MgYSBsb25nLiBXaGVuIEF0b21pY1dvcmQgYW5kIEF0b21pYzMyIGFyZSBiYXNlZCBvbiBkaWZmZXJlbnQKKy8vIGZ1bmRhbWVudGFsIHR5cGVzLCB0aGVpciBwb2ludGVycyBhcmUgaW5jb21wYXRpYmxlLgorLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9uIG92ZXJsb2FkcyB0byBhbGxvdyBib3RoIEF0b21pY1dvcmQgYW5kIEF0b21pYzMyCisvLyBkYXRhIHRvIGJlIHVzZWQgd2l0aCB0aGlzIGludGVyZmFjZS4KKy8vCisvLyBPbiBMUDY0IHBsYXRmb3JtcywgQXRvbWljV29yZCBhbmQgQXRvbWljNjQgYXJlIGJvdGggYWx3YXlzIGxvbmcsCisvLyBzbyB0aGlzIHByb2JsZW0gZG9lc24ndCBvY2N1ci4KKworI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCkKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworaW5saW5lIEF0b21pY1dvcmQgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSBBdG9taWNXb3JkIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljV29yZCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIGluY3JlbWVudCkgeworICByZXR1cm4gTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgQXRvbWljMzIqPihwdHIpLCBpbmNyZW1lbnQpOworfQorCitpbmxpbmUgQXRvbWljV29yZCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIGluY3JlbWVudCkgeworICByZXR1cm4gQmFycmllcl9BdG9taWNJbmNyZW1lbnQoCisgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgaW5jcmVtZW50KTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY1dvcmQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG5ld192YWx1ZSkgeworICByZXR1cm4gQWNxdWlyZV9Db21wYXJlQW5kU3dhcCgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgQXRvbWljMzIqPihwdHIpLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSBBdG9taWNXb3JkIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljV29yZCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAoCisgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljV29yZCAqcHRyLCBBdG9taWNXb3JkIHZhbHVlKSB7CisgIE5vQmFycmllcl9TdG9yZShyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwgQXRvbWljV29yZCB2YWx1ZSkgeworICByZXR1cm4gQWNxdWlyZV9TdG9yZShyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwgQXRvbWljV29yZCB2YWx1ZSkgeworICByZXR1cm4gUmVsZWFzZV9TdG9yZShyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgdmFsdWUpOworfQorCitpbmxpbmUgQXRvbWljV29yZCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWNXb3JkICpwdHIpIHsKKyAgcmV0dXJuIE5vQmFycmllcl9Mb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgY29uc3QgQXRvbWljMzIqPihwdHIpKTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pY1dvcmQqIHB0cikgeworICByZXR1cm4gQWNxdWlyZV9Mb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgY29uc3QgQXRvbWljMzIqPihwdHIpKTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pY1dvcmQqIHB0cikgeworICByZXR1cm4gUmVsZWFzZV9Mb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgY29uc3QgQXRvbWljMzIqPihwdHIpKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQpCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVRPTUlDV09SRF9DT01QQVRfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliNzU4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oCkBAIC0wLDAgKzEsMjI1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NQUNPU1hfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfTUFDT1NYX0hfCisKKyNpbmNsdWRlIDxsaWJrZXJuL09TQXRvbWljLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwMzIob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSkpIHsKKyAgICAgIHJldHVybiBvbGRfdmFsdWU7CisgICAgfQorICAgIHByZXZfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlIChwcmV2X3ZhbHVlID09IG9sZF92YWx1ZSk7CisgIHJldHVybiBwcmV2X3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICBBdG9taWMzMiBvbGRfdmFsdWU7CisgIGRvIHsKKyAgICBvbGRfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlICghT1NBdG9taWNDb21wYXJlQW5kU3dhcDMyKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSk7CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgcmV0dXJuIE9TQXRvbWljQWRkMzIoaW5jcmVtZW50LCBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSk7Cit9CisKK2lubGluZSBBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7CisgIHJldHVybiBPU0F0b21pY0FkZDMyQmFycmllcihpbmNyZW1lbnQsIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKTsKK30KKworaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKKyAgT1NNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwMzJCYXJyaWVyKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSkgeworICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgICB9CisgICAgcHJldl92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKKyAgcmV0dXJuIHByZXZfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworICBNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIHJldHVybiAqcHRyOworfQorCitpbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKyNpZmRlZiBfX0xQNjRfXworCisvLyA2NC1iaXQgaW1wbGVtZW50YXRpb24gb24gNjQtYml0IHBsYXRmb3JtCisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgQXRvbWljNjQgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjQob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIGludDY0X3QqPihwdHIpKSkgeworICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgICB9CisgICAgcHJldl92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKKyAgcmV0dXJuIHByZXZfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzY0IG9sZF92YWx1ZTsKKyAgZG8geworICAgIG9sZF92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKCFPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjQob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSkpOworICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgaW5jcmVtZW50KSB7CisgIHJldHVybiBPU0F0b21pY0FkZDY0KGluY3JlbWVudCwgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSk7Cit9CisKK2lubGluZSBBdG9taWM2NCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICByZXR1cm4gT1NBdG9taWNBZGQ2NEJhcnJpZXIoaW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSk7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgQXRvbWljNjQgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjRCYXJyaWVyKAorICAgICAgICBvbGRfdmFsdWUsIG5ld192YWx1ZSwgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSkpIHsKKyAgICAgIHJldHVybiBvbGRfdmFsdWU7CisgICAgfQorICAgIHByZXZfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlIChwcmV2X3ZhbHVlID09IG9sZF92YWx1ZSk7CisgIHJldHVybiBwcmV2X3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljNjQgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIC8vIFRoZSBsaWIga2VybiBpbnRlcmZhY2UgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAvLyBBY3F1aXJlIGFuZCBSZWxlYXNlIG1lbW9yeSBiYXJyaWVyczsgdGhleSBhcmUgZXF1aXZhbGVudC4KKyAgcmV0dXJuIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworICBNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIHJldHVybiAqcHRyOworfQorCitpbmxpbmUgQXRvbWljNjQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKKyAgQXRvbWljNjQgdmFsdWUgPSAqcHRyOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKyNlbmRpZiAgLy8gZGVmaW5lZChfX0xQNjRfXykKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NQUNPU1hfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDY4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oCkBAIC0wLDAgKzEsMTg3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NSVBTX0dDQ19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NSVBTX0dDQ19IXworCisjZGVmaW5lIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oIiIgOiA6IDogIm1lbW9yeSIpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEF0b21pY2FsbHkgZXhlY3V0ZToKKy8vICAgICAgcmVzdWx0ID0gKnB0cjsKKy8vICAgICAgaWYgKCpwdHIgPT0gb2xkX3ZhbHVlKQorLy8gICAgICAgICpwdHIgPSBuZXdfdmFsdWU7CisvLyAgICAgIHJldHVybiByZXN1bHQ7CisvLworLy8gSS5lLiwgcmVwbGFjZSAiKnB0ciIgd2l0aCAibmV3X3ZhbHVlIiBpZiAiKnB0ciIgdXNlZCB0byBiZSAib2xkX3ZhbHVlIi4KKy8vIEFsd2F5cyByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiAiKnB0ciIKKy8vCisvLyBUaGlzIHJvdXRpbmUgaW1wbGllcyBubyBtZW1vcnkgYmFycmllcnMuCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzMyIHByZXYsIHRtcDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICJsbCAlMCwgJTVcbiIgIC8vIHByZXYgPSAqcHRyCisgICAgICAgICAgICAgICAgICAgICAgICJibmUgJTAsICUzLCAyZlxuIiAgLy8gaWYgKHByZXYgIT0gb2xkX3ZhbHVlKSBnb3RvIDIKKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdmUgJTIsICU0XG4iICAvLyB0bXAgPSBuZXdfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgInNjICUyLCAlMVxuIiAgLy8gKnB0ciA9IHRtcCAod2l0aCBhdG9taWMgY2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICJiZXF6ICUyLCAxYlxuIiAgLy8gc3RhcnQgYWdhaW4gb24gYXRvbWljIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICJub3BcbiIgIC8vIGRlbGF5IHNsb3Qgbm9wCisgICAgICAgICAgICAgICAgICAgICAgICIyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAocHJldiksICI9bSIgKCpwdHIpLCAiPSZyIiAodG1wKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJJciIgKG9sZF92YWx1ZSksICJyIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgcmV0dXJuIHByZXY7Cit9CisKKy8vIEF0b21pY2FsbHkgc3RvcmUgbmV3X3ZhbHVlIGludG8gKnB0ciwgcmV0dXJuaW5nIHRoZSBwcmV2aW91cyB2YWx1ZSBoZWxkIGluCisvLyAqcHRyLiAgVGhpcyByb3V0aW5lIGltcGxpZXMgbm8gbWVtb3J5IGJhcnJpZXJzLgoraW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgdGVtcCwgb2xkOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBwdXNoXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiMTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgImxsICUxLCAlMlxuIiAgLy8gb2xkID0gKnB0cgorICAgICAgICAgICAgICAgICAgICAgICAibW92ZSAlMCwgJTNcbiIgIC8vIHRlbXAgPSBuZXdfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgInNjICUwLCAlMlxuIiAgLy8gKnB0ciA9IHRlbXAgKHdpdGggYXRvbWljIGNoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAiYmVxeiAlMCwgMWJcbiIgIC8vIHN0YXJ0IGFnYWluIG9uIGF0b21pYyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAibm9wXG4iICAvLyBkZWxheSBzbG90IG5vcAorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAodGVtcCksICI9JnIiIChvbGQpLCAiPW0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKworICByZXR1cm4gb2xkOworfQorCisvLyBBdG9taWNhbGx5IGluY3JlbWVudCAqcHRyIGJ5ICJpbmNyZW1lbnQiLiAgUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mCisvLyAqcHRyIHdpdGggdGhlIGluY3JlbWVudCBhcHBsaWVkLiAgVGhpcyByb3V0aW5lIGltcGxpZXMgbm8gbWVtb3J5IGJhcnJpZXJzLgoraW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgeworICBBdG9taWMzMiB0ZW1wLCB0ZW1wMjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBwdXNoXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiMTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgImxsICUwLCAlMlxuIiAgLy8gdGVtcCA9ICpwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgImFkZHUgJTEsICUwLCAlM1xuIiAgLy8gdGVtcDIgPSB0ZW1wICsgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICJzYyAlMSwgJTJcbiIgIC8vICpwdHIgPSB0ZW1wMiAod2l0aCBhdG9taWMgY2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICJiZXF6ICUxLCAxYlxuIiAgLy8gc3RhcnQgYWdhaW4gb24gYXRvbWljIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICJhZGR1ICUxLCAlMCwgJTNcbiIgIC8vIHRlbXAyID0gdGVtcCArIGluY3JlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAodGVtcCksICI9JnIiICh0ZW1wMiksICI9bSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogIklyIiAoaW5jcmVtZW50KSwgIm0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgLy8gdGVtcDIgbm93IGhvbGRzIHRoZSBmaW5hbCB2YWx1ZS4KKyAgcmV0dXJuIHRlbXAyOworfQorCitpbmxpbmUgQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgQXRvbWljMzIgcmVzID0gTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7CisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisgIHJldHVybiByZXM7Cit9CisKKy8vICJBY3F1aXJlIiBvcGVyYXRpb25zCisvLyBlbnN1cmUgdGhhdCBubyBsYXRlciBtZW1vcnkgYWNjZXNzIGNhbiBiZSByZW9yZGVyZWQgYWhlYWQgb2YgdGhlIG9wZXJhdGlvbi4KKy8vICJSZWxlYXNlIiBvcGVyYXRpb25zIGVuc3VyZSB0aGF0IG5vIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3MgY2FuIGJlIHJlb3JkZXJlZAorLy8gYWZ0ZXIgdGhlIG9wZXJhdGlvbi4gICJCYXJyaWVyIiBvcGVyYXRpb25zIGhhdmUgYm90aCAiQWNxdWlyZSIgYW5kICJSZWxlYXNlIgorLy8gc2VtYW50aWNzLiAgIEEgTWVtb3J5QmFycmllcigpIGhhcyAiQmFycmllciIgc2VtYW50aWNzLCBidXQgZG9lcyBubyBtZW1vcnkKKy8vIGFjY2Vzcy4KK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgQXRvbWljMzIgcmVzID0gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworICBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpOworICByZXR1cm4gcmVzOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisgIEF0b21pYzMyIHJlcyA9IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgcmV0dXJuIHJlczsKK30KKworaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKK30KKworaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKK30KKworaW5saW5lIHZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7CisgIE1lbW9yeUJhcnJpZXIoKTsKK30KKworaW5saW5lIHZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICBNZW1vcnlCYXJyaWVyKCk7CisgICpwdHIgPSB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICBBdG9taWMzMiB2YWx1ZSA9ICpwdHI7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gKnB0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI3VuZGVmIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfTUlQU19HQ0NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3BuYWNsLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wbmFjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTkxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wbmFjbC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBhbiBpbnRlcm5hbCBhdG9taWMgaW1wbGVtZW50YXRpb24sIHVzZSBhdG9taWNvcHMuaCBpbnN0ZWFkLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1BOQUNMX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1BOQUNMX0hfCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKKyAgX19zeW5jX3N5bmNocm9uaXplKCk7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgcmV0ID0gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiByZXQ7Cit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICBBdG9taWMzMiB2YWx1ZSA9ICpwdHI7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1BOQUNMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzc0ODcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYwpAQCAtMCwwICsxLDEzNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBtb2R1bGUgZ2V0cyBlbm91Z2ggQ1BVIGluZm9ybWF0aW9uIHRvIG9wdGltaXplIHRoZQorLy8gYXRvbWljb3BzIG1vZHVsZSBvbiB4ODYuCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgorCisvLyBUaGlzIGZpbGUgb25seSBtYWtlcyBzZW5zZSB3aXRoIGF0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oIC0tIGl0CisvLyBkZXBlbmRzIG9uIHN0cnVjdHMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGF0IGZpbGUuICBJZiBhdG9taWNvcHMuaAorLy8gZG9lc24ndCBzdWItaW5jbHVkZSB0aGF0IGZpbGUsIHRoZW4gd2UgYXJlbid0IG5lZWRlZCwgYW5kIHNob3VsZG4ndAorLy8gdHJ5IHRvIGRvIGFueXRoaW5nLgorI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9HQ0NfSF8KKworLy8gSW5saW5lIGNwdWlkIGluc3RydWN0aW9uLiAgSW4gUElDIGNvbXBpbGF0aW9ucywgJWVieCBjb250YWlucyB0aGUgYWRkcmVzcworLy8gb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBUbyBhdm9pZCBicmVha2luZyBzdWNoIGV4ZWN1dGFibGVzLCB0aGlzIGNvZGUKKy8vIG11c3QgcHJlc2VydmUgdGhhdCByZWdpc3RlcidzIHZhbHVlIGFjcm9zcyBjcHVpZCBpbnN0cnVjdGlvbnMuCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyNkZWZpbmUgY3B1aWQoYSwgYiwgYywgZCwgaW5wKSBcCisgIGFzbSgibW92ICUlZWJ4LCAlJWVkaVxuIiAgICAgXAorICAgICAgImNwdWlkXG4iICAgICAgICAgICAgICAgIFwKKyAgICAgICJ4Y2hnICUlZWRpLCAlJWVieFxuIiAgICBcCisgICAgICA6ICI9YSIgKGEpLCAiPUQiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpIDogImEiIChpbnApKQorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBjcHVpZChhLCBiLCBjLCBkLCBpbnApIFwKKyAgYXNtKCJtb3YgJSVyYngsICUlcmRpXG4iICAgICBcCisgICAgICAiY3B1aWRcbiIgICAgICAgICAgICAgICAgXAorICAgICAgInhjaGcgJSVyZGksICUlcmJ4XG4iICAgIFwKKyAgICAgIDogIj1hIiAoYSksICI9RCIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkgOiAiYSIgKGlucCkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoY3B1aWQpICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzdHJ1Y3Qgb25seSBvbiB4ODYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gU2V0IHRoZSBmbGFncyBzbyB0aGF0IGNvZGUgd2lsbCBydW4gY29ycmVjdGx5IGFuZCBjb25zZXJ2YXRpdmVseSwgc28gZXZlbgorLy8gaWYgd2UgaGF2ZW4ndCBiZWVuIGluaXRpYWxpemVkIHlldCwgd2UncmUgcHJvYmFibHkgc2luZ2xlIHRocmVhZGVkLCBhbmQgb3VyCisvLyBkZWZhdWx0IHZhbHVlcyBzaG91bGQgaG9wZWZ1bGx5IGJlIHByZXR0eSBzYWZlLgorc3RydWN0IEF0b21pY09wc194ODZDUFVGZWF0dXJlU3RydWN0IEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzID0geworICBmYWxzZSwgICAgICAgICAgLy8gYnVnIGNhbid0IGV4aXN0IGJlZm9yZSBwcm9jZXNzIHNwYXducyBtdWx0aXBsZSB0aHJlYWRzCisgIGZhbHNlLCAgICAgICAgICAvLyBubyBTU0UyCit9OworCituYW1lc3BhY2UgeworCisvLyBJbml0aWFsaXplIHRoZSBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcyBzdHJ1Y3QuCit2b2lkIEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzSW5pdCgpIHsKKyAgdWludDMyX3QgZWF4OworICB1aW50MzJfdCBlYng7CisgIHVpbnQzMl90IGVjeDsKKyAgdWludDMyX3QgZWR4OworCisgIC8vIEdldCB2ZW5kb3Igc3RyaW5nIChpc3N1ZSBDUFVJRCB3aXRoIGVheCA9IDApCisgIGNwdWlkKGVheCwgZWJ4LCBlY3gsIGVkeCwgMCk7CisgIGNoYXIgdmVuZG9yWzEzXTsKKyAgbWVtY3B5KHZlbmRvciwgJmVieCwgNCk7CisgIG1lbWNweSh2ZW5kb3IgKyA0LCAmZWR4LCA0KTsKKyAgbWVtY3B5KHZlbmRvciArIDgsICZlY3gsIDQpOworICB2ZW5kb3JbMTJdID0gMDsKKworICAvLyBnZXQgZmVhdHVyZSBmbGFncyBpbiBlY3gvZWR4LCBhbmQgZmFtaWx5L21vZGVsIGluIGVheAorICBjcHVpZChlYXgsIGVieCwgZWN4LCBlZHgsIDEpOworCisgIGludCBmYW1pbHkgPSAoZWF4ID4+IDgpICYgMHhmOyAgICAgICAgLy8gZmFtaWx5IGFuZCBtb2RlbCBmaWVsZHMKKyAgaW50IG1vZGVsID0gKGVheCA+PiA0KSAmIDB4ZjsKKyAgaWYgKGZhbWlseSA9PSAweGYpIHsgICAgICAgICAgICAgICAgICAvLyB1c2UgZXh0ZW5kZWQgZmFtaWx5IGFuZCBtb2RlbCBmaWVsZHMKKyAgICBmYW1pbHkgKz0gKGVheCA+PiAyMCkgJiAweGZmOworICAgIG1vZGVsICs9ICgoZWF4ID4+IDE2KSAmIDB4ZikgPDwgNDsKKyAgfQorCisgIC8vIE9wdGVyb24gUmV2IEUgaGFzIGEgYnVnIGluIHdoaWNoIG9uIHZlcnkgcmFyZSBvY2Nhc2lvbnMgYSBsb2NrZWQKKyAgLy8gaW5zdHJ1Y3Rpb24gZG9lc24ndCBhY3QgYXMgYSByZWFkLWFjcXVpcmUgYmFycmllciBpZiBmb2xsb3dlZCBieSBhCisgIC8vIG5vbi1sb2NrZWQgcmVhZC1tb2RpZnktd3JpdGUgaW5zdHJ1Y3Rpb24uICBSZXYgRiBoYXMgdGhpcyBidWcgaW4KKyAgLy8gcHJlLXJlbGVhc2UgdmVyc2lvbnMsIGJ1dCBub3QgaW4gdmVyc2lvbnMgcmVsZWFzZWQgdG8gY3VzdG9tZXJzLAorICAvLyBzbyB3ZSB0ZXN0IG9ubHkgZm9yIFJldiBFLCB3aGljaCBpcyBmYW1pbHkgMTUsIG1vZGVsIDMyLi42MyBpbmNsdXNpdmUuCisgIGlmIChzdHJjbXAodmVuZG9yLCAiQXV0aGVudGljQU1EIikgPT0gMCAmJiAgICAgICAvLyBBTUQKKyAgICAgIGZhbWlseSA9PSAxNSAmJgorICAgICAgMzIgPD0gbW9kZWwgJiYgbW9kZWwgPD0gNjMpIHsKKyAgICBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfYW1kX2xvY2tfbWJfYnVnID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfYW1kX2xvY2tfbWJfYnVnID0gZmFsc2U7CisgIH0KKworICAvLyBlZHggYml0IDI2IGlzIFNTRTIgd2hpY2ggd2UgdXNlIHRvIHRlbGwgdXNlIHdoZXRoZXIgd2UgY2FuIHVzZSBtZmVuY2UKKyAgQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX3NzZTIgPSAoKGVkeCA+PiAyNikgJiAxKTsKK30KKworY2xhc3MgQXRvbWljT3BzeDg2SW5pdGlhbGl6ZXIgeworIHB1YmxpYzoKKyAgQXRvbWljT3BzeDg2SW5pdGlhbGl6ZXIoKSB7CisgICAgQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXNJbml0KCk7CisgIH0KK307CisKKy8vIEEgZ2xvYmFsIHRvIGdldCB1c2UgaW5pdGlhbGl6ZWQgb24gc3RhcnR1cCB2aWEgc3RhdGljIGluaXRpYWxpemF0aW9uIDovCitBdG9taWNPcHN4ODZJbml0aWFsaXplciBnX2luaXRlcjsKKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gX19pMzg2X18KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfR0NDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNGRmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuaApAQCAtMCwwICsxLDI5MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIGFuIGludGVybmFsIGF0b21pYyBpbXBsZW1lbnRhdGlvbiwgdXNlIGF0b21pY29wcy5oIGluc3RlYWQuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfWDg2X0dDQ19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfR0NDX0hfCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoaXMgc3RydWN0IGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIG9mIHRoaXMgbW9kdWxlOyBjbGllbnRzIG1heSBub3QKKy8vIHVzZSBpdC4KKy8vIEZlYXR1cmVzIG9mIHRoaXMgeDg2LiAgVmFsdWVzIG1heSBub3QgYmUgY29ycmVjdCBiZWZvcmUgbWFpbigpIGlzIHJ1biwKKy8vIGJ1dCBhcmUgc2V0IGNvbnNlcnZhdGl2ZWx5Lgorc3RydWN0IEF0b21pY09wc194ODZDUFVGZWF0dXJlU3RydWN0IHsKKyAgYm9vbCBoYXNfYW1kX2xvY2tfbWJfYnVnOyAgLy8gUHJvY2Vzc29yIGhhcyBBTUQgbWVtb3J5LWJhcnJpZXIgYnVnOyBkbyBsZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgYWNxdWlyZSBjb21wYXJlLWFuZC1zd2FwLgorICBib29sIGhhc19zc2UyOyAgICAgICAgICAgICAvLyBQcm9jZXNzb3IgaGFzIFNTRTIuCit9OworZXh0ZXJuIHN0cnVjdCBBdG9taWNPcHNfeDg2Q1BVRmVhdHVyZVN0cnVjdCBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlczsKKworI2RlZmluZSBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpIF9fYXNtX18gX192b2xhdGlsZV9fKCIiIDogOiA6ICJtZW1vcnkiKQorCisvLyAzMi1iaXQgbG93LWxldmVsIG9wZXJhdGlvbnMgb24gYW55IHBsYXRmb3JtLgorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzMyIHByZXY7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrOyBjbXB4Y2hnbCAlMSwlMiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChwcmV2KQorICAgICAgICAgICAgICAgICAgICAgICA6ICJxIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKSwgIjAiIChvbGRfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOworICByZXR1cm4gcHJldjsKK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oInhjaGdsICUxLCUwIiAgLy8gVGhlIGxvY2sgcHJlZml4IGlzIGltcGxpY2l0IGZvciB4Y2hnLgorICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKG5ld192YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgOiAibSIgKCpwdHIpLCAiMCIgKG5ld192YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgIHJldHVybiBuZXdfdmFsdWU7ICAvLyBOb3cgaXQncyB0aGUgcHJldmlvdXMgdmFsdWUuCit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgQXRvbWljMzIgdGVtcCA9IGluY3JlbWVudDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IHhhZGRsICUwLCUxIgorICAgICAgICAgICAgICAgICAgICAgICA6ICIrciIgKHRlbXApLCAiK20iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6IDogIm1lbW9yeSIpOworICAvLyB0ZW1wIG5vdyBob2xkcyB0aGUgb2xkIHZhbHVlIG9mICpwdHIKKyAgcmV0dXJuIHRlbXAgKyBpbmNyZW1lbnQ7Cit9CisKK2lubGluZSBBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgeworICBBdG9taWMzMiB0ZW1wID0gaW5jcmVtZW50OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgeGFkZGwgJTAsJTEiCisgICAgICAgICAgICAgICAgICAgICAgIDogIityIiAodGVtcCksICIrbSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogOiAibWVtb3J5Iik7CisgIC8vIHRlbXAgbm93IGhvbGRzIHRoZSBvbGQgdmFsdWUgb2YgKnB0cgorICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZykgeworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKyAgfQorICByZXR1cm4gdGVtcCArIGluY3JlbWVudDsKK30KKworaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICBBdG9taWMzMiB4ID0gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZykgeworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKyAgfQorICByZXR1cm4geDsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworfQorCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCisvLyA2NC1iaXQgaW1wbGVtZW50YXRpb25zIG9mIG1lbW9yeSBiYXJyaWVyIGNhbiBiZSBzaW1wbGVyLCBiZWNhdXNlIGl0CisvLyAibWZlbmNlIiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0LgoraW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1mZW5jZSIgOiA6IDogIm1lbW9yeSIpOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKKyAgTWVtb3J5QmFycmllcigpOworfQorCisjZWxzZQorCitpbmxpbmUgdm9pZCBNZW1vcnlCYXJyaWVyKCkgeworICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX3NzZTIpIHsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibWZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisgIH0gZWxzZSB7ICAvLyBtZmVuY2UgaXMgZmFzdGVyIGJ1dCBub3QgcHJlc2VudCBvbiBQSUlJCisgICAgQXRvbWljMzIgeCA9IDA7CisgICAgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKCZ4LCAwKTsgIC8vIGFjdHMgYXMgYSBiYXJyaWVyIG9uIFBJSUkKKyAgfQorfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgIGlmIChBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfc3NlMikgeworICAgICpwdHIgPSB2YWx1ZTsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibWZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisgIH0gZWxzZSB7CisgICAgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHB0ciwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3RzIGFzIGEgYmFycmllciBvbiBQSUlJCisgIH0KK30KKyNlbmRpZgorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisgICpwdHIgPSB2YWx1ZTsgIC8vIEFuIHg4NiBzdG9yZSBhY3RzIGFzIGEgcmVsZWFzZSBiYXJyaWVyLgorICAvLyBTZWUgY29tbWVudHMgaW4gQXRvbWljNjQgdmVyc2lvbiBvZiBSZWxlYXNlX1N0b3JlKCksIGJlbG93LgorfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICByZXR1cm4gKnB0cjsKK30KKworaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIEF0b21pYzMyIHZhbHVlID0gKnB0cjsgIC8vIEFuIHg4NiBsb2FkIGFjdHMgYXMgYSBhY3F1aXJlIGJhcnJpZXIuCisgIC8vIFNlZSBjb21tZW50cyBpbiBBdG9taWM2NCB2ZXJzaW9uIG9mIFJlbGVhc2VfU3RvcmUoKSwgYmVsb3cuCisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisKKy8vIDY0LWJpdCBsb3ctbGV2ZWwgb3BlcmF0aW9ucyBvbiA2NC1iaXQgcGxhdGZvcm0uCisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgQXRvbWljNjQgcHJldjsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IGNtcHhjaGdxICUxLCUyIgorICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHByZXYpCisgICAgICAgICAgICAgICAgICAgICAgIDogInEiIChuZXdfdmFsdWUpLCAibSIgKCpwdHIpLCAiMCIgKG9sZF92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgIHJldHVybiBwcmV2OworfQorCitpbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygieGNoZ3EgJTEsJTAiICAvLyBUaGUgbG9jayBwcmVmaXggaXMgaW1wbGljaXQgZm9yIHhjaGcuCisgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAobmV3X3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtIiAoKnB0ciksICIwIiAobmV3X3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgcmV0dXJuIG5ld192YWx1ZTsgIC8vIE5vdyBpdCdzIHRoZSBwcmV2aW91cyB2YWx1ZS4KK30KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICBBdG9taWM2NCB0ZW1wID0gaW5jcmVtZW50OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgeGFkZHEgJTAsJTEiCisgICAgICAgICAgICAgICAgICAgICAgIDogIityIiAodGVtcCksICIrbSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogOiAibWVtb3J5Iik7CisgIC8vIHRlbXAgbm93IGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiAqcHRyCisgIHJldHVybiB0ZW1wICsgaW5jcmVtZW50OworfQorCitpbmxpbmUgQXRvbWljNjQgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBpbmNyZW1lbnQpIHsKKyAgQXRvbWljNjQgdGVtcCA9IGluY3JlbWVudDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IHhhZGRxICUwLCUxIgorICAgICAgICAgICAgICAgICAgICAgICA6ICIrciIgKHRlbXApLCAiK20iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6IDogIm1lbW9yeSIpOworICAvLyB0ZW1wIG5vdyBjb250YWlucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgKnB0cgorICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZykgeworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKyAgfQorICByZXR1cm4gdGVtcCArIGluY3JlbWVudDsKK30KKworaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKK30KKworaW5saW5lIHZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7CisgIE1lbW9yeUJhcnJpZXIoKTsKK30KKworaW5saW5lIHZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgeworICBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpOworCisgICpwdHIgPSB2YWx1ZTsgIC8vIEFuIHg4NiBzdG9yZSBhY3RzIGFzIGEgcmVsZWFzZSBiYXJyaWVyCisgICAgICAgICAgICAgICAgIC8vIGZvciBjdXJyZW50IEFNRC9JbnRlbCBjaGlwcyBhcyBvZiBKYW4gMjAwOC4KKyAgICAgICAgICAgICAgICAgLy8gU2VlIGFsc28gQWNxdWlyZV9Mb2FkKCksIGJlbG93LgorCisgIC8vIFdoZW4gbmV3IGNoaXBzIGNvbWUgb3V0LCBjaGVjazoKKyAgLy8gIElBLTMyIEludGVsIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOgorICAvLyAgU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlLCBDaGF0cGVyIDc6IE11bHRpcGxlLXByb2Nlc3NvciBtYW5hZ2VtZW50LAorICAvLyAgU2VjdGlvbiA3LjIsIE1lbW9yeSBPcmRlcmluZy4KKyAgLy8gTGFzdCBzZWVuIGF0OgorICAvLyAgIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9wZW50aXVtNC9tYW51YWxzL2luZGV4X25ldy5odG0KKyAgLy8KKyAgLy8geDg2IHN0b3Jlcy9sb2FkcyBmYWlsIHRvIGFjdCBhcyBiYXJyaWVycyBmb3IgYSBmZXcgaW5zdHJ1Y3Rpb25zIChjbGZsdXNoCisgIC8vIG1hc2ttb3ZkcXUgbWFza21vdnEgbW92bnRkcSBtb3ZudGkgbW92bnRwZCBtb3ZudHBzIG1vdm50cSkgYnV0IHRoZXNlIGFyZQorICAvLyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciwgYW5kIGFyZSByYXJlLiAgVXNlcnMgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zCisgIC8vIG5lZWQgdG8ga25vdyBhYm91dCBjYWNoZSBiZWhhdmlvdXIgaW4gYW55IGNhc2Ugc2luY2UgYWxsIG9mIHRoZXNlIGludm9sdmUKKyAgLy8gZWl0aGVyIGZsdXNoaW5nIGNhY2hlIGxpbmVzIG9yIG5vbi10ZW1wb3JhbCBjYWNoZSBoaW50cy4KK30KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgeworICBBdG9taWM2NCB2YWx1ZSA9ICpwdHI7ICAvLyBBbiB4ODYgbG9hZCBhY3RzIGFzIGEgYWNxdWlyZSBiYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY3VycmVudCBBTUQvSW50ZWwgY2hpcHMgYXMgb2YgSmFuIDIwMDguCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBhbHNvIFJlbGVhc2VfU3RvcmUoKSwgYWJvdmUuCisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgQXRvbWljNjQgeCA9IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKKyAgaWYgKEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzLmhhc19hbWRfbG9ja19tYl9idWcpIHsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK2lubGluZSBBdG9taWM2NCBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworI2VuZGlmICAvLyBkZWZpbmVkKF9feDg2XzY0X18pCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyN1bmRlZiBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9HQ0NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzNTk3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjCkBAIC0wLDAgKzEsMTEyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGUgY29tcGlsYXRpb24gb2YgZXh0ZW5zaW9uX3NldC5jYyBmYWlscyB3aGVuIHdpbmRvd3MuaCBpcyBpbmNsdWRlZC4KKy8vIFRoZXJlZm9yZSB3ZSBtb3ZlIHRoZSBjb2RlIGRlcGVuZGluZyBvbiB3aW5kb3dzLmggdG8gdGhpcyBzZXBhcmF0ZSBjYyBmaWxlLgorCisvLyBEb24ndCBjb21waWxlIHRoaXMgZmlsZSBmb3IgcGVvcGxlIG5vdCBjb25jZXJuZWQgYWJvdXQgdGhyZWFkIHNhZmV0eS4KKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaD4KKworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSB2b2lkIE1lbW9yeUJhcnJpZXIoKSB7CisgIC8vIFdlIHVzZSBNZW1vcnlCYXJyaWVyIGZyb20gV2luTlQuaAorICA6Ok1lbW9yeUJhcnJpZXIoKTsKK30KKworQXRvbWljMzIgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICBMT05HIHJlc3VsdCA9IEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBMT05HKj4ocHRyKSwKKyAgICAgIHN0YXRpY19jYXN0PExPTkc+KG5ld192YWx1ZSksCisgICAgICBzdGF0aWNfY2FzdDxMT05HPihvbGRfdmFsdWUpKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pYzMyPihyZXN1bHQpOworfQorCitBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgTE9ORyByZXN1bHQgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBMT05HKj4ocHRyKSwKKyAgICAgIHN0YXRpY19jYXN0PExPTkc+KG5ld192YWx1ZSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljMzI+KHJlc3VsdCk7Cit9CisKK0F0b21pYzMyIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgcmV0dXJuIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoCisgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIExPTkcqPihwdHIpLAorICAgICAgc3RhdGljX2Nhc3Q8TE9ORz4oaW5jcmVtZW50KSkgKyBpbmNyZW1lbnQ7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU42NCkKKworLy8gNjQtYml0IGxvdy1sZXZlbCBvcGVyYXRpb25zIG9uIDY0LWJpdCBwbGF0Zm9ybS4KKworQXRvbWljNjQgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICBQVk9JRCByZXN1bHQgPSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIoCisgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBQVk9JRCo+KHB0ciksCisgICAgcmVpbnRlcnByZXRfY2FzdDxQVk9JRD4obmV3X3ZhbHVlKSwgcmVpbnRlcnByZXRfY2FzdDxQVk9JRD4ob2xkX3ZhbHVlKSk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PEF0b21pYzY0PihyZXN1bHQpOworfQorCitBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgUFZPSUQgcmVzdWx0ID0gSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoCisgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBQVk9JRCo+KHB0ciksCisgICAgcmVpbnRlcnByZXRfY2FzdDxQVk9JRD4obmV3X3ZhbHVlKSk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PEF0b21pYzY0PihyZXN1bHQpOworfQorCitBdG9taWM2NCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgaW5jcmVtZW50KSB7CisgIHJldHVybiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoCisgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIExPTkdMT05HKj4ocHRyKSwKKyAgICAgIHN0YXRpY19jYXN0PExPTkdMT05HPihpbmNyZW1lbnQpKSArIGluY3JlbWVudDsKK30KKworI2VuZGlmICAvLyBkZWZpbmVkKF9XSU42NCkKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfTVNWQ19IXworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5ODY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBhbiBpbnRlcm5hbCBhdG9taWMgaW1wbGVtZW50YXRpb24sIHVzZSBhdG9taWNvcHMuaCBpbnN0ZWFkLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgcmV0dXJuIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHB0ciwgaW5jcmVtZW50KTsKK30KKworI2lmICEoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTQwMCkKKyNlcnJvciAiV2UgcmVxdWlyZSBhdCBsZWFzdCB2czIwMDUgZm9yIE1lbW9yeUJhcnJpZXIiCisjZW5kaWYKKworaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHB0ciwgdmFsdWUpOworICAgICAgICAgICAgICAvLyBhY3RzIGFzIGEgYmFycmllciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOyAgLy8gd29ya3Mgdy9vIGJhcnJpZXIgZm9yIGN1cnJlbnQgSW50ZWwgY2hpcHMgYXMgb2YgSnVuZSAyMDA1CisgIC8vIFNlZSBjb21tZW50cyBpbiBBdG9taWM2NCB2ZXJzaW9uIG9mIFJlbGVhc2VfU3RvcmUoKSBiZWxvdy4KK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICBBdG9taWMzMiB2YWx1ZSA9ICpwdHI7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU42NCkKKworLy8gNjQtYml0IGxvdy1sZXZlbCBvcGVyYXRpb25zIG9uIDY0LWJpdCBwbGF0Zm9ybS4KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICByZXR1cm4gQmFycmllcl9BdG9taWNJbmNyZW1lbnQocHRyLCBpbmNyZW1lbnQpOworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZShwdHIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgLy8gYWN0cyBhcyBhIGJhcnJpZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsgIC8vIHdvcmtzIHcvbyBiYXJyaWVyIGZvciBjdXJyZW50IEludGVsIGNoaXBzIGFzIG9mIEp1bmUgMjAwNQorCisgIC8vIFdoZW4gbmV3IGNoaXBzIGNvbWUgb3V0LCBjaGVjazoKKyAgLy8gIElBLTMyIEludGVsIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOgorICAvLyAgU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlLCBDaGF0cGVyIDc6IE11bHRpcGxlLXByb2Nlc3NvciBtYW5hZ2VtZW50LAorICAvLyAgU2VjdGlvbiA3LjIsIE1lbW9yeSBPcmRlcmluZy4KKyAgLy8gTGFzdCBzZWVuIGF0OgorICAvLyAgIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9wZW50aXVtNC9tYW51YWxzL2luZGV4X25ldy5odG0KK30KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgeworICBBdG9taWM2NCB2YWx1ZSA9ICpwdHI7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCisjZW5kaWYgIC8vIGRlZmluZWQoX1dJTjY0KQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjA0NTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYwpAQCAtMCwwICsxLDM5NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gIC8vIFdlIG9ubHkgbmVlZCBtaW5pbWFsIGluY2x1ZGVzCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYgICAgLy8gc2VlIGNvbW1lbnQgaW4gc3RydXRpbC5jYworI2VsaWYgZGVmaW5lZChIQVZFX1BUSFJFQUQpCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2Vsc2UKKyNlcnJvciAiTm8gc3VpdGFibGUgdGhyZWFkaW5nIGxpYnJhcnkgYXZhaWxhYmxlLiIKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgVmVyaWZ5VmVyc2lvbihpbnQgaGVhZGVyVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgbWluTGlicmFyeVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgaWYgKEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgbWluTGlicmFyeVZlcnNpb24pIHsKKyAgICAvLyBMaWJyYXJ5IGlzIHRvbyBvbGQgZm9yIGhlYWRlcnMuCisgICAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICAgIDw8ICJUaGlzIHByb2dyYW0gcmVxdWlyZXMgdmVyc2lvbiAiIDw8IFZlcnNpb25TdHJpbmcobWluTGlicmFyeVZlcnNpb24pCisgICAgICA8PCAiIG9mIHRoZSBQcm90b2NvbCBCdWZmZXIgcnVudGltZSBsaWJyYXJ5LCBidXQgdGhlIGluc3RhbGxlZCB2ZXJzaW9uICIKKyAgICAgICAgICJpcyAiIDw8IFZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pIDw8ICIuICBQbGVhc2UgdXBkYXRlICIKKyAgICAgICAgICJ5b3VyIGxpYnJhcnkuICBJZiB5b3UgY29tcGlsZWQgdGhlIHByb2dyYW0geW91cnNlbGYsIG1ha2Ugc3VyZSB0aGF0ICIKKyAgICAgICAgICJ5b3VyIGhlYWRlcnMgYXJlIGZyb20gdGhlIHNhbWUgdmVyc2lvbiBvZiBQcm90b2NvbCBCdWZmZXJzIGFzIHlvdXIgIgorICAgICAgICAgImxpbmstdGltZSBsaWJyYXJ5LiAgKFZlcnNpb24gdmVyaWZpY2F0aW9uIGZhaWxlZCBpbiBcIiIKKyAgICAgIDw8IGZpbGVuYW1lIDw8ICJcIi4pIjsKKyAgfQorICBpZiAoaGVhZGVyVmVyc2lvbiA8IGtNaW5IZWFkZXJWZXJzaW9uRm9yTGlicmFyeSkgeworICAgIC8vIEhlYWRlcnMgYXJlIHRvbyBvbGQgZm9yIGxpYnJhcnkuCisgICAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICAgIDw8ICJUaGlzIHByb2dyYW0gd2FzIGNvbXBpbGVkIGFnYWluc3QgdmVyc2lvbiAiCisgICAgICA8PCBWZXJzaW9uU3RyaW5nKGhlYWRlclZlcnNpb24pIDw8ICIgb2YgdGhlIFByb3RvY29sIEJ1ZmZlciBydW50aW1lICIKKyAgICAgICAgICJsaWJyYXJ5LCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiAoIgorICAgICAgPDwgVmVyc2lvblN0cmluZyhHT09HTEVfUFJPVE9CVUZfVkVSU0lPTikgPDwgICIpLiAgQ29udGFjdCB0aGUgcHJvZ3JhbSAiCisgICAgICAgICAiYXV0aG9yIGZvciBhbiB1cGRhdGUuICBJZiB5b3UgY29tcGlsZWQgdGhlIHByb2dyYW0geW91cnNlbGYsIG1ha2UgIgorICAgICAgICAgInN1cmUgdGhhdCB5b3VyIGhlYWRlcnMgYXJlIGZyb20gdGhlIHNhbWUgdmVyc2lvbiBvZiBQcm90b2NvbCBCdWZmZXJzICIKKyAgICAgICAgICJhcyB5b3VyIGxpbmstdGltZSBsaWJyYXJ5LiAgKFZlcnNpb24gdmVyaWZpY2F0aW9uIGZhaWxlZCBpbiBcIiIKKyAgICAgIDw8IGZpbGVuYW1lIDw8ICJcIi4pIjsKKyAgfQorfQorCitzdHJpbmcgVmVyc2lvblN0cmluZyhpbnQgdmVyc2lvbikgeworICBpbnQgbWFqb3IgPSB2ZXJzaW9uIC8gMTAwMDAwMDsKKyAgaW50IG1pbm9yID0gKHZlcnNpb24gLyAxMDAwKSAlIDEwMDA7CisgIGludCBtaWNybyA9IHZlcnNpb24gJSAxMDAwOworCisgIC8vIDEyOCBieXRlcyBzaG91bGQgYWx3YXlzIGJlIGVub3VnaCwgYnV0IHdlIHVzZSBzbnByaW50ZigpIGFueXdheSB0byBiZQorICAvLyBzYWZlLgorICBjaGFyIGJ1ZmZlclsxMjhdOworICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQuJWQuJWQiLCBtYWpvciwgbWlub3IsIG1pY3JvKTsKKworICAvLyBHdWFyZCBhZ2FpbnN0IGJyb2tlbiBNU1ZDIHNucHJpbnRmKCkuCisgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKS0xXSA9ICdcMCc7CisKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9sb2dnaW5nLmNjCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgRGVmYXVsdExvZ0hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBsZXZlbF9uYW1lc1tdID0geyAiSU5GTyIsICJXQVJOSU5HIiwgIkVSUk9SIiwgIkZBVEFMIiB9OworCisgIC8vIFdlIHVzZSBmcHJpbnRmKCkgaW5zdGVhZCBvZiBjZXJyIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIHRvIHdvcmsgYXQgc3RhdGljCisgIC8vIGluaXRpYWxpemF0aW9uIHRpbWUuCisgIGZwcmludGYoc3RkZXJyLCAiW2xpYnByb3RvYnVmICVzICVzOiVkXSAlc1xuIiwKKyAgICAgICAgICBsZXZlbF9uYW1lc1tsZXZlbF0sIGZpbGVuYW1lLCBsaW5lLCBtZXNzYWdlLmNfc3RyKCkpOworICBmZmx1c2goc3RkZXJyKTsgIC8vIE5lZWRlZCBvbiBNU1ZDLgorfQorCit2b2lkIE51bGxMb2dIYW5kbGVyKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAvLyBOb3RoaW5nLgorfQorCitzdGF0aWMgTG9nSGFuZGxlciogbG9nX2hhbmRsZXJfID0gJkRlZmF1bHRMb2dIYW5kbGVyOworc3RhdGljIGludCBsb2dfc2lsZW5jZXJfY291bnRfID0gMDsKKworc3RhdGljIE11dGV4KiBsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfID0gTlVMTDsKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UobG9nX3NpbGVuY2VyX2NvdW50X2luaXRfKTsKKwordm9pZCBEZWxldGVMb2dTaWxlbmNlckNvdW50KCkgeworICBkZWxldGUgbG9nX3NpbGVuY2VyX2NvdW50X211dGV4XzsKKyAgbG9nX3NpbGVuY2VyX2NvdW50X211dGV4XyA9IE5VTEw7Cit9Cit2b2lkIEluaXRMb2dTaWxlbmNlckNvdW50KCkgeworICBsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfID0gbmV3IE11dGV4OworICBPblNodXRkb3duKCZEZWxldGVMb2dTaWxlbmNlckNvdW50KTsKK30KK3ZvaWQgSW5pdExvZ1NpbGVuY2VyQ291bnRPbmNlKCkgeworICBHb29nbGVPbmNlSW5pdCgmbG9nX3NpbGVuY2VyX2NvdW50X2luaXRfLCAmSW5pdExvZ1NpbGVuY2VyQ291bnQpOworfQorCitMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcjw8KGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgbWVzc2FnZV8gKz0gdmFsdWU7CisgIHJldHVybiAqdGhpczsKK30KKworTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjb25zdCBjaGFyKiB2YWx1ZSkgeworICBtZXNzYWdlXyArPSB2YWx1ZTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBTaW5jZSB0aGlzIGlzIGp1c3QgZm9yIGxvZ2dpbmcsIHdlIGRvbid0IGNhcmUgaWYgdGhlIGN1cnJlbnQgbG9jYWxlIGNoYW5nZXMKKy8vIHRoZSByZXN1bHRzIC0tIGluIGZhY3QsIHdlIHByb2JhYmx5IHByZWZlciB0aGF0LiAgU28gd2UgdXNlIHNucHJpbnRmKCkKKy8vIGluc3RlYWQgb2YgU2ltcGxlKnRvYSgpLgorI3VuZGVmIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SCisjZGVmaW5lIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKFRZUEUsIEZPUk1BVCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChUWVBFIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIC8qIDEyOCBieXRlcyBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgYW55IG9mIHRoZSBwcmltaXRpdmUgKi8gICBcCisgICAgLyogdmFsdWVzIHdoaWNoIHdlIHByaW50IHdpdGggdGhpcywgYnV0IHdlbGwgdXNlIHNucHJpbnRmKCkgKi8gIFwKKyAgICAvKiBhbnl3YXkgdG8gYmUgZXh0cmEgc2FmZS4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgYnVmZmVyWzEyOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgRk9STUFULCB2YWx1ZSk7ICAgICAgICAgICAgICAgIFwKKyAgICAvKiBHdWFyZCBhZ2FpbnN0IGJyb2tlbiBNU1ZDIHNucHJpbnRmKCkuICovICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKS0xXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVzc2FnZV8gKz0gYnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKnRoaXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0RFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKGNoYXIgICAgICAgICAsICIlYyIgKQorREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IoaW50ICAgICAgICAgICwgIiVkIiApCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUih1aW50ICAgICAgICAgLCAiJXUiICkKK0RFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKGxvbmcgICAgICAgICAsICIlbGQiKQorREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IodW5zaWduZWQgbG9uZywgIiVsdSIpCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUihkb3VibGUgICAgICAgLCAiJWciICkKKyN1bmRlZiBERUNMQVJFX1NUUkVBTV9PUEVSQVRPUgorCitMb2dNZXNzYWdlOjpMb2dNZXNzYWdlKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUpCisgIDogbGV2ZWxfKGxldmVsKSwgZmlsZW5hbWVfKGZpbGVuYW1lKSwgbGluZV8obGluZSkge30KK0xvZ01lc3NhZ2U6On5Mb2dNZXNzYWdlKCkge30KKwordm9pZCBMb2dNZXNzYWdlOjpGaW5pc2goKSB7CisgIGJvb2wgc3VwcHJlc3MgPSBmYWxzZTsKKworICBpZiAobGV2ZWxfICE9IExPR0xFVkVMX0ZBVEFMKSB7CisgICAgSW5pdExvZ1NpbGVuY2VyQ291bnRPbmNlKCk7CisgICAgTXV0ZXhMb2NrIGxvY2sobG9nX3NpbGVuY2VyX2NvdW50X211dGV4Xyk7CisgICAgc3VwcHJlc3MgPSBsb2dfc2lsZW5jZXJfY291bnRfID4gMDsKKyAgfQorCisgIGlmICghc3VwcHJlc3MpIHsKKyAgICBsb2dfaGFuZGxlcl8obGV2ZWxfLCBmaWxlbmFtZV8sIGxpbmVfLCBtZXNzYWdlXyk7CisgIH0KKworICBpZiAobGV2ZWxfID09IExPR0xFVkVMX0ZBVEFMKSB7CisjaWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBGYXRhbEV4Y2VwdGlvbihmaWxlbmFtZV8sIGxpbmVfLCBtZXNzYWdlXyk7CisjZWxzZQorICAgIGFib3J0KCk7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIExvZ0ZpbmlzaGVyOjpvcGVyYXRvcj0oTG9nTWVzc2FnZSYgb3RoZXIpIHsKKyAgb3RoZXIuRmluaXNoKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitMb2dIYW5kbGVyKiBTZXRMb2dIYW5kbGVyKExvZ0hhbmRsZXIqIG5ld19mdW5jKSB7CisgIExvZ0hhbmRsZXIqIG9sZCA9IGludGVybmFsOjpsb2dfaGFuZGxlcl87CisgIGlmIChvbGQgPT0gJmludGVybmFsOjpOdWxsTG9nSGFuZGxlcikgeworICAgIG9sZCA9IE5VTEw7CisgIH0KKyAgaWYgKG5ld19mdW5jID09IE5VTEwpIHsKKyAgICBpbnRlcm5hbDo6bG9nX2hhbmRsZXJfID0gJmludGVybmFsOjpOdWxsTG9nSGFuZGxlcjsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcm5hbDo6bG9nX2hhbmRsZXJfID0gbmV3X2Z1bmM7CisgIH0KKyAgcmV0dXJuIG9sZDsKK30KKworTG9nU2lsZW5jZXI6OkxvZ1NpbGVuY2VyKCkgeworICBpbnRlcm5hbDo6SW5pdExvZ1NpbGVuY2VyQ291bnRPbmNlKCk7CisgIE11dGV4TG9jayBsb2NrKGludGVybmFsOjpsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfKTsKKyAgKytpbnRlcm5hbDo6bG9nX3NpbGVuY2VyX2NvdW50XzsKK307CisKK0xvZ1NpbGVuY2VyOjp+TG9nU2lsZW5jZXIoKSB7CisgIGludGVybmFsOjpJbml0TG9nU2lsZW5jZXJDb3VudE9uY2UoKTsKKyAgTXV0ZXhMb2NrIGxvY2soaW50ZXJuYWw6OmxvZ19zaWxlbmNlcl9jb3VudF9tdXRleF8pOworICAtLWludGVybmFsOjpsb2dfc2lsZW5jZXJfY291bnRfOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL2NhbGxiYWNrLmNjCisKK0Nsb3N1cmU6On5DbG9zdXJlKCkge30KKworbmFtZXNwYWNlIGludGVybmFsIHsgRnVuY3Rpb25DbG9zdXJlMDo6fkZ1bmN0aW9uQ2xvc3VyZTAoKSB7fSB9CisKK3ZvaWQgRG9Ob3RoaW5nKCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL211dGV4LmNjCisKKyNpZmRlZiBfV0lOMzIKKworc3RydWN0IE11dGV4OjpJbnRlcm5hbCB7CisgIENSSVRJQ0FMX1NFQ1RJT04gbXV0ZXg7CisjaWZuZGVmIE5ERUJVRworICAvLyBVc2VkIG9ubHkgdG8gaW1wbGVtZW50IEFzc2VydEhlbGQoKS4KKyAgRFdPUkQgdGhyZWFkX2lkOworI2VuZGlmCit9OworCitNdXRleDo6TXV0ZXgoKQorICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWwpIHsKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbUludGVybmFsLT5tdXRleCk7Cit9CisKK011dGV4Ojp+TXV0ZXgoKSB7CisgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmbUludGVybmFsLT5tdXRleCk7CisgIGRlbGV0ZSBtSW50ZXJuYWw7Cit9CisKK3ZvaWQgTXV0ZXg6OkxvY2soKSB7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZtSW50ZXJuYWwtPm11dGV4KTsKKyNpZm5kZWYgTkRFQlVHCisgIG1JbnRlcm5hbC0+dGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisjZW5kaWYKK30KKwordm9pZCBNdXRleDo6VW5sb2NrKCkgeworI2lmbmRlZiBOREVCVUcKKyAgbUludGVybmFsLT50aHJlYWRfaWQgPSAwOworI2VuZGlmCisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZtSW50ZXJuYWwtPm11dGV4KTsKK30KKwordm9pZCBNdXRleDo6QXNzZXJ0SGVsZCgpIHsKKyNpZm5kZWYgTkRFQlVHCisgIEdPT0dMRV9EQ0hFQ0tfRVEobUludGVybmFsLT50aHJlYWRfaWQsIEdldEN1cnJlbnRUaHJlYWRJZCgpKTsKKyNlbmRpZgorfQorCisjZWxpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRCkKKworc3RydWN0IE11dGV4OjpJbnRlcm5hbCB7CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKK307CisKK011dGV4OjpNdXRleCgpCisgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbCkgeworICBwdGhyZWFkX211dGV4X2luaXQoJm1JbnRlcm5hbC0+bXV0ZXgsIE5VTEwpOworfQorCitNdXRleDo6fk11dGV4KCkgeworICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1JbnRlcm5hbC0+bXV0ZXgpOworICBkZWxldGUgbUludGVybmFsOworfQorCit2b2lkIE11dGV4OjpMb2NrKCkgeworICBpbnQgcmVzdWx0ID0gcHRocmVhZF9tdXRleF9sb2NrKCZtSW50ZXJuYWwtPm11dGV4KTsKKyAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInB0aHJlYWRfbXV0ZXhfbG9jazogIiA8PCBzdHJlcnJvcihyZXN1bHQpOworICB9Cit9CisKK3ZvaWQgTXV0ZXg6OlVubG9jaygpIHsKKyAgaW50IHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtSW50ZXJuYWwtPm11dGV4KTsKKyAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInB0aHJlYWRfbXV0ZXhfdW5sb2NrOiAiIDw8IHN0cmVycm9yKHJlc3VsdCk7CisgIH0KK30KKwordm9pZCBNdXRleDo6QXNzZXJ0SGVsZCgpIHsKKyAgLy8gcHRocmVhZHMgZG9zbid0IHByb3ZpZGUgYSB3YXkgdG8gY2hlY2sgd2hpY2ggdGhyZWFkIGhvbGRzIHRoZSBtdXRleC4KKyAgLy8gVE9ETyhrZW50b24pOiAgTWF5YmUga2VlcCB0cmFjayBvZiBsb2NraW5nIHRocmVhZCBJRCBsaWtlIHdpdGggV0lOMzI/Cit9CisKKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBlbXVsYXRlcyBnb29nbGUzL3V0aWwvZW5kaWFuL2VuZGlhbi5oCisvLworLy8gVE9ETyh4aWFvZmVuZyk6IFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gaXMgdW5mb3J0dW5hdGVseSBkZWZpbmVkIGluCisvLyBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggYW5kIHRoZXJlZm9yZSBjYW4gbm90IGJlIHVzZWQgaGVyZS4KKy8vIE1heWJlIG1vdmUgdGhhdCBtYWNybyBkZWZpbml0aW9uIGhlcmUgaW4gdGhlIGZ1cnR1cmUuCit1aW50MzIgZ2h0b25sKHVpbnQzMiB4KSB7CisgIHVuaW9uIHsKKyAgICB1aW50MzIgcmVzdWx0OworICAgIHVpbnQ4IHJlc3VsdF9hcnJheVs0XTsKKyAgfTsKKyAgcmVzdWx0X2FycmF5WzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHggPj4gMjQpOworICByZXN1bHRfYXJyYXlbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHggPj4gMTYpICYgMHhGRik7CisgIHJlc3VsdF9hcnJheVsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigoeCA+PiA4KSAmIDB4RkYpOworICByZXN1bHRfYXJyYXlbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4oeCAmIDB4RkYpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTaHV0ZG93biBzdXBwb3J0LgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0eXBlZGVmIHZvaWQgT25TaHV0ZG93bkZ1bmMoKTsKK3ZlY3Rvcjx2b2lkICgqKSgpPiogc2h1dGRvd25fZnVuY3Rpb25zID0gTlVMTDsKK011dGV4KiBzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXggPSBOVUxMOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShzaHV0ZG93bl9mdW5jdGlvbnNfaW5pdCk7CisKK3ZvaWQgSW5pdFNodXRkb3duRnVuY3Rpb25zKCkgeworICBzaHV0ZG93bl9mdW5jdGlvbnMgPSBuZXcgdmVjdG9yPHZvaWQgKCopKCk+OworICBzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXggPSBuZXcgTXV0ZXg7Cit9CisKK2lubGluZSB2b2lkIEluaXRTaHV0ZG93bkZ1bmN0aW9uc09uY2UoKSB7CisgIEdvb2dsZU9uY2VJbml0KCZzaHV0ZG93bl9mdW5jdGlvbnNfaW5pdCwgJkluaXRTaHV0ZG93bkZ1bmN0aW9ucyk7Cit9CisKK3ZvaWQgT25TaHV0ZG93bih2b2lkICgqZnVuYykoKSkgeworICBJbml0U2h1dGRvd25GdW5jdGlvbnNPbmNlKCk7CisgIE11dGV4TG9jayBsb2NrKHNodXRkb3duX2Z1bmN0aW9uc19tdXRleCk7CisgIHNodXRkb3duX2Z1bmN0aW9ucy0+cHVzaF9iYWNrKGZ1bmMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKwordm9pZCBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpIHsKKyAgaW50ZXJuYWw6OkluaXRTaHV0ZG93bkZ1bmN0aW9uc09uY2UoKTsKKworICAvLyBXZSBkb24ndCBuZWVkIHRvIGxvY2sgc2h1dGRvd25fZnVuY3Rpb25zX211dGV4IGJlY2F1c2UgaXQncyB1cCB0byB0aGUKKyAgLy8gY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIG9uZSBpcyB1c2luZyB0aGUgbGlicmFyeSBiZWZvcmUgdGhpcyBpcworICAvLyBjYWxsZWQuCisKKyAgLy8gTWFrZSBpdCBzYWZlIHRvIGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lcy4KKyAgaWYgKGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnMgPT0gTlVMTCkgcmV0dXJuOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJuYWw6OnNodXRkb3duX2Z1bmN0aW9ucy0+c2l6ZSgpOyBpKyspIHsKKyAgICBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zLT5hdChpKSgpOworICB9CisgIGRlbGV0ZSBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zOworICBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zID0gTlVMTDsKKyAgZGVsZXRlIGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXg7CisgIGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXggPSBOVUxMOworfQorCisjaWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKK0ZhdGFsRXhjZXB0aW9uOjp+RmF0YWxFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK2NvbnN0IGNoYXIqIEZhdGFsRXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODdkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKQEAgLTAsMCArMSwxMjIzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpIGFuZCBvdGhlcnMKKy8vCisvLyBDb250YWlucyBiYXNpYyB0eXBlcyBhbmQgdXRpbGl0aWVzIHVzZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGxpYnJhcnkuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTU1PTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIGRlZmluZWQoX19vc2ZfXykKKy8vIFRydTY0IGxhY2tzIHN0ZGludC5oLCBidXQgaGFzIGludHR5cGVzLmggd2hpY2ggZGVmaW5lcyBhIHN1cGVyc2V0IG9mCisvLyB3aGF0IHN0ZGludC5oIHdvdWxkIGRlZmluZS4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgIWRlZmluZWQoX01TQ19WRVIpCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmbmRlZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0NQUFVOV0lORCkKKyAgI2RlZmluZSBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUyAxCisjZWxpZiBkZWZpbmVkKF9fRVhDRVBUSU9OUykKKyAgI2RlZmluZSBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUyAxCisjZWxzZQorICAjZGVmaW5lIFBST1RPQlVGX1VTRV9FWENFUFRJT05TIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoR2V0TWVzc2FnZSkKKy8vIEFsbG93IEdldE1lc3NhZ2UgdG8gYmUgdXNlZCBhcyBhIHZhbGlkIG1ldGhvZCBuYW1lIGluIHByb3RvYnVmIGNsYXNzZXMuCisvLyB3aW5kb3dzLmggZGVmaW5lcyBHZXRNZXNzYWdlKCkgYXMgYSBtYWNyby4gIExldCdzIHJlLWRlZmluZSBpdCBhcyBhbiBpbmxpbmUKKy8vIGZ1bmN0aW9uLiAgVGhlIGlubGluZSBmdW5jdGlvbiBzaG91bGQgYmUgZXF1aXZhbGVudCBmb3IgQysrIHVzZXJzLgoraW5saW5lIEJPT0wgR2V0TWVzc2FnZV9XaW4zMigKKyAgICBMUE1TRyBscE1zZywgSFdORCBoV25kLAorICAgIFVJTlQgd01zZ0ZpbHRlck1pbiwgVUlOVCB3TXNnRmlsdGVyTWF4KSB7CisgIHJldHVybiBHZXRNZXNzYWdlKGxwTXNnLCBoV25kLCB3TXNnRmlsdGVyTWluLCB3TXNnRmlsdGVyTWF4KTsKK30KKyN1bmRlZiBHZXRNZXNzYWdlCitpbmxpbmUgQk9PTCBHZXRNZXNzYWdlKAorICAgIExQTVNHIGxwTXNnLCBIV05EIGhXbmQsCisgICAgVUlOVCB3TXNnRmlsdGVyTWluLCBVSU5UIHdNc2dGaWx0ZXJNYXgpIHsKKyAgcmV0dXJuIEdldE1lc3NhZ2VfV2luMzIobHBNc2csIGhXbmQsIHdNc2dGaWx0ZXJNaW4sIHdNc2dGaWx0ZXJNYXgpOworfQorI2VuZGlmCisKKworbmFtZXNwYWNlIHN0ZCB7fQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKyN1bmRlZiBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMKKyNkZWZpbmUgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFR5cGVOYW1lKSAgICBcCisgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKFBST1RPQlVGX1VTRV9ETExTKQorICAjaWZkZWYgTElCUFJPVE9CVUZfRVhQT1JUUworICAgICNkZWZpbmUgTElCUFJPVE9CVUZfRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorICAjZWxzZQorICAgICNkZWZpbmUgTElCUFJPVE9CVUZfRVhQT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAjZW5kaWYKKyAgI2lmZGVmIExJQlBST1RPQ19FWFBPUlRTCisgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICNlbHNlCisgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICNlbmRpZgorI2Vsc2UKKyAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQKKyAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUCisjZW5kaWYKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gU29tZSBvZiB0aGVzZSBjb25zdGFudHMgYXJlIG1hY3JvcyByYXRoZXIgdGhhbiBjb25zdCBpbnRzIHNvIHRoYXQgdGhleSBjYW4KKy8vIGJlIHVzZWQgaW4gI2lmIGRpcmVjdGl2ZXMuCisKKy8vIFRoZSBjdXJyZW50IHZlcnNpb24sIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlIGludGVnZXIgdG8gbWFrZSBjb21wYXJpc29uCisvLyBlYXNpZXI6ICBtYWpvciAqIDEwXjYgKyBtaW5vciAqIDEwXjMgKyBtaWNybworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiAyMDA1MDAwCisKKy8vIFRoZSBtaW5pbXVtIGxpYnJhcnkgdmVyc2lvbiB3aGljaCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlCisvLyBoZWFkZXJzLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUlOX0xJQlJBUllfVkVSU0lPTiAyMDA1MDAwCisKKy8vIFRoZSBtaW5pbXVtIGhlYWRlciB2ZXJzaW9uIHdoaWNoIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZgorLy8gdGhlIGxpYnJhcnkuICBUaGlzIGNvbnN0YW50IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9jJ3MgQysrIGNvZGUKKy8vIGdlbmVyYXRvci4KK3N0YXRpYyBjb25zdCBpbnQga01pbkhlYWRlclZlcnNpb25Gb3JMaWJyYXJ5ID0gMjAwNTAwMDsKKworLy8gVGhlIG1pbmltdW0gcHJvdG9jIHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZQorLy8gaGVhZGVycy4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTiAyMDA1MDAwCisKKy8vIFRoZSBtaW5pbXVtIGhlYWRlciB2ZXJzaW9uIHdoaWNoIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZgorLy8gcHJvdG9jLiAgVGhpcyBjb25zdGFudCBzaG91bGQgb25seSBiZSB1c2VkIGluIFZlcmlmeVZlcnNpb24oKS4KK3N0YXRpYyBjb25zdCBpbnQga01pbkhlYWRlclZlcnNpb25Gb3JQcm90b2MgPSAyMDA1MDAwOworCisvLyBWZXJpZmllcyB0aGF0IHRoZSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgYXJlIGNvbXBhdGlibGUuICBVc2UgdGhlIG1hY3JvCisvLyBiZWxvdyB0byBjYWxsIHRoaXMuCit2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBWZXJpZnlWZXJzaW9uKGludCBoZWFkZXJWZXJzaW9uLCBpbnQgbWluTGlicmFyeVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKKworLy8gQ29udmVydHMgYSBudW1lcmljIHZlcnNpb24gbnVtYmVyIHRvIGEgc3RyaW5nLgorc3RkOjpzdHJpbmcgTElCUFJPVE9CVUZfRVhQT1JUIFZlcnNpb25TdHJpbmcoaW50IHZlcnNpb24pOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gUGxhY2UgdGhpcyBtYWNybyBpbiB5b3VyIG1haW4oKSBmdW5jdGlvbiAob3Igc29tZXdoZXJlIGJlZm9yZSB5b3UgYXR0ZW1wdAorLy8gdG8gdXNlIHRoZSBwcm90b2J1ZiBsaWJyYXJ5KSB0byB2ZXJpZnkgdGhhdCB0aGUgdmVyc2lvbiB5b3UgbGluayBhZ2FpbnN0CisvLyBtYXRjaGVzIHRoZSBoZWFkZXJzIHlvdSBjb21waWxlZCBhZ2FpbnN0LiAgSWYgYSB2ZXJzaW9uIG1pc21hdGNoIGlzCisvLyBkZXRlY3RlZCwgdGhlIHByb2Nlc3Mgd2lsbCBhYm9ydC4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpWZXJpZnlWZXJzaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04sIEdPT0dMRV9QUk9UT0JVRl9NSU5fTElCUkFSWV9WRVJTSU9OLCAgICAgICAgIFwKKyAgICBfX0ZJTEVfXykKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL2Jhc2UvcG9ydC5oCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisKKyNpZmRlZiBfTVNDX1ZFUgordHlwZWRlZiBfX2ludDggIGludDg7Cit0eXBlZGVmIF9faW50MTYgaW50MTY7Cit0eXBlZGVmIF9faW50MzIgaW50MzI7Cit0eXBlZGVmIF9faW50NjQgaW50NjQ7CisKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4ICB1aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiB1aW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NDsKKyNlbHNlCit0eXBlZGVmIGludDhfdCAgaW50ODsKK3R5cGVkZWYgaW50MTZfdCBpbnQxNjsKK3R5cGVkZWYgaW50MzJfdCBpbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBpbnQ2NDsKKwordHlwZWRlZiB1aW50OF90ICB1aW50ODsKK3R5cGVkZWYgdWludDE2X3QgdWludDE2OwordHlwZWRlZiB1aW50MzJfdCB1aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IHVpbnQ2NDsKKyNlbmRpZgorCisvLyBsb25nIGxvbmcgbWFjcm9zIHRvIGJlIHVzZWQgYmVjYXVzZSBnY2MgYW5kIHZjKysgdXNlIGRpZmZlcmVudCBzdWZmaXhlcywKKy8vIGFuZCBkaWZmZXJlbnQgc2l6ZSBzcGVjaWZpZXJzIGluIGZvcm1hdCBzdHJpbmdzCisjdW5kZWYgR09PR0xFX0xPTkdMT05HCisjdW5kZWYgR09PR0xFX1VMT05HTE9ORworI3VuZGVmIEdPT0dMRV9MTF9GT1JNQVQKKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIEdPT0dMRV9MT05HTE9ORyh4KSB4IyNJNjQKKyNkZWZpbmUgR09PR0xFX1VMT05HTE9ORyh4KSB4IyNVSTY0CisjZGVmaW5lIEdPT0dMRV9MTF9GT1JNQVQgIkk2NCIgIC8vIEFzIGluIHByaW50ZigiJUk2NGQiLCAuLi4pCisjZWxzZQorI2RlZmluZSBHT09HTEVfTE9OR0xPTkcoeCkgeCMjTEwKKyNkZWZpbmUgR09PR0xFX1VMT05HTE9ORyh4KSB4IyNVTEwKKyNkZWZpbmUgR09PR0xFX0xMX0ZPUk1BVCAibGwiICAvLyBBcyBpbiAiJWxsZCIuIE5vdGUgdGhhdCAicSIgaXMgcG9vciBmb3JtIGFsc28uCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludDMyIGtpbnQzMm1heCA9IDB4N0ZGRkZGRkY7CitzdGF0aWMgY29uc3QgaW50MzIga2ludDMybWluID0gLWtpbnQzMm1heCAtIDE7CitzdGF0aWMgY29uc3QgaW50NjQga2ludDY0bWF4ID0gR09PR0xFX0xPTkdMT05HKDB4N0ZGRkZGRkZGRkZGRkZGRik7CitzdGF0aWMgY29uc3QgaW50NjQga2ludDY0bWluID0gLWtpbnQ2NG1heCAtIDE7CitzdGF0aWMgY29uc3QgdWludDMyIGt1aW50MzJtYXggPSAweEZGRkZGRkZGdTsKK3N0YXRpYyBjb25zdCB1aW50NjQga3VpbnQ2NG1heCA9IEdPT0dMRV9VTE9OR0xPTkcoMHhGRkZGRkZGRkZGRkZGRkZGKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQW5ub3RhdGlvbnM6ICBTb21lIHBhcnRzIG9mIHRoZSBjb2RlIGhhdmUgYmVlbiBhbm5vdGF0ZWQgaW4gd2F5cyB0aGF0IG1pZ2h0CisvLyAgIGJlIHVzZWZ1bCB0byBzb21lIGNvbXBpbGVycyBvciB0b29scywgYnV0IGFyZSBub3Qgc3VwcG9ydGVkIHVuaXZlcnNhbGx5LgorLy8gICBZb3UgY2FuICNkZWZpbmUgdGhlc2UgYW5ub3RhdGlvbnMgeW91cnNlbGYgaWYgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKy8vICAgaXMgbm90IHJpZ2h0IGZvciB5b3UuCisKKyNpZm5kZWYgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID4gMyB8fChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDEpKQorLy8gRm9yIGZ1bmN0aW9ucyB3ZSB3YW50IHRvIGZvcmNlIGlubGluZS4KKy8vIEludHJvZHVjZWQgaW4gZ2NjIDMuMS4KKyNkZWZpbmUgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSkKKyNlbHNlCisvLyBPdGhlciBjb21waWxlcnMgd2lsbCBoYXZlIHRvIGZpZ3VyZSBpdCBvdXQgZm9yIHRoZW1zZWx2ZXMuCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBHT09HTEVfQVRUUklCVVRFX0RFUFJFQ0FURUQKKyNpZmRlZiBfX0dOVUNfXworLy8gSWYgdGhlIG1ldGhvZC92YXJpYWJsZS90eXBlIGlzIHVzZWQgYW55d2hlcmUsIHByb2R1Y2UgYSB3YXJuaW5nLgorI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisjZWxzZQorI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX0RFUFJFQ0FURUQKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgR09PR0xFX1BSRURJQ1RfVFJVRQorI2lmZGVmIF9fR05VQ19fCisvLyBQcm92aWRlZCBhdCBsZWFzdCBzaW5jZSBHQ0MgMy4wLgorI2RlZmluZSBHT09HTEVfUFJFRElDVF9UUlVFKHgpIChfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKSkKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9QUkVESUNUX1RSVUUKKyNlbmRpZgorI2VuZGlmCisKKy8vIERlbGltaXRzIGEgYmxvY2sgb2YgY29kZSB3aGljaCBtYXkgd3JpdGUgdG8gbWVtb3J5IHdoaWNoIGlzIHNpbXVsdGFuZW91c2x5CisvLyB3cml0dGVuIGJ5IG90aGVyIHRocmVhZHMsIGJ1dCB3aGljaCBoYXMgYmVlbiBkZXRlcm1pbmVkIHRvIGJlIHRocmVhZC1zYWZlCisvLyAoZS5nLiBiZWNhdXNlIGl0IGlzIGFuIGlkZW1wb3RlbnQgd3JpdGUpLgorI2lmbmRlZiBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTgorI2RlZmluZSBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpCisjZW5kaWYKKyNpZm5kZWYgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5ECisjZGVmaW5lIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL2Jhc2UvYmFzaWN0eXBlcy5oCisKKy8vIFRoZSBHT09HTEVfQVJSQVlTSVpFKGFycikgbWFjcm8gcmV0dXJucyB0aGUgIyBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSBhcnIuCisvLyBUaGUgZXhwcmVzc2lvbiBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgYW5kIHRoZXJlZm9yZSBjYW4gYmUKKy8vIHVzZWQgaW4gZGVmaW5pbmcgbmV3IGFycmF5cywgZm9yIGV4YW1wbGUuCisvLworLy8gR09PR0xFX0FSUkFZU0laRSBjYXRjaGVzIGEgZmV3IHR5cGUgZXJyb3JzLiAgSWYgeW91IHNlZSBhIGNvbXBpbGVyIGVycm9yCisvLworLy8gICAid2FybmluZzogZGl2aXNpb24gYnkgemVybyBpbiAuLi4iCisvLworLy8gd2hlbiB1c2luZyBHT09HTEVfQVJSQVlTSVpFLCB5b3UgYXJlICh3cm9uZ2Z1bGx5KSBnaXZpbmcgaXQgYSBwb2ludGVyLgorLy8gWW91IHNob3VsZCBvbmx5IHVzZSBHT09HTEVfQVJSQVlTSVpFIG9uIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFycmF5cy4KKy8vCisvLyBUaGUgZm9sbG93aW5nIGNvbW1lbnRzIGFyZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscywgYW5kIGNhbgorLy8gYmUgaWdub3JlZCBieSB0aGUgdXNlcnMuCisvLworLy8gQVJSQVlTSVpFKGFycikgd29ya3MgYnkgaW5zcGVjdGluZyBzaXplb2YoYXJyKSAodGhlICMgb2YgYnl0ZXMgaW4KKy8vIHRoZSBhcnJheSkgYW5kIHNpemVvZigqKGFycikpICh0aGUgIyBvZiBieXRlcyBpbiBvbmUgYXJyYXkKKy8vIGVsZW1lbnQpLiAgSWYgdGhlIGZvcm1lciBpcyBkaXZpc2libGUgYnkgdGhlIGxhdHRlciwgcGVyaGFwcyBhcnIgaXMKKy8vIGluZGVlZCBhbiBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgZGl2aXNpb24gcmVzdWx0IGlzIHRoZSAjIG9mCisvLyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuICBPdGhlcndpc2UsIGFyciBjYW5ub3QgcG9zc2libHkgYmUgYW4gYXJyYXksCisvLyBhbmQgd2UgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciB0byBwcmV2ZW50IHRoZSBjb2RlIGZyb20KKy8vIGNvbXBpbGluZy4KKy8vCisvLyBTaW5jZSB0aGUgc2l6ZSBvZiBib29sIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQsIHdlIG5lZWQgdG8gY2FzdAorLy8gIShzaXplb2YoYSkgJiBzaXplb2YoKihhKSkpIHRvIHNpemVfdCBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGZpbmFsCisvLyByZXN1bHQgaGFzIHR5cGUgc2l6ZV90LgorLy8KKy8vIFRoaXMgbWFjcm8gaXMgbm90IHBlcmZlY3QgYXMgaXQgd3JvbmdmdWxseSBhY2NlcHRzIGNlcnRhaW4KKy8vIHBvaW50ZXJzLCBuYW1lbHkgd2hlcmUgdGhlIHBvaW50ZXIgc2l6ZSBpcyBkaXZpc2libGUgYnkgdGhlIHBvaW50ZWUKKy8vIHNpemUuICBTaW5jZSBhbGwgb3VyIGNvZGUgaGFzIHRvIGdvIHRocm91Z2ggYSAzMi1iaXQgY29tcGlsZXIsCisvLyB3aGVyZSBhIHBvaW50ZXIgaXMgNCBieXRlcywgdGhpcyBtZWFucyBhbGwgcG9pbnRlcnMgdG8gYSB0eXBlIHdob3NlCisvLyBzaXplIGlzIDMgb3IgZ3JlYXRlciB0aGFuIDQgd2lsbCBiZSAocmlnaHRlb3VzbHkpIHJlamVjdGVkLgorLy8KKy8vIEt1ZG9zIHRvIEpvcmcgQnJvd24gZm9yIHRoaXMgc2ltcGxlIGFuZCBlbGVnYW50IGltcGxlbWVudGF0aW9uLgorCisjdW5kZWYgR09PR0xFX0FSUkFZU0laRQorI2RlZmluZSBHT09HTEVfQVJSQVlTSVpFKGEpIFwKKyAgKChzaXplb2YoYSkgLyBzaXplb2YoKihhKSkpIC8gXAorICAgc3RhdGljX2Nhc3Q8c2l6ZV90PighKHNpemVvZihhKSAlIHNpemVvZigqKGEpKSkpKQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVc2UgaW1wbGljaXRfY2FzdCBhcyBhIHNhZmUgdmVyc2lvbiBvZiBzdGF0aWNfY2FzdCBvciBjb25zdF9jYXN0CisvLyBmb3IgdXBjYXN0aW5nIGluIHRoZSB0eXBlIGhpZXJhcmNoeSAoaS5lLiBjYXN0aW5nIGEgcG9pbnRlciB0byBGb28KKy8vIHRvIGEgcG9pbnRlciB0byBTdXBlcmNsYXNzT2ZGb28gb3IgY2FzdGluZyBhIHBvaW50ZXIgdG8gRm9vIHRvCisvLyBhIGNvbnN0IHBvaW50ZXIgdG8gRm9vKS4KKy8vIFdoZW4geW91IHVzZSBpbXBsaWNpdF9jYXN0LCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQgdGhlIGNhc3QgaXMgc2FmZS4KKy8vIFN1Y2ggZXhwbGljaXQgaW1wbGljaXRfY2FzdHMgYXJlIG5lY2Vzc2FyeSBpbiBzdXJwcmlzaW5nbHkgbWFueQorLy8gc2l0dWF0aW9ucyB3aGVyZSBDKysgZGVtYW5kcyBhbiBleGFjdCB0eXBlIG1hdGNoIGluc3RlYWQgb2YgYW4KKy8vIGFyZ3VtZW50IHR5cGUgY29udmVydGFibGUgdG8gYSB0YXJnZXQgdHlwZS4KKy8vCisvLyBUaGUgRnJvbSB0eXBlIGNhbiBiZSBpbmZlcnJlZCwgc28gdGhlIHByZWZlcnJlZCBzeW50YXggZm9yIHVzaW5nCisvLyBpbXBsaWNpdF9jYXN0IGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWNfY2FzdCBldGMuOgorLy8KKy8vICAgaW1wbGljaXRfY2FzdDxUb1R5cGU+KGV4cHIpCisvLworLy8gaW1wbGljaXRfY2FzdCB3b3VsZCBoYXZlIGJlZW4gcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkIGxpYnJhcnksCisvLyBidXQgdGhlIHByb3Bvc2FsIHdhcyBzdWJtaXR0ZWQgdG9vIGxhdGUuICBJdCB3aWxsIHByb2JhYmx5IG1ha2UKKy8vIGl0cyB3YXkgaW50byB0aGUgbGFuZ3VhZ2UgaW4gdGhlIGZ1dHVyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgoraW5saW5lIFRvIGltcGxpY2l0X2Nhc3QoRnJvbSBjb25zdCAmZikgeworICByZXR1cm4gZjsKK30KKworLy8gV2hlbiB5b3UgdXBjYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tIHR5cGUgRm9vIHRvIHR5cGUKKy8vIFN1cGVyY2xhc3NPZkZvbyksIGl0J3MgZmluZSB0byB1c2UgaW1wbGljaXRfY2FzdDw+LCBzaW5jZSB1cGNhc3RzCisvLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tCisvLyB0eXBlIEZvbyB0byB0eXBlIFN1YmNsYXNzT2ZGb28pLCBzdGF0aWNfY2FzdDw+IGlzbid0IHNhZmUsIGJlY2F1c2UKKy8vIGhvdyBkbyB5b3Uga25vdyB0aGUgcG9pbnRlciBpcyByZWFsbHkgb2YgdHlwZSBTdWJjbGFzc09mRm9vPyAgSXQKKy8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsCisvLyB3aGVuIHlvdSBkb3duY2FzdCwgeW91IHNob3VsZCB1c2UgdGhpcyBtYWNyby4gIEluIGRlYnVnIG1vZGUsIHdlCisvLyB1c2UgZHluYW1pY19jYXN0PD4gdG8gZG91YmxlLWNoZWNrIHRoZSBkb3duY2FzdCBpcyBsZWdhbCAod2UgZGllCisvLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+CisvLyBpbnN0ZWFkLiAgVGh1cywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBpbiBkZWJ1ZyBtb2RlIHRvIG1ha2Ugc3VyZQorLy8gdGhlIGNhc3QgaXMgbGVnYWwhCisvLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uCisvLyBJbiBwYXJ0aWN1bGFyLCB5b3UgU0hPVUxETidUIGJlIHVzaW5nIGR5bmFtaWNfY2FzdDw+IGluIG9yZGVyIHRvCisvLyBkbyBSVFRJIChlZyBjb2RlIGxpa2UgdGhpczoKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7CisvLyAgICBpZiAoZHluYW1pY19jYXN0PFN1YmNsYXNzMj4oZm9vKSkgSGFuZGxlQVN1YmNsYXNzMk9iamVjdChmb28pOworLy8gWW91IHNob3VsZCBkZXNpZ24gdGhlIGNvZGUgc29tZSBvdGhlciB3YXkgbm90IHRvIG5lZWQgdGhpcy4KKwordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+ICAgICAvLyB1c2UgbGlrZSB0aGlzOiBkb3duX2Nhc3Q8VCo+KGZvbyk7CitpbmxpbmUgVG8gZG93bl9jYXN0KEZyb20qIGYpIHsgICAgICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBhY2NlcHQgcG9pbnRlcnMKKyAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQorICAvLyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcsIGFuZCBoYXMgbm8gb3ZlcmhlYWQgaW4gYW4KKyAgLy8gb3B0aW1pemVkIGJ1aWxkIGF0IHJ1bi10aW1lLCBhcyBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5CisgIC8vIGNvbXBsZXRlbHkuCisgIGlmIChmYWxzZSkgeworICAgIGltcGxpY2l0X2Nhc3Q8RnJvbSosIFRvPigwKTsKKyAgfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKSAmJiAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSkKKyAgYXNzZXJ0KGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOyAgLy8gUlRUSTogZGVidWcgbW9kZSBvbmx5IQorI2VuZGlmCisgIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBXZSBtYWRlIHRoZXNlIGludGVybmFsIHNvIHRoYXQgdGhleSB3b3VsZCBzaG93IHVwIGFzIHN1Y2ggaW4gdGhlIGRvY3MsCisvLyBidXQgd2UgZG9uJ3Qgd2FudCB0byBzdGljayAiaW50ZXJuYWw6OiIgaW4gZnJvbnQgb2YgdGhlbSBldmVyeXdoZXJlLgordXNpbmcgaW50ZXJuYWw6OmltcGxpY2l0X2Nhc3Q7Cit1c2luZyBpbnRlcm5hbDo6ZG93bl9jYXN0OworCisvLyBUaGUgQ09NUElMRV9BU1NFUlQgbWFjcm8gY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBjb21waWxlIHRpbWUKKy8vIGV4cHJlc3Npb24gaXMgdHJ1ZS4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgdG8gdmVyaWZ5IHRoZQorLy8gc2l6ZSBvZiBhIHN0YXRpYyBhcnJheToKKy8vCisvLyAgIENPTVBJTEVfQVNTRVJUKEFSUkFZU0laRShjb250ZW50X3R5cGVfbmFtZXMpID09IENPTlRFTlRfTlVNX1RZUEVTLAorLy8gICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGVfbmFtZXNfaW5jb3JyZWN0X3NpemUpOworLy8KKy8vIG9yIHRvIG1ha2Ugc3VyZSBhIHN0cnVjdCBpcyBzbWFsbGVyIHRoYW4gYSBjZXJ0YWluIHNpemU6CisvLworLy8gICBDT01QSUxFX0FTU0VSVChzaXplb2YoZm9vKSA8IDEyOCwgZm9vX3Rvb19sYXJnZSk7CisvLworLy8gVGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgbWFjcm8gaXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiBJZgorLy8gdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UsIG1vc3QgY29tcGlsZXJzIHdpbGwgaXNzdWUgYSB3YXJuaW5nL2Vycm9yCisvLyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPGJvb2w+CitzdHJ1Y3QgQ29tcGlsZUFzc2VydCB7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI3VuZGVmIEdPT0dMRV9DT01QSUxFX0FTU0VSVAorI2RlZmluZSBHT09HTEVfQ09NUElMRV9BU1NFUlQoZXhwciwgbXNnKSBcCisgIHR5cGVkZWYgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6Q29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+IFwKKyAgICAgICAgICBtc2dbYm9vbChleHByKSA/IDEgOiAtMV0KKworCisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIENPTVBJTEVfQVNTRVJUOgorLy8KKy8vIC0gQ09NUElMRV9BU1NFUlQgd29ya3MgYnkgZGVmaW5pbmcgYW4gYXJyYXkgdHlwZSB0aGF0IGhhcyAtMQorLy8gICBlbGVtZW50cyAoYW5kIHRodXMgaXMgaW52YWxpZCkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZS4KKy8vCisvLyAtIFRoZSBzaW1wbGVyIGRlZmluaXRpb24KKy8vCisvLyAgICAgI2RlZmluZSBDT01QSUxFX0FTU0VSVChleHByLCBtc2cpIHR5cGVkZWYgY2hhciBtc2dbKGV4cHIpID8gMSA6IC0xXQorLy8KKy8vICAgZG9lcyBub3Qgd29yaywgYXMgZ2NjIHN1cHBvcnRzIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgd2hvc2Ugc2l6ZXMKKy8vICAgYXJlIGRldGVybWluZWQgYXQgcnVuLXRpbWUgKHRoaXMgaXMgZ2NjJ3MgZXh0ZW5zaW9uIGFuZCBub3QgcGFydAorLy8gICBvZiB0aGUgQysrIHN0YW5kYXJkKS4gIEFzIGEgcmVzdWx0LCBnY2MgZmFpbHMgdG8gcmVqZWN0IHRoZQorLy8gICBmb2xsb3dpbmcgY29kZSB3aXRoIHRoZSBzaW1wbGUgZGVmaW5pdGlvbjoKKy8vCisvLyAgICAgaW50IGZvbzsKKy8vICAgICBDT01QSUxFX0FTU0VSVChmb28sIG1zZyk7IC8vIG5vdCBzdXBwb3NlZCB0byBjb21waWxlIGFzIGZvbyBpcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgorLy8KKy8vIC0gQnkgdXNpbmcgdGhlIHR5cGUgQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+LCB3ZSBlbnN1cmVzIHRoYXQKKy8vICAgZXhwciBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gIChUZW1wbGF0ZSBhcmd1bWVudHMgbXVzdCBiZQorLy8gICBkZXRlcm1pbmVkIGF0IGNvbXBpbGUtdGltZS4pCisvLworLy8gLSBUaGUgb3V0dGVyIHBhcmVudGhlc2VzIGluIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiBhcmUgbmVjZXNzYXJ5CisvLyAgIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAzLjQuNCBhbmQgNC4wLjEuICBJZiB3ZSBoYWQgd3JpdHRlbgorLy8KKy8vICAgICBDb21waWxlQXNzZXJ0PGJvb2woZXhwcik+CisvLworLy8gICBpbnN0ZWFkLCB0aGVzZSBjb21waWxlcnMgd2lsbCByZWZ1c2UgdG8gY29tcGlsZQorLy8KKy8vICAgICBDT01QSUxFX0FTU0VSVCg1ID4gMCwgc29tZV9tZXNzYWdlKTsKKy8vCisvLyAgIChUaGV5IHNlZW0gdG8gdGhpbmsgdGhlICI+IiBpbiAiNSA+IDAiIG1hcmtzIHRoZSBlbmQgb2YgdGhlCisvLyAgIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuKQorLy8KKy8vIC0gVGhlIGFycmF5IHNpemUgaXMgKGJvb2woZXhwcikgPyAxIDogLTEpLCBpbnN0ZWFkIG9mIHNpbXBseQorLy8KKy8vICAgICAoKGV4cHIpID8gMSA6IC0xKS4KKy8vCisvLyAgIFRoaXMgaXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIGEgYnVnIGluIE1TIFZDIDcuMSwgd2hpY2gKKy8vICAgY2F1c2VzICgoMC4wKSA/IDEgOiAtMSkgdG8gaW5jb3JyZWN0bHkgZXZhbHVhdGUgdG8gMS4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL2Jhc2Uvc2NvcGVkX3B0ci5oCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIHRvIG1hdGNoIHRoZSBhbnRpY2lwYXRlZCBmdXR1cmUgVFIyCisvLyAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNjb3BlZF9wdHIgY2xhc3MsIGFuZCBpdHMgY2xvc2VseS1yZWxhdGVkIGJyZXRocmVuLAorLy8gIHNjb3BlZF9hcnJheSwgc2NvcGVkX3B0cl9tYWxsb2MsIGFuZCBtYWtlX3Njb3BlZF9wdHIuCisKK3RlbXBsYXRlIDxjbGFzcyBDPiBjbGFzcyBzY29wZWRfcHRyOwordGVtcGxhdGUgPGNsYXNzIEM+IGNsYXNzIHNjb3BlZF9hcnJheTsKKworLy8gQSBzY29wZWRfcHRyPFQ+IGlzIGxpa2UgYSBUKiwgZXhjZXB0IHRoYXQgdGhlIGRlc3RydWN0b3Igb2Ygc2NvcGVkX3B0cjxUPgorLy8gYXV0b21hdGljYWxseSBkZWxldGVzIHRoZSBwb2ludGVyIGl0IGhvbGRzIChpZiBhbnkpLgorLy8gVGhhdCBpcywgc2NvcGVkX3B0cjxUPiBvd25zIHRoZSBUIG9iamVjdCB0aGF0IGl0IHBvaW50cyB0by4KKy8vIExpa2UgYSBUKiwgYSBzY29wZWRfcHRyPFQ+IG1heSBob2xkIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIFQgb2JqZWN0LgorLy8KKy8vIFRoZSBzaXplIG9mIGEgc2NvcGVkX3B0ciBpcyBzbWFsbDoKKy8vIHNpemVvZihzY29wZWRfcHRyPEM+KSA9PSBzaXplb2YoQyopCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK2NsYXNzIHNjb3BlZF9wdHIgeworIHB1YmxpYzoKKworICAvLyBUaGUgZWxlbWVudCB0eXBlCisgIHR5cGVkZWYgQyBlbGVtZW50X3R5cGU7CisKKyAgLy8gQ29uc3RydWN0b3IuICBEZWZhdWx0cyB0byBpbnRpYWxpemluZyB3aXRoIE5VTEwuCisgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgYW4gdW5pbml0aWFsaXplZCBzY29wZWRfcHRyLgorICAvLyBUaGUgaW5wdXQgcGFyYW1ldGVyIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggbmV3LgorICBleHBsaWNpdCBzY29wZWRfcHRyKEMqIHAgPSBOVUxMKSA6IHB0cl8ocCkgeyB9CisKKyAgLy8gRGVzdHJ1Y3Rvci4gIElmIHRoZXJlIGlzIGEgQyBvYmplY3QsIGRlbGV0ZSBpdC4KKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHB0cl8gPT0gTlVMTCBiZWNhdXNlIEMrKyBkb2VzIHRoYXQgZm9yIHVzLgorICB+c2NvcGVkX3B0cigpIHsKKyAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07CisgICAgZGVsZXRlIHB0cl87CisgIH0KKworICAvLyBSZXNldC4gIERlbGV0ZXMgdGhlIGN1cnJlbnQgb3duZWQgb2JqZWN0LCBpZiBhbnkuCisgIC8vIFRoZW4gdGFrZXMgb3duZXJzaGlwIG9mIGEgbmV3IG9iamVjdCwgaWYgZ2l2ZW4uCisgIC8vIHRoaXMtPnJlc2V0KHRoaXMtPmdldCgpKSB3b3Jrcy4KKyAgdm9pZCByZXNldChDKiBwID0gTlVMTCkgeworICAgIGlmIChwICE9IHB0cl8pIHsKKyAgICAgIGVudW0geyB0eXBlX211c3RfYmVfY29tcGxldGUgPSBzaXplb2YoQykgfTsKKyAgICAgIGRlbGV0ZSBwdHJfOworICAgICAgcHRyXyA9IHA7CisgICAgfQorICB9CisKKyAgLy8gQWNjZXNzb3JzIHRvIGdldCB0aGUgb3duZWQgb2JqZWN0LgorICAvLyBvcGVyYXRvciogYW5kIG9wZXJhdG9yLT4gd2lsbCBhc3NlcnQoKSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG9iamVjdC4KKyAgQyYgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChwdHJfICE9IE5VTEwpOworICAgIHJldHVybiAqcHRyXzsKKyAgfQorICBDKiBvcGVyYXRvci0+KCkgY29uc3QgIHsKKyAgICBhc3NlcnQocHRyXyAhPSBOVUxMKTsKKyAgICByZXR1cm4gcHRyXzsKKyAgfQorICBDKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisKKyAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCisgIC8vIFRoZXNlIHJldHVybiB3aGV0aGVyIHR3byBzY29wZWRfcHRyIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8KKyAgLy8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwgb2JqZWN0cy4KKyAgYm9vbCBvcGVyYXRvcj09KEMqIHApIGNvbnN0IHsgcmV0dXJuIHB0cl8gPT0gcDsgfQorICBib29sIG9wZXJhdG9yIT0oQyogcCkgY29uc3QgeyByZXR1cm4gcHRyXyAhPSBwOyB9CisKKyAgLy8gU3dhcCB0d28gc2NvcGVkIHBvaW50ZXJzLgorICB2b2lkIHN3YXAoc2NvcGVkX3B0ciYgcDIpIHsKKyAgICBDKiB0bXAgPSBwdHJfOworICAgIHB0cl8gPSBwMi5wdHJfOworICAgIHAyLnB0cl8gPSB0bXA7CisgIH0KKworICAvLyBSZWxlYXNlIGEgcG9pbnRlci4KKyAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgY3VycmVudCBwb2ludGVyIGhlbGQgYnkgdGhpcyBvYmplY3QuCisgIC8vIElmIHRoaXMgb2JqZWN0IGhvbGRzIGEgTlVMTCBwb2ludGVyLCB0aGUgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCisgIC8vIEFmdGVyIHRoaXMgb3BlcmF0aW9uLCB0aGlzIG9iamVjdCB3aWxsIGhvbGQgYSBOVUxMIHBvaW50ZXIsCisgIC8vIGFuZCB3aWxsIG5vdCBvd24gdGhlIG9iamVjdCBhbnkgbW9yZS4KKyAgQyogcmVsZWFzZSgpIHsKKyAgICBDKiByZXRWYWwgPSBwdHJfOworICAgIHB0cl8gPSBOVUxMOworICAgIHJldHVybiByZXRWYWw7CisgIH0KKworIHByaXZhdGU6CisgIEMqIHB0cl87CisKKyAgLy8gRm9yYmlkIGNvbXBhcmlzb24gb2Ygc2NvcGVkX3B0ciB0eXBlcy4gIElmIEMyICE9IEMsIGl0IHRvdGFsbHkgZG9lc24ndAorICAvLyBtYWtlIHNlbnNlLCBhbmQgaWYgQzIgPT0gQywgaXQgc3RpbGwgZG9lc24ndCBtYWtlIHNlbnNlIGJlY2F1c2UgeW91IHNob3VsZAorICAvLyBuZXZlciBoYXZlIHRoZSBzYW1lIG9iamVjdCBvd25lZCBieSB0d28gZGlmZmVyZW50IHNjb3BlZF9wdHJzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3I9PShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OworICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3IhPShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OworCisgIC8vIERpc2FsbG93IGV2aWwgY29uc3RydWN0b3JzCisgIHNjb3BlZF9wdHIoY29uc3Qgc2NvcGVkX3B0ciYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBzY29wZWRfcHRyJik7Cit9OworCisvLyBzY29wZWRfYXJyYXk8Qz4gaXMgbGlrZSBzY29wZWRfcHRyPEM+LCBleGNlcHQgdGhhdCB0aGUgY2FsbGVyIG11c3QgYWxsb2NhdGUKKy8vIHdpdGggbmV3IFtdIGFuZCB0aGUgZGVzdHJ1Y3RvciBkZWxldGVzIG9iamVjdHMgd2l0aCBkZWxldGUgW10uCisvLworLy8gQXMgd2l0aCBzY29wZWRfcHRyPEM+LCBhIHNjb3BlZF9hcnJheTxDPiBlaXRoZXIgcG9pbnRzIHRvIGFuIG9iamVjdAorLy8gb3IgaXMgTlVMTC4gIEEgc2NvcGVkX2FycmF5PEM+IG93bnMgdGhlIG9iamVjdCB0aGF0IGl0IHBvaW50cyB0by4KKy8vCisvLyBTaXplOiBzaXplb2Yoc2NvcGVkX2FycmF5PEM+KSA9PSBzaXplb2YoQyopCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK2NsYXNzIHNjb3BlZF9hcnJheSB7CisgcHVibGljOgorCisgIC8vIFRoZSBlbGVtZW50IHR5cGUKKyAgdHlwZWRlZiBDIGVsZW1lbnRfdHlwZTsKKworICAvLyBDb25zdHJ1Y3Rvci4gIERlZmF1bHRzIHRvIGludGlhbGl6aW5nIHdpdGggTlVMTC4KKyAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGNyZWF0ZSBhbiB1bmluaXRpYWxpemVkIHNjb3BlZF9hcnJheS4KKyAgLy8gVGhlIGlucHV0IHBhcmFtZXRlciBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIG5ldyBbXS4KKyAgZXhwbGljaXQgc2NvcGVkX2FycmF5KEMqIHAgPSBOVUxMKSA6IGFycmF5XyhwKSB7IH0KKworICAvLyBEZXN0cnVjdG9yLiAgSWYgdGhlcmUgaXMgYSBDIG9iamVjdCwgZGVsZXRlIGl0LgorICAvLyBXZSBkb24ndCBuZWVkIHRvIHRlc3QgcHRyXyA9PSBOVUxMIGJlY2F1c2UgQysrIGRvZXMgdGhhdCBmb3IgdXMuCisgIH5zY29wZWRfYXJyYXkoKSB7CisgICAgZW51bSB7IHR5cGVfbXVzdF9iZV9jb21wbGV0ZSA9IHNpemVvZihDKSB9OworICAgIGRlbGV0ZVtdIGFycmF5XzsKKyAgfQorCisgIC8vIFJlc2V0LiAgRGVsZXRlcyB0aGUgY3VycmVudCBvd25lZCBvYmplY3QsIGlmIGFueS4KKyAgLy8gVGhlbiB0YWtlcyBvd25lcnNoaXAgb2YgYSBuZXcgb2JqZWN0LCBpZiBnaXZlbi4KKyAgLy8gdGhpcy0+cmVzZXQodGhpcy0+Z2V0KCkpIHdvcmtzLgorICB2b2lkIHJlc2V0KEMqIHAgPSBOVUxMKSB7CisgICAgaWYgKHAgIT0gYXJyYXlfKSB7CisgICAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07CisgICAgICBkZWxldGVbXSBhcnJheV87CisgICAgICBhcnJheV8gPSBwOworICAgIH0KKyAgfQorCisgIC8vIEdldCBvbmUgZWxlbWVudCBvZiB0aGUgY3VycmVudCBvYmplY3QuCisgIC8vIFdpbGwgYXNzZXJ0KCkgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBvYmplY3QsIG9yIGluZGV4IGkgaXMgbmVnYXRpdmUuCisgIEMmIG9wZXJhdG9yW10oc3RkOjpwdHJkaWZmX3QgaSkgY29uc3QgeworICAgIGFzc2VydChpID49IDApOworICAgIGFzc2VydChhcnJheV8gIT0gTlVMTCk7CisgICAgcmV0dXJuIGFycmF5X1tpXTsKKyAgfQorCisgIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIHplcm90aCBlbGVtZW50IG9mIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgLy8gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBvYmplY3QsIHJldHVybiBOVUxMLgorICBDKiBnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGFycmF5XzsKKyAgfQorCisgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorICAvLyBUaGVzZSByZXR1cm4gd2hldGhlciB0d28gc2NvcGVkX2FycmF5IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8KKyAgLy8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwgb2JqZWN0cy4KKyAgYm9vbCBvcGVyYXRvcj09KEMqIHApIGNvbnN0IHsgcmV0dXJuIGFycmF5XyA9PSBwOyB9CisgIGJvb2wgb3BlcmF0b3IhPShDKiBwKSBjb25zdCB7IHJldHVybiBhcnJheV8gIT0gcDsgfQorCisgIC8vIFN3YXAgdHdvIHNjb3BlZCBhcnJheXMuCisgIHZvaWQgc3dhcChzY29wZWRfYXJyYXkmIHAyKSB7CisgICAgQyogdG1wID0gYXJyYXlfOworICAgIGFycmF5XyA9IHAyLmFycmF5XzsKKyAgICBwMi5hcnJheV8gPSB0bXA7CisgIH0KKworICAvLyBSZWxlYXNlIGFuIGFycmF5LgorICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBjdXJyZW50IHBvaW50ZXIgaGVsZCBieSB0aGlzIG9iamVjdC4KKyAgLy8gSWYgdGhpcyBvYmplY3QgaG9sZHMgYSBOVUxMIHBvaW50ZXIsIHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKyAgLy8gQWZ0ZXIgdGhpcyBvcGVyYXRpb24sIHRoaXMgb2JqZWN0IHdpbGwgaG9sZCBhIE5VTEwgcG9pbnRlciwKKyAgLy8gYW5kIHdpbGwgbm90IG93biB0aGUgb2JqZWN0IGFueSBtb3JlLgorICBDKiByZWxlYXNlKCkgeworICAgIEMqIHJldFZhbCA9IGFycmF5XzsKKyAgICBhcnJheV8gPSBOVUxMOworICAgIHJldHVybiByZXRWYWw7CisgIH0KKworIHByaXZhdGU6CisgIEMqIGFycmF5XzsKKworICAvLyBGb3JiaWQgY29tcGFyaXNvbiBvZiBkaWZmZXJlbnQgc2NvcGVkX2FycmF5IHR5cGVzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3I9PShzY29wZWRfYXJyYXk8QzI+IGNvbnN0JiBwMikgY29uc3Q7CisgIHRlbXBsYXRlIDxjbGFzcyBDMj4gYm9vbCBvcGVyYXRvciE9KHNjb3BlZF9hcnJheTxDMj4gY29uc3QmIHAyKSBjb25zdDsKKworICAvLyBEaXNhbGxvdyBldmlsIGNvbnN0cnVjdG9ycworICBzY29wZWRfYXJyYXkoY29uc3Qgc2NvcGVkX2FycmF5Jik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9hcnJheSYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKKy8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCit1c2luZyBpbnRlcm5hbDo6c2NvcGVkX3B0cjsKK3VzaW5nIGludGVybmFsOjpzY29wZWRfYXJyYXk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9sb2dnaW5nLmgKKworZW51bSBMb2dMZXZlbCB7CisgIExPR0xFVkVMX0lORk8sICAgICAvLyBJbmZvcm1hdGlvbmFsLiAgVGhpcyBpcyBuZXZlciBhY3R1YWxseSB1c2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAvLyBsaWJwcm90b2J1Zi4KKyAgTE9HTEVWRUxfV0FSTklORywgIC8vIFdhcm5zIGFib3V0IGlzc3VlcyB0aGF0LCBhbHRob3VnaCBub3QgdGVjaG5pY2FsbHkgYQorICAgICAgICAgICAgICAgICAgICAgLy8gcHJvYmxlbSBub3csIGNvdWxkIGNhdXNlIHByb2JsZW1zIGluIHRoZSBmdXR1cmUuICBGb3IKKyAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGUsIGEgLy8gd2FybmluZyB3aWxsIGJlIHByaW50ZWQgd2hlbiBwYXJzaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgdGhhdCBpcyBuZWFyIHRoZSBtZXNzYWdlIHNpemUgbGltaXQuCisgIExPR0xFVkVMX0VSUk9SLCAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIHVzZS4KKyAgTE9HTEVWRUxfRkFUQUwsICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIGZyb20gd2hpY2ggdGhlIGxpYnJhcnkgY2Fubm90CisgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyLiAgVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29kZSB3aGljaCBjYWxscyB0aGUgbGlicmFyeSwgZXNwZWNpYWxseSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAvLyBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlLgorCisjaWZkZWYgTkRFQlVHCisgIExPR0xFVkVMX0RGQVRBTCA9IExPR0xFVkVMX0VSUk9SCisjZWxzZQorICBMT0dMRVZFTF9ERkFUQUwgPSBMT0dMRVZFTF9GQVRBTAorI2VuZGlmCit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBMb2dGaW5pc2hlcjsKKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExvZ01lc3NhZ2UgeworIHB1YmxpYzoKKyAgTG9nTWVzc2FnZShMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lKTsKKyAgfkxvZ01lc3NhZ2UoKTsKKworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoY29uc3QgY2hhciogdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNoYXIgdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGludCB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodWludCB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwobG9uZyB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoZG91YmxlIHZhbHVlKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBMb2dGaW5pc2hlcjsKKyAgdm9pZCBGaW5pc2goKTsKKworICBMb2dMZXZlbCBsZXZlbF87CisgIGNvbnN0IGNoYXIqIGZpbGVuYW1lXzsKKyAgaW50IGxpbmVfOworICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKK307CisKKy8vIFVzZWQgdG8gbWFrZSB0aGUgZW50aXJlICJMT0coQkxBSCkgPDwgZXRjLiIgZXhwcmVzc2lvbiBoYXZlIGEgdm9pZCByZXR1cm4KKy8vIHR5cGUgYW5kIHByaW50IGEgbmV3bGluZSBhZnRlciBlYWNoIG1lc3NhZ2UuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTG9nRmluaXNoZXIgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcj0oTG9nTWVzc2FnZSYgb3RoZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFVuZGVmIGV2ZXJ5dGhpbmcgaW4gY2FzZSB3ZSdyZSBiZWluZyBtaXhlZCB3aXRoIHNvbWUgb3RoZXIgR29vZ2xlIGxpYnJhcnkKKy8vIHdoaWNoIGFscmVhZHkgZGVmaW5lZCB0aGVtIGl0c2VsZi4gIFByZXN1bWFibHkgYWxsIEdvb2dsZSBsaWJyYXJpZXMgd2lsbAorLy8gc3VwcG9ydCB0aGUgc2FtZSBzeW50YXggZm9yIHRoZXNlIHNvIGl0IHNob3VsZCBub3QgYmUgYSBiaWcgZGVhbCBpZiB0aGV5CisvLyBlbmQgdXAgdXNpbmcgb3VyIGRlZmluaXRpb25zIGluc3RlYWQuCisjdW5kZWYgR09PR0xFX0xPRworI3VuZGVmIEdPT0dMRV9MT0dfSUYKKworI3VuZGVmIEdPT0dMRV9DSEVDSworI3VuZGVmIEdPT0dMRV9DSEVDS19FUQorI3VuZGVmIEdPT0dMRV9DSEVDS19ORQorI3VuZGVmIEdPT0dMRV9DSEVDS19MVAorI3VuZGVmIEdPT0dMRV9DSEVDS19MRQorI3VuZGVmIEdPT0dMRV9DSEVDS19HVAorI3VuZGVmIEdPT0dMRV9DSEVDS19HRQorI3VuZGVmIEdPT0dMRV9DSEVDS19OT1ROVUxMCisKKyN1bmRlZiBHT09HTEVfRExPRworI3VuZGVmIEdPT0dMRV9EQ0hFQ0sKKyN1bmRlZiBHT09HTEVfRENIRUNLX0VRCisjdW5kZWYgR09PR0xFX0RDSEVDS19ORQorI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfTFQKKyN1bmRlZiBHT09HTEVfRENIRUNLX0xFCisjdW5kZWYgR09PR0xFX0RDSEVDS19HVAorI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfR0UKKworI2RlZmluZSBHT09HTEVfTE9HKExFVkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkxvZ0ZpbmlzaGVyKCkgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpMb2dNZXNzYWdlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpMT0dMRVZFTF8jI0xFVkVMLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIEdPT0dMRV9MT0dfSUYoTEVWRUwsIENPTkRJVElPTikgXAorICAhKENPTkRJVElPTikgPyAodm9pZCkwIDogR09PR0xFX0xPRyhMRVZFTCkKKworI2RlZmluZSBHT09HTEVfQ0hFQ0soRVhQUkVTU0lPTikgXAorICBHT09HTEVfTE9HX0lGKEZBVEFMLCAhKEVYUFJFU1NJT04pKSA8PCAiQ0hFQ0sgZmFpbGVkOiAiICNFWFBSRVNTSU9OICI6ICIKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0VRKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgPT0gKEIpKQorI2RlZmluZSBHT09HTEVfQ0hFQ0tfTkUoQSwgQikgR09PR0xFX0NIRUNLKChBKSAhPSAoQikpCisjZGVmaW5lIEdPT0dMRV9DSEVDS19MVChBLCBCKSBHT09HTEVfQ0hFQ0soKEEpIDwgIChCKSkKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0xFKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgPD0gKEIpKQorI2RlZmluZSBHT09HTEVfQ0hFQ0tfR1QoQSwgQikgR09PR0xFX0NIRUNLKChBKSA+ICAoQikpCisjZGVmaW5lIEdPT0dMRV9DSEVDS19HRShBLCBCKSBHT09HTEVfQ0hFQ0soKEEpID49IChCKSkKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUKiBDaGVja05vdE51bGwoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm5hbWUsIFQqIHZhbCkgeworICBpZiAodmFsID09IE5VTEwpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCBuYW1lOworICB9CisgIHJldHVybiB2YWw7Cit9Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKyNkZWZpbmUgR09PR0xFX0NIRUNLX05PVE5VTEwoQSkgXAorICBpbnRlcm5hbDo6Q2hlY2tOb3ROdWxsKF9fRklMRV9fLCBfX0xJTkVfXywgIiciICNBICInIG11c3Qgbm90IGJlIE5VTEwiLCAoQSkpCisKKyNpZmRlZiBOREVCVUcKKworI2RlZmluZSBHT09HTEVfRExPRyBHT09HTEVfTE9HX0lGKElORk8sIGZhbHNlKQorCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0soRVhQUkVTU0lPTikgd2hpbGUoZmFsc2UpIEdPT0dMRV9DSEVDSyhFWFBSRVNTSU9OKQorI2RlZmluZSBHT09HTEVfRENIRUNLX0VRKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpID09IChCKSkKKyNkZWZpbmUgR09PR0xFX0RDSEVDS19ORShBLCBCKSBHT09HTEVfRENIRUNLKChBKSAhPSAoQikpCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTFQoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgPCAgKEIpKQorI2RlZmluZSBHT09HTEVfRENIRUNLX0xFKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpIDw9IChCKSkKKyNkZWZpbmUgR09PR0xFX0RDSEVDS19HVChBLCBCKSBHT09HTEVfRENIRUNLKChBKSA+ICAoQikpCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR0UoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgPj0gKEIpKQorCisjZWxzZSAgLy8gTkRFQlVHCisKKyNkZWZpbmUgR09PR0xFX0RMT0cgR09PR0xFX0xPRworCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0sgICAgR09PR0xFX0NIRUNLCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfRVEgR09PR0xFX0NIRUNLX0VRCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTkUgR09PR0xFX0NIRUNLX05FCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTFQgR09PR0xFX0NIRUNLX0xUCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTEUgR09PR0xFX0NIRUNLX0xFCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR1QgR09PR0xFX0NIRUNLX0dUCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR0UgR09PR0xFX0NIRUNLX0dFCisKKyNlbmRpZiAgLy8gIU5ERUJVRworCit0eXBlZGVmIHZvaWQgTG9nSGFuZGxlcihMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCisvLyBUaGUgcHJvdG9idWYgbGlicmFyeSBzb21ldGltZXMgd3JpdGVzIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIHRvCisvLyBzdGRlcnIuICBUaGVzZSBtZXNzYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycywgYnV0IG1heQorLy8gYWxzbyBoZWxwIGVuZCB1c2VycyBmaWd1cmUgb3V0IGEgcHJvYmxlbS4gIElmIHlvdSB3b3VsZCBwcmVmZXIgdGhhdAorLy8gdGhlc2UgbWVzc2FnZXMgYmUgc2VudCBzb21ld2hlcmUgb3RoZXIgdGhhbiBzdGRlcnIsIGNhbGwgU2V0TG9nSGFuZGxlcigpCisvLyB0byBzZXQgeW91ciBvd24gaGFuZGxlci4gIFRoaXMgcmV0dXJucyB0aGUgb2xkIGhhbmRsZXIuICBTZXQgdGhlIGhhbmRsZXIKKy8vIHRvIE5VTEwgdG8gaWdub3JlIGxvZyBtZXNzYWdlcyAoYnV0IHNlZSBhbHNvIExvZ1NpbGVuY2VyLCBiZWxvdykuCisvLworLy8gT2J2aW91c2x5LCBTZXRMb2dIYW5kbGVyIGlzIG5vdCB0aHJlYWQtc2FmZS4gIFlvdSBzaG91bGQgb25seSBjYWxsIGl0CisvLyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBhbmQgcHJvYmFibHkgbm90IGZyb20gbGlicmFyeSBjb2RlLiAgSWYgeW91CisvLyBzaW1wbHkgd2FudCB0byBzdXBwcmVzcyBsb2cgbWVzc2FnZXMgdGVtcG9yYXJpbHkgKGUuZy4gYmVjYXVzZSB5b3UKKy8vIGhhdmUgc29tZSBjb2RlIHRoYXQgdGVuZHMgdG8gdHJpZ2dlciB0aGVtIGZyZXF1ZW50bHkgYW5kIHlvdSBrbm93CisvLyB0aGUgd2FybmluZ3MgYXJlIG5vdCBpbXBvcnRhbnQgdG8geW91KSwgdXNlIHRoZSBMb2dTaWxlbmNlciBjbGFzcworLy8gYmVsb3cuCitMSUJQUk9UT0JVRl9FWFBPUlQgTG9nSGFuZGxlciogU2V0TG9nSGFuZGxlcihMb2dIYW5kbGVyKiBuZXdfZnVuYyk7CisKKy8vIENyZWF0ZSBhIExvZ1NpbGVuY2VyIGlmIHlvdSB3YW50IHRvIHRlbXBvcmFyaWx5IHN1cHByZXNzIGFsbCBsb2cKKy8vIG1lc3NhZ2VzLiAgQXMgbG9uZyBhcyBhbnkgTG9nU2lsZW5jZXIgb2JqZWN0cyBleGlzdCwgbm9uLWZhdGFsCisvLyBsb2cgbWVzc2FnZXMgd2lsbCBiZSBkaXNjYXJkZWQgKHRoZSBjdXJyZW50IExvZ0hhbmRsZXIgd2lsbCAqbm90KgorLy8gYmUgY2FsbGVkKS4gIENvbnN0cnVjdGluZyBhIExvZ1NpbGVuY2VyIGlzIHRocmVhZC1zYWZlLiAgWW91IG1heQorLy8gYWNjaWRlbnRhbGx5IHN1cHByZXNzIGxvZyBtZXNzYWdlcyBvY2N1cnJpbmcgaW4gYW5vdGhlciB0aHJlYWQsIGJ1dAorLy8gc2luY2UgbWVzc2FnZXMgYXJlIGdlbmVyYWxseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHRoaXMgaXNuJ3QKKy8vIGEgYmlnIGRlYWwuICBJZiB5b3Ugd2FudCB0byBpbnRlcmNlcHQgbG9nIG1lc3NhZ2VzLCB1c2UgU2V0TG9nSGFuZGxlcigpLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExvZ1NpbGVuY2VyIHsKKyBwdWJsaWM6CisgIExvZ1NpbGVuY2VyKCk7CisgIH5Mb2dTaWxlbmNlcigpOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL2NhbGxiYWNrLmgKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGNhbGxiYWNrLiAgV2hlbiBjYWxsaW5nIGFuIFJQQywgeW91IG11c3QgcHJvdmlkZQorLy8gYSBDbG9zdXJlIHRvIGNhbGwgd2hlbiB0aGUgcHJvY2VkdXJlIGNvbXBsZXRlcy4gIFNlZSB0aGUgU2VydmljZSBpbnRlcmZhY2UKKy8vIGluIHNlcnZpY2UuaC4KKy8vCisvLyBUbyBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdCBhIENsb3N1cmUgd2hpY2ggY2FsbHMgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIG9yCisvLyBtZXRob2Qgd2l0aCBhIHBhcnRpY3VsYXIgc2V0IG9mIHBhcmFtZXRlcnMsIHVzZSB0aGUgTmV3Q2FsbGJhY2soKSBmdW5jdGlvbi4KKy8vIEV4YW1wbGU6CisvLyAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKKy8vICAgICAuLi4KKy8vICAgfQorLy8KKy8vICAgdm9pZCBDYWxsRm9vKCkgeworLy8gICAgIC4uLgorLy8gICAgIC8vIFdoZW4gZG9uZSwgY2FsbCBGb29Eb25lKCkgYW5kIHBhc3MgaXQgYSBwb2ludGVyIHRvIHRoZSByZXNwb25zZS4KKy8vICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKCZGb29Eb25lLCByZXNwb25zZSk7CisvLyAgICAgLy8gTWFrZSB0aGUgY2FsbC4KKy8vICAgICBzZXJ2aWNlLT5Gb28oY29udHJvbGxlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGNhbGxiYWNrKTsKKy8vICAgfQorLy8KKy8vIEV4YW1wbGUgdGhhdCBjYWxscyBhIG1ldGhvZDoKKy8vICAgY2xhc3MgSGFuZGxlciB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgLi4uCisvLworLy8gICAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKKy8vICAgICAgIC4uLgorLy8gICAgIH0KKy8vCisvLyAgICAgdm9pZCBDYWxsRm9vKCkgeworLy8gICAgICAgLi4uCisvLyAgICAgICAvLyBXaGVuIGRvbmUsIGNhbGwgRm9vRG9uZSgpIGFuZCBwYXNzIGl0IGEgcG9pbnRlciB0byB0aGUgcmVzcG9uc2UuCisvLyAgICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKHRoaXMsICZIYW5kbGVyOjpGb29Eb25lLCByZXNwb25zZSk7CisvLyAgICAgICAvLyBNYWtlIHRoZSBjYWxsLgorLy8gICAgICAgc2VydmljZS0+Rm9vKGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBjYWxsYmFjayk7CisvLyAgICAgfQorLy8gICB9OworLy8KKy8vIEN1cnJlbnRseSBOZXdDYWxsYmFjaygpIHN1cHBvcnRzIGJpbmRpbmcgemVybywgb25lLCBvciB0d28gYXJndW1lbnRzLgorLy8KKy8vIENhbGxiYWNrcyBjcmVhdGVkIHdpdGggTmV3Q2FsbGJhY2soKSBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGVtc2VsdmVzIHdoZW4KKy8vIGV4ZWN1dGVkLiAgVGhleSBzaG91bGQgYmUgdXNlZCB3aGVuIGEgY2FsbGJhY2sgaXMgdG8gYmUgY2FsbGVkIGV4YWN0bHkKKy8vIG9uY2UgKHVzdWFsbHkgdGhlIGNhc2Ugd2l0aCBSUEMgY2FsbGJhY2tzKS4gIElmIGEgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZAorLy8gYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbWVzIChpbmNsdWRpbmcgemVybyksIGNyZWF0ZSBpdCB3aXRoCisvLyBOZXdQZXJtYW5lbnRDYWxsYmFjaygpIGluc3RlYWQuICBZb3UgYXJlIHRoZW4gcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQorLy8gY2FsbGJhY2sgKHVzaW5nIHRoZSAiZGVsZXRlIiBrZXl3b3JkIGFzIG5vcm1hbCkuCisvLworLy8gTm90ZSB0aGF0IE5ld0NhbGxiYWNrKCkgaXMgYSBiaXQgdG91Y2h5IHJlZ2FyZGluZyBhcmd1bWVudCB0eXBlcy4gIEdlbmVyYWxseSwKKy8vIHRoZSB2YWx1ZXMgeW91IHByb3ZpZGUgZm9yIHRoZSBwYXJhbWV0ZXIgYmluZGluZ3MgbXVzdCBleGFjdGx5IG1hdGNoIHRoZQorLy8gdHlwZXMgYWNjZXB0ZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CisvLyAgIHZvaWQgRm9vKHN0cmluZyBzKTsKKy8vICAgTmV3Q2FsbGJhY2soJkZvbywgImZvbyIpOyAgICAgICAgICAvLyBXT04nVCBXT1JLOiAgY29uc3QgY2hhciogIT0gc3RyaW5nCisvLyAgIE5ld0NhbGxiYWNrKCZGb28sIHN0cmluZygiZm9vIikpOyAgLy8gV09SS1MKKy8vIEFsc28gbm90ZSB0aGF0IHRoZSBhcmd1bWVudHMgY2Fubm90IGJlIHJlZmVyZW5jZXM6CisvLyAgIHZvaWQgRm9vKGNvbnN0IHN0cmluZyYgcyk7CisvLyAgIHN0cmluZyBteV9zdHI7CisvLyAgIE5ld0NhbGxiYWNrKCZGb28sIG15X3N0cik7ICAvLyBXT04nVCBXT1JLOiAgQ2FuJ3QgdXNlIHJlZmVyZWNuZXMuCisvLyBIb3dldmVyLCBjb3JyZWN0bHktdHlwZWQgcG9pbnRlcnMgd2lsbCB3b3JrIGp1c3QgZmluZS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIENsb3N1cmUoKSB7fQorICB2aXJ0dWFsIH5DbG9zdXJlKCk7CisKKyAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDbG9zdXJlKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGdW5jdGlvbkNsb3N1cmUwIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKSgpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTAoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcpCisgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMCgpOworCisgIHZvaWQgUnVuKCkgeworICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187ICAvLyByZWFkIGluIGNhc2UgY2FsbGJhY2sgZGVsZXRlcworICAgIGZ1bmN0aW9uXygpOworICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOworICB9CisKKyBwcml2YXRlOgorICBGdW5jdGlvblR5cGUgZnVuY3Rpb25fOworICBib29sIHNlbGZfZGVsZXRpbmdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzPgorY2xhc3MgTWV0aG9kQ2xvc3VyZTAgOiBwdWJsaWMgQ2xvc3VyZSB7CisgcHVibGljOgorICB0eXBlZGVmIHZvaWQgKENsYXNzOjoqTWV0aG9kVHlwZSkoKTsKKworICBNZXRob2RDbG9zdXJlMChDbGFzcyogb2JqZWN0LCBNZXRob2RUeXBlIG1ldGhvZCwgYm9vbCBzZWxmX2RlbGV0aW5nKQorICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpIHt9CisgIH5NZXRob2RDbG9zdXJlMCgpIHt9CisKKyAgdm9pZCBSdW4oKSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgKG9iamVjdF8tPiptZXRob2RfKSgpOworICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOworICB9CisKKyBwcml2YXRlOgorICBDbGFzcyogb2JqZWN0XzsKKyAgTWV0aG9kVHlwZSBtZXRob2RfOworICBib29sIHNlbGZfZGVsZXRpbmdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZzE+CitjbGFzcyBGdW5jdGlvbkNsb3N1cmUxIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKShBcmcxIGFyZzEpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTEoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQorICAgIDogZnVuY3Rpb25fKGZ1bmN0aW9uKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCisgICAgICBhcmcxXyhhcmcxKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMSgpIHt9CisKKyAgdm9pZCBSdW4oKSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgZnVuY3Rpb25fKGFyZzFfKTsKKyAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgQXJnMSBhcmcxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMT4KK2NsYXNzIE1ldGhvZENsb3N1cmUxIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkIChDbGFzczo6Kk1ldGhvZFR5cGUpKEFyZzEgYXJnMSk7CisKKyAgTWV0aG9kQ2xvc3VyZTEoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKKyAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQorICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpLAorICAgICAgYXJnMV8oYXJnMSkge30KKyAgfk1ldGhvZENsb3N1cmUxKCkge30KKworICB2b2lkIFJ1bigpIHsKKyAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKKyAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfKTsKKyAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgQ2xhc3MqIG9iamVjdF87CisgIE1ldGhvZFR5cGUgbWV0aG9kXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgQXJnMSBhcmcxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgorY2xhc3MgRnVuY3Rpb25DbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoKkZ1bmN0aW9uVHlwZSkoQXJnMSBhcmcxLCBBcmcyIGFyZzIpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTIoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCisgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSwKKyAgICAgIGFyZzFfKGFyZzEpLCBhcmcyXyhhcmcyKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMigpIHt9CisKKyAgdm9pZCBSdW4oKSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgZnVuY3Rpb25fKGFyZzFfLCBhcmcyXyk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvbl87CisgIGJvb2wgc2VsZl9kZWxldGluZ187CisgIEFyZzEgYXJnMV87CisgIEFyZzIgYXJnMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitjbGFzcyBNZXRob2RDbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoQ2xhc3M6OipNZXRob2RUeXBlKShBcmcxIGFyZzEsIEFyZzIgYXJnMik7CisKKyAgTWV0aG9kQ2xvc3VyZTIoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKKyAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCisgICAgOiBvYmplY3RfKG9iamVjdCksIG1ldGhvZF8obWV0aG9kKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCisgICAgICBhcmcxXyhhcmcxKSwgYXJnMl8oYXJnMikge30KKyAgfk1ldGhvZENsb3N1cmUyKCkge30KKworICB2b2lkIFJ1bigpIHsKKyAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKKyAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfLCBhcmcyXyk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIENsYXNzKiBvYmplY3RfOworICBNZXRob2RUeXBlIG1ldGhvZF87CisgIGJvb2wgc2VsZl9kZWxldGluZ187CisgIEFyZzEgYXJnMV87CisgIEFyZzIgYXJnMl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gU2VlIENsb3N1cmUuCitpbmxpbmUgQ2xvc3VyZSogTmV3Q2FsbGJhY2sodm9pZCAoKmZ1bmN0aW9uKSgpKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTAoZnVuY3Rpb24sIHRydWUpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK2lubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKCkpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMChmdW5jdGlvbiwgZmFsc2UpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMDxDbGFzcz4ob2JqZWN0LCBtZXRob2QsIHRydWUpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4KK2lubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMDxDbGFzcz4ob2JqZWN0LCBtZXRob2QsIGZhbHNlKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMT4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUxPEFyZzE+KGZ1bmN0aW9uLCB0cnVlLCBhcmcxKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMT4KK2lubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUxPEFyZzE+KGZ1bmN0aW9uLCBmYWxzZSwgYXJnMSk7Cit9CisKKy8vIFNlZSBDbG9zdXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBBcmcxPgoraW5saW5lIENsb3N1cmUqIE5ld0NhbGxiYWNrKENsYXNzKiBvYmplY3QsIHZvaWQgKENsYXNzOjoqbWV0aG9kKShBcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcxIGFyZzEpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTE8Q2xhc3MsIEFyZzE+KG9iamVjdCwgbWV0aG9kLCB0cnVlLCBhcmcxKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzE+CitpbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2soQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKEFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMTxDbGFzcywgQXJnMT4ob2JqZWN0LCBtZXRob2QsIGZhbHNlLCBhcmcxKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEsIEFyZzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTI8QXJnMSwgQXJnMj4oCisgICAgZnVuY3Rpb24sIHRydWUsIGFyZzEsIGFyZzIpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgoraW5saW5lIENsb3N1cmUqIE5ld1Blcm1hbmVudENhbGxiYWNrKHZvaWQgKCpmdW5jdGlvbikoQXJnMSwgQXJnMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMjxBcmcxLCBBcmcyPigKKyAgICBmdW5jdGlvbiwgZmFsc2UsIGFyZzEsIGFyZzIpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoQXJnMSwgQXJnMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTI8Q2xhc3MsIEFyZzEsIEFyZzI+KAorICAgIG9iamVjdCwgbWV0aG9kLCB0cnVlLCBhcmcxLCBhcmcyKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitpbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2soCisgICAgQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKEFyZzEsIEFyZzIpLAorICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6Ok1ldGhvZENsb3N1cmUyPENsYXNzLCBBcmcxLCBBcmcyPigKKyAgICBvYmplY3QsIG1ldGhvZCwgZmFsc2UsIGFyZzEsIGFyZzIpOworfQorCisvLyBBIGZ1bmN0aW9uIHdoaWNoIGRvZXMgbm90aGluZy4gIFVzZWZ1bCBmb3IgY3JlYXRpbmcgbm8tb3AgY2FsbGJhY2tzLCBlLmcuOgorLy8gICBDbG9zdXJlKiBub3RoaW5nID0gTmV3Q2FsbGJhY2soJkRvTm90aGluZyk7Cit2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBEb05vdGhpbmcoKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL211dGV4LmgKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBNdXRleCBpcyBhIG5vbi1yZWVudHJhbnQgKGFrYSBub24tcmVjdXJzaXZlKSBtdXRleC4gIEF0IG1vc3Qgb25lIHRocmVhZCBUCisvLyBtYXkgaG9sZCBhIG11dGV4IGF0IGEgZ2l2ZW4gdGltZS4gIElmIFQgYXR0ZW1wdHMgdG8gTG9jaygpIHRoZSBzYW1lIE11dGV4CisvLyB3aGlsZSBob2xkaW5nIGl0LCBUIHdpbGwgZGVhZGxvY2suCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTXV0ZXggeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgTXV0ZXggdGhhdCBpcyBub3QgaGVsZCBieSBhbnlib2R5LgorICBNdXRleCgpOworCisgIC8vIERlc3RydWN0b3IKKyAgfk11dGV4KCk7CisKKyAgLy8gQmxvY2sgaWYgbmVjZXNzYXJ5IHVudGlsIHRoaXMgTXV0ZXggaXMgZnJlZSwgdGhlbiBhY3F1aXJlIGl0IGV4Y2x1c2l2ZWx5LgorICB2b2lkIExvY2soKTsKKworICAvLyBSZWxlYXNlIHRoaXMgTXV0ZXguICBDYWxsZXIgbXVzdCBob2xkIGl0IGV4Y2x1c2l2ZWx5LgorICB2b2lkIFVubG9jaygpOworCisgIC8vIENyYXNoIGlmIHRoaXMgTXV0ZXggaXMgbm90IGhlbGQgZXhjbHVzaXZlbHkgYnkgdGhpcyB0aHJlYWQuCisgIC8vIE1heSBmYWlsIHRvIGNyYXNoIHdoZW4gaXQgc2hvdWxkOyB3aWxsIG5ldmVyIGNyYXNoIHdoZW4gaXQgc2hvdWxkIG5vdC4KKyAgdm9pZCBBc3NlcnRIZWxkKCk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgSW50ZXJuYWw7CisgIEludGVybmFsKiBtSW50ZXJuYWw7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE11dGV4KTsKK307CisKKy8vIE11dGV4TG9jayhtdSkgYWNxdWlyZXMgbXUgd2hlbiBjb25zdHJ1Y3RlZCBhbmQgcmVsZWFzZXMgaXQgd2hlbiBkZXN0cm95ZWQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE11dGV4TG9jayhNdXRleCAqbXUpIDogbXVfKG11KSB7IHRoaXMtPm11Xy0+TG9jaygpOyB9CisgIH5NdXRleExvY2soKSB7IHRoaXMtPm11Xy0+VW5sb2NrKCk7IH0KKyBwcml2YXRlOgorICBNdXRleCAqY29uc3QgbXVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrKTsKK307CisKKy8vIFRPRE8oa2VudG9uKTogIEltcGxlbWVudCB0aGVzZT8gIEhhcmQgdG8gaW1wbGVtZW50IHBvcnRhYmx5LgordHlwZWRlZiBNdXRleExvY2sgUmVhZGVyTXV0ZXhMb2NrOwordHlwZWRlZiBNdXRleExvY2sgV3JpdGVyTXV0ZXhMb2NrOworCisvLyBNdXRleExvY2tNYXliZSBpcyBsaWtlIE11dGV4TG9jaywgYnV0IGlzIGEgbm8tb3Agd2hlbiBtdSBpcyBOVUxMLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE11dGV4TG9ja01heWJlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE11dGV4TG9ja01heWJlKE11dGV4ICptdSkgOgorICAgIG11XyhtdSkgeyBpZiAodGhpcy0+bXVfICE9IE5VTEwpIHsgdGhpcy0+bXVfLT5Mb2NrKCk7IH0gfQorICB+TXV0ZXhMb2NrTWF5YmUoKSB7IGlmICh0aGlzLT5tdV8gIT0gTlVMTCkgeyB0aGlzLT5tdV8tPlVubG9jaygpOyB9IH0KKyBwcml2YXRlOgorICBNdXRleCAqY29uc3QgbXVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrTWF5YmUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKKy8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCit1c2luZyBpbnRlcm5hbDo6TXV0ZXg7Cit1c2luZyBpbnRlcm5hbDo6TXV0ZXhMb2NrOwordXNpbmcgaW50ZXJuYWw6OlJlYWRlck11dGV4TG9jazsKK3VzaW5nIGludGVybmFsOjpXcml0ZXJNdXRleExvY2s7Cit1c2luZyBpbnRlcm5hbDo6TXV0ZXhMb2NrTWF5YmU7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGZyb20gZ29vZ2xlMy91dGlsL3V0ZjgvcHVibGljL3VuaWxpYi5oCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENoZWNrcyBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIHN0cnVjdHVyYWxseS12YWxpZCBVVEYtOC4gIEltcGxlbWVudGVkIGluCisvLyBzdHJ1Y3R1cmFsbHlfdmFsaWQuY2MuCitMSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBjaGFyKiBidWYsIGludCBsZW4pOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL3V0aWwvZW5kaWFuL2VuZGlhbi5oCitMSUJQUk9UT0JVRl9FWFBPUlQgdWludDMyIGdodG9ubCh1aW50MzIgeCk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFNodXRkb3duIHN1cHBvcnQuCisKKy8vIFNodXQgZG93biB0aGUgZW50aXJlIHByb3RvY29sIGJ1ZmZlcnMgbGlicmFyeSwgZGVsZXRpbmcgYWxsIHN0YXRpYy1kdXJhdGlvbgorLy8gb2JqZWN0cyBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkgb3IgYnkgZ2VuZXJhdGVkIC5wYi5jYyBmaWxlcy4KKy8vCisvLyBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgeW91IG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzOgorLy8gKiBZb3UgdXNlIGEgZHJhY29uaWFuIGRlZmluaXRpb24gb2YgIm1lbW9yeSBsZWFrIiBpbiB3aGljaCB5b3UgZXhwZWN0CisvLyAgIGV2ZXJ5IHNpbmdsZSBtYWxsb2MoKSB0byBoYXZlIGEgY29ycmVzcG9uZGluZyBmcmVlKCksIGV2ZW4gZm9yIG9iamVjdHMKKy8vICAgd2hpY2ggbGl2ZSB1bnRpbCBwcm9ncmFtIGV4aXQuCisvLyAqIFlvdSBhcmUgd3JpdGluZyBhIGR5bmFtaWNhbGx5LWxvYWRlZCBsaWJyYXJ5IHdoaWNoIG5lZWRzIHRvIGNsZWFuIHVwCisvLyAgIGFmdGVyIGl0c2VsZiB3aGVuIHRoZSBsaWJyYXJ5IGlzIHVubG9hZGVkLgorLy8KKy8vIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIG11bHRpcGxlIHRpbWVzLiAgSG93ZXZlciwgaXQgaXMgbm90IHNhZmUgdG8gdXNlCisvLyBhbnkgb3RoZXIgcGFydCBvZiB0aGUgcHJvdG9jb2wgYnVmZmVycyBsaWJyYXJ5IGFmdGVyCisvLyBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpIGhhcyBiZWVuIGNhbGxlZC4KK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gU2h1dGRvd25Qcm90b2NvbEJ1ZmZlcnMoKSBpcyBjYWxsZWQuCitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBPblNodXRkb3duKHZvaWQgKCpmdW5jKSgpKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUworY2xhc3MgRmF0YWxFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24geworIHB1YmxpYzoKKyAgRmF0YWxFeGNlcHRpb24oY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICAgIDogZmlsZW5hbWVfKGZpbGVuYW1lKSwgbGluZV8obGluZSksIG1lc3NhZ2VfKG1lc3NhZ2UpIHt9CisgIHZpcnR1YWwgfkZhdGFsRXhjZXB0aW9uKCkgdGhyb3coKTsKKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpOworCisgIGNvbnN0IGNoYXIqIGZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gZmlsZW5hbWVfOyB9CisgIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXzsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogZmlsZW5hbWVfOworICBjb25zdCBpbnQgbGluZV87CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOworfTsKKyNlbmRpZgorCisvLyBUaGlzIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaW5zdGVhZCBvZiB0aGUgYmVnaW5uaW5nIHRvIHdvcmsgYXJvdW5kIGEgYnVnCisvLyBpbiBzb21lIHZlcnNpb25zIG9mIE1TVkMuCit1c2luZyBuYW1lc3BhY2Ugc3RkOyAgLy8gRG9uJ3QgZG8gdGhpcyBhdCBob21lLCBraWRzLgorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NTU9OX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjZDZkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwzNTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworLy8gVE9ETyhrZW50b24pOiAgTW9yZSB0ZXN0cy4KKworI2lmZGVmIFBBQ0tBR0VfVkVSU0lPTiAgLy8gb25seSBkZWZpbmVkIHdoZW4gdXNpbmcgYXV0b21ha2UsIG5vdCBNU1ZDCisKK1RFU1QoVmVyc2lvblRlc3QsIFZlcnNpb25NYXRjaGVzQ29uZmlnKSB7CisgIC8vIFZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIHN0cmluZyBzcGVjaWZpZWQgaW4gY29uZmlnLmggbWF0Y2hlcyB0aGUgb25lCisgIC8vIGluIGNvbW1vbi5oLiAgVGhlIGNvbmZpZy5oIHZlcnNpb24gaXMgYSBzdHJpbmcgd2hpY2ggbWF5IGhhdmUgYSBzdWZmaXgKKyAgLy8gbGlrZSAiYmV0YSIgb3IgInJjMSIsIHNvIHdlIHJlbW92ZSB0aGF0LgorICBzdHJpbmcgdmVyc2lvbiA9IFBBQ0tBR0VfVkVSU0lPTjsKKyAgaW50IHBvcyA9IDA7CisgIHdoaWxlIChwb3MgPCB2ZXJzaW9uLnNpemUoKSAmJgorICAgICAgICAgKGFzY2lpX2lzZGlnaXQodmVyc2lvbltwb3NdKSB8fCB2ZXJzaW9uW3Bvc10gPT0gJy4nKSkgeworICAgICsrcG9zOworICB9CisgIHZlcnNpb24uZXJhc2UocG9zKTsKKworICBFWFBFQ1RfRVEodmVyc2lvbiwgaW50ZXJuYWw6OlZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pKTsKK30KKworI2VuZGlmICAvLyBQQUNLQUdFX1ZFUlNJT04KKworVEVTVChDb21tb25UZXN0LCBJbnRNaW5NYXhDb25zdGFudHMpIHsKKyAgLy8ga2ludDMybWluIHdhcyBkZWNsYXJlZCBpbmNvcnJlY3RseSBpbiB0aGUgZmlyc3QgcmVsZWFzZSBvZiBwcm90b2J1ZnMuCisgIC8vIFVnaC4KKyAgRVhQRUNUX0xUKGtpbnQzMm1pbiwga2ludDMybWF4KTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQzMj4oa2ludDMybWluKSwgc3RhdGljX2Nhc3Q8dWludDMyPihraW50MzJtYXgpICsgMSk7CisgIEVYUEVDVF9MVChraW50NjRtaW4sIGtpbnQ2NG1heCk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50NjQ+KGtpbnQ2NG1pbiksIHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWF4KSArIDEpOworICBFWFBFQ1RfRVEoMCwga3VpbnQzMm1heCArIDEpOworICBFWFBFQ1RfRVEoMCwga3VpbnQ2NG1heCArIDEpOworfQorCit2ZWN0b3I8c3RyaW5nPiBjYXB0dXJlZF9tZXNzYWdlc187CisKK3ZvaWQgQ2FwdHVyZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICBjYXB0dXJlZF9tZXNzYWdlc18ucHVzaF9iYWNrKAorICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwICQxOiQyOiAkMyIsCisgICAgICBpbXBsaWNpdF9jYXN0PGludD4obGV2ZWwpLCBmaWxlbmFtZSwgbGluZSwgbWVzc2FnZSkpOworfQorCitURVNUKExvZ2dpbmdUZXN0LCBEZWZhdWx0TG9nZ2luZykgeworICBDYXB0dXJlVGVzdFN0ZGVycigpOworICBpbnQgbGluZSA9IF9fTElORV9fOworICBHT09HTEVfTE9HKElORk8gICApIDw8ICJBIG1lc3NhZ2UuIjsKKyAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiQSB3YXJuaW5nLiI7CisgIEdPT0dMRV9MT0coRVJST1IgICkgPDwgIkFuIGVycm9yLiI7CisKKyAgc3RyaW5nIHRleHQgPSBHZXRDYXB0dXJlZFRlc3RTdGRlcnIoKTsKKyAgRVhQRUNUX0VRKAorICAgICJbbGlicHJvdG9idWYgSU5GTyAiX19GSUxFX18iOiIgKyBTaW1wbGVJdG9hKGxpbmUgKyAxKSArICJdIEEgbWVzc2FnZS5cbiIKKyAgICAiW2xpYnByb3RvYnVmIFdBUk5JTkcgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lICsgMikgKyAiXSBBIHdhcm5pbmcuXG4iCisgICAgIltsaWJwcm90b2J1ZiBFUlJPUiAiX19GSUxFX18iOiIgKyBTaW1wbGVJdG9hKGxpbmUgKyAzKSArICJdIEFuIGVycm9yLlxuIiwKKyAgICB0ZXh0KTsKK30KKworVEVTVChMb2dnaW5nVGVzdCwgTnVsbExvZ2dpbmcpIHsKKyAgTG9nSGFuZGxlciogb2xkX2hhbmRsZXIgPSBTZXRMb2dIYW5kbGVyKE5VTEwpOworCisgIENhcHR1cmVUZXN0U3RkZXJyKCk7CisgIEdPT0dMRV9MT0coSU5GTyAgICkgPDwgIkEgbWVzc2FnZS4iOworICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJBIHdhcm5pbmcuIjsKKyAgR09PR0xFX0xPRyhFUlJPUiAgKSA8PCAiQW4gZXJyb3IuIjsKKworICBFWFBFQ1RfVFJVRShTZXRMb2dIYW5kbGVyKG9sZF9oYW5kbGVyKSA9PSBOVUxMKTsKKworICBzdHJpbmcgdGV4dCA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworICBFWFBFQ1RfRVEoIiIsIHRleHQpOworfQorCitURVNUKExvZ2dpbmdUZXN0LCBDYXB0dXJlTG9nZ2luZykgeworICBjYXB0dXJlZF9tZXNzYWdlc18uY2xlYXIoKTsKKworICBMb2dIYW5kbGVyKiBvbGRfaGFuZGxlciA9IFNldExvZ0hhbmRsZXIoJkNhcHR1cmVMb2cpOworCisgIGludCBzdGFydF9saW5lID0gX19MSU5FX187CisgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJBbiBlcnJvci4iOworICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJBIHdhcm5pbmcuIjsKKworICBFWFBFQ1RfVFJVRShTZXRMb2dIYW5kbGVyKG9sZF9oYW5kbGVyKSA9PSAmQ2FwdHVyZUxvZyk7CisKKyAgQVNTRVJUX0VRKDIsIGNhcHR1cmVkX21lc3NhZ2VzXy5zaXplKCkpOworICBFWFBFQ1RfRVEoCisgICAgIjIgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShzdGFydF9saW5lICsgMSkgKyAiOiBBbiBlcnJvci4iLAorICAgIGNhcHR1cmVkX21lc3NhZ2VzX1swXSk7CisgIEVYUEVDVF9FUSgKKyAgICAiMSAiX19GSUxFX18iOiIgKyBTaW1wbGVJdG9hKHN0YXJ0X2xpbmUgKyAyKSArICI6IEEgd2FybmluZy4iLAorICAgIGNhcHR1cmVkX21lc3NhZ2VzX1sxXSk7Cit9CisKK1RFU1QoTG9nZ2luZ1Rlc3QsIFNpbGVuY2VMb2dnaW5nKSB7CisgIGNhcHR1cmVkX21lc3NhZ2VzXy5jbGVhcigpOworCisgIExvZ0hhbmRsZXIqIG9sZF9oYW5kbGVyID0gU2V0TG9nSGFuZGxlcigmQ2FwdHVyZUxvZyk7CisKKyAgaW50IGxpbmUxID0gX19MSU5FX187IEdPT0dMRV9MT0coSU5GTykgPDwgIlZpc2libGUxIjsKKyAgTG9nU2lsZW5jZXIqIHNpbGVuY2VyMSA9IG5ldyBMb2dTaWxlbmNlcjsKKyAgR09PR0xFX0xPRyhJTkZPKSA8PCAiTm90IHZpc2libGUuIjsKKyAgTG9nU2lsZW5jZXIqIHNpbGVuY2VyMiA9IG5ldyBMb2dTaWxlbmNlcjsKKyAgR09PR0xFX0xPRyhJTkZPKSA8PCAiTm90IHZpc2libGUuIjsKKyAgZGVsZXRlIHNpbGVuY2VyMTsKKyAgR09PR0xFX0xPRyhJTkZPKSA8PCAiTm90IHZpc2libGUuIjsKKyAgZGVsZXRlIHNpbGVuY2VyMjsKKyAgaW50IGxpbmUyID0gX19MSU5FX187IEdPT0dMRV9MT0coSU5GTykgPDwgIlZpc2libGUyIjsKKworICBFWFBFQ1RfVFJVRShTZXRMb2dIYW5kbGVyKG9sZF9oYW5kbGVyKSA9PSAmQ2FwdHVyZUxvZyk7CisKKyAgQVNTRVJUX0VRKDIsIGNhcHR1cmVkX21lc3NhZ2VzXy5zaXplKCkpOworICBFWFBFQ1RfRVEoCisgICAgIjAgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lMSkgKyAiOiBWaXNpYmxlMSIsCisgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzBdKTsKKyAgRVhQRUNUX0VRKAorICAgICIwICJfX0ZJTEVfXyI6IiArIFNpbXBsZUl0b2EobGluZTIpICsgIjogVmlzaWJsZTIiLAorICAgIGNhcHR1cmVkX21lc3NhZ2VzX1sxXSk7Cit9CisKK2NsYXNzIENsb3N1cmVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdm9pZCBTZXRBMTIzTWV0aG9kKCkgICB7IGFfID0gMTIzOyB9CisgIHN0YXRpYyB2b2lkIFNldEExMjNGdW5jdGlvbigpIHsgY3VycmVudF9pbnN0YW5jZV8tPmFfID0gMTIzOyB9CisKKyAgdm9pZCBTZXRBTWV0aG9kKGludCBhKSAgICAgICAgIHsgYV8gPSBhOyB9CisgIHZvaWQgU2V0Q01ldGhvZChzdHJpbmcgYykgICAgICB7IGNfID0gYzsgfQorCisgIHN0YXRpYyB2b2lkIFNldEFGdW5jdGlvbihpbnQgYSkgICAgICAgICB7IGN1cnJlbnRfaW5zdGFuY2VfLT5hXyA9IGE7IH0KKyAgc3RhdGljIHZvaWQgU2V0Q0Z1bmN0aW9uKHN0cmluZyBjKSAgICAgIHsgY3VycmVudF9pbnN0YW5jZV8tPmNfID0gYzsgfQorCisgIHZvaWQgU2V0QUJNZXRob2QoaW50IGEsIGNvbnN0IGNoYXIqIGIpICB7IGFfID0gYTsgYl8gPSBiOyB9CisgIHN0YXRpYyB2b2lkIFNldEFCRnVuY3Rpb24oaW50IGEsIGNvbnN0IGNoYXIqIGIpIHsKKyAgICBjdXJyZW50X2luc3RhbmNlXy0+YV8gPSBhOworICAgIGN1cnJlbnRfaW5zdGFuY2VfLT5iXyA9IGI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgY3VycmVudF9pbnN0YW5jZV8gPSB0aGlzOworICAgIGFfID0gMDsKKyAgICBiXyA9IE5VTEw7CisgICAgY18uY2xlYXIoKTsKKyAgICBwZXJtYW5lbnRfY2xvc3VyZV8gPSBOVUxMOworICB9CisKKyAgdm9pZCBEZWxldGVDbG9zdXJlSW5DYWxsYmFjaygpIHsKKyAgICBkZWxldGUgcGVybWFuZW50X2Nsb3N1cmVfOworICB9CisKKyAgaW50IGFfOworICBjb25zdCBjaGFyKiBiXzsKKyAgc3RyaW5nIGNfOworICBDbG9zdXJlKiBwZXJtYW5lbnRfY2xvc3VyZV87CisKKyAgc3RhdGljIENsb3N1cmVUZXN0KiBjdXJyZW50X2luc3RhbmNlXzsKK307CisKK0Nsb3N1cmVUZXN0KiBDbG9zdXJlVGVzdDo6Y3VycmVudF9pbnN0YW5jZV8gPSBOVUxMOworCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlRnVuY3Rpb24wKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjaygmU2V0QTEyM0Z1bmN0aW9uKTsKKyAgRVhQRUNUX05FKDEyMywgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDEyMywgYV8pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMCkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soY3VycmVudF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xvc3VyZVRlc3Q6OlNldEExMjNNZXRob2QpOworICBFWFBFQ1RfTkUoMTIzLCBhXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoMTIzLCBhXyk7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVGdW5jdGlvbjEpIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKCZTZXRBRnVuY3Rpb24sIDQ1Nik7CisgIEVYUEVDVF9ORSg0NTYsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg0NTYsIGFfKTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZU1ldGhvZDEpIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBTWV0aG9kLCA0NTYpOworICBFWFBFQ1RfTkUoNDU2LCBhXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNDU2LCBhXyk7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVGdW5jdGlvbjFTdHJpbmcpIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKCZTZXRDRnVuY3Rpb24sIHN0cmluZygidGVzdCIpKTsKKyAgRVhQRUNUX05FKCJ0ZXN0IiwgY18pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0IiwgY18pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMVN0cmluZykgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soY3VycmVudF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xvc3VyZVRlc3Q6OlNldENNZXRob2QsIHN0cmluZygidGVzdCIpKTsKKyAgRVhQRUNUX05FKCJ0ZXN0IiwgY18pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0IiwgY18pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlRnVuY3Rpb24yKSB7CisgIGNvbnN0IGNoYXIqIGNzdHIgPSAiaGVsbG8iOworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soJlNldEFCRnVuY3Rpb24sIDc4OSwgY3N0cik7CisgIEVYUEVDVF9ORSg3ODksIGFfKTsKKyAgRVhQRUNUX05FKGNzdHIsIGJfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg3ODksIGFfKTsKKyAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZU1ldGhvZDIpIHsKKyAgY29uc3QgY2hhciogY3N0ciA9ICJoZWxsbyI7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QUJNZXRob2QsIDc4OSwgY3N0cik7CisgIEVYUEVDVF9ORSg3ODksIGFfKTsKKyAgRVhQRUNUX05FKGNzdHIsIGJfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg3ODksIGFfKTsKKyAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKK30KKworLy8gUmVwZWF0IGFsbCBvZiB0aGUgYWJvdmUgd2l0aCBOZXdQZXJtYW5lbnRDYWxsYmFjaygpCisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVGdW5jdGlvbjApIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKCZTZXRBMTIzRnVuY3Rpb24pOworICBFWFBFQ1RfTkUoMTIzLCBhXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoMTIzLCBhXyk7CisgIGFfID0gMDsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSgxMjMsIGFfKTsKKyAgZGVsZXRlIGNsb3N1cmU7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVNZXRob2QwKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QTEyM01ldGhvZCk7CisgIEVYUEVDVF9ORSgxMjMsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSgxMjMsIGFfKTsKKyAgYV8gPSAwOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDEyMywgYV8pOworICBkZWxldGUgY2xvc3VyZTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZUZ1bmN0aW9uMSkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soJlNldEFGdW5jdGlvbiwgNDU2KTsKKyAgRVhQRUNUX05FKDQ1NiwgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDQ1NiwgYV8pOworICBhXyA9IDA7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNDU2LCBhXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlTWV0aG9kMSkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soY3VycmVudF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xvc3VyZVRlc3Q6OlNldEFNZXRob2QsIDQ1Nik7CisgIEVYUEVDVF9ORSg0NTYsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg0NTYsIGFfKTsKKyAgYV8gPSAwOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDQ1NiwgYV8pOworICBkZWxldGUgY2xvc3VyZTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZUZ1bmN0aW9uMikgeworICBjb25zdCBjaGFyKiBjc3RyID0gImhlbGxvIjsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKCZTZXRBQkZ1bmN0aW9uLCA3ODksIGNzdHIpOworICBFWFBFQ1RfTkUoNzg5LCBhXyk7CisgIEVYUEVDVF9ORShjc3RyLCBiXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNzg5LCBhXyk7CisgIEVYUEVDVF9FUShjc3RyLCBiXyk7CisgIGFfID0gMDsKKyAgYl8gPSBOVUxMOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDc4OSwgYV8pOworICBFWFBFQ1RfRVEoY3N0ciwgYl8pOworICBkZWxldGUgY2xvc3VyZTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZU1ldGhvZDIpIHsKKyAgY29uc3QgY2hhciogY3N0ciA9ICJoZWxsbyI7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QUJNZXRob2QsIDc4OSwgY3N0cik7CisgIEVYUEVDVF9ORSg3ODksIGFfKTsKKyAgRVhQRUNUX05FKGNzdHIsIGJfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg3ODksIGFfKTsKKyAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKKyAgYV8gPSAwOworICBiXyA9IE5VTEw7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNzg5LCBhXyk7CisgIEVYUEVDVF9FUShjc3RyLCBiXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlRGVsZXRlSW5DYWxsYmFjaykgeworICBwZXJtYW5lbnRfY2xvc3VyZV8gPSBOZXdQZXJtYW5lbnRDYWxsYmFjaygoQ2xvc3VyZVRlc3QqKSB0aGlzLAorICAgICAgJkNsb3N1cmVUZXN0OjpEZWxldGVDbG9zdXJlSW5DYWxsYmFjayk7CisgIHBlcm1hbmVudF9jbG9zdXJlXy0+UnVuKCk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMTA3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBEZWFscyB3aXRoIHRoZSBmYWN0IHRoYXQgaGFzaF9tYXAgaXMgbm90IGRlZmluZWQgZXZlcnl3aGVyZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfSEFTSF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0hBU0hfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKEhBVkVfSEFTSF9NQVApICYmIGRlZmluZWQoSEFWRV9IQVNIX1NFVCkKKyNpbmNsdWRlIEhBU0hfTUFQX0gKKyNpbmNsdWRlIEhBU0hfU0VUX0gKKyNlbHNlCisjZGVmaW5lIE1JU1NJTkdfSEFTSAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgTUlTU0lOR19IQVNICisKKy8vIFRoaXMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBoYXNoX21hcCBvciBoYXNoX3NldC4gIEVtdWxhdGUgdGhlbSB1c2luZyBtYXAgYW5kCisvLyBzZXQuCisKKy8vIE1ha2UgaGFzaDxUPiBiZSB0aGUgc2FtZSBhcyBsZXNzPFQ+LiAgTm90ZSB0aGF0IGV2ZXJ5d2hlcmUgd2hlcmUgY3VzdG9tCisvLyBoYXNoIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgcHJvdG9idWYgY29kZSwgdGhleSBhcmUgYWxzbyBkZWZpbmVkIHN1Y2gKKy8vIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhcyAibGVzcyIgZnVuY3Rpb25zLCB3aGljaCBpcyByZXF1aXJlZCBieSBNU1ZDIGFueXdheS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitzdHJ1Y3QgaGFzaCB7CisgIC8vIER1bW15LCBqdXN0IHRvIG1ha2UgZGVyaXZhdGl2ZSBoYXNoIGZ1bmN0aW9ucyBjb21waWxlLgorICBpbnQgb3BlcmF0b3IoKShjb25zdCBLZXkmIGtleSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJTaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEtleSYgYSwgY29uc3QgS2V5JiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEgPCBiOworICB9Cit9OworCisvLyBNYWtlIHN1cmUgY2hhciogaXMgY29tcGFyZWQgYnkgdmFsdWUuCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8Y29uc3QgY2hhcio+IHsKKyAgLy8gRHVtbXksIGp1c3QgdG8gbWFrZSBkZXJpdmF0aXZlIGhhc2ggZnVuY3Rpb25zIGNvbXBpbGUuCisgIGludCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGtleSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJTaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiI7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGEsIGNvbnN0IGNoYXIqIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY21wKGEsIGIpIDwgMDsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gaW50ID4KK2NsYXNzIGhhc2hfbWFwIDogcHVibGljIHN0ZDo6bWFwPEtleSwgRGF0YSwgSGFzaEZjbj4geworIHB1YmxpYzoKKyAgaGFzaF9tYXAoaW50ID0gMCkge30KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksCisgICAgICAgICAgdHlwZW5hbWUgSGFzaEZjbiA9IGhhc2g8S2V5PiwKKyAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IGludCA+CitjbGFzcyBoYXNoX3NldCA6IHB1YmxpYyBzdGQ6OnNldDxLZXksIEhhc2hGY24+IHsKKyBwdWJsaWM6CisgIGhhc2hfc2V0KGludCA9IDApIHt9Cit9OworCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfU1RMUE9SVF9WRVJTSU9OKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgorc3RydWN0IGhhc2ggOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2hfY29tcGFyZTxLZXk+IHsKK307CisKKy8vIE1TVkMncyBoYXNoX2NvbXBhcmU8Y29uc3QgY2hhcio+IGhhc2hlcyBiYXNlZCBvbiB0aGUgc3RyaW5nIGNvbnRlbnRzIGJ1dAorLy8gY29tcGFyZXMgYmFzZWQgb24gdGhlIHN0cmluZyBwb2ludGVyLiAgV1RGPworY2xhc3MgQ3N0cmluZ0xlc3MgeworIHB1YmxpYzoKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBhLCBjb25zdCBjaGFyKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNtcChhLCBiKSA8IDA7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxjb25zdCBjaGFyKj4KKyAgOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2hfY29tcGFyZTxjb25zdCBjaGFyKiwgQ3N0cmluZ0xlc3M+IHsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIERhdGEsCisgICAgICAgICAgdHlwZW5hbWUgSGFzaEZjbiA9IGhhc2g8S2V5PiwKKyAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IGludCA+CitjbGFzcyBoYXNoX21hcCA6IHB1YmxpYyBIQVNIX05BTUVTUEFDRTo6aGFzaF9tYXA8CisgICAgS2V5LCBEYXRhLCBIYXNoRmNuPiB7CisgcHVibGljOgorICBoYXNoX21hcChpbnQgPSAwKSB7fQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gaW50ID4KK2NsYXNzIGhhc2hfc2V0IDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpoYXNoX3NldDwKKyAgICBLZXksIEhhc2hGY24+IHsKKyBwdWJsaWM6CisgIGhhc2hfc2V0KGludCA9IDApIHt9Cit9OworCisjZWxzZQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgorc3RydWN0IGhhc2ggOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2g8S2V5PiB7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgorc3RydWN0IGhhc2g8Y29uc3QgS2V5Kj4geworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgS2V5KiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGtleSk7CisgIH0KK307CisKKy8vIFVubGlrZSB0aGUgb2xkIFNHSSB2ZXJzaW9uLCB0aGUgVFIxICJoYXNoIiBkb2VzIG5vdCBzcGVjaWFsLWNhc2UgY2hhciouICBTbywKKy8vIHdlIGdvIGFoZWFkIGFuZCBwcm92aWRlIG91ciBvd24gaW1wbGVtZW50YXRpb24uCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8Y29uc3QgY2hhcio+IHsKKyAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHN0cikgY29uc3QgeworICAgIHNpemVfdCByZXN1bHQgPSAwOworICAgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKSB7CisgICAgICByZXN1bHQgPSA1ICogcmVzdWx0ICsgKnN0cjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+ID4KK2NsYXNzIGhhc2hfbWFwIDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpIQVNIX01BUF9DTEFTUzwKKyAgICBLZXksIERhdGEsIEhhc2hGY24sIEVxdWFsS2V5PiB7CisgcHVibGljOgorICBoYXNoX21hcChpbnQgPSAwKSB7fQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+ID4KK2NsYXNzIGhhc2hfc2V0IDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpIQVNIX1NFVF9DTEFTUzwKKyAgICBLZXksIEhhc2hGY24sIEVxdWFsS2V5PiB7CisgcHVibGljOgorICBoYXNoX3NldChpbnQgPSAwKSB7fQorfTsKKworI2VuZGlmCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxzdHJpbmc+IHsKKyAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGhhc2g8Y29uc3QgY2hhcio+KCkoa2V5LmNfc3RyKCkpOworICB9CisKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBidWNrZXRfc2l6ZSA9IDQ7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgbWluX2J1Y2tldHMgPSA4OworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJiBhLCBjb25zdCBzdHJpbmcmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYSA8IGI7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUgU2Vjb25kPgorc3RydWN0IGhhc2g8cGFpcjxGaXJzdCwgU2Vjb25kPiA+IHsKKyAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHBhaXI8Rmlyc3QsIFNlY29uZD4mIGtleSkgY29uc3QgeworICAgIHNpemVfdCBmaXJzdF9oYXNoID0gaGFzaDxGaXJzdD4oKShrZXkuZmlyc3QpOworICAgIHNpemVfdCBzZWNvbmRfaGFzaCA9IGhhc2g8U2Vjb25kPigpKGtleS5zZWNvbmQpOworCisgICAgLy8gRklYTUUoa2VudG9uKTogIFdoYXQgaXMgdGhlIGJlc3Qgd2F5IHRvIGNvbXB1dGUgdGhpcyBoYXNoPyAgSSBoYXZlCisgICAgLy8gbm8gaWRlYSEgIFRoaXMgc2VlbXMgYSBiaXQgYmV0dGVyIHRoYW4gYW4gWE9SLgorICAgIHJldHVybiBmaXJzdF9oYXNoICogKCgxIDw8IDE2KSAtIDEpICsgc2Vjb25kX2hhc2g7CisgIH0KKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGJ1Y2tldF9zaXplID0gNDsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBtaW5fYnVja2V0cyA9IDg7CisgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBwYWlyPEZpcnN0LCBTZWNvbmQ+JiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpcjxGaXJzdCwgU2Vjb25kPiYgYikgY29uc3QgeworICAgIHJldHVybiBhIDwgYjsKKyAgfQorfTsKKworLy8gVXNlZCBieSBHQ0MvU0dJIFNUTCBvbmx5LiAgKFdoeSBpc24ndCB0aGlzIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZAorLy8gbGlicmFyeT8gIDooICkKK3N0cnVjdCBzdHJlcSB7CisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogYSwgY29uc3QgY2hhciogYikgY29uc3QgeworICAgIHJldHVybiBzdHJjbXAoYSwgYikgPT0gMDsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX0hBU0hfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTg0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaApAQCAtMCwwICsxLDE0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gZnJvbSBnb29nbGUzL3V0aWwvZ3RsL21hcC11dGlsLmgKKy8vIEF1dGhvcjogQW50b24gQ2FydmVyCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX01BUF9VVElMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfTUFQX1VUSUxfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gUGVyZm9ybSBhIGxvb2t1cCBpbiBhIG1hcCBvciBoYXNoX21hcC4KKy8vIElmIHRoZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgbWFwIHRoZW4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGF0CisvLyBrZXkgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgcGFzc2VkIGFzIGEgZGVmYXVsdCBpcyByZXR1cm5lZC4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgorY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmCitGaW5kV2l0aERlZmF1bHQoY29uc3QgQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXksCisgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmIHZhbHVlKSB7CisgIHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5maW5kKGtleSk7CisgIGlmIChpdCA9PSBjb2xsZWN0aW9uLmVuZCgpKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisgIHJldHVybiBpdC0+c2Vjb25kOworfQorCisvLyBQZXJmb3JtIGEgbG9va3VwIGluIGEgbWFwIG9yIGhhc2hfbWFwLgorLy8gSWYgdGhlIGtleSBpcyBwcmVzZW50IGEgY29uc3QgcG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyByZXR1cm5lZCwKKy8vIG90aGVyd2lzZSBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgorY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUqCitGaW5kT3JOdWxsKGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24sCisgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSkgeworICB0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uZmluZChrZXkpOworICBpZiAoaXQgPT0gY29sbGVjdGlvbi5lbmQoKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAmaXQtPnNlY29uZDsKK30KKworLy8gUGVyZm9ybSBhIGxvb2t1cCBpbiBhIG1hcCBvciBoYXNoX21hcCwgYXNzdW1pbmcgdGhhdCB0aGUga2V5IGV4aXN0cy4KKy8vIENyYXNoIGlmIGl0IGRvZXMgbm90LgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZXBsYWNlbWVudCBmb3Igb3BlcmF0b3JbXSBhcyBhbiBydmFsdWUgKGZvciByZWFkaW5nKQorLy8gd2hlbiB0aGUga2V5IGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QuCisvLworLy8gb3BlcmF0b3JbXSBpcyBkaXNjb3VyYWdlZCBmb3Igc2V2ZXJhbCByZWFzb25zOgorLy8gICogSXQgaGFzIGEgc2lkZS1lZmZlY3Qgb2YgaW5zZXJ0aW5nIG1pc3Npbmcga2V5cworLy8gICogSXQgaXMgbm90IHRocmVhZC1zYWZlIChldmVuIHdoZW4gaXQgaXMgbm90IGluc2VydGluZywgaXQgY2FuIHN0aWxsCisvLyAgICAgIGNob29zZSB0byByZXNpemUgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSkKKy8vICAqIEl0IGludmFsaWRhdGVzIGl0ZXJhdG9ycyAod2hlbiBpdCBjaG9vc2VzIHRvIHJlc2l6ZSkKKy8vICAqIEl0IGRlZmF1bHQgY29uc3RydWN0cyBhIHZhbHVlIG9iamVjdCBldmVuIGlmIGl0IGRvZXNuJ3QgbmVlZCB0bworLy8KKy8vIFRoaXMgdmVyc2lvbiBhc3N1bWVzIHRoZSBrZXkgaXMgcHJpbnRhYmxlLCBhbmQgaW5jbHVkZXMgaXQgaW4gdGhlIGZhdGFsIGxvZworLy8gbWVzc2FnZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgorY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmCitGaW5kT3JEaWUoY29uc3QgQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwKKyAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKKyAgR09PR0xFX0NIRUNLKGl0ICE9IGNvbGxlY3Rpb24uZW5kKCkpIDw8ICJNYXAga2V5IG5vdCBmb3VuZDogIiA8PCBrZXk7CisgIHJldHVybiBpdC0+c2Vjb25kOworfQorCisvLyBQZXJmb3JtIGEgbG9va3VwIGluIGEgbWFwIG9yIGhhc2hfbWFwIHdob3NlIHZhbHVlcyBhcmUgcG9pbnRlcnMuCisvLyBJZiB0aGUga2V5IGlzIHByZXNlbnQgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHJldHVybmVkLAorLy8gb3RoZXJ3aXNlIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgorLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWlzc2luZyBrZXkgYW5kIGEga2V5IG1hcHBlZAorLy8gdG8gYSBOVUxMIHZhbHVlLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZQorRmluZFB0ck9yTnVsbChjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKKyAgaWYgKGl0ID09IGNvbGxlY3Rpb24uZW5kKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworLy8gQ2hhbmdlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGtleSBpbiBhIG1hcCBvciBoYXNoX21hcC4KKy8vIElmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1hcCB0aGUga2V5IGFuZCB2YWx1ZSBhcmUgaW5zZXJ0ZWQsCisvLyBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYmUgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZC4KKy8vIFRydWUgaW5kaWNhdGVzIHRoYXQgYW4gaW5zZXJ0IHRvb2sgcGxhY2UsIGZhbHNlIGluZGljYXRlcyBhbiB1cGRhdGUuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KK2Jvb2wgSW5zZXJ0T3JVcGRhdGUoQ29sbGVjdGlvbiAqIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBrZXksIGNvbnN0IFZhbHVlJiB2YWx1ZSkgeworICBwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKKyAgaWYgKCFyZXQuc2Vjb25kKSB7CisgICAgLy8gdXBkYXRlCisgICAgcmV0LmZpcnN0LT5zZWNvbmQgPSB2YWx1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEluc2VydCBhIG5ldyBrZXkgYW5kIHZhbHVlIGludG8gYSBtYXAgb3IgaGFzaF9tYXAuCisvLyBJZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBtYXAgdGhlIGtleSBhbmQgdmFsdWUgYXJlCisvLyBpbnNlcnRlZCwgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucy4gVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBhbiBpbnNlcnQKKy8vIHRvb2sgcGxhY2UsIGZhbHNlIGluZGljYXRlcyB0aGUga2V5IHdhcyBhbHJlYWR5IHByZXNlbnQuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KK2Jvb2wgSW5zZXJ0SWZOb3RQcmVzZW50KENvbGxlY3Rpb24gKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBrZXksIGNvbnN0IFZhbHVlJiB2YWx1ZSkgeworICBwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKKyAgcmV0dXJuIHJldC5zZWNvbmQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19NQVBfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyNGI4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBlbXVsYXRlcyBnb29nbGUzL2Jhc2Uvb25jZS5oCisvLworLy8gVGhpcyBoZWFkZXIgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgb25seSBieSBpbnRlcm5hbCAuY2MgZmlsZXMgYW5kCisvLyBnZW5lcmF0ZWQgLnBiLmNjIGZpbGVzLiAgVXNlcnMgc2hvdWxkIG5vdCB1c2UgdGhpcyBkaXJlY3RseS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2NoZWRZaWVsZCgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgU2xlZXAoMCk7CisjZWxzZSAgLy8gUE9TSVgKKyAgc2NoZWRfeWllbGQoKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBHb29nbGVPbmNlSW5pdEltcGwoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgQ2xvc3VyZSogY2xvc3VyZSkgeworICBpbnRlcm5hbDo6QXRvbWljV29yZCBzdGF0ZSA9IGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSk7CisgIC8vIEZhc3QgcGF0aC4gVGhlIHByb3ZpZGVkIGNsb3N1cmUgd2FzIGFscmVhZHkgZXhlY3V0ZWQuCisgIGlmIChzdGF0ZSA9PSBPTkNFX1NUQVRFX0RPTkUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gVGhlIGNsb3N1cmUgZXhlY3V0aW9uIGRpZCBub3QgY29tcGxldGUgeWV0LiBUaGUgb25jZSBvYmplY3QgY2FuIGJlIGluIG9uZQorICAvLyBvZiB0aGUgdHdvIGZvbGxvd2luZyBzdGF0ZXM6CisgIC8vICAgLSBVTklOSVRJQUxJWkVEOiBXZSBhcmUgdGhlIGZpcnN0IHRocmVhZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgIC8vICAgLSBFWEVDVVRJTkdfQ0xPU1VSRTogQW5vdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBleGVjdXRpbmcgdGhlIGNsb3N1cmUuCisgIC8vCisgIC8vIEZpcnN0LCB0cnkgdG8gY2hhbmdlIHRoZSBzdGF0ZSBmcm9tIFVOSU5JVElBTElaRUQgdG8gRVhFQ1VUSU5HX0NMT1NVUkUKKyAgLy8gYXRvbWljYWxseS4KKyAgc3RhdGUgPSBpbnRlcm5hbDo6QWNxdWlyZV9Db21wYXJlQW5kU3dhcCgKKyAgICAgIG9uY2UsIE9OQ0VfU1RBVEVfVU5JTklUSUFMSVpFRCwgT05DRV9TVEFURV9FWEVDVVRJTkdfQ0xPU1VSRSk7CisgIGlmIChzdGF0ZSA9PSBPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAvLyBXZSBhcmUgdGhlIGZpcnN0IHRocmVhZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gY2FsbCB0aGUKKyAgICAvLyBjbG9zdXJlLgorICAgIGNsb3N1cmUtPlJ1bigpOworICAgIGludGVybmFsOjpSZWxlYXNlX1N0b3JlKG9uY2UsIE9OQ0VfU1RBVEVfRE9ORSk7CisgIH0gZWxzZSB7CisgICAgLy8gQW5vdGhlciB0aHJlYWQgaGFzIGFscmVhZHkgc3RhcnRlZCBleGVjdXRpbmcgdGhlIGNsb3N1cmUuIFdlIG5lZWQgdG8KKyAgICAvLyB3YWl0IHVudGlsIGl0IGNvbXBsZXRlcyB0aGUgaW5pdGlhbGl6YXRpb24uCisgICAgd2hpbGUgKHN0YXRlID09IE9OQ0VfU1RBVEVfRVhFQ1VUSU5HX0NMT1NVUkUpIHsKKyAgICAgIC8vIE5vdGUgdGhhdCBmdXRleCgpIGNvdWxkIGJlIHVzZWQgaGVyZSBvbiBMaW51eCBhcyBhbiBpbXByb3ZlbWVudC4KKyAgICAgIFNjaGVkWWllbGQoKTsKKyAgICAgIHN0YXRlID0gaW50ZXJuYWw6OkFjcXVpcmVfTG9hZChvbmNlKTsKKyAgICB9CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmMxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL29uY2UuaAorLy8KKy8vIFRoaXMgaGVhZGVyIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIG9ubHkgYnkgaW50ZXJuYWwgLmNjIGZpbGVzIGFuZAorLy8gZ2VuZXJhdGVkIC5wYi5jYyBmaWxlcy4gIFVzZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgZGlyZWN0bHkuCisvLworLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSBwb3J0YWJsZSB2ZXJzaW9uIG9mIHB0aHJlYWRfb25jZSgpLgorLy8KKy8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzOgorLy8gKiBBIHR5cGUgY2FsbGVkIFByb3RvYnVmT25jZVR5cGUuCisvLyAqIEEgbWFjcm8gR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRSgpIHdoaWNoIGRlY2xhcmVzIGEgdmFyaWFibGUgb2YgdHlwZQorLy8gICBQcm90b2J1Zk9uY2VUeXBlLiAgVGhpcyBpcyB0aGUgb25seSBsZWdhbCB3YXkgdG8gZGVjbGFyZSBzdWNoIGEgdmFyaWFibGUuCisvLyAgIFRoZSBtYWNybyBtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBnbG9iYWwgc2NvcGUgKHlvdSBjYW5ub3QgY3JlYXRlIGxvY2FsIG9yCisvLyAgIGNsYXNzIG1lbWJlciB2YXJpYWJsZXMgb2YgdGhpcyB0eXBlKS4KKy8vICogQSBmdW5jdGlvbiBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKSgpKS4KKy8vICAgVGhpcyBmdW5jdGlvbiwgd2hlbiBpbnZva2VkIG11bHRpcGxlIHRpbWVzIGdpdmVuIHRoZSBzYW1lIFByb3RvYnVmT25jZVR5cGUKKy8vICAgb2JqZWN0LCB3aWxsIGludm9rZSBpbml0X2Z1bmMgb24gdGhlIGZpcnN0IGNhbGwgb25seSwgYW5kIHdpbGwgbWFrZSBzdXJlCisvLyAgIG5vbmUgb2YgdGhlIGNhbGxzIHJldHVybiBiZWZvcmUgdGhhdCBmaXJzdCBjYWxsIHRvIGluaXRfZnVuYyBoYXMgZmluaXNoZWQuCisvLyAqIFRoZSB1c2VyIGNhbiBwcm92aWRlIGEgcGFyYW1ldGVyIHdoaWNoIEdvb2dsZU9uY2VJbml0KCkgZm9yd2FyZHMgdG8gdGhlCisvLyAgIHVzZXItcHJvdmlkZWQgZnVuY3Rpb24gd2hlbiBpdCBpcyBjYWxsZWQuIFVzYWdlIGV4YW1wbGU6CisvLyAgICAgaW50IGEgPSAxMDsKKy8vICAgICBHb29nbGVPbmNlSW5pdCgmbXlfb25jZSwgJk15RnVuY3Rpb25FeHBlY3RpbmdJbnRBcmd1bWVudCwgJmEpOworLy8gKiBUaGlzIGltcGxlbWVudGF0aW9uIGd1YXJhbnRlZXMgdGhhdCBQcm90b2J1Zk9uY2VUeXBlIGlzIGEgUE9EIChpLmUuIG5vCisvLyAgIHN0YXRpYyBpbml0aWFsaXplciBnZW5lcmF0ZWQpLgorLy8KKy8vIFRoaXMgaW1wbGVtZW50cyBhIHdheSB0byBwZXJmb3JtIGxhenkgaW5pdGlhbGl6YXRpb24uICBJdCdzIG1vcmUgZWZmaWNpZW50CisvLyB0aGFuIHVzaW5nIG11dGV4ZXMgYXMgbm8gbG9jayBpcyBuZWVkZWQgaWYgaW5pdGlhbGl6YXRpb24gaGFzIGFscmVhZHkKKy8vIGhhcHBlbmVkLgorLy8KKy8vIEV4YW1wbGUgdXNhZ2U6CisvLyAgIHZvaWQgSW5pdCgpOworLy8gICBHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKG9uY2VfaW5pdCk7CisvLworLy8gICAvLyBDYWxscyBJbml0KCkgZXhhY3RseSBvbmNlLgorLy8gICB2b2lkIEluaXRPbmNlKCkgeworLy8gICAgIEdvb2dsZU9uY2VJbml0KCZvbmNlX2luaXQsICZJbml0KTsKKy8vICAgfQorLy8KKy8vIE5vdGUgdGhhdCBpZiBHb29nbGVPbmNlSW5pdCgpIGlzIGNhbGxlZCBiZWZvcmUgbWFpbigpIGhhcyBiZWd1biwgaXQgbXVzdAorLy8gb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IHdpbGwgZXZlbnR1YWxseSBjYWxsIG1haW4oKSAtLSB0aGF0IGlzLAorLy8gdGhlIHRocmVhZCB0aGF0IHBlcmZvcm1zIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24uICBJbiBnZW5lcmFsIHRoaXMgaXMgYSBzYWZlCisvLyBhc3N1bXB0aW9uIHNpbmNlIHBlb3BsZSBkb24ndCB1c3VhbGx5IGNvbnN0cnVjdCB0aHJlYWRzIGJlZm9yZSBtYWluKCkgc3RhcnRzLAorLy8gYnV0IGl0IGlzIHRlY2huaWNhbGx5IG5vdCBndWFyYW50ZWVkLiAgVW5mb3J0dW5hdGVseSwgV2luMzIgcHJvdmlkZXMgbm8gd2F5CisvLyB3aGF0c29ldmVyIHRvIHN0YXRpY2FsbHktaW5pdGlhbGl6ZSBpdHMgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMsIHNvIG91cgorLy8gb25seSBjaG9pY2UgaXMgdG8gYXNzdW1lIHRoYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiBpcyBzaW5nbGUtdGhyZWFkZWQuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX09OQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19PTkNFX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKKwordHlwZWRlZiBib29sIFByb3RvYnVmT25jZVR5cGU7CisKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09OQ0VfSU5JVCBmYWxzZQorCitpbmxpbmUgdm9pZCBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKSgpKSB7CisgIGlmICghKm9uY2UpIHsKKyAgICAqb25jZSA9IHRydWU7CisgICAgaW5pdF9mdW5jKCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZz4KK2lubGluZSB2b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKEFyZyksCisgICAgQXJnIGFyZykgeworICBpZiAoISpvbmNlKSB7CisgICAgKm9uY2UgPSB0cnVlOworICAgIGluaXRfZnVuYyhhcmcpOworICB9Cit9CisKKyNlbHNlCisKK2VudW0geworICBPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQgPSAwLAorICBPTkNFX1NUQVRFX0VYRUNVVElOR19DTE9TVVJFID0gMSwKKyAgT05DRV9TVEFURV9ET05FID0gMgorfTsKKwordHlwZWRlZiBpbnRlcm5hbDo6QXRvbWljV29yZCBQcm90b2J1Zk9uY2VUeXBlOworCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PTkNFX0lOSVQgOjpnb29nbGU6OnByb3RvYnVmOjpPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQKKworTElCUFJPVE9CVUZfRVhQT1JUCit2b2lkIEdvb2dsZU9uY2VJbml0SW1wbChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCBDbG9zdXJlKiBjbG9zdXJlKTsKKworaW5saW5lIHZvaWQgR29vZ2xlT25jZUluaXQoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgdm9pZCAoKmluaXRfZnVuYykoKSkgeworICBpZiAoaW50ZXJuYWw6OkFjcXVpcmVfTG9hZChvbmNlKSAhPSBPTkNFX1NUQVRFX0RPTkUpIHsKKyAgICBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMCBmdW5jKGluaXRfZnVuYywgZmFsc2UpOworICAgIEdvb2dsZU9uY2VJbml0SW1wbChvbmNlLCAmZnVuYyk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZz4KK2lubGluZSB2b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKEFyZyopLAorICAgIEFyZyogYXJnKSB7CisgIGlmIChpbnRlcm5hbDo6QWNxdWlyZV9Mb2FkKG9uY2UpICE9IE9OQ0VfU1RBVEVfRE9ORSkgeworICAgIGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUxPEFyZyo+IGZ1bmMoaW5pdF9mdW5jLCBmYWxzZSwgYXJnKTsKKyAgICBHb29nbGVPbmNlSW5pdEltcGwob25jZSwgJmZ1bmMpOworICB9Cit9CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKKworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKE5BTUUpIFwKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpQcm90b2J1Zk9uY2VUeXBlIE5BTUUgPSBHT09HTEVfUFJPVE9CVUZfT05DRV9JTklUCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19PTkNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY4NmEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyNTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgeworCitjbGFzcyBPbmNlSW5pdFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgeworICAgIHN0YXRlXyA9IElOSVRfTk9UX1NUQVJURUQ7CisgICAgY3VycmVudF90ZXN0XyA9IHRoaXM7CisgIH0KKworICAvLyBTaW5jZSBQcm90b2J1Zk9uY2VUeXBlIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBhbGxvY2F0ZWQgaW4gc3RhdGljIHN0b3JhZ2UsCisgIC8vIGVhY2ggdGVzdCBtdXN0IHVzZSBhIGRpZmZlcmVudCBwYWlyIG9mIFByb3RvYnVmT25jZVR5cGUgb2JqZWN0cyB3aGljaCBpdAorICAvLyBtdXN0IGRlY2xhcmUgaXRzZWxmLgorICB2b2lkIFNldE9uY2VzKFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIFByb3RvYnVmT25jZVR5cGUqIHJlY3Vyc2l2ZV9vbmNlKSB7CisgICAgb25jZV8gPSBvbmNlOworICAgIHJlY3Vyc2l2ZV9vbmNlXyA9IHJlY3Vyc2l2ZV9vbmNlOworICB9CisKKyAgdm9pZCBJbml0T25jZSgpIHsKKyAgICBHb29nbGVPbmNlSW5pdChvbmNlXywgJkluaXRTdGF0aWMpOworICB9CisgIHZvaWQgSW5pdFJlY3Vyc2l2ZU9uY2UoKSB7CisgICAgR29vZ2xlT25jZUluaXQocmVjdXJzaXZlX29uY2VfLCAmSW5pdFJlY3Vyc2l2ZVN0YXRpYyk7CisgIH0KKworICB2b2lkIEJsb2NrSW5pdCgpIHsgaW5pdF9ibG9ja2VyXy5Mb2NrKCk7IH0KKyAgdm9pZCBVbmJsb2NrSW5pdCgpIHsgaW5pdF9ibG9ja2VyXy5VbmxvY2soKTsgfQorCisgIGNsYXNzIFRlc3RUaHJlYWQgeworICAgcHVibGljOgorICAgIFRlc3RUaHJlYWQoQ2xvc3VyZSogY2FsbGJhY2spCisgICAgICAgIDogZG9uZV8oZmFsc2UpLCBqb2luZWRfKGZhbHNlKSwgY2FsbGJhY2tfKGNhbGxiYWNrKSB7CisjaWZkZWYgX1dJTjMyCisgICAgICB0aHJlYWRfID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsICZTdGFydCwgdGhpcywgMCwgTlVMTCk7CisjZWxzZQorICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZF8sIE5VTEwsICZTdGFydCwgdGhpcyk7CisjZW5kaWYKKyAgICB9CisgICAgflRlc3RUaHJlYWQoKSB7CisgICAgICBpZiAoIWpvaW5lZF8pIEpvaW4oKTsKKyAgICB9CisKKyAgICBib29sIElzRG9uZSgpIHsKKyAgICAgIE11dGV4TG9jayBsb2NrKCZkb25lX211dGV4Xyk7CisgICAgICByZXR1cm4gZG9uZV87CisgICAgfQorICAgIHZvaWQgSm9pbigpIHsKKyAgICAgIGpvaW5lZF8gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWRfLCBJTkZJTklURSk7CisgICAgICBDbG9zZUhhbmRsZSh0aHJlYWRfKTsKKyNlbHNlCisgICAgICBwdGhyZWFkX2pvaW4odGhyZWFkXywgTlVMTCk7CisjZW5kaWYKKyAgICB9CisKKyAgIHByaXZhdGU6CisjaWZkZWYgX1dJTjMyCisgICAgSEFORExFIHRocmVhZF87CisjZWxzZQorICAgIHB0aHJlYWRfdCB0aHJlYWRfOworI2VuZGlmCisKKyAgICBNdXRleCBkb25lX211dGV4XzsKKyAgICBib29sIGRvbmVfOworICAgIGJvb2wgam9pbmVkXzsKKyAgICBDbG9zdXJlKiBjYWxsYmFja187CisKKyNpZmRlZiBfV0lOMzIKKyAgICBzdGF0aWMgRFdPUkQgV0lOQVBJIFN0YXJ0KExQVk9JRCBhcmcpIHsKKyNlbHNlCisgICAgc3RhdGljIHZvaWQqIFN0YXJ0KHZvaWQqIGFyZykgeworI2VuZGlmCisgICAgICByZWludGVycHJldF9jYXN0PFRlc3RUaHJlYWQqPihhcmcpLT5SdW4oKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZvaWQgUnVuKCkgeworICAgICAgY2FsbGJhY2tfLT5SdW4oKTsKKyAgICAgIE11dGV4TG9jayBsb2NrKCZkb25lX211dGV4Xyk7CisgICAgICBkb25lXyA9IHRydWU7CisgICAgfQorICB9OworCisgIFRlc3RUaHJlYWQqIFJ1bkluaXRPbmNlSW5OZXdUaHJlYWQoKSB7CisgICAgcmV0dXJuIG5ldyBUZXN0VGhyZWFkKE5ld0NhbGxiYWNrKHRoaXMsICZPbmNlSW5pdFRlc3Q6OkluaXRPbmNlKSk7CisgIH0KKyAgVGVzdFRocmVhZCogUnVuSW5pdFJlY3Vyc2l2ZU9uY2VJbk5ld1RocmVhZCgpIHsKKyAgICByZXR1cm4gbmV3IFRlc3RUaHJlYWQoTmV3Q2FsbGJhY2sodGhpcywgJk9uY2VJbml0VGVzdDo6SW5pdFJlY3Vyc2l2ZU9uY2UpKTsKKyAgfQorCisgIGVudW0gU3RhdGUgeworICAgIElOSVRfTk9UX1NUQVJURUQsCisgICAgSU5JVF9TVEFSVEVELAorICAgIElOSVRfRE9ORQorICB9OworICBTdGF0ZSBDdXJyZW50U3RhdGUoKSB7CisgICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgICAgcmV0dXJuIHN0YXRlXzsKKyAgfQorCisgIHZvaWQgV2FpdEFCaXQoKSB7CisjaWZkZWYgX1dJTjMyCisgICAgU2xlZXAoMTAwMCk7CisjZWxzZQorICAgIHNsZWVwKDEpOworI2VuZGlmCisgIH0KKworIHByaXZhdGU6CisgIE11dGV4IG11dGV4XzsKKyAgTXV0ZXggaW5pdF9ibG9ja2VyXzsKKyAgU3RhdGUgc3RhdGVfOworICBQcm90b2J1Zk9uY2VUeXBlKiBvbmNlXzsKKyAgUHJvdG9idWZPbmNlVHlwZSogcmVjdXJzaXZlX29uY2VfOworCisgIHZvaWQgSW5pdCgpIHsKKyAgICBNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgICBFWFBFQ1RfRVEoSU5JVF9OT1RfU1RBUlRFRCwgc3RhdGVfKTsKKyAgICBzdGF0ZV8gPSBJTklUX1NUQVJURUQ7CisgICAgbXV0ZXhfLlVubG9jaygpOworICAgIGluaXRfYmxvY2tlcl8uTG9jaygpOworICAgIGluaXRfYmxvY2tlcl8uVW5sb2NrKCk7CisgICAgbXV0ZXhfLkxvY2soKTsKKyAgICBzdGF0ZV8gPSBJTklUX0RPTkU7CisgIH0KKworICBzdGF0aWMgT25jZUluaXRUZXN0KiBjdXJyZW50X3Rlc3RfOworICBzdGF0aWMgdm9pZCBJbml0U3RhdGljKCkgeyBjdXJyZW50X3Rlc3RfLT5Jbml0KCk7IH0KKyAgc3RhdGljIHZvaWQgSW5pdFJlY3Vyc2l2ZVN0YXRpYygpIHsgY3VycmVudF90ZXN0Xy0+SW5pdE9uY2UoKTsgfQorfTsKKworT25jZUluaXRUZXN0KiBPbmNlSW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF8gPSBOVUxMOworCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHNpbXBsZV9vbmNlKTsKKworVEVTVF9GKE9uY2VJbml0VGVzdCwgU2ltcGxlKSB7CisgIFNldE9uY2VzKCZzaW1wbGVfb25jZSwgTlVMTCk7CisKKyAgRVhQRUNUX0VRKElOSVRfTk9UX1NUQVJURUQsIEN1cnJlbnRTdGF0ZSgpKTsKKyAgSW5pdE9uY2UoKTsKKyAgRVhQRUNUX0VRKElOSVRfRE9ORSwgQ3VycmVudFN0YXRlKCkpOworCisgIC8vIENhbGxpbmcgYWdhaW4gaGFzIG5vIGVmZmVjdC4KKyAgSW5pdE9uY2UoKTsKKyAgRVhQRUNUX0VRKElOSVRfRE9ORSwgQ3VycmVudFN0YXRlKCkpOworfQorCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHJlY3Vyc2l2ZV9vbmNlMSk7CitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHJlY3Vyc2l2ZV9vbmNlMik7CisKK1RFU1RfRihPbmNlSW5pdFRlc3QsIFJlY3Vyc2l2ZSkgeworICBTZXRPbmNlcygmcmVjdXJzaXZlX29uY2UxLCAmcmVjdXJzaXZlX29uY2UyKTsKKworICBFWFBFQ1RfRVEoSU5JVF9OT1RfU1RBUlRFRCwgQ3VycmVudFN0YXRlKCkpOworICBJbml0UmVjdXJzaXZlT25jZSgpOworICBFWFBFQ1RfRVEoSU5JVF9ET05FLCBDdXJyZW50U3RhdGUoKSk7Cit9CisKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UobXVsdGlwbGVfdGhyZWFkc19vbmNlKTsKKworVEVTVF9GKE9uY2VJbml0VGVzdCwgTXVsdGlwbGVUaHJlYWRzKSB7CisgIFNldE9uY2VzKCZtdWx0aXBsZV90aHJlYWRzX29uY2UsIE5VTEwpOworCisgIHNjb3BlZF9wdHI8VGVzdFRocmVhZD4gdGhyZWFkc1s0XTsKKyAgRVhQRUNUX0VRKElOSVRfTk9UX1NUQVJURUQsIEN1cnJlbnRTdGF0ZSgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICB0aHJlYWRzW2ldLnJlc2V0KFJ1bkluaXRPbmNlSW5OZXdUaHJlYWQoKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICB0aHJlYWRzW2ldLT5Kb2luKCk7CisgIH0KKyAgRVhQRUNUX0VRKElOSVRfRE9ORSwgQ3VycmVudFN0YXRlKCkpOworfQorCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKG11bHRpcGxlX3RocmVhZHNfYmxvY2tlZF9vbmNlMSk7CitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKG11bHRpcGxlX3RocmVhZHNfYmxvY2tlZF9vbmNlMik7CisKK1RFU1RfRihPbmNlSW5pdFRlc3QsIE11bHRpcGxlVGhyZWFkc0Jsb2NrZWQpIHsKKyAgU2V0T25jZXMoJm11bHRpcGxlX3RocmVhZHNfYmxvY2tlZF9vbmNlMSwgJm11bHRpcGxlX3RocmVhZHNfYmxvY2tlZF9vbmNlMik7CisKKyAgc2NvcGVkX3B0cjxUZXN0VGhyZWFkPiB0aHJlYWRzWzhdOworICBFWFBFQ1RfRVEoSU5JVF9OT1RfU1RBUlRFRCwgQ3VycmVudFN0YXRlKCkpOworCisgIEJsb2NrSW5pdCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIHRocmVhZHNbaV0ucmVzZXQoUnVuSW5pdE9uY2VJbk5ld1RocmVhZCgpKTsKKyAgfQorICBmb3IgKGludCBpID0gNDsgaSA8IDg7IGkrKykgeworICAgIHRocmVhZHNbaV0ucmVzZXQoUnVuSW5pdFJlY3Vyc2l2ZU9uY2VJbk5ld1RocmVhZCgpKTsKKyAgfQorCisgIFdhaXRBQml0KCk7CisKKyAgLy8gV2Ugc2hvdWxkIG5vdyBoYXZlIG9uZSB0aHJlYWQgYmxvY2tlZCBpbnNpZGUgSW5pdCgpLCBmb3VyIGJsb2NrZWQgd2FpdGluZworICAvLyBmb3IgSW5pdCgpIHRvIGNvbXBsZXRlLCBhbmQgdGhyZWUgYmxvY2tlZCB3YWl0aW5nIGZvciBJbml0UmVjdXJzaXZlKCkgdG8KKyAgLy8gY29tcGxldGUuCisgIEVYUEVDVF9FUShJTklUX1NUQVJURUQsIEN1cnJlbnRTdGF0ZSgpKTsKKyAgVW5ibG9ja0luaXQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgIHRocmVhZHNbaV0tPkpvaW4oKTsKKyAgfQorICBFWFBFQ1RfRVEoSU5JVF9ET05FLCBDdXJyZW50U3RhdGUoKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGY2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fTUFDUk9TX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9NQUNST1NfSF8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworLy8gUHJvY2Vzc29yIGFyY2hpdGVjdHVyZSBkZXRlY3Rpb24uICBGb3IgbW9yZSBpbmZvIG9uIHdoYXQncyBkZWZpbmVkLCBzZWU6CisvLyAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iMDA4NGtheS5hc3B4CisvLyAgIGh0dHA6Ly93d3cuYWduZXIub3JnL29wdGltaXplL2NhbGxpbmdfY29udmVudGlvbnMucGRmCisvLyAgIG9yIHdpdGggZ2NjLCBydW46ICJlY2hvIHwgZ2NjIC1FIC1kTSAtIgorI2lmIGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX1g2NCAxCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCAxCisjZWxpZiBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX0lBMzIgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChfX1FOWF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk1fUU5YIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyNlbGlmIGRlZmluZWQoX19BUk1FTF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk0gMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChfX01JUFNFTF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyNlbGlmIGRlZmluZWQoX19wbmFjbF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChfX3BwY19fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9QUEMgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2Vsc2UKKyNlcnJvciBIb3N0IGFyY2hpdGVjdHVyZSB3YXMgbm90IGRldGVjdGVkIGFzIHN1cHBvcnRlZCBieSBwcm90b2J1ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX0FQUExFCisjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfTkFDTAorI2VuZGlmCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX01BQ1JPU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDIxZGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIGZyb20gZ29vZ2xlMy91dGlsL2d0bC9zdGxfdXRpbC5oCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUTF9VVElMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RMX1VUSUxfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoKQorLy8gIEZvciBhIHJhbmdlIHdpdGhpbiBhIGNvbnRhaW5lciBvZiBwb2ludGVycywgY2FsbHMgZGVsZXRlCisvLyAgKG5vbi1hcnJheSB2ZXJzaW9uKSBvbiB0aGVzZSBwb2ludGVycy4KKy8vIE5PVEU6IGZvciB0aGVzZSB0aHJlZSBmdW5jdGlvbnMsIHdlIGNvdWxkIGp1c3QgaW1wbGVtZW50IGEgRGVsZXRlT2JqZWN0CisvLyBmdW5jdG9yIGFuZCB0aGVuIGNhbGwgZm9yX2VhY2goKSBvbiB0aGUgcmFuZ2UgYW5kIGZ1bmN0b3IsIGJ1dCB0aGlzCisvLyByZXF1aXJlcyB1cyB0byBwdWxsIGluIGFsbCBvZiBhbGdvcml0aG0uaCwgd2hpY2ggc2VlbXMgZXhwZW5zaXZlLgorLy8gRm9yIGhhc2hfW211bHRpXXNldCwgaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBkZWxldGVzIGJlaGluZCB0aGUgaXRlcmF0b3IKKy8vIGJlY2F1c2UgdGhlIGhhc2hfc2V0IG1heSBjYWxsIHRoZSBoYXNoIGZ1bmN0aW9uIG9uIHRoZSBpdGVyYXRvciB3aGVuIGl0IGlzCisvLyBhZHZhbmNlZCwgd2hpY2ggY291bGQgcmVzdWx0IGluIHRoZSBoYXNoIGZ1bmN0aW9uIHRyeWluZyB0byBkZWZlcmVuY2UgYQorLy8gc3RhbGUgcG9pbnRlci4KK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+Cit2b2lkIFNUTERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKEZvcndhcmRJdGVyYXRvciBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yd2FyZEl0ZXJhdG9yIGVuZCkgeworICB3aGlsZSAoYmVnaW4gIT0gZW5kKSB7CisgICAgRm9yd2FyZEl0ZXJhdG9yIHRlbXAgPSBiZWdpbjsKKyAgICArK2JlZ2luOworICAgIGRlbGV0ZSAqdGVtcDsKKyAgfQorfQorCisvLyBJbnNpZGUgR29vZ2xlLCB0aGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYSBob3JyaWJsZSwgZGlzZ3VzdGluZyBoYWNrIGluIHdoaWNoCisvLyB3ZSByZWFjaCBpbnRvIHRoZSBzdHJpbmcncyBwcml2YXRlIGltcGxlbWVudGF0aW9uIGFuZCByZXNpemUgaXQgd2l0aG91dAorLy8gaW5pdGlhbGl6aW5nIHRoZSBuZXcgYnl0ZXMuICBJbiBzb21lIGNhc2VzIGRvaW5nIHRoaXMgY2FuIHNpZ25pZmljYW50bHkKKy8vIGltcHJvdmUgcGVyZm9ybWFuY2UuICBIb3dldmVyLCBzaW5jZSBpdCdzIHRvdGFsbHkgbm9uLXBvcnRhYmxlIGl0IGhhcyBubworLy8gcGxhY2UgaW4gb3BlbiBzb3VyY2UgY29kZS4gIEZlZWwgZnJlZSB0byBmaWxsIHRoaXMgZnVuY3Rpb24gaW4gd2l0aCB5b3VyCisvLyBvd24gZGlzZ3VzdGluZyBoYWNrIGlmIHlvdSB3YW50IHRoZSBwZXJmIGJvb3N0LgoraW5saW5lIHZvaWQgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZChzdHJpbmcqIHMsIHNpemVfdCBuZXdfc2l6ZSkgeworICBzLT5yZXNpemUobmV3X3NpemUpOworfQorCisvLyBSZXR1cm4gYSBtdXRhYmxlIGNoYXIqIHBvaW50aW5nIHRvIGEgc3RyaW5nJ3MgaW50ZXJuYWwgYnVmZmVyLAorLy8gd2hpY2ggbWF5IG5vdCBiZSBudWxsLXRlcm1pbmF0ZWQuIFdyaXRpbmcgdGhyb3VnaCB0aGlzIHBvaW50ZXIgd2lsbAorLy8gbW9kaWZ5IHRoZSBzdHJpbmcuCisvLworLy8gc3RyaW5nX2FzX2FycmF5KCZzdHIpW2ldIGlzIHZhbGlkIGZvciAwIDw9IGkgPCBzdHIuc2l6ZSgpIHVudGlsIHRoZQorLy8gbmV4dCBjYWxsIHRvIGEgc3RyaW5nIG1ldGhvZCB0aGF0IGludmFsaWRhdGVzIGl0ZXJhdG9ycy4KKy8vCisvLyBBcyBvZiAyMDA2LTA0LCB0aGVyZSBpcyBubyBzdGFuZGFyZC1ibGVzc2VkIHdheSBvZiBnZXR0aW5nIGEKKy8vIG11dGFibGUgcmVmZXJlbmNlIHRvIGEgc3RyaW5nJ3MgaW50ZXJuYWwgYnVmZmVyLiBIb3dldmVyLCBpc3N1ZSA1MzAKKy8vIChodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9KVEMxL1NDMjIvV0cyMS9kb2NzL2x3Zy1hY3RpdmUuaHRtbCM1MzApCisvLyBwcm9wb3NlcyB0aGlzIGFzIHRoZSBtZXRob2QuIEFjY29yZGluZyB0byBNYXR0IEF1c3Rlcm4sIHRoaXMgc2hvdWxkCisvLyBhbHJlYWR5IHdvcmsgb24gYWxsIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zLgoraW5saW5lIGNoYXIqIHN0cmluZ19hc19hcnJheShzdHJpbmcqIHN0cikgeworICAvLyBETyBOT1QgVVNFIGNvbnN0X2Nhc3Q8Y2hhcio+KHN0ci0+ZGF0YSgpKSEgU2VlIHRoZSB1bml0dGVzdCBmb3Igd2h5LgorICByZXR1cm4gc3RyLT5lbXB0eSgpID8gTlVMTCA6ICYqc3RyLT5iZWdpbigpOworfQorCisvLyBTVExEZWxldGVFbGVtZW50cygpIGRlbGV0ZXMgYWxsIHRoZSBlbGVtZW50cyBpbiBhbiBTVEwgY29udGFpbmVyIGFuZCBjbGVhcnMKKy8vIHRoZSBjb250YWluZXIuICBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBhIHZlY3Rvciwgc2V0LAorLy8gaGFzaF9zZXQsIG9yIGFueSBvdGhlciBTVEwgY29udGFpbmVyIHdoaWNoIGRlZmluZXMgc2Vuc2libGUgYmVnaW4oKSwgZW5kKCksCisvLyBhbmQgY2xlYXIoKSBtZXRob2RzLgorLy8KKy8vIElmIGNvbnRhaW5lciBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AuCisvLworLy8gQXMgYW4gYWx0ZXJuYXRpdmUgdG8gY2FsbGluZyBTVExEZWxldGVFbGVtZW50cygpIGRpcmVjdGx5LCBjb25zaWRlcgorLy8gRWxlbWVudERlbGV0ZXIgKGRlZmluZWQgYmVsb3cpLCB3aGljaCBlbnN1cmVzIHRoYXQgeW91ciBjb250YWluZXIncyBlbGVtZW50cworLy8gYXJlIGRlbGV0ZWQgd2hlbiB0aGUgRWxlbWVudERlbGV0ZXIgZ29lcyBvdXQgb2Ygc2NvcGUuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgU1RMRGVsZXRlRWxlbWVudHMoVCAqY29udGFpbmVyKSB7CisgIGlmICghY29udGFpbmVyKSByZXR1cm47CisgIFNUTERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKGNvbnRhaW5lci0+YmVnaW4oKSwgY29udGFpbmVyLT5lbmQoKSk7CisgIGNvbnRhaW5lci0+Y2xlYXIoKTsKK30KKworLy8gR2l2ZW4gYW4gU1RMIGNvbnRhaW5lciBjb25zaXN0aW5nIG9mIChrZXksIHZhbHVlKSBwYWlycywgU1RMRGVsZXRlVmFsdWVzCisvLyBkZWxldGVzIGFsbCB0aGUgInZhbHVlIiBjb21wb25lbnRzIGFuZCBjbGVhcnMgdGhlIGNvbnRhaW5lci4gIERvZXMgbm90aGluZworLy8gaW4gdGhlIGNhc2UgaXQncyBnaXZlbiBhIE5VTEwgcG9pbnRlci4KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFNUTERlbGV0ZVZhbHVlcyhUICp2KSB7CisgIGlmICghdikgcmV0dXJuOworICBmb3IgKHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIGkgPSB2LT5iZWdpbigpOyBpICE9IHYtPmVuZCgpOyArK2kpIHsKKyAgICBkZWxldGUgaS0+c2Vjb25kOworICB9CisgIHYtPmNsZWFyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVExfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNWI4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmNjCkBAIC0wLDAgKzEsMTc1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBmcm9tIGdvb2dsZTMvYmFzZS9zdHJpbmdwcmludGYuY2MKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+IC8vIEZvciB2YV9saXN0IGFuZCByZWxhdGVkIG9wZXJhdGlvbnMKKyNpbmNsdWRlIDxzdGRpby5oPiAvLyBNU1ZDIHJlcXVpcmVzIHRoaXMgZm9yIF92c25wcmludGYKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgX01TQ19WRVIKK2VudW0geyBJU19DT01QSUxFUl9NU1ZDID0gMSB9OworI2lmbmRlZiB2YV9jb3B5CisvLyBEZWZpbmUgdmFfY29weSBmb3IgTVNWQy4gVGhpcyBpcyBhIGhhY2ssIGFzc3VtaW5nIHZhX2xpc3QgaXMgc2ltcGx5IGEKKy8vIHBvaW50ZXIgaW50byB0aGUgc3RhY2sgYW5kIGlzIHNhZmUgdG8gY29weS4KKyNkZWZpbmUgdmFfY29weShkZXN0LCBzcmMpICgoZGVzdCkgPSAoc3JjKSkKKyNlbmRpZgorI2Vsc2UKK2VudW0geyBJU19DT01QSUxFUl9NU1ZDID0gMCB9OworI2VuZGlmCisKK3ZvaWQgU3RyaW5nQXBwZW5kVihzdHJpbmcqIGRzdCwgY29uc3QgY2hhciogZm9ybWF0LCB2YV9saXN0IGFwKSB7CisgIC8vIEZpcnN0IHRyeSB3aXRoIGEgc21hbGwgZml4ZWQgc2l6ZSBidWZmZXIKKyAgc3RhdGljIGNvbnN0IGludCBrU3BhY2VMZW5ndGggPSAxMDI0OworICBjaGFyIHNwYWNlW2tTcGFjZUxlbmd0aF07CisKKyAgLy8gSXQncyBwb3NzaWJsZSBmb3IgbWV0aG9kcyB0aGF0IHVzZSBhIHZhX2xpc3QgdG8gaW52YWxpZGF0ZQorICAvLyB0aGUgZGF0YSBpbiBpdCB1cG9uIHVzZS4gIFRoZSBmaXggaXMgdG8gbWFrZSBhIGNvcHkKKyAgLy8gb2YgdGhlIHN0cnVjdHVyZSBiZWZvcmUgdXNpbmcgaXQgYW5kIHVzZSB0aGF0IGNvcHkgaW5zdGVhZC4KKyAgdmFfbGlzdCBiYWNrdXBfYXA7CisgIHZhX2NvcHkoYmFja3VwX2FwLCBhcCk7CisgIGludCByZXN1bHQgPSB2c25wcmludGYoc3BhY2UsIGtTcGFjZUxlbmd0aCwgZm9ybWF0LCBiYWNrdXBfYXApOworICB2YV9lbmQoYmFja3VwX2FwKTsKKworICBpZiAocmVzdWx0IDwga1NwYWNlTGVuZ3RoKSB7CisgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAvLyBOb3JtYWwgY2FzZSAtLSBldmVyeXRoaW5nIGZpdC4KKyAgICAgIGRzdC0+YXBwZW5kKHNwYWNlLCByZXN1bHQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChJU19DT01QSUxFUl9NU1ZDKSB7CisgICAgICAvLyBFcnJvciBvciBNU1ZDIHJ1bm5pbmcgb3V0IG9mIHNwYWNlLiAgTVNWQyA4LjAgYW5kIGhpZ2hlcgorICAgICAgLy8gY2FuIGJlIGFza2VkIGFib3V0IHNwYWNlIG5lZWRlZCB3aXRoIHRoZSBzcGVjaWFsIGlkaW9tIGJlbG93OgorICAgICAgdmFfY29weShiYWNrdXBfYXAsIGFwKTsKKyAgICAgIHJlc3VsdCA9IHZzbnByaW50ZihOVUxMLCAwLCBmb3JtYXQsIGJhY2t1cF9hcCk7CisgICAgICB2YV9lbmQoYmFja3VwX2FwKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgLy8gSnVzdCBhbiBlcnJvci4KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBJbmNyZWFzZSB0aGUgYnVmZmVyIHNpemUgdG8gdGhlIHNpemUgcmVxdWVzdGVkIGJ5IHZzbnByaW50ZiwKKyAgLy8gcGx1cyBvbmUgZm9yIHRoZSBjbG9zaW5nIFwwLgorICBpbnQgbGVuZ3RoID0gcmVzdWx0KzE7CisgIGNoYXIqIGJ1ZiA9IG5ldyBjaGFyW2xlbmd0aF07CisKKyAgLy8gUmVzdG9yZSB0aGUgdmFfbGlzdCBiZWZvcmUgd2UgdXNlIGl0IGFnYWluCisgIHZhX2NvcHkoYmFja3VwX2FwLCBhcCk7CisgIHJlc3VsdCA9IHZzbnByaW50ZihidWYsIGxlbmd0aCwgZm9ybWF0LCBiYWNrdXBfYXApOworICB2YV9lbmQoYmFja3VwX2FwKTsKKworICBpZiAocmVzdWx0ID49IDAgJiYgcmVzdWx0IDwgbGVuZ3RoKSB7CisgICAgLy8gSXQgZml0CisgICAgZHN0LT5hcHBlbmQoYnVmLCByZXN1bHQpOworICB9CisgIGRlbGV0ZVtdIGJ1ZjsKK30KKworCitzdHJpbmcgU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBzdHJpbmcgcmVzdWx0OworICBTdHJpbmdBcHBlbmRWKCZyZXN1bHQsIGZvcm1hdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBzdHJpbmcmIFNTdHJpbmdQcmludGYoc3RyaW5nKiBkc3QsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBkc3QtPmNsZWFyKCk7CisgIFN0cmluZ0FwcGVuZFYoZHN0LCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuICpkc3Q7Cit9CisKK3ZvaWQgU3RyaW5nQXBwZW5kRihzdHJpbmcqIGRzdCwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIFN0cmluZ0FwcGVuZFYoZHN0LCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKK30KKworLy8gTWF4IGFyZ3VtZW50cyBzdXBwb3J0ZWQgYnkgU3RyaW5nUHJpbnRWZWN0b3IKK2NvbnN0IGludCBrU3RyaW5nUHJpbnRmVmVjdG9yTWF4QXJncyA9IDMyOworCisvLyBBbiBlbXB0eSBibG9jayBvZiB6ZXJvIGZvciBmaWxsZXIgYXJndW1lbnRzLiAgVGhpcyBpcyBjb25zdCBzbyB0aGF0IGlmCisvLyBwcmludGYgdHJpZXMgdG8gd3JpdGUgdG8gaXQgKHZpYSAlbikgdGhlbiB0aGUgcHJvZ3JhbSBnZXRzIGEgU0lHU0VHVgorLy8gYW5kIHdlIGNhbiBmaXggdGhlIHByb2JsZW0gb3IgcHJvdGVjdCBhZ2FpbnN0IGFuIGF0dGFjay4KK3N0YXRpYyBjb25zdCBjaGFyIHN0cmluZ19wcmludGZfZW1wdHlfYmxvY2tbMjU2XSA9IHsgJ1wwJyB9OworCitzdHJpbmcgU3RyaW5nUHJpbnRmVmVjdG9yKGNvbnN0IGNoYXIqIGZvcm1hdCwgY29uc3QgdmVjdG9yPHN0cmluZz4mIHYpIHsKKyAgR09PR0xFX0NIRUNLX0xFKHYuc2l6ZSgpLCBrU3RyaW5nUHJpbnRmVmVjdG9yTWF4QXJncykKKyAgICAgIDw8ICJTdHJpbmdQcmludGZWZWN0b3IgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdXAgdG8gIgorICAgICAgPDwga1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3MgPDwgIiBhcmd1bWVudHMuICIKKyAgICAgIDw8ICJGZWVsIGZyZWUgdG8gYWRkIHN1cHBvcnQgZm9yIG1vcmUgaWYgeW91IG5lZWQgaXQuIjsKKworICAvLyBBZGQgZmlsbGVyIGFyZ3VtZW50cyBzbyB0aGF0IGJvZ3VzIGZvcm1hdCthcmdzIGhhdmUgYSBoYXJkZXIgdGltZQorICAvLyBjcmFzaGluZyB0aGUgcHJvZ3JhbSwgY29ycnVwdGluZyB0aGUgcHJvZ3JhbSAoJW4pLAorICAvLyBvciBkaXNwbGF5aW5nIHJhbmRvbSBjaHVua3Mgb2YgbWVtb3J5IHRvIHVzZXJzLgorCisgIGNvbnN0IGNoYXIqIGNzdHJba1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3NdOworICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyArK2kpIHsKKyAgICBjc3RyW2ldID0gdltpXS5jX3N0cigpOworICB9CisgIGZvciAoaW50IGkgPSB2LnNpemUoKTsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoY3N0cik7ICsraSkgeworICAgIGNzdHJbaV0gPSAmc3RyaW5nX3ByaW50Zl9lbXB0eV9ibG9ja1swXTsKKyAgfQorCisgIC8vIEkgZG8gbm90IGtub3cgYW55IHdheSB0byBwYXNzIGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzIGFyZ3VtZW50cywKKyAgLy8gb3IgYW55IHdheSB0byBidWlsZCBhIHZhX2xpc3QgYnkgaGFuZCwgb3IgYW55IEFQSSBmb3IgcHJpbnRmCisgIC8vIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcmd1bWVudHMuICBUaGUgYmVzdCBJIGNhbiBkbyBpcyBzdGljaworICAvLyB0aGlzIENPTVBJTEVfQVNTRVJUIHJpZ2h0IG5leHQgdG8gdGhlIGFjdHVhbCBzdGF0ZW1lbnQuCisKKyAgR09PR0xFX0NPTVBJTEVfQVNTRVJUKGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzID09IDMyLCBhcmdfY291bnRfbWlzbWF0Y2gpOworICByZXR1cm4gU3RyaW5nUHJpbnRmKGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyWzBdLCBjc3RyWzFdLCBjc3RyWzJdLCBjc3RyWzNdLCBjc3RyWzRdLAorICAgICAgICAgICAgICAgICAgICAgIGNzdHJbNV0sIGNzdHJbNl0sIGNzdHJbN10sIGNzdHJbOF0sIGNzdHJbOV0sCisgICAgICAgICAgICAgICAgICAgICAgY3N0clsxMF0sIGNzdHJbMTFdLCBjc3RyWzEyXSwgY3N0clsxM10sIGNzdHJbMTRdLAorICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMTVdLCBjc3RyWzE2XSwgY3N0clsxN10sIGNzdHJbMThdLCBjc3RyWzE5XSwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyWzIwXSwgY3N0clsyMV0sIGNzdHJbMjJdLCBjc3RyWzIzXSwgY3N0clsyNF0sCisgICAgICAgICAgICAgICAgICAgICAgY3N0clsyNV0sIGNzdHJbMjZdLCBjc3RyWzI3XSwgY3N0clsyOF0sIGNzdHJbMjldLAorICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMzBdLCBjc3RyWzMxXSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTAzZTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIGZyb20gZ29vZ2xlMy9iYXNlL3N0cmluZ3ByaW50Zi5oCisvLworLy8gUHJpbnRmIHZhcmlhbnRzIHRoYXQgcGxhY2UgdGhlaXIgb3V0cHV0IGluIGEgQysrIHN0cmluZy4KKy8vCisvLyBVc2FnZToKKy8vICAgICAgc3RyaW5nIHJlc3VsdCA9IFN0cmluZ1ByaW50ZigiJWQgJXNcbiIsIDEwLCAiaGVsbG8iKTsKKy8vICAgICAgU1N0cmluZ1ByaW50ZigmcmVzdWx0LCAiJWQgJXNcbiIsIDEwLCAiaGVsbG8iKTsKKy8vICAgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiJWQgJXNcbiIsIDIwLCAidGhlcmUiKTsKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RSSU5HUFJJTlRGX0gKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUklOR1BSSU5URl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIFJldHVybiBhIEMrKyBzdHJpbmcKK0xJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gc3RyaW5nIFN0cmluZ1ByaW50Zihjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKy8vIFN0b3JlIHJlc3VsdCBpbnRvIGEgc3VwcGxpZWQgc3RyaW5nIGFuZCByZXR1cm4gaXQKK0xJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gY29uc3Qgc3RyaW5nJiBTU3RyaW5nUHJpbnRmKHN0cmluZyogZHN0LCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKy8vIEFwcGVuZCByZXN1bHQgdG8gYSBzdXBwbGllZCBzdHJpbmcKK0xJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gdm9pZCBTdHJpbmdBcHBlbmRGKHN0cmluZyogZHN0LCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKy8vIExvd2VyLWxldmVsIHJvdXRpbmUgdGhhdCB0YWtlcyBhIHZhX2xpc3QgYW5kIGFwcGVuZHMgdG8gYSBzcGVjaWZpZWQKKy8vIHN0cmluZy4gIEFsbCBvdGhlciByb3V0aW5lcyBhcmUganVzdCBjb252ZW5pZW5jZSB3cmFwcGVycyBhcm91bmQgaXQuCitMSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIHZvaWQgU3RyaW5nQXBwZW5kVihzdHJpbmcqIGRzdCwgY29uc3QgY2hhciogZm9ybWF0LCB2YV9saXN0IGFwKTsKKworLy8gVGhlIG1heCBhcmd1bWVudHMgc3VwcG9ydGVkIGJ5IFN0cmluZ1ByaW50ZlZlY3RvcgorTElCUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCBpbnQga1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3M7CisKKy8vIFlvdSBjYW4gdXNlIHRoaXMgdmVyc2lvbiB3aGVuIGFsbCB5b3VyIGFyZ3VtZW50cyBhcmUgc3RyaW5ncywgYnV0CisvLyB5b3UgZG9uJ3Qga25vdyBob3cgbWFueSBhcmd1bWVudHMgeW91J2xsIGhhdmUgYXQgY29tcGlsZSB0aW1lLgorLy8gU3RyaW5nUHJpbnRmVmVjdG9yIHdpbGwgTE9HKEZBVEFMKSBpZiB2LnNpemUoKSA+IGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzCitMSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIHN0cmluZyBTdHJpbmdQcmludGZWZWN0b3IoY29uc3QgY2hhciogZm9ybWF0LCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdik7CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJJTkdQUklOVEZfSApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1Y2U1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIGZyb20gZ29vZ2xlMy9iYXNlL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgorCisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgeworCitURVNUKFN0cmluZ1ByaW50ZlRlc3QsIEVtcHR5KSB7CisjaWYgMAorICAvLyBnY2MgMi45NS4zLCBnY2MgNC4xLjAsIGFuZCBnY2MgNC4yLjIgYWxsIHdhcm4gYWJvdXQgdGhpczoKKyAgLy8gd2FybmluZzogemVyby1sZW5ndGggcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisgIC8vIHNvIHdlIGRvIG5vdCBhbGxvdyB0aGVtIGluIGdvb2dsZTMuCisgIEVYUEVDVF9FUSgiIiwgU3RyaW5nUHJpbnRmKCIiKSk7CisjZW5kaWYKKyAgRVhQRUNUX0VRKCIiLCBTdHJpbmdQcmludGYoIiVzIiwgc3RyaW5nKCkuY19zdHIoKSkpOworICBFWFBFQ1RfRVEoIiIsIFN0cmluZ1ByaW50ZigiJXMiLCAiIikpOworfQorCitURVNUKFN0cmluZ1ByaW50ZlRlc3QsIE1pc2MpIHsKKy8vIE1TVkMgYW5kIG1pbmd3IGRvZXMgbm90IHN1cHBvcnQgJCBmb3JtYXQgc3BlY2lmaWVyLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyAgRVhQRUNUX0VRKCIxMjNoZWxsbyB3IiwgU3RyaW5nUHJpbnRmKCIlMyRkJTIkcyAlMSRjIiwgJ3cnLCAiaGVsbG8iLCAxMjMpKTsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCit9CisKK1RFU1QoU3RyaW5nQXBwZW5kRlRlc3QsIEVtcHR5KSB7CisgIHN0cmluZyB2YWx1ZSgiSGVsbG8iKTsKKyAgY29uc3QgY2hhciogZW1wdHkgPSAiIjsKKyAgU3RyaW5nQXBwZW5kRigmdmFsdWUsICIlcyIsIGVtcHR5KTsKKyAgRVhQRUNUX0VRKCJIZWxsbyIsIHZhbHVlKTsKK30KKworVEVTVChTdHJpbmdBcHBlbmRGVGVzdCwgRW1wdHlTdHJpbmcpIHsKKyAgc3RyaW5nIHZhbHVlKCJIZWxsbyIpOworICBTdHJpbmdBcHBlbmRGKCZ2YWx1ZSwgIiVzIiwgIiIpOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgdmFsdWUpOworfQorCitURVNUKFN0cmluZ0FwcGVuZEZUZXN0LCBTdHJpbmcpIHsKKyAgc3RyaW5nIHZhbHVlKCJIZWxsbyIpOworICBTdHJpbmdBcHBlbmRGKCZ2YWx1ZSwgIiAlcyIsICJXb3JsZCIpOworICBFWFBFQ1RfRVEoIkhlbGxvIFdvcmxkIiwgdmFsdWUpOworfQorCitURVNUKFN0cmluZ0FwcGVuZEZUZXN0LCBJbnQpIHsKKyAgc3RyaW5nIHZhbHVlKCJIZWxsbyIpOworICBTdHJpbmdBcHBlbmRGKCZ2YWx1ZSwgIiAlZCIsIDEyMyk7CisgIEVYUEVDVF9FUSgiSGVsbG8gMTIzIiwgdmFsdWUpOworfQorCitURVNUKFN0cmluZ1ByaW50ZlRlc3QsIE11bHRpYnl0ZSkgeworICAvLyBJZiB3ZSBhcmUgaW4gbXVsdGlieXRlIG1vZGUgYW5kIGZlZWQgaW52YWxpZCBtdWx0aWJ5dGUgc2VxdWVuY2UsCisgIC8vIFN0cmluZ1ByaW50ZiBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mIHJ1bm5pbmcKKyAgLy8gb3V0IG9mIG1lbW9yeSB3aGlsZSB0cnlpbmcgdG8gZGV0ZXJtaW5lIGRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplLgorICAvLyBzZWUgYi80MTk0NTQzLgorCisgIGNoYXIqIG9sZF9sb2NhbGUgPSBzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpOworICAvLyBQdXNoIGxvY2FsZSB3aXRoIG11bHRpYnl0ZSBtb2RlCisgIHNldGxvY2FsZShMQ19DVFlQRSwgImVuX1VTLnV0ZjgiKTsKKworICBjb25zdCBjaGFyIGtJbnZhbGlkQ29kZVBvaW50W10gPSAiXDM3NVwwNjdzIjsKKyAgc3RyaW5nIHZhbHVlID0gU3RyaW5nUHJpbnRmKCIlLipzIiwgMywga0ludmFsaWRDb2RlUG9pbnQpOworCisgIC8vIEluIHNvbWUgdmVyc2lvbnMgb2YgZ2xpYmMgKGUuZy4gZWdsaWJjLTIuMTEuMSwgYWthIEdSVEV2MiksIHNucHJpbnRmCisgIC8vIHJldHVybnMgZXJyb3IgZ2l2ZW4gYW4gaW52YWxpZCBjb2RlcG9pbnQuIE90aGVyIHZlcnNpb25zCisgIC8vIChlLmcuIGVnbGliYy0yLjE1LCBha2EgcHJlLUdSVEV2MykgZW1pdCB0aGUgY29kZXBvaW50IHZlcmJhdGltLgorICAvLyBXZSB0ZXN0IHRoYXQgdGhlIG91dHB1dCBpcyBvbmUgb2YgdGhlIGFib3ZlLgorICBFWFBFQ1RfVFJVRSh2YWx1ZS5lbXB0eSgpIHx8IHZhbHVlID09IGtJbnZhbGlkQ29kZVBvaW50KTsKKworICAvLyBSZXBlYXQgd2l0aCBsb25nZXIgc3RyaW5nLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHluYW1pY2FsbHkKKyAgLy8gYWxsb2NhdGVkIHBhdGggaW4gU3RyaW5nQXBwZW5kViBpcyBoYW5kbGVkIGNvcnJlY3RseS4KKyAgaW50IG4gPSAyMDQ4OworICBjaGFyKiBidWYgPSBuZXcgY2hhcltuKzFdOworICBtZW1zZXQoYnVmLCAnICcsIG4tMyk7CisgIG1lbWNweShidWYgKyBuIC0gMywga0ludmFsaWRDb2RlUG9pbnQsIDQpOworICB2YWx1ZSA9ICBTdHJpbmdQcmludGYoIiUuKnMiLCBuLCBidWYpOworICAvLyBTZWUgR1JURXYyIHZzLiBHUlRFdjMgY29tbWVudCBhYm92ZS4KKyAgRVhQRUNUX1RSVUUodmFsdWUuZW1wdHkoKSB8fCB2YWx1ZSA9PSBidWYpOworICBkZWxldGVbXSBidWY7CisKKyAgc2V0bG9jYWxlKExDX0NUWVBFLCBvbGRfbG9jYWxlKTsKK30KKworVEVTVChTdHJpbmdQcmludGZUZXN0LCBOb011bHRpYnl0ZSkgeworICAvLyBObyBtdWx0aWJ5dGUgaGFuZGxpbmcsIGJ1dCB0aGUgc3RyaW5nIGNvbnRhaW5zIGZ1bm55IGNoYXJzLgorICBjaGFyKiBvbGRfbG9jYWxlID0gc2V0bG9jYWxlKExDX0NUWVBFLCBOVUxMKTsKKyAgc2V0bG9jYWxlKExDX0NUWVBFLCAiUE9TSVgiKTsKKyAgc3RyaW5nIHZhbHVlID0gU3RyaW5nUHJpbnRmKCIlLipzIiwgMywgIlwzNzVcMDY3cyIpOworICBzZXRsb2NhbGUoTENfQ1RZUEUsIG9sZF9sb2NhbGUpOworICBFWFBFQ1RfRVEoIlwzNzVcMDY3cyIsIHZhbHVlKTsKK30KKworVEVTVChTdHJpbmdQcmludGZUZXN0LCBEb250T3ZlcndyaXRlRXJybm8pIHsKKyAgLy8gQ2hlY2sgdGhhdCBlcnJubyBpc24ndCBvdmVyd3JpdHRlbiB1bmxlc3Mgd2UncmUgcHJpbnRpbmcKKyAgLy8gc29tZXRoaW5nIHNpZ25pZmljYW50bHkgbGFyZ2VyIHRoYW4gd2hhdCBwZW9wbGUgYXJlIG5vcm1hbGx5CisgIC8vIHByaW50aW5nIGluIHRoZWlyIGJhZGx5IHdyaXR0ZW4gUExPRygpIHN0YXRlbWVudHMuCisgIGVycm5vID0gRUNISUxEOworICBzdHJpbmcgdmFsdWUgPSBTdHJpbmdQcmludGYoIkhlbGxvLCAlcyEiLCAiV29ybGQiKTsKKyAgRVhQRUNUX0VRKEVDSElMRCwgZXJybm8pOworfQorCitURVNUKFN0cmluZ1ByaW50ZlRlc3QsIExhcmdlQnVmKSB7CisgIC8vIENoZWNrIHRoYXQgdGhlIGxhcmdlIGJ1ZmZlciBpcyBoYW5kbGVkIGNvcnJlY3RseS4KKyAgaW50IG4gPSAyMDQ4OworICBjaGFyKiBidWYgPSBuZXcgY2hhcltuKzFdOworICBtZW1zZXQoYnVmLCAnICcsIG4pOworICBidWZbbl0gPSAwOworICBzdHJpbmcgdmFsdWUgPSBTdHJpbmdQcmludGYoIiVzIiwgYnVmKTsKKyAgRVhQRUNUX0VRKGJ1ZiwgdmFsdWUpOworICBkZWxldGVbXSBidWY7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2YWZlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MKQEAgLTAsMCArMSw1MzYgQEAKKy8vIENvcHlyaWdodCAyMDA1LTIwMDggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIEF1dGhvcjoganJtQGdvb2dsZS5jb20gKEppbSBNZWVoYW4pCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZXNlIGZvdXItYnl0ZSBlbnRyaWVzIGNvbXBhY3RseSBlbmNvZGUgaG93IG1hbnkgYnl0ZXMgMC4uMjU1IHRvIGRlbGV0ZQorLy8gaW4gbWFraW5nIGEgc3RyaW5nIHJlcGxhY2VtZW50LCBob3cgbWFueSBieXRlcyB0byBhZGQgMC4uMjU1LCBhbmQgdGhlIG9mZnNldAorLy8gMC4uNjRrLTEgb2YgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBpbiByZW1hcF9zdHJpbmcuCitzdHJ1Y3QgUmVtYXBFbnRyeSB7CisgIHVpbnQ4IGRlbGV0ZV9ieXRlczsKKyAgdWludDggYWRkX2J5dGVzOworICB1aW50MTYgYnl0ZXNfb2Zmc2V0OworfTsKKworLy8gRXhpdCB0eXBlIGNvZGVzIGZvciBzdGF0ZSB0YWJsZXMuIEFsbCBidXQgdGhlIGZpcnN0IGdldCBzdHVmZmVkIGludG8KKy8vIHNpZ25lZCBvbmUtYnl0ZSBlbnRyaWVzLiBUaGUgZmlyc3QgaXMgb25seSBnZW5lcmF0ZWQgYnkgZXhlY3V0YWJsZSBjb2RlLgorLy8gVG8gZGlzdGluZ3Vpc2ggZnJvbSBuZXh0LXN0YXRlIGVudHJpZXMsIHRoZXNlIG11c3QgYmUgY29udGlndW91cyBhbmQKKy8vIGFsbCA8PSBrRXhpdE5vbmUKK3R5cGVkZWYgZW51bSB7CisgIGtFeGl0RHN0U3BhY2VGdWxsID0gMjM5LAorICBrRXhpdElsbGVnYWxTdHJ1Y3R1cmUsICAvLyAyNDAKKyAga0V4aXRPSywgICAgICAgICAgICAgICAgLy8gMjQxCisgIGtFeGl0UmVqZWN0LCAgICAgICAgICAgIC8vIC4uLgorICBrRXhpdFJlcGxhY2UxLAorICBrRXhpdFJlcGxhY2UyLAorICBrRXhpdFJlcGxhY2UzLAorICBrRXhpdFJlcGxhY2UyMSwKKyAga0V4aXRSZXBsYWNlMzEsCisgIGtFeGl0UmVwbGFjZTMyLAorICBrRXhpdFJlcGxhY2VPZmZzZXQxLAorICBrRXhpdFJlcGxhY2VPZmZzZXQyLAorICBrRXhpdFJlcGxhY2UxUzAsCisgIGtFeGl0U3BlY2lhbCwKKyAga0V4aXREb0FnYWluLAorICBrRXhpdFJlamVjdEFsdCwKKyAga0V4aXROb25lICAgICAgICAgICAgICAgLy8gMjU1Cit9IEV4aXRSZWFzb247CisKKworLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyBvbmUgZW50aXJlIHN0YXRlIHRhYmxlLiBUaGUgdGhyZWUgaW5pdGlhbGl6ZWQgYnl0ZQorLy8gYXJlYXMgYXJlIHN0YXRlX3RhYmxlLCByZW1hcF9iYXNlLCBhbmQgcmVtYXBfc3RyaW5nLiBzdGF0ZTAgYW5kIHN0YXRlMF9zaXplCisvLyBnaXZlIHRoZSBieXRlIG9mZnNldCBhbmQgbGVuZ3RoIHdpdGhpbiBzdGF0ZV90YWJsZSBvZiB0aGUgaW5pdGlhbCBzdGF0ZSAtLQorLy8gdGFibGUgbG9va3VwcyBhcmUgZXhwZWN0ZWQgdG8gc3RhcnQgYW5kIGVuZCBpbiB0aGlzIHN0YXRlLCBidXQgZm9yCisvLyB0cnVuY2F0ZWQgVVRGLTggc3RyaW5ncywgbWF5IGVuZCBpbiBhIGRpZmZlcmVudCBzdGF0ZS4gVGhlc2UgYWxsb3cgYSBxdWljaworLy8gdGVzdCBmb3IgdGhhdCBjb25kaXRpb24uIGVudHJ5X3NoaWZ0IGlzIDggZm9yIHRhYmxlcyBzdWJzY3JpcHRlZCBieSBhIGZ1bGwKKy8vIGJ5dGUgdmFsdWUgYW5kIDYgZm9yIHNwYWNlLW9wdGltaXplZCB0YWJsZXMgc3Vic2NyaXB0ZWQgYnkgb25seSBzaXgKKy8vIHNpZ25pZmljYW50IGJpdHMgaW4gVVRGLTggY29udGludWF0aW9uIGJ5dGVzLgordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB1aW50MzIgc3RhdGUwOworICBjb25zdCB1aW50MzIgc3RhdGUwX3NpemU7CisgIGNvbnN0IHVpbnQzMiB0b3RhbF9zaXplOworICBjb25zdCBpbnQgbWF4X2V4cGFuZDsKKyAgY29uc3QgaW50IGVudHJ5X3NoaWZ0OworICBjb25zdCBpbnQgYnl0ZXNfcGVyX2VudHJ5OworICBjb25zdCB1aW50MzIgbG9zdWI7CisgIGNvbnN0IHVpbnQzMiBoaWFkZDsKKyAgY29uc3QgdWludDgqIHN0YXRlX3RhYmxlOworICBjb25zdCBSZW1hcEVudHJ5KiByZW1hcF9iYXNlOworICBjb25zdCB1aW50OCogcmVtYXBfc3RyaW5nOworICBjb25zdCB1aW50OCogZmFzdF9zdGF0ZTsKK30gVVRGOFN0YXRlTWFjaGluZU9iajsKKwordHlwZWRlZiBVVEY4U3RhdGVNYWNoaW5lT2JqIFVURjhTY2FuT2JqOworCisjZGVmaW5lIFhfXyAoa0V4aXRJbGxlZ2FsU3RydWN0dXJlKQorI2RlZmluZSBSSl8gKGtFeGl0UmVqZWN0KQorI2RlZmluZSBTMV8gKGtFeGl0UmVwbGFjZTEpCisjZGVmaW5lIFMyXyAoa0V4aXRSZXBsYWNlMikKKyNkZWZpbmUgUzNfIChrRXhpdFJlcGxhY2UzKQorI2RlZmluZSBTMjEgKGtFeGl0UmVwbGFjZTIxKQorI2RlZmluZSBTMzEgKGtFeGl0UmVwbGFjZTMxKQorI2RlZmluZSBTMzIgKGtFeGl0UmVwbGFjZTMyKQorI2RlZmluZSBUMV8gKGtFeGl0UmVwbGFjZU9mZnNldDEpCisjZGVmaW5lIFQyXyAoa0V4aXRSZXBsYWNlT2Zmc2V0MikKKyNkZWZpbmUgUzExIChrRXhpdFJlcGxhY2UxUzApCisjZGVmaW5lIFNQXyAoa0V4aXRTcGVjaWFsKQorI2RlZmluZSBEX18gKGtFeGl0RG9BZ2FpbikKKyNkZWZpbmUgUkpBIChrRXhpdFJlamVjdEFsdCkKKworLy8gIEVudGlyZSB0YWJsZSBoYXMgOSBzdGF0ZSBibG9ja3Mgb2YgMjU2IGVudHJpZXMgZWFjaAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TVEFURTAgPSAwOyAgICAgLy8gc3RhdGVbMF0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfU1RBVEUwX1NJWkUgPSAyNTY7ICAvLyA9WzFdCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1RPVEFMX1NJWkUgPSAyMzA0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19NQVhfRVhQQU5EX1g0ID0gMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfU0hJRlQgPSA4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19CWVRFUyA9IDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0xPU1VCID0gMHgyMDIwMjAyMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfSElBREQgPSAweDAwMDAwMDAwOworCitzdGF0aWMgY29uc3QgdWludDggdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNbXSA9IHsKKy8vIHN0YXRlWzBdIDB4MDAwMDAwIEJ5dGUgMQorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKworICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDIsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDcsICAgMywgICAzLAorICA0LCAgIDUsICAgNSwgICA1LCAgIDYsIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworLy8gc3RhdGVbMV0gMHgwMDAwODAgQnl0ZSAyIG9mIDIKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzJdIDB4MDAwMDAwIEJ5dGUgMiBvZiAzCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVszXSAweDAwMTAwMCBCeXRlIDIgb2YgMworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworLy8gc3RhdGVbNF0gMHgwMDAwMDAgQnl0ZSAyIG9mIDQKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAorICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzVdIDB4MDQwMDAwIEJ5dGUgMiBvZiA0CitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAorICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCisgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVs2XSAweDEwMDAwMCBCeXRlIDIgb2YgNAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworLy8gc3RhdGVbN10gMHgwMGQwMDAgQnl0ZSAyIG9mIDMKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwKKyAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzhdIDB4MDBkODAwIEJ5dGUgMyBvZiAzCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLAorUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sICBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywKK1JKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCAgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sCitSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorfTsKKworLy8gUmVtYXAgYmFzZVswXSA9IChkZWwsIGFkZCwgc3RyaW5nX29mZnNldCkKK3N0YXRpYyBjb25zdCBSZW1hcEVudHJ5IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX3JlbWFwX2Jhc2VbXSA9IHsKK3swLCAwLCAwfSB9OworCisvLyBSZW1hcCBzdHJpbmdbMF0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX3JlbWFwX3N0cmluZ1tdID0geworMCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19mYXN0WzI1Nl0gPSB7CiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKworMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKK307CisKK3N0YXRpYyBjb25zdCBVVEY4U2Nhbk9iaiB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19vYmogPSB7CisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NUQVRFMCwKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfU1RBVEUwX1NJWkUsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1RPVEFMX1NJWkUsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX01BWF9FWFBBTkRfWDQsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NISUZULAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19CWVRFUywKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfTE9TVUIsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0hJQURELAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlcywKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfcmVtYXBfYmFzZSwKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfcmVtYXBfc3RyaW5nLAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19mYXN0Cit9OworCisKKyN1bmRlZiBYX18KKyN1bmRlZiBSSl8KKyN1bmRlZiBTMV8KKyN1bmRlZiBTMl8KKyN1bmRlZiBTM18KKyN1bmRlZiBTMjEKKyN1bmRlZiBTMzEKKyN1bmRlZiBTMzIKKyN1bmRlZiBUMV8KKyN1bmRlZiBUMl8KKyN1bmRlZiBTMTEKKyN1bmRlZiBTUF8KKyN1bmRlZiBEX18KKyN1bmRlZiBSSkEKKworLy8gUmV0dXJuIHRydWUgaWYgY3VycmVudCBUYmwgcG9pbnRlciBpcyB3aXRoaW4gc3RhdGUwIHJhbmdlCisvLyBOb3RlIHRoYXQgdW5zaWduZWQgY29tcGFyZSBjaGVja3MgYm90aCBlbmRzIG9mIHJhbmdlIHNpbXVsdGFuZW91c2x5CitzdGF0aWMgaW5saW5lIGJvb2wgSW5TdGF0ZVplcm8oY29uc3QgVVRGOFNjYW5PYmoqIHN0LCBjb25zdCB1aW50OCogVGJsKSB7CisgIGNvbnN0IHVpbnQ4KiBUYmwwID0gJnN0LT5zdGF0ZV90YWJsZVtzdC0+c3RhdGUwXTsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50MzI+KFRibCAtIFRibDApIDwgc3QtPnN0YXRlMF9zaXplKTsKK30KKworLy8gU2NhbiBhIFVURi04IHN0cmluZyBiYXNlZCBvbiBzdGF0ZSB0YWJsZS4KKy8vIEFsd2F5cyBzY2FuIGNvbXBsZXRlIFVURi04IGNoYXJhY3RlcnMKKy8vIFNldCBudW1iZXIgb2YgYnl0ZXMgc2Nhbm5lZC4gUmV0dXJuIHJlYXNvbiBmb3IgZXhpdGluZworaW50IFVURjhHZW5lcmljU2Nhbihjb25zdCBVVEY4U2Nhbk9iaiogc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBzdHIsCisgICAgICAgICAgICAgICAgICAgIGludCBzdHJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBpbnQqIGJ5dGVzX2NvbnN1bWVkKSB7CisgICpieXRlc19jb25zdW1lZCA9IDA7CisgIGlmIChzdHJfbGVuZ3RoID09IDApIHJldHVybiBrRXhpdE9LOworCisgIGludCBlc2hpZnQgPSBzdC0+ZW50cnlfc2hpZnQ7CisgIGNvbnN0IHVpbnQ4KiBpc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHN0cik7CisgIGNvbnN0IHVpbnQ4KiBzcmMgPSBpc3JjOworICBjb25zdCB1aW50OCogc3JjbGltaXQgPSBpc3JjICsgc3RyX2xlbmd0aDsKKyAgY29uc3QgdWludDgqIHNyY2xpbWl0OCA9IHNyY2xpbWl0IC0gNzsKKyAgY29uc3QgdWludDgqIFRibF8wID0gJnN0LT5zdGF0ZV90YWJsZVtzdC0+c3RhdGUwXTsKKworIERvQWdhaW46CisgIC8vIERvIHN0YXRlLXRhYmxlIHNjYW4KKyAgaW50IGUgPSAwOworICB1aW50OCBjOworICBjb25zdCB1aW50OCogVGJsMiA9ICZzdC0+ZmFzdF9zdGF0ZVswXTsKKyAgY29uc3QgdWludDMyIGxvc3ViID0gc3QtPmxvc3ViOworICBjb25zdCB1aW50MzIgaGlhZGQgPSBzdC0+aGlhZGQ7CisgIC8vIENoZWNrIGluaXRpYWwgZmV3IGJ5dGVzIG9uZSBhdCBhIHRpbWUgdW50aWwgOC1ieXRlIGFsaWduZWQKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHdoaWxlICgoKCh1aW50cHRyX3Qpc3JjICYgMHgwNykgIT0gMCkgJiYKKyAgICAgICAgIChzcmMgPCBzcmNsaW1pdCkgJiYKKyAgICAgICAgIFRibDJbc3JjWzBdXSA9PSAwKSB7CisgICAgc3JjKys7CisgIH0KKyAgaWYgKCgodWludHB0cl90KXNyYyAmIDB4MDcpID09IDApIHsKKyAgICAvLyBEbyBmYXN0IGZvciBncm91cHMgb2YgOCBpZGVudGl0eSBieXRlcy4KKyAgICAvLyBUaGlzIGNvdmVycyBhIGxvdCBvZiA3LWJpdCBBU0NJSSB+OHggZmFzdGVyIHRoZW4gdGhlIDEtYnl0ZSBsb29wLAorICAgIC8vIGluY2x1ZGluZyBzbG93aW5nIHNsaWdodGx5IG9uIGNyL2xmL2h0CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd2hpbGUgKHNyYyA8IHNyY2xpbWl0OCkgeworICAgICAgdWludDMyIHMwMTIzID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyICo+KHNyYykpWzBdOworICAgICAgdWludDMyIHM0NTY3ID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyICo+KHNyYykpWzFdOworICAgICAgc3JjICs9IDg7CisgICAgICAvLyBUaGlzIGlzIGEgZmFzdCByYW5nZSBjaGVjayBmb3IgYWxsIGJ5dGVzIGluIFtsb3dzdWIuLjB4ODAtaGlhZGQpCisgICAgICB1aW50MzIgdGVtcCA9IChzMDEyMyAtIGxvc3ViKSB8IChzMDEyMyArIGhpYWRkKSB8CisgICAgICAgICAgICAgICAgICAgIChzNDU2NyAtIGxvc3ViKSB8IChzNDU2NyArIGhpYWRkKTsKKyAgICAgIGlmICgodGVtcCAmIDB4ODA4MDgwODApICE9IDApIHsKKyAgICAgICAgLy8gV2UgdHlwaWNhbGx5IGVuZCB1cCBoZXJlIG9uIGNyL2xmL2h0OyBzcmMgd2FzIGluY3JlbWVudGVkCisgICAgICAgIGludCBlMDEyMyA9IChUYmwyW3NyY1stOF1dIHwgVGJsMltzcmNbLTddXSkgfAorICAgICAgICAgICAgICAgICAgICAoVGJsMltzcmNbLTZdXSB8IFRibDJbc3JjWy01XV0pOworICAgICAgICBpZiAoZTAxMjMgIT0gMCkgeworICAgICAgICAgIHNyYyAtPSA4OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9ICAgIC8vIEV4aXQgb24gTm9uLWludGVyY2hhbmdlCisgICAgICAgIGUwMTIzID0gKFRibDJbc3JjWy00XV0gfCBUYmwyW3NyY1stM11dKSB8CisgICAgICAgICAgICAgICAgKFRibDJbc3JjWy0yXV0gfCBUYmwyW3NyY1stMV1dKTsKKyAgICAgICAgaWYgKGUwMTIzICE9IDApIHsKKyAgICAgICAgICBzcmMgLT0gNDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAvLyBFeGl0IG9uIE5vbi1pbnRlcmNoYW5nZQorICAgICAgICAvLyBFbHNlIE9LLCBnbyBhcm91bmQgYWdhaW4KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQnl0ZS1hdC1hLXRpbWUgc2NhbgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgY29uc3QgdWludDgqIFRibCA9IFRibF8wOworICB3aGlsZSAoc3JjIDwgc3JjbGltaXQpIHsKKyAgICBjID0gKnNyYzsKKyAgICBlID0gVGJsW2NdOworICAgIHNyYysrOworICAgIGlmIChlID49IGtFeGl0SWxsZWdhbFN0cnVjdHVyZSkge2JyZWFrO30KKyAgICBUYmwgPSAmVGJsXzBbZSA8PCBlc2hpZnRdOworICB9CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgLy8gRXhpdCBwb3NpYmlsaXRpZXM6CisgIC8vICBTb21lIGV4aXQgY29kZSwgIXN0YXRlMCwgYmFjayB1cCBvdmVyIGxhc3QgY2hhcgorICAvLyAgU29tZSBleGl0IGNvZGUsIHN0YXRlMCwgYmFjayB1cCBvbmUgYnl0ZSBleGFjdGx5CisgIC8vICBzb3VyY2UgY29uc3VtZWQsICFzdGF0ZTAsIGJhY2sgdXAgb3ZlciBwYXJ0aWFsIGNoYXIKKyAgLy8gIHNvdXJjZSBjb25zdW1lZCwgc3RhdGUwLCBleGl0IE9LCisgIC8vIEZvciBpbGxlZ2FsIGJ5dGUgaW4gc3RhdGUwLCBhdm9pZCBiYWNrdXAgdXAgb3ZlciBQUkVWSU9VUyBjaGFyCisgIC8vIEZvciB0cnVuY2F0ZWQgbGFzdCBjaGFyLCBiYWNrIHVwIHRvIGJlZ2lubmluZyBvZiBpdAorCisgIGlmIChlID49IGtFeGl0SWxsZWdhbFN0cnVjdHVyZSkgeworICAgIC8vIEJhY2sgdXAgb3ZlciBleGFjdGx5IG9uZSBieXRlIG9mIHJlamVjdGVkL2lsbGVnYWwgVVRGLTggY2hhcmFjdGVyCisgICAgc3JjLS07CisgICAgLy8gQmFjayB1cCBtb3JlIGlmIG5lZWRlZAorICAgIGlmICghSW5TdGF0ZVplcm8oc3QsIFRibCkpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgc3JjLS07CisgICAgICB9IHdoaWxlICgoc3JjID4gaXNyYykgJiYgKChzcmNbMF0gJiAweGMwKSA9PSAweDgwKSk7CisgICAgfQorICB9IGVsc2UgaWYgKCFJblN0YXRlWmVybyhzdCwgVGJsKSkgeworICAgIC8vIEJhY2sgdXAgb3ZlciB0cnVuY2F0ZWQgVVRGLTggY2hhcmFjdGVyCisgICAgZSA9IGtFeGl0SWxsZWdhbFN0cnVjdHVyZTsKKyAgICBkbyB7CisgICAgICBzcmMtLTsKKyAgICB9IHdoaWxlICgoc3JjID4gaXNyYykgJiYgKChzcmNbMF0gJiAweGMwKSA9PSAweDgwKSk7CisgIH0gZWxzZSB7CisgICAgLy8gTm9ybWFsIHRlcm1pbmF0aW9uLCBzb3VyY2UgZnVsbHkgY29uc3VtZWQKKyAgICBlID0ga0V4aXRPSzsKKyAgfQorCisgIGlmIChlID09IGtFeGl0RG9BZ2FpbikgeworICAgIC8vIExvb3AgYmFjayB1cCB0byB0aGUgZmFzdCBzY2FuCisgICAgZ290byBEb0FnYWluOworICB9CisKKyAgKmJ5dGVzX2NvbnN1bWVkID0gc3JjIC0gaXNyYzsKKyAgcmV0dXJuIGU7Cit9CisKK2ludCBVVEY4R2VuZXJpY1NjYW5GYXN0QXNjaWkoY29uc3QgVVRGOFNjYW5PYmoqIHN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogc3RyLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBieXRlc19jb25zdW1lZCkgeworICAqYnl0ZXNfY29uc3VtZWQgPSAwOworICBpZiAoc3RyX2xlbmd0aCA9PSAwKSByZXR1cm4ga0V4aXRPSzsKKworICBjb25zdCB1aW50OCogaXNyYyA9ICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oc3RyKTsKKyAgY29uc3QgdWludDgqIHNyYyA9IGlzcmM7CisgIGNvbnN0IHVpbnQ4KiBzcmNsaW1pdCA9IGlzcmMgKyBzdHJfbGVuZ3RoOworICBjb25zdCB1aW50OCogc3JjbGltaXQ4ID0gc3JjbGltaXQgLSA3OworICBpbnQgbjsKKyAgaW50IHJlc3RfY29uc3VtZWQ7CisgIGludCBleGl0X3JlYXNvbjsKKyAgZG8geworICAgIC8vIENoZWNrIGluaXRpYWwgZmV3IGJ5dGVzIG9uZSBhdCBhIHRpbWUgdW50aWwgOC1ieXRlIGFsaWduZWQKKyAgICB3aGlsZSAoKCgodWludHB0cl90KXNyYyAmIDB4MDcpICE9IDApICYmCisgICAgICAgICAgIChzcmMgPCBzcmNsaW1pdCkgJiYgKHNyY1swXSA8IDB4ODApKSB7CisgICAgICBzcmMrKzsKKyAgICB9CisgICAgaWYgKCgodWludHB0cl90KXNyYyAmIDB4MDcpID09IDApIHsKKyAgICAgIHdoaWxlICgoc3JjIDwgc3JjbGltaXQ4KSAmJgorICAgICAgICAgICAgICgoKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyKj4oc3JjKVswXSB8CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIqPihzcmMpWzFdKSAmIDB4ODA4MDgwODApID09IDApKSB7CisgICAgICAgIHNyYyArPSA4OworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoKHNyYyA8IHNyY2xpbWl0KSAmJiAoc3JjWzBdIDwgMHg4MCkpIHsKKyAgICAgIHNyYysrOworICAgIH0KKyAgICAvLyBSdW4gc3RhdGUgdGFibGUgb24gdGhlIHJlc3QKKyAgICBuID0gc3JjIC0gaXNyYzsKKyAgICBleGl0X3JlYXNvbiA9IFVURjhHZW5lcmljU2NhbihzdCwgc3RyICsgbiwgc3RyX2xlbmd0aCAtIG4sICZyZXN0X2NvbnN1bWVkKTsKKyAgICBzcmMgKz0gcmVzdF9jb25zdW1lZDsKKyAgfSB3aGlsZSAoIGV4aXRfcmVhc29uID09IGtFeGl0RG9BZ2FpbiApOworCisgICpieXRlc19jb25zdW1lZCA9IHNyYyAtIGlzcmM7CisgIHJldHVybiBleGl0X3JlYXNvbjsKK30KKworLy8gSGFjazogIE9uIHNvbWUgY29tcGlsZXJzIHRoZSBzdGF0aWMgdGFibGVzIGFyZSBpbml0aWFsaXplZCBhdCBzdGFydHVwLgorLy8gICBXZSBjYW4ndCB1c2UgdGhlbSB1bnRpbCB0aGV5IGFyZSBpbml0aWFsaXplZC4gIEhvd2V2ZXIsIHNvbWUgUHJvdG9jb2wKKy8vICAgQnVmZmVyIHBhcnNpbmcgaGFwcGVucyBhdCBzdGF0aWMgaW5pdCB0aW1lIGFuZCBtYXkgdHJ5IHRvIHZhbGlkYXRlCisvLyAgIFVURi04IHN0cmluZ3MuICBTaW5jZSBVVEYtOCB2YWxpZGF0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nCisvLyAgIGFueXdheSwgd2Ugc2ltcGx5IGFsd2F5cyByZXR1cm4gc3VjY2VzcyBpZiBpbml0aWFsaXphdGlvbiBoYXNuJ3QKKy8vICAgb2NjdXJyZWQgeWV0LgorbmFtZXNwYWNlIHsKKworYm9vbCBtb2R1bGVfaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisKK3N0cnVjdCBJbml0RGV0ZWN0b3IgeworICBJbml0RGV0ZWN0b3IoKSB7CisgICAgbW9kdWxlX2luaXRpYWxpemVkXyA9IHRydWU7CisgIH0KK307CitJbml0RGV0ZWN0b3IgaW5pdF9kZXRlY3RvcjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoY29uc3QgY2hhciogYnVmLCBpbnQgbGVuKSB7CisgIGlmICghbW9kdWxlX2luaXRpYWxpemVkXykgcmV0dXJuIHRydWU7CisgIAorICBpbnQgYnl0ZXNfY29uc3VtZWQgPSAwOworICBVVEY4R2VuZXJpY1NjYW5GYXN0QXNjaWkoJnV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgbGVuLCAmYnl0ZXNfY29uc3VtZWQpOworICByZXR1cm4gKGJ5dGVzX2NvbnN1bWVkID09IGxlbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg4ODg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gQXV0aG9yOiB4cGVuZ0Bnb29nbGUuY29tIChQZXRlciBQZW5nKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCitURVNUKFN0cnVjdHVyYWxseVZhbGlkVGVzdCwgVmFsaWRVVEY4U3RyaW5nKSB7CisgIC8vIE9uIEdDQywgdGhpcyBzdHJpbmcgY2FuIGJlIHdyaXR0ZW4gYXM6CisgIC8vICAgImFiY2QgMTIzNCAtIFx1MjAxNFx1MjAxM1x1MjIxMiIKKyAgLy8gTVNWQyBzZWVtcyB0byBpbnRlcnByZXQgXHUgZGlmZmVyZW50bHkuCisgIHN0cmluZyB2YWxpZF9zdHIoImFiY2QgMTIzNCAtIFwzNDJcMjAwXDIyNFwzNDJcMjAwXDIyM1wzNDJcMjEwXDIyMiAtIHh5ejc4OSIpOworICBFWFBFQ1RfVFJVRShJc1N0cnVjdHVyYWxseVZhbGlkVVRGOCh2YWxpZF9zdHIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHIuc2l6ZSgpKSk7CisgIC8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIHBvaW50ZXIgYWxpZ25tZW50CisgIGZvciAoaW50IGkgPSAxOyBpIDwgODsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgodmFsaWRfc3RyLmRhdGEoKSArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3RyLnNpemUoKSAtIGkpKTsKKyAgfQorfQorCitURVNUKFN0cnVjdHVyYWxseVZhbGlkVGVzdCwgSW52YWxpZFVURjhTdHJpbmcpIHsKKyAgY29uc3Qgc3RyaW5nIGludmFsaWRfc3RyKCJhYmNkXHhBMFx4QjBceEEwXHhCMFx4QTBceEIwIC0geHl6Nzg5Iik7CisgIEVYUEVDVF9GQUxTRShJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChpbnZhbGlkX3N0ci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX3N0ci5zaXplKCkpKTsKKyAgLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgcG9pbnRlciBhbGlnbm1lbnQKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyArK2kpIHsKKyAgICBFWFBFQ1RfRkFMU0UoSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoaW52YWxpZF9zdHIuZGF0YSgpICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9zdHIuc2l6ZSgpIC0gaSkpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3YjNlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjCkBAIC0wLDAgKzEsMTIxMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gZnJvbSBnb29nbGUzL3N0cmluZ3Mvc3RydXRpbC5jYworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+ICAgIC8vIEZMVF9ESUcgYW5kIERCTF9ESUcKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworI2lmZGVmIF9XSU4zMgorLy8gTVNWQyBoYXMgb25seSBfc25wcmludGYsIG5vdCBzbnByaW50Zi4KKy8vCisvLyBNaW5HVyBoYXMgYm90aCBzbnByaW50ZiBhbmQgX3NucHJpbnRmLCBidXQgdGhleSBhcHBlYXIgdG8gYmUgZGlmZmVyZW50CisvLyBmdW5jdGlvbnMuICBUaGUgZm9ybWVyIGlzIGJ1Z2d5LiAgV2hlbiBpbnZva2VkIGxpa2Ugc286CisvLyAgIGNoYXIgYnVmZmVyWzMyXTsKKy8vICAgc25wcmludGYoYnVmZmVyLCAzMiwgIiUuKmdcbiIsIEZMVF9ESUcsIDEuMjNlMTBmKTsKKy8vIGl0IHByaW50cyAiMS4yMzAwMGUrMTAiLiAgVGhpcyBpcyBwbGFpbmx5IHdyb25nOiAgJWcgc2hvdWxkIG5ldmVyIHByaW50CisvLyB0cmFpbGluZyB6ZXJvcyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gIEZvciBzb21lIHJlYXNvbiB0aGlzIGJ1ZyBvbmx5CisvLyBvY2N1cnMgd2l0aCBzb21lIGlucHV0IHZhbHVlcywgbm90IGFsbC4gIEluIGFueSBjYXNlLCBfc25wcmludGYgZG9lcyB0aGUKKy8vIHJpZ2h0IHRoaW5nLCBzbyB3ZSB1c2UgaXQuCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworaW5saW5lIGJvb2wgSXNOYU4oZG91YmxlIHZhbHVlKSB7CisgIC8vIE5hTiBpcyBuZXZlciBlcXVhbCB0byBhbnl0aGluZywgZXZlbiBpdHNlbGYuCisgIHJldHVybiB2YWx1ZSAhPSB2YWx1ZTsKK30KKworLy8gVGhlc2UgYXJlIGRlZmluZWQgYXMgbWFjcm9zIG9uIHNvbWUgcGxhdGZvcm1zLiAgI3VuZGVmIHRoZW0gc28gdGhhdCB3ZSBjYW4KKy8vIHJlZGVmaW5lIHRoZW0uCisjdW5kZWYgaXN4ZGlnaXQKKyN1bmRlZiBpc3ByaW50CisKKy8vIFRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBpbiBjdHlwZS5oIGNoYW5nZSBiYXNlZCBvbiBsb2NhbGUuICBTaW5jZSBvdXIKKy8vIHN0cmluZyBtYW5pcHVsYXRpb24gaXMgYWxsIGluIHJlbGF0aW9uIHRvIHRoZSBwcm90b2NvbCBidWZmZXIgYW5kIEMrKworLy8gbGFuZ3VhZ2VzLCB3ZSBhbHdheXMgd2FudCB0byB1c2UgdGhlIEMgbG9jYWxlLiAgU28sIHdlIHJlLWRlZmluZSB0aGVzZQorLy8gZXhhY3RseSBhcyB3ZSB3YW50IHRoZW0uCitpbmxpbmUgYm9vbCBpc3hkaWdpdChjaGFyIGMpIHsKKyAgcmV0dXJuICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwKKyAgICAgICAgICgnYScgPD0gYyAmJiBjIDw9ICdmJykgfHwKKyAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdGJyk7Cit9CisKK2lubGluZSBib29sIGlzcHJpbnQoY2hhciBjKSB7CisgIHJldHVybiBjID49IDB4MjAgJiYgYyA8PSAweDdFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpcFN0cmluZworLy8gICAgUmVwbGFjZXMgYW55IG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3RlciAncmVtb3ZlJyAob3IgdGhlIGNoYXJhY3RlcnMKKy8vICAgIGluICdyZW1vdmUnKSB3aXRoIHRoZSBjaGFyYWN0ZXIgJ3JlcGxhY2V3aXRoJy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgU3RyaXBTdHJpbmcoc3RyaW5nKiBzLCBjb25zdCBjaGFyKiByZW1vdmUsIGNoYXIgcmVwbGFjZXdpdGgpIHsKKyAgY29uc3QgY2hhciAqIHN0cl9zdGFydCA9IHMtPmNfc3RyKCk7CisgIGNvbnN0IGNoYXIgKiBzdHIgPSBzdHJfc3RhcnQ7CisgIGZvciAoc3RyID0gc3RycGJyayhzdHIsIHJlbW92ZSk7CisgICAgICAgc3RyICE9IE5VTEw7CisgICAgICAgc3RyID0gc3RycGJyayhzdHIgKyAxLCByZW1vdmUpKSB7CisgICAgKCpzKVtzdHIgLSBzdHJfc3RhcnRdID0gcmVwbGFjZXdpdGg7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaW5nUmVwbGFjZSgpCisvLyAgICBSZXBsYWNlIHRoZSAib2xkIiBwYXR0ZXJuIHdpdGggdGhlICJuZXciIHBhdHRlcm4gaW4gYSBzdHJpbmcsCisvLyAgICBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gInJlcyIuICBJZiByZXBsYWNlX2FsbCBpcyBmYWxzZSwKKy8vICAgIGl0IG9ubHkgcmVwbGFjZXMgdGhlIGZpcnN0IGluc3RhbmNlIG9mICJvbGQuIgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFN0cmluZ1JlcGxhY2UoY29uc3Qgc3RyaW5nJiBzLCBjb25zdCBzdHJpbmcmIG9sZHN1YiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5ld3N1YiwgYm9vbCByZXBsYWNlX2FsbCwKKyAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHJlcykgeworICBpZiAob2xkc3ViLmVtcHR5KCkpIHsKKyAgICByZXMtPmFwcGVuZChzKTsgIC8vIGlmIGVtcHR5LCBhcHBlbmQgdGhlIGdpdmVuIHN0cmluZy4KKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmc6OnNpemVfdHlwZSBzdGFydF9wb3MgPSAwOworICBzdHJpbmc6OnNpemVfdHlwZSBwb3M7CisgIGRvIHsKKyAgICBwb3MgPSBzLmZpbmQob2xkc3ViLCBzdGFydF9wb3MpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmVzLT5hcHBlbmQocywgc3RhcnRfcG9zLCBwb3MgLSBzdGFydF9wb3MpOworICAgIHJlcy0+YXBwZW5kKG5ld3N1Yik7CisgICAgc3RhcnRfcG9zID0gcG9zICsgb2xkc3ViLnNpemUoKTsgIC8vIHN0YXJ0IHNlYXJjaGluZyBhZ2FpbiBhZnRlciB0aGUgIm9sZCIKKyAgfSB3aGlsZSAocmVwbGFjZV9hbGwpOworICByZXMtPmFwcGVuZChzLCBzdGFydF9wb3MsIHMubGVuZ3RoKCkgLSBzdGFydF9wb3MpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpbmdSZXBsYWNlKCkKKy8vICAgIEdpdmUgbWUgYSBzdHJpbmcgYW5kIHR3byBwYXR0ZXJucyAib2xkIiBhbmQgIm5ldyIsIGFuZCBJIHJlcGxhY2UKKy8vICAgIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAib2xkIiBpbiB0aGUgc3RyaW5nIHdpdGggIm5ldyIsIGlmIGl0CisvLyAgICBleGlzdHMuICBJZiAiZ2xvYmFsIiBpcyB0cnVlOyBjYWxsIHRoaXMgcmVwZWF0ZWRseSB1bnRpbCBpdAorLy8gICAgZmFpbHMuICBSRVRVUk4gYSBuZXcgc3RyaW5nLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHJlcGxhY2VtZW50CisvLyAgICBoYXBwZW5lZCBvciBub3QuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cmluZyBTdHJpbmdSZXBsYWNlKGNvbnN0IHN0cmluZyYgcywgY29uc3Qgc3RyaW5nJiBvbGRzdWIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5ld3N1YiwgYm9vbCByZXBsYWNlX2FsbCkgeworICBzdHJpbmcgcmV0OworICBTdHJpbmdSZXBsYWNlKHMsIG9sZHN1YiwgbmV3c3ViLCByZXBsYWNlX2FsbCwgJnJldCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNwbGl0U3RyaW5nVXNpbmcoKQorLy8gICAgU3BsaXQgYSBzdHJpbmcgdXNpbmcgYSBjaGFyYWN0ZXIgZGVsaW1pdGVyLiBBcHBlbmQgdGhlIGNvbXBvbmVudHMKKy8vICAgIHRvICdyZXN1bHQnLgorLy8KKy8vIE5vdGU6IEZvciBtdWx0aS1jaGFyYWN0ZXIgZGVsaW1pdGVycywgdGhpcyByb3V0aW5lIHdpbGwgc3BsaXQgb24gKkFOWSogb2YKKy8vIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIG5vdCB0aGUgZW50aXJlIHN0cmluZyBhcyBhIHNpbmdsZSBkZWxpbWl0ZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVRSPgorc3RhdGljIGlubGluZQordm9pZCBTcGxpdFN0cmluZ1RvSXRlcmF0b3JVc2luZyhjb25zdCBzdHJpbmcmIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFImIHJlc3VsdCkgeworICAvLyBPcHRpbWl6ZSB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgZGVsaW0gaXMgYSBzaW5nbGUgY2hhcmFjdGVyLgorICBpZiAoZGVsaW1bMF0gIT0gJ1wwJyAmJiBkZWxpbVsxXSA9PSAnXDAnKSB7CisgICAgY2hhciBjID0gZGVsaW1bMF07CisgICAgY29uc3QgY2hhciogcCA9IGZ1bGwuZGF0YSgpOworICAgIGNvbnN0IGNoYXIqIGVuZCA9IHAgKyBmdWxsLnNpemUoKTsKKyAgICB3aGlsZSAocCAhPSBlbmQpIHsKKyAgICAgIGlmICgqcCA9PSBjKSB7CisgICAgICAgICsrcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gcDsKKyAgICAgICAgd2hpbGUgKCsrcCAhPSBlbmQgJiYgKnAgIT0gYyk7CisgICAgICAgICpyZXN1bHQrKyA9IHN0cmluZyhzdGFydCwgcCAtIHN0YXJ0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgYmVnaW5faW5kZXgsIGVuZF9pbmRleDsKKyAgYmVnaW5faW5kZXggPSBmdWxsLmZpbmRfZmlyc3Rfbm90X29mKGRlbGltKTsKKyAgd2hpbGUgKGJlZ2luX2luZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgIGVuZF9pbmRleCA9IGZ1bGwuZmluZF9maXJzdF9vZihkZWxpbSwgYmVnaW5faW5kZXgpOworICAgIGlmIChlbmRfaW5kZXggPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAqcmVzdWx0KysgPSBmdWxsLnN1YnN0cihiZWdpbl9pbmRleCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgICpyZXN1bHQrKyA9IGZ1bGwuc3Vic3RyKGJlZ2luX2luZGV4LCAoZW5kX2luZGV4IC0gYmVnaW5faW5kZXgpKTsKKyAgICBiZWdpbl9pbmRleCA9IGZ1bGwuZmluZF9maXJzdF9ub3Rfb2YoZGVsaW0sIGVuZF9pbmRleCk7CisgIH0KK30KKwordm9pZCBTcGxpdFN0cmluZ1VzaW5nKGNvbnN0IHN0cmluZyYgZnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwKKyAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogcmVzdWx0KSB7CisgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPCB2ZWN0b3I8c3RyaW5nPiA+IGl0KCpyZXN1bHQpOworICBTcGxpdFN0cmluZ1RvSXRlcmF0b3JVc2luZyhmdWxsLCBkZWxpbSwgaXQpOworfQorCisvLyBTcGxpdCBhIHN0cmluZyB1c2luZyBhIGNoYXJhY3RlciBkZWxpbWl0ZXIuIEFwcGVuZCB0aGUgY29tcG9uZW50cworLy8gdG8gJ3Jlc3VsdCcuICBJZiB0aGVyZSBhcmUgY29uc2VjdXRpdmUgZGVsaW1pdGVycywgdGhpcyBmdW5jdGlvbgorLy8gd2lsbCByZXR1cm4gY29ycmVzcG9uZGluZyBlbXB0eSBzdHJpbmdzLiBUaGUgc3RyaW5nIGlzIHNwbGl0IGludG8KKy8vIGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGllY2VzIGdyZWVkaWx5LiBUaGlzIG1lYW5zIHRoYXQgdGhlCisvLyBsYXN0IHBpZWNlIG1heSBwb3NzaWJseSBiZSBzcGxpdCBmdXJ0aGVyLiBUbyBzcGxpdCBpbnRvIGFzIG1hbnkgcGllY2VzCisvLyBhcyBwb3NzaWJsZSwgc3BlY2lmeSAwIGFzIHRoZSBudW1iZXIgb2YgcGllY2VzLgorLy8KKy8vIElmICJmdWxsIiBpcyB0aGUgZW1wdHkgc3RyaW5nLCB5aWVsZHMgYW4gZW1wdHkgc3RyaW5nIGFzIHRoZSBvbmx5IHZhbHVlLgorLy8KKy8vIElmICJwaWVjZXMiIGlzIG5lZ2F0aXZlIGZvciBzb21lIHJlYXNvbiwgaXQgcmV0dXJucyB0aGUgd2hvbGUgc3RyaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZSwgdHlwZW5hbWUgSVRSPgorc3RhdGljIGlubGluZQordm9pZCBTcGxpdFN0cmluZ1RvSXRlcmF0b3JBbGxvd0VtcHR5KGNvbnN0IFN0cmluZ1R5cGUmIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFImIHJlc3VsdCkgeworICBzdHJpbmc6OnNpemVfdHlwZSBiZWdpbl9pbmRleCwgZW5kX2luZGV4OworICBiZWdpbl9pbmRleCA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IChpIDwgcGllY2VzLTEpIHx8IChwaWVjZXMgPT0gMCk7IGkrKykgeworICAgIGVuZF9pbmRleCA9IGZ1bGwuZmluZF9maXJzdF9vZihkZWxpbSwgYmVnaW5faW5kZXgpOworICAgIGlmIChlbmRfaW5kZXggPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAqcmVzdWx0KysgPSBmdWxsLnN1YnN0cihiZWdpbl9pbmRleCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgICpyZXN1bHQrKyA9IGZ1bGwuc3Vic3RyKGJlZ2luX2luZGV4LCAoZW5kX2luZGV4IC0gYmVnaW5faW5kZXgpKTsKKyAgICBiZWdpbl9pbmRleCA9IGVuZF9pbmRleCArIDE7CisgIH0KKyAgKnJlc3VsdCsrID0gZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgpOworfQorCit2b2lkIFNwbGl0U3RyaW5nQWxsb3dFbXB0eShjb25zdCBzdHJpbmcmIGZ1bGwsIGNvbnN0IGNoYXIqIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIHJlc3VsdCkgeworICBiYWNrX2luc2VydF9pdGVyYXRvcjx2ZWN0b3I8c3RyaW5nPiA+IGl0KCpyZXN1bHQpOworICBTcGxpdFN0cmluZ1RvSXRlcmF0b3JBbGxvd0VtcHR5KGZ1bGwsIGRlbGltLCAwLCBpdCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpvaW5TdHJpbmdzKCkKKy8vICAgIFRoaXMgbWVyZ2VzIGEgdmVjdG9yIG9mIHN0cmluZyBjb21wb25lbnRzIHdpdGggZGVsaW0gaW5zZXJ0ZWQKKy8vICAgIGFzIHNlcGFyYXRlcnMgYmV0d2VlbiBjb21wb25lbnRzLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RlbXBsYXRlIDxjbGFzcyBJVEVSQVRPUj4KK3N0YXRpYyB2b2lkIEpvaW5TdHJpbmdzSXRlcmF0b3IoY29uc3QgSVRFUkFUT1ImIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJVEVSQVRPUiYgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiByZXN1bHQpIHsKKyAgR09PR0xFX0NIRUNLKHJlc3VsdCAhPSBOVUxMKTsKKyAgcmVzdWx0LT5jbGVhcigpOworICBpbnQgZGVsaW1fbGVuZ3RoID0gc3RybGVuKGRlbGltKTsKKworICAvLyBQcmVjb21wdXRlIHJlc3VsdGluZyBsZW5ndGggc28gd2UgY2FuIHJlc2VydmUoKSBtZW1vcnkgaW4gb25lIHNob3QuCisgIGludCBsZW5ndGggPSAwOworICBmb3IgKElURVJBVE9SIGl0ZXIgPSBzdGFydDsgaXRlciAhPSBlbmQ7ICsraXRlcikgeworICAgIGlmIChpdGVyICE9IHN0YXJ0KSB7CisgICAgICBsZW5ndGggKz0gZGVsaW1fbGVuZ3RoOworICAgIH0KKyAgICBsZW5ndGggKz0gaXRlci0+c2l6ZSgpOworICB9CisgIHJlc3VsdC0+cmVzZXJ2ZShsZW5ndGgpOworCisgIC8vIE5vdyBjb21iaW5lIGV2ZXJ5dGhpbmcuCisgIGZvciAoSVRFUkFUT1IgaXRlciA9IHN0YXJ0OyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgaWYgKGl0ZXIgIT0gc3RhcnQpIHsKKyAgICAgIHJlc3VsdC0+YXBwZW5kKGRlbGltLCBkZWxpbV9sZW5ndGgpOworICAgIH0KKyAgICByZXN1bHQtPmFwcGVuZChpdGVyLT5kYXRhKCksIGl0ZXItPnNpemUoKSk7CisgIH0KK30KKwordm9pZCBKb2luU3RyaW5ncyhjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgIHN0cmluZyAqIHJlc3VsdCkgeworICBKb2luU3RyaW5nc0l0ZXJhdG9yKGNvbXBvbmVudHMuYmVnaW4oKSwgY29tcG9uZW50cy5lbmQoKSwgZGVsaW0sIHJlc3VsdCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcygpCisvLyAgICBUaGlzIGRvZXMgYWxsIHRoZSB1bmVzY2FwaW5nIHRoYXQgQyBkb2VzOiBcb29vLCBcciwgXG4sIGV0YworLy8gICAgUmV0dXJucyBsZW5ndGggb2YgcmVzdWx0aW5nIHN0cmluZy4KKy8vICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBceCBwYXJzZXMgYW55IHBvc2l0aXZlIG51bWJlciBvZiBoZXggZGlnaXRzLAorLy8gICAgYnV0IGl0IGlzIGFuIGVycm9yIGlmIHRoZSB2YWx1ZSByZXF1aXJlcyBtb3JlIHRoYW4gOCBiaXRzLCBhbmQgdGhlCisvLyAgICByZXN1bHQgaXMgdHJ1bmNhdGVkIHRvIDggYml0cy4KKy8vCisvLyAgICBUaGUgc2Vjb25kIGNhbGwgc3RvcmVzIGl0cyBlcnJvcnMgaW4gYSBzdXBwbGllZCBzdHJpbmcgdmVjdG9yLgorLy8gICAgSWYgdGhlIHN0cmluZyB2ZWN0b3IgcG9pbnRlciBpcyBOVUxMLCBpdCByZXBvcnRzIHRoZSBlcnJvcnMgd2l0aCBMT0coKS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJU19PQ1RBTF9ESUdJVChjKSAoKChjKSA+PSAnMCcpICYmICgoYykgPD0gJzcnKSkKKworaW5saW5lIGludCBoZXhfZGlnaXRfdG9faW50KGNoYXIgYykgeworICAvKiBBc3N1bWUgQVNDSUkuICovCisgIGFzc2VydCgnMCcgPT0gMHgzMCAmJiAnQScgPT0gMHg0MSAmJiAnYScgPT0gMHg2MSk7CisgIGFzc2VydChpc3hkaWdpdChjKSk7CisgIGludCB4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyk7CisgIGlmICh4ID4gJzknKSB7CisgICAgeCArPSA5OworICB9CisgIHJldHVybiB4ICYgMHhmOworfQorCisvLyBQcm90b2NvbCBidWZmZXJzIGRvZXNuJ3QgZXZlciBjYXJlIGFib3V0IGVycm9ycywgYnV0IEkgZG9uJ3Qgd2FudCB0byByZW1vdmUKKy8vIHRoZSBjb2RlLgorI2RlZmluZSBMT0dfU1RSSU5HKExFVkVMLCBWRUNUT1IpIEdPT0dMRV9MT0dfSUYoTEVWRUwsIGZhbHNlKQorCitpbnQgVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKGNvbnN0IGNoYXIqIHNvdXJjZSwgY2hhciogZGVzdCkgeworICByZXR1cm4gVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKHNvdXJjZSwgZGVzdCwgTlVMTCk7Cit9CisKK2ludCBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoY29uc3QgY2hhciogc291cmNlLCBjaGFyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiAqZXJyb3JzKSB7CisgIEdPT0dMRV9EQ0hFQ0soZXJyb3JzID09IE5VTEwpIDw8ICJFcnJvciByZXBvcnRpbmcgbm90IGltcGxlbWVudGVkLiI7CisKKyAgY2hhciogZCA9IGRlc3Q7CisgIGNvbnN0IGNoYXIqIHAgPSBzb3VyY2U7CisKKyAgLy8gU21hbGwgb3B0aW1pemF0aW9uIGZvciBjYXNlIHdoZXJlIHNvdXJjZSA9IGRlc3QgYW5kIHRoZXJlJ3Mgbm8gZXNjYXBpbmcKKyAgd2hpbGUgKCBwID09IGQgJiYgKnAgIT0gJ1wwJyAmJiAqcCAhPSAnXFwnICkKKyAgICBwKyssIGQrKzsKKworICB3aGlsZSAoKnAgIT0gJ1wwJykgeworICAgIGlmICgqcCAhPSAnXFwnKSB7CisgICAgICAqZCsrID0gKnArKzsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICggKisrcCApIHsgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgcGFzdCB0aGUgJ1xcJworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiU3RyaW5nIGNhbm5vdCBlbmQgd2l0aCBcXCI7CisgICAgICAgICAgKmQgPSAnXDAnOworICAgICAgICAgIHJldHVybiBkIC0gZGVzdDsgICAvLyB3ZSdyZSBkb25lIHdpdGggcAorICAgICAgICBjYXNlICdhJzogICpkKysgPSAnXGEnOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2InOiAgKmQrKyA9ICdcYic7ICBicmVhazsKKyAgICAgICAgY2FzZSAnZic6ICAqZCsrID0gJ1xmJzsgIGJyZWFrOworICAgICAgICBjYXNlICduJzogICpkKysgPSAnXG4nOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOiAgKmQrKyA9ICdccic7ICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6ICAqZCsrID0gJ1x0JzsgIGJyZWFrOworICAgICAgICBjYXNlICd2JzogICpkKysgPSAnXHYnOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xcJzogKmQrKyA9ICdcXCc7ICBicmVhazsKKyAgICAgICAgY2FzZSAnPyc6ICAqZCsrID0gJ1w/JzsgIGJyZWFrOyAgICAvLyBcPyAgV2hvIGtuZXc/CisgICAgICAgIGNhc2UgJ1wnJzogKmQrKyA9ICdcJyc7ICBicmVhazsKKyAgICAgICAgY2FzZSAnIic6ICAqZCsrID0gJ1wiJzsgIGJyZWFrOworICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogIC8vIG9jdGFsIGRpZ2l0OiAxIHRvIDMgZGlnaXRzCisgICAgICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiB7CisgICAgICAgICAgY2hhciBjaCA9ICpwIC0gJzAnOworICAgICAgICAgIGlmICggSVNfT0NUQUxfRElHSVQocFsxXSkgKQorICAgICAgICAgICAgY2ggPSBjaCAqIDggKyAqKytwIC0gJzAnOworICAgICAgICAgIGlmICggSVNfT0NUQUxfRElHSVQocFsxXSkgKSAgICAgIC8vIHNhZmUgKGFuZCBlYXN5KSB0byBkbyB0aGlzIHR3aWNlCisgICAgICAgICAgICBjaCA9IGNoICogOCArICorK3AgLSAnMCc7ICAgICAgLy8gbm93IHBvaW50cyBhdCBsYXN0IGRpZ2l0CisgICAgICAgICAgKmQrKyA9IGNoOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ3gnOiBjYXNlICdYJzogeworICAgICAgICAgIGlmICghaXN4ZGlnaXQocFsxXSkpIHsKKyAgICAgICAgICAgIGlmIChwWzFdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiU3RyaW5nIGNhbm5vdCBlbmQgd2l0aCBcXHgiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PAorICAgICAgICAgICAgICAgICJcXHggY2Fubm90IGJlIGZvbGxvd2VkIGJ5IG5vbi1oZXggZGlnaXQ6IFxcIiA8PCAqcCA8PCBwWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHVuc2lnbmVkIGludCBjaCA9IDA7CisgICAgICAgICAgY29uc3QgY2hhciAqaGV4X3N0YXJ0ID0gcDsKKyAgICAgICAgICB3aGlsZSAoaXN4ZGlnaXQocFsxXSkpICAvLyBhcmJpdHJhcmlseSBtYW55IGhleCBkaWdpdHMKKyAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgaGV4X2RpZ2l0X3RvX2ludCgqKytwKTsKKyAgICAgICAgICBpZiAoY2ggPiAweEZGKQorICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiVmFsdWUgb2YgIiA8PAorICAgICAgICAgICAgICAiXFwiIDw8IHN0cmluZyhoZXhfc3RhcnQsIHArMS1oZXhfc3RhcnQpIDw8ICIgZXhjZWVkcyA4IGJpdHMiOworICAgICAgICAgICpkKysgPSBjaDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmIDAgIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgXHUgYW5kIFxVPyAgUmVxdWlyZXMgcnVuZXRvY2hhcigpLgorICAgICAgICBjYXNlICd1JzogeworICAgICAgICAgIC8vIFx1aGhoaCA9PiBjb252ZXJ0IDQgaGV4IGRpZ2l0cyB0byBVVEYtOAorICAgICAgICAgIGNoYXIzMiBydW5lID0gMDsKKyAgICAgICAgICBjb25zdCBjaGFyICpoZXhfc3RhcnQgPSBwOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBpZiAoaXN4ZGlnaXQocFsxXSkpIHsgIC8vIExvb2sgb25lIGNoYXIgYWhlYWQuCisgICAgICAgICAgICAgIHJ1bmUgPSAocnVuZSA8PCA0KSArIGhleF9kaWdpdF90b19pbnQoKisrcCk7ICAvLyBBZHZhbmNlIHAuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpCisgICAgICAgICAgICAgICAgPDwgIlxcdSBtdXN0IGJlIGZvbGxvd2VkIGJ5IDQgaGV4IGRpZ2l0czogXFwiCisgICAgICAgICAgICAgICAgPDwgIHN0cmluZyhoZXhfc3RhcnQsIHArMS1oZXhfc3RhcnQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZCArPSBydW5ldG9jaGFyKGQsICZydW5lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICdVJzogeworICAgICAgICAgIC8vIFxVaGhoaGhoaGggPT4gY29udmVydCA4IGhleCBkaWdpdHMgdG8gVVRGLTgKKyAgICAgICAgICBjaGFyMzIgcnVuZSA9IDA7CisgICAgICAgICAgY29uc3QgY2hhciAqaGV4X3N0YXJ0ID0gcDsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICAgICAgaWYgKGlzeGRpZ2l0KHBbMV0pKSB7ICAvLyBMb29rIG9uZSBjaGFyIGFoZWFkLgorICAgICAgICAgICAgICAvLyBEb24ndCBjaGFuZ2UgcnVuZSB1bnRpbCB3ZSdyZSBzdXJlIHRoaXMKKyAgICAgICAgICAgICAgLy8gaXMgd2l0aGluIHRoZSBVbmljb2RlIGxpbWl0LCBidXQgZG8gYWR2YW5jZSBwLgorICAgICAgICAgICAgICBjaGFyMzIgbmV3cnVuZSA9IChydW5lIDw8IDQpICsgaGV4X2RpZ2l0X3RvX2ludCgqKytwKTsKKyAgICAgICAgICAgICAgaWYgKG5ld3J1bmUgPiAweDEwRkZGRikgeworICAgICAgICAgICAgICAgIExPR19TVFJJTkcoRVJST1IsIGVycm9ycykKKyAgICAgICAgICAgICAgICAgIDw8ICJWYWx1ZSBvZiBcXCIKKyAgICAgICAgICAgICAgICAgIDw8IHN0cmluZyhoZXhfc3RhcnQsIHAgKyAxIC0gaGV4X3N0YXJ0KQorICAgICAgICAgICAgICAgICAgPDwgIiBleGNlZWRzIFVuaWNvZGUgbGltaXQgKDB4MTBGRkZGKSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVuZSA9IG5ld3J1bmU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIExPR19TVFJJTkcoRVJST1IsIGVycm9ycykKKyAgICAgICAgICAgICAgICA8PCAiXFxVIG11c3QgYmUgZm9sbG93ZWQgYnkgOCBoZXggZGlnaXRzOiBcXCIKKyAgICAgICAgICAgICAgICA8PCAgc3RyaW5nKGhleF9zdGFydCwgcCsxLWhleF9zdGFydCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBkICs9IHJ1bmV0b2NoYXIoZCwgJnJ1bmUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpIDw8ICJVbmtub3duIGVzY2FwZSBzZXF1ZW5jZTogXFwiIDw8ICpwOworICAgICAgfQorICAgICAgcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcGFzdCBsZXR0ZXIgd2UgZXNjYXBlZAorICAgIH0KKyAgfQorICAqZCA9ICdcMCc7CisgIHJldHVybiBkIC0gZGVzdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5lc2NhcGVDRXNjYXBlU3RyaW5nKCkKKy8vICAgIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMsIGJ1dCBjcmVhdGVzCisvLyAgICBhIG5ldyBzdHJpbmcuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBhbGxvY2F0aW5nCisvLyAgICBhIGRlc3QgYnVmZmVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBub24gcGVyZm9ybWFuY2UgY3JpdGljYWwKKy8vICAgIHRhc2tzIHN1Y2ggYXMgcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMuIEl0IGlzIHNhZmUgZm9yIHNyYyBhbmQgZGVzdAorLy8gICAgdG8gYmUgdGhlIHNhbWUuCisvLworLy8gICAgVGhlIHNlY29uZCBjYWxsIHN0b3JlcyBpdHMgZXJyb3JzIGluIGEgc3VwcGxpZWQgc3RyaW5nIHZlY3Rvci4KKy8vICAgIElmIHRoZSBzdHJpbmcgdmVjdG9yIHBvaW50ZXIgaXMgTlVMTCwgaXQgcmVwb3J0cyB0aGUgZXJyb3JzIHdpdGggTE9HKCkuCisvLworLy8gICAgSW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbHMsIHRoZSBsZW5ndGggb2YgZGVzdCBpcyByZXR1cm5lZC4gSW4gdGhlCisvLyAgICB0aGUgdGhpcmQgY2FsbCwgdGhlIG5ldyBzdHJpbmcgaXMgcmV0dXJuZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjLCBzdHJpbmcqIGRlc3QpIHsKKyAgcmV0dXJuIFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhzcmMsIGRlc3QsIE5VTEwpOworfQorCitpbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjLCBzdHJpbmcqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+ICplcnJvcnMpIHsKKyAgc2NvcGVkX2FycmF5PGNoYXI+IHVuZXNjYXBlZChuZXcgY2hhcltzcmMuc2l6ZSgpICsgMV0pOworICBpbnQgbGVuID0gVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKHNyYy5jX3N0cigpLCB1bmVzY2FwZWQuZ2V0KCksIGVycm9ycyk7CisgIEdPT0dMRV9DSEVDSyhkZXN0KTsKKyAgZGVzdC0+YXNzaWduKHVuZXNjYXBlZC5nZXQoKSwgbGVuKTsKKyAgcmV0dXJuIGxlbjsKK30KKworc3RyaW5nIFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdHJpbmcmIHNyYykgeworICBzY29wZWRfYXJyYXk8Y2hhcj4gdW5lc2NhcGVkKG5ldyBjaGFyW3NyYy5zaXplKCkgKyAxXSk7CisgIGludCBsZW4gPSBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoc3JjLmNfc3RyKCksIHVuZXNjYXBlZC5nZXQoKSwgTlVMTCk7CisgIHJldHVybiBzdHJpbmcodW5lc2NhcGVkLmdldCgpLCBsZW4pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDRXNjYXBlU3RyaW5nKCkKKy8vIENIZXhFc2NhcGVTdHJpbmcoKQorLy8gICAgQ29waWVzICdzcmMnIHRvICdkZXN0JywgZXNjYXBpbmcgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMgdXNpbmcKKy8vICAgIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcy4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgcHJlcGFyaW5nIHF1ZXJ5CisvLyAgICBmbGFncy4gJ3NyYycgYW5kICdkZXN0JyBzaG91bGQgbm90IG92ZXJsYXAuIFRoZSAnSGV4JyB2ZXJzaW9uIHVzZXMKKy8vICAgIGhleGFkZWNpbWFsIHJhdGhlciB0aGFuIG9jdGFsIHNlcXVlbmNlcy4KKy8vICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvICdkZXN0JyAobm90IGluY2x1ZGluZyB0aGUgXDApCisvLyAgICBvciAtMSBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IHNwYWNlLgorLy8KKy8vICAgIEN1cnJlbnRseSBvbmx5IFxuLCBcciwgXHQsICIsICcsIFwgYW5kICFpc3ByaW50KCkgY2hhcnMgYXJlIGVzY2FwZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgQ0VzY2FwZUludGVybmFsKGNvbnN0IGNoYXIqIHNyYywgaW50IHNyY19sZW4sIGNoYXIqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlbiwgYm9vbCB1c2VfaGV4LCBib29sIHV0Zjhfc2FmZSkgeworICBjb25zdCBjaGFyKiBzcmNfZW5kID0gc3JjICsgc3JjX2xlbjsKKyAgaW50IHVzZWQgPSAwOworICBib29sIGxhc3RfaGV4X2VzY2FwZSA9IGZhbHNlOyAvLyB0cnVlIGlmIGxhc3Qgb3V0cHV0IGNoYXIgd2FzIFx4Tk4KKworICBmb3IgKDsgc3JjIDwgc3JjX2VuZDsgc3JjKyspIHsKKyAgICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgMikgICAvLyBOZWVkIHNwYWNlIGZvciB0d28gbGV0dGVyIGVzY2FwZQorICAgICAgcmV0dXJuIC0xOworCisgICAgYm9vbCBpc19oZXhfZXNjYXBlID0gZmFsc2U7CisgICAgc3dpdGNoICgqc3JjKSB7CisgICAgICBjYXNlICdcbic6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICduJzsgIGJyZWFrOworICAgICAgY2FzZSAnXHInOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAncic7ICBicmVhazsKKyAgICAgIGNhc2UgJ1x0JzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ3QnOyAgYnJlYWs7CisgICAgICBjYXNlICdcIic6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICdcIic7IGJyZWFrOworICAgICAgY2FzZSAnXCcnOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAnXCcnOyBicmVhazsKKyAgICAgIGNhc2UgJ1xcJzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ1xcJzsgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBOb3RlIHRoYXQgaWYgd2UgZW1pdCBceE5OIGFuZCB0aGUgc3JjIGNoYXJhY3RlciBhZnRlciB0aGF0IGlzIGEgaGV4CisgICAgICAgIC8vIGRpZ2l0IHRoZW4gdGhhdCBkaWdpdCBtdXN0IGJlIGVzY2FwZWQgdG9vIHRvIHByZXZlbnQgaXQgYmVpbmcKKyAgICAgICAgLy8gaW50ZXJwcmV0ZWQgYXMgcGFydCBvZiB0aGUgY2hhcmFjdGVyIGNvZGUgYnkgQy4KKyAgICAgICAgaWYgKCghdXRmOF9zYWZlIHx8IHN0YXRpY19jYXN0PHVpbnQ4Pigqc3JjKSA8IDB4ODApICYmCisgICAgICAgICAgICAoIWlzcHJpbnQoKnNyYykgfHwKKyAgICAgICAgICAgICAobGFzdF9oZXhfZXNjYXBlICYmIGlzeGRpZ2l0KCpzcmMpKSkpIHsKKyAgICAgICAgICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgNCkgLy8gbmVlZCBzcGFjZSBmb3IgNCBsZXR0ZXIgZXNjYXBlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgc3ByaW50ZihkZXN0ICsgdXNlZCwgKHVzZV9oZXggPyAiXFx4JTAyeCIgOiAiXFwlMDNvIiksCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OD4oKnNyYykpOworICAgICAgICAgIGlzX2hleF9lc2NhcGUgPSB1c2VfaGV4OworICAgICAgICAgIHVzZWQgKz0gNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZXN0W3VzZWQrK10gPSAqc3JjOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBsYXN0X2hleF9lc2NhcGUgPSBpc19oZXhfZXNjYXBlOworICB9CisKKyAgaWYgKGRlc3RfbGVuIC0gdXNlZCA8IDEpICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgcm9vbSBmb3IgXDAKKyAgICByZXR1cm4gLTE7CisKKyAgZGVzdFt1c2VkXSA9ICdcMCc7ICAgLy8gZG9lc24ndCBjb3VudCB0b3dhcmRzIHJldHVybiB2YWx1ZSB0aG91Z2gKKyAgcmV0dXJuIHVzZWQ7Cit9CisKK2ludCBDRXNjYXBlU3RyaW5nKGNvbnN0IGNoYXIqIHNyYywgaW50IHNyY19sZW4sIGNoYXIqIGRlc3QsIGludCBkZXN0X2xlbikgeworICByZXR1cm4gQ0VzY2FwZUludGVybmFsKHNyYywgc3JjX2xlbiwgZGVzdCwgZGVzdF9sZW4sIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENFc2NhcGUoKQorLy8gQ0hleEVzY2FwZSgpCisvLyAgICBDb3BpZXMgJ3NyYycgdG8gcmVzdWx0LCBlc2NhcGluZyBkYW5nZXJvdXMgY2hhcmFjdGVycyB1c2luZworLy8gICAgQy1zdHlsZSBlc2NhcGUgc2VxdWVuY2VzLiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBwcmVwYXJpbmcgcXVlcnkKKy8vICAgIGZsYWdzLiAnc3JjJyBhbmQgJ2Rlc3QnIHNob3VsZCBub3Qgb3ZlcmxhcC4gVGhlICdIZXgnIHZlcnNpb24KKy8vICAgIGhleGFkZWNpbWFsIHJhdGhlciB0aGFuIG9jdGFsIHNlcXVlbmNlcy4KKy8vCisvLyAgICBDdXJyZW50bHkgb25seSBcbiwgXHIsIFx0LCAiLCAnLCBcIGFuZCAhaXNwcmludCgpIGNoYXJzIGFyZSBlc2NhcGVkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nIENFc2NhcGUoY29uc3Qgc3RyaW5nJiBzcmMpIHsKKyAgY29uc3QgaW50IGRlc3RfbGVuZ3RoID0gc3JjLnNpemUoKSAqIDQgKyAxOyAvLyBNYXhpbXVtIHBvc3NpYmxlIGV4cGFuc2lvbgorICBzY29wZWRfYXJyYXk8Y2hhcj4gZGVzdChuZXcgY2hhcltkZXN0X2xlbmd0aF0pOworICBjb25zdCBpbnQgbGVuID0gQ0VzY2FwZUludGVybmFsKHNyYy5kYXRhKCksIHNyYy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC5nZXQoKSwgZGVzdF9sZW5ndGgsIGZhbHNlLCBmYWxzZSk7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobGVuLCAwKTsKKyAgcmV0dXJuIHN0cmluZyhkZXN0LmdldCgpLCBsZW4pOworfQorCituYW1lc3BhY2Ugc3RyaW5ncyB7CisKK3N0cmluZyBVdGY4U2FmZUNFc2NhcGUoY29uc3Qgc3RyaW5nJiBzcmMpIHsKKyAgY29uc3QgaW50IGRlc3RfbGVuZ3RoID0gc3JjLnNpemUoKSAqIDQgKyAxOyAvLyBNYXhpbXVtIHBvc3NpYmxlIGV4cGFuc2lvbgorICBzY29wZWRfYXJyYXk8Y2hhcj4gZGVzdChuZXcgY2hhcltkZXN0X2xlbmd0aF0pOworICBjb25zdCBpbnQgbGVuID0gQ0VzY2FwZUludGVybmFsKHNyYy5kYXRhKCksIHNyYy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC5nZXQoKSwgZGVzdF9sZW5ndGgsIGZhbHNlLCB0cnVlKTsKKyAgR09PR0xFX0RDSEVDS19HRShsZW4sIDApOworICByZXR1cm4gc3RyaW5nKGRlc3QuZ2V0KCksIGxlbik7Cit9CisKK3N0cmluZyBDSGV4RXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKSB7CisgIGNvbnN0IGludCBkZXN0X2xlbmd0aCA9IHNyYy5zaXplKCkgKiA0ICsgMTsgLy8gTWF4aW11bSBwb3NzaWJsZSBleHBhbnNpb24KKyAgc2NvcGVkX2FycmF5PGNoYXI+IGRlc3QobmV3IGNoYXJbZGVzdF9sZW5ndGhdKTsKKyAgY29uc3QgaW50IGxlbiA9IENFc2NhcGVJbnRlcm5hbChzcmMuZGF0YSgpLCBzcmMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QuZ2V0KCksIGRlc3RfbGVuZ3RoLCB0cnVlLCBmYWxzZSk7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobGVuLCAwKTsKKyAgcmV0dXJuIHN0cmluZyhkZXN0LmdldCgpLCBsZW4pOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ0bzMyX2FkYXB0b3IoKQorLy8gc3RydG91MzJfYWRhcHRvcigpCisvLyAgICBJbXBsZW1lbnRhdGlvbiBvZiBzdHJ0b1t1XWwgcmVwbGFjZW1lbnRzIHRoYXQgaGF2ZSBpZGVudGljYWwKKy8vICAgIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgY2hhcmFjdGVyaXN0aWNzIGZvciBib3RoIElMUC0zMiBhbmQgTFAtNjQKKy8vICAgIHBsYXRmb3JtcywgaW5jbHVkaW5nIGVycm5vIHByZXNlcnZhdGlvbiBpbiBlcnJvci1mcmVlIGNhbGxzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQzMiBzdHJ0bzMyX2FkYXB0b3IoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKKyAgY29uc3QgaW50IHNhdmVkX2Vycm5vID0gZXJybm87CisgIGVycm5vID0gMDsKKyAgY29uc3QgbG9uZyByZXN1bHQgPSBzdHJ0b2wobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyAgaWYgKGVycm5vID09IEVSQU5HRSAmJiByZXN1bHQgPT0gTE9OR19NSU4pIHsKKyAgICByZXR1cm4ga2ludDMybWluOworICB9IGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiByZXN1bHQgPT0gTE9OR19NQVgpIHsKKyAgICByZXR1cm4ga2ludDMybWF4OworICB9IGVsc2UgaWYgKGVycm5vID09IDAgJiYgcmVzdWx0IDwga2ludDMybWluKSB7CisgICAgZXJybm8gPSBFUkFOR0U7CisgICAgcmV0dXJuIGtpbnQzMm1pbjsKKyAgfSBlbHNlIGlmIChlcnJubyA9PSAwICYmIHJlc3VsdCA+IGtpbnQzMm1heCkgeworICAgIGVycm5vID0gRVJBTkdFOworICAgIHJldHVybiBraW50MzJtYXg7CisgIH0KKyAgaWYgKGVycm5vID09IDApCisgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyPihyZXN1bHQpOworfQorCit1aW50MzIgc3RydG91MzJfYWRhcHRvcihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgeworICBjb25zdCBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgZXJybm8gPSAwOworICBjb25zdCB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IHN0cnRvdWwobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyAgaWYgKGVycm5vID09IEVSQU5HRSAmJiByZXN1bHQgPT0gVUxPTkdfTUFYKSB7CisgICAgcmV0dXJuIGt1aW50MzJtYXg7CisgIH0gZWxzZSBpZiAoZXJybm8gPT0gMCAmJiByZXN1bHQgPiBrdWludDMybWF4KSB7CisgICAgZXJybm8gPSBFUkFOR0U7CisgICAgcmV0dXJuIGt1aW50MzJtYXg7CisgIH0KKyAgaWYgKGVycm5vID09IDApCisgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMj4ocmVzdWx0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFzdEludFRvQnVmZmVyKCkKKy8vIEZhc3RJbnQ2NFRvQnVmZmVyKCkKKy8vIEZhc3RIZXhUb0J1ZmZlcigpCisvLyBGYXN0SGV4NjRUb0J1ZmZlcigpCisvLyBGYXN0SGV4MzJUb0J1ZmZlcigpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE9mZnNldCBpbnRvIGJ1ZmZlciB3aGVyZSBGYXN0SW50NjRUb0J1ZmZlciBwbGFjZXMgdGhlIGVuZCBvZiBzdHJpbmcKKy8vIG51bGwgY2hhcmFjdGVyLiAgQWxzbyB1c2VkIGJ5IEZhc3RJbnQ2NFRvQnVmZmVyTGVmdC4KK3N0YXRpYyBjb25zdCBpbnQga0Zhc3RJbnQ2NFRvQnVmZmVyT2Zmc2V0ID0gMjE7CisKK2NoYXIgKkZhc3RJbnQ2NFRvQnVmZmVyKGludDY0IGksIGNoYXIqIGJ1ZmZlcikgeworICAvLyBXZSBjb3VsZCBjb2xsYXBzZSB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNlY3Rpb25zLCBidXQgdGhhdAorICAvLyB3b3VsZCBiZSBzbGlnaHRseSBzbG93ZXIgZm9yIHBvc2l0aXZlIG51bWJlcnMuLi4KKyAgLy8gMjIgYnl0ZXMgaXMgZW5vdWdoIHRvIHN0b3JlIC0yKio2NCwgLTE4NDQ2NzQ0MDczNzA5NTUxNjE2LgorICBjaGFyKiBwID0gYnVmZmVyICsga0Zhc3RJbnQ2NFRvQnVmZmVyT2Zmc2V0OworICAqcC0tID0gJ1wwJzsKKyAgaWYgKGkgPj0gMCkgeworICAgIGRvIHsKKyAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICBpIC89IDEwOworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICByZXR1cm4gcCArIDE7CisgIH0gZWxzZSB7CisgICAgLy8gT24gZGlmZmVyZW50IHBsYXRmb3JtcywgJSBhbmQgLyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcnMgZm9yCisgICAgLy8gbmVnYXRpdmUgbnVtYmVycywgc28gd2UgbmVlZCB0byBqdW1wIHRocm91Z2ggaG9vcHMgdG8gbWFrZSBzdXJlCisgICAgLy8gd2UgZG9uJ3QgZGl2aWRlIG5lZ2F0aXZlIG51bWJlcnMuCisgICAgaWYgKGkgPiAtMTApIHsKKyAgICAgIGkgPSAtaTsKKyAgICAgICpwLS0gPSAnMCcgKyBpOworICAgICAgKnAgPSAnLSc7CisgICAgICByZXR1cm4gcDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZW4ndCBhdCBNSU5fSU5ULCBpbiB3aGljaCBjYXNlIHdlIGNhbid0IHNheSBpID0gLWkKKyAgICAgIGkgPSBpICsgMTA7CisgICAgICBpID0gLWk7CisgICAgICAqcC0tID0gJzAnICsgaSAlIDEwOworICAgICAgLy8gVW5kbyB3aGF0IHdlIGRpZCBhIG1vbWVudCBhZ28KKyAgICAgIGkgPSBpIC8gMTAgKyAxOworICAgICAgZG8geworICAgICAgICAqcC0tID0gJzAnICsgaSAlIDEwOworICAgICAgICBpIC89IDEwOworICAgICAgfSB3aGlsZSAoaSA+IDApOworICAgICAgKnAgPSAnLSc7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgIH0KK30KKworLy8gT2Zmc2V0IGludG8gYnVmZmVyIHdoZXJlIEZhc3RJbnQzMlRvQnVmZmVyIHBsYWNlcyB0aGUgZW5kIG9mIHN0cmluZworLy8gbnVsbCBjaGFyYWN0ZXIuICBBbHNvIHVzZWQgYnkgRmFzdEludDMyVG9CdWZmZXJMZWZ0CitzdGF0aWMgY29uc3QgaW50IGtGYXN0SW50MzJUb0J1ZmZlck9mZnNldCA9IDExOworCisvLyBZZXMsIHRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgRmFzdEludDY0VG9CdWZmZXIuICBCdXQsIHdlIG5lZWQgdGhpcyBmb3IgdGhlCisvLyBjb21waWxlciB0byBnZW5lcmF0ZSAzMiBiaXQgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMuICBJdCdzIG11Y2ggZmFzdGVyLCBhdAorLy8gbGVhc3Qgd2l0aCAzMiBiaXQgYmluYXJpZXMuCitjaGFyICpGYXN0SW50MzJUb0J1ZmZlcihpbnQzMiBpLCBjaGFyKiBidWZmZXIpIHsKKyAgLy8gV2UgY291bGQgY29sbGFwc2UgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzZWN0aW9ucywgYnV0IHRoYXQKKyAgLy8gd291bGQgYmUgc2xpZ2h0bHkgc2xvd2VyIGZvciBwb3NpdGl2ZSBudW1iZXJzLi4uCisgIC8vIDEyIGJ5dGVzIGlzIGVub3VnaCB0byBzdG9yZSAtMioqMzIsIC00Mjk0OTY3Mjk2LgorICBjaGFyKiBwID0gYnVmZmVyICsga0Zhc3RJbnQzMlRvQnVmZmVyT2Zmc2V0OworICAqcC0tID0gJ1wwJzsKKyAgaWYgKGkgPj0gMCkgeworICAgIGRvIHsKKyAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICBpIC89IDEwOworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICByZXR1cm4gcCArIDE7CisgIH0gZWxzZSB7CisgICAgLy8gT24gZGlmZmVyZW50IHBsYXRmb3JtcywgJSBhbmQgLyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcnMgZm9yCisgICAgLy8gbmVnYXRpdmUgbnVtYmVycywgc28gd2UgbmVlZCB0byBqdW1wIHRocm91Z2ggaG9vcHMgdG8gbWFrZSBzdXJlCisgICAgLy8gd2UgZG9uJ3QgZGl2aWRlIG5lZ2F0aXZlIG51bWJlcnMuCisgICAgaWYgKGkgPiAtMTApIHsKKyAgICAgIGkgPSAtaTsKKyAgICAgICpwLS0gPSAnMCcgKyBpOworICAgICAgKnAgPSAnLSc7CisgICAgICByZXR1cm4gcDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZW4ndCBhdCBNSU5fSU5ULCBpbiB3aGljaCBjYXNlIHdlIGNhbid0IHNheSBpID0gLWkKKyAgICAgIGkgPSBpICsgMTA7CisgICAgICBpID0gLWk7CisgICAgICAqcC0tID0gJzAnICsgaSAlIDEwOworICAgICAgLy8gVW5kbyB3aGF0IHdlIGRpZCBhIG1vbWVudCBhZ28KKyAgICAgIGkgPSBpIC8gMTAgKyAxOworICAgICAgZG8geworICAgICAgICAqcC0tID0gJzAnICsgaSAlIDEwOworICAgICAgICBpIC89IDEwOworICAgICAgfSB3aGlsZSAoaSA+IDApOworICAgICAgKnAgPSAnLSc7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgIH0KK30KKworY2hhciAqRmFzdEhleFRvQnVmZmVyKGludCBpLCBjaGFyKiBidWZmZXIpIHsKKyAgR09PR0xFX0NIRUNLKGkgPj0gMCkgPDwgIkZhc3RIZXhUb0J1ZmZlcigpIHdhbnRzIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycywgbm90ICIgPDwgaTsKKworICBzdGF0aWMgY29uc3QgY2hhciAqaGV4ZGlnaXRzID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICBjaGFyICpwID0gYnVmZmVyICsgMjE7CisgICpwLS0gPSAnXDAnOworICBkbyB7CisgICAgKnAtLSA9IGhleGRpZ2l0c1tpICYgMTVdOyAgIC8vIG1vZCBieSAxNgorICAgIGkgPj49IDQ7ICAgICAgICAgICAgICAgICAgICAvLyBkaXZpZGUgYnkgMTYKKyAgfSB3aGlsZSAoaSA+IDApOworICByZXR1cm4gcCArIDE7Cit9CisKK2NoYXIgKkludGVybmFsRmFzdEhleFRvQnVmZmVyKHVpbnQ2NCB2YWx1ZSwgY2hhciogYnVmZmVyLCBpbnQgbnVtX2J5dGUpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmhleGRpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgYnVmZmVyW251bV9ieXRlXSA9ICdcMCc7CisgIGZvciAoaW50IGkgPSBudW1fYnl0ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisjaWZkZWYgX01fWDY0CisgICAgLy8gTVNWQyB4NjQgcGxhdGZvcm0gaGFzIGEgYnVnIG9wdGltaXppbmcgdGhlIHVpbnQzMih2YWx1ZSkgaW4gdGhlICNlbHNlCisgICAgLy8gYmxvY2suIEdpdmVuIHRoYXQgdGhlIHVpbnQzMiBjYXN0IHdhcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uIDMyLWJpdAorICAgIC8vIHBsYXRmb3Jtcywgd2UgdXNlIDY0LWJpdCAnJicgZGlyZWN0bHkuCisgICAgYnVmZmVyW2ldID0gaGV4ZGlnaXRzW3ZhbHVlICYgMHhmXTsKKyNlbHNlCisgICAgYnVmZmVyW2ldID0gaGV4ZGlnaXRzW3VpbnQzMih2YWx1ZSkgJiAweGZdOworI2VuZGlmCisgICAgdmFsdWUgPj49IDQ7CisgIH0KKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworY2hhciAqRmFzdEhleDY0VG9CdWZmZXIodWludDY0IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKKyAgcmV0dXJuIEludGVybmFsRmFzdEhleFRvQnVmZmVyKHZhbHVlLCBidWZmZXIsIDE2KTsKK30KKworY2hhciAqRmFzdEhleDMyVG9CdWZmZXIodWludDMyIHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKKyAgcmV0dXJuIEludGVybmFsRmFzdEhleFRvQnVmZmVyKHZhbHVlLCBidWZmZXIsIDgpOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIqIFBsYWNlTnVtKGNoYXIqIHAsIGludCBudW0sIGNoYXIgcHJldl9zZXApIHsKKyAgICpwLS0gPSAnMCcgKyBudW0gJSAxMDsKKyAgICpwLS0gPSAnMCcgKyBudW0gLyAxMDsKKyAgICpwLS0gPSBwcmV2X3NlcDsKKyAgIHJldHVybiBwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYXN0SW50MzJUb0J1ZmZlckxlZnQoKQorLy8gRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCgpCisvLyBGYXN0SW50NjRUb0J1ZmZlckxlZnQoKQorLy8gRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCgpCisvLworLy8gTGlrZSB0aGUgRmFzdCpUb0J1ZmZlcigpIGZ1bmN0aW9ucyBhYm92ZSwgdGhlc2UgYXJlIGludGVuZGVkIGZvciBzcGVlZC4KKy8vIFVubGlrZSB0aGUgRmFzdCpUb0J1ZmZlcigpIGZ1bmN0aW9ucywgaG93ZXZlciwgdGhlc2UgZnVuY3Rpb25zIHdyaXRlCisvLyB0aGVpciBvdXRwdXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIChoZW5jZSB0aGUgbmFtZSwgYXMgdGhlCisvLyBvdXRwdXQgaXMgbGVmdC1hbGlnbmVkKS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQKKy8vIHRoZSBidWZmZXIgaGFzIGVub3VnaCBzcGFjZSB0byBob2xkIHRoZSBvdXRwdXQuCisvLworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIChpLmUuIHRoZSBudWxsIGNoYXJhY3RlcgorLy8gdGVybWluYXRpbmcgdGhlIHN0cmluZykuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBjb25zdCBjaGFyIHR3b19BU0NJSV9kaWdpdHNbMTAwXVsyXSA9IHsKKyAgeycwJywnMCd9LCB7JzAnLCcxJ30sIHsnMCcsJzInfSwgeycwJywnMyd9LCB7JzAnLCc0J30sCisgIHsnMCcsJzUnfSwgeycwJywnNid9LCB7JzAnLCc3J30sIHsnMCcsJzgnfSwgeycwJywnOSd9LAorICB7JzEnLCcwJ30sIHsnMScsJzEnfSwgeycxJywnMid9LCB7JzEnLCczJ30sIHsnMScsJzQnfSwKKyAgeycxJywnNSd9LCB7JzEnLCc2J30sIHsnMScsJzcnfSwgeycxJywnOCd9LCB7JzEnLCc5J30sCisgIHsnMicsJzAnfSwgeycyJywnMSd9LCB7JzInLCcyJ30sIHsnMicsJzMnfSwgeycyJywnNCd9LAorICB7JzInLCc1J30sIHsnMicsJzYnfSwgeycyJywnNyd9LCB7JzInLCc4J30sIHsnMicsJzknfSwKKyAgeyczJywnMCd9LCB7JzMnLCcxJ30sIHsnMycsJzInfSwgeyczJywnMyd9LCB7JzMnLCc0J30sCisgIHsnMycsJzUnfSwgeyczJywnNid9LCB7JzMnLCc3J30sIHsnMycsJzgnfSwgeyczJywnOSd9LAorICB7JzQnLCcwJ30sIHsnNCcsJzEnfSwgeyc0JywnMid9LCB7JzQnLCczJ30sIHsnNCcsJzQnfSwKKyAgeyc0JywnNSd9LCB7JzQnLCc2J30sIHsnNCcsJzcnfSwgeyc0JywnOCd9LCB7JzQnLCc5J30sCisgIHsnNScsJzAnfSwgeyc1JywnMSd9LCB7JzUnLCcyJ30sIHsnNScsJzMnfSwgeyc1JywnNCd9LAorICB7JzUnLCc1J30sIHsnNScsJzYnfSwgeyc1JywnNyd9LCB7JzUnLCc4J30sIHsnNScsJzknfSwKKyAgeyc2JywnMCd9LCB7JzYnLCcxJ30sIHsnNicsJzInfSwgeyc2JywnMyd9LCB7JzYnLCc0J30sCisgIHsnNicsJzUnfSwgeyc2JywnNid9LCB7JzYnLCc3J30sIHsnNicsJzgnfSwgeyc2JywnOSd9LAorICB7JzcnLCcwJ30sIHsnNycsJzEnfSwgeyc3JywnMid9LCB7JzcnLCczJ30sIHsnNycsJzQnfSwKKyAgeyc3JywnNSd9LCB7JzcnLCc2J30sIHsnNycsJzcnfSwgeyc3JywnOCd9LCB7JzcnLCc5J30sCisgIHsnOCcsJzAnfSwgeyc4JywnMSd9LCB7JzgnLCcyJ30sIHsnOCcsJzMnfSwgeyc4JywnNCd9LAorICB7JzgnLCc1J30sIHsnOCcsJzYnfSwgeyc4JywnNyd9LCB7JzgnLCc4J30sIHsnOCcsJzknfSwKKyAgeyc5JywnMCd9LCB7JzknLCcxJ30sIHsnOScsJzInfSwgeyc5JywnMyd9LCB7JzknLCc0J30sCisgIHsnOScsJzUnfSwgeyc5JywnNid9LCB7JzknLCc3J30sIHsnOScsJzgnfSwgeyc5JywnOSd9Cit9OworCitjaGFyKiBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KHVpbnQzMiB1LCBjaGFyKiBidWZmZXIpIHsKKyAgaW50IGRpZ2l0czsKKyAgY29uc3QgY2hhciAqQVNDSUlfZGlnaXRzID0gTlVMTDsKKyAgLy8gVGhlIGlkZWEgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byB0cmltIHRoZSBudW1iZXIgb2YgZGl2aWRlcyB0byBhcyBmZXcKKyAgLy8gYXMgcG9zc2libGUgYnkgdXNpbmcgbXVsdGlwbGljYXRpb24gYW5kIHN1YnRyYWN0aW9uIHJhdGhlciB0aGFuIG1vZCAoJSksCisgIC8vIGFuZCBieSBvdXRwdXR0aW5nIHR3byBkaWdpdHMgYXQgYSB0aW1lIHJhdGhlciB0aGFuIG9uZS4KKyAgLy8gVGhlIGh1Z2UtbnVtYmVyIGNhc2UgaXMgZmlyc3QsIGluIHRoZSBob3BlcyB0aGF0IHRoZSBjb21waWxlciB3aWxsIG91dHB1dAorICAvLyB0aGF0IGNhc2UgaW4gb25lIGJyYW5jaC1mcmVlIGJsb2NrIG9mIGNvZGUsIGFuZCBvbmx5IG91dHB1dCBjb25kaXRpb25hbAorICAvLyBicmFuY2hlcyBpbnRvIGl0IGZyb20gYmVsb3cuCisgIGlmICh1ID49IDEwMDAwMDAwMDApIHsgIC8vID49IDEsMDAwLDAwMCwwMDAKKyAgICBkaWdpdHMgPSB1IC8gMTAwMDAwMDAwOyAgLy8gMTAwLDAwMCwwMDAKKyAgICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgICAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICAgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgICBidWZmZXIgKz0gMjsKK3N1Ymx0MTAwXzAwMF8wMDA6CisgICAgdSAtPSBkaWdpdHMgKiAxMDAwMDAwMDA7ICAvLyAxMDAsMDAwLDAwMAorbHQxMDBfMDAwXzAwMDoKKyAgICBkaWdpdHMgPSB1IC8gMTAwMDAwMDsgIC8vIDEsMDAwLDAwMAorICAgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgICAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICAgIGJ1ZmZlciArPSAyOworc3VibHQxXzAwMF8wMDA6CisgICAgdSAtPSBkaWdpdHMgKiAxMDAwMDAwOyAgLy8gMSwwMDAsMDAwCitsdDFfMDAwXzAwMDoKKyAgICBkaWdpdHMgPSB1IC8gMTAwMDA7ICAvLyAxMCwwMDAKKyAgICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgICAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICAgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgICBidWZmZXIgKz0gMjsKK3N1Ymx0MTBfMDAwOgorICAgIHUgLT0gZGlnaXRzICogMTAwMDA7ICAvLyAxMCwwMDAKK2x0MTBfMDAwOgorICAgIGRpZ2l0cyA9IHUgLyAxMDA7CisgICAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICAgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKKyAgICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgICAgYnVmZmVyICs9IDI7CitzdWJsdDEwMDoKKyAgICB1IC09IGRpZ2l0cyAqIDEwMDsKK2x0MTAwOgorICAgIGRpZ2l0cyA9IHU7CisgICAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICAgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKKyAgICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgICAgYnVmZmVyICs9IDI7Citkb25lOgorICAgICpidWZmZXIgPSAwOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICBpZiAodSA8IDEwMCkgeworICAgIGRpZ2l0cyA9IHU7CisgICAgaWYgKHUgPj0gMTApIGdvdG8gbHQxMDA7CisgICAgKmJ1ZmZlcisrID0gJzAnICsgZGlnaXRzOworICAgIGdvdG8gZG9uZTsKKyAgfQorICBpZiAodSAgPCAgMTAwMDApIHsgICAvLyAxMCwwMDAKKyAgICBpZiAodSA+PSAxMDAwKSBnb3RvIGx0MTBfMDAwOworICAgIGRpZ2l0cyA9IHUgLyAxMDA7CisgICAgKmJ1ZmZlcisrID0gJzAnICsgZGlnaXRzOworICAgIGdvdG8gc3VibHQxMDA7CisgIH0KKyAgaWYgKHUgIDwgIDEwMDAwMDApIHsgICAvLyAxLDAwMCwwMDAKKyAgICBpZiAodSA+PSAxMDAwMDApIGdvdG8gbHQxXzAwMF8wMDA7CisgICAgZGlnaXRzID0gdSAvIDEwMDAwOyAgLy8gICAgMTAsMDAwCisgICAgKmJ1ZmZlcisrID0gJzAnICsgZGlnaXRzOworICAgIGdvdG8gc3VibHQxMF8wMDA7CisgIH0KKyAgaWYgKHUgIDwgIDEwMDAwMDAwMCkgeyAgIC8vIDEwMCwwMDAsMDAwCisgICAgaWYgKHUgPj0gMTAwMDAwMDApIGdvdG8gbHQxMDBfMDAwXzAwMDsKKyAgICBkaWdpdHMgPSB1IC8gMTAwMDAwMDsgIC8vICAgMSwwMDAsMDAwCisgICAgKmJ1ZmZlcisrID0gJzAnICsgZGlnaXRzOworICAgIGdvdG8gc3VibHQxXzAwMF8wMDA7CisgIH0KKyAgLy8gd2UgYWxyZWFkeSBrbm93IHRoYXQgdSA8IDEsMDAwLDAwMCwwMDAKKyAgZGlnaXRzID0gdSAvIDEwMDAwMDAwMDsgICAvLyAxMDAsMDAwLDAwMAorICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgIGdvdG8gc3VibHQxMDBfMDAwXzAwMDsKK30KKworY2hhciogRmFzdEludDMyVG9CdWZmZXJMZWZ0KGludDMyIGksIGNoYXIqIGJ1ZmZlcikgeworICB1aW50MzIgdSA9IGk7CisgIGlmIChpIDwgMCkgeworICAgICpidWZmZXIrKyA9ICctJzsKKyAgICB1ID0gLWk7CisgIH0KKyAgcmV0dXJuIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQodSwgYnVmZmVyKTsKK30KKworY2hhciogRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCh1aW50NjQgdTY0LCBjaGFyKiBidWZmZXIpIHsKKyAgaW50IGRpZ2l0czsKKyAgY29uc3QgY2hhciAqQVNDSUlfZGlnaXRzID0gTlVMTDsKKworICB1aW50MzIgdSA9IHN0YXRpY19jYXN0PHVpbnQzMj4odTY0KTsKKyAgaWYgKHUgPT0gdTY0KSByZXR1cm4gRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1LCBidWZmZXIpOworCisgIHVpbnQ2NCB0b3BfMTFfZGlnaXRzID0gdTY0IC8gMTAwMDAwMDAwMDsKKyAgYnVmZmVyID0gRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCh0b3BfMTFfZGlnaXRzLCBidWZmZXIpOworICB1ID0gdTY0IC0gKHRvcF8xMV9kaWdpdHMgKiAxMDAwMDAwMDAwKTsKKworICBkaWdpdHMgPSB1IC8gMTAwMDAwMDA7ICAvLyAxMCwwMDAsMDAwCisgIEdPT0dMRV9EQ0hFQ0tfTFQoZGlnaXRzLCAxMDApOworICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKKyAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICBidWZmZXIgKz0gMjsKKyAgdSAtPSBkaWdpdHMgKiAxMDAwMDAwMDsgIC8vIDEwLDAwMCwwMDAKKyAgZGlnaXRzID0gdSAvIDEwMDAwMDsgIC8vIDEwMCwwMDAKKyAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgYnVmZmVyICs9IDI7CisgIHUgLT0gZGlnaXRzICogMTAwMDAwOyAgLy8gMTAwLDAwMAorICBkaWdpdHMgPSB1IC8gMTAwMDsgIC8vIDEsMDAwCisgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgIGJ1ZmZlciArPSAyOworICB1IC09IGRpZ2l0cyAqIDEwMDA7ICAvLyAxLDAwMAorICBkaWdpdHMgPSB1IC8gMTA7CisgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgIGJ1ZmZlciArPSAyOworICB1IC09IGRpZ2l0cyAqIDEwOworICBkaWdpdHMgPSB1OworICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICpidWZmZXIgPSAwOworICByZXR1cm4gYnVmZmVyOworfQorCitjaGFyKiBGYXN0SW50NjRUb0J1ZmZlckxlZnQoaW50NjQgaSwgY2hhciogYnVmZmVyKSB7CisgIHVpbnQ2NCB1ID0gaTsKKyAgaWYgKGkgPCAwKSB7CisgICAgKmJ1ZmZlcisrID0gJy0nOworICAgIHUgPSAtaTsKKyAgfQorICByZXR1cm4gRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCh1LCBidWZmZXIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGVJdG9hKCkKKy8vICAgIERlc2NyaXB0aW9uOiBjb252ZXJ0cyBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nLgorLy8KKy8vICAgIFJldHVybiB2YWx1ZTogc3RyaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cmluZyBTaW1wbGVJdG9hKGludCBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCkgPworICAgIEZhc3RJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOgorICAgIEZhc3RJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcik7Cit9CisKK3N0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGludCBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIHN0cmluZyhidWZmZXIsIChzaXplb2YoaSkgPT0gNCkgPworICAgIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKSA6CisgICAgRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdChpLCBidWZmZXIpKTsKK30KKworc3RyaW5nIFNpbXBsZUl0b2EobG9uZyBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCkgPworICAgIEZhc3RJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOgorICAgIEZhc3RJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcik7Cit9CisKK3N0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGxvbmcgaSkgeworICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07CisgIHJldHVybiBzdHJpbmcoYnVmZmVyLCAoc2l6ZW9mKGkpID09IDQpID8KKyAgICBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikgOgorICAgIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKSk7Cit9CisKK3N0cmluZyBTaW1wbGVJdG9hKGxvbmcgbG9uZyBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCkgPworICAgIEZhc3RJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOgorICAgIEZhc3RJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcik7Cit9CisKK3N0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGxvbmcgbG9uZyBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIHN0cmluZyhidWZmZXIsIChzaXplb2YoaSkgPT0gNCkgPworICAgIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKSA6CisgICAgRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdChpLCBidWZmZXIpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlRHRvYSgpCisvLyBTaW1wbGVGdG9hKCkKKy8vIERvdWJsZVRvQnVmZmVyKCkKKy8vIEZsb2F0VG9CdWZmZXIoKQorLy8gICAgV2Ugd2FudCB0byBwcmludCB0aGUgdmFsdWUgd2l0aG91dCBsb3NpbmcgcHJlY2lzaW9uLCBidXQgd2UgYWxzbyBkbworLy8gICAgbm90IHdhbnQgdG8gcHJpbnQgbW9yZSBkaWdpdHMgdGhhbiBuZWNlc3NhcnkuICBUaGlzIHR1cm5zIG91dCB0byBiZQorLy8gICAgdHJpY2tpZXIgdGhhbiBpdCBzb3VuZHMuICBOdW1iZXJzIGxpa2UgMC4yIGNhbm5vdCBiZSByZXByZXNlbnRlZAorLy8gICAgZXhhY3RseSBpbiBiaW5hcnkuICBJZiB3ZSBwcmludCAwLjIgd2l0aCBhIHZlcnkgbGFyZ2UgcHJlY2lzaW9uLAorLy8gICAgZS5nLiAiJS41MGciLCB3ZSBnZXQgIjAuMjAwMDAwMDAwMDAwMDAwMDExMTAyMjMwMjQ2MjUxNTY1NDA0MjM2MzE2NyIuCisvLyAgICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2Ugc2V0IHRoZSBwcmVjaXNpb24gdG9vIGxvdywgd2UgbG9zZQorLy8gICAgc2lnbmlmaWNhbnQgZGlnaXRzIHdoZW4gcHJpbnRpbmcgbnVtYmVycyB0aGF0IGFjdHVhbGx5IG5lZWQgdGhlbS4KKy8vICAgIEl0IHR1cm5zIG91dCB0aGVyZSBpcyBubyBwcmVjaXNpb24gdmFsdWUgdGhhdCBkb2VzIHRoZSByaWdodCB0aGluZworLy8gICAgZm9yIGFsbCBudW1iZXJzLgorLy8KKy8vICAgIE91ciBzdHJhdGVneSBpcyB0byBmaXJzdCB0cnkgcHJpbnRpbmcgd2l0aCBhIHByZWNpc2lvbiB0aGF0IGlzIG5ldmVyCisvLyAgICBvdmVyLXByZWNpc2UsIHRoZW4gcGFyc2UgdGhlIHJlc3VsdCB3aXRoIHN0cnRvZCgpIHRvIHNlZSBpZiBpdAorLy8gICAgbWF0Y2hlcy4gIElmIG5vdCwgd2UgcHJpbnQgYWdhaW4gd2l0aCBhIHByZWNpc2lvbiB0aGF0IHdpbGwgYWx3YXlzCisvLyAgICBnaXZlIGEgcHJlY2lzZSByZXN1bHQsIGJ1dCBtYXkgdXNlIG1vcmUgZGlnaXRzIHRoYW4gbmVjZXNzYXJ5LgorLy8KKy8vICAgIEFuIGFyZ3VhYmx5IGJldHRlciBzdHJhdGVneSB3b3VsZCBiZSB0byB1c2UgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQKKy8vICAgIGluICJIb3cgdG8gUHJpbnQgRmxvYXRpbmctUG9pbnQgTnVtYmVycyBBY2N1cmF0ZWx5IiBieSBTdGVlbGUgJgorLy8gICAgV2hpdGUsIGUuZy4gYXMgaW1wbGVtZW50ZWQgYnkgRGF2aWQgTS4gR2F5J3MgZHRvYSgpLiAgSXQgdHVybnMgb3V0LAorLy8gICAgaG93ZXZlciwgdGhhdCB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGlzIGFib3V0IGFzIGZhc3QgYXMKKy8vICAgIERNRydzIGNvZGUuICBGdXJ0aGVybW9yZSwgRE1HJ3MgY29kZSBsb2NrcyBtdXRleGVzLCB3aGljaCBtZWFucyBpdAorLy8gICAgd2lsbCBub3Qgc2NhbGUgd2VsbCBvbiBtdWx0aS1jb3JlIG1hY2hpbmVzLiAgRE1HJ3MgY29kZSBpcyBzbGlnaHRseQorLy8gICAgbW9yZSBhY2N1cmF0ZSAoaW4gdGhhdCBpdCB3aWxsIG5ldmVyIHVzZSBtb3JlIGRpZ2l0cyB0aGFuCisvLyAgICBuZWNlc3NhcnkpLCBidXQgdGhpcyBpcyBwcm9iYWJseSBpcnJlbGV2YW50IGZvciBtb3N0IHVzZXJzLgorLy8KKy8vICAgIFJvYiBQaWtlIGFuZCBLZW4gVGhvbXBzb24gYWxzbyBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIGR0b2EoKSBpbgorLy8gICAgdGhpcmRfcGFydHkvZm10L2ZsdGZtdC5jYy4gIFRoZWlyIGltcGxlbWVudGF0aW9uIGlzIHNpbWlsYXIgdG8gdGhpcworLy8gICAgb25lIGluIHRoYXQgaXQgbWFrZXMgZ3Vlc3NlcyBhbmQgdGhlbiB1c2VzIHN0cnRvZCgpIHRvIGNoZWNrIHRoZW0uCisvLyAgICBUaGVpciBpbXBsZW1lbnRhdGlvbiBpcyBmYXN0ZXIgYmVjYXVzZSB0aGV5IHVzZSB0aGVpciBvd24gY29kZSB0bworLy8gICAgZ2VuZXJhdGUgdGhlIGRpZ2l0cyBpbiB0aGUgZmlyc3QgcGxhY2UgcmF0aGVyIHRoYW4gdXNlIHNucHJpbnRmKCksCisvLyAgICB0aHVzIGF2b2lkaW5nIGZvcm1hdCBzdHJpbmcgcGFyc2luZyBvdmVyaGVhZC4gIEhvd2V2ZXIsIHRoaXMgbWFrZXMKKy8vICAgIGl0IGNvbnNpZGVyYWJseSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiwKKy8vICAgIGFuZCBpdCBpcyBlbWJlZGRlZCBpbiBhIGxhcmdlciBsaWJyYXJ5LiAgSWYgc3BlZWQgdHVybnMgb3V0IHRvIGJlCisvLyAgICBhbiBpc3N1ZSwgd2UgY291bGQgcmUtaW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgdGhlaXIKKy8vICAgIGltcGxlbWVudGF0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJpbmcgU2ltcGxlRHRvYShkb3VibGUgdmFsdWUpIHsKKyAgY2hhciBidWZmZXJba0RvdWJsZVRvQnVmZmVyU2l6ZV07CisgIHJldHVybiBEb3VibGVUb0J1ZmZlcih2YWx1ZSwgYnVmZmVyKTsKK30KKworc3RyaW5nIFNpbXBsZUZ0b2EoZmxvYXQgdmFsdWUpIHsKKyAgY2hhciBidWZmZXJba0Zsb2F0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIEZsb2F0VG9CdWZmZXIodmFsdWUsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBJc1ZhbGlkRmxvYXRDaGFyKGNoYXIgYykgeworICByZXR1cm4gKCcwJyA8PSBjICYmIGMgPD0gJzknKSB8fAorICAgICAgICAgYyA9PSAnZScgfHwgYyA9PSAnRScgfHwKKyAgICAgICAgIGMgPT0gJysnIHx8IGMgPT0gJy0nOworfQorCit2b2lkIERlbG9jYWxpemVSYWRpeChjaGFyKiBidWZmZXIpIHsKKyAgLy8gRmFzdCBjaGVjazogIGlmIHRoZSBidWZmZXIgaGFzIGEgbm9ybWFsIGRlY2ltYWwgcG9pbnQsIGFzc3VtZSBubworICAvLyB0cmFuc2xhdGlvbiBpcyBuZWVkZWQuCisgIGlmIChzdHJjaHIoYnVmZmVyLCAnLicpICE9IE5VTEwpIHJldHVybjsKKworICAvLyBGaW5kIHRoZSBmaXJzdCB1bmtub3duIGNoYXJhY3Rlci4KKyAgd2hpbGUgKElzVmFsaWRGbG9hdENoYXIoKmJ1ZmZlcikpICsrYnVmZmVyOworCisgIGlmICgqYnVmZmVyID09ICdcMCcpIHsKKyAgICAvLyBObyByYWRpeCBjaGFyYWN0ZXIgZm91bmQuCisgICAgcmV0dXJuOworICB9CisKKyAgLy8gV2UgYXJlIG5vdyBwb2ludGluZyBhdCB0aGUgbG9jYWxlLXNwZWNpZmljIHJhZGl4IGNoYXJhY3Rlci4gIFJlcGxhY2UgaXQKKyAgLy8gd2l0aCAnLicuCisgICpidWZmZXIgPSAnLic7CisgICsrYnVmZmVyOworCisgIGlmICghSXNWYWxpZEZsb2F0Q2hhcigqYnVmZmVyKSAmJiAqYnVmZmVyICE9ICdcMCcpIHsKKyAgICAvLyBJdCBhcHBlYXJzIHRoZSByYWRpeCB3YXMgYSBtdWx0aS1ieXRlIGNoYXJhY3Rlci4gIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZQorICAgIC8vIGV4dHJhIGJ5dGVzLgorICAgIGNoYXIqIHRhcmdldCA9IGJ1ZmZlcjsKKyAgICBkbyB7ICsrYnVmZmVyOyB9IHdoaWxlICghSXNWYWxpZEZsb2F0Q2hhcigqYnVmZmVyKSAmJiAqYnVmZmVyICE9ICdcMCcpOworICAgIG1lbW1vdmUodGFyZ2V0LCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7CisgIH0KK30KKworY2hhciogRG91YmxlVG9CdWZmZXIoZG91YmxlIHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKKyAgLy8gREJMX0RJRyBpcyAxNSBmb3IgSUVFRS03NTQgZG91Ymxlcywgd2hpY2ggYXJlIHVzZWQgb24gYWxtb3N0IGFsbAorICAvLyBwbGF0Zm9ybXMgdGhlc2UgZGF5cy4gIEp1c3QgaW4gY2FzZSBzb21lIHN5c3RlbSBleGlzdHMgd2hlcmUgREJMX0RJRworICAvLyBpcyBzaWduaWZpY2FudGx5IGxhcmdlciAtLSBhbmQgcmlza3Mgb3ZlcmZsb3dpbmcgb3VyIGJ1ZmZlciAtLSB3ZSBoYXZlCisgIC8vIHRoaXMgYXNzZXJ0LgorICBHT09HTEVfQ09NUElMRV9BU1NFUlQoREJMX0RJRyA8IDIwLCBEQkxfRElHX2lzX3Rvb19iaWcpOworCisgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgc3RyY3B5KGJ1ZmZlciwgImluZiIpOworICAgIHJldHVybiBidWZmZXI7CisgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICBzdHJjcHkoYnVmZmVyLCAiLWluZiIpOworICAgIHJldHVybiBidWZmZXI7CisgIH0gZWxzZSBpZiAoSXNOYU4odmFsdWUpKSB7CisgICAgc3RyY3B5KGJ1ZmZlciwgIm5hbiIpOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICBpbnQgc25wcmludGZfcmVzdWx0ID0KKyAgICBzbnByaW50ZihidWZmZXIsIGtEb3VibGVUb0J1ZmZlclNpemUsICIlLipnIiwgREJMX0RJRywgdmFsdWUpOworCisgIC8vIFRoZSBzbnByaW50ZiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHNpZ25pZmljYW50bHkKKyAgLy8gbGFyZ2VyIHRoYW4gdGhlIHByZWNpc2lvbiB3ZSBhc2tlZCBmb3IuCisgIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRG91YmxlVG9CdWZmZXJTaXplKTsKKworICAvLyBXZSBuZWVkIHRvIG1ha2UgcGFyc2VkX3ZhbHVlIHZvbGF0aWxlIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0bworICAvLyB3cml0ZSBpdCBvdXQgdG8gdGhlIHN0YWNrLiAgT3RoZXJ3aXNlLCBpdCBtYXkga2VlcCB0aGUgdmFsdWUgaW4gYQorICAvLyByZWdpc3RlciwgYW5kIGlmIGl0IGRvZXMgdGhhdCwgaXQgbWF5IGtlZXAgaXQgYXMgYSBsb25nIGRvdWJsZSBpbnN0ZWFkCisgIC8vIG9mIGEgZG91YmxlLiAgVGhpcyBsb25nIGRvdWJsZSBtYXkgaGF2ZSBleHRyYSBiaXRzIHRoYXQgbWFrZSBpdCBjb21wYXJlCisgIC8vIHVuZXF1YWwgdG8gInZhbHVlIiBldmVuIHRob3VnaCBpdCB3b3VsZCBiZSBleGFjdGx5IGVxdWFsIGlmIGl0IHdlcmUKKyAgLy8gdHJ1bmNhdGVkIHRvIGEgZG91YmxlLgorICB2b2xhdGlsZSBkb3VibGUgcGFyc2VkX3ZhbHVlID0gc3RydG9kKGJ1ZmZlciwgTlVMTCk7CisgIGlmIChwYXJzZWRfdmFsdWUgIT0gdmFsdWUpIHsKKyAgICBpbnQgc25wcmludGZfcmVzdWx0ID0KKyAgICAgIHNucHJpbnRmKGJ1ZmZlciwga0RvdWJsZVRvQnVmZmVyU2l6ZSwgIiUuKmciLCBEQkxfRElHKzIsIHZhbHVlKTsKKworICAgIC8vIFNob3VsZCBuZXZlciBvdmVyZmxvdzsgc2VlIGFib3ZlLgorICAgIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRG91YmxlVG9CdWZmZXJTaXplKTsKKyAgfQorCisgIERlbG9jYWxpemVSYWRpeChidWZmZXIpOworICByZXR1cm4gYnVmZmVyOworfQorCitib29sIHNhZmVfc3RydG9mKGNvbnN0IGNoYXIqIHN0ciwgZmxvYXQqIHZhbHVlKSB7CisgIGNoYXIqIGVuZHB0cjsKKyAgZXJybm8gPSAwOyAgLy8gZXJybm8gb25seSBnZXRzIHNldCBvbiBlcnJvcnMKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZCAoX19ocHV4KSAgLy8gaGFzIG5vIHN0cnRvZigpCisgICp2YWx1ZSA9IHN0cnRvZChzdHIsICZlbmRwdHIpOworI2Vsc2UKKyAgKnZhbHVlID0gc3RydG9mKHN0ciwgJmVuZHB0cik7CisjZW5kaWYKKyAgcmV0dXJuICpzdHIgIT0gMCAmJiAqZW5kcHRyID09IDAgJiYgZXJybm8gPT0gMDsKK30KKworY2hhciogRmxvYXRUb0J1ZmZlcihmbG9hdCB2YWx1ZSwgY2hhciogYnVmZmVyKSB7CisgIC8vIEZMVF9ESUcgaXMgNiBmb3IgSUVFRS03NTQgZmxvYXRzLCB3aGljaCBhcmUgdXNlZCBvbiBhbG1vc3QgYWxsCisgIC8vIHBsYXRmb3JtcyB0aGVzZSBkYXlzLiAgSnVzdCBpbiBjYXNlIHNvbWUgc3lzdGVtIGV4aXN0cyB3aGVyZSBGTFRfRElHCisgIC8vIGlzIHNpZ25pZmljYW50bHkgbGFyZ2VyIC0tIGFuZCByaXNrcyBvdmVyZmxvd2luZyBvdXIgYnVmZmVyIC0tIHdlIGhhdmUKKyAgLy8gdGhpcyBhc3NlcnQuCisgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChGTFRfRElHIDwgMTAsIEZMVF9ESUdfaXNfdG9vX2JpZyk7CisKKyAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICBzdHJjcHkoYnVmZmVyLCAiaW5mIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgIHN0cmNweShidWZmZXIsICItaW5mIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfSBlbHNlIGlmIChJc05hTih2YWx1ZSkpIHsKKyAgICBzdHJjcHkoYnVmZmVyLCAibmFuIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIGludCBzbnByaW50Zl9yZXN1bHQgPQorICAgIHNucHJpbnRmKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcsIHZhbHVlKTsKKworICAvLyBUaGUgc25wcmludGYgc2hvdWxkIG5ldmVyIG92ZXJmbG93IGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBzaWduaWZpY2FudGx5CisgIC8vIGxhcmdlciB0aGFuIHRoZSBwcmVjaXNpb24gd2UgYXNrZWQgZm9yLgorICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0Zsb2F0VG9CdWZmZXJTaXplKTsKKworICBmbG9hdCBwYXJzZWRfdmFsdWU7CisgIGlmICghc2FmZV9zdHJ0b2YoYnVmZmVyLCAmcGFyc2VkX3ZhbHVlKSB8fCBwYXJzZWRfdmFsdWUgIT0gdmFsdWUpIHsKKyAgICBpbnQgc25wcmludGZfcmVzdWx0ID0KKyAgICAgIHNucHJpbnRmKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcrMiwgdmFsdWUpOworCisgICAgLy8gU2hvdWxkIG5ldmVyIG92ZXJmbG93OyBzZWUgYWJvdmUuCisgICAgR09PR0xFX0RDSEVDSyhzbnByaW50Zl9yZXN1bHQgPiAwICYmIHNucHJpbnRmX3Jlc3VsdCA8IGtGbG9hdFRvQnVmZmVyU2l6ZSk7CisgIH0KKworICBEZWxvY2FsaXplUmFkaXgoYnVmZmVyKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9Mb2NhbGVTdHJ0b2QoKQorLy8gICBUaGlzIGNvZGUgd2lsbCBtYWtlIHlvdSBjcnkuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJldHVybnMgYSBzdHJpbmcgaWRlbnRpY2FsIHRvICppbnB1dCBleGNlcHQgdGhhdCB0aGUgY2hhcmFjdGVyIHBvaW50ZWQgdG8KKy8vIGJ5IHJhZGl4X3BvcyAod2hpY2ggc2hvdWxkIGJlICcuJykgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbG9jYWxlLXNwZWNpZmljCisvLyByYWRpeCBjaGFyYWN0ZXIuCitzdHJpbmcgTG9jYWxpemVSYWRpeChjb25zdCBjaGFyKiBpbnB1dCwgY29uc3QgY2hhciogcmFkaXhfcG9zKSB7CisgIC8vIERldGVybWluZSB0aGUgbG9jYWxlLXNwZWNpZmljIHJhZGl4IGNoYXJhY3RlciBieSBjYWxsaW5nIHNwcmludGYoKSB0bworICAvLyBwcmludCB0aGUgbnVtYmVyIDEuNSwgdGhlbiBzdHJpcHBpbmcgb2ZmIHRoZSBkaWdpdHMuICBBcyBmYXIgYXMgSSBjYW4KKyAgLy8gdGVsbCwgdGhpcyBpcyB0aGUgb25seSBwb3J0YWJsZSwgdGhyZWFkLXNhZmUgd2F5IHRvIGdldCB0aGUgQyBsaWJyYXJ5CisgIC8vIHRvIGRpdnVsZGdlIHRoZSBsb2NhbGUncyByYWRpeCBjaGFyYWN0ZXIuICBObywgbG9jYWxlY29udigpIGlzIE5PVAorICAvLyB0aHJlYWQtc2FmZS4KKyAgY2hhciB0ZW1wWzE2XTsKKyAgaW50IHNpemUgPSBzcHJpbnRmKHRlbXAsICIlLjFmIiwgMS41KTsKKyAgR09PR0xFX0NIRUNLX0VRKHRlbXBbMF0sICcxJyk7CisgIEdPT0dMRV9DSEVDS19FUSh0ZW1wW3NpemUtMV0sICc1Jyk7CisgIEdPT0dMRV9DSEVDS19MRShzaXplLCA2KTsKKworICAvLyBOb3cgcmVwbGFjZSB0aGUgJy4nIGluIHRoZSBpbnB1dCB3aXRoIGl0LgorICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShzdHJsZW4oaW5wdXQpICsgc2l6ZSAtIDMpOworICByZXN1bHQuYXBwZW5kKGlucHV0LCByYWRpeF9wb3MpOworICByZXN1bHQuYXBwZW5kKHRlbXAgKyAxLCBzaXplIC0gMik7CisgIHJlc3VsdC5hcHBlbmQocmFkaXhfcG9zICsgMSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2RvdWJsZSBOb0xvY2FsZVN0cnRvZChjb25zdCBjaGFyKiB0ZXh0LCBjaGFyKiogb3JpZ2luYWxfZW5kcHRyKSB7CisgIC8vIFdlIGNhbm5vdCBzaW1wbHkgc2V0IHRoZSBsb2NhbGUgdG8gIkMiIHRlbXBvcmFyaWx5IHdpdGggc2V0bG9jYWxlKCkKKyAgLy8gYXMgdGhpcyBpcyBub3QgdGhyZWFkLXNhZmUuICBJbnN0ZWFkLCB3ZSB0cnkgdG8gcGFyc2UgaW4gdGhlIGN1cnJlbnQKKyAgLy8gbG9jYWxlIGZpcnN0LiAgSWYgcGFyc2luZyBzdG9wcyBhdCBhICcuJyBjaGFyYWN0ZXIsIHRoZW4gdGhpcyBpcyBhCisgIC8vIHByZXR0eSBnb29kIGhpbnQgdGhhdCB3ZSdyZSBhY3R1YWxseSBpbiBzb21lIG90aGVyIGxvY2FsZSBpbiB3aGljaAorICAvLyAnLicgaXMgbm90IHRoZSByYWRpeCBjaGFyYWN0ZXIuCisKKyAgY2hhciogdGVtcF9lbmRwdHI7CisgIGRvdWJsZSByZXN1bHQgPSBzdHJ0b2QodGV4dCwgJnRlbXBfZW5kcHRyKTsKKyAgaWYgKG9yaWdpbmFsX2VuZHB0ciAhPSBOVUxMKSAqb3JpZ2luYWxfZW5kcHRyID0gdGVtcF9lbmRwdHI7CisgIGlmICgqdGVtcF9lbmRwdHIgIT0gJy4nKSByZXR1cm4gcmVzdWx0OworCisgIC8vIFBhcnNpbmcgaGFsdGVkIG9uIGEgJy4nLiAgUGVyaGFwcyB3ZSdyZSBpbiBhIGRpZmZlcmVudCBsb2NhbGU/ICBMZXQncworICAvLyB0cnkgdG8gcmVwbGFjZSB0aGUgJy4nIHdpdGggYSBsb2NhbGUtc3BlY2lmaWMgcmFkaXggY2hhcmFjdGVyIGFuZAorICAvLyB0cnkgYWdhaW4uCisgIHN0cmluZyBsb2NhbGl6ZWQgPSBMb2NhbGl6ZVJhZGl4KHRleHQsIHRlbXBfZW5kcHRyKTsKKyAgY29uc3QgY2hhciogbG9jYWxpemVkX2NzdHIgPSBsb2NhbGl6ZWQuY19zdHIoKTsKKyAgY2hhciogbG9jYWxpemVkX2VuZHB0cjsKKyAgcmVzdWx0ID0gc3RydG9kKGxvY2FsaXplZF9jc3RyLCAmbG9jYWxpemVkX2VuZHB0cik7CisgIGlmICgobG9jYWxpemVkX2VuZHB0ciAtIGxvY2FsaXplZF9jc3RyKSA+CisgICAgICAodGVtcF9lbmRwdHIgLSB0ZXh0KSkgeworICAgIC8vIFRoaXMgYXR0ZW1wdCBnb3QgZnVydGhlciwgc28gcmVwbGFjaW5nIHRoZSBkZWNpbWFsIG11c3QgaGF2ZSBoZWxwZWQuCisgICAgLy8gVXBkYXRlIG9yaWdpbmFsX2VuZHB0ciB0byBwb2ludCBhdCB0aGUgcmlnaHQgbG9jYXRpb24uCisgICAgaWYgKG9yaWdpbmFsX2VuZHB0ciAhPSBOVUxMKSB7CisgICAgICAvLyBzaXplX2RpZmYgaXMgbm9uLXplcm8gaWYgdGhlIGxvY2FsaXplZCByYWRpeCBoYXMgbXVsdGlwbGUgYnl0ZXMuCisgICAgICBpbnQgc2l6ZV9kaWZmID0gbG9jYWxpemVkLnNpemUoKSAtIHN0cmxlbih0ZXh0KTsKKyAgICAgIC8vIGNvbnN0X2Nhc3QgaXMgbmVjZXNzYXJ5IHRvIG1hdGNoIHRoZSBzdHJ0b2QoKSBpbnRlcmZhY2UuCisgICAgICAqb3JpZ2luYWxfZW5kcHRyID0gY29uc3RfY2FzdDxjaGFyKj4oCisgICAgICAgIHRleHQgKyAobG9jYWxpemVkX2VuZHB0ciAtIGxvY2FsaXplZF9jc3RyIC0gc2l6ZV9kaWZmKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDAxYzYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaApAQCAtMCwwICsxLDQ2NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gZnJvbSBnb29nbGUzL3N0cmluZ3Mvc3RydXRpbC5oCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUlVUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJVVElMX0hfXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgc3RydG9sbCAgX3N0cnRvaTY0CisjZGVmaW5lIHN0cnRvdWxsIF9zdHJ0b3VpNjQKKyNlbGlmIGRlZmluZWQoX19ERUNDWFgpICYmIGRlZmluZWQoX19vc2ZfXykKKy8vIEhQIEMrKyBvbiBUcnU2NCBkb2VzIG5vdCBoYXZlIHN0cnRvbGwsIGJ1dCBzdHJ0b2wgaXMgYWxyZWFkeSA2NC1iaXQuCisjZGVmaW5lIHN0cnRvbGwgc3RydG9sCisjZGVmaW5lIHN0cnRvdWxsIHN0cnRvdWwKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBhc2NpaV9pc2FsbnVtKCkKKy8vICAgIENoZWNrIGlmIGFuIEFTQ0lJIGNoYXJhY3RlciBpcyBhbHBoYW51bWVyaWMuICBXZSBjYW4ndCB1c2UgY3R5cGUncworLy8gICAgaXNhbG51bSgpIGJlY2F1c2UgaXQgaXMgYWZmZWN0ZWQgYnkgbG9jYWxlLiAgVGhpcyBmdW5jdGlvbiBpcyBhcHBsaWVkCisvLyAgICB0byBpZGVudGlmaWVycyBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyIGxhbmd1YWdlLCBub3QgdG8gbmF0dXJhbC1sYW5ndWFnZQorLy8gICAgc3RyaW5ncywgc28gbG9jYWxlIHNob3VsZCBub3QgYmUgdGFrZW4gaW50byBhY2NvdW50LgorLy8gYXNjaWlfaXNkaWdpdCgpCisvLyAgICBMaWtlIGFib3ZlLCBidXQgb25seSBhY2NlcHRzIGRpZ2l0cy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIGJvb2wgYXNjaWlfaXNhbG51bShjaGFyIGMpIHsKKyAgcmV0dXJuICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwKKyAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwKKyAgICAgICAgICgnMCcgPD0gYyAmJiBjIDw9ICc5Jyk7Cit9CisKK2lubGluZSBib29sIGFzY2lpX2lzZGlnaXQoY2hhciBjKSB7CisgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYXNQcmVmaXhTdHJpbmcoKQorLy8gICAgQ2hlY2sgaWYgYSBzdHJpbmcgYmVnaW5zIHdpdGggYSBnaXZlbiBwcmVmaXguCisvLyBTdHJpcFByZWZpeFN0cmluZygpCisvLyAgICBHaXZlbiBhIHN0cmluZyBhbmQgYSBwdXRhdGl2ZSBwcmVmaXgsIHJldHVybnMgdGhlIHN0cmluZyBtaW51cyB0aGUKKy8vICAgIHByZWZpeCBzdHJpbmcgaWYgdGhlIHByZWZpeCBtYXRjaGVzLCBvdGhlcndpc2UgdGhlIG9yaWdpbmFsCisvLyAgICBzdHJpbmcuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmxpbmUgYm9vbCBIYXNQcmVmaXhTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgpIHsKKyAgcmV0dXJuIHN0ci5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJgorICAgICAgICAgc3RyLmNvbXBhcmUoMCwgcHJlZml4LnNpemUoKSwgcHJlZml4KSA9PSAwOworfQorCitpbmxpbmUgc3RyaW5nIFN0cmlwUHJlZml4U3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyLCBjb25zdCBzdHJpbmcmIHByZWZpeCkgeworICBpZiAoSGFzUHJlZml4U3RyaW5nKHN0ciwgcHJlZml4KSkgeworICAgIHJldHVybiBzdHIuc3Vic3RyKHByZWZpeC5zaXplKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBzdHI7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGFzU3VmZml4U3RyaW5nKCkKKy8vICAgIFJldHVybiB0cnVlIGlmIHN0ciBlbmRzIGluIHN1ZmZpeC4KKy8vIFN0cmlwU3VmZml4U3RyaW5nKCkKKy8vICAgIEdpdmVuIGEgc3RyaW5nIGFuZCBhIHB1dGF0aXZlIHN1ZmZpeCwgcmV0dXJucyB0aGUgc3RyaW5nIG1pbnVzIHRoZQorLy8gICAgc3VmZml4IHN0cmluZyBpZiB0aGUgc3VmZml4IG1hdGNoZXMsIG90aGVyd2lzZSB0aGUgb3JpZ2luYWwKKy8vICAgIHN0cmluZy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lubGluZSBib29sIEhhc1N1ZmZpeFN0cmluZyhjb25zdCBzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1ZmZpeCkgeworICByZXR1cm4gc3RyLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmCisgICAgICAgICBzdHIuY29tcGFyZShzdHIuc2l6ZSgpIC0gc3VmZml4LnNpemUoKSwgc3VmZml4LnNpemUoKSwgc3VmZml4KSA9PSAwOworfQorCitpbmxpbmUgc3RyaW5nIFN0cmlwU3VmZml4U3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyLCBjb25zdCBzdHJpbmcmIHN1ZmZpeCkgeworICBpZiAoSGFzU3VmZml4U3RyaW5nKHN0ciwgc3VmZml4KSkgeworICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIHN0ci5zaXplKCkgLSBzdWZmaXguc2l6ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RyOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmlwU3RyaW5nCisvLyAgICBSZXBsYWNlcyBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyICdyZW1vdmUnIChvciB0aGUgY2hhcmFjdGVycworLy8gICAgaW4gJ3JlbW92ZScpIHdpdGggdGhlIGNoYXJhY3RlciAncmVwbGFjZXdpdGgnLgorLy8gICAgR29vZCBmb3Iga2VlcGluZyBodG1sIGNoYXJhY3RlcnMgb3IgcHJvdG9jb2wgY2hhcmFjdGVycyAoXHQpIG91dAorLy8gICAgb2YgcGxhY2VzIHdoZXJlIHRoZXkgbWlnaHQgY2F1c2UgYSBwcm9ibGVtLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3RyaXBTdHJpbmcoc3RyaW5nKiBzLCBjb25zdCBjaGFyKiByZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJlcGxhY2V3aXRoKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG93ZXJTdHJpbmcoKQorLy8gVXBwZXJTdHJpbmcoKQorLy8gICAgQ29udmVydCB0aGUgY2hhcmFjdGVycyBpbiAicyIgdG8gbG93ZXJjYXNlIG9yIHVwcGVyY2FzZS4gIEFTQ0lJLW9ubHk6CisvLyAgICB0aGVzZSBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBpZ25vcmUgbG9jYWxlIGJlY2F1c2UgdGhleSBhcmUgYXBwbGllZCB0bworLy8gICAgaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgUHJvdG9jb2wgQnVmZmVyIGxhbmd1YWdlLCBub3QgdG8gbmF0dXJhbC1sYW5ndWFnZQorLy8gICAgc3RyaW5ncy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgTG93ZXJTdHJpbmcoc3RyaW5nICogcykgeworICBzdHJpbmc6Oml0ZXJhdG9yIGVuZCA9IHMtPmVuZCgpOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaSA9IHMtPmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAvLyB0b2xvd2VyKCkgY2hhbmdlcyBiYXNlZCBvbiBsb2NhbGUuICBXZSBkb24ndCB3YW50IHRoaXMhCisgICAgaWYgKCdBJyA8PSAqaSAmJiAqaSA8PSAnWicpICppICs9ICdhJyAtICdBJzsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBVcHBlclN0cmluZyhzdHJpbmcgKiBzKSB7CisgIHN0cmluZzo6aXRlcmF0b3IgZW5kID0gcy0+ZW5kKCk7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpID0gcy0+YmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgIC8vIHRvdXBwZXIoKSBjaGFuZ2VzIGJhc2VkIG9uIGxvY2FsZS4gIFdlIGRvbid0IHdhbnQgdGhpcyEKKyAgICBpZiAoJ2EnIDw9ICppICYmICppIDw9ICd6JykgKmkgKz0gJ0EnIC0gJ2EnOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZ1JlcGxhY2UoKQorLy8gICAgR2l2ZSBtZSBhIHN0cmluZyBhbmQgdHdvIHBhdHRlcm5zICJvbGQiIGFuZCAibmV3IiwgYW5kIEkgcmVwbGFjZQorLy8gICAgdGhlIGZpcnN0IGluc3RhbmNlIG9mICJvbGQiIGluIHRoZSBzdHJpbmcgd2l0aCAibmV3IiwgaWYgaXQKKy8vICAgIGV4aXN0cy4gIFJFVFVSTiBhIG5ldyBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVwbGFjZW1lbnQKKy8vICAgIGhhcHBlbmVkIG9yIG5vdC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTdHJpbmdSZXBsYWNlKGNvbnN0IHN0cmluZyYgcywgY29uc3Qgc3RyaW5nJiBvbGRzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuZXdzdWIsIGJvb2wgcmVwbGFjZV9hbGwpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTcGxpdFN0cmluZ1VzaW5nKCkKKy8vICAgIFNwbGl0IGEgc3RyaW5nIHVzaW5nIGEgY2hhcmFjdGVyIGRlbGltaXRlci4gQXBwZW5kIHRoZSBjb21wb25lbnRzCisvLyAgICB0byAncmVzdWx0Jy4gIElmIHRoZXJlIGFyZSBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzLCB0aGlzIGZ1bmN0aW9uIHNraXBzCisvLyAgICBvdmVyIGFsbCBvZiB0aGVtLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3BsaXRTdHJpbmdVc2luZyhjb25zdCBzdHJpbmcmIGZ1bGwsIGNvbnN0IGNoYXIqIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogcmVzKTsKKworLy8gU3BsaXQgYSBzdHJpbmcgdXNpbmcgb25lIG9yIG1vcmUgYnl0ZSBkZWxpbWl0ZXJzLCBwcmVzZW50ZWQKKy8vIGFzIGEgbnVsLXRlcm1pbmF0ZWQgYyBzdHJpbmcuIEFwcGVuZCB0aGUgY29tcG9uZW50cyB0byAncmVzdWx0Jy4KKy8vIElmIHRoZXJlIGFyZSBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisvLyBjb3JyZXNwb25kaW5nIGVtcHR5IHN0cmluZ3MuICBJZiB5b3Ugd2FudCB0byBkcm9wIHRoZSBlbXB0eQorLy8gc3RyaW5ncywgdHJ5IFNwbGl0U3RyaW5nVXNpbmcoKS4KKy8vCisvLyBJZiAiZnVsbCIgaXMgdGhlIGVtcHR5IHN0cmluZywgeWllbGRzIGFuIGVtcHR5IHN0cmluZyBhcyB0aGUgb25seSB2YWx1ZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFNwbGl0U3RyaW5nQWxsb3dFbXB0eShjb25zdCBzdHJpbmcmIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIHJlc3VsdCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpvaW5TdHJpbmdzKCkKKy8vICAgIFRoZXNlIG1ldGhvZHMgY29uY2F0ZW5hdGUgYSB2ZWN0b3Igb2Ygc3RyaW5ncyBpbnRvIGEgQysrIHN0cmluZywgdXNpbmcKKy8vICAgIHRoZSBDLXN0cmluZyAiZGVsaW0iIGFzIGEgc2VwYXJhdG9yIGJldHdlZW4gY29tcG9uZW50cy4gVGhlcmUgYXJlIHR3bworLy8gICAgZmxhdm9ycyBvZiB0aGUgZnVuY3Rpb24sIG9uZSBmbGF2b3IgcmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZywKKy8vICAgIGFub3RoZXIgdGFrZXMgYSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgc3RyaW5nLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCisvLyAgICB0YXJnZXQgc3RyaW5nIGlzIGNsZWFyZWQgYW5kIG92ZXJ3cml0dGVuLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgSm9pblN0cmluZ3MoY29uc3QgdmVjdG9yPHN0cmluZz4mIGNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwgc3RyaW5nKiByZXN1bHQpOworCitpbmxpbmUgc3RyaW5nIEpvaW5TdHJpbmdzKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSkgeworICBzdHJpbmcgcmVzdWx0OworICBKb2luU3RyaW5ncyhjb21wb25lbnRzLCBkZWxpbSwgJnJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcygpCisvLyAgICBDb3BpZXMgInNvdXJjZSIgdG8gImRlc3QiLCByZXdyaXRpbmcgQy1zdHlsZSBlc2NhcGUgc2VxdWVuY2VzCisvLyAgICAtLSAnXG4nLCAnXHInLCAnXFwnLCAnXG9vbycsIGV0YyAtLSB0byB0aGVpciBBU0NJSQorLy8gICAgZXF1aXZhbGVudHMuICAiZGVzdCIgbXVzdCBiZSBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gaG9sZCBhbGwKKy8vICAgIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByZXdyaXR0ZW4gc3RyaW5nIChpLmUuIGF0IGxlYXN0IGFzIGxhcmdlCisvLyAgICBhcyBzdHJsZW4oc291cmNlKSArIDEgc2hvdWxkIGJlIHNhZmUsIHNpbmNlIHRoZSByZXBsYWNlbWVudHMKKy8vICAgIGFyZSBhbHdheXMgc2hvcnRlciB0aGFuIHRoZSBvcmlnaW5hbCBlc2NhcGVkIHNlcXVlbmNlcykuICBJdCdzCisvLyAgICBzYWZlIGZvciBzb3VyY2UgYW5kIGRlc3QgdG8gYmUgdGhlIHNhbWUuICBSRVRVUk5TIHRoZSBsZW5ndGgKKy8vICAgIG9mIGRlc3QuCisvLworLy8gICAgSXQgYWxsb3dzIGhleCBzZXF1ZW5jZXMgXHhoaCwgb3IgZ2VuZXJhbGx5IFx4aGhoaGggd2l0aCBhbgorLy8gICAgYXJiaXRyYXJ5IG51bWJlciBvZiBoZXggZGlnaXRzLCBidXQgYWxsIG9mIHRoZW0gdG9nZXRoZXIgbXVzdAorLy8gICAgc3BlY2lmeSBhIHZhbHVlIG9mIGEgc2luZ2xlIGJ5dGUgKGUuZy4gXHgwMDQ1IGlzIGVxdWl2YWxlbnQKKy8vICAgIHRvIFx4NDUsIGFuZCBceDEyMzQgaXMgZXJyb25lb3VzKS4KKy8vCisvLyAgICBJdCBhbHNvIGFsbG93cyBlc2NhcGUgc2VxdWVuY2VzIG9mIHRoZSBmb3JtIFx1aGhoaCAoZXhhY3RseSBmb3VyCisvLyAgICBoZXggZGlnaXRzLCB1cHBlciBvciBsb3dlciBjYXNlKSBvciBcVWhoaGhoaGhoIChleGFjdGx5IGVpZ2h0CisvLyAgICBoZXggZGlnaXRzLCB1cHBlciBvciBsb3dlciBjYXNlKSB0byBzcGVjaWZ5IGEgVW5pY29kZSBjb2RlCisvLyAgICBwb2ludC4gVGhlIGRlc3QgYXJyYXkgd2lsbCBjb250YWluIHRoZSBVVEY4LWVuY29kZWQgdmVyc2lvbiBvZgorLy8gICAgdGhhdCBjb2RlLXBvaW50IChlLmcuLCBpZiBzb3VyY2UgY29udGFpbnMgXHUyMDE5LCB0aGVuIGRlc3Qgd2lsbAorLy8gICAgY29udGFpbiB0aGUgdGhyZWUgYnl0ZXMgMHhFMiwgMHg4MCwgYW5kIDB4OTkpLgorLy8KKy8vICAgIEVycm9yczogSW4gdGhlIGZpcnN0IGZvcm0gb2YgdGhlIGNhbGwsIGVycm9ycyBhcmUgcmVwb3J0ZWQgd2l0aAorLy8gICAgTE9HKEVSUk9SKS4gVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgdGhlIHNlY29uZCBmb3JtIG9mIHRoZSBjYWxsIGlmCisvLyAgICB0aGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHZlY3RvciBpcyBOVUxMOyBvdGhlcndpc2UsIGVycm9yCisvLyAgICBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIHRoZSB2ZWN0b3IuIEluIGVpdGhlciBjYXNlLCB0aGUgZWZmZWN0IG9uCisvLyAgICB0aGUgZGVzdCBhcnJheSBpcyBub3QgZGVmaW5lZCwgYnV0IHJlc3Qgb2YgdGhlIHNvdXJjZSB3aWxsIGJlCisvLyAgICBwcm9jZXNzZWQuCisvLyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKGNvbnN0IGNoYXIqIHNvdXJjZSwgY2hhciogZGVzdCk7CitMSUJQUk9UT0JVRl9FWFBPUlQgaW50IFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcyhjb25zdCBjaGFyKiBzb3VyY2UsIGNoYXIqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiAqZXJyb3JzKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5lc2NhcGVDRXNjYXBlU3RyaW5nKCkKKy8vICAgIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMsIGJ1dCBjcmVhdGVzCisvLyAgICBhIG5ldyBzdHJpbmcuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBhbGxvY2F0aW5nCisvLyAgICBhIGRlc3QgYnVmZmVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBub24gcGVyZm9ybWFuY2UgY3JpdGljYWwKKy8vICAgIHRhc2tzIHN1Y2ggYXMgcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMuIEl0IGlzIHNhZmUgZm9yIHNyYyBhbmQgZGVzdAorLy8gICAgdG8gYmUgdGhlIHNhbWUuCisvLworLy8gICAgVGhlIHNlY29uZCBjYWxsIHN0b3JlcyBpdHMgZXJyb3JzIGluIGEgc3VwcGxpZWQgc3RyaW5nIHZlY3Rvci4KKy8vICAgIElmIHRoZSBzdHJpbmcgdmVjdG9yIHBvaW50ZXIgaXMgTlVMTCwgaXQgcmVwb3J0cyB0aGUgZXJyb3JzIHdpdGggTE9HKCkuCisvLworLy8gICAgSW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbHMsIHRoZSBsZW5ndGggb2YgZGVzdCBpcyByZXR1cm5lZC4gSW4gdGhlCisvLyAgICB0aGUgdGhpcmQgY2FsbCwgdGhlIG5ldyBzdHJpbmcgaXMgcmV0dXJuZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjLCBzdHJpbmcqIGRlc3QpOworTElCUFJPVE9CVUZfRVhQT1JUIGludCBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzcmMsIHN0cmluZyogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+ICplcnJvcnMpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzcmMpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDRXNjYXBlU3RyaW5nKCkKKy8vICAgIENvcGllcyAnc3JjJyB0byAnZGVzdCcsIGVzY2FwaW5nIGRhbmdlcm91cyBjaGFyYWN0ZXJzIHVzaW5nCisvLyAgICBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIHByZXBhcmluZyBxdWVyeQorLy8gICAgZmxhZ3MuICdzcmMnIGFuZCAnZGVzdCcgc2hvdWxkIG5vdCBvdmVybGFwLgorLy8gICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gJ2Rlc3QnIChub3QgaW5jbHVkaW5nIHRoZSBcMCkKKy8vICAgIG9yIC0xIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgc3BhY2UuCisvLworLy8gICAgQ3VycmVudGx5IG9ubHkgXG4sIFxyLCBcdCwgIiwgJywgXCBhbmQgIWlzcHJpbnQoKSBjaGFycyBhcmUgZXNjYXBlZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgQ0VzY2FwZVN0cmluZyhjb25zdCBjaGFyKiBzcmMsIGludCBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGRlc3QsIGludCBkZXN0X2xlbik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENFc2NhcGUoKQorLy8gICAgTW9yZSBjb252ZW5pZW50IGZvcm0gb2YgQ0VzY2FwZVN0cmluZzogcmV0dXJucyByZXN1bHQgYXMgYSAic3RyaW5nIi4KKy8vICAgIFRoaXMgdmVyc2lvbiBpcyBzbG93ZXIgdGhhbiBDRXNjYXBlU3RyaW5nKCkgYmVjYXVzZSBpdCBkb2VzIG1vcmUKKy8vICAgIGFsbG9jYXRpb24uICBIb3dldmVyLCBpdCBpcyBtdWNoIG1vcmUgY29udmVuaWVudCB0byB1c2UgaW4KKy8vICAgIG5vbi1zcGVlZC1jcml0aWNhbCBjb2RlIGxpa2UgbG9nZ2luZyBtZXNzYWdlcyBldGMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIENFc2NhcGUoY29uc3Qgc3RyaW5nJiBzcmMpOworCituYW1lc3BhY2Ugc3RyaW5ncyB7CisvLyBMaWtlIENFc2NhcGUoKSBidXQgZG9lcyBub3QgZXNjYXBlIGJ5dGVzIHdpdGggdGhlIHVwcGVyIGJpdCBzZXQuCitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFV0ZjhTYWZlQ0VzY2FwZShjb25zdCBzdHJpbmcmIHNyYyk7CisKKy8vIExpa2UgQ0VzY2FwZSgpIGJ1dCB1c2VzIGhleCAoXHgpIGVzY2FwZXMgaW5zdGVhZCBvZiBvY3RhbHMuCitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIENIZXhFc2NhcGUoY29uc3Qgc3RyaW5nJiBzcmMpOworfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc3RydG8zMigpCisvLyBzdHJ0b3UzMigpCisvLyBzdHJ0bzY0KCkKKy8vIHN0cnRvdTY0KCkKKy8vICAgIEFyY2hpdGVjdHVyZS1uZXV0cmFsIHBsdWcgY29tcGF0aWJsZSByZXBsYWNlbWVudHMgZm9yIHN0cnRvbCgpIGFuZAorLy8gICAgc3RydG91bCgpLiAgTG9uZydzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMgb24gSUxQLTMyIGFuZCBMUC02NAorLy8gICAgcGxhdGZvcm1zLCBzbyB1c2luZyB0aGVzZSBpcyBzYWZlciwgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZgorLy8gICAgb3ZlcmZsb3cgYmVoYXZpb3IsIHRoYW4gdXNpbmcgdGhlIHN0YW5kYXJkIGxpYmMgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIGludDMyIHN0cnRvMzJfYWRhcHRvcihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSk7CitMSUJQUk9UT0JVRl9FWFBPUlQgdWludDMyIHN0cnRvdTMyX2FkYXB0b3IoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSk7CisKK2lubGluZSBpbnQzMiBzdHJ0bzMyKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIGlmIChzaXplb2YoaW50MzIpID09IHNpemVvZihsb25nKSkKKyAgICByZXR1cm4gc3RydG9sKG5wdHIsIGVuZHB0ciwgYmFzZSk7CisgIGVsc2UKKyAgICByZXR1cm4gc3RydG8zMl9hZGFwdG9yKG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CisKK2lubGluZSB1aW50MzIgc3RydG91MzIoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKKyAgaWYgKHNpemVvZih1aW50MzIpID09IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyAgICByZXR1cm4gc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpOworICBlbHNlCisgICAgcmV0dXJuIHN0cnRvdTMyX2FkYXB0b3IobnB0ciwgZW5kcHRyLCBiYXNlKTsKK30KKworLy8gRm9yIG5vdywgbG9uZyBsb25nIGlzIDY0LWJpdCBvbiBhbGwgdGhlIHBsYXRmb3JtcyB3ZSBjYXJlIGFib3V0LCBzbyB0aGVzZQorLy8gZnVuY3Rpb25zIGNhbiBzaW1wbHkgcGFzcyB0aGUgY2FsbCB0byBzdHJ0b1t1XWxsLgoraW5saW5lIGludDY0IHN0cnRvNjQoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKKyAgR09PR0xFX0NPTVBJTEVfQVNTRVJUKHNpemVvZihpbnQ2NCkgPT0gc2l6ZW9mKGxvbmcgbG9uZyksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZfaW50NjRfaXNfbm90X3NpemVvZl9sb25nX2xvbmcpOworICByZXR1cm4gc3RydG9sbChucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitpbmxpbmUgdWludDY0IHN0cnRvdTY0KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChzaXplb2YodWludDY0KSA9PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZl91aW50NjRfaXNfbm90X3NpemVvZl9sb25nX2xvbmcpOworICByZXR1cm4gc3RydG91bGwobnB0ciwgZW5kcHRyLCBiYXNlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFzdEludFRvQnVmZmVyKCkKKy8vIEZhc3RIZXhUb0J1ZmZlcigpCisvLyBGYXN0SGV4NjRUb0J1ZmZlcigpCisvLyBGYXN0SGV4MzJUb0J1ZmZlcigpCisvLyBGYXN0VGltZVRvQnVmZmVyKCkKKy8vICAgIFRoZXNlIGFyZSBpbnRlbmRlZCBmb3Igc3BlZWQuICBGYXN0SW50VG9CdWZmZXIoKSBhc3N1bWVzIHRoZQorLy8gICAgaW50ZWdlciBpcyBub24tbmVnYXRpdmUuICBGYXN0SGV4VG9CdWZmZXIoKSBwdXRzIG91dHB1dCBpbgorLy8gICAgaGV4IHJhdGhlciB0aGFuIGRlY2ltYWwuICBGYXN0VGltZVRvQnVmZmVyKCkgcHV0cyB0aGUgb3V0cHV0CisvLyAgICBpbnRvIFJGQzgyMiBmb3JtYXQuCisvLworLy8gICAgRmFzdEhleDY0VG9CdWZmZXIoKSBwdXRzIGEgNjQtYml0IHVuc2lnbmVkIHZhbHVlIGluIGhleC1mb3JtYXQsCisvLyAgICBwYWRkZWQgdG8gZXhhY3RseSAxNiBieXRlcyAocGx1cyBvbmUgYnl0ZSBmb3IgJ1wwJykKKy8vCisvLyAgICBGYXN0SGV4MzJUb0J1ZmZlcigpIHB1dHMgYSAzMi1iaXQgdW5zaWduZWQgdmFsdWUgaW4gaGV4LWZvcm1hdCwKKy8vICAgIHBhZGRlZCB0byBleGFjdGx5IDggYnl0ZXMgKHBsdXMgb25lIGJ5dGUgZm9yICdcMCcpCisvLworLy8gICAgICAgQWxsIGZ1bmN0aW9ucyB0YWtlIHRoZSBvdXRwdXQgYnVmZmVyIGFzIGFuIGFyZy4KKy8vICAgIFRoZXkgYWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0LAorLy8gICAgd2hpY2ggbWF5IG5vdCBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBidWZmZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFN1Z2dlc3RlZCBidWZmZXIgc2l6ZSBmb3IgRmFzdFRvQnVmZmVyIGZ1bmN0aW9ucy4gIEFsc28gd29ya3Mgd2l0aAorLy8gRG91YmxlVG9CdWZmZXIoKSBhbmQgRmxvYXRUb0J1ZmZlcigpLgorc3RhdGljIGNvbnN0IGludCBrRmFzdFRvQnVmZmVyU2l6ZSA9IDMyOworCitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEludDMyVG9CdWZmZXIoaW50MzIgaSwgY2hhciogYnVmZmVyKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SW50NjRUb0J1ZmZlcihpbnQ2NCBpLCBjaGFyKiBidWZmZXIpOworY2hhciogRmFzdFVJbnQzMlRvQnVmZmVyKHVpbnQzMiBpLCBjaGFyKiBidWZmZXIpOyAgLy8gaW5saW5lIGJlbG93CitjaGFyKiBGYXN0VUludDY0VG9CdWZmZXIodWludDY0IGksIGNoYXIqIGJ1ZmZlcik7ICAvLyBpbmxpbmUgYmVsb3cKK0xJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SGV4VG9CdWZmZXIoaW50IGksIGNoYXIqIGJ1ZmZlcik7CitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEhleDY0VG9CdWZmZXIodWludDY0IGksIGNoYXIqIGJ1ZmZlcik7CitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEhleDMyVG9CdWZmZXIodWludDMyIGksIGNoYXIqIGJ1ZmZlcik7CisKKy8vIGF0IGxlYXN0IDIyIGJ5dGVzIGxvbmcKK2lubGluZSBjaGFyKiBGYXN0SW50VG9CdWZmZXIoaW50IGksIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gKHNpemVvZihpKSA9PSA0ID8KKyAgICAgICAgICBGYXN0SW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDogRmFzdEludDY0VG9CdWZmZXIoaSwgYnVmZmVyKSk7Cit9CitpbmxpbmUgY2hhciogRmFzdFVJbnRUb0J1ZmZlcih1bnNpZ25lZCBpbnQgaSwgY2hhciogYnVmZmVyKSB7CisgIHJldHVybiAoc2l6ZW9mKGkpID09IDQgPworICAgICAgICAgIEZhc3RVSW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDogRmFzdFVJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcikpOworfQoraW5saW5lIGNoYXIqIEZhc3RMb25nVG9CdWZmZXIobG9uZyBpLCBjaGFyKiBidWZmZXIpIHsKKyAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCA/CisgICAgICAgICAgRmFzdEludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6IEZhc3RJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcikpOworfQoraW5saW5lIGNoYXIqIEZhc3RVTG9uZ1RvQnVmZmVyKHVuc2lnbmVkIGxvbmcgaSwgY2hhciogYnVmZmVyKSB7CisgIHJldHVybiAoc2l6ZW9mKGkpID09IDQgPworICAgICAgICAgIEZhc3RVSW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDogRmFzdFVJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYXN0SW50MzJUb0J1ZmZlckxlZnQoKQorLy8gRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCgpCisvLyBGYXN0SW50NjRUb0J1ZmZlckxlZnQoKQorLy8gRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCgpCisvLworLy8gTGlrZSB0aGUgRmFzdCpUb0J1ZmZlcigpIGZ1bmN0aW9ucyBhYm92ZSwgdGhlc2UgYXJlIGludGVuZGVkIGZvciBzcGVlZC4KKy8vIFVubGlrZSB0aGUgRmFzdCpUb0J1ZmZlcigpIGZ1bmN0aW9ucywgaG93ZXZlciwgdGhlc2UgZnVuY3Rpb25zIHdyaXRlCisvLyB0aGVpciBvdXRwdXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIChoZW5jZSB0aGUgbmFtZSwgYXMgdGhlCisvLyBvdXRwdXQgaXMgbGVmdC1hbGlnbmVkKS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQKKy8vIHRoZSBidWZmZXIgaGFzIGVub3VnaCBzcGFjZSB0byBob2xkIHRoZSBvdXRwdXQuCisvLworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIChpLmUuIHRoZSBudWxsIGNoYXJhY3RlcgorLy8gdGVybWluYXRpbmcgdGhlIHN0cmluZykuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SW50MzJUb0J1ZmZlckxlZnQoaW50MzIgaSwgY2hhciogYnVmZmVyKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KHVpbnQzMiBpLCBjaGFyKiBidWZmZXIpOworTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RJbnQ2NFRvQnVmZmVyTGVmdChpbnQ2NCBpLCBjaGFyKiBidWZmZXIpOworTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQodWludDY0IGksIGNoYXIqIGJ1ZmZlcik7CisKKy8vIEp1c3QgZGVmaW5lIHRoZXNlIGluIHRlcm1zIG9mIHRoZSBhYm92ZS4KK2lubGluZSBjaGFyKiBGYXN0VUludDMyVG9CdWZmZXIodWludDMyIGksIGNoYXIqIGJ1ZmZlcikgeworICBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcik7CisgIHJldHVybiBidWZmZXI7Cit9CitpbmxpbmUgY2hhciogRmFzdFVJbnQ2NFRvQnVmZmVyKHVpbnQ2NCBpLCBjaGFyKiBidWZmZXIpIHsKKyAgRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdChpLCBidWZmZXIpOworICByZXR1cm4gYnVmZmVyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGVJdG9hKCkKKy8vICAgIERlc2NyaXB0aW9uOiBjb252ZXJ0cyBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nLgorLy8KKy8vICAgIFJldHVybiB2YWx1ZTogc3RyaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUl0b2EoaW50IGkpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGludCBpKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlSXRvYShsb25nIGkpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGxvbmcgaSk7CitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUl0b2EobG9uZyBsb25nIGkpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGxvbmcgbG9uZyBpKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlRHRvYSgpCisvLyBTaW1wbGVGdG9hKCkKKy8vIERvdWJsZVRvQnVmZmVyKCkKKy8vIEZsb2F0VG9CdWZmZXIoKQorLy8gICAgRGVzY3JpcHRpb246IGNvbnZlcnRzIGEgZG91YmxlIG9yIGZsb2F0IHRvIGEgc3RyaW5nIHdoaWNoLCBpZgorLy8gICAgcGFzc2VkIHRvIE5vTG9jYWxlU3RydG9kKCksIHdpbGwgcHJvZHVjZSB0aGUgZXhhY3Qgc2FtZSBvcmlnaW5hbCBkb3VibGUKKy8vICAgIChleGNlcHQgaW4gY2FzZSBvZiBOYU47IGFsbCBOYU5zIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIHZhbHVlKS4KKy8vICAgIFdlIHRyeSB0byBrZWVwIHRoZSBzdHJpbmcgc2hvcnQgYnV0IGl0J3Mgbm90IGd1YXJhbnRlZWQgdG8gYmUgYXMKKy8vICAgIHNob3J0IGFzIHBvc3NpYmxlLgorLy8KKy8vICAgIERvdWJsZVRvQnVmZmVyKCkgYW5kIEZsb2F0VG9CdWZmZXIoKSB3cml0ZSB0aGUgdGV4dCB0byB0aGUgZ2l2ZW4KKy8vICAgIGJ1ZmZlciBhbmQgcmV0dXJuIGl0LiAgVGhlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0CisvLyAgICBrRG91YmxlVG9CdWZmZXJTaXplIGJ5dGVzIGZvciBkb3VibGVzIGFuZCBrRmxvYXRUb0J1ZmZlclNpemUKKy8vICAgIGJ5dGVzIGZvciBmbG9hdHMuICBrRmFzdFRvQnVmZmVyU2l6ZSBpcyBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgbGFyZ2UKKy8vICAgIGVub3VnaCB0byBob2xkIGVpdGhlci4KKy8vCisvLyAgICBSZXR1cm4gdmFsdWU6IHN0cmluZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVEdG9hKGRvdWJsZSB2YWx1ZSk7CitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUZ0b2EoZmxvYXQgdmFsdWUpOworCitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRG91YmxlVG9CdWZmZXIoZG91YmxlIGksIGNoYXIqIGJ1ZmZlcik7CitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmxvYXRUb0J1ZmZlcihmbG9hdCBpLCBjaGFyKiBidWZmZXIpOworCisvLyBJbiBwcmFjdGljZSwgZG91YmxlcyBzaG91bGQgbmV2ZXIgbmVlZCBtb3JlIHRoYW4gMjQgYnl0ZXMgYW5kIGZsb2F0cworLy8gc2hvdWxkIG5ldmVyIG5lZWQgbW9yZSB0aGFuIDE0IChpbmNsdWRpbmcgbnVsbCB0ZXJtaW5hdG9ycyksIGJ1dCB3ZQorLy8gb3ZlcmVzdGltYXRlIHRvIGJlIHNhZmUuCitzdGF0aWMgY29uc3QgaW50IGtEb3VibGVUb0J1ZmZlclNpemUgPSAzMjsKK3N0YXRpYyBjb25zdCBpbnQga0Zsb2F0VG9CdWZmZXJTaXplID0gMjQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vTG9jYWxlU3RydG9kKCkKKy8vICAgRXhhY3RseSBsaWtlIHN0cnRvZCgpLCBleGNlcHQgaXQgYWx3YXlzIGJlaGF2ZXMgYXMgaWYgaW4gdGhlICJDIgorLy8gICBsb2NhbGUgKGkuZS4gZGVjaW1hbCBwb2ludHMgbXVzdCBiZSAnLidzKS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElCUFJPVE9CVUZfRVhQT1JUIGRvdWJsZSBOb0xvY2FsZVN0cnRvZChjb25zdCBjaGFyKiB0ZXh0LCBjaGFyKiogZW5kcHRyKTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUlVUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzkyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDgzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8oa2VudG9uKTogIENvcHkgc3RydXRpbCB0ZXN0cyBmcm9tIGdvb2dsZTM/CisKK1RFU1QoU3RyaW5nVXRpbGl0eVRlc3QsIEltbXVuZVRvTG9jYWxlcykgeworICAvLyBSZW1lbWJlciB0aGUgb2xkIGxvY2FsZS4KKyAgY2hhciogb2xkX2xvY2FsZV9jc3RyID0gc2V0bG9jYWxlKExDX05VTUVSSUMsIE5VTEwpOworICBBU1NFUlRfVFJVRShvbGRfbG9jYWxlX2NzdHIgIT0gTlVMTCk7CisgIHN0cmluZyBvbGRfbG9jYWxlID0gb2xkX2xvY2FsZV9jc3RyOworCisgIC8vIFNldCB0aGUgbG9jYWxlIHRvICJDIi4KKyAgQVNTRVJUX1RSVUUoc2V0bG9jYWxlKExDX05VTUVSSUMsICJDIikgIT0gTlVMTCk7CisKKyAgRVhQRUNUX0VRKDEuNSwgTm9Mb2NhbGVTdHJ0b2QoIjEuNSIsIE5VTEwpKTsKKyAgRVhQRUNUX0VRKCIxLjUiLCBTaW1wbGVEdG9hKDEuNSkpOworICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUZ0b2EoMS41KSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIGVuZHB0ciBpcyBzZXQgY29ycmVjdGx5IGV2ZW4gaWYgbm90IGFsbCB0ZXh0IHdhcyBwYXJzZWQuCisgIGNvbnN0IGNoYXIqIHRleHQgPSAiMS41ZiI7CisgIGNoYXIqIGVuZHB0cjsKKyAgRVhQRUNUX0VRKDEuNSwgTm9Mb2NhbGVTdHJ0b2QodGV4dCwgJmVuZHB0cikpOworICBFWFBFQ1RfRVEoMywgZW5kcHRyIC0gdGV4dCk7CisKKyAgaWYgKHNldGxvY2FsZShMQ19OVU1FUklDLCAiZXNfRVMiKSA9PSBOVUxMICYmCisgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQywgImVzX0VTLnV0ZjgiKSA9PSBOVUxMKSB7CisgICAgLy8gU29tZSBzeXN0ZW1zIG1heSBub3QgaGF2ZSB0aGUgZGVzaXJlZCBsb2NhbGUgYXZhaWxhYmxlLgorICAgIEdPT0dMRV9MT0coV0FSTklORykKKyAgICAgIDw8ICJDb3VsZG4ndCBzZXQgbG9jYWxlIHRvIGVzX0VTLiAgU2tpcHBpbmcgdGhpcyB0ZXN0LiI7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX0VRKDEuNSwgTm9Mb2NhbGVTdHJ0b2QoIjEuNSIsIE5VTEwpKTsKKyAgICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUR0b2EoMS41KSk7CisgICAgRVhQRUNUX0VRKCIxLjUiLCBTaW1wbGVGdG9hKDEuNSkpOworICAgIEVYUEVDVF9FUSgxLjUsIE5vTG9jYWxlU3RydG9kKHRleHQsICZlbmRwdHIpKTsKKyAgICBFWFBFQ1RfRVEoMywgZW5kcHRyIC0gdGV4dCk7CisgIH0KKworICAvLyBSZXR1cm4gdG8gb3JpZ2luYWwgbG9jYWxlLgorICBzZXRsb2NhbGUoTENfTlVNRVJJQywgb2xkX2xvY2FsZS5jX3N0cigpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTI0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5jYwpAQCAtMCwwICsxLDEzNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncyB7CisKK3VzaW5nIGludGVybmFsOjpTdWJzdGl0dXRlQXJnOworCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJncyBpbiBhcmdfYXJyYXkgd2hpY2ggd2VyZSBwYXNzZWQgZXhwbGljaXRseQorLy8gdG8gU3Vic3RpdHV0ZSgpLgorc3RhdGljIGludCBDb3VudFN1YnN0aXR1dGVBcmdzKGNvbnN0IFN1YnN0aXR1dGVBcmcqIGNvbnN0KiBhcmdzX2FycmF5KSB7CisgIGludCBjb3VudCA9IDA7CisgIHdoaWxlIChhcmdzX2FycmF5W2NvdW50XSAhPSBOVUxMICYmIGFyZ3NfYXJyYXlbY291bnRdLT5zaXplKCkgIT0gLTEpIHsKKyAgICArK2NvdW50OworICB9CisgIHJldHVybiBjb3VudDsKK30KKworc3RyaW5nIFN1YnN0aXR1dGUoCisgICAgY29uc3QgY2hhciogZm9ybWF0LAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzAsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzEsCisgICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMiwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMywKKyAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc0LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc1LAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzYsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzcsCisgICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnOCwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnOSkgeworICBzdHJpbmcgcmVzdWx0OworICBTdWJzdGl0dXRlQW5kQXBwZW5kKCZyZXN1bHQsIGZvcm1hdCwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzUsIGFyZzYsIGFyZzcsIGFyZzgsIGFyZzkpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN1YnN0aXR1dGVBbmRBcHBlbmQoCisgICAgc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcwLCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcxLAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzIsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzMsCisgICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNCwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNSwKKyAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc2LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc3LAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzgsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzkpIHsKKyAgY29uc3QgU3Vic3RpdHV0ZUFyZyogY29uc3QgYXJnc19hcnJheVtdID0geworICAgICZhcmcwLCAmYXJnMSwgJmFyZzIsICZhcmczLCAmYXJnNCwgJmFyZzUsICZhcmc2LCAmYXJnNywgJmFyZzgsICZhcmc5LCBOVUxMCisgIH07CisKKyAgLy8gRGV0ZXJtaW5lIHRvdGFsIHNpemUgbmVlZGVkLgorICBpbnQgc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBmb3JtYXRbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYgKGZvcm1hdFtpXSA9PSAnJCcpIHsKKyAgICAgIGlmIChhc2NpaV9pc2RpZ2l0KGZvcm1hdFtpKzFdKSkgeworICAgICAgICBpbnQgaW5kZXggPSBmb3JtYXRbaSsxXSAtICcwJzsKKyAgICAgICAgaWYgKGFyZ3NfYXJyYXlbaW5kZXhdLT5zaXplKCkgPT0gLTEpIHsKKyAgICAgICAgICBHT09HTEVfTE9HKERGQVRBTCkKKyAgICAgICAgICAgIDw8ICJzdHJpbmdzOjpTdWJzdGl0dXRlIGZvcm1hdCBzdHJpbmcgaW52YWxpZDogYXNrZWQgZm9yIFwiJCIKKyAgICAgICAgICAgIDw8IGluZGV4IDw8ICJcIiwgYnV0IG9ubHkgIiA8PCBDb3VudFN1YnN0aXR1dGVBcmdzKGFyZ3NfYXJyYXkpCisgICAgICAgICAgICA8PCAiIGFyZ3Mgd2VyZSBnaXZlbi4gIEZ1bGwgZm9ybWF0IHN0cmluZyB3YXM6IFwiIgorICAgICAgICAgICAgPDwgQ0VzY2FwZShmb3JtYXQpIDw8ICJcIi4iOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGFyZ3NfYXJyYXlbaW5kZXhdLT5zaXplKCk7CisgICAgICAgICsraTsgIC8vIFNraXAgbmV4dCBjaGFyLgorICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaSsxXSA9PSAnJCcpIHsKKyAgICAgICAgKytzaXplOworICAgICAgICArK2k7ICAvLyBTa2lwIG5leHQgY2hhci4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKQorICAgICAgICAgIDw8ICJJbnZhbGlkIHN0cmluZ3M6OlN1YnN0aXR1dGUoKSBmb3JtYXQgc3RyaW5nOiBcIiIKKyAgICAgICAgICA8PCBDRXNjYXBlKGZvcm1hdCkgPDwgIlwiLiI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKytzaXplOworICAgIH0KKyAgfQorCisgIGlmIChzaXplID09IDApIHJldHVybjsKKworICAvLyBCdWlsZCB0aGUgc3RyaW5nLgorICBpbnQgb3JpZ2luYWxfc2l6ZSA9IG91dHB1dC0+c2l6ZSgpOworICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKG91dHB1dCwgb3JpZ2luYWxfc2l6ZSArIHNpemUpOworICBjaGFyKiB0YXJnZXQgPSBzdHJpbmdfYXNfYXJyYXkob3V0cHV0KSArIG9yaWdpbmFsX3NpemU7CisgIGZvciAoaW50IGkgPSAwOyBmb3JtYXRbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYgKGZvcm1hdFtpXSA9PSAnJCcpIHsKKyAgICAgIGlmIChhc2NpaV9pc2RpZ2l0KGZvcm1hdFtpKzFdKSkgeworICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnKiBzcmMgPSBhcmdzX2FycmF5W2Zvcm1hdFtpKzFdIC0gJzAnXTsKKyAgICAgICAgbWVtY3B5KHRhcmdldCwgc3JjLT5kYXRhKCksIHNyYy0+c2l6ZSgpKTsKKyAgICAgICAgdGFyZ2V0ICs9IHNyYy0+c2l6ZSgpOworICAgICAgICArK2k7ICAvLyBTa2lwIG5leHQgY2hhci4KKyAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2krMV0gPT0gJyQnKSB7CisgICAgICAgICp0YXJnZXQrKyA9ICckJzsKKyAgICAgICAgKytpOyAgLy8gU2tpcCBuZXh0IGNoYXIuCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICp0YXJnZXQrKyA9IGZvcm1hdFtpXTsKKyAgICB9CisgIH0KKworICBHT09HTEVfRENIRUNLX0VRKHRhcmdldCAtIG91dHB1dC0+ZGF0YSgpLCBvdXRwdXQtPnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODE3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBmcm9tIGdvb2dsZTMvc3RyaW5ncy9zdWJzdGl0dXRlLmgKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncyB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cmluZ3M6OlN1YnN0aXR1dGUoKQorLy8gc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgpCisvLyAgIEtpbmQgb2YgbGlrZSBTdHJpbmdQcmludGYsIGJ1dCBkaWZmZXJlbnQuCisvLworLy8gICBFeGFtcGxlOgorLy8gICAgIHN0cmluZyBHZXRNZXNzYWdlKHN0cmluZyBmaXJzdF9uYW1lLCBzdHJpbmcgbGFzdF9uYW1lLCBpbnQgYWdlKSB7CisvLyAgICAgICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgiTXkgbmFtZSBpcyAkMCAkMSBhbmQgSSBhbSAkMiB5ZWFycyBvbGQuIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgYWdlKTsKKy8vICAgICB9CisvLworLy8gICBEaWZmZXJlbmNlcyBmcm9tIFN0cmluZ1ByaW50ZjoKKy8vICAgKiBUaGUgZm9ybWF0IHN0cmluZyBkb2VzIG5vdCBpZGVudGlmeSB0aGUgdHlwZXMgb2YgYXJndW1lbnRzLgorLy8gICAgIEluc3RlYWQsIHRoZSBtYWdpYyBvZiBDKysgZGVhbHMgd2l0aCB0aGlzIGZvciB1cy4gIFNlZSBiZWxvdworLy8gICAgIGZvciBhIGxpc3Qgb2YgYWNjZXB0ZWQgdHlwZXMuCisvLyAgICogU3Vic3RpdHV0aW9ucyBpbiB0aGUgZm9ybWF0IHN0cmluZyBhcmUgaWRlbnRpZmllZCBieSBhICckJworLy8gICAgIGZvbGxvd2VkIGJ5IGEgZGlnaXQuICBTbywgeW91IGNhbiB1c2UgYXJndW1lbnRzIG91dC1vZi1vcmRlciBhbmQKKy8vICAgICB1c2UgdGhlIHNhbWUgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMuCisvLyAgICogSXQncyBtdWNoIGZhc3RlciB0aGFuIFN0cmluZ1ByaW50Zi4KKy8vCisvLyAgIFN1cHBvcnRlZCB0eXBlczoKKy8vICAgKiBTdHJpbmdzIChjb25zdCBjaGFyKiwgY29uc3Qgc3RyaW5nJikKKy8vICAgICAqIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHlvdSBkbyBub3QgaGF2ZSB0byBhZGQgLmNfc3RyKCkgdG8gYWxsIG9mCisvLyAgICAgICB5b3VyIHN0cmluZ3MuICBJbiBmYWN0LCB5b3Ugc2hvdWxkbid0OyBpdCB3aWxsIGJlIHNsb3dlci4KKy8vICAgKiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0OiAgRm9ybWF0dGVkIHVzaW5nIFNpbXBsZUl0b2EoKS4KKy8vICAgKiBmbG9hdCwgZG91YmxlOiAgRm9ybWF0dGVkIHVzaW5nIFNpbXBsZUZ0b2EoKSBhbmQgU2ltcGxlRHRvYSgpLgorLy8gICAqIGJvb2w6ICBQcmludGVkIGFzICJ0cnVlIiBvciAiZmFsc2UiLgorLy8KKy8vICAgU3Vic3RpdHV0ZUFuZEFwcGVuZCgpIGlzIGxpa2UgU3Vic3RpdHV0ZSgpIGJ1dCBhcHBlbmRzIHRoZSByZXN1bHQgdG8KKy8vICAgKm91dHB1dC4gIEV4YW1wbGU6CisvLworLy8gICAgIHN0cmluZyBzdHI7CisvLyAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmc3RyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk15IG5hbWUgaXMgJDAgJDEgYW5kIEkgYW0gJDIgeWVhcnMgb2xkLiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lLCBsYXN0X25hbWUsIGFnZSk7CisvLworLy8gICBTdWJzdGl0dXRlKCkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBTdHJpbmdQcmludGYoKS4gIEZvciB2ZXJ5CisvLyAgIGxhcmdlIHN0cmluZ3MsIGl0IG1heSBiZSBvcmRlcnMgb2YgbWFnbml0dWRlIGZhc3Rlci4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGludGVybmFsIHsgIC8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMuCisKK2NsYXNzIFN1YnN0aXR1dGVBcmcgeworIHB1YmxpYzoKKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoY29uc3QgY2hhciogdmFsdWUpCisgICAgOiB0ZXh0Xyh2YWx1ZSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGNvbnN0IHN0cmluZyYgdmFsdWUpCisgICAgOiB0ZXh0Xyh2YWx1ZS5kYXRhKCkpLCBzaXplXyh2YWx1ZS5zaXplKCkpIHt9CisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgbm8gYXJndW1lbnQgd2FzIGdpdmVuLgorICBpbmxpbmUgZXhwbGljaXQgU3Vic3RpdHV0ZUFyZygpCisgICAgOiB0ZXh0XyhOVUxMKSwgc2l6ZV8oLTEpIHt9CisKKyAgLy8gUHJpbWl0aXZlcworICAvLyBXZSBkb24ndCBvdmVybG9hZCBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCBjaGFyIGJlY2F1c2UgaWYgcGVvcGxlIGFyZQorICAvLyBleHBsaWNpdGx5IGRlY2xhcmluZyB0aGVpciBjaGFycyBhcyBzaWduZWQgb3IgdW5zaWduZWQgdGhlbiB0aGV5IGFyZQorICAvLyBwcm9iYWJseSBhY3R1YWxseSB1c2luZyB0aGVtIGFzIDgtYml0IGludGVnZXJzIGFuZCB3b3VsZCBwcm9iYWJseQorICAvLyBwcmVmZXIgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbi4gIEJ1dCwgd2UgZG9uJ3QgcmVhbGx5IGtub3cuICBTbywgd2UKKyAgLy8gbWFrZSB0aGUgY2FsbGVyIGRlY2lkZSB3aGF0IHRvIGRvLgorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhjaGFyIHZhbHVlKQorICAgIDogdGV4dF8oc2NyYXRjaF8pLCBzaXplXygxKSB7IHNjcmF0Y2hfWzBdID0gdmFsdWU7IH0KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoc2hvcnQgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0SW50MzJUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcodW5zaWduZWQgc2hvcnQgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0VUludDMyVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGludCB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RJbnQzMlRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyh1bnNpZ25lZCBpbnQgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0VUludDMyVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGxvbmcgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0TG9uZ1RvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyh1bnNpZ25lZCBsb25nIHZhbHVlKQorICAgIDogdGV4dF8oRmFzdFVMb25nVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGxvbmcgbG9uZyB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RJbnQ2NFRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyh1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0VUludDY0VG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGZsb2F0IHZhbHVlKQorICAgIDogdGV4dF8oRmxvYXRUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoZG91YmxlIHZhbHVlKQorICAgIDogdGV4dF8oRG91YmxlVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGJvb2wgdmFsdWUpCisgICAgOiB0ZXh0Xyh2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorCisgIGlubGluZSBjb25zdCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gdGV4dF87IH0KKyAgaW5saW5lIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworIHByaXZhdGU6CisgIGNvbnN0IGNoYXIqIHRleHRfOworICBpbnQgc2l6ZV87CisgIGNoYXIgc2NyYXRjaF9ba0Zhc3RUb0J1ZmZlclNpemVdOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU3Vic3RpdHV0ZSgKKyAgY29uc3QgY2hhciogZm9ybWF0LAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcxID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzIgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc0ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzUgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNiA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc3ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzggPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnOSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCkpOworCitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdWJzdGl0dXRlQW5kQXBwZW5kKAorICBzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZm9ybWF0LAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcxID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzIgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc0ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzUgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNiA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc3ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzggPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnOSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCkpOworCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzMGZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAtLS0tCisvLyBBdXRob3I6IGxhckBnb29nbGUuY29tIChMYXJhbWllIExlYXZpdHQpCisvLworLy8gVGVtcGxhdGUgbWV0YXByb2dyYW1taW5nIHV0aWxpdHkgZnVuY3Rpb25zLgorLy8KKy8vIFRoaXMgY29kZSBpcyBjb21waWxlZCBkaXJlY3RseSBvbiBtYW55IHBsYXRmb3JtcywgaW5jbHVkaW5nIGNsaWVudAorLy8gcGxhdGZvcm1zIGxpa2UgV2luZG93cywgTWFjLCBhbmQgZW1iZWRkZWQgc3lzdGVtcy4gIEJlZm9yZSBtYWtpbmcKKy8vIGFueSBjaGFuZ2VzIGhlcmUsIG1ha2Ugc3VyZSB0aGF0IHlvdSdyZSBub3QgYnJlYWtpbmcgYW55IHBsYXRmb3Jtcy4KKy8vCisvLworLy8gVGhlIG5hbWVzIGNob29zZW4gaGVyZSByZWZsZWN0IHRob3NlIHVzZWQgaW4gdHIxIGFuZCB0aGUgYm9vc3Q6Om1wbAorLy8gbGlicmFyeSwgdGhlcmUgYXJlIHNpbWlsYXIgb3BlcmF0aW9ucyB1c2VkIGluIHRoZSBMb2tpIGxpYnJhcnkgYXMKKy8vIHdlbGwuICBJIHByZWZlciB0aGUgYm9vc3QgbmFtZXMgZm9yIDIgcmVhc29uczoKKy8vIDEuICBJIHRoaW5rIHRoYXQgcG9ydGlvbnMgb2YgdGhlIEJvb3N0IGxpYnJhcmllcyBhcmUgbW9yZSBsaWtlbHkgdG8KKy8vIGJlIGluY2x1ZGVkIGluIHRoZSBjKysgc3RhbmRhcmQuCisvLyAyLiAgSXQgaXMgbm90IGltcG9zc2libGUgdGhhdCBzb21lIG9mIHRoZSBib29zdCBsaWJyYXJpZXMgd2lsbCBiZQorLy8gaW5jbHVkZWQgaW4gb3VyIG93biBidWlsZCBpbiB0aGUgZnV0dXJlLgorLy8gQm90aCBvZiB0aGVzZSBvdXRjb21lcyBtZWFucyB0aGF0IHdlIG1heSBiZSBhYmxlIHRvIGRpcmVjdGx5IHJlcGxhY2UKKy8vIHNvbWUgb2YgdGhlc2Ugd2l0aCBib29zdCBlcXVpdmFsZW50cy4KKy8vCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9URU1QTEFURV9VVElMX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URU1QTEFURV9VVElMX0hfCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFR5cGVzIHNtYWxsXyBhbmQgYmlnXyBhcmUgZ3VhcmFudGVlZCBzdWNoIHRoYXQgc2l6ZW9mKHNtYWxsXykgPAorLy8gc2l6ZW9mKGJpZ18pCit0eXBlZGVmIGNoYXIgc21hbGxfOworCitzdHJ1Y3QgYmlnXyB7CisgIGNoYXIgZHVtbXlbMl07Cit9OworCisvLyBJZGVudGl0eSBtZXRhZnVuY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBpZGVudGl0eV8geworICB0eXBlZGVmIFQgdHlwZTsKK307CisKKy8vIGludGVncmFsX2NvbnN0YW50LCBkZWZpbmVkIGluIHRyMSwgaXMgYSB3cmFwcGVyIGZvciBhbiBpbnRlZ2VyCisvLyB2YWx1ZS4gV2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhpcyBnZW5lcmFsaXR5OyB3ZSBjb3VsZCBnZXQgYXdheQorLy8gd2l0aCBoYXJkY29kaW5nIHRoZSBpbnRlZ2VyIHR5cGUgdG8gYm9vbC4gV2UgdXNlIHRoZSBmdWxseQorLy8gZ2VuZXJhbCBpbnRlZ2VyX2NvbnN0YW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdHIxLgorCit0ZW1wbGF0ZTxjbGFzcyBULCBUIHY+CitzdHJ1Y3QgaW50ZWdyYWxfY29uc3RhbnQgeworICBzdGF0aWMgY29uc3QgVCB2YWx1ZSA9IHY7CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PFQsIHY+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgVCB2PiBjb25zdCBUIGludGVncmFsX2NvbnN0YW50PFQsIHY+Ojp2YWx1ZTsKKworCisvLyBBYmJyZXZpYXRpb25zOiB0cnVlX3R5cGUgYW5kIGZhbHNlX3R5cGUgYXJlIHN0cnVjdHMgdGhhdCByZXByZXNlbnQgYm9vbGVhbgorLy8gdHJ1ZSBhbmQgZmFsc2UgdmFsdWVzLiBBbHNvIGRlZmluZSB0aGUgYm9vc3Q6Om1wbCB2ZXJzaW9ucyBvZiB0aG9zZSBuYW1lcywKKy8vIHRydWVfIGFuZCBmYWxzZV8uCit0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHRydWU+ICB0cnVlX3R5cGU7Cit0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGZhbHNlPiBmYWxzZV90eXBlOwordHlwZWRlZiB0cnVlX3R5cGUgIHRydWVfOwordHlwZWRlZiBmYWxzZV90eXBlIGZhbHNlXzsKKworLy8gaWZfIGlzIGEgdGVtcGxhdGl6ZWQgY29uZGl0aW9uYWwgc3RhdGVtZW50LgorLy8gaWZfPGNvbmQsIEEsIEI+IGlzIGEgY29tcGlsZSB0aW1lIGV2YWx1YXRpb24gb2YgY29uZC4KKy8vIGlmXzw+Ojp0eXBlIGNvbnRhaW5zIEEgaWYgY29uZCBpcyB0cnVlLCBCIG90aGVyd2lzZS4KK3RlbXBsYXRlPGJvb2wgY29uZCwgdHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3N0cnVjdCBpZl97CisgIHR5cGVkZWYgQSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3N0cnVjdCBpZl88ZmFsc2UsIEEsIEI+IHsKKyAgdHlwZWRlZiBCIHR5cGU7Cit9OworCisKKy8vIHR5cGVfZXF1YWxzXyBpcyBhIHRlbXBsYXRlIHR5cGUgY29tcGFyYXRvciwgc2ltaWxhciB0byBMb2tpIElzU2FtZVR5cGUuCisvLyB0eXBlX2VxdWFsc188QSwgQj46OnZhbHVlIGlzIHRydWUgaWZmICJBIiBpcyB0aGUgc2FtZSB0eXBlIGFzICJCIi4KKy8vCisvLyBOZXcgY29kZSBzaG91bGQgcHJlZmVyIGJhc2U6OmlzX3NhbWUsIGRlZmluZWQgaW4gYmFzZS90eXBlX3RyYWl0cy5oLgorLy8gSXQgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCwgYnV0IGlzX3NhbWUgaXMgdGhlIHN0YW5kYXJkIHNwZWxsaW5nLgordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3N0cnVjdCB0eXBlX2VxdWFsc18gOiBwdWJsaWMgZmFsc2VfIHsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEE+CitzdHJ1Y3QgdHlwZV9lcXVhbHNfPEEsIEE+IDogcHVibGljIHRydWVfIHsKK307CisKKy8vIGFuZF8gaXMgYSB0ZW1wbGF0ZSAmJiBvcGVyYXRvci4KKy8vIGFuZF88QSwgQj46OnZhbHVlIGV2YWx1YXRlcyAiQTo6dmFsdWUgJiYgQjo6dmFsdWUiLgordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3N0cnVjdCBhbmRfIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChBOjp2YWx1ZSAmJiBCOjp2YWx1ZSk+IHsKK307CisKKy8vIG9yXyBpcyBhIHRlbXBsYXRlIHx8IG9wZXJhdG9yLgorLy8gb3JfPEEsIEI+Ojp2YWx1ZSBldmFsdWF0ZXMgIkE6OnZhbHVlIHx8IEI6OnZhbHVlIi4KK3RlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CitzdHJ1Y3Qgb3JfIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChBOjp2YWx1ZSB8fCBCOjp2YWx1ZSk+IHsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVNUExBVEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc0NWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzAgQEAKKy8vIENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAtLS0tCisvLyBBdXRob3I6IGxhckBnb29nbGUuY29tIChMYXJhbWllIExlYXZpdHQpCisvLworLy8gVGhlc2UgdGVzdHMgYXJlIHJlYWxseSBjb21waWxlIHRpbWUgdGVzdHMuCisvLyBJZiB5b3UgdHJ5IHRvIHN0ZXAgdGhyb3VnaCB0aGlzIGluIGEgZGVidWdnZXIKKy8vIHlvdSB3aWxsIG5vdCBzZWUgYW55IGV2YWx1YXRpb25zLCBtZXJlbHkgdGhhdAorLy8gdmFsdWUgaXMgYXNzaWduZWQgdHJ1ZSBvciBmYWxzZSBzZXF1ZW50aWFsbHkuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBHT09HTEVfTkFNRVNQQUNFID0gZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw7CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCitURVNUKFRlbXBsYXRlVXRpbFRlc3QsIFRlc3RTaXplKSB7CisgIEVYUEVDVF9HVChzaXplb2YoR09PR0xFX05BTUVTUEFDRTo6YmlnXyksIHNpemVvZihHT09HTEVfTkFNRVNQQUNFOjpzbWFsbF8pKTsKK30KKworVEVTVChUZW1wbGF0ZVV0aWxUZXN0LCBUZXN0SW50ZWdyYWxDb25zdGFudHMpIHsKKyAgLy8gdGVzdCB0aGUgYnVpbHQtaW4gdHlwZXMuCisgIEVYUEVDVF9UUlVFKHRydWVfdHlwZTo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoZmFsc2VfdHlwZTo6dmFsdWUpOworCisgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAxPiBvbmVfdHlwZTsKKyAgRVhQRUNUX0VRKDEsIG9uZV90eXBlOjp2YWx1ZSk7Cit9CisKK1RFU1QoVGVtcGxhdGVVdGlsVGVzdCwgVGVzdFRlbXBsYXRlSWYpIHsKKyAgdHlwZWRlZiBpZl88dHJ1ZSwgdHJ1ZV90eXBlLCBmYWxzZV90eXBlPjo6dHlwZSBpZl90cnVlOworICBFWFBFQ1RfVFJVRShpZl90cnVlOjp2YWx1ZSk7CisKKyAgdHlwZWRlZiBpZl88ZmFsc2UsIHRydWVfdHlwZSwgZmFsc2VfdHlwZT46OnR5cGUgaWZfZmFsc2U7CisgIEVYUEVDVF9GQUxTRShpZl9mYWxzZTo6dmFsdWUpOworfQorCitURVNUKFRlbXBsYXRlVXRpbFRlc3QsIFRlc3RUZW1wbGF0ZVR5cGVFcXVhbHMpIHsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgVGVtcGxhdGVUeXBlRXF1YWxzIHdvcmtzIGNvcnJlY3RseS4KKyAgYm9vbCB2YWx1ZSA9IGZhbHNlOworCisgIC8vIFRlc3QgdGhlIHNhbWUgdHlwZSBpcyB0cnVlLgorICB2YWx1ZSA9IHR5cGVfZXF1YWxzXzxpbnQsIGludD46OnZhbHVlOworICBFWFBFQ1RfVFJVRSh2YWx1ZSk7CisKKyAgLy8gVGVzdCBkaWZmZXJlbnQgdHlwZXMgYXJlIGZhbHNlLgorICB2YWx1ZSA9IHR5cGVfZXF1YWxzXzxmbG9hdCwgaW50Pjo6dmFsdWU7CisgIEVYUEVDVF9GQUxTRSh2YWx1ZSk7CisKKyAgLy8gVGVzdCB0eXBlIGFsaWFzaW5nLgorICB0eXBlZGVmIGNvbnN0IGludCBmb287CisgIHZhbHVlID0gdHlwZV9lcXVhbHNfPGNvbnN0IGZvbywgY29uc3QgaW50Pjo6dmFsdWU7CisgIEVYUEVDVF9UUlVFKHZhbHVlKTsKK30KKworVEVTVChUZW1wbGF0ZVV0aWxUZXN0LCBUZXN0VGVtcGxhdGVBbmRPcikgeworICAvLyBDaGVjayB0aGF0IHRoZSBUZW1wbGF0ZVR5cGVFcXVhbHMgd29ya3MgY29ycmVjdGx5LgorICBib29sIHZhbHVlID0gZmFsc2U7CisKKyAgLy8gWWVzICYmIFllcyA9PSB0cnVlLgorICB2YWx1ZSA9IGFuZF88dHJ1ZV8sIHRydWVfPjo6dmFsdWU7CisgIEVYUEVDVF9UUlVFKHZhbHVlKTsKKyAgLy8gWWVzICYmIE5vID09IGZhbHNlLgorICB2YWx1ZSA9IGFuZF88dHJ1ZV8sIGZhbHNlXz46OnZhbHVlOworICBFWFBFQ1RfRkFMU0UodmFsdWUpOworICAvLyBObyAmJiBZZXMgPT0gZmFsc2UuCisgIHZhbHVlID0gYW5kXzxmYWxzZV8sIHRydWVfPjo6dmFsdWU7CisgIEVYUEVDVF9GQUxTRSh2YWx1ZSk7CisgIC8vIE5vICYmIE5vID09IGZhbHNlLgorICB2YWx1ZSA9IGFuZF88ZmFsc2VfLCBmYWxzZV8+Ojp2YWx1ZTsKKyAgRVhQRUNUX0ZBTFNFKHZhbHVlKTsKKworICAvLyBZZXMgfHwgWWVzID09IHRydWUuCisgIHZhbHVlID0gb3JfPHRydWVfLCB0cnVlXz46OnZhbHVlOworICBFWFBFQ1RfVFJVRSh2YWx1ZSk7CisgIC8vIFllcyB8fCBObyA9PSB0cnVlLgorICB2YWx1ZSA9IG9yXzx0cnVlXywgZmFsc2VfPjo6dmFsdWU7CisgIEVYUEVDVF9UUlVFKHZhbHVlKTsKKyAgLy8gTm8gfHwgWWVzID09IHRydWUuCisgIHZhbHVlID0gb3JfPGZhbHNlXywgdHJ1ZV8+Ojp2YWx1ZTsKKyAgRVhQRUNUX1RSVUUodmFsdWUpOworICAvLyBObyB8fCBObyA9PSBmYWxzZS4KKyAgdmFsdWUgPSBvcl88ZmFsc2VfLCBmYWxzZV8+Ojp2YWx1ZTsKKyAgRVhQRUNUX0ZBTFNFKHZhbHVlKTsKK30KKworVEVTVChUZW1wbGF0ZVV0aWxUZXN0LCBUZXN0SWRlbnRpdHkpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICAodHlwZV9lcXVhbHNfPEdPT0dMRV9OQU1FU1BBQ0U6OmlkZW50aXR5XzxpbnQ+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgICh0eXBlX2VxdWFsc188R09PR0xFX05BTUVTUEFDRTo6aWRlbnRpdHlfPHZvaWQ+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0cy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxZjVlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0cy5oCkBAIC0wLDAgKzEsMzM2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAtLS0tCisvLyBBdXRob3I6IE1hdHQgQXVzdGVybgorLy8KKy8vIFRoaXMgY29kZSBpcyBjb21waWxlZCBkaXJlY3RseSBvbiBtYW55IHBsYXRmb3JtcywgaW5jbHVkaW5nIGNsaWVudAorLy8gcGxhdGZvcm1zIGxpa2UgV2luZG93cywgTWFjLCBhbmQgZW1iZWRkZWQgc3lzdGVtcy4gIEJlZm9yZSBtYWtpbmcKKy8vIGFueSBjaGFuZ2VzIGhlcmUsIG1ha2Ugc3VyZSB0aGF0IHlvdSdyZSBub3QgYnJlYWtpbmcgYW55IHBsYXRmb3Jtcy4KKy8vCisvLyBEZWZpbmUgYSBzbWFsbCBzdWJzZXQgb2YgdHIxIHR5cGUgdHJhaXRzLiBUaGUgdHJhaXRzIHdlIGRlZmluZSBhcmU6CisvLyAgIGlzX2ludGVncmFsCisvLyAgIGlzX2Zsb2F0aW5nX3BvaW50CisvLyAgIGlzX3BvaW50ZXIKKy8vICAgaXNfZW51bQorLy8gICBpc19yZWZlcmVuY2UKKy8vICAgaXNfcG9kCisvLyAgIGhhc190cml2aWFsX2NvbnN0cnVjdG9yCisvLyAgIGhhc190cml2aWFsX2NvcHkKKy8vICAgaGFzX3RyaXZpYWxfYXNzaWduCisvLyAgIGhhc190cml2aWFsX2Rlc3RydWN0b3IKKy8vICAgcmVtb3ZlX2NvbnN0CisvLyAgIHJlbW92ZV92b2xhdGlsZQorLy8gICByZW1vdmVfY3YKKy8vICAgcmVtb3ZlX3JlZmVyZW5jZQorLy8gICBhZGRfcmVmZXJlbmNlCisvLyAgIHJlbW92ZV9wb2ludGVyCisvLyAgIGlzX3NhbWUKKy8vICAgaXNfY29udmVydGlibGUKKy8vIFdlIGNhbiBhZGQgbW9yZSB0eXBlIHRyYWl0cyBhcyByZXF1aXJlZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVFlQRV9UUkFJVFNfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1RZUEVfVFJBSVRTX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAgICAgICAgICAgICAgICAgIC8vIEZvciBwYWlyCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oPiAgLy8gRm9yIHRydWVfdHlwZSBhbmQgZmFsc2VfdHlwZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2ludGVncmFsOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19mbG9hdGluZ19wb2ludDsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfcG9pbnRlcjsKKy8vIE1TVkMgY2FuJ3QgY29tcGlsZSB0aGlzIGNvcnJlY3RseSwgYW5kIG5laXRoZXIgY2FuIGdjYyAzLjMuNSAoYXQgbGVhc3QpCisjaWYgIWRlZmluZWQoX01TQ19WRVIpICYmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPD0gMykKKy8vIGlzX2VudW0gdXNlcyBpc19jb252ZXJ0aWJsZSwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbiBNU1ZDLgordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19lbnVtOworI2VuZGlmCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX3JlZmVyZW5jZTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfcG9kOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29weTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfYXNzaWduOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfY29uc3Q7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHJlbW92ZV92b2xhdGlsZTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgcmVtb3ZlX2N2OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBhZGRfcmVmZXJlbmNlOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlcjsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBzdHJ1Y3QgaXNfc2FtZTsKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA8PSAzKQordGVtcGxhdGUgPGNsYXNzIEZyb20sIGNsYXNzIFRvPiBzdHJ1Y3QgaXNfY29udmVydGlibGU7CisjZW5kaWYKKworLy8gaXNfaW50ZWdyYWwgaXMgZmFsc2UgZXhjZXB0IGZvciB0aGUgYnVpbHQtaW4gaW50ZWdlciB0eXBlcy4gQQorLy8gY3YtcXVhbGlmaWVkIHR5cGUgaXMgaW50ZWdyYWwgaWYgYW5kIG9ubHkgaWYgdGhlIHVuZGVybHlpbmcgdHlwZSBpcy4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfaW50ZWdyYWwgOiBmYWxzZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPGJvb2w+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPGNoYXI+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHVuc2lnbmVkIGNoYXI+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHNpZ25lZCBjaGFyPiA6IHRydWVfdHlwZSB7IH07CisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8vIHdjaGFyX3QgaXMgbm90IGJ5IGRlZmF1bHQgYSBkaXN0aW5jdCB0eXBlIGZyb20gdW5zaWduZWQgc2hvcnQgaW4KKy8vIE1pY3Jvc29mdCBDLgorLy8gU2VlIGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGg4Y2hlN3MoVlMuODApLmFzcHgKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPF9fd2NoYXJfdD4gOiB0cnVlX3R5cGUgeyB9OworI2Vsc2UKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHdjaGFyX3Q+IDogdHJ1ZV90eXBlIHsgfTsKKyNlbmRpZgordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfaW50ZWdyYWw8c2hvcnQ+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHVuc2lnbmVkIHNob3J0PiA6IHRydWVfdHlwZSB7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19pbnRlZ3JhbDxpbnQ+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHVuc2lnbmVkIGludD4gOiB0cnVlX3R5cGUgeyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfaW50ZWdyYWw8bG9uZz4gOiB0cnVlX3R5cGUgeyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfaW50ZWdyYWw8dW5zaWduZWQgbG9uZz4gOiB0cnVlX3R5cGUgeyB9OworI2lmZGVmIEhBVkVfTE9OR19MT05HCit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19pbnRlZ3JhbDxsb25nIGxvbmc+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHVuc2lnbmVkIGxvbmcgbG9uZz4gOiB0cnVlX3R5cGUgeyB9OworI2VuZGlmCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2ludGVncmFsPGNvbnN0IFQ+IDogaXNfaW50ZWdyYWw8VD4geyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19pbnRlZ3JhbDx2b2xhdGlsZSBUPiA6IGlzX2ludGVncmFsPFQ+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfaW50ZWdyYWw8Y29uc3Qgdm9sYXRpbGUgVD4gOiBpc19pbnRlZ3JhbDxUPiB7IH07CisKKy8vIGlzX2Zsb2F0aW5nX3BvaW50IGlzIGZhbHNlIGV4Y2VwdCBmb3IgdGhlIGJ1aWx0LWluIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorLy8gQSBjdi1xdWFsaWZpZWQgdHlwZSBpcyBpbnRlZ3JhbCBpZiBhbmQgb25seSBpZiB0aGUgdW5kZXJseWluZyB0eXBlIGlzLgordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19mbG9hdGluZ19wb2ludCA6IGZhbHNlX3R5cGUgeyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQ8ZmxvYXQ+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2Zsb2F0aW5nX3BvaW50PGRvdWJsZT4gOiB0cnVlX3R5cGUgeyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQ8bG9uZyBkb3VibGU+IDogdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQ8Y29uc3QgVD4KKyAgICA6IGlzX2Zsb2F0aW5nX3BvaW50PFQ+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQ8dm9sYXRpbGUgVD4KKyAgICA6IGlzX2Zsb2F0aW5nX3BvaW50PFQ+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQ8Y29uc3Qgdm9sYXRpbGUgVD4KKyAgICA6IGlzX2Zsb2F0aW5nX3BvaW50PFQ+IHsgfTsKKworLy8gaXNfcG9pbnRlciBpcyBmYWxzZSBleGNlcHQgZm9yIHBvaW50ZXIgdHlwZXMuIEEgY3YtcXVhbGlmaWVkIHR5cGUgKGUuZy4KKy8vICJpbnQqIGNvbnN0IiwgYXMgb3Bwb3NlZCB0byAiaW50IGNvbnN0KiIpIGlzIGN2LXF1YWxpZmllZCBpZiBhbmQgb25seSBpZgorLy8gdGhlIHVuZGVybHlpbmcgdHlwZSBpcy4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfcG9pbnRlciA6IGZhbHNlX3R5cGUgeyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19wb2ludGVyPFQqPiA6IHRydWVfdHlwZSB7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX3BvaW50ZXI8Y29uc3QgVD4gOiBpc19wb2ludGVyPFQ+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfcG9pbnRlcjx2b2xhdGlsZSBUPiA6IGlzX3BvaW50ZXI8VD4geyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19wb2ludGVyPGNvbnN0IHZvbGF0aWxlIFQ+IDogaXNfcG9pbnRlcjxUPiB7IH07CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA8PSAzKQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2NsYXNzX29yX3VuaW9uIHsKKyAgdGVtcGxhdGUgPGNsYXNzIFU+IHN0YXRpYyBzbWFsbF8gdGVzdGVyKHZvaWQgKFU6OiopKCkpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gc3RhdGljIGJpZ18gdGVzdGVyKC4uLik7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKHRlc3RlcjxUPigwKSkgPT0gc2l6ZW9mKHNtYWxsXyk7Cit9OworCisvLyBpc19jb252ZXJ0aWJsZSBjaG9rZXMgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGFycmF5LiBUaGF0J3Mgd2h5CisvLyB3ZSB1c2UgYWRkX3JlZmVyZW5jZSBoZXJlLgordGVtcGxhdGUgPGJvb2wgTm90VW51bSwgY2xhc3MgVD4gc3RydWN0IGlzX2VudW1faW1wbAorICAgIDogaXNfY29udmVydGlibGU8dHlwZW5hbWUgYWRkX3JlZmVyZW5jZTxUPjo6dHlwZSwgaW50PiB7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZW51bV9pbXBsPHRydWUsIFQ+IDogZmFsc2VfdHlwZSB7IH07CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBTcGVjaWZpZWQgYnkgVFIxIFs0LjUuMV0gcHJpbWFyeSB0eXBlIGNhdGVnb3JpZXMuCisKKy8vIEltcGxlbWVudGF0aW9uIG5vdGU6CisvLworLy8gRWFjaCB0eXBlIGlzIGVpdGhlciB2b2lkLCBpbnRlZ3JhbCwgZmxvYXRpbmcgcG9pbnQsIGFycmF5LCBwb2ludGVyLAorLy8gcmVmZXJlbmNlLCBtZW1iZXIgb2JqZWN0IHBvaW50ZXIsIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLCBlbnVtLAorLy8gdW5pb24gb3IgY2xhc3MuIE91dCBvZiB0aGVzZSwgb25seSBpbnRlZ3JhbCwgZmxvYXRpbmcgcG9pbnQsIHJlZmVyZW5jZSwKKy8vIGNsYXNzIGFuZCBlbnVtIHR5cGVzIGFyZSBwb3RlbnRpYWxseSBjb252ZXJ0aWJsZSB0byBpbnQuIFRoZXJlZm9yZSwKKy8vIGlmIGEgdHlwZSBpcyBub3QgYSByZWZlcmVuY2UsIGludGVncmFsLCBmbG9hdGluZyBwb2ludCBvciBjbGFzcyBhbmQKKy8vIGlzIGNvbnZlcnRpYmxlIHRvIGludCwgaXQncyBhIGVudW0uIEFkZGluZyBjdi1xdWFsaWZpY2F0aW9uIHRvIGEgdHlwZQorLy8gZG9lcyBub3QgY2hhbmdlIHdoZXRoZXIgaXQncyBhbiBlbnVtLgorLy8KKy8vIElzLWNvbnZlcnRpYmxlLXRvLWludCBjaGVjayBpcyBkb25lIG9ubHkgaWYgYWxsIG90aGVyIGNoZWNrcyBwYXNzLAorLy8gYmVjYXVzZSBpdCBjYW4ndCBiZSB1c2VkIHdpdGggc29tZSB0eXBlcyAoZS5nLiB2b2lkIG9yIGNsYXNzZXMgd2l0aAorLy8gaW5hY2Nlc3NpYmxlIGNvbnZlcnNpb24gb3BlcmF0b3JzKS4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZW51bQorICAgIDogaW50ZXJuYWw6OmlzX2VudW1faW1wbDwKKyAgICAgICAgICBpc19zYW1lPFQsIHZvaWQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICBpc19pbnRlZ3JhbDxUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgaXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlIHx8CisgICAgICAgICAgICAgIGlzX3JlZmVyZW5jZTxUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6OmlzX2NsYXNzX29yX3VuaW9uPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICBUPiB7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZW51bTxjb25zdCBUPiA6IGlzX2VudW08VD4geyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19lbnVtPHZvbGF0aWxlIFQ+IDogaXNfZW51bTxUPiB7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2VudW08Y29uc3Qgdm9sYXRpbGUgVD4gOiBpc19lbnVtPFQ+IHsgfTsKKworI2VuZGlmCisKKy8vIGlzX3JlZmVyZW5jZSBpcyBmYWxzZSBleGNlcHQgZm9yIHJlZmVyZW5jZSB0eXBlcy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19yZWZlcmVuY2UgOiBmYWxzZV90eXBlIHt9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGlzX3JlZmVyZW5jZTxUJj4gOiB0cnVlX3R5cGUge307CisKKworLy8gV2UgY2FuJ3QgZ2V0IGlzX3BvZCByaWdodCB3aXRob3V0IGNvbXBpbGVyIGhlbHAsIHNvIGZhaWwgY29uc2VydmF0aXZlbHkuCisvLyBXZSB3aWxsIGFzc3VtZSBpdCdzIGZhbHNlIGV4Y2VwdCBmb3IgYXJpdGhtZXRpYyB0eXBlcywgZW51bWVyYXRpb25zLAorLy8gcG9pbnRlcnMgYW5kIGN2LXF1YWxpZmllZCB2ZXJzaW9ucyB0aGVyZW9mLiBOb3RlIHRoYXQgc3RkOjpwYWlyPFQsVT4KKy8vIGlzIG5vdCBhIFBPRCBldmVuIGlmIFQgYW5kIFUgYXJlIFBPRHMuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX3BvZAorIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX2ludGVncmFsPFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSB8fAorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fIDw9IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNfZW51bSBpcyBub3QgYXZhaWxhYmxlIG9uIE1TVkMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZW51bTxUPjo6dmFsdWUgfHwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3BvaW50ZXI8VD46OnZhbHVlKT4geyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19wb2Q8Y29uc3QgVD4gOiBpc19wb2Q8VD4geyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19wb2Q8dm9sYXRpbGUgVD4gOiBpc19wb2Q8VD4geyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19wb2Q8Y29uc3Qgdm9sYXRpbGUgVD4gOiBpc19wb2Q8VD4geyB9OworCisKKy8vIFdlIGNhbid0IGdldCBoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvciByaWdodCB3aXRob3V0IGNvbXBpbGVyIGhlbHAsIHNvCisvLyBmYWlsIGNvbnNlcnZhdGl2ZWx5LiBXZSB3aWxsIGFzc3VtZSBpdCdzIGZhbHNlIGV4Y2VwdCBmb3I6ICgxKSB0eXBlcworLy8gZm9yIHdoaWNoIGlzX3BvZCBpcyB0cnVlLiAoMikgc3RkOjpwYWlyIG9mIHR5cGVzIHdpdGggdHJpdmlhbAorLy8gY29uc3RydWN0b3JzLiAoMykgYXJyYXkgb2YgYSB0eXBlIHdpdGggYSB0cml2aWFsIGNvbnN0cnVjdG9yLgorLy8gKDQpIGNvbnN0IHZlcnNpb25zIHRoZXJlb2YuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGhhc190cml2aWFsX2NvbnN0cnVjdG9yIDogaXNfcG9kPFQ+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8c3RkOjpwYWlyPFQsIFU+ID4KKyAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgIChoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8VT46OnZhbHVlKT4geyB9OwordGVtcGxhdGUgPGNsYXNzIEEsIGludCBOPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8QVtOXT4KKyAgOiBoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxBPiB7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGhhc190cml2aWFsX2NvbnN0cnVjdG9yPGNvbnN0IFQ+CisgIDogaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8VD4geyB9OworCisvLyBXZSBjYW4ndCBnZXQgaGFzX3RyaXZpYWxfY29weSByaWdodCB3aXRob3V0IGNvbXBpbGVyIGhlbHAsIHNvIGZhaWwKKy8vIGNvbnNlcnZhdGl2ZWx5LiBXZSB3aWxsIGFzc3VtZSBpdCdzIGZhbHNlIGV4Y2VwdCBmb3I6ICgxKSB0eXBlcworLy8gZm9yIHdoaWNoIGlzX3BvZCBpcyB0cnVlLiAoMikgc3RkOjpwYWlyIG9mIHR5cGVzIHdpdGggdHJpdmlhbCBjb3B5CisvLyBjb25zdHJ1Y3RvcnMuICgzKSBhcnJheSBvZiBhIHR5cGUgd2l0aCBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3Rvci4KKy8vICg0KSBjb25zdCB2ZXJzaW9ucyB0aGVyZW9mLgordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBoYXNfdHJpdmlhbF9jb3B5IDogaXNfcG9kPFQ+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29weTxzdGQ6OnBhaXI8VCwgVT4gPgorICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgKGhhc190cml2aWFsX2NvcHk8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgIGhhc190cml2aWFsX2NvcHk8VT46OnZhbHVlKT4geyB9OwordGVtcGxhdGUgPGNsYXNzIEEsIGludCBOPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29weTxBW05dPgorICA6IGhhc190cml2aWFsX2NvcHk8QT4geyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBoYXNfdHJpdmlhbF9jb3B5PGNvbnN0IFQ+IDogaGFzX3RyaXZpYWxfY29weTxUPiB7IH07CisKKy8vIFdlIGNhbid0IGdldCBoYXNfdHJpdmlhbF9hc3NpZ24gcmlnaHQgd2l0aG91dCBjb21waWxlciBoZWxwLCBzbyBmYWlsCisvLyBjb25zZXJ2YXRpdmVseS4gV2Ugd2lsbCBhc3N1bWUgaXQncyBmYWxzZSBleGNlcHQgZm9yOiAoMSkgdHlwZXMKKy8vIGZvciB3aGljaCBpc19wb2QgaXMgdHJ1ZS4gKDIpIHN0ZDo6cGFpciBvZiB0eXBlcyB3aXRoIHRyaXZpYWwgY29weQorLy8gY29uc3RydWN0b3JzLiAoMykgYXJyYXkgb2YgYSB0eXBlIHdpdGggYSB0cml2aWFsIGFzc2lnbiBjb25zdHJ1Y3Rvci4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfYXNzaWduIDogaXNfcG9kPFQ+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfYXNzaWduPHN0ZDo6cGFpcjxULCBVPiA+CisgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAoaGFzX3RyaXZpYWxfYXNzaWduPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICBoYXNfdHJpdmlhbF9hc3NpZ248VT46OnZhbHVlKT4geyB9OwordGVtcGxhdGUgPGNsYXNzIEEsIGludCBOPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfYXNzaWduPEFbTl0+CisgIDogaGFzX3RyaXZpYWxfYXNzaWduPEE+IHsgfTsKKworLy8gV2UgY2FuJ3QgZ2V0IGhhc190cml2aWFsX2Rlc3RydWN0b3IgcmlnaHQgd2l0aG91dCBjb21waWxlciBoZWxwLCBzbworLy8gZmFpbCBjb25zZXJ2YXRpdmVseS4gV2Ugd2lsbCBhc3N1bWUgaXQncyBmYWxzZSBleGNlcHQgZm9yOiAoMSkgdHlwZXMKKy8vIGZvciB3aGljaCBpc19wb2QgaXMgdHJ1ZS4gKDIpIHN0ZDo6cGFpciBvZiB0eXBlcyB3aXRoIHRyaXZpYWwKKy8vIGRlc3RydWN0b3JzLiAoMykgYXJyYXkgb2YgYSB0eXBlIHdpdGggYSB0cml2aWFsIGRlc3RydWN0b3IuCisvLyAoNCkgY29uc3QgdmVyc2lvbnMgdGhlcmVvZi4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciA6IGlzX3BvZDxUPiB7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gc3RydWN0IGhhc190cml2aWFsX2Rlc3RydWN0b3I8c3RkOjpwYWlyPFQsIFU+ID4KKyAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgIChoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFU+Ojp2YWx1ZSk+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBBLCBpbnQgTj4gc3RydWN0IGhhc190cml2aWFsX2Rlc3RydWN0b3I8QVtOXT4KKyAgOiBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPEE+IHsgfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcjxjb25zdCBUPgorICA6IGhhc190cml2aWFsX2Rlc3RydWN0b3I8VD4geyB9OworCisvLyBTcGVjaWZpZWQgYnkgVFIxIFs0LjcuMV0KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfY29uc3QgeyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfY29uc3Q8VCBjb25zdD4geyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfdm9sYXRpbGUgeyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfdm9sYXRpbGU8VCB2b2xhdGlsZT4geyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfY3YgeworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDx0eXBlbmFtZSByZW1vdmVfdm9sYXRpbGU8VD46OnR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCisKKy8vIFNwZWNpZmllZCBieSBUUjEgWzQuNy4yXSBSZWZlcmVuY2UgbW9kaWZpY2F0aW9ucy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlIHsgdHlwZWRlZiBUIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQgdHlwZTsgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBhZGRfcmVmZXJlbmNlIHsgdHlwZWRlZiBUJiB0eXBlOyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBhZGRfcmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsKKworLy8gU3BlY2lmaWVkIGJ5IFRSMSBbNC43LjRdIFBvaW50ZXIgbW9kaWZpY2F0aW9ucy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlciB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIGNvbnN0PiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIHZvbGF0aWxlPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIGNvbnN0IHZvbGF0aWxlPiB7CisgIHR5cGVkZWYgVCB0eXBlOyB9OworCisvLyBTcGVjaWZpZWQgYnkgVFIxIFs0LjZdIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0eXBlcwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gc3RydWN0IGlzX3NhbWUgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfc2FtZTxULCBUPiA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisvLyBTcGVjaWZpZWQgYnkgVFIxIFs0LjZdIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0eXBlcworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fIDw9IDMpCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBmb3IgaXNfY29udmVydGlibGUsIGFuZCB5b3UKKy8vIGRvbid0IG5lZWQgdG8ga25vdyBob3cgaXQgd29ya3MgdG8gdXNlIGlzX2NvbnZlcnRpYmxlLiBGb3IgdGhvc2UKKy8vIHdobyBjYXJlOiB3ZSBkZWNsYXJlIHR3byBkaWZmZXJlbnQgZnVuY3Rpb25zLCBvbmUgd2hvc2UgYXJndW1lbnQgaXMKKy8vIG9mIHR5cGUgVG8gYW5kIG9uZSB3aXRoIGEgdmFyaWFkaWMgYXJndW1lbnQgbGlzdC4gV2UgZ2l2ZSB0aGVtCisvLyByZXR1cm4gdHlwZXMgb2YgZGlmZmVyZW50IHNpemUsIHNvIHdlIGNhbiB1c2Ugc2l6ZW9mIHRvIHRyaWNrIHRoZQorLy8gY29tcGlsZXIgaW50byB0ZWxsaW5nIHVzIHdoaWNoIGZ1bmN0aW9uIGl0IHdvdWxkIGhhdmUgY2hvc2VuIGlmIHdlCisvLyBoYWQgY2FsbGVkIGl0IHdpdGggYW4gYXJndW1lbnQgb2YgdHlwZSBGcm9tLiAgU2VlIEFsZXhhbmRyZXNjdSdzCisvLyBfTW9kZXJuIEMrKyBEZXNpZ25fIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcyBzb3J0IG9mIHRyaWNrLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CitzdHJ1Y3QgQ29udmVydEhlbHBlciB7CisgIHN0YXRpYyBzbWFsbF8gVGVzdChUbyk7CisgIHN0YXRpYyBiaWdfIFRlc3QoLi4uKTsKKyAgc3RhdGljIEZyb20gQ3JlYXRlKCk7Cit9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEluaGVyaXRzIGZyb20gdHJ1ZV90eXBlIGlmIEZyb20gaXMgY29udmVydGlibGUgdG8gVG8sIGZhbHNlX3R5cGUgb3RoZXJ3aXNlLgordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorc3RydWN0IGlzX2NvbnZlcnRpYmxlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludGVybmFsOjpDb252ZXJ0SGVscGVyPEZyb20sIFRvPjo6VGVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6Q29udmVydEhlbHBlcjxGcm9tLCBUbz46OkNyZWF0ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IHNpemVvZihzbWFsbF8pPiB7Cit9OworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1RZUEVfVFJBSVRTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4Y2JmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYwpAQCAtMCwwICsxLDYyOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gLS0tLQorLy8gQXV0aG9yOiBNYXR0IEF1c3Rlcm4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0cy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgLy8gZm9yIGV4aXQoKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit0eXBlZGVmIGludCBpbnQzMjsKK3R5cGVkZWYgbG9uZyBpbnQ2NDsKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6cGFpcjsKKworCisvLyBUaGlzIGFzc2VydGlvbiBwcm9kdWNlcyBlcnJvcnMgbGlrZSAiZXJyb3I6IGludmFsaWQgdXNlIG9mCisvLyBpbmNvbXBsZXRlIHR5cGUgJ3N0cnVjdCA8dW5uYW1lZD46OkFzc2VydFR5cGVzRXE8Y29uc3QgaW50LCBpbnQ+JyIKKy8vIHdoZW4gaXQgZmFpbHMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBzdHJ1Y3QgQXNzZXJ0VHlwZXNFcTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBc3NlcnRUeXBlc0VxPFQsIFQ+IHt9OworI2RlZmluZSBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShULCBVKSBzdGF0aWNfY2FzdDx2b2lkPihBc3NlcnRUeXBlc0VxPFQsIFU+KCkpCisKKy8vIEEgdXNlci1kZWZpbmVkIFBPRCB0eXBlLgorc3RydWN0IEEgeworICBpbnQgbl87Cit9OworCisvLyBBIHVzZXItZGVmaW5lZCBub24tUE9EIHR5cGUgd2l0aCBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3Rvci4KK2NsYXNzIEIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQihpbnQgbikgOiBuXyhuKSB7IH0KKyBwcml2YXRlOgorICBpbnQgbl87Cit9OworCisvLyBBbm90aGVyIHVzZXItZGVmaW5lZCBub24tUE9EIHR5cGUgd2l0aCBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3Rvci4KKy8vIFdlIHdpbGwgZXhwbGljaXRseSBkZWNsYXJlIEMgdG8gaGF2ZSBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3RvcgorLy8gYnkgc3BlY2lhbGl6aW5nIGhhc190cml2aWFsX2NvcHkuCitjbGFzcyBDIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEMoaW50IG4pIDogbl8obikgeyB9CisgcHJpdmF0ZToKKyAgaW50IG5fOworfTsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPD4gc3RydWN0IGhhc190cml2aWFsX2NvcHk8Qz4gOiB0cnVlX3R5cGUgeyB9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworLy8gQW5vdGhlciB1c2VyLWRlZmluZWQgbm9uLVBPRCB0eXBlIHdpdGggYSB0cml2aWFsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisvLyBXZSB3aWxsIGV4cGxpY2l0bHkgZGVjbGFyZSBDIHRvIGhhdmUgYSB0cml2aWFsIGFzc2lnbm1lbnQgb3BlcmF0b3IKKy8vIGJ5IHNwZWNpYWxpemluZyBoYXNfdHJpdmlhbF9hc3NpZ24uCitjbGFzcyBEIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEQoaW50IG4pIDogbl8obikgeyB9CisgcHJpdmF0ZToKKyAgaW50IG5fOworfTsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPD4gc3RydWN0IGhhc190cml2aWFsX2Fzc2lnbjxEPiA6IHRydWVfdHlwZSB7IH07Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisvLyBBbm90aGVyIHVzZXItZGVmaW5lZCBub24tUE9EIHR5cGUgd2l0aCBhIHRyaXZpYWwgY29uc3RydWN0b3IuCisvLyBXZSB3aWxsIGV4cGxpY2l0bHkgZGVjbGFyZSBFIHRvIGhhdmUgYSB0cml2aWFsIGNvbnN0cnVjdG9yCisvLyBieSBzcGVjaWFsaXppbmcgaGFzX3RyaXZpYWxfY29uc3RydWN0b3IuCitjbGFzcyBFIHsKKyBwdWJsaWM6CisgIGludCBuXzsKK307CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTw+IHN0cnVjdCBoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxFPiA6IHRydWVfdHlwZSB7IH07Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisvLyBBbm90aGVyIHVzZXItZGVmaW5lZCBub24tUE9EIHR5cGUgd2l0aCBhIHRyaXZpYWwgZGVzdHJ1Y3Rvci4KKy8vIFdlIHdpbGwgZXhwbGljaXRseSBkZWNsYXJlIEUgdG8gaGF2ZSBhIHRyaXZpYWwgZGVzdHJ1Y3RvcgorLy8gYnkgc3BlY2lhbGl6aW5nIGhhc190cml2aWFsX2Rlc3RydWN0b3IuCitjbGFzcyBGIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEYoaW50IG4pIDogbl8obikgeyB9CisgcHJpdmF0ZToKKyAgaW50IG5fOworfTsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPD4gc3RydWN0IGhhc190cml2aWFsX2Rlc3RydWN0b3I8Rj4gOiB0cnVlX3R5cGUgeyB9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworZW51bSBHIHt9OworCit1bmlvbiBIIHt9OworCitjbGFzcyBJIHsKKyBwdWJsaWM6CisgIG9wZXJhdG9yIGludCgpIGNvbnN0OworfTsKKworY2xhc3MgSiB7CisgcHJpdmF0ZToKKyAgb3BlcmF0b3IgaW50KCkgY29uc3Q7Cit9OworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworLy8gQSBiYXNlIGNsYXNzIGFuZCBhIGRlcml2ZWQgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIGl0LCB1c2VkIGZvcgorLy8gdGVzdGluZyBjb252ZXJzaW9uIHR5cGUgdHJhaXRzLgorY2xhc3MgQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5CYXNlKCkgeyB9Cit9OworCitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgeworfTsKKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdElzSW50ZWdlcikgeworICAvLyBWZXJpZnkgdGhhdCBpc19pbnRlZ3JhbCBpcyB0cnVlIGZvciBhbGwgaW50ZWdlciB0eXBlcy4KKyAgRVhQRUNUX1RSVUUoaXNfaW50ZWdyYWw8Ym9vbD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfaW50ZWdyYWw8Y2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfaW50ZWdyYWw8dW5zaWduZWQgY2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfaW50ZWdyYWw8c2lnbmVkIGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX2ludGVncmFsPHdjaGFyX3Q+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX2ludGVncmFsPGludD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfaW50ZWdyYWw8dW5zaWduZWQgaW50Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19pbnRlZ3JhbDxzaG9ydD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfaW50ZWdyYWw8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX2ludGVncmFsPGxvbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX2ludGVncmFsPHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgaXNfaW50ZWdyYWwgaXMgZmFsc2UgZm9yIGEgZmV3IG5vbi1pbnRlZ2VyIHR5cGVzLgorICBFWFBFQ1RfRkFMU0UoaXNfaW50ZWdyYWw8dm9pZD46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2ludGVncmFsPGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfaW50ZWdyYWw8c3RyaW5nPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfaW50ZWdyYWw8aW50Kj46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2ludGVncmFsPEE+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRSgoaXNfaW50ZWdyYWw8cGFpcjxpbnQsIGludD4gPjo6dmFsdWUpKTsKKworICAvLyBWZXJpZnkgdGhhdCBjdi1xdWFsaWZpZWQgaW50ZWdyYWwgdHlwZXMgYXJlIHN0aWxsIGludGVncmFsLCBhbmQKKyAgLy8gY3YtcXVhbGlmaWVkIG5vbi1pbnRlZ3JhbCB0eXBlcyBhcmUgc3RpbGwgbm9uLWludGVncmFsLgorICBFWFBFQ1RfVFJVRShpc19pbnRlZ3JhbDxjb25zdCBjaGFyPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19pbnRlZ3JhbDx2b2xhdGlsZSBib29sPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19pbnRlZ3JhbDxjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19pbnRlZ3JhbDxjb25zdCBmbG9hdD46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2ludGVncmFsPGludCogdm9sYXRpbGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19pbnRlZ3JhbDxjb25zdCB2b2xhdGlsZSBzdHJpbmc+Ojp2YWx1ZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFRlc3RJc0Zsb2F0aW5nKSB7CisgIC8vIFZlcmlmeSB0aGF0IGlzX2Zsb2F0aW5nX3BvaW50IGlzIHRydWUgZm9yIGFsbCBmbG9hdGluZy1wb2ludCB0eXBlcy4KKyAgRVhQRUNUX1RSVUUoaXNfZmxvYXRpbmdfcG9pbnQ8ZmxvYXQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX2Zsb2F0aW5nX3BvaW50PGRvdWJsZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfZmxvYXRpbmdfcG9pbnQ8bG9uZyBkb3VibGU+Ojp2YWx1ZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgaXNfZmxvYXRpbmdfcG9pbnQgaXMgZmFsc2UgZm9yIGEgZmV3IG5vbi1mbG9hdCB0eXBlcy4KKyAgRVhQRUNUX0ZBTFNFKGlzX2Zsb2F0aW5nX3BvaW50PHZvaWQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19mbG9hdGluZ19wb2ludDxsb25nPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZmxvYXRpbmdfcG9pbnQ8c3RyaW5nPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZmxvYXRpbmdfcG9pbnQ8ZmxvYXQqPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZmxvYXRpbmdfcG9pbnQ8QT46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKChpc19mbG9hdGluZ19wb2ludDxwYWlyPGludCwgaW50PiA+Ojp2YWx1ZSkpOworCisgIC8vIFZlcmlmeSB0aGF0IGN2LXF1YWxpZmllZCBmbG9hdGluZyBwb2ludCB0eXBlcyBhcmUgc3RpbGwgZmxvYXRpbmcsIGFuZAorICAvLyBjdi1xdWFsaWZpZWQgbm9uLWZsb2F0aW5nIHR5cGVzIGFyZSBzdGlsbCBub24tZmxvYXRpbmcuCisgIEVYUEVDVF9UUlVFKGlzX2Zsb2F0aW5nX3BvaW50PGNvbnN0IGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19mbG9hdGluZ19wb2ludDx2b2xhdGlsZSBkb3VibGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX2Zsb2F0aW5nX3BvaW50PGNvbnN0IHZvbGF0aWxlIGxvbmcgZG91YmxlPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZmxvYXRpbmdfcG9pbnQ8Y29uc3QgaW50Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZmxvYXRpbmdfcG9pbnQ8dm9sYXRpbGUgc3RyaW5nPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZmxvYXRpbmdfcG9pbnQ8Y29uc3Qgdm9sYXRpbGUgY2hhcj46OnZhbHVlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdElzUG9pbnRlcikgeworICAvLyBWZXJpZnkgdGhhdCBpc19wb2ludGVyIGlzIHRydWUgZm9yIHNvbWUgcG9pbnRlciB0eXBlcy4KKyAgRVhQRUNUX1RSVUUoaXNfcG9pbnRlcjxpbnQqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2ludGVyPHZvaWQqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2ludGVyPHN0cmluZyo+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvaW50ZXI8Y29uc3Qgdm9pZCo+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvaW50ZXI8dm9sYXRpbGUgZmxvYXQqIGNvbnN0Kj46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBpc19wb2ludGVyIGlzIGZhbHNlIGZvciBzb21lIG5vbi1wb2ludGVyIHR5cGVzLgorICBFWFBFQ1RfRkFMU0UoaXNfcG9pbnRlcjx2b2lkPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcG9pbnRlcjxmbG9hdCY+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPGxvbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPHZlY3RvcjxpbnQqPiA+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPGludFs1XT46OnZhbHVlKTsKKworICAvLyBBIGZ1bmN0aW9uIHBvaW50ZXIgaXMgYSBwb2ludGVyLCBidXQgYSBmdW5jdGlvbiB0eXBlLCBvciBhIGZ1bmN0aW9uCisgIC8vIHJlZmVyZW5jZSB0eXBlLCBpcyBub3QuCisgIEVYUEVDVF9UUlVFKGlzX3BvaW50ZXI8aW50ICgqKShpbnQgeCk+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPHZvaWQoY2hhciB4KT46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3BvaW50ZXI8ZG91YmxlICgmKShzdHJpbmcgeCk+Ojp2YWx1ZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgaXNfcG9pbnRlcjxUPiBpcyB0cnVlIGZvciBzb21lIGN2LXF1YWxpZmllZCBwb2ludGVyIHR5cGVzLAorICAvLyBhbmQgZmFsc2UgZm9yIHNvbWUgY3YtcXVhbGlmaWVkIG5vbi1wb2ludGVyIHR5cGVzLgorICBFWFBFQ1RfVFJVRShpc19wb2ludGVyPGludCogY29uc3Q+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvaW50ZXI8Y29uc3Qgdm9pZCogdm9sYXRpbGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvaW50ZXI8Y2hhcioqIGNvbnN0IHZvbGF0aWxlPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcG9pbnRlcjxjb25zdCBpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPHZvbGF0aWxlIHZlY3RvcjxpbnQqPiA+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPGNvbnN0IHZvbGF0aWxlIGRvdWJsZT46OnZhbHVlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdElzRW51bSkgeworLy8gaXNfZW51bSBpc24ndCBzdXBwb3J0ZWQgb24gTVNWQyBvciBnY2MgMy54CisjaWYgIWRlZmluZWQoX01TQ19WRVIpICYmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPD0gMykKKyAgLy8gVmVyaWZ5IHRoYXQgaXNfZW51bSBpcyB0cnVlIGZvciBlbnVtIHR5cGVzLgorICBFWFBFQ1RfVFJVRShpc19lbnVtPEc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX2VudW08Y29uc3QgRz46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfZW51bTx2b2xhdGlsZSBHPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19lbnVtPGNvbnN0IHZvbGF0aWxlIEc+Ojp2YWx1ZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgaXNfZW51bSBpcyBmYWxzZSBmb3IgYSBmZXcgbm9uLWVudW0gdHlwZXMuCisgIEVYUEVDVF9GQUxTRShpc19lbnVtPHZvaWQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19lbnVtPEcmPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTxHWzFdPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTxjb25zdCBHWzFdPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTxHW10+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19lbnVtPGludD46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2VudW08ZmxvYXQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19lbnVtPEE+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19lbnVtPEEqPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTxjb25zdCBBPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTxIPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTxJPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTxKPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfZW51bTx2b2lkKCk+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19lbnVtPHZvaWQoKikoKT46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2VudW08aW50IEE6Oio+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19lbnVtPHZvaWQgKEE6OiopKCk+Ojp2YWx1ZSk7CisjZW5kaWYKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdElzUmVmZXJlbmNlKSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgaXNfcmVmZXJlbmNlIGlzIHRydWUgZm9yIGFsbCByZWZlcmVuY2UgdHlwZXMuCisgIHR5cGVkZWYgZmxvYXQmIFJlZkZsb2F0OworICBFWFBFQ1RfVFJVRShpc19yZWZlcmVuY2U8ZmxvYXQmPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19yZWZlcmVuY2U8Y29uc3QgaW50Jj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcmVmZXJlbmNlPGNvbnN0IGludComPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19yZWZlcmVuY2U8aW50ICgmKShib29sKT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcmVmZXJlbmNlPFJlZkZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19yZWZlcmVuY2U8Y29uc3QgUmVmRmxvYXQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3JlZmVyZW5jZTx2b2xhdGlsZSBSZWZGbG9hdD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcmVmZXJlbmNlPGNvbnN0IHZvbGF0aWxlIFJlZkZsb2F0Pjo6dmFsdWUpOworCisKKyAgLy8gVmVyaWZpZXMgdGhhdCBpc19yZWZlcmVuY2UgaXMgZmFsc2UgZm9yIGFsbCBub24tcmVmZXJlbmNlIHR5cGVzLgorICBFWFBFQ1RfRkFMU0UoaXNfcmVmZXJlbmNlPGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcmVmZXJlbmNlPGNvbnN0IGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcmVmZXJlbmNlPHZvbGF0aWxlIGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcmVmZXJlbmNlPGNvbnN0IHZvbGF0aWxlIGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcmVmZXJlbmNlPGNvbnN0IGludCo+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19yZWZlcmVuY2U8aW50KCk+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19yZWZlcmVuY2U8dm9pZCgqKShjb25zdCBjaGFyJik+Ojp2YWx1ZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFRlc3RBZGRSZWZlcmVuY2UpIHsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoaW50JiwgYWRkX3JlZmVyZW5jZTxpbnQ+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoY29uc3QgaW50JiwgYWRkX3JlZmVyZW5jZTxjb25zdCBpbnQ+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEodm9sYXRpbGUgaW50JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZmVyZW5jZTx2b2xhdGlsZSBpbnQ+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoY29uc3Qgdm9sYXRpbGUgaW50JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZmVyZW5jZTxjb25zdCB2b2xhdGlsZSBpbnQ+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoaW50JiwgYWRkX3JlZmVyZW5jZTxpbnQmPjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGNvbnN0IGludCYsIGFkZF9yZWZlcmVuY2U8Y29uc3QgaW50Jj46OnR5cGUpOworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUSh2b2xhdGlsZSBpbnQmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfcmVmZXJlbmNlPHZvbGF0aWxlIGludCY+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoY29uc3Qgdm9sYXRpbGUgaW50JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZmVyZW5jZTxjb25zdCB2b2xhdGlsZSBpbnQmPjo6dHlwZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFRlc3RJc1BvZCkgeworICAvLyBWZXJpZnkgdGhhdCBhcml0aG1ldGljIHR5cGVzIGFuZCBwb2ludGVycyBhcmUgbWFya2VkIGFzIFBPRHMuCisgIEVYUEVDVF9UUlVFKGlzX3BvZDxib29sPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2Q8Y2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDxzaWduZWQgY2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPHdjaGFyX3Q+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDxpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDxzaG9ydD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2Q8bG9uZz46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDxmbG9hdD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPGRvdWJsZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPGxvbmcgZG91YmxlPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2Q8c3RyaW5nKj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPEEqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2Q8Y29uc3QgQio+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDxDKio+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDxjb25zdCBpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDxjaGFyKiB2b2xhdGlsZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPGNvbnN0IHZvbGF0aWxlIGRvdWJsZT46OnZhbHVlKTsKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA8PSAzKQorICBFWFBFQ1RfVFJVRShpc19wb2Q8Rz46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcG9kPGNvbnN0IEc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3BvZDx2b2xhdGlsZSBHPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2Q8Y29uc3Qgdm9sYXRpbGUgRz46OnZhbHVlKTsKKyNlbmRpZgorCisgIC8vIFZlcmlmeSB0aGF0IHNvbWUgbm9uLVBPRCB0eXBlcyBhcmUgbm90IG1hcmtlZCBhcyBQT0RzLgorICBFWFBFQ1RfRkFMU0UoaXNfcG9kPHZvaWQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2Q8c3RyaW5nPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoKGlzX3BvZDxwYWlyPGludCwgaW50PiA+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoaXNfcG9kPEE+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2Q8Qj46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3BvZDxDPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcG9kPGNvbnN0IHN0cmluZz46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3BvZDx2b2xhdGlsZSBBPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcG9kPGNvbnN0IHZvbGF0aWxlIEI+Ojp2YWx1ZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFRlc3RIYXNUcml2aWFsQ29uc3RydWN0b3IpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgYXJpdGhtZXRpYyB0eXBlcyBhbmQgcG9pbnRlcnMgaGF2ZSB0cml2aWFsIGNvbnN0cnVjdG9ycy4KKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8Ym9vbD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8Y2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8dW5zaWduZWQgY2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8c2lnbmVkIGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPHdjaGFyX3Q+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPGludD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8dW5zaWduZWQgaW50Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxzaG9ydD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPGxvbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb25zdHJ1Y3Rvcjxkb3VibGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPGxvbmcgZG91YmxlPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxzdHJpbmcqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxBKj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8Y29uc3QgQio+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPEMqKj46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBwYWlycyBhbmQgYXJyYXlzIG9mIHN1Y2ggdHlwZXMgaGF2ZSB0cml2aWFsCisgIC8vIGNvbnN0cnVjdG9ycy4KKyAgdHlwZWRlZiBpbnQgaW50MTBbMTBdOworICBFWFBFQ1RfVFJVRSgoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8cGFpcjxpbnQsIGNoYXIqPiA+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxpbnQxMD46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBwYWlycyBvZiB0eXBlcyB3aXRob3V0IHRyaXZpYWwgY29uc3RydWN0b3JzCisgIC8vIGFyZSBub3QgbWFya2VkIGFzIHRyaXZpYWwuCisgIEVYUEVDVF9GQUxTRSgoaGFzX3RyaXZpYWxfY29uc3RydWN0b3I8cGFpcjxpbnQsIHN0cmluZz4gPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxwYWlyPHN0cmluZywgaW50PiA+Ojp2YWx1ZSkpOworCisgIC8vIFZlcmlmeSB0aGF0IHR5cGVzIHdpdGhvdXQgdHJpdmlhbCBjb25zdHJ1Y3RvcnMgYXJlCisgIC8vIGNvcnJlY3RseSBtYXJrZWQgYXMgc3VjaC4KKyAgRVhQRUNUX0ZBTFNFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPHN0cmluZz46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPHZlY3RvcjxpbnQ+ID46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBFLCB3aGljaCB3ZSBoYXZlIGRlY2xhcmVkIHRvIGhhdmUgYSB0cml2aWFsCisgIC8vIGNvbnN0cnVjdG9yLCBpcyBjb3JyZWN0bHkgbWFya2VkIGFzIHN1Y2guCisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvbnN0cnVjdG9yPEU+Ojp2YWx1ZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFRlc3RIYXNUcml2aWFsQ29weSkgeworICAvLyBWZXJpZnkgdGhhdCBhcml0aG1ldGljIHR5cGVzIGFuZCBwb2ludGVycyBoYXZlIHRyaXZpYWwgY29weQorICAvLyBjb25zdHJ1Y3RvcnMuCisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8Ym9vbD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29weTxjaGFyPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8c2lnbmVkIGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8d2NoYXJfdD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29weTxpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8dW5zaWduZWQgaW50Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb3B5PHNob3J0Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9jb3B5PGxvbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZz46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29weTxmbG9hdD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29weTxkb3VibGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8bG9uZyBkb3VibGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8c3RyaW5nKj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29weTxBKj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29weTxjb25zdCBCKj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfY29weTxDKio+Ojp2YWx1ZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgcGFpcnMgYW5kIGFycmF5cyBvZiBzdWNoIHR5cGVzIGhhdmUgdHJpdmlhbAorICAvLyBjb3B5IGNvbnN0cnVjdG9ycy4KKyAgdHlwZWRlZiBpbnQgaW50MTBbMTBdOworICBFWFBFQ1RfVFJVRSgoaGFzX3RyaXZpYWxfY29weTxwYWlyPGludCwgY2hhcio+ID46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8aW50MTA+Ojp2YWx1ZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgcGFpcnMgb2YgdHlwZXMgd2l0aG91dCB0cml2aWFsIGNvcHkgY29uc3RydWN0b3JzCisgIC8vIGFyZSBub3QgbWFya2VkIGFzIHRyaXZpYWwuCisgIEVYUEVDVF9GQUxTRSgoaGFzX3RyaXZpYWxfY29weTxwYWlyPGludCwgc3RyaW5nPiA+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKGhhc190cml2aWFsX2NvcHk8cGFpcjxzdHJpbmcsIGludD4gPjo6dmFsdWUpKTsKKworICAvLyBWZXJpZnkgdGhhdCB0eXBlcyB3aXRob3V0IHRyaXZpYWwgY29weSBjb25zdHJ1Y3RvcnMgYXJlCisgIC8vIGNvcnJlY3RseSBtYXJrZWQgYXMgc3VjaC4KKyAgRVhQRUNUX0ZBTFNFKGhhc190cml2aWFsX2NvcHk8c3RyaW5nPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaGFzX3RyaXZpYWxfY29weTx2ZWN0b3I8aW50PiA+Ojp2YWx1ZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgQywgd2hpY2ggd2UgaGF2ZSBkZWNsYXJlZCB0byBoYXZlIGEgdHJpdmlhbAorICAvLyBjb3B5IGNvbnN0cnVjdG9yLCBpcyBjb3JyZWN0bHkgbWFya2VkIGFzIHN1Y2guCisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2NvcHk8Qz46OnZhbHVlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdEhhc1RyaXZpYWxBc3NpZ24pIHsKKyAgLy8gVmVyaWZ5IHRoYXQgYXJpdGhtZXRpYyB0eXBlcyBhbmQgcG9pbnRlcnMgaGF2ZSB0cml2aWFsIGFzc2lnbm1lbnQKKyAgLy8gb3BlcmF0b3JzLgorICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248Ym9vbD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfYXNzaWduPGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248c2lnbmVkIGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjx3Y2hhcl90Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248aW50Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248dW5zaWduZWQgaW50Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248c2hvcnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjx1bnNpZ25lZCBzaG9ydD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfYXNzaWduPGxvbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjx1bnNpZ25lZCBsb25nPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248ZmxvYXQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjxkb3VibGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjxsb25nIGRvdWJsZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfYXNzaWduPHN0cmluZyo+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjxBKj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfYXNzaWduPGNvbnN0IEIqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248QyoqPjo6dmFsdWUpOworCisgIC8vIFZlcmlmeSB0aGF0IHBhaXJzIGFuZCBhcnJheXMgb2Ygc3VjaCB0eXBlcyBoYXZlIHRyaXZpYWwKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnMuCisgIHR5cGVkZWYgaW50IGludDEwWzEwXTsKKyAgRVhQRUNUX1RSVUUoKGhhc190cml2aWFsX2Fzc2lnbjxwYWlyPGludCwgY2hhcio+ID46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Fzc2lnbjxpbnQxMD46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBwYWlycyBvZiB0eXBlcyB3aXRob3V0IHRyaXZpYWwgYXNzaWdubWVudCBvcGVyYXRvcnMKKyAgLy8gYXJlIG5vdCBtYXJrZWQgYXMgdHJpdmlhbC4KKyAgRVhQRUNUX0ZBTFNFKChoYXNfdHJpdmlhbF9hc3NpZ248cGFpcjxpbnQsIHN0cmluZz4gPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChoYXNfdHJpdmlhbF9hc3NpZ248cGFpcjxzdHJpbmcsIGludD4gPjo6dmFsdWUpKTsKKworICAvLyBWZXJpZnkgdGhhdCB0eXBlcyB3aXRob3V0IHRyaXZpYWwgYXNzaWdubWVudCBvcGVyYXRvcnMgYXJlCisgIC8vIGNvcnJlY3RseSBtYXJrZWQgYXMgc3VjaC4KKyAgRVhQRUNUX0ZBTFNFKGhhc190cml2aWFsX2Fzc2lnbjxzdHJpbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShoYXNfdHJpdmlhbF9hc3NpZ248dmVjdG9yPGludD4gPjo6dmFsdWUpOworCisgIC8vIFZlcmlmeSB0aGF0IEQsIHdoaWNoIHdlIGhhdmUgZGVjbGFyZWQgdG8gaGF2ZSBhIHRyaXZpYWwKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvciwgaXMgY29ycmVjdGx5IG1hcmtlZCBhcyBzdWNoLgorICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9hc3NpZ248RD46OnZhbHVlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdEhhc1RyaXZpYWxEZXN0cnVjdG9yKSB7CisgIC8vIFZlcmlmeSB0aGF0IGFyaXRobWV0aWMgdHlwZXMgYW5kIHBvaW50ZXJzIGhhdmUgdHJpdmlhbCBkZXN0cnVjdG9ycy4KKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcjxib29sPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPGNoYXI+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Rlc3RydWN0b3I8dW5zaWduZWQgY2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxzaWduZWQgY2hhcj46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcjx3Y2hhcl90Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPGludD46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcjx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Rlc3RydWN0b3I8c2hvcnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Rlc3RydWN0b3I8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGhhc190cml2aWFsX2Rlc3RydWN0b3I8bG9uZz46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcjx1bnNpZ25lZCBsb25nPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPGZsb2F0Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPGRvdWJsZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcjxsb25nIGRvdWJsZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxzdHJpbmcqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPEEqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPGNvbnN0IEIqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPEMqKj46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBwYWlycyBhbmQgYXJyYXlzIG9mIHN1Y2ggdHlwZXMgaGF2ZSB0cml2aWFsCisgIC8vIGRlc3RydWN0b3JzLgorICB0eXBlZGVmIGludCBpbnQxMFsxMF07CisgIEVYUEVDVF9UUlVFKChoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPHBhaXI8aW50LCBjaGFyKj4gPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxpbnQxMD46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBwYWlycyBvZiB0eXBlcyB3aXRob3V0IHRyaXZpYWwgZGVzdHJ1Y3RvcnMKKyAgLy8gYXJlIG5vdCBtYXJrZWQgYXMgdHJpdmlhbC4KKyAgRVhQRUNUX0ZBTFNFKChoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPHBhaXI8aW50LCBzdHJpbmc+ID46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxwYWlyPHN0cmluZywgaW50PiA+Ojp2YWx1ZSkpOworCisgIC8vIFZlcmlmeSB0aGF0IHR5cGVzIHdpdGhvdXQgdHJpdmlhbCBkZXN0cnVjdG9ycyBhcmUKKyAgLy8gY29ycmVjdGx5IG1hcmtlZCBhcyBzdWNoLgorICBFWFBFQ1RfRkFMU0UoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxzdHJpbmc+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPHZlY3RvcjxpbnQ+ID46OnZhbHVlKTsKKworICAvLyBWZXJpZnkgdGhhdCBGLCB3aGljaCB3ZSBoYXZlIGRlY2xhcmVkIHRvIGhhdmUgYSB0cml2aWFsCisgIC8vIGRlc3RydWN0b3IsIGlzIGNvcnJlY3RseSBtYXJrZWQgYXMgc3VjaC4KKyAgRVhQRUNUX1RSVUUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxGPjo6dmFsdWUpOworfQorCisvLyBUZXN0cyByZW1vdmVfcG9pbnRlci4KK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFRlc3RSZW1vdmVQb2ludGVyKSB7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCwgcmVtb3ZlX3BvaW50ZXI8aW50Pjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCwgcmVtb3ZlX3BvaW50ZXI8aW50Kj46OnR5cGUpOworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShjb25zdCBpbnQsIHJlbW92ZV9wb2ludGVyPGNvbnN0IGludCo+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoaW50LCByZW1vdmVfcG9pbnRlcjxpbnQqIGNvbnN0Pjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCwgcmVtb3ZlX3BvaW50ZXI8aW50KiB2b2xhdGlsZT46OnR5cGUpOworfQorCitURVNUKFR5cGVUcmFpdHNUZXN0LCBUZXN0UmVtb3ZlQ29uc3QpIHsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoaW50LCByZW1vdmVfY29uc3Q8aW50Pjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCwgcmVtb3ZlX2NvbnN0PGNvbnN0IGludD46OnR5cGUpOworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShpbnQgKiwgcmVtb3ZlX2NvbnN0PGludCAqIGNvbnN0Pjo6dHlwZSk7CisgIC8vIFRSMSBleGFtcGxlcy4KKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoY29uc3QgaW50ICosIHJlbW92ZV9jb25zdDxjb25zdCBpbnQgKj46OnR5cGUpOworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUSh2b2xhdGlsZSBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jb25zdDxjb25zdCB2b2xhdGlsZSBpbnQ+Ojp0eXBlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdFJlbW92ZVZvbGF0aWxlKSB7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCwgcmVtb3ZlX3ZvbGF0aWxlPGludD46OnR5cGUpOworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShpbnQsIHJlbW92ZV92b2xhdGlsZTx2b2xhdGlsZSBpbnQ+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoaW50ICosIHJlbW92ZV92b2xhdGlsZTxpbnQgKiB2b2xhdGlsZT46OnR5cGUpOworICAvLyBUUjEgZXhhbXBsZXMuCisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKHZvbGF0aWxlIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfdm9sYXRpbGU8dm9sYXRpbGUgaW50ICo+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoY29uc3QgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfdm9sYXRpbGU8Y29uc3Qgdm9sYXRpbGUgaW50Pjo6dHlwZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFRlc3RSZW1vdmVDVikgeworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShpbnQsIHJlbW92ZV9jdjxpbnQ+Ojp0eXBlKTsKKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoaW50LCByZW1vdmVfY3Y8dm9sYXRpbGUgaW50Pjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCwgcmVtb3ZlX2N2PGNvbnN0IGludD46OnR5cGUpOworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShpbnQgKiwgcmVtb3ZlX2N2PGludCAqIGNvbnN0IHZvbGF0aWxlPjo6dHlwZSk7CisgIC8vIFRSMSBleGFtcGxlcy4KKyAgQ09NUElMRV9BU1NFUlRfVFlQRVNfRVEoY29uc3Qgdm9sYXRpbGUgaW50ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jdjxjb25zdCB2b2xhdGlsZSBpbnQgKj46OnR5cGUpOworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jdjxjb25zdCB2b2xhdGlsZSBpbnQ+Ojp0eXBlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgVGVzdFJlbW92ZVJlZmVyZW5jZSkgeworICBDT01QSUxFX0FTU0VSVF9UWVBFU19FUShpbnQsIHJlbW92ZV9yZWZlcmVuY2U8aW50Pjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCwgcmVtb3ZlX3JlZmVyZW5jZTxpbnQmPjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGNvbnN0IGludCwgcmVtb3ZlX3JlZmVyZW5jZTxjb25zdCBpbnQmPjo6dHlwZSk7CisgIENPTVBJTEVfQVNTRVJUX1RZUEVTX0VRKGludCosIHJlbW92ZV9yZWZlcmVuY2U8aW50ICogJj46OnR5cGUpOworfQorCitURVNUKFR5cGVUcmFpdHNUZXN0LCBUZXN0SXNTYW1lKSB7CisgIEVYUEVDVF9UUlVFKChpc19zYW1lPGludDMyLCBpbnQzMj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoaXNfc2FtZTxpbnQzMiwgaW50NjQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKGlzX3NhbWU8aW50NjQsIGludDMyPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChpc19zYW1lPGludCwgY29uc3QgaW50Pjo6dmFsdWUpKTsKKworICBFWFBFQ1RfVFJVRSgoaXNfc2FtZTx2b2lkLCB2b2lkPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChpc19zYW1lPHZvaWQsIGludD46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoaXNfc2FtZTxpbnQsIHZvaWQ+Ojp2YWx1ZSkpOworCisgIEVYUEVDVF9UUlVFKChpc19zYW1lPGludCosIGludCo+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoaXNfc2FtZTx2b2lkKiwgdm9pZCo+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKGlzX3NhbWU8aW50Kiwgdm9pZCo+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKGlzX3NhbWU8dm9pZCosIGludCo+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKGlzX3NhbWU8dm9pZCosIGNvbnN0IHZvaWQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChpc19zYW1lPHZvaWQqLCB2b2lkKiBjb25zdD46OnZhbHVlKSk7CisKKyAgRVhQRUNUX1RSVUUoKGlzX3NhbWU8QmFzZSosIEJhc2UqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKGlzX3NhbWU8RGVyaXZlZCosIERlcml2ZWQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChpc19zYW1lPEJhc2UqLCBEZXJpdmVkKj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoaXNfc2FtZTxEZXJpdmVkKiwgQmFzZSo+Ojp2YWx1ZSkpOworfQorCitURVNUKFR5cGVUcmFpdHNUZXN0LCBUZXN0Q29udmVydGlibGUpIHsKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA8PSAzKQorICBFWFBFQ1RfVFJVRSgoaXNfY29udmVydGlibGU8aW50LCBpbnQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoaXNfY29udmVydGlibGU8aW50LCBsb25nPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKGlzX2NvbnZlcnRpYmxlPGxvbmcsIGludD46OnZhbHVlKSk7CisKKyAgRVhQRUNUX1RSVUUoKGlzX2NvbnZlcnRpYmxlPGludCosIHZvaWQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChpc19jb252ZXJ0aWJsZTx2b2lkKiwgaW50Kj46OnZhbHVlKSk7CisKKyAgRVhQRUNUX1RSVUUoKGlzX2NvbnZlcnRpYmxlPERlcml2ZWQqLCBCYXNlKj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoaXNfY29udmVydGlibGU8QmFzZSosIERlcml2ZWQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKGlzX2NvbnZlcnRpYmxlPERlcml2ZWQqLCBjb25zdCBCYXNlKj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoaXNfY29udmVydGlibGU8Y29uc3QgRGVyaXZlZCosIEJhc2UqPjo6dmFsdWUpKTsKKyNlbmRpZgorfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2NjZmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKQEAgLTAsMCArMSwzMDQ3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmZGVmIF9XSU4zMgorLy8gVmVyaWZ5IHRoYXQgI2luY2x1ZGluZyB3aW5kb3dzLmggZG9lcyBub3QgYnJlYWsgYW55dGhpbmcgKGUuZy4gYmVjYXVzZQorLy8gd2luZG93cy5oICNkZWZpbmVzIEdldE1lc3NhZ2UoKSBhcyBhIG1hY3JvKS4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordm9pZCBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKKyAgU2V0T3B0aW9uYWxGaWVsZHMobWVzc2FnZSk7CisgIEFkZFJlcGVhdGVkRmllbGRzMShtZXNzYWdlKTsKKyAgQWRkUmVwZWF0ZWRGaWVsZHMyKG1lc3NhZ2UpOworICBTZXREZWZhdWx0RmllbGRzKG1lc3NhZ2UpOworfQorCit2b2lkIFRlc3RVdGlsOjpTZXRPcHRpb25hbEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbnQzMiAgICgxMDEpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfaW50NjQgICAoMTAyKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3VpbnQzMiAgKDEwMyk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF91aW50NjQgICgxMDQpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ludDMyICAoMTA1KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NpbnQ2NCAgKDEwNik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9maXhlZDMyICgxMDcpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZml4ZWQ2NCAoMTA4KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NmaXhlZDMyKDEwOSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zZml4ZWQ2NCgxMTApOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZmxvYXQgICAoMTExKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2RvdWJsZSAgKDExMik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3N0cmluZyAgKCIxMTUiKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2J5dGVzICAgKCIxMTYiKTsKKworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLT5zZXRfYSgxMTcpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLT5zZXRfYmIoMTE4KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKS0+c2V0X2MoMTE5KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS0+c2V0X2QoMTIwKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2UoMTI2KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKS0+c2V0X2JiKDEyNyk7CisKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX25lc3RlZF9lbnVtICh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVopOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaKTsKKworICAvLyBTdHJpbmdQaWVjZSBhbmQgQ29yZCBmaWVsZHMgYXJlIG9ubHkgYWNjZXNzaWJsZSB2aWEgcmVmbGVjdGlvbiBpbiB0aGUKKyAgLy8gb3BlbiBzb3VyY2UgcmVsZWFzZTsgc2VlIGNvbW1lbnRzIGluIGNvbXBpbGVyL2NwcC9zdHJpbmdfZmllbGQuY2MuCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCisgICAgbWVzc2FnZSwKKyAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiksCisgICAgIjEyNCIpOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFN0cmluZygKKyAgICBtZXNzYWdlLAorICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9jb3JkIiksCisgICAgIjEyNSIpOworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkFkZFJlcGVhdGVkRmllbGRzMSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgyMDEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMjAyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMiAgKDIwMyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQgICgyMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyICAoMjA1KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCAgKDIwNik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyICgyMDcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCAoMjA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDIwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgyMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQgICAoMjExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSAgKDIxMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZyAgKCIyMTUiKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2J5dGVzICAgKCIyMTYiKTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKCktPnNldF9hKDIxNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDIxOCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMjE5KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgyMjApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKCktPnNldF9iYigyMjcpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUik7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZFN0cmluZygKKyAgICBtZXNzYWdlLAorICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwKKyAgICAiMjI0Iik7CisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+QWRkU3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2NvcmQiKSwKKyAgICAiMjI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKK3ZvaWQgVGVzdFV0aWw6OkFkZFJlcGVhdGVkRmllbGRzMih1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7CisgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDMyICAgKDMwMSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQ2NCAgICgzMDIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDMyICAoMzAzKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQ2NCAgKDMwNCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50MzIgICgzMDUpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDY0ICAoMzA2KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkMzIgKDMwNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDY0ICgzMDgpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkMzIoMzA5KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDY0KDMxMCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mbG9hdCAgICgzMTEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZG91YmxlICAoMzEyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Jvb2wgICAgKGZhbHNlKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZyAgKCIzMTUiKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2J5dGVzICAgKCIzMTYiKTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKCktPnNldF9hKDMxNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDMxOCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMzE5KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgzMjApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKCktPnNldF9iYigzMjcpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWik7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZFN0cmluZygKKyAgICBtZXNzYWdlLAorICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwKKyAgICAiMzI0Iik7CisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+QWRkU3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2NvcmQiKSwKKyAgICAiMzI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6U2V0RGVmYXVsdEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ludDMyICAgKDQwMSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ludDY0ICAgKDQwMik7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3VpbnQzMiAgKDQwMyk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3VpbnQ2NCAgKDQwNCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQzMiAgKDQwNSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQ2NCAgKDQwNik7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZpeGVkMzIgKDQwNyk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZpeGVkNjQgKDQwOCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDMyKDQwOSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDY0KDQxMCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Zsb2F0ICAgKDQxMSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2RvdWJsZSAgKDQxMik7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Jvb2wgICAgKGZhbHNlKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc3RyaW5nICAoIjQxNSIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9ieXRlcyAgICgiNDE2Iik7CisKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICApOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiksCisgICAgIjQyNCIpOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFN0cmluZygKKyAgICBtZXNzYWdlLAorICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJkZWZhdWx0X2NvcmQiKSwKKyAgICAiNDI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfaW50MzIgICAoMSwgNTAxKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDY0ICAgKDEsIDUwMik7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF91aW50MzIgICgxLCA1MDMpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfdWludDY0ICAoMSwgNTA0KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NpbnQzMiAgKDEsIDUwNSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zaW50NjQgICgxLCA1MDYpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZml4ZWQzMiAoMSwgNTA3KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkNjQgKDEsIDUwOCk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zZml4ZWQzMigxLCA1MDkpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ZpeGVkNjQoMSwgNTEwKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Zsb2F0ICAgKDEsIDUxMSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9kb3VibGUgICgxLCA1MTIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYm9vbCAgICAoMSwgdHJ1ZSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zdHJpbmcgICgxLCAiNTE1Iik7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9ieXRlcyAgICgxLCAiNTE2Iik7CisKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSktPnNldF9hKDUxNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLT5zZXRfYmIoNTE4KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSktPnNldF9jKDUxOSk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLT5zZXRfZCg1MjApOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgxKS0+c2V0X2JiKDUyNyk7CisKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX25lc3RlZF9lbnVtICgxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9pbXBvcnRfZW51bSAoMSwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0UmVwZWF0ZWRTdHJpbmcoCisgICAgbWVzc2FnZSwKKyAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksCisgICAgMSwgIjUyNCIpOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFJlcGVhdGVkU3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2NvcmQiKSwKKyAgICAxLCAiNTI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50MzIgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDY0ICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50MzIgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQzMiAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50NjQgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9kb3VibGUgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZyAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9ieXRlcyAgICgpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkuaGFzX2EoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmhhc19jKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpLmhhc19kKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLmhhc19lKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmhhc19iYigpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X2VudW0gKCkpOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nX3BpZWNlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9jb3JkKCkpOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKDEwMSAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoMTAyICAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQgICAoKSk7CisgIEVYUEVDVF9FUSgxMDMgICwgbWVzc2FnZS5vcHRpb25hbF91aW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDEwNCAgLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoMTA1ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyICAoKSk7CisgIEVYUEVDVF9FUSgxMDYgICwgbWVzc2FnZS5vcHRpb25hbF9zaW50NjQgICgpKTsKKyAgRVhQRUNUX0VRKDEwNyAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoMTA4ICAsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9FUSgxMDkgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDExMCAgLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMTExICAsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9FUSgxMTIgICwgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgICgpKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoIjExNSIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9FUSgiMTE2IiwgbWVzc2FnZS5vcHRpb25hbF9ieXRlcyAgICgpKTsKKworICBFWFBFQ1RfRVEoMTE3LCBtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICAoKS5hKCkpOworICBFWFBFQ1RfRVEoMTE4LCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICAoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAgKCkuYygpKTsKKyAgRVhQRUNUX0VRKDEyMCwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAgKCkuZCgpKTsKKyAgRVhQRUNUX0VRKDEyNiwgbWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UgKCkuZSgpKTsKKyAgRVhQRUNUX0VRKDEyNywgbWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAgKCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF9zaXplICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfc2l6ZSAgICgpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUgICAgICAgICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfY29yZF9zaXplKCkpOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMCkuYmIoKSk7CisKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMCkpOworCisgIEVYUEVDVF9FUSgzMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgxKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgxKSk7CisgIEVYUEVDVF9FUSgzMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSgzMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSgzMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSgzMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgxKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgxKSk7CisgIEVYUEVDVF9FUSgzMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSgzMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgxKSk7CisgIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgxKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgxKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgxKSk7CisKKyAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7CisgIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CisgIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDEpLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgxKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50MzIgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworCisgIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoNDAyICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoNDA1ICAsIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoNDA4ICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNDExICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoIjQxNSIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTywgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50MzIgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDY0ICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nX3BpZWNlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfY29yZCgpKTsKKworICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAoKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOworICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7CisKKyAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmhhc19jKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS5oYXNfZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmhhc19iYigpKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS5hKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkuYygpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkuZCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkuYmIoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9jb3JkX3NpemUoKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7CisKKworICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgorICBFWFBFQ1RfRVEoIDQxICAgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoIDQyICAgICwgbWVzc2FnZS5kZWZhdWx0X2ludDY0ICAgKCkpOworICBFWFBFQ1RfRVEoIDQzICAgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoIDQ0ICAgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoLTQ1ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoIDQ2ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoIDQ3ICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoIDQ4ICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRVEoIDQ5ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoLTUwICAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoIDUxLjUgICwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRVEoIDUyZTMgICwgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSAgKCkpOworICBFWFBFQ1RfVFJVRSggICAgICAgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5kZWZhdWx0X3N0cmluZyAgKCkpOworICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5kZWZhdWx0X2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKKyAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCisgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF9zaXplICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfc2l6ZSAgICgpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUgICAgICAgICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfY29yZF9zaXplKCkpOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDApKTsKKworCisgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICBFWFBFQ1RfRVEoNTAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMSkpOworICBFWFBFQ1RfRVEoNTAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoNTAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoNTA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoNTA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoNTA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoNTA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMSkpOworICBFWFBFQ1RfRVEoNTA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoNTA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoNTEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoNTExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoNTEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRVEoIjUxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMSkpOworICBFWFBFQ1RfRVEoIjUxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMSkpOworCisgIEVYUEVDVF9FUSg1MTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLmEoKSk7CisgIEVYUEVDVF9FUSg1MTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLmJiKCkpOworICBFWFBFQ1RfRVEoNTE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOworICBFWFBFQ1RfRVEoNTIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOworICBFWFBFQ1RfRVEoNTI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgxKS5iYigpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTywgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMSkpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQzMiAgICg2MDEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDY0ICAgKDYwMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDMyICAoNjAzKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50NjQgICg2MDQpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQzMiAgKDYwNSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDY0ICAoNjA2KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDMyICg2MDcpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkNjQgKDYwOCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkMzIoNjA5KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQ2NCg2MTApOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2Zsb2F0ICAgKDYxMSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZG91YmxlICAoNjEyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9lbnVtICAgICh1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQzMiAgICg3MDEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDY0ICAgKDcwMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDMyICAoNzAzKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50NjQgICg3MDQpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQzMiAgKDcwNSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDY0ICAoNzA2KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDMyICg3MDcpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkNjQgKDcwOCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkMzIoNzA5KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQ2NCg3MTApOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2Zsb2F0ICAgKDcxMSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZG91YmxlICAoNzEyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9ib29sICAgIChmYWxzZSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZW51bSAgICAodW5pdHRlc3Q6OkZPUkVJR05fQkFaKTsKK30KKwordm9pZCBUZXN0VXRpbDo6U2V0VW5wYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzKiBtZXNzYWdlKSB7CisgIC8vIFRoZSB2YWx1ZXMgYXBwbGllZCBoZXJlIG11c3QgbWF0Y2ggdGhvc2Ugb2YgU2V0UGFja2VkRmllbGRzLgorCisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9pbnQzMiAgICg2MDEpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfaW50NjQgICAoNjAyKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3VpbnQzMiAgKDYwMyk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF91aW50NjQgICg2MDQpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ludDMyICAoNjA1KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NpbnQ2NCAgKDYwNik7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9maXhlZDMyICg2MDcpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZml4ZWQ2NCAoNjA4KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NmaXhlZDMyKDYwOSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zZml4ZWQ2NCg2MTApOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZmxvYXQgICAoNjExKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2RvdWJsZSAgKDYxMik7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2VudW0gICAgKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUik7CisgIC8vIGFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZAorICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfaW50MzIgICAoNzAxKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ludDY0ICAgKDcwMik7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF91aW50MzIgICg3MDMpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfdWludDY0ICAoNzA0KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NpbnQzMiAgKDcwNSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zaW50NjQgICg3MDYpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZml4ZWQzMiAoNzA3KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ZpeGVkNjQgKDcwOCk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zZml4ZWQzMig3MDkpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ZpeGVkNjQoNzEwKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2Zsb2F0ICAgKDcxMSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9kb3VibGUgICg3MTIpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfYm9vbCAgICAoZmFsc2UpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZW51bSAgICAodW5pdHRlc3Q6OkZPUkVJR05fQkFaKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpNb2RpZnlQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfcGFja2VkX2ludDMyICAgKDEsIDgwMSk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfaW50NjQgICAoMSwgODAyKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF91aW50MzIgICgxLCA4MDMpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3VpbnQ2NCAgKDEsIDgwNCk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ludDMyICAoMSwgODA1KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zaW50NjQgICgxLCA4MDYpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2ZpeGVkMzIgKDEsIDgwNyk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZml4ZWQ2NCAoMSwgODA4KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zZml4ZWQzMigxLCA4MDkpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3NmaXhlZDY0KDEsIDgxMCk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZmxvYXQgICAoMSwgODExKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9kb3VibGUgICgxLCA4MTIpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2Jvb2wgICAgKDEsIHRydWUpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2VudW0gICAgKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zaW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0X3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9mbG9hdF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZG91YmxlX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9lbnVtX3NpemUgICAgKCkpOworCisgIEVYUEVDVF9FUSg2MDEgICwgbWVzc2FnZS5wYWNrZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UucGFja2VkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLnBhY2tlZF91aW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSg2MDQgICwgbWVzc2FnZS5wYWNrZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLnBhY2tlZF9zaW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSg2MDcgICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgwKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDApKTsKKworICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgxKSk7CisgIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDEpKTsKKyAgRVhQRUNUX0VRKDcwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgxKSk7CisgIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDcxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgxKSk7CisgIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiwgbWVzc2FnZS5wYWNrZWRfZW51bSgxKSk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFVucGFja2VkRmllbGRzU2V0KAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRUeXBlcyYgbWVzc2FnZSkgeworICAvLyBUaGUgdmFsdWVzIGV4cGVjdGVkIGhlcmUgbXVzdCBtYXRjaCB0aG9zZSBvZiBFeHBlY3RQYWNrZWRGaWVsZHNTZXQuCisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfaW50MzJfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfdWludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQzMl9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfYm9vbF9zaXplICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKKworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQgICAoMCkpOworICBFWFBFQ1RfRVEoNjAzICAsIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UudW5wYWNrZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDMyICAoMCkpOworICBFWFBFQ1RfRVEoNjA2ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NCAoMCkpOworICBFWFBFQ1RfRVEoNjA5ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UudW5wYWNrZWRfZmxvYXQgICAoMCkpOworICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UudW5wYWNrZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLCBtZXNzYWdlLnVucGFja2VkX2VudW0oMCkpOworCisgIEVYUEVDVF9FUSg3MDEgICwgbWVzc2FnZS51bnBhY2tlZF9pbnQzMiAgICgxKSk7CisgIEVYUEVDVF9FUSg3MDIgICwgbWVzc2FnZS51bnBhY2tlZF9pbnQ2NCAgICgxKSk7CisgIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS51bnBhY2tlZF91aW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg3MDQgICwgbWVzc2FnZS51bnBhY2tlZF91aW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg3MDUgICwgbWVzc2FnZS51bnBhY2tlZF9zaW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS51bnBhY2tlZF9zaW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg3MDcgICwgbWVzc2FnZS51bnBhY2tlZF9maXhlZDMyICgxKSk7CisgIEVYUEVDVF9FUSg3MDggICwgbWVzc2FnZS51bnBhY2tlZF9maXhlZDY0ICgxKSk7CisgIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg3MTAgICwgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS51bnBhY2tlZF9mbG9hdCAgICgxKSk7CisgIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS51bnBhY2tlZF9kb3VibGUgICgxKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS51bnBhY2tlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosIG1lc3NhZ2UudW5wYWNrZWRfZW51bSgxKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UGFja2VkQ2xlYXIoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyYgbWVzc2FnZSkgeworICAvLyBQYWNrZWQgcmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2ludDMyX3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NF9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfdWludDMyX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zaW50MzJfc2l6ZSAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ludDY0X3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0X3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9mbG9hdF9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZG91YmxlX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9lbnVtX3NpemUgICAgKCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpIHsKKyAgLy8gRG8gdGhlIHNhbWUgZm9yIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMuCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKKworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5wYWNrZWRfZW51bSgwKSk7CisgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICBFWFBFQ1RfRVEoODAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgxKSk7CisgIEVYUEVDVF9FUSg4MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoODA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg4MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoODA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDEpKTsKKyAgRVhQRUNUX0VRKDgwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgxKSk7CisgIEVYUEVDVF9FUSg4MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoODEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDgxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgxKSk7CisgIEVYUEVDVF9FUSg4MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywgbWVzc2FnZS5wYWNrZWRfZW51bSgxKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEV4dGVuc2lvbnMKKy8vCisvLyBBbGwgdGhpcyBjb2RlIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB0aGUgYWJvdmUgY29kZSBleGNlcHQgdGhhdCBpdCdzCisvLyBtYW5pcHVsYXRpbmcgZXh0ZW5zaW9uIGZpZWxkcyBpbnN0ZWFkIG9mIG5vcm1hbCBvbmVzLgorLy8KKy8vIEkgZ2F2ZSB1cCBvbiB0aGUgODAtY2hhciBsaW1pdCBoZXJlLiAgU29ycnkuCisKK3ZvaWQgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAgLCAxMDEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiAgICwgMTAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uICAsIDEwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiAgLCAxMDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24gICwgMTA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uICAsIDEwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24gLCAxMDcpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMTA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24sIDEwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxMTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICwgMTExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICAsIDExMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICAsICIxMTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICAsICIxMTYiKTsKKworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKS0+c2V0X2EoMTE3KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9iYigxMTgpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKS0+c2V0X2MoMTE5KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9kKDEyMCk7CisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVopOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaKTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24sICIxMjQiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbiwgIjEyNSIpOworCisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfZSgxMjYpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKS0+c2V0X2JiKDEyNyk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMjAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDIwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAyMDMpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMjA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDIwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAyMDYpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMjA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDIwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAyMDkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMjEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDIxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAyMTIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgdHJ1ZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAiMjE1Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAiMjE2Iik7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKS0+c2V0X2EoMjE3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKS0+c2V0X2JiKDIxOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiktPnNldF9jKDIxOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9kKDIyMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICktPnNldF9iYigyMjcpOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUik7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAiMjI0Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sICIyMjUiKTsKKworICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAzMDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMzAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDMwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAzMDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMzA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDMwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAzMDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMzA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDMwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAzMTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMzExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDMxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCBmYWxzZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAiMzE1Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAiMzE2Iik7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKS0+c2V0X2EoMzE3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKS0+c2V0X2JiKDMxOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiktPnNldF9jKDMxOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9kKDMyMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICktPnNldF9iYigzMjcpOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWik7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAiMzI0Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sICIzMjUiKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICAsIDQwMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICAsIDQwMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICAsIDQwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICAsIDQwNCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICAsIDQwNSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICAsIDQwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiAsIDQwNyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiAsIDQwOCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24sIDQwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24sIDQxMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICAsIDQxMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICAsIDQxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICAsIGZhbHNlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb24gICwgIjQxNSIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAiNDE2Iik7CisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgIjQyNCIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfY29yZF9leHRlbnNpb24sICI0MjUiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKAorICAgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MqIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0NIRUNLKG1lc3NhZ2UpOworICBtZXNzYWdlLT5zZXRfbXlfaW50KDEpOworICBtZXNzYWdlLT5zZXRfbXlfc3RyaW5nKCJmb28iKTsKKyAgbWVzc2FnZS0+c2V0X215X2Zsb2F0KDEuMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6bXlfZXh0ZW5zaW9uX2ludCwgMjMpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om15X2V4dGVuc2lvbl9zdHJpbmcsICJiYXIiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxLCA1MDEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSwgNTAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEsIDUwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxLCA1MDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSwgNTA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEsIDUwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxLCA1MDcpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSwgNTA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEsIDUwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxLCA1MTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSwgNTExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEsIDUxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDEsICI1MTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEsICI1MTYiKTsKKworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAxKS0+c2V0X2EoNTE3KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMSktPnNldF9iYig1MTgpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKS0+c2V0X2MoNTE5KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMSktPnNldF9kKDUyMCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDEpLT5zZXRfYmIoNTI3KTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDEsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSwgdW5pdHRlc3Q6OkZPUkVJR05fRk9PICAgICAgKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCAxLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08pOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMSwgIjUyNCIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAxLCAiNTI1Iik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICApKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICAgICkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKS5oYXNfYSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmhhc19iYigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gICAgICApLmhhc19jKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkuaGFzX2QoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAgICAgICApLmhhc19iYigpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9FUSgxMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMTAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDEwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgxMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMTA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDEwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgxMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoMTA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDEwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMTExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDExMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRVEoIjExNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKCIxMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApLmEoKSk7CisgIEVYUEVDVF9FUSgxMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKS5iYigpKTsKKyAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLmMoKSk7CisgIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb24gKSk7CisKKyAgRVhQRUNUX0VRKCIxMjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoIjEyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMTI2LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLmUoKSk7CisgIEVYUEVDVF9FUSgxMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKS5iYigpKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAwKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAsIDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDApLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICwgMCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgRVhQRUNUX0VRKDMwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDMxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEpKTsKKworICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmJiKCkpOworICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYygpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAxKS5iYigpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMSkpOworCisgIEVYUEVDVF9FUSgiMzI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKCIzMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDEpKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDQwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDQwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDQwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDQwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDQwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDQwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICApKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOworCisgIEVYUEVDVF9FUSgiNDI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoIjQyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICBzdHJpbmcgc2VyaWFsaXplZDsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworICBFWFBFQ1RfRVEoIiIsIHNlcmlhbGl6ZWQpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKKworICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gICAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAgICAgICApKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbiAgICkpOworCisgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAgICAgICApLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmhhc19iYigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgKS5oYXNfYygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKS5oYXNfZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICAgKS5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKS5hKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmJiKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gICAgICApLmMoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkuZCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5lKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAgICAgICApLmJiKCkpOworCisgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb24gKSk7CisKKyAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICApKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCisgIEVYUEVDVF9FUSggNDEgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKCA0MiAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoIDQzICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSggNDQgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKC00NSAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoIDQ2ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSggNDcgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKCA0OCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoIDQ5ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgtNTAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCA1MS41ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoIDUyZTMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKKworICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKKyAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKKyAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICAgICkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDApLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCAwKSk7CisKKyAgRVhQRUNUX0VRKCIyMjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoIjIyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMCkpOworCisgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICBFWFBFQ1RfRVEoNTAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNTA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNTA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSg1MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNTEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDUxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKKyAgRVhQRUNUX0VRKCI1MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSgiNTE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMSkpOworCisgIEVYUEVDVF9FUSg1MTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAxKS5hKCkpOworICBFWFBFQ1RfRVEoNTE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMSkuYmIoKSk7CisgIEVYUEVDVF9FUSg1MTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKS5jKCkpOworICBFWFBFQ1RfRVEoNTIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMSkuZCgpKTsKKyAgRVhQRUNUX0VRKDUyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDEpLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCAxKSk7CisKKyAgRVhQRUNUX0VRKCI1MjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoIjUyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgNjAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCA2MDIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDYwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgNjA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCA2MDUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDYwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgNjA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCA2MDgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDYwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgNjEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCA2MTEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDYxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgdHJ1ZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCA3MDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAsIDcwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgNzAzKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCA3MDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDcwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgNzA2KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCA3MDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDcwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgNzA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCA3MTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDcxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgNzEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCBmYWxzZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVopOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6Ok1vZGlmeVBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgMSwgODAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAxLCA4MDIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEsIDgwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgMSwgODA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAxLCA4MDUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEsIDgwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMSwgODA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAxLCA4MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEsIDgwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMSwgODEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAxLCA4MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEsIDgxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSwgdHJ1ZSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uICAgICwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSg3MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCAxKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSg2MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCAwKSk7CisKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg4MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoODAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoODA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoODA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDgxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoODEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24sIDEpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihjb25zdCBzdHJpbmcmIHNlcmlhbGl6ZWQpIHsKKyAgLy8gV2Ugc2V0IGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5LCBzZXJpYWxpemUgc2VwYXJhdGVseSwgYW5kIGNvbmNhdGVuYXRlIGFsbAorICAvLyB0aGUgc3RyaW5ncyBpbiBjYW5vbmljYWwgb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBzZXJpYWxpemF0aW9uLgorICBzdHJpbmcgZXhwZWN0ZWQ7CisgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfbXlfaW50KDEpOyAgLy8gRmllbGQgMS4KKyAgbWVzc2FnZS5BcHBlbmRUb1N0cmluZygmZXhwZWN0ZWQpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpteV9leHRlbnNpb25faW50LCAyMyk7ICAvLyBGaWVsZCA1LgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfbXlfc3RyaW5nKCJmb28iKTsgIC8vIEZpZWxkIDExLgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om15X2V4dGVuc2lvbl9zdHJpbmcsICJiYXIiKTsgIC8vIEZpZWxkIDUwLgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfbXlfZmxvYXQoMS4wKTsgIC8vIEZpZWxkIDEwMS4KKyAgbWVzc2FnZS5BcHBlbmRUb1N0cmluZygmZXhwZWN0ZWQpOworICBtZXNzYWdlLkNsZWFyKCk7CisKKyAgLy8gV2UgZG9uJ3QgRVhQRUNUX0VRKCkgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmludCByYXcgYnl0ZXMgdG8gc3Rkb3V0LgorICBFWFBFQ1RfVFJVRShzZXJpYWxpemVkID09IGV4cGVjdGVkKTsKK30KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkc1JlbW92ZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplICAgKCkpOworCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSAgICAgICAgICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZV9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9jb3JkX3NpemUoKSk7CisjZW5kaWYKKworICAvLyBUZXN0IHRoYXQgdGhlIHJlbWFpbmluZyBlbGVtZW50IGlzIHRoZSBjb3JyZWN0IG9uZS4KKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMCkpOworfQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVtb3ZlZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKworICAvLyBUZXN0IHRoYXQgb25lIGVsZW1lbnQgd2FzIHJlbW92ZWQuCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIFRlc3QgdGhhdCB0aGUgcmVtYWluaW5nIGVsZW1lbnQgaXMgdGhlIGNvcnJlY3Qgb25lLgorICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDApLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCAwKSk7CisKKyAgRVhQRUNUX0VRKCIyMjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoIjIyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMCkpOworfQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRzUmVsZWFzZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUgICAgICAgICAgICgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDApLmQoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDApLmQoKSk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZWxlYXNlZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAsIDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDApLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICwgMCkuYmIoKSk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkc1N3YXBwZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplICAgKCkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSAgICAgICAgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9jb3JkX3NpemUoKSk7CisjZW5kaWYKKworICAvLyBUZXN0IHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIHNlY29uZCBlbGVtZW50IGFyZSBmbGlwcGVkLgorICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMSkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMSkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMSkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMSkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgxKSk7CisKKyAgRVhQRUNUX0VRKDMwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDMwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDMwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDMwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDMwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDMwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDMwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDMwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDMwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDMxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDMxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDMxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKCIzMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKKyAgRVhQRUNUX0VRKCIzMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKKworICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOworICBFWFBFQ1RfRVEoMzE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDMxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMCkpOworfQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNTd2FwcGVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAxKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAsIDEpLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gLCAxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDEpLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gLCAxKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICwgMSkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDEpKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAxKSk7CisKKyAgRVhQRUNUX0VRKDMwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDMwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDMwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDMxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDApKTsKKworICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOworICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAwKS5iYigpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMCkpOworCisgIEVYUEVDVF9FUSgiMzI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKCIzMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDApKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6UmVmbGVjdGlvblRlc3RlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBiYXNlX2Rlc2NyaXB0b3IpCisgIDogYmFzZV9kZXNjcmlwdG9yXyhiYXNlX2Rlc2NyaXB0b3IpIHsKKworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCA9IGJhc2VfZGVzY3JpcHRvci0+ZmlsZSgpLT5wb29sKCk7CisKKyAgbmVzdGVkX2JfID0KKyAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLmJiIik7CisgIGZvcmVpZ25fY18gPQorICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2UuYyIpOworICBpbXBvcnRfZF8gPQorICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UuZCIpOworICBpbXBvcnRfZV8gPQorICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2UuZSIpOworICBuZXN0ZWRfZm9vXyA9CisgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLkZPTyIpOworICBuZXN0ZWRfYmFyXyA9CisgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLkJBUiIpOworICBuZXN0ZWRfYmF6XyA9CisgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLkJBWiIpOworICBmb3JlaWduX2Zvb18gPQorICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LkZPUkVJR05fRk9PIik7CisgIGZvcmVpZ25fYmFyXyA9CisgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuRk9SRUlHTl9CQVIiKTsKKyAgZm9yZWlnbl9iYXpfID0KKyAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5GT1JFSUdOX0JBWiIpOworICBpbXBvcnRfZm9vXyA9CisgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LklNUE9SVF9GT08iKTsKKyAgaW1wb3J0X2Jhcl8gPQorICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JTVBPUlRfQkFSIik7CisgIGltcG9ydF9iYXpfID0KKyAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSU1QT1JUX0JBWiIpOworCisgIGlmIChiYXNlX2Rlc2NyaXB0b3JfLT5uYW1lKCkgPT0gIlRlc3RBbGxFeHRlbnNpb25zIikgeworICAgIGdyb3VwX2FfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuT3B0aW9uYWxHcm91cF9leHRlbnNpb24uYSIpOworICAgIHJlcGVhdGVkX2dyb3VwX2FfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uYSIpOworICB9IGVsc2UgeworICAgIGdyb3VwX2FfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAuYSIpOworICAgIHJlcGVhdGVkX2dyb3VwX2FfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAuYSIpOworICB9CisKKyAgRVhQRUNUX1RSVUUoZ3JvdXBfYV8gICAgICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHJlcGVhdGVkX2dyb3VwX2FfICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShuZXN0ZWRfYl8gICAgICAgICAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9yZWlnbl9jXyAgICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGltcG9ydF9kXyAgICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShpbXBvcnRfZV8gICAgICAgICAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobmVzdGVkX2Zvb18gICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG5lc3RlZF9iYXJfICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShuZXN0ZWRfYmF6XyAgICAgICAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9yZWlnbl9mb29fICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvcmVpZ25fYmFyXyAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb3JlaWduX2Jhel8gICAgICAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0X2Zvb18gICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGltcG9ydF9iYXJfICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShpbXBvcnRfYmF6XyAgICAgICAhPSBOVUxMKTsKK30KKworLy8gU2hvcnRoYW5kIHRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBmaWVsZCBvZiB1bml0dGVzdDo6VGVzdEFsbFR5cGVzLgorY29uc3QgRmllbGREZXNjcmlwdG9yKiBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Rihjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSBOVUxMOworICBpZiAoYmFzZV9kZXNjcmlwdG9yXy0+bmFtZSgpID09ICJUZXN0QWxsRXh0ZW5zaW9ucyIgfHwKKyAgICAgIGJhc2VfZGVzY3JpcHRvcl8tPm5hbWUoKSA9PSAiVGVzdFBhY2tlZEV4dGVuc2lvbnMiKSB7CisgICAgcmVzdWx0ID0gYmFzZV9kZXNjcmlwdG9yXy0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUgKyAiX2V4dGVuc2lvbiIpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IGJhc2VfZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKKyAgfQorICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKKworICByZWZsZWN0aW9uLT5TZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSwgMTAxKTsKKyAgcmVmbGVjdGlvbi0+U2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDY0IiAgICksIDEwMik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50MzIiICApLCAxMDMpOworICByZWZsZWN0aW9uLT5TZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSwgMTA0KTsKKyAgcmVmbGVjdGlvbi0+U2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQzMiIgICksIDEwNSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50NjQiICApLCAxMDYpOworICByZWZsZWN0aW9uLT5TZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSwgMTA3KTsKKyAgcmVmbGVjdGlvbi0+U2V0VUludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkNjQiICksIDEwOCk7CisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQzMiIpLCAxMDkpOworICByZWZsZWN0aW9uLT5TZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSwgMTEwKTsKKyAgcmVmbGVjdGlvbi0+U2V0RmxvYXQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiAgICksIDExMSk7CisgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBGKCJvcHRpb25hbF9kb3VibGUiICApLCAxMTIpOworICByZWZsZWN0aW9uLT5TZXRCb29sICAobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApLCAiMTE1Iik7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIgICApLCAiMTE2Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZ3JvdXBfYV8sIDExNyk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDExOCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMTE5KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGltcG9ydF9kXywgMTIwKTsKKworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApLCAgbmVzdGVkX2Jhel8pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduX2Jhel8pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApLCAgaW1wb3J0X2Jhel8pOworCisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSwgIjEyNCIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpLCAiMTI1Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8sIDEyNik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDEyNyk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50MzIiICAgKSwgMjAxKTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiAgICksIDIwMik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50MzIiICApLCAyMDMpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IiAgKSwgMjA0KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIgICksIDIwNSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50NjQiICApLCAyMDYpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMjA3KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDIwOCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAyMDkpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMjEwKTsKKyAgcmVmbGVjdGlvbi0+QWRkRmxvYXQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDIxMSk7CisgIHJlZmxlY3Rpb24tPkFkZERvdWJsZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9kb3VibGUiICApLCAyMTIpOworICByZWZsZWN0aW9uLT5BZGRCb29sICAobWVzc2FnZSwgRigicmVwZWF0ZWRfYm9vbCIgICAgKSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAiMjE1Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIgICApLCAiMjE2Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXywgMjE3KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAyMTgpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMjE5KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAyMjApOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAyMjcpOworCisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfYmFyXyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmFyXyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksICBpbXBvcnRfYmFyXyk7CisKKyAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAiMjI0Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksICIyMjUiKTsKKworICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIgICApLCAzMDEpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiICAgKSwgMzAyKTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICksIDMwMyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiICApLCAzMDQpOworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMzA1KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDMwNik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDMyIiApLCAzMDcpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMzA4KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDMwOSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAzMTApOworICByZWZsZWN0aW9uLT5BZGRGbG9hdCAobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMzExKTsKKyAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDMxMik7CisgIHJlZmxlY3Rpb24tPkFkZEJvb2wgIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApLCBmYWxzZSk7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAiMzE1Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIgICApLCAiMzE2Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXywgMzE3KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAzMTgpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMzE5KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAzMjApOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAzMjcpOworCisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfYmF6Xyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmF6Xyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksICBpbXBvcnRfYmF6Xyk7CisKKyAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAiMzI0Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksICIzMjUiKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICksIDQwMSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICksIDQwMik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQzMiIgICksIDQwMyk7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICksIDQwNCk7CisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICksIDQwNSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIgICksIDQwNik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICksIDQwNyk7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICksIDQwOCk7CisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDMyIiksIDQwOSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IiksIDQxMCk7CisgIHJlZmxlY3Rpb24tPlNldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICksIDQxMSk7CisgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIgICksIDQxMik7CisgIHJlZmxlY3Rpb24tPlNldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICksIGZhbHNlKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiAgKSwgIjQxNSIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgICApLCAiNDE2Iik7CisKKyAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApLCAgbmVzdGVkX2Zvb18pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fZm9vXyk7CisgIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydF9mb29fKTsKKworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwgIjQyNCIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIiksICI0MjUiKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfaW50MzIiICAgKSwgNjAxKTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQ2NCIgICApLCA2MDIpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIgICksIDYwMyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfdWludDY0IiAgKSwgNjA0KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiICApLCA2MDUpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIgICksIDYwNik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQzMiIgKSwgNjA3KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDY0IiApLCA2MDgpOworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIiksIDYwOSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSwgNjEwKTsKKyAgcmVmbGVjdGlvbi0+QWRkRmxvYXQgKG1lc3NhZ2UsIEYoInBhY2tlZF9mbG9hdCIgICApLCA2MTEpOworICByZWZsZWN0aW9uLT5BZGREb3VibGUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIgICksIDYxMik7CisgIHJlZmxlY3Rpb24tPkFkZEJvb2wgIChtZXNzYWdlLCBGKCJwYWNrZWRfYm9vbCIgICAgKSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0gIChtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIgICAgKSwgZm9yZWlnbl9iYXJfKTsKKworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICksIDcwMSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgNzAyKTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApLCA3MDMpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICksIDcwNCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgNzA1KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApLCA3MDYpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICksIDcwNyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgNzA4KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpLCA3MDkpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IiksIDcxMCk7CisgIHJlZmxlY3Rpb24tPkFkZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgNzExKTsKKyAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApLCA3MTIpOworICByZWZsZWN0aW9uLT5BZGRCb29sICAobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICksIGZhbHNlKTsKKyAgcmVmbGVjdGlvbi0+QWRkRW51bSAgKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiAgICApLCBmb3JlaWduX2Jhel8pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoaXMgaW50byB0aHJlZSBmdW5jdGlvbiBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHN0YWNrCisgIC8vIGZyYW1lIHNvIGxhcmdlIHRoYXQgaXQgdHJpZ2dlcnMgYSB3YXJuaW5nLgorICBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMShtZXNzYWdlKTsKKyAgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjIobWVzc2FnZSk7CisgIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24zKG1lc3NhZ2UpOworfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RyaW5nIHNjcmF0Y2g7CisgIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50MzIiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDMyIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50NjQiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZmxvYXQiICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9kb3VibGUiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIgICApKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIgICAgICAgICAgICAgICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiICAgICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIiAgICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiICAgICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIiAgICAgICAgICkpKTsKKworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKKworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIikpKTsKKworICBFWFBFQ1RfRVEoMTAxICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQzMiIgICApKSk7CisgIEVYUEVDVF9FUSgxMDIgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0VRKDEwMyAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIiAgKSkpOworICBFWFBFQ1RfRVEoMTA0ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50NjQiICApKSk7CisgIEVYUEVDVF9FUSgxMDUgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKDEwNiAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfRVEoMTA3ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDMyIiApKSk7CisgIEVYUEVDVF9FUSgxMDggICwgcmVmbGVjdGlvbi0+R2V0VUludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0VRKDEwOSAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoMTEwICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9FUSgxMTEgICwgcmVmbGVjdGlvbi0+R2V0RmxvYXQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0VRKDExMiAgLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfVFJVRSggICAgIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJvcHRpb25hbF9ib29sIiAgICApKSk7CisgIEVYUEVDVF9FUSgiMTE1IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0VRKCIxMTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9FUSgiMTE1IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIpLCAmc2NyYXRjaCkpOworICBFWFBFQ1RfRVEoIjExNiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIgKSwgJnNjcmF0Y2gpKTsKKworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiKSk7CisgIEVYUEVDVF9FUSgxMTcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0VRKDExOCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUSgxMTksIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOworICBFWFBFQ1RfRVEoMTIwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0VRKDEyNiwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUSgxMjcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisKKyAgRVhQRUNUX0VRKCBuZXN0ZWRfYmF6XywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSkpOworICBFWFBFQ1RfRVEoZm9yZWlnbl9iYXpfLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9FUSggaW1wb3J0X2Jhel8sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKKworICBFWFBFQ1RfRVEoIjEyNCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfRVEoIjEyNCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIjEyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIikpKTsKKyAgRVhQRUNUX0VRKCIxMjUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpLCAmc2NyYXRjaCkpOworCit9CisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24yKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdHJpbmcgc2NyYXRjaDsKKyAgY29uc3QgTWVzc2FnZSogc3ViX21lc3NhZ2U7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOworCisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiICAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgICAgKSkpOworCisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIikpKTsKKworICBFWFBFQ1RfRVEoMjAxICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAwKSk7CisgIEVYUEVDVF9FUSgyMDMgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSwgMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApLCAwKSk7CisgIEVYUEVDVF9FUSgyMDYgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApLCAwKSk7CisgIEVYUEVDVF9FUSgyMDkgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApLCAwKSk7CisgIEVYUEVDVF9FUSgyMTIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMCkpOworICBFWFBFQ1RfVFJVRSggICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiICAgKSwgMCkpOworCisgIEVYUEVDVF9FUSgiMjE1IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiksIDAsICZzY3JhdGNoKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiKSwgMCwgJnNjcmF0Y2gpKTsKKworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAwKTsKKyAgRVhQRUNUX0VRKDIxNywgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMCk7CisgIEVYUEVDVF9FUSgyMTgsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMCk7CisgIEVYUEVDVF9FUSgyMTksIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMCk7CisgIEVYUEVDVF9FUSgyMjAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMCk7CisgIEVYUEVDVF9FUSgyMjcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisKKyAgRVhQRUNUX0VRKCBuZXN0ZWRfYmFyXywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDApKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDApKTsKKyAgRVhQRUNUX0VRKCBpbXBvcnRfYmFyXywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDApKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAwKSk7CisgIEVYUEVDVF9FUSgiMjI0IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMCwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIjIyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMCkpOworICBFWFBFQ1RfRVEoIjIyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpLCAwLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgzMDEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50MzIiICAgKSwgMSkpOworICBFWFBFQ1RfRVEoMzAyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiAgICksIDEpKTsKKyAgRVhQRUNUX0VRKDMwMyAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50MzIiICApLCAxKSk7CisgIEVYUEVDVF9FUSgzMDQgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IiAgKSwgMSkpOworICBFWFBFQ1RfRVEoMzA1ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEpKTsKKyAgRVhQRUNUX0VRKDMwNiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50NjQiICApLCAxKSk7CisgIEVYUEVDVF9FUSgzMDcgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMSkpOworICBFWFBFQ1RfRVEoMzA4ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEpKTsKKyAgRVhQRUNUX0VRKDMwOSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAxKSk7CisgIEVYUEVDVF9FUSgzMTAgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMSkpOworICBFWFBFQ1RfRVEoMzExICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRmxvYXQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEpKTsKKyAgRVhQRUNUX0VRKDMxMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9kb3VibGUiICApLCAxKSk7CisgIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sICAobWVzc2FnZSwgRigicmVwZWF0ZWRfYm9vbCIgICAgKSwgMSkpOworICBFWFBFQ1RfRVEoIjMxNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIgICksIDEpKTsKKyAgRVhQRUNUX0VRKCIzMTYiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIgICApLCAxKSk7CisKKyAgRVhQRUNUX0VRKCIzMTUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmc2NyYXRjaCkpOworICBFWFBFQ1RfRVEoIjMxNiIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJnNjcmF0Y2gpKTsKKworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAxKTsKKyAgRVhQRUNUX0VRKDMxNywgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSk7CisgIEVYUEVDVF9FUSgzMTgsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSk7CisgIEVYUEVDVF9FUSgzMTksIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSk7CisgIEVYUEVDVF9FUSgzMjAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSk7CisgIEVYUEVDVF9FUSgzMjcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisKKyAgRVhQRUNUX0VRKCBuZXN0ZWRfYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDEpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDEpKTsKKyAgRVhQRUNUX0VRKCBpbXBvcnRfYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDEpKTsKKworICBFWFBFQ1RfRVEoIjMyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxKSk7CisgIEVYUEVDVF9FUSgiMzI0IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIjMyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMSkpOworICBFWFBFQ1RfRVEoIjMyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpLCAxLCAmc2NyYXRjaCkpOworfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RyaW5nIHNjcmF0Y2g7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQ2NCIgICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50MzIiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDY0IiApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9mbG9hdCIgICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOworCisgIEVYUEVDVF9FUSg0MDEgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50MzIiICAgKSkpOworICBFWFBFQ1RfRVEoNDAyICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0VRKDQwMyAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigiZGVmYXVsdF91aW50MzIiICApKSk7CisgIEVYUEVDVF9FUSg0MDQgICwgcmVmbGVjdGlvbi0+R2V0VUludDY0KG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDY0IiAgKSkpOworICBFWFBFQ1RfRVEoNDA1ICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKDQwNiAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50NjQiICApKSk7CisgIEVYUEVDVF9FUSg0MDcgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOworICBFWFBFQ1RfRVEoNDA4ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0VRKDQwOSAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSg0MTAgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRVEoNDExICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0VRKDQxMiAgLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigiZGVmYXVsdF9kb3VibGUiICApKSk7CisgIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0Qm9vbCAgKG1lc3NhZ2UsIEYoImRlZmF1bHRfYm9vbCIgICAgKSkpOworICBFWFBFQ1RfRVEoIjQxNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgICApKSk7CisKKyAgRVhQRUNUX0VRKCI0MTUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciKSwgJnNjcmF0Y2gpKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgKSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIG5lc3RlZF9mb29fLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fZm9vXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9FUSggaW1wb3J0X2Zvb18sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOworCisgIEVYUEVDVF9FUSgiNDI0IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCI0MjQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIjQyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIjQyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSwgJnNjcmF0Y2gpKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NpbnQzMiIgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDY0IiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2VudW0iICAgICkpKTsKKworICBFWFBFQ1RfRVEoNjAxICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApLCAwKSk7CisgIEVYUEVDVF9FUSg2MDIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiAgICksIDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiAgKSwgMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApLCAwKSk7CisgIEVYUEVDVF9FUSg2MDUgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NpbnQzMiIgICksIDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDY0IiAgKSwgMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApLCAwKSk7CisgIEVYUEVDVF9FUSg2MDggICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiICksIDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCAwKSk7CisgIEVYUEVDVF9FUSg2MTEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdCAobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiAgICksIDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiAgKSwgMCkpOworICBFWFBFQ1RfVFJVRSggICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCAwKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX2Jhcl8sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicGFja2VkX2VudW0iKSwgMCkpOworCisgIEVYUEVDVF9FUSg3MDEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICksIDEpKTsKKyAgRVhQRUNUX0VRKDcwMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgMSkpOworICBFWFBFQ1RfRVEoNzAzICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApLCAxKSk7CisgIEVYUEVDVF9FUSg3MDQgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICksIDEpKTsKKyAgRVhQRUNUX0VRKDcwNSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgMSkpOworICBFWFBFQ1RfRVEoNzA2ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApLCAxKSk7CisgIEVYUEVDVF9FUSg3MDcgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICksIDEpKTsKKyAgRVhQRUNUX0VRKDcwOCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMSkpOworICBFWFBFQ1RfRVEoNzA5ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpLCAxKSk7CisgIEVYUEVDVF9FUSg3MTAgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IiksIDEpKTsKKyAgRVhQRUNUX0VRKDcxMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgMSkpOworICBFWFBFQ1RfRVEoNzEyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApLCAxKSk7CisgIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sICAobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICksIDEpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIpLCAxKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdHJpbmcgc2NyYXRjaDsKKyAgY29uc3QgTWVzc2FnZSogc3ViX21lc3NhZ2U7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiICAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDMyIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZmxvYXQiICAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIiAgICAgICAgICAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKKworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOworCisgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSkpOworICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSkpOworICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50MzIiICApKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOworICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDY0IiApKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9mbG9hdCIgICApKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0RG91YmxlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICByZWZsZWN0aW9uLT5HZXRCb29sICAobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSkpOworICBFWFBFQ1RfRVEoIiIgICAsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApKSk7CisgIEVYUEVDVF9FUSgiIiAgICwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKKworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSwgJnNjcmF0Y2gpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICksICZzY3JhdGNoKSk7CisKKyAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKKyAgRVhQRUNUX0VRKDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIEVYUEVDVF9FUSgwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9lXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKworICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgorICBFWFBFQ1RfRVEoIG5lc3RlZF9mb29fLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX2Zvb18sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKCBpbXBvcnRfZm9vXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOworCisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIiksICZzY3JhdGNoKSk7CisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIgICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDMyIiApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICkpKTsKKworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiICAgICAgICAgICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKKworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQzMiIgICApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF91aW50NjQiICApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDMyIiApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9ib29sIiAgICApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfY29yZCIpKSk7CisKKyAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgRVhQRUNUX0VRKCA0MSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX0VRKCA0MiAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0VRKCA0MyAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKCA0NCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKC00NSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKCA0NiAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKCA0NyAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX0VRKCA0OCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0VRKCA0OSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX0VRKC01MCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKCA1MS41ICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0VRKCA1MmUzICAsIHJlZmxlY3Rpb24tPkdldERvdWJsZShtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKKyAgRVhQRUNUX1RSVUUoICAgICAgIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKKworICBFWFBFQ1RfRVEoImhlbGxvIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiksICZzY3JhdGNoKSk7CisgIEVYUEVDVF9FUSgid29ybGQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgKSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIG5lc3RlZF9iYXJfLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9FUSggaW1wb3J0X2Jhcl8sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOworCisgIEVYUEVDVF9FUSgiYWJjIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCJhYmMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIjEyMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIjEyMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSwgJnNjcmF0Y2gpKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0UGFja2VkQ2xlYXJWaWFSZWZsZWN0aW9uKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIgICAgKSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDEsIDUwMSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiAgICksIDEsIDUwMik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEsIDUwMyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEsIDUwNCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEsIDUwNSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEsIDUwNik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEsIDUwNyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEsIDUwOCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEsIDUwOSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEsIDUxMCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRmxvYXQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEsIDUxMSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEsIDUxMik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEsIHRydWUpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAxLCAiNTE1Iik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICksIDEsICI1MTYiKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIHJlcGVhdGVkX2dyb3VwX2FfLCA1MTcpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDUxOCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfLCA1MTkpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8sIDUyMCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDUyNyk7CisKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAxLCAgbmVzdGVkX2Zvb18pOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIDEsIGZvcmVpZ25fZm9vXyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgMSwgIGltcG9ydF9mb29fKTsKKworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSwgIjUyNCIpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksIDEsICI1MjUiKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6TW9kaWZ5UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApLCAxLCA4MDEpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgMSwgODAyKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIgICksIDEsIDgwMyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApLCAxLCA4MDQpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgMSwgODA1KTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIgICksIDEsIDgwNik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApLCAxLCA4MDcpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMSwgODA4KTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIiksIDEsIDgwOSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCAxLCA4MTApOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgMSwgODExKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIgICksIDEsIDgxMik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCAxLCB0cnVlKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRFbnVtICAobWVzc2FnZSwgRigicGFja2VkX2VudW0iICAgICksIDEsIGZvcmVpZ25fZm9vXyk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlJlbW92ZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3V0cHV0OworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmb3V0cHV0KTsKKyAgZm9yIChpbnQgaT0wOyBpPG91dHB1dC5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvdXRwdXRbaV07CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgY29udGludWU7CisKKyAgICByZWZsZWN0aW9uLT5SZW1vdmVMYXN0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgfQorfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpSZWxlYXNlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oCisgICAgTWVzc2FnZSogbWVzc2FnZSwgYm9vbCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJm91dHB1dCk7CisgIGZvciAoaW50IGk9MDsgaTxvdXRwdXQuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3V0cHV0W2ldOworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIGNvbnRpbnVlOworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgY29udGludWU7CisKKyAgICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VMYXN0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICBpZiAoIWZpZWxkLT5pc19leHRlbnNpb24oKSB8fCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKSB7CisgICAgICBBU1NFUlRfVFJVRShyZWxlYXNlZCAhPSBOVUxMKSA8PCAiUmVsZWFzZUxhc3QgcmV0dXJuZWQgTlVMTCBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5uYW1lKCk7CisgICAgfQorICAgIGRlbGV0ZSByZWxlYXNlZDsKKyAgfQorfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpTd2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJm91dHB1dCk7CisgIGZvciAoaW50IGk9MDsgaTxvdXRwdXQuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3V0cHV0W2ldOworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIGNvbnRpbnVlOworCisgICAgcmVmbGVjdGlvbi0+U3dhcEVsZW1lbnRzKG1lc3NhZ2UsIGZpZWxkLCAwLCAxKTsKKyAgfQorfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpNZXNzYWdlUmVsZWFzZVN0YXRlIGV4cGVjdGVkX3JlbGVhc2Vfc3RhdGUpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBzdGF0aWMgY29uc3QgY2hhciogZmllbGRzW10gPSB7CisgICAgIm9wdGlvbmFsZ3JvdXAiLAorICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsCisgICAgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsCisgICAgIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiwKKyAgfTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGZpZWxkcyk7IGkrKykgeworICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgqbWVzc2FnZSwgRihmaWVsZHNbaV0pKTsKKyAgICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIEYoZmllbGRzW2ldKSk7CisgICAgc3dpdGNoIChleHBlY3RlZF9yZWxlYXNlX3N0YXRlKSB7CisgICAgICBjYXNlIElTX05VTEw6CisgICAgICAgIEVYUEVDVF9UUlVFKHJlbGVhc2VkID09IE5VTEwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTk9UX05VTEw6CisgICAgICAgIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IE5VTEwpOworICAgICAgICBFWFBFQ1RfRVEoJnN1Yl9tZXNzYWdlLCByZWxlYXNlZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQU5fQkVfTlVMTDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlbGV0ZSByZWxlYXNlZDsKKyAgICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIEYoZmllbGRzW2ldKSkpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTE5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfSF9fCisKKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgdW5pdHRlc3QgPSA6OnByb3RvYnVmX3VuaXR0ZXN0OworbmFtZXNwYWNlIHVuaXR0ZXN0X2ltcG9ydCA9IHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydDsKKworY2xhc3MgVGVzdFV0aWwgeworIHB1YmxpYzoKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorICBzdGF0aWMgdm9pZCBTZXRBbGxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIFNldE9wdGlvbmFsRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBBZGRSZXBlYXRlZEZpZWxkczEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEFkZFJlcGVhdGVkRmllbGRzMih1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0RGVmYXVsdEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0QWxsRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIFNldFBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0VW5wYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzKiBtZXNzYWdlKTsKKworICAvLyBVc2UgdGhlIHJlcGVhdGVkIHZlcnNpb25zIG9mIHRoZSBzZXRfKigpIGFjY2Vzc29ycyB0byBtb2RpZnkgYWxsIHRoZQorICAvLyByZXBlYXRlZCBmaWVsZHMgb2YgdGhlIG1lc3NzYWdlICh3aGljaCBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4KKyAgLy8gaW5pdGlhbGl6ZWQgd2l0aCBTZXQqRmllbGRzKCkpLiAgU2V0KkZpZWxkcygpIGl0c2VsZiBvbmx5IHRlc3RzCisgIC8vIHRoZSBhZGRfKigpIGFjY2Vzc29ycy4KKyAgc3RhdGljIHZvaWQgTW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIE1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBNb2RpZnlQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIE1vZGlmeVBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgorICAvLyBTZXQqRmllbGRzKCkgaXMgY2FsbGVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RVbnBhY2tlZEZpZWxkc1NldCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRUeXBlcyYgbWVzc2FnZSk7CisKKyAgLy8gRXhwZWN0IHRoYXQgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgYXMgd291bGQgYmUgZXhwZWN0ZWQgZnJvbQorICAvLyBNb2RpZnkqRmllbGRzKCkuCisgIHN0YXRpYyB2b2lkIEV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICBzdGF0aWMgdm9pZCBFeHBlY3RDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0RXh0ZW5zaW9uc0NsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHBhc3NlZC1pbiBzZXJpYWxpemF0aW9uIGlzIHRoZSBjYW5vbmljYWwgc2VyaWFsaXphdGlvbiB3ZQorICAvLyBleHBlY3QgZm9yIGEgVGVzdEZpZWxkT3JkZXJpbmdzIG1lc3NhZ2UgZmlsbGVkIGluIGJ5CisgIC8vIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoKS4KKyAgc3RhdGljIHZvaWQgRXhwZWN0QWxsRmllbGRzQW5kRXh0ZW5zaW9uc0luT3JkZXIoY29uc3Qgc3RyaW5nJiBzZXJpYWxpemVkKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCByZXBlYXRlZCBmaWVsZHMgaGF2ZSBoYWQgdGhlaXIgbGFzdCBlbGVtZW50cyByZW1vdmVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRzUmVtb3ZlZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVtb3ZlZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdExhc3RSZXBlYXRlZHNSZWxlYXNlZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVsZWFzZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIHJlcGVhdGVkIGZpZWxkcyBoYXZlIGhhZCB0aGVpciBmaXJzdCBhbmQgbGFzdCBlbGVtZW50cworICAvLyBzd2FwcGVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RSZXBlYXRlZHNTd2FwcGVkKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNTd2FwcGVkKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKTsKKworICAvLyBMaWtlIGFib3ZlLCBidXQgdXNlIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgY2xhc3MgUmVmbGVjdGlvblRlc3RlciB7CisgICBwdWJsaWM6CisgICAgLy8gYmFzZV9kZXNjcmlwdG9yIG11c3QgYmUgYSBkZXNjcmlwdG9yIGZvciBUZXN0QWxsVHlwZXMgb3IKKyAgICAvLyBUZXN0QWxsRXh0ZW5zaW9ucy4gIEluIHRoZSBmb3JtZXIgY2FzZSwgUmVmbGVjdGlvblRlc3RlciBmZXRjaGVzIGZyb20KKyAgICAvLyBpdCB0aGUgRmllbGREZXNjcmlwdG9ycyBuZWVkZWQgdG8gdXNlIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZS4gIEluCisgICAgLy8gdGhlIGxhdHRlciBjYXNlLCBSZWZsZWN0aW9uVGVzdGVyIHNlYXJjaGVzIGZvciBleHRlbnNpb24gZmllbGRzIGluCisgICAgLy8gaXRzIGZpbGUuCisgICAgZXhwbGljaXQgUmVmbGVjdGlvblRlc3Rlcihjb25zdCBEZXNjcmlwdG9yKiBiYXNlX2Rlc2NyaXB0b3IpOworCisgICAgdm9pZCBTZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOworICAgIHZvaWQgTW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOworICAgIHZvaWQgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKyAgICB2b2lkIEV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAgIHZvaWQgU2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgICB2b2lkIE1vZGlmeVBhY2tlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgICAgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICAgIHZvaWQgRXhwZWN0UGFja2VkQ2xlYXJWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgICAgdm9pZCBSZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgICB2b2lkIFJlbGVhc2VMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigKKyAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwgYm9vbCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKTsKKyAgICB2b2lkIFN3YXBSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOworCisgICAgZW51bSBNZXNzYWdlUmVsZWFzZVN0YXRlIHsKKyAgICAgIElTX05VTEwsCisgICAgICBDQU5fQkVfTlVMTCwKKyAgICAgIE5PVF9OVUxMLAorICAgIH07CisgICAgdm9pZCBFeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwgTWVzc2FnZVJlbGVhc2VTdGF0ZSBleHBlY3RlZF9yZWxlYXNlX3N0YXRlKTsKKworICAgcHJpdmF0ZToKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEYoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAgIGNvbnN0IERlc2NyaXB0b3IqIGJhc2VfZGVzY3JpcHRvcl87CisKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGdyb3VwX2FfOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVwZWF0ZWRfZ3JvdXBfYV87CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfYl87CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmb3JlaWduX2NfOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW1wb3J0X2RfOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW1wb3J0X2VfOworCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Zvb187CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Jhcl87CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Jhel87CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZm9yZWlnbl9mb29fOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvcmVpZ25fYmFyXzsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb3JlaWduX2Jhel87CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogaW1wb3J0X2Zvb187CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogaW1wb3J0X2Jhcl87CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogaW1wb3J0X2Jhel87CisKKyAgICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoaXMgaW50byB0aHJlZSBmdW5jdGlvbiBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHN0YWNrCisgICAgLy8gZnJhbWUgc28gbGFyZ2UgdGhhdCBpdCB0cmlnZ2VycyBhIHdhcm5pbmcuCisgICAgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKyAgICB2b2lkIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24yKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICAgIHZvaWQgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVmbGVjdGlvblRlc3Rlcik7CisgIH07CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFV0aWwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1RFU1RfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk5MjkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCkBAIC0wLDAgKzEsMTU0OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKworI2RlZmluZSBFWFBFQ1RfVFJVRSBHT09HTEVfQ0hFQ0sKKyNkZWZpbmUgQVNTRVJUX1RSVUUgR09PR0xFX0NIRUNLCisjZGVmaW5lIEVYUEVDVF9GQUxTRShDT05EKSBHT09HTEVfQ0hFQ0soIShDT05EKSkKKyNkZWZpbmUgRVhQRUNUX0VRIEdPT0dMRV9DSEVDS19FUQorI2RlZmluZSBBU1NFUlRfRVEgR09PR0xFX0NIRUNLX0VRCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordm9pZCBUZXN0VXRpbExpdGU6OlNldEFsbEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfaW50MzIgICAoMTAxKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDY0ICAgKDEwMik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF91aW50MzIgICgxMDMpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfdWludDY0ICAoMTA0KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NpbnQzMiAgKDEwNSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zaW50NjQgICgxMDYpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZml4ZWQzMiAoMTA3KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkNjQgKDEwOCk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zZml4ZWQzMigxMDkpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ZpeGVkNjQoMTEwKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2Zsb2F0ICAgKDExMSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9kb3VibGUgICgxMTIpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfYm9vbCAgICAodHJ1ZSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zdHJpbmcgICgiMTE1Iik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9ieXRlcyAgICgiMTE2Iik7CisKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS0+c2V0X2EoMTE3KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS0+c2V0X2JiKDExOCk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCktPnNldF9jKDExOSk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCktPnNldF9kKDEyMCk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCktPnNldF9lKDEyNik7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCktPnNldF9iYigxMjcpOworCisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiApOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ltcG9ydF9lbnVtICh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWik7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgyMDEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMjAyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMiAgKDIwMyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQgICgyMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyICAoMjA1KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCAgKDIwNik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyICgyMDcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCAoMjA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDIwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgyMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQgICAoMjExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSAgKDIxMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZyAgKCIyMTUiKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2J5dGVzICAgKCIyMTYiKTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKCktPnNldF9hKDIxNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDIxOCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMjE5KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgyMjApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKCktPnNldF9iYigyMjcpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9lbnVtICh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUik7CisKKworICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgzMDEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMzAyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMiAgKDMwMyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQgICgzMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyICAoMzA1KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCAgKDMwNik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyICgzMDcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCAoMzA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDMwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgzMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQgICAoMzExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSAgKDMxMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sICAgIChmYWxzZSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zdHJpbmcgICgiMzE1Iik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ieXRlcyAgICgiMzE2Iik7CisKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkZ3JvdXAgICAgICAgICAgICgpLT5zZXRfYSgzMTcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKCktPnNldF9iYigzMTgpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDMxOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoKS0+c2V0X2QoMzIwKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgpLT5zZXRfYmIoMzI3KTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVogKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVopOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQzMiAgICg0MDEpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQ2NCAgICg0MDIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF91aW50MzIgICg0MDMpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF91aW50NjQgICg0MDQpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zaW50MzIgICg0MDUpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zaW50NjQgICg0MDYpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9maXhlZDMyICg0MDcpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9maXhlZDY0ICg0MDgpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zZml4ZWQzMig0MDkpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zZml4ZWQ2NCg0MTApOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9mbG9hdCAgICg0MTEpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9kb3VibGUgICg0MTIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9ib29sICAgIChmYWxzZSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3N0cmluZyAgKCI0MTUiKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfYnl0ZXMgICAoIjQxNiIpOworCisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X25lc3RlZF9lbnVtICh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ltcG9ydF9lbnVtICh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDMyICAgKDEsIDUwMSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9pbnQ2NCAgICgxLCA1MDIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfdWludDMyICAoMSwgNTAzKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3VpbnQ2NCAgKDEsIDUwNCk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zaW50MzIgICgxLCA1MDUpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ludDY0ICAoMSwgNTA2KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkMzIgKDEsIDUwNyk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9maXhlZDY0ICgxLCA1MDgpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ZpeGVkMzIoMSwgNTA5KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NmaXhlZDY0KDEsIDUxMCk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9mbG9hdCAgICgxLCA1MTEpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZG91YmxlICAoMSwgNTEyKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Jvb2wgICAgKDEsIHRydWUpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc3RyaW5nICAoMSwgIjUxNSIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYnl0ZXMgICAoMSwgIjUxNiIpOworCisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLT5zZXRfYSg1MTcpOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS0+c2V0X2JiKDUxOCk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLT5zZXRfYyg1MTkpOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS0+c2V0X2QoNTIwKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMSktPnNldF9iYig1MjcpOworCisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyApOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ltcG9ydF9lbnVtICgxLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZG91YmxlICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Jvb2wgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLmhhc19hKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLmhhc19iYigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKS5oYXNfYygpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS5oYXNfZCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5oYXNfZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKS5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworCisgIEVYUEVDVF9FUSgxMDEgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0VRKDEwMiAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgKCkpOworICBFWFBFQ1RfRVEoMTAzICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSgxMDQgICwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0VRKDEwNSAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoMTA2ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSgxMDcgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0VRKDEwOCAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRVEoMTA5ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgxMTAgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDExMSAgLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRVEoMTEyICAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAoKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0VRKCIxMTUiLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOworICBFWFBFQ1RfRVEoIjExNiIsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS5hKCkpOworICBFWFBFQ1RfRVEoMTE4LCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLmJiKCkpOworICBFWFBFQ1RfRVEoMTE5LCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmMoKSk7CisgIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkuZCgpKTsKKyAgRVhQRUNUX0VRKDEyNiwgbWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5lKCkpOworICBFWFBFQ1RfRVEoMTI3LCBtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWiwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSAoKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOworCisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMCkuYmIoKSk7CisKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMCkpOworCisgIEVYUEVDVF9FUSgzMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgxKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgxKSk7CisgIEVYUEVDVF9FUSgzMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSgzMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSgzMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSgzMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgxKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgxKSk7CisgIEVYUEVDVF9FUSgzMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSgzMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgxKSk7CisgIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgxKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgxKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgxKSk7CisKKyAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7CisgIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CisgIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDEpLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgxKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50MzIgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworCisgIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoNDAyICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoNDA1ICAsIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoNDA4ICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNDExICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoIjQxNSIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLmRlZmF1bHRfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDY0ICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZG91YmxlICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZyAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X2VudW0gKCkpOworCisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDY0ICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzICAgKCkpOworCisgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS5oYXNfYSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKS5oYXNfYygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkuaGFzX2QoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLmhhc19lKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKS5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgKCkuYSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkuYmIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmMoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLmQoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOworCisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7CisKKworICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgorICBFWFBFQ1RfRVEoIDQxICAgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoIDQyICAgICwgbWVzc2FnZS5kZWZhdWx0X2ludDY0ICAgKCkpOworICBFWFBFQ1RfRVEoIDQzICAgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoIDQ0ICAgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoLTQ1ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoIDQ2ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoIDQ3ICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoIDQ4ICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRVEoIDQ5ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoLTUwICAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoIDUxLjUgICwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRVEoIDUyZTMgICwgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRVEodHJ1ZSAgICwgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5kZWZhdWx0X3N0cmluZyAgKCkpOworICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5kZWZhdWx0X2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICwgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIsIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKKyAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKKyAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplICAgKCkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSAgICAgICAgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKKworCisgIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgwKSk7CisgIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgwKSk7CisgIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgwKSk7CisgIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgwKSk7CisgIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgwKSk7CisgIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgwKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgwKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgwKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDApLmQoKSk7CisgIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDApLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgwKSk7CisKKworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDUwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDEpKTsKKyAgRVhQRUNUX0VRKDUwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDEpKTsKKyAgRVhQRUNUX0VRKDUwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDUxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDUxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDEpKTsKKyAgRVhQRUNUX0VRKCI1MTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDEpKTsKKyAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDEpKTsKKworICBFWFBFQ1RfRVEoNTE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgxKS5hKCkpOworICBFWFBFQ1RfRVEoNTE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSkuYygpKTsKKyAgRVhQRUNUX0VRKDUyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMSkuZCgpKTsKKyAgRVhQRUNUX0VRKDUyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMSkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08sIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDEpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQzMiAgICg2MDEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDY0ICAgKDYwMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDMyICAoNjAzKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50NjQgICg2MDQpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQzMiAgKDYwNSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDY0ICAoNjA2KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDMyICg2MDcpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkNjQgKDYwOCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkMzIoNjA5KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQ2NCg2MTApOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2Zsb2F0ICAgKDYxMSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZG91YmxlICAoNjEyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9lbnVtICAgICh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUik7CisgIC8vIGFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZAorICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDMyICAgKDcwMSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50NjQgICAoNzAyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50MzIgICg3MDMpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQ2NCAgKDcwNCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDMyICAoNzA1KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50NjQgICg3MDYpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkMzIgKDcwNyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQ2NCAoNzA4KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQzMig3MDkpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDY0KDcxMCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZmxvYXQgICAoNzExKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9kb3VibGUgICg3MTIpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2Jvb2wgICAgKGZhbHNlKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9lbnVtICAgICh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6Ok1vZGlmeVBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfcGFja2VkX2ludDMyICAgKDEsIDgwMSk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfaW50NjQgICAoMSwgODAyKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF91aW50MzIgICgxLCA4MDMpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3VpbnQ2NCAgKDEsIDgwNCk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ludDMyICAoMSwgODA1KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zaW50NjQgICgxLCA4MDYpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2ZpeGVkMzIgKDEsIDgwNyk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZml4ZWQ2NCAoMSwgODA4KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zZml4ZWQzMigxLCA4MDkpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3NmaXhlZDY0KDEsIDgxMCk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZmxvYXQgICAoMSwgODExKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9kb3VibGUgICgxLCA4MTIpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2Jvb2wgICAgKDEsIHRydWUpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2VudW0gICAgKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzU2V0KAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKKworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDApKTsKKworICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgxKSk7CisgIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDEpKTsKKyAgRVhQRUNUX0VRKDcwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgxKSk7CisgIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDcxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgxKSk7CisgIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDEpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkQ2xlYXIoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKKyAgLy8gUGFja2VkIHJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzTW9kaWZpZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKKyAgLy8gRG8gdGhlIHNhbWUgZm9yIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMuCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKKworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDApKTsKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg4MDEgICwgbWVzc2FnZS5wYWNrZWRfaW50MzIgICAoMSkpOworICBFWFBFQ1RfRVEoODAyICAsIG1lc3NhZ2UucGFja2VkX2ludDY0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwMyAgLCBtZXNzYWdlLnBhY2tlZF91aW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg4MDQgICwgbWVzc2FnZS5wYWNrZWRfdWludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoODA1ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwNiAgLCBtZXNzYWdlLnBhY2tlZF9zaW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg4MDcgICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMiAoMSkpOworICBFWFBFQ1RfRVEoODA4ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQgKDEpKTsKKyAgRVhQRUNUX0VRKDgwOSAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoODExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDgxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgxKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08sIG1lc3NhZ2UucGFja2VkX2VudW0oMSkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBFeHRlbnNpb25zCisvLworLy8gQWxsIHRoaXMgY29kZSBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlIGNvZGUgZXhjZXB0IHRoYXQgaXQncworLy8gbWFuaXB1bGF0aW5nIGV4dGVuc2lvbiBmaWVsZHMgaW5zdGVhZCBvZiBub3JtYWwgb25lcy4KKy8vCisvLyBJIGdhdmUgdXAgb24gdGhlIDgwLWNoYXIgbGltaXQgaGVyZS4gIFNvcnJ5LgorCit2b2lkIFRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDEwMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDEwMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDEwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDEwNCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDEwNSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDEwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDEwNyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDEwOCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDExMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDExMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDExMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIHRydWUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAiMTE1Iik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsICIxMTYiKTsKKworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAgICAgICApLT5zZXRfYSgxMTcpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLT5zZXRfYmIoMTE4KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS0+c2V0X2MoMTE5KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS0+c2V0X2QoMTIwKTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS0+c2V0X2UoMTI2KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS0+c2V0X2JiKDEyNyk7CisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVogKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaKTsKKworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMjAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMjAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMjAzKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMjA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMjA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMjA2KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMjA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMjA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMjA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMjEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMjExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMjEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgdHJ1ZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsICIyMTUiKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgIjIxNiIpOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKS0+c2V0X2EoMjE3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfYmIoMjE4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLT5zZXRfYygyMTkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICktPnNldF9kKDIyMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgKS0+c2V0X2JiKDIyNyk7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSKTsKKworCisgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMzAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMzAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMzAzKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMzA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMzA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMzA2KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMzA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMzA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMzA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMzEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMzExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMzEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgZmFsc2UpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAiMzE1Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsICIzMTYiKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICktPnNldF9hKDMxNyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS0+c2V0X2JiKDMxOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS0+c2V0X2MoMzE5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfZCgzMjApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICktPnNldF9iYigzMjcpOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWik7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgNDAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCA0MDIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDQwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgNDA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCA0MDUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDQwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgNDA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCA0MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDQwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgNDEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCA0MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDQxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgZmFsc2UpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsICI0MTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAiNDE2Iik7CisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxLCA1MDEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxLCA1MDIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDMpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDYpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxLCA1MDcpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxLCA1MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxLCA1MDkpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxLCA1MTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxLCA1MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MTIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICwgMSwgIjUxNSIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAxLCAiNTE2Iik7CisKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAxKS0+c2V0X2EoNTE3KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAxKS0+c2V0X2JiKDUxOCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSktPnNldF9jKDUxOSk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSktPnNldF9kKDUyMCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICwgMSktPnNldF9iYig1MjcpOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgICApKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKS5oYXNfYSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS5oYXNfYygpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuaGFzX2QoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmhhc19lKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKworCisgIEVYUEVDVF9FUSgxMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSgxMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSgxMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgxMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgxMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgxMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgxMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSgxMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSgxMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgxMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgxMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSgxMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgiMTE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICAgICAgICkuYSgpKTsKKyAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuYmIoKSk7CisgIEVYUEVDVF9FUSgxMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICApLmMoKSk7CisgIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLmQoKSk7CisgIEVYUEVDVF9FUSgxMjYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmUoKSk7CisgIEVYUEVDVF9FUSgxMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgICApLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOworCisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICwgMCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDApKTsKKworCisgIEVYUEVDVF9FUSgzMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgzMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisKKyAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICwgMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSkuYmIoKSk7CisgIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpLmMoKSk7CisgIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDEpLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAsIDEpLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKworCisgIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDQwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoNDAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDQwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoNDA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDQwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoNDA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDQxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoNDEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoIjQxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSkgeworICBzdHJpbmcgc2VyaWFsaXplZDsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworICBFWFBFQ1RfRVEoIiIsIHNlcmlhbGl6ZWQpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKKworICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAgICAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgICApKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworCisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICkpOworCisgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICAgICAgICkuaGFzX2EoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS5oYXNfYygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLmhhc19kKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkuaGFzX2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAgICAgICApLmEoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS5iYigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICApLmMoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS5kKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkuZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgICApLmJiKCkpOworCisgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisKKworICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgorICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKKworCisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworCisKKyAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgRVhQRUNUX0VRKCA0MSAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSggNDIgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoIDQzICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKCA0NCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgtNDUgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoIDQ2ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKCA0NyAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSggNDggICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoIDQ5ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKC01MCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSggNTEuNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoIDUyZTMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKHRydWUgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKKyAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCisgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisKKworICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMCkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAsIDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgLCAwKS5iYigpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMCkpOworCisKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg1MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg1MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg1MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxKSk7CisgIEVYUEVDVF9FUSgiNTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSgiNTE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisKKyAgRVhQRUNUX0VRKDUxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICwgMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDUxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSkuYmIoKSk7CisgIEVYUEVDVF9FUSg1MTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpLmMoKSk7CisgIEVYUEVDVF9FUSg1MjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDEpLmQoKSk7CisgIEVYUEVDVF9FUSg1MjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAsIDEpLmJiKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRXh0ZW5zaW9ucygKKyAgICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCA2MDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgNjAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDYwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCA2MDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgNjA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDYwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCA2MDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgNjA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDYwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCA2MTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgNjExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDYxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCB0cnVlKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIpOworICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDcwMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCA3MDIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgNzAzKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDcwNCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCA3MDUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgNzA2KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDcwNyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCA3MDgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgNzA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDcxMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCA3MTEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgNzEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIGZhbHNlKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVopOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpNb2RpZnlQYWNrZWRFeHRlbnNpb25zKAorICAgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDEsIDgwMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxLCA4MDIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSwgODAzKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDEsIDgwNCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxLCA4MDUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSwgODA2KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDEsIDgwNyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxLCA4MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSwgODA5KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEsIDgxMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxLCA4MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMSwgODEyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDEsIHRydWUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKKworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg3MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMSkpOworICBFWFBFQ1RfRVEoNzAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOworICBFWFBFQ1RfRVEoNzA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMSkpOworICBFWFBFQ1RfRVEoNzA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg3MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNzExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9FUSg2MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAwKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDApKTsKKworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDgwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMSkpOworICBFWFBFQ1RfRVEoODAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOworICBFWFBFQ1RfRVEoODA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMSkpOworICBFWFBFQ1RfRVEoODA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDgxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg4MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMSkpOworICBFWFBFQ1RfRVEoODEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwgMSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzNWFhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfTElURV9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHVuaXR0ZXN0ID0gcHJvdG9idWZfdW5pdHRlc3Q7CituYW1lc3BhY2UgdW5pdHRlc3RfaW1wb3J0ID0gcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCitjbGFzcyBUZXN0VXRpbExpdGUgeworIHB1YmxpYzoKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorICBzdGF0aWMgdm9pZCBTZXRBbGxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOworCisgIC8vIFVzZSB0aGUgcmVwZWF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNldF8qKCkgYWNjZXNzb3JzIHRvIG1vZGlmeSBhbGwgdGhlCisgIC8vIHJlcGVhdGVkIGZpZWxkcyBvZiB0aGUgbWVzc3NhZ2UgKHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgorICAvLyBpbml0aWFsaXplZCB3aXRoIFNldCpGaWVsZHMoKSkuICBTZXQqRmllbGRzKCkgaXRzZWxmIG9ubHkgdGVzdHMKKyAgLy8gdGhlIGFkZF8qKCkgYWNjZXNzb3JzLgorICBzdGF0aWMgdm9pZCBNb2RpZnlSZXBlYXRlZEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIE1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucygKKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBNb2RpZnlQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBNb2RpZnlQYWNrZWRFeHRlbnNpb25zKAorICAgICAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlIHZhbHVlcyB0aGF0IHRoZXkgc2hvdWxkIGhhdmUgYWZ0ZXIKKyAgLy8gU2V0KkZpZWxkcygpIGlzIGNhbGxlZC4KKyAgc3RhdGljIHZvaWQgRXhwZWN0QWxsRmllbGRzU2V0KGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNTZXQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKTsKKworICAvLyBFeHBlY3QgdGhhdCB0aGUgbWVzc2FnZSBpcyBtb2RpZmllZCBhcyB3b3VsZCBiZSBleHBlY3RlZCBmcm9tCisgIC8vIE1vZGlmeSpGaWVsZHMoKS4KKyAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRmllbGRzTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEV4dGVuc2lvbnNNb2RpZmllZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICBzdGF0aWMgdm9pZCBFeHBlY3RDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdEV4dGVuc2lvbnNDbGVhcigKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEV4dGVuc2lvbnNDbGVhcigKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RVdGlsTGl0ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkNjJjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjhkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlNTg4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dApAQCAtMCwwICsxLDEyOCBAQAorb3B0aW9uYWxfaW50MzI6IDEwMQorb3B0aW9uYWxfaW50NjQ6IDEwMgorb3B0aW9uYWxfdWludDMyOiAxMDMKK29wdGlvbmFsX3VpbnQ2NDogMTA0CitvcHRpb25hbF9zaW50MzI6IDEwNQorb3B0aW9uYWxfc2ludDY0OiAxMDYKK29wdGlvbmFsX2ZpeGVkMzI6IDEwNworb3B0aW9uYWxfZml4ZWQ2NDogMTA4CitvcHRpb25hbF9zZml4ZWQzMjogMTA5CitvcHRpb25hbF9zZml4ZWQ2NDogMTEwCitvcHRpb25hbF9mbG9hdDogMTExCitvcHRpb25hbF9kb3VibGU6IDExMgorb3B0aW9uYWxfYm9vbDogdHJ1ZQorb3B0aW9uYWxfc3RyaW5nOiAiMTE1Igorb3B0aW9uYWxfYnl0ZXM6ICIxMTYiCitPcHRpb25hbEdyb3VwIHsKKyAgYTogMTE3Cit9CitvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7CisgIGJiOiAxMTgKK30KK29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSB7CisgIGM6IDExOQorfQorb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgeworICBkOiAxMjAKK30KK29wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVoKK29wdGlvbmFsX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVoKK29wdGlvbmFsX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFaCitvcHRpb25hbF9zdHJpbmdfcGllY2U6ICIxMjQiCitvcHRpb25hbF9jb3JkOiAiMTI1Igorb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIHsKKyAgZTogMTI2Cit9CitvcHRpb25hbF9sYXp5X21lc3NhZ2UgeworICBiYjogMTI3Cit9CityZXBlYXRlZF9pbnQzMjogMjAxCityZXBlYXRlZF9pbnQzMjogMzAxCityZXBlYXRlZF9pbnQ2NDogMjAyCityZXBlYXRlZF9pbnQ2NDogMzAyCityZXBlYXRlZF91aW50MzI6IDIwMworcmVwZWF0ZWRfdWludDMyOiAzMDMKK3JlcGVhdGVkX3VpbnQ2NDogMjA0CityZXBlYXRlZF91aW50NjQ6IDMwNAorcmVwZWF0ZWRfc2ludDMyOiAyMDUKK3JlcGVhdGVkX3NpbnQzMjogMzA1CityZXBlYXRlZF9zaW50NjQ6IDIwNgorcmVwZWF0ZWRfc2ludDY0OiAzMDYKK3JlcGVhdGVkX2ZpeGVkMzI6IDIwNworcmVwZWF0ZWRfZml4ZWQzMjogMzA3CityZXBlYXRlZF9maXhlZDY0OiAyMDgKK3JlcGVhdGVkX2ZpeGVkNjQ6IDMwOAorcmVwZWF0ZWRfc2ZpeGVkMzI6IDIwOQorcmVwZWF0ZWRfc2ZpeGVkMzI6IDMwOQorcmVwZWF0ZWRfc2ZpeGVkNjQ6IDIxMAorcmVwZWF0ZWRfc2ZpeGVkNjQ6IDMxMAorcmVwZWF0ZWRfZmxvYXQ6IDIxMQorcmVwZWF0ZWRfZmxvYXQ6IDMxMQorcmVwZWF0ZWRfZG91YmxlOiAyMTIKK3JlcGVhdGVkX2RvdWJsZTogMzEyCityZXBlYXRlZF9ib29sOiB0cnVlCityZXBlYXRlZF9ib29sOiBmYWxzZQorcmVwZWF0ZWRfc3RyaW5nOiAiMjE1IgorcmVwZWF0ZWRfc3RyaW5nOiAiMzE1IgorcmVwZWF0ZWRfYnl0ZXM6ICIyMTYiCityZXBlYXRlZF9ieXRlczogIjMxNiIKK1JlcGVhdGVkR3JvdXAgeworICBhOiAyMTcKK30KK1JlcGVhdGVkR3JvdXAgeworICBhOiAzMTcKK30KK3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsKKyAgYmI6IDIxOAorfQorcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeworICBiYjogMzE4Cit9CityZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgeworICBjOiAyMTkKK30KK3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSB7CisgIGM6IDMxOQorfQorcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgeworICBkOiAyMjAKK30KK3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsKKyAgZDogMzIwCit9CityZXBlYXRlZF9uZXN0ZWRfZW51bTogQkFSCityZXBlYXRlZF9uZXN0ZWRfZW51bTogQkFaCityZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFSCityZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaCityZXBlYXRlZF9pbXBvcnRfZW51bTogSU1QT1JUX0JBUgorcmVwZWF0ZWRfaW1wb3J0X2VudW06IElNUE9SVF9CQVoKK3JlcGVhdGVkX3N0cmluZ19waWVjZTogIjIyNCIKK3JlcGVhdGVkX3N0cmluZ19waWVjZTogIjMyNCIKK3JlcGVhdGVkX2NvcmQ6ICIyMjUiCityZXBlYXRlZF9jb3JkOiAiMzI1IgorcmVwZWF0ZWRfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDIyNworfQorcmVwZWF0ZWRfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDMyNworfQorZGVmYXVsdF9pbnQzMjogNDAxCitkZWZhdWx0X2ludDY0OiA0MDIKK2RlZmF1bHRfdWludDMyOiA0MDMKK2RlZmF1bHRfdWludDY0OiA0MDQKK2RlZmF1bHRfc2ludDMyOiA0MDUKK2RlZmF1bHRfc2ludDY0OiA0MDYKK2RlZmF1bHRfZml4ZWQzMjogNDA3CitkZWZhdWx0X2ZpeGVkNjQ6IDQwOAorZGVmYXVsdF9zZml4ZWQzMjogNDA5CitkZWZhdWx0X3NmaXhlZDY0OiA0MTAKK2RlZmF1bHRfZmxvYXQ6IDQxMQorZGVmYXVsdF9kb3VibGU6IDQxMgorZGVmYXVsdF9ib29sOiBmYWxzZQorZGVmYXVsdF9zdHJpbmc6ICI0MTUiCitkZWZhdWx0X2J5dGVzOiAiNDE2IgorZGVmYXVsdF9uZXN0ZWRfZW51bTogRk9PCitkZWZhdWx0X2ZvcmVpZ25fZW51bTogRk9SRUlHTl9GT08KK2RlZmF1bHRfaW1wb3J0X2VudW06IElNUE9SVF9GT08KK2RlZmF1bHRfc3RyaW5nX3BpZWNlOiAiNDI0IgorZGVmYXVsdF9jb3JkOiAiNDI1IgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTIxN2YwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQKQEAgLTAsMCArMSwxMjggQEAKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dOiAxMDEKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQ2NF9leHRlbnNpb25dOiAxMDIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uXTogMTAzCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl06IDEwNAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25dOiAxMDUKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uXTogMTA2CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25dOiAxMDcKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl06IDEwOAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl06IDEwOQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl06IDExMAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl06IDExMQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25dOiAxMTIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9ib29sX2V4dGVuc2lvbl06IHRydWUKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uXTogIjExNSIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9ieXRlc19leHRlbnNpb25dOiAiMTE2IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uXSB7CisgIGE6IDExNworfQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0geworICBiYjogMTE4Cit9CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0geworICBjOiAxMTkKK30KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgZDogMTIwCit9CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFaCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFaCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBWgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiMTI0IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uXTogIjEyNSIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGU6IDEyNgorfQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDEyNworfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl06IDIwMQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl06IDMwMQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl06IDIwMgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl06IDMwMgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dOiAyMDMKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uXTogMzAzCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl06IDIwNAorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dOiAzMDQKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uXTogMjA1CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl06IDMwNQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dOiAyMDYKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uXTogMzA2CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25dOiAyMDcKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl06IDMwNworW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMjA4CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dOiAzMDgKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25dOiAyMDkKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25dOiAzMDkKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dOiAyMTAKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dOiAzMTAKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dOiAyMTEKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dOiAzMTEKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uXTogMjEyCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl06IDMxMgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uXTogdHJ1ZQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uXTogZmFsc2UKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXTogIjIxNSIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXTogIjMxNSIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dOiAiMjE2IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl06ICIzMTYiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRncm91cF9leHRlbnNpb25dIHsKKyAgYTogMjE3Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRncm91cF9leHRlbnNpb25dIHsKKyAgYTogMzE3Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGJiOiAyMTgKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDMxOAorfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYzogMjE5Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0geworICBjOiAzMTkKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgZDogMjIwCit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGQ6IDMyMAorfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEJBUgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEJBWgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0JBUgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0JBWgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9CQVIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfQkFaCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIyMjQiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIzMjQiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dOiAiMjI1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uXTogIjMyNSIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGJiOiAyMjcKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGJiOiAzMjcKK30KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ludDMyX2V4dGVuc2lvbl06IDQwMQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uXTogNDAyCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uXTogNDAzCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uXTogNDA0CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uXTogNDA1CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uXTogNDA2CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl06IDQwNworW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25dOiA0MDgKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl06IDQwOQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogNDEwCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9mbG9hdF9leHRlbnNpb25dOiA0MTEKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2RvdWJsZV9leHRlbnNpb25dOiA0MTIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uXTogZmFsc2UKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19leHRlbnNpb25dOiAiNDE1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uXTogIjQxNiIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEZPTworW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fRk9PCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfRk9PCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjQyNCIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXTogIjQyNSIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjQ3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCkBAIC0wLDAgKzEsMTc2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBlbXVsYXRlcyBnb29nbGUzL2ZpbGUvYmFzZS9maWxlLmNjCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gIC8vIHllYWgsIHJpZ2h0CisjaW5jbHVkZSA8d2luZG93cy5oPiAgICAgICAgIC8vIEZpbmQqRmlsZSgpLiAgOigKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBta2RpcihuYW1lLCBtb2RlKSBta2RpcihuYW1lKQorLy8gV2luZG93cyBkb2Vzbid0IGhhdmUgc3ltYm9saWMgbGlua3MuCisjZGVmaW5lIGxzdGF0IHN0YXQKKyNpZm5kZWYgRl9PSworI2RlZmluZSBGX09LIDAwICAvLyBub3QgZGVmaW5lZCBieSBNU1ZDIGZvciB3aGF0ZXZlciByZWFzb24KKyNlbmRpZgorI2VuZGlmCisKK2Jvb2wgRmlsZTo6RXhpc3RzKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICByZXR1cm4gYWNjZXNzKG5hbWUuY19zdHIoKSwgRl9PSykgPT0gMDsKK30KKworYm9vbCBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKGNvbnN0IHN0cmluZyYgbmFtZSwgc3RyaW5nKiBvdXRwdXQpIHsKKyAgY2hhciBidWZmZXJbMTAyNF07CisgIEZJTEUqIGZpbGUgPSBmb3BlbihuYW1lLmNfc3RyKCksICJyYiIpOworICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzaXplX3QgbiA9IGZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mKGJ1ZmZlciksIGZpbGUpOworICAgIGlmIChuIDw9IDApIGJyZWFrOworICAgIG91dHB1dC0+YXBwZW5kKGJ1ZmZlciwgbik7CisgIH0KKworICBpbnQgZXJyb3IgPSBmZXJyb3IoZmlsZSk7CisgIGlmIChmY2xvc2UoZmlsZSkgIT0gMCkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gZXJyb3IgPT0gMDsKK30KKwordm9pZCBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoY29uc3Qgc3RyaW5nJiBuYW1lLCBzdHJpbmcqIG91dHB1dCkgeworICBHT09HTEVfQ0hFQ0soUmVhZEZpbGVUb1N0cmluZyhuYW1lLCBvdXRwdXQpKSA8PCAiQ291bGQgbm90IHJlYWQ6ICIgPDwgbmFtZTsKK30KKwordm9pZCBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBGSUxFKiBmaWxlID0gZm9wZW4obmFtZS5jX3N0cigpLCAid2IiKTsKKyAgR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCkKKyAgICAgIDw8ICJmb3BlbigiIDw8IG5hbWUgPDwgIiwgXCJ3YlwiKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgIEdPT0dMRV9DSEVDS19FUShmd3JpdGUoY29udGVudHMuZGF0YSgpLCAxLCBjb250ZW50cy5zaXplKCksIGZpbGUpLAorICAgICAgICAgICAgICAgICAgY29udGVudHMuc2l6ZSgpKQorICAgICAgPDwgImZ3cml0ZSgiIDw8IG5hbWUgPDwgIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICBHT09HTEVfQ0hFQ0soZmNsb3NlKGZpbGUpID09IDApCisgICAgICA8PCAiZmNsb3NlKCIgPDwgbmFtZSA8PCAiKTogIiA8PCBzdHJlcnJvcihlcnJubyk7Cit9CisKK2Jvb2wgRmlsZTo6Q3JlYXRlRGlyKGNvbnN0IHN0cmluZyYgbmFtZSwgaW50IG1vZGUpIHsKKyAgcmV0dXJuIG1rZGlyKG5hbWUuY19zdHIoKSwgbW9kZSkgPT0gMDsKK30KKworYm9vbCBGaWxlOjpSZWN1cnNpdmVseUNyZWF0ZURpcihjb25zdCBzdHJpbmcmIHBhdGgsIGludCBtb2RlKSB7CisgIGlmIChDcmVhdGVEaXIocGF0aCwgbW9kZSkpIHJldHVybiB0cnVlOworCisgIGlmIChFeGlzdHMocGF0aCkpIHJldHVybiBmYWxzZTsKKworICAvLyBUcnkgY3JlYXRpbmcgdGhlIHBhcmVudC4KKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2hwb3MgPSBwYXRoLmZpbmRfbGFzdF9vZignLycpOworICBpZiAoc2xhc2hwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgLy8gTm8gcGFyZW50IGdpdmVuLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBSZWN1cnNpdmVseUNyZWF0ZURpcihwYXRoLnN1YnN0cigwLCBzbGFzaHBvcyksIG1vZGUpICYmCisgICAgICAgICBDcmVhdGVEaXIocGF0aCwgbW9kZSk7Cit9CisKK3ZvaWQgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkdW1teTEsIHZvaWQqIGR1bW15MikgeworICAvLyBXZSBkb24ndCBjYXJlIHRvbyBtdWNoIGFib3V0IGVycm9yIGNoZWNraW5nIGhlcmUgc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQKKyAgLy8gaW4gdGVzdHMgdG8gZGVsZXRlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyB0aGF0IGFyZSB1bmRlciAvdG1wIGFueXdheS4KKworI2lmZGVmIF9NU0NfVkVSCisgIC8vIFRoaXMgaW50ZXJmYWNlIGlzIHNvIHdlaXJkLgorICBXSU4zMl9GSU5EX0RBVEEgZmluZF9kYXRhOworICBIQU5ETEUgZmluZF9oYW5kbGUgPSBGaW5kRmlyc3RGaWxlKChuYW1lICsgIi8qIikuY19zdHIoKSwgJmZpbmRfZGF0YSk7CisgIGlmIChmaW5kX2hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIC8vIEp1c3QgZGVsZXRlIGl0LCB3aGF0ZXZlciBpdCBpcy4KKyAgICBEZWxldGVGaWxlKG5hbWUuY19zdHIoKSk7CisgICAgUmVtb3ZlRGlyZWN0b3J5KG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG8geworICAgIHN0cmluZyBlbnRyeV9uYW1lID0gZmluZF9kYXRhLmNGaWxlTmFtZTsKKyAgICBpZiAoZW50cnlfbmFtZSAhPSAiLiIgJiYgZW50cnlfbmFtZSAhPSAiLi4iKSB7CisgICAgICBzdHJpbmcgcGF0aCA9IG5hbWUgKyAiLyIgKyBlbnRyeV9uYW1lOworICAgICAgaWYgKGZpbmRfZGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgICAgIERlbGV0ZVJlY3Vyc2l2ZWx5KHBhdGgsIE5VTEwsIE5VTEwpOworICAgICAgICBSZW1vdmVEaXJlY3RvcnkocGF0aC5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlbGV0ZUZpbGUocGF0aC5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUoRmluZE5leHRGaWxlKGZpbmRfaGFuZGxlLCAmZmluZF9kYXRhKSk7CisgIEZpbmRDbG9zZShmaW5kX2hhbmRsZSk7CisKKyAgUmVtb3ZlRGlyZWN0b3J5KG5hbWUuY19zdHIoKSk7CisjZWxzZQorICAvLyBVc2Ugb3BlbmRpcigpISAgWWF5IQorICAvLyBsc3RhdCA9IERvbid0IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4KKyAgc3RydWN0IHN0YXQgc3RhdHM7CisgIGlmIChsc3RhdChuYW1lLmNfc3RyKCksICZzdGF0cykgIT0gMCkgcmV0dXJuOworCisgIGlmIChTX0lTRElSKHN0YXRzLnN0X21vZGUpKSB7CisgICAgRElSKiBkaXIgPSBvcGVuZGlyKG5hbWUuY19zdHIoKSk7CisgICAgaWYgKGRpciAhPSBOVUxMKSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeSA9IHJlYWRkaXIoZGlyKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwpIGJyZWFrOworICAgICAgICBzdHJpbmcgZW50cnlfbmFtZSA9IGVudHJ5LT5kX25hbWU7CisgICAgICAgIGlmIChlbnRyeV9uYW1lICE9ICIuIiAmJiBlbnRyeV9uYW1lICE9ICIuLiIpIHsKKyAgICAgICAgICBEZWxldGVSZWN1cnNpdmVseShuYW1lICsgIi8iICsgZW50cnlfbmFtZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjbG9zZWRpcihkaXIpOworICAgIHJtZGlyKG5hbWUuY19zdHIoKSk7CisKKyAgfSBlbHNlIGlmIChTX0lTUkVHKHN0YXRzLnN0X21vZGUpKSB7CisgICAgcmVtb3ZlKG5hbWUuY19zdHIoKSk7CisgIH0KKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmIxYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIGVtdWxhdGVzIGdvb2dsZTMvZmlsZS9iYXNlL2ZpbGUuaAorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9URVNUSU5HX0ZJTEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUSU5HX0ZJTEVfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY29uc3QgaW50IERFRkFVTFRfRklMRV9NT0RFID0gMDc3NzsKKworLy8gUHJvdG9jb2wgYnVmZmVyIGNvZGUgb25seSB1c2VzIGEgY291cGxlIHN0YXRpYyBtZXRob2RzIG9mIEZpbGUsIGFuZCBvbmx5CisvLyBpbiB0ZXN0cy4KK2NsYXNzIEZpbGUgeworIHB1YmxpYzoKKyAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzLgorICBzdGF0aWMgYm9vbCBFeGlzdHMoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZWFkIGFuIGVudGlyZSBmaWxlIHRvIGEgc3RyaW5nLiAgUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UKKyAgLy8gb3RoZXJ3aXNlLgorICBzdGF0aWMgYm9vbCBSZWFkRmlsZVRvU3RyaW5nKGNvbnN0IHN0cmluZyYgbmFtZSwgc3RyaW5nKiBvdXRwdXQpOworCisgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBjcmFzaCBvbiBmYWlsdXJlLgorICBzdGF0aWMgdm9pZCBSZWFkRmlsZVRvU3RyaW5nT3JEaWUoY29uc3Qgc3RyaW5nJiBuYW1lLCBzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gQ3JlYXRlIGEgZmlsZSBhbmQgd3JpdGUgYSBzdHJpbmcgdG8gaXQuCisgIHN0YXRpYyB2b2lkIFdyaXRlU3RyaW5nVG9GaWxlT3JEaWUoY29uc3Qgc3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgc3RhdGljIGJvb2wgQ3JlYXRlRGlyKGNvbnN0IHN0cmluZyYgbmFtZSwgaW50IG1vZGUpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBhbmQgYWxsIHBhcmVudCBkaXJlY3RvcmllcyBpZiBuZWNlc3NhcnkuCisgIHN0YXRpYyBib29sIFJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKGNvbnN0IHN0cmluZyYgcGF0aCwgaW50IG1vZGUpOworCisgIC8vIElmICJuYW1lIiBpcyBhIGZpbGUsIHdlIGRlbGV0ZSBpdC4gIElmIGl0IGlzIGEgZGlyZWN0b3J5LCB3ZQorICAvLyBjYWxsIERlbGV0ZVJlY3Vyc2l2ZWx5KCkgZm9yIGVhY2ggZmlsZSBvciBkaXJlY3RvcnkgKG90aGVyIHRoYW4KKyAgLy8gZG90IGFuZCBkb3VibGUtZG90KSB3aXRoaW4gaXQsIGFuZCB0aGVuIGRlbGV0ZSB0aGUgZGlyZWN0b3J5IGl0c2VsZi4KKyAgLy8gVGhlICJkdW1teSIgcGFyYW1ldGVycyBoYXZlIGEgbWVhbmluZyBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgIC8vIG1ldGhvZCBidXQgdGhleSBhcmUgbm90IHVzZWQgYW55d2hlcmUgaW4gcHJvdG9jb2wgYnVmZmVycy4KKyAgc3RhdGljIHZvaWQgRGVsZXRlUmVjdXJzaXZlbHkoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkdW1teTEsIHZvaWQqIGR1bW15Mik7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVTVElOR19GSUxFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkYTZiMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKQEAgLTAsMCArMSwyNTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIGVtdWxhdGVzIGdvb2dsZTMvdGVzdGluZy9iYXNlL3B1YmxpYy9nb29nbGV0ZXN0LmNjCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIG1rZGlyKG5hbWUsIG1vZGUpIG1rZGlyKG5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2lmZGVmIF9PX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyNlbHNlCisjZGVmaW5lIE9fQklOQVJZIDAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgbmVlZCBpdC4KKyNlbmRpZgorI2VuZGlmCisKK3N0cmluZyBUZXN0U291cmNlRGlyKCkgeworI2lmZGVmIF9NU0NfVkVSCisgIC8vIExvb2sgZm9yIHRoZSAic3JjIiBkaXJlY3RvcnkuCisgIHN0cmluZyBwcmVmaXggPSAiLiI7CisKKyAgd2hpbGUgKCFGaWxlOjpFeGlzdHMocHJlZml4ICsgIi9zcmMvZ29vZ2xlL3Byb3RvYnVmIikpIHsKKyAgICBpZiAoIUZpbGU6OkV4aXN0cyhwcmVmaXgpKSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKQorICAgICAgICA8PCAiQ291bGQgbm90IGZpbmQgcHJvdG9idWYgc291cmNlIGNvZGUuICBQbGVhc2UgcnVuIHRlc3RzIGZyb20gIgorICAgICAgICAgICAic29tZXdoZXJlIHdpdGhpbiB0aGUgcHJvdG9idWYgc291cmNlIHBhY2thZ2UuIjsKKyAgICB9CisgICAgcHJlZml4ICs9ICIvLi4iOworICB9CisgIHJldHVybiBwcmVmaXggKyAiL3NyYyI7CisjZWxzZQorICAvLyBhdXRvbWFrZSBzZXRzIHRoZSAic3JjZGlyIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgY2hhciogcmVzdWx0ID0gZ2V0ZW52KCJzcmNkaXIiKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdGVzdCBtdXN0IGJlIHJ1biBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgIHJldHVybiAiLiI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorI2VuZGlmCit9CisKK25hbWVzcGFjZSB7CisKK3N0cmluZyBHZXRUZW1wb3JhcnlEaXJlY3RvcnlOYW1lKCkgeworICAvLyB0bXBuYW0oKSBpcyBnZW5lcmFsbHkgbm90IGNvbnNpZGVyZWQgc2FmZSBidXQgd2UncmUgb25seSB1c2luZyBpdCBmb3IKKyAgLy8gdGVzdGluZy4gIFdlIGNhbm5vdCB1c2UgdG1wZmlsZSgpIG9yIG1rc3RlbXAoKSBzaW5jZSB3ZSdyZSBjcmVhdGluZyBhCisgIC8vIGRpcmVjdG9yeS4KKyAgY2hhciBiW0xfdG1wbmFtICsgMV07ICAgICAvLyBIUFVYIG11bHRpdGhyZWFkIHJldHVybiAwIGlmIHMgaXMgMAorICBzdHJpbmcgcmVzdWx0ID0gdG1wbmFtKGIpOworI2lmZGVmIF9XSU4zMgorICAvLyBPbiBXaW4zMiwgdG1wbmFtKCkgcmV0dXJucyBhIGZpbGUgcHJlZml4ZWQgd2l0aCAnXCcsIGJ1dCB3aGljaCBpcyBzdXBwb3NlZAorICAvLyB0byBiZSB1c2VkIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgV1RGPworICBpZiAoSGFzUHJlZml4U3RyaW5nKHJlc3VsdCwgIlxcIikpIHsKKyAgICByZXN1bHQuZXJhc2UoMCwgMSk7CisgIH0KKyNlbmRpZiAgLy8gX1dJTjMyCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IG9uIGRlbWFuZCBhbmQgZGVsZXRlcyBpdCB3aGVuIHRoZSBwcm9jZXNzCisvLyBxdWl0cy4KK2NsYXNzIFRlbXBEaXJEZWxldGVyIHsKKyBwdWJsaWM6CisgIFRlbXBEaXJEZWxldGVyKCkge30KKyAgflRlbXBEaXJEZWxldGVyKCkgeworICAgIGlmICghbmFtZV8uZW1wdHkoKSkgeworICAgICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkobmFtZV8sIE5VTEwsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHN0cmluZyBHZXRUZW1wRGlyKCkgeworICAgIGlmIChuYW1lXy5lbXB0eSgpKSB7CisgICAgICBuYW1lXyA9IEdldFRlbXBvcmFyeURpcmVjdG9yeU5hbWUoKTsKKyAgICAgIEdPT0dMRV9DSEVDSyhta2RpcihuYW1lXy5jX3N0cigpLCAwNzc3KSA9PSAwKSA8PCBzdHJlcnJvcihlcnJubyk7CisKKyAgICAgIC8vIFN0aWNrIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgdGVsbHMgcGVvcGxlIHdoYXQgdGhpcyBpcywgaW4gY2FzZQorICAgICAgLy8gd2UgYWJvcnQgYW5kIGRvbid0IGdldCBhIGNoYW5jZSB0byBkZWxldGUgaXQuCisgICAgICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKCIiLCBuYW1lXyArICIvVEVNUF9ESVJfRk9SX1BST1RPQlVGX1RFU1RTIik7CisgICAgfQorICAgIHJldHVybiBuYW1lXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RyaW5nIG5hbWVfOworfTsKKworVGVtcERpckRlbGV0ZXIgdGVtcF9kaXJfZGVsZXRlcl87CisKK30gIC8vIG5hbWVzcGFjZQorCitzdHJpbmcgVGVzdFRlbXBEaXIoKSB7CisgIHJldHVybiB0ZW1wX2Rpcl9kZWxldGVyXy5HZXRUZW1wRGlyKCk7Cit9CisKKy8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGR1cGxpY2F0ZWQgY29kZSBiZWxvdy4gIFRvbyBidXN5L2xhenkgZm9yIG5vdy4KKworc3RhdGljIHN0cmluZyBzdGRvdXRfY2FwdHVyZV9maWxlbmFtZV87CitzdGF0aWMgc3RyaW5nIHN0ZGVycl9jYXB0dXJlX2ZpbGVuYW1lXzsKK3N0YXRpYyBpbnQgb3JpZ2luYWxfc3Rkb3V0XyA9IC0xOworc3RhdGljIGludCBvcmlnaW5hbF9zdGRlcnJfID0gLTE7CisKK3ZvaWQgQ2FwdHVyZVRlc3RTdGRvdXQoKSB7CisgIEdPT0dMRV9DSEVDS19FUShvcmlnaW5hbF9zdGRvdXRfLCAtMSkgPDwgIkFscmVhZHkgY2FwdHVyaW5nLiI7CisKKyAgc3Rkb3V0X2NhcHR1cmVfZmlsZW5hbWVfID0gVGVzdFRlbXBEaXIoKSArICIvY2FwdHVyZWRfc3Rkb3V0IjsKKworICBpbnQgZmQgPSBvcGVuKHN0ZG91dF9jYXB0dXJlX2ZpbGVuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fQklOQVJZLCAwNzc3KTsKKyAgR09PR0xFX0NIRUNLKGZkID49IDApIDw8ICJvcGVuOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKworICBvcmlnaW5hbF9zdGRvdXRfID0gZHVwKDEpOworICBjbG9zZSgxKTsKKyAgZHVwMihmZCwgMSk7CisgIGNsb3NlKGZkKTsKK30KKwordm9pZCBDYXB0dXJlVGVzdFN0ZGVycigpIHsKKyAgR09PR0xFX0NIRUNLX0VRKG9yaWdpbmFsX3N0ZGVycl8sIC0xKSA8PCAiQWxyZWFkeSBjYXB0dXJpbmcuIjsKKworICBzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8gPSBUZXN0VGVtcERpcigpICsgIi9jYXB0dXJlZF9zdGRlcnIiOworCisgIGludCBmZCA9IG9wZW4oc3RkZXJyX2NhcHR1cmVfZmlsZW5hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19CSU5BUlksIDA3NzcpOworICBHT09HTEVfQ0hFQ0soZmQgPj0gMCkgPDwgIm9wZW46ICIgPDwgc3RyZXJyb3IoZXJybm8pOworCisgIG9yaWdpbmFsX3N0ZGVycl8gPSBkdXAoMik7CisgIGNsb3NlKDIpOworICBkdXAyKGZkLCAyKTsKKyAgY2xvc2UoZmQpOworfQorCitzdHJpbmcgR2V0Q2FwdHVyZWRUZXN0U3Rkb3V0KCkgeworICBHT09HTEVfQ0hFQ0tfTkUob3JpZ2luYWxfc3Rkb3V0XywgLTEpIDw8ICJOb3QgY2FwdHVyaW5nLiI7CisKKyAgY2xvc2UoMSk7CisgIGR1cDIob3JpZ2luYWxfc3Rkb3V0XywgMSk7CisgIG9yaWdpbmFsX3N0ZG91dF8gPSAtMTsKKworICBzdHJpbmcgcmVzdWx0OworICBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoc3Rkb3V0X2NhcHR1cmVfZmlsZW5hbWVfLCAmcmVzdWx0KTsKKworICByZW1vdmUoc3Rkb3V0X2NhcHR1cmVfZmlsZW5hbWVfLmNfc3RyKCkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyBHZXRDYXB0dXJlZFRlc3RTdGRlcnIoKSB7CisgIEdPT0dMRV9DSEVDS19ORShvcmlnaW5hbF9zdGRlcnJfLCAtMSkgPDwgIk5vdCBjYXB0dXJpbmcuIjsKKworICBjbG9zZSgyKTsKKyAgZHVwMihvcmlnaW5hbF9zdGRlcnJfLCAyKTsKKyAgb3JpZ2luYWxfc3RkZXJyXyA9IC0xOworCisgIHN0cmluZyByZXN1bHQ7CisgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZShzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8sICZyZXN1bHQpOworCisgIHJlbW92ZShzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8uY19zdHIoKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU2NvcGVkTWVtb3J5TG9nKiBTY29wZWRNZW1vcnlMb2c6OmFjdGl2ZV9sb2dfID0gTlVMTDsKKworU2NvcGVkTWVtb3J5TG9nOjpTY29wZWRNZW1vcnlMb2coKSB7CisgIEdPT0dMRV9DSEVDSyhhY3RpdmVfbG9nXyA9PSBOVUxMKTsKKyAgYWN0aXZlX2xvZ18gPSB0aGlzOworICBvbGRfaGFuZGxlcl8gPSBTZXRMb2dIYW5kbGVyKCZIYW5kbGVMb2cpOworfQorCitTY29wZWRNZW1vcnlMb2c6On5TY29wZWRNZW1vcnlMb2coKSB7CisgIFNldExvZ0hhbmRsZXIob2xkX2hhbmRsZXJfKTsKKyAgYWN0aXZlX2xvZ18gPSBOVUxMOworfQorCitjb25zdCB2ZWN0b3I8c3RyaW5nPiYgU2NvcGVkTWVtb3J5TG9nOjpHZXRNZXNzYWdlcyhMb2dMZXZlbCBsZXZlbCkgeworICBHT09HTEVfQ0hFQ0sobGV2ZWwgPT0gRVJST1IgfHwKKyAgICAgICAgICAgICAgIGxldmVsID09IFdBUk5JTkcpOworICByZXR1cm4gbWVzc2FnZXNfW2xldmVsXTsKK30KKwordm9pZCBTY29wZWRNZW1vcnlMb2c6OkhhbmRsZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0NIRUNLKGFjdGl2ZV9sb2dfICE9IE5VTEwpOworICBpZiAobGV2ZWwgPT0gRVJST1IgfHwgbGV2ZWwgPT0gV0FSTklORykgeworICAgIGFjdGl2ZV9sb2dfLT5tZXNzYWdlc19bbGV2ZWxdLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCisvLyBGb3JjZSBzaHV0ZG93biBhdCBwcm9jZXNzIGV4aXQgc28gdGhhdCB3ZSBjYW4gdGVzdCBmb3IgbWVtb3J5IGxlYWtzLiAgVG8KKy8vIGFjdHVhbGx5IGNoZWNrIGZvciBsZWFrcywgSSBzdWdnZXN0IHVzaW5nIHRoZSBoZWFwIGNoZWNrZXIgaW5jbHVkZWQgd2l0aAorLy8gZ29vZ2xlLXBlcmZ0b29scy4gIFNldCBpdCB0byAiZHJhY29uaWFuIiBtb2RlIHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IGxhc3QKKy8vIGNhbGwgdG8gbWFsbG9jKCkgaGFzIGEgY29ycmVzcG9uZGluZyBmcmVlKCkuCitzdHJ1Y3QgRm9yY2VTaHV0ZG93biB7CisgIH5Gb3JjZVNodXRkb3duKCkgeworICAgIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCk7CisgIH0KK30gZm9yY2Vfc2h1dGRvd247CisKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDNiZTEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oCkBAIC0wLDAgKzEsMTAyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBlbXVsYXRlcyBnb29nbGUzL3Rlc3RpbmcvYmFzZS9wdWJsaWMvZ29vZ2xldGVzdC5oCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0dPT0dMRVRFU1RfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9HT09HTEVURVNUX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKy8vIERpc2FibGUgZGVhdGggdGVzdHMgaWYgd2UgdXNlIGV4Y2VwdGlvbnMgaW4gQ0hFQ0soKS4KKyNpZiAhUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMgJiYgZGVmaW5lZChHVEVTVF9IQVNfREVBVEhfVEVTVCkKKyNkZWZpbmUgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIFdoZW4gcnVubmluZyB1bml0dGVzdHMsIGdldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLgorc3RyaW5nIFRlc3RTb3VyY2VEaXIoKTsKKworLy8gV2hlbiBydW5uaW5nIHVuaXR0ZXN0cywgZ2V0IGEgZGlyZWN0b3J5IHdoZXJlIHRlbXBvcmFyeSBmaWxlcyBtYXkgYmUKKy8vIHBsYWNlZC4KK3N0cmluZyBUZXN0VGVtcERpcigpOworCisvLyBDYXB0dXJlIGFsbCB0ZXh0IHdyaXR0ZW4gdG8gc3Rkb3V0IG9yIHN0ZGVyci4KK3ZvaWQgQ2FwdHVyZVRlc3RTdGRvdXQoKTsKK3ZvaWQgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKKworLy8gU3RvcCBjYXB0dXJpbmcgc3Rkb3V0IG9yIHN0ZGVyciBhbmQgcmV0dXJuIHRoZSB0ZXh0IGNhcHR1cmVkLgorc3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZG91dCgpOworc3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworCisvLyBGb3IgdXNlIHdpdGggU2NvcGVkTWVtb3J5TG9nOjpHZXRNZXNzYWdlcygpLiAgSW5zaWRlIEdvb2dsZSB0aGUgTG9nTGV2ZWwKKy8vIGNvbnN0YW50cyBkb24ndCBoYXZlIHRoZSBMT0dMRVZFTF8gcHJlZml4LCBzbyB0aGUgY29kZSB0aGF0IHVzZWQKKy8vIFNjb3BlZE1lbW9yeUxvZyByZWZlcnMgdG8gTE9HTEVWRUxfRVJST1IgYXMganVzdCBFUlJPUi4KKyN1bmRlZiBFUlJPUiAgLy8gZGVmZW5kIGFnYWluc3QgcHJvbWlzY3VvdXMgd2luZG93cy5oCitzdGF0aWMgY29uc3QgTG9nTGV2ZWwgRVJST1IgPSBMT0dMRVZFTF9FUlJPUjsKK3N0YXRpYyBjb25zdCBMb2dMZXZlbCBXQVJOSU5HID0gTE9HTEVWRUxfV0FSTklORzsKKworLy8gUmVjZWl2ZXMgY29waWVzIG9mIGFsbCBMT0coRVJST1IpIG1lc3NhZ2VzIHdoaWxlIGluIHNjb3BlLiAgU2FtcGxlIHVzYWdlOgorLy8gICB7CisvLyAgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsgIC8vIGNvbnN0cnVjdG9yIHJlZ2lzdGVycyBvYmplY3QgYXMgYSBsb2cgc2luaworLy8gICAgIFNvbWVSb3V0aW5lVGhhdE1heUxvZ01lc3NhZ2VzKCk7CisvLyAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHdhcm5pbmdzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKy8vICAgfSAgLy8gZGVzdHJ1Y3RvciB1bnJlZ2lzdGVycyBvYmplY3QgYXMgYSBsb2cgc2luaworLy8gVGhpcyBpcyBhIGR1bW15IGltcGxlbWVudGF0aW9uIHdoaWNoIGNvdmVycyBvbmx5IHdoYXQgaXMgdXNlZCBieSBwcm90b2NvbAorLy8gYnVmZmVyIHVuaXQgdGVzdHMuCitjbGFzcyBTY29wZWRNZW1vcnlMb2cgeworIHB1YmxpYzoKKyAgU2NvcGVkTWVtb3J5TG9nKCk7CisgIHZpcnR1YWwgflNjb3BlZE1lbW9yeUxvZygpOworCisgIC8vIEZldGNoZXMgYWxsIG1lc3NhZ2VzIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGxldmVsLgorICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgR2V0TWVzc2FnZXMoTG9nTGV2ZWwgZXJyb3IpOworCisgcHJpdmF0ZToKKyAgbWFwPExvZ0xldmVsLCB2ZWN0b3I8c3RyaW5nPiA+IG1lc3NhZ2VzXzsKKyAgTG9nSGFuZGxlciogb2xkX2hhbmRsZXJfOworCisgIHN0YXRpYyB2b2lkIEhhbmRsZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKKworICBzdGF0aWMgU2NvcGVkTWVtb3J5TG9nKiBhY3RpdmVfbG9nXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2NvcGVkTWVtb3J5TG9nKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9HT09HTEVURVNUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjE5Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MKQEAgLTAsMCArMSw3MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGVzdCBwcm9ncmFtIHRvIHZlcmlmeSB0aGF0IEd6aXBJbnB1dFN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggY29tbWFuZCBsaW5lCisvLyBndW56aXAgb3IgamF2YS51dGlsLnppcC5HemlwSW5wdXRTdHJlYW0KKy8vCisvLyBSZWFkcyBnemlwIHN0cmVhbSBvbiBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIGRlY29tcHJlc3NlZCBkYXRhIHRvIHN0YW5kYXJkCisvLyBvdXRwdXQuCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkZpbGVJbnB1dFN0cmVhbTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpHemlwSW5wdXRTdHJlYW07CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiogYXJndikgeworICBGaWxlSW5wdXRTdHJlYW0gZmluKFNURElOX0ZJTEVOTyk7CisgIEd6aXBJbnB1dFN0cmVhbSBpbigmZmluKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IHZvaWQqIGlucHRyOworICAgIGludCBpbmxlbjsKKyAgICBib29sIG9rOworICAgIG9rID0gaW4uTmV4dCgmaW5wdHIsICZpbmxlbik7CisgICAgaWYgKCFvaykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbmxlbiA+IDApIHsKKyAgICAgIGludCBlcnIgPSB3cml0ZShTVERPVVRfRklMRU5PLCBpbnB0ciwgaW5sZW4pOworICAgICAgYXNzZXJ0KGVyciA9PSBpbmxlbik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzMzI3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYwpAQCAtMCwwICsxLDc5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGJyaWFub2xzb25AZ29vZ2xlLmNvbSAoQnJpYW4gT2xzb24pCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUZXN0IHByb2dyYW0gdG8gdmVyaWZ5IHRoYXQgR3ppcE91dHB1dFN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggY29tbWFuZCBsaW5lCisvLyBnemlwIG9yIGphdmEudXRpbC56aXAuR3ppcE91dHB1dFN0cmVhbQorLy8KKy8vIFJlYWRzIGRhdGEgb24gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyBjb21wcmVzc2VkIGd6aXAgc3RyZWFtIHRvIHN0YW5kYXJkCisvLyBvdXRwdXQuCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkZpbGVPdXRwdXRTdHJlYW07Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6R3ppcE91dHB1dFN0cmVhbTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KSB7CisgIEZpbGVPdXRwdXRTdHJlYW0gZm91dChTVERPVVRfRklMRU5PKTsKKyAgR3ppcE91dHB1dFN0cmVhbSBvdXQoJmZvdXQpOworICBpbnQgcmVhZGxlbjsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIHZvaWQqIG91dHB0cjsKKyAgICBpbnQgb3V0bGVuOworICAgIGJvb2wgb2s7CisgICAgZG8geworICAgICAgb2sgPSBvdXQuTmV4dCgmb3V0cHRyLCAmb3V0bGVuKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSB3aGlsZSAob3V0bGVuIDw9IDApOworICAgIHJlYWRsZW4gPSByZWFkKFNURElOX0ZJTEVOTywgb3V0cHRyLCBvdXRsZW4pOworICAgIGlmIChyZWFkbGVuIDw9IDApIHsKKyAgICAgIG91dC5CYWNrVXAob3V0bGVuKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocmVhZGxlbiA8IG91dGxlbikgeworICAgICAgb3V0LkJhY2tVcChvdXRsZW4gLSByZWFkbGVuKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJiOTllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjCkBAIC0wLDAgKzEsMTUyMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqc2Nob3JyQGdvb2dsZS5jb20gKEpvc2VwaCBTY2hvcnIpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitzdHJpbmcgTWVzc2FnZTo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBkZWJ1Z19zdHJpbmc7CisKKyAgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZygqdGhpcywgJmRlYnVnX3N0cmluZyk7CisKKyAgcmV0dXJuIGRlYnVnX3N0cmluZzsKK30KKworc3RyaW5nIE1lc3NhZ2U6OlNob3J0RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBkZWJ1Z19zdHJpbmc7CisKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlNldFNpbmdsZUxpbmVNb2RlKHRydWUpOworCisgIHByaW50ZXIuUHJpbnRUb1N0cmluZygqdGhpcywgJmRlYnVnX3N0cmluZyk7CisgIC8vIFNpbmdsZSBsaW5lIG1vZGUgY3VycmVudGx5IG1pZ2h0IGhhdmUgYW4gZXh0cmEgc3BhY2UgYXQgdGhlIGVuZC4KKyAgaWYgKGRlYnVnX3N0cmluZy5zaXplKCkgPiAwICYmCisgICAgICBkZWJ1Z19zdHJpbmdbZGVidWdfc3RyaW5nLnNpemUoKSAtIDFdID09ICcgJykgeworICAgIGRlYnVnX3N0cmluZy5yZXNpemUoZGVidWdfc3RyaW5nLnNpemUoKSAtIDEpOworICB9CisKKyAgcmV0dXJuIGRlYnVnX3N0cmluZzsKK30KKworc3RyaW5nIE1lc3NhZ2U6OlV0ZjhEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgc3RyaW5nIGRlYnVnX3N0cmluZzsKKworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuU2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKHRydWUpOworCisgIHByaW50ZXIuUHJpbnRUb1N0cmluZygqdGhpcywgJmRlYnVnX3N0cmluZyk7CisKKyAgcmV0dXJuIGRlYnVnX3N0cmluZzsKK30KKwordm9pZCBNZXNzYWdlOjpQcmludERlYnVnU3RyaW5nKCkgY29uc3QgeworICBwcmludGYoIiVzIiwgRGVidWdTdHJpbmcoKS5jX3N0cigpKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwYXJzZSBpbmZvcm1hdGlvbiB0cmVlIGNsYXNzLgorVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZTo6UGFyc2VJbmZvVHJlZSgpIHsgfQorCitUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjp+UGFyc2VJbmZvVHJlZSgpIHsKKyAgLy8gUmVtb3ZlIGFueSBuZXN0ZWQgaW5mb3JtYXRpb24gdHJlZXMsIGFzIHRoZXkgYXJlIG93bmVkIGJ5IHRoaXMgdHJlZS4KKyAgZm9yIChOZXN0ZWRNYXA6Oml0ZXJhdG9yIGl0ID0gbmVzdGVkXy5iZWdpbigpOyBpdCAhPSBuZXN0ZWRfLmVuZCgpOyArK2l0KSB7CisgICAgU1RMRGVsZXRlRWxlbWVudHMoJihpdC0+c2Vjb25kKSk7CisgIH0KK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpSZWNvcmRMb2NhdGlvbigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgbG9jYXRpb25zX1tmaWVsZF0ucHVzaF9iYWNrKGxvY2F0aW9uKTsKK30KKworVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZTo6Q3JlYXRlTmVzdGVkKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gT3duZWQgYnkgdXMgaW4gdGhlIG1hcC4KKyAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogaW5zdGFuY2UgPSBuZXcgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSgpOworICB2ZWN0b3I8VGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSo+KiB0cmVlcyA9ICZuZXN0ZWRfW2ZpZWxkXTsKKyAgR09PR0xFX0NIRUNLKHRyZWVzKTsKKyAgdHJlZXMtPnB1c2hfYmFjayhpbnN0YW5jZSk7CisgIHJldHVybiBpbnN0YW5jZTsKK30KKwordm9pZCBDaGVja0ZpZWxkSW5kZXgoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSB7CisgIGlmIChmaWVsZCA9PSBOVUxMKSB7IHJldHVybjsgfQorCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBpbmRleCA9PSAtMSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiSW5kZXggbXVzdCBiZSBpbiByYW5nZSBvZiByZXBlYXRlZCBmaWVsZCB2YWx1ZXMuICIKKyAgICAgICAgICAgICAgICA8PCAiRmllbGQ6ICIgPDwgZmllbGQtPm5hbWUoKTsKKyAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgaW5kZXggIT0gLTEpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIHNpbmd1bGFyIGZpZWxkcy4iCisgICAgICAgICAgICAgICAgPDwgIkZpZWxkOiAiIDw8IGZpZWxkLT5uYW1lKCk7CisgIH0KK30KKworVGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvbiBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpHZXRMb2NhdGlvbigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgQ2hlY2tGaWVsZEluZGV4KGZpZWxkLCBpbmRleCk7CisgIGlmIChpbmRleCA9PSAtMSkgeyBpbmRleCA9IDA7IH0KKworICBjb25zdCB2ZWN0b3I8VGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvbj4qIGxvY2F0aW9ucyA9CisgICAgICBGaW5kT3JOdWxsKGxvY2F0aW9uc18sIGZpZWxkKTsKKyAgaWYgKGxvY2F0aW9ucyA9PSBOVUxMIHx8IGluZGV4ID49IGxvY2F0aW9ucy0+c2l6ZSgpKSB7CisgICAgcmV0dXJuIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb24oKTsKKyAgfQorCisgIHJldHVybiAoKmxvY2F0aW9ucylbaW5kZXhdOworfQorCitUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKiBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpHZXRUcmVlRm9yTmVzdGVkKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICBDaGVja0ZpZWxkSW5kZXgoZmllbGQsIGluZGV4KTsKKyAgaWYgKGluZGV4ID09IC0xKSB7IGluZGV4ID0gMDsgfQorCisgIGNvbnN0IHZlY3RvcjxUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKj4qIHRyZWVzID0gRmluZE9yTnVsbChuZXN0ZWRfLCBmaWVsZCk7CisgIGlmICh0cmVlcyA9PSBOVUxMIHx8IGluZGV4ID49IHRyZWVzLT5zaXplKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiAoKnRyZWVzKVtpbmRleF07Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBjbGFzcyBmb3IgcGFyc2luZyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBhIFByb3RvY29sIE1lc3NhZ2UuCisvLyBUaGlzIGNsYXNzIG1ha2VzIHVzZSBvZiB0aGUgUHJvdG9jb2wgTWVzc2FnZSBjb21waWxlcidzIHRva2VuaXplciBmb3VuZAorLy8gaW4gLy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmguIE5vdGUgdGhhdCBjbGFzcydzIFBhcnNlCisvLyBtZXRob2QgaXMgKm5vdCogdGhyZWFkLXNhZmUgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gYSBzaW5nbGUgdGhyZWFkIGF0CisvLyBhIHRpbWUuCisKKy8vIE1ha2VzIGNvZGUgc2xpZ2h0bHkgbW9yZSByZWFkYWJsZS4gIFRoZSBtZWFuaW5nIG9mICJETyhmb28pIiBpcworLy8gIkV4ZWN1dGUgZm9vIGFuZCBmYWlsIGlmIGl0IGZhaWxzLiIsIHdoZXJlIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5CisvLyByZXR1cm5pbmcgZmFsc2UuIEJvcnJvd2VkIGZyb20gcGFyc2VyLmNjIChUaGFua3MgS2VudG9uISkuCisjZGVmaW5lIERPKFNUQVRFTUVOVCkgaWYgKFNUQVRFTUVOVCkge30gZWxzZSByZXR1cm4gZmFsc2UKKworY2xhc3MgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsIHsKKyBwdWJsaWM6CisKKyAgLy8gRGV0ZXJtaW5lcyBpZiByZXBlYXRlZCB2YWx1ZXMgZm9yIGEgbm9uLXJlcGVhdGVkIGZpZWxkIGFyZQorICAvLyBwZXJtaXR0ZWQsIGUuZy4sIHRoZSBzdHJpbmcgImZvbzogMSBmb286IDIiIGZvciBhCisgIC8vIHJlcXVpcmVkL29wdGlvbmFsIGZpZWxkIG5hbWVkICJmb28iLgorICBlbnVtIFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IHsKKyAgICBBTExPV19TSU5HVUxBUl9PVkVSV1JJVEVTID0gMCwgICAvLyB0aGUgbGFzdCB2YWx1ZSBpcyByZXRhaW5lZAorICAgIEZPUkJJRF9TSU5HVUxBUl9PVkVSV1JJVEVTID0gMSwgIC8vIGFuIGVycm9yIGlzIGlzc3VlZAorICB9OworCisgIFBhcnNlckltcGwoY29uc3QgRGVzY3JpcHRvciogcm9vdF9tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0X3N0cmVhbSwKKyAgICAgICAgICAgICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvciwKKyAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpGaW5kZXIqIGZpbmRlciwKKyAgICAgICAgICAgICBQYXJzZUluZm9UcmVlKiBwYXJzZV9pbmZvX3RyZWUsCisgICAgICAgICAgICAgU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeSwKKyAgICAgICAgICAgICBib29sIGFsbG93X3Vua25vd25fZmllbGQpCisgICAgOiBlcnJvcl9jb2xsZWN0b3JfKGVycm9yX2NvbGxlY3RvciksCisgICAgICBmaW5kZXJfKGZpbmRlciksCisgICAgICBwYXJzZV9pbmZvX3RyZWVfKHBhcnNlX2luZm9fdHJlZSksCisgICAgICB0b2tlbml6ZXJfZXJyb3JfY29sbGVjdG9yXyh0aGlzKSwKKyAgICAgIHRva2VuaXplcl8oaW5wdXRfc3RyZWFtLCAmdG9rZW5pemVyX2Vycm9yX2NvbGxlY3Rvcl8pLAorICAgICAgcm9vdF9tZXNzYWdlX3R5cGVfKHJvb3RfbWVzc2FnZV90eXBlKSwKKyAgICAgIHNpbmd1bGFyX292ZXJ3cml0ZV9wb2xpY3lfKHNpbmd1bGFyX292ZXJ3cml0ZV9wb2xpY3kpLAorICAgICAgYWxsb3dfdW5rbm93bl9maWVsZF8oYWxsb3dfdW5rbm93bl9maWVsZCksCisgICAgICBoYWRfZXJyb3JzXyhmYWxzZSkgeworICAgIC8vIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHByb3RvMSwgd2UgbmVlZCB0byBhbGxvdyB0aGUgJ2YnIHN1ZmZpeAorICAgIC8vIGZvciBmbG9hdHMuCisgICAgdG9rZW5pemVyXy5zZXRfYWxsb3dfZl9hZnRlcl9mbG9hdCh0cnVlKTsKKworICAgIC8vICcjJyBzdGFydHMgYSBjb21tZW50LgorICAgIHRva2VuaXplcl8uc2V0X2NvbW1lbnRfc3R5bGUoaW86OlRva2VuaXplcjo6U0hfQ09NTUVOVF9TVFlMRSk7CisKKyAgICAvLyBDb25zdW1lIHRoZSBzdGFydGluZyB0b2tlbi4KKyAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgfQorICB+UGFyc2VySW1wbCgpIHsgfQorCisgIC8vIFBhcnNlcyB0aGUgQVNDSUkgcmVwcmVzZW50YXRpb24gc3BlY2lmaWVkIGluIGlucHV0IGFuZCBzYXZlcyB0aGUKKyAgLy8gaW5mb3JtYXRpb24gaW50byB0aGUgb3V0cHV0IHBvaW50ZXIgKGEgTWVzc2FnZSkuIFJldHVybnMKKyAgLy8gZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJzIChhbiBlcnJvciB3aWxsIGFsc28gYmUgbG9nZ2VkIHRvCisgIC8vIEdPT0dMRV9MT0coRVJST1IpKS4KKyAgYm9vbCBQYXJzZShNZXNzYWdlKiBvdXRwdXQpIHsKKyAgICAvLyBDb25zdW1lIGZpZWxkcyB1bnRpbCB3ZSBjYW5ub3QgZG8gc28gYW55bW9yZS4KKyAgICB3aGlsZSh0cnVlKSB7CisgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCkpIHsKKyAgICAgICAgcmV0dXJuICFoYWRfZXJyb3JzXzsKKyAgICAgIH0KKworICAgICAgRE8oQ29uc3VtZUZpZWxkKG91dHB1dCkpOworICAgIH0KKyAgfQorCisgIGJvb2wgUGFyc2VGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgICBib29sIHN1YzsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIHN1YyA9IENvbnN1bWVGaWVsZE1lc3NhZ2Uob3V0cHV0LCBvdXRwdXQtPkdldFJlZmxlY3Rpb24oKSwgZmllbGQpOworICAgIH0gZWxzZSB7CisgICAgICBzdWMgPSBDb25zdW1lRmllbGRWYWx1ZShvdXRwdXQsIG91dHB1dC0+R2V0UmVmbGVjdGlvbigpLCBmaWVsZCk7CisgICAgfQorICAgIHJldHVybiBzdWMgJiYgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCk7CisgIH0KKworICB2b2lkIFJlcG9ydEVycm9yKGludCBsaW5lLCBpbnQgY29sLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBoYWRfZXJyb3JzXyA9IHRydWU7CisgICAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gPT0gTlVMTCkgeworICAgICAgaWYgKGxpbmUgPj0gMCkgeworICAgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXJyb3IgcGFyc2luZyB0ZXh0LWZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgPDwgcm9vdF9tZXNzYWdlX3R5cGVfLT5mdWxsX25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgKGxpbmUgKyAxKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgICA8PCAoY29sICsgMSkgPDwgIjogIiA8PCBtZXNzYWdlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkVycm9yIHBhcnNpbmcgdGV4dC1mb3JtYXQgIgorICAgICAgICAgICAgICAgICAgIDw8IHJvb3RfbWVzc2FnZV90eXBlXy0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IG1lc3NhZ2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmUsIGNvbCwgbWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgdm9pZCBSZXBvcnRXYXJuaW5nKGludCBsaW5lLCBpbnQgY29sLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBpZiAoZXJyb3JfY29sbGVjdG9yXyA9PSBOVUxMKSB7CisgICAgICBpZiAobGluZSA+PSAwKSB7CisgICAgICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIldhcm5pbmcgcGFyc2luZyB0ZXh0LWZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByb290X21lc3NhZ2VfdHlwZV8tPmZ1bGxfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IChsaW5lICsgMSkgPDwgIjoiCisgICAgICAgICAgICAgICAgICAgICA8PCAoY29sICsgMSkgPDwgIjogIiA8PCBtZXNzYWdlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiV2FybmluZyBwYXJzaW5nIHRleHQtZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJvb3RfbWVzc2FnZV90eXBlXy0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgbWVzc2FnZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkV2FybmluZyhsaW5lLCBjb2wsIG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlckltcGwpOworCisgIC8vIFJlcG9ydHMgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoIGluZm9ybWF0aW9uIGluZGljYXRpbmcKKyAgLy8gdGhlIHBvc2l0aW9uIChhcyBkZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQgdG9rZW4pLgorICB2b2lkIFJlcG9ydEVycm9yKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIFJlcG9ydEVycm9yKHRva2VuaXplcl8uY3VycmVudCgpLmxpbmUsIHRva2VuaXplcl8uY3VycmVudCgpLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgfQorCisgIC8vIFJlcG9ydHMgYSB3YXJuaW5nIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2Ugd2l0aCBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nCisgIC8vIHRoZSBwb3NpdGlvbiAoYXMgZGVyaXZlZCBmcm9tIHRoZSBjdXJyZW50IHRva2VuKS4KKyAgdm9pZCBSZXBvcnRXYXJuaW5nKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIFJlcG9ydFdhcm5pbmcodG9rZW5pemVyXy5jdXJyZW50KCkubGluZSwgdG9rZW5pemVyXy5jdXJyZW50KCkuY29sdW1uLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgIH0KKworICAvLyBDb25zdW1lcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gc3RhcnRpbmcgZGVsaW1ldGVyLgorICAvLyBUaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIHRoYXQgdGhlIGVuZCBkZWxpbWV0ZXIgYXQgdGhlIGNvbmNsdXNpb24gb2YKKyAgLy8gdGhlIGNvbnN1bXB0aW9uIG1hdGNoZXMgdGhlIHN0YXJ0aW5nIGRlbGltZXRlciBwYXNzZWQgaW4gaGVyZS4KKyAgYm9vbCBDb25zdW1lTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBzdHJpbmcgZGVsaW1ldGVyKSB7CisgICAgd2hpbGUgKCFMb29raW5nQXQoIj4iKSAmJiAgIUxvb2tpbmdBdCgifSIpKSB7CisgICAgICBETyhDb25zdW1lRmllbGQobWVzc2FnZSkpOworICAgIH0KKworICAgIC8vIENvbmZpcm0gdGhhdCB3ZSBoYXZlIGEgdmFsaWQgZW5kaW5nIGRlbGltZXRlci4KKyAgICBETyhDb25zdW1lKGRlbGltZXRlcikpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDb25zdW1lcyB0aGUgY3VycmVudCBmaWVsZCAoYXMgcmV0dXJuZWQgYnkgdGhlIHRva2VuaXplcikgb24gdGhlCisgIC8vIHBhc3NlZCBpbiBtZXNzYWdlLgorICBib29sIENvbnN1bWVGaWVsZChNZXNzYWdlKiBtZXNzYWdlKSB7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworCisgICAgc3RyaW5nIGZpZWxkX25hbWU7CisKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gTlVMTDsKKyAgICBpbnQgc3RhcnRfbGluZSA9IHRva2VuaXplcl8uY3VycmVudCgpLmxpbmU7CisgICAgaW50IHN0YXJ0X2NvbHVtbiA9IHRva2VuaXplcl8uY3VycmVudCgpLmNvbHVtbjsKKworICAgIGlmIChUcnlDb25zdW1lKCJbIikpIHsKKyAgICAgIC8vIEV4dGVuc2lvbi4KKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZmaWVsZF9uYW1lKSk7CisgICAgICB3aGlsZSAoVHJ5Q29uc3VtZSgiLiIpKSB7CisgICAgICAgIHN0cmluZyBwYXJ0OworICAgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmcGFydCkpOworICAgICAgICBmaWVsZF9uYW1lICs9ICIuIjsKKyAgICAgICAgZmllbGRfbmFtZSArPSBwYXJ0OworICAgICAgfQorICAgICAgRE8oQ29uc3VtZSgiXSIpKTsKKworICAgICAgZmllbGQgPSAoZmluZGVyXyAhPSBOVUxMCisgICAgICAgICAgICAgICA/IGZpbmRlcl8tPkZpbmRFeHRlbnNpb24obWVzc2FnZSwgZmllbGRfbmFtZSkKKyAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGZpZWxkX25hbWUpKTsKKworICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFhbGxvd191bmtub3duX2ZpZWxkXykgeworICAgICAgICAgIFJlcG9ydEVycm9yKCJFeHRlbnNpb24gXCIiICsgZmllbGRfbmFtZSArICJcIiBpcyBub3QgZGVmaW5lZCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbiBleHRlbnNpb24gb2YgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUmVwb3J0V2FybmluZygiRXh0ZW5zaW9uIFwiIiArIGZpZWxkX25hbWUgKyAiXCIgaXMgbm90IGRlZmluZWQgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbiBleHRlbnNpb24gb2YgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZmaWVsZF9uYW1lKSk7CisKKyAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX25hbWUpOworICAgICAgLy8gR3JvdXAgbmFtZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGNhcGl0YWxpemVkIGFzIHRoZXkgYXBwZWFyIGluIHRoZQorICAgICAgLy8gLnByb3RvIGZpbGUsIHdoaWNoIGFjdHVhbGx5IG1hdGNoZXMgdGhlaXIgdHlwZSBuYW1lcywgbm90IHRoZWlyIGZpZWxkCisgICAgICAvLyBuYW1lcy4KKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgIHN0cmluZyBsb3dlcl9maWVsZF9uYW1lID0gZmllbGRfbmFtZTsKKyAgICAgICAgTG93ZXJTdHJpbmcoJmxvd2VyX2ZpZWxkX25hbWUpOworICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShsb3dlcl9maWVsZF9uYW1lKTsKKyAgICAgICAgLy8gSWYgdGhlIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggd29ya2VkIGJ1dCB0aGUgZmllbGQgaXMgTk9UIGEgZ3JvdXAsCisgICAgICAgIGlmIChmaWVsZCAhPSBOVUxMICYmIGZpZWxkLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICAgICAgZmllbGQgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBBZ2Fpbiwgc3BlY2lhbC1jYXNlIGdyb3VwIG5hbWVzIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgIGlmIChmaWVsZCAhPSBOVUxMICYmIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQCisgICAgICAgICAgJiYgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCkgIT0gZmllbGRfbmFtZSkgeworICAgICAgICBmaWVsZCA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgIGlmICghYWxsb3dfdW5rbm93bl9maWVsZF8pIHsKKyAgICAgICAgICBSZXBvcnRFcnJvcigiTWVzc2FnZSB0eXBlIFwiIiArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIGZpZWxkX25hbWUgKyAiXCIuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFJlcG9ydFdhcm5pbmcoIk1lc3NhZ2UgdHlwZSBcIiIgKyBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIGZpZWxkX25hbWUgKyAiXCIuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTa2lwcyB1bmtub3duIGZpZWxkLgorICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICBHT09HTEVfQ0hFQ0soYWxsb3dfdW5rbm93bl9maWVsZF8pOworICAgICAgLy8gVHJ5IHRvIGd1ZXNzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCisgICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIG5vdCBhIG1lc3NhZ2UsIHRoZXJlIHNob3VsZCBiZSBhICI6IiBiZXR3ZWVuIHRoZQorICAgICAgLy8gZmllbGQgbmFtZSBhbmQgdGhlIGZpZWxkIHZhbHVlIGFuZCBhbHNvIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgbm90CisgICAgICAvLyBzdGFydCB3aXRoICJ7IiBvciAiPCIgd2hpY2ggaW5kaWNhdGVzIHRoZSBiZWdpbmluZyBvZiBhIG1lc3NhZ2UgYm9keS4KKyAgICAgIC8vIElmIHRoZXJlIGlzIG5vICI6IiBvciB0aGVyZSBpcyBhICJ7IiBvciAiPCIgYWZ0ZXIgIjoiLCB0aGlzIGZpZWxkIGhhcworICAgICAgLy8gdG8gYmUgYSBtZXNzYWdlIG9yIHRoZSBpbnB1dCBpcyBpbGwtZm9ybWVkLgorICAgICAgaWYgKFRyeUNvbnN1bWUoIjoiKSAmJiAhTG9va2luZ0F0KCJ7IikgJiYgIUxvb2tpbmdBdCgiPCIpKSB7CisgICAgICAgIHJldHVybiBTa2lwRmllbGRWYWx1ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNraXBGaWVsZE1lc3NhZ2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGYWlsIGlmIHRoZSBmaWVsZCBpcyBub3QgcmVwZWF0ZWQgYW5kIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLgorICAgIGlmICgoc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeV8gPT0gRk9SQklEX1NJTkdVTEFSX09WRVJXUklURVMpICYmCisgICAgICAgICFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiByZWZsZWN0aW9uLT5IYXNGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7CisgICAgICBSZXBvcnRFcnJvcigiTm9uLXJlcGVhdGVkIGZpZWxkIFwiIiArIGZpZWxkX25hbWUgKworICAgICAgICAgICAgICAgICAgIlwiIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQZXJmb3JtIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGVtYmVkZGVkIG1lc3NhZ2UgdHlwZXMuCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAvLyAnOicgaXMgb3B0aW9uYWwgaGVyZS4KKyAgICAgIFRyeUNvbnN1bWUoIjoiKTsKKyAgICAgIERPKENvbnN1bWVGaWVsZE1lc3NhZ2UobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKKyAgICB9IGVsc2UgeworICAgICAgRE8oQ29uc3VtZSgiOiIpKTsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBUcnlDb25zdW1lKCJbIikpIHsKKyAgICAgICAgLy8gU2hvcnQgcmVwZWF0ZWQgZm9ybWF0LCBlLmcuICAiZm9vOiBbMSwgMiwgM10iCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgRE8oQ29uc3VtZUZpZWxkVmFsdWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKKyAgICAgICAgICBpZiAoVHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgRE8oQ29uc3VtZSgiLCIpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgRE8oQ29uc3VtZUZpZWxkVmFsdWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmaWVsZHMgbWF5IG9wdGlvbmFsbHkgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvcgorICAgIC8vIHNlbWljb2xvbnMuCisgICAgVHJ5Q29uc3VtZSgiOyIpIHx8IFRyeUNvbnN1bWUoIiwiKTsKKworICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSkgeworICAgICAgUmVwb3J0V2FybmluZygidGV4dCBmb3JtYXQgY29udGFpbnMgZGVwcmVjYXRlZCBmaWVsZCBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWVsZF9uYW1lICsgIlwiIik7CisgICAgfQorCisgICAgLy8gSWYgYSBwYXJzZSBpbmZvIHRyZWUgZXhpc3RzLCBhZGQgdGhlIGxvY2F0aW9uIGZvciB0aGUgcGFyc2VkCisgICAgLy8gZmllbGQuCisgICAgaWYgKHBhcnNlX2luZm9fdHJlZV8gIT0gTlVMTCkgeworICAgICAgUmVjb3JkTG9jYXRpb24ocGFyc2VfaW5mb190cmVlXywgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICBQYXJzZUxvY2F0aW9uKHN0YXJ0X2xpbmUsIHN0YXJ0X2NvbHVtbikpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gU2tpcHMgdGhlIG5leHQgZmllbGQgaW5jbHVkaW5nIHRoZSBmaWVsZCdzIG5hbWUgYW5kIHZhbHVlLgorICBib29sIFNraXBGaWVsZCgpIHsKKyAgICBzdHJpbmcgZmllbGRfbmFtZTsKKyAgICBpZiAoVHJ5Q29uc3VtZSgiWyIpKSB7CisgICAgICAvLyBFeHRlbnNpb24gbmFtZS4KKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZmaWVsZF9uYW1lKSk7CisgICAgICB3aGlsZSAoVHJ5Q29uc3VtZSgiLiIpKSB7CisgICAgICAgIHN0cmluZyBwYXJ0OworICAgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmcGFydCkpOworICAgICAgICBmaWVsZF9uYW1lICs9ICIuIjsKKyAgICAgICAgZmllbGRfbmFtZSArPSBwYXJ0OworICAgICAgfQorICAgICAgRE8oQ29uc3VtZSgiXSIpKTsKKyAgICB9IGVsc2UgeworICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmZpZWxkX25hbWUpKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gZ3Vlc3MgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZC4KKyAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIG5vdCBhIG1lc3NhZ2UsIHRoZXJlIHNob3VsZCBiZSBhICI6IiBiZXR3ZWVuIHRoZQorICAgIC8vIGZpZWxkIG5hbWUgYW5kIHRoZSBmaWVsZCB2YWx1ZSBhbmQgYWxzbyB0aGUgZmllbGQgdmFsdWUgc2hvdWxkIG5vdAorICAgIC8vIHN0YXJ0IHdpdGggInsiIG9yICI8IiB3aGljaCBpbmRpY2F0ZXMgdGhlIGJlZ2luaW5nIG9mIGEgbWVzc2FnZSBib2R5LgorICAgIC8vIElmIHRoZXJlIGlzIG5vICI6IiBvciB0aGVyZSBpcyBhICJ7IiBvciAiPCIgYWZ0ZXIgIjoiLCB0aGlzIGZpZWxkIGhhcworICAgIC8vIHRvIGJlIGEgbWVzc2FnZSBvciB0aGUgaW5wdXQgaXMgaWxsLWZvcm1lZC4KKyAgICBpZiAoVHJ5Q29uc3VtZSgiOiIpICYmICFMb29raW5nQXQoInsiKSAmJiAhTG9va2luZ0F0KCI8IikpIHsKKyAgICAgIERPKFNraXBGaWVsZFZhbHVlKCkpOworICAgIH0gZWxzZSB7CisgICAgICBETyhTa2lwRmllbGRNZXNzYWdlKCkpOworICAgIH0KKyAgICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmaWVsZHMgbWF5IG9wdGlvbmFsbHkgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvcgorICAgIC8vIHNlbWljb2xvbnMuCisgICAgVHJ5Q29uc3VtZSgiOyIpIHx8IFRyeUNvbnN1bWUoIiwiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgQ29uc3VtZUZpZWxkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKworICAgIC8vIElmIHRoZSBwYXJzZSBpbmZvcm1hdGlvbiB0cmVlIGlzIG5vdCBOVUxMLCBjcmVhdGUgYSBuZXN0ZWQgb25lCisgICAgLy8gZm9yIHRoZSBuZXN0ZWQgbWVzc2FnZS4KKyAgICBQYXJzZUluZm9UcmVlKiBwYXJlbnQgPSBwYXJzZV9pbmZvX3RyZWVfOworICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgcGFyc2VfaW5mb190cmVlXyA9IENyZWF0ZU5lc3RlZChwYXJlbnQsIGZpZWxkKTsKKyAgICB9CisKKyAgICBzdHJpbmcgZGVsaW1ldGVyOworICAgIGlmIChUcnlDb25zdW1lKCI8IikpIHsKKyAgICAgIGRlbGltZXRlciA9ICI+IjsKKyAgICB9IGVsc2UgeworICAgICAgRE8oQ29uc3VtZSgieyIpKTsKKyAgICAgIGRlbGltZXRlciA9ICJ9IjsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIERPKENvbnN1bWVNZXNzYWdlKHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLCBkZWxpbWV0ZXIpKTsKKyAgICB9IGVsc2UgeworICAgICAgRE8oQ29uc3VtZU1lc3NhZ2UocmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1ldGVyKSk7CisgICAgfQorCisgICAgLy8gUmVzZXQgdGhlIHBhcnNlIGluZm9ybWF0aW9uIHRyZWUuCisgICAgcGFyc2VfaW5mb190cmVlXyA9IHBhcmVudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFNraXBzIHRoZSB3aG9sZSBib2R5IG9mIGEgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIGJlZ2luaW5nIGRlbGltZXRlciBhbmQKKyAgLy8gdGhlIGVuZGluZyBkZWxpbWV0ZXIuCisgIGJvb2wgU2tpcEZpZWxkTWVzc2FnZSgpIHsKKyAgICBzdHJpbmcgZGVsaW1ldGVyOworICAgIGlmIChUcnlDb25zdW1lKCI8IikpIHsKKyAgICAgIGRlbGltZXRlciA9ICI+IjsKKyAgICB9IGVsc2UgeworICAgICAgRE8oQ29uc3VtZSgieyIpKTsKKyAgICAgIGRlbGltZXRlciA9ICJ9IjsKKyAgICB9CisgICAgd2hpbGUgKCFMb29raW5nQXQoIj4iKSAmJiAgIUxvb2tpbmdBdCgifSIpKSB7CisgICAgICBETyhTa2lwRmllbGQoKSk7CisgICAgfQorICAgIERPKENvbnN1bWUoZGVsaW1ldGVyKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIENvbnN1bWVGaWVsZFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisKKy8vIERlZmluZSBhbiBlYXN5IHRvIHVzZSBtYWNybyBmb3Igc2V0dGluZyBmaWVsZHMuIFRoaXMgbWFjcm8gY2hlY2tzCisvLyB0byBzZWUgaWYgdGhlIGZpZWxkIGlzIHJlcGVhdGVkIChpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gdXNlIHRoZSBBZGQKKy8vIG1ldGhvZHMgb3Igbm90IChpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gdXNlIHRoZSBTZXQgbWV0aG9kcykuCisjZGVmaW5lIFNFVF9GSUVMRChDUFBUWVBFLCBWQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZWZsZWN0aW9uLT5BZGQjI0NQUFRZUEUobWVzc2FnZSwgZmllbGQsIFZBTFVFKTsgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlZmxlY3Rpb24tPlNldCMjQ1BQVFlQRShtZXNzYWdlLCBmaWVsZCwgVkFMVUUpOyAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyAgICBzd2l0Y2goZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICAgIGludDY0IHZhbHVlOworICAgICAgICBETyhDb25zdW1lU2lnbmVkSW50ZWdlcigmdmFsdWUsIGtpbnQzMm1heCkpOworICAgICAgICBTRVRfRklFTEQoSW50MzIsIHN0YXRpY19jYXN0PGludDMyPih2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50MzJtYXgpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFVJbnQzMiwgc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgICAgaW50NjQgdmFsdWU7CisgICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZ2YWx1ZSwga2ludDY0bWF4KSk7CisgICAgICAgIFNFVF9GSUVMRChJbnQ2NCwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50NjRtYXgpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFVJbnQ2NCwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgICAgZG91YmxlIHZhbHVlOworICAgICAgICBETyhDb25zdW1lRG91YmxlKCZ2YWx1ZSkpOworICAgICAgICBTRVRfRklFTEQoRmxvYXQsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZURvdWJsZSgmdmFsdWUpKTsKKyAgICAgICAgU0VUX0ZJRUxEKERvdWJsZSwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN0cmluZyB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVN0cmluZygmdmFsdWUpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFN0cmluZywgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICAgICAgdWludDY0IHZhbHVlOworICAgICAgICAgIERPKENvbnN1bWVVbnNpZ25lZEludGVnZXIoJnZhbHVlLCAxKSk7CisgICAgICAgICAgU0VUX0ZJRUxEKEJvb2wsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnZhbHVlKSk7CisgICAgICAgICAgaWYgKHZhbHVlID09ICJ0cnVlIiB8fCB2YWx1ZSA9PSAidCIpIHsKKyAgICAgICAgICAgIFNFVF9GSUVMRChCb29sLCB0cnVlKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJmYWxzZSIgfHwgdmFsdWUgPT0gImYiKSB7CisgICAgICAgICAgICBTRVRfRklFTEQoQm9vbCwgZmFsc2UpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZXBvcnRFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbiBmaWVsZCBcIiIgKyBmaWVsZC0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIi4gVmFsdWU6IFwiIiArIHZhbHVlICArICJcIi4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKKyAgICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gZmllbGQtPmVudW1fdHlwZSgpOworICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gTlVMTDsKKworICAgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnZhbHVlKSk7CisgICAgICAgICAgLy8gRmluZCB0aGUgZW51bWVyYXRpb24gdmFsdWUuCisgICAgICAgICAgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+RmluZFZhbHVlQnlOYW1lKHZhbHVlKTsKKworICAgICAgICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiLSIpIHx8CisgICAgICAgICAgICAgICAgICAgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICAgICAgaW50NjQgaW50X3ZhbHVlOworICAgICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZpbnRfdmFsdWUsIGtpbnQzMm1heCkpOworICAgICAgICAgIHZhbHVlID0gU2ltcGxlSXRvYShpbnRfdmFsdWUpOyAgICAgICAgLy8gZm9yIGVycm9yIHJlcG9ydGluZworICAgICAgICAgIGVudW1fdmFsdWUgPSBlbnVtX3R5cGUtPkZpbmRWYWx1ZUJ5TnVtYmVyKGludF92YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGludGVnZXIgb3IgaWRlbnRpZmllci4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgUmVwb3J0RXJyb3IoIlVua25vd24gZW51bWVyYXRpb24gdmFsdWUgb2YgXCIiICsgdmFsdWUgICsgIlwiIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIFwiIiArIGZpZWxkLT5uYW1lKCkgKyAiXCIuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU0VUX0ZJRUxEKEVudW0sIGVudW1fdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuIFB1dCBoZXJlIGluc3RlYWQgb2YgYSBkZWZhdWx0CisgICAgICAgIC8vIHNvIHRoYXQgaWYgbmV3IHR5cGVzIGFyZSBhZGRlZCwgd2UgZ2V0IGEgbmljZSBjb21waWxlciB3YXJuaW5nLgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiUmVhY2hlZCBhbiB1bmludGVuZGVkIHN0YXRlOiBDUFBUWVBFX01FU1NBR0UiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisjdW5kZWYgU0VUX0ZJRUxECisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIFNraXBGaWVsZFZhbHVlKCkgeworICAgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgeworICAgICAgd2hpbGUgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFBvc3NpYmxlIGZpZWxkIHZhbHVlcyBvdGhlciB0aGFuIHN0cmluZzoKKyAgICAvLyAgIDEyMzQ1ICAgICAgICA9PiBUWVBFX0lOVEVHRVIKKyAgICAvLyAgIC0xMjM0NSAgICAgICA9PiBUWVBFX1NZTUJPTCArIFRZUEVfSU5URUdFUgorICAgIC8vICAgMS4yMzQ1ICAgICAgID0+IFRZUEVfRkxPQVQKKyAgICAvLyAgIC0xLjIzNDUgICAgICA9PiBUWVBFX1NZTUJPTCArIFRZUEVfRkxPQVQKKyAgICAvLyAgIGluZiAgICAgICAgICA9PiBUWVBFX0lERU5USUZJRVIKKyAgICAvLyAgIC1pbmYgICAgICAgICA9PiBUWVBFX1NZTUJPTCArIFRZUEVfSURFTlRJRklFUgorICAgIC8vICAgVFlQRV9JTlRFR0VSID0+IFRZUEVfSURFTlRJRklFUgorICAgIC8vIERpdmlkZXMgdGhlbSBpbnRvIHR3byBncm91cCwgb25lIHdpdGggVFlQRV9TWU1CT0wKKyAgICAvLyBhbmQgdGhlIG90aGVyIHdpdGhvdXQ6CisgICAgLy8gICBHcm91cCBvbmU6CisgICAgLy8gICAgIDEyMzQ1ICAgICAgICA9PiBUWVBFX0lOVEVHRVIKKyAgICAvLyAgICAgMS4yMzQ1ICAgICAgID0+IFRZUEVfRkxPQVQKKyAgICAvLyAgICAgaW5mICAgICAgICAgID0+IFRZUEVfSURFTlRJRklFUgorICAgIC8vICAgICBUWVBFX0lOVEVHRVIgPT4gVFlQRV9JREVOVElGSUVSCisgICAgLy8gICBHcm91cCB0d286CisgICAgLy8gICAgIC0xMjM0NSAgICAgICA9PiBUWVBFX1NZTUJPTCArIFRZUEVfSU5URUdFUgorICAgIC8vICAgICAtMS4yMzQ1ICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0ZMT0FUCisgICAgLy8gICAgIC1pbmYgICAgICAgICA9PiBUWVBFX1NZTUJPTCArIFRZUEVfSURFTlRJRklFUgorICAgIC8vIEFzIHdlIGNhbiBzZWUsIHRoZSBmaWVsZCB2YWx1ZSBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCAnLScgYW5kIG9uZSBvZgorICAgIC8vIFRZUEVfSU5URUdFUiwgVFlQRV9GTE9BVCBhbmQgVFlQRV9JREVOVElGSUVSLgorICAgIGJvb2wgaGFzX21pbnVzID0gVHJ5Q29uc3VtZSgiLSIpOworICAgIGlmICghTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpICYmCisgICAgICAgICFMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfRkxPQVQpICYmCisgICAgICAgICFMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gQ29tYmluYXRpb24gb2YgJy0nIGFuZCBUWVBFX0lERU5USUZJRVIgbWF5IHJlc3VsdCBpbiBhbiBpbnZhbGlkIGZpZWxkCisgICAgLy8gdmFsdWUgd2hpbGUgb3RoZXIgY29tYmluYXRpb25zIGFsbCBnZW5lcmF0ZSB2YWxpZCB2YWx1ZXMuCisgICAgLy8gV2UgY2hlY2sgaWYgdGhlIHZhbHVlIG9mIHRoaXMgY29tYmluYXRpb24gaXMgdmFsaWQgaGVyZS4KKyAgICAvLyBUWVBFX0lERU5USUZJRVIgYWZ0ZXIgYSAnLScgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZmxvYXQgdmFsdWVzIGxpc3RlZAorICAgIC8vIGJlbG93OgorICAgIC8vICAgaW5mLCBpbmZmLCBpbmZpbml0eSwgbmFuCisgICAgaWYgKGhhc19taW51cyAmJiBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUikpIHsKKyAgICAgIHN0cmluZyB0ZXh0ID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKKyAgICAgIExvd2VyU3RyaW5nKCZ0ZXh0KTsKKyAgICAgIGlmICh0ZXh0ICE9ICJpbmYiICYmCisgICAgICAgICAgdGV4dCAhPSAiaW5maW5pdHkiICYmCisgICAgICAgICAgdGV4dCAhPSAibmFuIikgeworICAgICAgICBSZXBvcnRFcnJvcigiSW52YWxpZCBmbG9hdCBudW1iZXI6ICIgKyB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0b2tlbidzIHRleHQgaXMgZXF1YWwgdG8gdGhhdCBzcGVjaWZpZWQuCisgIGJvb2wgTG9va2luZ0F0KGNvbnN0IHN0cmluZyYgdGV4dCkgeworICAgIHJldHVybiB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0ID09IHRleHQ7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4ncyB0eXBlIGlzIGVxdWFsIHRvIHRoYXQgc3BlY2lmaWVkLgorICBib29sIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VG9rZW5UeXBlIHRva2VuX3R5cGUpIHsKKyAgICByZXR1cm4gdG9rZW5pemVyXy5jdXJyZW50KCkudHlwZSA9PSB0b2tlbl90eXBlOworICB9CisKKyAgLy8gQ29uc3VtZXMgYW4gaWRlbnRpZmllciBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSBpZGVudGlmaWVyIHBhcmFtZXRlci4KKyAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgdG9rZW4gaXMgbm90IG9mIHR5cGUgSURFTlRGSUVSLgorICBib29sIENvbnN1bWVJZGVudGlmaWVyKHN0cmluZyogaWRlbnRpZmllcikgeworICAgIGlmICghTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllci4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqaWRlbnRpZmllciA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7CisKKyAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGEgc3RyaW5nIGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHRleHQgcGFyYW1ldGVyLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBpcyBub3Qgb2YgdHlwZSBTVFJJTkcuCisgIGJvb2wgQ29uc3VtZVN0cmluZyhzdHJpbmcqIHRleHQpIHsKKyAgICBpZiAoIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgc3RyaW5nLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRleHQtPmNsZWFyKCk7CisgICAgd2hpbGUgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICBpbzo6VG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZCh0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0LCB0ZXh0KTsKKworICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDb25zdW1lcyBhIHVpbnQ2NCBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSB2YWx1ZSBwYXJhbWV0ZXIuCisgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGlzIG5vdCBvZiB0eXBlIElOVEVHRVIuCisgIGJvb2wgQ29uc3VtZVVuc2lnbmVkSW50ZWdlcih1aW50NjQqIHZhbHVlLCB1aW50NjQgbWF4X3ZhbHVlKSB7CisgICAgaWYgKCFMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKKyAgICAgIFJlcG9ydEVycm9yKCJFeHBlY3RlZCBpbnRlZ2VyLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW86OlRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKHRva2VuaXplcl8uY3VycmVudCgpLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbHVlLCB2YWx1ZSkpIHsKKyAgICAgIFJlcG9ydEVycm9yKCJJbnRlZ2VyIG91dCBvZiByYW5nZS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGFuIGludDY0IGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHZhbHVlIHBhcmFtZXRlci4KKyAgLy8gTm90ZSB0aGF0IHNpbmNlIHRoZSB0b2tlbml6ZXIgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBudW1iZXJzLAorICAvLyB3ZSBhY3R1YWxseSBtYXkgY29uc3VtZSBhbiBhZGRpdGlvbmFsIHRva2VuIChmb3IgdGhlIG1pbnVzIHNpZ24pIGluIHRoaXMKKyAgLy8gbWV0aG9kLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBpcyBub3QgYW4gaW50ZWdlcgorICAvLyAoc2lnbmVkIG9yIG90aGVyd2lzZSkuCisgIGJvb2wgQ29uc3VtZVNpZ25lZEludGVnZXIoaW50NjQqIHZhbHVlLCB1aW50NjQgbWF4X3ZhbHVlKSB7CisgICAgYm9vbCBuZWdhdGl2ZSA9IGZhbHNlOworCisgICAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgeworICAgICAgbmVnYXRpdmUgPSB0cnVlOworICAgICAgLy8gVHdvJ3MgY29tcGxlbWVudCBhbHdheXMgYWxsb3dzIG9uZSBtb3JlIG5lZ2F0aXZlIGludGVnZXIgdGhhbgorICAgICAgLy8gcG9zaXRpdmUuCisgICAgICArK21heF92YWx1ZTsKKyAgICB9CisKKyAgICB1aW50NjQgdW5zaWduZWRfdmFsdWU7CisKKyAgICBETyhDb25zdW1lVW5zaWduZWRJbnRlZ2VyKCZ1bnNpZ25lZF92YWx1ZSwgbWF4X3ZhbHVlKSk7CisKKyAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odW5zaWduZWRfdmFsdWUpOworCisgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAqdmFsdWUgPSAtKnZhbHVlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ29uc3VtZXMgYSBkb3VibGUgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgdmFsdWUgcGFyYW1ldGVyLgorICAvLyBOb3RlIHRoYXQgc2luY2UgdGhlIHRva2VuaXplciBkb2VzIG5vdCBzdXBwb3J0IG5lZ2F0aXZlIG51bWJlcnMsCisgIC8vIHdlIGFjdHVhbGx5IG1heSBjb25zdW1lIGFuIGFkZGl0aW9uYWwgdG9rZW4gKGZvciB0aGUgbWludXMgc2lnbikgaW4gdGhpcworICAvLyBtZXRob2QuIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGlzIG5vdCBhIGRvdWJsZQorICAvLyAoc2lnbmVkIG9yIG90aGVyd2lzZSkuCisgIGJvb2wgQ29uc3VtZURvdWJsZShkb3VibGUqIHZhbHVlKSB7CisgICAgYm9vbCBuZWdhdGl2ZSA9IGZhbHNlOworCisgICAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgeworICAgICAgbmVnYXRpdmUgPSB0cnVlOworICAgIH0KKworICAgIC8vIEEgZG91YmxlIGNhbiBhY3R1YWxseSBiZSBhbiBpbnRlZ2VyLCBhY2NvcmRpbmcgdG8gdGhlIHRva2VuaXplci4KKyAgICAvLyBUaGVyZWZvcmUsIHdlIG11c3QgY2hlY2sgYm90aCBjYXNlcyBoZXJlLgorICAgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKKyAgICAgIC8vIFdlIGhhdmUgZm91bmQgYW4gaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGRvdWJsZS4KKyAgICAgIHVpbnQ2NCBpbnRlZ2VyX3ZhbHVlOworICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmaW50ZWdlcl92YWx1ZSwga3VpbnQ2NG1heCkpOworCisgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGludGVnZXJfdmFsdWUpOworICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0ZMT0FUKSkgeworICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIGZsb2F0IHZhbHVlIGZvciB0aGUgZG91YmxlLgorICAgICAgKnZhbHVlID0gaW86OlRva2VuaXplcjo6UGFyc2VGbG9hdCh0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0KTsKKworICAgICAgLy8gTWFyayB0aGUgY3VycmVudCB0b2tlbiBhcyBjb25zdW1lZC4KKyAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICBzdHJpbmcgdGV4dCA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7CisgICAgICBMb3dlclN0cmluZygmdGV4dCk7CisgICAgICBpZiAodGV4dCA9PSAiaW5mIiB8fAorICAgICAgICAgIHRleHQgPT0gImluZmluaXR5IikgeworICAgICAgICAqdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJuYW4iKSB7CisgICAgICAgICp2YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7CisgICAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGRvdWJsZS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgZG91YmxlLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgKnZhbHVlID0gLSp2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGEgdG9rZW4gYW5kIGNvbmZpcm1zIHRoYXQgaXQgbWF0Y2hlcyB0aGF0IHNwZWNpZmllZCBpbiB0aGUKKyAgLy8gdmFsdWUgcGFyYW1ldGVyLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBmb3VuZCBkb2VzIG5vdCBtYXRjaCB0aGF0CisgIC8vIHdoaWNoIHdhcyBzcGVjaWZpZWQuCisgIGJvb2wgQ29uc3VtZShjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgICAgY29uc3Qgc3RyaW5nJiBjdXJyZW50X3ZhbHVlID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKKworICAgIGlmIChjdXJyZW50X3ZhbHVlICE9IHZhbHVlKSB7CisgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgXCIiICsgdmFsdWUgKyAiXCIsIGZvdW5kIFwiIiArIGN1cnJlbnRfdmFsdWUKKyAgICAgICAgICAgICAgICAgICsgIlwiLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRva2VuaXplcl8uTmV4dCgpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBBdHRlbXB0cyB0byBjb25zdW1lIHRoZSBzdXBwbGllZCB2YWx1ZS4gUmV0dXJucyBmYWxzZSBpZiBhIHRoZQorICAvLyB0b2tlbiBmb3VuZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgc3BlY2lmaWVkLgorICBib29sIFRyeUNvbnN1bWUoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICAgIGlmICh0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0ID09IHZhbHVlKSB7CisgICAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gQW4gaW50ZXJuYWwgaW5zdGFuY2Ugb2YgdGhlIFRva2VuaXplcidzIGVycm9yIGNvbGxlY3RvciwgdXNlZCB0bworICAvLyBjb2xsZWN0IGFueSBiYXNlLWxldmVsIHBhcnNlIGVycm9ycyBhbmQgZmVlZCB0aGVtIHRvIHRoZSBQYXJzZXJJbXBsLgorICBjbGFzcyBQYXJzZXJFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFBhcnNlckVycm9yQ29sbGVjdG9yKFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VySW1wbCogcGFyc2VyKSA6CisgICAgICAgIHBhcnNlcl8ocGFyc2VyKSB7IH0KKworICAgIHZpcnR1YWwgflBhcnNlckVycm9yQ29sbGVjdG9yKCkgeyB9OworCisgICAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICAgIHBhcnNlcl8tPlJlcG9ydEVycm9yKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgICAgcGFyc2VyXy0+UmVwb3J0V2FybmluZyhsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VyRXJyb3JDb2xsZWN0b3IpOworICAgIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VySW1wbCogcGFyc2VyXzsKKyAgfTsKKworICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CisgIFRleHRGb3JtYXQ6OkZpbmRlciogZmluZGVyXzsKKyAgUGFyc2VJbmZvVHJlZSogcGFyc2VfaW5mb190cmVlXzsKKyAgUGFyc2VyRXJyb3JDb2xsZWN0b3IgdG9rZW5pemVyX2Vycm9yX2NvbGxlY3Rvcl87CisgIGlvOjpUb2tlbml6ZXIgdG9rZW5pemVyXzsKKyAgY29uc3QgRGVzY3JpcHRvciogcm9vdF9tZXNzYWdlX3R5cGVfOworICBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSBzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5XzsKKyAgYm9vbCBhbGxvd191bmtub3duX2ZpZWxkXzsKKyAgYm9vbCBoYWRfZXJyb3JzXzsKK307CisKKyN1bmRlZiBETworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIGNsYXNzIGZvciB3cml0aW5nIHRleHQgdG8gdGhlIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbS4gQWRhcHRlZAorLy8gZnJvbSB0aGUgUHJpbnRlciBmb3VuZCBpbiAvL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmgKK2NsYXNzIFRleHRGb3JtYXQ6OlByaW50ZXI6OlRleHRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVGV4dEdlbmVyYXRvcihpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbF9pbmRlbnRfbGV2ZWwpCisgICAgOiBvdXRwdXRfKG91dHB1dCksCisgICAgICBidWZmZXJfKE5VTEwpLAorICAgICAgYnVmZmVyX3NpemVfKDApLAorICAgICAgYXRfc3RhcnRfb2ZfbGluZV8odHJ1ZSksCisgICAgICBmYWlsZWRfKGZhbHNlKSwKKyAgICAgIGluZGVudF8oIiIpLAorICAgICAgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfKGluaXRpYWxfaW5kZW50X2xldmVsKSB7CisgICAgaW5kZW50Xy5yZXNpemUoaW5pdGlhbF9pbmRlbnRfbGV2ZWxfICogMiwgJyAnKTsKKyAgfQorCisgIH5UZXh0R2VuZXJhdG9yKCkgeworICAgIC8vIE9ubHkgQmFja1VwKCkgaWYgd2UncmUgc3VyZSB3ZSd2ZSBzdWNjZXNzZnVsbHkgY2FsbGVkIE5leHQoKSBhdCBsZWFzdAorICAgIC8vIG9uY2UuCisgICAgaWYgKCFmYWlsZWRfICYmIGJ1ZmZlcl9zaXplXyA+IDApIHsKKyAgICAgIG91dHB1dF8tPkJhY2tVcChidWZmZXJfc2l6ZV8pOworICAgIH0KKyAgfQorCisgIC8vIEluZGVudCB0ZXh0IGJ5IHR3byBzcGFjZXMuICBBZnRlciBjYWxsaW5nIEluZGVudCgpLCB0d28gc3BhY2VzIHdpbGwgYmUKKyAgLy8gaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb2YgdGV4dC4gIEluZGVudCgpIG1heSBiZSBjYWxsZWQKKyAgLy8gbXVsdGlwbGUgdGltZXMgdG8gcHJvZHVjZSBkZWVwZXIgaW5kZW50cy4KKyAgdm9pZCBJbmRlbnQoKSB7CisgICAgaW5kZW50XyArPSAiICAiOworICB9CisKKyAgLy8gUmVkdWNlcyB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwgYnkgdHdvIHNwYWNlcywgb3IgY3Jhc2hlcyBpZiB0aGUgaW5kZW50CisgIC8vIGxldmVsIGlzIHplcm8uCisgIHZvaWQgT3V0ZGVudCgpIHsKKyAgICBpZiAoaW5kZW50Xy5lbXB0eSgpIHx8CisgICAgICAgIGluZGVudF8uc2l6ZSgpIDwgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfICogMikgeworICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgT3V0ZGVudCgpIHdpdGhvdXQgbWF0Y2hpbmcgSW5kZW50KCkuIjsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbmRlbnRfLnJlc2l6ZShpbmRlbnRfLnNpemUoKSAtIDIpOworICB9CisKKyAgLy8gUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBQcmludChjb25zdCBzdHJpbmcmIHN0cikgeworICAgIFByaW50KHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOworICB9CisKKyAgLy8gUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0KSB7CisgICAgUHJpbnQodGV4dCwgc3RybGVuKHRleHQpKTsKKyAgfQorCisgIC8vIFByaW50IHRleHQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgaW50IHNpemUpIHsKKyAgICBpbnQgcG9zID0gMDsgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UndmUgd3JpdHRlbiBzbyBmYXIuCisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKHRleHRbaV0gPT0gJ1xuJykgeworICAgICAgICAvLyBTYXcgbmV3bGluZS4gIElmIHRoZXJlIGlzIG1vcmUgdGV4dCwgd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IGFuIGluZGVudAorICAgICAgICAvLyBoZXJlLiAgU28sIHdyaXRlIHdoYXQgd2UgaGF2ZSBzbyBmYXIsIGluY2x1ZGluZyB0aGUgJ1xuJy4KKyAgICAgICAgV3JpdGUodGV4dCArIHBvcywgaSAtIHBvcyArIDEpOworICAgICAgICBwb3MgPSBpICsgMTsKKworICAgICAgICAvLyBTZXR0aW5nIHRoaXMgdHJ1ZSB3aWxsIGNhdXNlIHRoZSBuZXh0IFdyaXRlKCkgdG8gaW5zZXJ0IGFuIGluZGVudAorICAgICAgICAvLyBmaXJzdC4KKyAgICAgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSByZXN0LgorICAgIFdyaXRlKHRleHQgKyBwb3MsIHNpemUgLSBwb3MpOworICB9CisKKyAgLy8gVHJ1ZSBpZiBhbnkgd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGZhaWxlZC4gIChXZSBkb24ndCBqdXN0CisgIC8vIGNyYXNoIGluIHRoaXMgY2FzZSBiZWNhdXNlIHRoaXMgaXMgYW4gSS9PIGZhaWx1cmUsIG5vdCBhIHByb2dyYW1taW5nCisgIC8vIGVycm9yLikKKyAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiBmYWlsZWRfOyB9CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGV4dEdlbmVyYXRvcik7CisKKyAgdm9pZCBXcml0ZShjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgeworICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuOworCisgICAgaWYgKGF0X3N0YXJ0X29mX2xpbmVfKSB7CisgICAgICAvLyBJbnNlcnQgYW4gaW5kZW50LgorICAgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSBmYWxzZTsKKyAgICAgIFdyaXRlKGluZGVudF8uZGF0YSgpLCBpbmRlbnRfLnNpemUoKSk7CisgICAgICBpZiAoZmFpbGVkXykgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzaXplID4gYnVmZmVyX3NpemVfKSB7CisgICAgICAvLyBEYXRhIGV4Y2VlZHMgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBjYW4gYW5kIHJlcXVlc3QgYQorICAgICAgLy8gbmV3IGJ1ZmZlci4KKyAgICAgIG1lbWNweShidWZmZXJfLCBkYXRhLCBidWZmZXJfc2l6ZV8pOworICAgICAgZGF0YSArPSBidWZmZXJfc2l6ZV87CisgICAgICBzaXplIC09IGJ1ZmZlcl9zaXplXzsKKyAgICAgIHZvaWQqIHZvaWRfYnVmZmVyOworICAgICAgZmFpbGVkXyA9ICFvdXRwdXRfLT5OZXh0KCZ2b2lkX2J1ZmZlciwgJmJ1ZmZlcl9zaXplXyk7CisgICAgICBpZiAoZmFpbGVkXykgcmV0dXJuOworICAgICAgYnVmZmVyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHZvaWRfYnVmZmVyKTsKKyAgICB9CisKKyAgICAvLyBCdWZmZXIgaXMgYmlnIGVub3VnaCB0byByZWNlaXZlIHRoZSBkYXRhOyBjb3B5IGl0LgorICAgIG1lbWNweShidWZmZXJfLCBkYXRhLCBzaXplKTsKKyAgICBidWZmZXJfICs9IHNpemU7CisgICAgYnVmZmVyX3NpemVfIC09IHNpemU7CisgIH0KKworICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIGNvbnN0IG91dHB1dF87CisgIGNoYXIqIGJ1ZmZlcl87CisgIGludCBidWZmZXJfc2l6ZV87CisgIGJvb2wgYXRfc3RhcnRfb2ZfbGluZV87CisgIGJvb2wgZmFpbGVkXzsKKworICBzdHJpbmcgaW5kZW50XzsKKyAgaW50IGluaXRpYWxfaW5kZW50X2xldmVsXzsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUZXh0Rm9ybWF0OjpGaW5kZXI6On5GaW5kZXIoKSB7Cit9CisKK1RleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VyKCkKKyAgOiBlcnJvcl9jb2xsZWN0b3JfKE5VTEwpLAorICAgIGZpbmRlcl8oTlVMTCksCisgICAgcGFyc2VfaW5mb190cmVlXyhOVUxMKSwKKyAgICBhbGxvd19wYXJ0aWFsXyhmYWxzZSksCisgICAgYWxsb3dfdW5rbm93bl9maWVsZF8oZmFsc2UpIHsKK30KKworVGV4dEZvcm1hdDo6UGFyc2VyOjp+UGFyc2VyKCkge30KKworYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5DbGVhcigpOworICBQYXJzZXJJbXBsIHBhcnNlcihvdXRwdXQtPkdldERlc2NyaXB0b3IoKSwgaW5wdXQsIGVycm9yX2NvbGxlY3Rvcl8sCisgICAgICAgICAgICAgICAgICAgIGZpbmRlcl8sIHBhcnNlX2luZm9fdHJlZV8sCisgICAgICAgICAgICAgICAgICAgIFBhcnNlckltcGw6OkZPUkJJRF9TSU5HVUxBUl9PVkVSV1JJVEVTLAorICAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2ZpZWxkXyk7CisgIHJldHVybiBNZXJnZVVzaW5nSW1wbChpbnB1dCwgb3V0cHV0LCAmcGFyc2VyKTsKK30KKworYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKGlucHV0LmRhdGEoKSwgaW5wdXQuc2l6ZSgpKTsKKyAgcmV0dXJuIFBhcnNlKCZpbnB1dF9zdHJlYW0sIG91dHB1dCk7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpNZXJnZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIFBhcnNlckltcGwgcGFyc2VyKG91dHB1dC0+R2V0RGVzY3JpcHRvcigpLCBpbnB1dCwgZXJyb3JfY29sbGVjdG9yXywKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyXywgcGFyc2VfaW5mb190cmVlXywKKyAgICAgICAgICAgICAgICAgICAgUGFyc2VySW1wbDo6QUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUywKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5rbm93bl9maWVsZF8pOworICByZXR1cm4gTWVyZ2VVc2luZ0ltcGwoaW5wdXQsIG91dHB1dCwgJnBhcnNlcik7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpNZXJnZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CisgIHJldHVybiBNZXJnZSgmaW5wdXRfc3RyZWFtLCBvdXRwdXQpOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2VVc2luZ0ltcGwoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsKiBwYXJzZXJfaW1wbCkgeworICBpZiAoIXBhcnNlcl9pbXBsLT5QYXJzZShvdXRwdXQpKSByZXR1cm4gZmFsc2U7CisgIGlmICghYWxsb3dfcGFydGlhbF8gJiYgIW91dHB1dC0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgdmVjdG9yPHN0cmluZz4gbWlzc2luZ19maWVsZHM7CisgICAgb3V0cHV0LT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJm1pc3NpbmdfZmllbGRzKTsKKyAgICBwYXJzZXJfaW1wbC0+UmVwb3J0RXJyb3IoLTEsIDAsICJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5TdHJpbmdzKG1pc3NpbmdfZmllbGRzLCAiLCAiKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZygKKyAgICBjb25zdCBzdHJpbmcmIGlucHV0LAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CisgIFBhcnNlckltcGwgcGFyc2VyKG91dHB1dC0+R2V0RGVzY3JpcHRvcigpLCAmaW5wdXRfc3RyZWFtLCBlcnJvcl9jb2xsZWN0b3JfLAorICAgICAgICAgICAgICAgICAgICBmaW5kZXJfLCBwYXJzZV9pbmZvX3RyZWVfLAorICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsOjpBTExPV19TSU5HVUxBUl9PVkVSV1JJVEVTLAorICAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2ZpZWxkXyk7CisgIHJldHVybiBwYXJzZXIuUGFyc2VGaWVsZChmaWVsZCwgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIHJldHVybiBQYXJzZXIoKS5QYXJzZShpbnB1dCwgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6TWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIHJldHVybiBQYXJzZXIoKS5NZXJnZShpbnB1dCwgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIHJldHVybiBQYXJzZXIoKS5QYXJzZUZyb21TdHJpbmcoaW5wdXQsIG91dHB1dCk7Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgeworICByZXR1cm4gUGFyc2VyKCkuTWVyZ2VGcm9tU3RyaW5nKGlucHV0LCBvdXRwdXQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRlcigpCisgIDogaW5pdGlhbF9pbmRlbnRfbGV2ZWxfKDApLAorICAgIHNpbmdsZV9saW5lX21vZGVfKGZhbHNlKSwKKyAgICB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc18oZmFsc2UpLAorICAgIHV0Zjhfc3RyaW5nX2VzY2FwaW5nXyhmYWxzZSkge30KKworVGV4dEZvcm1hdDo6UHJpbnRlcjo6flByaW50ZXIoKSB7fQorCitib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50VG9TdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIG91dHB1dCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIm91dHB1dCBzcGVjaWZpZWQgaXMgTlVMTCI7CisKKyAgb3V0cHV0LT5jbGVhcigpOworICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0ob3V0cHV0KTsKKworICBib29sIHJlc3VsdCA9IFByaW50KG1lc3NhZ2UsICZvdXRwdXRfc3RyZWFtKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nKAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgc3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhvdXRwdXQpIDw8ICJvdXRwdXQgc3BlY2lmaWVkIGlzIE5VTEwiOworCisgIG91dHB1dC0+Y2xlYXIoKTsKKyAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKG91dHB1dCk7CisgIHJldHVybiBQcmludFVua25vd25GaWVsZHModW5rbm93bl9maWVsZHMsICZvdXRwdXRfc3RyZWFtKTsKK30KKworYm9vbCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcihvdXRwdXQsIGluaXRpYWxfaW5kZW50X2xldmVsXyk7CisKKyAgUHJpbnQobWVzc2FnZSwgZ2VuZXJhdG9yKTsKKworICAvLyBPdXRwdXQgZmFsc2UgaWYgdGhlIGdlbmVyYXRvciBmYWlsZWQgaW50ZXJuYWxseS4KKyAgcmV0dXJuICFnZW5lcmF0b3IuZmFpbGVkKCk7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRVbmtub3duRmllbGRzKAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3Iob3V0cHV0LCBpbml0aWFsX2luZGVudF9sZXZlbF8pOworCisgIFByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgZ2VuZXJhdG9yKTsKKworICAvLyBPdXRwdXQgZmFsc2UgaWYgdGhlIGdlbmVyYXRvciBmYWlsZWQgaW50ZXJuYWxseS4KKyAgcmV0dXJuICFnZW5lcmF0b3IuZmFpbGVkKCk7Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICBQcmludEZpZWxkKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkc1tpXSwgZ2VuZXJhdG9yKTsKKyAgfQorICBQcmludFVua25vd25GaWVsZHMocmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSwgZ2VuZXJhdG9yKTsKK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludEZpZWxkVmFsdWVUb1N0cmluZygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgaW50IGluZGV4LAorICAgIHN0cmluZyogb3V0cHV0KSBjb25zdCB7CisKKyAgR09PR0xFX0RDSEVDSyhvdXRwdXQpIDw8ICJvdXRwdXQgc3BlY2lmaWVkIGlzIE5VTEwiOworCisgIG91dHB1dC0+Y2xlYXIoKTsKKyAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKG91dHB1dCk7CisgIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKCZvdXRwdXRfc3RyZWFtLCBpbml0aWFsX2luZGVudF9sZXZlbF8pOworCisgIFByaW50RmllbGRWYWx1ZShtZXNzYWdlLCBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKSwgZmllbGQsIGluZGV4LCBnZW5lcmF0b3IpOworfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7CisgIGlmICh1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc18gJiYKKyAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpICYmCisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HICYmCisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgIFByaW50U2hvcnRSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBnZW5lcmF0b3IpOworICAgIHJldHVybjsKKyAgfQorCisgIGludCBjb3VudCA9IDA7CisKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgY291bnQgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGQpOworICB9IGVsc2UgaWYgKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgeworICAgIGNvdW50ID0gMTsKKyAgfQorCisgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7ICsraikgeworICAgIFByaW50RmllbGROYW1lKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBnZW5lcmF0b3IpOworCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgeyAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRvci5QcmludCgiIHtcbiIpOworICAgICAgICBnZW5lcmF0b3IuSW5kZW50KCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRvci5QcmludCgiOiAiKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgZmllbGQgdmFsdWUuCisgICAgaW50IGZpZWxkX2luZGV4ID0gajsKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBmaWVsZF9pbmRleCA9IC0xOworICAgIH0KKworICAgIFByaW50RmllbGRWYWx1ZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZmllbGRfaW5kZXgsIGdlbmVyYXRvcik7CisKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIn0gIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmF0b3IuT3V0ZGVudCgpOworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIn1cbiIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlxuIik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRTaG9ydFJlcGVhdGVkRmllbGQoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7CisgIC8vIFByaW50IHByaW1pdGl2ZSByZXBlYXRlZCBmaWVsZCBpbiBzaG9ydCBmb3JtLgorICBQcmludEZpZWxkTmFtZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZ2VuZXJhdG9yKTsKKworICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgIGdlbmVyYXRvci5QcmludCgiOiBbIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSBnZW5lcmF0b3IuUHJpbnQoIiwgIik7CisgICAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBpLCBnZW5lcmF0b3IpOworICB9CisgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgIGdlbmVyYXRvci5QcmludCgiXSAiKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0b3IuUHJpbnQoIl1cbiIpOworICB9Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRGaWVsZE5hbWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBnZW5lcmF0b3IuUHJpbnQoIlsiKTsKKyAgICAvLyBXZSBzcGVjaWFsLWNhc2UgTWVzc2FnZVNldCBlbGVtZW50cyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByb3RvMS4KKyAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKQorICAgICAgICAmJiBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFCisgICAgICAgICYmIGZpZWxkLT5pc19vcHRpb25hbCgpCisgICAgICAgICYmIGZpZWxkLT5leHRlbnNpb25fc2NvcGUoKSA9PSBmaWVsZC0+bWVzc2FnZV90eXBlKCkpIHsKKyAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZC0+bWVzc2FnZV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkLT5mdWxsX25hbWUoKSk7CisgICAgfQorICAgIGdlbmVyYXRvci5QcmludCgiXSIpOworICB9IGVsc2UgeworICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgICAgLy8gR3JvdXBzIG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIHRoZWlyIG9yaWdpbmFsIGNhcGl0YWxpemF0aW9uLgorICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkLT5uYW1lKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGRWYWx1ZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgaW5kZXgsCisgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soZmllbGQtPmlzX3JlcGVhdGVkKCkgfHwgKGluZGV4ID09IC0xKSkKKyAgICAgIDw8ICJJbmRleCBtdXN0IGJlIC0xIGZvciBub24tcmVwZWF0ZWQgZmllbGRzIjsKKworICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIE9VVFBVVF9GSUVMRChDUFBUWVBFLCBNRVRIT0QsIFRPX1NUUklORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnZW5lcmF0b3IuUHJpbnQoVE9fU1RSSU5HKGZpZWxkLT5pc19yZXBlYXRlZCgpID8gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWQjI01FVEhPRChtZXNzYWdlLCBmaWVsZCwgaW5kZXgpIDogICAgICAgICAgIFwKKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXQjI01FVEhPRChtZXNzYWdlLCBmaWVsZCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyAgICAgIE9VVFBVVF9GSUVMRCggSU5UMzIsICBJbnQzMiwgU2ltcGxlSXRvYSk7CisgICAgICBPVVRQVVRfRklFTEQoIElOVDY0LCAgSW50NjQsIFNpbXBsZUl0b2EpOworICAgICAgT1VUUFVUX0ZJRUxEKFVJTlQzMiwgVUludDMyLCBTaW1wbGVJdG9hKTsKKyAgICAgIE9VVFBVVF9GSUVMRChVSU5UNjQsIFVJbnQ2NCwgU2ltcGxlSXRvYSk7CisgICAgICBPVVRQVVRfRklFTEQoIEZMT0FULCAgRmxvYXQsIFNpbXBsZUZ0b2EpOworICAgICAgT1VUUFVUX0ZJRUxEKERPVUJMRSwgRG91YmxlLCBTaW1wbGVEdG9hKTsKKyN1bmRlZiBPVVRQVVRfRklFTEQKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN0cmluZyBzY3JhdGNoOworICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPworICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbmRleCwgJnNjcmF0Y2gpIDoKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOworCisgICAgICAgIGdlbmVyYXRvci5QcmludCgiXCIiKTsKKyAgICAgICAgaWYgKHV0Zjhfc3RyaW5nX2VzY2FwaW5nXykgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludChzdHJpbmdzOjpVdGY4U2FmZUNFc2NhcGUodmFsdWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoQ0VzY2FwZSh2YWx1ZSkpOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRvci5QcmludCgiXCIiKTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbChtZXNzYWdlLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHJlZmxlY3Rpb24tPkdldEJvb2wobWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCktPm5hbWUoKSA6CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBmaWVsZCktPm5hbWUoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBQcmludChmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/CisgICAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkgOgorICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLAorICAgICAgICAgICAgICBnZW5lcmF0b3IpOworICAgICAgICBicmVhazsKKyAgfQorfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgcmV0dXJuIFByaW50ZXIoKS5QcmludChtZXNzYWdlLCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQcmludFVua25vd25GaWVsZHMoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICByZXR1cm4gUHJpbnRlcigpLlByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBzdHJpbmcqIG91dHB1dCkgeworICByZXR1cm4gUHJpbnRlcigpLlByaW50VG9TdHJpbmcobWVzc2FnZSwgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywgc3RyaW5nKiBvdXRwdXQpIHsKKyAgcmV0dXJuIFByaW50ZXIoKS5QcmludFVua25vd25GaWVsZHNUb1N0cmluZyh1bmtub3duX2ZpZWxkcywgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIHZvaWQgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGludCBpbmRleCwKKyAgICBzdHJpbmcqIG91dHB1dCkgeworICByZXR1cm4gUHJpbnRlcigpLlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCwgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZygKKyAgICBjb25zdCBzdHJpbmcmIGlucHV0LAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZSogbWVzc2FnZSkgeworICByZXR1cm4gUGFyc2VyKCkuUGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyhpbnB1dCwgZmllbGQsIG1lc3NhZ2UpOworfQorCisvLyBQcmludHMgYW4gaW50ZWdlciBhcyBoZXggd2l0aCBhIGZpeGVkIG51bWJlciBvZiBkaWdpdHMgZGVwZW5kZW50IG9uIHRoZQorLy8gaW50ZWdlciB0eXBlLgordGVtcGxhdGU8dHlwZW5hbWUgSW50VHlwZT4KK3N0YXRpYyBzdHJpbmcgUGFkZGVkSGV4KEludFR5cGUgdmFsdWUpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoc2l6ZW9mKHZhbHVlKSAqIDIpOworICBmb3IgKGludCBpID0gc2l6ZW9mKHZhbHVlKSAqIDIgLSAxOyBpID49IDA7IGktLSkgeworICAgIHJlc3VsdC5wdXNoX2JhY2soaW50X3RvX2hleF9kaWdpdCh2YWx1ZSA+PiAoaSo0KSAmIDB4MEYpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50VW5rbm93bkZpZWxkcygKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisgICAgc3RyaW5nIGZpZWxkX251bWJlciA9IFNpbXBsZUl0b2EoZmllbGQubnVtYmVyKCkpOworCisgICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkX251bWJlcik7CisgICAgICAgIGdlbmVyYXRvci5QcmludCgiOiAiKTsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KFNpbXBsZUl0b2EoZmllbGQudmFyaW50KCkpKTsKKyAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcbiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQzMjogeworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCI6IDB4Iik7CisgICAgICAgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KEZhc3RIZXgzMlRvQnVmZmVyKGZpZWxkLmZpeGVkMzIoKSwgYnVmZmVyKSk7CisgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQ6IHsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkX251bWJlcik7CisgICAgICAgIGdlbmVyYXRvci5QcmludCgiOiAweCIpOworICAgICAgICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07CisgICAgICAgIGdlbmVyYXRvci5QcmludChGYXN0SGV4NjRUb0J1ZmZlcihmaWVsZC5maXhlZDY0KCksIGJ1ZmZlcikpOworICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOiB7CisgICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZF9udW1iZXIpOworICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpOworICAgICAgICBVbmtub3duRmllbGRTZXQgZW1iZWRkZWRfdW5rbm93bl9maWVsZHM7CisgICAgICAgIGlmICghdmFsdWUuZW1wdHkoKSAmJiBlbWJlZGRlZF91bmtub3duX2ZpZWxkcy5QYXJzZUZyb21TdHJpbmcodmFsdWUpKSB7CisgICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBwYXJzZWFibGUgYXMgYSBNZXNzYWdlLgorICAgICAgICAgIC8vIFNvIGl0IGlzIHByb2JhYmx5IGFuIGVtYmVkZGVkIG1lc3NhZ2UuCisgICAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7ICIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7XG4iKTsKKyAgICAgICAgICAgIGdlbmVyYXRvci5JbmRlbnQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKGVtYmVkZGVkX3Vua25vd25fZmllbGRzLCBnZW5lcmF0b3IpOworICAgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJ9ICIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5lcmF0b3IuT3V0ZGVudCgpOworICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJ9XG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBub3QgcGFyc2VhYmxlIGFzIGEgTWVzc2FnZS4KKyAgICAgICAgICAvLyBTbyBpdCBpcyBwcm9iYWJseSBqdXN0IGEgcGxhaW4gc3RyaW5nLgorICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiOiBcIiIpOworICAgICAgICAgIGdlbmVyYXRvci5QcmludChDRXNjYXBlKHZhbHVlKSk7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcIiIpOworICAgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkX251bWJlcik7CisgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiIHsgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIge1xuIik7CisgICAgICAgICAgZ2VuZXJhdG9yLkluZGVudCgpOworICAgICAgICB9CisgICAgICAgIFByaW50VW5rbm93bkZpZWxkcyhmaWVsZC5ncm91cCgpLCBnZW5lcmF0b3IpOworICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIn0gIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLk91dGRlbnQoKTsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIn1cbiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmM2ZmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oCkBAIC0wLDAgKzEsMzY5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJpbnRpbmcgYW5kIHBhcnNpbmcgcHJvdG9jb2wgbWVzc2FnZXMgaW4gYSBodW1hbi1yZWFkYWJsZSwKKy8vIHRleHQtYmFzZWQgZm9ybWF0LgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9URVhUX0ZPUk1BVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1RFWFRfRk9STUFUX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW8geworICBjbGFzcyBFcnJvckNvbGxlY3RvcjsgICAgICAvLyB0b2tlbml6ZXIuaAorfQorCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgcHJvdG9jb2wgYnVmZmVyIHRleHQgZm9ybWF0LiAgUHJpbnRpbmcgYW5kIHBhcnNpbmcKKy8vIHByb3RvY29sIG1lc3NhZ2VzIGluIHRleHQgZm9ybWF0IGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBodW1hbiBlZGl0aW5nCisvLyBvZiBtZXNzYWdlcy4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHJlYWxseSBhIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVGV4dEZvcm1hdCB7CisgcHVibGljOgorICAvLyBPdXRwdXRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbWVzc2FnZSB0byB0aGUgZ2l2ZW4KKyAgLy8gb3V0cHV0IHN0cmVhbS4KKyAgc3RhdGljIGJvb2wgUHJpbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIC8vIFByaW50IHRoZSBmaWVsZHMgaW4gYW4gVW5rbm93bkZpZWxkU2V0LiAgVGhleSBhcmUgcHJpbnRlZCBieSB0YWcgbnVtYmVyCisgIC8vIG9ubHkuICBFbWJlZGRlZCBtZXNzYWdlcyBhcmUgaGV1cmlzdGljYWxseSBpZGVudGlmaWVkIGJ5IGF0dGVtcHRpbmcgdG8KKyAgLy8gcGFyc2UgdGhlbS4KKyAgc3RhdGljIGJvb2wgUHJpbnRVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gTGlrZSBQcmludCgpLCBidXQgb3V0cHV0cyBkaXJlY3RseSB0byBhIHN0cmluZy4KKyAgc3RhdGljIGJvb2wgUHJpbnRUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gTGlrZSBQcmludFVua25vd25GaWVsZHMoKSwgYnV0IG91dHB1dHMgZGlyZWN0bHkgdG8gYSBzdHJpbmcuCisgIHN0YXRpYyBib29sIFByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KTsKKworICAvLyBPdXRwdXRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHN1cHBsaWVkIG9uCisgIC8vIHRoZSBtZXNzYWdlIHN1cHBsaWVkLiBGb3Igbm9uLXJlcGVhdGVkIGZpZWxkcywgYW4gaW5kZXggb2YgLTEgbXVzdAorICAvLyBiZSBzdXBwbGllZC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgcHJpbnQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEKKyAgLy8gZmllbGQgaWYgaXQgaXMgbm90IHNldC4KKyAgc3RhdGljIHZvaWQgUHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gQ2xhc3MgZm9yIHRob3NlIHVzZXJzIHdoaWNoIHJlcXVpcmUgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIGhvdworICAvLyBhIHByb3RvYnVmZmVyIG1lc3NhZ2UgaXMgcHJpbnRlZCBvdXQuCisgIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBQcmludGVyIHsKKyAgIHB1YmxpYzoKKyAgICBQcmludGVyKCk7CisgICAgflByaW50ZXIoKTsKKworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnQKKyAgICBib29sIFByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkcworICAgIGJvb2wgUHJpbnRVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZworICAgIGJvb2wgUHJpbnRUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBzdHJpbmcqIG91dHB1dCkgY29uc3Q7CisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQcmludFVua25vd25GaWVsZHNUb1N0cmluZworICAgIGJvb2wgUHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KSBjb25zdDsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlByaW50RmllbGRWYWx1ZVRvU3RyaW5nCisgICAgdm9pZCBQcmludEZpZWxkVmFsdWVUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KSBjb25zdDsKKworICAgIC8vIEFkanVzdCB0aGUgaW5pdGlhbCBpbmRlbnQgbGV2ZWwgb2YgYWxsIG91dHB1dC4gIEVhY2ggaW5kZW50IGxldmVsIGlzCisgICAgLy8gZXF1YWwgdG8gdHdvIHNwYWNlcy4KKyAgICB2b2lkIFNldEluaXRpYWxJbmRlbnRMZXZlbChpbnQgaW5kZW50X2xldmVsKSB7CisgICAgICBpbml0aWFsX2luZGVudF9sZXZlbF8gPSBpbmRlbnRfbGV2ZWw7CisgICAgfQorCisgICAgLy8gSWYgcHJpbnRpbmcgaW4gc2luZ2xlIGxpbmUgbW9kZSwgdGhlbiB0aGUgZW50aXJlIG1lc3NhZ2Ugd2lsbCBiZSBvdXRwdXQKKyAgICAvLyBvbiBhIHNpbmdsZSBsaW5lIHdpdGggbm8gbGluZSBicmVha3MuCisgICAgdm9pZCBTZXRTaW5nbGVMaW5lTW9kZShib29sIHNpbmdsZV9saW5lX21vZGUpIHsKKyAgICAgIHNpbmdsZV9saW5lX21vZGVfID0gc2luZ2xlX2xpbmVfbW9kZTsKKyAgICB9CisKKyAgICAvLyBTZXQgdHJ1ZSB0byBwcmludCByZXBlYXRlZCBwcmltaXRpdmVzIGluIGEgZm9ybWF0IGxpa2U6CisgICAgLy8gICBmaWVsZF9uYW1lOiBbMSwgMiwgMywgNF0KKyAgICAvLyBpbnN0ZWFkIG9mIHByaW50aW5nIGVhY2ggdmFsdWUgb24gaXRzIG93biBsaW5lLiAgU2hvcnQgZm9ybWF0IGFwcGxpZXMKKyAgICAvLyBvbmx5IHRvIHByaW1pdGl2ZSB2YWx1ZXMgLS0gaS5lLiBldmVyeXRoaW5nIGV4Y2VwdCBzdHJpbmdzIGFuZAorICAgIC8vIHN1Yi1tZXNzYWdlcy9ncm91cHMuCisgICAgdm9pZCBTZXRVc2VTaG9ydFJlcGVhdGVkUHJpbWl0aXZlcyhib29sIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzKSB7CisgICAgICB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc18gPSB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlczsKKyAgICB9CisKKyAgICAvLyBTZXQgdHJ1ZSB0byBvdXRwdXQgVVRGLTggaW5zdGVhZCBvZiBBU0NJSS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UKKyAgICAvLyBpcyB0aGF0IGJ5dGVzID49IDB4ODAgaW4gc3RyaW5nIGZpZWxkcyB3aWxsIG5vdCBiZSBlc2NhcGVkLAorICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgYXNzdW1lZCB0byBiZSBwYXJ0IG9mIFVURi04IG11bHRpLWJ5dGUKKyAgICAvLyBzZXF1ZW5jZXMuCisgICAgdm9pZCBTZXRVc2VVdGY4U3RyaW5nRXNjYXBpbmcoYm9vbCBhc191dGY4KSB7CisgICAgICB1dGY4X3N0cmluZ19lc2NhcGluZ18gPSBhc191dGY4OworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGludGVybmFsIGNsYXNzIHVzZWQgdG8gcHJpbnQgdGhlIHRleHQKKyAgICAvLyBvdXRwdXQgdG8gdGhlIE91dHB1dFN0cmVhbSAoc2VlIHRleHRfZm9ybWF0LmNjIGZvciBpbXBsZW1lbnRhdGlvbikuCisgICAgY2xhc3MgVGV4dEdlbmVyYXRvcjsKKworICAgIC8vIEludGVybmFsIFByaW50IG1ldGhvZCwgdXNlZCBmb3Igd3JpdGluZyB0byB0aGUgT3V0cHV0U3RyZWFtIHZpYQorICAgIC8vIHRoZSBUZXh0R2VuZXJhdG9yIGNsYXNzLgorICAgIHZvaWQgUHJpbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7CisKKyAgICAvLyBQcmludCBhIHNpbmdsZSBmaWVsZC4KKyAgICB2b2lkIFByaW50RmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdDsKKworICAgIC8vIFByaW50IGEgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkIGluIHNob3J0IGZvcm0uCisgICAgdm9pZCBQcmludFNob3J0UmVwZWF0ZWRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0OworCisgICAgLy8gUHJpbnQgdGhlIG5hbWUgb2YgYSBmaWVsZCAtLSBpLmUuIGV2ZXJ5dGhpbmcgdGhhdCBjb21lcyBiZWZvcmUgdGhlCisgICAgLy8gJzonIGZvciBhIHNpbmdsZSBuYW1lL3ZhbHVlIHBhaXIuCisgICAgdm9pZCBQcmludEZpZWxkTmFtZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0OworCisgICAgLy8gT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBzdXBwbGllZCBvbgorICAgIC8vIHRoZSBtZXNzYWdlIHN1cHBsaWVkIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vdCBzZXQuCisgICAgdm9pZCBQcmludEZpZWxkVmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7CisKKyAgICAvLyBQcmludCB0aGUgZmllbGRzIGluIGFuIFVua25vd25GaWVsZFNldC4gIFRoZXkgYXJlIHByaW50ZWQgYnkgdGFnIG51bWJlcgorICAgIC8vIG9ubHkuICBFbWJlZGRlZCBtZXNzYWdlcyBhcmUgaGV1cmlzdGljYWxseSBpZGVudGlmaWVkIGJ5IGF0dGVtcHRpbmcgdG8KKyAgICAvLyBwYXJzZSB0aGVtLgorICAgIHZvaWQgUHJpbnRVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdDsKKworICAgIGludCBpbml0aWFsX2luZGVudF9sZXZlbF87CisKKyAgICBib29sIHNpbmdsZV9saW5lX21vZGVfOworCisgICAgYm9vbCB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc187CisKKyAgICBib29sIHV0Zjhfc3RyaW5nX2VzY2FwaW5nXzsKKyAgfTsKKworICAvLyBQYXJzZXMgYSB0ZXh0LWZvcm1hdCBwcm90b2NvbCBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbSB0bworICAvLyB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgZm9ybWF0IHdyaXR0ZW4KKyAgLy8gYnkgUHJpbnQoKS4KKyAgc3RhdGljIGJvb2wgUGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworICAvLyBMaWtlIFBhcnNlKCksIGJ1dCByZWFkcyBkaXJlY3RseSBmcm9tIGEgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKworICAvLyBMaWtlIFBhcnNlKCksIGJ1dCB0aGUgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSwgYXMgaWYKKyAgLy8gdXNpbmcgTWVzc2FnZTo6TWVyZ2VGcm9tKCkuCisgIHN0YXRpYyBib29sIE1lcmdlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKyAgLy8gTGlrZSBNZXJnZSgpLCBidXQgcmVhZHMgZGlyZWN0bHkgZnJvbSBhIHN0cmluZy4KKyAgc3RhdGljIGJvb2wgTWVyZ2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7CisKKyAgLy8gUGFyc2UgdGhlIGdpdmVuIHRleHQgYXMgYSBzaW5nbGUgZmllbGQgdmFsdWUgYW5kIHN0b3JlIGl0IGludG8gdGhlCisgIC8vIGdpdmVuIGZpZWxkIG9mIHRoZSBnaXZlbiBtZXNzYWdlLiBJZiB0aGUgZmllbGQgaXMgYSByZXBlYXRlZCBmaWVsZCwKKyAgLy8gdGhlIG5ldyB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQKKyAgc3RhdGljIGJvb2wgUGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSk7CisKKyAgLy8gSW50ZXJmYWNlIHRoYXQgVGV4dEZvcm1hdDo6UGFyc2VyIGNhbiB1c2UgdG8gZmluZCBleHRlbnNpb25zLgorICAvLyBUaGlzIGNsYXNzIG1heSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlIHRvIGZpbmQgbW9yZSBpbmZvcm1hdGlvbgorICAvLyBsaWtlIGZpZWxkcywgZXRjLgorICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmluZGVyIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5GaW5kZXIoKTsKKworICAgIC8vIFRyeSB0byBmaW5kIGFuIGV4dGVuc2lvbiBvZiAqbWVzc2FnZSBieSBmdWxseS1xdWFsaWZpZWQgZmllbGQKKyAgICAvLyBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vIGV4dGVuc2lvbiBpcyBrbm93biBmb3IgdGhpcyBuYW1lIG9yIG51bWJlci4KKyAgICB2aXJ0dWFsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbigKKyAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCA9IDA7CisgIH07CisKKyAgLy8gQSBsb2NhdGlvbiBpbiB0aGUgcGFyc2VkIHRleHQuCisgIHN0cnVjdCBQYXJzZUxvY2F0aW9uIHsKKyAgICBpbnQgbGluZTsKKyAgICBpbnQgY29sdW1uOworCisgICAgUGFyc2VMb2NhdGlvbigpIDogbGluZSgtMSksIGNvbHVtbigtMSkge30KKyAgICBQYXJzZUxvY2F0aW9uKGludCBsaW5lX3BhcmFtLCBpbnQgY29sdW1uX3BhcmFtKQorICAgICAgICA6IGxpbmUobGluZV9wYXJhbSksIGNvbHVtbihjb2x1bW5fcGFyYW0pIHt9CisgIH07CisKKyAgLy8gRGF0YSBzdHJ1Y3R1cmUgd2hpY2ggaXMgcG9wdWxhdGVkIHdpdGggdGhlIGxvY2F0aW9ucyBvZiBlYWNoIGZpZWxkCisgIC8vIHZhbHVlIHBhcnNlZCBmcm9tIHRoZSB0ZXh0LgorICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUGFyc2VJbmZvVHJlZSB7CisgICBwdWJsaWM6CisgICAgUGFyc2VJbmZvVHJlZSgpOworICAgIH5QYXJzZUluZm9UcmVlKCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBwYXJzZSBsb2NhdGlvbiBmb3IgaW5kZXgtdGggdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBwYXJzZWQKKyAgICAvLyB0ZXh0LiBJZiBub25lIGV4aXN0cywgcmV0dXJucyBhIGxvY2F0aW9uIHdpdGggbGluZSA9IC0xLiBJbmRleCBzaG91bGQgYmUKKyAgICAvLyAtMSBmb3Igbm90LXJlcGVhdGVkIGZpZWxkcy4KKyAgICBQYXJzZUxvY2F0aW9uIEdldExvY2F0aW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBwYXJzZSBpbmZvIHRyZWUgZm9yIHRoZSBnaXZlbiBmaWVsZCwgd2hpY2ggbXVzdCBiZSBhIG1lc3NhZ2UKKyAgICAvLyB0eXBlLiBUaGUgbmVzdGVkIGluZm9ybWF0aW9uIHRyZWUgaXMgb3duZWQgYnkgdGhlIHJvb3QgdHJlZSBhbmQgd2lsbCBiZQorICAgIC8vIGRlbGV0ZWQgd2hlbiBpdCBpcyBkZWxldGVkLgorICAgIFBhcnNlSW5mb1RyZWUqIEdldFRyZWVGb3JOZXN0ZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisKKyAgIHByaXZhdGU6CisgICAgLy8gQWxsb3cgdGhlIHRleHQgZm9ybWF0IHBhcnNlciB0byByZWNvcmQgaW5mb3JtYXRpb24gaW50byB0aGUgdHJlZS4KKyAgICBmcmllbmQgY2xhc3MgVGV4dEZvcm1hdDsKKworICAgIC8vIFJlY29yZHMgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGZvciBhIGZpZWxkLgorICAgIHZvaWQgUmVjb3JkTG9jYXRpb24oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgUGFyc2VMb2NhdGlvbiBsb2NhdGlvbik7CisKKyAgICAvLyBDcmVhdGUgYW5kIHJlY29yZHMgYSBuZXN0ZWQgdHJlZSBmb3IgYSBuZXN0ZWQgbWVzc2FnZSBmaWVsZC4KKyAgICBQYXJzZUluZm9UcmVlKiBDcmVhdGVOZXN0ZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgICAvLyBEZWZpbmVzIHRoZSBtYXAgZnJvbSB0aGUgaW5kZXgtdGggZmllbGQgZGVzY3JpcHRvciB0byBpdHMgcGFyc2UgbG9jYXRpb24uCisgICAgdHlwZWRlZiBtYXA8Y29uc3QgRmllbGREZXNjcmlwdG9yKiwgdmVjdG9yPFBhcnNlTG9jYXRpb24+ID4gTG9jYXRpb25NYXA7CisKKyAgICAvLyBEZWZpbmVzIHRoZSBtYXAgZnJvbSB0aGUgaW5kZXgtdGggZmllbGQgZGVzY3JpcHRvciB0byB0aGUgbmVzdGVkIHBhcnNlCisgICAgLy8gaW5mbyB0cmVlLgorICAgIHR5cGVkZWYgbWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosIHZlY3RvcjxQYXJzZUluZm9UcmVlKj4gPiBOZXN0ZWRNYXA7CisKKyAgICBMb2NhdGlvbk1hcCBsb2NhdGlvbnNfOworICAgIE5lc3RlZE1hcCBuZXN0ZWRfOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlSW5mb1RyZWUpOworICB9OworCisgIC8vIEZvciBtb3JlIGNvbnRyb2wgb3ZlciBwYXJzaW5nLCB1c2UgdGhpcyBjbGFzcy4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFBhcnNlciB7CisgICBwdWJsaWM6CisgICAgUGFyc2VyKCk7CisgICAgflBhcnNlcigpOworCisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQYXJzZSgpLgorICAgIGJvb2wgUGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCkuCisgICAgYm9vbCBQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6Ok1lcmdlKCkuCisgICAgYm9vbCBNZXJnZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7CisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoKS4KKyAgICBib29sIE1lcmdlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworCisgICAgLy8gU2V0IHdoZXJlIHRvIHJlcG9ydCBwYXJzZSBlcnJvcnMuICBJZiBOVUxMICh0aGUgZGVmYXVsdCksIGVycm9ycyB3aWxsCisgICAgLy8gYmUgcHJpbnRlZCB0byBzdGRlcnIuCisgICAgdm9pZCBSZWNvcmRFcnJvcnNUbyhpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgeworICAgICAgZXJyb3JfY29sbGVjdG9yXyA9IGVycm9yX2NvbGxlY3RvcjsKKyAgICB9CisKKyAgICAvLyBTZXQgaG93IHBhcnNlciBmaW5kcyBleHRlbnNpb25zLiAgSWYgTlVMTCAodGhlIGRlZmF1bHQpLCB0aGUKKyAgICAvLyBwYXJzZXIgd2lsbCB1c2UgdGhlIHN0YW5kYXJkIFJlZmxlY3Rpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aAorICAgIC8vIHRoZSBtZXNzYWdlIGJlaW5nIHBhcnNlZC4KKyAgICB2b2lkIFNldEZpbmRlcihGaW5kZXIqIGZpbmRlcikgeworICAgICAgZmluZGVyXyA9IGZpbmRlcjsKKyAgICB9CisKKyAgICAvLyBTZXRzIHdoZXJlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJzZSB3aWxsIGJlIHdyaXR0ZW4uIElmIE5VTEwKKyAgICAvLyAodGhlIGRlZmF1bHQpLCB0aGVuIG5vIGxvY2F0aW9uIHdpbGwgYmUgd3JpdHRlbi4KKyAgICB2b2lkIFdyaXRlTG9jYXRpb25zVG8oUGFyc2VJbmZvVHJlZSogdHJlZSkgeworICAgICAgcGFyc2VfaW5mb190cmVlXyA9IHRyZWU7CisgICAgfQorCisgICAgLy8gTm9ybWFsbHkgcGFyc2luZyBmYWlscyBpZiwgYWZ0ZXIgcGFyc2luZywgb3V0cHV0LT5Jc0luaXRpYWxpemVkKCkKKyAgICAvLyByZXR1cm5zIGZhbHNlLiAgQ2FsbCBBbGxvd1BhcnRpYWxNZXNzYWdlKHRydWUpIHRvIHNraXAgdGhpcyBjaGVjay4KKyAgICB2b2lkIEFsbG93UGFydGlhbE1lc3NhZ2UoYm9vbCBhbGxvdykgeworICAgICAgYWxsb3dfcGFydGlhbF8gPSBhbGxvdzsKKyAgICB9CisKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcKKyAgICBib29sIFBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KTsKKworCisgICBwcml2YXRlOgorICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBwYXJzZSB0ZXh0CisgICAgLy8gcmVwcmVzZW50YXRpb25zIChzZWUgdGV4dF9mb3JtYXQuY2MgZm9yIGltcGxlbWVudGF0aW9uKS4KKyAgICBjbGFzcyBQYXJzZXJJbXBsOworCisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpNZXJnZSgpLiAgVGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIGlzIHVzZWQKKyAgICAvLyB0byBkbyB0aGUgcGFyc2luZy4KKyAgICBib29sIE1lcmdlVXNpbmdJbXBsKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlckltcGwqIHBhcnNlcl9pbXBsKTsKKworICAgIGlvOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKKyAgICBGaW5kZXIqIGZpbmRlcl87CisgICAgUGFyc2VJbmZvVHJlZSogcGFyc2VfaW5mb190cmVlXzsKKyAgICBib29sIGFsbG93X3BhcnRpYWxfOworICAgIGJvb2wgYWxsb3dfdW5rbm93bl9maWVsZF87CisgIH07CisKKyBwcml2YXRlOgorICAvLyBIYWNrOiBQYXJzZUluZm9UcmVlIGRlY2xhcmVzIFRleHRGb3JtYXQgYXMgYSBmcmllbmQgd2hpY2ggc2hvdWxkIGV4dGVuZAorICAvLyB0aGUgZnJpZW5kc2hpcCB0byBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlckltcGwsIGJ1dCB1bmZvcnR1bmF0ZWx5IHNvbWUKKyAgLy8gb2xkIGNvbXBpbGVycyAoZS5nLiBHQ0MgMy40LjYpIGRvbid0IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseS4gV2UgcHJvdmlkZQorICAvLyBoZWxwZXJzIGZvciBQYXJzZXJJbXBsIHRvIGNhbGwgbWV0aG9kcyBvZiBQYXJzZUluZm9UcmVlLgorICBzdGF0aWMgaW5saW5lIHZvaWQgUmVjb3JkTG9jYXRpb24oUGFyc2VJbmZvVHJlZSogaW5mb190cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlTG9jYXRpb24gbG9jYXRpb24pOworICBzdGF0aWMgaW5saW5lIFBhcnNlSW5mb1RyZWUqIENyZWF0ZU5lc3RlZChQYXJzZUluZm9UcmVlKiBpbmZvX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0Rm9ybWF0KTsKK307CisKK2lubGluZSB2b2lkIFRleHRGb3JtYXQ6OlJlY29yZExvY2F0aW9uKFBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUxvY2F0aW9uIGxvY2F0aW9uKSB7CisgIGluZm9fdHJlZS0+UmVjb3JkTG9jYXRpb24oZmllbGQsIGxvY2F0aW9uKTsKK30KKworaW5saW5lIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIFRleHRGb3JtYXQ6OkNyZWF0ZU5lc3RlZCgKKyAgICBQYXJzZUluZm9UcmVlKiBpbmZvX3RyZWUsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGluZm9fdHJlZS0+Q3JlYXRlTmVzdGVkKGZpZWxkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1RFWFRfRk9STUFUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGZiODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMjQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBDYW4ndCB1c2UgYW4gYW5vbnltb3VzIG5hbWVzcGFjZSBoZXJlIGR1ZSB0byBicm9rZW5uZXNzIG9mIFRydTY0IGNvbXBpbGVyLgorbmFtZXNwYWNlIHRleHRfZm9ybWF0X3VuaXR0ZXN0IHsKKworaW5saW5lIGJvb2wgSXNOYU4oZG91YmxlIHZhbHVlKSB7CisgIC8vIE5hTiBpcyBuZXZlciBlcXVhbCB0byBhbnl0aGluZywgZXZlbiBpdHNlbGYuCisgIHJldHVybiB2YWx1ZSAhPSB2YWx1ZTsKK30KKworLy8gQSBiYXNpYyBzdHJpbmcgd2l0aCBkaWZmZXJlbnQgZXNjYXBhYmxlIGNoYXJhY3RlcnMgZm9yIHRlc3RpbmcuCitjb25zdCBzdHJpbmcga0VzY2FwZVRlc3RTdHJpbmcgPQorICAiXCJBIHN0cmluZyB3aXRoICcgY2hhcmFjdGVycyBcbiBhbmQgXHIgbmV3bGluZXMgYW5kIFx0IHRhYnMgYW5kIFwwMDEgIgorICAic2xhc2hlcyBcXCBhbmQgIG11bHRpcGxlICAgc3BhY2VzIjsKKworLy8gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWJvdmUgc3RyaW5nIHdpdGggYWxsIHRoZSBjaGFyYWN0ZXJzIGVzY2FwZWQuCitjb25zdCBzdHJpbmcga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkID0KKyAgIlwiXFxcIkEgc3RyaW5nIHdpdGggXFwnIGNoYXJhY3RlcnMgXFxuIGFuZCBcXHIgbmV3bGluZXMgIgorICAiYW5kIFxcdCB0YWJzIGFuZCBcXDAwMSBzbGFzaGVzIFxcXFwgYW5kICBtdWx0aXBsZSAgIHNwYWNlc1wiIjsKKworY2xhc3MgVGV4dEZvcm1hdFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZSgKKyAgICAgICAgVGVzdFNvdXJjZURpcigpCisgICAgICAgICsgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQiLAorICAgICAgICAmc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ18pOworICB9CisKKyAgVGV4dEZvcm1hdFRlc3QoKSA6IHByb3RvX2RlYnVnX3N0cmluZ18oc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ18pIHt9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIERlYnVnIHN0cmluZyByZWFkIGZyb20gdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQuCisgIGNvbnN0IHN0cmluZyBwcm90b19kZWJ1Z19zdHJpbmdfOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvXzsKKworIHByaXZhdGU6CisgIHN0YXRpYyBzdHJpbmcgc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ187Cit9Oworc3RyaW5nIFRleHRGb3JtYXRUZXN0OjpzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXzsKKworY2xhc3MgVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoCisgICAgICAgIFRlc3RTb3VyY2VEaXIoKQorICAgICAgICArICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhLyIKKyAgICAgICAgICAidGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCIsCisgICAgICAgICZzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXyk7CisgIH0KKworICBUZXh0Rm9ybWF0RXh0ZW5zaW9uc1Rlc3QoKQorICAgICAgOiBwcm90b19kZWJ1Z19zdHJpbmdfKHN0YXRpY19wcm90b19kZWJ1Z19zdHJpbmdfKSB7fQorCisgcHJvdGVjdGVkOgorICAvLyBEZWJ1ZyBzdHJpbmcgcmVhZCBmcm9tIHRleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0LgorICBjb25zdCBzdHJpbmcgcHJvdG9fZGVidWdfc3RyaW5nXzsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHByb3RvXzsKKworIHByaXZhdGU6CisgIHN0YXRpYyBzdHJpbmcgc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ187Cit9Oworc3RyaW5nIFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdDo6c3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ187CisKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBCYXNpYykgeworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZwcm90b18pOworICBFWFBFQ1RfRVEocHJvdG9fZGVidWdfc3RyaW5nXywgcHJvdG9fLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0LCBFeHRlbnNpb25zKSB7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZwcm90b18pOworICBFWFBFQ1RfRVEocHJvdG9fZGVidWdfc3RyaW5nXywgcHJvdG9fLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFNob3J0RGVidWdTdHJpbmcpIHsKKyAgcHJvdG9fLnNldF9vcHRpb25hbF9pbnQzMigxKTsKKyAgcHJvdG9fLnNldF9vcHRpb25hbF9zdHJpbmcoImhlbGxvIik7CisgIHByb3RvXy5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigyKTsKKyAgcHJvdG9fLm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCk7CisKKyAgRVhQRUNUX0VRKCJvcHRpb25hbF9pbnQzMjogMSBvcHRpb25hbF9zdHJpbmc6IFwiaGVsbG9cIiAiCisgICAgICAgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyBiYjogMiB9ICIKKyAgICAgICAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgeyB9IiwKKyAgICAgICAgICAgIHByb3RvXy5TaG9ydERlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFNob3J0UHJpbWl0aXZlUmVwZWF0ZWRzKSB7CisgIHByb3RvXy5zZXRfb3B0aW9uYWxfaW50MzIoMTIzKTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9pbnQzMig0NTYpOworICBwcm90b18uYWRkX3JlcGVhdGVkX2ludDMyKDc4OSk7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJmb28iKTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9zdHJpbmcoImJhciIpOworICBwcm90b18uYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigyKTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMyk7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0odW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRVc2VTaG9ydFJlcGVhdGVkUHJpbWl0aXZlcyh0cnVlKTsKKyAgc3RyaW5nIHRleHQ7CisgIHByaW50ZXIuUHJpbnRUb1N0cmluZyhwcm90b18sICZ0ZXh0KTsKKworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX2ludDMyOiAxMjNcbiIKKyAgICAgICAgICAgICJyZXBlYXRlZF9pbnQzMjogWzQ1NiwgNzg5XVxuIgorICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJmb29cIlxuIgorICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJiYXJcIlxuIgorICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiAgYmI6IDJcbn1cbiIKKyAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4gIGJiOiAzXG59XG4iCisgICAgICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFtGT08sIEJBUl1cbiIsCisgICAgICAgICAgICB0ZXh0KTsKKworICAvLyBUcnkgaW4gc2luZ2xlLWxpbmUgbW9kZS4KKyAgcHJpbnRlci5TZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKHByb3RvXywgJnRleHQpOworCisgIEVYUEVDVF9FUSgib3B0aW9uYWxfaW50MzI6IDEyMyAiCisgICAgICAgICAgICAicmVwZWF0ZWRfaW50MzI6IFs0NTYsIDc4OV0gIgorICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJmb29cIiAiCisgICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImJhclwiICIKKyAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAyIH0gIgorICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgYmI6IDMgfSAiCisgICAgICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFtGT08sIEJBUl0gIiwKKyAgICAgICAgICAgIHRleHQpOworfQorCisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgU3RyaW5nRXNjYXBlKSB7CisgIC8vIFNldCB0aGUgc3RyaW5nIHZhbHVlIHRvIHRlc3QuCisgIHByb3RvXy5zZXRfb3B0aW9uYWxfc3RyaW5nKGtFc2NhcGVUZXN0U3RyaW5nKTsKKworICAvLyBHZXQgdGhlIERlYnVnU3RyaW5nIGZyb20gdGhlIHByb3RvLgorICBzdHJpbmcgZGVidWdfc3RyaW5nID0gcHJvdG9fLkRlYnVnU3RyaW5nKCk7CisgIHN0cmluZyB1dGY4X2RlYnVnX3N0cmluZyA9IHByb3RvXy5VdGY4RGVidWdTdHJpbmcoKTsKKworICAvLyBIYXJkY29kZSBhIGNvcnJlY3QgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICBzdHJpbmcgY29ycmVjdF9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiAiCisgICAgICArIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZAorICAgICAgICsgIlxuIjsKKworICAvLyBDb21wYXJlLgorICBFWFBFQ1RfRVEoY29ycmVjdF9zdHJpbmcsIGRlYnVnX3N0cmluZyk7CisgIC8vIFVURi04IHN0cmluZyBpcyB0aGUgc2FtZSBhcyBub24tVVRGLTggYmVjYXVzZQorICAvLyB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5zIG5vIFVURi04IHRleHQuCisgIEVYUEVDVF9FUShjb3JyZWN0X3N0cmluZywgdXRmOF9kZWJ1Z19zdHJpbmcpOworCisgIHN0cmluZyBleHBlY3RlZF9zaG9ydF9kZWJ1Z19zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiAiCisgICAgICArIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZDsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX3Nob3J0X2RlYnVnX3N0cmluZywgcHJvdG9fLlNob3J0RGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgVXRmOERlYnVnU3RyaW5nKSB7CisgIC8vIFNldCB0aGUgc3RyaW5nIHZhbHVlIHRvIHRlc3QuCisgIHByb3RvXy5zZXRfb3B0aW9uYWxfc3RyaW5nKCJcMzUwXDI2MFwyNjdcMzQ2XDI1NVwyMTQiKTsKKworICAvLyBHZXQgdGhlIERlYnVnU3RyaW5nIGZyb20gdGhlIHByb3RvLgorICBzdHJpbmcgZGVidWdfc3RyaW5nID0gcHJvdG9fLkRlYnVnU3RyaW5nKCk7CisgIHN0cmluZyB1dGY4X2RlYnVnX3N0cmluZyA9IHByb3RvXy5VdGY4RGVidWdTdHJpbmcoKTsKKworICAvLyBIYXJkY29kZSBhIGNvcnJlY3QgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICBzdHJpbmcgY29ycmVjdF91dGY4X3N0cmluZyA9ICJvcHRpb25hbF9zdHJpbmc6ICIKKyAgICAgICJcIlwzNTBcMjYwXDI2N1wzNDZcMjU1XDIxNFwiIgorICAgICAgIlxuIjsKKyAgc3RyaW5nIGNvcnJlY3Rfc3RyaW5nID0gIm9wdGlvbmFsX3N0cmluZzogIgorICAgICAgIlwiXFwzNTBcXDI2MFxcMjY3XFwzNDZcXDI1NVxcMjE0XCIiCisgICAgICAiXG4iOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUShjb3JyZWN0X3V0Zjhfc3RyaW5nLCB1dGY4X2RlYnVnX3N0cmluZyk7CisgIEVYUEVDVF9FUShjb3JyZWN0X3N0cmluZywgZGVidWdfc3RyaW5nKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludFVua25vd25GaWVsZHMpIHsKKyAgLy8gVGVzdCBwcmludGluZyBvZiB1bmtub3duIGZpZWxkcyBpbiBhIG1lc3NhZ2UuCisKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTsKKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyA9IG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOworCisgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoNSwgMSk7CisgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKDUsIDIpOworICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQ2NCg1LCAzKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZCg1LCAiNCIpOworICB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAoNSktPkFkZFZhcmludCgxMCwgNSk7CisKKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg4LCAxKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg4LCAyKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg4LCAzKTsKKworICBFWFBFQ1RfRVEoCisgICAgIjU6IDFcbiIKKyAgICAiNTogMHgwMDAwMDAwMlxuIgorICAgICI1OiAweDAwMDAwMDAwMDAwMDAwMDNcbiIKKyAgICAiNTogXCI0XCJcbiIKKyAgICAiNSB7XG4iCisgICAgIiAgMTA6IDVcbiIKKyAgICAifVxuIgorICAgICI4OiAxXG4iCisgICAgIjg6IDJcbiIKKyAgICAiODogM1xuIiwKKyAgICBtZXNzYWdlLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50VW5rbm93bk1lc3NhZ2UpIHsKKyAgLy8gVGVzdCBoZXVyaXN0aWMgcHJpbnRpbmcgb2YgbWVzc2FnZXMgaW4gYW4gVW5rbm93bkZpZWxkU2V0LgorCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICAvLyBDYXNlcyB3aGljaCBzaG91bGQgbm90IGJlIGludGVycHJldGVkIGFzIHN1Yi1tZXNzYWdlcy4KKworICAvLyAnYScgaXMgYSB2YWxpZCBGSVhFRDY0IHRhZywgc28gZm9yIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VhYmxlIGFzIGEgbWVzc2FnZQorICAvLyBpdCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgOCBieXRlcy4gIFNpbmNlIHRoaXMgc3RyaW5nIG9ubHkgaGFzIHR3bworICAvLyBzdWJzZXF1ZW50IGJ5dGVzLCBpdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhYmMiKTsKKworICAvLyAnZCcgaGFwcGVucyB0byBiZSBhIHZhbGlkIEVOREdST1VQIHRhZy4gIFNvLAorICAvLyBVbmtub3duRmllbGRTZXQ6Ok1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgd2lsbCBzdWNjZXNzZnVsbHkgcGFyc2UgImRlZiIsIGJ1dAorICAvLyB0aGUgQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgY2hlY2sgc2hvdWxkIGZhaWwuCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7CisKKyAgLy8gQSB6ZXJvLWxlbmd0aCBzdHJpbmcgc2hvdWxkIG5ldmVyIGJlIGludGVycHJldGVkIGFzIGEgbWVzc2FnZSBldmVuIHRob3VnaAorICAvLyBpdCBpcyB0ZWNobmljYWxseSB2YWxpZCBhcyBvbmUuCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiIik7CisKKyAgLy8gQ2FzZSB3aGljaCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzdWItbWVzc2FnZS4KKworICAvLyBBbiBhY3R1YWwgbmVzdGVkIG1lc3NhZ2Ugd2l0aCBjb250ZW50IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZWQgYXMgYQorICAvLyBuZXN0ZWQgbWVzc2FnZS4KKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEyMyk7CisKKyAgc3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIHN0cmluZyB0ZXh0OworICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7CisgIEVYUEVDVF9UUlVFKHVua25vd25fZmllbGRzLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nKHVua25vd25fZmllbGRzLCAmdGV4dCkpOworICBFWFBFQ1RfRVEoCisgICAgIjQ0OiBcImFiY1wiXG4iCisgICAgIjQ0OiBcImRlZlwiXG4iCisgICAgIjQ0OiBcIlwiXG4iCisgICAgIjQ4IHtcbiIKKyAgICAiICAxOiAxMjNcbiIKKyAgICAifVxuIiwKKyAgICB0ZXh0KTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludE1lc3NhZ2VXaXRoSW5kZW50KSB7CisgIC8vIFRlc3QgYWRkaW5nIGFuIGluaXRpYWwgaW5kZW50IHRvIHByaW50aW5nLgorCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImFiYyIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImRlZiIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMTIzKTsKKworICBzdHJpbmcgdGV4dDsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlNldEluaXRpYWxJbmRlbnRMZXZlbCgxKTsKKyAgRVhQRUNUX1RSVUUocHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KSk7CisgIEVYUEVDVF9FUSgKKyAgICAiICByZXBlYXRlZF9zdHJpbmc6IFwiYWJjXCJcbiIKKyAgICAiICByZXBlYXRlZF9zdHJpbmc6IFwiZGVmXCJcbiIKKyAgICAiICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4iCisgICAgIiAgICBiYjogMTIzXG4iCisgICAgIiAgfVxuIiwKKyAgICB0ZXh0KTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludE1lc3NhZ2VTaW5nbGVMaW5lKSB7CisgIC8vIFRlc3QgcHJpbnRpbmcgYSBtZXNzYWdlIG9uIGEgc2luZ2xlIGxpbmUuCisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMjMpOworCisgIHN0cmluZyB0ZXh0OworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuU2V0SW5pdGlhbEluZGVudExldmVsKDEpOworICBwcmludGVyLlNldFNpbmdsZUxpbmVNb2RlKHRydWUpOworICBFWFBFQ1RfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpKTsKKyAgRVhQRUNUX0VRKAorICAgICIgIHJlcGVhdGVkX3N0cmluZzogXCJhYmNcIiByZXBlYXRlZF9zdHJpbmc6IFwiZGVmXCIgIgorICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAxMjMgfSAiLAorICAgIHRleHQpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50QnVmZmVyVG9vU21hbGwpIHsKKyAgLy8gVGVzdCBwcmludGluZyBhIG1lc3NhZ2UgdG8gYSBidWZmZXIgdGhhdCBpcyB0b28gc21hbGwuCisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7CisKKyAgY2hhciBidWZmZXJbMV0gPSAiIjsKKyAgaW86OkFycmF5T3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oYnVmZmVyLCAxKTsKKyAgRVhQRUNUX0ZBTFNFKFRleHRGb3JtYXQ6OlByaW50KG1lc3NhZ2UsICZvdXRwdXRfc3RyZWFtKSk7CisgIEVYUEVDVF9FUShidWZmZXJbMF0sICdyJyk7CisgIEVYUEVDVF9FUShvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpLCAxKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZUJhc2ljKSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwcm90b19kZWJ1Z19zdHJpbmdfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX2RlYnVnX3N0cmluZ18uc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQocHJvdG9fKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdCwgUGFyc2VFeHRlbnNpb25zKSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwcm90b19kZWJ1Z19zdHJpbmdfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX2RlYnVnX3N0cmluZ18uc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KHByb3RvXyk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFbnVtRmllbGRGcm9tTnVtYmVyKSB7CisgIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIGEgbnVtZXJpY2FsIHZhbHVlIGZvciBhbiBlbnVtIGZpZWxkLgorICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgib3B0aW9uYWxfbmVzdGVkX2VudW06ICQwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHBhcnNlX3N0cmluZywgJnByb3RvXykpOworICBFWFBFQ1RfVFJVRShwcm90b18uaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBwcm90b18ub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFbnVtRmllbGRGcm9tTmVnYXRpdmVOdW1iZXIpIHsKKyAgQVNTRVJUX0xUKHVuaXR0ZXN0OjpTUEFSU0VfRSwgMCk7CisgIHN0cmluZyBwYXJzZV9zdHJpbmcgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKCJzcGFyc2VfZW51bTogJDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6U1BBUlNFX0UpOworICB1bml0dGVzdDo6U3BhcnNlRW51bU1lc3NhZ2UgcHJvdG87CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90bykpOworICBFWFBFQ1RfVFJVRShwcm90by5oYXNfc3BhcnNlX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6U1BBUlNFX0UsIHByb3RvLnNwYXJzZV9lbnVtKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU3RyaW5nRXNjYXBlKSB7CisgIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIGVzY3BhZWQgY2hhcmFjdGVycyBpbiBpdC4KKyAgc3RyaW5nIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9zdHJpbmc6ICIKKyAgICAgICsga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkCisgICAgICArICJcbiI7CisKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKHBhcnNlX3N0cmluZy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcuc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKGtFc2NhcGVUZXN0U3RyaW5nLCBwcm90b18ub3B0aW9uYWxfc3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlQ29uY2F0ZW5hdGVkU3RyaW5nKSB7CisgIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIG11bHRpcGxlIHBhcnRzIG9uIG9uZSBsaW5lLgorICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIiBcImJhclwiXG4iOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbTEocGFyc2Vfc3RyaW5nLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZy5zaXplKCkpOworICBUZXh0Rm9ybWF0OjpQYXJzZSgmaW5wdXRfc3RyZWFtMSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKCJmb29iYXIiLCBwcm90b18ub3B0aW9uYWxfc3RyaW5nKCkpOworCisgIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIG11bHRpcGxlIHBhcnRzIG9uIHNlcGVyYXRlIGxpbmVzLgorICBwYXJzZV9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiXG4iCisgICAgICAgICAgICAgICAgICJcImJhclwiXG4iOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbTIocGFyc2Vfc3RyaW5nLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZy5zaXplKCkpOworICBUZXh0Rm9ybWF0OjpQYXJzZSgmaW5wdXRfc3RyZWFtMiwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKCJmb29iYXIiLCBwcm90b18ub3B0aW9uYWxfc3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlRmxvYXRXaXRoU3VmZml4KSB7CisgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcGFyc2UgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSB3aXRoICdmJyBhcHBlbmRlZCB0byB0aGUKKyAgLy8gZW5kLiAgVGhpcyBpcyBuZWVkZWQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLgorCisgIC8vIEhhdmUgaXQgcGFyc2UgYSBmbG9hdCB3aXRoIHRoZSAnZicgc3VmZml4LgorICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX2Zsb2F0OiAxLjBmXG4iOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwYXJzZV9zdHJpbmcuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RyaW5nLnNpemUoKSk7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKDEuMCwgcHJvdG9fLm9wdGlvbmFsX2Zsb2F0KCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU2hvcnRSZXBlYXRlZEZvcm0pIHsKKyAgc3RyaW5nIHBhcnNlX3N0cmluZyA9CisgICAgICAvLyBNaXhlZCBzaG9ydC1mb3JtIGFuZCBsb25nLWZvcm0gYXJlIHNpbXBseSBjb25jYXRlbmF0ZWQuCisgICAgICAicmVwZWF0ZWRfaW50MzI6IDFcbiIKKyAgICAgICJyZXBlYXRlZF9pbnQzMjogWzQ1NiwgNzg5XVxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9lbnVtOiBbICBGT08gLEJBUiwgIyBjb21tZW50XG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIDNdXG4iCisgICAgICAvLyBOb3RlIHRoYXQgd2hpbGUgdGhlIHByaW50ZXIgd29uJ3QgcHJpbnQgcmVwZWF0ZWQgc3RyaW5ncyBpbiBzaG9ydC1mb3JtLAorICAgICAgLy8gdGhlIHBhcnNlciB3aWxsIGFjY2VwdCB0aGVtLgorICAgICAgInJlcGVhdGVkX3N0cmluZzogWyBcImZvb1wiLCAnYmFyJyBdXG4iOworCisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90b18pKTsKKworICBBU1NFUlRfRVEoMywgcHJvdG9fLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBwcm90b18ucmVwZWF0ZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoNDU2LCBwcm90b18ucmVwZWF0ZWRfaW50MzIoMSkpOworICBFWFBFQ1RfRVEoNzg5LCBwcm90b18ucmVwZWF0ZWRfaW50MzIoMikpOworCisgIEFTU0VSVF9FUSgzLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9lbnVtKDIpKTsKKworICBBU1NFUlRfRVEoMiwgcHJvdG9fLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHByb3RvXy5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBFWFBFQ1RfRVEoImJhciIsIHByb3RvXy5yZXBlYXRlZF9zdHJpbmcoMSkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIENvbW1lbnRzKSB7CisgIC8vIFRlc3QgdGhhdCBjb21tZW50cyBhcmUgaWdub3JlZC4KKworICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX2ludDMyOiAxICAjIGEgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2ludDY0OiAyICAjIGFub3RoZXIgY29tbWVudCI7CisKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKHBhcnNlX3N0cmluZy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcuc2l6ZSgpKTsKKworICBUZXh0Rm9ybWF0OjpQYXJzZSgmaW5wdXRfc3RyZWFtLCAmcHJvdG9fKTsKKworICAvLyBDb21wYXJlLgorICBFWFBFQ1RfRVEoMSwgcHJvdG9fLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoMiwgcHJvdG9fLm9wdGlvbmFsX2ludDY0KCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIE9wdGlvbmFsQ29sb24pIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbiBwbGFjZSBhICc6JyBhZnRlciB0aGUgZmllbGQgbmFtZSBvZiBhIG5lc3RlZCBtZXNzYWdlLAorICAvLyBldmVuIHRob3VnaCB3ZSBkb24ndCBoYXZlIHRvLgorCisgIHN0cmluZyBwYXJzZV9zdHJpbmcgPSAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U6IHsgYmI6IDF9XG4iOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwYXJzZV9zdHJpbmcuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RyaW5nLnNpemUoKSk7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX1RSVUUocHJvdG9fLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDEsIHByb3RvXy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworfQorCisvLyBTb21lIHBsYXRmb3JtcyAoZS5nLiBXaW5kb3dzKSBpbnNpc3Qgb24gcGFkZGluZyB0aGUgZXhwb25lbnQgdG8gdGhyZWUKKy8vIGRpZ2l0cyB3aGVuIG9uZSBvciB0d28gd291bGQgYmUganVzdCBmaW5lLgorc3RhdGljIHN0cmluZyBSZW1vdmVSZWR1bmRhbnRaZXJvcyhzdHJpbmcgdGV4dCkgeworICB0ZXh0ID0gU3RyaW5nUmVwbGFjZSh0ZXh0LCAiZSswIiwgImUrIiwgdHJ1ZSk7CisgIHRleHQgPSBTdHJpbmdSZXBsYWNlKHRleHQsICJlLTAiLCAiZS0iLCB0cnVlKTsKKyAgcmV0dXJuIHRleHQ7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUHJpbnRFeG90aWMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIC8vIE5vdGU6ICBJbiBDLCBhIG5lZ2F0aXZlIGludGVnZXIgbGl0ZXJhbCBpcyBhY3R1YWxseSB0aGUgdW5hcnkgbmVnYXRpb24KKyAgLy8gICBvcGVyYXRvciBiZWluZyBhcHBsaWVkIHRvIGEgcG9zaXRpdmUgaW50ZWdlciBsaXRlcmFsLCBhbmQKKyAgLy8gICA5MjIzMzcyMDM2ODU0Nzc1ODA4IGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIGludDY0LiAgSG93ZXZlciwgaXQgaXMgbm90CisgIC8vICAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdWludDY0LiAgQ29uZnVzaW5nbHksIHRoaXMgbWVhbnMgdGhhdCBldmVyeXRoaW5nCisgIC8vICAgd29ya3MgaWYgd2UgbWFrZSB0aGUgbGl0ZXJhbCB1bnNpZ25lZCwgZXZlbiB0aG91Z2ggd2UgYXJlIG5lZ2F0aW5nIGl0LgorICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQ2NCgtR09PR0xFX1VMT05HTE9ORyg5MjIzMzcyMDM2ODU0Nzc1ODA4KSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3VpbnQ2NChHT09HTEVfVUxPTkdMT05HKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxMjMuNDU2KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjNlMjEpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yM2UtMTgpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZyhzdHJpbmcoIlwwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnXCIiLCAxMikpOworCisgIC8vIEZ1biBzdG9yeTogIFdlIHVzZWQgdG8gdXNlIDEuMjNlMjIgaW5zdGVhZCBvZiAxLjIzZTIxIGFib3ZlLCBidXQgdGhpcworICAvLyAgIHNlZW1lZCB0byB0cmlnZ2VyIGFuIG9kZCBjYXNlIG9uIE1pbkdXL0dDQyAzLjQuNSB3aGVyZSBHQ0MncyBwYXJzaW5nIG9mCisgIC8vICAgdGhlIHZhbHVlIGRpZmZlcmVkIGZyb20gc3RydG9kKCkncyBwYXJzaW5nLiAgVGhhdCBpcyB0byBzYXksIHRoZQorICAvLyAgIGZvbGxvd2luZyBhc3NlcnRpb24gZmFpbHMgb24gTWluR1c6CisgIC8vICAgICBhc3NlcnQoMS4yM2UyMiA9PSBzdHJ0b2QoIjEuMjNlMjIiLCBOVUxMKSk7CisgIC8vICAgQXMgYSByZXN1bHQsIFNpbXBsZUR0b2EoKSB3b3VsZCBwcmludCB0aGUgdmFsdWUgYXMKKyAgLy8gICAiMS4yMzAwMDAwMDAwMDAwMDAxZSsyMiIgdG8gbWFrZSBzdXJlIHN0cnRvZCgpIHByb2R1Y2UgdGhlIGV4YWN0IHNhbWUKKyAgLy8gICByZXN1bHQuICBPdXIgZ29hbCBpcyB0byB0ZXN0IHJ1bnRpbWUgcGFyc2luZywgbm90IGNvbXBpbGUtdGltZSBwYXJzaW5nLAorICAvLyAgIHNvIHRoaXMgd2Fzbid0IG91ciBwcm9ibGVtLiAgSXQgd2FzIGZvdW5kIHRoYXQgdXNpbmcgMS4yM2UyMSBkaWQgbm90CisgIC8vICAgaGF2ZSB0aGlzIHByb2JsZW0sIHNvIHdlIHN3aXRjaGVkIHRvIHRoYXQgaW5zdGVhZC4KKworICBFWFBFQ1RfRVEoCisgICAgInJlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuIgorICAgICJyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjQ1NlxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjNlKzIxXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM2UtMThcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiBpbmZcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAtaW5mXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogbmFuXG4iCisgICAgInJlcGVhdGVkX3N0cmluZzogXCJcXDAwMFxcMDAxXFwwMDdcXDAxMFxcMDE0XFxuXFxyXFx0XFwwMTNcXFxcXFwnXFxcIlwiXG4iLAorICAgIFJlbW92ZVJlZHVuZGFudFplcm9zKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50RmxvYXRQcmVjaXNpb24pIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2Zsb2F0KDEuMik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2Zsb2F0KDEuMjMpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2Zsb2F0KDEuMjM0NSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2Zsb2F0KDEuMjM0NTYpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjJlMTApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzRlMTApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDVlMTApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDU2ZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3OCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4Nyk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1NCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NTQzKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMmUxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yM2UxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzRlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NWUxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1NmUxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1NjdlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3OGUxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OWUxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OThlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4N2UxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3NmUxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3NjVlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1NGUxMDApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3NjU0M2UxMDApOworCisgIEVYUEVDVF9FUSgKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMlxuIgorICAgICJyZXBlYXRlZF9mbG9hdDogMS4yM1xuIgorICAgICJyZXBlYXRlZF9mbG9hdDogMS4yMzRcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NVxuIgorICAgICJyZXBlYXRlZF9mbG9hdDogMS4yMzQ1NlxuIgorICAgICJyZXBlYXRlZF9mbG9hdDogMS4yZSsxMFxuIgorICAgICJyZXBlYXRlZF9mbG9hdDogMS4yM2UrMTBcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0ZSsxMFxuIgorICAgICJyZXBlYXRlZF9mbG9hdDogMS4yMzQ1ZSsxMFxuIgorICAgICJyZXBlYXRlZF9mbG9hdDogMS4yMzQ1NmUrMTBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjJcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzRcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDVcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NjdcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2NzhcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OThcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODdcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjVcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2NTRcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2NTQzXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNGUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1ZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2ZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2N2UrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4ZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5OGUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3ZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2ZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2NWUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0ZSsxMDBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2NTQzZSsxMDBcbiIsCisgICAgUmVtb3ZlUmVkdW5kYW50WmVyb3MobWVzc2FnZS5EZWJ1Z1N0cmluZygpKSk7Cit9CisKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBBbGxvd1BhcnRpYWwpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBwYXJzZXIuQWxsb3dQYXJ0aWFsTWVzc2FnZSh0cnVlKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygiYTogMSIsICZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLmEoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZUV4b3RpYykgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAicmVwZWF0ZWRfaW50MzI6IC0xXG4iCisgICAgInJlcGVhdGVkX2ludDMyOiAtMjE0NzQ4MzY0OFxuIgorICAgICJyZXBlYXRlZF9pbnQ2NDogLTFcbiIKKyAgICAicmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4XG4iCisgICAgInJlcGVhdGVkX3VpbnQzMjogNDI5NDk2NzI5NVxuIgorICAgICJyZXBlYXRlZF91aW50MzI6IDIxNDc0ODM2NDhcbiIKKyAgICAicmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNVxuIgorICAgICJyZXBlYXRlZF91aW50NjQ6IDkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuMFxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy41XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMC4xMjVcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzRTE3XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzVFKzIyXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzVlLTE4XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjQ1Njc4OVxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IGluZlxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IEluZmluaXR5XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogLWluZlxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IC1JbmZpbml0eVxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IG5hblxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IE5hTlxuIgorICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiXCJcbiIsCisgICAgJm1lc3NhZ2UpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoLTEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMCkpOworICAvLyBOb3RlOiAgSW4gQywgYSBuZWdhdGl2ZSBpbnRlZ2VyIGxpdGVyYWwgaXMgYWN0dWFsbHkgdGhlIHVuYXJ5IG5lZ2F0aW9uCisgIC8vICAgb3BlcmF0b3IgYmVpbmcgYXBwbGllZCB0byBhIHBvc2l0aXZlIGludGVnZXIgbGl0ZXJhbCwgYW5kIDIxNDc0ODM2NDggaXMKKyAgLy8gICBvdXRzaWRlIHRoZSByYW5nZSBvZiBpbnQzMi4gIEhvd2V2ZXIsIGl0IGlzIG5vdCBvdXRzaWRlIHRoZSByYW5nZSBvZgorICAvLyAgIHVpbnQzMi4gIENvbmZ1c2luZ2x5LCB0aGlzIG1lYW5zIHRoYXQgZXZlcnl0aGluZyB3b3JrcyBpZiB3ZSBtYWtlIHRoZQorICAvLyAgIGxpdGVyYWwgdW5zaWduZWQsIGV2ZW4gdGhvdWdoIHdlIGFyZSBuZWdhdGluZyBpdC4KKyAgRVhQRUNUX0VRKC0yMTQ3NDgzNjQ4dSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigxKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKC0xLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0KDApKTsKKyAgLy8gTm90ZTogIEluIEMsIGEgbmVnYXRpdmUgaW50ZWdlciBsaXRlcmFsIGlzIGFjdHVhbGx5IHRoZSB1bmFyeSBuZWdhdGlvbgorICAvLyAgIG9wZXJhdG9yIGJlaW5nIGFwcGxpZWQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwsIGFuZAorICAvLyAgIDkyMjMzNzIwMzY4NTQ3NzU4MDggaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgaW50NjQuICBIb3dldmVyLCBpdCBpcyBub3QKKyAgLy8gICBvdXRzaWRlIHRoZSByYW5nZSBvZiB1aW50NjQuICBDb25mdXNpbmdseSwgdGhpcyBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcKKyAgLy8gICB3b3JrcyBpZiB3ZSBtYWtlIHRoZSBsaXRlcmFsIHVuc2lnbmVkLCBldmVuIHRob3VnaCB3ZSBhcmUgbmVnYXRpbmcgaXQuCisgIEVYUEVDVF9FUSgtR09PR0xFX1VMT05HTE9ORyg5MjIzMzcyMDM2ODU0Nzc1ODA4KSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgxKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSg0Mjk0OTY3Mjk1dSwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIoMCkpOworICBFWFBFQ1RfRVEoMjE0NzQ4MzY0OHUsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDEpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKEdPT0dMRV9VTE9OR0xPTkcoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUShHT09HTEVfVUxPTkdMT05HKDkyMjMzNzIwMzY4NTQ3NzU4MDgpLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCgxKSk7CisKKyAgQVNTRVJUX0VRKDEzLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMTIzLjAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfRVEoMTIzLjUgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMSkpOworICBFWFBFQ1RfRVEoMC4xMjUgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMikpOworICBFWFBFQ1RfRVEoMS4yM0UxNyAgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMykpOworICBFWFBFQ1RfRVEoMS4yMzVFMjIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoNCkpOworICBFWFBFQ1RfRVEoMS4yMzVFLTE4ICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoNSkpOworICBFWFBFQ1RfRVEoMTIzLjQ1Njc4OSwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoNikpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoNyksIG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoOCksIG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoOSksIC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDEwKSwgLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOworICBFWFBFQ1RfVFJVRShJc05hTihtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMSkpKTsKKyAgRVhQRUNUX1RSVUUoSXNOYU4obWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMTIpKSk7CisKKyAgLy8gTm90ZTogIFNpbmNlIHRoZXNlIHN0cmluZyBsaXRlcmFscyBoYXZlIFwwJ3MgaW4gdGhlbSwgd2UgbXVzdCBleHBsaWNpdGx5CisgIC8vICAgcGFzcyB0aGVpciBzaXplcyB0byBzdHJpbmcncyBjb25zdHJ1Y3Rvci4KKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIEVYUEVDVF9FUShzdHJpbmcoIlwwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnXCIiLCAxMiksCisgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7Cit9CisKK2NsYXNzIFRleHRGb3JtYXRQYXJzZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBFeHBlY3RGYWlsdXJlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGNvbnN0IHN0cmluZyYgbWVzc2FnZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY29sKSB7CisgICAgc2NvcGVkX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBwcm90byhuZXcgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyk7CisgICAgRXhwZWN0RmFpbHVyZShpbnB1dCwgbWVzc2FnZSwgbGluZSwgY29sLCBwcm90by5nZXQoKSk7CisgIH0KKworICB2b2lkIEV4cGVjdEZhaWx1cmUoY29uc3Qgc3RyaW5nJiBpbnB1dCwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjb2wsIE1lc3NhZ2UqIHByb3RvKSB7CisgICAgRXhwZWN0TWVzc2FnZShpbnB1dCwgbWVzc2FnZSwgbGluZSwgY29sLCBwcm90bywgZmFsc2UpOworICB9CisKKyAgdm9pZCBFeHBlY3RNZXNzYWdlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGNvbnN0IHN0cmluZyYgbWVzc2FnZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY29sLCBNZXNzYWdlKiBwcm90bywgYm9vbCBleHBlY3RlZF9yZXN1bHQpIHsKKyAgICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICAgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgICAgcGFyc2VyLlJlY29yZEVycm9yc1RvKCZlcnJvcl9jb2xsZWN0b3IpOworICAgIEVYUEVDVF9FUShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKGlucHV0LCBwcm90byksIGV4cGVjdGVkX3Jlc3VsdCk7CisgICAgRVhQRUNUX0VRKFNpbXBsZUl0b2EobGluZSkgKyAiOiIgKyBTaW1wbGVJdG9hKGNvbCkgKyAiOiAiICsgbWVzc2FnZSArICJcbiIsCisgICAgICAgICAgICAgIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7CisgIH0KKworICB2b2lkIEV4cGVjdFN1Y2Nlc3NBbmRUcmVlKGNvbnN0IHN0cmluZyYgaW5wdXQsIE1lc3NhZ2UqIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSkgeworICAgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcik7CisgICAgcGFyc2VyLldyaXRlTG9jYXRpb25zVG8oaW5mb190cmVlKTsKKworICAgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoaW5wdXQsIHByb3RvKSk7CisgIH0KKworICB2b2lkIEV4cGVjdExvY2F0aW9uKFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogZCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50IGxpbmUsIGludCBjb2x1bW4pIHsKKyAgICBUZXh0Rm9ybWF0OjpQYXJzZUxvY2F0aW9uIGxvY2F0aW9uID0gdHJlZS0+R2V0TG9jYXRpb24oCisgICAgICAgIGQtPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKSwgaW5kZXgpOworICAgIEVYUEVDVF9FUShsaW5lLCBsb2NhdGlvbi5saW5lKTsKKyAgICBFWFBFQ1RfRVEoY29sdW1uLCBsb2NhdGlvbi5jb2x1bW4pOworICB9CisKKyAgLy8gQW4gZXJyb3IgY29sbGVjdG9yIHdoaWNoIHNpbXBseSBjb25jYXRlbmF0ZXMgYWxsIGl0cyBlcnJvcnMgaW50byBhIGJpZworICAvLyBibG9jayBvZiB0ZXh0IHdoaWNoIGNhbiBiZSBjaGVja2VkLgorICBjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKKyAgIHB1YmxpYzoKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICAgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorCisgICAgc3RyaW5nIHRleHRfOworCisgICAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiAkMlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArIDEsIGNvbHVtbiArIDEsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICBBZGRFcnJvcihsaW5lLCBjb2x1bW4sICJXQVJOSU5HOiIgKyBtZXNzYWdlKTsKKyAgICB9CisgIH07Cit9OworCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlSW5mb1RyZWVCdWlsZGluZykgeworICBzY29wZWRfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IG1lc3NhZ2UobmV3IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMpOworICBjb25zdCBEZXNjcmlwdG9yKiBkID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworCisgIHN0cmluZyBzdHJpbmdEYXRhID0KKyAgICAgICJvcHRpb25hbF9pbnQzMjogMVxuIgorICAgICAgIm9wdGlvbmFsX2ludDY0OiAyXG4iCisgICAgICAiICBvcHRpb25hbF9kb3VibGU6IDIuNFxuIgorICAgICAgInJlcGVhdGVkX2ludDMyOiA1XG4iCisgICAgICAicmVwZWF0ZWRfaW50MzI6IDEwXG4iCisgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPFxuIgorICAgICAgIiAgYmI6IDc4XG4iCisgICAgICAiPlxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIDxcbiIKKyAgICAgICIgIGJiOiA3OVxuIgorICAgICAgIj5cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8XG4iCisgICAgICAiICBiYjogODBcbiIKKyAgICAgICI+IjsKKworCisgIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUgdHJlZTsKKyAgRXhwZWN0U3VjY2Vzc0FuZFRyZWUoc3RyaW5nRGF0YSwgbWVzc2FnZS5nZXQoKSwgJnRyZWUpOworCisgIC8vIFZlcmlmeSB0aGF0IHRoZSB0cmVlIGhhcyB0aGUgY29ycmVjdCBwb3NpdGlvbnMuCisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfaW50MzIiLCAtMSwgMCwgMCk7CisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfaW50NjQiLCAtMSwgMSwgMCk7CisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfZG91YmxlIiwgLTEsIDIsIDIpOworCisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfaW50MzIiLCAwLCAzLCAwKTsKKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQzMiIsIDEsIDQsIDApOworCisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiLCAtMSwgNSwgMCk7CisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiLCAwLCA4LCAwKTsKKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIsIDEsIDExLCAwKTsKKworICAvLyBDaGVjayBmb3IgZmllbGRzIG5vdCBzZXQuIEZvciBhbiBpbnZhbGlkIGZpZWxkLCB0aGUgbG9jYXRpb24gcmV0dXJuZWQKKyAgLy8gc2hvdWxkIGJlIC0xLCAtMS4KKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQ2NCIsIDAsIC0xLCAtMSk7CisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfaW50MzIiLCA2LCAtMSwgLTEpOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgInNvbWVfdW5rbm93bl9maWVsZCIsIC0xLCAtMSwgLTEpOworCisgIC8vIFZlcmlmeSBpbnNpZGUgdGhlIG5lc3RlZCBtZXNzYWdlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5lc3RlZF9maWVsZCA9CisgICAgICBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogbmVzdGVkX3RyZWUgPQorICAgICAgdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgLTEpOworICBFeHBlY3RMb2NhdGlvbihuZXN0ZWRfdHJlZSwgbmVzdGVkX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgImJiIiwgLTEsIDYsIDIpOworCisgIC8vIFZlcmlmeSBpbnNpZGUgYW5vdGhlciBuZXN0ZWQgbWVzc2FnZS4KKyAgbmVzdGVkX2ZpZWxkID0gZC0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpOworICBuZXN0ZWRfdHJlZSA9IHRyZWUuR2V0VHJlZUZvck5lc3RlZChuZXN0ZWRfZmllbGQsIDApOworICBFeHBlY3RMb2NhdGlvbihuZXN0ZWRfdHJlZSwgbmVzdGVkX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgImJiIiwgLTEsIDksIDIpOworCisgIG5lc3RlZF90cmVlID0gdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgMSk7CisgIEV4cGVjdExvY2F0aW9uKG5lc3RlZF90cmVlLCBuZXN0ZWRfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCAiYmIiLCAtMSwgMTIsIDIpOworCisgIC8vIFZlcmlmeSBhIE5VTEwgdHJlZSBmb3IgYW4gdW5rbm93biBuZXN0ZWQgZmllbGQuCisgIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIHVua25vd25fbmVzdGVkX3RyZWUgPQorICAgICAgdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgMik7CisKKyAgRVhQRUNUX0VRKE5VTEwsIHVua25vd25fbmVzdGVkX3RyZWUpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcpIHsKKyAgc2NvcGVkX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBtZXNzYWdlKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKworI2RlZmluZSBFWFBFQ1RfRklFTEQobmFtZSwgdmFsdWUsIHZhbHVlc3RyaW5nKSBcCisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoIFwKKyAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOyBcCisgIEVYUEVDVF9FUSh2YWx1ZSwgbWVzc2FnZS0+b3B0aW9uYWxfIyNuYW1lKCkpOyBcCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmhhc19vcHRpb25hbF8jI25hbWUoKSk7CisKKyNkZWZpbmUgRVhQRUNUX0JPT0xfRklFTEQobmFtZSwgdmFsdWUsIHZhbHVlc3RyaW5nKSBcCisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoIFwKKyAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOyBcCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPm9wdGlvbmFsXyMjbmFtZSgpID09IHZhbHVlKTsgXAorICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfIyNuYW1lKCkpOworCisjZGVmaW5lIEVYUEVDVF9GTE9BVF9GSUVMRChuYW1lLCB2YWx1ZSwgdmFsdWVzdHJpbmcpIFwKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyggXAorICAgIHZhbHVlc3RyaW5nLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsXyIgI25hbWUpLCBtZXNzYWdlLmdldCgpKSk7IFwKKyAgRVhQRUNUX0ZMT0FUX0VRKHZhbHVlLCBtZXNzYWdlLT5vcHRpb25hbF8jI25hbWUoKSk7IFwKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX29wdGlvbmFsXyMjbmFtZSgpKTsKKworI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgXAorICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCBcCisgICAgdmFsdWVzdHJpbmcsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfIiAjbmFtZSksIG1lc3NhZ2UuZ2V0KCkpKTsgXAorICBFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlLCBtZXNzYWdlLT5vcHRpb25hbF8jI25hbWUoKSk7IFwKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX29wdGlvbmFsXyMjbmFtZSgpKTsKKworI2RlZmluZSBFWFBFQ1RfSU5WQUxJRChuYW1lLCB2YWx1ZXN0cmluZykgXAorICBFWFBFQ1RfRkFMU0UoVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyggXAorICAgIHZhbHVlc3RyaW5nLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsXyIgI25hbWUpLCBtZXNzYWdlLmdldCgpKSk7CisKKyAgLy8gaW50MzIKKyAgRVhQRUNUX0ZJRUxEKGludDMyLCAxLCAiMSIpOworICBFWFBFQ1RfRklFTEQoaW50MzIsIC0xLCAiLTEiKTsKKyAgRVhQRUNUX0ZJRUxEKGludDMyLCAweDEyMzQsICIweDEyMzQiKTsKKyAgRVhQRUNUX0lOVkFMSUQoaW50MzIsICJhIik7CisgIEVYUEVDVF9JTlZBTElEKGludDMyLCAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Iik7CisgIEVYUEVDVF9JTlZBTElEKGludDMyLCAiMSwyIik7CisKKyAgLy8gaW50NjQKKyAgRVhQRUNUX0ZJRUxEKGludDY0LCAxLCAiMSIpOworICBFWFBFQ1RfRklFTEQoaW50NjQsIC0xLCAiLTEiKTsKKyAgRVhQRUNUX0ZJRUxEKGludDY0LCAweDEyMzQ1Njc4MTIzNDU2NzhMTCwgIjB4MTIzNDU2NzgxMjM0NTY3OCIpOworICBFWFBFQ1RfSU5WQUxJRChpbnQ2NCwgImEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoaW50NjQsICI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKTsKKyAgRVhQRUNUX0lOVkFMSUQoaW50NjQsICIxLDIiKTsKKworICAvLyB1aW50NjQKKyAgRVhQRUNUX0ZJRUxEKHVpbnQ2NCwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKHVpbnQ2NCwgMHhmMjM0NTY3ODEyMzQ1Njc4VUxMLCAiMHhmMjM0NTY3ODEyMzQ1Njc4Iik7CisgIEVYUEVDVF9JTlZBTElEKHVpbnQ2NCwgIi0xIik7CisgIEVYUEVDVF9JTlZBTElEKHVpbnQ2NCwgImEiKTsKKyAgRVhQRUNUX0lOVkFMSUQodWludDY0LCAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Iik7CisgIEVYUEVDVF9JTlZBTElEKHVpbnQ2NCwgIjEsMiIpOworCisgIC8vIGZpeGVkMzIKKyAgRVhQRUNUX0ZJRUxEKGZpeGVkMzIsIDEsICIxIik7CisgIEVYUEVDVF9GSUVMRChmaXhlZDMyLCAweDEyMzQ1Njc4LCAiMHgxMjM0NTY3OCIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDMyLCAiLTEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQzMiwgImEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQzMiwgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDMyLCAiMSwyIik7CisKKyAgLy8gZml4ZWQ2NAorICBFWFBFQ1RfRklFTEQoZml4ZWQ2NCwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKGZpeGVkNjQsIDB4MTIzNDU2NzgxMjM0NTY3OFVMTCwgIjB4MTIzNDU2NzgxMjM0NTY3OCIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDY0LCAiLTEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQ2NCwgImEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQ2NCwgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDY0LCAiMSwyIik7CisKKyAgLy8gYm9vbAorICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCB0cnVlLCAidHJ1ZSIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCBmYWxzZSwgImZhbHNlIik7CisgIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIHRydWUsICIxIik7CisgIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIHRydWUsICJ0Iik7CisgIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIGZhbHNlLCAiMCIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCBmYWxzZSwgImYiKTsKKyAgRVhQRUNUX0lOVkFMSUQoYm9vbCwgIjIiKTsKKyAgRVhQRUNUX0lOVkFMSUQoYm9vbCwgIi0wIik7CisgIEVYUEVDVF9JTlZBTElEKGJvb2wsICJvbiIpOworICBFWFBFQ1RfSU5WQUxJRChib29sLCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChib29sLCAiVHJ1ZSIpOworCisgIC8vIGZsb2F0CisgIEVYUEVDVF9GSUVMRChmbG9hdCwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZMT0FUX0ZJRUxEKGZsb2F0LCAxLjUsICIxLjUiKTsKKyAgRVhQRUNUX0ZMT0FUX0ZJRUxEKGZsb2F0LCAxLjVlMywgIjEuNWUzIik7CisgIEVYUEVDVF9GTE9BVF9GSUVMRChmbG9hdCwgLTQuNTUsICItNC41NSIpOworICBFWFBFQ1RfSU5WQUxJRChmbG9hdCwgImEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZmxvYXQsICIxLDIiKTsKKworICAvLyBkb3VibGUKKyAgRVhQRUNUX0ZJRUxEKGRvdWJsZSwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKGRvdWJsZSwgLTEsICItMSIpOworICBFWFBFQ1RfRE9VQkxFX0ZJRUxEKGRvdWJsZSwgMi4zLCAiMi4zIik7CisgIEVYUEVDVF9ET1VCTEVfRklFTEQoZG91YmxlLCAzZTUsICIzZTUiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZG91YmxlLCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChkb3VibGUsICIxLDIiKTsKKworICAvLyBzdHJpbmcKKyAgRVhQRUNUX0ZJRUxEKHN0cmluZywgImhlbGxvIiwgIlwiaGVsbG9cIiIpOworICBFWFBFQ1RfRklFTEQoc3RyaW5nLCAiLTEuODciLCAiJy0xLjg3JyIpOworICBFWFBFQ1RfSU5WQUxJRChzdHJpbmcsICJoZWxsbyIpOyAgLy8gd2l0aG91dCBxdW90ZSBmb3IgdmFsdWUKKworICAvLyBlbnVtCisgIEVYUEVDVF9GSUVMRChuZXN0ZWRfZW51bSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCAiQkFSIik7CisgIEVYUEVDVF9GSUVMRChuZXN0ZWRfZW51bSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLAorICAgICAgICAgICAgICAgU2ltcGxlSXRvYSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVopKTsKKyAgRVhQRUNUX0lOVkFMSUQobmVzdGVkX2VudW0sICJGT09CQVIiKTsKKworICAvLyBtZXNzYWdlCisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoCisgICAgIjxiYjoxMj4iLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksIG1lc3NhZ2UuZ2V0KCkpKTsKKyAgRVhQRUNUX0VRKDEyLCBtZXNzYWdlLT5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOyBcCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0lOVkFMSUQobmVzdGVkX21lc3NhZ2UsICJhbnkiKTsKKworI3VuZGVmIEVYUEVDVF9GSUVMRAorI3VuZGVmIEVYUEVDVF9CT09MX0ZJRUxECisjdW5kZWYgRVhQRUNUX0ZMT0FUX0ZJRUxECisjdW5kZWYgRVhQRUNUX0RPVUJMRV9GSUVMRAorI3VuZGVmIEVYUEVDVF9JTlZBTElECit9CisKKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBJbnZhbGlkVG9rZW4pIHsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbDogdHJ1ZVxuLTVcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsCisgICAgICAgICAgICAgICAgMiwgMSk7CisKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbDogdHJ1ZSFcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsIDEsIDIwKTsKKyAgRXhwZWN0RmFpbHVyZSgiXCJzb21lIHN0cmluZ1wiIiwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIiwgMSwgMSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZEZpZWxkTmFtZSkgeworICBFeHBlY3RGYWlsdXJlKAorICAgICAgImludmFsaWRfZmllbGQ6IHNvbWV2YWx1ZVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwiaW52YWxpZF9maWVsZFwiLiIsCisgICAgICAxLCAxNCk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZENhcGl0YWxpemF0aW9uKSB7CisgIC8vIFdlIHJlcXVpcmUgdGhhdCBncm91cCBuYW1lcyBiZSBleGFjdGx5IGFzIHRoZXkgYXBwZWFyIGluIHRoZSAucHJvdG8uCisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAib3B0aW9uYWxncm91cCB7XG5hOiAxNVxufVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwib3B0aW9uYWxncm91cFwiLiIsCisgICAgICAxLCAxNSk7CisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAiT1BUSU9OQUxncm91cCB7XG5hOiAxNVxufVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwiT1BUSU9OQUxncm91cFwiLiIsCisgICAgICAxLCAxNSk7CisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAiT3B0aW9uYWxfRG91YmxlOiAxMC4wXG4iLAorICAgICAgIk1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCBuYW1lZCAiCisgICAgICAiXCJPcHRpb25hbF9Eb3VibGVcIi4iLAorICAgICAgMSwgMTYpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEludmFsaWRGaWVsZFZhbHVlcykgeworICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYSBkb3VibGUvZmxvYXQgZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2RvdWJsZTogXCJoZWxsb1wiXG4iLCAiRXhwZWN0ZWQgZG91YmxlLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlOiB0cnVlXG4iLCAiRXhwZWN0ZWQgZG91YmxlLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlOiAhXG4iLCAiRXhwZWN0ZWQgZG91YmxlLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlIHtcbiAgXG59XG4iLCAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsCisgICAgICAgICAgICAgICAgMSwgMTcpOworCisgIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIHNpZ25lZCBpbnRlZ2VyIGZpZWxkLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMjogXCJoZWxsb1wiXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxNyk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiB0cnVlXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxNyk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiA0LjVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6ICFcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzIge1xuIFxufVxuIiwgIkV4cGVjdGVkIFwiOlwiLCBmb3VuZCBcIntcIi4iLAorICAgICAgICAgICAgICAgIDEsIDE2KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IDB4ODAwMDAwMDBcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50NjQ6IDB4ODAwMDAwMDAwMDAwMDAwMFxuIiwKKyAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTcpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMjogLTB4ODAwMDAwMDFcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50NjQ6IC0weDgwMDAwMDAwMDAwMDAwMDFcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE4KTsKKworICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYW4gdW5zaWduZWQgaW50ZWdlciBmaWVsZC4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiBcImhlbGxvXCJcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiB0cnVlXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogNC41XG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogLTVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiAhXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NCB7XG4gXG59XG4iLCAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsCisgICAgICAgICAgICAgICAgMSwgMTcpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF91aW50MzI6IDB4MTAwMDAwMDAwXG4iLAorICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogMHgxMDAwMDAwMDAwMDAwMDAwMFxuIiwKKyAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTgpOworCisgIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIGJvb2xlYW4gZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IFwiaGVsbG9cIlxuIiwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIiwgMSwgMTYpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9ib29sOiA1XG4iLCAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTYpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9ib29sOiAtNy41XG4iLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iLCAxLCAxNik7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6ICFcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsIDEsIDE2KTsKKworICBFeHBlY3RGYWlsdXJlKAorICAgICAgIm9wdGlvbmFsX2Jvb2w6IG1laFxuIiwKKyAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBib29sZWFuIGZpZWxkIFwib3B0aW9uYWxfYm9vbFwiLiBWYWx1ZTogXCJtZWhcIi4iLAorICAgICAgMiwgMSk7CisKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbCB7XG4gXG59XG4iLCAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsCisgICAgICAgICAgICAgICAgMSwgMTUpOworCisgIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIHN0cmluZyBmaWVsZC4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiB0cnVlXG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiA1XG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiAtNy41XG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiAhXG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nIHtcbiBcbn1cbiIsICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwKKyAgICAgICAgICAgICAgICAxLCAxNyk7CisKKyAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGFuIGVudW1lcmF0aW9uIGZpZWxkLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfZW51bTogXCJoZWxsb1wiXG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnRlZ2VyIG9yIGlkZW50aWZpZXIuIiwgMSwgMjMpOworCisgIC8vIFZhbGlkIHRva2VuLCBidXQgZW51bSB2YWx1ZSBpcyBub3QgZGVmaW5lZC4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfbmVzdGVkX2VudW06IDVcbiIsCisgICAgICAgICAgICAgICAgIlVua25vd24gZW51bWVyYXRpb24gdmFsdWUgb2YgXCI1XCIgZm9yIGZpZWxkICIKKyAgICAgICAgICAgICAgICAiXCJvcHRpb25hbF9uZXN0ZWRfZW51bVwiLiIsIDIsIDEpOworICAvLyBXZSBjb25zdW1lIHRoZSBuZWdhdGl2ZSBzaWduLCBzbyB0aGUgZXJyb3IgcG9zaXRpb24gc3RhcnRzIG9uZSBjaGFyYWN0ZXIKKyAgLy8gbGF0ZXIuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAtNy41XG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAyNCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAhXG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnRlZ2VyIG9yIGlkZW50aWZpZXIuIiwgMSwgMjMpOworCisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAib3B0aW9uYWxfbmVzdGVkX2VudW06IGdyYWhcbiIsCisgICAgICAiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcImdyYWhcIiBmb3IgZmllbGQgIgorICAgICAgIlwib3B0aW9uYWxfbmVzdGVkX2VudW1cIi4iLCAyLCAxKTsKKworICBFeHBlY3RGYWlsdXJlKAorICAgICAgIm9wdGlvbmFsX25lc3RlZF9lbnVtIHtcbiBcbn1cbiIsCisgICAgICAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsIDEsIDIyKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBNZXNzYWdlRGVsaW1ldGVycykgeworICAvLyBOb24tbWF0Y2hpbmcgZGVsaW1ldGVycy4KKyAgRXhwZWN0RmFpbHVyZSgiT3B0aW9uYWxHcm91cCA8XG4gXG59XG4iLCAiRXhwZWN0ZWQgXCI+XCIsIGZvdW5kIFwifVwiLiIsCisgICAgICAgICAgICAgICAgMywgMSk7CisKKyAgLy8gSW52YWxpZCBkZWxpbWV0ZXJzLgorICBFeHBlY3RGYWlsdXJlKCJPcHRpb25hbEdyb3VwIFtcbiBcbl1cbiIsICJFeHBlY3RlZCBcIntcIiwgZm91bmQgXCJbXCIuIiwKKyAgICAgICAgICAgICAgICAxLCAxNSk7CisKKyAgLy8gVW5lbmRpbmcgbWVzc2FnZS4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uge1xuIFxuYmI6IDExOFxuIiwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaWRlbnRpZmllci4iLAorICAgICAgICAgICAgICAgIDQsIDEpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFVua25vd25FeHRlbnNpb24pIHsKKyAgLy8gTm9uLW1hdGNoaW5nIGRlbGltZXRlcnMuCisgIEV4cGVjdEZhaWx1cmUoIltibGFoYmxhaF06IDEyMyIsCisgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiBcImJsYWhibGFoXCIgaXMgbm90IGRlZmluZWQgb3IgaXMgbm90IGFuICIKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG9mIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIuIiwKKyAgICAgICAgICAgICAgICAxLCAxMSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgTWlzc2luZ1JlcXVpcmVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRXhwZWN0RmFpbHVyZSgiYTogMSIsCisgICAgICAgICAgICAgICAgIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGIsIGMiLAorICAgICAgICAgICAgICAgIDAsIDEsICZtZXNzYWdlKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZUR1cGxpY2F0ZVJlcXVpcmVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRXhwZWN0RmFpbHVyZSgiYTogMSBiOiAyIGM6IDMgYTogMSIsCisgICAgICAgICAgICAgICAgIk5vbi1yZXBlYXRlZCBmaWVsZCBcImFcIiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIiwKKyAgICAgICAgICAgICAgICAxLCAxNywgJm1lc3NhZ2UpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRHVwbGljYXRlT3B0aW9uYWwpIHsKKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2U7CisgIEV4cGVjdEZhaWx1cmUoImM6IDEgYzogMiIsCisgICAgICAgICAgICAgICAgIk5vbi1yZXBlYXRlZCBmaWVsZCBcImNcIiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIiwKKyAgICAgICAgICAgICAgICAxLCA3LCAmbWVzc2FnZSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgTWVyZ2VEdXBsaWNhdGVSZXF1aXJlZCkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5NZXJnZUZyb21TdHJpbmcoImE6IDEgYjogMiBjOiAzIGE6IDQiLCAmbWVzc2FnZSkpOworICBFWFBFQ1RfRVEoNCwgbWVzc2FnZS5hKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIE1lcmdlRHVwbGljYXRlT3B0aW9uYWwpIHsKKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2U7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5NZXJnZUZyb21TdHJpbmcoImM6IDEgYzogMiIsICZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLmMoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgRXhwbGljaXREZWxpbWl0ZXJzKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCJhOjEsYjoyO2M6MyIsICZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLmEoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLmIoKSk7CisgIEVYUEVDVF9FUSgzLCBtZXNzYWdlLmMoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgUHJpbnRFcnJvcnNUb1N0ZGVycikgeworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwcm90bzsKKyAgICBFWFBFQ1RfRkFMU0UoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCJub19zdWNoX2ZpZWxkOiAxIiwgJnByb3RvKSk7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorCisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJFcnJvciBwYXJzaW5nIHRleHQtZm9ybWF0IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlczogIgorICAgICAgICAgICAgIjE6MTQ6IE1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgICAibmFtZWQgXCJub19zdWNoX2ZpZWxkXCIuIiwKKyAgICAgICAgICAgIGVycm9yc1swXSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgRmFpbHNPblRva2VuaXphdGlvbkVycm9yKSB7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvOworICAgIEVYUEVDVF9GQUxTRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoIlwwMjAiLCAmcHJvdG8pKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisKKyAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoIkVycm9yIHBhcnNpbmcgdGV4dC1mb3JtYXQgcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzOiAiCisgICAgICAgICAgICAiMToxOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LiIsCisgICAgICAgICAgICBlcnJvcnNbMF0pOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRGVwcmVjYXRlZEZpZWxkKSB7CisgIHVuaXR0ZXN0OjpUZXN0RGVwcmVjYXRlZEZpZWxkcyBtZXNzYWdlOworICBFeHBlY3RNZXNzYWdlKCJkZXByZWNhdGVkX2ludDMyOiA0MiIsCisgICAgICAgICAgICAgICAgIldBUk5JTkc6dGV4dCBmb3JtYXQgY29udGFpbnMgZGVwcmVjYXRlZCBmaWVsZCAiCisgICAgICAgICAgICAgICAgIlwiZGVwcmVjYXRlZF9pbnQzMlwiIiwgMSwgMjEsICZtZXNzYWdlLCB0cnVlKTsKK30KKworY2xhc3MgVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGNoYXIgcHJvdG9fZGVidWdfc3RyaW5nX1tdOworfTsKK2NvbnN0IGNoYXIgVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0Ojpwcm90b19kZWJ1Z19zdHJpbmdfW10gPQorIm1lc3NhZ2Vfc2V0IHtcbiIKKyIgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbiIKKyIgICAgaTogMjNcbiIKKyIgIH1cbiIKKyIgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHtcbiIKKyIgICAgc3RyOiBcImZvb1wiXG4iCisiICB9XG4iCisifVxuIjsKKworCitURVNUX0YoVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0LCBTZXJpYWxpemUpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIHByb3RvOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKiBpdGVtX2EgPQorICAgIHByb3RvLm11dGFibGVfbWVzc2FnZV9zZXQoKS0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgIGl0ZW1fYS0+c2V0X2koMjMpOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKiBpdGVtX2IgPQorICAgIHByb3RvLm11dGFibGVfbWVzc2FnZV9zZXQoKS0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgIGl0ZW1fYi0+c2V0X3N0cigiZm9vIik7CisgIEVYUEVDVF9FUShwcm90b19kZWJ1Z19zdHJpbmdfLCBwcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRNZXNzYWdlU2V0VGVzdCwgRGVzZXJpYWxpemUpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIHByb3RvOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocHJvdG9fZGVidWdfc3RyaW5nXywgJnByb3RvKSk7CisgIEVYUEVDVF9FUSgyMywgcHJvdG8ubWVzc2FnZV9zZXQoKS5HZXRFeHRlbnNpb24oCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5pKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHByb3RvLm1lc3NhZ2Vfc2V0KCkuR2V0RXh0ZW5zaW9uKAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikuc3RyKCkpOworCisgIC8vIEVuc3VyZSB0aGF0IHRoZXNlIGFyZSB0aGUgb25seSBlbnRyaWVzIHByZXNlbnQuCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgcHJvdG8ubWVzc2FnZV9zZXQoKS5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMoCisgICAgcHJvdG8ubWVzc2FnZV9zZXQoKSwgJmRlc2NyaXB0b3JzKTsKKyAgRVhQRUNUX0VRKDIsIGRlc2NyaXB0b3JzLnNpemUoKSk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIHRleHRfZm9ybWF0X3VuaXR0ZXN0Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWIyZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvCkBAIC0wLDAgKzEsNzE5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2Ugd2lsbCB1c2UgZm9yIHVuaXQgdGVzdGluZy4KKworCisvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAorb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIHB5X2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAorCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iOworCisvLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KKy8vIEluIHRlc3RfdXRpbC5oIHdlIGRvICJ1c2luZyBuYW1lc3BhY2UgdW5pdHRlc3QgPSBwcm90b2J1Zl91bml0dGVzdCIuCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCisvLyBQcm90b3Mgb3B0aW1pemVkIGZvciBTUEVFRCB1c2UgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCisvLyBvZiBlcXVpdmFsZW50IG9uZXMgb3B0aW1pemVkIGZvciBDT0RFX1NJWkUsIHNvIHdlIHNob3VsZCBvcHRpbWl6ZSBhbGwgb3VyCisvLyB0ZXN0cyBmb3Igc3BlZWQgdW5sZXNzIGV4cGxpY2l0bHkgdGVzdGluZyBjb2RlIHNpemUgb3B0aW1pemF0aW9uLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RQcm90byI7CisKKy8vIFRoaXMgcHJvdG8gaW5jbHVkZXMgZXZlcnkgdHlwZSBvZiBmaWVsZCBpbiBib3RoIHNpbmd1bGFyIGFuZCByZXBlYXRlZAorLy8gZm9ybXMuCittZXNzYWdlIFRlc3RBbGxUeXBlcyB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgLy8gVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKKyAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgorICAgIC8vIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgIH0KKworICAvLyBTaW5ndWxhcgorICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOworICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOworICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOworICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OworICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgICA9ICA1OworICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgICA9ICA2OworICBvcHRpb25hbCAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyICA9ICA3OworICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ICA9ICA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9ICA5OworICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOworICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdCAgICA9IDExOworICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgICA9IDEyOworICBvcHRpb25hbCAgICAgYm9vbCBvcHRpb25hbF9ib29sICAgICA9IDEzOworICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgICA9IDE0OworICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlcyAgICA9IDE1OworCisgIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSAxNiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OworICB9CisKKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICA9IDE4OworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlID0gMTk7CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICA9IDIwOworCisgIG9wdGlvbmFsIE5lc3RlZEVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfZW51bSAgICAgPSAyMTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fZW51bSAgICA9IDIyOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bSAgICBvcHRpb25hbF9pbXBvcnRfZW51bSAgICAgPSAyMzsKKworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gMjQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9jb3JkID0gMjUgW2N0eXBlPUNPUkRdOworCisgIC8vIERlZmluZWQgaW4gdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90bworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZQorICAgICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlID0gMjY7CisKKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9sYXp5X21lc3NhZ2UgPSAyNyBbbGF6eT10cnVlXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOworICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OworICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICB9CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICA9IDUwOworCisgIHJlcGVhdGVkIE5lc3RlZEVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9uZXN0ZWRfZW51bSAgICAgPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fZW51bSAgICA9IDUyOworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bSAgICByZXBlYXRlZF9pbXBvcnRfZW51bSAgICAgPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlPUNPUkRdOworCisgIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbGF6eV9tZXNzYWdlID0gNTcgW2xhenk9dHJ1ZV07CisKKyAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cworICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKKyAgb3B0aW9uYWwgICAgaW50NjQgZGVmYXVsdF9pbnQ2NCAgICA9IDYyIFtkZWZhdWx0ID0gIDQyICAgIF07CisgIG9wdGlvbmFsICAgdWludDMyIGRlZmF1bHRfdWludDMyICAgPSA2MyBbZGVmYXVsdCA9ICA0MyAgICBdOworICBvcHRpb25hbCAgIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NCAgID0gNjQgW2RlZmF1bHQgPSAgNDQgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50MzIgZGVmYXVsdF9zaW50MzIgICA9IDY1IFtkZWZhdWx0ID0gLTQ1ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDY0IGRlZmF1bHRfc2ludDY0ICAgPSA2NiBbZGVmYXVsdCA9ICA0NiAgICBdOworICBvcHRpb25hbCAgZml4ZWQzMiBkZWZhdWx0X2ZpeGVkMzIgID0gNjcgW2RlZmF1bHQgPSAgNDcgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkNjQgZGVmYXVsdF9maXhlZDY0ICA9IDY4IFtkZWZhdWx0ID0gIDQ4ICAgIF07CisgIG9wdGlvbmFsIHNmaXhlZDMyIGRlZmF1bHRfc2ZpeGVkMzIgPSA2OSBbZGVmYXVsdCA9ICA0OSAgICBdOworICBvcHRpb25hbCBzZml4ZWQ2NCBkZWZhdWx0X3NmaXhlZDY0ID0gNzAgW2RlZmF1bHQgPSAtNTAgICAgXTsKKyAgb3B0aW9uYWwgICAgZmxvYXQgZGVmYXVsdF9mbG9hdCAgICA9IDcxIFtkZWZhdWx0ID0gIDUxLjUgIF07CisgIG9wdGlvbmFsICAgZG91YmxlIGRlZmF1bHRfZG91YmxlICAgPSA3MiBbZGVmYXVsdCA9ICA1MmUzICBdOworICBvcHRpb25hbCAgICAgYm9vbCBkZWZhdWx0X2Jvb2wgICAgID0gNzMgW2RlZmF1bHQgPSB0cnVlICAgXTsKKyAgb3B0aW9uYWwgICBzdHJpbmcgZGVmYXVsdF9zdHJpbmcgICA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07CisgIG9wdGlvbmFsICAgIGJ5dGVzIGRlZmF1bHRfYnl0ZXMgICAgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOworCisgIG9wdGlvbmFsIE5lc3RlZEVudW0gIGRlZmF1bHRfbmVzdGVkX2VudW0gID0gODEgW2RlZmF1bHQgPSBCQVIgICAgICAgIF07CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtIGRlZmF1bHRfZm9yZWlnbl9lbnVtID0gODIgW2RlZmF1bHQgPSBGT1JFSUdOX0JBUl07CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtCisgICAgICBkZWZhdWx0X2ltcG9ydF9lbnVtID0gODMgW2RlZmF1bHQgPSBJTVBPUlRfQkFSXTsKKworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2UgPSA4NCBbY3R5cGU9U1RSSU5HX1BJRUNFLGRlZmF1bHQ9ImFiYyJdOworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkID0gODUgW2N0eXBlPUNPUkQsZGVmYXVsdD0iMTIzIl07Cit9CisKK21lc3NhZ2UgVGVzdERlcHJlY2F0ZWRGaWVsZHMgeworICBvcHRpb25hbCBpbnQzMiBkZXByZWNhdGVkX2ludDMyID0gMSBbZGVwcmVjYXRlZD10cnVlXTsKK30KKworLy8gRGVmaW5lIHRoZXNlIGFmdGVyIFRlc3RBbGxUeXBlcyB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGNhbiBoYW5kbGUKKy8vIHRoYXQuCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgYyA9IDE7Cit9CisKK2VudW0gRm9yZWlnbkVudW0geworICBGT1JFSUdOX0ZPTyA9IDQ7CisgIEZPUkVJR05fQkFSID0gNTsKKyAgRk9SRUlHTl9CQVogPSA2OworfQorCittZXNzYWdlIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAgID0gIDE7CisgIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiAgICA9ICAyOworICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uICAgPSAgMzsKKyAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiAgID0gIDQ7CisgIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24gICA9ICA1OworICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uICAgPSAgNjsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24gID0gIDc7CisgIG9wdGlvbmFsICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uICA9ICA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24gPSAgOTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gMTA7CisgIG9wdGlvbmFsICAgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICA9IDExOworICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICAgPSAxMjsKKyAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgID0gMTM7CisgIG9wdGlvbmFsICAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICA9IDE0OworICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICAgPSAxNTsKKworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiA9IDE2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIH0KKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gPSAxODsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2Ugb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiA9IDE5OworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZQorICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDIwOworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiA9IDIxOworICBvcHRpb25hbCBGb3JlaWduRW51bSBvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uID0gMjI7CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtCisgICAgb3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uID0gMjM7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24gPSAyNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uID0gMjUgW2N0eXBlPUNPUkRdOworCisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJbXBvcnRNZXNzYWdlCisgICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI2OworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlCisgICAgb3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiA9IDI3IFtsYXp5PXRydWVdOworCisgIC8vIFJlcGVhdGVkCisgIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICA9IDMxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAzMjsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgID0gMzM7CisgIHJlcGVhdGVkICAgdWludDY0IHJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICA9IDM0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAzNTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgID0gMzY7CisgIHJlcGVhdGVkICBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICA9IDM3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAzODsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gMzk7CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiA9IDQwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAgPSA0MTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgID0gNDI7CisgIHJlcGVhdGVkICAgICBib29sIHJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDQzOworICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAgPSA0NDsKKyAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgID0gNDU7CisKKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gPSA0NiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICB9CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gPSA0OTsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UKKyAgICByZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gPSA1MDsKKworICByZXBlYXRlZCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiA9IDUyOworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQorICAgIHJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiA9IDUzOworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiA9IDU1IFtjdHlwZT1DT1JEXTsKKworICByZXBlYXRlZCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZQorICAgIHJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gPSA1NyBbbGF6eT10cnVlXTsKKworICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCisgIG9wdGlvbmFsICAgIGludDMyIGRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKKyAgb3B0aW9uYWwgICAgaW50NjQgZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOworICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24gICA9IDYzIFtkZWZhdWx0ID0gIDQzICAgIF07CisgIG9wdGlvbmFsICAgdWludDY0IGRlZmF1bHRfdWludDY0X2V4dGVuc2lvbiAgID0gNjQgW2RlZmF1bHQgPSAgNDQgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50MzIgZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOworICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24gICA9IDY2IFtkZWZhdWx0ID0gIDQ2ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb24gID0gNjcgW2RlZmF1bHQgPSAgNDcgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkNjQgZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbiA9IDY5IFtkZWZhdWx0ID0gIDQ5ICAgIF07CisgIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gNzAgW2RlZmF1bHQgPSAtNTAgICAgXTsKKyAgb3B0aW9uYWwgICAgZmxvYXQgZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOworICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZV9leHRlbnNpb24gICA9IDcyIFtkZWZhdWx0ID0gIDUyZTMgIF07CisgIG9wdGlvbmFsICAgICBib29sIGRlZmF1bHRfYm9vbF9leHRlbnNpb24gICAgID0gNzMgW2RlZmF1bHQgPSB0cnVlICAgXTsKKyAgb3B0aW9uYWwgICBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOworICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbiAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0KKyAgICBkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbiA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0KKyAgICBkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb24gPSA4MiBbZGVmYXVsdCA9IEZPUkVJR05fQkFSXTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0KKyAgICBkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0JBUl07CisKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJjIl07CisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uID0gODUgW2N0eXBlPUNPUkQsIGRlZmF1bHQ9IjEyMyJdOworfQorCittZXNzYWdlIFRlc3ROZXN0ZWRFeHRlbnNpb24geworICBleHRlbmQgVGVzdEFsbEV4dGVuc2lvbnMgeworICAgIC8vIENoZWNrIGZvciBidWcgd2hlcmUgc3RyaW5nIGV4dGVuc2lvbnMgZGVjbGFyZWQgaW4gdGVzdGVkIHNjb3BlIGRpZCBub3QKKyAgICAvLyBjb21waWxlLgorICAgIG9wdGlvbmFsIHN0cmluZyB0ZXN0ID0gMTAwMiBbZGVmYXVsdD0idGVzdCJdOworICB9Cit9CisKKy8vIFdlIGhhdmUgc2VwYXJhdGUgbWVzc2FnZXMgZm9yIHRlc3RpbmcgcmVxdWlyZWQgZmllbGRzIGJlY2F1c2UgaXQncworLy8gYW5ub3lpbmcgdG8gaGF2ZSB0byBmaWxsIGluIHJlcXVpcmVkIGZpZWxkcyBpbiBUZXN0UHJvdG8gaW4gb3JkZXIgdG8KKy8vIGRvIGFueXRoaW5nIHdpdGggaXQuICBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGV2ZXJ5IHR5cGUgb2YKKy8vIHJlcXVpcmVkIGZpbGVkIGJlY2F1c2UgdGhlIGNvZGUgb3V0cHV0IGlzIGJhc2ljYWxseSBpZGVudGljYWwgdG8KKy8vIG9wdGlvbmFsIGZpZWxkcyBmb3IgYWxsIHR5cGVzLgorbWVzc2FnZSBUZXN0UmVxdWlyZWQgeworICByZXF1aXJlZCBpbnQzMiBhID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyID0gMjsKKyAgcmVxdWlyZWQgaW50MzIgYiA9IDM7CisKKyAgZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgICBvcHRpb25hbCBUZXN0UmVxdWlyZWQgc2luZ2xlID0gMTAwMDsKKyAgICByZXBlYXRlZCBUZXN0UmVxdWlyZWQgbXVsdGkgID0gMTAwMTsKKyAgfQorCisgIC8vIFBhZCB0aGUgZmllbGQgY291bnQgdG8gMzIgc28gdGhhdCB3ZSBjYW4gdGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKQorICAvLyBwcm9wZXJseSBjaGVja3MgbXVsdGlwbGUgZWxlbWVudHMgb2YgaGFzX2JpdHNfLgorICBvcHRpb25hbCBpbnQzMiBkdW1teTQgID0gIDQ7CisgIG9wdGlvbmFsIGludDMyIGR1bW15NSAgPSAgNTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk2ICA9ICA2OworICBvcHRpb25hbCBpbnQzMiBkdW1teTcgID0gIDc7CisgIG9wdGlvbmFsIGludDMyIGR1bW15OCAgPSAgODsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk5ICA9ICA5OworICBvcHRpb25hbCBpbnQzMiBkdW1teTEwID0gMTA7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTEgPSAxMTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMiA9IDEyOworICBvcHRpb25hbCBpbnQzMiBkdW1teTEzID0gMTM7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTQgPSAxNDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxNSA9IDE1OworICBvcHRpb25hbCBpbnQzMiBkdW1teTE2ID0gMTY7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTcgPSAxNzsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxOCA9IDE4OworICBvcHRpb25hbCBpbnQzMiBkdW1teTE5ID0gMTk7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjAgPSAyMDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyMSA9IDIxOworICBvcHRpb25hbCBpbnQzMiBkdW1teTIyID0gMjI7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjMgPSAyMzsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyNCA9IDI0OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI1ID0gMjU7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjYgPSAyNjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyNyA9IDI3OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI4ID0gMjg7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjkgPSAyOTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkzMCA9IDMwOworICBvcHRpb25hbCBpbnQzMiBkdW1teTMxID0gMzE7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MzIgPSAzMjsKKworICByZXF1aXJlZCBpbnQzMiBjID0gMzM7Cit9CisKK21lc3NhZ2UgVGVzdFJlcXVpcmVkRm9yZWlnbiB7CisgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZCBvcHRpb25hbF9tZXNzYWdlID0gMTsKKyAgcmVwZWF0ZWQgVGVzdFJlcXVpcmVkIHJlcGVhdGVkX21lc3NhZ2UgPSAyOworICBvcHRpb25hbCBpbnQzMiBkdW1teSA9IDM7Cit9CisKKy8vIFRlc3QgdGhhdCB3ZSBjYW4gdXNlIE5lc3RlZE1lc3NhZ2UgZnJvbSBvdXRzaWRlIFRlc3RBbGxUeXBlcy4KK21lc3NhZ2UgVGVzdEZvcmVpZ25OZXN0ZWQgeworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBmb3JlaWduX25lc3RlZCA9IDE7Cit9CisKKy8vIFRlc3RFbXB0eU1lc3NhZ2UgaXMgdXNlZCB0byB0ZXN0IHVua25vd24gZmllbGQgc3VwcG9ydC4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZSB7Cit9CisKKy8vIExpa2UgYWJvdmUsIGJ1dCBkZWNsYXJlIGFsbCBmaWVsZCBudW1iZXJzIGFzIHBvdGVudGlhbCBleHRlbnNpb25zLiAgTm8KKy8vIGFjdHVhbCBleHRlbnNpb25zIHNob3VsZCBldmVyIGJlIGRlZmluZWQgZm9yIHRoaXMgdHlwZS4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworbWVzc2FnZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgeworICBleHRlbnNpb25zIDQyOworICBleHRlbnNpb25zIDQxNDMgdG8gNDI0MzsKKyAgZXh0ZW5zaW9ucyA2NTUzNiB0byBtYXg7Cit9CisKKy8vIFRlc3QgdGhhdCByZWFsbHkgbGFyZ2UgdGFnIG51bWJlcnMgZG9uJ3QgYnJlYWsgYW55dGhpbmcuCittZXNzYWdlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciB7CisgIC8vIFRoZSBsYXJnZXN0IHBvc3NpYmxlIHRhZyBudW1iZXIgaXMgMl4yOCAtIDEsIHNpbmNlIHRoZSB3aXJlIGZvcm1hdCB1c2VzCisgIC8vIHRocmVlIGJpdHMgdG8gY29tbXVuaWNhdGUgd2lyZSB0eXBlLgorICBvcHRpb25hbCBpbnQzMiBhID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgYmIgPSAyNjg0MzU0NTU7Cit9CisKK21lc3NhZ2UgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgeworICBvcHRpb25hbCBUZXN0UmVjdXJzaXZlTWVzc2FnZSBhID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgaSA9IDI7Cit9CisKKy8vIFRlc3QgdGhhdCBtdXR1YWwgcmVjdXJzaW9uIHdvcmtzLgorbWVzc2FnZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSB7CisgIG9wdGlvbmFsIFRlc3RNdXR1YWxSZWN1cnNpb25CIGJiID0gMTsKK30KKworbWVzc2FnZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiB7CisgIG9wdGlvbmFsIFRlc3RNdXR1YWxSZWN1cnNpb25BIGEgPSAxOworICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMiA9IDI7Cit9CisKKy8vIFRlc3QgdGhhdCBncm91cHMgaGF2ZSBkaXNqb2ludCBmaWVsZCBudW1iZXJzIGZyb20gdGhlaXIgc2libGluZ3MgYW5kCisvLyBwYXJlbnRzLiAgVGhpcyBpcyBOT1QgcG9zc2libGUgaW4gcHJvdG8xOyBvbmx5IHByb3RvMi4gIFdoZW4gYXR0ZW1wdGluZworLy8gdG8gY29tcGlsZSB3aXRoIHByb3RvMSwgdGhpcyB3aWxsIGVtaXQgYW4gZXJyb3I7IHNvIHdlIG9ubHkgaW5jbHVkZSBpdAorLy8gaW4gcHJvdG9idWZfdW5pdHRlc3RfcHJvdG8uCittZXNzYWdlIFRlc3REdXBGaWVsZE51bWJlciB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8xCisgIG9wdGlvbmFsIGludDMyIGEgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8xCisgIG9wdGlvbmFsIGdyb3VwIEZvbyA9IDIgeyBvcHRpb25hbCBpbnQzMiBhID0gMTsgfSAgLy8gTk9fUFJPVE8xCisgIG9wdGlvbmFsIGdyb3VwIEJhciA9IDMgeyBvcHRpb25hbCBpbnQzMiBhID0gMTsgfSAgLy8gTk9fUFJPVE8xCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8xCisKKy8vIEFkZGl0aW9uYWwgbWVzc2FnZXMgZm9yIHRlc3RpbmcgbGF6eSBmaWVsZHMuCittZXNzYWdlIFRlc3RFYWdlck1lc3NhZ2UgeworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgc3ViX21lc3NhZ2UgPSAxIFtsYXp5PWZhbHNlXTsKK30KK21lc3NhZ2UgVGVzdExhenlNZXNzYWdlIHsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIHN1Yl9tZXNzYWdlID0gMSBbbGF6eT10cnVlXTsKK30KKworLy8gTmVlZGVkIGZvciBhIFB5dGhvbiB0ZXN0LgorbWVzc2FnZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIHJlcGVhdGVkIGludDMyIG5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfaW50MzIgPSAxOworICAgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIG5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfZm9yZWlnbm1lc3NhZ2UgPSAyOworICB9CisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSAxOworfQorCisKKy8vIFRlc3QgYW4gZW51bSB0aGF0IGhhcyBtdWx0aXBsZSB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIuCitlbnVtIFRlc3RFbnVtV2l0aER1cFZhbHVlIHsKKyAgb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsKKyAgRk9PMSA9IDE7CisgIEJBUjEgPSAyOworICBCQVogPSAzOworICBGT08yID0gMTsKKyAgQkFSMiA9IDI7Cit9CisKKy8vIFRlc3QgYW4gZW51bSB3aXRoIGxhcmdlLCB1bm9yZGVyZWQgdmFsdWVzLgorZW51bSBUZXN0U3BhcnNlRW51bSB7CisgIFNQQVJTRV9BID0gMTIzOworICBTUEFSU0VfQiA9IDYyMzc0OworICBTUEFSU0VfQyA9IDEyNTg5MjM0OworICBTUEFSU0VfRCA9IC0xNTsKKyAgU1BBUlNFX0UgPSAtNTM0NTI7CisgIFNQQVJTRV9GID0gMDsKKyAgU1BBUlNFX0cgPSAyOworfQorCisvLyBUZXN0IG1lc3NhZ2Ugd2l0aCBDYW1lbENhc2UgZmllbGQgbmFtZXMuICBUaGlzIHZpb2xhdGVzIFByb3RvY29sIEJ1ZmZlcgorLy8gc3RhbmRhcmQgc3R5bGUuCittZXNzYWdlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIHsKKyAgb3B0aW9uYWwgaW50MzIgUHJpbWl0aXZlRmllbGQgPSAxOworICBvcHRpb25hbCBzdHJpbmcgU3RyaW5nRmllbGQgPSAyOworICBvcHRpb25hbCBGb3JlaWduRW51bSBFbnVtRmllbGQgPSAzOworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBNZXNzYWdlRmllbGQgPSA0OworICBvcHRpb25hbCBzdHJpbmcgU3RyaW5nUGllY2VGaWVsZCA9IDUgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIHN0cmluZyBDb3JkRmllbGQgPSA2IFtjdHlwZT1DT1JEXTsKKworICByZXBlYXRlZCBpbnQzMiBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkID0gNzsKKyAgcmVwZWF0ZWQgc3RyaW5nIFJlcGVhdGVkU3RyaW5nRmllbGQgPSA4OworICByZXBlYXRlZCBGb3JlaWduRW51bSBSZXBlYXRlZEVudW1GaWVsZCA9IDk7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIFJlcGVhdGVkTWVzc2FnZUZpZWxkID0gMTA7CisgIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQgPSAxMSBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIFJlcGVhdGVkQ29yZEZpZWxkID0gMTIgW2N0eXBlPUNPUkRdOworfQorCisKKy8vIFdlIGxpc3QgZmllbGRzIG91dCBvZiBvcmRlciwgdG8gZW5zdXJlIHRoYXQgd2UncmUgdXNpbmcgZmllbGQgbnVtYmVyIGFuZCBub3QKKy8vIGZpZWxkIGluZGV4IHRvIGRldGVybWluZSBzZXJpYWxpemF0aW9uIG9yZGVyLgorbWVzc2FnZSBUZXN0RmllbGRPcmRlcmluZ3MgeworICBvcHRpb25hbCBzdHJpbmcgbXlfc3RyaW5nID0gMTE7CisgIGV4dGVuc2lvbnMgMiB0byAxMDsKKyAgb3B0aW9uYWwgaW50NjQgbXlfaW50ID0gMTsKKyAgZXh0ZW5zaW9ucyAxMiB0byAxMDA7CisgIG9wdGlvbmFsIGZsb2F0IG15X2Zsb2F0ID0gMTAxOworfQorCisKK2V4dGVuZCBUZXN0RmllbGRPcmRlcmluZ3MgeworICBvcHRpb25hbCBzdHJpbmcgbXlfZXh0ZW5zaW9uX3N0cmluZyA9IDUwOworICBvcHRpb25hbCBpbnQzMiBteV9leHRlbnNpb25faW50ID0gNTsKK30KKworCittZXNzYWdlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyB7CisgIG9wdGlvbmFsIGJ5dGVzIGVzY2FwZWRfYnl0ZXMgPSAxIFtkZWZhdWx0ID0gIlwwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJ1wiXHhmZSJdOworICBvcHRpb25hbCB1aW50MzIgbGFyZ2VfdWludDMyID0gMiBbZGVmYXVsdCA9IDB4RkZGRkZGRkZdOworICBvcHRpb25hbCB1aW50NjQgbGFyZ2VfdWludDY0ID0gMyBbZGVmYXVsdCA9IDB4RkZGRkZGRkZGRkZGRkZGRl07CisgIG9wdGlvbmFsICBpbnQzMiBzbWFsbF9pbnQzMiAgPSA0IFtkZWZhdWx0ID0gLTB4N0ZGRkZGRkZdOworICBvcHRpb25hbCAgaW50NjQgc21hbGxfaW50NjQgID0gNSBbZGVmYXVsdCA9IC0weDdGRkZGRkZGRkZGRkZGRkZdOworICBvcHRpb25hbCAgaW50MzIgcmVhbGx5X3NtYWxsX2ludDMyID0gMjEgW2RlZmF1bHQgPSAtMHg4MDAwMDAwMF07CisgIG9wdGlvbmFsICBpbnQ2NCByZWFsbHlfc21hbGxfaW50NjQgPSAyMiBbZGVmYXVsdCA9IC0weDgwMDAwMDAwMDAwMDAwMDBdOworCisgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGhlcmUgaXMgVVRGLTggZm9yICJcdTEyMzQiLiAgKFdlIGNvdWxkIGFsc28ganVzdCB0eXBlCisgIC8vIHRoZSBVVEYtOCB0ZXh0IGRpcmVjdGx5IGludG8gdGhpcyB0ZXh0IGZpbGUgcmF0aGVyIHRoYW4gZXNjYXBlIGl0LCBidXQKKyAgLy8gbG90cyBvZiBwZW9wbGUgdXNlIGVkaXRvcnMgdGhhdCB3b3VsZCBiZSBjb25mdXNlZCBieSB0aGlzLikKKyAgb3B0aW9uYWwgc3RyaW5nIHV0Zjhfc3RyaW5nID0gNiBbZGVmYXVsdCA9ICJcMzQxXDIxMFwyNjQiXTsKKworICAvLyBUZXN0cyBmb3Igc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgIG9wdGlvbmFsIGZsb2F0IHplcm9fZmxvYXQgPSA3IFtkZWZhdWx0ID0gMF07CisgIG9wdGlvbmFsIGZsb2F0IG9uZV9mbG9hdCA9IDggW2RlZmF1bHQgPSAxXTsKKyAgb3B0aW9uYWwgZmxvYXQgc21hbGxfZmxvYXQgPSA5IFtkZWZhdWx0ID0gMS41XTsKKyAgb3B0aW9uYWwgZmxvYXQgbmVnYXRpdmVfb25lX2Zsb2F0ID0gMTAgW2RlZmF1bHQgPSAtMV07CisgIG9wdGlvbmFsIGZsb2F0IG5lZ2F0aXZlX2Zsb2F0ID0gMTEgW2RlZmF1bHQgPSAtMS41XTsKKyAgLy8gVXNpbmcgZXhwb25lbnRzCisgIG9wdGlvbmFsIGZsb2F0IGxhcmdlX2Zsb2F0ID0gMTIgW2RlZmF1bHQgPSAyRThdOworICBvcHRpb25hbCBmbG9hdCBzbWFsbF9uZWdhdGl2ZV9mbG9hdCA9IDEzIFtkZWZhdWx0ID0gLThlLTI4XTsKKworICAvLyBUZXh0IGZvciBub25maW5pdGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICBvcHRpb25hbCBkb3VibGUgaW5mX2RvdWJsZSA9IDE0IFtkZWZhdWx0ID0gaW5mXTsKKyAgb3B0aW9uYWwgZG91YmxlIG5lZ19pbmZfZG91YmxlID0gMTUgW2RlZmF1bHQgPSAtaW5mXTsKKyAgb3B0aW9uYWwgZG91YmxlIG5hbl9kb3VibGUgPSAxNiBbZGVmYXVsdCA9IG5hbl07CisgIG9wdGlvbmFsIGZsb2F0IGluZl9mbG9hdCA9IDE3IFtkZWZhdWx0ID0gaW5mXTsKKyAgb3B0aW9uYWwgZmxvYXQgbmVnX2luZl9mbG9hdCA9IDE4IFtkZWZhdWx0ID0gLWluZl07CisgIG9wdGlvbmFsIGZsb2F0IG5hbl9mbG9hdCA9IDE5IFtkZWZhdWx0ID0gbmFuXTsKKworICAvLyBUZXN0cyBmb3IgQysrIHRyaWdyYXBocy4KKyAgLy8gVHJpZ3JhcGhzIHNob3VsZCBiZSBlc2NhcGVkIGluIEMrKyBnZW5lcmF0ZWQgZmlsZXMsIGJ1dCB0aGV5IHNob3VsZCBub3QgYmUKKyAgLy8gZXNjYXBlZCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLgorICAvLyBOb3RlIHRoYXQgaW4gLnByb3RvIGZpbGUsICJcPyIgaXMgYSB2YWxpZCB3YXkgdG8gZXNjYXBlID8gaW4gc3RyaW5nCisgIC8vIGxpdGVyYWxzLgorICBvcHRpb25hbCBzdHJpbmcgY3BwX3RyaWdyYXBoID0gMjAgW2RlZmF1bHQgPSAiPyBcPyA/PyBcPz8gXD8/PyA/Py8gP1w/LSJdOworCisgIC8vIFN0cmluZyBkZWZhdWx0cyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgJ1wwMDAnCisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfd2l0aF96ZXJvICAgICAgID0gMjMgW2RlZmF1bHQgPSAiaGVsXDAwMGxvIl07CisgIG9wdGlvbmFsICBieXRlcyBieXRlc193aXRoX3plcm8gICAgICAgID0gMjQgW2RlZmF1bHQgPSAid29yXDAwMGxkIl07CisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfcGllY2Vfd2l0aF96ZXJvID0gMjUgW2N0eXBlPVNUUklOR19QSUVDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJcMDAwYyJdOworICBvcHRpb25hbCBzdHJpbmcgY29yZF93aXRoX3plcm8gICAgICAgICA9IDI2IFtjdHlwZT1DT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIxMlwwMDAzIl07Cit9CisKK21lc3NhZ2UgU3BhcnNlRW51bU1lc3NhZ2UgeworICBvcHRpb25hbCBUZXN0U3BhcnNlRW51bSBzcGFyc2VfZW51bSA9IDE7Cit9CisKKy8vIFRlc3QgU3RyaW5nIGFuZCBCeXRlczogc3RyaW5nIGlzIGZvciB2YWxpZCBVVEYtOCBzdHJpbmdzCittZXNzYWdlIE9uZVN0cmluZyB7CisgIG9wdGlvbmFsIHN0cmluZyBkYXRhID0gMTsKK30KKworbWVzc2FnZSBNb3JlU3RyaW5nIHsKKyAgcmVwZWF0ZWQgc3RyaW5nIGRhdGEgPSAxOworfQorCittZXNzYWdlIE9uZUJ5dGVzIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZGF0YSA9IDE7Cit9CisKK21lc3NhZ2UgTW9yZUJ5dGVzIHsKKyAgcmVwZWF0ZWQgYnl0ZXMgZGF0YSA9IDE7Cit9CisKKworLy8gVGVzdCBtZXNzYWdlcyBmb3IgcGFja2VkIGZpZWxkcworCittZXNzYWdlIFRlc3RQYWNrZWRUeXBlcyB7CisgIHJlcGVhdGVkICAgIGludDMyIHBhY2tlZF9pbnQzMiAgICA9ICA5MCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGludDY0IHBhY2tlZF9pbnQ2NCAgICA9ICA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDMyIHBhY2tlZF91aW50MzIgICA9ICA5MiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDY0IHBhY2tlZF91aW50NjQgICA9ICA5MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHBhY2tlZF9zaW50MzIgICA9ICA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHBhY2tlZF9zaW50NjQgICA9ICA5NSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHBhY2tlZF9maXhlZDMyICA9ICA5NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHBhY2tlZF9maXhlZDY0ICA9ICA5NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9zZml4ZWQzMiA9ICA5OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NCA9ICA5OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHBhY2tlZF9mbG9hdCAgICA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHBhY2tlZF9kb3VibGUgICA9IDEwMSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgICBib29sIHBhY2tlZF9ib29sICAgICA9IDEwMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHBhY2tlZF9lbnVtICA9IDEwMyBbcGFja2VkID0gdHJ1ZV07Cit9CisKKy8vIEEgbWVzc2FnZSB3aXRoIHRoZSBzYW1lIGZpZWxkcyBhcyBUZXN0UGFja2VkVHlwZXMsIGJ1dCB3aXRob3V0IHBhY2tpbmcuIFVzZWQKKy8vIHRvIHRlc3QgcGFja2VkIDwtPiB1bnBhY2tlZCB3aXJlIGNvbXBhdGliaWxpdHkuCittZXNzYWdlIFRlc3RVbnBhY2tlZFR5cGVzIHsKKyAgcmVwZWF0ZWQgICAgaW50MzIgdW5wYWNrZWRfaW50MzIgICAgPSAgOTAgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgdW5wYWNrZWRfaW50NjQgICAgPSAgOTEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgdW5wYWNrZWRfdWludDMyICAgPSAgOTIgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICB1aW50NjQgdW5wYWNrZWRfdWludDY0ICAgPSAgOTMgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgdW5wYWNrZWRfc2ludDMyICAgPSAgOTQgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgdW5wYWNrZWRfc2ludDY0ICAgPSAgOTUgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgdW5wYWNrZWRfZml4ZWQzMiAgPSAgOTYgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgdW5wYWNrZWRfZml4ZWQ2NCAgPSAgOTcgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgdW5wYWNrZWRfc2ZpeGVkMzIgPSAgOTggW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgdW5wYWNrZWRfc2ZpeGVkNjQgPSAgOTkgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgdW5wYWNrZWRfZmxvYXQgICAgPSAxMDAgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgdW5wYWNrZWRfZG91YmxlICAgPSAxMDEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgdW5wYWNrZWRfYm9vbCAgICAgPSAxMDIgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gdW5wYWNrZWRfZW51bSAgPSAxMDMgW3BhY2tlZCA9IGZhbHNlXTsKK30KKworbWVzc2FnZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2V4dGVuZCBUZXN0UGFja2VkRXh0ZW5zaW9ucyB7CisgIHJlcGVhdGVkICAgIGludDMyIHBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAgPSAgOTAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBpbnQ2NCBwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgID0gIDkxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcGFja2VkX3VpbnQzMl9leHRlbnNpb24gICA9ICA5MiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDY0IHBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAgPSAgOTMgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQzMiBwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgID0gIDk0IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICA9ICA5NSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAgPSAgOTYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gID0gIDk3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiA9ICA5OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24gPSAgOTkgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBmbG9hdCBwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcGFja2VkX2RvdWJsZV9leHRlbnNpb24gICA9IDEwMSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgICBib29sIHBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAgPSAxMDIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBGb3JlaWduRW51bSBwYWNrZWRfZW51bV9leHRlbnNpb24gID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKK30KKworLy8gVXNlZCBieSBFeHRlbnNpb25TZXRUZXN0L0R5bmFtaWNFeHRlbnNpb25zLiAgVGhlIHRlc3QgYWN0dWFsbHkgYnVpbGRzCisvLyBhIHNldCBvZiBleHRlbnNpb25zIHRvIFRlc3RBbGxFeHRlbnNpb25zIGR5bmFtaWNhbGx5LCBiYXNlZCBvbiB0aGUgZmllbGRzCisvLyBvZiB0aGlzIG1lc3NhZ2UgdHlwZS4KK21lc3NhZ2UgVGVzdER5bmFtaWNFeHRlbnNpb25zIHsKKyAgZW51bSBEeW5hbWljRW51bVR5cGUgeworICAgIERZTkFNSUNfRk9PID0gMjIwMDsKKyAgICBEWU5BTUlDX0JBUiA9IDIyMDE7CisgICAgRFlOQU1JQ19CQVogPSAyMjAyOworICB9CisgIG1lc3NhZ2UgRHluYW1pY01lc3NhZ2VUeXBlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBkeW5hbWljX2ZpZWxkID0gMjEwMDsKKyAgfQorCisgIG9wdGlvbmFsIGZpeGVkMzIgc2NhbGFyX2V4dGVuc2lvbiA9IDIwMDA7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtIGVudW1fZXh0ZW5zaW9uID0gMjAwMTsKKyAgb3B0aW9uYWwgRHluYW1pY0VudW1UeXBlIGR5bmFtaWNfZW51bV9leHRlbnNpb24gPSAyMDAyOworCisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VfZXh0ZW5zaW9uID0gMjAwMzsKKyAgb3B0aW9uYWwgRHluYW1pY01lc3NhZ2VUeXBlIGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24gPSAyMDA0OworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9leHRlbnNpb24gPSAyMDA1OworICByZXBlYXRlZCBzaW50MzIgcGFja2VkX2V4dGVuc2lvbiA9IDIwMDYgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIHsKKyAgLy8gUGFyc2luZyByZXBlYXRlZCBmaXhlZCBzaXplIHZhbHVlcyB1c2VkIHRvIGZhaWwuIFRoaXMgbWVzc2FnZSBuZWVkcyB0byBiZQorICAvLyB1c2VkIGluIG9yZGVyIHRvIGdldCBhIHRhZyBvZiB0aGUgcmlnaHQgc2l6ZTsgYWxsIG9mIHRoZSByZXBlYXRlZCBmaWVsZHMKKyAgLy8gaW4gVGVzdEFsbFR5cGVzIGRpZG4ndCB0cmlnZ2VyIHRoZSBjaGVjay4KKyAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gMTI7CisgIC8vIENoZWNrIGZvciBhIHZhcmludCB0eXBlLCBqdXN0IGZvciBnb29kIG1lYXN1cmUuCisgIHJlcGVhdGVkIGludDMyICAgcmVwZWF0ZWRfaW50MzIgICA9IDEzOworCisgIC8vIFRoZXNlIGhhdmUgdHdvLWJ5dGUgdGFncy4KKyAgcmVwZWF0ZWQgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ID0gMjA0NjsKKyAgcmVwZWF0ZWQgaW50NjQgICByZXBlYXRlZF9pbnQ2NCAgID0gMjA0NzsKKworICAvLyBUaHJlZSBieXRlIHRhZ3MuCisgIHJlcGVhdGVkIGZsb2F0ICAgcmVwZWF0ZWRfZmxvYXQgICA9IDI2MjE0MjsKKyAgcmVwZWF0ZWQgdWludDY0ICByZXBlYXRlZF91aW50NjQgID0gMjYyMTQzOworfQorCisvLyBUZXN0IHRoYXQgaWYgYW4gb3B0aW9uYWwgb3IgcmVxdWlyZWQgbWVzc2FnZS9ncm91cCBmaWVsZCBhcHBlYXJzIG11bHRpcGxlCisvLyB0aW1lcyBpbiB0aGUgaW5wdXQsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQuCittZXNzYWdlIFRlc3RQYXJzaW5nTWVyZ2UgeworICAvLyBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciBkZWZpbmVzIG1hdGNoaW5nIGZpZWxkIHR5cGVzIGFzIFRlc3RQYXJzaW5nTWVyZ2UsCisgIC8vIGV4Y2VwdCB0aGF0IGFsbCBmaWVsZHMgYXJlIHJlcGVhdGVkLiBJbiB0aGUgdGVzdHMsIHdlIHdpbGwgc2VyaWFsaXplIHRoZQorICAvLyBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciB0byBieXRlcywgYW5kIHBhcnNlIHRoZSBieXRlcyB0byBUZXN0UGFyc2luZ01lcmdlLgorICAvLyBSZXBlYXRlZCBmaWVsZHMgaW4gUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgYXJlIGV4cGVjdGVkIHRvIGJlIG1lcmdlZCBpbnRvCisgIC8vIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVpcmVkL29wdGlvbmFsIGZpZWxkcyBpbiBUZXN0UGFyc2luZ01lcmdlLgorICBtZXNzYWdlIFJlcGVhdGVkRmllbGRzR2VuZXJhdG9yIHsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQxID0gMTsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQyID0gMjsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQzID0gMzsKKyAgICByZXBlYXRlZCBncm91cCBHcm91cDEgPSAxMCB7CisgICAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgZmllbGQxID0gMTE7CisgICAgfQorICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMiA9IDIwIHsKKyAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBmaWVsZDEgPSAyMTsKKyAgICB9CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIGV4dDEgPSAxMDAwOworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyBleHQyID0gMTAwMTsKKyAgfQorICByZXF1aXJlZCBUZXN0QWxsVHlwZXMgcmVxdWlyZWRfYWxsX3R5cGVzID0gMTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG9wdGlvbmFsX2FsbF90eXBlcyA9IDI7CisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAzOworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTAgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9ncm91cF9hbGxfdHlwZXMgPSAxMTsKKyAgfQorICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gMjAgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9ncm91cF9hbGxfdHlwZXMgPSAyMTsKKyAgfQorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworICBleHRlbmQgVGVzdFBhcnNpbmdNZXJnZSB7CisgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG9wdGlvbmFsX2V4dCA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIHJlcGVhdGVkX2V4dCA9IDEwMDE7CisgIH0KK30KKworbWVzc2FnZSBUZXN0Q29tbWVudEluamVjdGlvbk1lc3NhZ2UgeworICAvLyAqLyA8LSBUaGlzIHNob3VsZCBub3QgY2xvc2UgdGhlIGdlbmVyYXRlZCBkb2MgY29tbWVudAorICBvcHRpb25hbCBzdHJpbmcgYSA9IDEgW2RlZmF1bHQ9IiovIDwtIE5laXRoZXIgc2hvdWxkIHRoaXMuIl07Cit9CisKKworLy8gVGVzdCB0aGF0IFJQQyBzZXJ2aWNlcyB3b3JrLgorbWVzc2FnZSBGb29SZXF1ZXN0ICB7fQorbWVzc2FnZSBGb29SZXNwb25zZSB7fQorCittZXNzYWdlIEZvb0NsaWVudE1lc3NhZ2Uge30KK21lc3NhZ2UgRm9vU2VydmVyTWVzc2FnZXt9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UgeworICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsKKyAgcnBjIEJhcihCYXJSZXF1ZXN0KSByZXR1cm5zIChCYXJSZXNwb25zZSk7Cit9CisKKworbWVzc2FnZSBCYXJSZXF1ZXN0ICB7fQorbWVzc2FnZSBCYXJSZXNwb25zZSB7fQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTFkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8KQEAgLTAsMCArMSwzODcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogYmVuanlAZ29vZ2xlLmNvbSAoQmVuankgV2VpbmJlcmdlcikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB1c2VkIHRvIHRlc3QgdGhlICJjdXN0b20gb3B0aW9ucyIgZmVhdHVyZSBvZiBwcm90bzIuCisKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsKKworLy8gQSBjdXN0b20gZmlsZSBvcHRpb24gKGRlZmluZWQgYmVsb3cpLgorb3B0aW9uIChmaWxlX29wdDEpID0gOTg3NjU0MzIxMDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisKKy8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworCisvLyBTb21lIHNpbXBsZSB0ZXN0IGN1c3RvbSBvcHRpb25zIG9mIHZhcmlvdXMgdHlwZXMuCisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgeworICBvcHRpb25hbCB1aW50NjQgZmlsZV9vcHQxID0gNzczNjk3NDsKK30KKworZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyB7CisgIG9wdGlvbmFsIGludDMyIG1lc3NhZ2Vfb3B0MSA9IDc3MzkwMzY7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsKKyAgb3B0aW9uYWwgZml4ZWQ2NCBmaWVsZF9vcHQxID0gNzc0MDkzNjsKKyAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgdGhhdCB3ZSBjb3JyZWN0bHkgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZXMgZm9yCisgIC8vIGV4dGVuc2lvbiBvcHRpb25zLgorICBvcHRpb25hbCBpbnQzMiBmaWVsZF9vcHQyID0gNzc1MzkxMyBbZGVmYXVsdD00Ml07Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgeworICBvcHRpb25hbCBzZml4ZWQzMiBlbnVtX29wdDEgPSA3NzUzNTc2OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgeworICBvcHRpb25hbCBpbnQzMiBlbnVtX3ZhbHVlX29wdDEgPSAxNTYwNjc4OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgc2ludDY0IHNlcnZpY2Vfb3B0MSA9IDc4ODc2NTA7Cit9CisKK2VudW0gTWV0aG9kT3B0MSB7CisgIE1FVEhPRE9QVDFfVkFMMSA9IDE7CisgIE1FVEhPRE9QVDFfVkFMMiA9IDI7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyB7CisgIG9wdGlvbmFsIE1ldGhvZE9wdDEgbWV0aG9kX29wdDEgPSA3ODkwODYwOworfQorCisvLyBBIHRlc3QgbWVzc2FnZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvIHNvbWUKKy8vIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KK21lc3NhZ2UgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyB7CisgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IGZhbHNlOworCisgIG9wdGlvbiAobWVzc2FnZV9vcHQxKSA9IC01NjsKKworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxID0gMSBbY3R5cGU9Q09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZF9vcHQxKT04NzY1NDMyMTA5XTsKKworICBlbnVtIEFuRW51bSB7CisgICAgb3B0aW9uIChlbnVtX29wdDEpID0gLTc4OTsKKworICAgIEFORU5VTV9WQUwxID0gMTsKKyAgICBBTkVOVU1fVkFMMiA9IDIgWyhlbnVtX3ZhbHVlX29wdDEpID0gMTIzXTsKKyAgfQorfQorCisKKy8vIEEgdGVzdCBSUEMgc2VydmljZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvCisvLyBzb21lIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCB7Cit9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgeworfQorCittZXNzYWdlIEN1c3RvbU9wdGlvbkZvb0NsaWVudE1lc3NhZ2UgeworfQorCittZXNzYWdlIEN1c3RvbU9wdGlvbkZvb1NlcnZlck1lc3NhZ2UgeworfQorCitzZXJ2aWNlIFRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMgeworICBvcHRpb24gKHNlcnZpY2Vfb3B0MSkgPSAtOTg3NjU0MzIxMDsKKworICBycGMgRm9vKEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QpIHJldHVybnMgKEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlKSB7CisgICAgb3B0aW9uIChtZXRob2Rfb3B0MSkgPSBNRVRIT0RPUFQxX1ZBTDI7CisgIH0KK30KKworCisKKy8vIE9wdGlvbnMgb2YgZXZlcnkgcG9zc2libGUgZmllbGQgdHlwZSwgc28gd2UgY2FuIHRlc3QgdGhlbSBhbGwgZXhoYXVzdGl2ZWx5LgorCittZXNzYWdlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIHsKKyAgZW51bSBUZXN0RW51bVR5cGUgeworICAgIFRFU1RfT1BUSU9OX0VOVU1fVFlQRTEgPSAyMjsKKyAgICBURVNUX09QVElPTl9FTlVNX1RZUEUyID0gLTIzOworICB9Cit9CisKK21lc3NhZ2UgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSB7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICBvcHRpb25hbCAgICAgICAgIGJvb2wgICAgIGJvb2xfb3B0ID0gNzcwNjA5MDsKKyAgb3B0aW9uYWwgICAgICAgIGludDMyICAgIGludDMyX29wdCA9IDc3MDU3MDk7CisgIG9wdGlvbmFsICAgICAgICBpbnQ2NCAgICBpbnQ2NF9vcHQgPSA3NzA1NTQyOworICBvcHRpb25hbCAgICAgICB1aW50MzIgICB1aW50MzJfb3B0ID0gNzcwNDg4MDsKKyAgb3B0aW9uYWwgICAgICAgdWludDY0ICAgdWludDY0X29wdCA9IDc3MDIzNjc7CisgIG9wdGlvbmFsICAgICAgIHNpbnQzMiAgIHNpbnQzMl9vcHQgPSA3NzAxNTY4OworICBvcHRpb25hbCAgICAgICBzaW50NjQgICBzaW50NjRfb3B0ID0gNzcwMDg2MzsKKyAgb3B0aW9uYWwgICAgICBmaXhlZDMyICBmaXhlZDMyX29wdCA9IDc3MDAzMDc7CisgIG9wdGlvbmFsICAgICAgZml4ZWQ2NCAgZml4ZWQ2NF9vcHQgPSA3NzAwMTk0OworICBvcHRpb25hbCAgICAgc2ZpeGVkMzIgc2ZpeGVkMzJfb3B0ID0gNzY5ODY0NTsKKyAgb3B0aW9uYWwgICAgIHNmaXhlZDY0IHNmaXhlZDY0X29wdCA9IDc2ODU0NzU7CisgIG9wdGlvbmFsICAgICAgICBmbG9hdCAgICBmbG9hdF9vcHQgPSA3Njc1MzkwOworICBvcHRpb25hbCAgICAgICBkb3VibGUgICBkb3VibGVfb3B0ID0gNzY3MzI5MzsKKyAgb3B0aW9uYWwgICAgICAgc3RyaW5nICAgc3RyaW5nX29wdCA9IDc2NzMyODU7CisgIG9wdGlvbmFsICAgICAgICBieXRlcyAgICBieXRlc19vcHQgPSA3NjczMjM4OworICBvcHRpb25hbCBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5UZXN0RW51bVR5cGUgZW51bV9vcHQgPSA3NjczMjMzOworICBvcHRpb25hbCBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIG1lc3NhZ2VfdHlwZV9vcHQgPSA3NjY1OTY3OworfQorCittZXNzYWdlIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgeworICBvcHRpb24gICAgIChib29sX29wdCkgPSBmYWxzZTsKKyAgb3B0aW9uICAgIChpbnQzMl9vcHQpID0gLTB4ODAwMDAwMDA7CisgIG9wdGlvbiAgICAoaW50NjRfb3B0KSA9IC0weDgwMDAwMDAwMDAwMDAwMDA7CisgIG9wdGlvbiAgICh1aW50MzJfb3B0KSA9IDA7CisgIG9wdGlvbiAgICh1aW50NjRfb3B0KSA9IDA7CisgIG9wdGlvbiAgIChzaW50MzJfb3B0KSA9IC0weDgwMDAwMDAwOworICBvcHRpb24gICAoc2ludDY0X29wdCkgPSAtMHg4MDAwMDAwMDAwMDAwMDAwOworICBvcHRpb24gIChmaXhlZDMyX29wdCkgPSAwOworICBvcHRpb24gIChmaXhlZDY0X29wdCkgPSAwOworICBvcHRpb24gKHNmaXhlZDMyX29wdCkgPSAtMHg4MDAwMDAwMDsKKyAgb3B0aW9uIChzZml4ZWQ2NF9vcHQpID0gLTB4ODAwMDAwMDAwMDAwMDAwMDsKK30KKworbWVzc2FnZSBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIHsKKyAgb3B0aW9uICAgICAoYm9vbF9vcHQpID0gdHJ1ZTsKKyAgb3B0aW9uICAgIChpbnQzMl9vcHQpID0gMHg3RkZGRkZGRjsKKyAgb3B0aW9uICAgIChpbnQ2NF9vcHQpID0gMHg3RkZGRkZGRkZGRkZGRkZGOworICBvcHRpb24gICAodWludDMyX29wdCkgPSAweEZGRkZGRkZGOworICBvcHRpb24gICAodWludDY0X29wdCkgPSAweEZGRkZGRkZGRkZGRkZGRkY7CisgIG9wdGlvbiAgIChzaW50MzJfb3B0KSA9IDB4N0ZGRkZGRkY7CisgIG9wdGlvbiAgIChzaW50NjRfb3B0KSA9IDB4N0ZGRkZGRkZGRkZGRkZGRjsKKyAgb3B0aW9uICAoZml4ZWQzMl9vcHQpID0gMHhGRkZGRkZGRjsKKyAgb3B0aW9uICAoZml4ZWQ2NF9vcHQpID0gMHhGRkZGRkZGRkZGRkZGRkZGOworICBvcHRpb24gKHNmaXhlZDMyX29wdCkgPSAweDdGRkZGRkZGOworICBvcHRpb24gKHNmaXhlZDY0X29wdCkgPSAweDdGRkZGRkZGRkZGRkZGRkY7Cit9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgeworICBvcHRpb24gIChpbnQzMl9vcHQpID0gLTEwMDsgIC8vIFRvIHRlc3Qgc2lnbi1leHRlbnNpb24uCisgIG9wdGlvbiAgKGZsb2F0X29wdCkgPSAxMi4zNDU2Nzg5OworICBvcHRpb24gKGRvdWJsZV9vcHQpID0gMS4yMzQ1Njc4OTAxMjM0NTY3ODk7CisgIG9wdGlvbiAoc3RyaW5nX29wdCkgPSAiSGVsbG8sIFwiV29ybGRcIiI7CisgIG9wdGlvbiAgKGJ5dGVzX29wdCkgPSAiSGVsbG9cMFdvcmxkIjsKKyAgb3B0aW9uICAgKGVudW1fb3B0KSA9IFRFU1RfT1BUSU9OX0VOVU1fVFlQRTI7Cit9CisKK21lc3NhZ2UgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyB7CisgIG9wdGlvbiAgKGZsb2F0X29wdCkgPSAxMjsKKyAgb3B0aW9uIChkb3VibGVfb3B0KSA9IDE1NDsKK30KKworbWVzc2FnZSBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIHsKKyAgb3B0aW9uICAoZmxvYXRfb3B0KSA9IC0xMjsKKyAgb3B0aW9uICAoZG91YmxlX29wdCkgPSAtMTU0OworfQorCisvLyBPcHRpb25zIG9mIGNvbXBsZXggbWVzc2FnZSB0eXBlcywgdGhlbXNlbHZlcyBjb21iaW5lZCBhbmQgZXh0ZW5kZWQgaW4KKy8vIHZhcmlvdXMgd2F5cy4KKworbWVzc2FnZSBDb21wbGV4T3B0aW9uVHlwZTEgeworICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOworICBvcHRpb25hbCBpbnQzMiBmb28yID0gMjsKKyAgb3B0aW9uYWwgaW50MzIgZm9vMyA9IDM7CisKKyAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OworfQorCittZXNzYWdlIENvbXBsZXhPcHRpb25UeXBlMiB7CisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMSBiYXIgPSAxOworICBvcHRpb25hbCBpbnQzMiBiYXogPSAyOworCisgIG1lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGU0IHsKKyAgICBvcHRpb25hbCBpbnQzMiB3YWxkbyA9IDE7CisKKyAgICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgICAgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlNCBjb21wbGV4X29wdDQgPSA3NjMzNTQ2OworICAgIH0KKyAgfQorCisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlNCBmcmVkID0gMzsKKworICBleHRlbnNpb25zIDEwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGUzIHsKKyAgb3B0aW9uYWwgaW50MzIgcXV4ID0gMTsKKworICBvcHRpb25hbCBncm91cCBDb21wbGV4T3B0aW9uVHlwZTUgPSAyIHsKKyAgICBvcHRpb25hbCBpbnQzMiBwbHVnaCA9IDM7CisgIH0KK30KKworZXh0ZW5kIENvbXBsZXhPcHRpb25UeXBlMSB7CisgIG9wdGlvbmFsIGludDMyIHF1dXggPSA3NjYzNzA3OworICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTMgY29yZ2UgPSA3NjYzNDQyOworfQorCitleHRlbmQgQ29tcGxleE9wdGlvblR5cGUyIHsKKyAgb3B0aW9uYWwgaW50MzIgZ3JhdWx0ID0gNzY1MDkyNzsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUxIGdhcnBseSA9IDc2NDk5OTI7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTEgY29tcGxleF9vcHQxID0gNzY0Njc1NjsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUyIGNvbXBsZXhfb3B0MiA9IDc2MzY5NDk7CisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMyBjb21wbGV4X29wdDMgPSA3NjM2NDYzOworICBvcHRpb25hbCBncm91cCBDb21wbGV4T3B0NiA9IDc1OTU0NjggeworICAgIG9wdGlvbmFsIGludDMyIHh5enp5ID0gNzU5Mzk1MTsKKyAgfQorfQorCisvLyBOb3RlIHRoYXQgd2UgdHJ5IHZhcmlvdXMgZGlmZmVyZW50IHdheXMgb2YgbmFtaW5nIHRoZSBzYW1lIGV4dGVuc2lvbi4KK21lc3NhZ2UgVmFyaW91c0NvbXBsZXhPcHRpb25zIHsKKyAgb3B0aW9uICgucHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS5mb28gPSA0MjsKKyAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLigucHJvdG9idWZfdW5pdHRlc3QucXV1eCkgPSAzMjQ7CisgIG9wdGlvbiAoLnByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuKHByb3RvYnVmX3VuaXR0ZXN0LmNvcmdlKS5xdXggPSA4NzY7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXogPSA5ODc7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ3JhdWx0KSA9IDY1NDsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhci5mb28gPSA3NDM7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXIuKHF1dXgpID0gMTk5OTsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhci4ocHJvdG9idWZfdW5pdHRlc3QuY29yZ2UpLnF1eCA9IDIwMDg7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ2FycGx5KS5mb28gPSA3NDE7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ2FycGx5KS4oLnByb3RvYnVmX3VuaXR0ZXN0LnF1dXgpID0gMTk5ODsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLihwcm90b2J1Zl91bml0dGVzdC5nYXJwbHkpLihjb3JnZSkucXV4ID0gMjEyMTsKKyAgb3B0aW9uIChDb21wbGV4T3B0aW9uVHlwZTIuQ29tcGxleE9wdGlvblR5cGU0LmNvbXBsZXhfb3B0NCkud2FsZG8gPSAxOTcxOworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuZnJlZC53YWxkbyA9IDMyMTsKKyAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDMpLnF1eCA9IDk7CisgIG9wdGlvbiAoY29tcGxleF9vcHQzKS5jb21wbGV4b3B0aW9udHlwZTUucGx1Z2ggPSAyMjsKKyAgb3B0aW9uIChjb21wbGV4b3B0NikueHl6enkgPSAyNDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBmb3IgdGVzdGluZyBhZ2dyZWdhdGUgb3B0aW9uIHBhcnNpbmcuCisvLyBTZWUgZGVzY3JpcHRvcl91bml0dGVzdC5jYy4KKworbWVzc2FnZSBBZ2dyZWdhdGVNZXNzYWdlU2V0IHsKKyAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKKyAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKK30KKworbWVzc2FnZSBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCB7CisgIGV4dGVuZCBBZ2dyZWdhdGVNZXNzYWdlU2V0IHsKKyAgICBvcHRpb25hbCBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ0NzU0MjsKKyAgfQorICBvcHRpb25hbCBzdHJpbmcgcyA9IDE7Cit9CisKKy8vIEEgaGVscGVyIHR5cGUgdXNlZCB0byB0ZXN0IGFnZ3JlZ2F0ZSBvcHRpb24gcGFyc2luZworbWVzc2FnZSBBZ2dyZWdhdGUgeworICBvcHRpb25hbCBpbnQzMiBpID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIHMgPSAyOworCisgIC8vIEEgbmVzdGVkIG9iamVjdAorICBvcHRpb25hbCBBZ2dyZWdhdGUgc3ViID0gMzsKKworICAvLyBUbyB0ZXN0IHRoZSBwYXJzaW5nIG9mIGV4dGVuc2lvbnMgaW5zaWRlIGFnZ3JlZ2F0ZSB2YWx1ZXMKKyAgb3B0aW9uYWwgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIGZpbGUgPSA0OworICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIHsKKyAgICBvcHRpb25hbCBBZ2dyZWdhdGUgbmVzdGVkID0gMTU0NzY5MDM7CisgIH0KKworICAvLyBBbiBlbWJlZGRlZCBtZXNzYWdlIHNldAorICBvcHRpb25hbCBBZ2dyZWdhdGVNZXNzYWdlU2V0IG1zZXQgPSA1OworfQorCisvLyBBbGxvdyBBZ2dyZWdhdGUgdG8gYmUgdXNlZCBhcyBhbiBvcHRpb24gYXQgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucworLy8gaW4gdGhlIC5wcm90byBncmFtbWVyLgorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyAgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGZpbGVvcHQgICAgPSAxNTQ3ODQ3OTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIG1zZ29wdCAgICAgPSAxNTQ4MDA4ODsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGZpZWxkb3B0ICAgPSAxNTQ4MTM3NDsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyAgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGVudW1vcHQgICAgPSAxNTQ4MzIxODsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIHsgb3B0aW9uYWwgQWdncmVnYXRlIGVudW12YWxvcHQgPSAxNTQ4NjkyMTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIHNlcnZpY2VvcHQgPSAxNTQ5NzE0NTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIG1ldGhvZG9wdCAgPSAxNTUxMjcxMzsgfQorCisvLyBUcnkgdXNpbmcgQWdncmVnYXRlT3B0aW9uIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGhlIHByb3RvIGdyYW1tYXIKK29wdGlvbiAoZmlsZW9wdCkgPSB7CisgIHM6ICdGaWxlQW5ub3RhdGlvbicKKyAgLy8gQWxzbyB0ZXN0IHRoZSBoYW5kbGluZyBvZiBjb21tZW50cworICAvKiBvZiBib3RoIHR5cGVzICovIGk6IDEwMAorCisgIHN1YiB7IHM6ICdOZXN0ZWRGaWxlQW5ub3RhdGlvbicgfQorCisgIC8vIEluY2x1ZGUgYSBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgYW5kIHJlY3Vyc2l2ZWx5IGV4dGVuZCBpdCB3aXRoCisgIC8vIGFub3RoZXIgZmlsZW9wdC4KKyAgZmlsZSB7CisgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmZpbGVvcHRdIHsKKyAgICAgIHM6J0ZpbGVFeHRlbnNpb25Bbm5vdGF0aW9uJworICAgIH0KKyAgfQorCisgIC8vIEEgbWVzc2FnZSBzZXQgaW5zaWRlIGFuIG9wdGlvbiB2YWx1ZQorICBtc2V0IHsKKyAgICBbcHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQubWVzc2FnZV9zZXRfZXh0ZW5zaW9uXSB7CisgICAgICBzOiAnRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCcKKyAgICB9CisgIH0KK307CisKK21lc3NhZ2UgQWdncmVnYXRlTWVzc2FnZSB7CisgIG9wdGlvbiAobXNnb3B0KSA9IHsgaToxMDEgczonTWVzc2FnZUFubm90YXRpb24nIH07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkbmFtZSA9IDEgWyhmaWVsZG9wdCkgPSB7IHM6J0ZpZWxkQW5ub3RhdGlvbicgfV07Cit9CisKK3NlcnZpY2UgQWdncmVnYXRlU2VydmljZSB7CisgIG9wdGlvbiAoc2VydmljZW9wdCkgPSB7IHM6J1NlcnZpY2VBbm5vdGF0aW9uJyB9OworICBycGMgTWV0aG9kIChBZ2dyZWdhdGVNZXNzYWdlKSByZXR1cm5zIChBZ2dyZWdhdGVNZXNzYWdlKSB7CisgICAgb3B0aW9uIChtZXRob2RvcHQpID0geyBzOidNZXRob2RBbm5vdGF0aW9uJyB9OworICB9Cit9CisKK2VudW0gQWdncmVnYXRlRW51bSB7CisgIG9wdGlvbiAoZW51bW9wdCkgPSB7IHM6J0VudW1Bbm5vdGF0aW9uJyB9OworICBWQUxVRSA9IDEgWyhlbnVtdmFsb3B0KSA9IHsgczonRW51bVZhbHVlQW5ub3RhdGlvbicgfV07Cit9CisKKy8vIFRlc3QgY3VzdG9tIG9wdGlvbnMgZm9yIG5lc3RlZCB0eXBlLgorbWVzc2FnZSBOZXN0ZWRPcHRpb25UeXBlIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICBvcHRpb24gKG1lc3NhZ2Vfb3B0MSkgPSAxMDAxOworICAgIG9wdGlvbmFsIGludDMyIG5lc3RlZF9maWVsZCA9IDEgWyhmaWVsZF9vcHQxKSA9IDEwMDJdOworICB9CisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgb3B0aW9uIChlbnVtX29wdDEpID0gMTAwMzsKKyAgICBORVNURURfRU5VTV9WQUxVRSA9IDEgWyhlbnVtX3ZhbHVlX29wdDEpID0gMTAwNF07CisgIH0KKyAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7CisgICAgb3B0aW9uYWwgaW50MzIgbmVzdGVkX2V4dGVuc2lvbiA9IDc5MTI1NzMgWyhmaWVsZF9vcHQyKSA9IDEwMDVdOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90bwpAQCAtMCwwICsxLDUwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2hpY2ggaW1wb3J0cyBhIHByb3RvIGZpbGUgdGhhdCB1c2VzIG9wdGltaXplX2ZvciA9IENPREVfU0laRS4KKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworLy8gV2Ugb3B0aW1pemUgZm9yIHNwZWVkIGhlcmUsIGJ1dCB3ZSBhcmUgaW1wb3J0aW5nIGEgcHJvdG8gdGhhdCBpcyBvcHRpbWl6ZWQKKy8vIGZvciBjb2RlIHNpemUuCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKK21lc3NhZ2UgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSB7CisgIC8vIFRlc3QgdGhhdCBlbWJlZGRpbmcgYSBtZXNzYWdlIHdoaWNoIGhhcyBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUgaW50bworICAvLyBvbmUgb3B0aW1pemVkIGZvciBzcGVlZCB3b3Jrcy4KKyAgb3B0aW9uYWwgVGVzdE9wdGltaXplZEZvclNpemUgb3B0aW9uYWxfbWVzc2FnZSA9IDE7CisgIHJlcGVhdGVkIFRlc3RPcHRpbWl6ZWRGb3JTaXplIHJlcGVhdGVkX21lc3NhZ2UgPSAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTJkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8KQEAgLTAsMCArMSwzNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gIChBdCBvbmUgcG9pbnQgdGhpcyB3b3VsZG4ndCBjb21waWxlCisvLyBjb3JyZWN0bHkuKQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGI3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90bwpAQCAtMCwwICsxLDEwNDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB0aGF0IGhhcyBhbiBleHRyZW1lbHkgbGFyZ2UgZGVzY3JpcHRvci4gIFVzZWQgdG8gdGVzdCB0aGF0CisvLyBkZXNjcmlwdG9ycyBvdmVyIDY0ayBkb24ndCBicmVhayB0aGUgc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIGxpbWl0IGluIEphdmEuCisKKworcGFja2FnZSBnb29nbGUucHJvdG9idWY7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworCisvLyBBdm9pZCBnZW5lcmF0aW5nIGluc2FuZWx5IGxvbmcgbWV0aG9kcy4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkU7CisKK21lc3NhZ2UgVGVzdEVub3Jtb3VzRGVzY3JpcHRvciB7CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xID0gMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMiA9IDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMgPSAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ID0gNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNSA9IDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYgPSA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ID0gNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOCA9IDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkgPSA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMCA9IDEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMSA9IDExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMiA9IDEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMyA9IDEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNCA9IDE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNSA9IDE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNiA9IDE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNyA9IDE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOCA9IDE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOSA9IDE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMCA9IDIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMSA9IDIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMiA9IDIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMyA9IDIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNCA9IDI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNSA9IDI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNiA9IDI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNyA9IDI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOCA9IDI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOSA9IDI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMCA9IDMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMSA9IDMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMiA9IDMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMyA9IDMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNCA9IDM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNSA9IDM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNiA9IDM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNyA9IDM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOCA9IDM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOSA9IDM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MCA9IDQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MSA9IDQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MiA9IDQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MyA9IDQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NCA9IDQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NSA9IDQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NiA9IDQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NyA9IDQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OCA9IDQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OSA9IDQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MCA9IDUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MSA9IDUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MiA9IDUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MyA9IDUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NCA9IDU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NSA9IDU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NiA9IDU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NyA9IDU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OCA9IDU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OSA9IDU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MCA9IDYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MSA9IDYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MiA9IDYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MyA9IDYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NCA9IDY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NSA9IDY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NiA9IDY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NyA9IDY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OCA9IDY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OSA9IDY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MCA9IDcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MSA9IDcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MiA9IDcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MyA9IDczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NCA9IDc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NSA9IDc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NiA9IDc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NyA9IDc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OCA9IDc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OSA9IDc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MCA9IDgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MSA9IDgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MiA9IDgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MyA9IDgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NCA9IDg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NSA9IDg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NiA9IDg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NyA9IDg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OCA9IDg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OSA9IDg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MCA9IDkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MSA9IDkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MiA9IDkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MyA9IDkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NCA9IDk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NSA9IDk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NiA9IDk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NyA9IDk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OCA9IDk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OSA9IDk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDAgPSAxMDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMSA9IDEwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTAyID0gMTAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDMgPSAxMDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwNCA9IDEwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA1ID0gMTA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDYgPSAxMDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwNyA9IDEwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA4ID0gMTA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDkgPSAxMDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExMCA9IDExMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTExID0gMTExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTIgPSAxMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExMyA9IDExMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE0ID0gMTE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTUgPSAxMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExNiA9IDExNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE3ID0gMTE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTggPSAxMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExOSA9IDExOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTIwID0gMTIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjEgPSAxMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyMiA9IDEyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTIzID0gMTIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjQgPSAxMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNSA9IDEyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI2ID0gMTI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjcgPSAxMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyOCA9IDEyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI5ID0gMTI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzAgPSAxMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMSA9IDEzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTMyID0gMTMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzMgPSAxMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzNCA9IDEzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM1ID0gMTM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzYgPSAxMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzNyA9IDEzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM4ID0gMTM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzkgPSAxMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0MCA9IDE0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQxID0gMTQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDIgPSAxNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0MyA9IDE0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ0ID0gMTQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDUgPSAxNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0NiA9IDE0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ3ID0gMTQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDggPSAxNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0OSA9IDE0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTUwID0gMTUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTEgPSAxNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1MiA9IDE1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTUzID0gMTUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTQgPSAxNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NSA9IDE1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU2ID0gMTU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTcgPSAxNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1OCA9IDE1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU5ID0gMTU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjAgPSAxNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MSA9IDE2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTYyID0gMTYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjMgPSAxNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2NCA9IDE2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY1ID0gMTY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjYgPSAxNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2NyA9IDE2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY4ID0gMTY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjkgPSAxNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3MCA9IDE3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTcxID0gMTcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzIgPSAxNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3MyA9IDE3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc0ID0gMTc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzUgPSAxNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3NiA9IDE3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc3ID0gMTc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzggPSAxNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3OSA9IDE3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTgwID0gMTgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODEgPSAxODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4MiA9IDE4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTgzID0gMTgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODQgPSAxODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NSA9IDE4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg2ID0gMTg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODcgPSAxODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4OCA9IDE4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg5ID0gMTg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTAgPSAxOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MSA9IDE5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTkyID0gMTkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTMgPSAxOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5NCA9IDE5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk1ID0gMTk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTYgPSAxOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5NyA9IDE5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk4ID0gMTk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTkgPSAxOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwMCA9IDIwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAxID0gMjAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDIgPSAyMDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwMyA9IDIwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA0ID0gMjA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDUgPSAyMDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwNiA9IDIwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA3ID0gMjA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDggPSAyMDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwOSA9IDIwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjEwID0gMjEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTEgPSAyMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxMiA9IDIxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjEzID0gMjEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTQgPSAyMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNSA9IDIxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE2ID0gMjE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTcgPSAyMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxOCA9IDIxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE5ID0gMjE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjAgPSAyMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMSA9IDIyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjIyID0gMjIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjMgPSAyMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyNCA9IDIyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI1ID0gMjI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjYgPSAyMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyNyA9IDIyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI4ID0gMjI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjkgPSAyMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzMCA9IDIzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMxID0gMjMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzIgPSAyMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzMyA9IDIzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM0ID0gMjM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzUgPSAyMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzNiA9IDIzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM3ID0gMjM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzggPSAyMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzOSA9IDIzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQwID0gMjQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDEgPSAyNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0MiA9IDI0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQzID0gMjQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDQgPSAyNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NSA9IDI0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ2ID0gMjQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDcgPSAyNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0OCA9IDI0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ5ID0gMjQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTAgPSAyNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MSA9IDI1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjUyID0gMjUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTMgPSAyNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1NCA9IDI1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU1ID0gMjU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTYgPSAyNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1NyA9IDI1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU4ID0gMjU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTkgPSAyNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2MCA9IDI2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYxID0gMjYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjIgPSAyNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2MyA9IDI2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY0ID0gMjY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjUgPSAyNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2NiA9IDI2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY3ID0gMjY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjggPSAyNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2OSA9IDI2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjcwID0gMjcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzEgPSAyNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3MiA9IDI3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjczID0gMjczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzQgPSAyNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NSA9IDI3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc2ID0gMjc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzcgPSAyNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3OCA9IDI3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc5ID0gMjc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODAgPSAyODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MSA9IDI4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjgyID0gMjgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODMgPSAyODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4NCA9IDI4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg1ID0gMjg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODYgPSAyODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4NyA9IDI4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg4ID0gMjg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODkgPSAyODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5MCA9IDI5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkxID0gMjkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTIgPSAyOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5MyA9IDI5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk0ID0gMjk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTUgPSAyOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5NiA9IDI5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk3ID0gMjk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTggPSAyOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5OSA9IDI5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzAwID0gMzAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDEgPSAzMDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwMiA9IDMwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzAzID0gMzAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDQgPSAzMDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNSA9IDMwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA2ID0gMzA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDcgPSAzMDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwOCA9IDMwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA5ID0gMzA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTAgPSAzMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMSA9IDMxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzEyID0gMzEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTMgPSAzMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxNCA9IDMxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE1ID0gMzE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTYgPSAzMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxNyA9IDMxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE4ID0gMzE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTkgPSAzMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyMCA9IDMyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIxID0gMzIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjIgPSAzMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyMyA9IDMyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI0ID0gMzI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjUgPSAzMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyNiA9IDMyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI3ID0gMzI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjggPSAzMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyOSA9IDMyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzMwID0gMzMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzEgPSAzMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzMiA9IDMzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzMzID0gMzMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzQgPSAzMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNSA9IDMzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM2ID0gMzM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzcgPSAzMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzOCA9IDMzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM5ID0gMzM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDAgPSAzNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MSA9IDM0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQyID0gMzQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDMgPSAzNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0NCA9IDM0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ1ID0gMzQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDYgPSAzNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0NyA9IDM0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ4ID0gMzQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDkgPSAzNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1MCA9IDM1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUxID0gMzUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTIgPSAzNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1MyA9IDM1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU0ID0gMzU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTUgPSAzNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1NiA9IDM1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU3ID0gMzU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTggPSAzNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1OSA9IDM1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzYwID0gMzYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjEgPSAzNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2MiA9IDM2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzYzID0gMzYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjQgPSAzNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NSA9IDM2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY2ID0gMzY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjcgPSAzNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2OCA9IDM2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY5ID0gMzY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzAgPSAzNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MSA9IDM3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzcyID0gMzcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzMgPSAzNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3NCA9IDM3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc1ID0gMzc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzYgPSAzNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3NyA9IDM3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc4ID0gMzc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzkgPSAzNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4MCA9IDM4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgxID0gMzgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODIgPSAzODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4MyA9IDM4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg0ID0gMzg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODUgPSAzODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4NiA9IDM4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg3ID0gMzg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODggPSAzODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4OSA9IDM4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzkwID0gMzkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTEgPSAzOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5MiA9IDM5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzkzID0gMzkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTQgPSAzOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NSA9IDM5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk2ID0gMzk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTcgPSAzOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5OCA9IDM5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk5ID0gMzk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDAgPSA0MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMSA9IDQwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDAyID0gNDAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDMgPSA0MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwNCA9IDQwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA1ID0gNDA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDYgPSA0MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwNyA9IDQwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA4ID0gNDA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDkgPSA0MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxMCA9IDQxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDExID0gNDExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTIgPSA0MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxMyA9IDQxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE0ID0gNDE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTUgPSA0MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxNiA9IDQxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE3ID0gNDE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTggPSA0MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxOSA9IDQxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDIwID0gNDIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjEgPSA0MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyMiA9IDQyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDIzID0gNDIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjQgPSA0MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNSA9IDQyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI2ID0gNDI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjcgPSA0MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyOCA9IDQyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI5ID0gNDI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzAgPSA0MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMSA9IDQzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDMyID0gNDMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzMgPSA0MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzNCA9IDQzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM1ID0gNDM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzYgPSA0MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzNyA9IDQzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM4ID0gNDM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzkgPSA0MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0MCA9IDQ0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQxID0gNDQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDIgPSA0NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0MyA9IDQ0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ0ID0gNDQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDUgPSA0NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0NiA9IDQ0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ3ID0gNDQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDggPSA0NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0OSA9IDQ0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDUwID0gNDUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTEgPSA0NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1MiA9IDQ1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDUzID0gNDUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTQgPSA0NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NSA9IDQ1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU2ID0gNDU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTcgPSA0NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1OCA9IDQ1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU5ID0gNDU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjAgPSA0NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MSA9IDQ2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDYyID0gNDYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjMgPSA0NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2NCA9IDQ2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY1ID0gNDY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjYgPSA0NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2NyA9IDQ2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY4ID0gNDY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjkgPSA0NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3MCA9IDQ3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDcxID0gNDcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzIgPSA0NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3MyA9IDQ3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc0ID0gNDc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzUgPSA0NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3NiA9IDQ3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc3ID0gNDc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzggPSA0NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3OSA9IDQ3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDgwID0gNDgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODEgPSA0ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4MiA9IDQ4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDgzID0gNDgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODQgPSA0ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NSA9IDQ4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg2ID0gNDg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODcgPSA0ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4OCA9IDQ4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg5ID0gNDg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTAgPSA0OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MSA9IDQ5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDkyID0gNDkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTMgPSA0OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5NCA9IDQ5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk1ID0gNDk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTYgPSA0OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5NyA9IDQ5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk4ID0gNDk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTkgPSA0OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwMCA9IDUwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAxID0gNTAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDIgPSA1MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwMyA9IDUwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA0ID0gNTA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDUgPSA1MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwNiA9IDUwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA3ID0gNTA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDggPSA1MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwOSA9IDUwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTEwID0gNTEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTEgPSA1MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxMiA9IDUxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTEzID0gNTEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTQgPSA1MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNSA9IDUxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE2ID0gNTE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTcgPSA1MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxOCA9IDUxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE5ID0gNTE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjAgPSA1MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMSA9IDUyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTIyID0gNTIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjMgPSA1MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyNCA9IDUyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI1ID0gNTI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjYgPSA1MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyNyA9IDUyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI4ID0gNTI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjkgPSA1MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzMCA9IDUzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMxID0gNTMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzIgPSA1MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzMyA9IDUzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM0ID0gNTM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzUgPSA1MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzNiA9IDUzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM3ID0gNTM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzggPSA1MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzOSA9IDUzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQwID0gNTQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDEgPSA1NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0MiA9IDU0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQzID0gNTQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDQgPSA1NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NSA9IDU0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ2ID0gNTQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDcgPSA1NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0OCA9IDU0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ5ID0gNTQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTAgPSA1NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MSA9IDU1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTUyID0gNTUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTMgPSA1NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1NCA9IDU1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU1ID0gNTU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTYgPSA1NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1NyA9IDU1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU4ID0gNTU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTkgPSA1NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2MCA9IDU2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYxID0gNTYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjIgPSA1NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2MyA9IDU2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY0ID0gNTY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjUgPSA1NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2NiA9IDU2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY3ID0gNTY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjggPSA1NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2OSA9IDU2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTcwID0gNTcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzEgPSA1NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3MiA9IDU3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTczID0gNTczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzQgPSA1NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NSA9IDU3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc2ID0gNTc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzcgPSA1NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3OCA9IDU3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc5ID0gNTc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODAgPSA1ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MSA9IDU4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTgyID0gNTgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODMgPSA1ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4NCA9IDU4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg1ID0gNTg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODYgPSA1ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4NyA9IDU4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg4ID0gNTg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODkgPSA1ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5MCA9IDU5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkxID0gNTkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTIgPSA1OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5MyA9IDU5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk0ID0gNTk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTUgPSA1OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5NiA9IDU5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk3ID0gNTk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTggPSA1OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5OSA9IDU5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjAwID0gNjAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDEgPSA2MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwMiA9IDYwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjAzID0gNjAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDQgPSA2MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNSA9IDYwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA2ID0gNjA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDcgPSA2MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwOCA9IDYwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA5ID0gNjA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTAgPSA2MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMSA9IDYxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjEyID0gNjEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTMgPSA2MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxNCA9IDYxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE1ID0gNjE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTYgPSA2MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxNyA9IDYxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE4ID0gNjE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTkgPSA2MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyMCA9IDYyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIxID0gNjIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjIgPSA2MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyMyA9IDYyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI0ID0gNjI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjUgPSA2MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyNiA9IDYyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI3ID0gNjI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjggPSA2MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyOSA9IDYyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjMwID0gNjMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzEgPSA2MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzMiA9IDYzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjMzID0gNjMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzQgPSA2MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNSA9IDYzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM2ID0gNjM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzcgPSA2MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzOCA9IDYzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM5ID0gNjM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDAgPSA2NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MSA9IDY0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQyID0gNjQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDMgPSA2NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0NCA9IDY0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ1ID0gNjQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDYgPSA2NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0NyA9IDY0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ4ID0gNjQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDkgPSA2NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1MCA9IDY1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUxID0gNjUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTIgPSA2NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1MyA9IDY1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU0ID0gNjU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTUgPSA2NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1NiA9IDY1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU3ID0gNjU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTggPSA2NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1OSA9IDY1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjYwID0gNjYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjEgPSA2NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2MiA9IDY2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjYzID0gNjYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjQgPSA2NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NSA9IDY2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY2ID0gNjY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjcgPSA2NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2OCA9IDY2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY5ID0gNjY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzAgPSA2NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MSA9IDY3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjcyID0gNjcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzMgPSA2NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3NCA9IDY3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc1ID0gNjc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzYgPSA2NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3NyA9IDY3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc4ID0gNjc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzkgPSA2NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4MCA9IDY4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgxID0gNjgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODIgPSA2ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4MyA9IDY4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg0ID0gNjg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODUgPSA2ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4NiA9IDY4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg3ID0gNjg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODggPSA2ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4OSA9IDY4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjkwID0gNjkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTEgPSA2OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5MiA9IDY5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjkzID0gNjkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTQgPSA2OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NSA9IDY5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk2ID0gNjk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTcgPSA2OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5OCA9IDY5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk5ID0gNjk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDAgPSA3MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMSA9IDcwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzAyID0gNzAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDMgPSA3MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwNCA9IDcwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA1ID0gNzA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDYgPSA3MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwNyA9IDcwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA4ID0gNzA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDkgPSA3MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxMCA9IDcxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzExID0gNzExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTIgPSA3MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxMyA9IDcxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE0ID0gNzE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTUgPSA3MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxNiA9IDcxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE3ID0gNzE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTggPSA3MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxOSA9IDcxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzIwID0gNzIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjEgPSA3MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyMiA9IDcyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzIzID0gNzIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjQgPSA3MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNSA9IDcyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI2ID0gNzI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjcgPSA3MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyOCA9IDcyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI5ID0gNzI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzAgPSA3MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMSA9IDczMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzMyID0gNzMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzMgPSA3MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczNCA9IDczNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM1ID0gNzM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzYgPSA3MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczNyA9IDczNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM4ID0gNzM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzkgPSA3MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0MCA9IDc0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQxID0gNzQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDIgPSA3NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0MyA9IDc0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ0ID0gNzQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDUgPSA3NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0NiA9IDc0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ3ID0gNzQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDggPSA3NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0OSA9IDc0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzUwID0gNzUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTEgPSA3NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1MiA9IDc1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzUzID0gNzUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTQgPSA3NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NSA9IDc1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU2ID0gNzU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTcgPSA3NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1OCA9IDc1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU5ID0gNzU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjAgPSA3NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MSA9IDc2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzYyID0gNzYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjMgPSA3NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2NCA9IDc2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY1ID0gNzY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjYgPSA3NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2NyA9IDc2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY4ID0gNzY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjkgPSA3NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3MCA9IDc3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzcxID0gNzcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzIgPSA3NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3MyA9IDc3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc0ID0gNzc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzUgPSA3NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3NiA9IDc3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc3ID0gNzc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzggPSA3NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3OSA9IDc3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzgwID0gNzgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODEgPSA3ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4MiA9IDc4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzgzID0gNzgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODQgPSA3ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NSA9IDc4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg2ID0gNzg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODcgPSA3ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4OCA9IDc4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg5ID0gNzg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTAgPSA3OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MSA9IDc5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzkyID0gNzkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTMgPSA3OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5NCA9IDc5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk1ID0gNzk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTYgPSA3OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5NyA9IDc5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk4ID0gNzk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTkgPSA3OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwMCA9IDgwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAxID0gODAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDIgPSA4MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwMyA9IDgwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA0ID0gODA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDUgPSA4MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwNiA9IDgwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA3ID0gODA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDggPSA4MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwOSA9IDgwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODEwID0gODEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTEgPSA4MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxMiA9IDgxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODEzID0gODEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTQgPSA4MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNSA9IDgxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE2ID0gODE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTcgPSA4MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxOCA9IDgxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE5ID0gODE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjAgPSA4MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMSA9IDgyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODIyID0gODIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjMgPSA4MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyNCA9IDgyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI1ID0gODI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjYgPSA4MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyNyA9IDgyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI4ID0gODI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjkgPSA4MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzMCA9IDgzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMxID0gODMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzIgPSA4MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzMyA9IDgzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM0ID0gODM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzUgPSA4MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzNiA9IDgzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM3ID0gODM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzggPSA4MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzOSA9IDgzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQwID0gODQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDEgPSA4NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0MiA9IDg0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQzID0gODQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDQgPSA4NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NSA9IDg0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ2ID0gODQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDcgPSA4NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0OCA9IDg0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ5ID0gODQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTAgPSA4NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MSA9IDg1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODUyID0gODUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTMgPSA4NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1NCA9IDg1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU1ID0gODU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTYgPSA4NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1NyA9IDg1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU4ID0gODU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTkgPSA4NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2MCA9IDg2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYxID0gODYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjIgPSA4NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2MyA9IDg2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY0ID0gODY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjUgPSA4NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2NiA9IDg2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY3ID0gODY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjggPSA4NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2OSA9IDg2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODcwID0gODcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzEgPSA4NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3MiA9IDg3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODczID0gODczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzQgPSA4NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NSA9IDg3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc2ID0gODc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzcgPSA4NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3OCA9IDg3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc5ID0gODc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODAgPSA4ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MSA9IDg4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODgyID0gODgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODMgPSA4ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4NCA9IDg4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg1ID0gODg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODYgPSA4ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4NyA9IDg4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg4ID0gODg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODkgPSA4ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5MCA9IDg5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkxID0gODkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTIgPSA4OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5MyA9IDg5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk0ID0gODk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTUgPSA4OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5NiA9IDg5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk3ID0gODk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTggPSA4OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5OSA9IDg5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTAwID0gOTAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDEgPSA5MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwMiA9IDkwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTAzID0gOTAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDQgPSA5MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNSA9IDkwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA2ID0gOTA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDcgPSA5MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwOCA9IDkwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA5ID0gOTA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTAgPSA5MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMSA9IDkxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTEyID0gOTEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTMgPSA5MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxNCA9IDkxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE1ID0gOTE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTYgPSA5MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxNyA9IDkxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE4ID0gOTE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTkgPSA5MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyMCA9IDkyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIxID0gOTIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjIgPSA5MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyMyA9IDkyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI0ID0gOTI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjUgPSA5MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyNiA9IDkyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI3ID0gOTI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjggPSA5MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyOSA9IDkyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTMwID0gOTMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzEgPSA5MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzMiA9IDkzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTMzID0gOTMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzQgPSA5MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNSA9IDkzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM2ID0gOTM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzcgPSA5MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzOCA9IDkzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM5ID0gOTM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDAgPSA5NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MSA9IDk0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQyID0gOTQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDMgPSA5NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0NCA9IDk0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ1ID0gOTQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDYgPSA5NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0NyA9IDk0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ4ID0gOTQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDkgPSA5NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1MCA9IDk1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUxID0gOTUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTIgPSA5NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1MyA9IDk1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU0ID0gOTU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTUgPSA5NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1NiA9IDk1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU3ID0gOTU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTggPSA5NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1OSA9IDk1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTYwID0gOTYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjEgPSA5NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2MiA9IDk2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTYzID0gOTYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjQgPSA5NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NSA9IDk2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY2ID0gOTY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjcgPSA5NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2OCA9IDk2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY5ID0gOTY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzAgPSA5NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MSA9IDk3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTcyID0gOTcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzMgPSA5NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3NCA9IDk3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc1ID0gOTc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzYgPSA5NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3NyA9IDk3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc4ID0gOTc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzkgPSA5NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4MCA9IDk4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgxID0gOTgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODIgPSA5ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4MyA9IDk4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg0ID0gOTg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODUgPSA5ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4NiA9IDk4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg3ID0gOTg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODggPSA5ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4OSA9IDk4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTkwID0gOTkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTEgPSA5OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5MiA9IDk5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTkzID0gOTkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTQgPSA5OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NSA9IDk5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk2ID0gOTk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTcgPSA5OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5OCA9IDk5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk5ID0gOTk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDAwID0gMTAwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNWIxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8KQEAgLTAsMCArMSw2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHdoaWNoIGlzIGltcG9ydGVkIGJ5IHVuaXR0ZXN0LnByb3RvIHRvIHRlc3QgaW1wb3J0aW5nLgorCisKKy8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgorLy8gSW4gdGVzdF91dGlsLmggd2UgZG8KKy8vICJ1c2luZyBuYW1lc3BhY2UgdW5pdHRlc3RfaW1wb3J0ID0gcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0Ii4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKKy8vIEV4Y2VyY2lzZSB0aGUgamF2YV9wYWNrYWdlIG9wdGlvbi4KK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0IjsKKworLy8gRG8gbm90IHNldCBhIGphdmFfb3V0ZXJfY2xhc3NuYW1lIGhlcmUgdG8gdmVyaWZ5IHRoYXQgUHJvdG8yIHdvcmtzIHdpdGhvdXQKKy8vIG9uZS4KKworLy8gVGVzdCBwdWJsaWMgaW1wb3J0CitpbXBvcnQgcHVibGljICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90byI7CisKK21lc3NhZ2UgSW1wb3J0TWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGQgPSAxOworfQorCitlbnVtIEltcG9ydEVudW0geworICBJTVBPUlRfRk9PID0gNzsKKyAgSU1QT1JUX0JBUiA9IDg7CisgIElNUE9SVF9CQVogPSA5OworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiMTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90bwpAQCAtMCwwICsxLDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gVGhpcyBpcyBsaWtlIHVuaXR0ZXN0X2ltcG9ydC5wcm90byBidXQgd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUuCisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworCitpbXBvcnQgcHVibGljICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvIjsKKworbWVzc2FnZSBJbXBvcnRNZXNzYWdlTGl0ZSB7CisgIG9wdGlvbmFsIGludDMyIGQgPSAxOworfQorCitlbnVtIEltcG9ydEVudW1MaXRlIHsKKyAgSU1QT1JUX0xJVEVfRk9PID0gNzsKKyAgSU1QT1JUX0xJVEVfQkFSID0gODsKKyAgSU1QT1JUX0xJVEVfQkFaID0gOTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogbGl1amlzaUBnb29nbGUuY29tIChQaGVybCBMaXUpCisKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0IjsKKworbWVzc2FnZSBQdWJsaWNJbXBvcnRNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgZSA9IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc3NTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90bwpAQCAtMCwwICsxLDQyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGxpdWppc2lAZ29vZ2xlLmNvbSAoUGhlcmwgTGl1KQorCisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworCittZXNzYWdlIFB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgZSA9IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzY0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90bwpAQCAtMCwwICsxLDM2MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRoaXMgaXMgbGlrZSB1bml0dGVzdC5wcm90byBidXQgd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUuCisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIjsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKKworLy8gU2FtZSBhcyBUZXN0QWxsVHlwZXMgYnV0IHdpdGggdGhlIGxpdGUgcnVudGltZS4KK21lc3NhZ2UgVGVzdEFsbFR5cGVzTGl0ZSB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOworICB9CisKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBGT08gPSAxOworICAgIEJBUiA9IDI7CisgICAgQkFaID0gMzsKKyAgfQorCisgIC8vIFNpbmd1bGFyCisgIG9wdGlvbmFsICAgIGludDMyIG9wdGlvbmFsX2ludDMyICAgID0gIDE7CisgIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0ICAgID0gIDI7CisgIG9wdGlvbmFsICAgdWludDMyIG9wdGlvbmFsX3VpbnQzMiAgID0gIDM7CisgIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCAgID0gIDQ7CisgIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiAgID0gIDU7CisgIG9wdGlvbmFsICAgc2ludDY0IG9wdGlvbmFsX3NpbnQ2NCAgID0gIDY7CisgIG9wdGlvbmFsICBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzIgID0gIDc7CisgIG9wdGlvbmFsICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjQgID0gIDg7CisgIG9wdGlvbmFsIHNmaXhlZDMyIG9wdGlvbmFsX3NmaXhlZDMyID0gIDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0ID0gMTA7CisgIG9wdGlvbmFsICAgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ICAgID0gMTE7CisgIG9wdGlvbmFsICAgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSAgID0gMTI7CisgIG9wdGlvbmFsICAgICBib29sIG9wdGlvbmFsX2Jvb2wgICAgID0gMTM7CisgIG9wdGlvbmFsICAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyAgID0gMTQ7CisgIG9wdGlvbmFsICAgIGJ5dGVzIG9wdGlvbmFsX2J5dGVzICAgID0gMTU7CisKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDE2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIH0KKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgID0gMTg7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlTGl0ZSBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VMaXRlCisgICAgb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgPSAyMDsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZSBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlIG9wdGlvbmFsX2ltcG9ydF9lbnVtID0gMjM7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBEZWZpbmVkIGluIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlCisgICAgICBvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UgPSAyNjsKKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX2xhenlfbWVzc2FnZSA9IDI3IFtsYXp5PXRydWVdOworCisgIC8vIFJlcGVhdGVkCisgIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyICAgID0gMzE7CisgIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0ICAgID0gMzI7CisgIHJlcGVhdGVkICAgdWludDMyIHJlcGVhdGVkX3VpbnQzMiAgID0gMzM7CisgIHJlcGVhdGVkICAgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCAgID0gMzQ7CisgIHJlcGVhdGVkICAgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiAgID0gMzU7CisgIHJlcGVhdGVkICAgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NCAgID0gMzY7CisgIHJlcGVhdGVkICBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzIgID0gMzc7CisgIHJlcGVhdGVkICBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyID0gMzk7CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0ID0gNDA7CisgIHJlcGVhdGVkICAgIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ICAgID0gNDE7CisgIHJlcGVhdGVkICAgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSAgID0gNDI7CisgIHJlcGVhdGVkICAgICBib29sIHJlcGVhdGVkX2Jvb2wgICAgID0gNDM7CisgIHJlcGVhdGVkICAgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyAgID0gNDQ7CisgIHJlcGVhdGVkICAgIGJ5dGVzIHJlcGVhdGVkX2J5dGVzICAgID0gNDU7CisKKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDQ2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gNDc7CisgIH0KKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlTGl0ZSByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPSA0OTsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VMaXRlCisgICAgcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgPSA1MDsKKworICByZXBlYXRlZCBOZXN0ZWRFbnVtICAgICAgcmVwZWF0ZWRfbmVzdGVkX2VudW0gID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtTGl0ZSByZXBlYXRlZF9mb3JlaWduX2VudW0gPSA1MjsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlIHJlcGVhdGVkX2ltcG9ydF9lbnVtID0gNTM7CisKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZSA9IDU0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZCA9IDU1IFtjdHlwZT1DT1JEXTsKKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX2xhenlfbWVzc2FnZSA9IDU3IFtsYXp5PXRydWVdOworCisgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKKyAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CisgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjQgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOworICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMiAgID0gNjMgW2RlZmF1bHQgPSAgNDMgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50NjQgZGVmYXVsdF91aW50NjQgICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOworICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NCAgID0gNjYgW2RlZmF1bHQgPSAgNDYgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NCAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyID0gNjkgW2RlZmF1bHQgPSAgNDkgICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgZGVmYXVsdF9zZml4ZWQ2NCA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07CisgIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXQgICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOworICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZSAgID0gNzIgW2RlZmF1bHQgPSAgNTJlMyAgXTsKKyAgb3B0aW9uYWwgICAgIGJvb2wgZGVmYXVsdF9ib29sICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07CisgIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOworICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtIGRlZmF1bHRfbmVzdGVkX2VudW0gPSA4MSBbZGVmYXVsdCA9IEJBUl07CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZSBkZWZhdWx0X2ZvcmVpZ25fZW51bSA9IDgyCisgICAgICBbZGVmYXVsdCA9IEZPUkVJR05fTElURV9CQVJdOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUKKyAgICAgIGRlZmF1bHRfaW1wb3J0X2VudW0gPSA4MyBbZGVmYXVsdCA9IElNUE9SVF9MSVRFX0JBUl07CisKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSxkZWZhdWx0PSJhYmMiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZCA9IDg1IFtjdHlwZT1DT1JELGRlZmF1bHQ9IjEyMyJdOworfQorCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlTGl0ZSB7CisgIG9wdGlvbmFsIGludDMyIGMgPSAxOworfQorCitlbnVtIEZvcmVpZ25FbnVtTGl0ZSB7CisgIEZPUkVJR05fTElURV9GT08gPSA0OworICBGT1JFSUdOX0xJVEVfQkFSID0gNTsKKyAgRk9SRUlHTl9MSVRFX0JBWiA9IDY7Cit9CisKK21lc3NhZ2UgVGVzdFBhY2tlZFR5cGVzTGl0ZSB7CisgIHJlcGVhdGVkICAgIGludDMyIHBhY2tlZF9pbnQzMiAgICA9ICA5MCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGludDY0IHBhY2tlZF9pbnQ2NCAgICA9ICA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDMyIHBhY2tlZF91aW50MzIgICA9ICA5MiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDY0IHBhY2tlZF91aW50NjQgICA9ICA5MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHBhY2tlZF9zaW50MzIgICA9ICA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHBhY2tlZF9zaW50NjQgICA9ICA5NSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHBhY2tlZF9maXhlZDMyICA9ICA5NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHBhY2tlZF9maXhlZDY0ICA9ICA5NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9zZml4ZWQzMiA9ICA5OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NCA9ICA5OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHBhY2tlZF9mbG9hdCAgICA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHBhY2tlZF9kb3VibGUgICA9IDEwMSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgICBib29sIHBhY2tlZF9ib29sICAgICA9IDEwMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtTGl0ZSBwYWNrZWRfZW51bSAgPSAxMDMgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2V4dGVuZCBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgeworICAvLyBTaW5ndWxhcgorICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICA9ICAxOworICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICA9ICAyOworICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9ICAzOworICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9ICA0OworICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9ICA1OworICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9ICA2OworICBvcHRpb25hbCAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICA9ICA3OworICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICA9ICA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9ICA5OworICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9IDEwOworICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICA9IDExOworICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICA9IDEyOworICBvcHRpb25hbCAgICAgYm9vbCBvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlICAgICA9IDEzOworICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICA9IDE0OworICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICA9IDE1OworCisgIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgPSAxNiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OworICB9CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlCisgICAgICA9IDE4OworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZUxpdGUgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMTk7CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQorICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMjA7CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZSBvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCisgICAgb3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgPSAyMzsKKworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl9saXRlID0gMjQKKyAgICAgIFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZF9leHRlbnNpb25fbGl0ZSA9IDI1IFtjdHlwZT1DT1JEXTsKKworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZUxpdGUKKyAgICBvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSAyNjsKKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UKKyAgICBvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSAyNyBbbGF6eT10cnVlXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICA9IDMxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICA9IDMyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9IDM0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9IDM1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICA9IDM3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9IDQwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICA9IDQxOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICA9IDQzOworICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICA9IDQ0OworICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgPSA0NiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICB9CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlCisgICAgICA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZUxpdGUgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQorICAgIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gNTA7CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtTGl0ZSByZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA1MjsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCisgICAgcmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl9saXRlID0gNTQKKyAgICAgIFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZF9leHRlbnNpb25fbGl0ZSA9IDU1IFtjdHlwZT1DT1JEXTsKKworICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UKKyAgICByZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSA1NyBbbGF6eT10cnVlXTsKKworICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCisgIG9wdGlvbmFsICAgIGludDMyIGRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAgPSA2MSBbZGVmYXVsdCA9ICA0MSAgICBdOworICBvcHRpb25hbCAgICBpbnQ2NCBkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50MzIgZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9IDYzIFtkZWZhdWx0ID0gIDQzICAgIF07CisgIG9wdGlvbmFsICAgdWludDY0IGRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl9saXRlICAgPSA2NCBbZGVmYXVsdCA9ICA0NCAgICBdOworICBvcHRpb25hbCAgIHNpbnQzMiBkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gNjUgW2RlZmF1bHQgPSAtNDUgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50NjQgZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9IDY2IFtkZWZhdWx0ID0gIDQ2ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAgPSA2NyBbZGVmYXVsdCA9ICA0NyAgICBdOworICBvcHRpb25hbCAgZml4ZWQ2NCBkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gNjggW2RlZmF1bHQgPSAgNDggICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9IDY5IFtkZWZhdWx0ID0gIDQ5ICAgIF07CisgIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSA3MCBbZGVmYXVsdCA9IC01MCAgICBdOworICBvcHRpb25hbCAgICBmbG9hdCBkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gNzEgW2RlZmF1bHQgPSAgNTEuNSAgXTsKKyAgb3B0aW9uYWwgICBkb3VibGUgZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICA9IDcyIFtkZWZhdWx0ID0gIDUyZTMgIF07CisgIG9wdGlvbmFsICAgICBib29sIGRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAgPSA3MyBbZGVmYXVsdCA9IHRydWUgICBdOworICBvcHRpb25hbCAgIHN0cmluZyBkZWZhdWx0X3N0cmluZ19leHRlbnNpb25fbGl0ZSAgID0gNzQgW2RlZmF1bHQgPSAiaGVsbG8iXTsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtCisgICAgZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1MaXRlCisgICAgZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA4MiBbZGVmYXVsdCA9IEZPUkVJR05fTElURV9CQVJdOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUKKyAgICBkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlID0gODMgW2RlZmF1bHQgPSBJTVBPUlRfTElURV9CQVJdOworCisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25fbGl0ZSA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJhYmMiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZF9leHRlbnNpb25fbGl0ZSA9IDg1IFtjdHlwZT1DT1JELCBkZWZhdWx0PSIxMjMiXTsKK30KKworbWVzc2FnZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgeworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCitleHRlbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIHsKKyAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gIDkxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDk0IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gIDk3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKK30KKworbWVzc2FnZSBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSB7CisgIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgeworICAgIG9wdGlvbmFsIGludDMyIG5lc3RlZF9leHRlbnNpb24gPSAxMjM0NTsKKyAgfQorfQorCisvLyBUZXN0IHRoYXQgZGVwcmVjYXRlZCBmaWVsZHMgd29yay4gIFdlIG9ubHkgdmVyaWZ5IHRoYXQgdGhleSBjb21waWxlIChhdCBvbmUKKy8vIHBvaW50IHRoaXMgZmFpbGVkKS4KK21lc3NhZ2UgVGVzdERlcHJlY2F0ZWRMaXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgZGVwcmVjYXRlZF9maWVsZCA9IDEgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKK30KKworLy8gU2VlIHRoZSBjb21tZW50cyBvZiB0aGUgc2FtZSB0eXBlIGluIHVuaXR0ZXN0LnByb3RvLgorbWVzc2FnZSBUZXN0UGFyc2luZ01lcmdlTGl0ZSB7CisgIG1lc3NhZ2UgUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgeworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMTsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlIGZpZWxkMiA9IDI7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBmaWVsZDMgPSAzOworICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMSA9IDEwIHsKKyAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMTE7CisgICAgfQorICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMiA9IDIwIHsKKyAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMjE7CisgICAgfQorICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgZXh0MSA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBleHQyID0gMTAwMTsKKyAgfQorICByZXF1aXJlZCBUZXN0QWxsVHlwZXNMaXRlIHJlcXVpcmVkX2FsbF90eXBlcyA9IDE7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgb3B0aW9uYWxfYWxsX3R5cGVzID0gMjsKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSByZXBlYXRlZF9hbGxfdHlwZXMgPSAzOworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTAgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgb3B0aW9uYWxfZ3JvdXBfYWxsX3R5cGVzID0gMTE7CisgIH0KKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDIwIHsKKyAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlIHJlcGVhdGVkX2dyb3VwX2FsbF90eXBlcyA9IDIxOworICB9CisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgIGV4dGVuZCBUZXN0UGFyc2luZ01lcmdlTGl0ZSB7CisgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZSBvcHRpb25hbF9leHQgPSAxMDAwOworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgcmVwZWF0ZWRfZXh0ID0gMTAwMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MmNiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8KQEAgLTAsMCArMSw0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRlc3RzIHRoYXQgYSAibGl0ZSIgbWVzc2FnZSBjYW4gaW1wb3J0IGEgcmVndWxhciBtZXNzYWdlLgorCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byI7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSB7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5N2YwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCkBAIC0wLDAgKzEsNzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBtZXNzYWdlcyBmb3IgdGVzdGluZyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCisvLyBBIG1lc3NhZ2Ugd2l0aCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KK21lc3NhZ2UgVGVzdE1lc3NhZ2VTZXQgeworICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOworICBleHRlbnNpb25zIDQgdG8gbWF4OworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIHsKKyAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQgPSAxOworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSB7CisgIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDE1NDUwMDg7CisgIH0KKyAgb3B0aW9uYWwgaW50MzIgaSA9IDE1OworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiB7CisgIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDE1NDc3Njk7CisgIH0KKyAgb3B0aW9uYWwgc3RyaW5nIHN0ciA9IDI1OworfQorCisvLyBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0IGlzIGVxdWl2YWxlbnQgdG8gdGhpcy4KK21lc3NhZ2UgUmF3TWVzc2FnZVNldCB7CisgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgICByZXF1aXJlZCBieXRlcyBtZXNzYWdlID0gMzsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmI0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90bwpAQCAtMCwwICsxLDUyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLm5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDsKKworLy8gKl9nZW5lcmljX3NlcnZpY2VzIGFyZSBmYWxzZSBieSBkZWZhdWx0LgorCittZXNzYWdlIFRlc3RNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK2VudW0gVGVzdEVudW0geworICBGT08gPSAxOworfQorCitleHRlbmQgVGVzdE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiB0ZXN0X2V4dGVuc2lvbiA9IDEwMDA7Cit9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UgeworICBycGMgRm9vKFRlc3RNZXNzYWdlKSByZXR1cm5zKFRlc3RNZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZWNiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aGljaCB1c2VzIG9wdGltaXplX2ZvciA9IENPREVfU0laRS4KKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitvcHRpb24gb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFOworCittZXNzYWdlIFRlc3RPcHRpbWl6ZWRGb3JTaXplIHsKKyAgb3B0aW9uYWwgaW50MzIgaSA9IDE7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlIG1zZyA9IDE5OworCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisKKyAgZXh0ZW5kIFRlc3RPcHRpbWl6ZWRGb3JTaXplIHsKKyAgICBvcHRpb25hbCBpbnQzMiB0ZXN0X2V4dGVuc2lvbiA9IDEyMzQ7CisgICAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSB0ZXN0X2V4dGVuc2lvbjIgPSAxMjM1OworICB9Cit9CisKK21lc3NhZ2UgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSB7CisgIHJlcXVpcmVkIGludDMyIHggPSAxOworfQorIAorbWVzc2FnZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIHsKKyAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBvID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDE0MzNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjCkBAIC0wLDAgKzEsMjY2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitVbmtub3duRmllbGRTZXQ6OlVua25vd25GaWVsZFNldCgpCisgIDogZmllbGRzXyhOVUxMKSB7fQorCitVbmtub3duRmllbGRTZXQ6On5Vbmtub3duRmllbGRTZXQoKSB7CisgIENsZWFyKCk7CisgIGRlbGV0ZSBmaWVsZHNfOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6Q2xlYXJGYWxsYmFjaygpIHsKKyAgR09PR0xFX0RDSEVDSyhmaWVsZHNfICE9IE5VTEwpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc18tPnNpemUoKTsgaSsrKSB7CisgICAgKCpmaWVsZHNfKVtpXS5EZWxldGUoKTsKKyAgfQorICBmaWVsZHNfLT5jbGVhcigpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6Q2xlYXJBbmRGcmVlTWVtb3J5KCkgeworICBpZiAoZmllbGRzXyAhPSBOVUxMKSB7CisgICAgQ2xlYXIoKTsKKyAgICBkZWxldGUgZmllbGRzXzsKKyAgICBmaWVsZHNfID0gTlVMTDsKKyAgfQorfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6TWVyZ2VGcm9tKGNvbnN0IFVua25vd25GaWVsZFNldCYgb3RoZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlci5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBBZGRGaWVsZChvdGhlci5maWVsZChpKSk7CisgIH0KK30KKworaW50IFVua25vd25GaWVsZFNldDo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0IHsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgaW50IHRvdGFsX3NpemUgPSBzaXplb2YoKmZpZWxkc18pICsgc2l6ZW9mKFVua25vd25GaWVsZCkgKiBmaWVsZHNfLT5zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzXy0+c2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gKCpmaWVsZHNfKVtpXTsKKyAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgeworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8pICsKKyAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6U3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgICB0b3RhbF9zaXplICs9IGZpZWxkLmdyb3VwXy0+U3BhY2VVc2VkKCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCitpbnQgVW5rbm93bkZpZWxkU2V0OjpTcGFjZVVzZWQoKSBjb25zdCB7CisgIHJldHVybiBzaXplb2YoKnRoaXMpICsgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6QWRkVmFyaW50KGludCBudW1iZXIsIHVpbnQ2NCB2YWx1ZSkgeworICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+OworICBVbmtub3duRmllbGQgZmllbGQ7CisgIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7CisgIGZpZWxkLnR5cGVfID0gVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDsKKyAgZmllbGQudmFyaW50XyA9IHZhbHVlOworICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6QWRkRml4ZWQzMihpbnQgbnVtYmVyLCB1aW50MzIgdmFsdWUpIHsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKKyAgVW5rbm93bkZpZWxkIGZpZWxkOworICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOworICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOworICBmaWVsZC5maXhlZDMyXyA9IHZhbHVlOworICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6QWRkRml4ZWQ2NChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUpIHsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKKyAgVW5rbm93bkZpZWxkIGZpZWxkOworICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOworICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OworICBmaWVsZC5maXhlZDY0XyA9IHZhbHVlOworICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOworfQorCitzdHJpbmcqIFVua25vd25GaWVsZFNldDo6QWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIpIHsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKKyAgVW5rbm93bkZpZWxkIGZpZWxkOworICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOworICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOworICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfID0gbmV3IHN0cmluZzsKKyAgZmllbGRzXy0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgcmV0dXJuIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87Cit9CisKKworVW5rbm93bkZpZWxkU2V0KiBVbmtub3duRmllbGRTZXQ6OkFkZEdyb3VwKGludCBudW1iZXIpIHsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKKyAgVW5rbm93bkZpZWxkIGZpZWxkOworICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOworICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDsKKyAgZmllbGQuZ3JvdXBfID0gbmV3IFVua25vd25GaWVsZFNldDsKKyAgZmllbGRzXy0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgcmV0dXJuIGZpZWxkLmdyb3VwXzsKK30KKwordm9pZCBVbmtub3duRmllbGRTZXQ6OkFkZEZpZWxkKGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQpIHsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKKyAgZmllbGRzXy0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgZmllbGRzXy0+YmFjaygpLkRlZXBDb3B5KCk7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpEZWxldGVTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0pIHsKKyAgR09PR0xFX0RDSEVDSyhmaWVsZHNfICE9IE5VTEwpOworICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAoKmZpZWxkc18pW2kgKyBzdGFydF0uRGVsZXRlKCk7CisgIH0KKyAgLy8gU2xpZGUgZG93biB0aGUgcmVtYWluaW5nIGZpZWxkcy4KKyAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgbnVtOyBpIDwgZmllbGRzXy0+c2l6ZSgpOyArK2kpIHsKKyAgICAoKmZpZWxkc18pW2kgLSBudW1dID0gKCpmaWVsZHNfKVtpXTsKKyAgfQorICAvLyBQb3Agb2ZmIHRoZSAjIG9mIGRlbGV0ZWQgZmllbGRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgZmllbGRzXy0+cG9wX2JhY2soKTsKKyAgfQorfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6RGVsZXRlQnlOdW1iZXIoaW50IG51bWJlcikgeworICBpZiAoZmllbGRzXyA9PSBOVUxMKSByZXR1cm47CisgIGludCBsZWZ0ID0gMDsgIC8vIFRoZSBudW1iZXIgb2YgZmllbGRzIGxlZnQgYWZ0ZXIgZGVsZXRpb24uCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzXy0+c2l6ZSgpOyArK2kpIHsKKyAgICBVbmtub3duRmllbGQqIGZpZWxkID0gJigqZmllbGRzXylbaV07CisgICAgaWYgKGZpZWxkLT5udW1iZXIoKSA9PSBudW1iZXIpIHsKKyAgICAgIGZpZWxkLT5EZWxldGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGkgIT0gbGVmdCkgeworICAgICAgICAoKmZpZWxkc18pW2xlZnRdID0gKCpmaWVsZHNfKVtpXTsKKyAgICAgIH0KKyAgICAgICsrbGVmdDsKKyAgICB9CisgIH0KKyAgZmllbGRzXy0+cmVzaXplKGxlZnQpOworfQorCitib29sIFVua25vd25GaWVsZFNldDo6TWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisKKyAgVW5rbm93bkZpZWxkU2V0IG90aGVyOworICBpZiAoaW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKGlucHV0LCAmb3RoZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKSB7CisgICAgTWVyZ2VGcm9tKG90aGVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBVbmtub3duRmllbGRTZXQ6OlBhcnNlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICBDbGVhcigpOworICByZXR1cm4gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW5wdXQpOworfQorCitib29sIFVua25vd25GaWVsZFNldDo6UGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KGlucHV0KTsKKyAgcmV0dXJuIFBhcnNlRnJvbUNvZGVkU3RyZWFtKCZjb2RlZF9pbnB1dCkgJiYKKyAgICBjb2RlZF9pbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKK30KKworYm9vbCBVbmtub3duRmllbGRTZXQ6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0KGRhdGEsIHNpemUpOworICByZXR1cm4gUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oJmlucHV0KTsKK30KKwordm9pZCBVbmtub3duRmllbGQ6OkRlbGV0ZSgpIHsKKyAgc3dpdGNoICh0eXBlKCkpIHsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgZGVsZXRlIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgIGRlbGV0ZSBncm91cF87CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBVbmtub3duRmllbGQ6OkRlZXBDb3B5KCkgeworICBzd2l0Y2ggKHR5cGUoKSkgeworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICBsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfID0gbmV3IHN0cmluZygKKyAgICAgICAgICAqbGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDogeworICAgICAgVW5rbm93bkZpZWxkU2V0KiBncm91cCA9IG5ldyBVbmtub3duRmllbGRTZXQ7CisgICAgICBncm91cC0+TWVyZ2VGcm9tKCpncm91cF8pOworICAgICAgZ3JvdXBfID0gZ3JvdXA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKKwordm9pZCBVbmtub3duRmllbGQ6OlNlcmlhbGl6ZUxlbmd0aERlbGltaXRlZE5vVGFnKAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0eXBlXyk7CisgIGNvbnN0IHN0cmluZyYgZGF0YSA9ICpsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoZGF0YS5zaXplKCkpOworICBvdXRwdXQtPldyaXRlU3RyaW5nKGRhdGEpOworfQorCit1aW50OCogVW5rbm93bkZpZWxkOjpTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZ1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3QgeworICBHT09HTEVfRENIRUNLX0VRKFRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdHlwZV8pOworICBjb25zdCBzdHJpbmcmIGRhdGEgPSAqbGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXzsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShkYXRhLnNpemUoKSwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZ1RvQXJyYXkoZGF0YSwgdGFyZ2V0KTsKKyAgcmV0dXJuIHRhcmdldDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNWJiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaApAQCAtMCwwICsxLDMxMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQ29udGFpbnMgY2xhc3NlcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdW5yZWNvZ25pemVkIGZpZWxkcyBzZWVuIHdoaWxlCisvLyBwYXJzaW5nIGEgcHJvdG9jb2wgbWVzc2FnZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVU5LTk9XTl9GSUVMRF9TRVRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorLy8gVE9ETyhqYXNvbmgpOiBzb21lIHBlb3BsZSBzZWVtIHRvIHJlbHkgb24gcHJvdG9idWZzIHRvIGluY2x1ZGUgdGhpcyBmb3IgdGhlbSEKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIENvZGVkSW5wdXRTdHJlYW07ICAgICAgICAgLy8gY29kZWRfc3RyZWFtLmgKKyAgICBjbGFzcyBDb2RlZE91dHB1dFN0cmVhbTsgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCisgICAgY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsgICAgICAvLyB6ZXJvX2NvcHlfc3RyZWFtLmgKKyAgfQorICBuYW1lc3BhY2UgaW50ZXJuYWwgeworICAgIGNsYXNzIFdpcmVGb3JtYXQ7ICAgICAgICAgICAgICAgLy8gd2lyZV9mb3JtYXQuaAorICAgIGNsYXNzIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlclVzaW5nQ29yZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MKKyAgfQorCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLmgKK2NsYXNzIFVua25vd25GaWVsZDsgICAgICAgICAgICAgICAgIC8vIGJlbG93CisKKy8vIEFuIFVua25vd25GaWVsZFNldCBjb250YWlucyBmaWVsZHMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgYQorLy8gbWVzc2FnZSBidXQgd2VyZSBub3QgZGVmaW5lZCBieSBpdHMgdHlwZS4gIEtlZXBpbmcgdHJhY2sgb2YgdGhlc2UgY2FuIGJlCisvLyB1c2VmdWwsIGVzcGVjaWFsbHkgaW4gdGhhdCB0aGV5IG1heSBiZSB3cml0dGVuIGlmIHRoZSBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQKKy8vIGFnYWluIHdpdGhvdXQgYmVpbmcgY2xlYXJlZCBpbiBiZXR3ZWVuLiAgVGhpcyBtZWFucyB0aGF0IHNvZnR3YXJlIHdoaWNoCisvLyBzaW1wbHkgcmVjZWl2ZXMgbWVzc2FnZXMgYW5kIGZvcndhcmRzIHRoZW0gdG8gb3RoZXIgc2VydmVycyBkb2VzIG5vdCBuZWVkCisvLyB0byBiZSB1cGRhdGVkIGV2ZXJ5IHRpbWUgYSBuZXcgZmllbGQgaXMgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbi4KKy8vCisvLyBUbyBnZXQgdGhlIFVua25vd25GaWVsZFNldCBhdHRhY2hlZCB0byBhbnkgbWVzc2FnZSwgY2FsbAorLy8gUmVmbGVjdGlvbjo6R2V0VW5rbm93bkZpZWxkcygpLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgbmVjZXNzYXJpbHkgdGllZCB0byB0aGUgcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LCB1bmxpa2UKKy8vIHRoZSBSZWZsZWN0aW9uIGludGVyZmFjZSB3aGljaCBpcyBpbmRlcGVuZGVudCBvZiBhbnkgc2VyaWFsaXphdGlvbiBzY2hlbWUuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVW5rbm93bkZpZWxkU2V0IHsKKyBwdWJsaWM6CisgIFVua25vd25GaWVsZFNldCgpOworICB+VW5rbm93bkZpZWxkU2V0KCk7CisKKyAgLy8gUmVtb3ZlIGFsbCBmaWVsZHMuCisgIGlubGluZSB2b2lkIENsZWFyKCk7CisKKyAgLy8gUmVtb3ZlIGFsbCBmaWVsZHMgYW5kIGRlYWxsb2NhdGUgaW50ZXJuYWwgZGF0YSBvYmplY3RzCisgIHZvaWQgQ2xlYXJBbmRGcmVlTWVtb3J5KCk7CisKKyAgLy8gSXMgdGhpcyBzZXQgZW1wdHk/CisgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3Q7CisKKyAgLy8gTWVyZ2UgdGhlIGNvbnRlbnRzIG9mIHNvbWUgb3RoZXIgVW5rbm93bkZpZWxkU2V0IHdpdGggdGhpcyBvbmUuCisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFVua25vd25GaWVsZFNldCYgb3RoZXIpOworCisgIC8vIFN3YXBzIHRoZSBjb250ZW50cyBvZiBzb21lIG90aGVyIFVua25vd25GaWVsZFNldCB3aXRoIHRoaXMgb25lLgorICBpbmxpbmUgdm9pZCBTd2FwKFVua25vd25GaWVsZFNldCogeCk7CisKKyAgLy8gQ29tcHV0ZXMgKGFuIGVzdGltYXRlIG9mKSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSB1c2VkIGZvcgorICAvLyBzdG9yaW5nIHRoZSB1bmtub3duIGZpZWxkcyBpbiBtZW1vcnkuIERvZXMgTk9UIGluY2x1ZGUKKyAgLy8gc2l6ZW9mKCp0aGlzKSBpbiB0aGUgY2FsY3VsYXRpb24uCisgIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7CisKKyAgLy8gVmVyc2lvbiBvZiBTcGFjZVVzZWQoKSBpbmNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4KKyAgaW50IFNwYWNlVXNlZCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgcHJlc2VudCBpbiB0aGUgVW5rbm93bkZpZWxkU2V0LgorICBpbmxpbmUgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldCBhIGZpZWxkIGluIHRoZSBzZXQsIHdoZXJlIDAgPD0gaW5kZXggPCBmaWVsZF9jb3VudCgpLiAgVGhlIGZpZWxkcworICAvLyBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KKyAgaW5saW5lIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQoaW50IGluZGV4KSBjb25zdDsKKyAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGEgZmllbGQgaW4gdGhlIHNldCwgd2hlcmUKKyAgLy8gMCA8PSBpbmRleCA8IGZpZWxkX2NvdW50KCkuICBUaGUgZmllbGRzIGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2gKKyAgLy8gdGhleSB3ZXJlIGFkZGVkLgorICBpbmxpbmUgVW5rbm93bkZpZWxkKiBtdXRhYmxlX2ZpZWxkKGludCBpbmRleCk7CisKKyAgLy8gQWRkaW5nIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB2b2lkIEFkZFZhcmludChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUpOworICB2b2lkIEFkZEZpeGVkMzIoaW50IG51bWJlciwgdWludDMyIHZhbHVlKTsKKyAgdm9pZCBBZGRGaXhlZDY0KGludCBudW1iZXIsIHVpbnQ2NCB2YWx1ZSk7CisgIHZvaWQgQWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUpOworICBzdHJpbmcqIEFkZExlbmd0aERlbGltaXRlZChpbnQgbnVtYmVyKTsKKyAgVW5rbm93bkZpZWxkU2V0KiBBZGRHcm91cChpbnQgbnVtYmVyKTsKKworICAvLyBBZGRzIGFuIHVua25vd24gZmllbGQgZnJvbSBhbm90aGVyIHNldC4KKyAgdm9pZCBBZGRGaWVsZChjb25zdCBVbmtub3duRmllbGQmIGZpZWxkKTsKKworICAvLyBEZWxldGUgZmllbGRzIHdpdGggaW5kaWNlcyBpbiB0aGUgcmFuZ2UgW3N0YXJ0IC4uIHN0YXJ0K251bS0xXS4KKyAgLy8gQ2F1dGlvbjogaW1wbGVtZW50YXRpb24gbW92ZXMgYWxsIGZpZWxkcyB3aXRoIGluZGljZXMgW3N0YXJ0K251bSAuLiBdLgorICB2b2lkIERlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSk7CisKKyAgLy8gRGVsZXRlIGFsbCBmaWVsZHMgd2l0aCBhIHNwZWNpZmljIGZpZWxkIG51bWJlci4gVGhlIG9yZGVyIG9mIGxlZnQgZmllbGRzCisgIC8vIGlzIHByZXNlcnZlZC4KKyAgLy8gQ2F1dGlvbjogaW1wbGVtZW50YXRpb24gbW92ZXMgYWxsIGZpZWxkcyBhZnRlciB0aGUgZmlyc3QgZGVsZXRlZCBmaWVsZC4KKyAgdm9pZCBEZWxldGVCeU51bWJlcihpbnQgbnVtYmVyKTsKKworICAvLyBQYXJzaW5nIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSB3b3JrIGV4YWN0bHkgbGlrZSB0aGUgc2ltaWxhcmx5LW5hbWVkIG1ldGhvZHMgb2YgTWVzc2FnZS4KKworICBib29sIE1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIGJvb2wgUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgYm9vbCBQYXJzZUZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKKyAgaW5saW5lIGJvb2wgUGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSkgeworICAgIHJldHVybiBQYXJzZUZyb21BcnJheShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICB9CisKKyBwcml2YXRlOgorCisgIHZvaWQgQ2xlYXJGYWxsYmFjaygpOworCisgIHZlY3RvcjxVbmtub3duRmllbGQ+KiBmaWVsZHNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhVbmtub3duRmllbGRTZXQpOworfTsKKworLy8gUmVwcmVzZW50cyBvbmUgZmllbGQgaW4gYW4gVW5rbm93bkZpZWxkU2V0LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFVua25vd25GaWVsZCB7CisgcHVibGljOgorICBlbnVtIFR5cGUgeworICAgIFRZUEVfVkFSSU5ULAorICAgIFRZUEVfRklYRUQzMiwKKyAgICBUWVBFX0ZJWEVENjQsCisgICAgVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgIFRZUEVfR1JPVVAKKyAgfTsKKworICAvLyBUaGUgZmllbGQncyB0YWcgbnVtYmVyLCBhcyBzZWVuIG9uIHRoZSB3aXJlLgorICBpbmxpbmUgaW50IG51bWJlcigpIGNvbnN0OworCisgIC8vIFRoZSBmaWVsZCB0eXBlLgorICBpbmxpbmUgVHlwZSB0eXBlKCkgY29uc3Q7CisKKyAgLy8gQWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRWFjaCBtZXRob2Qgd29ya3Mgb25seSBmb3IgVW5rbm93bkZpZWxkcyBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlLgorCisgIGlubGluZSB1aW50NjQgdmFyaW50KCkgY29uc3Q7CisgIGlubGluZSB1aW50MzIgZml4ZWQzMigpIGNvbnN0OworICBpbmxpbmUgdWludDY0IGZpeGVkNjQoKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IHN0cmluZyYgbGVuZ3RoX2RlbGltaXRlZCgpIGNvbnN0OworICBpbmxpbmUgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBncm91cCgpIGNvbnN0OworCisgIGlubGluZSB2b2lkIHNldF92YXJpbnQodWludDY0IHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2ZpeGVkMzIodWludDMyIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2ZpeGVkNjQodWludDY0IHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2xlbmd0aF9kZWxpbWl0ZWQoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSBzdHJpbmcqIG11dGFibGVfbGVuZ3RoX2RlbGltaXRlZCgpOworICBpbmxpbmUgVW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX2dyb3VwKCk7CisKKyAgLy8gU2VyaWFsaXphdGlvbiBBUEkuCisgIC8vIFRoZXNlIG1ldGhvZHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGFuZCBtYXkKKyAgLy8gYXJjaGlldmUgYSBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB1c2luZyBnZXR0ZXJzIHRvIHJldHJpZXZlIHRoZSBkYXRhIGFuZAorICAvLyBkbyB0aGUgc2VyaWFsaXphdGlvbiB5b3Vyc2VsZi4KKyAgdm9pZCBTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZyhpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIHVpbnQ4KiBTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZ1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3Q7CisKKyAgaW5saW5lIGludCBHZXRMZW5ndGhEZWxpbWl0ZWRTaXplKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVW5rbm93bkZpZWxkU2V0OworCisgIC8vIElmIHRoaXMgVW5rbm93bkZpZWxkIGNvbnRhaW5zIGEgcG9pbnRlciwgZGVsZXRlIGl0LgorICB2b2lkIERlbGV0ZSgpOworCisgIC8vIE1ha2UgYSBkZWVwIGNvcHkgb2YgYW55IHBvaW50ZXJzIGluIHRoaXMgVW5rbm93bkZpZWxkLgorICB2b2lkIERlZXBDb3B5KCk7CisKKworICB1bnNpZ25lZCBpbnQgbnVtYmVyXyA6IDI5OworICB1bnNpZ25lZCBpbnQgdHlwZV8gICA6IDM7CisgIHVuaW9uIHsKKyAgICB1aW50NjQgdmFyaW50XzsKKyAgICB1aW50MzIgZml4ZWQzMl87CisgICAgdWludDY0IGZpeGVkNjRfOworICAgIG11dGFibGUgdW5pb24geworICAgICAgc3RyaW5nKiBzdHJpbmdfdmFsdWVfOworICAgIH0gbGVuZ3RoX2RlbGltaXRlZF87CisgICAgVW5rbm93bkZpZWxkU2V0KiBncm91cF87CisgIH07Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBpbmxpbmUgaW1wbGVtZW50YXRpb25zCisKK2lubGluZSB2b2lkIFVua25vd25GaWVsZFNldDo6Q2xlYXIoKSB7CisgIGlmIChmaWVsZHNfICE9IE5VTEwpIHsKKyAgICBDbGVhckZhbGxiYWNrKCk7CisgIH0KK30KKworaW5saW5lIGJvb2wgVW5rbm93bkZpZWxkU2V0OjplbXB0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpZWxkc18gPT0gTlVMTCB8fCBmaWVsZHNfLT5lbXB0eSgpOworfQorCitpbmxpbmUgdm9pZCBVbmtub3duRmllbGRTZXQ6OlN3YXAoVW5rbm93bkZpZWxkU2V0KiB4KSB7CisgIHN0ZDo6c3dhcChmaWVsZHNfLCB4LT5maWVsZHNfKTsKK30KKworaW5saW5lIGludCBVbmtub3duRmllbGRTZXQ6OmZpZWxkX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gKGZpZWxkc18gPT0gTlVMTCkgPyAwIDogZmllbGRzXy0+c2l6ZSgpOworfQoraW5saW5lIGNvbnN0IFVua25vd25GaWVsZCYgVW5rbm93bkZpZWxkU2V0OjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuICgqZmllbGRzXylbaW5kZXhdOworfQoraW5saW5lIFVua25vd25GaWVsZCogVW5rbm93bkZpZWxkU2V0OjptdXRhYmxlX2ZpZWxkKGludCBpbmRleCkgeworICByZXR1cm4gJigqZmllbGRzXylbaW5kZXhdOworfQorCitpbmxpbmUgdm9pZCBVbmtub3duRmllbGRTZXQ6OkFkZExlbmd0aERlbGltaXRlZCgKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIEFkZExlbmd0aERlbGltaXRlZChudW1iZXIpLT5hc3NpZ24odmFsdWUpOworfQorCisKK2lubGluZSBpbnQgVW5rbm93bkZpZWxkOjpudW1iZXIoKSBjb25zdCB7IHJldHVybiBudW1iZXJfOyB9CitpbmxpbmUgVW5rbm93bkZpZWxkOjpUeXBlIFVua25vd25GaWVsZDo6dHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHR5cGVfKTsKK30KKworaW5saW5lIHVpbnQ2NCBVbmtub3duRmllbGQ6OnZhcmludCAoKSBjb25zdCB7CisgIGFzc2VydCh0eXBlXyA9PSBUWVBFX1ZBUklOVCk7CisgIHJldHVybiB2YXJpbnRfOworfQoraW5saW5lIHVpbnQzMiBVbmtub3duRmllbGQ6OmZpeGVkMzIoKSBjb25zdCB7CisgIGFzc2VydCh0eXBlXyA9PSBUWVBFX0ZJWEVEMzIpOworICByZXR1cm4gZml4ZWQzMl87Cit9CitpbmxpbmUgdWludDY0IFVua25vd25GaWVsZDo6Zml4ZWQ2NCgpIGNvbnN0IHsKKyAgYXNzZXJ0KHR5cGVfID09IFRZUEVfRklYRUQ2NCk7CisgIHJldHVybiBmaXhlZDY0XzsKK30KK2lubGluZSBjb25zdCBzdHJpbmcmIFVua25vd25GaWVsZDo6bGVuZ3RoX2RlbGltaXRlZCgpIGNvbnN0IHsKKyAgYXNzZXJ0KHR5cGVfID09IFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgIHJldHVybiAqbGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXzsKK30KK2lubGluZSBjb25zdCBVbmtub3duRmllbGRTZXQmIFVua25vd25GaWVsZDo6Z3JvdXAoKSBjb25zdCB7CisgIGFzc2VydCh0eXBlXyA9PSBUWVBFX0dST1VQKTsKKyAgcmV0dXJuICpncm91cF87Cit9CisKK2lubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X3ZhcmludCh1aW50NjQgdmFsdWUpIHsKKyAgYXNzZXJ0KHR5cGVfID09IFRZUEVfVkFSSU5UKTsKKyAgdmFyaW50XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfZml4ZWQzMih1aW50MzIgdmFsdWUpIHsKKyAgYXNzZXJ0KHR5cGVfID09IFRZUEVfRklYRUQzMik7CisgIGZpeGVkMzJfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBVbmtub3duRmllbGQ6OnNldF9maXhlZDY0KHVpbnQ2NCB2YWx1ZSkgeworICBhc3NlcnQodHlwZV8gPT0gVFlQRV9GSVhFRDY0KTsKKyAgZml4ZWQ2NF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X2xlbmd0aF9kZWxpbWl0ZWQoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBhc3NlcnQodHlwZV8gPT0gVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgbGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSBzdHJpbmcqIFVua25vd25GaWVsZDo6bXV0YWJsZV9sZW5ndGhfZGVsaW1pdGVkKCkgeworICBhc3NlcnQodHlwZV8gPT0gVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgcmV0dXJuIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87Cit9CitpbmxpbmUgVW5rbm93bkZpZWxkU2V0KiBVbmtub3duRmllbGQ6Om11dGFibGVfZ3JvdXAoKSB7CisgIGFzc2VydCh0eXBlXyA9PSBUWVBFX0dST1VQKTsKKyAgcmV0dXJuIGdyb3VwXzsKK30KKworaW5saW5lIGludCBVbmtub3duRmllbGQ6OkdldExlbmd0aERlbGltaXRlZFNpemUoKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0eXBlXyk7CisgIHJldHVybiBsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfLT5zaXplKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI4NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNTk0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIHRlc3QgaXMgdGVzdGluZyBhIGxvdCBtb3JlIHRoYW4ganVzdCB0aGUgVW5rbm93bkZpZWxkU2V0IGNsYXNzLiAgSXQKKy8vIHRlc3RzIGhhbmRsaW5nIG9mIHVua25vd24gZmllbGRzIHRocm91Z2hvdXQgdGhlIHN5c3RlbS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7CisKK2NsYXNzIFVua25vd25GaWVsZFNldFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZGVzY3JpcHRvcl8gPSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCk7CisgICAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmYWxsX2ZpZWxkc18pOworICAgIGFsbF9maWVsZHNfLlNlcmlhbGl6ZVRvU3RyaW5nKCZhbGxfZmllbGRzX2RhdGFfKTsKKyAgICBBU1NFUlRfVFJVRShlbXB0eV9tZXNzYWdlXy5QYXJzZUZyb21TdHJpbmcoYWxsX2ZpZWxkc19kYXRhXykpOworICAgIHVua25vd25fZmllbGRzXyA9IGVtcHR5X21lc3NhZ2VfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgfQorCisgIGNvbnN0IFVua25vd25GaWVsZCogR2V0RmllbGQoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUobmFtZSk7CisgICAgaWYgKGZpZWxkID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGlmICh1bmtub3duX2ZpZWxkc18tPmZpZWxkKGkpLm51bWJlcigpID09IGZpZWxkLT5udW1iZXIoKSkgeworICAgICAgICByZXR1cm4gJnVua25vd25fZmllbGRzXy0+ZmllbGQoaSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIHByb3RvY29sIGJ1ZmZlciB3aGljaCBjb250YWlucyBmaWVsZHMgd2l0aCBhbGwgdGhlIHNhbWUKKyAgLy8gbnVtYmVycyBhcyBhbGxfZmllbGRzX2RhdGFfIGV4Y2VwdCB0aGF0IGVhY2ggZmllbGQgaXMgc29tZSBvdGhlciB3aXJlCisgIC8vIHR5cGUuCisgIHN0cmluZyBHZXRCaXphcnJvRGF0YSgpIHsKKyAgICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBiaXphcnJvX21lc3NhZ2U7CisgICAgVW5rbm93bkZpZWxkU2V0KiBiaXphcnJvX3Vua25vd25fZmllbGRzID0KKyAgICAgIGJpemFycm9fbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3QgVW5rbm93bkZpZWxkJiB1bmtub3duX2ZpZWxkID0gdW5rbm93bl9maWVsZHNfLT5maWVsZChpKTsKKyAgICAgIGlmICh1bmtub3duX2ZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UKSB7CisgICAgICAgIGJpemFycm9fdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIodW5rbm93bl9maWVsZC5udW1iZXIoKSwgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiaXphcnJvX3Vua25vd25fZmllbGRzLT5BZGRWYXJpbnQodW5rbm93bl9maWVsZC5udW1iZXIoKSwgMSk7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIGRhdGE7CisgICAgRVhQRUNUX1RSVUUoYml6YXJyb19tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKSk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBhbGxfZmllbGRzXzsKKyAgc3RyaW5nIGFsbF9maWVsZHNfZGF0YV87CisKKyAgLy8gQW4gZW1wdHkgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBmcm9tIGFsbF9maWVsZHNfZGF0YV8uICBTbywgaXQgaGFzCisgIC8vIHVua25vd24gZmllbGRzIG9mIGV2ZXJ5IHR5cGUuCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2VfOworICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzXzsKK307CisKK25hbWVzcGFjZSB7CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBBbGxGaWVsZHNQcmVzZW50KSB7CisgIC8vIEFsbCBmaWVsZHMgb2YgVGVzdEFsbFR5cGVzIHNob3VsZCBiZSBwcmVzZW50LCBpbiBudW1lcmljIG9yZGVyIChiZWNhdXNlCisgIC8vIHRoYXQncyB0aGUgb3JkZXIgd2UgcGFyc2VkIHRoZW0gaW4pLiAgRmllbGRzIHRoYXQgYXJlIG5vdCB2YWxpZCBmaWVsZAorICAvLyBudW1iZXJzIG9mIFRlc3RBbGxUeXBlcyBzaG91bGQgTk9UIGJlIHByZXNlbnQuCisKKyAgaW50IHBvcyA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TnVtYmVyKGkpOworICAgIGlmIChmaWVsZCAhPSBOVUxMKSB7CisgICAgICBBU1NFUlRfTFQocG9zLCB1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCkpOworICAgICAgRVhQRUNUX0VRKGksIHVua25vd25fZmllbGRzXy0+ZmllbGQocG9zKyspLm51bWJlcigpKTsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAvLyBTaG91bGQgaGF2ZSBhIHNlY29uZCBpbnN0YW5jZS4KKyAgICAgICAgQVNTRVJUX0xUKHBvcywgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGksIHVua25vd25fZmllbGRzXy0+ZmllbGQocG9zKyspLm51bWJlcigpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgRVhQRUNUX0VRKHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSwgcG9zKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFZhcmludCkgeworICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsX2ludDMyIik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworCisgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCBmaWVsZC0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKGFsbF9maWVsZHNfLm9wdGlvbmFsX2ludDMyKCksIGZpZWxkLT52YXJpbnQoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBGaXhlZDMyKSB7CisgIGNvbnN0IFVua25vd25GaWVsZCogZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQzMiIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzIsIGZpZWxkLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxfZml4ZWQzMigpLCBmaWVsZC0+Zml4ZWQzMigpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIEZpeGVkNjQpIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbF9maXhlZDY0Iik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworCisgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NCwgZmllbGQtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShhbGxfZmllbGRzXy5vcHRpb25hbF9maXhlZDY0KCksIGZpZWxkLT5maXhlZDY0KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgTGVuZ3RoRGVsaW1pdGVkKSB7CisgIGNvbnN0IFVua25vd25GaWVsZCogZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfc3RyaW5nIik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworCisgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCwgZmllbGQtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShhbGxfZmllbGRzXy5vcHRpb25hbF9zdHJpbmcoKSwgZmllbGQtPmxlbmd0aF9kZWxpbWl0ZWQoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBHcm91cCkgeworICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsZ3JvdXAiKTsKKyAgQVNTRVJUX1RSVUUoZmllbGQgIT0gTlVMTCk7CisKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9HUk9VUCwgZmllbGQtPnR5cGUoKSk7CisgIEFTU0VSVF9FUSgxLCBmaWVsZC0+Z3JvdXAoKS5maWVsZF9jb3VudCgpKTsKKworICBjb25zdCBVbmtub3duRmllbGQmIG5lc3RlZF9maWVsZCA9IGZpZWxkLT5ncm91cCgpLmZpZWxkKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5lc3RlZF9maWVsZF9kZXNjcmlwdG9yID0KKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiYSIpOworICBBU1NFUlRfVFJVRShuZXN0ZWRfZmllbGRfZGVzY3JpcHRvciAhPSBOVUxMKTsKKworICBFWFBFQ1RfRVEobmVzdGVkX2ZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpLCBuZXN0ZWRfZmllbGQubnVtYmVyKCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgbmVzdGVkX2ZpZWxkLnR5cGUoKSk7CisgIEVYUEVDVF9FUShhbGxfZmllbGRzXy5vcHRpb25hbGdyb3VwKCkuYSgpLCBuZXN0ZWRfZmllbGQudmFyaW50KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU2VyaWFsaXplRmFzdEFuZFNsb3dBcmVFcXVpdmFsZW50KSB7CisgIGludCBzaXplID0gV2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKSk7CisgIHN0cmluZyBzbG93X2J1ZmZlcjsKKyAgc3RyaW5nIGZhc3RfYnVmZmVyOworICBzbG93X2J1ZmZlci5yZXNpemUoc2l6ZSk7CisgIGZhc3RfYnVmZmVyLnJlc2l6ZShzaXplKTsKKworICB1aW50OCogdGFyZ2V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZmFzdF9idWZmZXIpKTsKKyAgdWludDgqIHJlc3VsdCA9IFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICAgIGVtcHR5X21lc3NhZ2VfLnVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIEVYUEVDVF9FUShzaXplLCByZXN1bHQgLSB0YXJnZXQpOworCisgIHsKKyAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gcmF3X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJnNsb3dfYnVmZmVyKSwgc2l6ZSwgMSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJnJhd19zdHJlYW0pOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfc3RyZWFtKTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShmYXN0X2J1ZmZlciA9PSBzbG93X2J1ZmZlcik7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTZXJpYWxpemUpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXJpYWxpemluZyB0aGUgVW5rbm93bkZpZWxkU2V0IHByb2R1Y2VzIHRoZSBvcmlnaW5hbCBkYXRhCisgIC8vIGFnYWluLgorCisgIHN0cmluZyBkYXRhOworICBlbXB0eV9tZXNzYWdlXy5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gRG9uJ3QgdXNlIEVYUEVDVF9FUSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZHVtcCByYXcgYmluYXJ5IGRhdGEgdG8KKyAgLy8gc3Rkb3V0LgorICBFWFBFQ1RfVFJVRShkYXRhID09IGFsbF9maWVsZHNfZGF0YV8pOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgUGFyc2VWaWFSZWZsZWN0aW9uKSB7CisgIC8vIE1ha2Ugc3VyZSBmaWVsZHMgYXJlIHByb3Blcmx5IHBhcnNlZCB0byB0aGUgVW5rbm93bkZpZWxkU2V0IHdoZW4gcGFyc2luZworICAvLyB2aWEgcmVmbGVjdGlvbi4KKworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoYWxsX2ZpZWxkc19kYXRhXy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfZmllbGRzX2RhdGFfLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBBU1NFUlRfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZtZXNzYWdlKSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSwgZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTZXJpYWxpemVWaWFSZWZsZWN0aW9uKSB7CisgIC8vIE1ha2Ugc3VyZSBmaWVsZHMgYXJlIHByb3Blcmx5IHdyaXR0ZW4gZnJvbSB0aGUgVW5rbm93bkZpZWxkU2V0IHdoZW4KKyAgLy8gc2VyaWFsaXppbmcgdmlhIHJlZmxlY3Rpb24uCisKKyAgc3RyaW5nIGRhdGE7CisKKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgaW50IHNpemUgPSBXaXJlRm9ybWF0OjpCeXRlU2l6ZShlbXB0eV9tZXNzYWdlXyk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGVtcHR5X21lc3NhZ2VfLCBzaXplLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gRG9uJ3QgdXNlIEVYUEVDVF9FUSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZHVtcCByYXcgYmluYXJ5IGRhdGEgdG8KKyAgLy8gc3Rkb3V0LgorICBFWFBFQ1RfVFJVRShkYXRhID09IGFsbF9maWVsZHNfZGF0YV8pOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgQ29weUZyb20pIHsKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTsKKworICBtZXNzYWdlLkNvcHlGcm9tKGVtcHR5X21lc3NhZ2VfKTsKKworICBFWFBFQ1RfRVEoZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKSwgbWVzc2FnZS5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFN3YXApIHsKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2Ugb3RoZXJfbWVzc2FnZTsKKyAgQVNTRVJUX1RSVUUob3RoZXJfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoR2V0Qml6YXJyb0RhdGEoKSkpOworCisgIEVYUEVDVF9HVChlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCksIDApOworICBFWFBFQ1RfR1Qob3RoZXJfbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCksIDApOworICBjb25zdCBzdHJpbmcgZGVidWdfc3RyaW5nID0gZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKTsKKyAgY29uc3Qgc3RyaW5nIG90aGVyX2RlYnVnX3N0cmluZyA9IG90aGVyX21lc3NhZ2UuRGVidWdTdHJpbmcoKTsKKyAgRVhQRUNUX05FKGRlYnVnX3N0cmluZywgb3RoZXJfZGVidWdfc3RyaW5nKTsKKworICBlbXB0eV9tZXNzYWdlXy5Td2FwKCZvdGhlcl9tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKGRlYnVnX3N0cmluZywgb3RoZXJfbWVzc2FnZS5EZWJ1Z1N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG90aGVyX2RlYnVnX3N0cmluZywgZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTd2FwV2l0aFNlbGYpIHsKKyAgY29uc3Qgc3RyaW5nIGRlYnVnX3N0cmluZyA9IGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCk7CisgIEVYUEVDVF9HVChlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCksIDApOworCisgIGVtcHR5X21lc3NhZ2VfLlN3YXAoJmVtcHR5X21lc3NhZ2VfKTsKKyAgRVhQRUNUX0dUKGVtcHR5X21lc3NhZ2VfLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSwgMCk7CisgIEVYUEVDVF9FUShkZWJ1Z19zdHJpbmcsIGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgTWVyZ2VGcm9tKSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIHNvdXJjZSwgZGVzdGluYXRpb247CisKKyAgZGVzdGluYXRpb24ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMSwgMSk7CisgIGRlc3RpbmF0aW9uLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDMsIDIpOworICBzb3VyY2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMiwgMyk7CisgIHNvdXJjZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgzLCA0KTsKKworICBkZXN0aW5hdGlvbi5NZXJnZUZyb20oc291cmNlKTsKKworICBFWFBFQ1RfRVEoCisgICAgLy8gTm90ZTogIFRoZSBvcmRlcmluZyBvZiBmaWVsZHMgaGVyZSBkZXBlbmRzIG9uIHRoZSBvcmRlcmluZyBvZiBhZGRzCisgICAgLy8gICBhbmQgbWVyZ2luZywgYWJvdmUuCisgICAgIjE6IDFcbiIKKyAgICAiMzogMlxuIgorICAgICIyOiAzXG4iCisgICAgIjM6IDRcbiIsCisgICAgZGVzdGluYXRpb24uRGVidWdTdHJpbmcoKSk7Cit9CisKKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIENsZWFyKSB7CisgIC8vIENsZWFyIHRoZSBzZXQuCisgIGVtcHR5X21lc3NhZ2VfLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCB1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgQ2xlYXJBbmRGcmVlTWVtb3J5KSB7CisgIEVYUEVDVF9HVCh1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCksIDApOworICB1bmtub3duX2ZpZWxkc18tPkNsZWFyQW5kRnJlZU1lbW9yeSgpOworICBFWFBFQ1RfRVEoMCwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKKyAgdW5rbm93bl9maWVsZHNfLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBFWFBFQ1RfRVEoMSwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFBhcnNlS25vd25BbmRVbmtub3duKSB7CisgIC8vIFRlc3QgbWl4aW5nIGtub3duIGFuZCB1bmtub3duIGZpZWxkcyB3aGVuIHBhcnNpbmcuCisKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2Ugc291cmNlOworICBzb3VyY2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBzdHJpbmcgZGF0YTsKKyAgQVNTRVJUX1RSVUUoc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKSk7CisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBkZXN0aW5hdGlvbjsKKyAgQVNTRVJUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGFsbF9maWVsZHNfZGF0YV8gKyBkYXRhKSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChkZXN0aW5hdGlvbik7CisgIEFTU0VSVF9FUSgxLCBkZXN0aW5hdGlvbi51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKDY1NDMyMSwgZGVzdGluYXRpb24udW5rbm93bl9maWVsZHMoKS5maWVsZCgwKS52YXJpbnQoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBXcm9uZ1R5cGVUcmVhdGVkQXNVbmtub3duKSB7CisgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCisgIC8vIHdoZW4gcGFyc2luZy4KKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGFsbF90eXBlc19tZXNzYWdlOworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlOworICBzdHJpbmcgYml6YXJyb19kYXRhID0gR2V0Qml6YXJyb0RhdGEoKTsKKyAgQVNTRVJUX1RSVUUoYWxsX3R5cGVzX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJpemFycm9fZGF0YSkpOworICBBU1NFUlRfVFJVRShlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiaXphcnJvX2RhdGEpKTsKKworICAvLyBBbGwgZmllbGRzIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQgYXMgdW5rbm93biwgc28gdGhlIGRlYnVnIHN0cmluZ3MKKyAgLy8gc2hvdWxkIGJlIHRoZSBzYW1lLgorICBFWFBFQ1RfRVEoZW1wdHlfbWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBhbGxfdHlwZXNfbWVzc2FnZS5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd25WaWFSZWZsZWN0aW9uKSB7CisgIC8vIFNhbWUgYXMgV3JvbmdUeXBlVHJlYXRlZEFzVW5rbm93biBidXQgdmlhIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZS4KKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGFsbF90eXBlc19tZXNzYWdlOworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlOworICBzdHJpbmcgYml6YXJyb19kYXRhID0gR2V0Qml6YXJyb0RhdGEoKTsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGJpemFycm9fZGF0YS5kYXRhKCksIGJpemFycm9fZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmYWxsX3R5cGVzX21lc3NhZ2UpKTsKKyAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7CisKKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2UuRGVidWdTdHJpbmcoKSwgYWxsX3R5cGVzX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBVbmtub3duRXh0ZW5zaW9ucykgeworICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSBwYXJzZWQgdG8gdGhlIFVua25vd25GaWVsZFNldCBldmVuIHdoZW4KKyAgLy8gdGhleSBhcmUgZGVjbGFyZWQgYXMgZXh0ZW5zaW9uIG51bWJlcnMuCisKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBtZXNzYWdlOworICBBU1NFUlRfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhhbGxfZmllbGRzX2RhdGFfKSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSwgZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBVbmtub3duRXh0ZW5zaW9uc1JlZmxlY3Rpb24pIHsKKyAgLy8gU2FtZSBhcyBVbmtub3duRXh0ZW5zaW9ucyBleGNlcHQgcGFyc2luZyB2aWEgcmVmbGVjdGlvbi4KKworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIG1lc3NhZ2U7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChhbGxfZmllbGRzX2RhdGFfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfZGF0YV8uc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIEFTU0VSVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJm1lc3NhZ2UpKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFdyb25nRXh0ZW5zaW9uVHlwZVRyZWF0ZWRBc1Vua25vd24pIHsKKyAgLy8gVGVzdCB0aGF0IGZpZWxkcyBvZiB0aGUgd3Jvbmcgd2lyZSB0eXBlIGFyZSB0cmVhdGVkIGxpa2UgdW5rbm93biBmaWVsZHMKKyAgLy8gd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIGFsbF9leHRlbnNpb25zX21lc3NhZ2U7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7CisgIHN0cmluZyBiaXphcnJvX2RhdGEgPSBHZXRCaXphcnJvRGF0YSgpOworICBBU1NFUlRfVFJVRShhbGxfZXh0ZW5zaW9uc19tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiaXphcnJvX2RhdGEpKTsKKyAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7CisKKyAgLy8gQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSBiZWVuIGludGVycHJldGVkIGFzIHVua25vd24sIHNvIHRoZSBkZWJ1ZyBzdHJpbmdzCisgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2UuRGVidWdTdHJpbmcoKSwgYWxsX2V4dGVuc2lvbnNfbWVzc2FnZS5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFVua25vd25FbnVtVmFsdWUpIHsKKyAgdXNpbmcgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczsKKyAgdXNpbmcgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOworICB1c2luZyB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHNpbmd1bGFyX2ZpZWxkID0KKyAgICBUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlcGVhdGVkX2ZpZWxkID0KKyAgICBUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpOworICBBU1NFUlRfVFJVRShzaW5ndWxhcl9maWVsZCAhPSBOVUxMKTsKKyAgQVNTRVJUX1RSVUUocmVwZWF0ZWRfZmllbGQgIT0gTlVMTCk7CisKKyAgc3RyaW5nIGRhdGE7CisKKyAgeworICAgIFRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZTsKKyAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzID0gZW1wdHlfbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChzaW5ndWxhcl9maWVsZC0+bnVtYmVyKCksIFRlc3RBbGxUeXBlczo6QkFSKTsKKyAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHNpbmd1bGFyX2ZpZWxkLT5udW1iZXIoKSwgNSk7ICAvLyBub3QgdmFsaWQKKyAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgVGVzdEFsbFR5cGVzOjpGT08pOworICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCA0KTsgIC8vIG5vdCB2YWxpZAorICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCBUZXN0QWxsVHlwZXM6OkJBWik7CisgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIDYpOyAgLy8gbm90IHZhbGlkCisgICAgZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgIH0KKworICB7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSgpKTsKKyAgICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDEpKTsKKworICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMgPSBtZXNzYWdlLnVua25vd25fZmllbGRzKCk7CisgICAgQVNTRVJUX0VRKDMsIHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCkpOworCisgICAgRVhQRUNUX0VRKHNpbmd1bGFyX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkubnVtYmVyKCkpOworICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgwKS50eXBlKCkpOworICAgIEVYUEVDVF9FUSg1LCB1bmtub3duX2ZpZWxkcy5maWVsZCgwKS52YXJpbnQoKSk7CisKKyAgICBFWFBFQ1RfRVEocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS5udW1iZXIoKSk7CisgICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDEpLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKDQsIHVua25vd25fZmllbGRzLmZpZWxkKDEpLnZhcmludCgpKTsKKworICAgIEVYUEVDVF9FUShyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDIpLm51bWJlcigpKTsKKyAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMikudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoNiwgdW5rbm93bl9maWVsZHMuZmllbGQoMikudmFyaW50KCkpOworICB9CisKKyAgeworICAgIHVzaW5nIHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb247CisgICAgdXNpbmcgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbjsKKworICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgICAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBUiwKKyAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24ob3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24pKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpGT08sCisgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBWiwKKyAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24ocmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLCAxKSk7CisKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzID0gbWVzc2FnZS51bmtub3duX2ZpZWxkcygpOworICAgIEFTU0VSVF9FUSgzLCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpKTsKKworICAgIEVYUEVDVF9FUShzaW5ndWxhcl9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDApLm51bWJlcigpKTsKKyAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkudmFyaW50KCkpOworCisgICAgRVhQRUNUX0VRKHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkubnVtYmVyKCkpOworICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS50eXBlKCkpOworICAgIEVYUEVDVF9FUSg0LCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS52YXJpbnQoKSk7CisKKyAgICBFWFBFQ1RfRVEocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS5udW1iZXIoKSk7CisgICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDIpLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKDYsIHVua25vd25fZmllbGRzLmZpZWxkKDIpLnZhcmludCgpKTsKKyAgfQorfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU3BhY2VVc2VkKSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7CisKKyAgLy8gTWFrZSBzdXJlIGFuIHVua25vd24gZmllbGQgc2V0IGhhcyB6ZXJvIHNwYWNlIHVzZWQgdW50aWwgYSBmaWVsZCBpcworICAvLyBhY3R1YWxseSBhZGRlZC4KKyAgaW50IGJhc2Vfc2l6ZSA9IGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCk7CisgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMgPSBlbXB0eV9tZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgRVhQRUNUX0VRKGJhc2Vfc2l6ZSwgZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKSk7CisKKyAgLy8gTWFrZSBzdXJlIGVhY2ggdGhpbmcgd2UgYWRkIHRvIHRoZSBzZXQgaW5jcmVhc2VzIHRoZSBTcGFjZVVzZWQoKS4KKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCgxLCAwKTsKKyAgRVhQRUNUX0xUKGJhc2Vfc2l6ZSwgZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKSk7CisgIGJhc2Vfc2l6ZSA9IGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCk7CisKKyAgc3RyaW5nKiBzdHIgPSB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDEpOworICBFWFBFQ1RfTFQoYmFzZV9zaXplLCBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpKTsKKyAgYmFzZV9zaXplID0gZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKTsKKworICBzdHItPmFzc2lnbihzaXplb2Yoc3RyaW5nKSArIDEsICd4Jyk7CisgIEVYUEVDVF9MVChiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOworICBiYXNlX3NpemUgPSBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpOworCisgIFVua25vd25GaWVsZFNldCogZ3JvdXAgPSB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAoMSk7CisgIEVYUEVDVF9MVChiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOworICBiYXNlX3NpemUgPSBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpOworCisgIGdyb3VwLT5BZGRWYXJpbnQoMSwgMCk7CisgIEVYUEVDVF9MVChiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOworfQorCisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBFbXB0eSkgeworICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7CisgIEVYUEVDVF9UUlVFKHVua25vd25fZmllbGRzLmVtcHR5KCkpOworICB1bmtub3duX2ZpZWxkcy5BZGRWYXJpbnQoNiwgMTIzKTsKKyAgRVhQRUNUX0ZBTFNFKHVua25vd25fZmllbGRzLmVtcHR5KCkpOworICB1bmtub3duX2ZpZWxkcy5DbGVhcigpOworICBFWFBFQ1RfVFJVRSh1bmtub3duX2ZpZWxkcy5lbXB0eSgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIERlbGV0ZVN1YnJhbmdlKSB7CisgIC8vIEV4aGF1c3RpdmVseSB0ZXN0IHRoZSBkZWxldGlvbiBvZiBldmVyeSBwb3NzaWJsZSBzdWJyYW5nZSBpbiBhcnJheXMgb2YgYWxsCisgIC8vIHNpemVzIGZyb20gMCB0aHJvdWdoIDkuCisgIGZvciAoaW50IHNpemUgPSAwOyBzaXplIDwgMTA7ICsrc2l6ZSkgeworICAgIGZvciAoaW50IG51bSA9IDA7IG51bSA8PSBzaXplOyArK251bSkgeworICAgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHNpemUgLSBudW07ICsrc3RhcnQpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgc2V0IHdpdGggInNpemUiIGZpZWxkcy4KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0IHVua25vd247CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgdW5rbm93bi5BZGRGaXhlZDMyKGksIGkpOworICAgICAgICB9CisgICAgICAgIC8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIHN1YnJhbmdlLgorICAgICAgICB1bmtub3duLkRlbGV0ZVN1YnJhbmdlKHN0YXJ0LCBudW0pOworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlc3VsdGluZyBmaWVsZCB2YWx1ZXMgYXJlIHN0aWxsIGNvcnJlY3QuCisgICAgICAgIEVYUEVDVF9FUShzaXplIC0gbnVtLCB1bmtub3duLmZpZWxkX2NvdW50KCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd24uZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgICAgICAgaWYgKGkgPCBzdGFydCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGksIHVua25vd24uZmllbGQoaSkuZml4ZWQzMigpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX0VRKGkgKyBudW0sIHVua25vd24uZmllbGQoaSkuZml4ZWQzMigpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDaGVja0RlbGV0ZUJ5TnVtYmVyKGNvbnN0IHZlY3RvcjxpbnQ+JiBmaWVsZF9udW1iZXJzLCBpbnQgZGVsZXRlZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50PiYgZXhwZWN0ZWRfZmllbGRfbnVibWVycykgeworICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfbnVtYmVycy5zaXplKCk7ICsraSkgeworICAgIHVua25vd25fZmllbGRzLkFkZEZpeGVkMzIoZmllbGRfbnVtYmVyc1tpXSwgaSk7CisgIH0KKyAgdW5rbm93bl9maWVsZHMuRGVsZXRlQnlOdW1iZXIoZGVsZXRlZF9udW1iZXIpOworICBBU1NFUlRfRVEoZXhwZWN0ZWRfZmllbGRfbnVibWVycy5zaXplKCksIHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkX2ZpZWxkX251Ym1lcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZmllbGRfbnVibWVyc1tpXSwKKyAgICAgICAgICAgICAgdW5rbm93bl9maWVsZHMuZmllbGQoaSkubnVtYmVyKCkpOworICB9Cit9CisKKyNkZWZpbmUgTUFLRV9WRUNUT1IoeCkgdmVjdG9yPGludD4oeCwgeCArIEdPT0dMRV9BUlJBWVNJWkUoeCkpCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgRGVsZXRlQnlOdW1iZXIpIHsKKyAgQ2hlY2tEZWxldGVCeU51bWJlcih2ZWN0b3I8aW50PigpLCAxLCB2ZWN0b3I8aW50PigpKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczFbXSA9IHsxLCAyLCAzfTsKKyAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTEgPSAxOworICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczFbXSA9IHsyLCAzfTsKKyAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczEpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTEsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzMSkpOworICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmllbGROdW1iZXJzMltdID0gezEsIDIsIDN9OworICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZE51bWJlclRvRGVsZXRlMiA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkRmllbGROdW1iZXJzMltdID0gezEsIDN9OworICBDaGVja0RlbGV0ZUJ5TnVtYmVyKE1BS0VfVkVDVE9SKGtUZXN0RmllbGROdW1iZXJzMiksIGtGaWVsZE51bWJlclRvRGVsZXRlMiwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1ZFQ1RPUihrRXhwZWN0ZWRGaWVsZE51bWJlcnMyKSk7CisgIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RGaWVsZE51bWJlcnMzW10gPSB7MSwgMiwgM307CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpZWxkTnVtYmVyVG9EZWxldGUzID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBrRXhwZWN0ZWRGaWVsZE51bWJlcnMzW10gPSB7MSwgMn07CisgIENoZWNrRGVsZXRlQnlOdW1iZXIoTUFLRV9WRUNUT1Ioa1Rlc3RGaWVsZE51bWJlcnMzKSwga0ZpZWxkTnVtYmVyVG9EZWxldGUzLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfVkVDVE9SKGtFeHBlY3RlZEZpZWxkTnVtYmVyczMpKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczRbXSA9IHsxLCAyLCAxLCA0LCAxfTsKKyAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTQgPSAxOworICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczRbXSA9IHsyLCA0fTsKKyAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczQpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTQsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzNCkpOworICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmllbGROdW1iZXJzNVtdID0gezEsIDIsIDMsIDQsIDV9OworICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZE51bWJlclRvRGVsZXRlNSA9IDY7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkRmllbGROdW1iZXJzNVtdID0gezEsIDIsIDMsIDQsIDV9OworICBDaGVja0RlbGV0ZUJ5TnVtYmVyKE1BS0VfVkVDVE9SKGtUZXN0RmllbGROdW1iZXJzNSksIGtGaWVsZE51bWJlclRvRGVsZXRlNSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1ZFQ1RPUihrRXhwZWN0ZWRGaWVsZE51bWJlcnM1KSk7Cit9CisjdW5kZWYgTUFLRV9WRUNUT1IKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ3NjNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjCkBAIC0wLDAgKzEsMTA2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKworCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK25hbWVzcGFjZSB7CisKKy8vIFRoaXMgZnVuY3Rpb24gdHVybnMgb3V0IHRvIGJlIGNvbnZlbmllbnQgd2hlbiB1c2luZyBzb21lIG1hY3JvcyBsYXRlci4KK2lubGluZSBpbnQgR2V0RW51bU51bWJlcihjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5udW1iZXIoKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyOjpTa2lwRmllbGQoCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKSB7CisgIHJldHVybiBXaXJlRm9ybWF0OjpTa2lwRmllbGQoaW5wdXQsIHRhZywgdW5rbm93bl9maWVsZHNfKTsKK30KKworYm9vbCBVbmtub3duRmllbGRTZXRGaWVsZFNraXBwZXI6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gV2lyZUZvcm1hdDo6U2tpcE1lc3NhZ2UoaW5wdXQsIHVua25vd25fZmllbGRzXyk7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyOjpTa2lwVW5rbm93bkVudW0oCisgICAgaW50IGZpZWxkX251bWJlciwgaW50IHZhbHVlKSB7CisgIHVua25vd25fZmllbGRzXy0+QWRkVmFyaW50KGZpZWxkX251bWJlciwgdmFsdWUpOworfQorCitib29sIFdpcmVGb3JtYXQ6OlNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIGludCBudW1iZXIgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKTsKKworICBzd2l0Y2ggKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpKSB7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOiB7CisgICAgICB1aW50NjQgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzICE9IE5VTEwpIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLCB2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDogeworICAgICAgdWludDY0IHZhbHVlOworICAgICAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjY0KCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh1bmtub3duX2ZpZWxkcyAhPSBOVUxMKSB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQ2NChudW1iZXIsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEOiB7CisgICAgICB1aW50MzIgbGVuZ3RoOworICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodW5rbm93bl9maWVsZHMgPT0gTlVMTCkgeworICAgICAgICBpZiAoIWlucHV0LT5Ta2lwKGxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaW5wdXQtPlJlYWRTdHJpbmcodW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZChudW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUDogeworICAgICAgaWYgKCFpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFTa2lwTWVzc2FnZShpbnB1dCwgKHVua25vd25fZmllbGRzID09IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgOiB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAobnVtYmVyKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAvLyBDaGVjayB0aGF0IHRoZSBlbmRpbmcgdGFnIG1hdGNoZWQgdGhlIHN0YXJ0aW5nIHRhZy4KKyAgICAgIGlmICghaW5wdXQtPkxhc3RUYWdXYXMoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVA6IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMjogeworICAgICAgdWludDMyIHZhbHVlOworICAgICAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh1bmtub3duX2ZpZWxkcyAhPSBOVUxMKSB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQzMihudW1iZXIsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdDo6U2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIHdoaWxlKHRydWUpIHsKKyAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKKyAgICBpZiAodGFnID09IDApIHsKKyAgICAgIC8vIEVuZCBvZiBpbnB1dC4gIFRoaXMgaXMgYSB2YWxpZCBwbGFjZSB0byBlbmQsIHNvIHJldHVybiB0cnVlLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHdpcmVfdHlwZSA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpOworCisgICAgaWYgKHdpcmVfdHlwZSA9PSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAvLyBNdXN0IGJlIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIVNraXBGaWVsZChpbnB1dCwgdGFnLCB1bmtub3duX2ZpZWxkcykpIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKyAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgeworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSk7CisgICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQ2NChmaWVsZC52YXJpbnQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQzMjoKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIpKTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKGZpZWxkLmZpeGVkMzIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQpKTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjY0KGZpZWxkLmZpeGVkNjQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCkpOworICAgICAgICBvdXRwdXQtPldyaXRlU3RyaW5nKGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCkpOworICAgICAgICBTZXJpYWxpemVVbmtub3duRmllbGRzKGZpZWxkLmdyb3VwKCksIG91dHB1dCk7CisgICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3VpbnQ4KiBXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisKKyAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgeworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NFRvQXJyYXkoCisgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgZmllbGQudmFyaW50KCksIHRhcmdldCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQzMjoKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQzMlRvQXJyYXkoCisgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgZmllbGQuZml4ZWQzMigpLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQ6CisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjRUb0FycmF5KAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIGZpZWxkLmZpeGVkNjQoKSwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlc1RvQXJyYXkoCisgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCwgdGFyZ2V0KTsKKyAgICAgICAgdGFyZ2V0ID0gU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoZmllbGQuZ3JvdXAoKSwgdGFyZ2V0KTsKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKwordm9pZCBXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisgICAgLy8gVGhlIG9ubHkgdW5rbm93biBmaWVsZHMgdGhhdCBhcmUgYWxsb3dlZCB0byBleGlzdCBpbiBhIE1lc3NhZ2VTZXQgYXJlCisgICAgLy8gbWVzc2FnZXMsIHdoaWNoIGFyZSBsZW5ndGgtZGVsaW1pdGVkLgorICAgIGlmIChmaWVsZC50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgIC8vIFN0YXJ0IGdyb3VwLgorICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZyk7CisKKyAgICAgIC8vIFdyaXRlIHR5cGUgSUQuCisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnKTsKKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihmaWVsZC5udW1iZXIoKSk7CisKKyAgICAgIC8vIFdyaXRlIG1lc3NhZ2UuCisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZyk7CisgICAgICBmaWVsZC5TZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZyhvdXRwdXQpOworCisgICAgICAvLyBFbmQgZ3JvdXAuCisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZyk7CisgICAgfQorICB9Cit9CisKK3VpbnQ4KiBXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisKKyAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKKyAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCisgICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgLy8gU3RhcnQgZ3JvdXAuCisgICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcsIHRhcmdldCk7CisKKyAgICAgIC8vIFdyaXRlIHR5cGUgSUQuCisgICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWcsIHRhcmdldCk7CisgICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAorICAgICAgICAgIGZpZWxkLm51bWJlcigpLCB0YXJnZXQpOworCisgICAgICAvLyBXcml0ZSBtZXNzYWdlLgorICAgICAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZ1RvQXJyYXkoCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZywgdGFyZ2V0KTsKKyAgICAgIHRhcmdldCA9IGZpZWxkLlNlcmlhbGl6ZUxlbmd0aERlbGltaXRlZE5vVGFnVG9BcnJheSh0YXJnZXQpOworCisgICAgICAvLyBFbmQgZ3JvdXAuCisgICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnLCB0YXJnZXQpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcykgeworICBpbnQgc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9IHVua25vd25fZmllbGRzLmZpZWxkKGkpOworCisgICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkpOworICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0KGZpZWxkLnZhcmludCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMikpOworICAgICAgICBzaXplICs9IHNpemVvZihpbnQzMik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQpKTsKKyAgICAgICAgc2l6ZSArPSBzaXplb2YoaW50NjQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSk7CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZSArPSBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVApKTsKKyAgICAgICAgc2l6ZSArPSBDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoZmllbGQuZ3JvdXAoKSk7CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK2ludCBXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcykgeworICBpbnQgc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9IHVua25vd25fZmllbGRzLmZpZWxkKGkpOworCisgICAgLy8gVGhlIG9ubHkgdW5rbm93biBmaWVsZHMgdGhhdCBhcmUgYWxsb3dlZCB0byBleGlzdCBpbiBhIE1lc3NhZ2VTZXQgYXJlCisgICAgLy8gbWVzc2FnZXMsIHdoaWNoIGFyZSBsZW5ndGgtZGVsaW1pdGVkLgorICAgIGlmIChmaWVsZC50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgIHNpemUgKz0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVRhZ3NTaXplOworICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihmaWVsZC5udW1iZXIoKSk7CisKKyAgICAgIGludCBmaWVsZF9zaXplID0gZmllbGQuR2V0TGVuZ3RoRGVsaW1pdGVkU2l6ZSgpOworICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihmaWVsZF9zaXplKTsKKyAgICAgIHNpemUgKz0gZmllbGRfc2l6ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc2l6ZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitib29sIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgd2hpbGUodHJ1ZSkgeworICAgIHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOworICAgIGlmICh0YWcgPT0gMCkgeworICAgICAgLy8gRW5kIG9mIGlucHV0LiAgVGhpcyBpcyBhIHZhbGlkIHBsYWNlIHRvIGVuZCwgc28gcmV0dXJuIHRydWUuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgLy8gTXVzdCBiZSB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IE5VTEw7CisKKyAgICBpZiAoZGVzY3JpcHRvciAhPSBOVUxMKSB7CisgICAgICBpbnQgZmllbGRfbnVtYmVyID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7CisgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKGZpZWxkX251bWJlcik7CisKKyAgICAgIC8vIElmIHRoYXQgZmFpbGVkLCBjaGVjayBpZiB0aGUgZmllbGQgaXMgYW4gZXh0ZW5zaW9uLgorICAgICAgaWYgKGZpZWxkID09IE5VTEwgJiYgZGVzY3JpcHRvci0+SXNFeHRlbnNpb25OdW1iZXIoZmllbGRfbnVtYmVyKSkgeworICAgICAgICBpZiAoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSA9PSBOVUxMKSB7CisgICAgICAgICAgZmllbGQgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGZpZWxkX251bWJlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmllbGQgPSBpbnB1dC0+R2V0RXh0ZW5zaW9uUG9vbCgpCisgICAgICAgICAgICAgICAgICAgICAgIC0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3IsIGZpZWxkX251bWJlcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhhdCBmYWlsZWQsIGJ1dCB3ZSdyZSBhIE1lc3NhZ2VTZXQsIGFuZCB0aGlzIGlzIHRoZSB0YWcgZm9yIGEKKyAgICAgIC8vIE1lc3NhZ2VTZXQgaXRlbSwgdGhlbiBwYXJzZSB0aGF0LgorICAgICAgaWYgKGZpZWxkID09IE5VTEwgJiYKKyAgICAgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSAmJgorICAgICAgICAgIHRhZyA9PSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcpIHsKKyAgICAgICAgaWYgKCFQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEl0ZW0oaW5wdXQsIG1lc3NhZ2UpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOyAgLy8gU2tpcCBQYXJzZUFuZE1lcmdlRmllbGQoKTsgYWxyZWFkeSB0YWtlbiBjYXJlIG9mLgorICAgICAgfQorICAgIH0KKworICAgIGlmICghUGFyc2VBbmRNZXJnZUZpZWxkKHRhZywgZmllbGQsIG1lc3NhZ2UsIGlucHV0KSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCitib29sIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VGaWVsZCgKKyAgICB1aW50MzIgdGFnLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsICAgICAgICAvLyBNYXkgYmUgTlVMTCBmb3IgdW5rbm93bgorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBlbnVtIHsgVU5LTk9XTiwgTk9STUFMX0ZPUk1BVCwgUEFDS0VEX0ZPUk1BVCB9IHZhbHVlX2Zvcm1hdDsKKworICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgIHZhbHVlX2Zvcm1hdCA9IFVOS05PV047CisgIH0gZWxzZSBpZiAoV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgICBXaXJlVHlwZUZvckZpZWxkVHlwZShmaWVsZC0+dHlwZSgpKSkgeworICAgIHZhbHVlX2Zvcm1hdCA9IE5PUk1BTF9GT1JNQVQ7CisgIH0gZWxzZSBpZiAoZmllbGQtPmlzX3BhY2thYmxlKCkgJiYKKyAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgdmFsdWVfZm9ybWF0ID0gUEFDS0VEX0ZPUk1BVDsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBkb24ndCByZWNvZ25pemUgdGhpcyBmaWVsZC4gRWl0aGVyIHRoZSBmaWVsZCBudW1iZXIgaXMgdW5rbm93bgorICAgIC8vIG9yIHRoZSB3aXJlIHR5cGUgZG9lc24ndCBtYXRjaC4gUHV0IGl0IGluIG91ciB1bmtub3duIGZpZWxkIHNldC4KKyAgICB2YWx1ZV9mb3JtYXQgPSBVTktOT1dOOworICB9CisKKyAgaWYgKHZhbHVlX2Zvcm1hdCA9PSBVTktOT1dOKSB7CisgICAgcmV0dXJuIFNraXBGaWVsZChpbnB1dCwgdGFnLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKSk7CisgIH0gZWxzZSBpZiAodmFsdWVfZm9ybWF0ID09IFBBQ0tFRF9GT1JNQVQpIHsKKyAgICB1aW50MzIgbGVuZ3RoOworICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKKworICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfUEFDS0VEX1RZUEUoVFlQRSwgQ1BQVFlQRSwgQ1BQVFlQRV9NRVRIT0QpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIENQUFRZUEUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ1BQVFlQRSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNUWVBFPihpbnB1dCwgJnZhbHVlKSkgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZCMjQ1BQVFlQRV9NRVRIT0QobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0KKworICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKCBJTlQzMiwgIGludDMyLCAgSW50MzIpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoIElOVDY0LCAgaW50NjQsICBJbnQ2NCkKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShTSU5UMzIsICBpbnQzMiwgIEludDMyKQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNJTlQ2NCwgIGludDY0LCAgSW50NjQpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoVUlOVDMyLCB1aW50MzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShVSU5UNjQsIHVpbnQ2NCwgVUludDY0KQorCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoIEZJWEVEMzIsIHVpbnQzMiwgVUludDMyKQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKCBGSVhFRDY0LCB1aW50NjQsIFVJbnQ2NCkKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShTRklYRUQzMiwgIGludDMyLCAgSW50MzIpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoU0ZJWEVENjQsICBpbnQ2NCwgIEludDY0KQorCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoRkxPQVQgLCBmbG9hdCAsIEZsb2F0ICkKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlKQorCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoQk9PTCwgYm9vbCwgQm9vbCkKKyN1bmRlZiBIQU5ETEVfUEFDS0VEX1RZUEUKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTogeworICAgICAgICB3aGlsZSAoaW5wdXQtPkJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKKyAgICAgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgZmllbGQsIGVudW1fdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgICAgLy8gQ2FuJ3QgaGF2ZSBwYWNrZWQgZmllbGRzIG9mIHRoZXNlIHR5cGVzOiB0aGVzZSBzaG91bGQgYmUgY2F1Z2h0IGJ5CisgICAgICAgIC8vIHRoZSBwcm90b2NvbCBjb21waWxlci4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbnB1dC0+UG9wTGltaXQobGltaXQpOworICB9IGVsc2UgeworICAgIC8vIE5vbi1wYWNrZWQgdmFsdWUgKHZhbHVlX2Zvcm1hdCA9PSBOT1JNQUxfRk9STUFUKQorICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShUWVBFLCBDUFBUWVBFLCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUFBUWVBFIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENQUFRZUEUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVFlQRT4oaW5wdXQsICZ2YWx1ZSkpICAgICAgICAgXAorICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkIyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOyAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+U2V0IyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfQorCisgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMiwgIEludDMyKQorICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQsICBJbnQ2NCkKKyAgICAgIEhBTkRMRV9UWVBFKFNJTlQzMiwgIGludDMyLCAgSW50MzIpCisgICAgICBIQU5ETEVfVFlQRShTSU5UNjQsICBpbnQ2NCwgIEludDY0KQorICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0LCBVSW50NjQpCisKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCB1aW50MzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCB1aW50NjQsIFVJbnQ2NCkKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCAgaW50MzIsICBJbnQzMikKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCAgaW50NjQsICBJbnQ2NCkKKworICAgICAgSEFORExFX1RZUEUoRkxPQVQgLCBmbG9hdCAsIEZsb2F0ICkKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCisKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIGJvb2wsIEJvb2wpCisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTogeworICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKKyAgICAgICAgaWYgKGVudW1fdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBlbnVtX3ZhbHVlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBlbnVtX3ZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVGhlIGVudW0gdmFsdWUgaXMgbm90IG9uZSBvZiB0aGUga25vd24gdmFsdWVzLiAgQWRkIGl0IHRvIHRoZQorICAgICAgICAgIC8vIFVua25vd25GaWVsZFNldC4KKyAgICAgICAgICBpbnQ2NCBzaWduX2V4dGVuZGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjQ+KHZhbHVlKTsKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5BZGRWYXJpbnQoV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbl9leHRlbmRlZF92YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIEhhbmRsZSBzdHJpbmdzIHNlcGFyYXRlbHkgc28gdGhhdCB3ZSBjYW4gb3B0aW1pemUgdGhlIGN0eXBlPUNPUkQgY2FzZS4KKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzogeworICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgVmVyaWZ5VVRGOFN0cmluZyh2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBQQVJTRSk7CisgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6IHsKKyAgICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDogeworICAgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKKyAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZE1lc3NhZ2UoCisgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UoCisgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRHcm91cChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBzdWJfbWVzc2FnZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogeworICAgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKKyAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZE1lc3NhZ2UoCisgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UoCisgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlKGlucHV0LCBzdWJfbWVzc2FnZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRJdGVtKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICAvLyBUaGlzIG1ldGhvZCBwYXJzZXMgYSBncm91cCB3aGljaCBzaG91bGQgY29udGFpbiB0d28gZmllbGRzOgorICAvLyAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOworICAvLyAgIHJlcXVpcmVkIGRhdGEgbWVzc2FnZSA9IDM7CisKKyAgLy8gT25jZSB3ZSBzZWUgYSB0eXBlX2lkLCB3ZSdsbCBjb25zdHJ1Y3QgYSBmYWtlIHRhZyBmb3IgdGhpcyBleHRlbnNpb24KKyAgLy8gd2hpY2ggaXMgdGhlIHRhZyBpdCB3b3VsZCBoYXZlIGhhZCB1bmRlciB0aGUgcHJvdG8yIGV4dGVuc2lvbnMgd2lyZQorICAvLyBmb3JtYXQuCisgIHVpbnQzMiBmYWtlX3RhZyA9IDA7CisKKyAgLy8gT25jZSB3ZSBzZWUgYSB0eXBlX2lkLCB3ZSdsbCBsb29rIHVwIHRoZSBGaWVsZERlc2NyaXB0b3IgZm9yIHRoZQorICAvLyBleHRlbnNpb24uCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOworCisgIC8vIElmIHdlIHNlZSBtZXNzYWdlIGRhdGEgYmVmb3JlIHRoZSB0eXBlX2lkLCB3ZSdsbCBhcHBlbmQgaXQgdG8gdGhpcyBzbworICAvLyB3ZSBjYW4gcGFyc2UgaXQgbGF0ZXIuCisgIHN0cmluZyBtZXNzYWdlX2RhdGE7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKKyAgICBpZiAodGFnID09IDApIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZzogeworICAgICAgICB1aW50MzIgdHlwZV9pZDsKKyAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0eXBlX2lkKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBmYWtlX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgICAgdHlwZV9pZCwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIodHlwZV9pZCk7CisKKyAgICAgICAgaWYgKCFtZXNzYWdlX2RhdGEuZW1wdHkoKSkgeworICAgICAgICAgIC8vIFdlIHNhdyBzb21lIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQuICBIYXZlIHRvIHBhcnNlIGl0CisgICAgICAgICAgLy8gbm93LgorICAgICAgICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChtZXNzYWdlX2RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2RhdGEuc2l6ZSgpKTsKKyAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBzdWJfaW5wdXQoJnJhd19pbnB1dCk7CisgICAgICAgICAgaWYgKCFQYXJzZUFuZE1lcmdlRmllbGQoZmFrZV90YWcsIGZpZWxkLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJfaW5wdXQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICAgIG1lc3NhZ2VfZGF0YS5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZzogeworICAgICAgICBpZiAoZmFrZV90YWcgPT0gMCkgeworICAgICAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiBhIHR5cGVfaWQgeWV0LiAgQXBwZW5kIHRoaXMgZGF0YSB0byBtZXNzYWdlX2RhdGEuCisgICAgICAgICAgc3RyaW5nIHRlbXA7CisgICAgICAgICAgdWludDMyIGxlbmd0aDsKKyAgICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKCZ0ZW1wLCBsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZtZXNzYWdlX2RhdGEpOworICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dF9zdHJlYW0pOworICAgICAgICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyKGxlbmd0aCk7CisgICAgICAgICAgY29kZWRfb3V0cHV0LldyaXRlU3RyaW5nKHRlbXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEFscmVhZHkgc2F3IHR5cGVfaWQsIHNvIHdlIGNhbiBwYXJzZSB0aGlzIGRpcmVjdGx5LgorICAgICAgICAgIGlmICghUGFyc2VBbmRNZXJnZUZpZWxkKGZha2VfdGFnLCBmaWVsZCwgbWVzc2FnZSwgaW5wdXQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZzogeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgICBpZiAoIVNraXBGaWVsZChpbnB1dCwgdGFnLCBOVUxMKSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgaW50IHNpemUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGludCBleHBlY3RlZF9lbmRwb2ludCA9IG91dHB1dC0+Qnl0ZUNvdW50KCkgKyBzaXplOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcyhmaWVsZHNbaV0sIG1lc3NhZ2UsIG91dHB1dCk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKAorICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSksIG91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgU2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLCBvdXRwdXQpOworICB9CisKKyAgR09PR0xFX0NIRUNLX0VRKG91dHB1dC0+Qnl0ZUNvdW50KCksIGV4cGVjdGVkX2VuZHBvaW50KQorICAgIDw8ICI6IFByb3RvY29sIG1lc3NhZ2Ugc2VyaWFsaXplZCB0byBhIHNpemUgZGlmZmVyZW50IGZyb20gd2hhdCB3YXMgIgorICAgICAgICJvcmlnaW5hbGx5IGV4cGVjdGVkLiAgUGVyaGFwcyBpdCB3YXMgbW9kaWZpZWQgYnkgYW5vdGhlciB0aHJlYWQgIgorICAgICAgICJkdXJpbmcgc2VyaWFsaXphdGlvbj8iOworfQorCit2b2lkIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCisgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoZmllbGQsIG1lc3NhZ2UsIG91dHB1dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IGNvdW50ID0gMDsKKworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBjb3VudCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKyAgfSBlbHNlIGlmIChtZXNzYWdlX3JlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgeworICAgIGNvdW50ID0gMTsKKyAgfQorCisgIGNvbnN0IGJvb2wgaXNfcGFja2VkID0gZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKTsKKyAgaWYgKGlzX3BhY2tlZCAmJiBjb3VudCA+IDApIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoZmllbGQtPm51bWJlcigpLAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgICBjb25zdCBpbnQgZGF0YV9zaXplID0gRmllbGREYXRhT25seUJ5dGVTaXplKGZpZWxkLCBtZXNzYWdlKTsKKyAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoZGF0YV9zaXplKTsKKyAgfQorCisgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoVFlQRSwgQ1BQVFlQRSwgVFlQRV9NRVRIT0QsIENQUFRZUEVfTUVUSE9EKSAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IENQUFRZUEUgdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjQ1BQVFlQRV9NRVRIT0QoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGopIDogICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldCMjQ1BQVFlQRV9NRVRIT0QoICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGlzX3BhY2tlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlIyNUWVBFX01FVEhPRCMjTm9UYWcodmFsdWUsIG91dHB1dCk7ICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI1RZUEVfTUVUSE9EKGZpZWxkLT5udW1iZXIoKSwgdmFsdWUsIG91dHB1dCk7ICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0KKworICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKCBJTlQzMiwgIGludDMyLCAgSW50MzIsICBJbnQzMikKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRSggSU5UNjQsICBpbnQ2NCwgIEludDY0LCAgSW50NjQpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0lOVDMyLCAgaW50MzIsIFNJbnQzMiwgIEludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFNJTlQ2NCwgIGludDY0LCBTSW50NjQsICBJbnQ2NCkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UMzIsIHVpbnQzMiwgVUludDMyLCBVSW50MzIpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoVUlOVDY0LCB1aW50NjQsIFVJbnQ2NCwgVUludDY0KQorCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoIEZJWEVEMzIsIHVpbnQzMiwgIEZpeGVkMzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRSggRklYRUQ2NCwgdWludDY0LCAgRml4ZWQ2NCwgVUludDY0KQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFNGSVhFRDMyLCAgaW50MzIsIFNGaXhlZDMyLCAgSW50MzIpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0ZJWEVENjQsICBpbnQ2NCwgU0ZpeGVkNjQsICBJbnQ2NCkKKworICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEZMT0FUICwgZmxvYXQgLCBGbG9hdCAsIEZsb2F0ICkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlLCBEb3VibGUpCisKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShCT09MLCBib29sLCBCb29sLCBCb29sKQorI3VuZGVmIEhBTkRMRV9QUklNSVRJVkVfVFlQRQorCisjZGVmaW5lIEhBTkRMRV9UWVBFKFRZUEUsIFRZUEVfTUVUSE9ELCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI1RZUEVfTUVUSE9EKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZmllbGQtPmlzX3JlcGVhdGVkKCkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWQjI0NQUFRZUEVfTUVUSE9EKCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaikgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldCMjQ1BQVFlQRV9NRVRIT0QobWVzc2FnZSwgZmllbGQpLCAgICAgXAorICAgICAgICAgICAgICBvdXRwdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOworCisgICAgICBIQU5ETEVfVFlQRShHUk9VUCAgLCBHcm91cCAgLCBNZXNzYWdlKQorICAgICAgSEFORExFX1RZUEUoTUVTU0FHRSwgTWVzc2FnZSwgTWVzc2FnZSkKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiB7CisgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBqKSA6CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgaWYgKGlzX3BhY2tlZCkgeworICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZyh2YWx1ZS0+bnVtYmVyKCksIG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bShmaWVsZC0+bnVtYmVyKCksIHZhbHVlLT5udW1iZXIoKSwgb3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIHN0cmluZ3Mgc2VwYXJhdGVseSBzbyB0aGF0IHdlIGNhbiBnZXQgc3RyaW5nIHJlZmVyZW5jZXMKKyAgICAgIC8vIGluc3RlYWQgb2YgY29weWluZy4KKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzogeworICAgICAgICBzdHJpbmcgc2NyYXRjaDsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSA9IGZpZWxkLT5pc19yZXBlYXRlZCgpID8KKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGosICZzY3JhdGNoKSA6CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgZmllbGQsICZzY3JhdGNoKTsKKyAgICAgICAgVmVyaWZ5VVRGOFN0cmluZyh2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBTRVJJQUxJWkUpOworICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoZmllbGQtPm51bWJlcigpLCB2YWx1ZSwgb3V0cHV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOiB7CisgICAgICAgIHN0cmluZyBzY3JhdGNoOworICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaiwgJnNjcmF0Y2gpIDoKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOworICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlcyhmaWVsZC0+bnVtYmVyKCksIHZhbHVlLCBvdXRwdXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBXaXJlRm9ybWF0OjpTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplcygKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgLy8gU3RhcnQgZ3JvdXAuCisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcpOworCisgIC8vIFdyaXRlIHR5cGUgSUQuCisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWcpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoZmllbGQtPm51bWJlcigpKTsKKworICAvLyBXcml0ZSBtZXNzYWdlLgorICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZyk7CisKKyAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoc3ViX21lc3NhZ2UuR2V0Q2FjaGVkU2l6ZSgpKTsKKyAgc3ViX21lc3NhZ2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7CisKKyAgLy8gRW5kIGdyb3VwLgorICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZyk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50IFdpcmVGb3JtYXQ6OkJ5dGVTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBpbnQgb3VyX3NpemUgPSAwOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICBvdXJfc2l6ZSArPSBGaWVsZEJ5dGVTaXplKGZpZWxkc1tpXSwgbWVzc2FnZSk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICBvdXJfc2l6ZSArPSBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSkpOworICB9IGVsc2UgeworICAgIG91cl9zaXplICs9IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSk7CisgIH0KKworICByZXR1cm4gb3VyX3NpemU7Cit9CisKK2ludCBXaXJlRm9ybWF0OjpGaWVsZEJ5dGVTaXplKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCisgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgcmV0dXJuIE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoZmllbGQsIG1lc3NhZ2UpOworICB9CisKKyAgaW50IGNvdW50ID0gMDsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgY291bnQgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgIH0gZWxzZSBpZiAobWVzc2FnZV9yZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICBjb3VudCA9IDE7CisgIH0KKworICBjb25zdCBpbnQgZGF0YV9zaXplID0gRmllbGREYXRhT25seUJ5dGVTaXplKGZpZWxkLCBtZXNzYWdlKTsKKyAgaW50IG91cl9zaXplID0gZGF0YV9zaXplOworICBpZiAoZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgICAvLyBQYWNrZWQgZmllbGRzIGdldCBzZXJpYWxpemVkIGxpa2UgYSBzdHJpbmcsIG5vdCB0aGVpciBuYXRpdmUgdHlwZS4KKyAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgZG9lc24ndCByZWFsbHkgbWF0dGVyOyB0aGUgc2l6ZSBvbmx5IGNoYW5nZXMgaWYgaXQncworICAgICAgLy8gYSBHUk9VUAorICAgICAgb3VyX3NpemUgKz0gVGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpOworICAgICAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoZGF0YV9zaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3VyX3NpemUgKz0gY291bnQgKiBUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSk7CisgIH0KKyAgcmV0dXJuIG91cl9zaXplOworfQorCitpbnQgV2lyZUZvcm1hdDo6RmllbGREYXRhT25seUJ5dGVTaXplKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBpbnQgY291bnQgPSAwOworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBjb3VudCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKyAgfSBlbHNlIGlmIChtZXNzYWdlX3JlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgeworICAgIGNvdW50ID0gMTsKKyAgfQorCisgIGludCBkYXRhX3NpemUgPSAwOworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVFlQRSwgVFlQRV9NRVRIT0QsIENQUFRZUEVfTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1RZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVUSE9EIyNTaXplKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWQjI0NQUFRZUEVfTUVUSE9EKCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGopKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGF0YV9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FVEhPRCMjU2l6ZSggICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldCMjQ1BQVFlQRV9NRVRIT0QobWVzc2FnZSwgZmllbGQpKTsgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrOworCisjZGVmaW5lIEhBTkRMRV9GSVhFRF9UWVBFKFRZUEUsIFRZUEVfTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkYXRhX3NpemUgKz0gY291bnQgKiBXaXJlRm9ybWF0TGl0ZTo6ayMjVFlQRV9NRVRIT0QjI1NpemU7ICAgICAgICAgICBcCisgICAgICBicmVhazsKKworICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIEludDMyLCAgSW50MzIpCisgICAgSEFORExFX1RZUEUoIElOVDY0LCAgSW50NjQsICBJbnQ2NCkKKyAgICBIQU5ETEVfVFlQRShTSU5UMzIsIFNJbnQzMiwgIEludDMyKQorICAgIEhBTkRMRV9UWVBFKFNJTlQ2NCwgU0ludDY0LCAgSW50NjQpCisgICAgSEFORExFX1RZUEUoVUlOVDMyLCBVSW50MzIsIFVJbnQzMikKKyAgICBIQU5ETEVfVFlQRShVSU5UNjQsIFVJbnQ2NCwgVUludDY0KQorCisgICAgSEFORExFX0ZJWEVEX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyKQorICAgIEhBTkRMRV9GSVhFRF9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCkKKyAgICBIQU5ETEVfRklYRURfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIpCisgICAgSEFORExFX0ZJWEVEX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0KQorCisgICAgSEFORExFX0ZJWEVEX1RZUEUoRkxPQVQgLCBGbG9hdCApCisgICAgSEFORExFX0ZJWEVEX1RZUEUoRE9VQkxFLCBEb3VibGUpCisKKyAgICBIQU5ETEVfRklYRURfVFlQRShCT09MLCBCb29sKQorCisgICAgSEFORExFX1RZUEUoR1JPVVAgICwgR3JvdXAgICwgTWVzc2FnZSkKKyAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBNZXNzYWdlLCBNZXNzYWdlKQorI3VuZGVmIEhBTkRMRV9UWVBFCisjdW5kZWYgSEFORExFX0ZJWEVEX1RZUEUKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06IHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKyAgICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OkVudW1TaXplKAorICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgZmllbGQsIGopLT5udW1iZXIoKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGFfc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUoCisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIGZpZWxkKS0+bnVtYmVyKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gSGFuZGxlIHN0cmluZ3Mgc2VwYXJhdGVseSBzbyB0aGF0IHdlIGNhbiBnZXQgc3RyaW5nIHJlZmVyZW5jZXMKKyAgICAvLyBpbnN0ZWFkIG9mIGNvcHlpbmcuCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOiB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKyAgICAgICAgc3RyaW5nIHNjcmF0Y2g7CisgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBqLCAmc2NyYXRjaCkgOgorICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIGZpZWxkLCAmc2NyYXRjaCk7CisgICAgICAgIGRhdGFfc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSh2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGRhdGFfc2l6ZTsKK30KKworaW50IFdpcmVGb3JtYXQ6Ok1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIGludCBvdXJfc2l6ZSA9IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZTsKKworICAvLyB0eXBlX2lkCisgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGZpZWxkLT5udW1iZXIoKSk7CisKKyAgLy8gbWVzc2FnZQorICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7CisgIGludCBtZXNzYWdlX3NpemUgPSBzdWJfbWVzc2FnZS5CeXRlU2l6ZSgpOworCisgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKG1lc3NhZ2Vfc2l6ZSk7CisgIG91cl9zaXplICs9IG1lc3NhZ2Vfc2l6ZTsKKworICByZXR1cm4gb3VyX3NpemU7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ0ZhbGxiYWNrKGNvbnN0IGNoYXIqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCkgeworICBpZiAoIUlzU3RydWN0dXJhbGx5VmFsaWRVVEY4KGRhdGEsIHNpemUpKSB7CisgICAgY29uc3QgY2hhciogb3BlcmF0aW9uX3N0ciA9IE5VTEw7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgY2FzZSBQQVJTRToKKyAgICAgICAgb3BlcmF0aW9uX3N0ciA9ICJwYXJzaW5nIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNFUklBTElaRToKKyAgICAgICAgb3BlcmF0aW9uX3N0ciA9ICJzZXJpYWxpemluZyI7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gbm8gZGVmYXVsdCBjYXNlOiBoYXZlIHRoZSBjb21waWxlciB3YXJuIGlmIGEgY2FzZSBpcyBub3QgY292ZXJlZC4KKyAgICB9CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIlN0cmluZyBmaWVsZCBjb250YWlucyBpbnZhbGlkIFVURi04IGRhdGEgd2hlbiAiCisgICAgICAgICAgICAgICA8PCBvcGVyYXRpb25fc3RyCisgICAgICAgICAgICAgICA8PCAiIGEgcHJvdG9jb2wgYnVmZmVyLiBVc2UgdGhlICdieXRlcycgdHlwZSBpZiB5b3UgaW50ZW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICJzZW5kIHJhdyBieXRlcy4iOworICB9Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjOTAwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oCkBAIC0wLDAgKzEsMzA4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgICAgICAgIGF0ZW5hc2lvQGdvb2dsZS5jb20gKENocmlzIEF0ZW5hc2lvKSAoWmlnWmFnIHRyYW5zZm9ybSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgaGVhZGVyIGlzIGxvZ2ljYWxseSBpbnRlcm5hbCwgYnV0IGlzIG1hZGUgcHVibGljIGJlY2F1c2UgaXQgaXMgdXNlZAorLy8gZnJvbSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgY29kZSwgd2hpY2ggbWF5IHJlc2lkZSBpbiBvdGhlciBjb21wb25lbnRzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCisvLyBEbyBVVEYtOCB2YWxpZGF0aW9uIG9uIHN0cmluZyB0eXBlIGluIERlYnVnIGJ1aWxkIG9ubHkKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRAorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCisgICAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAvLyBjb2RlZF9zdHJlYW0uaAorICB9CisgIGNsYXNzIFVua25vd25GaWVsZFNldDsgICAgICAgICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGNsYXNzIGlzIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBsaWJyYXJ5IGFuZCBieQorLy8gcHJvdG9jb2wtY29tcGxpZXItZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3Nlcy4gIEl0IG11c3Qgbm90IGJlIGNhbGxlZAorLy8gZGlyZWN0bHkgYnkgY2xpZW50cy4KKy8vCisvLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGNvZGUgZm9yIGltcGxlbWVudGluZyB0aGUgYmluYXJ5IHByb3RvY29sIGJ1ZmZlcgorLy8gd2lyZSBmb3JtYXQgdmlhIHJlZmxlY3Rpb24uICBUaGUgV2lyZUZvcm1hdExpdGUgY2xhc3MgaW1wbGVtZW50cyB0aGUKKy8vIG5vbi1yZWZsZWN0aW9uIGJhc2VkIHJvdXRpbmVzLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgcmVhbGx5IGEgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFdpcmVGb3JtYXQgeworIHB1YmxpYzoKKworICAvLyBHaXZlbiBhIGZpZWxkIHJldHVybiBpdHMgV2lyZVR5cGUKKyAgc3RhdGljIGlubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZVR5cGVGb3JGaWVsZCgKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIC8vIEdpdmVuIGEgRmllbGRTZXNjcmlwdG9yOjpUeXBlIHJldHVybiBpdHMgV2lyZVR5cGUKKyAgc3RhdGljIGlubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZVR5cGVGb3JGaWVsZFR5cGUoCisgICAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgYnl0ZSBzaXplIG9mIGEgdGFnLiAgRm9yIGdyb3VwcywgdGhpcyBpbmNsdWRlcyBib3RoIHRoZSBzdGFydAorICAvLyBhbmQgZW5kIHRhZ3MuCisgIHN0YXRpYyBpbmxpbmUgaW50IFRhZ1NpemUoaW50IGZpZWxkX251bWJlciwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpOworCisgIC8vIFRoZXNlIHByb2NlZHVyZXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIG9mIE1lc3NhZ2Ugd2hpY2gKKyAgLy8gaGFuZGxlIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gb2YgdGhlIHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdAorICAvLyB1c2luZyBvbmx5IHRoZSBSZWZsZWN0aW9uIGludGVyZmFjZS4gIFdoZW4geW91IGFzayB0aGUgcHJvdG9jb2wKKyAgLy8gY29tcGlsZXIgdG8gb3B0aW1pemUgZm9yIGNvZGUgc2l6ZSByYXRoZXIgdGhhbiBzcGVlZCwgaXQgd2lsbCBpbXBsZW1lbnQKKyAgLy8gdGhvc2UgbWV0aG9kcyBpbiB0ZXJtcyBvZiB0aGVzZSBwcm9jZWR1cmVzLiAgT2YgY291cnNlLCB0aGVzZSBhcmUgbXVjaAorICAvLyBzbG93ZXIgdGhhbiB0aGUgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zIHdoaWNoIHRoZSBwcm90b2NvbCBjb21waWxlcgorICAvLyBnZW5lcmF0ZXMgd2hlbiB0b2xkIHRvIG9wdGltaXplIGZvciBzcGVlZC4KKworICAvLyBSZWFkIGEgbWVzc2FnZSBpbiBwcm90b2NvbCBidWZmZXIgd2lyZSBmb3JtYXQuCisgIC8vCisgIC8vIFRoaXMgcHJvY2VkdXJlIHJlYWRzIGVpdGhlciB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0gb3IgdGhyb3VnaAorICAvLyBhIFdJUkVUWVBFX0VORF9HUk9VUCB0YWcgZW5kaW5nIHRoZSBtZXNzYWdlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCisgIC8vIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlIGlucHV0IGlzIGludmFsaWQuCisgIC8vCisgIC8vIFJlcXVpcmVkIGZpZWxkcyBhcmUgTk9UIGNoZWNrZWQgYnkgdGhpcyBtZXRob2QuICBZb3UgbXVzdCBjYWxsCisgIC8vIElzSW5pdGlhbGl6ZWQoKSBvbiB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgeW91cnNlbGYuCisgIHN0YXRpYyBib29sIFBhcnNlQW5kTWVyZ2VQYXJ0aWFsKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSk7CisKKyAgLy8gU2VyaWFsaXplIGEgbWVzc2FnZSBpbiBwcm90b2NvbCBidWZmZXIgd2lyZSBmb3JtYXQuCisgIC8vCisgIC8vIEFueSBlbWJlZGRlZCBtZXNzYWdlcyB3aXRoaW4gdGhlIG1lc3NhZ2UgbXVzdCBoYXZlIHRoZWlyIGNvcnJlY3Qgc2l6ZXMKKyAgLy8gY2FjaGVkLiAgSG93ZXZlciwgdGhlIHRvcC1sZXZlbCBtZXNzYWdlIG5lZWQgbm90OyBpdHMgc2l6ZSBpcyBwYXNzZWQgYXMKKyAgLy8gYSBwYXJhbWV0ZXIgdG8gdGhpcyBwcm9jZWR1cmUuCisgIC8vCisgIC8vIFRoZXNlIHJldHVybiBmYWxzZSBpZmYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHJldHVybnMgYSB3cml0ZSBlcnJvci4KKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgIGludCBzaXplLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gSW1wbGVtZW50cyBNZXNzYWdlOjpCeXRlU2l6ZSgpIHZpYSByZWZsZWN0aW9uLiAgV0FSTklORzogIFRoZSByZXN1bHQKKyAgLy8gb2YgdGhpcyBtZXRob2QgaXMgKm5vdCogY2FjaGVkIGFueXdoZXJlLiAgSG93ZXZlciwgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzCisgIC8vIHdpbGwgaGF2ZSB0aGVpciBCeXRlU2l6ZSgpIG1ldGhvZHMgY2FsbGVkLCBzbyB0aGVpciBzaXplcyB3aWxsIGJlIGNhY2hlZC4KKyAgLy8gVGhlcmVmb3JlLCBjYWxsaW5nIHRoaXMgbWV0aG9kIGlzIHN1ZmZpY2llbnQgdG8gYWxsb3cgeW91IHRvIGNhbGwKKyAgLy8gV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkgb24gdGhlIHNhbWUgb2JqZWN0LgorICBzdGF0aWMgaW50IEJ5dGVTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEhlbHBlcnMgZm9yIGRlYWxpbmcgd2l0aCB1bmtub3duIGZpZWxkcworCisgIC8vIFNraXBzIGEgZmllbGQgdmFsdWUgb2YgdGhlIGdpdmVuIFdpcmVUeXBlLiAgVGhlIGlucHV0IHNob3VsZCBzdGFydAorICAvLyBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0YWcuICBJZiB1bmtub3duX2ZpZWxkcyBpcyBub24tTlVMTCwKKyAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWVsZCB3aWxsIGJlIGFkZGVkIHRvIGl0LgorICBzdGF0aWMgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKKyAgLy8gUmVhZHMgYW5kIGlnbm9yZXMgYSBtZXNzYWdlIGZyb20gdGhlIGlucHV0LiAgSWYgdW5rbm93bl9maWVsZHMgaXMgbm9uLU5VTEwsCisgIC8vIHRoZSBjb250ZW50cyB3aWxsIGJlIGFkZGVkIHRvIGl0LgorICBzdGF0aWMgYm9vbCBTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworCisgIC8vIFdyaXRlIHRoZSBjb250ZW50cyBvZiBhbiBVbmtub3duRmllbGRTZXQgdG8gdGhlIG91dHB1dC4KKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplVW5rbm93bkZpZWxkcyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgLy8gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KKyAgLy8gUmVxdWlyZXMgdGhhdCB0aGUgYnVmZmVyIGhhdmUgc3VmZmljaWVudCBjYXBhY2l0eSBmb3IKKyAgLy8gQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHVua25vd25fZmllbGRzKS4KKyAgLy8KKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgcGFzdCB0aGUgbGFzdCB3cml0dGVuIGJ5dGUuCisgIHN0YXRpYyB1aW50OCogU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgdWludDgqIHRhcmdldCk7CisKKyAgLy8gU2FtZSB0aGluZyBleGNlcHQgZm9yIG1lc3NhZ2VzIHRoYXQgaGF2ZSB0aGUgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQKKyAgLy8gb3B0aW9uLgorICBzdGF0aWMgdm9pZCBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKAorICAgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgLy8gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KKyAgLy8gUmVxdWlyZXMgdGhhdCB0aGUgYnVmZmVyIGhhdmUgc3VmZmljaWVudCBjYXBhY2l0eSBmb3IKKyAgLy8gQ29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKHVua25vd25fZmllbGRzKS4KKyAgLy8KKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgcGFzdCB0aGUgbGFzdCB3cml0dGVuIGJ5dGUuCisgIHN0YXRpYyB1aW50OCogU2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1RvQXJyYXkoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgdWludDgqIHRhcmdldCk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgVW5rbm93bkZpZWxkU2V0IG9uIHRoZSB3aXJlLgorICBzdGF0aWMgaW50IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZShjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKKworICAvLyBTYW1lIHRoaW5nIGV4Y2VwdCBmb3IgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdAorICAvLyBvcHRpb24uCisgIHN0YXRpYyBpbnQgQ29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKAorICAgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcyk7CisKKworICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgdGFncy4gIChJbmxpbmVkIGJlbG93IGFuZCBpbgorICAvLyBfaW5sLmgpCisgIC8vCisgIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gTWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpIGluIHRoZSBjYXNlCisgIC8vIG9mIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMuCisgIHN0YXRpYyB1aW50MzIgTWFrZVRhZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworICAvLyBQYXJzZSBhIHNpbmdsZSBmaWVsZC4gIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQgb3V0IHBvc2l0aW9uZWQgaW1taWRhdGVseQorICAvLyBhZnRlciB0aGUgdGFnLgorICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlRmllbGQoCisgICAgICB1aW50MzIgdGFnLAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgICAgICAgIC8vIE1heSBiZSBOVUxMIGZvciB1bmtub3duCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKworICAvLyBTZXJpYWxpemUgYSBzaW5nbGUgZmllbGQuCisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgICAgICAgIC8vIENhbm5vdCBiZSBOVUxMCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIC8vIENvbXB1dGUgc2l6ZSBvZiBhIHNpbmdsZSBmaWVsZC4gIElmIHRoZSBmaWVsZCBpcyBhIG1lc3NhZ2UgdHlwZSwgdGhpcworICAvLyB3aWxsIGNhbGwgQnl0ZVNpemUoKSBmb3IgdGhlIGVtYmVkZGVkIG1lc3NhZ2UsIGluc3VyaW5nIHRoYXQgaXQgY2FjaGVzCisgIC8vIGl0cyBzaXplLgorICBzdGF0aWMgaW50IEZpZWxkQnl0ZVNpemUoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgLy8gQ2Fubm90IGJlIE5VTEwKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIC8vIFBhcnNlL3NlcmlhbGl6ZSBhIE1lc3NhZ2VTZXQ6Okl0ZW0gZ3JvdXAuICBVc2VkIHdpdGggbWVzc2FnZXMgdGhhdCB1c2UKKyAgLy8gb3Bpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlLgorICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEl0ZW0oCisgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICBNZXNzYWdlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIGludCBNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIC8vIENvbXB1dGVzIHRoZSBieXRlIHNpemUgb2YgYSBmaWVsZCwgZXhjbHVkaW5nIHRhZ3MuIEZvciBwYWNrZWQgZmllbGRzLCBpdAorICAvLyBvbmx5IGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSByYXcgZGF0YSwgYW5kIG5vdCB0aGUgc2l6ZSBvZiB0aGUgdG90YWwKKyAgLy8gbGVuZ3RoLCBidXQgZm9yIG90aGVyIGxlbmd0aC1kZWxpbWl0ZWQgdHlwZXMsIHRoZSBzaXplIG9mIHRoZSBsZW5ndGggaXMKKyAgLy8gaW5jbHVkZWQuCisgIHN0YXRpYyBpbnQgRmllbGREYXRhT25seUJ5dGVTaXplKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgICAgICAgIC8vIENhbm5vdCBiZSBOVUxMCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworICBlbnVtIE9wZXJhdGlvbiB7CisgICAgUEFSU0UsCisgICAgU0VSSUFMSVpFLAorICB9OworCisgIC8vIFZlcmlmaWVzIHRoYXQgYSBzdHJpbmcgZmllbGQgaXMgdmFsaWQgVVRGOCwgbG9nZ2luZyBhbiBlcnJvciBpZiBub3QuCisgIHN0YXRpYyB2b2lkIFZlcmlmeVVURjhTdHJpbmcoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsIE9wZXJhdGlvbiBvcCk7CisKKyBwcml2YXRlOgorICAvLyBWZXJpZmllcyB0aGF0IGEgc3RyaW5nIGZpZWxkIGlzIHZhbGlkIFVURjgsIGxvZ2dpbmcgYW4gZXJyb3IgaWYgbm90LgorICBzdGF0aWMgdm9pZCBWZXJpZnlVVEY4U3RyaW5nRmFsbGJhY2soCisgICAgICBjb25zdCBjaGFyKiBkYXRhLAorICAgICAgaW50IHNpemUsCisgICAgICBPcGVyYXRpb24gb3ApOworCisKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2lyZUZvcm1hdCk7Cit9OworCisvLyBTdWJjbGFzcyBvZiBGaWVsZFNraXBwZXIgd2hpY2ggc2F2ZXMgc2tpcHBlZCBmaWVsZHMgdG8gYW4gVW5rbm93bkZpZWxkU2V0LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlciA6IHB1YmxpYyBGaWVsZFNraXBwZXIgeworIHB1YmxpYzoKKyAgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyKFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpCisgICAgICA6IHVua25vd25fZmllbGRzXyh1bmtub3duX2ZpZWxkcykge30KKyAgdmlydHVhbCB+VW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyKCkge30KKworICAvLyBpbXBsZW1lbnRzIEZpZWxkU2tpcHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2aXJ0dWFsIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZyk7CisgIHZpcnR1YWwgYm9vbCBTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2aXJ0dWFsIHZvaWQgU2tpcFVua25vd25FbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHNfOworfTsKKworLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gV2lyZVR5cGVGb3JGaWVsZFR5cGUoZmllbGQtPnR5cGUoKSk7CisgIH0KK30KKworaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkVHlwZSgKKyAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAvLyBTb21lIGNvbXBpbGVycyBkb24ndCBsaWtlIGVudW0gLT4gZW51bSBjYXN0cywgc28gd2UgaW1wbGljaXRfY2FzdCB0bworICAvLyBpbnQgZmlyc3QuCisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGVGb3JGaWVsZFR5cGUoCisgICAgICBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPigKKyAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KHR5cGUpKSk7Cit9CisKK2lubGluZSB1aW50MzIgV2lyZUZvcm1hdDo6TWFrZVRhZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIFdpcmVUeXBlRm9yRmllbGQoZmllbGQpKTsKK30KKworaW5saW5lIGludCBXaXJlRm9ybWF0OjpUYWdTaXplKGludCBmaWVsZF9udW1iZXIsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgIC8vIFNvbWUgY29tcGlsZXJzIGRvbid0IGxpa2UgZW51bSAtPiBlbnVtIGNhc3RzLCBzbyB3ZSBpbXBsaWNpdF9jYXN0IHRvCisgIC8vIGludCBmaXJzdC4KKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKGZpZWxkX251bWJlciwKKyAgICAgIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KAorICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4odHlwZSkpKTsKK30KKworaW5saW5lIHZvaWQgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSwKKyAgICBXaXJlRm9ybWF0OjpPcGVyYXRpb24gb3ApIHsKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyAgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ0ZhbGxiYWNrKGRhdGEsIHNpemUsIG9wKTsKKyNlbHNlCisgIC8vIEF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5nIGFib3V0IHVuc3VlZCB2YXJpYWJsZXMuCisgICh2b2lkKWRhdGE7ICh2b2lkKXNpemU7ICh2b2lkKW9wOworI2VuZGlmCit9CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGZjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYwpAQCAtMCwwICsxLDM2MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KKworI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1faW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmbmRlZiBfTVNDX1ZFUiAgICAvLyBNU1ZDIGRvZXNuJ3QgbGlrZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgY29uc3RhbnRzLCBHQ0MKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZXMgdGhlbS4KK2NvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWc7Citjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZzsKK2NvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWc7Citjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZzsKKworI2VuZGlmCisKK2NvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemUgPQorICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlN0YXRpY1ZhcmludFNpemUzMjxrTWVzc2FnZVNldEl0ZW1TdGFydFRhZz46OnZhbHVlICsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8a01lc3NhZ2VTZXRJdGVtRW5kVGFnPjo6dmFsdWUgKworICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlN0YXRpY1ZhcmludFNpemUzMjxrTWVzc2FnZVNldFR5cGVJZFRhZz46OnZhbHVlICsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8a01lc3NhZ2VTZXRNZXNzYWdlVGFnPjo6dmFsdWU7CisKK2NvbnN0IFdpcmVGb3JtYXRMaXRlOjpDcHBUeXBlCitXaXJlRm9ybWF0TGl0ZTo6a0ZpZWxkVHlwZVRvQ3BwVHlwZU1hcFtNQVhfRklFTERfVFlQRSArIDFdID0geworICBzdGF0aWNfY2FzdDxDcHBUeXBlPigwKSwgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycworCisgIENQUFRZUEVfRE9VQkxFLCAgIC8vIFRZUEVfRE9VQkxFCisgIENQUFRZUEVfRkxPQVQsICAgIC8vIFRZUEVfRkxPQVQKKyAgQ1BQVFlQRV9JTlQ2NCwgICAgLy8gVFlQRV9JTlQ2NAorICBDUFBUWVBFX1VJTlQ2NCwgICAvLyBUWVBFX1VJTlQ2NAorICBDUFBUWVBFX0lOVDMyLCAgICAvLyBUWVBFX0lOVDMyCisgIENQUFRZUEVfVUlOVDY0LCAgIC8vIFRZUEVfRklYRUQ2NAorICBDUFBUWVBFX1VJTlQzMiwgICAvLyBUWVBFX0ZJWEVEMzIKKyAgQ1BQVFlQRV9CT09MLCAgICAgLy8gVFlQRV9CT09MCisgIENQUFRZUEVfU1RSSU5HLCAgIC8vIFRZUEVfU1RSSU5HCisgIENQUFRZUEVfTUVTU0FHRSwgIC8vIFRZUEVfR1JPVVAKKyAgQ1BQVFlQRV9NRVNTQUdFLCAgLy8gVFlQRV9NRVNTQUdFCisgIENQUFRZUEVfU1RSSU5HLCAgIC8vIFRZUEVfQllURVMKKyAgQ1BQVFlQRV9VSU5UMzIsICAgLy8gVFlQRV9VSU5UMzIKKyAgQ1BQVFlQRV9FTlVNLCAgICAgLy8gVFlQRV9FTlVNCisgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfU0ZJWEVEMzIKKyAgQ1BQVFlQRV9JTlQ2NCwgICAgLy8gVFlQRV9TRklYRUQ2NAorICBDUFBUWVBFX0lOVDMyLCAgICAvLyBUWVBFX1NJTlQzMgorICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX1NJTlQ2NAorfTsKKworY29uc3QgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlCitXaXJlRm9ybWF0TGl0ZTo6a1dpcmVUeXBlRm9yRmllbGRUeXBlW01BWF9GSUVMRF9UWVBFICsgMV0gPSB7CisgIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZT4oLTEpLCAgLy8gaW52YWxpZAorICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCwgICAgICAgICAgIC8vIFRZUEVfRE9VQkxFCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyLCAgICAgICAgICAgLy8gVFlQRV9GTE9BVAorICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfSU5UNjQKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX1VJTlQ2NAorICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfSU5UMzIKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQsICAgICAgICAgICAvLyBUWVBFX0ZJWEVENjQKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIsICAgICAgICAgICAvLyBUWVBFX0ZJWEVEMzIKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX0JPT0wKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsICAvLyBUWVBFX1NUUklORworICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVAsICAgICAgIC8vIFRZUEVfR1JPVVAKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsICAvLyBUWVBFX01FU1NBR0UKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsICAvLyBUWVBFX0JZVEVTCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9VSU5UMzIKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX0VOVU0KKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIsICAgICAgICAgICAvLyBUWVBFX1NGSVhFRDMyCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0LCAgICAgICAgICAgLy8gVFlQRV9TRklYRUQ2NAorICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfU0lOVDMyCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9TSU5UNjQKK307CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZCgKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcpIHsKKyAgc3dpdGNoIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSkgeworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDogeworICAgICAgdWludDY0IHZhbHVlOworICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0OiB7CisgICAgICB1aW50NjQgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgIHVpbnQzMiBsZW5ndGg7CisgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghaW5wdXQtPlNraXAobGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQOiB7CisgICAgICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIVNraXBNZXNzYWdlKGlucHV0KSkgcmV0dXJuIGZhbHNlOworICAgICAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAvLyBDaGVjayB0aGF0IHRoZSBlbmRpbmcgdGFnIG1hdGNoZWQgdGhlIHN0YXJ0aW5nIHRhZy4KKyAgICAgIGlmICghaW5wdXQtPkxhc3RUYWdXYXMoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVA6IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMjogeworICAgICAgdWludDMyIHZhbHVlOworICAgICAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICB3aGlsZSh0cnVlKSB7CisgICAgdWludDMyIHRhZyA9IGlucHV0LT5SZWFkVGFnKCk7CisgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAvLyBFbmQgb2YgaW5wdXQuICBUaGlzIGlzIGEgdmFsaWQgcGxhY2UgdG8gZW5kLCBzbyByZXR1cm4gdHJ1ZS4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKTsKKworICAgIGlmICh3aXJlX3R5cGUgPT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgLy8gTXVzdCBiZSB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFTa2lwRmllbGQoaW5wdXQsIHRhZykpIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIEZpZWxkU2tpcHBlcjo6U2tpcEZpZWxkKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZykgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnKTsKK30KKworYm9vbCBGaWVsZFNraXBwZXI6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBNZXNzYWdlKGlucHV0KTsKK30KKwordm9pZCBGaWVsZFNraXBwZXI6OlNraXBVbmtub3duRW51bSgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUpIHsKKyAgLy8gTm90aGluZy4KK30KKworYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZEVudW1Ob0lubGluZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiB2YWx1ZXMpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKKyAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsKKyAgICBpbnQgdmFsdWU7CisgICAgaWYgKCFnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgIGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oaW5wdXQsICZ2YWx1ZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3ZhbGlkKHZhbHVlKSkgeworICAgICAgdmFsdWVzLT5BZGQodmFsdWUpOworICAgIH0KKyAgfQorICBpbnB1dC0+UG9wTGltaXQobGltaXQpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlSW50MzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjQoaW50IGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOworICBXcml0ZUludDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVVSW50MzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0KGludCBmaWVsZF9udW1iZXIsIHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOworICBXcml0ZVVJbnQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50MzIoaW50IGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVTSW50MzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0KGludCBmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlU0ludDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzIoaW50IGZpZWxkX251bWJlciwgdWludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQzMiwgb3V0cHV0KTsKKyAgV3JpdGVGaXhlZDMyTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjQoaW50IGZpZWxkX251bWJlciwgdWludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgb3V0cHV0KTsKKyAgV3JpdGVGaXhlZDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDMyKGludCBmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIG91dHB1dCk7CisgIFdyaXRlU0ZpeGVkMzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjQoaW50IGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgb3V0cHV0KTsKKyAgV3JpdGVTRml4ZWQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdChpbnQgZmllbGRfbnVtYmVyLCBmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCBvdXRwdXQpOworICBXcml0ZUZsb2F0Tm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZShpbnQgZmllbGRfbnVtYmVyLCBkb3VibGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIG91dHB1dCk7CisgIFdyaXRlRG91YmxlTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woaW50IGZpZWxkX251bWJlciwgYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVCb29sTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oaW50IGZpZWxkX251bWJlciwgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOworICBXcml0ZUVudW1Ob1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgR09PR0xFX0NIRUNLKHZhbHVlLnNpemUoKSA8PSBraW50MzJtYXgpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKKyAgb3V0cHV0LT5Xcml0ZVN0cmluZyh2YWx1ZSk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgR09PR0xFX0NIRUNLKHZhbHVlLnNpemUoKSA8PSBraW50MzJtYXgpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKKyAgb3V0cHV0LT5Xcml0ZVN0cmluZyh2YWx1ZSk7Cit9CisKKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVHcm91cChpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfU1RBUlRfR1JPVVAsIG91dHB1dCk7CisgIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCwgb3V0cHV0KTsKK30KKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgY29uc3QgaW50IHNpemUgPSB2YWx1ZS5HZXRDYWNoZWRTaXplKCk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihzaXplKTsKKyAgdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBNYXliZVRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCBvdXRwdXQpOworICBjb25zdCBpbnQgc2l6ZSA9IHZhbHVlLkdldENhY2hlZFNpemUoKTsKKyAgdWludDgqIHRhcmdldCA9IG91dHB1dC0+R2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShzaXplKTsKKyAgaWYgKHRhcmdldCAhPSBOVUxMKSB7CisgICAgdWludDgqIGVuZCA9IHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGVuZCAtIHRhcmdldCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7CisgIH0KKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVAsIG91dHB1dCk7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgIGNvbnN0IGludCBzaXplID0gdmFsdWUuR2V0Q2FjaGVkU2l6ZSgpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoc2l6ZSk7CisgIHVpbnQ4KiB0YXJnZXQgPSBvdXRwdXQtPkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2Uoc2l6ZSk7CisgIGlmICh0YXJnZXQgIT0gTlVMTCkgeworICAgIHVpbnQ4KiBlbmQgPSB2YWx1ZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7CisgICAgR09PR0xFX0RDSEVDS19FUShlbmQgLSB0YXJnZXQsIHNpemUpOworICB9IGVsc2UgeworICAgIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHZhbHVlKSB7CisgIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5CisgIHVpbnQzMiBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBpZiAoIWlucHV0LT5JbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUodmFsdWUsIGxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9Citib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmFsdWUpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBpbnB1dC0+SW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKHZhbHVlLCBsZW5ndGgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0ZmM5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmgKQEAgLTAsMCArMSw2MjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICAgICAgICAgYXRlbmFzaW9AZ29vZ2xlLmNvbSAoQ2hyaXMgQXRlbmFzaW8pIChaaWdaYWcgdHJhbnNmb3JtKQorLy8gICAgICAgICB3aW5rQGdvb2dsZS5jb20gKFdpbmsgU2F2aWxsZSkgKHJlZmFjdG9yZWQgZnJvbSB3aXJlX2Zvcm1hdC5oKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCisvLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPiAgLy8gZm9yIENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnQzMlNpemUKKworbmFtZXNwYWNlIGdvb2dsZSB7CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBSZXBlYXRlZEZpZWxkOyAgLy8gcmVwZWF0ZWRfZmllbGQuaAorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgU3RyaW5nUGllY2VGaWVsZDsKKworLy8gVGhpcyBjbGFzcyBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBhbmQgYnkKKy8vIHByb3RvY29sLWNvbXBsaWVyLWdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMuICBJdCBtdXN0IG5vdCBiZSBjYWxsZWQKKy8vIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisvLworLy8gVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXJzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGJpbmFyeSBwcm90b2NvbCBidWZmZXIKKy8vIHdpcmUgZm9ybWF0IHdpdGhvdXQgdGhlIG5lZWQgZm9yIHJlZmxlY3Rpb24uIFVzZSBXaXJlRm9ybWF0IHdoZW4gdXNpbmcKKy8vIHJlZmxlY3Rpb24uCisvLworLy8gVGhpcyBjbGFzcyBpcyByZWFsbHkgYSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyBvbmx5IHN0YXRpYyBtZXRob2RzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFdpcmVGb3JtYXRMaXRlIHsKKyBwdWJsaWM6CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSGVscGVyIGNvbnN0YW50cyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIGZvcm1hdC4gIFRoZXNlIGFyZQorICAvLyBtb3N0bHkgbWVhbnQgZm9yIGludGVybmFsIGFuZCBnZW5lcmF0ZWQgY29kZSB0byB1c2UuCisKKyAgLy8gVGhlIHdpcmUgZm9ybWF0IGlzIGNvbXBvc2VkIG9mIGEgc2VxdWVuY2Ugb2YgdGFnL3ZhbHVlIHBhaXJzLCBlYWNoCisgIC8vIG9mIHdoaWNoIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBvbmUgZmllbGQgKG9yIG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQKKyAgLy8gZmllbGQpLiAgRWFjaCB0YWcgaXMgZW5jb2RlZCBhcyBhIHZhcmludC4gIFRoZSBsb3dlciBiaXRzIG9mIHRoZSB0YWcKKyAgLy8gaWRlbnRpZnkgaXRzIHdpcmUgdHlwZSwgd2hpY2ggc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgdG8gZm9sbG93LgorICAvLyBUaGUgcmVzdCBvZiB0aGUgYml0cyBjb250YWluIHRoZSBmaWVsZCBudW1iZXIuICBFYWNoIHR5cGUgb2YgZmllbGQgKGFzCisgIC8vIGRlY2xhcmVkIGJ5IEZpZWxkRGVzY3JpcHRvcjo6VHlwZSwgaW4gZGVzY3JpcHRvci5oKSBtYXBzIHRvIG9uZSBvZgorICAvLyB0aGVzZSB3aXJlIHR5cGVzLiAgSW1tZWRpYXRlbHkgZm9sbG93aW5nIGVhY2ggdGFnIGlzIHRoZSBmaWVsZCdzIHZhbHVlLAorICAvLyBlbmNvZGVkIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSB3aXJlIHR5cGUuICBCZWNhdXNlIHRoZSB0YWcKKyAgLy8gaWRlbnRpZmllcyB0aGUgZW5jb2Rpbmcgb2YgdGhpcyBkYXRhLCBpdCBpcyBwb3NzaWJsZSB0byBza2lwCisgIC8vIHVucmVjb2duaXplZCBmaWVsZHMgZm9yIGZvcndhcmRzIGNvbXBhdGliaWxpdHkuCisKKyAgZW51bSBXaXJlVHlwZSB7CisgICAgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICA9IDAsCisgICAgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICA9IDEsCisgICAgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCA9IDIsCisgICAgV0lSRVRZUEVfU1RBUlRfR1JPVVAgICAgICA9IDMsCisgICAgV0lSRVRZUEVfRU5EX0dST1VQICAgICAgICA9IDQsCisgICAgV0lSRVRZUEVfRklYRUQzMiAgICAgICAgICA9IDUsCisgIH07CisKKyAgLy8gTGl0ZSBhbHRlcm5hdGl2ZSB0byBGaWVsZERlc2NyaXB0b3I6OlR5cGUuICBNdXN0IGJlIGtlcHQgaW4gc3luYy4KKyAgZW51bSBGaWVsZFR5cGUgeworICAgIFRZUEVfRE9VQkxFICAgICAgICAgPSAxLAorICAgIFRZUEVfRkxPQVQgICAgICAgICAgPSAyLAorICAgIFRZUEVfSU5UNjQgICAgICAgICAgPSAzLAorICAgIFRZUEVfVUlOVDY0ICAgICAgICAgPSA0LAorICAgIFRZUEVfSU5UMzIgICAgICAgICAgPSA1LAorICAgIFRZUEVfRklYRUQ2NCAgICAgICAgPSA2LAorICAgIFRZUEVfRklYRUQzMiAgICAgICAgPSA3LAorICAgIFRZUEVfQk9PTCAgICAgICAgICAgPSA4LAorICAgIFRZUEVfU1RSSU5HICAgICAgICAgPSA5LAorICAgIFRZUEVfR1JPVVAgICAgICAgICAgPSAxMCwKKyAgICBUWVBFX01FU1NBR0UgICAgICAgID0gMTEsCisgICAgVFlQRV9CWVRFUyAgICAgICAgICA9IDEyLAorICAgIFRZUEVfVUlOVDMyICAgICAgICAgPSAxMywKKyAgICBUWVBFX0VOVU0gICAgICAgICAgID0gMTQsCisgICAgVFlQRV9TRklYRUQzMiAgICAgICA9IDE1LAorICAgIFRZUEVfU0ZJWEVENjQgICAgICAgPSAxNiwKKyAgICBUWVBFX1NJTlQzMiAgICAgICAgID0gMTcsCisgICAgVFlQRV9TSU5UNjQgICAgICAgICA9IDE4LAorICAgIE1BWF9GSUVMRF9UWVBFICAgICAgPSAxOCwKKyAgfTsKKworICAvLyBMaXRlIGFsdGVybmF0aXZlIHRvIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZS4gIE11c3QgYmUga2VwdCBpbiBzeW5jLgorICBlbnVtIENwcFR5cGUgeworICAgIENQUFRZUEVfSU5UMzIgICAgICAgPSAxLAorICAgIENQUFRZUEVfSU5UNjQgICAgICAgPSAyLAorICAgIENQUFRZUEVfVUlOVDMyICAgICAgPSAzLAorICAgIENQUFRZUEVfVUlOVDY0ICAgICAgPSA0LAorICAgIENQUFRZUEVfRE9VQkxFICAgICAgPSA1LAorICAgIENQUFRZUEVfRkxPQVQgICAgICAgPSA2LAorICAgIENQUFRZUEVfQk9PTCAgICAgICAgPSA3LAorICAgIENQUFRZUEVfRU5VTSAgICAgICAgPSA4LAorICAgIENQUFRZUEVfU1RSSU5HICAgICAgPSA5LAorICAgIENQUFRZUEVfTUVTU0FHRSAgICAgPSAxMCwKKyAgICBNQVhfQ1BQVFlQRSAgICAgICAgID0gMTAsCisgIH07CisKKyAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIENwcFR5cGUgZm9yIGEgcGFydGljdWxhciBUeXBlLgorICBzdGF0aWMgQ3BwVHlwZSBGaWVsZFR5cGVUb0NwcFR5cGUoRmllbGRUeXBlIHR5cGUpOworCisgIC8vIEdpdmVuIGEgRmllbGRTZXNjcmlwdG9yOjpUeXBlIHJldHVybiBpdHMgV2lyZVR5cGUKKyAgc3RhdGljIGlubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZVR5cGVGb3JGaWVsZFR5cGUoCisgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIHR5cGUpIHsKKyAgICByZXR1cm4ga1dpcmVUeXBlRm9yRmllbGRUeXBlW3R5cGVdOworICB9CisKKyAgLy8gTnVtYmVyIG9mIGJpdHMgaW4gYSB0YWcgd2hpY2ggaWRlbnRpZnkgdGhlIHdpcmUgdHlwZS4KKyAgc3RhdGljIGNvbnN0IGludCBrVGFnVHlwZUJpdHMgPSAzOworICAvLyBNYXNrIGZvciB0aG9zZSBiaXRzLgorICBzdGF0aWMgY29uc3QgdWludDMyIGtUYWdUeXBlTWFzayA9ICgxIDw8IGtUYWdUeXBlQml0cykgLSAxOworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyB0YWdzLiAgKElubGluZWQgYmVsb3cgYW5kIGluCisgIC8vIF9pbmwuaCkKKyAgLy8KKyAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkgaW4gdGhlIGNhc2UKKyAgLy8gb2YgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KKyAgc3RhdGljIHVpbnQzMiBNYWtlVGFnKGludCBmaWVsZF9udW1iZXIsIFdpcmVUeXBlIHR5cGUpOworICBzdGF0aWMgV2lyZVR5cGUgR2V0VGFnV2lyZVR5cGUodWludDMyIHRhZyk7CisgIHN0YXRpYyBpbnQgR2V0VGFnRmllbGROdW1iZXIodWludDMyIHRhZyk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgYnl0ZSBzaXplIG9mIGEgdGFnLiAgRm9yIGdyb3VwcywgdGhpcyBpbmNsdWRlcyBib3RoIHRoZSBzdGFydAorICAvLyBhbmQgZW5kIHRhZ3MuCisgIHN0YXRpYyBpbmxpbmUgaW50IFRhZ1NpemUoaW50IGZpZWxkX251bWJlciwgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB0eXBlKTsKKworICAvLyBTa2lwcyBhIGZpZWxkIHZhbHVlIHdpdGggdGhlIGdpdmVuIHRhZy4gIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQKKyAgLy8gcG9zaXRpb25lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLiAgU2tpcHBlZCB2YWx1ZXMgYXJlIHNpbXBseSBkaXNjYXJkZWQsCisgIC8vIG5vdCByZWNvcmRlZCBhbnl3aGVyZS4gIFNlZSBXaXJlRm9ybWF0OjpTa2lwRmllbGQoKSBmb3IgYSB2ZXJzaW9uIHRoYXQKKyAgLy8gcmVjb3JkcyB0byBhbiBVbmtub3duRmllbGRTZXQuCisgIHN0YXRpYyBib29sIFNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcpOworCisgIC8vIFJlYWRzIGFuZCBpZ25vcmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbnB1dC4gIFNraXBwZWQgdmFsdWVzIGFyZSBzaW1wbHkKKyAgLy8gZGlzY2FyZGVkLCBub3QgcmVjb3JkZWQgYW55d2hlcmUuICBTZWUgV2lyZUZvcm1hdDo6U2tpcE1lc3NhZ2UoKSBmb3IgYQorICAvLyB2ZXJzaW9uIHRoYXQgcmVjb3JkcyB0byBhbiBVbmtub3duRmllbGRTZXQuCisgIHN0YXRpYyBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisKKy8vIFRoaXMgbWFjcm8gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygpLCBidXQgdGhlCisvLyByZXN1bHQgaXMgdXNhYmxlIGFzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCB3aGljaCBtYWtlcyBpdCB1c2FibGUKKy8vIGFzIGEgc3dpdGNoIGNhc2Ugb3IgYSB0ZW1wbGF0ZSBpbnB1dC4gIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKCkgaXMgbW9yZQorLy8gdHlwZS1zYWZlLCB0aG91Z2gsIHNvIHByZWZlciBpdCBpZiBwb3NzaWJsZS4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKEZJRUxEX05VTUJFUiwgVFlQRSkgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpY19jYXN0PHVpbnQzMj4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoRklFTERfTlVNQkVSKSA8PCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6a1RhZ1R5cGVCaXRzKSBcCisgICAgICB8IChUWVBFKSkKKworICAvLyBUaGVzZSBhcmUgdGhlIHRhZ3MgZm9yIHRoZSBvbGQgTWVzc2FnZVNldCBmb3JtYXQsIHdoaWNoIHdhcyBkZWZpbmVkIGFzOgorICAvLyAgIG1lc3NhZ2UgTWVzc2FnZVNldCB7CisgIC8vICAgICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7CisgIC8vICAgICAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOworICAvLyAgICAgICByZXF1aXJlZCBzdHJpbmcgbWVzc2FnZSA9IDM7CisgIC8vICAgICB9CisgIC8vICAgfQorICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0SXRlbU51bWJlciA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRUeXBlSWROdW1iZXIgPSAyOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcgPQorICAgIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRyhrTWVzc2FnZVNldEl0ZW1OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCk7CisgIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRJdGVtRW5kVGFnID0KKyAgICBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoa01lc3NhZ2VTZXRJdGVtTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldFR5cGVJZFRhZyA9CisgICAgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKGtNZXNzYWdlU2V0VHlwZUlkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldE1lc3NhZ2VUYWcgPQorICAgIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRyhrTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKworICAvLyBCeXRlIHNpemUgb2YgYWxsIHRhZ3Mgb2YgYSBNZXNzYWdlU2V0OjpJdGVtIGNvbWJpbmVkLgorICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0SXRlbVRhZ3NTaXplOworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBmbG9hdHMvZG91YmxlcyBhbmQgSUVFRS03NTQKKyAgLy8gdWludDMycy91aW50NjRzIHNvIHRoYXQgdGhleSBjYW4gYmUgd3JpdHRlbi4gIChBc3N1bWVzIHlvdXIgcGxhdGZvcm0KKyAgLy8gdXNlcyBJRUVFLTc1NCBmbG9hdHMuKQorICBzdGF0aWMgdWludDMyIEVuY29kZUZsb2F0KGZsb2F0IHZhbHVlKTsKKyAgc3RhdGljIGZsb2F0IERlY29kZUZsb2F0KHVpbnQzMiB2YWx1ZSk7CisgIHN0YXRpYyB1aW50NjQgRW5jb2RlRG91YmxlKGRvdWJsZSB2YWx1ZSk7CisgIHN0YXRpYyBkb3VibGUgRGVjb2RlRG91YmxlKHVpbnQ2NCB2YWx1ZSk7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFwcGluZyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgaW4KKyAgLy8gc3VjaCBhIHdheSB0aGF0IG51bWJlcnMgd2l0aCBzbWFsbCBtYWduaXR1ZGVzIHdpbGwgZW5jb2RlIHRvIHNtYWxsZXIKKyAgLy8gdmFyaW50cy4gIElmIHlvdSBzaW1wbHkgc3RhdGljX2Nhc3QgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYW4gdW5zaWduZWQKKyAgLy8gbnVtYmVyIGFuZCB2YXJpbnQtZW5jb2RlIGl0LCBpdCB3aWxsIGFsd2F5cyB0YWtlIDEwIGJ5dGVzLCBkZWZlYXRpbmcKKyAgLy8gdGhlIHB1cnBvc2Ugb2YgdmFyaW50LiAgU28sIGZvciB0aGUgInNpbnQzMiIgYW5kICJzaW50NjQiIGZpZWxkIHR5cGVzLAorICAvLyB3ZSBaaWdaYWctZW5jb2RlIHRoZSB2YWx1ZXMuCisgIHN0YXRpYyB1aW50MzIgWmlnWmFnRW5jb2RlMzIoaW50MzIgbik7CisgIHN0YXRpYyBpbnQzMiAgWmlnWmFnRGVjb2RlMzIodWludDMyIG4pOworICBzdGF0aWMgdWludDY0IFppZ1phZ0VuY29kZTY0KGludDY0IG4pOworICBzdGF0aWMgaW50NjQgIFppZ1phZ0RlY29kZTY0KHVpbnQ2NCBuKTsKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBNZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcgaW5kaXZpZHVhbCBmaWVsZC4gIFRoZSBpbXBsZW1lbnRhdGlvbnMKKyAgLy8gb2YgdGhlc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBpbiB3aXJlX2Zvcm1hdF9saXRlX2lubC5oOyB5b3UgbXVzdCAjaW5jbHVkZQorICAvLyB0aGF0IGZpbGUgdG8gdXNlIHRoZXNlLgorCisvLyBBdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKKyNkZWZpbmUgaW5wdXQgIGlvOjpDb2RlZElucHV0U3RyZWFtKiAgaW5wdXQKKyNkZWZpbmUgb3V0cHV0IGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0CisjZGVmaW5lIGZpZWxkX251bWJlciBpbnQgZmllbGRfbnVtYmVyCisjZGVmaW5lIElOTCBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKworICAvLyBSZWFkIGZpZWxkcywgbm90IGluY2x1ZGluZyB0YWdzLiAgVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB5b3UgYWxyZWFkeQorICAvLyByZWFkIHRoZSB0YWcgdG8gZGV0ZXJtaW5lIHdoYXQgZmllbGQgdG8gcmVhZC4KKworICAvLyBGb3IgcHJpbWl0aXZlIGZpZWxkcywgd2UganVzdCB1c2UgYSB0ZW1wbGF0aXplZCByb3V0aW5lIHBhcmFtZXRlcml6ZWQgYnkKKyAgLy8gdGhlIHJlcHJlc2VudGVkIHR5cGUgYW5kIHRoZSBGaWVsZFR5cGUuIFRoZXNlIGFyZSBzcGVjaWFsaXplZCB3aXRoIHRoZQorICAvLyBhcHByb3ByaWF0ZSBkZWZpbml0aW9uIGZvciBlYWNoIGRlY2xhcmVkIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZFByaW1pdGl2ZShpbnB1dCwgQ1R5cGUqIHZhbHVlKSBJTkw7CisKKyAgLy8gUmVhZHMgcmVwZWF0ZWQgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCBvcHRpbWl6YXRpb25zIGZvciByZXBlYXRzLgorICAvLyB0YWdfc2l6ZSBhbmQgdGFnIHNob3VsZCBib3RoIGJlIGNvbXBpbGUtdGltZSBjb25zdGFudHMgcHJvdmlkZWQgYnkgdGhlCisgIC8vIHByb3RvY29sIGNvbXBpbGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRSZXBlYXRlZFByaW1pdGl2ZShpbnQgdGFnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpIElOTDsKKworICAvLyBJZGVudGljYWwgdG8gUmVhZFJlcGVhdGVkUHJpbWl0aXZlLCBleGNlcHQgd2lsbCBub3QgaW5saW5lIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CisgIHN0YXRpYyBib29sIFJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lKGludCB0YWdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7CisKKyAgLy8gUmVhZHMgYSBwcmltaXRpdmUgdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyLiBJdCByZXR1cm5zIGEKKyAgLy8gcG9pbnRlciBwYXN0IHRoZSBzZWdtZW50IG9mIGRhdGEgdGhhdCB3YXMgcmVhZC4KKyAgLy8KKyAgLy8gVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGZvciB0aGUgdHlwZXMgd2l0aCBmaXhlZCB3aXJlIHNpemUsIGUuZy4KKyAgLy8gZmxvYXQsIGRvdWJsZSwgYW5kIHRoZSAocylmaXhlZCogdHlwZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IHVpbnQ4KiBSZWFkUHJpbWl0aXZlRnJvbUFycmF5KGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1R5cGUqIHZhbHVlKSBJTkw7CisKKyAgLy8gUmVhZHMgYSBwcmltaXRpdmUgcGFja2VkIGZpZWxkLgorICAvLworICAvLyBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHBhY2thYmxlIHR5cGVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRQYWNrZWRQcmltaXRpdmUoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSkgSU5MOworCisgIC8vIElkZW50aWNhbCB0byBSZWFkUGFja2VkUHJpbWl0aXZlLCBleGNlcHQgd2lsbCBub3QgaW5saW5lIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CisgIHN0YXRpYyBib29sIFJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZShpbnB1dCwgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKTsKKworICAvLyBSZWFkIGEgcGFja2VkIGVudW0gZmllbGQuIFZhbHVlcyBmb3Igd2hpY2ggaXNfdmFsaWQoKSByZXR1cm5zIGZhbHNlIGFyZQorICAvLyBkcm9wcGVkLgorICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRW51bU5vSW5saW5lKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlKTsKKworICBzdGF0aWMgYm9vbCBSZWFkU3RyaW5nKGlucHV0LCBzdHJpbmcqIHZhbHVlKTsKKyAgc3RhdGljIGJvb2wgUmVhZEJ5dGVzIChpbnB1dCwgc3RyaW5nKiB2YWx1ZSk7CisKKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRHcm91cCAgKGZpZWxkX251bWJlciwgaW5wdXQsIE1lc3NhZ2VMaXRlKiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkTWVzc2FnZShpbnB1dCwgTWVzc2FnZUxpdGUqIHZhbHVlKTsKKworICAvLyBMaWtlIGFib3ZlLCBidXQgZGUtdmlydHVhbGl6ZSB0aGUgY2FsbCB0byBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oKS4KKyAgLy8gVGhlIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKKyAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkR3JvdXBOb1ZpcnR1YWwoZmllbGRfbnVtYmVyLCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSogdmFsdWUpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRNZXNzYWdlTm9WaXJ0dWFsKGlucHV0LCBNZXNzYWdlVHlwZSogdmFsdWUpOworCisgIC8vIFdyaXRlIGEgdGFnLiAgVGhlIFdyaXRlKigpIGZ1bmN0aW9ucyB0eXBpY2FsbHkgaW5jbHVkZSB0aGUgdGFnLCBzbworICAvLyBub3JtYWxseSB0aGVyZSdzIG5vIG5lZWQgdG8gY2FsbCB0aGlzIHVubGVzcyB1c2luZyB0aGUgV3JpdGUqTm9UYWcoKQorICAvLyB2YXJpYW50cy4KKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSwgb3V0cHV0KSBJTkw7CisKKyAgLy8gV3JpdGUgZmllbGRzLCB3aXRob3V0IHRhZ3MuCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUludDMyTm9UYWcgICAoaW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVJbnQ2NE5vVGFnICAgKGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlVUludDMyTm9UYWcgICh1aW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVVSW50NjROb1RhZyAgKHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZVNJbnQzMk5vVGFnICAoaW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVTSW50NjROb1RhZyAgKGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlRml4ZWQzMk5vVGFnICh1aW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVGaXhlZDY0Tm9UYWcgKHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZVNGaXhlZDMyTm9UYWcoaW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVTRml4ZWQ2NE5vVGFnKGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlRmxvYXROb1RhZyAgIChmbG9hdCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZURvdWJsZU5vVGFnICAoZG91YmxlIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlQm9vbE5vVGFnICAgIChib29sIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlRW51bU5vVGFnICAgIChpbnQgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIC8vIFdyaXRlIGZpZWxkcywgaW5jbHVkaW5nIHRhZ3MuCisgIHN0YXRpYyB2b2lkIFdyaXRlSW50MzIgICAoZmllbGRfbnVtYmVyLCAgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlSW50NjQgICAoZmllbGRfbnVtYmVyLCAgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlVUludDMyICAoZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlVUludDY0ICAoZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ludDMyICAoZmllbGRfbnVtYmVyLCAgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ludDY0ICAoZmllbGRfbnVtYmVyLCAgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQzMiAoZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQ2NCAoZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ZpeGVkMzIoZmllbGRfbnVtYmVyLCAgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ZpeGVkNjQoZmllbGRfbnVtYmVyLCAgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRmxvYXQgICAoZmllbGRfbnVtYmVyLCAgZmxvYXQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRG91YmxlICAoZmllbGRfbnVtYmVyLCBkb3VibGUgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlQm9vbCAgICAoZmllbGRfbnVtYmVyLCAgIGJvb2wgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRW51bSAgICAoZmllbGRfbnVtYmVyLCAgICBpbnQgdmFsdWUsIG91dHB1dCk7CisKKyAgc3RhdGljIHZvaWQgV3JpdGVTdHJpbmcoZmllbGRfbnVtYmVyLCBjb25zdCBzdHJpbmcmIHZhbHVlLCBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUJ5dGVzIChmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCk7CisKKyAgc3RhdGljIHZvaWQgV3JpdGVHcm91cCgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwgb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVNZXNzYWdlKAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOworICAvLyBMaWtlIGFib3ZlLCBidXQgdGhlc2Ugd2lsbCBjaGVjayBpZiB0aGUgb3V0cHV0IHN0cmVhbSBoYXMgZW5vdWdoCisgIC8vIHNwYWNlIHRvIHdyaXRlIGRpcmVjdGx5IHRvIGEgZmxhdCBhcnJheS4KKyAgc3RhdGljIHZvaWQgV3JpdGVHcm91cE1heWJlVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwgb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCBkZS12aXJ0dWFsaXplIHRoZSBjYWxsIHRvIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLiAgVGhlCisgIC8vIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKKyAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUdyb3VwTm9WaXJ0dWFsKAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlTWVzc2FnZU5vVmlydHVhbCgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSwgb3V0cHV0KTsKKworI3VuZGVmIG91dHB1dAorI2RlZmluZSBvdXRwdXQgdWludDgqIHRhcmdldAorCisgIC8vIExpa2UgYWJvdmUsIGJ1dCB1c2Ugb25seSAqVG9BcnJheSBtZXRob2RzIG9mIENvZGVkT3V0cHV0U3RyZWFtLgorICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXaXJlVHlwZSB0eXBlLCBvdXRwdXQpIElOTDsKKworICAvLyBXcml0ZSBmaWVsZHMsIHdpdGhvdXQgdGFncy4KKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVJbnQzMk5vVGFnVG9BcnJheSAgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlSW50NjROb1RhZ1RvQXJyYXkgICAoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSAgKHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlVUludDY0Tm9UYWdUb0FycmF5ICAodWludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ludDY0Tm9UYWdUb0FycmF5ICAoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUZpeGVkMzJOb1RhZ1RvQXJyYXkgKHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSAodWludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheShpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ZpeGVkNjROb1RhZ1RvQXJyYXkoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5ICAgKGZsb2F0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVEb3VibGVOb1RhZ1RvQXJyYXkgIChkb3VibGUgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUJvb2xOb1RhZ1RvQXJyYXkgICAgKGJvb2wgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkgICAgKGludCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisKKyAgLy8gV3JpdGUgZmllbGRzLCBpbmNsdWRpbmcgdGFncy4KKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVJbnQzMlRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlSW50NjRUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVVJbnQzMlRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVVJbnQ2NFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVNJbnQzMlRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ludDY0VG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVGaXhlZDMyVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRml4ZWQ2NFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVNGaXhlZDMyVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTRml4ZWQ2NFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRmxvYXRUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgZmxvYXQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZURvdWJsZVRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBkb3VibGUgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUJvb2xUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgYm9vbCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRW51bVRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU3RyaW5nVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUJ5dGVzVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlR3JvdXBUb0FycmF5KAorICAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZU1lc3NhZ2VUb0FycmF5KAorICAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCBkZS12aXJ0dWFsaXplIHRoZSBjYWxsIHRvIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLiAgVGhlCisgIC8vIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKKyAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlR3JvdXBOb1ZpcnR1YWxUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUsIG91dHB1dCkgSU5MOworCisjdW5kZWYgb3V0cHV0CisjdW5kZWYgaW5wdXQKKyN1bmRlZiBJTkwKKworI3VuZGVmIGZpZWxkX251bWJlcgorCisgIC8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiBhIGZpZWxkLiAgVGhlIFh4U2l6ZSgpIGZ1bmN0aW9ucyBkbyBOT1QgaW5jbHVkZQorICAvLyB0aGUgdGFnLCBzbyB5b3UgbXVzdCBhbHNvIGNhbGwgVGFnU2l6ZSgpLiAgKFRoaXMgaXMgYmVjYXVzZSwgZm9yIHJlcGVhdGVkCisgIC8vIGZpZWxkcywgeW91IHNob3VsZCBvbmx5IGNhbGwgVGFnU2l6ZSgpIG9uY2UgYW5kIG11bHRpcGx5IGl0IGJ5IHRoZSBlbGVtZW50CisgIC8vIGNvdW50LCBidXQgeW91IG1heSBoYXZlIHRvIGNhbGwgWHhTaXplKCkgZm9yIGVhY2ggaW5kaXZpZHVhbCBlbGVtZW50LikKKyAgc3RhdGljIGlubGluZSBpbnQgSW50MzJTaXplICAgKCBpbnQzMiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgaW50IEludDY0U2l6ZSAgICggaW50NjQgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIGludCBVSW50MzJTaXplICAodWludDMyIHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBpbnQgVUludDY0U2l6ZSAgKHVpbnQ2NCB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgaW50IFNJbnQzMlNpemUgICggaW50MzIgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIGludCBTSW50NjRTaXplICAoIGludDY0IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBpbnQgRW51bVNpemUgICAgKCAgIGludCB2YWx1ZSk7CisKKyAgLy8gVGhlc2UgdHlwZXMgYWx3YXlzIGhhdmUgdGhlIHNhbWUgc2l6ZS4KKyAgc3RhdGljIGNvbnN0IGludCBrRml4ZWQzMlNpemUgID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBrRml4ZWQ2NFNpemUgID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBrU0ZpeGVkMzJTaXplID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBrU0ZpeGVkNjRTaXplID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBrRmxvYXRTaXplICAgID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBrRG91YmxlU2l6ZSAgID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBrQm9vbFNpemUgICAgID0gMTsKKworICBzdGF0aWMgaW5saW5lIGludCBTdHJpbmdTaXplKGNvbnN0IHN0cmluZyYgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIGludCBCeXRlc1NpemUgKGNvbnN0IHN0cmluZyYgdmFsdWUpOworCisgIHN0YXRpYyBpbmxpbmUgaW50IEdyb3VwU2l6ZSAgKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgaW50IE1lc3NhZ2VTaXplKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSk7CisKKyAgLy8gTGlrZSBhYm92ZSwgYnV0IGRlLXZpcnR1YWxpemUgdGhlIGNhbGwgdG8gQnl0ZVNpemUoKS4gIFRoZQorICAvLyBwb2ludGVyIG11c3QgcG9pbnQgYXQgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVR5cGUsICpub3QqIGEgc3ViY2xhc3MgKG9yCisgIC8vIHRoZSBzdWJjbGFzcyBtdXN0IG5vdCBvdmVycmlkZSBCeXRlU2l6ZSgpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgaW50IEdyb3VwU2l6ZU5vVmlydHVhbCAgKGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgorICBzdGF0aWMgaW5saW5lIGludCBNZXNzYWdlU2l6ZU5vVmlydHVhbChjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUpOworCisgIC8vIEdpdmVuIHRoZSBsZW5ndGggb2YgZGF0YSwgY2FsY3VsYXRlIHRoZSBieXRlIHNpemUgb2YgdGhlIGRhdGEgb24gdGhlCisgIC8vIHdpcmUgaWYgd2UgZW5jb2RlIHRoZSBkYXRhIGFzIGEgbGVuZ3RoIGRlbGltaXRlZCBmaWVsZC4KKyAgc3RhdGljIGlubGluZSBpbnQgTGVuZ3RoRGVsaW1pdGVkU2l6ZShpbnQgbGVuZ3RoKTsKKworIHByaXZhdGU6CisgIC8vIEEgaGVscGVyIG1ldGhvZCBmb3IgdGhlIHJlcGVhdGVkIHByaW1pdGl2ZSByZWFkZXIuIFRoaXMgbWV0aG9kIGhhcworICAvLyBvcHRpbWl6YXRpb25zIGZvciBwcmltaXRpdmUgdHlwZXMgdGhhdCBoYXZlIGZpeGVkIHNpemUgb24gdGhlIHdpcmUsIGFuZAorICAvLyBjYW4gYmUgcmVhZCB1c2luZyBwb3RlbnRpYWxseSBmYXN0ZXIgcGF0aHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZFJlcGVhdGVkRml4ZWRTaXplUHJpbWl0aXZlKAorICAgICAgaW50IHRhZ19zaXplLAorICAgICAgdWludDMyIHRhZywKKyAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisgIHN0YXRpYyBjb25zdCBDcHBUeXBlIGtGaWVsZFR5cGVUb0NwcFR5cGVNYXBbXTsKKyAgc3RhdGljIGNvbnN0IFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBrV2lyZVR5cGVGb3JGaWVsZFR5cGVbXTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2lyZUZvcm1hdExpdGUpOworfTsKKworLy8gQSBjbGFzcyB3aGljaCBkZWFscyB3aXRoIHVua25vd24gdmFsdWVzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdAorLy8gZGlzY2FyZHMgdGhlbS4gIFdpcmVGb3JtYXQgZGVmaW5lcyBhIHN1YmNsYXNzIHdoaWNoIHdyaXRlcyB0byBhbgorLy8gVW5rbm93bkZpZWxkU2V0LiAgVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCgpLCBzaW5jZQorLy8gRXh0ZW5zaW9uU2V0IGlzIHBhcnQgb2YgdGhlIGxpdGUgbGlicmFyeSBidXQgVW5rbm93bkZpZWxkU2V0IGlzIG5vdC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWVsZFNraXBwZXIgeworIHB1YmxpYzoKKyAgRmllbGRTa2lwcGVyKCkge30KKyAgdmlydHVhbCB+RmllbGRTa2lwcGVyKCkge30KKworICAvLyBTa2lwIGEgZmllbGQgd2hvc2UgdGFnIGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuCisgIHZpcnR1YWwgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKTsKKworICAvLyBTa2lwIGFuIGVudGlyZSBtZXNzYWdlIG9yIGdyb3VwLCB1cCB0byBhbiBlbmQtZ3JvdXAgdGFnICh3aGljaCBpcyBjb25zdW1lZCkKKyAgLy8gb3IgZW5kLW9mLXN0cmVhbS4KKyAgdmlydHVhbCBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisKKyAgLy8gRGVhbCB3aXRoIGFuIGFscmVhZHktcGFyc2VkIHVucmVjb2duaXplZCBlbnVtIHZhbHVlLiAgVGhlIGRlZmF1bHQKKyAgLy8gaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBidXQgdGhlIFVua25vd25GaWVsZFNldC1iYXNlZCBpbXBsZW1lbnRhdGlvbgorICAvLyBzYXZlcyBpdCBhcyBhbiB1bmtub3duIHZhcmludC4KKyAgdmlydHVhbCB2b2lkIFNraXBVbmtub3duRW51bShpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUpOworfTsKKworLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUKK1dpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGVUb0NwcFR5cGUoRmllbGRUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIGtGaWVsZFR5cGVUb0NwcFR5cGVNYXBbdHlwZV07Cit9CisKK2lubGluZSB1aW50MzIgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoaW50IGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSkgeworICByZXR1cm4gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKGZpZWxkX251bWJlciwgdHlwZSk7Cit9CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHVpbnQzMiB0YWcpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFdpcmVUeXBlPih0YWcgJiBrVGFnVHlwZU1hc2spOworfQorCitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih1aW50MzIgdGFnKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRhZyA+PiBrVGFnVHlwZUJpdHMpOworfQorCitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdHlwZSkgeworICBpbnQgcmVzdWx0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgZmllbGRfbnVtYmVyIDw8IGtUYWdUeXBlQml0cyk7CisgIGlmICh0eXBlID09IFRZUEVfR1JPVVApIHsKKyAgICAvLyBHcm91cHMgaGF2ZSBib3RoIGEgc3RhcnQgYW5kIGFuIGVuZCB0YWcuCisgICAgcmV0dXJuIHJlc3VsdCAqIDI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitpbmxpbmUgdWludDMyIFdpcmVGb3JtYXRMaXRlOjpFbmNvZGVGbG9hdChmbG9hdCB2YWx1ZSkgeworICB1bmlvbiB7ZmxvYXQgZjsgdWludDMyIGk7fTsKKyAgZiA9IHZhbHVlOworICByZXR1cm4gaTsKK30KKworaW5saW5lIGZsb2F0IFdpcmVGb3JtYXRMaXRlOjpEZWNvZGVGbG9hdCh1aW50MzIgdmFsdWUpIHsKKyAgdW5pb24ge2Zsb2F0IGY7IHVpbnQzMiBpO307CisgIGkgPSB2YWx1ZTsKKyAgcmV0dXJuIGY7Cit9CisKK2lubGluZSB1aW50NjQgV2lyZUZvcm1hdExpdGU6OkVuY29kZURvdWJsZShkb3VibGUgdmFsdWUpIHsKKyAgdW5pb24ge2RvdWJsZSBmOyB1aW50NjQgaTt9OworICBmID0gdmFsdWU7CisgIHJldHVybiBpOworfQorCitpbmxpbmUgZG91YmxlIFdpcmVGb3JtYXRMaXRlOjpEZWNvZGVEb3VibGUodWludDY0IHZhbHVlKSB7CisgIHVuaW9uIHtkb3VibGUgZjsgdWludDY0IGk7fTsKKyAgaSA9IHZhbHVlOworICByZXR1cm4gZjsKK30KKworLy8gWmlnWmFnIFRyYW5zZm9ybTogIEVuY29kZXMgc2lnbmVkIGludGVnZXJzIHNvIHRoYXQgdGhleSBjYW4gYmUKKy8vIGVmZmVjdGl2ZWx5IHVzZWQgd2l0aCB2YXJpbnQgZW5jb2RpbmcuCisvLworLy8gdmFyaW50IG9wZXJhdGVzIG9uIHVuc2lnbmVkIGludGVnZXJzLCBlbmNvZGluZyBzbWFsbGVyIG51bWJlcnMgaW50bworLy8gZmV3ZXIgYnl0ZXMuICBJZiB5b3UgdHJ5IHRvIHVzZSBpdCBvbiBhIHNpZ25lZCBpbnRlZ2VyLCBpdCB3aWxsIHRyZWF0CisvLyB0aGlzIG51bWJlciBhcyBhIHZlcnkgbGFyZ2UgdW5zaWduZWQgaW50ZWdlciwgd2hpY2ggbWVhbnMgdGhhdCBldmVuCisvLyBzbWFsbCBzaWduZWQgbnVtYmVycyBsaWtlIC0xIHdpbGwgdGFrZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMKKy8vICgxMCkgdG8gZW5jb2RlLiAgWmlnWmFnRW5jb2RlKCkgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQKKy8vIGluIHN1Y2ggYSB3YXkgdGhhdCB0aG9zZSB3aXRoIGEgc21hbGwgYWJzb2x1dGUgdmFsdWUgd2lsbCBoYXZlIHNtYWxsZXIKKy8vIGVuY29kZWQgdmFsdWVzLCBtYWtpbmcgdGhlbSBhcHByb3ByaWF0ZSBmb3IgZW5jb2RpbmcgdXNpbmcgdmFyaW50LgorLy8KKy8vICAgICAgIGludDMyIC0+ICAgICB1aW50MzIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAwIC0+ICAgICAgICAgIDAKKy8vICAgICAgICAgIC0xIC0+ICAgICAgICAgIDEKKy8vICAgICAgICAgICAxIC0+ICAgICAgICAgIDIKKy8vICAgICAgICAgIC0yIC0+ICAgICAgICAgIDMKKy8vICAgICAgICAgLi4uIC0+ICAgICAgICAuLi4KKy8vICAyMTQ3NDgzNjQ3IC0+IDQyOTQ5NjcyOTQKKy8vIC0yMTQ3NDgzNjQ4IC0+IDQyOTQ5NjcyOTUKKy8vCisvLyAgICAgICAgPj4gZW5jb2RlID4+CisvLyAgICAgICAgPDwgZGVjb2RlIDw8CisKK2lubGluZSB1aW50MzIgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0VuY29kZTMyKGludDMyIG4pIHsKKyAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMKKyAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOworfQorCitpbmxpbmUgaW50MzIgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKHVpbnQzMiBuKSB7CisgIHJldHVybiAobiA+PiAxKSBeIC1zdGF0aWNfY2FzdDxpbnQzMj4obiAmIDEpOworfQorCitpbmxpbmUgdWludDY0IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdFbmNvZGU2NChpbnQ2NCBuKSB7CisgIC8vIE5vdGU6ICB0aGUgcmlnaHQtc2hpZnQgbXVzdCBiZSBhcml0aG1ldGljCisgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDYzKTsKK30KKworaW5saW5lIGludDY0IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGU2NCh1aW50NjQgbikgeworICByZXR1cm4gKG4gPj4gMSkgXiAtc3RhdGljX2Nhc3Q8aW50NjQ+KG4gJiAxKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxY2M5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oCkBAIC0wLDAgKzEsNzc2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgICAgICAgIHdpbmtAZ29vZ2xlLmNvbSAoV2luayBTYXZpbGxlKSAocmVmYWN0b3JlZCBmcm9tIHdpcmVfZm9ybWF0LmgpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9JTkxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0lOTF9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgUmVhZFByaW1pdGl2ZS4KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIGludDMyKiB2YWx1ZSkgeworICB1aW50MzIgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMj4odGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDY0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQ2ND4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIGludDY0KiB2YWx1ZSkgeworICB1aW50NjQgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfVUlOVDMyPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgdWludDMyKiB2YWx1ZSkgeworICByZXR1cm4gaW5wdXQtPlJlYWRWYXJpbnQzMih2YWx1ZSk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8dWludDY0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UNjQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICB1aW50NjQqIHZhbHVlKSB7CisgIHJldHVybiBpbnB1dC0+UmVhZFZhcmludDY0KHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0lOVDMyPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgaW50MzIqIHZhbHVlKSB7CisgIHVpbnQzMiB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IFppZ1phZ0RlY29kZTMyKHRlbXApOworICByZXR1cm4gdHJ1ZTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0lOVDY0PigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgaW50NjQqIHZhbHVlKSB7CisgIHVpbnQ2NCB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IFppZ1phZ0RlY29kZTY0KHRlbXApOworICByZXR1cm4gdHJ1ZTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTx1aW50MzIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVEMzI+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICB1aW50MzIqIHZhbHVlKSB7CisgIHJldHVybiBpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTx1aW50NjQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVENjQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICB1aW50NjQqIHZhbHVlKSB7CisgIHJldHVybiBpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjY0KHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0ZJWEVEMzI+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBpbnQzMiogdmFsdWUpIHsKKyAgdWludDMyIHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzI+KHRlbXApOworICByZXR1cm4gdHJ1ZTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0ZJWEVENjQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBpbnQ2NCogdmFsdWUpIHsKKyAgdWludDY0IHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW42NCgmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjQ+KHRlbXApOworICByZXR1cm4gdHJ1ZTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxmbG9hdCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRkxPQVQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBmbG9hdCogdmFsdWUpIHsKKyAgdWludDMyIHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gRGVjb2RlRmxvYXQodGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGRvdWJsZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRE9VQkxFPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgZG91YmxlKiB2YWx1ZSkgeworICB1aW50NjQgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBEZWNvZGVEb3VibGUodGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGJvb2wsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBib29sKiB2YWx1ZSkgeworICB1aW50MzIgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSB0ZW1wICE9IDA7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIGludCogdmFsdWUpIHsKKyAgdWludDMyIHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50Pih0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PAorICB1aW50MzIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVEMzI+KAorICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgdWludDMyKiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheShidWZmZXIsIHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PAorICB1aW50NjQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVENjQ+KAorICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgdWludDY0KiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShidWZmZXIsIHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PAorICBpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0ZJWEVEMzI+KAorICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgaW50MzIqIHZhbHVlKSB7CisgIHVpbnQzMiB0ZW1wOworICBidWZmZXIgPSBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5KGJ1ZmZlciwgJnRlbXApOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMj4odGVtcCk7CisgIHJldHVybiBidWZmZXI7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZUZyb21BcnJheTwKKyAgaW50NjQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NGSVhFRDY0PigKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLAorICAgIGludDY0KiB2YWx1ZSkgeworICB1aW50NjQgdGVtcDsKKyAgYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShidWZmZXIsICZ0ZW1wKTsKKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjQ+KHRlbXApOworICByZXR1cm4gYnVmZmVyOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8CisgIGZsb2F0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GTE9BVD4oCisgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICBmbG9hdCogdmFsdWUpIHsKKyAgdWludDMyIHRlbXA7CisgIGJ1ZmZlciA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoYnVmZmVyLCAmdGVtcCk7CisgICp2YWx1ZSA9IERlY29kZUZsb2F0KHRlbXApOworICByZXR1cm4gYnVmZmVyOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8CisgIGRvdWJsZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRE9VQkxFPigKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLAorICAgIGRvdWJsZSogdmFsdWUpIHsKKyAgdWludDY0IHRlbXA7CisgIGJ1ZmZlciA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkoYnVmZmVyLCAmdGVtcCk7CisgICp2YWx1ZSA9IERlY29kZURvdWJsZSh0ZW1wKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZShpbnQsIC8vIHRhZ19zaXplLCB1bnVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworICBDVHlwZSB2YWx1ZTsKKyAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIHZhbHVlcy0+QWRkKHZhbHVlKTsKKyAgaW50IGVsZW1lbnRzX2FscmVhZHlfcmVzZXJ2ZWQgPSB2YWx1ZXMtPkNhcGFjaXR5KCkgLSB2YWx1ZXMtPnNpemUoKTsKKyAgd2hpbGUgKGVsZW1lbnRzX2FscmVhZHlfcmVzZXJ2ZWQgPiAwICYmIGlucHV0LT5FeHBlY3RUYWcodGFnKSkgeworICAgIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgIHZhbHVlcy0+QWRkQWxyZWFkeVJlc2VydmVkKHZhbHVlKTsKKyAgICBlbGVtZW50c19hbHJlYWR5X3Jlc2VydmVkLS07CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmUoCisgICAgaW50IHRhZ19zaXplLAorICAgIHVpbnQzMiB0YWcsCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZXMpIHsKKyAgR09PR0xFX0RDSEVDS19FUShVSW50MzJTaXplKHRhZyksIHRhZ19zaXplKTsKKyAgQ1R5cGUgdmFsdWU7CisgIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHZhbHVlcy0+QWRkKHZhbHVlKTsKKworICAvLyBGb3IgZml4ZWQgc2l6ZSB2YWx1ZXMsIHJlcGVhdGVkIHZhbHVlcyBjYW4gYmUgcmVhZCBtb3JlIHF1aWNrbHkgYnkKKyAgLy8gcmVhZGluZyBkaXJlY3RseSBmcm9tIGEgcmF3IGFycmF5LgorICAvLworICAvLyBXZSBjYW4gZ2V0IGEgdGlnaHQgbG9vcCBieSBvbmx5IHJlYWRpbmcgYXMgbWFueSBlbGVtZW50cyBhcyBjYW4gYmUKKyAgLy8gYWRkZWQgdG8gdGhlIFJlcGVhdGVkRmllbGQgd2l0aG91dCBoYXZpbmcgdG8gZG8gYW55IHJlc2l6aW5nLiBBZGRpdGlvbmFsbHksCisgIC8vIHdlIG9ubHkgdHJ5IHRvIHJlYWQgYXMgbWFueSBlbGVtZW50cyBhcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIGN1cnJlbnQKKyAgLy8gYnVmZmVyIHNwYWNlLiBEb2luZyBzbyBhdm9pZHMgaGF2aW5nIHRvIHBlcmZvcm0gYm91bmRhcnkgY2hlY2tzIHdoZW4KKyAgLy8gcmVhZGluZyB0aGUgdmFsdWU6IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGNhbiBiZSByZWFkIGlzCisgIC8vIGtub3duIG91dHNpZGUgb2YgdGhlIGxvb3AuCisgIGNvbnN0IHZvaWQqIHZvaWRfcG9pbnRlcjsKKyAgaW50IHNpemU7CisgIGlucHV0LT5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZ2b2lkX3BvaW50ZXIsICZzaXplKTsKKyAgaWYgKHNpemUgPiAwKSB7CisgICAgY29uc3QgdWludDgqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPih2b2lkX3BvaW50ZXIpOworICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgZWFjaCB0eXBlIG9jY3VwaWVzIG9uIHRoZSB3aXJlLgorICAgIGNvbnN0IGludCBwZXJfdmFsdWVfc2l6ZSA9IHRhZ19zaXplICsgc2l6ZW9mKHZhbHVlKTsKKworICAgIGludCBlbGVtZW50c19hdmFpbGFibGUgPSBtaW4odmFsdWVzLT5DYXBhY2l0eSgpIC0gdmFsdWVzLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC8gcGVyX3ZhbHVlX3NpemUpOworICAgIGludCBudW1fcmVhZCA9IDA7CisgICAgd2hpbGUgKG51bV9yZWFkIDwgZWxlbWVudHNfYXZhaWxhYmxlICYmCisgICAgICAgICAgIChidWZmZXIgPSBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KAorICAgICAgICAgICAgICAgYnVmZmVyLCB0YWcpKSAhPSBOVUxMKSB7CisgICAgICBidWZmZXIgPSBSZWFkUHJpbWl0aXZlRnJvbUFycmF5PENUeXBlLCBEZWNsYXJlZFR5cGU+KGJ1ZmZlciwgJnZhbHVlKTsKKyAgICAgIHZhbHVlcy0+QWRkQWxyZWFkeVJlc2VydmVkKHZhbHVlKTsKKyAgICAgICsrbnVtX3JlYWQ7CisgICAgfQorICAgIGNvbnN0IGludCByZWFkX2J5dGVzID0gbnVtX3JlYWQgKiBwZXJfdmFsdWVfc2l6ZTsKKyAgICBpZiAocmVhZF9ieXRlcyA+IDApIHsKKyAgICAgIGlucHV0LT5Ta2lwKHJlYWRfYnl0ZXMpOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU3BlY2lhbGl6YXRpb25zIG9mIFJlYWRSZXBlYXRlZFByaW1pdGl2ZSBmb3IgdGhlIGZpeGVkIHNpemUgdHlwZXMsIHdoaWNoIHVzZSAKKy8vIHRoZSBvcHRpbWl6ZWQgY29kZSBwYXRoLgorI2RlZmluZSBSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKENQUFRZUEUsIERFQ0xBUkVEX1RZUEUpICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDUFBUWVBFLCBXaXJlRm9ybWF0TGl0ZTo6REVDTEFSRURfVFlQRT4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgdGFnX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyIHRhZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZXBlYXRlZEZpZWxkPENQUFRZUEU+KiB2YWx1ZXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENQUFRZUEUsIFdpcmVGb3JtYXRMaXRlOjpERUNMQVJFRF9UWVBFPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRhZ19zaXplLCB0YWcsIGlucHV0LCB2YWx1ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1JFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUodWludDMyLCBUWVBFX0ZJWEVEMzIpCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQ2NCwgVFlQRV9GSVhFRDY0KQorUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShpbnQzMiwgVFlQRV9TRklYRUQzMikKK1JFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoaW50NjQsIFRZUEVfU0ZJWEVENjQpCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGZsb2F0LCBUWVBFX0ZMT0FUKQorUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShkb3VibGUsIFRZUEVfRE9VQkxFKQorCisjdW5kZWYgUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Citib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZSgKKyAgICBpbnQgdGFnX3NpemUsCisgICAgdWludDMyIHRhZywKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKSB7CisgIHJldHVybiBSZWFkUmVwZWF0ZWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oCisgICAgICB0YWdfc2l6ZSwgdGFnLCBpbnB1dCwgdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWVzKSB7CisgIHVpbnQzMiBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7CisgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgQ1R5cGUgdmFsdWU7CisgICAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgdmFsdWVzLT5BZGQodmFsdWUpOworICB9CisgIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Citib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmUoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZXMpIHsKKyAgcmV0dXJuIFJlYWRQYWNrZWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsIHZhbHVlcyk7Cit9CisKKworaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRHcm91cChpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiB2YWx1ZSkgeworICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7CisgIGlmICghdmFsdWUtPk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCkpIHJldHVybiBmYWxzZTsKKyAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgIC8vIE1ha2Ugc3VyZSB0aGUgbGFzdCB0aGluZyByZWFkIHdhcyBhbiBlbmQgdGFnIGZvciB0aGlzIGdyb3VwLgorICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKE1ha2VUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVApKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIHZhbHVlKSB7CisgIHVpbnQzMiBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKKyAgaWYgKCF2YWx1ZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkgcmV0dXJuIGZhbHNlOworICAvLyBNYWtlIHN1cmUgdGhhdCBwYXJzaW5nIHN0b3BwZWQgd2hlbiB0aGUgbGltaXQgd2FzIGhpdCwgbm90IGF0IGFuIGVuZGdyb3VwCisgIC8vIHRhZy4KKyAgaWYgKCFpbnB1dC0+Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpIHJldHVybiBmYWxzZTsKKyAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBXZSBuYW1lIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc29tZXRoaW5nIGxvbmcgYW5kIGV4dHJlbWVseSB1bmxpa2VseSB0byBvY2N1cgorLy8gZWxzZXdoZXJlIGJlY2F1c2UgYSAqcXVhbGlmaWVkKiBtZW1iZXIgYWNjZXNzIGV4cHJlc3Npb24gZGVzaWduZWQgdG8gYXZvaWQKKy8vIHZpcnR1YWwgZGlzcGF0Y2gsIEMrKzAzIFtiYXNpYy5sb29rdXAuY2xhc3NyZWZdIDMuNC41LzQgcmVxdWlyZXMgdGhhdCB0aGUKKy8vIG5hbWUgb2YgdGhlIHF1YWxpZnlpbmcgY2xhc3MgdG8gYmUgbG9va2VkIHVwIGJvdGggaW4gdGhlIGNvbnRleHQgb2YgdGhlIGZ1bGwKKy8vIGV4cHJlc3Npb24gKGZpbmRpbmcgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcikgYW5kIGluIHRoZSBjb250ZXh0IG9mIHRoZSBvYmplY3QKKy8vIHdob3NlIG1lbWJlciB3ZSBhcmUgYWNjZXNzaW5nLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGZpbmQgYSBuZXN0ZWQgdHlwZQorLy8gd2l0aGluIHRoYXQgb2JqZWN0LiBUaGUgc3RhbmRhcmQgZ29lcyBvbiB0byByZXF1aXJlIHRoZXNlIG5hbWVzIHRvIHJlZmVyIHRvCisvLyB0aGUgc2FtZSBlbnRpdHksIHdoaWNoIHRoaXMgY29sbGlzaW9uIHdvdWxkIHZpb2xhdGUuIFRoZSBsYWNrIG9mIGEgc2FmZSB3YXkKKy8vIHRvIGF2b2lkIHRoaXMgY29sbGlzaW9uIGFwcGVhcnMgdG8gYmUgYSBkZWZlY3QgaW4gdGhlIHN0YW5kYXJkLCBidXQgdW50aWwgaXQKKy8vIGlzIGNvcnJlY3RlZCwgd2UgY2hvb3NlIHRoZSBuYW1lIHRvIGF2b2lkIGFjY2lkZW50YWwgY29sbGlzaW9ucy4KK3RlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwTm9WaXJ0dWFsKAorICAgIGludCBmaWVsZF9udW1iZXIsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0KiB2YWx1ZSkgeworICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7CisgIGlmICghdmFsdWUtPgorICAgICAgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAvLyBNYWtlIHN1cmUgdGhlIGxhc3QgdGhpbmcgcmVhZCB3YXMgYW4gZW5kIHRhZyBmb3IgdGhpcyBncm91cC4KKyAgaWYgKCFpbnB1dC0+TGFzdFRhZ1dhcyhNYWtlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCogdmFsdWUpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gaW5wdXQtPlB1c2hMaW1pdChsZW5ndGgpOworICBpZiAoIXZhbHVlLT4KKyAgICAgIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBNYWtlIHN1cmUgdGhhdCBwYXJzaW5nIHN0b3BwZWQgd2hlbiB0aGUgbGltaXQgd2FzIGhpdCwgbm90IGF0IGFuIGVuZGdyb3VwCisgIC8vIHRhZy4KKyAgaWYgKCFpbnB1dC0+Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpIHJldHVybiBmYWxzZTsKKyAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZyhpbnQgZmllbGRfbnVtYmVyLCBXaXJlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVUYWcoTWFrZVRhZyhmaWVsZF9udW1iZXIsIHR5cGUpKTsKK30KKworaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZyhpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0Tm9UYWcoaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQ2NChzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJOb1RhZyh1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0Tm9UYWcodWludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDY0KHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQzMk5vVGFnKGludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFppZ1phZ0VuY29kZTMyKHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50NjROb1RhZyhpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQ2NChaaWdaYWdFbmNvZGU2NCh2YWx1ZSkpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQzMk5vVGFnKHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIodmFsdWUpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NE5vVGFnKHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQodmFsdWUpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkMzJOb1RhZyhpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0Tm9UYWcoaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW42NChzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdE5vVGFnKGZsb2F0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIoRW5jb2RlRmxvYXQodmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZU5vVGFnKGRvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW42NChFbmNvZGVEb3VibGUodmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xOb1RhZyhib29sIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZSA/IDEgOiAwKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZyhpbnQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKHZhbHVlKTsKK30KKworLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKKy8vIHBhcmFtZXRlciBuYW1lLgordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUdyb3VwTm9WaXJ0dWFsKAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlLAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfU1RBUlRfR1JPVVAsIG91dHB1dCk7CisgIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCwgb3V0cHV0KTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTm9WaXJ0dWFsKAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlLAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKAorICAgICAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6R2V0Q2FjaGVkU2l6ZSgpKTsKKyAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheShNYWtlVGFnKGZpZWxkX251bWJlciwgdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQorCitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWdUb0FycmF5KGludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NE5vVGFnVG9BcnJheShpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheSgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJOb1RhZ1RvQXJyYXkodWludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0Tm9UYWdUb0FycmF5KHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQ2NFRvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQzMk5vVGFnVG9BcnJheShpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoWmlnWmFnRW5jb2RlMzIodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50NjROb1RhZ1RvQXJyYXkoaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjRUb0FycmF5KFppZ1phZ0VuY29kZTY0KHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQzMk5vVGFnVG9BcnJheSh1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSh1aW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkMzJOb1RhZ1RvQXJyYXkoaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlKSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjROb1RhZ1RvQXJyYXkoaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW42NFRvQXJyYXkoCisgICAgICBzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRmxvYXROb1RhZ1RvQXJyYXkoZmxvYXQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkoRW5jb2RlRmxvYXQodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVOb1RhZ1RvQXJyYXkoZG91YmxlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheShFbmNvZGVEb3VibGUodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sTm9UYWdUb0FycmF5KGJvb2wgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSA/IDEgOiAwLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtTm9UYWdUb0FycmF5KGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQorCitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlSW50NjROb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlVUludDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50MzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVNJbnQzMk5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVTSW50NjROb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkMzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQzMiwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlU0ZpeGVkMzJOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVNGaXhlZDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVGbG9hdE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZURvdWJsZU5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZUJvb2xOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CisKK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICAvLyBTdHJpbmcgaXMgZm9yIFVURi04IHRleHQgb25seQorICAvLyBXQVJOSU5HOiAgSW4gd2lyZV9mb3JtYXQuY2MsIGJvdGggc3RyaW5ncyBhbmQgYnl0ZXMgYXJlIGhhbmRsZWQgYnkKKyAgLy8gICBXcml0ZVN0cmluZygpIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uICBJZiB0aGUgaW1wbGVtZW50YXRpb25zIGJlY29tZQorICAvLyAgIGRpZmZlcmVudCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhhdCB1c2FnZS4KKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZS5zaXplKCksIHRhcmdldCk7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXNUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOworICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLnNpemUoKSwgdGFyZ2V0KTsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQorCisKK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCB0YXJnZXQpOworICB0YXJnZXQgPSB2YWx1ZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7CisgIHJldHVybiBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVAsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOworICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAorICAgIHZhbHVlLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0KTsKKyAgcmV0dXJuIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKK30KKworLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKKy8vIHBhcmFtZXRlciBuYW1lLgordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBOb1ZpcnR1YWxUb0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlLAorICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfU1RBUlRfR1JPVVAsIHRhcmdldCk7CisgIHRhcmdldCA9IHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QKKyAgICAgIDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOworICByZXR1cm4gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQLCB0YXJnZXQpOworfQordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCisgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOworICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAorICAgIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OkdldENhY2hlZFNpemUoKSwgdGFyZ2V0KTsKKyAgcmV0dXJuIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QKKyAgICAgIDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShpbnQzMiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJTaWduRXh0ZW5kZWQodmFsdWUpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplKGludDY0IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NChzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7Cit9CitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpVSW50MzJTaXplKHVpbnQzMiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodmFsdWUpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6VUludDY0U2l6ZSh1aW50NjQgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0KHZhbHVlKTsKK30KK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OlNJbnQzMlNpemUoaW50MzIgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKFppZ1phZ0VuY29kZTMyKHZhbHVlKSk7Cit9CitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpTSW50NjRTaXplKGludDY0IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NChaaWdaYWdFbmNvZGU2NCh2YWx1ZSkpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUoaW50IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMlNpZ25FeHRlbmRlZCh2YWx1ZSk7Cit9CisKK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodmFsdWUuc2l6ZSgpKSArCisgICAgICAgICB2YWx1ZS5zaXplKCk7Cit9CitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodmFsdWUuc2l6ZSgpKSArCisgICAgICAgICB2YWx1ZS5zaXplKCk7Cit9CisKKworaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6R3JvdXBTaXplKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSkgeworICByZXR1cm4gdmFsdWUuQnl0ZVNpemUoKTsKK30KK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSkgeworICByZXR1cm4gTGVuZ3RoRGVsaW1pdGVkU2l6ZSh2YWx1ZS5CeXRlU2l6ZSgpKTsKK30KKworLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKKy8vIHBhcmFtZXRlciBuYW1lLgordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6Okdyb3VwU2l6ZU5vVmlydHVhbCgKKyAgICBjb25zdCBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0JiB2YWx1ZSkgeworICByZXR1cm4gdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6Qnl0ZVNpemUoKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICBjb25zdCBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0JiB2YWx1ZSkgeworICByZXR1cm4gTGVuZ3RoRGVsaW1pdGVkU2l6ZSgKKyAgICAgIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OkJ5dGVTaXplKCkpOworfQorCitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpMZW5ndGhEZWxpbWl0ZWRTaXplKGludCBsZW5ndGgpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGxlbmd0aCkgKyBsZW5ndGg7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0xJVEVfSU5MX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjI4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw5NzggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworVEVTVChXaXJlRm9ybWF0VGVzdCwgRW51bXNJblN5bmMpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBhbmQgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUgbWF0Y2gKKyAgLy8gRmllbGREZXNjcmlwdG9yOjpUeXBlIGFuZCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUuCisKKyAgRVhQRUNUX0VRKGltcGxpY2l0X2Nhc3Q8aW50PihGaWVsZERlc2NyaXB0b3I6Ok1BWF9UWVBFKSwKKyAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEUpKTsKKyAgRVhQRUNUX0VRKGltcGxpY2l0X2Nhc3Q8aW50PihGaWVsZERlc2NyaXB0b3I6Ok1BWF9DUFBUWVBFKSwKKyAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihXaXJlRm9ybWF0TGl0ZTo6TUFYX0NQUFRZUEUpKTsKKworICBmb3IgKGludCBpID0gMTsgaSA8PSBXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEU7IGkrKykgeworICAgIEVYUEVDVF9FUSgKKyAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihGaWVsZERlc2NyaXB0b3I6OlR5cGVUb0NwcFR5cGUoCisgICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4oaSkpKSwKKyAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlVG9DcHBUeXBlKAorICAgICAgICBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPihpKSkpKTsKKyAgfQorfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBNYXhGaWVsZE51bWJlcikgeworICAvLyBNYWtlIHN1cmUgdGhlIG1heCBmaWVsZCBudW1iZXIgY29uc3RhbnQgaXMgYWNjdXJhdGUuCisgIEVYUEVDVF9FUSgoMSA8PCAoMzIgLSBXaXJlRm9ybWF0TGl0ZTo6a1RhZ1R5cGVCaXRzKSkgLSAxLAorICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBzb3VyY2UsIGRlc3Q7CisgIHN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBzb3VyY2UsIGRlc3Q7CisgIHN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7CisKKyAgLy8gQ2hlY2suCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KGRlc3QpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVBhY2tlZCkgeworICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZSwgZGVzdDsKKyAgc3RyaW5nIGRhdGE7CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmc291cmNlKTsKKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKworICAvLyBQYXJzZSB1c2luZyBXaXJlRm9ybWF0LgorICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmRlc3QpOworCisgIC8vIENoZWNrLgorICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3QpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVBhY2tlZEZyb21VbnBhY2tlZCkgeworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMgc291cmNlOworICBUZXN0VXRpbDo6U2V0VW5wYWNrZWRGaWVsZHMoJnNvdXJjZSk7CisgIHN0cmluZyBkYXRhID0gc291cmNlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBkZXN0OworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmRlc3QpOworCisgIC8vIENoZWNrLgorICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3QpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVVucGFja2VkRnJvbVBhY2tlZCkgeworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmc291cmNlKTsKKyAgc3RyaW5nIGRhdGEgPSBzb3VyY2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICAvLyBQYXJzZSB1c2luZyBXaXJlRm9ybWF0LgorICB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMgZGVzdDsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdFVucGFja2VkRmllbGRzU2V0KGRlc3QpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVBhY2tlZEV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIHNvdXJjZSwgZGVzdDsKKyAgc3RyaW5nIGRhdGE7CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoZGVzdCk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIEJ5dGVTaXplKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemUoKSwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplKCkpOworICBFWFBFQ1RfRVEoMCwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBCeXRlU2l6ZUV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5CeXRlU2l6ZSgpLAorICAgICAgICAgICAgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplKCkpOworICBFWFBFQ1RfRVEoMCwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBCeXRlU2l6ZVBhY2tlZCkgeworICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJm1lc3NhZ2UpOworCisgIEVYUEVDVF9FUShtZXNzYWdlLkJ5dGVTaXplKCksIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgQnl0ZVNpemVQYWNrZWRFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemUoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgc3RyaW5nIGdlbmVyYXRlZF9kYXRhOworICBzdHJpbmcgZHluYW1pY19kYXRhOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBpbnQgc2l6ZSA9IG1lc3NhZ2UuQnl0ZVNpemUoKTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZnZW5lcmF0ZWRfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB1c2luZyBXaXJlRm9ybWF0LgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZkeW5hbWljX2RhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhtZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2hvdWxkIGJlIHRoZSBzYW1lLgorICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGhlcmUgYmVjYXVzZSB3ZSdyZSBjb21wYXJpbmcgcmF3IGJpbmFyeSBkYXRhIGFuZAorICAvLyB3ZSByZWFsbHkgZG9uJ3Qgd2FudCBpdCBkdW1wZWQgdG8gc3Rkb3V0IG9uIGZhaWx1cmUuCisgIEVYUEVDVF9UUlVFKGR5bmFtaWNfZGF0YSA9PSBnZW5lcmF0ZWRfZGF0YSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZUV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIHN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKKyAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIGludCBzaXplID0gbWVzc2FnZS5CeXRlU2l6ZSgpOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgIH0KKworICAvLyBTaG91bGQgYmUgdGhlIHNhbWUuCisgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgaGVyZSBiZWNhdXNlIHdlJ3JlIGNvbXBhcmluZyByYXcgYmluYXJ5IGRhdGEgYW5kCisgIC8vIHdlIHJlYWxseSBkb24ndCB3YW50IGl0IGR1bXBlZCB0byBzdGRvdXQgb24gZmFpbHVyZS4KKyAgRVhQRUNUX1RSVUUoZHluYW1pY19kYXRhID09IGdlbmVyYXRlZF9kYXRhKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplRmllbGRzQW5kRXh0ZW5zaW9ucykgeworICB1bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIG1lc3NhZ2U7CisgIHN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKKyAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIGludCBzaXplID0gbWVzc2FnZS5CeXRlU2l6ZSgpOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgIH0KKworICAvLyBTaG91bGQgYmUgdGhlIHNhbWUuCisgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgaGVyZSBiZWNhdXNlIHdlJ3JlIGNvbXBhcmluZyByYXcgYmluYXJ5IGRhdGEgYW5kCisgIC8vIHdlIHJlYWxseSBkb24ndCB3YW50IGl0IGR1bXBlZCB0byBzdGRvdXQgb24gZmFpbHVyZS4KKyAgRVhQRUNUX1RSVUUoZHluYW1pY19kYXRhID09IGdlbmVyYXRlZF9kYXRhKTsKKworICAvLyBTaG91bGQgb3V0cHV0IGluIGNhbm9uaWNhbCBvcmRlci4KKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKGR5bmFtaWNfZGF0YSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihnZW5lcmF0ZWRfZGF0YSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlTXVsdGlwbGVFeHRlbnNpb25SYW5nZXMpIHsKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBwYXJzZSBhIG1lc3NhZ2UgdGhhdCBjb250YWlucyBtdWx0aXBsZSBleHRlbnNpb25zIHJhbmdlcy4KKyAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBzb3VyY2U7CisgIHN0cmluZyBkYXRhOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIGRlc3Q7CisgICAgRVhQRUNUX1RSVUUoZGVzdC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShzb3VyY2UuRGVidWdTdHJpbmcoKSwgZGVzdC5EZWJ1Z1N0cmluZygpKTsKKyAgfQorCisgIC8vIEFsc28gdGVzdCB1c2luZyByZWZsZWN0aW9uLWJhc2VkIHBhcnNpbmcuCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIGRlc3Q7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJnJhd19pbnB1dCk7CisgICAgRVhQRUNUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmNvZGVkX2lucHV0LCAmZGVzdCkpOworICAgIEVYUEVDVF9FUShzb3VyY2UuRGVidWdTdHJpbmcoKSwgZGVzdC5EZWJ1Z1N0cmluZygpKTsKKyAgfQorfQorCitjb25zdCBpbnQga1Vua25vd25UeXBlSWQgPSAxNTUwMDU1OworCitURVNUKFdpcmVGb3JtYXRUZXN0LCBTZXJpYWxpemVNZXNzYWdlU2V0KSB7CisgIC8vIFNldCB1cCBhIFRlc3RNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZS4KKyAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKAorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiktPnNldF9pKDEyMyk7CisgIG1lc3NhZ2Vfc2V0Lk11dGFibGVFeHRlbnNpb24oCisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS0+c2V0X3N0cigiZm9vIik7CisgIG1lc3NhZ2Vfc2V0Lm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkTGVuZ3RoRGVsaW1pdGVkKAorICAgIGtVbmtub3duVHlwZUlkLCAiYmFyIik7CisKKyAgc3RyaW5nIGRhdGE7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2Vfc2V0LlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKSk7CisKKyAgLy8gUGFyc2UgYmFjayB1c2luZyBSYXdNZXNzYWdlU2V0IGFuZCBjaGVjayB0aGUgY29udGVudHMuCisgIHVuaXR0ZXN0OjpSYXdNZXNzYWdlU2V0IHJhdzsKKyAgQVNTRVJUX1RSVUUocmF3LlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisKKyAgRVhQRUNUX0VRKDAsIHJhdy51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworCisgIEFTU0VSVF9FUSgzLCByYXcuaXRlbV9zaXplKCkpOworICBFWFBFQ1RfRVEoCisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6ZGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpLAorICAgIHJhdy5pdGVtKDApLnR5cGVfaWQoKSk7CisgIEVYUEVDVF9FUSgKKyAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yOjpkZXNjcmlwdG9yKCktPmV4dGVuc2lvbigwKS0+bnVtYmVyKCksCisgICAgcmF3Lml0ZW0oMSkudHlwZV9pZCgpKTsKKyAgRVhQRUNUX0VRKGtVbmtub3duVHlwZUlkLCByYXcuaXRlbSgyKS50eXBlX2lkKCkpOworCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgbWVzc2FnZTE7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLlBhcnNlRnJvbVN0cmluZyhyYXcuaXRlbSgwKS5tZXNzYWdlKCkpKTsKKyAgRVhQRUNUX0VRKDEyMywgbWVzc2FnZTEuaSgpKTsKKworICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2UyOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcocmF3Lml0ZW0oMSkubWVzc2FnZSgpKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgbWVzc2FnZTIuc3RyKCkpOworCisgIEVYUEVDVF9FUSgiYmFyIiwgcmF3Lml0ZW0oMikubWVzc2FnZSgpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplTWVzc2FnZVNldFZhcmlvdXNXYXlzQXJlRXF1YWwpIHsKKyAgLy8gU2VyaWFsaXplIGEgTWVzc2FnZVNldCB0byBhIHN0cmVhbSBhbmQgdG8gYSBmbGF0IGFycmF5IHVzaW5nIGdlbmVyYXRlZAorICAvLyBjb2RlLCBhbmQgYWxzbyB1c2luZyBXaXJlRm9ybWF0LCBhbmQgY2hlY2sgdGhhdCB0aGUgcmVzdWx0cyBhcmUgZXF1YWwuCisgIC8vIFNldCB1cCBhIFRlc3RNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZSwgYXMKKyAgLy8gYWJvdmUuCisKKyAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKAorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiktPnNldF9pKDEyMyk7CisgIG1lc3NhZ2Vfc2V0Lk11dGFibGVFeHRlbnNpb24oCisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS0+c2V0X3N0cigiZm9vIik7CisgIG1lc3NhZ2Vfc2V0Lm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkTGVuZ3RoRGVsaW1pdGVkKAorICAgIGtVbmtub3duVHlwZUlkLCAiYmFyIik7CisKKyAgaW50IHNpemUgPSBtZXNzYWdlX3NldC5CeXRlU2l6ZSgpOworICBFWFBFQ1RfRVEoc2l6ZSwgbWVzc2FnZV9zZXQuR2V0Q2FjaGVkU2l6ZSgpKTsKKyAgQVNTRVJUX0VRKHNpemUsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2Vfc2V0KSk7CisKKyAgc3RyaW5nIGZsYXRfZGF0YTsKKyAgc3RyaW5nIHN0cmVhbV9kYXRhOworICBzdHJpbmcgZHluYW1pY19kYXRhOworICBmbGF0X2RhdGEucmVzaXplKHNpemUpOworICBzdHJlYW1fZGF0YS5yZXNpemUoc2l6ZSk7CisKKyAgLy8gU2VyaWFsaXplIHRvIGZsYXQgYXJyYXkKKyAgeworICAgIHVpbnQ4KiB0YXJnZXQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZmbGF0X2RhdGEpKTsKKyAgICB1aW50OCogZW5kID0gbWVzc2FnZV9zZXQuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOworICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSB0YXJnZXQpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHRvIGJ1ZmZlcgorICB7CisgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJnN0cmVhbV9kYXRhKSwgc2l6ZSwgMSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgbWVzc2FnZV9zZXQuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB0byBidWZmZXIgd2l0aCBXaXJlRm9ybWF0LgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBzdHJpbmdfc3RyZWFtKCZkeW5hbWljX2RhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZzdHJpbmdfc3RyZWFtKTsKKyAgICBXaXJlRm9ybWF0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMobWVzc2FnZV9zZXQsIHNpemUsICZvdXRwdXRfc3RyZWFtKTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgfQorCisgIEVYUEVDVF9UUlVFKGZsYXRfZGF0YSA9PSBzdHJlYW1fZGF0YSk7CisgIEVYUEVDVF9UUlVFKGZsYXRfZGF0YSA9PSBkeW5hbWljX2RhdGEpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU1lc3NhZ2VTZXQpIHsKKyAgLy8gU2V0IHVwIGEgUmF3TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCisgIHVuaXR0ZXN0OjpSYXdNZXNzYWdlU2V0IHJhdzsKKworICB7CisgICAgdW5pdHRlc3Q6OlJhd01lc3NhZ2VTZXQ6Okl0ZW0qIGl0ZW0gPSByYXcuYWRkX2l0ZW0oKTsKKyAgICBpdGVtLT5zZXRfdHlwZV9pZCgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6OmRlc2NyaXB0b3IoKS0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSk7CisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlOworICAgIG1lc3NhZ2Uuc2V0X2koMTIzKTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKGl0ZW0tPm11dGFibGVfbWVzc2FnZSgpKTsKKyAgfQorCisgIHsKKyAgICB1bml0dGVzdDo6UmF3TWVzc2FnZVNldDo6SXRlbSogaXRlbSA9IHJhdy5hZGRfaXRlbSgpOworICAgIGl0ZW0tPnNldF90eXBlX2lkKAorICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6ZGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpKTsKKyAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2U7CisgICAgbWVzc2FnZS5zZXRfc3RyKCJmb28iKTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKGl0ZW0tPm11dGFibGVfbWVzc2FnZSgpKTsKKyAgfQorCisgIHsKKyAgICB1bml0dGVzdDo6UmF3TWVzc2FnZVNldDo6SXRlbSogaXRlbSA9IHJhdy5hZGRfaXRlbSgpOworICAgIGl0ZW0tPnNldF90eXBlX2lkKGtVbmtub3duVHlwZUlkKTsKKyAgICBpdGVtLT5zZXRfbWVzc2FnZSgiYmFyIik7CisgIH0KKworICBzdHJpbmcgZGF0YTsKKyAgQVNTRVJUX1RSVUUocmF3LlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKSk7CisKKyAgLy8gUGFyc2UgYXMgYSBUZXN0TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLgorICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2Vfc2V0LlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisKKyAgRVhQRUNUX0VRKDEyMywgbWVzc2FnZV9zZXQuR2V0RXh0ZW5zaW9uKAorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikuaSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBtZXNzYWdlX3NldC5HZXRFeHRlbnNpb24oCisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5zdHIoKSk7CisKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2Vfc2V0LnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgICAgICAgIG1lc3NhZ2Vfc2V0LnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCBtZXNzYWdlX3NldC51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLmxlbmd0aF9kZWxpbWl0ZWQoKSk7CisKKyAgLy8gQWxzbyBwYXJzZSB1c2luZyBXaXJlRm9ybWF0LgorICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgZHluYW1pY19tZXNzYWdlX3NldDsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zaXplKCkpOworICBBU1NFUlRfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkeW5hbWljX21lc3NhZ2Vfc2V0KSk7CisgIEVYUEVDVF9FUShtZXNzYWdlX3NldC5EZWJ1Z1N0cmluZygpLCBkeW5hbWljX21lc3NhZ2Vfc2V0LkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU1lc3NhZ2VTZXRXaXRoUmV2ZXJzZVRhZ09yZGVyKSB7CisgIHN0cmluZyBkYXRhOworICB7CisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlOworICAgIG1lc3NhZ2Uuc2V0X2koMTIzKTsKKyAgICAvLyBCdWlsZCBhIE1lc3NhZ2VTZXQgbWFudWFsbHkgd2l0aCBpdHMgbWVzc2FnZSBjb250ZW50IHB1dCBiZWZvcmUgaXRzCisgICAgLy8gdHlwZV9pZC4KKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmRhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dF9zdHJlYW0pOworICAgIGNvZGVkX291dHB1dC5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcpOworICAgIC8vIFdyaXRlIHRoZSBtZXNzYWdlIGNvbnRlbnQgZmlyc3QuCisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWRfb3V0cHV0KTsKKyAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMihtZXNzYWdlLkJ5dGVTaXplKCkpOworICAgIG1lc3NhZ2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZjb2RlZF9vdXRwdXQpOworICAgIC8vIFdyaXRlIHRoZSB0eXBlIGlkLgorICAgIHVpbnQzMiB0eXBlX2lkID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPmV4dGVuc2lvbigwKS0+bnVtYmVyKCk7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9pZCwgJmNvZGVkX291dHB1dCk7CisgICAgY29kZWRfb3V0cHV0LldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcpOworICB9CisgIHsKKyAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CisgICAgQVNTRVJUX1RSVUUobWVzc2FnZV9zZXQuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKworICAgIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2Vfc2V0LkdldEV4dGVuc2lvbigKKyAgICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5pKCkpOworICB9CisgIHsKKyAgICAvLyBUZXN0IHBhcnNlIHRoZSBtZXNzYWdlIHZpYSBSZWZsZWN0aW9uLgorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEuZGF0YSgpKSwgZGF0YS5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJm1lc3NhZ2Vfc2V0KSk7CisgICAgRVhQRUNUX1RSVUUoaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOworCisgICAgRVhQRUNUX0VRKDEyMywgbWVzc2FnZV9zZXQuR2V0RXh0ZW5zaW9uKAorICAgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLmkoKSk7CisgIH0KK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VCcm9rZW5NZXNzYWdlU2V0KSB7CisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgc3RyaW5nIGlucHV0KCJnb29kYnllIik7ICAvLyBJbnZhbGlkIHdpcmUgZm9ybWF0IGRhdGEuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlX3NldC5QYXJzZUZyb21TdHJpbmcoaW5wdXQpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUmVjdXJzaW9uTGltaXQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9hKCktPm11dGFibGVfYSgpLT5tdXRhYmxlX2EoKS0+bXV0YWJsZV9hKCktPnNldF9pKDEpOworICBzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgeworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICAgIGlucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDQpOworICAgIHVuaXR0ZXN0OjpUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlMjsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgfQorCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCgzKTsKKyAgICB1bml0dGVzdDo6VGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgbWVzc2FnZTI7CisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworICB9Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFVua25vd25GaWVsZFJlY3Vyc2lvbkxpbWl0KSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAgIC0+QWRkR3JvdXAoMTIzNCkKKyAgICAgICAgLT5BZGRHcm91cCgxMjM0KQorICAgICAgICAtPkFkZEdyb3VwKDEyMzQpCisgICAgICAgIC0+QWRkR3JvdXAoMTIzNCkKKyAgICAgICAgLT5BZGRWYXJpbnQoMTIzNCwgMTIzKTsKKyAgc3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCg0KTsKKyAgICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlMjsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgfQorCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCgzKTsKKyAgICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlMjsKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZTIuUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7CisgIH0KK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgWmlnWmFnKSB7CisvLyBhdm9pZCBsaW5lLXdyYXBwaW5nCisjZGVmaW5lIExMKHgpIEdPT0dMRV9MT05HTE9ORyh4KQorI2RlZmluZSBVTEwoeCkgR09PR0xFX1VMT05HTE9ORyh4KQorI2RlZmluZSBaaWdaYWdFbmNvZGUzMih4KSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIoeCkKKyNkZWZpbmUgWmlnWmFnRGVjb2RlMzIoeCkgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKHgpCisjZGVmaW5lIFppZ1phZ0VuY29kZTY0KHgpIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdFbmNvZGU2NCh4KQorI2RlZmluZSBaaWdaYWdEZWNvZGU2NCh4KSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlNjQoeCkKKworICBFWFBFQ1RfRVEoMHUsIFppZ1phZ0VuY29kZTMyKCAwKSk7CisgIEVYUEVDVF9FUSgxdSwgWmlnWmFnRW5jb2RlMzIoLTEpKTsKKyAgRVhQRUNUX0VRKDJ1LCBaaWdaYWdFbmNvZGUzMiggMSkpOworICBFWFBFQ1RfRVEoM3UsIFppZ1phZ0VuY29kZTMyKC0yKSk7CisgIEVYUEVDVF9FUSgweDdGRkZGRkZFdSwgWmlnWmFnRW5jb2RlMzIoMHgzRkZGRkZGRikpOworICBFWFBFQ1RfRVEoMHg3RkZGRkZGRnUsIFppZ1phZ0VuY29kZTMyKDB4QzAwMDAwMDApKTsKKyAgRVhQRUNUX0VRKDB4RkZGRkZGRkV1LCBaaWdaYWdFbmNvZGUzMigweDdGRkZGRkZGKSk7CisgIEVYUEVDVF9FUSgweEZGRkZGRkZGdSwgWmlnWmFnRW5jb2RlMzIoMHg4MDAwMDAwMCkpOworCisgIEVYUEVDVF9FUSggMCwgWmlnWmFnRGVjb2RlMzIoMHUpKTsKKyAgRVhQRUNUX0VRKC0xLCBaaWdaYWdEZWNvZGUzMigxdSkpOworICBFWFBFQ1RfRVEoIDEsIFppZ1phZ0RlY29kZTMyKDJ1KSk7CisgIEVYUEVDVF9FUSgtMiwgWmlnWmFnRGVjb2RlMzIoM3UpKTsKKyAgRVhQRUNUX0VRKDB4M0ZGRkZGRkYsIFppZ1phZ0RlY29kZTMyKDB4N0ZGRkZGRkV1KSk7CisgIEVYUEVDVF9FUSgweEMwMDAwMDAwLCBaaWdaYWdEZWNvZGUzMigweDdGRkZGRkZGdSkpOworICBFWFBFQ1RfRVEoMHg3RkZGRkZGRiwgWmlnWmFnRGVjb2RlMzIoMHhGRkZGRkZGRXUpKTsKKyAgRVhQRUNUX0VRKDB4ODAwMDAwMDAsIFppZ1phZ0RlY29kZTMyKDB4RkZGRkZGRkZ1KSk7CisKKyAgRVhQRUNUX0VRKDB1LCBaaWdaYWdFbmNvZGU2NCggMCkpOworICBFWFBFQ1RfRVEoMXUsIFppZ1phZ0VuY29kZTY0KC0xKSk7CisgIEVYUEVDVF9FUSgydSwgWmlnWmFnRW5jb2RlNjQoIDEpKTsKKyAgRVhQRUNUX0VRKDN1LCBaaWdaYWdFbmNvZGU2NCgtMikpOworICBFWFBFQ1RfRVEoVUxMKDB4MDAwMDAwMDA3RkZGRkZGRSksIFppZ1phZ0VuY29kZTY0KExMKDB4MDAwMDAwMDAzRkZGRkZGRikpKTsKKyAgRVhQRUNUX0VRKFVMTCgweDAwMDAwMDAwN0ZGRkZGRkYpLCBaaWdaYWdFbmNvZGU2NChMTCgweEZGRkZGRkZGQzAwMDAwMDApKSk7CisgIEVYUEVDVF9FUShVTEwoMHgwMDAwMDAwMEZGRkZGRkZFKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSkpOworICBFWFBFQ1RfRVEoVUxMKDB4MDAwMDAwMDBGRkZGRkZGRiksIFppZ1phZ0VuY29kZTY0KExMKDB4RkZGRkZGRkY4MDAwMDAwMCkpKTsKKyAgRVhQRUNUX0VRKFVMTCgweEZGRkZGRkZGRkZGRkZGRkUpLCBaaWdaYWdFbmNvZGU2NChMTCgweDdGRkZGRkZGRkZGRkZGRkYpKSk7CisgIEVYUEVDVF9FUShVTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHg4MDAwMDAwMDAwMDAwMDAwKSkpOworCisgIEVYUEVDVF9FUSggMCwgWmlnWmFnRGVjb2RlNjQoMHUpKTsKKyAgRVhQRUNUX0VRKC0xLCBaaWdaYWdEZWNvZGU2NCgxdSkpOworICBFWFBFQ1RfRVEoIDEsIFppZ1phZ0RlY29kZTY0KDJ1KSk7CisgIEVYUEVDVF9FUSgtMiwgWmlnWmFnRGVjb2RlNjQoM3UpKTsKKyAgRVhQRUNUX0VRKExMKDB4MDAwMDAwMDAzRkZGRkZGRiksIFppZ1phZ0RlY29kZTY0KFVMTCgweDAwMDAwMDAwN0ZGRkZGRkUpKSk7CisgIEVYUEVDVF9FUShMTCgweEZGRkZGRkZGQzAwMDAwMDApLCBaaWdaYWdEZWNvZGU2NChVTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSkpOworICBFWFBFQ1RfRVEoTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4MDAwMDAwMDBGRkZGRkZGRSkpKTsKKyAgRVhQRUNUX0VRKExMKDB4RkZGRkZGRkY4MDAwMDAwMCksIFppZ1phZ0RlY29kZTY0KFVMTCgweDAwMDAwMDAwRkZGRkZGRkYpKSk7CisgIEVYUEVDVF9FUShMTCgweDdGRkZGRkZGRkZGRkZGRkYpLCBaaWdaYWdEZWNvZGU2NChVTEwoMHhGRkZGRkZGRkZGRkZGRkZFKSkpOworICBFWFBFQ1RfRVEoTEwoMHg4MDAwMDAwMDAwMDAwMDAwKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpKTsKKworICAvLyBTb21lIGVhc2llci10by12ZXJpZnkgcm91bmQtdHJpcCB0ZXN0cy4gIFRoZSBpbnB1dHMgKG90aGVyIHRoYW4gMCwgMSwgLTEpCisgIC8vIHdlcmUgY2hvc2VuIHNlbWktcmFuZG9tbHkgdmlhIGtleWJvYXJkIGJhc2hpbmcuCisgIEVYUEVDVF9FUSggICAgMCwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoICAgIDApKSk7CisgIEVYUEVDVF9FUSggICAgMSwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoICAgIDEpKSk7CisgIEVYUEVDVF9FUSggICAtMSwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoICAgLTEpKSk7CisgIEVYUEVDVF9FUSgxNDkyNywgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoMTQ5MjcpKSk7CisgIEVYUEVDVF9FUSgtMzYxMiwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoLTM2MTIpKSk7CisKKyAgRVhQRUNUX0VRKCAgICAwLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCggICAgMCkpKTsKKyAgRVhQRUNUX0VRKCAgICAxLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCggICAgMSkpKTsKKyAgRVhQRUNUX0VRKCAgIC0xLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCggICAtMSkpKTsKKyAgRVhQRUNUX0VRKDE0OTI3LCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgxNDkyNykpKTsKKyAgRVhQRUNUX0VRKC0zNjEyLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgtMzYxMikpKTsKKworICBFWFBFQ1RfRVEoTEwoODU2OTEyMzA0ODAxNDE2KSwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoCisgICAgICAgICAgICBMTCg4NTY5MTIzMDQ4MDE0MTYpKSkpOworICBFWFBFQ1RfRVEoTEwoLTc1MTIzOTA1NDM5NTcxMjU2KSwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoCisgICAgICAgICAgICBMTCgtNzUxMjM5MDU0Mzk1NzEyNTYpKSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBSZXBlYXRlZFNjYWxhcnNEaWZmZXJlbnRUYWdTaXplcykgeworICAvLyBBdCBvbmUgcG9pbnQgY2hlY2tzIHdvdWxkIHRyaWdnZXIgd2hlbiBwYXJzaW5nIHJlcGVhdGVkIGZpeGVkIHNjYWxhcgorICAvLyBmaWVsZHMuCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBtc2cxLCBtc2cyOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgbXNnMS5hZGRfcmVwZWF0ZWRfZml4ZWQzMihpKTsKKyAgICBtc2cxLmFkZF9yZXBlYXRlZF9pbnQzMihpKTsKKyAgICBtc2cxLmFkZF9yZXBlYXRlZF9maXhlZDY0KGkpOworICAgIG1zZzEuYWRkX3JlcGVhdGVkX2ludDY0KGkpOworICAgIG1zZzEuYWRkX3JlcGVhdGVkX2Zsb2F0KGkpOworICAgIG1zZzEuYWRkX3JlcGVhdGVkX3VpbnQ2NChpKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB2YXJpZXR5IG9mIHRhZyBzaXplcy4KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzYyA9IG1zZzEuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkOworICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZml4ZWQzMiIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDEsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDEsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9maXhlZDY0Iik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworICBBU1NFUlRfRVEoMiwgV2lyZUZvcm1hdDo6VGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpKTsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDY0Iik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworICBBU1NFUlRfRVEoMiwgV2lyZUZvcm1hdDo6VGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpKTsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2Zsb2F0Iik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworICBBU1NFUlRfRVEoMywgV2lyZUZvcm1hdDo6VGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpKTsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX3VpbnQ2NCIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDMsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisKKyAgRVhQRUNUX1RSVUUobXNnMi5QYXJzZUZyb21TdHJpbmcobXNnMS5TZXJpYWxpemVBc1N0cmluZygpKSk7CisgIEVYUEVDVF9FUShtc2cxLkRlYnVnU3RyaW5nKCksIG1zZzIuRGVidWdTdHJpbmcoKSk7Cit9CisKK2NsYXNzIFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gTWFrZSBhIHNlcmlhbGl6ZWQgVGVzdEFsbFR5cGVzIGluIHdoaWNoIHRoZSBmaWVsZCBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQorICAvLyBjb250YWlucyBleGFjdGx5IHRoZSBnaXZlbiBieXRlcywgd2hpY2ggbWF5IGJlIGludmFsaWQuCisgIHN0cmluZyBNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZShjb25zdCBjaGFyKiBieXRlcywgaW50IHNpemUpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKAorICAgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgICBHT09HTEVfQ0hFQ0soZmllbGQgIT0gTlVMTCk7CisKKyAgICBzdHJpbmcgcmVzdWx0OworCisgICAgeworICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZyZXN1bHQpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKGZpZWxkLT5udW1iZXIoKSwgc3RyaW5nKGJ5dGVzLCBzaXplKSwgJm91dHB1dCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIE1ha2UgYSBzZXJpYWxpemVkIFRlc3RBbGxUeXBlcyBpbiB3aGljaCB0aGUgZmllbGQgb3B0aW9uYWxncm91cAorICAvLyBjb250YWlucyBleGFjdGx5IHRoZSBnaXZlbiBieXRlcyAtLSB3aGljaCBtYXkgYmUgaW52YWxpZCAtLSBhbmQKKyAgLy8gcG9zc2libHkgbm8gZW5kIHRhZy4KKyAgc3RyaW5nIE1ha2VJbnZhbGlkR3JvdXAoY29uc3QgY2hhciogYnl0ZXMsIGludCBzaXplLCBib29sIGluY2x1ZGVfZW5kX3RhZykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICJvcHRpb25hbGdyb3VwIik7CisgICAgR09PR0xFX0NIRUNLKGZpZWxkICE9IE5VTEwpOworCisgICAgc3RyaW5nIHJlc3VsdDsKKworICAgIHsKKyAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmcmVzdWx0KTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworCisgICAgICBvdXRwdXQuV3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0OjpNYWtlVGFnKGZpZWxkKSk7CisgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoc3RyaW5nKGJ5dGVzLCBzaXplKSk7CisgICAgICBpZiAoaW5jbHVkZV9lbmRfdGFnKSB7CisgICAgICAgIG91dHB1dC5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKK1RFU1RfRihXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCwgSW52YWxpZFN1Yk1lc3NhZ2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIC8vIENvbnRyb2wgY2FzZS4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRFbWJlZGRlZE1lc3NhZ2UoIiIsIDApKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQsIGJ1dCBub3QgYSB2YWxpZCB0YWcgKHplcm8pLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRFbWJlZGRlZE1lc3NhZ2UoIlwwIiwgMSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIG1hbGZvcm1lZCB2YXJpbnQuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZSgiXDIwMCIsIDEpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYW4gZW5kZ3JvdXAgdGFnLCBidXQgd2UgYXJlbid0IHBhcnNpbmcgYSBncm91cC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCJcMDE0IiwgMSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCBidXQgbm90IGEgdmFsaWQgdGFnIChiYWQgd2lyZSB0eXBlKS4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCJcMDE3IiwgMSkpKTsKK30KKworVEVTVF9GKFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0LCBJbnZhbGlkR3JvdXApIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIC8vIENvbnRyb2wgY2FzZS4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiIiwgMCwgdHJ1ZSkpKTsKKworICAvLyBNaXNzaW5nIGVuZCB0YWcuICBHcm91cHMgY2Fubm90IGVuZCBhdCBFT0YuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCIiLCAwLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCwgYnV0IG5vdCBhIHZhbGlkIHRhZyAoemVybykuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMCIsIDEsIGZhbHNlKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGEgbWFsZm9ybWVkIHZhcmludC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwyMDAiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhbiBlbmRncm91cCB0YWcsIGJ1dCBub3QgdGhlIHJpZ2h0IG9uZSBmb3IgdGhpcyBncm91cC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwMTQiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCBidXQgbm90IGEgdmFsaWQgdGFnIChiYWQgd2lyZSB0eXBlKS4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwMTciLCAxLCB0cnVlKSkpOworfQorCitURVNUX0YoV2lyZUZvcm1hdEludmFsaWRJbnB1dFRlc3QsIEludmFsaWRVbmtub3duR3JvdXApIHsKKyAgLy8gVXNlIFRlc3RFbXB0eU1lc3NhZ2Ugc28gdGhhdCB0aGUgZ3JvdXAgbWFkZSBieSBNYWtlSW52YWxpZEdyb3VwIHdpbGwgbm90CisgIC8vIGJlIGEga25vd24gdGFnIG51bWJlci4KKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTsKKworICAvLyBDb250cm9sIGNhc2UuCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIiIsIDAsIHRydWUpKSk7CisKKyAgLy8gTWlzc2luZyBlbmQgdGFnLiAgR3JvdXBzIGNhbm5vdCBlbmQgYXQgRU9GLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiIiwgMCwgZmFsc2UpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQsIGJ1dCBub3QgYSB2YWxpZCB0YWcgKHplcm8pLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDAiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIG1hbGZvcm1lZCB2YXJpbnQuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMjAwIiwgMSwgZmFsc2UpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYW4gZW5kZ3JvdXAgdGFnLCBidXQgbm90IHRoZSByaWdodCBvbmUgZm9yIHRoaXMgZ3JvdXAuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMDE0IiwgMSwgZmFsc2UpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQgYnV0IG5vdCBhIHZhbGlkIHRhZyAoYmFkIHdpcmUgdHlwZSkuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMDE3IiwgMSwgdHJ1ZSkpKTsKK30KKworVEVTVF9GKFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0LCBJbnZhbGlkU3RyaW5nSW5Vbmtub3duR3JvdXApIHsKKyAgLy8gVGVzdCBhIGJ1ZyBmaXg6ICBTa2lwTWVzc2FnZSBzaG91bGQgZmFpbCBpZiB0aGUgbWVzc2FnZSBjb250YWlucyBhIHN0cmluZworICAvLyB3aG9zZSBsZW5ndGggd291bGQgZXh0ZW5kIGJleW9uZCB0aGUgbWVzc2FnZSBlbmQuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9zdHJpbmcoImZvbyBmb28gZm9vIGZvbyIpOworICBzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gQ2hvcCBzb21lIGJ5dGVzIG9mZiB0aGUgZW5kLgorICBkYXRhLnJlc2l6ZShkYXRhLnNpemUoKSAtIDQpOworCisgIC8vIFRyeSB0byBza2lwIGl0LiAgTm90ZSB0aGF0IHRoZSBidWcgd2FzIG9ubHkgcHJlc2VudCB3aGVuIHBhcnNpbmcgdG8gYW4KKyAgLy8gVW5rbm93bkZpZWxkU2V0LgorICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJnJhd19pbnB1dCk7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duX2ZpZWxkczsKKyAgRVhQRUNUX0ZBTFNFKFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKCZjb2RlZF9pbnB1dCwgJnVua25vd25fZmllbGRzKSk7Cit9CisKKy8vIFRlc3QgZGlmZmVyZW5jZXMgYmV0d2VlbiBzdHJpbmcgYW5kIGJ5dGVzLgorLy8gVmFsdWUgb2YgYSBzdHJpbmcgdHlwZSBtdXN0IGJlIHZhbGlkIFVURi04IHN0cmluZy4gIFdoZW4gVVRGLTgKKy8vIHZhbGlkYXRpb24gaXMgZW5hYmxlZCAoR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVEKToKKy8vIFdyaXRlSW52YWxpZFVURjhTdHJpbmc6ICBzZWUgZXJyb3IgbWVzc2FnZS4KKy8vIFJlYWRJbnZhbGlkVVRGOFN0cmluZzogIHNlZSBlcnJvciBtZXNzYWdlLgorLy8gV3JpdGVWYWxpZFVURjhTdHJpbmc6IGZpbmUuCisvLyBSZWFkVmFsaWRVVEY4U3RyaW5nOiAgZmluZS4KKy8vIFdyaXRlQW55Qnl0ZXM6IGZpbmUuCisvLyBSZWFkQW55Qnl0ZXM6IGZpbmUuCitjb25zdCBjaGFyICoga0ludmFsaWRVVEY4U3RyaW5nID0gIkludmFsaWQgVVRGLTg6IFx4QTBceEIwXHhDMFx4RDAiOworLy8gVGhpcyB1c2VkIHRvIGJlICJWYWxpZCBVVEYtODogXHgwMVx4MDJcdThDMzdcdTZCNEMiLCBidXQgTVNWQyBzZWVtcyB0bworLy8gaW50ZXJwcmV0IFx1IGRpZmZlcmVudGx5IGZyb20gR0NDLgorY29uc3QgY2hhciAqIGtWYWxpZFVURjhTdHJpbmcgPSAiVmFsaWQgVVRGLTg6IFx4MDFceDAyXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0IjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgV3JpdGVNZXNzYWdlKGNvbnN0IGNoYXIgKnZhbHVlLCBUICptZXNzYWdlLCBzdHJpbmcgKndpcmVfYnVmZmVyKSB7CisgIG1lc3NhZ2UtPnNldF9kYXRhKHZhbHVlKTsKKyAgd2lyZV9idWZmZXItPmNsZWFyKCk7CisgIG1lc3NhZ2UtPkFwcGVuZFRvU3RyaW5nKHdpcmVfYnVmZmVyKTsKKyAgcmV0dXJuICh3aXJlX2J1ZmZlci0+c2l6ZSgpID4gMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIFJlYWRNZXNzYWdlKGNvbnN0IHN0cmluZyAmd2lyZV9idWZmZXIsIFQgKm1lc3NhZ2UpIHsKKyAgcmV0dXJuIG1lc3NhZ2UtPlBhcnNlRnJvbUFycmF5KHdpcmVfYnVmZmVyLmRhdGEoKSwgd2lyZV9idWZmZXIuc2l6ZSgpKTsKK30KKworYm9vbCBTdGFydHNXaXRoKGNvbnN0IHN0cmluZyYgcywgY29uc3Qgc3RyaW5nJiBwcmVmaXgpIHsKKyAgcmV0dXJuIHMuc3Vic3RyKDAsIHByZWZpeC5sZW5ndGgoKSkgPT0gcHJlZml4OworfQorCitURVNUKFV0ZjhWYWxpZGF0aW9uVGVzdCwgV3JpdGVJbnZhbGlkVVRGOFN0cmluZykgeworICBzdHJpbmcgd2lyZV9idWZmZXI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgaW5wdXQ7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgV3JpdGVNZXNzYWdlKGtJbnZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfVFJVRShTdGFydHNXaXRoKGVycm9yc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGZpZWxkIGNvbnRhaW5zIGludmFsaWQgVVRGLTggZGF0YSB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2VyaWFsaXppbmcgYSBwcm90b2NvbCBidWZmZXIuIFVzZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICInYnl0ZXMnIHR5cGUgaWYgeW91IGludGVuZCB0byBzZW5kIHJhdyBieXRlcy4iKSk7CisjZWxzZQorICBBU1NFUlRfRVEoMCwgZXJyb3JzLnNpemUoKSk7CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRAorfQorCitURVNUKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZEludmFsaWRVVEY4U3RyaW5nKSB7CisgIHN0cmluZyB3aXJlX2J1ZmZlcjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBpbnB1dDsKKyAgV3JpdGVNZXNzYWdlKGtJbnZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOworICBwcm90b2J1Zl91bml0dGVzdDo6T25lU3RyaW5nIG91dHB1dDsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBSZWFkTWVzc2FnZSh3aXJlX2J1ZmZlciwgJm91dHB1dCk7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRAorICBBU1NFUlRfRVEoMSwgZXJyb3JzLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKFN0YXJ0c1dpdGgoZXJyb3JzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgZmllbGQgY29udGFpbnMgaW52YWxpZCBVVEYtOCBkYXRhIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nIGEgcHJvdG9jb2wgYnVmZmVyLiBVc2UgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJ2J5dGVzJyB0eXBlIGlmIHlvdSBpbnRlbmQgdG8gc2VuZCByYXcgYnl0ZXMuIikpOworCisjZWxzZQorICBBU1NFUlRfRVEoMCwgZXJyb3JzLnNpemUoKSk7CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRAorfQorCitURVNUKFV0ZjhWYWxpZGF0aW9uVGVzdCwgV3JpdGVWYWxpZFVURjhTdHJpbmcpIHsKKyAgc3RyaW5nIHdpcmVfYnVmZmVyOworICBwcm90b2J1Zl91bml0dGVzdDo6T25lU3RyaW5nIGlucHV0OworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdyaXRlTWVzc2FnZShrVmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorICBBU1NFUlRfRVEoMCwgZXJyb3JzLnNpemUoKSk7Cit9CisKK1RFU1QoVXRmOFZhbGlkYXRpb25UZXN0LCBSZWFkVmFsaWRVVEY4U3RyaW5nKSB7CisgIHN0cmluZyB3aXJlX2J1ZmZlcjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBpbnB1dDsKKyAgV3JpdGVNZXNzYWdlKGtWYWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBvdXRwdXQ7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgUmVhZE1lc3NhZ2Uod2lyZV9idWZmZXIsICZvdXRwdXQpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoaW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpKTsKK30KKworLy8gQnl0ZXM6IGFueXRoaW5nIGNhbiBwYXNzIGFzIGJ5dGVzLCB1c2UgaW52YWxpZCBVVEYtOCBzdHJpbmcgdG8gdGVzdAorVEVTVChVdGY4VmFsaWRhdGlvblRlc3QsIFdyaXRlQXJiaXRyYXJ5Qnl0ZXMpIHsKKyAgc3RyaW5nIHdpcmVfYnVmZmVyOworICBwcm90b2J1Zl91bml0dGVzdDo6T25lQnl0ZXMgaW5wdXQ7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgV3JpdGVNZXNzYWdlKGtJbnZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworfQorCitURVNUKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZEFyYml0cmFyeUJ5dGVzKSB7CisgIHN0cmluZyB3aXJlX2J1ZmZlcjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZUJ5dGVzIGlucHV0OworICBXcml0ZU1lc3NhZ2Uoa0ludmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVCeXRlcyBvdXRwdXQ7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgUmVhZE1lc3NhZ2Uod2lyZV9idWZmZXIsICZvdXRwdXQpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoaW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpKTsKK30KKworVEVTVChVdGY4VmFsaWRhdGlvblRlc3QsIFBhcnNlUmVwZWF0ZWRTdHJpbmcpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok1vcmVCeXRlcyBpbnB1dDsKKyAgaW5wdXQuYWRkX2RhdGEoa1ZhbGlkVVRGOFN0cmluZyk7CisgIGlucHV0LmFkZF9kYXRhKGtJbnZhbGlkVVRGOFN0cmluZyk7CisgIGlucHV0LmFkZF9kYXRhKGtJbnZhbGlkVVRGOFN0cmluZyk7CisgIHN0cmluZyB3aXJlX2J1ZmZlciA9IGlucHV0LlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok1vcmVTdHJpbmcgb3V0cHV0OworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEFTU0VSVF9FUSgyLCBlcnJvcnMuc2l6ZSgpKTsKKyNlbHNlCisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEVYUEVDVF9FUSh3aXJlX2J1ZmZlciwgb3V0cHV0LlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9zb2xhcmlzL2xpYnN0ZGMrKy5sYSBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvc3JjL3NvbGFyaXMvbGlic3RkYysrLmxhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGY0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3NyYy9zb2xhcmlzL2xpYnN0ZGMrKy5sYQpAQCAtMCwwICsxLDUxIEBACisjIGxpYnN0ZGMrKy5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSBsaWJ0b29sIDEuNGEtR0NDMy4wICgxLjY0MS4yLjI1NiAyMDAxLzA1LzI4IDIwOjA5OjA3IHdpdGggR0NDLWxvY2FsIGNoYW5nZXMpCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIC0tLQorIyBOT1RFOiBUaGlzIGZpbGUgbGl2ZXMgaW4gL3Vzci9zZncvbGliIG9uIFNvbGFyaXMgMTAuICBVbmZvcnR1bmF0ZWx5LAorIyBkdWUgdG8gYW4gYXBwYXJlbnQgYnVnIGluIHRoZSBTb2xhcmlzIDEwIDYvMDYgcmVsZWFzZSwKKyMgL3Vzci9zZncvbGliL2xpYnN0ZGMrKy5sYSBpcyBlbXB0eS4gIEJlbG93IGlzIHRoZSBjb3JyZWN0IGNvbnRlbnQsCisjIGFjY29yZGluZyB0bworIyAgICBodHRwOi8vZm9ydW0uamF2YS5zdW4uY29tL3RocmVhZC5qc3BhP3RocmVhZElEPTUwNzMxNTAKKyMgQnkgcGFzc2luZyBMREZMQUdTPSctTHNyYy9zb2xhcmlzJyB0byBjb25maWd1cmUsIG1ha2Ugd2lsbCBwaWNrIHVwCisjIHRoaXMgY29weSBvZiB0aGUgZmlsZSByYXRoZXIgdGhhbiB0aGUgZW1wdHkgY29weSBpbiAvdXNyL3Nmdy9saWIuCisjCisjIEFsc28gc2VlCisjICAgaHR0cDovL3d3dy50ZWNobmljYWxhcnRpY2xlcy5vcmcvaW5kZXgucGhwL0NvbXBpbGluZ19NeVNRTF81LjBfb25fU29sYXJpc18xMAorIworIyBOb3RlOiB0aGlzIGlzIGZvciAzMi1iaXQgc3lzdGVtcy4gIElmIHlvdSBoYXZlIGEgNjQtYml0IHN5c3RlbSwKKyMgdW5jb21tZW50IHRoZSBhcHByb3ByaWF0ZSBkZXBlbmRlbmN5X2xpYnMgbGluZSBiZWxvdy4KKyMgLS0tLQorCisjIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KK2RsbmFtZT0nbGlic3RkYysrLnNvLjYnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nbGlic3RkYysrLnNvLjYuMC4zIGxpYnN0ZGMrKy5zby42IGxpYnN0ZGMrKy5zbycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nbGlic3RkYysrLmEnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorIyAzMi1iaXQgdmVyc2lvbjoKK2RlcGVuZGVuY3lfbGlicz0nLWxjIC1sbSAtTC91c3Ivc2Z3L2xpYiAtbGdjY19zJworIyA2NC1iaXQgdmVyc2lvbjoKKyNkZXBlbmRlbmN5X2xpYnM9Jy1ML2xpYi82NCAtbGMgLWxtIC1ML3Vzci9zZncvbGliLzY0IC1sZ2NjX3MnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGlic3RkYysrLgorY3VycmVudD02CithZ2U9MAorcmV2aXNpb249MworCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD15ZXMKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JycKK2RscHJlb3Blbj0nJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9Jy91c3Ivc2Z3L2xpYicKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9jb25maWcuaCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL2NvbmZpZy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHByb3RvYnVmIGNvbmZpZy5oIGZvciBNU1ZDLiAgT24gb3RoZXIgcGxhdGZvcm1zLCB0aGlzIGlzIGdlbmVyYXRlZAorICogYXV0b21hdGljYWxseSBieSBhdXRvaGVhZGVyIC8gYXV0b2NvbmYgLyBjb25maWd1cmUuICovCisKKy8qIHRoZSBsb2NhdGlvbiBvZiA8aGFzaF9tYXA+ICovCisjZGVmaW5lIEhBU0hfTUFQX0ggPGhhc2hfbWFwPgorCisvKiB0aGUgbmFtZXNwYWNlIG9mIGhhc2hfbWFwL2hhc2hfc2V0ICovCisvLyBBcHBhcmVudGx5IE1pY3Jvc29mdCBkZWNpZGVkIHRvIG1vdmUgaGFzaF9tYXAgKmJhY2sqIHRvIHRoZSBzdGQgbmFtZXNwYWNlCisvLyBpbiBNU1ZDIDIwMTA6CisvLyAgIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS92Y2Jsb2cvYXJjaGl2ZS8yMDA5LzA1LzI1L3N0bC1icmVha2luZy1jaGFuZ2VzLWluLXZpc3VhbC1zdHVkaW8tMjAxMC1iZXRhLTEuYXNweAorLy8gVE9ETyhrZW50b24pOiAgVXNlIHVub3JkZXJlZF9tYXAgaW5zdGVhZCwgd2hpY2ggaXMgYXZhaWxhYmxlIGluIE1TVkMgMjAxMC4KKyNpZiBfTVNDX1ZFUiA8IDEzMTAgfHwgX01TQ19WRVIgPj0gMTYwMAorI2RlZmluZSBIQVNIX05BTUVTUEFDRSBzdGQKKyNlbHNlCisjZGVmaW5lIEhBU0hfTkFNRVNQQUNFIHN0ZGV4dAorI2VuZGlmCisKKy8qIHRoZSBsb2NhdGlvbiBvZiA8aGFzaF9zZXQ+ICovCisjZGVmaW5lIEhBU0hfU0VUX0ggPGhhc2hfc2V0PgorCisvKiBkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGhhcyBoYXNoX21hcCAqLworI2RlZmluZSBIQVZFX0hBU0hfTUFQIDEKKworLyogZGVmaW5lIGlmIHRoZSBjb21waWxlciBoYXMgaGFzaF9zZXQgKi8KKyNkZWZpbmUgSEFWRV9IQVNIX1NFVCAxCisKKy8qIGRlZmluZSBpZiB5b3Ugd2FudCB0byB1c2UgemxpYi4gIFNlZSByZWFkbWUudHh0IGZvciBhZGRpdGlvbmFsCisgKiByZXF1aXJlbWVudHMuICovCisvLyAjZGVmaW5lIEhBVkVfWkxJQiAxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvY29udmVydDIwMDh0bzIwMDUuc2ggYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvY29udmVydDIwMDh0bzIwMDUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjBlY2NhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9jb252ZXJ0MjAwOHRvMjAwNS5zaApAQCAtMCwwICsxLDIwIEBACisjISAvYmluL3NoIC1lCisKKyMgVGhpcyBzY3JpcHQgZG93bmdyYWRlcyBNU1ZDIDIwMDggcHJvamVjdHMgdG8gTVNWQyAyMDA1IHByb2plY3RzLCBhbGxvd2luZworIyBwZW9wbGUgd2l0aCBNU1ZDIDIwMDUgdG8gb3BlbiB0aGVtLiAgT3RoZXJ3aXNlLCBNU1ZDIDIwMDUgc2ltcGx5IHJlZnVzZXMgdG8KKyMgb3BlbiBwcm9qZWN0cyBjcmVhdGVkIHdpdGggMjAwOC4gIFdlIHJ1biB0aGlzIGFzIHBhcnQgb2Ygb3VyIHJlbGVhc2UgcHJvY2Vzcy4KKyMgSWYgeW91IG9idGFpbmVkIHRoZSBjb2RlIGRpcmVjdCBmcm9tIHZlcnNpb24gY29udHJvbCBhbmQgeW91IHdhbnQgdG8gdXNlCisjIE1TVkMgMjAwNSwgeW91IG1heSBoYXZlIHRvIHJ1biB0aGlzIG1hbnVhbGx5LiAgKEhpbnQ6ICBVc2UgQ3lnd2luIG9yIE1TWVMuKQorCitmb3IgZmlsZSBpbiAqLnNsbjsgZG8KKyAgZWNobyAiZG93bmdyYWRpbmcgJGZpbGUuLi4iCisgIHNlZCAtaSAtcmUgJ3MvRm9ybWF0IFZlcnNpb24gMTAuMDAvRm9ybWF0IFZlcnNpb24gOS4wMC9nOworICAgICAgICAgICAgICBzL1Zpc3VhbCBTdHVkaW8gMjAwOC9WaXN1YWwgU3R1ZGlvIDIwMDUvZzsnICRmaWxlCitkb25lCisKK2ZvciBmaWxlIGluICoudmNwcm9qOyBkbworICBlY2hvICJkb3duZ3JhZGluZyAkZmlsZS4uLiIKKyAgc2VkIC1pIC1yZSAncy9WZXJzaW9uPSI5LjAwIi9WZXJzaW9uPSI4LjAwIi9nOycgJGZpbGUKK2RvbmUKKworIyBZZXMsIHJlYWxseSwgdGhhdCdzIGl0LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL2V4dHJhY3RfaW5jbHVkZXMuYmF0IGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL2V4dHJhY3RfaW5jbHVkZXMuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkZGNkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvZXh0cmFjdF9pbmNsdWRlcy5iYXQKQEAgLTAsMCArMSw0OSBAQAorbWQgaW5jbHVkZQorbWQgaW5jbHVkZVxnb29nbGUKK21kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmCittZCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzdHVicworbWQgaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW8KK21kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyCittZCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHAKK21kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmEKK21kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHB5dGhvbgorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wcy5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wcy5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGNvbW1vbi5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGNvbW1vbi5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcb25jZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXG9uY2UuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHBsYXRmb3JtX21hY3Jvcy5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHBsYXRmb3JtX21hY3Jvcy5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcdGVtcGxhdGVfdXRpbC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHRlbXBsYXRlX3V0aWwuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHR5cGVfdHJhaXRzLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcc3R1YnNcdHlwZV90cmFpdHMuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnBiLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvci5wYi5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvcl9kYXRhYmFzZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3JfZGF0YWJhc2UuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGR5bmFtaWNfbWVzc2FnZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGR5bmFtaWNfbWVzc2FnZS5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZXh0ZW5zaW9uX3NldC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGV4dGVuc2lvbl9zZXQuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXG1lc3NhZ2UuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlX2xpdGUuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlX2xpdGUuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHJlZmxlY3Rpb25fb3BzLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZccmVmbGVjdGlvbl9vcHMuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHJlcGVhdGVkX2ZpZWxkLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZccmVwZWF0ZWRfZmllbGQuaAorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHNlcnZpY2UuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzZXJ2aWNlLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx0ZXh0X2Zvcm1hdC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHRleHRfZm9ybWF0LmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bmtub3duX2ZpZWxkX3NldC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHVua25vd25fZmllbGRfc2V0LmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHdpcmVfZm9ybWF0LmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdF9saXRlLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZS5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdF9saXRlX2lubC5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cY29kZWRfc3RyZWFtLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cY29kZWRfc3RyZWFtLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xnemlwX3N0cmVhbS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvXGd6aXBfc3RyZWFtLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xwcmludGVyLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9ccHJpbnRlci5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cdG9rZW5pemVyLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cdG9rZW5pemVyLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbS5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbV9pbXBsLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbV9pbXBsLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjb2RlX2dlbmVyYXRvci5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNvZGVfZ2VuZXJhdG9yLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY29tbWFuZF9saW5lX2ludGVyZmFjZS5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcaW1wb3J0ZXIuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxpbXBvcnRlci5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGFyc2VyLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGFyc2VyLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX2dlbmVyYXRvci5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZ2VuZXJhdG9yLmgKK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfZ2VuZXJhdG9yLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2dlbmVyYXRvci5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccHl0aG9uXHB5dGhvbl9nZW5lcmF0b3IuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxweXRob25ccHl0aG9uX2dlbmVyYXRvci5oCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGx1Z2luLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGx1Z2luLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9saWJwcm90b2J1Zi1saXRlLnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9saWJwcm90b2J1Zi1saXRlLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDIzNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL2xpYnByb3RvYnVmLWxpdGUudmNwcm9qCkBAIC0wLDAgKzEsMzAyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9ImxpYnByb3RvYnVmLWxpdGUiCisJUHJvamVjdEdVSUQ9Ins0OUVBMDEwRC03MDZGLTRCRTItQTM5Ny03Nzg1NEI3MkEwNDB9IgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IkRlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9zcmM7LiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7TElCUFJPVE9CVUZfRVhQT1JUUzsiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL3NyYzsuIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMSUJQUk9UT0JVRl9FWFBPUlRTOyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xjb2RlZF9zdHJlYW0uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xjb2RlZF9zdHJlYW1faW5sLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcY29tbW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY29uZmlnLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZXh0ZW5zaW9uX3NldC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xoYXNoLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcbWFwLXV0aWwuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlX2xpdGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xvbmNlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcYXRvbWljb3BzLmgiCisJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmgiCisJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xwbGF0Zm9ybV9tYWNyb3MuaCIKKwkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHJlcGVhdGVkX2ZpZWxkLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcc3RsX3V0aWwuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdF9saXRlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xzdHJpbmdwcmludGYuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1x0ZW1wbGF0ZV91dGlsLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcdHlwZV90cmFpdHMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3giCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXGNvZGVkX3N0cmVhbS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xjb21tb24uY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZXh0ZW5zaW9uX3NldC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXG1lc3NhZ2VfbGl0ZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xvbmNlLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZccmVwZWF0ZWRfZmllbGQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHN0cmluZ3ByaW50Zi5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL2xpYnByb3RvYnVmLnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9saWJwcm90b2J1Zi52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0NmQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9saWJwcm90b2J1Zi52Y3Byb2oKQEAgLTAsMCArMSw0NjIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjguMDAiCisJTmFtZT0ibGlicHJvdG9idWYiCisJUHJvamVjdEdVSUQ9InszRTI4M0YzNy1BNEVELTQxQjctQTNFNi1BMkQ4OUQxMzFBMzB9IgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IkRlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9zcmM7LiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7TElCUFJPVE9CVUZfRVhQT1JUUzsiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL3NyYzsuIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMSUJQUk9UT0JVRl9FWFBPUlRTOyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xjb2RlZF9zdHJlYW0uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xjb2RlZF9zdHJlYW1faW5sLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcY29tbW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY29uZmlnLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IucGIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yX2RhdGFiYXNlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZHluYW1pY19tZXNzYWdlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZXh0ZW5zaW9uX3NldC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cZ3ppcF9zdHJlYW0uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xoYXNoLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcaW1wb3J0ZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xtYXAtdXRpbC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXG1lc3NhZ2UuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlX2xpdGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xhdG9taWNvcHMuaCIKKwkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCIKKwkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHBsYXRmb3JtX21hY3Jvcy5oIgorCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcb25jZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBhcnNlci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXHByaW50ZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxyZWZsZWN0aW9uX29wcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHJlcGVhdGVkX2ZpZWxkLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc2VydmljZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHN0bF91dGlsLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcc3RyaW5ncHJpbnRmLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcdGVtcGxhdGVfdXRpbC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHR5cGVfdHJhaXRzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcc3RydXRpbC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHN1YnN0aXR1dGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx0ZXh0X2Zvcm1hdC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXHRva2VuaXplci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHVua25vd25fZmllbGRfc2V0LmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdF9saXRlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbV9pbXBsLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3giCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXGNvZGVkX3N0cmVhbS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xjb21tb24uY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvci5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnBiLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3JfZGF0YWJhc2UuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZHluYW1pY19tZXNzYWdlLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGV4dGVuc2lvbl9zZXQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cZ3ppcF9zdHJlYW0uY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcaW1wb3J0ZXIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcbWVzc2FnZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlX2xpdGUuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcb25jZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBhcnNlci5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xwcmludGVyLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHJlZmxlY3Rpb25fb3BzLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHJlcGVhdGVkX2ZpZWxkLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHNlcnZpY2UuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcc3RydWN0dXJhbGx5X3ZhbGlkLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHN0cnV0aWwuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcc3Vic3RpdHV0ZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx0ZXh0X2Zvcm1hdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x0b2tlbml6ZXIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcdW5rbm93bl9maWVsZF9zZXQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW1faW1wbC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xzdHJpbmdwcmludGYuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9saWJwcm90b2MudmNwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL2xpYnByb3RvYy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhMGQyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9saWJwcm90b2MudmNwcm9qCkBAIC0wLDAgKzEsNDI2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9ImxpYnByb3RvYyIKKwlQcm9qZWN0R1VJRD0ie0I4NEZGMzFBLTVGOUEtNDZGOC1BQjIyLURCRkM5QkVDRTNCRX0iCisJS2V5d29yZD0iV2luMzJQcm9qIgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjAiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IkRlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL3dkNDI0NCAvd2Q0MjY3IC93ZDQwMTggL3dkNDM1NSAvd2Q0ODAwIC93ZDQyNTEgL3dkNDk5NiAvd2Q0MTQ2IC93ZDQzMDUiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL3NyYzsuIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMSUJQUk9UT0NfRVhQT1JUUzsiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL3NyYzsuIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMSUJQUk9UT0NfRVhQT1JUUzsiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY29kZV9nZW5lcmF0b3IuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcc3VicHJvY2Vzcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKyAgICAgIDxGaWxlCisgICAgICAgIFJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclx6aXBfd3JpdGVyLmgiCisgICAgICAgID4KKyAgICAgIDwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBsdWdpbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBsdWdpbi5wYi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZW51bS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZW51bV9maWVsZC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZXh0ZW5zaW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9maWVsZC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZmlsZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZ2VuZXJhdG9yLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9oZWxwZXJzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9tZXNzYWdlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9tZXNzYWdlX2ZpZWxkLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9vcHRpb25zLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9wcmltaXRpdmVfZmllbGQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX3NlcnZpY2UuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX3N0cmluZ19maWVsZC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9lbnVtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2VudW1fZmllbGQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfZXh0ZW5zaW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2ZpZWxkLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2ZpbGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfZ2VuZXJhdG9yLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2hlbHBlcnMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfbWVzc2FnZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9tZXNzYWdlX2ZpZWxkLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX3ByaW1pdGl2ZV9maWVsZC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9zZXJ2aWNlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX3N0cmluZ19maWVsZC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9kb2NfY29tbWVudC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9kb2NfY29tbWVudC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxweXRob25ccHl0aG9uX2dlbmVyYXRvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9IgorCQkJPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY29kZV9nZW5lcmF0b3IuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxzdWJwcm9jZXNzLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKyAgICAgIDxGaWxlCisgICAgICAgIFJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclx6aXBfd3JpdGVyLmNjIgorICAgICAgICA+CisgICAgICA8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxwbHVnaW4uY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGx1Z2luLnBiLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZW51bS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX2VudW1fZmllbGQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9leHRlbnNpb24uY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9maWVsZC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX2ZpbGUuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9nZW5lcmF0b3IuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9oZWxwZXJzLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfbWVzc2FnZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX21lc3NhZ2VfZmllbGQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9wcmltaXRpdmVfZmllbGQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9zZXJ2aWNlLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfc3RyaW5nX2ZpZWxkLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9lbnVtLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9lbnVtX2ZpZWxkLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9leHRlbnNpb24uY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2ZpZWxkLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9maWxlLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9nZW5lcmF0b3IuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2hlbHBlcnMuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX21lc3NhZ2UuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX21lc3NhZ2VfZmllbGQuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX3ByaW1pdGl2ZV9maWVsZC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfc2VydmljZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfc3RyaW5nX2ZpZWxkLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHB5dGhvblxweXRob25fZ2VuZXJhdG9yLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvbGl0ZS10ZXN0LnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9saXRlLXRlc3QudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjA1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvbGl0ZS10ZXN0LnZjcHJvagpAQCAtMCwwICsxLDMwNSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOC4wMCIKKwlOYW1lPSJsaXRlLXRlc3QiCisJUHJvamVjdEdVSUQ9InsxMjAxNUFDRS00MkJFLTQ5NTItQTVBMC00NEE5QTQ2OTA4RTJ9IgorCVJvb3ROYW1lc3BhY2U9InRlc3RzIgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IkRlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IiIKKwkJCQlDb21tYW5kTGluZT0iIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiIKKwkJCQlPdXRwdXRzPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9zcmM7LjsuLi9ndGVzdC9pbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEU7X1ZBUklBRElDX01BWD0xMDsiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IiIKKwkJCQlDb21tYW5kTGluZT0iIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiIKKwkJCQlPdXRwdXRzPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL3NyYzsuOy4uL2d0ZXN0L2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTtfVkFSSUFESUNfTUFYPTEwOyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIgorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx0ZXN0X3V0aWxfbGl0ZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9saXRlLnBiLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9IgorCQkJPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcbGl0ZV91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx0ZXN0X3V0aWxfbGl0ZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfbGl0ZS5wYi5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGUucHJvdG8iCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X2xpdGUucGIue2gsY2N9Li4uIgorCQkJCQlDb21tYW5kTGluZT0iRGVidWdccHJvdG9jIC1JLi4vc3JjIC0tY3BwX291dD0uIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGUucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfbGl0ZS5wYi5jYyIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdF9saXRlLnBiLntoLGNjfS4uLiIKKwkJCQkJQ29tbWFuZExpbmU9IlJlbGVhc2VccHJvdG9jIC1JLi4vc3JjIC0tY3BwX291dD0uIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGUucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfbGl0ZS5wYi5jYyIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJEZWJ1Z1xwcm90b2MgLUkuLi9zcmMgLS1jcHBfb3V0PS4gLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLntoLGNjfS4uLiIKKwkJCQkJQ29tbWFuZExpbmU9IlJlbGVhc2VccHJvdG9jIC1JLi4vc3JjIC0tY3BwX291dD0uIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLntoLGNjfS4uLiIKKwkJCQkJQ29tbWFuZExpbmU9IkRlYnVnXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLntoLGNjfS4uLiIKKwkJCQkJQ29tbWFuZExpbmU9IlJlbGVhc2VccHJvdG9jIC1JLi4vc3JjIC0tY3BwX291dD0uIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvJiN4MEQ7JiN4MEE7IgorCQkJCQlPdXRwdXRzPSJnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL3Byb3RvYnVmLnNsbiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9wcm90b2J1Zi5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1OWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9wcm90b2J1Zi5zbG4KQEAgLTAsMCArMSw5MiBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwCisjIFZpc3VhbCBTdHVkaW8gMjAwNQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJwcm90b2J1ZiIsICJsaWJwcm90b2J1Zi52Y3Byb2oiLCAiezNFMjgzRjM3LUE0RUQtNDFCNy1BM0U2LUEyRDg5RDEzMUEzMH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxpYnByb3RvYyIsICJsaWJwcm90b2MudmNwcm9qIiwgIntCODRGRjMxQS01RjlBLTQ2RjgtQUIyMi1EQkZDOUJFQ0UzQkV9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezNFMjgzRjM3LUE0RUQtNDFCNy1BM0U2LUEyRDg5RDEzMUEzMH0gPSB7M0UyODNGMzctQTRFRC00MUI3LUEzRTYtQTJEODlEMTMxQTMwfQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInByb3RvYyIsICJwcm90b2MudmNwcm9qIiwgInsxNzM4RDVGNi1FRDFFLTQ3RTAtQjJGMC00NTY4NjRCOTNDMUV9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJe0I4NEZGMzFBLTVGOUEtNDZGOC1BQjIyLURCRkM5QkVDRTNCRX0gPSB7Qjg0RkYzMUEtNUY5QS00NkY4LUFCMjItREJGQzlCRUNFM0JFfQorCQl7M0UyODNGMzctQTRFRC00MUI3LUEzRTYtQTJEODlEMTMxQTMwfSA9IHszRTI4M0YzNy1BNEVELTQxQjctQTNFNi1BMkQ4OUQxMzFBMzB9CisJRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdHMiLCAidGVzdHMudmNwcm9qIiwgIns0REY3Mjc2MC1DMDU1LTQwQTUtQTc3RS0zMEExN0UyQUMyREJ9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJe0I4NEZGMzFBLTVGOUEtNDZGOC1BQjIyLURCRkM5QkVDRTNCRX0gPSB7Qjg0RkYzMUEtNUY5QS00NkY4LUFCMjItREJGQzlCRUNFM0JFfQorCQl7M0UyODNGMzctQTRFRC00MUI3LUEzRTYtQTJEODlEMTMxQTMwfSA9IHszRTI4M0YzNy1BNEVELTQxQjctQTNFNi1BMkQ4OUQxMzFBMzB9CisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9ID0ge0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0gPSB7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfQorCQl7Q0JCRDM0RTUtMDJCMC00MEQ1LUI2RDgtQkZFQTgzRTE4QjMyfSA9IHtDQkJEMzRFNS0wMkIwLTQwRDUtQjZEOC1CRkVBODNFMThCMzJ9CisJCXsxNzM4RDVGNi1FRDFFLTQ3RTAtQjJGMC00NTY4NjRCOTNDMUV9ID0gezE3MzhENUY2LUVEMUUtNDdFMC1CMkYwLTQ1Njg2NEI5M0MxRX0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdCIsICIuLlxndGVzdFxtc3ZjXGd0ZXN0LnZjcHJvaiIsICJ7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfbWFpbiIsICIuLlxndGVzdFxtc3ZjXGd0ZXN0X21haW4udmNwcm9qIiwgInszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJwcm90b2J1Zi1saXRlIiwgImxpYnByb3RvYnVmLWxpdGUudmNwcm9qIiwgIns0OUVBMDEwRC03MDZGLTRCRTItQTM5Ny03Nzg1NEI3MkEwNDB9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaXRlLXRlc3QiLCAibGl0ZS10ZXN0LnZjcHJvaiIsICJ7MTIwMTVBQ0UtNDJCRS00OTUyLUE1QTAtNDRBOUE0NjkwOEUyfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXs0OUVBMDEwRC03MDZGLTRCRTItQTM5Ny03Nzg1NEI3MkEwNDB9ID0gezQ5RUEwMTBELTcwNkYtNEJFMi1BMzk3LTc3ODU0QjcyQTA0MH0KKwkJezE3MzhENUY2LUVEMUUtNDdFMC1CMkYwLTQ1Njg2NEI5M0MxRX0gPSB7MTczOEQ1RjYtRUQxRS00N0UwLUIyRjAtNDU2ODY0QjkzQzFFfQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3RfcGx1Z2luIiwgInRlc3RfcGx1Z2luLnZjcHJvaiIsICJ7Q0JCRDM0RTUtMDJCMC00MEQ1LUI2RDgtQkZFQTgzRTE4QjMyfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtCODRGRjMxQS01RjlBLTQ2RjgtQUIyMi1EQkZDOUJFQ0UzQkV9ID0ge0I4NEZGMzFBLTVGOUEtNDZGOC1BQjIyLURCRkM5QkVDRTNCRX0KKwkJezNFMjgzRjM3LUE0RUQtNDFCNy1BM0U2LUEyRDg5RDEzMUEzMH0gPSB7M0UyODNGMzctQTRFRC00MUI3LUEzRTYtQTJEODlEMTMxQTMwfQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fSA9IHtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9CisJRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzIKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezNFMjgzRjM3LUE0RUQtNDFCNy1BM0U2LUEyRDg5RDEzMUEzMH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezNFMjgzRjM3LUE0RUQtNDFCNy1BM0U2LUEyRDg5RDEzMUEzMH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXszRTI4M0YzNy1BNEVELTQxQjctQTNFNi1BMkQ4OUQxMzFBMzB9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7M0UyODNGMzctQTRFRC00MUI3LUEzRTYtQTJEODlEMTMxQTMwfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtCODRGRjMxQS01RjlBLTQ2RjgtQUIyMi1EQkZDOUJFQ0UzQkV9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtCODRGRjMxQS01RjlBLTQ2RjgtQUIyMi1EQkZDOUJFQ0UzQkV9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7Qjg0RkYzMUEtNUY5QS00NkY4LUFCMjItREJGQzlCRUNFM0JFfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0I4NEZGMzFBLTVGOUEtNDZGOC1BQjIyLURCRkM5QkVDRTNCRX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7MTczOEQ1RjYtRUQxRS00N0UwLUIyRjAtNDU2ODY0QjkzQzFFfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7MTczOEQ1RjYtRUQxRS00N0UwLUIyRjAtNDU2ODY0QjkzQzFFfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezE3MzhENUY2LUVEMUUtNDdFMC1CMkYwLTQ1Njg2NEI5M0MxRX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXsxNzM4RDVGNi1FRDFFLTQ3RTAtQjJGMC00NTY4NjRCOTNDMUV9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezRERjcyNzYwLUMwNTUtNDBBNS1BNzdFLTMwQTE3RTJBQzJEQn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezRERjcyNzYwLUMwNTUtNDBBNS1BNzdFLTMwQTE3RTJBQzJEQn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs0REY3Mjc2MC1DMDU1LTQwQTUtQTc3RS0zMEExN0UyQUMyREJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7NERGNzI3NjAtQzA1NS00MEE1LUE3N0UtMzBBMTdFMkFDMkRCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezQ5RUEwMTBELTcwNkYtNEJFMi1BMzk3LTc3ODU0QjcyQTA0MH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezQ5RUEwMTBELTcwNkYtNEJFMi1BMzk3LTc3ODU0QjcyQTA0MH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs0OUVBMDEwRC03MDZGLTRCRTItQTM5Ny03Nzg1NEI3MkEwNDB9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7NDlFQTAxMEQtNzA2Ri00QkUyLUEzOTctNzc4NTRCNzJBMDQwfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXsxMjAxNUFDRS00MkJFLTQ5NTItQTVBMC00NEE5QTQ2OTA4RTJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXsxMjAxNUFDRS00MkJFLTQ5NTItQTVBMC00NEE5QTQ2OTA4RTJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7MTIwMTVBQ0UtNDJCRS00OTUyLUE1QTAtNDRBOUE0NjkwOEUyfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezEyMDE1QUNFLTQyQkUtNDk1Mi1BNUEwLTQ0QTlBNDY5MDhFMn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7Q0JCRDM0RTUtMDJCMC00MEQ1LUI2RDgtQkZFQTgzRTE4QjMyfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7Q0JCRDM0RTUtMDJCMC00MEQ1LUI2RDgtQkZFQTgzRTE4QjMyfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0NCQkQzNEU1LTAyQjAtNDBENS1CNkQ4LUJGRUE4M0UxOEIzMn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtDQkJEMzRFNS0wMkIwLTQwRDUtQjZEOC1CRkVBODNFMThCMzJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvcHJvdG9jLnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9wcm90b2MudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmI2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvcHJvdG9jLnZjcHJvagpAQCAtMCwwICsxLDE5MiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOC4wMCIKKwlOYW1lPSJwcm90b2MiCisJUHJvamVjdEdVSUQ9InsxNzM4RDVGNi1FRDFFLTQ3RTAtQjJGMC00NTY4NjRCOTNDMUV9IgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IkRlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9zcmM7LiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFOyIKKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSJSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL3dkNDI0NCAvd2Q0MjY3IC93ZDQwMTggL3dkNDM1NSAvd2Q0ODAwIC93ZDQyNTEgL3dkNDk5NiAvd2Q0MTQ2IC93ZDQzMDUiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vc3JjOy4iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTsiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9IgorCQkJPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4IgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX0iCisJCQk+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214IgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxtYWluLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvcmVhZG1lLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODM0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9jcHAvdGhpcmQtcGFydHkvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLTIuNS4wL3ZzcHJvamVjdHMvcmVhZG1lLnR4dApAQCAtMCwwICsxLDExNCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgY29tcGlsaW5nIFByb3RvY29sIEJ1ZmZlcnMgdXNpbmcKK01TVkMuICBUaGlzIGlzIG5vdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGRvIFByb3RvY29sIEJ1ZmZlciBkZXZlbG9wbWVudCAtLQord2UgcHJlZmVyIHRvIGRldmVsb3AgdW5kZXIgYSBVbml4LWxpa2UgZW52aXJvbm1lbnQgLS0gYnV0IGl0IG1heSBiZSBtb3JlCithY2Nlc3NpYmxlIHRvIHRob3NlIHdobyBwcmltYXJpbHkgd29yayB3aXRoIE1TVkMuCisKK0NvbXBpbGluZyBhbmQgSW5zdGFsbGluZworPT09PT09PT09PT09PT09PT09PT09PT09CisKKzEpIE9wZW4gcHJvdG9idWYuc2xuIGluIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLgorMikgQ2hvb3NlICJEZWJ1ZyIgb3IgIlJlbGVhc2UiIGNvbmZpZ3VyYXRpb24gYXMgZGVzaXJlZC4qCiszKSBGcm9tIHRoZSBCdWlsZCBtZW51LCBjaG9vc2UgIkJ1aWxkIFNvbHV0aW9uIi4gIFdhaXQgZm9yIGNvbXBpbGluZyB0byBmaW5pc2guCis0KSBGcm9tIGEgY29tbWFuZCBzaGVsbCwgcnVuIHRlc3RzLmV4ZSBhbmQgbGl0ZS10ZXN0LmV4ZSBhbmQgY2hlY2sgdGhhdCBhbGwKKyAgIHRlc3RzIHBhc3MuCis1KSBSdW4gZXh0cmFjdF9pbmNsdWRlcy5iYXQgdG8gY29weSBhbGwgdGhlIHB1YmxpYyBoZWFkZXJzIGludG8gYSBzZXBhcmF0ZQorICAgImluY2x1ZGUiIGRpcmVjdG9yeSAodW5kZXIgdGhlIHRvcC1sZXZlbCBwYWNrYWdlIGRpcmVjdG9yeSkuCis2KSBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgaW5jbHVkZSBkaXJlY3RvcnkgdG8gd2hlcmV2ZXIgeW91IHdhbnQgdG8gcHV0CisgICBoZWFkZXJzLgorNykgQ29weSBwcm90b2MuZXhlIHdoZXJldmVyIHlvdSBwdXQgYnVpbGQgdG9vbHMgKHByb2JhYmx5IHNvbWV3aGVyZSBpbiB5b3VyCisgICBQQVRIKS4KKzgpIENvcHkgbGlicHJvdG9idWYubGliLCBsaWJwcm90b2J1Zi1saXRlLmxpYiwgYW5kIGxpYnByb3RvYy5saWIgd2hlcmV2ZXIgeW91CisgICBwdXQgbGlicmFyaWVzLgorCisqIFRvIGF2b2lkIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZSBNU1ZDIGRlYnVnIGFuZCByZWxlYXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGVuCisgIGNvbXBpbGluZyBhIGRlYnVnIGJ1aWxkIG9mIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtYXkgbmVlZCB0byBsaW5rIGFnYWluc3QgYQorICBkZWJ1ZyBidWlsZCBvZiBsaWJwcm90b2J1Zi5saWIuICBTaW1pbGFybHksIHJlbGVhc2UgYnVpbGRzIHNob3VsZCBsaW5rIGFnYWluc3QKKyAgcmVsZWFzZSBsaWJzLgorCitETExzIHZzLiBzdGF0aWMgbGlua2luZworPT09PT09PT09PT09PT09PT09PT09PT0KKworU3RhdGljIGxpbmtpbmcgaXMgbm93IHRoZSBkZWZhdWx0IGZvciB0aGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcmllcy4gIER1ZSB0bworaXNzdWVzIHdpdGggV2luMzIncyB1c2Ugb2YgYSBzZXBhcmF0ZSBoZWFwIGZvciBlYWNoIERMTCwgYXMgd2VsbCBhcyBiaW5hcnkKK2NvbXBhdGliaWxpdHkgaXNzdWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIE1TVkMncyBTVEwgbGlicmFyeSwgaXQgaXMKK3JlY29tbWVuZGVkIHRoYXQgeW91IHVzZSBzdGF0aWMgbGlua2FnZSBvbmx5LiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8KK2J1aWxkIGxpYnByb3RvYnVmIGFuZCBsaWJwcm90b2MgYXMgRExMcyBpZiB5b3UgcmVhbGx5IHdhbnQuICBUbyBkbyB0aGlzLAorZG8gdGhlIGZvbGxvd2luZzoKKworICAxKSBPcGVuIHByb3RvYnVmLnNsbiBpbiBNU1ZDLgorICAyKSBGb3IgZWFjaCBvZiB0aGUgcHJvamVjdHMgbGlicHJvdG9idWYsIGxpYnByb3RvYnVmLWxpdGUsIGFuZCBsaWJwcm90b2MsIGRvCisgICAgIHRoZSBmb2xsb3dpbmc6CisgICAgMmEpIFJpZ2h0LWNsaWNrIHRoZSBwcm9qZWN0IGFuZCBjaG9vc2UgInByb3BlcnRpZXMiLgorICAgIDJiKSBGcm9tIHRoZSBzaWRlIGJhciwgY2hvb3NlICJHZW5lcmFsIiwgdW5kZXIgIkNvbmZpZ3VyYXRpb24gUHJvcGVydGllcyIuCisgICAgMmMpIENoYW5nZSB0aGUgIkNvbmZpZ3VyYXRpb24gVHlwZSIgdG8gIkR5bmFtaWMgTGlicmFyeSAoLmRsbCkiLgorICAgIDJkKSBGcm9tIHRoZSBzaWRlIGJhciwgY2hvb3NlICJQcmVwcm9jZXNzb3IiLCB1bmRlciAiQy9DKysiLgorICAgIDJlKSBBZGQgUFJPVE9CVUZfVVNFX0RMTFMgdG8gdGhlIGxpc3Qgb2YgcHJlcHJvY2Vzc29yIGRlZmluZXMuCisgIDMpIFdoZW4gY29tcGlsaW5nIHlvdXIgcHJvamVjdCwgbWFrZSBzdXJlIHRvICNkZWZpbmUgUFJPVE9CVUZfVVNFX0RMTFMuCisKK1doZW4gZGlzdHJpYnV0aW5nIHlvdXIgc29mdHdhcmUgdG8gZW5kIHVzZXJzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UKK2RvIE5PVCBpbnN0YWxsIGxpYnByb3RvYnVmLmRsbCBvciBsaWJwcm90b2MuZGxsIHRvIGFueSBzaGFyZWQgbG9jYXRpb24uCitJbnN0ZWFkLCBrZWVwIHRoZXNlIGxpYnJhcmllcyBuZXh0IHRvIHlvdXIgYmluYXJpZXMsIGluIHlvdXIgYXBwbGljYXRpb24ncworb3duIGluc3RhbGwgZGlyZWN0b3J5LiAgQysrIG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0IHRvIG1haW50YWluIGJpbmFyeQorY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHJlbGVhc2VzLCBzbyBpdCBpcyBsaWtlbHkgdGhhdCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlc2UKK2xpYnJhcmllcyB3aWxsICpub3QqIGJlIHVzYWJsZSBhcyBkcm9wLWluIHJlcGxhY2VtZW50cy4KKworSWYgeW91ciBwcm9qZWN0IGlzIGl0c2VsZiBhIERMTCBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IHNvZnR3YXJlLCB3ZQorcmVjb21tZW5kIHRoYXQgeW91IGRvIE5PVCBleHBvc2UgcHJvdG9jb2wgYnVmZmVyIG9iamVjdHMgaW4geW91ciBsaWJyYXJ5J3MKK3B1YmxpYyBpbnRlcmZhY2UsIGFuZCB0aGF0IHlvdSBzdGF0aWNhbGx5IGxpbmsgcHJvdG9jb2wgYnVmZmVycyBpbnRvIHlvdXIKK2xpYnJhcnkuCisKK1pMaWIgc3VwcG9ydAorPT09PT09PT09PT09CisKK0lmIHlvdSB3YW50IHRvIGluY2x1ZGUgR3ppcElucHV0U3RyZWFtIGFuZCBHemlwT3V0cHV0U3RyZWFtCisoZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgpIGluIGxpYnByb3RvYywgeW91IHdpbGwgbmVlZCB0byBkbyBhIGZldworYWRkaXRpb25hbCBzdGVwczoKKworMSkgT2J0YWluIGEgY29weSBvZiB0aGUgemxpYiBsaWJyYXJ5LiAgVGhlIHByZS1jb21waWxlZCBETEwgYXQgemxpYi5uZXQgd29ya3MuCisyKSBNYWtlIHN1cmUgemxpYidzIHR3byBoZWFkZXJzIGFyZSBpbiB5b3VyIGluY2x1ZGUgcGF0aCBhbmQgdGhhdCB0aGUgLmxpYiBmaWxlCisgICBpcyBpbiB5b3VyIGxpYnJhcnkgcGF0aC4gIFlvdSBjb3VsZCBwbGFjZSBhbGwgdGhyZWUgZmlsZXMgZGlyZWN0bHkgaW50byB0aGUKKyAgIHZzcHJvamVjdCBkaXJlY3RvcnkgdG8gY29tcGlsZSBsaWJwcm90b2J1ZiwgYnV0IHRoZXkgbmVlZCB0byBiZSB2aXNpYmxlIHRvCisgICB5b3VyIG93biBwcm9qZWN0IGFzIHdlbGwsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkganVzdCBwdXQgdGhlbSBpbnRvIHRoZQorICAgVkMgc2hhcmVkIGljbmx1ZGUgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMuCiszKSBSaWdodC1jbGljayBvbiB0aGUgInRlc3RzIiBwcm9qZWN0IGFuZCBjaG9vc2UgInByb3BlcnRpZXMiLiAgTmF2aWdhdGUgdGhlCisgICBzaWRlYmFyIHRvICJDb25maWd1cmF0aW9uIFByb3BlcnRpZXMiIC0+ICJMaW5rZXIiIC0+ICJJbnB1dCIuCis0KSBVbmRlciAiQWRkaXRpb25hbCBEZXBlbmRlbmNpZXMiLCBhZGQgdGhlIG5hbWUgb2YgdGhlIHpsaWIgLmxpYiBmaWxlIChlLmcuCisgICB6ZGxsLmxpYikuICBNYWtlIHN1cmUgdG8gdXBkYXRlIGJvdGggdGhlIERlYnVnIGFuZCBSZWxlYXNlIGNvbmZpZ3VyYXRpb25zLgorNSkgSWYgeW91IGFyZSBjb21waWxpbmcgbGlicHJvdG9idWYgYW5kIGxpYnByb3RvYyBhcyBETExzIChzZWUgcHJldmlvdXMKKyAgIHNlY3Rpb24pLCByZXBlYXQgc3RlcHMgMiBhbmQgMyBmb3IgdGhlIGxpYnByb3RvYnVmIGFuZCBsaWJwcm90b2MgcHJvamVjdHMuCisgICBJZiB5b3UgYXJlIGNvbXBpbGluZyB0aGVtIGFzIHN0YXRpYyBsaWJyYXJpZXMsIHRoZW4geW91IHdpbGwgbmVlZCB0byBsaW5rCisgICBhZ2FpbnN0IHRoZSB6bGliIGxpYnJhcnkgZGlyZWN0bHkgZnJvbSB5b3VyIG93biBhcHAuCis2KSBFZGl0IGNvbmZpZy5oIChpbiB0aGUgdnNwcm9qZWN0cyBkaXJlY3RvcnkpIGFuZCB1bi1jb21tZW50IHRoZSBsaW5lIHRoYXQKKyAgICNkZWZpbmVzIEhBVkVfWkxJQi4gIChPciwgYWx0ZXJuYXRpdmVseSwgZGVmaW5lIHRoaXMgbWFjcm8gdmlhIHRoZSBwcm9qZWN0CisgICBzZXR0aW5ncy4pCisKK05vdGVzIG9uIENvbXBpbGVyIFdhcm5pbmdzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIHdhcm5pbmdzIGhhdmUgYmVlbiBkaXNhYmxlZCB3aGlsZSBidWlsZGluZyB0aGUgcHJvdG9idWYgbGlicmFyaWVzCithbmQgY29tcGlsZXIuICBZb3UgbWF5IGhhdmUgdG8gZGlzYWJsZSBzb21lIG9mIHRoZW0gaW4geW91ciBvd24gcHJvamVjdCBhcword2VsbCwgb3IgbGl2ZSB3aXRoIHRoZW0uCisKK0M0MDE4IC0gJ2V4cHJlc3Npb24nIDogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCitDNDE0NiAtIHVuYXJ5IG1pbnVzIG9wZXJhdG9yIGFwcGxpZWQgdG8gdW5zaWduZWQgdHlwZSwgcmVzdWx0IHN0aWxsIHVuc2lnbmVkCitDNDI0NCAtIENvbnZlcnNpb24gZnJvbSAndHlwZTEnIHRvICd0eXBlMicsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YS4KK0M0MjUxIC0gJ2lkZW50aWZpZXInIDogY2xhc3MgJ3R5cGUnIG5lZWRzIHRvIGhhdmUgZGxsLWludGVyZmFjZSB0byBiZSB1c2VkIGJ5CisgICAgICAgIGNsaWVudHMgb2YgY2xhc3MgJ3R5cGUyJworQzQyNjcgLSBDb252ZXJzaW9uIGZyb20gJ3NpemVfdCcgdG8gJ3R5cGUnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEuCitDNDMwNSAtICdpZGVudGlmaWVyJyA6IHRydW5jYXRpb24gZnJvbSAndHlwZTEnIHRvICd0eXBlMicKK0M0MzU1IC0gJ3RoaXMnIDogdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0CitDNDgwMCAtICd0eXBlJyA6IGZvcmNpbmcgdmFsdWUgdG8gYm9vbCAndHJ1ZScgb3IgJ2ZhbHNlJyAocGVyZm9ybWFuY2Ugd2FybmluZykKK0M0OTk2IC0gJ2Z1bmN0aW9uJzogd2FzIGRlY2xhcmVkIGRlcHJlY2F0ZWQKKworQzQyNTEgaXMgb2YgcGFydGljdWxhciBub3RlLCBpZiB5b3UgYXJlIGNvbXBpbGluZyB0aGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkKK2FzIGEgRExMIChzZWUgcHJldmlvdXMgc2VjdGlvbikuICBUaGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgdXNlcyB0ZW1wbGF0ZXMgaW4KK2l0cyBwdWJsaWMgaW50ZXJmYWNlcy4gIE1TVkMgZG9lcyBub3QgcHJvdmlkZSBhbnkgcmVhc29uYWJsZSB3YXkgdG8gZXhwb3J0Cit0ZW1wbGF0ZSBjbGFzc2VzIGZyb20gYSBETEwuICBIb3dldmVyLCBpbiBwcmFjdGljZSwgaXQgYXBwZWFycyB0aGF0IGV4cG9ydGluZwordGVtcGxhdGVzIGlzIG5vdCBuZWNlc3NhcnkgYW55d2F5LiAgU2luY2UgdGhlIGNvbXBsZXRlIGRlZmluaXRpb24gb2YgYW55Cit0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIGhlYWRlciBmaWxlcywgYW55b25lIGltcG9ydGluZyB0aGUgRExMIHdpbGwganVzdAorZW5kIHVwIGNvbXBpbGluZyBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlcyBpbnRvIHRoZWlyIG93biBiaW5hcnkuICBUaGUKK1Byb3RvY29sIEJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZWx5IG9uIHN0YXRpYyB0ZW1wbGF0ZSBtZW1iZXJzIGJlaW5nCit1bmlxdWUsIHNvIHRoZXJlIHNob3VsZCBiZSBubyBwcm9ibGVtIHdpdGggdGhpcywgYnV0IE1TVkMgcHJpbnRzIHdhcm5pbmcKK25ldmVydGhlbGVzcy4gIFNvLCB3ZSBkaXNhYmxlIGl0LiAgVW5mb3J0dW5hdGVseSwgdGhpcyB3YXJuaW5nIHdpbGwgYWxzbyBiZQorcHJvZHVjZWQgd2hlbiBjb21waWxpbmcgY29kZSB3aGljaCBtZXJlbHkgdXNlcyBwcm90b2NvbCBidWZmZXJzLCBtZWFuaW5nIHlvdQorbWF5IGhhdmUgdG8gZGlzYWJsZSBpdCBpbiB5b3VyIGNvZGUgdG9vLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL3Rlc3RfcGx1Z2luLnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy90ZXN0X3BsdWdpbi52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWJmYmM1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy90ZXN0X3BsdWdpbi52Y3Byb2oKQEAgLTAsMCArMSwyMDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9InRlc3RfcGx1Z2luIgorCVByb2plY3RHVUlEPSJ7Q0JCRDM0RTUtMDJCMC00MEQ1LUI2RDgtQkZFQTgzRTE4QjMyfSIKKwlSb290TmFtZXNwYWNlPSJ0ZXN0X3BsdWdpbiIKKwlLZXl3b3JkPSJXaW4zMlByb2oiCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTk2NjEzIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IkRlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IiIKKwkJCQlDb21tYW5kTGluZT0iIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiIKKwkJCQlPdXRwdXRzPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9zcmM7LjsuLi9ndGVzdC9pbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEU7X1ZBUklBRElDX01BWD0xMDsiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IiIKKwkJCQlDb21tYW5kTGluZT0iIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiIKKwkJCQlPdXRwdXRzPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL3NyYzsuOy4uL2d0ZXN0L2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTtfVkFSSUFESUNfTUFYPTEwOyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIgorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcbW9ja19jb2RlX2dlbmVyYXRvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHRlc3RpbmdcZmlsZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclx0ZXN0X3BsdWdpbi5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxtb2NrX2NvZGVfZ2VuZXJhdG9yLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHRlc3RpbmdcZmlsZS5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi0yLjUuMC92c3Byb2plY3RzL3Rlc3RzLnZjcHJvaiBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy90ZXN0cy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YzIzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYtMi41LjAvdnNwcm9qZWN0cy90ZXN0cy52Y3Byb2oKQEAgLTAsMCArMSw2ODEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjguMDAiCisJTmFtZT0idGVzdHMiCisJUHJvamVjdEdVSUQ9Ins0REY3Mjc2MC1DMDU1LTQwQTUtQTc3RS0zMEExN0UyQUMyREJ9IgorCVJvb3ROYW1lc3BhY2U9InRlc3RzIgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IkRlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IiIKKwkJCQlDb21tYW5kTGluZT0iIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiIKKwkJCQlPdXRwdXRzPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9zcmM7LjsuLi9ndGVzdC9pbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEU7X1ZBUklBRElDX01BWD0xMDsiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IiIKKwkJCQlDb21tYW5kTGluZT0iIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IiIKKwkJCQlPdXRwdXRzPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii93ZDQyNDQgL3dkNDI2NyAvd2Q0MDE4IC93ZDQzNTUgL3dkNDgwMCAvd2Q0MjUxIC93ZDQ5OTYgL3dkNDE0NiAvd2Q0MzA1IgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL3NyYzsuOy4uL2d0ZXN0L2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTtfVkFSSUFESUNfTUFYPTEwOyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIgorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHRlc3RpbmdcZmlsZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHRlc3RpbmdcZ29vZ2xldGVzdC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHRlc3RfdXRpbC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXG1vY2tfY29kZV9nZW5lcmF0b3IuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcdW5pdHRlc3QucGIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydC5wYi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saW5lLnBiLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X21zZXQucGIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3giCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXGNvZGVkX3N0cmVhbV91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXG1vY2tfY29kZV9nZW5lcmF0b3IuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcY29tbW9uX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX3BsdWdpbl91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfcGx1Z2luX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxweXRob25ccHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3JfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcdGVzdGluZ1xmaWxlLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcdGVzdGluZ1xnb29nbGV0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGltcG9ydGVyX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXG1lc3NhZ2VfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcb25jZV91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxwYXJzZXJfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9ccHJpbnRlcl91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxyZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxyZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxyZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXHN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xzdHJpbmdwcmludGZfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1x0eXBlX3RyYWl0c191bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xzdHJ1dGlsX3VuaXR0ZXN0LmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHRlc3RfdXRpbC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx0ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x0b2tlbml6ZXJfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0LnBiLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnQucGIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9tc2V0LnBiLmNjIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8iCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIGNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJEZWJ1Z1xwcm90b2MgLUkuLi9zcmMgLS1jcHBfb3V0PS4gLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvJiN4MEQ7JiN4MEE7IgorCQkJCQlPdXRwdXRzPSJnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oO2dvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIGNwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmg7Z29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdC5wcm90byIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3QucGIue2gsY2N9Li4uIgorCQkJCQlDb21tYW5kTGluZT0iRGVidWdccHJvdG9jIC1JLi4vc3JjIC0tY3BwX291dD0uIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdC5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdC5wYi5jYyIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdC5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJiN4MEQ7JiN4MEE7IgorCQkJCQlPdXRwdXRzPSJnb29nbGVccHJvdG9idWZcdW5pdHRlc3QucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3QucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIue2gsY2N9Li4uIgorCQkJCQlDb21tYW5kTGluZT0iRGVidWdccHJvdG9jIC1JLi4vc3JjIC0tY3BwX291dD0uIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvJiN4MEQ7JiN4MEE7IgorCQkJCQlPdXRwdXRzPSJnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8iCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJEZWJ1Z1xwcm90b2MgLUkuLi9zcmMgLS1jcHBfb3V0PS4gLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnQucHJvdG8iCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X2ltcG9ydC5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJEZWJ1Z1xwcm90b2MgLUkuLi9zcmMgLS1jcHBfb3V0PS4gLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnQucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfaW1wb3J0LnBiLmNjIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X2ltcG9ydC5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydC5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnQucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLntoLGNjfS4uLiIKKwkJCQkJQ29tbWFuZExpbmU9IkRlYnVnXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90byIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIue2gsY2N9Li4uIgorCQkJCQlDb21tYW5kTGluZT0iRGVidWdccHJvdG9jIC1JLi4vc3JjIC0tY3BwX291dD0uIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvJiN4MEQ7JiN4MEE7IgorCQkJCQlPdXRwdXRzPSJnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9tc2V0LnByb3RvIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdF9tc2V0LnBiLntoLGNjfS4uLiIKKwkJCQkJQ29tbWFuZExpbmU9IkRlYnVnXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9tc2V0LnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X21zZXQucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3RfbXNldC5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9tc2V0LnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X21zZXQucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8iCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJEZWJ1Z1xwcm90b2MgLUkuLi9zcmMgLS1jcHBfb3V0PS4gLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuaDtnb29nbGVccHJvdG9idWZcdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5oO2dvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLntoLGNjfS4uLiIKKwkJCQkJQ29tbWFuZExpbmU9IkRlYnVnXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi57aCxjY30uLi4iCisJCQkJCUNvbW1hbmRMaW5lPSJSZWxlYXNlXHByb3RvYyAtSS4uL3NyYyAtLWNwcF9vdXQ9LiAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8mI3gwRDsmI3gwQTsiCisJCQkJCU91dHB1dHM9Imdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmg7Z29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvc2VjdXJlLW1lc3NhZ2UuUkVBRE1FIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvY3BwL3RoaXJkLXBhcnR5L2dvb2dsZS9zZWN1cmUtbWVzc2FnZS5SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyYzhmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2NwcC90aGlyZC1wYXJ0eS9nb29nbGUvc2VjdXJlLW1lc3NhZ2UuUkVBRE1FCkBAIC0wLDAgKzEgQEAKK0xhc3QgcHVsbGVkIGZyb20gY29kZS5nb29nbGUuY29tIG9uIE9jdC4gMjUsIDIwMTMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2phdmEvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3NlY3VyZW1lc3NhZ2UvamF2YS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0ZTI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2phdmEvUkVBRE1FLm1kCkBAIC0wLDAgKzEgQEAKK0NvbWluZyBzb29uLi4uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9qcy9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvc2VjdXJlbWVzc2FnZS9qcy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0ZTI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9zZWN1cmVtZXNzYWdlL2pzL1JFQURNRS5tZApAQCAtMCwwICsxIEBACitDb21pbmcgc29vbi4uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tTdHJpbmcuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tTdHJpbmcuY3BwCmluZGV4IDY2OTBjNDMuLmRmZTAxYWIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9jb3JlL1NrU3RyaW5nLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta1N0cmluZy5jcHAKQEAgLTEyLDYgKzEyLDEwIEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRpb19sZWFrc19wb2VtLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQogI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKICNlbHNlCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTE5LDkgKzIzLDkgQEAKIAogLy8gbnVtYmVyIG9mIGJ5dGVzIChvbiB0aGUgc3RhY2spIHRvIHJlY2VpdmUgdGhlIHByaW50ZiByZXN1bHQKIHN0YXRpYyBjb25zdCBzaXplX3Qga0J1ZmZlclNpemUgPSAxMDI0OwotDQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQ0KLSNkZWZpbmUgVlNOUFJJTlRGICAgU2JTdHJpbmdGb3JtYXQNCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNkZWZpbmUgVlNOUFJJTlRGICAgU2JTdHJpbmdGb3JtYXQKICNkZWZpbmUgU05QUklOVEYgICAgU2JTdHJpbmdGb3JtYXRGCiAjZWxzZSAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAjaWZkZWYgU0tfQlVJTERfRk9SX1dJTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3Nrc2wvU2tTTFN0cmluZy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvc2tzbC9Ta1NMU3RyaW5nLmNwcAppbmRleCAxOGFiMjVlLi42Njg5ZjlmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvc2tzbC9Ta1NMU3RyaW5nLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvc2tzbC9Ta1NMU3RyaW5nLmNwcApAQCAtMTMxLDIyICsxMzEsMjMgQEAKIH0KIAogU3RyaW5nIHRvX3N0cmluZyhkb3VibGUgdmFsdWUpIHsKLSNpZmRlZiBTS1NMX0JVSUxEX0ZPUl9XSU4KLSAgICAjZGVmaW5lIFNOUFJJTlRGICAgIF9zbnByaW50ZgotI2Vsc2UKLSAgICAjZGVmaW5lIFNOUFJJTlRGICAgIHNucHJpbnRmCi0jZW5kaWYKLSNkZWZpbmUgTUFYX0RPVUJMRV9DSEFSUyAyNQotICAgIGNoYXIgYnVmZmVyW01BWF9ET1VCTEVfQ0hBUlNdOwotICAgIFNLU0xfREVCVUdDT0RFKGludCBsZW4gPSApU05QUklOVEYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiUuMTdnIiwgdmFsdWUpOwotICAgIEFTU0VSVChsZW4gPCBNQVhfRE9VQkxFX0NIQVJTKTsKLSAgICBTdHJpbmcgcmVzdWx0KGJ1ZmZlcik7Ci0gICAgaWYgKCFzdHJjaHIoYnVmZmVyLCAnLicpICYmICFzdHJjaHIoYnVmZmVyLCAnZScpKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiLjAiOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZmZlcjsKKyAgICBidWZmZXIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgICAgYnVmZmVyLnByZWNpc2lvbigxNyk7CisgICAgYnVmZmVyIDw8IHZhbHVlOworICAgIGJvb2wgbmVlZHNEb3RaZXJvID0gdHJ1ZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHIgPSBidWZmZXIuc3RyKCk7CisgICAgZm9yIChpbnQgaSA9IHN0ci5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBjaGFyIGMgPSBzdHJbaV07CisgICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICdlJykgeworICAgICAgICAgICAgbmVlZHNEb3RaZXJvID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotI3VuZGVmIFNOUFJJTlRGCi0jdW5kZWYgTUFYX0RPVUJMRV9DSEFSUworICAgIGlmIChuZWVkc0RvdFplcm8pIHsKKyAgICAgICAgYnVmZmVyIDw8ICIuMCI7CisgICAgfQorICAgIHJldHVybiBTdHJpbmcoYnVmZmVyLnN0cigpLmNfc3RyKCkpOwogfQogCiBpbnQgc3RvaShTdHJpbmcgcykgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL0NPTlRSSUJVVElORy5tZCBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ZTUzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwyOCBAQAorIyBIb3cgdG8gQ29udHJpYnV0ZQorCitXZSdkIGxvdmUgdG8gYWNjZXB0IHlvdXIgcGF0Y2hlcyBhbmQgY29udHJpYnV0aW9ucyB0byB0aGlzIHByb2plY3QuIFRoZXJlIGFyZQoranVzdCBhIGZldyBzbWFsbCBndWlkZWxpbmVzIHlvdSBuZWVkIHRvIGZvbGxvdy4KKworIyMgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQKKworQ29udHJpYnV0aW9ucyB0byB0aGlzIHByb2plY3QgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIENvbnRyaWJ1dG9yIExpY2Vuc2UKK0FncmVlbWVudC4gWW91IChvciB5b3VyIGVtcGxveWVyKSByZXRhaW4gdGhlIGNvcHlyaWdodCB0byB5b3VyIGNvbnRyaWJ1dGlvbjsKK3RoaXMgc2ltcGx5IGdpdmVzIHVzIHBlcm1pc3Npb24gdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgeW91ciBjb250cmlidXRpb25zIGFzCitwYXJ0IG9mIHRoZSBwcm9qZWN0LiBIZWFkIG92ZXIgdG8gPGh0dHBzOi8vY2xhLmRldmVsb3BlcnMuZ29vZ2xlLmNvbS8+IHRvIHNlZQoreW91ciBjdXJyZW50IGFncmVlbWVudHMgb24gZmlsZSBvciB0byBzaWduIGEgbmV3IG9uZS4KKworWW91IGdlbmVyYWxseSBvbmx5IG5lZWQgdG8gc3VibWl0IGEgQ0xBIG9uY2UsIHNvIGlmIHlvdSd2ZSBhbHJlYWR5IHN1Ym1pdHRlZCBvbmUKKyhldmVuIGlmIGl0IHdhcyBmb3IgYSBkaWZmZXJlbnQgcHJvamVjdCksIHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGRvIGl0CithZ2Fpbi4KKworIyMgQ29kZSByZXZpZXdzCisKK0FsbCBzdWJtaXNzaW9ucywgaW5jbHVkaW5nIHN1Ym1pc3Npb25zIGJ5IHByb2plY3QgbWVtYmVycywgcmVxdWlyZSByZXZpZXcuIFdlCit1c2UgR2l0SHViIHB1bGwgcmVxdWVzdHMgZm9yIHRoaXMgcHVycG9zZS4gQ29uc3VsdAorW0dpdEh1YiBIZWxwXShodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9hYm91dC1wdWxsLXJlcXVlc3RzLykgZm9yIG1vcmUKK2luZm9ybWF0aW9uIG9uIHVzaW5nIHB1bGwgcmVxdWVzdHMuCisKKyMjIENvbW11bml0eSBHdWlkZWxpbmVzCisKK1RoaXMgcHJvamVjdCBmb2xsb3dzIFtHb29nbGUncyBPcGVuIFNvdXJjZSBDb21tdW5pdHkKK0d1aWRlbGluZXNdKGh0dHBzOi8vb3BlbnNvdXJjZS5nb29nbGUuY29tL2NvbmR1Y3QvKS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9MSUNFTlNFIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9MSUNFTlNFCkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL01FVEFEQVRBIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL01FVEFEQVRBCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDhhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvTUVUQURBVEEKQEAgLTAsMCArMSwxMiBAQAorbmFtZTogIlVrZXkyIgorZGVzY3JpcHRpb246CisgICAgIlVLRVkyIGlzIGEgRGlmZmllLUhlbGxtYW4gYmFzZWQgYXV0aGVudGljYXRlZCBrZXkgZXhjaGFuZ2UgcHJvdG9jb2wuIgorCit0aGlyZF9wYXJ0eSB7CisgIHVybCB7CisgICAgdHlwZTogQVJDSElWRQorICAgIHZhbHVlOiAiaHR0cHM6Ly91c2VyLmdpdC5jb3JwLmdvb2dsZS5jb20vbWljaGFscC91a2V5Mi8iCisgIH0KKyAgdmVyc2lvbjogIjEuMCIKKyAgbGFzdF91cGdyYWRlX2RhdGUgeyB5ZWFyOiAyMDE4IG1vbnRoOiAxMiBkYXk6IDI4IH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvTk9USUNFIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL05PVElDRQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43YTY5NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL05PVElDRQpAQCAtMCwwICsxIEBACitMSUNFTlNFClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL1JFQURNRSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9SRUFETUUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTYzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzI5IEBACisjIFVrZXkyCitUaGlzIGlzIG5vdCBhbiBvZmZpY2lhbGx5IHN1cHBvcnRlZCBHb29nbGUgcHJvZHVjdAorCisqKkNvYXRob3JlZCBieToqKiBBbGV4ZWkgQ3plc2tpcywgVGhhaSBEdW9uZywgRWR1YXJkbycgVmVsYScnIFw8TmF2YVw+LCBhbmQgQWRhbSBTdHViYmxlZmllbGQuCisKKyoqU3RhdHVzOioqIEltcGxlbWVudGVkIGluIEphdmEgKGFjemVza2lzQGdvb2dsZS5jb20pCisKKyoqRGVzaWduIHJldmlld2VyczoqKiBUaGFpIER1b25nLCBCcnVubyBCbGFuY2hldCwgTWFydGluIEFiYWRpLCBhbmQgQm8gV2FuZworCisqKkltcGxlbWVudGF0aW9uIHJldmlld2VyKio6IFRoYWkgRHVvbmcKKworKipMYXN0IFVwZGF0ZWQ6Kiogcm91Z2hseSBpbiBTZXB0ZW1iZXIgMjAxNgorCisKKworIyBPdmVydmlldworCitVS0VZMiBpcyBhIERpZmZpZS1IZWxsbWFuIGJhc2VkIGF1dGhlbnRpY2F0ZWQga2V5IGV4Y2hhbmdlIHByb3RvY29sLgorCitBdCB0aGUgZW5kIG9mIGEgVUtFWTIgcnVuLCBhIGNsaWVudCBhbmQgc2VydmVyIGhhdmUgYSBzaGFyZWQgbWFzdGVyIHNlY3JldCB0aGF0IGNhbiBiZSB1c2VkIHRvCitkZXJpdmUga2V5cyB3aGljaCBjYW4gYmUgdXNlZCBpbiBhIHN1YnNlcXVlbnQgcHJvdG9jb2wuIFVLRVkyIG9ubHkgaW1wbGljaXRseSBndWFyYW50ZWVzIHRoYXQKK3NlcnZlcnMga25vdyB0aGF0IGNsaWVudHMgYmVsaWV2ZSB0aGUgcHJvdG9jb2wgZmluaXNoZWQgY29ycmVjdGx5OyB0aGF0IGlzLCB1bnRpbCBhIHNlcnZlcgorcmVjZWl2ZXMgYSBtZXNzYWdlIG9uIHRoZSBuZXh0IHByb3RvY29sIGZyb20gdGhlIGNsaWVudCBpdCBkb2VzIG5vdCBrbm93IHRoYXQgdGhlIGhhbmRzaGFrZQorY29tcGxldGVkLgorCitUaGUgaW50ZW5kZWQgdXNhZ2Ugb2YgVUtFWTIgaXMgdG8gZXN0YWJsaXNoIGEgc2VjdXJlIGNoYW5uZWwgYmV0d2VlbiB0d28gdXNlciBkZXZpY2VzLAorZS5nLiwgbGFwdG9wIHdpdGggQ2hyb21lY2FzdCwgcGhvbmUgd2l0aCBHb29nbGUgR2xhc3MsIGV0Yy4gVGhlIHNlY3VyZSBjaGFubmVsIHRoZW4gY2FuIGJlIHVzZWQgdG8KK3RyYW5zbWl0IHBhc3N3b3JkcyBvciBvdGhlciBjcmVkZW50aWFscy4gSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBvbmUgd2FudHMgdG8gY29ubmVjdCBhIGJyYW5kCisgbmV3IGRldmljZSB0byBhIHBhc3N3b3JkLXByb3RlY3RlZCBXSUZJIG5ldHdvcmsuICBVS0VZMiBpcyBhbHNvIHVzYWJsZSBvdmVyIGxvdy1iYW5kd2lkdGgKK3RyYW5zcG9ydHMgbGlrZSBCbHVldG9vdGggTG93IEVuZXJneSAoc2VlIFtQZXJmb3JtYW5jZV0oI3BlcmZvcm1hbmNlKSkuCisKKyMgTWVzc2FnZSBGcmFtaW5nCisKK0VhY2ggVUtFWTIgbWVzc2FnZSBpcyBmcmFtZWQgaW5zaWRlIGFuIG91dGVyIHByb3RvYnVmIG1lc3NhZ2U6CisKKworYGBgCittZXNzYWdlIFVrZXkyTWVzc2FnZSB7CisgIGVudW0gVHlwZSB7CisgICAgVU5LTk9XTl9ET19OT1RfVVNFID0gMDsKKyAgICBBTEVSVCA9IDE7CisgICAgQ0xJRU5UX0lOSVQgPSAyOworICAgIFNFUlZFUl9JTklUID0gMzsKKyAgICBDTElFTlRfRklOSVNIID0gNDsKKyAgfQorCisgIG9wdGlvbmFsIFR5cGUgbWVzc2FnZV90eXBlID0gMTsgICAvLyBJZGVudGlmaWVzIG1lc3NhZ2UgdHlwZQorICBvcHRpb25hbCBieXRlcyBtZXNzYWdlX2RhdGEgPSAyOyAgLy8gQWN0dWFsIG1lc3NhZ2UsIHRvIGJlIHBhcnNlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VfdHlwZQorfQorYGBgCisKKworCisjIEFsZXJ0cworCitJbiBjYXNlIGFuIGVycm9yIG9jY3VycywgdGhlIGNsaWVudCBhbmQgc2VydmVyIHdpbGwgcmVwbHkgd2l0aCBhbiBBbGVydDoKKworCitgYGAKK21lc3NhZ2UgVWtleTJBbGVydCB7CisgIGVudW0gQWxlcnRUeXBlIHsKKyAgICAvLyBGcmFtaW5nIGVycm9ycworICAgIEJBRF9NRVNTQUdFID0gMTsgICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2UgY291bGQgbm90IGJlIGRlc2VyaWFsaXplZAorICAgIEJBRF9NRVNTQUdFX1RZUEUgPSAyOyAgICAgICAgLy8gbWVzc2FnZV90eXBlIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUKKyAgICBJTkNPUlJFQ1RfTUVTU0FHRSA9IDM7ICAgICAgIC8vIG1lc3NhZ2VfdHlwZSByZWNlaXZlZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGF0IHRoaXMgc3RhZ2Ugb2YgdGhlIHByb3RvY29sCisgICAgQkFEX01FU1NBR0VfREFUQSA9IDQ7ICAgICAgICAvLyBDb3VsZCBub3QgZGVzZXJpYWxpemUgbWVzc2FnZV9kYXRhIGFzIHBlciB2YWx1ZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZV90eXBlCisKKyAgICAvLyBDbGllbnRJbml0IGFuZCBTZXJ2ZXJJbml0IGVycm9ycworICAgIEJBRF9WRVJTSU9OID0gMTAwOyAgICAgICAgICAgLy8gdmVyc2lvbiBpcyBpbnZhbGlkOyBzZXJ2ZXIgY2Fubm90IGZpbmQgc3VpdGFibGUgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc3BlYWsgd2l0aCBjbGllbnQuCisgICAgQkFEX1JBTkRPTSA9IDEwMTsgICAgICAgICAgICAvLyBSYW5kb20gZGF0YSBpcyBtaXNzaW5nIG9yIG9mIGluY29ycmVjdCBsZW5ndGgKKyAgICBCQURfSEFORFNIQUtFX0NJUEhFUiA9IDEwMjsgIC8vIE5vIHN1aXRhYmxlIGhhbmRzaGFrZSBjaXBoZXJzIHdlcmUgZm91bmQKKyAgICBCQURfTkVYVF9QUk9UT0NPTCA9IDEwMzsgICAgIC8vIFRoZSBuZXh0IHByb3RvY29sIGlzIG1pc3NpbmcsIHVua25vd24sIG9yIHVuc3VwcG9ydGVkCisgICAgQkFEX1BVQkxJQ19LRVkgPSAxMDQ7ICAgICAgICAvLyBUaGUgcHVibGljIGtleSBjb3VsZCBub3QgYmUgcGFyc2VkCisKKyAgICAvLyBPdGhlciBlcnJvcnMKKyAgICBJTlRFUk5BTF9FUlJPUiA9IDIwMDsgICAgICAgLy8gQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLiAgZXJyb3JfbWVzc2FnZSBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbiBhZGRpdGlvbmFsIGRldGFpbHMgZm9yIGxvZ2dpbmcgYW5kIGRlYnVnZ2luZy4KKyAgfQorCisgIG9wdGlvbmFsIEFsZXJ0VHlwZSB0eXBlID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGVycm9yX21lc3NhZ2UgPSAyOworfQorYGBgCisKKworVGhlIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBgQWxlcnRgIHRvIGJlIHNlbnQuIFVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yLAorY2xpZW50cyBhbmQgc2VydmVycyBzZW5kIGFuIEFsZXJ0IG9mIHRoZSBwcm9wZXIgdHlwZSBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb247IGFsbCBhbGVydHMgYXJlCitmYXRhbC4gVXBvbiByZWNlaXZpbmcgYW4gYEFsZXJ0YCwgY2xpZW50cyBhbmQgc2VydmVycyBtdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uLCBldmVuIGlmIHRoZXkKK2Nhbm5vdCBwYXJzZSB0aGUgYEFsZXJ0YC4gIFRoZSBgQWxlcnRgIG1lc3NhZ2UgbWF5IGNvbnRhaW4gYW4gb3B0aW9uYWwgYGVycm9yX21lc3NhZ2VgIHN0cmluZwordGhhdCBtYXkgYmUgdXNlZCB0byBkZXNjcmliZSBlcnJvciBkZXRhaWxzIGZvciBsb2dnaW5nLgorCisjIEhhbmRzaGFrZSBDaXBoZXJzdWl0ZXMKKworVUtFWTIgc3VwcG9ydHMgbmVnb3RpYXRpb24gb2YgdGhlIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlcyB1c2VkIGluIHRoZSBoYW5kc2hha2UuIFR3byBwcmltaXRpdmVzCithcmUgcmVxdWlyZWQsIGEgRGlmZmllLUhlbGxtYW4gZnVuY3Rpb24gYW5kIGEgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLCB3aGljaCBhcmUgcmVwcmVzZW50ZWQKK2J5IGEgc2luZ2xlIGVudW06CisKKworYGBgCitlbnVtIFVrZXkySGFuZHNoYWtlQ2lwaGVyIHsKKyAgUkVTRVJWRUQgPSAwOworICBQMjU2X1NIQTUxMiA9IDEwMDsgICAgICAgIC8vIE5JU1QgUC0yNTYgdXNlZCBmb3IgRUNESCwgU0hBNTEyIHVzZWQgZm9yIGNvbW1pdG1lbnQKKyAgQ1VSVkUyNTUxOV9TSEE1MTIgPSAyMDA7ICAvLyBDdXJ2ZSAyNTUxOSB1c2VkIGZvciBFQ0RILCBTSEE1MTIgdXNlZCBmb3IgY29tbWl0bWVudAorfQorYGBgCisKKworVGhlIGltcGxlbWVudGF0aW9ucyBvZiBhbGwgcHJpbWl0aXZlcyBtdXN0IHJlc2lzdCB0aW1pbmcgc2lkZS1jaGFubmVsIGF0dGFja3MuIEEgc3VtbWFyeSBvZgoraGFuZHNoYWtlIGNpcGhlcnN1aXRlIG5lZ290aWF0aW9uIGlzIChzZWUgQ2xpZW50SW5pdCBhbmQgU2VydmVySW5pdCBtZXNzYWdlcyBmb3IgZnVsbCBkZXRhaWxzKToKKworKiAgIFRoZSBjbGllbnQgZW51bWVyYXRlcyB0aGUgcHJpbWl0aXZlcyBpdCBzdXBwb3J0cyBhbmQgdGhlIHNlcnZlciBjaG9vc2UgdGhlIGhpZ2hlc3QgKGJ5IGVudW0gdmFsdWUpIGNpcGhlciB0aGF0IGl0IGFsc28gc3VwcG9ydHMuCisqICAgVGhlIHNlcnZlciByZXBsaWVzIHdpdGggYSBwdWJsaWMga2V5IHVzaW5nIHRoZSBjaG9zZW4gY2lwaGVyIGFuZCBzZW5kcyBpdHMgb3duIGxpc3Qgb2Ygc3VwcG9ydGVkIGhhbmRzaGFrZSBjaXBoZXIgc3VpdGVzIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gdmVyaWZ5IHRoYXQgdGhlIHJpZ2h0IHNlbGVjdGlvbiB3YXMgbWFkZS4KKworCisjIEhhbmRzaGFrZSBEZXRhaWxzCisKK1RoZSBVS0VZMiBoYW5kc2hha2UgY29uc2lzdHMgb2YgdGhyZWUgbWVzc2FnZXMuIEZpcnN0LCB0aGUgY2xpZW50IHNlbmRzIGEgYENsaWVudEluaXRgIG1lc3NhZ2UgdG8KK3RoZSBzZXJ2ZXIgLS0gY29uY2VwdHVhbGx5LCB0aGlzIGNvbnNpc3RzIG9mIGEgbGlzdCBvZiBjaXBoZXIgc3VpdGVzIGFuZCBhIGNvbW1pdG1lbnQgdG8gYW4KK2VwaGVtZXJhbCBwdWJsaWMga2V5IGZvciBlYWNoIHN1aXRlLiBUaGUgc2VydmVyIHJlc3BvbmRzIHdpdGggYSBgU2VydmVySW5pdGAgLS0gY29uY2VwdHVhbGx5LAordGhpcyBpcyB0aGUgc2VydmVyJ3MgY2hvc2VuIGNpcGhlciBzdWl0ZSBhbmQgYW4gZXBoZW1lcmFsIHB1YmxpYyBrZXkgZm9yIHRoZSBjaXBoZXIgc3VpdGVzCitzZWxlY3RlZCBieSB0aGUgc2VydmVyLiAgRmluYWxseSwgdGhlIGNsaWVudCByZXNwb25kcyB3aXRoIGEgYENsaWVudEZpbmlzaGVkYCAtLSBjb25jZXB0dWFsbHksCit0aGlzIGNvbnNpc3RzIG9mIGFuIGVwaGVtZXJhbCBwdWJsaWMga2V5IG1hdGNoaW5nIHRoZSBjaXBoZXIgc3VpdGUgc2VsZWN0ZWQgYnkgdGhlIHNlcnZlci4KKworQWZ0ZXIgdGhlIGhhbmRzaGFrZSwgYm90aCBjbGllbnQgYW5kIHNlcnZlciBkZXJpdmUgYXV0aGVudGljYXRpb24gc3RyaW5ncywgd2hpY2ggbWF5IGJlIHNob3duIHRvCit1c2VycyBmb3IgdmlzdWFsIGNvbXBhcmlzb24gb3Igc2VudCBvdmVyIHNvbWUgb3RoZXIgY2hhbm5lbCBpbiBvcmRlciB0byBhdXRoZW50aWNhdGUgdGhlIGhhbmRzaGFrZS4KK1RoZSBjbGllbnQgYW5kIHNlcnZlciBhbHNvIGRlcml2ZSBzZXNzaW9uIGtleXMgZm9yIHRoZSBuZXh0IHByb3RvY29sLgorCisjIyBUaGUgYENsaWVudEluaXRgIE1lc3NhZ2UKKworVGhlIGBDbGllbnRJbml0YCBtZXNzYWdlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworCitgYGAKK21lc3NhZ2UgVWtleTJDbGllbnRJbml0IHsKKyAgb3B0aW9uYWwgaW50MzIgdmVyc2lvbiA9IDE7ICAvLyBoaWdoZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIGZvciByb2xsYmFjayBwcm90ZWN0aW9uCisgIG9wdGlvbmFsIGJ5dGVzIHJhbmRvbSA9IDI7ICAgLy8gcmFuZG9tIGJ5dGVzIGZvciByZXBsYXkvcmV1c2UgcHJvdGVjdGlvbgorCisgIC8vIE9uZSBjb21taXRtZW50IChoYXNoIG9mIENsaWVudEZpbmlzaGVkIGNvbnRhaW5pbmcgcHVibGljIGtleSkgcGVyIHN1cHBvcnRlZCBjaXBoZXIKKyAgbWVzc2FnZSBDaXBoZXJDb21taXRtZW50IHsKKyAgICBvcHRpb25hbCBVa2V5MkhhbmRzaGFrZUNpcGhlciBoYW5kc2hha2VfY2lwaGVyID0gMTsKKyAgICBvcHRpb25hbCBieXRlcyBjb21taXRtZW50ID0gMjsKKyAgfQorICByZXBlYXRlZCBDaXBoZXJDb21taXRtZW50IGNpcGhlcl9jb21taXRtZW50cyA9IDM7CisKKyAgLy8gTmV4dCBwcm90b2NvbCB0aGF0IHRoZSBjbGllbnQgd2FudHMgdG8gc3BlYWsuCisgIG9wdGlvbmFsIHN0cmluZyBuZXh0X3Byb3RvY29sID0gNDsKK30KK2BgYAorCisKK1RoZSBgdmVyc2lvbmAgZmllbGQgaXMgdGhlIG1heGltdW0gdmVyc2lvbiB0aGF0IHRoZSBjbGllbnQgc3VwcG9ydHMuICBJdCBzaG91bGQgYmUgMSBmb3Igbm93LiBUaGUgYHJhbmRvbWAgZmllbGQgaXMgZXhhY3RseSAzMiBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIGJ5dGVzLiAgVGhlIGBjaXBoZXJfY29tbWl0bWVudGAgZmllbGQgaXMgYSBwcm90b2J1ZiBjb25zaXN0aW5nIG9mIGEgaGFuZHNoYWtlIGNpcGhlciBhbmQgYSBjb21taXRtZW50IHdoaWNoIGlzIGEgaGFzaCBvZiB0aGUgYENsaWVudEZpbmlzaGVkYCBtZXNzYWdlIHRoYXQgd291bGQgYmUgc2VudCBpZiB0aGUgY2lwaGVyIHdlcmUgc2VsZWN0ZWQgKHRoZSBzZXJpYWxpemVkLCBpbmNsdWRpbmcgZnJhbWluZywgcmF3IGJ5dGVzIG9mIHRoZSBsYXN0IGhhbmRzaGFrZSBtZXNzYWdlIHNlbnQgYnkgdGhlIGNsaWVudCksIGNhbGN1bGF0ZWQgd2l0aCB0aGUgaGFzaCBmdW5jdGlvbiBhbmQgdGhlIERpZmZpZS1IZWxsbWFuIGZ1bmN0aW9uIGZyb20gdGhlIGhhbmRzaGFrZSBjaXBoZXIuIFRoZSBjbGllbnQgaW5jbHVkZXMgZWFjaCBjb21taXRtZW50IGluIHRoZSBvcmRlciBvZiB0aGVpciBwcmVmZXJlbmNlLiAgTm90ZSB0aGF0IG9ubHkgb25lIGNvbW1pdG1lbnQgcGVyIGBoYW5kc2hha2VfY2lwaGVyYCBpcyBhbGxvd2VkLiAgVGhlIGNsaWVudCBhbHNvIGluY2x1ZGVzIHRoZSBgbmV4dF9wcm90b2NvbGAgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhhdCB0aGUgY2xpZW50IHdhbnRzIHRvIHVzZSB0byBzcGVhayB0byB0aGUgc2VydmVyLiAgTm90ZSB0aGF0IHRoaXMgcHJvdG9jb2wgbXVzdCBpbXBsaWNpdGx5IGltcGx5IGEga2V5IGxlbmd0aC4gIFVLRVkyLCBob3dldmVyLCBkb2VzIG5vdCBwcm92aWRlIGEgbmFtZXNwYWNlIGZvciB0aGUgYG5leHRfcHJvdG9jb2xgIHZhbHVlcyBpbiBvcmRlciB0byBwcm92aWRlIGxheWVycyBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIGhhbmRzaGFrZSBhbmQgdGhlIG5leHQgcHJvdG9jb2xzLgorCisKKyMjIEludGVycHJldGluZyBgQ2xpZW50SW5pdGAKKworVXBvbiByZWNlaXZpbmcgdGhlIGBDbGllbnRJbml0YCBtZXNzYWdlLCB0aGUgc2VydmVyIHNob3VsZDoKKworCisKKzEuICBEZXNlcmlhbGl6ZSB0aGUgcHJvdG9idWY7IHNlbmQgYW4gYEFsZXJ0LkJBRF9NRVNTQUdFYCBtZXNzYWdlIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKzEuICBWZXJpZnkgdGhhdCBgbWVzc2FnZV90eXBlID09IFR5cGUuQ0xJRU5UX0lOSVRgOyBzZW5kIGFuIGBBbGVydC5CQURfTUVTU0FHRV9UWVBFYCBtZXNzYWdlIGlmIG1pc21hdGNoIG9jY3Vycy4KKzEuICBEZXNlcmlhbGl6ZSBgbWVzc2FnZV9kYXRhYCBhcyBhIGBDbGllbnRJbml0YCBtZXNzYWdlOyBzZW5kIGFuIGBBbGVydC5CQURfTUVTU0FHRV9EQVRBYCBtZXNzYWdlIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKzEuICBDaGVjayB0aGF0IGB2ZXJzaW9uID09IDFgOyBzZW5kIGBBbGVydC5CQURfVkVSU0lPTmAgbWVzc2FnZSBpZiBtaXNtYXRjaC4KKzEuICBDaGVjayB0aGF0IGByYW5kb21gIGlzIGV4YWN0bHkgMzIgYnl0ZXM7IHNlbmQgYEFsZXJ0LkJBRF9SQU5ET01gIG1lc3NhZ2UgaWYgbm90LgorMS4gIENoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIGBoYW5kc2hha2VfY2lwaGVyYCBpbiBgY2lwaGVyX2NvbW1pdG1lbnRgIGFyZSBhY2NlcHRhYmxlLiBTZXJ2ZXJzIHNob3VsZCBzZWxlY3QgdGhlIGZpcnN0IGBoYW5kc2hha2VfY2lwaGVyYCB0aGF0IGl0IGZpbmRzIGFjY2VwdGFibGUgdG8gc3VwcG9ydCBjbGllbnRzIHNpZ25hbGluZyBkZXByZWNhdGVkIGJ1dCBzdXBwb3J0ZWQgSGFuZHNoYWtlQ2lwaGVycy4gSWYgbm8gYGhhbmRzaGFrZV9jaXBoZXJgIGlzIGFjY2VwdGFibGUgKG9yIHRoZXJlIGFyZSBubyBIYW5kc2hha2VDaXBoZXJzIGluIHRoZSBtZXNzYWdlKSwgdGhlIHNlcnZlciBzZW5kcyBhbiBgQWxlcnQuQkFEX0hBTkRTSEFLRV9DSVBIRVJgIG1lc3NhZ2UuCisxLiAgQ2hlY2tzIHRoYXQgYG5leHRfcHJvdG9jb2xgIGNvbnRhaW5zIGEgcHJvdG9jb2wgdGhhdCB0aGUgc2VydmVyIHN1cHBvcnRzLiAgU2VuZCBhbiBgQWxlcnQuQkFEX05FWFRfUFJPVE9DT0xgIG1lc3NhZ2UgaWYgbm90LgorCitJZiBubyBhbGVydHMgaGF2ZSBiZWVuIHNlbnQsIHRoZSBzZXJ2ZXIgcmVwbGllcyB3aXRoIHRoZSBgU2VydmVySW5pdGAgbWVzc2FnZS4KKworCisjIyBUaGUgYFNlcnZlckluaXRgIE1lc3NhZ2UgCisKK1RoZSBgU2VydmVySW5pdGAgbWVzc2FnZSBpcyBhcyBmb2xsb3dzCisKKworYGBgCittZXNzYWdlIFVrZXkyU2VydmVySW5pdCB7CisgIG9wdGlvbmFsIGludDMyIHZlcnNpb24gPSAxOyAgLy8gaGlnaGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiBmb3Igcm9sbGJhY2sgcHJvdGVjdGlvbgorICBvcHRpb25hbCBieXRlcyByYW5kb20gPSAyOyAgIC8vIHJhbmRvbSBieXRlcyBmb3IgcmVwbGF5L3JldXNlIHByb3RlY3Rpb24KKworICAvLyBTZWxlY3RlZCBDaXBoZXIgYW5kIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleQorICBvcHRpb25hbCBVa2V5MkhhbmRzaGFrZUNpcGhlciBoYW5kc2hha2VfY2lwaGVyID0gMzsKKyAgb3B0aW9uYWwgYnl0ZXMgcHVibGljX2tleSA9IDQ7Cit9CitgYGAKKworCitGb3Igbm93LCBgdmVyc2lvbmAgbXVzdCBiZSAxLiAgVGhlIHJhbmRvbSBmaWVsZCBpcyBleGFjdGx5IDMyIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20KK2J5dGVzLiAgVGhlIGBoYW5kc2hha2VfY2lwaGVyYCBmaWVsZCBjb250YWlucyB0aGUgc2VydmVyLWNob3NlbiBgSGFuZHNoYWtlQ2lwaGVyYC4gIFRoZQorYHB1YmxpY19rZXlgIGZpZWxkIGNvbnRhaW5zIHRoZSBzZXJ2ZXItY2hvc2VuIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleS4KKworCisjIyBJbnRlcnByZXRpbmcgYFNlcnZlckluaXRgCisKK1doZW4gYSBjbGllbnQgcmVjZWl2ZXMgYSBgU2VydmVySW5pdGAgYWZ0ZXIgaGF2aW5nIHNlbnQgYSBgQ2xpZW50SW5pdGAsIGl0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKworCisxLiAgRGVzZXJpYWxpemUgdGhlIHByb3RvYnVmOyBzZW5kIGFuIGBBbGVydC5CQURfTUVTU0FHRWAgbWVzc2FnZSBpZiBkZXNlcmlhbGl6YXRpb24gZmFpbHMuCisxLiAgVmVyaWZ5IHRoYXQgYG1lc3NhZ2VfdHlwZSA9PSBUeXBlLlNFUlZFUl9JTklUYDsgc2VuZCBhbiBgQWxlcnQuQkFEX01FU1NBR0VfVFlQRWAgbWVzc2FnZSBpZiBtaXNtYXRjaCBvY2N1cnMuCisxLiAgRGVzZXJpYWxpemUgYG1lc3NhZ2VfZGF0YWAgYXMgYSBgU2VydmVySW5pdGAgbWVzc2FnZTsgc2VuZCBhbiBgQWxlcnQuQkFEX01FU1NBR0VfREFUQWAgbWVzc2FnZSBpZiBkZXNlcmlhbGl6YXRpb24gZmFpbHMuCisxLiAgQ2hlY2sgdGhhdCBgdmVyc2lvbiA9PSAxYDsgc2VuZCBgQWxlcnQuQkFEX1ZFUlNJT05gIG1lc3NhZ2UgaWYgbWlzbWF0Y2guCisxLiAgQ2hlY2sgdGhhdCBgcmFuZG9tYCBpcyBleGFjdGx5IDMyIGJ5dGVzOyBzZW5kIGBBbGVydC5CQURfUkFORE9NYCBtZXNzYWdlIGlmIG5vdC4KKzEuICBDaGVjayB0aGF0IGBoYW5kc2hha2VfY2lwaGVyYCBtYXRjaGVzIGEgaGFuZHNoYWtlIGNpcGhlciB0aGF0IHdhcyBzZW50IGluCitgQ2xpZW50SW5pdC5jaXBoZXJfY29tbWl0bWVudHNgLiBJZiBub3QsIHNlbmQgYW4gYEFsZXJ0LkJBRF9IQU5EU0hBS0VDSVBIRVJgIG1lc3NhZ2UuCisxLiAgQ2hlY2sgdGhhdCBgcHVibGljX2tleWAgcGFyc2VzIGludG8gYSBjb3JyZWN0IHB1YmxpYyBrZXkgc3RydWN0dXJlLiAgSWYgbm90LCBzZW5kIGFuIGBBbGVydC5CQURfUFVCTElDX0tFWWAgbWVzc2FnZS4KKworSWYgbm8gYWxlcnRzIGhhdmUgYmVlbiBzZW50LCB0aGUgY2xpZW50IHJlcGxpZXMgd2l0aCB0aGUgYENsaWVudEZpbmlzaGVkYCBtZXNzYWdlLiAgQWZ0ZXIgc2VuZGluZwordGhlIGBDbGllbnRGaW5pc2hlZGAgbWVzc2FnZSwgdGhlIENsaWVudCBjb25zaWRlcnMgdGhlIGhhbmRzaGFrZSBjb21wbGV0ZS4KKworCisqKklNUE9SVEFOVDoqKiBUaGUgY2xpZW50IHNob3VsZCBjb21wdXRlIHRoZSBhdXRoZW50aWNhdGlvbiBzdHJpbmcgYEFVVEhfU1RSSU5HYCBhbmQKK3RoZSBuZXh0LXByb3RvY29sIHNlY3JldCBgTkVYVF9TRUNSRVRgIChzZWUgYmVsb3cpLiAgVGhlIGNsaWVudCBzaG91bGQgdXNlIGFuIG91dC1vZi1iYW5kCitjaGFubmVsIHRvIHZlcmlmeSB0aGUgYXV0aGVudGljYXRpb24gc3RyaW5nIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHRoZSBuZXh0IHByb3RvY29sLgorCisKKyMjIFRoZSBDbGllbnRGaW5pc2hlZCBNZXNzYWdlIAorCitUaGUgYENsaWVudEZpbmlzaGVkYCBtZXNzYWdlIGlzIGFzIGZvbGxvd3M6CisKKworYGBgCittZXNzYWdlIFVrZXkyQ2xpZW50RmluaXNoZWQgeworICBvcHRpb25hbCBieXRlcyBwdWJsaWNfa2V5ID0gMTsgIC8vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2VsZWN0ZWQgaGFuZHNoYWtlIGNpcGhlcgorfQorYGBgCisKKworVGhlIGBwdWJsaWNfa2V5YCBjb250YWlucyB0aGUgQ2xpZW50J3MgcHVibGljIGtleSAod2hvc2UgY29tbWl0bWVudCB3YXMgc2VudCBpbiB0aGUgYENsaWVudEluaXRgCittZXNzYWdlKSBmb3IgdGhlIHNlcnZlci1zZWxlY3RlZCBoYW5kc2hha2UgY2lwaGVyLgorCisKKyMjIEludGVycHJldGluZyBDbGllbnRGaW5pc2hlZCAKKworV2hlbiBhIHNlcnZlciByZWNlaXZlcyBhIGBDbGllbnRGaW5pc2hlZGAgYWZ0ZXIgaGF2aW5nIHNlbnQgYSBgU2VydmVySW5pdGAsIGl0IHBlcmZvcm1zIHRoZQorZm9sbG93aW5nIGFjdGlvbnM6CisKKworMS4gIERlc2VyaWFsaXplIHRoZSBwcm90b2J1ZjsgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKzEuICBWZXJpZnkgdGhhdCBgbWVzc2FnZV90eXBlID09IFR5cGUuQ0xJRU5UX0ZJTklTSEVEYDsgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uIGlmIG1pc21hdGNoIG9jY3Vycy4KKzEuICBWZXJpZnkgdGhhdCB0aGUgaGFzaCBvZiB0aGUgYENsaWVudEZpbmlzaGVkYCBtYXRjaGVzIHRoZSBleHBlY3RlZCBjb21taXRtZW50IGZvciB0aGUgY2hvc2VuIGBoYW5kc2hha2VfY2lwaGVyYCBmcm9tIGBDbGllbnRJbml0YC4gIFRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiBpZiB0aGUgZXhwZWN0ZWQgbWF0Y2ggZmFpbHMuCisxLiAgRGVzZXJpYWxpemUgYG1lc3NhZ2VfZGF0YWAgYXMgYSBgQ2xpZW50RmluaXNoZWRgIG1lc3NhZ2U7IHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiBpZiBkZXNlcmlhbGl6YXRpb24gZmFpbHMuCisxLiAgQ2hlY2sgdGhhdCBgcHVibGljX2tleWAgcGFyc2VzIGludG8gYSBjb3JyZWN0IHB1YmxpYyBrZXkgc3RydWN0dXJlLiAgSWYgbm90LCB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uCisKK05vdGUgdGhhdCBiZWNhdXNlIHRoZSBjbGllbnQgaXMgbm90IGV4cGVjdGluZyBhIHJlc3BvbnNlLCBhbnkgZXJyb3IgcmVzdWx0cyBpbiBjb25uZWN0aW9uIHRlcm1pbmF0aW9uLgorCitBZnRlciBwYXJzaW5nIHRoZSBgQ2xpZW50RmluaXNoZWRgIG1lc3NhZ2UsIHRoZSBTZXJ2ZXIgY29uc2lkZXJzIHRoZSBoYW5kc2hha2UgY29tcGxldGUuCisKKworKipJTVBPUlRBTlQ6KiogVGhlIHNlcnZlciBzaG91bGQgY29tcHV0ZSB0aGUgYXV0aGVudGljYXRpb24gc3RyaW5nIGBBVVRIX1NUUklOR2AgYW5kIHRoZQorbmV4dC1wcm90b2NvbCBzZWNyZXQgYE5FWFRfU0VDUkVUYCAoc2VlIGJlbG93KS4gIFRoZSBzZXJ2ZXIgc2hvdWxkIHVzZSBhbiBvdXQtb2YtYmFuZCBjaGFubmVsIHRvCit2ZXJpZnkgdGhlIGF1dGhlbnRpY2F0aW9uIHN0cmluZyBiZWZvcmUgcHJvY2VlZGluZyB0byB0aGUgbmV4dCBwcm90b2NvbC4KKworCisjIERlcml2aW5nIHRoZSBBdXRoZW50aWNhdGlvbiBTdHJpbmcgYW5kIHRoZSBOZXh0LVByb3RvY29sIFNlY3JldAorCitMZXQgYERIU2AgPSB0aGUgbmVnb3RpYXRlZCBEaWZmaWUtSGVsbG1hbiBrZXkgZGVyaXZlZCBmcm9tIHRoZSBDbGllbnQgYW5kIFNlcnZlciBwdWJsaWMga2V5cy4KKworTGV0IGBNXzFgID0gdGhlIHNlcmlhbGl6ZWQgKGluY2x1ZGluZyBmcmFtaW5nKSByYXcgYnl0ZXMgb2YgdGhlIGZpcnN0IG1lc3NhZ2Ugc2VudCBieQordGhlIGNsaWVudAorCitMZXQgYE1fMmAgPSB0aGUgc2VyaWFsaXplZCAoaW5jbHVkaW5nIGZyYW1pbmcpIHJhdyBieXRlcyBvZiB0aGUgZmlyc3QgbWVzc2FnZSBzZW50IGJ5Cit0aGUgc2VydmVyCisKK0xldCBgSGFzaGAgPSB0aGUgaGFzaCBmcm9tIEhhbmRzaGFrZUNpcGhlcgorCitMZXQgYExfYXV0aGAgPSBsZW5ndGggb2YgYXV0aGVudGljYXRpb24gc3RyaW5nIGluIGJ5dGVzLiAgTm90ZSB0aGF0IHRoaXMgbGVuZ3RoIGNhbgorYmUgc2hvcnQgKGUuZy4sIGEgNiBkaWdpdCB2aXN1YWwgY29uZmlybWF0aW9uIGNvZGUpLgorCitMZXQgYExfbmV4dGAgPSBsZW5ndGggb2YgbmV4dCBwcm90b2NvbCBrZXkKKworTGV0IGBIS0RGLUV4dHJhY3RgIGFuZCBgSEtERi1FeHBhbmRgIGJlIGFzIGRlZmluZWQgaW4gW1JGQzU4NjldKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1ODY5KQoraW5zdGFudGlhdGVkIHdpdGggdGhlIGhhc2ggZnJvbSB0aGUgYEhhbmRzaGFrZUNpcGhlcmAuCisKK0xldCBgUFJLX0FVVEggPSBIS0RGLUV4dHJhY3QoIlVLRVkyIHYxIGF1dGgiLCBESFMpYAorCitMZXQgYFBSS19ORVhUID0gSEtERi1FeHRyYWN0KCJVS0VZMiB2MSBuZXh0IiwgREhTKWAKKworVGhlbiBgQVVUSF9TVFJJTkcgPSBIS0RGLUV4cGFuZChQUktfQVVUSCwgTV8xfE1fMiwgTF9hdXRoKWAKKworVGhlbiBgTkVYVF9TRUNSRVQgPSBIS0RGLUV4cGFuZChQUktfTkVYVCwgTV8xfE1fMiwgTF9uZXh0KWAKKworCisjIFNlY3VyaXR5IERpc2N1c3Npb24KKworSWYgY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRlIG9uZS1hbm90aGVyIHVzaW5nIHRoZSBgQVVUSF9TVFJJTkdgIHRocm91Z2ggYW4gb3V0LW9mLWJhbmQKK21lY2hhbmlzbSwgd2UgYmVsaWV2ZSB0aGF0IHRoaXMgaGFuZHNoYWtlIGlzIHJlc2lzdGFudCB0byBhbiBhY3RpdmUgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrZXIuCitUaGUgYXR0YWNrZXIsIHdoZXRoZXIgaGUvc2hlIHBsYXlzIHRoZSByb2xlIG9mIHRoZSBjbGllbnQgb3Igc2VydmVyLCBpcyBmb3JjZWQgdG8gY29tbWl0IHRvIGEKK3B1YmxpYyBrZXkgYmVmb3JlIHNlZWluZyB0aGUgb3RoZXItcGFydHkncyBwdWJsaWMga2V5LgorCitUaGUgYXV0aGVudGljYXRpb24gc3RyaW5nIGFuZCBuZXh0IHNlY3JldCBhcmUgY29tcHV0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGtub3dsZWRnZSBvZiBvbmUgZG9lcworbm90IGFsbG93IGFuIGF0dGFja2VyIHRvIGNvbXB1dGUgdGhlIG90aGVyLiAgVGhhdCBpcywgaWYgdGhlIGF0dGFja2VyIG9ic2VydmVkIHRoZSBgQVVUSF9TVFJJTkdgCisoaWYgaXQgd2FzIHNob3duIG9uIGEgbW9uaXRvciBmb3IgZXhhbXBsZSksIHRoZSBhdHRhY2tlciBjb3VsZCBub3QgY29tcHV0ZSBgTkVYVF9TRUNSRVRgLgorRnVydGhlcm1vcmUsIGJvdGggdGhlIGF1dGhlbnRpY2F0aW9uIHN0cmluZyBhbmQgbmV4dCBzZWNyZXQgZGVwZW5kIG9uIHRoZSBmdWxsIGhhbmRzaGFrZQordHJhbnNjcmlwdCAtLSBhIG1hbmlwdWxhdGlvbiBvZiBhbnkgaGFuZHNoYWtlIG1lc3NhZ2UgYnkgYW4gYWR2ZXJzYXJ5IHdvdWxkIGNoYW5nZSBib3RoIHRoZQorIGF1dGhlbnRpY2F0aW9uIHN0cmluZyBhbmQgdGhlIG5leHQgc2VjcmV0LiAgTm90ZSB0aGF0IGFsdGhvdWdoIHRoZSBsYXN0IG1lc3NhZ2UgaXMgbm90IGRpcmVjdGx5CisgaW5jbHVkZWQgaW4gdGhlIEhLREYgY29tcHV0YXRpb24sIGl0IGlzIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIGNvbW1pdG1lbnQgc2VudCBpbiBgTV8xLmAKKworQHNoYWJzaSBwb2ludGVkIG91dCB0aGF0IGJ5IGhhdmluZyB0aGUgYEhLREZgIGluZm8gZmllbGQgaGF2ZSBiaXRzIHRoYXQgYWxzbyBnbyBpbnRvIG1ha2luZyB0aGUKK2BQUktgLCB0aGlzIHZpb2xhdGVzIHNvbWUgc2VjdXJpdHkgcHJvb2YuICBUaG9zZSAic2hhcmVkIiBiaXRzIGFyZSB0aGUgcHVibGljIGtleXMgdGhhdCBhcmUgc2VudAoraW4gYE1fMmAgYW5kIGBNXzNgIGFuZCBhcmUgYWxzbyB1c2VkIHRvIGRlcml2ZSB0aGUgREhTLiAgVGhvdWdoIHRoZSAicHJvb2YiIG1heQorIG5vdCBob2xkIGluIHRoZW9yeSwgd2UgZG8gYmVsaWV2ZSB0aGUgc2VjdXJpdHkgb2YgdGhlIGhhbmRzaGFrZSBpcyBtYWludGFpbmVkIGluIHByYWN0aWNlLgorCitBIG5hdHVyYWwgcXVlc3Rpb24gbWF5IGJlIHdoeSB3ZSBkaWRuJ3QgdXNlCitbU2hvcnQgQXV0aGVudGljYXRpb24gU3RyaW5nc10oaHR0cHM6Ly93d3cuaWFjci5vcmcvYXJjaGl2ZS9jcnlwdG8yMDA1LzM2MjEwMzAzLzM2MjEwMzAzLnBkZikKKyhTQVMpLiAgVGhlIGFuc3dlciBpcyB0d28tZm9sZC4gIEZpcnN0LCB0cmFkaXRpb25hbCBTQVMgZG9lcyBub3QgaW5jb3Jwb3JhdGUgYSBrZXkgZXhjaGFuZ2UsIG9ubHkKK2F1dGhlbnRpY2F0aW9uOyBVS0VZMiBwcm92aWRlcyBib3RoLiAgU2Vjb25kLCB0aGUgcGFwZXIgZG9lcyBub3QgZ2l2ZSBjb25jcmV0ZSBwcmltaXRpdmVzLAoraW5zdGVhZCBkZXNjcmliaW5nIGFic3RyYWN0IGZ1bmN0aW9ucyBzdWNoIGFzIGBjb21taXQoKSBgYW5kIGBvcGVuKClgLiAgT25lIGNvbmNyZXRlCitpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgd291bGQgbG9vayBzaW1pbGFyIHRvIHdoYXQgVUtFWTIgZG9lcy4KKworQnJ1bm8gQmxhbmNoZXQgcGVyZm9ybWVkIGEgZm9ybWFsIHByb29mIG9mIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIFVLRVkyLgorCisjIFBlcmZvcm1hbmNlCisKK1RoZSBtZXNzYWdlcyBhcmUgZmFpcmx5IGNvbXBhY3QuICBSdW5uaW5nIGEgdGVzdCB3aGVyZSB0aGUgY2xpZW50IHNlbnQgYSBzaW5nbGUgY29tbWl0bWVudCBmb3IgYQorYFAyNTZfU0hBNTEyYCBjaXBoZXIgYW5kIHRoZSBgbmV4dF9wcm90b2NvbGAgd2FzIHNldCB0byAiYEFFU18yNTZfQ0JDLUhNQUNfU0hBMjU2ImAsIHRoZSB0b3RhbAorc2l6ZSBvZiB0aGUgbWVzc2FnZXMgd2VyZToKKworCit8IE1lc3NhZ2UgICAgICAgIHwgTGVuZ3RoIGluIEJ5dGVzIHwKK3w6LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS06fAorfGBDbGllbnRJbml0YCAgICB8IDEzNiAgICAgICAgICAgICB8Cit8YFNlcnZlckluaXRgICAgIHwgMTE3ICAgICAgICAgICAgIHwKK3xgQ2xpZW50RmluaXNoZWRgfCA3OSAgICAgICAgICAgICAgfAorCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9idWlsZC5ncmFkbGUgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDZlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMjMgQEAKK2FwcGx5IHBsdWdpbjogJ2phdmEnCithcHBseSBwbHVnaW46ICdjb20uZ29vZ2xlLnByb3RvYnVmJworCityZXBvc2l0b3JpZXMgeworICAgIGpjZW50ZXIoKQorfQorCitidWlsZHNjcmlwdCB7CisgIHJlcG9zaXRvcmllcyB7CisgICAgamNlbnRlcigpCisgIH0KKyAgZGVwZW5kZW5jaWVzIHsKKyAgICBjbGFzc3BhdGggJ2NvbS5nb29nbGUucHJvdG9idWY6cHJvdG9idWYtZ3JhZGxlLXBsdWdpbjowLjguNycKKyAgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNvbXBpbGUgICJjb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3M6anNyMzA1OjMuMC4wIgorICAgIGNvbXBpbGUgImNvbS5nb29nbGUucHJvdG9idWY6cHJvdG9idWYtamF2YTozLjQuMCIKKyAgICBjb21waWxlICJjb20uZ29vZ2xlLmd1YXZhOmd1YXZhOnIwNSIKK30KKworCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjLy5ncmFkbGUvMy4yLjEvdGFza0FydGlmYWN0cy9maWxlU25hcHNob3RzLmJpbiBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvLmdyYWRsZS8zLjIuMS90YXNrQXJ0aWZhY3RzL2ZpbGVTbmFwc2hvdHMuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2MxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjLy5ncmFkbGUvMy4yLjEvdGFza0FydGlmYWN0cy9maWxlU25hcHNob3RzLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjLy5ncmFkbGUvMy4yLjEvdGFza0FydGlmYWN0cy90YXNrQXJ0aWZhY3RzLmJpbiBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvLmdyYWRsZS8zLjIuMS90YXNrQXJ0aWZhY3RzL3Rhc2tBcnRpZmFjdHMuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjU0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjLy5ncmFkbGUvMy4yLjEvdGFza0FydGlmYWN0cy90YXNrQXJ0aWZhY3RzLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjLy5ncmFkbGUvMy4yLjEvdGFza0FydGlmYWN0cy90YXNrQXJ0aWZhY3RzLmxvY2sgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjLy5ncmFkbGUvMy4yLjEvdGFza0FydGlmYWN0cy90YXNrQXJ0aWZhY3RzLmxvY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhMmE5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvLmdyYWRsZS8zLjIuMS90YXNrQXJ0aWZhY3RzL3Rhc2tBcnRpZmFjdHMubG9jawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL0NyeXB0b0Fubm90YXRpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvYW5ub3RhdGlvbnMvQ3J5cHRvQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDIzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL0NyeXB0b0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKK3BhY2thZ2UgY29tLmdvb2dsZS5zZWN1cml0eS5hbm5vdGF0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIENyeXB0byBLZXkgQW5ub3RhdGlvbjogTGFiZWwgYW55IGNyeXB0b2dyYXBoaWMga2V5cyBpbiBjb2RlIHdpdGggdGhpcyAKKyAqIGFubm90YXRpb24uIFRoaXMgd2lsbCBoZWxwIGlkZW50aWZ5IGNyeXB0b2dyYXBoaWMga2V5cyB0aGF0IGFyZSBleHBvc2VkIGluIAorICogc291cmNlIGNvZGUuIEtleXMgaW4gc291cmNlIGNvZGUgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIGFuIG93bmVyLCBwdXJwb3NlLAorICogcmVtb3ZhbCBwcmlvcml0eSwgYW5kIGxlYWsgc2V2ZXJpdHkuCisgKiAKKyAqIEV4YW1wbGUgb2YgdXNhZ2U6CisgKiAgQENyeXB0b0Fubm90YXRpb24oCisgKiAgICAgcHVycG9zZSA9IENyeXB0b0Fubm90YXRpb24uUHVycG9zZS5BVVRIRU5USUNBVElPTiwKKyAqICAgICBvd25lciA9ICJzd2VpcyIsCisgKiAgICAgYnVnSWQgPSA3MDQxMjQzLAorICogICAgIGxlYWtTZXZlcml0eSA9IENyeXB0b0Fubm90YXRpb24uTGVha1NldmVyaXR5LlMyLAorICogICAgIHJlbW92YWxQcmlvcml0eSA9IENyeXB0b0Fubm90YXRpb24uUmVtb3ZhbFByaW9yaXR5LlAxLAorICogICAgIGRlc2NyaXB0aW9uID0gIlRoaXMga2V5IGlzIHVzZWQgdG8gc2lnbiBibGFoIGJsYWggYmxhaC4iCisgKiAgICAgcmVtb3ZhbERhdGUgPSAiOS8yMDA3CisgKiApCisgKiBieXRlW10ga2V5Qnl0ZXMgPSB7MHhERSwgMHhBRCwgMHhCRSwgMHhFRn07CisgKiAKKyAqIEBhdXRob3Igc3dlaXNAZ29vZ2xlLmNvbSAoU3RldmUgV2VpcykKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorQFRhcmdldCh7RWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLkxPQ0FMX1ZBUklBQkxFfSkKK3B1YmxpYyBAaW50ZXJmYWNlIENyeXB0b0Fubm90YXRpb24geworICAvKgorICAgKiBLZXlzIHdpdGggImVuY3J5cHRpb24iIGFuZCAiYXV0aGVudGljYXRpb24iIHB1cnBvc2VzIHNob3VsZCBiZSByZW1vdmVkCisgICAqIGZyb20gc291cmNlIGNvZGUuCisgICAqIAorICAgKiBLZXlzIHdpdGggIm9iZnVzY2F0aW9uIiBhbmQgImludGVncml0eSBjaGVjayIgcHVycG9zZXMgZG8gbm90IG5lY2Vzc2FyaWx5CisgICAqIG5lZWQgdG8gYmUgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nLiBUaGV5IG1heSBvciBtYXkgbm90IGJlIHJlbW92ZWQgZnJvbQorICAgKiBjb2RlIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHRoZSBjb2RlIG93bmVyLgorICAgKi8KKyAgcHVibGljIGVudW0gUHVycG9zZSB7RU5DUllQVElPTiwgQVVUSEVOVElDQVRJT04sIE9CRlVTQ0FUSU9OLAorICAgIElOVEVHUklUWV9DSEVDSywgUEFTU1dPUkQsIE9USEVSfQorICBwdWJsaWMgZW51bSBMZWFrU2V2ZXJpdHkge1MwLCBTMSwgUzIsIFMzLCBTNCwgTm9SaXNrfQorICBwdWJsaWMgZW51bSBSZW1vdmFsUHJpb3JpdHkge1AwLCBQMSwgUDIsIFAzLCBQNCwgV2lsbE5vdEZpeH0KKyAgCisgIExlYWtTZXZlcml0eSBsZWFrU2V2ZXJpdHkoKTsKKyAgUmVtb3ZhbFByaW9yaXR5IHJlbW92YWxQcmlvcml0eSgpOworICBpbnQgYnVnSWQoKSBkZWZhdWx0IDA7CisgIFN0cmluZyBvd25lcigpOyAvLyBXaWxsIGJlIGNvbnRhY3RlZCBpbiB0aGUgZXZlbnQgYSBrZXkgaXMgbGVha2VkCisgIFB1cnBvc2UgcHVycG9zZSgpOworICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOworICBTdHJpbmcgcmVtb3ZhbERhdGUoKSBkZWZhdWx0ICIiOworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL1N1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlck5vUmV2aWV3LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL1N1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlck5vUmV2aWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkYzcxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvYW5ub3RhdGlvbnMvU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyTm9SZXZpZXcuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKKworLyoqCisgKiBUaGlzIGFubm90YXRpb24gaXMgdXNlZCB0byBkaXNhYmxlIHRoZSBJbnNlY3VyZUNpcGhlck1vZGUgRXJyb3IgUHJvbmUgY2hlY2tlciBmb3IgbGVnYWN5IGNvZGUKKyAqIHRoYXQgZGlkbid0IHVuZGVyZ28gYSBzZWN1cml0eSByZXZpZXcgYnkgSVNFLgorICoKKyAqIDxwPkEge0BsaW5rIENpcGhlcn0gb2JqZWN0IGlzIGNyZWF0ZWQgdXNpbmcgb25lIG9mIHRoZSBvdmVybG9hZHMgb2YgdGhlCisgKiB7QGxpbmsgQ2lwaGVyI2dldEluc3RhbmNlKCl9IG1ldGhvZC4gVGhpcyBtZXRob2QgdGFrZXMgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0cmFuc2Zvcm1lciBlaXRoZXIKKyAqIGFzIGEgdHJpcGxlICJBbGdvcml0aG0vTW9kZS9QYWRkaW5nIiBvciBqdXN0ICJBbGdvcml0aG0iLCB1c2luZyB0aGUgcHJvdmlkZXIncyBkZWZhdWx0IHNldHRpbmdzLgorICogVGhlIEluc2VjdXJlQ2lwaGVyTW9kZSBjaGVja2VyIGltcGxlbWVudGVkIGluIEVycm9yIFByb25lIGZsYWdzIGFsbCBjYWxsIHNpdGVzIG9mCisgKiB7QGxpbmsgQ2lwaGVyI2dldEluc3RhbmNlKCl9LCB3aGVyZSBlaXRoZXIgdGhlIGluc2VjdXJlIEVDQiBtb2RlIG9yIHRoZSBwcm92aWRlcidzIGRlZmF1bHQgbW9kZQorICogaXMgdXNlZC4gVGhpcyBtZXRob2QgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHN1cHByZXNzIHRoZSBFcnJvciBQcm9uZSBjaGVja2VyIGZvciBsZWdhY3kgY29kZQorICogd2l0aG91dCByZXZpZXcgYnkgSVNFLiBUaGUgYW5ub3RhdGlvbiBpcyBCVUlMRC12aXNpYmlsaXR5IHJlc3RyaWN0ZWQgYW5kIGV2ZXJ5IHVzZSBtdXN0IGJlIHZldHRlZAorICogYnkgdGhlIElTRSB0ZWFtLgorICoKKyAqIDxwPkV4YW1wbGUgb2YgdXNhZ2U6CisgKiA8cHJlPgorICoge0Bjb2RlCisgKiBAU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyTm9SZXZpZXcKKyAqIHByaXZhdGUgU3RyaW5nIGRlY3J5cHQoU3RyaW5nW10gaW5wdXQpIHsKKyAqIENpcGhlciBhZXNDaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOworICogYWVzQ2lwaGVyLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgbmV3IFNlY3JldEtleVNwZWMocmF3S2V5TWF0ZXJpYWwsICJBRVMiKSk7CisgKiAvLyAuLi4KKyAqIH0KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgYXZlbmV0QGdvb2dsZS5jb20gKEFybmF1ZCBKLiBWZW5ldCkKKyAqCisgKi8KK0BEb2N1bWVudGVkCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5QQVJBTUVURVIsIEVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SLAorICAgIEVsZW1lbnRUeXBlLkxPQ0FMX1ZBUklBQkxFfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlck5vUmV2aWV3IHt9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL1N1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclBlbmRpbmdSZXZpZXcuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvYW5ub3RhdGlvbnMvU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyUGVuZGluZ1Jldmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTU3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL1N1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclBlbmRpbmdSZXZpZXcuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKKworLyoqCisgKiBUaGlzIGFubm90YXRpb24gaXMgdXNlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZSBJbnNlY3VyZUNpcGhlck1vZGUgRXJyb3IgUHJvbmUgY2hlY2tlciB3aGlsZQorICogdGhlIHZpb2xhdGlvbiBpcyBiZWluZyByZXZpZXdlZCBieSBJU0UuIEEgY29tbWVudCBpbmNsdWRpbmcgYSB0cmFja2luZyBidWcgZm9yIHRoZSBvbmdvaW5nCisgKiBzZWN1cml0eSByZXZpZXcgc2hvdWxkIGFjY29tcGFueSB0aGUgYW5ub3RhdGlvbi4gSWYgdGhlIHNwZWNpZmljIHVzZSBpcyBkZWVtZWQgYSB2YWxpZCBleGNlcHRpb24KKyAqIGFmdGVyIHJldmlldywgdGhlIGFubm90YXRpb24gc2hvdWxkIGJlIGNoYW5nZWQgdG8gQFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclJldmlld2VkLgorICoKKyAqIDxwPkEge0BsaW5rIENpcGhlcn0gb2JqZWN0IGlzIGNyZWF0ZWQgdXNpbmcgb25lIG9mIHRoZSBvdmVybG9hZHMgb2YgdGhlCisgKiB7QGxpbmsgQ2lwaGVyI2dldEluc3RhbmNlKCl9IG1ldGhvZC4gVGhpcyBtZXRob2QgdGFrZXMgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0cmFuc2Zvcm1lciBlaXRoZXIKKyAqIGFzIGEgdHJpcGxlICJBbGdvcml0aG0vTW9kZS9QYWRkaW5nIiAgb3IganVzdCAiQWxnb3JpdGhtIiwgdXNpbmcgdGhlIHByb3ZpZGVyJ3MgZGVmYXVsdCBzZXR0aW5ncy4KKyAqIFRoZSBJbnNlY3VyZUNpcGhlck1vZGUgY2hlY2tlciBpbXBsZW1lbnRlZCBpbiBFcnJvciBQcm9uZSBmbGFncyBhbGwgY2FsbCBzaXRlcyBvZgorICoge0BsaW5rIENpcGhlciNnZXRJbnN0YW5jZSgpfSwgd2hlcmUgZWl0aGVyIHRoZSBpbnNlY3VyZSBFQ0IgbW9kZSBvciB0aGUgcHJvdmlkZXIncyBkZWZhdWx0IG1vZGUKKyAqIGlzIHVzZWQuIFRoaXMgbWV0aG9kIGFubm90YXRpb24gaXMgdXNlZCB0byBzdXBwcmVzcyB0aGUgRXJyb3IgUHJvbmUgY2hlY2tlciBpbiB1c2UgY2FzZXMgd2hlcmUgYW4KKyAqIGV4Y2VwdGlvbiBoYXMgYmVlbiBncmFudGVkIGJ5IElTRSBhZnRlciBwcm9wZXIgcmV2aWV3LiBUaGUgYW5ub3RhdGlvbiBpcyBCVUlMRC12aXNpYmlsaXR5CisgKiByZXN0cmljdGVkIGFuZCBldmVyeSB1c2UgbXVzdCBiZSB2ZXR0ZWQgYnkgdGhlIElTRSB0ZWFtLgorICoKKyAqIDxwPkV4YW1wbGUgb2YgdXNhZ2U6CisgKiA8cHJlPgorICoge0Bjb2RlCisgKiBAU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyUGVuZGluZ1JldmlldyAvLyBUcmFja2luZyBidWcgZm9yIHRoZSByZXZpZXc6IGIvLi4uCisgKiBwcml2YXRlIFN0cmluZyBkZWNyeXB0KFN0cmluZ1tdIGlucHV0KSB7CisgKiBDaXBoZXIgYWVzQ2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKCJBRVMiKTsKKyAqIGFlc0NpcGhlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIG5ldyBTZWNyZXRLZXlTcGVjKHJhd0tleU1hdGVyaWFsLCAiQUVTIikpOworICogLy8gLi4uCisgKiB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIGF2ZW5ldEBnb29nbGUuY29tIChBcm5hdWQgSi4gVmVuZXQpCisgKgorICovCitARG9jdW1lbnRlZAorQFRhcmdldCh7RWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSLCBFbGVtZW50VHlwZS5DT05TVFJVQ1RPUiwKKyAgICBFbGVtZW50VHlwZS5MT0NBTF9WQVJJQUJMRX0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCitwdWJsaWMgQGludGVyZmFjZSBTdXBwcmVzc0luc2VjdXJlQ2lwaGVyTW9kZUNoZWNrZXJQZW5kaW5nUmV2aWV3IHt9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL1N1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclJldmlld2VkLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2Fubm90YXRpb25zL1N1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclJldmlld2VkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3ODBjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvYW5ub3RhdGlvbnMvU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyUmV2aWV3ZWQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKKworLyoqCisgKiBUaGlzIGFubm90YXRpb24gaXMgdXNlZCB0byBkaXNhYmxlIHRoZSBJbnNlY3VyZUNpcGhlck1vZGUgRXJyb3IgUHJvbmUgY2hlY2tlciBhZnRlciBhIHByb3BlcgorICogcmV2aWV3IGJ5IElTRS4gQSBjb21tZW50IGluY2x1ZGluZyBhIHRyYWNraW5nIGJ1ZyBmb3IgdGhlIHNlY3VyaXR5IHJldmlldyBzaG91bGQgYWNjb21wYW55IHRoZQorICogYW5ub3RhdGlvbi4KKyAqCisgKiA8cD5BIHtAbGluayBDaXBoZXJ9IG9iamVjdCBpcyBjcmVhdGVkIHVzaW5nIG9uZSBvZiB0aGUgb3ZlcmxvYWRzIG9mIHRoZQorICoge0BsaW5rIENpcGhlciNnZXRJbnN0YW5jZSgpfSBtZXRob2QuIFRoaXMgbWV0aG9kIHRha2VzIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdHJhbnNmb3JtZXIgZWl0aGVyCisgKiBhcyBhIHRyaXBsZSAiQWxnb3JpdGhtL01vZGUvUGFkZGluZyIgIG9yIGp1c3QgIkFsZ29yaXRobSIsIHVzaW5nIHRoZSBwcm92aWRlcidzIGRlZmF1bHQgc2V0dGluZ3MuCisgKiBUaGUgSW5zZWN1cmVDaXBoZXJNb2RlIGNoZWNrZXIgaW1wbGVtZW50ZWQgaW4gRXJyb3IgUHJvbmUgZmxhZ3MgYWxsIGNhbGwgc2l0ZXMgb2YKKyAqIHtAbGluayBDaXBoZXIjZ2V0SW5zdGFuY2UoKX0sIHdoZXJlIGVpdGhlciB0aGUgaW5zZWN1cmUgRUNCIG1vZGUgb3IgdGhlIHByb3ZpZGVyJ3MgZGVmYXVsdCBtb2RlCisgKiBpcyB1c2VkLiBUaGlzIG1ldGhvZCBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3VwcHJlc3MgdGhlIEVycm9yIFByb25lIGNoZWNrZXIgaW4gdXNlIGNhc2VzIHdoZXJlIGFuCisgKiBleGNlcHRpb24gaGFzIGJlZW4gZ3JhbnRlZCBieSBJU0UgYWZ0ZXIgcHJvcGVyIHJldmlldy4gVGhlIGFubm90YXRpb24gaXMgQlVJTEQtdmlzaWJpbGl0eQorICogcmVzdHJpY3RlZCBhbmQgZXZlcnkgdXNlIG11c3QgYmUgdmV0dGVkIGJ5IHRoZSBJU0UgdGVhbS4KKyAqCisgKiA8cD5FeGFtcGxlIG9mIHVzYWdlOgorICogPHByZT4KKyAqIHtAY29kZQorICogQFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclJldmlld2VkIC8vIFRyYWNraW5nIGJ1ZyBmb3IgdGhlIHJldmlldzogYi8uLi4KKyAqIHByaXZhdGUgU3RyaW5nIGRlY3J5cHQoU3RyaW5nW10gaW5wdXQpIHsKKyAqIENpcGhlciBhZXNDaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOworICogYWVzQ2lwaGVyLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgbmV3IFNlY3JldEtleVNwZWMocmF3S2V5TWF0ZXJpYWwsICJBRVMiKSk7CisgKiAvLyAuLi4KKyAqIH0KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgYXZlbmV0QGdvb2dsZS5jb20gKEFybmF1ZCBKLiBWZW5ldCkKKyAqCisgKi8KK0BEb2N1bWVudGVkCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5QQVJBTUVURVIsIEVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SLAorICAgIEVsZW1lbnRUeXBlLkxPQ0FMX1ZBUklBQkxFfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclJldmlld2VkIHt9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRENvbm5lY3Rpb25Db250ZXh0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRENvbm5lY3Rpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwMjNhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJEQ29ubmVjdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uRGV2aWNlVG9EZXZpY2VNZXNzYWdlc1Byb3RvLkRldmljZVRvRGV2aWNlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlRyYW5zcG9ydENyeXB0b09wcy5QYXlsb2FkOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uVHJhbnNwb3J0Q3J5cHRvT3BzLlBheWxvYWRUeXBlOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CisKKy8qKgorICogVGhlIGZ1bGwgY29udGV4dCBvZiBhIHNlY3VyZSBjb25uZWN0aW9uLiBUaGlzIG9iamVjdCBoYXMgbWV0aG9kcyB0byBlbmNvZGUgYW5kIGRlY29kZSBtZXNzYWdlcworICogdGhhdCBhcmUgdG8gYmUgc2VudCB0byBhbm90aGVyIGRldmljZS4KKyAqCisgKiBTdWJjbGFzc2VzIGtlZXAgdHJhY2sgb2YgdGhlIGtleXMgc2hhcmVkIHdpdGggdGhlIG90aGVyIGRldmljZSwgYW5kIG9mIHRoZSBzZXF1ZW5jZSBpbiB3aGljaCB0aGUKKyAqIG1lc3NhZ2VzIGFyZSBleHBlY3RlZC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEQyRENvbm5lY3Rpb25Db250ZXh0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURjggPSAiVVRGLTgiOworICBwcml2YXRlIGZpbmFsIGludCBwcm90b2NvbFZlcnNpb247CisKKyAgcHJvdGVjdGVkIEQyRENvbm5lY3Rpb25Db250ZXh0KGludCBwcm90b2NvbFZlcnNpb24pIHsKKyAgICB0aGlzLnByb3RvY29sVmVyc2lvbiA9IHByb3RvY29sVmVyc2lvbjsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBEMkQgcHJvdG9jb2wuCisgICAqLworICBwdWJsaWMgaW50IGdldFByb3RvY29sVmVyc2lvbigpIHsKKyAgICByZXR1cm4gcHJvdG9jb2xWZXJzaW9uOworICB9CisKKyAgLyoqCisgICAqIE9uY2UgaW5pdGlhdG9yIGFuZCByZXNwb25kZXIgaGF2ZSBleGNoYW5nZWQgcHVibGljIGtleXMsIHVzZSB0aGlzIG1ldGhvZCB0byBlbmNyeXB0IGFuZAorICAgKiBzaWduIGEgcGF5bG9hZC4gQm90aCBpbml0aWF0b3IgYW5kIHJlc3BvbmRlciBkZXZpY2VzIGNhbiB1c2UgdGhpcyBtZXNzYWdlLgorICAgKgorICAgKiBAcGFyYW0gcGF5bG9hZCB0aGUgcGF5bG9hZCB0aGF0IHNob3VsZCBiZSBlbmNyeXB0ZWQuCisgICAqLworICBwdWJsaWMgYnl0ZVtdIGVuY29kZU1lc3NhZ2VUb1BlZXIoYnl0ZVtdIHBheWxvYWQpIHsKKyAgICBpbmNyZW1lbnRTZXF1ZW5jZU51bWJlckZvckVuY29kaW5nKCk7CisgICAgRGV2aWNlVG9EZXZpY2VNZXNzYWdlIG1lc3NhZ2UgPSBjcmVhdGVEZXZpY2VUb0RldmljZU1lc3NhZ2UoCisgICAgICAgIHBheWxvYWQsIGdldFNlcXVlbmNlTnVtYmVyRm9yRW5jb2RpbmcoKSk7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBEMkRDcnlwdG9PcHMuc2lnbmNyeXB0UGF5bG9hZCgKKyAgICAgICAgICBuZXcgUGF5bG9hZChQYXlsb2FkVHlwZS5ERVZJQ0VfVE9fREVWSUNFX01FU1NBR0UsCisgICAgICAgICAgICAgIG1lc3NhZ2UudG9CeXRlQXJyYXkoKSksCisgICAgICAgICAgZ2V0RW5jb2RlS2V5KCkpOworICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2Ugd2UgYWdyZWVkIG9uIHRoZSBrZXkgZWFybGllcgorICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFbmNyeXB0aW5nL3NpZ25pbmcgYSBzdHJpbmcgZm9yIHRyYW5zbWlzc2lvbiB0byBhbm90aGVyIGRldmljZS4KKyAgICoKKyAgICogQHNlZSAjZW5jb2RlTWVzc2FnZVRvUGVlcihieXRlW10pCisgICAqCisgICAqIEBwYXJhbSBwYXlsb2FkIHRoZSBwYXlsb2FkIHRoYXQgc2hvdWxkIGJlIGVuY3J5cHRlZC4KKyAgICovCisgIHB1YmxpYyBieXRlW10gZW5jb2RlTWVzc2FnZVRvUGVlcihTdHJpbmcgcGF5bG9hZCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gZW5jb2RlTWVzc2FnZVRvUGVlcihwYXlsb2FkLmdldEJ5dGVzKFVURjgpKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gLSB3ZSBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gVVRGLTgtZW5jb2RlIGEgc3RyaW5nCisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogT25jZSBJbml0aWF0b3JIZWxsbyBhbmQgUmVzcG9uZGVySGVsbG8oQW5kUGF5bG9hZCkgYXJlIGV4Y2hhbmdlZCwgdXNlIHRoaXMgbWV0aG9kCisgICAqIHRvIGRlY3J5cHQgYW5kIHZlcmlmeSBhIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgZGV2aWNlLiBCb3RoIGluaXRpYXRvciBhbmQKKyAgICogcmVzcG9uZGVyIGRldmljZSBjYW4gdXNlIHRoaXMgbWVzc2FnZS4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgZW5jcnlwdGVkLgorICAgKiBAdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBmcm9tIHRoZSByZW1vdGUgcGVlciBkaWQgbm90IHBhc3MgdmVyaWZpY2F0aW9uCisgICAqLworICBwdWJsaWMgYnl0ZVtdIGRlY29kZU1lc3NhZ2VGcm9tUGVlcihieXRlW10gbWVzc2FnZSkgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFBheWxvYWQgcGF5bG9hZCA9IEQyRENyeXB0b09wcy52ZXJpZnlkZWNyeXB0UGF5bG9hZChtZXNzYWdlLCBnZXREZWNvZGVLZXkoKSk7CisgICAgICBpZiAoIVBheWxvYWRUeXBlLkRFVklDRV9UT19ERVZJQ0VfTUVTU0FHRS5lcXVhbHMocGF5bG9hZC5nZXRQYXlsb2FkVHlwZSgpKSkgeworICAgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCJ3cm9uZyBtZXNzYWdlIHR5cGUgaW4gZGV2aWNlLXRvLWRldmljZSBtZXNzYWdlIik7CisgICAgICB9CisKKyAgICAgIERldmljZVRvRGV2aWNlTWVzc2FnZSBtZXNzYWdlUHJvdG8gPSBEZXZpY2VUb0RldmljZU1lc3NhZ2UucGFyc2VGcm9tKHBheWxvYWQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIGluY3JlbWVudFNlcXVlbmNlTnVtYmVyRm9yRGVjb2RpbmcoKTsKKyAgICAgIGlmIChtZXNzYWdlUHJvdG8uZ2V0U2VxdWVuY2VOdW1iZXIoKSAhPSBnZXRTZXF1ZW5jZU51bWJlckZvckRlY29kaW5nKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbigiSW5jb3JyZWN0IHNlcXVlbmNlIG51bWJlciIpOworICAgICAgfQorCisgICAgICByZXR1cm4gbWVzc2FnZVByb3RvLmdldE1lc3NhZ2UoKS50b0J5dGVBcnJheSgpOworICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIC0gdGhlIGFsZ29yaXRobXMgYXJlIGhhcmQtY29kZWQuCisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogT25jZSBJbml0aWF0b3JIZWxsbyBhbmQgUmVzcG9uZGVySGVsbG8oQW5kUGF5bG9hZCkgYXJlIGV4Y2hhbmdlZCwgdXNlIHRoaXMgbWV0aG9kCisgICAqIHRvIGRlY3J5cHQgYW5kIHZlcmlmeSBhIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgZGV2aWNlLiBCb3RoIGluaXRpYXRvciBhbmQKKyAgICogcmVzcG9uZGVyIGRldmljZSBjYW4gdXNlIHRoaXMgbWVzc2FnZS4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgZW5jcnlwdGVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkZWNvZGVNZXNzYWdlRnJvbVBlZXJBc1N0cmluZyhieXRlW10gbWVzc2FnZSkgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlY29kZU1lc3NhZ2VGcm9tUGVlcihtZXNzYWdlKSwgVVRGOCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIC0gd2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIFVURi04LWVuY29kZSBhIHN0cmluZworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgLy8gcGFja2FnZS1wcml2YXRlCisgIHN0YXRpYyBEZXZpY2VUb0RldmljZU1lc3NhZ2UgY3JlYXRlRGV2aWNlVG9EZXZpY2VNZXNzYWdlKGJ5dGVbXSBtZXNzYWdlLCBpbnQgc2VxdWVuY2VOdW1iZXIpIHsKKyAgICBEZXZpY2VUb0RldmljZU1lc3NhZ2UuQnVpbGRlciBkZXZpY2VUb0RldmljZU1lc3NhZ2UgPSBEZXZpY2VUb0RldmljZU1lc3NhZ2UubmV3QnVpbGRlcigpOworICAgIGRldmljZVRvRGV2aWNlTWVzc2FnZS5zZXRTZXF1ZW5jZU51bWJlcihzZXF1ZW5jZU51bWJlcik7CisgICAgZGV2aWNlVG9EZXZpY2VNZXNzYWdlLnNldE1lc3NhZ2UoQnl0ZVN0cmluZy5jb3B5RnJvbShtZXNzYWdlKSk7CisgICAgcmV0dXJuIGRldmljZVRvRGV2aWNlTWVzc2FnZS5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBjcnlwdG9ncmFwaGljIGRpZ2VzdCAoU0hBMjU2KSBvZiB0aGUgc2Vzc2lvbiBrZXlzIHByZXBlbmRlZCBieSB0aGUgU0hBMjU2IGhhc2gKKyAgICogb2YgdGhlIEFTQ0lJIHN0cmluZyAiRDJEIgorICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBpZiBTSEEgMjU2IGRvZXNuJ3QgZXhpc3Qgb24gdGhpcyBwbGF0Zm9ybQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRTZXNzaW9uVW5pcXVlKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogSW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgbnVtYmVyIHVzZWQgZm9yIGVuY29kaW5nIG1lc3NhZ2VzLgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5jcmVtZW50U2VxdWVuY2VOdW1iZXJGb3JFbmNvZGluZygpOworCisgIC8qKgorICAgKiBJbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZSBudW1iZXIgdXNlZCBmb3IgZGVjb2RpbmcgbWVzc2FnZXMuCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbmNyZW1lbnRTZXF1ZW5jZU51bWJlckZvckRlY29kaW5nKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGxhc3Qgc2VxdWVuY2UgbnVtYmVyIHVzZWQgdG8gZW5jb2RlIGEgbWVzc2FnZS4KKyAgICovCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBhYnN0cmFjdCBpbnQgZ2V0U2VxdWVuY2VOdW1iZXJGb3JFbmNvZGluZygpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBsYXN0IHNlcXVlbmNlIG51bWJlciB1c2VkIHRvIGRlY29kZSBhIG1lc3NhZ2UuCisgICAqLworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgYWJzdHJhY3QgaW50IGdldFNlcXVlbmNlTnVtYmVyRm9yRGVjb2RpbmcoKTsKKworICAvKioKKyAgICogQHJldHVybiB0aGUge0BsaW5rIFNlY3JldEtleX0gdXNlZCBmb3IgZW5jb2RpbmcgbWVzc2FnZXMuCisgICAqLworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgYWJzdHJhY3QgU2VjcmV0S2V5IGdldEVuY29kZUtleSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2VjcmV0S2V5fSB1c2VkIGZvciBkZWNvZGluZyBtZXNzYWdlcy4KKyAgICovCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBhYnN0cmFjdCBTZWNyZXRLZXkgZ2V0RGVjb2RlS2V5KCk7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBzYXZlZCBzZXNzaW9uIHRoYXQgY2FuIGxhdGVyIGJlIHVzZWQgZm9yIHJlc3VtcHRpb24uICBOb3RlLCB0aGlzIG11c3QgYmUgc3RvcmVkIGluIGEKKyAgICogc2VjdXJlIGxvY2F0aW9uLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBzYXZlZCBzZXNzaW9uLCBzdWl0YWJsZSBmb3IgcmVzdW1wdGlvbi4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gc2F2ZVNlc3Npb24oKTsKKworICAvKioKKyAgICogUGFyc2UgYSBzYXZlZCBzZXNzaW9uIGluZm8gYW5kIGF0dGVtcHQgdG8gY29uc3RydWN0IGEgcmVzdW1lZCBjb250ZXh0LgorICAgKiBUaGUgZmlyc3QgYnl0ZSBpbiBhIHNhdmVkIHNlc3Npb24gaW5mbyBtdXN0IGFsd2F5cyBiZSB0aGUgcHJvdG9jb2wgdmVyc2lvbi4KKyAgICogTm90ZSB0aGF0IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBzYXZlZFNlc3Npb25JbmZvIGlzIG5vdAorICAgKiBwcm9wZXJseSBmb3JtYXR0ZWQuCisgICAqCisgICAqIEByZXR1cm4gYSByZXN1bWVkIGNvbnRleHQgZnJvbSBhIHNhdmVkIHNlc3Npb24uCisgICAqLworICBwdWJsaWMgc3RhdGljIEQyRENvbm5lY3Rpb25Db250ZXh0IGZyb21TYXZlZFNlc3Npb24oYnl0ZVtdIHNhdmVkU2Vzc2lvbkluZm8pIHsKKyAgICBpZiAoc2F2ZWRTZXNzaW9uSW5mbyA9PSBudWxsIHx8IHNhdmVkU2Vzc2lvbkluZm8ubGVuZ3RoID09IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNhdmVkU2Vzc2lvbkluZm8gbnVsbCBvciB0b28gc2hvcnQiKTsKKyAgICB9CisKKyAgICBpbnQgcHJvdG9jb2xWZXJzaW9uID0gc2F2ZWRTZXNzaW9uSW5mb1swXSAmIDB4ZmY7CisKKyAgICBzd2l0Y2ggKHByb3RvY29sVmVyc2lvbikgeworICAgICAgY2FzZSAwOgorICAgICAgICAvLyBWZXJzaW9uIDAgaGFzIGEgMSBieXRlIHByb3RvY29sIHZlcnNpb24sIGEgNCBieXRlIHNlcXVlbmNlIG51bWJlciwKKyAgICAgICAgLy8gYW5kIDMyIGJ5dGVzIG9mIEFFUyBrZXkgKDEgKyA0ICsgMzIgPSAzNykKKyAgICAgICAgaWYgKHNhdmVkU2Vzc2lvbkluZm8ubGVuZ3RoICE9IDM3KSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb3JyZWN0IGRhdGEgbGVuZ3RoICgiICsgc2F2ZWRTZXNzaW9uSW5mby5sZW5ndGgKKyAgICAgICAgICAgICAgKyAiKSBmb3IgdjAgcHJvdG9jb2wiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2VxdWVuY2VOdW1iZXIgPSBieXRlc1RvU2lnbmVkSW50KEFycmF5cy5jb3B5T2ZSYW5nZShzYXZlZFNlc3Npb25JbmZvLCAxLCA1KSk7CisgICAgICAgIFNlY3JldEtleSBzaGFyZWRLZXkgPSBuZXcgU2VjcmV0S2V5U3BlYyhBcnJheXMuY29weU9mUmFuZ2Uoc2F2ZWRTZXNzaW9uSW5mbywgNSwgMzcpLCAiQUVTIik7CisgICAgICAgIHJldHVybiBuZXcgRDJEQ29ubmVjdGlvbkNvbnRleHRWMChzaGFyZWRLZXksIHNlcXVlbmNlTnVtYmVyKTsKKworICAgICAgY2FzZSAxOgorICAgICAgICAvLyBWZXJzaW9uIDEgaGFzIGEgMSBieXRlIHByb3RvY29sIHZlcnNpb24sIHR3byA0IGJ5dGUgc2VxdWVuY2UgbnVtYmVycywKKyAgICAgICAgLy8gYW5kIHR3byAzMiBieXRlIEFFUyBrZXlzICgxICsgNCArIDQgKyAzMiArIDMyID0gNzMpCisgICAgICAgIGlmIChzYXZlZFNlc3Npb25JbmZvLmxlbmd0aCAhPSA3MykgeworICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29ycmVjdCBkYXRhIGxlbmd0aCBmb3IgdjEgcHJvdG9jb2wiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZW5jb2RlU2VxdWVuY2VOdW1iZXIgPSBieXRlc1RvU2lnbmVkSW50KEFycmF5cy5jb3B5T2ZSYW5nZShzYXZlZFNlc3Npb25JbmZvLCAxLCA1KSk7CisgICAgICAgIGludCBkZWNvZGVTZXF1ZW5jZU51bWJlciA9IGJ5dGVzVG9TaWduZWRJbnQoQXJyYXlzLmNvcHlPZlJhbmdlKHNhdmVkU2Vzc2lvbkluZm8sIDUsIDkpKTsKKyAgICAgICAgU2VjcmV0S2V5IGVuY29kZUtleSA9CisgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhBcnJheXMuY29weU9mUmFuZ2Uoc2F2ZWRTZXNzaW9uSW5mbywgOSwgNDEpLCAiQUVTIik7CisgICAgICAgIFNlY3JldEtleSBkZWNvZGVLZXkgPQorICAgICAgICAgICAgbmV3IFNlY3JldEtleVNwZWMoQXJyYXlzLmNvcHlPZlJhbmdlKHNhdmVkU2Vzc2lvbkluZm8sIDQxLCA3MyksICJBRVMiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEMkRDb25uZWN0aW9uQ29udGV4dFYxKGVuY29kZUtleSwgZGVjb2RlS2V5LCBlbmNvZGVTZXF1ZW5jZU51bWJlciwKKyAgICAgICAgICAgIGRlY29kZVNlcXVlbmNlTnVtYmVyKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHJlYnVpbGQgY29udGV4dCwgdW5rb3duIHByb3RvY29sIHZlcnNpb246ICIKKyAgICAgICAgICAgICsgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29udmVydCA0IGJ5dGVzIGluIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb24gaW50byBhIHNpZ25lZCBpbnQuCisgICAqLworICBzdGF0aWMgaW50IGJ5dGVzVG9TaWduZWRJbnQoYnl0ZVtdIGJ5dGVzKSB7CisgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPSA0KSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeHBlY3RlZCA0IGJ5dGVzIHRvIGVuY29kZSBpbnQsIGJ1dCBnb3Q6ICIKKyAgICAgICAgICArIGJ5dGVzLmxlbmd0aCArICIgYnl0ZXMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gKChieXRlc1swXSA8PCAyNCkgJiAweGZmMDAwMDAwKQorICAgICAgICB8ICAoKGJ5dGVzWzFdIDw8IDE2KSAmIDB4MDBmZjAwMDApCisgICAgICAgIHwgICgoYnl0ZXNbMl0gPDwgOCkgICYgMHgwMDAwZmYwMCkKKyAgICAgICAgfCAgIChieXRlc1szXSAgICAgICAgJiAweDAwMDAwMGZmKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0IGEgc2lnbmVkIGludCBpbnRvIGEgNCBieXRlIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb24KKyAgICovCisgIHN0YXRpYyBieXRlW10gc2lnbmVkSW50VG9CeXRlcyhpbnQgdmFsKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbNF07CisKKyAgICBieXRlc1swXSA9IChieXRlKSAoKHZhbCA+PiAyNCkgJiAweGZmKTsKKyAgICBieXRlc1sxXSA9IChieXRlKSAoKHZhbCA+PiAxNikgJiAweGZmKTsKKyAgICBieXRlc1syXSA9IChieXRlKSAoKHZhbCA+PiA4KSAgJiAweGZmKTsKKyAgICBieXRlc1szXSA9IChieXRlKSAgKHZhbCAgICAgICAgJiAweGZmKTsKKworICAgIHJldHVybiBieXRlczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9EMkRDb25uZWN0aW9uQ29udGV4dFYwLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRENvbm5lY3Rpb25Db250ZXh0VjAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmFhMDJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9EMkRDb25uZWN0aW9uQ29udGV4dFYwLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEQyRENvbm5lY3Rpb25Db250ZXh0fSBmb3IgdmVyc2lvbiAwIG9mIHRoZSBEMkQgcHJvdG9jb2wuIEluIHRoaXMKKyAqIHZlcnNpb24sIGNvbW11bmljYXRpb24gaXMgaGFsZi1kdXBsZXgsIGFzIHRoZXJlIGlzIGEgc2hhcmVkIGtleSBhbmQgYSBzaGFyZWQgc2VxdWVuY2UgbnVtYmVyCisgKiBiZXR3ZWVuIHRoZSB0d28gc2lkZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBEMkRDb25uZWN0aW9uQ29udGV4dFYwIGV4dGVuZHMgRDJEQ29ubmVjdGlvbkNvbnRleHQgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9WRVJTSU9OID0gMDsKKworICBwcml2YXRlIGZpbmFsIFNlY3JldEtleSBzaGFyZWRLZXk7CisgIHByaXZhdGUgaW50IHNlcXVlbmNlTnVtYmVyOworCisgIC8qKgorICAgKiBQYWNrYWdlIHByaXZhdGUgY29uc3RydWN0b3IuIFNob3VsZCBuZXZlciBiZSBjYWxsZWQgZGlyZWN0bHkgZXhjZXB0IGJ5IHRoZQorICAgKiB7QGxpbmsgRDJESGFuZHNoYWtlQ29udGV4dH0KKyAgICoKKyAgICogQHBhcmFtIHNoYXJlZEtleQorICAgKiBAcGFyYW0gaW5pdGlhbFNlcXVlbmNlTnVtYmVyCisgICAqLworICBEMkRDb25uZWN0aW9uQ29udGV4dFYwKFNlY3JldEtleSBzaGFyZWRLZXksIGludCBpbml0aWFsU2VxdWVuY2VOdW1iZXIpIHsKKyAgICBzdXBlcihQUk9UT0NPTF9WRVJTSU9OKTsKKyAgICB0aGlzLnNoYXJlZEtleSA9IHNoYXJlZEtleTsKKyAgICB0aGlzLnNlcXVlbmNlTnVtYmVyID0gaW5pdGlhbFNlcXVlbmNlTnVtYmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0U2Vzc2lvblVuaXF1ZSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIGlmIChzaGFyZWRLZXkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAiQ29ubmVjdGlvbiBoYXMgbm90IGJlZW4gY29ycmVjdGx5IGluaXRpYWxpemVkOyBzaGFyZWQga2V5IGlzIG51bGwiKTsKKyAgICB9CisKKyAgICBNZXNzYWdlRGlnZXN0IG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTI1NiIpOworICAgIG1kLnVwZGF0ZShEMkRDcnlwdG9PcHMuU0FMVCk7CisgICAgcmV0dXJuIG1kLmRpZ2VzdChzaGFyZWRLZXkuZ2V0RW5jb2RlZCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBpbmNyZW1lbnRTZXF1ZW5jZU51bWJlckZvckVuY29kaW5nKCkgeworICAgIHNlcXVlbmNlTnVtYmVyKys7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50U2VxdWVuY2VOdW1iZXJGb3JEZWNvZGluZygpIHsKKyAgICBzZXF1ZW5jZU51bWJlcisrOworICB9CisKKyAgQE92ZXJyaWRlCisgIGludCBnZXRTZXF1ZW5jZU51bWJlckZvckVuY29kaW5nKCkgeworICAgIHJldHVybiBzZXF1ZW5jZU51bWJlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBpbnQgZ2V0U2VxdWVuY2VOdW1iZXJGb3JEZWNvZGluZygpIHsKKyAgICByZXR1cm4gc2VxdWVuY2VOdW1iZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgU2VjcmV0S2V5IGdldEVuY29kZUtleSgpIHsKKyAgICByZXR1cm4gc2hhcmVkS2V5OworICB9CisKKyAgQE92ZXJyaWRlCisgIFNlY3JldEtleSBnZXREZWNvZGVLZXkoKSB7CisgICAgcmV0dXJuIHNoYXJlZEtleTsKKyAgfQorCisgIC8qKgorICAgKiBTdHJ1Y3R1cmUgb2Ygc2F2ZWQgc2Vzc2lvbiBpczoKKyAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgKiB8ICAgICAxIEJ5dGUgICAgICAgfCA0IEJ5dGVzIChiaWcgZW5kaWFuKSB8IDMyIEJ5dGVzICB8CisgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICogfCBQcm90b2NvbCBWZXJzaW9uIHwgICAgc2VxdWVuY2UgbnVtYmVyICAgfCAgICBrZXkgICAgfAorICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBzYXZlU2Vzc2lvbigpIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICB0cnkgeworICAgICAgLy8gUHJvdG9jb2wgdmVyc2lvbgorICAgICAgYnl0ZXMud3JpdGUoMCk7CisKKyAgICAgIC8vIFNlcXVlbmNlIG51bWJlcgorICAgICAgYnl0ZXMud3JpdGUoc2lnbmVkSW50VG9CeXRlcyhzZXF1ZW5jZU51bWJlcikpOworCisgICAgICAvLyBLZXkKKyAgICAgIGJ5dGVzLndyaXRlKHNoYXJlZEtleS5nZXRFbmNvZGVkKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzLnRvQnl0ZUFycmF5KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJEQ29ubmVjdGlvbkNvbnRleHRWMS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9EMkRDb25uZWN0aW9uQ29udGV4dFYxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1ZmI1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJEQ29ubmVjdGlvbkNvbnRleHRWMS5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEQyRENvbm5lY3Rpb25Db250ZXh0fSBmb3IgdmVyc2lvbiAxIG9mIHRoZSBEMkQgcHJvdG9jb2wuIEluIHRoaXMKKyAqIHZlcnNpb24sIGNvbW11bmljYXRpb24gaXMgZnVsbHkgZHVwbGV4LCBhcyBzZXBhcmF0ZSBrZXlzIGFuZCBzZXF1ZW5jZSBudWJtZXJzIGFyZSB1c2VkIGZvcgorICogZW5jb2RpbmcgYW5kIGRlY29kaW5nLgorICovCitwdWJsaWMgY2xhc3MgRDJEQ29ubmVjdGlvbkNvbnRleHRWMSBleHRlbmRzIEQyRENvbm5lY3Rpb25Db250ZXh0IHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9DT0xfVkVSU0lPTiA9IDE7CisKKyAgcHJpdmF0ZSBmaW5hbCBTZWNyZXRLZXkgZW5jb2RlS2V5OworICBwcml2YXRlIGZpbmFsIFNlY3JldEtleSBkZWNvZGVLZXk7CisgIHByaXZhdGUgaW50IGVuY29kZVNlcXVlbmNlTnVtYmVyOworICBwcml2YXRlIGludCBkZWNvZGVTZXF1ZW5jZU51bWJlcjsKKworICAvKioKKyAgICogUGFja2FnZSBwcml2YXRlIGNvbnN0cnVjdG9yLiBTaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5IGV4Y2VwdCBieSB0aGUKKyAgICoge0BsaW5rIEQyREhhbmRzaGFrZUNvbnRleHR9CisgICAqCisgICAqIEBwYXJhbSBlbmNvZGVLZXkKKyAgICogQHBhcmFtIGRlY29kZUtleQorICAgKiBAcGFyYW0gaW5pdGlhbEVuY29kZVNlcXVlbmNlTnVtYmVyCisgICAqIEBwYXJhbSBpbml0aWFsRGVjb2RlU2VxdWVuY2VOdW1iZXIKKyAgICovCisgIEQyRENvbm5lY3Rpb25Db250ZXh0VjEoCisgICAgICBTZWNyZXRLZXkgZW5jb2RlS2V5LAorICAgICAgU2VjcmV0S2V5IGRlY29kZUtleSwKKyAgICAgIGludCBpbml0aWFsRW5jb2RlU2VxdWVuY2VOdW1iZXIsCisgICAgICBpbnQgaW5pdGlhbERlY29kZVNlcXVlbmNlTnVtYmVyKSB7CisgICAgc3VwZXIoUFJPVE9DT0xfVkVSU0lPTik7CisgICAgdGhpcy5lbmNvZGVLZXkgPSBlbmNvZGVLZXk7CisgICAgdGhpcy5kZWNvZGVLZXkgPSBkZWNvZGVLZXk7CisgICAgdGhpcy5lbmNvZGVTZXF1ZW5jZU51bWJlciA9IGluaXRpYWxFbmNvZGVTZXF1ZW5jZU51bWJlcjsKKyAgICB0aGlzLmRlY29kZVNlcXVlbmNlTnVtYmVyID0gaW5pdGlhbERlY29kZVNlcXVlbmNlTnVtYmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0U2Vzc2lvblVuaXF1ZSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIGlmIChlbmNvZGVLZXkgPT0gbnVsbCB8fCBkZWNvZGVLZXkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAiQ29ubmVjdGlvbiBoYXMgbm90IGJlZW4gY29ycmVjdGx5IGluaXRpYWxpemVkOyBlbmNvZGUga2V5IG9yIGRlY29kZSBrZXkgaXMgbnVsbCIpOworICAgIH0KKworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBpbml0YXRvciBhbmQgcmVzcG9uZGVyIGtleXMgYXJlIGhhc2hlZCBpbiBhIGRldGVybWluaXN0aWMgb3JkZXIsIHNvIHRoZXkgaGF2ZQorICAgIC8vIHRoZSBzYW1lIHNlc3Npb24gdW5pcXVlIGNvZGUuCisgICAgYnl0ZVtdIGVuY29kZUtleUJ5dGVzID0gZW5jb2RlS2V5LmdldEVuY29kZWQoKTsKKyAgICBieXRlW10gZGVjb2RlS2V5Qnl0ZXMgPSBkZWNvZGVLZXkuZ2V0RW5jb2RlZCgpOworICAgIGludCBlbmNvZGVLZXlIYXNoID0gQXJyYXlzLmhhc2hDb2RlKGVuY29kZUtleUJ5dGVzKTsKKyAgICBpbnQgZGVjb2RlS2V5SGFzaCA9IEFycmF5cy5oYXNoQ29kZShkZWNvZGVLZXlCeXRlcyk7CisgICAgYnl0ZVtdIGZpcnN0S2V5Qnl0ZXMgPSBlbmNvZGVLZXlIYXNoIDwgZGVjb2RlS2V5SGFzaCA/IGVuY29kZUtleUJ5dGVzIDogZGVjb2RlS2V5Qnl0ZXM7CisgICAgYnl0ZVtdIHNlY29uZEtleUJ5dGVzID0gZmlyc3RLZXlCeXRlcyA9PSBlbmNvZGVLZXlCeXRlcyA/IGRlY29kZUtleUJ5dGVzIDogZW5jb2RlS2V5Qnl0ZXM7CisKKyAgICBNZXNzYWdlRGlnZXN0IG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTI1NiIpOworICAgIG1kLnVwZGF0ZShEMkRDcnlwdG9PcHMuU0FMVCk7CisgICAgbWQudXBkYXRlKGZpcnN0S2V5Qnl0ZXMpOworICAgIG1kLnVwZGF0ZShzZWNvbmRLZXlCeXRlcyk7CisgICAgcmV0dXJuIG1kLmRpZ2VzdCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGluY3JlbWVudFNlcXVlbmNlTnVtYmVyRm9yRW5jb2RpbmcoKSB7CisgICAgZW5jb2RlU2VxdWVuY2VOdW1iZXIrKzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBpbmNyZW1lbnRTZXF1ZW5jZU51bWJlckZvckRlY29kaW5nKCkgeworICAgIGRlY29kZVNlcXVlbmNlTnVtYmVyKys7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgaW50IGdldFNlcXVlbmNlTnVtYmVyRm9yRW5jb2RpbmcoKSB7CisgICAgcmV0dXJuIGVuY29kZVNlcXVlbmNlTnVtYmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIGludCBnZXRTZXF1ZW5jZU51bWJlckZvckRlY29kaW5nKCkgeworICAgIHJldHVybiBkZWNvZGVTZXF1ZW5jZU51bWJlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBTZWNyZXRLZXkgZ2V0RW5jb2RlS2V5KCkgeworICAgIHJldHVybiBlbmNvZGVLZXk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgU2VjcmV0S2V5IGdldERlY29kZUtleSgpIHsKKyAgICByZXR1cm4gZGVjb2RlS2V5OworICB9CisKKyAgLyoqCisgICAqIFN0cnVjdHVyZSBvZiBzYXZlZCBzZXNzaW9uIGlzOgorICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgKiB8ICAgICAxIEJ5dGUgICAgICAgfCA0IEJ5dGVzIChiaWcgZW5kaWFuKSB8IDQgQnl0ZXMgKGJpZyBlbmRpYW4pIHwgIDMyIEJ5dGVzICB8ICAzMiBCeXRlcyAgfAorICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgKiB8IFByb3RvY29sIFZlcnNpb24gfCAgIGVuY29kZSBzZXEgbnVtYmVyICB8ICAgZGVjb2RlIHNlcSBudW1iZXIgIHwgZW5jb2RlIGtleSB8IGRlY29kZSBrZXkgfAorICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gc2F2ZVNlc3Npb24oKSB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgdHJ5IHsKKyAgICAgIC8vIFByb3RvY29sIHZlcnNpb24KKyAgICAgIGJ5dGVzLndyaXRlKDEpOworCisgICAgICAvLyBFbmNvZGUgc2VxdWVuY2UgbnVtYmVyCisgICAgICBieXRlcy53cml0ZShzaWduZWRJbnRUb0J5dGVzKGVuY29kZVNlcXVlbmNlTnVtYmVyKSk7CisKKyAgICAgIC8vIERlY29kZSBzZXF1ZW5jZSBudW1iZXIKKyAgICAgIGJ5dGVzLndyaXRlKHNpZ25lZEludFRvQnl0ZXMoZGVjb2RlU2VxdWVuY2VOdW1iZXIpKTsKKworICAgICAgLy8gRW5jb2RlIEtleQorICAgICAgYnl0ZXMud3JpdGUoZW5jb2RlS2V5LmdldEVuY29kZWQoKSk7CisKKyAgICAgIC8vIERlY29kZSBLZXkKKyAgICAgIGJ5dGVzLndyaXRlKGRlY29kZUtleS5nZXRFbmNvZGVkKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzLnRvQnl0ZUFycmF5KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJEQ3J5cHRvT3BzLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRENyeXB0b09wcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZGM1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRENyeXB0b09wcy5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLkRldmljZVRvRGV2aWNlTWVzc2FnZXNQcm90by5EZXZpY2VUb0RldmljZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5EZXZpY2VUb0RldmljZU1lc3NhZ2VzUHJvdG8uUmVzcG9uZGVySGVsbG87CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5TZWN1cmVHY21Qcm90by5HY21NZXRhZGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlRyYW5zcG9ydENyeXB0b09wcy5QYXlsb2FkOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uVHJhbnNwb3J0Q3J5cHRvT3BzLlBheWxvYWRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLkNyeXB0b09wczsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5DcnlwdG9PcHMuRW5jVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5DcnlwdG9PcHMuU2lnVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5QdWJsaWNLZXlQcm90b1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uR2VuZXJpY1B1YmxpY0tleTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uSGVhZGVyOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLlNlY3VyZU1lc3NhZ2VQcm90by5IZWFkZXJBbmRCb2R5OworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLlNlY3VyZU1lc3NhZ2VQcm90by5TZWN1cmVNZXNzYWdlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2Ygc3RhdGljIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGJ5IHtAbGluayBEMkRIYW5kc2hha2VDb250ZXh0fSBmb3IgdGhlIERldmljZSB0bworICogRGV2aWNlIGNvbW11bmljYXRpb24gKEQyRCkgbGlicmFyeS4KKyAqLworY2xhc3MgRDJEQ3J5cHRvT3BzIHsKKyAgLy8gU0hBMjU2IG9mICJEMkQiCisgIC8vIHBhY2thZ2UtcHJpdmF0ZQorICBzdGF0aWMgZmluYWwgYnl0ZVtdIFNBTFQgPSBuZXcgYnl0ZVtdIHsKKyAgICAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4QUEsIChieXRlKSAweDU1LCAoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDk3LCAoYnl0ZSkgMHhGOCwKKyAgICAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4NDYsIChieXRlKSAweENBLCAoYnl0ZSkgMHgxQywgKGJ5dGUpIDB4RUUsIChieXRlKSAweDhELCAoYnl0ZSkgMHgzOSwKKyAgICAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4QjksIChieXRlKSAweDVGLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4RkEsIChieXRlKSAweDdELCAoYnl0ZSkgMHhFQiwKKyAgICAoYnl0ZSkgMHgxRCwgKGJ5dGUpIDB4NEEsIChieXRlKSAweEIzLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4NzYsIChieXRlKSAweEI4LCAoYnl0ZSkgMHgyNSwKKyAgICAoYnl0ZSkgMHg2RCwgKGJ5dGUpIDB4QTgsIChieXRlKSAweDU1LCAoYnl0ZSkgMHgxMAorICB9OworCisgIC8vIERvbid0IGluc3RhbnRpYXRlCisgIHByaXZhdGUgRDJEQ3J5cHRvT3BzKCkgeyB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkgdGhlIHJlc3BvbmRlciBkZXZpY2UgdG8gY3JlYXRlIGEgc2lnbmNyeXB0ZWQgbWVzc2FnZSB0aGF0IGNvbnRhaW5zCisgICAqIGEgcGF5bG9hZCBhbmQgYSB7QGxpbmsgUmVzcG9uZGVySGVsbG99LgorICAgKgorICAgKiBAcGFyYW0gc2hhcmVkS2V5IHVzZWQgdG8gc2lnbmNyeXB0IHRoZSB7QGxpbmsgUGF5bG9hZH0KKyAgICogQHBhcmFtIHB1YmxpY0RoS2V5IHRoZSBrZXkgdGhlIHJlY2lwaWVudCB3aWxsIG5lZWQgdG8gZGVyaXZlIHRoZSBzaGFyZWQgREggc2VjcmV0LgorICAgKiAgIFRoaXMga2V5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHtAbGluayBSZXNwb25kZXJIZWxsb30gaW4gdGhlIGhlYWRlci4KKyAgICogQHBhcmFtIHByb3RvY29sVmVyc2lvbiB0aGUgcHJvdG9jb2wgdmVyc2lvbiB0byBpbmNsdWRlIGluIHRoZSBwcm90bworICAgKi8KKyAgc3RhdGljIGJ5dGVbXSBzaWduY3J5cHRNZXNzYWdlQW5kUmVzcG9uZGVySGVsbG8oCisgICAgICBQYXlsb2FkIHBheWxvYWQsIFNlY3JldEtleSBzaGFyZWRLZXksIFB1YmxpY0tleSBwdWJsaWNEaEtleSwgaW50IHByb3RvY29sVmVyc2lvbikKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIFJlc3BvbmRlckhlbGxvLkJ1aWxkZXIgcmVzcG9uZGVySGVsbG8gPSBSZXNwb25kZXJIZWxsby5uZXdCdWlsZGVyKCk7CisgICAgcmVzcG9uZGVySGVsbG8uc2V0UHVibGljRGhLZXkoUHVibGljS2V5UHJvdG9VdGlsLmVuY29kZVB1YmxpY0tleShwdWJsaWNEaEtleSkpOworICAgIHJlc3BvbmRlckhlbGxvLnNldFByb3RvY29sVmVyc2lvbihwcm90b2NvbFZlcnNpb24pOworICAgIHJldHVybiBzaWduY3J5cHRQYXlsb2FkKHBheWxvYWQsIHNoYXJlZEtleSwgcmVzcG9uZGVySGVsbG8uYnVpbGQoKS50b0J5dGVBcnJheSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VkIGJ5IGEgZGV2aWNlIHRvIHNlbmQgYSBzZWN1cmUge0BsaW5rIFBheWxvYWR9IHRvIGFub3RoZXIgZGV2aWNlLgorICAgKi8KKyAgc3RhdGljIGJ5dGVbXSBzaWduY3J5cHRQYXlsb2FkKAorICAgICAgUGF5bG9hZCBwYXlsb2FkLCBTZWNyZXRLZXkgbWFzdGVyS2V5KQorICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHNpZ25jcnlwdFBheWxvYWQocGF5bG9hZCwgbWFzdGVyS2V5LCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VkIGJ5IGEgZGV2aWNlIHRvIHNlbmQgYSBzZWN1cmUge0BsaW5rIFBheWxvYWR9IHRvIGFub3RoZXIgZGV2aWNlLgorICAgKgorICAgKiBAcGFyYW0gcmVzcG9uZGVySGVsbG8gaXMgYW4gb3B0aW9uYWwgcHVibGljIHZhbHVlIHRvIGF0dGFjaCBpbiB0aGUgaGVhZGVyIG9mCisgICAqICAgICB0aGUge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IChpbiB0aGUgRGVjcnlwdGlvbktleUlkKS4KKyAgICovCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgYnl0ZVtdIHNpZ25jcnlwdFBheWxvYWQoCisgICAgICBQYXlsb2FkIHBheWxvYWQsIFNlY3JldEtleSBtYXN0ZXJLZXksIEBOdWxsYWJsZSBieXRlW10gcmVzcG9uZGVySGVsbG8pCisgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICBpZiAoKHBheWxvYWQgPT0gbnVsbCkgfHwgKG1hc3RlcktleSA9PSBudWxsKSkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgU2VjdXJlTWVzc2FnZUJ1aWxkZXIgc2VjdXJlTWVzc2FnZUJ1aWxkZXIgPSBuZXcgU2VjdXJlTWVzc2FnZUJ1aWxkZXIoKQorICAgICAgICAuc2V0UHVibGljTWV0YWRhdGEoR2NtTWV0YWRhdGEubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0VHlwZShwYXlsb2FkLmdldFBheWxvYWRUeXBlKCkuZ2V0VHlwZSgpKQorICAgICAgICAgICAgLnNldFZlcnNpb24oU2VjdXJlR2NtQ29uc3RhbnRzLlNFQ1VSRV9HQ01fVkVSU0lPTikKKyAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAudG9CeXRlQXJyYXkoKSk7CisKKyAgICBpZiAocmVzcG9uZGVySGVsbG8gIT0gbnVsbCkgeworICAgICAgc2VjdXJlTWVzc2FnZUJ1aWxkZXIuc2V0RGVjcnlwdGlvbktleUlkKHJlc3BvbmRlckhlbGxvKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VjdXJlTWVzc2FnZUJ1aWxkZXIuYnVpbGRTaWduQ3J5cHRlZE1lc3NhZ2UoCisgICAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgICBTaWdUeXBlLkhNQUNfU0hBMjU2LAorICAgICAgICAgICAgbWFzdGVyS2V5LAorICAgICAgICAgICAgRW5jVHlwZS5BRVNfMjU2X0NCQywKKyAgICAgICAgICAgIHBheWxvYWQuZ2V0TWVzc2FnZSgpKQorICAgICAgICAudG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIC8qKgorICAgKiBFeHRyYWN0cyBhIFJlc3BvbmRlckhlbGxvIHByb3RvIGZyb20gdGhlIGhlYWRlciBvZiBhIHNpZ25jcnlwdGVkIG1lc3NhZ2Ugc28gdGhhdCB3ZQorICAgKiBjYW4gZGVyaXZlIHRoZSBzaGFyZWQgc2VjcmV0IHRoYXQgd2FzIHVzZWQgdG8gc2lnbi9lbmNyeXB0IHRoZSBtZXNzYWdlLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUmVzcG9uZGVySGVsbG99IGVtYmVkZGVkIGluIHRoZSBzaWduY3J5cHRlZCBtZXNzYWdlLgorICAgKi8KKyAgc3RhdGljIFJlc3BvbmRlckhlbGxvIHBhcnNlQW5kVmFsaWRhdGVSZXNwb25kZXJIZWxsbygKKyAgICAgIGJ5dGVbXSBzaWduY3J5cHRlZE1lc3NhZ2VGcm9tUmVzcG9uZGVyKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICBpZiAoc2lnbmNyeXB0ZWRNZXNzYWdlRnJvbVJlc3BvbmRlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgU2VjdXJlTWVzc2FnZSBzZWNtc2cgPSBTZWN1cmVNZXNzYWdlLnBhcnNlRnJvbShzaWduY3J5cHRlZE1lc3NhZ2VGcm9tUmVzcG9uZGVyKTsKKyAgICBIZWFkZXIgbWVzc2FnZUhlYWRlciA9IFNlY3VyZU1lc3NhZ2VQYXJzZXIuZ2V0VW52ZXJpZmllZEhlYWRlcihzZWNtc2cpOworICAgIGlmICghbWVzc2FnZUhlYWRlci5oYXNEZWNyeXB0aW9uS2V5SWQoKSkgeworICAgICAgLy8gTWF5YmUgdGhpcyBzaG91bGQgYmUgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUsIGJlY2F1c2UgaW4gZ2VuZXJhbCwgaXQncyBsZWdhbCBmb3IgdGhlCisgICAgICAvLyBTZWN1cmVNZXNzYWdlIHByb3RvIHRvIG5vdCBoYXZlIHRoZSBkZWNyeXB0aW9uIGtleSBpZCwgYnV0IGl0J3MgaWxsZWdhbCBpbiB0aGlzIHByb3RvY29sLgorICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiTWlzc2luZyBkZWNyeXB0aW9uIGtleSBpZCIpOworICAgIH0KKyAgICBieXRlW10gZW5jb2RlZFJlc3BvbmRlckhlbGxvID0gbWVzc2FnZUhlYWRlci5nZXREZWNyeXB0aW9uS2V5SWQoKS50b0J5dGVBcnJheSgpOworICAgIFJlc3BvbmRlckhlbGxvIHJlc3BvbmRlckhlbGxvID0gUmVzcG9uZGVySGVsbG8ucGFyc2VGcm9tKGVuY29kZWRSZXNwb25kZXJIZWxsbyk7CisgICAgaWYgKCFyZXNwb25kZXJIZWxsby5oYXNQdWJsaWNEaEtleSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJNaXNzaW5nIHB1YmxpYyBrZXkgaW4gcmVzcG9uZGVyIGhlbGxvIik7CisgICAgfQorICAgIHJldHVybiByZXNwb25kZXJIZWxsbzsKKyAgfQorCisgIC8qKgorICAgKiBVc2VkIGJ5IGEgZGV2aWNlIHRvIHJlY292ZXIgYSBzZWN1cmUge0BsaW5rIFBheWxvYWR9IHNlbnQgYnkgYW5vdGhlciBkZXZpY2UuCisgICAqLworICBzdGF0aWMgUGF5bG9hZCB2ZXJpZnlkZWNyeXB0UGF5bG9hZCgKKyAgICAgIGJ5dGVbXSBzaWduY3J5cHRlZE1lc3NhZ2UsIFNlY3JldEtleSBtYXN0ZXJLZXkpCisgICAgICB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIGlmICgoc2lnbmNyeXB0ZWRNZXNzYWdlID09IG51bGwpIHx8IChtYXN0ZXJLZXkgPT0gbnVsbCkpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0cnkgeworICAgICAgU2VjdXJlTWVzc2FnZSBzZWNtc2cgPSBTZWN1cmVNZXNzYWdlLnBhcnNlRnJvbShzaWduY3J5cHRlZE1lc3NhZ2UpOworICAgICAgSGVhZGVyQW5kQm9keSBwYXJzZWQgPSBTZWN1cmVNZXNzYWdlUGFyc2VyLnBhcnNlU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgICAgICAgIHNlY21zZywKKyAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgU2lnVHlwZS5ITUFDX1NIQTI1NiwKKyAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgRW5jVHlwZS5BRVNfMjU2X0NCQyk7CisgICAgICBpZiAoIXBhcnNlZC5nZXRIZWFkZXIoKS5oYXNQdWJsaWNNZXRhZGF0YSgpKSB7CisgICAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oIm1pc3NpbmcgbWV0YWRhdGEiKTsKKyAgICAgIH0KKyAgICAgIEdjbU1ldGFkYXRhIG1ldGFkYXRhID0gR2NtTWV0YWRhdGEucGFyc2VGcm9tKHBhcnNlZC5nZXRIZWFkZXIoKS5nZXRQdWJsaWNNZXRhZGF0YSgpKTsKKyAgICAgIGlmIChtZXRhZGF0YS5nZXRWZXJzaW9uKCkgPiBTZWN1cmVHY21Db25zdGFudHMuU0VDVVJFX0dDTV9WRVJTSU9OKSB7CisgICAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb24iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgUGF5bG9hZChQYXlsb2FkVHlwZS52YWx1ZU9mKG1ldGFkYXRhLmdldFR5cGUoKSksIHBhcnNlZC5nZXRCb2R5KCkudG9CeXRlQXJyYXkoKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkgdGhlIGluaXRpYXRvciBkZXZpY2UgdG8gZGVyaXZlIHRoZSBzaGFyZWQga2V5IGZyb20gdGhlIHtAbGluayBQcml2YXRlS2V5fSBpbiB0aGUKKyAgICoge0BsaW5rIEQyREhhbmRzaGFrZUNvbnRleHR9IGFuZCB0aGUgcmVzcG9uZGVyJ3Mge0BsaW5rIEdlbmVyaWNQdWJsaWNLZXl9IChjb250YWluZWQgaW4gdGhlCisgICAqIHtAbGluayBSZXNwb25kZXJIZWxsb30gcHJvdG8pLgorICAgKi8KKyAgc3RhdGljIFNlY3JldEtleSBkZXJpdmVTaGFyZWRLZXlGcm9tR2VuZXJpY1B1YmxpY0tleSgKKyAgICAgIFByaXZhdGVLZXkgb3VyUHJpdmF0ZUtleSwgR2VuZXJpY1B1YmxpY0tleSB0aGVpckdlbmVyaWNQdWJsaWNLZXkpIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBQdWJsaWNLZXkgdGhlaXJQdWJsaWNLZXkgPSBQdWJsaWNLZXlQcm90b1V0aWwucGFyc2VQdWJsaWNLZXkodGhlaXJHZW5lcmljUHVibGljS2V5KTsKKyAgICAgIHJldHVybiBFbnJvbGxtZW50Q3J5cHRvT3BzLmRvS2V5QWdyZWVtZW50KG91clByaXZhdGVLZXksIHRoZWlyUHVibGljS2V5KTsKKyAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVXNlZCB0byBkZXJpdmUgYSBkaXN0aW5jdCBrZXkgZm9yIGVhY2ggaW5pdGlhdG9yIGFuZCByZXNwb25kZXIuCisgICAqIAorICAgKiBAcGFyYW0gbWFzdGVyS2V5IHRoZSBzb3VyY2Uga2V5IHVzZWQgdG8gZGVyaXZlIHRoZSBuZXcga2V5LgorICAgKiBAcGFyYW0gcHVycG9zZSBhIHN0cmluZyB0byBtYWtlIHRoZSBuZXcga2V5IGRpZmZlcmVudCBmb3IgZWFjaCBwdXJwb3NlLgorICAgKiBAcmV0dXJuIHRoZSBkZXJpdmVkIHtAbGluayBTZWNyZXRLZXl9LgorICAgKi8KKyAgc3RhdGljIFNlY3JldEtleSBkZXJpdmVOZXdLZXlGb3JQdXJwb3NlKFNlY3JldEtleSBtYXN0ZXJLZXksIFN0cmluZyBwdXJwb3NlKQorICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGluZm8gPSBwdXJwb3NlLmdldEJ5dGVzKCk7CisgICAgcmV0dXJuIEtleUVuY29kaW5nLnBhcnNlTWFzdGVyS2V5KENyeXB0b09wcy5oa2RmKG1hc3RlcktleSwgU0FMVCwgaW5mbykpOworICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkgdGhlIGluaXRpYXRvciBkZXZpY2UgdG8gZGVjcnlwdCB0aGUgZmlyc3QgcGF5bG9hZCBwb3J0aW9uIHRoYXQgd2FzIHNlbnQgaW4gdGhlCisgICAqIHtAY29kZSByZXNwb25kZXJIZWxsb0FuZFBheWxvYWR9LCBhbmQgZXh0cmFjdCB0aGUge0BsaW5rIERldmljZVRvRGV2aWNlTWVzc2FnZX0gY29udGFpbmVkCisgICAqIHdpdGhpbiBpdC4gSW4gb3JkZXIgdG8gZGVjcnlwdCwgdGhlIHtAY29kZSBzaGFyZWRLZXl9IG11c3QgZmlyc3QgYmUgZGVyaXZlZC4KKyAgICoKKyAgICogQHNlZSAjZGVyaXZlU2hhcmVkS2V5RnJvbUdlbmVyaWNQdWJsaWNLZXkoUHJpdmF0ZUtleSwgR2VuZXJpY1B1YmxpY0tleSkKKyAgICovCisgIHN0YXRpYyBEZXZpY2VUb0RldmljZU1lc3NhZ2UgZGVjcnlwdFJlc3BvbmRlckhlbGxvTWVzc2FnZSgKKyAgICAgIFNlY3JldEtleSBzaGFyZWRLZXksIGJ5dGVbXSByZXNwb25kZXJIZWxsb0FuZFBheWxvYWQpIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBQYXlsb2FkIHBheWxvYWQgPSB2ZXJpZnlkZWNyeXB0UGF5bG9hZChyZXNwb25kZXJIZWxsb0FuZFBheWxvYWQsIHNoYXJlZEtleSk7CisgICAgICBpZiAoIVBheWxvYWRUeXBlLkRFVklDRV9UT19ERVZJQ0VfUkVTUE9OREVSX0hFTExPX1BBWUxPQUQuZXF1YWxzKAorICAgICAgICAgIHBheWxvYWQuZ2V0UGF5bG9hZFR5cGUoKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbigid3JvbmcgbWVzc2FnZSB0eXBlIGluIHJlc3BvbmRlciBoZWxsbyIpOworICAgICAgfQorICAgICAgcmV0dXJuIERldmljZVRvRGV2aWNlTWVzc2FnZS5wYXJzZUZyb20ocGF5bG9hZC5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJERGlmZmllSGVsbG1hbktleUV4Y2hhbmdlSGFuZHNoYWtlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRERpZmZpZUhlbGxtYW5LZXlFeGNoYW5nZUhhbmRzaGFrZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDNkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRERpZmZpZUhlbGxtYW5LZXlFeGNoYW5nZUhhbmRzaGFrZS5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLkRldmljZVRvRGV2aWNlTWVzc2FnZXNQcm90by5EZXZpY2VUb0RldmljZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5EZXZpY2VUb0RldmljZU1lc3NhZ2VzUHJvdG8uSW5pdGlhdG9ySGVsbG87CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5EZXZpY2VUb0RldmljZU1lc3NhZ2VzUHJvdG8uUmVzcG9uZGVySGVsbG87CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5UcmFuc3BvcnRDcnlwdG9PcHMuUGF5bG9hZDsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlRyYW5zcG9ydENyeXB0b09wcy5QYXlsb2FkVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5QdWJsaWNLZXlQcm90b1V0aWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKKworLyoqCisgKiBJbXBsZW1lbnRzIGFuIHVuYXV0aGVudGljYXRlZCBFQyBEaWZmaWUgSGVsbG1hbiBLZXkgRXhjaGFuZ2UgSGFuZHNoYWtlCisgKiA8cD4KKyAqIEluaXRpYXRvciBzZW5kcyBhbiBJbml0aWF0b3JIZWxsbywgd2hpY2ggaXMgYSBwcm90b2J1ZiB0aGF0IGNvbnRhaW5zIGEgcHVibGljIGtleS4gUmVzcG9uZGVyCisgKiBzZW5kcyBhIHJlc3BvbmRlciBoZWxsbywgd2hpY2ggYSBzaWduZWQgYW5kIGVuY3J5cHRlZCBtZXNzYWdlIGNvbnRhaW5pbmcgYSBwYXlsb2FkLCBhbmQgYSBwdWJsaWMKKyAqIGtleSBpbiB0aGUgdW5lbmNyeXB0ZWQgaGVhZGVyIChwYXlsb2FkIGlzIGVuY3J5cHRlZCB3aXRoIHRoZSBkZXJpdmVkIERIIGtleSkuCisgKiA8cD4KKyAqIEV4YW1wbGUgVXNhZ2U6CisgKiA8cHJlPgorICogICAgLy8gaW5pdGlhdG9yOgorICogICAgRDJESGFuZHNoYWtlQ29udGV4dCBpbml0aWF0b3JIYW5kc2hha2VDb250ZXh0ID0KKyAqICAgICAgICBEMkREaWZmaWVIZWxsbWFuS2V5RXhjaGFuZ2VIYW5kc2hha2UuZm9ySW5pdGlhdG9yKCk7CisgKiAgICBieXRlW10gaW5pdGlhdG9ySGVsbG8gPSBpbml0aWF0b3JIYW5kc2hha2VDb250ZXh0LmdldE5leHRIYW5kc2hha2VNZXNzYWdlKCk7CisgKiAgICAvLyAoc2VuZCBpbml0aWF0b3JIZWxsbyB0byByZXNwb25kZXIpCisgKgorICogICAgLy8gcmVzcG9uZGVyOgorICogICAgRDJESGFuZHNoYWtlQ29udGV4dCByZXNwb25kZXJIYW5kc2hha2VDb250ZXh0ID0KKyAqICAgICAgICBEMkREaWZmaWVIZWxsbWFuS2V5RXhjaGFuZ2VIYW5kc2hha2UuZm9yUmVzcG9uZGVyKCk7CisgKiAgICByZXNwb25kZXJIYW5kc2hha2VDb250ZXh0LnBhcnNlSGFuZHNoYWtlTWVzc2FnZShpbml0aWF0b3JIZWxsbyk7CisgKiAgICBieXRlW10gcmVzcG9uZGVySGVsbG9BbmRQYXlsb2FkID0gcmVzcG9uZGVySGFuZHNoYWtlQ29udGV4dC5nZXROZXh0SGFuZHNoYWtlTWVzc2FnZSgKKyAqICAgICAgICB0b0J5dGVzKFJFU1BPTkRFUl9IRUxMT19NRVNTQUdFKSk7CisgKiAgICBEMkRDb25uZWN0aW9uQ29udGV4dCByZXNwb25kZXJDdHggPSByZXNwb25kZXJIYW5kc2hha2VDb250ZXh0LnRvQ29ubmVjdGlvbkNvbnRleHQoKTsKKyAqICAgIC8vIChzZW5kIHJlc3BvbmRlckhlbGxvQW5kUGF5bG9hZCB0byBpbml0aWF0b3IpCisgKgorICogICAgLy8gaW5pdGlhdG9yCisgKiAgICBieXRlW10gbWVzc2FnZUZyb21QYXlsb2FkID0KKyAqICAgICAgICBpbml0aWF0b3JIYW5kc2hha2VDb250ZXh0LnBhcnNlSGFuZHNoYWtlTWVzc2FnZShyZXNwb25kZXJIZWxsb0FuZFBheWxvYWQpOworICogICAgaWYgKG1lc3NhZ2VGcm9tUGF5bG9hZC5sZW5ndGggPiAwKSB7CisgKiAgICAgIGhhbmRsZShtZXNzYWdlRnJvbVBheWxvYWQpOworICogICAgfQorICoKKyAqICAgIEQyRENvbm5lY3Rpb25Db250ZXh0IGluaXRpYXRvckN0eCA9IGluaXRpYXRvckhhbmRzaGFrZUNvbnRleHQudG9Db25uZWN0aW9uQ29udGV4dCgpOworICogPC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBEMkREaWZmaWVIZWxsbWFuS2V5RXhjaGFuZ2VIYW5kc2hha2UgaW1wbGVtZW50cyBEMkRIYW5kc2hha2VDb250ZXh0IHsKKyAgLy8gRGF0YSBwYXNzZWQgdG8gaGtkZiB0byBjcmVhdGUgdGhlIGtleSB1c2VkIGJ5IHRoZSBpbml0aWF0b3IgdG8gZW5jb2RlIG1lc3NhZ2VzLgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBVE9SX1BVUlBPU0UgPSAiaW5pdGlhdG9yIjsKKyAgLy8gRGF0YSBwYXNzZWQgdG8gaGtkZiB0byBjcmVhdGUgdGhlIGtleSB1c2VkIGJ5IHRoZSByZXNwb25kZXIgdG8gZW5jb2RlIG1lc3NhZ2VzLgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OREVSX1BVUlBPU0UgPSAicmVzcG9uZGVyIjsKKworICBwcml2YXRlIEtleVBhaXIgb3VyS2V5UGFpcjsKKyAgcHJpdmF0ZSBQdWJsaWNLZXkgdGhlaXJQdWJsaWNLZXk7CisgIHByaXZhdGUgU2VjcmV0S2V5IGluaXRpYXRvckVuY29kZUtleTsKKyAgcHJpdmF0ZSBTZWNyZXRLZXkgcmVzcG9uZGVyRW5jb2RlS2V5OworICBwcml2YXRlIFN0YXRlIGhhbmRzaGFrZVN0YXRlOworICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWF0b3I7CisgIHByaXZhdGUgaW50IHByb3RvY29sVmVyc2lvblRvVXNlOworCisgIHByaXZhdGUgZW51bSBTdGF0ZSB7CisgICAgLy8gSW5pdGlhdG9yIHN0YXRlCisgICAgSU5JVElBVE9SX1NUQVJULAorICAgIElOSVRJQVRPUl9XQUlUSU5HX0ZPUl9SRVNQT05ERVJfSEVMTE8sCisKKyAgICAvLyBSZXNwb25kZXIgc3RhdGUKKyAgICBSRVNQT05ERVJfU1RBUlQsCisgICAgUkVTUE9OREVSX0FGVEVSX0lOSVRJQVRPUl9IRUxMTywKKworICAgIC8vIENvbW1vbiBjb21wbGV0aW9uIHN0YXRlCisgICAgSEFORFNIQUtFX0ZJTklTSEVELAorICAgIEhBTkRTSEFLRV9BTFJFQURZX1VTRUQKKyAgfQorCisgIHByaXZhdGUgRDJERGlmZmllSGVsbG1hbktleUV4Y2hhbmdlSGFuZHNoYWtlKFN0YXRlIHN0YXRlKSB7CisgICAgb3VyS2V5UGFpciA9IFB1YmxpY0tleVByb3RvVXRpbC5nZW5lcmF0ZUVjUDI1NktleVBhaXIoKTsKKyAgICB0aGVpclB1YmxpY0tleSA9IG51bGw7CisgICAgaW5pdGlhdG9yRW5jb2RlS2V5ID0gbnVsbDsKKyAgICByZXNwb25kZXJFbmNvZGVLZXkgPSBudWxsOworICAgIGhhbmRzaGFrZVN0YXRlID0gc3RhdGU7CisgICAgaXNJbml0aWF0b3IgPSBzdGF0ZSA9PSBTdGF0ZS5JTklUSUFUT1JfU1RBUlQ7CisgICAgcHJvdG9jb2xWZXJzaW9uVG9Vc2UgPSBEMkRDb25uZWN0aW9uQ29udGV4dFYxLlBST1RPQ09MX1ZFUlNJT047CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBEaWZmaWUgSGVsbG1hbiBoYW5kc2hha2UgY29udGV4dCBmb3IgdGhlIGhhbmRzaGFrZSBpbml0aWF0b3IKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgRDJERGlmZmllSGVsbG1hbktleUV4Y2hhbmdlSGFuZHNoYWtlIGZvckluaXRpYXRvcigpIHsKKyAgICByZXR1cm4gbmV3IEQyRERpZmZpZUhlbGxtYW5LZXlFeGNoYW5nZUhhbmRzaGFrZShTdGF0ZS5JTklUSUFUT1JfU1RBUlQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgRGlmZmllIEhlbGxtYW4gaGFuZHNoYWtlIGNvbnRleHQgZm9yIHRoZSBoYW5kc2hha2UgcmVzcG9uZGVyCisgICAqLworICBwdWJsaWMgc3RhdGljIEQyRERpZmZpZUhlbGxtYW5LZXlFeGNoYW5nZUhhbmRzaGFrZSBmb3JSZXNwb25kZXIoKSB7CisgICAgcmV0dXJuIG5ldyBEMkREaWZmaWVIZWxsbWFuS2V5RXhjaGFuZ2VIYW5kc2hha2UoU3RhdGUuUkVTUE9OREVSX1NUQVJUKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0hhbmRzaGFrZUNvbXBsZXRlKCkgeworICAgIHJldHVybiBoYW5kc2hha2VTdGF0ZSA9PSBTdGF0ZS5IQU5EU0hBS0VfRklOSVNIRUQKKyAgICAgICAgfHwgaGFuZHNoYWtlU3RhdGUgPT0gU3RhdGUuSEFORFNIQUtFX0FMUkVBRFlfVVNFRDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldE5leHRIYW5kc2hha2VNZXNzYWdlKCkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgc3dpdGNoKGhhbmRzaGFrZVN0YXRlKSB7CisgICAgICBjYXNlIElOSVRJQVRPUl9TVEFSVDoKKyAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBTdGF0ZS5JTklUSUFUT1JfV0FJVElOR19GT1JfUkVTUE9OREVSX0hFTExPOworICAgICAgICByZXR1cm4gSW5pdGlhdG9ySGVsbG8ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0UHVibGljRGhLZXkoUHVibGljS2V5UHJvdG9VdGlsLmVuY29kZVB1YmxpY0tleShvdXJLZXlQYWlyLmdldFB1YmxpYygpKSkKKyAgICAgICAgICAgIC5zZXRQcm90b2NvbFZlcnNpb24ocHJvdG9jb2xWZXJzaW9uVG9Vc2UpCisgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgLnRvQnl0ZUFycmF5KCk7CisKKyAgICAgIGNhc2UgUkVTUE9OREVSX0FGVEVSX0lOSVRJQVRPUl9IRUxMTzoKKyAgICAgICAgYnl0ZVtdIHJlc3BvbmRlckhlbGxvID0gbWFrZVJlc3BvbmRlckhlbGxvV2l0aFBheWxvYWQobmV3IGJ5dGVbMF0pOworICAgICAgICBoYW5kc2hha2VTdGF0ZSA9IFN0YXRlLkhBTkRTSEFLRV9GSU5JU0hFRDsKKyAgICAgICAgcmV0dXJuIHJlc3BvbmRlckhlbGxvOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IG5leHQgbWVzc2FnZSBpbiBzdGF0ZTogIiArIGhhbmRzaGFrZVN0YXRlKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gY2FuU2VuZFBheWxvYWRJbkhhbmRzaGFrZU1lc3NhZ2UoKSB7CisgICAgcmV0dXJuIGhhbmRzaGFrZVN0YXRlID09IFN0YXRlLlJFU1BPTkRFUl9BRlRFUl9JTklUSUFUT1JfSEVMTE87CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBnZXROZXh0SGFuZHNoYWtlTWVzc2FnZShieXRlW10gcGF5bG9hZCkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgaWYgKGhhbmRzaGFrZVN0YXRlICE9IFN0YXRlLlJFU1BPTkRFUl9BRlRFUl9JTklUSUFUT1JfSEVMTE8pIHsKKyAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oCisgICAgICAgICAgIkNhbm5vdCBnZXQgbmV4dCBtZXNzYWdlIHdpdGggcGF5bG9hZCBpbiBzdGF0ZTogIiArIGhhbmRzaGFrZVN0YXRlKTsKKyAgICB9CisKKyAgICBieXRlW10gcmVzcG9uZGVySGVsbG8gPSBtYWtlUmVzcG9uZGVySGVsbG9XaXRoUGF5bG9hZChwYXlsb2FkKTsKKyAgICBoYW5kc2hha2VTdGF0ZSA9IFN0YXRlLkhBTkRTSEFLRV9GSU5JU0hFRDsKKworICAgIHJldHVybiByZXNwb25kZXJIZWxsbzsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIG1ha2VSZXNwb25kZXJIZWxsb1dpdGhQYXlsb2FkKGJ5dGVbXSBwYXlsb2FkKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBpZiAocGF5bG9hZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJOb3QgZXhwZWN0aW5nIG51bGwgcGF5bG9hZCIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBTZWNyZXRLZXkgbWFzdGVyS2V5ID0KKyAgICAgICAgICBFbnJvbGxtZW50Q3J5cHRvT3BzLmRvS2V5QWdyZWVtZW50KG91cktleVBhaXIuZ2V0UHJpdmF0ZSgpLCB0aGVpclB1YmxpY0tleSk7CisKKyAgICAgIC8vIFYwIHVzZXMgdGhlIHNhbWUga2V5IGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcsIGJ1dCBWMSB1c2VzIHNlcGFyYXRlIGtleXMuCisgICAgICBzd2l0Y2ggKHByb3RvY29sVmVyc2lvblRvVXNlKSB7CisgICAgICAgIGNhc2UgRDJEQ29ubmVjdGlvbkNvbnRleHRWMC5QUk9UT0NPTF9WRVJTSU9OOgorICAgICAgICAgIGluaXRpYXRvckVuY29kZUtleSA9IG1hc3RlcktleTsKKyAgICAgICAgICByZXNwb25kZXJFbmNvZGVLZXkgPSBtYXN0ZXJLZXk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRDJEQ29ubmVjdGlvbkNvbnRleHRWMS5QUk9UT0NPTF9WRVJTSU9OOgorICAgICAgICAgIGluaXRpYXRvckVuY29kZUtleSA9IEQyRENyeXB0b09wcy5kZXJpdmVOZXdLZXlGb3JQdXJwb3NlKG1hc3RlcktleSwgSU5JVElBVE9SX1BVUlBPU0UpOworICAgICAgICAgIHJlc3BvbmRlckVuY29kZUtleSA9IEQyRENyeXB0b09wcy5kZXJpdmVOZXdLZXlGb3JQdXJwb3NlKG1hc3RlcktleSwgUkVTUE9OREVSX1BVUlBPU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcHJvdG9jb2wgdmVyc2lvbjogIiArIHByb3RvY29sVmVyc2lvblRvVXNlKTsKKyAgICAgIH0KKworICAgICAgRGV2aWNlVG9EZXZpY2VNZXNzYWdlIGRldmljZVRvRGV2aWNlTWVzc2FnZSA9CisgICAgICAgICAgRDJEQ29ubmVjdGlvbkNvbnRleHQuY3JlYXRlRGV2aWNlVG9EZXZpY2VNZXNzYWdlKHBheWxvYWQsIDEgLyogc2VxdWVuY2UgbnVtYmVyICovKTsKKworICAgICAgcmV0dXJuIEQyRENyeXB0b09wcy5zaWduY3J5cHRNZXNzYWdlQW5kUmVzcG9uZGVySGVsbG8oCisgICAgICAgICAgbmV3IFBheWxvYWQoUGF5bG9hZFR5cGUuREVWSUNFX1RPX0RFVklDRV9SRVNQT05ERVJfSEVMTE9fUEFZTE9BRCwKKyAgICAgICAgICAgICAgZGV2aWNlVG9EZXZpY2VNZXNzYWdlLnRvQnl0ZUFycmF5KCkpLAorICAgICAgICAgIHJlc3BvbmRlckVuY29kZUtleSwKKyAgICAgICAgICBvdXJLZXlQYWlyLmdldFB1YmxpYygpLAorICAgICAgICAgIHByb3RvY29sVmVyc2lvblRvVXNlKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9ufE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIHBhcnNlSGFuZHNoYWtlTWVzc2FnZShieXRlW10gaGFuZHNoYWtlTWVzc2FnZSkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgaWYgKGhhbmRzaGFrZU1lc3NhZ2UgPT0gbnVsbCB8fCBoYW5kc2hha2VNZXNzYWdlLmxlbmd0aCA9PSAwKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJIYW5kc2hha2UgbWVzc2FnZSB0b28gc2hvcnQiKTsKKyAgICB9CisKKyAgICBzd2l0Y2goaGFuZHNoYWtlU3RhdGUpIHsKKyAgICAgIGNhc2UgSU5JVElBVE9SX1dBSVRJTkdfRk9SX1JFU1BPTkRFUl9IRUxMTzoKKyAgICAgICAgICBieXRlW10gcGF5bG9hZCA9IHBhcnNlUmVzcG9uZGVySGVsbG8oaGFuZHNoYWtlTWVzc2FnZSk7CisgICAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBTdGF0ZS5IQU5EU0hBS0VfRklOSVNIRUQ7CisgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisKKyAgICAgIGNhc2UgUkVTUE9OREVSX1NUQVJUOgorICAgICAgICAgIHBhcnNlSW5pdGlhdG9ySGVsbG8oaGFuZHNoYWtlTWVzc2FnZSk7CisgICAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBTdGF0ZS5SRVNQT05ERVJfQUZURVJfSU5JVElBVE9SX0hFTExPOworICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiQ2Fubm90IHBhcnNlIG1lc3NhZ2UgaW4gc3RhdGU6ICIgKyBoYW5kc2hha2VTdGF0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBieXRlW10gcGFyc2VSZXNwb25kZXJIZWxsbyhieXRlW10gcmVzcG9uZGVySGVsbG8pIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgICB0cnkgeworICAgICAgICBSZXNwb25kZXJIZWxsbyByZXNwb25kZXJIZWxsb1Byb3RvID0KKyAgICAgICAgICAgIEQyRENyeXB0b09wcy5wYXJzZUFuZFZhbGlkYXRlUmVzcG9uZGVySGVsbG8ocmVzcG9uZGVySGVsbG8pOworCisgICAgICAgIC8vIERvd25ncmFkZSB0byBwcm90b2NvbCB2ZXJzaW9uIDAgaWYgbmVlZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgaW50IHByb3RvY29sVmVyc2lvbiA9IHJlc3BvbmRlckhlbGxvUHJvdG8uZ2V0UHJvdG9jb2xWZXJzaW9uKCk7CisgICAgICAgIGlmIChwcm90b2NvbFZlcnNpb24gPT0gRDJEQ29ubmVjdGlvbkNvbnRleHRWMC5QUk9UT0NPTF9WRVJTSU9OKSB7CisgICAgICAgICAgcHJvdG9jb2xWZXJzaW9uVG9Vc2UgPSBEMkRDb25uZWN0aW9uQ29udGV4dFYwLlBST1RPQ09MX1ZFUlNJT047CisgICAgICAgIH0KKworICAgICAgICBTZWNyZXRLZXkgbWFzdGVyS2V5ID0gRDJEQ3J5cHRvT3BzLmRlcml2ZVNoYXJlZEtleUZyb21HZW5lcmljUHVibGljS2V5KAorICAgICAgICAgICAgb3VyS2V5UGFpci5nZXRQcml2YXRlKCksIHJlc3BvbmRlckhlbGxvUHJvdG8uZ2V0UHVibGljRGhLZXkoKSk7CisKKyAgICAgICAgLy8gVjAgdXNlcyB0aGUgc2FtZSBrZXkgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZywgYnV0IFYxIHVzZXMgc2VwYXJhdGUga2V5cy4KKyAgICAgICAgaWYgKHByb3RvY29sVmVyc2lvblRvVXNlID09IEQyRENvbm5lY3Rpb25Db250ZXh0VjAuUFJPVE9DT0xfVkVSU0lPTikgeworICAgICAgICAgIGluaXRpYXRvckVuY29kZUtleSA9IG1hc3RlcktleTsKKyAgICAgICAgICByZXNwb25kZXJFbmNvZGVLZXkgPSBtYXN0ZXJLZXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5pdGlhdG9yRW5jb2RlS2V5ID0gRDJEQ3J5cHRvT3BzLmRlcml2ZU5ld0tleUZvclB1cnBvc2UobWFzdGVyS2V5LCBJTklUSUFUT1JfUFVSUE9TRSk7CisgICAgICAgICAgcmVzcG9uZGVyRW5jb2RlS2V5ID0gRDJEQ3J5cHRvT3BzLmRlcml2ZU5ld0tleUZvclB1cnBvc2UobWFzdGVyS2V5LCBSRVNQT05ERVJfUFVSUE9TRSk7CisgICAgICAgIH0KKworICAgICAgICBEZXZpY2VUb0RldmljZU1lc3NhZ2UgbWVzc2FnZSA9CisgICAgICAgICAgICBEMkRDcnlwdG9PcHMuZGVjcnlwdFJlc3BvbmRlckhlbGxvTWVzc2FnZShyZXNwb25kZXJFbmNvZGVLZXksIHJlc3BvbmRlckhlbGxvKTsKKworICAgICAgICBpZiAobWVzc2FnZS5nZXRTZXF1ZW5jZU51bWJlcigpICE9IDEpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJJbmNvcnJlY3Qgc2VxdWVuY2UgbnVtYmVyIGluIHJlc3BvbmRlciBoZWxsbyIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLnRvQnl0ZUFycmF5KCk7CisgICAgICB9IGNhdGNoIChTaWduYXR1cmVFeGNlcHRpb24gfCBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24KKyAgICAgICAgICAgICAgIHwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHwgSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oZSk7CisgICAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcGFyc2VJbml0aWF0b3JIZWxsbyhieXRlW10gaW5pdGlhdG9ySGVsbG8pIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICAgIEluaXRpYXRvckhlbGxvIGluaXRpYXRvckhlbGxvUHJvdG8gPSBJbml0aWF0b3JIZWxsby5wYXJzZUZyb20oaW5pdGlhdG9ySGVsbG8pOworCisgICAgICAgIGlmICghaW5pdGlhdG9ySGVsbG9Qcm90by5oYXNQdWJsaWNEaEtleSgpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiTWlzc2luZyBwdWJsaWMga2V5IGluIGluaXRpYXRvciBoZWxsbyIpOworICAgICAgICB9CisKKyAgICAgICAgdGhlaXJQdWJsaWNLZXkgPSBQdWJsaWNLZXlQcm90b1V0aWwucGFyc2VQdWJsaWNLZXkoaW5pdGlhdG9ySGVsbG9Qcm90by5nZXRQdWJsaWNEaEtleSgpKTsKKworICAgICAgICAvLyBEb3duZ3JhZGUgdG8gcHJvdG9jb2wgdmVyc2lvbiAwIGlmIG5lZWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGludCBwcm90b2NvbFZlcnNpb24gPSBpbml0aWF0b3JIZWxsb1Byb3RvLmdldFByb3RvY29sVmVyc2lvbigpOworICAgICAgICBpZiAocHJvdG9jb2xWZXJzaW9uID09IEQyRENvbm5lY3Rpb25Db250ZXh0VjAuUFJPVE9DT0xfVkVSU0lPTikgeworICAgICAgICAgIHByb3RvY29sVmVyc2lvblRvVXNlID0gRDJEQ29ubmVjdGlvbkNvbnRleHRWMC5QUk9UT0NPTF9WRVJTSU9OOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB8IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oZSk7CisgICAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEQyRENvbm5lY3Rpb25Db250ZXh0IHRvQ29ubmVjdGlvbkNvbnRleHQoKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBpZiAoaGFuZHNoYWtlU3RhdGUgPT0gU3RhdGUuSEFORFNIQUtFX0FMUkVBRFlfVVNFRCkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiQ2Fubm90IHJldXNlIGhhbmRzaGFrZSBjb250ZXh0OyBpcyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiKTsKKyAgICB9CisKKyAgICBpZiAoIWlzSGFuZHNoYWtlQ29tcGxldGUoKSkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZTsgY2Fubm90IGNyZWF0ZSBjb25uZWN0aW9uIGNvbnRleHQiKTsKKyAgICB9CisKKyAgICBoYW5kc2hha2VTdGF0ZSA9IFN0YXRlLkhBTkRTSEFLRV9BTFJFQURZX1VTRUQ7CisKKyAgICBpZiAocHJvdG9jb2xWZXJzaW9uVG9Vc2UgPT0gRDJEQ29ubmVjdGlvbkNvbnRleHRWMC5QUk9UT0NPTF9WRVJTSU9OKSB7CisgICAgICAvLyBCb3RoIHNpZGVzIHN0YXJ0IHdpdGggYW4gaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgb2YgMSBiZWNhdXNlIHRoZSBsYXN0IG1lc3NhZ2Ugb2YgdGhlCisgICAgICAvLyBoYW5kc2hha2UgaGFkIGFuIG9wdGlvbmFsIHBheWxvYWQgd2l0aCBzZXF1ZW5jZSBudW1iZXIgMS4gIEQyRENvbm5lY3Rpb25Db250ZXh0IHJlbWVtYmVycworICAgICAgLy8gdGhlIGxhc3Qgc2VxdWVuY2UgbnVtYmVyIHVzZWQgYnkgZWFjaCBzaWRlLgorICAgICAgLy8gTm90ZTogaW5pdGlhdG9yRW5jb2RlS2V5ID09IHJlc3BvbmRlckVuY29kZUtleQorICAgICAgcmV0dXJuIG5ldyBEMkRDb25uZWN0aW9uQ29udGV4dFYwKGluaXRpYXRvckVuY29kZUtleSwgMSAvKiogaW5pdGlhbFNlcXVlbmNlTnVtYmVyICovKTsKKyAgICB9IGVsc2UgeworICAgICAgU2VjcmV0S2V5IGVuY29kZUtleSA9IGlzSW5pdGlhdG9yID8gaW5pdGlhdG9yRW5jb2RlS2V5IDogcmVzcG9uZGVyRW5jb2RlS2V5OworICAgICAgU2VjcmV0S2V5IGRlY29kZUtleSA9IGlzSW5pdGlhdG9yID8gcmVzcG9uZGVyRW5jb2RlS2V5IDogaW5pdGlhdG9yRW5jb2RlS2V5OworICAgICAgLy8gT25seSB0aGUgcmVzcG9uZGVyIHNlbmRzIGEgRGV2aWNlVG9EZXZpY2VNZXNzYWdlIGR1cmluZyB0aGUgaGFuZHNoYWtlLCBzbyBpdCBoYXMgYW4gaW5pdGlhbAorICAgICAgLy8gc2VxdWVuY2UgbnVtYmVyIG9mIDEuICBUaGUgaW5pdGlhdG9yIHdpbGwgdGhlcmVmb3JlIGhhdmUgYW4gaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgb2YgMC4KKyAgICAgIGludCBpbml0aWFsRW5jb2RlU2VxdWVuY2VOdW1iZXIgPSBpc0luaXRpYXRvciA/IDAgOiAxOworICAgICAgaW50IGluaXRpYWxEZWNvZGVTZXF1ZW5jZU51bWJlciA9IGlzSW5pdGlhdG9yID8gMSA6IDA7CisgICAgICByZXR1cm4gbmV3IEQyRENvbm5lY3Rpb25Db250ZXh0VjEoCisgICAgICAgICAgZW5jb2RlS2V5LCBkZWNvZGVLZXksIGluaXRpYWxFbmNvZGVTZXF1ZW5jZU51bWJlciwgaW5pdGlhbERlY29kZVNlcXVlbmNlTnVtYmVyKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJESGFuZHNoYWtlQ29udGV4dC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9EMkRIYW5kc2hha2VDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzNWQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJESGFuZHNoYWtlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKKy8qKgorICogRGVzY3JpYmVzIGEgY3J5cHRvZ3JhcGhpYyBoYW5kc2hha2Ugd2l0aCBhcmJpdHJhcnkgbnVtYmVyIG9mIHJvdW5kIHRyaXBzLiAgU29tZSBoYW5kc2hha2UKKyAqIG1lc3NhZ2VzIG1heSBhbHNvIHNlbmQgYSBwYXlsb2FkLgorICoKKyAqIDxwPkdlbmVyaWMgdXNhZ2UgZm9yIGhhbmRzaGFrZSBJbml0aWF0b3I6CisgKiB7QGNvZGUKKyAqICAgLy8gSGFuZHNoYWtlIEluaXRpYXRvcgorICogICBEMkRIYW5kc2hha2VDb250ZXh0IGhhbmRzaGFrZSA9IDxzcGVjaWZpYyBoYW5kc2hha2U+LmZvckluaXRpYXRvcigpOworICogICB3aGlsZSAoIWhhbmRzaGFrZS5pc0hhbmRzaGFrZUNvbXBsZXRlKCkpIHsKKyAqICAgICB0cnkgeworICogICAgICAgLy8gR2V0IHRoZSBuZXh0IGhhbmRzaGFrZSBtZXNzYWdlIHRvIHNlbmQKKyAqICAgICAgIGJ5dGVbXSBpbml0aWF0b3JNZXNzYWdlID0gaGFuZHNoYWtlLmdldE5leHRIYW5kc2hha2VNZXNzYWdlKCk7CisgKgorICogICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSBvdXQgYW5kIGdldCB0aGUgcmVzcG9uc2UKKyAqICAgICAgIHNvY2tldC5zZW5kKGluaXRpYXRvck1lc3NhZ2UpOworICogICAgICAgYnl0ZVtdIHJlc3BvbmRlck1lc3NhZ2UgPSBzb2NrZXQucmVhZCgpOworICoKKyAqICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzcG9uc2UgYW5kIG9idGFpbiB0aGUgb3B0aW9uYWwgcGF5bG9hZAorICogICAgICAgYnl0ZVtdIHBheWxvYWQgPSBoYW5kc2hha2UucGFyc2VIYW5kc2hha2VNZXNzYWdlKHJlc3BvbmRlck1lc3NhZ2UpOworICoKKyAqICAgICAgIC8vIEhhbmRsZSB0aGUgcGF5bG9hZCBpZiBvbmUgd2FzIHNlbnQKKyAqICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA+IDApIHsKKyAqICAgICAgICAgaGFuZGxlUGF5bG9hZChwYXlsb2FkKTsKKyAqICAgICAgIH0KKyAqICAgICB9IGNhdGNoIChIYW5kc2hha2VFeGNlcHRpb24gZSkgeworICogICAgICAgLy8gSGFuZHNoYWtlIGhhcyBmYWlsZWQsIGJhaWwKKyAqICAgICAgIExvZygiSGFuZHNoYWtlIGZhaWxlZCEiLCBlKTsKKyAqICAgICAgIHJldHVybjsKKyAqICAgICB9CisgKiAgIH0KKyAqCisgKiAgIENvbm5lY3Rpb25Db250ZXh0IGNvbm5lY3Rpb25Db250ZXh0OworICogICB0cnkgeworICogICAgIC8vIFVwZ3JhZGUgaGFuZHNoYWtlIGNvbnRleHQgdG8gYSBmdWxsIGNvbm5lY3Rpb24gY29udGV4dAorICogICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gaGFuZHNoYWtlLnRvQ29ubmVjdGlvbkNvbnRleHQoKTsKKyAqICAgfSBjYXRjaCAoSGFuZHNoYWtlRXhjZXB0aW9uIGUpIHsKKyAqICAgICBMb2coIkNhbm5vdCBjb252ZXJ0IGhhbmRzaGFrZSB0byBjb25uZWN0aW9uIGNvbnRleHQiLCBlKTsKKyAqICAgfQorICogfQorICoKKyAqIDxwPkdlbmVyaWMgdXNhZ2UgZm9yIGhhbmRzaGFrZSBSZXNwb25kZXI6CisgKiB7QGNvZGUKKyAqICAgLy8gSGFuZHNoYWtlIFJlc3BvbmRlcgorICogICBEMkRIYW5kc2hha2VDb250ZXh0IGhhbmRzaGFrZSA9IDxzcGVjaWZpYyBoYW5kc2hha2U+LmZvclJlc3BvbmRlcigpOworICoKKyAqICAgd2hpbGUgKCFoYW5kc2hha2UuaXNIYW5kc2hha2VDb21wbGV0ZSgpKSB7CisgKiAgICAgdHJ5IHsKKyAqICAgICAgIC8vIEdldCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBpbml0aWF0b3IKKyAqICAgICAgIGJ5dGVbXSBpbml0aWF0b3JNZXNzYWdlID0gc29ja2V0LnJlYWQoKTsKKyAqCisgKiAgICAgICAvLyBIYW5kbGUgdGhlIG1lc3NhZ2UgYW5kIGdldCB0aGUgcGF5bG9hZCBpZiBpdCBleGlzdHMKKyAqICAgICAgIGJ5dGVbXSBwYXlsb2FkID0gaGFuZHNoYWtlLnBhcnNlSGFuZHNoYWtlTWVzc2FnZShpbml0aWF0b3JNZXNzYWdlKTsKKyAqCisgKiAgICAgICAvLyBIYW5kbGUgdGhlIHBheWxvYWQgaWYgb25lIHdhcyBzZW50CisgKiAgICAgICBpZiAocGF5bG9hZC5sZW5ndGggPiAwKSB7CisgKiAgICAgICAgIGhhbmRsZVBheWxvYWQocGF5bG9hZCk7CisgKiAgICAgICB9CisgKgorICogICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2Fzbid0IHRoZSBsYXN0IG1lc3NhZ2UKKyAqICAgICAgIGlmIChoYW5kc2hha2UuaXNIYW5kc2hha2VDb21wbGV0ZSgpKSB7CisgKiAgICAgICAgIGJyZWFrOworICogICAgICAgfQorICoKKyAqICAgICAgIC8vIEdldCBuZXh0IG1lc3NhZ2UgdG8gc2VuZCBhbmQgc2VuZCBpdAorICogICAgICAgYnl0ZVtdIHJlc3BvbmRlck1lc3NhZ2UgPSBoYW5kc2hha2UuZ2V0TmV4dEhhbmRzaGFrZU1lc3NhZ2UoKTsKKyAqICAgICAgIHNvY2tldC5zZW5kKHJlc3BvbmRlck1lc3NhZ2UpOworICogICAgIH0gY2F0Y2ggKEhhbmRzaGFrZUV4Y2VwdGlvbiBlKSB7CisgKiAgICAgICAvLyBIYW5kc2hha2UgaGFzIGZhaWxlZCwgYmFpbAorICogICAgICAgTG9nKCJIYW5kc2hha2UgZmFpbGVkISIsIGUpOworICogICAgICAgcmV0dXJuOworICogICAgIH0KKyAqICAgfQorICoKKyAqICAgQ29ubmVjdGlvbkNvbnRleHQgY29ubmVjdGlvbkNvbnRleHQ7CisgKiAgIHRyeSB7CisgKiAgICAgLy8gVXBncmFkZSBoYW5kc2hha2UgY29udGV4dCB0byBhIGZ1bGwgY29ubmVjdGlvbiBjb250ZXh0CisgKiAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBoYW5kc2hha2UudG9Db25uZWN0aW9uQ29udGV4dCgpOworICogICB9IGNhdGNoIChIYW5kc2hha2VFeGNlcHRpb24gZSkgeworICogICAgIExvZygiQ2Fubm90IGNvbnZlcnQgaGFuZHNoYWtlIHRvIGNvbm5lY3Rpb24gY29udGV4dCIsIGUpOworICogICB9CisgKiB9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRDJESGFuZHNoYWtlQ29udGV4dCB7CisKKyAgLyoqCisgICAqIFRlbGxzIHRoZSBjYWxsZXIgd2hldGhlciB0aGUgaGFuZHNoYWtlIGhhcyBjb21wbGV0ZWQgb3Igbm90LiBJZiB0aGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlLCB0aGUKKyAgICogY2FsbGVyIG1heSBjYWxsIHtAbGluayAjdG9Db25uZWN0aW9uQ29udGV4dCgpfSB0byBvYnRhaW4gYSBjb25uZWN0aW9uIGNvbnRleHQuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIGJvb2xlYW4gaXNIYW5kc2hha2VDb21wbGV0ZSgpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIHRoZSBuZXh0IG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgc2VudCBpbiB0aGUgaGFuZHNoYWtlLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBuZXh0IG1lc3NhZ2UKKyAgICogQHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24gaWYgdGhlIGhhbmRzaGFrZSBpcyBvdmVyIG9yIGlmIHRoZSBuZXh0IGhhbmRzaGFrZSBtZXNzYWdlIGNhbid0IGJlCisgICAqICAgICBvYnRhaW5lZCAoZS5nLiwgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IpCisgICAqLworICBieXRlW10gZ2V0TmV4dEhhbmRzaGFrZU1lc3NhZ2UoKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBUZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgdGhlIG5leHQgaGFuZHNoYWtlIG1lc3NhZ2UgbWF5IGNhcnJ5IGEgcGF5bG9hZC4gSWYgdHJ1ZSwgY2FsbGVyIG1heQorICAgKiBjYWxsIHtAbGluayAjZ2V0TmV4dEhhbmRzaGFrZU1lc3NhZ2UoYnl0ZVtdKX0gaW5zdGVhZCBvZiB0aGUgcmVndWxhcgorICAgKiB7QGxpbmsgI2dldE5leHRIYW5kc2hha2VNZXNzYWdlKCl9LiBJZiBmYWxzZSwgY2FsbGluZyB7QGxpbmsgI2dldE5leHRIYW5kc2hha2VNZXNzYWdlKGJ5dGVbXSl9CisgICAqIHdpbGwgcmVzdWx0IGluIGEge0BsaW5rIEhhbmRzaGFrZUV4Y2VwdGlvbn0uCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCBoYW5kc2hha2UgbWVzc2FnZSBjYW4gY2FycnkgYSBwYXlsb2FkLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIGJvb2xlYW4gY2FuU2VuZFBheWxvYWRJbkhhbmRzaGFrZU1lc3NhZ2UoKTsKKworICAvKioKKyAgICogQ29uc3RydWN0cyB0aGUgbmV4dCBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHNlbnQgaW4gdGhlIGhhbmRzaGFrZSBhbG9uZyB3aXRoIGEgcGF5bG9hZC4gQ2FsbGVyCisgICAqIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IGNhbGxpbmcKKyAgICoge0BsaW5rICNjYW5TZW5kUGF5bG9hZEluSGFuZHNoYWtlTWVzc2FnZSgpfS4KKyAgICoKKyAgICogQHBhcmFtIHBheWxvYWQgdGhlIHBheWxvYWQgdG8gaW5jbHVkZSBpbiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UKKyAgICogQHJldHVybiB0aGUgbmV4dCBtZXNzYWdlCisgICAqIEB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIGlmIHRoZSBoYW5kc2hha2UgaXMgb3ZlciBvciBpZiB0aGUgbmV4dCBoYW5kc2hha2UgbWVzc2FnZSBjYW4ndCBiZQorICAgKiAgICAgb2J0YWluZWQgKGUuZy4sIHRoZXJlIGlzIGFuIGludGVybmFsIGVycm9yKSBvciBpZiB0aGUgcGF5bG9hZCBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHRoaXMKKyAgICogICAgIG1lc3NhZ2UKKyAgICovCisgIGJ5dGVbXSBnZXROZXh0SGFuZHNoYWtlTWVzc2FnZShieXRlW10gcGF5bG9hZCkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUGFyc2VzIGEgaGFuZHNoYWtlIG1lc3NhZ2UgYW5kIHJldHVybnMgdGhlIGluY2x1ZGVkIHBheWxvYWQgKGlmIGFueSkuCisgICAqCisgICAqIEBwYXJhbSBoYW5kc2hha2VNZXNzYWdlIG1lc3NhZ2UgcmVjZWl2ZWQgaW4gdGhlIGhhbmRzaGFrZQorICAgKiBAcmV0dXJuIHBheWxvYWQgb3IgZW1wdHkgYnl0ZVtdIGlmIG5vIHBheWxvYWQgd2FzIGluIHRoZSBoYW5kc2hha2UgbWVzc2FnZQorICAgKiBAdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgaW4gcGFyc2luZyB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UKKyAgICovCisgIGJ5dGVbXSBwYXJzZUhhbmRzaGFrZU1lc3NhZ2UoYnl0ZVtdIGhhbmRzaGFrZU1lc3NhZ2UpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb247CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBmdWxsIHtAbGluayBEMkRDb25uZWN0aW9uQ29udGV4dH0uIE1heSBvbmx5IGJlIGNhbGxlZCBpZgorICAgKiB7QGxpbmsgI2lzSGFuZHNoYWtlQ29tcGxldGUoKX0gcmV0dXJucyB0cnVlLgorICAgKgorICAgKiBAcmV0dXJuIGEgZnVsbCB7QGxpbmsgRDJEQ29ubmVjdGlvbkNvbnRleHR9CisgICAqIEB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIGlmIGEgY29ubmVjdGlvbiBjb250ZXh0IGNhbm5vdCBiZSBjcmVhdGVkCisgICAqLworICBEMkRDb25uZWN0aW9uQ29udGV4dCB0b0Nvbm5lY3Rpb25Db250ZXh0KCkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRDJEU3Bha2VFZDI1NTE5SGFuZHNoYWtlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWFiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0QyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZS5qYXZhCkBAIC0wLDAgKzEsNjQ4IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5EZXZpY2VUb0RldmljZU1lc3NhZ2VzUHJvdG8uRGV2aWNlVG9EZXZpY2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uRGV2aWNlVG9EZXZpY2VNZXNzYWdlc1Byb3RvLkVjUG9pbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5EZXZpY2VUb0RldmljZU1lc3NhZ2VzUHJvdG8uU3Bha2VIYW5kc2hha2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uRWQyNTUxOS5FZDI1NTE5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uVHJhbnNwb3J0Q3J5cHRvT3BzLlBheWxvYWQ7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5UcmFuc3BvcnRDcnlwdG9PcHMuUGF5bG9hZFR5cGU7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjOworCisvKioKKyAqIEltcGxlbWVudHMgYSB7QGxpbmsgRDJESGFuZHNoYWtlQ29udGV4dH0gYnkgdXNpbmcgU1BBS0UyIChTaW1wbGUgUGFzc3dvcmQtQmFzZWQgRW5jcnlwdGVkIEtleQorICogRXhjaGFuZ2UgUHJvdG9jb2wpIG9uIHRvcCBvZiB0aGUgRWQyNTUxOSBjdXJ2ZS4KKyAqIFNQQUtFMjogaHR0cDovL3d3dy5kaS5lbnMuZnIvfm1hYmRhbGxhL3BhcGVycy9BYlBvMDVhLWxldHRlci5wZGYKKyAqIEVkMjU1MTk6IGh0dHA6Ly9lZDI1NTE5LmNyLnlwLnRvLworICoKKyAqIDxwPlVzYWdlOgorICoge0Bjb2RlCisgKiAgIC8vIGluaXRpYXRvcjoKKyAqICAgRDJESGFuZHNoYWtlQ29udGV4dCBpbml0aWF0b3JIYW5kc2hha2VDb250ZXh0ID0KKyAqICAgICAgIEQyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZS5mb3JJbml0aWF0b3IoUEFTU1dPUkQpOworICogICBieXRlW10gaW5pdGlhdG9yTXNnID0gaW5pdGlhdG9ySGFuZHNoYWtlQ29udGV4dC5nZXROZXh0SGFuZHNoYWtlTWVzc2FnZSgpOworICogICAvLyAoc2VuZCBpbml0aWF0b3JNc2cgdG8gcmVzcG9uZGVyKQorICoKKyAqICAgLy8gcmVzcG9uZGVyOgorICogICBEMkRIYW5kc2hha2VDb250ZXh0IHJlc3BvbmRlckhhbmRzaGFrZUNvbnRleHQgPQorICogICAgICAgRDJEU3Bha2VFZDI1NTE5SGFuZHNoYWtlLmZvclJlc3BvbmRlcihQQVNTV09SRCk7CisgKiAgIHJlc3BvbmRlckhhbmRzaGFrZUNvbnRleHQucGFyc2VIYW5kc2hha2VNZXNzYWdlKGluaXRpYXRvck1zZyk7CisgKiAgIGJ5dGVbXSByZXNwb25kZXJNc2cgPSByZXNwb25kZXJIYW5kc2hha2VDb250ZXh0LmdldE5leHRIYW5kc2hha2VNZXNzYWdlKCk7CisgKiAgIC8vIChzZW5kIHJlc3BvbmRlck1zZyB0byBpbml0aWF0b3IpCisgKgorICogICAvLyBpbml0aWF0b3I6CisgKiAgIGluaXRpYXRvckhhbmRzaGFrZUNvbnRleHQucGFyc2VIYW5kc2hha2VNZXNzYWdlKHJlc3BvbmRlck1zZyk7CisgKiAgIGluaXRpYXRvck1zZyA9IGluaXRpYXRvckhhbmRzaGFrZUNvbnRleHQuZ2V0TmV4dEhhbmRzaGFrZU1lc3NhZ2UoKTsKKyAqICAgLy8gKHNlbmQgaW5pdGlhdG9yTXNnIHRvIHJlc3BvbmRlcikKKyAqCisgKiAgIC8vIHJlc3BvbmRlcjoKKyAqICAgcmVzcG9uZGVySGFuZHNoYWtlQ29udGV4dC5wYXJzZUhhbmRzaGFrZU1lc3NhZ2UoaW5pdGlhdG9yTXNnKTsKKyAqICAgcmVzcG9uZGVyTXNnID0gcmVzcG9uZGVySGFuZHNoYWtlQ29udGV4dC5nZXROZXh0SGFuZHNoYWtlTWVzc2FnZSgpOworICogICBEMkRDb25uZWN0aW9uQ29udGV4dCByZXNwb25kZXJDdHggPSByZXNwb25kZXJIYW5kc2hha2VDb250ZXh0LnRvQ29ubmVjdGlvbkNvbnRleHQoKTsKKyAqICAgLy8gKHNlbmQgcmVzcG9uZGVyTXNnIHRvIGluaXRpYXRvcikKKyAqCisgKiAgIC8vIGluaXRpYXRvcjoKKyAqICAgaW5pdGlhdG9ySGFuZHNoYWtlQ29udGV4dC5wYXJzZUhhbmRzaGFrZU1lc3NhZ2UocmVzcG9uZGVyTXNnKTsKKyAqICAgRDJEQ29ubmVjdGlvbkNvbnRleHQgaW5pdGlhdG9yQ3R4ID0gaW5pdGlhdG9ySGFuZHNoYWtlQ29udGV4dC50b0Nvbm5lY3Rpb25Db250ZXh0KCk7CisgKiB9CisgKgorICogPHA+VGhlIGluaXRpYWwgY29tcHV0YXRpb24gaXM6CisgKiAgIEluaXRpYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25kZXIKKyAqICAgIGhhcyBLTSAocHJlLWFncmVlZCBwb2ludCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgS00gKHByZS1hZ3JlZWQgcG9pbnQpCisgKiAgICBoYXMgS04gKHByZS1hZ3JlZWQgcG9pbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIEtOIChwcmUtYWdyZWVkIHBvaW50KQorICogICAgaGFzIFBhc3N3b3JkIChwcmUtYWdyZWVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBQYXNzd29yZCAocHJlLWFncmVlZCkKKyAqICAgIHBpY2tzIHJhbmRvbSBzY2FsYXIgWGkgKHByaXZhdGUga2V5KSAgICAgICAgICAgICAgICAgICBwaWNrcyByYW5kb20gc2NhbGFyIFhyIChwcml2YXRlIGtleSkKKyAqICAgIGNvbXB1dGVzIHRoZSBwdWJsaWMga2V5IFB4aSA9IEcqWGkgICAgICAgICAgICAgICAgICAgICBjb21wdXRlcyB0aGUgcHVibGljIGtleSBQeHIgPSBHKlhyCisgKiAgICBjb21wdXRlcyBjb21taXRtZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZXMgY29tbWl0bWVudDoKKyAqICAgICAgQ2kgPSBLTSAqIHBhc3N3b3JkICsgUHhpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyID0gS04gKiBwYXNzd29yZCArIFB4cgorICoKKyAqIDxwPlRoZSBmbG93IGlzOgorICogICBJbml0aWF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uZGVyCisgKiAgICAgICAgICAgICAgLS0tLS0gQ2kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICogICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ3IgLS0tLS0KKyAqICAgY29tcHV0ZXMgc2hhcmVkIGtleSBLOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVzIHNoYXJlZCBrZXkgSzoKKyAqICAgIChDciAtIEtOKnBhc3N3b3JkKSAqIFhpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2kgLSBLTSpwYXNzd29yZCkgKiBYcgorICogICBjb21wdXRlcyBoYXNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZXMgaGFzaDoKKyAqICAgIEhpID0gc2hhMjU2KDB8Q3J8Q2l8SykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIciA9IHNoYTI1NigxfENpfENyfEspCisgKiAgICAgICAgICAgICAgLS0tLS0gSGkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyaWZ5IEhpCisgKiAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tIEhyIChvcHRpb25hbCBwYXlsb2FkKSAtLS0tLQorICogICBWZXJpZnkgSHIKKyAqLworcHVibGljIGNsYXNzIEQyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZSBpbXBsZW1lbnRzIEQyREhhbmRzaGFrZUNvbnRleHQgeworICAvLyBNaW5pbXVtIGxlbmd0aCBwYXNzd29yZCB0aGF0IGlzIGFjY2VwdGFibGUgZm9yIHRoZSBoYW5kc2hha2UKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1BBU1NXT1JEX0xFTkdUSCA9IDQ7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFNQQUtFIGhhbmRzaGFrZSBvYmplY3QgZm9yIHRoZSBpbml0aWF0b3IuCisgICAqCisgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcGFzc3dvcmQgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgaGFuZHNoYWtlLiAgTm90ZSB0aGF0IHRoaXMgc2hvdWxkIGJlCisgICAqICAgICBhdCBsZWFzdCB7QHZhbHVlICNNSU5fUEFTU1dPUkRfTEVOR1RIfSBieXRlcyBsb25nCisgICAqLworICBwdWJsaWMgc3RhdGljIEQyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZSBmb3JJbml0aWF0b3IoYnl0ZVtdIHBhc3N3b3JkKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IEQyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZShTdGF0ZS5JTklUSUFUT1JfU1RBUlQsIHBhc3N3b3JkKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFNQQUtFIGhhbmRzaGFrZSBvYmplY3QgZm9yIHRoZSByZXNwb25kZXIuCisgICAqCisgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcGFzc3dvcmQgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgaGFuZHNoYWtlLiAgTm90ZSB0aGF0IHRoaXMgc2hvdWxkIGJlCisgICAqICAgICBhdCBsZWFzdCB7QHZhbHVlICNNSU5fUEFTU1dPUkRfTEVOR1RIfSBieXRlcyBsb25nCisgICAqLworICBwdWJsaWMgc3RhdGljIEQyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZSBmb3JSZXNwb25kZXIoYnl0ZVtdIHBhc3N3b3JkKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IEQyRFNwYWtlRWQyNTUxOUhhbmRzaGFrZShTdGF0ZS5SRVNQT05ERVJfU1RBUlQsIHBhc3N3b3JkKTsKKyAgfQorCisgIC8vCisgIC8vIFRoZSBwcm90b2NvbCByZXF1aXJlcyB0d28gdmVyaWZpYWJsZSwgcmFuZG9tbHkgZ2VuZXJhdGVkIGdyb3VwIHBvaW50LiBUaGV5IHdlcmUgZ2VuZXJhdGVkCisgIC8vIHVzaW5nIHRoZSBweXRob24gY29kZSBiZWxvdy4gVGhlIGFsZ29yaXRobSBpcyB0byBmaXJzdCBwaWNrIGEgcmFuZG9tIHkgaW4gdGhlIGdyb3VwIGFuZCBzb2x2ZQorICAvLyB0aGUgZWxsaXB0aWMgY3VydmUgZXF1YXRpb24gZm9yIGEgdmFsdWUgb2YgeCwgaWYgcG9zc2libGUuIFdlIHRoZW4gdXNlICh4LCB5KSBhcyB0aGUgcmFuZG9tCisgIC8vIHBvaW50LgorICAvLyBTb3VyY2Ugb2YgZWQyNTUxOSBpcyBoZXJlOiBodHRwOi8vZWQyNTUxOS5jci55cC50by9weXRob24vZWQyNTUxOS5weQorICAvLyBpbXBvcnQgZWQyNTUxOQorICAvLyBpbXBvcnQgaGFzaGxpYgorICAvLworICAvLyAjIFNlZWRzCisgIC8vIHNlZWQxID0gJ0QyRCBFZDI1NTE5IHBvaW50IGdlbmVyYXRpb24gc2VlZCAoTSknCisgIC8vIHNlZWQyID0gJ0QyRCBFZDI1NTE5IHBvaW50IGdlbmVyYXRpb24gc2VlZCAoTiknCisgIC8vCisgIC8vIGRlZiBmaW5kX3NlZWQoc2VlZCk6CisgIC8vICAgIyBnZW5lcmF0ZSBhIHJhbmRvbSBzY2FsYXIgZm9yIHRoZSB5IGNvb3JkaW5hdGUKKyAgLy8gICB5ID0gaGFzaGxpYi5zaGEyNTYoc2VlZCkuaGV4ZGlnZXN0KCkKKyAgLy8KKyAgLy8gICBQID0gZWQyNTUxOS5zY2FsYXJtdWx0KGVkMjU1MTkuQiwgaW50KHksIDE2KSAlIGVkMjU1MTkucSkKKyAgLy8gICBpZiAobm90IGVkMjU1MTkuaXNvbmN1cnZlKFApKToKKyAgLy8gICAgICAgcHJpbnQgJ1dhdD8gUCBzaG91bGQgYmUgb24gY3VydmUhJworICAvLworICAvLyAgIHByaW50ICcgIHg6ICcgKyBoZXgoUFswXSkKKyAgLy8gICBwcmludCAnICB5OiAnICsgaGV4KFBbMV0pCisgIC8vICAgcHJpbnQKKyAgLy8KKyAgLy8gZmluZF9zZWVkKHNlZWQxKQorICAvLyBmaW5kX3NlZWQoc2VlZDIpCisgIC8vCisgIC8vIE91dHB1dCBpczoKKyAgLy8gICB4OiAweDE5ODFmYjQzZjEwMzI5MGVjZjk3NzIwMjJkYjhiMTliZmFmMzg5MDU3ZWQ5MWU4NDg2ZWIzNjg3NjM0MzU5MjVMCisgIC8vICAgeTogMHhhNzE0YzM0ZjNiNTg4YWFjOTJmZDI1ODc4ODRhMjA5NjRmZDM1MWExZjE0N2Q1YzRiYmY1YzJmMzdhNzdjMzZMCisgIC8vCisgIC8vICAgeDogMHgyMDFhMTg0ZjQ3ZDlhNzk3Mzg5MWQxNDhlM2QxYzg2NGQ4MDg0NTQ3MTMxYzJjMWNlZmI3ZWViZDI2YzYzNTY3TAorICAvLyAgIHk6IDB4NmRhMmQzYjE4ZWM0ZjlhYTNiMDhlMzljOTk3Y2Q4YmY2ZTk5NDhmZmQ0ZmVmZmVjYWY4ZGQwYjNkNjQ4YjdlOEwKKyAgLy8KKyAgLy8gVG8gZ2V0IGV4dGVuZGVkIHJlcHJlc2VudGF0aW9uIFgsIFksIFosIFQsIGRvOiBaID0gMSwgVCA9IFgqWSBtb2QgUAorICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXJbXSBLTSA9IG5ldyBCaWdJbnRlZ2VyW10geworICAgIG5ldyBCaWdJbnRlZ2VyKG5ldyBieXRlW10geyhieXRlKSAweDE5LCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4RkIsIChieXRlKSAweDQzLAorICAgICAgICAoYnl0ZSkgMHhGMSwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDI5LCAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4Q0YsIChieXRlKSAweDk3LAorICAgICAgICAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDJELCAoYnl0ZSkgMHhCOCwgKGJ5dGUpIDB4QjEsIChieXRlKSAweDlCLAorICAgICAgICAoYnl0ZSkgMHhGQSwgKGJ5dGUpIDB4RjMsIChieXRlKSAweDg5LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4N0UsIChieXRlKSAweEQ5LAorICAgICAgICAoYnl0ZSkgMHgxRSwgKGJ5dGUpIDB4ODQsIChieXRlKSAweDg2LCAoYnl0ZSkgMHhFQiwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDg3LAorICAgICAgICAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4NDMsIChieXRlKSAweDU5LCAoYnl0ZSkgMHgyNX0pLAorICAgIG5ldyBCaWdJbnRlZ2VyKG5ldyBieXRlW10geyhieXRlKSAweDBBLCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4NEMsIChieXRlKSAweDM0LAorICAgICAgICAoYnl0ZSkgMHhGMywgKGJ5dGUpIDB4QjUsIChieXRlKSAweDg4LCAoYnl0ZSkgMHhBQSwgKGJ5dGUpIDB4QzksIChieXRlKSAweDJGLAorICAgICAgICAoYnl0ZSkgMHhEMiwgKGJ5dGUpIDB4NTgsIChieXRlKSAweDc4LCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4QTIsIChieXRlKSAweDA5LAorICAgICAgICAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4RkQsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgxQSwgKGJ5dGUpIDB4MUYsIChieXRlKSAweDE0LAorICAgICAgICAoYnl0ZSkgMHg3RCwgKGJ5dGUpIDB4NUMsIChieXRlKSAweDRCLCAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4NUMsIChieXRlKSAweDJGLAorICAgICAgICAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4QTcsIChieXRlKSAweDdDLCAoYnl0ZSkgMHgzNn0pLAorICAgIEJpZ0ludGVnZXIuT05FLAorICAgIG5ldyBCaWdJbnRlZ2VyKG5ldyBieXRlW10geyhieXRlKSAweDA0LCAoYnl0ZSkgMHg4RiwgKGJ5dGUpIDB4QzEsIChieXRlKSAweENFLAorICAgICAgICAoYnl0ZSkgMHhFNSwgKGJ5dGUpIDB4ODMsIChieXRlKSAweDk5LCAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4RTUsIChieXRlKSAweDlCLAorICAgICAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4RUEsIChieXRlKSAweEFELCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4QUMsIChieXRlKSAweDBBLAorICAgICAgICAoYnl0ZSkgMHgzQywgKGJ5dGUpIDB4RkUsIChieXRlKSAweEM1LCAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4OTMsIChieXRlKSAweDU5LAorICAgICAgICAoYnl0ZSkgMHg4QiwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHhERCwgKGJ5dGUpIDB4MkEsIChieXRlKSAweDNFLAorICAgICAgICAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4NUQsIChieXRlKSAweDg4LCAoYnl0ZSkgMHgzM30pfTsKKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXJbXSBLTiA9IG5ldyBCaWdJbnRlZ2VyW10geworICAgIG5ldyBCaWdJbnRlZ2VyKG5ldyBieXRlW10geyhieXRlKSAweDIwLCAoYnl0ZSkgMHgxQSwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDRGLAorICAgICAgICAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4RDksIChieXRlKSAweEE3LCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4MzgsIChieXRlKSAweDkxLAorICAgICAgICAoYnl0ZSkgMHhEMSwgKGJ5dGUpIDB4NDgsIChieXRlKSAweEUzLCAoYnl0ZSkgMHhEMSwgKGJ5dGUpIDB4QzgsIChieXRlKSAweDY0LAorICAgICAgICAoYnl0ZSkgMHhEOCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4MTMsIChieXRlKSAweDFDLAorICAgICAgICAoYnl0ZSkgMHgyQywgKGJ5dGUpIDB4MUMsIChieXRlKSAweEVGLCAoYnl0ZSkgMHhCNywgKGJ5dGUpIDB4RUUsIChieXRlKSAweEJELAorICAgICAgICAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4QzYsIChieXRlKSAweDM1LCAoYnl0ZSkgMHg2N30pLAorICAgIG5ldyBCaWdJbnRlZ2VyKG5ldyBieXRlW10geyhieXRlKSAweDZELCAoYnl0ZSkgMHhBMiwgKGJ5dGUpIDB4RDMsIChieXRlKSAweEIxLAorICAgICAgICAoYnl0ZSkgMHg4RSwgKGJ5dGUpIDB4QzQsIChieXRlKSAweEY5LCAoYnl0ZSkgMHhBQSwgKGJ5dGUpIDB4M0IsIChieXRlKSAweDA4LAorICAgICAgICAoYnl0ZSkgMHhFMywgKGJ5dGUpIDB4OUMsIChieXRlKSAweDk5LCAoYnl0ZSkgMHg3QywgKGJ5dGUpIDB4RDgsIChieXRlKSAweEJGLAorICAgICAgICAoYnl0ZSkgMHg2RSwgKGJ5dGUpIDB4OTksIChieXRlKSAweDQ4LCAoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4RDQsIChieXRlKSAweEZFLAorICAgICAgICAoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4RUMsIChieXRlKSAweEFGLCAoYnl0ZSkgMHg4RCwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLAorICAgICAgICAoYnl0ZSkgMHhENiwgKGJ5dGUpIDB4NDgsIChieXRlKSAweEI3LCAoYnl0ZSkgMHhFOH0pLAorICAgIEJpZ0ludGVnZXIuT05FLAorICAgIG5ldyBCaWdJbnRlZ2VyKG5ldyBieXRlW10geyhieXRlKSAweDE2LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4RUQsIChieXRlKSAweDVBLAorICAgICAgICAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4RkEsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MjIsIChieXRlKSAweDg2LAorICAgICAgICAoYnl0ZSkgMHhFOSwgKGJ5dGUpIDB4RDIsIChieXRlKSAweDJGLCAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4NDcsIChieXRlKSAweDYzLAorICAgICAgICAoYnl0ZSkgMHhGQiwgKGJ5dGUpIDB4RjYsIChieXRlKSAweDBELCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4MUQsIChieXRlKSAweDM3LAorICAgICAgICAoYnl0ZSkgMHhCOSwgKGJ5dGUpIDB4MDksIChieXRlKSAweDNCLCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4NEQsIChieXRlKSAweEY0LAorICAgICAgICAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4OTUsIChieXRlKSAweEY3LCAoYnl0ZSkgMHg4MX0pfTsKKworICAvLyBCYXNlIHBvaW50IEIgYXMgcGVyIGVkMjU1MTkuY3IueXAudG8KKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIEJpZ0ludGVnZXJbXSBCID0gbmV3IEJpZ0ludGVnZXJbXSB7CisgICAgbmV3IEJpZ0ludGVnZXIobmV3IGJ5dGVbXSB7KGJ5dGUpIDB4MjEsIChieXRlKSAweDY5LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4RDMsCisgICAgICAgIChieXRlKSAweENELCAoYnl0ZSkgMHg2RSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweEZFLCAoYnl0ZSkgMHhDMCwgKGJ5dGUpIDB4QTQsCisgICAgICAgIChieXRlKSAweEUyLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4RkQsIChieXRlKSAweEQ2LCAoYnl0ZSkgMHhEQywgKGJ5dGUpIDB4NUMsCisgICAgICAgIChieXRlKSAweDY5LCAoYnl0ZSkgMHgyQywgKGJ5dGUpIDB4QzcsIChieXRlKSAweDYwLCAoYnl0ZSkgMHg5NSwgKGJ5dGUpIDB4MjUsCisgICAgICAgIChieXRlKSAweEE3LCAoYnl0ZSkgMHhCMiwgKGJ5dGUpIDB4QzksIChieXRlKSAweDU2LCAoYnl0ZSkgMHgyRCwgKGJ5dGUpIDB4NjAsCisgICAgICAgIChieXRlKSAweDhGLCAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4RDUsIChieXRlKSAweDFBfSksCisgICAgbmV3IEJpZ0ludGVnZXIobmV3IGJ5dGVbXSB7KGJ5dGUpIDB4NjYsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsCisgICAgICAgIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsCisgICAgICAgIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsCisgICAgICAgIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsCisgICAgICAgIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsCisgICAgICAgIChieXRlKSAweDY2LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDU4fSksCisgICAgQmlnSW50ZWdlci5PTkUsCisgICAgbmV3IEJpZ0ludGVnZXIobmV3IGJ5dGVbXSB7KGJ5dGUpIDB4NjcsIChieXRlKSAweDg3LCAoYnl0ZSkgMHg1RiwgKGJ5dGUpIDB4MEYsCisgICAgICAgIChieXRlKSAweEQ3LCAoYnl0ZSkgMHg4QiwgKGJ5dGUpIDB4NzYsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4RUEsCisgICAgICAgIChieXRlKSAweDRFLCAoYnl0ZSkgMHg4RSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweEFCLCAoYnl0ZSkgMHhFMywgKGJ5dGUpIDB4N0QsCisgICAgICAgIChieXRlKSAweDIwLCAoYnl0ZSkgMHhGMCwgKGJ5dGUpIDB4OUYsIChieXRlKSAweDgwLCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4NTEsCisgICAgICAgIChieXRlKSAweDUyLCAoYnl0ZSkgMHhGNSwgKGJ5dGUpIDB4NkQsIChieXRlKSAweERFLCAoYnl0ZSkgMHg4QSwgKGJ5dGUpIDB4QjMsCisgICAgICAgIChieXRlKSAweEE1LCAoYnl0ZSkgMHhCNywgKGJ5dGUpIDB4REQsIChieXRlKSAweEEzfSl9OworCisgIC8vIE51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgYSBwb2ludAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9JTlRfU0laRV9CSVRTID0gMjU2OworCisgIC8vIEphdmEgTWVzc2FnZSBEaWdlc3QgbmFtZSBmb3IgU0hBIDI1NgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBMjU2ID0gIlNIQS0yNTYiOworCisgIC8vIFByZS1zaGFyZWQgcGFzc3dvcmQgaGFzaCByZXByZXNlbnRlZCBhcyBhbiBpbnRlZ2VyCisgIHByaXZhdGUgQmlnSW50ZWdlciBwYXNzd29yZEhhc2g7CisKKyAgLy8gQ3VycmVudCBzdGF0ZSBvZiB0aGUgaGFuZHNoYWtlCisgIHByaXZhdGUgU3RhdGUgaGFuZHNoYWtlU3RhdGU7CisKKyAgLy8gRGVyaXZlZCBzaGFyZWQga2V5CisgIHByaXZhdGUgYnl0ZVtdIHNoYXJlZEtleTsKKworICAvLyBQcml2YXRlIGtleSAocmFuZG9tIHNjYWxhcikKKyAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHZhbHVlWDsKKworICAvLyBQdWJsaWMga2V5IChyYW5kb20gcG9pbnQsIGluIGV4dGVuZGVkIG5vdGF0aW9uLCBiYXNlZCBvbiB2YWx1ZVgpCisgIHByaXZhdGUgQmlnSW50ZWdlcltdIHBvaW50WDsKKworICAvLyBDb21taXRtZW50IHdlJ3ZlIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnR5ICh0aGVpciBwYXNzd29yZC1hdXRoZW50aWNhdGVkIHB1YmxpYyBrZXkpCisgIHByaXZhdGUgQmlnSW50ZWdlcltdIHRoZWlyQ29tbWl0bWVudFBvaW50QWZmaW5lOworICBwcml2YXRlIEJpZ0ludGVnZXJbXSB0aGVpckNvbW1pdG1lbnRQb2ludEV4dGVuZGVkOworCisgIC8vIENvbW1pdG1lbnQgd2UndmUgc2VudCB0byB0aGUgb3RoZXIgcGFydHkgKG91ciBwYXNzd29yZC1hdXRoZW50aWNhdGVkIHB1YmxpYyBrZXkpCisgIHByaXZhdGUgQmlnSW50ZWdlcltdIG91ckNvbW1pdG1lbnRQb2ludEFmZmluZTsKKyAgcHJpdmF0ZSBCaWdJbnRlZ2VyW10gb3VyQ29tbWl0bWVudFBvaW50RXh0ZW5kZWQ7CisKKyAgcHJpdmF0ZSBlbnVtIFN0YXRlIHsKKyAgICAvLyBJbml0aWF0b3Igc3RhdGUKKyAgICBJTklUSUFUT1JfU1RBUlQsCisgICAgSU5JVElBVE9SX1dBSVRJTkdfRk9SX1JFU1BPTkRFUl9DT01NSVRNRU5ULAorICAgIElOSVRJQVRPUl9BRlRFUl9SRVNQT05ERVJfQ09NTUlUTUVOVCwKKyAgICBJTklUSUFUT1JfV0FJVElOR19GT1JfUkVTUE9OREVSX0hBU0gsCisKKyAgICAvLyBSZXNwb25kZXIgc3RhdGUKKyAgICBSRVNQT05ERVJfU1RBUlQsCisgICAgUkVTUE9OREVSX0FGVEVSX0lOSVRJQVRPUl9DT01NSVRNRU5ULAorICAgIFJFU1BPTkRFUl9XQUlUSU5HX0ZPUl9JTklUSUFUT1JfSEFTSCwKKyAgICBSRVNQT05ERVJfQUZURVJfSU5JVElBVE9SX0hBU0gsCisKKyAgICAvLyBDb21tb24gY29tcGxldGlvbiBzdGF0ZQorICAgIEhBTkRTSEFLRV9GSU5JU0hFRCwKKyAgICBIQU5EU0hBS0VfQUxSRUFEWV9VU0VECisgIH0KKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgRDJEU3Bha2VFZDI1NTE5SGFuZHNoYWtlKFN0YXRlIHN0YXRlLCBieXRlW10gcGFzc3dvcmQpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIGlmIChwYXNzd29yZCA9PSBudWxsIHx8IHBhc3N3b3JkLmxlbmd0aCA8IE1JTl9QQVNTV09SRF9MRU5HVEgpIHsKKyAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIlBhc3N3b3JkcyBtdXN0IGJlIGF0IGxlYXN0ICIgKyBNSU5fUEFTU1dPUkRfTEVOR1RIICsgIiBieXRlcyIpOworICAgIH0KKworICAgIGhhbmRzaGFrZVN0YXRlID0gc3RhdGU7CisgICAgcGFzc3dvcmRIYXNoID0gbmV3IEJpZ0ludGVnZXIoMSAvKiBwb3NpdGl2ZSAqLywgaGFzaChwYXNzd29yZCkpOworCisgICAgZG8geworICAgICAgdmFsdWVYID0gbmV3IEJpZ0ludGVnZXIoUE9JTlRfU0laRV9CSVRTLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgIH0gd2hpbGUgKHZhbHVlWC5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSk7CisKKyAgICB0cnkgeworICAgICAgcG9pbnRYID0gRWQyNTUxOS5zY2FsYXJNdWx0aXBseUV4dGVuZGVkUG9pbnQoQiwgdmFsdWVYKTsKKyAgICB9IGNhdGNoIChFZDI1NTE5RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIkNvdWxkIG5vdCBtYWtlIHB1YmxpYyBrZXkgcG9pbnQiLCBlKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNIYW5kc2hha2VDb21wbGV0ZSgpIHsKKyAgICBzd2l0Y2ggKGhhbmRzaGFrZVN0YXRlKSB7CisgICAgICBjYXNlIEhBTkRTSEFLRV9GSU5JU0hFRDoKKyAgICAgICAgLy8gZmFsbC10aHJvdWdoIGludGVudGlvbmFsCisgICAgICBjYXNlIEhBTkRTSEFLRV9BTFJFQURZX1VTRUQ6CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0TmV4dEhhbmRzaGFrZU1lc3NhZ2UoKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBieXRlW10gbmV4dE1lc3NhZ2U7CisKKyAgICBzd2l0Y2goaGFuZHNoYWtlU3RhdGUpIHsKKyAgICAgIGNhc2UgSU5JVElBVE9SX1NUQVJUOgorICAgICAgICBuZXh0TWVzc2FnZSA9IG1ha2VDb21taXRtZW50UG9pbnRNZXNzYWdlKHRydWUgLyogaXMgaW5pdGlhdG9yICovKTsKKyAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBTdGF0ZS5JTklUSUFUT1JfV0FJVElOR19GT1JfUkVTUE9OREVSX0NPTU1JVE1FTlQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJFU1BPTkRFUl9BRlRFUl9JTklUSUFUT1JfQ09NTUlUTUVOVDoKKyAgICAgICAgbmV4dE1lc3NhZ2UgPSBtYWtlQ29tbWl0bWVudFBvaW50TWVzc2FnZShmYWxzZSAvKiBpcyBpbml0aWF0b3IgKi8pOworICAgICAgICBoYW5kc2hha2VTdGF0ZSA9IFN0YXRlLlJFU1BPTkRFUl9XQUlUSU5HX0ZPUl9JTklUSUFUT1JfSEFTSDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSU5JVElBVE9SX0FGVEVSX1JFU1BPTkRFUl9DT01NSVRNRU5UOgorICAgICAgICBuZXh0TWVzc2FnZSA9IG1ha2VTaGFyZWRLZXlIYXNoTWVzc2FnZSh0cnVlIC8qIGlzIGluaXRpYXRvciAqLywgbnVsbCAvKiBubyBwYXlsb2FkICovKTsKKyAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBTdGF0ZS5JTklUSUFUT1JfV0FJVElOR19GT1JfUkVTUE9OREVSX0hBU0g7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJFU1BPTkRFUl9BRlRFUl9JTklUSUFUT1JfSEFTSDoKKyAgICAgICAgbmV4dE1lc3NhZ2UgPSBtYWtlU2hhcmVkS2V5SGFzaE1lc3NhZ2UoZmFsc2UgLyogaXMgaW5pdGlhdG9yICovLCBudWxsIC8qIG5vIHBheWxvYWQgKi8pOworICAgICAgICBoYW5kc2hha2VTdGF0ZSA9IFN0YXRlLkhBTkRTSEFLRV9GSU5JU0hFRDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIkNhbm5vdCBnZXQgbmV4dCBtZXNzYWdlIGluIHN0YXRlOiAiICsgaGFuZHNoYWtlU3RhdGUpOworICAgIH0KKworICAgIHJldHVybiBuZXh0TWVzc2FnZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldE5leHRIYW5kc2hha2VNZXNzYWdlKGJ5dGVbXSBwYXlsb2FkKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBieXRlW10gbmV4dE1lc3NhZ2U7CisKKyAgICBzd2l0Y2ggKGhhbmRzaGFrZVN0YXRlKSB7CisgICAgICBjYXNlIFJFU1BPTkRFUl9BRlRFUl9JTklUSUFUT1JfSEFTSDoKKyAgICAgICAgbmV4dE1lc3NhZ2UgPSBtYWtlU2hhcmVkS2V5SGFzaE1lc3NhZ2UoZmFsc2UgLyogaXMgaW5pdGlhdG9yICovLCBwYXlsb2FkKTsKKyAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBTdGF0ZS5IQU5EU0hBS0VfRklOSVNIRUQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKAorICAgICAgICAgICAgIkNhbm5vdCBzZW5kIGhhbmRzaGFrZSBtZXNzYWdlIHdpdGggcGF5bG9hZCBpbiBzdGF0ZTogIiArIGhhbmRzaGFrZVN0YXRlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV4dE1lc3NhZ2U7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBtYWtlQ29tbWl0bWVudFBvaW50TWVzc2FnZShib29sZWFuIGlzSW5pdGlhdG9yKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgb3VyQ29tbWl0bWVudFBvaW50RXh0ZW5kZWQgPQorICAgICAgICAgIEVkMjU1MTkuc2NhbGFyTXVsdGlwbHlFeHRlbmRlZFBvaW50KGlzSW5pdGlhdG9yID8gS00gOiBLTiwgcGFzc3dvcmRIYXNoKTsKKyAgICAgIG91ckNvbW1pdG1lbnRQb2ludEV4dGVuZGVkID0gRWQyNTUxOS5hZGRFeHRlbmRlZFBvaW50cyhvdXJDb21taXRtZW50UG9pbnRFeHRlbmRlZCwgcG9pbnRYKTsKKyAgICAgIG91ckNvbW1pdG1lbnRQb2ludEFmZmluZSA9IEVkMjU1MTkudG9BZmZpbmUob3VyQ29tbWl0bWVudFBvaW50RXh0ZW5kZWQpOworCisgICAgICByZXR1cm4gU3Bha2VIYW5kc2hha2VNZXNzYWdlLm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRFY1BvaW50KAorICAgICAgICAgICAgICBFY1BvaW50Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRDdXJ2ZShEZXZpY2VUb0RldmljZU1lc3NhZ2VzUHJvdG8uQ3VydmUuRURfMjU1MTkpCisgICAgICAgICAgICAgICAgLnNldFgoQnl0ZVN0cmluZy5jb3B5RnJvbShvdXJDb21taXRtZW50UG9pbnRBZmZpbmVbMF0udG9CeXRlQXJyYXkoKSkpCisgICAgICAgICAgICAgICAgLnNldFkoQnl0ZVN0cmluZy5jb3B5RnJvbShvdXJDb21taXRtZW50UG9pbnRBZmZpbmVbMV0udG9CeXRlQXJyYXkoKSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgLnNldEZsb3dOdW1iZXIoaXNJbml0aWF0b3IgPyAxIDogMiAvKiBmaXJzdCBvciBzZWNvbmQgbWVzc2FnZSAqLykKKyAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgIC50b0J5dGVBcnJheSgpOworICAgIH0gY2F0Y2ggKEVkMjU1MTlFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiQ291bGQgbm90IG1ha2UgY29tbWl0bWVudCBwb2ludCBtZXNzYWdlIiwgZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIG1ha2VTaGFyZWRLZXkoYm9vbGVhbiBpc0luaXRpYXRvcikgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisKKyAgICBpZiAoaGFuZHNoYWtlU3RhdGUgIT0gU3RhdGUuUkVTUE9OREVSX1NUQVJUCisgICAgICAgICYmIGhhbmRzaGFrZVN0YXRlICE9IFN0YXRlLklOSVRJQVRPUl9XQUlUSU5HX0ZPUl9SRVNQT05ERVJfQ09NTUlUTUVOVCkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiQ2Fubm90IG1ha2Ugc2hhcmVkIGtleSBpbiBzdGF0ZTogIiArIGhhbmRzaGFrZVN0YXRlKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgQmlnSW50ZWdlcltdIGtOTVAgPSBFZDI1NTE5LnNjYWxhck11bHRpcGx5RXh0ZW5kZWRQb2ludChpc0luaXRpYXRvciA/IEtOIDogS00sIHBhc3N3b3JkSGFzaCk7CisKKyAgICAgIC8vIFRoZWlyUHVibGljS2V5ID0gVGhlaXJDb21taXRtZW50IC0ga05NUCA9IChUaGVpclB1YmxpY0tleSArIGtOTVApIC0ga05NUAorICAgICAgQmlnSW50ZWdlcltdIHRoZWlyUHVibGljS2V5ID0KKyAgICAgICAgICBFZDI1NTE5LnN1YnRyYWN0RXh0ZW5kZWRQb2ludHModGhlaXJDb21taXRtZW50UG9pbnRFeHRlbmRlZCwga05NUCk7CisKKyAgICAgIEJpZ0ludGVnZXJbXSBzaGFyZWRLZXlQb2ludCA9IEVkMjU1MTkuc2NhbGFyTXVsdGlwbHlFeHRlbmRlZFBvaW50KHRoZWlyUHVibGljS2V5LCB2YWx1ZVgpOworICAgICAgc2hhcmVkS2V5ID0gaGFzaChwb2ludFRvQnl0ZUFycmF5KEVkMjU1MTkudG9BZmZpbmUoc2hhcmVkS2V5UG9pbnQpKSk7CisgICAgfSBjYXRjaCAoRWQyNTUxOUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJFcnJvciBjb21wdXRpbmcgc2hhcmVkIGtleSIsIGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIG1ha2VTaGFyZWRLZXlIYXNoTWVzc2FnZShib29sZWFuIGlzSW5pdGlhdG9yLCBieXRlW10gcGF5bG9hZCkKKyAgICAgIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIFNwYWtlSGFuZHNoYWtlTWVzc2FnZS5CdWlsZGVyIGhhbmRzaGFrZU1lc3NhZ2UgPSBTcGFrZUhhbmRzaGFrZU1lc3NhZ2UubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRIYXNoVmFsdWUoQnl0ZVN0cmluZy5jb3B5RnJvbShjb21wdXRlT3VyS2V5SGFzaChpc0luaXRpYXRvcikpKQorICAgICAgICAuc2V0Rmxvd051bWJlcihpc0luaXRpYXRvciA/IDMgOiA0IC8qIHRoaXJkIG9yIGZvdXJ0aCBtZXNzYWdlICovKTsKKworICAgIGlmIChjYW5TZW5kUGF5bG9hZEluSGFuZHNoYWtlTWVzc2FnZSgpICYmIHBheWxvYWQgIT0gbnVsbCkgeworICAgICAgRGV2aWNlVG9EZXZpY2VNZXNzYWdlIGRldmljZVRvRGV2aWNlTWVzc2FnZSA9CisgICAgICAgICAgRDJEQ29ubmVjdGlvbkNvbnRleHQuY3JlYXRlRGV2aWNlVG9EZXZpY2VNZXNzYWdlKHBheWxvYWQsIDEgLyogc2VxdWVuY2UgbnVtYmVyICovKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGhhbmRzaGFrZU1lc3NhZ2Uuc2V0UGF5bG9hZChCeXRlU3RyaW5nLmNvcHlGcm9tKAorICAgICAgICAgICAgRDJEQ3J5cHRvT3BzLnNpZ25jcnlwdFBheWxvYWQoCisgICAgICAgICAgICAgIG5ldyBQYXlsb2FkKFBheWxvYWRUeXBlLkRFVklDRV9UT19ERVZJQ0VfUkVTUE9OREVSX0hFTExPX1BBWUxPQUQsCisgICAgICAgICAgICAgICAgICBkZXZpY2VUb0RldmljZU1lc3NhZ2UudG9CeXRlQXJyYXkoKSksCisgICAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKHNoYXJlZEtleSwgIkFFUyIpKSkpOworICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiB8IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIkNhbm5vdCBzZXQgcGF5bG9hZCIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBoYW5kc2hha2VNZXNzYWdlLmJ1aWxkKCkudG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIGNvbXB1dGVPdXJLZXlIYXNoKGJvb2xlYW4gaXNJbml0aWF0b3IpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIHJldHVybiBoYXNoKGNvbmNhdCgKKyAgICAgICAgbmV3IGJ5dGVbXSB7IChieXRlKSAoaXNJbml0aWF0b3IgPyAwIDogMSkgfSwKKyAgICAgICAgcG9pbnRUb0J5dGVBcnJheSh0aGVpckNvbW1pdG1lbnRQb2ludEFmZmluZSksCisgICAgICAgIHBvaW50VG9CeXRlQXJyYXkob3VyQ29tbWl0bWVudFBvaW50QWZmaW5lKSwKKyAgICAgICAgc2hhcmVkS2V5KSk7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBjb21wdXRlVGhlaXJLZXlIYXNoKGJvb2xlYW4gaXNJbml0aWF0b3IpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIHJldHVybiBoYXNoKGNvbmNhdCgKKyAgICAgICAgbmV3IGJ5dGVbXSB7IChieXRlKSAoaXNJbml0aWF0b3IgPyAxIDogMCkgfSwKKyAgICAgICAgcG9pbnRUb0J5dGVBcnJheShvdXJDb21taXRtZW50UG9pbnRBZmZpbmUpLAorICAgICAgICBwb2ludFRvQnl0ZUFycmF5KHRoZWlyQ29tbWl0bWVudFBvaW50QWZmaW5lKSwKKyAgICAgICAgc2hhcmVkS2V5KSk7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBwb2ludFRvQnl0ZUFycmF5KEJpZ0ludGVnZXJbXSBwKSB7CisgICAgcmV0dXJuIGNvbmNhdChwWzBdLnRvQnl0ZUFycmF5KCksIHBbMV0udG9CeXRlQXJyYXkoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gY2FuU2VuZFBheWxvYWRJbkhhbmRzaGFrZU1lc3NhZ2UoKSB7CisgICAgcmV0dXJuIGhhbmRzaGFrZVN0YXRlID09IFN0YXRlLlJFU1BPTkRFUl9BRlRFUl9JTklUSUFUT1JfSEFTSDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIHBhcnNlSGFuZHNoYWtlTWVzc2FnZShieXRlW10gaGFuZHNoYWtlTWVzc2FnZSkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgaWYgKGhhbmRzaGFrZU1lc3NhZ2UgPT0gbnVsbCB8fCBoYW5kc2hha2VNZXNzYWdlLmxlbmd0aCA9PSAwKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJIYW5kc2hha2UgbWVzc2FnZSB0b28gc2hvcnQiKTsKKyAgICB9CisKKyAgICBieXRlW10gcGF5bG9hZCA9IG5ldyBieXRlWzBdOworCisgICAgc3dpdGNoKGhhbmRzaGFrZVN0YXRlKSB7CisgICAgICBjYXNlIFJFU1BPTkRFUl9TVEFSVDoKKyAgICAgICAgLy8gbm8gcGF5bG9hZCBjYW4gYmUgc2VudCBpbiB0aGlzIG1lc3NhZ2UKKyAgICAgICAgcGFyc2VDb21taXRtZW50TWVzc2FnZShoYW5kc2hha2VNZXNzYWdlLCBmYWxzZSAvKiBpcyBpbml0aWF0b3IgKi8pOworICAgICAgICBtYWtlU2hhcmVkS2V5KGZhbHNlIC8qIGlzIGluaXRpYXRvciAqLyk7CisgICAgICAgIGhhbmRzaGFrZVN0YXRlID0gU3RhdGUuUkVTUE9OREVSX0FGVEVSX0lOSVRJQVRPUl9DT01NSVRNRU5UOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJTklUSUFUT1JfV0FJVElOR19GT1JfUkVTUE9OREVSX0NPTU1JVE1FTlQ6CisgICAgICAgIC8vIG5vIHBheWxvYWQgY2FuIGJlIHNlbnQgaW4gdGhpcyBtZXNzYWdlCisgICAgICAgIHBhcnNlQ29tbWl0bWVudE1lc3NhZ2UoaGFuZHNoYWtlTWVzc2FnZSwgdHJ1ZSAvKiBpcyBpbml0aWF0b3IgKi8pOworICAgICAgICBtYWtlU2hhcmVkS2V5KHRydWUgLyogaXMgaW5pdGlhdG9yICovKTsKKyAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBTdGF0ZS5JTklUSUFUT1JfQUZURVJfUkVTUE9OREVSX0NPTU1JVE1FTlQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJFU1BPTkRFUl9XQUlUSU5HX0ZPUl9JTklUSUFUT1JfSEFTSDoKKyAgICAgICAgLy8gbm8gcGF5bG9hZCBjYW4gYmUgc2VudCBpbiB0aGlzIG1lc3NhZ2UKKyAgICAgICAgcGFyc2VIYXNoTWVzc2FnZShoYW5kc2hha2VNZXNzYWdlLCBmYWxzZSAvKiBpcyBpbml0aWF0b3IgKi8pOworICAgICAgICBoYW5kc2hha2VTdGF0ZSA9IFN0YXRlLlJFU1BPTkRFUl9BRlRFUl9JTklUSUFUT1JfSEFTSDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSU5JVElBVE9SX1dBSVRJTkdfRk9SX1JFU1BPTkRFUl9IQVNIOgorICAgICAgICBwYXlsb2FkID0gcGFyc2VIYXNoTWVzc2FnZShoYW5kc2hha2VNZXNzYWdlLCB0cnVlIC8qIGlzIGluaXRpYXRvciAqLyk7CisgICAgICAgIGhhbmRzaGFrZVN0YXRlID0gU3RhdGUuSEFORFNIQUtFX0ZJTklTSEVEOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiQ2Fubm90IHBhcnNlIG1lc3NhZ2UgaW4gc3RhdGU6ICIgKyBoYW5kc2hha2VTdGF0ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHBheWxvYWQ7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBwYXJzZUhhc2hNZXNzYWdlKGJ5dGVbXSBoYW5kc2hha2VNZXNzYWdlLCBib29sZWFuIGlzSW5pdGlhdG9yKQorICAgICAgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgU3Bha2VIYW5kc2hha2VNZXNzYWdlIGhhc2hNZXNzYWdlOworCisgICAgLy8gUGFyc2UgdGhlIG1lc3NhZ2UKKyAgICB0cnkgeworICAgICAgaGFzaE1lc3NhZ2UgPSBTcGFrZUhhbmRzaGFrZU1lc3NhZ2UucGFyc2VGcm9tKGhhbmRzaGFrZU1lc3NhZ2UpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgaGFzaCBtZXNzYWdlIiwgZSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZmxvdyBudW1iZXIKKyAgICBpZiAoIWhhc2hNZXNzYWdlLmhhc0Zsb3dOdW1iZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiSGFzaCBtZXNzYWdlIG1pc3NpbmcgZmxvdyBudW1iZXIiKTsKKyAgICB9CisgICAgaW50IGV4cGVjdGVkRmxvd051bWJlciA9IGlzSW5pdGlhdG9yID8gNCA6IDM7CisgICAgaW50IGFjdHVhbEZsb3dOdW1iZXIgPSBoYXNoTWVzc2FnZS5nZXRGbG93TnVtYmVyKCk7CisgICAgaWYgKGFjdHVhbEZsb3dOdW1iZXIgIT0gZXhwZWN0ZWRGbG93TnVtYmVyKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJIYXNoIG1lc3NhZ2UgaGFzIGZsb3cgbnVtYmVyICIgKyBhY3R1YWxGbG93TnVtYmVyCisgICAgICAgICAgKyAiLCBidXQgZXhwZWN0ZWQgZmxvdyBudW1iZXIgIiArIGV4cGVjdGVkRmxvd051bWJlcik7CisgICAgfQorCisgICAgLy8gQ2hlY2sgYW5kIGV4dHJhY3QgaGFzaAorICAgIGlmICghaGFzaE1lc3NhZ2UuaGFzSGFzaFZhbHVlKCkpIHsKKyAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIkhhc2ggbWVzc2FnZSBtaXNzaW5nIGhhc2ggdmFsdWUiKTsKKyAgICB9CisKKyAgICBieXRlW10gdGhlaXJIYXNoID0gaGFzaE1lc3NhZ2UuZ2V0SGFzaFZhbHVlKCkudG9CeXRlQXJyYXkoKTsKKyAgICBieXRlW10gdGhlaXJDb3JyZWN0SGFzaCA9IGNvbXB1dGVUaGVpcktleUhhc2goaXNJbml0aWF0b3IpOworCisgICAgaWYgKCFjb25zdGFudFRpbWVBcnJheUVxdWFscyh0aGVpckNvcnJlY3RIYXNoLCB0aGVpckhhc2gpKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJIYXNoIG1lc3NhZ2UgaGFkIGluY29ycmVjdCBoYXNoIHZhbHVlIik7CisgICAgfQorCisgICAgaWYgKGlzSW5pdGlhdG9yICYmIGhhc2hNZXNzYWdlLmhhc1BheWxvYWQoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgRGV2aWNlVG9EZXZpY2VNZXNzYWdlIG1lc3NhZ2UgPSBEMkRDcnlwdG9PcHMuZGVjcnlwdFJlc3BvbmRlckhlbGxvTWVzc2FnZSgKKyAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKHNoYXJlZEtleSwgIkFFUyIpLAorICAgICAgICAgICAgaGFzaE1lc3NhZ2UuZ2V0UGF5bG9hZCgpLnRvQnl0ZUFycmF5KCkpOworCisgICAgICAgIGlmIChtZXNzYWdlLmdldFNlcXVlbmNlTnVtYmVyKCkgIT0gMSkgeworICAgICAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIkluY29ycmVjdCBzZXF1ZW5jZSBudW1iZXIgaW4gcmVzcG9uZGVyIGhlbGxvIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWVzc2FnZS5nZXRNZXNzYWdlKCkudG9CeXRlQXJyYXkoKTsKKworICAgICAgfSBjYXRjaCAoU2lnbmF0dXJlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiRXJyb3IgcmVjb3ZlcmluZyBwYXlsb2FkIGZyb20gaGFzaCBtZXNzYWdlIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gZW1wdHkvbm8gcGF5bG9hZAorICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwYXJzZUNvbW1pdG1lbnRNZXNzYWdlKGJ5dGVbXSBoYW5kc2hha2VNZXNzYWdlLCBib29sZWFuIGlzSW5pdGlhdG9yKQorICAgICAgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgU3Bha2VIYW5kc2hha2VNZXNzYWdlIGNvbW1pdG1lbnRNZXNzYWdlOworCisgICAgLy8gUGFyc2UgdGhlIG1lc3NhZ2UKKyAgICB0cnkgeworICAgICAgY29tbWl0bWVudE1lc3NhZ2UgPSBTcGFrZUhhbmRzaGFrZU1lc3NhZ2UucGFyc2VGcm9tKGhhbmRzaGFrZU1lc3NhZ2UpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgY29tbWl0bWVudCBtZXNzYWdlIiwgZSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZmxvdyBudW1iZXIKKyAgICBpZiAoIWNvbW1pdG1lbnRNZXNzYWdlLmhhc0Zsb3dOdW1iZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiQ29tbWl0bWVudCBtZXNzYWdlIG1pc3NpbmcgZmxvdyBudW1iZXIiKTsKKyAgICB9CisgICAgaWYgKGNvbW1pdG1lbnRNZXNzYWdlLmdldEZsb3dOdW1iZXIoKSAhPSAoaXNJbml0aWF0b3IgPyAyIDogMSkpIHsKKyAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIkNvbW1pdG1lbnQgbWVzc2FnZSBoYXMgd3JvbmcgZmxvdyBudW1iZXIiKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBwb2ludCBhbmQgY3VydmU7IGFuZCBleHRyYWN0IHBvaW50CisgICAgaWYgKCFjb21taXRtZW50TWVzc2FnZS5oYXNFY1BvaW50KCkpIHsKKyAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oIkNvbW1pdG1lbnQgbWVzc2FnZSBtaXNzaW5nIHBvaW50Iik7CisgICAgfQorICAgIEVjUG9pbnQgY29tbWl0bWVudFBvaW50ID0gY29tbWl0bWVudE1lc3NhZ2UuZ2V0RWNQb2ludCgpOworICAgIGlmICghY29tbWl0bWVudFBvaW50Lmhhc0N1cnZlKCkKKyAgICAgICAgfHwgY29tbWl0bWVudFBvaW50LmdldEN1cnZlKCkgIT0gRGV2aWNlVG9EZXZpY2VNZXNzYWdlc1Byb3RvLkN1cnZlLkVEXzI1NTE5KSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJDb21taXRtZW50IG1lc3NhZ2UgaGFzIHdyb25nIGN1cnZlIik7CisgICAgfQorCisgICAgaWYgKCFjb21taXRtZW50UG9pbnQuaGFzWCgpKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJDb21taXRtZW50IHBvaW50IG1pc3NpbmcgeCBjb29yZGluYXRlIik7CisgICAgfQorCisgICAgaWYgKCFjb21taXRtZW50UG9pbnQuaGFzWSgpKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJDb21taXRtZW50IHBvaW50IG1pc3NpbmcgeSBjb29yZGluYXRlIik7CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIHBvaW50CisgICAgdGhlaXJDb21taXRtZW50UG9pbnRBZmZpbmUgPSBuZXcgQmlnSW50ZWdlcltdIHsKKyAgICAgICAgbmV3IEJpZ0ludGVnZXIoY29tbWl0bWVudFBvaW50LmdldFgoKS50b0J5dGVBcnJheSgpKSwKKyAgICAgICAgbmV3IEJpZ0ludGVnZXIoY29tbWl0bWVudFBvaW50LmdldFkoKS50b0J5dGVBcnJheSgpKQorICAgIH07CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgcG9pbnQgdG8gYmUgc3VyZQorICAgIHRyeSB7CisgICAgICBFZDI1NTE5LnZhbGlkYXRlQWZmaW5lUG9pbnQodGhlaXJDb21taXRtZW50UG9pbnRBZmZpbmUpOworICAgICAgdGhlaXJDb21taXRtZW50UG9pbnRFeHRlbmRlZCA9IEVkMjU1MTkudG9FeHRlbmRlZCh0aGVpckNvbW1pdG1lbnRQb2ludEFmZmluZSk7CisgICAgfSBjYXRjaCAoRWQyNTUxOUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCJFcnJvciB2YWxpZGF0aW5nIHRoZWlyIGNvbW1pdG1lbnQgcG9pbnQiLCBlKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEQyRENvbm5lY3Rpb25Db250ZXh0IHRvQ29ubmVjdGlvbkNvbnRleHQoKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBpZiAoaGFuZHNoYWtlU3RhdGUgPT0gU3RhdGUuSEFORFNIQUtFX0FMUkVBRFlfVVNFRCkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiQ2Fubm90IHJldXNlIGhhbmRzaGFrZSBjb250ZXh0OyBpcyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiKTsKKyAgICB9CisKKyAgICBpZiAoIWlzSGFuZHNoYWtlQ29tcGxldGUoKSkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZTsgY2Fubm90IGNyZWF0ZSBjb25uZWN0aW9uIGNvbnRleHQiKTsKKyAgICB9CisKKyAgICBoYW5kc2hha2VTdGF0ZSA9IFN0YXRlLkhBTkRTSEFLRV9BTFJFQURZX1VTRUQ7CisKKyAgICAvLyBCb3RoIHNpZGVzIHN0YXJ0IHdpdGggYW4gaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgb2YgMSBiZWNhdXNlIHRoZSBsYXN0IG1lc3NhZ2Ugb2YgdGhlCisgICAgLy8gaGFuZHNoYWtlIGhhZCBhbiBvcHRpb25hbCBwYXlsb2FkIHdpdGggc2VxdWVuY2UgbnVtYmVyIDEuICBEMkRDb25uZWN0aW9uQ29udGV4dCByZW1lbWJlcnMKKyAgICAvLyB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgdXNlZC4KKyAgICByZXR1cm4gbmV3IEQyRENvbm5lY3Rpb25Db250ZXh0VjAoCisgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKHNoYXJlZEtleSwgIkFFUyIpLCAxIC8qIGluaXRpYWxTZXF1ZW5jZU51bWJlciAqLyk7CisgIH0KKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgYnl0ZSBhcnJheSBjb25jYXRlbmF0aW9uIGNvcGllZCBmcm9tIEd1YXZhLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbmNhdChieXRlW10uLi4gYXJyYXlzKSB7CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgZm9yIChieXRlW10gYXJyYXkgOiBhcnJheXMpIHsKKyAgICAgIGxlbmd0aCArPSBhcnJheS5sZW5ndGg7CisgICAgfQorCisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgaW50IHBvcyA9IDA7CisgICAgZm9yIChieXRlW10gYXJyYXkgOiBhcnJheXMpIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgcG9zLCBhcnJheS5sZW5ndGgpOworICAgICAgcG9zICs9IGFycmF5Lmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGhhc2goYnl0ZVtdIG1lc3NhZ2UpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShTSEEyNTYpLmRpZ2VzdChtZXNzYWdlKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiRXJyb3IgcGVyZm9ybWluZyBoYXNoIiwgZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb25zdGFudFRpbWVBcnJheUVxdWFscyhieXRlW10gYSwgYnl0ZVtdIGIpIHsKKyAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIChhID09IGIpOworICAgIH0KKyAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYnl0ZSByZXN1bHQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgeworICAgICAgcmVzdWx0ID0gKGJ5dGUpIChyZXN1bHQgfCAoYVtpXSBeIGJbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRWQyNTUxOS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9FZDI1NTE5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhMjU2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vRWQyNTUxOS5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKK2ltcG9ydCBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIuT05FOworaW1wb3J0IHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlci5aRVJPOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBFZDI1NTE5IHR3aXN0ZWQgRWR3YXJkcyBjdXJ2ZS4gIFNlZSBodHRwOi8vZWQyNTUxOS5jci55cC50by8gZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcHVibGljIGNsYXNzIEVkMjU1MTkgeworCisgIC8vIERvbid0IGluc3RhbnRpYXRlCisgIHByaXZhdGUgRWQyNTUxOSgpIHsgfQorCisgIC8vIEN1cnZlIHBhcmFtZXRlcnMgKGh0dHA6Ly9lZDI1NTE5LmNyLnlwLnRvLykKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFWF9SQURJWCA9IDE2OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVkMjU1MTlfUCA9CisgICAgICBuZXcgQmlnSW50ZWdlcigiN0ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRCIsIEhFWF9SQURJWCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRWQyNTUxOV9EID0KKyAgICAgIG5ldyBCaWdJbnRlZ2VyKCI1MjAzNkNFRTJCNkZGRTczOENDNzQwNzk3Nzc5RTg5ODAwNzAwQTRENDE0MUQ4QUI3NUVCNERDQTEzNTk3OEEzIiwgSEVYX1JBRElYKTsKKworICAvLyBIZWxwcyB0byBkbyBmYXN0IGFkZGl0aW9uIGsgPSAyKmQKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFZDI1NTE5X0sgPQorICAgICAgbmV3IEJpZ0ludGVnZXIoIjI0MDZEOURDNTZERkZDRTcxOThFODBGMkVFRjNEMTMwMDBFMDE0OUE4MjgzQjE1NkVCRDY5Qjk0MjZCMkYxNTkiLCBIRVhfUkFESVgpOworCisgIC8vIElkZW50aXR5IHBvaW50IGluIGV4dGVuZGVkIHJlcHJlc2VudGF0aW9uICgwLCAxLCAxLCAwKQorICBzdGF0aWMgZmluYWwgQmlnSW50ZWdlcltdIElERU5USVRZX1BPSU5UID0gbmV3IEJpZ0ludGVnZXJbXSB7WkVSTywgT05FLCBPTkUsIFpFUk99OworCisgIC8vIEhlbHBzIGZvciByZWFkaW5nIGNvb3JkaW5hdGUgdHlwZSBpbiBwb2ludCByZXByZXNlbnRhdGlvbgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFogPSAyOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVCA9IDM7CisKKyAgLy8gTnVtYmVyIG9mIGJpdHMgdGhhdCB3ZSBuZWVkIHRvIHJlcHJlc2VudCBhIHBvaW50LiAgUmVhbGlzdGljYWxseSwgd2Ugb25seSBuZWVkIDI1NSwgYnV0IHVzaW5nCisgIC8vIDI1NiBkb2Vzbid0IGh1cnQuCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0lOVF9TSVpFX0JJVFMgPSAyNTY7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyBwb2ludCBwIGJ5IHNjYWxhciBrLiBBIHBvaW50IGlzIHJlcHJlc2VudGVkIGFzIGEgQmlnSW50ZWdlcgorICAgKiBhcnJheSBvZiBsZW5ndGggMiB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCAoYXQgaW5kZXggMCkgaXMgdGhlIFggY29vcmRpbmF0ZSBhbmQgdGhlIHNlY29uZAorICAgKiBlbGVtZW50IChhdCBpbmRleCAxKSBpcyB0aGUgWSBjb29yZGluYXRlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyW10gc2NhbGFyTXVsdGlwbHlBZmZpbmVQb2ludChCaWdJbnRlZ2VyW10gcCwgQmlnSW50ZWdlciBrKQorICAgICAgdGhyb3dzIEVkMjU1MTlFeGNlcHRpb24geworICAgIHJldHVybiB0b0FmZmluZShzY2FsYXJNdWx0aXBseUV4dGVuZGVkUG9pbnQodG9FeHRlbmRlZChwKSwgaykpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0d28gcG9pbnRzIGluIGFmZmluZSByZXByZXNlbnRhdGlvbi4gQSBwb2ludCBpcyByZXByZXNlbnRlZCBhcyBhIEJpZ0ludGVnZXIKKyAgICogYXJyYXkgb2YgbGVuZ3RoIDIgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgKGF0IGluZGV4IDApIGlzIHRoZSBYIGNvb3JkaW5hdGUgYW5kIHRoZSBzZWNvbmQKKyAgICogZWxlbWVudCAoYXQgaW5kZXggMSkgaXMgdGhlIFkgY29vcmRpbmF0ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlcltdIGFkZEFmZmluZVBvaW50cyhCaWdJbnRlZ2VyW10gcDEsIEJpZ0ludGVnZXJbXSBwMikKKyAgICAgIHRocm93cyBFZDI1NTE5RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdG9BZmZpbmUoYWRkRXh0ZW5kZWRQb2ludHModG9FeHRlbmRlZChwMSksIHRvRXh0ZW5kZWQocDIpKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHAyIGZyb20gcDEgKGkuZS4sIHAxIC0gcDIpIGluIGFmZmluZSByZXByZXNlbnRhdGlvbi4gQSBwb2ludAorICAgKiBpcyByZXByZXNlbnRlZCBhcyBhIEJpZ0ludGVnZXIgYXJyYXkgb2YgbGVuZ3RoIDIgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgKGF0IGluZGV4IDApIGlzIHRoZSBYCisgICAqIGNvb3JkaW5hdGUgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCAoYXQgaW5kZXggMSkgaXMgdGhlIFkgY29vcmRpbmF0ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlcltdIHN1YnRyYWN0QWZmaW5lUG9pbnRzKEJpZ0ludGVnZXJbXSBwMSwgQmlnSW50ZWdlcltdIHAyKQorICAgICAgdGhyb3dzIEVkMjU1MTlFeGNlcHRpb24geworICAgIHJldHVybiB0b0FmZmluZShzdWJ0cmFjdEV4dGVuZGVkUG9pbnRzKHRvRXh0ZW5kZWQocDEpLCB0b0V4dGVuZGVkKHAyKSkpOworICB9CisKKyAgLyoqCisgICAqIFZhbGlkYXRlcyB0aGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYWZmaW5lIHJlcHJlc2VudGF0aW9uIGlzIG9uIHRoZSBjdXJ2ZSBhbmQgaXMgcG9zaXRpdmUuCisgICAqIEB0aHJvd3MgRWQyNTUxOUV4Y2VwdGlvbiBpZiB0aGUgcG9pbnQgZG9lcyBub3QgdmFsaWRhdGUKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUFmZmluZVBvaW50KEJpZ0ludGVnZXJbXSBwKSB0aHJvd3MgRWQyNTUxOUV4Y2VwdGlvbiB7CisgICAgY2hlY2tQb2ludElzSW5BZmZpbmVSZXByZXNlbnRhdGlvbihwKTsKKworICAgIEJpZ0ludGVnZXIgeCA9IHBbWF07CisgICAgQmlnSW50ZWdlciB5ID0gcFtZXTsKKworICAgIGlmICh4LnNpZ251bSgpICE9IDEgfHwgeS5zaWdudW0oKSAhPSAxKSB7CisgICAgICB0aHJvdyBuZXcgRWQyNTUxOUV4Y2VwdGlvbigiUG9pbnQgZW5jb2RpbmcgbXVzdCB1c2Ugb25seSBwb3NpdGl2ZSBpbnRlZ2VycyIpOworICAgIH0KKworICAgIGlmICgoeC5jb21wYXJlVG8oRWQyNTUxOV9QKSA+PSAwKSB8fCAoeS5jb21wYXJlVG8oRWQyNTUxOV9QKSA+PSAwKSkgeworICAgICAgdGhyb3cgbmV3IEVkMjU1MTlFeGNlcHRpb24oIlBvaW50IGxpZXMgb3V0c2lkZSBvZiB0aGUgZXhwZWN0ZWQgZmllbGQiKTsKKyAgICB9CisKKyAgICBCaWdJbnRlZ2VyIHh4ID0geC5tdWx0aXBseSh4KTsKKyAgICBCaWdJbnRlZ2VyIHl5ID0geS5tdWx0aXBseSh5KTsKKyAgICBCaWdJbnRlZ2VyIGxocyA9IHh4Lm5lZ2F0ZSgpLmFkZCh5eSkubW9kKEVkMjU1MTlfUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLXgqeCArIHkqeQorICAgIEJpZ0ludGVnZXIgcmhzID0gT05FLmFkZChFZDI1NTE5X0QubXVsdGlwbHkoeHgpLm11bHRpcGx5KHl5KSkubW9kKEVkMjU1MTlfUCk7ICAvLyAxICsgZCp4KngqeSp5CisKKyAgICBpZiAoIWxocy5lcXVhbHMocmhzKSkgeworICAgICAgdGhyb3cgbmV3IEVkMjU1MTlFeGNlcHRpb24oIlBvaW50IGRvZXMgbm90IGxpZSBvbiB0aGUgZXhwZWN0ZWQgY3VydmUiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHBvaW50IHAgYnkgc2NhbGFyIGsKKyAgICovCisgIHN0YXRpYyBCaWdJbnRlZ2VyW10gc2NhbGFyTXVsdGlwbHlFeHRlbmRlZFBvaW50KEJpZ0ludGVnZXJbXSBwLCBCaWdJbnRlZ2VyIGspCisgICAgICB0aHJvd3MgRWQyNTUxOUV4Y2VwdGlvbiB7CisgICAgY2hlY2tQb2ludElzSW5FeHRlbmRlZFJlcHJlc2VudGF0aW9uKHApOworICAgIGlmIChrID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBFZDI1NTE5RXhjZXB0aW9uKCJDYW4ndCBtdWx0aXBseSBwb2ludCBieSBudWxsIik7CisgICAgfQorCisgICAgaWYgKGsuYml0TGVuZ3RoKCkgPiBQT0lOVF9TSVpFX0JJVFMpIHsKKyAgICAgIHRocm93IG5ldyBFZDI1NTE5RXhjZXB0aW9uKAorICAgICAgICAgICJSZWZ1c2UgdG8gbXVsdGlwbHkgcG9pbnQgYnkgc2NhbGFyIHdpdGggbW9yZSB0aGFuICIgKyBQT0lOVF9TSVpFX0JJVFMgKyAiIGJpdHMiKTsKKyAgICB9CisKKyAgICAvLyBQZXJmb3JtIGJlc3QgZWZmb3J0IHRpbWUtY29uc3RhbnQgYWNjdW11bGF0aW9uCisgICAgQmlnSW50ZWdlcltdIHEgPSBJREVOVElUWV9QT0lOVDsKKyAgICBCaWdJbnRlZ2VyW10gciA9IElERU5USVRZX1BPSU5UOworICAgIEJpZ0ludGVnZXJbXSBkb3VibGVBY2N1bXVsYXRvciA9IHA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT0lOVF9TSVpFX0JJVFM7IGkrKykgeworICAgICAgaWYgKGsudGVzdEJpdChpKSkgeworICAgICAgICBxID0gYWRkRXh0ZW5kZWRQb2ludHMocSwgZG91YmxlQWNjdW11bGF0b3IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgciA9IGFkZEV4dGVuZGVkUG9pbnRzKHEsIGRvdWJsZUFjY3VtdWxhdG9yKTsKKyAgICAgIH0KKyAgICAgIGlmIChpIDwgUE9JTlRfU0laRV9CSVRTIC0gMSkgeworICAgICAgICBkb3VibGVBY2N1bXVsYXRvciA9IGRvdWJsZUV4dGVuZGVkUG9pbnQoZG91YmxlQWNjdW11bGF0b3IpOworICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdCBuZWVkZWQsIGJ1dCB3ZSdyZSBqdXN0IHRyeWluZyB0byBmb29sIHRoZSBjb21waWxlciBpbnRvIG5vdCBvcHRpbWl6aW5nIGF3YXkgcgorICAgIHIgPSBzdWJ0cmFjdEV4dGVuZGVkUG9pbnRzKHIsIHIpOworICAgIHEgPSBhZGRFeHRlbmRlZFBvaW50cyhxLCByKTsKKyAgICByZXR1cm4gcTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBkb3VibGluZyBvZiBhIHBvaW50IGluIGV4dGVuZGVkIHJlcHJlc2VudGF0aW9uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyW10gZG91YmxlRXh0ZW5kZWRQb2ludChCaWdJbnRlZ2VyW10gcCkgdGhyb3dzIEVkMjU1MTlFeGNlcHRpb24geworICAgIC8vIFRoZSBFZHdhcmRzIGN1cnZlIGlzIGNvbXBsZXRlLCBzbyB3ZSBjYW4ganVzdCBhZGQgYSBwb2ludCB0byBpdHNlbGYuCisgICAgLy8gTm90ZSB0aGF0IHRoZSBjdXJyZW50bHkgYmVzdCBrbm93biBhbGdvcml0aG1zIGZvciBkb3VibGluZyBoYXZlIHRoZSBzYW1lIG9yZGVyIGFzIGFkZGl0aW9uLgorICAgIC8vIGh0dHBzOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sCisgICAgY2hlY2tQb2ludElzSW5FeHRlbmRlZFJlcHJlc2VudGF0aW9uKHApOworCisgICAgQmlnSW50ZWdlciBjID0gcFtUXS5wb3coMikubXVsdGlwbHkoRWQyNTUxOV9LKTsKKyAgICBCaWdJbnRlZ2VyIGQgPSBwW1pdLnBvdygyKS5zaGlmdExlZnQoMSk7CisgICAgQmlnSW50ZWdlciBlID0gcFtZXS5tdWx0aXBseShwW1hdKS5zaGlmdExlZnQoMik7CisgICAgQmlnSW50ZWdlciBmID0gZC5zdWJ0cmFjdChjKTsKKyAgICBCaWdJbnRlZ2VyIGcgPSBkLmFkZChjKTsKKyAgICBCaWdJbnRlZ2VyIGggPSBwW1ldLnBvdygyKS5hZGQocFtYXS5wb3coMikpLnNoaWZ0TGVmdCgxKTsKKworICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcltdIHsKKyAgICAgICAgZS5tdWx0aXBseShmKS5tb2QoRWQyNTUxOV9QKSwKKyAgICAgICAgZy5tdWx0aXBseShoKS5tb2QoRWQyNTUxOV9QKSwKKyAgICAgICAgZi5tdWx0aXBseShnKS5tb2QoRWQyNTUxOV9QKSwKKyAgICAgICAgZS5tdWx0aXBseShoKS5tb2QoRWQyNTUxOV9QKQorICAgIH07CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHAyIGZyb20gcDEgKHAxIC0gcDIpCisgICAqLworICBzdGF0aWMgQmlnSW50ZWdlcltdIHN1YnRyYWN0RXh0ZW5kZWRQb2ludHMoQmlnSW50ZWdlcltdIHAxLCBCaWdJbnRlZ2VyW10gcDIpCisgICAgICB0aHJvd3MgRWQyNTUxOUV4Y2VwdGlvbiB7CisgICAgY2hlY2tQb2ludElzSW5FeHRlbmRlZFJlcHJlc2VudGF0aW9uKHAxKTsKKyAgICBjaGVja1BvaW50SXNJbkV4dGVuZGVkUmVwcmVzZW50YXRpb24ocDIpOworCisgICAgcmV0dXJuIGFkZEV4dGVuZGVkUG9pbnRzKHAxLCBuZXcgQmlnSW50ZWdlcltdIHtwMltYXS5uZWdhdGUoKSwgcDJbWV0sIHAyW1pdLCBwMltUXS5uZWdhdGUoKX0pOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0d28gcG9pbnRzIGluIGV4dGVuZGVkIHJlcHJlc2VudGF0aW9uCisgICAqIFVzZXM6IGh0dHBzOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sI2FkZGl0aW9uLWFkZC0yMDA4LWh3Y2QtMworICAgKi8KKyAgc3RhdGljIEJpZ0ludGVnZXJbXSBhZGRFeHRlbmRlZFBvaW50cyhCaWdJbnRlZ2VyW10gcDEsIEJpZ0ludGVnZXJbXSBwMikKKyAgICAgIHRocm93cyBFZDI1NTE5RXhjZXB0aW9uIHsKKyAgICBjaGVja1BvaW50SXNJbkV4dGVuZGVkUmVwcmVzZW50YXRpb24ocDEpOworICAgIGNoZWNrUG9pbnRJc0luRXh0ZW5kZWRSZXByZXNlbnRhdGlvbihwMik7CisKKyAgICBCaWdJbnRlZ2VyIGEgPSBwMVtZXS5zdWJ0cmFjdChwMVtYXSkubXVsdGlwbHkocDJbWV0uc3VidHJhY3QocDJbWF0pKTsKKyAgICBCaWdJbnRlZ2VyIGIgPSBwMVtZXS5hZGQocDFbWF0pLm11bHRpcGx5KHAyW1ldLmFkZChwMltYXSkpOworICAgIEJpZ0ludGVnZXIgYyA9IHAxW1RdLm11bHRpcGx5KEVkMjU1MTlfSykubXVsdGlwbHkocDJbVF0pOworICAgIEJpZ0ludGVnZXIgZCA9IHAxW1pdLmFkZChwMVtaXSkubXVsdGlwbHkocDJbWl0pOworICAgIEJpZ0ludGVnZXIgZSA9IGIuc3VidHJhY3QoYSk7CisgICAgQmlnSW50ZWdlciBmID0gZC5zdWJ0cmFjdChjKTsKKyAgICBCaWdJbnRlZ2VyIGcgPSBkLmFkZChjKTsKKyAgICBCaWdJbnRlZ2VyIGggPSBiLmFkZChhKTsKKworICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcltdIHsKKyAgICAgICAgZS5tdWx0aXBseShmKS5tb2QoRWQyNTUxOV9QKSwKKyAgICAgICAgZy5tdWx0aXBseShoKS5tb2QoRWQyNTUxOV9QKSwKKyAgICAgICAgZi5tdWx0aXBseShnKS5tb2QoRWQyNTUxOV9QKSwKKyAgICAgICAgZS5tdWx0aXBseShoKS5tb2QoRWQyNTUxOV9QKQorICAgIH07CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgYSBwb2ludCBpbiBhZmZpbmUgcmVwcmVzZW50YXRpb24gdG8gZXh0ZW5kZWQgcmVwcmVzZW50YXRpb24KKyAgICovCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgQmlnSW50ZWdlcltdIHRvRXh0ZW5kZWQoQmlnSW50ZWdlcltdIHApIHRocm93cyBFZDI1NTE5RXhjZXB0aW9uIHsKKyAgICBjaGVja1BvaW50SXNJbkFmZmluZVJlcHJlc2VudGF0aW9uKHApOworCisgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyW10ge3BbWF0sIHBbWV0sIE9ORSwgcFtYXS5tdWx0aXBseShwW1ldKS5tb2QoRWQyNTUxOV9QKX07IC8vIHgsIHksIDEsIHgqeQorICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIGEgcG9pbnQgaW4gZXh0ZW5kZWQgcmVwcmVzZW50YXRpb24gdG8gYWZmaW5lIHJlcHJlc2VudGF0aW9uCisgICAqLworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIEJpZ0ludGVnZXJbXSB0b0FmZmluZShCaWdJbnRlZ2VyW10gcCkgdGhyb3dzIEVkMjU1MTlFeGNlcHRpb24geworICAgIGNoZWNrUG9pbnRJc0luRXh0ZW5kZWRSZXByZXNlbnRhdGlvbihwKTsKKworICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcltdIHtwW1hdLm11bHRpcGx5KHBbWl0ubW9kSW52ZXJzZShFZDI1NTE5X1ApKS5tb2QoRWQyNTUxOV9QKSwgLy8geCA9IFggLyBaCisgICAgICAgIHBbWV0ubXVsdGlwbHkocFtaXS5tb2RJbnZlcnNlKEVkMjU1MTlfUCkpLm1vZChFZDI1NTE5X1ApfTsgICAgICAgICAgICAgICAgICAgICAvLyB5ID0gWSAvIFoKKyAgfQorCisgIC8qKgorICAgKiBDaGVja3MgdGhhdCBhIGdpdmVuIHBvaW50IGlzIGluIHRoZSBleHRlbmRlZCByZXByZXNlbnRhdGlvbgorICAgKiBAdGhyb3dzIEVkMjU1MTlFeGNlcHRpb24gaWYgdGhlIHBvaW50IGlzIG5vdCBpbiB0aGUgZXh0ZW5kZWQgcmVwcmVzZW50YXRpb24KKyAgICovCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgdm9pZCBjaGVja1BvaW50SXNJbkV4dGVuZGVkUmVwcmVzZW50YXRpb24oQmlnSW50ZWdlcltdIHApIHRocm93cyBFZDI1NTE5RXhjZXB0aW9uIHsKKyAgICBpZiAocCA9PSBudWxsIHx8IHAubGVuZ3RoICE9IDQgfHwgcFtYXSA9PSBudWxsIHx8IHBbWV0gPT0gbnVsbCB8fCBwW1pdID09IG51bGwKKyAgICAgICAgfHwgcFtUXSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgRWQyNTUxOUV4Y2VwdGlvbigiUG9pbnQgaXMgbm90IGluIGV4dGVuZGVkIHJlcHJlc2VudGF0aW9uIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENoZWNrcyB0aGF0IGEgZ2l2ZW4gcG9pbnQgaXMgaW4gdGhlIGFmZmluZSByZXByZXNlbnRhdGlvbgorICAgKiBAdGhyb3dzIEVkMjU1MTlFeGNlcHRpb24gaWYgdGhlIHBvaW50IGlzIG5vdCBpbiB0aGUgYWZmaW5lIHJlcHJlc2VudGF0aW9uCisgICAqLworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIHZvaWQgY2hlY2tQb2ludElzSW5BZmZpbmVSZXByZXNlbnRhdGlvbihCaWdJbnRlZ2VyW10gcCkgdGhyb3dzIEVkMjU1MTlFeGNlcHRpb24geworICAgIGlmIChwID09IG51bGwgfHwgcC5sZW5ndGggIT0gMiB8fCBwW1hdID09IG51bGwgfHwgcFtZXSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgRWQyNTUxOUV4Y2VwdGlvbigiUG9pbnQgaXMgbm90IGluIGFmZmluZSByZXByZXNlbnRhdGlvbiIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXByZXNlbnRzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IgdGhhdCBoYXMgb2NjdXJyZWQgd2hpbGUgcGVyZm9ybWluZyBhIGN1cnZlIG9wZXJhdGlvbi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWQyNTUxOUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIEVkMjU1MTlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBFZDI1NTE5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7CisgICAgICBzdXBlcihlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRWQyNTUxOUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UsIGUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9FbnJvbGxtZW50Q3J5cHRvT3BzLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0Vucm9sbG1lbnRDcnlwdG9PcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjhjYjUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9FbnJvbGxtZW50Q3J5cHRvT3BzLmphdmEKQEAgLTAsMCArMSwyMzMgQEAKKy8qIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuYW5ub3RhdGlvbnMuU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyUGVuZGluZ1JldmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlNlY3VyZUdjbVByb3RvLkdjbURldmljZUluZm87CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5TZWN1cmVHY21Qcm90by5HY21NZXRhZGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlRyYW5zcG9ydENyeXB0b09wcy5QYXlsb2FkVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5DcnlwdG9PcHMuRW5jVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5DcnlwdG9PcHMuU2lnVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5QdWJsaWNLZXlQcm90b1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uSGVhZGVyQW5kQm9keTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uU2VjdXJlTWVzc2FnZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguY3J5cHRvLktleUFncmVlbWVudDsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGltcGxlbWVudGluZyBTZWN1cmUgR0NNIGVucm9sbG1lbnQgZmxvd3MuCisgKi8KK3B1YmxpYyBjbGFzcyBFbnJvbGxtZW50Q3J5cHRvT3BzIHsKKworICBwcml2YXRlIEVucm9sbG1lbnRDcnlwdG9PcHMoKSB7IH0gIC8vIERvIG5vdCBpbnN0YW50aWF0ZQorCisgIC8qKgorICAgKiBUeXBlIG9mIHN5bW1ldHJpYyBrZXkgc2lnbmF0dXJlIHRvIHVzZSBmb3IgdGhlIHNpZ25jcnlwdGVkICJvdXRlciBsYXllciIgbWVzc2FnZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpZ1R5cGUgT1VURVJfU0lHX1RZUEUgPSBTaWdUeXBlLkhNQUNfU0hBMjU2OworCisgIC8qKgorICAgKiBUeXBlIG9mIHN5bW1ldHJpYyBrZXkgZW5jcnlwdGlvbiB0byB1c2UgZm9yIHRoZSBzaWduY3J5cHRlZCAib3V0ZXIgbGF5ZXIiIG1lc3NhZ2UuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbmNUeXBlIE9VVEVSX0VOQ19UWVBFID0gRW5jVHlwZS5BRVNfMjU2X0NCQzsKKworICAvKioKKyAgICogVHlwZSBvZiBwdWJsaWMga2V5IHNpZ25hdHVyZSB0byB1c2UgZm9yIHRoZSAoY2xlYXJ0ZXh0KSAiaW5uZXIgbGF5ZXIiIG1lc3NhZ2UuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaWdUeXBlIElOTkVSX1NJR19UWVBFID0gU2lnVHlwZS5FQ0RTQV9QMjU2X1NIQTI1NjsKKworICAvKioKKyAgICogVHlwZSBvZiBwdWJsaWMga2V5IHNpZ25hdHVyZSB0byB1c2UgZm9yIHRoZSAoY2xlYXJ0ZXh0KSAiaW5uZXIgbGF5ZXIiIG1lc3NhZ2Ugb24gcGxhdGZvcm1zIHRoYXQKKyAgICogZG9uJ3Qgc3VwcG9ydCBFbGxpcHRpYyBDdXJ2ZSBvcGVyYXRpb25zIChzdWNoIGFzIG9sZCBBbmRyb2lkIHZlcnNpb25zKS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpZ1R5cGUgTEVHQUNZX0lOTkVSX1NJR19UWVBFID0gU2lnVHlwZS5SU0EyMDQ4X1NIQTI1NjsKKworICAvKioKKyAgICogV2hpY2gge0BsaW5rIEtleUFncmVlbWVudH0gYWxnb3JpdGhtIHRvIHVzZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLQV9BTEcgPSAiRUNESCI7CisKKyAgLyoqCisgICAqIFdoaWNoIHtAbGluayBLZXlBZ3JlZW1lbnR9IGFsZ29yaXRobSB0byB1c2Ugb24gcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBFbGxpcHRpYyBDdXJ2ZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfS0FfQUxHID0gIkRIIjsKKworICAvKioKKyAgICogVXNlZCBieSBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciB0byBwZXJmb3JtIGEga2V5IGV4Y2hhbmdlLgorICAgKgorICAgKiBAcmV0dXJuIGEge0BsaW5rIFNlY3JldEtleX0gZGVyaXZlZCBmcm9tIHRoZSBrZXkgZXhjaGFuZ2UKKyAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIGlmIGVpdGhlciBvZiB0aGUgaW5wdXQga2V5cyBpcyBvZiB0aGUgd3JvbmcgdHlwZQorICAgKi8KKyAgQFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclBlbmRpbmdSZXZpZXcgLy8gYi8zMjE0Mzg1NQorICBwdWJsaWMgc3RhdGljIFNlY3JldEtleSBkb0tleUFncmVlbWVudChQcml2YXRlS2V5IG15S2V5LCBQdWJsaWNLZXkgcGVlcktleSkKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgYWxnID0gS0FfQUxHOworICAgIGlmIChLZXlFbmNvZGluZy5pc0xlZ2FjeVByaXZhdGVLZXkobXlLZXkpKSB7CisgICAgICBhbGcgPSBMRUdBQ1lfS0FfQUxHOworICAgIH0KKyAgICBLZXlBZ3JlZW1lbnQgYWdyZWVtZW50OworICAgIHRyeSB7CisgICAgICBhZ3JlZW1lbnQgPSBLZXlBZ3JlZW1lbnQuZ2V0SW5zdGFuY2UoYWxnKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgYWdyZWVtZW50LmluaXQobXlLZXkpOworICAgIGFncmVlbWVudC5kb1BoYXNlKHBlZXJLZXksIHRydWUpOworICAgIGJ5dGVbXSBhZ3JlZWRLZXkgPSBhZ3JlZW1lbnQuZ2VuZXJhdGVTZWNyZXQoKTsKKworICAgIC8vIERlcml2ZSBhIDI1Ni1iaXQgQUVTIGtleSBieSB1c2luZyBzaGEyNTYgb24gdGhlIERpZmZpZS1IZWxsbWFuIG91dHB1dAorICAgIHJldHVybiBLZXlFbmNvZGluZy5wYXJzZU1hc3RlcktleShzaGEyNTYoYWdyZWVkS2V5KSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEtleVBhaXIgZ2VuZXJhdGVFbnJvbGxtZW50S2V5QWdyZWVtZW50S2V5UGFpcihib29sZWFuIGlzTGVnYWN5KSB7CisgICAgaWYgKGlzTGVnYWN5KSB7CisgICAgICByZXR1cm4gUHVibGljS2V5UHJvdG9VdGlsLmdlbmVyYXRlRGgyMDQ4S2V5UGFpcigpOworICAgIH0KKyAgICByZXR1cm4gUHVibGljS2V5UHJvdG9VdGlsLmdlbmVyYXRlRWNQMjU2S2V5UGFpcigpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gU0hBLTI1NiBoYXNoIG9mIHtAY29kZSBtYXN0ZXJLZXl9CisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRNYXN0ZXJLZXlIYXNoKFNlY3JldEtleSBtYXN0ZXJLZXkpIHsKKyAgICByZXR1cm4gc2hhMjU2KG1hc3RlcktleS5nZXRFbmNvZGVkKCkpOworICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkgdGhlIGNsaWVudCB0byBzaWduY3J5cHQgYW4gZW5yb2xsbWVudCByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nIGl0IHRvIHRoZSBzZXJ2ZXIuCisgICAqCisgICAqICA8cD5Ob3RlOiBZb3UgPGVtPk1VU1Q8L2VtPiBjb3JyZWN0bHkgc2V0IHRoZSB2YWx1ZSBvZiB0aGUge0Bjb2RlIGRldmljZV9tYXN0ZXJfa2V5X2hhc2h9IG9uCisgICAqICB7QGNvZGUgZW5yb2xsbWVudEluZm99IGZyb20ge0BsaW5rICNnZXRNYXN0ZXJLZXlIYXNoKFNlY3JldEtleSl9IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgKgorICAgKiBAcGFyYW0gZW5yb2xsbWVudEluZm8gdGhlIGVucm9sbG1lbnQgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuIFlvdSBtdXN0IGNvcnJlY3RseSBzZXQKKyAgICogICB0aGUge0Bjb2RlIGRldmljZV9tYXN0ZXJfa2V5X2hhc2h9IGZpZWxkLgorICAgKiBAcGFyYW0gbWFzdGVyS2V5IHRoZSBzaGFyZWQga2V5IGRlcml2ZWQgZnJvbSB0aGUga2V5IGFncmVlbWVudAorICAgKiBAcGFyYW0gc2lnbmluZ0tleSB0aGUgc2lnbmluZyBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlcidzIHtAbGluayBQdWJsaWNLZXl9IGJlaW5nIGVucm9sbGVkCisgICAqIEByZXR1cm4gdGhlIGVuY3J5cHRlZCBlbnJvbGxtZW50IG1lc3NhZ2UKKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGVucm9sbG1lbnRJbmZvfSBkb2Vzbid0IGhhdmUgYSB2YWxpZAorICAgKiAgIHtAY29kZSBkZXZpY2VfbWFzdGVyX2tleV9oYXNofQorICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gaWYge0Bjb2RlIG1hc3RlcktleX0gb3Ige0Bjb2RlIHNpZ25pbmdLZXl9IGlzIHRoZSB3cm9uZyB0eXBlCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNyeXB0RW5yb2xsbWVudE1lc3NhZ2UoCisgICAgICBHY21EZXZpY2VJbmZvIGVucm9sbG1lbnRJbmZvLCBTZWNyZXRLZXkgbWFzdGVyS2V5LCBQcml2YXRlS2V5IHNpZ25pbmdLZXkpCisgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgaWYgKChlbnJvbGxtZW50SW5mbyA9PSBudWxsKSB8fCAobWFzdGVyS2V5ID09IG51bGwpIHx8IChzaWduaW5nS2V5ID09IG51bGwpKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBpZiAoIUFycmF5cy5lcXVhbHMoZW5yb2xsbWVudEluZm8uZ2V0RGV2aWNlTWFzdGVyS2V5SGFzaCgpLnRvQnl0ZUFycmF5KCksCisgICAgICAgIGdldE1hc3RlcktleUhhc2gobWFzdGVyS2V5KSkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRldmljZU1hc3RlcktleUhhc2ggbm90IHNldCBjb3JyZWN0bHkiKTsKKyAgICB9CisKKyAgICAvLyBGaXJzdCBjcmVhdGUgdGhlIGlubmVyIG1lc3NhZ2UsIHdoaWNoIGlzIGJhc2ljYWxseSBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlCisgICAgU2lnVHlwZSBzaWdUeXBlID0KKyAgICAgICAgS2V5RW5jb2RpbmcuaXNMZWdhY3lQcml2YXRlS2V5KHNpZ25pbmdLZXkpID8gTEVHQUNZX0lOTkVSX1NJR19UWVBFIDogSU5ORVJfU0lHX1RZUEU7CisgICAgU2VjdXJlTWVzc2FnZSBpbm5lck1zZyA9IG5ldyBTZWN1cmVNZXNzYWdlQnVpbGRlcigpCisgICAgICAgIC5zZXRWZXJpZmljYXRpb25LZXlJZChlbnJvbGxtZW50SW5mby5nZXRVc2VyUHVibGljS2V5KCkudG9CeXRlQXJyYXkoKSkKKyAgICAgICAgLmJ1aWxkU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZShzaWduaW5nS2V5LCBzaWdUeXBlLCBlbnJvbGxtZW50SW5mby50b0J5dGVBcnJheSgpKTsKKworICAgIC8vIE5leHQgY3JlYXRlIHRoZSBvdXRlciBtZXNzYWdlLCB3aGljaCB1c2VzIHRoZSBuZXdseSBleGNoYW5nZWQgbWFzdGVyIGtleSB0byBzaWduY3J5cHQKKyAgICBTZWN1cmVNZXNzYWdlIG91dGVyTXNnID0gbmV3IFNlY3VyZU1lc3NhZ2VCdWlsZGVyKCkKKyAgICAgICAgLnNldFZlcmlmaWNhdGlvbktleUlkKG5ldyBieXRlW10ge30pICAvLyBFbXB0eQorICAgICAgICAuc2V0UHVibGljTWV0YWRhdGEoR2NtTWV0YWRhdGEubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0VHlwZShQYXlsb2FkVHlwZS5FTlJPTExNRU5ULmdldFR5cGUoKSkKKyAgICAgICAgICAgIC5zZXRWZXJzaW9uKFNlY3VyZUdjbUNvbnN0YW50cy5TRUNVUkVfR0NNX1ZFUlNJT04pCisgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgLnRvQnl0ZUFycmF5KCkpCisgICAgICAgIC5idWlsZFNpZ25DcnlwdGVkTWVzc2FnZSgKKyAgICAgICAgICAgIG1hc3RlcktleSwgT1VURVJfU0lHX1RZUEUsIG1hc3RlcktleSwgT1VURVJfRU5DX1RZUEUsIGlubmVyTXNnLnRvQnl0ZUFycmF5KCkpOworICAgIHJldHVybiBvdXRlck1zZy50b0J5dGVBcnJheSgpOworICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkgdGhlIHNlcnZlciB0byBkZWNyeXB0IHRoZSBjbGllbnQncyBlbnJvbGxtZW50IHJlcXVlc3QuCisgICAqIEBwYXJhbSBlbnJvbGxtZW50TWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlIGNsaWVudCdzIGNhbGwgdG8KKyAgICogICAgICAgIHtAbGluayAjZW5jcnlwdEVucm9sbG1lbnRNZXNzYWdlKEdjbURldmljZUluZm8sIFNlY3JldEtleSwgUHJpdmF0ZUtleSl9CisgICAqIEBwYXJhbSBtYXN0ZXJLZXkgdGhlIHNoYXJlZCBrZXkgZGVyaXZlZCBmcm9tIHRoZSBrZXkgYWdyZWVtZW50CisgICAqIEByZXR1cm4gdGhlIGNsaWVudCdzIGVucm9sbG1lbnQgcmVxdWVzdCBkYXRhCisgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uIGlmIHtAY29kZSBlbnJvbGxtZW50TWVzc2FnZX0gaXMgbWFsZm9ybWVkIG9yIGhhcyBiZWVuIHRhbXBlcmVkIHdpdGgKKyAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIGlmIHtAY29kZSBtYXN0ZXJLZXl9IGlzIHRoZSB3cm9uZyB0eXBlCisgICAqLworICBwdWJsaWMgc3RhdGljIEdjbURldmljZUluZm8gZGVjcnlwdEVucm9sbG1lbnRNZXNzYWdlKAorICAgICAgYnl0ZVtdIGVucm9sbG1lbnRNZXNzYWdlLCBTZWNyZXRLZXkgbWFzdGVyS2V5LCBib29sZWFuIGlzTGVnYWN5KQorICAgICAgdGhyb3dzIFNpZ25hdHVyZUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICBpZiAoKGVucm9sbG1lbnRNZXNzYWdlID09IG51bGwpIHx8IChtYXN0ZXJLZXkgPT0gbnVsbCkpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEhlYWRlckFuZEJvZHkgb3V0ZXJIZWFkZXJBbmRCb2R5OworICAgIEdjbU1ldGFkYXRhIG91dGVyTWV0YWRhdGE7CisgICAgSGVhZGVyQW5kQm9keSBpbm5lckhlYWRlckFuZEJvZHk7CisgICAgYnl0ZVtdIGVuY29kZWRVc2VyUHVibGljS2V5OworICAgIEdjbURldmljZUluZm8gZW5yb2xsbWVudEluZm87CisgICAgdHJ5IHsKKyAgICAgIFNlY3VyZU1lc3NhZ2Ugb3V0ZXJNc2cgPSBTZWN1cmVNZXNzYWdlLnBhcnNlRnJvbShlbnJvbGxtZW50TWVzc2FnZSk7CisgICAgICBvdXRlckhlYWRlckFuZEJvZHkgPSBTZWN1cmVNZXNzYWdlUGFyc2VyLnBhcnNlU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgICAgICAgIG91dGVyTXNnLCBtYXN0ZXJLZXksIE9VVEVSX1NJR19UWVBFLCBtYXN0ZXJLZXksIE9VVEVSX0VOQ19UWVBFKTsKKyAgICAgIG91dGVyTWV0YWRhdGEgPSBHY21NZXRhZGF0YS5wYXJzZUZyb20ob3V0ZXJIZWFkZXJBbmRCb2R5LmdldEhlYWRlcigpLmdldFB1YmxpY01ldGFkYXRhKCkpOworCisgICAgICBTZWN1cmVNZXNzYWdlIGlubmVyTXNnID0gU2VjdXJlTWVzc2FnZS5wYXJzZUZyb20ob3V0ZXJIZWFkZXJBbmRCb2R5LmdldEJvZHkoKSk7CisgICAgICBlbmNvZGVkVXNlclB1YmxpY0tleSA9IFNlY3VyZU1lc3NhZ2VQYXJzZXIuZ2V0VW52ZXJpZmllZEhlYWRlcihpbm5lck1zZykKKyAgICAgICAgICAuZ2V0VmVyaWZpY2F0aW9uS2V5SWQoKS50b0J5dGVBcnJheSgpOworICAgICAgUHVibGljS2V5IHVzZXJQdWJsaWNLZXkgPSBLZXlFbmNvZGluZy5wYXJzZVVzZXJQdWJsaWNLZXkoZW5jb2RlZFVzZXJQdWJsaWNLZXkpOworICAgICAgU2lnVHlwZSBzaWdUeXBlID0gaXNMZWdhY3kgPyBMRUdBQ1lfSU5ORVJfU0lHX1RZUEUgOiBJTk5FUl9TSUdfVFlQRTsKKyAgICAgIGlubmVySGVhZGVyQW5kQm9keSA9IFNlY3VyZU1lc3NhZ2VQYXJzZXIucGFyc2VTaWduZWRDbGVhcnRleHRNZXNzYWdlKAorICAgICAgICAgIGlubmVyTXNnLCB1c2VyUHVibGljS2V5LCBzaWdUeXBlKTsKKyAgICAgIGVucm9sbG1lbnRJbmZvID0gR2NtRGV2aWNlSW5mby5wYXJzZUZyb20oaW5uZXJIZWFkZXJBbmRCb2R5LmdldEJvZHkoKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoSW52YWxpZEtleVNwZWNFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBib29sZWFuIHZlcmlmaWVkID0KKyAgICAgICAgICAgKG91dGVyTWV0YWRhdGEuZ2V0VHlwZSgpID09IFBheWxvYWRUeXBlLkVOUk9MTE1FTlQuZ2V0VHlwZSgpKQorICAgICAgICAmJiAob3V0ZXJNZXRhZGF0YS5nZXRWZXJzaW9uKCkgPD0gU2VjdXJlR2NtQ29uc3RhbnRzLlNFQ1VSRV9HQ01fVkVSU0lPTikKKyAgICAgICAgJiYgb3V0ZXJIZWFkZXJBbmRCb2R5LmdldEhlYWRlcigpLmdldFZlcmlmaWNhdGlvbktleUlkKCkuaXNFbXB0eSgpCisgICAgICAgICYmIGlubmVySGVhZGVyQW5kQm9keS5nZXRIZWFkZXIoKS5nZXRQdWJsaWNNZXRhZGF0YSgpLmlzRW1wdHkoKQorICAgICAgICAvLyBWZXJpZnkgdGhlIGVuY29kZWQgcHVibGljIGtleSB3ZSB1c2VkIG1hdGNoZXMgdGhlIGVuY29kZWQgcHVibGljIGtleSBrZXkgYmVpbmcgZW5yb2xsZWQKKyAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhlbmNvZGVkVXNlclB1YmxpY0tleSwgZW5yb2xsbWVudEluZm8uZ2V0VXNlclB1YmxpY0tleSgpLnRvQnl0ZUFycmF5KCkpCisgICAgICAgICYmIEFycmF5cy5lcXVhbHMoZ2V0TWFzdGVyS2V5SGFzaChtYXN0ZXJLZXkpLAorICAgICAgICAgICAgZW5yb2xsbWVudEluZm8uZ2V0RGV2aWNlTWFzdGVyS2V5SGFzaCgpLnRvQnl0ZUFycmF5KCkpOworCisgICAgaWYgKHZlcmlmaWVkKSB7CisgICAgICByZXR1cm4gZW5yb2xsbWVudEluZm87CisgICAgfQorICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oKTsKKyAgfQorCisgIHN0YXRpYyBieXRlW10gc2hhMjU2KGJ5dGVbXSBpbnB1dCkgeworICAgIHRyeSB7CisgICAgICBNZXNzYWdlRGlnZXN0IHNoYTI1NiA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0yNTYiKTsKKyAgICAgIHJldHVybiBzaGEyNTYuZGlnZXN0KGlucHV0KTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7ICAvLyBTaG91bGRuJ3QgaGFwcGVuCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL0hhbmRzaGFrZUV4Y2VwdGlvbi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9IYW5kc2hha2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjVmZmZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9IYW5kc2hha2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKKy8qKgorICogUmVwcmVzZW50cyBhbiB1bnJlY292ZXJhYmxlIGVycm9yIHRoYXQgaGFzIG9jY3VycmVkIGR1cmluZyB0aGUgaGFuZHNoYWtlIHByb2NlZHVyZS4KKyAqLworcHVibGljIGNsYXNzIEhhbmRzaGFrZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgIHB1YmxpYyBIYW5kc2hha2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyBIYW5kc2hha2VFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKyAgICBzdXBlcihlKTsKKyAgfQorCisgIHB1YmxpYyBIYW5kc2hha2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7CisgICAgc3VwZXIobWVzc2FnZSwgZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vS2V5RW5jb2RpbmcuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vS2V5RW5jb2RpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjkwYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9LZXlFbmNvZGluZy5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5QdWJsaWNLZXlQcm90b1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVByb3RvLkdlbmVyaWNQdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1B1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlBLQ1M4RW5jb2RlZEtleVNwZWM7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uaW50ZXJmYWNlcy5ESFByaXZhdGVLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYzsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBlbmNvZGluZyBhbmQgcGFyc2luZyBrZXlzIHVzZWQgYnkgU2VjdXJlR2NtLgorICovCitwdWJsaWMgY2xhc3MgS2V5RW5jb2RpbmcgeworICBwcml2YXRlIEtleUVuY29kaW5nKCkge30gLy8gRG8gbm90IGluc3RhbnRpYXRlCisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaW11bGF0ZUxlZ2FjeUNyeXB0b1JlcXVpcmVkID0gZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSBKQ0EgYWxnb3JpdGhtIG5hbWUgdG8gdXNlIHdoZW4gZW5jb2RpbmcvZGVjb2Rpbmcgc3ltbWV0cmljIGtleXMuCisgICAqLworICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTU1FVFJJQ19LRVlfRU5DT0RJTkdfQUxHID0gIkFFUyI7CisKKyAgcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlTWFzdGVyS2V5KFNlY3JldEtleSBtYXN0ZXJLZXkpIHsKKyAgICByZXR1cm4gbWFzdGVyS2V5LmdldEVuY29kZWQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU2VjcmV0S2V5IHBhcnNlTWFzdGVyS2V5KGJ5dGVbXSBlbmNvZGVkTWFzdGVyS2V5KSB7CisgICAgcmV0dXJuIG5ldyBTZWNyZXRLZXlTcGVjKGVuY29kZWRNYXN0ZXJLZXksIFNZTU1FVFJJQ19LRVlfRU5DT0RJTkdfQUxHKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZVVzZXJQdWJsaWNLZXkoUHVibGljS2V5IHBrKSB7CisgICAgcmV0dXJuIGVuY29kZVB1YmxpY0tleShwayk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVVc2VyUHJpdmF0ZUtleShQcml2YXRlS2V5IHNrKSB7CisgICAgcmV0dXJuIHNrLmdldEVuY29kZWQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUHJpdmF0ZUtleSBwYXJzZVVzZXJQcml2YXRlS2V5KGJ5dGVbXSBlbmNvZGVkUHJpdmF0ZUtleSwgYm9vbGVhbiBpc0xlZ2FjeSkKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgUEtDUzhFbmNvZGVkS2V5U3BlYyBrZXlTcGVjID0gbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoZW5jb2RlZFByaXZhdGVLZXkpOworICAgIGlmIChpc0xlZ2FjeSkgeworICAgICAgcmV0dXJuIGdldFJzYUtleUZhY3RvcnkoKS5nZW5lcmF0ZVByaXZhdGUoa2V5U3BlYyk7CisgICAgfQorICAgIHJldHVybiBnZXRFY0tleUZhY3RvcnkoKS5nZW5lcmF0ZVByaXZhdGUoa2V5U3BlYyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFB1YmxpY0tleSBwYXJzZVVzZXJQdWJsaWNLZXkoYnl0ZVtdIGtleUJ5dGVzKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZVB1YmxpY0tleShrZXlCeXRlcyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVLZXlBZ3JlZW1lbnRQdWJsaWNLZXkoUHVibGljS2V5IHBrKSB7CisgICAgcmV0dXJuIGVuY29kZVB1YmxpY0tleShwayk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFB1YmxpY0tleSBwYXJzZUtleUFncmVlbWVudFB1YmxpY0tleShieXRlW10ga2V5Qnl0ZXMpCisgICAgICB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZVB1YmxpY0tleShrZXlCeXRlcyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVLZXlBZ3JlZW1lbnRQcml2YXRlS2V5KFByaXZhdGVLZXkgc2spIHsKKyAgICBpZiAoaXNMZWdhY3lQcml2YXRlS2V5KHNrKSkgeworICAgICAgcmV0dXJuIFB1YmxpY0tleVByb3RvVXRpbC5lbmNvZGVEaDIwNDhQcml2YXRlS2V5KChESFByaXZhdGVLZXkpIHNrKTsKKyAgICB9CisgICAgcmV0dXJuIHNrLmdldEVuY29kZWQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUHJpdmF0ZUtleSBwYXJzZUtleUFncmVlbWVudFByaXZhdGVLZXkoYnl0ZVtdIGtleUJ5dGVzLCBib29sZWFuIGlzTGVnYWN5KQorICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICBpZiAoaXNMZWdhY3kpIHsKKyAgICAgIHJldHVybiBQdWJsaWNLZXlQcm90b1V0aWwucGFyc2VEaDIwNDhQcml2YXRlS2V5KGtleUJ5dGVzKTsKKyAgICB9CisgICAgUEtDUzhFbmNvZGVkS2V5U3BlYyBrZXlTcGVjID0gbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoa2V5Qnl0ZXMpOworICAgIHJldHVybiBnZXRFY0tleUZhY3RvcnkoKS5nZW5lcmF0ZVByaXZhdGUoa2V5U3BlYyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVTaWduaW5nUHVibGljS2V5KFB1YmxpY0tleSBwaykgeworICAgIHJldHVybiBlbmNvZGVQdWJsaWNLZXkocGspOworICB9CisKKyAgcHVibGljIHN0YXRpYyBQdWJsaWNLZXkgcGFyc2VTaWduaW5nUHVibGljS2V5KGJ5dGVbXSBrZXlCeXRlcykgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2VQdWJsaWNLZXkoa2V5Qnl0ZXMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlU2lnbmluZ1ByaXZhdGVLZXkoUHJpdmF0ZUtleSBzaykgeworICAgIHJldHVybiBzay5nZXRFbmNvZGVkKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFByaXZhdGVLZXkgcGFyc2VTaWduaW5nUHJpdmF0ZUtleShieXRlW10ga2V5Qnl0ZXMpIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgUEtDUzhFbmNvZGVkS2V5U3BlYyBrZXlTcGVjID0gbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoa2V5Qnl0ZXMpOworICAgIHJldHVybiBnZXRFY0tleUZhY3RvcnkoKS5nZW5lcmF0ZVByaXZhdGUoa2V5U3BlYyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lQdWJsaWNLZXkoUHVibGljS2V5IHBrKSB7CisgICAgaWYgKHBrIGluc3RhbmNlb2YgRUNQdWJsaWNLZXkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lQcml2YXRlS2V5KFByaXZhdGVLZXkgc2spIHsKKyAgICBpZiAoc2sgaW5zdGFuY2VvZiBFQ1ByaXZhdGVLZXkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lDcnlwdG9SZXF1aXJlZCgpIHsKKyAgICByZXR1cm4gUHVibGljS2V5UHJvdG9VdGlsLmlzTGVnYWN5Q3J5cHRvUmVxdWlyZWQoKSB8fCBzaW11bGF0ZUxlZ2FjeUNyeXB0b1JlcXVpcmVkOworICB9CisKKyAgLyoqCisgICAqIFdoZW4gdGVzdGluZywgdXNlIHRoaXMgdG8gZm9yY2Uge0BsaW5rICNpc0xlZ2FjeUNyeXB0b1JlcXVpcmVkKCl9IHRvIHJldHVybiB7QGNvZGUgdHJ1ZX0KKyAgICovCisgIC8vIEBWaXNpYmxlRm9yVGVzdGluZworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2ltdWxhdGVMZWdhY3lDcnlwdG8oYm9vbGVhbiBmb3JjZUxlZ2FjeSkgeworICAgIHNpbXVsYXRlTGVnYWN5Q3J5cHRvUmVxdWlyZWQgPSBmb3JjZUxlZ2FjeTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBlbmNvZGVQdWJsaWNLZXkoUHVibGljS2V5IHBrKSB7CisgICAgcmV0dXJuIFB1YmxpY0tleVByb3RvVXRpbC5lbmNvZGVQdWJsaWNLZXkocGspLnRvQnl0ZUFycmF5KCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBQdWJsaWNLZXkgcGFyc2VQdWJsaWNLZXkoYnl0ZVtdIGtleUJ5dGVzKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gUHVibGljS2V5UHJvdG9VdGlsLnBhcnNlUHVibGljS2V5KEdlbmVyaWNQdWJsaWNLZXkucGFyc2VGcm9tKGtleUJ5dGVzKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIEdlbmVyaWNQdWJsaWNLZXkiLCBlKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJVbmFibGUgdG8gcGFyc2UgR2VuZXJpY1B1YmxpY0tleSIsIGUpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBLZXlGYWN0b3J5IGdldEVjS2V5RmFjdG9yeSgpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIkVDIik7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOyAgLy8gTm8gRUNESCBwcm92aWRlciBhdmFpbGFibGUKKyAgICB9CisgIH0KKworICBzdGF0aWMgS2V5RmFjdG9yeSBnZXRSc2FLZXlGYWN0b3J5KCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSgiUlNBIik7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOyAgLy8gTm8gUlNBIHByb3ZpZGVyIGF2YWlsYWJsZQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9TZWN1cmVHY21Db25zdGFudHMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vU2VjdXJlR2NtQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4MjYyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vU2VjdXJlR2NtQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtOworCisvKioKKyAqIEEgY29udGFpbmVyIGZvciBHQ00gcmVsYXRlZCBjb25zdGFudHMgdXNlZCBieSBTZWN1cmVHY20gY2hhbm5lbHMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWN1cmVHY21Db25zdGFudHMgeworICBwcml2YXRlIFNlY3VyZUdjbUNvbnN0YW50cygpIHt9IC8vIERvIG5vdCBpbnN0YW50aWF0ZQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQ1VSRV9HQ01fVkVSU0lPTiA9IDE7CisKKyAgLyoqCisgICAqIFRoZSBHQ00gc2VuZGVyIGlkZW50aXR5IHVzZWQgYnkgdGhpcyBsaWJyYXJ5IChHTVNDb3JlKS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRFUl9JRCA9ICI3NDU0NzYxNzc2MjkiOworCisgIC8qKgorICAgKiBUaGUga2V5IHVzZWQgZm9yIGluZGV4aW5nIHRoZSBHQ00ge0BsaW5rIFRyYW5zcG9ydENyeXB0b09wcy5QYXlsb2FkfSB3aXRoaW4ge0Bjb2RlIEFwcERhdGF9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9LRVkgPSAiUCI7CisKKyAgLyoqCisgICAqIFRoZSBvcmlnaW4gdGhhdCBzaG91bGQgYmUgdXNlIGZvciBHQ00gZGV2aWNlIGVucm9sbG1lbnRzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09PR0xFX09SSUdJTiA9ICJnb29nbGUuY29tIjsKKworICAvKioKKyAgICogVGhlIG9yaWdpbiB0aGF0IHNob3VsZCBiZSB1c2UgZm9yIEdDTSBMZWdhY3kgYW5kcm9pZCBkZXZpY2UgZW5yb2xsbWVudHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfQU5EUk9JRF9PUklHSU4gPSAiYy5nLmEuZ21zIjsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIHByb3RvY29sIHRoaXMgbGlicmFyeSBzcGVha3MuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9UWVBFX05BTUUgPSAiZ2NtVjEiOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9UcmFuc3BvcnRDcnlwdG9PcHMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vVHJhbnNwb3J0Q3J5cHRvT3BzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyZWRjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vVHJhbnNwb3J0Q3J5cHRvT3BzLmphdmEKQEAgLTAsMCArMSwyNjggQEAKKy8qIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uU2VjdXJlR2NtUHJvdG8uR2NtTWV0YWRhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuQ3J5cHRvT3BzLkVuY1R5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuQ3J5cHRvT3BzLlNpZ1R5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uSGVhZGVyQW5kQm9keTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uU2VjdXJlTWVzc2FnZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVB1YmxpY0tleTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGltcGxlbWVudGluZyBhIHNlY3VyZSB0cmFuc3BvcnQgZm9yIEdDTSBtZXNzYWdlcy4KKyAqLworcHVibGljIGNsYXNzIFRyYW5zcG9ydENyeXB0b09wcyB7CisgIHByaXZhdGUgVHJhbnNwb3J0Q3J5cHRvT3BzKCkge30gLy8gRG8gbm90IGluc3RhbnRpYXRlCisKKyAgLyoqCisgICAqIEEgdHlwZSBzYWZlIHZlcnNpb24gb2YgdGhlIHtAbGluayBTZWN1cmVHY21Qcm90b30ge0Bjb2RlIFR5cGV9IGNvZGVzLgorICAgKi8KKyAgcHVibGljIGVudW0gUGF5bG9hZFR5cGUgeworICAgIEVOUk9MTE1FTlQoU2VjdXJlR2NtUHJvdG8uVHlwZS5FTlJPTExNRU5UKSwKKyAgICBUSUNLTEUoU2VjdXJlR2NtUHJvdG8uVHlwZS5USUNLTEUpLAorICAgIFRYX1JFUVVFU1QoU2VjdXJlR2NtUHJvdG8uVHlwZS5UWF9SRVFVRVNUKSwKKyAgICBUWF9SRVBMWShTZWN1cmVHY21Qcm90by5UeXBlLlRYX1JFUExZKSwKKyAgICBUWF9TWU5DX1JFUVVFU1QoU2VjdXJlR2NtUHJvdG8uVHlwZS5UWF9TWU5DX1JFUVVFU1QpLAorICAgIFRYX1NZTkNfUkVTUE9OU0UoU2VjdXJlR2NtUHJvdG8uVHlwZS5UWF9TWU5DX1JFU1BPTlNFKSwKKyAgICBUWF9QSU5HKFNlY3VyZUdjbVByb3RvLlR5cGUuVFhfUElORyksCisgICAgREVWSUNFX0lORk9fVVBEQVRFKFNlY3VyZUdjbVByb3RvLlR5cGUuREVWSUNFX0lORk9fVVBEQVRFKSwKKyAgICBUWF9DQU5DRUxfUkVRVUVTVChTZWN1cmVHY21Qcm90by5UeXBlLlRYX0NBTkNFTF9SRVFVRVNUKSwKKyAgICBMT0dJTl9OT1RJRklDQVRJT04oU2VjdXJlR2NtUHJvdG8uVHlwZS5MT0dJTl9OT1RJRklDQVRJT04pLAorICAgIFBST1hJTUlUWUFVVEhfUEFJUklORyhTZWN1cmVHY21Qcm90by5UeXBlLlBST1hJTUlUWUFVVEhfUEFJUklORyksCisgICAgR0NNVjFfSURFTlRJVFlfQVNTRVJUSU9OKFNlY3VyZUdjbVByb3RvLlR5cGUuR0NNVjFfSURFTlRJVFlfQVNTRVJUSU9OKSwKKyAgICBERVZJQ0VfVE9fREVWSUNFX1JFU1BPTkRFUl9IRUxMT19QQVlMT0FEKAorICAgICAgICBTZWN1cmVHY21Qcm90by5UeXBlLkRFVklDRV9UT19ERVZJQ0VfUkVTUE9OREVSX0hFTExPX1BBWUxPQUQpLAorICAgIERFVklDRV9UT19ERVZJQ0VfTUVTU0FHRShTZWN1cmVHY21Qcm90by5UeXBlLkRFVklDRV9UT19ERVZJQ0VfTUVTU0FHRSksCisgICAgREVWSUNFX1BST1hJTUlUWV9DQUxMQkFDSyhTZWN1cmVHY21Qcm90by5UeXBlLkRFVklDRV9QUk9YSU1JVFlfQ0FMTEJBQ0spLAorICAgIFVOTE9DS19LRVlfU0lHTkVEX0NIQUxMRU5HRShTZWN1cmVHY21Qcm90by5UeXBlLlVOTE9DS19LRVlfU0lHTkVEX0NIQUxMRU5HRSk7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlY3VyZUdjbVByb3RvLlR5cGUgdHlwZTsKKyAgICBQYXlsb2FkVHlwZShTZWN1cmVHY21Qcm90by5UeXBlIHR5cGUpIHsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFNlY3VyZUdjbVByb3RvLlR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLnR5cGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYXlsb2FkVHlwZSB2YWx1ZU9mKFNlY3VyZUdjbVByb3RvLlR5cGUgdHlwZSkgeworICAgICAgcmV0dXJuIFBheWxvYWRUeXBlLnZhbHVlT2YodHlwZS5nZXROdW1iZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYXlsb2FkVHlwZSB2YWx1ZU9mKGludCB0eXBlKSB7CisgICAgICBmb3IgKFBheWxvYWRUeXBlIHBheWxvYWRUeXBlIDogUGF5bG9hZFR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKHBheWxvYWRUeXBlLmdldFR5cGUoKS5nZXROdW1iZXIoKSA9PSB0eXBlKSB7CisgICAgICAgICAgcmV0dXJuIHBheWxvYWRUeXBlOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBwYXlsb2FkIHR5cGU6ICIgKyB0eXBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW5jYXBzdWxhdGVzIGEge0BsaW5rIFBheWxvYWRUeXBlfSBzcGVjaWZpZXIsIGFuZCBhIGNvcnJlc3BvbmRpbmcgcmF3IHtAY29kZSBtZXNzYWdlfSBwYXlsb2FkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXlsb2FkIHsKKyAgICBwcml2YXRlIGZpbmFsIFBheWxvYWRUeXBlIHBheWxvYWRUeXBlOworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1lc3NhZ2U7CisKKyAgICBwdWJsaWMgUGF5bG9hZChQYXlsb2FkVHlwZSBwYXlsb2FkVHlwZSwgYnl0ZVtdIG1lc3NhZ2UpIHsKKyAgICAgIGlmICgocGF5bG9hZFR5cGUgPT0gbnVsbCkgfHwgKG1lc3NhZ2UgPT0gbnVsbCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICB0aGlzLnBheWxvYWRUeXBlID0gcGF5bG9hZFR5cGU7CisgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBQYXlsb2FkVHlwZSBnZXRQYXlsb2FkVHlwZSgpIHsKKyAgICAgIHJldHVybiBwYXlsb2FkVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldE1lc3NhZ2UoKSB7CisgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVXNlZCBieSB0aGUgdGhlIHNlcnZlci1zaWRlIHRvIHNlbmQgYSBzZWN1cmUge0BsaW5rIFBheWxvYWR9IHRvIHRoZSBjbGllbnQuCisgICAqCisgICAqIEBwYXJhbSBtYXN0ZXJLZXkgdXNlZCB0byBzaWduY3J5cHQgdGhlIHtAbGluayBQYXlsb2FkfQorICAgKiBAcGFyYW0ga2V5SGFuZGxlIHRoZSBuYW1lIGJ5IHdoaWNoIHRoZSBjbGllbnQgcmVmZXJzIHRvIHRoZSBzcGVjaWZpZWQge0Bjb2RlIG1hc3RlcktleX0KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNpZ25jcnlwdFNlcnZlck1lc3NhZ2UoCisgICAgICBQYXlsb2FkIHBheWxvYWQsIFNlY3JldEtleSBtYXN0ZXJLZXksIGJ5dGVbXSBrZXlIYW5kbGUpCisgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICBpZiAoKHBheWxvYWQgPT0gbnVsbCkgfHwgKG1hc3RlcktleSA9PSBudWxsKSB8fCAoa2V5SGFuZGxlID09IG51bGwpKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBTZWN1cmVNZXNzYWdlQnVpbGRlcigpCisgICAgICAgIC5zZXRWZXJpZmljYXRpb25LZXlJZChrZXlIYW5kbGUpCisgICAgICAgIC5zZXRQdWJsaWNNZXRhZGF0YShHY21NZXRhZGF0YS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRUeXBlKHBheWxvYWQuZ2V0UGF5bG9hZFR5cGUoKS5nZXRUeXBlKCkpCisgICAgICAgICAgICAuc2V0VmVyc2lvbihTZWN1cmVHY21Db25zdGFudHMuU0VDVVJFX0dDTV9WRVJTSU9OKQorICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgIC50b0J5dGVBcnJheSgpKQorICAgICAgICAuYnVpbGRTaWduQ3J5cHRlZE1lc3NhZ2UoCisgICAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgICBTaWdUeXBlLkhNQUNfU0hBMjU2LAorICAgICAgICAgICAgbWFzdGVyS2V5LAorICAgICAgICAgICAgRW5jVHlwZS5BRVNfMjU2X0NCQywKKyAgICAgICAgICAgIHBheWxvYWQuZ2V0TWVzc2FnZSgpKQorICAgICAgICAudG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIC8qKgorICAgKiBFeHRyYWN0cyB0aGUge0Bjb2RlIGtleUhhbmRsZX0gZnJvbSBhIHtAY29kZSBzaWduY3J5cHRlZE1lc3NhZ2V9LgorICAgKgorICAgKiBAc2VlICNzaWduY3J5cHRTZXJ2ZXJNZXNzYWdlKFBheWxvYWQsIFNlY3JldEtleSwgYnl0ZVtdKQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0S2V5SGFuZGxlRm9yKGJ5dGVbXSBzaWduY3J5cHRlZFNlcnZlck1lc3NhZ2UpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uICB7CisgICAgaWYgKHNpZ25jcnlwdGVkU2VydmVyTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgU2VjdXJlTWVzc2FnZSBzZWNtc2cgPSBTZWN1cmVNZXNzYWdlLnBhcnNlRnJvbShzaWduY3J5cHRlZFNlcnZlck1lc3NhZ2UpOworICAgIHJldHVybiBTZWN1cmVNZXNzYWdlUGFyc2VyLmdldFVudmVyaWZpZWRIZWFkZXIoc2VjbXNnKS5nZXRWZXJpZmljYXRpb25LZXlJZCgpLnRvQnl0ZUFycmF5KCk7CisgIH0KKworICAvKioKKyAgICogVXNlZCBieSBhIGNsaWVudCB0byByZWNvdmVyIGEgc2VjdXJlIHtAbGluayBQYXlsb2FkfSBzZW50IGJ5IHRoZSBzZXJ2ZXItc2lkZS4KKyAgICoKKyAgICogQHNlZSAjZ2V0S2V5SGFuZGxlRm9yKGJ5dGVbXSkKKyAgICogQHNlZSAjc2lnbmNyeXB0U2VydmVyTWVzc2FnZShQYXlsb2FkLCBTZWNyZXRLZXksIGJ5dGVbXSkKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgUGF5bG9hZCB2ZXJpZnlkZWNyeXB0U2VydmVyTWVzc2FnZSgKKyAgICAgIGJ5dGVbXSBzaWduY3J5cHRlZFNlcnZlck1lc3NhZ2UsIFNlY3JldEtleSBtYXN0ZXJLZXkpCisgICAgICB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIGlmICgoc2lnbmNyeXB0ZWRTZXJ2ZXJNZXNzYWdlID09IG51bGwpIHx8IChtYXN0ZXJLZXkgPT0gbnVsbCkpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0cnkgeworICAgICAgU2VjdXJlTWVzc2FnZSBzZWNtc2cgPSBTZWN1cmVNZXNzYWdlLnBhcnNlRnJvbShzaWduY3J5cHRlZFNlcnZlck1lc3NhZ2UpOworICAgICAgSGVhZGVyQW5kQm9keSBwYXJzZWQgPSBTZWN1cmVNZXNzYWdlUGFyc2VyLnBhcnNlU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgICAgICAgIHNlY21zZywKKyAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgU2lnVHlwZS5ITUFDX1NIQTI1NiwKKyAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgRW5jVHlwZS5BRVNfMjU2X0NCQyk7CisgICAgICBHY21NZXRhZGF0YSBtZXRhZGF0YSA9IEdjbU1ldGFkYXRhLnBhcnNlRnJvbShwYXJzZWQuZ2V0SGVhZGVyKCkuZ2V0UHVibGljTWV0YWRhdGEoKSk7CisgICAgICBpZiAobWV0YWRhdGEuZ2V0VmVyc2lvbigpID4gU2VjdXJlR2NtQ29uc3RhbnRzLlNFQ1VSRV9HQ01fVkVSU0lPTikgeworICAgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9uIik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IFBheWxvYWQoUGF5bG9hZFR5cGUudmFsdWVPZihtZXRhZGF0YS5nZXRUeXBlKCkpLCBwYXJzZWQuZ2V0Qm9keSgpLnRvQnl0ZUFycmF5KCkpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB8IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VkIGJ5IHRoZSB0aGUgY2xpZW50LXNpZGUgdG8gc2VuZCBhIHNlY3VyZSB7QGxpbmsgUGF5bG9hZH0gdG8gdGhlIGNsaWVudC4KKyAgICoKKyAgICogQHBhcmFtIHVzZXJLZXlQYWlyIHVzZWQgdG8gc2lnbiB0aGUge0BsaW5rIFBheWxvYWR9LiBJbiBwYXJ0aWN1bGFyLCB0aGUge0BsaW5rIFByaXZhdGVLZXl9CisgICAqICAgcG9ydGlvbiBpcyB1c2VkIGZvciBzaWduaW5nLCBhbmQgKHRoZSB7QGxpbmsgUHVibGljS2V5fSBwb3J0aW9uIGlzIHNlbnQgdG8gdGhlIHNlcnZlci4KKyAgICogQHBhcmFtIG1hc3RlcktleSB1c2VkIHRvIGVuY3J5cHQgdGhlIHtAbGluayBQYXlsb2FkfQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBieXRlW10gc2lnbmNyeXB0Q2xpZW50TWVzc2FnZSgKKyAgICAgIFBheWxvYWQgcGF5bG9hZCwgS2V5UGFpciB1c2VyS2V5UGFpciwgU2VjcmV0S2V5IG1hc3RlcktleSkKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIGlmICgocGF5bG9hZCA9PSBudWxsKSB8fCAobWFzdGVyS2V5ID09IG51bGwpKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBQdWJsaWNLZXkgdXNlclB1YmxpY0tleSA9IHVzZXJLZXlQYWlyLmdldFB1YmxpYygpOworICAgIFByaXZhdGVLZXkgdXNlclByaXZhdGVLZXkgPSB1c2VyS2V5UGFpci5nZXRQcml2YXRlKCk7CisKKyAgICByZXR1cm4gbmV3IFNlY3VyZU1lc3NhZ2VCdWlsZGVyKCkKKyAgICAgICAgLnNldFZlcmlmaWNhdGlvbktleUlkKEtleUVuY29kaW5nLmVuY29kZVVzZXJQdWJsaWNLZXkodXNlclB1YmxpY0tleSkpCisgICAgICAgIC5zZXRQdWJsaWNNZXRhZGF0YShHY21NZXRhZGF0YS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRUeXBlKHBheWxvYWQuZ2V0UGF5bG9hZFR5cGUoKS5nZXRUeXBlKCkpCisgICAgICAgICAgICAuc2V0VmVyc2lvbihTZWN1cmVHY21Db25zdGFudHMuU0VDVVJFX0dDTV9WRVJTSU9OKQorICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgIC50b0J5dGVBcnJheSgpKQorICAgICAgICAuYnVpbGRTaWduQ3J5cHRlZE1lc3NhZ2UoCisgICAgICAgICAgICB1c2VyUHJpdmF0ZUtleSwKKyAgICAgICAgICAgIGdldFNpZ1R5cGVGb3IodXNlclB1YmxpY0tleSksCisgICAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgICBFbmNUeXBlLkFFU18yNTZfQ0JDLAorICAgICAgICAgICAgcGF5bG9hZC5nZXRNZXNzYWdlKCkpCisgICAgICAgIC50b0J5dGVBcnJheSgpOworICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkgdGhlIHNlcnZlci1zaWRlIHRvIHJlY292ZXIgYSBzZWN1cmUge0BsaW5rIFBheWxvYWR9IHNlbnQgYnkgYSBjbGllbnQuCisgICAqCisgICAqIEBzZWUgI2dldEVuY29kZWRVc2VyUHVibGljS2V5Rm9yKGJ5dGVbXSkKKyAgICogQHNlZSAjc2lnbmNyeXB0Q2xpZW50TWVzc2FnZShQYXlsb2FkLCBLZXlQYWlyLCBTZWNyZXRLZXkpCisgICAqLworICBwdWJsaWMgc3RhdGljIFBheWxvYWQgdmVyaWZ5ZGVjcnlwdENsaWVudE1lc3NhZ2UoCisgICAgICBieXRlW10gc2lnbmNyeXB0ZWRDbGllbnRNZXNzYWdlLCBQdWJsaWNLZXkgdXNlclB1YmxpY0tleSwgU2VjcmV0S2V5IG1hc3RlcktleSkKKyAgICAgIHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgaWYgKChzaWduY3J5cHRlZENsaWVudE1lc3NhZ2UgPT0gbnVsbCkgfHwgKG1hc3RlcktleSA9PSBudWxsKSkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBTZWN1cmVNZXNzYWdlIHNlY21zZyA9IFNlY3VyZU1lc3NhZ2UucGFyc2VGcm9tKHNpZ25jcnlwdGVkQ2xpZW50TWVzc2FnZSk7CisgICAgICBIZWFkZXJBbmRCb2R5IHBhcnNlZCA9IFNlY3VyZU1lc3NhZ2VQYXJzZXIucGFyc2VTaWduQ3J5cHRlZE1lc3NhZ2UoCisgICAgICAgICAgc2VjbXNnLAorICAgICAgICAgIHVzZXJQdWJsaWNLZXksCisgICAgICAgICAgZ2V0U2lnVHlwZUZvcih1c2VyUHVibGljS2V5KSwKKyAgICAgICAgICBtYXN0ZXJLZXksCisgICAgICAgICAgRW5jVHlwZS5BRVNfMjU2X0NCQyk7CisgICAgICBHY21NZXRhZGF0YSBtZXRhZGF0YSA9IEdjbU1ldGFkYXRhLnBhcnNlRnJvbShwYXJzZWQuZ2V0SGVhZGVyKCkuZ2V0UHVibGljTWV0YWRhdGEoKSk7CisgICAgICBpZiAobWV0YWRhdGEuZ2V0VmVyc2lvbigpID4gU2VjdXJlR2NtQ29uc3RhbnRzLlNFQ1VSRV9HQ01fVkVSU0lPTikgeworICAgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9uIik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IFBheWxvYWQoUGF5bG9hZFR5cGUudmFsdWVPZihtZXRhZGF0YS5nZXRUeXBlKCkpLCBwYXJzZWQuZ2V0Qm9keSgpLnRvQnl0ZUFycmF5KCkpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB8IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFeHRyYWN0cyBhbiBlbmNvZGVkIHtAY29kZSB1c2VyUHVibGljS2V5fSBmcm9tIGEge0Bjb2RlIHNpZ25jcnlwdGVkQ2xpZW50TWVzc2FnZX0uCisgICAqCisgICAqIEBzZWUgI3NpZ25jcnlwdENsaWVudE1lc3NhZ2UoUGF5bG9hZCwgS2V5UGFpciwgU2VjcmV0S2V5KQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0RW5jb2RlZFVzZXJQdWJsaWNLZXlGb3IoYnl0ZVtdIHNpZ25jcnlwdGVkQ2xpZW50TWVzc2FnZSkKKyAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gIHsKKyAgICBpZiAoc2lnbmNyeXB0ZWRDbGllbnRNZXNzYWdlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICBTZWN1cmVNZXNzYWdlIHNlY21zZyA9IFNlY3VyZU1lc3NhZ2UucGFyc2VGcm9tKHNpZ25jcnlwdGVkQ2xpZW50TWVzc2FnZSk7CisgICAgcmV0dXJuIFNlY3VyZU1lc3NhZ2VQYXJzZXIuZ2V0VW52ZXJpZmllZEhlYWRlcihzZWNtc2cpLmdldFZlcmlmaWNhdGlvbktleUlkKCkudG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFNpZ1R5cGUgZ2V0U2lnVHlwZUZvcihQdWJsaWNLZXkgdXNlclB1YmxpY0tleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgIGlmICh1c2VyUHVibGljS2V5IGluc3RhbmNlb2YgRUNQdWJsaWNLZXkpIHsKKyAgICAgIHJldHVybiBTaWdUeXBlLkVDRFNBX1AyNTZfU0hBMjU2OworICAgIH0gZWxzZSBpZiAodXNlclB1YmxpY0tleSBpbnN0YW5jZW9mIFJTQVB1YmxpY0tleSkgeworICAgICAgcmV0dXJuIFNpZ1R5cGUuUlNBMjA0OF9TSEEyNTY7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBrZXkgdHlwZSIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9Va2V5MkhhbmRzaGFrZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9Va2V5MkhhbmRzaGFrZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDFjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL1VrZXkySGFuZHNoYWtlLmphdmEKQEAgLTAsMCArMSwxMDQxIEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY207CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5Va2V5UHJvdG8uVWtleTJBbGVydDsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlVrZXlQcm90by5Va2V5MkNsaWVudEZpbmlzaGVkOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20uVWtleVByb3RvLlVrZXkyQ2xpZW50SW5pdDsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlVrZXlQcm90by5Va2V5MkNsaWVudEluaXQuQ2lwaGVyQ29tbWl0bWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtLlVrZXlQcm90by5Va2V5Mk1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbS5Va2V5UHJvdG8uVWtleTJTZXJ2ZXJJbml0OworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLkNyeXB0b09wczsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5QdWJsaWNLZXlQcm90b1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVByb3RvLkdlbmVyaWNQdWJsaWNLZXk7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CisKKy8qKgorICogSW1wbGVtZW50cyBVS0VZMiBhbmQgcHJvZHVjZXMgYSB7QGxpbmsgRDJEQ29ubmVjdGlvbkNvbnRleHR9LgorICoKKyAqIDxwPkNsaWVudCBVc2FnZToKKyAqIDxjb2RlPgorICogdHJ5IHsKKyAqICAgVWtleTJIYW5kc2hha2UgY2xpZW50ID0gVWtleTJIYW5kc2hha2UuZm9ySW5pdGlhdG9yKEhhbmRzaGFrZUNpcGhlci5QMjU2X1NIQTUxMik7CisgKiAgIGJ5dGVbXSBoYW5kc2hha2VNZXNzYWdlOworICoKKyAqICAgLy8gTWVzc2FnZSAxIChDbGllbnQgSW5pdCkKKyAqICAgaGFuZHNoYWtlTWVzc2FnZSA9IGNsaWVudC5nZXROZXh0SGFuZHNoYWtlTWVzc2FnZSgpOworICogICBzZW5kTWVzc2FnZVRvU2VydmVyKGhhbmRzaGFrZU1lc3NhZ2UpOworICoKKyAqICAgLy8gTWVzc2FnZSAyIChTZXJ2ZXIgSW5pdCkKKyAqICAgaGFuZHNoYWtlTWVzc2FnZSA9IHJlY2VpdmVNZXNzYWdlRnJvbVNlcnZlcigpOworICogICBjbGllbnQucGFyc2VIYW5kc2hha2VNZXNzYWdlKGhhbmRzaGFrZU1lc3NhZ2UpOworICoKKyAqICAgLy8gTWVzc2FnZSAzIChDbGllbnQgRmluaXNoKQorICogICBoYW5kc2hha2VNZXNzYWdlID0gY2xpZW50LmdldE5leHRIYW5kc2hha2VNZXNzYWdlKCk7CisgKiAgIHNlbmRNZXNzYWdlVG9TZXJ2ZXIoaGFuZHNoYWtlTWVzc2FnZSk7CisgKgorICogICAvLyBHZXQgdGhlIGF1dGggc3RyaW5nCisgKiAgIGJ5dGVbXSBjbGllbnRBdXRoU3RyaW5nID0gY2xpZW50LmdldFZlcmlmaWNhdGlvblN0cmluZyhTVFJJTkdfTEVOR1RIKTsKKyAqICAgc2hvd1N0cmluZ1RvVXNlcihjbGllbnRBdXRoU3RyaW5nKTsKKyAqCisgKiAgIC8vIFVzaW5nIG91dC1vZi1iYW5kIGNoYW5uZWwsIHZlcmlmeSBhdXRoIHN0cmluZywgdGhlbiBjYWxsOgorICogICBjbGllbnQudmVyaWZ5SGFuZHNoYWtlKCk7CisgKgorICogICAvLyBNYWtlIGEgY29ubmVjdGlvbiBjb250ZXh0CisgKiAgIEQyRENvbm5lY3Rpb25Db250ZXh0IGNsaWVudENvbnRleHQgPSBjbGllbnQudG9Db25uZWN0aW9uQ29udGV4dCgpOworICogfSBjYXRjaCAoQWxlcnRFeGNlcHRpb24gZSkgeworICogICBsb2coZS5nZXRNZXNzYWdlKTsKKyAqICAgc2VuZE1lc3NhZ2VUb1NlcnZlcihlLmdldEFsZXJ0TWVzc2FnZVRvU2VuZCgpKTsKKyAqIH0gY2F0Y2ggKEhhbmRzaGFrZUV4Y2VwdGlvbiBlKSB7CisgKiAgIGxvZyhlKTsKKyAqICAgLy8gdGVybWluYXRlIGhhbmRzaGFrZQorICogfQorICogPC9jb2RlPgorICoKKyAqIDxwPlNlcnZlciBVc2FnZToKKyAqIDxjb2RlPgorICogdHJ5IHsKKyAqICAgVWtleTJIYW5kc2hha2Ugc2VydmVyID0gVWtleTJIYW5kc2hha2UuZm9yUmVzcG9uZGVyKEhhbmRzaGFrZUNpcGhlci5QMjU2X1NIQTUxMik7CisgKiAgIGJ5dGVbXSBoYW5kc2hha2VNZXNzYWdlOworICoKKyAqICAgLy8gTWVzc2FnZSAxIChDbGllbnQgSW5pdCkKKyAqICAgaGFuZHNoYWtlTWVzc2FnZSA9IHJlY2VpdmVNZXNzYWdlRnJvbUNsaWVudCgpOworICogICBzZXJ2ZXIucGFyc2VIYW5kc2hha2VNZXNzYWdlKGhhbmRzaGFrZU1lc3NhZ2UpOworICoKKyAqICAgLy8gTWVzc2FnZSAyIChTZXJ2ZXIgSW5pdCkKKyAqICAgaGFuZHNoYWtlTWVzc2FnZSA9IHNlcnZlci5nZXROZXh0SGFuZHNoYWtlTWVzc2FnZSgpOworICogICBzZW5kTWVzc2FnZVRvU2VydmVyKGhhbmRzaGFrZU1lc3NhZ2UpOworICoKKyAqICAgLy8gTWVzc2FnZSAzIChDbGllbnQgRmluaXNoKQorICogICBoYW5kc2hha2VNZXNzYWdlID0gcmVjZWl2ZU1lc3NhZ2VGcm9tQ2xpZW50KCk7CisgKiAgIHNlcnZlci5wYXJzZUhhbmRzaGFrZU1lc3NhZ2UoaGFuZHNoYWtlTWVzc2FnZSk7CisgKgorICogICAvLyBHZXQgdGhlIGF1dGggc3RyaW5nCisgKiAgIGJ5dGVbXSBzZXJ2ZXJBdXRoU3RyaW5nID0gc2VydmVyLmdldFZlcmlmaWNhdGlvblN0cmluZyhTVFJJTkdfTEVOR1RIKTsKKyAqICAgc2hvd1N0cmluZ1RvVXNlcihzZXJ2ZXJBdXRoU3RyaW5nKTsKKyAqCisgKiAgIC8vIFVzaW5nIG91dC1vZi1iYW5kIGNoYW5uZWwsIHZlcmlmeSBhdXRoIHN0cmluZywgdGhlbiBjYWxsOgorICogICBzZXJ2ZXIudmVyaWZ5SGFuZHNoYWtlKCk7CisgKgorICogICAvLyBNYWtlIGEgY29ubmVjdGlvbiBjb250ZXh0CisgKiAgIEQyRENvbm5lY3Rpb25Db250ZXh0IHNlcnZlckNvbnRleHQgPSBzZXJ2ZXIudG9Db25uZWN0aW9uQ29udGV4dCgpOworICogfSBjYXRjaCAoQWxlcnRFeGNlcHRpb24gZSkgeworICogICBsb2coZS5nZXRNZXNzYWdlKTsKKyAqICAgc2VuZE1lc3NhZ2VUb0NsaWVudChlLmdldEFsZXJ0TWVzc2FnZVRvU2VuZCgpKTsKKyAqIH0gY2F0Y2ggKEhhbmRzaGFrZUV4Y2VwdGlvbiBlKSB7CisgKiAgIGxvZyhlKTsKKyAqICAgLy8gdGVybWluYXRlIGhhbmRzaGFrZQorICogfQorICogPC9jb2RlPgorICovCitwdWJsaWMgY2xhc3MgVWtleTJIYW5kc2hha2UgeworCisgIC8qKgorICAgKiBDcmVhdGVzIGEge0BsaW5rIFVrZXkySGFuZHNoYWtlfSB3aXRoIGEgcGFydGljdWxhciBjaXBoZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhbiBpbml0aWF0b3IgLworICAgKiBjbGllbnQuCisgICAqCisgICAqIEB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFVrZXkySGFuZHNoYWtlIGZvckluaXRpYXRvcihIYW5kc2hha2VDaXBoZXIgY2lwaGVyKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFVrZXkySGFuZHNoYWtlKEludGVybmFsU3RhdGUuQ0xJRU5UX1NUQVJULCBjaXBoZXIpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSB7QGxpbmsgVWtleTJIYW5kc2hha2V9IHdpdGggYSBwYXJ0aWN1bGFyIGNpcGhlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGFuIHJlc3BvbmRlciAvCisgICAqIHNlcnZlci4KKyAgICoKKyAgICogQHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVWtleTJIYW5kc2hha2UgZm9yUmVzcG9uZGVyKEhhbmRzaGFrZUNpcGhlciBjaXBoZXIpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIHJldHVybiBuZXcgVWtleTJIYW5kc2hha2UoSW50ZXJuYWxTdGF0ZS5TRVJWRVJfU1RBUlQsIGNpcGhlcik7CisgIH0KKworICAvKioKKyAgICogSGFuZHNoYWtlIFN0YXRlcy4gTWVhbmluZyBvZiBzdGF0ZXM6CisgICAqIDx1bD4KKyAgICogPGxpPklOX1BST0dSRVNTOiBUaGUgaGFuZHNoYWtlIGlzIGluIHByb2dyZXNzLCBjYWxsZXIgc2hvdWxkIHVzZQorICAgKiB7QGxpbmsgVWtleTJIYW5kc2hha2UjZ2V0TmV4dEhhbmRzaGFrZU1lc3NhZ2UoKX0gYW5kCisgICAqIHtAbGluayBVa2V5MkhhbmRzaGFrZSNwYXJzZUhhbmRzaGFrZU1lc3NhZ2UoYnl0ZVtdKX0gdG8gY29udGludWUgdGhlIGhhbmRzaGFrZS4KKyAgICogPGxpPlZFUklGSUNBVElPTl9ORUVERUQ6IFRoZSBoYW5kc2hha2UgaXMgY29tcGxldGUsIGJ1dCBwZW5kaW5nIHZlcmlmaWNhdGlvbiBvZiB0aGUKKyAgICogYXV0aGVudGljYXRpb24gc3RyaW5nLiBDbGllbnRzIHNob3VsZCB1c2Uge0BsaW5rIFVrZXkySGFuZHNoYWtlI2dldFZlcmlmaWNhdGlvblN0cmluZyhpbnQpfSB0bworICAgKiBnZXQgdGhlIHZlcmlmaWNhdGlvbiBzdHJpbmcgYW5kIHVzZSBvdXQtb2YtYmFuZCBtZXRob2RzIHRvIGF1dGhlbnRpY2F0ZSB0aGUgaGFuZHNoYWtlLgorICAgKiA8bGk+VkVSSUZJQ0FUSU9OX0lOX1BST0dSRVNTOiBUaGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlLCB2ZXJpZmljYXRpb24gc3RyaW5nIGhhcyBiZWVuCisgICAqIGdlbmVyYXRlZCwgYnV0IGhhcyBub3QgYmVlbiBjb25maXJtZWQuIEFmdGVyIGF1dGhlbnRpY2F0aW5nIHRoZSBoYW5kc2hha2Ugb3V0LW9mLWJhbmQsIHVzZQorICAgKiB7QGxpbmsgVWtleTJIYW5kc2hha2UjdmVyaWZ5SGFuZHNoYWtlKCl9IHRvIG1hcmsgdGhlIGhhbmRzaGFrZSBhcyB2ZXJpZmllZC4KKyAgICogPGxpPkZJTklTSEVEOiBUaGUgaGFuZHNoYWtlIGlzIGZpbmlzaGVkLCBhbmQgY2FsbGVyIGNhbiB1c2UKKyAgICoge0BsaW5rIFVrZXkySGFuZHNoYWtlI3RvQ29ubmVjdGlvbkNvbnRleHQoKX0gdG8gcHJvZHVjZSBhIHtAbGluayBEMkRDb25uZWN0aW9uQ29udGV4dH0uCisgICAqIDxsaT5BTFJFQURZX1VTRUQ6IFRoZSBoYW5kc2hha2UgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGFuZCBzaG91bGQgYmUgZGlzY2FyZGVkIC8gZ2FyYmFnZQorICAgKiBjb2xsZWN0ZWQuCisgICAqIDxsaT5FUlJPUjogVGhlIGhhbmRzaGFrZSBwcm9kdWNlZCBhbiBlcnJvciBhbmQgc2hvdWxkIGJlIGRlc3Ryb3llZC4KKyAgICogPC91bD4KKyAgICovCisgIHB1YmxpYyBlbnVtIFN0YXRlIHsKKyAgICBJTl9QUk9HUkVTUywKKyAgICBWRVJJRklDQVRJT05fTkVFREVELAorICAgIFZFUklGSUNBVElPTl9JTl9QUk9HUkVTUywKKyAgICBGSU5JU0hFRCwKKyAgICBBTFJFQURZX1VTRUQsCisgICAgRVJST1IsCisgIH0KKworICAvKioKKyAgICogQ3VycmVudGx5IGltcGxlbWVudGVkIFVLRVkyIGhhbmRzaGFrZSBjaXBoZXJzLiBFYWNoIGNpcGhlciBpcyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgYSBrZXkKKyAgICogbmVnb3RpYXRpb24gY2lwaGVyIGFuZCBhIGhhc2ggZnVuY3Rpb24gdXNlZCBmb3IgYSBjb21taXRtZW50LiBDdXJyZW50bHkgdGhlIGNpcGhlcnMgYXJlOgorICAgKiA8Y29kZT4KKyAgICogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAqICAgfCBFbnVtICAgICAgICB8IEtleSBuZWdvdGlhdGlvbiAgICAgICB8IEhhc2ggZnVuY3Rpb24gfAorICAgKiAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgICogICB8IFAyNTZfU0hBNTEyIHwgRUNESCB1c2luZyBOSVNUIFAtMjU2IHwgU0hBNTEyICAgICAgICB8CisgICAqICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgKiA8L2NvZGU+CisgICAqCisgICAqIDxwPk5vdGUgdGhhdCB0aGVzZSBzaG91bGQgY29ycmVzcG9uZCB0byB2YWx1ZXMgaW4gZGV2aWNlX3RvX2RldmljZV9tZXNzYWdlcy5wcm90by4KKyAgICovCisgIHB1YmxpYyBlbnVtIEhhbmRzaGFrZUNpcGhlciB7CisgICAgUDI1Nl9TSEE1MTIoVWtleVByb3RvLlVrZXkySGFuZHNoYWtlQ2lwaGVyLlAyNTZfU0hBNTEyKTsKKyAgICAvLyBUT0RPKGFjemVza2lzKTogYWRkIENVUlZFMjU1MTlfU0hBNTEyCisKKyAgICBwcml2YXRlIGZpbmFsIFVrZXlQcm90by5Va2V5MkhhbmRzaGFrZUNpcGhlciB2YWx1ZTsKKworICAgIEhhbmRzaGFrZUNpcGhlcihVa2V5UHJvdG8uVWtleTJIYW5kc2hha2VDaXBoZXIgdmFsdWUpIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGFjY2VwdCB2YWx1ZXMgdGhhdCBhcmUgdmFsaWQgYXMgcGVyIHRoZSB1a2V5IHByb3RvYnVmLgorICAgICAgLy8gTk9URTogRG9uJ3QgdXNlIHN3aXRjaCBzdGF0ZW1lbnQgb24gdmFsdWUsIGFzIHRoYXQgd2lsbCB0cmlnZ2VyIGEgYnVnLiBiLzMwNjgyOTg5LgorICAgICAgaWYgKHZhbHVlID09IFVrZXlQcm90by5Va2V5MkhhbmRzaGFrZUNpcGhlci5QMjU2X1NIQTUxMikgeworICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjaXBoZXIgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFVrZXlQcm90by5Va2V5MkhhbmRzaGFrZUNpcGhlciBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSWYgdGhyb3duLCB0aGlzIGV4Y2VwdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSBzZW50IG9uIHRoZSB3aXJlLiBTcGVjaWZpY2FsbHksCisgICAqIHRoZSB7QGxpbmsgI2dldEFsZXJ0TWVzc2FnZVRvU2VuZCgpfSBtZXRob2QgcmV0dXJucyBhIDxjb2RlPmJ5dGVbXTwvY29kZT4gdGhhdCBjb21tdW5pY2F0ZXMgdGhlCisgICAqIGVycm9yIHRvIHRoZSBvdGhlciBwYXJ0eSBpbiB0aGUgaGFuZHNoYWtlLiBNZWFud2hpbGUsIHRoZSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gbWV0aG9kIGNhbiBiZQorICAgKiB1c2VkIHRvIGdldCBhIGxvZy1hYmxlIGVycm9yIG1lc3NhZ2UuCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsZXJ0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIFVrZXkyQWxlcnQgYWxlcnRNZXNzYWdlVG9TZW5kOworCisgICAgcHVibGljIEFsZXJ0RXhjZXB0aW9uKFN0cmluZyBhbGVydE1lc3NhZ2VUb0xvZywgVWtleTJBbGVydCBhbGVydE1lc3NhZ2VUb1NlbmQpIHsKKyAgICAgIHN1cGVyKGFsZXJ0TWVzc2FnZVRvTG9nKTsKKyAgICAgIHRoaXMuYWxlcnRNZXNzYWdlVG9TZW5kID0gYWxlcnRNZXNzYWdlVG9TZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBtZXNzYWdlIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG90aGVyIG1lbWJlciBvZiBoYW5kc2hha2UuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRBbGVydE1lc3NhZ2VUb1NlbmQoKSB7CisgICAgICByZXR1cm4gYWxlcnRNZXNzYWdlVG9TZW5kLnRvQnl0ZUFycmF5KCk7CisgICAgfQorICB9CisKKyAgLy8gTWF4aW11bSB2ZXJzaW9uIG9mIHRoZSBoYW5kc2hha2Ugc3VwcG9ydGVkIGJ5IHRoaXMgY2xhc3MuCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT04gPSAxOworCisgIC8vIFJhbmRvbSBub25jZSBpcyBmaXhlZCBhdCAzMiBieXRlcyAoYXMgcGVyIGdvL3VrZXkyKS4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkNFX0xFTkdUSF9JTl9CWVRFUyA9IDMyOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7CisKKyAgLy8gQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgb25lIG5leHQgcHJvdG9jb2wuCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVhUX1BST1RPQ09MID0gIkFFU18yNTZfQ0JDLUhNQUNfU0hBMjU2IjsKKworICAvLyBDbGllbnRzIG5lZWQgdG8gc3RvcmUgYSBtYXAgb2YgbWVzc2FnZSAzJ3MgKGNsaWVudCBmaW5pc2hlcykgZm9yIGVhY2ggY29tbWl0bWVudC4KKyAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEhhbmRzaGFrZUNpcGhlciwgYnl0ZVtdPiByYXdNZXNzYWdlM01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICBwcml2YXRlIGZpbmFsIEhhbmRzaGFrZUNpcGhlciBoYW5kc2hha2VDaXBoZXI7CisgIHByaXZhdGUgZmluYWwgSGFuZHNoYWtlUm9sZSBoYW5kc2hha2VSb2xlOworICBwcml2YXRlIEludGVybmFsU3RhdGUgaGFuZHNoYWtlU3RhdGU7CisgIHByaXZhdGUgZmluYWwgS2V5UGFpciBvdXJLZXlQYWlyOworICBwcml2YXRlIFB1YmxpY0tleSB0aGVpclB1YmxpY0tleTsKKyAgcHJpdmF0ZSBTZWNyZXRLZXkgZGVyaXZlZFNlY3JldEtleTsKKworICAvLyBTZXJ2ZXJzIG5lZWQgdG8gc3RvcmUgY2xpZW50IGNvbW1pdG1lbnRzLgorICBwcml2YXRlIGJ5dGVbXSB0aGVpckNvbW1pdG1lbnQ7CisKKyAgLy8gV2Ugc3RvcmUgdGhlIHJhdyBtZXNzYWdlcyBzZW50IGZvciBjb21wdXRpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIHN0cmluZ3MgYW5kIG5leHQga2V5LgorICBwcml2YXRlIGJ5dGVbXSByYXdNZXNzYWdlMTsKKyAgcHJpdmF0ZSBieXRlW10gcmF3TWVzc2FnZTI7CisKKyAgLy8gRW51bXMgZm9yIGludGVybmFsIHN0YXRlIG1hY2hpbmVyeQorICBwcml2YXRlIGVudW0gSW50ZXJuYWxTdGF0ZSB7CisgICAgLy8gSW5pdGlhdG9yL2NsaWVudCBzdGF0ZQorICAgIENMSUVOVF9TVEFSVCwKKyAgICBDTElFTlRfV0FJVElOR19GT1JfU0VSVkVSX0lOSVQsCisgICAgQ0xJRU5UX0FGVEVSX1NFUlZFUl9JTklULAorCisgICAgLy8gUmVzcG9uZGVyL3NlcnZlciBzdGF0ZQorICAgIFNFUlZFUl9TVEFSVCwKKyAgICBTRVJWRVJfQUZURVJfQ0xJRU5UX0lOSVQsCisgICAgU0VSVkVSX1dBSVRJTkdfRk9SX0NMSUVOVF9GSU5JU0hFRCwKKworICAgIC8vIENvbW1vbiBjb21wbGV0aW9uIHN0YXRlCisgICAgSEFORFNIQUtFX1ZFUklGSUNBVElPTl9ORUVERUQsCisgICAgSEFORFNIQUtFX1ZFUklGSUNBVElPTl9JTl9QUk9HUkVTUywKKyAgICBIQU5EU0hBS0VfRklOSVNIRUQsCisgICAgSEFORFNIQUtFX0FMUkVBRFlfVVNFRCwKKyAgICBIQU5EU0hBS0VfRVJST1IsCisgIH0KKworICAvLyBIZWxwcyB1cyByZW1lbWJlciBvdXIgcm9sZSBpbiB0aGUgaGFuZHNoYWtlCisgIHByaXZhdGUgZW51bSBIYW5kc2hha2VSb2xlIHsKKyAgICBDTElFTlQsCisgICAgU0VSVkVSCisgIH0KKworICAvKioKKyAgICogTmV2ZXIgaW52b2tlZCBkaXJlY3RseS4gQ2FsbGVyIHNob3VsZCB1c2Uge0BsaW5rICNmb3JJbml0aWF0b3IoSGFuZHNoYWtlQ2lwaGVyKX0gb3IKKyAgICoge0BsaW5rICNmb3JSZXNwb25kZXIoSGFuZHNoYWtlQ2lwaGVyKX0gaW5zdGVhZC4KKyAgICoKKyAgICogQHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24gaWYgYW4gdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnMgYW5kIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBzaHV0CisgICAqIGRvd24uCisgICAqLworICBwcml2YXRlIFVrZXkySGFuZHNoYWtlKEludGVybmFsU3RhdGUgc3RhdGUsIEhhbmRzaGFrZUNpcGhlciBjaXBoZXIpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIGlmIChjaXBoZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgaGFuZHNoYWtlIGNpcGhlciIpOworICAgIH0KKyAgICB0aGlzLmhhbmRzaGFrZUNpcGhlciA9IGNpcGhlcjsKKworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgIGNhc2UgQ0xJRU5UX1NUQVJUOgorICAgICAgICBoYW5kc2hha2VSb2xlID0gSGFuZHNoYWtlUm9sZS5DTElFTlQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRVJWRVJfU1RBUlQ6CisgICAgICAgIGhhbmRzaGFrZVJvbGUgPSBIYW5kc2hha2VSb2xlLlNFUlZFUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBoYW5kc2hha2Ugc3RhdGUiKTsKKyAgICAgICAgaGFuZHNoYWtlUm9sZSA9IG51bGw7IC8vIHVucmVhY2hhYmxlLCBidXQgbWFrZXMgY29tcGlsZXIgaGFwcHkKKyAgICB9CisgICAgdGhpcy5oYW5kc2hha2VTdGF0ZSA9IHN0YXRlOworCisgICAgdGhpcy5vdXJLZXlQYWlyID0gZ2VuS2V5UGFpcihjaXBoZXIpOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbmV4dCBoYW5kc2hha2UgbWVzc2FnZSBzdWl0YWJsZSBmb3Igc2VuZGluZyBvbiB0aGUgd2lyZS4KKyAgICoKKyAgICogQHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24gaWYgYW4gdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnMgYW5kIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBzaHV0CisgICAqIGRvd24uCisgICAqLworICBwdWJsaWMgYnl0ZVtdIGdldE5leHRIYW5kc2hha2VNZXNzYWdlKCkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgc3dpdGNoIChoYW5kc2hha2VTdGF0ZSkgeworICAgICAgY2FzZSBDTElFTlRfU1RBUlQ6CisgICAgICAgIHJhd01lc3NhZ2UxID0gbWFrZVVrZXkyTWVzc2FnZShVa2V5Mk1lc3NhZ2UuVHlwZS5DTElFTlRfSU5JVCwgbWFrZUNsaWVudEluaXRNZXNzYWdlKCkpOworICAgICAgICBoYW5kc2hha2VTdGF0ZSA9IEludGVybmFsU3RhdGUuQ0xJRU5UX1dBSVRJTkdfRk9SX1NFUlZFUl9JTklUOworICAgICAgICByZXR1cm4gcmF3TWVzc2FnZTE7CisKKyAgICAgIGNhc2UgU0VSVkVSX0FGVEVSX0NMSUVOVF9JTklUOgorICAgICAgICByYXdNZXNzYWdlMiA9IG1ha2VVa2V5Mk1lc3NhZ2UoVWtleTJNZXNzYWdlLlR5cGUuU0VSVkVSX0lOSVQsIG1ha2VTZXJ2ZXJJbml0TWVzc2FnZSgpKTsKKyAgICAgICAgaGFuZHNoYWtlU3RhdGUgPSBJbnRlcm5hbFN0YXRlLlNFUlZFUl9XQUlUSU5HX0ZPUl9DTElFTlRfRklOSVNIRUQ7CisgICAgICAgIHJldHVybiByYXdNZXNzYWdlMjsKKworICAgICAgY2FzZSBDTElFTlRfQUZURVJfU0VSVkVSX0lOSVQ6CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbWVzc2FnZSAzIGZvciB0aGUgY2hvc2VuIGNpcGhlci4KKyAgICAgICAgaWYgKCFyYXdNZXNzYWdlM01hcC5jb250YWluc0tleShoYW5kc2hha2VDaXBoZXIpKSB7CisgICAgICAgICAgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICJDbGllbnQgc3RhdGUgaXMgQ0xJRU5UX0FGVEVSX1NFUlZFUl9JTklULCBhbmQgY2lwaGVyIGlzICIKKyAgICAgICAgICAgICAgICAgICsgaGFuZHNoYWtlQ2lwaGVyCisgICAgICAgICAgICAgICAgICArICIsIGJ1dCBubyBjb3JyZXNwb25kaW5nIHJhdyBjbGllbnQgZmluaXNoZWQgbWVzc2FnZSBoYXMgYmVlbiBnZW5lcmF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kc2hha2VTdGF0ZSA9IEludGVybmFsU3RhdGUuSEFORFNIQUtFX1ZFUklGSUNBVElPTl9ORUVERUQ7CisgICAgICAgIHJldHVybiByYXdNZXNzYWdlM01hcC5nZXQoaGFuZHNoYWtlQ2lwaGVyKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBnZXQgbmV4dCBtZXNzYWdlIGluIHN0YXRlOiAiICsgaGFuZHNoYWtlU3RhdGUpOworICAgICAgICByZXR1cm4gbnVsbDsgLy8gdW5yZWFjaGFibGUsIGJ1dCBtYWtlcyBjb21waWxlciBoYXBweQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGF1dGhlbnRpY2F0aW9uIHN0cmluZyBzdWl0YWJsZSBmb3IgYXV0aGVudGljYXRpbmcgdGhlIGhhbmRzaGFrZSBvdXQtb2YtYmFuZC4gTm90ZQorICAgKiB0aGF0IHRoZSBhdXRoZW50aWNhdGlvbiBzdHJpbmcgY2FuIGJlIHNob3J0IChlLmcuLCBhIDYgZGlnaXQgdmlzdWFsIGNvbmZpcm1hdGlvbiBjb2RlKS4gTm90ZToKKyAgICogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgc3RhdGUgcmV0dXJuZWQgYnl0ZSB7QGxpbmsgI2dldEhhbmRzaGFrZVN0YXRlKCl9IGlzCisgICAqIHtAbGluayBTdGF0ZSNWRVJJRklDQVRJT05fTkVFREVEfSwgd2hpY2ggbWVhbnMgdGhpcyBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4KKyAgICoKKyAgICogQHBhcmFtIGJ5dGVMZW5ndGggbGVuZ3RoIG9mIG91dHB1dCBpbiBieXRlcy4gTWluIGxlbmd0aCBpcyAxOyBtYXggbGVuZ3RoIGlzIDMyLgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSBnZXRWZXJpZmljYXRpb25TdHJpbmcoaW50IGJ5dGVMZW5ndGgpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIGlmIChieXRlTGVuZ3RoIDwgMSB8fCBieXRlTGVuZ3RoID4gMzIpIHsKKyAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaW5pbXVtIGxlbmd0aCBpcyAxIGJ5dGUsIG1heCBpcyAzMiBieXRlcyIpOworICAgIH0KKworICAgIGlmIChoYW5kc2hha2VTdGF0ZSAhPSBJbnRlcm5hbFN0YXRlLkhBTkRTSEFLRV9WRVJJRklDQVRJT05fTkVFREVEKSB7CisgICAgICB0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdGF0ZTogIiArIGhhbmRzaGFrZVN0YXRlKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgZGVyaXZlZFNlY3JldEtleSA9CisgICAgICAgICAgRW5yb2xsbWVudENyeXB0b09wcy5kb0tleUFncmVlbWVudChvdXJLZXlQYWlyLmdldFByaXZhdGUoKSwgdGhlaXJQdWJsaWNLZXkpOworICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgLy8gdW5yZWFjaGFibGUgaW4gcHJhY3RpY2UKKyAgICAgIHRocm93SGFuZHNoYWtlRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIHRyeSB7CisgICAgICBieXRlU3RyZWFtLndyaXRlKHJhd01lc3NhZ2UxKTsKKyAgICAgIGJ5dGVTdHJlYW0ud3JpdGUocmF3TWVzc2FnZTIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHVucmVhY2hhYmxlIGluIHByYWN0aWNlCisgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgYnl0ZVtdIGluZm8gPSBieXRlU3RyZWFtLnRvQnl0ZUFycmF5KCk7CisKKyAgICBieXRlW10gc2FsdCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgc2FsdCA9ICJVS0VZMiB2MSBhdXRoIi5nZXRCeXRlcyhVVEZfOCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZQorICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgYnl0ZVtdIGF1dGhTdHJpbmcgPSBudWxsOworICAgIHRyeSB7CisgICAgICBhdXRoU3RyaW5nID0gQ3J5cHRvT3BzLmhrZGYoZGVyaXZlZFNlY3JldEtleSwgc2FsdCwgaW5mbyk7CisgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiB8IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZQorICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgaGFuZHNoYWtlU3RhdGUgPSBJbnRlcm5hbFN0YXRlLkhBTkRTSEFLRV9WRVJJRklDQVRJT05fSU5fUFJPR1JFU1M7CisgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YoYXV0aFN0cmluZywgYnl0ZUxlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogSW52b2tlZCB0byBsZXQgaGFuZHNoYWtlIHN0YXRlIG1hY2hpbmUga25vdyB0aGF0IGNhbGxlciBoYXMgdmFsaWRhdGVkIHRoZSBhdXRoZW50aWNhdGlvbgorICAgKiBzdHJpbmcgb2J0YWluZWQgdmlhIHtAbGluayAjZ2V0VmVyaWZpY2F0aW9uU3RyaW5nKGludCl9OyBOb3RlOiB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCisgICAqIHRoZSBzdGF0ZSByZXR1cm5lZCBieXRlIHtAbGluayAjZ2V0SGFuZHNoYWtlU3RhdGUoKX0gaXMge0BsaW5rIFN0YXRlI1ZFUklGSUNBVElPTl9JTl9QUk9HUkVTU30uCisgICAqLworICBwdWJsaWMgdm9pZCB2ZXJpZnlIYW5kc2hha2UoKSB7CisgICAgaWYgKGhhbmRzaGFrZVN0YXRlICE9IEludGVybmFsU3RhdGUuSEFORFNIQUtFX1ZFUklGSUNBVElPTl9JTl9QUk9HUkVTUykgeworICAgICAgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3RhdGU6ICIgKyBoYW5kc2hha2VTdGF0ZSk7CisgICAgfQorICAgIGhhbmRzaGFrZVN0YXRlID0gSW50ZXJuYWxTdGF0ZS5IQU5EU0hBS0VfRklOSVNIRUQ7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIHRoZSBnaXZlbiBoYW5kc2hha2UgbWVzc2FnZS4KKyAgICogQHRocm93cyBBbGVydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdGhhdCBzaG91bGQgYmUgc2VudCB0byBvdGhlciBwYXJ0eS4KKyAgICogQHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24gaW4gYW4gZXJyb3Igb2NjdXJzIGFuZCB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgdG9ybiBkb3duLgorICAgKi8KKyAgcHVibGljIHZvaWQgcGFyc2VIYW5kc2hha2VNZXNzYWdlKGJ5dGVbXSBoYW5kc2hha2VNZXNzYWdlKQorICAgICAgdGhyb3dzIEFsZXJ0RXhjZXB0aW9uLCBIYW5kc2hha2VFeGNlcHRpb24geworICAgIHN3aXRjaCAoaGFuZHNoYWtlU3RhdGUpIHsKKyAgICAgIGNhc2UgU0VSVkVSX1NUQVJUOgorICAgICAgICBwYXJzZU1lc3NhZ2UxKGhhbmRzaGFrZU1lc3NhZ2UpOworICAgICAgICBoYW5kc2hha2VTdGF0ZSA9IEludGVybmFsU3RhdGUuU0VSVkVSX0FGVEVSX0NMSUVOVF9JTklUOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDTElFTlRfV0FJVElOR19GT1JfU0VSVkVSX0lOSVQ6CisgICAgICAgIHBhcnNlTWVzc2FnZTIoaGFuZHNoYWtlTWVzc2FnZSk7CisgICAgICAgIGhhbmRzaGFrZVN0YXRlID0gSW50ZXJuYWxTdGF0ZS5DTElFTlRfQUZURVJfU0VSVkVSX0lOSVQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNFUlZFUl9XQUlUSU5HX0ZPUl9DTElFTlRfRklOSVNIRUQ6CisgICAgICAgIHBhcnNlTWVzc2FnZTMoaGFuZHNoYWtlTWVzc2FnZSk7CisgICAgICAgIGhhbmRzaGFrZVN0YXRlID0gSW50ZXJuYWxTdGF0ZS5IQU5EU0hBS0VfVkVSSUZJQ0FUSU9OX05FRURFRDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgcGFyc2UgbWVzc2FnZSBpbiBzdGF0ZSAiICsgaGFuZHNoYWtlU3RhdGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBoYW5kc2hha2UuIFNlZSB7QGxpbmsgU3RhdGV9LgorICAgKi8KKyAgcHVibGljIFN0YXRlIGdldEhhbmRzaGFrZVN0YXRlKCkgeworICAgIHN3aXRjaCAoaGFuZHNoYWtlU3RhdGUpIHsKKyAgICAgIGNhc2UgQ0xJRU5UX1NUQVJUOgorICAgICAgY2FzZSBDTElFTlRfV0FJVElOR19GT1JfU0VSVkVSX0lOSVQ6CisgICAgICBjYXNlIENMSUVOVF9BRlRFUl9TRVJWRVJfSU5JVDoKKyAgICAgIGNhc2UgU0VSVkVSX1NUQVJUOgorICAgICAgY2FzZSBTRVJWRVJfV0FJVElOR19GT1JfQ0xJRU5UX0ZJTklTSEVEOgorICAgICAgY2FzZSBTRVJWRVJfQUZURVJfQ0xJRU5UX0lOSVQ6CisgICAgICAgIC8vIGZhbGxiYWNrIGludGVuZGVkIC0tIHRoZXNlIGFyZSBhbGwgaW4tcHJvZ3Jlc3Mgc3RhdGVzCisgICAgICAgIHJldHVybiBTdGF0ZS5JTl9QUk9HUkVTUzsKKworICAgICAgY2FzZSBIQU5EU0hBS0VfRVJST1I6CisgICAgICAgIHJldHVybiBTdGF0ZS5FUlJPUjsKKworICAgICAgY2FzZSBIQU5EU0hBS0VfVkVSSUZJQ0FUSU9OX05FRURFRDoKKyAgICAgICAgcmV0dXJuIFN0YXRlLlZFUklGSUNBVElPTl9ORUVERUQ7CisKKyAgICAgIGNhc2UgSEFORFNIQUtFX1ZFUklGSUNBVElPTl9JTl9QUk9HUkVTUzoKKyAgICAgICAgcmV0dXJuIFN0YXRlLlZFUklGSUNBVElPTl9JTl9QUk9HUkVTUzsKKworICAgICAgY2FzZSBIQU5EU0hBS0VfRklOSVNIRUQ6CisgICAgICAgIHJldHVybiBTdGF0ZS5GSU5JU0hFRDsKKworICAgICAgY2FzZSBIQU5EU0hBS0VfQUxSRUFEWV9VU0VEOgorICAgICAgICByZXR1cm4gU3RhdGUuQUxSRUFEWV9VU0VEOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZQorICAgICAgICB0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biBzdGF0ZSIpOworICAgICAgICByZXR1cm4gbnVsbDsgLy8gcmVhbGx5IHVucmVhY2hhYmxlLCBidXQgbWFrZXMgY29tcGlsZXIgaGFwcHkKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2FuIGJlIGNhbGxlZCB0byBnZW5lcmF0ZSBhIHtAbGluayBEMkRDb25uZWN0aW9uQ29udGV4dH0uIE5vdGU6IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAqIHdoZW4gdGhlIHN0YXRlIHJldHVybmVkIGJ5dGUge0BsaW5rICNnZXRIYW5kc2hha2VTdGF0ZSgpfSBpcyB7QGxpbmsgU3RhdGUjRklOSVNIRUR9LgorICAgKgorICAgKiBAdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIEQyRENvbm5lY3Rpb25Db250ZXh0IHRvQ29ubmVjdGlvbkNvbnRleHQoKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKGhhbmRzaGFrZVN0YXRlKSB7CisgICAgICBjYXNlIEhBTkRTSEFLRV9FUlJPUjoKKyAgICAgICAgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBtYWtlIGNvbnRleHQ7IGhhbmRzaGFrZSBoYWQgZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIG1ha2VzIGxpbnRlciBoYXBweQorICAgICAgY2FzZSBIQU5EU0hBS0VfQUxSRUFEWV9VU0VEOgorICAgICAgICB0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHJldXNlIGhhbmRzaGFrZSBjb250ZXh0OyBpcyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIG1ha2VzIGxpbnRlciBoYXBweQorICAgICAgY2FzZSBIQU5EU0hBS0VfVkVSSUZJQ0FUSU9OX05FRURFRDoKKyAgICAgICAgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkhhbmRzaGFrZSBub3QgdmVyaWZpZWQsIGNhbm5vdCBjcmVhdGUgY29udGV4dCIpOworICAgICAgICByZXR1cm4gbnVsbDsgLy8gbWFrZXMgbGludGVyIGhhcHB5CisgICAgICBjYXNlIEhBTkRTSEFLRV9GSU5JU0hFRDoKKyAgICAgICAgLy8gV2UncmUgZG9uZSwgb2theSB0byByZXR1cm4gYSBjb250ZXh0CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gdW5yZWFjaGFibGUgaW4gcHJhY3RpY2UKKyAgICAgICAgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkhhbmRzaGFrZSBpcyBub3QgY29tcGxldGU7IGNhbm5vdCBjcmVhdGUgY29ubmVjdGlvbiBjb250ZXh0Iik7CisgICAgfQorCisgICAgaWYgKGRlcml2ZWRTZWNyZXRLZXkgPT0gbnVsbCkgeworICAgICAgdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3RhdGUgZXJyb3I6IGRlcml2ZWQga2V5IGlzIG51bGwiKTsKKyAgICB9CisKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICB0cnkgeworICAgICAgYnl0ZVN0cmVhbS53cml0ZShyYXdNZXNzYWdlMSk7CisgICAgICBieXRlU3RyZWFtLndyaXRlKHJhd01lc3NhZ2UyKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZQorICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oZSk7CisgICAgfQorICAgIGJ5dGVbXSBpbmZvID0gYnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpOworCisgICAgYnl0ZVtdIHNhbHQgPSBudWxsOworICAgIHRyeSB7CisgICAgICBzYWx0ID0gIlVLRVkyIHYxIG5leHQiLmdldEJ5dGVzKFVURl84KTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHVucmVhY2hhYmxlCisgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBTZWNyZXRLZXkgbmV4dFByb3RvY29sS2V5ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgbmV4dFByb3RvY29sS2V5ID0gbmV3IFNlY3JldEtleVNwZWMoQ3J5cHRvT3BzLmhrZGYoZGVyaXZlZFNlY3JldEtleSwgc2FsdCwgaW5mbyksICJBRVMiKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIHwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHVucmVhY2hhYmxlIGluIHByYWN0aWNlCisgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBTZWNyZXRLZXkgY2xpZW50S2V5ID0gbnVsbDsKKyAgICBTZWNyZXRLZXkgc2VydmVyS2V5ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgY2xpZW50S2V5ID0gRDJEQ3J5cHRvT3BzLmRlcml2ZU5ld0tleUZvclB1cnBvc2UobmV4dFByb3RvY29sS2V5LCAiY2xpZW50Iik7CisgICAgICBzZXJ2ZXJLZXkgPSBEMkRDcnlwdG9PcHMuZGVyaXZlTmV3S2V5Rm9yUHVycG9zZShuZXh0UHJvdG9jb2xLZXksICJzZXJ2ZXIiKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIHwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHVucmVhY2hhYmxlIGluIHByYWN0aWNlCisgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBoYW5kc2hha2VTdGF0ZSA9IEludGVybmFsU3RhdGUuSEFORFNIQUtFX0FMUkVBRFlfVVNFRDsKKworICAgIHJldHVybiBuZXcgRDJEQ29ubmVjdGlvbkNvbnRleHRWMSgKKyAgICAgICAgaGFuZHNoYWtlUm9sZSA9PSBIYW5kc2hha2VSb2xlLkNMSUVOVCA/IGNsaWVudEtleSA6IHNlcnZlcktleSwKKyAgICAgICAgaGFuZHNoYWtlUm9sZSA9PSBIYW5kc2hha2VSb2xlLkNMSUVOVCA/IHNlcnZlcktleSA6IGNsaWVudEtleSwKKyAgICAgICAgMCAvKiBpbml0aWFsIGVuY29kZSBzZXF1ZW5jZSBudW1iZXIgKi8sCisgICAgICAgIDAgLyogaW5pdGlhbCBkZWNvZGUgc2VxdWVuY2UgbnVtYmVyICovKTsKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmF0ZXMgdGhlIGJ5dGVbXSBlbmNvZGluZyBvZiBhIHtAbGluayBVa2V5MkNsaWVudEluaXR9IG1lc3NhZ2UuCisgICAqCisgICAqIEB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uCisgICAqLworICBwcml2YXRlIGJ5dGVbXSBtYWtlQ2xpZW50SW5pdE1lc3NhZ2UoKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBVa2V5MkNsaWVudEluaXQuQnVpbGRlciBjbGllbnRJbml0ID0gVWtleTJDbGllbnRJbml0Lm5ld0J1aWxkZXIoKTsKKyAgICBjbGllbnRJbml0LnNldFZlcnNpb24oVkVSU0lPTik7CisgICAgY2xpZW50SW5pdC5zZXRSYW5kb20oQnl0ZVN0cmluZy5jb3B5RnJvbShnZW5lcmF0ZVJhbmRvbU5vbmNlKCkpKTsKKyAgICBjbGllbnRJbml0LnNldE5leHRQcm90b2NvbChORVhUX1BST1RPQ09MKTsKKworICAgIC8vIEF0IHRoZSBtb21lbnQsIHdlIG9ubHkgc3VwcG9ydCBvbmUgY2lwaGVyCisgICAgY2xpZW50SW5pdC5hZGRDaXBoZXJDb21taXRtZW50cyhnZW5lcmF0ZVAyNTZTSEE1MTJDb21taXRtZW50KCkpOworCisgICAgcmV0dXJuIGNsaWVudEluaXQuYnVpbGQoKS50b0J5dGVBcnJheSgpOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyB0aGUgYnl0ZVtdIGVuY29kaW5nIG9mIGEge0BsaW5rIFVrZXkyU2VydmVySW5pdH0gbWVzc2FnZS4KKyAgICovCisgIHByaXZhdGUgYnl0ZVtdIG1ha2VTZXJ2ZXJJbml0TWVzc2FnZSgpIHsKKyAgICBVa2V5MlNlcnZlckluaXQuQnVpbGRlciBzZXJ2ZXJJbml0ID0gVWtleTJTZXJ2ZXJJbml0Lm5ld0J1aWxkZXIoKTsKKyAgICBzZXJ2ZXJJbml0LnNldFZlcnNpb24oVkVSU0lPTik7CisgICAgc2VydmVySW5pdC5zZXRSYW5kb20oQnl0ZVN0cmluZy5jb3B5RnJvbShnZW5lcmF0ZVJhbmRvbU5vbmNlKCkpKTsKKyAgICBzZXJ2ZXJJbml0LnNldEhhbmRzaGFrZUNpcGhlcihoYW5kc2hha2VDaXBoZXIuZ2V0VmFsdWUoKSk7CisgICAgc2VydmVySW5pdC5zZXRQdWJsaWNLZXkoCisgICAgICAgIFB1YmxpY0tleVByb3RvVXRpbC5lbmNvZGVQdWJsaWNLZXkob3VyS2V5UGFpci5nZXRQdWJsaWMoKSkudG9CeXRlU3RyaW5nKCkpOworCisgICAgcmV0dXJuIHNlcnZlckluaXQuYnVpbGQoKS50b0J5dGVBcnJheSgpOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhIGtleXBhaXIgZm9yIHRoZSBwcm92aWRlZCBoYW5kc2hha2UgY2lwaGVyLiBDdXJyZW50bHkgb25seSBQMjU2X1NIQTUxMiBpcworICAgKiBzdXBwb3J0ZWQuCisgICAqCisgICAqIEB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uCisgICAqLworICBwcml2YXRlIEtleVBhaXIgZ2VuS2V5UGFpcihIYW5kc2hha2VDaXBoZXIgY2lwaGVyKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKGNpcGhlcikgeworICAgICAgY2FzZSBQMjU2X1NIQTUxMjoKKyAgICAgICAgcmV0dXJuIFB1YmxpY0tleVByb3RvVXRpbC5nZW5lcmF0ZUVjUDI1NktleVBhaXIoKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oInVua25vd24gY2lwaGVyOiAiICsgY2lwaGVyKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7IC8vIHVucmVhY2hhYmxlLCBidXQgbWFrZXMgY29tcGlsZXIgaGFwcHkKKyAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0cyB0byBwYXJzZSBtZXNzYWdlIDEgKHdoaWNoIGlzIGEgd3JhcHBlZCB7QGxpbmsgVWtleTJDbGllbnRJbml0fSkuIFNlZSBnby91a2V5MiBmb3IKKyAgICogZGV0YWlscy4KKyAgICoKKyAgICogQHRocm93cyBBbGVydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHByaXZhdGUgdm9pZCBwYXJzZU1lc3NhZ2UxKGJ5dGVbXSBoYW5kc2hha2VNZXNzYWdlKSB0aHJvd3MgQWxlcnRFeGNlcHRpb24sIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgLy8gRGVzZXJpYWxpemUgdGhlIHByb3RvYnVmOyBzZW5kIGEgQkFEX01FU1NBR0UgbWVzc2FnZSBpZiBkZXNlcmlhbGl6YXRpb24gZmFpbHMKKyAgICBVa2V5Mk1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIG1lc3NhZ2UgPSBVa2V5Mk1lc3NhZ2UucGFyc2VGcm9tKGhhbmRzaGFrZU1lc3NhZ2UpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9NRVNTQUdFLAorICAgICAgICAgICJDYW4ndCBwYXJzZSBtZXNzYWdlIDEgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgdGhhdCBtZXNzYWdlX3R5cGUgPT0gVHlwZS5DTElFTlRfSU5JVDsgc2VuZCBhIEJBRF9NRVNTQUdFX1RZUEUgbWVzc2FnZSBpZiBtaXNtYXRjaAorICAgIGlmICghbWVzc2FnZS5oYXNNZXNzYWdlVHlwZSgpIHx8IG1lc3NhZ2UuZ2V0TWVzc2FnZVR5cGUoKSAhPSBVa2V5Mk1lc3NhZ2UuVHlwZS5DTElFTlRfSU5JVCkgeworICAgICAgdGhyb3dBbGVydEV4Y2VwdGlvbigKKyAgICAgICAgICBVa2V5MkFsZXJ0LkFsZXJ0VHlwZS5CQURfTUVTU0FHRV9UWVBFLAorICAgICAgICAgICJFeHBlY3RlZCwgYnV0IGRpZCBub3QgZmluZCBDbGllbnRJbml0IG1lc3NhZ2UgdHlwZSIpOworICAgIH0KKworICAgIC8vIERlc2VyaWFsaXplIG1lc3NhZ2VfZGF0YSBhcyBhIENsaWVudEluaXQgbWVzc2FnZTsgc2VuZCBhIEJBRF9NRVNTQUdFX0RBVEEgbWVzc2FnZSBpZgorICAgIC8vIGRlc2VyaWFsaXphdGlvbiBmYWlscworICAgIGlmICghbWVzc2FnZS5oYXNNZXNzYWdlRGF0YSgpKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9NRVNTQUdFX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIG1lc3NhZ2UgZGF0YSwgYnV0IGRpZG4ndCBmaW5kIGl0Iik7CisgICAgfQorICAgIFVrZXkyQ2xpZW50SW5pdCBjbGllbnRJbml0ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgY2xpZW50SW5pdCA9IFVrZXkyQ2xpZW50SW5pdC5wYXJzZUZyb20obWVzc2FnZS5nZXRNZXNzYWdlRGF0YSgpKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3dBbGVydEV4Y2VwdGlvbihVa2V5MkFsZXJ0LkFsZXJ0VHlwZS5CQURfTUVTU0FHRV9EQVRBLAorICAgICAgICAgICJDYW4ndCBwYXJzZSBtZXNzYWdlIGRhdGEgaW50byBDbGllbnRJbml0Iik7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB2ZXJzaW9uID09IFZFUlNJT047IHNlbmQgQkFEX1ZFUlNJT04gbWVzc2FnZSBpZiBtaXNtYXRjaAorICAgIGlmICghY2xpZW50SW5pdC5oYXNWZXJzaW9uKCkpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX1ZFUlNJT04sICJDbGllbnRJbml0IG1pc3NpbmcgdmVyc2lvbiIpOworICAgIH0KKyAgICBpZiAoY2xpZW50SW5pdC5nZXRWZXJzaW9uKCkgIT0gVkVSU0lPTikgeworICAgICAgdGhyb3dBbGVydEV4Y2VwdGlvbihVa2V5MkFsZXJ0LkFsZXJ0VHlwZS5CQURfVkVSU0lPTiwgIkNsaWVudEluaXQgdmVyc2lvbiBtaXNtYXRjaCIpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgcmFuZG9tIGlzIGV4YWN0bHkgTk9OQ0VfTEVOR1RIX0lOX0JZVEVTIGJ5dGVzOyBzZW5kIEFsZXJ0LkJBRF9SQU5ET00gbWVzc2FnZSBpZgorICAgIC8vIG5vdC4KKyAgICBpZiAoIWNsaWVudEluaXQuaGFzUmFuZG9tKCkpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX1JBTkRPTSwgIkNsaWVudEluaXQgbWlzc2luZyByYW5kb20iKTsKKyAgICB9CisgICAgaWYgKGNsaWVudEluaXQuZ2V0UmFuZG9tKCkudG9CeXRlQXJyYXkoKS5sZW5ndGggIT0gTk9OQ0VfTEVOR1RIX0lOX0JZVEVTKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9SQU5ET00sICJDbGllbnRJbml0IGhhcyBpbmNvcnJlY3Qgbm9uY2UgbGVuZ3RoIik7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBvZiB0aGUgaGFuZHNoYWtlX2NpcGhlciBpbiBjaXBoZXJfY29tbWl0bWVudCBhcmUgYWNjZXB0YWJsZS4gU2VydmVycworICAgIC8vIHNob3VsZCBzZWxlY3QgdGhlIGZpcnN0IGhhbmRzaGFrZV9jaXBoZXIgdGhhdCBpdCBmaW5kcyBhY2NlcHRhYmxlIHRvIHN1cHBvcnQgY2xpZW50cworICAgIC8vIHNpZ25hbGluZyBkZXByZWNhdGVkIGJ1dCBzdXBwb3J0ZWQgSGFuZHNoYWtlQ2lwaGVycy4gSWYgbm8gaGFuZHNoYWtlX2NpcGhlciBpcyBhY2NlcHRhYmxlCisgICAgLy8gKG9yIHRoZXJlIGFyZSBubyBIYW5kc2hha2VDaXBoZXJzIGluIHRoZSBtZXNzYWdlKSwgdGhlIHNlcnZlciBzZW5kcyBhIEJBRF9IQU5EU0hBS0VfQ0lQSEVSCisgICAgLy8gIG1lc3NhZ2UKKyAgICBMaXN0PFVrZXkyQ2xpZW50SW5pdC5DaXBoZXJDb21taXRtZW50PiBjb21taXRtZW50cyA9IGNsaWVudEluaXQuZ2V0Q2lwaGVyQ29tbWl0bWVudHNMaXN0KCk7CisgICAgaWYgKGNvbW1pdG1lbnRzLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3dBbGVydEV4Y2VwdGlvbigKKyAgICAgICAgICBVa2V5MkFsZXJ0LkFsZXJ0VHlwZS5CQURfSEFORFNIQUtFX0NJUEhFUiwgIkNsaWVudEluaXQgaXMgbWlzc2luZyBjaXBoZXIgY29tbWl0bWVudHMiKTsKKyAgICB9CisgICAgZm9yIChVa2V5MkNsaWVudEluaXQuQ2lwaGVyQ29tbWl0bWVudCBjb21taXRtZW50IDogY29tbWl0bWVudHMpIHsKKyAgICAgIGlmICghY29tbWl0bWVudC5oYXNIYW5kc2hha2VDaXBoZXIoKQorICAgICAgICAgIHx8ICFjb21taXRtZW50Lmhhc0NvbW1pdG1lbnQoKSkgeworICAgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKAorICAgICAgICAgICAgVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX0hBTkRTSEFLRV9DSVBIRVIsCisgICAgICAgICAgICAiQ2xpZW50SW5pdCBoYXMgaW1wcm9wZXJseSBmb3JtYXR0ZWQgY2lwaGVyIGNvbW1pdG1lbnQiKTsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETyhhY3plc2tpcyk6IGZvciBub3cgd2Ugb25seSBzdXBwb3J0IG9uZSBjaXBoZXIsIGV2ZW50dWFsbHkgc3VwcG9ydCBtb3JlCisgICAgICBpZiAoY29tbWl0bWVudC5nZXRIYW5kc2hha2VDaXBoZXIoKSA9PSBoYW5kc2hha2VDaXBoZXIuZ2V0VmFsdWUoKSkgeworICAgICAgICB0aGVpckNvbW1pdG1lbnQgPSBjb21taXRtZW50LmdldENvbW1pdG1lbnQoKS50b0J5dGVBcnJheSgpOworICAgICAgfQorICAgIH0KKyAgICBpZiAodGhlaXJDb21taXRtZW50ID09IG51bGwpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX0hBTkRTSEFLRV9DSVBIRVIsCisgICAgICAgICAgIk5vIGFjY2VwdGFibGUgY29tbWl0bWVudHMgZm91bmQiKTsKKyAgICB9CisKKyAgICAvLyBDaGVja3MgdGhhdCBuZXh0X3Byb3RvY29sIGNvbnRhaW5zIGEgcHJvdG9jb2wgdGhhdCB0aGUgc2VydmVyIHN1cHBvcnRzLiBTZW5kIGEKKyAgICAvLyBCQURfTkVYVF9QUk9UT0NPTCBtZXNzYWdlIGlmIG5vdC4gV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBvbmUgcHJvdG9jb2wKKyAgICBpZiAoIWNsaWVudEluaXQuaGFzTmV4dFByb3RvY29sKCkgfHwgIU5FWFRfUFJPVE9DT0wuZXF1YWxzKGNsaWVudEluaXQuZ2V0TmV4dFByb3RvY29sKCkpKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9ORVhUX1BST1RPQ09MLCAiSW5jb3JyZWN0IG5leHQgcHJvdG9jb2wiKTsKKyAgICB9CisKKyAgICAvLyBTdG9yZSByYXcgbWVzc2FnZSBmb3IgQVVUSF9TVFJJTkcgY29tcHV0YXRpb24KKyAgICByYXdNZXNzYWdlMSA9IGhhbmRzaGFrZU1lc3NhZ2U7CisgIH0KKworICAvKioKKyAgICogQXR0ZW1wdHMgdG8gcGFyc2UgbWVzc2FnZSAyICh3aGljaCBpcyBhIHdyYXBwZWQge0BsaW5rIFVrZXkyU2VydmVySW5pdH0pLiBTZWUgZ28vdWtleTIgZm9yCisgICAqIGRldGFpbHMuCisgICAqLworICBwcml2YXRlIHZvaWQgcGFyc2VNZXNzYWdlMihmaW5hbCBieXRlW10gaGFuZHNoYWtlTWVzc2FnZSkKKyAgICAgIHRocm93cyBBbGVydEV4Y2VwdGlvbiwgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgcHJvdG9idWY7IHNlbmQgYSBCQURfTUVTU0FHRSBtZXNzYWdlIGlmIGRlc2VyaWFsaXphdGlvbiBmYWlscworICAgIFVrZXkyTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgbWVzc2FnZSA9IFVrZXkyTWVzc2FnZS5wYXJzZUZyb20oaGFuZHNoYWtlTWVzc2FnZSk7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX01FU1NBR0UsCisgICAgICAgICAgIkNhbid0IHBhcnNlIG1lc3NhZ2UgMiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIC8vIFZlcmlmeSB0aGF0IG1lc3NhZ2VfdHlwZSA9PSBUeXBlLlNFUlZFUl9JTklUOyBzZW5kIGEgQkFEX01FU1NBR0VfVFlQRSBtZXNzYWdlIGlmIG1pc21hdGNoCisgICAgaWYgKCFtZXNzYWdlLmhhc01lc3NhZ2VUeXBlKCkpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX01FU1NBR0VfVFlQRSwKKyAgICAgICAgICAiRXhwZWN0ZWQsIGJ1dCBkaWQgbm90IGZpbmQgbWVzc2FnZSB0eXBlIik7CisgICAgfQorICAgIGlmIChtZXNzYWdlLmdldE1lc3NhZ2VUeXBlKCkgPT0gVWtleTJNZXNzYWdlLlR5cGUuQUxFUlQpIHsKKyAgICAgIGhhbmRzaGFrZVN0YXRlID0gSW50ZXJuYWxTdGF0ZS5IQU5EU0hBS0VfRVJST1I7CisgICAgICB0aHJvd0hhbmRzaGFrZU1lc3NhZ2VGcm9tQWxlcnRNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0KKyAgICBpZiAobWVzc2FnZS5nZXRNZXNzYWdlVHlwZSgpICE9IFVrZXkyTWVzc2FnZS5UeXBlLlNFUlZFUl9JTklUKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKAorICAgICAgICAgIFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgIkV4cGVjdGVkLCBidXQgZGlkIG5vdCBmaW5kIFNFUlZFUl9JTklUIG1lc3NhZ2UgdHlwZSIpOworICAgIH0KKworICAgIC8vIERlc2VyaWFsaXplIG1lc3NhZ2VfZGF0YSBhcyBhIFNlcnZlckluaXQgbWVzc2FnZTsgc2VuZCBhIEJBRF9NRVNTQUdFX0RBVEEgbWVzc2FnZSBpZgorICAgIC8vIGRlc2VyaWFsaXphdGlvbiBmYWlscworICAgIGlmICghbWVzc2FnZS5oYXNNZXNzYWdlRGF0YSgpKSB7CisKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX01FU1NBR0VfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgbWVzc2FnZSBkYXRhLCBidXQgZGlkbid0IGZpbmQgaXQiKTsKKyAgICB9CisgICAgVWtleTJTZXJ2ZXJJbml0IHNlcnZlckluaXQgPSBudWxsOworICAgIHRyeSB7CisgICAgICBzZXJ2ZXJJbml0ID0gVWtleTJTZXJ2ZXJJbml0LnBhcnNlRnJvbShtZXNzYWdlLmdldE1lc3NhZ2VEYXRhKCkpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9NRVNTQUdFX0RBVEEsCisgICAgICAgICAgIkNhbid0IHBhcnNlIG1lc3NhZ2UgZGF0YSBpbnRvIFNlcnZlckluaXQiKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHZlcnNpb24gPT0gVkVSU0lPTjsgc2VuZCBCQURfVkVSU0lPTiBtZXNzYWdlIGlmIG1pc21hdGNoCisgICAgaWYgKCFzZXJ2ZXJJbml0Lmhhc1ZlcnNpb24oKSkgeworICAgICAgdGhyb3dBbGVydEV4Y2VwdGlvbihVa2V5MkFsZXJ0LkFsZXJ0VHlwZS5CQURfVkVSU0lPTiwgIlNlcnZlckluaXQgbWlzc2luZyB2ZXJzaW9uIik7CisgICAgfQorICAgIGlmIChzZXJ2ZXJJbml0LmdldFZlcnNpb24oKSAhPSBWRVJTSU9OKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9WRVJTSU9OLCAiU2VydmVySW5pdCB2ZXJzaW9uIG1pc21hdGNoIik7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCByYW5kb20gaXMgZXhhY3RseSBOT05DRV9MRU5HVEhfSU5fQllURVMgYnl0ZXM7IHNlbmQgQWxlcnQuQkFEX1JBTkRPTSBtZXNzYWdlIGlmCisgICAgLy8gbm90LgorICAgIGlmICghc2VydmVySW5pdC5oYXNSYW5kb20oKSkgeworICAgICAgdGhyb3dBbGVydEV4Y2VwdGlvbihVa2V5MkFsZXJ0LkFsZXJ0VHlwZS5CQURfUkFORE9NLCAiU2VydmVySW5pdCBtaXNzaW5nIHJhbmRvbSIpOworICAgIH0KKyAgICBpZiAoc2VydmVySW5pdC5nZXRSYW5kb20oKS50b0J5dGVBcnJheSgpLmxlbmd0aCAhPSBOT05DRV9MRU5HVEhfSU5fQllURVMpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX1JBTkRPTSwgIlNlcnZlckluaXQgaGFzIGluY29ycmVjdCBub25jZSBsZW5ndGgiKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IGhhbmRzaGFrZV9jaXBoZXIgbWF0Y2hlcyBhIGhhbmRzaGFrZSBjaXBoZXIgdGhhdCB3YXMgc2VudCBpbgorICAgIC8vIENsaWVudEluaXQuY2lwaGVyX2NvbW1pdG1lbnRzLiBJZiBub3QsIHNlbmQgYSBCQURfSEFORFNIQUtFQ0lQSEVSIG1lc3NhZ2UKKyAgICBpZiAoIXNlcnZlckluaXQuaGFzSGFuZHNoYWtlQ2lwaGVyKCkpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX0hBTkRTSEFLRV9DSVBIRVIsICJObyBoYW5kc2hha2UgY2lwaGVyIGZvdW5kIik7CisgICAgfQorICAgIEhhbmRzaGFrZUNpcGhlciBzZXJ2ZXJDaXBoZXIgPSBudWxsOworICAgIGZvciAoSGFuZHNoYWtlQ2lwaGVyIGNpcGhlciA6IEhhbmRzaGFrZUNpcGhlci52YWx1ZXMoKSkgeworICAgICAgaWYgKGNpcGhlci5nZXRWYWx1ZSgpID09IHNlcnZlckluaXQuZ2V0SGFuZHNoYWtlQ2lwaGVyKCkpIHsKKyAgICAgICAgc2VydmVyQ2lwaGVyID0gY2lwaGVyOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNlcnZlckNpcGhlciA9PSBudWxsIHx8IHNlcnZlckNpcGhlciAhPSBoYW5kc2hha2VDaXBoZXIpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX0hBTkRTSEFLRV9DSVBIRVIsCisgICAgICAgICAgIk5vIGFjY2VwdGFibGUgaGFuZHNoYWtlIGNpcGhlciBmb3VuZCIpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgcHVibGljX2tleSBwYXJzZXMgaW50byBhIGNvcnJlY3QgcHVibGljIGtleSBzdHJ1Y3R1cmUuIElmIG5vdCwgc2VuZCBhCisgICAgLy8gQkFEX1BVQkxJQ19LRVkgbWVzc2FnZS4KKyAgICBpZiAoIXNlcnZlckluaXQuaGFzUHVibGljS2V5KCkpIHsKKyAgICAgIHRocm93QWxlcnRFeGNlcHRpb24oVWtleTJBbGVydC5BbGVydFR5cGUuQkFEX1BVQkxJQ19LRVksICJObyBwdWJsaWMga2V5IGZvdW5kIGluIFNlcnZlckluaXQiKTsKKyAgICB9CisgICAgdGhlaXJQdWJsaWNLZXkgPSBwYXJzZVAyNTZQdWJsaWNLZXkoc2VydmVySW5pdC5nZXRQdWJsaWNLZXkoKS50b0J5dGVBcnJheSgpKTsKKworICAgIC8vIFN0b3JlIHJhdyBtZXNzYWdlIGZvciBBVVRIX1NUUklORyBjb21wdXRhdGlvbgorICAgIHJhd01lc3NhZ2UyID0gaGFuZHNoYWtlTWVzc2FnZTsKKyAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0cyB0byBwYXJzZSBtZXNzYWdlIDMgKHdoaWNoIGlzIGEgd3JhcHBlZCB7QGxpbmsgVWtleTJDbGllbnRGaW5pc2hlZH0pLiBTZWUgZ28vdWtleTIgZm9yCisgICAqIGRldGFpbHMuCisgICAqLworICBwcml2YXRlIHZvaWQgcGFyc2VNZXNzYWdlMyhmaW5hbCBieXRlW10gaGFuZHNoYWtlTWVzc2FnZSkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgLy8gRGVzZXJpYWxpemUgdGhlIHByb3RvYnVmOyB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gaWYgZGVzZXJpYWxpemF0aW9uIGZhaWxzLgorICAgIFVrZXkyTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgbWVzc2FnZSA9IFVrZXkyTWVzc2FnZS5wYXJzZUZyb20oaGFuZHNoYWtlTWVzc2FnZSk7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93SGFuZHNoYWtlRXhjZXB0aW9uKCJDYW4ndCBwYXJzZSBtZXNzYWdlIDMiLCBlKTsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgdGhhdCBtZXNzYWdlX3R5cGUgPT0gVHlwZS5DTElFTlRfRklOSVNIOyB0ZXJtaW5hdGUgY29ubmVjdGlvbiBpZiBtaXNtYXRjaCBvY2N1cnMKKyAgICBpZiAoIW1lc3NhZ2UuaGFzTWVzc2FnZVR5cGUoKSkgeworICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigiRXhwZWN0ZWQsIGJ1dCBkaWQgbm90IGZpbmQgbWVzc2FnZSB0eXBlIik7CisgICAgfQorICAgIGlmIChtZXNzYWdlLmdldE1lc3NhZ2VUeXBlKCkgPT0gVWtleTJNZXNzYWdlLlR5cGUuQUxFUlQpIHsKKyAgICAgIHRocm93SGFuZHNoYWtlTWVzc2FnZUZyb21BbGVydE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfQorICAgIGlmIChtZXNzYWdlLmdldE1lc3NhZ2VUeXBlKCkgIT0gVWtleTJNZXNzYWdlLlR5cGUuQ0xJRU5UX0ZJTklTSCkgeworICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oIkV4cGVjdGVkLCBidXQgZGlkIG5vdCBmaW5kIENMSUVOVF9GSU5JU0ggbWVzc2FnZSB0eXBlIik7CisgICAgfQorCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGhhc2ggb2YgdGhlIENsaWVudEZpbmlzaGVkIG1hdGNoZXMgdGhlIGV4cGVjdGVkIGNvbW1pdG1lbnQgZnJvbSBDbGllbnRJbml0LgorICAgIC8vIFRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiBpZiB0aGUgZXhwZWN0ZWQgbWF0Y2ggZmFpbHMuCisgICAgdmVyaWZ5Q29tbWl0bWVudChoYW5kc2hha2VNZXNzYWdlKTsKKworICAgIC8vIERlc2VyaWFsaXplIG1lc3NhZ2VfZGF0YSBhcyBhIENsaWVudEZpbmlzaGVkIG1lc3NhZ2U7IHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiBpZgorICAgIC8vIGRlc2VyaWFsaXphdGlvbiBmYWlscy4KKyAgICBpZiAoIW1lc3NhZ2UuaGFzTWVzc2FnZURhdGEoKSkgeworICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oIkV4cGVjdGVkIG1lc3NhZ2UgZGF0YSwgYnV0IGRpZG4ndCBmaW5kIGl0Iik7CisgICAgfQorICAgIFVrZXkyQ2xpZW50RmluaXNoZWQgY2xpZW50RmluaXNoZWQgPSBudWxsOworICAgIHRyeSB7CisgICAgICBjbGllbnRGaW5pc2hlZCA9IFVrZXkyQ2xpZW50RmluaXNoZWQucGFyc2VGcm9tKG1lc3NhZ2UuZ2V0TWVzc2FnZURhdGEoKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93SGFuZHNoYWtlRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgcHVibGljX2tleSBwYXJzZXMgaW50byBhIGNvcnJlY3QgcHVibGljIGtleSBzdHJ1Y3R1cmUuIElmIG5vdCwgdGVybWluYXRlIHRoZQorICAgIC8vIGNvbm5lY3Rpb24uCisgICAgaWYgKCFjbGllbnRGaW5pc2hlZC5oYXNQdWJsaWNLZXkoKSkgeworICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oIk5vIHB1YmxpYyBrZXkgZm91bmQgaW4gQ2xpZW50RmluaXNoZWQiKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHRoZWlyUHVibGljS2V5ID0gcGFyc2VQMjU2UHVibGljS2V5KGNsaWVudEZpbmlzaGVkLmdldFB1YmxpY0tleSgpLnRvQnl0ZUFycmF5KCkpOworICAgIH0gY2F0Y2ggKEFsZXJ0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdyYXAgaW4gYSBIYW5kc2hha2VFeGNlcHRpb24gYmVjYXVzZSBlcnJvciBzaG91bGQgbm90IGJlIHNlbnQgb24gdGhlIHdpcmUuCisgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29tbWl0bWVudChieXRlW10gaGFuZHNoYWtlTWVzc2FnZSkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGFjdHVhbENsaWVudEZpbmlzaEhhc2ggPSBudWxsOworICAgIHN3aXRjaCAoaGFuZHNoYWtlQ2lwaGVyKSB7CisgICAgICBjYXNlIFAyNTZfU0hBNTEyOgorICAgICAgICBhY3R1YWxDbGllbnRGaW5pc2hIYXNoID0gc2hhNTEyKGhhbmRzaGFrZU1lc3NhZ2UpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIHNob3VsZCBiZSB1bnJlYWNoYWJsZQorICAgICAgICB0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBoYW5kc2hha2VDaXBoZXIiKTsKKyAgICB9CisKKyAgICAvLyBUaW1lIGNvbnN0YW50IGFmdGVyIEphdmEgU0UgNiBVcGRhdGUgMTcKKyAgICAvLyBTZWUgaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlLzZ1MTctMTQxNDQ3Lmh0bWwKKyAgICBpZiAoIU1lc3NhZ2VEaWdlc3QuaXNFcXVhbChhY3R1YWxDbGllbnRGaW5pc2hIYXNoLCB0aGVpckNvbW1pdG1lbnQpKSB7CisgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbigiQ29tbWl0bWVudCBkb2VzIG5vdCBtYXRjaCIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB0aHJvd0hhbmRzaGFrZU1lc3NhZ2VGcm9tQWxlcnRNZXNzYWdlKFVrZXkyTWVzc2FnZSBtZXNzYWdlKQorICAgICAgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgaWYgKG1lc3NhZ2UuaGFzTWVzc2FnZURhdGEoKSkgeworICAgICAgVWtleTJBbGVydCBhbGVydCA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBhbGVydCA9IFVrZXkyQWxlcnQucGFyc2VGcm9tKG1lc3NhZ2UuZ2V0TWVzc2FnZURhdGEoKSk7CisgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbigiQ2Fubm90IHBhcnNlIGFsZXJ0IG1lc3NhZ2UiLCBlKTsKKyAgICAgIH0KKworICAgICAgaWYgKGFsZXJ0Lmhhc1R5cGUoKSAmJiBhbGVydC5oYXNFcnJvck1lc3NhZ2UoKSkgeworICAgICAgICB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJSZWNlaXZlZCBBbGVydCBtZXNzYWdlLiBUeXBlOiAiCisgICAgICAgICAgICAgICAgKyBhbGVydC5nZXRUeXBlKCkKKyAgICAgICAgICAgICAgICArICIgRXJyb3IgTWVzc2FnZTogIgorICAgICAgICAgICAgICAgICsgYWxlcnQuZ2V0RXJyb3JNZXNzYWdlKCkpOworICAgICAgfSBlbHNlIGlmIChhbGVydC5oYXNUeXBlKCkpIHsKKyAgICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oIlJlY2VpdmVkIEFsZXJ0IG1lc3NhZ2UuIFR5cGU6ICIgKyBhbGVydC5nZXRUeXBlKCkpOworICAgICAgfQorICAgIH0KKworICAgIHRocm93SGFuZHNoYWtlRXhjZXB0aW9uKCJSZWNlaXZlZCBlbXB0eSBBbGVydCBNZXNzYWdlIik7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIGFuIGVuY29kZWQgcHVibGljIFAyNTYga2V5LgorICAgKi8KKyAgcHJpdmF0ZSBQdWJsaWNLZXkgcGFyc2VQMjU2UHVibGljS2V5KGJ5dGVbXSBlbmNvZGVkUHVibGljS2V5KQorICAgICAgdGhyb3dzIEFsZXJ0RXhjZXB0aW9uLCBIYW5kc2hha2VFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gUHVibGljS2V5UHJvdG9VdGlsLnBhcnNlUHVibGljS2V5KEdlbmVyaWNQdWJsaWNLZXkucGFyc2VGcm9tKGVuY29kZWRQdWJsaWNLZXkpKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gfCBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvd0FsZXJ0RXhjZXB0aW9uKFVrZXkyQWxlcnQuQWxlcnRUeXBlLkJBRF9QVUJMSUNfS0VZLAorICAgICAgICAgICJDYW5ub3QgcGFyc2UgcHVibGljIGtleTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBudWxsOyAvLyB1bnJlYWNoYWJsZSwgYnV0IG1ha2VzIGNvbXBpbGVyIGhhcHB5CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhIHtAbGluayBDaXBoZXJDb21taXRtZW50fSBmb3IgdGhlIFAyNTZfU0hBNTEyIGNpcGhlci4KKyAgICovCisgIHByaXZhdGUgQ2lwaGVyQ29tbWl0bWVudCBnZW5lcmF0ZVAyNTZTSEE1MTJDb21taXRtZW50KCkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgLy8gR2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZmluaXNoZWQgbWVzc2FnZSBpZiBpdCdzIG5vdCBkb25lIHlldAorICAgIGlmICghcmF3TWVzc2FnZTNNYXAuY29udGFpbnNLZXkoSGFuZHNoYWtlQ2lwaGVyLlAyNTZfU0hBNTEyKSkgeworICAgICAgZ2VuZXJhdGVQMjU2U0hBNTEyQ2xpZW50RmluaXNoZWQob3VyS2V5UGFpcik7CisgICAgfQorCisgICAgQ2lwaGVyQ29tbWl0bWVudC5CdWlsZGVyIGNpcGhlckNvbW1pdG1lbnQgPSBDaXBoZXJDb21taXRtZW50Lm5ld0J1aWxkZXIoKTsKKyAgICBjaXBoZXJDb21taXRtZW50LnNldEhhbmRzaGFrZUNpcGhlcihVa2V5UHJvdG8uVWtleTJIYW5kc2hha2VDaXBoZXIuUDI1Nl9TSEE1MTIpOworICAgIGNpcGhlckNvbW1pdG1lbnQuc2V0Q29tbWl0bWVudCgKKyAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShzaGE1MTIocmF3TWVzc2FnZTNNYXAuZ2V0KEhhbmRzaGFrZUNpcGhlci5QMjU2X1NIQTUxMikpKSk7CisKKyAgICByZXR1cm4gY2lwaGVyQ29tbWl0bWVudC5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhbmQgcmVjb3JkcyBhIHtAbGluayBVa2V5MkNsaWVudEZpbmlzaGVkfSBtZXNzYWdlIGZvciB0aGUgUDI1Nl9TSEE1MTIgY2lwaGVyLgorICAgKi8KKyAgcHJpdmF0ZSBVa2V5MkNsaWVudEZpbmlzaGVkIGdlbmVyYXRlUDI1NlNIQTUxMkNsaWVudEZpbmlzaGVkKEtleVBhaXIgcDI1NktleVBhaXIpIHsKKyAgICBieXRlW10gZW5jb2RlZEtleSA9IFB1YmxpY0tleVByb3RvVXRpbC5lbmNvZGVQdWJsaWNLZXkocDI1NktleVBhaXIuZ2V0UHVibGljKCkpLnRvQnl0ZUFycmF5KCk7CisKKyAgICBVa2V5MkNsaWVudEZpbmlzaGVkLkJ1aWxkZXIgY2xpZW50RmluaXNoZWQgPSBVa2V5MkNsaWVudEZpbmlzaGVkLm5ld0J1aWxkZXIoKTsKKyAgICBjbGllbnRGaW5pc2hlZC5zZXRQdWJsaWNLZXkoQnl0ZVN0cmluZy5jb3B5RnJvbShlbmNvZGVkS2V5KSk7CisKKyAgICByYXdNZXNzYWdlM01hcC5wdXQoCisgICAgICAgIEhhbmRzaGFrZUNpcGhlci5QMjU2X1NIQTUxMiwKKyAgICAgICAgbWFrZVVrZXkyTWVzc2FnZShVa2V5Mk1lc3NhZ2UuVHlwZS5DTElFTlRfRklOSVNILCBjbGllbnRGaW5pc2hlZC5idWlsZCgpLnRvQnl0ZUFycmF5KCkpKTsKKworICAgIHJldHVybiBjbGllbnRGaW5pc2hlZC5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBVa2V5Mk1lc3NhZ2V9IGJhc2VkIG9uIHRoZSBwcm92aWRlZCB0eXBlCisgICAqIGFuZCBkYXRhLgorICAgKi8KKyAgcHJpdmF0ZSBieXRlW10gbWFrZVVrZXkyTWVzc2FnZShVa2V5Mk1lc3NhZ2UuVHlwZSBtZXNzYWdlVHlwZSwgYnl0ZVtdIG1lc3NhZ2VEYXRhKSB7CisgICAgVWtleTJNZXNzYWdlLkJ1aWxkZXIgbWVzc2FnZSA9IFVrZXkyTWVzc2FnZS5uZXdCdWlsZGVyKCk7CisKKyAgICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7CisgICAgICBjYXNlIEFMRVJUOgorICAgICAgY2FzZSBDTElFTlRfSU5JVDoKKyAgICAgIGNhc2UgU0VSVkVSX0lOSVQ6CisgICAgICBjYXNlIENMSUVOVF9GSU5JU0g6CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBpbnRlbnRpb25hbDsgdmFsaWQgbWVzc2FnZSB0eXBlcworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG1lc3NhZ2UgdHlwZTogIiArIG1lc3NhZ2VUeXBlKTsKKyAgICB9CisgICAgbWVzc2FnZS5zZXRNZXNzYWdlVHlwZShtZXNzYWdlVHlwZSk7CisKKyAgICAvLyBBbGVydHMgYSBibGFuayBtZXNzYWdlIGRhdGEgZmllbGQKKyAgICBpZiAobWVzc2FnZVR5cGUgIT0gVWtleTJNZXNzYWdlLlR5cGUuQUxFUlQpIHsKKyAgICAgIGlmIChtZXNzYWdlRGF0YSA9PSBudWxsIHx8IG1lc3NhZ2VEYXRhLmxlbmd0aCA9PSAwKSB7CisgICAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc2VuZCBlbXB0eSBtZXNzYWdlIGRhdGEgZm9yIG5vbi1hbGVydCBtZXNzYWdlcyIpOworICAgICAgfQorICAgICAgbWVzc2FnZS5zZXRNZXNzYWdlRGF0YShCeXRlU3RyaW5nLmNvcHlGcm9tKG1lc3NhZ2VEYXRhKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1lc3NhZ2UuYnVpbGQoKS50b0J5dGVBcnJheSgpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSB7QGxpbmsgVWtleTJBbGVydH0gbWVzc2FnZSBvZiBnaXZlbiB0eXBlIGFuZCBoYXZpbmcgdGhlIGxvZ2dhYmxlIGFkZGl0aW9uYWwgZGF0YSBpZgorICAgKiBwcmVzZW50LgorICAgKi8KKyAgcHJpdmF0ZSBVa2V5MkFsZXJ0IG1ha2VBbGVydE1lc3NhZ2UoVWtleTJBbGVydC5BbGVydFR5cGUgYWxlcnRUeXBlLAorICAgICAgQE51bGxhYmxlIFN0cmluZyBsb2dnYWJsZUFkZGl0aW9uYWxEYXRhKSB0aHJvd3MgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKGFsZXJ0VHlwZSkgeworICAgICAgY2FzZSBCQURfTUVTU0FHRToKKyAgICAgIGNhc2UgQkFEX01FU1NBR0VfVFlQRToKKyAgICAgIGNhc2UgSU5DT1JSRUNUX01FU1NBR0U6CisgICAgICBjYXNlIEJBRF9NRVNTQUdFX0RBVEE6CisgICAgICBjYXNlIEJBRF9WRVJTSU9OOgorICAgICAgY2FzZSBCQURfUkFORE9NOgorICAgICAgY2FzZSBCQURfSEFORFNIQUtFX0NJUEhFUjoKKyAgICAgIGNhc2UgQkFEX05FWFRfUFJPVE9DT0w6CisgICAgICBjYXNlIEJBRF9QVUJMSUNfS0VZOgorICAgICAgY2FzZSBJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGludGVudGlvbmFsOyB2YWxpZCBhbGVydCB0eXBlcworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93SGFuZHNoYWtlRXhjZXB0aW9uKCJVbmtub3duIGFsZXJ0IHR5cGU6ICIgKyBhbGVydFR5cGUpOworICAgIH0KKworICAgIFVrZXkyQWxlcnQuQnVpbGRlciBhbGVydCA9IFVrZXkyQWxlcnQubmV3QnVpbGRlcigpOworICAgIGFsZXJ0LnNldFR5cGUoYWxlcnRUeXBlKTsKKworICAgIGlmIChsb2dnYWJsZUFkZGl0aW9uYWxEYXRhICE9IG51bGwpIHsKKyAgICAgIGFsZXJ0LnNldEVycm9yTWVzc2FnZShsb2dnYWJsZUFkZGl0aW9uYWxEYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gYWxlcnQuYnVpbGQoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmF0ZXMgYSBjcnlwdG9yYXBoaWNhbGx5IHJhbmRvbSBub25jZSBvZiBOT05DRV9MRU5HVEhfSU5fQllURVMgYnl0ZXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBieXRlW10gZ2VuZXJhdGVSYW5kb21Ob25jZSgpIHsKKyAgICBTZWN1cmVSYW5kb20gcm5nID0gbmV3IFNlY3VyZVJhbmRvbSgpOworICAgIGJ5dGVbXSByYW5kb21Ob25jZSA9IG5ldyBieXRlW05PTkNFX0xFTkdUSF9JTl9CWVRFU107CisgICAgcm5nLm5leHRCeXRlcyhyYW5kb21Ob25jZSk7CisgICAgcmV0dXJuIHJhbmRvbU5vbmNlOworICB9CisKKyAgLyoqCisgICAqIEhhbmR5IHdyYXBwZXIgdG8gZG8gU0hBNTEyLgorICAgKi8KKyAgcHJpdmF0ZSBieXRlW10gc2hhNTEyKGJ5dGVbXSBpbnB1dCkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZURpZ2VzdCBzaGE1MTI7CisgICAgdHJ5IHsKKyAgICAgIHNoYTUxMiA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS01MTIiKTsKKyAgICAgIHJldHVybiBzaGE1MTIuZGlnZXN0KGlucHV0KTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oIk5vIHNlY3VyaXR5IHByb3ZpZGVyIGluaXRpYWxpemVkIHlldD8iLCBlKTsKKyAgICAgIHJldHVybiBudWxsOyAvLyB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZSwgYnV0IG1ha2VzIGNvbXBpbGVyIGhhcHB5CisgICAgfQorICB9CisKKyAgLy8gRXhjZXB0aW9uIHdyYXBwZXJzIHRoYXQgcmVtZW1iZXIgdG8gc2V0IHRoZSBoYW5kc2hha2Ugc3RhdGUgdG8gRVJST1IKKworICBwcml2YXRlIHZvaWQgdGhyb3dBbGVydEV4Y2VwdGlvbihVa2V5MkFsZXJ0LkFsZXJ0VHlwZSBhbGVydFR5cGUsIFN0cmluZyBhbGVydExvZ1N0YXRlbWVudCkKKyAgICAgIHRocm93cyBBbGVydEV4Y2VwdGlvbiwgSGFuZHNoYWtlRXhjZXB0aW9uIHsKKyAgICBoYW5kc2hha2VTdGF0ZSA9IEludGVybmFsU3RhdGUuSEFORFNIQUtFX0VSUk9SOworICAgIHRocm93IG5ldyBBbGVydEV4Y2VwdGlvbihhbGVydExvZ1N0YXRlbWVudCwgbWFrZUFsZXJ0TWVzc2FnZShhbGVydFR5cGUsIGFsZXJ0TG9nU3RhdGVtZW50KSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGhyb3dIYW5kc2hha2VFeGNlcHRpb24oU3RyaW5nIGxvZ01lc3NhZ2UpIHRocm93cyBIYW5kc2hha2VFeGNlcHRpb24geworICAgIGhhbmRzaGFrZVN0YXRlID0gSW50ZXJuYWxTdGF0ZS5IQU5EU0hBS0VfRVJST1I7CisgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbihsb2dNZXNzYWdlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB0aHJvd0hhbmRzaGFrZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgaGFuZHNoYWtlU3RhdGUgPSBJbnRlcm5hbFN0YXRlLkhBTkRTSEFLRV9FUlJPUjsKKyAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKGUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRocm93SGFuZHNoYWtlRXhjZXB0aW9uKFN0cmluZyBsb2dNZXNzYWdlLCBFeGNlcHRpb24gZSkgdGhyb3dzIEhhbmRzaGFrZUV4Y2VwdGlvbiB7CisgICAgaGFuZHNoYWtlU3RhdGUgPSBJbnRlcm5hbFN0YXRlLkhBTkRTSEFLRV9FUlJPUjsKKyAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKGxvZ01lc3NhZ2UsIGUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZyBsb2dNZXNzYWdlKSB7CisgICAgaGFuZHNoYWtlU3RhdGUgPSBJbnRlcm5hbFN0YXRlLkhBTkRTSEFLRV9FUlJPUjsKKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGxvZ01lc3NhZ2UpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZyBsb2dNZXNzYWdlKSB7CisgICAgaGFuZHNoYWtlU3RhdGUgPSBJbnRlcm5hbFN0YXRlLkhBTkRTSEFLRV9FUlJPUjsKKyAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGxvZ01lc3NhZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL2RldmljZV90b19kZXZpY2VfbWVzc2FnZXNfY29uZmlnLmFzY2lpcGIgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL2RldmljZV90b19kZXZpY2VfbWVzc2FnZXNfY29uZmlnLmFzY2lpcGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyOTUyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVnY20vZGV2aWNlX3RvX2RldmljZV9tZXNzYWdlc19jb25maWcuYXNjaWlwYgpAQCAtMCwwICsxLDMgQEAKK29wdGltaXplX21vZGU6IExJVEVfUlVOVElNRQorCithbGxvd2VkX21lc3NhZ2U6ICJzZWN1cmVnY20uRGV2aWNlVG9EZXZpY2VNZXNzYWdlIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9zZWN1cmVnY21fY29uZmlnLmFzY2lpcGIgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlZ2NtL3NlY3VyZWdjbV9jb25maWcuYXNjaWlwYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM4YmQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZWdjbS9zZWN1cmVnY21fY29uZmlnLmFzY2lpcGIKQEAgLTAsMCArMSw0IEBACitvcHRpbWl6ZV9tb2RlOiBMSVRFX1JVTlRJTUUKKworYWxsb3dlZF9lbnVtOiAic2VjdXJlZ2NtLlR5cGUiCithbGxvd2VkX21lc3NhZ2U6ICJzZWN1cmVnY20uR2NtTWV0YWRhdGEiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlbWVzc2FnZS9DcnlwdG9PcHMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVtZXNzYWdlL0NyeXB0b09wcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlM2IxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlbWVzc2FnZS9DcnlwdG9PcHMuamF2YQpAQCAtMCwwICsxLDUxNyBAQAorLyogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZTsKKworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuYW5ub3RhdGlvbnMuU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyUmV2aWV3ZWQ7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGphdmF4LmNyeXB0by5CYWRQYWRkaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7CitpbXBvcnQgamF2YXguY3J5cHRvLklsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLk1hYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjOworCisvKioKKyAqIEVuY2Fwc3VsYXRlcyB0aGUgY3J5cHRvZ3JhcGhpYyBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIHtAY29kZSBTZWN1cmVNZXNzYWdlKn0gY2xhc3Nlcy4KKyAqLworcHVibGljIGNsYXNzIENyeXB0b09wcyB7CisgIAorICBwcml2YXRlIENyeXB0b09wcygpIHt9ICAvLyBEbyBub3QgaW5zdGFudGlhdGUKKworICAvKioKKyAgICogRW51bSBvZiBzdXBwb3J0ZWQgc2lnbmF0dXJlIHR5cGVzLCB3aXRoIGFkZGl0aW9uYWwgbWFwcGluZ3MgdG8gaW5kaWNhdGUgdGhlIG5hbWUgb2YgdGhlCisgICAqIHVuZGVybHlpbmcgSkNBIGFsZ29yaXRobSB1c2VkIHRvIGNyZWF0ZSB0aGUgc2lnbmF0dXJlLgorICAgKiBAc2VlIDxhIGhyZWY9CisgICAqICJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zZWN1cml0eS9TdGFuZGFyZE5hbWVzLmh0bWwiPgorICAgKiBKYXZhIENyeXB0b2dyYXBoeSBBcmNoaXRlY3R1cmUsIFN0YW5kYXJkIEFsZ29yaXRobSBOYW1lIERvY3VtZW50YXRpb248L2E+CisgICAqLworICBwdWJsaWMgZW51bSBTaWdUeXBlIHsKKyAgICBITUFDX1NIQTI1NihTZWN1cmVNZXNzYWdlUHJvdG8uU2lnU2NoZW1lLkhNQUNfU0hBMjU2LCAiSG1hY1NIQTI1NiIsIGZhbHNlKSwKKyAgICBFQ0RTQV9QMjU2X1NIQTI1NihTZWN1cmVNZXNzYWdlUHJvdG8uU2lnU2NoZW1lLkVDRFNBX1AyNTZfU0hBMjU2LCAiU0hBMjU2d2l0aEVDRFNBIiwgdHJ1ZSksCisgICAgUlNBMjA0OF9TSEEyNTYoU2VjdXJlTWVzc2FnZVByb3RvLlNpZ1NjaGVtZS5SU0EyMDQ4X1NIQTI1NiwgIlNIQTI1NndpdGhSU0EiLCB0cnVlKTsKKworICAgIHB1YmxpYyBTZWN1cmVNZXNzYWdlUHJvdG8uU2lnU2NoZW1lIGdldFNpZ1NjaGVtZSgpIHsKKyAgICAgIHJldHVybiBzaWdTY2hlbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRKY2FOYW1lKCkgeworICAgICAgcmV0dXJuIGpjYU5hbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQdWJsaWNLZXlTY2hlbWUoKSB7CisgICAgICByZXR1cm4gcHVibGljS2V5U2NoZW1lOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2lnVHlwZSB2YWx1ZU9mKFNlY3VyZU1lc3NhZ2VQcm90by5TaWdTY2hlbWUgc2lnU2NoZW1lKSB7CisgICAgICBmb3IgKFNpZ1R5cGUgdmFsdWUgOiB2YWx1ZXMoKSkgeworICAgICAgICBpZiAodmFsdWUuc2lnU2NoZW1lLmVxdWFscyhzaWdTY2hlbWUpKSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBTaWdUeXBlOiAiICsgc2lnU2NoZW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFNlY3VyZU1lc3NhZ2VQcm90by5TaWdTY2hlbWUgc2lnU2NoZW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGpjYU5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHB1YmxpY0tleVNjaGVtZTsKKworICAgIFNpZ1R5cGUoU2VjdXJlTWVzc2FnZVByb3RvLlNpZ1NjaGVtZSBzaWdUeXBlLCBTdHJpbmcgamNhTmFtZSwgYm9vbGVhbiBwdWJsaWNLZXlTY2hlbWUpIHsKKyAgICAgIHRoaXMuc2lnU2NoZW1lID0gc2lnVHlwZTsKKyAgICAgIHRoaXMuamNhTmFtZSA9IGpjYU5hbWU7CisgICAgICB0aGlzLnB1YmxpY0tleVNjaGVtZSA9IHB1YmxpY0tleVNjaGVtZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW51bSBvZiBzdXBwb3J0ZWQgZW5jcnlwdGlvbiB0eXBlcywgd2l0aCBhZGRpdGlvbmFsIG1hcHBpbmdzIHRvIGluZGljYXRlIHRoZSBuYW1lIG9mIHRoZQorICAgKiB1bmRlcmx5aW5nIEpDQSBhbGdvcml0aG0gdXNlZCB0byBwZXJmb3JtIHRoZSBlbmNyeXB0aW9uLgorICAgKiBAc2VlIDxhIGhyZWY9CisgICAqICJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zZWN1cml0eS9TdGFuZGFyZE5hbWVzLmh0bWwiPgorICAgKiBKYXZhIENyeXB0b2dyYXBoeSBBcmNoaXRlY3R1cmUsIFN0YW5kYXJkIEFsZ29yaXRobSBOYW1lIERvY3VtZW50YXRpb248L2E+CisgICAqLworICBwdWJsaWMgZW51bSBFbmNUeXBlIHsKKyAgICBOT05FKFNlY3VyZU1lc3NhZ2VQcm90by5FbmNTY2hlbWUuTk9ORSwgIkludmFsaWREb05vdFVzZUZvckpDQSIpLAorICAgIEFFU18yNTZfQ0JDKFNlY3VyZU1lc3NhZ2VQcm90by5FbmNTY2hlbWUuQUVTXzI1Nl9DQkMsICJBRVMvQ0JDL1BLQ1M1UGFkZGluZyIpOworCisgICAgcHVibGljIFNlY3VyZU1lc3NhZ2VQcm90by5FbmNTY2hlbWUgZ2V0RW5jU2NoZW1lKCkgeworICAgICAgcmV0dXJuIGVuY1NjaGVtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpjYU5hbWUoKSB7CisgICAgICByZXR1cm4gamNhTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVuY1R5cGUgdmFsdWVPZihTZWN1cmVNZXNzYWdlUHJvdG8uRW5jU2NoZW1lIGVuY1NjaGVtZSkgeworICAgICAgZm9yIChFbmNUeXBlIHZhbHVlIDogdmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKHZhbHVlLmVuY1NjaGVtZS5lcXVhbHMoZW5jU2NoZW1lKSkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRW5jVHlwZTogIiArIGVuY1NjaGVtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTZWN1cmVNZXNzYWdlUHJvdG8uRW5jU2NoZW1lIGVuY1NjaGVtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBqY2FOYW1lOworCisgICAgRW5jVHlwZShTZWN1cmVNZXNzYWdlUHJvdG8uRW5jU2NoZW1lIGVuY1NjaGVtZSwgU3RyaW5nIGpjYU5hbWUpIHsKKyAgICAgIHRoaXMuZW5jU2NoZW1lID0gZW5jU2NoZW1lOworICAgICAgdGhpcy5qY2FOYW1lID0gamNhTmFtZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJ1bmNhdGVkIGhhc2ggb3V0cHV0IGxlbmd0aCwgaW4gYnl0ZXMuCisgICAqLworICBzdGF0aWMgZmluYWwgaW50IERJR0VTVF9MRU5HVEggPSAyMDsKKyAgLyoqCisgICAqIEEgc2FsdCB2YWx1ZSBzcGVjaWZpYyB0byB0aGlzIGxpYnJhcnksIGdlbmVyYXRlZCBhcyBTSEEtMjU2KCJTZWN1cmVNZXNzYWdlIikKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTQUxUID0gc2hhMjU2KCJTZWN1cmVNZXNzYWdlIik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT05TVEFOVF8wMSA9IHsgMHgwMSB9OyAgLy8gRm9yIGNvbnZlbmllbmNlCisKKyAgLyoqCisgICAqIFNpZ25zIHtAY29kZSBkYXRhfSB1c2luZyB0aGUgYWxnb3JpdGhtIHNwZWNpZmllZCBieSB7QGNvZGUgc2lnVHlwZX0gd2l0aCB7QGNvZGUgc2lnbmluZ0tleX0uCisgICAqCisgICAqIEBwYXJhbSBybmcgaXMgcmVxdWlyZWQgZm9yIHB1YmxpYyBrZXkgc2lnbmF0dXJlIHNjaGVtZXMKKyAgICogQHJldHVybiByYXcgc2lnbmF0dXJlCisgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiBpZiB7QGNvZGUgc2lnbmluZ0tleX0gaXMgaW5jb21wYXRpYmxlIHdpdGgge0Bjb2RlIHNpZ1R5cGV9CisgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGlmIHRoZSBzZWN1cml0eSBwcm92aWRlciBpcyBpbmFkZXF1YXRlIGZvciB7QGNvZGUgc2lnVHlwZX0KKyAgICovCisgIHN0YXRpYyBieXRlW10gc2lnbigKKyAgICAgIFNpZ1R5cGUgc2lnVHlwZSwgS2V5IHNpZ25pbmdLZXksIEBOdWxsYWJsZSBTZWN1cmVSYW5kb20gcm5nLCBieXRlW10gZGF0YSkKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIGlmICgoc2lnbmluZ0tleSA9PSBudWxsKSB8fCAoZGF0YSA9PSBudWxsKSkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlmIChzaWdUeXBlLmlzUHVibGljS2V5U2NoZW1lKCkpIHsKKyAgICAgIGlmIChybmcgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIGlmICghKHNpZ25pbmdLZXkgaW5zdGFuY2VvZiBQcml2YXRlS2V5KSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBQcml2YXRlS2V5Iik7CisgICAgICB9CisgICAgICBTaWduYXR1cmUgc2lnU2NoZW1lID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKHNpZ1R5cGUuZ2V0SmNhTmFtZSgpKTsKKyAgICAgIHNpZ1NjaGVtZS5pbml0U2lnbigoUHJpdmF0ZUtleSkgc2lnbmluZ0tleSwgcm5nKTsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIFdlIGluY2x1ZGUgYSBmaXhlZCBtYWdpYyB2YWx1ZSAoc2FsdCkgaW4gdGhlIHNpZ25hdHVyZSBzbyB0aGF0IGlmIHRoZSBzaWduaW5nIGtleSBpcworICAgICAgICAvLyByZXVzZWQgaW4gYW5vdGhlciBjb250ZXh0IHdlIGNhbid0IGJlIGNvbmZ1c2VkIC0tIHByb3ZpZGVkIHRoYXQgdGhlIG90aGVyIHVzZXIgb2YgdGhlCisgICAgICAgIC8vIHNpZ25pbmcga2V5IG9ubHkgc2lnbnMgc3RhdGVtZW50cyB0aGF0IGRvIG5vdCBiZWdpbiB3aXRoIHRoaXMgc2FsdC4KKyAgICAgICAgc2lnU2NoZW1lLnVwZGF0ZShTQUxUKTsKKyAgICAgICAgc2lnU2NoZW1lLnVwZGF0ZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIHNpZ1NjaGVtZS5zaWduKCk7CisgICAgICB9IGNhdGNoIChTaWduYXR1cmVFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOyAgLy8gQ29uc2lzdGVudCB3aXRoIGZhaWx1cmVzIGluIE1hYy5kb0ZpbmFsCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIE1hYyBtYWNTY2hlbWUgPSBNYWMuZ2V0SW5zdGFuY2Uoc2lnVHlwZS5nZXRKY2FOYW1lKCkpOworICAgICAgLy8gTm90ZSB0aGF0IGFuIEFFUy0yNTYgU2VjcmV0S2V5IHNob3VsZCB3b3JrIHdpdGggbW9zdCBNYWMgc2NoZW1lcworICAgICAgU2VjcmV0S2V5IGRlcml2ZWRLZXkgPSBkZXJpdmVBZXMyNTZLZXlGb3IoZ2V0U2VjcmV0S2V5KHNpZ25pbmdLZXkpLCBnZXRQdXJwb3NlKHNpZ1R5cGUpKTsKKyAgICAgIG1hY1NjaGVtZS5pbml0KGRlcml2ZWRLZXkpOworICAgICAgcmV0dXJuIG1hY1NjaGVtZS5kb0ZpbmFsKGRhdGEpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBWZXJpZmllcyB0aGUge0Bjb2RlIHNpZ25hdHVyZX0gb24ge0Bjb2RlIGRhdGF9IHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5CisgICAqIHtAY29kZSBzaWdUeXBlfSB3aXRoIHtAY29kZSB2ZXJpZmljYXRpb25LZXl9LgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBzaWduYXR1cmUgaXMgdmVyaWZpZWQKKyAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gaWYgdGhlIHNlY3VyaXR5IHByb3ZpZGVyIGlzIGluYWRlcXVhdGUgZm9yIHtAY29kZSBzaWdUeXBlfQorICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gaWYge0Bjb2RlIHZlcmlmaWNhdGlvbktleX0gaXMgaW5jb21wYXRpYmxlIHdpdGgge0Bjb2RlIHNpZ1R5cGV9CisgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uCisgICAqLworICBzdGF0aWMgYm9vbGVhbiB2ZXJpZnkoS2V5IHZlcmlmaWNhdGlvbktleSwgU2lnVHlwZSBzaWdUeXBlLCBieXRlW10gc2lnbmF0dXJlLCBieXRlW10gZGF0YSkKKyAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgaWYgKCh2ZXJpZmljYXRpb25LZXkgPT0gbnVsbCkgfHwgKHNpZ25hdHVyZSA9PSBudWxsKSB8fCAoZGF0YSA9PSBudWxsKSkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlmIChzaWdUeXBlLmlzUHVibGljS2V5U2NoZW1lKCkpIHsKKyAgICAgIGlmICghKHZlcmlmaWNhdGlvbktleSBpbnN0YW5jZW9mIFB1YmxpY0tleSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIkV4cGVjdGVkIGEgUHVibGljS2V5Iik7CisgICAgICB9CisgICAgICBTaWduYXR1cmUgc2lnU2NoZW1lID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKHNpZ1R5cGUuZ2V0SmNhTmFtZSgpKTsKKyAgICAgIHNpZ1NjaGVtZS5pbml0VmVyaWZ5KChQdWJsaWNLZXkpIHZlcmlmaWNhdGlvbktleSk7CisgICAgICBzaWdTY2hlbWUudXBkYXRlKFNBTFQpOyAgLy8gU2VlIHRoZSBjb21tZW50cyBpbiBzaWduKCkgZm9yIG1vcmUgb24gdGhpcworICAgICAgc2lnU2NoZW1lLnVwZGF0ZShkYXRhKTsKKyAgICAgIHJldHVybiBzaWdTY2hlbWUudmVyaWZ5KHNpZ25hdHVyZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1hYyBtYWNTY2hlbWUgPSBNYWMuZ2V0SW5zdGFuY2Uoc2lnVHlwZS5nZXRKY2FOYW1lKCkpOworICAgICAgU2VjcmV0S2V5IGRlcml2ZWRLZXkgPQorICAgICAgICAgIGRlcml2ZUFlczI1NktleUZvcihnZXRTZWNyZXRLZXkodmVyaWZpY2F0aW9uS2V5KSwgZ2V0UHVycG9zZShzaWdUeXBlKSk7CisgICAgICBtYWNTY2hlbWUuaW5pdChkZXJpdmVkS2V5KTsKKyAgICAgIHJldHVybiBjb25zdGFudFRpbWVBcnJheUVxdWFscyhzaWduYXR1cmUsIG1hY1NjaGVtZS5kb0ZpbmFsKGRhdGEpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGUgYSByYW5kb20gSVYgYXBwcm9wcmlhdGUgZm9yIHVzZSB3aXRoIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGluIHtAY29kZSBlbmNUeXBlfS4KKyAgICoKKyAgICogQHJldHVybiBhIGZyZXNobHkgZ2VuZXJhdGVkIElWIChhIHJhbmRvbSBieXRlIHNlcXVlbmNlIG9mIGFwcHJvcHJpYXRlIGxlbmd0aCkKKyAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gaWYgdGhlIHNlY3VyaXR5IHByb3ZpZGVyIGlzIGluYWRlcXVhdGUgZm9yIHtAY29kZSBlbmNUeXBlfQorICAgKi8KKyAgQFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclJldmlld2VkCisgIC8vIFNlZSBiLzI2NTI1NDU1IGZvciBzZWN1cml0eSByZXZpZXcuCisgIHN0YXRpYyBieXRlW10gZ2VuZXJhdGVJdihFbmNUeXBlIGVuY1R5cGUsIFNlY3VyZVJhbmRvbSBybmcpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIGlmIChybmcgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBDaXBoZXIgZW5jcnlwdGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKGVuY1R5cGUuZ2V0SmNhTmFtZSgpKTsKKyAgICAgIGJ5dGVbXSBpdiA9IG5ldyBieXRlW2VuY3J5cHRlci5nZXRCbG9ja1NpemUoKV07CisgICAgICBybmcubmV4dEJ5dGVzKGl2KTsKKyAgICAgIHJldHVybiBpdjsKKyAgICB9IGNhdGNoIChOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oZSk7ICAvLyBDb25zb2xpZGF0ZSBpbnRvIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFbmNyeXB0cyB7QGNvZGUgcGxhaW50ZXh0fSB1c2luZyB0aGUgYWxnb3JpdGhtIHNwZWNpZmllZCBpbiB7QGNvZGUgZW5jVHlwZX0sIHdpdGggdGhlIHNwZWNpZmllZAorICAgKiB7QGNvZGUgaXZ9IGFuZCB7QGNvZGUgZW5jcnlwdGlvbktleX0uCisgICAqCisgICAqIEBwYXJhbSBybmcgc291cmNlIG9mIHJhbmRvbW5lc3MgdG8gYmUgdXNlZCB3aXRoIHRoZSBzcGVjaWZpZWQgY2lwaGVyLCBpZiBuZWNlc3NhcnkKKyAgICogQHJldHVybiBlbmNyeXB0ZWQgZGF0YQorICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBpZiB0aGUgc2VjdXJpdHkgcHJvdmlkZXIgaXMgaW5hZGVxdWF0ZSBmb3Ige0Bjb2RlIGVuY1R5cGV9CisgICAqIEB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiBpZiB7QGNvZGUgZW5jcnlwdGlvbktleX0gaXMgaW5jb21wYXRpYmxlIHdpdGgge0Bjb2RlIGVuY1R5cGV9CisgICAqLworICBAU3VwcHJlc3NJbnNlY3VyZUNpcGhlck1vZGVDaGVja2VyUmV2aWV3ZWQKKyAgLy8gU2VlIGIvMjY1MjU0NTUgZm9yIHNlY3VyaXR5IHJldmlldy4KKyAgc3RhdGljIGJ5dGVbXSBlbmNyeXB0KAorICAgICAgS2V5IGVuY3J5cHRpb25LZXksIEVuY1R5cGUgZW5jVHlwZSwgQE51bGxhYmxlIFNlY3VyZVJhbmRvbSBybmcsIGJ5dGVbXSBpdiwgYnl0ZVtdIHBsYWludGV4dCkKKyAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24geworICAgIGlmICgoZW5jcnlwdGlvbktleSA9PSBudWxsKSB8fCAoaXYgPT0gbnVsbCkgfHwgKHBsYWludGV4dCA9PSBudWxsKSkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlmIChlbmNUeXBlID09IEVuY1R5cGUuTk9ORSkgeworICAgICAgdGhyb3cgbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbigiQ2Fubm90IHVzZSBOT05FIHR5cGUgaGVyZSIpOworICAgIH0KKyAgICB0cnkgeworICAgICAgQ2lwaGVyIGVuY3J5cHRlciA9IENpcGhlci5nZXRJbnN0YW5jZShlbmNUeXBlLmdldEpjYU5hbWUoKSk7CisgICAgICBTZWNyZXRLZXkgZGVyaXZlZEtleSA9CisgICAgICAgICAgZGVyaXZlQWVzMjU2S2V5Rm9yKGdldFNlY3JldEtleShlbmNyeXB0aW9uS2V5KSwgZ2V0UHVycG9zZShlbmNUeXBlKSk7CisgICAgICBlbmNyeXB0ZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBkZXJpdmVkS2V5LCBuZXcgSXZQYXJhbWV0ZXJTcGVjKGl2KSwgcm5nKTsKKyAgICAgIHJldHVybiBlbmNyeXB0ZXIuZG9GaW5hbChwbGFpbnRleHQpOworICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOyAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbgorICAgIH0gY2F0Y2ggKElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOyAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbgorICAgIH0gY2F0Y2ggKEJhZFBhZGRpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOyAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbgorICAgIH0gY2F0Y2ggKE5vU3VjaFBhZGRpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbihlKTsgIC8vIENvbnNvbGlkYXRlIGludG8gTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERlY3J5cHRzIHtAY29kZSBjaXBoZXJ0ZXh0fSB1c2luZyB0aGUgYWxnb3JpdGhtIHNwZWNpZmllZCBpbiB7QGNvZGUgZW5jVHlwZX0sIHdpdGggdGhlCisgICAqIHNwZWNpZmllZCB7QGNvZGUgaXZ9IGFuZCB7QGNvZGUgZGVjcnlwdGlvbktleX0uCisgICAqCisgICAqIEByZXR1cm4gdGhlIHBsYWludGV4dCAoZGVjcnlwdGVkKSBkYXRhCisgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGlmIHRoZSBzZWN1cml0eSBwcm92aWRlciBpcyBpbmFkZXF1YXRlIGZvciB7QGNvZGUgZW5jVHlwZX0KKyAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIGlmIHtAY29kZSBkZWNyeXB0aW9uS2V5fSBpcyBpbmNvbXBhdGlibGUgd2l0aCB7QGNvZGUgZW5jVHlwZX0KKyAgICogQHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGlmIHtAY29kZSBlbmNUeXBlfSBleGNlZWRzIGxlZ2FsIGNyeXB0b2dyYXBoaWMKKyAgICogc3RyZW5ndGggbGltaXRzIGluIHRoaXMganVyaXNkaWN0aW9uCisgICAqIEB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiBpZiB7QGNvZGUgY2lwaGVydGV4dH0gY29udGFpbnMgYW4gaWxsZWdhbCBibG9jaworICAgKiBAdGhyb3dzIEJhZFBhZGRpbmdFeGNlcHRpb24gaWYge0Bjb2RlIGNpcGhlcnRleHR9IGNvbnRhaW5zIGFuIGlsbGVnYWwgcGFkZGluZworICAgKi8KKyAgQFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclJldmlld2VkCisgIC8vIFNlZSBiLzI2NTI1NDU1IGZvciBzZWN1cml0eSByZXZpZXcKKyAgc3RhdGljIGJ5dGVbXSBkZWNyeXB0KEtleSBkZWNyeXB0aW9uS2V5LCBFbmNUeXBlIGVuY1R5cGUsIGJ5dGVbXSBpdiwgYnl0ZVtdIGNpcGhlcnRleHQpCisgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLAorICAgICAgICAgIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sIEJhZFBhZGRpbmdFeGNlcHRpb24geworICAgIGlmICgoZGVjcnlwdGlvbktleSA9PSBudWxsKSB8fCAoaXYgPT0gbnVsbCkgfHwgKGNpcGhlcnRleHQgPT0gbnVsbCkpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICBpZiAoZW5jVHlwZSA9PSBFbmNUeXBlLk5PTkUpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oIkNhbm5vdCB1c2UgTk9ORSB0eXBlIGhlcmUiKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIENpcGhlciBkZWNyeXB0ZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoZW5jVHlwZS5nZXRKY2FOYW1lKCkpOworICAgICAgU2VjcmV0S2V5IGRlcml2ZWRLZXkgPQorICAgICAgICAgIGRlcml2ZUFlczI1NktleUZvcihnZXRTZWNyZXRLZXkoZGVjcnlwdGlvbktleSksIGdldFB1cnBvc2UoZW5jVHlwZSkpOworICAgICAgZGVjcnlwdGVyLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgZGVyaXZlZEtleSwgbmV3IEl2UGFyYW1ldGVyU3BlYyhpdikpOworICAgICAgcmV0dXJuIGRlY3J5cHRlci5kb0ZpbmFsKGNpcGhlcnRleHQpOworICAgIH0gY2F0Y2ggKE5vU3VjaFBhZGRpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOyAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbgorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlcyBhIGNvbGxpc2lvbi1yZXNpc3RhbnQgaGFzaCBvZiB7QGxpbmsgI0RJR0VTVF9MRU5HVEh9IGJ5dGVzCisgICAqICh1c2luZyBhIHRydW5jYXRlZCBTSEEtMjU2IG91dHB1dCkuCisgICAqLworICBzdGF0aWMgYnl0ZVtdIGRpZ2VzdChieXRlW10gZGF0YSkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZURpZ2VzdCBzaGEyNTYgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtMjU2Iik7CisgICAgYnl0ZVtdIHRydW5jYXRlZEhhc2ggPSBuZXcgYnl0ZVtESUdFU1RfTEVOR1RIXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KHNoYTI1Ni5kaWdlc3QoZGF0YSksIDAsIHRydW5jYXRlZEhhc2gsIDAsIERJR0VTVF9MRU5HVEgpOworICAgIHJldHVybiB0cnVuY2F0ZWRIYXNoOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB0d28gYXJyYXlzIGFyZSBlcXVhbCB0byBvbmUgYW5vdGhlci4KKyAgICogV2hlbiB0aGUgdHdvIGFycmF5cyBkaWZmZXIgaW4gbGVuZ3RoLCB0cml2aWFsbHkgcmV0dXJucyB7QGNvZGUgZmFsc2V9LgorICAgKiBXaGVuIHRoZSB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiBsZW5ndGgsIGRvZXMgYSBjb25zdGFudC10aW1lIGNvbXBhcmlzb24KKyAgICogb2YgdGhlIHR3bywgaS5lLiBkb2VzIG5vdCBhYm9ydCB0aGUgY29tcGFyaXNvbiB3aGVuIHRoZSBmaXJzdCBkaWZmZXJpbmcKKyAgICogZWxlbWVudCBpcyBmb3VuZC4KKyAgICoKKyAgICogPHA+Tk9URTogVGhpcyBpcyBhIGNvcHkgb2Yge0Bjb2RlIGphdmEvY29tL2dvb2dsZS9tYXRoL2NyeXB0by9Db25zdGFudFRpbWUjYXJyYXlFcXVhbHN9LgorICAgKgorICAgKiBAcGFyYW0gYSBBbiBhcnJheSB0byBjb21wYXJlCisgICAqIEBwYXJhbSBiIEFub3RoZXIgYXJyYXkgdG8gY29tcGFyZQorICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVzZSBhcnJheXMgYXJlIGJvdGggbnVsbCBvciBpZiB0aGV5IGhhdmUgZXF1YWwKKyAgICogICAgICAgICBsZW5ndGggYW5kIGVxdWFsIGJ5dGVzIGluIGFsbCBlbGVtZW50cworICAgKi8KKyAgc3RhdGljIGJvb2xlYW4gY29uc3RhbnRUaW1lQXJyYXlFcXVhbHMoQE51bGxhYmxlIGJ5dGVbXSBhLCBATnVsbGFibGUgYnl0ZVtdIGIpIHsKKyAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIChhID09IGIpOworICAgIH0KKyAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYnl0ZSByZXN1bHQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgeworICAgICAgcmVzdWx0ID0gKGJ5dGUpIChyZXN1bHQgfCBhW2ldIF4gYltpXSk7CisgICAgfQorICAgIHJldHVybiAocmVzdWx0ID09IDApOworICB9CisKKyAgLy8gQFZpc2libGVGb3JUZXN0aW5nCisgIHN0YXRpYyBTdHJpbmcgZ2V0UHVycG9zZShTaWdUeXBlIHNpZ1R5cGUpIHsKKyAgICByZXR1cm4gIlNJRzoiICsgc2lnVHlwZS5nZXRTaWdTY2hlbWUoKS5nZXROdW1iZXIoKTsKKyAgfQorCisgIC8vIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgU3RyaW5nIGdldFB1cnBvc2UoRW5jVHlwZSBlbmNUeXBlKSB7CisgICAgcmV0dXJuICJFTkM6IiArIGVuY1R5cGUuZ2V0RW5jU2NoZW1lKCkuZ2V0TnVtYmVyKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTZWNyZXRLZXkgZ2V0U2VjcmV0S2V5KEtleSBrZXkpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBTZWNyZXRLZXkpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBTZWNyZXRLZXkiKTsKKyAgICB9CisgICAgcmV0dXJuIChTZWNyZXRLZXkpIGtleTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gc3RyaW5nCisgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgVVRGLTggY2hhcnNldCBpcyBub3QgcHJlc2VudC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHV0ZjhTdHJpbmdUb0J5dGVzKFN0cmluZyBpbnB1dCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gaW5wdXQuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgIC8vIFNob3VsZG4ndCBoYXBwZW4sIFVURi04IGlzIHVuaXZlcnNhbAorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFNIQS0yNTYoVVRGLTggZW5jb2RlZCBpbnB1dCkKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNoYTI1NihTdHJpbmcgaW5wdXQpIHsKKyAgICBNZXNzYWdlRGlnZXN0IHNoYTI1NjsKKyAgICB0cnkgeworICAgICAgc2hhMjU2ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTI1NiIpOworICAgICAgcmV0dXJuIHNoYTI1Ni5kaWdlc3QodXRmOFN0cmluZ1RvQnl0ZXMoaW5wdXQpKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHNlY3VyaXR5IHByb3ZpZGVyIGluaXRpYWxpemVkIHlldD8iLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBzcGVjaWZpYyB0byB0aGlzIGxpYnJhcnksIHdoaWNoIGFjY2VwdHMgYSB7QGNvZGUgbWFzdGVyS2V5fSBhbmQgYW4KKyAgICogYXJiaXRyYXJ5IHtAY29kZSBwdXJwb3NlfSBkZXNjcmliaW5nIHRoZSBpbnRlbmRlZCBhcHBsaWNhdGlvbiBvZiB0aGUgZGVyaXZlZCBzdWIta2V5LAorICAgKiBhbmQgcHJvZHVjZXMgYSBkZXJpdmVkIEFFUy0yNTYga2V5IHNhZmUgdG8gdXNlIGFzIGlmIGl0IHdlcmUgaW5kZXBlbmRlbnQgb2YgYW55IG90aGVyCisgICAqIGRlcml2ZWQga2V5IHdoaWNoIHVzZWQgYSBkaWZmZXJlbnQge0Bjb2RlIHB1cnBvc2V9LgorICAgKgorICAgKiBAcGFyYW0gbWFzdGVyS2V5IGFueSBrZXkgc3VpdGFibGUgZm9yIHVzZSB3aXRoIEhtYWNTSEEyNTYKKyAgICogQHBhcmFtIHB1cnBvc2UgYSBVVEYtOCBlbmNvZGVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mIGRlcml2ZWQga2V5CisgICAqIEByZXR1cm4gYSBkZXJpdmVkIFNlY3JldEtleSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggQUVTLTI1NgorICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gaWYgdGhlIGVuY29kZWQgZm9ybSBvZiB7QGNvZGUgbWFzdGVyS2V5fSBjYW5ub3QgYmUgYWNjZXNzZWQKKyAgICovCisgIHN0YXRpYyBTZWNyZXRLZXkgZGVyaXZlQWVzMjU2S2V5Rm9yKFNlY3JldEtleSBtYXN0ZXJLZXksIFN0cmluZyBwdXJwb3NlKQorICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBTZWNyZXRLZXlTcGVjKGhrZGYobWFzdGVyS2V5LCBTQUxULCB1dGY4U3RyaW5nVG9CeXRlcyhwdXJwb3NlKSksICJBRVMiKTsKKyAgfQorCisgIC8qKgorICAgKiBJbXBsZW1lbnRzIEhLREYgKFJGQyA1ODY5KSB3aXRoIHRoZSBTSEEtMjU2IGhhc2ggYW5kIGEgMjU2LWJpdCBvdXRwdXQga2V5IGxlbmd0aC4KKyAgICoKKyAgICogUGxlYXNlIG1ha2Ugc3VyZSB0byBzZWxlY3QgYSBzYWx0IHRoYXQgaXMgZml4ZWQgYW5kIHVuaXF1ZSBmb3IgeW91ciBjb2RlYmFzZSwgYW5kIHVzZSB0aGUKKyAgICoge0Bjb2RlIGluZm99IHBhcmFtZXRlciB0byBzcGVjaWZ5IGFueSBhZGRpdGlvbmFsIGJpdHMgdGhhdCBzaG91bGQgaW5mbHVlbmNlIHRoZSBkZXJpdmVkIGtleS4KKyAgICoKKyAgICogQHBhcmFtIGlucHV0S2V5TWF0ZXJpYWwgbWFzdGVyIGtleSBmcm9tIHdoaWNoIHRvIGRlcml2ZSBzdWIta2V5cworICAgKiBAcGFyYW0gc2FsdCBhIChwdWJsaWMpIHJhbmRvbWx5IGdlbmVyYXRlZCAyNTYtYml0IGlucHV0IHRoYXQgY2FuIGJlIHJlLXVzZWQKKyAgICogQHBhcmFtIGluZm8gYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHRoYXQgaXMgYm91bmQgdG8gdGhlIGRlcml2ZWQga2V5IChpLmUuLCB1c2VkIGluIGl0cyBjcmVhdGlvbikKKyAgICogQHJldHVybiByYXcgZGVyaXZlZCBrZXkgYnl0ZXMgPSBIS0RGLVNIQTI1NihpbnB1dEtleU1hdGVyaWFsLCBzYWx0LCBpbmZvKQorICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gaWYgdGhlIGVuY29kZWQgZm9ybSBvZiB7QGNvZGUgaW5wdXRLZXlNYXRlcmlhbH0gY2Fubm90IGJlIGFjY2Vzc2VkCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBoa2RmKFNlY3JldEtleSBpbnB1dEtleU1hdGVyaWFsLCBieXRlW10gc2FsdCwgYnl0ZVtdIGluZm8pCisgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICBpZiAoKGlucHV0S2V5TWF0ZXJpYWwgPT0gbnVsbCkgfHwgKHNhbHQgPT0gbnVsbCkgfHwgKGluZm8gPT0gbnVsbCkpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICByZXR1cm4gaGtkZlNoYTI1NkV4cGFuZChoa2RmU2hhMjU2RXh0cmFjdChpbnB1dEtleU1hdGVyaWFsLCBzYWx0KSwgaW5mbyk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB7QGNvZGUgYX0gYW5kIHtAY29kZSBifSwgdHJlYXRpbmcge0Bjb2RlIG51bGx9IGFzIHRoZSBlbXB0eSBhcnJheS4KKyAgICovCisgIHN0YXRpYyBieXRlW10gY29uY2F0KEBOdWxsYWJsZSBieXRlW10gYSwgQE51bGxhYmxlIGJ5dGVbXSBiKSB7CisgICAgaWYgKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7CisgICAgICByZXR1cm4gbmV3IGJ5dGVbXSB7IH07CisgICAgfQorICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgIHJldHVybiBiOworICAgIH0KKyAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2EubGVuZ3RoICsgYi5sZW5ndGhdOworICAgIFN5c3RlbS5hcnJheWNvcHkoYSwgMCwgcmVzdWx0LCAwLCBhLmxlbmd0aCk7CisgICAgU3lzdGVtLmFycmF5Y29weShiLCAwLCByZXN1bHQsIGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBTaW5jZSB7QGNvZGUgQXJyYXlzLmNvcHlPZlJhbmdlKC4uLil9IGlzIG5vdCBhdmFpbGFibGUgb24gb2xkZXIgQW5kcm9pZCBwbGF0Zm9ybXMsCisgICAqIGEgY3VzdG9tIG1ldGhvZCBmb3IgY29tcHV0aW5nIGEgc3ViYXJyYXkgaXMgcHJvdmlkZWQgaGVyZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgc3Vic3RyaW5nIG9mIHtAY29kZSBpbn0gZnJvbSB7QGNvZGUgYmVnaW5JbmRleH0gKGluY2x1c2l2ZSkKKyAgICogICB1cCB0byB7QGNvZGUgZW5kSW5kZXh9IChleGNsdXNpdmUpCisgICAqLworICBzdGF0aWMgYnl0ZVtdIHN1YmFycmF5KGJ5dGVbXSBpbiwgaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkgeworICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaW50IGxlbmd0aCA9IGVuZEluZGV4IC0gYmVnaW5JbmRleDsKKyAgICBpZiAoKGxlbmd0aCA8IDApCisgICAgICAgIHx8IChiZWdpbkluZGV4IDwgMCkKKyAgICAgICAgfHwgKGVuZEluZGV4IDwgMCkKKyAgICAgICAgfHwgKGJlZ2luSW5kZXggPj0gaW4ubGVuZ3RoKQorICAgICAgICB8fCAoZW5kSW5kZXggPiBpbi5sZW5ndGgpKSB7CisgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgIH0KKyAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgU3lzdGVtLmFycmF5Y29weShpbiwgYmVnaW5JbmRleCwgcmVzdWx0LCAwLCBsZW5ndGgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFRoZSBIS0RGIChSRkMgNTg2OSkgZXh0cmFjdGlvbiBmdW5jdGlvbiwgdXNpbmcgdGhlIFNIQS0yNTYgaGFzaCBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcworICAgKiB1c2VkIHRvIHByZS1wcm9jZXNzIHRoZSBpbnB1dEtleU1hdGVyaWFsIGFuZCBtaXggaXQgd2l0aCB0aGUgc2FsdCwgcHJvZHVjaW5nIG91dHB1dCBzdWl0YWJsZQorICAgKiBmb3IgdXNlIHdpdGggSEtERiBleHBhbnNpb24gZnVuY3Rpb24gKHdoaWNoIHByb2R1Y2VzIHRoZSBhY3R1YWwgZGVyaXZlZCBrZXkpLgorICAgKgorICAgKiBAc2VlICNoa2RmU2hhMjU2RXhwYW5kKGJ5dGVbXSwgYnl0ZVtdKQorICAgKiBAcmV0dXJuIEhNQUMtU0hBMjU2KHNhbHQsIGlucHV0S2V5TWF0ZXJpYWwpICAoc2FsdCBpcyB0aGUgImtleSIgZm9yIHRoZSBITUFDKQorICAgKiBAdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gaWYgdGhlIGVuY29kZWQgZm9ybSBvZiB7QGNvZGUgaW5wdXRLZXlNYXRlcmlhbH0gY2Fubm90IGJlIGFjY2Vzc2VkCisgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGlmIHRoZSBIbWFjU0hBMjU2IG9yIEFFUyBhbGdvcml0aG1zIGFyZSB1bmF2YWlsYWJsZQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGhrZGZTaGEyNTZFeHRyYWN0KFNlY3JldEtleSBpbnB1dEtleU1hdGVyaWFsLCBieXRlW10gc2FsdCkKKyAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24geworICAgIE1hYyBtYWNTY2hlbWUgPSBNYWMuZ2V0SW5zdGFuY2UoIkhtYWNTSEEyNTYiKTsKKyAgICB0cnkgeworICAgICAgbWFjU2NoZW1lLmluaXQobmV3IFNlY3JldEtleVNwZWMoc2FsdCwgIkFFUyIpKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgIH0KKyAgICAvLyBOb3RlIHRoYXQgdGhlIFNlY3JldEtleSBlbmNvZGluZyBmb3JtYXQgaXMgZGVmaW5lZCB0byBiZSBSQVcsIHNvIHRoZSBlbmNvZGVkIGZvcm0gc2hvdWxkIGJlCisgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgaW1wbGVtZW50YXRpb25zLgorICAgIGJ5dGVbXSBlbmNvZGVkS2V5TWF0ZXJpYWwgPSBpbnB1dEtleU1hdGVyaWFsLmdldEVuY29kZWQoKTsKKyAgICBpZiAoZW5jb2RlZEtleU1hdGVyaWFsID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJDYW5ub3QgZ2V0IGVuY29kZWQgZm9ybSBvZiBTZWNyZXRLZXkiKTsKKyAgICB9CisgICAgcmV0dXJuIG1hY1NjaGVtZS5kb0ZpbmFsKGVuY29kZWRLZXlNYXRlcmlhbCk7CisgIH0KKworICAvKioKKyAgICogU3BlY2lhbCBjYXNlIG9mIEhLREYgKFJGQyA1ODY5KSBleHBhbnNpb24gZnVuY3Rpb24sIHVzaW5nIHRoZSBTSEEtMjU2IGhhc2ggZnVuY3Rpb24gYW5kCisgICAqIGFsbG93aW5nIGZvciBhIG1heGltdW0gb3V0cHV0IGxlbmd0aCBvZiAyNTYgYml0cy4KKyAgICoKKyAgICogQHBhcmFtIHBzZXVkb1JhbmRvbUtleSBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IHtAbGluayAjaGtkZlNoYTI1NkV4cGFuZChieXRlW10sIGJ5dGVbXSl9CisgICAqIEBwYXJhbSBpbmZvIGFyYml0cmFyeSBpbmZvcm1hdGlvbiB0aGUgZGVyaXZlZCBrZXkgc2hvdWxkIGJlIGJvdW5kIHRvCisgICAqIEByZXR1cm4gcmF3IGRlcml2ZWQga2V5IGJ5dGVzID0gSE1BQy1TSEEyNTYocHNldWRvUmFuZG9tS2V5LCBpbmZvIHwgMHgwMSkKKyAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gaWYgdGhlIEhtYWNTSEEyNTYgb3IgQUVTIGFsZ29yaXRobXMgYXJlIHVuYXZhaWxhYmxlCisgICAqLworICBwcml2YXRlIHN0YXRpYyBieXRlW10gaGtkZlNoYTI1NkV4cGFuZChieXRlW10gcHNldWRvUmFuZG9tS2V5LCBieXRlW10gaW5mbykKKyAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIE1hYyBtYWNTY2hlbWUgPSBNYWMuZ2V0SW5zdGFuY2UoIkhtYWNTSEEyNTYiKTsKKyAgICB0cnkgeworICAgICAgbWFjU2NoZW1lLmluaXQobmV3IFNlY3JldEtleVNwZWMocHNldWRvUmFuZG9tS2V5LCAiQUVTIikpOworICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOyAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgfQorICAgIC8vIEFyYml0cmFyeSAiaW5mbyIgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIE1BQy4KKyAgICBtYWNTY2hlbWUudXBkYXRlKGluZm8pOworICAgIC8vIE5vdGUgdGhhdCBSRkMgNTg2OSBjb21wdXRlcyBudW1iZXIgb2YgYmxvY2tzIE4gPSBjZWlsKGhhc2ggbGVuZ3RoIC8gb3V0cHV0IGxlbmd0aCksIGJ1dAorICAgIC8vIGhlcmUgd2Ugb25seSBkZWFsIHdpdGggYSAyNTYgYml0IGhhc2ggdXAgdG8gYSAyNTYgYml0IG91dHB1dCwgeWllbGRpbmcgTj0xLgorICAgIHJldHVybiBtYWNTY2hlbWUuZG9GaW5hbChDT05TVEFOVF8wMSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZW1lc3NhZ2UvUHVibGljS2V5UHJvdG9VdGlsLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlbWVzc2FnZS9QdWJsaWNLZXlQcm90b1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjk3Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZW1lc3NhZ2UvUHVibGljS2V5UHJvdG9VdGlsLmphdmEKQEAgLTAsMCArMSw2NDMgQEAKKy8qIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5hbm5vdGF0aW9ucy5TdXBwcmVzc0luc2VjdXJlQ2lwaGVyTW9kZUNoZWNrZXJQZW5kaW5nUmV2aWV3OworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLlNlY3VyZU1lc3NhZ2VQcm90by5EaFB1YmxpY0tleTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uRWNQMjU2UHVibGljS2V5OworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLlNlY3VyZU1lc3NhZ2VQcm90by5HZW5lcmljUHVibGljS2V5OworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLlNlY3VyZU1lc3NhZ2VQcm90by5TaW1wbGVSc2FQdWJsaWNLZXk7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1B1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkRnA7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDR2VuUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BvaW50OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1B1YmxpY0tleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FQdWJsaWNLZXlTcGVjOworaW1wb3J0IGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uaW50ZXJmYWNlcy5ESFB1YmxpY0tleTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5ESFBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREhQdWJsaWNLZXlTcGVjOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgY29udGFpbmluZyBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIGZvciBhIHNpbXBsZSBwcm90b2J1ZiBiYXNlZCByZXByZXNlbnRhdGlvbiBvZgorICogRUMgcHVibGljIGtleXMgdGhhdCBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIFNlY3VyZU1lc3NhZ2UgbGlicmFyeS4KKyAqCisgKiBOLkIuOiBSZXF1aXJlcyB0aGUgYXZhaWxhYmlsaXR5IG9mIGFuIEVDIHNlY3VyaXR5IHByb3ZpZGVyIHN1cHBvcnRpbmcgdGhlIE5JU1QgUC0yNTYgY3VydmUuCisgKgorICovCitwdWJsaWMgY2xhc3MgUHVibGljS2V5UHJvdG9VdGlsIHsKKworICBwcml2YXRlIFB1YmxpY0tleVByb3RvVXRpbCgpIHt9ICAvLyBEbyBub3QgaW5zdGFudGlhdGUKKworICAvKioKKyAgICogQ2FjaGVzIHN0YXRlIGFib3V0IHdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgRWxsaXB0aWMgQ3VydmUgYWxnb3JpdGhtcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfTEVHQUNZX0NSWVBUT19SRVFVSVJFRCA9IGRldGVybWluZUlmTGVnYWN5Q3J5cHRvUmVxdWlyZWQoKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE9ORSA9IG5ldyBCaWdJbnRlZ2VyKCIxIik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFdPID0gbmV3IEJpZ0ludGVnZXIoIjIiKTsKKworICAvKioKKyAgICogTmFtZSBmb3IgRWxsaXB0aWMgQ3VydmUgY3J5cHRvZ3JhcGh5IGFsZ29yaXRobSBzdWl0ZSwgdXNlZCBieSB0aGUgc2VjdXJpdHkgcHJvdmlkZXIuIElmIHRoZQorICAgKiBzZWN1cml0eSBwcm92aWRlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0sIHJ1bnRpbWUgZXJyb3JzIHdpbGwgZW5zdWUuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNfQUxHID0gIkVDIjsKKworICAvKioKKyAgICogQSBjb21tb24gbmFtZSBmb3IgdGhlIE5JU1QgUC0yNTYgY3VydmUsIHVzZWQgYnkgbW9zdCBKYXZhIHNlY3VyaXR5IHByb3ZpZGVycy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ19QMjU2X0NPTU1PTl9OQU1FID0gInNlY3AyNTZyMSI7CisKKyAgLyoqCisgICAqIEEgbmFtZSB0aGUgTklTVCBQLTI1NiBjdXJ2ZSwgdXNlZCBieSB0aGUgT3BlblNTTCBKYXZhIHNlY3VyaXR5IHByb3ZpZGVyIChlLmcsLiBvbiBBbmRyb2lkKS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ19QMjU2X09QRU5TU0xfTkFNRSA9ICJwcmltZTI1NnYxIjsKKworICAvKioKKyAgICogVGhlIHtAbGluayBFQ1BhcmFtZXRlclNwZWN9IGZvciB0aGUgTklTVCBQLTI1NiBFbGxpcHRpYyBDdXJ2ZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVDUGFyYW1ldGVyU3BlYyBFQ19QMjU2X1BBUkFNUyA9IGlzTGVnYWN5Q3J5cHRvUmVxdWlyZWQoKSA/IG51bGwgOgorICAgICAgKChFQ1B1YmxpY0tleSkgZ2VuZXJhdGVFY1AyNTZLZXlQYWlyKCkuZ2V0UHVibGljKCkpLmdldFBhcmFtcygpOworCisgIC8qKgorICAgKiBUaGUgcHJpbWUge0Bjb2RlIHB9IGRlc2NyaWJpbmcgdGhlIGZpZWxkIGZvciB0aGUgTklTVCBQLTI1NiBjdXJ2ZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRUNfUDI1Nl9QID0gaXNMZWdhY3lDcnlwdG9SZXF1aXJlZCgpID8gbnVsbCA6CisgICAgICAoKEVDRmllbGRGcCkgRUNfUDI1Nl9QQVJBTVMuZ2V0Q3VydmUoKS5nZXRGaWVsZCgpKS5nZXRQKCk7CisKKyAgLyoqCisgICAqIFRoZSBjb2VmZmljaWVudCB7QGNvZGUgYX0gZm9yIHRoZSBOSVNUIFAtMjU2IGN1cnZlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFQ19QMjU2X0EgPSBpc0xlZ2FjeUNyeXB0b1JlcXVpcmVkKCkgPyBudWxsIDoKKyAgICAgIEVDX1AyNTZfUEFSQU1TLmdldEN1cnZlKCkuZ2V0QSgpOworCisgIC8qKgorICAgKiBUaGUgY29lZmZpY2llbnQge0Bjb2RlIGJ9IGZvciB0aGUgTklTVCBQLTI1NiBjdXJ2ZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRUNfUDI1Nl9CID0gaXNMZWdhY3lDcnlwdG9SZXF1aXJlZCgpID8gbnVsbCA6CisgICAgICBFQ19QMjU2X1BBUkFNUy5nZXRDdXJ2ZSgpLmdldEIoKTsKKworICAvKioKKyAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYSAyJ3MgY29tcGxlbWVudCBlbmNvZGluZyBvZiBhIE5JU1QgUC0yNTYgZWxsaXB0aWMgY3VydmUgcG9pbnQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1AyNTZfRU5DT0RJTkdfQllURVMgPSAzMzsKKworICAvKioKKyAgICogVGhlIEpDQSBuYW1lIGZvciB0aGUgUlNBIGNyeXB0b2dyYXBoeSBzdWl0ZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSU0FfQUxHID0gIlJTQSI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJTQTIwNDhfTU9EVUxVU19CSVRTID0gMjA0ODsKKworICAvKioKKyAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYSAyJ3MgY29tcGxlbWVudCBlbmNvZGluZyBvZiBhIDIwNDgtYml0IFJTQSBrZXkuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JTQTIwNDhfRU5DT0RJTkdfQllURVMgPSAyNTc7CisKKyAgLyoqCisgICAqIFRoZSBKQ0EgbmFtZSBmb3IgdGhlIERpZmZpZS1IZWxsbWFuIGNyeXB0b2dyYXBoeSBzdWl0ZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESF9BTEcgPSAiREgiOworCisgIC8qKgorICAgKiBUaGUgcHJpbWUgZnJvbSB0aGUgMjA0OC1iaXQgTU9EUCBHcm91cCAoZ3JvdXAgMTQpIGRlc2NyaWJlZCBpbiBSRkMgMzUyNiwgdG8gYmUgdXNlZCBmb3IKKyAgICogRGlmZmllLUhlbGxtYW4gY29tcHV0YXRpb25zLiBVc2Ugb25seSBpZiBFbGxpcHRpYyBDdXJ2ZSBjaXBoZXJzIGFyZSB1bmF2YWlsYWJsZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBESF9QID0gbmV3IEJpZ0ludGVnZXIoCisgICAgICAiRkZGRkZGRkZGRkZGRkZGRkM5MEZEQUEyMjE2OEMyMzRDNEM2NjI4QjgwREMxQ0QxIiArCisgICAgICAiMjkwMjRFMDg4QTY3Q0M3NDAyMEJCRUE2M0IxMzlCMjI1MTRBMDg3OThFMzQwNEREIiArCisgICAgICAiRUY5NTE5QjNDRDNBNDMxQjMwMkIwQTZERjI1RjE0Mzc0RkUxMzU2RDZENTFDMjQ1IiArCisgICAgICAiRTQ4NUI1NzY2MjVFN0VDNkY0NEM0MkU5QTYzN0VENkIwQkZGNUNCNkY0MDZCN0VEIiArCisgICAgICAiRUUzODZCRkI1QTg5OUZBNUFFOUYyNDExN0M0QjFGRTY0OTI4NjY1MUVDRTQ1QjNEIiArCisgICAgICAiQzIwMDdDQjhBMTYzQkYwNTk4REE0ODM2MUM1NUQzOUE2OTE2M0ZBOEZEMjRDRjVGIiArCisgICAgICAiODM2NTVEMjNEQ0EzQUQ5NjFDNjJGMzU2MjA4NTUyQkI5RUQ1MjkwNzcwOTY5NjZEIiArCisgICAgICAiNjcwQzM1NEU0QUJDOTgwNEYxNzQ2QzA4Q0ExODIxN0MzMjkwNUU0NjJFMzZDRTNCIiArCisgICAgICAiRTM5RTc3MkMxODBFODYwMzlCMjc4M0EyRUMwN0EyOEZCNUM1NURGMDZGNEM1MkM5IiArCisgICAgICAiREUyQkNCRjY5NTU4MTcxODM5OTU0OTdDRUE5NTZBRTUxNUQyMjYxODk4RkEwNTEwIiArCisgICAgICAiMTU3MjhFNUE4QUFDQUE2OEZGRkZGRkZGRkZGRkZGRkYiLCAxNik7CisKKyAgLyoqCisgICAqIFRoZSBnZW5lcmF0b3IgZm9yIHRoZSAyMDQ4LWJpdCBNT0RQIEdyb3VwIChncm91cCAxNCkgZGVzY3JpYmVkIGluIFJGQyAzNTI2LCB0byBiZSB1c2VkIGZvcgorICAgKiBEaWZmaWUtSGVsbG1hbiBjb21wdXRhdGlvbnMuIFVzZSBvbmx5IGlmIEVsbGlwdGljIEN1cnZlIGNpcGhlcnMgYXJlIHVuYXZhaWxhYmxlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERIX0cgPSBUV087CisKKyAgLyoqCisgICAqIFRoZSBzaXplIG9mIHRoZSBEaWZmaWUtSGVsbG1hbiBleHBvbmVudCB0byB1c2UsIGluIGJpdHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESF9MRU4gPSA1MTI7CisKKyAgLyoqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgMidzIGNvbXBsZW1lbnQgZW5jb2Rpbmcgb2YgYQorICAgKiBEaWZmaWUtSGVsbG1hbiBrZXkgdXNpbmcge0BsaW5rICNESF9HfS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfREgyMDQ4X0VOQ09ESU5HX0JZVEVTID0gMjU3OworCisgIC8qKgorICAgKiBWZXJzaW9uIGNvZGUgZm9yIHRoZSBIb25leWNvbWIgcmVsZWFzZSBvZiBBbmRyb2lkLCB3aGljaCBpcyB0aGUgZmlyc3QgcmVsZWFzZSBzdXBwb3J0aW5nCisgICAqIEVsbGlwdGljIEN1cnZlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5EUk9JRF9IT05FWUNPTUJfU0RLX0lOVCA9IDExOworCisgIC8qKgorICAgKiBFbmNvZGVzIGFueSBzdXBwb3J0ZWQge0BsaW5rIFB1YmxpY0tleX0gdHlwZSBhcyBhIHtAbGluayBHZW5lcmljUHVibGljS2V5fSBwcm90byBtZXNzYWdlLgorICAgKgorICAgKiBAc2VlIFNlY3VyZU1lc3NhZ2VQcm90byBjb25zdGFudHMgKGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlKSBmb3Igc3VwcG9ydGVkIHR5cGVzCisgICAqLworICBwdWJsaWMgc3RhdGljIEdlbmVyaWNQdWJsaWNLZXkgZW5jb2RlUHVibGljS2V5KFB1YmxpY0tleSBwaykgeworICAgIGlmIChwayA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKHBrIGluc3RhbmNlb2YgRUNQdWJsaWNLZXkpIHsKKyAgICAgIHJldHVybiBHZW5lcmljUHVibGljS2V5Lm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRUeXBlKFNlY3VyZU1lc3NhZ2VQcm90by5QdWJsaWNLZXlUeXBlLkVDX1AyNTYpCisgICAgICAgICAgLnNldEVjUDI1NlB1YmxpY0tleShlbmNvZGVFY1B1YmxpY0tleShwaykpCisgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorICAgIGlmIChwayBpbnN0YW5jZW9mIFJTQVB1YmxpY0tleSkgeworICAgICAgcmV0dXJuIEdlbmVyaWNQdWJsaWNLZXkubmV3QnVpbGRlcigpCisgICAgICAgICAgLnNldFR5cGUoU2VjdXJlTWVzc2FnZVByb3RvLlB1YmxpY0tleVR5cGUuUlNBMjA0OCkKKyAgICAgICAgICAuc2V0UnNhMjA0OFB1YmxpY0tleShlbmNvZGVSc2EyMDQ4UHVibGljS2V5KHBrKSkKKyAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisgICAgaWYgKHBrIGluc3RhbmNlb2YgREhQdWJsaWNLZXkpIHsKKyAgICAgIHJldHVybiBHZW5lcmljUHVibGljS2V5Lm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRUeXBlKFNlY3VyZU1lc3NhZ2VQcm90by5QdWJsaWNLZXlUeXBlLkRIMjA0OF9NT0RQKQorICAgICAgICAgIC5zZXREaDIwNDhQdWJsaWNLZXkoZW5jb2RlRGgyMDQ4UHVibGljS2V5KHBrKSkKKyAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgUHVibGljS2V5IHR5cGUiKTsKKyAgfQorCisgIC8qKgorICAgKiBFbmNvZGVzIGFuIHtAbGluayBFQ1B1YmxpY0tleX0gdG8gYW4ge0BsaW5rIEVjUDI1NlB1YmxpY0tleX0gcHJvdG8gbWVzc2FnZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgRWNQMjU2UHVibGljS2V5IGVuY29kZUVjUHVibGljS2V5KFB1YmxpY0tleSBwaykgeworICAgIEVDUHVibGljS2V5IGVwayA9IHBrVG9FQ1B1YmxpY0tleShwayk7CisgICAgcmV0dXJuIEVjUDI1NlB1YmxpY0tleS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldFgoZXh0cmFjdFgoZXBrKSkKKyAgICAgICAgLnNldFkoZXh0cmFjdFkoZXBrKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgIH0KKworICAvKioKKyAgICogRW5jb2RlcyBhIDIwNDgtYml0IHtAbGluayBSU0FQdWJsaWNLZXl9IHRvIGFuIHtAbGluayBTaW1wbGVSc2FQdWJsaWNLZXl9IHByb3RvIG1lc3NhZ2UuCisgICAqLworICBwdWJsaWMgc3RhdGljIFNpbXBsZVJzYVB1YmxpY0tleSBlbmNvZGVSc2EyMDQ4UHVibGljS2V5KFB1YmxpY0tleSBwaykgeworICAgIFJTQVB1YmxpY0tleSBycGsgPSBwa1RvUlNBUHVibGljS2V5KHBrKTsKKyAgICByZXR1cm4gU2ltcGxlUnNhUHVibGljS2V5Lm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TihCeXRlU3RyaW5nLmNvcHlGcm9tKHJway5nZXRNb2R1bHVzKCkudG9CeXRlQXJyYXkoKSkpCisgICAgICAgIC5zZXRFKHJway5nZXRQdWJsaWNFeHBvbmVudCgpLmludFZhbHVlKCkpCisgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIEVuY29kZXMgYSAyMDQ4LWJpdCB7QGxpbmsgRGhQdWJsaWNLZXl9IHVzaW5nIHRoZSB7QGxpbmsgI0RIX0d9IGdyb3VwIHRvIGEKKyAgICoge0BsaW5rIERoUHVibGljS2V5fSBwcm90byBtZXNzYWdlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBEaFB1YmxpY0tleSBlbmNvZGVEaDIwNDhQdWJsaWNLZXkoUHVibGljS2V5IHBrKSB7CisgICAgREhQdWJsaWNLZXkgZGhwayA9IHBrVG9ESFB1YmxpY0tleShwayk7CisgICAgcmV0dXJuIERoUHVibGljS2V5Lm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0WShCeXRlU3RyaW5nLmNvcHlGcm9tKGRocGsuZ2V0WSgpLnRvQnl0ZUFycmF5KCkpKQorICAgICAgICAuYnVpbGQoKTsKKyAgfQorCisgIC8qKgorICAgKiBFeHRyYWN0cyBhIHtAbGluayBQdWJsaWNLZXl9IGZyb20gYW4ge0BsaW5rIEdlbmVyaWNQdWJsaWNLZXl9IHByb3RvIG1lc3NhZ2UuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gaWYgdGhlIGlucHV0IGlzIG5vdCBhIHZhbGlkIGFuZC9vciBzdXBwb3J0ZWQgcHVibGljIGtleSB0eXBlCisgICAqLworICBwdWJsaWMgc3RhdGljIFB1YmxpY0tleSBwYXJzZVB1YmxpY0tleShHZW5lcmljUHVibGljS2V5IGdwaykgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICBpZiAoIWdway5oYXNUeXBlKCkpIHsKKyAgICAgIC8vICJyZXF1aXJlZCIgbWVhbnMgbm90aGluZyBpbiBtaWNybyBwcm90byBsYW5kLiBXZSBoYXZlIHRvIGNoZWNrIHRoaXMgb3Vyc2VsdmVzLgorICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJHZW5lcmljUHVibGljS2V5LnR5cGUgaXMgYSByZXF1aXJlZCBmaWVsZCIpOworICAgIH0KKyAgICBzd2l0Y2ggKGdway5nZXRUeXBlKCkpIHsKKyAgICAgIGNhc2UgRUNfUDI1NjoKKyAgICAgICAgaWYgKCFncGsuaGFzRWNQMjU2UHVibGljS2V5KCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VFY1B1YmxpY0tleShncGsuZ2V0RWNQMjU2UHVibGljS2V5KCkpOworICAgICAgY2FzZSBSU0EyMDQ4OgorICAgICAgICBpZiAoIWdway5oYXNSc2EyMDQ4UHVibGljS2V5KCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VSc2EyMDQ4UHVibGljS2V5KGdway5nZXRSc2EyMDQ4UHVibGljS2V5KCkpOworICAgICAgY2FzZSBESDIwNDhfTU9EUDoKKyAgICAgICAgaWYgKCFncGsuaGFzRGgyMDQ4UHVibGljS2V5KCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VEaDIwNDhQdWJsaWNLZXkoZ3BrLmdldERoMjA0OFB1YmxpY0tleSgpKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgR2VuZXJpY1B1YmxpY0tleSB0eXBlOiAiICsgZ3BrLmdldFR5cGUoKSk7CisgICAgfQorICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigia2V5IG9iamVjdCBpcyBtaXNzaW5nIGZvciBrZXkgdHlwZTogIiArIGdway5nZXRUeXBlKCkpOworICB9CisKKyAgLyoqCisgICAqIEV4dHJhY3RzIGEge0BsaW5rIEVDUHVibGljS2V5fSBmcm9tIGFuIHtAbGluayBFY1AyNTZQdWJsaWNLZXl9IHByb3RvIG1lc3NhZ2UuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gaWYgdGhlIGlucHV0IGlzIG5vdCBhIHZhbGlkIE5JU1QgUC0yNTYgcHVibGljIGtleSBvciBpZgorICAgKiAgIHRoaXMgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBFbGxpcHRpYyBDdXJ2ZSBrZXlzCisgICAqLworICBwdWJsaWMgc3RhdGljIEVDUHVibGljS2V5IHBhcnNlRWNQdWJsaWNLZXkoRWNQMjU2UHVibGljS2V5IHAyNTZwaykKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgaWYgKCFwMjU2cGsuaGFzWCgpIHx8ICFwMjU2cGsuaGFzWSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oIktleSBpcyBtaXNzaW5nIGEgcmVxdWlyZWQgY29vcmRpbmF0ZSIpOworICAgIH0KKyAgICBpZiAoaXNMZWdhY3lDcnlwdG9SZXF1aXJlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oIkVsbGlwdGljIEN1cnZlIGtleXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgfQorICAgIGJ5dGVbXSBlbmNvZGVkWCA9IHAyNTZway5nZXRYKCkudG9CeXRlQXJyYXkoKTsKKyAgICBieXRlW10gZW5jb2RlZFkgPSBwMjU2cGsuZ2V0WSgpLnRvQnl0ZUFycmF5KCk7CisgICAgdHJ5IHsKKyAgICAgIHZhbGlkYXRlRWNQMjU2Q29vcmRpbmF0ZUVuY29kaW5nKGVuY29kZWRYKTsKKyAgICAgIHZhbGlkYXRlRWNQMjU2Q29vcmRpbmF0ZUVuY29kaW5nKGVuY29kZWRZKTsKKyAgICAgIEJpZ0ludGVnZXIgd1ggPSBuZXcgQmlnSW50ZWdlcihlbmNvZGVkWCk7CisgICAgICBCaWdJbnRlZ2VyIHdZID0gbmV3IEJpZ0ludGVnZXIoZW5jb2RlZFkpOworICAgICAgdmFsaWRhdGVFY1AyNTZDdXJ2ZVBvaW50KHdYLCB3WSk7CisgICAgICByZXR1cm4gKEVDUHVibGljS2V5KSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKEVDX0FMRykuZ2VuZXJhdGVQdWJsaWMoCisgICAgICAgICAgbmV3IEVDUHVibGljS2V5U3BlYyhuZXcgRUNQb2ludCh3WCwgd1kpLCBFQ19QMjU2X1BBUkFNUykpOworICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRXh0cmFjdHMgYSB7QGxpbmsgUlNBUHVibGljS2V5fSBmcm9tIGFuIHtAbGluayBTaW1wbGVSc2FQdWJsaWNLZXl9IHByb3RvIG1lc3NhZ2UuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gd2hlbiB0aGUgaW5wdXQgUlNBIHB1YmxpYyBrZXkgaXMgaW52YWxpZAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBSU0FQdWJsaWNLZXkgcGFyc2VSc2EyMDQ4UHVibGljS2V5KFNpbXBsZVJzYVB1YmxpY0tleSBwaykKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgaWYgKCFway5oYXNOKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigicmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZyIpOworICAgIH0KKyAgICBieXRlW10gZW5jb2RlZE4gPSBway5nZXROKCkudG9CeXRlQXJyYXkoKTsKKyAgICB2YWxpZGF0ZVNpbXBsZVJzYUVuY29kaW5nKGVuY29kZWROKTsKKyAgICBCaWdJbnRlZ2VyIG4gPSBuZXcgQmlnSW50ZWdlcihlbmNvZGVkTik7CisgICAgaWYgKG4uYml0TGVuZ3RoKCkgIT0gUlNBMjA0OF9NT0RVTFVTX0JJVFMpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigpOworICAgIH0KKyAgICBCaWdJbnRlZ2VyIGUgPSBCaWdJbnRlZ2VyLnZhbHVlT2YocGsuZ2V0RSgpKTsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIChSU0FQdWJsaWNLZXkpIEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoUlNBX0FMRykuZ2VuZXJhdGVQdWJsaWMoCisgICAgICAgICAgbmV3IFJTQVB1YmxpY0tleVNwZWMobiwgZSkpOworICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlMSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUxKTsgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICB9CisgIH0KKworICAvKioKKyAgICogRXh0cmFjdHMgYSB7QGxpbmsgREhQdWJsaWNLZXl9IGZyb20gYW4ge0BsaW5rIERoUHVibGljS2V5fSBwcm90byBtZXNzYWdlLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHdoZW4gdGhlIGlucHV0IERIIHB1YmxpYyBrZXkgaXMgaW52YWxpZAorICAgKi8KKyAgQFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclBlbmRpbmdSZXZpZXcgLy8gYi8zMjE0Mzg1NQorICBwdWJsaWMgc3RhdGljIERIUHVibGljS2V5IHBhcnNlRGgyMDQ4UHVibGljS2V5KERoUHVibGljS2V5IHBrKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgIGlmICghcGsuaGFzWSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oInJlcXVpcmVkIGZpZWxkIGlzIG1pc3NpbmciKTsKKyAgICB9CisgICAgYnl0ZVtdIGVuY29kZWRZID0gcGsuZ2V0WSgpLnRvQnl0ZUFycmF5KCk7CisgICAgdmFsaWRhdGVEaEVuY29kaW5nKGVuY29kZWRZKTsKKyAgICBCaWdJbnRlZ2VyIHk7CisgICAgdHJ5IHsKKyAgICAgIHkgPSBuZXcgQmlnSW50ZWdlcihlbmNvZGVkWSk7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigpOworICAgIH0KKyAgICB2YWxpZGF0ZURoR3JvdXBFbGVtZW50KHkpOworICAgIHRyeSB7CisgICAgICByZXR1cm4gKERIUHVibGljS2V5KSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKERIX0FMRykuZ2VuZXJhdGVQdWJsaWMoCisgICAgICAgICAgbmV3IERIUHVibGljS2V5U3BlYyh5LCBESF9QLCBESF9HKSk7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhIGZyZXNobHkgZ2VuZXJhdGVkIE5JU1QgUC0yNTYgRWxsaXB0aWMgQ3VydmUga2V5IHBhaXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIEtleVBhaXIgZ2VuZXJhdGVFY1AyNTZLZXlQYWlyKCkgeworICAgIHJldHVybiBnZXRFY0tleUdlbigpLmdlbmVyYXRlS2V5UGFpcigpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYSBmcmVzaGx5IGdlbmVyYXRlZCAyMDQ4LWJpdCBSU0Ega2V5IHBhaXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIEtleVBhaXIgZ2VuZXJhdGVSU0EyMDQ4S2V5UGFpcigpIHsKKyAgICByZXR1cm4gZ2V0UnNhS2V5R2VuKCkuZ2VuZXJhdGVLZXlQYWlyKCk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhIGZyZXNobHkgZ2VuZXJhdGVkIERpZmZpZS1IZWxsbWFuIGtleSBwYWlyIGZvciB0aGUgMjA0OC1iaXQgZ3JvdXAKKyAgICogICBkZXNjcmliZWQgYnkge0BsaW5rICNESF9HfQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBLZXlQYWlyIGdlbmVyYXRlRGgyMDQ4S2V5UGFpcigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGdldERoS2V5R2VuKCkuZ2VuZXJhdGVLZXlQYWlyKCk7CisgICAgfSBjYXRjaCAoSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBDb25zdHJ1Y3QgYW4gYXBwcm9wcmlhdGUgS2V5UGFpciBtYW51YWxseSwgc2luY2UgdGhpcyBwbGF0Zm9ybSByZWZ1c2VzIHRvIGRvIGl0IGZvciB1cworICAgICAgREhQYXJhbWV0ZXJTcGVjIHNwZWMgPSBuZXcgREhQYXJhbWV0ZXJTcGVjKERIX1AsIERIX0cpOworICAgICAgQmlnSW50ZWdlciB4ID0gbmV3IEJpZ0ludGVnZXIoREhfTEVOLCBuZXcgU2VjdXJlUmFuZG9tKCkpOworICAgICAgREhQcml2YXRlS2V5IHByaXZhdGVLZXkgPSBuZXcgREhQcml2YXRlS2V5U2hpbSh4LCBzcGVjKTsKKyAgICAgIERIUHVibGljS2V5IHB1YmxpY0tleSA9IG5ldyBESFB1YmxpY0tleVNoaW0oREhfRy5tb2RQb3coeCwgREhfUCksIHNwZWMpOworICAgICAgcmV0dXJuIG5ldyBLZXlQYWlyKHB1YmxpY0tleSwgcHJpdmF0ZUtleSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEEgbGlnaHR3ZWlnaHQgZW5jb2RpbmcgZm9yIGEge0BsaW5rIERIUHJpdmF0ZUtleX0uIFN0cm9uZ2x5IHJlY29tbWVuZGVkIG92ZXIgYXR0ZW1wdGluZyB0byB1c2UKKyAgICoge0BsaW5rIERIUHJpdmF0ZUtleSNnZXRFbmNvZGVkKCl9LCBidXQgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQgZW5jb2RpbmcuCisgICAqCisgICAqIEBzZWUgI3BhcnNlRGgyMDQ4UHJpdmF0ZUtleShieXRlW10pCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVEaDIwNDhQcml2YXRlS2V5KERIUHJpdmF0ZUtleSBzaykgeworICAgIHJldHVybiBzay5nZXRYKCkudG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgYSB7QGxpbmsgREhQcml2YXRlS2V5fSBlbmNvZGVkIHdpdGgge0BsaW5rICNlbmNvZGVEaDIwNDhQcml2YXRlS2V5KERIUHJpdmF0ZUtleSl9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBESFByaXZhdGVLZXkgcGFyc2VEaDIwNDhQcml2YXRlS2V5KGJ5dGVbXSBlbmNvZGVkWCkKKyAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgdmFsaWRhdGVEaEVuY29kaW5nKGVuY29kZWRYKTsgIC8vIENvdWxkIGJlIHN0cmljdGVyIGZvciB4LCBidXQgc2hvdWxkIGJlIGZpbmUgdG8gdXNlIHRoaXMKKyAgICBCaWdJbnRlZ2VyIHg7CisgICAgdHJ5IHsKKyAgICAgIHggPSBuZXcgQmlnSW50ZWdlcihlbmNvZGVkWCk7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigpOworICAgIH0KKyAgICB2YWxpZGF0ZURoR3JvdXBFbGVtZW50KHgpOyAgLy8gQWdhaW4sIHRoaXMgdmFsaWRhdGlvbiBzaG91bGQgYmUgZ29vZCBlbm91Z2gKKyAgICByZXR1cm4gbmV3IERIUHJpdmF0ZUtleVNoaW0oeCwgbmV3IERIUGFyYW1ldGVyU3BlYyhESF9QLCBESF9HKSk7CisgIH0KKworICAvKioKKyAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBpZiBwb2ludCAoe0Bjb2RlIHh9LHtAY29kZSB5fSkgaXNuJ3Qgb24gdGhlIE5JU1QgUC0yNTYgY3VydmUKKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVFY1AyNTZDdXJ2ZVBvaW50KEJpZ0ludGVnZXIgeCwgQmlnSW50ZWdlciB5KQorICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICBpZiAoKHguc2lnbnVtKCkgPT0gLTEpIHx8ICh5LnNpZ251bSgpID09IC0xKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJQb2ludCBlbmNvZGluZyBtdXN0IHVzZSBvbmx5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyIpOworICAgIH0KKworICAgIEJpZ0ludGVnZXIgcCA9IEVDX1AyNTZfUDsKKyAgICBpZiAoKHguY29tcGFyZVRvKHApID49IDApIHx8ICh5LmNvbXBhcmVUbyhwKSA+PSAwKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJQb2ludCBsaWVzIG91dHNpZGUgb2YgdGhlIGV4cGVjdGVkIGZpZWxkIik7CisgICAgfQorCisgICAgLy8gUG9pbnRzIG9uIHRoZSBjdXJ2ZSBzYXRpc2Z5IHleMiA9IHheMyArIGF4ICsgYiAgKG1vZCBwKQorICAgIEJpZ0ludGVnZXIgbGhzID0gc3F1YXJlTW9kKHksIHApOworICAgIEJpZ0ludGVnZXIgcmhzID0gc3F1YXJlTW9kKHgsIHApLmFkZChFQ19QMjU2X0EpIC8vID0gKHheMiArIGEpCisgICAgICAgIC5tdWx0aXBseSh4KS5tb2QocCkgLy8gPSB4KHheMiArIGEpID0geF4zICsgYXgKKyAgICAgICAgLmFkZChFQ19QMjU2X0IpIC8vID0geF4zICsgYXggKyBiCisgICAgICAgIC5tb2QocCk7CisgICAgaWYgKCFsaHMuZXF1YWxzKHJocykpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigiUG9pbnQgZG9lcyBub3QgbGllIG9uIHRoZSBleHBlY3RlZCBjdXJ2ZSIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHZhbHVlIG9mIHtAY29kZSB4fV4yIChtb2Qge0Bjb2RlIHB9KQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBzcXVhcmVNb2QoQmlnSW50ZWdlciB4LCBCaWdJbnRlZ2VyIHApIHsKKyAgICByZXR1cm4geC5tdWx0aXBseSh4KS5tb2QocCk7CisgIH0KKworICAvKioKKyAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBpZiB0aGUgY29vcmRpbmF0ZSBpcyB0b28gbGFyZ2UgZm9yIGEgMjU2LWJpdCBjdXJ2ZQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUVjUDI1NkNvb3JkaW5hdGVFbmNvZGluZyhieXRlW10gcCkgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICBpZiAoKHAubGVuZ3RoID09IDApCisgICAgICAgIHx8IChwLmxlbmd0aCA+IE1BWF9QMjU2X0VOQ09ESU5HX0JZVEVTKQorICAgICAgICB8fCAocC5sZW5ndGggPT0gTUFYX1AyNTZfRU5DT0RJTkdfQllURVMgJiYgcFswXSAhPSAwKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCk7ICAvLyBJbnRlbnRpb25hbGx5IHZhZ3VlIGZvciBzZWN1cml0eSByZWFzb25zCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gaWYgdGhlIGlucHV0IGlzIHRvbyBsYXJnZSBmb3IgYSAyMDQ4LWJpdCBSU0EgbW9kdWx1cworICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVNpbXBsZVJzYUVuY29kaW5nKGJ5dGVbXSBuKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgIGlmIChuLmxlbmd0aCA9PSAwIHx8IG4ubGVuZ3RoID4gTUFYX1JTQTIwNDhfRU5DT0RJTkdfQllURVMpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGlmIHRoZSBwdWJsaWMga2V5IGlzIHRvbyBsYXJnZSBmb3IgYSAyMDQ4LWJpdCBESCBncm91cAorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZURoRW5jb2RpbmcoYnl0ZVtdIHkpIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgaWYgKHkubGVuZ3RoID09IDAgfHwgeS5sZW5ndGggPiBNQVhfREgyMDQ4X0VOQ09ESU5HX0JZVEVTKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBpZiB7QGNvZGUgeX0gaXMgbm90IGEgdmFsaWQgRGlmZmllLUhlbGxtYW4gcHVibGljIGtleQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZURoR3JvdXBFbGVtZW50KEJpZ0ludGVnZXIgeSkgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICAvLyBDaGVjayB0aGF0IDEgPCB5IDwgcCAtMQorICAgIGlmICgoeS5jb21wYXJlVG8oT05FKSA8IDEpIHx8ICh5LmNvbXBhcmVUbyhESF9QLnN1YnRyYWN0KE9ORSkpID4gLTEpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIGV4dHJhY3RZKEVDUHVibGljS2V5IGVwaykgeworICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKGVway5nZXRXKCkuZ2V0QWZmaW5lWSgpLnRvQnl0ZUFycmF5KCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBleHRyYWN0WChFQ1B1YmxpY0tleSBlcGspIHsKKyAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShlcGsuZ2V0VygpLmdldEFmZmluZVgoKS50b0J5dGVBcnJheSgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEVDUHVibGljS2V5IHBrVG9FQ1B1YmxpY0tleShQdWJsaWNLZXkgcGspIHsKKyAgICBpZiAocGsgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlmICghKHBrIGluc3RhbmNlb2YgRUNQdWJsaWNLZXkpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYW4gRUMgUHVibGljIEtleSIpOworICAgIH0KKyAgICByZXR1cm4gKEVDUHVibGljS2V5KSBwazsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJTQVB1YmxpY0tleSBwa1RvUlNBUHVibGljS2V5KFB1YmxpY0tleSBwaykgeworICAgIGlmIChwayA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKCEocGsgaW5zdGFuY2VvZiBSU0FQdWJsaWNLZXkpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYW4gUlNBIFB1YmxpYyBLZXkiKTsKKyAgICB9CisgICAgcmV0dXJuIChSU0FQdWJsaWNLZXkpIHBrOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgREhQdWJsaWNLZXkgcGtUb0RIUHVibGljS2V5KFB1YmxpY0tleSBwaykgeworICAgIGlmIChwayA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKCEocGsgaW5zdGFuY2VvZiBESFB1YmxpY0tleSkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBhIERIIFB1YmxpYyBLZXkiKTsKKyAgICB9CisgICAgcmV0dXJuIChESFB1YmxpY0tleSkgcGs7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhbiBFQyB7QGxpbmsgS2V5UGFpckdlbmVyYXRvcn0gb2JqZWN0IGluaXRpYWxpemVkIGZvciBOSVNUIFAtMjU2LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgS2V5UGFpckdlbmVyYXRvciBnZXRFY0tleUdlbigpIHsKKyAgICBLZXlQYWlyR2VuZXJhdG9yIGtleWdlbjsKKyAgICB0cnkgeworICAgICAga2V5Z2VuID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZShFQ19BTEcpOworICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIC8vIFRyeSB1c2luZyB0aGUgT3BlblNTTCBwcm92aWRlciBmaXJzdCwgc2luY2Ugd2UgcHJlZmVyIGl0IG92ZXIgQm91bmN5Q2FzdGxlCisgICAgICBrZXlnZW4uaW5pdGlhbGl6ZShuZXcgRUNHZW5QYXJhbWV0ZXJTcGVjKEVDX1AyNTZfT1BFTlNTTF9OQU1FKSk7CisgICAgICByZXR1cm4ga2V5Z2VuOworICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gVHJ5IGFub3RoZXIgbmFtZSBmb3IgTklTVCBQLTI1NgorICAgIH0KKyAgICB0cnkgeworICAgICAga2V5Z2VuLmluaXRpYWxpemUobmV3IEVDR2VuUGFyYW1ldGVyU3BlYyhFQ19QMjU2X0NPTU1PTl9OQU1FKSk7CisgICAgICByZXR1cm4ga2V5Z2VuOworICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIHRoZSBOSVNUIFAtMjU2IGN1cnZlIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYW4gUlNBIHtAbGluayBLZXlQYWlyR2VuZXJhdG9yfSBvYmplY3QgaW5pdGlhbGl6ZWQgZm9yIDIwNDgtYml0IGtleXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBLZXlQYWlyR2VuZXJhdG9yIGdldFJzYUtleUdlbigpIHsKKyAgICB0cnkgeworICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlnZW4gPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKFJTQV9BTEcpOworICAgICAga2V5Z2VuLmluaXRpYWxpemUoUlNBMjA0OF9NT0RVTFVTX0JJVFMpOworICAgICAgcmV0dXJuIGtleWdlbjsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOyAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYSBESCB7QGxpbmsgS2V5UGFpckdlbmVyYXRvcn0gb2JqZWN0IGluaXRpYWxpemVkIGZvciB0aGUgZ3JvdXAgZGVzY3JpYmVkIGJ5IHtAbGluaworICAgKiAgICAgI0RIX0d9LgorICAgKiBAdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gb24gc29tZSBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IGxhcmdlIERIIGdyb3VwcworICAgKi8KKyAgQFN1cHByZXNzSW5zZWN1cmVDaXBoZXJNb2RlQ2hlY2tlclBlbmRpbmdSZXZpZXcgLy8gYi8zMjE0Mzg1NQorICBwcml2YXRlIHN0YXRpYyBLZXlQYWlyR2VuZXJhdG9yIGdldERoS2V5R2VuKCkgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBLZXlQYWlyR2VuZXJhdG9yIGtleWdlbiA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoREhfQUxHKTsKKyAgICAgIGtleWdlbi5pbml0aWFsaXplKG5ldyBESFBhcmFtZXRlclNwZWMoREhfUCwgREhfRywgREhfTEVOKSk7CisgICAgICByZXR1cm4ga2V5Z2VuOworICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7ICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQSBsaWdodHdlaWdodCBzaGltIGNsYXNzIHRvIGVuYWJsZSB0aGUgY3JlYXRpb24gb2Yge0BsaW5rIERIUHVibGljS2V5fSBhbmQge0BsaW5rIERIUHJpdmF0ZUtleX0KKyAgICogb2JqZWN0cyB0aGF0IGFjY2VwdCBhcmJpdHJhcnkge0BsaW5rIERIUGFyYW1ldGVyU3BlY31zIC0tIHVuZm9ydHVuYXRlbHksIG1hbnkgcGxhdGZvcm1zIGRvCisgICAqIG5vdCBzdXBwb3J0IHVzaW5nIHJlYXNvbmFibHkgc2l6ZWQgRGlmZmllLUhlbGxtYW4gZ3JvdXBzIGFueSBvdGhlciB3YXkuIEZvciBpbnN0YW5jZSwgc2VlCisgICAqIDxhIGhyZWY9Imh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTY1MjE0OTUiPkphdmEgYnVnIDY1MjE0OTU8L2E+LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBESEtleVNoaW0geworCisgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGVpdGhlclhvclk7CisgICAgcHJpdmF0ZSBESFBhcmFtZXRlclNwZWMgcGFyYW1zOworCisgICAgcHVibGljIERIS2V5U2hpbShCaWdJbnRlZ2VyIGVpdGhlclhvclksIERIUGFyYW1ldGVyU3BlYyBwYXJhbXMpIHsKKyAgICAgIHRoaXMuZWl0aGVyWG9yWSA9IGVpdGhlclhvclk7CisgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICB9CisKKyAgICBwdWJsaWMgREhQYXJhbWV0ZXJTcGVjIGdldFBhcmFtcygpIHsKKyAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CisgICAgICByZXR1cm4gIkRIIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFgoKSB7CisgICAgICByZXR1cm4gZWl0aGVyWG9yWTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRZKCkgeworICAgICAgcmV0dXJuIGVpdGhlclhvclk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEEgc2ltcGxlIHtAbGluayBESFB1YmxpY0tleX0gaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqIEBzZWUgREhLZXlTaGltCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIERIUHVibGljS2V5U2hpbSBleHRlbmRzIERIS2V5U2hpbSBpbXBsZW1lbnRzIERIUHVibGljS2V5IHsKKyAgICBwdWJsaWMgREhQdWJsaWNLZXlTaGltKEJpZ0ludGVnZXIgeSwgREhQYXJhbWV0ZXJTcGVjIHBhcmFtcykgeworICAgICAgc3VwZXIoeSwgcGFyYW1zKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQSBzaW1wbGUge0BsaW5rIERIUHJpdmF0ZUtleX0gaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqIEBzZWUgREhLZXlTaGltCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIERIUHJpdmF0ZUtleVNoaW0gZXh0ZW5kcyBESEtleVNoaW0gaW1wbGVtZW50cyBESFByaXZhdGVLZXkgeworICAgIHB1YmxpYyBESFByaXZhdGVLZXlTaGltKEJpZ0ludGVnZXIgeCwgREhQYXJhbWV0ZXJTcGVjIHBhcmFtcykgeworICAgICAgc3VwZXIoeCwgcGFyYW1zKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBFbGxpcHRpYyBDdXJ2ZSBhbGdvcml0aG1zCisgICAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lDcnlwdG9SZXF1aXJlZCgpIHsKKyAgICByZXR1cm4gSVNfTEVHQUNZX0NSWVBUT19SRVFVSVJFRDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdXNpbmcgdGhlIEVsbGlwdGljIEN1cnZlIGtleSBnZW5lcmF0b3IgZmFpbHMgb24gdGhpcyBwbGF0Zm9ybQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZXRlcm1pbmVJZkxlZ2FjeUNyeXB0b1JlcXVpcmVkKCkgeworICAgIHRyeSB7CisgICAgICBnZXRFY0tleUdlbigpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9saWIvc2VjdXJlbWVzc2FnZS9TZWN1cmVNZXNzYWdlQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZW1lc3NhZ2UvU2VjdXJlTWVzc2FnZUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTljZTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZW1lc3NhZ2UvU2VjdXJlTWVzc2FnZUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5DcnlwdG9PcHMuRW5jVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5DcnlwdG9PcHMuU2lnVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uSGVhZGVyOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLlNlY3VyZU1lc3NhZ2VQcm90by5IZWFkZXJBbmRCb2R5SW50ZXJuYWw7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVByb3RvLlNlY3VyZU1lc3NhZ2U7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBCdWlsZGVyIGZvciB7QGxpbmsgU2VjdXJlTWVzc2FnZX0gcHJvdG9zLiBDYW4gYmUgdXNlZCB0byBjcmVhdGUgZWl0aGVyIHNpZ25lZCBtZXNzYWdlcywKKyAqIG9yICJzaWduY3J5cHRlZCIgKGVuY3J5cHRlZCB0aGVuIHNpZ25lZCkgbWVzc2FnZXMgdGhhdCBpbmNsdWRlIGEgdGlnaHQgYmluZGluZyBiZXR3ZWVuIHRoZQorICogY2lwaGVydGV4dCBwb3J0aW9uIGFuZCBhIHZlcmlmaWNhdGlvbiBrZXkgaWRlbnRpdHkuCisgKgorICogQHNlZSBTZWN1cmVNZXNzYWdlUGFyc2VyCisgKi8KK3B1YmxpYyBjbGFzcyBTZWN1cmVNZXNzYWdlQnVpbGRlciB7CisgIHByaXZhdGUgQnl0ZVN0cmluZyBwdWJsaWNNZXRhZGF0YTsKKyAgcHJpdmF0ZSBCeXRlU3RyaW5nIHZlcmlmaWNhdGlvbktleUlkOworICBwcml2YXRlIEJ5dGVTdHJpbmcgZGVjcnlwdGlvbktleUlkOworICAvKioKKyAgICogVGhpcyBkYXRhIGlzIG5ldmVyIHNlbnQgaW5zaWRlIHRoZSBwcm90b2J1ZnMsIHNvIHRoZSBidWlsZGVyIGp1c3Qgc2F2ZXMgaXQgYXMgYSBieXRlW10uCisgICAqLworICBwcml2YXRlIGJ5dGVbXSBhc3NvY2lhdGVkRGF0YTsKKworICBwcml2YXRlIFNlY3VyZVJhbmRvbSBybmc7CisKKyAgcHVibGljIFNlY3VyZU1lc3NhZ2VCdWlsZGVyKCkgeworICAgIHJlc2V0KCk7CisgICAgdGhpcy5ybmcgPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisgIH0KKworICAvKioKKyAgICogUmVzZXRzIHRoaXMge0BsaW5rIFNlY3VyZU1lc3NhZ2VCdWlsZGVyfSBpbnN0YW5jZSB0byBhIGJsYW5rIGNvbmZpZ3VyYXRpb24gKGFuZCByZXR1cm5zIGl0KS4KKyAgICovCisgIHB1YmxpYyBTZWN1cmVNZXNzYWdlQnVpbGRlciByZXNldCgpIHsKKyAgICB0aGlzLnB1YmxpY01ldGFkYXRhID0gbnVsbDsKKyAgICB0aGlzLnZlcmlmaWNhdGlvbktleUlkID0gbnVsbDsKKyAgICB0aGlzLmRlY3J5cHRpb25LZXlJZCA9IG51bGw7CisgICAgdGhpcy5hc3NvY2lhdGVkRGF0YSA9IG51bGw7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogT3B0aW9uYWwgbWV0YWRhdGEgdG8gYmUgc2VudCBhbG9uZyB3aXRoIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gaW4gdGhpcyB7QGxpbmsgU2VjdXJlTWVzc2FnZX0uCisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgPGVtPlVORU5DUllQVEVEPC9lbT4gaW4gYWxsIGNhc2VzLgorICAgKiA8cD4KKyAgICogQ2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgY2xlYXJ0ZXh0IG9yIHNpZ25jcnlwdGVkIG1lc3NhZ2VzLCBidXQgaXMgaW50ZW5kZWQgcHJpbWFyaWx5IGZvciB1c2UKKyAgICogd2l0aCBzaWduY3J5cHRlZCBtZXNzYWdlcy4KKyAgICovCisgIHB1YmxpYyBTZWN1cmVNZXNzYWdlQnVpbGRlciBzZXRQdWJsaWNNZXRhZGF0YShieXRlW10gcHVibGljTWV0YWRhdGEpIHsKKyAgICB0aGlzLnB1YmxpY01ldGFkYXRhID0gQnl0ZVN0cmluZy5jb3B5RnJvbShwdWJsaWNNZXRhZGF0YSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogVGhlIHJlY2lwaWVudCBvZiB0aGUge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGRldGVybWluZSB0aGUgY29ycmVjdAorICAgKiB2ZXJpZmljYXRpb24ga2V5LCBnaXZlbiBvbmx5IHRoaXMgdmFsdWUuCisgICAqIDxwPgorICAgKiBDYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBjbGVhcnRleHQgb3Igc2lnbmNyeXB0ZWQgbWVzc2FnZXMuIFNldHRpbmcgdGhpcyBpcyBtYW5kYXRvcnkgZm9yCisgICAqIHNpZ25jcnlwdGVkIG1lc3NhZ2VzIHVzaW5nIGEgcHVibGljIGtleSB7QGxpbmsgU2lnVHlwZX0sIGluIG9yZGVyIHRvIGJpbmQgdGhlIGVuY3J5cHRlZAorICAgKiBib2R5IHRvIGEgc3BlY2lmaWMgdmVyaWZpY2F0aW9uIGtleS4KKyAgICogPHA+CisgICAqIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGlzIHNlbnQgPGVtPlVORU5DUllQVEVEPC9lbT4gaW4gYWxsIGNhc2VzLgorICAgKi8KKyAgcHVibGljIFNlY3VyZU1lc3NhZ2VCdWlsZGVyIHNldFZlcmlmaWNhdGlvbktleUlkKGJ5dGVbXSB2ZXJpZmljYXRpb25LZXlJZCkgeworICAgIHRoaXMudmVyaWZpY2F0aW9uS2V5SWQgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHZlcmlmaWNhdGlvbktleUlkKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBUbyBiZSB1c2VkIG9ubHkgd2l0aCB7QGxpbmsgI2J1aWxkU2lnbkNyeXB0ZWRNZXNzYWdlKEtleSwgU2lnVHlwZSwgS2V5LCBFbmNUeXBlLCBieXRlW10pfSwKKyAgICogdGhpcyB2YWx1ZSBpcyBzZW50IDxlbT5VTkVOQ1JZUFRFRDwvZW0+IGFzIHBhcnQgb2YgdGhlIGhlYWRlci4gSXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlCisgICAqIHJlY2lwaWVudCBvZiB0aGUge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IHRvIGlkZW50aWZ5IGFuIGFwcHJvcHJpYXRlIGtleSB0byB1c2UgZm9yIGRlY3J5cHRpbmcKKyAgICogdGhlIG1lc3NhZ2UgYm9keS4KKyAgICovCisgIHB1YmxpYyBTZWN1cmVNZXNzYWdlQnVpbGRlciBzZXREZWNyeXB0aW9uS2V5SWQoYnl0ZVtdIGRlY3J5cHRpb25LZXlJZCkgeworICAgIHRoaXMuZGVjcnlwdGlvbktleUlkID0gQnl0ZVN0cmluZy5jb3B5RnJvbShkZWNyeXB0aW9uS2V5SWQpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIEFkZGl0aW9uYWwgZGF0YSBpcyAiYXNzb2NpYXRlZCIgd2l0aCB0aGlzIHtAbGluayBTZWN1cmVNZXNzYWdlfSwgYnV0IHdpbGwgbm90IGJlIHNlbnQgYXMKKyAgICogcGFydCBvZiBpdC4gVGhlIHJlY2lwaWVudCBvZiB0aGUge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IHdpbGwgbmVlZCB0byBwcm92aWRlIHRoZSBzYW1lIGRhdGEgaW4KKyAgICogb3JkZXIgdG8gdmVyaWZ5IHRoZSBtZXNzYWdlIGJvZHkuIFNldHRpbmcgdGhpcyB0byB7QGNvZGUgbnVsbH0gaXMgZXF1aXZhbGVudCB0byB1c2luZyBhbgorICAgKiBlbXB0eSBhcnJheSAodW5saWtlIHRoZSBiZWhhdmlvciBvZiB7QGNvZGUgVmVyaWZpY2F0aW9uS2V5SWR9IGFuZCB7QGNvZGUgRGVjcnlwdGlvbktleUlkfSkuCisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgdGhlIDxlbT5zaXplPC9lbT4gKGxlbmd0aCBpbiBieXRlcykgb2YgdGhlIGFzc29jaWF0ZWQgZGF0YSB3aWxsIGJlIHNlbnQgaW4gdGhlCisgICAqIDxlbT5VTkVOQ1JZUFRFRDwvZW0+IGhlYWRlciBpbmZvcm1hdGlvbiwgZXZlbiBpZiB5b3UgYXJlIHVzaW5nIGVuY3J5cHRpb24uCisgICAqIDxwPgorICAgKiBJZiB5b3Ugd2lsbCBiZSB1c2luZyB7QGxpbmsgI2J1aWxkU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZShLZXksIFNpZ1R5cGUsIGJ5dGVbXSl9LCB0aGVuIGFueW9uZQorICAgKiBvYnNlcnZpbmcgdGhlIHtAbGluayBTZWN1cmVNZXNzYWdlfSBtYXkgYmUgYWJsZSB0byBpbmZlciB0aGlzIGFzc29jaWF0ZWQgZGF0YSB2aWEgYW4KKyAgICogIm9mZmxpbmUgZGljdGlvbmFyeSBhdHRhY2siLiBUaGF0IGlzLCB3aGVuIG5vIGVuY3J5cHRpb24gaXMgdXNlZCwgeW91IHdpbGwgbm90IGJlIGhpZGluZyB0aGlzCisgICAqIGRhdGEgc2ltcGx5IGJlY2F1c2UgaXQgaXMgbm90IGJlaW5nIHNlbnQgb3ZlciB0aGUgd2lyZS4KKyAgICovCisgIHB1YmxpYyBTZWN1cmVNZXNzYWdlQnVpbGRlciBzZXRBc3NvY2lhdGVkRGF0YShATnVsbGFibGUgYnl0ZVtdIGFzc29jaWF0ZWREYXRhKSB7CisgICB0aGlzLmFzc29jaWF0ZWREYXRhID0gYXNzb2NpYXRlZERhdGE7CisgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8vIEBWaXNpYmxlRm9yVGVzdGluZworICBTZWN1cmVNZXNzYWdlQnVpbGRlciBzZXRSbmcoU2VjdXJlUmFuZG9tIHJuZykgeworICAgIHRoaXMucm5nID0gcm5nOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhIHNpZ25lZCB7QGxpbmsgU2VjdXJlTWVzc2FnZX0gd2l0aCB0aGUgcGF5bG9hZCB7QGNvZGUgYm9keX0gbGVmdAorICAgKiA8ZW0+VU5FTkNSWVBURUQ8L2VtPi4KKyAgICoKKyAgICogPHA+Tm90ZSB0aGF0IGlmIHlvdSBoYXZlIHVzZWQge0BsaW5rICNzZXRBc3NvY2lhdGVkRGF0YShieXRlW10pfSwgdGhlIGFzc29jaWF0ZWQgZGF0YSB3aWxsCisgICAqIGJlIHN1YmplY3QgdG8gb2ZmbGluZSBkaWN0aW9uYXJ5IGF0dGFja3MgaWYgeW91IHVzZSBhIHB1YmxpYyBrZXkge0BsaW5rIFNpZ1R5cGV9LgorICAgKgorICAgKiA8cD5Eb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0IHN5bW1ldHJpYyBrZXlzIHN0b3JlZCBpbiBhIFRQTSAoc2luY2Ugd2UgYWNjZXNzIHRoZSByYXcga2V5KS4KKyAgICoKKyAgICogQHNlZSBTZWN1cmVNZXNzYWdlUGFyc2VyI3BhcnNlU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZShTZWN1cmVNZXNzYWdlLCBLZXksIFNpZ1R5cGUpCisgICAqLworICBwdWJsaWMgU2VjdXJlTWVzc2FnZSBidWlsZFNpZ25lZENsZWFydGV4dE1lc3NhZ2UoS2V5IHNpZ25pbmdLZXksIFNpZ1R5cGUgc2lnVHlwZSwgYnl0ZVtdIGJvZHkpCisgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgaWYgKChzaWduaW5nS2V5ID09IG51bGwpIHx8IChzaWdUeXBlID09IG51bGwpIHx8IChib2R5ID09IG51bGwpKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKGRlY3J5cHRpb25LZXlJZCAhPSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGRlY3J5cHRpb25LZXlJZCBmb3IgYSBjbGVhcnRleHQgbWVzc2FnZSIpOworICAgIH0KKworICAgIGJ5dGVbXSBoZWFkZXJBbmRCb2R5ID0gc2VyaWFsaXplSGVhZGVyQW5kQm9keSgKKyAgICAgICAgYnVpbGRIZWFkZXIoc2lnVHlwZSwgRW5jVHlwZS5OT05FLCBudWxsKS50b0J5dGVBcnJheSgpLCBib2R5KTsKKyAgICByZXR1cm4gY3JlYXRlU2lnbmVkUmVzdWx0KHNpZ25pbmdLZXksIHNpZ1R5cGUsIGhlYWRlckFuZEJvZHksIGFzc29jaWF0ZWREYXRhKTsKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmF0ZXMgYSBzaWduZWQgYW5kIGVuY3J5cHRlZCB7QGxpbmsgU2VjdXJlTWVzc2FnZX0uIElmIHRoZSBzaWduYXR1cmUgdHlwZSByZXF1aXJlcyBhIHB1YmxpYworICAgKiBrZXksIHN1Y2ggYXMgd2l0aCBFQ0RTQV9QMjU2X1NIQTI1NiwgdGhlbiB0aGUgY2FsbGVyIDxlbT5tdXN0PC9lbT4gc2V0IGEgdmVyaWZpY2F0aW9uIGlkIHVzaW5nCisgICAqIHRoZSB7QGxpbmsgI3NldFZlcmlmaWNhdGlvbktleUlkKGJ5dGVbXSl9IG1ldGhvZC4gVGhlIHZlcmlmaWNhdGlvbiBrZXkgaWQgd2lsbCBiZSBib3VuZCB0byB0aGUKKyAgICogZW5jcnlwdGVkIHtAY29kZSBib2R5fSwgcHJldmVudGluZyBhdHRhY2tzIHRoYXQgaW52b2x2ZSBzdHJpcHBpbmcgdGhlIHNpZ25hdHVyZSBhbmQgdGhlbgorICAgKiByZS1zaWduaW5nIHRoZSBlbmNyeXB0ZWQge0Bjb2RlIGJvZHl9IGFzIGlmIGl0IHdhcyBvcmlnaW5hbGx5IHNlbnQgYnkgdGhlIGF0dGFja2VyLgorICAgKgorICAgKiA8cD4KKyAgICogSXQgaXMgc2FmZSB0byByZS11c2Ugb25lIHtAbGluayBqYXZheC5jcnlwdG8uU2VjcmV0S2V5fSBhcyBib3RoIHtAY29kZSBzaWduaW5nS2V5fSBhbmQKKyAgICoge0Bjb2RlIGVuY3J5cHRpb25LZXl9LCBldmVuIGlmIHRoYXQga2V5IGlzIGFsc28gdXNlZCBmb3IKKyAgICoge0BsaW5rICNidWlsZFNpZ25lZENsZWFydGV4dE1lc3NhZ2UoS2V5LCBTaWdUeXBlLCBieXRlW10pfS4gSW4gZmFjdCwgdGhlIHJlc3VsdGluZyBvdXRwdXQKKyAgICogZW5jb2Rpbmcgd2lsbCBiZSBtb3JlIGNvbXBhY3Qgd2hlbiB0aGUgc2FtZSBzeW1tZXRyaWMga2V5IGlzIHVzZWQgZm9yIGJvdGguCisgICAqCisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgUHVibGljTWV0YWRhdGEgYW5kIG90aGVyIGhlYWRlciBmaWVsZHMgYXJlIGxlZnQgPGVtPlVORU5DUllQVEVEPC9lbT4uCisgICAqCisgICAqIDxwPgorICAgKiBEb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0IHN5bW1ldHJpYyBrZXlzIHN0b3JlZCBpbiBhIFRQTSAoc2luY2Ugd2UgYWNjZXNzIHRoZSByYXcga2V5KS4KKyAgICoKKyAgICogQHBhcmFtIGVuY1R5cGUgPGVtPm11c3Qgbm90PC9lbT4gYmUgc2V0IHRvIHtAbGluayBFbmNUeXBlI05PTkV9CisgICAqIEBzZWUgU2VjdXJlTWVzc2FnZVBhcnNlciNwYXJzZVNpZ25DcnlwdGVkTWVzc2FnZShTZWN1cmVNZXNzYWdlLCBLZXksIFNpZ1R5cGUsIEtleSwgRW5jVHlwZSkKKyAgICovCisgIHB1YmxpYyBTZWN1cmVNZXNzYWdlIGJ1aWxkU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgICAgS2V5IHNpZ25pbmdLZXksIFNpZ1R5cGUgc2lnVHlwZSwgS2V5IGVuY3J5cHRpb25LZXksIEVuY1R5cGUgZW5jVHlwZSwgYnl0ZVtdIGJvZHkpCisgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgaWYgKChzaWduaW5nS2V5ID09IG51bGwpCisgICAgICAgIHx8IChzaWdUeXBlID09IG51bGwpCisgICAgICAgIHx8IChlbmNyeXB0aW9uS2V5ID09IG51bGwpCisgICAgICAgIHx8IChlbmNUeXBlID09IG51bGwpCisgICAgICAgIHx8IChib2R5ID09IG51bGwpKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKGVuY1R5cGUgPT0gRW5jVHlwZS5OT05FKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVuY1R5cGUgKyAiIG5vdCBzdXBwb3J0ZWQgZm9yIGVuY3J5cHRlZCBtZXNzYWdlcyIpOworICAgIH0KKyAgICBpZiAoc2lnVHlwZS5pc1B1YmxpY0tleVNjaGVtZSgpICYmICh2ZXJpZmljYXRpb25LZXlJZCA9PSBudWxsKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAiTXVzdCBzZXQgYSB2ZXJpZmljYXRpb25LZXlJZCB3aGVuIHVzaW5nIHB1YmxpYyBrZXkgc2lnbmF0dXJlIHdpdGggZW5jcnlwdGlvbiIpOworICAgIH0KKworICAgIGJ5dGVbXSBpdiA9IENyeXB0b09wcy5nZW5lcmF0ZUl2KGVuY1R5cGUsIHJuZyk7CisgICAgYnl0ZVtdIGhlYWRlciA9IGJ1aWxkSGVhZGVyKHNpZ1R5cGUsIGVuY1R5cGUsIGl2KS50b0J5dGVBcnJheSgpOworCisgICAgLy8gV2UgbWF5IG9yIG1heSBub3QgbmVlZCBhbiBleHRyYSB0YWcgaW4gZnJvbnQgb2YgdGhlIHBsYWludGV4dCBib2R5CisgICAgYnl0ZVtdIHRhZ2dlZEJvZHk7CisgICAgLy8gV2Ugd2lsbCBvbmx5IHNpZ24gdGhlIGFzc29jaWF0ZWQgZGF0YSB3aGVuIHdlIGRvbid0IHRhZyB0aGUgcGxhaW50ZXh0IGJvZHkKKyAgICBieXRlW10gYXNzb2NpYXRlZERhdGFUb0JlU2lnbmVkOworICAgIGlmICh0YWdnZWRQbGFpbnRleHRSZXF1aXJlZChzaWduaW5nS2V5LCBzaWdUeXBlLCBlbmNyeXB0aW9uS2V5KSkgeworICAgICAgLy8gUGxhY2UgYSAidGFnIiBpbiBmcm9udCBvZiB0aGUgdGhlIHBsYWludGV4dCBtZXNzYWdlIGNvbnRhaW5pbmcgYSBkaWdlc3Qgb2YgdGhlIGhlYWRlcgorICAgICAgdGFnZ2VkQm9keSA9IENyeXB0b09wcy5jb25jYXQoCisgICAgICAgICAgLy8gRGlnZXN0IHRoZSBoZWFkZXIgKyBhbnkgYXNzb2NpYXRlZCBkYXRhLCB5aWVsZGluZyBhIHRhZyB0byBiZSBlbmNyeXB0ZWQgd2l0aCB0aGUgYm9keS4KKyAgICAgICAgICBDcnlwdG9PcHMuZGlnZXN0KENyeXB0b09wcy5jb25jYXQoaGVhZGVyLCBhc3NvY2lhdGVkRGF0YSkpLAorICAgICAgICAgIGJvZHkpOworICAgICAgYXNzb2NpYXRlZERhdGFUb0JlU2lnbmVkID0gbnVsbDsgLy8gV2UgYWxyZWFkeSBoYW5kbGVkIGFueSBhc3NvY2lhdGVkRGF0YSB2aWEgdGhlIHRhZworICAgIH0gZWxzZSB7CisgICAgICB0YWdnZWRCb2R5ID0gYm9keTsKKyAgICAgIGFzc29jaWF0ZWREYXRhVG9CZVNpZ25lZCA9IGFzc29jaWF0ZWREYXRhOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGVuY3J5cHRlZCBib2R5LCB3aGljaCBiaW5kcyB0aGUgdGFnIHRvIHRoZSBtZXNzYWdlIGluc2lkZSB0aGUgY2lwaGVydGV4dAorICAgIGJ5dGVbXSBlbmNyeXB0ZWRCb2R5ID0gQ3J5cHRvT3BzLmVuY3J5cHQoZW5jcnlwdGlvbktleSwgZW5jVHlwZSwgcm5nLCBpdiwgdGFnZ2VkQm9keSk7CisKKyAgICBieXRlW10gaGVhZGVyQW5kQm9keSA9IHNlcmlhbGl6ZUhlYWRlckFuZEJvZHkoaGVhZGVyLCBlbmNyeXB0ZWRCb2R5KTsKKyAgICByZXR1cm4gY3JlYXRlU2lnbmVkUmVzdWx0KHNpZ25pbmdLZXksIHNpZ1R5cGUsIGhlYWRlckFuZEJvZHksIGFzc29jaWF0ZWREYXRhVG9CZVNpZ25lZCk7CisgIH0KKworICAvKioKKyAgICogSW5kaWNhdGVzIHdoZXRoZXIgYSAidGFnIiBpcyBuZWVkZWQgbmV4dCB0byB0aGUgcGxhaW50ZXh0IGJvZHkgaW5zaWRlIHRoZSBjaXBoZXJ0ZXh0LCB0bworICAgKiBwcmV2ZW50IHRoZSBzYW1lIGNpcGhlcnRleHQgZnJvbSBiZWluZyByZXVzZWQgd2l0aCBzb21lb25lIGVsc2UncyBzaWduYXR1cmUgb24gaXQuCisgICAqLworICBzdGF0aWMgYm9vbGVhbiB0YWdnZWRQbGFpbnRleHRSZXF1aXJlZChLZXkgc2lnbmluZ0tleSwgU2lnVHlwZSBzaWdUeXBlLCBLZXkgZW5jcnlwdGlvbktleSkgeworICAgIC8vIFdlIG5lZWQgYSB0YWcgaWYgZGlmZmVyZW50IGtleXMgYXJlIGJlaW5nIHVzZWQgdG8gInNpZ24iIHZzLiBlbmNyeXB0CisgICAgcmV0dXJuIHNpZ1R5cGUuaXNQdWJsaWNLZXlTY2hlbWUoKQorICAgICAgICB8fCAhQXJyYXlzLmVxdWFscyhzaWduaW5nS2V5LmdldEVuY29kZWQoKSwgZW5jcnlwdGlvbktleS5nZXRFbmNvZGVkKCkpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBpdiBJViBvciB7QGNvZGUgbnVsbH0gaWYgSVYgdG8gYmUgbGVmdCB1bnNldCBpbiB0aGUgSGVhZGVyCisgICAqLworICBwcml2YXRlIEhlYWRlciBidWlsZEhlYWRlcihTaWdUeXBlIHNpZ1R5cGUsIEVuY1R5cGUgZW5jVHlwZSwgYnl0ZVtdIGl2KSB7CisgICAgSGVhZGVyLkJ1aWxkZXIgcmVzdWx0ID0gSGVhZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0U2lnbmF0dXJlU2NoZW1lKHNpZ1R5cGUuZ2V0U2lnU2NoZW1lKCkpCisgICAgICAgIC5zZXRFbmNyeXB0aW9uU2NoZW1lKGVuY1R5cGUuZ2V0RW5jU2NoZW1lKCkpOworICAgIGlmICh2ZXJpZmljYXRpb25LZXlJZCAhPSBudWxsKSB7CisgICAgICByZXN1bHQuc2V0VmVyaWZpY2F0aW9uS2V5SWQodmVyaWZpY2F0aW9uS2V5SWQpOworICAgIH0KKyAgICBpZiAoZGVjcnlwdGlvbktleUlkICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXREZWNyeXB0aW9uS2V5SWQoZGVjcnlwdGlvbktleUlkKTsKKyAgICB9CisgICAgaWYgKHB1YmxpY01ldGFkYXRhICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRQdWJsaWNNZXRhZGF0YShwdWJsaWNNZXRhZGF0YSk7CisgICAgfQorICAgIGlmIChhc3NvY2lhdGVkRGF0YSAhPSBudWxsKSB7CisgICAgICByZXN1bHQuc2V0QXNzb2NpYXRlZERhdGFMZW5ndGgoYXNzb2NpYXRlZERhdGEubGVuZ3RoKTsKKyAgICB9CisgICAgaWYgKGl2ICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRJdihCeXRlU3RyaW5nLmNvcHlGcm9tKGl2KSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuYnVpbGQoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gaGVhZGVyIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBIZWFkZXJ9CisgICAqIEBwYXJhbSBib2R5IGFyYml0cmFyeSBwYXlsb2FkIGRhdGEKKyAgICogQHJldHVybiBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgU2VjdXJlTWVzc2FnZVByb3RvLkhlYWRlckFuZEJvZHl9CisgICAqLworICBwcml2YXRlIGJ5dGVbXSBzZXJpYWxpemVIZWFkZXJBbmRCb2R5KGJ5dGVbXSBoZWFkZXIsIGJ5dGVbXSBib2R5KSB7CisgICAgcmV0dXJuIEhlYWRlckFuZEJvZHlJbnRlcm5hbC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEhlYWRlcihCeXRlU3RyaW5nLmNvcHlGcm9tKGhlYWRlcikpCisgICAgICAgIC5zZXRCb2R5KEJ5dGVTdHJpbmcuY29weUZyb20oYm9keSkpCisgICAgICAgIC5idWlsZCgpCisgICAgICAgIC50b0J5dGVBcnJheSgpOworICB9CisKKyAgcHJpdmF0ZSBTZWN1cmVNZXNzYWdlIGNyZWF0ZVNpZ25lZFJlc3VsdCgKKyAgICAgIEtleSBzaWduaW5nS2V5LCBTaWdUeXBlIHNpZ1R5cGUsIGJ5dGVbXSBoZWFkZXJBbmRCb2R5LCBATnVsbGFibGUgYnl0ZVtdIGFzc29jaWF0ZWREYXRhKQorICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIHNpZyA9CisgICAgICAgIENyeXB0b09wcy5zaWduKHNpZ1R5cGUsIHNpZ25pbmdLZXksIHJuZywgQ3J5cHRvT3BzLmNvbmNhdChoZWFkZXJBbmRCb2R5LCBhc3NvY2lhdGVkRGF0YSkpOworICAgIHJldHVybiBTZWN1cmVNZXNzYWdlLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0SGVhZGVyQW5kQm9keShCeXRlU3RyaW5nLmNvcHlGcm9tKGhlYWRlckFuZEJvZHkpKQorICAgICAgICAuc2V0U2lnbmF0dXJlKEJ5dGVTdHJpbmcuY29weUZyb20oc2lnKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVtZXNzYWdlL1NlY3VyZU1lc3NhZ2VQYXJzZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvc2VjdXJpdHkvY3J5cHRhdXRoL2xpYi9zZWN1cmVtZXNzYWdlL1NlY3VyZU1lc3NhZ2VQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM2MGUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvbGliL3NlY3VyZW1lc3NhZ2UvU2VjdXJlTWVzc2FnZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLkNyeXB0b09wcy5FbmNUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLkNyeXB0b09wcy5TaWdUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVtZXNzYWdlLlNlY3VyZU1lc3NhZ2VQcm90by5IZWFkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVByb3RvLkhlYWRlckFuZEJvZHk7CitpbXBvcnQgY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZW1lc3NhZ2UuU2VjdXJlTWVzc2FnZVByb3RvLkhlYWRlckFuZEJvZHlJbnRlcm5hbDsKK2ltcG9ydCBjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZS5TZWN1cmVNZXNzYWdlUHJvdG8uU2VjdXJlTWVzc2FnZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLklsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBwYXJzZSBhbmQgdmVyaWZ5IHtAbGluayBTZWN1cmVNZXNzYWdlfSBwcm90b3MuIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb24gdGhlCisgKiBtZXNzYWdlLCBhbmQgZGVjcnlwdHMgInNpZ25jcnlwdGVkIiBtZXNzYWdlcyAod2hpbGUgc2ltdWx0YW5lb3VzbHkgdmVyaWZ5aW5nIHRoZSBzaWduYXR1cmUpLgorICoKKyAqIEBzZWUgU2VjdXJlTWVzc2FnZUJ1aWxkZXIKKyAqLworcHVibGljIGNsYXNzIFNlY3VyZU1lc3NhZ2VQYXJzZXIgeworCisgIHByaXZhdGUgU2VjdXJlTWVzc2FnZVBhcnNlcigpIHt9ICAvLyBEbyBub3QgaW5zdGFudGlhdGUKKworICAvKioKKyAgICogRXh0cmFjdHMgdGhlIHtAbGluayBIZWFkZXJ9IGNvbXBvbmVudCBmcm9tIGEge0BsaW5rIFNlY3VyZU1lc3NhZ2V9IGJ1dCA8ZW0+RE9FUyBOT1QgVkVSSUZZPC9lbT4KKyAgICogdGhlIHNpZ25hdHVyZSB3aGVuIGRvaW5nIHNvLiBDYWxsZXJzIHNob3VsZCBub3QgdHJ1c3QgdGhlIHJlc3VsdGluZyBvdXRwdXQgdW50aWwgYWZ0ZXIgYQorICAgKiBzdWJzZXF1ZW50IHtAY29kZSBwYXJzZSooKX0gY2FsbCBoYXMgc3VjY2VlZGVkLgorICAgKgorICAgKiA8cD5UaGUgaW50ZW50aW9uIGlzIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBwcm90b2NvbCBtZXNzYWdlIGFuZCB3aGljaAorICAgKiBrZXlzIGFyZSBpbiB1c2UsIHByaW9yIHRvIGF0dGVtcHRpbmcgdG8gdmVyaWZ5IChhbmQgcG9zc2libHkgZGVjcnlwdCkgdGhlIHBheWxvYWQgYm9keS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSGVhZGVyIGdldFVudmVyaWZpZWRIZWFkZXIoU2VjdXJlTWVzc2FnZSBzZWNtc2cpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICBpZiAoIXNlY21zZy5oYXNIZWFkZXJBbmRCb2R5KCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIk1pc3NpbmcgaGVhZGVyIGFuZCBib2R5Iik7CisgICAgfQorICAgIGlmICghSGVhZGVyQW5kQm9keS5wYXJzZUZyb20oc2VjbXNnLmdldEhlYWRlckFuZEJvZHkoKSkuaGFzSGVhZGVyKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIk1pc3NpbmcgaGVhZGVyIik7CisgICAgfQorICAgIEhlYWRlciByZXN1bHQgPSBIZWFkZXJBbmRCb2R5LnBhcnNlRnJvbShzZWNtc2cuZ2V0SGVhZGVyQW5kQm9keSgpKS5nZXRIZWFkZXIoKTsKKyAgICAvLyBDaGVjayB0aGF0IGF0IGxlYXN0IGEgc2lnbmF0dXJlIHNjaGVtZSB3YXMgc2V0CisgICAgaWYgKCFyZXN1bHQuaGFzU2lnbmF0dXJlU2NoZW1lKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIk1pc3NpbmcgaGVhZGVyIGZpZWxkKHMpIik7CisgICAgfQorICAgIC8vIENoZWNrIHNpZ25hdHVyZSBzY2hlbWUgaXMgbGVnYWwKKyAgICB0cnkgeworICAgICAgU2lnVHlwZS52YWx1ZU9mKHJlc3VsdC5nZXRTaWduYXR1cmVTY2hlbWUoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkNvcnJ1cHQvdW5zdXBwb3J0ZWQgU2lnbmF0dXJlU2NoZW1lIik7CisgICAgfQorICAgIC8vIENoZWNrIGVuY3J5cHRpb24gc2NoZW1lIGlzIGxlZ2FsCisgICAgaWYgKHJlc3VsdC5oYXNFbmNyeXB0aW9uU2NoZW1lKCkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIEVuY1R5cGUudmFsdWVPZihyZXN1bHQuZ2V0RW5jcnlwdGlvblNjaGVtZSgpKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkNvcnJ1cHQvdW5zdXBwb3J0ZWQgRW5jcnlwdGlvblNjaGVtZSIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyBhIHtAbGluayBTZWN1cmVNZXNzYWdlfSBjb250YWluaW5nIGEgY2xlYXJ0ZXh0IHBheWxvYWQgYm9keSwgYW5kIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUuCisgICAqCisgICAqIEByZXR1cm4gdGhlIHBhcnNlZCB7QGxpbmsgSGVhZGVyQW5kQm9keX0gcGFpciAod2hpY2ggaXMgZnVsbHkgdmVyaWZpZWQpCisgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uIGlmIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbHMKKyAgICogQHNlZSBTZWN1cmVNZXNzYWdlQnVpbGRlciNidWlsZFNpZ25lZENsZWFydGV4dE1lc3NhZ2UoS2V5LCBTaWdUeXBlLCBieXRlW10pCisgICAqLworICBwdWJsaWMgc3RhdGljIEhlYWRlckFuZEJvZHkgcGFyc2VTaWduZWRDbGVhcnRleHRNZXNzYWdlKAorICAgICAgU2VjdXJlTWVzc2FnZSBzZWNtc2csIEtleSB2ZXJpZmljYXRpb25LZXksIFNpZ1R5cGUgc2lnVHlwZSkKKyAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uLCBTaWduYXR1cmVFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZVNpZ25lZENsZWFydGV4dE1lc3NhZ2Uoc2VjbXNnLCB2ZXJpZmljYXRpb25LZXksIHNpZ1R5cGUsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyBhIHtAbGluayBTZWN1cmVNZXNzYWdlfSBjb250YWluaW5nIGEgY2xlYXJ0ZXh0IHBheWxvYWQgYm9keSwgYW5kIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUuCisgICAqCisgICAqIEBwYXJhbSBhc3NvY2lhdGVkRGF0YSBvcHRpb25hbCBhc3NvY2lhdGVkIGRhdGEgYm91bmQgdG8gdGhlIHNpZ25hdHVyZSAoYnV0IG5vdCBpbiB0aGUgbWVzc2FnZSkKKyAgICogQHJldHVybiB0aGUgcGFyc2VkIHtAbGluayBIZWFkZXJBbmRCb2R5fSBwYWlyICh3aGljaCBpcyBmdWxseSB2ZXJpZmllZCkKKyAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24gaWYgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlscworICAgKiBAc2VlIFNlY3VyZU1lc3NhZ2VCdWlsZGVyI2J1aWxkU2lnbmVkQ2xlYXJ0ZXh0TWVzc2FnZShLZXksIFNpZ1R5cGUsIGJ5dGVbXSkKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSGVhZGVyQW5kQm9keSBwYXJzZVNpZ25lZENsZWFydGV4dE1lc3NhZ2UoCisgICAgICBTZWN1cmVNZXNzYWdlIHNlY21zZywgS2V5IHZlcmlmaWNhdGlvbktleSwgU2lnVHlwZSBzaWdUeXBlLCBATnVsbGFibGUgYnl0ZVtdIGFzc29jaWF0ZWREYXRhKQorICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgaWYgKChzZWNtc2cgPT0gbnVsbCkgfHwgKHZlcmlmaWNhdGlvbktleSA9PSBudWxsKSB8fCAoc2lnVHlwZSA9PSBudWxsKSkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHJldHVybiB2ZXJpZnlIZWFkZXJBbmRCb2R5KAorICAgICAgICBzZWNtc2csCisgICAgICAgIHZlcmlmaWNhdGlvbktleSwKKyAgICAgICAgc2lnVHlwZSwKKyAgICAgICAgRW5jVHlwZS5OT05FLAorICAgICAgICBhc3NvY2lhdGVkRGF0YSwKKyAgICAgICAgZmFsc2UgLyogc3VwcHJlc3NBc3NvY2lhdGVkRGF0YSBpcyBhbHdheXMgZmFsc2UgZm9yIHNpZ25lZCBjbGVhcnRleHQgKi8pOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyBhIHtAbGluayBTZWN1cmVNZXNzYWdlfSBjb250YWluaW5nIGFuIGVuY3J5cHRlZCBwYXlsb2FkIGJvZHksIGV4dHJhY3RpbmcgYSBkZWNyeXB0aW9uIG9mCisgICAqIHRoZSBwYXlsb2FkIGJvZHkgYW5kIHZlcmlmeWluZyB0aGUgc2lnbmF0dXJlLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQge0BsaW5rIEhlYWRlckFuZEJvZHl9IHBhaXIgKHdoaWNoIGlzIGZ1bGx5IHZlcmlmaWVkIGFuZCBkZWNyeXB0ZWQpCisgICAqIEB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uIGlmIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbHMKKyAgICogQHNlZSBTZWN1cmVNZXNzYWdlQnVpbGRlciNidWlsZFNpZ25DcnlwdGVkTWVzc2FnZShLZXksIFNpZ1R5cGUsIEtleSwgRW5jVHlwZSwgYnl0ZVtdKQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBIZWFkZXJBbmRCb2R5IHBhcnNlU2lnbkNyeXB0ZWRNZXNzYWdlKAorICAgICAgU2VjdXJlTWVzc2FnZSBzZWNtc2csCisgICAgICBLZXkgdmVyaWZpY2F0aW9uS2V5LAorICAgICAgU2lnVHlwZSBzaWdUeXBlLAorICAgICAgS2V5IGRlY3J5cHRpb25LZXksCisgICAgICBFbmNUeXBlIGVuY1R5cGUpCisgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgU2lnbmF0dXJlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2VTaWduQ3J5cHRlZE1lc3NhZ2Uoc2VjbXNnLCB2ZXJpZmljYXRpb25LZXksIHNpZ1R5cGUsIGRlY3J5cHRpb25LZXksIGVuY1R5cGUsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyBhIHtAbGluayBTZWN1cmVNZXNzYWdlfSBjb250YWluaW5nIGFuIGVuY3J5cHRlZCBwYXlsb2FkIGJvZHksIGV4dHJhY3RpbmcgYSBkZWNyeXB0aW9uIG9mCisgICAqIHRoZSBwYXlsb2FkIGJvZHkgYW5kIHZlcmlmeWluZyB0aGUgc2lnbmF0dXJlLgorICAgKgorICAgKiBAcGFyYW0gYXNzb2NpYXRlZERhdGEgb3B0aW9uYWwgYXNzb2NpYXRlZCBkYXRhIGJvdW5kIHRvIHRoZSBzaWduYXR1cmUgKGJ1dCBub3QgaW4gdGhlIG1lc3NhZ2UpCisgICAqIEByZXR1cm4gdGhlIHBhcnNlZCB7QGxpbmsgSGVhZGVyQW5kQm9keX0gcGFpciAod2hpY2ggaXMgZnVsbHkgdmVyaWZpZWQgYW5kIGRlY3J5cHRlZCkKKyAgICogQHRocm93cyBTaWduYXR1cmVFeGNlcHRpb24gaWYgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlscworICAgKiBAc2VlIFNlY3VyZU1lc3NhZ2VCdWlsZGVyI2J1aWxkU2lnbkNyeXB0ZWRNZXNzYWdlKEtleSwgU2lnVHlwZSwgS2V5LCBFbmNUeXBlLCBieXRlW10pCisgICAqLworICBwdWJsaWMgc3RhdGljIEhlYWRlckFuZEJvZHkgcGFyc2VTaWduQ3J5cHRlZE1lc3NhZ2UoCisgICAgICBTZWN1cmVNZXNzYWdlIHNlY21zZywKKyAgICAgIEtleSB2ZXJpZmljYXRpb25LZXksCisgICAgICBTaWdUeXBlIHNpZ1R5cGUsCisgICAgICBLZXkgZGVjcnlwdGlvbktleSwKKyAgICAgIEVuY1R5cGUgZW5jVHlwZSwKKyAgICAgIEBOdWxsYWJsZSBieXRlW10gYXNzb2NpYXRlZERhdGEpCisgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgU2lnbmF0dXJlRXhjZXB0aW9uIHsKKyAgICBpZiAoKHNlY21zZyA9PSBudWxsKQorICAgICAgICB8fCAodmVyaWZpY2F0aW9uS2V5ID09IG51bGwpCisgICAgICAgIHx8IChzaWdUeXBlID09IG51bGwpCisgICAgICAgIHx8IChkZWNyeXB0aW9uS2V5ID09IG51bGwpCisgICAgICAgIHx8IChlbmNUeXBlID09IG51bGwpKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKGVuY1R5cGUgPT0gRW5jVHlwZS5OT05FKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCJOb3QgYSBzaWduY3J5cHRlZCBtZXNzYWdlIik7CisgICAgfQorCisgICAgYm9vbGVhbiB0YWdSZXF1aXJlZCA9CisgICAgICAgIFNlY3VyZU1lc3NhZ2VCdWlsZGVyLnRhZ2dlZFBsYWludGV4dFJlcXVpcmVkKHZlcmlmaWNhdGlvbktleSwgc2lnVHlwZSwgZGVjcnlwdGlvbktleSk7CisgICAgSGVhZGVyQW5kQm9keSBoZWFkZXJBbmRFbmNyeXB0ZWRCb2R5OworICAgIGhlYWRlckFuZEVuY3J5cHRlZEJvZHkgPSB2ZXJpZnlIZWFkZXJBbmRCb2R5KAorICAgICAgICBzZWNtc2csCisgICAgICAgIHZlcmlmaWNhdGlvbktleSwKKyAgICAgICAgc2lnVHlwZSwKKyAgICAgICAgZW5jVHlwZSwKKyAgICAgICAgYXNzb2NpYXRlZERhdGEsCisgICAgICAgIHRhZ1JlcXVpcmVkIC8qIHN1cHByZXNzQXNzb2NpYXRlZERhdGEgaWYgaXQgaXMgaGFuZGxlZCBieSB0aGUgdGFnIGluc3RlYWQgKi8pOworCisgICAgYnl0ZVtdIHJhd0RlY3J5cHRlZEJvZHk7CisgICAgSGVhZGVyIGhlYWRlciA9IGhlYWRlckFuZEVuY3J5cHRlZEJvZHkuZ2V0SGVhZGVyKCk7CisgICAgaWYgKCFoZWFkZXIuaGFzSXYoKSkgeworICAgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0cnkgeworICAgICAgcmF3RGVjcnlwdGVkQm9keSA9IENyeXB0b09wcy5kZWNyeXB0KAorICAgICAgICAgIGRlY3J5cHRpb25LZXksIGVuY1R5cGUsIGhlYWRlci5nZXRJdigpLnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgaGVhZGVyQW5kRW5jcnlwdGVkQm9keS5nZXRCb2R5KCkudG9CeXRlQXJyYXkoKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaCAoQmFkUGFkZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgaWYgKCF0YWdSZXF1aXJlZCkgeworICAgICAgLy8gTm8gdGFnIGV4cGVjdGVkLCBzbyB3ZSdyZSBhbGwgZG9uZQorICAgICAgcmV0dXJuIEhlYWRlckFuZEJvZHkubmV3QnVpbGRlcihoZWFkZXJBbmRFbmNyeXB0ZWRCb2R5KQorICAgICAgICAgIC5zZXRCb2R5KEJ5dGVTdHJpbmcuY29weUZyb20ocmF3RGVjcnlwdGVkQm9keSkpCisgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgLy8gVmVyaWZ5IHRoZSB0YWcgdGhhdCBiaW5kcyB0aGUgY2lwaGVydGV4dCB0byB0aGUgaGVhZGVyLCBhbmQgcmVtb3ZlIGl0CisgICAgYnl0ZVtdIGhlYWRlckJ5dGVzOworICAgIHRyeSB7CisgICAgICBoZWFkZXJCeXRlcyA9CisgICAgICAgICAgSGVhZGVyQW5kQm9keUludGVybmFsLnBhcnNlRnJvbShzZWNtc2cuZ2V0SGVhZGVyQW5kQm9keSgpKS5nZXRIZWFkZXIoKS50b0J5dGVBcnJheSgpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCB0aHJvdyBpdCB1cCBqdXN0IGluIGNhc2UKKyAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oZSk7CisgICAgfQorICAgIGJvb2xlYW4gdmVyaWZpZWRCaW5kaW5nID0gZmFsc2U7CisgICAgYnl0ZVtdIGV4cGVjdGVkVGFnID0gQ3J5cHRvT3BzLmRpZ2VzdChDcnlwdG9PcHMuY29uY2F0KGhlYWRlckJ5dGVzLCBhc3NvY2lhdGVkRGF0YSkpOworICAgIGlmIChyYXdEZWNyeXB0ZWRCb2R5Lmxlbmd0aCA+PSBDcnlwdG9PcHMuRElHRVNUX0xFTkdUSCkgeworICAgICAgYnl0ZVtdIGFjdHVhbFRhZyA9IENyeXB0b09wcy5zdWJhcnJheShyYXdEZWNyeXB0ZWRCb2R5LCAwLCBDcnlwdG9PcHMuRElHRVNUX0xFTkdUSCk7CisgICAgICBpZiAoQ3J5cHRvT3BzLmNvbnN0YW50VGltZUFycmF5RXF1YWxzKGFjdHVhbFRhZywgZXhwZWN0ZWRUYWcpKSB7CisgICAgICAgIHZlcmlmaWVkQmluZGluZyA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmICghdmVyaWZpZWRCaW5kaW5nKSB7CisgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgaW50IGJvZHlMZW4gPSByYXdEZWNyeXB0ZWRCb2R5Lmxlbmd0aCAtIENyeXB0b09wcy5ESUdFU1RfTEVOR1RIOworICAgIHJldHVybiBIZWFkZXJBbmRCb2R5Lm5ld0J1aWxkZXIoaGVhZGVyQW5kRW5jcnlwdGVkQm9keSkKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSB0YWcgYW5kIHNldCB0aGUgcGxhaW50ZXh0IGJvZHkKKyAgICAgICAgLnNldEJvZHkoQnl0ZVN0cmluZy5jb3B5RnJvbShyYXdEZWNyeXB0ZWRCb2R5LCBDcnlwdG9PcHMuRElHRVNUX0xFTkdUSCwgYm9keUxlbikpCisgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSGVhZGVyQW5kQm9keSB2ZXJpZnlIZWFkZXJBbmRCb2R5KAorICAgICAgU2VjdXJlTWVzc2FnZSBzZWNtc2csCisgICAgICBLZXkgdmVyaWZpY2F0aW9uS2V5LAorICAgICAgU2lnVHlwZSBzaWdUeXBlLAorICAgICAgRW5jVHlwZSBlbmNUeXBlLAorICAgICAgQE51bGxhYmxlIGJ5dGVbXSBhc3NvY2lhdGVkRGF0YSwKKyAgICAgIGJvb2xlYW4gc3VwcHJlc3NBc3NvY2lhdGVkRGF0YSAvKiBpbiBjYXNlIGl0IGlzIGluIHRoZSB0YWcgaW5zdGVhZCAqLykKKyAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sIFNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgaWYgKCFzZWNtc2cuaGFzSGVhZGVyQW5kQm9keSgpIHx8ICFzZWNtc2cuaGFzU2lnbmF0dXJlKCkpIHsKKyAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oIlNpZ25hdHVyZSBmYWlsZWQgdmVyaWZpY2F0aW9uIik7CisgICAgfQorICAgIGJ5dGVbXSBzaWduYXR1cmUgPSBzZWNtc2cuZ2V0U2lnbmF0dXJlKCkudG9CeXRlQXJyYXkoKTsKKyAgICBieXRlW10gZGF0YSA9IHNlY21zZy5nZXRIZWFkZXJBbmRCb2R5KCkudG9CeXRlQXJyYXkoKTsKKyAgICBieXRlW10gc2lnbmVkRGF0YSA9IHN1cHByZXNzQXNzb2NpYXRlZERhdGEgPyBkYXRhIDogQ3J5cHRvT3BzLmNvbmNhdChkYXRhLCBhc3NvY2lhdGVkRGF0YSk7CisKKyAgICAvLyBUcnkgbm90IHRvIGxlYWsgdGhlIHNwZWNpZmljIHJlYXNvbiBmb3IgdmVyaWZpY2F0aW9uIGZhaWx1cmVzLCBkdWUgdG8gc2VjdXJpdHkgY29uY2VybnMuCisgICAgYm9vbGVhbiB2ZXJpZmllZCA9IENyeXB0b09wcy52ZXJpZnkodmVyaWZpY2F0aW9uS2V5LCBzaWdUeXBlLCBzaWduYXR1cmUsIHNpZ25lZERhdGEpOworICAgIEhlYWRlckFuZEJvZHkgcmVzdWx0ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgcmVzdWx0ID0gSGVhZGVyQW5kQm9keS5wYXJzZUZyb20oc2VjbXNnLmdldEhlYWRlckFuZEJvZHkoKSk7CisgICAgICAvLyBFdmVuIGlmIGRlY2xhcmVkIHJlcXVpcmVkLCBtaWNybyBwcm90byBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiBmaWVsZHMgYXJlIG5vdCBwcmVzZW50CisgICAgICBpZiAoIXJlc3VsdC5oYXNIZWFkZXIoKSB8fCAhcmVzdWx0Lmhhc0JvZHkoKSkgeworICAgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCJTaWduYXR1cmUgZmFpbGVkIHZlcmlmaWNhdGlvbiIpOworICAgICAgfQorICAgICAgdmVyaWZpZWQgJj0gKHJlc3VsdC5nZXRIZWFkZXIoKS5nZXRTaWduYXR1cmVTY2hlbWUoKSA9PSBzaWdUeXBlLmdldFNpZ1NjaGVtZSgpKTsKKyAgICAgIHZlcmlmaWVkICY9IChyZXN1bHQuZ2V0SGVhZGVyKCkuZ2V0RW5jcnlwdGlvblNjaGVtZSgpID09IGVuY1R5cGUuZ2V0RW5jU2NoZW1lKCkpOworICAgICAgLy8gQ2hlY2sgdGhhdCBlaXRoZXIgYSBkZWNyeXB0aW9uIG9wZXJhdGlvbiBpcyBleHBlY3RlZCwgb3Igbm8gRGVjcnlwdGlvbktleUlkIGlzIHNldC4KKyAgICAgIHZlcmlmaWVkICY9IChlbmNUeXBlICE9IEVuY1R5cGUuTk9ORSkgfHwgIXJlc3VsdC5nZXRIZWFkZXIoKS5oYXNEZWNyeXB0aW9uS2V5SWQoKTsKKyAgICAgIC8vIElmIGVuY3J5cHRpb24gd2FzIHVzZWQsIGNoZWNrIHRoYXQgZWl0aGVyIHdlIGFyZSBub3QgdXNpbmcgYSBwdWJsaWMga2V5IHNpZ25hdHVyZSBvciBhCisgICAgICAvLyBWZXJpZmljYXRpb25LZXlJZCB3YXMgc2V0IChhcyBpcyByZXF1aXJlZCBmb3IgcHVibGljIGtleSBiYXNlZCBzaWduYXR1cmUgKyBlbmNyeXB0aW9uKS4KKyAgICAgIHZlcmlmaWVkICY9IChlbmNUeXBlID09IEVuY1R5cGUuTk9ORSkgfHwgIXNpZ1R5cGUuaXNQdWJsaWNLZXlTY2hlbWUoKSB8fAorICAgICAgICAgIHJlc3VsdC5nZXRIZWFkZXIoKS5oYXNWZXJpZmljYXRpb25LZXlJZCgpOworICAgICAgaW50IGFzc29jaWF0ZWREYXRhTGVuZ3RoID0gYXNzb2NpYXRlZERhdGEgPT0gbnVsbCA/IDAgOiBhc3NvY2lhdGVkRGF0YS5sZW5ndGg7CisgICAgICB2ZXJpZmllZCAmPSAocmVzdWx0LmdldEhlYWRlcigpLmdldEFzc29jaWF0ZWREYXRhTGVuZ3RoKCkgPT0gYXNzb2NpYXRlZERhdGFMZW5ndGgpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICB2ZXJpZmllZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICh2ZXJpZmllZCkgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgdGhyb3cgbmV3IFNpZ25hdHVyZUV4Y2VwdGlvbigiU2lnbmF0dXJlIGZhaWxlZCB2ZXJpZmljYXRpb24iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL3Byb3RvL2RldmljZV90b19kZXZpY2VfbWVzc2FnZXMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vcHJvdG8vZGV2aWNlX3RvX2RldmljZV9tZXNzYWdlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JkMmNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL3Byb3RvL2RldmljZV90b19kZXZpY2VfbWVzc2FnZXMucHJvdG8KQEAgLTAsMCArMSw4MyBAQAorLyogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2Ugc2VjdXJlZ2NtOworCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUuc2VjdXJpdHkuY3J5cHRhdXRoLmxpYi5zZWN1cmVnY20iOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkRldmljZVRvRGV2aWNlTWVzc2FnZXNQcm90byI7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiU0dDTSI7CisKK2ltcG9ydCAic2VjdXJlbWVzc2FnZS5wcm90byI7CisKKy8vIFVzZWQgYnkgcHJvdG9jb2xzIGJldHdlZW4gZGV2aWNlcworbWVzc2FnZSBEZXZpY2VUb0RldmljZU1lc3NhZ2UgeworICAvLyB0aGUgcGF5bG9hZCBvZiB0aGUgbWVzc2FnZQorICBvcHRpb25hbCBieXRlcyBtZXNzYWdlID0gMTsKKworICAvLyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlIC0gbXVzdCBiZSBpbmNyZWFzaW5nLgorICBvcHRpb25hbCBpbnQzMiBzZXF1ZW5jZV9udW1iZXIgPSAyOworfQorCisvLyBzZW50IGFzIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gaW5pdGlhdG9yIHRvIHJlc3BvbmRlcgorLy8gaW4gYW4gdW5hdXRoZW50aWNhdGVkIERpZmZpZS1IZWxsbWFuIEtleSBFeGNoYW5nZQorbWVzc2FnZSBJbml0aWF0b3JIZWxsbyB7CisgIC8vIFRoZSBzZXNzaW9uIHB1YmxpYyBrZXkgdG8gc2VuZCB0byB0aGUgcmVzcG9uZGVyCisgIG9wdGlvbmFsIHNlY3VyZW1lc3NhZ2UuR2VuZXJpY1B1YmxpY0tleSBwdWJsaWNfZGhfa2V5ID0gMTsKKworICAvLyBUaGUgcHJvdG9jb2wgdmVyc2lvbgorICBvcHRpb25hbCBpbnQzMiBwcm90b2NvbF92ZXJzaW9uID0gMiBbZGVmYXVsdCA9IDBdOworfQorCisvLyBzZW50IGluc2lkZSB0aGUgaGVhZGVyIG9mIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gdGhlIHJlc3BvbmRlciB0byB0aGUKKy8vIGluaXRpYXRvciBpbiBhbiB1bmF1dGhlbnRpY2F0ZWQgRGlmZmllLUhlbGxtYW4gS2V5IEV4Y2hhbmdlCittZXNzYWdlIFJlc3BvbmRlckhlbGxvIHsKKyAgLy8gVGhlIHNlc3Npb24gcHVibGljIGtleSB0byBzZW5kIHRvIHRoZSBpbml0aWF0b3IKKyAgb3B0aW9uYWwgc2VjdXJlbWVzc2FnZS5HZW5lcmljUHVibGljS2V5IHB1YmxpY19kaF9rZXkgPSAxOworCisgIC8vIFRoZSBwcm90b2NvbCB2ZXJzaW9uCisgIG9wdGlvbmFsIGludDMyIHByb3RvY29sX3ZlcnNpb24gPSAyIFtkZWZhdWx0ID0gMF07Cit9CisKKy8vIFR5cGUgb2YgY3VydmUKK2VudW0gQ3VydmUgeworICBFRF8yNTUxOSA9IDE7Cit9CisKKy8vIEEgY29udmVuaWVuY2UgcHJvdG8gZm9yIGVuY29kaW5nIGN1cnZlIHBvaW50cyBpbiBhZmZpbmUgcmVwcmVzZW50YXRpb24KK21lc3NhZ2UgRWNQb2ludCB7CisgIHJlcXVpcmVkIEN1cnZlIGN1cnZlID0gMTsKKworICAvLyB4IGFuZCB5IGFyZSBlbmNvZGVkIGluIGJpZy1lbmRpYW4gdHdvJ3MgY29tcGxlbWVudAorICAvLyBjbGllbnQgTVVTVCB2ZXJpZnkgKHgseSkgaXMgYSB2YWxpZCBwb2ludCBvbiB0aGUgc3BlY2lmaWVkIGN1cnZlCisgIHJlcXVpcmVkIGJ5dGVzIHggPSAyOworICByZXF1aXJlZCBieXRlcyB5ID0gMzsKK30KKworbWVzc2FnZSBTcGFrZUhhbmRzaGFrZU1lc3NhZ2UgeworICAvLyBFYWNoIGZsb3cgaW4gdGhlIHByb3RvY29sIGJ1bXBzIHRoaXMgY291bnRlcgorICBvcHRpb25hbCBpbnQzMiBmbG93X251bWJlciA9IDE7CisKKyAgLy8gU29tZSAoYnV0IG5vdCBhbGwpIFNQQUtFIGZsb3dzIHNlbmQgYSBwb2ludCBvbiBhbiBlbGxpcHRpYyBjdXJ2ZQorICBvcHRpb25hbCBFY1BvaW50IGVjX3BvaW50ID0gMjsKKworICAvLyBTb21lIChidXQgbm90IGFsbCkgU1BBS0UgZmxvd3Mgc2VuZCBhIGhhc2ggdmFsdWUKKyAgb3B0aW9uYWwgYnl0ZXMgaGFzaF92YWx1ZSA9IDM7CisKKyAgLy8gVGhlIGxhc3QgZmxvdyBvZiBhIFNQQUtFIHByb3RvY29sIGNhbiBzZW5kIGFuIG9wdGlvbmFsIHBheWxvYWQsCisgIC8vIHNpbmNlIHRoZSBrZXkgZXhjaGFuZ2UgaXMgYWxyZWFkeSBjb21wbGV0ZSBvbiB0aGUgc2VuZGVyJ3Mgc2lkZS4KKyAgb3B0aW9uYWwgYnl0ZXMgcGF5bG9hZCA9IDQ7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9wcm90by9wYXNzd29yZGxlc3NfYXV0aF9wYXlsb2Fkcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9wcm90by9wYXNzd29yZGxlc3NfYXV0aF9wYXlsb2Fkcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRkOTFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL3Byb3RvL3Bhc3N3b3JkbGVzc19hdXRoX3BheWxvYWRzLnByb3RvCkBAIC0wLDAgKzEsMzggQEAKKy8qIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIHNlY3VyZWdjbTsKKworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlZ2NtIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJTZWN1cmVHY21QYXNzd29yZGxlc3NBdXRoUHJvdG8iOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIlNHQ00iOworCisKK21lc3NhZ2UgSWRlbnRpdHlBc3NlcnRpb24geworCisgIC8vIEJyb3dzZXIgZGF0YSBjb250YWlucyB0aGUgY2hhbGxlbmdlLCBvcmlnaW4sIGV0Yy4KKyAgb3B0aW9uYWwgYnl0ZXMgYnJvd3Nlcl9kYXRhX2hhc2ggPSAxOworCisgIC8vIEEgY291bnRlciB0aGF0IHdlIGV4cGVjdCB0byBpbmNyZWFzZS4KKyAgb3B0aW9uYWwgaW50NjQgY291bnRlciA9IDI7CisKKyAgLy8gQW4gaW50ZWdlciBlbmNvZGluZyB3aGV0aGVyIHRoZSB1c2VyIGFjdGl2ZWx5IGFwcHJvdmVkIHRoaXMgYXNzZXJ0aW9uLAorICAvLyBvciB3aGV0aGVyIHRoZSBwaG9uZSBhdXRvLWlzc3VlZCB0aGUgYXNzZXJ0aW9uLgorICAvLyBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAvLyAxOiBVc2VyIGV4cGxpY2l0bHkgYXBwcm92ZWQgdGhlIGxvZ2luLgorICAvLyAwOiBQaG9uZSBhcHByb3ZlZCBsb2dpbiB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIHVzZXIuCisgIG9wdGlvbmFsIGludDMyIHVzZXJfYXBwcm92YWwgPSAzOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL3Byb3RvL3Byb3hpbWl0eV9wYXlsb2Fkcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9wcm90by9wcm94aW1pdHlfcGF5bG9hZHMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyZjFlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9wcm90by9wcm94aW1pdHlfcGF5bG9hZHMucHJvdG8KQEAgLTAsMCArMSw1OCBAQAorLyogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc3ludGF4ID0gInByb3RvMiI7CisKK2ltcG9ydCAic2VjdXJlZ2NtLnByb3RvIjsKKworcGFja2FnZSBzZWN1cmVnY207CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbSI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiU2VjdXJlR2NtUHJveGltaXR5QXV0aFByb3RvIjsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJTR0NNIjsKKworLy8gTWVzc2FnZSB1c2VkIHdoZW4gb25lIGRldmljZSB3YW50cyB0byBpbml0aWF0ZSBhIFByb3hpbWl0eSBBdXRoIHBhaXJpbmcgd2l0aCBhbm90aGVyIGRldmljZQorLy8gREVQUkVDQVRFRC4gRE8gTk9UIFVTRQorbWVzc2FnZSBDbG91ZFRvRGV2aWNlUHJveGltaXR5QXV0aFBhaXJpbmcgeworLy8gVGhlIG5hbWUgb3IgZGVzY3JpcHRpb24gb2YgdGhlIGRldmljZSB0aGF0IHdhbnRzIHRvIHBhaXIgd2l0aCBhbm90aGVyCisvLyBwZXJzb25hbCBkZXZpY2Ugb2YgdGhlIHVzZXIuICBUaGlzIGlzIGEgc3RyaW5nIHRoYXQgbWF5IGJlIHNob3duIHRvIHRoZQorLy8gdXNlciBvciBtYXkgYmUga2VwdCBpbiBsb2dzLgorICBvcHRpb25hbCBzdHJpbmcgaW5pdGlhdGluZ19kZXZpY2VfbmFtZSA9IDE7CisKKyAgLy8gVGhlIG9yaWdpbmFsIGRldmljZSdzIEJsdWV0b290aCBhZGRyZXNzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0KKyAgLy8gKGUuZy4sIDxjb2RlPkFBOkJCOkNDOkREOkVFOkZGPC9jb2RlPikKKyAgb3B0aW9uYWwgc3RyaW5nIGluaXRpYXRpbmdfZGV2aWNlX2J0X2FkZHJlc3MgPSAyOworCisgIC8vIEEgc3ltbWV0cmljIGtleSB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkgdGhlIG9yaWdpbmFsIGRldmljZS4KKyAgb3B0aW9uYWwgYnl0ZXMgZXBoZW1lcmFsX3N5bW1ldHJpY19rZXkgPSAzOworCisgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgbWV0YWRhdGEgdGhhdCB0aGUgaW5pdGlhdGluZyBkZXZpY2UgY2FuIGNob29zZSB0byBzZW5kLgorICAvLyBVc2VkIGZvciBxdWljayBwcm90b2NvbCBpdGVyYXRpb24uCisgIG9wdGlvbmFsIGJ5dGVzIGFkZGl0aW9uYWxfbWV0YWRhdGEgPSA0OworfQorCisvLyBNZXNzYWdlIHRvIHB1c2ggdG8gZWxpZ2libGUgdW5sb2NrIGRldmljZXMgc28gdGhhdCB0aGV5IGNhbiBjb250YWN0IHRoZQorLy8gZGV2aWNlIHRvIGJlIHVubG9ja2VkLiBVc2VkIGJ5IEZpbmRFbGlnaWJsZVVubG9ja0RldmljZXNSZXF1ZXN0LCB3aXRoCisvLyBQYXlsb2FkVHlwZSA9IERFVklDRV9QUk9YSU1JVFlfQ0FMTEJBQ0suCittZXNzYWdlIERldmljZVByb3hpbWl0eUNhbGxiYWNrIHsKKyAgLy8gUmVxdWlyZWQuIFRoZSBibHVldG9vdGggTUFDIGFkZHJlc3MgdGhhdCBzaG91bGQgYmUgY29udGFjdGVkIGJ5IHRoZSB1bmxvY2sKKyAgLy8gZGV2aWNlLgorICBvcHRpb25hbCBzdHJpbmcgY2FsbGJhY2tfYmx1ZXRvb3RoX2FkZHJlc3MgPSAxOworCisgIC8vIFJlcXVpcmVkLiBUaGUgdHlwZSBvZiB0aGUgZGV2aWNlIHRoYXQgdHJpZ2dlcmVkIHRoaXMgY2FsbGJhY2sgdG8gYmUgc2VudC4KKyAgb3B0aW9uYWwgRGV2aWNlVHlwZSBzb3VyY2VfZGV2aWNlX3R5cGUgPSAyOworCisgIC8vIFRoZSB2ZXJzaW9uIG9mIHRoZSBzZXR1cCBwcm90b2NvbCB0aGF0IHRoZSBzb3VyY2UgZGV2aWNlIGV4cGVjdHMgdG8gdXNlLgorICBvcHRpb25hbCBpbnQzMiBwcm90b2NvbF92ZXJzaW9uID0gMzsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9wcm90by9zZWN1cmVnY20ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vcHJvdG8vc2VjdXJlZ2NtLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZGFlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vcHJvdG8vc2VjdXJlZ2NtLnByb3RvCkBAIC0wLDAgKzEsMzA3IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBzZWN1cmVnY207CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbSI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiU2VjdXJlR2NtUHJvdG8iOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIlNHQ00iOworCisvLyBNZXNzYWdlIHVzZWQgb25seSBkdXJpbmcgZW5yb2xsbWVudAorLy8gRmllbGQgbnVtYmVycyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggRGV2aWNlSW5mbyBpbjoKKy8vICAgamF2YS9jb20vZ29vZ2xlL3NlY3VyaXR5L2NyeXB0YXV0aC9iYWNrZW5kL3NlcnZpY2VzL2NvbW1vbi9jb21tb24ucHJvdG8KK21lc3NhZ2UgR2NtRGV2aWNlSW5mbyB7CisgIC8vIFRoaXMgZmllbGQncyBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBvbmUgaW4gRGV2aWNlSW5mbyBmb3IgbGVnYWN5IHJlYXNvbnMuCisgIC8vIENvbnNpZGVyIHVzaW5nIGxvbmdfZGV2aWNlX2lkIGFuZCBkZXZpY2VfdHlwZSBpbnN0ZWFkIHdoZW4gZW5yb2xsaW5nCisgIC8vIG5vbi1hbmRyb2lkIGRldmljZXMuCisgIG9wdGlvbmFsIGZpeGVkNjQgYW5kcm9pZF9kZXZpY2VfaWQgPSAxOworCisgIC8vIFVzZWQgZm9yIGRldmljZV9hZGRyZXNzIG9mIERldmljZUluZm8gZmllbGQgMiwgYnV0IGZvciBHQ00gY2FwYWJsZSBkZXZpY2VzLgorICBvcHRpb25hbCBieXRlcyBnY21fcmVnaXN0cmF0aW9uX2lkID0gMTAyOworCisgIC8vIFVzZWQgZm9yIGRldmljZV9hZGRyZXNzIG9mIERldmljZUluZm8gZmllbGQgMiwgYnV0IGZvciBpT1MgZGV2aWNlcy4KKyAgb3B0aW9uYWwgYnl0ZXMgYXBuX3JlZ2lzdHJhdGlvbl9pZCA9IDIwMjsKKworICAvLyBEb2VzIHRoZSB1c2VyIGhhdmUgbm90aWZpY2F0aW9ucyBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFkZHJlc3MuCisgIG9wdGlvbmFsIGJvb2wgbm90aWZpY2F0aW9uX2VuYWJsZWQgPSAyMDMgWyBkZWZhdWx0ID0gdHJ1ZSBdOworCisgIC8vIFVzZWQgZm9yIGRldmljZV9hZGRyZXNzIG9mIERldmljZUluZm8gZmllbGQgMiwgYSBCbHVldG9vdGggTWFjIGFkZHJlc3MgZm9yCisgIC8vIHRoZSBkZXZpY2UgKGUuZy4sIHRvIGJlIHVzZWQgd2l0aCBFYXN5VW5sb2NrKQorICBvcHRpb25hbCBzdHJpbmcgYmx1ZXRvb3RoX21hY19hZGRyZXNzID0gMzAyOworCisgIC8vIFNIQS0yNTYgaGFzaCBvZiB0aGUgZGV2aWNlIG1hc3RlciBrZXkgKGZyb20gdGhlIGtleSBleGNoYW5nZSkuCisgIC8vIERpZmZlcnMgZnJvbSBEZXZpY2VJbmZvIGZpZWxkIDMsIHdoaWNoIGNvbnRhaW5zIHRoZSBhY3R1YWwgbWFzdGVyIGtleS4KKyAgb3B0aW9uYWwgYnl0ZXMgZGV2aWNlX21hc3Rlcl9rZXlfaGFzaCA9IDEwMzsKKworICAvLyBBIFNlY3VyZU1lc3NhZ2UuRWNQMjU2UHVibGljS2V5CisgIHJlcXVpcmVkIGJ5dGVzIHVzZXJfcHVibGljX2tleSA9IDQ7CisKKyAgLy8gZGV2aWNlJ3MgbW9kZWwgbmFtZQorICAvLyAoZS5nLiwgYW4gYW5kcm9pZC5vcy5CdWlsZC5NT0RFTCBvciBVSURldmljZS5tb2RlbCkKKyAgb3B0aW9uYWwgc3RyaW5nIGRldmljZV9tb2RlbCA9IDc7CisKKyAgLy8gZGV2aWNlJ3MgbG9jYWxlCisgIG9wdGlvbmFsIHN0cmluZyBsb2NhbGUgPSA4OworCisgIC8vIFRoZSBoYW5kbGUgZm9yIHVzZXJfcHVibGljX2tleSAoYW5kIGltcGxpY2l0bHksIGEgbWFzdGVyIGtleSkKKyAgb3B0aW9uYWwgYnl0ZXMga2V5X2hhbmRsZSA9IDk7CisKKyAgLy8gVGhlIGluaXRpYWwgY291bnRlciB2YWx1ZSBmb3IgdGhlIGRldmljZSwgc2VudCBieSB0aGUgZGV2aWNlCisgIG9wdGlvbmFsIGludDY0IGNvdW50ZXIgPSAxMiBbZGVmYXVsdCA9IDBdOworCisgIC8vIFRoZSBPcGVyYXRpbmcgU3lzdGVtIHZlcnNpb24gb24gdGhlIGRldmljZQorICAvLyAoZS5nLiwgYW4gYW5kcm9pZC5vcy5CdWlsZC5ESVNQTEFZIG9yIFVJRGV2aWNlLnN5c3RlbVZlcnNpb24pCisgIG9wdGlvbmFsIHN0cmluZyBkZXZpY2Vfb3NfdmVyc2lvbiA9IDEzOworCisgIC8vIFRoZSBPcGVyYXRpbmcgU3lzdGVtIHZlcnNpb24gbnVtYmVyIG9uIHRoZSBkZXZpY2UKKyAgLy8gKGUuZy4sIGFuIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UKQorICBvcHRpb25hbCBpbnQ2NCBkZXZpY2Vfb3NfdmVyc2lvbl9jb2RlID0gMTQ7CisKKyAgLy8gVGhlIE9wZXJhdGluZyBTeXN0ZW0gcmVsZWFzZSBvbiB0aGUgZGV2aWNlCisgIC8vIChlLmcuLCBhbiBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uUkVMRUFTRSkKKyAgb3B0aW9uYWwgc3RyaW5nIGRldmljZV9vc19yZWxlYXNlID0gMTU7CisKKyAgLy8gVGhlIE9wZXJhdGluZyBTeXN0ZW0gY29kZW5hbWUgb24gdGhlIGRldmljZQorICAvLyAoZS5nLiwgYW4gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLkNPREVOQU1FIG9yIFVJRGV2aWNlLnN5c3RlbU5hbWUpCisgIG9wdGlvbmFsIHN0cmluZyBkZXZpY2Vfb3NfY29kZW5hbWUgPSAxNjsKKworICAvLyBUaGUgc29mdHdhcmUgdmVyc2lvbiBydW5uaW5nIG9uIHRoZSBkZXZpY2UKKyAgLy8gKGUuZy4sIEF1dGhlbnRpY2F0b3IgYXBwIHZlcnNpb24gc3RyaW5nKQorICBvcHRpb25hbCBzdHJpbmcgZGV2aWNlX3NvZnR3YXJlX3ZlcnNpb24gPSAxNzsKKworICAvLyBUaGUgc29mdHdhcmUgdmVyc2lvbiBudW1iZXIgcnVubmluZyBvbiB0aGUgZGV2aWNlCisgIC8vIChlLmcuLCBBdXRoZW50aWNhdG9yIGFwcCB2ZXJzaW9uIGNvZGUpCisgIG9wdGlvbmFsIGludDY0IGRldmljZV9zb2Z0d2FyZV92ZXJzaW9uX2NvZGUgPSAxODsKKworICAvLyBTb2Z0d2FyZSBwYWNrYWdlIGluZm9ybWF0aW9uIGlmIGFwcGxpY2FibGUKKyAgLy8gKGUuZy4sIGNvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmF1dGhlbnRpY2F0b3IyKQorICBvcHRpb25hbCBzdHJpbmcgZGV2aWNlX3NvZnR3YXJlX3BhY2thZ2UgPSAxOTsKKworICAvLyBTaXplIG9mIHRoZSBkaXNwbGF5IGluIHRob3VzYW5kdGhzIG9mIGFuIGluY2ggKGUuZy4sIDcwMDAgbWlscyA9IDcgaW4pCisgIG9wdGlvbmFsIGludDMyIGRldmljZV9kaXNwbGF5X2RpYWdvbmFsX21pbHMgPSAyMjsKKworICAvLyBGb3IgQXV0aHplbiBjYXBhYmxlIGRldmljZXMsIHRoZWlyIEF1dGh6ZW4gcHJvdG9jb2wgdmVyc2lvbgorICBvcHRpb25hbCBpbnQzMiBkZXZpY2VfYXV0aHplbl92ZXJzaW9uID0gMjQ7CisKKyAgLy8gTm90IGFsbCBkZXZpY2VzIGhhdmUgZGV2aWNlIGlkZW50aWZpZXJzIHRoYXQgZml0IGluIDY0IGJpdHMuCisgIG9wdGlvbmFsIGJ5dGVzIGxvbmdfZGV2aWNlX2lkID0gMjk7CisKKyAgLy8gVGhlIGRldmljZSBtYW51ZmFjdHVyZXIgbmFtZQorICAvLyAoZS5nLiwgYW5kcm9pZC5vcy5CdWlsZC5NQU5VRkFDVFVSRVIpCisgIG9wdGlvbmFsIHN0cmluZyBkZXZpY2VfbWFudWZhY3R1cmVyID0gMzE7CisKKyAgLy8gVXNlZCB0byBpbmRpY2F0ZSB3aGljaCB0eXBlIG9mIGRldmljZSB0aGlzIGlzLgorICBvcHRpb25hbCBEZXZpY2VUeXBlIGRldmljZV90eXBlID0gMzIgWyBkZWZhdWx0ID0gQU5EUk9JRCBdOworCisgIC8vIEZpZWxkcyBjb3JyZXNwb25kaW5nIHRvIHNjcmVlbmxvY2sgdHlwZS9mZWF0dXJlcyBhbmQgaGFyZHdhcmUgZmVhdHVyZXMKKyAgLy8gc2hvdWxkIGJlIG51bWJlcmVkIGluIHRoZSA0MDAgcmFuZ2UuCisKKyAgLy8gSXMgdGhpcyBkZXZpY2UgdXNpbmcgIGEgc2VjdXJlIHNjcmVlbmxvY2sgKGUuZy4sIHBhdHRlcm4gb3IgcGluIHVubG9jaykKKyAgb3B0aW9uYWwgYm9vbCB1c2luZ19zZWN1cmVfc2NyZWVubG9jayA9IDQwMCBbIGRlZmF1bHQgPSBmYWxzZSBdOworCisgIC8vIElzIGF1dG8tdW5sb2NraW5nIHRoZSBzY3JlZW5sb2NrIChlLmcuLCB3aGVuIGF0ICJob21lIikgc3VwcG9ydGVkPworICBvcHRpb25hbCBib29sIGF1dG9fdW5sb2NrX3NjcmVlbmxvY2tfc3VwcG9ydGVkID0gNDAxIFsgZGVmYXVsdCA9IGZhbHNlIF07CisKKyAgLy8gSXMgYXV0by11bmxvY2tpbmcgdGhlIHNjcmVlbmxvY2sgKGUuZy4sIHdoZW4gYXQgImhvbWUiKSBlbmFibGVkPworICBvcHRpb25hbCBib29sIGF1dG9fdW5sb2NrX3NjcmVlbmxvY2tfZW5hYmxlZCA9IDQwMiBbIGRlZmF1bHQgPSBmYWxzZSBdOworCisgIC8vIERvZXMgdGhlIGRldmljZSBoYXZlIGEgQmx1ZXRvb3RoIChjbGFzc2ljKSByYWRpbz8KKyAgb3B0aW9uYWwgYm9vbCBibHVldG9vdGhfcmFkaW9fc3VwcG9ydGVkID0gNDAzIFsgZGVmYXVsdCA9IGZhbHNlIF07CisKKyAgLy8gSXMgdGhlIEJsdWV0b290aCAoY2xhc3NpYykgcmFkaW8gb24/CisgIG9wdGlvbmFsIGJvb2wgYmx1ZXRvb3RoX3JhZGlvX2VuYWJsZWQgPSA0MDQgWyBkZWZhdWx0ID0gZmFsc2UgXTsKKworICAvLyBEb2VzIHRoZSBkZXZpY2UgaGFyZHdhcmUgc3VwcG9ydCBhIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb24/CisgIG9wdGlvbmFsIGJvb2wgbW9iaWxlX2RhdGFfc3VwcG9ydGVkID0gNDA1IFsgZGVmYXVsdCA9IGZhbHNlIF07CisKKyAgLy8gRG9lcyB0aGUgZGV2aWNlIHN1cHBvcnQgdGV0aGVyaW5nPworICBvcHRpb25hbCBib29sIHRldGhlcmluZ19zdXBwb3J0ZWQgPSA0MDYgWyBkZWZhdWx0ID0gZmFsc2UgXTsKKworICAvLyBEb2VzIHRoZSBkZXZpY2UgaGF2ZSBhIEJMRSByYWRpbz8KKyAgb3B0aW9uYWwgYm9vbCBibGVfcmFkaW9fc3VwcG9ydGVkID0gNDA3IFsgZGVmYXVsdCA9IGZhbHNlIF07CisKKyAgLy8gSXMgdGhlIGRldmljZSBhICJQaXhlbCBFeHBlcmllbmNlIiBBbmRyb2lkIGRldmljZT8KKyAgb3B0aW9uYWwgYm9vbCBwaXhlbF9leHBlcmllbmNlID0gNDA4IFsgZGVmYXVsdCA9IGZhbHNlIF07CisKKyAgLy8gSXMgdGhlIGRldmljZSBydW5uaW5nIGluIHRoZSBBUkMrKyBjb250YWluZXIgb24gYSBjaHJvbWVib29rPworICBvcHRpb25hbCBib29sIGFyY19wbHVzX3BsdXMgPSA0MDkgWyBkZWZhdWx0ID0gZmFsc2UgXTsKKworICAvLyBJcyB0aGUgdmFsdWUgc2V0IGluIHx1c2luZ19zZWN1cmVfc2NyZWVubG9ja3wgcmVsaWFibGU/IE9uIHNvbWUgQW5kcm9pZAorICAvLyBkZXZpY2VzLCB0aGUgcGxhdGZvcm0gQVBJIHRvIGdldCB0aGUgc2NyZWVubG9jayBzdGF0ZSBpcyBub3QgdHJ1c3R3b3J0aHkuCisgIC8vIFNlZSBiLzMyMjEyMTYxLgorICBvcHRpb25hbCBib29sIGlzX3NjcmVlbmxvY2tfc3RhdGVfZmxha3kgPSA0MTAgWyBkZWZhdWx0ID0gZmFsc2UgXTsKKworICAvLyBBIGxpc3Qgb2YgbXVsdGktZGV2aWNlIHNvZnR3YXJlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLgorICByZXBlYXRlZCBTb2Z0d2FyZUZlYXR1cmUgc3VwcG9ydGVkX3NvZnR3YXJlX2ZlYXR1cmVzID0gNDExOworCisgIC8vIEEgbGlzdCBvZiBtdWx0aS1kZXZpY2Ugc29mdHdhcmUgZmVhdHVyZXMgY3VycmVudGx5IGVuYWJsZWQgKGFjdGl2ZSkgb24gdGhlCisgIC8vIGRldmljZS4KKyAgcmVwZWF0ZWQgU29mdHdhcmVGZWF0dXJlIGVuYWJsZWRfc29mdHdhcmVfZmVhdHVyZXMgPSA0MTI7CisKKyAgLy8gVGhlIGVucm9sbG1lbnQgc2Vzc2lvbiBpZCB0aGlzIGlzIHNlbnQgd2l0aAorICBvcHRpb25hbCBieXRlcyBlbnJvbGxtZW50X3Nlc3Npb25faWQgPSAxMDAwOworCisgIC8vIEEgY29weSBvZiB0aGUgdXNlcidzIE9BdXRoIHRva2VuCisgIG9wdGlvbmFsIHN0cmluZyBvYXV0aF90b2tlbiA9IDEwMDE7Cit9CisKKy8vIFRoaXMgZW51bSBpcyB1c2VkIGJ5IGlPUyBkZXZpY2VzIGFzIHZhbHVlcyBmb3IgZGV2aWNlX2Rpc3BsYXlfZGlhZ29uYWxfbWlscworLy8gaW4gR2NtRGV2aWNlSW5mby4gVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gY2FsY3VsYXRlIGl0IG9uIHRob3NlIGRldmljZXMuCitlbnVtIEFwcGxlRGV2aWNlRGlhZ29uYWxNaWxzIHsKKyAgLy8gVGhpcyBpcyB0aGUgbWlscyBkaWFnb25hbCBvbiBhbiBpUGhvbmUgNS4KKyAgQVBQTEVfUEhPTkUgPSA0MDAwOworICAvLyBUaGlzIGlzIHRoZSBtaWxzIGRpYWdvbmFsIG9uIGFuIGlQYWQgbWluaS4KKyAgQVBQTEVfUEFEID0gNzkwMDsKK30KKworLy8gVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggRGV2aWNlVHlwZSBpbjoKKy8vIGphdmEvY29tL2dvb2dsZS9zZWN1cml0eS9jcnlwdGF1dGgvYmFja2VuZC9zZXJ2aWNlcy9jb21tb24vY29tbW9uX2VudW1zLnByb3RvCitlbnVtIERldmljZVR5cGUgeworICBVTktOT1dOID0gMDsKKyAgQU5EUk9JRCA9IDE7CisgIENIUk9NRSA9IDI7CisgIElPUyA9IDM7CisgIEJST1dTRVIgPSA0OworICBPU1ggPSA1OworfQorCisvLyBNdWx0aURldmljZSBmZWF0dXJlcyB3aGljaCBtYXkgYmUgc3VwcG9ydGVkIGFuZCBlbmFibGVkIG9uIGEgZGV2aWNlLgorZW51bSBTb2Z0d2FyZUZlYXR1cmUgeworICBVTktOT1dOX0ZFQVRVUkUgPSAwOworICBCRVRURVJfVE9HRVRIRVJfSE9TVCA9IDE7CisgIEJFVFRFUl9UT0dFVEhFUl9DTElFTlQgPSAyOworICBFQVNZX1VOTE9DS19IT1NUID0gMzsKKyAgRUFTWV9VTkxPQ0tfQ0xJRU5UID0gNDsKKyAgTUFHSUNfVEVUSEVSX0hPU1QgPSA1OworICBNQUdJQ19URVRIRVJfQ0xJRU5UID0gNjsKKyAgU01TX0NPTk5FQ1RfSE9TVCA9IDc7CisgIFNNU19DT05ORUNUX0NMSUVOVCA9IDg7Cit9CisKKy8vIEEgbGlzdCBvZiAicmVhc29ucyIgdGhhdCBjYW4gYmUgcHJvdmlkZWQgZm9yIGNhbGxpbmcgc2VydmVyLXNpZGUgQVBJcy4KKy8vIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgY2FsbHMgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGRpZmZlcmVudAorLy8ga2luZHMgb2YgZXZlbnRzLiBQbGVhc2UgdHJ5IHRvIGtlZXAgcmVhc29ucyBhcyBnZW5lcmljIGFzIHBvc3NpYmxlLCBzbyB0aGF0CisvLyBjb2RlcyBjYW4gYmUgcmUtdXNlZCBieSB2YXJpb3VzIGNhbGxlcnMgaW4gYSBzZW5zaWJsZSBmYXNoaW9uLgorZW51bSBJbnZvY2F0aW9uUmVhc29uIHsKKyAgUkVBU09OX1VOS05PV04gPSAwOworICAvLyBGaXJzdCBydW4gb2YgdGhlIHNvZnR3YXJlIHBhY2thZ2UgaW52b2tpbmcgdGhpcyBjYWxsCisgIFJFQVNPTl9JTklUSUFMSVpBVElPTiA9IDE7CisgIC8vIE9yZGluYXJ5IHBlcmlvZGljIGFjdGlvbnMgKGUuZy4gbW9udGhseSBtYXN0ZXIga2V5IHJvdGF0aW9uKQorICBSRUFTT05fUEVSSU9ESUMgPSAyOworICAvLyBTbG93LWN5Y2xlIHBlcmlvZGljIGFjdGlvbiAoZS5nLiB5ZWFybHkga2V5cGFpciByb3RhdGlvbj8/PykKKyAgUkVBU09OX1NMT1dfUEVSSU9ESUMgPSAzOworICAvLyBGYXN0LWN5Y2xlIHBlcmlvZGljIGFjdGlvbiAoZS5nLiBkYWlseSBzeW5jIGZvciBTbWFydCBMb2NrIHVzZXJzKQorICBSRUFTT05fRkFTVF9QRVJJT0RJQyA9IDQ7CisgIC8vIEV4cGlyZWQgc3RhdGUgKGUuZy4gZXhwaXJlZCBjcmVkZW50aWFscywgb3IgY2FjaGVkIGVudHJpZXMpIHdhcyBkZXRlY3RlZAorICBSRUFTT05fRVhQSVJBVElPTiA9IDU7CisgIC8vIEFuIHVuZXhwZWN0ZWQgcHJvdG9jb2wgZmFpbHVyZSBvY2N1cnJlZCAoc28gYXR0ZW1wdGluZyB0byByZXBhaXIgc3RhdGUpCisgIFJFQVNPTl9GQUlMVVJFX1JFQ09WRVJZID0gNjsKKyAgLy8gQSBuZXcgYWNjb3VudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZGV2aWNlCisgIFJFQVNPTl9ORVdfQUNDT1VOVCA9IDc7CisgIC8vIEFuIGV4aXN0aW5nIGFjY291bnQgb24gdGhlIGRldmljZSBoYXMgYmVlbiBjaGFuZ2VkCisgIFJFQVNPTl9DSEFOR0VEX0FDQ09VTlQgPSA4OworICAvLyBUaGUgdXNlciB0b2dnbGVkIHRoZSBzdGF0ZSBvZiBhIGZlYXR1cmUgKGUuZy4gU21hcnQgTG9jayBlbmFibGVkIHZpYSBCVCkKKyAgUkVBU09OX0ZFQVRVUkVfVE9HR0xFRCA9IDk7CisgIC8vIEEgInB1c2giIGZyb20gdGhlIHNlcnZlciBjYXVzZWQgdGhpcyBhY3Rpb24gKGUuZy4gYSBzeW5jIHRpY2tsZSkKKyAgUkVBU09OX1NFUlZFUl9JTklUSUFURUQgPSAxMDsKKyAgLy8gQSBsb2NhbCBhZGRyZXNzIGNoYW5nZSB0cmlnZ2VyZWQgdGhpcyAoZS5nLiBHQ00gcmVnaXN0cmF0aW9uIGlkIGNoYW5nZWQpCisgIFJFQVNPTl9BRERSRVNTX0NIQU5HRSA9IDExOworICAvLyBBIHNvZnR3YXJlIHVwZGF0ZSBoYXMgdHJpZ2dlcmVkIHRoaXMKKyAgUkVBU09OX1NPRlRXQVJFX1VQREFURSA9IDEyOworICAvLyBBIG1hbnVhbCBhY3Rpb24gYnkgdGhlIHVzZXIgdHJpZ2dlcmVkIHRoaXMgKGUuZy4gY29tbWFuZHMgc2VudCB2aWEgYWRiKQorICBSRUFTT05fTUFOVUFMID0gMTM7CisgIC8vIEEgY3VzdG9tIGtleSBoYXMgYmVlbiBpbnZhbGlkYXRlZCBvbiB0aGUgZGV2aWNlIChlLmcuIHNjcmVlbiBsb2NrIGlzCisgIC8vIGRpc2FibGVkKS4KKyAgUkVBU09OX0NVU1RPTV9LRVlfSU5WQUxJREFUSU9OID0gMTQ7CisgIC8vIFBlcmlvZGljIGFjdGlvbiB0cmlnZ2VyZWQgYnkgYXV0aF9wcm94aW1pdHkKKyAgUkVBU09OX1BST1hJTUlUWV9QRVJJT0RJQyA9IDE1OworfQorCitlbnVtIFR5cGUgeworICBFTlJPTExNRU5UID0gMDsKKyAgVElDS0xFID0gMTsKKyAgVFhfUkVRVUVTVCA9IDI7CisgIFRYX1JFUExZID0gMzsKKyAgVFhfU1lOQ19SRVFVRVNUID0gNDsKKyAgVFhfU1lOQ19SRVNQT05TRSA9IDU7CisgIFRYX1BJTkcgPSA2OworICBERVZJQ0VfSU5GT19VUERBVEUgPSA3OworICBUWF9DQU5DRUxfUkVRVUVTVCA9IDg7CisKKyAgLy8gREVQUkVDQVRFRCAoY2FuIGJlIHJlLXVzZWQgYWZ0ZXIgQXVnIDIwMTUpCisgIFBST1hJTUlUWUFVVEhfUEFJUklORyA9IDEwOworCisgIC8vIFRoZSBraW5kIG9mIGlkZW50aXR5IGFzc2VydGlvbiBnZW5lcmF0ZWQgYnkgYSAiR0NNIFYxIiBkZXZpY2UgKGkuZS4sCisgIC8vIGFuIEFuZHJvaWQgcGhvbmUgdGhhdCBoYXMgcmVnaXN0ZXJlZCB3aXRoIHVzIGEgcHVibGljIGFuZCBhIHN5bW1ldHJpYworICAvLyBrZXkpCisgIEdDTVYxX0lERU5USVRZX0FTU0VSVElPTiA9IDExOworCisgIC8vIERldmljZS10by1kZXZpY2UgY29tbXVuaWNhdGlvbnMgYXJlIHByb3RlY3RlZCBieSBhbiB1bmF1dGhlbnRpY2F0ZWQKKyAgLy8gRGlmZmllLUhlbGxtYW4gZXhjaGFuZ2UuIFRoZSBJbml0aWF0b3JIZWxsbyBtZXNzYWdlIGlzIHNpbXBseSB0aGUKKyAgLy8gaW5pdGlhdG9yJ3MgcHVibGljIERIIGtleSwgYW5kIGlzIG5vdCBlbmNvZGVkIGFzIGEgU2VjdXJlTWVzc2FnZSwgc28KKyAgLy8gaXQgZG9lc24ndCBoYXZlIGEgdGFnLgorICAvLyBUaGUgUmVzcG9uZGVySGVsbG8gbWVzc2FnZSAod2hpY2ggaXMgc2VudCBieSB0aGUgcmVzcG9uZGVyCisgIC8vIHRvIHRoZSBpbml0aWF0b3IpLCBvbiB0aGUgb3RoZXIgaGFuZCwgY2FycmllcyBhIHBheWxvYWQgdGhhdCBpcyBwcm90ZWN0ZWQKKyAgLy8gYnkgdGhlIGRlcml2ZWQgc2hhcmVkIGtleS4gSXQgYWxzbyBjb250YWlucyB0aGUgcmVzcG9uZGVyJ3MKKyAgLy8gcHVibGljIERIIGtleS4gUmVzcG9uZGVySGVsbG9BbmRQYXlsb2FkIG1lc3NhZ2VzIGhhdmUgdGhlCisgIC8vIERFVklDRV9UT19ERVZJQ0VfUkVTUE9OREVSX0hFTExPIHRhZy4KKyAgREVWSUNFX1RPX0RFVklDRV9SRVNQT05ERVJfSEVMTE9fUEFZTE9BRCA9IDEyOworCisgIC8vIERldmljZS10by1kZXZpY2UgY29tbXVuaWNhdGlvbnMgYXJlIHByb3RlY3RlZCBieSBhbiB1bmF1dGhlbnRpY2F0ZWQKKyAgLy8gRGlmZmllLUhlbGxtYW4gZXhjaGFuZ2UuIE9uY2UgdGhlIGluaXRpYXRvciBhbmQgcmVzcG9uZGVyCisgIC8vIGFncmVlIG9uIGEgc2hhcmVkIGtleSAodGhyb3VnaCBEaWZmaWUtSGVsbG1hbiksIHRoZXkgd2lsbCB1c2UgbWVzc2FnZXMKKyAgLy8gdGFnZ2VkIHdpdGggREVWSUNFX1RPX0RFVklDRV9NRVNTQUdFIHRvIGV4Y2hhbmdlIGRhdGEuCisgIERFVklDRV9UT19ERVZJQ0VfTUVTU0FHRSA9IDEzOworCisgIC8vIE5vdGlmaWNhdGlvbiB0byBsZXQgYSBkZXZpY2Uga25vdyBpdCBzaG91bGQgY29udGFjdCBhIG5lYXJieSBkZXZpY2UuCisgIERFVklDRV9QUk9YSU1JVFlfQ0FMTEJBQ0sgPSAxNDsKKworICAvLyBEZXZpY2UtdG8tZGV2aWNlIGNvbW11bmljYXRpb25zIGFyZSBwcm90ZWN0ZWQgYnkgYW4gdW5hdXRoZW50aWNhdGVkCisgIC8vIERpZmZpZS1IZWxsbWFuIGV4Y2hhbmdlLiBEdXJpbmcgZGV2aWNlLXRvLWRldmljZSBhdXRoZW50aWNhdGlvbiwgdGhlIGZpcnN0CisgIC8vIG1lc3NhZ2UgZnJvbSBpbml0aWF0b3IgKHRoZSBjaGFsbGVuZ2UpIGlzIHNpZ25lZCBhbmQgcHV0IGludG8gdGhlIHBheWxvYWQKKyAgLy8gb2YgdGhlIG1lc3NhZ2Ugc2VudCBiYWNrIHRvIHRoZSBpbml0aWF0b3IuCisgIFVOTE9DS19LRVlfU0lHTkVEX0NIQUxMRU5HRSA9IDE1OworCisgIC8vIFNwZWNpYWx0eSAoY29ycCBvbmx5KSBmZWF0dXJlcworICBMT0dJTl9OT1RJRklDQVRJT04gPSAxMDE7Cit9CisKK21lc3NhZ2UgR2NtTWV0YWRhdGEgeworICByZXF1aXJlZCBUeXBlIHR5cGUgPSAxOworICBvcHRpb25hbCBpbnQzMiB2ZXJzaW9uID0gMiBbZGVmYXVsdCA9IDBdOworfQorCittZXNzYWdlIFRpY2tsZSB7CisgIC8vIFRpbWUgYWZ0ZXIgd2hpY2ggdGhpcyB0aWNrbGUgc2hvdWxkIGV4cGlyZQorICBvcHRpb25hbCBmaXhlZDY0IGV4cGlyeV90aW1lID0gMTsKK30KKworbWVzc2FnZSBMb2dpbk5vdGlmaWNhdGlvbkluZm8geworICAvLyBUaW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVjZWl2ZWQgdGhlIGxvZ2luIG5vdGlmaWNhdGlvbiByZXF1ZXN0LgorICBvcHRpb25hbCBmaXhlZDY0IGNyZWF0aW9uX3RpbWUgPSAyOworCisgIC8vIE11c3QgY29ycmVzcG9uZCB0byB1c2VyX2lkIGluIExvZ2luTm90aWZpY2F0aW9uUmVxdWVzdCwgaWYgc2V0LgorICBvcHRpb25hbCBzdHJpbmcgZW1haWwgPSAzOworCisgIC8vIEhvc3Qgd2hlcmUgdGhlIHVzZXIncyBjcmVkZW50aWFscyB3ZXJlIHVzZWQgdG8gbG9naW4sIGlmIG1lYW5pbmdmdWwuCisgIG9wdGlvbmFsIHN0cmluZyBob3N0ID0gNDsKKworICAvLyBMb2NhdGlvbiBmcm9tIHdoZXJlIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMgd2VyZSB1c2VkLCBpZiBtZWFuaW5nZnVsLgorICBvcHRpb25hbCBzdHJpbmcgc291cmNlID0gNTsKKworICAvLyBUeXBlIG9mIGxvZ2luLCBlLmcuIHNzaCwgZ25vbWUtc2NyZWVuc2F2ZXIsIG9yIHdlYi4KKyAgb3B0aW9uYWwgc3RyaW5nIGV2ZW50X3R5cGUgPSA2OworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL3Byb3RvL3NlY3VyZW1lc3NhZ2UucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvdWtleTIvc3JjL21haW4vcHJvdG8vc2VjdXJlbWVzc2FnZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjJlNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL3Byb3RvL3NlY3VyZW1lc3NhZ2UucHJvdG8KQEAgLTAsMCArMSwxMjQgQEAKKy8qIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIFByb3RvIGRlZmluaXRpb25zIGZvciBTZWN1cmVNZXNzYWdlIGZvcm1hdAorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBzZWN1cmVtZXNzYWdlOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnNlY3VyaXR5LmNyeXB0YXV0aC5saWIuc2VjdXJlbWVzc2FnZSI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiU2VjdXJlTWVzc2FnZVByb3RvIjsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJTTVNHIjsKKworbWVzc2FnZSBTZWN1cmVNZXNzYWdlIHsKKyAgLy8gTXVzdCBjb250YWluIGEgSGVhZGVyQW5kQm9keSBtZXNzYWdlCisgIHJlcXVpcmVkIGJ5dGVzIGhlYWRlcl9hbmRfYm9keSA9IDE7CisgIC8vIFNpZ25hdHVyZSBvZiBoZWFkZXJfYW5kX2JvZHkKKyAgcmVxdWlyZWQgYnl0ZXMgc2lnbmF0dXJlID0gMjsKK30KKworLy8gU3VwcG9ydGVkICJzaWduYXR1cmUiIHNjaGVtZXMgKGJvdGggc3ltbWV0cmljIGtleSBhbmQgcHVibGljIGtleSBiYXNlZCkKK2VudW0gU2lnU2NoZW1lIHsKKyAgSE1BQ19TSEEyNTYgPSAxOworICBFQ0RTQV9QMjU2X1NIQTI1NiA9IDI7CisgIC8vIE5vdCByZWNvbW1lbmRlZCAtLSB1c2UgRUNEU0FfUDI1Nl9TSEEyNTYgaW5zdGVhZAorICBSU0EyMDQ4X1NIQTI1NiA9IDM7Cit9CisKKy8vIFN1cHBvcnRlZCBlbmNyeXB0aW9uIHNjaGVtZXMKK2VudW0gRW5jU2NoZW1lIHsKKyAgLy8gTm8gZW5jcnlwdGlvbgorICBOT05FID0gMTsKKyAgQUVTXzI1Nl9DQkMgPSAyOworfQorCittZXNzYWdlIEhlYWRlciB7CisgIHJlcXVpcmVkIFNpZ1NjaGVtZSBzaWduYXR1cmVfc2NoZW1lID0gMTsKKyAgcmVxdWlyZWQgRW5jU2NoZW1lIGVuY3J5cHRpb25fc2NoZW1lID0gMjsKKyAgLy8gSWRlbnRpZmllcyB0aGUgdmVyaWZpY2F0aW9uIGtleQorICBvcHRpb25hbCBieXRlcyB2ZXJpZmljYXRpb25fa2V5X2lkID0gMzsKKyAgLy8gSWRlbnRpZmllcyB0aGUgZGVjcnlwdGlvbiBrZXkKKyAgb3B0aW9uYWwgYnl0ZXMgZGVjcnlwdGlvbl9rZXlfaWQgPSA0OworICAvLyBFbmNyeXB0aW9uIG1heSB1c2UgYW4gSVYKKyAgb3B0aW9uYWwgYnl0ZXMgaXYgPSA1OworICAvLyBBcmJpdHJhcnkgcGVyLXByb3RvY29sIHB1YmxpYyBkYXRhLCB0byBiZSBzZW50IHdpdGggdGhlIHBsYWluLXRleHQgaGVhZGVyCisgIG9wdGlvbmFsIGJ5dGVzIHB1YmxpY19tZXRhZGF0YSA9IDY7CisgIC8vIFRoZSBsZW5ndGggb2Ygc29tZSBhc3NvY2lhdGVkIGRhdGEgdGhpcyBpcyBub3Qgc2VudCBpbiB0aGlzIFNlY3VyZU1lc3NhZ2UsCisgIC8vIGJ1dCB3aGljaCB3aWxsIGJlIGJvdW5kIHRvIHRoZSBzaWduYXR1cmUuCisgIG9wdGlvbmFsIHVpbnQzMiBhc3NvY2lhdGVkX2RhdGFfbGVuZ3RoID0gNyBbIGRlZmF1bHQgPSAwIF07Cit9CisKK21lc3NhZ2UgSGVhZGVyQW5kQm9keSB7CisgIC8vIFB1YmxpYyBkYXRhIGFib3V0IHRoaXMgbWVzc2FnZSAodG8gYmUgYm91bmQgaW4gdGhlIHNpZ25hdHVyZSkKKyAgcmVxdWlyZWQgSGVhZGVyIGhlYWRlciA9IDE7CisgIC8vIFBheWxvYWQgZGF0YQorICByZXF1aXJlZCBieXRlcyBib2R5ID0gMjsKK30KKworLy8gTXVzdCBiZSBrZXB0IHdpcmUtZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBIZWFkZXJBbmRCb2R5LiBQcm92aWRlcyB0aGUKKy8vIFNlY3VyZU1lc3NhZ2UgY29kZSB3aXRoIGEgY29uc2lzdGVudCB3aXJlLWZvcm1hdCByZXByZXNlbnRhdGlvbiB0aGF0CisvLyByZW1haW5zIHN0YWJsZSBpcnJlc3BlY3RpdmUgb2YgcHJvdG9idWYgaW1wbGVtZW50YXRpb24gY2hvaWNlcy4gVGhpcworLy8gbG93LWxldmVsIHJlcHJlc2VudGF0aW9uIG9mIGEgSGVhZGVyQW5kQm9keSBzaG91bGQgbm90IGJlIHVzZWQgYnkKKy8vIGFueSBjb2RlIG91dHNpZGUgb2YgdGhlIFNlY3VyZU1lc3NhZ2UgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi90ZXN0cy4KK21lc3NhZ2UgSGVhZGVyQW5kQm9keUludGVybmFsIHsKKyAgLy8gQSByYXcgKHdpcmUtZm9ybWF0KSBieXRlIGVuY29kaW5nIG9mIGEgSGVhZGVyLCBzdWl0YWJsZSBmb3IgaGFzaGluZworICByZXF1aXJlZCBieXRlcyBoZWFkZXIgPSAxOworICAvLyBQYXlsb2FkIGRhdGEKKyAgcmVxdWlyZWQgYnl0ZXMgYm9keSA9IDI7Cit9CisKKy8vIC0tLS0tLS0KKy8vIFRoZSByZW1haW5kZXIgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaGVyZSBhcmUgcHJvdmlkZWQgb25seSBmb3IKKy8vIGNvbnZlbmllbmNlLiBUaGV5IGFyZSBub3QgbmVlZGVkIGZvciBTZWN1cmVNZXNzYWdlIHByb3BlciwgYnV0IGFyZQorLy8gY29tbW9ubHkgdXNlZnVsIHdoZXJldmVyIFNlY3VyZU1lc3NhZ2UgbWlnaHQgYmUgYXBwbGllZC4KKy8vIC0tLS0tLS0KKworLy8gQSBsaXN0IG9mIHN1cHBvcnRlZCBwdWJsaWMga2V5IHR5cGVzCitlbnVtIFB1YmxpY0tleVR5cGUgeworICBFQ19QMjU2ID0gMTsKKyAgUlNBMjA0OCA9IDI7CisgIC8vIDIwNDgtYml0IE1PRFAgZ3JvdXAgMTQsIGZyb20gUkZDIDM1MjYKKyAgREgyMDQ4X01PRFAgPSAzOworfQorCisvLyBBIGNvbnZlbmllbmNlIHByb3RvIGZvciBlbmNvZGluZyBOSVNUIFAtMjU2IGVsbGlwdGljIGN1cnZlIHB1YmxpYyBrZXlzCittZXNzYWdlIEVjUDI1NlB1YmxpY0tleSB7CisgIC8vIHggYW5kIHkgYXJlIGVuY29kZWQgaW4gYmlnLWVuZGlhbiB0d28ncyBjb21wbGVtZW50IChzbGlnaHRseSB3YXN0ZWZ1bCkKKyAgLy8gQ2xpZW50IE1VU1QgdmVyaWZ5ICh4LHkpIGlzIGEgdmFsaWQgcG9pbnQgb24gTklTVCBQMjU2CisgIHJlcXVpcmVkIGJ5dGVzIHggPSAxOworICByZXF1aXJlZCBieXRlcyB5ID0gMjsKK30KKworLy8gQSBjb252ZW5pZW5jZSBwcm90byBmb3IgZW5jb2RpbmcgUlNBIHB1YmxpYyBrZXlzIHdpdGggc21hbGwgZXhwb25lbnRzCittZXNzYWdlIFNpbXBsZVJzYVB1YmxpY0tleSB7CisgIC8vIEVuY29kZWQgaW4gYmlnLWVuZGlhbiB0d28ncyBjb21wbGVtZW50CisgIHJlcXVpcmVkIGJ5dGVzIG4gPSAxOworICBvcHRpb25hbCBpbnQzMiBlID0gMiBbZGVmYXVsdCA9IDY1NTM3XTsKK30KKworLy8gQSBjb252ZW5pZW5jZSBwcm90byBmb3IgZW5jb2RpbmcgRGlmZmllLUhlbGxtYW4gcHVibGljIGtleXMsCisvLyBmb3IgdXNlIG9ubHkgd2hlbiBFbGxpcHRpYyBDdXJ2ZSBiYXNlZCBrZXkgZXhjaGFuZ2VzIGFyZSBub3QgcG9zc2libGUuCisvLyAoTm90ZSB0aGF0IHRoZSBncm91cCBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkpCittZXNzYWdlIERoUHVibGljS2V5IHsKKyAgLy8gQmlnLWVuZGlhbiB0d28ncyBjb21wbGVtZW50IGVuY29kZWQgZ3JvdXAgZWxlbWVudAorICByZXF1aXJlZCBieXRlcyB5ID0gMTsKK30KKworbWVzc2FnZSBHZW5lcmljUHVibGljS2V5IHsKKyAgcmVxdWlyZWQgUHVibGljS2V5VHlwZSB0eXBlID0gMTsKKyAgb3B0aW9uYWwgRWNQMjU2UHVibGljS2V5IGVjX3AyNTZfcHVibGljX2tleSA9IDI7CisgIG9wdGlvbmFsIFNpbXBsZVJzYVB1YmxpY0tleSByc2EyMDQ4X3B1YmxpY19rZXkgPSAzOworICAvLyBVc2Ugb25seSBhcyBhIGxhc3QgcmVzb3J0CisgIG9wdGlvbmFsIERoUHVibGljS2V5IGRoMjA0OF9wdWJsaWNfa2V5ID0gNDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9wcm90by91a2V5LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3VrZXkyL3NyYy9tYWluL3Byb3RvL3VrZXkucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1YjI3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS91a2V5Mi9zcmMvbWFpbi9wcm90by91a2V5LnByb3RvCkBAIC0wLDAgKzEsMTA0IEBACisvKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBzZWN1cmVnY207CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5zZWN1cml0eS5jcnlwdGF1dGgubGliLnNlY3VyZWdjbSI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVWtleVByb3RvIjsKKworbWVzc2FnZSBVa2V5Mk1lc3NhZ2UgeworICBlbnVtIFR5cGUgeworICAgIFVOS05PV05fRE9fTk9UX1VTRSA9IDA7CisgICAgQUxFUlQgPSAxOworICAgIENMSUVOVF9JTklUID0gMjsKKyAgICBTRVJWRVJfSU5JVCA9IDM7CisgICAgQ0xJRU5UX0ZJTklTSCA9IDQ7CisgIH0KKworICBvcHRpb25hbCBUeXBlIG1lc3NhZ2VfdHlwZSA9IDE7ICAgLy8gSWRlbnRpZmllcyBtZXNzYWdlIHR5cGUKKyAgb3B0aW9uYWwgYnl0ZXMgbWVzc2FnZV9kYXRhID0gMjsgIC8vIEFjdHVhbCBtZXNzYWdlLCB0byBiZSBwYXJzZWQgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlX3R5cGUKK30KKworbWVzc2FnZSBVa2V5MkFsZXJ0IHsKKyAgZW51bSBBbGVydFR5cGUgeworICAgIC8vIEZyYW1pbmcgZXJyb3JzCisgICAgQkFEX01FU1NBR0UgPSAxOyAgICAgICAgICAgICAvLyBUaGUgbWVzc2FnZSBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkCisgICAgQkFEX01FU1NBR0VfVFlQRSA9IDI7ICAgICAgICAvLyBtZXNzYWdlX3R5cGUgaGFzIGFuIHVuZGVmaW5lZCB2YWx1ZQorICAgIElOQ09SUkVDVF9NRVNTQUdFID0gMzsgICAgICAgLy8gbWVzc2FnZV90eXBlIHJlY2VpdmVkIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIHR5cGUgYXQgdGhpcyBzdGFnZSBvZiB0aGUgcHJvdG9jb2wKKyAgICBCQURfTUVTU0FHRV9EQVRBID0gNDsgICAgICAgIC8vIENvdWxkIG5vdCBkZXNlcmlhbGl6ZSBtZXNzYWdlX2RhdGEgYXMgcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdmFsdWUgaW5tZXNzYWdlX3R5cGUKKworICAgIC8vIENsaWVudEluaXQgYW5kIFNlcnZlckluaXQgZXJyb3JzCisgICAgQkFEX1ZFUlNJT04gPSAxMDA7ICAgICAgICAgICAvLyB2ZXJzaW9uIGlzIGludmFsaWQ7IHNlcnZlciBjYW5ub3QgZmluZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VpdGFibGUgdmVyc2lvbiB0byBzcGVhayB3aXRoIGNsaWVudC4KKyAgICBCQURfUkFORE9NID0gMTAxOyAgICAgICAgICAgIC8vIFJhbmRvbSBkYXRhIGlzIG1pc3Npbmcgb3Igb2YgaW5jb3JyZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGgKKyAgICBCQURfSEFORFNIQUtFX0NJUEhFUiA9IDEwMjsgIC8vIE5vIHN1aXRhYmxlIGhhbmRzaGFrZSBjaXBoZXJzIHdlcmUgZm91bmQKKyAgICBCQURfTkVYVF9QUk9UT0NPTCA9IDEwMzsgICAgIC8vIFRoZSBuZXh0IHByb3RvY29sIGlzIG1pc3NpbmcsIHVua25vd24sIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZAorICAgIEJBRF9QVUJMSUNfS0VZID0gMTA0OyAgICAgICAgLy8gVGhlIHB1YmxpYyBrZXkgY291bGQgbm90IGJlIHBhcnNlZAorCisgICAgLy8gT3RoZXIgZXJyb3JzCisgICAgSU5URVJOQUxfRVJST1IgPSAyMDA7ICAgICAgIC8vIEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC4gZXJyb3JfbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXkgY29udGFpbiBhZGRpdGlvbmFsIGRldGFpbHMgZm9yIGxvZ2dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRlYnVnZ2luZy4KKyAgfQorCisgIG9wdGlvbmFsIEFsZXJ0VHlwZSB0eXBlID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGVycm9yX21lc3NhZ2UgPSAyOworfQorCitlbnVtIFVrZXkySGFuZHNoYWtlQ2lwaGVyIHsKKyAgUkVTRVJWRUQgPSAwOworICBQMjU2X1NIQTUxMiA9IDEwMDsgICAgICAgIC8vIE5JU1QgUC0yNTYgdXNlZCBmb3IgRUNESCwgU0hBNTEyIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0bWVudAorICBDVVJWRTI1NTE5X1NIQTUxMiA9IDIwMDsgIC8vIEN1cnZlIDI1NTE5IHVzZWQgZm9yIEVDREgsIFNIQTUxMiB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdG1lbnQKK30KKworbWVzc2FnZSBVa2V5MkNsaWVudEluaXQgeworICBvcHRpb25hbCBpbnQzMiB2ZXJzaW9uID0gMTsgIC8vIGhpZ2hlc3Qgc3VwcG9ydGVkIHZlcnNpb24gZm9yIHJvbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbgorICBvcHRpb25hbCBieXRlcyByYW5kb20gPSAyOyAgIC8vIHJhbmRvbSBieXRlcyBmb3IgcmVwbGF5L3JldXNlIHByb3RlY3Rpb24KKworICAvLyBPbmUgY29tbWl0bWVudCAoaGFzaCBvZiBDbGllbnRGaW5pc2hlZCBjb250YWluaW5nIHB1YmxpYyBrZXkpIHBlciBzdXBwb3J0ZWQKKyAgLy8gY2lwaGVyCisgIG1lc3NhZ2UgQ2lwaGVyQ29tbWl0bWVudCB7CisgICAgb3B0aW9uYWwgVWtleTJIYW5kc2hha2VDaXBoZXIgaGFuZHNoYWtlX2NpcGhlciA9IDE7CisgICAgb3B0aW9uYWwgYnl0ZXMgY29tbWl0bWVudCA9IDI7CisgIH0KKyAgcmVwZWF0ZWQgQ2lwaGVyQ29tbWl0bWVudCBjaXBoZXJfY29tbWl0bWVudHMgPSAzOworCisgIC8vIE5leHQgcHJvdG9jb2wgdGhhdCB0aGUgY2xpZW50IHdhbnRzIHRvIHNwZWFrLgorICBvcHRpb25hbCBzdHJpbmcgbmV4dF9wcm90b2NvbCA9IDQ7Cit9CisKK21lc3NhZ2UgVWtleTJTZXJ2ZXJJbml0IHsKKyAgb3B0aW9uYWwgaW50MzIgdmVyc2lvbiA9IDE7ICAvLyBoaWdoZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIGZvciByb2xsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24KKyAgb3B0aW9uYWwgYnl0ZXMgcmFuZG9tID0gMjsgICAvLyByYW5kb20gYnl0ZXMgZm9yIHJlcGxheS9yZXVzZSBwcm90ZWN0aW9uCisKKyAgLy8gU2VsZWN0ZWQgQ2lwaGVyIGFuZCBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXkKKyAgb3B0aW9uYWwgVWtleTJIYW5kc2hha2VDaXBoZXIgaGFuZHNoYWtlX2NpcGhlciA9IDM7CisgIG9wdGlvbmFsIGJ5dGVzIHB1YmxpY19rZXkgPSA0OworfQorCittZXNzYWdlIFVrZXkyQ2xpZW50RmluaXNoZWQgeworICBvcHRpb25hbCBieXRlcyBwdWJsaWNfa2V5ID0gMTsgIC8vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2VsZWN0ZWQgaGFuZHNoYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2lwaGVyCit9CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC9nZW5lcmF0b3IvbmluamEucHkgYi9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC9nZW5lcmF0b3IvbmluamEucHkKaW5kZXggMTU0ZjUyNi4uZTI5ODliZiAxMDA3NTUKLS0tIGEvc3JjL3Rvb2xzL2d5cC9weWxpYi9neXAvZ2VuZXJhdG9yL25pbmphLnB5CisrKyBiL3NyYy90b29scy9neXAvcHlsaWIvZ3lwL2dlbmVyYXRvci9uaW5qYS5weQpAQCAtMjI4LDEwICsyMjgsOSBAQAogICAgICMgdGhhdCBjb21wb3NlIGEgLmxpYiAocmF0aGVyIHRoYW4gdGhlIC5saWIgaXRzZWxmKS4gVGhhdCBsaXN0IGlzIHN0b3JlZAogICAgICMgaGVyZS4KICAgICBzZWxmLmNvbXBvbmVudF9vYmpzID0gTm9uZQotICAgICMgV2luZG93cy9QUzMgb25seS4gVGhlIGltcG9ydCAubGliIGlzIHRoZSBvdXRwdXQgb2YgYSBidWlsZCBzdGVwLCBidXQKKyAgICAjIFdpbmRvd3Mgb25seS4gVGhlIGltcG9ydCAubGliIGlzIHRoZSBvdXRwdXQgb2YgYSBidWlsZCBzdGVwLCBidXQKICAgICAjIGJlY2F1c2UgZGVwZW5kZW50cyBvbmx5IGxpbmsgYWdhaW5zdCB0aGUgbGliIChub3QgYm90aCB0aGUgbGliIGFuZCB0aGUKICAgICAjIGRsbCkgd2Uga2VlcCB0cmFjayBvZiB0aGUgaW1wb3J0IGxpYnJhcnkgaGVyZS4KLSAgICAjIEZvciBQUzMsIHRoaXMgaXMgdGhlICJzdHViIiBsaWJyYXJ5LgogICAgIHNlbGYuaW1wb3J0X2xpYiA9IE5vbmUKIAogICBkZWYgTGlua2FibGUoc2VsZik6CkBAIC0xMzQ3LDcgKzEzNDYsNyBAQAogICAgICAgICAgICAgICAgIEdldFRvb2xjaGFpbk9yTm9uZShzZWxmLmZsYXZvcikuR2V0Q29tcGlsZXJTZXR0aW5ncygpCiAgICAgICAgICAgICAgICAgLklzVXNlTGlicmFyeURlcGVuZGVuY3lJbnB1dHMoY29uZmlnX25hbWUpKToKICAgICAgICAgICAgICAgZXh0cmFfbGlua19kZXBzLmV4dGVuZCh0YXJnZXQuY29tcG9uZW50X29ianMpCi0gICAgICAgICAgICBlbGlmIChzZWxmLmZsYXZvciBpbiAobWljcm9zb2Z0X2ZsYXZvcnMgKyBbJ3BzMyddKSBhbmQKKyAgICAgICAgICAgIGVsaWYgKHNlbGYuZmxhdm9yIGluIG1pY3Jvc29mdF9mbGF2b3JzIGFuZAogICAgICAgICAgICAgICAgICAgdGFyZ2V0LmltcG9ydF9saWIpOgogICAgICAgICAgICAgICBleHRyYV9saW5rX2RlcHMuYXBwZW5kKHRhcmdldC5pbXBvcnRfbGliKQogICAgICAgICAgICAgZWxpZiB0YXJnZXQuVXNlc1RvYyhzZWxmLmZsYXZvcik6CkBAIC0xNDQwLDQ4ICsxNDM5LDYgQEAKICAgICAgICAgICAgIGV4dHJhX2JpbmRpbmdzLmFwcGVuZCgoJ2ltcGxpYmZsYWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0lNUExJQjolcycgJSBzZWxmLnRhcmdldC5pbXBvcnRfbGliKSkKICAgICAgICAgICAgIG91dHB1dCA9IFtvdXRwdXQsIHNlbGYudGFyZ2V0LmltcG9ydF9saWJdCi0gICAgICAgIGVsaWYgc2VsZi5mbGF2b3IgaW4gWydwczMnXToKLSAgICAgICAgICAjIFRlbGwgTmluamEgd2UnbGwgYmUgZ2VuZXJhdGluZyBhIC5zcHJ4IGFuZCBhIHN0dWIgbGlicmFyeS4KLSAgICAgICAgICAjIEJpbmQgdGhlIHZhcmlhYmxlICckcHJ4JyB0byBvdXIgb3V0cHV0IGJpbmFyeSBzbyB3ZSBjYW4KLSAgICAgICAgICAjIHJlZmVyIHRvIGl0IGluIHRoZSBsaW5rZXIgcnVsZXMuCi0gICAgICAgICAgcHJ4X291dHB1dCA9IG91dHB1dAotICAgICAgICAgIHByeF9vdXRwdXRfYmFzZSwgcHJ4X291dHB1dF9leHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHByeF9vdXRwdXQpCi0gICAgICAgICAgYXNzZXJ0IHByeF9vdXRwdXRfZXh0ID09ICcuc3ByeCcKLQotICAgICAgICAgIGV4dHJhX2JpbmRpbmdzLmFwcGVuZCgoJ3ByeCcsIG91dHB1dCkpCi0gICAgICAgICAgIyBUT0RPOiBGaWd1cmUgb3V0IGhvdyB0byBzdXBwcmVzcyB0aGUgInJlbW92YWwiIHdhcm5pbmcKLSAgICAgICAgICAjIGdlbmVyYXRlZCBmcm9tIHRoZSBwcnggZ2VuZXJhdG9yIHdoZW4gd2UgcmVtb3ZlIGEgZnVuY3Rpb24uCi0gICAgICAgICAgIyBGb3Igbm93LCB3ZSdsbCBqdXN0IGRlbGV0ZSB0aGUgJ3ZlcmxvZy50eHQnIGZpbGUgYmVmb3JlIGxpbmtpbmcuCi0gICAgICAgICAgIyBCaW5kIGl0IGhlcmUgc28gd2UgY2FuIHJlZmVyIHRvIGl0IGFzICR2ZXJsb2cgaW4gdGhlIFBTMyBzb2xpbmsKLSAgICAgICAgICAjIHJ1bGUuCi0gICAgICAgICAgdmVybG9nID0gb3V0cHV0LnJlcGxhY2UocHJ4X291dHB1dF9leHQsICdfdmVybG9nLnR4dCcpCi0gICAgICAgICAgZXh0cmFfYmluZGluZ3MuYXBwZW5kKCgndmVybG9nJywgdmVybG9nKSkKLSAgICAgICAgICBzZWxmLnRhcmdldC5pbXBvcnRfbGliID0gb3V0cHV0LnJlcGxhY2UocHJ4X291dHB1dF9leHQsICdfc3R1Yi5hJykKLSAgICAgICAgICBvdXRwdXQgPSBbcHJ4X291dHB1dCwgc2VsZi50YXJnZXQuaW1wb3J0X2xpYl0KLQotICAgICAgICAgICMgRm9yIFBSWHMsIHdlIG5lZWQgdG8gY29udmVydCBhbnkgYysrIGV4cG9ydHMgaW50byBDLiBUaGlzIGlzIGRvbmUKLSAgICAgICAgICAjIHdpdGggYW4gImV4cG9ydCBwaWNrdXAiIHN0ZXAgdGhhdCBydW5zIG92ZXIgdGhlIG9iamVjdCBmaWxlcwotICAgICAgICAgICMgYW5kIHByb2R1Y2VzIGEgbmV3IC5jIGZpbGUuIFRoYXQgLmMgZmlsZSBzaG91bGQgYmUgY29tcGlsZWQgYW5kCi0gICAgICAgICAgIyBsaW5rZWQgaW50byB0aGUgUFJYLgotICAgICAgICAgIGdlbl9maWxlc19kaXIgPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICAgIHNlbGYuRXhwYW5kU3BlY2lhbCgKLSAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcl9kZWZhdWx0X3ZhcmlhYmxlc1snU0hBUkVEX0lOVEVSTUVESUFURV9ESVInXSksCi0gICAgICAgICAgICAgICdwcngnKQotCi0gICAgICAgICAgZXhwb3J0X3BpY2t1cF9vdXRwdXQgPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICAgIGdlbl9maWxlc19kaXIsCi0gICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUocHJ4X291dHB1dF9iYXNlKSArICcucHJ4X2V4cG9ydC5jJykKLSAgICAgICAgICBwcnhfZXhwb3J0X29ial9maWxlID0gZXhwb3J0X3BpY2t1cF9vdXRwdXRbOi0yXSArICcubycKLSAgICAgICAgICBzZWxmLm5pbmphLmJ1aWxkKAotICAgICAgICAgICAgICBleHBvcnRfcGlja3VwX291dHB1dCwKLSAgICAgICAgICAgICAgJ3ByeF9leHBvcnRfcGlja3VwJywKLSAgICAgICAgICAgICAgbGlua19kZXBzLAotICAgICAgICAgICAgICBpbXBsaWNpdD1saXN0KGltcGxpY2l0X2RlcHMpLAotICAgICAgICAgICAgICBvcmRlcl9vbmx5PWxpc3Qob3JkZXJfb25seV9kZXBzKSkKLQotICAgICAgICAgIHNlbGYubmluamEuYnVpbGQocHJ4X2V4cG9ydF9vYmpfZmlsZSwgJ2NjJywgZXhwb3J0X3BpY2t1cF9vdXRwdXQpCi0gICAgICAgICAgbGlua19kZXBzLmFwcGVuZChwcnhfZXhwb3J0X29ial9maWxlKQotCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgb3V0cHV0ID0gW291dHB1dCwgb3V0cHV0ICsgJy5UT0MnXQogCkBAIC0xNzUxLDcgKzE3MDgsNyBAQAogICAgIHR5cGVfaW5fb3V0cHV0X3Jvb3QgPSBbJ2V4ZWN1dGFibGUnLCAnbG9hZGFibGVfbW9kdWxlJ10KICAgICBpZiBzZWxmLmZsYXZvciA9PSAnbWFjJyBhbmQgc2VsZi50b29sc2V0ID09ICd0YXJnZXQnOgogICAgICAgdHlwZV9pbl9vdXRwdXRfcm9vdCArPSBbJ3NoYXJlZF9saWJyYXJ5JywgJ3N0YXRpY19saWJyYXJ5J10KLSAgICBlbGlmIHNlbGYuZmxhdm9yIGluIFsnd2luJywgJ3BzMyddIGFuZCBzZWxmLnRvb2xzZXQgPT0gJ3RhcmdldCc6CisgICAgZWxpZiBzZWxmLmZsYXZvciA9PSAnd2luJyBhbmQgc2VsZi50b29sc2V0ID09ICd0YXJnZXQnOgogICAgICAgdHlwZV9pbl9vdXRwdXRfcm9vdCArPSBbJ3NoYXJlZF9saWJyYXJ5J10KIAogICAgIGlmIHR5cGUgaW4gdHlwZV9pbl9vdXRwdXRfcm9vdCBvciBzZWxmLmlzX3N0YW5kYWxvbmVfc3RhdGljX2xpYnJhcnk6CkBAIC0yMTg1LDE2ICsyMTQyLDEyIEBACiAgICAgICAjIFJlcXVpcmUgTEQgdG8gYmUgc2V0LgogICAgICAgbWFzdGVyX25pbmphLnZhcmlhYmxlKCdsZCcsIG9zLmVudmlyb24uZ2V0KCdMRCcpKQogICAgICAgbWFzdGVyX25pbmphLnZhcmlhYmxlKCdhcicsIG9zLmVudmlyb24uZ2V0KCdBUicsICdhcicpKQotICAgICAgaWYgZmxhdm9yIGluIFsncHMzJ106Ci0gICAgICAgIG1hc3Rlcl9uaW5qYS52YXJpYWJsZSgncHJ4X2V4cG9ydF9waWNrdXAnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFJYX0VYUE9SVF9QSUNLVVAnXSkKICAgICAgIGFyX2ZsYWdzID0gb3MuZW52aXJvbi5nZXQoJ0FSRkxBR1MnLCAncmNzJykKICAgICAgIG1hc3Rlcl9uaW5qYS52YXJpYWJsZSgnYXJGbGFncycsIGFyX2ZsYWdzKQotICAgICAgIyBPbiB0aGUgUFMzLCB3aGVuIHdlIHVzZSBwczNzbmFybC5leGUgd2l0aCBhIHJlc3BvbnNlIGZpbGUsIHdlIGNhbm5vdAorICAgICAgIyBPbiBTb255LCB3aGVuIHdlIHVzZSBvcmJpcy1zbmFybC5leGUgd2l0aCBhIHJlc3BvbnNlIGZpbGUsIHdlIGNhbm5vdAogICAgICAgIyBwYXNzIGl0IGZsYWdzIChsaWtlICdyY3MnKSwgc28gQVJGTEFHUyBpcyBsaWtlbHkgc2V0IHRvICcnIGZvciB0aGlzCiAgICAgICAjIHBsYXRmb3JtLiAgSW4gdGhhdCBjYXNlLCBkbyBub3QgYXBwZW5kIHRoZSB0aGluIGFyY2hpdmUgJ1QnIGZsYWcKICAgICAgICMgdG8gdGhlIGZsYWdzIHN0cmluZy4KLSAgICAgICMgTGlrZXdpc2UgZm9yIFBTNCwgYnV0IHVzaW5nIG9yYmlzLXNuYXJsLmV4ZQogICAgICAgdGhpbl9mbGFnX3RvX2FkZCA9ICcnCiAgICAgICBpZiBsZW4oYXJfZmxhZ3MpID49IDEgYW5kIGFyX2ZsYWdzLmZpbmQoJ1QnKSA9PSAtMToKICAgICAgICAgdGhpbl9mbGFnX3RvX2FkZCA9ICdUJwpAQCAtMjI0Miw3ICsyMTk1LDcgQEAKICAgICBpZiBmbGF2b3Igbm90IGluIG1pY3Jvc29mdF9mbGF2b3JzOgogICAgICAgaWYgZmxhdm9yIGluIHNvbnlfZmxhdm9yczoKICAgICAgICAgIyB1Y2EgOj0gVW5uYW1lZCBDb25zb2xlIEEKLSAgICAgICAgZGVwX2Zvcm1hdCA9ICdzbmMnIGlmIChmbGF2b3IgaW4gWydwczMnXSkgZWxzZSAndWNhJworICAgICAgICBkZXBfZm9ybWF0ID0gJ3VjYScKICAgICAgICAgbWFzdGVyX25pbmphLnJ1bGUoCiAgICAgICAgICAgICAnY2MnLAogICAgICAgICAgICAgZGVzY3JpcHRpb249J0NDICRvdXQnLApAQCAtMjM0Niw2NCArMjI5OSw0MiBAQAogICAgICAgICAgIHJzcGZpbGU9JyRvdXQucnNwJywKICAgICAgICAgICByc3BmaWxlX2NvbnRlbnQ9JyRpbl9uZXdsaW5lJykKIAotICAgICAgaWYgZmxhdm9yIGluIFsncHMzJ106Ci0gICAgICAgICMgVE9ETzogQ2FuIHdlIHN1cHByZXNzIHRoZSB3YXJuaW5ncyBmcm9tIHZlcmxvZy50eHQgcmF0aGVyIHRoYW4KLSAgICAgICAgIyBybSdpbmcgaXQ/Ci0gICAgICAgIGxkX2NtZCA9ICdybSAtZiAkdmVybG9nICYmICcgKyBsZF9jbWQKLSAgICAgICAgaWYgaXNfd2luZG93czoKLSAgICAgICAgICBsZF9jbWQgPSAnY21kLmV4ZSAvYyAnICsgbGRfY21kCisgICAgICAjIFRoaXMgYWxsb3dzIHRhcmdldHMgdGhhdCBvbmx5IG5lZWQgdG8gZGVwZW5kIG9uICRsaWIncyBBUEkgdG8gZGVjbGFyZQorICAgICAgIyBhbiBvcmRlci1vbmx5IGRlcGVuZGVuY3kgb24gJGxpYi5UT0MgYW5kIGF2b2lkIHJlbGlua2luZyBzdWNoCisgICAgICAjIGRvd25zdHJlYW0gZGVwZW5kZW5jaWVzIHdoZW4gJGxpYiBjaGFuZ2VzIG9ubHkgaW4gbm9uLXB1YmxpYyB3YXlzLgorICAgICAgIyBUaGUgcmVzdWx0aW5nIHN0cmluZyBsZWF2ZXMgYW4gdW5pbnRlcnBvbGF0ZWQgJXtzdWZmaXh9IHdoaWNoCisgICAgICAjIGlzIHVzZWQgaW4gdGhlIGZpbmFsIHN1YnN0aXR1dGlvbiBiZWxvdy4KKyAgICAgIG10aW1lX3ByZXNlcnZpbmdfc29saW5rX2Jhc2UgPSAoCisgICAgICAgICAgJ2lmIFsgISAtZSAkbGliIC1vICEgLWUgJHtsaWJ9LlRPQyBdOyB0aGVuICUoc29saW5rKXMgJiYgJworICAgICAgICAgICclKGV4dHJhY3RfdG9jKXMgPiAke2xpYn0uVE9DOyBlbHNlICUoc29saW5rKXMgJiYgJShleHRyYWN0X3RvYylzICcKKyAgICAgICAgICAnPiAke2xpYn0udG1wICYmIGlmICEgY21wIC1zICR7bGlifS50bXAgJHtsaWJ9LlRPQzsgdGhlbiBtdiAnCisgICAgICAgICAgJyR7bGlifS50bXAgJHtsaWJ9LlRPQyA7IGZpOyBmaScgJSB7CisgICAgICAgICAgICAgICdzb2xpbmsnOiAoCisgICAgICAgICAgICAgICAgICBsZF9jbWQgKworICAgICAgICAgICAgICAgICAgJyAtc2hhcmVkICRsZGZsYWdzIC1vICRsaWIgLVdsLC1zb25hbWU9JHNvbmFtZSAlKHN1ZmZpeClzJyksCisgICAgICAgICAgICAgICdleHRyYWN0X3RvYyc6ICgneyByZWFkZWxmIC1kICR7bGlifSB8IGdyZXAgU09OQU1FIDsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25tIC1nRCAtZiBwICR7bGlifSB8IGN1dCAtZjEtMiAtZFwnIFwnOyB9JykKKyAgICAgICAgICB9KQogCi0gICAgICAgIHByeF9mbGFncyA9ICctLW9mb3JtYXQ9ZnNwcnggLS1wcngtd2l0aC1ydW50aW1lIC0temdlbnByeCAtemdlbnN0dWInCi0gICAgICAgIG1hc3Rlcl9uaW5qYS5ydWxlKAotICAgICAgICAgICAgJ3NvbGluaycsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0nTElOSyhQUlgpICRsaWInLAotICAgICAgICAgICAgcmVzdGF0PVRydWUsCi0gICAgICAgICAgICBjb21tYW5kPWxkX2NtZCArICcgQCRwcngucnNwJywKLSAgICAgICAgICAgIHJzcGZpbGU9JyRwcngucnNwJywKLSAgICAgICAgICAgIHJzcGZpbGVfY29udGVudD0nJGxkZmxhZ3MgJXMgLW8gJHByeCAkaW4gJGxpYnMnICUgcHJ4X2ZsYWdzLAotICAgICAgICAgICAgcG9vbD0nbGlua19wb29sJykKLSAgICAgICAgbWFzdGVyX25pbmphLnJ1bGUoCi0gICAgICAgICAgICAncHJ4X2V4cG9ydF9waWNrdXAnLAotICAgICAgICAgICAgZGVzY3JpcHRpb249J1BSWC1FWFBPUlQtUElDS1VQICRvdXQnLAotICAgICAgICAgICAgY29tbWFuZD0nJHByeF9leHBvcnRfcGlja3VwIC0tb3V0cHV0LXNyYz0kb3V0ICRpbicpCi0KLSAgICAgIGVsc2U6ICAjIEFzc3VtZSBpdCBpcyBhIExpbnV4IHBsYXRmb3JtCi0gICAgICAgICMgVGhpcyBhbGxvd3MgdGFyZ2V0cyB0aGF0IG9ubHkgbmVlZCB0byBkZXBlbmQgb24gJGxpYidzIEFQSSB0byBkZWNsYXJlCi0gICAgICAgICMgYW4gb3JkZXItb25seSBkZXBlbmRlbmN5IG9uICRsaWIuVE9DIGFuZCBhdm9pZCByZWxpbmtpbmcgc3VjaAotICAgICAgICAjIGRvd25zdHJlYW0gZGVwZW5kZW5jaWVzIHdoZW4gJGxpYiBjaGFuZ2VzIG9ubHkgaW4gbm9uLXB1YmxpYyB3YXlzLgotICAgICAgICAjIFRoZSByZXN1bHRpbmcgc3RyaW5nIGxlYXZlcyBhbiB1bmludGVycG9sYXRlZCAle3N1ZmZpeH0gd2hpY2gKLSAgICAgICAgIyBpcyB1c2VkIGluIHRoZSBmaW5hbCBzdWJzdGl0dXRpb24gYmVsb3cuCi0gICAgICAgIG10aW1lX3ByZXNlcnZpbmdfc29saW5rX2Jhc2UgPSAoCi0gICAgICAgICAgICAnaWYgWyAhIC1lICRsaWIgLW8gISAtZSAke2xpYn0uVE9DIF07IHRoZW4gJShzb2xpbmspcyAmJiAnCi0gICAgICAgICAgICAnJShleHRyYWN0X3RvYylzID4gJHtsaWJ9LlRPQzsgZWxzZSAlKHNvbGluaylzICYmICUoZXh0cmFjdF90b2MpcyAnCi0gICAgICAgICAgICAnPiAke2xpYn0udG1wICYmIGlmICEgY21wIC1zICR7bGlifS50bXAgJHtsaWJ9LlRPQzsgdGhlbiBtdiAnCi0gICAgICAgICAgICAnJHtsaWJ9LnRtcCAke2xpYn0uVE9DIDsgZmk7IGZpJyAlIHsKLSAgICAgICAgICAgICAgICAnc29saW5rJzogKAotICAgICAgICAgICAgICAgICAgICBsZF9jbWQgKwotICAgICAgICAgICAgICAgICAgICAnIC1zaGFyZWQgJGxkZmxhZ3MgLW8gJGxpYiAtV2wsLXNvbmFtZT0kc29uYW1lICUoc3VmZml4KXMnKSwKLSAgICAgICAgICAgICAgICAnZXh0cmFjdF90b2MnOiAoJ3sgcmVhZGVsZiAtZCAke2xpYn0gfCBncmVwIFNPTkFNRSA7ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25tIC1nRCAtZiBwICR7bGlifSB8IGN1dCAtZjEtMiAtZFwnIFwnOyB9JykKLSAgICAgICAgICAgIH0pCi0KLSAgICAgICAgbWFzdGVyX25pbmphLnJ1bGUoCi0gICAgICAgICAgICAnc29saW5rJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSdTT0xJTksgJGxpYicsCi0gICAgICAgICAgICByZXN0YXQ9VHJ1ZSwKLSAgICAgICAgICAgIGNvbW1hbmQ9KG10aW1lX3ByZXNlcnZpbmdfc29saW5rX2Jhc2UgJSB7Ci0gICAgICAgICAgICAgICAgJ3N1ZmZpeCc6Ci0gICAgICAgICAgICAgICAgICAgICctV2wsLS13aG9sZS1hcmNoaXZlICRpbiAkc29saWJzIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgJwotICAgICAgICAgICAgICAgICAgICAnJGxpYnMnCi0gICAgICAgICAgICB9KSkKLSAgICAgICAgbWFzdGVyX25pbmphLnJ1bGUoCi0gICAgICAgICAgICAnc29saW5rX21vZHVsZScsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0nU09MSU5LKG1vZHVsZSkgJGxpYicsCi0gICAgICAgICAgICByZXN0YXQ9VHJ1ZSwKLSAgICAgICAgICAgIGNvbW1hbmQ9KG10aW1lX3ByZXNlcnZpbmdfc29saW5rX2Jhc2UgJSB7Ci0gICAgICAgICAgICAgICAgJ3N1ZmZpeCc6ICctV2wsLS1zdGFydC1ncm91cCAkaW4gJHNvbGlicyAtV2wsLS1lbmQtZ3JvdXAgJGxpYnMnCi0gICAgICAgICAgICB9KSkKKyAgICAgIG1hc3Rlcl9uaW5qYS5ydWxlKAorICAgICAgICAgICdzb2xpbmsnLAorICAgICAgICAgIGRlc2NyaXB0aW9uPSdTT0xJTksgJGxpYicsCisgICAgICAgICAgcmVzdGF0PVRydWUsCisgICAgICAgICAgY29tbWFuZD0obXRpbWVfcHJlc2VydmluZ19zb2xpbmtfYmFzZSAlIHsKKyAgICAgICAgICAgICAgJ3N1ZmZpeCc6CisgICAgICAgICAgICAgICAgICAnLVdsLC0td2hvbGUtYXJjaGl2ZSAkaW4gJHNvbGlicyAtV2wsLS1uby13aG9sZS1hcmNoaXZlICcKKyAgICAgICAgICAgICAgICAgICckbGlicycKKyAgICAgICAgICB9KSkKKyAgICAgIG1hc3Rlcl9uaW5qYS5ydWxlKAorICAgICAgICAgICdzb2xpbmtfbW9kdWxlJywKKyAgICAgICAgICBkZXNjcmlwdGlvbj0nU09MSU5LKG1vZHVsZSkgJGxpYicsCisgICAgICAgICAgcmVzdGF0PVRydWUsCisgICAgICAgICAgY29tbWFuZD0obXRpbWVfcHJlc2VydmluZ19zb2xpbmtfYmFzZSAlIHsKKyAgICAgICAgICAgICAgJ3N1ZmZpeCc6ICctV2wsLS1zdGFydC1ncm91cCAkaW4gJHNvbGlicyAtV2wsLS1lbmQtZ3JvdXAgJGxpYnMnCisgICAgICAgICAgfSkpCiAKICAgICAgIGlmIGZsYXZvciBpbiBzb255X2ZsYXZvcnM6Ci0gICAgICAgICMgUFMzIGFuZCBQUzQgbGlua2VycyBkb24ndCBrbm93IGFib3V0IHJwYXRoLgorICAgICAgICAjIFNvbnkgbGlua2VycyBkb24ndCBrbm93IGFib3V0IHJwYXRoLgogICAgICAgICBycGF0aCA9ICcnCiAgICAgICBlbHNlOgogICAgICAgICBycGF0aCA9IHInLVdsLC1ycGF0aD1cJCRPUklHSU4vbGliJwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2d5cC9weWxpYi9neXAvd2luX3Rvb2wucHkgYi9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC93aW5fdG9vbC5weQppbmRleCA0NjAyOTZkLi42Yjk1MGI3IDEwMDc1NQotLS0gYS9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC93aW5fdG9vbC5weQorKysgYi9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC93aW5fdG9vbC5weQpAQCAtNzgsNyArNzgsOCBAQAogICAgICAgIiIiCiAgICAgICBlbnYgPSBzZWxmLl9HZXRFbnYoYXJjaCkKICAgICAgIHBvcGVuID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzaGVsbD1UcnVlLCBlbnY9ZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCiAgICAgICBvdXQsIF8gPSBwb3Blbi5jb21tdW5pY2F0ZSgpCiAgICAgICBmb3IgbGluZSBpbiBvdXQuc3BsaXRsaW5lcygpOgogICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCcgICBDcmVhdGluZyBsaWJyYXJ5ICcpOgpAQCAtOTEsNyArOTIsOCBAQAogICAgIHRvb2wpLiIiIgogICAgIGVudiA9IHNlbGYuX0dldEVudihhcmNoKQogICAgIHBvcGVuID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzaGVsbD1UcnVlLCBlbnY9ZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCiAgICAgb3V0LCBfID0gcG9wZW4uY29tbXVuaWNhdGUoKQogICAgIGZvciBsaW5lIGluIG91dC5zcGxpdGxpbmVzKCk6CiAgICAgICBpZiBsaW5lIGFuZCAnbWFuaWZlc3QgYXV0aG9yaW5nIHdhcm5pbmcgODEwMTAwMDInIG5vdCBpbiBsaW5lOgpAQCAtMTA5LDcgKzExMSw4IEBACiAgICAgICAgICAgJy9oJywgaCwKICAgICAgICAgICBpZGxdCiAgICAgcG9wZW4gPSBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsIHNoZWxsPVRydWUsIGVudj1lbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSkKICAgICBvdXQsIF8gPSBwb3Blbi5jb21tdW5pY2F0ZSgpCiAgICAgIyBGaWx0ZXIganVuayBvdXQgb2Ygc3Rkb3V0LCBhbmQgd3JpdGUgZmlsdGVyZWQgdmVyc2lvbnMuIE91dHB1dCB3ZSB3YW50CiAgICAgIyB0byBmaWx0ZXIgaXMgcGFpcnMgb2YgbGluZXMgdGhhdCBsb29rIGxpa2UgdGhpczoKQEAgLTEzNiw3ICsxMzksOCBAQAogICAgIGlmIGFyY2ggPT0gJ2Vudmlyb25tZW50Lng2NCc6CiAgICAgICByZXR1cm4gMAogICAgIHBvcGVuID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzaGVsbD1UcnVlLCBlbnY9ZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCiAgICAgb3V0LCBfID0gcG9wZW4uY29tbXVuaWNhdGUoKQogICAgIGZvciBsaW5lIGluIG91dC5zcGxpdGxpbmVzKCk6CiAgICAgICBpZiAobm90IGxpbmUuc3RhcnRzd2l0aCgnQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24nKSBhbmQKQEAgLTE1MSw3ICsxNTUsOCBAQAogICAgIGRvbid0IHN1cHBvcnQgdGhlIC9ub2xvZ28gZmxhZy4iIiIKICAgICBlbnYgPSBzZWxmLl9HZXRFbnYoYXJjaCkKICAgICBwb3BlbiA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywgc2hlbGw9VHJ1ZSwgZW52PWVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQogICAgIG91dCwgXyA9IHBvcGVuLmNvbW11bmljYXRlKCkKICAgICBmb3IgbGluZSBpbiBvdXQuc3BsaXRsaW5lcygpOgogICAgICAgaWYgKG5vdCBsaW5lLnN0YXJ0c3dpdGgoJ01pY3Jvc29mdCAoUikgV2luZG93cyAoUikgUmVzb3VyY2UgQ29tcGlsZXInKSBhbmQKQEAgLTE2OSw3ICsxNzQsOCBAQAogICAgICMgTG9jYWwgZnVuY3Rpb25zIGJpbmQgdG8gb3V0bW9zdCBmdW5jdGlvbiBhcmd1bWVudHMuCiAgICAgZGVmIFJ1bkNtZCgpOgogICAgICAgcG9wZW4gPSBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsIHNoZWxsPVRydWUsIGVudj1lbnYsIGN3ZD1kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQogICAgICAgc3Rkb3V0X3N0ciwgc3RkZXJyX3N0ciA9IHBvcGVuLmNvbW11bmljYXRlKCkKICAgICAgIHJldHVybiBwb3Blbi5yZXR1cm5jb2RlLCBzdGRvdXRfc3RyLCBzdGRlcnJfc3RyCiAgICAgZGVmIEJ1aWxkRXJyb3JNZXNzYWdlKGVycl9jb2RlLCBzdGRvdXQsIHN0ZGVycik6CkBAIC0xODcsNiArMTkzLDggQEAKICAgICAjIHR3aWNlIHRoZW4gdGhlIGVycm9yIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gdGhlIGNvbW1hbmQgbGluZS4KICAgICBlcnJfY29kZSwgc3Rkb3V0LCBzdGRlcnIgPSBSdW5DbWQoKQogICAgIGlmIGVycl9jb2RlID09IDA6CisgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN0ZG91dCkKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RkZXJyKQogICAgICAgcmV0dXJuIGVycl9jb2RlCiAgICAgc3lzLnN0ZG91dC53cml0ZSgKICAgICAgICAgQnVpbGRFcnJvck1lc3NhZ2UoZXJyX2NvZGUsIHN0ZG91dCwgc3RkZXJyKSArICcgcmV0cnlpbmcuLi5cbicpCmRpZmYgLS1naXQgYS9zcmMvdjgvaW5jbHVkZS92OC1pbnNwZWN0b3IuaCBiL3NyYy92OC9pbmNsdWRlL3Y4LWluc3BlY3Rvci5oCmluZGV4IDZkZTgyMzQuLjA5MjEzOWUgMTAwNjQ0Ci0tLSBhL3NyYy92OC9pbmNsdWRlL3Y4LWluc3BlY3Rvci5oCisrKyBiL3NyYy92OC9pbmNsdWRlL3Y4LWluc3BlY3Rvci5oCkBAIC0yMzUsNiArMjM1LDExIEBACiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VjhJbnNwZWN0b3I+IGNyZWF0ZSh2ODo6SXNvbGF0ZSosIFY4SW5zcGVjdG9yQ2xpZW50Kik7CiAgIHZpcnR1YWwgflY4SW5zcGVjdG9yKCkge30KIAorICAvLyBFeHBvc2VkIHNvIENvYmFsdCdzIGRlYnVnZ2VyIGNhbiBoYXZlIGEgaHlicmlkIGltcGxlbWVudGF0aW9uIHVzaW5nCisgIC8vIEphdmFTY3JpcHQgd2l0aG91dCBpdCBzaG93aW5nIHVwIGFzIGRlYnVnZ2FibGUgc291cmNlIGluIERldlRvb2xzLgorICB2aXJ0dWFsIHY4OjpNYXliZUxvY2FsPHY4OjpWYWx1ZT4gY29tcGlsZUFuZFJ1bkludGVybmFsU2NyaXB0KAorICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0Piwgdjg6OkxvY2FsPHY4OjpTdHJpbmc+KSA9IDA7CisKICAgLy8gQ29udGV4dHMgaW5zdHJ1bWVudGF0aW9uLgogICB2aXJ0dWFsIHZvaWQgY29udGV4dENyZWF0ZWQoY29uc3QgVjhDb250ZXh0SW5mbyYpID0gMDsKICAgdmlydHVhbCB2b2lkIGNvbnRleHREZXN0cm95ZWQodjg6OkxvY2FsPHY4OjpDb250ZXh0PikgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL3Y4L3NyYy9pYy9pYy5jYyBiL3NyYy92OC9zcmMvaWMvaWMuY2MKaW5kZXggNjJhMmU3Yy4uMzU2ZmE1OCAxMDA2NDQKLS0tIGEvc3JjL3Y4L3NyYy9pYy9pYy5jYworKysgYi9zcmMvdjgvc3JjL2ljL2ljLmNjCkBAIC0yLDYgKzIsMTAgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRpb19sZWFrc19wb2VtLmgiCisjZW5kaWYKKwogI2luY2x1ZGUgInNyYy9pYy9pYy5oIgogCiAjaW5jbHVkZSAic3JjL2FjY2Vzc29ycy5oIgpkaWZmIC0tZ2l0IGEvc3JjL3Y4L3NyYy9pbnNwZWN0b3IvdjgtaW5zcGVjdG9yLWltcGwuaCBiL3NyYy92OC9zcmMvaW5zcGVjdG9yL3Y4LWluc3BlY3Rvci1pbXBsLmgKaW5kZXggOTJlN2IyMS4uYjc0OTc1ZCAxMDA2NDQKLS0tIGEvc3JjL3Y4L3NyYy9pbnNwZWN0b3IvdjgtaW5zcGVjdG9yLWltcGwuaAorKysgYi9zcmMvdjgvc3JjL2luc3BlY3Rvci92OC1pbnNwZWN0b3ItaW1wbC5oCkBAIC02Miw4ICs2Miw4IEBACiAgIGludCBjb250ZXh0R3JvdXBJZCh2ODo6TG9jYWw8djg6OkNvbnRleHQ+KSBjb25zdDsKICAgaW50IGNvbnRleHRHcm91cElkKGludCBjb250ZXh0SWQpIGNvbnN0OwogCi0gIHY4OjpNYXliZUxvY2FsPHY4OjpWYWx1ZT4gY29tcGlsZUFuZFJ1bkludGVybmFsU2NyaXB0KHY4OjpMb2NhbDx2ODo6Q29udGV4dD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPik7CisgIHY4OjpNYXliZUxvY2FsPHY4OjpWYWx1ZT4gY29tcGlsZUFuZFJ1bkludGVybmFsU2NyaXB0KAorICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0Piwgdjg6OkxvY2FsPHY4OjpTdHJpbmc+KSBvdmVycmlkZTsKICAgdjg6Ok1heWJlTG9jYWw8djg6OlNjcmlwdD4gY29tcGlsZVNjcmlwdCh2ODo6TG9jYWw8djg6OkNvbnRleHQ+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBmaWxlTmFtZSk7CmRpZmYgLS1naXQgYS9zcmMvdjgvc3JjL3BhcnNpbmcvcGFyc2VyLmNjIGIvc3JjL3Y4L3NyYy9wYXJzaW5nL3BhcnNlci5jYwppbmRleCAwNDk3OTU4Li44NzRmYzg0IDEwMDY0NAotLS0gYS9zcmMvdjgvc3JjL3BhcnNpbmcvcGFyc2VyLmNjCisrKyBiL3NyYy92OC9zcmMvcGFyc2luZy9wYXJzZXIuY2MKQEAgLTIsNiArMiwxMCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorI2lmIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGlvX2xlYWtzX3BvZW0uaCIKKyNlbmRpZgorCiAjaW5jbHVkZSAic3JjL3BhcnNpbmcvcGFyc2VyLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CmRpZmYgLS1naXQgYS9zcmMvdjgvc3JjL3BhcnNpbmcvcHJlcGFyc2VyLmNjIGIvc3JjL3Y4L3NyYy9wYXJzaW5nL3ByZXBhcnNlci5jYwppbmRleCBiMjhlYWIyLi4xYTI0Y2I1IDEwMDY0NAotLS0gYS9zcmMvdjgvc3JjL3BhcnNpbmcvcHJlcGFyc2VyLmNjCisrKyBiL3NyYy92OC9zcmMvcGFyc2luZy9wcmVwYXJzZXIuY2MKQEAgLTIsNiArMiwxMCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorI2lmIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGlvX2xlYWtzX3BvZW0uaCIKKyNlbmRpZgorCiAjaW5jbHVkZSA8Y21hdGg+CiAKICNpbmNsdWRlICJzcmMvYWxsb2NhdGlvbi5oIgpkaWZmIC0tZ2l0IGEvc3JjL3Y4L3NyYy90cmFjaW5nL3RyYWNlZC12YWx1ZS5jYyBiL3NyYy92OC9zcmMvdHJhY2luZy90cmFjZWQtdmFsdWUuY2MKaW5kZXggZGU5MzgyZS4uNTFkMDdkYyAxMDA2NDQKLS0tIGEvc3JjL3Y4L3NyYy90cmFjaW5nL3RyYWNlZC12YWx1ZS5jYworKysgYi9zcmMvdjgvc3JjL3RyYWNpbmcvdHJhY2VkLXZhbHVlLmNjCkBAIC0yLDYgKzIsMTAgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRpb19sZWFrc19wb2VtLmgiCisjZW5kaWYKKwogI2luY2x1ZGUgInNyYy90cmFjaW5nL3RyYWNlZC12YWx1ZS5oIgogCiAjaW5jbHVkZSAic3JjL2Jhc2UvcGxhdGZvcm0vcGxhdGZvcm0uaCIK